summaryrefslogtreecommitdiffstats
path: root/src/corelib
diff options
context:
space:
mode:
Diffstat (limited to 'src/corelib')
-rw-r--r--src/corelib/CMakeLists.txt925
-rw-r--r--src/corelib/Qt6AndroidMacros.cmake1052
-rw-r--r--src/corelib/Qt6CTestMacros.cmake331
-rw-r--r--src/corelib/Qt6CoreConfigExtras.cmake.in69
-rw-r--r--src/corelib/Qt6CoreDeploySupport.cmake680
-rw-r--r--src/corelib/Qt6CoreMacros.cmake2479
-rw-r--r--src/corelib/Qt6CoreResourceInit.in.cpp14
-rw-r--r--src/corelib/Qt6WasmMacros.cmake134
-rw-r--r--src/corelib/QtCompressMimeDatabase.cmake156
-rw-r--r--src/corelib/animation/qabstractanimation.cpp163
-rw-r--r--src/corelib/animation/qabstractanimation.h41
-rw-r--r--src/corelib/animation/qabstractanimation_p.h73
-rw-r--r--src/corelib/animation/qanimationgroup.cpp48
-rw-r--r--src/corelib/animation/qanimationgroup.h40
-rw-r--r--src/corelib/animation/qanimationgroup_p.h44
-rw-r--r--src/corelib/animation/qparallelanimationgroup.cpp42
-rw-r--r--src/corelib/animation/qparallelanimationgroup.h40
-rw-r--r--src/corelib/animation/qparallelanimationgroup_p.h42
-rw-r--r--src/corelib/animation/qpauseanimation.cpp47
-rw-r--r--src/corelib/animation/qpauseanimation.h40
-rw-r--r--src/corelib/animation/qpropertyanimation.cpp75
-rw-r--r--src/corelib/animation/qpropertyanimation.h40
-rw-r--r--src/corelib/animation/qpropertyanimation_p.h40
-rw-r--r--src/corelib/animation/qsequentialanimationgroup.cpp54
-rw-r--r--src/corelib/animation/qsequentialanimationgroup.h40
-rw-r--r--src/corelib/animation/qsequentialanimationgroup_p.h44
-rw-r--r--src/corelib/animation/qvariantanimation.cpp91
-rw-r--r--src/corelib/animation/qvariantanimation.h42
-rw-r--r--src/corelib/animation/qvariantanimation_p.h40
-rw-r--r--src/corelib/compat/removed_api.cpp1079
-rw-r--r--src/corelib/configure.cmake437
-rw-r--r--src/corelib/debug_script.py71
-rw-r--r--src/corelib/doc/include/QtCoreDoc2
-rw-r--r--src/corelib/doc/include/jni.h40
-rw-r--r--src/corelib/doc/qtcore.qdocconf18
-rw-r--r--src/corelib/doc/snippets/buffer/buffer.cpp51
-rw-r--r--src/corelib/doc/snippets/cmake-macros/deployment.cmake27
-rw-r--r--src/corelib/doc/snippets/cmake-macros/examples.cmake61
-rw-r--r--src/corelib/doc/snippets/cmake-macros/examples.cpp16
-rw-r--r--src/corelib/doc/snippets/code/doc_src_containers.cpp146
-rw-r--r--src/corelib/doc/snippets/code/doc_src_groups.cpp51
-rw-r--r--src/corelib/doc/snippets/code/doc_src_objecttrees.cpp51
-rw-r--r--src/corelib/doc/snippets/code/doc_src_properties.cpp56
-rw-r--r--src/corelib/doc/snippets/code/doc_src_qalgorithms.cpp60
-rw-r--r--src/corelib/doc/snippets/code/doc_src_qcache.cpp51
-rw-r--r--src/corelib/doc/snippets/code/doc_src_qiterator.cpp72
-rw-r--r--src/corelib/doc/snippets/code/doc_src_qnamespace.cpp51
-rw-r--r--src/corelib/doc/snippets/code/doc_src_qnamespace.qdoc51
-rw-r--r--src/corelib/doc/snippets/code/doc_src_qplugin.cpp57
-rw-r--r--src/corelib/doc/snippets/code/doc_src_qplugin.pro4
-rw-r--r--src/corelib/doc/snippets/code/doc_src_qset.cpp103
-rw-r--r--src/corelib/doc/snippets/code/doc_src_qvarlengtharray.cpp51
-rw-r--r--src/corelib/doc/snippets/code/doc_src_resources.cpp64
-rw-r--r--src/corelib/doc/snippets/code/doc_src_resources.qdoc55
-rw-r--r--src/corelib/doc/snippets/code/qlogging/qlogging.cpp61
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_animation_qparallelanimationgroup.cpp51
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_animation_qpropertyanimation.cpp144
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_animation_qsequentialanimationgroup.cpp51
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_animation_qvariantanimation.cpp51
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_concurrent_qthreadpool.cpp51
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_global_qglobal.cpp122
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_global_qlogging.cpp51
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_global_qnumeric.cpp51
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_global_qoperatingsystemversion.cpp51
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_global_qrandom.cpp53
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_io_qabstractfileengine.cpp98
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_io_qdatastream.cpp51
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_io_qdebug.cpp51
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_io_qdir.cpp55
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_io_qdiriterator.cpp55
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_io_qdirlisting.cpp70
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_io_qfile.cpp61
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_io_qfileinfo.cpp118
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_io_qfileselector.cpp51
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_io_qiodevice.cpp51
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_io_qloggingcategory.cpp51
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_io_qprocess.cpp51
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_io_qsettings.cpp59
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_io_qstorageinfo.cpp53
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_io_qtemporarydir.cpp51
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_io_qtemporaryfile.cpp51
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_io_qtextstream.cpp57
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_io_qurl.cpp61
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_io_qurlquery.cpp51
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_kernel_qabstractitemmodel.cpp61
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_kernel_qabstractnativeeventfilter.cpp51
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_kernel_qabstractnativeeventfilter.h51
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_kernel_qabstractnativeeventfilter.mm53
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_kernel_qabstractnativeeventfilter_win.cpp20
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_kernel_qcoreapplication.cpp59
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_kernel_qdeadlinetimer.cpp63
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_kernel_qmath.cpp51
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_kernel_qmetaobject.cpp84
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_kernel_qmetatype.cpp71
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_kernel_qmimedata.cpp53
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_kernel_qobject.cpp109
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_kernel_qproperty.cpp53
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_kernel_qsystemsemaphore.cpp55
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_kernel_qtimer.cpp53
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_kernel_qvariant.cpp58
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_mimetype_qmimedatabase.cpp55
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_plugin_qlibrary.cpp51
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_plugin_quuid.cpp51
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_serialization_qcborstream.cpp81
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_serialization_qcborvalue.cpp51
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_serialization_qdatastream.cpp59
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_serialization_qjsondocument.cpp51
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_text_qanystringview.cpp51
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_text_qbytearray.cpp83
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_text_qbytearraymatcher.cpp51
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_text_qbytearrayview.cpp51
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_text_qcollator.cpp51
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_text_qlocale.cpp51
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_text_qregularexpression.cpp51
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_text_qstaticlatin1stringmatcher.cpp8
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_text_qstring.cpp78
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_text_qstringconverter.cpp75
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_text_qstringiterator.cpp53
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_text_qstringview.cpp51
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_text_qutf8stringview.cpp51
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_thread_qatomic.cpp51
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_thread_qexception.cpp51
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_thread_qfuture.cpp152
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_thread_qfuturesynchronizer.cpp51
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_thread_qfuturewatcher.cpp51
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_thread_qmutex.cpp51
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_thread_qmutexpool.cpp71
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_thread_qreadwritelock.cpp51
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_thread_qsemaphore.cpp57
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_thread_qthread.cpp51
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_thread_qwaitcondition_unix.cpp51
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_time_qdatetime.cpp87
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_tools_qbitarray.cpp51
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_tools_qcommandlineoption.cpp51
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_tools_qcommandlineparser.cpp59
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_tools_qcommandlineparser_main.cpp51
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_tools_qcontiguouscache.cpp51
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_tools_qeasingcurve.cpp51
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_tools_qhash.cpp163
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_tools_qlist.cpp67
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_tools_qmap.cpp210
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_tools_qmultimap.cpp154
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_tools_qpoint.cpp51
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_tools_qqueue.cpp53
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_tools_qrect.cpp51
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_tools_qscopedpointer.cpp51
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_tools_qscopeguard.cpp51
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_tools_qshareddata.cpp51
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_tools_qsharedpointer.cpp51
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_tools_qsize.cpp51
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_tools_qtimeline.cpp51
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_xml_qxmlstream.cpp51
-rw-r--r--src/corelib/doc/snippets/code/src_gui_dialogs_qmessagebox.cpp158
-rw-r--r--src/corelib/doc/snippets/code/src_gui_itemviews_qidentityproxymodel.cpp59
-rw-r--r--src/corelib/doc/snippets/code/src_gui_itemviews_qitemselectionmodel.cpp51
-rw-r--r--src/corelib/doc/snippets/customtype/customtypeexample.cpp90
-rw-r--r--src/corelib/doc/snippets/eventfilters/filterobject.cpp51
-rw-r--r--src/corelib/doc/snippets/eventfilters/filterobject.h51
-rw-r--r--src/corelib/doc/snippets/eventfilters/main.cpp51
-rw-r--r--src/corelib/doc/snippets/events/events.cpp51
-rw-r--r--src/corelib/doc/snippets/file/file.cpp51
-rw-r--r--src/corelib/doc/snippets/fileinfo/main.cpp59
-rw-r--r--src/corelib/doc/snippets/hellotrmain.cpp55
-rw-r--r--src/corelib/doc/snippets/jni/src_qjniobject.cpp68
-rw-r--r--src/corelib/doc/snippets/ntfsp.cpp66
-rw-r--r--src/corelib/doc/snippets/overview/using-qt-core.cmake2
-rw-r--r--src/corelib/doc/snippets/pointer/pointer.cpp51
-rw-r--r--src/corelib/doc/snippets/process/process.cpp51
-rw-r--r--src/corelib/doc/snippets/qbytearraylist/main.cpp51
-rw-r--r--src/corelib/doc/snippets/qdebug/qdebugsnippet.cpp51
-rw-r--r--src/corelib/doc/snippets/qdir-listfiles/main.cpp51
-rw-r--r--src/corelib/doc/snippets/qdir-namefilters/main.cpp51
-rw-r--r--src/corelib/doc/snippets/qelapsedtimer/main.cpp51
-rw-r--r--src/corelib/doc/snippets/qloggingcategory/main.cpp80
-rw-r--r--src/corelib/doc/snippets/qmessageauthenticationcode/main.cpp59
-rw-r--r--src/corelib/doc/snippets/qmetaobject-invokable/main.cpp51
-rw-r--r--src/corelib/doc/snippets/qmetaobject-invokable/window.cpp51
-rw-r--r--src/corelib/doc/snippets/qmetaobject-invokable/window.h51
-rw-r--r--src/corelib/doc/snippets/qmetaobject-revision/main.cpp51
-rw-r--r--src/corelib/doc/snippets/qmetaobject-revision/window.cpp51
-rw-r--r--src/corelib/doc/snippets/qmetaobject-revision/window.h51
-rw-r--r--src/corelib/doc/snippets/qmetatype/registerConverters.cpp61
-rw-r--r--src/corelib/doc/snippets/qprocess-environment/main.cpp51
-rw-r--r--src/corelib/doc/snippets/qprocess/qprocess-createprocessargumentsmodifier.cpp51
-rw-r--r--src/corelib/doc/snippets/qprocess/qprocess-simpleexecution.cpp51
-rw-r--r--src/corelib/doc/snippets/qsignalmapper/buttonwidget.cpp60
-rw-r--r--src/corelib/doc/snippets/qsignalmapper/buttonwidget.h51
-rw-r--r--src/corelib/doc/snippets/qsortfilterproxymodel-details/main.cpp51
-rw-r--r--src/corelib/doc/snippets/qstack/main.cpp51
-rw-r--r--src/corelib/doc/snippets/qstring/main.cpp67
-rw-r--r--src/corelib/doc/snippets/qstring/stringbuilder.cpp84
-rw-r--r--src/corelib/doc/snippets/qstringlist/main.cpp78
-rw-r--r--src/corelib/doc/snippets/qstringlistmodel/main.cpp51
-rw-r--r--src/corelib/doc/snippets/qtcast/qtcast.cpp51
-rw-r--r--src/corelib/doc/snippets/qversionnumber/main.cpp59
-rw-r--r--src/corelib/doc/snippets/qxmlstreamwriter/main.cpp51
-rw-r--r--src/corelib/doc/snippets/resource-system/CMakeLists.txt5
-rw-r--r--src/corelib/doc/snippets/resource-system/application.pro4
-rw-r--r--src/corelib/doc/snippets/resource-system/main.cpp51
-rw-r--r--src/corelib/doc/snippets/resource-system/mainwindow.cpp125
-rw-r--r--src/corelib/doc/snippets/settings/settings.cpp51
-rw-r--r--src/corelib/doc/snippets/sharedemployee/employee.h51
-rw-r--r--src/corelib/doc/snippets/sharedemployee/main.cpp51
-rw-r--r--src/corelib/doc/snippets/signalsandslots/lcdnumber.h51
-rw-r--r--src/corelib/doc/snippets/signalsandslots/signalsandslots.cpp51
-rw-r--r--src/corelib/doc/snippets/signalsandslots/signalsandslots.h51
-rw-r--r--src/corelib/doc/snippets/streaming/main.cpp51
-rw-r--r--src/corelib/doc/snippets/threads/threads.cpp57
-rw-r--r--src/corelib/doc/snippets/timers/analogclock.cpp97
-rw-r--r--src/corelib/doc/snippets/timers/timers.cpp95
-rw-r--r--src/corelib/doc/src/animation.qdoc364
-rw-r--r--src/corelib/doc/src/cbor.qdoc79
-rw-r--r--src/corelib/doc/src/cmake/cmake-commands.qdoc31
-rw-r--r--src/corelib/doc/src/cmake/cmake-configure-variables.qdoc587
-rw-r--r--src/corelib/doc/src/cmake/cmake-deploy-variables.qdoc307
-rw-r--r--src/corelib/doc/src/cmake/cmake-properties.qdoc393
-rw-r--r--src/corelib/doc/src/cmake/cmake-standard-properties.qdoc24
-rw-r--r--src/corelib/doc/src/cmake/cmake-variables.qdoc164
-rw-r--r--src/corelib/doc/src/cmake/policy/qtp0002.qdoc63
-rw-r--r--src/corelib/doc/src/cmake/policy/qtp0003.qdoc46
-rw-r--r--src/corelib/doc/src/cmake/qt_add_big_resources.qdoc42
-rw-r--r--src/corelib/doc/src/cmake/qt_add_binary_resources.qdoc34
-rw-r--r--src/corelib/doc/src/cmake/qt_add_executable.qdoc63
-rw-r--r--src/corelib/doc/src/cmake/qt_add_library.qdoc43
-rw-r--r--src/corelib/doc/src/cmake/qt_add_plugin.qdoc55
-rw-r--r--src/corelib/doc/src/cmake/qt_add_resources.qdoc57
-rw-r--r--src/corelib/doc/src/cmake/qt_allow_non_utf8_sources.qdoc34
-rw-r--r--src/corelib/doc/src/cmake/qt_android_add_apk_target.qdoc61
-rw-r--r--src/corelib/doc/src/cmake/qt_android_apply_arch_suffix.qdoc36
-rw-r--r--src/corelib/doc/src/cmake/qt_android_generate_deployment_settings.qdoc35
-rw-r--r--src/corelib/doc/src/cmake/qt_deploy_qt_conf.qdoc78
-rw-r--r--src/corelib/doc/src/cmake/qt_deploy_runtime_dependencies.qdoc198
-rw-r--r--src/corelib/doc/src/cmake/qt_deploy_translations.qdoc76
-rw-r--r--src/corelib/doc/src/cmake/qt_disable_unicode_defines.qdoc34
-rw-r--r--src/corelib/doc/src/cmake/qt_extract_metatypes.qdoc49
-rw-r--r--src/corelib/doc/src/cmake/qt_finalize_project.qdoc53
-rw-r--r--src/corelib/doc/src/cmake/qt_finalize_target.qdoc44
-rw-r--r--src/corelib/doc/src/cmake/qt_generate_deploy_app_script.qdoc110
-rw-r--r--src/corelib/doc/src/cmake/qt_generate_deploy_script.qdoc65
-rw-r--r--src/corelib/doc/src/cmake/qt_generate_moc.qdoc34
-rw-r--r--src/corelib/doc/src/cmake/qt_import_plugins.qdoc68
-rw-r--r--src/corelib/doc/src/cmake/qt_policy.qdoc65
-rw-r--r--src/corelib/doc/src/cmake/qt_set_finalizer_mode.qdoc35
-rw-r--r--src/corelib/doc/src/cmake/qt_standard_project_setup.qdoc101
-rw-r--r--src/corelib/doc/src/cmake/qt_wrap_cpp.qdoc72
-rw-r--r--src/corelib/doc/src/containers.qdoc111
-rw-r--r--src/corelib/doc/src/custom-types.qdoc59
-rw-r--r--src/corelib/doc/src/datastreamformat.qdoc78
-rw-r--r--src/corelib/doc/src/dontdocument.qdoc28
-rw-r--r--src/corelib/doc/src/eventsandfilters.qdoc28
-rw-r--r--src/corelib/doc/src/external-resources.qdoc118
-rw-r--r--src/corelib/doc/src/filestorage.qdoc28
-rw-r--r--src/corelib/doc/src/foreach-keyword.qdoc41
-rw-r--r--src/corelib/doc/src/implicit-sharing.qdoc28
-rw-r--r--src/corelib/doc/src/includes/android-content-uri-limitations.qdocinc13
-rw-r--r--src/corelib/doc/src/includes/cmake-android-qt-finalize-project-warning.qdocinc8
-rw-r--r--src/corelib/doc/src/includes/cmake-android-supported-abis.qdocinc1
-rw-r--r--src/corelib/doc/src/includes/cmake-deploy-modified-variable-values.qdocinc30
-rw-r--r--src/corelib/doc/src/includes/cmake-deploy-runtime-dependencies-deploy-tool-options.qdocinc20
-rw-r--r--src/corelib/doc/src/includes/cmake-deploy-runtime-dependencies.qdocinc46
-rw-r--r--src/corelib/doc/src/includes/cmake-deploy-var-usage.qdocinc6
-rw-r--r--src/corelib/doc/src/includes/cmake-find-package-core.qdocinc7
-rw-r--r--src/corelib/doc/src/includes/cmake-generate-deploy-app-script-deploy-tool-options.qdocinc16
-rw-r--r--src/corelib/doc/src/includes/cmake-generate-deploy-app-script.qdocinc21
-rw-r--r--src/corelib/doc/src/includes/models.qdocinc14
-rw-r--r--src/corelib/doc/src/includes/permissions.qdocinc51
-rw-r--r--src/corelib/doc/src/includes/qobject.qdocinc28
-rw-r--r--src/corelib/doc/src/includes/qstring.qdocinc36
-rw-r--r--src/corelib/doc/src/io.qdoc30
-rw-r--r--src/corelib/doc/src/ipc.qdoc492
-rw-r--r--src/corelib/doc/src/java-style-iterators.qdoc30
-rw-r--r--src/corelib/doc/src/json.qdoc34
-rw-r--r--src/corelib/doc/src/objectmodel/bindableproperties.qdoc44
-rw-r--r--src/corelib/doc/src/objectmodel/metaobjects.qdoc30
-rw-r--r--src/corelib/doc/src/objectmodel/object.qdoc28
-rw-r--r--src/corelib/doc/src/objectmodel/objecttrees.qdoc28
-rw-r--r--src/corelib/doc/src/objectmodel/properties.qdoc59
-rw-r--r--src/corelib/doc/src/objectmodel/signalsandslots.qdoc61
-rw-r--r--src/corelib/doc/src/plugin-classes.qdoc28
-rw-r--r--src/corelib/doc/src/qt6-changes.qdoc352
-rw-r--r--src/corelib/doc/src/qtcore-index.qdoc93
-rw-r--r--src/corelib/doc/src/qtcore.qdoc46
-rw-r--r--src/corelib/doc/src/qtserialization.qdoc145
-rw-r--r--src/corelib/doc/src/resource-system.qdoc82
-rw-r--r--src/corelib/doc/src/timers.qdoc140
-rw-r--r--src/corelib/global/archdetect.cpp52
-rw-r--r--src/corelib/global/minimum-linux_p.h49
-rw-r--r--src/corelib/global/q20algorithm.h163
-rw-r--r--src/corelib/global/q20chrono.h62
-rw-r--r--src/corelib/global/q20functional.h48
-rw-r--r--src/corelib/global/q20iterator.h56
-rw-r--r--src/corelib/global/q20map.h72
-rw-r--r--src/corelib/global/q20memory.h93
-rw-r--r--src/corelib/global/q20type_traits.h81
-rw-r--r--src/corelib/global/q20vector.h90
-rw-r--r--src/corelib/global/q23functional.h49
-rw-r--r--src/corelib/global/q23utility.cpp25
-rw-r--r--src/corelib/global/q23utility.h75
-rw-r--r--src/corelib/global/qassert.cpp277
-rw-r--r--src/corelib/global/qassert.h116
-rw-r--r--src/corelib/global/qcompare.cpp1357
-rw-r--r--src/corelib/global/qcompare.h903
-rw-r--r--src/corelib/global/qcompare.qdoc137
-rw-r--r--src/corelib/global/qcompare_impl.h51
-rw-r--r--src/corelib/global/qcomparehelpers.h567
-rw-r--r--src/corelib/global/qcompilerdetection.h707
-rw-r--r--src/corelib/global/qcompilerdetection.qdoc427
-rw-r--r--src/corelib/global/qconfig-bootstrapped.h61
-rw-r--r--src/corelib/global/qconfig.cpp.in2
-rw-r--r--src/corelib/global/qconstructormacros.h38
-rw-r--r--src/corelib/global/qcontainerinfo.h45
-rw-r--r--src/corelib/global/qdarwinhelpers.h37
-rw-r--r--src/corelib/global/qdarwinhelpers.qdoc34
-rw-r--r--src/corelib/global/qendian.cpp63
-rw-r--r--src/corelib/global/qendian.h77
-rw-r--r--src/corelib/global/qendian_p.h258
-rw-r--r--src/corelib/global/qexceptionhandling.cpp20
-rw-r--r--src/corelib/global/qexceptionhandling.h46
-rw-r--r--src/corelib/global/qflags.h91
-rw-r--r--src/corelib/global/qflags.qdoc459
-rw-r--r--src/corelib/global/qfloat16.cpp243
-rw-r--r--src/corelib/global/qfloat16.h356
-rw-r--r--src/corelib/global/qfloat16tables.cpp44
-rw-r--r--src/corelib/global/qforeach.h84
-rw-r--r--src/corelib/global/qforeach.qdoc72
-rw-r--r--src/corelib/global/qfunctionpointer.h23
-rw-r--r--src/corelib/global/qfunctionpointer.qdoc9
-rw-r--r--src/corelib/global/qglobal.cpp4750
-rw-r--r--src/corelib/global/qglobal.h1485
-rw-r--r--src/corelib/global/qglobal_p.h82
-rw-r--r--src/corelib/global/qglobalstatic.h173
-rw-r--r--src/corelib/global/qglobalstatic.qdoc149
-rw-r--r--src/corelib/global/qhooks.cpp42
-rw-r--r--src/corelib/global/qhooks_p.h40
-rw-r--r--src/corelib/global/qlibraryinfo.cpp270
-rw-r--r--src/corelib/global/qlibraryinfo.h50
-rw-r--r--src/corelib/global/qlibraryinfo_p.h52
-rw-r--r--src/corelib/global/qlogging.cpp1300
-rw-r--r--src/corelib/global/qlogging.h88
-rw-r--r--src/corelib/global/qlogging_p.h90
-rw-r--r--src/corelib/global/qmalloc.cpp43
-rw-r--r--src/corelib/global/qmalloc.h26
-rw-r--r--src/corelib/global/qminmax.h88
-rw-r--r--src/corelib/global/qminmax.qdoc39
-rw-r--r--src/corelib/global/qnamespace.h102
-rw-r--r--src/corelib/global/qnamespace.qdoc210
-rw-r--r--src/corelib/global/qnativeinterface.h40
-rw-r--r--src/corelib/global/qnativeinterface_p.h44
-rw-r--r--src/corelib/global/qnumeric.cpp244
-rw-r--r--src/corelib/global/qnumeric.h145
-rw-r--r--src/corelib/global/qnumeric_p.h309
-rw-r--r--src/corelib/global/qoperatingsystemversion.cpp204
-rw-r--r--src/corelib/global/qoperatingsystemversion.h162
-rw-r--r--src/corelib/global/qoperatingsystemversion_darwin.mm93
-rw-r--r--src/corelib/global/qoperatingsystemversion_p.h41
-rw-r--r--src/corelib/global/qoperatingsystemversion_win.cpp66
-rw-r--r--src/corelib/global/qoperatingsystemversion_win_p.h42
-rw-r--r--src/corelib/global/qoverload.h80
-rw-r--r--src/corelib/global/qoverload.qdoc43
-rw-r--r--src/corelib/global/qprocessordetection.h93
-rw-r--r--src/corelib/global/qprocessordetection.qdoc448
-rw-r--r--src/corelib/global/qrandom.cpp71
-rw-r--r--src/corelib/global/qrandom.h54
-rw-r--r--src/corelib/global/qrandom_p.h40
-rw-r--r--src/corelib/global/qsimd.cpp220
-rw-r--r--src/corelib/global/qsimd.h62
-rw-r--r--src/corelib/global/qsimd_p.h345
-rw-r--r--src/corelib/global/qsimd_x86.cpp291
-rw-r--r--src/corelib/global/qsimd_x86_p.h616
-rw-r--r--src/corelib/global/qswap.h38
-rw-r--r--src/corelib/global/qswap.qdoc38
-rw-r--r--src/corelib/global/qsysinfo.cpp1072
-rw-r--r--src/corelib/global/qsysinfo.h50
-rw-r--r--src/corelib/global/qsystemdetection.h217
-rw-r--r--src/corelib/global/qsystemdetection.qdoc219
-rw-r--r--src/corelib/global/qt_pch.h89
-rw-r--r--src/corelib/global/qt_windows.h42
-rw-r--r--src/corelib/global/qtclasshelpermacros.h132
-rw-r--r--src/corelib/global/qtclasshelpermacros.qdoc59
-rw-r--r--src/corelib/global/qtconfiginclude.h22
-rw-r--r--src/corelib/global/qtconfigmacros.h208
-rw-r--r--src/corelib/global/qtdeprecationmarkers.h347
-rw-r--r--src/corelib/global/qtdeprecationmarkers.qdoc64
-rw-r--r--src/corelib/global/qtenvironmentvariables.cpp429
-rw-r--r--src/corelib/global/qtenvironmentvariables.h38
-rw-r--r--src/corelib/global/qtenvironmentvariables_p.h39
-rw-r--r--src/corelib/global/qtnoop.h20
-rw-r--r--src/corelib/global/qtpreprocessorsupport.h26
-rw-r--r--src/corelib/global/qtpreprocessorsupport.qdoc20
-rw-r--r--src/corelib/global/qtrace_p.h173
-rw-r--r--src/corelib/global/qtresource.h21
-rw-r--r--src/corelib/global/qtresource.qdoc54
-rw-r--r--src/corelib/global/qtsymbolmacros.h65
-rw-r--r--src/corelib/global/qttranslation.h44
-rw-r--r--src/corelib/global/qttranslation.qdoc206
-rw-r--r--src/corelib/global/qttypetraits.h65
-rw-r--r--src/corelib/global/qttypetraits.qdoc146
-rw-r--r--src/corelib/global/qtversion.h38
-rw-r--r--src/corelib/global/qtversionchecks.cpp46
-rw-r--r--src/corelib/global/qtversionchecks.h114
-rw-r--r--src/corelib/global/qtypeinfo.h140
-rw-r--r--src/corelib/global/qtypeinfo.qdoc48
-rw-r--r--src/corelib/global/qtypes.cpp528
-rw-r--r--src/corelib/global/qtypes.h283
-rw-r--r--src/corelib/global/qversiontagging.cpp77
-rw-r--r--src/corelib/global/qversiontagging.h188
-rw-r--r--src/corelib/global/qvolatile_p.h42
-rw-r--r--src/corelib/global/qxpfunctional.h195
-rw-r--r--src/corelib/global/qxptype_traits.h121
-rw-r--r--src/corelib/io/forkfd_qt.c15
-rw-r--r--src/corelib/io/forkfd_qt.cpp48
-rw-r--r--src/corelib/io/qabstractfileengine.cpp287
-rw-r--r--src/corelib/io/qabstractfileengine_p.h98
-rw-r--r--src/corelib/io/qbuffer.cpp131
-rw-r--r--src/corelib/io/qbuffer.h48
-rw-r--r--src/corelib/io/qdataurl.cpp70
-rw-r--r--src/corelib/io/qdataurl_p.h41
-rw-r--r--src/corelib/io/qdebug.cpp379
-rw-r--r--src/corelib/io/qdebug.h244
-rw-r--r--src/corelib/io/qdebug_p.h47
-rw-r--r--src/corelib/io/qdir.cpp792
-rw-r--r--src/corelib/io/qdir.h72
-rw-r--r--src/corelib/io/qdir_p.h69
-rw-r--r--src/corelib/io/qdirentryinfo_p.h156
-rw-r--r--src/corelib/io/qdiriterator.cpp388
-rw-r--r--src/corelib/io/qdiriterator.h40
-rw-r--r--src/corelib/io/qdirlisting.cpp673
-rw-r--r--src/corelib/io/qdirlisting.h119
-rw-r--r--src/corelib/io/qfile.cpp254
-rw-r--r--src/corelib/io/qfile.h117
-rw-r--r--src/corelib/io/qfile_p.h40
-rw-r--r--src/corelib/io/qfiledevice.cpp113
-rw-r--r--src/corelib/io/qfiledevice.h56
-rw-r--r--src/corelib/io/qfiledevice_p.h49
-rw-r--r--src/corelib/io/qfileinfo.cpp850
-rw-r--r--src/corelib/io/qfileinfo.h72
-rw-r--r--src/corelib/io/qfileinfo_p.h62
-rw-r--r--src/corelib/io/qfileselector.cpp67
-rw-r--r--src/corelib/io/qfileselector.h40
-rw-r--r--src/corelib/io/qfileselector_p.h42
-rw-r--r--src/corelib/io/qfilesystemengine.cpp80
-rw-r--r--src/corelib/io/qfilesystemengine_mac.mm40
-rw-r--r--src/corelib/io/qfilesystemengine_p.h54
-rw-r--r--src/corelib/io/qfilesystemengine_unix.cpp751
-rw-r--r--src/corelib/io/qfilesystemengine_win.cpp255
-rw-r--r--src/corelib/io/qfilesystementry.cpp109
-rw-r--r--src/corelib/io/qfilesystementry_p.h86
-rw-r--r--src/corelib/io/qfilesystemiterator_p.h66
-rw-r--r--src/corelib/io/qfilesystemiterator_unix.cpp113
-rw-r--r--src/corelib/io/qfilesystemiterator_win.cpp71
-rw-r--r--src/corelib/io/qfilesystemmetadata_p.h95
-rw-r--r--src/corelib/io/qfilesystemwatcher.cpp101
-rw-r--r--src/corelib/io/qfilesystemwatcher.h44
-rw-r--r--src/corelib/io/qfilesystemwatcher_fsevents.mm52
-rw-r--r--src/corelib/io/qfilesystemwatcher_fsevents_p.h40
-rw-r--r--src/corelib/io/qfilesystemwatcher_inotify.cpp47
-rw-r--r--src/corelib/io/qfilesystemwatcher_inotify_p.h40
-rw-r--r--src/corelib/io/qfilesystemwatcher_kqueue.cpp46
-rw-r--r--src/corelib/io/qfilesystemwatcher_kqueue_p.h40
-rw-r--r--src/corelib/io/qfilesystemwatcher_p.h52
-rw-r--r--src/corelib/io/qfilesystemwatcher_polling.cpp76
-rw-r--r--src/corelib/io/qfilesystemwatcher_polling_p.h54
-rw-r--r--src/corelib/io/qfilesystemwatcher_win.cpp79
-rw-r--r--src/corelib/io/qfilesystemwatcher_win_p.h45
-rw-r--r--src/corelib/io/qfsfileengine.cpp143
-rw-r--r--src/corelib/io/qfsfileengine_iterator.cpp81
-rw-r--r--src/corelib/io/qfsfileengine_iterator_p.h52
-rw-r--r--src/corelib/io/qfsfileengine_p.h64
-rw-r--r--src/corelib/io/qfsfileengine_unix.cpp83
-rw-r--r--src/corelib/io/qfsfileengine_win.cpp97
-rw-r--r--src/corelib/io/qiodevice.cpp147
-rw-r--r--src/corelib/io/qiodevice.h40
-rw-r--r--src/corelib/io/qiodevice_p.h47
-rw-r--r--src/corelib/io/qiodevicebase.h40
-rw-r--r--src/corelib/io/qipaddress.cpp102
-rw-r--r--src/corelib/io/qipaddress_p.h40
-rw-r--r--src/corelib/io/qlockfile.cpp153
-rw-r--r--src/corelib/io/qlockfile.h58
-rw-r--r--src/corelib/io/qlockfile_p.h62
-rw-r--r--src/corelib/io/qlockfile_unix.cpp71
-rw-r--r--src/corelib/io/qlockfile_win.cpp48
-rw-r--r--src/corelib/io/qloggingcategory.cpp177
-rw-r--r--src/corelib/io/qloggingcategory.h83
-rw-r--r--src/corelib/io/qloggingregistry.cpp136
-rw-r--r--src/corelib/io/qloggingregistry_p.h59
-rw-r--r--src/corelib/io/qnoncontiguousbytedevice.cpp109
-rw-r--r--src/corelib/io/qnoncontiguousbytedevice_p.h43
-rw-r--r--src/corelib/io/qntdll_p.h44
-rw-r--r--src/corelib/io/qprocess.cpp550
-rw-r--r--src/corelib/io/qprocess.h88
-rw-r--r--src/corelib/io/qprocess_darwin.mm40
-rw-r--r--src/corelib/io/qprocess_p.h96
-rw-r--r--src/corelib/io/qprocess_unix.cpp710
-rw-r--r--src/corelib/io/qprocess_win.cpp128
-rw-r--r--src/corelib/io/qresource.cpp164
-rw-r--r--src/corelib/io/qresource.h42
-rw-r--r--src/corelib/io/qresource_iterator.cpp78
-rw-r--r--src/corelib/io/qresource_iterator_p.h47
-rw-r--r--src/corelib/io/qresource_p.h46
-rw-r--r--src/corelib/io/qsavefile.cpp62
-rw-r--r--src/corelib/io/qsavefile.h46
-rw-r--r--src/corelib/io/qsavefile_p.h44
-rw-r--r--src/corelib/io/qsettings.cpp810
-rw-r--r--src/corelib/io/qsettings.h74
-rw-r--r--src/corelib/io/qsettings_mac.cpp93
-rw-r--r--src/corelib/io/qsettings_p.h98
-rw-r--r--src/corelib/io/qsettings_wasm.cpp498
-rw-r--r--src/corelib/io/qsettings_win.cpp106
-rw-r--r--src/corelib/io/qstandardpaths.cpp146
-rw-r--r--src/corelib/io/qstandardpaths.h46
-rw-r--r--src/corelib/io/qstandardpaths_android.cpp236
-rw-r--r--src/corelib/io/qstandardpaths_haiku.cpp52
-rw-r--r--src/corelib/io/qstandardpaths_mac.mm84
-rw-r--r--src/corelib/io/qstandardpaths_unix.cpp258
-rw-r--r--src/corelib/io/qstandardpaths_win.cpp107
-rw-r--r--src/corelib/io/qstorageinfo.cpp78
-rw-r--r--src/corelib/io/qstorageinfo.h59
-rw-r--r--src/corelib/io/qstorageinfo_linux.cpp288
-rw-r--r--src/corelib/io/qstorageinfo_linux_p.h244
-rw-r--r--src/corelib/io/qstorageinfo_mac.cpp49
-rw-r--r--src/corelib/io/qstorageinfo_p.h161
-rw-r--r--src/corelib/io/qstorageinfo_stub.cpp25
-rw-r--r--src/corelib/io/qstorageinfo_unix.cpp507
-rw-r--r--src/corelib/io/qstorageinfo_win.cpp59
-rw-r--r--src/corelib/io/qtemporarydir.cpp104
-rw-r--r--src/corelib/io/qtemporarydir.h61
-rw-r--r--src/corelib/io/qtemporaryfile.cpp157
-rw-r--r--src/corelib/io/qtemporaryfile.h81
-rw-r--r--src/corelib/io/qtemporaryfile_p.h47
-rw-r--r--src/corelib/io/qurl.cpp555
-rw-r--r--src/corelib/io/qurl.h69
-rw-r--r--src/corelib/io/qurl_p.h46
-rw-r--r--src/corelib/io/qurlidna.cpp196
-rw-r--r--src/corelib/io/qurlquery.cpp122
-rw-r--r--src/corelib/io/qurlquery.h61
-rw-r--r--src/corelib/io/qurlrecode.cpp42
-rw-r--r--src/corelib/io/qwindowspipereader.cpp48
-rw-r--r--src/corelib/io/qwindowspipereader_p.h42
-rw-r--r--src/corelib/io/qwindowspipewriter.cpp44
-rw-r--r--src/corelib/io/qwindowspipewriter_p.h42
-rw-r--r--src/corelib/io/qzip.cpp1347
-rw-r--r--src/corelib/io/qzipreader_p.h87
-rw-r--r--src/corelib/io/qzipwriter_p.h77
-rw-r--r--src/corelib/ipc/qsharedmemory.cpp689
-rw-r--r--src/corelib/ipc/qsharedmemory.h99
-rw-r--r--src/corelib/ipc/qsharedmemory_p.h215
-rw-r--r--src/corelib/ipc/qsharedmemory_posix.cpp196
-rw-r--r--src/corelib/ipc/qsharedmemory_systemv.cpp212
-rw-r--r--src/corelib/ipc/qsharedmemory_win.cpp148
-rw-r--r--src/corelib/ipc/qsystemsemaphore.cpp (renamed from src/corelib/kernel/qsystemsemaphore.cpp)274
-rw-r--r--src/corelib/ipc/qsystemsemaphore.h75
-rw-r--r--src/corelib/ipc/qsystemsemaphore_p.h152
-rw-r--r--src/corelib/ipc/qsystemsemaphore_posix.cpp171
-rw-r--r--src/corelib/ipc/qsystemsemaphore_systemv.cpp201
-rw-r--r--src/corelib/ipc/qsystemsemaphore_win.cpp98
-rw-r--r--src/corelib/ipc/qtipccommon.cpp610
-rw-r--r--src/corelib/ipc/qtipccommon.h206
-rw-r--r--src/corelib/ipc/qtipccommon_p.h173
-rw-r--r--src/corelib/itemmodels/qabstractitemmodel.cpp152
-rw-r--r--src/corelib/itemmodels/qabstractitemmodel.h96
-rw-r--r--src/corelib/itemmodels/qabstractitemmodel_p.h90
-rw-r--r--src/corelib/itemmodels/qabstractproxymodel.cpp167
-rw-r--r--src/corelib/itemmodels/qabstractproxymodel.h46
-rw-r--r--src/corelib/itemmodels/qabstractproxymodel_p.h64
-rw-r--r--src/corelib/itemmodels/qconcatenatetablesproxymodel.cpp221
-rw-r--r--src/corelib/itemmodels/qconcatenatetablesproxymodel.h55
-rw-r--r--src/corelib/itemmodels/qidentityproxymodel.cpp254
-rw-r--r--src/corelib/itemmodels/qidentityproxymodel.h65
-rw-r--r--src/corelib/itemmodels/qidentityproxymodel_p.h86
-rw-r--r--src/corelib/itemmodels/qitemselectionmodel.cpp243
-rw-r--r--src/corelib/itemmodels/qitemselectionmodel.h69
-rw-r--r--src/corelib/itemmodels/qitemselectionmodel_p.h74
-rw-r--r--src/corelib/itemmodels/qsortfilterproxymodel.cpp350
-rw-r--r--src/corelib/itemmodels/qsortfilterproxymodel.h62
-rw-r--r--src/corelib/itemmodels/qstringlistmodel.cpp57
-rw-r--r--src/corelib/itemmodels/qstringlistmodel.h40
-rw-r--r--src/corelib/itemmodels/qtransposeproxymodel.cpp46
-rw-r--r--src/corelib/itemmodels/qtransposeproxymodel.h40
-rw-r--r--src/corelib/itemmodels/qtransposeproxymodel_p.h40
-rw-r--r--src/corelib/kernel/qabstracteventdispatcher.cpp332
-rw-r--r--src/corelib/kernel/qabstracteventdispatcher.h103
-rw-r--r--src/corelib/kernel/qabstracteventdispatcher_p.h57
-rw-r--r--src/corelib/kernel/qabstractnativeeventfilter.cpp43
-rw-r--r--src/corelib/kernel/qabstractnativeeventfilter.h40
-rw-r--r--src/corelib/kernel/qapplicationstatic.h154
-rw-r--r--src/corelib/kernel/qapplicationstatic.qdoc157
-rw-r--r--src/corelib/kernel/qassociativeiterable.cpp40
-rw-r--r--src/corelib/kernel/qassociativeiterable.h40
-rw-r--r--src/corelib/kernel/qbasictimer.cpp86
-rw-r--r--src/corelib/kernel/qbasictimer.h63
-rw-r--r--src/corelib/kernel/qbindingstorage.h57
-rw-r--r--src/corelib/kernel/qcfsocketnotifier.cpp42
-rw-r--r--src/corelib/kernel/qcfsocketnotifier_p.h40
-rw-r--r--src/corelib/kernel/qchronotimer.cpp452
-rw-r--r--src/corelib/kernel/qchronotimer.h149
-rw-r--r--src/corelib/kernel/qcore_foundation.mm52
-rw-r--r--src/corelib/kernel/qcore_mac.mm424
-rw-r--r--src/corelib/kernel/qcore_mac_p.h155
-rw-r--r--src/corelib/kernel/qcore_unix.cpp107
-rw-r--r--src/corelib/kernel/qcore_unix_p.h201
-rw-r--r--src/corelib/kernel/qcore_wasm.cpp97
-rw-r--r--src/corelib/kernel/qcoreapplication.cpp758
-rw-r--r--src/corelib/kernel/qcoreapplication.h101
-rw-r--r--src/corelib/kernel/qcoreapplication_mac.cpp40
-rw-r--r--src/corelib/kernel/qcoreapplication_p.h52
-rw-r--r--src/corelib/kernel/qcoreapplication_platform.h66
-rw-r--r--src/corelib/kernel/qcoreapplication_win.cpp111
-rw-r--r--src/corelib/kernel/qcorecmdlineargs_p.h40
-rw-r--r--src/corelib/kernel/qcoreevent.cpp120
-rw-r--r--src/corelib/kernel/qcoreevent.h110
-rw-r--r--src/corelib/kernel/qcoreevent_p.h39
-rw-r--r--src/corelib/kernel/qcoreglobaldata.cpp59
-rw-r--r--src/corelib/kernel/qcoreglobaldata_p.h75
-rw-r--r--src/corelib/kernel/qdeadlinetimer.cpp555
-rw-r--r--src/corelib/kernel/qdeadlinetimer.h147
-rw-r--r--src/corelib/kernel/qdeadlinetimer_p.h70
-rw-r--r--src/corelib/kernel/qelapsedtimer.cpp329
-rw-r--r--src/corelib/kernel/qelapsedtimer.h62
-rw-r--r--src/corelib/kernel/qelapsedtimer_generic.cpp205
-rw-r--r--src/corelib/kernel/qelapsedtimer_mac.cpp166
-rw-r--r--src/corelib/kernel/qelapsedtimer_unix.cpp259
-rw-r--r--src/corelib/kernel/qelapsedtimer_win.cpp172
-rw-r--r--src/corelib/kernel/qeventdispatcher_cf.mm98
-rw-r--r--src/corelib/kernel/qeventdispatcher_cf_p.h77
-rw-r--r--src/corelib/kernel/qeventdispatcher_glib.cpp120
-rw-r--r--src/corelib/kernel/qeventdispatcher_glib_p.h54
-rw-r--r--src/corelib/kernel/qeventdispatcher_unix.cpp163
-rw-r--r--src/corelib/kernel/qeventdispatcher_unix_p.h63
-rw-r--r--src/corelib/kernel/qeventdispatcher_wasm.cpp850
-rw-r--r--src/corelib/kernel/qeventdispatcher_wasm_p.h116
-rw-r--r--src/corelib/kernel/qeventdispatcher_win.cpp128
-rw-r--r--src/corelib/kernel/qeventdispatcher_win_p.h49
-rw-r--r--src/corelib/kernel/qeventloop.cpp220
-rw-r--r--src/corelib/kernel/qeventloop.h81
-rw-r--r--src/corelib/kernel/qeventloop_p.h40
-rw-r--r--src/corelib/kernel/qfunctions_p.h44
-rw-r--r--src/corelib/kernel/qfunctions_vxworks.cpp208
-rw-r--r--src/corelib/kernel/qfunctions_vxworks.h195
-rw-r--r--src/corelib/kernel/qfunctions_win.cpp66
-rw-r--r--src/corelib/kernel/qfunctions_win_p.h51
-rw-r--r--src/corelib/kernel/qfunctions_winrt_p.h42
-rw-r--r--src/corelib/kernel/qiterable.cpp69
-rw-r--r--src/corelib/kernel/qiterable.h94
-rw-r--r--src/corelib/kernel/qiterable_p.h42
-rw-r--r--src/corelib/kernel/qjniarray.h464
-rw-r--r--src/corelib/kernel/qjnienvironment.cpp246
-rw-r--r--src/corelib/kernel/qjnienvironment.h85
-rw-r--r--src/corelib/kernel/qjnihelpers.cpp194
-rw-r--r--src/corelib/kernel/qjnihelpers_p.h78
-rw-r--r--src/corelib/kernel/qjniobject.cpp779
-rw-r--r--src/corelib/kernel/qjniobject.h1175
-rw-r--r--src/corelib/kernel/qjnitypes.h218
-rw-r--r--src/corelib/kernel/qjnitypes_impl.h373
-rw-r--r--src/corelib/kernel/qmath.cpp42
-rw-r--r--src/corelib/kernel/qmath.h56
-rw-r--r--src/corelib/kernel/qmath.qdoc41
-rw-r--r--src/corelib/kernel/qmetacontainer.cpp56
-rw-r--r--src/corelib/kernel/qmetacontainer.h69
-rw-r--r--src/corelib/kernel/qmetaobject.cpp1423
-rw-r--r--src/corelib/kernel/qmetaobject.h146
-rw-r--r--src/corelib/kernel/qmetaobject_moc_p.h41
-rw-r--r--src/corelib/kernel/qmetaobject_p.h93
-rw-r--r--src/corelib/kernel/qmetaobjectbuilder.cpp136
-rw-r--r--src/corelib/kernel/qmetaobjectbuilder_p.h43
-rw-r--r--src/corelib/kernel/qmetatype.cpp771
-rw-r--r--src/corelib/kernel/qmetatype.h498
-rw-r--r--src/corelib/kernel/qmetatype_p.h209
-rw-r--r--src/corelib/kernel/qmimedata.cpp159
-rw-r--r--src/corelib/kernel/qmimedata.h40
-rw-r--r--src/corelib/kernel/qobject.cpp1067
-rw-r--r--src/corelib/kernel/qobject.h283
-rw-r--r--src/corelib/kernel/qobject_impl.h64
-rw-r--r--src/corelib/kernel/qobject_p.h382
-rw-r--r--src/corelib/kernel/qobject_p_p.h257
-rw-r--r--src/corelib/kernel/qobjectcleanuphandler.cpp44
-rw-r--r--src/corelib/kernel/qobjectcleanuphandler.h40
-rw-r--r--src/corelib/kernel/qobjectdefs.h450
-rw-r--r--src/corelib/kernel/qobjectdefs_impl.h461
-rw-r--r--src/corelib/kernel/qpermissions.cpp693
-rw-r--r--src/corelib/kernel/qpermissions.h219
-rw-r--r--src/corelib/kernel/qpermissions_android.cpp189
-rw-r--r--src/corelib/kernel/qpermissions_darwin.mm88
-rw-r--r--src/corelib/kernel/qpermissions_p.h55
-rw-r--r--src/corelib/kernel/qpermissions_wasm.cpp275
-rw-r--r--src/corelib/kernel/qpointer.h100
-rw-r--r--src/corelib/kernel/qpointer.qdoc (renamed from src/corelib/kernel/qpointer.cpp)89
-rw-r--r--src/corelib/kernel/qpoll.cpp49
-rw-r--r--src/corelib/kernel/qpoll_p.h42
-rw-r--r--src/corelib/kernel/qproperty.cpp803
-rw-r--r--src/corelib/kernel/qproperty.h197
-rw-r--r--src/corelib/kernel/qproperty_p.h286
-rw-r--r--src/corelib/kernel/qpropertyprivate.h94
-rw-r--r--src/corelib/kernel/qsequentialiterable.cpp40
-rw-r--r--src/corelib/kernel/qsequentialiterable.h40
-rw-r--r--src/corelib/kernel/qsharedmemory.cpp681
-rw-r--r--src/corelib/kernel/qsharedmemory.h137
-rw-r--r--src/corelib/kernel/qsharedmemory_android.cpp110
-rw-r--r--src/corelib/kernel/qsharedmemory_p.h186
-rw-r--r--src/corelib/kernel/qsharedmemory_posix.cpp234
-rw-r--r--src/corelib/kernel/qsharedmemory_systemv.cpp260
-rw-r--r--src/corelib/kernel/qsharedmemory_unix.cpp116
-rw-r--r--src/corelib/kernel/qsharedmemory_win.cpp191
-rw-r--r--src/corelib/kernel/qsignalmapper.cpp51
-rw-r--r--src/corelib/kernel/qsignalmapper.h41
-rw-r--r--src/corelib/kernel/qsingleshottimer_p.h141
-rw-r--r--src/corelib/kernel/qsocketnotifier.cpp44
-rw-r--r--src/corelib/kernel/qsocketnotifier.h45
-rw-r--r--src/corelib/kernel/qsystemerror.cpp60
-rw-r--r--src/corelib/kernel/qsystemerror_p.h49
-rw-r--r--src/corelib/kernel/qsystemsemaphore.h97
-rw-r--r--src/corelib/kernel/qsystemsemaphore_android.cpp83
-rw-r--r--src/corelib/kernel/qsystemsemaphore_p.h120
-rw-r--r--src/corelib/kernel/qsystemsemaphore_posix.cpp186
-rw-r--r--src/corelib/kernel/qsystemsemaphore_systemv.cpp224
-rw-r--r--src/corelib/kernel/qsystemsemaphore_unix.cpp109
-rw-r--r--src/corelib/kernel/qsystemsemaphore_win.cpp136
-rw-r--r--src/corelib/kernel/qt_attribution.json4
-rw-r--r--src/corelib/kernel/qtestsupport_core.cpp165
-rw-r--r--src/corelib/kernel/qtestsupport_core.h74
-rw-r--r--src/corelib/kernel/qtimer.cpp449
-rw-r--r--src/corelib/kernel/qtimer.h206
-rw-r--r--src/corelib/kernel/qtimer_p.h73
-rw-r--r--src/corelib/kernel/qtimerinfo_unix.cpp713
-rw-r--r--src/corelib/kernel/qtimerinfo_unix_p.h129
-rw-r--r--src/corelib/kernel/qtmetamacros.h67
-rw-r--r--src/corelib/kernel/qtmochelpers.h86
-rw-r--r--src/corelib/kernel/qtranslator.cpp76
-rw-r--r--src/corelib/kernel/qtranslator.h40
-rw-r--r--src/corelib/kernel/qtranslator_p.h40
-rw-r--r--src/corelib/kernel/qvariant.cpp1156
-rw-r--r--src/corelib/kernel/qvariant.h610
-rw-r--r--src/corelib/kernel/qvariant_p.h133
-rw-r--r--src/corelib/kernel/qvarianthash.h20
-rw-r--r--src/corelib/kernel/qvariantlist.h19
-rw-r--r--src/corelib/kernel/qvariantmap.h20
-rw-r--r--src/corelib/kernel/qwineventnotifier.cpp42
-rw-r--r--src/corelib/kernel/qwineventnotifier.h42
-rw-r--r--src/corelib/kernel/qwineventnotifier_p.h40
-rw-r--r--src/corelib/kernel/qwinregistry.cpp172
-rw-r--r--src/corelib/kernel/qwinregistry_p.h68
-rw-r--r--src/corelib/mimetypes/mime/generate.bat73
-rw-r--r--src/corelib/mimetypes/mime/generate.pl118
-rw-r--r--src/corelib/mimetypes/mime/hexdump.ps129
-rw-r--r--src/corelib/mimetypes/mime/packages/freedesktop.org.xml72477
-rw-r--r--src/corelib/mimetypes/mimetypes.qrc5
-rw-r--r--src/corelib/mimetypes/mimetypes_resources.cmake3
-rw-r--r--src/corelib/mimetypes/qmimedatabase.cpp383
-rw-r--r--src/corelib/mimetypes/qmimedatabase.h42
-rw-r--r--src/corelib/mimetypes/qmimedatabase_p.h63
-rw-r--r--src/corelib/mimetypes/qmimeglobpattern.cpp143
-rw-r--r--src/corelib/mimetypes/qmimeglobpattern_p.h75
-rw-r--r--src/corelib/mimetypes/qmimemagicrule.cpp113
-rw-r--r--src/corelib/mimetypes/qmimemagicrule_p.h44
-rw-r--r--src/corelib/mimetypes/qmimemagicrulematcher.cpp40
-rw-r--r--src/corelib/mimetypes/qmimemagicrulematcher_p.h40
-rw-r--r--src/corelib/mimetypes/qmimeprovider.cpp432
-rw-r--r--src/corelib/mimetypes/qmimeprovider_p.h124
-rw-r--r--src/corelib/mimetypes/qmimetype.cpp190
-rw-r--r--src/corelib/mimetypes/qmimetype.h52
-rw-r--r--src/corelib/mimetypes/qmimetype_p.h78
-rw-r--r--src/corelib/mimetypes/qmimetypeparser.cpp147
-rw-r--r--src/corelib/mimetypes/qmimetypeparser_p.h61
-rw-r--r--src/corelib/platform/android/qandroidextras.cpp303
-rw-r--r--src/corelib/platform/android/qandroidextras_p.h62
-rw-r--r--src/corelib/platform/android/qandroidnativeinterface.cpp106
-rw-r--r--src/corelib/platform/darwin/qdarwinpermissionplugin.mm90
-rw-r--r--src/corelib/platform/darwin/qdarwinpermissionplugin_bluetooth.mm86
-rw-r--r--src/corelib/platform/darwin/qdarwinpermissionplugin_calendar.mm71
-rw-r--r--src/corelib/platform/darwin/qdarwinpermissionplugin_camera.mm42
-rw-r--r--src/corelib/platform/darwin/qdarwinpermissionplugin_contacts.mm58
-rw-r--r--src/corelib/platform/darwin/qdarwinpermissionplugin_location.mm263
-rw-r--r--src/corelib/platform/darwin/qdarwinpermissionplugin_microphone.mm42
-rw-r--r--src/corelib/platform/darwin/qdarwinpermissionplugin_p.h58
-rw-r--r--src/corelib/platform/darwin/qdarwinpermissionplugin_p_p.h104
-rw-r--r--src/corelib/platform/ios/PrivacyInfo.xcprivacy31
-rw-r--r--src/corelib/platform/wasm/qstdweb.cpp803
-rw-r--r--src/corelib/platform/wasm/qstdweb_p.h268
-rw-r--r--src/corelib/platform/windows/qcomobject_p.h127
-rw-r--r--src/corelib/platform/windows/qfactorycacheregistration.cpp53
-rw-r--r--src/corelib/platform/windows/qfactorycacheregistration_p.h52
-rw-r--r--src/corelib/platform/windows/qt_winrtbase_p.h34
-rw-r--r--src/corelib/plugin/qcoffpeparser.cpp72
-rw-r--r--src/corelib/plugin/qcoffpeparser_p.h40
-rw-r--r--src/corelib/plugin/qelfparser_p.cpp82
-rw-r--r--src/corelib/plugin/qelfparser_p.h40
-rw-r--r--src/corelib/plugin/qfactoryinterface.cpp40
-rw-r--r--src/corelib/plugin/qfactoryinterface.h42
-rw-r--r--src/corelib/plugin/qfactoryloader.cpp570
-rw-r--r--src/corelib/plugin/qfactoryloader_p.h50
-rw-r--r--src/corelib/plugin/qlibrary.cpp264
-rw-r--r--src/corelib/plugin/qlibrary.h42
-rw-r--r--src/corelib/plugin/qlibrary_p.h53
-rw-r--r--src/corelib/plugin/qlibrary_unix.cpp145
-rw-r--r--src/corelib/plugin/qlibrary_win.cpp50
-rw-r--r--src/corelib/plugin/qmachparser.cpp70
-rw-r--r--src/corelib/plugin/qmachparser_p.h40
-rw-r--r--src/corelib/plugin/qplugin.h54
-rw-r--r--src/corelib/plugin/qplugin.qdoc46
-rw-r--r--src/corelib/plugin/qplugin_p.h40
-rw-r--r--src/corelib/plugin/qpluginloader.cpp101
-rw-r--r--src/corelib/plugin/qpluginloader.h40
-rw-r--r--src/corelib/plugin/qsystemlibrary.cpp86
-rw-r--r--src/corelib/plugin/qsystemlibrary_p.h57
-rw-r--r--src/corelib/plugin/quuid.cpp243
-rw-r--r--src/corelib/plugin/quuid.h179
-rw-r--r--src/corelib/qt_cmdline.cmake7
-rw-r--r--src/corelib/qtcore.tracepoints41
-rwxr-xr-xsrc/corelib/serialization/make-xml-parser.sh40
-rw-r--r--src/corelib/serialization/qcborarray.cpp219
-rw-r--r--src/corelib/serialization/qcborarray.h209
-rw-r--r--src/corelib/serialization/qcborcommon.cpp53
-rw-r--r--src/corelib/serialization/qcborcommon.h42
-rw-r--r--src/corelib/serialization/qcborcommon_p.h43
-rw-r--r--src/corelib/serialization/qcbordiagnostic.cpp86
-rw-r--r--src/corelib/serialization/qcbormap.cpp441
-rw-r--r--src/corelib/serialization/qcbormap.h306
-rw-r--r--src/corelib/serialization/qcborstream.h42
-rw-r--r--src/corelib/serialization/qcborstreamreader.cpp330
-rw-r--r--src/corelib/serialization/qcborstreamreader.h75
-rw-r--r--src/corelib/serialization/qcborstreamwriter.cpp85
-rw-r--r--src/corelib/serialization/qcborstreamwriter.h42
-rw-r--r--src/corelib/serialization/qcborvalue.cpp1045
-rw-r--r--src/corelib/serialization/qcborvalue.h341
-rw-r--r--src/corelib/serialization/qcborvalue_p.h152
-rw-r--r--src/corelib/serialization/qdatastream.cpp298
-rw-r--r--src/corelib/serialization/qdatastream.h249
-rw-r--r--src/corelib/serialization/qdatastream_p.h45
-rw-r--r--src/corelib/serialization/qjson_p.h73
-rw-r--r--src/corelib/serialization/qjsonarray.cpp227
-rw-r--r--src/corelib/serialization/qjsonarray.h212
-rw-r--r--src/corelib/serialization/qjsoncbor.cpp77
-rw-r--r--src/corelib/serialization/qjsondocument.cpp77
-rw-r--r--src/corelib/serialization/qjsondocument.h56
-rw-r--r--src/corelib/serialization/qjsonobject.cpp321
-rw-r--r--src/corelib/serialization/qjsonobject.h272
-rw-r--r--src/corelib/serialization/qjsonparser.cpp241
-rw-r--r--src/corelib/serialization/qjsonparser_p.h40
-rw-r--r--src/corelib/serialization/qjsonvalue.cpp357
-rw-r--r--src/corelib/serialization/qjsonvalue.h247
-rw-r--r--src/corelib/serialization/qjsonwriter.cpp63
-rw-r--r--src/corelib/serialization/qjsonwriter_p.h40
-rw-r--r--src/corelib/serialization/qtextstream.cpp152
-rw-r--r--src/corelib/serialization/qtextstream.h69
-rw-r--r--src/corelib/serialization/qtextstream_p.h66
-rw-r--r--src/corelib/serialization/qxmlstream.cpp1209
-rw-r--r--src/corelib/serialization/qxmlstream.g154
-rw-r--r--src/corelib/serialization/qxmlstream.h217
-rw-r--r--src/corelib/serialization/qxmlstream_p.h128
-rw-r--r--src/corelib/serialization/qxmlstreamgrammar.cpp40
-rw-r--r--src/corelib/serialization/qxmlstreamgrammar_p.h42
-rw-r--r--src/corelib/serialization/qxmlstreamparser_p.h106
-rw-r--r--src/corelib/serialization/qxmlutils.cpp77
-rw-r--r--src/corelib/serialization/qxmlutils_p.h42
-rw-r--r--src/corelib/text/UNICODE_LICENSE.txt46
-rw-r--r--src/corelib/text/qanystringview.cpp (renamed from src/corelib/text/qanystringview.qdoc)351
-rw-r--r--src/corelib/text/qanystringview.h294
-rw-r--r--src/corelib/text/qbytearray.cpp1595
-rw-r--r--src/corelib/text/qbytearray.h468
-rw-r--r--src/corelib/text/qbytearray_p.h65
-rw-r--r--src/corelib/text/qbytearrayalgorithms.h95
-rw-r--r--src/corelib/text/qbytearraylist.cpp56
-rw-r--r--src/corelib/text/qbytearraylist.h62
-rw-r--r--src/corelib/text/qbytearraymatcher.cpp84
-rw-r--r--src/corelib/text/qbytearraymatcher.h107
-rw-r--r--src/corelib/text/qbytearrayview.h224
-rw-r--r--src/corelib/text/qbytearrayview.qdoc139
-rw-r--r--src/corelib/text/qbytedata_p.h64
-rw-r--r--src/corelib/text/qchar.cpp278
-rw-r--r--src/corelib/text/qchar.h202
-rw-r--r--src/corelib/text/qcollator.cpp116
-rw-r--r--src/corelib/text/qcollator.h52
-rw-r--r--src/corelib/text/qcollator_icu.cpp55
-rw-r--r--src/corelib/text/qcollator_macx.cpp64
-rw-r--r--src/corelib/text/qcollator_p.h48
-rw-r--r--src/corelib/text/qcollator_posix.cpp70
-rw-r--r--src/corelib/text/qcollator_win.cpp48
-rw-r--r--src/corelib/text/qdoublescanprint_p.h42
-rw-r--r--src/corelib/text/qlatin1stringmatcher.cpp201
-rw-r--r--src/corelib/text/qlatin1stringmatcher.h172
-rw-r--r--src/corelib/text/qlatin1stringview.h375
-rw-r--r--src/corelib/text/qlatin1stringview.qdoc1295
-rw-r--r--src/corelib/text/qlocale.cpp2081
-rw-r--r--src/corelib/text/qlocale.h152
-rw-r--r--src/corelib/text/qlocale.qdoc472
-rw-r--r--src/corelib/text/qlocale_data_p.h10553
-rw-r--r--src/corelib/text/qlocale_icu.cpp40
-rw-r--r--src/corelib/text/qlocale_mac.mm348
-rw-r--r--src/corelib/text/qlocale_p.h370
-rw-r--r--src/corelib/text/qlocale_tools.cpp318
-rw-r--r--src/corelib/text/qlocale_tools_p.h57
-rw-r--r--src/corelib/text/qlocale_unix.cpp77
-rw-r--r--src/corelib/text/qlocale_wasm.cpp54
-rw-r--r--src/corelib/text/qlocale_win.cpp382
-rw-r--r--src/corelib/text/qregularexpression.cpp415
-rw-r--r--src/corelib/text/qregularexpression.h102
-rw-r--r--src/corelib/text/qstaticlatin1stringmatcher.h140
-rw-r--r--src/corelib/text/qstaticlatin1stringmatcher.qdoc86
-rw-r--r--src/corelib/text/qstring.cpp5936
-rw-r--r--src/corelib/text/qstring.h1411
-rw-r--r--src/corelib/text/qstring_mips_dsp_asm.S40
-rw-r--r--src/corelib/text/qstringalgorithms.h229
-rw-r--r--src/corelib/text/qstringalgorithms_p.h64
-rw-r--r--src/corelib/text/qstringbuilder.cpp91
-rw-r--r--src/corelib/text/qstringbuilder.h216
-rw-r--r--src/corelib/text/qstringconverter.cpp1216
-rw-r--r--src/corelib/text/qstringconverter.h324
-rw-r--r--src/corelib/text/qstringconverter_base.h176
-rw-r--r--src/corelib/text/qstringconverter_p.h149
-rw-r--r--src/corelib/text/qstringfwd.h56
-rw-r--r--src/corelib/text/qstringiterator.qdoc28
-rw-r--r--src/corelib/text/qstringiterator_p.h73
-rw-r--r--src/corelib/text/qstringlist.cpp313
-rw-r--r--src/corelib/text/qstringlist.h99
-rw-r--r--src/corelib/text/qstringliteral.h42
-rw-r--r--src/corelib/text/qstringmatcher.cpp94
-rw-r--r--src/corelib/text/qstringmatcher.h45
-rw-r--r--src/corelib/text/qstringtokenizer.cpp44
-rw-r--r--src/corelib/text/qstringtokenizer.h47
-rw-r--r--src/corelib/text/qstringview.cpp317
-rw-r--r--src/corelib/text/qstringview.h245
-rw-r--r--src/corelib/text/qt_attribution.json34
-rw-r--r--src/corelib/text/qtextboundaryfinder.cpp54
-rw-r--r--src/corelib/text/qtextboundaryfinder.h42
-rw-r--r--src/corelib/text/qtliterals.qdoc63
-rw-r--r--src/corelib/text/qunicodetables.cpp20786
-rw-r--r--src/corelib/text/qunicodetables_p.h72
-rw-r--r--src/corelib/text/qunicodetools.cpp466
-rw-r--r--src/corelib/text/qunicodetools_p.h40
-rw-r--r--src/corelib/text/qutf8stringview.h234
-rw-r--r--src/corelib/text/qutf8stringview.qdoc91
-rw-r--r--src/corelib/text/qvsnprintf.cpp42
-rw-r--r--src/corelib/thread/qatomic.cpp170
-rw-r--r--src/corelib/thread/qatomic.h83
-rw-r--r--src/corelib/thread/qatomic_bootstrap.h97
-rw-r--r--src/corelib/thread/qatomic_cxx11.h63
-rw-r--r--src/corelib/thread/qbasicatomic.h68
-rw-r--r--src/corelib/thread/qexception.cpp46
-rw-r--r--src/corelib/thread/qexception.h44
-rw-r--r--src/corelib/thread/qfutex_freebsd_p.h82
-rw-r--r--src/corelib/thread/qfutex_linux_p.h95
-rw-r--r--src/corelib/thread/qfutex_mac_p.h140
-rw-r--r--src/corelib/thread/qfutex_p.h182
-rw-r--r--src/corelib/thread/qfutex_win_p.h58
-rw-r--r--src/corelib/thread/qfuture.h79
-rw-r--r--src/corelib/thread/qfuture.qdoc247
-rw-r--r--src/corelib/thread/qfuture_impl.h595
-rw-r--r--src/corelib/thread/qfutureinterface.cpp267
-rw-r--r--src/corelib/thread/qfutureinterface.h69
-rw-r--r--src/corelib/thread/qfutureinterface_p.h74
-rw-r--r--src/corelib/thread/qfuturesynchronizer.h59
-rw-r--r--src/corelib/thread/qfuturesynchronizer.qdoc34
-rw-r--r--src/corelib/thread/qfuturewatcher.cpp56
-rw-r--r--src/corelib/thread/qfuturewatcher.h40
-rw-r--r--src/corelib/thread/qfuturewatcher_p.h40
-rw-r--r--src/corelib/thread/qgenericatomic.h377
-rw-r--r--src/corelib/thread/qlocking_p.h48
-rw-r--r--src/corelib/thread/qmutex.cpp183
-rw-r--r--src/corelib/thread/qmutex.h225
-rw-r--r--src/corelib/thread/qmutex_mac.cpp51
-rw-r--r--src/corelib/thread/qmutex_p.h80
-rw-r--r--src/corelib/thread/qmutex_unix.cpp120
-rw-r--r--src/corelib/thread/qmutex_win.cpp66
-rw-r--r--src/corelib/thread/qorderedmutexlocker_p.h75
-rw-r--r--src/corelib/thread/qpromise.h80
-rw-r--r--src/corelib/thread/qpromise.qdoc88
-rw-r--r--src/corelib/thread/qreadwritelock.cpp265
-rw-r--r--src/corelib/thread/qreadwritelock.h110
-rw-r--r--src/corelib/thread/qreadwritelock_p.h103
-rw-r--r--src/corelib/thread/qresultstore.cpp40
-rw-r--r--src/corelib/thread/qresultstore.h69
-rw-r--r--src/corelib/thread/qrunnable.cpp88
-rw-r--r--src/corelib/thread/qrunnable.h149
-rw-r--r--src/corelib/thread/qsemaphore.cpp206
-rw-r--r--src/corelib/thread/qsemaphore.h66
-rw-r--r--src/corelib/thread/qthread.cpp330
-rw-r--r--src/corelib/thread/qthread.h72
-rw-r--r--src/corelib/thread/qthread_p.h202
-rw-r--r--src/corelib/thread/qthread_unix.cpp219
-rw-r--r--src/corelib/thread/qthread_win.cpp144
-rw-r--r--src/corelib/thread/qthreadpool.cpp170
-rw-r--r--src/corelib/thread/qthreadpool.h73
-rw-r--r--src/corelib/thread/qthreadpool_p.h43
-rw-r--r--src/corelib/thread/qthreadstorage.cpp48
-rw-r--r--src/corelib/thread/qthreadstorage.h40
-rw-r--r--src/corelib/thread/qtsan_impl.h79
-rw-r--r--src/corelib/thread/qwaitcondition.h40
-rw-r--r--src/corelib/thread/qwaitcondition.qdoc42
-rw-r--r--src/corelib/thread/qwaitcondition_p.h147
-rw-r--r--src/corelib/thread/qwaitcondition_unix.cpp188
-rw-r--r--src/corelib/thread/qwaitcondition_win.cpp106
-rw-r--r--src/corelib/thread/qyieldcpu.h64
-rw-r--r--src/corelib/thread/qyieldcpu.qdoc59
-rw-r--r--src/corelib/time/qcalendar.cpp224
-rw-r--r--src/corelib/time/qcalendar.h48
-rw-r--r--src/corelib/time/qcalendarbackend_p.h45
-rw-r--r--src/corelib/time/qcalendarmath_p.h152
-rw-r--r--src/corelib/time/qdatetime.cpp3729
-rw-r--r--src/corelib/time/qdatetime.h470
-rw-r--r--src/corelib/time/qdatetime_p.h119
-rw-r--r--src/corelib/time/qdatetimeparser.cpp675
-rw-r--r--src/corelib/time/qdatetimeparser_p.h61
-rw-r--r--src/corelib/time/qgregoriancalendar.cpp195
-rw-r--r--src/corelib/time/qgregoriancalendar_p.h51
-rw-r--r--src/corelib/time/qhijricalendar.cpp44
-rw-r--r--src/corelib/time/qhijricalendar_data_p.h2223
-rw-r--r--src/corelib/time/qhijricalendar_p.h40
-rw-r--r--src/corelib/time/qislamiccivilcalendar.cpp72
-rw-r--r--src/corelib/time/qislamiccivilcalendar_p.h40
-rw-r--r--src/corelib/time/qjalalicalendar.cpp61
-rw-r--r--src/corelib/time/qjalalicalendar_data_p.h1195
-rw-r--r--src/corelib/time/qjalalicalendar_p.h40
-rw-r--r--src/corelib/time/qjuliancalendar.cpp73
-rw-r--r--src/corelib/time/qjuliancalendar_p.h40
-rw-r--r--src/corelib/time/qlocaltime.cpp720
-rw-r--r--src/corelib/time/qlocaltime_p.h46
-rw-r--r--src/corelib/time/qmilankoviccalendar.cpp93
-rw-r--r--src/corelib/time/qmilankoviccalendar_p.h40
-rw-r--r--src/corelib/time/qromancalendar.cpp53
-rw-r--r--src/corelib/time/qromancalendar_data_p.h7756
-rw-r--r--src/corelib/time/qromancalendar_p.h46
-rw-r--r--src/corelib/time/qtimezone.cpp1111
-rw-r--r--src/corelib/time/qtimezone.h244
-rw-r--r--src/corelib/time/qtimezonelocale.cpp29
-rw-r--r--src/corelib/time/qtimezonelocale_data_p.h39
-rw-r--r--src/corelib/time/qtimezonelocale_p.h31
-rw-r--r--src/corelib/time/qtimezoneprivate.cpp679
-rw-r--r--src/corelib/time/qtimezoneprivate_android.cpp131
-rw-r--r--src/corelib/time/qtimezoneprivate_data_p.h2326
-rw-r--r--src/corelib/time/qtimezoneprivate_icu.cpp160
-rw-r--r--src/corelib/time/qtimezoneprivate_mac.mm71
-rw-r--r--src/corelib/time/qtimezoneprivate_p.h129
-rw-r--r--src/corelib/time/qtimezoneprivate_tz.cpp432
-rw-r--r--src/corelib/time/qtimezoneprivate_win.cpp422
-rw-r--r--src/corelib/tools/qalgorithms.h69
-rw-r--r--src/corelib/tools/qalgorithms.qdoc41
-rw-r--r--src/corelib/tools/qarraydata.cpp170
-rw-r--r--src/corelib/tools/qarraydata.h114
-rw-r--r--src/corelib/tools/qarraydataops.h129
-rw-r--r--src/corelib/tools/qarraydatapointer.h211
-rw-r--r--src/corelib/tools/qatomicscopedvaluerollback.h127
-rw-r--r--src/corelib/tools/qatomicscopedvaluerollback.qdoc123
-rw-r--r--src/corelib/tools/qbitarray.cpp402
-rw-r--r--src/corelib/tools/qbitarray.h181
-rw-r--r--src/corelib/tools/qcache.h79
-rw-r--r--src/corelib/tools/qcache.qdoc28
-rw-r--r--src/corelib/tools/qcommandlineoption.cpp56
-rw-r--r--src/corelib/tools/qcommandlineoption.h44
-rw-r--r--src/corelib/tools/qcommandlineparser.cpp195
-rw-r--r--src/corelib/tools/qcommandlineparser.h40
-rw-r--r--src/corelib/tools/qcontainerfwd.h69
-rw-r--r--src/corelib/tools/qcontainertools_impl.h264
-rw-r--r--src/corelib/tools/qcontiguouscache.cpp42
-rw-r--r--src/corelib/tools/qcontiguouscache.h54
-rw-r--r--src/corelib/tools/qcryptographichash.cpp1202
-rw-r--r--src/corelib/tools/qcryptographichash.h55
-rw-r--r--src/corelib/tools/qduplicatetracker_p.h48
-rw-r--r--src/corelib/tools/qeasingcurve.cpp64
-rw-r--r--src/corelib/tools/qeasingcurve.h42
-rw-r--r--src/corelib/tools/qflatmap_p.h484
-rw-r--r--src/corelib/tools/qfreelist.cpp52
-rw-r--r--src/corelib/tools/qfreelist_p.h43
-rw-r--r--src/corelib/tools/qfunctionaltools_impl.cpp47
-rw-r--r--src/corelib/tools/qfunctionaltools_impl.h77
-rw-r--r--src/corelib/tools/qhash.cpp1057
-rw-r--r--src/corelib/tools/qhash.h949
-rw-r--r--src/corelib/tools/qhashfunctions.h179
-rw-r--r--src/corelib/tools/qiterator.h125
-rw-r--r--src/corelib/tools/qiterator.qdoc92
-rw-r--r--src/corelib/tools/qline.cpp53
-rw-r--r--src/corelib/tools/qline.h49
-rw-r--r--src/corelib/tools/qlist.h171
-rw-r--r--src/corelib/tools/qlist.qdoc184
-rw-r--r--src/corelib/tools/qmakearray_p.h42
-rw-r--r--src/corelib/tools/qmap.h97
-rw-r--r--src/corelib/tools/qmap.qdoc198
-rw-r--r--src/corelib/tools/qmargins.cpp57
-rw-r--r--src/corelib/tools/qmargins.h71
-rw-r--r--src/corelib/tools/qmessageauthenticationcode.cpp283
-rw-r--r--src/corelib/tools/qmessageauthenticationcode.h67
-rw-r--r--src/corelib/tools/qminimalflatset_p.h156
-rw-r--r--src/corelib/tools/qmultimap.qdoc149
-rw-r--r--src/corelib/tools/qoffsetstringarray_p.h86
-rw-r--r--src/corelib/tools/qpair.h47
-rw-r--r--src/corelib/tools/qpair.qdoc28
-rw-r--r--src/corelib/tools/qpoint.cpp53
-rw-r--r--src/corelib/tools/qpoint.h62
-rw-r--r--src/corelib/tools/qqueue.cpp40
-rw-r--r--src/corelib/tools/qqueue.h40
-rw-r--r--src/corelib/tools/qrect.cpp59
-rw-r--r--src/corelib/tools/qrect.h55
-rw-r--r--src/corelib/tools/qrefcount.cpp40
-rw-r--r--src/corelib/tools/qrefcount.h40
-rw-r--r--src/corelib/tools/qringbuffer.cpp93
-rw-r--r--src/corelib/tools/qringbuffer_p.h86
-rw-r--r--src/corelib/tools/qscopedpointer.cpp52
-rw-r--r--src/corelib/tools/qscopedpointer.h57
-rw-r--r--src/corelib/tools/qscopedvaluerollback.cpp40
-rw-r--r--src/corelib/tools/qscopedvaluerollback.h49
-rw-r--r--src/corelib/tools/qscopeguard.h49
-rw-r--r--src/corelib/tools/qscopeguard.qdoc30
-rw-r--r--src/corelib/tools/qset.h77
-rw-r--r--src/corelib/tools/qset.qdoc62
-rw-r--r--src/corelib/tools/qshareddata.cpp40
-rw-r--r--src/corelib/tools/qshareddata.h67
-rw-r--r--src/corelib/tools/qshareddata_impl.h46
-rw-r--r--src/corelib/tools/qsharedpointer.cpp188
-rw-r--r--src/corelib/tools/qsharedpointer.h74
-rw-r--r--src/corelib/tools/qsharedpointer_impl.h158
-rw-r--r--src/corelib/tools/qsize.cpp53
-rw-r--r--src/corelib/tools/qsize.h62
-rw-r--r--src/corelib/tools/qspan.h452
-rw-r--r--src/corelib/tools/qspan.qdoc651
-rw-r--r--src/corelib/tools/qspan_p.h24
-rw-r--r--src/corelib/tools/qstack.cpp40
-rw-r--r--src/corelib/tools/qstack.h40
-rw-r--r--src/corelib/tools/qtaggedpointer.h81
-rw-r--r--src/corelib/tools/qtaggedpointer.qdoc30
-rw-r--r--src/corelib/tools/qtimeline.cpp84
-rw-r--r--src/corelib/tools/qtimeline.h40
-rw-r--r--src/corelib/tools/qtools_p.h118
-rw-r--r--src/corelib/tools/qtyperevision.cpp217
-rw-r--r--src/corelib/tools/qtyperevision.h167
-rw-r--r--src/corelib/tools/quniquehandle_p.h225
-rw-r--r--src/corelib/tools/qvarlengtharray.h820
-rw-r--r--src/corelib/tools/qvarlengtharray.qdoc122
-rw-r--r--src/corelib/tools/qvector.h46
-rw-r--r--src/corelib/tools/qversionnumber.cpp449
-rw-r--r--src/corelib/tools/qversionnumber.h383
-rw-r--r--src/corelib/tracing/qctf.cpp144
-rw-r--r--src/corelib/tracing/qctf_p.h238
1130 files changed, 160959 insertions, 136610 deletions
diff --git a/src/corelib/CMakeLists.txt b/src/corelib/CMakeLists.txt
index 8bb040ca96..e1fb0d7e39 100644
--- a/src/corelib/CMakeLists.txt
+++ b/src/corelib/CMakeLists.txt
@@ -1,20 +1,8 @@
-# Generated from corelib.pro.
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
-# special case begin
-qt_find_package(Threads PROVIDED_TARGETS Threads::Threads)
qt_find_package(WrapPCRE2 PROVIDED_TARGETS WrapPCRE2::WrapPCRE2)
-
-
-# compute the reverse relative path from QtCoreConfigExtras to the install prefix
-# this is used in QtCoreConfigExtras to make its install paths relocatable
-if(QT_WILL_INSTALL)
- get_filename_component(_clean_prefix
- "${QT_BUILD_INTERNALS_RELOCATABLE_INSTALL_PREFIX}/${QT_CONFIG_INSTALL_DIR}" ABSOLUTE)
-else()
- get_filename_component(_clean_prefix "${QT_CONFIG_BUILD_DIR}" ABSOLUTE)
-endif()
-file(RELATIVE_PATH QT_INVERSE_CONFIG_INSTALL_DIR
- "${_clean_prefix}" "${QT_BUILD_INTERNALS_RELOCATABLE_INSTALL_PREFIX}")
+qt_find_package(WrapZLIB PROVIDED_TARGETS WrapZLIB::WrapZLIB)
if(ANDROID)
set(corelib_extra_cmake_files
@@ -24,7 +12,6 @@ if(WASM)
set(corelib_extra_cmake_files
"${CMAKE_CURRENT_SOURCE_DIR}/${QT_CMAKE_EXPORT_NAMESPACE}WasmMacros.cmake")
endif()
-# special case end
#####################################################################
## Core Module:
@@ -35,42 +22,88 @@ qt_internal_add_module(Core
NO_GENERATE_METATYPES # metatypes are extracted manually below
EXCEPTIONS
SOURCES
+ # Keep these .cpp files in the first and in the order they are so their
+ # static initialization order is retained
+ global/qsimd.cpp global/qsimd.h global/qsimd_p.h
+ tools/qhash.cpp tools/qhash.h
+
+ # Keep the rest alphabetical
compat/removed_api.cpp
global/archdetect.cpp
+ global/qassert.cpp global/qassert.h
global/qcompare_impl.h
- global/qcompare.h
+ global/qcompare.cpp global/qcompare.h
+ global/qcomparehelpers.h
global/qcompilerdetection.h
+ global/qconstructormacros.h
global/qcontainerinfo.h
+ global/qdarwinhelpers.h
global/qendian.cpp global/qendian.h global/qendian_p.h
+ global/qexceptionhandling.cpp global/qexceptionhandling.h
global/qflags.h
global/qfloat16.cpp global/qfloat16.h
- global/qglobal.cpp global/qglobal.h
+ global/qforeach.h
+ global/qfunctionpointer.h
+ global/qglobal.cpp global/qglobal.h global/qglobal_p.h
global/qglobalstatic.h
global/qhooks.cpp global/qhooks_p.h
global/qlibraryinfo.cpp global/qlibraryinfo.h global/qlibraryinfo_p.h
- global/qlogging.cpp global/qlogging.h
- global/qmalloc.cpp
+ global/qlogging.cpp global/qlogging.h global/qlogging_p.h
+ global/qmalloc.cpp global/qmalloc.h
+ global/qminmax.h
global/qnamespace.h # this header is specified on purpose so AUTOMOC processes it
- global/qnativeinterface.h
+ global/qnativeinterface.h global/qnativeinterface_p.h
global/qnumeric.cpp global/qnumeric.h global/qnumeric_p.h
global/qoperatingsystemversion.cpp global/qoperatingsystemversion.h global/qoperatingsystemversion_p.h
+ global/qoverload.h
global/qprocessordetection.h
global/qrandom.cpp global/qrandom.h global/qrandom_p.h
- global/qsimd.cpp global/qsimd.h global/qsimd_p.h
- global/qsysinfo.h
+ global/qswap.h
+ global/qsysinfo.cpp global/qsysinfo.h
global/qsystemdetection.h
+ global/qtclasshelpermacros.h
+ global/qtconfiginclude.h
+ global/qtconfigmacros.h
+ global/qtdeprecationmarkers.h
+ global/qtenvironmentvariables.cpp global/qtenvironmentvariables.h
+ global/qtenvironmentvariables_p.h
+ global/qtnoop.h
+ global/qtpreprocessorsupport.h
+ global/qtrace_p.h
+ global/qtresource.h
+ global/qtsymbolmacros.h
+ global/qttranslation.h
+ global/qttypetraits.h
+ global/qtversionchecks.h
+ global/qtversion.h
global/qtypeinfo.h
+ global/qtypes.cpp global/qtypes.h
global/qvolatile_p.h
global/q20algorithm.h
+ global/q20chrono.h
global/q20functional.h
global/q20iterator.h
+ global/q20map.h
+ global/q20memory.h
+ global/q20type_traits.h
+ global/q20vector.h
+ global/q23functional.h
+ global/q23utility.cpp # remove once we have a user that tests this
+ global/q23utility.h
+ global/qxpfunctional.h
+ global/qxptype_traits.h
+ global/qversiontagging.h
+ ipc/qsharedmemory.cpp ipc/qsharedmemory.h ipc/qsharedmemory_p.h
+ ipc/qsystemsemaphore.cpp ipc/qsystemsemaphore.h ipc/qsystemsemaphore_p.h
+ ipc/qtipccommon.cpp ipc/qtipccommon.h ipc/qtipccommon_p.h
io/qabstractfileengine.cpp io/qabstractfileengine_p.h
io/qbuffer.cpp io/qbuffer.h
io/qdataurl.cpp io/qdataurl_p.h
io/qdebug.cpp io/qdebug.h io/qdebug_p.h
io/qdir.cpp io/qdir.h io/qdir_p.h
+ io/qdirlisting.cpp io/qdirlisting.h io/qdirentryinfo_p.h
io/qdiriterator.cpp io/qdiriterator.h
- io/qfile.cpp io/qfile.h
+ io/qfile.cpp io/qfile.h io/qfile_p.h
io/qfiledevice.cpp io/qfiledevice.h io/qfiledevice_p.h
io/qfileinfo.cpp io/qfileinfo.h io/qfileinfo_p.h
io/qfileselector.cpp io/qfileselector.h io/qfileselector_p.h
@@ -87,9 +120,9 @@ qt_internal_add_module(Core
io/qloggingcategory.cpp io/qloggingcategory.h
io/qloggingregistry.cpp io/qloggingregistry_p.h
io/qnoncontiguousbytedevice.cpp io/qnoncontiguousbytedevice_p.h
- io/qresource.cpp io/qresource_p.h
+ io/qresource.cpp io/qresource.h io/qresource_p.h
io/qresource_iterator.cpp io/qresource_iterator_p.h
- io/qsavefile.cpp io/qsavefile.h
+ io/qsavefile.cpp io/qsavefile.h io/qsavefile_p.h
io/qstandardpaths.cpp io/qstandardpaths.h
io/qstorageinfo.cpp io/qstorageinfo.h io/qstorageinfo_p.h
io/qtemporarydir.cpp io/qtemporarydir.h
@@ -98,20 +131,21 @@ qt_internal_add_module(Core
io/qurlidna.cpp
io/qurlquery.cpp io/qurlquery.h
io/qurlrecode.cpp
+ io/qzipreader_p.h io/qzipwriter_p.h io/qzip.cpp
kernel/qabstracteventdispatcher.cpp kernel/qabstracteventdispatcher.h kernel/qabstracteventdispatcher_p.h
kernel/qabstractnativeeventfilter.cpp kernel/qabstractnativeeventfilter.h
kernel/qapplicationstatic.h
kernel/qassociativeiterable.cpp kernel/qassociativeiterable.h
kernel/qbasictimer.cpp kernel/qbasictimer.h
kernel/qbindingstorage.h
+ kernel/qchronotimer.cpp kernel/qchronotimer.h
kernel/qcoreapplication.cpp kernel/qcoreapplication.h kernel/qcoreapplication_p.h
kernel/qcoreapplication_platform.h
kernel/qcorecmdlineargs_p.h
- kernel/qcoreevent.cpp kernel/qcoreevent.h
- kernel/qcoreglobaldata.cpp kernel/qcoreglobaldata_p.h
- kernel/qdeadlinetimer.cpp kernel/qdeadlinetimer.h kernel/qdeadlinetimer_p.h
+ kernel/qcoreevent.cpp kernel/qcoreevent.h kernel/qcoreevent_p.h
+ kernel/qdeadlinetimer.cpp kernel/qdeadlinetimer.h
kernel/qelapsedtimer.cpp kernel/qelapsedtimer.h
- kernel/qeventloop.cpp kernel/qeventloop.h
+ kernel/qeventloop.cpp kernel/qeventloop.h kernel/qeventloop_p.h
kernel/qfunctions_p.h
kernel/qiterable.cpp kernel/qiterable.h kernel/qiterable_p.h
kernel/qmath.cpp kernel/qmath.h
@@ -121,24 +155,25 @@ qt_internal_add_module(Core
kernel/qmetaobjectbuilder.cpp kernel/qmetaobjectbuilder_p.h
kernel/qmetatype.cpp kernel/qmetatype.h kernel/qmetatype_p.h
kernel/qmimedata.cpp kernel/qmimedata.h
- kernel/qobject.cpp kernel/qobject.h kernel/qobject_p.h
+ kernel/qtmetamacros.h kernel/qtmochelpers.h
+ kernel/qobject.cpp kernel/qobject.h kernel/qobject_p.h kernel/qobject_p_p.h
kernel/qobject_impl.h
kernel/qobjectcleanuphandler.cpp kernel/qobjectcleanuphandler.h
kernel/qobjectdefs.h
kernel/qobjectdefs_impl.h
- kernel/qpointer.cpp kernel/qpointer.h
+ kernel/qpointer.h
kernel/qproperty.cpp kernel/qproperty.h kernel/qproperty_p.h
kernel/qpropertyprivate.h
kernel/qsequentialiterable.cpp kernel/qsequentialiterable.h
- kernel/qsharedmemory.cpp kernel/qsharedmemory.h kernel/qsharedmemory_p.h
kernel/qsignalmapper.cpp kernel/qsignalmapper.h
kernel/qsocketnotifier.cpp kernel/qsocketnotifier.h
kernel/qsystemerror.cpp kernel/qsystemerror_p.h
- kernel/qsystemsemaphore.cpp kernel/qsystemsemaphore.h kernel/qsystemsemaphore_p.h
kernel/qtestsupport_core.cpp kernel/qtestsupport_core.h
- kernel/qtimer.cpp kernel/qtimer.h
+ kernel/qsingleshottimer_p.h
+ kernel/qtimer.cpp kernel/qtimer.h kernel/qtimer_p.h
kernel/qtranslator.cpp kernel/qtranslator.h kernel/qtranslator_p.h
kernel/qvariant.cpp kernel/qvariant.h kernel/qvariant_p.h
+ kernel/qvariantmap.h kernel/qvarianthash.h kernel/qvariantlist.h
plugin/qfactoryinterface.cpp plugin/qfactoryinterface.h
plugin/qfactoryloader.cpp plugin/qfactoryloader_p.h
plugin/qplugin.h plugin/qplugin_p.h
@@ -160,12 +195,9 @@ qt_internal_add_module(Core
serialization/qjsonvalue.cpp serialization/qjsonvalue.h
serialization/qjsonwriter.cpp serialization/qjsonwriter_p.h
serialization/qtextstream.cpp serialization/qtextstream.h serialization/qtextstream_p.h
- serialization/qxmlstream.cpp serialization/qxmlstream.h serialization/qxmlstream_p.h
- serialization/qxmlstreamgrammar.cpp serialization/qxmlstreamgrammar_p.h
- serialization/qxmlstreamparser_p.h
serialization/qxmlutils.cpp serialization/qxmlutils_p.h
- text/qanystringview.h
- text/qbytearray.cpp text/qbytearray.h text/qbytearray_p.h
+ text/qanystringview.cpp text/qanystringview.h
+ text/qbytearray.cpp text/qbytearray.h
text/qbytearrayalgorithms.h
text/qbytearraylist.cpp text/qbytearraylist.h
text/qbytearraymatcher.cpp text/qbytearraymatcher.h
@@ -174,13 +206,18 @@ qt_internal_add_module(Core
text/qchar.h
text/qcollator.cpp text/qcollator.h text/qcollator_p.h
text/qdoublescanprint_p.h
+ text/qlatin1stringmatcher.cpp text/qlatin1stringmatcher.h
+ text/qlatin1stringview.h
text/qlocale.cpp text/qlocale.h text/qlocale_p.h
text/qlocale_data_p.h
text/qlocale_tools.cpp text/qlocale_tools_p.h
+ text/qstaticlatin1stringmatcher.h
text/qstring.cpp text/qstring.h
text/qstringalgorithms.h text/qstringalgorithms_p.h
text/qstringbuilder.cpp text/qstringbuilder.h
+ text/qstringconverter_base.h
text/qstringconverter.cpp text/qstringconverter.h text/qstringconverter_p.h
+ text/qstringfwd.h
text/qstringiterator_p.h
text/qstringlist.cpp text/qstringlist.h
text/qstringliteral.h
@@ -192,25 +229,36 @@ qt_internal_add_module(Core
text/qunicodetools.cpp text/qunicodetools_p.h
text/qutf8stringview.h
text/qvsnprintf.cpp
+ thread/qatomic.h
+ thread/qatomic_cxx11.h
+ thread/qbasicatomic.h
+ thread/qgenericatomic.h
+ thread/qlocking_p.h
thread/qmutex.h
+ thread/qorderedmutexlocker_p.h
thread/qreadwritelock.h
thread/qrunnable.cpp thread/qrunnable.h
- thread/qthread.cpp thread/qthread.h
+ thread/qthread.cpp thread/qthread.h thread/qthread_p.h
thread/qthreadstorage.h
+ thread/qtsan_impl.h
thread/qwaitcondition.h thread/qwaitcondition_p.h
+ thread/qyieldcpu.h
time/qcalendar.cpp time/qcalendar.h
time/qcalendarbackend_p.h
time/qcalendarmath_p.h
time/qdatetime.cpp time/qdatetime.h time/qdatetime_p.h
time/qgregoriancalendar.cpp time/qgregoriancalendar_p.h
time/qjuliancalendar.cpp time/qjuliancalendar_p.h
+ time/qlocaltime.cpp time/qlocaltime_p.h
time/qmilankoviccalendar.cpp time/qmilankoviccalendar_p.h
time/qromancalendar.cpp time/qromancalendar_p.h
time/qromancalendar_data_p.h
+ time/qtimezone.cpp time/qtimezone.h
tools/qalgorithms.h
tools/qarraydata.cpp tools/qarraydata.h
tools/qarraydataops.h
tools/qarraydatapointer.h
+ tools/qatomicscopedvaluerollback.h
tools/qbitarray.cpp tools/qbitarray.h
tools/qcache.h
tools/qcontainerfwd.h
@@ -220,7 +268,7 @@ qt_internal_add_module(Core
tools/qduplicatetracker_p.h
tools/qflatmap_p.h
tools/qfreelist.cpp tools/qfreelist_p.h
- tools/qhash.cpp tools/qhash.h
+ tools/qfunctionaltools_impl.cpp tools/qfunctionaltools_impl.h
tools/qhashfunctions.h
tools/qiterator.h
tools/qline.cpp tools/qline.h
@@ -228,7 +276,8 @@ qt_internal_add_module(Core
tools/qmakearray_p.h
tools/qmap.h
tools/qmargins.cpp tools/qmargins.h
- tools/qmessageauthenticationcode.cpp tools/qmessageauthenticationcode.h
+ tools/qmessageauthenticationcode.h
+ tools/qminimalflatset_p.h
tools/qoffsetstringarray_p.h
tools/qpair.h
tools/qpoint.cpp tools/qpoint.h
@@ -245,51 +294,69 @@ qt_internal_add_module(Core
tools/qsharedpointer.cpp tools/qsharedpointer.h
tools/qsharedpointer_impl.h
tools/qsize.cpp tools/qsize.h
+ tools/qspan.h
+ tools/qspan_p.h
tools/qstack.h
tools/qtaggedpointer.h
tools/qtools_p.h
+ tools/qtyperevision.cpp tools/qtyperevision.h
+ tools/quniquehandle_p.h
tools/qvarlengtharray.h
tools/qvector.h
tools/qversionnumber.cpp tools/qversionnumber.h
+ NO_UNITY_BUILD_SOURCES
+ # MinGW complains about `free-nonheap-object` in ~QSharedDataPointer()
+ # despite the fact that appropriate checks are in place to avoid that!
+ tools/qshareddata.cpp tools/qshareddata.h
+ text/qlocale.cpp text/qlocale.h
+ global/qglobal.cpp # undef qFatal
+ global/qlogging.cpp # undef qFatal/qInfo/qDebug
+ global/qrandom.cpp # undef Q_ASSERT/_X
+ text/qstringconverter.cpp # enum Data
+ tools/qcryptographichash.cpp # KeccakNISTInterface/Final
+ io/qdebug.cpp # undef qDebug
+ NO_PCH_SOURCES
+ compat/removed_api.cpp
+ global/qsimd.cpp
DEFINES
+ QT_NO_CONTEXTLESS_CONNECT
QT_NO_FOREACH
+ QT_NO_QPAIR
QT_NO_USING_NAMESPACE
QT_TYPESAFE_FLAGS
+ QT_USE_NODISCARD_FILE_OPEN
INCLUDE_DIRECTORIES
- "${CMAKE_CURRENT_BINARY_DIR}/global" # special case
+ "${CMAKE_CURRENT_BINARY_DIR}/global"
"${CMAKE_CURRENT_BINARY_DIR}/kernel" # for moc_qobject.cpp to be found by qobject.cpp
- # ../3rdparty/md4 # special case remove
- # ../3rdparty/md5 # special case remove
- # ../3rdparty/sha3 # special case remove
../3rdparty/tinycbor/src
LIBRARIES
- Qt::GlobalConfigPrivate # special case
+ Qt::GlobalConfigPrivate
+ WrapZLIB::WrapZLIB
PRECOMPILED_HEADER
"global/qt_pch.h"
- PUBLIC_LIBRARIES # special case:
- Qt::Platform # special case:
- # special case begin
- # Generated in QtBaseGlobalTargets
+ GENERATE_CPP_EXPORTS
+ PUBLIC_LIBRARIES
+ Qt::Platform
EXTRA_CMAKE_FILES
- "${CMAKE_CURRENT_SOURCE_DIR}/Qt6CTestMacros.cmake"
- "${CMAKE_CURRENT_SOURCE_DIR}/Qt6CoreConfigureFileTemplate.in"
- ${corelib_extra_cmake_files}
- # special case end
-)
-
-set(corelib_no_pch_sources
- compat/removed_api.cpp
+ "${CMAKE_CURRENT_SOURCE_DIR}/Qt6CTestMacros.cmake"
+ "${CMAKE_CURRENT_SOURCE_DIR}/Qt6CoreConfigureFileTemplate.in"
+ "${CMAKE_CURRENT_SOURCE_DIR}/Qt6CoreResourceInit.in.cpp"
+ "${CMAKE_CURRENT_SOURCE_DIR}/Qt6CoreDeploySupport.cmake"
+ ${corelib_extra_cmake_files}
+ POLICIES
+ QTP0002
+ QTP0003
)
+_qt_internal_setup_deploy_support()
-foreach(src ${corelib_no_pch_sources})
- qt_update_ignore_pch_source(Core ${src})
-endforeach()
-
-# special case begin
add_dependencies(Core qmodule_pri)
if (NOT QT_NAMESPACE STREQUAL "")
- target_compile_definitions(Core PUBLIC "QT_NAMESPACE=${QT_NAMESPACE}")
+ set(core_namespace_defs "QT_NAMESPACE=${QT_NAMESPACE}")
+ if(QT_INLINE_NAMESPACE)
+ list(APPEND core_namespace_defs QT_INLINE_NAMESPACE)
+ endif()
+ target_compile_definitions(Core PUBLIC ${core_namespace_defs})
set_target_properties(Core PROPERTIES _qt_namespace "${QT_NAMESPACE}")
set_property(TARGET Core APPEND PROPERTY EXPORT_PROPERTIES _qt_namespace)
endif()
@@ -310,7 +377,7 @@ endif()
# We do this on purpose, because qobject.cpp contains a bunch of Q_GADGET, Q_NAMESPACE, etc
# keywords and AUTOMOC gets confused about wanting to compile a qobject.moc file as well.
# Instead use manual moc.
-set_source_files_properties(kernel/qobject.cpp kernel/qobject.h kernel/qobject_p.h
+set_source_files_properties(kernel/qobject.cpp kernel/qobject.h kernel/qobject_p.h kernel/qobject_p_p.h
PROPERTIES SKIP_AUTOMOC TRUE)
qt_manual_moc(qobject_moc_files
@@ -322,23 +389,29 @@ set_source_files_properties(${qobject_moc_files} PROPERTIES HEADER_FILE_ONLY ON)
set(core_metatype_args MANUAL_MOC_JSON_FILES ${core_qobject_metatypes_json_list})
if(QT_WILL_INSTALL)
- set(metatypes_install_dir ${INSTALL_LIBDIR}/metatypes)
+ set(metatypes_install_dir ${INSTALL_ARCHDATADIR}/metatypes)
list(APPEND core_metatype_args
__QT_INTERNAL_INSTALL __QT_INTERNAL_INSTALL_DIR "${metatypes_install_dir}")
endif()
-# Use qt6_extract_metatypes instead of GENERATE_METATYPES so that we can manually pass the
+
+# Use qt6_extract_metatypes instead so that we can manually pass the
# additional json files.
qt6_extract_metatypes(Core ${core_metatype_args})
-set_property(TARGET Core APPEND PROPERTY
- PUBLIC_HEADER "${CMAKE_CURRENT_BINARY_DIR}/global/qconfig.h")
-set_property(TARGET Core APPEND PROPERTY
- PRIVATE_HEADER "${CMAKE_CURRENT_BINARY_DIR}/global/qconfig_p.h")
+target_sources(Core PRIVATE
+ "${CMAKE_CURRENT_BINARY_DIR}/global/qconfig.h"
+ "${CMAKE_CURRENT_BINARY_DIR}/global/qconfig_p.h"
+)
+set_source_files_properties(
+ "${CMAKE_CURRENT_BINARY_DIR}/global/qconfig.h"
+ "${CMAKE_CURRENT_BINARY_DIR}/global/qconfig_p.h"
+ PROPERTIES GENERATED TRUE
+)
# Find ELF interpreter and define a macro for that:
-if (LINUX AND NOT CMAKE_CROSSCOMPILING AND BUILD_SHARED_LIBS)
+if ((LINUX OR HURD) AND NOT CMAKE_CROSSCOMPILING AND BUILD_SHARED_LIBS)
if (NOT DEFINED ELF_INTERPRETER)
- execute_process(COMMAND ${CMAKE_COMMAND} -E env LC_ALL=C readelf -l /bin/ls
+ execute_process(COMMAND ${CMAKE_COMMAND} -E env LC_ALL=C readelf -l /bin/sh
RESULT_VARIABLE readelf_ok
OUTPUT_VARIABLE readelf_output
)
@@ -354,7 +427,6 @@ if (LINUX AND NOT CMAKE_CROSSCOMPILING AND BUILD_SHARED_LIBS)
target_compile_definitions(Core PRIVATE ELF_INTERPRETER="${ELF_INTERPRETER}")
endif()
endif()
-# special case end
qt_internal_add_simd_part(Core SIMD mips_dsp
SOURCES
@@ -369,70 +441,48 @@ endif()
if(ANDROID)
set_property(TARGET Core APPEND PROPERTY QT_ANDROID_BUNDLED_JAR_DEPENDENCIES
- jar/Qt${QtBase_VERSION_MAJOR}Android.jar # special case
+ jar/Qt${QtBase_VERSION_MAJOR}Android.jar
)
set_property(TARGET Core APPEND PROPERTY QT_ANDROID_LIB_DEPENDENCIES
- plugins/platforms/libplugins_platforms_qtforandroid.so
+ ${INSTALL_PLUGINSDIR}/platforms/libplugins_platforms_qtforandroid.so
)
set_property(TARGET Core APPEND PROPERTY QT_ANDROID_PERMISSIONS
android.permission.INTERNET android.permission.WRITE_EXTERNAL_STORAGE
)
endif()
-#### Keys ignored in scope 1:.:.:corelib.pro:<TRUE>:
-# CMAKE_DISABLED_FEATURES = "$$join(QT_DISABLED_FEATURES, "$$escape_expand(\\n) ")"
-# CMAKE_HOST_DATA_DIR = "$$cmakeRelativePath($$[QT_HOST_DATA/src], $$[QT_INSTALL_PREFIX])"
-# CMAKE_INSTALL_DATA_DIR = "$$cmakeRelativePath($$[QT_HOST_DATA], $$[QT_INSTALL_PREFIX])"
-# HOST_BINS = "$$[QT_HOST_BINS]"
-# INSTALLS = "ctest_qt5_module_files" "cmake_qt5_umbrella_module_files"
-# MODULE = "core"
-# MODULE_CONFIG = "moc" "resources"
-# QMAKE_PKGCONFIG_VARIABLES = "host_bins" "qt_conf"
-# QMAKE_SUBSTITUTES = "ctest_macros_file" "cmake_umbrella_config_file" "cmake_umbrella_config_module_location" "cmake_umbrella_config_module_location_for_install" "cmake_umbrella_config_version_file" "cmake_extras_mkspec_dir" "cmake_extras_mkspec_dir_for_install"
-# cmake_extras_mkspec_dir.input = "$$PWD/Qt5CoreConfigExtrasMkspecDir.cmake.in"
-# cmake_extras_mkspec_dir.output = "$$DESTDIR/cmake/Qt5Core/Qt5CoreConfigExtrasMkspecDir.cmake"
-# cmake_extras_mkspec_dir_for_install.input = "$$PWD/Qt5CoreConfigExtrasMkspecDirForInstall.cmake.in"
-# cmake_extras_mkspec_dir_for_install.output = "$$DESTDIR/cmake/install/Qt5Core/Qt5CoreConfigExtrasMkspecDir.cmake"
-# cmake_qt5_umbrella_module_files.files = "$$cmake_umbrella_config_file.output" "$$cmake_umbrella_config_version_file.output" "$$cmake_umbrella_config_module_location_for_install.output"
-# cmake_qt5_umbrella_module_files.path = "$$[QT_INSTALL_LIBS]/cmake/Qt5"
-# cmake_umbrella_config_file.input = "$$PWD/Qt5Config.cmake.in"
-# cmake_umbrella_config_file.output = "$$DESTDIR/cmake/Qt5/Qt5Config.cmake"
-# cmake_umbrella_config_module_location.input = "$$PWD/Qt5ModuleLocation.cmake.in"
-# cmake_umbrella_config_module_location.output = "$$DESTDIR/cmake/Qt5/Qt5ModuleLocation.cmake"
-# cmake_umbrella_config_module_location_for_install.input = "$$PWD/Qt5ModuleLocationForInstall.cmake.in"
-# cmake_umbrella_config_module_location_for_install.output = "$$DESTDIR/cmake/install/Qt5/Qt5ModuleLocation.cmake"
-# cmake_umbrella_config_version_file.input = "$$PWD/../../mkspecs/features/data/cmake/Qt5ConfigVersion.cmake.in"
-# cmake_umbrella_config_version_file.output = "$$DESTDIR/cmake/Qt5/Qt5ConfigVersion.cmake"
-# ctest_macros_file.CONFIG = "verbatim"
-# ctest_macros_file.input = "$$PWD/Qt5CTestMacros.cmake"
-# ctest_macros_file.output = "$$DESTDIR/cmake/Qt5Core/Qt5CTestMacros.cmake"
-# ctest_qt5_module_files.files = "$$ctest_macros_file.output" "$$cmake_extras_mkspec_dir_for_install.output"
-# ctest_qt5_module_files.path = "$$[QT_INSTALL_LIBS]/cmake/Qt5Core"
-# host_bins.name = "host_bins"
-# host_bins.variable = "HOST_BINS"
-# qt_conf.name = "qt_config"
-# qt_conf.variable = "QT_CONFIG"
-
-## Scopes:
-#####################################################################
+# Add version tagging source files if the linker has version script support
+# or the platform supports it.
+set(core_version_tagging_files
+ global/qversiontagging.cpp)
+qt_internal_extend_target(Core
+ CONDITION TEST_ld_version_script OR APPLE OR WIN32
+ SOURCES ${core_version_tagging_files}
+)
-#### Keys ignored in scope 2:.:.:corelib.pro:QT_FEATURE_gc_binaries:
-# MODULE_CONFIG = "gc_binaries"
-# special case begin
-# remove because it's handled manually
-#qt_internal_extend_target(Core CONDITION NOT QT_NAMESPACE_ISEMPTY
-# PUBLIC_DEFINES
-# QT_NAMESPACE=
-#)
-# special case end
+if(GCC)
+ # Disable LTO, as the symbols disappear somehow under GCC
+ # (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=48200)
+ # The issue should be fixed in GCC >= 10
+ if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 10)
+ set_source_files_properties(${core_version_tagging_files}
+ PROPERTIES COMPILE_OPTIONS "-fno-lto")
+ endif()
+endif()
+
+qt_internal_extend_target(Core
+ CONDITION ( TEST_architecture_arch STREQUAL i386 ) OR
+ ( TEST_architecture_arch STREQUAL x86_64 ) OR
+ ( CMAKE_OSX_ARCHITECTURES MATCHES "x86_64" ) OR
+ ( CMAKE_OSX_ARCHITECTURES MATCHES "i386" ) OR
+ SOURCES
+ global/qsimd_x86_p.h
+)
qt_internal_extend_target(Core CONDITION ANDROID
- SOURCES
- kernel/qsharedmemory_android.cpp
- kernel/qsystemsemaphore_android.cpp
DEFINES
- LIBS_SUFFIX="_${ANDROID_ABI}.so" # special case
+ LIBS_SUFFIX="_${ANDROID_ABI}.so"
)
qt_internal_extend_target(Core CONDITION MSVC AND (TEST_architecture_arch STREQUAL "i386")
@@ -440,12 +490,11 @@ qt_internal_extend_target(Core CONDITION MSVC AND (TEST_architecture_arch STREQU
"/BASE:0x67000000"
)
-# QtCore can't be compiled with -Wl,-no-undefined because it uses the
-# "environ" variable and FreeBSD does not include a weak symbol for it
-# in libc.
-qt_internal_extend_target(Core CONDITION FREEBSD
- LINK_OPTIONS
- "LINKER:--warn-unresolved-symbols"
+qt_internal_extend_target(Core CONDITION QT_FEATURE_xmlstream
+ SOURCES
+ serialization/qxmlstream.cpp serialization/qxmlstream.h serialization/qxmlstream_p.h
+ serialization/qxmlstreamgrammar.cpp serialization/qxmlstreamgrammar_p.h
+ serialization/qxmlstreamparser_p.h
)
qt_internal_extend_target(Core CONDITION QT_FEATURE_animation
@@ -465,7 +514,7 @@ qt_internal_extend_target(Core CONDITION QT_FEATURE_animation
# from the wrong DLL at runtime and crash!
qt_internal_extend_target(Core CONDITION QT_FEATURE_thread AND WIN32
SOURCES
- thread/qmutex_win.cpp
+ thread/qfutex_win_p.h
thread/qwaitcondition_win.cpp
LIBRARIES
synchronization
@@ -474,6 +523,7 @@ qt_internal_extend_target(Core CONDITION QT_FEATURE_thread AND WIN32
qt_internal_extend_target(Core CONDITION WIN32
SOURCES
global/qoperatingsystemversion_win.cpp global/qoperatingsystemversion_win_p.h
+ global/qt_windows.h
io/qfilesystemengine_win.cpp
io/qfsfileengine_win.cpp
io/qlockfile_win.cpp
@@ -483,16 +533,15 @@ qt_internal_extend_target(Core CONDITION WIN32
io/qwindowspipewriter.cpp io/qwindowspipewriter_p.h
io/qntdll_p.h
kernel/qcoreapplication_win.cpp
- kernel/qelapsedtimer_win.cpp
kernel/qeventdispatcher_win.cpp kernel/qeventdispatcher_win_p.h
- kernel/qfunctions_winrt_p.h
- kernel/qsharedmemory_win.cpp
- kernel/qsystemsemaphore_win.cpp
+ kernel/qfunctions_win.cpp kernel/qfunctions_win_p.h kernel/qfunctions_winrt_p.h
+ ipc/qsharedmemory_win.cpp
+ ipc/qsystemsemaphore_win.cpp
kernel/qwineventnotifier.cpp kernel/qwineventnotifier.h kernel/qwineventnotifier_p.h
kernel/qwinregistry.cpp kernel/qwinregistry_p.h
plugin/qsystemlibrary.cpp plugin/qsystemlibrary_p.h
thread/qthread_win.cpp
- # DEFINES # special case: remove
+ platform/windows/qcomobject_p.h
LIBRARIES
advapi32
authz
@@ -510,6 +559,31 @@ qt_internal_extend_target(Core CONDITION WIN32
userenv
)
+qt_internal_extend_target(Core CONDITION WIN32
+ NO_UNITY_BUILD_SOURCES
+ global/qsimd.cpp # Q_DECL_INIT_PRIORITY
+ serialization/qcborvalue.cpp # various windows.h clashes
+ serialization/qjsoncbor.cpp
+ serialization/qjsonvalue.cpp
+ serialization/qxmlstream.cpp
+ text/qbytearray.cpp
+ text/qlatin1stringmatcher.cpp
+ text/qunicodetools.cpp
+ tools/qhash.cpp # Q_DECL_INIT_PRIORITY
+)
+
+if(NOT WIN32)
+ ### Qt7: remove
+ # Make qwineventnotifier.h available on non-Windows platforms too for code bases that include
+ # it unconditionally.
+ qt_internal_extend_target(Core SOURCES kernel/qwineventnotifier.h)
+ set_source_files_properties(kernel/qwineventnotifier.h PROPERTIES SKIP_AUTOMOC ON)
+endif()
+
+qt_internal_extend_target(Core CONDITION WASM
+ SOURCES
+ kernel/qcore_wasm.cpp)
+
qt_internal_extend_target(Core CONDITION APPLE
SOURCES
global/qoperatingsystemversion_darwin.mm
@@ -520,11 +594,21 @@ qt_internal_extend_target(Core CONDITION APPLE
kernel/qcore_foundation.mm
kernel/qcore_mac.mm kernel/qcore_mac_p.h
kernel/qcoreapplication_mac.cpp
- kernel/qelapsedtimer_mac.cpp
kernel/qeventdispatcher_cf.mm kernel/qeventdispatcher_cf_p.h
LIBRARIES
${FWCoreFoundation}
${FWFoundation}
+ PUBLIC_LIBRARIES
+ ${FWIOKit}
+ DEFINES
+ _DARWIN_C_SOURCE # This resolves two issues,
+ # - Provide DT_* macros to qfilesystemengine_unix.cpp
+ # - Enables SOCK_MAXADDRLEN in case its missing during the unity build
+ NO_UNITY_BUILD_SOURCES
+ kernel/qsystemerror.cpp
+ # This makes sure that the tst_qmakelib passes. For some reason,
+ # QtCore ends up returning a corrupted error message in
+ # write_file(): fail
)
qt_internal_extend_target(Core CONDITION MACOS
@@ -535,7 +619,6 @@ qt_internal_extend_target(Core CONDITION MACOS
${FWSecurity}
PUBLIC_LIBRARIES
${FWDiskArbitration}
- ${FWIOKit}
)
qt_internal_extend_target(Core CONDITION INTEGRITY
@@ -549,30 +632,12 @@ qt_internal_extend_target(Core CONDITION INTEGRITY
--pending_instantiations=128
)
-# Workaround for QTBUG-90353
-# Remove if MinGW (our only supported gcc version < 9) is no longer supported
-qt_internal_extend_target(Core CONDITION GCC AND (CMAKE_CXX_COMPILER_VERSION VERSION_LESS "9.0.0")
- PUBLIC_COMPILE_OPTIONS -Wno-error=invalid-offsetof
+# Workaround for QTBUG-101411
+# Remove if QCC (gcc version 8.3.0) for QNX 7.1.0 is no longer supported
+qt_internal_extend_target(Core CONDITION QCC AND (CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL "8.3.0")
+ PUBLIC_COMPILE_OPTIONS $<$<COMPILE_LANGUAGE:CXX>:-Wno-invalid-offsetof>
)
-#### Keys ignored in scope 14:.:.:corelib.pro:pathIsAbsolute(_ss_CMAKE_HOST_DATA_DIR):
-# CMAKE_HOST_DATA_DIR = "$$[QT_HOST_DATA/src]/"
-# CMAKE_HOST_DATA_DIR_IS_ABSOLUTE = "True"
-
-#### Keys ignored in scope 15:.:.:corelib.pro:pathIsAbsolute(_ss_CMAKE_INSTALL_DATA_DIR):
-# CMAKE_INSTALL_DATA_DIR = "$$[QT_HOST_DATA]/"
-# CMAKE_INSTALL_DATA_DIR_IS_ABSOLUTE = "True"
-
-# special case begin
-# Remove this because it's handled manually
-#qt_internal_extend_target(Core CONDITION NOT _x_-armcc_x_ AND NOT cross_compile AND NOT static AND (hurd_x_ OR linux_x_)
-# DEFINES
-# ELF_INTERPRETER=\\\"=Creadelf-l/bin/ls|perl-n-e\'['quote', ['if', ['/program', 'interpreter:', ['.*'], ']/'], '{', 'print', '$1;', '}']]\'\\\"
-# LINK_OPTIONS
-# "-Wl,-e,qt_core_boilerplate"
-#)
-# special case end
-
qt_internal_extend_target(Core CONDITION LINUX AND QT_BUILD_SHARED_LIBS
SOURCES
global/minimum-linux_p.h
@@ -588,16 +653,6 @@ qt_internal_extend_target(Core CONDITION QT_FEATURE_journald
PkgConfig::Libsystemd
)
-set(core_version_tagging_files global/qversiontagging.cpp global/qversiontagging.h)
-target_sources(Core PRIVATE ${core_version_tagging_files})
-
-# Disable LTO, as the symbols disappear somehow under GCC
-# (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=48200)
-if(GCC)
- set_source_files_properties(${core_version_tagging_files}
- PROPERTIES COMPILE_OPTIONS "-fno-lto")
-endif()
-
qt_internal_extend_target(Core CONDITION UNIX
SOURCES
io/qfilesystemengine_unix.cpp
@@ -605,26 +660,29 @@ qt_internal_extend_target(Core CONDITION UNIX
io/qfsfileengine_unix.cpp
io/qlockfile_unix.cpp
kernel/qcore_unix.cpp kernel/qcore_unix_p.h
- kernel/qeventdispatcher_unix.cpp kernel/qeventdispatcher_unix_p.h
kernel/qpoll_p.h
kernel/qtimerinfo_unix.cpp kernel/qtimerinfo_unix_p.h
thread/qthread_unix.cpp
)
+if(APPLE)
+ set_source_files_properties(io/qfilesystemengine_unix.cpp PROPERTIES LANGUAGE OBJCXX)
+ qt_internal_extend_target(Core CONDITION
+ PUBLIC_LIBRARIES ${FWUniformTypeIdentifiers}
+ )
+endif()
+
+qt_internal_extend_target(Core CONDITION UNIX AND NOT WASM
+ SOURCES
+ kernel/qeventdispatcher_unix.cpp kernel/qeventdispatcher_unix_p.h
+)
qt_internal_extend_target(Core CONDITION QT_FEATURE_thread
SOURCES
- thread/qatomic.cpp thread/qatomic.h
- thread/qatomic_bootstrap.h
- thread/qatomic_cxx11.h
- thread/qbasicatomic.h
+ thread/qatomic.cpp
thread/qfutex_p.h
- thread/qgenericatomic.h
- thread/qlocking_p.h
thread/qmutex.cpp thread/qmutex_p.h
- thread/qorderedmutexlocker_p.h
thread/qreadwritelock.cpp thread/qreadwritelock_p.h
thread/qsemaphore.cpp thread/qsemaphore.h
- thread/qthread_p.h
thread/qthreadpool.cpp thread/qthreadpool.h thread/qthreadpool_p.h
thread/qthreadstorage.cpp
)
@@ -636,6 +694,7 @@ qt_internal_extend_target(Core CONDITION QT_FEATURE_thread AND UNIX
qt_internal_extend_target(Core CONDITION APPLE AND QT_FEATURE_thread
SOURCES
+ thread/qfutex_mac_p.h
thread/qmutex_mac.cpp
)
@@ -644,6 +703,16 @@ qt_internal_extend_target(Core CONDITION QT_FEATURE_thread AND UNIX AND NOT APPL
thread/qmutex_unix.cpp
)
+qt_internal_extend_target(Core CONDITION QT_FEATURE_thread AND FREEBSD
+ SOURCES
+ thread/qfutex_freebsd_p.h
+)
+
+qt_internal_extend_target(Core CONDITION QT_FEATURE_thread AND LINUX
+ SOURCES
+ thread/qfutex_linux_p.h
+)
+
qt_internal_extend_target(Core CONDITION QT_FEATURE_future
SOURCES
thread/qexception.cpp thread/qexception.h
@@ -661,30 +730,9 @@ qt_internal_extend_target(Core CONDITION QT_FEATURE_std_atomic64
WrapAtomic::WrapAtomic
)
-qt_internal_extend_target(Core CONDITION QT_FEATURE_system_zlib
- LIBRARIES
- WrapZLIB::WrapZLIB
-)
-
qt_internal_extend_target(Core CONDITION NOT QT_FEATURE_system_zlib
- SOURCES
- ../3rdparty/zlib/src/adler32.c
- ../3rdparty/zlib/src/compress.c
- ../3rdparty/zlib/src/crc32.c
- ../3rdparty/zlib/src/deflate.c
- ../3rdparty/zlib/src/gzclose.c
- ../3rdparty/zlib/src/gzlib.c
- ../3rdparty/zlib/src/gzread.c
- ../3rdparty/zlib/src/gzwrite.c
- ../3rdparty/zlib/src/infback.c
- ../3rdparty/zlib/src/inffast.c
- ../3rdparty/zlib/src/inflate.c
- ../3rdparty/zlib/src/inftrees.c
- ../3rdparty/zlib/src/trees.c
- ../3rdparty/zlib/src/uncompr.c
- ../3rdparty/zlib/src/zutil.c
- INCLUDE_DIRECTORIES
- ../3rdparty/zlib/src
+ LIBRARIES
+ Qt::ZlibPrivate
)
qt_internal_extend_target(Core CONDITION QT_FEATURE_commandlineparser
@@ -694,13 +742,15 @@ qt_internal_extend_target(Core CONDITION QT_FEATURE_commandlineparser
)
qt_internal_extend_target(Core CONDITION QT_FEATURE_backtrace
+ DEFINES
+ BACKTRACE_HEADER="${Backtrace_HEADER}"
LIBRARIES
WrapBacktrace::WrapBacktrace
)
qt_internal_extend_target(Core CONDITION QT_FEATURE_system_doubleconversion
LIBRARIES
- WrapDoubleConversion::WrapDoubleConversion
+ WrapSystemDoubleConversion::WrapSystemDoubleConversion
)
qt_internal_extend_target(Core CONDITION QT_FEATURE_doubleconversion AND NOT QT_FEATURE_system_doubleconversion
@@ -746,12 +796,12 @@ qt_internal_extend_target(Core CONDITION UNIX AND NOT HAIKU AND NOT INTEGRITY AN
m
)
-qt_internal_extend_target(Core CONDITION APPLE AND NOT NACL
+qt_internal_extend_target(Core CONDITION APPLE
SOURCES
text/qlocale_mac.mm
)
-qt_internal_extend_target(Core CONDITION UNIX AND (NACL OR NOT APPLE)
+qt_internal_extend_target(Core CONDITION UNIX AND NOT APPLE AND NOT WASM
SOURCES
text/qlocale_unix.cpp
)
@@ -761,8 +811,13 @@ qt_internal_extend_target(Core CONDITION WIN32
text/qlocale_win.cpp
)
+qt_internal_extend_target(Core CONDITION WASM
+ SOURCES
+ text/qlocale_wasm.cpp
+)
+
# On MS-Win, clang has two flavors, one of which immitates MSVC (so claims to be it)
-qt_internal_extend_target(Core CONDITION WIN32 AND MSVC AND NOT CLANG
+qt_internal_extend_target(Core CONDITION MSVC
LIBRARIES
runtimeobject
)
@@ -797,6 +852,11 @@ qt_internal_extend_target(Core CONDITION QT_FEATURE_regularexpression
WrapPCRE2::WrapPCRE2
)
+qt_internal_extend_target(Core CONDITION QT_FEATURE_openssl_hash
+ LIBRARIES
+ WrapOpenSSL::WrapOpenSSL
+)
+
qt_internal_extend_target(Core CONDITION QT_FEATURE_hijricalendar
SOURCES
time/qhijricalendar.cpp time/qhijricalendar_p.h
@@ -816,39 +876,50 @@ qt_internal_extend_target(Core CONDITION QT_FEATURE_jalalicalendar
qt_internal_extend_target(Core CONDITION QT_FEATURE_timezone
SOURCES
- time/qtimezone.cpp time/qtimezone.h
time/qtimezoneprivate.cpp time/qtimezoneprivate_p.h
time/qtimezoneprivate_data_p.h
)
-qt_internal_extend_target(Core CONDITION APPLE AND QT_FEATURE_timezone AND NOT NACL
+qt_internal_extend_target(Core CONDITION APPLE AND QT_FEATURE_timezone
SOURCES
time/qtimezoneprivate_mac.mm
)
-qt_internal_extend_target(Core CONDITION QT_FEATURE_timezone AND ANDROID AND (NACL OR NOT APPLE)
+qt_internal_extend_target(Core CONDITION QT_FEATURE_timezone AND ANDROID AND NOT APPLE
SOURCES
time/qtimezoneprivate_android.cpp
)
-qt_internal_extend_target(Core CONDITION QT_FEATURE_timezone AND UNIX AND NOT ANDROID AND (NACL OR NOT APPLE)
+qt_internal_extend_target(Core CONDITION QT_FEATURE_timezone AND UNIX AND NOT ANDROID AND NOT APPLE
SOURCES
time/qtimezoneprivate_tz.cpp
)
-qt_internal_extend_target(Core CONDITION QT_FEATURE_icu AND QT_FEATURE_timezone AND UNIX AND NOT ANDROID AND (NACL OR NOT APPLE)
+qt_internal_extend_target(Core
+ CONDITION
+ QT_FEATURE_icu AND QT_FEATURE_timezone AND NOT ANDROID AND NOT APPLE
SOURCES
time/qtimezoneprivate_icu.cpp
)
-qt_internal_extend_target(Core CONDITION QT_FEATURE_icu AND QT_FEATURE_timezone AND WIN32 AND NOT ANDROID AND (NACL OR NOT APPLE)
+# Even MS says we should prefer ICU over its APIs for TZ data:
+qt_internal_extend_target(Core
+ CONDITION
+ QT_FEATURE_timezone AND WIN32 AND NOT QT_FEATURE_icu
SOURCES
- time/qtimezoneprivate_icu.cpp
+ time/qtimezoneprivate_win.cpp
)
-qt_internal_extend_target(Core CONDITION QT_FEATURE_timezone AND WIN32 AND NOT QT_FEATURE_icu AND NOT ANDROID AND (NACL OR NOT APPLE)
+qt_internal_extend_target(Core
+ CONDITION QT_FEATURE_timezone_locale
SOURCES
- time/qtimezoneprivate_win.cpp
+ time/qtimezonelocale.cpp time/qtimezonelocale_p.h
+)
+
+qt_internal_extend_target(Core
+ CONDITION QT_FEATURE_timezone_locale AND NOT QT_FEATURE_icu
+ SOURCES
+ time/qtimezonelocale_data_p.h
)
qt_internal_extend_target(Core CONDITION QT_FEATURE_datetimeparser
@@ -858,7 +929,7 @@ qt_internal_extend_target(Core CONDITION QT_FEATURE_datetimeparser
qt_internal_extend_target(Core CONDITION QT_FEATURE_zstd
LIBRARIES
- ZSTD::ZSTD
+ WrapZSTD::WrapZSTD
)
qt_internal_extend_target(Core CONDITION QT_FEATURE_filesystemwatcher
@@ -912,7 +983,7 @@ qt_internal_extend_target(Core CONDITION QT_FEATURE_settings AND WIN32
io/qsettings_win.cpp
)
-qt_internal_extend_target(Core CONDITION APPLE AND QT_FEATURE_settings AND NOT NACL
+qt_internal_extend_target(Core CONDITION APPLE AND QT_FEATURE_settings
SOURCES
io/qsettings_mac.cpp
)
@@ -930,7 +1001,7 @@ qt_internal_extend_target(Core CONDITION QT_FEATURE_filesystemiterator AND WIN32
qt_internal_extend_target(Core CONDITION QT_FEATURE_process AND UNIX
SOURCES
../3rdparty/forkfd/forkfd.h
- io/forkfd_qt.cpp
+ io/forkfd_qt.c
INCLUDE_DIRECTORIES
../3rdparty/forkfd
)
@@ -945,20 +1016,30 @@ qt_internal_extend_target(Core CONDITION APPLE AND NOT MACOS
${FWMobileCoreServices}
)
-qt_internal_extend_target(Core CONDITION UNIX AND NOT APPLE
- SOURCES
- kernel/qelapsedtimer_unix.cpp
-)
-
qt_internal_extend_target(Core CONDITION ANDROID
SOURCES
io/qstandardpaths_android.cpp
- io/qstorageinfo_unix.cpp
+ io/qstorageinfo_linux.cpp io/qstorageinfo_linux_p.h
+ kernel/qjniarray.h
+ kernel/qjnitypes.h kernel/qjnitypes_impl.h
kernel/qjnienvironment.cpp kernel/qjnienvironment.h
kernel/qjniobject.cpp kernel/qjniobject.h
kernel/qjnihelpers.cpp kernel/qjnihelpers_p.h
platform/android/qandroidextras_p.h platform/android/qandroidextras.cpp
platform/android/qandroidnativeinterface.cpp
+ NO_UNITY_BUILD_SOURCES
+ platform/android/qandroidextras.cpp
+ # qtNativeClassName conflicts with similar symbols in android headers
+ # TODO: Resolve conflicts between various variables set as,
+ # `org/qtproject/qt/android/QtNative` QtAndroidPrivate might be a good
+ # place to put them.
+)
+
+qt_internal_extend_target(Core CONDITION QT_FEATURE_cpp_winrt
+ SOURCES
+ platform/windows/qfactorycacheregistration_p.h
+ platform/windows/qfactorycacheregistration.cpp
+ platform/windows/qt_winrtbase_p.h
)
qt_internal_extend_target(Core CONDITION HAIKU AND NOT ANDROID
@@ -969,12 +1050,19 @@ qt_internal_extend_target(Core CONDITION HAIKU AND NOT ANDROID
be
)
-qt_internal_extend_target(Core CONDITION UNIX AND NOT APPLE AND NOT HAIKU AND NOT ANDROID
+qt_internal_extend_target(Core
+ CONDITION UNIX AND NOT LINUX AND NOT APPLE AND NOT HAIKU AND NOT ANDROID AND NOT VXWORKS
SOURCES
io/qstandardpaths_unix.cpp
io/qstorageinfo_unix.cpp
)
+qt_internal_extend_target(Core CONDITION LINUX AND NOT ANDROID AND NOT VXWORKS
+ SOURCES
+ io/qstandardpaths_unix.cpp
+ io/qstorageinfo_linux.cpp
+)
+
qt_internal_extend_target(Core CONDITION QT_FEATURE_itemmodel
SOURCES
itemmodels/qabstractitemmodel.cpp itemmodels/qabstractitemmodel.h itemmodels/qabstractitemmodel_p.h
@@ -1031,12 +1119,12 @@ qt_internal_extend_target(Core CONDITION QT_FEATURE_library AND UNIX AND NOT APP
plugin/qlibrary_unix.cpp
)
-qt_internal_extend_target(Core CONDITION QT_FEATURE_dlopen AND QT_FEATURE_library
+qt_internal_extend_target(Core CONDITION QT_FEATURE_dlopen
LIBRARIES
${CMAKE_DL_LIBS}
)
-qt_internal_extend_target(Core CONDITION APPLE AND (IOS OR TVOS)
+qt_internal_extend_target(Core CONDITION APPLE AND UIKIT
LIBRARIES
${FWUIKit}
)
@@ -1058,34 +1146,50 @@ qt_internal_extend_target(Core CONDITION QT_FEATURE_glib AND UNIX
GLIB2::GLIB2
)
-qt_internal_extend_target(Core CONDITION QT_FEATURE_clock_gettime AND UNIX
+qt_internal_extend_target(Core CONDITION QT_FEATURE_clock_gettime
LIBRARIES
WrapRt::WrapRt
)
-qt_internal_extend_target(Core CONDITION UNIX AND NOT ANDROID
+qt_internal_extend_target(Core CONDITION QT_FEATURE_posix_shm AND UNIX
SOURCES
- kernel/qsharedmemory_posix.cpp
- kernel/qsharedmemory_systemv.cpp
- kernel/qsharedmemory_unix.cpp
- kernel/qsystemsemaphore_posix.cpp
- kernel/qsystemsemaphore_systemv.cpp
- kernel/qsystemsemaphore_unix.cpp
+ ipc/qsharedmemory_posix.cpp
+ LIBRARIES
+ WrapRt::WrapRt
+)
+qt_internal_extend_target(Core CONDITION QT_FEATURE_sysv_shm
+ SOURCES
+ ipc/qsharedmemory_systemv.cpp
+)
+qt_internal_extend_target(Core CONDITION QT_FEATURE_posix_sem
+ SOURCES
+ ipc/qsystemsemaphore_posix.cpp
+ LIBRARIES
+ WrapRt::WrapRt
+)
+qt_internal_extend_target(Core CONDITION QT_FEATURE_sysv_sem
+ SOURCES
+ ipc/qsystemsemaphore_systemv.cpp
)
qt_internal_extend_target(Core CONDITION VXWORKS
SOURCES
- kernel/qfunctions_vxworks.cpp kernel/qfunctions_vxworks.h
+ io/qstandardpaths_unix.cpp
+ io/qstorageinfo_stub.cpp
)
qt_internal_extend_target(Core CONDITION QT_FEATURE_cborstreamreader
SOURCES
serialization/qcborstreamreader.cpp serialization/qcborstreamreader.h
+ NO_UNITY_BUILD_SOURCES
+ serialization/qcborstreamreader.cpp # some problem with cbor_value_get_type etc
)
qt_internal_extend_target(Core CONDITION QT_FEATURE_cborstreamwriter
SOURCES
serialization/qcborstreamwriter.cpp serialization/qcborstreamwriter.h
+ NO_UNITY_BUILD_SOURCES
+ serialization/qcborstreamwriter.cpp # CBOR macro clashes
)
qt_internal_extend_target(Core CONDITION QT_FEATURE_mimetype
@@ -1099,165 +1203,154 @@ qt_internal_extend_target(Core CONDITION QT_FEATURE_mimetype
mimetypes/qmimetypeparser.cpp mimetypes/qmimetypeparser_p.h
)
-#### Keys ignored in scope 171:.:mimetypes:mimetypes/mimetypes.pri:QT_FEATURE_mimetype:
-# MIME_DATABASE = "mimetypes/mime/packages/freedesktop.org.xml"
-# OTHER_FILES = "$$MIME_DATABASE"
-
-# special case begin
-# qt_internal_extend_target(Core CONDITION QT_FEATURE_mimetype AND QT_FEATURE_mimetype_database
-# INCLUDE_DIRECTORIES
-# .rcc
-#)
-# special case end
-
-#### Keys ignored in scope 172:.:mimetypes:mimetypes/mimetypes.pri:QT_FEATURE_mimetype_database:
-# QMAKE_EXTRA_COMPILERS = "mimedb"
-# mimedb.commands = "${QMAKE_FILE_IN}" ">" "${QMAKE_FILE_OUT}"
-# mimedb.depends = "$$PWD/mime/generate.pl"
-# mimedb.input = "MIME_DATABASE"
-# mimedb.output = "$$outpath/qmimeprovider_database.cpp"
-# mimedb.variable_out = "INCLUDED_SOURCES"
-
-#### Keys ignored in scope 173:.:mimetypes:mimetypes/mimetypes.pri:ANDROID:
-# outpath = "$$outpath/$${QT_ARCH}"
-
-#### Keys ignored in scope 175:.:mimetypes:mimetypes/mimetypes.pri:(CMAKE_BUILD_TYPE STREQUAL Debug):
-# outpath = "$$outpath/debug"
-
-#### Keys ignored in scope 176:.:mimetypes:mimetypes/mimetypes.pri:else:
-# outpath = "$$outpath/release"
-
-#### Keys ignored in scope 177:.:mimetypes:mimetypes/mimetypes.pri:MAKEFILE_GENERATOR___equals___MSVC.NET OR MAKEFILE_GENERATOR___equals___MSBUILD OR QMAKE_SH_ISEMPTY:
-# mimedb.commands = "cmd" "/c" "$$shell_path($$PWD/mime/generate.bat)"
-# mimedb.depends = "$$PWD/mime/generate.bat" "$$PWD/mime/hexdump.ps1"
-
-#### Keys ignored in scope 178:.:mimetypes:mimetypes/mimetypes.pri:else:
-# mimedb.commands = "perl" "$${mimedb.depends}"
-
-#### Keys ignored in scope 179:.:mimetypes:mimetypes/mimetypes.pri:QT_FEATURE_zstd:
-# mimedb.commands = "--zstd"
-# Resources:
-# special case begin
-# We can't specify the resources directly as we have unit tests that
-# depend on these as well and we no longer support the use of hand
-# edited qrc files.
-if(QT_FEATURE_mimetype AND QT_FEATURE_mimetype_database)
- include(${CMAKE_CURRENT_SOURCE_DIR}/mimetypes/mimetypes_resources.cmake)
+qt_internal_extend_target(Core CONDITION QT_FEATURE_permissions
+ SOURCES
+ kernel/qpermissions.cpp kernel/qpermissions.h kernel/qpermissions_p.h
+)
-# Generate qmimeprovider_database.cpp
- set(qmimeprovider_db_output_dir "${CMAKE_CURRENT_BINARY_DIR}/.rcc")
- set(qmimeprovider_db_output "${qmimeprovider_db_output_dir}/qmimeprovider_database.cpp")
- if(CMAKE_VERSION VERSION_LESS 3.18 OR QT_AVOID_CMAKE_ARCHIVING_API)
- set(command_args "")
- set(mime_dir "${CMAKE_CURRENT_SOURCE_DIR}/mimetypes/mime")
- set(command_depends "${mime_dir}/generate.pl" "${corelib_mimetypes_resource_file}")
- if (MSVC)
- list(APPEND command_args "${mime_dir}/generate.bat")
- list(APPEND command_depends "${mime_dir}/generate.bat" "${mime_dir}/hexdump.ps1" )
- else()
- file(MAKE_DIRECTORY ${qmimeprovider_db_output_dir})
- list(APPEND command_args perl "${mime_dir}/generate.pl" )
- endif()
+if(QT_FEATURE_permissions AND APPLE)
+ qt_internal_extend_target(Core
+ SOURCES
+ kernel/qpermissions_darwin.mm
+ platform/darwin/qdarwinpermissionplugin.mm
+ PLUGIN_TYPES
+ permissions
+ )
- if (QT_FEATURE_zstd)
- list(APPEND command_args "--zstd")
- endif()
+ foreach(permission Camera Microphone Bluetooth Contacts Calendar Location)
+ qt_internal_add_darwin_permission_plugin("${permission}")
+ endforeach()
+
+ # Camera
+ qt_internal_extend_target(QDarwinCameraPermissionPlugin
+ LIBRARIES ${FWAVFoundation}
+ )
+ set_property(TARGET QDarwinCameraPermissionPlugin PROPERTY
+ _qt_darwin_permissison_separate_request TRUE
+ )
+
+ # Microphone
+ qt_internal_extend_target(QDarwinMicrophonePermissionPlugin
+ LIBRARIES ${FWAVFoundation}
+ )
+ set_property(TARGET QDarwinMicrophonePermissionPlugin PROPERTY
+ _qt_darwin_permissison_separate_request TRUE
+ )
+
+ # Bluetooth
+ qt_internal_extend_target(QDarwinBluetoothPermissionPlugin
+ LIBRARIES ${FWCoreBluetooth}
+ )
+ set_property(TARGET QDarwinBluetoothPermissionPlugin PROPERTY
+ _qt_info_plist_usage_descriptions "NSBluetoothAlwaysUsageDescription"
+ )
- list(APPEND command_args "${corelib_mimetypes_resource_file}" ">" "${qmimeprovider_db_output}")
+ # Contacts
+ qt_internal_extend_target(QDarwinContactsPermissionPlugin
+ LIBRARIES ${FWContacts}
+ )
- add_custom_command(OUTPUT "${qmimeprovider_db_output}"
- DEPENDS ${command_depends}
- COMMAND ${command_args}
- COMMENT "Generating ${qmimeprovider_db_output}"
+ # Calendar
+ qt_internal_extend_target(QDarwinCalendarPermissionPlugin
+ LIBRARIES ${FWEventKit}
+ )
+ set_property(TARGET QDarwinCalendarPermissionPlugin PROPERTY
+ _qt_info_plist_usage_descriptions "NSCalendarsUsageDescription"
+ )
+
+ # Location
+ qt_internal_extend_target(QDarwinLocationPermissionPlugin
+ LIBRARIES ${FWCoreLocation}
+ )
+ if(MACOS)
+ set_property(TARGET QDarwinLocationPermissionPlugin PROPERTY
+ _qt_info_plist_usage_descriptions
+ "NSLocationUsageDescription"
)
else()
- if(QT_FEATURE_zstd)
- if(NOT QT_CMAKE_ZSTD_SUPPORT)
- message(FATAL_ERROR
- "CMake was not built with zstd support. "
- "Rebuild CMake or set QT_AVOID_CMAKE_ARCHIVING_API=ON.")
- endif()
- set(qmime_db_compression Zstd)
- string(APPEND qmime_db_content "#define MIME_DATABASE_IS_ZSTD\n")
- else()
- set(qmime_db_compression GZip)
- string(APPEND qmime_db_content "#define MIME_DATABASE_IS_GZIP\n")
- endif()
+ set_property(TARGET QDarwinLocationPermissionPlugin PROPERTY
+ _qt_info_plist_usage_descriptions
+ "NSLocationWhenInUseUsageDescription"
+ "NSLocationAlwaysAndWhenInUseUsageDescription"
+ )
+ endif()
+endif()
- file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/.rcc")
- get_filename_component(mime_types_resource_file "${corelib_mimetypes_resource_file}" NAME)
+qt_internal_extend_target(Core CONDITION QT_FEATURE_permissions AND ANDROID
+ SOURCES
+ kernel/qpermissions_android.cpp
+)
- set(mimetypes_resource_file_minified "${CMAKE_CURRENT_BINARY_DIR}/.rcc/${mime_types_resource_file}")
+qt_internal_extend_target(Core CONDITION QT_FEATURE_permissions AND WASM
+ SOURCES
+ kernel/qpermissions_wasm.cpp
+)
- set(mimetypes_resfile_timestamp_file "${CMAKE_CURRENT_BINARY_DIR}/.rcc/${mime_types_resource_file}.timestamp")
- file(TIMESTAMP "${corelib_mimetypes_resource_file}" mimetypes_resfile_timestamp)
+if(QT_FEATURE_mimetype AND QT_FEATURE_mimetype_database)
+ include(${CMAKE_CURRENT_SOURCE_DIR}/mimetypes/mimetypes_resources.cmake)
- set(compute_db_archive ON)
- if (EXISTS "${mimetypes_resfile_timestamp_file}")
- file(READ "${mimetypes_resfile_timestamp_file}" old_mimetypes_resfile_timestamp)
- if ("${mimetypes_resfile_timestamp}" STREQUAL "${old_mimetypes_resfile_timestamp}")
- set(compute_db_archive OFF)
- endif()
+ if(CMAKE_VERSION VERSION_LESS 3.18 OR QT_AVOID_CMAKE_ARCHIVING_API)
+ set(archiving_api "External")
+ else()
+ set(archiving_api "CMake")
+ if(QT_FEATURE_zstd AND NOT QT_CMAKE_ZSTD_SUPPORT)
+ message(FATAL_ERROR
+ "CMake was not built with zstd support. "
+ "Rebuild CMake or set QT_AVOID_CMAKE_ARCHIVING_API=ON.")
endif()
+ endif()
- if (compute_db_archive)
- find_program(xmlstarlet NAMES xmlstarlet xml)
- if (xmlstarlet)
- execute_process(
- COMMAND "${xmlstarlet}" sel -D -B -t -c / "${corelib_mimetypes_resource_file}"
- OUTPUT_FILE "${mimetypes_resource_file_minified}"
- RESULT_VARIABLE failed_to_minify
- )
- if (NOT failed_to_minify)
- set(corelib_mimetypes_resource_file "${mimetypes_resource_file_minified}")
- endif()
- else()
- message(STATUS "xmlstarlet command was not found. ${mime_types_resource_file} will not be minified.")
- endif()
-
- if (CMAKE_VERSION GREATER_EQUAL 3.19)
- set(additional_file_archive_create_parameters COMPRESSION_LEVEL 9)
- endif()
-
- file(ARCHIVE_CREATE OUTPUT "${qmimeprovider_db_output}.archive"
- PATHS "${corelib_mimetypes_resource_file}"
- FORMAT raw
- COMPRESSION ${qmime_db_compression}
- ${additional_file_archive_create_parameters}
- )
- file(READ "${qmimeprovider_db_output}.archive" qmime_db_archive HEX)
- file(SIZE "${qmimeprovider_db_output}.archive" qmime_db_archive_size)
- file(SIZE "${corelib_mimetypes_resource_file}" qmime_db_resource_size)
- file(REMOVE ${qmimeprovider_db_output}.archive)
-
- string(APPEND qmime_db_content "static const unsigned char mimetype_database[] = { ")
-
- string(REGEX MATCHALL "([a-f0-9][a-f0-9])" qmime_db_hex "${qmime_db_archive}")
-
- list(TRANSFORM qmime_db_hex PREPEND "0x")
- math(EXPR qmime_db_archive_size "${qmime_db_archive_size} - 1")
- foreach(index RANGE 0 ${qmime_db_archive_size} 12)
- list(APPEND index_list ${index})
- endforeach()
- list(TRANSFORM qmime_db_hex PREPEND "\n " AT ${index_list})
- list(JOIN qmime_db_hex ", " qmime_db_hex_joined)
-
- string(APPEND qmime_db_content "${qmime_db_hex_joined}")
- string(APPEND qmime_db_content "\n};\n")
- string(APPEND qmime_db_content "static constexpr size_t MimeTypeDatabaseOriginalSize = ${qmime_db_resource_size};\n")
-
- file(WRITE "${qmimeprovider_db_output}" "${qmime_db_content}")
-
- file(WRITE "${mimetypes_resfile_timestamp_file}" "${mimetypes_resfile_timestamp}")
+ if(DEFINED INPUT_mimetype_database_compression)
+ set(supported_compression_types zstd gzip none)
+ if(INPUT_mimetype_database_compression IN_LIST supported_compression_types)
+ set(compression_type ${INPUT_mimetype_database_compression})
+ else()
+ message(FATAL_ERROR "Unknown mime type database compression is set:"
+ " ${INPUT_mimetype_database_compression}\nSupported compression types:\n"
+ " ${supported_compression_types}")
+ endif()
+ if(compression_type STREQUAL "zstd" AND NOT QT_FEATURE_zstd)
+ message(FATAL_ERROR
+ "zstd compression is selected for mime type database, but the 'zstd'"
+ " feature is disabled.")
endif()
+ elseif(QT_FEATURE_zstd)
+ set(compression_type "zstd")
+ else()
+ set(compression_type "gzip")
endif()
- target_sources(Core PRIVATE ${qmimeprovider_db_output})
- set_source_files_properties(${qmimeprovider_db_output} PROPERTIES HEADER_FILE_ONLY TRUE)
- target_include_directories(Core PRIVATE "${CMAKE_CURRENT_BINARY_DIR}/.rcc")
-endif()
+ if(QT_INTERNAL_ENABLE_VERBOSE_MIME_DATABASE_COMPRESSION)
+ set(extra_mime_db_compressor_flags "--log-level=STATUS")
+ else()
+ set(extra_mime_db_compressor_flags "--log-level=NOTICE")
+ endif()
-# special case end
+ # Generate qmimeprovider_database.cpp
+ set(qmimeprovider_db_output "${CMAKE_CURRENT_BINARY_DIR}/.rcc/qmimeprovider_database.cpp")
+ add_custom_command(OUTPUT "${qmimeprovider_db_output}"
+ COMMAND ${CMAKE_COMMAND}
+ -DINPUT_FILE=${corelib_mimetypes_resource_file}
+ -DOUTPUT_FILE=${qmimeprovider_db_output}
+ -DARCHIVING_API=${archiving_api}
+ -DCOMPRESSION_TYPE=${compression_type}
+ -P "${CMAKE_CURRENT_SOURCE_DIR}/QtCompressMimeDatabase.cmake"
+ ${extra_mime_db_compressor_flags}
+ DEPENDS
+ "${CMAKE_CURRENT_SOURCE_DIR}/QtCompressMimeDatabase.cmake"
+ "${corelib_mimetypes_resource_file}"
+ VERBATIM
+ )
+
+ qt_internal_extend_target(Core
+ SOURCES ${qmimeprovider_db_output}
+ INCLUDE_DIRECTORIES "${CMAKE_CURRENT_BINARY_DIR}/.rcc"
+ )
+ set_source_files_properties(${qmimeprovider_db_output} PROPERTIES
+ GENERATED TRUE
+ HEADER_FILE_ONLY TRUE
+ )
+endif()
qt_internal_extend_target(Core CONDITION WASM
SOURCES
@@ -1265,12 +1358,18 @@ qt_internal_extend_target(Core CONDITION WASM
kernel/qeventdispatcher_wasm.cpp kernel/qeventdispatcher_wasm_p.h
)
+qt_internal_extend_target(Core CONDITION QT_FEATURE_ctf
+ SOURCES
+ tracing/qctf_p.h tracing/qctf.cpp
+ PLUGIN_TYPES
+ tracing
+)
+
+# These files are included by qmutex.cpp
set_source_files_properties(
thread/qmutex_mac.cpp
thread/qmutex_unix.cpp
- thread/qmutex_win.cpp
- PROPERTIES HEADER_FILE_ONLY ON) # special case: These files are included by qmutex.cpp!
-
+ PROPERTIES HEADER_FILE_ONLY ON)
# Remove QT_NO_CAST_TO_ASCII to ensure that the symbols are included in the library.
if(WIN32)
@@ -1283,7 +1382,7 @@ qt_internal_apply_gc_binaries_conditional(Core PUBLIC)
# Add entry-point on platforms that need it. A project can opt-out of using the
# entrypoint by setting the qt_no_entrypoint property to TRUE on a target.
-if(WIN32 OR CMAKE_SYSTEM_NAME STREQUAL "iOS")
+if(WIN32 OR UIKIT)
# find_package(Qt6Core) should call find_package(Qt6EntryPointPrivate) so that we can
# link against EntryPointPrivate. Normally this is handled automatically for deps, but
# for some reason it doesn't work for the EntryPointPrivate, so we need to add it manually.
@@ -1311,24 +1410,20 @@ if(APPLE AND CMAKE_OSX_DEPLOYMENT_TARGET)
set_property(TARGET Core APPEND PROPERTY
EXPORT_PROPERTIES "QT_DARWIN_MIN_DEPLOYMENT_TARGET")
endif()
-# special case end
-qt_internal_create_tracepoints(Core qtcore.tracepoints)
+qt_internal_generate_tracepoints(Core core
+ SOURCES
+ kernel/qcoreapplication.cpp
+ kernel/qcoreevent.cpp
+ kernel/qobject.cpp
+ plugin/qfactoryloader.cpp
+ plugin/qlibrary.cpp
+ global/qlogging.cpp
+)
qt_internal_add_docs(Core
doc/qtcore.qdocconf
)
-# special case begin
-# Handle qtzlib.pro to create headers for the
-# QtZlibPrivate target, equivalent to Qt += zlib-private
-if(NOT QT_FEATURE_system_zlib)
- qt_internal_add_module(ZlibPrivate
- INTERNAL_MODULE
- HEADER_MODULE
- NO_CONFIG_HEADER_FILE
- )
-endif()
-
qt_internal_add_optimize_full_flags()
# Copy / install an lldb python script into the QtCore.framework.dSYM bundle which searches
@@ -1357,3 +1452,35 @@ if(APPLE AND QT_FEATURE_framework AND QT_FEATURE_separate_debug_info)
DESTINATION "${dsym_script_install_dir}"
)
endif()
+
+if(IOS)
+ qt_internal_set_apple_privacy_manifest(Core
+ "${CMAKE_CURRENT_SOURCE_DIR}/platform/ios/PrivacyInfo.xcprivacy")
+endif()
+
+set(linker_script_contents "")
+if (QT_NAMESPACE STREQUAL "")
+ set(tag_symbol "qt_version_tag")
+else()
+ set(tag_symbol "qt_version_tag_${QT_NAMESPACE}")
+endif()
+foreach(minor_version RANGE ${PROJECT_VERSION_MINOR})
+ set(previous "${current}")
+ set(current "Qt_${PROJECT_VERSION_MAJOR}.${minor_version}")
+ if (minor_version EQUAL ${PROJECT_VERSION_MINOR})
+ string(APPEND linker_script_contents "${current} { ${tag_symbol}; } ${previous};\n")
+ else()
+ string(APPEND linker_script_contents "${current} {} ${previous};\n")
+ endif()
+endforeach()
+qt_internal_extend_target(Core
+ EXTRA_LINKER_SCRIPT_CONTENT "${linker_script_contents}"
+
+ # Workaround for QTBUG-117514:
+ # Function called by inline methods taking a pointer to a private class as a parameter
+ EXTRA_LINKER_SCRIPT_EXPORTS
+ # QFutureInterfaceBase::setContinuation(std::function<void (QFutureInterfaceBase const&)>, QFutureInterfaceBasePrivate*)
+ "_ZN*20QFutureInterfaceBase15setContinuationE*27QFutureInterfaceBasePrivate*"
+ # QReadWriteLock::destroyRecursive(QReadWriteLockPrivate*)
+ "_ZN*14QReadWriteLock16destroyRecursiveEP*21QReadWriteLockPrivate*"
+)
diff --git a/src/corelib/Qt6AndroidMacros.cmake b/src/corelib/Qt6AndroidMacros.cmake
index d2661022c2..6218df1947 100644
--- a/src/corelib/Qt6AndroidMacros.cmake
+++ b/src/corelib/Qt6AndroidMacros.cmake
@@ -1,3 +1,6 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+
# Generate deployment tool json
# Locate newest Android sdk build tools revision
@@ -17,6 +20,35 @@ function(_qt_internal_android_get_sdk_build_tools_revision out_var)
set(${out_var} "${android_build_tools_latest}" PARENT_SCOPE)
endfunction()
+# The function appends to the 'out_var' a 'json_property' that contains the 'tool' path. If 'tool'
+# target or its IMPORTED_LOCATION are not found the function displays warning, but is not failing
+# at the project configuring phase.
+function(_qt_internal_add_tool_to_android_deployment_settings out_var tool json_property target)
+ unset(tool_binary_path)
+ __qt_internal_get_tool_imported_location(tool_binary_path ${tool})
+ if("${tool_binary_path}" STREQUAL "")
+ # Fallback search for the tool in host bin and host libexec directories
+ find_program(tool_binary_path
+ NAMES ${tool} ${tool}.exe
+ PATHS
+ "${QT_HOST_PATH}/${QT6_HOST_INFO_BINDIR}"
+ "${QT_HOST_PATH}/${QT6_HOST_INFO_LIBEXECDIR}"
+ NO_DEFAULT_PATH
+ )
+ if(NOT tool_binary_path)
+ message(WARNING "Unable to locate ${tool}. Android package deployment of ${target}"
+ " target can be incomplete. Make sure the host Qt has ${tool} installed.")
+ return()
+ endif()
+ endif()
+
+ file(TO_CMAKE_PATH "${tool_binary_path}" tool_binary_path)
+ string(APPEND ${out_var}
+ " \"${json_property}\" : \"${tool_binary_path}\",\n")
+
+ set(${out_var} "${${out_var}}" PARENT_SCOPE)
+endfunction()
+
# Generate the deployment settings json file for a cmake target.
function(qt6_android_generate_deployment_settings target)
# Information extracted from mkspecs/features/android/android_deployment_settings.prf
@@ -41,6 +73,17 @@ function(qt6_android_generate_deployment_settings target)
_qt_is_android_generate_deployment_settings_called TRUE
)
+ get_target_property(android_executable_finalizer_called
+ ${target} _qt_android_executable_finalizer_called)
+
+ if(android_executable_finalizer_called)
+ # Don't show deprecation when called by our own function implementations.
+ else()
+ message(DEPRECATION
+ "Calling qt_android_generate_deployment_settings directly is deprecated since Qt 6.5. "
+ "Use qt_add_executable instead.")
+ endif()
+
get_target_property(target_type ${target} TYPE)
if (NOT "${target_type}" STREQUAL "MODULE_LIBRARY")
@@ -64,7 +107,7 @@ function(qt6_android_generate_deployment_settings target)
set(config_suffix "$<$<NOT:$<CONFIG:${first_config_type}>>:-$<CONFIG>>")
endif()
set(deploy_file
- "${target_binary_dir}/android-${target_output_name}-deployment-settings${config_suffix}.json")
+ "${target_binary_dir}/android-${target}-deployment-settings${config_suffix}.json")
set(file_contents "{\n")
# content begin
@@ -90,31 +133,7 @@ function(qt6_android_generate_deployment_settings target)
endif()
endif()
- set(abi_records "")
- get_target_property(qt_android_abis ${target} _qt_android_abis)
- if(NOT qt_android_abis)
- set(qt_android_abis "")
- endif()
- foreach(abi IN LISTS qt_android_abis)
- _qt_internal_get_android_abi_path(qt_abi_path ${abi})
- file(TO_CMAKE_PATH "${qt_abi_path}" qt_android_install_dir_native)
- list(APPEND abi_records "\"${abi}\": \"${qt_android_install_dir_native}\"")
- endforeach()
-
- # Required to build unit tests in developer build
- if(QT_BUILD_INTERNALS_RELOCATABLE_INSTALL_PREFIX)
- set(qt_android_install_dir "${QT_BUILD_INTERNALS_RELOCATABLE_INSTALL_PREFIX}")
- else()
- set(qt_android_install_dir "${QT6_INSTALL_PREFIX}")
- endif()
- file(TO_CMAKE_PATH "${qt_android_install_dir}" qt_android_install_dir_native)
- list(APPEND abi_records "\"${CMAKE_ANDROID_ARCH_ABI}\": \"${qt_android_install_dir_native}\"")
-
- list(JOIN abi_records "," qt_android_install_dir_records)
- set(qt_android_install_dir_records "{${qt_android_install_dir_records}}")
-
- string(APPEND file_contents
- " \"qt\": ${qt_android_install_dir_records},\n")
+ _qt_internal_collect_qt_for_android_paths(file_contents)
# Android SDK path
file(TO_CMAKE_PATH "${ANDROID_SDK_ROOT}" android_sdk_root_native)
@@ -122,12 +141,16 @@ function(qt6_android_generate_deployment_settings target)
" \"sdk\": \"${android_sdk_root_native}\",\n")
# Android SDK Build Tools Revision
- get_target_property(android_sdk_build_tools ${target} QT_ANDROID_SDK_BUILD_TOOLS_REVISION)
- if (NOT android_sdk_build_tools)
- _qt_internal_android_get_sdk_build_tools_revision(android_sdk_build_tools)
- endif()
+ _qt_internal_android_get_sdk_build_tools_revision(android_sdk_build_tools)
+ set(android_sdk_build_tools_genex "")
+ string(APPEND android_sdk_build_tools_genex
+ "$<IF:$<BOOL:$<TARGET_PROPERTY:${target},QT_ANDROID_SDK_BUILD_TOOLS_REVISION>>,"
+ "$<TARGET_PROPERTY:${target},QT_ANDROID_SDK_BUILD_TOOLS_REVISION>,"
+ "${android_sdk_build_tools}"
+ ">"
+ )
string(APPEND file_contents
- " \"sdkBuildToolsRevision\": \"${android_sdk_build_tools}\",\n")
+ " \"sdkBuildToolsRevision\": \"${android_sdk_build_tools_genex}\",\n")
# Android NDK
file(TO_CMAKE_PATH "${CMAKE_ANDROID_NDK}" android_ndk_root_native)
@@ -150,6 +173,10 @@ function(qt6_android_generate_deployment_settings target)
string(APPEND file_contents
" \"ndk-host\": \"${ANDROID_NDK_HOST_SYSTEM_NAME}\",\n")
+ get_target_property(qt_android_abis ${target} _qt_android_abis)
+ if(NOT qt_android_abis)
+ set(qt_android_abis "")
+ endif()
set(architecture_record_list "")
foreach(abi IN LISTS qt_android_abis CMAKE_ANDROID_ARCH_ABI)
if(abi STREQUAL "x86")
@@ -170,56 +197,48 @@ function(qt6_android_generate_deployment_settings target)
" \"architectures\": { ${architecture_records} },\n")
# deployment dependencies
- _qt_internal_add_android_deployment_multi_value_property(file_contents ${target}
- "QT_ANDROID_DEPLOYMENT_DEPENDENCIES" "dependencies")
+ _qt_internal_add_android_deployment_multi_value_property(file_contents "deployment-dependencies"
+ ${target} "QT_ANDROID_DEPLOYMENT_DEPENDENCIES" )
# Extra plugins
- _qt_internal_add_android_deployment_multi_value_property(file_contents ${target}
- "QT_ANDROID_EXTRA_PLUGINS" "android-extra-plugins")
+ _qt_internal_add_android_deployment_multi_value_property(file_contents "android-extra-plugins"
+ ${target} "_qt_android_native_extra_plugins" )
# Extra libs
- _qt_internal_add_android_deployment_multi_value_property(file_contents ${target}
- "QT_ANDROID_EXTRA_LIBS" "android-extra-libs")
+ _qt_internal_add_android_deployment_multi_value_property(file_contents "android-extra-libs"
+ ${target} "_qt_android_native_extra_libs" )
+
+ # Alternative path to Qt libraries on target device
+ _qt_internal_add_android_deployment_property(file_contents "android-system-libs-prefix"
+ ${target} "QT_ANDROID_SYSTEM_LIBS_PREFIX")
# package source dir
- _qt_internal_add_android_deployment_property(file_contents ${target}
- "_qt_android_native_package_source_dir" "android-package-source-directory")
+ _qt_internal_add_android_deployment_property(file_contents "android-package-source-directory"
+ ${target} "_qt_android_native_package_source_dir")
# version code
- _qt_internal_add_android_deployment_property(file_contents ${target}
- "QT_ANDROID_VERSION_CODE" "android-version-code")
+ _qt_internal_add_android_deployment_property(file_contents "android-version-code"
+ ${target} "QT_ANDROID_VERSION_CODE")
# version name
- _qt_internal_add_android_deployment_property(file_contents ${target}
- "QT_ANDROID_VERSION_NAME" "android-version-name")
+ _qt_internal_add_android_deployment_property(file_contents "android-version-name"
+ ${target} "QT_ANDROID_VERSION_NAME")
# minimum SDK version
- _qt_internal_add_android_deployment_property(file_contents ${target}
- "QT_ANDROID_MIN_SDK_VERSION" "android-min-sdk-version")
+ _qt_internal_add_android_deployment_property(file_contents "android-min-sdk-version"
+ ${target} "QT_ANDROID_MIN_SDK_VERSION")
# target SDK version
- _qt_internal_add_android_deployment_property(file_contents ${target}
- "QT_ANDROID_TARGET_SDK_VERSION" "android-target-sdk-version")
-
- # QML import paths
- if(NOT "${QT_QML_OUTPUT_DIRECTORY}" STREQUAL "")
- # Need to prepend the default qml module output directory to take precedence
- # over other qml import paths. By default QT_QML_OUTPUT_DIRECTORY is set to
- # ${CMAKE_BINARY_DIR}/android-qml for Android.
- get_target_property(native_qml_import_paths "${target}" _qt_native_qml_import_paths)
- list(PREPEND native_qml_import_paths "${QT_QML_OUTPUT_DIRECTORY}")
- set_property(TARGET "${target}" PROPERTY
- "_qt_native_qml_import_paths" "${native_qml_import_paths}")
- endif()
- _qt_internal_add_android_deployment_multi_value_property(file_contents ${target}
- "_qt_native_qml_import_paths" "qml-import-paths")
-
- # QML root paths
- file(TO_CMAKE_PATH "${target_source_dir}" native_target_source_dir)
- set_property(TARGET ${target} APPEND PROPERTY
- _qt_android_native_qml_root_paths "${native_target_source_dir}")
- _qt_internal_add_android_deployment_list_property(file_contents ${target}
- "_qt_android_native_qml_root_paths" "qml-root-path")
+ _qt_internal_add_android_deployment_property(file_contents "android-target-sdk-version"
+ ${target} "QT_ANDROID_TARGET_SDK_VERSION")
+
+ # should Qt shared libs be excluded from deployment
+ _qt_internal_add_android_deployment_property(file_contents "android-no-deploy-qt-libs"
+ ${target} "QT_ANDROID_NO_DEPLOY_QT_LIBS")
+
+ __qt_internal_collect_plugin_targets_from_dependencies("${target}" plugin_targets)
+ __qt_internal_collect_plugin_library_files("${target}" "${plugin_targets}" plugin_targets)
+ string(APPEND file_contents " \"android-deploy-plugins\":\"${plugin_targets}\",\n")
# App binary
string(APPEND file_contents
@@ -231,23 +250,15 @@ function(qt6_android_generate_deployment_settings target)
" \"android-application-arguments\": \"${QT_ANDROID_APPLICATION_ARGUMENTS}\",\n")
endif()
- # Override qmlimportscanner binary path
- set(qml_importscanner_binary_path "${QT_HOST_PATH}/${QT6_HOST_INFO_LIBEXECDIR}/qmlimportscanner")
- if (WIN32)
- string(APPEND qml_importscanner_binary_path ".exe")
+ if(COMMAND _qt_internal_generate_android_qml_deployment_settings)
+ _qt_internal_generate_android_qml_deployment_settings(file_contents ${target})
+ else()
+ string(APPEND file_contents
+ " \"qml-skip-import-scanning\": true,\n")
endif()
- file(TO_CMAKE_PATH "${qml_importscanner_binary_path}" qml_importscanner_binary_path_native)
- string(APPEND file_contents
- " \"qml-importscanner-binary\" : \"${qml_importscanner_binary_path_native}\",\n")
# Override rcc binary path
- set(rcc_binary_path "${QT_HOST_PATH}/${QT6_HOST_INFO_LIBEXECDIR}/rcc")
- if (WIN32)
- string(APPEND rcc_binary_path ".exe")
- endif()
- file(TO_CMAKE_PATH "${rcc_binary_path}" rcc_binary_path_native)
- string(APPEND file_contents
- " \"rcc-binary\" : \"${rcc_binary_path_native}\",\n")
+ _qt_internal_add_tool_to_android_deployment_settings(file_contents rcc "rcc-binary" "${target}")
# Extra prefix paths
foreach(prefix IN LISTS CMAKE_FIND_ROOT_PATH)
@@ -261,12 +272,21 @@ function(qt6_android_generate_deployment_settings target)
string(APPEND file_contents
" \"extraPrefixDirs\" : [ ${extra_prefix_list} ],\n")
+ # Create an empty target for the cases when we need to generate deployment setting but
+ # qt_finalize_project is never called.
+ if(NOT TARGET _qt_internal_apk_dependencies AND NOT QT_NO_COLLECT_BUILD_TREE_APK_DEPS)
+ add_custom_target(_qt_internal_apk_dependencies)
+ endif()
+
# Extra library paths that could be used as a dependency lookup path by androiddeployqt.
#
# Unlike 'extraPrefixDirs', the 'extraLibraryDirs' key doesn't expect the 'lib' subfolder
# when looking for dependencies.
- _qt_internal_add_android_deployment_list_property(file_contents ${target}
- "_qt_android_extra_library_dirs" "extraLibraryDirs")
+ # TODO: add a public target property accessible from user space
+ _qt_internal_add_android_deployment_list_property(file_contents "extraLibraryDirs"
+ ${target} "_qt_android_extra_library_dirs"
+ _qt_internal_apk_dependencies "_qt_android_extra_library_dirs"
+ )
if(QT_FEATURE_zstd)
set(is_zstd_enabled "true")
@@ -287,7 +307,7 @@ function(qt6_android_generate_deployment_settings target)
# content end
string(APPEND file_contents "}\n")
- file(GENERATE OUTPUT ${deploy_file} CONTENT ${file_contents})
+ file(GENERATE OUTPUT ${deploy_file} CONTENT "${file_contents}")
set_target_properties(${target}
PROPERTIES
@@ -302,6 +322,16 @@ if(NOT QT_NO_CREATE_VERSIONLESS_FUNCTIONS)
endif()
function(qt6_android_apply_arch_suffix target)
+ get_target_property(called_from_qt_impl
+ ${target} _qt_android_apply_arch_suffix_called_from_qt_impl)
+ if(called_from_qt_impl)
+ # Don't show deprecation when called by our own function implementations.
+ else()
+ message(DEPRECATION
+ "Calling qt_android_apply_arch_suffix directly is deprecated since Qt 6.5. "
+ "Use qt_add_executable or qt_add_library instead.")
+ endif()
+
get_target_property(target_type ${target} TYPE)
if (target_type STREQUAL "SHARED_LIBRARY" OR target_type STREQUAL "MODULE_LIBRARY")
set_property(TARGET "${target}" PROPERTY SUFFIX "_${CMAKE_ANDROID_ARCH_ABI}.so")
@@ -318,21 +348,75 @@ endif()
# Add custom target to package the APK
function(qt6_android_add_apk_target target)
+ # Avoid calling qt6_android_add_apk_target twice
+ get_property(apk_targets GLOBAL PROPERTY _qt_apk_targets)
+ if("${target}" IN_LIST apk_targets)
+ return()
+ endif()
+
+ get_target_property(android_executable_finalizer_called
+ ${target} _qt_android_executable_finalizer_called)
+
+ if(android_executable_finalizer_called)
+ # Don't show deprecation when called by our own function implementations.
+ else()
+ message(DEPRECATION
+ "Calling qt_android_add_apk_target directly is deprecated since Qt 6.5. "
+ "Use qt_add_executable instead.")
+ endif()
+
get_target_property(deployment_file ${target} QT_ANDROID_DEPLOYMENT_SETTINGS_FILE)
if (NOT deployment_file)
message(FATAL_ERROR "Target ${target} is not a valid android executable target\n")
endif()
+ # Use genex to get path to the deployment settings, the above check only to confirm that
+ # qt6_android_add_apk_target is called on an android executable target.
+ string(JOIN "" deployment_file
+ "$<GENEX_EVAL:"
+ "$<TARGET_PROPERTY:${target},QT_ANDROID_DEPLOYMENT_SETTINGS_FILE>"
+ ">"
+ )
# Make global apk and aab targets depend on the current apk target.
+ if(TARGET aab)
+ add_dependencies(aab ${target}_make_aab)
+ endif()
if(TARGET apk)
add_dependencies(apk ${target}_make_apk)
- add_dependencies(aab ${target}_make_aab)
_qt_internal_create_global_apk_all_target_if_needed()
endif()
set(deployment_tool "${QT_HOST_PATH}/${QT6_HOST_INFO_BINDIR}/androiddeployqt")
+ # No need to use genex for the BINARY_DIR since it's read-only.
get_target_property(target_binary_dir ${target} BINARY_DIR)
- set(apk_final_dir "${target_binary_dir}/android-build")
+
+ if($CACHE{QT_USE_TARGET_ANDROID_BUILD_DIR})
+ set(apk_final_dir "${target_binary_dir}/android-build-${target}")
+ else()
+ if(QT_USE_TARGET_ANDROID_BUILD_DIR)
+ message(WARNING "QT_USE_TARGET_ANDROID_BUILD_DIR needs to be set in CACHE")
+ endif()
+
+ get_property(known_android_build GLOBAL PROPERTY _qt_internal_known_android_build_dir)
+ get_property(already_warned GLOBAL PROPERTY _qt_internal_already_warned_android_build_dir)
+ set(apk_final_dir "${target_binary_dir}/android-build")
+ if(NOT QT_SKIP_ANDROID_BUILD_DIR_CHECK AND "${apk_final_dir}" IN_LIST known_android_build
+ AND NOT "${apk_final_dir}" IN_LIST already_warned)
+ message(WARNING "${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.txt contains multiple"
+ " Qt Android executable targets. This can lead to mixing of deployment artifacts"
+ " of targets defined there. Setting QT_USE_TARGET_ANDROID_BUILD_DIR=TRUE"
+ " allows building multiple executable targets within a single CMakeLists.txt."
+ " Note: This option is not supported by Qt Creator versions older than 13."
+ " Set QT_SKIP_ANDROID_BUILD_DIR_CHECK=TRUE to suppress this warning."
+ )
+ set_property(GLOBAL APPEND PROPERTY _qt_internal_already_warned_android_build_dir
+ "${apk_final_dir}")
+ else()
+ set_property(GLOBAL APPEND PROPERTY
+ _qt_internal_known_android_build_dir "${apk_final_dir}")
+ endif()
+ endif()
+
set(apk_file_name "${target}.apk")
set(dep_file_name "${target}.d")
set(apk_final_file_path "${apk_final_dir}/${apk_file_name}")
@@ -342,6 +426,10 @@ function(qt6_android_add_apk_target target)
set(extra_deps "")
+ if(QT_ENABLE_VERBOSE_DEPLOYMENT)
+ set(uses_terminal USES_TERMINAL)
+ endif()
+
# Plugins still might be added after creating the deployment targets.
if(NOT TARGET qt_internal_plugins)
add_custom_target(qt_internal_plugins)
@@ -353,14 +441,26 @@ function(qt6_android_add_apk_target target)
# in case DEPFILEs are not supported.
# Also the target is used to copy the library that belongs to ${target} when building multi-abi
# apk to the abi-specific directory.
+ _qt_internal_copy_file_if_different_command(copy_command
+ "$<TARGET_FILE:${target}>"
+ "${apk_final_dir}/${target_file_copy_relative_path}"
+ )
add_custom_target(${target}_prepare_apk_dir ALL
DEPENDS ${target} ${extra_deps}
- COMMAND ${CMAKE_COMMAND}
- -E copy_if_different $<TARGET_FILE:${target}>
- "${apk_final_dir}/$<TARGET_FILE_NAME:${target}>"
+ COMMAND ${copy_command}
COMMENT "Copying ${target} binary to apk folder"
+ ${uses_terminal}
)
+ set(sign_apk "")
+ if(QT_ANDROID_SIGN_APK)
+ set(sign_apk "--sign")
+ endif()
+ set(sign_aab "")
+ if(QT_ANDROID_SIGN_AAB)
+ set(sign_aab "--sign")
+ endif()
+
set(extra_args "")
if(QT_INTERNAL_NO_ANDROID_RCC_BUNDLE_CLEANUP)
list(APPEND extra_args "--no-rcc-bundle-cleanup")
@@ -369,14 +469,28 @@ function(qt6_android_add_apk_target target)
list(APPEND extra_args "--verbose")
endif()
- # The DEPFILE argument to add_custom_command is only available with Ninja or CMake>=3.20 and
- # make.
- set(has_depfile_support FALSE)
- if(CMAKE_GENERATOR MATCHES "Ninja" OR
- (CMAKE_VERSION VERSION_GREATER_EQUAL 3.20 AND CMAKE_GENERATOR MATCHES "Makefiles"))
- set(has_depfile_support TRUE)
+ if(QT_ANDROID_DEPLOY_RELEASE)
+ message(WARNING "QT_ANDROID_DEPLOY_RELEASE is not a valid Qt variable."
+ " Please set QT_ANDROID_DEPLOYMENT_TYPE to RELEASE instead.")
+ endif()
+ # Setting QT_ANDROID_DEPLOYMENT_TYPE to a value other than Release disables
+ # release package signing regardless of the build type.
+ if(QT_ANDROID_DEPLOYMENT_TYPE)
+ string(TOUPPER "${QT_ANDROID_DEPLOYMENT_TYPE}" deployment_type_upper)
+ if("${deployment_type_upper}" STREQUAL "RELEASE")
+ list(APPEND extra_args "--release")
+ endif()
+ elseif(NOT QT_BUILD_TESTS)
+ # Workaround for tests: do not set automatically --release flag if QT_BUILD_TESTS is set.
+ # Release package need to be signed. Signing is currently not supported by CI.
+ # What is more, also androidtestrunner is not working on release APKs,
+ # For example running "adb shell run-as" on release APK will finish with the error:
+ # run-as: Package '[PACKAGE-NAME]' is not debuggable
+ list(APPEND extra_args $<$<OR:$<CONFIG:Release>,$<CONFIG:RelWithDebInfo>,$<CONFIG:MinSizeRel>>:--release>)
endif()
+ _qt_internal_check_depfile_support(has_depfile_support)
+
if(has_depfile_support)
cmake_policy(PUSH)
if(POLICY CMP0116)
@@ -402,9 +516,12 @@ function(qt6_android_add_apk_target target)
--depfile "${dep_file_path}"
--builddir "${relative_to_dir}"
${extra_args}
+ ${sign_apk}
COMMENT "Creating APK for ${target}"
DEPENDS "${target}" "${deployment_file}" ${extra_deps}
DEPFILE "${dep_file_path}"
+ VERBATIM
+ ${uses_terminal}
)
cmake_policy(POP)
@@ -418,7 +535,10 @@ function(qt6_android_add_apk_target target)
--output ${apk_final_dir}
--apk ${apk_final_file_path}
${extra_args}
+ ${sign_apk}
COMMENT "Creating APK for ${target}"
+ VERBATIM
+ ${uses_terminal}
)
endif()
@@ -432,8 +552,10 @@ function(qt6_android_add_apk_target target)
--output ${apk_final_dir}
--apk ${apk_final_file_path}
--aab
+ ${sign_aab}
${extra_args}
COMMENT "Creating AAB for ${target}"
+ ${uses_terminal}
)
if(QT_IS_ANDROID_MULTI_ABI_EXTERNAL_PROJECT)
@@ -450,6 +572,10 @@ function(qt6_android_add_apk_target target)
file(RELATIVE_PATH androiddeployqt_output_path "${CMAKE_BINARY_DIR}" "${apk_final_dir}")
set(androiddeployqt_output_path
"${QT_INTERNAL_ANDROID_MULTI_ABI_BINARY_DIR}/${androiddeployqt_output_path}")
+ _qt_internal_copy_file_if_different_command(copy_command
+ "$<TARGET_FILE:${target}>"
+ "${androiddeployqt_output_path}/${target_file_copy_relative_path}"
+ )
if(has_depfile_support)
set(deploy_android_deps_dir "${apk_final_dir}/${target}_deploy_android")
set(timestamp_file "${deploy_android_deps_dir}/timestamp")
@@ -458,9 +584,7 @@ function(qt6_android_add_apk_target target)
DEPENDS ${target} ${extra_deps}
COMMAND ${CMAKE_COMMAND} -E make_directory "${deploy_android_deps_dir}"
COMMAND ${CMAKE_COMMAND} -E touch "${timestamp_file}"
- COMMAND ${CMAKE_COMMAND}
- -E copy_if_different $<TARGET_FILE:${target}>
- "${androiddeployqt_output_path}/${target_file_copy_relative_path}"
+ COMMAND ${copy_command}
COMMAND ${deployment_tool}
--input ${deployment_file}
--output ${androiddeployqt_output_path}
@@ -470,27 +594,29 @@ function(qt6_android_add_apk_target target)
--builddir "${CMAKE_BINARY_DIR}"
COMMENT "Resolving ${CMAKE_ANDROID_ARCH_ABI} dependencies for the ${target} APK"
DEPFILE "${dep_file}"
+ VERBATIM
+ ${uses_terminal}
)
add_custom_target(qt_internal_${target}_copy_apk_dependencies
DEPENDS "${timestamp_file}")
else()
add_custom_target(qt_internal_${target}_copy_apk_dependencies
DEPENDS ${target} ${extra_deps}
- COMMAND ${CMAKE_COMMAND}
- -E copy_if_different $<TARGET_FILE:${target}>
- "${androiddeployqt_output_path}/${target_file_copy_relative_path}"
+ COMMAND ${copy_command}
COMMAND ${deployment_tool}
--input ${deployment_file}
--output ${androiddeployqt_output_path}
--copy-dependencies-only
${extra_args}
COMMENT "Resolving ${CMAKE_ANDROID_ARCH_ABI} dependencies for the ${target} APK"
+ ${uses_terminal}
)
endif()
endif()
set_property(GLOBAL APPEND PROPERTY _qt_apk_targets ${target})
- _qt_internal_collect_target_apk_dependencies_defer(${target})
+ _qt_internal_collect_apk_dependencies_defer()
+ _qt_internal_collect_apk_imported_dependencies_defer("${target}")
endfunction()
function(_qt_internal_create_global_android_targets)
@@ -516,28 +642,29 @@ endfunction()
# The function collects all known non-imported shared libraries that are created in the build tree.
# It uses the CMake DEFER CALL feature if the CMAKE_VERSION is greater
-# than or equal to 3.18.
-# Note: Users that use cmake version less that 3.18 need to call qt_finalize_project
+# than or equal to 3.19.
+# Note: Users that use cmake version less that 3.19 need to call qt_finalize_project
# in the end of a project's top-level CMakeLists.txt.
-function(_qt_internal_collect_target_apk_dependencies_defer target)
+function(_qt_internal_collect_apk_dependencies_defer)
# User opted-out the functionality
if(QT_NO_COLLECT_BUILD_TREE_APK_DEPS)
return()
endif()
- get_property(is_called GLOBAL PROPERTY _qt_is_collect_target_apk_dependencies_defer_called)
+ get_property(is_called GLOBAL PROPERTY _qt_is_collect_apk_dependencies_defer_called)
if(is_called) # Already scheduled
return()
endif()
- set_property(GLOBAL PROPERTY _qt_is_collect_target_apk_dependencies_defer_called TRUE)
+ set_property(GLOBAL PROPERTY _qt_is_collect_apk_dependencies_defer_called TRUE)
- if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.18")
+ if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.19")
cmake_language(EVAL CODE "cmake_language(DEFER DIRECTORY \"${CMAKE_SOURCE_DIR}\"
- CALL _qt_internal_collect_target_apk_dependencies ${target})")
+ CALL _qt_internal_collect_apk_dependencies)")
else()
# User don't want to see the warning
if(NOT QT_NO_WARN_BUILD_TREE_APK_DEPS)
- message(WARNING "CMake version you use is less than 3.18. APK dependencies, that are a"
+ message(WARNING
+ "The CMake version you use is less than 3.19. APK dependencies, that are a"
" part of the project tree, might not be collected correctly."
" Please call qt_finalize_project in the end of a project's top-level"
" CMakeLists.txt file to make sure that all the APK dependencies are"
@@ -548,23 +675,25 @@ function(_qt_internal_collect_target_apk_dependencies_defer target)
endif()
endfunction()
-# The function collects shared libraries from the build system tree, that might be dependencies for
-# the main apk targets.
-function(_qt_internal_collect_target_apk_dependencies target)
+# The function collects project-built shared libraries that might be dependencies for
+# the main apk targets. It stores their locations in a global custom target property.
+function(_qt_internal_collect_apk_dependencies)
# User opted-out the functionality
if(QT_NO_COLLECT_BUILD_TREE_APK_DEPS)
return()
endif()
- get_property(is_called GLOBAL PROPERTY _qt_is_collect_target_apk_dependencies_called)
+ get_property(is_called GLOBAL PROPERTY _qt_is_collect_apk_dependencies_called)
if(is_called)
return()
endif()
- set_property(GLOBAL PROPERTY _qt_is_collect_target_apk_dependencies_called TRUE)
+ set_property(GLOBAL PROPERTY _qt_is_collect_apk_dependencies_called TRUE)
get_property(apk_targets GLOBAL PROPERTY _qt_apk_targets)
- _qt_internal_collect_buildsystem_shared_libraries(libs "${CMAKE_SOURCE_DIR}")
+ _qt_internal_collect_buildsystem_targets(libs
+ "${CMAKE_SOURCE_DIR}" INCLUDE SHARED_LIBRARY MODULE_LIBRARY)
+ list(REMOVE_DUPLICATES libs)
if(NOT TARGET qt_internal_plugins)
add_custom_target(qt_internal_plugins)
@@ -572,7 +701,7 @@ function(_qt_internal_collect_target_apk_dependencies target)
foreach(lib IN LISTS libs)
if(NOT lib IN_LIST apk_targets)
- list(APPEND extra_prefix_dirs "$<TARGET_FILE_DIR:${lib}>")
+ list(APPEND extra_library_dirs "$<TARGET_FILE_DIR:${lib}>")
get_target_property(target_type ${lib} TYPE)
# We collect all MODULE_LIBRARY targets since target APK may have implicit dependency
# to the plugin that will cause the runtime issue. Plugins that were added using
@@ -584,27 +713,85 @@ function(_qt_internal_collect_target_apk_dependencies target)
endif()
endforeach()
- set_target_properties(${target} PROPERTIES _qt_android_extra_library_dirs "${extra_prefix_dirs}")
+ if(NOT TARGET _qt_internal_apk_dependencies)
+ add_custom_target(_qt_internal_apk_dependencies)
+ endif()
+ set_target_properties(_qt_internal_apk_dependencies PROPERTIES
+ _qt_android_extra_library_dirs "${extra_library_dirs}"
+ )
+endfunction()
+
+# This function collects all imported shared libraries that might be dependencies for
+# the main apk targets. The actual collection is deferred until the target's directory scope
+# is processed.
+# The function requires CMake 3.21 or later.
+function(_qt_internal_collect_apk_imported_dependencies_defer target)
+ # User opted-out of the functionality.
+ if(QT_NO_COLLECT_IMPORTED_TARGET_APK_DEPS)
+ return()
+ endif()
+
+ get_target_property(target_source_dir "${target}" SOURCE_DIR)
+ if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.21")
+ cmake_language(EVAL CODE "cmake_language(DEFER DIRECTORY \"${target_source_dir}\"
+ CALL _qt_internal_collect_apk_imported_dependencies \"${target}\")")
+ endif()
endfunction()
-# The function recursively goes through the project subfolders and collects targets that supposed to
-# be shared libraries of any kind.
-function(_qt_internal_collect_buildsystem_shared_libraries out_var subdir)
+# This function collects imported shared libraries that might be dependencies for
+# the main apk targets. It stores their locations on a custom target property for the given target.
+# The function requires CMake 3.21 or later.
+function(_qt_internal_collect_apk_imported_dependencies target)
+ # User opted-out the functionality
+ if(QT_NO_COLLECT_IMPORTED_TARGET_APK_DEPS)
+ return()
+ endif()
+
+ get_target_property(target_source_dir "${target}" SOURCE_DIR)
+ _qt_internal_collect_imported_shared_libraries_recursive(libs "${target_source_dir}")
+ list(REMOVE_DUPLICATES libs)
+
+ foreach(lib IN LISTS libs)
+ list(APPEND extra_library_dirs "$<TARGET_FILE_DIR:${lib}>")
+ endforeach()
+
+ set_property(TARGET "${target}" APPEND PROPERTY
+ _qt_android_extra_library_dirs "${extra_library_dirs}"
+ )
+endfunction()
+
+# This function recursively walks the current directory and its parent directories to collect
+# imported shared library targets.
+# The recursion goes upwards instead of downwards because imported targets are usually not global,
+# and we can't call get_target_property() on a target which is not available in the current
+# directory or parent scopes.
+# We also can't cache parent directories because the imported targets in a parent directory
+# might change in-between collection calls.
+# The function requires CMake 3.21 or later.
+function(_qt_internal_collect_imported_shared_libraries_recursive out_var subdir)
set(result "")
- get_directory_property(buildsystem_targets DIRECTORY ${subdir} BUILDSYSTEM_TARGETS)
- foreach(buildsystem_target IN LISTS buildsystem_targets)
- if(buildsystem_target AND TARGET ${buildsystem_target})
- get_target_property(target_type ${buildsystem_target} TYPE)
- if(target_type STREQUAL "SHARED_LIBRARY" OR target_type STREQUAL "MODULE_LIBRARY")
- list(APPEND result ${buildsystem_target})
+
+ get_directory_property(imported_targets DIRECTORY "${subdir}" IMPORTED_TARGETS)
+ foreach(imported_target IN LISTS imported_targets)
+ get_target_property(target_type "${imported_target}" TYPE)
+ if(target_type STREQUAL "SHARED_LIBRARY" OR target_type STREQUAL "MODULE_LIBRARY")
+ # If the target has the _qt_package_version property set, it means it's an
+ # 'official' qt target like a module or plugin, so we don't want to add it
+ # to the list of extra paths to scan for in androiddeployqt, because they are
+ # already handled via the regular 'qt' code path in the androiddeployqt.
+ # Thus this will pick up only non-qt 3rd party targets.
+ get_target_property(qt_package_version "${imported_target}" _qt_package_version)
+ if(NOT qt_package_version)
+ list(APPEND result "${imported_target}")
endif()
endif()
endforeach()
- get_directory_property(subdirs DIRECTORY "${subdir}" SUBDIRECTORIES)
- foreach(dir IN LISTS subdirs)
- _qt_internal_collect_buildsystem_shared_libraries(result_inner "${dir}")
- endforeach()
+ get_directory_property(parent_dir DIRECTORY "${subdir}" PARENT_DIRECTORY)
+ if(parent_dir)
+ _qt_internal_collect_imported_shared_libraries_recursive(result_inner "${parent_dir}")
+ endif()
+
list(APPEND result ${result_inner})
set(${out_var} "${result}" PARENT_SCOPE)
endfunction()
@@ -644,8 +831,8 @@ endfunction()
# The function converts the target property to a json record and appends it to the output
# variable.
-function(_qt_internal_add_android_deployment_property out_var target property json_key)
- set(property_genex "$<TARGET_PROPERTY:${target},${property}>")
+function(_qt_internal_add_android_deployment_property out_var json_key target property)
+ set(property_genex "$<GENEX_EVAL:$<TARGET_PROPERTY:${target},${property}>>")
string(APPEND ${out_var}
"$<$<BOOL:${property_genex}>:"
" \"${json_key}\": \"${property_genex}\"\,\n"
@@ -655,25 +842,59 @@ function(_qt_internal_add_android_deployment_property out_var target property js
set(${out_var} "${${out_var}}" PARENT_SCOPE)
endfunction()
-# The function converts the target list property to a json list record and appends it to the output
-# variable.
+# The function converts the list properties of the targets to a json list record and appends it
+# to the output variable.
+# _qt_internal_add_android_deployment_list_property(out_var json_key [<target> <property>]...)
# The generated JSON object is the normal JSON array, e.g.:
# "qml-root-path": ["qml/root/path1","qml/root/path2"],
-function(_qt_internal_add_android_deployment_list_property out_var target property json_key)
- set(property_genex
- "$<TARGET_PROPERTY:${target},${property}>"
- )
- set(add_quote_genex
- "$<$<BOOL:${property_genex}>:\">"
- )
- string(JOIN "" list_join_genex
- "${add_quote_genex}"
- "$<JOIN:"
- "$<GENEX_EVAL:${property_genex}>,"
- "\",\""
- ">"
- "${add_quote_genex}"
- )
+function(_qt_internal_add_android_deployment_list_property out_var json_key)
+ list(LENGTH ARGN argn_count)
+ math(EXPR is_odd "${argn_count} % 2")
+ if(is_odd)
+ message(FATAL_ERROR "Invalid argument count")
+ endif()
+
+ set(skip_next FALSE)
+ set(property_genex "")
+ math(EXPR last_index "${argn_count} - 1")
+ foreach(idx RANGE ${last_index})
+ if(skip_next)
+ set(skip_next FALSE)
+ continue()
+ endif()
+ set(skip_next TRUE)
+
+ math(EXPR property_idx "${idx} + 1")
+ list(GET ARGN ${idx} target)
+ list(GET ARGN ${property_idx} property)
+
+ # Add comma if we have at least one element from the previous iteration
+ if(property_genex)
+ set(add_comma_genex
+ "$<$<BOOL:${property_genex}>:$<COMMA>>"
+ )
+ endif()
+
+ set(property_genex
+ "$<GENEX_EVAL:$<TARGET_PROPERTY:${target},${property}>>"
+ )
+ set(add_quote_genex
+ "$<$<BOOL:${property_genex}>:\">"
+ )
+
+ # Add comma only if next property genex contains non-empty value.
+ set(add_comma_genex "$<$<BOOL:${property_genex}>:${add_comma_genex}>")
+ string(JOIN "" list_join_genex
+ "${list_join_genex}"
+ "${add_comma_genex}${add_quote_genex}"
+ "$<JOIN:"
+ "${property_genex},"
+ "\"$<COMMA>\""
+ ">"
+ "${add_quote_genex}"
+ )
+ endforeach()
+
string(APPEND ${out_var}
" \"${json_key}\" : [ ${list_join_genex} ],\n")
set(${out_var} "${${out_var}}" PARENT_SCOPE)
@@ -684,14 +905,14 @@ endfunction()
# The generated JSON object is a simple string with the list property items separated by commas,
# e.g:
# "android-extra-plugins": "plugin1,plugin2",
-function(_qt_internal_add_android_deployment_multi_value_property out_var target property json_key)
+function(_qt_internal_add_android_deployment_multi_value_property out_var json_key target property)
set(property_genex
- "$<TARGET_PROPERTY:${target},${property}>"
+ "$<GENEX_EVAL:$<TARGET_PROPERTY:${target},${property}>>"
)
string(JOIN "" list_join_genex
"$<JOIN:"
- "$<GENEX_EVAL:${property_genex}>,"
- ","
+ "${property_genex},"
+ "$<COMMA>"
">"
)
string(APPEND ${out_var}
@@ -707,20 +928,102 @@ endfunction()
# It doesn't overwrite public properties, but instead writes formatted values to internal
# properties.
function(_qt_internal_android_format_deployment_paths target)
- _qt_internal_android_format_deployment_path_property(${target}
- QT_QML_IMPORT_PATH _qt_native_qml_import_paths)
+ if(QT_BUILD_STANDALONE_TESTS OR QT_BUILDING_QT OR QT_INTERNAL_IS_STANDALONE_TEST)
+ set(android_deployment_paths_policy NEW)
+ else()
+ set(policy_path_properties
+ QT_QML_IMPORT_PATH
+ QT_QML_ROOT_PATH
+ QT_ANDROID_PACKAGE_SOURCE_DIR
+ QT_ANDROID_EXTRA_PLUGINS
+ QT_ANDROID_EXTRA_LIBS
+ )
+
+ # Check if any of paths contains the value and stop the evaluation if all properties are
+ # empty or -NOTFOUND
+ set(has_android_paths FALSE)
+ foreach(prop_name IN LISTS policy_path_properties)
+ get_target_property(prop_value ${target} ${prop_name})
+ if(prop_value)
+ set(has_android_paths TRUE)
+ break()
+ endif()
+ endforeach()
+ if(has_android_paths)
+ __qt_internal_setup_policy(QTP0002 "6.6.0"
+ "Target properties that specify android-specific paths may contain generator\
+ expressions but they must evaluate to valid JSON strings.\
+ Check https://doc.qt.io/qt-6/qt-cmake-policy-qtp0002.html for policy details."
+ )
+ qt6_policy(GET QTP0002 android_deployment_paths_policy)
+ endif()
+ endif()
+ if(android_deployment_paths_policy STREQUAL "NEW")
+ # When building standalone tests or Qt itself we obligate developers to not use
+ # windows paths when setting QT_* properties below, so their values are used as is when
+ # generating deployment settings.
+ string(JOIN "" qml_root_path_genex
+ "$<GENEX_EVAL:$<TARGET_PROPERTY:${target},QT_QML_ROOT_PATH>>"
+ "$<"
+ "$<AND:"
+ "$<BOOL:$<GENEX_EVAL:$<TARGET_PROPERTY:${target},QT_QML_ROOT_PATH>>>,"
+ "$<BOOL:$<GENEX_EVAL:$<TARGET_PROPERTY:${target},_qt_internal_qml_root_path>>>"
+ ">:;"
+ ">"
+ "$<GENEX_EVAL:$<TARGET_PROPERTY:${target},_qt_internal_qml_root_path>>"
+ )
+ set_target_properties(${target} PROPERTIES
+ _qt_native_qml_import_paths
+ "$<GENEX_EVAL:$<TARGET_PROPERTY:${target},QT_QML_IMPORT_PATH>>"
+ _qt_android_native_qml_root_paths
+ "${qml_root_path_genex}"
+ _qt_android_native_package_source_dir
+ "$<GENEX_EVAL:$<TARGET_PROPERTY:${target},QT_ANDROID_PACKAGE_SOURCE_DIR>>"
+ _qt_android_native_extra_plugins
+ "$<GENEX_EVAL:$<TARGET_PROPERTY:${target},QT_ANDROID_EXTRA_PLUGINS>>"
+ _qt_android_native_extra_libs
+ "$<GENEX_EVAL:$<TARGET_PROPERTY:${target},QT_ANDROID_EXTRA_LIBS>>"
+ )
+ else()
+ # User projects still may use windows paths inside the QT_* properties below, with
+ # obligation to run the finalizer code.
+ _qt_internal_android_format_deployment_path_property(${target}
+ QT_QML_IMPORT_PATH _qt_native_qml_import_paths)
+
+ _qt_internal_android_format_deployment_path_property(${target}
+ QT_QML_ROOT_PATH _qt_android_native_qml_root_paths)
- _qt_internal_android_format_deployment_path_property(${target}
- QT_QML_ROOT_PATH _qt_android_native_qml_root_paths)
+ _qt_internal_android_format_deployment_path_property(${target}
+ _qt_internal_qml_root_path _qt_android_native_qml_root_paths APPEND)
- _qt_internal_android_format_deployment_path_property(${target}
- QT_ANDROID_PACKAGE_SOURCE_DIR _qt_android_native_package_source_dir)
+ _qt_internal_android_format_deployment_path_property(${target}
+ QT_ANDROID_PACKAGE_SOURCE_DIR _qt_android_native_package_source_dir)
+
+ _qt_internal_android_format_deployment_path_property(${target}
+ QT_ANDROID_EXTRA_PLUGINS _qt_android_native_extra_plugins)
+
+ _qt_internal_android_format_deployment_path_property(${target}
+ QT_ANDROID_EXTRA_LIBS _qt_android_native_extra_libs)
+ endif()
endfunction()
# The function converts the value of target property to JSON compatible path and writes the
# result to out_property. Property might be either single value, semicolon separated list or system
# path spec.
+# The APPEND argument controls the property is set. The argument should be added after all
+# the required arguments.
function(_qt_internal_android_format_deployment_path_property target property out_property)
+ set(should_append "")
+ if(ARGC EQUAL 4)
+ if("${ARGV3}" STREQUAL "APPEND")
+ set(should_append APPEND)
+ else()
+ message(FATAL_ERROR "Unexpected argument ${ARGV3}")
+ endif()
+ elseif(ARGC GREATER 4)
+ message(FATAL_ERROR "Unexpected arguments ${ARGN}")
+ endif()
+
get_target_property(_paths ${target} ${property})
if(_paths)
set(native_paths "")
@@ -728,7 +1031,7 @@ function(_qt_internal_android_format_deployment_path_property target property ou
file(TO_CMAKE_PATH "${_path}" _path)
list(APPEND native_paths "${_path}")
endforeach()
- set_target_properties(${target} PROPERTIES
+ set_property(TARGET ${target} ${should_append} PROPERTY
${out_property} "${native_paths}")
endif()
endfunction()
@@ -747,8 +1050,15 @@ endif()
# |__ android_armv7
# |__ android_x86
# |__ android_x86_64
-function(_qt_internal_get_android_abi_path out_path abi)
- if(DEFINED QT_PATH_ANDROID_ABI_${abi})
+function(_qt_internal_get_android_abi_prefix_path out_path abi)
+ if(CMAKE_ANDROID_ARCH_ABI STREQUAL abi)
+ # Required to build unit tests in developer build
+ if(QT_BUILD_INTERNALS_RELOCATABLE_INSTALL_PREFIX)
+ set(${out_path} "${QT_BUILD_INTERNALS_RELOCATABLE_INSTALL_PREFIX}")
+ else()
+ set(${out_path} "${QT6_INSTALL_PREFIX}")
+ endif()
+ elseif(DEFINED QT_PATH_ANDROID_ABI_${abi})
get_filename_component(${out_path} "${QT_PATH_ANDROID_ABI_${abi}}" ABSOLUTE)
else()
# Map the ABI value to the Qt for Android folder.
@@ -768,9 +1078,87 @@ function(_qt_internal_get_android_abi_path out_path abi)
set(${out_path} "${${out_path}}" PARENT_SCOPE)
endfunction()
-# The function collects list of existing Qt for Android using _qt_internal_get_android_abi_path
-# and pre-defined set of known Android ABIs. The result is written to QT_DEFAULT_ANDROID_ABIS
-# cache variable.
+function(_qt_internal_get_android_abi_cmake_dir_path out_path abi)
+ if(DEFINED QT_ANDROID_PATH_CMAKE_DIR_${abi})
+ set(cmake_dir "${QT_ANDROID_PATH_CMAKE_DIR_${abi}}")
+ else()
+ _qt_internal_get_android_abi_prefix_path(prefix_path ${abi})
+ if((PROJECT_NAME STREQUAL "QtBase" OR QT_SUPERBUILD) AND QT_BUILDING_QT AND
+ NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_INTERNAL_IS_STANDALONE_TEST)
+ set(cmake_dir "${QT_CONFIG_BUILD_DIR}")
+ else()
+ string(TOUPPER "${QT_CMAKE_EXPORT_NAMESPACE}" export_namespace_upper)
+ set(cmake_dir "${prefix_path}/${${export_namespace_upper}_INSTALL_LIBS}/cmake")
+ endif()
+ endif()
+
+ set(${out_path} "${cmake_dir}" PARENT_SCOPE)
+endfunction()
+
+function(_qt_internal_get_android_abi_toolchain_path out_path abi)
+ set(toolchain_path "${QT_CMAKE_EXPORT_NAMESPACE}/qt.toolchain.cmake")
+ _qt_internal_get_android_abi_cmake_dir_path(cmake_dir ${abi})
+ get_filename_component(toolchain_path
+ "${cmake_dir}/${toolchain_path}" ABSOLUTE)
+ set(${out_path} "${toolchain_path}" PARENT_SCOPE)
+endfunction()
+
+function(_qt_internal_get_android_abi_subdir_path out_path subdir abi)
+ set(install_paths_path "${QT_CMAKE_EXPORT_NAMESPACE}/QtInstallPaths.cmake")
+ _qt_internal_get_android_abi_cmake_dir_path(cmake_dir ${abi})
+ include("${cmake_dir}/${install_paths_path}")
+ set(${out_path} "${${subdir}}" PARENT_SCOPE)
+endfunction()
+
+function(_qt_internal_collect_qt_for_android_paths out_var)
+ get_target_property(qt_android_abis ${target} _qt_android_abis)
+ if(NOT qt_android_abis)
+ set(qt_android_abis "")
+ endif()
+
+ set(custom_qt_paths data libexecs libs plugins qml)
+ foreach(type IN ITEMS prefix ${custom_qt_paths})
+ set(${type}_records "")
+ endforeach()
+
+ foreach(abi IN LISTS qt_android_abis CMAKE_ANDROID_ARCH_ABI)
+ _qt_internal_get_android_abi_prefix_path(qt_abi_prefix_path ${abi})
+ file(TO_CMAKE_PATH "${qt_abi_prefix_path}" qt_abi_prefix_path)
+ get_filename_component(qt_abi_prefix_path "${qt_abi_prefix_path}" ABSOLUTE)
+ list(APPEND prefix_records " \"${abi}\": \"${qt_abi_prefix_path}\"")
+ foreach(type IN ITEMS ${custom_qt_paths})
+ string(TOUPPER "${type}" upper_case_type)
+ _qt_internal_get_android_abi_subdir_path(qt_abi_path
+ QT6_INSTALL_${upper_case_type} ${abi})
+ list(APPEND ${type}_records
+ " \"${abi}\": \"${qt_abi_path}\"")
+ endforeach()
+ endforeach()
+
+ foreach(type IN ITEMS prefix ${custom_qt_paths})
+ list(JOIN ${type}_records ",\n" ${type}_records_string)
+ set(${type}_records_string "{\n${${type}_records_string}\n }")
+ endforeach()
+
+ string(APPEND ${out_var}
+ " \"qt\": ${prefix_records_string},\n")
+ string(APPEND ${out_var}
+ " \"qtDataDirectory\": ${data_records_string},\n")
+ string(APPEND ${out_var}
+ " \"qtLibExecsDirectory\": ${libexecs_records_string},\n")
+ string(APPEND ${out_var}
+ " \"qtLibsDirectory\": ${libs_records_string},\n")
+ string(APPEND ${out_var}
+ " \"qtPluginsDirectory\": ${plugins_records_string},\n")
+ string(APPEND ${out_var}
+ " \"qtQmlDirectory\": ${qml_records_string},\n")
+
+ set(${out_var} "${${out_var}}" PARENT_SCOPE)
+endfunction()
+
+# The function collects list of existing Qt for Android using
+# _qt_internal_get_android_abi_prefix_path and pre-defined set of known Android ABIs. The result is
+# written to QT_DEFAULT_ANDROID_ABIS cache variable.
# Note that QT_DEFAULT_ANDROID_ABIS is not intended to be set outside the function and will be
# rewritten.
function(_qt_internal_collect_default_android_abis)
@@ -778,9 +1166,9 @@ function(_qt_internal_collect_default_android_abis)
set(default_abis)
foreach(abi IN LISTS known_android_abis)
- _qt_internal_get_android_abi_path(qt_abi_path ${abi})
+ _qt_internal_get_android_abi_toolchain_path(qt_abi_toolchain_path ${abi})
# It's expected that Qt for Android contains ABI specific toolchain file.
- if(EXISTS "${qt_abi_path}/lib/cmake/${QT_CMAKE_EXPORT_NAMESPACE}/qt.toolchain.cmake"
+ if(EXISTS "${qt_abi_toolchain_path}"
OR CMAKE_ANDROID_ARCH_ABI STREQUAL abi)
list(APPEND default_abis ${abi})
endif()
@@ -795,3 +1183,331 @@ function(_qt_internal_collect_default_android_abis)
"Build project using the list of autodetected Qt for Android ABIs"
)
endfunction()
+
+# Returns a path to the timestamp file for the specific step of the multi-ABI Android project
+function(_qt_internal_get_android_abi_step_stampfile out project abi step)
+ get_target_property(build_dir ${project} _qt_android_build_directory)
+ get_property(is_multi GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
+ if(is_multi)
+ set(${out} "${build_dir}/$<CONFIG>/${project}_${step}_stamp" PARENT_SCOPE)
+ else()
+ set(${out} "${build_dir}/${project}_${step}_stamp" PARENT_SCOPE)
+ endif()
+endfunction()
+
+# Creates the multi-ABI Android projects and assigns the JOB_POOL to them if it's possible
+function(_qt_internal_add_android_abi_project project abi)
+ add_custom_target(${project})
+
+ set(build_dir "${CMAKE_BINARY_DIR}/android_abi_builds/${abi}")
+ set_target_properties(${project} PROPERTIES
+ _qt_android_build_directory "${build_dir}"
+ )
+
+ file(MAKE_DIRECTORY "${build_dir}")
+ if(CMAKE_GENERATOR MATCHES "^Ninja")
+ set_property(GLOBAL APPEND PROPERTY JOB_POOLS _qt_android_${project}_pool=1)
+ endif()
+endfunction()
+
+# Adds the custom build step to the multi-ABI Android project
+function(_qt_internal_add_android_abi_step project abi step)
+ cmake_parse_arguments(arg "" "" "COMMAND;DEPENDS" ${ARGV})
+
+ if(NOT arg_COMMAND)
+ message(FATAL_ERROR "COMMAND is not set for ${project} step ${step} Android ABI ${abi}.")
+ endif()
+
+ set(dep_stamps "")
+ foreach(dep ${arg_DEPENDS})
+ _qt_internal_get_android_abi_step_stampfile(stamp ${project} ${abi} ${dep})
+ list(APPEND dep_stamps "${stamp}")
+ endforeach()
+
+ get_target_property(build_dir ${project} _qt_android_build_directory)
+
+ if(CMAKE_GENERATOR MATCHES "^Ninja")
+ set(add_to_pool JOB_POOL _qt_android_${project}_pool)
+ else()
+ set(add_to_pool "")
+ endif()
+
+ _qt_internal_get_android_abi_step_stampfile(stamp ${project} ${abi} ${step})
+ add_custom_command(OUTPUT "${stamp}"
+ COMMAND ${arg_COMMAND}
+ COMMAND "${CMAKE_COMMAND}" -E touch "${stamp}"
+ ${add_to_pool}
+ DEPENDS
+ ${dep_stamps}
+ WORKING_DIRECTORY
+ "${build_dir}"
+ VERBATIM
+ )
+ add_custom_target("${project}_${step}" DEPENDS "${stamp}")
+
+ get_target_property(known_steps ${project} _qt_android_abi_steps)
+ if(NOT CMAKE_GENERATOR MATCHES "^Ninja")
+ if(NOT QT_NO_WARN_ANDROID_MULTI_ABI_GENERATOR)
+ get_property(is_warned GLOBAL PROPERTY _qt_internal_warn_android_multi_abi_generator)
+ if(NOT is_warned)
+ set_property(GLOBAL PROPERTY _qt_internal_warn_android_multi_abi_generator TRUE)
+ message(WARNING "Building Multi-ABI Qt projects with the '${CMAKE_GENERATOR}'"
+ " generator has limitations. All targets from non-main ABI will be built"
+ " unconditionally. Please use the 'Ninja' or 'Ninja Multi-config' generators"
+ " with ninja build instead. Set QT_NO_WARN_ANDROID_MULTI_ABI_GENERATOR to"
+ " 'TRUE' to suppress this warning."
+ )
+ endif()
+ endif()
+ if(known_steps)
+ list(GET known_steps 0 first)
+ add_dependencies(${first} ${project}_${step})
+ endif()
+ endif()
+
+ list(PREPEND known_steps ${project}_${step})
+ set_target_properties(${project} PROPERTIES _qt_android_abi_steps "${known_steps}")
+endfunction()
+
+# The function configures external projects for ABIs that target packages need to build with.
+# Each target adds build step to the external project that is linked to the
+# qt_internal_android_${abi}-${target}_build target in the primary ABI build tree.
+function(_qt_internal_configure_android_multiabi_target target)
+ # Functionality is only applicable for the primary ABI
+ if(QT_IS_ANDROID_MULTI_ABI_EXTERNAL_PROJECT)
+ return()
+ endif()
+
+ get_target_property(target_abis ${target} QT_ANDROID_ABIS)
+ if(target_abis)
+ # Use target-specific Qt for Android ABIs.
+ set(android_abis ${target_abis})
+ elseif(QT_ANDROID_BUILD_ALL_ABIS)
+ # Use autodetected Qt for Android ABIs.
+ set(android_abis ${QT_DEFAULT_ANDROID_ABIS})
+ elseif(QT_ANDROID_ABIS)
+ # Use project-wide Qt for Android ABIs.
+ set(android_abis ${QT_ANDROID_ABIS})
+ else()
+ # User have an empty list of Qt for Android ABIs.
+ message(FATAL_ERROR
+ "The list of Android ABIs is empty, when building ${target}.\n"
+ "You have the following options to select ABIs for a target:\n"
+ " - Set the QT_ANDROID_ABIS variable before calling qt6_add_executable\n"
+ " - Set the ANDROID_ABIS property for ${target}\n"
+ " - Set QT_ANDROID_BUILD_ALL_ABIS flag to try building with\n"
+ " the list of autodetected Qt for Android:\n ${QT_DEFAULT_ANDROID_ABIS}"
+ )
+ endif()
+
+ get_cmake_property(is_multi_config GENERATOR_IS_MULTI_CONFIG)
+ if(is_multi_config)
+ list(JOIN CMAKE_CONFIGURATION_TYPES "$<SEMICOLON>" escaped_configuration_types)
+ set(config_arg "-DCMAKE_CONFIGURATION_TYPES=${escaped_configuration_types}")
+ else()
+ set(config_arg "-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}")
+ endif()
+
+ unset(extra_cmake_args)
+
+ # The flag is needed when building qt standalone tests only to avoid building
+ # qt repo itself
+ if(QT_BUILD_STANDALONE_TESTS)
+ list(APPEND extra_cmake_args "-DQT_BUILD_STANDALONE_TESTS=ON")
+ endif()
+
+ if(NOT QT_ADDITIONAL_PACKAGES_PREFIX_PATH STREQUAL "")
+ list(JOIN QT_ADDITIONAL_PACKAGES_PREFIX_PATH "$<SEMICOLON>" escaped_packages_prefix_path)
+ list(APPEND extra_cmake_args
+ "-DQT_ADDITIONAL_PACKAGES_PREFIX_PATH=${escaped_packages_prefix_path}")
+ endif()
+
+ if(NOT QT_ADDITIONAL_HOST_PACKAGES_PREFIX_PATH STREQUAL "")
+ list(JOIN QT_ADDITIONAL_HOST_PACKAGES_PREFIX_PATH "$<SEMICOLON>"
+ escaped_host_packages_prefix_path)
+ list(APPEND extra_cmake_args
+ "-DQT_ADDITIONAL_HOST_PACKAGES_PREFIX_PATH=${escaped_host_packages_prefix_path}")
+ endif()
+
+ if(ANDROID_SDK_ROOT)
+ list(APPEND extra_cmake_args "-DANDROID_SDK_ROOT=${ANDROID_SDK_ROOT}")
+ endif()
+
+ # ANDROID_NDK_ROOT is invented by Qt and is what the qt toolchain file expects
+ if(ANDROID_NDK_ROOT)
+ list(APPEND extra_cmake_args "-DANDROID_NDK_ROOT=${ANDROID_NDK_ROOT}")
+
+ # ANDROID_NDK is passed by Qt Creator and is also present in the android toolchain file.
+ elseif(ANDROID_NDK)
+ list(APPEND extra_cmake_args "-DANDROID_NDK_ROOT=${ANDROID_NDK}")
+ endif()
+
+ if(DEFINED QT_NO_PACKAGE_VERSION_CHECK)
+ list(APPEND extra_cmake_args "-DQT_NO_PACKAGE_VERSION_CHECK=${QT_NO_PACKAGE_VERSION_CHECK}")
+ endif()
+
+ if(DEFINED QT_HOST_PATH_CMAKE_DIR)
+ list(APPEND extra_cmake_args "-DQT_HOST_PATH_CMAKE_DIR=${QT_HOST_PATH_CMAKE_DIR}")
+ endif()
+
+ if(CMAKE_MAKE_PROGRAM)
+ list(APPEND extra_cmake_args "-DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM}")
+ endif()
+
+ if(CMAKE_C_COMPILER_LAUNCHER)
+ list(JOIN CMAKE_C_COMPILER_LAUNCHER "$<SEMICOLON>"
+ compiler_launcher)
+ list(APPEND extra_cmake_args
+ "-DCMAKE_C_COMPILER_LAUNCHER=${compiler_launcher}")
+ endif()
+
+ if(CMAKE_CXX_COMPILER_LAUNCHER)
+ list(JOIN CMAKE_CXX_COMPILER_LAUNCHER "$<SEMICOLON>"
+ compiler_launcher)
+ list(APPEND extra_cmake_args
+ "-DCMAKE_CXX_COMPILER_LAUNCHER=${compiler_launcher}")
+ endif()
+
+ unset(user_cmake_args)
+ foreach(var IN LISTS QT_ANDROID_MULTI_ABI_FORWARD_VARS)
+ string(REPLACE ";" "$<SEMICOLON>" var_value "${${var}}")
+ list(APPEND user_cmake_args "-D${var}=${var_value}")
+ endforeach()
+
+ set(missing_qt_abi_toolchains "")
+ set(previous_copy_apk_dependencies_target ${target})
+ # Create external projects for each android ABI except the main one.
+ list(REMOVE_ITEM android_abis "${CMAKE_ANDROID_ARCH_ABI}")
+ foreach(abi IN ITEMS ${android_abis})
+ if(NOT "${abi}" IN_LIST QT_DEFAULT_ANDROID_ABIS)
+ list(APPEND missing_qt_abi_toolchains ${abi})
+ list(REMOVE_ITEM android_abis "${abi}")
+ continue()
+ endif()
+
+ get_property(abi_external_projects GLOBAL
+ PROPERTY _qt_internal_abi_external_projects)
+ if(NOT abi_external_projects
+ OR NOT "qt_internal_android_${abi}" IN_LIST abi_external_projects)
+ _qt_internal_add_android_abi_project(qt_internal_android_${abi} ${abi})
+
+ get_target_property(android_abi_build_dir qt_internal_android_${abi}
+ _qt_android_build_directory)
+ _qt_internal_get_android_abi_toolchain_path(qt_abi_toolchain_path ${abi})
+ _qt_internal_add_android_abi_step(qt_internal_android_${abi} ${abi} configure
+ COMMAND
+ "${CMAKE_COMMAND}"
+ "-G${CMAKE_GENERATOR}"
+ "-DCMAKE_TOOLCHAIN_FILE=${qt_abi_toolchain_path}"
+ "-DQT_HOST_PATH=${QT_HOST_PATH}"
+ "-DQT_IS_ANDROID_MULTI_ABI_EXTERNAL_PROJECT=ON"
+ "-DQT_INTERNAL_ANDROID_MULTI_ABI_BINARY_DIR=${CMAKE_BINARY_DIR}"
+ "${config_arg}"
+ "${extra_cmake_args}"
+ "${user_cmake_args}"
+ "-B" "${android_abi_build_dir}"
+ "-S" "${CMAKE_SOURCE_DIR}"
+ )
+ set_property(GLOBAL APPEND PROPERTY
+ _qt_internal_abi_external_projects "qt_internal_android_${abi}")
+ endif()
+
+ get_target_property(android_abi_build_dir qt_internal_android_${abi}
+ _qt_android_build_directory)
+ _qt_internal_add_android_abi_step(qt_internal_android_${abi} ${abi} ${target}_build
+ DEPENDS
+ configure
+ COMMAND
+ "${CMAKE_COMMAND}"
+ --build "${android_abi_build_dir}"
+ --config $<CONFIG>
+ --target ${target}
+ )
+ add_dependencies(${target} "qt_internal_android_${abi}_${target}_build")
+
+ _qt_internal_add_android_abi_step(qt_internal_android_${abi} ${abi}
+ ${target}_copy_apk_dependencies
+ DEPENDS
+ ${target}_build
+ COMMAND
+ "${CMAKE_COMMAND}"
+ --build "${android_abi_build_dir}"
+ --config $<CONFIG>
+ --target qt_internal_${target}_copy_apk_dependencies
+ )
+ set(external_project_copy_target
+ "qt_internal_android_${abi}_${target}_copy_apk_dependencies")
+
+ # Need to build dependency chain between the
+ # qt_internal_android_${abi}-${target}_copy_apk_dependencies targets for all ABI's, to
+ # prevent parallel execution of androiddeployqt processes. We cannot use Ninja job pools
+ # here because it's not possible to define job pool for the step target in ExternalProject.
+ # All tricks with interlayer targets don't work, because we only can bind interlayer target
+ # to the job pool, but its dependencies can still be built in parallel.
+ add_dependencies(${previous_copy_apk_dependencies_target}
+ "${external_project_copy_target}")
+ set(previous_copy_apk_dependencies_target "${external_project_copy_target}")
+ endforeach()
+
+ if(missing_qt_abi_toolchains)
+ list(JOIN missing_qt_abi_toolchains ", " missing_qt_abi_toolchains_string)
+ message(FATAL_ERROR "Cannot find toolchain files for the manually specified Android"
+ " ABIs: ${missing_qt_abi_toolchains_string}"
+ "\nNote that you also may manually specify the path to the required Qt for"
+ " Android ABI using QT_PATH_ANDROID_ABI_<abi> CMake variable with the value"
+ " of the installation prefix, and QT_ANDROID_PATH_CMAKE_DIR_<abi> with"
+ " the location of the cmake directory for that ABI.\n")
+ endif()
+
+ list(JOIN android_abis ", " android_abis_string)
+ if(android_abis_string)
+ set(android_abis_string "${CMAKE_ANDROID_ARCH_ABI} (default), ${android_abis_string}")
+ else()
+ set(android_abis_string "${CMAKE_ANDROID_ARCH_ABI} (default)")
+ endif()
+ if(NOT QT_NO_ANDROID_ABI_STATUS_MESSAGE)
+ message(STATUS "Configuring '${target}' for the following Android ABIs:"
+ " ${android_abis_string}")
+ endif()
+ set_target_properties(${target} PROPERTIES _qt_android_abis "${android_abis}")
+endfunction()
+
+# The wrapper function that contains routines that need to be called to produce a valid Android
+# package for the executable 'target'. The function is added to the finalizer list of the Core
+# module and is executed implicitly when configuring user projects.
+function(_qt_internal_android_executable_finalizer target)
+ set_property(TARGET ${target} PROPERTY _qt_android_executable_finalizer_called TRUE)
+
+ _qt_internal_expose_android_package_source_dir_to_ide(${target})
+
+ _qt_internal_configure_android_multiabi_target("${target}")
+ qt6_android_generate_deployment_settings("${target}")
+ qt6_android_add_apk_target("${target}")
+endfunction()
+
+function(_qt_internal_expose_android_package_source_dir_to_ide target)
+ get_target_property(android_package_source_dir ${target} QT_ANDROID_PACKAGE_SOURCE_DIR)
+ if(android_package_source_dir)
+ get_target_property(target_source_dir ${target} SOURCE_DIR)
+ if(NOT IS_ABSOLUTE "${android_package_source_dir}")
+ string(JOIN "/" android_package_source_dir
+ "${target_source_dir}"
+ "${android_package_source_dir}"
+ )
+ endif()
+
+ if(EXISTS "${android_package_source_dir}")
+ file(GLOB_RECURSE android_package_sources
+ RELATIVE "${target_source_dir}"
+ "${android_package_source_dir}/*"
+ )
+ endif()
+
+ foreach(f IN LISTS android_package_sources)
+ _qt_internal_expose_source_file_to_ide(${target} "${f}")
+ endforeach()
+ endif()
+endfunction()
+
+set(QT_INTERNAL_ANDROID_TARGET_BUILD_DIR_SUPPORT ON CACHE INTERNAL
+ "Indicates that Qt supports per-target Android build directories")
diff --git a/src/corelib/Qt6CTestMacros.cmake b/src/corelib/Qt6CTestMacros.cmake
index 24e7a737e9..8722553cd0 100644
--- a/src/corelib/Qt6CTestMacros.cmake
+++ b/src/corelib/Qt6CTestMacros.cmake
@@ -1,3 +1,6 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+
#
# W A R N I N G
# -------------
@@ -8,16 +11,74 @@
#
# We mean it.
-message("CMAKE_VERSION: ${CMAKE_VERSION}")
-message("CMAKE_PREFIX_PATH: ${CMAKE_PREFIX_PATH}")
-message("CMAKE_MODULES_UNDER_TEST: ${CMAKE_MODULES_UNDER_TEST}")
-foreach(_mod ${CMAKE_MODULES_UNDER_TEST})
- message("CMAKE_${_mod}_MODULE_MAJOR_VERSION: ${CMAKE_${_mod}_MODULE_MAJOR_VERSION}")
- message("CMAKE_${_mod}_MODULE_MINOR_VERSION: ${CMAKE_${_mod}_MODULE_MINOR_VERSION}")
- message("CMAKE_${_mod}_MODULE_PATCH_VERSION: ${CMAKE_${_mod}_MODULE_PATCH_VERSION}")
-endforeach()
+message(STATUS "CMAKE_VERSION: ${CMAKE_VERSION}")
+message(STATUS "CMAKE_PREFIX_PATH: ${CMAKE_PREFIX_PATH}")
+message(STATUS "CMAKE_MODULES_UNDER_TEST: ${CMAKE_MODULES_UNDER_TEST}")
+
+# Generate a shell script wrapper that calls ninja with -v parameter.
+# Upstream issue to allow specifying custom build tool options when using ctest's --build-and-test
+# https://gitlab.kitware.com/cmake/cmake/-/issues/22443.
+# Only one file is created that is used by all tests.
+function(_qt_internal_get_ninja_wrapper ninja_path out_wrapper_path)
+ if(QT_INTERNAL_CTEST_NINJA_WRAPPER AND EXISTS "${QT_INTERNAL_CTEST_NINJA_WRAPPER}")
+ set(${out_wrapper_path} "${QT_INTERNAL_CTEST_NINJA_WRAPPER}" PARENT_SCOPE)
+ return()
+ endif()
+
+ if(NOT ninja_path)
+ message(FATAL_ERROR "Invalid ninja path specified: '${ninja_path}'.")
+ endif()
+
+ set(wrapper_extension "")
+
+ if(NOT CMAKE_HOST_UNIX)
+ set(wrapper_extension ".bat")
+ endif()
+
+ set(script_name "qt-internal-ninja")
+
+ # the libexec literal is used on purpose for the source, so the file is found
+ # on Windows hosts.
+ set(wrapper_rel_path "libexec/${script_name}${wrapper_extension}.in")
+
+ # Need to find the libexec input file depending whether the qtbase sources are available.
+ # This mirrors the logic in qt_set_up_build_internals_paths.
+ # TODO: Clean this up, together with qt_set_up_build_internals_paths to only use the
+ # the qtbase sources when building qtbase. And perhaps also when doing a non-prefix
+ # developer-build.
+ set(qtbase_wrapper_in_path "${QT_SOURCE_TREE}/${wrapper_rel_path}")
+ set(installed_wrapper_in_path
+ "${_qt_cmake_dir}/${QT_CMAKE_EXPORT_NAMESPACE}/${wrapper_rel_path}")
+
+ # qtbase sources available, always use them, regardless of prefix or non-prefix builds.
+ if(EXISTS "${qtbase_wrapper_in_path}")
+ set(wrapper_in "${qtbase_wrapper_in_path}")
+ # qtbase sources unavailable, use installed files.
+ elseif(EXISTS "${installed_wrapper_in_path}")
+ set(wrapper_in "${installed_wrapper_in_path}")
+ else()
+ message(FATAL_ERROR "Can't find ${script_name}${wrapper_extension}.in file.")
+ endif()
+
+ set(wrapper_out "${CMAKE_BINARY_DIR}/.qt/${script_name}${wrapper_extension}")
+
+ set(original_ninja "${ninja_path}")
+ set(ninja_arguments "-v")
+
+ configure_file("${wrapper_in}" "${wrapper_out}" @ONLY)
+
+ set(QT_INTERNAL_CTEST_NINJA_WRAPPER "${wrapper_out}" CACHE STRING
+ "Internal Qt ninja wrapper for ctest tests")
+
+ set(${out_wrapper_path} "${QT_INTERNAL_CTEST_NINJA_WRAPPER}" PARENT_SCOPE)
+endfunction()
+
+# The function collects configuring options for the test projects generated by Qt cmake tests.
+# Arguments:
+# OUT_PREFIX_PATH <variable name>: stores the CMAKE_PREFIX_PATH value in the output variable.
function(_qt_internal_get_cmake_test_configure_options out_var)
+ cmake_parse_arguments(arg "" "OUT_PREFIX_PATH" "" ${ARGN})
set(option_list)
if (CMAKE_C_COMPILER AND NOT CMAKE_CROSSCOMPILING)
@@ -59,6 +120,9 @@ function(_qt_internal_get_cmake_test_configure_options out_var)
list(APPEND option_list "-DNO_DBUS=True")
endif()
+ list(APPEND option_list "-DCMAKE_MESSAGE_LOG_LEVEL=DEBUG")
+ list(APPEND option_list "-DCMAKE_AUTOGEN_VERBOSE=TRUE")
+
if(APPLE AND CMAKE_OSX_ARCHITECTURES)
list(LENGTH CMAKE_OSX_ARCHITECTURES osx_arch_count)
@@ -78,10 +142,30 @@ function(_qt_internal_get_cmake_test_configure_options out_var)
)
endforeach()
+ _qt_internal_get_build_vars_for_external_projects(
+ PREFIXES_VAR prefixes
+ ADDITIONAL_PACKAGES_PREFIXES_VAR additional_prefixes
+ )
+
+ if(arg_OUT_PREFIX_PATH)
+ set(${arg_OUT_PREFIX_PATH} "${prefixes}" PARENT_SCOPE)
+ endif()
+
+ string(REPLACE ";" "\;" prefixes "${prefixes}")
+ list(APPEND option_list "-DCMAKE_PREFIX_PATH=${prefixes}")
+ list(APPEND option_list "-DQT_ADDITIONAL_PACKAGES_PREFIX_PATH=${additional_prefixes}")
+
set(${out_var} "${option_list}" PARENT_SCOPE)
endfunction()
function(_qt_internal_set_up_test_run_environment testname)
+ set(no_value_options NO_PLUGIN_PATH)
+ set(single_value_options "")
+ set(multi_value_options "")
+ cmake_parse_arguments(PARSE_ARGV 1 arg
+ "${no_value_options}" "${single_value_options}" "${multi_value_options}"
+ )
+
# This is copy-pasted from qt_add_test and adapted to the standalone project case.
if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows")
set(QT_PATH_SEPARATOR "\\;")
@@ -120,20 +204,20 @@ function(_qt_internal_set_up_test_run_environment testname)
set_property(TEST "${testname}" APPEND PROPERTY ENVIRONMENT "${test_env_path}")
set_property(TEST "${testname}" APPEND PROPERTY ENVIRONMENT "QT_TEST_RUNNING_IN_CTEST=1")
- # Add the install prefix to list of plugin paths when doing a prefix build
- if(NOT QT_INSTALL_DIR)
- foreach(install_prefix ${install_prefixes})
- list(APPEND plugin_paths "${install_prefix}/${INSTALL_PLUGINSDIR}")
- endforeach()
- endif()
-
- #TODO: Collect all paths from known repositories when performing a super
- # build.
- list(APPEND plugin_paths "${PROJECT_BINARY_DIR}/${INSTALL_PLUGINSDIR}")
- list(JOIN plugin_paths "${QT_PATH_SEPARATOR}" plugin_paths_joined)
- set_property(TEST "${testname}"
- APPEND PROPERTY ENVIRONMENT "QT_PLUGIN_PATH=${plugin_paths_joined}")
+ if(NOT arg_NO_PLUGIN_PATH)
+ # Add the install prefix to list of plugin paths when doing a prefix build
+ if(NOT QT_INSTALL_DIR)
+ foreach(install_prefix ${install_prefixes})
+ list(APPEND plugin_paths "${install_prefix}/${INSTALL_PLUGINSDIR}")
+ endforeach()
+ endif()
+ # TODO: Collect all paths from known repositories when performing a super build.
+ list(APPEND plugin_paths "${PROJECT_BINARY_DIR}/${INSTALL_PLUGINSDIR}")
+ list(JOIN plugin_paths "${QT_PATH_SEPARATOR}" plugin_paths_joined)
+ set_property(TEST "${testname}"
+ APPEND PROPERTY ENVIRONMENT "QT_PLUGIN_PATH=${plugin_paths_joined}")
+ endif()
endfunction()
# Checks if the test project can be built successfully. Arguments:
@@ -171,13 +255,21 @@ endfunction()
# TESTNAME: a custom test name to use instead of the one derived from the source directory name
#
# BUILD_OPTIONS: a list of -D style CMake definitions to pass to ctest's --build-options (which
-# are ultimately passed to the CMake invocation of the test project)
+# are ultimately passed to the CMake invocation of the test project). You may
+# escape semicolons inside the definitions using:
+# https://cmake.org/cmake/help/latest/manual/cmake-language.7.html#bracket-argument
+# so the argument containing list will look as following:
+# -DLIST_ARGUMENT=item1[[;]]item2[[;]]...itemN.
macro(_qt_internal_test_expect_pass _dir)
+ if(WASM)
+ return()
+ endif()
set(_test_option_args
SIMULATE_IN_SOURCE
NO_CLEAN_STEP
NO_BUILD_PROJECT_ARG
NO_IOS_DEFAULT_ARGS
+ NO_RUN_ENVIRONMENT_PLUGIN_PATH
)
set(_test_single_args
BINARY
@@ -219,9 +311,14 @@ macro(_qt_internal_test_expect_pass _dir)
endif()
# Allow setting a different make program.
- set(make_program "${CMAKE_MAKE_PROGRAM}")
if(_ARGS_MAKE_PROGRAM)
set(make_program "${_ARGS_MAKE_PROGRAM}")
+ elseif(CMAKE_GENERATOR MATCHES "Ninja")
+ # Use a ninja wrapper when generator is ninja
+ _qt_internal_get_ninja_wrapper("${CMAKE_MAKE_PROGRAM}" ninja_wrapper)
+ set(make_program "${ninja_wrapper}")
+ else()
+ set(make_program "${CMAKE_MAKE_PROGRAM}")
endif()
# Only pass build config if it was specified during the initial tests/auto project
@@ -287,16 +384,13 @@ macro(_qt_internal_test_expect_pass _dir)
endif()
if(build_environment STREQUAL "ci"
AND osx_arch_count GREATER_EQUAL 2
- AND NOT QT_UIKIT_SDK
+ AND NOT QT_APPLE_SDK
AND NOT QT_NO_IOS_BUILD_ADJUSTMENT_IN_CI)
list(APPEND additional_configure_args
-DCMAKE_OSX_ARCHITECTURES=x86_64 -DCMAKE_OSX_SYSROOT=iphonesimulator)
endif()
endif()
- set(__expect_pass_prefixes "${CMAKE_PREFIX_PATH}")
- string(REPLACE ";" "\;" __expect_pass_prefixes "${__expect_pass_prefixes}")
-
set(__expect_pass_build_dir "${CMAKE_CURRENT_BINARY_DIR}/${_dir}")
if(_ARGS_BUILD_DIR)
set(__expect_pass_build_dir "${CMAKE_CURRENT_BINARY_DIR}/${_ARGS_BUILD_DIR}")
@@ -331,6 +425,8 @@ macro(_qt_internal_test_expect_pass _dir)
)
endif()
+ string(REPLACE "[[;]]" "\;" _ARGS_BUILD_OPTIONS "${_ARGS_BUILD_OPTIONS}")
+
_qt_internal_get_cmake_test_configure_options(option_list)
set(ctest_command_args
--build-and-test
@@ -341,25 +437,161 @@ macro(_qt_internal_test_expect_pass _dir)
--build-generator "${generator}"
--build-makeprogram "${make_program}"
${build_project}
- --build-options "-DCMAKE_PREFIX_PATH=${__expect_pass_prefixes}" ${option_list}
- ${_ARGS_BUILD_OPTIONS} ${additional_configure_args}
+ --build-options "${option_list}"
+ "${_ARGS_BUILD_OPTIONS}" ${additional_configure_args}
${test_command}
)
add_test(${testname} ${CMAKE_CTEST_COMMAND} ${ctest_command_args})
if(_ARGS_SIMULATE_IN_SOURCE)
set_tests_properties(${testname} PROPERTIES
- FIXTURES_REQUIRED "${testname}SIMULATE_IN_SOURCE_FIXTURE")
+ FIXTURES_REQUIRED "${testname}SIMULATE_IN_SOURCE_FIXTURE"
+ )
endif()
+ set_tests_properties(${testname} PROPERTIES ENVIRONMENT "ASAN_OPTIONS=detect_leaks=0")
if(_ARGS_BINARY)
- _qt_internal_set_up_test_run_environment("${testname}")
+ set(run_env_args "")
+ if(_ARGS_NO_RUN_ENVIRONMENT_PLUGIN_PATH)
+ list(APPEND run_env_args NO_PLUGIN_PATH)
+ endif()
+ _qt_internal_set_up_test_run_environment("${testname}" ${run_env_args})
endif()
unset(__expect_pass_source_dir)
unset(__expect_pass_build_dir)
- unset(__expect_pass_prefixes)
endmacro()
+# Checks if a qmake project can be built successfully. Arguments:
+#
+# TESTNAME: a custom test name to use instead of the one derived from the source directory name.
+# the name also applies to the generated build directory.
+#
+# QMAKE_OPTIONS: a list of variable assignments to pass to the qmake invocation.
+# e.g. CONFIG+=debug
+#
+# BUILD_ENVIRONMENT: a list of environment assignments to use when invoking the build tool
+function(_qt_internal_add_qmake_test dir_name)
+ set(test_option_args
+ )
+ set(test_single_args
+ TESTNAME
+ )
+ set(test_multi_args
+ QMAKE_OPTIONS
+ BUILD_ENVIRONMENT
+ )
+
+ # PARSE_ARGV parsing keeps ';' in ENVIRONMENT variables
+ cmake_parse_arguments(PARSE_ARGV 1 arg
+ "${test_option_args}"
+ "${test_single_args}"
+ "${test_multi_args}"
+ )
+
+ if(arg_TESTNAME)
+ set(testname "${arg_TESTNAME}")
+ else()
+ string(REGEX REPLACE "[/)(]" "_" testname "${dir_name}")
+ endif()
+
+ set(source_dir "${CMAKE_CURRENT_SOURCE_DIR}/${dir_name}")
+ if(arg_TESTNAME)
+ set(build_dir "${CMAKE_CURRENT_BINARY_DIR}/${arg_TESTNAME}")
+ else()
+ set(build_dir "${CMAKE_CURRENT_BINARY_DIR}/${dir_name}")
+ endif()
+
+ # Find the qmake binary or the wrapper qmake script when cross-compiling..
+ if(QtBase_BINARY_DIR AND NOT QT_BUILD_STANDALONE_TESTS)
+ set(qmake_dir "${QtBase_BINARY_DIR}/${INSTALL_BINDIR}")
+ else()
+ set(qmake_dir "${QT6_INSTALL_PREFIX}/${QT6_INSTALL_BINS}")
+ endif()
+
+ set(qmake_path "${qmake_dir}/qmake${CMAKE_EXECUTABLE_SUFFIX}")
+
+ set(qmake_args
+ "${source_dir}"
+ ${arg_QMAKE_OPTIONS}
+ )
+
+ # Try to choose an appropriate build tool.
+ if(ENV{QT_QMAKE_TEST_BUILD_TOOL})
+ set(build_tool "$ENV{QT_QMAKE_TEST_BUILD_TOOL}")
+ elseif(MSVC)
+ set(build_tool "nmake")
+ elseif(MINGW)
+ set(build_tool "mingw32-make")
+ else()
+ set(build_tool "make")
+ endif()
+
+ set(build_tool_args "")
+ if(ENV{QT_QMAKE_TEST_BUILD_TOOL_OPTIONS})
+ set(build_tool_args "$ENV{QT_QMAKE_TEST_BUILD_TOOL_OPTIONS}")
+ endif()
+
+ # Remove any stale build dir, and create a new one on each test rerun.
+ add_test(${testname}_remove_build_dir
+ ${CMAKE_COMMAND} -E remove_directory "${build_dir}"
+ )
+ set_tests_properties(${testname}_remove_build_dir PROPERTIES
+ FIXTURES_SETUP "${testname}_ensure_clean_build_dir"
+ )
+
+ add_test(${testname}_create_build_dir
+ ${CMAKE_COMMAND} -E make_directory "${build_dir}"
+ )
+ set_tests_properties(${testname}_create_build_dir PROPERTIES
+ FIXTURES_SETUP "${testname}_ensure_clean_build_dir"
+ )
+
+ set_tests_properties(${testname}_create_build_dir
+ PROPERTIES DEPENDS ${testname}_remove_build_dir)
+
+ # Add test to call qmake.
+ #
+ # We can't use the add_test(NAME) signature to set a working directory, because that breaks
+ # when calling ctest without a -C <config> using multi-config generators, and the CI calls
+ # ctest without -C, and we use Xcode when configuring tests for iOS, which is multi-config.
+ # The plain add_test signature does not have this issue.
+ # Work around this by using a wrapper script that sets a working directory and use the plain
+ # signature.
+ # Somewhat related issue https://gitlab.kitware.com/cmake/cmake/-/issues/20283
+ set(qmake_wrapper_file "${CMAKE_CURRENT_BINARY_DIR}/run_qmake_${testname}.cmake")
+ _qt_internal_create_command_script(
+ COMMAND "${qmake_path}" ${qmake_args}
+ COMMAND_ECHO STDOUT
+ OUTPUT_FILE "${qmake_wrapper_file}"
+ WORKING_DIRECTORY "${build_dir}"
+ )
+
+ add_test(${testname}_qmake "${CMAKE_COMMAND}" "-P" "${qmake_wrapper_file}")
+
+ set_tests_properties(${testname}_qmake PROPERTIES
+ DEPENDS ${testname}_create_build_dir
+ FIXTURES_REQUIRED "${testname}_ensure_clean_build_dir"
+ FIXTURES_SETUP "${testname}_configure_project"
+ )
+
+ # Add test to build the generated qmake project.
+ set(build_tool_wrapper_file "${CMAKE_CURRENT_BINARY_DIR}/run_build_${testname}.cmake")
+ _qt_internal_create_command_script(
+ COMMAND "${build_tool}" ${build_tool_args}
+ COMMAND_ECHO STDOUT
+ OUTPUT_FILE "${build_tool_wrapper_file}"
+ WORKING_DIRECTORY "${build_dir}"
+ ENVIRONMENT ${arg_BUILD_ENVIRONMENT}
+ )
+
+ add_test(${testname} "${CMAKE_COMMAND}" "-P" "${build_tool_wrapper_file}")
+
+ set_tests_properties(${testname} PROPERTIES
+ DEPENDS ${testname}_qmake
+ FIXTURES_REQUIRED "${testname}_ensure_clean_build_dir;${testname}_configure_project"
+ )
+endfunction()
+
# Checks if the build of the test project fails.
# This test passes if the test project fails either at the
# configuring or build steps.
@@ -378,9 +610,12 @@ macro(_qt_internal_test_expect_build_fail _dir)
file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/failbuild/${_dir}")
file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/${_dir}" DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/failbuild/${_dir}")
+ set(__expect_fail_prefixes "")
+ _qt_internal_get_cmake_test_configure_options(option_list OUT_PREFIX_PATH __expect_fail_prefixes)
+
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/failbuild/${_dir}/${_dir}/FindPackageHints.cmake"
- "set(Qt6Tests_PREFIX_PATH \"${CMAKE_PREFIX_PATH}\")
-list(APPEND CMAKE_PREFIX_PATH \"${CMAKE_PREFIX_PATH}\")
+ "set(Qt6Tests_PREFIX_PATH \"${__expect_fail_prefixes}\")
+list(APPEND CMAKE_PREFIX_PATH \"${__expect_fail_prefixes}\")
")
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/failbuild/${_dir}/CMakeLists.txt"
@@ -400,17 +635,26 @@ list(APPEND CMAKE_PREFIX_PATH \"${CMAKE_PREFIX_PATH}\")
"
)
- _qt_internal_get_cmake_test_configure_options(option_list)
+
+ if(CMAKE_GENERATOR MATCHES "Ninja")
+ # Use a ninja wrapper when generator is ninja
+ _qt_internal_get_ninja_wrapper("${CMAKE_MAKE_PROGRAM}" ninja_wrapper)
+ set(make_program "${ninja_wrapper}")
+ else()
+ set(make_program "${CMAKE_MAKE_PROGRAM}")
+ endif()
+
add_test(${testname} ${CMAKE_CTEST_COMMAND}
--build-and-test
"${CMAKE_CURRENT_BINARY_DIR}/failbuild/${_dir}"
"${CMAKE_CURRENT_BINARY_DIR}/failbuild/${_dir}/build"
--build-config "${CMAKE_BUILD_TYPE}"
--build-generator "${CMAKE_GENERATOR}"
- --build-makeprogram "${CMAKE_MAKE_PROGRAM}"
+ --build-makeprogram "${make_program}"
--build-project "${_dir}"
- --build-options "-DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH}" ${option_list}
+ --build-options ${option_list}
)
+ unset(__expect_fail_prefixes)
endmacro()
function(_qt_internal_test_module_includes)
@@ -504,14 +748,23 @@ function(_qt_internal_test_module_includes)
)
_qt_internal_get_cmake_test_configure_options(option_list)
+
+ if(CMAKE_GENERATOR MATCHES "Ninja")
+ # Use a ninja wrapper when generator is ninja
+ _qt_internal_get_ninja_wrapper("${CMAKE_MAKE_PROGRAM}" ninja_wrapper)
+ set(make_program "${ninja_wrapper}")
+ else()
+ set(make_program "${CMAKE_MAKE_PROGRAM}")
+ endif()
+
add_test(module_includes ${CMAKE_CTEST_COMMAND}
--build-and-test
"${CMAKE_CURRENT_BINARY_DIR}/module_includes/"
"${CMAKE_CURRENT_BINARY_DIR}/module_includes/build"
--build-config "${CMAKE_BUILD_TYPE}"
--build-generator "${CMAKE_GENERATOR}"
- --build-makeprogram "${CMAKE_MAKE_PROGRAM}"
+ --build-makeprogram "${make_program}"
--build-project module_includes
- --build-options "-DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH}" ${option_list}
+ --build-options ${option_list}
)
endfunction()
diff --git a/src/corelib/Qt6CoreConfigExtras.cmake.in b/src/corelib/Qt6CoreConfigExtras.cmake.in
index 6ceb4b201f..7fd929e59b 100644
--- a/src/corelib/Qt6CoreConfigExtras.cmake.in
+++ b/src/corelib/Qt6CoreConfigExtras.cmake.in
@@ -2,45 +2,28 @@ if(NOT DEFINED QT_DEFAULT_MAJOR_VERSION)
set(QT_DEFAULT_MAJOR_VERSION 6)
endif()
-# include(\"${CMAKE_CURRENT_LIST_DIR}/Qt5CoreConfigExtrasMkspecDir.cmake\")
-#
-# foreach(_dir ${_qt5_corelib_extra_includes})
-# _qt5_Core_check_file_exists(${_dir})
-# endforeach()
-
-# list(APPEND Qt5Core_INCLUDE_DIRS ${_qt5_corelib_extra_includes})
-# set_property(TARGET @QT_CMAKE_EXPORT_NAMESPACE@::Core APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${_qt5_corelib_extra_includes})
-# set(_qt5_corelib_extra_includes)
-
if (NOT QT_NO_CREATE_TARGETS)
- if (NOT "@QT_NAMESPACE@" STREQUAL "")
- set_property(TARGET @QT_CMAKE_EXPORT_NAMESPACE@::Core APPEND PROPERTY INTERFACE_COMPILE_DEFINITIONS QT_NAMESPACE=@QT_NAMESPACE@)
+ set(__qt_core_target @QT_CMAKE_EXPORT_NAMESPACE@::Core)
+ get_property(__qt_core_aliased_target TARGET ${__qt_core_target} PROPERTY ALIASED_TARGET)
+ if(__qt_core_aliased_target)
+ set(__qt_core_target "${__qt_core_aliased_target}")
endif()
- set_property(TARGET @QT_CMAKE_EXPORT_NAMESPACE@::Core APPEND PROPERTY INTERFACE_COMPILE_DEFINITIONS $<$<NOT:$<CONFIG:Debug>>:QT_NO_DEBUG>)
- set_property(TARGET @QT_CMAKE_EXPORT_NAMESPACE@::Core PROPERTY INTERFACE_COMPILE_FEATURES cxx_decltype)
+ unset(__qt_core_aliased_target)
+ @qtcore_namespace_definition@
+ set_property(TARGET ${__qt_core_target} APPEND PROPERTY INTERFACE_COMPILE_DEFINITIONS $<$<NOT:$<CONFIG:Debug>>:QT_NO_DEBUG>)
+ set_property(TARGET ${__qt_core_target} PROPERTY INTERFACE_COMPILE_FEATURES cxx_decltype)
endif()
-set(CMAKE_AUTOMOC_MACRO_NAMES "Q_OBJECT" "Q_GADGET" "Q_GADGET_EXPORT" "Q_NAMESPACE" "Q_NAMESPACE_EXPORT")
-
-# install layout information, following what qmake -query provides
-get_filename_component(QT@PROJECT_VERSION_MAJOR@_INSTALL_PREFIX ${CMAKE_CURRENT_LIST_DIR}/../@QT_INVERSE_CONFIG_INSTALL_DIR@ ABSOLUTE)
-set(QT@PROJECT_VERSION_MAJOR@_INSTALL_ARCHDATA "@INSTALL_ARCHDATADIR@")
-set(QT@PROJECT_VERSION_MAJOR@_INSTALL_BINS "@INSTALL_BINDIR@")
-set(QT@PROJECT_VERSION_MAJOR@_INSTALL_CONFIGURATION "@INSTALL_SYSCONFDIR@")
-set(QT@PROJECT_VERSION_MAJOR@_INSTALL_DATA "@INSTALL_DATADIR@")
-set(QT@PROJECT_VERSION_MAJOR@_INSTALL_DOCS "@INSTALL_DOCDIR@")
-set(QT@PROJECT_VERSION_MAJOR@_INSTALL_EXAMPLES "@INSTALL_EXAMPLESDIR@")
-set(QT@PROJECT_VERSION_MAJOR@_INSTALL_HEADERS "@INSTALL_INCLUDEDIR@")
-set(QT@PROJECT_VERSION_MAJOR@_INSTALL_LIBS "@INSTALL_LIBDIR@")
-set(QT@PROJECT_VERSION_MAJOR@_INSTALL_LIBEXECS "@INSTALL_LIBEXECDIR@")
-set(QT@PROJECT_VERSION_MAJOR@_INSTALL_PLUGINS "@INSTALL_PLUGINSDIR@")
-set(QT@PROJECT_VERSION_MAJOR@_INSTALL_QML "@INSTALL_QMLDIR@")
-set(QT@PROJECT_VERSION_MAJOR@_INSTALL_TESTS "@INSTALL_TESTSDIR@")
-set(QT@PROJECT_VERSION_MAJOR@_INSTALL_TRANSLATIONS "@INSTALL_TRANSLATIONSDIR@")
+# note: all the other AUTOMOC_MACRO_NAMES are already set by upstream CMake
+list(APPEND CMAKE_AUTOMOC_MACRO_NAMES Q_GADGET_EXPORT Q_ENUM_NS)
+list(REMOVE_DUPLICATES CMAKE_AUTOMOC_MACRO_NAMES)
+
set(QT@PROJECT_VERSION_MAJOR@_IS_SHARED_LIBS_BUILD "@BUILD_SHARED_LIBS@")
+set(QT@PROJECT_VERSION_MAJOR@_DEBUG_POSTFIX "@CMAKE_DEBUG_POSTFIX@")
-get_filename_component(_Qt6CoreConfigDir ${CMAKE_CURRENT_LIST_FILE} PATH)
-set(_Qt6CTestMacros "${_Qt6CoreConfigDir}/Qt6CTestMacros.cmake")
+set(_Qt6CTestMacros "${CMAKE_CURRENT_LIST_DIR}/Qt6CTestMacros.cmake")
+
+_qt_internal_setup_deploy_support()
@qtcore_extra_cmake_code@
@@ -48,8 +31,28 @@ if(ANDROID_PLATFORM)
include("${CMAKE_CURRENT_LIST_DIR}/@QT_CMAKE_EXPORT_NAMESPACE@AndroidMacros.cmake")
_qt_internal_create_global_android_targets()
_qt_internal_collect_default_android_abis()
+ if(NOT QT_NO_CREATE_TARGETS)
+ set_property(TARGET ${__qt_core_target} APPEND PROPERTY
+ INTERFACE_QT_EXECUTABLE_FINALIZERS
+ _qt_internal_android_executable_finalizer
+ )
+ endif()
+endif()
+
+if(QT_FEATURE_permissions AND APPLE)
+ if(NOT QT_NO_CREATE_TARGETS)
+ set_property(TARGET ${__qt_core_target} APPEND PROPERTY
+ INTERFACE_QT_EXECUTABLE_FINALIZERS
+ _qt_internal_darwin_permission_finalizer
+ )
+ endif()
endif()
if(EMSCRIPTEN)
+ set_property(GLOBAL PROPERTY TARGET_SUPPORTS_SHARED_LIBS TRUE)
include("${CMAKE_CURRENT_LIST_DIR}/@QT_CMAKE_EXPORT_NAMESPACE@WasmMacros.cmake")
endif()
+
+_qt_internal_override_example_install_dir_to_dot()
+
+unset(__qt_core_target)
diff --git a/src/corelib/Qt6CoreDeploySupport.cmake b/src/corelib/Qt6CoreDeploySupport.cmake
new file mode 100644
index 0000000000..2fc8f8bf1c
--- /dev/null
+++ b/src/corelib/Qt6CoreDeploySupport.cmake
@@ -0,0 +1,680 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+
+# NOTE: This code should only ever be executed in script mode. It expects to be
+# used either as part of an install(CODE) call or called by a script
+# invoked via cmake -P as a POST_BUILD step.
+
+cmake_minimum_required(VERSION 3.16...3.21)
+
+function(qt6_deploy_qt_conf qt_conf_absolute_path)
+ set(no_value_options "")
+ set(single_value_options
+ PREFIX
+ DOC_DIR
+ HEADERS_DIR
+ LIB_DIR
+ LIBEXEC_DIR
+ BIN_DIR
+ PLUGINS_DIR
+ QML_DIR
+ ARCHDATA_DIR
+ DATA_DIR
+ TRANSLATIONS_DIR
+ EXAMPLES_DIR
+ TESTS_DIR
+ SETTINGS_DIR
+ )
+ set(multi_value_options "")
+ cmake_parse_arguments(PARSE_ARGV 1 arg
+ "${no_value_options}" "${single_value_options}" "${multi_value_options}"
+ )
+
+ if(arg_UNPARSED_ARGUMENTS)
+ message(FATAL_ERROR "Unparsed arguments: ${arg_UNPARSED_ARGUMENTS}")
+ endif()
+
+ if(NOT IS_ABSOLUTE "${qt_conf_absolute_path}")
+ message(FATAL_ERROR
+ "Given qt.conf path is not an absolute path: '${qt_conf_absolute_path}'")
+ endif()
+
+ # Only write out locations that differ from the defaults
+ set(contents "[Paths]\n")
+ if(arg_PREFIX)
+ string(APPEND contents "Prefix = ${arg_PREFIX}\n")
+ endif()
+ if(arg_DOC_DIR AND NOT arg_DOC_DIR STREQUAL "doc")
+ string(APPEND contents "Documentation = ${arg_DOC_DIR}\n")
+ endif()
+ if(arg_HEADERS_DIR AND NOT arg_HEADERS_DIR STREQUAL "include")
+ string(APPEND contents "Headers = ${arg_HEADERS_DIR}\n")
+ endif()
+ if(arg_LIB_DIR AND NOT arg_LIB_DIR STREQUAL "lib")
+ string(APPEND contents "Libraries = ${arg_LIB_DIR}\n")
+ endif()
+
+ # This one is special, the default is platform-specific
+ if(arg_LIBEXEC_DIR AND
+ ((WIN32 AND NOT arg_LIBEXEC_DIR STREQUAL "bin") OR
+ (NOT WIN32 AND NOT arg_LIBEXEC_DIR STREQUAL "libexec")))
+ string(APPEND contents "LibraryExecutables = ${arg_LIBEXEC_DIR}\n")
+ endif()
+
+ if(arg_BIN_DIR AND NOT arg_BIN_DIR STREQUAL "bin")
+ string(APPEND contents "Binaries = ${arg_BIN_DIR}\n")
+ endif()
+ if(arg_PLUGINS_DIR AND NOT arg_PLUGINS_DIR STREQUAL "plugins")
+ string(APPEND contents "Plugins = ${arg_PLUGINS_DIR}\n")
+ endif()
+ if(arg_QML_DIR AND NOT arg_QML_DIR STREQUAL "qml")
+ string(APPEND contents "QmlImports = ${arg_QML_DIR}\n")
+ endif()
+ if(arg_ARCHDATA_DIR AND NOT arg_ARCHDATA_DIR STREQUAL ".")
+ string(APPEND contents "ArchData = ${arg_ARCHDATA_DIR}\n")
+ endif()
+ if(arg_DATA_DIR AND NOT arg_DATA_DIR STREQUAL ".")
+ string(APPEND contents "Data = ${arg_DATA_DIR}\n")
+ endif()
+ if(arg_TRANSLATIONS_DIR AND NOT arg_TRANSLATIONS_DIR STREQUAL "translations")
+ string(APPEND contents "Translations = ${arg_TRANSLATIONS_DIR}\n")
+ endif()
+ if(arg_EXAMPLES_DIR AND NOT arg_EXAMPLES_DIR STREQUAL "examples")
+ string(APPEND contents "Examples = ${arg_EXAMPLES_DIR}\n")
+ endif()
+ if(arg_TESTS_DIR AND NOT arg_TESTS_DIR STREQUAL "tests")
+ string(APPEND contents "Tests = ${arg_TESTS_DIR}\n")
+ endif()
+ if(arg_SETTINGS_DIR AND NOT arg_SETTINGS_DIR STREQUAL ".")
+ string(APPEND contents "Settings = ${arg_SETTINGS_DIR}\n")
+ endif()
+
+ message(STATUS "Writing ${qt_conf_absolute_path}")
+ file(WRITE "${qt_conf_absolute_path}" "${contents}")
+endfunction()
+
+if(NOT __QT_NO_CREATE_VERSIONLESS_FUNCTIONS)
+ function(qt_deploy_qt_conf)
+ if(__QT_DEFAULT_MAJOR_VERSION EQUAL 6)
+ qt6_deploy_qt_conf(${ARGV})
+ else()
+ message(FATAL_ERROR "qt_deploy_qt_conf() is only available in Qt 6.")
+ endif()
+ endfunction()
+endif()
+
+# Copied from QtCMakeHelpers.cmake
+function(_qt_internal_re_escape out_var str)
+ string(REGEX REPLACE "([][+.*()^])" "\\\\\\1" regex "${str}")
+ set(${out_var} ${regex} PARENT_SCOPE)
+endfunction()
+
+function(_qt_internal_set_rpath)
+ if(NOT CMAKE_HOST_UNIX OR CMAKE_HOST_APPLE)
+ message(WARNING "_qt_internal_set_rpath is not implemented on this platform.")
+ return()
+ endif()
+
+ set(no_value_options "")
+ set(single_value_options FILE NEW_RPATH)
+ set(multi_value_options "")
+ cmake_parse_arguments(PARSE_ARGV 0 arg
+ "${no_value_options}" "${single_value_options}" "${multi_value_options}"
+ )
+ if(__QT_DEPLOY_USE_PATCHELF)
+ message(STATUS "Setting runtime path of '${arg_FILE}' to '${arg_NEW_RPATH}'.")
+ execute_process(
+ COMMAND ${__QT_DEPLOY_PATCHELF_EXECUTABLE} --set-rpath "${arg_NEW_RPATH}" "${arg_FILE}"
+ RESULT_VARIABLE process_result
+ )
+ if(NOT process_result EQUAL "0")
+ if(process_result MATCHES "^[0-9]+$")
+ message(FATAL_ERROR "patchelf failed with exit code ${process_result}.")
+ else()
+ message(FATAL_ERROR "patchelf failed: ${process_result}.")
+ endif()
+ endif()
+ else()
+ # Warning: file(RPATH_SET) is CMake-internal API.
+ file(RPATH_SET
+ FILE "${arg_FILE}"
+ NEW_RPATH "${arg_NEW_RPATH}"
+ )
+ endif()
+endfunction()
+
+# Store the platform-dependent $ORIGIN marker in out_var.
+function(_qt_internal_get_rpath_origin out_var)
+ if(__QT_DEPLOY_SYSTEM_NAME STREQUAL "Darwin")
+ set(rpath_origin "@loader_path")
+ else()
+ set(rpath_origin "$ORIGIN")
+ endif()
+ set(${out_var} ${rpath_origin} PARENT_SCOPE)
+endfunction()
+
+# Add a function to the list of deployment hooks.
+# The hooks are run at the end of _qt_internal_generic_deployqt.
+#
+# Every hook is passed the parameters of _qt_internal_generic_deployqt plus the following:
+# RESOLVED_DEPENDENCIES: list of resolved dependencies that were installed.
+function(_qt_internal_add_deployment_hook function_name)
+ set_property(GLOBAL APPEND PROPERTY QT_INTERNAL_DEPLOYMENT_HOOKS "${function_name}")
+endfunction()
+
+# Run all registered deployment hooks.
+function(_qt_internal_run_deployment_hooks)
+ get_property(hooks GLOBAL PROPERTY QT_INTERNAL_DEPLOYMENT_HOOKS)
+ foreach(hook IN LISTS hooks)
+ if(NOT COMMAND "${hook}")
+ message(AUTHOR_WARNING "'${hook}' is not a command but was added as deployment hook.")
+ continue()
+ endif()
+ if(CMAKE_VERSION GREATER_EQUAL "3.19")
+ cmake_language(CALL "${hook}" ${ARGV})
+ else()
+ set(temp_file ".qt-run-deploy-hook.cmake")
+ file(WRITE "${temp_file}" "${hook}(${ARGV})")
+ include(${temp_file})
+ file(REMOVE "${temp_file}")
+ endif()
+ endforeach()
+endfunction()
+
+function(_qt_internal_generic_deployqt)
+ set(no_value_options
+ NO_TRANSLATIONS
+ VERBOSE
+ )
+ set(single_value_options
+ LIB_DIR
+ PLUGINS_DIR
+ )
+ set(file_GRD_options
+ EXECUTABLES
+ LIBRARIES
+ MODULES
+ PRE_INCLUDE_REGEXES
+ PRE_EXCLUDE_REGEXES
+ POST_INCLUDE_REGEXES
+ POST_EXCLUDE_REGEXES
+ POST_INCLUDE_FILES
+ POST_EXCLUDE_FILES
+ )
+ set(multi_value_options ${file_GRD_options})
+ cmake_parse_arguments(PARSE_ARGV 0 arg
+ "${no_value_options}" "${single_value_options}" "${multi_value_options}"
+ )
+
+ if(arg_VERBOSE OR __QT_DEPLOY_VERBOSE)
+ set(verbose TRUE)
+ endif()
+
+ # Make input file paths absolute
+ foreach(var IN ITEMS EXECUTABLES LIBRARIES MODULES)
+ string(PREPEND var arg_)
+ set(abspaths "")
+ foreach(path IN LISTS ${var})
+ get_filename_component(abspath "${path}" REALPATH BASE_DIR "${QT_DEPLOY_PREFIX}")
+ list(APPEND abspaths "${abspath}")
+ endforeach()
+ set(${var} "${abspaths}")
+ endforeach()
+
+ # We need to get the runtime dependencies of plugins too.
+ list(APPEND arg_MODULES ${__QT_DEPLOY_PLUGINS})
+
+ # Forward the arguments that are exactly the same for file(GET_RUNTIME_DEPENDENCIES).
+ set(file_GRD_args "")
+ foreach(var IN LISTS file_GRD_options)
+ if(NOT "${arg_${var}}" STREQUAL "")
+ list(APPEND file_GRD_args ${var} ${arg_${var}})
+ endif()
+ endforeach()
+
+ # Compile a list of regular expressions that represent ignored library directories.
+ if("${arg_POST_EXCLUDE_REGEXES}" STREQUAL "")
+ set(regexes "")
+ foreach(path IN LISTS QT_DEPLOY_IGNORED_LIB_DIRS)
+ _qt_internal_re_escape(path_rex "${path}")
+ list(APPEND regexes "^${path_rex}")
+ endforeach()
+ if(regexes)
+ list(APPEND file_GRD_args POST_EXCLUDE_REGEXES ${regexes})
+ endif()
+ endif()
+
+ # Get the runtime dependencies recursively.
+ file(GET_RUNTIME_DEPENDENCIES
+ ${file_GRD_args}
+ RESOLVED_DEPENDENCIES_VAR resolved
+ UNRESOLVED_DEPENDENCIES_VAR unresolved
+ CONFLICTING_DEPENDENCIES_PREFIX conflicting
+ )
+ if(verbose)
+ message("file(GET_RUNTIME_DEPENDENCIES ${file_args})")
+ foreach(file IN LISTS resolved)
+ message(" resolved: ${file}")
+ endforeach()
+ foreach(file IN LISTS unresolved)
+ message(" unresolved: ${file}")
+ endforeach()
+ foreach(file IN LISTS conflicting_FILENAMES)
+ message(" conflicting: ${file}")
+ message(" with ${conflicting_${file}}")
+ endforeach()
+ endif()
+
+ # Deploy the Qt libraries.
+ file(INSTALL ${resolved}
+ DESTINATION "${CMAKE_INSTALL_PREFIX}/${arg_LIB_DIR}"
+ FOLLOW_SYMLINK_CHAIN
+ )
+
+ # Determine the runtime path origin marker if necessary.
+ if(__QT_DEPLOY_MUST_ADJUST_PLUGINS_RPATH)
+ _qt_internal_get_rpath_origin(rpath_origin)
+ endif()
+
+ # Deploy the Qt plugins.
+ foreach(file_path IN LISTS __QT_DEPLOY_PLUGINS)
+ file(RELATIVE_PATH destination
+ "${__QT_DEPLOY_QT_INSTALL_PREFIX}/${__QT_DEPLOY_QT_INSTALL_PLUGINS}"
+ "${file_path}"
+ )
+ get_filename_component(destination "${destination}" DIRECTORY)
+ string(PREPEND destination "${CMAKE_INSTALL_PREFIX}/${arg_PLUGINS_DIR}/")
+ file(INSTALL ${file_path} DESTINATION ${destination})
+
+ if(__QT_DEPLOY_MUST_ADJUST_PLUGINS_RPATH)
+ get_filename_component(file_name ${file_path} NAME)
+ file(RELATIVE_PATH rel_lib_dir "${destination}"
+ "${QT_DEPLOY_PREFIX}/${QT_DEPLOY_LIB_DIR}")
+ _qt_internal_set_rpath(
+ FILE "${destination}/${file_name}"
+ NEW_RPATH "${rpath_origin}/${rel_lib_dir}"
+ )
+ endif()
+ endforeach()
+
+ # Deploy translations.
+ if(NOT arg_NO_TRANSLATIONS)
+ qt6_deploy_translations()
+ endif()
+
+ _qt_internal_run_deployment_hooks(${ARGV} RESOLVED_DEPENDENCIES ${resolved})
+endfunction()
+
+function(qt6_deploy_runtime_dependencies)
+
+ if(NOT __QT_DEPLOY_TOOL)
+ message(FATAL_ERROR "No Qt deploy tool available for this target platform")
+ endif()
+
+ set(no_value_options
+ GENERATE_QT_CONF
+ VERBOSE
+ NO_OVERWRITE
+ NO_APP_STORE_COMPLIANCE # TODO: Might want a better name
+ NO_TRANSLATIONS
+ NO_COMPILER_RUNTIME
+ )
+ set(single_value_options
+ EXECUTABLE
+ BIN_DIR
+ LIB_DIR
+ LIBEXEC_DIR
+ PLUGINS_DIR
+ QML_DIR
+ )
+ set(file_GRD_options
+ # The following include/exclude options are only used if the "generic deploy tool" is
+ # used. The options are what file(GET_RUNTIME_DEPENDENCIES) supports.
+ PRE_INCLUDE_REGEXES
+ PRE_EXCLUDE_REGEXES
+ POST_INCLUDE_REGEXES
+ POST_EXCLUDE_REGEXES
+ POST_INCLUDE_FILES
+ POST_EXCLUDE_FILES
+ )
+ set(multi_value_options
+ # These ADDITIONAL_... options are based on what file(GET_RUNTIME_DEPENDENCIES)
+ # supports. We differentiate between the types of binaries so that we keep
+ # open the possibility of switching to a purely CMake implementation of
+ # the deploy tool based on file(GET_RUNTIME_DEPENDENCIES) instead of the
+ # individual platform-specific tools (macdeployqt, windeployqt, etc.).
+ ADDITIONAL_EXECUTABLES
+ ADDITIONAL_LIBRARIES
+ ADDITIONAL_MODULES
+ ${file_GRD_options}
+ DEPLOY_TOOL_OPTIONS
+ )
+ cmake_parse_arguments(PARSE_ARGV 0 arg
+ "${no_value_options}" "${single_value_options}" "${multi_value_options}"
+ )
+
+ if(arg_UNPARSED_ARGUMENTS)
+ message(FATAL_ERROR "Unparsed arguments: ${arg_UNPARSED_ARGUMENTS}")
+ endif()
+
+ if(NOT arg_EXECUTABLE)
+ message(FATAL_ERROR "EXECUTABLE must be specified")
+ endif()
+
+ # None of these are used if the executable is a macOS app bundle
+ if(NOT arg_BIN_DIR)
+ set(arg_BIN_DIR "${QT_DEPLOY_BIN_DIR}")
+ endif()
+ if(NOT arg_LIBEXEC_DIR)
+ set(arg_LIBEXEC_DIR "${QT_DEPLOY_LIBEXEC_DIR}")
+ endif()
+ if(NOT arg_LIB_DIR)
+ set(arg_LIB_DIR "${QT_DEPLOY_LIB_DIR}")
+ endif()
+ if(NOT arg_QML_DIR)
+ set(arg_QML_DIR "${QT_DEPLOY_QML_DIR}")
+ endif()
+ if(NOT arg_PLUGINS_DIR)
+ set(arg_PLUGINS_DIR "${QT_DEPLOY_PLUGINS_DIR}")
+ endif()
+
+ # macdeployqt always writes out a qt.conf file. It will complain if one
+ # already exists, so leave it to create it for us if we will be running it.
+ if(__QT_DEPLOY_SYSTEM_NAME STREQUAL Darwin)
+ # We might get EXECUTABLE pointing to either the actual binary under the
+ # Contents/MacOS directory, or it might be pointing to the top of the
+ # app bundle (i.e. the <appname>.app directory). We want the latter to
+ # pass to macdeployqt.
+ if(arg_EXECUTABLE MATCHES "^((.*/)?(.*).app)/Contents/MacOS/(.*)$")
+ set(arg_EXECUTABLE "${CMAKE_MATCH_1}")
+ endif()
+ elseif(arg_GENERATE_QT_CONF)
+ set(exe_dir "${QT_DEPLOY_BIN_DIR}")
+ if(exe_dir STREQUAL "" OR exe_dir STREQUAL ".")
+ set(exe_dir ".")
+ set(prefix ".")
+ else()
+ string(REPLACE "/" ";" path "${exe_dir}")
+ list(LENGTH path path_count)
+ string(REPEAT "../" ${path_count} rel_path)
+ string(REGEX REPLACE "/+$" "" prefix "${rel_path}")
+ endif()
+ qt6_deploy_qt_conf("${QT_DEPLOY_PREFIX}/${exe_dir}/qt.conf"
+ PREFIX "${prefix}"
+ BIN_DIR "${arg_BIN_DIR}"
+ LIB_DIR "${arg_LIB_DIR}"
+ PLUGINS_DIR "${arg_PLUGINS_DIR}"
+ QML_DIR "${arg_QML_DIR}"
+ )
+ endif()
+
+ set(extra_binaries_option "")
+ set(tool_options "")
+
+ if(arg_VERBOSE OR __QT_DEPLOY_VERBOSE)
+ # macdeployqt supports 0-3: 0=no output, 1=error/warn (default), 2=normal, 3=debug
+ # windeployqt supports 0-2: 0=error/warn (default), 1=verbose, 2=full_verbose
+ if(__QT_DEPLOY_SYSTEM_NAME STREQUAL Windows)
+ list(APPEND tool_options --verbose 2)
+ elseif(__QT_DEPLOY_SYSTEM_NAME STREQUAL Darwin)
+ list(APPEND tool_options -verbose=3)
+ else()
+ list(APPEND tool_options VERBOSE)
+ endif()
+ endif()
+
+ if(__QT_DEPLOY_SYSTEM_NAME STREQUAL Windows)
+ list(APPEND tool_options
+ --dir .
+ --libdir "${arg_BIN_DIR}" # NOTE: Deliberately not arg_LIB_DIR
+ --plugindir "${arg_PLUGINS_DIR}"
+ --qml-deploy-dir "${arg_QML_DIR}"
+ --translationdir "${QT_DEPLOY_TRANSLATIONS_DIR}"
+ )
+ if(NOT arg_NO_OVERWRITE)
+ list(APPEND tool_options --force)
+ endif()
+ if(arg_NO_TRANSLATIONS)
+ list(APPEND tool_options --no-translations)
+ endif()
+ if(arg_NO_COMPILER_RUNTIME)
+ list(APPEND tool_options --no-compiler-runtime)
+ endif()
+
+ # Specify path to target Qt's qtpaths .exe or .bat file, so windeployqt deploys the correct
+ # libraries when cross-compiling from x86_64 to arm64 windows.
+ if(__QT_DEPLOY_TARGET_QT_PATHS_PATH AND EXISTS "${__QT_DEPLOY_TARGET_QT_PATHS_PATH}")
+ list(APPEND tool_options --qtpaths "${__QT_DEPLOY_TARGET_QT_PATHS_PATH}")
+ else()
+ message(WARNING
+ "No qtpaths executable found for target Qt "
+ "at: ${__QT_DEPLOY_TARGET_QT_PATHS_PATH}. "
+ "Libraries may not be deployed correctly.")
+ endif()
+
+ list(APPEND tool_options ${arg_DEPLOY_TOOL_OPTIONS})
+ elseif(__QT_DEPLOY_SYSTEM_NAME STREQUAL Darwin)
+ set(extra_binaries_option "-executable=")
+ if(NOT arg_NO_APP_STORE_COMPLIANCE)
+ list(APPEND tool_options -appstore-compliant)
+ endif()
+ if(NOT arg_NO_OVERWRITE)
+ list(APPEND tool_options -always-overwrite)
+ endif()
+ list(APPEND tool_options ${arg_DEPLOY_TOOL_OPTIONS})
+ endif()
+
+ # This is an internal variable. It is normally unset and is only intended
+ # for debugging purposes. It may be removed at any time without warning.
+ list(APPEND tool_options ${__qt_deploy_tool_extra_options})
+
+ if(__QT_DEPLOY_TOOL STREQUAL "GRD")
+ message(STATUS "Running generic Qt deploy tool on ${arg_EXECUTABLE}")
+
+ if(NOT "${arg_DEPLOY_TOOL_OPTIONS}" STREQUAL "")
+ message(WARNING
+ "DEPLOY_TOOL_OPTIONS was specified but has no effect when using the generic "
+ "deployment tool."
+ )
+ endif()
+
+ # Construct the EXECUTABLES, LIBRARIES and MODULES arguments.
+ list(APPEND tool_options EXECUTABLES ${arg_EXECUTABLE})
+ if(NOT "${arg_ADDITIONAL_EXECUTABLES}" STREQUAL "")
+ list(APPEND tool_options ${arg_ADDITIONAL_EXECUTABLES})
+ endif()
+ foreach(file_type LIBRARIES MODULES)
+ if("${arg_ADDITIONAL_${file_type}}" STREQUAL "")
+ continue()
+ endif()
+ list(APPEND tool_options ${file_type} ${arg_ADDITIONAL_${file_type}})
+ endforeach()
+
+ # Forward the arguments that are exactly the same for file(GET_RUNTIME_DEPENDENCIES).
+ foreach(var IN LISTS file_GRD_options)
+ if(NOT "${arg_${var}}" STREQUAL "")
+ list(APPEND tool_options ${var} ${arg_${var}})
+ endif()
+ endforeach()
+
+ if(arg_NO_TRANSLATIONS)
+ list(APPEND tool_options NO_TRANSLATIONS)
+ endif()
+
+ _qt_internal_generic_deployqt(
+ EXECUTABLE "${arg_EXECUTABLE}"
+ LIB_DIR "${arg_LIB_DIR}"
+ PLUGINS_DIR "${arg_PLUGINS_DIR}"
+ ${tool_options}
+ )
+ return()
+ endif()
+
+ # Both windeployqt and macdeployqt don't differentiate between the different
+ # types of binaries, so we merge the lists and treat them all the same.
+ set(additional_binaries
+ ${arg_ADDITIONAL_EXECUTABLES}
+ ${arg_ADDITIONAL_LIBRARIES}
+ ${arg_ADDITIONAL_MODULES}
+ )
+ foreach(extra_binary IN LISTS additional_binaries)
+ list(APPEND tool_options "${extra_binaries_option}${extra_binary}")
+ endforeach()
+
+ message(STATUS
+ "Running Qt deploy tool for ${arg_EXECUTABLE} in working directory '${QT_DEPLOY_PREFIX}'")
+ execute_process(
+ COMMAND_ECHO STDOUT
+ COMMAND "${__QT_DEPLOY_TOOL}" "${arg_EXECUTABLE}" ${tool_options}
+ WORKING_DIRECTORY "${QT_DEPLOY_PREFIX}"
+ RESULT_VARIABLE result
+ )
+ if(result)
+ message(FATAL_ERROR "Executing ${__QT_DEPLOY_TOOL} failed: ${result}")
+ endif()
+
+endfunction()
+
+if(NOT __QT_NO_CREATE_VERSIONLESS_FUNCTIONS)
+ function(qt_deploy_runtime_dependencies)
+ if(__QT_DEFAULT_MAJOR_VERSION EQUAL 6)
+ qt6_deploy_runtime_dependencies(${ARGV})
+ else()
+ message(FATAL_ERROR "qt_deploy_runtime_dependencies() is only available in Qt 6.")
+ endif()
+ endfunction()
+endif()
+
+function(_qt_internal_show_skip_runtime_deploy_message qt_build_type_string)
+ set(no_value_options "")
+ set(single_value_options
+ EXTRA_MESSAGE
+ )
+ set(multi_value_options "")
+ cmake_parse_arguments(PARSE_ARGV 1 arg
+ "${no_value_options}" "${single_value_options}" "${multi_value_options}"
+ )
+ message(STATUS
+ "Skipping runtime deployment steps. "
+ "Support for installing runtime dependencies is not implemented for "
+ "this target platform (${__QT_DEPLOY_SYSTEM_NAME}, ${qt_build_type_string}). "
+ "${arg_EXTRA_MESSAGE}"
+ )
+endfunction()
+
+# This function is currently in Technical Preview.
+# Its signature and behavior might change.
+function(qt6_deploy_translations)
+ set(no_value_options VERBOSE)
+ set(single_value_options
+ LCONVERT
+ )
+ set(multi_value_options
+ CATALOGS
+ LOCALES
+ )
+ cmake_parse_arguments(PARSE_ARGV 0 arg
+ "${no_value_options}" "${single_value_options}" "${multi_value_options}"
+ )
+
+ set(verbose OFF)
+ if(arg_VERBOSE OR __QT_DEPLOY_VERBOSE)
+ set(verbose ON)
+ endif()
+
+ if(arg_CATALOGS)
+ set(catalogs ${arg_CATALOGS})
+ else()
+ set(catalogs ${__QT_DEPLOY_I18N_CATALOGS})
+ endif()
+
+ get_filename_component(qt_translations_dir "${__QT_DEPLOY_QT_INSTALL_TRANSLATIONS}" ABSOLUTE
+ BASE_DIR "${__QT_DEPLOY_QT_INSTALL_PREFIX}"
+ )
+ set(locales ${arg_LOCALES})
+ if(NOT locales)
+ file(GLOB locales RELATIVE "${qt_translations_dir}" "${qt_translations_dir}/*.qm")
+ list(TRANSFORM locales REPLACE "\\.qm$" "")
+ list(TRANSFORM locales REPLACE "^qt_help" "qt-help")
+ list(TRANSFORM locales REPLACE "^[^_]+" "")
+ list(TRANSFORM locales REPLACE "^_" "")
+ list(REMOVE_DUPLICATES locales)
+ endif()
+
+ # Ensure existence of the output directory.
+ set(output_dir "${QT_DEPLOY_PREFIX}/${QT_DEPLOY_TRANSLATIONS_DIR}")
+ if(NOT EXISTS "${output_dir}")
+ file(MAKE_DIRECTORY "${output_dir}")
+ endif()
+
+ # Locate lconvert.
+ if(arg_LCONVERT)
+ set(lconvert "${arg_LCONVERT}")
+ else()
+ set(lconvert "${__QT_DEPLOY_QT_INSTALL_PREFIX}/${__QT_DEPLOY_QT_INSTALL_BINS}/lconvert")
+ if(CMAKE_HOST_WIN32)
+ string(APPEND lconvert ".exe")
+ endif()
+ if(NOT EXISTS ${lconvert})
+ message(STATUS "lconvert was not found. Skipping deployment of translations.")
+ return()
+ endif()
+ endif()
+
+ # Find the .qm files for the selected locales
+ if(verbose)
+ message(STATUS "Looking for translations in ${qt_translations_dir}")
+ endif()
+ foreach(locale IN LISTS locales)
+ set(qm_files "")
+ foreach(catalog IN LISTS catalogs)
+ set(qm_file "${catalog}_${locale}.qm")
+ if(EXISTS "${qt_translations_dir}/${qm_file}")
+ list(APPEND qm_files ${qm_file})
+ endif()
+ endforeach()
+
+ if(NOT qm_files)
+ message(WARNING "No translations found for requested locale '${locale}'.")
+ continue()
+ endif()
+
+ if(verbose)
+ foreach(qm_file IN LISTS qm_files)
+ message(STATUS "found translation file: ${qm_file}")
+ endforeach()
+ endif()
+
+ # Merge the .qm files into one qt_${locale}.qm file.
+ set(output_file_name "qt_${locale}.qm")
+ set(output_file_path "${output_dir}/${output_file_name}")
+ message(STATUS "Creating: ${output_file_path}")
+ set(extra_options)
+ if(verbose)
+ list(APPEND extra_options COMMAND_ECHO STDOUT)
+ endif()
+ execute_process(
+ COMMAND ${lconvert} -if qm -o ${output_file_path} ${qm_files}
+ WORKING_DIRECTORY ${qt_translations_dir}
+ RESULT_VARIABLE process_result
+ ${extra_options}
+ )
+ if(NOT process_result EQUAL "0")
+ if(process_result MATCHES "^[0-9]+$")
+ message(WARNING "lconvert failed with exit code ${process_result}.")
+ else()
+ message(WARNING "lconvert failed: ${process_result}.")
+ endif()
+ endif()
+ endforeach()
+endfunction()
+
+if(NOT __QT_NO_CREATE_VERSIONLESS_FUNCTIONS)
+ function(qt_deploy_translations)
+ if(__QT_DEFAULT_MAJOR_VERSION EQUAL 6)
+ qt6_deploy_translations(${ARGV})
+ else()
+ message(FATAL_ERROR "qt_deploy_translations() is only available in Qt 6.")
+ endif()
+ endfunction()
+endif()
diff --git a/src/corelib/Qt6CoreMacros.cmake b/src/corelib/Qt6CoreMacros.cmake
index a82cf30b36..9e71b4265a 100644
--- a/src/corelib/Qt6CoreMacros.cmake
+++ b/src/corelib/Qt6CoreMacros.cmake
@@ -1,34 +1,6 @@
-#=============================================================================
# Copyright 2005-2011 Kitware, 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 Kitware, 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
-# 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) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
######################################
#
@@ -36,8 +8,6 @@
#
######################################
-include(CMakeParseArguments)
-
set(__qt_core_macros_module_base_dir "${CMAKE_CURRENT_LIST_DIR}")
# macro used to create the names of output files preserving relative dirs
@@ -123,24 +93,43 @@ function(_qt_internal_create_moc_command infile outfile moc_flags moc_options
set(extra_output_files "${outfile}.json")
set(${out_json_file} "${extra_output_files}" PARENT_SCOPE)
endif()
- string (REPLACE ";" "\n" _moc_parameters "${_moc_parameters}")
if(moc_target)
- set(_moc_parameters_file ${_moc_parameters_file}$<$<BOOL:$<CONFIGURATION>>:_$<CONFIGURATION>>)
+ set(_moc_parameters_file ${_moc_parameters_file}$<$<BOOL:$<CONFIG>>:_$<CONFIG>>)
set(targetincludes "$<TARGET_PROPERTY:${moc_target},INCLUDE_DIRECTORIES>")
set(targetdefines "$<TARGET_PROPERTY:${moc_target},COMPILE_DEFINITIONS>")
- set(targetincludes "$<$<BOOL:${targetincludes}>:-I$<JOIN:${targetincludes},\n-I>\n>")
- set(targetdefines "$<$<BOOL:${targetdefines}>:-D$<JOIN:${targetdefines},\n-D>\n>")
+ set(targetincludes "$<$<BOOL:${targetincludes}>:-I$<JOIN:${targetincludes},;-I>>")
+ set(targetdefines "$<$<BOOL:${targetdefines}>:-D$<JOIN:${targetdefines},;-D>>")
+ set(_moc_parameters_list_without_genex)
+ set(_moc_parameters_list_with_genex)
+ foreach(_moc_parameter ${_moc_parameters})
+ if(_moc_parameter MATCHES "\\\$<")
+ list(APPEND _moc_parameters_list_with_genex ${_moc_parameter})
+ else()
+ list(APPEND _moc_parameters_list_without_genex ${_moc_parameter})
+ endif()
+ endforeach()
+
+ string(REPLACE ">" "$<ANGLE-R>" _moc_escaped_parameters "${_moc_parameters_list_without_genex}")
+ string(REPLACE "," "$<COMMA>" _moc_escaped_parameters "${_moc_escaped_parameters}")
+ string(REPLACE ";" "$<SEMICOLON>" _moc_escaped_parameters "${_moc_escaped_parameters}")
+ set(concatenated "$<$<BOOL:${targetincludes}>:${targetincludes};>$<$<BOOL:${targetdefines}>:${targetdefines};>$<$<BOOL:${_moc_escaped_parameters}>:${_moc_escaped_parameters};>")
+
+ list(APPEND concatenated ${_moc_parameters_list_with_genex})
+ set(concatenated "$<FILTER:$<REMOVE_DUPLICATES:${concatenated}>,EXCLUDE,^-[DI]$>")
+ set(concatenated "$<JOIN:${concatenated},\n>")
file (GENERATE
OUTPUT ${_moc_parameters_file}
- CONTENT "${targetdefines}${targetincludes}${_moc_parameters}\n"
+ CONTENT "${concatenated}"
)
+ set(concatenated)
set(targetincludes)
set(targetdefines)
else()
+ string (REPLACE ";" "\n" _moc_parameters "${_moc_parameters}")
file(WRITE ${_moc_parameters_file} "${_moc_parameters}\n")
endif()
@@ -151,8 +140,12 @@ function(_qt_internal_create_moc_command infile outfile moc_flags moc_options
${_moc_working_dir}
VERBATIM)
set_source_files_properties(${infile} PROPERTIES SKIP_AUTOMOC ON)
- set_source_files_properties(${outfile} PROPERTIES SKIP_AUTOMOC ON)
- set_source_files_properties(${outfile} PROPERTIES SKIP_AUTOUIC ON)
+ set_source_files_properties(${outfile} PROPERTIES SKIP_AUTOMOC ON
+ SKIP_AUTOUIC ON
+ )
+ if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.27")
+ set_source_files_properties(${outfile} PROPERTIES SKIP_LINTING ON)
+ endif()
endfunction()
function(qt6_generate_moc infile outfile )
@@ -207,7 +200,49 @@ function(qt6_wrap_cpp outfiles )
foreach(it ${moc_files})
get_filename_component(it ${it} ABSOLUTE)
- _qt_internal_make_output_file(${it} moc_ cpp outfile)
+ get_filename_component(it_ext ${it} EXT)
+ # remove the dot
+ string(SUBSTRING ${it_ext} 1 -1 it_ext)
+ set(HEADER_REGEX "(h|hh|h\\+\\+|hm|hpp|hxx|in|txx|inl)$")
+
+ if(it_ext MATCHES "${HEADER_REGEX}")
+ _qt_internal_make_output_file("${it}" moc_ cpp outfile)
+ set(is_header_file TRUE)
+ else()
+ set(found_source_extension FALSE)
+ foreach(LANG C CXX OBJC OBJCXX CUDA)
+ list(FIND CMAKE_${LANG}_SOURCE_FILE_EXTENSIONS "${it_ext}"
+ index)
+ if(${index} GREATER -1)
+ set(found_extension TRUE)
+ break()
+ endif()
+ endforeach()
+ if(found_extension)
+ if(TARGET ${moc_target})
+ _qt_internal_make_output_file(${it} "" moc outfile)
+ target_sources(${moc_target} PRIVATE "${outfile}")
+ target_include_directories("${moc_target}" PRIVATE
+ "${CMAKE_CURRENT_BINARY_DIR}")
+ else()
+ if("${moc_target}" STREQUAL "")
+ string(JOIN "" err_msg
+ "qt6_wrap_cpp: TARGET parameter is empty. "
+ "Since the file ${it} is a source file, "
+ "the TARGET option must be specified.")
+ else()
+ string(JOIN "" err_msg
+ "qt6_wrap_cpp: TARGET \"${moc_target}\" "
+ "not found.")
+ endif()
+ message(FATAL_ERROR "${err_msg}")
+ endif()
+ else()
+ string(JOIN "" err_msg "qt6_wrap_cpp: Unknown file extension: "
+ "\"\.${it_ext}\".")
+ message(FATAL_ERROR "${err_msg}")
+ endif()
+ endif()
set(out_json_file_var "")
if(_WRAP_CPP___QT_INTERNAL_OUTPUT_MOC_JSON_FILES)
@@ -222,7 +257,10 @@ function(qt6_wrap_cpp outfiles )
list(APPEND metatypes_json_list "${${out_json_file_var}}")
endif()
endforeach()
- set(${outfiles} ${${outfiles}} PARENT_SCOPE)
+
+ if(is_header_file)
+ set(${outfiles} "${${outfiles}}" PARENT_SCOPE)
+ endif()
if(metatypes_json_list)
set(${_WRAP_CPP___QT_INTERNAL_OUTPUT_MOC_JSON_FILES}
@@ -291,6 +329,10 @@ function(qt6_add_binary_resources target )
set(rcc_options ${_RCC_OPTIONS})
set(rcc_destination ${_RCC_DESTINATION})
+ if(NOT QT_FEATURE_zstd)
+ list(APPEND rcc_options "--no-zstd")
+ endif()
+
if(NOT rcc_destination)
set(rcc_destination ${CMAKE_CURRENT_BINARY_DIR}/${target}.rcc)
endif()
@@ -355,6 +397,10 @@ function(qt6_add_resources outfiles )
message(WARNING "Use qt6_add_binary_resources for binary option")
endif()
+ if(NOT QT_FEATURE_zstd)
+ list(APPEND rcc_options "--no-zstd")
+ endif()
+
foreach(it ${rcc_files})
get_filename_component(outfilename ${it} NAME_WE)
get_filename_component(infile ${it} ABSOLUTE)
@@ -369,8 +415,11 @@ function(qt6_add_resources outfiles )
MAIN_DEPENDENCY ${infile}
DEPENDS ${_rc_depends} "${_out_depends}" ${QT_CMAKE_EXPORT_NAMESPACE}::rcc
VERBATIM)
- set_source_files_properties(${outfile} PROPERTIES SKIP_AUTOMOC ON)
- set_source_files_properties(${outfile} PROPERTIES SKIP_AUTOUIC ON)
+ set_source_files_properties(${outfile} PROPERTIES SKIP_AUTOMOC ON
+ SKIP_AUTOUIC ON
+ SKIP_UNITY_BUILD_INCLUSION ON
+ SKIP_PRECOMPILE_HEADERS ON
+ )
list(APPEND ${outfiles} ${outfile})
endforeach()
set(${outfiles} ${${outfiles}} PARENT_SCOPE)
@@ -399,6 +448,18 @@ endif()
# qt6_add_big_resources(outfiles inputfile ... )
function(qt6_add_big_resources outfiles )
+ if(CMAKE_GENERATOR STREQUAL "Xcode" AND IOS)
+ message(WARNING
+ "Due to CMake limitations, qt6_add_big_resources can't be used when building for iOS. "
+ "See https://bugreports.qt.io/browse/QTBUG-103497 for details. "
+ "Falling back to using qt6_add_resources. "
+ "Consider using qt6_add_resources directly to silence this warning."
+ )
+ qt6_add_resources(${ARGV})
+ set(${outfiles} ${${outfiles}} PARENT_SCOPE)
+ return()
+ endif()
+
if (CMAKE_VERSION VERSION_LESS 3.9)
message(FATAL_ERROR, "qt6_add_big_resources requires CMake 3.9 or newer")
endif()
@@ -416,6 +477,10 @@ function(qt6_add_big_resources outfiles )
message(WARNING "Use qt6_add_binary_resources for binary option")
endif()
+ if(NOT QT_FEATURE_zstd)
+ list(APPEND rcc_options "--no-zstd")
+ endif()
+
foreach(it ${rcc_files})
get_filename_component(outfilename ${it} NAME_WE)
@@ -437,29 +502,64 @@ function(qt6_add_big_resources outfiles )
_qt6_parse_qrc_file(${infile} _out_depends _rc_depends)
set_source_files_properties(${infile} PROPERTIES SKIP_AUTOGEN ON)
+ if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.27")
+ set_source_files_properties(${tmpoutfile} PROPERTIES SKIP_LINTING ON)
+ endif()
add_custom_command(OUTPUT ${tmpoutfile}
COMMAND ${QT_CMAKE_EXPORT_NAMESPACE}::rcc ${rcc_options} --name ${outfilename} --pass 1 --output ${tmpoutfile} ${infile}
DEPENDS ${infile} ${_rc_depends} "${out_depends}" ${QT_CMAKE_EXPORT_NAMESPACE}::rcc
+ COMMENT "Running rcc pass 1 for resource ${outfilename}"
VERBATIM)
add_custom_target(big_resources_${outfilename} ALL DEPENDS ${tmpoutfile})
- add_library(rcc_object_${outfilename} OBJECT ${tmpoutfile})
- _qt_internal_set_up_static_runtime_library(rcc_object_${outfilename})
- target_compile_definitions(rcc_object_${outfilename} PUBLIC "$<TARGET_PROPERTY:Qt6::Core,INTERFACE_COMPILE_DEFINITIONS>")
- set_target_properties(rcc_object_${outfilename} PROPERTIES AUTOMOC OFF)
- set_target_properties(rcc_object_${outfilename} PROPERTIES AUTOUIC OFF)
+ _qt_internal_add_rcc_pass2(
+ RESOURCE_NAME ${outfilename}
+ RCC_OPTIONS ${rcc_options}
+ OBJECT_LIB rcc_object_${outfilename}
+ QRC_FILE ${infile}
+ PASS1_OUTPUT_FILE ${tmpoutfile}
+ OUT_OBJECT_FILE ${outfile}
+ )
add_dependencies(rcc_object_${outfilename} big_resources_${outfilename})
- # The modification of TARGET_OBJECTS needs the following change in cmake
- # https://gitlab.kitware.com/cmake/cmake/commit/93c89bc75ceee599ba7c08b8fe1ac5104942054f
- add_custom_command(OUTPUT ${outfile}
- COMMAND ${QT_CMAKE_EXPORT_NAMESPACE}::rcc
- ARGS ${rcc_options} --name ${outfilename} --pass 2 --temp $<TARGET_OBJECTS:rcc_object_${outfilename}> --output ${outfile} ${infile}
- DEPENDS rcc_object_${outfilename} $<TARGET_OBJECTS:rcc_object_${outfilename}> ${QT_CMAKE_EXPORT_NAMESPACE}::rcc
- VERBATIM)
- list(APPEND ${outfiles} ${outfile})
+ list(APPEND ${outfiles} ${outfile})
endforeach()
set(${outfiles} ${${outfiles}} PARENT_SCOPE)
endfunction()
+function(_qt_internal_add_rcc_pass2)
+ set(options)
+ set(oneValueArgs
+ RESOURCE_NAME
+ OBJECT_LIB
+ QRC_FILE
+ PASS1_OUTPUT_FILE
+ OUT_OBJECT_FILE
+ )
+ set(multiValueArgs
+ RCC_OPTIONS
+ )
+ cmake_parse_arguments(arg "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
+
+ add_library(${arg_OBJECT_LIB} OBJECT ${arg_PASS1_OUTPUT_FILE})
+ _qt_internal_set_up_static_runtime_library(${arg_OBJECT_LIB})
+ target_compile_definitions(${arg_OBJECT_LIB} PUBLIC
+ "$<TARGET_PROPERTY:Qt6::Core,INTERFACE_COMPILE_DEFINITIONS>")
+ set_target_properties(${arg_OBJECT_LIB} PROPERTIES
+ AUTOMOC OFF
+ AUTOUIC OFF)
+ # The modification of TARGET_OBJECTS needs the following change in cmake
+ # https://gitlab.kitware.com/cmake/cmake/commit/93c89bc75ceee599ba7c08b8fe1ac5104942054f
+ add_custom_command(
+ OUTPUT ${arg_OUT_OBJECT_FILE}
+ COMMAND ${QT_CMAKE_EXPORT_NAMESPACE}::rcc
+ ${arg_RCC_OPTIONS} --name ${arg_RESOURCE_NAME} --pass 2
+ --temp $<TARGET_OBJECTS:${arg_OBJECT_LIB}>
+ --output ${arg_OUT_OBJECT_FILE} ${arg_QRC_FILE}
+ DEPENDS ${arg_OBJECT_LIB} $<TARGET_OBJECTS:${arg_OBJECT_LIB}>
+ ${QT_CMAKE_EXPORT_NAMESPACE}::rcc
+ COMMENT "Running rcc pass 2 for resource ${arg_RESOURCE_NAME}"
+ VERBATIM)
+endfunction()
+
if(NOT QT_NO_CREATE_VERSIONLESS_FUNCTIONS)
function(qt_add_big_resources outfiles)
if(QT_DEFAULT_MAJOR_VERSION EQUAL 5)
@@ -510,9 +610,6 @@ endfunction()
set(_Qt6_COMPONENT_PATH "${CMAKE_CURRENT_LIST_DIR}/..")
-# This function is currently in Technical Preview.
-# It's signature and behavior might change.
-#
# Wrapper function that adds an executable with some Qt specific behavior.
# Some scenarios require steps to be deferred to the end of the current
# directory scope so that the caller has an opportunity to modify certain
@@ -520,8 +617,11 @@ set(_Qt6_COMPONENT_PATH "${CMAKE_CURRENT_LIST_DIR}/..")
function(qt6_add_executable target)
cmake_parse_arguments(PARSE_ARGV 1 arg "MANUAL_FINALIZATION" "" "")
+ _qt_internal_warn_about_example_add_subdirectory()
+
_qt_internal_create_executable("${target}" ${arg_UNPARSED_ARGUMENTS})
target_link_libraries("${target}" PRIVATE Qt6::Core)
+ set_property(TARGET ${target} PROPERTY _qt_expects_finalization TRUE)
if(arg_MANUAL_FINALIZATION)
# Caller says they will call qt6_finalize_target() themselves later
@@ -541,11 +641,25 @@ function(qt6_add_executable target)
endif()
endfunction()
+# Just like for qt_add_resources, we should disable zstd compression when cross-compiling to a
+# target that doesn't support zstd decompression, even if the host tool supports it.
+# Allow an opt out via a QT_NO_AUTORCC_ZSTD variable.
+function(_qt_internal_disable_autorcc_zstd_when_not_supported target)
+ if(TARGET "${target}"
+ AND DEFINED QT_FEATURE_zstd
+ AND NOT QT_FEATURE_zstd
+ AND NOT QT_NO_AUTORCC_ZSTD)
+ get_target_property(target_type ${target} TYPE)
+ if(NOT target_type STREQUAL "INTERFACE_LIBRARY")
+ set_property(TARGET "${target}" APPEND PROPERTY AUTORCC_OPTIONS "--no-zstd")
+ endif()
+ endif()
+endfunction()
+
function(_qt_internal_create_executable target)
- cmake_parse_arguments(arg "" "" "ANDROID_ABIS" ${ARGN})
if(ANDROID)
- list(REMOVE_ITEM arg_UNPARSED_ARGUMENTS "WIN32" "MACOSX_BUNDLE")
- add_library("${target}" MODULE ${arg_UNPARSED_ARGUMENTS})
+ list(REMOVE_ITEM ARGN "WIN32" "MACOSX_BUNDLE")
+ add_library("${target}" MODULE ${ARGN})
# On our qmake builds we do don't compile the executables with
# visibility=hidden. Not having this flag set will cause the
# executable to have main() hidden and can then no longer be loaded
@@ -554,124 +668,19 @@ function(_qt_internal_create_executable target)
set_property(TARGET "${target}" PROPERTY CXX_VISIBILITY_PRESET default)
set_property(TARGET "${target}" PROPERTY OBJC_VISIBILITY_PRESET default)
set_property(TARGET "${target}" PROPERTY OBJCXX_VISIBILITY_PRESET default)
+ set_property(TARGET "${target}"
+ PROPERTY _qt_android_apply_arch_suffix_called_from_qt_impl TRUE)
qt6_android_apply_arch_suffix("${target}")
set_property(TARGET "${target}" PROPERTY _qt_is_android_executable TRUE)
- # Build per-abi binaries for android
- if(NOT QT_IS_ANDROID_MULTI_ABI_EXTERNAL_PROJECT)
- if(QT_ANDROID_BUILD_ALL_ABIS)
- # Use autodetected Qt for Android ABIs.
- set(android_abis ${QT_DEFAULT_ANDROID_ABIS})
- elseif(arg_ANDROID_ABIS)
- # Use target-specific Qt for Android ABIs.
- set(android_abis ${arg_ANDROID_ABIS})
- elseif(QT_ANDROID_ABIS)
- # Use project-wide Qt for Android ABIs.
- set(android_abis ${QT_ANDROID_ABIS})
- else()
- # User have an empty list of Qt for Android ABIs.
- message(FATAL_ERROR
- "The list of Android ABIs is empty, when building ${target}.\n"
- "You have the following options to select ABIs for a target:\n"
- " - Set the QT_ANDROID_ABIS variable before calling qt6_add_executable\n"
- " - Add the ANDROID_ABIS parameter to the qt6_add_executable call\n"
- " - Set QT_ANDROID_BUILD_ALL_ABIS flag to try building with\n"
- " the list of autodetected Qt for Android:\n ${QT_DEFAULT_ANDROID_ABIS}"
- )
- endif()
-
- set(missing_qt_abi_toolchains "")
- # Create external projects for each android ABI except the main one.
- list(REMOVE_ITEM android_abis "${CMAKE_ANDROID_ARCH_ABI}")
- include(ExternalProject)
- foreach(abi IN ITEMS ${android_abis})
- if(NOT "${abi}" IN_LIST QT_DEFAULT_ANDROID_ABIS)
- list(APPEND missing_qt_abi_toolchains ${abi})
- list(REMOVE_ITEM android_abis "${abi}")
- continue()
- endif()
-
- get_cmake_property(is_multi_config GENERATOR_IS_MULTI_CONFIG)
- if(is_multi_config)
- list(JOIN CMAKE_CONFIGURATION_TYPES "$<SEMICOLON>" escaped_configuration_types)
- set(config_arg "-DCMAKE_CONFIGURATION_TYPES=${escaped_configuration_types}")
- else()
- set(config_arg "-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}")
- endif()
- set(android_abi_build_dir "${CMAKE_BINARY_DIR}/android_abi_builds/${abi}")
- get_property(abi_external_projects GLOBAL
- PROPERTY _qt_internal_abi_external_projects)
- if(NOT abi_external_projects
- OR NOT "qt_internal_android_${abi}" IN_LIST abi_external_projects)
- _qt_internal_get_android_abi_path(qt_abi_path ${abi})
- set(qt_abi_toolchain_path
- "${qt_abi_path}/lib/cmake/${QT_CMAKE_EXPORT_NAMESPACE}/qt.toolchain.cmake")
- ExternalProject_Add("qt_internal_android_${abi}"
- SOURCE_DIR "${CMAKE_SOURCE_DIR}"
- BINARY_DIR "${android_abi_build_dir}"
- CMAKE_ARGS "-DCMAKE_TOOLCHAIN_FILE=${qt_abi_toolchain_path}"
- "-DQT_IS_ANDROID_MULTI_ABI_EXTERNAL_PROJECT=ON"
- "-DQT_INTERNAL_ANDROID_MULTI_ABI_BINARY_DIR=${CMAKE_BINARY_DIR}"
- "${config_arg}"
- EXCLUDE_FROM_ALL TRUE
- STETPS_TARGETS
- BUILD_COMMAND "" # avoid top-level build of external project
- )
- set_property(GLOBAL APPEND PROPERTY
- _qt_internal_abi_external_projects "qt_internal_android_${abi}")
- endif()
- ExternalProject_Add_Step("qt_internal_android_${abi}"
- "${target}_build"
- DEPENDEES configure
- # TODO: Remove this when the step will depend on DEPFILE generated by
- # androiddeployqt for the ${target}.
- ALWAYS TRUE
- COMMAND "${CMAKE_COMMAND}"
- "--build" "${android_abi_build_dir}"
- "--config" "$<CONFIG>"
- "--target" "qt_internal_${target}_copy_apk_dependencies"
- )
- ExternalProject_Add_StepTargets("qt_internal_android_${abi}"
- "${target}_build")
- add_dependencies(${target} "qt_internal_android_${abi}-${target}_build")
- endforeach()
-
- if(missing_qt_abi_toolchains)
- list(JOIN missing_qt_abi_toolchains ", " missing_qt_abi_toolchains_string)
- message(FATAL_ERROR "Cannot find toolchain files for the manually specified Android"
- " ABIs: ${missing_qt_abi_toolchains_string}"
- "\nSkipping these ABIs."
- "\nNote that you also may manually specify the path to the required Qt for"
- " Android ABI using QT_PATH_ANDROID_ABI_<abi> CMake variable.\n")
- endif()
-
- list(JOIN android_abis ", " android_abis_string)
- if(android_abis_string)
- set(android_abis_string "${CMAKE_ANDROID_ARCH_ABI}(default), ${android_abis_string}")
- else()
- set(android_abis_string "${CMAKE_ANDROID_ARCH_ABI}(default)")
- endif()
- if(NOT QT_NO_ANDROID_ABI_STATUS_MESSAGE)
- message(STATUS "Configuring '${target}' for the following Android ABIs:"
- " ${android_abis_string}")
- endif()
- set_target_properties(${target} PROPERTIES _qt_android_abis "${android_abis}")
- endif()
else()
- add_executable("${target}" ${arg_UNPARSED_ARGUMENTS})
+ add_executable("${target}" ${ARGN})
endif()
+ _qt_internal_disable_autorcc_zstd_when_not_supported("${target}")
_qt_internal_set_up_static_runtime_library("${target}")
endfunction()
function(_qt_internal_finalize_executable target)
- get_target_property(is_finalized "${target}" _qt_executable_is_finalized)
- if(is_finalized)
- message(AUTHOR_WARNING
- "Tried to call qt6_finalize_target twice on executable: '${target}'. \
- Did you forget to specify MANUAL_FINALIZATION to qt6_add_executable?")
- return()
- endif()
-
# We can't evaluate generator expressions at configure time, so we can't
# ask for any transitive properties or even the full library dependency
# chain.
@@ -702,11 +711,15 @@ function(_qt_internal_finalize_executable target)
if(finalizers)
if(CMAKE_VERSION VERSION_LESS 3.18)
- # cmake_language() not available
- message(WARNING
- "Skipping module-specific finalizers for target ${target} "
- "(requires CMake 3.18 or later)"
- )
+ # cmake_language() not available, fall back to the slower method of
+ # writing a file and including it
+ set(contents "")
+ foreach(finalizer_func IN LISTS finalizers)
+ string(APPEND contents "${finalizer_func}(${target})\n")
+ endforeach()
+ set(finalizer_file "${CMAKE_CURRENT_BINARY_DIR}/.qt/finalize_${target}.cmake")
+ file(WRITE ${finalizer_file} "${contents}")
+ include(${finalizer_file})
else()
foreach(finalizer_func IN LISTS finalizers)
cmake_language(CALL ${finalizer_func} ${target})
@@ -714,15 +727,19 @@ function(_qt_internal_finalize_executable target)
endif()
endif()
- if(ANDROID)
- qt6_android_generate_deployment_settings("${target}")
- qt6_android_add_apk_target("${target}")
- endif()
if(EMSCRIPTEN)
_qt_internal_wasm_add_target_helpers("${target}")
+ _qt_internal_add_wasm_extra_exported_methods("${target}")
+ _qt_internal_set_wasm_export_name("${target}")
endif()
- if(IOS)
- _qt_internal_finalize_ios_app("${target}")
+
+ if(APPLE)
+ if(NOT CMAKE_SYSTEM_NAME OR CMAKE_SYSTEM_NAME STREQUAL "Darwin")
+ # macOS
+ _qt_internal_finalize_macos_app("${target}")
+ else()
+ _qt_internal_finalize_uikit_app("${target}")
+ endif()
endif()
# For finalizer mode of plugin importing to work safely, we need to know the list of Qt
@@ -735,8 +752,26 @@ function(_qt_internal_finalize_executable target)
__qt_internal_apply_plugin_imports_finalizer_mode("${target}")
__qt_internal_process_dependency_object_libraries("${target}")
endif()
+endfunction()
+
+function(_cat IN_FILE OUT_FILE)
+ file(READ ${IN_FILE} CONTENTS)
+ file(APPEND ${OUT_FILE} "${CONTENTS}\n")
+endfunction()
+
+function(_qt_internal_finalize_batch name)
+ find_package(Qt6 ${PROJECT_VERSION} CONFIG REQUIRED COMPONENTS Core)
- set_target_properties(${target} PROPERTIES _qt_executable_is_finalized TRUE)
+ set(generated_blacklist_file "${CMAKE_CURRENT_BINARY_DIR}/BLACKLIST")
+ get_target_property(blacklist_files "${name}" _qt_blacklist_files)
+ file(WRITE "${generated_blacklist_file}" "")
+ foreach(blacklist_file ${blacklist_files})
+ _cat("${blacklist_file}" "${generated_blacklist_file}")
+ endforeach()
+ qt_internal_add_resource(${name} "batch_blacklist"
+ PREFIX "/"
+ FILES "${CMAKE_CURRENT_BINARY_DIR}/BLACKLIST"
+ BASE ${CMAKE_CURRENT_BINARY_DIR})
endfunction()
# If a task needs to run before any targets are finalized in the current directory
@@ -746,6 +781,7 @@ function(_qt_internal_delay_finalization_until_after defer_id)
endfunction()
function(qt6_finalize_target target)
+ set_property(TARGET ${target} PROPERTY _qt_expects_finalization FALSE)
if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.19")
cmake_language(DEFER GET_CALL_IDS ids_queued)
get_directory_property(wait_for_ids qt_internal_finalizers_wait_for_ids)
@@ -771,176 +807,123 @@ function(qt6_finalize_target target)
message(FATAL_ERROR "No target '${target}' found in current scope.")
endif()
+ get_target_property(is_finalized "${target}" _qt_is_finalized)
+ if(is_finalized)
+ message(AUTHOR_WARNING
+ "Tried to call qt6_finalize_target twice on target '${target}'. "
+ "Did you forget to specify MANUAL_FINALIZATION to qt6_add_executable, "
+ "qt6_add_library or qt6_add_plugin?")
+ return()
+ endif()
+
+ _qt_internal_expose_deferred_files_to_ide(${target})
+ _qt_internal_finalize_source_groups(${target})
get_target_property(target_type ${target} TYPE)
get_target_property(is_android_executable "${target}" _qt_is_android_executable)
if(target_type STREQUAL "EXECUTABLE" OR is_android_executable)
_qt_internal_finalize_executable(${ARGV})
endif()
-endfunction()
-function(_qt_internal_find_ios_development_team_id out_var)
- get_property(team_id GLOBAL PROPERTY _qt_internal_ios_development_team_id)
- get_property(team_id_computed GLOBAL PROPERTY _qt_internal_ios_development_team_id_computed)
- if(team_id_computed)
- # Just in case if the value is non-empty but still booly FALSE.
- if(NOT team_id)
- set(team_id "")
+ if(APPLE)
+ # Tell CMake to generate run-scheme for the executable when generating
+ # Xcode projects. This avoids Xcode auto-generating default schemes for
+ # all targets, which includes internal and build-only targets.
+ get_target_property(generate_scheme "${target}" XCODE_GENERATE_SCHEME)
+ if(generate_scheme MATCHES "-NOTFOUND" AND (
+ target_type STREQUAL "EXECUTABLE" OR
+ target_type STREQUAL "SHARED_LIBRARY" OR
+ target_type STREQUAL "STATIC_LIBRARY" OR
+ target_type STREQUAL "MODULE_LIBRARY"))
+ set_property(TARGET "${target}" PROPERTY XCODE_GENERATE_SCHEME TRUE)
endif()
- set("${out_var}" "${team_id}" PARENT_SCOPE)
- return()
endif()
- set_property(GLOBAL PROPERTY _qt_internal_ios_development_team_id_computed "TRUE")
-
- set(home_dir "$ENV{HOME}")
- set(xcode_preferences_path "${home_dir}/Library/Preferences/com.apple.dt.Xcode.plist")
-
- # Extract the first account name (email) from the user's Xcode preferences
- message(DEBUG "Trying to extract an Xcode development team id from '${xcode_preferences_path}'")
- execute_process(COMMAND "/usr/libexec/PlistBuddy"
- -x -c "print IDEProvisioningTeams" "${xcode_preferences_path}"
- OUTPUT_VARIABLE teams_xml
- ERROR_VARIABLE plist_error)
- if(teams_xml AND NOT plist_error)
- string(REPLACE "\n" ";" teams_xml_lines "${teams_xml}")
- foreach(xml_line ${teams_xml_lines})
- if(xml_line MATCHES "<key>(.+)</key>")
- set(first_account "${CMAKE_MATCH_1}")
- string(STRIP "${first_account}" first_account)
- break()
- endif()
- endforeach()
- endif()
-
- if(NOT first_account)
- message(DEBUG "Failed to extract an Xcode development team id.")
- return()
+ if(target_type STREQUAL "SHARED_LIBRARY" OR
+ target_type STREQUAL "STATIC_LIBRARY" OR
+ target_type STREQUAL "MODULE_LIBRARY" OR
+ target_type STREQUAL "OBJECT_LIBRARY")
+ get_target_property(is_immediately_finalized "${target}" _qt_is_immediately_finalized)
+ get_target_property(uses_automoc ${target} AUTOMOC)
+ if(uses_automoc AND NOT is_immediately_finalized)
+ qt6_extract_metatypes(${target})
+ endif()
endif()
- # Extract the first team ID
- execute_process(COMMAND "/usr/libexec/PlistBuddy"
- -c "print IDEProvisioningTeams:${first_account}:0:teamID"
- "${xcode_preferences_path}"
- OUTPUT_VARIABLE team_id
- ERROR_VARIABLE team_id_error)
- if(team_id AND NOT team_id_error)
- message(DEBUG "Successfully extracted the first encountered Xcode development team id.")
- string(STRIP "${team_id}" team_id)
- set_property(GLOBAL PROPERTY _qt_internal_ios_development_team_id "${team_id}")
- set("${out_var}" "${team_id}" PARENT_SCOPE)
- else()
- set("${out_var}" "" PARENT_SCOPE)
- endif()
+ set_target_properties(${target} PROPERTIES _qt_is_finalized TRUE)
endfunction()
-function(_qt_internal_get_ios_bundle_identifier_prefix out_var)
- get_property(prefix GLOBAL PROPERTY _qt_internal_ios_bundle_identifier_prefix)
- get_property(prefix_computed GLOBAL PROPERTY
- _qt_internal_ios_bundle_identifier_prefix_computed)
- if(prefix_computed)
- # Just in case if the value is non-empty but still booly FALSE.
- if(NOT prefix)
- set(prefix "")
- endif()
- set("${out_var}" "${prefix}" PARENT_SCOPE)
+function(_qt_internal_finalize_source_groups target)
+ if(NOT ("${CMAKE_GENERATOR}" STREQUAL "Xcode"
+ OR "${CMAKE_GENERATOR}" MATCHES "^Visual Studio"))
return()
endif()
- set_property(GLOBAL PROPERTY _qt_internal_ios_bundle_identifier_prefix_computed "TRUE")
-
- set(home_dir "$ENV{HOME}")
- set(xcode_preferences_path "${home_dir}/Library/Preferences/com.apple.dt.Xcode.plist")
-
- message(DEBUG "Trying to extract the default bundle identifier prefix from Xcode preferences.")
- execute_process(COMMAND "/usr/libexec/PlistBuddy"
- -c "print IDETemplateOptions:bundleIdentifierPrefix"
- "${xcode_preferences_path}"
- OUTPUT_VARIABLE prefix
- ERROR_VARIABLE prefix_error)
- if(prefix AND NOT prefix_error)
- message(DEBUG "Successfully extracted the default bundle indentifier prefix.")
- string(STRIP "${prefix}" prefix)
- else()
- message(DEBUG "Failed to extract the default bundle indentifier prefix.")
+ get_target_property(sources ${target} SOURCES)
+ if(NOT sources)
+ return()
endif()
- if(prefix AND NOT prefix_error)
- set_property(GLOBAL PROPERTY _qt_internal_ios_bundle_identifier_prefix "${prefix}")
- set("${out_var}" "${prefix}" PARENT_SCOPE)
- else()
- set("${out_var}" "" PARENT_SCOPE)
- endif()
-endfunction()
+ get_target_property(source_dir ${target} SOURCE_DIR)
+ get_target_property(binary_dir ${target} BINARY_DIR)
-function(_qt_internal_get_default_ios_bundle_identifier out_var)
- _qt_internal_get_ios_bundle_identifier_prefix(prefix)
- if(NOT prefix)
- set(prefix "com.yourcompany")
+ get_property(generated_source_group GLOBAL PROPERTY AUTOGEN_SOURCE_GROUP)
+ if(NOT generated_source_group)
+ set(generated_source_group "Source Files/Generated")
endif()
- set("${out_var}" "${prefix}.\${PRODUCT_NAME:rfc1034identifier}" PARENT_SCOPE)
-endfunction()
-function(_qt_internal_set_placeholder_apple_bundle_version target)
- # If user hasn't provided neither a bundle version nor a bundle short version string for the
- # app, set a placeholder value for both which will add them to the generated Info.plist file.
- # This is required so that the app launches in the simulator (but apparently not for running
- # on-device).
- get_target_property(bundle_version "${target}" MACOSX_BUNDLE_BUNDLE_VERSION)
- get_target_property(bundle_short_version "${target}" MACOSX_BUNDLE_SHORT_VERSION_STRING)
-
- if(NOT MACOSX_BUNDLE_BUNDLE_VERSION AND
- NOT MACOSX_BUNDLE_SHORT_VERSION_STRING AND
- NOT bundle_version AND
- NOT bundle_short_version AND
- NOT QT_NO_SET_XCODE_BUNDLE_VERSION
- )
- set(bundle_version "0.0.1")
- set(bundle_short_version "0.0.1")
- set_target_properties("${target}"
- PROPERTIES
- MACOSX_BUNDLE_BUNDLE_VERSION "${bundle_version}"
- MACOSX_BUNDLE_SHORT_VERSION_STRING "${bundle_short_version}"
- )
- endif()
-endfunction()
+ foreach(source IN LISTS sources)
+ string(GENEX_STRIP "${source}" source)
-function(_qt_internal_finalize_ios_app target)
- # If user hasn't provided a development team id, try to find the first one specified
- # in the Xcode preferences.
- if(NOT CMAKE_XCODE_ATTRIBUTE_DEVELOPMENT_TEAM AND NOT QT_NO_SET_XCODE_DEVELOPMENT_TEAM_ID)
- get_target_property(existing_team_id "${target}" XCODE_ATTRIBUTE_DEVELOPMENT_TEAM)
- if(NOT existing_team_id)
- _qt_internal_find_ios_development_team_id(team_id)
- set_target_properties("${target}"
- PROPERTIES XCODE_ATTRIBUTE_DEVELOPMENT_TEAM "${team_id}")
+ if(IS_ABSOLUTE ${source})
+ set(source_file_path "${source}")
+ else()
+ # Resolve absolute path. Can't use LOCATION, as that
+ # will error out if the file doesn't exist :(
+ get_filename_component(source_file_path "${source}"
+ ABSOLUTE BASE_DIR "${source_dir}")
+ if(NOT EXISTS ${source_file_path})
+ # Likely generated file, will end up in build dir
+ get_filename_component(source_file_path "${source}"
+ ABSOLUTE BASE_DIR "${binary_dir}")
+ endif()
endif()
- endif()
- # If user hasn't provided a bundle identifier for the app, get a default identifier
- # using the default bundle prefix from Xcode preferences and add it to the generated
- # Info.plist file.
- if(NOT MACOSX_BUNDLE_GUI_IDENTIFIER AND NOT QT_NO_SET_XCODE_BUNDLE_IDENTIFIER)
- get_target_property(existing_id "${target}" MACOSX_BUNDLE_GUI_IDENTIFIER)
- if(NOT existing_id)
- _qt_internal_get_default_ios_bundle_identifier(bundle_id)
- set_target_properties("${target}"
- PROPERTIES MACOSX_BUNDLE_GUI_IDENTIFIER "${bundle_id}")
+ # Include qml files in "Source Files". Can not be done via regex,
+ # due to https://gitlab.kitware.com/cmake/cmake/-/issues/25597
+ if(${source_file_path} MATCHES "\\.qml$")
+ source_group("Source Files" FILES ${source_file_path})
endif()
- endif()
- # Reuse the same bundle identifier for the Xcode property.
- if(NOT CMAKE_XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER
- AND NOT QT_NO_SET_XCODE_BUNDLE_IDENTIFIER)
- get_target_property(existing_id "${target}" XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER)
- if(NOT existing_id)
- set_target_properties("${target}"
- PROPERTIES XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER
- "${bundle_id}")
+ get_source_file_property(is_generated "${source_file_path}" GENERATED)
+ if(${is_generated})
+ source_group(${generated_source_group} FILES ${source_file_path})
endif()
- endif()
+ endforeach()
+endfunction()
- _qt_internal_set_placeholder_apple_bundle_version("${target}")
+function(_qt_internal_darwin_permission_finalizer target)
+ get_target_property(plist_file "${target}" MACOSX_BUNDLE_INFO_PLIST)
+ if(NOT plist_file)
+ return()
+ endif()
+ foreach(plugin_target IN LISTS QT_ALL_PLUGINS_FOUND_BY_FIND_PACKAGE_permissions)
+ set(versioned_plugin_target "${QT_CMAKE_EXPORT_NAMESPACE}::${plugin_target}")
+ get_target_property(usage_descriptions
+ ${versioned_plugin_target}
+ _qt_info_plist_usage_descriptions)
+ foreach(usage_description_key IN LISTS usage_descriptions)
+ execute_process(COMMAND "/usr/libexec/PlistBuddy"
+ -c "print ${usage_description_key}" "${plist_file}"
+ OUTPUT_VARIABLE usage_description
+ ERROR_VARIABLE plist_error)
+ if(usage_description AND NOT plist_error)
+ set_target_properties("${target}"
+ PROPERTIES "_qt_has_${plugin_target}_usage_description" TRUE)
+ qt6_import_plugins(${target} INCLUDE ${versioned_plugin_target})
+ endif()
+ endforeach()
+ endforeach()
endfunction()
if(NOT QT_NO_CREATE_VERSIONLESS_FUNCTIONS)
@@ -1083,18 +1066,175 @@ if(NOT QT_NO_CREATE_VERSIONLESS_FUNCTIONS)
endfunction()
endif()
-function(qt6_extract_metatypes target)
+function(_qt_internal_assign_to_internal_targets_folder target)
+ get_property(folder_name GLOBAL PROPERTY QT_TARGETS_FOLDER)
+ if(NOT "${folder_name}" STREQUAL "")
+ set_property(TARGET ${target} PROPERTY FOLDER "${folder_name}")
+ endif()
+endfunction()
+function(_qt_internal_get_target_autogen_build_dir target out_var)
+ get_property(target_autogen_build_dir TARGET ${target} PROPERTY AUTOGEN_BUILD_DIR)
+ if(target_autogen_build_dir)
+ set(${out_var} "${target_autogen_build_dir}" PARENT_SCOPE)
+ else()
+ get_property(target_binary_dir TARGET ${target} PROPERTY BINARY_DIR)
+ set(${out_var} "${target_binary_dir}/${target}_autogen" PARENT_SCOPE)
+ endif()
+endfunction()
+
+function(_qt_internal_should_install_metatypes target)
+ set(args_option
+ INTERNAL_INSTALL
+ )
+ set(args_single
+ OUT_VAR
+ )
+ set(args_multi
+ )
+
+ cmake_parse_arguments(arg
+ "${args_option}"
+ "${args_single}"
+ "${args_multi}" ${ARGN})
+
+ # Check whether the generated json file needs to be installed.
+ # Executable metatypes.json files should not be installed. Qt non-prefix builds should also
+ # not install the files.
+ set(should_install FALSE)
+
+ get_target_property(target_type ${target} TYPE)
+ if(NOT target_type STREQUAL "EXECUTABLE" AND arg_INTERNAL_INSTALL)
+ set(should_install TRUE)
+ endif()
+ set(${arg_OUT_VAR} "${should_install}" PARENT_SCOPE)
+endfunction()
+
+function(_qt_internal_get_metatypes_install_dir internal_install_dir arch_data_dir out_var)
+ # Automatically fill default install args when not specified.
+ if(NOT internal_install_dir)
+ # INSTALL_ARCHDATADIR is not set when QtBuildInternals is not loaded
+ # (when not doing a Qt build). Default to a hardcoded location for user
+ # projects (will likely be wrong).
+ if(arch_data_dir)
+ set(install_dir "${arch_data_dir}/metatypes")
+ else()
+ set(install_dir "lib/metatypes")
+ endif()
+ else()
+ set(install_dir "${internal_install_dir}")
+ endif()
+ set(${out_var} "${install_dir}" PARENT_SCOPE)
+endfunction()
+
+# Propagates the build time metatypes file via INTERFACE_SOURCES (using $<BUILD_INTERFACE>)
+# and saves the path and file name in properties, so that they can be queryied in the qml api
+# implementation for the purpose of duplicating a qml module backing library's metatypes in its
+# associated plugin. This is required for qmltyperegistrar to get the full set of foreign types
+# when projects link to the plugin and not the backing library.
+function(_qt_internal_assign_build_metatypes_files_and_properties target)
get_target_property(existing_meta_types_file ${target} INTERFACE_QT_META_TYPES_BUILD_FILE)
if (existing_meta_types_file)
return()
endif()
set(args_option
- # TODO: Remove this once all leaf module usages of it are removed. It's now a no-op.
- # It's original purpose was to skip installation of the metatypes file.
- __QT_INTERNAL_NO_INSTALL
+ )
+ set(args_single
+ METATYPES_FILE_NAME
+ METATYPES_FILE_PATH
+ )
+ set(args_multi
+ )
+
+ cmake_parse_arguments(arg
+ "${args_option}"
+ "${args_single}"
+ "${args_multi}" ${ARGN})
+
+ if(NOT arg_METATYPES_FILE_NAME)
+ message(FATAL_ERROR "METATYPES_FILE_NAME must be specified")
+ endif()
+
+ if(NOT arg_METATYPES_FILE_PATH)
+ message(FATAL_ERROR "METATYPES_FILE_PATH must be specified")
+ endif()
+
+ set(metatypes_file_name "${arg_METATYPES_FILE_NAME}")
+ set(metatypes_file_path "${arg_METATYPES_FILE_PATH}")
+
+ # Set up consumption of files via INTERFACE_SOURCES.
+ set(consumes_metatypes "$<BOOL:$<TARGET_PROPERTY:QT_CONSUMES_METATYPES>>")
+ set(metatypes_file_genex_build
+ "$<BUILD_INTERFACE:$<${consumes_metatypes}:${metatypes_file_path}>>"
+ )
+ target_sources(${target} INTERFACE ${metatypes_file_genex_build})
+
+ set_target_properties(${target} PROPERTIES
+ INTERFACE_QT_MODULE_HAS_META_TYPES YES
+ # The property name is a bit misleading, it's not wrapped in a genex.
+ INTERFACE_QT_META_TYPES_BUILD_FILE "${metatypes_file_path}"
+ INTERFACE_QT_META_TYPES_FILE_NAME "${metatypes_file_name}"
+ )
+endfunction()
+# Same as above, but with $<INSTALL_INTERFACE>.
+function(_qt_internal_assign_install_metatypes_files_and_properties target)
+ get_target_property(existing_meta_types_file ${target} INTERFACE_QT_META_TYPES_INSTALL_FILE)
+ if (existing_meta_types_file)
+ return()
+ endif()
+
+ set(args_option
+ )
+ set(args_single
+ INSTALL_DIR
+ )
+ set(args_multi
+ )
+
+ cmake_parse_arguments(arg
+ "${args_option}"
+ "${args_single}"
+ "${args_multi}" ${ARGN})
+
+
+ get_target_property(metatypes_file_name "${target}" INTERFACE_QT_META_TYPES_FILE_NAME)
+
+ if(NOT metatypes_file_name)
+ message(FATAL_ERROR "INTERFACE_QT_META_TYPES_FILE_NAME of target ${target} is empty")
+ endif()
+
+ if(NOT arg_INSTALL_DIR)
+ message(FATAL_ERROR "INSTALL_DIR must be specified")
+ endif()
+
+ # Set up consumption of files via INTERFACE_SOURCES.
+ set(consumes_metatypes "$<BOOL:$<TARGET_PROPERTY:QT_CONSUMES_METATYPES>>")
+
+ set(install_dir "${arg_INSTALL_DIR}")
+
+ set(metatypes_file_install_path "${install_dir}/${metatypes_file_name}")
+ set(metatypes_file_install_path_genex "$<INSTALL_PREFIX>/${metatypes_file_install_path}")
+ set(metatypes_file_genex_install
+ "$<INSTALL_INTERFACE:$<${consumes_metatypes}:${metatypes_file_install_path_genex}>>"
+ )
+ target_sources(${target} INTERFACE ${metatypes_file_genex_install})
+
+ set_target_properties(${target} PROPERTIES
+ INTERFACE_QT_META_TYPES_INSTALL_FILE "${metatypes_file_install_path}"
+ )
+endfunction()
+
+
+function(qt6_extract_metatypes target)
+
+ get_target_property(existing_meta_types_file ${target} INTERFACE_QT_META_TYPES_BUILD_FILE)
+ if (existing_meta_types_file)
+ return()
+ endif()
+
+ set(args_option
# TODO: Move this into a separate internal function, so it doesn't pollute the public one.
# When given, metatypes files will be installed into the default Qt
# metatypes folder. Only to be used by the Qt build.
@@ -1104,7 +1244,7 @@ function(qt6_extract_metatypes target)
# TODO: Move this into a separate internal function, so it doesn't pollute the public one.
# Location where to install the metatypes file. Only used if
# __QT_INTERNAL_INSTALL is given. It defaults to the
- # ${CMAKE_INSTALL_PREFIX}/${INSTALL_LIBDIR}/metatypes directory.
+ # ${CMAKE_INSTALL_PREFIX}/${INSTALL_ARCHDATADIR}/metatypes directory.
# Executable metatypes files are never installed.
__QT_INTERNAL_INSTALL_DIR
@@ -1134,6 +1274,9 @@ function(qt6_extract_metatypes target)
set(type_list_file "${target_binary_dir}/meta_types/${target}_json_file_list.txt")
set(type_list_file_manual "${target_binary_dir}/meta_types/${target}_json_file_list_manual.txt")
+ set(target_autogen_build_dir "")
+ _qt_internal_get_target_autogen_build_dir(${target} target_autogen_build_dir)
+
get_target_property(uses_automoc ${target} AUTOMOC)
set(automoc_args)
set(automoc_dependencies)
@@ -1149,13 +1292,13 @@ function(qt6_extract_metatypes target)
set(cmake_autogen_cache_file
"${target_binary_dir}/CMakeFiles/${target}_autogen.dir/ParseCache.txt")
set(multi_config_args
- --cmake-autogen-include-dir-path "${target_binary_dir}/${target}_autogen/include"
+ --cmake-autogen-include-dir-path "${target_autogen_build_dir}/include"
)
else()
set(cmake_autogen_cache_file
"${target_binary_dir}/CMakeFiles/${target}_autogen.dir/ParseCache_$<CONFIG>.txt")
set(multi_config_args
- --cmake-autogen-include-dir-path "${target_binary_dir}/${target}_autogen/include_$<CONFIG>"
+ --cmake-autogen-include-dir-path "${target_autogen_build_dir}/include_$<CONFIG>"
"--cmake-multi-config")
endif()
@@ -1164,8 +1307,15 @@ function(qt6_extract_metatypes target)
set (use_dep_files FALSE)
if (CMAKE_VERSION VERSION_GREATER_EQUAL "3.17") # Requires automoc changes present only in 3.17
- if(CMAKE_GENERATOR STREQUAL "Ninja" OR CMAKE_GENERATOR STREQUAL "Ninja Multi-Config")
- set(use_dep_files TRUE)
+ if(CMAKE_GENERATOR STREQUAL "Ninja" OR
+ CMAKE_GENERATOR STREQUAL "Ninja Multi-Config" OR
+ (CMAKE_GENERATOR MATCHES "Makefiles" AND
+ CMAKE_VERSION VERSION_GREATER_EQUAL "3.28"))
+ if(DEFINED QT_USE_CMAKE_DEPFILES)
+ set(use_dep_files ${QT_USE_CMAKE_DEPFILES})
+ else()
+ set(use_dep_files TRUE)
+ endif()
endif()
endif()
@@ -1214,10 +1364,20 @@ function(qt6_extract_metatypes target)
COMMAND_EXPAND_LISTS
)
add_dependencies(${target}_automoc_json_extraction ${target}_autogen)
+ _qt_internal_assign_to_internal_targets_folder(${target}_automoc_json_extraction)
else()
- set(cmake_autogen_timestamp_file
- "${target_binary_dir}/${target}_autogen/timestamp"
- )
+ set(timestamp_file "${target_autogen_build_dir}/timestamp")
+ set(timestamp_file_with_config "${timestamp_file}_$<CONFIG>")
+ if (is_multi_config AND CMAKE_VERSION VERSION_GREATER_EQUAL "3.29"
+ AND NOT QT_INTERNAL_USE_OLD_AUTOGEN_GRAPH_MULTI_CONFIG_METATYPES)
+ string(JOIN "" timestamp_genex
+ "$<IF:$<BOOL:$<TARGET_PROPERTY:${target},"
+ "AUTOGEN_BETTER_GRAPH_MULTI_CONFIG>>,"
+ "${timestamp_file_with_config},${timestamp_file}>")
+ set(cmake_autogen_timestamp_file "${timestamp_genex}")
+ else()
+ set(cmake_autogen_timestamp_file ${timestamp_file})
+ endif()
add_custom_command(OUTPUT ${type_list_file}
DEPENDS ${QT_CMAKE_EXPORT_NAMESPACE}::cmake_automoc_parser
@@ -1232,6 +1392,7 @@ function(qt6_extract_metatypes target)
${multi_config_args}
COMMENT "Running AUTOMOC file extraction for target ${target}"
COMMAND_EXPAND_LISTS
+ VERBATIM
)
endif()
@@ -1284,6 +1445,7 @@ function(qt6_extract_metatypes target)
add_custom_command(
OUTPUT
${metatypes_file_gen}
+ BYPRODUCTS
${metatypes_file}
DEPENDS ${QT_CMAKE_EXPORT_NAMESPACE}::moc ${automoc_dependencies} ${manual_dependencies}
COMMAND ${QT_CMAKE_EXPORT_NAMESPACE}::moc
@@ -1293,8 +1455,20 @@ function(qt6_extract_metatypes target)
${metatypes_file_gen}
${metatypes_file}
COMMENT "Running moc --collect-json for target ${target}"
+ VERBATIM
)
+ if(CMAKE_GENERATOR MATCHES " Makefiles")
+ # Work around https://gitlab.kitware.com/cmake/cmake/-/issues/19005 to trigger the command
+ # that generates ${metatypes_file}.
+ add_custom_command(
+ OUTPUT ${metatypes_file}
+ DEPENDS ${metatypes_file_gen}
+ COMMAND ${CMAKE_COMMAND} -E true
+ VERBATIM
+ )
+ endif()
+
# We can't rely on policy CMP0118 since user project controls it
set(scope_args)
if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.18")
@@ -1314,51 +1488,42 @@ function(qt6_extract_metatypes target)
PROPERTIES HEADER_FILE_ONLY TRUE
)
- set_target_properties(${target} PROPERTIES
- INTERFACE_QT_MODULE_HAS_META_TYPES YES
- INTERFACE_QT_META_TYPES_BUILD_FILE "${metatypes_file}"
- )
-
- # Set up consumption of files via INTERFACE_SOURCES.
- set(consumes_metatypes "$<BOOL:$<TARGET_PROPERTY:QT_CONSUMES_METATYPES>>")
- set(metatypes_file_genex_build
- "$<BUILD_INTERFACE:$<${consumes_metatypes}:${metatypes_file}>>"
- )
- target_sources(${target} INTERFACE ${metatypes_file_genex_build})
-
if(arg_OUTPUT_FILES)
set(${arg_OUTPUT_FILES} "${metatypes_file}" PARENT_SCOPE)
endif()
- # Check whether the generated json file needs to be installed.
- # Executable metatypes.json files should not be installed. Qt non-prefix builds should also
- # not install the files.
- set(should_install FALSE)
-
- if(NOT target_type STREQUAL "EXECUTABLE" AND arg___QT_INTERNAL_INSTALL)
- set(should_install TRUE)
- endif()
+ # Propagate the build time metatypes file.
+ _qt_internal_assign_build_metatypes_files_and_properties(
+ "${target}"
+ METATYPES_FILE_NAME "${metatypes_file_name}"
+ METATYPES_FILE_PATH "${metatypes_file}"
+ )
- # Automatically fill default install args when not specified.
- if(NOT arg___QT_INTERNAL_INSTALL_DIR)
- # INSTALL_LIBDIR is not set when QtBuildInternals is not loaded (when not doing a Qt build).
- # Default to a hardcoded location for user projects.
- if(INSTALL_LIBDIR)
- set(install_dir "${INSTALL_LIBDIR}/metatypes")
- else()
- set(install_dir "lib/metatypes")
- endif()
+ if(arg___QT_INTERNAL_INSTALL)
+ set(internal_install_option "INTERNAL_INSTALL")
else()
- set(install_dir "${arg___QT_INTERNAL_INSTALL_DIR}")
+ set(internal_install_option "")
endif()
+ # TODO: Clean up Qt-specific installation not to happen in the public api.
+ # Check whether the metatype files should be installed.
+ _qt_internal_should_install_metatypes("${target}"
+ ${internal_install_option}
+ OUT_VAR should_install
+ )
+
if(should_install)
- set(metatypes_file_install_path "${install_dir}/${metatypes_file_name}")
- set(metatypes_file_install_path_genex "$<INSTALL_PREFIX>/${metatypes_file_install_path}")
- set(metatypes_file_genex_install
- "$<INSTALL_INTERFACE:$<${consumes_metatypes}:${metatypes_file_install_path_genex}>>"
+ _qt_internal_get_metatypes_install_dir(
+ "${arg___QT_INTERNAL_INSTALL_DIR}"
+ "${INSTALL_ARCHDATADIR}"
+ install_dir
+ )
+
+ # Propagate the install time metatypes file.
+ _qt_internal_assign_install_metatypes_files_and_properties(
+ "${target}"
+ INSTALL_DIR "${install_dir}"
)
- target_sources(${target} INTERFACE ${metatypes_file_genex_install})
install(FILES "${metatypes_file}" DESTINATION "${install_dir}")
endif()
endfunction()
@@ -1407,7 +1572,7 @@ function(_qt_internal_generate_win32_rc_file target)
endif()
if(MSVC)
- set(extra_rc_flags "/nologo")
+ set(extra_rc_flags "-c65001 -DWIN32 -nologo")
else()
set(extra_rc_flags)
endif()
@@ -1601,6 +1766,7 @@ END
add_custom_command(OUTPUT "${output}"
DEPENDS "${input}"
COMMAND ${CMAKE_COMMAND} -E copy_if_different "${input}" "${output}"
+ VERBATIM
)
# We can't rely on policy CMP0118 since user project controls it
set_source_files_properties(${output} ${scope_args} PROPERTIES
@@ -1612,64 +1778,94 @@ END
endif()
endfunction()
+# Generate Win32 longPathAware RC and Manifest files for a target.
+# MSVC needs the manifest file as part of target_sources. MinGW the RC file.
+#
+function(_qt_internal_generate_longpath_win32_rc_file_and_manifest target)
+ set(prohibited_target_types INTERFACE_LIBRARY STATIC_LIBRARY OBJECT_LIBRARY)
+ get_target_property(target_type ${target} TYPE)
+ if(target_type IN_LIST prohibited_target_types)
+ return()
+ endif()
+
+ get_target_property(target_binary_dir ${target} BINARY_DIR)
+
+ # Generate manifest
+ set(target_mn_filename "${target}_longpath.manifest")
+ set(mn_file_output "${target_binary_dir}/${target_mn_filename}")
+
+ set(mn_contents [=[<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
+<application xmlns="urn:schemas-microsoft-com:asm.v3">
+ <windowsSettings xmlns:ws2="http://schemas.microsoft.com/SMI/2016/WindowsSettings">
+ <ws2:longPathAware>true</ws2:longPathAware>
+ </windowsSettings>
+</application>
+</assembly>]=])
+ file(GENERATE OUTPUT "${mn_file_output}" CONTENT "${mn_contents}")
+
+ # Generate RC File
+ set(rc_file_output "${target_binary_dir}/${target}_longpath.rc")
+ set(rc_contents "1 /* CREATEPROCESS_MANIFEST_RESOURCE_ID */ 24 /* RT_MANIFEST */ ${target_mn_filename}")
+ file(GENERATE OUTPUT "${rc_file_output}" CONTENT "${rc_contents}")
+
+ if (MINGW)
+ set(outputs "${rc_file_output}")
+ endif()
+ list(APPEND outputs "${mn_file_output}")
+
+ foreach(output IN LISTS outputs)
+ # Needed for CMake versions < 3.19
+ set_source_files_properties(${output} PROPERTIES GENERATED TRUE)
+ target_sources(${target} PRIVATE "${output}")
+ endforeach()
+endfunction()
+
function(__qt_get_relative_resource_path_for_file output_alias file)
get_property(alias SOURCE ${file} PROPERTY QT_RESOURCE_ALIAS)
if (NOT alias)
set(alias "${file}")
+ if(IS_ABSOLUTE "${file}")
+ message(FATAL_ERROR
+ "The source file '${file}' was specified with an absolute path and is used in a Qt "
+ "resource. Please set the QT_RESOURCE_ALIAS property on that source file to a "
+ "relative path to make the file properly accessible via the resource system."
+ )
+ endif()
endif()
set(${output_alias} ${alias} PARENT_SCOPE)
endfunction()
-# Performs linking and propagation of the object library via the target's usage requirements.
-# Arguments:
-# NO_LINK_OBJECT_LIBRARY_REQUIREMENTS_TO_TARGET skip linking of ${object_library} to ${target}, only
-# propagate $<TARGET_OBJECTS:${object_library}> by linking it to ${target}. It's useful in case
-# if ${object_library} depends on the ${target}. E.g. resource libraries depend on the Core
-# library so linking them back to Core will cause a CMake error.
+# Performs linking and propagation of the specified objects via the target's usage requirements.
+# The objects may be given as generator expression.
#
-# EXTRA_CONDITIONS object library specific conditions to be checked before link the object library
-# to the end-point executable.
-function(__qt_internal_propagate_object_library target object_library)
- set(options NO_LINK_OBJECT_LIBRARY_REQUIREMENTS_TO_TARGET)
+# Arguments:
+# EXTRA_CONDITIONS
+# Conditions to be checked before linking the object files to the end-point executable.
+# EXTRA_TARGET_LINK_LIBRARIES_CONDITIONS
+# Conditions for the target_link_libraries call.
+# EXTRA_TARGET_SOURCES_CONDITIONS
+# Conditions for the target_sources call.
+function(__qt_internal_propagate_object_files target objects)
+ set(options "")
set(single_args "")
- set(multi_args EXTRA_CONDITIONS)
- cmake_parse_arguments(arg "${options}" "${single_args}" "${multi_args}" ${ARGN})
-
- get_target_property(is_imported ${object_library} IMPORTED)
- if(NOT is_imported)
- target_link_libraries(${object_library} PRIVATE ${QT_CMAKE_EXPORT_NAMESPACE}::Platform)
- _qt_internal_copy_dependency_properties(${object_library} ${target} PRIVATE_ONLY)
- endif()
-
- # After internal discussion we decided to not rely on the linker order that CMake
- # offers, until CMake provides the guaranteed linking order that suites our needs in a
- # future CMake version.
- # All object libraries mark themselves with the _is_qt_propagated_object_library property.
- # Using a finalizer approach we walk through the target dependencies and look for libraries
- # using the _is_qt_propagated_object_library property. Then, objects of the collected libraries
- # are moved to the beginning of the linker line using target_sources.
- #
- # Note: target_link_libraries works well with linkers other than ld. If user didn't enforce
- # a finalizer we rely on linker to resolve circular dependencies between objects and static
- # libraries.
- set_property(TARGET ${object_library} PROPERTY _is_qt_propagated_object_library TRUE)
- if(NOT is_imported)
- set_property(TARGET ${object_library} APPEND PROPERTY
- EXPORT_PROPERTIES _is_qt_propagated_object_library
- )
- endif()
-
- # Keep the implicit linking if finalizers are not used.
- set(not_finalizer_mode_condition
- "$<NOT:$<BOOL:$<TARGET_PROPERTY:_qt_object_libraries_finalizer_mode>>>"
+ set(extra_conditions_args
+ EXTRA_CONDITIONS
+ EXTRA_TARGET_LINK_LIBRARIES_CONDITIONS
+ EXTRA_TARGET_SOURCES_CONDITIONS
)
+ set(multi_args ${extra_conditions_args})
+ cmake_parse_arguments(arg "${options}" "${single_args}" "${multi_args}" ${ARGN})
- # Collect object library specific conditions.
- if(arg_EXTRA_CONDITIONS)
- list(JOIN arg_EXTRA_CONDITIONS "," extra_conditions)
- else()
- set(extra_conditions "$<BOOL:TRUE>")
- endif()
+ # Collect additional conditions.
+ foreach(arg IN LISTS extra_conditions_args)
+ string(TOLOWER "${arg}" lcvar)
+ if(arg_${arg})
+ list(JOIN arg_${arg} "," ${lcvar})
+ else()
+ set(${lcvar} "$<BOOL:TRUE>")
+ endif()
+ endforeach()
# Do not litter the static libraries
set(not_static_condition
@@ -1695,17 +1891,14 @@ function(__qt_internal_propagate_object_library target object_library)
"$<BOOL:$<GENEX_EVAL:${cmp0099_policy_check_property}>>"
)
- # Use TARGET_NAME to have the correct namespaced name in the exports.
- set(objects "$<TARGET_OBJECTS:$<TARGET_NAME:${object_library}>>")
-
# Collect link conditions for the target_sources call.
string(JOIN "" target_sources_genex
"$<"
"$<AND:"
- "${not_finalizer_mode_condition},"
"${not_static_condition},"
"${platform_link_order_condition},"
"$<NOT:${link_objects_using_link_options_condition}>,"
+ "${extra_target_sources_conditions},"
"${extra_conditions}"
">"
":${objects}>"
@@ -1738,9 +1931,9 @@ function(__qt_internal_propagate_object_library target object_library)
string(JOIN "" target_link_libraries_genex
"$<"
"$<AND:"
- "${not_finalizer_mode_condition},"
"${not_static_condition},"
"$<NOT:${platform_link_order_condition}>,"
+ "${extra_target_link_libraries_conditions},"
"${extra_conditions}"
">"
":${objects}>"
@@ -1748,6 +1941,60 @@ function(__qt_internal_propagate_object_library target object_library)
target_link_libraries(${target} INTERFACE
"${target_link_libraries_genex}"
)
+endfunction()
+
+# Performs linking and propagation of the object library via the target's usage requirements.
+# Arguments:
+# NO_LINK_OBJECT_LIBRARY_REQUIREMENTS_TO_TARGET skip linking of ${object_library} to ${target}, only
+# propagate $<TARGET_OBJECTS:${object_library}> by linking it to ${target}. It's useful in case
+# if ${object_library} depends on the ${target}. E.g. resource libraries depend on the Core
+# library so linking them back to Core will cause a CMake error.
+#
+# EXTRA_CONDITIONS object library specific conditions to be checked before link the object library
+# to the end-point executable.
+function(__qt_internal_propagate_object_library target object_library)
+ set(options NO_LINK_OBJECT_LIBRARY_REQUIREMENTS_TO_TARGET)
+ set(single_args "")
+ set(multi_args EXTRA_CONDITIONS)
+ cmake_parse_arguments(arg "${options}" "${single_args}" "${multi_args}" ${ARGN})
+
+ get_target_property(is_imported ${object_library} IMPORTED)
+ if(NOT is_imported)
+ target_link_libraries(${object_library} PRIVATE ${QT_CMAKE_EXPORT_NAMESPACE}::Platform)
+ _qt_internal_copy_dependency_properties(${object_library} ${target} PRIVATE_ONLY)
+ endif()
+
+ # After internal discussion we decided to not rely on the linker order that CMake
+ # offers, until CMake provides the guaranteed linking order that suites our needs in a
+ # future CMake version.
+ # All object libraries mark themselves with the _is_qt_propagated_object_library property.
+ # Using a finalizer approach we walk through the target dependencies and look for libraries
+ # using the _is_qt_propagated_object_library property. Then, objects of the collected libraries
+ # are moved to the beginning of the linker line using target_sources.
+ #
+ # Note: target_link_libraries works well with linkers other than ld. If user didn't enforce
+ # a finalizer we rely on linker to resolve circular dependencies between objects and static
+ # libraries.
+ set_property(TARGET ${object_library} PROPERTY _is_qt_propagated_object_library TRUE)
+ if(NOT is_imported)
+ set_property(TARGET ${object_library} APPEND PROPERTY
+ EXPORT_PROPERTIES _is_qt_propagated_object_library
+ )
+ endif()
+
+ # Keep the implicit linking if finalizers are not used.
+ set(not_finalizer_mode_condition
+ "$<NOT:$<BOOL:$<TARGET_PROPERTY:_qt_object_libraries_finalizer_mode>>>"
+ )
+
+ # Use TARGET_NAME to have the correct namespaced name in the exports.
+ set(objects "$<TARGET_OBJECTS:$<TARGET_NAME:${object_library}>>")
+
+ __qt_internal_propagate_object_files(${target} ${objects}
+ EXTRA_CONDITIONS ${arg_EXTRA_CONDITIONS}
+ EXTRA_TARGET_SOURCES_CONDITIONS ${not_finalizer_mode_condition}
+ EXTRA_TARGET_LINK_LIBRARIES_CONDITIONS ${not_finalizer_mode_condition}
+ )
if(NOT arg_NO_LINK_OBJECT_LIBRARY_REQUIREMENTS_TO_TARGET)
# It's necessary to link the object library target, since we want to pass the object library
@@ -1768,11 +2015,29 @@ function(__qt_propagate_generated_resource target resource_name generated_source
math(EXPR resource_count "${resource_count} + 1")
set_target_properties(${target} PROPERTIES _qt_generated_resource_target_count ${resource_count})
+ __qt_internal_generate_init_resource_source_file(
+ resource_init_file ${target} ${resource_name})
+
set(resource_target "${target}_resources_${resource_count}")
- add_library("${resource_target}" OBJECT "${generated_source_code}")
+ add_library("${resource_target}" OBJECT "${resource_init_file}")
+ set_target_properties(${resource_target} PROPERTIES
+ AUTOMOC FALSE
+ AUTOUIC FALSE
+ AUTORCC FALSE
+ )
+ # Needed so that qtsymbolmacros.h and its dependent headers are already created / syncqt'ed.
+ if(TARGET Core_sync_headers)
+ set(headers_available_target "Core_sync_headers")
+ else()
+ set(headers_available_target "${QT_CMAKE_EXPORT_NAMESPACE}::Core")
+ endif()
+ add_dependencies(${resource_target} ${headers_available_target})
target_compile_definitions("${resource_target}" PRIVATE
"$<TARGET_PROPERTY:${QT_CMAKE_EXPORT_NAMESPACE}::Core,INTERFACE_COMPILE_DEFINITIONS>"
)
+ target_include_directories("${resource_target}" PRIVATE
+ "$<TARGET_PROPERTY:${QT_CMAKE_EXPORT_NAMESPACE}::Core,INTERFACE_INCLUDE_DIRECTORIES>"
+ )
_qt_internal_set_up_static_runtime_library("${resource_target}")
# Special handling is required for the Core library resources. The linking of the Core
@@ -1791,7 +2056,7 @@ function(__qt_propagate_generated_resource target resource_name generated_source
# .rcc/qrc_qprintdialog.cpp
file(RELATIVE_PATH generated_cpp_file_relative_path
"${CMAKE_CURRENT_BINARY_DIR}"
- "${generated_source_code}")
+ "${resource_init_file}")
set_property(TARGET ${resource_target} APPEND PROPERTY
_qt_resource_generated_cpp_relative_path "${generated_cpp_file_relative_path}")
@@ -1805,14 +2070,52 @@ function(__qt_propagate_generated_resource target resource_name generated_source
set(${output_generated_target} "${resource_target}" PARENT_SCOPE)
else()
set(${output_generated_target} "" PARENT_SCOPE)
- target_sources(${target} PRIVATE ${generated_source_code})
endif()
+
+ target_sources(${target} PRIVATE ${generated_source_code})
+endfunction()
+
+function(__qt_internal_sanitize_resource_name out_var name)
+ # The sanitized output should match RCCResourceLibrary::writeInitializer()'s
+ # isAsciiLetterOrNumber-based substituion.
+ # MAKE_C_IDENTIFIER matches that, it replaces non-alphanumeric chars with underscores.
+ string(MAKE_C_IDENTIFIER "${name}" sanitized_resource_name)
+ set(${out_var} "${sanitized_resource_name}" PARENT_SCOPE)
+endfunction()
+
+function(__qt_internal_generate_init_resource_source_file out_var target resource_name)
+ set(template_file "${__qt_core_macros_module_base_dir}/Qt6CoreResourceInit.in.cpp")
+
+ # Gets replaced in the template
+ __qt_internal_sanitize_resource_name(RESOURCE_NAME "${resource_name}")
+ set(resource_init_path "${CMAKE_CURRENT_BINARY_DIR}/.qt/rcc/qrc_${resource_name}_init.cpp")
+
+ configure_file("${template_file}" "${resource_init_path}" @ONLY)
+
+ set(scope_args "")
+ if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.18")
+ set(scope_args TARGET_DIRECTORY ${target})
+ endif()
+ set_source_files_properties(${resource_init_path} ${scope_args} PROPERTIES
+ SKIP_AUTOGEN TRUE
+ SKIP_UNITY_BUILD_INCLUSION TRUE
+ SKIP_PRECOMPILE_HEADERS TRUE
+ )
+
+ set(${out_var} "${resource_init_path}" PARENT_SCOPE)
endfunction()
-# Creates fake targets and adds resource files to IDE's tree
-# FIXME: We shouldn't need to create a separate target for this, the files
-# should be added to the actual target instead.
+# Make file visible in IDEs.
+# Targets that are finalized add the file as HEADER_FILE_ONLY in the finalizer.
+# Targets that are not finalized add the file under a ${target}_other_files target.
function(_qt_internal_expose_source_file_to_ide target file)
+ get_target_property(target_expects_finalization ${target} _qt_expects_finalization)
+ if(target_expects_finalization AND CMAKE_VERSION VERSION_GREATER_EQUAL "3.19")
+ set_property(TARGET ${target} APPEND PROPERTY _qt_deferred_files ${file})
+ return()
+ endif()
+
+ # Fallback for targets that are not finalized: Create fake target under which the file is added.
set(ide_target ${target}_other_files)
if(NOT TARGET ${ide_target})
add_custom_target(${ide_target} SOURCES "${file}")
@@ -1827,6 +2130,68 @@ function(_qt_internal_expose_source_file_to_ide target file)
else()
set_property(TARGET ${ide_target} APPEND PROPERTY SOURCES "${file}")
endif()
+
+ set(scope_args)
+ if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.18")
+ set(scope_args TARGET_DIRECTORY "${target}")
+ endif()
+ get_source_file_property(
+ target_dependency "${file}" ${scope_args} _qt_resource_target_dependency)
+ if(target_dependency)
+ if(NOT TARGET "${target_dependency}")
+ message(FATAL_ERROR "Target dependency on source file ${file} is not a cmake target.")
+ endif()
+ add_dependencies(${ide_target} ${target_dependency})
+ endif()
+endfunction()
+
+# Called by the target finalizer.
+# Adds the files that were added to _qt_deferred_files to SOURCES.
+# Sets HEADER_FILES_ONLY if they did not exist yet in SOURCES.
+function(_qt_internal_expose_deferred_files_to_ide target)
+ get_target_property(new_sources ${target} _qt_deferred_files)
+ if(NOT new_sources)
+ return()
+ endif()
+ set(new_sources_real "")
+ foreach(f IN LISTS new_sources)
+ get_filename_component(realf "${f}" REALPATH)
+ list(APPEND new_sources_real ${realf})
+ endforeach()
+
+ set(filtered_new_sources "")
+ get_target_property(target_source_dir ${target} SOURCE_DIR)
+ get_filename_component(target_source_dir "${target_source_dir}" REALPATH)
+ get_target_property(existing_sources ${target} SOURCES)
+ if(existing_sources)
+ set(existing_sources_real "")
+ set(realf "")
+ foreach(f IN LISTS existing_sources)
+ get_filename_component(realf "${f}" REALPATH BASE_DIR ${target_source_dir})
+ list(APPEND existing_sources_real ${realf})
+ endforeach()
+
+ list(LENGTH new_sources max_i)
+ math(EXPR max_i "${max_i} - 1")
+ foreach(i RANGE 0 ${max_i})
+ list(GET new_sources_real ${i} realf)
+ if(NOT realf IN_LIST existing_sources_real)
+ list(GET new_sources ${i} f)
+ list(APPEND filtered_new_sources ${f})
+ endif()
+ endforeach()
+ endif()
+ if("${filtered_new_sources}" STREQUAL "")
+ return()
+ endif()
+
+ target_sources(${target} PRIVATE ${filtered_new_sources})
+ set(scope_args)
+ if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.18")
+ set(scope_args TARGET_DIRECTORY "${target}")
+ endif()
+ set_source_files_properties(${filtered_new_sources}
+ ${scope_args} PROPERTIES HEADER_FILE_ONLY ON)
endfunction()
#
@@ -1843,17 +2208,49 @@ endfunction()
# targets pass a value to the OUTPUT_TARGETS parameter.
#
function(_qt_internal_process_resource target resourceName)
-
- cmake_parse_arguments(rcc "" "PREFIX;LANG;BASE;OUTPUT_TARGETS;DESTINATION" "FILES;OPTIONS" ${ARGN})
+ cmake_parse_arguments(rcc "BIG_RESOURCES"
+ "PREFIX;LANG;BASE;OUTPUT_TARGETS;DESTINATION" "FILES;OPTIONS" ${ARGN})
if("${rcc_OPTIONS}" MATCHES "-binary")
set(isBinary TRUE)
+ if(rcc_BIG_RESOURCES)
+ message(FATAL_ERROR "BIG_RESOURCES cannot be used together with the -binary option.")
+ endif()
+ endif()
+
+ if(rcc_BIG_RESOURCES AND CMAKE_GENERATOR STREQUAL "Xcode" AND IOS)
+ message(WARNING
+ "Due to CMake limitations, the BIG_RESOURCES option can't be used when building "
+ "for iOS. "
+ "See https://bugreports.qt.io/browse/QTBUG-103497 for details. "
+ "Falling back to using regular resources. "
+ )
+ set(rcc_BIG_RESOURCES OFF)
+ endif()
+
+ if(rcc_BIG_RESOURCES AND CMAKE_VERSION VERSION_LESS "3.17")
+ message(WARNING
+ "The BIG_RESOURCES option does not work reliably with CMake < 3.17. "
+ "Consider upgrading to a more recent CMake version or disable the BIG_RESOURCES "
+ "option for older CMake versions."
+ )
endif()
string(REPLACE "/" "_" resourceName ${resourceName})
string(REPLACE "." "_" resourceName ${resourceName})
- set(resource_files ${rcc_FILES})
+ set(resource_files "")
+ # Strip the ending slashes from the file_path. If paths contain slashes in the end
+ # set/get source properties works incorrect and may have the same QT_RESOURCE_ALIAS
+ # for two different paths. See https://gitlab.kitware.com/cmake/cmake/-/issues/23212
+ # for details.
+ foreach(file_path IN LISTS rcc_FILES)
+ if(file_path MATCHES "(.+)/$")
+ set(file_path "${CMAKE_MATCH_1}")
+ endif()
+ list(APPEND resource_files ${file_path})
+ endforeach()
+
if(NOT "${rcc_BASE}" STREQUAL "")
get_filename_component(abs_base "${rcc_BASE}" ABSOLUTE)
foreach(file_path IN LISTS resource_files)
@@ -1875,7 +2272,7 @@ function(_qt_internal_process_resource target resourceName)
if(NOT rcc_PREFIX)
get_target_property(rcc_PREFIX ${target} QT_RESOURCE_PREFIX)
if (NOT rcc_PREFIX)
- message(FATAL_ERROR "_qt_internal_process_resource() was called without a PREFIX and the target does not provide QT_RESOURCE_PREFIX. Please either add a PREFIX or make the target ${target} provide a default.")
+ set(rcc_PREFIX "/")
endif()
endif()
@@ -1885,15 +2282,16 @@ function(_qt_internal_process_resource target resourceName)
endif()
return()
endif()
- set(generatedResourceFile "${CMAKE_CURRENT_BINARY_DIR}/.rcc/${resourceName}.qrc")
+ set(generatedResourceFile "${CMAKE_CURRENT_BINARY_DIR}/.qt/rcc/${resourceName}.qrc")
+ _qt_internal_expose_source_file_to_ide(${target} ${generatedResourceFile})
+ set_source_files_properties(${generatedResourceFile} PROPERTIES GENERATED TRUE)
# Generate .qrc file:
# <RCC><qresource ...>
set(qrcContents "<RCC>\n <qresource")
- if (rcc_PREFIX)
- string(APPEND qrcContents " prefix=\"${rcc_PREFIX}\"")
- endif()
+ string(APPEND qrcContents " prefix=\"${rcc_PREFIX}\"")
+
if (rcc_LANG)
string(APPEND qrcContents " lang=\"${rcc_LANG}\"")
endif()
@@ -1907,20 +2305,37 @@ function(_qt_internal_process_resource target resourceName)
set(file "${CMAKE_CURRENT_SOURCE_DIR}/${file}")
endif()
+ get_property(is_empty SOURCE ${file} PROPERTY QT_DISCARD_FILE_CONTENTS)
+
### FIXME: escape file paths to be XML conform
# <file ...>...</file>
- string(APPEND qrcContents " <file alias=\"${file_resource_path}\">")
- string(APPEND qrcContents "${file}</file>\n")
+ string(APPEND qrcContents " <file alias=\"${file_resource_path}\"")
+ if(is_empty)
+ string(APPEND qrcContents " empty=\"true\"")
+ endif()
+ string(APPEND qrcContents ">${file}</file>\n")
list(APPEND files "${file}")
- get_source_file_property(target_dependency ${file} QT_RESOURCE_TARGET_DEPENDENCY)
- if (NOT target_dependency)
- list(APPEND resource_dependencies ${file})
- else()
- if (NOT TARGET ${target_dependency})
- message(FATAL_ERROR "Target dependency on resource file ${file} is not a cmake target.")
+ set(scope_args)
+ if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.18")
+ set(scope_args TARGET_DIRECTORY ${target})
+ endif()
+ get_source_file_property(
+ target_dependency ${file} ${scope_args} _qt_resource_target_dependency)
+
+ # The target dependency code path does not take care of rebuilds when ${file}
+ # is touched. Limit its usage to the Xcode generator to avoid the Xcode common
+ # dependency issue.
+ # TODO: Figure out how to avoid the issue on Xcode, while also enabling proper
+ # dependency tracking when ${file} is touched.
+ if(target_dependency AND CMAKE_GENERATOR STREQUAL "Xcode")
+ if(NOT TARGET ${target_dependency})
+ message(FATAL_ERROR
+ "Target dependency on resource file ${file} is not a cmake target.")
endif()
list(APPEND resource_dependencies ${target_dependency})
+ else()
+ list(APPEND resource_dependencies ${file})
endif()
_qt_internal_expose_source_file_to_ide(${target} "${file}")
endforeach()
@@ -1933,9 +2348,10 @@ function(_qt_internal_process_resource target resourceName)
configure_file("${template_file}" "${generatedResourceFile}")
set(rccArgs --name "${resourceName}" "${generatedResourceFile}")
+ set(rccArgsAllPasses "")
if(rcc_OPTIONS)
- list(APPEND rccArgs ${rcc_OPTIONS})
+ list(APPEND rccArgsAllPasses ${rcc_OPTIONS})
endif()
# When cross-building, we use host tools to generate target code. If the host rcc was compiled
@@ -1945,7 +2361,7 @@ function(_qt_internal_process_resource target resourceName)
# If the target does not support zstd (feature is disabled), tell rcc not to generate
# zstd related code.
if(NOT QT_FEATURE_zstd)
- list(APPEND rccArgs "--no-zstd")
+ list(APPEND rccArgsAllPasses "--no-zstd")
endif()
set_property(SOURCE "${generatedResourceFile}" PROPERTY SKIP_AUTOGEN ON)
@@ -1962,49 +2378,93 @@ function(_qt_internal_process_resource target resourceName)
set(generatedOutfile "${rcc_DESTINATION}.rcc")
endif()
endif()
+ elseif(rcc_BIG_RESOURCES)
+ set(generatedOutfile "${CMAKE_CURRENT_BINARY_DIR}/.qt/rcc/qrc_${resourceName}_tmp.cpp")
else()
- set(generatedOutfile "${CMAKE_CURRENT_BINARY_DIR}/.rcc/qrc_${resourceName}.cpp")
+ set(generatedOutfile "${CMAKE_CURRENT_BINARY_DIR}/.qt/rcc/qrc_${resourceName}.cpp")
+ endif()
+
+ set(pass_msg)
+ if(rcc_BIG_RESOURCES)
+ list(PREPEND rccArgs --pass 1)
+ set(pass_msg " pass 1")
endif()
list(PREPEND rccArgs --output "${generatedOutfile}")
# Process .qrc file:
add_custom_command(OUTPUT "${generatedOutfile}"
- COMMAND "${QT_CMAKE_EXPORT_NAMESPACE}::rcc" ${rccArgs}
+ COMMAND "${QT_CMAKE_EXPORT_NAMESPACE}::rcc" ${rccArgs} ${rccArgsAllPasses}
DEPENDS
${resource_dependencies}
${generatedResourceFile}
"${QT_CMAKE_EXPORT_NAMESPACE}::rcc"
- COMMENT "Running rcc for resource ${resourceName}"
+ COMMENT "Running rcc${pass_msg} for resource ${resourceName}"
VERBATIM)
- set(output_targets "")
if(isBinary)
# Add generated .rcc target to 'all' set
add_custom_target(binary_resource_${resourceName} ALL DEPENDS "${generatedOutfile}")
- else()
- # We can't rely on policy CMP0118 since user project controls it.
- # We also want SKIP_AUTOGEN known in the target's scope, where we can.
- set(scope_args)
- if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.18")
- set(scope_args TARGET_DIRECTORY ${target})
- endif()
- set_source_files_properties(${generatedOutfile} ${scope_args} PROPERTIES
- SKIP_AUTOGEN TRUE
- GENERATED TRUE
+ return()
+ endif()
+
+ # We can't rely on policy CMP0118 since user project controls it.
+ # We also want SKIP_AUTOGEN known in the target's scope, where we can.
+ set(scope_args)
+ if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.18")
+ set(scope_args TARGET_DIRECTORY ${target})
+ endif()
+ set_source_files_properties(${generatedOutfile} ${scope_args} PROPERTIES
+ SKIP_AUTOGEN TRUE
+ GENERATED TRUE
+ SKIP_UNITY_BUILD_INCLUSION TRUE
+ SKIP_PRECOMPILE_HEADERS TRUE
+ )
+ if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.27")
+ set_source_files_properties(${generatedOutfile} ${scope_args} PROPERTIES SKIP_LINTING ON)
+ endif()
+
+ get_target_property(target_source_dir ${target} SOURCE_DIR)
+ if(NOT target_source_dir STREQUAL CMAKE_CURRENT_SOURCE_DIR)
+ # We have to create a separate target in this scope that depends on
+ # the generated file, otherwise the original target won't have the
+ # required dependencies in place to ensure correct build order.
+ add_custom_target(${target}_${resourceName} DEPENDS ${generatedOutfile})
+ add_dependencies(${target} ${target}_${resourceName})
+ endif()
+
+ if(rcc_BIG_RESOURCES)
+ set(pass1OutputFile ${generatedOutfile})
+ set(generatedOutfile
+ "${CMAKE_CURRENT_BINARY_DIR}/.qt/rcc/qrc_${resourceName}${CMAKE_CXX_OUTPUT_EXTENSION}")
+ _qt_internal_add_rcc_pass2(
+ RESOURCE_NAME ${resourceName}
+ RCC_OPTIONS ${rccArgsAllPasses}
+ OBJECT_LIB ${target}_${resourceName}_obj
+ QRC_FILE ${generatedResourceFile}
+ PASS1_OUTPUT_FILE ${pass1OutputFile}
+ OUT_OBJECT_FILE ${generatedOutfile}
)
- get_target_property(target_source_dir ${target} SOURCE_DIR)
- if(NOT target_source_dir STREQUAL CMAKE_CURRENT_SOURCE_DIR)
- # We have to create a separate target in this scope that depends on
- # the generated file, otherwise the original target won't have the
- # required dependencies in place to ensure correct build order.
- add_custom_target(${target}_${resourceName} DEPENDS ${generatedOutfile})
- add_dependencies(${target} ${target}_${resourceName})
+ get_target_property(type ${target} TYPE)
+ if(type STREQUAL STATIC_LIBRARY)
+ # Create a custom target to trigger the generation of ${generatedOutfile}
+ set(pass2_target ${target}_${resourceName}_pass2)
+ add_custom_target(${pass2_target} DEPENDS ${generatedOutfile})
+ add_dependencies(${target} ${pass2_target})
+
+ # Propagate the object files to the target.
+ __qt_internal_propagate_object_files(${target} "${generatedOutfile}")
+ else()
+ target_sources(${target} PRIVATE ${generatedOutfile})
endif()
- set_property(TARGET ${target} APPEND PROPERTY _qt_generated_qrc_files "${generatedResourceFile}")
-
- __qt_propagate_generated_resource(${target} ${resourceName} "${generatedOutfile}" output_targets)
+ else()
+ __qt_propagate_generated_resource(${target} ${resourceName} "${generatedOutfile}"
+ output_targets)
endif()
+
+ set_property(TARGET ${target}
+ APPEND PROPERTY _qt_generated_qrc_files "${generatedResourceFile}")
+
if (rcc_OUTPUT_TARGETS)
set(${rcc_OUTPUT_TARGETS} "${output_targets}" PARENT_SCOPE)
endif()
@@ -2017,10 +2477,6 @@ macro(_qt_internal_get_add_plugin_keywords option_args single_args multi_args)
__QT_INTERNAL_NO_PROPAGATE_PLUGIN_INITIALIZER
)
set(${single_args}
- # TODO: For backward compatibility / transitional use only, remove once all repos no longer
- # use it
- TYPE
-
PLUGIN_TYPE # Internal use only, may be changed or removed
CLASS_NAME
OUTPUT_NAME # Internal use only, may be changed or removed
@@ -2031,39 +2487,10 @@ endmacro()
function(qt6_add_plugin target)
_qt_internal_get_add_plugin_keywords(opt_args single_args multi_args)
-
- # TODO: Transitional use only, replaced by CLASS_NAME. Remove this once
- # all other repos have been updated to use CLASS_NAME.
- list(APPEND single_args CLASSNAME)
+ list(APPEND opt_args MANUAL_FINALIZATION)
cmake_parse_arguments(PARSE_ARGV 1 arg "${opt_args}" "${single_args}" "${multi_args}")
- # Handle the inconsistent CLASSNAME/CLASS_NAME keyword naming between commands
- if(arg_CLASSNAME)
- if(arg_CLASS_NAME AND NOT arg_CLASSNAME STREQUAL arg_CLASS_NAME)
- message(FATAL_ERROR
- "Both CLASSNAME and CLASS_NAME were given and were different. "
- "Only one of the two should be used."
- )
- endif()
- set(arg_CLASS_NAME "${arg_CLASSNAME}")
- unset(arg_CLASSNAME)
- endif()
-
- # Handle the inconsistent TYPE/PLUGIN_TYPE keyword naming between commands
- if(arg_TYPE)
- if(arg_PLUGIN_TYPE AND NOT arg_TYPE STREQUAL arg_PLUGIN_TYPE)
- message(FATAL_ERROR
- "Both TYPE and PLUGIN_TYPE were given and were different. "
- "Only one of the two should be used."
- )
- endif()
- message(AUTHOR_WARNING
- "The TYPE keyword is deprecated and will be removed soon. Please use PLUGIN_TYPE instead.")
- set(arg_PLUGIN_TYPE "${arg_TYPE}")
- unset(arg_TYPE)
- endif()
-
if(arg_STATIC AND arg_SHARED)
message(FATAL_ERROR
"Both STATIC and SHARED options were given. Only one of the two should be used."
@@ -2092,7 +2519,8 @@ function(qt6_add_plugin target)
set(type_to_create MODULE)
endif()
- _qt_internal_add_library(${target} ${type_to_create})
+ _qt_internal_add_library(${target} ${type_to_create} ${arg_UNPARSED_ARGUMENTS})
+ set_property(TARGET ${target} PROPERTY _qt_expects_finalization TRUE)
get_target_property(target_type "${target}" TYPE)
if (target_type STREQUAL "STATIC_LIBRARY")
@@ -2166,9 +2594,27 @@ function(qt6_add_plugin target)
if(target_type STREQUAL "MODULE_LIBRARY")
if(NOT TARGET qt_internal_plugins)
add_custom_target(qt_internal_plugins)
+ _qt_internal_assign_to_internal_targets_folder(qt_internal_plugins)
endif()
add_dependencies(qt_internal_plugins ${target})
endif()
+
+ if(arg_MANUAL_FINALIZATION)
+ # Caller says they will call qt6_finalize_target() themselves later
+ return()
+ endif()
+
+ # Defer the finalization if we can. When the caller's project requires
+ # CMake 3.19 or later, this makes the calls to this function concise while
+ # still allowing target property modification before finalization.
+ if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.19)
+ # Need to wrap in an EVAL CODE or else ${target} won't be evaluated
+ # due to special behavior of cmake_language() argument handling
+ cmake_language(EVAL CODE "cmake_language(DEFER CALL qt6_finalize_target ${target})")
+ else()
+ set_target_properties("${target}" PROPERTIES _qt_is_immediately_finalized TRUE)
+ qt6_finalize_target("${target}")
+ endif()
endfunction()
if(NOT QT_NO_CREATE_VERSIONLESS_FUNCTIONS)
@@ -2187,6 +2633,7 @@ function(qt6_add_library target)
cmake_parse_arguments(PARSE_ARGV 1 arg "MANUAL_FINALIZATION" "" "")
_qt_internal_add_library("${target}" ${arg_UNPARSED_ARGUMENTS})
+ set_property(TARGET ${target} PROPERTY _qt_expects_finalization TRUE)
if(arg_MANUAL_FINALIZATION)
# Caller says they will call qt6_finalize_target() themselves later
@@ -2252,14 +2699,36 @@ function(_qt_internal_add_library target)
# This in contrast to CMake which defaults to STATIC.
if(NOT arg_STATIC AND NOT arg_SHARED AND NOT arg_MODULE AND NOT arg_INTERFACE
AND NOT arg_OBJECT)
- if(QT6_IS_SHARED_LIBS_BUILD)
- set(type_to_create SHARED)
+ if(DEFINED BUILD_SHARED_LIBS AND NOT QT_BUILDING_QT AND NOT QT_BUILD_STANDALONE_TESTS)
+ __qt_internal_setup_policy(QTP0003 "6.7.0"
+ "BUILD_SHARED_LIBS is set to ${BUILD_SHARED_LIBS} but it has no effect on\
+ default library type created by Qt CMake API commands. The default library type\
+ is set to the Qt build type.\
+ This behavior can be changed by setting QTP0003 to NEW.\
+ Check https://doc.qt.io/qt-6/qt-cmake-policy-qtp0003.html for policy details."
+ )
+ qt6_policy(GET QTP0003 build_shared_libs_policy)
+ else()
+ set(build_shared_libs_policy "")
+ endif()
+
+ if(build_shared_libs_policy STREQUAL "NEW" OR QT_BUILDING_QT OR QT_BUILD_STANDALONE_TESTS)
+ if(BUILD_SHARED_LIBS OR (NOT DEFINED BUILD_SHARED_LIBS AND QT6_IS_SHARED_LIBS_BUILD))
+ set(type_to_create SHARED)
+ else()
+ set(type_to_create STATIC)
+ endif()
else()
- set(type_to_create STATIC)
+ if(QT6_IS_SHARED_LIBS_BUILD)
+ set(type_to_create SHARED)
+ else()
+ set(type_to_create STATIC)
+ endif()
endif()
endif()
add_library(${target} ${type_to_create} ${arg_UNPARSED_ARGUMENTS})
+ _qt_internal_disable_autorcc_zstd_when_not_supported("${target}")
_qt_internal_set_up_static_runtime_library(${target})
if(NOT type_to_create STREQUAL "INTERFACE" AND NOT type_to_create STREQUAL "OBJECT")
@@ -2273,6 +2742,8 @@ function(_qt_internal_add_library target)
endif()
if(ANDROID)
+ set_property(TARGET "${target}"
+ PROPERTY _qt_android_apply_arch_suffix_called_from_qt_impl TRUE)
qt6_android_apply_arch_suffix("${target}")
endif()
endfunction()
@@ -2283,6 +2754,17 @@ if(NOT QT_NO_CREATE_VERSIONLESS_FUNCTIONS)
endfunction()
endif()
+# TODO: Remove once all repositories use qt_internal_add_example instead of add_subdirectory.
+macro(_qt_internal_override_example_install_dir_to_dot)
+ # Set INSTALL_EXAMPLEDIR to ".".
+ # This overrides the install destination of unclean Qt example projects to install directly
+ # to CMAKE_INSTALL_PREFIX.
+ if(QT_INTERNAL_SET_EXAMPLE_INSTALL_DIR_TO_DOT)
+ set(INSTALL_EXAMPLEDIR ".")
+ set(_qt_internal_example_dir_set_to_dot TRUE)
+ endif()
+endmacro()
+
function(qt6_allow_non_utf8_sources target)
set_target_properties("${target}" PROPERTIES QT_NO_UTF8_SOURCE TRUE)
endfunction()
@@ -2309,30 +2791,6 @@ function(_qt_internal_apply_strict_cpp target)
endif()
endfunction()
-# Wraps a tool command with a script that contains the necessary environment for the tool to run
-# correctly.
-# _qt_internal_wrap_tool_command(var <SET|APPEND> <command> [args...])
-# Arguments:
-# APPEND Selects the 'append' mode for the out_variable argument.
-# SET Selects the 'set' mode for the out_variable argument.
-function(_qt_internal_wrap_tool_command out_variable action)
- set(append FALSE)
- if(action STREQUAL "APPEND")
- set(append TRUE)
- elseif(NOT action STREQUAL "SET")
- message(FATAL_ERROR "Invalid action specified ${action}. Supported actions: SET, APPEND")
- endif()
-
- set(cmd COMMAND ${QT_TOOL_COMMAND_WRAPPER_PATH} ${ARGN})
-
- if(append)
- list(APPEND ${out_variable} ${cmd})
- else()
- set(${out_variable} ${cmd})
- endif()
- set(${out_variable} "${${out_variable}}" PARENT_SCOPE)
-endfunction()
-
# Copies properties of the dependency to the target.
# Arguments:
# PROPERTIES list of properties to copy. If not specified the following properties are copied
@@ -2395,7 +2853,7 @@ function(qt6_finalize_project)
message("qt6_finalize_project is called not in the top-level CMakeLists.txt.")
endif()
if(ANDROID)
- _qt_internal_collect_target_apk_dependencies()
+ _qt_internal_collect_apk_dependencies()
endif()
endfunction()
@@ -2412,3 +2870,956 @@ if(NOT QT_NO_CREATE_VERSIONLESS_FUNCTIONS)
qt6_disable_unicode_defines(${ARGV})
endfunction()
endif()
+
+function(_qt_internal_get_deploy_impl_dir var)
+ set(${var} "${CMAKE_BINARY_DIR}/.qt" PARENT_SCOPE)
+endfunction()
+
+function(_qt_internal_add_deploy_support deploy_support_file)
+ get_filename_component(deploy_support_file "${deploy_support_file}" REALPATH)
+
+ set(target ${QT_CMAKE_EXPORT_NAMESPACE}::Core)
+ get_target_property(aliased_target ${target} ALIASED_TARGET)
+ if(aliased_target)
+ set(target ${aliased_target})
+ endif()
+
+ get_property(scripts TARGET ${target} PROPERTY _qt_deploy_support_files)
+ if(NOT "${deploy_support_file}" IN_LIST scripts)
+ set_property(TARGET ${target} APPEND PROPERTY
+ _qt_deploy_support_files "${deploy_support_file}"
+ )
+ endif()
+endfunction()
+
+# Sets up the commands for use at install/deploy time
+function(_qt_internal_setup_deploy_support)
+ if(QT_SKIP_SETUP_DEPLOYMENT)
+ return()
+ endif()
+
+ get_property(cmake_role GLOBAL PROPERTY CMAKE_ROLE)
+ if(NOT cmake_role STREQUAL "PROJECT")
+ return()
+ endif()
+
+ # Always set QT_DEPLOY_SUPPORT in the caller's scope, even if we've generated
+ # the deploy support file in a previous call. The project may be calling
+ # find_package() from sibling directories with separate variable scopes.
+ _qt_internal_get_deploy_impl_dir(deploy_impl_dir)
+
+ get_cmake_property(is_multi_config GENERATOR_IS_MULTI_CONFIG)
+ if(is_multi_config)
+ set(QT_DEPLOY_SUPPORT "${deploy_impl_dir}/QtDeploySupport-$<CONFIG>.cmake")
+ else()
+ set(QT_DEPLOY_SUPPORT "${deploy_impl_dir}/QtDeploySupport.cmake")
+ endif()
+ set(QT_DEPLOY_SUPPORT "${QT_DEPLOY_SUPPORT}" PARENT_SCOPE)
+
+ get_property(have_generated_file GLOBAL PROPERTY _qt_have_generated_deploy_support)
+ if(have_generated_file)
+ return()
+ endif()
+ set_property(GLOBAL PROPERTY _qt_have_generated_deploy_support TRUE)
+
+ include(GNUInstallDirs)
+ set(target ${QT_CMAKE_EXPORT_NAMESPACE}::Core)
+ get_target_property(aliased_target ${target} ALIASED_TARGET)
+ if(aliased_target)
+ set(target ${aliased_target})
+ endif()
+
+ # Generate deployment information for each target if the CMake version is recent enough.
+ # The call is deferred to have all targets of the projects available.
+ if(CMAKE_VERSION GREATER_EQUAL "3.19.0")
+ if(is_multi_config)
+ set(targets_file "${deploy_impl_dir}/QtDeployTargets-$<CONFIG>.cmake")
+ else()
+ set(targets_file "${deploy_impl_dir}/QtDeployTargets.cmake")
+ endif()
+ cmake_language(EVAL CODE
+ "cmake_language(DEFER
+ DIRECTORY [[${CMAKE_SOURCE_DIR}]]
+ CALL _qt_internal_write_target_deploy_info [[${targets_file}]])"
+ )
+ _qt_internal_add_deploy_support("${targets_file}")
+ endif()
+
+ # Make sure to look under the Qt bin dir with find_program, rather than randomly picking up
+ # a deployqt tool in the system.
+ # QT6_INSTALL_PREFIX is not set during Qt build, so add the hints conditionally.
+ set(find_program_hints)
+ if(QT6_INSTALL_PREFIX)
+ set(find_program_hints HINTS ${QT6_INSTALL_PREFIX}/${QT6_INSTALL_BINS})
+ endif()
+
+ # In the generator expression logic below, we need safe_target_file because
+ # CMake evaluates expressions in both the TRUE and FALSE branches of $<IF:...>.
+ # We still need a target to give to $<TARGET_FILE:...> when we have no deploy
+ # tool, so we cannot use something like $<TARGET_FILE:macdeployqt> directly.
+ if(APPLE AND NOT IOS)
+ find_program(MACDEPLOYQT_EXECUTABLE macdeployqt
+ ${find_program_hints})
+ set(fallback "$<$<BOOL:${MACDEPLOYQT_EXECUTABLE}>:${MACDEPLOYQT_EXECUTABLE}>")
+ set(target_if_exists "$<TARGET_NAME_IF_EXISTS:${QT_CMAKE_EXPORT_NAMESPACE}::macdeployqt>")
+ set(have_deploy_tool "$<BOOL:${target_if_exists}>")
+ set(safe_target_file
+ "$<TARGET_FILE:$<IF:${have_deploy_tool},${target_if_exists},${target}>>")
+ set(__QT_DEPLOY_TOOL "$<IF:${have_deploy_tool},${safe_target_file},${fallback}>")
+ elseif(WIN32)
+ find_program(WINDEPLOYQT_EXECUTABLE windeployqt
+ ${find_program_hints})
+ set(fallback "$<$<BOOL:${WINDEPLOYQT_EXECUTABLE}>:${WINDEPLOYQT_EXECUTABLE}>")
+ set(target_if_exists "$<TARGET_NAME_IF_EXISTS:${QT_CMAKE_EXPORT_NAMESPACE}::windeployqt>")
+ set(have_deploy_tool "$<BOOL:${target_if_exists}>")
+ set(safe_target_file
+ "$<TARGET_FILE:$<IF:${have_deploy_tool},${target_if_exists},${target}>>")
+ set(__QT_DEPLOY_TOOL "$<IF:${have_deploy_tool},${safe_target_file},${fallback}>")
+ elseif(UNIX AND NOT APPLE AND NOT ANDROID AND NOT CMAKE_CROSSCOMPILING)
+ set(__QT_DEPLOY_TOOL "GRD")
+ else()
+ # Android is handled as a build target, not via this install-based approach.
+ # Therefore, we don't consider androiddeployqt here.
+ set(__QT_DEPLOY_TOOL "")
+ endif()
+
+ # Determine whether this is a multi-config build with a Debug configuration.
+ set(is_multi_config_build_with_debug_config FALSE)
+ get_target_property(target_is_imported ${target} IMPORTED)
+ if(target_is_imported)
+ get_target_property(target_imported_configs ${target} IMPORTED_CONFIGURATIONS)
+ list(LENGTH target_imported_configs target_imported_configs_length)
+ if(target_imported_configs_length GREATER "1"
+ AND "DEBUG" IN_LIST target_imported_configs)
+ set(is_multi_config_build_with_debug_config TRUE)
+ endif()
+ endif()
+
+ _qt_internal_add_deploy_support("${CMAKE_CURRENT_LIST_DIR}/Qt6CoreDeploySupport.cmake")
+
+ set(deploy_ignored_lib_dirs "")
+ if(__QT_DEPLOY_TOOL STREQUAL "GRD" AND NOT "${QT6_INSTALL_PREFIX}" STREQUAL "")
+ # Set up the directories we want to ignore when running file(GET_RUNTIME_DEPENDENCIES).
+ # If the Qt prefix is the root of one of those directories, don't ignore that directory.
+ # For example, if Qt's installation prefix is /usr, then we don't want to ignore /usr/lib.
+ foreach(link_dir IN LISTS CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES)
+ file(RELATIVE_PATH relative_dir "${QT6_INSTALL_PREFIX}" "${link_dir}")
+ if(relative_dir STREQUAL "")
+ # The Qt prefix is exactly ${link_dir}.
+ continue()
+ endif()
+ if(IS_ABSOLUTE "${relative_dir}" OR relative_dir MATCHES "^\\.\\./")
+ # The Qt prefix is outside of ${link_dir}.
+ list(APPEND deploy_ignored_lib_dirs "${link_dir}")
+ endif()
+ endforeach()
+ endif()
+
+ # Check whether we will have to adjust the RPATH of plugins.
+ if("${QT_DEPLOY_FORCE_ADJUST_RPATHS}" STREQUAL "")
+ set(must_adjust_plugins_rpath "")
+ if(NOT CMAKE_SYSTEM_NAME STREQUAL "Windows"
+ AND NOT CMAKE_INSTALL_LIBDIR STREQUAL QT6_INSTALL_LIBS)
+ set(must_adjust_plugins_rpath ON)
+ endif()
+ else()
+ set(must_adjust_plugins_rpath "${QT_DEPLOY_FORCE_ADJUST_RPATHS}")
+ endif()
+
+ # Find the patchelf executable if necessary.
+ if(must_adjust_plugins_rpath)
+ if(CMAKE_VERSION VERSION_LESS "3.21")
+ set(QT_DEPLOY_USE_PATCHELF ON)
+ endif()
+ if(QT_DEPLOY_USE_PATCHELF)
+ find_program(QT_DEPLOY_PATCHELF_EXECUTABLE patchelf)
+ if(NOT QT_DEPLOY_PATCHELF_EXECUTABLE)
+ set(QT_DEPLOY_PATCHELF_EXECUTABLE "patchelf")
+ message(WARNING "The patchelf executable could not be located. "
+ "To use Qt's CMake deployment API, install patchelf or upgrade CMake to 3.21 "
+ "or newer.")
+ endif()
+ endif()
+ endif()
+
+ # Generate path to the target (not host) qtpaths file. Needed for windeployqt when
+ # cross-compiling from an x86_64 host to an arm64 target, so it knows which architecture
+ # libraries should be deployed.
+ if(CMAKE_HOST_WIN32)
+ if(CMAKE_CROSSCOMPILING)
+ set(qt_paths_ext ".bat")
+ else()
+ set(qt_paths_ext ".exe")
+ endif()
+ else()
+ set(qt_paths_ext "")
+ endif()
+
+
+
+ set(target_qtpaths_path "")
+ set(qtpaths_prefix "${QT6_INSTALL_PREFIX}/${QT6_INSTALL_BINS}")
+ get_property(qt_major_version TARGET "${target}" PROPERTY INTERFACE_QT_MAJOR_VERSION)
+ if(qt_major_version)
+ set(target_qtpaths_with_major_version_path
+ "${qtpaths_prefix}/qtpaths${qt_major_version}${qt_paths_ext}")
+ if(EXISTS "${target_qtpaths_with_major_version_path}")
+ set(target_qtpaths_path "${target_qtpaths_with_major_version_path}")
+ endif()
+ endif()
+
+ if(NOT target_qtpaths_path)
+ set(target_qtpaths_path_without_version "${qtpaths_prefix}/qtpaths${qt_paths_ext}")
+ if(EXISTS "${target_qtpaths_path_without_version}")
+ set(target_qtpaths_path "${target_qtpaths_path_without_version}")
+ endif()
+ endif()
+
+ if(NOT target_qtpaths_path)
+ message(DEBUG "No qtpaths executable found for deployment purposes.")
+ endif()
+
+ file(GENERATE OUTPUT "${QT_DEPLOY_SUPPORT}" CONTENT
+"cmake_minimum_required(VERSION 3.16...3.21)
+
+# These are part of the public API. Projects should use them to provide a
+# consistent set of prefix-relative destinations.
+if(NOT QT_DEPLOY_BIN_DIR)
+ set(QT_DEPLOY_BIN_DIR \"${CMAKE_INSTALL_BINDIR}\")
+endif()
+if(NOT QT_DEPLOY_LIBEXEC_DIR)
+ set(QT_DEPLOY_LIBEXEC_DIR \"${CMAKE_INSTALL_LIBEXECDIR}\")
+endif()
+if(NOT QT_DEPLOY_LIB_DIR)
+ set(QT_DEPLOY_LIB_DIR \"${CMAKE_INSTALL_LIBDIR}\")
+endif()
+if(NOT QT_DEPLOY_PLUGINS_DIR)
+ set(QT_DEPLOY_PLUGINS_DIR \"plugins\")
+endif()
+if(NOT QT_DEPLOY_QML_DIR)
+ set(QT_DEPLOY_QML_DIR \"qml\")
+endif()
+if(NOT QT_DEPLOY_TRANSLATIONS_DIR)
+ set(QT_DEPLOY_TRANSLATIONS_DIR \"translations\")
+endif()
+if(NOT QT_DEPLOY_PREFIX)
+ set(QT_DEPLOY_PREFIX \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}\")
+endif()
+if(QT_DEPLOY_PREFIX STREQUAL \"\")
+ set(QT_DEPLOY_PREFIX .)
+endif()
+if(NOT QT_DEPLOY_IGNORED_LIB_DIRS)
+ set(QT_DEPLOY_IGNORED_LIB_DIRS \"${deploy_ignored_lib_dirs}\")
+endif()
+
+# These are internal implementation details. They may be removed at any time.
+set(__QT_DEPLOY_SYSTEM_NAME \"${CMAKE_SYSTEM_NAME}\")
+set(__QT_DEPLOY_IS_SHARED_LIBS_BUILD \"${QT6_IS_SHARED_LIBS_BUILD}\")
+set(__QT_DEPLOY_TOOL \"${__QT_DEPLOY_TOOL}\")
+set(__QT_DEPLOY_IMPL_DIR \"${deploy_impl_dir}\")
+set(__QT_DEPLOY_VERBOSE \"${QT_ENABLE_VERBOSE_DEPLOYMENT}\")
+set(__QT_CMAKE_EXPORT_NAMESPACE \"${QT_CMAKE_EXPORT_NAMESPACE}\")
+set(__QT_DEPLOY_GENERATOR_IS_MULTI_CONFIG \"${is_multi_config}\")
+set(__QT_DEPLOY_ACTIVE_CONFIG \"$<CONFIG>\")
+set(__QT_NO_CREATE_VERSIONLESS_FUNCTIONS \"${QT_NO_CREATE_VERSIONLESS_FUNCTIONS}\")
+set(__QT_DEFAULT_MAJOR_VERSION \"${QT_DEFAULT_MAJOR_VERSION}\")
+set(__QT_DEPLOY_QT_ADDITIONAL_PACKAGES_PREFIX_PATH \"${QT_ADDITIONAL_PACKAGES_PREFIX_PATH}\")
+set(__QT_DEPLOY_QT_INSTALL_PREFIX \"${QT6_INSTALL_PREFIX}\")
+set(__QT_DEPLOY_QT_INSTALL_BINS \"${QT6_INSTALL_BINS}\")
+set(__QT_DEPLOY_QT_INSTALL_DATA \"${QT6_INSTALL_DATA}\")
+set(__QT_DEPLOY_QT_INSTALL_LIBEXECS \"${QT6_INSTALL_LIBEXECS}\")
+set(__QT_DEPLOY_QT_INSTALL_PLUGINS \"${QT6_INSTALL_PLUGINS}\")
+set(__QT_DEPLOY_QT_INSTALL_TRANSLATIONS \"${QT6_INSTALL_TRANSLATIONS}\")
+set(__QT_DEPLOY_TARGET_QT_PATHS_PATH \"${target_qtpaths_path}\")
+set(__QT_DEPLOY_PLUGINS \"\")
+set(__QT_DEPLOY_MUST_ADJUST_PLUGINS_RPATH \"${must_adjust_plugins_rpath}\")
+set(__QT_DEPLOY_USE_PATCHELF \"${QT_DEPLOY_USE_PATCHELF}\")
+set(__QT_DEPLOY_PATCHELF_EXECUTABLE \"${QT_DEPLOY_PATCHELF_EXECUTABLE}\")
+set(__QT_DEPLOY_QT_IS_MULTI_CONFIG_BUILD_WITH_DEBUG \"${is_multi_config_build_with_debug_config}\")
+set(__QT_DEPLOY_QT_DEBUG_POSTFIX \"${QT6_DEBUG_POSTFIX}\")
+
+# Define the CMake commands to be made available during deployment.
+set(__qt_deploy_support_files
+ \"$<JOIN:$<TARGET_GENEX_EVAL:${target},$<TARGET_PROPERTY:${target},_qt_deploy_support_files>>,\"
+ \">\"
+)
+foreach(__qt_deploy_support_file IN LISTS __qt_deploy_support_files)
+ include(\"\${__qt_deploy_support_file}\")
+endforeach()
+
+unset(__qt_deploy_support_file)
+unset(__qt_deploy_support_files)
+")
+endfunction()
+
+# Write deployment information for the targets of the project.
+function(_qt_internal_write_target_deploy_info out_file)
+ set(targets "")
+ _qt_internal_collect_buildsystem_targets(targets
+ "${CMAKE_SOURCE_DIR}" INCLUDE EXECUTABLE SHARED_LIBRARY MODULE_LIBRARY)
+ set(content "")
+ foreach(target IN LISTS targets)
+ set(var_prefix "__QT_DEPLOY_TARGET_${target}")
+ string(APPEND content "set(${var_prefix}_FILE $<TARGET_FILE:${target}>)\n")
+ if(WIN32 AND CMAKE_VERSION GREATER_EQUAL "3.21")
+ string(APPEND content
+ "set(${var_prefix}_RUNTIME_DLLS $<TARGET_RUNTIME_DLLS:${target}>)\n")
+ endif()
+ endforeach()
+ file(GENERATE OUTPUT "${out_file}" CONTENT "${content}")
+endfunction()
+
+function(_qt_internal_is_examples_deployment_supported_in_current_config out_var out_var_reason)
+ # Deployment API doesn't work when examples / tests are built in-tree of a prefix qt build.
+ if(QT_BUILDING_QT AND QT_WILL_INSTALL AND NOT QT_INTERNAL_BUILD_STANDALONE_PARTS)
+ set(deployment_supported FALSE)
+ set(not_supported_reason "PREFIX_BUILD")
+ else()
+ set(deployment_supported TRUE)
+ set(not_supported_reason "")
+ endif()
+
+ set(${out_var} "${deployment_supported}" PARENT_SCOPE)
+ set(${out_var_reason} "${not_supported_reason}" PARENT_SCOPE)
+endfunction()
+
+function(_qt_internal_should_skip_deployment_api out_var out_var_reason)
+ set(skip_deployment FALSE)
+ _qt_internal_is_examples_deployment_supported_in_current_config(
+ deployment_supported
+ not_supported_reason
+ )
+
+ # Allow opting out of deployment, so that we can add deployment api to all our examples,
+ # but only run it in the CI for a select few, to avoid the overhead of deploying all examples.
+ if(QT_INTERNAL_SKIP_DEPLOYMENT OR (NOT deployment_supported))
+ set(skip_deployment TRUE)
+ endif()
+
+ set(reason "")
+ if(NOT deployment_supported)
+ set(reason "${not_supported_reason}")
+ elseif(QT_INTERNAL_SKIP_DEPLOYMENT)
+ set(reason "SKIP_REQUESTED")
+ endif()
+
+ set(${out_var} "${skip_deployment}" PARENT_SCOPE)
+ set(${out_var_reason} "${reason}" PARENT_SCOPE)
+endfunction()
+
+function(_qt_internal_should_skip_post_build_deployment_api out_var out_var_reason)
+ set(skip_deployment FALSE)
+ set(deployment_supported TRUE)
+
+ # Allow opting out of deployment, so that we can add deployment api to all our examples,
+ # but only run it in the CI for a select few, to avoid the overhead of deploying all examples.
+ if(QT_INTERNAL_SKIP_DEPLOYMENT OR (NOT deployment_supported))
+ set(skip_deployment TRUE)
+ endif()
+
+ set(reason "")
+ if(NOT deployment_supported)
+ set(reason "REASON_UNSPECIFIED")
+ elseif(QT_INTERNAL_SKIP_DEPLOYMENT)
+ set(reason "SKIP_REQUESTED")
+ endif()
+
+ set(${out_var} "${skip_deployment}" PARENT_SCOPE)
+ set(${out_var_reason} "${reason}" PARENT_SCOPE)
+endfunction()
+
+# Generate a deploy script that does nothing aside from showing a warning message.
+# The warning can be hidden by setting the QT_INTERNAL_HIDE_NO_OP_DEPLOYMENT_WARNING variable.
+function(_qt_internal_generate_no_op_deploy_script)
+ set(no_value_options
+ )
+ set(single_value_options
+ FUNCTION_NAME
+ NAME
+ OUTPUT_SCRIPT
+ SKIP_REASON
+ TARGET
+ )
+ set(multi_value_options
+ )
+
+ cmake_parse_arguments(PARSE_ARGV 0 arg
+ "${no_value_options}" "${single_value_options}" "${multi_value_options}"
+ )
+
+ if(NOT arg_OUTPUT_SCRIPT)
+ message(FATAL_ERROR "No OUTPUT_SCRIPT option specified")
+ endif()
+ if(NOT arg_FUNCTION_NAME)
+ message(FATAL_ERROR "No FUNCTION_NAME option specified")
+ endif()
+
+ set(generate_args "")
+ if(arg_NAME)
+ list(APPEND generate_args NAME "${arg_NAME}")
+ endif()
+ if(arg_TARGET)
+ list(APPEND generate_args TARGET "${arg_TARGET}")
+ endif()
+
+ set(function_name "${arg_FUNCTION_NAME}")
+
+ # The empty space is required, otherwise
+ set(content "
+message(DEBUG \"Running no-op deployment script because QT_INTERNAL_SKIP_DEPLOYMENT was ON.\")
+")
+ if(NOT QT_INTERNAL_HIDE_NO_OP_DEPLOYMENT_WARNING AND arg_SKIP_REASON STREQUAL "PREFIX_BUILD")
+ set(content "
+message(STATUS \"${function_name}(TARGET ${arg_TARGET}) is a no-op for prefix \"
+\"non-standalone builds due to various issues. Consider using a -no-prefix build \"
+\"or qt-internal-configure-tests or qt-internal-configure-examples if you want deployment to run.\")
+")
+ endif()
+
+ qt6_generate_deploy_script(
+ ${generate_args}
+ OUTPUT_SCRIPT deploy_script
+ CONTENT "${content}")
+
+ set("${arg_OUTPUT_SCRIPT}" "${deploy_script}" PARENT_SCOPE)
+endfunction()
+
+# We basically mirror CMake's policy setup
+# A policy can be set to OLD, set to NEW or unset
+# unset is the default state
+#
+function(qt6_policy mode policy behaviorOrVariable)
+ # When building Qt, tests and examples might expect a policy to be known, but they won't be
+ # known depending on which scope or when a find_package(Module) with the respective policy
+ # is called. Check the global list of known policies to accommodate that.
+ if(QT_BUILDING_QT AND NOT DEFINED QT_KNOWN_POLICY_${policy})
+ get_property(global_known_policies GLOBAL PROPERTY _qt_global_known_policies)
+ if(policy IN_LIST global_known_policies)
+ set(QT_KNOWN_POLICY_${policy} TRUE)
+ endif()
+ endif()
+
+ if (NOT DEFINED QT_KNOWN_POLICY_${policy})
+ message(FATAL_ERROR
+ "${policy} is not a known Qt policy. Did you include the necessary Qt module?"
+ )
+ endif()
+ if (${mode} STREQUAL "SET")
+ set(behavior ${behaviorOrVariable})
+ if (${behavior} STREQUAL "NEW" OR ${behavior} STREQUAL "OLD")
+ set(__QT_INTERNAL_POLICY_${policy} ${behavior} PARENT_SCOPE)
+ else()
+ message(FATAL_ERROR "Qt policies must be either set to NEW or OLD, but got ${behavior}")
+ endif()
+ else(${mode} STREQUAL "GET")
+ set(variable "${behaviorOrVariable}")
+ set("${variable}" "${__QT_INTERNAL_POLICY_${policy}}" PARENT_SCOPE)
+ endif()
+endfunction()
+
+# Internal helper function; can be used in any module before doing a policy check
+function(__qt_internal_setup_policy policy sinceversion policyexplanation)
+ if(DEFINED __QT_INTERNAL_POLICY_${policy})
+ if (__QT_INTERNAL_POLICY_${policy} STREQUAL "OLD")
+ # policy is explicitly disabled
+ message(DEPRECATION
+ "Qt policy ${policy} is set to OLD. "
+ "Support for the old behavior will be removed in a future major version of Qt."
+ )
+ endif()
+ #else: policy is already enabled, nothing to do
+ elseif (${sinceversion} VERSION_LESS_EQUAL __qt_policy_check_version)
+ # we cannot use the public function here as we want to set it in parent scope
+ set(__QT_INTERNAL_POLICY_${policy} "NEW" PARENT_SCOPE)
+ elseif(NOT "${QT_NO_SHOW_OLD_POLICY_WARNINGS}")
+ message(AUTHOR_WARNING
+ "Qt policy ${policy} is not set: "
+ "${policyexplanation} "
+ "Use the qt_policy command to set the policy and suppress this warning.\n"
+ )
+ endif()
+endfunction()
+
+# Note this needs to be a macro because it sets variables intended for the
+# calling scope.
+macro(qt6_standard_project_setup)
+ # A parent project might want to prevent child projects pulled in with
+ # add_subdirectory() from changing the parent's preferred arrangement.
+ # They can set this variable to true to effectively disable this function.
+ if(NOT QT_NO_STANDARD_PROJECT_SETUP)
+
+ set(__qt_sps_args_option)
+ set(__qt_sps_args_single
+ REQUIRES
+ SUPPORTS_UP_TO
+ I18N_SOURCE_LANGUAGE
+ I18N_NATIVE_LANGUAGE # intermediate, remove after dependencies trickled through
+ )
+ set(__qt_sps_args_multi
+ I18N_TRANSLATED_LANGUAGES
+ I18N_LANGUAGES # intermediate, remove after dependencies trickled through
+ )
+ cmake_parse_arguments(__qt_sps_arg
+ "${__qt_sps_args_option}"
+ "${__qt_sps_args_single}"
+ "${__qt_sps_args_multi}"
+ ${ARGN}
+ )
+
+ # intermediate, remove after dependencies trickled through
+ if(DEFINED arg_I18N_NATIVE_LANGUAGE)
+ set(arg_I18N_SOURCE_LANGUAGE ${arg_I18N_NATIVE_LANGUAGE})
+ endif()
+ if(DEFINED arg_I18N_LANGUAGES)
+ set(arg_I18N_TRANSLATED_LANGUAGES ${arg_I18N_LANGUAGES})
+ endif()
+
+ if(__qt_sps_arg_UNPARSED_ARGUMENTS)
+ message(FATAL_ERROR "Unexpected arguments: ${arg_UNPARSED_ARGUMENTS}")
+ endif()
+
+ # Set the Qt CMake policy based on the requested version(s)
+ set(__qt_policy_check_version "6.0.0")
+ if(Qt6_VERSION_MAJOR)
+ set(__qt_current_version
+ "${Qt6_VERSION_MAJOR}.${Qt6_VERSION_MINOR}.${Qt6_VERSION_PATCH}")
+ elseif(QT_BUILDING_QT)
+ set(__qt_current_version
+ "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}")
+ else()
+ message(FATAL_ERROR "Can not determine Qt version.")
+ endif()
+ if(__qt_sps_arg_REQUIRES)
+ if("${__qt_current_version}" VERSION_LESS "${__qt_sps_arg_REQUIRES}")
+ message(FATAL_ERROR
+ "Project required a Qt minimum version of ${__qt_sps_arg_REQUIRES}, "
+ "but current version is only ${__qt_current_version}.")
+ endif()
+ set(__qt_policy_check_version "${__qt_sps_arg_REQUIRES}")
+ endif()
+ if(__qt_sps_arg_SUPPORTS_UP_TO)
+ if(__qt_sps_arg_REQUIRES)
+ if(${__qt_sps_arg_SUPPORTS_UP_TO} VERSION_LESS ${__qt_sps_arg_REQUIRES})
+ message(FATAL_ERROR "SUPPORTS_UP_TO must be larger than or equal to REQUIRES.")
+ endif()
+ set(__qt_policy_check_version "${__qt_sps_arg_SUPPORTS_UP_TO}")
+ else()
+ message(FATAL_ERROR "Please specify the REQUIRES as well.")
+ endif()
+ endif()
+
+ # All changes below this point should not result in a change to an
+ # existing value, except for CMAKE_INSTALL_RPATH which may append new
+ # values (but no duplicates).
+
+ # Use standard install locations, provided by GNUInstallDirs. All
+ # platforms should have this included so that we know the
+ # CMAKE_INSTALL_xxxDIR variables will be set.
+ include(GNUInstallDirs)
+ if(WIN32)
+ # Windows has no RPATH support, so we need all non-plugin DLLs in
+ # the same directory as application executables if we want to be
+ # able to run them without having to augment the PATH environment
+ # variable. Don't discard an existing value in case the project has
+ # already set this to somewhere else. Our setting is somewhat
+ # opinionated, so make it easy for projects to choose something else.
+ if(NOT CMAKE_RUNTIME_OUTPUT_DIRECTORY)
+ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
+ endif()
+ elseif(NOT APPLE)
+ # Apart from Windows and Apple, most other platforms support RPATH
+ # and $ORIGIN. Make executables and non-static libraries use an
+ # install RPATH that allows them to find library dependencies if the
+ # project installs things to the directories defined by the
+ # CMAKE_INSTALL_xxxDIR variables (which is what CMake's defaults
+ # are based on).
+ file(RELATIVE_PATH __qt_relDir
+ ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_INSTALL_BINDIR}
+ ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}
+ )
+ list(APPEND CMAKE_INSTALL_RPATH $ORIGIN $ORIGIN/${__qt_relDir})
+ list(REMOVE_DUPLICATES CMAKE_INSTALL_RPATH)
+ unset(__qt_reldir)
+ endif()
+
+ # Turn these on by default, unless they are already set. Projects can
+ # always turn off any they really don't want after we return.
+ foreach(auto_set IN ITEMS MOC UIC)
+ if(NOT DEFINED CMAKE_AUTO${auto_set})
+ set(CMAKE_AUTO${auto_set} TRUE)
+ endif()
+ endforeach()
+
+ # Enable folder support for IDEs. CMake >= 3.26 enables USE_FOLDERS by default but this is
+ # guarded by CMake policy CMP0143.
+ get_property(__qt_use_folders GLOBAL PROPERTY USE_FOLDERS)
+ if(__qt_use_folders OR "${__qt_use_folders}" STREQUAL "")
+ set_property(GLOBAL PROPERTY USE_FOLDERS ON)
+ get_property(__qt_qt_targets_folder GLOBAL PROPERTY QT_TARGETS_FOLDER)
+ if("${__qt_qt_targets_folder}" STREQUAL "")
+ set(__qt_qt_targets_folder QtInternalTargets)
+ set_property(GLOBAL PROPERTY QT_TARGETS_FOLDER ${__qt_qt_targets_folder})
+ endif()
+ get_property(__qt_autogen_targets_folder GLOBAL PROPERTY AUTOGEN_TARGETS_FOLDER)
+ if("${__qt_autogen_targets_folder}" STREQUAL "")
+ set_property(GLOBAL PROPERTY AUTOGEN_TARGETS_FOLDER ${__qt_qt_targets_folder})
+ endif()
+ endif()
+
+ # Hide generated files in dedicated folder. Unfortunately we can't use a
+ # top level "Generated Files" folder for this, as CMake will then put the
+ # folder first in the list of folders, whereas we want to keep Sources and
+ # Headers front and center. See also _qt_internal_finalize_source_groups
+ set_property(GLOBAL PROPERTY AUTOGEN_SOURCE_GROUP "Source Files/Generated")
+
+ # Treat metatypes JSON files as generated. We propagate these INTERFACE_SOURCES,
+ # due to CMake's lack of a generic mechanism for property inheritance (see
+ # https://gitlab.kitware.com/cmake/cmake/-/issues/20416), but we don't want
+ # them to clutter up the user's project.
+ source_group("Source Files/Generated" REGULAR_EXPRESSION "(_metatypes\\.json)$")
+
+ # I18N support.
+ if(DEFINED __qt_sps_arg_I18N_TRANSLATED_LANGUAGES
+ AND NOT DEFINED QT_I18N_TRANSLATED_LANGUAGES)
+ set(QT_I18N_TRANSLATED_LANGUAGES ${__qt_sps_arg_I18N_TRANSLATED_LANGUAGES})
+ endif()
+ if(NOT DEFINED __qt_sps_arg_I18N_SOURCE_LANGUAGE)
+ set(__qt_sps_arg_I18N_SOURCE_LANGUAGE en)
+ endif()
+ if(NOT DEFINED QT_I18N_SOURCE_LANGUAGE)
+ set(QT_I18N_SOURCE_LANGUAGE ${__qt_sps_arg_I18N_SOURCE_LANGUAGE})
+ endif()
+
+ if(CMAKE_GENERATOR STREQUAL "Xcode")
+ # Ensure we always use device SDK for Xcode for single-arch Qt builds
+ set(qt_osx_arch_count 0)
+ if(QT_OSX_ARCHITECTURES)
+ list(LENGTH QT_OSX_ARCHITECTURES qt_osx_arch_count)
+ endif()
+ if(NOT qt_osx_arch_count GREATER 1 AND ${CMAKE_OSX_SYSROOT} MATCHES "^[a-z]+simulator$")
+ # Xcode expects the base SDK to be the device SDK
+ set(simulator_sysroot "${CMAKE_OSX_SYSROOT}")
+ string(REGEX REPLACE "simulator" "os" CMAKE_OSX_SYSROOT "${CMAKE_OSX_SYSROOT}")
+ set(CMAKE_OSX_SYSROOT "${CMAKE_OSX_SYSROOT}" CACHE STRING "" FORCE)
+ set(CMAKE_XCODE_ATTRIBUTE_SUPPORTED_PLATFORMS "${simulator_sysroot}")
+ endif()
+ endif()
+ endif()
+endmacro()
+
+if(NOT QT_NO_CREATE_VERSIONLESS_FUNCTIONS)
+ macro(qt_standard_project_setup)
+ qt6_standard_project_setup(${ARGV})
+ endmacro()
+ macro(qt_policy)
+ qt6_policy(${ARGV})
+ endmacro()
+endif()
+
+# Store in ${out_var} the i18n catalogs that belong to the passed Qt modules.
+# The catalog "qtbase" is always added to the result.
+#
+# Example:
+# _qt_internal_get_i18n_catalogs_for_modules(catalogs Quick Help)
+# catalogs -> qtbase;qtdeclarative;qt_help
+function(_qt_internal_get_i18n_catalogs_for_modules out_var)
+ set(result "qtbase")
+ set(modules "${ARGN}")
+ set(module_catalog_mapping
+ "Bluetooth|Nfc" qtconnectivity
+ "Help" qt_help
+ "Multimedia(Widgets|QuickPrivate)?" qtmultimedia
+ "Qml|Quick" qtdeclarative
+ "SerialPort" qtserialport
+ "WebEngine" qtwebengine
+ "WebSockets" qtwebsockets
+ )
+ list(LENGTH module_catalog_mapping max_i)
+ math(EXPR max_i "${max_i} - 1")
+ foreach(module IN LISTS modules)
+ foreach(i RANGE 0 ${max_i} 2)
+ list(GET module_catalog_mapping ${i} module_rex)
+ if(NOT module MATCHES "^(${module_rex})")
+ continue()
+ endif()
+ math(EXPR k "${i} + 1")
+ list(GET module_catalog_mapping ${k} catalog)
+ list(APPEND result ${catalog})
+ endforeach()
+ endforeach()
+ set("${out_var}" "${result}" PARENT_SCOPE)
+endfunction()
+
+function(qt6_generate_deploy_script)
+ set(no_value_options "")
+ set(single_value_options
+ CONTENT
+ OUTPUT_SCRIPT
+ NAME
+ TARGET
+
+ # TODO: For backward compatibility / transitional use only,
+ # remove at some point
+ FILENAME_VARIABLE
+ )
+ set(multi_value_options "")
+ cmake_parse_arguments(PARSE_ARGV 0 arg
+ "${no_value_options}" "${single_value_options}" "${multi_value_options}"
+ )
+ if(arg_UNPARSED_ARGUMENTS)
+ message(FATAL_ERROR "Unexpected arguments: ${arg_UNPARSED_ARGUMENTS}")
+ endif()
+
+ # TODO: Remove when FILENAME_VARIABLE is fully removed
+ # Handle the slow deprecation of FILENAME_VARIABLE
+ if(arg_FILENAME_VARIABLE)
+ if(arg_OUTPUT_SCRIPT AND NOT arg_FILENAME_VARIABLE STREQUAL arg_OUTPUT_SCRIPT)
+ message(FATAL_ERROR
+ "Both FILENAME_VARIABLE and OUTPUT_SCRIPT were given and were different. "
+ "Only one of the two should be used."
+ )
+ endif()
+ message(AUTHOR_WARNING
+ "The FILENAME_VARIABLE keyword is deprecated and will be removed soon. Please use OUTPUT_SCRIPT instead.")
+ set(arg_OUTPUT_SCRIPT "${arg_FILENAME_VARIABLE}")
+ unset(arg_FILENAME_VARIABLE)
+ endif()
+
+ if(NOT arg_OUTPUT_SCRIPT)
+ message(FATAL_ERROR "OUTPUT_SCRIPT must be specified")
+ endif()
+
+ if("${arg_CONTENT}" STREQUAL "")
+ message(FATAL_ERROR "CONTENT must be specified")
+ endif()
+
+ # Check whether manual finalization is needed.
+ if(CMAKE_VERSION VERSION_LESS "3.19")
+ get_target_property(is_immediately_finalized ${arg_TARGET} _qt_is_immediately_finalized)
+ if(is_immediately_finalized)
+ message(WARNING
+ "Deployment of plugins for target '${arg_TARGET}' will not work. "
+ "Either, upgrade CMake to version 3.19 or newer, or call "
+ "qt_finalize_target(${arg_TARGET}) after generating the deployment script."
+ )
+ endif()
+ endif()
+
+ # Mark the target as "to be deployed".
+ set_property(TARGET ${arg_TARGET} PROPERTY _qt_marked_for_deployment ON)
+
+ # If the target already was finalized, maybe because it was defined in a subdirectory, generate
+ # the plugin deployment information here.
+ get_target_property(is_finalized "${arg_TARGET}" _qt_is_finalized)
+ if(is_finalized)
+ __qt_internal_generate_plugin_deployment_info(${arg_TARGET})
+ endif()
+
+ # Create a file name that will be unique for this target and the combination
+ # of arguments passed to this command. This allows the project to call us
+ # multiple times with different arguments for the same target (e.g. to
+ # create deployment scripts for different scenarios).
+ set(file_base_name "custom")
+ if(NOT "${arg_NAME}" STREQUAL "")
+ set(file_base_name "${arg_NAME}")
+ elseif(NOT "${arg_TARGET}" STREQUAL "")
+ set(file_base_name "${arg_TARGET}")
+ endif()
+ string(MAKE_C_IDENTIFIER "${file_base_name}" target_id)
+ string(SHA1 args_hash "${ARGV}")
+ string(SUBSTRING "${args_hash}" 0 10 short_hash)
+ _qt_internal_get_deploy_impl_dir(deploy_impl_dir)
+ set(deploy_script "${deploy_impl_dir}/deploy_${target_id}_${short_hash}")
+ get_cmake_property(is_multi_config GENERATOR_IS_MULTI_CONFIG)
+ if(is_multi_config)
+ set(config_infix "-$<CONFIG>")
+ else()
+ set(config_infix "")
+ endif()
+ string(APPEND deploy_script "${config_infix}.cmake")
+ set(${arg_OUTPUT_SCRIPT} "${deploy_script}" PARENT_SCOPE)
+
+ _qt_internal_get_i18n_catalogs_for_modules(catalogs ${QT_ALL_MODULES_FOUND_VIA_FIND_PACKAGE})
+ set(boiler_plate "include(${QT_DEPLOY_SUPPORT})
+include(\"\${CMAKE_CURRENT_LIST_DIR}/${arg_TARGET}-plugins${config_infix}.cmake\" OPTIONAL)
+set(__QT_DEPLOY_I18N_CATALOGS \"${catalogs}\")
+")
+ list(TRANSFORM arg_CONTENT REPLACE "\\$" "\$")
+ file(GENERATE OUTPUT ${deploy_script} CONTENT "${boiler_plate}${arg_CONTENT}")
+endfunction()
+
+if(NOT QT_NO_CREATE_VERSIONLESS_FUNCTIONS)
+ macro(qt_generate_deploy_script)
+ if(QT_DEFAULT_MAJOR_VERSION EQUAL 6)
+ qt6_generate_deploy_script(${ARGV})
+ else()
+ message(FATAL_ERROR "qt_generate_deploy_script() is only available in Qt 6.")
+ endif()
+ endmacro()
+endif()
+
+function(qt6_generate_deploy_app_script)
+ # We use a TARGET keyword option instead of taking the target as the first
+ # positional argument. This is to keep open the possibility of deploying
+ # an app for which we don't have a target (e.g. an application from a
+ # third party project that the caller may want to include in their own
+ # package). We would add an EXECUTABLE keyword for that, which would be
+ # mutually exclusive with the TARGET keyword.
+ set(no_value_options
+ NO_TRANSLATIONS
+ NO_COMPILER_RUNTIME
+ NO_UNSUPPORTED_PLATFORM_ERROR
+ )
+ set(single_value_options
+ TARGET
+ OUTPUT_SCRIPT
+
+ # TODO: For backward compatibility / transitional use only,
+ # remove at some point
+ FILENAME_VARIABLE
+ )
+ set(qt_deploy_runtime_dependencies_options
+ # These options are forwarded as is to qt_deploy_runtime_dependencies.
+ DEPLOY_TOOL_OPTIONS
+ PRE_INCLUDE_REGEXES
+ PRE_EXCLUDE_REGEXES
+ POST_INCLUDE_REGEXES
+ POST_EXCLUDE_REGEXES
+ POST_INCLUDE_FILES
+ POST_EXCLUDE_FILES
+ )
+ set(multi_value_options
+ ${qt_deploy_runtime_dependencies_options}
+ )
+ cmake_parse_arguments(PARSE_ARGV 0 arg
+ "${no_value_options}" "${single_value_options}" "${multi_value_options}"
+ )
+ if(arg_UNPARSED_ARGUMENTS)
+ message(FATAL_ERROR "Unexpected arguments: ${arg_UNPARSED_ARGUMENTS}")
+ endif()
+ if(NOT arg_TARGET)
+ message(FATAL_ERROR "TARGET must be specified")
+ endif()
+
+ # TODO: Remove when FILENAME_VARIABLE is fully removed
+ # Handle the slow deprecation of FILENAME_VARIABLE
+ if(arg_FILENAME_VARIABLE)
+ if(arg_OUTPUT_SCRIPT AND NOT arg_FILENAME_VARIABLE STREQUAL arg_OUTPUT_SCRIPT)
+ message(FATAL_ERROR
+ "Both FILENAME_VARIABLE and OUTPUT_SCRIPT were given and were different. "
+ "Only one of the two should be used."
+ )
+ endif()
+ message(AUTHOR_WARNING
+ "The FILENAME_VARIABLE keyword is deprecated and will be removed soon. Please use OUTPUT_SCRIPT instead.")
+ set(arg_OUTPUT_SCRIPT "${arg_FILENAME_VARIABLE}")
+ unset(arg_FILENAME_VARIABLE)
+ endif()
+
+ if(NOT arg_OUTPUT_SCRIPT)
+ message(FATAL_ERROR "OUTPUT_SCRIPT must be specified")
+ endif()
+
+ get_target_property(is_bundle ${arg_TARGET} MACOSX_BUNDLE)
+
+ set(unsupported_platform_extra_message "")
+ if(QT6_IS_SHARED_LIBS_BUILD)
+ set(qt_build_type_string "shared Qt libs")
+ else()
+ set(qt_build_type_string "static Qt libs")
+ endif()
+
+ if(CMAKE_CROSSCOMPILING)
+ string(APPEND qt_build_type_string ", cross-compiled")
+ endif()
+
+ if(NOT is_bundle)
+ string(APPEND qt_build_type_string ", non-bundle app")
+ set(unsupported_platform_extra_message
+ "Executable targets have to be app bundles to use this command on Apple platforms.")
+ endif()
+
+ set(generate_args
+ TARGET ${arg_TARGET}
+ OUTPUT_SCRIPT deploy_script
+ )
+
+ set(common_deploy_args "")
+ if(arg_NO_TRANSLATIONS)
+ string(APPEND common_deploy_args " NO_TRANSLATIONS\n")
+ endif()
+ if(arg_NO_COMPILER_RUNTIME)
+ string(APPEND common_deploy_args " NO_COMPILER_RUNTIME\n")
+ endif()
+
+ # Forward the arguments that are exactly the same for qt_deploy_runtime_dependencies.
+ foreach(var IN LISTS qt_deploy_runtime_dependencies_options)
+ if(NOT "${arg_${var}}" STREQUAL "")
+ list(APPEND common_deploy_args ${var} ${arg_${var}})
+ endif()
+ endforeach()
+
+ _qt_internal_should_skip_deployment_api(skip_deployment skip_reason)
+ if(skip_deployment)
+ _qt_internal_generate_no_op_deploy_script(
+ FUNCTION_NAME "qt6_generate_deploy_app_script"
+ SKIP_REASON "${skip_reason}"
+ ${generate_args}
+ )
+ elseif(APPLE AND NOT IOS AND QT6_IS_SHARED_LIBS_BUILD AND is_bundle)
+ # TODO: Consider handling non-bundle applications in the future using the generic cmake
+ # runtime dependency feature.
+ qt6_generate_deploy_script(${generate_args}
+ CONTENT "
+qt6_deploy_runtime_dependencies(
+ EXECUTABLE $<TARGET_FILE_NAME:${arg_TARGET}>.app
+${common_deploy_args})
+")
+
+ elseif(WIN32 AND QT6_IS_SHARED_LIBS_BUILD)
+ qt6_generate_deploy_script(${generate_args}
+ CONTENT "
+qt6_deploy_runtime_dependencies(
+ EXECUTABLE $<TARGET_FILE:${arg_TARGET}>
+ GENERATE_QT_CONF
+${common_deploy_args})
+")
+
+ elseif(UNIX AND NOT APPLE AND NOT ANDROID AND QT6_IS_SHARED_LIBS_BUILD
+ AND NOT CMAKE_CROSSCOMPILING)
+ qt6_generate_deploy_script(${generate_args}
+ CONTENT "
+qt6_deploy_runtime_dependencies(
+ EXECUTABLE $<TARGET_FILE:${arg_TARGET}>
+ GENERATE_QT_CONF
+${common_deploy_args})
+")
+
+ elseif(NOT arg_NO_UNSUPPORTED_PLATFORM_ERROR AND NOT QT_INTERNAL_NO_UNSUPPORTED_PLATFORM_ERROR)
+ # Currently we don't deploy runtime dependencies if cross-compiling or using a static Qt.
+ # Error out by default unless the project opted out of the error.
+ # This provides us a migration path in the future without breaking compatibility promises.
+ message(FATAL_ERROR
+ "Support for installing runtime dependencies is not implemented for "
+ "this target platform (${CMAKE_SYSTEM_NAME}, ${qt_build_type_string}). "
+ ${unsupported_platform_extra_message}
+ )
+ else()
+ set(skip_message
+ "_qt_internal_show_skip_runtime_deploy_message(\"${qt_build_type_string}\"")
+ if(unsupported_platform_extra_message)
+ string(APPEND skip_message
+ "\n EXTRA_MESSAGE \"${unsupported_platform_extra_message}\"")
+ endif()
+ string(APPEND skip_message "\n)")
+ qt6_generate_deploy_script(${generate_args} CONTENT "${skip_message}")
+ endif()
+
+ set(${arg_OUTPUT_SCRIPT} "${deploy_script}" PARENT_SCOPE)
+endfunction()
+
+if(NOT QT_NO_CREATE_VERSIONLESS_FUNCTIONS)
+ macro(qt_generate_deploy_app_script)
+ qt6_generate_deploy_app_script(${ARGV})
+ endmacro()
+endif()
diff --git a/src/corelib/Qt6CoreResourceInit.in.cpp b/src/corelib/Qt6CoreResourceInit.in.cpp
new file mode 100644
index 0000000000..3f1757362d
--- /dev/null
+++ b/src/corelib/Qt6CoreResourceInit.in.cpp
@@ -0,0 +1,14 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+// This file was generated by the qt_add_resources command.
+
+#include <QtCore/qtsymbolmacros.h>
+
+QT_DECLARE_EXTERN_RESOURCE(@RESOURCE_NAME@)
+
+namespace {
+ struct resourceReferenceKeeper {
+ resourceReferenceKeeper() { QT_KEEP_RESOURCE(@RESOURCE_NAME@) }
+ } resourceReferenceKeeperInstance;
+}
diff --git a/src/corelib/Qt6WasmMacros.cmake b/src/corelib/Qt6WasmMacros.cmake
index 2c915b3903..1de6e5448c 100644
--- a/src/corelib/Qt6WasmMacros.cmake
+++ b/src/corelib/Qt6WasmMacros.cmake
@@ -1,22 +1,140 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+
# Copy in Qt HTML/JS launch files for apps.
function(_qt_internal_wasm_add_target_helpers target)
+
+ _qt_test_emscripten_version()
get_target_property(targetType "${target}" TYPE)
if("${targetType}" STREQUAL "EXECUTABLE")
- set(APPNAME ${target})
-
if(QT6_INSTALL_PREFIX)
set(WASM_BUILD_DIR "${QT6_INSTALL_PREFIX}")
elseif(QT_BUILD_DIR)
set(WASM_BUILD_DIR "${QT_BUILD_DIR}")
endif()
- configure_file("${WASM_BUILD_DIR}/plugins/platforms/wasm_shell.html"
- "${target}.html")
- configure_file("${WASM_BUILD_DIR}/plugins/platforms/qtloader.js"
- qtloader.js COPYONLY)
- configure_file("${WASM_BUILD_DIR}/plugins/platforms/qtlogo.svg"
- qtlogo.svg COPYONLY)
+ get_target_property(output_name ${target} OUTPUT_NAME)
+ if(output_name)
+ set(_target_output_name "${output_name}")
+ else()
+ set(_target_output_name "${target}")
+ endif()
+
+ set(APPNAME ${_target_output_name})
+ _qt_internal_wasm_export_name_for_target(_export_name ${target})
+ set(APPEXPORTNAME ${_export_name})
+
+ # Shared library builds preload plugins and qml imports by default.
+ # The json files are generated by scripts in qtbase/util/wasm/preload
+ if (QT_FEATURE_shared)
+ set(PRELOAD "preload: ['qt_plugins.json', 'qt_qml_imports.json'],")
+ else()
+ set(PRELOAD "")
+ endif()
+
+ get_target_property(target_output_directory ${target} RUNTIME_OUTPUT_DIRECTORY)
+
+ get_target_property(is_test ${target} _qt_is_test_executable)
+ get_target_property(is_manual_test ${target} _qt_is_manual_test)
+ if(is_test AND NOT is_manual_test)
+ # Keep in sync with testrunner_files in testlib/CMakeLists.txt
+ configure_file("${WASM_BUILD_DIR}/libexec/batchedtestrunner.html"
+ "${target_output_directory}/${_target_output_name}.html" COPYONLY)
+ configure_file("${WASM_BUILD_DIR}/libexec/qtestoutputreporter.css"
+ "${target_output_directory}/qtestoutputreporter.css" COPYONLY)
+ configure_file("${WASM_BUILD_DIR}/libexec/batchedtestrunner.js"
+ "${target_output_directory}/batchedtestrunner.js" COPYONLY)
+ configure_file("${WASM_BUILD_DIR}/libexec/emrunadapter.js"
+ "${target_output_directory}/emrunadapter.js" COPYONLY)
+ configure_file("${WASM_BUILD_DIR}/libexec/qwasmjsruntime.js"
+ "${target_output_directory}/qwasmjsruntime.js" COPYONLY)
+ configure_file("${WASM_BUILD_DIR}/libexec/qwasmtestmain.js"
+ "${target_output_directory}/qwasmtestmain.js" COPYONLY)
+ configure_file("${WASM_BUILD_DIR}/libexec/qtestoutputreporter.js"
+ "${target_output_directory}/qtestoutputreporter.js" COPYONLY)
+ configure_file("${WASM_BUILD_DIR}/libexec/util.js"
+ "${target_output_directory}/util.js" COPYONLY)
+ else()
+ if(target_output_directory)
+ set(_target_directory "${target_output_directory}")
+ else()
+ set(_target_directory "${CMAKE_CURRENT_BINARY_DIR}")
+ endif()
+
+ configure_file("${WASM_BUILD_DIR}/plugins/platforms/wasm_shell.html"
+ "${_target_directory}/${_target_output_name}.html" @ONLY)
+ configure_file("${WASM_BUILD_DIR}/plugins/platforms/qtloader.js"
+ ${_target_directory}/qtloader.js COPYONLY)
+ configure_file("${WASM_BUILD_DIR}/plugins/platforms/qtlogo.svg"
+ ${_target_directory}/qtlogo.svg COPYONLY)
+ endif()
+
+ if(QT_FEATURE_thread)
+ set(POOL_SIZE 4)
+ get_target_property(_tmp_poolSize "${target}" QT_WASM_PTHREAD_POOL_SIZE)
+ if(_tmp_poolSize)
+ set(POOL_SIZE ${_tmp_poolSize})
+ elseif(DEFINED QT_WASM_PTHREAD_POOL_SIZE)
+ set(POOL_SIZE ${QT_WASM_PTHREAD_POOL_SIZE})
+ endif()
+ target_link_options("${target}" PRIVATE "SHELL:-s PTHREAD_POOL_SIZE=${POOL_SIZE}")
+ message(DEBUG "Setting PTHREAD_POOL_SIZE to ${POOL_SIZE} for ${target}")
+ endif()
+
+ # Set initial memory size, either from user setting or to a minimum amount required by Qt.
+ get_target_property(_tmp_initialMemory "${target}" QT_WASM_INITIAL_MEMORY)
+ if(_tmp_initialMemory)
+ set(QT_WASM_INITIAL_MEMORY "${_tmp_initialMemory}")
+ elseif(NOT DEFINED QT_WASM_INITIAL_MEMORY)
+ set(QT_WASM_INITIAL_MEMORY "50MB")
+ endif()
+ target_link_options("${target}" PRIVATE "SHELL:-s INITIAL_MEMORY=${QT_WASM_INITIAL_MEMORY}")
+
+ # Set maximum memory size, either from user setting or to 4GB (the 32-bit maximum)
+ get_target_property(_tmp_maximumMemory "${target}" QT_WASM_MAXIMUM_MEMORY)
+ if(_tmp_maximumMemory)
+ set(QT_WASM_MAXIMUM_MEMORY "${_tmp_maximumMemory}")
+ elseif(NOT DEFINED QT_WASM_MAXIMUM_MEMORY)
+ set(QT_WASM_MAXIMUM_MEMORY "4GB")
+ endif()
+ target_link_options("${target}" PRIVATE "SHELL:-s MAXIMUM_MEMORY=${QT_WASM_MAXIMUM_MEMORY}")
+
+ endif()
+endfunction()
+
+function(_qt_internal_add_wasm_extra_exported_methods target)
+ get_target_property(wasm_extra_exported_methods "${target}" QT_WASM_EXTRA_EXPORTED_METHODS)
+
+ set(wasm_default_exported_methods "UTF16ToString,stringToUTF16,JSEvents,specialHTMLTargets,FS,callMain")
+
+ if(NOT wasm_extra_exported_methods)
+ set(wasm_extra_exported_methods ${QT_WASM_EXTRA_EXPORTED_METHODS})
+ endif()
+
+ if(wasm_extra_exported_methods)
+ target_link_options("${target}" PRIVATE
+ "SHELL:-s EXPORTED_RUNTIME_METHODS=${wasm_default_exported_methods},${wasm_extra_exported_methods}"
+ )
+ else()
+ # an errant dangling comma will break this
+ target_link_options("${target}" PRIVATE
+ "SHELL:-s EXPORTED_RUNTIME_METHODS=${wasm_default_exported_methods}"
+ )
+ endif()
+endfunction()
+
+function(_qt_internal_set_wasm_export_name target)
+ _qt_internal_wasm_export_name_for_target(export_name ${target})
+ target_link_options("${target}" PRIVATE "SHELL:-s EXPORT_NAME=${export_name}")
+endfunction()
+function(_qt_internal_wasm_export_name_for_target out target)
+ get_target_property(export_name "${target}" QT_WASM_EXPORT_NAME)
+ if(export_name)
+ set(${out} "${export_name}" PARENT_SCOPE)
+ else()
+ string(REGEX REPLACE "[^a-zA-Z0-9_]" "_" target "${target}")
+ set(${out} "${target}_entry" PARENT_SCOPE)
endif()
endfunction()
diff --git a/src/corelib/QtCompressMimeDatabase.cmake b/src/corelib/QtCompressMimeDatabase.cmake
new file mode 100644
index 0000000000..718d330f28
--- /dev/null
+++ b/src/corelib/QtCompressMimeDatabase.cmake
@@ -0,0 +1,156 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+cmake_minimum_required(VERSION 3.16)
+
+get_filename_component(output_directory "${OUTPUT_FILE}" DIRECTORY)
+file(MAKE_DIRECTORY "${output_directory}")
+
+find_program(xmlstarlet NAMES xmlstarlet xml)
+if(xmlstarlet)
+ set(XML_STARLET_COMMAND COMMAND "${xmlstarlet}" sel -D -B -t -c / "${INPUT_FILE}")
+else()
+ get_filename_component(mime_types_resource_filename "${INPUT_FILE}" NAME)
+ message(STATUS "xmlstarlet command was not found. ${mime_types_resource_filename}"
+ " will not be minified.")
+endif()
+
+# The function tries to minify 'input_file' using the globally defined 'XML_STARLET_COMMAND'.
+# Sets the full path of the output file to the 'out_var' argument. If 'XML_STARLET_COMMAND' fails
+# to minify the 'input_file', 'out_var' is set to 'input_file'.
+function(try_minify_xml out_var input_file output_directory)
+ get_filename_component(output_filename "${input_file}" NAME)
+ set(minified_output "${output_directory}/${output_filename}")
+
+ # Assume XML_STARLET_COMMAND is globally defined.
+ if(XML_STARLET_COMMAND)
+ execute_process(${XML_STARLET_COMMAND}
+ OUTPUT_FILE "${minified_output}"
+ RESULT_VARIABLE failed_to_minify
+ )
+ if(NOT failed_to_minify)
+ set(${out_var} "${minified_output}" PARENT_SCOPE)
+ return()
+ endif()
+ endif()
+ set(${out_var} "${input_file}" PARENT_SCOPE)
+endfunction()
+
+unset(archive_command)
+
+if(COMPRESSION_TYPE STREQUAL "none")
+ try_minify_xml(qmimeprovider_db_data_file "${INPUT_FILE}" "${output_directory}")
+else()
+ # CMake versions less than 3.26 don't support the value of the zstd compression level higher
+ # than 9. We want zstd to compress with level 19 if it's possible, so if zstd executable is
+ # found on a file system we prefer to use the 'External' archiving API instead of the CMake API.
+ # See for details: https://gitlab.kitware.com/cmake/cmake/-/issues/24160
+ if(COMPRESSION_TYPE STREQUAL "zstd" AND CMAKE_VERSION VERSION_LESS 3.26)
+ find_program(archive_command NAMES zstd zstd.exe)
+ if(archive_command)
+ set(ARCHIVING_API "External")
+ endif()
+ endif()
+
+ set(qmimeprovider_db_data_file "${OUTPUT_FILE}.archive")
+ if(ARCHIVING_API STREQUAL "External")
+ message(STATUS "Using external archive command to compress the mime type database")
+ if(COMPRESSION_TYPE STREQUAL "zstd")
+ find_program(archive_command NAMES zstd zstd.exe)
+ if(archive_command)
+ set(archive_command_args -cq19 -T1)
+ else()
+ message(WARNING
+ "Unable to use the preffered ${COMPRESSION_TYPE} compression for the mime type database."
+ " ${COMPRESSION_TYPE} binary is not found. Trying gzip.")
+ endif()
+ endif()
+ if(NOT archive_command)
+ # Trying to use gzip if zstd is binary is not found.
+ set(COMPRESSION_TYPE "gzip")
+ find_program(archive_command NAMES gzip gzip.exe)
+ set(archive_command_args -nc9)
+ endif()
+ if(archive_command)
+ if(NOT XML_STARLET_COMMAND)
+ set(intput_file_arg INPUT_FILE "${INPUT_FILE}")
+ endif()
+ execute_process(${XML_STARLET_COMMAND}
+ COMMAND ${archive_command}
+ ${archive_command_args}
+ ${intput_file_arg}
+ OUTPUT_FILE "${qmimeprovider_db_data_file}"
+ RESULTS_VARIABLE results
+ ERROR_VARIABLE error_string
+ )
+
+ foreach(result IN LISTS results)
+ if(NOT result EQUAL 0)
+ message(WARNING "Unable to compress mime type database: ${error_string}")
+ endif()
+ endforeach()
+ else()
+ message(WARNING "Unable to find ${COMPRESSION_TYPE} binary."
+ " Please make sure that the ${COMPRESSION_TYPE} binary is in PATH."
+ " Adding the uncompressed mime type database.")
+ set(COMPRESSION_TYPE "none")
+ set(qmimeprovider_db_data_file "${INPUT_FILE}")
+ endif()
+ else()
+ message(STATUS "Using CMake archive command to compress the mime type database")
+
+ try_minify_xml(mimetypes_resource_file_minified "${INPUT_FILE}" "${output_directory}")
+
+ if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.26 AND COMPRESSION_TYPE STREQUAL "zstd")
+ set(additional_file_archive_create_parameters COMPRESSION_LEVEL 19)
+ elseif(CMAKE_VERSION VERSION_GREATER_EQUAL 3.19)
+ set(additional_file_archive_create_parameters COMPRESSION_LEVEL 9)
+ endif()
+
+ if(COMPRESSION_TYPE STREQUAL "gzip")
+ set(cmake_compression_type "GZip")
+ elseif(COMPRESSION_TYPE STREQUAL "zstd")
+ set(cmake_compression_type "Zstd")
+ endif()
+
+ file(ARCHIVE_CREATE OUTPUT "${qmimeprovider_db_data_file}"
+ PATHS "${mimetypes_resource_file_minified}"
+ FORMAT raw
+ COMPRESSION ${cmake_compression_type}
+ ${additional_file_archive_create_parameters}
+ )
+ if(NOT mimetypes_resource_file_minified STREQUAL INPUT_FILE)
+ file(REMOVE "${mimetypes_resource_file_minified}")
+ endif()
+ endif()
+endif()
+file(READ "${qmimeprovider_db_data_file}" qmime_db_data HEX)
+file(SIZE "${qmimeprovider_db_data_file}" qmime_db_data_size)
+if(NOT qmimeprovider_db_data_file STREQUAL INPUT_FILE)
+ file(SIZE "${INPUT_FILE}" qmime_db_resource_size)
+ file(REMOVE "${qmimeprovider_db_data_file}")
+else()
+ set(qmime_db_resource_size ${qmime_db_data_size})
+endif()
+
+string(REGEX MATCHALL "([a-f0-9][a-f0-9])" qmime_db_hex "${qmime_db_data}")
+
+list(TRANSFORM qmime_db_hex PREPEND "0x")
+math(EXPR qmime_db_data_size "${qmime_db_data_size} - 1")
+foreach(index RANGE 0 ${qmime_db_data_size} 12)
+ list(APPEND index_list ${index})
+endforeach()
+list(TRANSFORM qmime_db_hex PREPEND "\n " AT ${index_list})
+list(JOIN qmime_db_hex ", " qmime_db_hex_joined)
+
+if(NOT COMPRESSION_TYPE STREQUAL "none")
+ string(TOUPPER "${COMPRESSION_TYPE}" compression_type_upper)
+ set(qmime_db_content "#define MIME_DATABASE_IS_${compression_type_upper}\n")
+endif()
+string(APPEND qmime_db_content
+ "static const unsigned char mimetype_database[] = {"
+ "${qmime_db_hex_joined}"
+ "\n};\n"
+ "static constexpr size_t MimeTypeDatabaseOriginalSize = ${qmime_db_resource_size};\n"
+)
+
+file(WRITE "${OUTPUT_FILE}" "${qmime_db_content}")
diff --git a/src/corelib/animation/qabstractanimation.cpp b/src/corelib/animation/qabstractanimation.cpp
index 1e887bfb54..9687af0987 100644
--- a/src/corelib/animation/qabstractanimation.cpp
+++ b/src/corelib/animation/qabstractanimation.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
/*!
\class QAbstractAnimation
@@ -149,7 +113,6 @@
#include "qabstractanimation_p.h"
#include <QtCore/qmath.h>
-#include <QtCore/qthreadstorage.h>
#include <QtCore/qcoreevent.h>
#include <QtCore/qpointer.h>
#include <QtCore/qscopedvaluerollback.h>
@@ -214,8 +177,6 @@ typedef QList<QAbstractAnimation*>::ConstIterator AnimationListConstIt;
QUnifiedTimer drives animations indirectly, via QAbstractAnimationTimer.
*/
-Q_GLOBAL_STATIC(QThreadStorage<QUnifiedTimer *>, unifiedTimer)
-
QUnifiedTimer::QUnifiedTimer() :
QObject(), defaultDriver(this), lastTick(0), timingInterval(DEFAULT_TIMER_INTERVAL),
currentAnimationIdx(0), insideTick(false), insideRestart(false), consistentTiming(false), slowMode(false),
@@ -227,15 +188,18 @@ QUnifiedTimer::QUnifiedTimer() :
driver = &defaultDriver;
}
+QUnifiedTimer::~QUnifiedTimer()
+ = default;
QUnifiedTimer *QUnifiedTimer::instance(bool create)
{
QUnifiedTimer *inst;
- if (create && !unifiedTimer()->hasLocalData()) {
+ static thread_local std::unique_ptr<QUnifiedTimer> unifiedTimer;
+ if (create && !unifiedTimer) {
inst = new QUnifiedTimer;
- unifiedTimer()->setLocalData(inst);
+ unifiedTimer.reset(inst);
} else {
- inst = unifiedTimer() ? unifiedTimer()->localData() : nullptr;
+ inst = unifiedTimer.get();
}
return inst;
}
@@ -319,7 +283,7 @@ void QUnifiedTimer::updateAnimationTimers()
QScopedValueRollback<bool> guard(insideTick, true);
if (profilerCallback)
profilerCallback(delta);
- for (currentAnimationIdx = 0; currentAnimationIdx < animationTimers.count(); ++currentAnimationIdx) {
+ for (currentAnimationIdx = 0; currentAnimationIdx < animationTimers.size(); ++currentAnimationIdx) {
QAbstractAnimationTimer *animation = animationTimers.at(currentAnimationIdx);
animation->updateAnimationsTime(delta);
}
@@ -330,7 +294,7 @@ void QUnifiedTimer::updateAnimationTimers()
int QUnifiedTimer::runningAnimationCount()
{
int count = 0;
- for (int i = 0; i < animationTimers.count(); ++i)
+ for (int i = 0; i < animationTimers.size(); ++i)
count += animationTimers.at(i)->runningAnimationCount();
return count;
}
@@ -345,7 +309,7 @@ void QUnifiedTimer::localRestart()
if (insideRestart)
return;
- if (!pausedAnimationTimers.isEmpty() && (animationTimers.count() + animationTimersToStart.count() == pausedAnimationTimers.count())) {
+ if (!pausedAnimationTimers.isEmpty() && (animationTimers.size() + animationTimersToStart.size() == pausedAnimationTimers.size())) {
driver->stop();
int closestTimeToFinish = closestPausedAnimationTimerTimeToFinish();
// use a precise timer if the pause will be short
@@ -363,7 +327,7 @@ void QUnifiedTimer::restart()
{
{
QScopedValueRollback<bool> guard(insideRestart, true);
- for (int i = 0; i < animationTimers.count(); ++i)
+ for (int i = 0; i < animationTimers.size(); ++i)
animationTimers.at(i)->restartAnimationTimer();
}
@@ -548,10 +512,6 @@ bool QUnifiedTimer::canUninstallAnimationDriver(QAnimationDriver *d)
return d == driver && driver != &defaultDriver;
}
-#if QT_CONFIG(thread)
-Q_GLOBAL_STATIC(QThreadStorage<QAnimationTimer *>, animationTimer)
-#endif
-
QAnimationTimer::QAnimationTimer() :
QAbstractAnimationTimer(), lastTick(0),
currentAnimationIdx(0), insideTick(false),
@@ -560,15 +520,19 @@ QAnimationTimer::QAnimationTimer() :
{
}
+QAnimationTimer::~QAnimationTimer()
+ = default;
+
QAnimationTimer *QAnimationTimer::instance(bool create)
{
QAnimationTimer *inst;
#if QT_CONFIG(thread)
- if (create && !animationTimer()->hasLocalData()) {
+ static thread_local std::unique_ptr<QAnimationTimer> animationTimer;
+ if (create && !animationTimer) {
inst = new QAnimationTimer;
- animationTimer()->setLocalData(inst);
+ animationTimer.reset(inst);
} else {
- inst = animationTimer() ? animationTimer()->localData() : nullptr;
+ inst = animationTimer.get();
}
#else
Q_UNUSED(create);
@@ -604,7 +568,7 @@ void QAnimationTimer::updateAnimationsTime(qint64 delta)
//when the CPU load is high
if (delta) {
QScopedValueRollback<bool> guard(insideTick, true);
- for (currentAnimationIdx = 0; currentAnimationIdx < animations.count(); ++currentAnimationIdx) {
+ for (currentAnimationIdx = 0; currentAnimationIdx < animations.size(); ++currentAnimationIdx) {
QAbstractAnimation *animation = animations.at(currentAnimationIdx);
int elapsed = QAbstractAnimationPrivate::get(animation)->totalCurrentTime
+ (animation->direction() == QAbstractAnimation::Forward ? delta : -delta);
@@ -892,8 +856,14 @@ qint64 QAnimationDriver::elapsed() const
QDefaultAnimationDriver::QDefaultAnimationDriver(QUnifiedTimer *timer)
: QAnimationDriver(nullptr), m_unified_timer(timer)
{
- connect(this, SIGNAL(started()), this, SLOT(startTimer()));
- connect(this, SIGNAL(stopped()), this, SLOT(stopTimer()));
+ connect(this, &QAnimationDriver::started, this, &QDefaultAnimationDriver::startTimer);
+ connect(this, &QAnimationDriver::stopped, this, &QDefaultAnimationDriver::stopTimer);
+}
+
+QDefaultAnimationDriver::~QDefaultAnimationDriver()
+{
+ disconnect(this, &QAnimationDriver::started, this, &QDefaultAnimationDriver::startTimer);
+ disconnect(this, &QAnimationDriver::stopped, this, &QDefaultAnimationDriver::stopTimer);
}
void QDefaultAnimationDriver::timerEvent(QTimerEvent *e)
@@ -914,18 +884,33 @@ void QDefaultAnimationDriver::stopTimer()
m_timer.stop();
}
+QAnimationDriverPrivate::QAnimationDriverPrivate()
+ = default;
+
+QAnimationDriverPrivate::~QAnimationDriverPrivate()
+ = default;
+
+QAbstractAnimationTimer::QAbstractAnimationTimer()
+ = default;
+
+QAbstractAnimationTimer::~QAbstractAnimationTimer()
+ = default;
+
+QAbstractAnimationPrivate::QAbstractAnimationPrivate()
+ = default;
+
QAbstractAnimationPrivate::~QAbstractAnimationPrivate() { }
void QAbstractAnimationPrivate::setState(QAbstractAnimation::State newState)
{
Q_Q(QAbstractAnimation);
- if (state == newState)
+ const QAbstractAnimation::State oldState = state.valueBypassingBindings();
+ if (oldState == newState)
return;
if (loopCount == 0)
return;
- QAbstractAnimation::State oldState = state;
int oldCurrentTime = currentTime;
int oldCurrentLoop = currentLoop;
QAbstractAnimation::Direction oldDirection = direction;
@@ -959,13 +944,15 @@ void QAbstractAnimationPrivate::setState(QAbstractAnimation::State newState)
}
q->updateState(newState, oldState);
- if (!guard || newState != state) //this is to be safe if updateState changes the state
+ //this is to be safe if updateState changes the state
+ if (!guard || newState != state.valueBypassingBindings())
return;
// Notify state change
state.notify();
emit q->stateChanged(newState, oldState);
- if (!guard || newState != state) //this is to be safe if updateState changes the state
+ //this is to be safe if updateState changes the state
+ if (!guard || newState != state.valueBypassingBindings())
return;
switch (state) {
@@ -1139,7 +1126,7 @@ void QAbstractAnimation::setDirection(Direction direction)
return;
}
- Qt::beginPropertyUpdateGroup();
+ const QScopedPropertyUpdateGroup guard;
const int oldCurrentLoop = d->currentLoop;
if (state() == Stopped) {
if (direction == Backward) {
@@ -1166,7 +1153,6 @@ void QAbstractAnimation::setDirection(Direction direction)
if (d->currentLoop != oldCurrentLoop)
d->currentLoop.notify();
d->direction.notify();
- Qt::endPropertyUpdateGroup();
}
QBindable<QAbstractAnimation::Direction> QAbstractAnimation::bindableDirection()
@@ -1320,46 +1306,59 @@ void QAbstractAnimation::setCurrentTime(int msecs)
msecs = qMax(msecs, 0);
// Calculate new time and loop.
- int dura = duration();
- int totalDura = dura <= 0 ? dura : ((d->loopCount < 0) ? -1 : dura * d->loopCount);
+ const int dura = duration();
+ const int totalLoopCount = d->loopCount;
+ const int totalDura = dura <= 0 ? dura : ((totalLoopCount < 0) ? -1 : dura * totalLoopCount);
if (totalDura != -1)
msecs = qMin(totalDura, msecs);
- const int oldCurrentTime = d->totalCurrentTime;
- d->totalCurrentTime = msecs;
+ d->totalCurrentTime.removeBindingUnlessInWrapper();
+
+ const int oldCurrentTime = d->totalCurrentTime.valueBypassingBindings();
+ d->totalCurrentTime.setValueBypassingBindings(msecs);
+
+ QAbstractAnimation::Direction currentDirection = d->direction;
// Update new values.
- int oldLoop = d->currentLoop;
- d->currentLoop = ((dura <= 0) ? 0 : (msecs / dura));
- if (d->currentLoop == d->loopCount) {
+ const int oldLoop = d->currentLoop.valueBypassingBindings();
+ int newCurrentLoop = (dura <= 0) ? 0 : (msecs / dura);
+ if (newCurrentLoop == totalLoopCount) {
//we're at the end
d->currentTime = qMax(0, dura);
- d->currentLoop = qMax(0, d->loopCount - 1);
+ newCurrentLoop = qMax(0, totalLoopCount - 1);
} else {
- if (d->direction == Forward) {
+ if (currentDirection == Forward) {
d->currentTime = (dura <= 0) ? msecs : (msecs % dura);
} else {
d->currentTime = (dura <= 0) ? msecs : ((msecs - 1) % dura) + 1;
if (d->currentTime == dura)
- d->currentLoop = d->currentLoop - 1;
+ newCurrentLoop = newCurrentLoop - 1;
}
}
+ d->currentLoop.setValueBypassingBindings(newCurrentLoop);
+ // this is a virtual function, so it can update the properties as well
updateCurrentTime(d->currentTime);
- if (d->currentLoop != oldLoop)
+
+ // read the property values again
+ newCurrentLoop = d->currentLoop.valueBypassingBindings();
+ currentDirection = d->direction;
+ const int newTotalCurrentTime = d->totalCurrentTime.valueBypassingBindings();
+
+ if (newCurrentLoop != oldLoop)
d->currentLoop.notify();
/* Notify before calling stop: As seen in tst_QSequentialAnimationGroup::clear
* we might delete the animation when stop is called. Thus after stop no member
* of the object must be used anymore.
*/
- if (oldCurrentTime != d->totalCurrentTime)
+ if (oldCurrentTime != newTotalCurrentTime)
d->totalCurrentTime.notify();
// All animations are responsible for stopping the animation when their
// own end state is reached; in this case the animation is time driven,
// and has reached the end.
- if ((d->direction == Forward && d->totalCurrentTime == totalDura)
- || (d->direction == Backward && d->totalCurrentTime == 0)) {
+ if ((currentDirection == Forward && newTotalCurrentTime == totalDura)
+ || (currentDirection == Backward && newTotalCurrentTime == 0)) {
stop();
}
}
@@ -1383,7 +1382,7 @@ void QAbstractAnimation::setCurrentTime(int msecs)
void QAbstractAnimation::start(DeletionPolicy policy)
{
Q_D(QAbstractAnimation);
- if (d->state == Running)
+ if (d->state.valueBypassingBindings() == Running)
return;
d->deleteWhenStopped = policy;
d->setState(Running);
@@ -1403,7 +1402,7 @@ void QAbstractAnimation::stop()
{
Q_D(QAbstractAnimation);
- if (d->state == Stopped)
+ if (d->state.valueBypassingBindings() == Stopped)
return;
d->setState(Stopped);
@@ -1419,7 +1418,7 @@ void QAbstractAnimation::stop()
void QAbstractAnimation::pause()
{
Q_D(QAbstractAnimation);
- if (d->state == Stopped) {
+ if (d->state.valueBypassingBindings() == Stopped) {
qWarning("QAbstractAnimation::pause: Cannot pause a stopped animation");
return;
}
@@ -1437,7 +1436,7 @@ void QAbstractAnimation::pause()
void QAbstractAnimation::resume()
{
Q_D(QAbstractAnimation);
- if (d->state != Paused) {
+ if (d->state.valueBypassingBindings() != Paused) {
qWarning("QAbstractAnimation::resume: "
"Cannot resume an animation that is not paused");
return;
diff --git a/src/corelib/animation/qabstractanimation.h b/src/corelib/animation/qabstractanimation.h
index 3165c2b049..69a30556a3 100644
--- a/src/corelib/animation/qabstractanimation.h
+++ b/src/corelib/animation/qabstractanimation.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QABSTRACTANIMATION_H
#define QABSTRACTANIMATION_H
@@ -49,6 +13,7 @@ QT_BEGIN_NAMESPACE
class QAnimationGroup;
class QSequentialAnimationGroup;
class QAnimationDriver;
+class QUnifiedTimer;
class QAbstractAnimationPrivate;
class Q_CORE_EXPORT QAbstractAnimation : public QObject
diff --git a/src/corelib/animation/qabstractanimation_p.h b/src/corelib/animation/qabstractanimation_p.h
index 6b033de4c7..cb9042777a 100644
--- a/src/corelib/animation/qabstractanimation_p.h
+++ b/src/corelib/animation/qabstractanimation_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QABSTRACTANIMATION_P_H
#define QABSTRACTANIMATION_P_H
@@ -65,9 +29,10 @@ QT_BEGIN_NAMESPACE
class QAnimationGroup;
class QAbstractAnimation;
-class QAbstractAnimationPrivate : public QObjectPrivate
+class Q_CORE_EXPORT QAbstractAnimationPrivate : public QObjectPrivate
{
public:
+ QAbstractAnimationPrivate();
virtual ~QAbstractAnimationPrivate();
static QAbstractAnimationPrivate *get(QAbstractAnimation *q)
@@ -83,7 +48,7 @@ public:
{
q_func()->setDirection(direction);
}
- void emitDirectionChanged() { emit q_func()->directionChanged(direction); }
+ void emitDirectionChanged() { Q_EMIT q_func()->directionChanged(direction); }
Q_OBJECT_COMPAT_PROPERTY_WITH_ARGS(QAbstractAnimationPrivate, QAbstractAnimation::Direction,
direction, &QAbstractAnimationPrivate::setDirection,
&QAbstractAnimationPrivate::emitDirectionChanged,
@@ -96,7 +61,7 @@ public:
Q_OBJECT_BINDABLE_PROPERTY_WITH_ARGS(QAbstractAnimationPrivate, int, loopCount, 1)
- void emitCurrentLoopChanged() { emit q_func()->currentLoopChanged(currentLoop); }
+ void emitCurrentLoopChanged() { Q_EMIT q_func()->currentLoopChanged(currentLoop); }
Q_OBJECT_COMPAT_PROPERTY_WITH_ARGS(QAbstractAnimationPrivate, int, currentLoop, nullptr,
&QAbstractAnimationPrivate::emitCurrentLoopChanged, 0)
@@ -117,7 +82,10 @@ class QDefaultAnimationDriver : public QAnimationDriver
{
Q_OBJECT
public:
- QDefaultAnimationDriver(QUnifiedTimer *timer);
+ explicit QDefaultAnimationDriver(QUnifiedTimer *timer);
+ ~QDefaultAnimationDriver() override;
+
+protected:
void timerEvent(QTimerEvent *e) override;
private Q_SLOTS:
@@ -132,24 +100,27 @@ private:
class Q_CORE_EXPORT QAnimationDriverPrivate : public QObjectPrivate
{
public:
- QAnimationDriverPrivate() : running(false) {}
+ QAnimationDriverPrivate();
+ ~QAnimationDriverPrivate() override;
+
QElapsedTimer timer;
- bool running;
+ bool running = false;
};
class Q_CORE_EXPORT QAbstractAnimationTimer : public QObject
{
Q_OBJECT
public:
- QAbstractAnimationTimer() : isRegistered(false), isPaused(false), pauseDuration(0) {}
+ QAbstractAnimationTimer();
+ ~QAbstractAnimationTimer() override;
virtual void updateAnimationsTime(qint64 delta) = 0;
virtual void restartAnimationTimer() = 0;
virtual int runningAnimationCount() = 0;
- bool isRegistered;
- bool isPaused;
- int pauseDuration;
+ bool isRegistered = false;
+ bool isPaused = false;
+ int pauseDuration = 0;
};
class Q_CORE_EXPORT QUnifiedTimer : public QObject
@@ -159,6 +130,8 @@ private:
QUnifiedTimer();
public:
+ ~QUnifiedTimer() override;
+
static QUnifiedTimer *instance();
static QUnifiedTimer *instance(bool create);
@@ -250,6 +223,8 @@ private:
QAnimationTimer();
public:
+ ~QAnimationTimer() override;
+
static QAnimationTimer *instance();
static QAnimationTimer *instance(bool create);
@@ -272,7 +247,7 @@ public:
void updateAnimationsTime(qint64 delta) override;
//useful for profiling/debugging
- int runningAnimationCount() override { return animations.count(); }
+ int runningAnimationCount() override { return animations.size(); }
private Q_SLOTS:
void startAnimations();
diff --git a/src/corelib/animation/qanimationgroup.cpp b/src/corelib/animation/qanimationgroup.cpp
index f86e927e8c..d2572a7462 100644
--- a/src/corelib/animation/qanimationgroup.cpp
+++ b/src/corelib/animation/qanimationgroup.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
/*!
\class QAnimationGroup
@@ -174,7 +138,7 @@ int QAnimationGroup::indexOfAnimation(QAbstractAnimation *animation) const
void QAnimationGroup::addAnimation(QAbstractAnimation *animation)
{
Q_D(QAnimationGroup);
- insertAnimation(d->animations.count(), animation);
+ insertAnimation(d->animations.size(), animation);
}
/*!
@@ -222,7 +186,7 @@ void QAnimationGroup::removeAnimation(QAbstractAnimation *animation)
qWarning("QAnimationGroup::remove: cannot remove null animation");
return;
}
- int index = d->animations.indexOf(animation);
+ qsizetype index = d->animations.indexOf(animation);
if (index == -1) {
qWarning("QAnimationGroup::remove: animation is not part of this group");
return;
@@ -297,7 +261,7 @@ void QAnimationGroupPrivate::clear(bool onDestruction)
const QList<QAbstractAnimation *> animationsCopy = animations; // taking a copy
animations.clear();
// Clearing backwards so the indices doesn't change while we remove animations.
- for (int i = animationsCopy.count() - 1; i >= 0; --i) {
+ for (qsizetype i = animationsCopy.size() - 1; i >= 0; --i) {
QAbstractAnimation *animation = animationsCopy.at(i);
animation->setParent(nullptr);
QAbstractAnimationPrivate::get(animation)->group = nullptr;
@@ -311,7 +275,7 @@ void QAnimationGroupPrivate::clear(bool onDestruction)
}
}
-void QAnimationGroupPrivate::animationRemoved(int index, QAbstractAnimation *)
+void QAnimationGroupPrivate::animationRemoved(qsizetype index, QAbstractAnimation *)
{
Q_Q(QAnimationGroup);
Q_UNUSED(index);
diff --git a/src/corelib/animation/qanimationgroup.h b/src/corelib/animation/qanimationgroup.h
index 7c7666f251..412e2d442e 100644
--- a/src/corelib/animation/qanimationgroup.h
+++ b/src/corelib/animation/qanimationgroup.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QANIMATIONGROUP_H
#define QANIMATIONGROUP_H
diff --git a/src/corelib/animation/qanimationgroup_p.h b/src/corelib/animation/qanimationgroup_p.h
index 4d1d690e69..334f780968 100644
--- a/src/corelib/animation/qanimationgroup_p.h
+++ b/src/corelib/animation/qanimationgroup_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QANIMATIONGROUP_P_H
#define QANIMATIONGROUP_P_H
@@ -70,8 +34,8 @@ public:
isGroup = true;
}
- virtual void animationInsertedAt(int) { }
- virtual void animationRemoved(int, QAbstractAnimation *);
+ virtual void animationInsertedAt(qsizetype) { }
+ virtual void animationRemoved(qsizetype, QAbstractAnimation *);
void clear(bool onDestruction);
diff --git a/src/corelib/animation/qparallelanimationgroup.cpp b/src/corelib/animation/qparallelanimationgroup.cpp
index 492fb82e2b..cea22bcacb 100644
--- a/src/corelib/animation/qparallelanimationgroup.cpp
+++ b/src/corelib/animation/qparallelanimationgroup.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
/*!
\class QParallelAnimationGroup
@@ -291,7 +255,7 @@ bool QParallelAnimationGroupPrivate::isUncontrolledAnimationFinished(QAbstractAn
return uncontrolledFinishTime.value(anim, -1) >= 0;
}
-void QParallelAnimationGroupPrivate::animationRemoved(int index, QAbstractAnimation *anim)
+void QParallelAnimationGroupPrivate::animationRemoved(qsizetype index, QAbstractAnimation *anim)
{
QAnimationGroupPrivate::animationRemoved(index, anim);
disconnectUncontrolledAnimation(anim);
diff --git a/src/corelib/animation/qparallelanimationgroup.h b/src/corelib/animation/qparallelanimationgroup.h
index 683d933861..77bc6eabac 100644
--- a/src/corelib/animation/qparallelanimationgroup.h
+++ b/src/corelib/animation/qparallelanimationgroup.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QPARALLELANIMATIONGROUP_H
#define QPARALLELANIMATIONGROUP_H
diff --git a/src/corelib/animation/qparallelanimationgroup_p.h b/src/corelib/animation/qparallelanimationgroup_p.h
index fc8f809d5a..62c53d3609 100644
--- a/src/corelib/animation/qparallelanimationgroup_p.h
+++ b/src/corelib/animation/qparallelanimationgroup_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QPARALLELANIMATIONGROUP_P_H
#define QPARALLELANIMATIONGROUP_P_H
@@ -78,7 +42,7 @@ public:
void connectUncontrolledAnimations();
void disconnectUncontrolledAnimations();
- void animationRemoved(int index, QAbstractAnimation *) override;
+ void animationRemoved(qsizetype index, QAbstractAnimation *) override;
// private slot
void _q_uncontrolledAnimationFinished();
diff --git a/src/corelib/animation/qpauseanimation.cpp b/src/corelib/animation/qpauseanimation.cpp
index 04d8cca273..344b21946e 100644
--- a/src/corelib/animation/qpauseanimation.cpp
+++ b/src/corelib/animation/qpauseanimation.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
/*!
\class QPauseAnimation
@@ -130,11 +94,10 @@ void QPauseAnimation::setDuration(int msecs)
}
Q_D(QPauseAnimation);
- if (msecs != d->duration) {
- d->duration = msecs;
+ d->duration.removeBindingUnlessInWrapper();
+ if (msecs != d->duration.valueBypassingBindings()) {
+ d->duration.setValueBypassingBindings(msecs);
d->duration.notify();
- } else {
- d->duration.removeBindingUnlessInWrapper();
}
}
diff --git a/src/corelib/animation/qpauseanimation.h b/src/corelib/animation/qpauseanimation.h
index 1bbc52132d..f661459f83 100644
--- a/src/corelib/animation/qpauseanimation.h
+++ b/src/corelib/animation/qpauseanimation.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QPAUSEANIMATION_H
#define QPAUSEANIMATION_H
diff --git a/src/corelib/animation/qpropertyanimation.cpp b/src/corelib/animation/qpropertyanimation.cpp
index fe7ab0c070..d461668dbb 100644
--- a/src/corelib/animation/qpropertyanimation.cpp
+++ b/src/corelib/animation/qpropertyanimation.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
/*!
\class QPropertyAnimation
@@ -58,6 +22,10 @@
\snippet code/src_corelib_animation_qpropertyanimation.cpp 0
+ \note You can also control an animation's lifespan by choosing a
+ \l{QAbstractAnimation::DeletionPolicy}{delete policy} while starting the
+ animation.
+
The property name and the QObject instance of which property
should be animated are passed to the constructor. You can then
specify the start and end value of the property. The procedure is
@@ -85,13 +53,15 @@
#include "qpropertyanimation_p.h"
#include <QtCore/QMutex>
+#include <QtCore/QHash>
#include <QtCore/private/qlocking_p.h>
QT_BEGIN_NAMESPACE
void QPropertyAnimationPrivate::updateMetaProperty()
{
- if (!targetObject || propertyName.value().isEmpty()) {
+ const QObject *target = targetObject.valueBypassingBindings();
+ if (!target || propertyName.value().isEmpty()) {
propertyType = QMetaType::UnknownType;
propertyIndex = -1;
return;
@@ -99,19 +69,19 @@ void QPropertyAnimationPrivate::updateMetaProperty()
//propertyType will be set to a valid type only if there is a Q_PROPERTY
//otherwise it will be set to QVariant::Invalid at the end of this function
- propertyType = targetObject->property(propertyName.value()).userType();
- propertyIndex = targetObject->metaObject()->indexOfProperty(propertyName.value());
+ propertyType = target->property(propertyName.value()).userType();
+ propertyIndex = target->metaObject()->indexOfProperty(propertyName.value());
if (propertyType != QMetaType::UnknownType)
convertValues(propertyType);
if (propertyIndex == -1) {
//there is no Q_PROPERTY on the object
propertyType = QMetaType::UnknownType;
- if (!targetObject->dynamicPropertyNames().contains(propertyName))
+ if (!target->dynamicPropertyNames().contains(propertyName))
qWarning("QPropertyAnimation: you're trying to animate a non-existing property %s of "
"your QObject",
propertyName.value().constData());
- } else if (!targetObject->metaObject()->property(propertyIndex).isWritable()) {
+ } else if (!target->metaObject()->property(propertyIndex).isWritable()) {
qWarning("QPropertyAnimation: you're trying to animate the non-writable property %s of "
"your QObject",
propertyName.value().constData());
@@ -194,15 +164,16 @@ void QPropertyAnimation::setTargetObject(QObject *target)
}
d->targetObject.removeBindingUnlessInWrapper();
- if (d->targetObject == target)
+ const QObject *oldTarget = d->targetObject.valueBypassingBindings();
+ if (oldTarget == target)
return;
- if (d->targetObject != nullptr)
- QObject::disconnect(d->targetObject, &QObject::destroyed, this, nullptr);
+ if (oldTarget != nullptr)
+ QObject::disconnect(oldTarget, &QObject::destroyed, this, nullptr);
d->targetObject.setValueBypassingBindings(target);
- if (d->targetObject != nullptr) {
- QObject::connect(d->targetObject, &QObject::destroyed, this,
+ if (target != nullptr) {
+ QObject::connect(target, &QObject::destroyed, this,
[d] { d->targetObjectDestroyed(); });
}
d->updateMetaProperty();
@@ -232,7 +203,7 @@ void QPropertyAnimation::setPropertyName(const QByteArray &propertyName)
d->propertyName.removeBindingUnlessInWrapper();
- if (d->propertyName == propertyName)
+ if (d->propertyName.valueBypassingBindings() == propertyName)
return;
d->propertyName.setValueBypassingBindings(propertyName);
@@ -288,11 +259,11 @@ void QPropertyAnimation::updateState(QAbstractAnimation::State newState,
QPropertyAnimation *animToStop = nullptr;
{
- static QBasicMutex mutex;
+ Q_CONSTINIT static QBasicMutex mutex;
auto locker = qt_unique_lock(mutex);
- typedef QPair<QObject *, QByteArray> QPropertyAnimationPair;
+ using QPropertyAnimationPair = std::pair<QObject *, QByteArray>;
typedef QHash<QPropertyAnimationPair, QPropertyAnimation*> QPropertyAnimationHash;
- static QPropertyAnimationHash hash;
+ Q_CONSTINIT static QPropertyAnimationHash hash;
// in case the targetObject gets deleted, the following happens:
// 1. targetObject's destroyed signal calls our targetObjectDestroyed.
diff --git a/src/corelib/animation/qpropertyanimation.h b/src/corelib/animation/qpropertyanimation.h
index 0edd4d9b72..038c202b8f 100644
--- a/src/corelib/animation/qpropertyanimation.h
+++ b/src/corelib/animation/qpropertyanimation.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QPROPERTYANIMATION_H
#define QPROPERTYANIMATION_H
diff --git a/src/corelib/animation/qpropertyanimation_p.h b/src/corelib/animation/qpropertyanimation_p.h
index 2552fec088..9e41d4dc6d 100644
--- a/src/corelib/animation/qpropertyanimation_p.h
+++ b/src/corelib/animation/qpropertyanimation_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QPROPERTYANIMATION_P_H
#define QPROPERTYANIMATION_P_H
diff --git a/src/corelib/animation/qsequentialanimationgroup.cpp b/src/corelib/animation/qsequentialanimationgroup.cpp
index 7ce8658628..260481dbef 100644
--- a/src/corelib/animation/qsequentialanimationgroup.cpp
+++ b/src/corelib/animation/qsequentialanimationgroup.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
/*!
\class QSequentialAnimationGroup
@@ -208,7 +172,7 @@ void QSequentialAnimationGroupPrivate::rewindForwards(const AnimationIndex &newA
// we need to force activation because setCurrentAnimation will have no effect
activateCurrentAnimation();
else
- setCurrentAnimation(animations.count() - 1, true);
+ setCurrentAnimation(animations.size() - 1, true);
}
// and now we need to fast rewind from the current position to
@@ -432,7 +396,7 @@ void QSequentialAnimationGroupPrivate::setCurrentAnimation(int index, bool inter
// currentAnimation.removeBindingUnlessInWrapper()
// is not necessary here, since it is read only
- index = qMin(index, animations.count() - 1);
+ index = qMin(index, animations.size() - 1);
if (index == -1) {
Q_ASSERT(animations.isEmpty());
@@ -508,7 +472,7 @@ void QSequentialAnimationGroupPrivate::_q_uncontrolledAnimationFinished()
the group at index \a index.
Note: We only support insertion after the current animation
*/
-void QSequentialAnimationGroupPrivate::animationInsertedAt(int index)
+void QSequentialAnimationGroupPrivate::animationInsertedAt(qsizetype index)
{
if (currentAnimation == nullptr) {
setCurrentAnimation(0); // initialize the current animation
@@ -536,7 +500,7 @@ void QSequentialAnimationGroupPrivate::animationInsertedAt(int index)
the group at index \a index. The animation is no more listed when this
method is called.
*/
-void QSequentialAnimationGroupPrivate::animationRemoved(int index, QAbstractAnimation *anim)
+void QSequentialAnimationGroupPrivate::animationRemoved(qsizetype index, QAbstractAnimation *anim)
{
Q_Q(QSequentialAnimationGroup);
QAnimationGroupPrivate::animationRemoved(index, anim);
@@ -547,13 +511,13 @@ void QSequentialAnimationGroupPrivate::animationRemoved(int index, QAbstractAnim
if (actualDuration.size() > index)
actualDuration.removeAt(index);
- const int currentIndex = animations.indexOf(currentAnimation);
+ const qsizetype currentIndex = animations.indexOf(currentAnimation);
if (currentIndex == -1) {
//we're removing the current animation
disconnectUncontrolledAnimation(currentAnimation);
- if (index < animations.count())
+ if (index < animations.size())
setCurrentAnimation(index); //let's try to take the next one
else if (index > 0)
setCurrentAnimation(index - 1);
@@ -565,7 +529,7 @@ void QSequentialAnimationGroupPrivate::animationRemoved(int index, QAbstractAnim
// duration of the previous animations up to the current animation
currentTime = 0;
- for (int i = 0; i < currentAnimationIndex; ++i) {
+ for (qsizetype i = 0; i < currentAnimationIndex; ++i) {
const int current = animationActualTotalDuration(i);
currentTime += current;
}
diff --git a/src/corelib/animation/qsequentialanimationgroup.h b/src/corelib/animation/qsequentialanimationgroup.h
index 4b222069cf..6786078170 100644
--- a/src/corelib/animation/qsequentialanimationgroup.h
+++ b/src/corelib/animation/qsequentialanimationgroup.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QSEQUENTIALANIMATIONGROUP_H
#define QSEQUENTIALANIMATIONGROUP_H
diff --git a/src/corelib/animation/qsequentialanimationgroup_p.h b/src/corelib/animation/qsequentialanimationgroup_p.h
index 369856cb55..cbdf204d0a 100644
--- a/src/corelib/animation/qsequentialanimationgroup_p.h
+++ b/src/corelib/animation/qsequentialanimationgroup_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QSEQUENTIALANIMATIONGROUP_P_H
#define QSEQUENTIALANIMATIONGROUP_P_H
@@ -80,8 +44,8 @@ public:
void setCurrentAnimation(int index, bool intermediate = false);
void activateCurrentAnimation(bool intermediate = false);
- void animationInsertedAt(int index) override;
- void animationRemoved(int index, QAbstractAnimation *anim) override;
+ void animationInsertedAt(qsizetype index) override;
+ void animationRemoved(qsizetype index, QAbstractAnimation *anim) override;
bool atEnd() const;
diff --git a/src/corelib/animation/qvariantanimation.cpp b/src/corelib/animation/qvariantanimation.cpp
index a0f0e176b6..b4d47aae8f 100644
--- a/src/corelib/animation/qvariantanimation.cpp
+++ b/src/corelib/animation/qvariantanimation.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qvariantanimation.h"
#include "qvariantanimation_p.h"
@@ -192,7 +156,7 @@ void QVariantAnimationPrivate::convertValues(int t)
{
auto type = QMetaType(t);
//this ensures that all the keyValues are of type t
- for (int i = 0; i < keyValues.count(); ++i) {
+ for (int i = 0; i < keyValues.size(); ++i) {
QVariantAnimation::KeyValue &pair = keyValues[i];
pair.second.convert(type);
}
@@ -226,7 +190,7 @@ void QVariantAnimationPrivate::updateInterpolator()
void QVariantAnimationPrivate::recalculateCurrentInterval(bool force/*=false*/)
{
// can't interpolate if we don't have at least 2 values
- if ((keyValues.count() + (defaultStartEndValue.isValid() ? 1 : 0)) < 2)
+ if ((keyValues.size() + (defaultStartEndValue.isValid() ? 1 : 0)) < 2)
return;
const qreal endProgress = (direction == QAbstractAnimation::Forward) ? qreal(1) : qreal(0);
@@ -239,27 +203,27 @@ void QVariantAnimationPrivate::recalculateCurrentInterval(bool force/*=false*/)
//let's update currentInterval
QVariantAnimation::KeyValues::const_iterator it = std::lower_bound(keyValues.constBegin(),
keyValues.constEnd(),
- qMakePair(progress, QVariant()),
+ std::pair{progress, QVariant{}},
animationValueLessThan);
if (it == keyValues.constBegin()) {
//the item pointed to by it is the start element in the range
- if (it->first == 0 && keyValues.count() > 1) {
+ if (it->first == 0 && keyValues.size() > 1) {
currentInterval.start = *it;
currentInterval.end = *(it+1);
} else {
- currentInterval.start = qMakePair(qreal(0), defaultStartEndValue);
+ currentInterval.start = {qreal(0), defaultStartEndValue};
currentInterval.end = *it;
}
} else if (it == keyValues.constEnd()) {
--it; //position the iterator on the last item
- if (it->first == 1 && keyValues.count() > 1) {
+ if (it->first == 1 && keyValues.size() > 1) {
//we have an end value (item with progress = 1)
currentInterval.start = *(it-1);
currentInterval.end = *it;
} else {
//we use the default end value here
currentInterval.start = *it;
- currentInterval.end = qMakePair(qreal(1), defaultStartEndValue);
+ currentInterval.end = {qreal(1), defaultStartEndValue};
}
} else {
currentInterval.start = *(it-1);
@@ -278,14 +242,16 @@ void QVariantAnimationPrivate::setCurrentValueForProgress(const qreal progress)
const qreal startProgress = currentInterval.start.first;
const qreal endProgress = currentInterval.end.first;
- const qreal localProgress = (progress - startProgress) / (endProgress - startProgress);
+ const qreal localProgress =
+ qIsNull(progress - startProgress) ? 0.0 // avoid 0/0 below
+ /* else */ : (progress - startProgress) / (endProgress - startProgress);
QVariant ret = q->interpolated(currentInterval.start.second,
currentInterval.end.second,
localProgress);
qSwap(currentValue, ret);
q->updateCurrentValue(currentValue);
- static QBasicAtomicInt changedSignalIndex = Q_BASIC_ATOMIC_INITIALIZER(0);
+ Q_CONSTINIT static QBasicAtomicInt changedSignalIndex = Q_BASIC_ATOMIC_INITIALIZER(0);
if (!changedSignalIndex.loadRelaxed()) {
//we keep the mask so that we emit valueChanged only when needed (for performance reasons)
changedSignalIndex.testAndSetRelaxed(0, signalIndex("valueChanged(QVariant)"));
@@ -298,9 +264,10 @@ void QVariantAnimationPrivate::setCurrentValueForProgress(const qreal progress)
QVariant QVariantAnimationPrivate::valueAt(qreal step) const
{
- QVariantAnimation::KeyValues::const_iterator result =
- std::lower_bound(keyValues.constBegin(), keyValues.constEnd(), qMakePair(step, QVariant()), animationValueLessThan);
- if (result != keyValues.constEnd() && !animationValueLessThan(qMakePair(step, QVariant()), *result))
+ const auto sought = std::pair{step, QVariant()};
+ const auto result = std::lower_bound(keyValues.cbegin(), keyValues.cend(), sought,
+ animationValueLessThan);
+ if (result != keyValues.cend() && !animationValueLessThan(sought, *result))
return result->second;
return QVariant();
@@ -387,8 +354,9 @@ QEasingCurve QVariantAnimation::easingCurve() const
void QVariantAnimation::setEasingCurve(const QEasingCurve &easing)
{
Q_D(QVariantAnimation);
- const bool valueChanged = easing != d->easing;
- d->easing = easing;
+ d->easing.removeBindingUnlessInWrapper();
+ const bool valueChanged = easing != d->easing.valueBypassingBindings();
+ d->easing.setValueBypassingBindings(easing);
d->recalculateCurrentInterval();
if (valueChanged)
d->easing.notify();
@@ -402,7 +370,7 @@ QBindable<QEasingCurve> QVariantAnimation::bindableEasingCurve()
typedef QList<QVariantAnimation::Interpolator> QInterpolatorVector;
Q_GLOBAL_STATIC(QInterpolatorVector, registeredInterpolators)
-static QBasicMutex registeredInterpolatorsMutex;
+Q_CONSTINIT static QBasicMutex registeredInterpolatorsMutex;
/*!
\fn template <typename T> void qRegisterAnimationInterpolator(QVariant (*func)(const T &from, const T &to, qreal progress))
@@ -439,7 +407,7 @@ void QVariantAnimation::registerInterpolator(QVariantAnimation::Interpolator fun
// to continue causes the app to crash on exit with a SEGV
if (interpolators) {
const auto locker = qt_scoped_lock(registeredInterpolatorsMutex);
- if (interpolationType >= interpolators->count())
+ if (interpolationType >= interpolators->size())
interpolators->resize(interpolationType + 1);
interpolators->replace(interpolationType, func);
}
@@ -457,7 +425,7 @@ QVariantAnimation::Interpolator QVariantAnimationPrivate::getInterpolator(int in
QInterpolatorVector *interpolators = registeredInterpolators();
const auto locker = qt_scoped_lock(registeredInterpolatorsMutex);
QVariantAnimation::Interpolator ret = nullptr;
- if (interpolationType < interpolators->count()) {
+ if (interpolationType < interpolators->size()) {
ret = interpolators->at(interpolationType);
if (ret) return ret;
}
@@ -516,13 +484,12 @@ void QVariantAnimation::setDuration(int msecs)
qWarning("QVariantAnimation::setDuration: cannot set a negative duration");
return;
}
- if (d->duration == msecs) {
- d->duration.removeBindingUnlessInWrapper();
- return;
+ d->duration.removeBindingUnlessInWrapper();
+ if (d->duration.valueBypassingBindings() != msecs) {
+ d->duration.setValueBypassingBindings(msecs);
+ d->recalculateCurrentInterval();
+ d->duration.notify();
}
- d->duration = msecs;
- d->recalculateCurrentInterval();
- d->duration.notify();
}
QBindable<int> QVariantAnimation::bindableDuration()
@@ -586,7 +553,7 @@ QVariant QVariantAnimation::keyValueAt(qreal step) const
/*!
\typedef QVariantAnimation::KeyValue
- This is a typedef for QPair<qreal, QVariant>.
+ This is a typedef for std::pair<qreal, QVariant>.
*/
/*!
\typedef QVariantAnimation::KeyValues
diff --git a/src/corelib/animation/qvariantanimation.h b/src/corelib/animation/qvariantanimation.h
index a639a0b1f3..4bdb971357 100644
--- a/src/corelib/animation/qvariantanimation.h
+++ b/src/corelib/animation/qvariantanimation.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QVARIANTANIMATION_H
#define QVARIANTANIMATION_H
@@ -62,7 +26,7 @@ class Q_CORE_EXPORT QVariantAnimation : public QAbstractAnimation
BINDABLE bindableEasingCurve)
public:
- typedef QPair<qreal, QVariant> KeyValue;
+ using KeyValue = std::pair<qreal, QVariant>;
typedef QList<KeyValue> KeyValues;
QVariantAnimation(QObject *parent = nullptr);
diff --git a/src/corelib/animation/qvariantanimation_p.h b/src/corelib/animation/qvariantanimation_p.h
index a5013d97ad..85f996f7bd 100644
--- a/src/corelib/animation/qvariantanimation_p.h
+++ b/src/corelib/animation/qvariantanimation_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QVARIANTANIMATION_P_H
#define QVARIANTANIMATION_P_H
diff --git a/src/corelib/compat/removed_api.cpp b/src/corelib/compat/removed_api.cpp
index 566c7b608b..7d3d3b5bd6 100644
--- a/src/corelib/compat/removed_api.cpp
+++ b/src/corelib/compat/removed_api.cpp
@@ -1,49 +1,14 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#define QT_BUILD_REMOVED_API
+// Copyright (C) 2021 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#define QT_CORE_BUILD_REMOVED_API
#include "qglobal.h"
+#include "qnumeric.h"
QT_USE_NAMESPACE
-#if QT_REMOVED_SINCE(6, 1)
+#if QT_CORE_REMOVED_SINCE(6, 1)
#include "qmetatype.h"
@@ -58,9 +23,38 @@ int QMetaType::id() const
return 0;
}
-#endif // QT_REMOVED_SINCE(6, 1)
+#endif // QT_CORE_REMOVED_SINCE(6, 1)
+
+#if QT_CORE_REMOVED_SINCE(6, 2)
+
+#include "qbindingstorage.h"
+
+void QBindingStorage::maybeUpdateBindingAndRegister_helper(const QUntypedPropertyData *data) const
+{
+ registerDependency_helper(data);
+}
+
+#endif // QT_CORE_REMOVED_SINCE(6, 2)
+
+#if QT_CORE_REMOVED_SINCE(6, 3)
+
+#include "qbytearraymatcher.h"
+
+# if QT_POINTER_SIZE != 4
+
+int QStaticByteArrayMatcherBase::indexOfIn(const char *h, uint hl, const char *n, int nl, int from) const noexcept
+{
+ qsizetype r = indexOfIn(h, size_t(hl), n, qsizetype(nl), qsizetype(from));
+ Q_ASSERT(r == int(r));
+ return r;
+}
+
+# endif // QT_POINTER_SIZE != 4
-#if QT_REMOVED_SINCE(6, 3)
+qsizetype QByteArrayMatcher::indexIn(const QByteArray &ba, qsizetype from) const
+{
+ return indexIn(QByteArrayView{ba}, from); // ba.isNull() may be significant, so don't ignore it!
+}
#include "tools/qcryptographichash.h"
@@ -74,6 +68,23 @@ QByteArray QCryptographicHash::hash(const QByteArray &data, Algorithm method)
return hash(QByteArrayView{data}, method);
}
+#include "qdatastream.h"
+
+# ifndef QT_NO_DATASTREAM
+# include "qfloat16.h"
+
+QDataStream &QDataStream::operator>>(qfloat16 &f)
+{
+ return *this >> reinterpret_cast<qint16&>(f);
+}
+
+QDataStream &QDataStream::operator<<(qfloat16 f)
+{
+ return *this << reinterpret_cast<qint16&>(f);
+}
+
+# endif
+
#include "quuid.h"
QUuid::QUuid(const QString &text)
@@ -96,7 +107,7 @@ QUuid QUuid::fromString(QStringView string) noexcept
return fromString(QAnyStringView{string});
}
-QUuid QUuid::fromString(QLatin1String string) noexcept
+QUuid QUuid::fromString(QLatin1StringView string) noexcept
{
return fromString(QAnyStringView{string});
}
@@ -108,12 +119,988 @@ QUuid QUuid::fromRfc4122(const QByteArray &bytes)
#include "qbytearraylist.h"
+# if QT_POINTER_SIZE != 4
QByteArray QtPrivate::QByteArrayList_join(const QByteArrayList *that, const char *sep, int seplen)
{
- return QByteArrayList_join(that, {sep, seplen});
+ return QByteArrayList_join(that, sep, qsizetype(seplen));
+}
+# endif
+
+#include "qlocale.h"
+
+QString QLocale::languageToCode(Language language)
+{
+ return languageToCode(language, QLocale::AnyLanguageCode);
+}
+
+QLocale::Language QLocale::codeToLanguage(QStringView languageCode) noexcept
+{
+ return codeToLanguage(languageCode, QLocale::AnyLanguageCode);
}
+#include "qoperatingsystemversion.h"
+
+QOperatingSystemVersion QOperatingSystemVersion::current()
+{
+ return QOperatingSystemVersionBase::current();
+}
+
+QString QOperatingSystemVersion::name() const
+{
+ return QOperatingSystemVersionBase::name();
+}
+
+int QOperatingSystemVersion::compare(const QOperatingSystemVersion &v1,
+ const QOperatingSystemVersion &v2)
+{
+ return QOperatingSystemVersionBase::compare(v1, v2);
+}
+
+#include "qurl.h"
+
+QString QUrl::fromAce(const QByteArray &domain)
+{
+ return fromAce(domain, {});
+}
+
+QByteArray QUrl::toAce(const QString &domain)
+{
+ return toAce(domain, {});
+}
+
+#endif // QT_CORE_REMOVED_SINCE(6, 3)
+
+#if QT_CORE_REMOVED_SINCE(6, 4)
+
+#include "qbytearray.h" // uses QT_CORE_INLINE_SINCE
+
+#include "qcalendar.h"
+
+QCalendar::QCalendar(QStringView name)
+ : QCalendar(QAnyStringView{name}) {}
+
+QCalendar::QCalendar(QLatin1StringView name)
+ : QCalendar(QAnyStringView{name}) {}
+
+#include "qcollator.h" // inline function compare(ptr, n, ptr, n) (for MSVC)
+
+#include "qhashfunctions.h"
+
+size_t qHash(const QByteArray &key, size_t seed) noexcept
+{
+ return qHashBits(key.constData(), size_t(key.size()), seed);
+}
+
+size_t qHash(const QByteArrayView &key, size_t seed) noexcept
+{
+ return qHashBits(key.constData(), size_t(key.size()), seed);
+}
+
+#include "qobject.h"
+
+void QObject::setObjectName(const QString &name)
+{
+ setObjectName<void>(name);
+}
+
+#include "qlocale.h" // uses QT_CORE_INLINE_SINCE
+
+#if QT_CONFIG(settings)
+
+#include "qsettings.h"
+
+void QSettings::beginGroup(const QString &prefix)
+{
+ beginGroup(qToAnyStringViewIgnoringNull(prefix));
+}
+
+int QSettings::beginReadArray(const QString &prefix)
+{
+ return beginReadArray(qToAnyStringViewIgnoringNull(prefix));
+}
+
+void QSettings::beginWriteArray(const QString &prefix, int size)
+{
+ beginWriteArray(qToAnyStringViewIgnoringNull(prefix), size);
+}
+
+void QSettings::setValue(const QString &key, const QVariant &value)
+{
+ setValue(qToAnyStringViewIgnoringNull(key), value);
+}
+
+void QSettings::remove(const QString &key)
+{
+ remove(qToAnyStringViewIgnoringNull(key));
+}
+
+bool QSettings::contains(const QString &key) const
+{
+ return contains(qToAnyStringViewIgnoringNull(key));
+}
+
+QVariant QSettings::value(const QString &key, const QVariant &defaultValue) const
+{
+ return value(qToAnyStringViewIgnoringNull(key), defaultValue);
+}
+
+QVariant QSettings::value(const QString &key) const
+{
+ return value(qToAnyStringViewIgnoringNull(key));
+}
+
+#endif // QT_CONFIG(settings)
+
+#include "qversionnumber.h"
+
+QT_WARNING_PUSH
+QT_WARNING_DISABLE_DEPRECATED
+
+QVersionNumber QVersionNumber::fromString(const QString &string, int *suffixIndex)
+{
+ return fromString(qToAnyStringViewIgnoringNull(string), suffixIndex);
+}
+
+QVersionNumber QVersionNumber::fromString(QStringView string, int *suffixIndex)
+{
+ return fromString(QAnyStringView{string}, suffixIndex);
+}
+
+QVersionNumber QVersionNumber::fromString(QLatin1StringView string, int *suffixIndex)
+{
+ return fromString(QAnyStringView{string}, suffixIndex);
+}
+
+QT_WARNING_POP
+
// #include <qotherheader.h>
// // implement removed functions from qotherheader.h
+// order sections alphabetically to reduce chances of merge conflicts
+
+#endif // QT_CORE_REMOVED_SINCE(6, 4)
+
+#if QT_CORE_REMOVED_SINCE(6, 5)
+
+#include "qbasictimer.h" // inlined API
+
+#include "qbuffer.h" // inline removed API
+
+#include "qdir.h"
+
+uint QDir::count() const
+{
+ return uint(count(QT6_CALL_NEW_OVERLOAD));
+}
+
+#if QT_POINTER_SIZE != 4
+QString QDir::operator[](int i) const
+{
+ return operator[](qsizetype{i});
+}
+#endif
+
+#include "qtenvironmentvariables.h"
+
+bool qputenv(const char *varName, const QByteArray &value)
+{
+ return qputenv(varName, qToByteArrayViewIgnoringNull(value));
+}
+
+#include "qmetatype.h"
+
+int QMetaType::idHelper() const
+{
+ Q_ASSERT(d_ptr);
+ return registerHelper(d_ptr);
+}
+
+#if QT_CONFIG(sharedmemory)
+#include "qsharedmemory.h"
+
+void QSharedMemory::setNativeKey(const QString &key)
+{
+ setNativeKey(key, QNativeIpcKey::legacyDefaultTypeForOs());
+}
+#endif
+
+#include "qvariant.h"
+
+// these implementations aren't as efficient as they used to be prior to
+// replacement, but there's no way to call the ambiguous overload
+QVariant::QVariant(const QUuid &uuid) : QVariant(QVariant::fromValue(uuid)) {}
+#ifndef QT_NO_GEOM_VARIANT
+#include "qline.h"
+#include "qpoint.h"
+#include "qrect.h"
+#include "qsize.h"
+QVariant::QVariant(const QPoint &pt) : QVariant(QVariant::fromValue(pt)) {}
+QVariant::QVariant(const QPointF &pt) : QVariant(QVariant::fromValue(pt)) {}
+QVariant::QVariant(const QRect &r) : QVariant(QVariant::fromValue(r)) {}
+QVariant::QVariant(const QRectF &r) : QVariant(QVariant::fromValue(r)) {}
+QVariant::QVariant(const QLine &l) : QVariant(QVariant::fromValue(l)) {}
+QVariant::QVariant(const QLineF &l) : QVariant(QVariant::fromValue(l)) {}
+QVariant::QVariant(const QSize &s) : QVariant(QVariant::fromValue(s)) {}
+QVariant::QVariant(const QSizeF &s) : QVariant(QVariant::fromValue(s)) {}
+#endif
+
+#if QT_CONFIG(xmlstreamreader)
+
+#include "qxmlstream.h"
+
+QXmlStreamReader::QXmlStreamReader(const QByteArray &data)
+ : QXmlStreamReader(data, PrivateConstructorTag{})
+{
+}
+
+QXmlStreamReader::QXmlStreamReader(const QString &data)
+ : QXmlStreamReader(qToAnyStringViewIgnoringNull(data))
+{
+}
+
+QXmlStreamReader::QXmlStreamReader(const char *data)
+ : QXmlStreamReader(QAnyStringView(data))
+{
+}
+
+void QXmlStreamReader::addData(const QByteArray &data)
+{
+ addData<>(data);
+}
+void QXmlStreamReader::addData(const QString &data)
+{
+ addData(qToAnyStringViewIgnoringNull(data));
+}
+
+void QXmlStreamReader::addData(const char *data)
+{
+ addData(QAnyStringView(data));
+}
+
+#endif // QT_CONFIG(xmlstreamreader)
+
+#if QT_CONFIG(xmlstreamwriter)
+
+#include "qxmlstream.h"
+
+void QXmlStreamWriter::writeAttribute(const QString &qualifiedName, const QString &value)
+{
+ writeAttribute(qToAnyStringViewIgnoringNull(qualifiedName),
+ qToAnyStringViewIgnoringNull(value));
+}
+
+void QXmlStreamWriter::writeAttribute(const QString &namespaceUri, const QString &name, const QString &value)
+{
+ writeAttribute(qToAnyStringViewIgnoringNull(namespaceUri),
+ qToAnyStringViewIgnoringNull(name),
+ qToAnyStringViewIgnoringNull(value));
+}
+
+void QXmlStreamWriter::writeCDATA(const QString &text)
+{
+ writeCDATA(qToAnyStringViewIgnoringNull(text));
+}
+
+void QXmlStreamWriter::writeCharacters(const QString &text)
+{
+ writeCharacters(qToAnyStringViewIgnoringNull(text));
+}
+
+void QXmlStreamWriter::writeComment(const QString &text)
+{
+ writeComment(qToAnyStringViewIgnoringNull(text));
+}
+
+void QXmlStreamWriter::writeDTD(const QString &dtd)
+{
+ writeDTD(qToAnyStringViewIgnoringNull(dtd));
+}
+
+void QXmlStreamWriter::writeEmptyElement(const QString &qualifiedName)
+{
+ writeEmptyElement(qToAnyStringViewIgnoringNull(qualifiedName));
+}
+
+void QXmlStreamWriter::writeEmptyElement(const QString &namespaceUri, const QString &name)
+{
+ writeEmptyElement(qToAnyStringViewIgnoringNull(namespaceUri),
+ qToAnyStringViewIgnoringNull(name));
+}
+
+void QXmlStreamWriter::writeTextElement(const QString &qualifiedName, const QString &text)
+{
+ writeTextElement(qToAnyStringViewIgnoringNull(qualifiedName),
+ qToAnyStringViewIgnoringNull(text));
+}
+
+void QXmlStreamWriter::writeTextElement(const QString &namespaceUri, const QString &name, const QString &text)
+{
+ writeTextElement(qToAnyStringViewIgnoringNull(namespaceUri),
+ qToAnyStringViewIgnoringNull(name),
+ qToAnyStringViewIgnoringNull(text));
+}
+
+void QXmlStreamWriter::writeEntityReference(const QString &name)
+{
+ writeEntityReference(qToAnyStringViewIgnoringNull(name));
+}
+
+void QXmlStreamWriter::writeNamespace(const QString &namespaceUri, const QString &prefix)
+{
+ writeNamespace(qToAnyStringViewIgnoringNull(namespaceUri),
+ qToAnyStringViewIgnoringNull(prefix));
+}
+
+void QXmlStreamWriter::writeDefaultNamespace(const QString &namespaceUri)
+{
+ writeDefaultNamespace(qToAnyStringViewIgnoringNull(namespaceUri));
+}
+
+void QXmlStreamWriter::writeProcessingInstruction(const QString &target, const QString &data)
+{
+ writeProcessingInstruction(qToAnyStringViewIgnoringNull(target),
+ qToAnyStringViewIgnoringNull(data));
+}
+
+void QXmlStreamWriter::writeStartDocument(const QString &version)
+{
+ writeStartDocument(qToAnyStringViewIgnoringNull(version));
+}
+
+void QXmlStreamWriter::writeStartDocument(const QString &version, bool standalone)
+{
+ writeStartDocument(qToAnyStringViewIgnoringNull(version),
+ standalone);
+}
+
+void QXmlStreamWriter::writeStartElement(const QString &qualifiedName)
+{
+ writeStartElement(qToAnyStringViewIgnoringNull(qualifiedName));
+}
+
+void QXmlStreamWriter::writeStartElement(const QString &namespaceUri, const QString &name)
+{
+ writeStartElement(qToAnyStringViewIgnoringNull(namespaceUri),
+ qToAnyStringViewIgnoringNull(name));
+}
+
+#endif // QT_CONFIG(xmlstreamwriter)
+
+// inlined API
+#include "qfloat16.h"
+#include "qstring.h"
+
+// #include "qotherheader.h"
+// // implement removed functions from qotherheader.h
+// order sections alphabetically to reduce chances of merge conflicts
+
+#endif // QT_CORE_REMOVED_SINCE(6, 5)
+
+#if QT_CORE_REMOVED_SINCE(6, 6)
+
+#include "qmessageauthenticationcode.h"
+
+QMessageAuthenticationCode::QMessageAuthenticationCode(QCryptographicHash::Algorithm method,
+ const QByteArray &key)
+ : QMessageAuthenticationCode(method, qToByteArrayViewIgnoringNull(key)) {}
+
+void QMessageAuthenticationCode::setKey(const QByteArray &key)
+{
+ setKey(qToByteArrayViewIgnoringNull(key));
+}
+
+void QMessageAuthenticationCode::addData(const QByteArray &data)
+{
+ addData(qToByteArrayViewIgnoringNull(data));
+}
+
+QByteArray QMessageAuthenticationCode::hash(const QByteArray &msg, const QByteArray &key,
+ QCryptographicHash::Algorithm method)
+{
+ return hash(qToByteArrayViewIgnoringNull(msg),
+ qToByteArrayViewIgnoringNull(key), method);
+}
+
+#include "qobject.h" // inlined API
+
+#include "qrunnable.h"
+
+QRunnable *QRunnable::create(std::function<void()> functionToRun)
+{
+ return QRunnable::create<std::function<void()>>(std::move(functionToRun));
+}
+
+#include "qstring.h"
+
+qsizetype QString::toUcs4_helper(const ushort *uc, qsizetype length, uint *out)
+{
+ return toUcs4_helper(reinterpret_cast<const char16_t *>(uc), length,
+ reinterpret_cast<char32_t *>(out));
+}
+
+#if QT_CONFIG(thread)
+#include "qreadwritelock.h"
+
+bool QReadWriteLock::tryLockForRead()
+{
+ return tryLockForRead(0);
+}
+
+bool QReadWriteLock::tryLockForWrite()
+{
+ return tryLockForWrite(0);
+}
+
+#include "qthreadpool.h"
+#include "private/qthreadpool_p.h"
+
+void QThreadPool::start(std::function<void()> functionToRun, int priority)
+{
+ if (!functionToRun)
+ return;
+ start(QRunnable::create(std::move(functionToRun)), priority);
+}
+
+bool QThreadPool::tryStart(std::function<void()> functionToRun)
+{
+ if (!functionToRun)
+ return false;
+
+ Q_D(QThreadPool);
+ QMutexLocker locker(&d->mutex);
+ if (!d->allThreads.isEmpty() && d->areAllThreadsActive())
+ return false;
+
+ QRunnable *runnable = QRunnable::create(std::move(functionToRun));
+ if (d->tryStart(runnable))
+ return true;
+ delete runnable;
+ return false;
+}
+
+void QThreadPool::startOnReservedThread(std::function<void()> functionToRun)
+{
+ if (!functionToRun)
+ return releaseThread();
+
+ startOnReservedThread(QRunnable::create(std::move(functionToRun)));
+}
+
+#endif // QT_CONFIG(thread)
+
+#include "qxmlstream.h"
+
+QStringView QXmlStreamAttributes::value(const QString &namespaceUri, const QString &name) const
+{
+ return value(qToAnyStringViewIgnoringNull(namespaceUri), qToAnyStringViewIgnoringNull(name));
+}
+
+QStringView QXmlStreamAttributes::value(const QString &namespaceUri, QLatin1StringView name) const
+{
+ return value(qToAnyStringViewIgnoringNull(namespaceUri), QAnyStringView(name));
+}
+
+QStringView QXmlStreamAttributes::value(QLatin1StringView namespaceUri, QLatin1StringView name) const
+{
+ return value(QAnyStringView(namespaceUri), QAnyStringView(name));
+}
+
+QStringView QXmlStreamAttributes::value(const QString &qualifiedName) const
+{
+ return value(qToAnyStringViewIgnoringNull(qualifiedName));
+}
+
+QStringView QXmlStreamAttributes::value(QLatin1StringView qualifiedName) const
+{
+ return value(QAnyStringView(qualifiedName));
+}
+
+// inlined API
+#if QT_CONFIG(thread)
+#include "qmutex.h"
+#include "qreadwritelock.h"
+#include "qsemaphore.h"
+#endif
+
+// #include "qotherheader.h"
+// // implement removed functions from qotherheader.h
+// order sections alphabetically to reduce chances of merge conflicts
+
+#endif // QT_CORE_REMOVED_SINCE(6, 6)
+
+#if QT_CORE_REMOVED_SINCE(6, 7)
+
+#include "qbitarray.h"
+
+QBitArray QBitArray::operator~() const
+{
+ return QBitArray(*this).inverted_inplace();
+}
+
+#include "qbytearray.h" // also includes inlined API
+
+QByteArray QByteArray::left(qsizetype len) const
+{
+ if (len >= size())
+ return *this;
+ if (len < 0)
+ len = 0;
+ return QByteArray(data(), len);
+}
+
+QByteArray QByteArray::right(qsizetype len) const
+{
+ if (len >= size())
+ return *this;
+ if (len < 0)
+ len = 0;
+ return QByteArray(end() - len, len);
+}
+
+QByteArray QByteArray::mid(qsizetype pos, qsizetype len) const
+{
+ qsizetype p = pos;
+ qsizetype l = len;
+ using namespace QtPrivate;
+ switch (QContainerImplHelper::mid(size(), &p, &l)) {
+ case QContainerImplHelper::Null:
+ return QByteArray();
+ case QContainerImplHelper::Empty:
+ {
+ return QByteArray(DataPointer::fromRawData(&_empty, 0));
+ }
+ case QContainerImplHelper::Full:
+ return *this;
+ case QContainerImplHelper::Subset:
+ return QByteArray(d.data() + p, l);
+ }
+ Q_UNREACHABLE_RETURN(QByteArray());
+}
+
+#ifdef Q_CC_MSVC
+// previously inline methods, only needed for MSVC compat
+QByteArray QByteArray::first(qsizetype n) const
+{ return sliced(0, n); }
+QByteArray QByteArray::last(qsizetype n) const
+{ return sliced(size() - n, n); }
+QByteArray QByteArray::sliced(qsizetype pos) const
+{ return sliced(pos, size() - pos); }
+QByteArray QByteArray::sliced(qsizetype pos, qsizetype n) const
+{ verify(pos, n); return QByteArray(d.data() + pos, n); }
+QByteArray QByteArray::chopped(qsizetype n) const
+{ return sliced(0, size() - n); }
+#endif
+
+#include "qcborstreamreader.h"
+
+QCborError QCborStreamReader::lastError()
+{
+ return std::as_const(*this).lastError();
+}
+
+#include "qdatetime.h"
+
+QDateTime::QDateTime(QDate date, QTime time, const QTimeZone &timeZone)
+ : QDateTime(date, time, timeZone, TransitionResolution::LegacyBehavior) {}
+QDateTime::QDateTime(QDate date, QTime time)
+ : QDateTime(date, time, TransitionResolution::LegacyBehavior) {}
+void QDateTime::setDate(QDate date) { setDate(date, TransitionResolution::LegacyBehavior); }
+void QDateTime::setTime(QTime time) { setTime(time, TransitionResolution::LegacyBehavior); }
+void QDateTime::setTimeZone(const QTimeZone &toZone)
+{
+ setTimeZone(toZone, TransitionResolution::LegacyBehavior);
+}
+
+bool QDateTime::precedes(const QDateTime &other) const
+{
+ return compareThreeWay(*this, other) < 0;
+}
+
+#include "qdatastream.h"
+
+QDataStream &QDataStream::writeBytes(const char *s, uint len)
+{
+ return writeBytes(s, qint64(len));
+}
+
+int QDataStream::skipRawData(int len)
+{
+ return int(skipRawData(qint64(len)));
+}
+
+int QDataStream::readBlock(char *data, int len)
+{
+ return int(readBlock(data, qint64(len)));
+}
+
+int QDataStream::readRawData(char *s, int len)
+{
+ return int(readRawData(s, qint64(len)));
+}
+
+int QDataStream::writeRawData(const char *s, int len)
+{
+ return writeRawData(s, qint64(len));
+}
+
+#if defined(Q_OS_ANDROID)
+
+#include "qjniobject.h"
+
+jclass QJniObject::loadClass(const QByteArray &className, JNIEnv *env, bool /*binEncoded*/)
+{
+ return QJniObject::loadClass(className, env);
+}
+
+QByteArray QJniObject::toBinaryEncClassName(const QByteArray &className)
+{
+ return QByteArray(className).replace('/', '.');
+}
+
+void QJniObject::callVoidMethodV(JNIEnv *env, jmethodID id, va_list args) const
+{
+ env->CallVoidMethodV(javaObject(), id, args);
+}
+
+#endif // Q_OS_ANDROID
+
+#include "qlocale.h"
+
+QStringList QLocale::uiLanguages() const
+{
+ return uiLanguages(TagSeparator::Dash);
+}
+
+QString QLocale::name() const
+{
+ return name(TagSeparator::Underscore);
+}
+
+QString QLocale::bcp47Name() const
+{
+ return bcp47Name(TagSeparator::Dash);
+}
+
+QDate QLocale::toDate(const QString &string, FormatType format) const
+{
+ return toDate(string, dateFormat(format), DefaultTwoDigitBaseYear);
+}
+
+QDate QLocale::toDate(const QString &string, FormatType format, QCalendar cal) const
+{
+ return toDate(string, dateFormat(format), cal, DefaultTwoDigitBaseYear);
+}
+
+QDateTime QLocale::toDateTime(const QString &string, FormatType format) const
+{
+ return toDateTime(string, dateTimeFormat(format), DefaultTwoDigitBaseYear);
+}
+
+QDateTime QLocale::toDateTime(const QString &string, FormatType format, QCalendar cal) const
+{
+ return toDateTime(string, dateTimeFormat(format), cal, DefaultTwoDigitBaseYear);
+}
+
+QDate QLocale::toDate(const QString &string, const QString &format) const
+{
+ return toDate(string, format, QCalendar(), DefaultTwoDigitBaseYear);
+}
+
+QDate QLocale::toDate(const QString &string, const QString &format, QCalendar cal) const
+{
+ return toDate(string, format, cal, DefaultTwoDigitBaseYear);
+}
+
+QDateTime QLocale::toDateTime(const QString &string, const QString &format) const
+{
+ return toDateTime(string, format, QCalendar(), DefaultTwoDigitBaseYear);
+}
+
+QDateTime QLocale::toDateTime(const QString &string, const QString &format, QCalendar cal) const
+{
+ return toDateTime(string, format, cal, DefaultTwoDigitBaseYear);
+}
+
+#include "qobject.h"
+
+void qt_qFindChildren_helper(const QObject *parent, const QMetaObject &mo,
+ QList<void*> *list, Qt::FindChildOptions options)
+{
+ qt_qFindChildren_helper(parent, QAnyStringView(), mo, list, options);
+}
+
+void qt_qFindChildren_helper(const QObject *parent, const QString &name, const QMetaObject &mo,
+ QList<void*> *list, Qt::FindChildOptions options)
+{
+ qt_qFindChildren_helper(parent, QAnyStringView{name}, mo, list, options);
+}
+
+QObject *qt_qFindChild_helper(const QObject *parent, const QString &name, const QMetaObject &mo,
+ Qt::FindChildOptions options)
+{
+ return qt_qFindChild_helper(parent, QAnyStringView{name}, mo, options);
+}
+
+void QObject::moveToThread(QThread *targetThread)
+{
+ moveToThread(targetThread, QT6_CALL_NEW_OVERLOAD);
+}
+
+#include "qobjectdefs.h"
+
+bool QMetaObject::invokeMethodImpl(QObject *object, QtPrivate::QSlotObjectBase *slot, Qt::ConnectionType type, void *ret)
+{
+ return invokeMethodImpl(object, slot, type, 1, &ret, nullptr, nullptr);
+}
+
+#include "qstring.h"
+
+QString QString::left(qsizetype n) const
+{
+ if (size_t(n) >= size_t(size()))
+ return *this;
+ return QString((const QChar*) d.data(), n);
+}
+
+QString QString::right(qsizetype n) const
+{
+ if (size_t(n) >= size_t(size()))
+ return *this;
+ return QString(constData() + size() - n, n);
+}
+
+QString QString::mid(qsizetype position, qsizetype n) const
+{
+ qsizetype p = position;
+ qsizetype l = n;
+ using namespace QtPrivate;
+ switch (QContainerImplHelper::mid(size(), &p, &l)) {
+ case QContainerImplHelper::Null:
+ return QString();
+ case QContainerImplHelper::Empty:
+ return QString(DataPointer::fromRawData(&_empty, 0));
+ case QContainerImplHelper::Full:
+ return *this;
+ case QContainerImplHelper::Subset:
+ return QString(constData() + p, l);
+ }
+ Q_UNREACHABLE_RETURN(QString());
+}
+
+#ifdef Q_CC_MSVC
+// previously inline methods, only needed for MSVC compat
+QString QString::first(qsizetype n) const
+{ return sliced(0, n); }
+QString QString::last(qsizetype n) const
+{ return sliced(size() - n, n); }
+QString QString::sliced(qsizetype pos) const
+{ return sliced(pos, size() - pos); }
+QString QString::sliced(qsizetype pos, qsizetype n) const
+{ verify(pos, n); return QString(begin() + pos, n); }
+QString QString::chopped(qsizetype n) const
+{ return sliced(0, size() - n); }
+#endif
+
+#include "qtimezone.h"
+
+bool QTimeZone::operator==(const QTimeZone &other) const
+{
+ return comparesEqual(*this, other);
+}
+
+bool QTimeZone::operator!=(const QTimeZone &other) const
+{
+ return !comparesEqual(*this, other);
+}
+
+#include "qurl.h"
+
+QUrl QUrl::fromEncoded(const QByteArray &input, ParsingMode mode)
+{
+ return QUrl::fromEncoded(QByteArrayView(input), mode);
+}
+
+#include "qtimer.h" // inlined API
+
+
+// #include "qotherheader.h"
+// // implement removed functions from qotherheader.h
+// order sections alphabetically to reduce chances of merge conflicts
+
+#endif // QT_CORE_REMOVED_SINCE(6, 7)
+
+#if QT_CORE_REMOVED_SINCE(6, 8)
+#include "qbitarray.h" // inlined API
+
+#include "qbytearray.h" // inlined API
+
+#include "qcborarray.h" // inlined API
+
+#include "qcbormap.h" // inlined API
+
+#include "qcborvalue.h" // inlined API
+
+#include "qdatastream.h" // inlined API
+
+QDataStream &QDataStream::operator<<(bool i)
+{
+ return (*this << qint8(i));
+}
+
+#include "qdir.h" // inlined API
+
+bool QDir::operator==(const QDir &dir) const
+{
+ return comparesEqual(*this, dir);
+}
+
+#include "qfileinfo.h" // inlined API
+
+bool QFileInfo::operator==(const QFileInfo &fileinfo) const
+{
+ return comparesEqual(*this, fileinfo);
+}
+
+#include "qitemselectionmodel.h" // inlined API
+
+#include "qjsonarray.h"
+
+bool QJsonArray::operator==(const QJsonArray &other) const
+{
+ return comparesEqual(*this, other);
+}
+
+bool QJsonArray::operator!=(const QJsonArray &other) const
+{
+ return !comparesEqual(*this, other);
+}
+
+#include "qjsondocument.h"
+
+bool QJsonDocument::operator==(const QJsonDocument &other) const
+{
+ return comparesEqual(*this, other);
+}
+
+#include "qjsonobject.h"
+
+bool QJsonObject::operator==(const QJsonObject &other) const
+{
+ return comparesEqual(*this, other);
+}
+
+
+bool QJsonObject::operator!=(const QJsonObject &other) const
+{
+ return !comparesEqual(*this, other);
+}
+
+#include "qjsonvalue.h"
+
+bool QJsonValue::operator==(const QJsonValue &other) const
+{
+ return comparesEqual(*this, other);
+}
+
+bool QJsonValue::operator!=(const QJsonValue &other) const
+{
+ return !comparesEqual(*this, other);
+}
+
+#include "qmimetype.h"
+
+bool QMimeType::operator==(const QMimeType &other) const
+{
+ return comparesEqual(*this, other);
+}
+
+#include "qobject.h"
+
+int QObject::startTimer(std::chrono::milliseconds time, Qt::TimerType timerType)
+{
+ using namespace std::chrono;
+ using ratio = std::ratio_divide<std::milli, std::nano>;
+ nanoseconds::rep r;
+ if (qMulOverflow<ratio::num>(time.count(), &r)) {
+ qWarning("QObject::startTimer(std::chrono::milliseconds): "
+ "'time' arg overflowed when converted to nanoseconds.");
+ r = nanoseconds::max().count();
+ }
+ return startTimer(nanoseconds{r}, timerType);
+}
+
+#if QT_CONFIG(processenvironment)
+#include "qprocess.h" // inlined API
+
+bool QProcessEnvironment::operator==(const QProcessEnvironment &other) const
+{
+ return comparesEqual(*this, other);
+}
+#endif // QT_CONFIG(processenvironment)
+
+#if QT_CONFIG(regularexpression)
+#include "qregularexpression.h"
+
+bool QRegularExpressionMatch::hasCaptured(QStringView name) const
+{
+ return hasCaptured(QAnyStringView(name));
+}
+
+QString QRegularExpressionMatch::captured(QStringView name) const
+{
+ return captured(QAnyStringView(name));
+}
+
+QStringView QRegularExpressionMatch::capturedView(QStringView name) const
+{
+ return capturedView(QAnyStringView(name));
+}
+
+qsizetype QRegularExpressionMatch::capturedStart(QStringView name) const
+{
+ return capturedStart(QAnyStringView(name));
+}
+
+qsizetype QRegularExpressionMatch::capturedLength(QStringView name) const
+{
+ return capturedLength(QAnyStringView(name));
+}
+
+qsizetype QRegularExpressionMatch::capturedEnd(QStringView name) const
+{
+ return capturedEnd(QAnyStringView(name));
+}
+#endif // QT_CONFIG(regularexpression)
+
+#include "qurl.h"
+
+bool QUrl::operator<(const QUrl &url) const
+{
+ return is_lt(compareThreeWay(*this, url));
+}
+
+bool QUrl::operator==(const QUrl &url) const
+{
+ return comparesEqual(*this, url);
+}
+
+bool QUrl::operator!=(const QUrl &url) const
+{
+ return !comparesEqual(*this, url);
+}
+
+#include "qurlquery.h"
+
+bool QUrlQuery::operator==(const QUrlQuery &other) const
+{
+ return comparesEqual(*this, other);
+}
+
+#include "qstring.h" // inlined API
+
+#include "qxmlstream.h" // inlined API
+
+// #include "qotherheader.h"
+// // implement removed functions from qotherheader.h
+// order sections alphabetically to reduce chances of merge conflicts
-#endif // QT_REMOVED_SINCE(6, 3)
+#endif // QT_CORE_REMOVED_SINCE(6, 8)
diff --git a/src/corelib/configure.cmake b/src/corelib/configure.cmake
index 08d1e0d976..80e6d93193 100644
--- a/src/corelib/configure.cmake
+++ b/src/corelib/configure.cmake
@@ -1,3 +1,6 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+
#### Inputs
@@ -14,12 +17,18 @@ set_property(CACHE INPUT_libb2 PROPERTY STRINGS undefined no qt system)
#### Libraries
-if((UNIX) OR QT_FIND_ALL_PACKAGES_ALWAYS)
+if((UNIX AND NOT QNX) OR QT_FIND_ALL_PACKAGES_ALWAYS)
+ # QNX's libbacktrace has an API wholly different from all the other Unix
+ # offerings
qt_find_package(WrapBacktrace PROVIDED_TARGETS WrapBacktrace::WrapBacktrace MODULE_NAME core QMAKE_LIB backtrace)
endif()
-qt_find_package(WrapDoubleConversion PROVIDED_TARGETS WrapDoubleConversion::WrapDoubleConversion MODULE_NAME core QMAKE_LIB doubleconversion)
+qt_find_package(WrapSystemDoubleConversion
+ PROVIDED_TARGETS WrapSystemDoubleConversion::WrapSystemDoubleConversion
+ MODULE_NAME core QMAKE_LIB doubleconversion)
qt_find_package(GLIB2 PROVIDED_TARGETS GLIB2::GLIB2 MODULE_NAME core QMAKE_LIB glib)
-qt_find_package(ICU COMPONENTS i18n uc data PROVIDED_TARGETS ICU::i18n ICU::uc ICU::data MODULE_NAME core QMAKE_LIB icu)
+qt_find_package(ICU 50.1 COMPONENTS i18n uc data PROVIDED_TARGETS ICU::i18n ICU::uc ICU::data
+ MODULE_NAME core QMAKE_LIB icu)
+
if(QT_FEATURE_dlopen)
qt_add_qmake_lib_dependency(icu libdl)
endif()
@@ -27,8 +36,6 @@ qt_find_package(Libsystemd PROVIDED_TARGETS PkgConfig::Libsystemd MODULE_NAME co
qt_find_package(WrapAtomic PROVIDED_TARGETS WrapAtomic::WrapAtomic MODULE_NAME core QMAKE_LIB libatomic)
qt_find_package(Libb2 PROVIDED_TARGETS Libb2::Libb2 MODULE_NAME core QMAKE_LIB libb2)
qt_find_package(WrapRt PROVIDED_TARGETS WrapRt::WrapRt MODULE_NAME core QMAKE_LIB librt)
-qt_find_package(LTTngUST PROVIDED_TARGETS LTTng::UST MODULE_NAME core QMAKE_LIB lttng-ust)
-qt_add_qmake_lib_dependency(lttng-ust libdl)
qt_find_package(WrapSystemPCRE2 10.20 PROVIDED_TARGETS WrapSystemPCRE2::WrapSystemPCRE2 MODULE_NAME core QMAKE_LIB pcre2)
set_package_properties(WrapPCRE2 PROPERTIES TYPE REQUIRED)
if((QNX) OR QT_FIND_ALL_PACKAGES_ALWAYS)
@@ -91,6 +98,18 @@ clock_gettime(CLOCK_MONOTONIC, &ts);
}
")
+# close_range
+qt_config_compile_test(close_range
+ LABEL "close_range()"
+ CODE
+"#include <unistd.h>
+
+int main()
+{
+ return close_range(3, 1024, 0) != 0;
+}
+")
+
# cloexec
qt_config_compile_test(cloexec
LABEL "O_CLOEXEC"
@@ -118,66 +137,6 @@ int pipes[2];
}
")
-# special case begin
-# cxx11_future
-if (UNIX AND NOT ANDROID AND NOT QNX AND NOT INTEGRITY)
- set(cxx11_future_TEST_LIBRARIES pthread)
-endif()
-qt_config_compile_test(cxx11_future
- LABEL "C++11 <future>"
- LIBRARIES
- "${cxx11_future_TEST_LIBRARIES}"
- CODE
-"#include <future>
-
-int main(void)
-{
- /* BEGIN TEST: */
-std::future<int> f = std::async([]() { return 42; });
-(void)f.get();
- /* END TEST: */
- return 0;
-}
-")
-# special case end
-
-# cxx11_random
-qt_config_compile_test(cxx11_random
- LABEL "C++11 <random>"
- CODE
-"#include <random>
-
-int main(void)
-{
- /* BEGIN TEST: */
-std::mt19937 mt(0);
- /* END TEST: */
- return 0;
-}
-")
-
-# cxx17_bm_searcher
-qt_config_compile_test(cxx17_bm_searcher
- LABEL "C++17 boyer_moore_searcher"
- CODE
-"#include <algorithm>
-#include <functional>
-
-int main(void)
-{
- /* BEGIN TEST: */
-const char haystack[] = \"hello\";
-const char needle[] = \"e\";
-const auto it =
-std::search(haystack + 0, haystack + std::size(haystack),
-std::boyer_moore_searcher(needle + 0, needle + std::size(needle)));
-(void)it;
- /* END TEST: */
- return 0;
-}
-"# FIXME: qmake: CONFIG += c++17
-)
-
# cxx17_filesystem
qt_config_compile_test(cxx17_filesystem
LABEL "C++17 <filesystem>"
@@ -193,26 +152,25 @@ std::filesystem::copy(
/* END TEST: */
return 0;
}
-"# FIXME: qmake: CONFIG += c++17
+"
)
-# eventfd
-qt_config_compile_test(eventfd
- LABEL "eventfd"
+# dladdr
+qt_config_compile_test(dladdr
+ LABEL "dladdr"
+ LIBRARIES
+ dl
CODE
-"#include <sys/eventfd.h>
-
+"#define _GNU_SOURCE 1
+#include <dlfcn.h>
+int i = 0;
int main(void)
{
- /* BEGIN TEST: */
-eventfd_t value;
-int fd = eventfd(0, EFD_CLOEXEC);
-eventfd_read(fd, &value);
-eventfd_write(fd, value);
- /* END TEST: */
+ Dl_info info;
+ dladdr(&i, &info);
return 0;
-}
-")
+}"
+)
# futimens
qt_config_compile_test(futimens
@@ -227,22 +185,6 @@ futimens(-1, 0);
/* END TEST: */
return 0;
}
-"# FIXME: qmake: ["# Block futimens() on Apple platforms unless it's available on ALL", '# deployment targets. This simplifies the logic at the call site', "# dramatically, as it isn't strictly needed compared to futimes().", 'darwin: QMAKE_CXXFLAGS += -Werror=unguarded-availability -Werror=unguarded-availability-new', 'CONFIG += warn_on']
-)
-
-# futimes
-qt_config_compile_test(futimes
- LABEL "futimes()"
- CODE
-"#include <sys/time.h>
-
-int main(void)
-{
- /* BEGIN TEST: */
-futimes(-1, 0);
- /* END TEST: */
- return 0;
-}
")
# getauxval
@@ -265,6 +207,9 @@ qt_config_compile_test(getentropy
LABEL "getentropy()"
CODE
"#include <unistd.h>
+#if __has_include(<sys/random.h>)
+# include <sys/random.h>
+#endif
int main(void)
{
@@ -276,81 +221,88 @@ char buf[32];
}
")
-# glibc
-qt_config_compile_test(glibc
- LABEL "GNU libc"
+# inotify
+qt_config_compile_test(inotify
+ LABEL "inotify"
CODE
-"#include <stdlib.h>
+"#include <sys/inotify.h>
int main(void)
{
/* BEGIN TEST: */
-return __GLIBC__;
+inotify_init();
+inotify_add_watch(0, \"foobar\", IN_ACCESS);
+inotify_rm_watch(0, 1);
/* END TEST: */
return 0;
}
")
-# inotify
-qt_config_compile_test(inotify
- LABEL "inotify"
+qt_config_compile_test(sysv_shm
+ LABEL "System V/XSI shared memory"
CODE
-"#include <sys/inotify.h>
+"#include <sys/types.h>
+#include <sys/ipc.h>
+#include <sys/shm.h>
+#include <fcntl.h>
int main(void)
{
- /* BEGIN TEST: */
-inotify_init();
-inotify_add_watch(0, \"foobar\", IN_ACCESS);
-inotify_rm_watch(0, 1);
- /* END TEST: */
+ key_t unix_key = ftok(\"test\", 'Q');
+ shmget(unix_key, 0, 0666 | IPC_CREAT | IPC_EXCL);
+ shmctl(0, 0, (struct shmid_ds *)(0));
return 0;
}
")
-# ipc_sysv
-qt_config_compile_test(ipc_sysv
- LABEL "SysV IPC"
+qt_config_compile_test(sysv_sem
+ LABEL "System V/XSI semaphores"
CODE
"#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
-#include <sys/shm.h>
#include <fcntl.h>
int main(void)
{
- /* BEGIN TEST: */
-key_t unix_key = ftok(\"test\", 'Q');
-semctl(semget(unix_key, 1, 0666 | IPC_CREAT | IPC_EXCL), 0, IPC_RMID, 0);
-shmget(unix_key, 0, 0666 | IPC_CREAT | IPC_EXCL);
-shmctl(0, 0, (struct shmid_ds *)(0));
- /* END TEST: */
+ key_t unix_key = ftok(\"test\", 'Q');
+ semctl(semget(unix_key, 1, 0666 | IPC_CREAT | IPC_EXCL), 0, IPC_RMID, 0);
return 0;
}
")
-# ipc_posix
if (LINUX)
- set(ipc_posix_TEST_LIBRARIES pthread rt)
+ set(ipc_posix_TEST_LIBRARIES pthread WrapRt::WrapRt)
endif()
-qt_config_compile_test(ipc_posix
- LABEL "POSIX IPC"
+qt_config_compile_test(posix_shm
+ LABEL "POSIX shared memory"
LIBRARIES
"${ipc_posix_TEST_LIBRARIES}"
CODE
"#include <sys/types.h>
#include <sys/mman.h>
+#include <fcntl.h>
+
+int main(void)
+{
+ shm_open(\"test\", O_RDWR | O_CREAT | O_EXCL, 0666);
+ shm_unlink(\"test\");
+ return 0;
+}
+")
+
+qt_config_compile_test(posix_sem
+ LABEL "POSIX semaphores"
+ LIBRARIES
+ "${ipc_posix_TEST_LIBRARIES}"
+ CODE
+"#include <sys/types.h>
#include <semaphore.h>
#include <fcntl.h>
int main(void)
{
- /* BEGIN TEST: */
-sem_close(sem_open(\"test\", O_CREAT | O_EXCL, 0666, 0));
-shm_open(\"test\", O_RDWR | O_CREAT | O_EXCL, 0666);
-shm_unlink(\"test\");
- /* END TEST: */
+ sem_close(sem_open(\"test\", O_CREAT | O_EXCL, 0666, 0));
return 0;
}
")
@@ -435,7 +387,7 @@ qt_config_compile_test(renameat2
#include <fcntl.h>
#include <stdio.h>
-int main(void)
+int main(int, char **argv)
{
/* BEGIN TEST: */
renameat2(AT_FDCWD, argv[1], AT_FDCWD, argv[2], RENAME_NOREPLACE | RENAME_WHITEOUT);
@@ -444,78 +396,40 @@ renameat2(AT_FDCWD, argv[1], AT_FDCWD, argv[2], RENAME_NOREPLACE | RENAME_WHITEO
}
")
-# statx
-qt_config_compile_test(statx
- LABEL "statx() in libc"
- CODE
-"#define _ATFILE_SOURCE 1
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <unistd.h>
-#include <fcntl.h>
-
-int main(void)
-{
- /* BEGIN TEST: */
-struct statx statxbuf;
-unsigned int mask = STATX_BASIC_STATS;
-return statx(AT_FDCWD, \"\", AT_STATX_SYNC_AS_STAT, mask, &statxbuf);
- /* END TEST: */
- return 0;
-}
-")
-
-# syslog
-qt_config_compile_test(syslog
- LABEL "syslog"
+# cpp_winrt
+qt_config_compile_test(cpp_winrt
+ LABEL "cpp/winrt"
+ LIBRARIES
+ runtimeobject
CODE
-"#include <syslog.h>
+"// Including winrt/base.h causes an error in some configurations (Windows 10 SDK + c++20)
+# include <winrt/base.h>
int main(void)
{
- /* BEGIN TEST: */
-openlog(\"qt\", 0, LOG_USER);
-syslog(LOG_INFO, \"configure\");
-closelog();
- /* END TEST: */
return 0;
}
")
-# xlocalescanprint
-qt_config_compile_test(xlocalescanprint
- LABEL "xlocale.h (or equivalents)"
+# <stacktrace>
+qt_config_compile_test(cxx23_stacktrace
+ LABEL "C++23 <stacktrace> support"
CODE
-"#define QT_BEGIN_NAMESPACE
-#define QT_END_NAMESPACE
-
-#ifdef _MSVC_VER
-#define Q_CC_MSVC _MSVC_VER
+"#include <stacktrace>
+#if !defined(__cpp_lib_stacktrace)
+#error
#endif
-#define QT_NO_DOUBLECONVERSION
-
-#include QDSP_P_H
-
int main(void)
{
/* BEGIN TEST: */
-#ifdef _MSVC_VER
-_locale_t invalidLocale = NULL;
-#else
-locale_t invalidLocale = NULL;
-#endif
-double a = 3.4;
-qDoubleSnprintf(argv[0], 1, invalidLocale, \"invalid format\", a);
-qDoubleSscanf(argv[0], invalidLocale, \"invalid format\", &a, &argc);
+const auto backtrace = std::stacktrace::current();
/* END TEST: */
- return 0;
}
-"# FIXME: qmake: DEFINES += QDSP_P_H=$$shell_quote(\"@PWD@/text/qdoublescanprint_p.h\")
+"
+ CXX_STANDARD 23
)
-
-
#### Features
qt_feature("clock-gettime" PRIVATE
@@ -527,41 +441,37 @@ qt_feature("clock-monotonic" PUBLIC
CONDITION QT_FEATURE_clock_gettime AND TEST_clock_monotonic
)
qt_feature_definition("clock-monotonic" "QT_NO_CLOCK_MONOTONIC" NEGATE VALUE "1")
-qt_feature("doubleconversion" PUBLIC PRIVATE
+qt_feature("close_range" PRIVATE
+ LABEL "close_range()"
+ CONDITION QT_FEATURE_process AND TEST_close_range
+ AUTODETECT UNIX
+)
+qt_feature("doubleconversion" PRIVATE
LABEL "DoubleConversion"
)
qt_feature_definition("doubleconversion" "QT_NO_DOUBLECONVERSION" NEGATE VALUE "1")
qt_feature("system-doubleconversion" PRIVATE
LABEL " Using system DoubleConversion"
- CONDITION QT_FEATURE_doubleconversion AND WrapDoubleConversion_FOUND
+ CONDITION QT_FEATURE_doubleconversion AND WrapSystemDoubleConversion_FOUND
ENABLE INPUT_doubleconversion STREQUAL 'system'
DISABLE INPUT_doubleconversion STREQUAL 'qt'
)
qt_feature("cxx11_future" PUBLIC
LABEL "C++11 <future>"
- CONDITION TEST_cxx11_future
-)
-qt_feature("cxx17_bm_searcher" PRIVATE
- LABEL "C++17 boyer_moore_searcher"
- CONDITION TEST_cxx17_bm_searcher
+ CONDITION NOT VXWORKS
)
qt_feature("cxx17_filesystem" PUBLIC
LABEL "C++17 <filesystem>"
CONDITION TEST_cxx17_filesystem
)
-qt_feature("eventfd" PUBLIC
- LABEL "eventfd"
- CONDITION NOT WASM AND TEST_eventfd
+qt_feature("dladdr" PRIVATE
+ LABEL "dladdr"
+ CONDITION QT_FEATURE_dlopen AND TEST_dladdr
)
-qt_feature_definition("eventfd" "QT_NO_EVENTFD" NEGATE VALUE "1")
qt_feature("futimens" PRIVATE
LABEL "futimens()"
CONDITION NOT WIN32 AND TEST_futimens
)
-qt_feature("futimes" PRIVATE
- LABEL "futimes()"
- CONDITION NOT WIN32 AND NOT QT_FEATURE_futimens AND TEST_futimes
-)
qt_feature("getauxval" PRIVATE
LABEL "getauxval()"
CONDITION LINUX AND TEST_getauxval
@@ -576,11 +486,6 @@ qt_feature("glib" PUBLIC PRIVATE
CONDITION GLIB2_FOUND
)
qt_feature_definition("glib" "QT_NO_GLIB" NEGATE VALUE "1")
-qt_feature("glibc" PRIVATE
- LABEL "GNU libc"
- AUTODETECT LINUX
- CONDITION TEST_glibc
-)
qt_feature("icu" PRIVATE
LABEL "ICU"
AUTODETECT NOT WIN32
@@ -592,9 +497,11 @@ qt_feature("inotify" PUBLIC PRIVATE
)
qt_feature_definition("inotify" "QT_NO_INOTIFY" NEGATE VALUE "1")
qt_feature("ipc_posix"
- LABEL "Using POSIX IPC"
- AUTODETECT NOT WIN32 AND ( ( APPLE AND QT_FEATURE_appstore_compliant ) OR NOT TEST_ipc_sysv )
- CONDITION TEST_ipc_posix
+ LABEL "Defaulting legacy IPC to POSIX"
+ CONDITION TEST_posix_shm AND TEST_posix_sem AND (
+ FEATURE_ipc_posix OR (APPLE AND QT_FEATURE_appstore_compliant)
+ OR NOT TEST_sysv_shm OR NOT TEST_sysv_sem
+ )
)
qt_feature_definition("ipc_posix" "QT_POSIX_IPC")
qt_feature("journald" PRIVATE
@@ -612,7 +519,7 @@ qt_feature("system-libb2" PRIVATE
# Currently only used by QTemporaryFile; linkat() exists on Android, but hardlink creation fails due to security rules
qt_feature("linkat" PRIVATE
LABEL "linkat()"
- AUTODETECT LINUX AND NOT ANDROID
+ AUTODETECT ( LINUX AND NOT ANDROID ) OR HURD
CONDITION TEST_linkat
)
qt_feature("std-atomic64" PUBLIC
@@ -662,6 +569,14 @@ qt_feature("poll_select" PRIVATE
EMIT_IF NOT WIN32
)
qt_feature_definition("poll_select" "QT_NO_NATIVE_POLL")
+qt_feature("posix_sem" PRIVATE
+ LABEL "POSIX semaphores"
+ CONDITION TEST_posix_sem AND QT_FEATURE_systemsemaphore
+)
+qt_feature("posix_shm" PRIVATE
+ LABEL "POSIX shared memory"
+ CONDITION TEST_posix_shm AND UNIX
+)
qt_feature("qqnx_pps" PRIVATE
LABEL "PPS"
CONDITION PPS_FOUND
@@ -669,20 +584,23 @@ qt_feature("qqnx_pps" PRIVATE
)
qt_feature("renameat2" PRIVATE
LABEL "renameat2()"
- CONDITION LINUX AND TEST_renameat2
+ CONDITION ( LINUX OR HURD ) AND TEST_renameat2
)
qt_feature("slog2" PRIVATE
LABEL "slog2"
CONDITION Slog2_FOUND
)
-qt_feature("statx" PRIVATE
- LABEL "statx() in libc"
- CONDITION LINUX AND TEST_statx
-)
qt_feature("syslog" PRIVATE
LABEL "syslog"
AUTODETECT OFF
- CONDITION TEST_syslog
+)
+qt_feature("sysv_sem" PRIVATE
+ LABEL "System V / XSI semaphores"
+ CONDITION TEST_sysv_sem AND QT_FEATURE_systemsemaphore
+)
+qt_feature("sysv_shm" PRIVATE
+ LABEL "System V / XSI shared memory"
+ CONDITION TEST_sysv_shm
)
qt_feature("threadsafe-cloexec"
LABEL "Threadsafe pipe creation"
@@ -690,12 +608,6 @@ qt_feature("threadsafe-cloexec"
)
qt_feature_definition("threadsafe-cloexec" "QT_THREADSAFE_CLOEXEC" VALUE "1")
qt_feature_config("threadsafe-cloexec" QMAKE_PUBLIC_QT_CONFIG)
-qt_feature("properties" PUBLIC
- SECTION "Kernel"
- LABEL "Properties"
- PURPOSE "Supports scripting Qt-based applications."
-)
-qt_feature_definition("properties" "QT_NO_PROPERTIES" NEGATE VALUE "1")
qt_feature("regularexpression" PUBLIC
SECTION "Kernel"
LABEL "QRegularExpression"
@@ -707,11 +619,15 @@ qt_feature("backtrace" PRIVATE
LABEL "backtrace"
CONDITION UNIX AND QT_FEATURE_regularexpression AND WrapBacktrace_FOUND
)
+qt_feature("cxx23_stacktrace" PRIVATE
+ LABEL "C++23 <stacktrace>"
+ CONDITION TEST_cxx23_stacktrace AND QT_FEATURE_cxx2b
+)
qt_feature("sharedmemory" PUBLIC
SECTION "Kernel"
LABEL "QSharedMemory"
PURPOSE "Provides access to a shared memory segment."
- CONDITION ( ANDROID OR WIN32 OR ( NOT VXWORKS AND ( TEST_ipc_sysv OR TEST_ipc_posix ) ) )
+ CONDITION WIN32 OR TEST_sysv_shm OR TEST_posix_shm
)
qt_feature_definition("sharedmemory" "QT_NO_SHAREDMEMORY" NEGATE VALUE "1")
qt_feature("shortcut" PUBLIC
@@ -724,7 +640,7 @@ qt_feature("systemsemaphore" PUBLIC
SECTION "Kernel"
LABEL "QSystemSemaphore"
PURPOSE "Provides a general counting system semaphore."
- CONDITION ( NOT INTEGRITY AND NOT VXWORKS AND NOT rtems ) AND ( ANDROID OR WIN32 OR TEST_ipc_sysv OR TEST_ipc_posix )
+ CONDITION WIN32 OR TEST_sysv_sem OR TEST_posix_sem
)
qt_feature_definition("systemsemaphore" "QT_NO_SYSTEMSEMAPHORE" NEGATE VALUE "1")
qt_feature("xmlstream" PUBLIC
@@ -732,21 +648,24 @@ qt_feature("xmlstream" PUBLIC
LABEL "XML Streaming APIs"
PURPOSE "Provides a simple streaming API for XML."
)
-qt_feature_definition("xmlstream" "QT_NO_XMLSTREAM" NEGATE VALUE "1")
+qt_feature("cpp-winrt" PRIVATE PUBLIC
+ LABEL "cpp/winrt base"
+ PURPOSE "basic cpp/winrt language projection support"
+ AUTODETECT WIN32
+ CONDITION WIN32 AND TEST_cpp_winrt
+)
qt_feature("xmlstreamreader" PUBLIC
SECTION "Kernel"
LABEL "QXmlStreamReader"
PURPOSE "Provides a well-formed XML parser with a simple streaming API."
CONDITION QT_FEATURE_xmlstream
)
-qt_feature_definition("xmlstreamreader" "QT_NO_XMLSTREAMREADER" NEGATE VALUE "1")
qt_feature("xmlstreamwriter" PUBLIC
SECTION "Kernel"
LABEL "QXmlStreamWriter"
PURPOSE "Provides a XML writer with a simple streaming API."
CONDITION QT_FEATURE_xmlstream
)
-qt_feature_definition("xmlstreamwriter" "QT_NO_XMLSTREAMWRITER" NEGATE VALUE "1")
qt_feature("textdate" PUBLIC
SECTION "Data structures"
LABEL "Text Date"
@@ -764,7 +683,13 @@ qt_feature("process" PUBLIC
SECTION "File I/O"
LABEL "QProcess"
PURPOSE "Supports external process invocation."
- CONDITION QT_FEATURE_processenvironment AND ( QT_FEATURE_thread OR NOT UNIX ) AND NOT UIKIT AND NOT INTEGRITY AND NOT VXWORKS AND NOT rtems
+ CONDITION QT_FEATURE_processenvironment
+ AND (QT_FEATURE_thread OR NOT UNIX)
+ AND NOT UIKIT
+ AND NOT INTEGRITY
+ AND NOT VXWORKS
+ AND NOT rtems
+ AND NOT WASM
)
qt_feature_definition("process" "QT_NO_PROCESS" NEGATE VALUE "1")
qt_feature("processenvironment" PUBLIC
@@ -783,7 +708,7 @@ qt_feature("library" PUBLIC
SECTION "File I/O"
LABEL "QLibrary"
PURPOSE "Provides a wrapper for dynamically loaded libraries."
- CONDITION WIN32 OR HPUX OR ( NOT NACL AND QT_FEATURE_dlopen )
+ CONDITION WIN32 OR HPUX OR QT_FEATURE_dlopen
)
qt_feature_definition("library" "QT_NO_LIBRARY" NEGATE VALUE "1")
qt_feature("settings" PUBLIC
@@ -867,7 +792,7 @@ qt_feature("animation" PUBLIC
SECTION "Utilities"
LABEL "Animation"
PURPOSE "Provides a framework for animations."
- CONDITION QT_FEATURE_properties AND QT_FEATURE_easingcurve
+ CONDITION QT_FEATURE_easingcurve
)
qt_feature_definition("animation" "QT_NO_ANIMATION" NEGATE VALUE "1")
qt_feature("gestures" PUBLIC
@@ -901,7 +826,13 @@ qt_feature("timezone" PUBLIC
SECTION "Utilities"
LABEL "QTimeZone"
PURPOSE "Provides support for time-zone handling."
- CONDITION NOT WASM
+ CONDITION NOT WASM AND NOT VXWORKS
+)
+qt_feature("timezone_locale" PRIVATE
+ SECTION "Utilities"
+ LABEL "QTimeZone"
+ PURPOSE "Provides support for localized time-zone display names."
+ DISABLE ON # Implementation is currently incomplete, so leave turned off
)
qt_feature("datetimeparser" PRIVATE
SECTION "Utilities"
@@ -928,6 +859,12 @@ qt_feature("etw" PRIVATE
ENABLE INPUT_trace STREQUAL 'etw' OR ( INPUT_trace STREQUAL 'yes' AND WIN32 )
DISABLE INPUT_trace STREQUAL 'lttng' OR INPUT_trace STREQUAL 'no'
)
+qt_feature("ctf" PRIVATE
+ LABEL "CTF"
+ AUTODETECT OFF
+ ENABLE INPUT_trace STREQUAL 'ctf'
+ DISABLE INPUT_trace STREQUAL 'etw' OR INPUT_trace STREQUAL 'no' OR INPUT_trace STREQUAL 'lttng'
+)
qt_feature("forkfd_pidfd" PRIVATE
LABEL "CLONE_PIDFD support in forkfd"
CONDITION LINUX
@@ -942,19 +879,42 @@ qt_feature("cborstreamwriter" PUBLIC
LABEL "CBOR stream writing"
PURPOSE "Provides support for writing the CBOR binary format."
)
+qt_feature("poll-exit-on-error" PRIVATE
+ LABEL "Poll exit on error"
+ AUTODETECT OFF
+ CONDITION UNIX
+ PURPOSE "Exit on error instead of just printing the error code and continue."
+)
+qt_feature("permissions" PUBLIC
+ SECTION "Utilities"
+ LABEL "Application permissions"
+ PURPOSE "Provides support for requesting user permission to access restricted data or APIs"
+)
+qt_feature("openssl-hash" PRIVATE
+ LABEL "OpenSSL based cryptographic hash"
+ AUTODETECT OFF
+ CONDITION QT_FEATURE_openssl_linked AND QT_FEATURE_opensslv30
+ PURPOSE "Uses OpenSSL based implementation of cryptographic hash algorithms."
+)
+
qt_configure_add_summary_section(NAME "Qt Core")
qt_configure_add_summary_entry(ARGS "backtrace")
+qt_configure_add_summary_entry(ARGS "cxx23_stacktrace")
qt_configure_add_summary_entry(ARGS "doubleconversion")
qt_configure_add_summary_entry(ARGS "system-doubleconversion")
+qt_configure_add_summary_entry(ARGS "forkfd_pidfd" CONDITION LINUX)
qt_configure_add_summary_entry(ARGS "glib")
qt_configure_add_summary_entry(ARGS "icu")
qt_configure_add_summary_entry(ARGS "system-libb2")
qt_configure_add_summary_entry(ARGS "mimetype-database")
+qt_configure_add_summary_entry(ARGS "permissions")
+qt_configure_add_summary_entry(ARGS "ipc_posix" CONDITION UNIX)
qt_configure_add_summary_entry(
TYPE "firstAvailableFeature"
- ARGS "etw lttng"
+ ARGS "etw lttng ctf"
MESSAGE "Tracing backend"
)
+qt_configure_add_summary_entry(ARGS "openssl-hash")
qt_configure_add_summary_section(NAME "Logging backends")
qt_configure_add_summary_entry(ARGS "journald")
qt_configure_add_summary_entry(ARGS "syslog")
@@ -966,10 +926,6 @@ qt_configure_add_summary_entry(
)
qt_configure_add_summary_entry(ARGS "pcre2")
qt_configure_add_summary_entry(ARGS "system-pcre2")
-qt_configure_add_summary_entry(
- ARGS "forkfd_pidfd"
- CONDITION LINUX
-)
qt_configure_end_summary_section() # end of "Qt Core" section
qt_configure_add_report_entry(
TYPE NOTE
@@ -978,16 +934,6 @@ qt_configure_add_report_entry(
)
qt_configure_add_report_entry(
TYPE ERROR
- MESSAGE "C++11 <random> is required and is missing or failed to compile."
- CONDITION NOT TEST_cxx11_random
-)
-qt_configure_add_report_entry(
- TYPE ERROR
- MESSAGE "Your C library does not provide sscanf_l or snprintf_l. You need to use libdouble-conversion for double/string conversion."
- CONDITION INPUT_doubleconversion STREQUAL 'no' AND NOT TEST_xlocalescanprint
-)
-qt_configure_add_report_entry(
- TYPE ERROR
MESSAGE "detected a std::atomic implementation that fails for function pointers. Please apply the patch corresponding to your Standard Library vendor, found in qtbase/config.tests/atomicfptr"
CONDITION NOT TEST_atomicfptr
)
@@ -996,3 +942,8 @@ qt_configure_add_report_entry(
MESSAGE "Qt requires poll(), ppoll(), poll_ts() or select() on this platform"
CONDITION ( UNIX OR INTEGRITY ) AND ( NOT QT_FEATURE_poll_ppoll ) AND ( NOT QT_FEATURE_poll_pollts ) AND ( NOT QT_FEATURE_poll_poll ) AND ( NOT QT_FEATURE_poll_select )
)
+qt_configure_add_report_entry(
+ TYPE WARNING
+ MESSAGE "Basic cpp/winrt support missing. Some features might not be available."
+ CONDITION WIN32 AND NOT QT_FEATURE_cpp_winrt
+)
diff --git a/src/corelib/debug_script.py b/src/corelib/debug_script.py
index c66549ceaa..b4a58530da 100644
--- a/src/corelib/debug_script.py
+++ b/src/corelib/debug_script.py
@@ -1,30 +1,5 @@
-#############################################################################
-##
-## Copyright (C) 2017 The Qt Company Ltd.
-## Contact: https://www.qt.io/licensing/
-##
-## This file is part of the QtCore module of the Qt Toolkit.
-##
-## $QT_BEGIN_LICENSE:GPL-EXCEPT$
-## Commercial License Usage
-## Licensees holding valid commercial Qt licenses may use this file in
-## accordance with the commercial license agreement provided with the
-## Software or, alternatively, in accordance with the terms contained in
-## a written agreement between you and The Qt Company. For licensing terms
-## and conditions see https://www.qt.io/terms-conditions. For further
-## information use the contact form at https://www.qt.io/contact-us.
-##
-## GNU General Public License Usage
-## Alternatively, this file may be used under the terms of the GNU
-## General Public License version 3 as published by the Free Software
-## Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-## included in the packaging of this file. Please review the following
-## information to ensure the GNU General Public License requirements will
-## be met: https://www.gnu.org/licenses/gpl-3.0.html.
-##
-## $QT_END_LICENSE$
-##
-#############################################################################
+# Copyright (C) 2017 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
import os
import sys
@@ -59,10 +34,6 @@ def import_bridge(path, debugger, session_dict, reload_module=False):
return bridge
-def report_success(bridge):
- print("Using Qt summary providers from Creator {} in '{}'".format(
- bridge.CREATOR_VERSION, bridge.CREATOR_PATH))
-
def __lldb_init_module(debugger, session_dict):
# Check if the module has already been imported globally. This ensures
# that the Qt Creator application search is only performed once per
@@ -73,28 +44,36 @@ def __lldb_init_module(debugger, session_dict):
bridge = import_bridge(module.__file__, debugger, session_dict,
reload_module = True)
if bridge:
- report_success(bridge)
return
versions = {}
- for install in os.popen(
- 'mdfind kMDItemCFBundleIdentifier=org.qt-project.qtcreator'
- '| while read p;'
- 'do echo $p=$(mdls "$p" -name kMDItemVersion -raw);'
- 'done'):
- install = install.strip()
- (p, v) = install.split('=')
- versions[v] = p
+ for path in os.popen('mdfind kMDItemCFBundleIdentifier=org.qt-project.qtcreator'):
+ path = path.strip()
+ file = open(os.path.join(path, 'Contents', 'Info.plist'), "rb")
+
+ import plistlib
+ plist = plistlib.load(file)
+
+ version = None
+ for key in ["CFBundleVersion", "CFBundleShortVersionString"]:
+ if key in plist:
+ version = plist[key]
+ break
+
+ if not version:
+ print(f"Could not resolve version for '{path}'. Ignoring.")
+ continue
+
+ versions[version] = path
+
+ if not len(versions):
+ print("Could not find Qt Creator installation. No Qt summary providers installed.")
+ return
for version in sorted(versions, key=LooseVersion, reverse=True):
path = versions[version]
-
+ print(f"Loading Qt summary providers from Creator {version} in '{path}'")
bridge_path = '{}/Contents/Resources/debugger/lldbbridge.py'.format(path)
bridge = import_bridge(bridge_path, debugger, session_dict)
if bridge:
- bridge.CREATOR_VERSION = version
- bridge.CREATOR_PATH = path
- report_success(bridge)
return
-
- print("Could not find Qt Creator installation, no Qt summary providers installed")
diff --git a/src/corelib/doc/include/QtCoreDoc b/src/corelib/doc/include/QtCoreDoc
index 3dc7ce46e5..5f5490cbc9 100644
--- a/src/corelib/doc/include/QtCoreDoc
+++ b/src/corelib/doc/include/QtCoreDoc
@@ -1,2 +1,4 @@
#include <QtCore/QtCore>
#include "../../platform/android/qandroidextras_p.h"
+#include "../../kernel/qpermissions.h"
+#include "../../tools/qatomicscopedvaluerollback_p.h"
diff --git a/src/corelib/doc/include/jni.h b/src/corelib/doc/include/jni.h
index 0e7560cf61..4eff8636f6 100644
--- a/src/corelib/doc/include/jni.h
+++ b/src/corelib/doc/include/jni.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#pragma once
diff --git a/src/corelib/doc/qtcore.qdocconf b/src/corelib/doc/qtcore.qdocconf
index 93db5491c2..4ed46ae6dd 100644
--- a/src/corelib/doc/qtcore.qdocconf
+++ b/src/corelib/doc/qtcore.qdocconf
@@ -34,7 +34,8 @@ headerdirs += ..
sourcedirs += .. \
../../tools/androiddeployqt \
- ../../android/templates
+ ../../android/templates \
+ src/includes
exampledirs += \
../ \
@@ -42,7 +43,8 @@ exampledirs += \
../../../examples/corelib \
../../../examples/network/dnslookup \
../../../examples/widgets/tools \
- ../../../tests/auto/corelib/thread/qpromise/
+ ../../../tests/auto/corelib/thread/qpromise \
+ ../../tools/androiddeployqt
imagedirs += images
@@ -50,11 +52,19 @@ excludedirs += snippets
excludefiles += ../../../examples/widgets/tools/customcompleter/doc/src/customcompleter.qdoc
+defines += QT_BUILD_CORE_LIB
+
# Included in qttestlib.qdocconf instead
excludefiles += ../kernel/qtestsupport_core.cpp
navigation.landingpage = "Qt Core"
navigation.cppclassespage = "Qt Core C++ Classes"
-# Fail the documentation build if there are more warnings than the limit
-warninglimit = 0
+# Highlighted examples in Data Processing & IO category
+manifestmeta.highlighted.names = \
+ "QtCore/Mandelbrot" \
+ "QtCore/Serialization Converter" \
+ "QtCore/QXmlStream Bookmarks Example"
+
+# Temporarily allow warning: No such parameter 'other' in QFlags::operator=()
+warninglimit = 1
diff --git a/src/corelib/doc/snippets/buffer/buffer.cpp b/src/corelib/doc/snippets/buffer/buffer.cpp
index 66747aad39..160c0327c3 100644
--- a/src/corelib/doc/snippets/buffer/buffer.cpp
+++ b/src/corelib/doc/snippets/buffer/buffer.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#include <QApplication>
#include <QBuffer>
diff --git a/src/corelib/doc/snippets/cmake-macros/deployment.cmake b/src/corelib/doc/snippets/cmake-macros/deployment.cmake
new file mode 100644
index 0000000000..ef7aa726c0
--- /dev/null
+++ b/src/corelib/doc/snippets/cmake-macros/deployment.cmake
@@ -0,0 +1,27 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+#! [qt_generate_deploy_script_example]
+cmake_minimum_required(VERSION 3.16...3.22)
+project(MyThings)
+
+find_package(Qt6 REQUIRED COMPONENTS Core)
+qt_standard_project_setup()
+
+qt_add_executable(MyApp main.cpp)
+
+install(TARGETS MyApp
+ BUNDLE DESTINATION .
+ RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
+)
+
+qt_generate_deploy_script(
+ TARGET MyApp
+ OUTPUT_SCRIPT deploy_script
+ CONTENT "
+qt_deploy_runtime_dependencies(
+ EXECUTABLE $<TARGET_FILE_NAME:MyApp>
+)
+")
+install(SCRIPT ${deploy_script})
+#! [qt_generate_deploy_script_example]
diff --git a/src/corelib/doc/snippets/cmake-macros/examples.cmake b/src/corelib/doc/snippets/cmake-macros/examples.cmake
index a4def96600..09b7470962 100644
--- a/src/corelib/doc/snippets/cmake-macros/examples.cmake
+++ b/src/corelib/doc/snippets/cmake-macros/examples.cmake
@@ -1,17 +1,46 @@
-#! [qt_wrap_cpp]
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+#! [qt_wrap_cpp_1]
set(SOURCES myapp.cpp main.cpp)
qt_wrap_cpp(SOURCES myapp.h)
-add_executable(myapp ${SOURCES})
-#! [qt_wrap_cpp]
+qt_add_executable(myapp ${SOURCES})
+#! [qt_wrap_cpp_1]
+
+#! [qt_wrap_cpp_2]
+set(SOURCES myapp.cpp main.cpp)
+qt_wrap_cpp(SOURCES myapp.h
+ TARGET myapp
+ OPTIONS
+ "$<$<CONFIG:Debug>:-DMY_OPTION_FOR_DEBUG>"
+ "-DDEFINE_CMDLINE_SIGNAL=void cmdlineSignal(const QMap<int, int> &i)"
+ "$<$<CONFIG:Debug>:-DDEFINE_CMDLINE_SIGNAL_IN_GENEX=void cmdlineSignal(const QMap<int$<COMMA> int$<ANGLE-R> &i)>")
+qt_add_executable(myapp ${SOURCES})
+#! [qt_wrap_cpp_2]
+
+#! [qt_wrap_cpp_3]
+set(SOURCES myapp.cpp main.cpp)
+qt_wrap_cpp(SOURCES myapp.h
+ TARGET myapp)
+qt_add_executable(myapp ${SOURCES})
+target_compile_definitions(myapp PRIVATE "$<$<CONFIG:Debug>:MY_OPTION_FOR_DEBUG>"
+ "DEFINE_CMDLINE_SIGNAL=void cmdlineSignal(const QMap<int, int> &i)"
+ "$<$<BOOL:TRUE>:DEFINE_CMDLINE_SIGNAL_IN_GENEX=void cmdlineSignal(const QMap<int$<COMMA> int$<ANGLE-R> &i)>")
+#! [qt_wrap_cpp_3]
+
+#! [qt_wrap_cpp_4]
+qt_add_executable(myapp myapp.cpp main.cpp)
+qt_wrap_cpp("" myapp.cpp TARGET myapp)
+#! [qt_wrap_cpp_4]
#! [qt_add_resources]
set(SOURCES main.cpp)
qt_add_resources(SOURCES example.qrc)
-add_executable(myapp ${SOURCES})
+qt_add_executable(myapp ${SOURCES})
#! [qt_add_resources]
#! [qt_add_resources_target]
-add_executable(myapp main.cpp)
+qt_add_executable(myapp main.cpp)
qt_add_resources(myapp "images"
PREFIX "/images"
FILES image1.png image2.png)
@@ -20,7 +49,12 @@ qt_add_resources(myapp "images"
#! [qt_add_big_resources]
set(SOURCES main.cpp)
qt_add_big_resources(SOURCES big_resource.qrc)
-add_executable(myapp ${SOURCES})
+
+# Have big_resource.qrc treated as a source file by Qt Creator
+list(APPEND SOURCES big_resource.qrc)
+set_property(SOURCE big_resource.qrc PROPERTY SKIP_AUTORCC ON)
+
+qt_add_executable(myapp ${SOURCES})
#! [qt_add_big_resources]
#! [qt_add_binary_resources]
@@ -33,7 +67,7 @@ qt_generate_moc(main.cpp main.moc TARGET myapp)
#! [qt_generate_moc]
#! [qt_import_plugins]
-add_executable(myapp main.cpp)
+qt_add_executable(myapp main.cpp)
target_link_libraries(myapp Qt::Gui Qt::Sql)
qt_import_plugins(myapp
INCLUDE Qt::QCocoaIntegrationPlugin
@@ -57,3 +91,16 @@ qt_finalize_target(complexapp)
qt_android_generate_deployment_settings(myapp)
qt_android_add_apk_target(myapp)
#! [qt_android_deploy_basic]
+
+#! [qt_finalize_project_manual]
+cmake_minimum_required(VERSIONS 3.16)
+
+project(MyProject LANGUAGES CXX)
+
+find_package(Qt6 REQUIRED COMPONENTS Core)
+
+qt_add_executable(MyApp main.cpp)
+add_subdirectory(mylib)
+
+qt_finalize_project()
+#! [qt_finalize_project_manual]
diff --git a/src/corelib/doc/snippets/cmake-macros/examples.cpp b/src/corelib/doc/snippets/cmake-macros/examples.cpp
new file mode 100644
index 0000000000..b17fcd8e77
--- /dev/null
+++ b/src/corelib/doc/snippets/cmake-macros/examples.cpp
@@ -0,0 +1,16 @@
+// Copyright (C) 2024 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+//! [qt_wrap_cpp_4]
+// myapp.cpp
+#include "myapp.h"
+#include <QObject>
+
+class MyApp : public QObject {
+ Q_OBJECT
+public:
+ MyApp() = default;
+};
+
+#include "myapp.moc"
+//! [qt_wrap_cpp_4]
diff --git a/src/corelib/doc/snippets/code/doc_src_containers.cpp b/src/corelib/doc/snippets/code/doc_src_containers.cpp
index 834056174f..b568462492 100644
--- a/src/corelib/doc/snippets/code/doc_src_containers.cpp
+++ b/src/corelib/doc/snippets/code/doc_src_containers.cpp
@@ -1,52 +1,7 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+#undef QT_NO_FOREACH // this file contains unported legacy Q_FOREACH uses
//! [0]
class Employee
@@ -63,14 +18,34 @@ private:
};
//! [0]
+//! [range_for]
+QList<QString> list = {"A", "B", "C", "D"};
+for (const auto &item : list) {
+ ...
+}
+//! [range_for]
+
+//! [range_for_as_const]
+QList<QString> list = {"A", "B", "C", "D"};
+for (const auto &item : std::as_const(list)) {
+ ...
+}
+//! [range_for_as_const]
+
+//! [index]
+QList<QString> list = {"A", "B", "C", "D"};
+for (qsizetype i = 0; i < list.size(); ++i) {
+ const auto &item = list.at(i);
+ ...
+}
+//! [index]
//! [1]
-QList<QString> list;
-list << "A" << "B" << "C" << "D";
+QList<QString> list = {"A", "B", "C", "D"};
QListIterator<QString> i(list);
while (i.hasNext())
- qDebug() << i.next();
+ QString s = i.next();
//! [1]
@@ -78,7 +53,7 @@ while (i.hasNext())
QListIterator<QString> i(list);
i.toBack();
while (i.hasPrevious())
- qDebug() << i.previous();
+ QString s = i.previous();
//! [2]
@@ -118,11 +93,12 @@ while (i.hasNext())
//! [7]
-QMap<QString, QString> map;
-map.insert("Paris", "France");
-map.insert("Guatemala City", "Guatemala");
-map.insert("Mexico City", "Mexico");
-map.insert("Moscow", "Russia");
+QMap<QString, QString> map = {
+ {"Paris", "France"},
+ {"Guatemala City", "Guatemala"},
+ {"Mexico City", "Mexico"},
+ {"Moscow", "Russia"}
+};
...
QMutableMapIterator<QString, QString> i(map);
@@ -153,28 +129,23 @@ while (i.findNext(widget))
//! [10]
-QList<QString> list;
-list << "A" << "B" << "C" << "D";
+QList<QString> list = {"A", "B", "C", "D"};
-QList<QString>::iterator i;
-for (i = list.begin(); i != list.end(); ++i)
+for (auto i = list.begin(), end = list.end(); i != end; ++i)
*i = (*i).toLower();
//! [10]
//! [11]
-QList<QString> list;
-list << "A" << "B" << "C" << "D";
+QList<QString> list = {"A", "B", "C", "D"};
-QList<QString>::reverse_iterator i;
-for (i = list.rbegin(); i != list.rend(); ++i)
+for (auto i = list.rbegin(), rend = list.rend(); i != rend; ++i)
*i = i->toLower();
//! [11]
//! [12]
-QList<QString>::const_iterator i;
-for (i = list.constBegin(); i != list.constEnd(); ++i)
+for (auto i = list.cbegin(), end = list.cend(); i != end; ++i)
qDebug() << *i;
//! [12]
@@ -182,8 +153,7 @@ for (i = list.constBegin(); i != list.constEnd(); ++i)
//! [13]
QMap<int, int> map;
...
-QMap<int, int>::const_iterator i;
-for (i = map.constBegin(); i != map.constEnd(); ++i)
+for (auto i = map.cbegin(), end = map.cend(); i != end; ++i)
qDebug() << i.key() << ':' << i.value();
//! [13]
@@ -191,13 +161,11 @@ for (i = map.constBegin(); i != map.constEnd(); ++i)
//! [14]
// RIGHT
const QList<int> sizes = splitter->sizes();
-QList<int>::const_iterator i;
-for (i = sizes.begin(); i != sizes.end(); ++i)
+for (auto i = sizes.begin(), end = sizes.end(); i != end; ++i)
...
// WRONG
-QList<int>::const_iterator i;
-for (i = splitter->sizes().begin();
+for (auto i = splitter->sizes().begin();
i != splitter->sizes().end(); ++i)
...
//! [14]
@@ -216,8 +184,10 @@ foreach (str, values)
QList<QString> values;
...
QListIterator<QString> i(values);
-while (i.hasNext())
- qDebug() << i.next();
+while (i.hasNext()) {
+ QString s = i.next();
+ qDebug() << s;
+}
//! [16]
@@ -258,25 +228,23 @@ foreach (const QString &str, map.uniqueKeys()) {
//! [20]
-//! [21]
-forever {
- ...
-}
-//! [21]
-
-
//! [22]
CONFIG += no_keywords
//! [22]
+//! [cmake_no_keywords]
+target_compile_definitions(my_app PRIVATE QT_NO_KEYWORDS)
+//! [cmake_no_keywords]
+
+
//! [23]
QString onlyLetters(const QString &in)
{
QString out;
- for (int j = 0; j < in.size(); ++j) {
- if (in[j].isLetter())
- out += in[j];
+ for (qsizetype j = 0; j < in.size(); ++j) {
+ if (in.at(j).isLetter())
+ out += in.at(j);
}
return out;
}
@@ -313,15 +281,15 @@ int j = *i; // Undefined behavior!
//! [24]
//! [25]
-QList<int> list { 1, 2, 3, 4, 4, 5 };
-QSet<int> set(list.begin(), list.end());
+QList<int> list = {1, 2, 3, 4, 4, 5};
+QSet<int> set(list.cbegin(), list.cend());
/*
Will generate a QSet containing 1, 2, 3, 4, 5.
*/
//! [25]
//! [26]
-QList<int> list { 2, 3, 1 };
+QList<int> list = {2, 3, 1};
std::sort(list.begin(), list.end());
/*
diff --git a/src/corelib/doc/snippets/code/doc_src_groups.cpp b/src/corelib/doc/snippets/code/doc_src_groups.cpp
index 2b8ed39447..a0901904db 100644
--- a/src/corelib/doc/snippets/code/doc_src_groups.cpp
+++ b/src/corelib/doc/snippets/code/doc_src_groups.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [0]
void QPen::setStyle(Qt::PenStyle style)
diff --git a/src/corelib/doc/snippets/code/doc_src_objecttrees.cpp b/src/corelib/doc/snippets/code/doc_src_objecttrees.cpp
index 849b628e0c..b7c71ccb6b 100644
--- a/src/corelib/doc/snippets/code/doc_src_objecttrees.cpp
+++ b/src/corelib/doc/snippets/code/doc_src_objecttrees.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//![0]
int main()
diff --git a/src/corelib/doc/snippets/code/doc_src_properties.cpp b/src/corelib/doc/snippets/code/doc_src_properties.cpp
index 838cb980f7..190a843710 100644
--- a/src/corelib/doc/snippets/code/doc_src_properties.cpp
+++ b/src/corelib/doc/snippets/code/doc_src_properties.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [0]
Q_PROPERTY(type name
@@ -115,6 +68,9 @@ public:
void setPriority(Priority priority)
{
+ if (m_priority == priority)
+ return;
+
m_priority = priority;
emit priorityChanged(priority);
}
@@ -140,7 +96,7 @@ object->setProperty("priority", "VeryHigh");
//! [7]
-Q_CLASSINFO("Version", "3.0.0")
+Q_CLASSINFO("DefaultProperty", "content")
//! [7]
//! [8]
diff --git a/src/corelib/doc/snippets/code/doc_src_qalgorithms.cpp b/src/corelib/doc/snippets/code/doc_src_qalgorithms.cpp
index 6e4df4a912..f2b94a7416 100644
--- a/src/corelib/doc/snippets/code/doc_src_qalgorithms.cpp
+++ b/src/corelib/doc/snippets/code/doc_src_qalgorithms.cpp
@@ -1,61 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-//! [0]
-double pi = 3.14;
-double e = 2.71;
-
-qSwap(pi, e);
-// pi == 2.71, e == 3.14
-//! [0]
-
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [1]
QList<Employee *> list;
diff --git a/src/corelib/doc/snippets/code/doc_src_qcache.cpp b/src/corelib/doc/snippets/code/doc_src_qcache.cpp
index 757a72b521..a15a802760 100644
--- a/src/corelib/doc/snippets/code/doc_src_qcache.cpp
+++ b/src/corelib/doc/snippets/code/doc_src_qcache.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [0]
QCache<int, Employee> cache;
diff --git a/src/corelib/doc/snippets/code/doc_src_qiterator.cpp b/src/corelib/doc/snippets/code/doc_src_qiterator.cpp
index 44801dda09..0d921b87e6 100644
--- a/src/corelib/doc/snippets/code/doc_src_qiterator.cpp
+++ b/src/corelib/doc/snippets/code/doc_src_qiterator.cpp
@@ -1,59 +1,12 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [0]
QList<float> list;
...
QListIterator<float> i(list);
while (i.hasNext())
- qDebug() << i.next();
+ float f = i.next();
//! [0]
@@ -61,7 +14,7 @@ while (i.hasNext())
QListIterator<float> i(list);
i.toBack();
while (i.hasPrevious())
- qDebug() << i.previous();
+ float f = i.previous();
//! [1]
//! [6]
@@ -69,24 +22,15 @@ QSet<QString> set;
...
QSetIterator<QString> i(set);
while (i.hasNext())
- qDebug() << i.next();
+ float f = i.next();
//! [6]
-
-//! [7]
-QSetIterator<QString> i(set);
-i.toBack();
-while (i.hasPrevious())
- qDebug() << i.previous();
-//! [7]
-
-
//! [8]
QList<float> list;
...
QMutableListIterator<float> i(list);
while (i.hasNext())
- qDebug() << i.next();
+ float f = i.next();
//! [8]
@@ -94,7 +38,7 @@ while (i.hasNext())
QMutableListIterator<float> i(list);
i.toBack();
while (i.hasPrevious())
- qDebug() << i.previous();
+ float f = i.previous();
//! [9]
@@ -115,7 +59,7 @@ QSet<float> set;
...
QMutableSetIterator<float> i(set);
while (i.hasNext())
- qDebug() << i.next();
+ float f = i.next();
//! [17]
//! [19]
diff --git a/src/corelib/doc/snippets/code/doc_src_qnamespace.cpp b/src/corelib/doc/snippets/code/doc_src_qnamespace.cpp
index cc9f9f3929..1084585584 100644
--- a/src/corelib/doc/snippets/code/doc_src_qnamespace.cpp
+++ b/src/corelib/doc/snippets/code/doc_src_qnamespace.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [1]
enum CustomEventPriority
diff --git a/src/corelib/doc/snippets/code/doc_src_qnamespace.qdoc b/src/corelib/doc/snippets/code/doc_src_qnamespace.qdoc
index 4d8932f837..6ce29308f1 100644
--- a/src/corelib/doc/snippets/code/doc_src_qnamespace.qdoc
+++ b/src/corelib/doc/snippets/code/doc_src_qnamespace.qdoc
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
//! [0]
QObject::connect: Cannot queue arguments of type 'MyType'
diff --git a/src/corelib/doc/snippets/code/doc_src_qplugin.cpp b/src/corelib/doc/snippets/code/doc_src_qplugin.cpp
index 744f425bbc..3bca27b966 100644
--- a/src/corelib/doc/snippets/code/doc_src_qplugin.cpp
+++ b/src/corelib/doc/snippets/code/doc_src_qplugin.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [0]
namespace Foo
@@ -69,9 +22,3 @@ class MyInstance : public QObject
//! [2]
Q_IMPORT_PLUGIN(qjpeg)
//! [2]
-
-
-//! [3]
-TEMPLATE = app
-QTPLUGIN += qjpeg qgif # image formats
-//! [3]
diff --git a/src/corelib/doc/snippets/code/doc_src_qplugin.pro b/src/corelib/doc/snippets/code/doc_src_qplugin.pro
deleted file mode 100644
index 52fb9e3163..0000000000
--- a/src/corelib/doc/snippets/code/doc_src_qplugin.pro
+++ /dev/null
@@ -1,4 +0,0 @@
-#! [3]
-TEMPLATE = app
-QTPLUGIN += qjpeg qgif # image formats
-#! [3]
diff --git a/src/corelib/doc/snippets/code/doc_src_qset.cpp b/src/corelib/doc/snippets/code/doc_src_qset.cpp
index 96ef07738b..98a6f336f5 100644
--- a/src/corelib/doc/snippets/code/doc_src_qset.cpp
+++ b/src/corelib/doc/snippets/code/doc_src_qset.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [0]
QSet<QString> set;
@@ -73,24 +26,23 @@ if (!set.contains("ninety-nine"))
//! [4]
QSetIterator<QWidget *> i(set);
-while (i.hasNext())
- qDebug() << i.next();
+while (i.hasNext()) {
+ QWidget *w = i.next();
+ qDebug() << w;
+}
//! [4]
//! [5]
-QSet<QWidget *>::const_iterator i = set.constBegin();
-while (i != set.constEnd()) {
+for (auto i = set.cbegin(), end = set.cend(); i != end; ++i)
qDebug() << *i;
- ++i;
-}
//! [5]
//! [6]
QSet<QString> set;
...
-foreach (const QString &value, set)
+for (const auto &value : set)
qDebug() << value;
//! [6]
@@ -104,20 +56,18 @@ for (int i = 0; i < 20000; ++i)
//! [8]
-QSet<QString> set;
-set << "January" << "February" << ... << "December";
+QSet<QString> set = {"January", "February", ... "December"}
-QSet<QString>::iterator i;
-for (i = set.begin(); i != set.end(); ++i)
+// i is a QSet<QString>::iterator
+for (auto i = set.begin(), end = set.end(); i != end; ++i)
qDebug() << *i;
//! [8]
//! [9]
-QSet<QString> set;
-set << "January" << "February" << ... << "December";
+QSet<QString> set = {"January", "February", ... "December"};
-QSet<QString>::iterator i = set.begin();
+auto i = set.begin();
while (i != set.end()) {
if ((*i).startsWith('J')) {
i = set.erase(i);
@@ -139,11 +89,10 @@ if (it != set.end())
//! [11]
-QSet<QString> set;
-set << "January" << "February" << ... << "December";
+QSet<QString> set = {"January", "February", ... "December"};
-QSet<QString>::const_iterator i;
-for (i = set.begin(); i != set.end(); ++i)
+// i is QSet<QString>::const_iterator
+for (auto i = set.cbegin(), end = set.cend(); i != end; ++i)
qDebug() << *i;
//! [11]
@@ -156,23 +105,3 @@ QSet<QString>::const_iterator it = std::find_if(set.cbegin(), set.cend(), predic
if (it != set.constEnd())
cout << "Found Jeanette" << endl;
//! [12]
-
-
-//! [13]
-QSet<QString> set;
-set << "red" << "green" << "blue" << ... << "black";
-
-QList<QString> list = set.toList();
-std::sort(list.begin(), list.end());
-//! [13]
-
-
-//! [14]
-QStringList list;
-list << "Julia" << "Mike" << "Mike" << "Julia" << "Julia";
-
-QSet<QString> set = QSet<QString>::fromList(list);
-set.contains("Julia"); // returns true
-set.contains("Mike"); // returns true
-set.size(); // returns 2
-//! [14]
diff --git a/src/corelib/doc/snippets/code/doc_src_qvarlengtharray.cpp b/src/corelib/doc/snippets/code/doc_src_qvarlengtharray.cpp
index 1cbbffc0e4..080874fc77 100644
--- a/src/corelib/doc/snippets/code/doc_src_qvarlengtharray.cpp
+++ b/src/corelib/doc/snippets/code/doc_src_qvarlengtharray.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [0]
int myfunc(int n)
diff --git a/src/corelib/doc/snippets/code/doc_src_resources.cpp b/src/corelib/doc/snippets/code/doc_src_resources.cpp
index b3c556d09a..04ecf810ec 100644
--- a/src/corelib/doc/snippets/code/doc_src_resources.cpp
+++ b/src/corelib/doc/snippets/code/doc_src_resources.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [4]
QResource::registerResource("/path/to/myresource.rcc");
@@ -62,16 +15,3 @@ MyClass::MyClass() : BaseClass()
...
}
//! [5]
-
-
-//! [6]
-int main(int argc, char *argv[])
-{
- QApplication app(argc, argv);
- Q_INIT_RESOURCE(graphlib);
-
- QFile file(":/graph.png");
- ...
- return app.exec();
-}
-//! [6]
diff --git a/src/corelib/doc/snippets/code/doc_src_resources.qdoc b/src/corelib/doc/snippets/code/doc_src_resources.qdoc
index 9cea681a68..70c2a7b7ab 100644
--- a/src/corelib/doc/snippets/code/doc_src_resources.qdoc
+++ b/src/corelib/doc/snippets/code/doc_src_resources.qdoc
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
//! [0]
<file alias="cut-img.png">images/cut.png</file>
@@ -73,3 +26,7 @@
//! [3]
rcc -binary myresource.qrc -o myresource.rcc
//! [3]
+
+//! [4]
+<file empty="true">Button.qml</file>
+//! [4]
diff --git a/src/corelib/doc/snippets/code/qlogging/qlogging.cpp b/src/corelib/doc/snippets/code/qlogging/qlogging.cpp
index 8b7104cba5..e61eb70df3 100644
--- a/src/corelib/doc/snippets/code/qlogging/qlogging.cpp
+++ b/src/corelib/doc/snippets/code/qlogging/qlogging.cpp
@@ -1,61 +1,16 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+#undef QT_NO_FOREACH // this file contains unported legacy Q_FOREACH uses
#include <QtGui>
#include <QtDebug>
-#include <QDeclarativeComponent>
+#include <QQmlComponent>
//! [1]
- void statusChanged(QDeclarativeComponent::Status status) {
- if (status == QDeclarativeComponent::Error) {
- foreach (const QDeclarativeError &error, component->errors()) {
+ void statusChanged(QQmlComponent::Status status) {
+ if (status == QQmlComponent::Error) {
+ for (const QQmlError &error: std::as_const(component->errors())) {
const QByteArray file = error.url().toEncoded();
QMessageLogger(file.constData(), error.line(), 0).debug() << error.description();
}
diff --git a/src/corelib/doc/snippets/code/src_corelib_animation_qparallelanimationgroup.cpp b/src/corelib/doc/snippets/code/src_corelib_animation_qparallelanimationgroup.cpp
index 472c5d41c4..6328cb0011 100644
--- a/src/corelib/doc/snippets/code/src_corelib_animation_qparallelanimationgroup.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_animation_qparallelanimationgroup.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2018 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2018 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [0]
QParallelAnimationGroup *group = new QParallelAnimationGroup;
diff --git a/src/corelib/doc/snippets/code/src_corelib_animation_qpropertyanimation.cpp b/src/corelib/doc/snippets/code/src_corelib_animation_qpropertyanimation.cpp
index 7bd8121b90..4b77ab607d 100644
--- a/src/corelib/doc/snippets/code/src_corelib_animation_qpropertyanimation.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_animation_qpropertyanimation.cpp
@@ -1,59 +1,95 @@
-/****************************************************************************
-**
-** Copyright (C) 2018 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2018 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [0]
- QPropertyAnimation *animation = new QPropertyAnimation(myWidget, "geometry");
- animation->setDuration(10000);
- animation->setStartValue(QRect(0, 0, 100, 30));
- animation->setEndValue(QRect(250, 250, 100, 30));
+#include <QApplication>
+#include <QPushButton>
+#include <QPropertyAnimation>
- animation->start();
+class MyButtonWidget : public QWidget
+{
+public:
+ MyButtonWidget(QWidget *parent = nullptr);
+};
+
+MyButtonWidget::MyButtonWidget(QWidget *parent) : QWidget(parent)
+{
+ QPushButton *button = new QPushButton(tr("Animated Button"), this);
+ QPropertyAnimation *anim = new QPropertyAnimation(button, "pos", this);
+ anim->setDuration(10000);
+ anim->setStartValue(QPoint(0, 0));
+ anim->setEndValue(QPoint(100, 250));
+ anim->start();
+}
+
+int main(int argc, char *argv[])
+{
+ QApplication a(argc, argv);
+ MyButtonWidget buttonAnimWidget;
+ buttonAnimWidget.resize(QSize(800, 600));
+ buttonAnimWidget.show();
+ return a.exec();
+}
//! [0]
+
+
+//! [easing-curve]
+MyButtonWidget::MyButtonWidget(QWidget *parent) : QWidget(parent)
+{
+ QPushButton *button = new QPushButton(tr("Animated Button"), this);
+ QPropertyAnimation *anim = new QPropertyAnimation(button, "pos", this);
+ anim->setDuration(10000);
+ anim->setStartValue(QPoint(0, 0));
+ anim->setEndValue(QPoint(100, 250));
+ anim->setEasingCurve(QEasingCurve::OutBounce);
+ anim->start();
+}
+//! [easing-curve]
+
+
+//! [animation-group1]
+MyButtonWidget::MyButtonWidget(QWidget *parent) : QWidget(parent)
+{
+ QPushButton *bonnie = new QPushButton(tr("Bonnie"), this);
+ QPushButton *clyde = new QPushButton(tr("Clyde"), this);
+
+ QPropertyAnimation *anim1 = new QPropertyAnimation(bonnie, "pos", this);
+ anim1->setDuration(3000);
+ anim1->setStartValue(QPoint(0, 0));
+ anim1->setEndValue(QPoint(100, 250));
+
+ QPropertyAnimation *anim2 = new QPropertyAnimation(clyde, "pos", this);
+ anim2->setDuration(3000);
+ anim2->setStartValue(QPoint(100, 250));
+ anim2->setEndValue(QPoint(500, 500));
+
+ QParallelAnimationGroup *parallelAnim = new QParallelAnimationGroup;
+ parallelAnim->addAnimation(anim1);
+ parallelAnim->addAnimation(anim2);
+ parallelAnim->start();
+}
+//! [animation-group1]
+
+//! [animation-group2]
+MyButtonWidget::MyButtonWidget(QWidget *parent) : QWidget(parent)
+{
+ QPushButton *bonnie = new QPushButton(tr("Bonnie"), this);
+ QPushButton *clyde = new QPushButton(tr("Clyde"), this);
+
+ QPropertyAnimation *anim1 = new QPropertyAnimation(bonnie, "pos", this);
+ anim1->setDuration(3000);
+ anim1->setStartValue(QPoint(0, 0));
+ anim1->setEndValue(QPoint(100, 250));
+
+ QPropertyAnimation *anim2 = new QPropertyAnimation(clyde, "pos", this);
+ anim2->setDuration(3000);
+ anim2->setStartValue(QPoint(0, 0));
+ anim2->setEndValue(QPoint(200, 250));
+
+ QSequentialAnimationGroup *sequenceAnim = new QSequentialAnimationGroup;
+ sequenceAnim->addAnimation(anim1);
+ sequenceAnim->addAnimation(anim2);
+ sequenceAnim->start();
+}
+//! [animation-group2]
diff --git a/src/corelib/doc/snippets/code/src_corelib_animation_qsequentialanimationgroup.cpp b/src/corelib/doc/snippets/code/src_corelib_animation_qsequentialanimationgroup.cpp
index 0eff184926..a429fe20b2 100644
--- a/src/corelib/doc/snippets/code/src_corelib_animation_qsequentialanimationgroup.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_animation_qsequentialanimationgroup.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2018 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2018 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [0]
QSequentialAnimationGroup *group = new QSequentialAnimationGroup;
diff --git a/src/corelib/doc/snippets/code/src_corelib_animation_qvariantanimation.cpp b/src/corelib/doc/snippets/code/src_corelib_animation_qvariantanimation.cpp
index 0808dcc145..be7f549f65 100644
--- a/src/corelib/doc/snippets/code/src_corelib_animation_qvariantanimation.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_animation_qvariantanimation.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2018 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2018 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [0]
QVariant myColorInterpolator(const QColor &start, const QColor &end, qreal progress)
diff --git a/src/corelib/doc/snippets/code/src_corelib_concurrent_qthreadpool.cpp b/src/corelib/doc/snippets/code/src_corelib_concurrent_qthreadpool.cpp
index 8490942048..4cba70e62d 100644
--- a/src/corelib/doc/snippets/code/src_corelib_concurrent_qthreadpool.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_concurrent_qthreadpool.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [0]
class HelloWorldTask : public QRunnable
diff --git a/src/corelib/doc/snippets/code/src_corelib_global_qglobal.cpp b/src/corelib/doc/snippets/code/src_corelib_global_qglobal.cpp
index 4d43226df9..25d3abf67e 100644
--- a/src/corelib/doc/snippets/code/src_corelib_global_qglobal.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_global_qglobal.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [0]
label->setAlignment(Qt::AlignLeft | Qt::AlignTop);
@@ -79,17 +32,6 @@ Q_FLAG(Options)
typedef QFlags<Enum> Flags;
//! [2]
-
-//! [3]
-int myValue = 10;
-int minValue = 2;
-int maxValue = 6;
-
-int boundedValue = qBound(minValue, myValue, maxValue);
-// boundedValue == 6
-//! [3]
-
-
//! [4]
if (!driver()->isOpen() || driver()->isOpenError()) {
qWarning("QSqlQuery::exec: database not open");
@@ -108,11 +50,6 @@ quint64 value = Q_UINT64_C(932838457459459);
//! [6]
-//! [7]
-void myMsgHandler(QtMsgType, const char *);
-//! [7]
-
-
//! [8]
qint64 value = Q_INT64_C(932838457459459);
//! [8]
@@ -273,37 +210,26 @@ const TInputType &myMin(const TInputType &value1, const TInputType &value2)
//! [23]
-#include <qapplication.h>
+#include <QApplication>
#include <stdio.h>
#include <stdlib.h>
-void myMessageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg)
+QtMessageHandler originalHandler = nullptr;
+
+void logToFile(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
- QByteArray localMsg = msg.toLocal8Bit();
- const char *file = context.file ? context.file : "";
- const char *function = context.function ? context.function : "";
- switch (type) {
- case QtDebugMsg:
- fprintf(stderr, "Debug: %s (%s:%u, %s)\n", localMsg.constData(), file, context.line, function);
- break;
- case QtInfoMsg:
- fprintf(stderr, "Info: %s (%s:%u, %s)\n", localMsg.constData(), file, context.line, function);
- break;
- case QtWarningMsg:
- fprintf(stderr, "Warning: %s (%s:%u, %s)\n", localMsg.constData(), file, context.line, function);
- break;
- case QtCriticalMsg:
- fprintf(stderr, "Critical: %s (%s:%u, %s)\n", localMsg.constData(), file, context.line, function);
- break;
- case QtFatalMsg:
- fprintf(stderr, "Fatal: %s (%s:%u, %s)\n", localMsg.constData(), file, context.line, function);
- break;
- }
+ QString message = qFormatLogMessage(type, context, msg);
+ static FILE *f = fopen("log.txt", "a");
+ fprintf(f, "%s\n", qPrintable(message));
+ fflush(f);
+
+ if (originalHandler)
+ *originalHandler(type, context, msg);
}
int main(int argc, char **argv)
{
- qInstallMessageHandler(myMessageOutput);
+ originalHandler = qInstallMessageHandler(logToFile);
QApplication app(argc, argv);
...
return app.exec();
@@ -527,16 +453,6 @@ QString result(int type, int n)
}
//! [qttrid_n_noop]
-//! [37]
-qWarning("%s: %s", qUtf8Printable(key), qUtf8Printable(value));
-//! [37]
-
-
-//! [qUtf16Printable]
-qWarning("%ls: %ls", qUtf16Printable(key), qUtf16Printable(value));
-//! [qUtf16Printable]
-
-
//! [38]
struct Point2D
{
@@ -636,11 +552,6 @@ qFuzzyCompare(0.0, 1.0e-200); // This will return false
qFuzzyCompare(1 + 0.0, 1 + 1.0e-200); // This will return true
//! [46]
-//! [47]
-CApaApplication *myApplicationFactory();
-//! [47]
-
-
//! [49]
void myMessageHandler(QtMsgType, const QMessageLogContext &, const QString &);
//! [49]
@@ -668,11 +579,6 @@ template<> class QTypeInfo<A> : public QTypeInfoMerger<A, B, C, D> {};
... qOverload<int, const QString &>(&Foo::overloadedFunction)
//! [52]
-//! [53]
- ... QOverload<>::of(&Foo::overloadedFunction)
- ... QOverload<int, const QString &>::of(&Foo::overloadedFunction)
-//! [53]
-
//! [54]
struct Foo {
void overloadedFunction(int, const QString &);
diff --git a/src/corelib/doc/snippets/code/src_corelib_global_qlogging.cpp b/src/corelib/doc/snippets/code/src_corelib_global_qlogging.cpp
index 7589050bc2..d04e243b71 100644
--- a/src/corelib/doc/snippets/code/src_corelib_global_qlogging.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_global_qlogging.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2018 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2018 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [0]
QT_MESSAGE_PATTERN="[%{time yyyyMMdd h:mm:ss.zzz t} %{if-debug}D%{endif}%{if-info}I%{endif}%{if-warning}W%{endif}%{if-critical}C%{endif}%{if-fatal}F%{endif}] %{file}:%{line} - %{message}"
diff --git a/src/corelib/doc/snippets/code/src_corelib_global_qnumeric.cpp b/src/corelib/doc/snippets/code/src_corelib_global_qnumeric.cpp
index d281089041..d88675d8f1 100644
--- a/src/corelib/doc/snippets/code/src_corelib_global_qnumeric.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_global_qnumeric.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2018 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2018 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [0]
if (qFloatDistance(a, b) < (1 << 7)) { // The last 7 bits are not
diff --git a/src/corelib/doc/snippets/code/src_corelib_global_qoperatingsystemversion.cpp b/src/corelib/doc/snippets/code/src_corelib_global_qoperatingsystemversion.cpp
index c712dfa432..d86d40bc98 100644
--- a/src/corelib/doc/snippets/code/src_corelib_global_qoperatingsystemversion.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_global_qoperatingsystemversion.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2018 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2018 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [0]
QOperatingSystemVersion::current() >= QOperatingSystemVersion(QOperatingSystemVersion::IOS, 9)
diff --git a/src/corelib/doc/snippets/code/src_corelib_global_qrandom.cpp b/src/corelib/doc/snippets/code/src_corelib_global_qrandom.cpp
index d0813ef824..8be3f91120 100644
--- a/src/corelib/doc/snippets/code/src_corelib_global_qrandom.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_global_qrandom.cpp
@@ -1,53 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2018 Intel Corporation.
-** Copyright (C) 2018 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2018 Intel Corporation.
+// Copyright (C) 2018 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [0]
quint32 value = QRandomGenerator::global()->generate();
diff --git a/src/corelib/doc/snippets/code/src_corelib_io_qabstractfileengine.cpp b/src/corelib/doc/snippets/code/src_corelib_io_qabstractfileengine.cpp
index ae2f305313..4300fc2da9 100644
--- a/src/corelib/doc/snippets/code/src_corelib_io_qabstractfileengine.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_io_qabstractfileengine.cpp
@@ -1,64 +1,21 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+using namespace Qt::StringLiterals;
//! [0]
class ZipEngineHandler : public QAbstractFileEngineHandler
{
public:
- QAbstractFileEngine *create(const QString &fileName) const override;
+ std::unique_ptr<QAbstractFileEngine> create(const QString &fileName) const override;
};
-QAbstractFileEngine *ZipEngineHandler::create(const QString &fileName) const
+std::unique_ptr<QAbstractFileEngine> ZipEngineHandler::create(const QString &fileName) const
{
// ZipEngineHandler returns a ZipEngine for all .zip files
- return fileName.toLower().endsWith(".zip") ? new ZipEngine(fileName) : 0;
+ if (fileName.toLower().endsWith(".zip"_L1))
+ return std::make_unique<ZipEngine>(fileName);
+ return {};
}
int main(int argc, char **argv)
@@ -74,21 +31,24 @@ int main(int argc, char **argv)
}
//! [0]
-
//! [1]
-QAbstractSocketEngine *ZipEngineHandler::create(const QString &fileName) const
+std::unique_ptr<QAbstractFileEngine> ZipEngineHandler::create(const QString &fileName) const
{
// ZipEngineHandler returns a ZipEngine for all .zip files
- return fileName.toLower().endsWith(".zip") ? new ZipEngine(fileName) : 0;
+ if (fileName.toLower().endsWith(".zip"_L1))
+ return std::make_unique<ZipEngine>(fileName);
+ else
+ return {};
}
//! [1]
//! [2]
-QAbstractFileEngineIterator *
-CustomFileEngine::beginEntryList(QDir::Filters filters, const QStringList &filterNames)
+QAbstractFileEngine::IteratorUniquePtr
+CustomFileEngine::beginEntryList(const QString &path, QDir::Filters filters,
+ const QStringList &filterNames)
{
- return new CustomFileEngineIterator(filters, filterNames);
+ return std::make_unique<CustomFileEngineIterator>(path, filters, filterNames);
}
//! [2]
@@ -97,25 +57,23 @@ CustomFileEngine::beginEntryList(QDir::Filters filters, const QStringList &filte
class CustomIterator : public QAbstractFileEngineIterator
{
public:
- CustomIterator(const QStringList &nameFilters, QDir::Filters filters)
- : QAbstractFileEngineIterator(nameFilters, filters), index(0)
+ CustomIterator(const QString &path, const QStringList &nameFilters, QDir::Filters filters)
+ : QAbstractFileEngineIterator(path, nameFilters, filters), index(0)
{
// In a real iterator, these entries are fetched from the
// file system based on the value of path().
entries << "entry1" << "entry2" << "entry3";
}
- bool hasNext() const override
- {
- return index < entries.size() - 1;
- }
-
- QString next() override
+ bool advance() override
{
- if (!hasNext())
- return QString();
- ++index;
- return currentFilePath();
+ if (entries.isEmpty())
+ return false;
+ if (index < entries.size() - 1) {
+ ++index;
+ return true;
+ }
+ return false;
}
QString currentFileName() override
diff --git a/src/corelib/doc/snippets/code/src_corelib_io_qdatastream.cpp b/src/corelib/doc/snippets/code/src_corelib_io_qdatastream.cpp
index efc06d8c62..3075913a95 100644
--- a/src/corelib/doc/snippets/code/src_corelib_io_qdatastream.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_io_qdatastream.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
void wrapInFunction()
{
diff --git a/src/corelib/doc/snippets/code/src_corelib_io_qdebug.cpp b/src/corelib/doc/snippets/code/src_corelib_io_qdebug.cpp
index 5154dc5d68..5411ab34f6 100644
--- a/src/corelib/doc/snippets/code/src_corelib_io_qdebug.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_io_qdebug.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2018 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2018 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [0]
QString s;
diff --git a/src/corelib/doc/snippets/code/src_corelib_io_qdir.cpp b/src/corelib/doc/snippets/code/src_corelib_io_qdir.cpp
index 3b9435f022..400b3225d0 100644
--- a/src/corelib/doc/snippets/code/src_corelib_io_qdir.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_io_qdir.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
void wrapInFunction()
@@ -54,7 +7,7 @@ void wrapInFunction()
//! [0]
QDir("/home/user/Documents")
-QDir("C:/Documents and Settings")
+QDir("C:/Users")
//! [0]
@@ -154,7 +107,7 @@ if (d1 != d2)
//! [12]
-C:/Documents and Settings/Username
+C:/Users/Username
//! [12]
diff --git a/src/corelib/doc/snippets/code/src_corelib_io_qdiriterator.cpp b/src/corelib/doc/snippets/code/src_corelib_io_qdiriterator.cpp
index 56cf9ed699..ec3f3adc50 100644
--- a/src/corelib/doc/snippets/code/src_corelib_io_qdiriterator.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_io_qdiriterator.cpp
@@ -1,58 +1,11 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [0]
QDirIterator it("/etc", QDirIterator::Subdirectories);
while (it.hasNext()) {
- qDebug() << it.next();
-
+ QString dir = it.next();
+ qDebug() << dir;
// /etc/.
// /etc/..
// /etc/X11
diff --git a/src/corelib/doc/snippets/code/src_corelib_io_qdirlisting.cpp b/src/corelib/doc/snippets/code/src_corelib_io_qdirlisting.cpp
new file mode 100644
index 0000000000..231bf48d26
--- /dev/null
+++ b/src/corelib/doc/snippets/code/src_corelib_io_qdirlisting.cpp
@@ -0,0 +1,70 @@
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+#include <QDirListing>
+
+using namespace Qt::StringLiterals;
+
+[[maybe_unused]] static void func() {
+{
+//! [0]
+using ItFlag = QDirListing::IteratorFlag;
+for (const auto &dirEntry : QDirListing(u"/etc"_s, ItFlag::Recursive)) {
+ qDebug() << dirEntry.filePath();
+ // /etc/.
+ // /etc/..
+ // /etc/X11
+ // /etc/X11/fs
+ // ...
+}
+//! [0]
+}
+
+{
+//! [1]
+using ItFlag = QDirListing::IteratorFlag;
+QDirListing dirList(u"/sys"_s, QStringList{u"scaling_cur_freq"_s},
+ QDir::NoFilter, ItFlag::Recursive);
+for (const auto &dirEntry : dirList) {
+ QFile f(dirEntry.filePath());
+ f.open(QIODevice::ReadOnly);
+ qDebug() << f.fileName() << f.readAll().trimmed().toDouble() / 1000 << "MHz";
+}
+//! [1]
+}
+
+{
+//! [2]
+QDirListing audioFileIt(u"/home/johndoe/"_s, {"*.mp3", "*.wav"}, QDir::Files);
+//! [2]
+}
+
+{
+//! [3]
+using ItFlag = QDirListing::IteratorFlag;
+for (const auto &dirEntry : QDirListing(u"/etc"_s, ItFlag::Recursive)) {
+ // Faster
+ if (dirEntry.fileName().endsWith(u".conf")) { /* ... */ }
+
+ // This works, but might be potentially slower, since it has to construct a
+ // QFileInfo, whereas (depending on the implemnetation) the fileName could
+ // be known already
+ if (dirEntry.fileInfo().fileName().endsWith(u".conf")) { /* ... */ }
+}
+//! [3]
+}
+
+{
+//! [4]
+using ItFlag = QDirListing::IteratorFlag;
+for (const auto &dirEntry : QDirListing(u"/etc"_s, ItFlag::Recursive)) {
+ // Both approaches are the same, because DirEntry will have to construct
+ // a QFileInfo to get this info (for example, by calling system stat())
+
+ if (dirEntry.size() >= 4'000 /* 4KB */) { /* ...*/ }
+ if (dirEntry.fileInfo().size() >= 4'000 /* 4KB */) { /* ... */ }
+}
+//! [4]
+}
+
+}
diff --git a/src/corelib/doc/snippets/code/src_corelib_io_qfile.cpp b/src/corelib/doc/snippets/code/src_corelib_io_qfile.cpp
index 4123fe4996..3a8f7d2747 100644
--- a/src/corelib/doc/snippets/code/src_corelib_io_qfile.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_io_qfile.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [0]
QFile file;
@@ -57,16 +10,6 @@ file.open(QIODevice::ReadOnly); // opens "/home/readme.txt" under Unix
//! [0]
-//! [1]
-QByteArray myEncoderFunc(const QString &fileName);
-//! [1]
-
-
-//! [2]
-QString myDecoderFunc(const QByteArray &localFileName);
-//! [2]
-
-
//! [3]
#include <stdio.h>
diff --git a/src/corelib/doc/snippets/code/src_corelib_io_qfileinfo.cpp b/src/corelib/doc/snippets/code/src_corelib_io_qfileinfo.cpp
index d81360ee5b..a8dd621111 100644
--- a/src/corelib/doc/snippets/code/src_corelib_io_qfileinfo.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_io_qfileinfo.cpp
@@ -1,58 +1,21 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+#include <QDir>
+#include <QFileInfo>
+using namespace Qt::StringLiterals;
+
+[[maybe_unused]] static void func()
+{
+{
//![newstuff]
- QFileInfo fi("c:/temp/foo"); => fi.absoluteFilePath() => "C:/temp/foo"
+ QFileInfo fi("c:/temp/foo");
+ qDebug() << fi.absoluteFilePath(); // "C:/temp/foo"
//![newstuff]
+}
+{
//! [0]
#ifdef Q_OS_UNIX
@@ -69,15 +32,15 @@ info2.size(); // returns 56201
#endif
//! [0]
-
+}
//! [1]
#ifdef Q_OS_WIN
-QFileInfo info1("C:\\Documents and Settings\\Bob\\untabify.lnk");
+QFileInfo info1("C:\\Users\\Bob\\untabify.lnk");
info1.isSymLink(); // returns true
-info1.absoluteFilePath(); // returns "C:/Documents and Settings/Bob/untabify.lnk"
-info1.size(); // returns 743
+info1.absoluteFilePath(); // returns "C:/Users/Bob/untabify.lnk"
+info1.size(); // returns 63942
info1.symLinkTarget(); // returns "C:/Pretty++/untabify"
QFileInfo info2(info1.symLinkTarget());
@@ -88,7 +51,7 @@ info2.size(); // returns 63942
#endif
//! [1]
-
+{
//! [2]
QFileInfo info("/usr/bin/env");
@@ -100,50 +63,60 @@ info.setFile("/etc/hosts");
path = info.absolutePath(); // path = /etc
base = info.baseName(); // base = hosts
//! [2]
+}
+{
//! [3]
QFileInfo fi("/tmp/archive.tar.gz");
QString name = fi.fileName(); // name = "archive.tar.gz"
//! [3]
+}
-
+{
//! [4]
QFileInfo fi("/Applications/Safari.app");
QString bundle = fi.bundleName(); // name = "Safari"
//! [4]
+}
-
+{
//! [5]
QFileInfo fi("/tmp/archive.tar.gz");
QString base = fi.baseName(); // base = "archive"
//! [5]
+}
-
+{
//! [6]
QFileInfo fi("/tmp/archive.tar.gz");
QString base = fi.completeBaseName(); // base = "archive.tar"
//! [6]
+}
-
+{
//! [7]
QFileInfo fi("/tmp/archive.tar.gz");
QString ext = fi.completeSuffix(); // ext = "tar.gz"
//! [7]
+}
-
+{
//! [8]
QFileInfo fi("/tmp/archive.tar.gz");
QString ext = fi.suffix(); // ext = "gz"
//! [8]
+}
-
+{
+QString fileName = "foo";
//! [9]
QFileInfo info(fileName);
if (info.isSymLink())
fileName = info.symLinkTarget();
//! [9]
+}
-
+{
//! [10]
QFileInfo fi("/tmp/archive.tar.gz");
if (fi.permission(QFile::WriteUser | QFile::ReadGroup))
@@ -151,3 +124,24 @@ if (fi.permission(QFile::WriteUser | QFile::ReadGroup))
if (fi.permission(QFile::WriteGroup | QFile::WriteOther))
qWarning("The group or others can change the file");
//! [10]
+}
+
+{
+//! [11]
+// Given a current working directory of "/home/user/Documents/memos/"
+QFileInfo info1(u"relativeFile"_s);
+qDebug() << info1.absolutePath(); // "/home/user/Documents/memos/"
+qDebug() << info1.baseName(); // "relativeFile"
+qDebug() << info1.absoluteDir(); // QDir(u"/home/user/Documents/memos"_s)
+qDebug() << info1.absoluteDir().path(); // "/home/user/Documents/memos"
+
+// A QFileInfo on a dir
+QFileInfo info2(u"/home/user/Documents/memos"_s);
+qDebug() << info2.absolutePath(); // "/home/user/Documents"
+qDebug() << info2.baseName(); // "memos"
+qDebug() << info2.absoluteDir(); // QDir(u"/home/user/Documents"_s)
+qDebug() << info2.absoluteDir().path(); // "/home/user/Documents"
+//! [11]
+}
+
+}
diff --git a/src/corelib/doc/snippets/code/src_corelib_io_qfileselector.cpp b/src/corelib/doc/snippets/code/src_corelib_io_qfileselector.cpp
index 0d1aa691cf..facf037f46 100644
--- a/src/corelib/doc/snippets/code/src_corelib_io_qfileselector.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_io_qfileselector.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2018 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2018 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [0]
QString defaultsBasePath = "data/";
diff --git a/src/corelib/doc/snippets/code/src_corelib_io_qiodevice.cpp b/src/corelib/doc/snippets/code/src_corelib_io_qiodevice.cpp
index 981f6b3f12..dc58d722c3 100644
--- a/src/corelib/doc/snippets/code/src_corelib_io_qiodevice.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_io_qiodevice.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [0]
QProcess gzip;
diff --git a/src/corelib/doc/snippets/code/src_corelib_io_qloggingcategory.cpp b/src/corelib/doc/snippets/code/src_corelib_io_qloggingcategory.cpp
index cab48f1e27..0a7a718e31 100644
--- a/src/corelib/doc/snippets/code/src_corelib_io_qloggingcategory.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_io_qloggingcategory.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2018 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2018 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [0]
<category>[.<type>] = true|false
diff --git a/src/corelib/doc/snippets/code/src_corelib_io_qprocess.cpp b/src/corelib/doc/snippets/code/src_corelib_io_qprocess.cpp
index 3ec7791bd6..765c1e41cf 100644
--- a/src/corelib/doc/snippets/code/src_corelib_io_qprocess.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_io_qprocess.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
void wrapInFunction()
diff --git a/src/corelib/doc/snippets/code/src_corelib_io_qsettings.cpp b/src/corelib/doc/snippets/code/src_corelib_io_qsettings.cpp
index 08ab1fb338..5774add2a7 100644
--- a/src/corelib/doc/snippets/code/src_corelib_io_qsettings.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_io_qsettings.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [0]
QSettings settings("MySoft", "Star Runner");
@@ -92,7 +45,7 @@ settings.value("HKEY_CURRENT_USER\\MySoft\\Star Runner\\Galaxy\\Default"); // re
//! [7]
-#ifdef Q_OS_MAC
+#ifdef Q_OS_DARWIN
QSettings settings("grenoullelogique.fr", "Squash");
#else
QSettings settings("Grenoulle Logique", "Squash");
@@ -185,10 +138,10 @@ QList<Login> logins;
QSettings settings;
settings.beginWriteArray("logins");
-for (int i = 0; i < logins.size(); ++i) {
+for (qsizetype i = 0; i < logins.size(); ++i) {
settings.setArrayIndex(i);
- settings.setValue("userName", list.at(i).userName);
- settings.setValue("password", list.at(i).password);
+ settings.setValue("userName", logins.at(i).userName);
+ settings.setValue("password", logins.at(i).password);
}
settings.endArray();
//! [16]
diff --git a/src/corelib/doc/snippets/code/src_corelib_io_qstorageinfo.cpp b/src/corelib/doc/snippets/code/src_corelib_io_qstorageinfo.cpp
index c7a1b34f7a..93029274b1 100644
--- a/src/corelib/doc/snippets/code/src_corelib_io_qstorageinfo.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_io_qstorageinfo.cpp
@@ -1,52 +1,7 @@
-/****************************************************************************
-**
-** Copyright (C) 2014 Ivan Komissarov
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2014 Ivan Komissarov
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+#undef QT_NO_FOREACH // this file contains unported legacy Q_FOREACH uses
//! [0]
QStorageInfo storage(qApp->applicationDirPath());
diff --git a/src/corelib/doc/snippets/code/src_corelib_io_qtemporarydir.cpp b/src/corelib/doc/snippets/code/src_corelib_io_qtemporarydir.cpp
index 0fab8566e5..037cf8a36d 100644
--- a/src/corelib/doc/snippets/code/src_corelib_io_qtemporarydir.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_io_qtemporarydir.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
{
//! [0]
diff --git a/src/corelib/doc/snippets/code/src_corelib_io_qtemporaryfile.cpp b/src/corelib/doc/snippets/code/src_corelib_io_qtemporaryfile.cpp
index 4e864b3dcd..76adfd3128 100644
--- a/src/corelib/doc/snippets/code/src_corelib_io_qtemporaryfile.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_io_qtemporaryfile.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
{
//! [0]
diff --git a/src/corelib/doc/snippets/code/src_corelib_io_qtextstream.cpp b/src/corelib/doc/snippets/code/src_corelib_io_qtextstream.cpp
index 4795650748..75a04e654f 100644
--- a/src/corelib/doc/snippets/code/src_corelib_io_qtextstream.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_io_qtextstream.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [0]
QFile data("output.txt");
@@ -131,9 +84,3 @@ out << "Qt rocks!" << Qt::endl;
//! [9]
stream << '\n' << Qt::flush;
//! [9]
-
-
-//! [10]
-QTextStream out(&file);
-out.setEncoding(QStringConverter::Utf8);
-//! [10]
diff --git a/src/corelib/doc/snippets/code/src_corelib_io_qurl.cpp b/src/corelib/doc/snippets/code/src_corelib_io_qurl.cpp
index e3c3005c33..945f3ae3e7 100644
--- a/src/corelib/doc/snippets/code/src_corelib_io_qurl.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_io_qurl.cpp
@@ -1,52 +1,13 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+//! [constructor-url-reference]
+QUrl url("example.com");
+//! [constructor-url-reference]
+
+//! [constructor-url]
+QUrl url("https://example.com");
+//! [constructor-url]
//! [0]
QUrl url("http://www.example.com/List of holidays.xml");
@@ -78,7 +39,7 @@ sock.connectToHost(url.host(), url.port(80));
//! [4]
-http://www.example.com/cgi-bin/drawgraph.cgi?type(pie)color(green)
+http://www.example.com/cgi-bin/drawgraph.cgi?type,pie;color,green
//! [4]
diff --git a/src/corelib/doc/snippets/code/src_corelib_io_qurlquery.cpp b/src/corelib/doc/snippets/code/src_corelib_io_qurlquery.cpp
index 22f1d3260f..c2085fddc3 100644
--- a/src/corelib/doc/snippets/code/src_corelib_io_qurlquery.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_io_qurlquery.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2018 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2018 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [0]
sub-delims = "!" / "$" / "&" / "'" / "(" / ")"
diff --git a/src/corelib/doc/snippets/code/src_corelib_kernel_qabstractitemmodel.cpp b/src/corelib/doc/snippets/code/src_corelib_kernel_qabstractitemmodel.cpp
index 397f6f72af..4fd7f97ae8 100644
--- a/src/corelib/doc/snippets/code/src_corelib_kernel_qabstractitemmodel.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_kernel_qabstractitemmodel.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [0]
beginInsertRows(parent, 2, 4);
@@ -97,16 +50,6 @@ beginMoveRows(parent, 2, 2, parent, 0);
beginMoveRows(parent, 2, 2, parent, 4);
//! [9]
-//! [10]
-myData.clear();
-reset();
-//! [10]
-
-//! [11]
-beginResetModel();
-myData.clear();
-endResetModel();
-//! [11]
//! [12]
class CustomDataProxy : public QSortFilterProxyModel
diff --git a/src/corelib/doc/snippets/code/src_corelib_kernel_qabstractnativeeventfilter.cpp b/src/corelib/doc/snippets/code/src_corelib_kernel_qabstractnativeeventfilter.cpp
index 061a83278e..62844e08cb 100644
--- a/src/corelib/doc/snippets/code/src_corelib_kernel_qabstractnativeeventfilter.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_kernel_qabstractnativeeventfilter.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [0]
class MyXcbEventFilter : public QAbstractNativeEventFilter
diff --git a/src/corelib/doc/snippets/code/src_corelib_kernel_qabstractnativeeventfilter.h b/src/corelib/doc/snippets/code/src_corelib_kernel_qabstractnativeeventfilter.h
index 40e6ef97ea..905a79b105 100644
--- a/src/corelib/doc/snippets/code/src_corelib_kernel_qabstractnativeeventfilter.h
+++ b/src/corelib/doc/snippets/code/src_corelib_kernel_qabstractnativeeventfilter.h
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 Samuel Gaist <samuel.gaist@edeltech.ch>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 Samuel Gaist <samuel.gaist@edeltech.ch>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [0]
#include <QAbstractNativeEventFilter>
diff --git a/src/corelib/doc/snippets/code/src_corelib_kernel_qabstractnativeeventfilter.mm b/src/corelib/doc/snippets/code/src_corelib_kernel_qabstractnativeeventfilter.mm
index 8ac5432313..fb6d602eaf 100644
--- a/src/corelib/doc/snippets/code/src_corelib_kernel_qabstractnativeeventfilter.mm
+++ b/src/corelib/doc/snippets/code/src_corelib_kernel_qabstractnativeeventfilter.mm
@@ -1,59 +1,12 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 Samuel Gaist <samuel.gaist@edeltech.ch>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 Samuel Gaist <samuel.gaist@edeltech.ch>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [0]
#include "mycocoaeventfilter.h"
#import <AppKit/AppKit.h>
-bool CocoaNativeEventFilter::nativeEventFilter(const QByteArray &eventType, void *message, qintptr *)
+bool MyCocoaEventFilter::nativeEventFilter(const QByteArray &eventType, void *message, qintptr *)
{
if (eventType == "mac_generic_NSEvent") {
NSEvent *event = static_cast<NSEvent *>(message);
diff --git a/src/corelib/doc/snippets/code/src_corelib_kernel_qabstractnativeeventfilter_win.cpp b/src/corelib/doc/snippets/code/src_corelib_kernel_qabstractnativeeventfilter_win.cpp
new file mode 100644
index 0000000000..de03f7b6d4
--- /dev/null
+++ b/src/corelib/doc/snippets/code/src_corelib_kernel_qabstractnativeeventfilter_win.cpp
@@ -0,0 +1,20 @@
+// Copyright (C) 2022 Laszlo Papp <lpapp@kde.org>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+//! [0]
+class MyMSGEventFilter : public QAbstractNativeEventFilter
+{
+public:
+ bool nativeEventFilter(const QByteArray &eventType, void *message, qintptr *) override
+ {
+ if (eventType == "windows_generic_MSG") {
+ MSG *msg = static_cast<MSG *>(message);
+ // ...
+ } else if (eventType == "windows_dispatcher_MSG") {
+ MSG *msg = static_cast<MSG *>(message);
+ // ...
+ }
+ return false;
+ }
+};
+//! [0]
diff --git a/src/corelib/doc/snippets/code/src_corelib_kernel_qcoreapplication.cpp b/src/corelib/doc/snippets/code/src_corelib_kernel_qcoreapplication.cpp
index 9ef08f1c6b..8087ff8f8b 100644
--- a/src/corelib/doc/snippets/code/src_corelib_kernel_qcoreapplication.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_kernel_qcoreapplication.cpp
@@ -1,52 +1,7 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+#undef QT_NO_FOREACH // this file contains unported legacy Q_FOREACH uses
//! [0]
QMouseEvent event(QEvent::MouseButtonPress, pos, 0, 0, 0);
@@ -60,12 +15,6 @@ connect(quitButton, &QPushButton::clicked, &app, &QCoreApplication::quit, Qt::Qu
//! [1]
-//! [2]
-foreach (const QString &path, app.libraryPaths())
- do_something(path);
-//! [2]
-
-
//! [3]
// Called once QCoreApplication exists
static void preRoutineMyDebugTool()
diff --git a/src/corelib/doc/snippets/code/src_corelib_kernel_qdeadlinetimer.cpp b/src/corelib/doc/snippets/code/src_corelib_kernel_qdeadlinetimer.cpp
index 5858b6a78d..f7440f2bb0 100644
--- a/src/corelib/doc/snippets/code/src_corelib_kernel_qdeadlinetimer.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_kernel_qdeadlinetimer.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2018 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2018 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [0]
void executeOperation(int msecs)
@@ -110,25 +63,25 @@
//! [7]
//! [8]
- return d1.deadlineNSecs() == d2.deadlineNSecs();
+ return lhs.deadlineNSecs() == rhs.deadlineNSecs();
//! [8]
//! [9]
- return d1.deadlineNSecs() != d2.deadlineNSecs();
+ return lhs.deadlineNSecs() != rhs.deadlineNSecs();
//! [9]
//! [10]
- return d1.deadlineNSecs() < d2.deadlineNSecs();
+ return lhs.deadlineNSecs() < rhs.deadlineNSecs();
//! [10]
//! [11]
- return d1.deadlineNSecs() <= d2.deadlineNSecs();
+ return lhs.deadlineNSecs() <= rhs.deadlineNSecs();
//! [11]
//! [12]
- return d1.deadlineNSecs() > d2.deadlineNSecs();
+ return lhs.deadlineNSecs() > rhs.deadlineNSecs();
//! [12]
//! [13]
- return d1.deadlineNSecs() >= d2.deadlineNSecs();
+ return lhs.deadlineNSecs() >= rhs.deadlineNSecs();
//! [13]
diff --git a/src/corelib/doc/snippets/code/src_corelib_kernel_qmath.cpp b/src/corelib/doc/snippets/code/src_corelib_kernel_qmath.cpp
index 329f7a494a..7d1d3bd98d 100644
--- a/src/corelib/doc/snippets/code/src_corelib_kernel_qmath.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_kernel_qmath.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 Laszlo Papp <lpapp@kde.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 Laszlo Papp <lpapp@kde.org>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [0]
float degrees = 180.0f
diff --git a/src/corelib/doc/snippets/code/src_corelib_kernel_qmetaobject.cpp b/src/corelib/doc/snippets/code/src_corelib_kernel_qmetaobject.cpp
index 56d1fa5a63..ec4646c520 100644
--- a/src/corelib/doc/snippets/code/src_corelib_kernel_qmetaobject.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_kernel_qmetaobject.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
void wrapInFunction()
@@ -81,6 +34,21 @@ QMetaObject::invokeMethod(thread, "quit",
QMetaObject::invokeMethod: Unable to handle unregistered datatype 'MyType'
//! [3]
+//! [invokemethod-no-macro]
+QString retVal;
+QMetaObject::invokeMethod(obj, "compute", Qt::DirectConnection,
+ qReturnArg(retVal),
+ QString("sqrt"), 42, 9.7);
+//! [invokemethod-no-macro]
+
+
+//! [invokemethod-no-macro-other-types]
+QString retVal;
+QMetaObject::invokeMethod(obj, "compute", Qt::DirectConnection,
+ qReturnArg(retVal),
+ QStringView("sqrt"), qsizetype(42), 9.7f);
+//! [invokemethod-no-macro-other-types]
+
//! [4]
QString retVal;
@@ -130,6 +98,24 @@ method.invoke(pushButton, Qt::QueuedConnection);
QMetaMethod::invoke: Unable to handle unregistered datatype 'MyType'
//! [7]
+//! [invoke-no-macro]
+QString retVal;
+QByteArray normalizedSignature = QMetaObject::normalizedSignature("compute(QString, int, double)");
+int methodIndex = obj->metaObject()->indexOfMethod(normalizedSignature);
+QMetaMethod method = obj->metaObject()->method(methodIndex);
+method.invoke(obj, Qt::DirectConnection, qReturnArg(retVal),
+ QString("sqrt"), 42, 9.7);
+//! [invoke-no-macro]
+
+//! [invoke-no-macro-other-types]
+QString retVal;
+QByteArray normalizedSignature = QMetaObject::normalizedSignature("compute(QByteArray, qint64, long double)");
+int methodIndex = obj->metaObject()->indexOfMethod(normalizedSignature);
+QMetaMethod method = obj->metaObject()->method(methodIndex);
+method.invoke(obj, Qt::DirectConnection, qReturnArg(retVal),
+ QByteArray("sqrt"), qint64(42), 9.7L);
+//! [invoke-no-macro-other-types]
+
//! [8]
QString retVal;
QByteArray normalizedSignature = QMetaObject::normalizedSignature("compute(QString, int, double)");
diff --git a/src/corelib/doc/snippets/code/src_corelib_kernel_qmetatype.cpp b/src/corelib/doc/snippets/code/src_corelib_kernel_qmetatype.cpp
index a91458cc95..757700786e 100644
--- a/src/corelib/doc/snippets/code/src_corelib_kernel_qmetatype.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_kernel_qmetatype.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [0]
struct MyStruct
@@ -82,12 +35,12 @@ MyStruct s2 = var.value<MyStruct>();
//! [3]
-int id = QMetaType::type("MyClass");
-if (id != QMetaType::UnknownType) {
- void *myClassPtr = QMetaType::create(id);
+QMetaType type = QMetaType::fromName("MyClass");
+if (type.isValid()) {
+ void *myClassPtr = type.create();
...
- QMetaType::destroy(id, myClassPtr);
- myClassPtr = 0;
+ type.destroy(myClassPtr);
+ myClassPtr = nullptr;
}
//! [3]
@@ -148,16 +101,6 @@ void someFunc()
//! [11]
-//! [12]
-QPointer<QFile> fp(new QFile);
-QVariant var = QVariant::fromValue(fp);
-// ...
-if (var.canConvert<QObject*>()) {
- QObject *sp = var.value<QObject*>();
- qDebug() << sp->metaObject()->className(); // Prints 'QFile'.
-}
-//! [12]
-
//! [13]
#include <memory>
diff --git a/src/corelib/doc/snippets/code/src_corelib_kernel_qmimedata.cpp b/src/corelib/doc/snippets/code/src_corelib_kernel_qmimedata.cpp
index a87c67dfed..c6a48c8827 100644
--- a/src/corelib/doc/snippets/code/src_corelib_kernel_qmimedata.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_kernel_qmimedata.cpp
@@ -1,52 +1,7 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+#undef QT_NO_FOREACH // this file contains unported legacy Q_FOREACH uses
//! [0]
void MyWidget::dragEnterEvent(QDragEnterEvent *event)
diff --git a/src/corelib/doc/snippets/code/src_corelib_kernel_qobject.cpp b/src/corelib/doc/snippets/code/src_corelib_kernel_qobject.cpp
index 8a007899e3..e3bbac7a3c 100644
--- a/src/corelib/doc/snippets/code/src_corelib_kernel_qobject.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_kernel_qobject.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [1]
QObject *obj = new QPushButton;
@@ -176,13 +129,6 @@ void MyObject::timerEvent(QTimerEvent *event)
//! [8]
-//! [9]
-QList<QObject *> list = window()->queryList("QAbstractButton"));
-foreach (QObject *obj, list)
- static_cast<QAbstractButton *>(obj)->setEnabled(false);
-//! [9]
-
-
//! [10]
QPushButton *button = parentWidget->findChild<QPushButton *>("button1");
//! [10]
@@ -251,22 +197,6 @@ MyWindow::MyWindow()
}
-//! [18]
-int n = messages.count();
-showMessage(tr("%n message(s) saved", "", n));
-//! [18]
-
-
-//! [19]
-n == 1 ? tr("%n message saved") : tr("%n messages saved")
-//! [19]
-
-
-//! [20]
-label->setText(tr("F\374r \310lise"));
-//! [20]
-
-
//! [21]
if (receivers(SIGNAL(valueChanged(QByteArray))) > 0) {
QByteArray data;
@@ -430,21 +360,13 @@ public:
//! [39]
-//! [40]
-//: This name refers to a host name.
-hostNameLabel->setText(tr("Name:"));
-
-/*: This text refers to a C++ code example. */
-QString example = tr("Example");
-//! [40]
-
//! [41]
QPushButton *button = parentWidget->findChild<QPushButton *>("button1", Qt::FindDirectChildrenOnly);
//! [41]
//! [42]
-QListWidget *list = parentWidget->findChild<QListWidget *>(QString(), Qt::FindDirectChildrenOnly);
+QListWidget *list = parentWidget->findChild<QListWidget *>(Qt::FindDirectChildrenOnly);
//! [42]
@@ -534,18 +456,6 @@ public:
};
//! [52]
-//! [meta data]
-//: This is a comment for the translator.
-//= qtn_foo_bar
-//~ loc-layout_id foo_dialog
-//~ loc-blank False
-//~ magic-stuff This might mean something magic.
-QString text = MyMagicClass::tr("Sim sala bim.");
-//! [meta data]
-
-//! [explicit tr context]
-QString text = QScrollBar::tr("Page up");
-//! [explicit tr context]
//! [53]
{
@@ -559,3 +469,16 @@ const bool wasBlocked = someQObject->blockSignals(true);
// no signals here
someQObject->blockSignals(wasBlocked);
//! [54]
+
+{
+//! [invalid-timer-id]
+ QObject *obj;
+ ...
+ int id = obj->startTimer(100ms);
+ if (id > Qt::TimerId::Invalid)
+ // The timer has been started successfully
+
+ if (id > 0) // Equivalent, albeit less readable
+ // The timer has been started successfully
+//! [invalid-timer-id]
+}
diff --git a/src/corelib/doc/snippets/code/src_corelib_kernel_qproperty.cpp b/src/corelib/doc/snippets/code/src_corelib_kernel_qproperty.cpp
index ae1d2202e7..c2b55c9684 100644
--- a/src/corelib/doc/snippets/code/src_corelib_kernel_qproperty.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_kernel_qproperty.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#include <QObject>
#include <QDebug>
@@ -191,7 +144,7 @@ public:
Q_D(MyClass);
d->clients.push_back(c);
// notify that the value could have changed
- d->hasClientsData.markDirty();
+ d->hasClientsData.notify();
}
private:
Q_DECLARE_PRIVATE(MyClass)
diff --git a/src/corelib/doc/snippets/code/src_corelib_kernel_qsystemsemaphore.cpp b/src/corelib/doc/snippets/code/src_corelib_kernel_qsystemsemaphore.cpp
index 345a59b7ec..45da88c75d 100644
--- a/src/corelib/doc/snippets/code/src_corelib_kernel_qsystemsemaphore.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_kernel_qsystemsemaphore.cpp
@@ -1,55 +1,8 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [0]
-QSystemSemaphore sem("market", 3, QSystemSemaphore::Create);
+QSystemSemaphore sem(QSystemSemaphore::platformSafeKey("market"), 3, QSystemSemaphore::Create);
// resources available == 3
sem.acquire(); // resources available == 2
sem.acquire(); // resources available == 1
@@ -60,7 +13,7 @@ sem.release(2); // resources available == 3
//! [1]
-QSystemSemaphore sem("market", 5, QSystemSemaphore::Create);
+QSystemSemaphore sem(QSystemSemaphore::platformSafeKey("market"), 5, QSystemSemaphore::Create);
for (int i = 0; i < 5; ++i) // acquire all 5 resources
sem.acquire();
sem.release(5); // release the 5 resources
diff --git a/src/corelib/doc/snippets/code/src_corelib_kernel_qtimer.cpp b/src/corelib/doc/snippets/code/src_corelib_kernel_qtimer.cpp
index 548e32dc5d..5edcaae755 100644
--- a/src/corelib/doc/snippets/code/src_corelib_kernel_qtimer.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_kernel_qtimer.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [0]
#include <QApplication>
@@ -55,7 +8,7 @@
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
- QTimer::singleShot(600000, &app, SLOT(quit()));
+ QTimer::singleShot(600000, &app, QCoreApplication::quit);
...
return app.exec();
}
diff --git a/src/corelib/doc/snippets/code/src_corelib_kernel_qvariant.cpp b/src/corelib/doc/snippets/code/src_corelib_kernel_qvariant.cpp
index 2dac3aefd7..7f3f1ce7a0 100644
--- a/src/corelib/doc/snippets/code/src_corelib_kernel_qvariant.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_kernel_qvariant.cpp
@@ -1,52 +1,7 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+#undef QT_NO_FOREACH // this file contains unported legacy Q_FOREACH uses
//! [0]
QDataStream out(...);
@@ -136,11 +91,6 @@ return QVariant::fromValue(s);
//! [7]
-//! [8]
-QObject *object = getObjectFromSomewhere();
-QVariant data = QVariant::fromValue(object);
-//! [8]
-
//! [9]
QList<int> intList = {7, 11, 42};
diff --git a/src/corelib/doc/snippets/code/src_corelib_mimetype_qmimedatabase.cpp b/src/corelib/doc/snippets/code/src_corelib_mimetype_qmimedatabase.cpp
index 3092e32f6f..7ed52617e7 100644
--- a/src/corelib/doc/snippets/code/src_corelib_mimetype_qmimedatabase.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_mimetype_qmimedatabase.cpp
@@ -1,52 +1,7 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+using namespace Qt::StringLiterals;
//! [0]
QMimeDatabase db;
@@ -57,7 +12,7 @@ if (mime.inherits("text/plain")) {
//! [0]
//! [1]
-QStandardPaths::locateAll(QStandardPaths::GenericDataLocation, QLatin1String("mime/packages"),
+QStandardPaths::locateAll(QStandardPaths::GenericDataLocation, "mime/packages"_L1,
QStandardPaths::LocateDirectory);
//! [1]
diff --git a/src/corelib/doc/snippets/code/src_corelib_plugin_qlibrary.cpp b/src/corelib/doc/snippets/code/src_corelib_plugin_qlibrary.cpp
index 6abd2f6d2b..6edb937208 100644
--- a/src/corelib/doc/snippets/code/src_corelib_plugin_qlibrary.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_plugin_qlibrary.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [0]
QLibrary myLib("mylib");
diff --git a/src/corelib/doc/snippets/code/src_corelib_plugin_quuid.cpp b/src/corelib/doc/snippets/code/src_corelib_plugin_quuid.cpp
index 2ba231d1cc..4d8f0b8d34 100644
--- a/src/corelib/doc/snippets/code/src_corelib_plugin_quuid.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_plugin_quuid.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [0]
// {67C8770B-44F1-410A-AB9A-F9B5446F13EE}
diff --git a/src/corelib/doc/snippets/code/src_corelib_serialization_qcborstream.cpp b/src/corelib/doc/snippets/code/src_corelib_serialization_qcborstream.cpp
index cb6928b129..acb5a6272e 100644
--- a/src/corelib/doc/snippets/code/src_corelib_serialization_qcborstream.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_serialization_qcborstream.cpp
@@ -1,52 +1,7 @@
-/****************************************************************************
-**
-** Copyright (C) 2018 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2018 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+using namespace Qt::StringLiterals;
//! [0]
QCborValue(QCborTag(2), QByteArray("\x01\0\0\0\0\0\0\0\0", 9));
@@ -55,18 +10,18 @@
//! [1]
writer.startMap(4); // 4 elements in the map
- writer.append(QLatin1String("label"));
- writer.append(QLatin1String("journald"));
+ writer.append("label"_L1);
+ writer.append("journald"_L1);
- writer.append(QLatin1String("autoDetect"));
+ writer.append("autoDetect"_L1);
writer.append(false);
- writer.append(QLatin1String("condition"));
- writer.append(QLatin1String("libs.journald"));
+ writer.append("condition"_L1);
+ writer.append("libs.journald"_L1);
- writer.append(QLatin1String("output"));
+ writer.append("output"_L1);
writer.startArray(1);
- writer.append(QLatin1String("privateFeature"));
+ writer.append("privateFeature"_L1);
writer.endArray();
writer.endMap();
@@ -118,7 +73,7 @@
//! [7]
//! [8]
- writer.append(QLatin1String("Hello, World"));
+ writer.append("Hello, World"_L1);
//! [8]
//! [9]
@@ -228,7 +183,7 @@
//! [21]
//! [22]
- void appendMap(QCborStreamWriter &writer, const QList<QPair<int, QString>> &values)
+ void appendMap(QCborStreamWriter &writer, const QList<std::pair<int, QString>> &values)
{
writer.startMap();
for (const auto pair : values) {
@@ -243,7 +198,7 @@
void appendMap(QCborStreamWriter &writer, const QMap<int, QString> &map)
{
writer.startMap(map.size());
- for (auto it = map.begin(); it != map.end(); ++it) {
+ for (auto it = map.cbegin(), end = map.cend(); it != end; ++it) {
writer.append(it.key());
writer.append(it.value());
}
@@ -316,12 +271,12 @@
{
QString result;
auto r = reader.readString();
- while (r.code == QCborStreamReader::Ok) {
+ while (r.status == QCborStreamReader::Ok) {
result += r.data;
r = reader.readString();
}
- if (r.code == QCborStreamReader::Error) {
+ if (r.status == QCborStreamReader::Error) {
// handle error condition
result.clear();
}
@@ -334,12 +289,12 @@
{
QBytearray result;
auto r = reader.readBytearray();
- while (r.code == QCborStreamReader::Ok) {
+ while (r.status == QCborStreamReader::Ok) {
result += r.data;
r = reader.readByteArray();
}
- if (r.code == QCborStreamReader::Error) {
+ if (r.status == QCborStreamReader::Error) {
// handle error condition
result.clear();
}
diff --git a/src/corelib/doc/snippets/code/src_corelib_serialization_qcborvalue.cpp b/src/corelib/doc/snippets/code/src_corelib_serialization_qcborvalue.cpp
index 5406536cfe..3abee048ab 100644
--- a/src/corelib/doc/snippets/code/src_corelib_serialization_qcborvalue.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_serialization_qcborvalue.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2018 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2018 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [0]
QCborValue(uuid) == QCborValue(QCborKnownTags::Uuid, uuid.toRfc4122());
diff --git a/src/corelib/doc/snippets/code/src_corelib_serialization_qdatastream.cpp b/src/corelib/doc/snippets/code/src_corelib_serialization_qdatastream.cpp
index cfcc2f8f94..dfdebe6a76 100644
--- a/src/corelib/doc/snippets/code/src_corelib_serialization_qdatastream.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_serialization_qdatastream.cpp
@@ -1,59 +1,12 @@
-/****************************************************************************
-**
-** Copyright (C) 2018 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2018 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [0]
- QDataStream &operator<<(QDataStream &, const QXxx &);
- QDataStream &operator>>(QDataStream &, QXxx &);
+QDataStream &operator<<(QDataStream &, const QXxx &);
+QDataStream &operator>>(QDataStream &, QXxx &);
//! [0]
//! [1]
- QDataStream & operator<< (QDataStream& stream, const QImage& image);
- QDataStream & operator>> (QDataStream& stream, QImage& image);
+QDataStream &operator<<(QDataStream &stream, const QImage &image);
+QDataStream &operator>>(QDataStream &stream, QImage &image);
//! [1]
diff --git a/src/corelib/doc/snippets/code/src_corelib_serialization_qjsondocument.cpp b/src/corelib/doc/snippets/code/src_corelib_serialization_qjsondocument.cpp
index 1fe328c0a0..0cb11ed872 100644
--- a/src/corelib/doc/snippets/code/src_corelib_serialization_qjsondocument.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_serialization_qjsondocument.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2018 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2018 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [0]
{
diff --git a/src/corelib/doc/snippets/code/src_corelib_text_qanystringview.cpp b/src/corelib/doc/snippets/code/src_corelib_text_qanystringview.cpp
index de5c511348..370c6fd3e0 100644
--- a/src/corelib/doc/snippets/code/src_corelib_text_qanystringview.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_text_qanystringview.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [0]
void myfun1(QAnyStringView sv); // preferred
diff --git a/src/corelib/doc/snippets/code/src_corelib_text_qbytearray.cpp b/src/corelib/doc/snippets/code/src_corelib_text_qbytearray.cpp
index d86eb39290..a4fecc41f9 100644
--- a/src/corelib/doc/snippets/code/src_corelib_text_qbytearray.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_text_qbytearray.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
void wrapInFunction()
@@ -71,7 +24,7 @@ ba[4] = 0xca;
//! [2]
for (qsizetype i = 0; i < ba.size(); ++i) {
if (ba.at(i) >= 'a' && ba.at(i) <= 'f')
- cout << "Found character in range [a-f]" << Qt::endl;
+ cout << "Found character in range [a-f]" << endl;
}
//! [2]
@@ -88,7 +41,7 @@ x.replace(5, 3, "&"); // x == "rock & roll"
QByteArray ba("We must be <b>bold</b>, very <b>bold</b>");
qsizetype j = 0;
while ((j = ba.indexOf("<b>", j)) != -1) {
- cout << "Found <b> tag at index position " << j << Qt::endl;
+ cout << "Found <b> tag at index position " << j << endl;
++j;
}
//! [4]
@@ -126,7 +79,7 @@ QByteArray("abc").isEmpty(); // returns false
QByteArray ba("Hello world");
char *data = ba.data();
while (*data) {
- cout << "[" << *data << "]" << Qt::endl;
+ cout << "[" << *data << "]" << endl;
++data;
}
//! [8]
@@ -490,17 +443,39 @@ macAddress.toHex(0); // returns "123456abcdef"
//! [51]
QByteArray text = QByteArray::fromPercentEncoding("Qt%20is%20great%33");
-text.data(); // returns "Qt is great!"
+qDebug("%s", text.data()); // reports "Qt is great!"
//! [51]
//! [52]
QByteArray text = "{a fishy string?}";
QByteArray ba = text.toPercentEncoding("{}", "s");
-qDebug(ba.constData());
+qDebug("%s", ba.constData());
// prints "{a fi%73hy %73tring%3F}"
//! [52]
//! [53]
QByteArray ba = QByteArrayLiteral("byte array contents");
//! [53]
+
+//! [54]
+QByteArray encoded("Qt%20is%20great%33");
+QByteArray decoded = encoded.percentDecoded(); // Set to "Qt is great!"
+//! [54]
+
+//! [55]
+emscripten::val uint8array = emscripten::val::global("g_uint8array");
+QByteArray byteArray = QByteArray::fromEcmaUint8Array(uint8array);
+//! [55]
+
+//! [56]
+QByteArray byteArray = "test";
+emscripten::val uint8array = QByteArray::toEcmaUint8Array(byteArray);
+//! [56]
+
+//! [57]
+QByteArray x = "Five pineapples"_ba;
+x.slice(5); // x == "pineapples"
+x.slice(4, 3); // x == "app"
+//! [57]
+
}
diff --git a/src/corelib/doc/snippets/code/src_corelib_text_qbytearraymatcher.cpp b/src/corelib/doc/snippets/code/src_corelib_text_qbytearraymatcher.cpp
index 9cf94f0494..3d750c44ff 100644
--- a/src/corelib/doc/snippets/code/src_corelib_text_qbytearraymatcher.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_text_qbytearraymatcher.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2018 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2018 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [0]
static const auto matcher = qMakeStaticByteArrayMatcher("needle");
diff --git a/src/corelib/doc/snippets/code/src_corelib_text_qbytearrayview.cpp b/src/corelib/doc/snippets/code/src_corelib_text_qbytearrayview.cpp
index 519f609790..4457a71ae5 100644
--- a/src/corelib/doc/snippets/code/src_corelib_text_qbytearrayview.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_text_qbytearrayview.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#include <QtCore/qbytearrayview.h>
//! [0]
diff --git a/src/corelib/doc/snippets/code/src_corelib_text_qcollator.cpp b/src/corelib/doc/snippets/code/src_corelib_text_qcollator.cpp
index 9a2e0dac58..91da052bf7 100644
--- a/src/corelib/doc/snippets/code/src_corelib_text_qcollator.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_text_qcollator.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [0]
QStringList sortedStrings(QStringList seq)
diff --git a/src/corelib/doc/snippets/code/src_corelib_text_qlocale.cpp b/src/corelib/doc/snippets/code/src_corelib_text_qlocale.cpp
index 0ef5f1b82d..c3c41b250b 100644
--- a/src/corelib/doc/snippets/code/src_corelib_text_qlocale.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_text_qlocale.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [0]
QLocale egyptian(QLocale::Arabic, QLocale::Egypt);
diff --git a/src/corelib/doc/snippets/code/src_corelib_text_qregularexpression.cpp b/src/corelib/doc/snippets/code/src_corelib_text_qregularexpression.cpp
index 3bb9727ca6..03fdda9987 100644
--- a/src/corelib/doc/snippets/code/src_corelib_text_qregularexpression.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_text_qregularexpression.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 Giuseppe D'Angelo <dangelog@gmail.com>.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 Giuseppe D'Angelo <dangelog@gmail.com>.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#include <QString>
#include <QStringList>
diff --git a/src/corelib/doc/snippets/code/src_corelib_text_qstaticlatin1stringmatcher.cpp b/src/corelib/doc/snippets/code/src_corelib_text_qstaticlatin1stringmatcher.cpp
new file mode 100644
index 0000000000..ae6e19e471
--- /dev/null
+++ b/src/corelib/doc/snippets/code/src_corelib_text_qstaticlatin1stringmatcher.cpp
@@ -0,0 +1,8 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+//! [0]
+static constexpr auto matcher = qMakeStaticCaseSensitiveLatin1StringViewMatcher("needle");
+//! [0]
+//! [1]
+static constexpr auto matcher = qMakeStaticCaseInsensitiveLatin1StringViewMatcher("needle");
+//! [1]
diff --git a/src/corelib/doc/snippets/code/src_corelib_text_qstring.cpp b/src/corelib/doc/snippets/code/src_corelib_text_qstring.cpp
index fe44bee4a8..efb529657a 100644
--- a/src/corelib/doc/snippets/code/src_corelib_text_qstring.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_text_qstring.cpp
@@ -1,55 +1,10 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+using namespace Qt::StringLiterals;
//! [1]
-QString url = QLatin1String("https://www.unicode.org/");
+QString url = "https://www.unicode.org/"_L1;
//! [1]
@@ -75,19 +30,22 @@ if (str == QString("auto") || str == QString("extern")
}
//! [4]
+//! [4bis]
+str.append("Hello ").append("World");
+//! [4bis]
//! [5]
-if (str == QLatin1String("auto")
- || str == QLatin1String("extern")
- || str == QLatin1String("static")
- || str == QLatin1String("register") {
+if (str == "auto"_L1
+ || str == "extern"_L1
+ || str == "static"_L1
+ || str == "register"_L1 {
...
}
//! [5]
//! [6]
-QLabel *label = new QLabel(QLatin1String("MOD"), this);
+QLabel *label = new QLabel("MOD"_L1, this);
//! [6]
@@ -112,5 +70,13 @@ if (node.hasAttribute(QStringLiteral(u"http-contents-length"))) //...
//! [10]
//! [11]
-if (attribute.name() == QLatin1String("http-contents-length")) //...
+if (attribute.name() == "http-contents-length"_L1) //...
//! [11]
+
+//! [qUtf8Printable]
+qWarning("%s: %s", qUtf8Printable(key), qUtf8Printable(value));
+//! [qUtf8Printable]
+
+//! [qUtf16Printable]
+qWarning("%ls: %ls", qUtf16Printable(key), qUtf16Printable(value));
+//! [qUtf16Printable]
diff --git a/src/corelib/doc/snippets/code/src_corelib_text_qstringconverter.cpp b/src/corelib/doc/snippets/code/src_corelib_text_qstringconverter.cpp
index 3ad0880bca..b5bfc9cd55 100644
--- a/src/corelib/doc/snippets/code/src_corelib_text_qstringconverter.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_text_qstringconverter.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [0]
QByteArray encodedString = "...";
@@ -81,3 +34,27 @@ while (new_data_available()) {
encoded += fromUtf16(chunk);
}
//! [3]
+
+{
+//! [4]
+QByteArray encodedString = "...";
+auto toUtf16 = QStringDecoder(QStringDecoder::Utf8);
+auto data = toUtf16(encodedString); // data's type is QStringDecoder::EncodedData<const QByteArray &>
+QString string = toUtf16(encodedString); // Implicit conversion to QString
+
+// Here you have to cast "data" to QString
+auto func = [&]() { return !toUtf16.hasError() ? QString(data) : u"foo"_s; }
+//! [4]
+}
+
+{
+//! [5]
+QString string = "...";
+auto fromUtf16 = QStringEncoder(QStringEncoder::Utf8);
+auto data = fromUtf16(string); // data's type is QStringEncoder::DecodedData<const QString &>
+QByteArray encodedString = fromUtf16(string); // Implicit conversion to QByteArray
+
+// Here you have to cast "data" to QByteArray
+auto func = [&]() { return !fromUtf16.hasError() ? QByteArray(data) : "foo"_ba; }
+//! [5]
+}
diff --git a/src/corelib/doc/snippets/code/src_corelib_text_qstringiterator.cpp b/src/corelib/doc/snippets/code/src_corelib_text_qstringiterator.cpp
index 8085e32787..10e6eb6276 100644
--- a/src/corelib/doc/snippets/code/src_corelib_text_qstringiterator.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_text_qstringiterator.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#include <QString>
#include <QStringIterator>
@@ -63,7 +16,7 @@ QStringIterator i(string); // implicitly converted to QStringView
//! [1]
while (i.hasNext())
- qDebug() << i.next();
+ char32_t c = i.next();
//! [1]
}
diff --git a/src/corelib/doc/snippets/code/src_corelib_text_qstringview.cpp b/src/corelib/doc/snippets/code/src_corelib_text_qstringview.cpp
index 380e069b53..676baa5aee 100644
--- a/src/corelib/doc/snippets/code/src_corelib_text_qstringview.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_text_qstringview.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2018 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2018 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [0]
void myfun1(QStringView sv); // preferred
diff --git a/src/corelib/doc/snippets/code/src_corelib_text_qutf8stringview.cpp b/src/corelib/doc/snippets/code/src_corelib_text_qutf8stringview.cpp
index ba52e2d5c2..4b09796b36 100644
--- a/src/corelib/doc/snippets/code/src_corelib_text_qutf8stringview.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_text_qutf8stringview.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [0]
void myfun1(QUtf8StringView sv); // preferred
diff --git a/src/corelib/doc/snippets/code/src_corelib_thread_qatomic.cpp b/src/corelib/doc/snippets/code/src_corelib_thread_qatomic.cpp
index 21abd2b1a0..2d55e6b706 100644
--- a/src/corelib/doc/snippets/code/src_corelib_thread_qatomic.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_thread_qatomic.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [0]
MySharedType &MySharedType::operator=(const MySharedType &other)
diff --git a/src/corelib/doc/snippets/code/src_corelib_thread_qexception.cpp b/src/corelib/doc/snippets/code/src_corelib_thread_qexception.cpp
index 08bbee7dd3..74a2e4506e 100644
--- a/src/corelib/doc/snippets/code/src_corelib_thread_qexception.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_thread_qexception.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [0]
diff --git a/src/corelib/doc/snippets/code/src_corelib_thread_qfuture.cpp b/src/corelib/doc/snippets/code/src_corelib_thread_qfuture.cpp
index 176fb4a043..500d7cc7a5 100644
--- a/src/corelib/doc/snippets/code/src_corelib_thread_qfuture.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_thread_qfuture.cpp
@@ -1,59 +1,12 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [0]
QFuture<QString> future = ...;
QFuture<QString>::const_iterator i;
for (i = future.constBegin(); i != future.constEnd(); ++i)
- cout << *i << Qt::endl;
+ cout << qPrintable(*i) << endl;
//! [0]
@@ -62,7 +15,7 @@ QFuture<QString> future;
...
QFutureIterator<QString> i(future);
while (i.hasNext())
- qDebug() << i.next();
+ QString s = i.next();
//! [1]
@@ -70,7 +23,7 @@ while (i.hasNext())
QFutureIterator<QString> i(future);
i.toBack();
while (i.hasPrevious())
- qDebug() << i.previous();
+ QString s = i.previous();
//! [2]
//! [3]
@@ -286,9 +239,9 @@ auto future = QtConcurrent::run([] {
//! [20]
QObject *context = ...;
-auto future = cachedResultsReady ? QtFuture::makeReadyFuture(results)
- : QtConcurrent::run([] { /* compute results */});
-auto continuation = future.then(context, [] (Results results) {
+auto future = cachedResultsReady ? QtFuture::makeReadyValueFuture(result)
+ : QtConcurrent::run([] { /* compute result */});
+auto continuation = future.then(context, [] (Result result) {
// Runs in the context's thread
}).then([] {
// May or may not run in the context's thread
@@ -398,3 +351,92 @@ QtFuture::whenAny(intFuture, stringFuture, voidFuture).then([](const FuturesVari
...
});
//! [27]
+
+//! [28]
+
+QFuture<QFuture<int>> outerFuture = ...;
+QFuture<int> unwrappedFuture = outerFuture.unwrap();
+
+//! [28]
+
+//! [29]
+
+auto downloadImages = [] (const QUrl &url) {
+ QList<QImage> images;
+ ...
+ return images;
+};
+
+auto processImages = [](const QList<QImage> &images) {
+ return QtConcurrent::mappedReduced(images, scale, reduceImages);
+}
+
+auto show = [](const QImage &image) { ... };
+
+auto future = QtConcurrent::run(downloadImages, url)
+ .then(processImages)
+ .unwrap()
+ .then(show);
+//! [29]
+
+//! [30]
+
+QFuture<QFuture<QFuture<int>>>> outerFuture;
+QFuture<int> unwrappedFuture = outerFuture.unwrap();
+
+//! [30]
+
+//! [31]
+QPromise<int> p;
+
+QFuture<int> f1 = p.future();
+f1.then([](int) { qDebug("first"); });
+
+QFuture<int> f2 = p.future();
+f2.then([](int) { qDebug("second"); });
+
+p.start();
+p.addResult(42);
+p.finish();
+//! [31]
+
+//! [32]
+const std::vector<int> values{1, 2, 3};
+auto f = QtFuture::makeReadyRangeFuture(values);
+//! [32]
+
+//! [33]
+auto f = QtFuture::makeReadyRangeFuture({1, 2, 3});
+//! [33]
+
+//! [34]
+const int count = f.resultCount(); // count == 3
+const auto results = f.results(); // results == { 1, 2, 3 }
+//! [34]
+
+//! [35]
+auto f = QtFuture::makeReadyValueFuture(std::make_unique<int>(42));
+...
+const int result = *f.takeResult(); // result == 42
+//! [35]
+
+//! [36]
+auto f = QtFuture::makeReadyVoidFuture();
+...
+const bool started = f.isStarted(); // started == true
+const bool running = f.isRunning(); // running == false
+const bool finished = f.isFinished(); // finished == true
+//! [36]
+
+//! [37]
+QObject *context = ...;
+auto future = ...;
+auto continuation = future.then(context, [context](Result result) {
+ // ...
+ }).onCanceled([context = QPointer(context)] {
+ if (!context)
+ return; // context was destroyed already
+ // handle cancellation
+ });
+
+//! [37]
diff --git a/src/corelib/doc/snippets/code/src_corelib_thread_qfuturesynchronizer.cpp b/src/corelib/doc/snippets/code/src_corelib_thread_qfuturesynchronizer.cpp
index e4624f7154..0ea226fe06 100644
--- a/src/corelib/doc/snippets/code/src_corelib_thread_qfuturesynchronizer.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_thread_qfuturesynchronizer.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [0]
void someFunction()
diff --git a/src/corelib/doc/snippets/code/src_corelib_thread_qfuturewatcher.cpp b/src/corelib/doc/snippets/code/src_corelib_thread_qfuturewatcher.cpp
index d9b164b70f..b3a7747d12 100644
--- a/src/corelib/doc/snippets/code/src_corelib_thread_qfuturewatcher.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_thread_qfuturewatcher.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [0]
// Instantiate the objects and connect to the finished signal.
diff --git a/src/corelib/doc/snippets/code/src_corelib_thread_qmutex.cpp b/src/corelib/doc/snippets/code/src_corelib_thread_qmutex.cpp
index 020dc44eac..efba262795 100644
--- a/src/corelib/doc/snippets/code/src_corelib_thread_qmutex.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_thread_qmutex.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [0]
int number = 6;
diff --git a/src/corelib/doc/snippets/code/src_corelib_thread_qmutexpool.cpp b/src/corelib/doc/snippets/code/src_corelib_thread_qmutexpool.cpp
deleted file mode 100644
index d9d735cdc9..0000000000
--- a/src/corelib/doc/snippets/code/src_corelib_thread_qmutexpool.cpp
+++ /dev/null
@@ -1,71 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-//! [0]
-class Number {
-public:
- Number(double n) : num (n) { }
-
- void setNumber(double n) { num = n; }
- double number() const { return num; }
-
-private:
- double num;
-};
-//! [0]
-
-
-//! [1]
-void calcSquare(Number *num)
-{
- QMutexLocker locker(mutexpool.get(num));
- num.setNumber(num.number() * num.number());
-}
-//! [1]
diff --git a/src/corelib/doc/snippets/code/src_corelib_thread_qreadwritelock.cpp b/src/corelib/doc/snippets/code/src_corelib_thread_qreadwritelock.cpp
index d9abe2bc3e..3c50f991c2 100644
--- a/src/corelib/doc/snippets/code/src_corelib_thread_qreadwritelock.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_thread_qreadwritelock.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [0]
QReadWriteLock lock;
diff --git a/src/corelib/doc/snippets/code/src_corelib_thread_qsemaphore.cpp b/src/corelib/doc/snippets/code/src_corelib_thread_qsemaphore.cpp
index 52105bce0b..d7c9b900af 100644
--- a/src/corelib/doc/snippets/code/src_corelib_thread_qsemaphore.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_thread_qsemaphore.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [0]
QSemaphore sem(5); // sem.available() == 5
@@ -82,6 +35,12 @@ sem.tryAcquire(250, 1000); // sem.available() == 5, waits 1000 milliseconds a
sem.tryAcquire(3, 30000); // sem.available() == 2, returns true without waiting
//! [3]
+//! [tryAcquire-QDeadlineTimer]
+QSemaphore sem(5); // sem.available() == 5
+sem.tryAcquire(250, QDeadlineTimer(1000)); // sem.available() == 5, waits 1000 milliseconds and returns false
+sem.tryAcquire(3, QDeadlineTimer(30s)); // sem.available() == 2, returns true without waiting
+//! [tryAcquire-QDeadlineTimer]
+
//! [4]
// ... do something that may throw or return early
sem.release();
diff --git a/src/corelib/doc/snippets/code/src_corelib_thread_qthread.cpp b/src/corelib/doc/snippets/code/src_corelib_thread_qthread.cpp
index 7c687a0430..9852ae4d54 100644
--- a/src/corelib/doc/snippets/code/src_corelib_thread_qthread.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_thread_qthread.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 Olivier Goffart <ogoffart@woboq.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 Olivier Goffart <ogoffart@woboq.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#include <QtCore/QThread>
class MyObject;
diff --git a/src/corelib/doc/snippets/code/src_corelib_thread_qwaitcondition_unix.cpp b/src/corelib/doc/snippets/code/src_corelib_thread_qwaitcondition_unix.cpp
index 135a727a97..efddcd2df4 100644
--- a/src/corelib/doc/snippets/code/src_corelib_thread_qwaitcondition_unix.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_thread_qwaitcondition_unix.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [0]
forever {
diff --git a/src/corelib/doc/snippets/code/src_corelib_time_qdatetime.cpp b/src/corelib/doc/snippets/code/src_corelib_time_qdatetime.cpp
index a477e91548..588e81bab1 100644
--- a/src/corelib/doc/snippets/code/src_corelib_time_qdatetime.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_time_qdatetime.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [0]
QDate d1(1995, 5, 17); // May 17, 1995
@@ -118,14 +71,6 @@ QTime::isValid(22, 5, 62); // returns false
//! [9]
-//! [10]
-QTime t;
-t.start();
-some_lengthy_task();
-qDebug("Time elapsed: %d ms", t.elapsed());
-//! [10]
-
-
//! [11]
QDateTime now = QDateTime::currentDateTime();
QDateTime xmas(QDate(now.date().year(), 12, 25).startOfDay());
@@ -216,3 +161,31 @@ QString string = "Tuesday, 23 April 12 22:51:41";
QString format = "dddd, d MMMM yy hh:mm:ss";
QDateTime valid = QDateTime::fromString(string, format);
//! [21]
+
+//! [22]
+// 23 April 2012:
+QDate date = std::chrono::year_month_day(std::chrono::year(2012),
+ std::chrono::month(4),
+ std::chrono::day(23));
+
+// Same, under `using std::chrono` convenience:
+QDate dateWithLiterals1 = 23 / April / 2012y;
+QDate dateWithLiterals2 = 2012y / April / 23;
+
+// Last day of February 2000
+QDate lastDayFeb2020 = 2000y / February / last;
+
+// First Monday of January 2020:
+QDate firstMonday = 2020y / January / Monday[0];
+
+// Last Monday of January 2020:
+QDate lastMonday = 2020y / January / Monday[last];
+//! [22]
+
+//! [23]
+QDateTime local(QDateTime::currentDateTime());
+QDateTime UTC(local.toTimeSpec(QTimeZone::UTC));
+qDebug() << "Local time is:" << local;
+qDebug() << "UTC time is:" << UTC;
+qDebug() << "No difference between times represented:" << local.secsTo(UTC);
+//! [23]
diff --git a/src/corelib/doc/snippets/code/src_corelib_tools_qbitarray.cpp b/src/corelib/doc/snippets/code/src_corelib_tools_qbitarray.cpp
index a436dcb358..7c98b6d8ff 100644
--- a/src/corelib/doc/snippets/code/src_corelib_tools_qbitarray.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_tools_qbitarray.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [0]
QBitArray ba(200);
diff --git a/src/corelib/doc/snippets/code/src_corelib_tools_qcommandlineoption.cpp b/src/corelib/doc/snippets/code/src_corelib_tools_qcommandlineoption.cpp
index 1871666a56..dbc83127ec 100644
--- a/src/corelib/doc/snippets/code/src_corelib_tools_qcommandlineoption.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_tools_qcommandlineoption.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 David Faure <faure@kde.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 David Faure <faure@kde.org>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#include <QCommandLineOption>
#include <QCommandLineParser>
diff --git a/src/corelib/doc/snippets/code/src_corelib_tools_qcommandlineparser.cpp b/src/corelib/doc/snippets/code/src_corelib_tools_qcommandlineparser.cpp
index a5ce172e71..cc22ba88ce 100644
--- a/src/corelib/doc/snippets/code/src_corelib_tools_qcommandlineparser.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_tools_qcommandlineparser.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 David Faure <faure@kde.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 David Faure <faure@kde.org>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#include <qcommandlineparser.h>
@@ -137,12 +90,4 @@ Arguments:
//! [3]
}
-{
-//! [4]
-QCommandLineParser parser;
-parser.setApplicationDescription(QCoreApplication::translate("main", "The best application in the world"));
-parser.addHelpOption();
-//! [4]
-}
-
}
diff --git a/src/corelib/doc/snippets/code/src_corelib_tools_qcommandlineparser_main.cpp b/src/corelib/doc/snippets/code/src_corelib_tools_qcommandlineparser_main.cpp
index 159d8f4a42..7c06e36313 100644
--- a/src/corelib/doc/snippets/code/src_corelib_tools_qcommandlineparser_main.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_tools_qcommandlineparser_main.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 David Faure <faure@kde.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 David Faure <faure@kde.org>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#include <qcommandlineparser.h>
diff --git a/src/corelib/doc/snippets/code/src_corelib_tools_qcontiguouscache.cpp b/src/corelib/doc/snippets/code/src_corelib_tools_qcontiguouscache.cpp
index 84780374e9..891ec1f549 100644
--- a/src/corelib/doc/snippets/code/src_corelib_tools_qcontiguouscache.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_tools_qcontiguouscache.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2018 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2018 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [0]
MyRecord record(int row) const
diff --git a/src/corelib/doc/snippets/code/src_corelib_tools_qeasingcurve.cpp b/src/corelib/doc/snippets/code/src_corelib_tools_qeasingcurve.cpp
index 88f1e90713..e0be0c3d9a 100644
--- a/src/corelib/doc/snippets/code/src_corelib_tools_qeasingcurve.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_tools_qeasingcurve.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2018 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2018 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [typedef]
qreal myEasingFunction(qreal progress);
diff --git a/src/corelib/doc/snippets/code/src_corelib_tools_qhash.cpp b/src/corelib/doc/snippets/code/src_corelib_tools_qhash.cpp
index ee9f88fc65..c779b9e3e7 100644
--- a/src/corelib/doc/snippets/code/src_corelib_tools_qhash.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_tools_qhash.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [0]
QHash<QString, int> hash;
@@ -89,7 +42,7 @@ QHash<int, QWidget *> hash;
...
for (int i = 0; i < 1000; ++i) {
if (hash[i] == okButton)
- cout << "Found button at index " << i << Qt::endl;
+ cout << "Found button at index " << i << endl;
}
//! [6]
@@ -98,17 +51,14 @@ for (int i = 0; i < 1000; ++i) {
QHashIterator<QString, int> i(hash);
while (i.hasNext()) {
i.next();
- cout << i.key() << ": " << i.value() << Qt::endl;
+ cout << qPrintable(i.key()) << ": " << i.value() << endl;
}
//! [7]
//! [8]
-QHash<QString, int>::const_iterator i = hash.constBegin();
-while (i != hash.constEnd()) {
- cout << i.key() << ": " << i.value() << Qt::endl;
- ++i;
-}
+for (auto i = hash.cbegin(), end = hash.cend(); i != end; ++i)
+ cout << qPrintable(i.key()) << ": " << i.value() << endl;
//! [8]
@@ -122,8 +72,8 @@ hash.insert("plenty", 2000);
//! [12]
QHash<QString, int> hash;
...
-foreach (int value, hash)
- cout << value << Qt::endl;
+for (int value : std::as_const(hash))
+ cout << value << endl;
//! [12]
@@ -185,7 +135,7 @@ QHash<QString, int> hash;
...
QHash<QString, int>::const_iterator i = hash.find("HDR");
while (i != hash.end() && i.key() == "HDR") {
- cout << i.value() << Qt::endl;
+ cout << i.value() << endl;
++i;
}
//! [16]
@@ -198,50 +148,20 @@ hash.insert("February", 2);
...
hash.insert("December", 12);
-QHash<QString, int>::iterator i;
-for (i = hash.begin(); i != hash.end(); ++i)
- cout << i.key() << ": " << i.value() << Qt::endl;
+for (auto i = hash.cbegin(), end = hash.cend(); i != end; ++i)
+ cout << qPrintable(key()) << ": " << i.value() << endl;
//! [17]
//! [18]
-QHash<QString, int>::iterator i;
-for (i = hash.begin(); i != hash.end(); ++i)
+for (auto i = hash.begin(), end = hash.end(); i != end; ++i)
i.value() += 2;
//! [18]
-
-//! [19]
-QHash<QString, int>::iterator i = hash.begin();
-while (i != hash.end()) {
- if (i.key().startsWith('_'))
- i = hash.erase(i);
- else
- ++i;
-}
-//! [19]
-
-
-//! [20]
-QHash<QString, int>::iterator i = hash.begin();
-while (i != hash.end()) {
- QHash<QString, int>::iterator prev = i;
- ++i;
- if (prev.key().startsWith('_'))
- hash.erase(prev);
-}
-//! [20]
-
-
//! [21]
-// WRONG
-while (i != hash.end()) {
- if (i.key().startsWith('_'))
- hash.erase(i);
- ++i;
-}
+erase_if(hash, [](const QHash<QString, int>::iterator it) { return it.value() > 10; });
//! [21]
-
+}
//! [22]
if (i.key() == "Hello")
@@ -256,9 +176,8 @@ hash.insert("February", 2);
...
hash.insert("December", 12);
-QHash<QString, int>::const_iterator i;
-for (i = hash.constBegin(); i != hash.constEnd(); ++i)
- cout << i.key() << ": " << i.value() << Qt::endl;
+for (auto i = hash.cbegin(), end = hash.cend(); i != end; ++i)
+ cout << qPrintable(i.key()) << ": " << i.value() << endl;
//! [23]
@@ -279,24 +198,24 @@ hash3 = hash1 + hash2;
//! [25]
QList<int> values = hash.values("plenty");
-for (int i = 0; i < values.size(); ++i)
- cout << values.at(i) << Qt::endl;
+for (auto i : std::as_const(values))
+ cout << i << endl;
//! [25]
//! [26]
-QMultiHash<QString, int>::iterator i = hash.find("plenty");
-while (i != hash.end() && i.key() == "plenty") {
- cout << i.value() << Qt::endl;
+auto i = hash.constFind("plenty");
+while (i != hash.cend() && i.key() == "plenty") {
+ cout << i.value() << endl;
++i;
}
//! [26]
//! [27]
-for (QHash<int, QString>::const_iterator it = hash.cbegin(), end = hash.cend(); it != end; ++it) {
- cout << "The key: " << it.key() << Qt::endl
- cout << "The value: " << it.value() << Qt::endl;
- cout << "Also the value: " << (*it) << Qt::endl;
+for (auto it = hash.cbegin(), end = hash.cend(); it != end; ++it) {
+ cout << "The key: " << it.key() << endl;
+ cout << "The value: " << qPrintable(it.value()) << endl;
+ cout << "Also the value: " << qPrintable(*it) << endl;
}
//! [27]
@@ -344,11 +263,11 @@ inline size_t qHash(const std::unordered_set<int> &key, size_t seed = 0)
//! [31]
//! [32]
-size_t qHash(K key);
-size_t qHash(const K &key);
-
size_t qHash(K key, size_t seed);
size_t qHash(const K &key, size_t seed);
+
+size_t qHash(K key); // deprecated, do not use
+size_t qHash(const K &key); // deprecated, do not use
//! [32]
//! [33]
@@ -360,3 +279,29 @@ template <> struct hash<K>
};
}
//! [33]
+
+//! [34]
+QHash<QString, int> hash;
+hash.insert("January", 1);
+hash.insert("February", 2);
+// ...
+hash.insert("December", 12);
+
+for (auto [key, value] : hash.asKeyValueRange()) {
+ cout << qPrintable(key) << ": " << value << endl;
+ --value; // convert to JS month indexing
+}
+//! [34]
+
+//! [35]
+QMultiHash<QString, int> hash;
+hash.insert("January", 1);
+hash.insert("February", 2);
+// ...
+hash.insert("December", 12);
+
+for (auto [key, value] : hash.asKeyValueRange()) {
+ cout << qPrintable(key) << ": " << value << endl;
+ --value; // convert to JS month indexing
+}
+//! [35]
diff --git a/src/corelib/doc/snippets/code/src_corelib_tools_qlist.cpp b/src/corelib/doc/snippets/code/src_corelib_tools_qlist.cpp
index 05027bc500..499e8fe480 100644
--- a/src/corelib/doc/snippets/code/src_corelib_tools_qlist.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_tools_qlist.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [0]
QList<int> integerList;
@@ -73,7 +26,7 @@ if (list[0] == "Liz")
//! [4]
for (qsizetype i = 0; i < list.size(); ++i) {
if (list.at(i) == "Alfonso")
- cout << "Found Alfonso at position " << i << Qt::endl;
+ cout << "Found Alfonso at position " << i << endl;
}
//! [4]
@@ -81,7 +34,7 @@ for (qsizetype i = 0; i < list.size(); ++i) {
//! [5]
qsizetype i = list.indexOf("Harumi");
if (i != -1)
- cout << "First occurrence of Harumi is at position " << i << Qt::endl;
+ cout << "First occurrence of Harumi is at position " << i << endl;
//! [5]
@@ -148,16 +101,14 @@ list.prepend("three");
//! [9]
-QList<QString> list;
-list << "alpha" << "beta" << "delta";
+QList<QString> list = {"alpha", "beta", "delta"};
list.insert(2, "gamma");
// list: ["alpha", "beta", "gamma", "delta"]
//! [9]
//! [10]
-QList<double> list;
-list << 2.718 << 1.442 << 0.4342;
+QList<double> list = {2.718, 1.442, 0.4342};
list.insert(1, 3, 9.9);
// list: [2.718, 9.9, 9.9, 9.9, 1.442, 0.4342]
//! [10]
@@ -174,8 +125,7 @@ list.fill("oh", 5);
//! [12]
-QList<QString> list;
-list << "A" << "B" << "C" << "B" << "A";
+QList<QString> list{"A", "B", "C", "B", "A"};
list.indexOf("B"); // returns 1
list.indexOf("B", 1); // returns 1
list.indexOf("B", 2); // returns 3
@@ -184,8 +134,7 @@ list.indexOf("X"); // returns -1
//! [13]
-QList<QString> list;
-list << "A" << "B" << "C" << "B" << "A";
+QList<QString> list = {"A", "B", "C", "B", "A"};
list.lastIndexOf("B"); // returns 3
list.lastIndexOf("B", 3); // returns 3
list.lastIndexOf("B", 2); // returns 1
diff --git a/src/corelib/doc/snippets/code/src_corelib_tools_qmap.cpp b/src/corelib/doc/snippets/code/src_corelib_tools_qmap.cpp
index 145cd10d84..5f87211968 100644
--- a/src/corelib/doc/snippets/code/src_corelib_tools_qmap.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_tools_qmap.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [0]
QMap<QString, int> map;
@@ -89,7 +42,7 @@ QMap<int, QWidget *> map;
...
for (int i = 0; i < 1000; ++i) {
if (map[i] == okButton)
- cout << "Found button at index " << i << Qt::endl;
+ cout << "Found button at index " << i << endl;
}
//! [6]
@@ -98,17 +51,14 @@ for (int i = 0; i < 1000; ++i) {
QMapIterator<QString, int> i(map);
while (i.hasNext()) {
i.next();
- cout << i.key() << ": " << i.value() << Qt::endl;
+ cout << qPrintable(i.key()) << ": " << i.value() << endl;
}
//! [7]
//! [8]
-QMap<QString, int>::const_iterator i = map.constBegin();
-while (i != map.constEnd()) {
- cout << i.key() << ": " << i.value() << Qt::endl;
- ++i;
-}
+for (auto i = map.cbegin(), end = map.cend(); i != end; ++i)
+ cout << qPrintable(i.key()) << ": " << i.value() << endl;
//! [8]
@@ -119,27 +69,11 @@ map.insert("plenty", 2000);
//! [9]
-//! [10]
-QList<int> values = map.values("plenty");
-for (int i = 0; i < values.size(); ++i)
- cout << values.at(i) << Qt::endl;
-//! [10]
-
-
-//! [11]
-QMap<QString, int>::iterator i = map.find("plenty");
-while (i != map.end() && i.key() == "plenty") {
- cout << i.value() << Qt::endl;
- ++i;
-}
-//! [11]
-
-
//! [12]
QMap<QString, int> map;
...
-foreach (int value, map)
- cout << value << Qt::endl;
+for (int value : std::as_const(map))
+ cout << value << endl;
//! [12]
@@ -170,43 +104,6 @@ inline bool operator<(const Employee &e1, const Employee &e2)
//! [13]
-//! [14]
-QMap<QString, int> map;
-...
-QMap<QString, int>::const_iterator i = map.find("HDR");
-while (i != map.end() && i.key() == "HDR") {
- cout << i.value() << Qt::endl;
- ++i;
-}
-//! [14]
-
-
-//! [15]
-QMap<int, QString> map;
-map.insert(1, "one");
-map.insert(5, "five");
-map.insert(10, "ten");
-
-map.lowerBound(0); // returns iterator to (1, "one")
-map.lowerBound(1); // returns iterator to (1, "one")
-map.lowerBound(2); // returns iterator to (5, "five")
-map.lowerBound(10); // returns iterator to (10, "ten")
-map.lowerBound(999); // returns end()
-//! [15]
-
-
-//! [16]
-QMap<QString, int> map;
-...
-QMap<QString, int>::const_iterator i = map.lowerBound("HDR");
-QMap<QString, int>::const_iterator upperBound = map.upperBound("HDR");
-while (i != upperBound) {
- cout << i.value() << Qt::endl;
- ++i;
-}
-//! [16]
-
-
//! [17]
QMap<int, QString> map;
map.insert(1, "one");
@@ -228,50 +125,33 @@ map.insert("February", 2);
...
map.insert("December", 12);
-QMap<QString, int>::iterator i;
-for (i = map.begin(); i != map.end(); ++i)
- cout << i.key() << ": " << i.value() << Qt::endl;
+for (auto i = map.cbegin(), end = map.cend(); i != end; ++i)
+ cout << qPrintable(i.key()) << ": " << i.value() << endl;
//! [18]
//! [19]
-QMap<QString, int>::iterator i;
-for (i = map.begin(); i != map.end(); ++i)
+for (auto i = map.begin(), end = map.end(); i != end; ++i)
i.value() += 2;
//! [19]
+void erase()
+{
+QMap<QString, int> map;
//! [20]
-QMap<QString, int>::iterator i = map.begin();
-while (i != map.end()) {
- if (i.key().startsWith('_'))
+QMap<QString, int>::const_iterator i = map.cbegin();
+while (i != map.cend()) {
+ if (i.value() > 10)
i = map.erase(i);
else
++i;
}
//! [20]
-
-
//! [21]
-QMap<QString, int>::iterator i = map.begin();
-while (i != map.end()) {
- QMap<QString, int>::iterator prev = i;
- ++i;
- if (prev.key().startsWith('_'))
- map.erase(prev);
-}
+erase_if(map, [](const QMap<QString, int>::iterator it) { return it.value() > 10; });
//! [21]
-
-
-//! [22]
-// WRONG
-while (i != map.end()) {
- if (i.key().startsWith('_'))
- map.erase(i);
- ++i;
}
-//! [22]
-
//! [23]
if (i.key() == "Hello")
@@ -286,47 +166,16 @@ map.insert("February", 2);
...
map.insert("December", 12);
-QMap<QString, int>::const_iterator i;
-for (i = map.constBegin(); i != map.constEnd(); ++i)
- cout << i.key() << ": " << i.value() << Qt::endl;
+for (auto i = map.cbegin(), end = map.cend(); i != end; ++i)
+ cout << qPrintable(i.key()) << ": " << i.value() << endl;
//! [24]
-//! [25]
-QMultiMap<QString, int> map1, map2, map3;
-
-map1.insert("plenty", 100);
-map1.insert("plenty", 2000);
-// map1.size() == 2
-
-map2.insert("plenty", 5000);
-// map2.size() == 1
-
-map3 = map1 + map2;
-// map3.size() == 3
-//! [25]
-
-
-//! [26]
-QList<int> values = map.values("plenty");
-for (int i = 0; i < values.size(); ++i)
- cout << values.at(i) << Qt::endl;
-//! [26]
-
-
-//! [27]
-QMultiMap<QString, int>::iterator i = map.find("plenty");
-while (i != map.end() && i.key() == "plenty") {
- cout << i.value() << Qt::endl;
- ++i;
-}
-//! [27]
-
//! [keyiterator1]
for (QMap<int, QString>::const_iterator it = map.cbegin(), end = map.cend(); it != end; ++it) {
- cout << "The key: " << it.key() << Qt::endl
- cout << "The value: " << it.value() << Qt::endl;
- cout << "Also the value: " << (*it) << Qt::endl;
+ cout << "The key: " << it.key() << endl;
+ cout << "The value: " << qPrintable(it.value()) << endl;
+ cout << "Also the value: " << qPrintable(*it) << endl;
}
//! [keyiterator1]
@@ -340,3 +189,16 @@ qDeleteAll(map2.keys());
int numPrimes = std::count_if(map.keyBegin(), map.keyEnd(), isPrimeNumber);
qDeleteAll(map2.keyBegin(), map2.keyEnd());
//! [keyiterator2]
+
+//! [28]
+QMap<QString, int> map;
+map.insert("January", 1);
+map.insert("February", 2);
+// ...
+map.insert("December", 12);
+
+for (auto [key, value] : map.asKeyValueRange()) {
+ cout << qPrintable(key) << ": " << value << endl;
+ --value; // convert to JS month indexing
+}
+//! [28]
diff --git a/src/corelib/doc/snippets/code/src_corelib_tools_qmultimap.cpp b/src/corelib/doc/snippets/code/src_corelib_tools_qmultimap.cpp
index 9c2a01834b..42ec46585b 100644
--- a/src/corelib/doc/snippets/code/src_corelib_tools_qmultimap.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_tools_qmultimap.cpp
@@ -1,53 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [0]
QMultiMap<QString, int> multimap;
@@ -66,8 +19,8 @@ multimap.insert("c", -5);
int num2 = multimap.value("a"); // 1
int num3 = multimap.value("thirteen"); // not found; 0
int num3 = 0;
-auto it = multimap.value("b");
-if (it != multimap.end()) {
+auto it = multimap.constFind("b");
+if (it != multimap.cend()) {
num3 = it.value();
}
//! [3]
@@ -94,17 +47,14 @@ int timeout = multimap.value("TIMEOUT", 30);
QMultiMapIterator<QString, int> i(multimap);
while (i.hasNext()) {
i.next();
- cout << i.key() << ": " << i.value() << Qt::endl;
+ cout << qPrintable(i.key()) << ": " << i.value() << endl;
}
//! [7]
//! [8]
-auto i = multimap.constBegin();
-while (i != multimap.constEnd()) {
- cout << i.key() << ": " << i.value() << Qt::endl;
- ++i;
-}
+for (auto i = multimap.cbegin(), end = multimap.cend(); i != end; ++i)
+ cout << qPrintable(i.key()) << ": " << i.value() << endl;
//! [8]
@@ -117,22 +67,22 @@ multimap.insert("plenty", 2000);
//! [10]
QList<int> values = multimap.values("plenty");
-for (int i = 0; i < values.size(); ++i)
- cout << values.at(i) << Qt::endl;
+for (auto i : std::as_const(values))
+ cout << i << endl;
//! [10]
//! [11]
-QMultiMap<QString, int>::iterator i = multimap.find("plenty");
+auto i = multimap.find("plenty");
while (i != map.end() && i.key() == "plenty") {
- cout << i.value() << Qt::endl;
+ cout << i.value() << endl;
++i;
}
// better:
auto [i, end] = multimap.equal_range("plenty");
while (i != end) {
- cout << i.value() << Qt::endl;
+ cout << i.value() << endl;
++i;
}
//! [11]
@@ -141,8 +91,8 @@ while (i != end) {
//! [12]
QMap<QString, int> multimap;
...
-foreach (int value, multimap)
- cout << value << Qt::endl;
+for (int value : std::as_const(multimap))
+ cout << value << endl;
//! [12]
@@ -196,7 +146,7 @@ QMap<QString, int> multimap;
QMap<QString, int>::const_iterator i = multimap.lowerBound("HDR");
QMap<QString, int>::const_iterator upperBound = multimap.upperBound("HDR");
while (i != upperBound) {
- cout << i.value() << Qt::endl;
+ cout << i.value() << endl;
++i;
}
//! [16]
@@ -218,57 +168,27 @@ multimap.upperBound(10); // returns end()
multimap.upperBound(999); // returns end()
//! [17]
-
-//! [18]
-QMultiMap<QString, int> multimap;
-multimap.insert("January", 1);
-multimap.insert("February", 2);
-...
-multimap.insert("December", 12);
-
-QMap<QString, int>::iterator i;
-for (i = multimap.begin(); i != multimap.end(); ++i)
- cout << i.key() << ": " << i.value() << Qt::endl;
-//! [18]
-
-
//! [19]
-QMultiMap<QString, int>::iterator i;
-for (i = multimap.begin(); i != multimap.end(); ++i)
+for (auto it = multimap.begin(), end = multimap.end(); i != end; ++i)
i.value() += 2;
//! [19]
-
+void erase()
+{
+QMultiMap<QString, int> multimap;
//! [20]
-QMultiMap<QString, int>::iterator i = multimap.begin();
-while (i != multimap.end()) {
- if (i.key().startsWith('_'))
+QMultiMap<QString, int>::const_iterator i = multimap.cbegin();
+while (i != multimap.cend()) {
+ if (i.value() > 10)
i = multimap.erase(i);
else
++i;
}
//! [20]
-
-
//! [21]
-QMultiMap<QString, int>::iterator i = multimap.begin();
-while (i != multimap.end()) {
- QMap<QString, int>::iterator prev = i;
- ++i;
- if (prev.key().startsWith('_'))
- multimap.erase(prev);
-}
+erase_if(multimap, [](const QMultiMap<QString, int>::iterator it) { return it.value() > 10; });
//! [21]
-
-
-//! [22]
-// WRONG
-while (i != multimap.end()) {
- if (i.key().startsWith('_'))
- multimap.erase(i);
- ++i;
}
-//! [22]
//! [23]
@@ -284,9 +204,8 @@ multimap.insert("February", 2);
...
multimap.insert("December", 12);
-QMultiMap<QString, int>::const_iterator i;
-for (i = multimap.constBegin(); i != multimap.constEnd(); ++i)
- cout << i.key() << ": " << i.value() << Qt::endl;
+for (auto i = multimap.cbegin(), end = multimap.cend(); i != end; ++i)
+ cout << qPrintable(i.key()) << ": " << i.value() << endl;
//! [24]
@@ -305,10 +224,10 @@ map3 = map1 + map2;
//! [25]
//! [keyiterator1]
-for (QMultiMap<int, QString>::const_iterator it = multimap.cbegin(), end = multimap.cend(); it != end; ++it) {
- cout << "The key: " << it.key() << Qt::endl
- cout << "The value: " << it.value() << Qt::endl;
- cout << "Also the value: " << (*it) << Qt::endl;
+for (auto it = multimap.cbegin(), end = multimap.cend(); it != end; ++it) {
+ cout << "The key: " << it.key() << endl
+ cout << "The value: " << qPrintable(it.value()) << endl;
+ cout << "Also the value: " << qPrintable(*it) << endl;
}
//! [keyiterator1]
@@ -322,3 +241,16 @@ qDeleteAll(multimap2.keys());
int numPrimes = std::count_if(multimap.keyBegin(), multimap.keyEnd(), isPrimeNumber);
qDeleteAll(multimap2.keyBegin(), multimap2.keyEnd());
//! [keyiterator2]
+
+//! [26]
+QMultiMap<QString, int> map;
+map.insert("January", 1);
+map.insert("February", 2);
+// ...
+map.insert("December", 12);
+
+for (auto [key, value] : map.asKeyValueRange()) {
+ cout << qPrintable(key) << ": " << value << endl;
+ --value; // convert to JS month indexing
+}
+//! [26]
diff --git a/src/corelib/doc/snippets/code/src_corelib_tools_qpoint.cpp b/src/corelib/doc/snippets/code/src_corelib_tools_qpoint.cpp
index 7171f4b2ea..f7c06c17cc 100644
--- a/src/corelib/doc/snippets/code/src_corelib_tools_qpoint.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_tools_qpoint.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [0]
QPoint p;
diff --git a/src/corelib/doc/snippets/code/src_corelib_tools_qqueue.cpp b/src/corelib/doc/snippets/code/src_corelib_tools_qqueue.cpp
index 6046c73b0f..c59ec1060a 100644
--- a/src/corelib/doc/snippets/code/src_corelib_tools_qqueue.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_tools_qqueue.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [0]
QQueue<int> queue;
@@ -54,5 +7,5 @@ queue.enqueue(1);
queue.enqueue(2);
queue.enqueue(3);
while (!queue.isEmpty())
- cout << queue.dequeue() << Qt::endl;
+ cout << queue.dequeue() << endl;
//! [0]
diff --git a/src/corelib/doc/snippets/code/src_corelib_tools_qrect.cpp b/src/corelib/doc/snippets/code/src_corelib_tools_qrect.cpp
index a19dc086ac..403d188806 100644
--- a/src/corelib/doc/snippets/code/src_corelib_tools_qrect.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_tools_qrect.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [0]
QRect r1(100, 200, 11, 16);
diff --git a/src/corelib/doc/snippets/code/src_corelib_tools_qscopedpointer.cpp b/src/corelib/doc/snippets/code/src_corelib_tools_qscopedpointer.cpp
index d074a9a967..ee0e9eafa1 100644
--- a/src/corelib/doc/snippets/code/src_corelib_tools_qscopedpointer.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_tools_qscopedpointer.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [0]
void myFunction(bool useSubClass)
diff --git a/src/corelib/doc/snippets/code/src_corelib_tools_qscopeguard.cpp b/src/corelib/doc/snippets/code/src_corelib_tools_qscopeguard.cpp
index 2fa4f88011..8a0d8a8012 100644
--- a/src/corelib/doc/snippets/code/src_corelib_tools_qscopeguard.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_tools_qscopeguard.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2018 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Sérgio Martins <sergio.martins@kdab.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2018 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Sérgio Martins <sergio.martins@kdab.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [0]
void myComplexCodeWithMultipleReturnPoints(int v)
diff --git a/src/corelib/doc/snippets/code/src_corelib_tools_qshareddata.cpp b/src/corelib/doc/snippets/code/src_corelib_tools_qshareddata.cpp
index 88c8ae4151..2c8ca411f7 100644
--- a/src/corelib/doc/snippets/code/src_corelib_tools_qshareddata.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_tools_qshareddata.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2018 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2018 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [0]
class EmployeeData;
diff --git a/src/corelib/doc/snippets/code/src_corelib_tools_qsharedpointer.cpp b/src/corelib/doc/snippets/code/src_corelib_tools_qsharedpointer.cpp
index e2979fa7b4..fd0612590e 100644
--- a/src/corelib/doc/snippets/code/src_corelib_tools_qsharedpointer.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_tools_qsharedpointer.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2018 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2018 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [0]
class Y: public QEnableSharedFromThis<Y>
diff --git a/src/corelib/doc/snippets/code/src_corelib_tools_qsize.cpp b/src/corelib/doc/snippets/code/src_corelib_tools_qsize.cpp
index e1caf867b3..ee3b7b3268 100644
--- a/src/corelib/doc/snippets/code/src_corelib_tools_qsize.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_tools_qsize.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [0]
QSize t1(10, 12);
diff --git a/src/corelib/doc/snippets/code/src_corelib_tools_qtimeline.cpp b/src/corelib/doc/snippets/code/src_corelib_tools_qtimeline.cpp
index 80859d5ba5..39bcd4faf0 100644
--- a/src/corelib/doc/snippets/code/src_corelib_tools_qtimeline.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_tools_qtimeline.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [0]
...
diff --git a/src/corelib/doc/snippets/code/src_corelib_xml_qxmlstream.cpp b/src/corelib/doc/snippets/code/src_corelib_xml_qxmlstream.cpp
index 174c10bd4c..fe95b9939a 100644
--- a/src/corelib/doc/snippets/code/src_corelib_xml_qxmlstream.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_xml_qxmlstream.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [0]
QXmlStreamReader xml;
diff --git a/src/corelib/doc/snippets/code/src_gui_dialogs_qmessagebox.cpp b/src/corelib/doc/snippets/code/src_gui_dialogs_qmessagebox.cpp
deleted file mode 100644
index 7ec2203e5f..0000000000
--- a/src/corelib/doc/snippets/code/src_gui_dialogs_qmessagebox.cpp
+++ /dev/null
@@ -1,158 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-//! [0]
-int ret = QMessageBox::warning(this, tr("My Application"),
- tr("The document has been modified.\n"
- "Do you want to save your changes?"),
- QMessageBox::Save | QMessageBox::Discard
- | QMessageBox::Cancel,
- QMessageBox::Save);
-//! [0]
-
-
-//! [1]
-QMessageBox msgBox;
-msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
-switch (msgBox.exec()) {
-case QMessageBox::Yes:
- // yes was clicked
- break;
-case QMessageBox::No:
- // no was clicked
- break;
-default:
- // should never be reached
- break;
-}
-//! [1]
-
-
-//! [2]
-QMessageBox msgBox;
-QPushButton *connectButton = msgBox.addButton(tr("Connect"), QMessageBox::ActionRole);
-QPushButton *abortButton = msgBox.addButton(QMessageBox::Abort);
-
-msgBox.exec();
-
-if (msgBox.clickedButton() == connectButton) {
- // connect
-} else if (msgBox.clickedButton() == abortButton) {
- // abort
-}
-//! [2]
-
-
-//! [3]
-QMessageBox messageBox(this);
-QAbstractButton *disconnectButton =
- messageBox.addButton(tr("Disconnect"), QMessageBox::ActionRole);
-...
-messageBox.exec();
-if (messageBox.clickedButton() == disconnectButton) {
- ...
-}
-//! [3]
-
-
-//! [4]
-#include <QApplication>
-#include <QMessageBox>
-
-int main(int argc, char *argv[])
-{
- QT_REQUIRE_VERSION(argc, argv, "6.1.2")
-
- QApplication app(argc, argv);
- ...
- return app.exec();
-}
-//! [4]
-
-//! [5]
-QMessageBox msgBox;
-msgBox.setText("The document has been modified.");
-msgBox.exec();
-//! [5]
-
-//! [6]
-QMessageBox msgBox;
-msgBox.setText("The document has been modified.");
-msgBox.setInformativeText("Do you want to save your changes?");
-msgBox.setStandardButtons(QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel);
-msgBox.setDefaultButton(QMessageBox::Save);
-int ret = msgBox.exec();
-//! [6]
-
-//! [7]
-switch (ret) {
- case QMessageBox::Save:
- // Save was clicked
- break;
- case QMessageBox::Discard:
- // Don't Save was clicked
- break;
- case QMessageBox::Cancel:
- // Cancel was clicked
- break;
- default:
- // should never be reached
- break;
-}
-//! [7]
-
-//! [9]
-QMessageBox msgBox(this);
-msgBox.setText(tr("The document has been modified.\n"
- "Do you want to save your changes?"));
-msgBox.setStandardButtons(QMessageBox::Save | QMessageBox::Discard
- | QMessageBox::Cancel);
-msgBox.setDefaultButton(QMessageBox::Save);
-//! [9]
diff --git a/src/corelib/doc/snippets/code/src_gui_itemviews_qidentityproxymodel.cpp b/src/corelib/doc/snippets/code/src_gui_itemviews_qidentityproxymodel.cpp
index c1af521c03..4ef1891cdb 100644
--- a/src/corelib/doc/snippets/code/src_gui_itemviews_qidentityproxymodel.cpp
+++ b/src/corelib/doc/snippets/code/src_gui_itemviews_qidentityproxymodel.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Stephen Kelly <stephen.kelly@kdab.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Stephen Kelly <stephen.kelly@kdab.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [0]
class DateFormatProxyModel : public QIdentityProxyModel
@@ -64,10 +17,16 @@ class DateFormatProxyModel : public QIdentityProxyModel
return QIdentityProxyModel::data(index, role);
const QDateTime dateTime = sourceModel()->data(SourceClass::DateRole).toDateTime();
-
return dateTime.toString(m_formatString);
}
+ QMap<int, QVariant> itemData(const QModelIndex &proxyIndex) const override
+ {
+ QMap<int, QVariant> map = QIdentityProxyModel::itemData(proxyIndex);
+ map[Qt::DisplayRole] = data(proxyIndex);
+ return map;
+ }
+
private:
QString m_formatString;
};
diff --git a/src/corelib/doc/snippets/code/src_gui_itemviews_qitemselectionmodel.cpp b/src/corelib/doc/snippets/code/src_gui_itemviews_qitemselectionmodel.cpp
index 544e0f5309..0647f7f1c4 100644
--- a/src/corelib/doc/snippets/code/src_gui_itemviews_qitemselectionmodel.cpp
+++ b/src/corelib/doc/snippets/code/src_gui_itemviews_qitemselectionmodel.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [0]
QItemSelection *selection = new QItemSelection(topLeft, bottomRight);
diff --git a/src/corelib/doc/snippets/customtype/customtypeexample.cpp b/src/corelib/doc/snippets/customtype/customtypeexample.cpp
new file mode 100644
index 0000000000..afa2c4b268
--- /dev/null
+++ b/src/corelib/doc/snippets/customtype/customtypeexample.cpp
@@ -0,0 +1,90 @@
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+#include <QCoreApplication>
+#include <QDebug>
+#include <QVariant>
+
+//message.h
+
+//! [custom type definition]
+class Message
+{
+public:
+ Message() = default;
+ ~Message() = default;
+ Message(const Message &) = default;
+ Message &operator=(const Message &) = default;
+
+ Message(const QString &body, const QStringList &headers);
+
+ QStringView body() const;
+ QStringList headers() const;
+
+private:
+ QString m_body;
+ QStringList m_headers;
+};
+//! [custom type definition]
+
+//! [custom type meta-type declaration]
+Q_DECLARE_METATYPE(Message);
+//! [custom type meta-type declaration]
+
+//! [custom type streaming operator declaration]
+QDebug operator<<(QDebug dbg, const Message &message);
+//! [custom type streaming operator declaration]
+
+// message.cpp
+
+//! [custom type streaming operator]
+QDebug operator<<(QDebug dbg, const Message &message)
+{
+ const QList<QStringView> pieces = message.body().split(u"\r\n", Qt::SkipEmptyParts);
+ if (pieces.isEmpty())
+ dbg.nospace() << "Message()";
+ else if (pieces.size() == 1)
+ dbg.nospace() << "Message(" << pieces.first() << ")";
+ else
+ dbg.nospace() << "Message(" << pieces.first() << " ...)";
+ return dbg;
+}
+//! [custom type streaming operator]
+
+//! [getter functions]
+QStringView Message::body() const
+{
+ return m_body;
+}
+
+QStringList Message::headers() const
+{
+ return m_headers;
+}
+//! [getter functions]
+
+//main.cpp
+
+int main(int argc, char *argv[])
+{
+ QCoreApplication app(argc, argv);
+ QStringList headers;
+ headers << "Subject: Hello World"
+ << "From: address@example.com";
+ QString body = "This is a test.\r\n";
+ //! [printing a custom type]
+ Message message(body, headers);
+ qDebug() << "Original:" << message;
+ //! [printing a custom type]
+ //! [storing a custom value]
+ QVariant stored;
+ stored.setValue(message);
+ //! [storing a custom value]
+ qDebug() << "Stored:" << stored;
+ //! [retrieving a custom value]
+ Message retrieved = qvariant_cast<Message>(stored);
+ qDebug() << "Retrieved:" << retrieved;
+ retrieved = qvariant_cast<Message>(stored);
+ qDebug() << "Retrieved:" << retrieved;
+ //! [retrieving a custom value]
+ return 0;
+}
diff --git a/src/corelib/doc/snippets/eventfilters/filterobject.cpp b/src/corelib/doc/snippets/eventfilters/filterobject.cpp
index abe72c2045..385620f97f 100644
--- a/src/corelib/doc/snippets/eventfilters/filterobject.cpp
+++ b/src/corelib/doc/snippets/eventfilters/filterobject.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#include <QtGui>
diff --git a/src/corelib/doc/snippets/eventfilters/filterobject.h b/src/corelib/doc/snippets/eventfilters/filterobject.h
index d249743a15..7da2dae2f6 100644
--- a/src/corelib/doc/snippets/eventfilters/filterobject.h
+++ b/src/corelib/doc/snippets/eventfilters/filterobject.h
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#ifndef FILTEROBJECT_H
#define FILTEROBJECT_H
diff --git a/src/corelib/doc/snippets/eventfilters/main.cpp b/src/corelib/doc/snippets/eventfilters/main.cpp
index e7112ab1f5..f4f58b3300 100644
--- a/src/corelib/doc/snippets/eventfilters/main.cpp
+++ b/src/corelib/doc/snippets/eventfilters/main.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#include <QApplication>
#include <QTextEdit>
diff --git a/src/corelib/doc/snippets/events/events.cpp b/src/corelib/doc/snippets/events/events.cpp
index 969b0047f0..faeb168d80 100644
--- a/src/corelib/doc/snippets/events/events.cpp
+++ b/src/corelib/doc/snippets/events/events.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#include <QCheckBox>
#include <QMouseEvent>
diff --git a/src/corelib/doc/snippets/file/file.cpp b/src/corelib/doc/snippets/file/file.cpp
index ed398984d4..d1244f4bf2 100644
--- a/src/corelib/doc/snippets/file/file.cpp
+++ b/src/corelib/doc/snippets/file/file.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#include <QFile>
#include <QTextStream>
diff --git a/src/corelib/doc/snippets/fileinfo/main.cpp b/src/corelib/doc/snippets/fileinfo/main.cpp
index 6852a36af5..819bde3de5 100644
--- a/src/corelib/doc/snippets/fileinfo/main.cpp
+++ b/src/corelib/doc/snippets/fileinfo/main.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#include <QApplication>
#include <QPushButton>
@@ -78,14 +31,16 @@ int main(int argc, char *argv[])
qDebug() << fileInfo5.fileName();
qDebug() << fileInfo6.fileName();
+ QGroupBox *groupBox = new QGroupBox(QStringLiteral("QFileInfo::dir() test"));
+
+ QVBoxLayout *vbox = new QVBoxLayout(groupBox);
+
QPushButton* button1 = new QPushButton(fileInfo1.dir().path());
QPushButton* button2 = new QPushButton(fileInfo2.dir().path());
QPushButton* button3 = new QPushButton(fileInfo3.dir().path());
QPushButton* button4 = new QPushButton(fileInfo4.dir().path());
QPushButton* button5 = new QPushButton(fileInfo5.dir().path());
QPushButton* button6 = new QPushButton(fileInfo6.dir().path());
-
- QVBoxLayout* vbox = new QVBoxLayout;
vbox->addWidget(button1);
vbox->addWidget(button2);
vbox->addWidget(button3);
@@ -94,8 +49,6 @@ int main(int argc, char *argv[])
vbox->addWidget(button6);
vbox->addStretch(1);
- QGroupBox *groupBox = new QGroupBox("QFileInfo::dir() test");
- groupBox->setLayout(vbox);
groupBox->show();
return app.exec();
diff --git a/src/corelib/doc/snippets/hellotrmain.cpp b/src/corelib/doc/snippets/hellotrmain.cpp
index 526da44701..d780f19117 100644
--- a/src/corelib/doc/snippets/hellotrmain.cpp
+++ b/src/corelib/doc/snippets/hellotrmain.cpp
@@ -1,52 +1,7 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+using namespace Qt::StringLiterals;
//! [0]
int main(int argc, char *argv[])
@@ -55,7 +10,7 @@ int main(int argc, char *argv[])
QTranslator translator;
// look up e.g. :/i18n/myapp_de.qm
- if (translator.load(QLocale(), QLatin1String("myapp"), QLatin1String("_"), QLatin1String(":/i18n")))
+ if (translator.load(QLocale(), "myapp"_L1, "_"_L1, ":/i18n"_L1))
QCoreApplication::installTranslator(&translator);
QPushButton hello(QCoreApplication::translate("main", "Hello world!"));
diff --git a/src/corelib/doc/snippets/jni/src_qjniobject.cpp b/src/corelib/doc/snippets/jni/src_qjniobject.cpp
index dc58fda798..6e66b51383 100644
--- a/src/corelib/doc/snippets/jni/src_qjniobject.cpp
+++ b/src/corelib/doc/snippets/jni/src_qjniobject.cpp
@@ -1,69 +1,5 @@
-/****************************************************************************
- **
- ** Copyright (C) 2021 The Qt Company Ltd.
- ** Contact: http://www.qt.io/licensing/
- **
- ** This file is part of the documentation of the Qt Toolkit.
- **
- ** $QT_BEGIN_LICENSE:BSD$
- ** Commercial License Usage
- ** Licensees holding valid commercial Qt licenses may use this file in
- ** accordance with the commercial license agreement provided with the
- ** Software or, alternatively, in accordance with the terms contained in
- ** a written agreement between you and The Qt Company. For licensing terms
- ** and conditions see https://www.qt.io/terms-conditions. For further
- ** information use the contact form at https://www.qt.io/contact-us.
- **
- ** BSD License Usage
- ** Alternatively, you may use this file under the terms of the BSD license
- ** as follows:
- **
- ** "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 Qt Company Ltd 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."
- **
- ** $QT_END_LICENSE$
- **
- ****************************************************************************/
-
-//! [Working with lists]
-QStringList getTrackTitles(const QJniObject &album) {
- QStringList stringList;
- QJniObject list = album.callObjectMethod("getTitles",
- "()Ljava/util/List;");
-
- if (list.isValid()) {
- const int size = list.callMethod<jint>("size");
- for (int i = 0; i < size; ++i) {
- QJniObject title = list.callObjectMethod("get", "(I)Ljava/lang/Object;", i);
- stringList.append(title.toString());
- }
- }
- return stringList;
-}
-//! [Working with lists]
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [QJniObject scope]
void functionScope()
diff --git a/src/corelib/doc/snippets/ntfsp.cpp b/src/corelib/doc/snippets/ntfsp.cpp
index 099480302f..18f9bd0c5e 100644
--- a/src/corelib/doc/snippets/ntfsp.cpp
+++ b/src/corelib/doc/snippets/ntfsp.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [0]
@@ -58,3 +11,18 @@ qt_ntfs_permission_lookup++; // turn checking on
qt_ntfs_permission_lookup--; // turn it off again
//! [1]
+//! [raii]
+void complexFunction()
+{
+ QNtfsPermissionCheckGuard permissionGuard; // check is enabled
+
+ // do complex things here that need permission check enabled
+
+} // as the guard goes out of scope the check is disabled
+//! [raii]
+
+//! [free-funcs]
+qAreNtfsPermissionChecksEnabled(); // check status
+qEnableNtfsPermissionChecks(); // turn checking on
+qDisableNtfsPermissionChecks(); // turn it off again
+//! [free-funcs]
diff --git a/src/corelib/doc/snippets/overview/using-qt-core.cmake b/src/corelib/doc/snippets/overview/using-qt-core.cmake
index a2c2034b8b..6e4b8d8028 100644
--- a/src/corelib/doc/snippets/overview/using-qt-core.cmake
+++ b/src/corelib/doc/snippets/overview/using-qt-core.cmake
@@ -1,2 +1,2 @@
-find_package(Qt6 COMPONENTS Core REQUIRED)
+find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
diff --git a/src/corelib/doc/snippets/pointer/pointer.cpp b/src/corelib/doc/snippets/pointer/pointer.cpp
index 40c86d4fb2..2cc4529b85 100644
--- a/src/corelib/doc/snippets/pointer/pointer.cpp
+++ b/src/corelib/doc/snippets/pointer/pointer.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#include <QApplication>
#include <QLabel>
diff --git a/src/corelib/doc/snippets/process/process.cpp b/src/corelib/doc/snippets/process/process.cpp
index 0449ee221c..ad7e4883e9 100644
--- a/src/corelib/doc/snippets/process/process.cpp
+++ b/src/corelib/doc/snippets/process/process.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#include <QProcess>
diff --git a/src/corelib/doc/snippets/qbytearraylist/main.cpp b/src/corelib/doc/snippets/qbytearraylist/main.cpp
index fd52ef945b..d2164f326c 100644
--- a/src/corelib/doc/snippets/qbytearraylist/main.cpp
+++ b/src/corelib/doc/snippets/qbytearraylist/main.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2014 by Southwest Research Institute (R)
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2014 by Southwest Research Institute (R)
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#include <QByteArrayList>
diff --git a/src/corelib/doc/snippets/qdebug/qdebugsnippet.cpp b/src/corelib/doc/snippets/qdebug/qdebugsnippet.cpp
index 90e7e618b5..33f6039995 100644
--- a/src/corelib/doc/snippets/qdebug/qdebugsnippet.cpp
+++ b/src/corelib/doc/snippets/qdebug/qdebugsnippet.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#include <QtGui>
#include <QtDebug>
diff --git a/src/corelib/doc/snippets/qdir-listfiles/main.cpp b/src/corelib/doc/snippets/qdir-listfiles/main.cpp
index 58d512b08e..236b32c73d 100644
--- a/src/corelib/doc/snippets/qdir-listfiles/main.cpp
+++ b/src/corelib/doc/snippets/qdir-listfiles/main.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [0]
#include <QDir>
diff --git a/src/corelib/doc/snippets/qdir-namefilters/main.cpp b/src/corelib/doc/snippets/qdir-namefilters/main.cpp
index 500b32159e..b154c66310 100644
--- a/src/corelib/doc/snippets/qdir-namefilters/main.cpp
+++ b/src/corelib/doc/snippets/qdir-namefilters/main.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#include <QDir>
#include <iostream>
diff --git a/src/corelib/doc/snippets/qelapsedtimer/main.cpp b/src/corelib/doc/snippets/qelapsedtimer/main.cpp
index 408c4eab07..b24e231a25 100644
--- a/src/corelib/doc/snippets/qelapsedtimer/main.cpp
+++ b/src/corelib/doc/snippets/qelapsedtimer/main.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#include <QtCore>
void slowOperation1()
diff --git a/src/corelib/doc/snippets/qloggingcategory/main.cpp b/src/corelib/doc/snippets/qloggingcategory/main.cpp
index f5c47b2ae8..8b3a61d51f 100644
--- a/src/corelib/doc/snippets/qloggingcategory/main.cpp
+++ b/src/corelib/doc/snippets/qloggingcategory/main.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#include <QCoreApplication>
#include <QLoggingCategory>
@@ -86,15 +39,20 @@ void myCategoryFilter(QLoggingCategory *);
//![20]
//![21]
-QLoggingCategory::CategoryFilter oldCategoryFilter;
+static QLoggingCategory::CategoryFilter oldCategoryFilter = nullptr;
void myCategoryFilter(QLoggingCategory *category)
{
- // configure driver.usb category here, otherwise forward to to default filter.
+ // For a category set up after this filter is installed, we first set it up
+ // with the old filter. This ensures that any driver.usb logging configured
+ // by the user is kept, aside from the one level we override; and any new
+ // categories we're not interested in get configured by the old filter.
+ if (oldCategoryFilter)
+ oldCategoryFilter(category);
+
+ // Tweak driver.usb's logging, over-riding the default filter:
if (qstrcmp(category->categoryName(), "driver.usb") == 0)
category->setEnabled(QtDebugMsg, true);
- else
- oldCategoryFilter(category);
}
//![21]
@@ -107,8 +65,6 @@ int main(int argc, char *argv[])
//![2]
//![22]
-
-// ...
oldCategoryFilter = QLoggingCategory::installFilter(myCategoryFilter);
//![22]
@@ -175,6 +131,20 @@ oldCategoryFilter = QLoggingCategory::installFilter(myCategoryFilter);
//![15]
}
+ {
+//![16]
+ QLoggingCategory category("driver.usb");
+ qCFatal(category) << "a fatal message. Program will be terminated!";
+//![16]
+ }
+
+ {
+//![17]
+ QLoggingCategory category("driver.usb");
+ qCFatal(category, "a fatal message. Program will be terminated!");
+//![17]
+ }
+
return 0;
}
diff --git a/src/corelib/doc/snippets/qmessageauthenticationcode/main.cpp b/src/corelib/doc/snippets/qmessageauthenticationcode/main.cpp
index f93b407761..21c55568ca 100644
--- a/src/corelib/doc/snippets/qmessageauthenticationcode/main.cpp
+++ b/src/corelib/doc/snippets/qmessageauthenticationcode/main.cpp
@@ -1,52 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 Ruslan Nigmatullin <euroelessar@yandex.ru>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2023 The Qt Company Ltd.
+// Copyright (C) 2016 Ruslan Nigmatullin <euroelessar@yandex.ru>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#include <QtCore>
@@ -60,13 +14,12 @@ int main(int argc, char *argv[])
//! [0]
//! [1]
- QMessageAuthenticationCode code(QCryptographicHash::Sha1);
- code.setKey(key);
+ QMessageAuthenticationCode code(QCryptographicHash::Sha256, key);
code.addData(message);
- code.result().toHex(); // returns "de7c9b85b8b78aa6bc8a7a36f70a90701c9db4d9"
+ code.result().toHex(); // returns "f7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8"
//! [1]
//! [2]
- QMessageAuthenticationCode::hash(message, key, QCryptographicHash::Sha1).toHex();
+ QMessageAuthenticationCode::hash(message, key, QCryptographicHash::Sha256).toHex();
//! [2]
}
diff --git a/src/corelib/doc/snippets/qmetaobject-invokable/main.cpp b/src/corelib/doc/snippets/qmetaobject-invokable/main.cpp
index 28ef7981d1..c2ef624b7b 100644
--- a/src/corelib/doc/snippets/qmetaobject-invokable/main.cpp
+++ b/src/corelib/doc/snippets/qmetaobject-invokable/main.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#include <QApplication>
#include <QDebug>
diff --git a/src/corelib/doc/snippets/qmetaobject-invokable/window.cpp b/src/corelib/doc/snippets/qmetaobject-invokable/window.cpp
index 4061221857..f5ce70306d 100644
--- a/src/corelib/doc/snippets/qmetaobject-invokable/window.cpp
+++ b/src/corelib/doc/snippets/qmetaobject-invokable/window.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#include "window.h"
diff --git a/src/corelib/doc/snippets/qmetaobject-invokable/window.h b/src/corelib/doc/snippets/qmetaobject-invokable/window.h
index 1ffc6df6ae..13ab49a6af 100644
--- a/src/corelib/doc/snippets/qmetaobject-invokable/window.h
+++ b/src/corelib/doc/snippets/qmetaobject-invokable/window.h
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#ifndef WINDOW_H
#define WINDOW_H
diff --git a/src/corelib/doc/snippets/qmetaobject-revision/main.cpp b/src/corelib/doc/snippets/qmetaobject-revision/main.cpp
index 4854657911..8081f979d3 100644
--- a/src/corelib/doc/snippets/qmetaobject-revision/main.cpp
+++ b/src/corelib/doc/snippets/qmetaobject-revision/main.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 Research In Motion.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 Research In Motion.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#include <QApplication>
#include <QMetaObject>
diff --git a/src/corelib/doc/snippets/qmetaobject-revision/window.cpp b/src/corelib/doc/snippets/qmetaobject-revision/window.cpp
index b8c13d83ec..77950a5656 100644
--- a/src/corelib/doc/snippets/qmetaobject-revision/window.cpp
+++ b/src/corelib/doc/snippets/qmetaobject-revision/window.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 Research In Motion.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 Research In Motion.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#include "window.h"
diff --git a/src/corelib/doc/snippets/qmetaobject-revision/window.h b/src/corelib/doc/snippets/qmetaobject-revision/window.h
index f519a6f2dc..d08780330f 100644
--- a/src/corelib/doc/snippets/qmetaobject-revision/window.h
+++ b/src/corelib/doc/snippets/qmetaobject-revision/window.h
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 Research In Motion.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 Research In Motion.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#ifndef WINDOW_H
#define WINDOW_H
diff --git a/src/corelib/doc/snippets/qmetatype/registerConverters.cpp b/src/corelib/doc/snippets/qmetatype/registerConverters.cpp
index 11e9ce1bfc..f53d04b7a6 100644
--- a/src/corelib/doc/snippets/qmetatype/registerConverters.cpp
+++ b/src/corelib/doc/snippets/qmetatype/registerConverters.cpp
@@ -1,53 +1,7 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+#include <QJsonObject>
#include <QMetaType>
#include <QString>
@@ -58,7 +12,7 @@ int main() {
int y;
int z;
- QString toString() const { return u"[x: %1; y: %2, z: %3]"_qs.arg(QString::number(x),
+ QString toString() const { return u"[x: %1; y: %2, z: %3]"_s.arg(QString::number(x),
QString::number(y),
QString::number(z)); }
};
@@ -97,5 +51,12 @@ int main() {
QMetaType::registerConverter<CustomStringType, QString>([](const CustomStringType &str) {
return QString::fromUtf8(str.data());
});
+ QMetaType::registerConverter<QJsonValue, QPointF>(
+ [](const QJsonValue &value) -> std::optional<QPointF> {
+ const auto object = value.toObject();
+ if (!object.contains("x") || !object.contains("y"))
+ return std::nullopt; // The conversion fails if the required properties are missing
+ return QPointF{object["x"].toDouble(), object["y"].toDouble()};
+ });
//! [unaryfunc]
}
diff --git a/src/corelib/doc/snippets/qprocess-environment/main.cpp b/src/corelib/doc/snippets/qprocess-environment/main.cpp
index 8e967582ba..f443f0074e 100644
--- a/src/corelib/doc/snippets/qprocess-environment/main.cpp
+++ b/src/corelib/doc/snippets/qprocess-environment/main.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#include <QtCore>
diff --git a/src/corelib/doc/snippets/qprocess/qprocess-createprocessargumentsmodifier.cpp b/src/corelib/doc/snippets/qprocess/qprocess-createprocessargumentsmodifier.cpp
index 4310864ff0..b084e99abd 100644
--- a/src/corelib/doc/snippets/qprocess/qprocess-createprocessargumentsmodifier.cpp
+++ b/src/corelib/doc/snippets/qprocess/qprocess-createprocessargumentsmodifier.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#include <QCoreApplication>
#include <QProcess>
diff --git a/src/corelib/doc/snippets/qprocess/qprocess-simpleexecution.cpp b/src/corelib/doc/snippets/qprocess/qprocess-simpleexecution.cpp
index 6e9febe2e4..0715108754 100644
--- a/src/corelib/doc/snippets/qprocess/qprocess-simpleexecution.cpp
+++ b/src/corelib/doc/snippets/qprocess/qprocess-simpleexecution.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#include <QApplication>
#include <QtGui>
diff --git a/src/corelib/doc/snippets/qsignalmapper/buttonwidget.cpp b/src/corelib/doc/snippets/qsignalmapper/buttonwidget.cpp
index 879cdbe329..e2e97fa11c 100644
--- a/src/corelib/doc/snippets/qsignalmapper/buttonwidget.cpp
+++ b/src/corelib/doc/snippets/qsignalmapper/buttonwidget.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#include "buttonwidget.h"
@@ -58,10 +11,10 @@ ButtonWidget::ButtonWidget(const QStringList &texts, QWidget *parent)
{
signalMapper = new QSignalMapper(this);
- QGridLayout *gridLayout = new QGridLayout;
+ QGridLayout *gridLayout = new QGridLayout(this);
for (int i = 0; i < texts.size(); ++i) {
QPushButton *button = new QPushButton(texts[i]);
- connect(button, &QPushButton::clicked, signalMapper, &QSignalMapper::map);
+ connect(button, &QPushButton::clicked, signalMapper, qOverload<>(&QSignalMapper::map));
//! [0] //! [1]
signalMapper->setMapping(button, texts[i]);
gridLayout->addWidget(button, i / 3, i % 3);
@@ -70,8 +23,6 @@ ButtonWidget::ButtonWidget(const QStringList &texts, QWidget *parent)
connect(signalMapper, &QSignalMapper::mappedString,
//! [1] //! [2]
this, &ButtonWidget::clicked);
-
- setLayout(gridLayout);
}
//! [2]
@@ -79,13 +30,12 @@ ButtonWidget::ButtonWidget(const QStringList &texts, QWidget *parent)
ButtonWidget::ButtonWidget(const QStringList &texts, QWidget *parent)
: QWidget(parent)
{
- QGridLayout *gridLayout = new QGridLayout;
+ QGridLayout *gridLayout = new QGridLayout(this);
for (int i = 0; i < texts.size(); ++i) {
QString text = texts[i];
QPushButton *button = new QPushButton(text);
connect(button, &QPushButton::clicked, [this, text] { clicked(text); });
gridLayout->addWidget(button, i / 3, i % 3);
}
- setLayout(gridLayout);
}
//! [3]
diff --git a/src/corelib/doc/snippets/qsignalmapper/buttonwidget.h b/src/corelib/doc/snippets/qsignalmapper/buttonwidget.h
index 24acae997c..537c21c914 100644
--- a/src/corelib/doc/snippets/qsignalmapper/buttonwidget.h
+++ b/src/corelib/doc/snippets/qsignalmapper/buttonwidget.h
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#ifndef BUTTONWIDGET_H
#define BUTTONWIDGET_H
diff --git a/src/corelib/doc/snippets/qsortfilterproxymodel-details/main.cpp b/src/corelib/doc/snippets/qsortfilterproxymodel-details/main.cpp
index a79f07c3ae..962bece207 100644
--- a/src/corelib/doc/snippets/qsortfilterproxymodel-details/main.cpp
+++ b/src/corelib/doc/snippets/qsortfilterproxymodel-details/main.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#include <QtGui>
#include <QApplication>
diff --git a/src/corelib/doc/snippets/qstack/main.cpp b/src/corelib/doc/snippets/qstack/main.cpp
index 66823bcb59..f1f8e6a0fd 100644
--- a/src/corelib/doc/snippets/qstack/main.cpp
+++ b/src/corelib/doc/snippets/qstack/main.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#include <QtGui>
#include <iostream>
diff --git a/src/corelib/doc/snippets/qstring/main.cpp b/src/corelib/doc/snippets/qstring/main.cpp
index d0a1b9c9ba..8b39ae2f13 100644
--- a/src/corelib/doc/snippets/qstring/main.cpp
+++ b/src/corelib/doc/snippets/qstring/main.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#include <QtGui>
#include <QApplication>
@@ -88,6 +41,7 @@ public:
void firstFunction();
void leftJustifiedFunction();
void slicedFunction();
+ void sliceFunction();
void numberFunction();
void prependFunction();
@@ -735,10 +689,10 @@ void Widget::splitCaseSensitiveFunction()
//! [62]
QString str = QStringLiteral("a,,b,c");
- QStringList list1 = str.split(QLatin1Char(','));
+ QStringList list1 = str.split(u',');
// list1: [ "a", "", "b", "c" ]
- QStringList list2 = str.split(QLatin1Char(','), Qt::SkipEmptyParts);
+ QStringList list2 = str.split(u',', Qt::SkipEmptyParts);
// list2: [ "a", "b", "c" ]
//! [62]
@@ -750,7 +704,7 @@ void Widget::splitCaseSensitiveFunction()
//! [62-slashes]
QString str = "/a/b/c/";
- auto parts = str.split(QLatin1Char('/'));
+ auto parts = str.split(u'/');
// parts: {"", "a", "b", "c", ""}
//! [62-slashes]
}
@@ -956,6 +910,15 @@ void Widget::arrayOperator()
//! [85]
}
+void Widget::sliceFunction()
+{
+ //! [86]
+ QString x = u"Nine pineapples"_s;
+ x.slice(5); // x == "pineapples"
+ x.slice(4, 3); // x == "app"
+ //! [86]
+}
+
int main(int argc, char *argv[])
{
diff --git a/src/corelib/doc/snippets/qstring/stringbuilder.cpp b/src/corelib/doc/snippets/qstring/stringbuilder.cpp
index b81b40e10e..c3a709bd4c 100644
--- a/src/corelib/doc/snippets/qstring/stringbuilder.cpp
+++ b/src/corelib/doc/snippets/qstring/stringbuilder.cpp
@@ -1,72 +1,46 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+#include <QString>
+
+using namespace Qt::StringLiterals;
//! [0]
QString foo;
QString type = "long";
- foo = QLatin1String("vector<") + type + QLatin1String(">::iterator");
+ foo = "vector<"_L1 + type + ">::iterator"_L1;
if (foo.startsWith("(" + type + ") 0x"))
...
//! [0]
-//! [3]
- DEFINES *= QT_USE_QSTRINGBUILDER
-//! [3]
-
//! [5]
#include <QStringBuilder>
QString hello("hello");
QStringView el = QStringView{ hello }.mid(2, 3);
- QLatin1String world("world");
+ QLatin1StringView world("world");
QString message = hello % el % world % QChar('!');
//! [5]
+
+//! [6]
+ QString str("QStringBuilder");
+
+ // "s" type is deduced as QStringBuilder<...>
+ auto s = "Like hot glue, " % str % " concatenates strings";
+
+ // Similarly the return type of this lambda is deduced as QStringBuilder<...>
+ auto concatenateStr = []() {
+ return "Like hot glue, " % str % " concatenates strings";
+ };
+//! [6]
+
+//! [7]
+ QString s = "Like hot glue, " % str % " concatenates strings";
+
+ // With a lambda, specify a trailing return type:
+ auto concatenateStr = []() -> QString {
+ return "Like hot glue, " % str % " concatenates strings";
+ };
+//! [7]
diff --git a/src/corelib/doc/snippets/qstringlist/main.cpp b/src/corelib/doc/snippets/qstringlist/main.cpp
index fceadc4e99..1b7453cf6a 100644
--- a/src/corelib/doc/snippets/qstringlist/main.cpp
+++ b/src/corelib/doc/snippets/qstringlist/main.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#include <QtGui>
#include <iostream>
@@ -69,24 +22,6 @@ Widget::Widget(QWidget *parent)
fonts << "Courier" << "Verdana";
//! [0b]
-//! [1]
- for (int i = 0; i < fonts.size(); ++i)
- cout << fonts.at(i).toLocal8Bit().constData() << Qt::endl;
-//! [1]
-
-//! [2]
- QStringListIterator javaStyleIterator(fonts);
- while (javaStyleIterator.hasNext())
- cout << javaStyleIterator.next().toLocal8Bit().constData() << Qt::endl;
-//! [2]
-
-//! [3]
- QStringList::const_iterator constIterator;
- for (constIterator = fonts.constBegin(); constIterator != fonts.constEnd();
- ++constIterator)
- cout << (*constIterator).toLocal8Bit().constData() << Qt::endl;
-//! [3]
-
//! [4]
QString str = fonts.join(", ");
// str == "Arial, Helvetica, Times, Courier"
@@ -131,7 +66,7 @@ Widget::Widget(QWidget *parent)
result.clear();
//! [12]
- foreach (const QString &str, list) {
+ for (const auto &str : std::as_const(list)) {
if (str.contains("Bill"))
result += str;
}
@@ -158,6 +93,13 @@ Widget::Widget(QWidget *parent)
// list == ["Bill Clinton", "Bill Murray"]
//! [17]
+ {
+//! [18]
+ QStringList veryLongList;
+ QStringMatcher matcher(u"Straße", Qt::CaseInsensitive);
+ QStringList filtered = veryLongList.filter(matcher);
+//! [18]
+ }
}
int main(int argc, char *argv[])
diff --git a/src/corelib/doc/snippets/qstringlistmodel/main.cpp b/src/corelib/doc/snippets/qstringlistmodel/main.cpp
index fa7f414526..b0d14e110e 100644
--- a/src/corelib/doc/snippets/qstringlistmodel/main.cpp
+++ b/src/corelib/doc/snippets/qstringlistmodel/main.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#include <QtGui>
diff --git a/src/corelib/doc/snippets/qtcast/qtcast.cpp b/src/corelib/doc/snippets/qtcast/qtcast.cpp
index ba8582eabb..177446aff9 100644
--- a/src/corelib/doc/snippets/qtcast/qtcast.cpp
+++ b/src/corelib/doc/snippets/qtcast/qtcast.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#include <QLabel>
#include <QPushButton>
diff --git a/src/corelib/doc/snippets/qversionnumber/main.cpp b/src/corelib/doc/snippets/qversionnumber/main.cpp
index 27b7b1a7ef..b78e14edf1 100644
--- a/src/corelib/doc/snippets/qversionnumber/main.cpp
+++ b/src/corelib/doc/snippets/qversionnumber/main.cpp
@@ -1,53 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2016 Keith Gardner <kreios4004@gmail.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2016 Keith Gardner <kreios4004@gmail.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#include <QVersionNumber>
@@ -90,15 +43,15 @@ void QObject::parse()
{
//! [3]
QString string("5.4.0-alpha");
- int suffixIndex;
+ qsizetype suffixIndex;
QVersionNumber version = QVersionNumber::fromString(string, &suffixIndex);
// version is 5.4.0
// suffixIndex is 5
//! [3]
//! [3-latin1-1]
- QLatin1String string("5.4.0-alpha");
- int suffixIndex;
+ QLatin1StringView string("5.4.0-alpha");
+ qsizetype suffixIndex;
auto version = QVersionNumber::fromString(string, &suffixIndex);
// version is 5.4.0
// suffixIndex is 5
diff --git a/src/corelib/doc/snippets/qxmlstreamwriter/main.cpp b/src/corelib/doc/snippets/qxmlstreamwriter/main.cpp
index 5a300499ba..ccf536c413 100644
--- a/src/corelib/doc/snippets/qxmlstreamwriter/main.cpp
+++ b/src/corelib/doc/snippets/qxmlstreamwriter/main.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#include <QCoreApplication>
#include <QFile>
diff --git a/src/corelib/doc/snippets/resource-system/CMakeLists.txt b/src/corelib/doc/snippets/resource-system/CMakeLists.txt
index a488d869e6..f0ec0f6816 100644
--- a/src/corelib/doc/snippets/resource-system/CMakeLists.txt
+++ b/src/corelib/doc/snippets/resource-system/CMakeLists.txt
@@ -1,6 +1,9 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
project(my_app)
cmake_minimum_required(VERSION 3.16)
-find_package(Qt6 COMPONENTS Widgets Qml REQUIRED)
+find_package(Qt6 REQUIRED COMPONENTS Widgets Qml)
#! [AUTORCC]
set(CMAKE_AUTORCC ON)
diff --git a/src/corelib/doc/snippets/resource-system/application.pro b/src/corelib/doc/snippets/resource-system/application.pro
index 4b1f1d7635..42c66eba4c 100644
--- a/src/corelib/doc/snippets/resource-system/application.pro
+++ b/src/corelib/doc/snippets/resource-system/application.pro
@@ -2,9 +2,9 @@ TEMPLATE = app
QT += qml widgets
-#! [0]
+#! [0] #! [qrc]
RESOURCES = application.qrc
-#! [0]
+#! [0] #! [qrc]
#! [1]
resources.files = \
diff --git a/src/corelib/doc/snippets/resource-system/main.cpp b/src/corelib/doc/snippets/resource-system/main.cpp
index 892f29d01d..7089ebf576 100644
--- a/src/corelib/doc/snippets/resource-system/main.cpp
+++ b/src/corelib/doc/snippets/resource-system/main.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#include <QQmlApplicationEngine>
#include <QAction>
diff --git a/src/corelib/doc/snippets/resource-system/mainwindow.cpp b/src/corelib/doc/snippets/resource-system/mainwindow.cpp
index 6dc525304c..de98aa56ec 100644
--- a/src/corelib/doc/snippets/resource-system/mainwindow.cpp
+++ b/src/corelib/doc/snippets/resource-system/mainwindow.cpp
@@ -1,62 +1,10 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-//! [0]
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
#include <QtWidgets>
#include "mainwindow.h"
-//! [0]
-
-//! [1]
MainWindow::MainWindow()
-//! [1] //! [2]
{
textEdit = new QPlainTextEdit;
setCentralWidget(textEdit);
@@ -74,11 +22,8 @@ MainWindow::MainWindow()
setCurrentFile(QString());
setUnifiedTitleAndToolBarOnMac(true);
}
-//! [2]
-//! [3]
void MainWindow::closeEvent(QCloseEvent *event)
-//! [3] //! [4]
{
if (maybeSave()) {
writeSettings();
@@ -87,22 +32,16 @@ void MainWindow::closeEvent(QCloseEvent *event)
event->ignore();
}
}
-//! [4]
-//! [5]
void MainWindow::newFile()
-//! [5] //! [6]
{
if (maybeSave()) {
textEdit->clear();
setCurrentFile(QString());
}
}
-//! [6]
-//! [7]
void MainWindow::open()
-//! [7] //! [8]
{
if (maybeSave()) {
QString fileName = QFileDialog::getOpenFileName(this);
@@ -110,11 +49,8 @@ void MainWindow::open()
loadFile(fileName);
}
}
-//! [8]
-//! [9]
bool MainWindow::save()
-//! [9] //! [10]
{
if (curFile.isEmpty()) {
return saveAs();
@@ -122,11 +58,8 @@ bool MainWindow::save()
return saveFile(curFile);
}
}
-//! [10]
-//! [11]
bool MainWindow::saveAs()
-//! [11] //! [12]
{
QString fileName = QFileDialog::getSaveFileName(this);
if (fileName.isEmpty())
@@ -134,42 +67,31 @@ bool MainWindow::saveAs()
return saveFile(fileName);
}
-//! [12]
-//! [13]
void MainWindow::about()
-//! [13] //! [14]
{
QMessageBox::about(this, tr("About Application"),
tr("The <b>Application</b> example demonstrates how to "
"write modern GUI applications using Qt, with a menu bar, "
"toolbars, and a status bar."));
}
-//! [14]
-//! [15]
void MainWindow::documentWasModified()
-//! [15] //! [16]
{
setWindowModified(textEdit->document()->isModified());
}
-//! [16]
-//! [17]
void MainWindow::createActions()
-//! [17] //! [18]
{
newAct = new QAction(QIcon(":/images/new.png"), tr("&New"), this);
newAct->setShortcuts(QKeySequence::New);
newAct->setStatusTip(tr("Create a new file"));
connect(newAct, &QAction::triggered, this, &MainWindow::newFile);
-//! [19]
openAct = new QAction(QIcon(":/images/open.png"), tr("&Open..."), this);
openAct->setShortcuts(QKeySequence::Open);
openAct->setStatusTip(tr("Open an existing file"));
connect(openAct, &QAction::triggered, this, &MainWindow::open);
-//! [18] //! [19]
saveAct = new QAction(QIcon(":/images/save.png"), tr("&Save"), this);
saveAct->setShortcuts(QKeySequence::Save);
@@ -181,10 +103,8 @@ void MainWindow::createActions()
saveAsAct->setStatusTip(tr("Save the document under a new name"));
connect(saveAsAct, &QAction::triggered, this, &MainWindow::saveAs);
-//! [20]
exitAct = new QAction(tr("E&xit"), this);
exitAct->setShortcuts(QKeySequence::Quit);
-//! [20]
exitAct->setStatusTip(tr("Exit the application"));
connect(exitAct, &QAction::triggered, this, &MainWindow::close);
@@ -212,34 +132,24 @@ void MainWindow::createActions()
aboutAct->setStatusTip(tr("Show the application's About box"));
connect(aboutAct, &QAction::triggered, this, &MainWindow::about);
-//! [22]
aboutQtAct = new QAction(tr("About &Qt"), this);
aboutQtAct->setStatusTip(tr("Show the Qt library's About box"));
connect(aboutQtAct, &QAction::triggered, qApp, &QApplication::aboutQt);
-//! [22]
-//! [23]
cutAct->setEnabled(false);
-//! [23] //! [24]
copyAct->setEnabled(false);
connect(textEdit, &QTextEdit::copyAvailable,
cutAct, &QAction::setEnabled);
connect(textEdit, &QTextEdit::copyAvailable,
copyAct, &QAction::setEnabled);
}
-//! [24]
-//! [25] //! [26]
void MainWindow::createMenus()
-//! [25] //! [27]
{
fileMenu = menuBar()->addMenu(tr("&File"));
fileMenu->addAction(newAct);
-//! [28]
fileMenu->addAction(openAct);
-//! [28]
fileMenu->addAction(saveAct);
-//! [26]
fileMenu->addAction(saveAsAct);
fileMenu->addSeparator();
fileMenu->addAction(exitAct);
@@ -255,16 +165,12 @@ void MainWindow::createMenus()
helpMenu->addAction(aboutAct);
helpMenu->addAction(aboutQtAct);
}
-//! [27]
-//! [29] //! [30]
void MainWindow::createToolBars()
{
fileToolBar = addToolBar(tr("File"));
fileToolBar->addAction(newAct);
-//! [29] //! [31]
fileToolBar->addAction(openAct);
-//! [31]
fileToolBar->addAction(saveAct);
editToolBar = addToolBar(tr("Edit"));
@@ -272,19 +178,13 @@ void MainWindow::createToolBars()
editToolBar->addAction(copyAct);
editToolBar->addAction(pasteAct);
}
-//! [30]
-//! [32]
void MainWindow::createStatusBar()
-//! [32] //! [33]
{
statusBar()->showMessage(tr("Ready"));
}
-//! [33]
-//! [34] //! [35]
void MainWindow::readSettings()
-//! [34] //! [36]
{
QSettings settings("QtProject", "Application Example");
QPoint pos = settings.value("pos", QPoint(200, 200)).toPoint();
@@ -292,21 +192,15 @@ void MainWindow::readSettings()
resize(size);
move(pos);
}
-//! [35] //! [36]
-//! [37] //! [38]
void MainWindow::writeSettings()
-//! [37] //! [39]
{
QSettings settings("QtProject", "Application Example");
settings.setValue("pos", pos());
settings.setValue("size", size());
}
-//! [38] //! [39]
-//! [40]
bool MainWindow::maybeSave()
-//! [40] //! [41]
{
if (textEdit->document()->isModified()) {
QMessageBox::StandardButton ret;
@@ -321,11 +215,8 @@ bool MainWindow::maybeSave()
}
return true;
}
-//! [41]
-//! [42]
void MainWindow::loadFile(const QString &fileName)
-//! [42] //! [43]
{
QFile file(fileName);
if (!file.open(QFile::ReadOnly | QFile::Text)) {
@@ -348,11 +239,8 @@ void MainWindow::loadFile(const QString &fileName)
setCurrentFile(fileName);
statusBar()->showMessage(tr("File loaded"), 2000);
}
-//! [43]
-//! [44]
bool MainWindow::saveFile(const QString &fileName)
-//! [44] //! [45]
{
QFile file(fileName);
if (!file.open(QFile::WriteOnly | QFile::Text)) {
@@ -376,11 +264,8 @@ bool MainWindow::saveFile(const QString &fileName)
statusBar()->showMessage(tr("File saved"), 2000);
return true;
}
-//! [45]
-//! [46]
void MainWindow::setCurrentFile(const QString &fileName)
-//! [46] //! [47]
{
curFile = fileName;
textEdit->document()->setModified(false);
@@ -391,12 +276,8 @@ void MainWindow::setCurrentFile(const QString &fileName)
shownName = "untitled.txt";
setWindowFilePath(shownName);
}
-//! [47]
-//! [48]
QString MainWindow::strippedName(const QString &fullFileName)
-//! [48] //! [49]
{
return QFileInfo(fullFileName).fileName();
}
-//! [49]
diff --git a/src/corelib/doc/snippets/settings/settings.cpp b/src/corelib/doc/snippets/settings/settings.cpp
index a3491d8c76..c73b42b2a4 100644
--- a/src/corelib/doc/snippets/settings/settings.cpp
+++ b/src/corelib/doc/snippets/settings/settings.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#include <QtGui>
diff --git a/src/corelib/doc/snippets/sharedemployee/employee.h b/src/corelib/doc/snippets/sharedemployee/employee.h
index 3b8e7133b7..c44f71499e 100644
--- a/src/corelib/doc/snippets/sharedemployee/employee.h
+++ b/src/corelib/doc/snippets/sharedemployee/employee.h
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#ifndef EMPLOYEE_H
#define EMPLOYEE_H
diff --git a/src/corelib/doc/snippets/sharedemployee/main.cpp b/src/corelib/doc/snippets/sharedemployee/main.cpp
index d1f51425b7..f3684e38a8 100644
--- a/src/corelib/doc/snippets/sharedemployee/main.cpp
+++ b/src/corelib/doc/snippets/sharedemployee/main.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [0]
#include "employee.h"
diff --git a/src/corelib/doc/snippets/signalsandslots/lcdnumber.h b/src/corelib/doc/snippets/signalsandslots/lcdnumber.h
index b311586e8f..f80b2186a8 100644
--- a/src/corelib/doc/snippets/signalsandslots/lcdnumber.h
+++ b/src/corelib/doc/snippets/signalsandslots/lcdnumber.h
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [0]
#ifndef LCDNUMBER_H
diff --git a/src/corelib/doc/snippets/signalsandslots/signalsandslots.cpp b/src/corelib/doc/snippets/signalsandslots/signalsandslots.cpp
index 31ed6ed08a..fe38a3222a 100644
--- a/src/corelib/doc/snippets/signalsandslots/signalsandslots.cpp
+++ b/src/corelib/doc/snippets/signalsandslots/signalsandslots.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#include "signalsandslots.h"
diff --git a/src/corelib/doc/snippets/signalsandslots/signalsandslots.h b/src/corelib/doc/snippets/signalsandslots/signalsandslots.h
index 760bc2c7b1..2f5a53231c 100644
--- a/src/corelib/doc/snippets/signalsandslots/signalsandslots.h
+++ b/src/corelib/doc/snippets/signalsandslots/signalsandslots.h
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#ifndef SIGNALSANDSLOTS_H
#define SIGNALSANDSLOTS_H
diff --git a/src/corelib/doc/snippets/streaming/main.cpp b/src/corelib/doc/snippets/streaming/main.cpp
index 0c857b0528..a4f73526c5 100644
--- a/src/corelib/doc/snippets/streaming/main.cpp
+++ b/src/corelib/doc/snippets/streaming/main.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#include <QtCore>
#include <QByteArray>
diff --git a/src/corelib/doc/snippets/threads/threads.cpp b/src/corelib/doc/snippets/threads/threads.cpp
index a748755a19..502bc4bfe0 100644
--- a/src/corelib/doc/snippets/threads/threads.cpp
+++ b/src/corelib/doc/snippets/threads/threads.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#include <QCache>
#include <QMutex>
@@ -54,9 +7,7 @@
#define Counter ReentrantCounter
-//! [3]
class Counter
-//! [3] //! [4]
{
public:
Counter() { n = 0; }
@@ -68,14 +19,11 @@ public:
private:
int n;
};
-//! [4]
#undef Counter
#define Counter ThreadSafeCounter
-//! [5]
class Counter
-//! [5] //! [6]
{
public:
Counter() { n = 0; }
@@ -88,7 +36,6 @@ private:
mutable QMutex mutex;
int n;
};
-//! [6]
typedef int SomeClass;
diff --git a/src/corelib/doc/snippets/timers/analogclock.cpp b/src/corelib/doc/snippets/timers/analogclock.cpp
index 3edfce3235..5241e57879 100644
--- a/src/corelib/doc/snippets/timers/analogclock.cpp
+++ b/src/corelib/doc/snippets/timers/analogclock.cpp
@@ -1,58 +1,12 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#include <QtWidgets>
#include "analogclock.h"
-//! [0] //! [1]
+// QTimer
+//! [0]
AnalogClock::AnalogClock(QWidget *parent)
//! [0] //! [2]
: QWidget(parent)
@@ -70,11 +24,24 @@ AnalogClock::AnalogClock(QWidget *parent)
resize(200, 200);
//! [7]
}
-//! [1] //! [7]
+//! [7]
+
+//! [analogclock-qchronotimer]
+AnalogClock::AnalogClock(QWidget *parent)
+
+ : QWidget(parent)
+{
+ auto *timer = new QChronoTimer(1s, this);
+ connect(timer, &QTimer::timeout, this, QOverload<>::of(&AnalogClock::update));
+ timer->start();
+ ...
+ ...
+ setWindowTitle(tr("Analog Clock"));
+ resize(200, 200);
+}
+//! [analogclock-qchronotimer]
-//! [8] //! [9]
void AnalogClock::paintEvent(QPaintEvent *)
-//! [8] //! [10]
{
static const QPoint hourHand[3] = {
QPoint(7, 8),
@@ -92,64 +59,40 @@ void AnalogClock::paintEvent(QPaintEvent *)
int side = qMin(width(), height());
QTime time = QTime::currentTime();
-//! [10]
-//! [11]
QPainter painter(this);
-//! [11] //! [12]
painter.setRenderHint(QPainter::Antialiasing);
-//! [12] //! [13]
painter.translate(width() / 2, height() / 2);
-//! [13] //! [14]
painter.scale(side / 200.0, side / 200.0);
-//! [9] //! [14]
-//! [15]
painter.setPen(Qt::NoPen);
-//! [15] //! [16]
painter.setBrush(hourColor);
-//! [16]
-//! [17] //! [18]
painter.save();
-//! [17] //! [19]
painter.rotate(30.0 * ((time.hour() + time.minute() / 60.0)));
painter.drawConvexPolygon(hourHand, 3);
painter.restore();
-//! [18] //! [19]
-//! [20]
painter.setPen(hourColor);
-//! [20] //! [21]
for (int i = 0; i < 12; ++i) {
painter.drawLine(88, 0, 96, 0);
painter.rotate(30.0);
}
-//! [21]
-//! [22]
painter.setPen(Qt::NoPen);
-//! [22] //! [23]
painter.setBrush(minuteColor);
-//! [24]
painter.save();
painter.rotate(6.0 * (time.minute() + time.second() / 60.0));
painter.drawConvexPolygon(minuteHand, 3);
painter.restore();
-//! [23] //! [24]
-//! [25]
painter.setPen(minuteColor);
-//! [25] //! [26]
-//! [27]
for (int j = 0; j < 60; ++j) {
if ((j % 5) != 0)
painter.drawLine(92, 0, 96, 0);
painter.rotate(6.0);
}
-//! [27]
}
-//! [26]
diff --git a/src/corelib/doc/snippets/timers/timers.cpp b/src/corelib/doc/snippets/timers/timers.cpp
index eb0c82c625..1a97ba535e 100644
--- a/src/corelib/doc/snippets/timers/timers.cpp
+++ b/src/corelib/doc/snippets/timers/timers.cpp
@@ -1,55 +1,12 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "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 Qt Company Ltd 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+#include <QChronoTimer>
+#include <QObject>
#include <QTimer>
+using namespace std::chrono;
+
class Foo : public QObject
{
public:
@@ -82,7 +39,45 @@ Foo::Foo()
}
}
-int main()
+// QChronoTimer
+class MyWidget : QObject
{
+ MyWidget()
+ {
+//! [qchronotimer-singleshot]
+ MyWidget widget;
+ QChronoTimer::singleShot(200ms, &widget, &MyWidget::updateCaption);
+//! [qchronotimer-singleshot]
+//! [zero-timer]
+ // The default interval is 0ns
+ QChronoTimer *timer = new QChronoTimer(this);
+ connect(timer, &QChronoTimer::timeout, this, &MyWidget::processOneThing);
+ timer->start();
+//! [zero-timer]
+
+ {
+//! [timer-interval-in-ctor]
+ QChronoTimer *timer = new QChronoTimer(1s, this);
+ connect(timer, &QChronoTimer::timeout, this, &MyWidget::processOneThing);
+ timer->start();
+//! [timer-interval-in-ctor]
+ }
+
+ {
+//! [timer-setinterval]
+ QChronoTimer *timer = new QChronoTimer(this);
+ connect(timer, &QChronoTimer::timeout, this, &MyWidget::processOneThing);
+ timer->setInterval(1s);
+ timer->start();
+//! [timer-setinterval]
+ }
+ }
+
+public Q_SLOTS:
+ void processOneThing();
+};
+
+int main()
+{
}
diff --git a/src/corelib/doc/src/animation.qdoc b/src/corelib/doc/src/animation.qdoc
index d67ac2e505..3d6c1eefa2 100644
--- a/src/corelib/doc/src/animation.qdoc
+++ b/src/corelib/doc/src/animation.qdoc
@@ -1,29 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
\group animation
@@ -46,153 +22,134 @@
\keyword Animation
- The animation framework aims to provide an easy way for creating animated
- and smooth GUIs. By animating Qt properties, the framework provides great
- freedom for animating widgets and other \l{QObject}s. The framework can
- also be used with the Graphics View framework. Many of the concepts
- available in the animation framework are also available in \l{Qt Quick},
- where it offers a declarative way of defining animations. Much of the
- knowledge acquired about the animation framework can be applied to
- \l{Qt Quick}.
+ The animation framework provides an easy way to animate your GUI elements.
+ It enables you to animate a Qt property value of a widget or QObject.
+ Most of the features offered by the framework are also available in
+ \l{Qt Quick}, where it's possible to define animations in a declarative way.
- In this overview, we explain the basics of its architecture. We
- also show examples of the most common techniques that the
- framework allows for animating \l{QObject}s and graphics items.
+ This overview explains the framework's architecture, with examples that
+ demonstrate the common techniques used for animating QObject and
+ GUI elements.
\tableofcontents
- \section1 The Animation Architecture
+ \section1 The Animation architecture
- We will in this section take a high-level look at the animation
- framework's architecture and how it is used to animate Qt
- properties. The following diagram shows the most important classes
- in the animation framework.
+ The following diagram shows the most important classes provided by the
+ framework:
\image animations-architecture.png
- The animation framework foundation consists of the base class
- QAbstractAnimation, and its two subclasses QVariantAnimation and
- QAnimationGroup. QAbstractAnimation is the ancestor of all
- animations. It represents basic properties that are common for all
- animations in the framework; notably, the ability to start, stop,
- and pause an animation. It is also receives the time change
- notifications.
-
- The animation framework further provides the QPropertyAnimation
- class, which inherits QVariantAnimation and performs animation of
- a Qt property, which is part of Qt's \l{Meta-Object
- System}{meta-object system}. The class performs an interpolation
- over the property using an easing curve. So when you want to
- animate a value, you can declare it as a property and make your
- class a QObject. Note that this gives us great freedom in
- animating already existing widgets and other \l{QObject}s.
+ It includes the QAbstractAnimation class, which provides the
+ necessary foundation for animations. This class defines the
+ generic properties for all animations supported by the framework.
+ For example, the ability to start, stop, and pause an animation. The
+ class also receives the time change notifications.
+
+ The framework further provides the QVariantAnimation and
+ QAnimationGroup classes, which build on their base case, QAbstractAnimation.
+ Next in the hierarchy is QPropertyAnimation, which is derived from
+ QVariantAnmiation, and it lets you animate a Qt property of a widget or
+ QObject. The class performs interpolation on the property value using an
+ easing curve. With these in place, you just need a QObject class with a
+ Qt property value that you can animate.
+
+ \note It is required that the target object you are animating is a QObject
+ or its subclass. This is necessary as the animation framework depends on the
+ \l{Meta-Object System}{meta-object system} for all the information about the
+ object it is animating.
Complex animations can be constructed by building a tree structure
- of \l{QAbstractAnimation}s. The tree is built by using
- \l{QAnimationGroup}s, which function as containers for other
- animations. Note also that the groups are subclasses of
- QAbstractAnimation, so groups can themselves contain other groups.
+ of \l{QAbstractAnimation}s, where the tree is a QAnimationGroup that
+ contains other animations. These animation groups can also contain
+ subgroups representing different groups or animations, such as
+ QParallelAnimationGroup and QSequentialAnimationGroup.
- Behind the scenes, the animations are controlled by a global
- timer, which sends \l{QAbstractAnimation::updateCurrentTime()}{updates} to
- all animations that are playing.
+ Behind the scenes, all animations are controlled by a global
+ timer, which sends \l{QAbstractAnimation::updateCurrentTime()}{updates} about
+ all animations that are running.
- For detailed descriptions of the classes' function and roles in
- the framework, please look up their class descriptions.
+ For detailed information of these individual classes' and their roles in
+ the framework, refer to their documentation.
- \section1 Classes in the Animation Framework
+ \section1 Classes offered by the framework
- These classes provide a framework for creating both simple and complex
- animations.
+ These classes provide the necessary infrastructure to create both simple and
+ complex animations.
\annotatedlist animation
- \section1 Animating Qt Properties
+ \section1 Animating Qt properties
- As mentioned in the previous section, the QPropertyAnimation class can
- interpolate over Qt properties. It is often this class that should be used
- for animation of values; in fact, its superclass, QVariantAnimation, has an
- empty implementation of \l{QVariantAnimation::}{updateCurrentValue()}, and
- does not change any value unless we change it ourselves on the
+ As the QPropertyAnimation class can interpolate on Qt properties, it is
+ used often. In fact, its superclass---QVariantAnimation---provides an
+ abstract implementation of \l{QVariantAnimation::}{updateCurrentValue()},
+ which does not change any value unless you change it on the
\l{QVariantAnimation::valueChanged()}{valueChanged signal}.
- A major reason we chose to animate Qt properties is that it
- presents us with freedom to animate already existing classes in
- the Qt API. Notably, the QWidget class (which we can also embed in
- a QGraphicsView) has properties for its bounds, colors, etc.
- Let's look at a small example:
+ The framework lets you animate the Qt properties of the existing
+ classes in Qt. For example, the QWidget class---can be embedded in
+ a QGraphicsView---has properties for its bounds, colors, and so on.
+ The following example demonstrates how you can animate a QPushButton
+ widget:
- \code
- QPushButton button("Animated Button");
- button.show();
-
- QPropertyAnimation animation(&button, "geometry");
- animation.setDuration(10000);
- animation.setStartValue(QRect(0, 0, 100, 30));
- animation.setEndValue(QRect(250, 250, 100, 30));
-
- animation.start();
- \endcode
+ \snippet code/src_corelib_animation_qpropertyanimation.cpp 0
- This code will move \c button from the top left corner of the
- screen to the position (250, 250) in 10 seconds (10000 milliseconds).
+ The example animates the \c pos Qt property of a QPushButton, to move
+ it from the top--left corner of the screen to the end position (250, 250),
+ in 10 seconds (10000 milliseconds).
- The example above will do a linear interpolation between the
- start and end value. It is also possible to set values
- situated between the start and end value. The interpolation
- will then go by these points.
+ It uses the linear interpolation method to control the speed of
+ animation between the start and end values. Try adding another value
+ in--between the start and end value to see how they are interpolated.
+ This time use the QPropertyAnimation::setKeyValueAt function to add
+ these values:
\code
- QPushButton button("Animated Button");
- button.show();
-
- QPropertyAnimation animation(&button, "geometry");
- animation.setDuration(10000);
-
- animation.setKeyValueAt(0, QRect(0, 0, 100, 30));
- animation.setKeyValueAt(0.8, QRect(250, 250, 100, 30));
- animation.setKeyValueAt(1, QRect(0, 0, 100, 30));
-
- animation.start();
+ ...
+ anim->setDuration(10000);
+ anim->setKeyValueAt(0, QPoint(0, 0));
+ anim->setKeyValueAt(0.8, QPoint(250, 250));
+ anim->setKeyValueAt(1, QPoint(0, 0));
+ ...
\endcode
- In this example, the animation will take the button to (250, 250)
- in 8 seconds, and then move it back to its original position in
- the remaining 2 seconds. The movement will be linearly
- interpolated between these points.
+ In this example, the animation moves the button to
+ (250, 250) in 8 seconds, and moves it back to its original position in
+ the remaining 2 seconds. The button's movement is linear-interpolated
+ between these points.
- You also have the possibility to animate values of a QObject
- that is not declared as a Qt property. The only requirement is
- that this value has a setter. You can then subclass the class
- containing the value and declare a property that uses this setter.
- Note that each Qt property requires a getter, so you will need to
- provide a getter yourself if this is not defined.
+ You can also animate a QObject's value that is not declared as a Qt
+ property, if the value has a setter method. In such cases, derive
+ a new class from the class that contains the value, and add a Qt property
+ for that value with the setter.
+
+ \note Each Qt property requires a getter also, so you should provide a
+ getter if that is not defined.
\code
class MyGraphicsRectItem : public QObject, public QGraphicsRectItem
{
Q_OBJECT
- Q_PROPERTY(QRectF geometry READ geometry WRITE setGeometry)
+ Q_PROPERTY(QPointF pos READ pos WRITE setPos)
};
\endcode
- In the above code example, we subclass QGraphicsRectItem and
- define a geometry property. We can now animate the widgets
- geometry even if QGraphicsRectItem does not provide the geometry
- property.
+ In this example, the \c MyGraphicsRectItem derives from
+ QGraphicsRectItem and QObject, and defines the \c pos property. You can
+ animate the item's \c pos even if QGraphicsRectItem does not provide
+ the \c pos property.
- For a general introduction to the Qt property system, see its
- \l{Qt's Property System}{overview}.
+ For a general introduction to the Qt property system, refer to
+ \l{Qt's Property System}.
\section1 Animations and the Graphics View Framework
- When you want to animate \l{QGraphicsItem}s, you also use
- QPropertyAnimation. However, QGraphicsItem does not inherit QObject.
- A good solution is to subclass the graphics item you wish to animate.
- This class will then also inherit QObject.
- This way, QPropertyAnimation can be used for \l{QGraphicsItem}s.
- The example below shows how this is done. Another possibility is
- to inherit QGraphicsWidget, which already is a QObject.
+ QPropertyAnimation can also be used to animate a QGraphicsItem, which does
+ not inherit QObject. In such cases, you derive a class from the graphics
+ item that you want to animate. This derived class should also inherit form
+ QObject to enable using QPropertyAnimation on a QGraphicsItem. The
+ following example shows how this is done:
\code
class Pixmap : public QObject, public QGraphicsPixmapItem
@@ -200,121 +157,78 @@
Q_OBJECT
Q_PROPERTY(QPointF pos READ pos WRITE setPos)
...
+ }
\endcode
- As described in the previous section, we need to define
- properties that we wish to animate.
-
- Note that QObject must be the first class inherited as the
- meta-object system demands this.
+ \note You can also derive from QGraphicsWidget, which already is a
+ QObject.
- \section1 Easing Curves
+ As described in the previous section, you need to define
+ properties that you want to animate. The derived class must inherit
+ from QObject first as the meta-object system requires it.
- As mentioned, QPropertyAnimation performs an interpolation between
- the start and end property value. In addition to adding more key
- values to the animation, you can also use an easing curve. Easing
- curves describe a function that controls how the speed of the
- interpolation between 0 and 1 should be, and are useful if you
- want to control the speed of an animation without changing the
- path of the interpolation.
+ \section1 Easing curves
- \code
- QPushButton button("Animated Button");
- button.show();
-
- QPropertyAnimation animation(&button, "geometry");
- animation.setDuration(3000);
- animation.setStartValue(QRect(0, 0, 100, 30));
- animation.setEndValue(QRect(250, 250, 100, 30));
+ A QPropertyAnimation performs linear interpolation
+ between the start and end property values. In addition to adding more key
+ values to the animation, you can also choose an easing curve to control the
+ speed of interpolation between 0 and 1, without changing the
+ path.
- animation.setEasingCurve(QEasingCurve::OutBounce);
- animation.start();
- \endcode
+ \snippet code/src_corelib_animation_qpropertyanimation.cpp easing-curve
- Here the animation will follow a curve that makes it bounce like a
- ball as if it was dropped from the start to the end position.
- QEasingCurve has a large collection of curves for you to choose
- from. These are defined by the QEasingCurve::Type enum. If you are
- in need of another curve, you can also implement one yourself, and
+ In this example, the animation follows a curve that makes the
+ \c button bounce like a ball. QEasingCurve offers a large collection of curves
+ to choose from the QEasingCurve::Type enum. If you want
+ to use another curve that is not available, implement one yourself and
register it with QEasingCurve.
- \omit Drop this for the first Lab release
- (Example of custom easing curve (without the actual impl of
- the function I expect)
- \endomit
+ \section1 Grouping animations
- \section1 Putting Animations Together
-
- An application will often contain more than one animation. For
- instance, you might want to move more than one graphics item
+ An application often contains more than one animation. For
+ example, it wants to move more than one graphics item
simultaneously or move them in sequence after each other.
- The subclasses of QAnimationGroup (QSequentialAnimationGroup and
- QParallelAnimationGroup) are containers for other animations so
+ The subclasses of QAnimationGroup---QSequentialAnimationGroup and
+ QParallelAnimationGroup---are containers for other animations so
that these animations can be animated either in sequence or
- parallel. The QAnimationGroup is an example of an animation that
- does not animate properties, but it gets notified of time changes
- periodically. This enables it to forward those time changes to its
- contained animations, and thereby controlling when its animations
- are played.
-
- Let's look at code examples that use both
- QSequentialAnimationGroup and QParallelAnimationGroup, starting
- off with the latter.
-
- \code
- QPushButton *bonnie = new QPushButton("Bonnie");
- bonnie->show();
+ parallel. The QAnimationGroup does not animate properties, but it
+ gets notified of time changes periodically. This enables it to
+ forward those time changes to the animation groups, which control when
+ their animations are played.
- QPushButton *clyde = new QPushButton("Clyde");
- clyde->show();
+ The two following examples demonstrate the use of both
+ QSequentialAnimationGroup and QParallelAnimationGroup:
- QPropertyAnimation *anim1 = new QPropertyAnimation(bonnie, "geometry");
- // Set up anim1
-
- QPropertyAnimation *anim2 = new QPropertyAnimation(clyde, "geometry");
- // Set up anim2
-
- QParallelAnimationGroup *group = new QParallelAnimationGroup;
- group->addAnimation(anim1);
- group->addAnimation(anim2);
-
- group->start();
- \endcode
+ \snippet code/src_corelib_animation_qpropertyanimation.cpp animation-group1
A parallel group plays more than one animation at the same time.
- Calling its \l{QAbstractAnimation::}{start()} function will start
- all animations it governs.
-
- \code
- QPushButton button("Animated Button");
- button.show();
+ Its \l{QAbstractAnimation::}{start()} function starts all
+ animations that are part of the group.
- QPropertyAnimation anim1(&button, "geometry");
- anim1.setDuration(3000);
- anim1.setStartValue(QRect(0, 0, 100, 30));
- anim1.setEndValue(QRect(500, 500, 100, 30));
+ \snippet code/src_corelib_animation_qpropertyanimation.cpp animation-group2
- QPropertyAnimation anim2(&button, "geometry");
- anim2.setDuration(3000);
- anim2.setStartValue(QRect(500, 500, 100, 30));
- anim2.setEndValue(QRect(1000, 500, 100, 30));
+ As the name suggests, a QSequentialAnimationGroup plays
+ its animations in sequence. It starts the next animation in
+ the list after the previous finishes.
- QSequentialAnimationGroup group;
+ A group is an animation itself, so you can add
+ it to another group. This way, building an animation tree, which define
+ when the animations are played in relation to each other.
- group.addAnimation(&anim1);
- group.addAnimation(&anim2);
+ \section1 Object ownership
- group.start();
- \endcode
+ A QPropertyAnimation should always have a parent that controls
+ its lifespan. A typical application may include several animations that
+ are grouped, where the animation group takes ownership of those animations.
+ An independent QPropertyAnimation must be explicitly assigned a parent to
+ control its lifespan. In the following example, you can see that an
+ independent QPropertyAnimation has the QApplication instance as its
+ parent:
- As you no doubt have guessed, QSequentialAnimationGroup plays
- its animations in sequence. It starts the next animation in
- the list after the previous is finished.
+ \snippet code/src_corelib_animation_qpropertyanimation.cpp 0
- Since an animation group is an animation itself, you can add
- it to another group. This way, you can build a tree structure
- of animations which specifies when the animations are played
- in relation to each other.
+ \note You can also control the animation's lifespan by choosing a
+ \l{QAbstractAnimation::DeletionPolicy}{delete policy} while starting it.
*/
diff --git a/src/corelib/doc/src/cbor.qdoc b/src/corelib/doc/src/cbor.qdoc
new file mode 100644
index 0000000000..30d7ddaf60
--- /dev/null
+++ b/src/corelib/doc/src/cbor.qdoc
@@ -0,0 +1,79 @@
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
+
+/*!
+ \group cbor
+ \title CBOR Support in Qt
+ \ingroup qt-basic-concepts
+ \brief An overview of CBOR support in Qt.
+ \ingroup explanations-dataprocessingandio
+
+ \ingroup frameworks-technologies
+
+ \keyword CBOR
+
+ Qt provides support for dealing with CBOR data. CBOR is a binary format to
+ store data that has a superset of the types available in JSON, but is more
+ compact.
+
+ The CBOR support in Qt provides an easy to use C++ API to parse,
+ modify and save CBOR data.
+
+ More details about the CBOR data format can be found in \l {RFC 7049}.
+
+ \tableofcontents
+
+ \section1 Overview
+
+ CBOR is a format to store structured data. It has three groups of built-in types:
+
+ \list
+ \li Basic types: integers, floating point, boolean, null, etc.
+ \li String-like types: strings and byte arrays
+ \li Containers: arrays and maps
+ \endlist
+
+ In addition, CBOR can add a "tag" to extend the meaning of the type. The
+ container types can contain basic types, string-like types and containers.
+
+ \sa {Parsing and displaying CBOR data}, {Serialization Converter}, {Saving and Loading a Game}
+
+ \section1 The CBOR Classes
+
+ \section2 The QCborValue Class
+
+ The QCborValue class represents any CBOR type. It also has a simple API for
+ reading and writing to QCborStreamReader and QCborStreamWriter objects, as
+ well as manipulating such objects in memory, with the help of QCborArray
+ and QCborMap. The CborValue API is simplified from the full CBOR data type
+ and always represents all integers as \l qint64 and all floating-point as
+ \c double. This means QCborValue is unable to represent CBOR integer values
+ outside of the range of \l qint64 (-2^63 to 2^63-1). When creating a CBOR
+ stream, QCborValue::toCbor() can be configured to attempt to write the
+ shorter single- and half-precision floating-point representations.
+
+ \section2 The QCborArray Class
+
+ The QCborArray class is used to hold an array of QCborValue objects. A
+ QCborValue object can contain a QCborArray object. It has functions for
+ converting to and from QVariantList, QStringList, QJsonArray.
+
+ \section2 The QCborMap Class
+
+ The QCborMap class is used to hold an map of QCborValue objects. A
+ QCborValue object can contain a QCborMap object. It has functions for
+ converting to and from QVariantMap, QVariantMap, and QJsonObject, but it
+ can have keys of any type, not just QString.
+
+ \section2 The QCborStreamReader Class
+
+ The QCborStreamReader class is a low level API for reading CBOR data from a
+ QIODevice, a QByteArray, or a pointer to memory. It has an API similar to
+ the QXmlStreamReader class.
+
+ \section2 The QCborStreamWriter Class
+
+ The QCborStreamWriter class is a low level API for writing CBOR data to a
+ QIODevice or a QByteArray. It has an API similar to the QXmlStreamWriter
+ class.
+*/
diff --git a/src/corelib/doc/src/cmake/cmake-commands.qdoc b/src/corelib/doc/src/cmake/cmake-commands.qdoc
index 63edcbe10d..e185bab624 100644
--- a/src/corelib/doc/src/cmake/cmake-commands.qdoc
+++ b/src/corelib/doc/src/cmake/cmake-commands.qdoc
@@ -1,39 +1,16 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
\group cmake-commands-qtcore
\title CMake Commands in Qt6 Core
+\brief Lists CMake commands defined in Qt6::Core.
The following CMake commands are defined when Qt6::Core is loaded, for instance
with
\code
-find_package(Qt6 COMPONENTS Core REQUIRED)
+find_package(Qt6 REQUIRED COMPONENTS Core)
\endcode
\sa{CMake Command Reference}
diff --git a/src/corelib/doc/src/cmake/cmake-configure-variables.qdoc b/src/corelib/doc/src/cmake/cmake-configure-variables.qdoc
new file mode 100644
index 0000000000..b710ba7275
--- /dev/null
+++ b/src/corelib/doc/src/cmake/cmake-configure-variables.qdoc
@@ -0,0 +1,587 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
+
+/* NOTE: The variables documented here are available when running CMake, they
+** are not available in a deployment script. Both these and the set of
+** deploy-time variables are all members of the cmake-variables-qtcore
+** group.
+**/
+
+/*!
+\group cmake-variables-qtcore
+\title CMake Variables in Qt6 Core
+\brief Lists CMake variables defined in Qt6::Core.
+
+The following CMake variables are defined when Qt6::Core is loaded, for instance
+with
+
+\badcode
+find_package(Qt6 REQUIRED COMPONENTS Core)
+\endcode
+
+\sa{CMake Variable Reference}
+*/
+
+/*!
+\page cmake-variable-android-ndk-host-system-name.html
+\ingroup cmake-variables-qtcore
+
+\title ANDROID_NDK_HOST_SYSTEM_NAME
+\target cmake-variable-ANDROID_NDK_HOST_SYSTEM_NAME
+
+\summary {Android-specific architecture of the host system.}
+
+\cmakevariablesince 6.0
+\preliminarycmakevariable
+\cmakevariableandroidonly
+
+Usually, this variable is set by the Android NDK toolchain file. It is written out as
+part of the deployment settings for a target.
+
+\sa{qt6_android_generate_deployment_settings}{qt_android_generate_deployment_settings()}
+*/
+
+/*!
+\page cmake-variable-android-sdk-root.html
+\ingroup cmake-variables-qtcore
+
+\title ANDROID_SDK_ROOT
+\target cmake-variable-ANDROID_SDK_ROOT
+
+\summary {Location of the Android SDK.}
+
+\cmakevariablesince 6.0
+\preliminarycmakevariable
+\cmakevariableandroidonly
+
+Specifies the location of the Android SDK when building for the Android platform.
+This variable is written out as part of the deployment settings for a target.
+
+\sa{qt6_android_generate_deployment_settings}{qt_android_generate_deployment_settings()}.
+*/
+
+/*!
+\page cmake-variable-qt-android-application-arguments.html
+\ingroup cmake-variables-qtcore
+\ingroup cmake-android-manifest-properties
+
+\title QT_ANDROID_APPLICATION_ARGUMENTS
+\target cmake-variable-QT_ANDROID_APPLICATION_ARGUMENTS
+
+\summary {List of arguments to pass to Android applications.}
+
+\cmakevariablesince 6.0
+\preliminarycmakevariable
+\cmakevariableandroidonly
+
+Contains a list of arguments to be passed to Android applications. This variable
+is written out as part of the deployment settings for a target.
+
+\sa{qt6_android_generate_deployment_settings}{qt_android_generate_deployment_settings()}
+*/
+
+/*!
+\page cmake-variable-qt-android-deployment-type.html
+\ingroup cmake-variables-qtcore
+\ingroup cmake-android-build-properties
+
+\title QT_ANDROID_DEPLOYMENT_TYPE
+\target cmake-variable-QT_ANDROID_DEPLOYMENT_TYPE
+
+\summary {Forces or disables release package signing regardless of the build type.}
+
+\cmakevariablesince 6.7
+\preliminarycmakevariable
+\cmakevariableandroidonly
+
+When set to \c Release, the \c --release flag is passed to the \c
+androiddeployqt tool, regardless of the application build type. When set to
+another value, the \c --release flag is never passed to the tool, which
+effectively disables release package signing even in Release or RelWithDebInfo
+builds. When not set, the default behavior is to use release package signing in
+build types other than Debug.
+
+\sa {androiddeployqt}
+*/
+
+/*!
+\page cmake_variable-qt-android-multi-abi-forward-vars
+\ingroup cmake-variables-qtcore
+\ingroup cmake-android-build-properties
+
+\title QT_ANDROID_MULTI_ABI_FORWARD_VARS
+\target cmake-variable-QT_ANDROID_MULTI_ABI_FORWARD_VARS
+
+\summary {Allows to share CMake variables in multi-ABI builds.}
+
+\cmakevariablesince 6.4.2
+\preliminarycmakevariable
+\cmakevariableandroidonly
+
+Allows specifying the list of
+CMake variables that need to be forwarded from the main ABI project to
+ABI-specific subprojects. Due to the specifics of the Multi-ABI project build
+process, there is no generic way to forward the CMake cache variables
+that are specified either in the command line or in another similar way.
+
+A typical use case for the variable is propagating CMake cache variables
+specified in the command line. For example, a project has two variables
+\c{PROJECT_WIDE_VARIABLE1} and \c{PROJECT_WIDE_VARIABLE2} that affect the
+project configuration:
+\badcode
+cmake_minimum_required(VERSION 3.18)
+
+project(MyProject LANGUAGES CXX)
+
+find_package(Qt6 REQUIRED COMPONENTS Core)
+
+qt_add_executable(MyApp main.cpp)
+
+if(PROJECT_WIDE_VARIABLE1)
+ target_sources(MyApp PRIVATE sourcefile1.cpp)
+endif()
+if(PROJECT_WIDE_VARIABLE2)
+ target_sources(MyApp PRIVATE sourcefile2.cpp)
+endif()
+\endcode
+
+The above contents of \c{CMakeLists.txt} enable you to control how
+\c{MyApp} is built by setting the corresponding CMake variables from the
+command line:
+\badcode
+qt-cmake -S<source directory> -B<build directory> \
+ -DPROJECT_WIDE_VARIABLE1=ON \
+ -DPROJECT_WIDE_VARIABLE2=ON \
+ -DQT_ANDROID_MULTI_ABI_FORWARD_VARS="PROJECT_WIDE_VARIABLE1;PROJECT_WIDE_VARIABLE2"
+\endcode
+
+When configuring the application for desktop, \c{PROJECT_WIDE_VARIABLE1} and
+\c{PROJECT_WIDE_VARIABLE2} are visible in CMake listings and scripts as global
+cache variables. This doesn't work for Android Multi-ABI builds because
+ABI-specific subprojects do not inherit the cache variables from the main-ABI
+project. This issue can be solved by passing the list of required variables to
+the \c{QT_ANDROID_MULTI_ABI_FORWARD_VARS} variable, so both
+\c{PROJECT_WIDE_VARIABLE1} and \c{PROJECT_WIDE_VARIABLE2} values will be
+propagated to the ABI-specific builds.
+
+The variable can be also defined in the project's CMakeLists.txt:
+\badcode
+...
+qt_add_executable(MyApp main.cpp)
+...
+if(ANDROID)
+ set(QT_ANDROID_MULTI_ABI_FORWARD_VARS "PROJECT_WIDE_VARIABLE1;PROJECT_WIDE_VARIABLE2")
+endif()
+...
+\endcode
+
+Set the variable in this way to have a predefined set of
+variables that will always be forwarded to ABI-specific projects.
+
+\note The forwarding is done in the target finalizer, which is implicitly
+called when \l{qt6_add_executable}{qt_add_executable()} is used. The
+finalization occurs automatically when using CMake 3.19 or later.
+
+\sa {qt6_finalize_target}{qt_finalize_target()},
+ {qt6_add_executable}{qt_add_executable()}
+*/
+
+/*!
+\page cmake-variable-qt-android-build-all-abis.html
+\ingroup cmake-variables-qtcore
+\ingroup cmake-android-build-properties
+
+\title QT_ANDROID_BUILD_ALL_ABIS
+\target cmake-variable-QT_ANDROID_BUILD_ALL_ABIS
+
+\summary {Enables building multi-ABI packages using the autodetected Qt for Android SDK list.}
+
+\cmakevariablesince 6.3
+\preliminarycmakevariable
+\cmakevariableandroidonly
+
+Automatically detects available ABIs of Qt for Android and uses them to
+build a package. The automatic detection expects the default directory structure
+supplied by the Qt installer, with the corresponding naming of the directories.
+\include cmake-android-supported-abis.qdocinc
+The typical directory structure looks as below:
+\badcode
+/path/to/Qt/6.x.x
+ android_armv7
+ android_arm64_v8a
+ android_x86
+ android_x86_64
+ ...
+\endcode
+The auto-detected paths can be customized using one of \c{QT_PATH_ANDROID_ABI_<ABI>} variables.
+
+The variable is set to \c FALSE by default.
+
+\sa{QT_PATH_ANDROID_ABI_<ABI>}
+*/
+
+/*!
+\page cmake-variable-qt-android-abis.html
+\ingroup cmake-variables-qtcore
+\ingroup cmake-android-build-properties
+
+\title QT_ANDROID_ABIS
+\target cmake-variable-QT_ANDROID_ABIS
+
+\summary {List of ABIs that the project packages are built for.}
+
+\cmakevariablesince 6.3
+\preliminarycmakevariable
+\cmakevariableandroidonly
+
+Specifies a list of ABIs to be used to build the project packages.
+\include cmake-android-supported-abis.qdocinc
+Each ABI should have the corresponding Qt for Android either installed or
+user-built. To specify the path to the Qt for Android ABI, use
+the corresponding \c{QT_PATH_ANDROID_ABI_<ABI>} variable.
+
+\note \c{QT_ANDROID_BUILD_ALL_ABIS} has the higher priority and ignores the
+QT_ANDROID_ABIS logic.
+
+\sa{QT_PATH_ANDROID_ABI_<ABI>}, {QT_ANDROID_BUILD_ALL_ABIS}
+*/
+
+/*!
+\page cmake-variable-qt-path-android-abi.html
+\ingroup cmake-variables-qtcore
+
+\title QT_PATH_ANDROID_ABI_<ABI>
+\target cmake-variable-QT_PATH_ANDROID_ABI_<ABI>
+
+\summary {Set of variables to specify the path to Qt for Android for the corresponding ABI.}
+
+\cmakevariablesince 6.3
+\preliminarycmakevariable
+\cmakevariableandroidonly
+
+Each variable can be used to specify the path to Qt for Android for the corresponding ABI.
+\include cmake-android-supported-abis.qdocinc
+
+\sa{cmake-variable-QT_ANDROID_ABIS}{QT_ANDROID_ABIS}
+*/
+
+/*!
+\page cmake-variable-qt-android-sign-aab.html
+\ingroup cmake-variables-qtcore
+\ingroup cmake-android-build-properties
+
+\title QT_ANDROID_SIGN_AAB
+\target cmake-variable-QT_ANDROID_SIGN_AAB
+
+\summary {Signs the .aab package with the specified keystore, alias, and store password.}
+\cmakevariablesince 6.4
+\preliminarycmakevariable
+\cmakevariableandroidonly
+
+Signs the resulting package. The path of the keystore file, the alias of the key, and passwords
+have to be specified by additional environment variables:
+\badcode
+ QT_ANDROID_KEYSTORE_PATH
+ QT_ANDROID_KEYSTORE_ALIAS
+ QT_ANDROID_KEYSTORE_STORE_PASS
+ QT_ANDROID_KEYSTORE_KEY_PASS
+\endcode
+The mentioned variables are used internally by \l{androiddeployqt}.
+
+\sa{androiddeployqt}
+*/
+
+/*!
+\page cmake-variable-qt-android-sign-apk.html
+\ingroup cmake-variables-qtcore
+\ingroup cmake-android-build-properties
+
+\title QT_ANDROID_SIGN_APK
+\target cmake-variable-QT_ANDROID_SIGN_APK
+
+\summary {Signs the package with the specified keystore, alias, and store password.}
+\cmakevariablesince 6.4
+\preliminarycmakevariable
+\cmakevariableandroidonly
+
+Signs the resulting package. The path of the keystore file, the alias of the key, and passwords
+have to be specified by additional environment variables:
+\badcode
+ QT_ANDROID_KEYSTORE_PATH
+ QT_ANDROID_KEYSTORE_ALIAS
+ QT_ANDROID_KEYSTORE_STORE_PASS
+ QT_ANDROID_KEYSTORE_KEY_PASS
+\endcode
+The mentioned variables are used internally by \l{androiddeployqt}.
+
+\sa{androiddeployqt}
+*/
+
+/*!
+\page cmake-variable-qt-use-target-android-build-dir.html
+\ingroup cmake-variables-qtcore
+
+\title QT_USE_TARGET_ANDROID_BUILD_DIR
+\target cmake-variable-QT_USE_TARGET_ANDROID_BUILD_DIR
+
+\summary {Enables the use of per-target Android build directories.}
+
+\cmakevariablesince 6.7
+\preliminarycmakevariable
+\cmakevariableandroidonly
+
+The variable appends the target-specific suffix to the android-build directory.
+The variable only takes an effect when it's set in \c CACHE. The variable is
+only supported by Qt Creator starting from version 13.
+If a single \c CMakeLists.txt contains more than one Android executable and
+this option is not set, you will see a warning. To disable the warning, set
+\c QT_SKIP_ANDROID_BUILD_DIR_CHECK to \c TRUE.
+*/
+
+/*!
+\page cmake-variable-qt-no-collect-build-tree-apk-deps.html
+\ingroup cmake-variables-qtcore
+
+\title QT_NO_COLLECT_BUILD_TREE_APK_DEPS
+\target cmake-variable-QT_NO_COLLECT_BUILD_TREE_APK_DEPS
+
+\summary {Prevents collecting of project-built shared library targets during Android deployment.}
+
+\cmakevariablesince 6.3
+\preliminarycmakevariable
+\cmakevariableandroidonly
+
+During project finalization, the build system collects the locations of
+all built shared library targets in the project.
+These locations are passed to \l androiddeployqt for deployment consideration when
+resolving dependencies between libraries.
+To disable this behavior, set this variable to \c TRUE.
+
+\sa {qt6_finalize_project}{qt_finalize_project()}
+\sa {cmake-variable-QT_NO_COLLECT_IMPORTED_TARGET_APK_DEPS}{QT_NO_COLLECT_IMPORTED_TARGET_APK_DEPS}
+*/
+
+/*!
+\page cmake-variable-qt-no-collect-imported-target-apk-deps.html
+\ingroup cmake-variables-qtcore
+
+\title QT_NO_COLLECT_IMPORTED_TARGET_APK_DEPS
+\target cmake-variable-QT_NO_COLLECT_IMPORTED_TARGET_APK_DEPS
+
+\summary {Prevents collecting of imported targets during Android deployment.}
+
+\cmakevariablesince 6.5
+\preliminarycmakevariable
+\cmakevariableandroidonly
+
+When using CMake version 3.21 or later, the build system collects the locations of
+imported shared library targets that might be relevant for deployment.
+The collected targets are those that are reachable from the directory scope
+of the currently processed executable target. That includes the target's source directory
+scope and its parents.
+The collected locations are passed to \l androiddeployqt for deployment consideration when
+resolving dependencies between libraries.
+To disable this behavior, set this variable to \c TRUE.
+
+\sa {qt6_finalize_project}{qt_finalize_project()}
+\sa {cmake-variable-QT_NO_COLLECT_BUILD_TREE_APK_DEPS}{QT_NO_COLLECT_BUILD_TREE_APK_DEPS}
+*/
+
+/*!
+\page cmake-variable-qt-host-path.html
+\ingroup cmake-variables-qtcore
+
+\title QT_HOST_PATH
+\target cmake-variable-QT_HOST_PATH
+
+\summary {Location of the host Qt installation when cross-compiling.}
+
+\cmakevariablesince 6.0
+
+When cross-compiling, this variable must be set to the install location of Qt for the host
+platform. It is used to locate tools to be run on the host (\l{moc}, \l{rcc},
+\l{androiddeployqt}, and so on). It's possible to reuse pre-installed tools
+when compiling Qt for host systems too, by using \c QT_HOST_PATH that points to
+a pre-installed host Qt and setting the \c QT_FORCE_FIND_TOOLS to \c ON. The Qt
+versions should match in this case.
+*/
+
+/*!
+\page cmake-variable-qt-no-set-xcode-development-team-id.html
+\ingroup cmake-variables-qtcore
+
+\title QT_NO_SET_XCODE_DEVELOPMENT_TEAM_ID
+\target cmake-variable-QT_NO_SET_XCODE_DEVELOPMENT_TEAM_ID
+
+\summary {Disables providing a fallback team ID during target finalization on iOS.}
+
+\cmakevariablesince 6.1
+
+When finalizing an executable target on iOS,
+\l{qt6_finalize_target}{qt_finalize_target()} will populate the target's
+\c XCODE_ATTRIBUTE_DEVELOPMENT_TEAM property if it hasn't been set.
+To prevent this, set \c QT_NO_SET_XCODE_DEVELOPMENT_TEAM_ID to \c TRUE.
+*/
+
+/*!
+\page cmake-variable-qt-no-set-xcode-bundle-identifier.html
+\ingroup cmake-variables-qtcore
+
+\title QT_NO_SET_XCODE_BUNDLE_IDENTIFIER
+\target cmake-variable-QT_NO_SET_XCODE_BUNDLE_IDENTIFIER
+
+\summary {Disables providing a fallback app bundle ID during target finalization on iOS.}
+
+\cmakevariablesince 6.1
+
+When finalizing an executable target on iOS,
+\l{qt6_finalize_target}{qt_finalize_target()} will populate the target's
+\c XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER and
+\c MACOSX_BUNDLE_GUI_IDENTIFIER properties if they haven't been set.
+To prevent this, set \c QT_NO_SET_XCODE_BUNDLE_IDENTIFIER to \c TRUE.
+*/
+
+/*!
+\page cmake-variable-qt-enable-verbose-deployment.html
+\ingroup cmake-variables-qtcore
+
+\title QT_ENABLE_VERBOSE_DEPLOYMENT
+\target cmake-variable-QT_ENABLE_VERBOSE_DEPLOYMENT
+
+\summary {Enables verbose mode of deployment tools.}
+
+\cmakevariablesince 6.3
+\preliminarycmakevariable
+
+Enables verbose mode of the \l androiddeployqt deployment tool when it is called
+internally at build time, usually during target finalization.
+
+This variable also changes the default verbosity of install-time deployment
+scripts for other platforms (see \l{qt6_deploy_runtime_dependencies()}), but it
+must be set before the first \c{find_package(Qt6)} call to have that effect.
+*/
+
+/*!
+\page cmake-variable-qt-deploy-support.html
+\ingroup cmake-variables-qtcore
+
+\title QT_DEPLOY_SUPPORT
+\target cmake-variable-QT_DEPLOY_SUPPORT
+
+\summary {Name of the file to include for setting up deployment support.}
+
+\cmakevariablesince 6.3
+\preliminarycmakevariable
+\note The value of this variable should never be modified by project code.
+
+This configure-phase variable is set by the Core package. It is intended to be
+used as the first line of any deployment script to ensure access to the
+deployment APIs provided by Qt. Such deployment scripts do not run during
+CMake's configure phase. They are executed during installation or as
+part of a post-build rule.
+
+The following example shows one way the variable would be used when installing
+an application, along with its runtime dependencies:
+
+\include cmake-deploy-modified-variable-values.qdocinc
+
+\sa {qt6_deploy_runtime_dependencies}{qt_deploy_runtime_dependencies()},
+ {qt6_deploy_qml_imports}{qt_deploy_qml_imports()}
+*/
+
+/*!
+\page cmake-variable-qt-no-standard-project-setup.html
+\ingroup cmake-variables-qtcore
+
+\title QT_NO_STANDARD_PROJECT_SETUP
+\target cmake-variable-QT_NO_STANDARD_PROJECT_SETUP
+
+\summary {Prevents subsequent calls to qt_standard_project_setup() from making any changes.}
+
+\cmakevariablesince 6.3
+
+The \l{qt6_standard_project_setup}{qt_standard_project_setup()} command is
+typically called in the top level \c{CMakeLists.txt} file of a project. In some
+scenarios, such a project may be absorbed as a child project of a larger project
+hierarchy. A parent project may want to prevent any child project from applying
+changes to the setup. The parent project can achieve this by setting
+\c{QT_NO_STANDARD_PROJECT_SETUP} to \c TRUE before bringing in the child project
+via \l{add_subdirectory()}, \l{FetchContent_MakeAvailable()}, or other similar
+methods provided by CMake.
+
+\sa {qt6_standard_project_setup}{qt_standard_project_setup()}
+*/
+
+/*!
+\page cmake-variable-qt-i18n-languages.html
+\ingroup cmake-variables-qtcore
+
+\title QT_I18N_TRANSLATED_LANGUAGES
+\target cmake-variable-QT_I18N_TRANSLATED_LANGUAGES
+
+\summary {List of languages to be used for project internationalization.}
+
+\cmakevariablesince 6.7
+
+Specifies a list of languages that are used for project
+internationalization. The single languages must be compatible with the
+string-based \l QLocale constructor.
+
+The languages in \c QT_I18N_TRANSLATED_LANGUAGES are used to:
+\list
+ \li Set up executable targets for consuming \c{.qm} files.
+ \li Automatically construct \c{.ts} file names in
+ \l{qt6_add_translations}{qt_add_translations()}.
+\endlist
+
+This variable can be conveniently set with the
+\l {qt6_standard_project_setup}{qt_standard_project_setup()} command.
+
+By default, translatable strings are considered to be written in \c{en}.
+
+\sa {qt6_standard_project_setup}{qt_standard_project_setup()}
+\sa {qt6_add_translations}{qt_add_translations()}
+*/
+
+/*!
+\page cmake-variable-qt-i18n-native-language.html
+\ingroup cmake-variables-qtcore
+
+\title QT_I18N_SOURCE_LANGUAGE
+\target cmake-variable-QT_I18N_SOURCE_LANGUAGE
+
+\summary {Specifies the language of translatable strings.}
+
+\cmakevariablesince 6.7
+
+Specifies the language of translatable strings in the source code.
+The language must be compatible with the string-based \l QLocale constructor.
+
+Together with \c{QT_I18N_TRANSLATED_LANGUAGES}, this variable is used to determine the
+names of \c{.ts} files for \l{qt6_add_translations}{qt_add_translations()}.
+
+This variable can be conveniently set with the
+\l {qt6_standard_project_setup}{qt_standard_project_setup()} command.
+
+\sa {qt6_standard_project_setup}{qt_standard_project_setup()}
+\sa {qt6_add_translations}{qt_add_translations()}
+*/
+
+/*!
+\page cmake-variable-qt-ios-launch-screen.html
+\ingroup cmake-variables-qtcore
+
+\title QT_IOS_LAUNCH_SCREEN
+\target cmake-variable-QT_IOS_LAUNCH_SCREEN
+
+\summary {Path to iOS launch screen storyboard used by all targets.}
+
+\cmakevariablesince 6.4
+\preliminarycmakevariable
+\cmakevariableiosonly
+
+Specifies the path to an iOS launch screen storyboard file that will be used
+by all targets within a project.
+
+\sa {Launch Screens and Launch Images}
+*/
diff --git a/src/corelib/doc/src/cmake/cmake-deploy-variables.qdoc b/src/corelib/doc/src/cmake/cmake-deploy-variables.qdoc
new file mode 100644
index 0000000000..ac5094e7cb
--- /dev/null
+++ b/src/corelib/doc/src/cmake/cmake-deploy-variables.qdoc
@@ -0,0 +1,307 @@
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
+
+/* NOTE: The variables documented here are available when running a deploy
+** script, they are not available at configure time (i.e. when running
+** CMake). Both these and the set of configure-time variables are all
+** members of the cmake-variables-qtcore group.
+**/
+
+/*!
+\page cmake-variable-qt-deploy-prefix.html
+\ingroup cmake-variables-qtcore
+
+\title QT_DEPLOY_PREFIX
+\target cmake-variable-QT_DEPLOY_PREFIX
+
+\summary {Base location for a deployment.}
+
+\include cmake-deploy-var-usage.qdocinc
+
+\cmakevariablesince 6.3
+
+\c{QT_DEPLOY_PREFIX} provides the base deployment directory. The other
+\c{QT_DEPLOY_..._DIR} variables should be treated as relative to this location.
+The value of \c{QT_DEPLOY_PREFIX} may be relative or absolute, so projects
+should not assume one or the other in any given situation. A relative path is
+expected to be treated as relative to the current working directory, as seen
+by the build tool (ninja, make, and so on) at install time.
+
+The default value is \c{$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}}, which is the
+base location CMake uses during installation. If that evaluates to an empty
+string, the default value will be a dot (.) instead, which is generally the
+appropriate value when deploying as part of a post-build rule. This two-step
+fallback logic ensures that projects can assume \c{QT_DEPLOY_PREFIX} will not
+be an empty string, so it can safely be used as part of a path like
+\c{${QT_DEPLOY_PREFIX}/${QT_DEPLOY_BIN_DIR}}.
+
+To change the value of \c QT_DEPLOY_PREFIX, the project can be configured
+with a custom \l CMAKE_INSTALL_PREFIX as described in
+\l {Command Line cmake invocation}.
+
+The \l DESTDIR environment variable can also be used to modify the final
+installation, and thus deployment, location.
+
+Projects should rarely need to use this variable. In typical scenarios, deploy
+scripts should assume that the working directory is already set to the base
+install location and just use the prefix-relative \c{QT_DEPLOY_..._DIR}
+variables.
+
+\sa QT_DEPLOY_SUPPORT, QT_DEPLOY_BIN_DIR, QT_DEPLOY_LIBEXEC_DIR,
+ QT_DEPLOY_LIB_DIR, QT_DEPLOY_PLUGINS_DIR, QT_DEPLOY_QML_DIR,
+ QT_DEPLOY_TRANSLATIONS_DIR
+*/
+
+/*!
+\page cmake-variable-qt-deploy-bin-dir.html
+\ingroup cmake-variables-qtcore
+
+\title QT_DEPLOY_BIN_DIR
+\target cmake-variable-QT_DEPLOY_BIN_DIR
+
+\summary {Prefix-relative subdirectory for deploying runtime binaries on some target platforms.}
+
+\include cmake-deploy-var-usage.qdocinc
+
+\cmakevariablesince 6.3
+
+Projects should use \c QT_DEPLOY_BIN_DIR in their deploy scripts to avoid
+hard-coding a particular directory in which to deploy the following types of
+binaries:
+
+\list
+\li Executables on all platforms.
+\li DLLs on Windows.
+\endlist
+
+\c QT_DEPLOY_BIN_DIR defaults to the value of \c${CMAKE_INSTALL_BINDIR}
+(usually \c{bin}), which is provided by CMake's \l{GNUInstallDirs} module.
+To change the value of \c QT_DEPLOY_BIN_DIR, ensure that the project sets
+\c{CMAKE_INSTALL_BINDIR} before the \c Core package is found.
+
+The \c QT_DEPLOY_BIN_DIR path is relative to \l{QT_DEPLOY_PREFIX}.
+
+This variable is not meaningful when deploying into a macOS app bundle and
+should not be used for that scenario.
+
+\section1 Example
+
+\include cmake-deploy-runtime-dependencies.qdocinc
+
+\sa QT_DEPLOY_SUPPORT, QT_DEPLOY_PREFIX, QT_DEPLOY_LIBEXEC_DIR,
+ QT_DEPLOY_LIB_DIR, QT_DEPLOY_PLUGINS_DIR, QT_DEPLOY_QML_DIR,
+ QT_DEPLOY_TRANSLATIONS_DIR
+*/
+
+/*!
+\page cmake-variable-qt-deploy-libexec-dir.html
+\ingroup cmake-variables-qtcore
+
+\title QT_DEPLOY_LIBEXEC_DIR
+\target cmake-variable-QT_DEPLOY_LIBEXEC_DIR
+
+\summary {Prefix-relative subdirectory for deploying program executables on some target platforms.}
+
+\include cmake-deploy-var-usage.qdocinc
+
+\cmakevariablesince 6.7
+
+On Unix derivatives, projects should use \c QT_DEPLOY_LIBEXEC_DIR in their
+deploy scripts to avoid hard-coding a particular directory in which to deploy
+helper executables that are local to the project.
+
+For example, projects using QtWebEngine would deploy the \c QtWebEngineProcess
+executable to this directory.
+
+\c QT_DEPLOY_LIBEXEC_DIR defaults to the value of \c${CMAKE_INSTALL_LIBEXECDIR}
+(usually \c{libexec}), which is provided by CMake's \l{GNUInstallDirs} module.
+To change the value of \c QT_DEPLOY_LIBEXEC_DIR, ensure that the project sets
+\c{CMAKE_INSTALL_LIBEXECDIR} before the \c Core package is found.
+
+The \c QT_DEPLOY_LIBEXEC_DIR path is relative to \l{QT_DEPLOY_PREFIX}.
+
+This variable is not meaningful when deploying into a macOS app bundle and
+should not be used for that scenario.
+
+\section1 Example
+
+\include cmake-deploy-modified-variable-values.qdocinc
+
+\sa QT_DEPLOY_SUPPORT, QT_DEPLOY_PREFIX, QT_DEPLOY_BIN_DIR, QT_DEPLOY_LIB_DIR,
+ QT_DEPLOY_PLUGINS_DIR, QT_DEPLOY_QML_DIR, QT_DEPLOY_TRANSLATIONS_DIR
+*/
+
+/*!
+\page cmake-variable-qt-deploy-lib-dir.html
+\ingroup cmake-variables-qtcore
+
+\title QT_DEPLOY_LIB_DIR
+\target cmake-variable-QT_DEPLOY_LIB_DIR
+
+\summary {Prefix-relative subdirectory for deploying libraries on some target platforms.}
+
+\include cmake-deploy-var-usage.qdocinc
+
+\cmakevariablesince 6.3
+
+Projects should use \c QT_DEPLOY_LIB_DIR in their deploy scripts to avoid
+hard-coding a particular directory in which to deploy the following types of
+binaries:
+
+\list
+\li Shared libraries on platforms other than Windows.
+\li Import libraries on Windows.
+\endlist
+
+\c QT_DEPLOY_LIB_DIR defaults to the value of \c${CMAKE_INSTALL_LIBDIR}
+(usually \c{lib} or \c{lib64}), which is provided by
+CMake's \l{GNUInstallDirs} module.
+To change the value of \c QT_DEPLOY_LIB_DIR, ensure that the project sets
+\c{CMAKE_INSTALL_LIBDIR} before the \c Core package is found.
+
+The \c QT_DEPLOY_LIB_DIR path is relative to \l{QT_DEPLOY_PREFIX}.
+
+This variable is not meaningful when deploying into a macOS app bundle and
+should not be used for that scenario.
+
+\section1 Example
+
+\include cmake-deploy-modified-variable-values.qdocinc
+
+\sa QT_DEPLOY_SUPPORT, QT_DEPLOY_PREFIX, QT_DEPLOY_BIN_DIR,
+ QT_DEPLOY_PLUGINS_DIR, QT_DEPLOY_QML_DIR, QT_DEPLOY_TRANSLATIONS_DIR
+*/
+
+/*!
+\page cmake-variable-qt-deploy-plugins-dir.html
+\ingroup cmake-variables-qtcore
+
+\title QT_DEPLOY_PLUGINS_DIR
+\target cmake-variable-QT_DEPLOY_PLUGINS_DIR
+
+\summary {Prefix-relative subdirectory for deploying Qt plugins on some target platforms.}
+
+\include cmake-deploy-var-usage.qdocinc
+
+\cmakevariablesince 6.3
+
+Projects should use \c QT_DEPLOY_PLUGINS_DIR in their deploy scripts to avoid
+hard-coding a particular directory under which to deploy plugins.
+
+\c QT_DEPLOY_PLUGINS_DIR defaults to the value \c{plugins}. To change the value
+of \c QT_DEPLOY_PLUGINS_DIR, set it in the project deployment script
+before \c QT_DEPLOY_SUPPORT is included.
+
+The \c QT_DEPLOY_PLUGINS_DIR path is relative to \l{QT_DEPLOY_PREFIX}.
+
+This variable is not meaningful when deploying into a macOS app bundle and
+should not be used for that scenario. Apple's macOS app bundle guidelines
+require all plugins to be deployed to the \c{PlugIns} subdirectory of the
+bundle contents.
+
+\section1 Example
+
+\include cmake-deploy-modified-variable-values.qdocinc
+
+\sa QT_DEPLOY_SUPPORT, QT_DEPLOY_PREFIX, QT_DEPLOY_BIN_DIR,
+ QT_DEPLOY_LIBEXEC_DIR, QT_DEPLOY_LIB_DIR, QT_DEPLOY_QML_DIR,
+ QT_DEPLOY_TRANSLATIONS_DIR
+*/
+
+/*!
+\page cmake-variable-qt-deploy-qml-dir.html
+\ingroup cmake-variables-qtcore
+
+\title QT_DEPLOY_QML_DIR
+\target cmake-variable-QT_DEPLOY_QML_DIR
+
+\summary {Prefix-relative subdirectory for deploying QML plugins on some target platforms.}
+
+\include cmake-deploy-var-usage.qdocinc
+
+\cmakevariablesince 6.3
+
+Projects should use \c QT_DEPLOY_QML_DIR in their deploy scripts to avoid
+hard-coding a particular directory under which to deploy QML modules.
+
+\c QT_DEPLOY_QML_DIR defaults to the value \c{qml}. To change the value
+of \c QT_DEPLOY_QML_DIR, set it in the project deployment script
+before \c QT_DEPLOY_SUPPORT is included.
+
+The \c QT_DEPLOY_QML_DIR path is relative to \l{QT_DEPLOY_PREFIX}.
+
+This variable is not meaningful when deploying into a macOS app bundle and
+should not be used for that scenario. Apple's macOS app bundle guidelines
+require all plugins to be deployed to the \c{PlugIns} subdirectory of the
+bundle contents, and all other non-binary files should generally be under the
+\c{Resources} subdirectory. The different parts of a QML module therefore need
+to be deployed to different locations within the app bundle.
+
+\section1 Example
+
+\include cmake-deploy-modified-variable-values.qdocinc
+
+\sa QT_DEPLOY_SUPPORT, QT_DEPLOY_PREFIX, QT_DEPLOY_BIN_DIR,
+ QT_DEPLOY_LIBEXEC_DIR, QT_DEPLOY_LIB_DIR, QT_DEPLOY_PLUGINS_DIR,
+ QT_DEPLOY_TRANSLATIONS_DIR
+*/
+
+/*!
+\page cmake-variable-qt-deploy-translations-dir.html
+\ingroup cmake-variables-qtcore
+
+\title QT_DEPLOY_TRANSLATIONS_DIR
+\target cmake-variable-QT_DEPLOY_TRANSLATIONS_DIR
+
+\summary {Prefix-relative subdirectory for deploying Qt translations on some target platforms.}
+
+\include cmake-deploy-var-usage.qdocinc
+
+\cmakevariablesince 6.5
+
+Projects should use \c QT_DEPLOY_TRANSLATIONS_DIR in their deploy scripts to
+avoid hard-coding a particular directory under which to deploy translations.
+
+\c QT_DEPLOY_TRANSLATIONS_DIR defaults to the value \c{translations}. To change
+the value of \c QT_DEPLOY_TRANSLATIONS_DIR, set it in the project deployment
+script before \c QT_DEPLOY_SUPPORT is included.
+
+The \c QT_DEPLOY_TRANSLATIONS_DIR path is relative to \l{QT_DEPLOY_PREFIX}.
+
+This variable is not meaningful when deploying on macOS or Windows.
+
+\section1 Example
+
+\include cmake-deploy-modified-variable-values.qdocinc
+
+\sa QT_DEPLOY_SUPPORT, QT_DEPLOY_PREFIX, QT_DEPLOY_BIN_DIR, QT_DEPLOY_LIB_DIR,
+ QT_DEPLOY_LIBEXEC_DIR, QT_DEPLOY_PLUGINS_DIR, QT_DEPLOY_QML_DIR
+*/
+
+/*!
+\page cmake-variable-qt-deploy-ignored-lib-dirs.html
+\ingroup cmake-variables-qtcore
+
+\title QT_DEPLOY_IGNORED_LIB_DIRS
+\target cmake-variable-QT_DEPLOY_IGNORED_LIB_DIRS
+
+\summary {Directories that are excluded from runtime dependencies search}
+
+\include cmake-deploy-var-usage.qdocinc
+
+\cmakevariablesince 6.5
+
+This variable contains a list of directories that are not taken into account
+when searching for runtime dependencies with \l{qt_deploy_runtime_dependencies}.
+
+Projects may alter this variable before calling
+\l{qt_deploy_runtime_dependencies} to control from which directory runtime
+dependencies are deployed.
+
+This variable is ignored if the \c{POST_EXCLUDE_REGEXES} option is specified in
+the \l{qt_deploy_runtime_dependencies} call.
+
+This variable is not meaningful when deploying on macOS or Windows.
+
+\sa qt_deploy_runtime_dependencies
+*/
diff --git a/src/corelib/doc/src/cmake/cmake-properties.qdoc b/src/corelib/doc/src/cmake/cmake-properties.qdoc
index d379eed9c1..8fe2b0e88f 100644
--- a/src/corelib/doc/src/cmake/cmake-properties.qdoc
+++ b/src/corelib/doc/src/cmake/cmake-properties.qdoc
@@ -1,33 +1,10 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
\group cmake-target-properties-qtcore
\title CMake Target Properties in Qt6 Core
+\brief Lists CMake target properties known to Qt6::Core.
\l{CMake Commands in Qt6 Core}{CMake Commands} know about the following CMake
target properties:
@@ -36,15 +13,17 @@ target properties:
*/
/*!
-\page cmake-target-property-QT_ANDROID_DEPLOYMENT_DEPENDENCIES.html
+\page cmake-target-property-qt-android-deployment-dependencies.html
\ingroup cmake-properties-qtcore
\ingroup cmake-target-properties-qtcore
+\ingroup cmake-android-build-properties
\title QT_ANDROID_DEPLOYMENT_DEPENDENCIES
\target cmake-target-property-QT_ANDROID_DEPLOYMENT_DEPENDENCIES
\brief Overrides the Qt dependencies added to the target's deployment.
+\cmakepropertysince 6.0
\preliminarycmakeproperty
\cmakepropertyandroidonly
@@ -66,15 +45,17 @@ is listed before its dependencies, it will fail to load on some devices.
*/
/*!
-\page cmake-target-property-QT_ANDROID_EXTRA_LIBS.html
+\page cmake-target-property-qt-android-extra-libs.html
\ingroup cmake-properties-qtcore
\ingroup cmake-target-properties-qtcore
+\ingroup cmake-android-build-properties
\title QT_ANDROID_EXTRA_LIBS
\target cmake-target-property-QT_ANDROID_EXTRA_LIBS
\summary {Extra libraries to deploy with the target.}
+\cmakepropertysince 6.0
\preliminarycmakeproperty
\cmakepropertyandroidonly
@@ -83,19 +64,71 @@ A list of external libraries that will be copied into your application's
to enable OpenSSL in your application. For more information, see
\l{Adding OpenSSL Support for Android}.
+When adding extra libraries from the build tree of your project, it's also
+necessary to add dependency relations between library and the application
+target. Using the following project structure may cause an issue, when deploying
+an apk:
+\badcode
+qt_add_executable(MyApp main.cpp)
+
+set_target_properties(MyApp PROPERTIES
+ QT_ANDROID_EXTRA_LIBS
+ ${CMAKE_CURRENT_BINARY_DIR}/libMyService_${ANDROID_ABI}.so
+)
+
+# MyService library doesn't have any relations with MyApp
+qt_add_library(MyService service.cpp)
+\endcode
+
+This leads to uncertainty whether MyService library will be available before
+the deployment of MyApp or not. The easiest solution is adding MyService
+library to the MyApp dependencies:
+\badcode
+add_dependencies(MyApp MyService)
+\endcode
+
+When adding per-architecture libraries to a multi-abi project,
+list all their paths explicitly, rather than rely on variables like
+\c CMAKE_ANDROID_ARCH_ABI to dynamically compute the paths.
+
+Prefer:
+
+\badcode
+set(libs
+ ${CMAKE_CURRENT_BINARY_DIR}/libA_x86so
+ ${CMAKE_CURRENT_BINARY_DIR}/libA_x86_64.so
+ ${CMAKE_CURRENT_BINARY_DIR}/libA_arm64-v8a.so
+ ${CMAKE_CURRENT_BINARY_DIR}/libA_armeabi-v7a.so
+)
+set_target_properties(MyApp PROPERTIES QT_ANDROID_EXTRA_LIBS ${libs})
+
+# When targeting precompiled libs
+target_link_libraries(${CMAKE_PROJECT_NAME} PUBLIC libA_${ANDROID_ABI})
+\endcode
+
+over:
+
+\badcode
+set_target_properties(MyApp PROPERTIES
+ QT_ANDROID_EXTRA_LIBS
+ ${CMAKE_CURRENT_BINARY_DIR}/libA_${CMAKE_ANDROID_ARCH_ABI}.so)
+\endcode
+
\sa{qt6_android_generate_deployment_settings}{qt_android_generate_deployment_settings()}
*/
/*!
-\page cmake-target-property-QT_ANDROID_EXTRA_PLUGINS.html
+\page cmake-target-property-qt-android-extra-plugins.html
\ingroup cmake-properties-qtcore
\ingroup cmake-target-properties-qtcore
+\ingroup cmake-android-build-properties
\title QT_ANDROID_EXTRA_PLUGINS
\target cmake-target-property-QT_ANDROID_EXTRA_PLUGINS
\summary {Extra Qt plugins to deploy with the target.}
+\cmakepropertysince 6.0
\preliminarycmakeproperty
\cmakepropertyandroidonly
@@ -117,15 +150,17 @@ mangling is applied to the plugin library.
*/
/*!
-\page cmake-target-property-QT_ANDROID_MIN_SDK_VERSION.html
+\page cmake-target-property-qt-android-min-sdk-version.html
\ingroup cmake-properties-qtcore
\ingroup cmake-target-properties-qtcore
+\ingroup cmake-android-build-properties
\title QT_ANDROID_MIN_SDK_VERSION
\target cmake-target-property-QT_ANDROID_MIN_SDK_VERSION
\summary {Minimum Android SDK version.}
+\cmakepropertysince 6.1
\preliminarycmakeproperty
\cmakepropertyandroidonly
@@ -135,15 +170,17 @@ Specifies the minimum Android API level for the target.
*/
/*!
-\page cmake-target-property-QT_ANDROID_PACKAGE_SOURCE_DIR.html
+\page cmake-target-property-qt-android-package-source-dir.html
\ingroup cmake-properties-qtcore
\ingroup cmake-target-properties-qtcore
+\ingroup cmake-android-build-properties
\title QT_ANDROID_PACKAGE_SOURCE_DIR
\target cmake-target-property-QT_ANDROID_PACKAGE_SOURCE_DIR
\summary {Path to a custom Android package template.}
+\cmakepropertysince 6.0
\preliminarycmakeproperty
\cmakepropertyandroidonly
@@ -167,15 +204,17 @@ then place this directly into the directory specified by this variable.
*/
/*!
-\page cmake-target-property-QT_ANDROID_TARGET_SDK_VERSION.html
+\page cmake-target-property-qt-android-target-sdk-version.html
\ingroup cmake-properties-qtcore
\ingroup cmake-target-properties-qtcore
+\ingroup cmake-android-build-properties
\title QT_ANDROID_TARGET_SDK_VERSION
\target cmake-target-property-QT_ANDROID_TARGET_SDK_VERSION
\summary {Android target SDK version.}
+\cmakepropertysince 6.1
\preliminarycmakeproperty
\cmakepropertyandroidonly
@@ -185,15 +224,38 @@ Specifies the target Android API level for the target.
*/
/*!
-\page cmake-target-property-QT_ANDROID_VERSION_CODE.html
+\page cmake-target-property-qt-android-sdk-build-tools-revision.html
+\ingroup cmake-properties-qtcore
+\ingroup cmake-target-properties-qtcore
+\ingroup cmake-android-build-properties
+
+\title QT_ANDROID_SDK_BUILD_TOOLS_REVISION
+\target cmake-target-property-QT_ANDROID_SDK_BUILD_TOOLS_REVISION
+
+\summary {Revision of Android build tools to use.}
+
+\cmakepropertysince 6.0
+\preliminarycmakeproperty
+\cmakepropertyandroidonly
+
+Specifies the Android SDK build tools revision to use. If this is not set then
+CMake will attempt to use the latest installed version.
+
+\sa{qt6_android_generate_deployment_settings}{qt_android_generate_deployment_settings()}
+*/
+
+/*!
+\page cmake-target-property-qt-android-version-code.html
\ingroup cmake-properties-qtcore
\ingroup cmake-target-properties-qtcore
\title QT_ANDROID_VERSION_CODE
\target cmake-target-property-QT_ANDROID_VERSION_CODE
+\ingroup cmake-android-manifest-properties
\summary {Internal Android app version.}
+\cmakepropertysince 6.1
\preliminarycmakeproperty
\cmakepropertyandroidonly
@@ -206,15 +268,17 @@ For more information, see \l{Android: App Versioning}{Android App Versioning}.
*/
/*!
-\page cmake-target-property-QT_ANDROID_VERSION_NAME.html
+\page cmake-target-property-qt-android-version-name.html
\ingroup cmake-properties-qtcore
\ingroup cmake-target-properties-qtcore
\title QT_ANDROID_VERSION_NAME
\target cmake-target-property-QT_ANDROID_VERSION_NAME
+\ingroup cmake-android-manifest-properties
\summary {Human-readable Android app version.}
+\cmakepropertysince 6.1
\preliminarycmakeproperty
\cmakepropertyandroidonly
@@ -227,7 +291,31 @@ For more information, see \l{Android: App Versioning}{Android App Versioning}.
*/
/*!
-\page cmake-target-property-QT_QML_ROOT_PATH.html
+\page cmake-target-property-qt-android-abis.html
+\ingroup cmake-properties-qtcore
+\ingroup cmake-target-properties-qtcore
+\ingroup cmake-android-build-properties
+
+\title QT_ANDROID_ABIS
+\target cmake-target-property-QT_ANDROID_ABIS
+
+\summary {List of ABIs that packages of a single target are built for.}
+
+\cmakepropertysince 6.3
+\preliminarycmakeproperty
+\cmakepropertyandroidonly
+
+By setting the \c{QT_ANDROID_ABIS} property for a target, it's possible to control
+the list of ABIs that the single target packages are supposed to be built for.
+\include cmake-android-supported-abis.qdocinc
+The property only affects targets created with
+\l{qt6_add_executable}{qt_add_executable()}.
+
+\sa{cmake-variable-QT_ANDROID_ABIS}{QT_ANDROID_ABIS}, {QT_ANDROID_BUILD_ALL_ABIS}
+*/
+
+/*!
+\page cmake-target-property-qt-qml-root-path.html
\ingroup cmake-properties-qtcore
\ingroup cmake-target-properties-qtcore
@@ -236,6 +324,7 @@ For more information, see \l{Android: App Versioning}{Android App Versioning}.
\summary {Overrides the location of the application's qml directory.}
+\cmakepropertysince 6.1
\preliminarycmakeproperty
This property is currently only used when generating a deployment settings file
@@ -247,7 +336,7 @@ will be used instead.
*/
/*!
-\page cmake-target-property-QT_QML_IMPORT_PATH.html
+\page cmake-target-property-qt-qml-import-path.html
\ingroup cmake-properties-qtcore
\ingroup cmake-target-properties-qtcore
@@ -256,6 +345,7 @@ will be used instead.
\summary {Specifies a list of directories to search for QML imports.}
+\cmakepropertysince 6.0
\preliminarycmakeproperty
This property is currently only used when generating a deployment settings file
@@ -268,15 +358,17 @@ For application-specific QML imports, use
*/
/*!
-\page cmake-target-property-QT_ANDROID_DEPLOYMENT_SETTINGS_FILE.html
+\page cmake-target-property-qt-android-deployment-settings-file.html
\ingroup cmake-properties-qtcore
\ingroup cmake-target-properties-qtcore
+\ingroup cmake-android-build-properties
\title QT_ANDROID_DEPLOYMENT_SETTINGS_FILE
\target cmake-target-property-QT_ANDROID_DEPLOYMENT_SETTINGS_FILE
\summary {Specifies the location of a target's generated deployment settings file.}
+\cmakepropertysince 6.0
\preliminarycmakeproperty
\cmakepropertyandroidonly
@@ -287,7 +379,48 @@ and overwritten by that command.
*/
/*!
-\page cmake-target-property-qt_no_entrypoint.html
+\page cmake-target-property-qt-android-system-libs-prefix.html
+\ingroup cmake-properties-qtcore
+\ingroup cmake-target-properties-qtcore
+\ingroup cmake-android-build-properties
+
+\title QT_ANDROID_SYSTEM_LIBS_PREFIX
+\target cmake-target-property-QT_ANDROID_SYSTEM_LIBS_PREFIX
+
+\summary {Specifies the location of Qt libraries on the target device.}
+
+\preliminarycmakeproperty
+\cmakepropertyandroidonly
+
+This property can be set to provide a path to Qt libraries on the target device,
+when those libraries are installed outside app's native (JNI) library directory.
+*/
+
+/*!
+\page cmake-target-property-qt-android-no-deploy-qt-libs.html
+\ingroup cmake-properties-qtcore
+\ingroup cmake-target-properties-qtcore
+\ingroup cmake-android-build-properties
+
+\title QT_ANDROID_NO_DEPLOY_QT_LIBS
+\target cmake-target-property-QT_ANDROID_NO_DEPLOY_QT_LIBS
+
+\summary {Whether Qt shared libraries are packaged in the APK on Android.}
+
+\preliminarycmakeproperty
+\cmakepropertyandroidonly
+
+This property can be set to not package Qt shared libraries inside the APK when
+deploying the target. Use
+\l{cmake-target-property-QT_ANDROID_SYSTEM_LIBS_PREFIX}{QT_ANDROID_SYSTEM_LIBS_PREFIX}
+to provide a path to where those libraries will be located on the target device
+instead.
+
+\note Only supported when deploying as an APK.
+*/
+
+/*!
+\page cmake-target-property-qt-no-entrypoint.html
\ingroup cmake-properties-qtcore
\ingroup cmake-target-properties-qtcore
@@ -296,6 +429,7 @@ and overwritten by that command.
\summary {Specifies to inhibit linking against Qt's entrypoint lib.}
+\cmakepropertysince 6.1
\preliminarycmakeproperty
On certain platforms, Qt applications link against Qt's entrypoint lib by default.
@@ -305,7 +439,7 @@ On targets that must provide their own entry point, set the property \c qt_no_en
*/
/*!
-\page cmake-target-property-qt_resource_prefix.html
+\page cmake-target-property-qt-resource-prefix.html
\ingroup cmake-properties-qtcore
\ingroup cmake-target-properties-qtcore
@@ -314,9 +448,190 @@ On targets that must provide their own entry point, set the property \c qt_no_en
\summary {Specifies the default Qt resource prefix.}
+\cmakepropertysince 6.0
\preliminarycmakeproperty
When using \l{qt6_add_resources}{qt_add_resources} without a \c PREFIX
argument, then the value of this target property will be used as
resource prefix.
*/
+
+/*!
+\group cmake-source-file-properties-qtcore
+\title CMake Source File Properties in Qt6 Core
+\brief Lists CMake file properties used in Qt6::Core.
+
+\l{CMake Commands in Qt6 Core}{CMake Commands} know about the following CMake
+source file properties:
+
+\sa{CMake Property Reference}
+*/
+
+/*!
+\page cmake-source-file-property-qt-resource-alias.html
+\ingroup cmake-source-file-properties-qtcore
+
+\title QT_RESOURCE_ALIAS
+\target cmake-source-file-property-QT_RESOURCE_ALIAS
+
+\summary {Specifies the Qt resource alias for a file in a resource.}
+
+\cmakepropertysince 6.0
+
+When using the target-based variant of \l{qt6_add_resources}{qt_add_resources}
+the property value overrides the runtime path where the resource file is found.
+
+\sa{The Qt Resource System}
+*/
+
+/*!
+\page cmake-source-file-property-qt-discard-file-contents.html
+\ingroup cmake-source-file-properties-qtcore
+
+\title QT_DISCARD_FILE_CONTENTS
+\target cmake-source-file-property-QT_DISCARD_FILE_CONTENTS
+
+\summary {Specifies that the given files should be empty in the resource file system}
+
+\cmakepropertysince 6.6
+\preliminarycmakeproperty
+
+When using the target-based variant of \l{qt6_add_resources}{qt_add_resources}
+or \l{qt_add_qml_module}, setting this property to \c TRUE causes the file
+contents to be omitted when creating the resource file system. The file name is
+retained.
+
+This is useful if you want to strip QML source code from the binary.
+
+\note If you omit the QML source code from the binary, the QML engine has to
+rely on the compilation units created by \l{qmlcachegen} or \l{qmlsc}.
+Those are tied to the specific version of Qt they were built with. If you change
+the version of Qt your application uses, they can't be loaded anymore.
+
+\sa{The Qt Resource System}
+*/
+
+/*!
+\page cmake-target-property-qt-wasm-pthread-pool-size.html
+\ingroup cmake-properties-qtcore
+\ingroup cmake-target-properties-qtcore
+
+\title QT_WASM_PTHREAD_POOL_SIZE
+\target cmake-target-property-QT_WASM_PTHREAD_POOL_SIZE
+
+\summary {Internal WebAssembly thread pool size.}
+
+\cmakepropertysince 6.2.4
+\preliminarycmakeproperty
+\cmakepropertywebassemblyonly
+
+Specifies the number of web workers (threads) to create at application startup.
+Qt allocates a pool size of 4 by default. This means the app can use
+4 additional threads besides the main thread, without the additional overhead
+of creating a new web worker, which may deadlock if the main thread created it
+and join()s the thread without returning control to the event loop first.
+Translates into the Emscripten compiler setting of PTHREAD_POOL_SIZE.
+
+For more information, see \l{https://emscripten.org/docs/porting/pthreads.html}{Pthreads support}.
+*/
+
+/*!
+\group cmake-global-properties-qtcore
+\title CMake Global Properties in Qt6 Core
+\brief Lists CMake global properties used or defined in Qt6::Core.
+
+\l{CMake Commands in Qt6 Core}{CMake Commands} know about the following global
+CMake properties:
+
+\sa{CMake Property Reference}
+*/
+
+/*!
+\page cmake-global-property-qt-targets-folder.html
+\ingroup cmake-properties-qtcore
+\ingroup cmake-global-properties-qtcore
+
+\title QT_TARGETS_FOLDER
+\target cmake-global-property-QT_TARGETS_FOLDER
+
+\brief Sets the FOLDER property for Qt-internal targets.
+
+\cmakepropertysince 6.5
+\preliminarycmakeproperty
+
+Name of the \l FOLDER for internal targets that are added by Qt's CMake
+commands.
+
+By default, this property is not set.
+
+This property only has an effect if CMake's \l USE_FOLDERS property is \c{ON}.
+
+You can use the \l{qt6_standard_project_setup}{qt_standard_project_setup}
+function to enable folder support and initialize the \c{QT_TARGETS_FOLDER}.
+
+\sa{qt6_standard_project_setup}{qt_standard_project_setup}
+*/
+
+/*!
+\page cmake-target-property-qt-wasm-initial-memory.html
+\ingroup cmake-properties-qtcore
+\ingroup cmake-target-properties-qtcore
+
+\title QT_WASM_INITIAL_MEMORY
+\target cmake-target-property-QT_WASM_INITIAL_MEMORY
+
+\summary {Internal WebAssembly initial memory.}
+
+\cmakepropertysince 6.2.4
+\preliminarycmakeproperty
+\cmakepropertywebassemblyonly
+
+Specifies the initial amount of memory to use, in bytes. Using more will cause the
+browser to copy the old heap into a new one. Translates into the
+Emscripten compiler setting of INITIAL_MEMORY.
+QT_WASM_INITIAL_MEMORY must be a multiple of 65536 bytes.
+
+For more information, see \l{https://github.com/emscripten-core/emscripten/blob/main/src/settings.js}{Emscripten compiler settings}.
+*/
+
+/*!
+\page cmake-target-property-qt-wasm-maximum-memory.html
+\ingroup cmake-properties-qtcore
+\ingroup cmake-target-properties-qtcore
+
+\title QT_WASM_MAXIMUM_MEMORY
+\target cmake-target-property-QT_WASM_MAXIMUM_MEMORY
+
+\summary {Internal WebAssembly maximum memory.}
+
+\cmakepropertysince 6.7
+\preliminarycmakeproperty
+\cmakepropertywebassemblyonly
+
+Specifies the maximum amount of memory the application can use. Translates into
+the Emscripten compiler setting of \c MAXIMUM_MEMORY. The default value
+is 4GB, which is the maximum for 32-bit WebAssembly.
+
+For more information, see the \l{https://github.com/emscripten-core/emscripten/blob/3319a313d3b589624d342b650884caaf8cd9ef30/src/settings.js#L187}{Emscripten compiler settings}.
+*/
+
+
+
+/*!
+\page cmake-target-property-qt-ios-launch-screen.html
+\ingroup cmake-properties-qtcore
+\ingroup cmake-target-properties-qtcore
+
+\title QT_IOS_LAUNCH_SCREEN
+\target cmake-target-property-QT_IOS_LAUNCH_SCREEN
+
+\summary {Path to iOS launch screen storyboard}
+
+\cmakepropertysince 6.4
+\preliminarycmakeproperty
+\cmakepropertyiosonly
+
+Specifies the path to an iOS launch screen storyboard file.
+
+\sa {Launch Screens and Launch Images}
+*/
diff --git a/src/corelib/doc/src/cmake/cmake-standard-properties.qdoc b/src/corelib/doc/src/cmake/cmake-standard-properties.qdoc
new file mode 100644
index 0000000000..a8ece6ba8f
--- /dev/null
+++ b/src/corelib/doc/src/cmake/cmake-standard-properties.qdoc
@@ -0,0 +1,24 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
+
+/*!
+\page cmake-standard-property-autogen-better-graph-multi-config.html
+\ingroup cmake-standard-properties
+
+\title AUTOGEN_BETTER_GRAPH_MULTI_CONFIG
+
+\brief Improves the dependency graph for multi-configuration generators when you
+set it on a target.
+
+When this boolean property is enabled, \c{CMake} will generate more per-config targets.
+Thus, the dependency graph will be more accurate for multi-configuration
+generators and some recompilations will be avoided.
+
+Since Qt 6.8, this property is enabled by default. For older versions,
+you need to enable it manually to use it.
+However, \l{qt_extract_metatypes} and \l{qt_add_qml_module} were updated to
+support \c{AUTOGEN_BETTER_GRAPH_MULTI_CONFIG} in Qt 6.8, so you will get build
+errors, unless you patch the older Qt version to support it.
+
+See \l{https://cmake.org/cmake/help/latest/prop_tgt/AUTOGEN_BETTER_GRAPH_MULTI_CONFIG.html}{AUTOGEN_BETTER_GRAPH_MULTI_CONFIG} for more information.
+*/
diff --git a/src/corelib/doc/src/cmake/cmake-variables.qdoc b/src/corelib/doc/src/cmake/cmake-variables.qdoc
deleted file mode 100644
index 1cef1ffd3c..0000000000
--- a/src/corelib/doc/src/cmake/cmake-variables.qdoc
+++ /dev/null
@@ -1,164 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/*!
-\group cmake-variables-qtcore
-\title CMake Variables in Qt6 Core
-
-The following CMake variables are defined when Qt6::Core is loaded, for instance
-with
-
-\badcode
-find_package(Qt6 COMPONENTS Core REQUIRED)
-\endcode
-
-\sa{CMake Variable Reference}
-*/
-
-*/*!
-\page cmake-variable-ANDROID_NDK_HOST_SYSTEM_NAME.html
-\ingroup cmake-variables
-\ingroup cmake-variables-qtcore
-
-\title ANDROID_NDK_HOST_SYSTEM_NAME
-\target cmake-variable-ANDROID_NDK_HOST_SYSTEM_NAME
-
-\summary {Android-specific architecture of the host system.}
-
-\preliminarycmakevariable
-\cmakevariableandroidonly
-
-This is normally set by the Android NDK toolchain file. It is written out as
-part of the deployment settings for a target.
-
-\sa{qt6_android_generate_deployment_settings}{qt_android_generate_deployment_settings()}
-*/
-
-/*!
-\page cmake-variable-ANDROID_SDK_ROOT.html
-\ingroup cmake-variables
-\ingroup cmake-variables-qtcore
-
-\title ANDROID_SDK_ROOT
-\target cmake-variable-ANDROID_SDK_ROOT
-
-\summary {Location of the Android SDK.}
-
-\preliminarycmakevariable
-\cmakevariableandroidonly
-
-This specifies the location of the Android SDK when building for the Android platform.
-It is written out as part of the deployment settings for a target.
-
-\sa{qt6_android_generate_deployment_settings}{qt_android_generate_deployment_settings()}.
-*/
-
-/*!
-\page cmake-variable-QT_ANDROID_APPLICATION_ARGUMENTS.html
-\ingroup cmake-variables
-\ingroup cmake-variables-qtcore
-
-\title QT_ANDROID_APPLICATION_ARGUMENTS
-\target cmake-variable-QT_ANDROID_APPLICATION_ARGUMENTS
-
-\summary {List of arguments to pass to Android applications.}
-
-\preliminarycmakevariable
-\cmakevariableandroidonly
-
-This contains a list of arguments to be passed to Android applications. It is written
-out as part of the deployment settings for a target.
-
-\sa{qt6_android_generate_deployment_settings}{qt_android_generate_deployment_settings()}
-*/
-
-/*!
-\page cmake-variable-QT_HOST_PATH.html
-\ingroup cmake-variables
-\ingroup cmake-variables-qtcore
-
-\title QT_HOST_PATH
-\target cmake-variable-QT_HOST_PATH
-
-\summary {Location of the host Qt installation when cross-compiling.}
-
-\preliminarycmakevariable
-
-When cross-compiling, this must be set to the install location of Qt for the host
-platform. It is used to locate tools to be run on the host (\l{moc}, \l{rcc},
-\l{androiddeployqt}, and so on).
-*/
-
-/*!
-\page cmake-variable-QT_NO_SET_XCODE_DEVELOPMENT_TEAM_ID.html
-\ingroup cmake-variables
-\ingroup cmake-variables-qtcore
-
-\title QT_NO_SET_XCODE_DEVELOPMENT_TEAM_ID
-\target cmake-variable-QT_NO_SET_XCODE_DEVELOPMENT_TEAM_ID
-
-\summary {Disables providing a fallback team ID during target finalization on iOS.}
-
-When finalizing an executable target on iOS,
-\l{qt6_finalize_target}{qt_finalize_target()} will populate the target's
-\c XCODE_ATTRIBUTE_DEVELOPMENT_TEAM property if it hasn't been set.
-Set \c QT_NO_SET_XCODE_DEVELOPMENT_TEAM_ID to true if you want to prevent this.
-*/
-
-/*!
-\page cmake-variable-QT_NO_SET_XCODE_BUNDLE_IDENTIFIER.html
-\ingroup cmake-variables
-\ingroup cmake-variables-qtcore
-
-\title QT_NO_SET_XCODE_BUNDLE_IDENTIFIER
-\target cmake-variable-QT_NO_SET_XCODE_BUNDLE_IDENTIFIER
-
-\summary {Disables providing a fallback app bundle ID during target finalization on iOS.}
-
-When finalizing an executable target on iOS,
-\l{qt6_finalize_target}{qt_finalize_target()} will populate the target's
-\c XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER and
-\c MACOSX_BUNDLE_GUI_IDENTIFIER properties if they haven't been set.
-Set \c QT_NO_SET_XCODE_BUNDLE_IDENTIFIER to true if you want to prevent this.
-*/
-
-/*!
-\page cmake-variable-QT_ENABLE_VERBOSE_DEPLOYMENT.html
-\ingroup cmake-variables
-\ingroup cmake-variables-qtcore
-
-\title QT_ENABLE_VERBOSE_DEPLOYMENT
-\target cmake-variable-QT_ENABLE_VERBOSE_DEPLOYMENT
-
-\summary {Enables verbose mode of deployment tools}
-
-\preliminarycmakevariable
-
-Enables verbose mode of the androiddeployqt deployment tool when it is implicitly called
-inside the Qt CMake commands.
-
-*/
diff --git a/src/corelib/doc/src/cmake/policy/qtp0002.qdoc b/src/corelib/doc/src/cmake/policy/qtp0002.qdoc
new file mode 100644
index 0000000000..a40344a167
--- /dev/null
+++ b/src/corelib/doc/src/cmake/policy/qtp0002.qdoc
@@ -0,0 +1,63 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
+
+/*!
+\page qt-cmake-policy-qtp0002.html
+\ingroup qt-cmake-policies
+
+\title QTP0002
+\keyword qt_cmake_policy_qtp0002
+
+\summary {Target properties that specify Android-specific paths may contain generator expressions.}
+
+This policy was introduced in Qt 6.6. It changes the processing of target
+properties that specify Android-specific paths:
+\list
+ \li \l QT_QML_IMPORT_PATH
+ \li \l QT_QML_ROOT_PATH
+ \li \l QT_ANDROID_PACKAGE_SOURCE_DIR
+ \li \l QT_ANDROID_EXTRA_PLUGINS
+ \li \l QT_ANDROID_EXTRA_LIBS
+\endlist
+
+The \c OLD behavior of this policy doesn't allow generator expressions in the
+target properties that specify Android-specific paths but implicitly converts
+the specified paths to valid JSON strings.
+
+The \c NEW behavior of this policy allows using generator expressions in the
+target properties that specify Android-specific paths, but they must evaluate to
+valid JSON strings.
+
+The following value of the \l QT_ANDROID_EXTRA_PLUGINS property is converted to
+a valid JSON string if you set the policy to OLD, but leads to an error if the
+policy is set to NEW:
+\badcode
+set_target_properties(
+ QT_ANDROID_EXTRA_PLUGINS "\\path\\to\\MyPlugin.so"
+)
+\endcode
+If the policy is set to NEW for the above example, the resulting JSON string in
+the deployment settings file will contain escaped symbols instead of path
+separators.
+
+Generator expressions are only supported if the policy is set to NEW, so the
+OLD behavior generates a malformed deployment settings file with the following
+code:
+\badcode
+set_target_properties(
+ QT_ANDROID_EXTRA_PLUGINS "$<TARGET_FILE_DIR:MyPlugin>"
+)
+\endcode
+
+This property value works as expected with both OLD and NEW policy values:
+\badcode
+set_target_properties(
+ QT_ANDROID_EXTRA_PLUGINS "/path/to/MyPlugin.so"
+)
+\endcode
+
+\qtpolicydeprecatedbehavior
+
+\sa qt_policy, {Qt CMake policies}
+
+*/
diff --git a/src/corelib/doc/src/cmake/policy/qtp0003.qdoc b/src/corelib/doc/src/cmake/policy/qtp0003.qdoc
new file mode 100644
index 0000000000..bf11b6f8b5
--- /dev/null
+++ b/src/corelib/doc/src/cmake/policy/qtp0003.qdoc
@@ -0,0 +1,46 @@
+// Copyright (C) 2024 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
+
+/*!
+\page qt-cmake-policy-qtp0003.html
+\ingroup qt-cmake-policies
+\since 6.7
+\title QTP0003
+\keyword qt_cmake_policy_qtp0003
+
+\summary {Consider the BUILD_SHARED_LIBS value when creating Qt libraries.}
+
+This policy was introduced in Qt 6.7. The policy affects the default type of the
+libraries created using \l {CMake Commands in Qt6 Core}{Qt CMake API}, like
+\l {qt_add_library}, \l{qt_add_plugin}, \l{qt_add_qml_module}.
+
+If the policy is set to \c OLD, the default library type that is selected is
+aligned with the Qt build type, either \c shared or \c static.
+
+If the policy is set to \c NEW, the library type is selected according to the
+\l {CMake BUILD_SHARED_LIBS Documentation}{BUILD_SHARED_LIBS} value if it's set.
+If \c BUILD_SHARED_LIBS is not set, the default library type falls back to the
+Qt build type.
+
+For example, the following code will use the Qt build type as the default
+library type for the \c MyLib target, despite the fact \c BUILD_SHARED_LIBS is
+set to \c ON:
+\badcode
+set(BUILD_SHARED_LIBS ON)
+...
+qt6_add_library(MyLib sourcefile.h sourcefile.cpp)
+\endcode
+
+If you set the QTP0003 to \c NEW before the \l {qt6_add_library}{qt_add_library}
+call, \c BUILD_SHARED_LIBS will affect the library default type and \c MyLib
+will be the shared library.
+\badcode
+set(BUILD_SHARED_LIBS ON)
+...
+qt_policy(SET QTP0003 NEW)
+qt6_add_library(MyLib sourcefile.h sourcefile.cpp)
+\endcode
+
+\sa qt_policy, {Qt CMake policies}, qt_add_library
+
+*/
diff --git a/src/corelib/doc/src/cmake/qt_add_big_resources.qdoc b/src/corelib/doc/src/cmake/qt_add_big_resources.qdoc
index be3617a034..8215d4c717 100644
--- a/src/corelib/doc/src/cmake/qt_add_big_resources.qdoc
+++ b/src/corelib/doc/src/cmake/qt_add_big_resources.qdoc
@@ -1,41 +1,19 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
-\page qt_add_bigresources.html
+\page qt-add-bigresources.html
\ingroup cmake-commands-qtcore
\title qt_add_big_resources
-\target qt6_add_big_resources
+\keyword qt6_add_big_resources
\summary {Compiles big binary resources into object code.}
\include cmake-find-package-core.qdocinc
+\cmakecommandsince 5.12
+
\section1 Synopsis
\badcode
@@ -56,6 +34,14 @@ generates object files (\c .o, \c .obj) files instead of C++ source code.
This allows to embed bigger resources, where compiling to C++ sources and then
to binaries would be too time consuming or memory intensive.
+\note The \c{file1.qrc} will not be treated as a source file by Qt Creator. It
+needs to be added as a source file to a CMake target and have the property
+\c{SKIP_AUTORCC} set to \c{ON}.
+
+\warning This command is not supported when building for iOS, use
+\l qt_add_resources instead.
+See \l{https://bugreports.qt.io/browse/QTBUG-103497}{QTBUG-103497} for details.
+
\section1 Arguments
You can set additional \c{OPTIONS} that should be added to the \c{rcc} calls.
diff --git a/src/corelib/doc/src/cmake/qt_add_binary_resources.qdoc b/src/corelib/doc/src/cmake/qt_add_binary_resources.qdoc
index b601093942..12ee5e1aff 100644
--- a/src/corelib/doc/src/cmake/qt_add_binary_resources.qdoc
+++ b/src/corelib/doc/src/cmake/qt_add_binary_resources.qdoc
@@ -1,41 +1,19 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
-\page qt_add_binary_resources.html
+\page qt-add-binary-resources.html
\ingroup cmake-commands-qtcore
\title qt_add_binary_resources
-\target qt6_add_binary_resources
+\keyword qt6_add_binary_resources
\summary {Creates an RCC file from a list of Qt resource files.}
\include cmake-find-package-core.qdocinc
+\cmakecommandsince 5.10
+
\section1 Synopsis
\badcode
diff --git a/src/corelib/doc/src/cmake/qt_add_executable.qdoc b/src/corelib/doc/src/cmake/qt_add_executable.qdoc
index 4302ea9ebe..cc8c924c79 100644
--- a/src/corelib/doc/src/cmake/qt_add_executable.qdoc
+++ b/src/corelib/doc/src/cmake/qt_add_executable.qdoc
@@ -1,41 +1,19 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
-\page qt_add_executable.html
+\page qt-add-executable.html
\ingroup cmake-commands-qtcore
\title qt_add_executable
-\target qt6_add_executable
+\keyword qt6_add_executable
\summary {Creates and finalizes an application target of a platform-specific type.}
\include cmake-find-package-core.qdocinc
+\cmakecommandsince 6.0
+
\section1 Synopsis
\badcode
@@ -82,25 +60,38 @@ for you as a convenience.
After a target is created, further processing or \e{finalization} steps are
commonly needed. The steps to perform depend on the platform and on various
-properties of the target. The finalization processing is implemented by the
-\l{qt6_finalize_target}{qt_finalize_target()} command.
+properties of the target.
+
+The finalization processing is implemented by two commands:
+\l{qt6_finalize_target}{qt_finalize_target()} and
+\l{qt6_finalize_project}{qt_finalize_project()}.
+
+Target finalization can occur either as part of calling \c{qt_add_executable}
+or be deferred to sometime after this command returns (but it should still be in
+the same directory scope).
-Finalization can occur either as part of this call or be deferred to sometime
-after this command returns (but it should still be in the same directory scope).
-When using CMake 3.19 or later, finalization is automatically deferred to the
+When using CMake 3.19 or later, target finalization is automatically deferred to the
end of the current directory scope. This gives the caller an opportunity to
modify properties of the created target before it is finalized. When using
CMake versions earlier than 3.19, automatic deferral isn't supported. In that
-case, finalization is performed immediately before this command returns.
+case, target finalization is performed immediately before this command returns.
Regardless of the CMake version, the \c{MANUAL_FINALIZATION} keyword can be given to
indicate that you will explicitly call \l{qt6_finalize_target}{qt_finalize_target()}
yourself instead at some later time. In general, \c MANUAL_FINALIZATION should
not be needed unless the project has to support CMake 3.18 or earlier.
+Project finalization occurs automatically when using CMake 3.19 or later.
+When using an older CMake version, you should call
+\l{qt6_finalize_project}{qt_finalize_project()} manually, at the end
+of the root \c CMakeLists.txt file.
+This is especially important when targeting Android, to collect dependencies
+between project targets for deployment purposes.
+
\sa {qt6_finalize_target}{qt_finalize_target()},
{qt6_set_finalizer_mode}{qt_set_finalizer_mode()},
- {qt6_add_library}{qt_add_library()}
+ {qt6_add_library}{qt_add_library()},
+ {qt6_finalize_project}{qt_finalize_project()}
\section1 Examples
@@ -118,4 +109,6 @@ support using CMake versions earlier than 3.19, we take over responsibility
for finalizing the target by adding the \c{MANUAL_FINALIZATION} keyword.
\snippet cmake-macros/examples.cmake qt_add_executable_deferred
+
+\include cmake-android-qt-finalize-project-warning.qdocinc warning
*/
diff --git a/src/corelib/doc/src/cmake/qt_add_library.qdoc b/src/corelib/doc/src/cmake/qt_add_library.qdoc
index 4865a5df93..851a2d6210 100644
--- a/src/corelib/doc/src/cmake/qt_add_library.qdoc
+++ b/src/corelib/doc/src/cmake/qt_add_library.qdoc
@@ -1,41 +1,19 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
-\page qt_add_library.html
+\page qt-add-library.html
\ingroup cmake-commands-qtcore
\title qt_add_library
-\target qt6_add_library
+\keyword qt6_add_library
\summary {Creates and finalizes a library.}
\include cmake-find-package-core.qdocinc
+\cmakecommandsince 6.2
+
\section1 Synopsis
\badcode
@@ -67,12 +45,15 @@ library type created depends on how Qt was built. If Qt was built statically,
a static library will be created. Otherwise, a shared library will
be created. Note that this is different to how CMake's \c{add_library()}
command works, where the \c BUILD_SHARED_LIBS variable controls the type of
-library created. The \c{qt_add_library()} command does not consider
-\c BUILD_SHARED_LIBS when deciding the library type.
+library created.
+Since 6.7, the \c{qt_add_library()} command considers \c BUILD_SHARED_LIBS
+when deciding the library type only if the variable is set explicitly and
+\l {QTP0003} is set to \c NEW.
Any \c{sources} provided will be passed through to the internal call to
\c{add_library()}.
+\target qt_add_library finalization
\section2 Finalization
After a target is created, further processing or \e{finalization} steps may be
@@ -94,6 +75,6 @@ time. In general, \c MANUAL_FINALIZATION should not be needed unless the
project has to support CMake 3.18 or earlier.
\sa {qt6_finalize_target}{qt_finalize_target()},
- {qt6_add_executable}{qt_add_executable()}
+ {qt6_add_executable}{qt_add_executable()}, QTP0003
*/
diff --git a/src/corelib/doc/src/cmake/qt_add_plugin.qdoc b/src/corelib/doc/src/cmake/qt_add_plugin.qdoc
index f20b4c5afc..d2322086e7 100644
--- a/src/corelib/doc/src/cmake/qt_add_plugin.qdoc
+++ b/src/corelib/doc/src/cmake/qt_add_plugin.qdoc
@@ -1,41 +1,19 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
-\page qt_add_plugin.html
+\page qt-add-plugin.html
\ingroup cmake-commands-qtcore
\title qt_add_plugin
-\target qt6_add_plugin
+\keyword qt6_add_plugin
\summary {Creates a Qt plugin target.}
\include cmake-find-package-core.qdocinc
+\cmakecommandsince 6.0
+
\section1 Synopsis
\badcode
@@ -43,9 +21,14 @@ qt_add_plugin(target
[SHARED | STATIC]
[CLASS_NAME class_name]
[OUTPUT_TARGETS variable_name]
+ [MANUAL_FINALIZATION]
+ sources...
)
\endcode
+The \c MANUAL_FINALIZATION option and the ability to set sources
+were introduced in Qt 6.5.
+
\versionlessCMakeCommandsNote qt6_add_plugin()
\section1 Description
@@ -59,6 +42,9 @@ By default, the plugin will be created as a \c STATIC library if Qt was built
statically, or as a \c MODULE library otherwise. You can override this default
by explicitly providing the \c STATIC or \c SHARED option.
+Any \c{sources} provided will be passed through to the internal call to
+\c{add_library()}.
+
\note Non-static plugins are meant to be loaded dynamically at runtime, not
linked to at build time. CMake differentiates between these two scenarios by
providing the \c MODULE library type for dynamically loaded libraries, and
@@ -85,4 +71,17 @@ project should also install these internal targets. The names of these targets
can be obtained by providing the \c OUTPUT_TARGETS option, followed by the name
of a variable in which to return the target list.
+\section2 Finalization
+
+After a target is created, further processing or \e{finalization} steps may be
+needed. The finalization processing is implemented by the
+\l{qt6_finalize_target}{qt_finalize_target()} command.
+
+For details and the meaning of the \c{MANUAL_FINALIZATION} option, refer to the
+\l{qt_add_library finalization}{finalization documentation} for
+\c{qt_add_library}.
+
+\sa {qt6_finalize_target}{qt_finalize_target()},
+ {qt6_add_executable}{qt_add_executable()}
+
*/
diff --git a/src/corelib/doc/src/cmake/qt_add_resources.qdoc b/src/corelib/doc/src/cmake/qt_add_resources.qdoc
index c3709a9bf3..2e713b1b8e 100644
--- a/src/corelib/doc/src/cmake/qt_add_resources.qdoc
+++ b/src/corelib/doc/src/cmake/qt_add_resources.qdoc
@@ -1,36 +1,12 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
-\page qt_add_resources.html
+\page qt-add-resources.html
\ingroup cmake-commands-qtcore
\title qt_add_resources
-\target qt6_add_resources
+\keyword qt6_add_resources
\summary {Compiles binary resources into source code.}
@@ -52,6 +28,8 @@ qt_add_resources(<TARGET> <RESOURCE_NAME>
[PREFIX <PATH>]
[LANG <LANGUAGE>]
[BASE <PATH>]
+ [BIG_RESOURCES]
+ [OUTPUT_TARGETS <VARIABLE_NAME>]
[FILES ...] [OPTIONS ...])
\endcode
@@ -70,8 +48,6 @@ When passing a target as first argument, the function creates a resource with
the name \c{RESOURCE_NAME}, containing the specified \c{FILES}. The resource is
automatically linked into \c{TARGET}.
-For embedding bigger resources, see \l qt_add_big_resources.
-
See \l{The Qt Resource System} for a general description of Qt resources.
\section1 Arguments of the target-based variant
@@ -79,7 +55,9 @@ See \l{The Qt Resource System} for a general description of Qt resources.
\c PREFIX specifies a path prefix under which all files of this resource are
accessible from C++ code. This corresponds to the XML attribute \c prefix of the
\c .qrc file format. If \c PREFIX is not given, the target property
-\l{cmake-target-property-QT_RESOURCE_PREFIX}{QT_RESOURCE_PREFIX} is used.
+\l{cmake-target-property-QT_RESOURCE_PREFIX}{QT_RESOURCE_PREFIX} is used. Since
+6.5, \c{PREFIX} is optional. If it is omitted and not specified by
+\c{QT_RESOURCE_PREFIX}, \c{"/"} will be used as the default path prefix.
\c LANG specifies the locale of this resource. This corresponds to the XML
attribute \c lang of the \c .qrc file format.
@@ -92,6 +70,21 @@ example, if \c BASE is \c{"assets"} and \c FILES is
Alias settings for files need to be set via the \c QT_RESOURCE_ALIAS source file
property.
+\c BIG_RESOURCES can be specified to enable support for big resources. This
+directly generates object files (\c .o, \c .obj) instead of C++ source code.
+This allows embedding bigger resources, without having to compile generated C++
+sources, which can be too time consuming and memory intensive.
+
+Note that \c BIG_RESOURCES is not compatible with iOS due to restrictions of
+CMake's Xcode project generator. See
+\l{https://bugreports.qt.io/browse/QTBUG-103497}{QTBUG-103497} for details.
+Also, \c BIG_RESOURCES only works reliably from CMake 3.17 onwards.
+
+When using this command with static libraries, one or more special targets will
+be generated. Should you wish to perform additional processing on these targets,
+pass a variable name to the \c OUTPUT_TARGETS parameter. The \c qt_add_resources
+function stores the names of the special targets in the specified variable.
+
\section1 Arguments of both variants
You can set additional \c{OPTIONS} that should be added to the \c{rcc} calls.
@@ -112,4 +105,6 @@ resources linked into the final target.
This especially affects static builds. There, the same resource name in
different static libraries conflict in the consuming target.
+
+\sa {qt6_add_big_resources}{qt_add_big_resources()}
*/
diff --git a/src/corelib/doc/src/cmake/qt_allow_non_utf8_sources.qdoc b/src/corelib/doc/src/cmake/qt_allow_non_utf8_sources.qdoc
index 1f65d298f7..ad95401f4d 100644
--- a/src/corelib/doc/src/cmake/qt_allow_non_utf8_sources.qdoc
+++ b/src/corelib/doc/src/cmake/qt_allow_non_utf8_sources.qdoc
@@ -1,41 +1,19 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
-\page qt_allow_non_utf8_sources.html
+\page qt-allow-non-utf8-sources.html
\ingroup cmake-commands-qtcore
\title qt_allow_non_utf8_sources
-\target qt6_allow_non_utf8_sources
+\keyword qt6_allow_non_utf8_sources
\summary {Prevents forcing source files to be treated as UTF-8 for Windows.}
\include cmake-find-package-core.qdocinc
+\cmakecommandsince 6.0
+
\section1 Synopsis
\badcode
diff --git a/src/corelib/doc/src/cmake/qt_android_add_apk_target.qdoc b/src/corelib/doc/src/cmake/qt_android_add_apk_target.qdoc
index f07fb1bd8f..b2415730f5 100644
--- a/src/corelib/doc/src/cmake/qt_android_add_apk_target.qdoc
+++ b/src/corelib/doc/src/cmake/qt_android_add_apk_target.qdoc
@@ -1,42 +1,19 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
-\page qt_android_add_apk_target.html
+\page qt-android-add-apk-target.html
\ingroup cmake-commands-qtcore
\title qt_android_add_apk_target
-\target qt6_android_add_apk_target
+\keyword qt6_android_add_apk_target
\summary {Defines a build target that runs androiddeployqt to produce an APK.}
\include cmake-find-package-core.qdocinc
-\preliminarycmakecommand
+\cmakecommandsince 6.0
+\warning This command is deprecated since Qt 6.5. Use \l qt_add_executable instead.
\cmakecommandandroidonly
\section1 Synopsis
@@ -49,26 +26,30 @@ qt_android_add_apk_target(target)
\section1 Description
-The \c{<target>_make_apk} custom target created by this command takes an Android
-deployment settings file and generates an APK by running \c{androiddeployqt}.
+The \c{<target>_make_apk} and \c{<target>_make_aab} custom targets created by
+this command take an Android deployment settings file and generate APK and
+AAB respectively by running \c{androiddeployqt}.
The location of the settings file is taken from the \c{target}'s
\c{QT_ANDROID_DEPLOYMENT_SETTINGS_FILE} property. This file is typically created by
\l{qt6_android_generate_deployment_settings}{qt_android_generate_deployment_settings()}.
-The \c{.apk} file will be generated in an \c{android-build} subdirectory below
-the CMake build directory of the \c{target}.
+The respective Android package will be generated in an \c{android-build}
+subdirectory below the CMake build directory of the \c{target}.
-The \c{<target>_make_apk} target will be automatically added as a dependency of
-the \c{apk} build target, which will be created if it doesn't already exist.
-This can be disabled by setting the \c{QT_NO_GLOBAL_APK_TARGET} variable to true.
+The \c{<target>_make_apk} and \c{<target>_make_aab} targets will be
+automatically added as dependencies of the \c{apk} and \c{aab} build targets
+respectively, which will be created automatically. Creating of the \c{apk} and
+\c{aab} targets can be disabled by setting the \c{QT_NO_GLOBAL_APK_TARGET} and
+\c{QT_NO_GLOBAL_AAB_TARGET} variables to \c{TRUE}.
\sa {qt6_android_generate_deployment_settings}{qt_android_generate_deployment_settings()},
- {qt6_finalize_target}{qt_finalize_target()}
+ {qt6_finalize_target}{qt_finalize_target()},
+ {qt6_finalize_project}{qt_finalize_project()}
\section1 Example
\snippet cmake-macros/examples.cmake qt_android_deploy_basic
-The above commands define the build targets \c{myapp_make_apk} and \c{apk},
-which can be used to generate just the \c{myapp} APK or all APKs in the project
-respectively.
+The above commands define the \c{myapp_make_apk}, \c{myapp_make_aab}, \c{apk},
+and \c{aab} build targets which can be used to generate just the
+\c{myapp} packages or all APKs and AABs in the project respectively.
*/
diff --git a/src/corelib/doc/src/cmake/qt_android_apply_arch_suffix.qdoc b/src/corelib/doc/src/cmake/qt_android_apply_arch_suffix.qdoc
index 570de072c4..a29e1f6123 100644
--- a/src/corelib/doc/src/cmake/qt_android_apply_arch_suffix.qdoc
+++ b/src/corelib/doc/src/cmake/qt_android_apply_arch_suffix.qdoc
@@ -1,42 +1,20 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
-\page qt_android_apply_arch_suffix.html
+\page qt-android-apply-arch-suffix.html
\ingroup cmake-commands-qtcore
\title qt_android_apply_arch_suffix
-\target qt6_android_apply_arch_suffix
+\keyword qt6_android_apply_arch_suffix
\summary {Configures the target binary's name to include an architecture-specific suffix.}
\include cmake-find-package-core.qdocinc
-\preliminarycmakecommand
+\cmakecommandsince 6.0
+\warning This command is deprecated since Qt 6.5. Use \l qt_add_executable
+or \l qt_add_library instead.
\cmakecommandandroidonly
\section1 Synopsis
diff --git a/src/corelib/doc/src/cmake/qt_android_generate_deployment_settings.qdoc b/src/corelib/doc/src/cmake/qt_android_generate_deployment_settings.qdoc
index aa48820386..5a7bbdc33f 100644
--- a/src/corelib/doc/src/cmake/qt_android_generate_deployment_settings.qdoc
+++ b/src/corelib/doc/src/cmake/qt_android_generate_deployment_settings.qdoc
@@ -1,42 +1,19 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
-\page qt_android_generate_deployment_settings.html
+\page qt-android-generate-deployment-settings.html
\ingroup cmake-commands-qtcore
\title qt_android_generate_deployment_settings
-\target qt6_android_generate_deployment_settings
+\keyword qt6_android_generate_deployment_settings
\summary {Generates the deployment settings file needed by androiddeployqt.}
\include cmake-find-package-core.qdocinc
-\preliminarycmakecommand
+\cmakecommandsince 6.0
+\warning This command is deprecated since Qt 6.5. Use \l qt_add_executable instead.
\cmakecommandandroidonly
\section1 Synopsis
diff --git a/src/corelib/doc/src/cmake/qt_deploy_qt_conf.qdoc b/src/corelib/doc/src/cmake/qt_deploy_qt_conf.qdoc
new file mode 100644
index 0000000000..45fd8f4c5f
--- /dev/null
+++ b/src/corelib/doc/src/cmake/qt_deploy_qt_conf.qdoc
@@ -0,0 +1,78 @@
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
+
+/*!
+\page qt-deploy-qt-conf.html
+\ingroup cmake-commands-qtcore
+
+\title qt_deploy_qt_conf
+\keyword qt6_deploy_qt_conf
+
+\summary {Write a qt.conf file at deployment time.}
+
+\include cmake-find-package-core.qdocinc
+
+Unlike most other CMake commands provided by Qt, \c{qt_deploy_qt_conf()} can
+only be called from a deployment script. It cannot be called directly by the
+project.
+
+\cmakecommandsince 6.3
+\note This command does not usually need to be called directly. It is used
+ internally by other higher level commands, but projects wishing to
+ implement more customized deployment logic may find it useful.
+
+\section1 Synopsis
+
+\badcode
+qt_deploy_qt_conf(file_path
+ [PREFIX prefix]
+ [DOC_DIR doc_dir]
+ [HEADERS_DIR headers_dir]
+ [LIB_DIR lib_dir]
+ [LIBEXEC_DIR libexec_dir]
+ [BIN_DIR bin_dir]
+ [PLUGINS_DIR plugins_dir]
+ [QML_DIR qml_dir]
+ [ARCHDATA_DIR archdata_dir]
+ [DATA_DIR data_dir]
+ [TRANSLATIONS_DIR translations_dir]
+ [EXAMPLES_DIR examples_dir]
+ [TESTS_DIR test_dir]
+ [SETTINGS_DIR settings_dir]
+)
+\endcode
+
+\section1 Description
+
+Use this command when you need to generate a \l{Using qt.conf}{qt.conf} file
+during deployment. The default value of any path supported by \c{qt.conf} can
+be overridden with the corresponding \c{..._DIR} option. The command will only
+write a path to the generated \c{qt.conf} file if it differs from the default
+value.
+The default values can be found at \l{Overriding Paths}.
+
+The \c file_path argument expects an absolute path to the location where the
+\c qt.conf file should be written to. The \l{QT_DEPLOY_PREFIX} and \l{QT_DEPLOY_BIN_DIR}
+variables can be used to dynamically specify a path relative to the deployment binary directory,
+as shown in the example below. This helps avoid hard-coding an absolute path.
+
+\sa {qt6_generate_deploy_app_script}{qt_generate_deploy_app_script()},
+ {qt6_deploy_runtime_dependencies}{qt_deploy_runtime_dependencies()}
+
+\section1 Example
+
+\badcode
+# The following script must only be executed at install time
+qt_generate_deploy_script(
+ OUTPUT_SCRIPT deploy_script
+ CONTENT "
+qt_deploy_qt_conf(\"\${QT_DEPLOY_PREFIX}/\${QT_DEPLOY_BIN_DIR}/qt.conf\"
+ DATA_DIR \"./custom_data_dir\"
+ TRANSLATIONS_DIR \"./custom_translations_dir\"
+)
+")
+
+install(SCRIPT ${deploy_script})
+\endcode
+
+*/
diff --git a/src/corelib/doc/src/cmake/qt_deploy_runtime_dependencies.qdoc b/src/corelib/doc/src/cmake/qt_deploy_runtime_dependencies.qdoc
new file mode 100644
index 0000000000..f64960492a
--- /dev/null
+++ b/src/corelib/doc/src/cmake/qt_deploy_runtime_dependencies.qdoc
@@ -0,0 +1,198 @@
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
+
+/*!
+\page qt-deploy-runtime-dependencies.html
+\ingroup cmake-commands-qtcore
+
+\title qt_deploy_runtime_dependencies
+\keyword qt6_deploy_runtime_dependencies
+
+\summary {Deploy Qt plugins, Qt and non-Qt libraries needed by an executable.}
+
+\include cmake-find-package-core.qdocinc
+
+Unlike most other CMake commands provided by Qt, \c{qt_deploy_runtime_dependencies()}
+can only be called from a deployment script. It cannot be called directly by the
+project during the configure stage.
+
+\cmakecommandsince 6.3
+\note This command does not usually need to be called directly. It is used
+ internally by other higher level commands, but projects wishing to
+ implement more customized deployment logic may find it useful.
+
+\section1 Synopsis
+
+\badcode
+qt_deploy_runtime_dependencies(
+ EXECUTABLE executable
+ [ADDITIONAL_EXECUTABLES files...]
+ [ADDITIONAL_LIBRARIES files...]
+ [ADDITIONAL_MODULES files...]
+ [GENERATE_QT_CONF]
+ [BIN_DIR bin_dir]
+ [LIBEXEC_DIR libexec_dir]
+ [LIB_DIR lib_dir]
+ [PLUGINS_DIR plugins_dir]
+ [QML_DIR qml_dir]
+ [VERBOSE]
+ [NO_OVERWRITE]
+ [NO_APP_STORE_COMPLIANCE]
+ [NO_TRANSLATIONS]
+ [NO_COMPILER_RUNTIME]
+ [DEPLOY_TOOL_OPTIONS]
+ [PRE_INCLUDE_REGEXES regexes...]
+ [PRE_EXCLUDE_REGEXES regexes...]
+ [POST_INCLUDE_REGEXES regexes...]
+ [POST_EXCLUDE_REGEXES regexes...]
+ [POST_INCLUDE_FILES files...]
+ [POST_EXCLUDE_FILES files...]
+)
+\endcode
+
+\section1 Description
+
+When installing an application, it may be desirable to also install the
+libraries and plugins it depends on. When the application is a macOS app bundle
+or a Windows executable, \c{qt_deploy_runtime_dependencies()} can be called
+from an install-time script to deploy those dependencies. It will install
+non-system Qt libraries plus an appropriate set of Qt plugins.
+
+On Linux, the command will deploy additional libraries, beyond just those
+related to Qt, that are included with the project. However, when executed on
+macOS or Windows, the command will use either \c macdeployqt or \c windeployqt,
+which will only deploy libraries that are specific to Qt.
+
+This command only considers runtime dependencies for which linking
+relationships exist in the underlying binaries. It does not deploy QML modules,
+see \l{qt6_deploy_qml_imports}{qt_deploy_qml_imports()} for that.
+
+\section1 Arguments
+
+The \c{EXECUTABLE} option must be provided.
+
+The \c{executable} argument should be the path to the executable file in the
+build directory. For example, \c{${CMAKE_CURRENT_BINARY_DIR}/MyApp.exe}, or more
+dynamically \c{$<TARGET_FILE:MyApp>}. Specifying raw target names not wrapped in
+a generator expression like \c{<TARGET_FILE:>} is not supported.
+
+For macOS app bundles, the \c{executable} argument should be a path to the
+bundle directory, relative to the base install location.
+For example \c{MyApp.app}, or more dynamically
+\c{$<TARGET_FILE_NAME:MyApp>.app}.
+Specifying raw target names not wrapped in a generator epxression like
+\c{<TARGET_FILE_NAME:>} is not supported.
+
+It may also be desirable to install dependencies for other binaries related to
+the \c{executable}. For example, plugins provided by the project might have
+further dependencies, but because those plugins won't be linked directly to the
+executable, \c{qt_deploy_runtime_dependencies()} won't automatically discover
+them. The \c{ADDITIONAL_EXECUTABLES}, \c{ADDITIONAL_LIBRARIES}, and
+\c{ADDITIONAL_MODULES} options can be used to specify additional binaries
+whose dependencies should also be deployed (installing the named binaries
+themselves is still the project's responsibility). The naming of these keywords
+follows CMake's conventions, so Qt plugins would be specified using
+\c{ADDITIONAL_MODULES}.
+Each value should be a path relative to the base install location. The values
+can use generator expressions, same as with the \c{EXECUTABLE} option.
+Specifying raw target names not wrapped in a generator epxression like
+\c{<TARGET_FILE_NAME:>} is not supported.
+
+When installing a Windows application, it is common to need a
+\l{Using qt.conf}{qt.conf} file when following CMake's default install
+directory structure. If the \c{GENERATE_QT_CONF} option is given, an appropriate
+\c{qt.conf} file will be written to the same directory as the \c{executable}.
+The paths in that \c{qt.conf} file will be based on the \c{CMAKE_INSTALL_xxxDIR}
+variables, whose defaults are provided by CMake's \l{GNUInstallDirs} module.
+
+You can override some of those defaults with the parameters in the following
+table, all of which are expected to be relative to the base install location.
+
+\table
+\header
+ \li parameter
+ \li affected variable
+ \li notes
+\row
+ \li \c BIN_DIR
+ \li \l QT_DEPLOY_BIN_DIR
+ \li
+\row
+ \li \c LIBEXEC_DIR
+ \li \l QT_DEPLOY_LIBEXEC_DIR
+ \li since Qt 6.7
+\row
+ \li \c LIB_DIR
+ \li \l QT_DEPLOY_LIB_DIR
+ \li
+\row
+ \li \c PLUGINS_DIR
+ \li \l QT_DEPLOY_PLUGINS_DIR
+ \li
+\row
+ \li \c QML_DIR
+ \li \l QT_DEPLOY_QML_DIR
+ \li
+\endtable
+
+A \c{qt.conf} file is always written if \c{executable} is a macOS app bundle,
+regardless of whether or not \c{GENERATE_QT_CONF} is provided. The \c{..._DIR}
+options are also ignored in that case, since the directory layout of an app
+bundle is dictated by Apple's requirements.
+
+More verbose output about the deployment steps can be enabled by providing the
+\c{VERBOSE} option. Alternatively, the \l{QT_ENABLE_VERBOSE_DEPLOYMENT}
+variable can be set in the project before the first \c{find_package(Qt6)} call
+to make deployment output verbose by default.
+
+The \c{qt_deploy_runtime_dependencies()} command overwrites existing files by
+default (some warnings may still be issued). Use the \c{NO_OVERWRITE} option
+to prevent overwriting existing files. Note that this option currently only
+affects macOS and Windows deployments.
+
+By default, if \c{executable} is a macOS app bundle, only Qt plugins and Qt
+libraries that comply with Apple's app store requirements are deployed. The
+\c{NO_APP_STORE_COMPLIANCE} option can be given to disable that constraint.
+
+On platforms other than macOS, Qt translations are automatically deployed. To
+inhibit this behavior, specify \c{NO_TRANSLATIONS}. Use
+\l{qt6_deploy_translations}{qt_deploy_translations()} to deploy translations
+in a customized way.
+
+For Windows desktop applications, the required runtime files for the compiler
+are also installed by default. To prevent this, specify \c{NO_COMPILER_RUNTIME}.
+
+Since Qt 6.7, you can use \c{DEPLOY_TOOL_OPTIONS} to pass additional options to
+the underlying deployment tool. This only has an effect if the underlying
+deployment tool is either macdeployqt or windeployqt.
+
+On Linux, deploying runtime dependencies is based on CMake's
+\c{file(GET_RUNTIME_DEPENDENCIES)} command. The options \c{PRE_INCLUDE_REGEXES},
+\c{PRE_EXCLUDE_REGEXES}, \c{POST_INCLUDE_REGEXES}, \c{POST_EXCLUDE_REGEXES},
+\c{POST_INCLUDE_FILES}, and \c{POST_EXCLUDE_FILES} are only meaningful in this
+context and are forwarded unaltered to \c{file(GET_RUNTIME_DEPENDENCIES)}. See
+the documentation of that command for details.
+
+On Linux, runtime dependencies that are located in system library directories
+are not deployed by default. If \c{POST_EXCLUDE_REGEXES} is specified, this
+automatic exclusion is not performed.
+
+The default value of \c{POST_EXCLUDE_REGEXES} is constructed from the value of
+\l{QT_DEPLOY_IGNORED_LIB_DIRS}.
+
+\sa {qt6_generate_deploy_app_script}{qt_generate_deploy_app_script()},
+ {qt6_deploy_qt_conf}{qt_deploy_qt_conf()},
+ {qt6_deploy_qml_imports}{qt_deploy_qml_imports()}
+
+\section1 Example
+
+The following example shows how to deploy an application \c{MyApp}.
+
+\include cmake-deploy-runtime-dependencies.qdocinc
+
+The following example shows how to use the \c{DEPLOY_TOOL_OPTIONS} parameter to
+pass different options to macdeployqt and windeployqt.
+
+\include cmake-deploy-runtime-dependencies-deploy-tool-options.qdocinc
+
+*/
diff --git a/src/corelib/doc/src/cmake/qt_deploy_translations.qdoc b/src/corelib/doc/src/cmake/qt_deploy_translations.qdoc
new file mode 100644
index 0000000000..43ff23a35a
--- /dev/null
+++ b/src/corelib/doc/src/cmake/qt_deploy_translations.qdoc
@@ -0,0 +1,76 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
+
+/*!
+\page qt-deploy-translations.html
+\ingroup cmake-commands-qtcore
+
+\title qt_deploy_translations
+\keyword qt6_deploy_translations
+
+\summary {Deploy Qt translations needed by an executable.}
+
+\include cmake-find-package-core.qdocinc
+
+Unlike most other CMake commands provided by Qt, \c{qt_deploy_translations()}
+can only be called from a deployment script. It cannot be called directly by the
+project during the configure stage.
+
+\cmakecommandsince 6.5
+\preliminarycmakecommand
+\note This command does not usually need to be called directly. It is used
+ internally by other higher level commands, but projects wishing to
+ implement more customized deployment logic may find it useful.
+
+\section1 Synopsis
+
+\badcode
+qt_deploy_translations(
+ [CATALOGS catalogs]
+ [LOCALES locales]
+ [LCONVERT lconvert_executable]
+ [VERBOSE]
+)
+\endcode
+
+\section1 Description
+
+When installing an application, it may be desirable to also install the
+translations that belong to the used Qt modules. The \c qt_deploy_translations
+command collects the necessary \c{.qm} file from the Qt installation and
+compiles them into one \c{qt_${language}.qm} file per language. The \c{.qm}
+files are installed into \c{QT_DEPLOY_TRANSLATIONS_DIR}.
+
+\section1 Arguments
+
+The \c LOCALES argument specifies for which locales translations should be
+deployed. This is a list of language/region combinations as described in
+\l{Changing the Target Locale}{Qt Linguist's manual for translators}. Examples
+for valid locales are: \c{de}, \c{pl}, or \c{pt_BR}.
+
+If \c LOCALES is omitted, then all available locales are deployed.
+
+The \c CATALOGS argument specifies a list of \l{Available
+Catalogs}{translation catalogs} to be deployed. If this argument is
+omitted, then all catalogs are deployed that belong to any Qt module
+that is used in the project via \c{find_package}.
+
+The \c LCONVERT argument specifies the \c lconvert executable that is used to
+combine the catalogs. By default, the Qt installation's \c lconvert is used.
+
+For debugging purposes, the \c VERBOSE argument can be set to turn on diagnostic
+messages.
+
+\sa QT_DEPLOY_TRANSLATIONS_DIR
+
+\section1 Example
+
+The following example deploys Danish and German translations of the Qt
+libraries.
+
+\badcode
+qt_deploy_translations(
+ LOCALES da de
+)
+\endcode
+*/
diff --git a/src/corelib/doc/src/cmake/qt_disable_unicode_defines.qdoc b/src/corelib/doc/src/cmake/qt_disable_unicode_defines.qdoc
index 956a272d6f..91de52544e 100644
--- a/src/corelib/doc/src/cmake/qt_disable_unicode_defines.qdoc
+++ b/src/corelib/doc/src/cmake/qt_disable_unicode_defines.qdoc
@@ -1,41 +1,19 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
-\page qt_disable_unicode_defines.html
+\page qt-disable-unicode-defines.html
\ingroup cmake-commands-qtcore
\title qt_disable_unicode_defines
-\target qt6_disable_unicode_defines
+\keyword qt6_disable_unicode_defines
\summary {Prevents some unicode-related compiler definitions being set automatically on a target.}
\include cmake-find-package-core.qdocinc
+\cmakecommandsince 6.2
+
\section1 Synopsis
\badcode
diff --git a/src/corelib/doc/src/cmake/qt_extract_metatypes.qdoc b/src/corelib/doc/src/cmake/qt_extract_metatypes.qdoc
index ccc81bdd2b..7ec8d90f9b 100644
--- a/src/corelib/doc/src/cmake/qt_extract_metatypes.qdoc
+++ b/src/corelib/doc/src/cmake/qt_extract_metatypes.qdoc
@@ -1,39 +1,16 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
-\page qt_extract_metatypes.html
-\ingroup cmake-macros-qtcore
+\page qt-extract-metatypes.html
+\ingroup cmake-commands-qtcore
\title qt_extract_metatypes
-\target qt6_extract_metatypes
+\keyword qt6_extract_metatypes
\summary {Extracts metatypes from a Qt target and generates an associated metatypes.json file.}
+\cmakecommandsince 6.0
\preliminarycmakecommand
\section1 Synopsis
@@ -75,4 +52,18 @@ example, to pass it to another command or to install it), use the
\c OUTPUT_FILES option to provide the name of a variable in which to store its
absolute path.
+\section1 Automatic metatype extraction
+
+Since Qt 6.8, if you have not disabled \c{AUTOMOC} and either are using CMake
+3.19 or later or are calling \l{qt6_finalize_target}{qt_finalize_target()}
+manually, then \c{qt_extract_metatypes()} is automatically called as part of the
+finalization step for \l{qt_add_library}. This has no effect if you have
+manually called \c{qt_extract_metatypes()} before the finalization, possibly
+with custom arguments. However, it does make sure that the metatypes are also
+produced if you haven't. This is important if any of the types in the library
+are used as part of any QML types any time in the future and has no downsides.
+
+Furthermore, \l{qt_add_qml_module} automatically invokes
+\c{qt_extract_metatypes()} for its target.
+
*/
diff --git a/src/corelib/doc/src/cmake/qt_finalize_project.qdoc b/src/corelib/doc/src/cmake/qt_finalize_project.qdoc
new file mode 100644
index 0000000000..5506712691
--- /dev/null
+++ b/src/corelib/doc/src/cmake/qt_finalize_project.qdoc
@@ -0,0 +1,53 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
+
+/*!
+\page qt-finalize-project.html
+\ingroup cmake-commands-qtcore
+
+\title qt_finalize_project
+\keyword qt6_finalize_project
+
+\summary {Handles various common platform-specific tasks associated with a Qt project.}
+\preliminarycmakecommand
+
+\include cmake-find-package-core.qdocinc
+
+\cmakecommandsince 6.3
+
+\section1 Synopsis
+
+\badcode
+qt_finalize_project()
+\endcode
+
+\versionlessCMakeCommandsNote qt6_finalize_project()
+
+\section1 Description
+
+Some targets that are created using Qt commands require additional actions
+at the end of CMake configuring phase.
+Depending on the platform, the function typically:
+\list
+ \li Walks the build tree.
+ \li Resolves dependencies.
+ \li Applies any extra deployment steps.
+\endlist
+
+With CMake version 3.19 or later, you don't need to call this command since
+it consists of sub-commands that are ordinarily invoked at the end of
+\c CMAKE_SOURCE_DIR directory scope processing.
+
+\include cmake-android-qt-finalize-project-warning.qdocinc warning
+
+\section2 Examples
+
+For projects that use a CMake version lower than 3.19, you need to call
+\c qt_finalize_project manually. This example shows the typical use of the
+function:
+
+\snippet cmake-macros/examples.cmake qt_finalize_project_manual
+
+\sa {cmake-variable-QT_NO_COLLECT_BUILD_TREE_APK_DEPS}{QT_NO_COLLECT_BUILD_TREE_APK_DEPS}
+\sa {cmake-variable-QT_NO_COLLECT_IMPORTED_TARGET_APK_DEPS}{QT_NO_COLLECT_IMPORTED_TARGET_APK_DEPS}
+*/
diff --git a/src/corelib/doc/src/cmake/qt_finalize_target.qdoc b/src/corelib/doc/src/cmake/qt_finalize_target.qdoc
index eb3e7a479b..b74dee64d2 100644
--- a/src/corelib/doc/src/cmake/qt_finalize_target.qdoc
+++ b/src/corelib/doc/src/cmake/qt_finalize_target.qdoc
@@ -1,41 +1,19 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
-\page qt_finalize_target.html
+\page qt-finalize-target.html
\ingroup cmake-commands-qtcore
\title qt_finalize_target
-\target qt6_finalize_target
+\keyword qt6_finalize_target
\summary {Handles various common platform-specific tasks associated with Qt targets.}
\include cmake-find-package-core.qdocinc
+\cmakecommandsince 6.2
+
\section1 Synopsis
\badcode
@@ -54,10 +32,10 @@ was created, so this command should also be called from that same directory
scope.
This command is ordinarily invoked as part of a call to
-\l{qt6_add_executable}{qt_add_executable()} or
-\l{qt6_add_library}{qt_add_library()}. The timing of when that call takes
-place and when it might need to be called explicitly by a project is discussed
-in the documentation of those commands.
+\l{qt6_add_executable}{qt_add_executable()},
+\l{qt6_add_library}{qt_add_library()}, or \l{qt6_add_plugin}{qt_add_plugin()}.
+The timing of when that call takes place and when a project might need to call
+it explicitly, is discussed in the documentation of those commands.
\sa {qt6_set_finalizer_mode}{qt_set_finalizer_mode()}
@@ -83,7 +61,7 @@ CMake version earlier than 3.21.
\section2 WASM
Create \c{${target}.html} (a target-specific \c{wasm_shell.html} file),
-\c{qtloader.js} and \c{qtlogo.svg} files in the \c{CMAKE_CURRENT_BINARY_DIR}.
+\c{qtloader.js}, and \c{qtlogo.svg} files in the \c{CMAKE_CURRENT_BINARY_DIR}.
\section2 iOS
diff --git a/src/corelib/doc/src/cmake/qt_generate_deploy_app_script.qdoc b/src/corelib/doc/src/cmake/qt_generate_deploy_app_script.qdoc
new file mode 100644
index 0000000000..31d9e4384b
--- /dev/null
+++ b/src/corelib/doc/src/cmake/qt_generate_deploy_app_script.qdoc
@@ -0,0 +1,110 @@
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
+
+/*!
+\page qt-generate-deploy-app-script.html
+\ingroup cmake-commands-qtcore
+
+\title qt_generate_deploy_app_script
+\keyword qt6_generate_deploy_app_script
+
+\summary {Generate a deployment script for an application.}
+
+\include cmake-find-package-core.qdocinc
+
+\cmakecommandsince 6.3
+\note This command is currently only supported on Windows, macOS, and Linux.
+
+\section1 Synopsis
+
+\badcode
+qt_generate_deploy_app_script(
+ TARGET target
+ OUTPUT_SCRIPT <var>
+ [NO_TRANSLATIONS]
+ [NO_COMPILER_RUNTIME]
+ [NO_UNSUPPORTED_PLATFORM_ERROR]
+ [DEPLOY_TOOL_OPTIONS ...]
+ [PRE_INCLUDE_REGEXES regexes...]
+ [PRE_EXCLUDE_REGEXES regexes...]
+ [POST_INCLUDE_REGEXES regexes...]
+ [POST_EXCLUDE_REGEXES regexes...]
+ [POST_INCLUDE_FILES files...]
+ [POST_EXCLUDE_FILES files...]
+)
+\endcode
+
+\versionlessCMakeCommandsNote qt6_generate_deploy_app_script()
+
+\section1 Description
+
+Installing an executable target with \l{install(TARGETS)} only installs the
+target's executable (except for macOS app bundles, which will copy the whole
+bundle). You need to explicitly install any other libraries or plugins the
+executable depends on yourself. \c{qt_generate_deploy_app_script()} is a
+convenience command intended to simplify that process. It expects the
+application to follow Qt's recommended install directory structure fairly
+closely. That structure is based on CMake's default install layout, as
+determined by \l{GNUInstallDirs} (except for macOS app bundles, which follow
+Apple's requirements instead).
+
+The command generates a script whose name will be stored in the variable named
+by the \c{OUTPUT_SCRIPT} option. That script is only written at CMake
+generation time. It is intended to be used with the \l{install(SCRIPT)} command,
+which should come after the application's target has been installed using
+\l{install(TARGETS)}.
+
+The deployment script will call \l{qt6_deploy_runtime_dependencies}
+{qt_deploy_runtime_dependencies()} with a suitable set of options for the standard
+install layout. Currently, this is only implemented for
+\list
+ \li macOS app bundles built on a macOS host,
+ \li Linux executables built on a Linux host,
+ \li and Windows executables built on a Windows host.
+\endlist
+Cross-building a Windows executable on a Linux host, as well as similar
+scenarios, are not currently supported.
+Calling \c{qt_generate_deploy_app_script()} in such a case will result
+in a fatal error, unless the \c{NO_UNSUPPORTED_PLATFORM_ERROR} option is given.
+
+On platforms other than macOS, Qt translations are automatically deployed. To
+inhibit this behavior, specify \c{NO_TRANSLATIONS}. Use
+\l{qt6_deploy_translations}{qt_deploy_translations()} to deploy translations in a
+customized way.
+
+For Windows desktop applications, the required runtime files for the compiler
+are also installed by default. To prevent this, specify \c{NO_COMPILER_RUNTIME}.
+
+Since Qt 6.7, you can use \c{DEPLOY_TOOL_OPTIONS} to pass additional options to
+the underlying deployment tool. This only has an effect if the underlying
+deployment tool is either macdeployqt or windeployqt.
+
+For deploying a QML application, use
+\l{qt6_generate_deploy_qml_app_script}{qt_generate_deploy_qml_app_script()}
+instead.
+
+For generating a custom deployment script, use
+\l{qt6_generate_deploy_script}{qt_generate_deploy_script}.
+
+The options \c{PRE_INCLUDE_REGEXES}, \c{PRE_EXCLUDE_REGEXES},
+\c{POST_INCLUDE_REGEXES}, \c{POST_EXCLUDE_REGEXES}, \c{POST_INCLUDE_FILES}, and
+\c{POST_EXCLUDE_FILES} can be specified to control the deployment of runtime
+dependencies. These options do not apply to all platforms and are forwarded
+unmodified to \l{qt6_deploy_runtime_dependencies}{qt_deploy_runtime_dependencies()}.
+
+\sa {qt6_standard_project_setup}{qt_standard_project_setup()},
+ {qt6_generate_deploy_script}{qt_generate_deploy_script()},
+ {qt6_generate_deploy_qml_app_script}{qt_generate_deploy_qml_app_script()}
+
+\section1 Example
+
+The following example shows how to deploy an application \c{MyApp}.
+
+\include cmake-generate-deploy-app-script.qdocinc
+
+The following example shows how to use the \c{DEPLOY_TOOL_OPTIONS} parameter to
+pass different options to macdeployqt and windeployqt.
+
+\include cmake-generate-deploy-app-script-deploy-tool-options.qdocinc
+
+*/
diff --git a/src/corelib/doc/src/cmake/qt_generate_deploy_script.qdoc b/src/corelib/doc/src/cmake/qt_generate_deploy_script.qdoc
new file mode 100644
index 0000000000..eb8ed402a9
--- /dev/null
+++ b/src/corelib/doc/src/cmake/qt_generate_deploy_script.qdoc
@@ -0,0 +1,65 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
+
+/*!
+\page qt-generate-deploy-script.html
+\ingroup cmake-commands-qtcore
+
+\title qt_generate_deploy_script
+\keyword qt6_generate_deploy_script
+
+\summary {Generate a custom deployment script.}
+
+\include cmake-find-package-core.qdocinc
+
+\cmakecommandsince 6.5
+
+\section1 Synopsis
+
+\badcode
+qt_generate_deploy_script(
+ OUTPUT_SCRIPT <var>
+ [TARGET target]
+ [NAME script_name]
+ [CONTENT content]
+)
+\endcode
+
+\versionlessCMakeCommandsNote qt6_generate_deploy_script()
+
+\section1 Description
+
+The command generates a script whose full file path will be stored in the
+variable named by the \c{OUTPUT_SCRIPT} option. That script is only written
+at CMake generation time. It is intended to be used with the \l{install(SCRIPT)}
+command, which should come after the application's target has been installed
+using \l{install(TARGETS)}.
+
+The command takes care of generating a file named suitably for multi-config
+generators. Necessary includes are added such that Qt's CMake deployment
+functions and variables are accessible.
+
+The \c TARGET argument specifies the target that will be deployed by the script.
+This affects the file name of the generated script, unless \c NAME is specified.
+
+The \c NAME argument controls an identifiable portion within the deployment
+script's automatically generated name. The \c NAME argument defaults to \c
+custom if neither \c NAME nor \c TARGET are given.
+
+The \c CONTENT argument specifies the code that is written to the deployment
+script. The content may contain generator expressions.
+
+This command is intended for generating custom deployment scripts that
+directly call functions of Qt's deployment API. For less complex
+deployment purposes, it is more convenient to use
+\l{qt6_generate_deploy_app_script}{qt_generate_deploy_app_script()} or
+\l{qt6_generate_deploy_qml_app_script}{qt_generate_deploy_qml_app_script()}.
+
+\sa {qt6_generate_deploy_app_script}{qt_generate_deploy_app_script()},
+ {qt6_generate_deploy_qml_app_script}{qt_generate_deploy_qml_app_script()}
+
+\section1 Example
+
+\snippet cmake-macros/deployment.cmake qt_generate_deploy_script_example
+
+*/
diff --git a/src/corelib/doc/src/cmake/qt_generate_moc.qdoc b/src/corelib/doc/src/cmake/qt_generate_moc.qdoc
index c51001e3eb..9b123f9323 100644
--- a/src/corelib/doc/src/cmake/qt_generate_moc.qdoc
+++ b/src/corelib/doc/src/cmake/qt_generate_moc.qdoc
@@ -1,41 +1,19 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
-\page qt_generate_moc.html
+\page qt-generate-moc.html
\ingroup cmake-commands-qtcore
\title qt_generate_moc
-\target qt6_generate_moc
+\keyword qt6_generate_moc
\summary {Calls moc on an input file.}
\include cmake-find-package-core.qdocinc
+\cmakecommandsince 5.0
+
\section1 Synopsis
\badcode
diff --git a/src/corelib/doc/src/cmake/qt_import_plugins.qdoc b/src/corelib/doc/src/cmake/qt_import_plugins.qdoc
index 98e81bfeff..1f81a21cd2 100644
--- a/src/corelib/doc/src/cmake/qt_import_plugins.qdoc
+++ b/src/corelib/doc/src/cmake/qt_import_plugins.qdoc
@@ -1,41 +1,19 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
-\page qt_import_plugins.html
+\page qt-import-plugins.html
\ingroup cmake-commands-qtcore
\title qt_import_plugins
-\target qt6_import_plugins
+\keyword qt6_import_plugins
-\summary {Specifies a custom set of plugins to import for a static Qt build.}
+\summary {Specifies a custom set of plugins to import or exclude.}
\include cmake-find-package-core.qdocinc
+\cmakecommandsince 5.14
+
\section1 Synopsis
\badcode
@@ -70,17 +48,35 @@ can be used more than once.
Qt provides plugin types such as \c imageformats, \c platforms,
and \c sqldrivers.
+\section2 Dynamic plugins
+
+If plugins are dynamic libraries, the function controls the plugin deployment.
+Using this function, you may exclude specific plugin types from
+being packaged into an Android APK, for example:
+
+\badcode
+qt_add_executable(MyApp ...)
+...
+qt_import_plugins(MyApp EXCLUDE_BY_TYPE imageformats)
+\endcode
+
+In the snippet above, all plugins that have the \c imageformats type will
+be excluded when deploying \c MyApp. The resulting Android APK will not
+contain any of the \c imageformats plugins.
+
+If the command isn't used, the target automatically deploys all plugins that
+belong to the Qt modules that the target is linked against.
+
+\section2 Static plugins
+
If the command isn't used the target automatically links against
-a sane set of default plugins, for each Qt module that the target is linked
-against. For more information, see
+a sane set of default static plugins, for each Qt module that the target is
+linked against. For more information, see
\l{CMake target_link_libraries Documentation}{target_link_libraries}.
Each plugin comes with a C++ stub file that automatically
-initializes the plugin. Consequently, any target that links against a plugin
-has this C++ file added to its \c SOURCES.
-
-\note This command imports plugins from static Qt builds only.
-On shared builds, it does nothing.
+initializes the static plugin. Consequently, any target that links against
+a plugin has this C++ file added to its \c SOURCES.
\section1 Examples
diff --git a/src/corelib/doc/src/cmake/qt_policy.qdoc b/src/corelib/doc/src/cmake/qt_policy.qdoc
new file mode 100644
index 0000000000..6deb7a729c
--- /dev/null
+++ b/src/corelib/doc/src/cmake/qt_policy.qdoc
@@ -0,0 +1,65 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
+
+/*!
+\page qt-policy.html
+\ingroup cmake-commands-qtcore
+
+\title qt_policy
+\keyword qt6_policy
+
+\summary {Modify the default behavior of Qt's CMake API.}
+
+\include cmake-find-package-core.qdocinc
+
+\cmakecommandsince 6.5
+
+\section1 Synopsis
+
+\badcode
+qt_policy(
+ [SET <policy_name> behavior]
+ [GET <policy_name> <variable>]
+)
+\endcode
+
+\versionlessCMakeCommandsNote qt6_policy()
+
+\section1 Description
+
+This command has two modes:
+
+\list
+\li When the \c{SET} keyword is used, this command can be used to opt in to
+ behavior changes in Qt's CMake API, or to explicitly opt out of them.
+\li When the \c{GET} keyword is used, \c{<variable>} is set to the current
+ behavior for the policy, i.e. \c OLD or \c NEW.
+\endlist
+
+\c{<policy_name>} must be the name of one of the \l{Qt CMake policies}.
+Policy names have the form of \c{QTP<NNNN>} where <NNNN> is
+an integer specifying the index of the policy. Using an invalid policy
+name results in an error.
+
+Code supporting older Qt versions can check the existence of a policy by
+checking the value of the \c{QT_KNOWN_POLICY_<policy_name>} variable before
+getting the value of \c <policy_name> or setting its behavior.
+
+\badcode
+if(QT_KNOWN_POLICY_<policy_name>)
+ qt_policy(SET <policy_name> NEW)
+endif()
+\endcode
+
+You can set \c behavior to one of the following options:
+
+\list
+\li \c{NEW} to opt into the new behavior
+\li \c{OLD} to explicitly opt-out of it
+\endlist
+
+\qtpolicydeprecatedbehavior
+
+\sa qt_standard_project_setup
+
+*/
diff --git a/src/corelib/doc/src/cmake/qt_set_finalizer_mode.qdoc b/src/corelib/doc/src/cmake/qt_set_finalizer_mode.qdoc
index 2210e86fa6..28622c11e8 100644
--- a/src/corelib/doc/src/cmake/qt_set_finalizer_mode.qdoc
+++ b/src/corelib/doc/src/cmake/qt_set_finalizer_mode.qdoc
@@ -1,39 +1,16 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
-\page qt_set_finalizer_mode.html
-\ingroup cmake-macros-qtcore
+\page qt-set-finalizer-mode.html
+\ingroup cmake-commands-qtcore
\title qt_set_finalizer_mode
-\target qt6_set_finalizer_mode
+\keyword qt6_set_finalizer_mode
\summary {Customizes aspects of a target's finalization.}
+\cmakecommandsince 6.2
\preliminarycmakecommand
\section1 Synopsis
diff --git a/src/corelib/doc/src/cmake/qt_standard_project_setup.qdoc b/src/corelib/doc/src/cmake/qt_standard_project_setup.qdoc
new file mode 100644
index 0000000000..59b33f599c
--- /dev/null
+++ b/src/corelib/doc/src/cmake/qt_standard_project_setup.qdoc
@@ -0,0 +1,101 @@
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
+
+/*!
+\page qt-standard-project-setup.html
+\ingroup cmake-commands-qtcore
+
+\title qt_standard_project_setup
+\keyword qt6_standard_project_setup
+
+\summary {Setup project-wide defaults to a standard arrangement.}
+
+\include cmake-find-package-core.qdocinc
+
+\cmakecommandsince 6.3
+
+\section1 Synopsis
+
+\badcode
+qt_standard_project_setup(
+ [REQUIRES <version>]
+ [SUPPORTS_UP_TO <version>]
+ [I18N_TRANSLATED_LANGUAGES <language...>]
+ [I18N_SOURCE_LANGUAGE <language>]
+)
+\endcode
+
+\versionlessCMakeCommandsNote qt6_standard_project_setup()
+
+\section1 Description
+
+This command simplifies the task of setting up a typical Qt application.
+It would usually be called immediately after the first \c{find_package(Qt6)}
+call, normally in the top level \c{CMakeLists.txt} file and before any targets
+have been defined. It does the following things:
+
+\list
+\li The standard CMake variables \c{CMAKE_AUTOMOC} and \c{CMAKE_AUTOUIC}
+ are set to true if they are not already defined.
+ This enables all Qt-related autogen features by default for subsequently
+ created targets in the current directory scope and below.
+\li CMake's \l{GNUInstallDirs} module is automatically included. This defines
+ appropriate defaults for variables like \c{CMAKE_INSTALL_BINDIR},
+ \c{CMAKE_INSTALL_LIBDIR}, and so on.
+\li When targeting Windows, if the \c{CMAKE_RUNTIME_OUTPUT_DIRECTORY} variable
+ is not already set, it will be set to
+ \c{${CMAKE_CURRENT_BINARY_DIR}}.
+\li When target platforms other than Apple or Windows, \c{CMAKE_INSTALL_RPATH}
+ will be augmented as described below.
+\li CMake's \l USE_FOLDERS property is set to \c{ON}, and \l QT_TARGETS_FOLDER is
+ set to \c{QtInternalTargets}. IDEs that support folders will display
+ Qt-internal targets in this folder.
+\endlist
+
+Since Qt 6.5, it is possible to change the default behavior of Qt's CMake
+API by opting in to changes from newer Qt versions. If \c{REQUIRES} is
+specified, all suggested changes introduced in Qt up to \c{REQUIRES} are enabled,
+and using an older Qt version will result in an error.
+If additionally \c{SUPPORTS_UP_TO} has been specified, any new changes introduced
+in versions up to \c{SUPPORTS_UP_TO} are also enabled (but using an older Qt
+version is not an error). This is similar to CMake's policy concept
+(compare \l{cmake_policy}).
+
+On platforms that support \c{RPATH} (other than Apple platforms), two values
+are appended to the \c{CMAKE_INSTALL_RPATH} variable by this command.
+\c{$ORIGIN} is appended so that libraries will find other libraries they depend
+on in the same directory as themselves. \c{$ORIGIN/<reldir>} is also appended,
+where \c{<reldir>} is the relative path from \c{CMAKE_INSTALL_BINDIR} to
+\c{CMAKE_INSTALL_LIBDIR}. This allows executables installed to
+\c{CMAKE_INSTALL_BINDIR} to find any libraries they may depend on installed to
+\c{CMAKE_INSTALL_LIBDIR}. Any duplicates in \c{CMAKE_INSTALL_RPATH} are
+removed. In practice, these two values ensure that executables and libraries
+will find their link-time dependencies, assuming projects install them to the
+default locations the \l{install(TARGETS)} command uses when no destination is
+explicitly provided.
+
+To disable folder support for IDEs, set \l USE_FOLDERS to \c OFF before or after
+the call to \c{qt_standard_project_setup}.
+
+The \c{qt_standard_project_setup()} command can effectively be disabled by
+setting the \l{QT_NO_STANDARD_PROJECT_SETUP} variable to true.
+
+\sa {qt6_generate_deploy_app_script}{qt_generate_deploy_app_script()}
+\sa qt_policy
+
+\section1 Internationalization
+
+Since Qt 6.7, it is possible to specify the languages that are used for project
+internationalization with the \c I18N_TRANSLATED_LANGUAGES argument. See \l
+QT_I18N_TRANSLATED_LANGUAGES for details.
+
+Use I18N_SOURCE_LANGUAGE to specify the language that translatable strings are
+written in. By default, \c en is used. See \l QT_I18N_SOURCE_LANGUAGE for
+details.
+
+\section1 Example
+
+\include cmake-generate-deploy-app-script.qdocinc
+
+\sa {Automatic Determination of .ts File Paths}{qt_add_translations()}
+*/
diff --git a/src/corelib/doc/src/cmake/qt_wrap_cpp.qdoc b/src/corelib/doc/src/cmake/qt_wrap_cpp.qdoc
index f1731ed825..3b298a9d7e 100644
--- a/src/corelib/doc/src/cmake/qt_wrap_cpp.qdoc
+++ b/src/corelib/doc/src/cmake/qt_wrap_cpp.qdoc
@@ -1,41 +1,19 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
-\page qt_wrap_cpp.html
+\page qt-wrap-cpp.html
\ingroup cmake-commands-qtcore
\title qt_wrap_cpp
-\target qt6_wrap_cpp
+\keyword qt6_wrap_cpp
\summary {Creates .moc files from sources.}
\include cmake-find-package-core.qdocinc
+\cmakecommandsince 5.0
+
\section1 Synopsis
\badcode
@@ -62,9 +40,23 @@ You can set an explicit \c{TARGET}. This will make sure that the target
properties \c{INCLUDE_DIRECTORIES} and \c{COMPILE_DEFINITIONS} are also used
when scanning the source files with \c{moc}.
+Since Qt 6.8, when a source file is passed to \c{qt_wrap_cpp} instead of a
+header file to generate a \c{.moc} file for a target, the \c{TARGET} parameter
+is needed to set the correct include path for the generated \c{.moc} file in
+the source file. As generated \c{.moc} files are added to the target's
+sources by \c{qt_wrap_cpp}, they are not added to \c{<VAR>}.
+
You can set additional \c{OPTIONS} that should be added to the \c{moc} calls.
You can find possible options in the \l{moc}{moc documentation}.
+The \c{OPTIONS} can evaluate generator expressions when \c{TARGET} is set.
+\note If the \c{OPTIONS} include both generator expressions and special
+characters, use variables to implement them. For example, use \c{$<ANGLE-R>},
+\c{$<COMMA>} and \c{$<SEMICOLON>} instead of \c{>}, \c{,} and \c{:}. Otherwise,
+the generator expression will not be evaluated correctly. \c {OPTIONS} are
+wrapped in generator expressions, so you must escape special characters in
+them.
+
\c{DEPENDS} allows you to add additional dependencies for recreation of the
generated files. This is useful when the sources have implicit dependencies,
like code for a Qt plugin that includes a \c{.json} file using the
@@ -72,5 +64,27 @@ Q_PLUGIN_METADATA() macro.
\section1 Examples
-\snippet cmake-macros/examples.cmake qt_wrap_cpp
+\snippet cmake-macros/examples.cmake qt_wrap_cpp_1
+
+In the following example, the generator expressions passed to \c{OPTIONS}
+will be evaluated since \c{TARGET} is set. The argument is specified this way to
+avoid syntax errors in the generator expressions.
+
+\snippet cmake-macros/examples.cmake qt_wrap_cpp_2
+
+The following example uses \l{https://cmake.org/cmake/help/latest/command/target_compile_definitions.html}{target_compile_definitions}
+to set \l{https://cmake.org/cmake/help/latest/prop_tgt/COMPILE_DEFINITIONS.html}{COMPILE_DEFINITIONS} which will be added to
+\c{OPTIONS}.
+
+\snippet cmake-macros/examples.cmake qt_wrap_cpp_4
+
+\snippet cmake-macros/examples.cpp qt_wrap_cpp_4
+
+In the above file, \c{myapp.moc} is included in \c{myapp.cpp}.
+To generate the \c{myapp.moc} file, the \c{qt_wrap_cpp} macro is used with the
+\c{TARGET} parameter. The first parameter is empty because the \c{.moc} file
+and its path will be added to the target's sources and include directories by
+the \c{qt_wrap_cpp} macro.
+
+\snippet cmake-macros/examples.cmake qt_wrap_cpp_4
*/
diff --git a/src/corelib/doc/src/containers.qdoc b/src/corelib/doc/src/containers.qdoc
index 1050223791..847be1bff6 100644
--- a/src/corelib/doc/src/containers.qdoc
+++ b/src/corelib/doc/src/containers.qdoc
@@ -1,29 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
\page containers.html
@@ -63,7 +39,8 @@
\note Since Qt 5.14, range constructors are available for most of the
container classes. QMultiMap is a notable exception. Their use is
- encouraged in place of the various from/to methods. For example:
+ encouraged to replace of the various deprecated from/to methods of Qt 5.
+ For example:
\snippet code/doc_src_containers.cpp 25
@@ -215,7 +192,30 @@
the C++ language doesn't specify any initialization; in those
cases, Qt's containers automatically initialize the value to 0.
- \section1 The Iterator Classes
+ \section1 Iterating over Containers
+
+ \section2 Range-based for
+
+ Range-based \c for should preferably be used for containers:
+
+ \snippet code/doc_src_containers.cpp range_for
+
+ Note that when using a Qt container in a non-const context,
+ \l{implicit sharing} may perform an undesired detach of the container.
+ To prevent this, use \c std::as_const():
+
+ \snippet code/doc_src_containers.cpp range_for_as_const
+
+ For associative containers, this will loop over the values.
+
+ \section2 Index-based
+
+ For sequential containers that store their items contiguously in memory
+ (for example, QList), index-based iteration can be used:
+
+ \snippet code/doc_src_containers.cpp index
+
+ \section2 The Iterator Classes
Iterators provide a uniform means to access items in a container.
Qt's container classes provide two types of iterators: STL-style
@@ -224,7 +224,7 @@
from \l{Implicit Sharing}{implicitly shared copies} due to a call
to a non-const member function.
- \section2 STL-Style Iterators
+ \section3 STL-Style Iterators
STL-style iterators have been available since the release of Qt
2.0. They are compatible with Qt's and STL's \l{generic
@@ -286,12 +286,10 @@
In the code snippets so far, we used the unary \c * operator to
retrieve the item (of type QString) stored at a certain iterator
- position, and we then called QString::toLower() on it. Most C++
- compilers also allow us to write \c{i->toLower()}, but some
- don't.
+ position, and we then called QString::toLower() on it.
- For read-only access, you can use const_iterator, \l{QList::constBegin}{constBegin()},
- and \l{QList::constEnd()}{constEnd()}. For example:
+ For read-only access, you can use const_iterator, \l{QList::cbegin}{cbegin()},
+ and \l{QList::cend()}{cend()}. For example:
\snippet code/doc_src_containers.cpp 12
@@ -339,7 +337,7 @@
This problem doesn't occur with functions that return a const or
non-const reference to a container.
- \section3 Implicit sharing iterator problem
+ \section4 Implicit sharing iterator problem
\l{Implicit sharing} has another consequence on STL-style
iterators: you should avoid copying a container while
@@ -352,32 +350,11 @@
The above example only shows a problem with QList, but
the problem exists for all the implicitly shared Qt containers.
- \section2 Java-Style Iterators
- \l{java-style-iterators}{Java-Style iterators} were introduced in Qt 4. Their API is modelled
+ \section3 Java-Style Iterators
+ \l{java-style-iterators}{Java-Style iterators}
+ are modelled
on Java's iterator classes.
- New code should should prefer \l{STL-Style Iterators}.
-
- \section1 Container keywords
-
- \target foreach
- \section2 The foreach Keyword
- \l{foreach-keyword}{The foreach keyword} is discouraged, new code should
- prefer C++11 range-based loops.
-
- \target forever
- \section2 The forever keyword.
- In addition to \c foreach, Qt also provides a \c forever
- pseudo-keyword for infinite loops:
-
- \snippet code/doc_src_containers.cpp 21
-
- If you're worried about namespace pollution, you can disable
- these macros by adding the following line to your \c .pro file:
-
- \snippet code/doc_src_containers.cpp 22
-
- \note The alternative macros Q_FOREACH and Q_FOREVER remain defined
- regardless.
+ New code should prefer \l{STL-Style Iterators}.
\section1 Qt containers compared with std containers
@@ -407,26 +384,26 @@
\li Similar to std::queue<T>, inherits from \l{QList}.
\row \li \l{QSet}<T>
- \li Similar to std::set<T>. Internally, \l{QSet} is implemented with a
+ \li Similar to std::unordered_set<T>. Internally, \l{QSet} is implemented with a
\l{QHash}.
\row \li \l{QMap}<Key, T>
- \li Similar to std::map<T>.
+ \li Similar to std::map<Key, T>.
\row \li \l{QMultiMap}<Key, T>
- \li Similar to std::multimap<T>.
+ \li Similar to std::multimap<Key, T>.
\row \li \l{QHash}<Key, T>
- \li Most similar to std::map<T>.
+ \li Most similar to std::unordered_map<Key, T>.
\row \li \l{QMultiHash}<Key, T>
- \li Most similar to std::multimap<T>.
+ \li Most similar to std::unordered_multimap<Key, T>.
\endtable
\section1 Qt containers and std algorithms
- You can used Qt containers with functions from \c{#include <algorithm>}.
+ You can use Qt containers with functions from \c{#include <algorithm>}.
\snippet code/doc_src_containers.cpp 26
@@ -434,7 +411,7 @@
Qt includes other template classes that resemble containers in
some respects. These classes don't provide iterators and cannot
- be used with the \c foreach keyword.
+ be used with the \l foreach keyword.
\list
\li QCache<Key, T> provides a cache to store objects of a certain
diff --git a/src/corelib/doc/src/custom-types.qdoc b/src/corelib/doc/src/custom-types.qdoc
index d881a32e62..7922fd9477 100644
--- a/src/corelib/doc/src/custom-types.qdoc
+++ b/src/corelib/doc/src/custom-types.qdoc
@@ -1,36 +1,12 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
\page custom-types.html
\title Creating Custom Qt Types
\brief How to create and register new types with Qt.
- \ingroup best-practices
+ \ingroup how-to
\tableofcontents
@@ -61,7 +37,7 @@
The following \c Message class definition includes these members:
- \snippet tools/customtype/message.h custom type definition
+ \snippet customtype/customtypeexample.cpp custom type definition
The class also provides a constructor for normal use and two public member functions
that are used to obtain the private data.
@@ -77,11 +53,14 @@
to this class, we invoke the Q_DECLARE_METATYPE() macro on the class in the header
file where it is defined:
- \snippet tools/customtype/message.h custom type meta-type declaration
+ \snippet customtype/customtypeexample.cpp custom type meta-type declaration
This now makes it possible for \c Message values to be stored in QVariant objects
- and retrieved later. See the \l{Custom Type Example} for code that demonstrates
- this.
+ and retrieved later:
+
+ \snippet customtype/customtypeexample.cpp storing a custom value
+ \dots
+ \snippet customtype/customtypeexample.cpp retrieving a custom value
The Q_DECLARE_METATYPE() macro also makes it possible for these values to be used as
arguments to signals, but \e{only in direct signal-slot connections}.
@@ -101,7 +80,7 @@
available for queued signal-slot communication as long as you call it before you
make the first connection that uses the type.
- The \l{Queued Custom Type Example} declares a \c Block class which is registered
+ The \l{Queued Custom Type} example declares a \c Block class which is registered
in the \c{main.cpp} file:
\snippet threads/queuedcustomtype/main.cpp main start
@@ -131,18 +110,17 @@
It is often quite useful to make a custom type printable for debugging purposes,
as in the following code:
- \snippet tools/customtype/main.cpp printing a custom type
+ \snippet customtype/customtypeexample.cpp printing a custom type
This is achieved by creating a streaming operator for the type, which is often
defined in the header file for that type:
- \snippet tools/customtype/message.h custom type streaming operator
+ \snippet customtype/customtypeexample.cpp custom type streaming operator declaration
- The implementation for the \c Message type in the \l{Custom Type Example}
- goes to some effort to make the printable representation as readable as
- possible:
+ The implementation for the \c Message type here goes to some effort to make the
+ printable representation as readable as possible:
- \snippet tools/customtype/message.cpp custom type streaming operator
+ \snippet customtype/customtypeexample.cpp custom type streaming operator
The output sent to the debug stream can, of course, be made as simple or as
complicated as you like. Note that the value returned by this function is
@@ -155,9 +133,8 @@
The Q_DECLARE_METATYPE() macro and qRegisterMetaType() function documentation
contain more detailed information about their uses and limitations.
- The \l{Custom Type Example}{Custom Type} and \l{Queued Custom Type Example}
- {Queued Custom Type} examples show how to implement a custom type with the
- features outlined in this document.
+ The \l{Queued Custom Type} example shows how to implement a custom type with
+ the features outlined in this document.
The \l{Debugging Techniques} document provides an overview of the debugging
mechanisms discussed above.
diff --git a/src/corelib/doc/src/datastreamformat.qdoc b/src/corelib/doc/src/datastreamformat.qdoc
index 303d374678..65b7eb5a20 100644
--- a/src/corelib/doc/src/datastreamformat.qdoc
+++ b/src/corelib/doc/src/datastreamformat.qdoc
@@ -1,29 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
\page datastreamformat.html
@@ -31,7 +7,7 @@
\brief List of data types that can be serialized by QDataStream.
The \l QDataStream class allows you to serialize the Qt data types
- listed in this section as of \l{QDataStream::setVersion()}{version 18}.
+ listed in this section.
It is always best to cast integers to a Qt integer type, such as
\l{qint16} or \l{quint32}, when reading and writing. This ensures that
@@ -55,7 +31,11 @@
\li QBitArray
\li QBrush
\li QByteArray
+ \li QCborArray
+ \li QCborMap
+ \li QCborValue
\li QColor
+ \li QColorSpace
\li QCursor
\li QDate
\li QDateTime
@@ -63,33 +43,73 @@
\li QFont
\li QGenericMatrix
\li QHash<Key, T>
+ \li QHostAddress
\li QIcon
\li QImage
+ \li QJsonArray
+ \li QJsonDocument
+ \li QJsonObject
+ \li QJsonValue
\li QKeySequence
+ \li QLine
+ \li QLineF
\li QList<T>
+ \li QListWidgetItem
+ \li QLocale
\li QMap<Key, T>
\li QMargins
+ \li QMarginsF
\li QMatrix4x4
- \li QPair<T1, T2>
+ \li QModelIndex
+ \li QModelIndexList
+ \li QMultiHash<Key
+ \li QMultiMap<Key
+ \li QNetworkCacheMetaData
+ \li QNetworkCacheMetaData::AttributesMap
+ \li QPageRanges
+ \li QPainterPath
+ \li std::pair<T1, T2>
\li QPalette
\li QPen
\li QPicture
\li QPixmap
\li QPoint
+ \li QPointF
+ \li QPolygon
+ \li QPolygonF
\li QQuaternion
\li QRect
+ \li QRectF
\li QRegularExpression
\li QRegion
+ \li QSet
\li QSize
+ \li QSizeF
+ \li QSizePolicy
+ \li QStandardItem
\li QString
+ \li QTableWidgetItem
+ \li QTextBlockFormat
+ \li QTextCharFormat
+ \li QTextFormat
+ \li QTextFrameFormat
+ \li QTextLength
+ \li QTextListFormat
+ \li QTextTableCellFormat
+ \li QTimeZone
\li QTime
\li QTransform
+ \li QTreeWidgetItem
+ \li QTypeRevision
\li QUrl
+ \li QUuid
\li QVariant
\li QVector2D
\li QVector3D
\li QVector4D
+ \li QVersionNumber
\endlist
- \sa {JSON Support in Qt}
+ \sa {JSON Support in Qt}, {CBOR Support in Qt}
+
*/
diff --git a/src/corelib/doc/src/dontdocument.qdoc b/src/corelib/doc/src/dontdocument.qdoc
index 9ed5345777..456e6dfab2 100644
--- a/src/corelib/doc/src/dontdocument.qdoc
+++ b/src/corelib/doc/src/dontdocument.qdoc
@@ -1,29 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2019 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2019 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
\dontdocument (QMacAutoReleasePool QIncompatibleFlag QGenericAtomicOps QAtomicTraits
diff --git a/src/corelib/doc/src/eventsandfilters.qdoc b/src/corelib/doc/src/eventsandfilters.qdoc
index 947a24f4e5..38a4d2a39a 100644
--- a/src/corelib/doc/src/eventsandfilters.qdoc
+++ b/src/corelib/doc/src/eventsandfilters.qdoc
@@ -1,29 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
\group events
diff --git a/src/corelib/doc/src/external-resources.qdoc b/src/corelib/doc/src/external-resources.qdoc
index 50a19a4e09..b787651aba 100644
--- a/src/corelib/doc/src/external-resources.qdoc
+++ b/src/corelib/doc/src/external-resources.qdoc
@@ -1,29 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
@@ -105,3 +81,93 @@
\externalpage https://developer.android.com/training/articles/perf-anr
\title Android: Keeping your app responsive
*/
+
+/*!
+ \externalpage https://developer.android.com/training/data-storage/shared/documents-files
+ \title Android: Access documents and other files from shared storage
+*/
+
+/*!
+ \externalpage https://developer.android.com/reference/androidx/documentfile/provider/DocumentFile#getParentFile()
+ \title Android: DocumentFile.getParentFile()
+*/
+
+/*!
+ \externalpage https://developer.android.com/guide/topics/providers/content-provider-basics#ContentURIs
+ \title Android: Content URIs
+*/
+
+/*!
+ \externalpage https://developer.android.com/training/data-storage#scoped-storage
+ \title Android: Scoped storage
+*/
+
+/*!
+ \externalpage https://developer.android.com/training/data-storage/use-cases
+ \title Android: storage best practices
+*/
+
+/*!
+ \externalpage https://developer.android.com/reference/android/provider/MediaStore
+ \title Android: MediaStore
+*/
+
+/*!
+ \externalpage https://cmake.org/cmake/help/latest/module/GNUInstallDirs.html
+ \title GNUInstallDirs
+*/
+
+/*!
+ \externalpage https://cmake.org/cmake/help/latest/variable/CMAKE_INSTALL_PREFIX.html
+ \title CMAKE_INSTALL_PREFIX
+*/
+
+/*!
+ \externalpage https://cmake.org/cmake/help/latest/guide/user-interaction/index.html#command-line-cmake-tool
+ \title Command Line cmake invocation
+*/
+
+/*!
+ \externalpage https://cmake.org/cmake/help/latest/envvar/DESTDIR.html
+ \title DESTDIR
+*/
+
+/*!
+ \externalpage https://cmake.org/cmake/help/latest/command/install.html#targets
+ \title install(TARGETS)
+*/
+
+/*!
+ \externalpage https://cmake.org/cmake/help/latest/command/install.html#script
+ \title install(SCRIPT)
+*/
+
+/*!
+ \externalpage https://cmake.org/cmake/help/latest/command/add_subdirectory.html
+ \title add_subdirectory()
+*/
+
+/*!
+ \externalpage https://cmake.org/cmake/help/latest/module/FetchContent.html#command:fetchcontent_makeavailable
+ \title FetchContent_MakeAvailable()
+*/
+
+/*!
+ \externalpage https://cmake.org/cmake/help/latest/prop_gbl/USE_FOLDERS.html
+ \title USE_FOLDERS
+*/
+
+/*!
+ \externalpage https://cmake.org/cmake/help/latest/prop_tgt/FOLDER.html
+ \title FOLDER
+*/
+
+/*!
+ \externalpage https://cmake.org/cmake/help/latest/command/cmake_policy.html
+ \title cmake_policy
+*/
+
+/*!
+ \externalpage https://cmake.org/cmake/help/latest/guide/importing-exporting/index.html#creating-packages
+ \title Creating CMake packages
+*/
diff --git a/src/corelib/doc/src/filestorage.qdoc b/src/corelib/doc/src/filestorage.qdoc
index e291ba1375..6c93955320 100644
--- a/src/corelib/doc/src/filestorage.qdoc
+++ b/src/corelib/doc/src/filestorage.qdoc
@@ -1,29 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
\page io-functions.html
diff --git a/src/corelib/doc/src/foreach-keyword.qdoc b/src/corelib/doc/src/foreach-keyword.qdoc
index a36f8be608..b3a4482528 100644
--- a/src/corelib/doc/src/foreach-keyword.qdoc
+++ b/src/corelib/doc/src/foreach-keyword.qdoc
@@ -1,29 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
\page foreach-keyword.html
@@ -55,7 +31,7 @@
\snippet code/doc_src_containers.cpp 16
- Unless the data type contains a comma (e.g., \c{QPair<int,
+ Unless the data type contains a comma (e.g., \c{std::pair<int,
int>}), the variable used for iteration can be defined within the
\c foreach statement:
@@ -97,4 +73,15 @@
\c foreach would not. But using \c foreach always copies the container,
which is usually not cheap for STL containers. If in doubt, prefer
\c foreach for Qt containers, and range based \c for for STL ones.
+
+ You can remove the availability of the Qt's \c foreach loop by
+ defining the \c{QT_NO_FOREACH} macro.
+*/
+
+/*!
+ \macro QT_NO_FOREACH
+ \since 6.0
+
+ Defining this macro removes the availability of Qt's \c foreach
+ loop.
*/
diff --git a/src/corelib/doc/src/implicit-sharing.qdoc b/src/corelib/doc/src/implicit-sharing.qdoc
index d789f8bf92..46daebe311 100644
--- a/src/corelib/doc/src/implicit-sharing.qdoc
+++ b/src/corelib/doc/src/implicit-sharing.qdoc
@@ -1,29 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/* TODO: Move some of the documentation from QSharedDataPointer into this
document. */
diff --git a/src/corelib/doc/src/includes/android-content-uri-limitations.qdocinc b/src/corelib/doc/src/includes/android-content-uri-limitations.qdocinc
new file mode 100644
index 0000000000..0521aff662
--- /dev/null
+++ b/src/corelib/doc/src/includes/android-content-uri-limitations.qdocinc
@@ -0,0 +1,13 @@
+On Android, some limitations apply when dealing with
+\l {Android: Content URIs}{content URIs}:
+\list
+ \li Access permissions might be needed by prompting the user through the
+ \l QFileDialog which implements
+ \l {Android: Access documents and other files from shared storage}{Android's native file picker}.
+ \li Aim to follow the \l {Android: Scoped storage}{Scoped storage} guidelines,
+ such as using app specific directories instead of other public external directories.
+ For more information, also see
+ \l {Android: storage best practices}{storage best practices}.
+ \li Due to the design of Qt APIs (e.g. QFile), it's not possible to fully
+ integrate the latter APIs with Android's \l {Android: MediaStore}{MediaStore} APIs.
+\endlist
diff --git a/src/corelib/doc/src/includes/cmake-android-qt-finalize-project-warning.qdocinc b/src/corelib/doc/src/includes/cmake-android-qt-finalize-project-warning.qdocinc
new file mode 100644
index 0000000000..47133f6d10
--- /dev/null
+++ b/src/corelib/doc/src/includes/cmake-android-qt-finalize-project-warning.qdocinc
@@ -0,0 +1,8 @@
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
+
+//! [warning]
+\warning If your \e Android project is built using a CMake version lower than
+3.19, make sure that you call \l{qt_finalize_project}{qt6_finalize_project()} at
+the end of a top-level CMakeLists.txt.
+//! [warning]
diff --git a/src/corelib/doc/src/includes/cmake-android-supported-abis.qdocinc b/src/corelib/doc/src/includes/cmake-android-supported-abis.qdocinc
new file mode 100644
index 0000000000..887866739c
--- /dev/null
+++ b/src/corelib/doc/src/includes/cmake-android-supported-abis.qdocinc
@@ -0,0 +1 @@
+The supported ABIs are \c{armeabi-v7a, arm64-v8a, x86, x86_64}.
diff --git a/src/corelib/doc/src/includes/cmake-deploy-modified-variable-values.qdocinc b/src/corelib/doc/src/includes/cmake-deploy-modified-variable-values.qdocinc
new file mode 100644
index 0000000000..632ddf756f
--- /dev/null
+++ b/src/corelib/doc/src/includes/cmake-deploy-modified-variable-values.qdocinc
@@ -0,0 +1,30 @@
+\badcode
+cmake_minimum_required(VERSION 3.16...3.22)
+project(MyThings)
+
+# The following CMAKE_INSTALL_*DIR variables are used to initialize their
+# QT_DEPLOY_*_DIR counterparts.
+set(CMAKE_INSTALL_BINDIR "mybindir")
+set(CMAKE_INSTALL_LIBDIR "mylibdir")
+set(CMAKE_INSTALL_LIBEXECDIR "mylibexecdir")
+
+find_package(Qt6 REQUIRED COMPONENTS Core)
+qt_standard_project_setup()
+
+qt_add_executable(MyApp main.cpp)
+
+set(deploy_script "${CMAKE_CURRENT_BINARY_DIR}/deploy_MyApp.cmake")
+file(GENERATE OUTPUT ${deploy_script} CONTENT "
+
+set(QT_DEPLOY_PLUGINS_DIR \"mypluginsdir\")
+set(QT_DEPLOY_QML_DIR \"myqmldir\")
+set(QT_DEPLOY_TRANSLATIONS_DIR \"i18n\")
+
+include(\"${QT_DEPLOY_SUPPORT}\")
+
+qt_deploy_runtime_dependencies(
+ EXECUTABLE \"\${QT_DEPLOY_BIN_DIR}/$<TARGET_FILE_NAME:MyApp>\"
+)")
+
+install(SCRIPT ${deploy_script})
+\endcode
diff --git a/src/corelib/doc/src/includes/cmake-deploy-runtime-dependencies-deploy-tool-options.qdocinc b/src/corelib/doc/src/includes/cmake-deploy-runtime-dependencies-deploy-tool-options.qdocinc
new file mode 100644
index 0000000000..0f46379c45
--- /dev/null
+++ b/src/corelib/doc/src/includes/cmake-deploy-runtime-dependencies-deploy-tool-options.qdocinc
@@ -0,0 +1,20 @@
+\badcode
+set(deploy_tool_options_arg "")
+if(APPLE)
+ set(deploy_tool_options_arg --hardened-runtime)
+elseif(WIN32)
+ set(deploy_tool_options_arg --no-compiler-runtime)
+endif()
+
+# Generate a deployment script to be executed at install time
+qt_generate_deploy_script(
+ TARGET MyApp
+ OUTPUT_SCRIPT deploy_script
+ CONTENT "
+qt_deploy_runtime_dependencies(
+ EXECUTABLE \"${executable_path}\"
+ DEPLOY_TOOL_OPTIONS "${deploy_tool_options_arg}"
+ GENERATE_QT_CONF
+ VERBOSE
+)")
+\endcode
diff --git a/src/corelib/doc/src/includes/cmake-deploy-runtime-dependencies.qdocinc b/src/corelib/doc/src/includes/cmake-deploy-runtime-dependencies.qdocinc
new file mode 100644
index 0000000000..6d026d6301
--- /dev/null
+++ b/src/corelib/doc/src/includes/cmake-deploy-runtime-dependencies.qdocinc
@@ -0,0 +1,46 @@
+\badcode
+cmake_minimum_required(VERSION 3.16...3.22)
+project(MyThings)
+
+find_package(Qt6 REQUIRED COMPONENTS Core)
+qt_standard_project_setup()
+
+qt_add_executable(MyApp main.cpp)
+
+set_target_properties(MyApp PROPERTIES
+ WIN32_EXECUTABLE TRUE
+ MACOSX_BUNDLE TRUE
+)
+
+# App bundles on macOS have an .app suffix
+if(APPLE)
+ set(executable_path "$<TARGET_FILE_NAME:MyApp>.app")
+else()
+ set(executable_path "\${QT_DEPLOY_BIN_DIR}/$<TARGET_FILE_NAME:MyApp>")
+endif()
+
+# Helper app, not necessarily built as part of this project.
+qt_add_executable(HelperApp helper.cpp)
+set(helper_app_path "\${QT_DEPLOY_BIN_DIR}/$<TARGET_FILE_NAME:HelperApp>")
+
+# Generate a deployment script to be executed at install time
+qt_generate_deploy_script(
+ TARGET MyApp
+ OUTPUT_SCRIPT deploy_script
+ CONTENT "
+qt_deploy_runtime_dependencies(
+ EXECUTABLE \"${executable_path}\"
+ ADDITIONAL_EXECUTABLES \"${helper_app_path}\"
+ GENERATE_QT_CONF
+ VERBOSE
+)")
+
+# Omitting RUNTIME DESTINATION will install a non-bundle target to CMAKE_INSTALL_BINDIR,
+# which coincides with the default value of QT_DEPLOY_BIN_DIR used above, './bin'.
+# Installing macOS bundles always requires an explicit BUNDLE DESTINATION option.
+install(TARGETS MyApp HelperApp # Install to CMAKE_INSTALL_PREFIX/bin/MyApp.exe
+ # and ./binHelperApp.exe
+ BUNDLE DESTINATION . # Install to CMAKE_INSTALL_PREFIX/MyApp.app/Contents/MacOS/MyApp
+)
+install(SCRIPT ${deploy_script}) # Add its runtime dependencies
+\endcode
diff --git a/src/corelib/doc/src/includes/cmake-deploy-var-usage.qdocinc b/src/corelib/doc/src/includes/cmake-deploy-var-usage.qdocinc
new file mode 100644
index 0000000000..27e04b5b08
--- /dev/null
+++ b/src/corelib/doc/src/includes/cmake-deploy-var-usage.qdocinc
@@ -0,0 +1,6 @@
+This variable is defined by the script named by \l QT_DEPLOY_SUPPORT. It should
+only be used as part of deployment during installation or a post-build rule.
+
+\note This is a low-level deployment API variable, and should only be used in
+advanced use-cases that are not covered by the higher-level API commands, like
+\l{qt_generate_deploy_app_script}.
diff --git a/src/corelib/doc/src/includes/cmake-find-package-core.qdocinc b/src/corelib/doc/src/includes/cmake-find-package-core.qdocinc
index 4bf3892aa2..66649eec5a 100644
--- a/src/corelib/doc/src/includes/cmake-find-package-core.qdocinc
+++ b/src/corelib/doc/src/includes/cmake-find-package-core.qdocinc
@@ -1,5 +1,6 @@
-The command is defined in the \c Core component of the \c Qt6 package. Load the package with:
+The command is defined in the \c Core component of the \c Qt6 package, which
+can be loaded like so:
-\code
-find_package(Qt6 COMPONENTS Core REQUIRED)
+\badcode
+find_package(Qt6 REQUIRED COMPONENTS Core)
\endcode
diff --git a/src/corelib/doc/src/includes/cmake-generate-deploy-app-script-deploy-tool-options.qdocinc b/src/corelib/doc/src/includes/cmake-generate-deploy-app-script-deploy-tool-options.qdocinc
new file mode 100644
index 0000000000..64c6b3e49f
--- /dev/null
+++ b/src/corelib/doc/src/includes/cmake-generate-deploy-app-script-deploy-tool-options.qdocinc
@@ -0,0 +1,16 @@
+\badcode
+set(deploy_tool_options_arg "")
+if(APPLE)
+ set(deploy_tool_options_arg --hardened-runtime)
+elseif(WIN32)
+ set(deploy_tool_options_arg --no-compiler-runtime)
+endif()
+
+qt_generate_deploy_app_script(
+ TARGET MyApp
+ OUTPUT_SCRIPT deploy_script
+ NO_UNSUPPORTED_PLATFORM_ERROR
+ DEPLOY_TOOL_OPTIONS ${deploy_tool_options_arg}
+)
+install(SCRIPT ${deploy_script})
+\endcode
diff --git a/src/corelib/doc/src/includes/cmake-generate-deploy-app-script.qdocinc b/src/corelib/doc/src/includes/cmake-generate-deploy-app-script.qdocinc
new file mode 100644
index 0000000000..d5c1d2cf4a
--- /dev/null
+++ b/src/corelib/doc/src/includes/cmake-generate-deploy-app-script.qdocinc
@@ -0,0 +1,21 @@
+\badcode
+cmake_minimum_required(VERSION 3.16...3.22)
+project(MyThings)
+
+find_package(Qt6 REQUIRED COMPONENTS Core)
+qt_standard_project_setup()
+
+qt_add_executable(MyApp main.cpp)
+
+install(TARGETS MyApp
+ BUNDLE DESTINATION .
+ RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
+)
+
+qt_generate_deploy_app_script(
+ TARGET MyApp
+ OUTPUT_SCRIPT deploy_script
+ NO_UNSUPPORTED_PLATFORM_ERROR
+)
+install(SCRIPT ${deploy_script})
+\endcode
diff --git a/src/corelib/doc/src/includes/models.qdocinc b/src/corelib/doc/src/includes/models.qdocinc
new file mode 100644
index 0000000000..cf840b1cae
--- /dev/null
+++ b/src/corelib/doc/src/includes/models.qdocinc
@@ -0,0 +1,14 @@
+//! [thread-safety-section1]
+\section1 Thread safety
+
+Being a \l {Accessing QObject Subclasses from Other Threads}{subclass of
+QObject}, \1 is not \l {Reentrancy and Thread-Safety}{thread-safe}. Any \1
+model-related API should only be called from the thread the model object lives
+in. If the \1 is connected with a view, that means the GUI thread, as that is
+where the view lives, and it will call into the model from the GUI thread.
+Using a background thread to populate or modify the contents of a model is
+possible, but requires care, as the background thread cannot call any
+model-related API directly. Instead, you should queue the updates and apply
+them in the main thread. This can be done with \l {Signals and Slots Across
+Threads}{queued connections}.
+//! [thread-safety-section1]
diff --git a/src/corelib/doc/src/includes/permissions.qdocinc b/src/corelib/doc/src/includes/permissions.qdocinc
new file mode 100644
index 0000000000..00bf848d37
--- /dev/null
+++ b/src/corelib/doc/src/includes/permissions.qdocinc
@@ -0,0 +1,51 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
+
+//! [requestPermission-functor]
+ When the request is ready, \a functor will be called as
+ \c {functor(const QPermission &permission)}, with
+ \c permission describing the result of the request.
+//! [requestPermission-functor]
+
+//! [requestPermission-postamble]
+ If the user explicitly grants the application the requested \a permission,
+ or the \a permission is known to not require user authorization on the given
+ platform, the status will be Qt::PermissionStatus::Granted.
+
+ If the user explicitly denies the application the requested \a permission,
+ or the \a permission is known to not be accessible or applicable to applications
+ on the given platform, the status will be Qt::PermissionStatus::Denied.
+
+ The result of a request will never be Qt::PermissionStatus::Undetermined.
+
+ \note Permissions can only be requested from the main thread.
+//! [requestPermission-postamble]
+
+//! [permission-metadata]
+ \inmodule QtCore
+ \inheaderfile QPermissions
+ \ingroup permissions
+ \since 6.5
+ \sa QPermission,
+ QCoreApplication::requestPermission(),
+ QCoreApplication::checkPermission(),
+ {Application Permissions}
+//! [permission-metadata]
+
+//! [begin-usage-declarations]
+ To request this permission at runtime, the following platform
+ specific usage declarations have to be made at build time:
+
+ \table
+ \header
+ \li Platform
+ \li Type
+ \li
+//! [begin-usage-declarations]
+
+//! [end-usage-declarations]
+ \endtable
+
+ Please see the individual usage declaration types for how
+ to add them to your project.
+//! [end-usage-declarations]
diff --git a/src/corelib/doc/src/includes/qobject.qdocinc b/src/corelib/doc/src/includes/qobject.qdocinc
index 1af4d3ae33..65630c82ee 100644
--- a/src/corelib/doc/src/includes/qobject.qdocinc
+++ b/src/corelib/doc/src/includes/qobject.qdocinc
@@ -1,29 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
//! [disconnect-all]
\note Disconnecting all signal-slot connections will also disconnect the
diff --git a/src/corelib/doc/src/includes/qstring.qdocinc b/src/corelib/doc/src/includes/qstring.qdocinc
new file mode 100644
index 0000000000..66ed12dff3
--- /dev/null
+++ b/src/corelib/doc/src/includes/qstring.qdocinc
@@ -0,0 +1,36 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
+
+// \1 is either "search" or "comparison"
+//! [search-comparison-case-sensitivity]
+If \a cs is Qt::CaseSensitive (the default), the \1 is case-sensitive;
+otherwise the \1 is case-insensitive.
+//! [search-comparison-case-sensitivity]
+
+//! [negative-index-start-search-from-end]
+If \a from is -1, the search starts at the last character; if it is
+-2, at the next to last character and so on.
+//! [negative-index-start-search-from-end]
+
+//! [qstring-first-index-of]
+Returns the index position of the first occurrence of the \1 \a \2
+in this string, searching forward from index position \a from.
+Returns -1 if \a \2 is not found.
+//! [qstring-first-index-of]
+
+//! [qstring-last-index-of]
+Returns the index position of the last occurrence of the \1 \a \2
+in this string, searching backward from index position \a from.
+//! [qstring-last-index-of]
+
+//! [qstring-local-8-bit-equivalent]
+On Unix systems this is equivalent to \1().
+Note that on Apple systems this function does not take
+\l{https://developer.apple.com/documentation/foundation/nsstring/1410091-defaultcstringencoding?language=objc}
+{NSString.defaultCStringEncoding} or
+\l{https://developer.apple.com/documentation/corefoundation/1541720-cfstringgetsystemencoding?language=objc}
+{CFStringGetSystemEncoding()} into account, as these functions
+typically return the legacy "Western (Mac OS Roman)" encoding,
+which should not be used on modern Apple operating systems.
+On Windows the system's current code page is used.
+//! [qstring-local-8-bit-equivalent]
diff --git a/src/corelib/doc/src/io.qdoc b/src/corelib/doc/src/io.qdoc
index a1bbc623a1..443d324f75 100644
--- a/src/corelib/doc/src/io.qdoc
+++ b/src/corelib/doc/src/io.qdoc
@@ -1,29 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
\group io
@@ -34,7 +10,7 @@
network handling.
These \l{Qt Core} classes are used to handle input and output to and from
- external devices, processes, files etc. as well as manipulating files and
+ external devices, processes, files etc., as well as manipulating files and
directories.
*/
diff --git a/src/corelib/doc/src/ipc.qdoc b/src/corelib/doc/src/ipc.qdoc
new file mode 100644
index 0000000000..7ec6f5fa3b
--- /dev/null
+++ b/src/corelib/doc/src/ipc.qdoc
@@ -0,0 +1,492 @@
+// Copyright (C) 2022 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
+
+/*!
+ \page ipc.html
+ \title Inter-Process Communication
+ \ingroup groups
+ \ingroup frameworks-technologies
+ \keyword ipc
+ \ingroup explanations-networkingandconnectivity
+
+ \brief An overview of Qt's inter-process communication functionality
+
+ Qt supports many ways of communicating with other processes running in the
+ same system or in different systems. There are basically three types of
+ inter-process communication mechanisms:
+
+ \list 1
+ \li Synchronization primitives
+ \li Exchanging of arbitrary byte-level data
+ \li Passing structured messages
+ \endlist
+
+ \section1 Synchronization primitives
+
+ Qt only provides one class for explicit inter-process synchronization:
+ \l{QSystemSemaphore}. A QSystemSemaphore is like a \l{QSemaphore} that is
+ accessible by multiple processes in the same system. It is globally
+ identified by a "key", which in Qt is represented by the \l{QNativeIpcKey}
+ class. Additionally, depending on the OS, Qt may support multiple different
+ backends for sharing memory; see the \l{Native IPC Keys} documentation for
+ more information and limitations.
+
+ It is possible to use regular thread-synchronization primitives such as
+ mutexes, wait conditions, and read-write locks, located in memory that is
+ shared between processes. Qt does not provide any class to support this,
+ but applications can use low-level operations on certain operating systems.
+
+ Other Qt classes may be used to provide higher-level locking, like
+ \l{QLockFile}, or by acquiring a unique, system-wide resource. Such
+ techniques include \l{QTcpServer}{TCP} or \l{QUdpSocket}{UDP} ports or
+ well-known names in \l{QDBusConnection::registerService}{D-Bus}.
+
+ \section1 Byte-level data sharing
+
+ Using byte-level data, applications can implement any communication
+ protocol they may choose. Sharing of byte data can be stream-oriented
+ (serialized) or can allow random access (a similar condition to
+ QFileDevice::isSequential()).
+
+ For serial communication, Qt provides a number of different classes and
+ even full modules:
+ \list
+ \li Pipes and FIFOs: \l QFile
+ \li Child processes: \l QProcess
+ \li Sockets: \l QTcpSocket, \l QUdpSocket (in \l{Qt Network})
+ \li HTTP(S): \l QNetworkAccessManager (in \l{Qt Network}) and
+ \l QHttpServer (in \l{Qt HTTP Server})
+ \li CoAP(S): \l QCoapClient (in \l{Qt CoAP})
+ \endlist
+
+ For random-access data sharing within the same system, Qt provides
+ \l{QSharedMemory}. See the \l{Shared Memory} documentation for detailed
+ information.
+
+ \section1 Structured message passing
+
+ Qt also provides a number of techniques to exchange structured messages
+ with other processes. Applications can build on top of the byte-level
+ solutions above, such as by using \l QJsonDocument or \l QXmlStreamReader /
+ \l QXmlStreamWriter over HTTP to perform JSONRPC or XMLRPC, respectively,
+ or \l QCborValue with QtCoAP.
+
+ Dedicated Qt modules for structured messages and remote procedure-calling
+ include:
+ \list
+ \li \l{Qt D-Bus}
+ \li \l{Qt Remote Objects}
+ \li \l{Qt WebSockets}
+ \endlist
+*/
+
+/*!
+ \page shared-memory.html
+ \title Shared Memory
+ \keyword ipc
+ \keyword shared memory
+
+ \brief Overview of the techniques for sharing memory between processes.
+
+ Qt provides two techniques to share memory with other processes in the same
+ system: \l{QSharedMemory} and memory-mapped files using \l{QFile}. Memory
+ that is shared with other processes is often referred to as a "segment",
+ and although it may have been implemented as specific segments on
+ processors with segmented memory models in the past, this is not the case
+ in any modern operating system. Shared memory segments are simply regions
+ of memory that the operating system will ensure are available to all
+ processes participating.
+
+ \note The address at which the segment is located in memory will almost
+ always be different for each process that is participating in the sharing.
+ Therefore, applications must take care to share only position-independent
+ data, such as primitive C++ types or arrays of such types.
+
+ \section1 Sharing memory using QSharedMemory
+
+ QSharedMemory provides a simple API to create a shared memory segment of a
+ given size or attach to one that was created by another process.
+ Additionally, it provides a pair of methods to \l{QSharedMemory::}{lock}
+ and \l{QSharedMemory::}{unlock} the whole segment, using an internal
+ \l{QSystemSemaphore}.
+
+ Shared memory segments and system semaphores are globally identified in the
+ system through a "key", which in Qt is represented by the \l{QNativeIpcKey}
+ class. Additionally, depending on the OS, Qt may support multiple different
+ backends for sharing memory; see the \l{Native IPC Keys} documentation for
+ more information and limitations.
+
+ QSharedMemory is designed to share memory only within the same privilege
+ level (that is, not with untrusted other processes, such as those started
+ by other users). For backends that support it, QSharedMemory will create
+ segments such that only processes with the same privilege level can attach.
+
+ \section1 Sharing memory via memory-mapped files
+
+ Most files can be mapped to memory using QFile::map() and, if the
+ \l{QFileDevice::MapPrivateOption}{MapPrivateOption} option is not specified,
+ any writes to the mapped segment will be observed by all other processes
+ that have mapped the same file. Exceptions to files that can be mapped to
+ memory include remote files found in network shares or those located in
+ certain filesystems. Even if the operating system does allow mapping remote
+ files to memory, I/O operations on the file will likely be cached and
+ delayed, thus making true memory sharing impossible.
+
+ This solution has the major advantages of being independent of any backend
+ API and of being simpler to interoperate with from non-Qt applications.
+ Since \l{QTemporaryFile} is a \l{QFile}, applications can use that class to
+ achieve clean-up semantics and to create unique shared memory segments too.
+
+ To achieve locking of the shared memory segment, applications will need to
+ deploy their own mechanisms. One way may be to use \l QLockFile. Another
+ and less costly solution is to use QBasicAtomicInteger or \c{std::atomic} in
+ a pre-determined offset in the segment itself. Higher-level locking
+ primitives may be available on some operating systems; for example, on
+ Linux, applications can set the "pshared" flag in the mutex attribute
+ passed to \c{pthread_mutex_create()} to indicate that the mutex resides in
+ a shared memory segment.
+
+ Be aware that the operating system will likely attempt to commit to
+ permanent storage any writes made to the shared memory. This may be desired
+ or it may be a performance penalty if the file itself was meant to be
+ temporary. In that case, applications should locate a RAM-backed
+ filesystem, such as \c{tmpfs} on Linux (see
+ QStorageInfo::fileSystemType()), or pass a flag to the native file-opening
+ function to inform the OS to avoid committing the contents to storage.
+
+ It is possible to use file-backed shared memory to communicate with
+ untrusted processes, in which case the application should exercise great
+ care. The files may be truncated/shrunk and cause applications accessing
+ memory beyond the file's size to crash.
+
+ \section2 Linux hints on memory-mapped files
+
+ On modern Linux systems, while the \c{/tmp} directory is often a \c{tmpfs}
+ mount point, that is not a requirement. However, the \c{/dev/shm} directory
+ is required to be a \c{tmpfs} and exists for the very purpose of sharing
+ memory. Do note that it is world-readable and writable (like \c{/tmp} and
+ \c{/var/tmp}), so applications must be careful of the contents revealed
+ there. Another alternative is to use the XDG Runtime Directory (see
+ QStandardPaths::writableLocation() and \l{QStandardPaths::RuntimeLocation}),
+ which on Linux systems using systemd is a user-specific \c{tmpfs}.
+
+ An even more secure solution is to create a "memfd" using \c{memfd_create(2)}
+ and use interprocess communication to pass the file descriptor, like
+ \l{QDBusUnixFileDescriptor} or by letting the child process of a \l{QProcess}
+ inherit it. "memfds" can also be sealed against being shrunk, so they are
+ safe to be used when communicating with processes with a different privilege
+ level.
+
+ \section2 FreeBSD hints on memory-mapped files
+
+ FreeBSD also has \c{memfd_create(2)} and can pass file descriptors to other
+ processes using the same techniques as Linux. It does not have temporary
+ filesystems mounted by default.
+
+ \section2 Windows hints on memory-mapped files
+
+ On Windows, the application can request the operating system avoid saving
+ the file's contents on permanent storage. This request is performed by
+ passing the \c{FILE_ATTRIBUTE_TEMPORARY} flag in the
+ \c{dwFlagsAndAttributes} parameter to the \c{CreateFile} Win32 function,
+ the \c{_O_SHORT_LIVED} flag to \c{_open()} low-level function, or by
+ including the modifier "T" to the
+ \c{fopen()} C runtime function.
+
+ There's also a flag to inform the operating system to delete the file when
+ the last handle to it is closed (\c{FILE_FLAG_DELETE_ON_CLOSE},
+ \c{_O_TEMPORARY}, and the "D" modifier), but do note that all processes
+ attempting to open the file must agree on using this flag or not using it. A
+ mismatch will likely cause a sharing violation and failure to open the file.
+*/
+
+/*!
+ \page native-ipc-keys.html
+ \title Native IPC Keys
+ \keyword ipc
+ \keyword shared memory
+ \keyword system semaphore
+
+ \brief An overview of keys for QSharedMemory and QSystemSemaphore
+
+ The \l QSharedMemory and \l QSystemSemaphore classes identify their
+ resource using a system-wide identifier known as a "key". The low-level key
+ value as well as the key type are encapsulated in Qt using the \l
+ QNativeIpcKey class. That class also provides the proper means of
+ exchanging the key with other processes, by way of
+ QNativeIpcKey::toString() and QNativeIpcKey::fromString().
+
+ Qt currently supports three distinct backends for those two classes, which
+ match the values available in the \l{QNativeIpcKey::Type} enumeration.
+ \list
+ \li POSIX Realtime extensions (IEEE 1003.1b, POSIX.1b)
+ \li X/Open System Interfaces (XSI) or System V (SVr4), though also now part of POSIX
+ \li Windows primitives
+ \endlist
+
+ As the name indicates, the Windows primitives are only available on the
+ Windows operating system, where they are the default backend. The other two
+ are usually both available on Unix operating systems. The following table
+ provides an overview of typical availability since Qt 6.6:
+
+ \table
+ \header \li Operating system \li POSIX \li System V \li Windows
+ \row \li Android \li \li \li
+ \row \li INTEGRITY \li \li \li
+ \row \li QNX \li Yes \li \li
+ \row \li \macos \li Yes \li Usually (1) \li
+ \row \li Other Apple OSes \li Yes \li \li
+ \row \li Other Unix systems \li Yes \li Yes \li
+ \row \li Windows \li Rarely (2) \li \li Yes
+ \endtable
+
+ \note 1 Sandboxed \macos applications, which include all applications
+ distributed via the Apple App Store, may not use System V objects.
+
+ \note 2 Some GCC-compatible C runtimes on Windows provide POSIX-compatible
+ shared memory support, but this is rare. It is always absent with the
+ Microsoft compiler.
+
+ To determine whether a given key type is supported, applications should
+ call QSharedMemory::isKeyTypeSupported() and
+ QSystemSemaphore::isKeyTypeSupported().
+
+ QNativeIpcKey also provides support for compatibility with Qt applications
+ prior to its introduction. The following sections detail the limitations of
+ the backends, the contents of the string keys themselves, and
+ compatibility.
+
+ \section1 Cross-platform safe key format
+
+ QNativeIpcKey::setNativeKey() and QNativeIpcKey::nativeKey() handle the
+ low-level native key, which may be used with the native APIs and shared
+ with other, non-Qt processes (see below for the API). This format is not
+ usually cross-platform, so both QSharedMemory and QSystemSemaphore provide
+ a function to translate a cross-platform identifier string to the native
+ key: QSharedMemory::platformSafeKey() and
+ QSystemSemaphore::platformSafeKey().
+
+ The length of the cross-platform key on most platforms is the same as that
+ of a file name, but is severely limited on Apple platforms to only 30
+ usable bytes (be mindful of UTF-8 encoding if using characters outside the
+ US-ASCII range). The format of the key is also similar to that of a file
+ path component, meaning it should not contain any characters not allowed in
+ file names, in particular those that separate path components (slash and
+ backslash), with the exception of sandboxed applications on Apple operating
+ systems. The following are good examples of cross-platform keys: "myapp",
+ "org.example.myapp", "org.example.myapp-12345". Note that it is up to the
+ caller to prevent oversized keys, and to ensure that the key contains legal
+ characters on the respective platform. Qt will silently truncate keys that
+ are too long.
+
+ \b{Apple sandbox limitations:} if the application is running inside of a
+ sandbox in an Apple operating system, the key must be in a very specific
+ format: \c {<application group identifier>/<custom identifier>}. Sandboxing
+ is implied for all applications distributed through the Apple App Store.
+ See Apple's documentation
+ \l{https://developer.apple.com/library/archive/documentation/Security/Conceptual/AppSandboxDesignGuide/AppSandboxInDepth/AppSandboxInDepth.html#//apple_ref/doc/uid/TP40011183-CH3-SW24}
+ {here} and \l{https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_application-groups}
+ {here} for more information, including how to obtain the application's group identifier.
+
+ \section1 Native key format
+
+ This section details the format of the native keys of the supported
+ backends.
+
+ \section3 POSIX Realtime
+ Native keys resemble file names and may contain any character that file
+ names do, except for a slash. POSIX requires the first character in the key
+ name to be a slash and leaves undetermined whether any additional slashes
+ are permitted. On most operating systems, the key length is the same as a
+ file name, but it is limited to 32 characters on Apple operating systems
+ (this includes the first slash and the terminating null, so only 30 usable
+ characters are possible).
+
+ The following are good examples of native POSIX keys: "/myapp",
+ "/org.example.myapp", "/org.example.myapp-12345".
+
+ QSharedMemory::platformSafeKey() and QSystemSemaphore::platformSafeKey()
+ simply prepend the slash. On Apple operating systems, they also truncate
+ the result to the available size.
+
+ \section3 Windows
+ Windows key types are NT
+ \l{https://learn.microsoft.com/en-us/windows/win32/sync/object-namespaces}{kernel
+ object names} and may be up to \c{MAX_PATH} (260) characters in length.
+ They look like relative paths (that is, they don't start with a backslash
+ or a drive letter), but unlike file names on Windows, they are
+ case-sensitive.
+
+ The following are good examples of native Windows keys: "myapp",
+ "org.example.myapp", "org.example.myapp-12345".
+
+ QSharedMemory::platformSafeKey() and QSystemSemaphore::platformSafeKey()
+ insert a prefix to disambiguate shared memory and system semaphores,
+ respectively.
+
+ \section3 X/Open System Interfaces (XSI) / System V
+ System V keys take the form of the name of a file in the system, and thus
+ have the exact same limitations as file paths do. Both QSharedMemory and
+ QSystemSemaphore will create this file if it does not exist when creating
+ the object. If auto-removal is disabled, it may also be shared between
+ QSharedMemory and QSystemSemaphore without conflict and can be any extant
+ file (for example, it can be the process executable itself, see
+ QCoreApplication::applicationFilePath()). The path should be an absolute
+ one to avoid mistakes due to different current directories.
+
+ QSharedMemory::platformSafeKey() and QSystemSemaphore::platformSafeKey()
+ always return an absolute path. If the input was already absolute, they
+ will return their input unchanged. Otherwise, they will prepend a suitable
+ path where the application usually has permission to create files in.
+
+ \section1 Ownership
+
+ Shared memory and system semaphore objects need to be created before use,
+ which is accomplished with QSharedMemory::create() or by passing
+ QSystemSemaphore::Create to the constructor, respectively.
+
+ On Unix systems, the Qt classes that created the object will be responsible
+ for cleaning up the object in question. Therefore, if the application with
+ that C++ object exits uncleanly (a crash, qFatal(), etc.), the object may
+ be left behind. If that happens, applications may fail to create the
+ object again and should instead attach to an existing one. For example, for
+ QSharedMemory:
+
+ \code
+ if (!shm.create(4096) && shm.error() == QSharedMemory::AlreadyExists)
+ shm.attach();
+ \endcode
+
+ Re-attaching to a QSystemSemaphore is probably unwise, as the token counter
+ in it is probably in an unknown state and therefore may lead to deadlocks.
+
+ \section3 POSIX Realtime
+ POSIX Realtime object ownership is patterned after files, in the sense that
+ they exist independent of any process using them or not. Qt is unable to
+ determine if the object is still in use, so auto-removal will remove it
+ even then, which will make attaching to the same object impossible but
+ otherwise not affecting existing attachments.
+
+ Prior to Qt 6.6, Qt never cleaned up POSIX Realtime objects, except on QNX.
+
+ \section3 X/Open System Interfaces (XSI) / System V
+ There are two resources managed by the Qt classes: the file the key refers
+ to and the object itself. QSharedMemory manages the object cooperatively:
+ the last attachment is responsible for removing the object itself and then
+ removing the key file. QSystemSemaphore will remove the object if and only
+ if it was passed QSystemSemaphore::Create; additionally, if it created the
+ key file, it will remove that too.
+
+ Since Qt 6.6, it is possible to ask either class not to clean up.
+
+ \section3 Windows
+ The operating system owns the object and will clean up after the last
+ handle to the object is closed.
+
+ \section1 Interoperability with old Qt applications
+
+ The QNativeIpcKey class was introduced in Qt 6.6. Prior to this version,
+ QSharedMemory and QSystemSemaphore backends were determined at the time of
+ Qt's own build. For Windows systems, it was always the Windows backend. For
+ Unix systems, it defaulted to the System V backend if the configuration
+ script determined it was available. If it was not available, it fell back
+ to the POSIX one. The POSIX backend could be explicitly
+ selected using the \c{-feature-ipc_posix} option to the Qt configure
+ script; if it was enabled, the \c{QT_POSIX_IPC} macro would be defined.
+
+ Qt 6.6 retains the configure script option but it no longer controls the
+ availability of the backends. Instead, it changes what
+ QNativeIpcKey::legacyDefaultTypeForOs() will return. Applications that need
+ to retain compatibility must use this key type exclusively to guarantee
+ interoperability.
+
+ The API in both QSharedMemory and QSystemSemaphore had the concept of a
+ cross-platform key, which is now deprecated in favor of using
+ QSharedMemory::legacyNativeKey() and QSystemSemaphore::legacyNativeKey().
+ Those two functions produce the same native key as the deprecated functions
+ did in prior versions. If the old code was for example:
+
+ \code
+ QSharedMemory shm("org.example.myapplication");
+ QSystemSemaphore sem("org.example.myapplication");
+ \endcode
+
+ It can be updated to be:
+ \code
+ QSharedMemory shm(QSharedMemory::legacyNativeKey("org.example.myapplication"));
+ QSystemSemaphore sem(QSystemSemaphore::legacyNativeKey("org.example.myapplication"));
+ \endcode
+
+ If the two applications exchanged native keys, there is no need to update
+ code such as:
+
+ \code
+ QSharedMemory shm;
+ shm.setNativeKey(key);
+ \endcode
+
+ Though if the older application did accept a native key, the new one may
+ opt to use \c{platformSafeKey()} with a second argument of
+ QNativeIpcKey::legacyDefaultTypeForOs().
+
+ \section3 X/Open System Interfaces (XSI) / System V
+ Never use existing files for QSharedMemory keys, as the old Qt application
+ may attempt to remove it. Instead, let QSharedMemory create it.
+
+ \section1 Interoperability with non-Qt applications
+
+ Interoperability with non-Qt applications is possible, with some limitations:
+ \list
+ \li Creation of shared memory segments must not race
+ \li QSharedMemory support for locking the segment is unavailable
+ \endlist
+
+ Communication with non-Qt applications must always be through the native
+ key.
+
+ QSharedMemory always maps the entire segment to memory. The non-Qt
+ application may choose to only map a subset of it to memory, with no ill
+ effects.
+
+ \section3 POSIX Realtime
+ POSIX shared memory can be opened using
+ \l{https://pubs.opengroup.org/onlinepubs/9699919799/functions/shm_open.html}{shm_open()}
+ and POSIX system semaphores can be opened using
+ \l{https://pubs.opengroup.org/onlinepubs/9699919799/functions/sem_open.html}{sem_open()}.
+
+ Both of those functions take a \c name parameter that is the result of
+ QNativeIpcKey::nativeKey(), encoded for file names using
+ QFile::encodeName() / QFile::decodeName().
+
+ \section3 Windows
+ Windows shared memory objects can be opened using
+ \l{https://learn.microsoft.com/en-us/windows/win32/api/memoryapi/nf-memoryapi-createfilemappingw}{CreateFileMappingW}
+ and Windows system semaphore objects can be opened using
+ \l{https://learn.microsoft.com/en-us/windows/win32/api/synchapi/nf-synchapi-createsemaphorew}{CreateSemaphoreW}.
+ Despite the name of both functions starting with "Create", they are able
+ to attach to existing objects.
+
+ The \c lpName parameter to those functions is the result of
+ QNativeIpcKey::nativeKey(), without transformation.
+
+ If the foreign application uses the non-Unicode version of those functions
+ (ending in "A"), the name can be converted to and from 8-bit using QString.
+
+ \section3 X/Open System Interfaces (XSI) / System V
+ System V shared memory can be obtained using
+ \l{https://pubs.opengroup.org/onlinepubs/9699919799/functions/shmget.html}{shmget()}
+ and System V system semaphores can be obtained using
+ \l{https://pubs.opengroup.org/onlinepubs/9699919799/functions/semget.html}{semget()}.
+
+ The \c{key} parameter to either of those functions is the result of the
+ \l{https://pubs.opengroup.org/onlinepubs/9699919799/functions/ftok.html}{ftok()}
+ function when passed the file name obtained from QNativeIpcKey::nativeKey()
+ with an \c id of 81 or 0x51 (the ASCII capital letter 'Q').
+
+ System V semaphore objects may contain multiple semaphores, but
+ QSystemSemaphore only uses the first one (number 0 for \c{sem_num}).
+
+ Both QSharedMemory and QSystemSemaphore default to removing the object
+ using the \c{IPC_RMID} operation to \c{shmctl()} and \c{semctl()}
+ respectively if they are the last attachment.
+*/
diff --git a/src/corelib/doc/src/java-style-iterators.qdoc b/src/corelib/doc/src/java-style-iterators.qdoc
index 69b9592996..d486b73488 100644
--- a/src/corelib/doc/src/java-style-iterators.qdoc
+++ b/src/corelib/doc/src/java-style-iterators.qdoc
@@ -1,29 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
\page java-style-iterators.html
@@ -71,7 +47,7 @@
\image javaiterators1.png
Here's a typical loop for iterating through all the elements of a
- QList<QString> in order and printing them to the console:
+ QList<QString> in order:
\snippet code/doc_src_containers.cpp 1
diff --git a/src/corelib/doc/src/json.qdoc b/src/corelib/doc/src/json.qdoc
index 9b1070ec67..98ae202cfa 100644
--- a/src/corelib/doc/src/json.qdoc
+++ b/src/corelib/doc/src/json.qdoc
@@ -1,36 +1,12 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
\group json
\title JSON Support in Qt
\ingroup qt-basic-concepts
\brief An overview of JSON support in Qt.
-
+ \ingroup explanations-dataprocessingandio
\ingroup frameworks-technologies
\keyword JSON
@@ -97,8 +73,7 @@
A valid JSON document is either an array or an object, so a document always starts
with a square or curly bracket.
- \sa {JSON Save Game Example}
-
+ \sa {Saving and Loading a Game}
\section1 The JSON Classes
@@ -106,5 +81,4 @@
\l{Implicit Sharing}{implicitly shared classes}.
JSON support in Qt consists of these classes:
-
*/
diff --git a/src/corelib/doc/src/objectmodel/bindableproperties.qdoc b/src/corelib/doc/src/objectmodel/bindableproperties.qdoc
index 391ce4baf7..9b3ea6ae66 100644
--- a/src/corelib/doc/src/objectmodel/bindableproperties.qdoc
+++ b/src/corelib/doc/src/objectmodel/bindableproperties.qdoc
@@ -1,29 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
\page bindableproperties.html
@@ -56,7 +32,7 @@
different objects.
The \l {Introductory Example} below demonstrates the usage of bindable
- properties in C++ code. You can also check \l {Bindable Properties Example}
+ properties in C++ code. You can also check \l {Bindable Properties} example
to see how the bindable properties can help to improve your code.
\section1 Introductory Example
@@ -271,4 +247,18 @@
be called for the current value of the property, register your callback using
subscribe() instead.
+ \section1 Interaction with Q_PROPERTYs
+
+ A \l {The Property System}{Q_PROPERTY} that defines \c BINDABLE can be bound and
+ used in binding expressions. You can implement such properties using \l {QProperty},
+ \l {QObjectBindableProperty}, or \l {QObjectComputedProperty}.
+
+ Q_PROPERTYs without \c BINDABLE can also be bound and be used in binding expressions,
+ as long as they define a \c NOTIFY signal. You must wrap the property in a \l QBindable
+ using the \c {QBindable(QObject* obj, const char* property)} constructor. Then, the
+ property can be bound using \l QBindable::setBinding() or used in a binding
+ expression via \l QBindable::value(). You must use \c QBindable::value() in binding
+ expressions instead of the normal property \c READ function (or \c MEMBER) to enable
+ dependency tracking if the property is not \c BINDABLE.
+
*/
diff --git a/src/corelib/doc/src/objectmodel/metaobjects.qdoc b/src/corelib/doc/src/objectmodel/metaobjects.qdoc
index ada6a6dea1..3d7685447f 100644
--- a/src/corelib/doc/src/objectmodel/metaobjects.qdoc
+++ b/src/corelib/doc/src/objectmodel/metaobjects.qdoc
@@ -1,35 +1,11 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
\page metaobjects.html
\title The Meta-Object System
\brief An overview of Qt's meta-object system and introspection capabilities.
-
+ \ingroup explanations-basics
\ingroup qt-basic-concepts
\keyword meta-object
\keyword Meta-Object System
diff --git a/src/corelib/doc/src/objectmodel/object.qdoc b/src/corelib/doc/src/objectmodel/object.qdoc
index 2dd2594ae4..7b6b840df0 100644
--- a/src/corelib/doc/src/objectmodel/object.qdoc
+++ b/src/corelib/doc/src/objectmodel/object.qdoc
@@ -1,29 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
\page object.html
diff --git a/src/corelib/doc/src/objectmodel/objecttrees.qdoc b/src/corelib/doc/src/objectmodel/objecttrees.qdoc
index 29e2393e57..8939a534d4 100644
--- a/src/corelib/doc/src/objectmodel/objecttrees.qdoc
+++ b/src/corelib/doc/src/objectmodel/objecttrees.qdoc
@@ -1,29 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
\page objecttrees.html
diff --git a/src/corelib/doc/src/objectmodel/properties.qdoc b/src/corelib/doc/src/objectmodel/properties.qdoc
index e73bf0cebc..99a3e60d88 100644
--- a/src/corelib/doc/src/objectmodel/properties.qdoc
+++ b/src/corelib/doc/src/objectmodel/properties.qdoc
@@ -1,35 +1,11 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
\page properties.html
\title The Property System
\brief An overview of Qt's property system.
-
+ \ingroup explanations-basics
\ingroup qt-basic-concepts
\keyword Qt's Property System
@@ -68,14 +44,21 @@
specified. It is for reading the property value. Ideally, a const function
is used for this purpose, and it must return either the property's type or a
const reference to that type. e.g., QWidget::focus is a read-only
- property with \c READ function, QWidget::hasFocus().
+ property with \c READ function, QWidget::hasFocus(). If a \c BINDABLE is
+ specified, you can write \c{READ default} to have the \c READ accessor
+ generated from the \c BINDABLE.
\li A \c WRITE accessor function is optional. It is for setting the
property value. It must return void and must take exactly one
argument, either of the property's type or a pointer or reference
to that type. e.g., QWidget::enabled has the \c WRITE function
QWidget::setEnabled(). Read-only properties do not need \c WRITE
- functions. e.g., QWidget::focus has no \c WRITE function.
+ functions. e.g., QWidget::focus has no \c WRITE function. If you specify
+ both a \c BINDABLE and \c{WRITE default}, a \c WRITE accessor will be
+ generated from the \c BINDABLE. The generated \c WRITE accessor will \e not
+ explicitly emit any signal declared with \c NOTIFY. You should register
+ the signal as change handler to the \c BINDABLE, for example using
+ \l{Q_OBJECT_BINDABLE_PROPERTY}.
\li A \c MEMBER variable association is required if no \c READ accessor
function is specified. This makes the given member variable
@@ -99,8 +82,9 @@
which must be of the same type as the property. The parameter will take the
new value of the property. The \c NOTIFY signal should only be emitted when
the property has really been changed, to avoid bindings being unnecessarily
- re-evaluated in QML, for example. Qt emits automatically that signal when
- needed for MEMBER properties that do not have an explicit setter.
+ re-evaluated in QML, for example. The signal is emitted automatically when
+ the property is changed via the Qt API (QObject::setProperty,
+ QMetaProperty, etc.), but not when the MEMBER is changed directly.
\li A \c REVISION number or \c REVISION() macro is optional. If included,
it defines the property and its notifier signal to be used in a particular
@@ -109,7 +93,7 @@
\li The \c DESIGNABLE attribute indicates whether the property
should be visible in the property editor of GUI design tool (e.g.,
- \l {Qt Designer Manual}{Qt Designer}). Most properties are \c DESIGNABLE
+ \l {Qt Widgets Designer Manual}{\QD}). Most properties are \c DESIGNABLE
(default true). Valid values are true and false.
\li The \c SCRIPTABLE attribute indicates whether this property
@@ -224,7 +208,10 @@
The \c READ function is const and returns the property type. The
\c WRITE function returns void and has exactly one parameter of
the property type. The meta-object compiler enforces these
- requirements.
+ requirements. The equality check in the \c WRITE function, while not
+ mandatory, is good practice as there is no point in notifying and
+ potentially forcing re-evaluation in other places if nothing has
+ changed.
Given a pointer to an instance of MyClass or a pointer to a
QObject that is an instance of MyClass, we have two ways to set
@@ -290,7 +277,9 @@
Connected to the property system is an additional macro,
Q_CLASSINFO(), that can be used to attach additional
- \e{name}--\e{value} pairs to a class's meta-object, for example:
+ \e{name}--\e{value} pairs to a class's meta-object. This is
+ used for instance to mark a property as the \e default one
+ in the context of \l{QML Object Types}:
\snippet code/doc_src_properties.cpp 7
@@ -312,5 +301,5 @@
and the general tips on implementing and using
\l {Qt Bindable Properties}{bindable properties}.
- \sa {Qt Bindable Properties}
+ \sa {Qt Bindable Properties}, {Defining QML Types from C++}
*/
diff --git a/src/corelib/doc/src/objectmodel/signalsandslots.qdoc b/src/corelib/doc/src/objectmodel/signalsandslots.qdoc
index 85fe4df2ce..f0eeb20048 100644
--- a/src/corelib/doc/src/objectmodel/signalsandslots.qdoc
+++ b/src/corelib/doc/src/objectmodel/signalsandslots.qdoc
@@ -1,29 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
\page signalsandslots.html
@@ -32,7 +8,7 @@
\ingroup qt-basic-concepts
\brief An overview of Qt's signals and slots inter-object
communication mechanism.
-
+ \ingroup explanations-basics
Signals and slots are used for communication between objects. The
signals and slots mechanism is a central feature of Qt and
probably the part that differs most from the features provided by
@@ -133,8 +109,7 @@
when the signal is emitted.
Signals are automatically generated by the \l moc and must not be
- implemented in the \c .cpp file. They can never have return types
- (i.e. use \c void).
+ implemented in the \c .cpp file.
A note about arguments: Our experience shows that signals and slots
are more reusable if they do not use special types. If
@@ -321,8 +296,7 @@
callbacks, you'd have to find five different names and keep track
of the types yourself.
- \sa QLCDNumber, QObject::connect(), {Digital Clock Example},
- {Tetrix Example}
+ \sa QLCDNumber, QObject::connect()
\section1 Signals And Slots With Default Arguments
@@ -412,8 +386,12 @@
\section2 Using Qt with 3rd Party Signals and Slots
It is possible to use Qt with a 3rd party signal/slot mechanism.
- You can even use both mechanisms in the same project. Just add the
- following line to your qmake project (.pro) file.
+ You can even use both mechanisms in the same project. To do that,
+ write the following into your CMake project file:
+
+ \snippet code/doc_src_containers.cpp cmake_no_keywords
+
+ In a qmake project (.pro) file, you need to write:
\snippet code/doc_src_containers.cpp 22
@@ -423,4 +401,19 @@
with the \c{no_keywords} flag, simply replace all uses of the Qt
moc keywords in your sources with the corresponding Qt macros
Q_SIGNALS (or Q_SIGNAL), Q_SLOTS (or Q_SLOT), and Q_EMIT.
-*/
+
+ \section2 Signals and slots in Qt-based libraries
+
+ The public API of Qt-based libraries should use the keywords
+ \c{Q_SIGNALS} and \c{Q_SLOTS} instead of \c{signals} and
+ \c{slots}. Otherwise it is hard to use such a library in a project
+ that defines \c{QT_NO_KEYWORDS}.
+
+ To enforce this restriction, the library creator may set the
+ preprocessor define \c{QT_NO_SIGNALS_SLOTS_KEYWORDS} when building
+ the library.
+
+ This define excludes signals and slots without affecting whether
+ other Qt-specific keywords can be used in the library
+ implementation.
+ */
diff --git a/src/corelib/doc/src/plugin-classes.qdoc b/src/corelib/doc/src/plugin-classes.qdoc
index 3becad48be..dab3e74e82 100644
--- a/src/corelib/doc/src/plugin-classes.qdoc
+++ b/src/corelib/doc/src/plugin-classes.qdoc
@@ -1,29 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
\group plugins
diff --git a/src/corelib/doc/src/qt6-changes.qdoc b/src/corelib/doc/src/qt6-changes.qdoc
index 5d9999abf3..011568ef75 100644
--- a/src/corelib/doc/src/qt6-changes.qdoc
+++ b/src/corelib/doc/src/qt6-changes.qdoc
@@ -1,35 +1,11 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
\page qtcore-changes-qt6.html
\title Changes to Qt Core
\ingroup changes-qt-5-to-6
- \brief Migrate Qt Core to Qt 6.
+ \brief Changes to containers, strings, serialization and I/O classes.
Qt 6 is a result of the conscious effort to make the framework more
efficient and easy to use.
@@ -337,23 +313,10 @@
In Qt6 \l QStringRef got removed from Qt Core. To ease porting of existing
applications without touching the whole code-base, the \c QStringRef class
did not vanish completely and instead it got moved into the Qt5Compat module.
-
- If you want to use \c QStringRef further, you need to link against the new
- Qt5Compat module and add this line to your \l qmake \c .pro file:
- \code
- QT += core5compat
- \endcode
-
- In case you already ported your application or library to the
- \l {Build with CMake}{cmake} build system, add the following to your
- \c CMakeList.txt:
- \code
- PUBLIC_LIBRARIES
- Qt::Core5Compat
- \endcode
+ If you want to use \c QStringRef further, see \l {Using the Qt5Compat module}.
Unfortunately, some methods exposed by \l QString returning a \c QStringRef,
- could not be moved to Qt5Compat. Therefore some manually porting may be
+ could not be moved to Qt5Compat. Therefore some manual porting may be
needed. If your code uses one or more of the following functions you need to
port them to use \l QStringView or \l QStringTokenizer. It is also
recommended to use \l {QStringView::tokenize} over \l {QStringView::split}
@@ -565,273 +528,22 @@
\section2 The QRegularExpression class
- In Qt6, all methods taking the \c QRegExp got removed from our code-base.
- Therefore it is very likely that you will have to port your application or
- library to \l QRegularExpression.
-
- \l QRegularExpression implements Perl-compatible regular expressions. It
- fully supports Unicode. For an overview of the regular expression syntax
- supported by \l QRegularExpression, please refer to the aforementioned
- pcrepattern(3) man page. A regular expression is made up of two things: a
- pattern string and a set of pattern options that change the meaning of the
- pattern string.
-
- There are some subtle differences between \l QRegularExpression and \c
- QRegExp that will be explained by this document to ease the porting effort.
-
- \l QRegularExpression is more strict when it comes to the syntax of the
- regular expression. Therefore it is always good to check the expression
- for \l {QRegularExpression::isValid}{validity}.
-
- \l QRegularExpression can almost always be declared const (except when the
- pattern changes), while \c QRegExp almost never could be.
-
- There is no replacement for the \l {QRegExp::CaretMode}{CaretMode}
- enumeration. The \l {QRegularExpression::AnchoredMatchOption} match option
- can be used to emulate the QRegExp::CaretAtOffset behavior. There is no
- equivalent for the other QRegExp::CaretMode modes.
-
- \l QRegularExpression supports only Perl-compatible regular expressions.
- Still, it does not support all the features available in Perl-compatible
- regular expressions. The most notable one is the fact that duplicated names
- for capturing groups are not supported, and using them can lead to
- undefined behavior. This may change in a future version of Qt.
-
- \section3 Wildcard matching
-
- There is no direct way to do wildcard matching in \l QRegularExpression.
- However, the \l {QRegularExpression::wildcardToRegularExpression} method
- is provided to translate glob patterns into a Perl-compatible regular
- expression that can be used for that purpose.
-
- For example, if you have code like
-
- \code
- QRegExp wildcard("*.txt");
- wildcard.setPatternSyntax(QRegExp::Wildcard);
- \endcode
-
- you can rewrite it as
-
- \code
- auto wildcard = QRegularExpression(QRegularExpression::wildcardToRegularExpression("*.txt"));
- \endcode
-
- Please note though that not all shell like wildcard pattern might be
- translated in a way you would expect it. The following example code will
- silently break if simply converted using the above mentioned function:
-
- \code *
- const QString fp1("C:/Users/dummy/files/content.txt");
- const QString fp2("/home/dummy/files/content.txt");
-
- QRegExp re1("\1/files/*");
- re1.setPatternSyntax(QRegExp::Wildcard);
- ... = re1.exactMatch(fp1); // returns true
- ... = re1.exactMatch(fp2); // returns true
-
- // but converted with QRegularExpression::wildcardToRegularExpression()
-
- QRegularExpression re2(QRegularExpression::wildcardToRegularExpression("\1/files/*"));
- ... = re2.match(fp1).hasMatch(); // returns false
- ... = re2.match(fp2).hasMatch(); // returns false
- \endcode
-
- \section3 Searching forward
-
- Forward searching inside a string was usually implemented with a loop using
- \c {QRegExp::indexIn} and a growing offset, but can now be easily implemented
- with \l QRegularExpressionMatchIterator or \l {QString::indexOf}.
-
- For example, if you have code like
-
- \code
- QString subject("the quick fox");
-
- int offset = 0;
- QRegExp re("(\\w+)");
- while ((offset = re.indexIn(subject, offset)) != -1) {
- offset += re.matchedLength();
- // ...
- }
- \endcode
-
- you can rewrite it as
-
- \code
- QRegularExpression re("(\\w+)");
- QString subject("the quick fox");
-
- QRegularExpressionMatchIterator i = re.globalMatch(subject);
- while (i.hasNext()) {
- QRegularExpressionMatch match = i.next();
- // ...
- }
-
- // or alternatively using QString::indexOf
-
- qsizetype from = 0;
- QRegularExpressionMatch match;
- while ((from = subject.indexOf(re, from, &match)) != -1) {
- from += match.capturedLength();
- // ...
- }
- \endcode
-
- \section3 Searching backwards
-
- Backwards searching inside a string was usually often implemented as a loop
- over \c {QRegExp::lastIndexIn}, but can now be easily implemented using
- \l {QString::lastIndexOf} and \l {QRegularExpressionMatch}.
-
- \note \l QRegularExpressionMatchIterator is not capable of performing a
- backwards search.
-
- For example, if you have code like
-
- \code
- int offset = -1;
- QString subject("Lorem ipsum dolor sit amet, consetetur sadipscing.");
-
- QRegExp re("\\s+([ids]\\w+)");
- while ((offset = re.lastIndexIn(subject, offset)) != -1) {
- --offset;
- // ...
- }
- \endcode
-
- you can rewrite it as
-
- \code
- qsizetype from = -1;
- QString subject("Lorem ipsum dolor sit amet, consetetur sadipscing.");
-
- QRegularExpressionMatch match;
- QRegularExpression re("\\s+([ids]\\w+)");
- while ((from = subject.lastIndexOf(re, from, &match)) != -1) {
- --from;
- // ...
- }
- \endcode
-
- \section3 exactMatch vs. match.hasMatch
-
- \c {QRegExp::exactMatch} served two purposes: it exactly matched a regular
- expression against a subject string, and it implemented partial matching.
- Exact matching indicates whether the regular expression matches the entire
- subject string. For example:
-
- \code
- QString source("abc123");
-
- QRegExp("\\d+").exactMatch(source); // returns false
- QRegExp("[a-z]+\\d+").exactMatch(source); // returns true
-
- QRegularExpression("\\d+").match(source).hasMatch(); // returns true
- QRegularExpression("[a-z]+\\d+").match(source).hasMatch(); // returns true
- \endcode
-
- Exact matching is not reflected in \l QRegularExpression. If you want to be
- sure that the subject string matches the regular expression exactly, you
- can wrap the pattern using the \l {QRegularExpression::anchoredPattern}
- function:
-
- \code
- QString source("abc123");
-
- QString pattern("\\d+");
- QRegularExpression(pattern).match(source).hasMatch(); // returns true
-
- pattern = QRegularExpression::anchoredPattern(pattern);
- QRegularExpression(pattern).match(source).hasMatch(); // returns false
- \endcode
-
- \section3 Minimal matching
-
- \c QRegExp::setMinimal() implemented minimal matching by simply reversing
- the greediness of the quantifiers (\c QRegExp did not support lazy
- quantifiers, like *?, +?, etc.). QRegularExpression instead does support
- greedy, lazy and possessive quantifiers. The \l
- {QRegularExpression::InvertedGreedinessOption} pattern option can be useful
- to emulate the effects of \c QRegExp::setMinimal(): if enabled, it inverts
- the greediness of quantifiers (greedy ones become lazy and vice versa).
-
- \section3 Different pattern syntax
-
- Porting a regular expression from \c QRegExp to \l QRegularExpression may
- require changes to the pattern itself. Therefore it is recommended to check
- the pattern used with the \l {QRegularExpression::isValid} method. This is
- especially important for user provided pattern or pattern not controlled by
- the developer.
-
- In other cases, a pattern ported from \c QRegExp to \l QRegularExpression may
- silently change semantics. Therefore, it is necessary to review the patterns
- used. The most notable cases of silent incompatibility are:
-
- \list
- \li Curly braces are needed in order to use a hexadecimal escape like \c
- {\xHHHH} with more than 2 digits. A pattern like \c {\x2022} needs
- to be ported to \c {\x{2022}}, or it will match a space \c {(0x20)}
- followed by the string \c {"22"}. In general, it is highly recommended
- to always use curly braces with the \c {\x} escape, no matter the
- amount of digits specified.
-
- \li A \c{0-to-n} quantification like \c {{,n}} needs to be ported to
- \c {{0,n}} to preserve semantics. Otherwise, a pattern such as
- \c {\d{,3}} would actually match a digit followed by the exact
- string \c {"{,3}"}.
- \endlist
-
- \section3 Partial Matching
+ In Qt 6, the \c QRegExp type has been retired to the Qt5Compat module
+ and all Qt APIs using it have been removed from other modules.
+ Client code which used it can be ported to use \l QRegularExpression
+ in its place. As \l QRegularExpression is present already in Qt 5,
+ this can be done and tested before migration to Qt 6.
- When using \c QRegExp::exactMatch(), if an exact match was not found, one
- could still find out how much of the subject string was matched by the
- regular expression by calling \c QRegExp::matchedLength(). If the returned
- length was equal to the subject string's length, then one could conclude
- that a partial match was found.
- \l QRegularExpression supports partial matching explicitly by means of the
- appropriate \l {QRegularExpression::MatchType}.
-
- \section3 Global matching
-
- Due to limitations of the \c QRegExp API it was impossible to implement
- global matching correctly (that is, like Perl does). In particular, patterns
- that can match zero characters (like "a*") are problematic. \l
- {QRegularExpression::wildcardToRegularExpression} implements Perl global
- match correctly, and the returned iterator can be used to examine each
- result.
-
- \section3 Unicode properties support
-
- When using \c QRegExp, character classes such as \c{\w}, \c{\d}, etc. match
- characters with the corresponding Unicode property: for instance, \c{\d}
- matches any character with the Unicode Nd (decimal digit) property. Those
- character classes only match ASCII characters by default. When using \l
- QRegularExpression: for instance, \c{\d} matches exactly a character in the
- 0-9 ASCII range. It is possible to change this behavior by using the \l
- {QRegularExpression::UseUnicodePropertiesOption}
- pattern option.
+ \include corelib/port-from-qregexp.qdocinc porting-to-qregularexpression
\section2 The QRegExp class
In Qt6 \l QRegExp got removed from Qt Core. If your application cannot be
ported right now, \c QRegExp still exists in Qt5Compat to keep these
- code-bases working. If you want to use \c QRegExp further, you need to link
- against the new Qt5Compat module and add this line to your \l qmake \c .pro
- file:
- \code
- QT += core5compat
- \endcode
+ code-bases working. If you want to use \c QRegExp further, see
+ \l {Using the Qt5Compat module}.
- In case you already ported your application or library to the
- \l {Build with CMake}{cmake} build system, add the following to your
- \c CMakeList.txt:
- \code
- PUBLIC_LIBRARIES
- Qt::Core5Compat
- \endcode
-
- \section2 QEvent and subclasses
+ \section1 QEvent and subclasses
The QEvent class defined a copy constructor and an assignment operator,
in spite of being a polymorphic class. Copying classes with virtual methods
@@ -870,6 +582,19 @@
pointer-to-implementation pattern), then you will have to implement
custom copy semantics.
+ \section1 Serialization classes
+
+ In Qt 6, QJsonDocument methods for converting it to/from Qt's legacy
+ JSON binary format were removed in favor of the standardized CBOR format.
+ Qt JSON types can be converted to Qt CBOR types, which can in turn be
+ serialized into the CBOR binary format and vice versa. See, for example,
+ \l QCborValue::fromJsonValue() and \l QCborValue::toJsonValue().
+
+ If you still need to use the binary JSON format, you can use the
+ replacements provided in the Qt5Compat module. They can be found in the
+ \l QBinaryJson namespace. See \l {Using the Qt5Compat module} to find out
+ how to use the module in your application.
+
\section1 Other classes
In Qt 5, QCoreApplication::quit() was equivalent to calling
@@ -883,4 +608,27 @@
QLibraryInfo::location() and QLibraryInfo::Location were deprecated due to inconsistent
naming. Use the new API QLibraryInfo::path() and QLibraryInfo::LibraryPath instead.
+
+ \section1 Qt State Machine Framework
+
+ \l {Qt State Machine} was moved into the Qt SCXML module (soon to be renamed to Qt
+ State Machines) and therefore it is no longer part of Qt Core. There were very few
+ cross dependencies inside Qt Core which ultimately led to this decision.
+
+ \section1 Using the Qt5Compat module
+
+ To use the \l {Qt 5 Core Compatibility APIs}{Qt5Compat} module, you need
+ to build with its headers in your include path and link against its library.
+ If you are using \l qmake, add the following to your \c .pro file:
+
+ \code
+ QT += core5compat
+ \endcode
+
+ If you build your application or library using \l {Build with CMake}{cmake},
+ add the following to your \c CMakeList.txt:
+ \code
+ PUBLIC_LIBRARIES
+ Qt::Core5Compat
+ \endcode
*/
diff --git a/src/corelib/doc/src/qtcore-index.qdoc b/src/corelib/doc/src/qtcore-index.qdoc
index 390c44ab63..38452e1b2b 100644
--- a/src/corelib/doc/src/qtcore-index.qdoc
+++ b/src/corelib/doc/src/qtcore-index.qdoc
@@ -1,29 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
\page qtcore-index.html
@@ -38,8 +14,8 @@
\li a very powerful mechanism for seamless object communication called
signals and slots
\li queryable and designable object properties
- \li hierarchical and queryable object trees that organize
- \li object ownership in a natural way with guarded pointers (QPointer)
+ \li hierarchical and queryable object trees that organize object ownership
+ in a natural way with guarded pointers (QPointer)
\li a dynamic cast that works across library boundaries
\endlist
@@ -52,14 +28,17 @@
\li \l{Signals & Slots}
\endlist
- \include module-use.qdocinc using qt module
- \quotefile overview/using-qt-core.cmake
+ \section1 Using the Module
- See also the \l {Build with CMake} overview.
+ \include {module-use.qdocinc} {using the c++ api}
+
+ \section2 Building with CMake
+
+ \include {module-use.qdocinc} {building with cmake} {Core}
\section2 Building with qmake
- If you use \l qmake to build your projects, Qt6Core is linked by default.
+ If you use \l qmake to build your projects, Qt Core is linked by default.
\section1 Threading and Concurrent Programming
@@ -96,35 +75,15 @@
\list
\li \l{The Animation Framework}
\li \l{JSON Support in Qt}
+ \li \l{CBOR Support in Qt}
+ \li \l{Inter-Process Communication}
\li \l{How to Create Qt Plugins}
\li \l{The Event System}
+ \li \l{Application Permissions}
\endlist
- \section1 Module Evolution
-
- \l{Changes to Qt Core} lists important changes in the module API
- and functionality that were done for the Qt 6 series of Qt.
-
- \section1 Licenses and Attributions
-
- Qt Core is available under commercial licenses from \l{The Qt Company}.
- In addition, it is available under free software licenses:
- The \l{GNU Lesser General Public License, version 3}, or
- the \l{GNU General Public License, version 2}.
- See \l{Qt Licensing} for further details.
-
- Executables on Windows potentially link
- against \l{The QtEntryPoint Library}. This library is available
- under commercial licenses and also under the
- \l{BSD 3-clause "New" or "Revised" License}.
-
- Furthermore, Qt Core in Qt \QtVersion may contain third party
- modules under following permissive licenses:
-
- \generatelist{groupsbymodule attributions-qtcore}
-
\section1 Reference
- These are links to the API reference materials.
+
\list
\li \l{Qt Core C++ Classes}{C++ Classes}
\list
@@ -144,4 +103,26 @@
\endlist
\endlist
+ \section1 Module Evolution
+
+ \l{Changes to Qt Core} lists important changes in the module API
+ and functionality that were made for the Qt 6 series of Qt.
+
+ \section1 Licenses and Attributions
+
+ Qt Core is available under commercial licenses from \l{The Qt Company}.
+ In addition, it is available under free software licenses:
+ The \l{GNU Lesser General Public License, version 3}, or
+ the \l{GNU General Public License, version 2}.
+ See \l{Qt Licensing} for further details.
+
+ Executables on Windows potentially link
+ against \l{The QtEntryPoint Library}. This library is available
+ under commercial licenses and also under the
+ \l{BSD 3-clause "New" or "Revised" License}.
+
+ Furthermore, Qt Core in Qt \QtVersion may contain third party
+ modules under the following permissive licenses:
+
+ \generatelist{groupsbymodule attributions-qtcore}
*/
diff --git a/src/corelib/doc/src/qtcore.qdoc b/src/corelib/doc/src/qtcore.qdoc
index 483f39b77a..a46add1342 100644
--- a/src/corelib/doc/src/qtcore.qdoc
+++ b/src/corelib/doc/src/qtcore.qdoc
@@ -1,29 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
\module QtCore
@@ -38,3 +14,21 @@
The \l{Qt Core} page contains information about how to use the module.
*/
+
+/*!
+ \module QtCorePrivate
+ \title Qt Core Private C++ Classes
+ \qtvariable core-private
+ \preliminary
+ \brief Provides private core functionality.
+
+//! [qtcoreprivate-usage]
+ When building with CMake, use the following commands to use
+ private Qt Core APIs:
+
+ \badcode
+ find_package(Qt6 REQUIRED COMPONENTS Core)
+ target_link_libraries(mytarget PRIVATE Qt6::CorePrivate)
+ \endcode
+//! [qtcoreprivate-usage]
+*/
diff --git a/src/corelib/doc/src/qtserialization.qdoc b/src/corelib/doc/src/qtserialization.qdoc
new file mode 100644
index 0000000000..14ee5e7a9c
--- /dev/null
+++ b/src/corelib/doc/src/qtserialization.qdoc
@@ -0,0 +1,145 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
+
+/*!
+ \page qtserialization.html
+ \title Qt Serialization
+ \brief Serializations provided by Qt API
+
+ The purpose of serialization is to save the state of an object to be able to
+ recreate it when needed. It allows you to perform actions like:
+
+ \list
+ \li Sending the object to a remote application by using a web service
+ \li Passing the object as a JSON or XML string
+ \li Saving and restoring user information or sharing it across applications
+ \endlist
+
+ The Qt API provides support for serialization for several use cases:
+
+ \list
+ \li \l JSON support in Qt provides an easy to use C++ API to parse, modify
+ and save JSON data. \l {CBOR} {CBOR Support in Qt} is a compact form
+ of binary data encoding that is a superset of JSON.
+ \li \l QDataStream provides serialization of binary data to a QIODevice
+ \li \l {Qt XML C++ Classes} provide C++ implementations of the \l {XML Streaming}
+ and DOM standards for XML
+ \li \l CBOR is Qt's implementation for the CBOR serialization format.
+ \li \l QSettings provides a way of serializing and storing platform independent
+ application settings.
+ \endlist
+
+ \section1 Advantages of JSON and CBOR
+
+ When you use \l JSON information is stored in a QJsonObject and a QJsonDocument
+ takes care to stream values into a QByteArray.
+
+ For example
+ \code
+ QJsonObject jobject;
+ jobject["SensorID"] = m_id;
+ jobject["AmbientTemperature"] = m_ambientTemperature;
+ jobject["ObjectTemperature"] = m_objectTemperature;
+ jobject["AccelerometerX"] = m_accelerometerX;
+ jobject["AccelerometerY"] = m_accelerometerY;
+ jobject["AccelerometerZ"] = m_accelerometerZ;
+ jobject["Altitude"] = m_altitude;
+ jobject["Light"] = m_light;
+ jobject["Humidity"] = m_humidity;
+ QJsonDocument doc( jobject );
+
+ return doc.toJson();
+ \endcode
+
+ JSON has several advantages:
+
+ \list
+ \li Textual JSON is declarative, which makes it readable to humans
+ \li The information is structured
+ \li Exchanging generic information is easy
+ \li JSON allows extending messages with additional values
+ \li Many solutions exist to receive and parse JSON in cloud-based solutions
+ \endlist
+
+ \l CBOR is the Concise Binary Object Representation, a very compact form of
+ binary data encoding that is a superset of JSON. It was created by the IETF
+ Constrained RESTful Environments (CoRE) WG, which has been used in many new
+ RFCs. CBOR shares many of the advantages of JSON, but sacrifices human
+ readability for compactness.
+
+ \section1 Advantages of QDataStream Classes
+
+ \l QDataStream is a viable option when the whole flow of data is determined
+ and not about to change. In addition, both the reader and the writer of the
+ data must be written in Qt.
+
+ Adding support for this to a class requires two additional operators.
+ For example, for a class named SensorInformation:
+
+ \code
+ QDataStream &operator<<(QDataStream &, const SensorInformation &);
+ QDataStream &operator>>(QDataStream &, SensorInformation &);
+ \endcode
+
+ The implementation for the serialization is shown below:
+
+ \code
+ QDataStream &operator<<(QDataStream &out, const SensorInformation &item)
+ {
+ QDataStream::FloatingPointPrecision prev = out.floatingPointPrecision();
+ out.setFloatingPointPrecision(QDataStream::DoublePrecision);
+ out << item.m_id
+ << item.m_ambientTemperature
+ << item.m_objectTemperature
+ << item.m_accelerometerX
+ << item.m_accelerometerY
+ << item.m_accelerometerZ
+ << item.m_altitude
+ << item.m_light
+ << item.m_humidity;
+ out.setFloatingPointPrecision(prev);
+ return out;
+ }
+ \endcode
+
+ Deserialization works similarly, but using the \c {>>} operator.
+ For example, \c {out >> item.m_id}, and so on.
+
+ Usually, using QDataStream is faster than using textual JSON.
+
+ \section1 Advantages of Qt XML C++ Classes
+
+ Qt provides both DOM classes and stream-based classes to read and write
+ XML content.
+
+ Qt provides the QDomDocument class that represents the XML document and
+ two classes for reading and writing the XML through a simple streaming API:
+ QXmlStreamReader and QXmlStreamWriter.
+
+ \section2 The DOM XML Classes
+
+ QDomDocument class represents the entire XML document. It is the root of the
+ document tree and provides primary access to the document's data.
+
+ \section2 The Stream-Based XML Classes
+
+ A stream reader reports an XML document as a stream of tokens. This differs
+ from SAX as SAX applications provide handlers to receive XML events from the
+ parser, whereas the QXmlStreamReader drives the loop, pulling tokens from the
+ reader when they are needed. This pulling approach makes it possible to build
+ recursive descent parsers, allowing XML parsing code to be split into
+ different methods or classes.
+
+ QXmlStreamReader a parser for well-formed XML 1.0, excluding external parsed
+ entities. Hence, data provided to the stream reader adheres to the
+ W3C's criteria for well-formed XML, or an error will be raised. Functions
+ such as \c atEnd(), \c error(), and \c hasError() can be used to test for
+ such errors and obtain a description of them.
+
+ The QXmlStreamWriter is a streaming API that takes care of prefixing namespaces,
+ when the namespaceUri is specified when writing elements or attributes.
+
+ \section1 Classes that Provide Serialization
+
+ \annotatedlist qtserialization
+*/
diff --git a/src/corelib/doc/src/resource-system.qdoc b/src/corelib/doc/src/resource-system.qdoc
index 6e22757857..7c7613c9b8 100644
--- a/src/corelib/doc/src/resource-system.qdoc
+++ b/src/corelib/doc/src/resource-system.qdoc
@@ -1,29 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
\page resources.html
@@ -41,7 +17,7 @@
Most commonly, the resource files are embedded into your application
executable, or in libraries and plugins that are loaded by the application
executable. Alternatively, the resource files can also be stored in an
- \l{External Resource Files}{exernal resource file}.
+ \l{External Resource Files}{external resource file}.
The resource system is based on tight cooperation between Qt's \l rcc
resource compiler, the build system, and the Qt runtime API.
@@ -83,8 +59,8 @@
the \c .qrc file.
The path is also used by default to identify the file's content at runtime.
- That is, the file \c copy.png will be available in the resource system as
- \c{:/images/copy.png} or \c{qrc:/images/copy.png}.
+ That is, the file \c titlebarLeft.png will be available in the resource system as
+ \c{:/res/titlebarLeft.png} or \c{qrc:/res/titlebarLeft.png}.
To override this default run-time name, see \l{Prefixes} and \l{Aliases}.
\e{Qt Creator}, \e{Qt Design Studio}, \QD, and \e{Qt Visual Studio Tools}
@@ -126,13 +102,16 @@
variable. If you add a \c .qrc file path to the variable, the listed
resource files will be embedded into the generated library or executable:
- \snippet resource-system/application.pro 0
+ \snippet resource-system/application.pro qrc
- For simple applications, it is also possible to let qmake generate the
- \c .qrc file for you, avoiding the need for an additional file to be
- maintained:
+ This creates a resource of several \c{.png} files, that are addressable
+ like this: \c{":/res/titlebarLeft.png"}.
- \snippet resource-system/application.pro 1
+ If the directory layout of the files you want to embed into the resource
+ doesn't match the expectations of the application, you can specify
+ \c{resources.base}. \c base is a path prefix that denotes the root point of
+ the file's alias. In the example above, if \c{resources.base} is set to
+ \c{"res"}, then \c{titlebarLeft.png} is addressable as \c{":/titlebarLeft.png"}.
\section1 Runtime API
@@ -151,9 +130,6 @@
\snippet resource-system/main.cpp url
- See the \l{mainwindows/application}{Application} example for an actual
- application that uses Qt's resource system to store its icons.
-
\section1 Advanced Topics
\section2 Prefixes
@@ -181,6 +157,25 @@
The file is from the application then only accessible as \c :/cut-img.png
or \c{qrc:/cut-img.png}.
+ \section2 Discarding the file contents
+
+ Sometimes you want to add a file node to the resource file system but
+ don't actually want to add the file contents. \c .qrc files allow this
+ by setting the \c empty attribute to \c{true}.
+
+ \snippet code/doc_src_resources.qdoc 4
+
+ The resulting file is then still accessible from the application, but
+ its contents are empty.
+
+ This is useful to strip QML source code from an application binary.
+
+ \note If you omit the QML source code from the binary, the QML engine has to
+ rely on the compilation units created by \l{qmlcachegen} or \l{qmlsc}.
+ Those are tied to the specific version of Qt they were built with. If you
+ change the version of Qt your application uses, they can't be loaded
+ anymore.
+
\section2 Language Selectors
Some resources need to change based on the user's locale, such as
@@ -212,14 +207,7 @@
resource file's content and metadata is then done after the compilation and
linking phase, through another rcc call.
- For qmake, this is enabled by adding \c resources_big to the \c CONFIG
- variable:
-
- \snippet resource-system/application.pro 2
-
- For CMake, you need to use the \l{qt_add_big_resources} function:
-
- \snippet resource-system/CMakeLists.txt qt_add_big_resources
+ For CMake, you need to use the \l{qt_add_big_resources} function.
\section2 External Resource Files
@@ -247,13 +235,13 @@
resource compiler \l rcc:
\code
- rcc -g python application.qrc > application_rc.py
+ rcc -g python mainwindow.qrc > mainwindow_rc.py
\endcode
The module can then be imported in the application:
\code
- import application_rc.py
+ import mainwindow_rc.py
\endcode
\section2 Compression
diff --git a/src/corelib/doc/src/timers.qdoc b/src/corelib/doc/src/timers.qdoc
index f54d2fa457..dc205a47b9 100644
--- a/src/corelib/doc/src/timers.qdoc
+++ b/src/corelib/doc/src/timers.qdoc
@@ -1,46 +1,22 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
\page timers.html
\title Timers
\brief How to use Qt timers in your application.
- \ingroup best-practices
+ \ingroup how-to
QObject, the base class of all Qt objects, provides the basic
timer support in Qt. With QObject::startTimer(), you start a
timer with an interval in milliseconds as argument. The function
- returns a unique integer timer ID. The timer will now fire at
+ returns a unique integral timer ID. The timer will then fire at
regular intervals until you explicitly call QObject::killTimer()
- with the timer ID.
+ with that timer ID.
For this mechanism to work, the application must run in an event
- loop. You start an event loop with QApplication::exec(). When a
+ loop. You cat start an event loop with QApplication::exec(). When a
timer fires, the application sends a QTimerEvent, and the flow of
control leaves the event loop until the timer event is processed.
This implies that a timer cannot fire while your application is
@@ -55,69 +31,65 @@
stop all timers in the object's thread; it is not possible to
start timers for objects in another thread.
- The upper limit for the interval value is determined by the number
- of milliseconds that can be specified in a signed integer
- (in practice, this is a period of just over 24 days). The accuracy
- depends on the underlying operating system. Windows 2000 has 15
- millisecond accuracy; other systems that we have tested can handle
- 1 millisecond intervals.
-
- The main API for the timer functionality is QTimer. That class
- provides regular timers that emit a signal when the timer fires, and
- inherits QObject so that it fits well into the ownership structure
- of most Qt programs. The normal way of using it is like this:
-
- \snippet timers/timers.cpp 0
- \snippet timers/timers.cpp 1
- \snippet timers/timers.cpp 2
-
- The QTimer object is made into a child of \c this object so that,
- when \c this object is deleted, the timer is deleted too.
- Next, its \l{QTimer::}{timeout()} signal is connected to the slot
- that will do the work, it is started with a value of 1000
- milliseconds, indicating that it will time out every second.
-
- QTimer also provides a static function for single-shot timers.
+ The main API for the timer functionality was \l QTimer. QTimer stores
+ the interval in a signed integer, which limits the maximum interval it
+ supports to the number of milliseconds that can fit in a signed integer
+ (in practice, this is a period of around 24 days).
+
+ Qt 6.8 introduced the \l QChronoTimer class to replace QTimer. QChronoTimer
+ stores the interval as \c std::chrono::nanoseconds, which means that
+ the maximum interval it supports is around 292 years. This mitigates
+ the chances of integer overflow that QTimer had if the interval was more
+ than \c{std::numeric_limits<int>::max()}.
+
+ The accuracy of the timers depends on the underlying operating system.
+ Windows 2000 has 15ms accuracy; other systems that we have tested can
+ handle 1ms intervals.
+
+ QChronoTimer provides regular timers that emit a signal when the timer
+ fires, and inherits from QObject so that it fits well into the ownership
+ structure of most Qt programs. The normal way of using it is like this:
+
+ \snippet timers/timers.cpp timer-interval-in-ctor
+ \snippet timers/timers.cpp timer-setinterval
+
+ The QChronoTimer object is made into a child of the \c this object so
+ that, when \c this is destroyed, the timer is destroyed too. Next, the
+ \l{QChronoTimer::}{timeout()} signal is connected to the slot that will
+ do the work, the timer interval can be either passed to the constructor,
+ or set later on with setInterval().
+
+ QChronoTimer also provides static functions for single-shot timers.
For example:
- \snippet timers/timers.cpp 3
+ \snippet timers/timers.cpp qchronotimer-singleshot
- 200 milliseconds (0.2 seconds) after this line of code is
- executed, the \c updateCaption() slot will be called.
+ 200ms after this line of code is executed, the \c updateCaption() slot
+ will be called.
- For QTimer to work, you must have an event loop in your
- application; that is, you must call QCoreApplication::exec()
- somewhere. Timer events will be delivered only while the event
- loop is running.
+ For QChronoTimer to work, you must have an event loop in your application;
+ that is, you must call QCoreApplication::exec() somewhere. Timer events
+ will be delivered only while the event loop is running.
- In multithreaded applications, you can use QTimer in any thread
- that has an event loop. To start an event loop from a non-GUI
- thread, use QThread::exec(). Qt uses the timer's
- \l{QObject::thread()}{thread affinity} to determine which thread
- will emit the \l{QTimer::}{timeout()} signal. Because of this, you
- must start and stop the timer in its thread; it is not possible to
- start a timer from another thread.
-
- The \l{widgets/analogclock}{Analog Clock} example shows how to use
- QTimer to redraw a widget at regular intervals. From \c{AnalogClock}'s
- implementation:
-
- \snippet timers/analogclock.cpp 0
- \snippet timers/analogclock.cpp 2
- \snippet timers/analogclock.cpp 3
- \snippet timers/analogclock.cpp 4
- \snippet timers/analogclock.cpp 5
- \snippet timers/analogclock.cpp 6
- \dots
- \snippet timers/analogclock.cpp 7
-
- Every second, QTimer will call the QWidget::update() slot to
+ In multithreaded applications, you can use QChronoTimer in any thread
+ that has an event loop. To start an event loop from a non-GUI thread, use
+ QThread::exec(). Qt uses the timer's \l{QObject::thread()}{thread affinity}
+ to determine which thread will emit the \l{QChronoTimer::}{timeout()}
+ signal. Because of this, you must start and stop the timer in its thread;
+ it is not possible to start a timer from another thread.
+
+ The \l{widgets/analogclock}{Analog Clock} example shows how to
+ use QChronoTimer to redraw a widget at regular intervals. From
+ \c{AnalogClock}'s implementation:
+
+ \snippet timers/analogclock.cpp analogclock-qchronotimer
+
+ Every second, QChronoTimer will call the QWidget::update() slot to
refresh the clock's display.
If you already have a QObject subclass and want an easy
optimization, you can use QBasicTimer instead of QTimer. With
QBasicTimer, you must reimplement
\l{QObject::timerEvent()}{timerEvent()} in your QObject subclass
- and handle the timeout there. The \l{widgets/wiggly}{Wiggly}
- example shows how to use QBasicTimer.
+ and handle the timeout there.
*/
diff --git a/src/corelib/global/archdetect.cpp b/src/corelib/global/archdetect.cpp
index b758b2326c..6a1e110a73 100644
--- a/src/corelib/global/archdetect.cpp
+++ b/src/corelib/global/archdetect.cpp
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2016 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qprocessordetection.h"
@@ -51,14 +15,24 @@
# define ARCH_PROCESSOR "avr32"
#elif defined(Q_PROCESSOR_BLACKFIN)
# define ARCH_PROCESSOR "bfin"
+#elif defined(Q_PROCESSOR_WASM_64)
+# define ARCH_PROCESSOR "wasm64"
#elif defined(Q_PROCESSOR_WASM)
# define ARCH_PROCESSOR "wasm"
+#elif defined(Q_PROCESSOR_HPPA)
+# define ARCH_PROCESSOR "hppa"
#elif defined(Q_PROCESSOR_X86_32)
# define ARCH_PROCESSOR "i386"
#elif defined(Q_PROCESSOR_X86_64)
# define ARCH_PROCESSOR "x86_64"
#elif defined(Q_PROCESSOR_IA64)
# define ARCH_PROCESSOR "ia64"
+#elif defined(Q_PROCESSOR_LOONGARCH_32)
+# define ARCH_PROCESSOR "loongarch32"
+#elif defined(Q_PROCESSOR_LOONGARCH_64)
+# define ARCH_PROCESSOR "loongarch64"
+#elif defined(Q_PROCESSOR_M68K)
+# define ARCH_PROCESSOR "m68k"
#elif defined(Q_PROCESSOR_MIPS_64)
# define ARCH_PROCESSOR "mips64"
#elif defined(Q_PROCESSOR_MIPS)
diff --git a/src/corelib/global/minimum-linux_p.h b/src/corelib/global/minimum-linux_p.h
index 291e6965b8..d52df474fb 100644
--- a/src/corelib/global/minimum-linux_p.h
+++ b/src/corelib/global/minimum-linux_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2017 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2017 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef MINIMUMLINUX_P_H
#define MINIMUMLINUX_P_H
@@ -58,6 +22,7 @@
//
#include "private/qglobal_p.h"
+#include <sys/stat.h>
QT_BEGIN_NAMESPACE
@@ -71,18 +36,17 @@ QT_BEGIN_NAMESPACE
* - FUTEX_PRIVATE_FLAG 2.6.22
* - O_CLOEXEC 2.6.23
* - eventfd 2.6.23
+ * - FUTEX_WAIT_BITSET 2.6.25
* - pipe2 & dup3 2.6.27
* - accept4 2.6.28
* - renameat2 3.16 QT_CONFIG(renameat2)
* - getrandom 3.17 QT_CONFIG(getentropy)
- * - statx 4.11 QT_CONFIG(statx)
+ * - statx 4.11 STATX_BASIC_STATS
*/
-#if QT_CONFIG(statx) && !QT_CONFIG(glibc)
+#if defined(__GLIBC__) && defined(STATX_BASIC_STATS)
// if using glibc, the statx() function in sysdeps/unix/sysv/linux/statx.c
// falls back to stat() for us.
-// (Using QT_CONFIG(glibc) instead of __GLIBC__ because the macros aren't
-// defined in assembler mode)
# define QT_ELF_NOTE_OS_MAJOR 4
# define QT_ELF_NOTE_OS_MINOR 11
# define QT_ELF_NOTE_OS_PATCH 0
@@ -95,6 +59,7 @@ QT_BEGIN_NAMESPACE
# define QT_ELF_NOTE_OS_MINOR 16
# define QT_ELF_NOTE_OS_PATCH 0
#else
+
# define QT_ELF_NOTE_OS_MAJOR 2
# define QT_ELF_NOTE_OS_MINOR 6
# define QT_ELF_NOTE_OS_PATCH 28
diff --git a/src/corelib/global/q20algorithm.h b/src/corelib/global/q20algorithm.h
index 3024e89c6d..24d801b2cd 100644
--- a/src/corelib/global/q20algorithm.h
+++ b/src/corelib/global/q20algorithm.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef Q20ALGORITHM_H
#define Q20ALGORITHM_H
@@ -48,9 +12,9 @@
// W A R N I N G
// -------------
//
-// This file is not part of the Qt API. Types and functions defined
-// in this file will behave exactly as their std counterparts. You
-// may use these definitions in your own code, but be aware that we
+// This file is not part of the Qt API. Types and functions defined in this
+// file can reliably be replaced by their std counterparts, once available.
+// You may use these definitions in your own code, but be aware that we
// will remove them once Qt depends on the C++ version that supports
// them in namespace std. There will be NO deprecation warning, the
// definitions will JUST go away.
@@ -62,6 +26,117 @@
QT_BEGIN_NAMESPACE
+namespace q20 {
+// like std::<algorithm> (ie. not ranged, but constexpr)
+#ifdef __cpp_lib_constexpr_algorithms
+using std::copy;
+using std::copy_if;
+using std::copy_n;
+using std::fill;
+using std::fill_n;
+using std::is_sorted_until;
+using std::is_sorted;
+using std::transform;
+#else
+template <typename InputIterator, typename OutputIterator>
+constexpr OutputIterator
+copy(InputIterator first, InputIterator last, OutputIterator dest)
+{
+ while (first != last) {
+ *dest = *first;
+ ++first;
+ ++dest;
+ }
+ return dest;
+}
+
+template <typename InputIterator, typename OutputIterator, typename UnaryPredicate>
+constexpr OutputIterator
+copy_if(InputIterator first, InputIterator last, OutputIterator dest, UnaryPredicate pred)
+{
+ while (first != last) {
+ if (pred(*first)) {
+ *dest = *first;
+ ++dest;
+ }
+ ++first;
+ }
+ return dest;
+}
+
+template <typename InputIterator, typename Size, typename OutputIterator>
+constexpr OutputIterator
+copy_n(InputIterator first, Size n, OutputIterator dest)
+{
+ while (n > Size{0}) {
+ *dest = *first;
+ ++first;
+ ++dest;
+ --n;
+ }
+ return dest;
+}
+
+template <typename ForwardIterator, typename Value>
+constexpr void
+fill(ForwardIterator first, ForwardIterator last, const Value &value)
+{
+ while (first != last) {
+ *first = value;
+ ++first;
+ }
+}
+
+template <typename OutputIterator, typename Size, typename Value>
+constexpr OutputIterator
+fill_n(OutputIterator first, Size n, const Value &value)
+{
+ while (n > Size{0}) {
+ *first = value;
+ ++first;
+ --n;
+ }
+ return first;
+}
+
+template <typename ForwardIterator, typename BinaryPredicate = std::less<>>
+constexpr ForwardIterator
+is_sorted_until(ForwardIterator first, ForwardIterator last, BinaryPredicate p = {})
+{
+ if (first == last)
+ return first;
+ auto prev = first;
+ while (++first != last) {
+ if (p(*first, *prev))
+ return first;
+ prev = first;
+ }
+ return first;
+}
+
+template <typename ForwardIterator, typename BinaryPredicate = std::less<>>
+constexpr bool is_sorted(ForwardIterator first, ForwardIterator last, BinaryPredicate p = {})
+{
+ return q20::is_sorted_until(first, last, p) == last;
+}
+
+template <typename InputIterator, typename OutputIterator, typename UnaryFunction>
+constexpr OutputIterator
+transform(InputIterator first, InputIterator last, OutputIterator dest, UnaryFunction op)
+{
+ while (first != last) {
+ *dest = op(*first);
+ ++first;
+ ++dest;
+ }
+ return dest;
+}
+
+// binary transform missing on purpose (no users)
+
+#endif
+}
+
namespace q20::ranges {
// like std::ranges::{any,all,none}_of, just unconstrained, so no range-overload
#ifdef __cpp_lib_ranges
@@ -72,7 +147,7 @@ using std::ranges::none_of;
[[maybe_unused]] inline constexpr struct { // Niebloid
template <typename InputIterator, typename Sentinel,
typename Predicate, typename Projection = q20::identity>
- constexpr bool operator()(InputIterator first, Sentinel last, Predicate pred, Projection proj = {}) const
+ [[maybe_unused]] constexpr bool operator()(InputIterator first, Sentinel last, Predicate pred, Projection proj = {}) const
{
while (first != last) {
if (std::invoke(pred, std::invoke(proj, *first)))
@@ -85,7 +160,7 @@ using std::ranges::none_of;
[[maybe_unused]] inline constexpr struct { // Niebloid
template <typename InputIterator, typename Sentinel,
typename Predicate, typename Projection = q20::identity>
- constexpr bool operator()(InputIterator first, Sentinel last, Predicate pred, Projection proj = {}) const
+ [[maybe_unused]] constexpr bool operator()(InputIterator first, Sentinel last, Predicate pred, Projection proj = {}) const
{
while (first != last) {
if (!std::invoke(pred, std::invoke(proj, *first)))
@@ -98,7 +173,7 @@ using std::ranges::none_of;
[[maybe_unused]] inline constexpr struct { // Niebloid
template <typename InputIterator, typename Sentinel,
typename Predicate, typename Projection = q20::identity>
- constexpr bool operator()(InputIterator first, Sentinel last, Predicate pred, Projection proj = {}) const
+ [[maybe_unused]] constexpr bool operator()(InputIterator first, Sentinel last, Predicate pred, Projection proj = {}) const
{
while (first != last) {
if (std::invoke(pred, std::invoke(proj, *first)))
diff --git a/src/corelib/global/q20chrono.h b/src/corelib/global/q20chrono.h
new file mode 100644
index 0000000000..19c2eabe3d
--- /dev/null
+++ b/src/corelib/global/q20chrono.h
@@ -0,0 +1,62 @@
+// Copyright (C) 2023 Ahmad Samir <a.samirh78@gmail.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef Q20CHRONO_H
+#define Q20CHRONO_H
+
+#include <QtCore/qtconfigmacros.h>
+
+#include <chrono>
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. Types and functions defined in this
+// file can reliably be replaced by their std counterparts, once available.
+// You may use these definitions in your own code, but be aware that we
+// will remove them once Qt depends on the C++ version that supports
+// them in namespace std. There will be NO deprecation warning, the
+// definitions will JUST go away.
+//
+// If you can't agree to these terms, don't use these definitions!
+//
+// We mean it.
+//
+
+QT_BEGIN_NAMESPACE
+
+namespace q20 {
+namespace chrono {
+
+#if defined(__GLIBCXX__)
+// https://gcc.gnu.org/git/?p=gcc.git;a=blob;f=libstdc%2B%2B-v3/include/bits/chrono.h
+using IntRep = int64_t;
+#else
+// https://github.com/llvm/llvm-project/blob/main/libcxx/include/__chrono/duration.h
+// https://github.com/microsoft/STL/blob/main/stl/inc/__msvc_chrono.hpp
+using IntRep = int;
+#endif
+
+#if __cpp_lib_chrono >= 201907L
+using std::chrono::days;
+using std::chrono::weeks;
+using std::chrono::years;
+using std::chrono::months;
+
+static_assert(std::is_same_v<days::rep, IntRep>);
+static_assert(std::is_same_v<weeks::rep, IntRep>);
+static_assert(std::is_same_v<years::rep, IntRep>);
+static_assert(std::is_same_v<months::rep, IntRep>);
+#else
+using days = std::chrono::duration<IntRep, std::ratio<86400>>;
+using weeks = std::chrono::duration<IntRep, std::ratio_multiply<std::ratio<7>, days::period>>;
+using years = std::chrono::duration<IntRep, std::ratio_multiply<std::ratio<146097, 400>, days::period>>;
+using months = std::chrono::duration<IntRep, std::ratio_divide<years::period, std::ratio<12>>>;
+#endif // __cpp_lib_chrono >= 201907L
+} // namespace chrono
+} // namespace q20
+
+QT_END_NAMESPACE
+
+#endif /* Q20CHRONO_H */
diff --git a/src/corelib/global/q20functional.h b/src/corelib/global/q20functional.h
index 300c4b8dd8..a39b4fceb3 100644
--- a/src/corelib/global/q20functional.h
+++ b/src/corelib/global/q20functional.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef Q20FUNCTIONAL_H
#define Q20FUNCTIONAL_H
@@ -47,9 +11,9 @@
// W A R N I N G
// -------------
//
-// This file is not part of the Qt API. Types and functions defined
-// in this file will behave exactly as their std counterparts. You
-// may use these definitions in your own code, but be aware that we
+// This file is not part of the Qt API. Types and functions defined in this
+// file can reliably be replaced by their std counterparts, once available.
+// You may use these definitions in your own code, but be aware that we
// will remove them once Qt depends on the C++ version that supports
// them in namespace std. There will be NO deprecation warning, the
// definitions will JUST go away.
@@ -59,6 +23,8 @@
// We mean it.
//
+#include <functional>
+
QT_BEGIN_NAMESPACE
namespace q20 {
diff --git a/src/corelib/global/q20iterator.h b/src/corelib/global/q20iterator.h
index 7c65aeb856..9ed4d69965 100644
--- a/src/corelib/global/q20iterator.h
+++ b/src/corelib/global/q20iterator.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef Q20ITERATOR_H
#define Q20ITERATOR_H
@@ -47,9 +11,9 @@
// W A R N I N G
// -------------
//
-// This file is not part of the Qt API. Types and functions defined
-// in this file will behave exactly as their std counterparts. You
-// may use these definitions in your own code, but be aware that we
+// This file is not part of the Qt API. Types and functions defined in this
+// file can reliably be replaced by their std counterparts, once available.
+// You may use these definitions in your own code, but be aware that we
// will remove them once Qt depends on the C++ version that supports
// them in namespace std. There will be NO deprecation warning, the
// definitions will JUST go away.
@@ -75,6 +39,16 @@ namespace q20 {
#endif
} // namespace q20
+// like q20::iter_reference_t
+namespace q20 {
+#ifdef __cpp_lib_ranges
+ using std::iter_reference_t;
+#else
+ template <typename Dereferencable> // unconstrained (constraint requires concepts)
+ using iter_reference_t = decltype(*std::declval<Dereferencable&>());
+#endif // __cpp_lib_ranges
+} // namespace q20
+
QT_END_NAMESPACE
#endif /* Q20ITERATOR_H */
diff --git a/src/corelib/global/q20map.h b/src/corelib/global/q20map.h
new file mode 100644
index 0000000000..c719067480
--- /dev/null
+++ b/src/corelib/global/q20map.h
@@ -0,0 +1,72 @@
+// Copyright (C) 2023 Ahmad Samir <a.samirh78@gmail.com>
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef Q20MAP_H
+#define Q20MAP_H
+
+#include <QtCore/qtconfigmacros.h>
+
+#include <map>
+#if __has_include(<memory_resource>)
+# include <memory_resource>
+#endif
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. Types and functions defined in this
+// file can reliably be replaced by their std counterparts, once available.
+// You may use these definitions in your own code, but be aware that we
+// will remove them once Qt depends on the C++ version that supports
+// them in namespace std. There will be NO deprecation warning, the
+// definitions will JUST go away.
+//
+// If you can't agree to these terms, don't use these definitions!
+//
+// We mean it.
+//
+
+QT_BEGIN_NAMESPACE
+
+namespace q20 {
+// like std::erase/std::erase_if for std::map
+#if defined(__cpp_lib_erase_if) && __cpp_lib_erase_if >= 202002L // the one returning size_type
+using std::erase_if;
+#else
+
+// Make it more specialized than the compiler's, so that our implementation is preferred over
+// the compiler's (which may be present, but return void instead of the number of erased elements).
+
+#define MAKE_OVERLOAD(map, allocator) \
+ template <typename Key, typename T, typename Compare, typename Pred> \
+ constexpr typename std::map<Key, T, Compare, std::allocator<std::pair<const Key, T>>>::size_type \
+ erase_if(std::map<Key, T, Compare, std::allocator<std::pair<const Key, T>>> &c, Pred p) \
+ { \
+ const auto origSize = c.size(); \
+ for (auto it = c.begin(), end = c.end(); it != end; /* erasing */) { \
+ if (p(*it)) \
+ it = c.erase(it); \
+ else \
+ ++it; \
+ } \
+ return origSize - c.size(); \
+ } \
+ /* end */
+
+MAKE_OVERLOAD(map, allocator)
+MAKE_OVERLOAD(multimap, allocator)
+#ifdef __cpp_lib_polymorphic_allocator
+MAKE_OVERLOAD(map, pmr::polymorphic_allocator)
+MAKE_OVERLOAD(multimap, pmr::polymorphic_allocator)
+#endif // __cpp_lib_polymorphic_allocator
+
+#undef MAKE_OVERLOAD
+
+#endif // __cpp_lib_erase_if
+} // namespace q20
+
+QT_END_NAMESPACE
+
+#endif /* Q20MAP_H */
diff --git a/src/corelib/global/q20memory.h b/src/corelib/global/q20memory.h
new file mode 100644
index 0000000000..008f4ddeb2
--- /dev/null
+++ b/src/corelib/global/q20memory.h
@@ -0,0 +1,93 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// Copyright (C) 2020 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef Q20MEMORY_H
+#define Q20MEMORY_H
+
+#include <QtCore/qtconfigmacros.h>
+
+#include <memory>
+
+#include <type_traits>
+#include <utility>
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. Types and functions defined in this
+// file can reliably be replaced by their std counterparts, once available.
+// You may use these definitions in your own code, but be aware that we
+// will remove them once Qt depends on the C++ version that supports
+// them in namespace std. There will be NO deprecation warning, the
+// definitions will JUST go away.
+//
+// If you can't agree to these terms, don't use these definitions!
+//
+// We mean it.
+//
+
+QT_BEGIN_NAMESPACE
+
+// like std::construct_at (but not whitelisted for constexpr)
+namespace q20 {
+#ifdef __cpp_lib_constexpr_dynamic_alloc
+using std::construct_at;
+#else
+template <typename T,
+ typename... Args,
+ typename Enable = std::void_t<decltype(::new (std::declval<void *>()) T(std::declval<Args>()...))> >
+T *construct_at(T *ptr, Args && ... args)
+{
+ return ::new (const_cast<void *>(static_cast<const volatile void *>(ptr)))
+ T(std::forward<Args>(args)...);
+}
+#endif // __cpp_lib_constexpr_dynamic_alloc
+} // namespace q20
+
+
+namespace q20 {
+// like std::to_address
+#ifdef __cpp_lib_to_address
+using std::to_address;
+#else
+// http://eel.is/c++draft/pointer.conversion
+template <typename T>
+constexpr T *to_address(T *p) noexcept {
+ // http://eel.is/c++draft/pointer.conversion#1:
+ // Mandates: T is not a function type.
+ static_assert(!std::is_function_v<T>, "to_address must not be used on function types");
+ return p;
+}
+
+template <typename Ptr, typename std::enable_if_t<!std::is_pointer_v<Ptr>, bool> = true>
+constexpr auto to_address(const Ptr &ptr) noexcept; // fwd declared
+
+namespace detail {
+ // http://eel.is/c++draft/pointer.conversion#3
+ template <typename Ptr, typename = void>
+ struct to_address_helper {
+ static auto get(const Ptr &ptr) noexcept
+ { return q20::to_address(ptr.operator->()); }
+ };
+ template <typename Ptr>
+ struct to_address_helper<Ptr, std::void_t<
+ decltype(std::pointer_traits<Ptr>::to_address(std::declval<const Ptr&>()))
+ >>
+ {
+ static auto get(const Ptr &ptr) noexcept
+ { return std::pointer_traits<Ptr>::to_address(ptr); }
+ };
+} // namespace detail
+
+template <typename Ptr, typename std::enable_if_t<!std::is_pointer_v<Ptr>, bool>>
+constexpr auto to_address(const Ptr &ptr) noexcept
+{ return detail::to_address_helper<Ptr>::get(ptr); }
+
+#endif // __cpp_lib_to_address
+} // namespace q20
+
+QT_END_NAMESPACE
+
+#endif /* Q20MEMORY_H */
diff --git a/src/corelib/global/q20type_traits.h b/src/corelib/global/q20type_traits.h
new file mode 100644
index 0000000000..63a453daca
--- /dev/null
+++ b/src/corelib/global/q20type_traits.h
@@ -0,0 +1,81 @@
+// Copyright (C) 2021 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+#ifndef Q20TYPE_TRAITS_H
+#define Q20TYPE_TRAITS_H
+
+#include <QtCore/qcompilerdetection.h>
+#include <QtCore/qsystemdetection.h>
+#include <QtCore/qtconfigmacros.h>
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. Types and functions defined in this
+// file can reliably be replaced by their std counterparts, once available.
+// You may use these definitions in your own code, but be aware that we
+// will remove them once Qt depends on the C++ version that supports
+// them in namespace std. There will be NO deprecation warning, the
+// definitions will JUST go away.
+//
+// If you can't agree to these terms, don't use these definitions!
+//
+// We mean it.
+//
+
+#include <type_traits>
+
+QT_BEGIN_NAMESPACE
+
+namespace q20 {
+// like std::is_constant_evaluated
+#ifdef __cpp_lib_is_constant_evaluated
+using std::is_constant_evaluated;
+#define QT_SUPPORTS_IS_CONSTANT_EVALUATED
+#else
+constexpr bool is_constant_evaluated() noexcept
+{
+#ifdef Q_OS_INTEGRITY
+ // Integrity complains "calling __has_builtin() from a constant expression".
+ // Avoid the __has_builtin check until we know what's going on.
+ return false;
+#elif __has_builtin(__builtin_is_constant_evaluated) || \
+ (defined(Q_CC_MSVC_ONLY) /* >= 1925, but we require 1927 in qglobal.h */)
+# define QT_SUPPORTS_IS_CONSTANT_EVALUATED
+ return __builtin_is_constant_evaluated();
+#else
+ return false;
+#endif
+}
+#endif // __cpp_lib_is_constant_evaluated
+}
+
+namespace q20 {
+// like std::remove_cvref(_t)
+#ifdef __cpp_lib_remove_cvref
+using std::remove_cvref;
+using std::remove_cvref_t;
+#else
+template <typename T>
+using remove_cvref = std::remove_cv<std::remove_reference_t<T>>;
+template <typename T>
+using remove_cvref_t = std::remove_cv_t<std::remove_reference_t<T>>;
+#endif // __cpp_lib_remove_cvref
+}
+
+namespace q20 {
+// like std::type_identity(_t)
+#ifdef __cpp_lib_type_identity
+using std::type_identity;
+using std::type_identity_t;
+#else
+template <typename T>
+struct type_identity { using type = T; };
+template <typename T>
+using type_identity_t = typename type_identity<T>::type;
+#endif // __cpp_lib_type_identity
+}
+
+QT_END_NAMESPACE
+
+#endif /* Q20TYPE_TRAITS_H */
diff --git a/src/corelib/global/q20vector.h b/src/corelib/global/q20vector.h
new file mode 100644
index 0000000000..9d312355ea
--- /dev/null
+++ b/src/corelib/global/q20vector.h
@@ -0,0 +1,90 @@
+// Copyright (C) 2023 Ahmad Samir <a.samirh78@gmail.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef Q20VECTOR_H
+#define Q20VECTOR_H
+
+#include <QtCore/qtconfigmacros.h>
+
+#include <algorithm>
+#include <vector>
+#if __has_include(<memory_resource>)
+# include <memory_resource>
+#endif
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. Types and functions defined in this
+// file can reliably be replaced by their std counterparts, once available.
+// You may use these definitions in your own code, but be aware that we
+// will remove them once Qt depends on the C++ version that supports
+// them in namespace std. There will be NO deprecation warning, the
+// definitions will JUST go away.
+//
+// If you can't agree to these terms, don't use these definitions!
+//
+// We mean it.
+//
+
+QT_BEGIN_NAMESPACE
+
+namespace q20 {
+// like std::erase/std::erase_if for std::vector
+#if defined(__cpp_lib_erase_if) && __cpp_lib_erase_if >= 202002L // the one returning size_type
+using std::erase;
+using std::erase_if;
+#else
+
+// Make it more specialized than the compiler's, so that our implementation is preferred over
+// the compiler's (which may be present, but return void instead of the number of erased elements).
+
+template <typename T, typename U>
+constexpr typename std::vector<T, std::allocator<T>>::size_type
+erase(std::vector<T, std::allocator<T>> &c, const U &value)
+{
+ const auto origSize = c.size();
+ auto it = std::remove(c.begin(), c.end(), value);
+ c.erase(it, c.end());
+ return origSize - c.size();
+}
+
+template <typename T, typename Pred>
+constexpr typename std::vector<T, std::allocator<T>>::size_type
+erase_if(std::vector<T, std::allocator<T>> &c, Pred pred)
+{
+ const auto origSize = c.size();
+ auto it = std::remove_if(c.begin(), c.end(), pred);
+ c.erase(it, c.end());
+ return origSize - c.size();
+}
+
+#ifdef __cpp_lib_polymorphic_allocator
+template <typename T, typename U>
+constexpr typename std::vector<T, std::pmr::polymorphic_allocator<T>>::size_type
+erase(std::vector<T, std::pmr::polymorphic_allocator<T>> &c, const U &value)
+{
+ const auto origSize = c.size();
+ auto it = std::remove(c.begin(), c.end(), value);
+ c.erase(it, c.end());
+ return origSize - c.size();
+}
+
+template <typename T, typename Pred>
+constexpr typename std::vector<T, std::pmr::polymorphic_allocator<T>>::size_type
+erase_if(std::vector<T, std::pmr::polymorphic_allocator<T>> &c, Pred pred)
+{
+ const auto origSize = c.size();
+ auto it = std::remove_if(c.begin(), c.end(), pred);
+ c.erase(it, c.end());
+ return origSize - c.size();
+}
+#endif // __cpp_lib_polymorphic_allocator
+
+#endif // __cpp_lib_erase_if
+} // namespace q20
+
+QT_END_NAMESPACE
+
+#endif /* Q20VECTOR_H */
diff --git a/src/corelib/global/q23functional.h b/src/corelib/global/q23functional.h
new file mode 100644
index 0000000000..ae8f78a3d0
--- /dev/null
+++ b/src/corelib/global/q23functional.h
@@ -0,0 +1,49 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+#ifndef Q23FUNCTIONAL_H
+#define Q23FUNCTIONAL_H
+
+#include <QtCore/qglobal.h>
+#include <QtCore/q20functional.h>
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. Types and functions defined in this
+// file can reliably be replaced by their std counterparts, once available.
+// You may use these definitions in your own code, but be aware that we
+// will remove them once Qt depends on the C++ version that supports
+// them in namespace std. There will be NO deprecation warning, the
+// definitions will JUST go away.
+//
+// If you can't agree to these terms, don't use these definitions!
+//
+// We mean it.
+//
+
+QT_BEGIN_NAMESPACE
+
+namespace q23 {
+// like std::invoke_r
+#ifdef __cpp_lib_invoke_r
+using std::invoke_r;
+#else
+template <typename R, typename F, typename...Args>
+constexpr
+std::enable_if_t<std::is_invocable_r_v<R, F, Args...>, R>
+invoke_r(F&& f, Args&&... args)
+ noexcept(std::is_nothrow_invocable_r_v<R, F, Args...>)
+{
+ // ### use q20::invoke for a constexpr std::invoke
+ if constexpr (std::is_void_v<R>)
+ std::invoke(std::forward<F>(f), std::forward<Args>(args)...);
+ else
+ return std::invoke(std::forward<F>(f), std::forward<Args>(args)...);
+}
+#endif // __cpp_lib_invoke_r
+} // namespace q23
+
+QT_END_NAMESPACE
+
+#endif /* Q23FUNCTIONAL_H */
diff --git a/src/corelib/global/q23utility.cpp b/src/corelib/global/q23utility.cpp
new file mode 100644
index 0000000000..9c5365c547
--- /dev/null
+++ b/src/corelib/global/q23utility.cpp
@@ -0,0 +1,25 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#include <QtCore/q23utility.h>
+
+QT_BEGIN_NAMESPACE
+
+#define CHECK2(cvref_in, cvref_out) \
+ static_assert(std::is_same_v< \
+ decltype(q23::forward_like<int cvref_in >(std::declval<long&>())), \
+ long cvref_out \
+ >, "oops: cvref '" #cvref_in "' doesn't work") \
+ /* end */
+#define CHECK(cvref) CHECK2(cvref, cvref)
+CHECK2(/**/, &&);
+CHECK(&);
+CHECK(&&);
+CHECK2(const, const &&);
+CHECK(const &);
+CHECK(const &&);
+// volatile is not supported
+#undef CHECK
+#undef CHECK2
+
+QT_END_NAMESPACE
diff --git a/src/corelib/global/q23utility.h b/src/corelib/global/q23utility.h
new file mode 100644
index 0000000000..9ae5389b56
--- /dev/null
+++ b/src/corelib/global/q23utility.h
@@ -0,0 +1,75 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+#ifndef Q23UTILITY_H
+#define Q23UTILITY_H
+
+#include <QtCore/qtconfigmacros.h>
+
+#include <utility>
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. Types and functions defined in this
+// file can reliably be replaced by their std counterparts, once available.
+// You may use these definitions in your own code, but be aware that we
+// will remove them once Qt depends on the C++ version that supports
+// them in namespace std. There will be NO deprecation warning, the
+// definitions will JUST go away.
+//
+// If you can't agree to these terms, don't use these definitions!
+//
+// We mean it.
+//
+
+QT_BEGIN_NAMESPACE
+
+namespace q23 {
+// like std::forward_like
+#ifdef __cpp_lib_forward_like
+using std::forward_like;
+#else
+
+namespace _detail {
+
+// [forward]/6.1 COPY_CONST
+template <typename A, typename B>
+using copy_const_t = std::conditional_t<
+ std::is_const_v<A>, const B,
+ /* else */ B
+ >;
+
+// [forward]/6.2 OVERRIDE_REF
+template <typename A, typename B>
+using override_ref_t = std::conditional_t<
+ std::is_rvalue_reference_v<A>, std::remove_reference_t<B>&&,
+ /* else */ B&
+ >;
+
+// [forward]/6.3 "V"
+template <typename T, typename U>
+using forward_like_ret_t = override_ref_t<
+ T&&,
+ copy_const_t<
+ std::remove_reference_t<T>,
+ std::remove_reference_t<U>
+ >
+ >;
+
+} // namespace detail
+
+// http://eel.is/c++draft/forward#lib:forward_like
+template <class T, class U>
+[[nodiscard]] constexpr auto forward_like(U &&x) noexcept
+ -> _detail::forward_like_ret_t<T, U>
+{
+ using V = _detail::forward_like_ret_t<T, U>;
+ return static_cast<V>(x);
+}
+#endif // __cpp_lib_forward_like
+} // namespace q23
+
+QT_END_NAMESPACE
+
+#endif /* Q23UTILITY_H */
diff --git a/src/corelib/global/qassert.cpp b/src/corelib/global/qassert.cpp
new file mode 100644
index 0000000000..6a29cbfa21
--- /dev/null
+++ b/src/corelib/global/qassert.cpp
@@ -0,0 +1,277 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#include "qassert.h"
+
+#include <QtCore/qlogging.h>
+
+#include <cstdlib>
+#include <cstdio>
+#include <exception>
+#ifndef QT_NO_EXCEPTIONS
+#include <new>
+#endif
+
+#if defined(Q_CC_MSVC)
+# include <crtdbg.h>
+#endif
+#ifdef Q_OS_WIN
+# include <qt_windows.h>
+#endif
+
+QT_BEGIN_NAMESPACE
+
+void qAbort()
+{
+#ifdef Q_OS_WIN
+ // std::abort() in the MSVC runtime will call _exit(3) if the abort
+ // behavior is _WRITE_ABORT_MSG - see also _set_abort_behavior(). This is
+ // the default for a debug-mode build of the runtime. Worse, MinGW's
+ // std::abort() implementation (in msvcrt.dll) is basically a call to
+ // _exit(3) too. Unfortunately, _exit() and _Exit() *do* run the static
+ // destructors of objects in DLLs, a violation of the C++ standard (see
+ // [support.start.term]). So we bypass std::abort() and directly
+ // terminate the application.
+
+# if defined(Q_CC_MSVC)
+ if (IsProcessorFeaturePresent(PF_FASTFAIL_AVAILABLE))
+ __fastfail(FAST_FAIL_FATAL_APP_EXIT);
+# else
+ RaiseFailFastException(nullptr, nullptr, 0);
+# endif
+
+ // Fallback
+ TerminateProcess(GetCurrentProcess(), STATUS_FATAL_APP_EXIT);
+
+ // Tell the compiler the application has stopped.
+ Q_UNREACHABLE_IMPL();
+#else // !Q_OS_WIN
+ std::abort();
+#endif
+}
+
+/*!
+ \macro void Q_ASSERT(bool test)
+ \relates <QtAssert>
+
+ Prints a warning message containing the source code file name and
+ line number if \a test is \c false.
+
+ Q_ASSERT() is useful for testing pre- and post-conditions
+ during development. It does nothing if \c QT_NO_DEBUG was defined
+ during compilation.
+
+ Example:
+
+ \snippet code/src_corelib_global_qglobal.cpp 17
+
+ If \c b is zero, the Q_ASSERT statement will output the following
+ message using the qFatal() function:
+
+ \snippet code/src_corelib_global_qglobal.cpp 18
+
+ \sa Q_ASSERT_X(), qFatal(), {Debugging Techniques}
+*/
+
+/*!
+ \macro void Q_ASSERT_X(bool test, const char *where, const char *what)
+ \relates <QtAssert>
+
+ Prints the message \a what together with the location \a where,
+ the source file name and line number if \a test is \c false.
+
+ Q_ASSERT_X is useful for testing pre- and post-conditions during
+ development. It does nothing if \c QT_NO_DEBUG was defined during
+ compilation.
+
+ Example:
+
+ \snippet code/src_corelib_global_qglobal.cpp 19
+
+ If \c b is zero, the Q_ASSERT_X statement will output the following
+ message using the qFatal() function:
+
+ \snippet code/src_corelib_global_qglobal.cpp 20
+
+ \sa Q_ASSERT(), qFatal(), {Debugging Techniques}
+*/
+
+/*
+ The Q_ASSERT macro calls this function when the test fails.
+*/
+void qt_assert(const char *assertion, const char *file, int line) noexcept
+{
+ QMessageLogger(file, line, nullptr)
+ .fatal("ASSERT: \"%s\" in file %s, line %d", assertion, file, line);
+}
+
+/*
+ The Q_ASSERT_X macro calls this function when the test fails.
+*/
+void qt_assert_x(const char *where, const char *what, const char *file, int line) noexcept
+{
+ QMessageLogger(file, line, nullptr)
+ .fatal("ASSERT failure in %s: \"%s\", file %s, line %d", where, what, file, line);
+}
+
+/*!
+ \macro void Q_CHECK_PTR(void *pointer)
+ \relates <QtAssert>
+
+ If \a pointer is \nullptr, prints a message containing the source
+ code's file name and line number, saying that the program ran out
+ of memory and aborts program execution. It throws \c std::bad_alloc instead
+ if exceptions are enabled.
+
+ Q_CHECK_PTR does nothing if \c QT_NO_DEBUG and \c QT_NO_EXCEPTIONS were
+ defined during compilation. Therefore you must not use Q_CHECK_PTR to check
+ for successful memory allocations because the check will be disabled in
+ some cases.
+
+ Example:
+
+ \snippet code/src_corelib_global_qglobal.cpp 21
+
+ \sa qWarning(), {Debugging Techniques}
+*/
+
+/*!
+ \fn template <typename T> T *q_check_ptr(T *p)
+ \relates <QtAssert>
+
+ Uses Q_CHECK_PTR on \a p, then returns \a p.
+
+ This can be used as an inline version of Q_CHECK_PTR.
+*/
+
+/*!
+ \internal
+ The Q_CHECK_PTR macro calls this function if an allocation check
+ fails.
+*/
+void qt_check_pointer(const char *n, int l) noexcept
+{
+ // make separate printing calls so that the first one may flush;
+ // the second one could want to allocate memory (fputs prints a
+ // newline and stderr auto-flushes).
+ fputs("Out of memory", stderr);
+ fprintf(stderr, " in %s, line %d\n", n, l);
+
+ std::terminate();
+}
+
+/*
+ \internal
+ Allows you to throw an exception without including <new>
+ Called internally from Q_CHECK_PTR on certain OS combinations
+*/
+void qBadAlloc()
+{
+#ifndef QT_NO_EXCEPTIONS
+ throw std::bad_alloc();
+#else
+ std::terminate();
+#endif
+}
+
+/*!
+ \macro void Q_ASSUME(bool expr)
+ \deprecated
+ \relates <QtAssert>
+ \since 5.0
+
+ Causes the compiler to assume that \a expr is \c true.
+
+ This macro is known to produce worse code than when no assumption was
+ inserted in the code, with some compiler versions. The arguments passed to
+ it are always evaluated, even in release mode, with some compilers and not
+ others, so application code needs to be aware of those possible differences
+ in behavior.
+
+ Do not use it in new code. It is retained as-is for compatibility with old
+ code and will likely be removed in the next major version Qt.
+
+ \sa Q_ASSERT(), Q_UNREACHABLE(), Q_LIKELY()
+*/
+
+/*!
+ \macro QT_TERMINATE_ON_EXCEPTION(expr)
+ \relates <QtGlobal>
+ \internal
+
+ In general, use of the Q_DECL_NOEXCEPT macro is preferred over
+ Q_DECL_NOTHROW, because it exhibits well-defined behavior and
+ supports the more powerful Q_DECL_NOEXCEPT_EXPR variant. However,
+ use of Q_DECL_NOTHROW has the advantage that Windows builds
+ benefit on a wide range or compiler versions that do not yet
+ support the C++11 noexcept feature.
+
+ It may therefore be beneficial to use Q_DECL_NOTHROW and emulate
+ the C++11 behavior manually with an embedded try/catch.
+
+ Qt provides the QT_TERMINATE_ON_EXCEPTION(expr) macro for this
+ purpose. It either expands to \c expr (if Qt is compiled without
+ exception support or the compiler supports C++11 noexcept
+ semantics) or to
+ \snippet code/src_corelib_global_qglobal.cpp qterminate
+ otherwise.
+
+ Since this macro expands to just \c expr if the compiler supports
+ C++11 noexcept, expecting the compiler to take over responsibility
+ of calling std::terminate() in that case, it should not be used
+ outside Q_DECL_NOTHROW functions.
+
+ \sa Q_DECL_NOEXCEPT, Q_DECL_NOTHROW, qTerminate()
+*/
+
+/*!
+ \macro void Q_UNREACHABLE()
+ \relates <QtAssert>
+ \since 5.0
+
+ Tells the compiler that the current point cannot be reached by any
+ execution, so it may optimize any code paths leading here as dead code, as
+ well as code continuing from here.
+
+ This macro is useful to mark impossible conditions. For example, given the
+ following enum:
+
+ \snippet code/src_corelib_global_qglobal.cpp qunreachable-enum
+
+ One can write a switch table like so:
+
+ \snippet code/src_corelib_global_qglobal.cpp qunreachable-switch
+
+ The advantage of inserting Q_UNREACHABLE() at that point is that the
+ compiler is told not to generate code for a shape variable containing that
+ value. If the macro is missing, the compiler will still generate the
+ necessary comparisons for that value. If the case label were removed, some
+ compilers could produce a warning that some enum values were not checked.
+
+ By using this macro in impossible conditions, code coverage may be improved
+ as dead code paths may be eliminated.
+
+ In debug builds the condition is enforced by an assert to facilitate debugging.
+
+ \note Use the macro Q_UNREACHABLE_RETURN() to insert return statements for
+ compilers that need them, without causing warnings for compilers that
+ complain about its presence.
+
+ \sa Q_ASSERT(), qFatal(), Q_UNREACHABLE_RETURN()
+*/
+
+/*!
+ \macro void Q_UNREACHABLE_RETURN(...)
+ \relates <QtAssert>
+ \since 6.5
+
+ This is equivalent to
+ \code
+ Q_UNREACHABLE();
+ return __VA_ARGS__;
+ \endcode
+ except it omits the return on compilers that would warn about it.
+
+ \sa Q_UNREACHABLE()
+*/
+QT_END_NAMESPACE
diff --git a/src/corelib/global/qassert.h b/src/corelib/global/qassert.h
new file mode 100644
index 0000000000..388932a8f7
--- /dev/null
+++ b/src/corelib/global/qassert.h
@@ -0,0 +1,116 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QASSERT_H
+#define QASSERT_H
+
+#include <QtCore/qcompilerdetection.h>
+#include <QtCore/qtconfigmacros.h>
+#include <QtCore/qtcoreexports.h>
+#include <QtCore/qtnoop.h>
+
+#if 0
+#pragma qt_class(QtAssert)
+#pragma qt_sync_stop_processing
+#endif
+
+QT_BEGIN_NAMESPACE
+
+#if defined(__cplusplus)
+
+#if !defined(Q_CC_MSVC_ONLY)
+Q_NORETURN
+#endif
+Q_DECL_COLD_FUNCTION
+Q_CORE_EXPORT void qt_assert(const char *assertion, const char *file, int line) noexcept;
+
+#if !defined(Q_ASSERT)
+# if defined(QT_NO_DEBUG) && !defined(QT_FORCE_ASSERTS)
+# define Q_ASSERT(cond) static_cast<void>(false && (cond))
+# else
+# define Q_ASSERT(cond) ((cond) ? static_cast<void>(0) : qt_assert(#cond, __FILE__, __LINE__))
+# endif
+#endif
+
+#if !defined(Q_CC_MSVC_ONLY)
+Q_NORETURN
+#endif
+Q_DECL_COLD_FUNCTION
+Q_CORE_EXPORT
+void qt_assert_x(const char *where, const char *what, const char *file, int line) noexcept;
+
+#if !defined(Q_ASSERT_X)
+# if defined(QT_NO_DEBUG) && !defined(QT_FORCE_ASSERTS)
+# define Q_ASSERT_X(cond, where, what) static_cast<void>(false && (cond))
+# else
+# define Q_ASSERT_X(cond, where, what) ((cond) ? static_cast<void>(0) : qt_assert_x(where, what, __FILE__, __LINE__))
+# endif
+#endif
+
+Q_NORETURN Q_CORE_EXPORT void qt_check_pointer(const char *, int) noexcept;
+Q_NORETURN Q_DECL_COLD_FUNCTION
+Q_CORE_EXPORT void qBadAlloc();
+
+#ifdef QT_NO_EXCEPTIONS
+# if defined(QT_NO_DEBUG) && !defined(QT_FORCE_ASSERTS)
+# define Q_CHECK_PTR(p) qt_noop()
+# else
+# define Q_CHECK_PTR(p) do {if (!(p)) qt_check_pointer(__FILE__,__LINE__);} while (false)
+# endif
+#else
+# define Q_CHECK_PTR(p) do { if (!(p)) qBadAlloc(); } while (false)
+#endif
+
+template <typename T>
+inline T *q_check_ptr(T *p) { Q_CHECK_PTR(p); return p; }
+
+// Q_UNREACHABLE_IMPL() and Q_ASSUME_IMPL() used below are defined in qcompilerdetection.h
+#define Q_UNREACHABLE() \
+ do {\
+ Q_ASSERT_X(false, "Q_UNREACHABLE()", "Q_UNREACHABLE was reached");\
+ Q_UNREACHABLE_IMPL();\
+ } while (false)
+
+#ifndef Q_UNREACHABLE_RETURN
+# ifdef Q_COMPILER_COMPLAINS_ABOUT_RETURN_AFTER_UNREACHABLE
+# define Q_UNREACHABLE_RETURN(...) Q_UNREACHABLE()
+# else
+# define Q_UNREACHABLE_RETURN(...) do { Q_UNREACHABLE(); return __VA_ARGS__; } while (0)
+# endif
+#endif
+
+Q_DECL_DEPRECATED_X("Q_ASSUME() is deprecated because it can produce worse code than when it's absent; "
+ "use C++23 [[assume]] instead")
+inline bool qt_assume_is_deprecated(bool cond) noexcept { return cond; }
+#define Q_ASSUME(Expr) \
+ [] (bool valueOfExpression) {\
+ Q_ASSERT_X(valueOfExpression, "Q_ASSUME()", "Assumption in Q_ASSUME(\"" #Expr "\") was not correct");\
+ Q_ASSUME_IMPL(valueOfExpression);\
+ }(qt_assume_is_deprecated(Expr))
+
+// Don't use these in C++ mode, use static_assert directly.
+// These are here only to keep old code compiling.
+# define Q_STATIC_ASSERT(Condition) static_assert(bool(Condition), #Condition)
+# define Q_STATIC_ASSERT_X(Condition, Message) static_assert(bool(Condition), Message)
+
+#elif defined(Q_COMPILER_STATIC_ASSERT)
+// C11 mode - using the _S version in case <assert.h> doesn't do the right thing
+# define Q_STATIC_ASSERT(Condition) _Static_assert(!!(Condition), #Condition)
+# define Q_STATIC_ASSERT_X(Condition, Message) _Static_assert(!!(Condition), Message)
+#else
+// C89 & C99 version
+# define Q_STATIC_ASSERT_PRIVATE_JOIN(A, B) Q_STATIC_ASSERT_PRIVATE_JOIN_IMPL(A, B)
+# define Q_STATIC_ASSERT_PRIVATE_JOIN_IMPL(A, B) A ## B
+# ifdef __COUNTER__
+# define Q_STATIC_ASSERT(Condition) \
+ typedef char Q_STATIC_ASSERT_PRIVATE_JOIN(q_static_assert_result, __COUNTER__) [(Condition) ? 1 : -1];
+# else
+# define Q_STATIC_ASSERT(Condition) \
+ typedef char Q_STATIC_ASSERT_PRIVATE_JOIN(q_static_assert_result, __LINE__) [(Condition) ? 1 : -1];
+# endif /* __COUNTER__ */
+# define Q_STATIC_ASSERT_X(Condition, Message) Q_STATIC_ASSERT(Condition)
+#endif // __cplusplus
+
+QT_END_NAMESPACE
+
+#endif // QASSERT_H
diff --git a/src/corelib/global/qcompare.cpp b/src/corelib/global/qcompare.cpp
new file mode 100644
index 0000000000..ac220b8434
--- /dev/null
+++ b/src/corelib/global/qcompare.cpp
@@ -0,0 +1,1357 @@
+// Copyright (C) 2020 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#include "qcompare.h"
+
+#ifdef __cpp_lib_bit_cast
+#include <bit>
+#endif
+
+QT_BEGIN_NAMESPACE
+
+#ifdef __cpp_lib_three_way_comparison
+#ifdef __cpp_lib_bit_cast
+#define CHECK(type, flag) \
+ static_assert(std::bit_cast<Qt:: type ## _ordering>(std:: type ## _ordering:: flag) \
+ == Qt:: type ## _ordering :: flag); \
+ static_assert(std::bit_cast<std:: type ## _ordering>(Qt:: type ## _ordering:: flag) \
+ == std:: type ## _ordering :: flag) \
+ /* end */
+CHECK(partial, unordered);
+CHECK(partial, less);
+CHECK(partial, greater);
+CHECK(partial, equivalent);
+CHECK(weak, less);
+CHECK(weak, greater);
+CHECK(weak, equivalent);
+CHECK(strong, less);
+CHECK(strong, greater);
+CHECK(strong, equal);
+CHECK(strong, equivalent);
+#undef CHECK
+#endif // __cpp_lib_bit_cast
+#endif //__cpp_lib_three_way_comparison
+
+
+/*!
+ \page comparison-types.html overview
+ \title Comparison types overview
+ \keyword three-way comparison
+ \inmodule QtCore
+ \sa Qt::strong_ordering, Qt::weak_ordering, Qt::partial_ordering
+
+ \note Qt's comparison types provide functionality equivalent to their C++20
+ standard counterparts. The only reason why they exist is to make the
+ functionality available in C++17 builds, too. In a C++20 build, they
+ implicitly convert to and from the \c std types, making them fully
+ interchangeable. We therefore recommended that you prefer to use the C++
+ standard types in your code, if you can use C++20 in your projects already.
+ The Qt comparison types will be removed in Qt 7.
+
+ Qt provides several comparison types for a \l
+ {https://en.cppreference.com/w/cpp/language/operator_comparison#Three-way_comparison}
+ {three-way comparison}, which are comparable against a \e {zero literal}.
+ To use these comparison types, you need to include the \c <QtCompare>
+ header. These comparison types are categorized based on their \e order,
+ which is a mathematical concept used to describe the arrangement or ranking
+ of elements. The following categories are provided:
+
+ \table 100 %
+ \header
+ \li C++ type
+ \li Qt type
+ \li strict
+ \li total
+ \li Example
+ \row
+ \li \l {https://en.cppreference.com/w/cpp/utility/compare/strong_ordering}
+ {std::strong_ordering}
+ \li Qt::strong_ordering
+ \li yes
+ \li yes
+ \li integral types, case-sensitive strings, QDate, QTime
+ \row
+ \li \l {https://en.cppreference.com/w/cpp/utility/compare/weak_ordering}
+ {std::weak_ordering}
+ \li Qt::weak_ordering
+ \li no
+ \li yes
+ \li case-insensitive strings, unordered associative containers, QDateTime
+ \row
+ \li \l {https://en.cppreference.com/w/cpp/utility/compare/partial_ordering}
+ {std::partial_ordering}
+ \li Qt::partial_ordering
+ \li no
+ \li no
+ \li floating-point types, QOperatingSystemVersion, QVariant
+ \endtable
+
+ The strongest comparison type, Qt::strong_ordering, represents a strict total
+ order. It requires that any two elements be comparable in a way where
+ equality implies substitutability. In other words, equivalent values
+ cannot be distinguished from each other. A practical example would be the
+ case-sensitive comparison of two strings. For instance, when comparing the
+ values \c "Qt" and \c "Qt" the result would be \l Qt::strong_ordering::equal.
+ Both values are indistinguishable and all deterministic operations performed
+ on these values would yield identical results.
+
+ Qt::weak_ordering represents a total order. While any two values still need to
+ be comparable, equivalent values may be distinguishable. The canonical
+ example here would be the case-insensitive comparison of two strings. For
+ instance, when comparing the values \c "Qt" and \c "qt" both hold the same
+ letters but with different representations. This comparison would
+ result in \l Qt::weak_ordering::equivalent, but not actually \c Equal.
+ Another example would be QDateTime, which can represent a given instant in
+ time in terms of local time or any other time-zone, including UTC. The
+ different representations are equivalent, even though their \c time() and
+ sometimes \c date() may differ.
+
+ Qt::partial_ordering represents, as the name implies, a partial ordering. It
+ allows for the possibility that two values may not be comparable, resulting
+ in an \l {Qt::partial_ordering::}{unordered} state. Additionally, equivalent
+ values may still be distinguishable. A practical example would be the
+ comparison of two floating-point values, comparing with NaN (Not-a-Number)
+ would yield an unordered result. Another example is the comparison of two
+ QOperatingSystemVersion objects. Comparing versions of two different
+ operating systems, such as Android and Windows, would produce an unordered
+ result.
+
+ Utilizing these comparison types enhances the expressiveness of defining
+ relations. Furthermore, they serve as a fundamental component for
+ implementing three-way comparison with C++17.
+*/
+
+/*!
+ \headerfile <QtCompare>
+ \inmodule QtCore
+ \title Classes and helpers for defining comparison operators
+ \keyword qtcompare
+
+ \brief The <QtCompare> header file defines \c {Qt::*_ordering} types and helper
+ macros for defining comparison operators.
+
+ This header introduces the \l Qt::partial_ordering, \l Qt::weak_ordering, and
+ \l Qt::strong_ordering types, which are Qt's C++17 backports of
+ \c {std::*_ordering} types.
+
+ This header also contains functions for implementing three-way comparison
+ in C++17.
+
+ The \c {Qt::compareThreeWay()} function overloads provide three-way
+ comparison for built-in C++ types.
+
+ The \l qCompareThreeWay() template serves as a generic three-way comparison
+ implementation. It relies on \c {Qt::compareThreeWay()} and free
+ \c {compareThreeWay()} functions in its implementation.
+*/
+
+/*!
+ \class Qt::strong_ordering
+ \inmodule QtCore
+ \brief Qt::strong_ordering represents a comparison where equivalent values are
+ indistinguishable.
+ \sa Qt::weak_ordering, Qt::partial_ordering, {Comparison types overview}
+ \since 6.7
+
+ A value of type Qt::strong_ordering is typically returned from a three-way
+ comparison function. Such a function compares two objects and establishes
+ how they are ordered. It uses this return type to indicate that the ordering
+ is strict; that is, the function establishes a well-defined total order.
+
+ Qt::strong_ordering has four values, represented by the following symbolic
+ constants:
+
+ \list
+ \li \l less represents that the left operand is less than the right;
+ \li \l equal represents that the left operand is equivalent to the right;
+ \li \l equivalent is an alias for \c equal;
+ \li \l greater represents that the left operand is greater than the right.
+ \endlist
+
+ Qt::strong_ordering is idiomatically used by comparing an instance against a
+ literal zero, for instance like this:
+
+ \code
+
+ // given a, b, c, d as objects of some type that allows for a 3-way compare,
+ // and a compare function declared as follows:
+
+ Qt::strong_ordering compare(T lhs, T rhs); // defined out-of-line
+ ~~~
+
+ Qt::strong_ordering result = compare(a, b);
+ if (result < 0) {
+ // a is less than b
+ }
+
+ if (compare(c, d) >= 0) {
+ // c is greater than or equal to d
+ }
+
+ \endcode
+*/
+
+/*!
+ \fn Qt::strong_ordering::operator Qt::partial_ordering() const
+
+ Converts this Qt::strong_ordering value to a Qt::partial_ordering object using the
+ following rules:
+
+ \list
+ \li \l less converts to \l {Qt::partial_ordering::less}.
+ \li \l equivalent converts to \l {Qt::partial_ordering::equivalent}.
+ \li \l equal converts to \l {Qt::partial_ordering::equivalent}.
+ \li \l greater converts to \l {Qt::partial_ordering::greater}.
+ \endlist
+*/
+
+/*!
+ \fn Qt::strong_ordering::operator Qt::weak_ordering() const
+
+ Converts this Qt::strong_ordering value to a Qt::weak_ordering object using the
+ following rules:
+
+ \list
+ \li \l less converts to \l {Qt::weak_ordering::less}.
+ \li \l equivalent converts to \l {Qt::weak_ordering::equivalent}.
+ \li \l equal converts to \l {Qt::weak_ordering::equivalent}.
+ \li \l greater converts to \l {Qt::weak_ordering::greater}.
+ \endlist
+*/
+
+/*!
+ \fn Qt::strong_ordering::strong_ordering(std::strong_ordering stdorder)
+
+ Constructs a Qt::strong_ordering object from \a stdorder using the following rules:
+
+ \list
+ \li std::strong_ordering::less converts to \l less.
+ \li std::strong_ordering::equivalent converts to \l equivalent.
+ \li std::strong_ordering::equal converts to \l equal.
+ \li std::strong_ordering::greater converts to \l greater.
+ \endlist
+*/
+
+/*!
+ \fn Qt::strong_ordering::operator std::strong_ordering() const
+
+ Converts this Qt::strong_ordering value to a std::strong_ordering object using
+ the following rules:
+
+ \list
+ \li \l less converts to std::strong_ordering::less.
+ \li \l equivalent converts to std::strong_ordering::equivalent.
+ \li \l equal converts to std::strong_ordering::equal.
+ \li \l greater converts to std::strong_ordering::greater.
+ \endlist
+*/
+
+/*!
+ \fn bool Qt::strong_ordering::operator==(Qt::strong_ordering lhs, Qt::strong_ordering rhs)
+
+ Returns true if \a lhs and \a rhs represent the same result;
+ otherwise, returns false.
+*/
+
+/*!
+ \fn bool Qt::strong_ordering::operator!=(Qt::strong_ordering lhs, Qt::strong_ordering rhs)
+
+ Returns true if \a lhs and \a rhs represent different results;
+ otherwise, returns true.
+*/
+
+/*!
+ \internal
+ \relates Qt::strong_ordering
+ \fn bool operator==(Qt::strong_ordering lhs, QtPrivate::CompareAgainstLiteralZero)
+ \fn bool operator!=(Qt::strong_ordering lhs, QtPrivate::CompareAgainstLiteralZero)
+ \fn bool operator< (Qt::strong_ordering lhs, QtPrivate::CompareAgainstLiteralZero)
+ \fn bool operator<=(Qt::strong_ordering lhs, QtPrivate::CompareAgainstLiteralZero)
+ \fn bool operator> (Qt::strong_ordering lhs, QtPrivate::CompareAgainstLiteralZero)
+ \fn bool operator>=(Qt::strong_ordering lhs, QtPrivate::CompareAgainstLiteralZero)
+
+ \fn bool operator==(QtPrivate::CompareAgainstLiteralZero, Qt::strong_ordering rhs)
+ \fn bool operator!=(QtPrivate::CompareAgainstLiteralZero, Qt::strong_ordering rhs)
+ \fn bool operator< (QtPrivate::CompareAgainstLiteralZero, Qt::strong_ordering rhs)
+ \fn bool operator<=(QtPrivate::CompareAgainstLiteralZero, Qt::strong_ordering rhs)
+ \fn bool operator> (QtPrivate::CompareAgainstLiteralZero, Qt::strong_ordering rhs)
+ \fn bool operator>=(QtPrivate::CompareAgainstLiteralZero, Qt::strong_ordering rhs)
+*/
+
+/*!
+ \fn Qt::strong_ordering::is_eq (Qt::strong_ordering o)
+ \fn Qt::strong_ordering::is_neq (Qt::strong_ordering o)
+ \fn Qt::strong_ordering::is_lt (Qt::strong_ordering o)
+ \fn Qt::strong_ordering::is_lteq(Qt::strong_ordering o)
+ \fn Qt::strong_ordering::is_gt (Qt::strong_ordering o)
+ \fn Qt::strong_ordering::is_gteq(Qt::strong_ordering o)
+
+//! [is_eq_table]
+ Converts \a o into the result of one of the six relational operators:
+ \table
+ \header \li Function \li Operation
+ \row \li \c{is_eq} \li \a o \c{== 0}
+ \row \li \c{is_neq} \li \a o \c{!= 0}
+ \row \li \c{is_lt} \li \a o \c{< 0}
+ \row \li \c{is_lteq} \li \a o \c{<= 0}
+ \row \li \c{is_gt} \li \a o \c{> 0}
+ \row \li \c{is_gteq} \li \a o \c{>= 0}
+ \endtable
+//! [is_eq_table]
+
+ These functions are provided for compatibility with \c{std::strong_ordering}.
+*/
+
+/*!
+ \variable Qt::strong_ordering::less
+
+ Represents the result of a comparison where the left operand is less
+ than the right operand.
+*/
+
+/*!
+ \variable Qt::strong_ordering::equivalent
+
+ Represents the result of a comparison where the left operand is equal
+ to the right operand. Same as \l {Qt::strong_ordering::equal}.
+*/
+
+/*!
+ \variable Qt::strong_ordering::equal
+
+ Represents the result of a comparison where the left operand is equal
+ to the right operand. Same as \l {Qt::strong_ordering::equivalent}.
+*/
+
+/*!
+ \variable Qt::strong_ordering::greater
+
+ Represents the result of a comparison where the left operand is greater
+ than the right operand.
+*/
+
+/*!
+ \class Qt::weak_ordering
+ \inmodule QtCore
+ \brief Qt::weak_ordering represents a comparison where equivalent values are
+ still distinguishable.
+ \sa Qt::strong_ordering, Qt::partial_ordering, {Comparison types overview}
+ \since 6.7
+
+ A value of type Qt::weak_ordering is typically returned from a three-way
+ comparison function. Such a function compares two objects and establishes
+ how they are ordered. It uses this return type to indicate that the ordering
+ is weak; that is, equivalent values may be distinguishable.
+
+ Qt::weak_ordering has three values, represented by the following symbolic
+ constants:
+
+ \list
+ \li \l less represents that the left operand is less than the right;
+ \li \l equivalent represents that the left operand is equivalent to the
+ right;
+ \li \l greater represents that the left operand is greater than the right,
+ \endlist
+
+ Qt::weak_ordering is idiomatically used by comparing an instance against a
+ literal zero, for instance like this:
+
+ \code
+
+ // given a, b, c, d as objects of some type that allows for a 3-way compare,
+ // and a compare function declared as follows:
+
+ Qt::weak_ordering compare(T lhs, T rhs); // defined out-of-line
+ ~~~
+
+ Qt::weak_ordering result = compare(a, b);
+ if (result < 0) {
+ // a is less than b
+ }
+
+ if (compare(c, d) >= 0) {
+ // c is greater than or equivalent to d
+ }
+
+ \endcode
+*/
+
+/*!
+ \fn Qt::weak_ordering::operator Qt::partial_ordering() const
+
+ Converts this Qt::weak_ordering value to a Qt::partial_ordering object using the
+ following rules:
+
+ \list
+ \li \l less converts to \l {Qt::partial_ordering::less}.
+ \li \l equivalent converts to \l {Qt::partial_ordering::equivalent}.
+ \li \l greater converts to \l {Qt::partial_ordering::greater}.
+ \endlist
+*/
+
+/*!
+ \fn Qt::weak_ordering::weak_ordering(std::weak_ordering stdorder)
+
+ Constructs a Qt::weak_ordering object from \a stdorder using the following rules:
+
+ \list
+ \li std::weak_ordering::less converts to \l less.
+ \li std::weak_ordering::equivalent converts to \l equivalent.
+ \li std::weak_ordering::greater converts to \l greater.
+ \endlist
+*/
+
+/*!
+ \fn Qt::weak_ordering::operator std::weak_ordering() const
+
+ Converts this Qt::weak_ordering value to a std::weak_ordering object using
+ the following rules:
+
+ \list
+ \li \l less converts to std::weak_ordering::less.
+ \li \l equivalent converts to std::weak_ordering::equivalent.
+ \li \l greater converts to std::weak_ordering::greater.
+ \endlist
+*/
+
+/*!
+ \fn bool Qt::weak_ordering::operator==(Qt::weak_ordering lhs, Qt::weak_ordering rhs)
+
+ Return true if \a lhs and \a rhs represent the same result;
+ otherwise, returns false.
+*/
+
+/*!
+ \fn bool Qt::weak_ordering::operator!=(Qt::weak_ordering lhs, Qt::weak_ordering rhs)
+
+ Return true if \a lhs and \a rhs represent different results;
+ otherwise, returns true.
+*/
+
+/*!
+ \internal
+ \relates Qt::weak_ordering
+ \fn bool operator==(Qt::weak_ordering lhs, QtPrivate::CompareAgainstLiteralZero)
+ \fn bool operator!=(Qt::weak_ordering lhs, QtPrivate::CompareAgainstLiteralZero)
+ \fn bool operator< (Qt::weak_ordering lhs, QtPrivate::CompareAgainstLiteralZero)
+ \fn bool operator<=(Qt::weak_ordering lhs, QtPrivate::CompareAgainstLiteralZero)
+ \fn bool operator> (Qt::weak_ordering lhs, QtPrivate::CompareAgainstLiteralZero)
+ \fn bool operator>=(Qt::weak_ordering lhs, QtPrivate::CompareAgainstLiteralZero)
+
+ \fn bool operator==(QtPrivate::CompareAgainstLiteralZero, Qt::weak_ordering rhs)
+ \fn bool operator!=(QtPrivate::CompareAgainstLiteralZero, Qt::weak_ordering rhs)
+ \fn bool operator< (QtPrivate::CompareAgainstLiteralZero, Qt::weak_ordering rhs)
+ \fn bool operator<=(QtPrivate::CompareAgainstLiteralZero, Qt::weak_ordering rhs)
+ \fn bool operator> (QtPrivate::CompareAgainstLiteralZero, Qt::weak_ordering rhs)
+ \fn bool operator>=(QtPrivate::CompareAgainstLiteralZero, Qt::weak_ordering rhs)
+*/
+
+/*!
+ \fn Qt::weak_ordering::is_eq (Qt::weak_ordering o)
+ \fn Qt::weak_ordering::is_neq (Qt::weak_ordering o)
+ \fn Qt::weak_ordering::is_lt (Qt::weak_ordering o)
+ \fn Qt::weak_ordering::is_lteq(Qt::weak_ordering o)
+ \fn Qt::weak_ordering::is_gt (Qt::weak_ordering o)
+ \fn Qt::weak_ordering::is_gteq(Qt::weak_ordering o)
+
+ \include qcompare.cpp is_eq_table
+
+ These functions are provided for compatibility with \c{std::weak_ordering}.
+*/
+
+/*!
+ \variable Qt::weak_ordering::less
+
+ Represents the result of a comparison where the left operand is less than
+ the right operand.
+*/
+
+/*!
+ \variable Qt::weak_ordering::equivalent
+
+ Represents the result of a comparison where the left operand is equivalent
+ to the right operand.
+*/
+
+/*!
+ \variable Qt::weak_ordering::greater
+
+ Represents the result of a comparison where the left operand is greater
+ than the right operand.
+*/
+
+/*!
+ \class Qt::partial_ordering
+ \inmodule QtCore
+ \brief Qt::partial_ordering represents the result of a comparison that allows
+ for unordered results.
+ \sa Qt::strong_ordering, Qt::weak_ordering, {Comparison types overview}
+ \since 6.7
+
+ A value of type Qt::partial_ordering is typically returned from a
+ three-way comparison function. Such a function compares two objects,
+ establishing whether they are ordered and, if so, their ordering. It uses
+ this return type to indicate that the ordering is partial; that is, not all
+ pairs of values are ordered.
+
+ Qt::partial_ordering has four values, represented by the following symbolic
+ constants:
+
+ \list
+ \li \l less represents that the left operand is less than the right;
+ \li \l equivalent represents that the two operands are equivalent;
+ \li \l greater represents that the left operand is greater than the right;
+ \li \l unordered represents that the two operands are \e {not ordered}.
+ \endlist
+
+ Qt::partial_ordering is idiomatically used by comparing an instance
+ against a literal zero, for instance like this:
+
+ \code
+
+ // given a, b, c, d as objects of some type that allows for a 3-way compare,
+ // and a compare function declared as follows:
+
+ Qt::partial_ordering compare(T lhs, T rhs); // defined out-of-line
+ ~~~
+
+ Qt::partial_ordering result = compare(a, b);
+ if (result < 0) {
+ // a is less than b
+ }
+
+ if (compare(c, d) >= 0) {
+ // c is greater than or equal to d
+ }
+
+ \endcode
+
+ Comparing Qt::partial_ordering::unordered against literal 0 always returns
+ a \c false result.
+*/
+
+/*!
+ \fn Qt::partial_ordering::partial_ordering(std::partial_ordering stdorder)
+
+ Constructs a Qt::partial_ordering object from \a stdorder using the following
+ rules:
+
+ \list
+ \li std::partial_ordering::less converts to \l less.
+ \li std::partial_ordering::equivalent converts to \l equivalent.
+ \li std::partial_ordering::greater converts to \l greater.
+ \li std::partial_ordering::unordered converts to \l unordered
+ \endlist
+*/
+
+/*!
+ \fn Qt::partial_ordering::operator std::partial_ordering() const
+
+ Converts this Qt::partial_ordering value to a std::partial_ordering object using
+ the following rules:
+
+ \list
+ \li \l less converts to std::partial_ordering::less.
+ \li \l equivalent converts to std::partial_ordering::equivalent.
+ \li \l greater converts to std::partial_ordering::greater.
+ \li \l unordered converts to std::partial_ordering::unordered.
+ \endlist
+*/
+
+/*!
+ \fn bool Qt::partial_ordering::operator==(Qt::partial_ordering lhs, Qt::partial_ordering rhs)
+
+ Return true if \a lhs and \a rhs represent the same result;
+ otherwise, returns false.
+*/
+
+/*!
+ \fn bool Qt::partial_ordering::operator!=(Qt::partial_ordering lhs, Qt::partial_ordering rhs)
+
+ Return true if \a lhs and \a rhs represent different results;
+ otherwise, returns true.
+*/
+
+/*!
+ \internal
+ \relates Qt::partial_ordering
+ \fn bool operator==(Qt::partial_ordering lhs, QtPrivate::CompareAgainstLiteralZero)
+ \fn bool operator!=(Qt::partial_ordering lhs, QtPrivate::CompareAgainstLiteralZero)
+ \fn bool operator< (Qt::partial_ordering lhs, QtPrivate::CompareAgainstLiteralZero)
+ \fn bool operator<=(Qt::partial_ordering lhs, QtPrivate::CompareAgainstLiteralZero)
+ \fn bool operator> (Qt::partial_ordering lhs, QtPrivate::CompareAgainstLiteralZero)
+ \fn bool operator>=(Qt::partial_ordering lhs, QtPrivate::CompareAgainstLiteralZero)
+
+ \fn bool operator==(QtPrivate::CompareAgainstLiteralZero, Qt::partial_ordering rhs)
+ \fn bool operator!=(QtPrivate::CompareAgainstLiteralZero, Qt::partial_ordering rhs)
+ \fn bool operator< (QtPrivate::CompareAgainstLiteralZero, Qt::partial_ordering rhs)
+ \fn bool operator<=(QtPrivate::CompareAgainstLiteralZero, Qt::partial_ordering rhs)
+ \fn bool operator> (QtPrivate::CompareAgainstLiteralZero, Qt::partial_ordering rhs)
+ \fn bool operator>=(QtPrivate::CompareAgainstLiteralZero, Qt::partial_ordering rhs)
+*/
+
+/*!
+ \fn Qt::partial_ordering::is_eq (Qt::partial_ordering o)
+ \fn Qt::partial_ordering::is_neq (Qt::partial_ordering o)
+ \fn Qt::partial_ordering::is_lt (Qt::partial_ordering o)
+ \fn Qt::partial_ordering::is_lteq(Qt::partial_ordering o)
+ \fn Qt::partial_ordering::is_gt (Qt::partial_ordering o)
+ \fn Qt::partial_ordering::is_gteq(Qt::partial_ordering o)
+
+ \include qcompare.cpp is_eq_table
+
+ These functions are provided for compatibility with \c{std::partial_ordering}.
+*/
+
+/*!
+ \variable Qt::partial_ordering::less
+
+ Represents the result of a comparison where the left operand is less than
+ the right operand.
+*/
+
+/*!
+ \variable Qt::partial_ordering::equivalent
+
+ Represents the result of a comparison where the two operands are equivalent.
+*/
+
+/*!
+ \variable Qt::partial_ordering::greater
+
+ Represents the result of a comparison where the left operand is greater
+ than the right operand.
+*/
+
+/*!
+ \variable Qt::partial_ordering::unordered
+
+ Represents the result of a comparison where there is no ordering
+ relationship between the two operands.
+*/
+
+/*!
+ \class QPartialOrdering
+ \inmodule QtCore
+ \brief QPartialOrdering represents the result of a comparison that allows
+ for unordered results.
+ \sa Qt::strong_ordering, Qt::weak_ordering, {Comparison types overview}
+ \since 6.0
+
+ A value of type QPartialOrdering is typically returned from a
+ three-way comparison function. Such a function compares two objects,
+ establishing whether they are ordered and, if so, their ordering. It uses
+ this return type to indicate that the ordering is partial; that is, not all
+ pairs of values are ordered.
+
+ QPartialOrdering has four values, represented by the following symbolic
+ constants:
+
+ \list
+ \li \l less represents that the left operand is less than the right;
+ \li \l equivalent represents that the two operands are equivalent;
+ \li \l greater represents that the left operand is greater than the right;
+ \li \l unordered represents that the two operands are \e {not ordered}.
+ \endlist
+
+ QPartialOrdering is idiomatically used by comparing an instance
+ against a literal zero, for instance like this:
+
+ \code
+
+ // given a, b, c, d as objects of some type that allows for a 3-way compare,
+ // and a compare function declared as follows:
+
+ QPartialOrdering compare(T lhs, T rhs); // defined out-of-line
+ ~~~
+
+ QPartialOrdering result = compare(a, b);
+ if (result < 0) {
+ // a is less than b
+ }
+
+ if (compare(c, d) >= 0) {
+ // c is greater than or equal to d
+ }
+
+ \endcode
+
+ Comparing QPartialOrdering::unordered against literal 0 always returns
+ a \c false result.
+*/
+
+/*!
+ \fn QPartialOrdering::QPartialOrdering(std::partial_ordering stdorder)
+
+ Constructs a QPartialOrdering object from \a stdorder using the following
+ rules:
+
+ \list
+ \li std::partial_ordering::less converts to \l less.
+ \li std::partial_ordering::equivalent converts to \l equivalent.
+ \li std::partial_ordering::greater converts to \l greater.
+ \li std::partial_ordering::unordered converts to \l unordered
+ \endlist
+*/
+
+/*!
+ \fn QPartialOrdering::operator std::partial_ordering() const
+
+ Converts this QPartialOrdering value to a std::partial_ordering object using
+ the following rules:
+
+ \list
+ \li \l less converts to std::partial_ordering::less.
+ \li \l equivalent converts to std::partial_ordering::equivalent.
+ \li \l greater converts to std::partial_ordering::greater.
+ \li \l unordered converts to std::partial_ordering::unordered.
+ \endlist
+*/
+
+/*!
+ \fn bool QPartialOrdering::operator==(QPartialOrdering lhs, QPartialOrdering rhs)
+
+ Return true if \a lhs and \a rhs represent the same result;
+ otherwise, returns false.
+*/
+
+/*!
+ \fn bool QPartialOrdering::operator!=(QPartialOrdering lhs, QPartialOrdering rhs)
+
+ Return true if \a lhs and \a rhs represent different results;
+ otherwise, returns true.
+*/
+
+/*!
+ \internal
+ \relates QPartialOrdering
+ \fn bool operator==(QPartialOrdering lhs, QtPrivate::CompareAgainstLiteralZero)
+ \fn bool operator!=(QPartialOrdering lhs, QtPrivate::CompareAgainstLiteralZero)
+ \fn bool operator< (QPartialOrdering lhs, QtPrivate::CompareAgainstLiteralZero)
+ \fn bool operator<=(QPartialOrdering lhs, QtPrivate::CompareAgainstLiteralZero)
+ \fn bool operator> (QPartialOrdering lhs, QtPrivate::CompareAgainstLiteralZero)
+ \fn bool operator>=(QPartialOrdering lhs, QtPrivate::CompareAgainstLiteralZero)
+
+ \fn bool operator==(QtPrivate::CompareAgainstLiteralZero, QPartialOrdering rhs)
+ \fn bool operator!=(QtPrivate::CompareAgainstLiteralZero, QPartialOrdering rhs)
+ \fn bool operator< (QtPrivate::CompareAgainstLiteralZero, QPartialOrdering rhs)
+ \fn bool operator<=(QtPrivate::CompareAgainstLiteralZero, QPartialOrdering rhs)
+ \fn bool operator> (QtPrivate::CompareAgainstLiteralZero, QPartialOrdering rhs)
+ \fn bool operator>=(QtPrivate::CompareAgainstLiteralZero, QPartialOrdering rhs)
+*/
+
+/*!
+ \fn QPartialOrdering::is_eq (QPartialOrdering o)
+ \fn QPartialOrdering::is_neq (QPartialOrdering o)
+ \fn QPartialOrdering::is_lt (QPartialOrdering o)
+ \fn QPartialOrdering::is_lteq(QPartialOrdering o)
+ \fn QPartialOrdering::is_gt (QPartialOrdering o)
+ \fn QPartialOrdering::is_gteq(QPartialOrdering o)
+
+ \since 6.7
+ \include qcompare.cpp is_eq_table
+
+ These functions are provided for compatibility with \c{std::partial_ordering}.
+*/
+
+/*!
+ \variable QPartialOrdering::less
+
+ Represents the result of a comparison where the left operand is less than
+ the right operand.
+*/
+
+/*!
+ \variable QPartialOrdering::equivalent
+
+ Represents the result of a comparison where the two operands are equivalent.
+*/
+
+/*!
+ \variable QPartialOrdering::greater
+
+ Represents the result of a comparison where the left operand is greater
+ than the right operand.
+*/
+
+/*!
+ \variable QPartialOrdering::unordered
+
+ Represents the result of a comparison where there is no ordering
+ relationship between the two operands.
+*/
+
+/*!
+ \variable QPartialOrdering::Less
+
+ Represents the result of a comparison where the left operand is less than
+ the right operand.
+*/
+
+/*!
+ \variable QPartialOrdering::Equivalent
+
+ Represents the result of a comparison where the two operands are equivalent.
+*/
+
+/*!
+ \variable QPartialOrdering::Greater
+
+ Represents the result of a comparison where the left operand is greater
+ than the right operand.
+*/
+
+/*!
+ \variable QPartialOrdering::Unordered
+
+ Represents the result of a comparison where there is no ordering
+ relationship between the two operands.
+*/
+
+/*!
+ \internal
+ \macro Q_DECLARE_EQUALITY_COMPARABLE(Type)
+ \macro Q_DECLARE_EQUALITY_COMPARABLE(LeftType, RightType)
+ \macro Q_DECLARE_EQUALITY_COMPARABLE_LITERAL_TYPE(Type)
+ \macro Q_DECLARE_EQUALITY_COMPARABLE_LITERAL_TYPE(LeftType, RightType)
+ \since 6.7
+ \relates <QtCompare>
+
+ These macros are used to generate \c {operator==()} and \c {operator!=()}.
+
+ In C++17 mode, the mixed-type overloads also generate the reversed
+ operators.
+
+ In C++20 mode, only \c {operator==()} is defined. \c {operator!=()},
+ as well as the reversed operators for mixed-type comparison, are synthesized
+ by the compiler.
+
+ The operators are implemented in terms of a helper function
+ \c {comparesEqual()}.
+ It's the user's responsibility to declare and define this function.
+
+ Consider the following example of a comparison operators declaration:
+
+ \code
+ class MyClass {
+ ...
+ private:
+ friend bool comparesEqual(const MyClass &, const MyClass &) noexcept;
+ Q_DECLARE_EQUALITY_COMPARABLE(MyClass)
+ };
+ \endcode
+
+ When compiled with C++17, the macro will expand into the following code:
+
+ \code
+ friend bool operator==(const MyClass &lhs, const MyClass &rhs) noexcept
+ {
+ // inline implementation which uses comparesEqual()
+ }
+ friend bool operator!=(const MyClass &lhs, const MyClass &rhs) noexcept
+ {
+ // inline implementation which uses comparesEqual()
+ }
+ \endcode
+
+ When compiled with C++20, the macro will expand only into \c {operator==()}:
+
+ \code
+ friend bool operator==(const MyClass &lhs, const MyClass &rhs) noexcept
+ {
+ // inline implementation which uses comparesEqual()
+ }
+ \endcode
+
+ The \c {*_LITERAL_TYPE} versions of the macros are used to generate
+ \c constexpr operators. This means that the helper \c {comparesEqual()}
+ function must also be \c constexpr.
+
+ Consider the following example of a mixed-type \c constexpr comparison
+ operators declaration:
+
+ \code
+ class MyClass {
+ ...
+ private:
+ friend constexpr bool comparesEqual(const MyClass &, int) noexcept;
+ Q_DECLARE_EQUALITY_COMPARABLE_LITERAL_TYPE(MyClass, int)
+ };
+ \endcode
+
+ When compiled with C++17, the macro will expand into the following code:
+
+ \code
+ friend constexpr bool operator==(const MyClass &lhs, int rhs) noexcept
+ {
+ // inline implementation which uses comparesEqual()
+ }
+ friend constexpr bool operator!=(const MyClass &lhs, int rhs) noexcept
+ {
+ // inline implementation which uses comparesEqual()
+ }
+ friend constexpr bool operator==(int lhs, const MyClass &rhs) noexcept
+ {
+ // inline implementation which uses comparesEqual()
+ }
+ friend constexpr bool operator!=(int lhs, const MyClass &rhs) noexcept
+ {
+ // inline implementation which uses comparesEqual()
+ }
+ \endcode
+
+ When compiled with C++20, the macro expands only into \c {operator==()}:
+
+ \code
+ friend constexpr bool operator==(const MyClass &lhs, int rhs) noexcept
+ {
+ // inline implementation which uses comparesEqual()
+ }
+ \endcode
+*/
+
+/*!
+ \internal
+ \macro Q_DECLARE_PARTIALLY_ORDERED(Type)
+ \macro Q_DECLARE_PARTIALLY_ORDERED(LeftType, RightType)
+ \macro Q_DECLARE_PARTIALLY_ORDERED_LITERAL_TYPE(Type)
+ \macro Q_DECLARE_PARTIALLY_ORDERED_LITERAL_TYPE(LeftType, RightType)
+ \since 6.7
+ \relates <QtCompare>
+
+ These macros are used to generate all six relational operators.
+ The operators represent
+ \l {https://en.cppreference.com/w/cpp/utility/compare/partial_ordering}
+ {partial ordering}.
+
+ These macros use respective overloads of the
+ \l {Q_DECLARE_EQUALITY_COMPARABLE} macro to generate \c {operator==()} and
+ \c {operator!=()}, and also generate the four relational operators:
+ \c {operator<()}, \c {operator>()}, \c {operator<=()}, and \c {operator>()}.
+
+ In C++17 mode, the mixed-type overloads also generate the reversed
+ operators.
+
+ In C++20 mode, only \c {operator==()} and \c {operator<=>()} are defined.
+ Other operators, as well as the reversed operators for mixed-type
+ comparison, are synthesized by the compiler.
+
+ The (in)equality operators are implemented in terms of a helper function
+ \c {comparesEqual()}. The other relational operators are implemented in
+ terms of a helper function \c {compareThreeWay()}.
+ The \c {compareThreeWay()} function \e must return an object of type
+ \l Qt::partial_ordering. It's the user's responsibility to declare and define
+ both helper functions.
+
+ Consider the following example of a comparison operators declaration:
+
+ \code
+ class MyClass {
+ ...
+ private:
+ friend bool comparesEqual(const MyClass &, const MyClass &) noexcept;
+ friend Qt::partial_ordering compareThreeWay(const MyClass &, const MyClass &) noexcept;
+ Q_DECLARE_PARTIALLY_ORDERED(MyClass)
+ };
+ \endcode
+
+ When compiled with C++17, the macro will expand into the following code:
+
+ \code
+ // operator==() and operator!=() are generated from
+ // Q_DECLARE_EQUALITY_COMPARABLE
+ friend bool operator<(const MyClass &lhs, const MyClass &rhs) noexcept
+ {
+ // inline implementation which uses compareThreeWay()
+ }
+ friend bool operator>(const MyClass &lhs, const MyClass &rhs) noexcept
+ {
+ // inline implementation which uses compareThreeWay()
+ }
+ friend bool operator<=(const MyClass &lhs, const MyClass &rhs) noexcept
+ {
+ // inline implementation which uses compareThreeWay()
+ }
+ friend bool operator>=(const MyClass &lhs, const MyClass &rhs) noexcept
+ {
+ // inline implementation which uses compareThreeWay()
+ }
+ \endcode
+
+ When compiled with C++20, the macro will expand into \c {operator==()} and
+ \c {operator<=>()}:
+
+ \code
+ friend bool operator==(const MyClass &lhs, const MyClass &rhs) noexcept
+ {
+ // inline implementation which uses comparesEqual()
+ }
+ friend std::partial_ordering
+ operator<=>(const MyClass &lhs, const MyClass &rhs) noexcept
+ {
+ // inline implementation which uses compareThreeWay()
+ }
+ \endcode
+
+ The \c {*_LITERAL_TYPE} versions of the macros are used to generate
+ \c constexpr operators. This means that the helper \c {comparesEqual()} and
+ \c {compareThreeWay()} functions must also be \c constexpr.
+
+ Consider the following example of a mixed-type \c constexpr comparison
+ operators declaration:
+
+ \code
+ class MyClass {
+ ...
+ private:
+ friend constexpr bool comparesEqual(const MyClass &, int) noexcept;
+ friend constexpr Qt::partial_ordering compareThreeWay(const MyClass &, int) noexcept;
+ Q_DECLARE_PARTIALLY_ORDERED_LITERAL_TYPE(MyClass, int)
+ };
+ \endcode
+
+ When compiled with C++17, the macro will expand into the following code:
+
+ \code
+ // operator==(), operator!=(), and their reversed versions are generated
+ // from Q_DECLARE_EQUALITY_COMPARABLE_LITERAL_TYPE
+ friend constexpr bool operator<(const MyClass &lhs, int rhs) noexcept
+ {
+ // inline implementation which uses compareThreeWay()
+ }
+ friend constexpr bool operator>(const MyClass &lhs, int rhs) noexcept
+ {
+ // inline implementation which uses compareThreeWay()
+ }
+ friend constexpr bool operator<=(const MyClass &lhs, int rhs) noexcept
+ {
+ // inline implementation which uses compareThreeWay()
+ }
+ friend constexpr bool operator>=(const MyClass &lhs, int rhs) noexcept
+ {
+ // inline implementation which uses compareThreeWay()
+ }
+ friend constexpr bool operator<(int lhs, const MyClass &rhs) noexcept
+ {
+ // inline implementation which uses compareThreeWay()
+ }
+ friend constexpr bool operator>(int lhs, const MyClass &rhs) noexcept
+ {
+ // inline implementation which uses compareThreeWay()
+ }
+ friend constexpr bool operator<=(int lhs, const MyClass &rhs) noexcept
+ {
+ // inline implementation which uses compareThreeWay()
+ }
+ friend constexpr bool operator>=(int lhs, const MyClass &rhs) noexcept
+ {
+ // inline implementation which uses compareThreeWay()
+ }
+ \endcode
+
+ When compiled with C++20, the macro will expand into \c {operator==()} and
+ \c {operator<=>()}:
+
+ \code
+ friend constexpr bool operator==(const MyClass &lhs, int rhs) noexcept
+ {
+ // inline implementation which uses comparesEqual()
+ }
+ friend constexpr std::partial_ordering
+ operator<=>(const MyClass &lhs, int rhs) noexcept
+ {
+ // inline implementation which uses compareThreeWay()
+ }
+ \endcode
+
+ \sa Q_DECLARE_EQUALITY_COMPARABLE, Q_DECLARE_WEAKLY_ORDERED,
+ Q_DECLARE_STRONGLY_ORDERED
+*/
+
+/*!
+ \internal
+ \macro Q_DECLARE_WEAKLY_ORDERED(Type)
+ \macro Q_DECLARE_WEAKLY_ORDERED(LeftType, RightType)
+ \macro Q_DECLARE_WEAKLY_ORDERED_LITERAL_TYPE(Type)
+ \macro Q_DECLARE_WEAKLY_ORDERED_LITERAL_TYPE(LeftType, RightType)
+ \since 6.7
+ \relates <QtCompare>
+
+ These macros behave similarly to the
+ \l {Q_DECLARE_PARTIALLY_ORDERED} overloads, but represent
+ \l {https://en.cppreference.com/w/cpp/utility/compare/weak_ordering}
+ {weak ordering}.
+
+ The (in)equality operators are implemented in terms of a helper function
+ \c {comparesEqual()}. The other relational operators are implemented in
+ terms of a helper function \c {compareThreeWay()}.
+ The \c {compareThreeWay()} function \e must return an object of type
+ \l Qt::weak_ordering. It's the user's responsibility to declare and define both
+ helper functions.
+
+ The \c {*_LITERAL_TYPE} overloads are used to generate \c constexpr
+ operators. This means that the helper \c {comparesEqual()} and
+ \c {compareThreeWay()} functions must also be \c constexpr.
+
+ See \l {Q_DECLARE_PARTIALLY_ORDERED} for usage examples.
+
+ \sa Q_DECLARE_PARTIALLY_ORDERED, Q_DECLARE_STRONGLY_ORDERED,
+ Q_DECLARE_EQUALITY_COMPARABLE
+*/
+
+/*!
+ \internal
+ \macro Q_DECLARE_STRONGLY_ORDERED(Type)
+ \macro Q_DECLARE_STRONGLY_ORDERED(LeftType, RightType)
+ \macro Q_DECLARE_STRONGLY_ORDERED_LITERAL_TYPE(Type)
+ \macro Q_DECLARE_STRONGLY_ORDERED_LITERAL_TYPE(LeftType, RightType)
+ \since 6.7
+ \relates <QtCompare>
+
+ These macros behave similarly to the
+ \l {Q_DECLARE_PARTIALLY_ORDERED} overloads, but represent
+ \l {https://en.cppreference.com/w/cpp/utility/compare/strong_ordering}
+ {strong ordering}.
+
+ The (in)equality operators are implemented in terms of a helper function
+ \c {comparesEqual()}. The other relational operators are implemented in
+ terms of a helper function \c {compareThreeWay()}.
+ The \c {compareThreeWay()} function \e must return an object of type
+ \l Qt::strong_ordering. It's the user's responsibility to declare and define
+ both helper functions.
+
+ The \c {*_LITERAL_TYPE} overloads are used to generate \c constexpr
+ operators. This means that the helper \c {comparesEqual()} and
+ \c {compareThreeWay()} functions must also be \c constexpr.
+
+ See \l {Q_DECLARE_PARTIALLY_ORDERED} for usage examples.
+
+ \sa Q_DECLARE_PARTIALLY_ORDERED, Q_DECLARE_WEAKLY_ORDERED,
+ Q_DECLARE_EQUALITY_COMPARABLE
+*/
+
+/*!
+ \internal
+ \macro Q_DECLARE_EQUALITY_COMPARABLE(LeftType, RightType, Attributes)
+ \macro Q_DECLARE_EQUALITY_COMPARABLE_LITERAL_TYPE(LeftType, RightType, Attributes)
+ \macro Q_DECLARE_PARTIALLY_ORDERED(LeftType, RightType, Attributes)
+ \macro Q_DECLARE_PARTIALLY_ORDERED_LITERAL_TYPE(LeftType, RightType, Attributes)
+ \macro Q_DECLARE_WEAKLY_ORDERED(LeftType, RightType, Attributes)
+ \macro Q_DECLARE_WEAKLY_ORDERED_LITERAL_TYPE(LeftType, RightType, Attributes)
+ \macro Q_DECLARE_STRONGLY_ORDERED(LeftType, RightType, Attributes)
+ \macro Q_DECLARE_STRONGLY_ORDERED_LITERAL_TYPE(LeftType, RightType, Attributes)
+ \since 6.8
+ \relates <QtCompare>
+
+ These macros behave like their two-argument versions, but allow
+ specification of C++ attributes to add before every generated relational
+ operator.
+
+ As an example, the \c Attributes parameter can be used in Qt to pass
+ the \c QT_ASCII_CAST_WARN marco (whose expansion can mark the function as
+ deprecated) when implementing comparison of encoding-aware string types
+ with C-style strings or byte arrays.
+*/
+
+/*!
+ \fn template <typename LeftInt, typename RightInt, Qt::if_integral<LeftInt> = true, Qt::if_integral<RightInt> = true> auto Qt::compareThreeWay(LeftInt lhs, RightInt rhs)
+ \since 6.7
+ \relates <QtCompare>
+ \overload
+
+ Implements three-way comparison of integral types.
+
+ \note This function participates in overload resolution only if both
+ \c LeftInt and \c RightInt are built-in integral types.
+
+ Returns \c {lhs <=> rhs}, provided \c LeftInt and \c RightInt are built-in
+ integral types. Unlike \c {operator<=>()}, this function template is also
+ available in C++17. See
+ \l {https://en.cppreference.com/w/cpp/language/operator_comparison#Three-way_comparison}
+ {cppreference} for more details.
+
+ This function can also be used in custom \c {compareThreeWay()} functions,
+ when ordering members of a custom class represented by built-in types:
+
+ \code
+ class MyClass {
+ public:
+ ...
+ private:
+ int value;
+ ...
+ friend Qt::strong_ordering
+ compareThreeWay(const MyClass &lhs, const MyClass &rhs) noexcept
+ { return Qt::compareThreeWay(lhs.value, rhs.value); }
+ Q_DECLARE_STRONGLY_ORDERED(MyClass)
+ };
+ \endcode
+
+ Returns an instance of \l Qt::strong_ordering that represents the relation
+ between \a lhs and \a rhs.
+*/
+
+/*!
+ \fn template <typename LeftFloat, typename RightFloat, Qt::if_floating_point<LeftFloat> = true, Qt::if_floating_point<RightFloat> = true> auto Qt::compareThreeWay(LeftFloat lhs, RightFloat rhs)
+ \since 6.7
+ \relates <QtCompare>
+ \overload
+
+ Implements three-way comparison of floating point types.
+
+ \note This function participates in overload resolution only if both
+ \c LeftFloat and \c RightFloat are built-in floating-point types.
+
+ Returns \c {lhs <=> rhs}, provided \c LeftFloat and \c RightFloat are
+ built-in floating-point types. Unlike \c {operator<=>()}, this function
+ template is also available in C++17. See
+ \l {https://en.cppreference.com/w/cpp/language/operator_comparison#Three-way_comparison}
+ {cppreference} for more details.
+
+ This function can also be used in custom \c {compareThreeWay()} functions,
+ when ordering members of a custom class represented by built-in types:
+
+ \code
+ class MyClass {
+ public:
+ ...
+ private:
+ double value;
+ ...
+ friend Qt::partial_ordering
+ compareThreeWay(const MyClass &lhs, const MyClass &rhs) noexcept
+ { return Qt::compareThreeWay(lhs.value, rhs.value); }
+ Q_DECLARE_PARTIALLY_ORDERED(MyClass)
+ };
+ \endcode
+
+ Returns an instance of \l Qt::partial_ordering that represents the relation
+ between \a lhs and \a rhs. If \a lhs or \a rhs is not a number (NaN),
+ \l Qt::partial_ordering::unordered is returned.
+*/
+
+/*!
+ \fn template <typename IntType, typename FloatType, Qt::if_integral<IntType> = true, Qt::if_floating_point<FloatType> = true> auto Qt::compareThreeWay(IntType lhs, FloatType rhs)
+ \since 6.7
+ \relates <QtCompare>
+ \overload
+
+ Implements three-way comparison of integral and floating point types.
+
+ \note This function participates in overload resolution only if \c IntType
+ is a built-in integral type and \c FloatType is a built-in floating-point
+ type.
+
+ This function converts \a lhs to \c FloatType and calls the overload for
+ floating-point types.
+
+ Returns an instance of \l Qt::partial_ordering that represents the relation
+ between \a lhs and \a rhs. If \a rhs is not a number (NaN),
+ \l Qt::partial_ordering::unordered is returned.
+*/
+
+/*!
+ \fn template <typename FloatType, typename IntType, Qt::if_floating_point<FloatType> = true, Qt::if_integral<IntType> = true> auto Qt::compareThreeWay(FloatType lhs, IntType rhs)
+ \since 6.7
+ \relates <QtCompare>
+ \overload
+
+ Implements three-way comparison of floating point and integral types.
+
+ \note This function participates in overload resolution only if \c FloatType
+ is a built-in floating-point type and \c IntType is a built-in integral
+ type.
+
+ This function converts \a rhs to \c FloatType and calls the overload for
+ floating-point types.
+
+ Returns an instance of \l Qt::partial_ordering that represents the relation
+ between \a lhs and \a rhs. If \a lhs is not a number (NaN),
+ \l Qt::partial_ordering::unordered is returned.
+*/
+
+/*!
+ \fn template <typename LeftType, typename RightType, Qt::if_compatible_pointers<LeftType, RightType> = true> Qt::compareThreeWay(const LeftType *lhs, const RightType *rhs)
+ \since 6.7
+ \relates <QtCompare>
+ \overload
+
+ Implements three-way comparison of pointers.
+
+ \note This function participates in overload resolution if \c LeftType and
+ \c RightType are the same type, or base and derived types. It is also used
+ to compare any pointer to \c {std::nullptr_t}.
+
+ Returns an instance of \l Qt::strong_ordering that represents the relation
+ between \a lhs and \a rhs.
+*/
+
+/*!
+ \fn template <class Enum, Qt::if_enum<Enum> = true> Qt::compareThreeWay(Enum lhs, Enum rhs)
+ \since 6.7
+ \relates <QtCompare>
+ \overload
+
+ Implements three-way comparison of enum types.
+
+ \note This function participates in overload resolution only if \c Enum
+ is an enum type.
+
+ This function converts \c Enum to its underlying type and calls the
+ overload for integral types.
+
+ Returns an instance of \l Qt::strong_ordering that represents the relation
+ between \a lhs and \a rhs.
+*/
+
+/*!
+ \fn template <typename LeftType, typename RightType> qCompareThreeWay(const LeftType &lhs, const RightType &rhs)
+ \since 6.7
+ \relates <QtCompare>
+
+ Performs the three-way comparison on \a lhs and \a rhs and returns one of
+ the Qt ordering types as a result. This function is available for both
+ C++17 and C++20.
+
+ The actual returned type depends on \c LeftType and \c RightType.
+
+ \note This function template is only available when \c {compareThreeWay()}
+ is implemented for the \c {(LeftType, RightType)} pair or the reversed
+ \c {(RightType, LeftType)} pair.
+
+ This method is equivalent to
+
+ \code
+ using Qt::compareThreeWay;
+ return compareThreeWay(lhs, rhs);
+ \endcode
+
+ where \c {Qt::compareThreeWay} is the Qt implementation of three-way
+ comparison for built-in types.
+
+ The free \c {compareThreeWay} functions should provide three-way comparison
+ for custom types. The functions should return one of the Qt ordering types.
+
+ Qt provides \c {compareThreeWay} implementation for some of its types.
+
+ \note \b {Do not} re-implement \c {compareThreeWay()} for Qt types, as more
+ Qt types will get support for it in future Qt releases.
+
+ Use this function primarly in generic code, when you know nothing about
+ \c LeftType and \c RightType.
+
+ If you know the types, use
+
+ \list
+ \li \c {Qt::compareThreeWay} for built-in types
+ \li \c {compareThreeWay} for custom types
+ \endlist
+
+ Use \c {operator<=>()} directly in code that will only be compiled with
+ C++20 or later.
+
+ \sa Qt::partial_ordering, Qt::weak_ordering, Qt::strong_ordering
+*/
+
+QT_END_NAMESPACE
diff --git a/src/corelib/global/qcompare.h b/src/corelib/global/qcompare.h
index 8bc3029c89..9dd244c8f9 100644
--- a/src/corelib/global/qcompare.h
+++ b/src/corelib/global/qcompare.h
@@ -1,41 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QCOMPARE_H
#define QCOMPARE_H
@@ -47,6 +12,13 @@
#include <QtCore/qglobal.h>
#include <QtCore/qcompare_impl.h>
+#ifdef __cpp_lib_bit_cast
+#include <bit>
+#endif
+#ifdef __cpp_lib_three_way_comparison
+#include <compare>
+#endif
+
QT_BEGIN_NAMESPACE
namespace QtPrivate {
@@ -63,11 +35,645 @@ enum class Ordering : CompareUnderlyingType
enum class Uncomparable : CompareUnderlyingType
{
- Unordered = -127
+ Unordered =
+ #if defined(_LIBCPP_VERSION) // libc++
+ -127
+ #elif defined(__GLIBCXX__) // libstdc++
+ 2
+ #else // assume MSSTL
+ -128
+ #endif
};
} // namespace QtPrivate
+namespace QtOrderingPrivate {
+
+template <typename O>
+constexpr O reversed(O o) noexcept
+{
+ // https://eel.is/c++draft/cmp.partialord#5
+ return is_lt(o) ? O::greater :
+ is_gt(o) ? O::less :
+ /*else*/ o ;
+}
+
+} // namespace QtOrderingPrivate
+
+namespace Qt {
+
+class partial_ordering
+{
+public:
+ static const partial_ordering less;
+ static const partial_ordering equivalent;
+ static const partial_ordering greater;
+ static const partial_ordering unordered;
+
+ friend constexpr bool operator==(partial_ordering lhs,
+ QtPrivate::CompareAgainstLiteralZero) noexcept
+ { return lhs.isOrdered() && lhs.m_order == 0; }
+
+ friend constexpr bool operator!=(partial_ordering lhs,
+ QtPrivate::CompareAgainstLiteralZero) noexcept
+ { return lhs.isOrdered() && lhs.m_order != 0; }
+
+ friend constexpr bool operator< (partial_ordering lhs,
+ QtPrivate::CompareAgainstLiteralZero) noexcept
+ { return lhs.isOrdered() && lhs.m_order < 0; }
+
+ friend constexpr bool operator<=(partial_ordering lhs,
+ QtPrivate::CompareAgainstLiteralZero) noexcept
+ { return lhs.isOrdered() && lhs.m_order <= 0; }
+
+ friend constexpr bool operator> (partial_ordering lhs,
+ QtPrivate::CompareAgainstLiteralZero) noexcept
+ { return lhs.isOrdered() && lhs.m_order > 0; }
+
+ friend constexpr bool operator>=(partial_ordering lhs,
+ QtPrivate::CompareAgainstLiteralZero) noexcept
+ { return lhs.isOrdered() && lhs.m_order >= 0; }
+
+
+ friend constexpr bool operator==(QtPrivate::CompareAgainstLiteralZero,
+ partial_ordering rhs) noexcept
+ { return rhs.isOrdered() && 0 == rhs.m_order; }
+
+ friend constexpr bool operator!=(QtPrivate::CompareAgainstLiteralZero,
+ partial_ordering rhs) noexcept
+ { return rhs.isOrdered() && 0 != rhs.m_order; }
+
+ friend constexpr bool operator< (QtPrivate::CompareAgainstLiteralZero,
+ partial_ordering rhs) noexcept
+ { return rhs.isOrdered() && 0 < rhs.m_order; }
+
+ friend constexpr bool operator<=(QtPrivate::CompareAgainstLiteralZero,
+ partial_ordering rhs) noexcept
+ { return rhs.isOrdered() && 0 <= rhs.m_order; }
+
+ friend constexpr bool operator> (QtPrivate::CompareAgainstLiteralZero,
+ partial_ordering rhs) noexcept
+ { return rhs.isOrdered() && 0 > rhs.m_order; }
+
+ friend constexpr bool operator>=(QtPrivate::CompareAgainstLiteralZero,
+ partial_ordering rhs) noexcept
+ { return rhs.isOrdered() && 0 >= rhs.m_order; }
+
+
+#ifdef __cpp_lib_three_way_comparison
+ friend constexpr std::partial_ordering
+ operator<=>(partial_ordering lhs, QtPrivate::CompareAgainstLiteralZero) noexcept
+ { return lhs; } // https://eel.is/c++draft/cmp.partialord#4
+
+ friend constexpr std::partial_ordering
+ operator<=>(QtPrivate::CompareAgainstLiteralZero, partial_ordering rhs) noexcept
+ { return QtOrderingPrivate::reversed(rhs); }
+#endif // __cpp_lib_three_way_comparison
+
+
+ friend constexpr bool operator==(partial_ordering lhs, partial_ordering rhs) noexcept
+ { return lhs.m_order == rhs.m_order; }
+
+ friend constexpr bool operator!=(partial_ordering lhs, partial_ordering rhs) noexcept
+ { return lhs.m_order != rhs.m_order; }
+
+#ifdef __cpp_lib_three_way_comparison
+ constexpr Q_IMPLICIT partial_ordering(std::partial_ordering stdorder) noexcept
+ {
+ if (stdorder == std::partial_ordering::less)
+ m_order = static_cast<QtPrivate::CompareUnderlyingType>(QtPrivate::Ordering::Less);
+ else if (stdorder == std::partial_ordering::equivalent)
+ m_order = static_cast<QtPrivate::CompareUnderlyingType>(QtPrivate::Ordering::Equivalent);
+ else if (stdorder == std::partial_ordering::greater)
+ m_order = static_cast<QtPrivate::CompareUnderlyingType>(QtPrivate::Ordering::Greater);
+ else if (stdorder == std::partial_ordering::unordered)
+ m_order = static_cast<QtPrivate::CompareUnderlyingType>(QtPrivate::Uncomparable::Unordered);
+ }
+
+ constexpr Q_IMPLICIT operator std::partial_ordering() const noexcept
+ {
+ static_assert(sizeof(*this) == sizeof(std::partial_ordering));
+#ifdef __cpp_lib_bit_cast
+ return std::bit_cast<std::partial_ordering>(*this);
+#else
+ using O = QtPrivate::Ordering;
+ using U = QtPrivate::Uncomparable;
+ using R = std::partial_ordering;
+ switch (m_order) {
+ case qToUnderlying(O::Less): return R::less;
+ case qToUnderlying(O::Greater): return R::greater;
+ case qToUnderlying(O::Equivalent): return R::equivalent;
+ case qToUnderlying(U::Unordered): return R::unordered;
+ }
+ Q_UNREACHABLE_RETURN(R::unordered);
+#endif // __cpp_lib_bit_cast
+ }
+
+ friend constexpr bool operator==(partial_ordering lhs, std::partial_ordering rhs) noexcept
+ { return static_cast<std::partial_ordering>(lhs) == rhs; }
+
+ friend constexpr bool operator!=(partial_ordering lhs, std::partial_ordering rhs) noexcept
+ { return static_cast<std::partial_ordering>(lhs) != rhs; }
+
+ friend constexpr bool operator==(std::partial_ordering lhs, partial_ordering rhs) noexcept
+ { return lhs == static_cast<std::partial_ordering>(rhs); }
+
+ friend constexpr bool operator!=(std::partial_ordering lhs, partial_ordering rhs) noexcept
+ { return lhs != static_cast<std::partial_ordering>(rhs); }
+#endif // __cpp_lib_three_way_comparison
+
+private:
+ friend class weak_ordering;
+ friend class strong_ordering;
+
+ constexpr explicit partial_ordering(QtPrivate::Ordering order) noexcept
+ : m_order(static_cast<QtPrivate::CompareUnderlyingType>(order))
+ {}
+ constexpr explicit partial_ordering(QtPrivate::Uncomparable order) noexcept
+ : m_order(static_cast<QtPrivate::CompareUnderlyingType>(order))
+ {}
+
+ QT_WARNING_PUSH
+ // https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100903
+ QT_WARNING_DISABLE_GCC("-Wzero-as-null-pointer-constant")
+ friend constexpr bool is_eq (partial_ordering o) noexcept { return o == 0; }
+ friend constexpr bool is_neq (partial_ordering o) noexcept { return o != 0; }
+ friend constexpr bool is_lt (partial_ordering o) noexcept { return o < 0; }
+ friend constexpr bool is_lteq(partial_ordering o) noexcept { return o <= 0; }
+ friend constexpr bool is_gt (partial_ordering o) noexcept { return o > 0; }
+ friend constexpr bool is_gteq(partial_ordering o) noexcept { return o >= 0; }
+ QT_WARNING_POP
+
+ // instead of the exposition only is_ordered member in [cmp.partialord],
+ // use a private function
+ constexpr bool isOrdered() const noexcept
+ { return m_order != static_cast<QtPrivate::CompareUnderlyingType>(QtPrivate::Uncomparable::Unordered); }
+
+ QtPrivate::CompareUnderlyingType m_order;
+};
+
+inline constexpr partial_ordering partial_ordering::less(QtPrivate::Ordering::Less);
+inline constexpr partial_ordering partial_ordering::equivalent(QtPrivate::Ordering::Equivalent);
+inline constexpr partial_ordering partial_ordering::greater(QtPrivate::Ordering::Greater);
+inline constexpr partial_ordering partial_ordering::unordered(QtPrivate::Uncomparable::Unordered);
+
+class weak_ordering
+{
+public:
+ static const weak_ordering less;
+ static const weak_ordering equivalent;
+ static const weak_ordering greater;
+
+ constexpr Q_IMPLICIT operator partial_ordering() const noexcept
+ { return partial_ordering(static_cast<QtPrivate::Ordering>(m_order)); }
+
+ friend constexpr bool operator==(weak_ordering lhs,
+ QtPrivate::CompareAgainstLiteralZero) noexcept
+ { return lhs.m_order == 0; }
+
+ friend constexpr bool operator!=(weak_ordering lhs,
+ QtPrivate::CompareAgainstLiteralZero) noexcept
+ { return lhs.m_order != 0; }
+
+ friend constexpr bool operator< (weak_ordering lhs,
+ QtPrivate::CompareAgainstLiteralZero) noexcept
+ { return lhs.m_order < 0; }
+
+ friend constexpr bool operator<=(weak_ordering lhs,
+ QtPrivate::CompareAgainstLiteralZero) noexcept
+ { return lhs.m_order <= 0; }
+
+ friend constexpr bool operator> (weak_ordering lhs,
+ QtPrivate::CompareAgainstLiteralZero) noexcept
+ { return lhs.m_order > 0; }
+
+ friend constexpr bool operator>=(weak_ordering lhs,
+ QtPrivate::CompareAgainstLiteralZero) noexcept
+ { return lhs.m_order >= 0; }
+
+
+ friend constexpr bool operator==(QtPrivate::CompareAgainstLiteralZero,
+ weak_ordering rhs) noexcept
+ { return 0 == rhs.m_order; }
+
+ friend constexpr bool operator!=(QtPrivate::CompareAgainstLiteralZero,
+ weak_ordering rhs) noexcept
+ { return 0 != rhs.m_order; }
+
+ friend constexpr bool operator< (QtPrivate::CompareAgainstLiteralZero,
+ weak_ordering rhs) noexcept
+ { return 0 < rhs.m_order; }
+
+ friend constexpr bool operator<=(QtPrivate::CompareAgainstLiteralZero,
+ weak_ordering rhs) noexcept
+ { return 0 <= rhs.m_order; }
+
+ friend constexpr bool operator> (QtPrivate::CompareAgainstLiteralZero,
+ weak_ordering rhs) noexcept
+ { return 0 > rhs.m_order; }
+
+ friend constexpr bool operator>=(QtPrivate::CompareAgainstLiteralZero,
+ weak_ordering rhs) noexcept
+ { return 0 >= rhs.m_order; }
+
+
+#ifdef __cpp_lib_three_way_comparison
+ friend constexpr std::weak_ordering
+ operator<=>(weak_ordering lhs, QtPrivate::CompareAgainstLiteralZero) noexcept
+ { return lhs; } // https://eel.is/c++draft/cmp.weakord#5
+
+ friend constexpr std::weak_ordering
+ operator<=>(QtPrivate::CompareAgainstLiteralZero, weak_ordering rhs) noexcept
+ { return QtOrderingPrivate::reversed(rhs); }
+#endif // __cpp_lib_three_way_comparison
+
+
+ friend constexpr bool operator==(weak_ordering lhs, weak_ordering rhs) noexcept
+ { return lhs.m_order == rhs.m_order; }
+
+ friend constexpr bool operator!=(weak_ordering lhs, weak_ordering rhs) noexcept
+ { return lhs.m_order != rhs.m_order; }
+
+ friend constexpr bool operator==(weak_ordering lhs, partial_ordering rhs) noexcept
+ { return static_cast<partial_ordering>(lhs) == rhs; }
+
+ friend constexpr bool operator!=(weak_ordering lhs, partial_ordering rhs) noexcept
+ { return static_cast<partial_ordering>(lhs) != rhs; }
+
+ friend constexpr bool operator==(partial_ordering lhs, weak_ordering rhs) noexcept
+ { return lhs == static_cast<partial_ordering>(rhs); }
+
+ friend constexpr bool operator!=(partial_ordering lhs, weak_ordering rhs) noexcept
+ { return lhs != static_cast<partial_ordering>(rhs); }
+
+#ifdef __cpp_lib_three_way_comparison
+ constexpr Q_IMPLICIT weak_ordering(std::weak_ordering stdorder) noexcept
+ {
+ if (stdorder == std::weak_ordering::less)
+ m_order = static_cast<QtPrivate::CompareUnderlyingType>(QtPrivate::Ordering::Less);
+ else if (stdorder == std::weak_ordering::equivalent)
+ m_order = static_cast<QtPrivate::CompareUnderlyingType>(QtPrivate::Ordering::Equivalent);
+ else if (stdorder == std::weak_ordering::greater)
+ m_order = static_cast<QtPrivate::CompareUnderlyingType>(QtPrivate::Ordering::Greater);
+ }
+
+ constexpr Q_IMPLICIT operator std::weak_ordering() const noexcept
+ {
+ static_assert(sizeof(*this) == sizeof(std::weak_ordering));
+#ifdef __cpp_lib_bit_cast
+ return std::bit_cast<std::weak_ordering>(*this);
+#else
+ using O = QtPrivate::Ordering;
+ using R = std::weak_ordering;
+ switch (m_order) {
+ case qToUnderlying(O::Less): return R::less;
+ case qToUnderlying(O::Greater): return R::greater;
+ case qToUnderlying(O::Equivalent): return R::equivalent;
+ }
+ Q_UNREACHABLE_RETURN(R::equivalent);
+#endif // __cpp_lib_bit_cast
+ }
+
+ friend constexpr bool operator==(weak_ordering lhs, std::weak_ordering rhs) noexcept
+ { return static_cast<std::weak_ordering>(lhs) == rhs; }
+
+ friend constexpr bool operator!=(weak_ordering lhs, std::weak_ordering rhs) noexcept
+ { return static_cast<std::weak_ordering>(lhs) != rhs; }
+
+ friend constexpr bool operator==(weak_ordering lhs, std::partial_ordering rhs) noexcept
+ { return static_cast<std::weak_ordering>(lhs) == rhs; }
+
+ friend constexpr bool operator!=(weak_ordering lhs, std::partial_ordering rhs) noexcept
+ { return static_cast<std::weak_ordering>(lhs) != rhs; }
+
+ friend constexpr bool operator==(weak_ordering lhs, std::strong_ordering rhs) noexcept
+ { return static_cast<std::weak_ordering>(lhs) == rhs; }
+
+ friend constexpr bool operator!=(weak_ordering lhs, std::strong_ordering rhs) noexcept
+ { return static_cast<std::weak_ordering>(lhs) != rhs; }
+
+ friend constexpr bool operator==(std::weak_ordering lhs, weak_ordering rhs) noexcept
+ { return lhs == static_cast<std::weak_ordering>(rhs); }
+
+ friend constexpr bool operator!=(std::weak_ordering lhs, weak_ordering rhs) noexcept
+ { return lhs != static_cast<std::weak_ordering>(rhs); }
+
+ friend constexpr bool operator==(std::partial_ordering lhs, weak_ordering rhs) noexcept
+ { return lhs == static_cast<std::weak_ordering>(rhs); }
+
+ friend constexpr bool operator!=(std::partial_ordering lhs, weak_ordering rhs) noexcept
+ { return lhs != static_cast<std::weak_ordering>(rhs); }
+
+ friend constexpr bool operator==(std::strong_ordering lhs, weak_ordering rhs) noexcept
+ { return lhs == static_cast<std::weak_ordering>(rhs); }
+
+ friend constexpr bool operator!=(std::strong_ordering lhs, weak_ordering rhs) noexcept
+ { return lhs != static_cast<std::weak_ordering>(rhs); }
+#endif // __cpp_lib_three_way_comparison
+
+private:
+ friend class strong_ordering;
+
+ constexpr explicit weak_ordering(QtPrivate::Ordering order) noexcept
+ : m_order(static_cast<QtPrivate::CompareUnderlyingType>(order))
+ {}
+
+ QT_WARNING_PUSH
+ // https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100903
+ QT_WARNING_DISABLE_GCC("-Wzero-as-null-pointer-constant")
+ friend constexpr bool is_eq (weak_ordering o) noexcept { return o == 0; }
+ friend constexpr bool is_neq (weak_ordering o) noexcept { return o != 0; }
+ friend constexpr bool is_lt (weak_ordering o) noexcept { return o < 0; }
+ friend constexpr bool is_lteq(weak_ordering o) noexcept { return o <= 0; }
+ friend constexpr bool is_gt (weak_ordering o) noexcept { return o > 0; }
+ friend constexpr bool is_gteq(weak_ordering o) noexcept { return o >= 0; }
+ QT_WARNING_POP
+
+ QtPrivate::CompareUnderlyingType m_order;
+};
+
+inline constexpr weak_ordering weak_ordering::less(QtPrivate::Ordering::Less);
+inline constexpr weak_ordering weak_ordering::equivalent(QtPrivate::Ordering::Equivalent);
+inline constexpr weak_ordering weak_ordering::greater(QtPrivate::Ordering::Greater);
+
+class strong_ordering
+{
+public:
+ static const strong_ordering less;
+ static const strong_ordering equivalent;
+ static const strong_ordering equal;
+ static const strong_ordering greater;
+
+ constexpr Q_IMPLICIT operator partial_ordering() const noexcept
+ { return partial_ordering(static_cast<QtPrivate::Ordering>(m_order)); }
+
+ constexpr Q_IMPLICIT operator weak_ordering() const noexcept
+ { return weak_ordering(static_cast<QtPrivate::Ordering>(m_order)); }
+
+ friend constexpr bool operator==(strong_ordering lhs,
+ QtPrivate::CompareAgainstLiteralZero) noexcept
+ { return lhs.m_order == 0; }
+
+ friend constexpr bool operator!=(strong_ordering lhs,
+ QtPrivate::CompareAgainstLiteralZero) noexcept
+ { return lhs.m_order != 0; }
+
+ friend constexpr bool operator< (strong_ordering lhs,
+ QtPrivate::CompareAgainstLiteralZero) noexcept
+ { return lhs.m_order < 0; }
+
+ friend constexpr bool operator<=(strong_ordering lhs,
+ QtPrivate::CompareAgainstLiteralZero) noexcept
+ { return lhs.m_order <= 0; }
+
+ friend constexpr bool operator> (strong_ordering lhs,
+ QtPrivate::CompareAgainstLiteralZero) noexcept
+ { return lhs.m_order > 0; }
+
+ friend constexpr bool operator>=(strong_ordering lhs,
+ QtPrivate::CompareAgainstLiteralZero) noexcept
+ { return lhs.m_order >= 0; }
+
+
+ friend constexpr bool operator==(QtPrivate::CompareAgainstLiteralZero,
+ strong_ordering rhs) noexcept
+ { return 0 == rhs.m_order; }
+
+ friend constexpr bool operator!=(QtPrivate::CompareAgainstLiteralZero,
+ strong_ordering rhs) noexcept
+ { return 0 != rhs.m_order; }
+
+ friend constexpr bool operator< (QtPrivate::CompareAgainstLiteralZero,
+ strong_ordering rhs) noexcept
+ { return 0 < rhs.m_order; }
+
+ friend constexpr bool operator<=(QtPrivate::CompareAgainstLiteralZero,
+ strong_ordering rhs) noexcept
+ { return 0 <= rhs.m_order; }
+
+ friend constexpr bool operator> (QtPrivate::CompareAgainstLiteralZero,
+ strong_ordering rhs) noexcept
+ { return 0 > rhs.m_order; }
+
+ friend constexpr bool operator>=(QtPrivate::CompareAgainstLiteralZero,
+ strong_ordering rhs) noexcept
+ { return 0 >= rhs.m_order; }
+
+
+#ifdef __cpp_lib_three_way_comparison
+ friend constexpr std::strong_ordering
+ operator<=>(strong_ordering lhs, QtPrivate::CompareAgainstLiteralZero) noexcept
+ { return lhs; } // https://eel.is/c++draft/cmp.strongord#6
+
+ friend constexpr std::strong_ordering
+ operator<=>(QtPrivate::CompareAgainstLiteralZero, strong_ordering rhs) noexcept
+ { return QtOrderingPrivate::reversed(rhs); }
+#endif // __cpp_lib_three_way_comparison
+
+
+ friend constexpr bool operator==(strong_ordering lhs, strong_ordering rhs) noexcept
+ { return lhs.m_order == rhs.m_order; }
+
+ friend constexpr bool operator!=(strong_ordering lhs, strong_ordering rhs) noexcept
+ { return lhs.m_order != rhs.m_order; }
+
+ friend constexpr bool operator==(strong_ordering lhs, partial_ordering rhs) noexcept
+ { return static_cast<partial_ordering>(lhs) == rhs; }
+
+ friend constexpr bool operator!=(strong_ordering lhs, partial_ordering rhs) noexcept
+ { return static_cast<partial_ordering>(lhs) == rhs; }
+
+ friend constexpr bool operator==(partial_ordering lhs, strong_ordering rhs) noexcept
+ { return lhs == static_cast<partial_ordering>(rhs); }
+
+ friend constexpr bool operator!=(partial_ordering lhs, strong_ordering rhs) noexcept
+ { return lhs != static_cast<partial_ordering>(rhs); }
+
+ friend constexpr bool operator==(strong_ordering lhs, weak_ordering rhs) noexcept
+ { return static_cast<weak_ordering>(lhs) == rhs; }
+
+ friend constexpr bool operator!=(strong_ordering lhs, weak_ordering rhs) noexcept
+ { return static_cast<weak_ordering>(lhs) == rhs; }
+
+ friend constexpr bool operator==(weak_ordering lhs, strong_ordering rhs) noexcept
+ { return lhs == static_cast<weak_ordering>(rhs); }
+
+ friend constexpr bool operator!=(weak_ordering lhs, strong_ordering rhs) noexcept
+ { return lhs != static_cast<weak_ordering>(rhs); }
+
+#ifdef __cpp_lib_three_way_comparison
+ constexpr Q_IMPLICIT strong_ordering(std::strong_ordering stdorder) noexcept
+ {
+ if (stdorder == std::strong_ordering::less)
+ m_order = static_cast<QtPrivate::CompareUnderlyingType>(QtPrivate::Ordering::Less);
+ else if (stdorder == std::strong_ordering::equivalent)
+ m_order = static_cast<QtPrivate::CompareUnderlyingType>(QtPrivate::Ordering::Equivalent);
+ else if (stdorder == std::strong_ordering::equal)
+ m_order = static_cast<QtPrivate::CompareUnderlyingType>(QtPrivate::Ordering::Equal);
+ else if (stdorder == std::strong_ordering::greater)
+ m_order = static_cast<QtPrivate::CompareUnderlyingType>(QtPrivate::Ordering::Greater);
+ }
+
+ constexpr Q_IMPLICIT operator std::strong_ordering() const noexcept
+ {
+ static_assert(sizeof(*this) == sizeof(std::strong_ordering));
+#ifdef __cpp_lib_bit_cast
+ return std::bit_cast<std::strong_ordering>(*this);
+#else
+ using O = QtPrivate::Ordering;
+ using R = std::strong_ordering;
+ switch (m_order) {
+ case qToUnderlying(O::Less): return R::less;
+ case qToUnderlying(O::Greater): return R::greater;
+ case qToUnderlying(O::Equal): return R::equal;
+ }
+ Q_UNREACHABLE_RETURN(R::equal);
+#endif // __cpp_lib_bit_cast
+ }
+
+ friend constexpr bool operator==(strong_ordering lhs, std::strong_ordering rhs) noexcept
+ { return static_cast<std::strong_ordering>(lhs) == rhs; }
+
+ friend constexpr bool operator!=(strong_ordering lhs, std::strong_ordering rhs) noexcept
+ { return static_cast<std::strong_ordering>(lhs) != rhs; }
+
+ friend constexpr bool operator==(strong_ordering lhs, std::partial_ordering rhs) noexcept
+ { return static_cast<std::strong_ordering>(lhs) == rhs; }
+
+ friend constexpr bool operator!=(strong_ordering lhs, std::partial_ordering rhs) noexcept
+ { return static_cast<std::strong_ordering>(lhs) != rhs; }
+
+ friend constexpr bool operator==(strong_ordering lhs, std::weak_ordering rhs) noexcept
+ { return static_cast<std::strong_ordering>(lhs) == rhs; }
+
+ friend constexpr bool operator!=(strong_ordering lhs, std::weak_ordering rhs) noexcept
+ { return static_cast<std::strong_ordering>(lhs) != rhs; }
+
+ friend constexpr bool operator==(std::strong_ordering lhs, strong_ordering rhs) noexcept
+ { return lhs == static_cast<std::strong_ordering>(rhs); }
+
+ friend constexpr bool operator!=(std::strong_ordering lhs, strong_ordering rhs) noexcept
+ { return lhs != static_cast<std::strong_ordering>(rhs); }
+
+ friend constexpr bool operator==(std::partial_ordering lhs, strong_ordering rhs) noexcept
+ { return lhs == static_cast<std::strong_ordering>(rhs); }
+
+ friend constexpr bool operator!=(std::partial_ordering lhs, strong_ordering rhs) noexcept
+ { return lhs != static_cast<std::strong_ordering>(rhs); }
+
+ friend constexpr bool operator==(std::weak_ordering lhs, strong_ordering rhs) noexcept
+ { return lhs == static_cast<std::strong_ordering>(rhs); }
+
+ friend constexpr bool operator!=(std::weak_ordering lhs, strong_ordering rhs) noexcept
+ { return lhs != static_cast<std::strong_ordering>(rhs); }
+#endif // __cpp_lib_three_way_comparison
+
+ private:
+ constexpr explicit strong_ordering(QtPrivate::Ordering order) noexcept
+ : m_order(static_cast<QtPrivate::CompareUnderlyingType>(order))
+ {}
+
+ QT_WARNING_PUSH
+ // https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100903
+ QT_WARNING_DISABLE_GCC("-Wzero-as-null-pointer-constant")
+ friend constexpr bool is_eq (strong_ordering o) noexcept { return o == 0; }
+ friend constexpr bool is_neq (strong_ordering o) noexcept { return o != 0; }
+ friend constexpr bool is_lt (strong_ordering o) noexcept { return o < 0; }
+ friend constexpr bool is_lteq(strong_ordering o) noexcept { return o <= 0; }
+ friend constexpr bool is_gt (strong_ordering o) noexcept { return o > 0; }
+ friend constexpr bool is_gteq(strong_ordering o) noexcept { return o >= 0; }
+ QT_WARNING_POP
+
+ QtPrivate::CompareUnderlyingType m_order;
+};
+
+inline constexpr strong_ordering strong_ordering::less(QtPrivate::Ordering::Less);
+inline constexpr strong_ordering strong_ordering::equivalent(QtPrivate::Ordering::Equivalent);
+inline constexpr strong_ordering strong_ordering::equal(QtPrivate::Ordering::Equal);
+inline constexpr strong_ordering strong_ordering::greater(QtPrivate::Ordering::Greater);
+
+} // namespace Qt
+
+QT_BEGIN_INCLUDE_NAMESPACE
+
+// This is intentionally included after Qt::*_ordering types and before
+// qCompareThreeWay. Do not change!
+#include <QtCore/qcomparehelpers.h>
+
+QT_END_INCLUDE_NAMESPACE
+
+namespace QtPrivate {
+
+namespace CompareThreeWayTester {
+
+ using Qt::compareThreeWay;
+
+ // Check if compareThreeWay is implemented for the (LT, RT) argument
+ // pair.
+ template <typename LT, typename RT, typename = void>
+ constexpr bool hasCompareThreeWay = false;
+
+ template <typename LT, typename RT>
+ constexpr bool hasCompareThreeWay<
+ LT, RT, std::void_t<decltype(compareThreeWay(std::declval<LT>(), std::declval<RT>()))>
+ > = true;
+
+ // Check if the operation is noexcept. We have two different overloads,
+ // depending on the available compareThreeWay() implementation.
+ // Both are declared, but not implemented. To be used only in unevaluated
+ // context.
+
+ template <typename LT, typename RT,
+ std::enable_if_t<hasCompareThreeWay<LT, RT>, bool> = true>
+ constexpr bool compareThreeWayNoexcept() noexcept
+ { return noexcept(compareThreeWay(std::declval<LT>(), std::declval<RT>())); }
+
+ template <typename LT, typename RT,
+ std::enable_if_t<!hasCompareThreeWay<LT, RT> && hasCompareThreeWay<RT, LT>,
+ bool> = true>
+ constexpr bool compareThreeWayNoexcept() noexcept
+ { return noexcept(compareThreeWay(std::declval<RT>(), std::declval<LT>())); }
+
+} // namespace CompareThreeWayTester
+
+} // namespace QtPrivate
+
+#if defined(Q_QDOC)
+
+template <typename LeftType, typename RightType>
+auto qCompareThreeWay(const LeftType &lhs, const RightType &rhs);
+
+#else
+
+template <typename LT, typename RT,
+ std::enable_if_t<QtPrivate::CompareThreeWayTester::hasCompareThreeWay<LT, RT>
+ || QtPrivate::CompareThreeWayTester::hasCompareThreeWay<RT, LT>,
+ bool> = true>
+auto qCompareThreeWay(const LT &lhs, const RT &rhs)
+ noexcept(QtPrivate::CompareThreeWayTester::compareThreeWayNoexcept<LT, RT>())
+{
+ using Qt::compareThreeWay;
+ if constexpr (QtPrivate::CompareThreeWayTester::hasCompareThreeWay<LT, RT>) {
+ return compareThreeWay(lhs, rhs);
+ } else {
+ const auto retval = compareThreeWay(rhs, lhs);
+ return QtOrderingPrivate::reversed(retval);
+ }
+}
+
+#endif // defined(Q_QDOC)
+
+//
+// Legacy QPartialOrdering
+//
+
+namespace QtPrivate {
+enum class LegacyUncomparable : CompareUnderlyingType
+{
+ Unordered = -127
+};
+}
+
// [cmp.partialord]
class QPartialOrdering
{
@@ -77,49 +683,195 @@ public:
static const QPartialOrdering Greater;
static const QPartialOrdering Unordered;
- friend constexpr bool operator==(QPartialOrdering p, QtPrivate::CompareAgainstLiteralZero) noexcept
- { return p.isOrdered() && p.m_order == 0; }
- friend constexpr bool operator!=(QPartialOrdering p, QtPrivate::CompareAgainstLiteralZero) noexcept
- { return p.isOrdered() && p.m_order != 0; }
- friend constexpr bool operator< (QPartialOrdering p, QtPrivate::CompareAgainstLiteralZero) noexcept
- { return p.isOrdered() && p.m_order < 0; }
- friend constexpr bool operator<=(QPartialOrdering p, QtPrivate::CompareAgainstLiteralZero) noexcept
- { return p.isOrdered() && p.m_order <= 0; }
- friend constexpr bool operator> (QPartialOrdering p, QtPrivate::CompareAgainstLiteralZero) noexcept
- { return p.isOrdered() && p.m_order > 0; }
- friend constexpr bool operator>=(QPartialOrdering p, QtPrivate::CompareAgainstLiteralZero) noexcept
- { return p.isOrdered() && p.m_order >= 0; }
-
- friend constexpr bool operator==(QtPrivate::CompareAgainstLiteralZero, QPartialOrdering p) noexcept
- { return p.isOrdered() && 0 == p.m_order; }
- friend constexpr bool operator!=(QtPrivate::CompareAgainstLiteralZero, QPartialOrdering p) noexcept
- { return p.isOrdered() && 0 != p.m_order; }
- friend constexpr bool operator< (QtPrivate::CompareAgainstLiteralZero, QPartialOrdering p) noexcept
- { return p.isOrdered() && 0 < p.m_order; }
- friend constexpr bool operator<=(QtPrivate::CompareAgainstLiteralZero, QPartialOrdering p) noexcept
- { return p.isOrdered() && 0 <= p.m_order; }
- friend constexpr bool operator> (QtPrivate::CompareAgainstLiteralZero, QPartialOrdering p) noexcept
- { return p.isOrdered() && 0 > p.m_order; }
- friend constexpr bool operator>=(QtPrivate::CompareAgainstLiteralZero, QPartialOrdering p) noexcept
- { return p.isOrdered() && 0 >= p.m_order; }
-
- friend constexpr bool operator==(QPartialOrdering p1, QPartialOrdering p2) noexcept
- { return p1.m_order == p2.m_order; }
- friend constexpr bool operator!=(QPartialOrdering p1, QPartialOrdering p2) noexcept
- { return p1.m_order != p2.m_order; }
+ static const QPartialOrdering less;
+ static const QPartialOrdering equivalent;
+ static const QPartialOrdering greater;
+ static const QPartialOrdering unordered;
+
+ friend constexpr bool operator==(QPartialOrdering lhs,
+ QtPrivate::CompareAgainstLiteralZero) noexcept
+ { return lhs.isOrdered() && lhs.m_order == 0; }
+
+ friend constexpr bool operator!=(QPartialOrdering lhs,
+ QtPrivate::CompareAgainstLiteralZero) noexcept
+ { return lhs.isOrdered() && lhs.m_order != 0; }
+
+ friend constexpr bool operator< (QPartialOrdering lhs,
+ QtPrivate::CompareAgainstLiteralZero) noexcept
+ { return lhs.isOrdered() && lhs.m_order < 0; }
+
+ friend constexpr bool operator<=(QPartialOrdering lhs,
+ QtPrivate::CompareAgainstLiteralZero) noexcept
+ { return lhs.isOrdered() && lhs.m_order <= 0; }
+
+ friend constexpr bool operator> (QPartialOrdering lhs,
+ QtPrivate::CompareAgainstLiteralZero) noexcept
+ { return lhs.isOrdered() && lhs.m_order > 0; }
+
+ friend constexpr bool operator>=(QPartialOrdering lhs,
+ QtPrivate::CompareAgainstLiteralZero) noexcept
+ { return lhs.isOrdered() && lhs.m_order >= 0; }
+
+
+ friend constexpr bool operator==(QtPrivate::CompareAgainstLiteralZero,
+ QPartialOrdering rhs) noexcept
+ { return rhs.isOrdered() && 0 == rhs.m_order; }
+
+ friend constexpr bool operator!=(QtPrivate::CompareAgainstLiteralZero,
+ QPartialOrdering rhs) noexcept
+ { return rhs.isOrdered() && 0 != rhs.m_order; }
+
+ friend constexpr bool operator< (QtPrivate::CompareAgainstLiteralZero,
+ QPartialOrdering rhs) noexcept
+ { return rhs.isOrdered() && 0 < rhs.m_order; }
+
+ friend constexpr bool operator<=(QtPrivate::CompareAgainstLiteralZero,
+ QPartialOrdering rhs) noexcept
+ { return rhs.isOrdered() && 0 <= rhs.m_order; }
+
+ friend constexpr bool operator> (QtPrivate::CompareAgainstLiteralZero,
+ QPartialOrdering rhs) noexcept
+ { return rhs.isOrdered() && 0 > rhs.m_order; }
+
+ friend constexpr bool operator>=(QtPrivate::CompareAgainstLiteralZero,
+ QPartialOrdering rhs) noexcept
+ { return rhs.isOrdered() && 0 >= rhs.m_order; }
+
+
+#ifdef __cpp_lib_three_way_comparison
+ friend constexpr std::partial_ordering
+ operator<=>(QPartialOrdering lhs, QtPrivate::CompareAgainstLiteralZero) noexcept
+ { return lhs; } // https://eel.is/c++draft/cmp.partialord#4
+
+ friend constexpr std::partial_ordering
+ operator<=>(QtPrivate::CompareAgainstLiteralZero, QPartialOrdering rhs) noexcept
+ { return QtOrderingPrivate::reversed(rhs); }
+#endif // __cpp_lib_three_way_comparison
+
+
+ friend constexpr bool operator==(QPartialOrdering lhs, QPartialOrdering rhs) noexcept
+ { return lhs.m_order == rhs.m_order; }
+
+ friend constexpr bool operator!=(QPartialOrdering lhs, QPartialOrdering rhs) noexcept
+ { return lhs.m_order != rhs.m_order; }
+
+ constexpr Q_IMPLICIT QPartialOrdering(Qt::partial_ordering order) noexcept
+ : m_order{} // == equivalent
+ {
+ if (order == Qt::partial_ordering::less)
+ m_order = static_cast<QtPrivate::CompareUnderlyingType>(QtPrivate::Ordering::Less);
+ else if (order == Qt::partial_ordering::greater)
+ m_order = static_cast<QtPrivate::CompareUnderlyingType>(QtPrivate::Ordering::Greater);
+ else if (order == Qt::partial_ordering::unordered)
+ m_order = static_cast<QtPrivate::CompareUnderlyingType>(QtPrivate::LegacyUncomparable::Unordered);
+ }
+
+ constexpr Q_IMPLICIT QPartialOrdering(Qt::weak_ordering stdorder) noexcept
+ : QPartialOrdering(Qt::partial_ordering{stdorder}) {}
+
+ constexpr Q_IMPLICIT QPartialOrdering(Qt::strong_ordering stdorder) noexcept
+ : QPartialOrdering(Qt::partial_ordering{stdorder}) {}
+
+ constexpr Q_IMPLICIT operator Qt::partial_ordering() const noexcept
+ {
+ using O = QtPrivate::Ordering;
+ using U = QtPrivate::LegacyUncomparable;
+ using R = Qt::partial_ordering;
+ switch (m_order) {
+ case qToUnderlying(O::Less): return R::less;
+ case qToUnderlying(O::Greater): return R::greater;
+ case qToUnderlying(O::Equivalent): return R::equivalent;
+ case qToUnderlying(U::Unordered): return R::unordered;
+ }
+ // GCC 8.x does not treat __builtin_unreachable() as constexpr
+#if !defined(Q_CC_GNU_ONLY) || (Q_CC_GNU >= 900)
+ // NOLINTNEXTLINE(qt-use-unreachable-return): Triggers on Clang, breaking GCC 8
+ Q_UNREACHABLE();
+#endif
+ return R::unordered;
+ }
+
+ friend constexpr bool operator==(QPartialOrdering lhs, Qt::partial_ordering rhs) noexcept
+ { Qt::partial_ordering qt = lhs; return qt == rhs; }
+
+ friend constexpr bool operator!=(QPartialOrdering lhs, Qt::partial_ordering rhs) noexcept
+ { Qt::partial_ordering qt = lhs; return qt != rhs; }
+
+ friend constexpr bool operator==(Qt::partial_ordering lhs, QPartialOrdering rhs) noexcept
+ { Qt::partial_ordering qt = rhs; return lhs == qt; }
+
+ friend constexpr bool operator!=(Qt::partial_ordering lhs, QPartialOrdering rhs) noexcept
+ { Qt::partial_ordering qt = rhs; return lhs != qt; }
+
+#ifdef __cpp_lib_three_way_comparison
+ constexpr Q_IMPLICIT QPartialOrdering(std::partial_ordering stdorder) noexcept
+ {
+ if (stdorder == std::partial_ordering::less)
+ m_order = static_cast<QtPrivate::CompareUnderlyingType>(QtPrivate::Ordering::Less);
+ else if (stdorder == std::partial_ordering::equivalent)
+ m_order = static_cast<QtPrivate::CompareUnderlyingType>(QtPrivate::Ordering::Equivalent);
+ else if (stdorder == std::partial_ordering::greater)
+ m_order = static_cast<QtPrivate::CompareUnderlyingType>(QtPrivate::Ordering::Greater);
+ else if (stdorder == std::partial_ordering::unordered)
+ m_order = static_cast<QtPrivate::CompareUnderlyingType>(QtPrivate::LegacyUncomparable::Unordered);
+ }
+
+ constexpr Q_IMPLICIT QPartialOrdering(std::weak_ordering stdorder) noexcept
+ : QPartialOrdering(std::partial_ordering(stdorder)) {}
+
+ constexpr Q_IMPLICIT QPartialOrdering(std::strong_ordering stdorder) noexcept
+ : QPartialOrdering(std::partial_ordering(stdorder)) {}
+
+ constexpr Q_IMPLICIT operator std::partial_ordering() const noexcept
+ {
+ using O = QtPrivate::Ordering;
+ using U = QtPrivate::LegacyUncomparable;
+ using R = std::partial_ordering;
+ switch (m_order) {
+ case qToUnderlying(O::Less): return R::less;
+ case qToUnderlying(O::Greater): return R::greater;
+ case qToUnderlying(O::Equivalent): return R::equivalent;
+ case qToUnderlying(U::Unordered): return R::unordered;
+ }
+ Q_UNREACHABLE_RETURN(R::unordered);
+ }
+
+ friend constexpr bool operator==(QPartialOrdering lhs, std::partial_ordering rhs) noexcept
+ { return static_cast<std::partial_ordering>(lhs) == rhs; }
+
+ friend constexpr bool operator!=(QPartialOrdering lhs, std::partial_ordering rhs) noexcept
+ { return static_cast<std::partial_ordering>(lhs) != rhs; }
+
+ friend constexpr bool operator==(std::partial_ordering lhs, QPartialOrdering rhs) noexcept
+ { return lhs == static_cast<std::partial_ordering>(rhs); }
+
+ friend constexpr bool operator!=(std::partial_ordering lhs, QPartialOrdering rhs) noexcept
+ { return lhs != static_cast<std::partial_ordering>(rhs); }
+#endif // __cpp_lib_three_way_comparison
private:
constexpr explicit QPartialOrdering(QtPrivate::Ordering order) noexcept
: m_order(static_cast<QtPrivate::CompareUnderlyingType>(order))
{}
- constexpr explicit QPartialOrdering(QtPrivate::Uncomparable order) noexcept
+ constexpr explicit QPartialOrdering(QtPrivate::LegacyUncomparable order) noexcept
: m_order(static_cast<QtPrivate::CompareUnderlyingType>(order))
{}
+ QT_WARNING_PUSH
+ // https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100903
+ QT_WARNING_DISABLE_GCC("-Wzero-as-null-pointer-constant")
+ friend constexpr bool is_eq (QPartialOrdering o) noexcept { return o == 0; }
+ friend constexpr bool is_neq (QPartialOrdering o) noexcept { return o != 0; }
+ friend constexpr bool is_lt (QPartialOrdering o) noexcept { return o < 0; }
+ friend constexpr bool is_lteq(QPartialOrdering o) noexcept { return o <= 0; }
+ friend constexpr bool is_gt (QPartialOrdering o) noexcept { return o > 0; }
+ friend constexpr bool is_gteq(QPartialOrdering o) noexcept { return o >= 0; }
+ QT_WARNING_POP
+
// instead of the exposition only is_ordered member in [cmp.partialord],
// use a private function
- constexpr bool isOrdered() noexcept
- { return m_order != static_cast<QtPrivate::CompareUnderlyingType>(QtPrivate::Uncomparable::Unordered); }
+ constexpr bool isOrdered() const noexcept
+ { return m_order != static_cast<QtPrivate::CompareUnderlyingType>(QtPrivate::LegacyUncomparable::Unordered); }
QtPrivate::CompareUnderlyingType m_order;
};
@@ -127,7 +879,12 @@ private:
inline constexpr QPartialOrdering QPartialOrdering::Less(QtPrivate::Ordering::Less);
inline constexpr QPartialOrdering QPartialOrdering::Equivalent(QtPrivate::Ordering::Equivalent);
inline constexpr QPartialOrdering QPartialOrdering::Greater(QtPrivate::Ordering::Greater);
-inline constexpr QPartialOrdering QPartialOrdering::Unordered(QtPrivate::Uncomparable::Unordered);
+inline constexpr QPartialOrdering QPartialOrdering::Unordered(QtPrivate::LegacyUncomparable::Unordered);
+
+inline constexpr QPartialOrdering QPartialOrdering::less(QtPrivate::Ordering::Less);
+inline constexpr QPartialOrdering QPartialOrdering::equivalent(QtPrivate::Ordering::Equivalent);
+inline constexpr QPartialOrdering QPartialOrdering::greater(QtPrivate::Ordering::Greater);
+inline constexpr QPartialOrdering QPartialOrdering::unordered(QtPrivate::LegacyUncomparable::Unordered);
QT_END_NAMESPACE
diff --git a/src/corelib/global/qcompare.qdoc b/src/corelib/global/qcompare.qdoc
deleted file mode 100644
index 795e908ecf..0000000000
--- a/src/corelib/global/qcompare.qdoc
+++ /dev/null
@@ -1,137 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/*!
- \class QPartialOrdering
- \inmodule QtCore
- \brief QPartialOrdering represents the result of a comparison that allows for unordered results.
- \since 6.0
-
- A value of type QPartialOrdering is typically returned from a
- three-way comparison function. Such a function compares two
- objects, and it may either establish that the two objects are
- ordered relative to each other, or that they are not ordered. The
- QPartialOrdering value returned from the comparison function
- represents one of those possibilities.
-
- The possible values of type QPartialOrdering are, in fact, fully
- represented by the following four static values:
-
- \list
-
- \li \c QPartialOrdering::Less represents that the first object is
- less than the second;
-
- \li \c QPartialOrdering::Equivalent represents that the first
- object is equivalent to the second;
-
- \li \c QPartialOrdering::Greater represents that the first object
- is equivalent to the second;
-
- \li \c QPartialOrdering::Unordered represents that the first object
- is \e{not ordered} with respect to the second.
-
- \endlist
-
- QPartialOrdering is idiomatically used by comparing an instance
- against a literal zero, for instance like this:
-
- \code
-
- // given a, b, c, d as objects of some type that allows for a 3-way compare
-
- QPartialOrdering result = a.compare(b);
- if (result < 0) {
- // a is less than b
- }
-
- if (c.compare(d) >= 0) {
- // c is greater than or equal to d
- }
-
- \endcode
-
- A QPartialOrdering value which represents an unordered result will
- always return false when compared against literal 0.
-*/
-
-/*!
- \fn bool QPartialOrdering::operator==(QPartialOrdering p1, QPartialOrdering p2) noexcept
-
- Return true if \a p1 and \a p2 represent the same result;
- otherwise, returns false.
-*/
-
-/*!
- \fn bool QPartialOrdering::operator!=(QPartialOrdering p1, QPartialOrdering p2) noexcept
-
- Return true if \a p1 and \a p2 represent different results;
- otherwise, returns true.
-*/
-
-/*!
- \fn bool operator==(QPartialOrdering p, QtPrivate::CompareAgainstLiteralZero) noexcept
- \fn bool operator!=(QPartialOrdering p, QtPrivate::CompareAgainstLiteralZero) noexcept
- \fn bool operator< (QPartialOrdering p, QtPrivate::CompareAgainstLiteralZero) noexcept
- \fn bool operator<=(QPartialOrdering p, QtPrivate::CompareAgainstLiteralZero) noexcept
- \fn bool operator> (QPartialOrdering p, QtPrivate::CompareAgainstLiteralZero) noexcept
- \fn bool operator>=(QPartialOrdering p, QtPrivate::CompareAgainstLiteralZero) noexcept
-
- \fn bool operator==(QtPrivate::CompareAgainstLiteralZero, QPartialOrdering p) noexcept
- \fn bool operator!=(QtPrivate::CompareAgainstLiteralZero, QPartialOrdering p) noexcept
- \fn bool operator< (QtPrivate::CompareAgainstLiteralZero, QPartialOrdering p) noexcept
- \fn bool operator<=(QtPrivate::CompareAgainstLiteralZero, QPartialOrdering p) noexcept
- \fn bool operator> (QtPrivate::CompareAgainstLiteralZero, QPartialOrdering p) noexcept
- \fn bool operator>=(QtPrivate::CompareAgainstLiteralZero, QPartialOrdering p) noexcept
- \relates QPartialOrdering
- \internal
-*/
-
-/*!
- \variable QPartialOrdering::Less
- Represents the result of a comparison where the value on the left
- hand side is less than the value on right hand side.
-*/
-
-/*!
- \variable QPartialOrdering::Equivalent
- Represents the result of a comparison where the value on the left
- hand side is equivalent to the value on right hand side.
-*/
-
-/*!
- \variable QPartialOrdering::Greater
- Represents the result of a comparison where the value on the left
- hand side is greater than the value on right hand side.
-*/
-
-/*!
- \variable QPartialOrdering::Unordered
- Represents the result of a comparison where the value on the left
- hand side is not ordered with respect to the value on right hand
- side.
-*/
diff --git a/src/corelib/global/qcompare_impl.h b/src/corelib/global/qcompare_impl.h
index 520922284e..c52417fcec 100644
--- a/src/corelib/global/qcompare_impl.h
+++ b/src/corelib/global/qcompare_impl.h
@@ -1,51 +1,16 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QCOMPARE_IMPL_H
+#define QCOMPARE_IMPL_H
#if 0
#pragma qt_sync_skip_header_check
#pragma qt_sync_stop_processing
#endif
-#ifndef QCOMPARE_IMPL_H
-#define QCOMPARE_IMPL_H
-
-#include <QtCore/qglobal.h>
+#include <QtCore/qtconfigmacros.h>
+#include <QtCore/qcompilerdetection.h>
QT_BEGIN_NAMESPACE
@@ -58,7 +23,7 @@ public:
using SafeZero = void (CompareAgainstLiteralZero::*)();
Q_IMPLICIT constexpr CompareAgainstLiteralZero(SafeZero) noexcept {}
- template <typename T, std::enable_if_t<!std::is_same_v<T, int>, bool> = false>
+ template <typename T, std::enable_if_t<std::is_null_pointer_v<T>, bool> = true>
CompareAgainstLiteralZero(T) = delete;
};
diff --git a/src/corelib/global/qcomparehelpers.h b/src/corelib/global/qcomparehelpers.h
new file mode 100644
index 0000000000..0e43ac296b
--- /dev/null
+++ b/src/corelib/global/qcomparehelpers.h
@@ -0,0 +1,567 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QCOMPARE_H
+#error "Do not include qcomparehelpers.h directly. Use qcompare.h instead."
+#endif
+
+#ifndef QCOMPAREHELPERS_H
+#define QCOMPAREHELPERS_H
+
+#if 0
+#pragma qt_no_master_include
+#pragma qt_sync_skip_header_check
+#pragma qt_sync_stop_processing
+#endif
+
+#include <QtCore/qoverload.h>
+#include <QtCore/qttypetraits.h>
+#include <QtCore/qtypes.h>
+
+#ifdef __cpp_lib_three_way_comparison
+#include <compare>
+#endif
+#include <QtCore/q20type_traits.h>
+
+#include <functional> // std::less
+
+QT_BEGIN_NAMESPACE
+
+class QPartialOrdering;
+
+namespace QtOrderingPrivate {
+#ifdef __cpp_lib_three_way_comparison
+
+template <typename QtOrdering> struct StdOrdering;
+template <typename StdOrdering> struct QtOrdering;
+
+#define QT_STD_MAP(x) \
+ template <> struct StdOrdering< Qt::x##_ordering> : q20::type_identity<std::x##_ordering> {};\
+ template <> struct StdOrdering<std::x##_ordering> : q20::type_identity<std::x##_ordering> {};\
+ template <> struct QtOrdering<std::x##_ordering> : q20::type_identity< Qt::x##_ordering> {};\
+ template <> struct QtOrdering< Qt::x##_ordering> : q20::type_identity< Qt::x##_ordering> {};\
+ /* end */
+QT_STD_MAP(partial)
+QT_STD_MAP(weak)
+QT_STD_MAP(strong)
+#undef QT_STD_MAP
+
+template <> struct StdOrdering<QPartialOrdering> : q20::type_identity<std::partial_ordering> {};
+template <> struct QtOrdering<QPartialOrdering> : q20::type_identity< Qt::partial_ordering> {};
+
+template <typename In> constexpr auto to_std(In in) noexcept
+ -> typename QtOrderingPrivate::StdOrdering<In>::type
+{ return in; }
+
+template <typename In> constexpr auto to_Qt(In in) noexcept
+ -> typename QtOrderingPrivate::QtOrdering<In>::type
+{ return in; }
+
+#endif // __cpp_lib_three_way_comparison
+} // namespace QtOrderingPrivate
+
+/*
+ For all the macros these parameter names are used:
+ * LeftType - the type of the left operand of the comparison
+ * RightType - the type of the right operand of the comparison
+ * Constexpr - must be either constexpr or empty. Defines whether the
+ operator is constexpr or not
+ * Attributes - an optional list of attributes. For example, pass
+ \c QT_ASCII_CAST_WARN when defining comparisons between
+ C-style string and an encoding-aware string type.
+
+ The macros require two helper functions. For operators to be constexpr,
+ these must be constexpr, too. Additionally, other attributes (like
+ Q_<Module>_EXPORT, Q_DECL_CONST_FUNCTION, etc) can be applied to them.
+ Aside from that, their declaration should match:
+ bool comparesEqual(LeftType, RightType) noexcept;
+ ReturnType compareThreeWay(LeftType, RightType) noexcept;
+
+ The ReturnType can be one of Qt::{partial,weak,strong}_ordering. The actual
+ type depends on the macro being used.
+ It makes sense to define the helper functions as hidden friends of the
+ class, so that they could be found via ADL, and don't participate in
+ unintended implicit conversions.
+*/
+
+// Seems that qdoc uses C++20 even when Qt is compiled in C++17 mode.
+// Or at least it defines __cpp_lib_three_way_comparison.
+// Let qdoc see only the C++17 operators for now, because that's what our docs
+// currently describe.
+#if defined(__cpp_lib_three_way_comparison) && !defined(Q_QDOC)
+// C++20 - provide operator==() for equality, and operator<=>() for ordering
+
+#define QT_DECLARE_EQUALITY_OPERATORS_HELPER(LeftType, RightType, Constexpr, Attributes) \
+ Attributes \
+ friend Constexpr bool operator==(LeftType const &lhs, RightType const &rhs) \
+ noexcept(noexcept(comparesEqual(lhs, rhs))) \
+ { return comparesEqual(lhs, rhs); }
+
+#define QT_DECLARE_3WAY_HELPER_STRONG(LeftType, RightType, Constexpr, Attributes) \
+ Attributes \
+ friend Constexpr std::strong_ordering \
+ operator<=>(LeftType const &lhs, RightType const &rhs) \
+ noexcept(noexcept(compareThreeWay(lhs, rhs))) \
+ { \
+ return compareThreeWay(lhs, rhs); \
+ }
+
+#define QT_DECLARE_3WAY_HELPER_WEAK(LeftType, RightType, Constexpr, Attributes) \
+ Attributes \
+ friend Constexpr std::weak_ordering \
+ operator<=>(LeftType const &lhs, RightType const &rhs) \
+ noexcept(noexcept(compareThreeWay(lhs, rhs))) \
+ { \
+ return compareThreeWay(lhs, rhs); \
+ }
+
+#define QT_DECLARE_3WAY_HELPER_PARTIAL(LeftType, RightType, Constexpr, Attributes) \
+ Attributes \
+ friend Constexpr std::partial_ordering \
+ operator<=>(LeftType const &lhs, RightType const &rhs) \
+ noexcept(noexcept(compareThreeWay(lhs, rhs))) \
+ { \
+ return compareThreeWay(lhs, rhs); \
+ }
+
+#define QT_DECLARE_ORDERING_OPERATORS_HELPER(OrderingType, LeftType, RightType, Constexpr, \
+ Attributes) \
+ QT_DECLARE_EQUALITY_OPERATORS_HELPER(LeftType, RightType, Constexpr, Attributes) \
+ QT_DECLARE_3WAY_HELPER_ ## OrderingType (LeftType, RightType, Constexpr, Attributes)
+
+#ifdef Q_COMPILER_LACKS_THREE_WAY_COMPARE_SYMMETRY
+
+// define reversed versions of the operators manually, because buggy MSVC versions do not do it
+#define QT_DECLARE_EQUALITY_OPERATORS_REVERSED_HELPER(LeftType, RightType, Constexpr, Attributes) \
+ Attributes \
+ friend Constexpr bool operator==(RightType const &lhs, LeftType const &rhs) \
+ noexcept(noexcept(comparesEqual(rhs, lhs))) \
+ { return comparesEqual(rhs, lhs); }
+
+#define QT_DECLARE_REVERSED_3WAY_HELPER_STRONG(LeftType, RightType, Constexpr, Attributes) \
+ Attributes \
+ friend Constexpr std::strong_ordering \
+ operator<=>(RightType const &lhs, LeftType const &rhs) \
+ noexcept(noexcept(compareThreeWay(rhs, lhs))) \
+ { \
+ const auto r = compareThreeWay(rhs, lhs); \
+ if (r > 0) return std::strong_ordering::less; \
+ if (r < 0) return std::strong_ordering::greater; \
+ return r; \
+ }
+
+#define QT_DECLARE_REVERSED_3WAY_HELPER_WEAK(LeftType, RightType, Constexpr, Attributes) \
+ Attributes \
+ friend Constexpr std::weak_ordering \
+ operator<=>(RightType const &lhs, LeftType const &rhs) \
+ noexcept(noexcept(compareThreeWay(rhs, lhs))) \
+ { \
+ const auto r = compareThreeWay(rhs, lhs); \
+ if (r > 0) return std::weak_ordering::less; \
+ if (r < 0) return std::weak_ordering::greater; \
+ return r; \
+ }
+
+#define QT_DECLARE_REVERSED_3WAY_HELPER_PARTIAL(LeftType, RightType, Constexpr, Attributes) \
+ Attributes \
+ friend Constexpr std::partial_ordering \
+ operator<=>(RightType const &lhs, LeftType const &rhs) \
+ noexcept(noexcept(compareThreeWay(rhs, lhs))) \
+ { \
+ const auto r = compareThreeWay(rhs, lhs); \
+ if (r > 0) return std::partial_ordering::less; \
+ if (r < 0) return std::partial_ordering::greater; \
+ return r; \
+ }
+
+#define QT_DECLARE_ORDERING_OPERATORS_REVERSED_HELPER(OrderingString, LeftType, RightType, \
+ Constexpr, Attributes) \
+ QT_DECLARE_EQUALITY_OPERATORS_REVERSED_HELPER(LeftType, RightType, Constexpr, Attributes) \
+ QT_DECLARE_REVERSED_3WAY_HELPER_ ## OrderingString (LeftType, RightType, Constexpr, Attributes)
+
+#else
+
+// dummy macros for C++17 compatibility, reversed operators are generated by the compiler
+#define QT_DECLARE_EQUALITY_OPERATORS_REVERSED_HELPER(LeftType, RightType, Constexpr, Attributes)
+#define QT_DECLARE_ORDERING_OPERATORS_REVERSED_HELPER(OrderingString, LeftType, RightType, \
+ Constexpr, Attributes)
+
+#endif // Q_COMPILER_LACKS_THREE_WAY_COMPARE_SYMMETRY
+
+#else
+// C++17 - provide operator==() and operator!=() for equality,
+// and all 4 comparison operators for ordering
+
+#define QT_DECLARE_EQUALITY_OPERATORS_HELPER(LeftType, RightType, Constexpr, Attributes) \
+ Attributes \
+ friend Constexpr bool operator==(LeftType const &lhs, RightType const &rhs) \
+ noexcept(noexcept(comparesEqual(lhs, rhs))) \
+ { return comparesEqual(lhs, rhs); } \
+ Attributes \
+ friend Constexpr bool operator!=(LeftType const &lhs, RightType const &rhs) \
+ noexcept(noexcept(comparesEqual(lhs, rhs))) \
+ { return !comparesEqual(lhs, rhs); }
+
+// Helpers for reversed comparison, using the existing comparesEqual() function.
+#define QT_DECLARE_EQUALITY_OPERATORS_REVERSED_HELPER(LeftType, RightType, Constexpr, Attributes) \
+ Attributes \
+ friend Constexpr bool operator==(RightType const &lhs, LeftType const &rhs) \
+ noexcept(noexcept(comparesEqual(rhs, lhs))) \
+ { return comparesEqual(rhs, lhs); } \
+ Attributes \
+ friend Constexpr bool operator!=(RightType const &lhs, LeftType const &rhs) \
+ noexcept(noexcept(comparesEqual(rhs, lhs))) \
+ { return !comparesEqual(rhs, lhs); }
+
+#define QT_DECLARE_ORDERING_HELPER_TEMPLATE(OrderingType, LeftType, RightType, Constexpr, \
+ Attributes) \
+ Attributes \
+ friend Constexpr bool operator<(LeftType const &lhs, RightType const &rhs) \
+ noexcept(noexcept(compareThreeWay(lhs, rhs))) \
+ { return compareThreeWay(lhs, rhs) < 0; } \
+ Attributes \
+ friend Constexpr bool operator>(LeftType const &lhs, RightType const &rhs) \
+ noexcept(noexcept(compareThreeWay(lhs, rhs))) \
+ { return compareThreeWay(lhs, rhs) > 0; } \
+ Attributes \
+ friend Constexpr bool operator<=(LeftType const &lhs, RightType const &rhs) \
+ noexcept(noexcept(compareThreeWay(lhs, rhs))) \
+ { return compareThreeWay(lhs, rhs) <= 0; } \
+ Attributes \
+ friend Constexpr bool operator>=(LeftType const &lhs, RightType const &rhs) \
+ noexcept(noexcept(compareThreeWay(lhs, rhs))) \
+ { return compareThreeWay(lhs, rhs) >= 0; }
+
+#define QT_DECLARE_ORDERING_HELPER_PARTIAL(LeftType, RightType, Constexpr, Attributes) \
+ QT_DECLARE_ORDERING_HELPER_TEMPLATE(Qt::partial_ordering, LeftType, RightType, Constexpr, \
+ Attributes)
+
+#define QT_DECLARE_ORDERING_HELPER_WEAK(LeftType, RightType, Constexpr, Attributes) \
+ QT_DECLARE_ORDERING_HELPER_TEMPLATE(Qt::weak_ordering, LeftType, RightType, Constexpr, \
+ Attributes)
+
+#define QT_DECLARE_ORDERING_HELPER_STRONG(LeftType, RightType, Constexpr, Attributes) \
+ QT_DECLARE_ORDERING_HELPER_TEMPLATE(Qt::strong_ordering, LeftType, RightType, Constexpr, \
+ Attributes)
+
+#define QT_DECLARE_ORDERING_OPERATORS_HELPER(OrderingString, LeftType, RightType, Constexpr, \
+ Attributes) \
+ QT_DECLARE_EQUALITY_OPERATORS_HELPER(LeftType, RightType, Constexpr, Attributes) \
+ QT_DECLARE_ORDERING_HELPER_ ## OrderingString (LeftType, RightType, Constexpr, Attributes)
+
+// Helpers for reversed ordering, using the existing compareThreeWay() function.
+#define QT_DECLARE_REVERSED_ORDERING_HELPER_TEMPLATE(OrderingType, LeftType, RightType, Constexpr, \
+ Attributes) \
+ Attributes \
+ friend Constexpr bool operator<(RightType const &lhs, LeftType const &rhs) \
+ noexcept(noexcept(compareThreeWay(rhs, lhs))) \
+ { return compareThreeWay(rhs, lhs) > 0; } \
+ Attributes \
+ friend Constexpr bool operator>(RightType const &lhs, LeftType const &rhs) \
+ noexcept(noexcept(compareThreeWay(rhs, lhs))) \
+ { return compareThreeWay(rhs, lhs) < 0; } \
+ Attributes \
+ friend Constexpr bool operator<=(RightType const &lhs, LeftType const &rhs) \
+ noexcept(noexcept(compareThreeWay(rhs, lhs))) \
+ { return compareThreeWay(rhs, lhs) >= 0; } \
+ Attributes \
+ friend Constexpr bool operator>=(RightType const &lhs, LeftType const &rhs) \
+ noexcept(noexcept(compareThreeWay(rhs, lhs))) \
+ { return compareThreeWay(rhs, lhs) <= 0; }
+
+#define QT_DECLARE_REVERSED_ORDERING_HELPER_PARTIAL(LeftType, RightType, Constexpr, Attributes) \
+ QT_DECLARE_REVERSED_ORDERING_HELPER_TEMPLATE(Qt::partial_ordering, LeftType, RightType, \
+ Constexpr, Attributes)
+
+#define QT_DECLARE_REVERSED_ORDERING_HELPER_WEAK(LeftType, RightType, Constexpr, Attributes) \
+ QT_DECLARE_REVERSED_ORDERING_HELPER_TEMPLATE(Qt::weak_ordering, LeftType, RightType, \
+ Constexpr, Attributes)
+
+#define QT_DECLARE_REVERSED_ORDERING_HELPER_STRONG(LeftType, RightType, Constexpr, Attributes) \
+ QT_DECLARE_REVERSED_ORDERING_HELPER_TEMPLATE(Qt::strong_ordering, LeftType, RightType, \
+ Constexpr, Attributes)
+
+#define QT_DECLARE_ORDERING_OPERATORS_REVERSED_HELPER(OrderingString, LeftType, RightType, \
+ Constexpr, Attributes) \
+ QT_DECLARE_EQUALITY_OPERATORS_REVERSED_HELPER(LeftType, RightType, Constexpr, Attributes) \
+ QT_DECLARE_REVERSED_ORDERING_HELPER_ ## OrderingString (LeftType, RightType, Constexpr, \
+ Attributes)
+
+#endif // __cpp_lib_three_way_comparison
+
+/* Public API starts here */
+
+// Equality operators
+#define QT_DECLARE_EQUALITY_COMPARABLE_1(Type) \
+ QT_DECLARE_EQUALITY_OPERATORS_HELPER(Type, Type, /* non-constexpr */, /* no attributes */)
+
+#define QT_DECLARE_EQUALITY_COMPARABLE_2(LeftType, RightType) \
+ QT_DECLARE_EQUALITY_OPERATORS_HELPER(LeftType, RightType, /* non-constexpr */, \
+ /* no attributes */) \
+ QT_DECLARE_EQUALITY_OPERATORS_REVERSED_HELPER(LeftType, RightType, /* non-constexpr */, \
+ /* no attributes */)
+
+#define QT_DECLARE_EQUALITY_COMPARABLE_3(LeftType, RightType, Attributes) \
+ QT_DECLARE_EQUALITY_OPERATORS_HELPER(LeftType, RightType, /* non-constexpr */, Attributes) \
+ QT_DECLARE_EQUALITY_OPERATORS_REVERSED_HELPER(LeftType, RightType, /* non-constexpr */, \
+ Attributes)
+
+#define Q_DECLARE_EQUALITY_COMPARABLE(...) \
+ QT_OVERLOADED_MACRO(QT_DECLARE_EQUALITY_COMPARABLE, __VA_ARGS__)
+
+#define QT_DECLARE_EQUALITY_COMPARABLE_LITERAL_TYPE_1(Type) \
+ QT_DECLARE_EQUALITY_OPERATORS_HELPER(Type, Type, constexpr, /* no attributes */)
+
+#define QT_DECLARE_EQUALITY_COMPARABLE_LITERAL_TYPE_2(LeftType, RightType) \
+ QT_DECLARE_EQUALITY_OPERATORS_HELPER(LeftType, RightType, constexpr, /* no attributes */) \
+ QT_DECLARE_EQUALITY_OPERATORS_REVERSED_HELPER(LeftType, RightType, constexpr, \
+ /* no attributes */)
+
+#define QT_DECLARE_EQUALITY_COMPARABLE_LITERAL_TYPE_3(LeftType, RightType, Attributes) \
+ QT_DECLARE_EQUALITY_OPERATORS_HELPER(LeftType, RightType, constexpr, Attributes) \
+ QT_DECLARE_EQUALITY_OPERATORS_REVERSED_HELPER(LeftType, RightType, constexpr, Attributes)
+
+#define Q_DECLARE_EQUALITY_COMPARABLE_LITERAL_TYPE(...) \
+ QT_OVERLOADED_MACRO(QT_DECLARE_EQUALITY_COMPARABLE_LITERAL_TYPE, __VA_ARGS__)
+
+// Partial ordering operators
+#define QT_DECLARE_PARTIALLY_ORDERED_1(Type) \
+ QT_DECLARE_ORDERING_OPERATORS_HELPER(PARTIAL, Type, Type, /* non-constexpr */, \
+ /* no attributes */)
+
+#define QT_DECLARE_PARTIALLY_ORDERED_2(LeftType, RightType) \
+ QT_DECLARE_ORDERING_OPERATORS_HELPER(PARTIAL, LeftType, RightType, /* non-constexpr */, \
+ /* no attributes */) \
+ QT_DECLARE_ORDERING_OPERATORS_REVERSED_HELPER(PARTIAL, LeftType, RightType, \
+ /* non-constexpr */, /* no attributes */)
+
+#define QT_DECLARE_PARTIALLY_ORDERED_3(LeftType, RightType, Attributes) \
+ QT_DECLARE_ORDERING_OPERATORS_HELPER(PARTIAL, LeftType, RightType, /* non-constexpr */, \
+ Attributes) \
+ QT_DECLARE_ORDERING_OPERATORS_REVERSED_HELPER(PARTIAL, LeftType, RightType, \
+ /* non-constexpr */, Attributes)
+
+#define Q_DECLARE_PARTIALLY_ORDERED(...) \
+ QT_OVERLOADED_MACRO(QT_DECLARE_PARTIALLY_ORDERED, __VA_ARGS__)
+
+#define QT_DECLARE_PARTIALLY_ORDERED_LITERAL_TYPE_1(Type) \
+ QT_DECLARE_ORDERING_OPERATORS_HELPER(PARTIAL, Type, Type, constexpr, /* no attributes */)
+
+#define QT_DECLARE_PARTIALLY_ORDERED_LITERAL_TYPE_2(LeftType, RightType) \
+ QT_DECLARE_ORDERING_OPERATORS_HELPER(PARTIAL, LeftType, RightType, constexpr, \
+ /* no attributes */) \
+ QT_DECLARE_ORDERING_OPERATORS_REVERSED_HELPER(PARTIAL, LeftType, RightType, constexpr, \
+ /* no attributes */)
+
+#define QT_DECLARE_PARTIALLY_ORDERED_LITERAL_TYPE_3(LeftType, RightType, Attributes) \
+ QT_DECLARE_ORDERING_OPERATORS_HELPER(PARTIAL, LeftType, RightType, constexpr, Attributes) \
+ QT_DECLARE_ORDERING_OPERATORS_REVERSED_HELPER(PARTIAL, LeftType, RightType, constexpr, \
+ Attributes)
+
+#define Q_DECLARE_PARTIALLY_ORDERED_LITERAL_TYPE(...) \
+ QT_OVERLOADED_MACRO(QT_DECLARE_PARTIALLY_ORDERED_LITERAL_TYPE, __VA_ARGS__)
+
+// Weak ordering operators
+#define QT_DECLARE_WEAKLY_ORDERED_1(Type) \
+ QT_DECLARE_ORDERING_OPERATORS_HELPER(WEAK, Type, Type, /* non-constexpr */, /* no attributes */)
+
+#define QT_DECLARE_WEAKLY_ORDERED_2(LeftType, RightType) \
+ QT_DECLARE_ORDERING_OPERATORS_HELPER(WEAK, LeftType, RightType, /* non-constexpr */, \
+ /* no attributes */) \
+ QT_DECLARE_ORDERING_OPERATORS_REVERSED_HELPER(WEAK, LeftType, RightType, /* non-constexpr */, \
+ /* no attributes */)
+
+#define QT_DECLARE_WEAKLY_ORDERED_3(LeftType, RightType, Attributes) \
+ QT_DECLARE_ORDERING_OPERATORS_HELPER(WEAK, LeftType, RightType, /* non-constexpr */, \
+ Attributes) \
+ QT_DECLARE_ORDERING_OPERATORS_REVERSED_HELPER(WEAK, LeftType, RightType, /* non-constexpr */, \
+ Attributes)
+
+#define Q_DECLARE_WEAKLY_ORDERED(...) \
+ QT_OVERLOADED_MACRO(QT_DECLARE_WEAKLY_ORDERED, __VA_ARGS__)
+
+#define QT_DECLARE_WEAKLY_ORDERED_LITERAL_TYPE_1(Type) \
+ QT_DECLARE_ORDERING_OPERATORS_HELPER(WEAK, Type, Type, constexpr, /* no attributes */)
+
+#define QT_DECLARE_WEAKLY_ORDERED_LITERAL_TYPE_2(LeftType, RightType) \
+ QT_DECLARE_ORDERING_OPERATORS_HELPER(WEAK, LeftType, RightType, constexpr, \
+ /* no attributes */) \
+ QT_DECLARE_ORDERING_OPERATORS_REVERSED_HELPER(WEAK, LeftType, RightType, constexpr, \
+ /* no attributes */)
+
+#define QT_DECLARE_WEAKLY_ORDERED_LITERAL_TYPE_3(LeftType, RightType, Attributes) \
+QT_DECLARE_ORDERING_OPERATORS_HELPER(WEAK, LeftType, RightType, constexpr, Attributes) \
+ QT_DECLARE_ORDERING_OPERATORS_REVERSED_HELPER(WEAK, LeftType, RightType, constexpr, \
+ Attributes)
+
+#define Q_DECLARE_WEAKLY_ORDERED_LITERAL_TYPE(...) \
+ QT_OVERLOADED_MACRO(QT_DECLARE_WEAKLY_ORDERED_LITERAL_TYPE, __VA_ARGS__)
+
+// Strong ordering operators
+#define QT_DECLARE_STRONGLY_ORDERED_1(Type) \
+ QT_DECLARE_ORDERING_OPERATORS_HELPER(STRONG, Type, Type, /* non-constexpr */, \
+ /* no attributes */)
+
+#define QT_DECLARE_STRONGLY_ORDERED_2(LeftType, RightType) \
+ QT_DECLARE_ORDERING_OPERATORS_HELPER(STRONG, LeftType, RightType, /* non-constexpr */, \
+ /* no attributes */) \
+ QT_DECLARE_ORDERING_OPERATORS_REVERSED_HELPER(STRONG, LeftType, RightType, \
+ /* non-constexpr */, /* no attributes */)
+
+#define QT_DECLARE_STRONGLY_ORDERED_3(LeftType, RightType, Attributes) \
+ QT_DECLARE_ORDERING_OPERATORS_HELPER(STRONG, LeftType, RightType, /* non-constexpr */, \
+ Attributes) \
+ QT_DECLARE_ORDERING_OPERATORS_REVERSED_HELPER(STRONG, LeftType, RightType, \
+ /* non-constexpr */, Attributes)
+
+#define Q_DECLARE_STRONGLY_ORDERED(...) \
+ QT_OVERLOADED_MACRO(QT_DECLARE_STRONGLY_ORDERED, __VA_ARGS__)
+
+#define QT_DECLARE_STRONGLY_ORDERED_LITERAL_TYPE_1(Type) \
+ QT_DECLARE_ORDERING_OPERATORS_HELPER(STRONG, Type, Type, constexpr, /* no attributes */)
+
+#define QT_DECLARE_STRONGLY_ORDERED_LITERAL_TYPE_2(LeftType, RightType) \
+ QT_DECLARE_ORDERING_OPERATORS_HELPER(STRONG, LeftType, RightType, constexpr, \
+ /* no attributes */) \
+ QT_DECLARE_ORDERING_OPERATORS_REVERSED_HELPER(STRONG, LeftType, RightType, constexpr, \
+ /* no attributes */)
+
+#define QT_DECLARE_STRONGLY_ORDERED_LITERAL_TYPE_3(LeftType, RightType, Attributes) \
+ QT_DECLARE_ORDERING_OPERATORS_HELPER(STRONG, LeftType, RightType, constexpr, Attributes) \
+ QT_DECLARE_ORDERING_OPERATORS_REVERSED_HELPER(STRONG, LeftType, RightType, constexpr, \
+ Attributes)
+
+#define Q_DECLARE_STRONGLY_ORDERED_LITERAL_TYPE(...) \
+ QT_OVERLOADED_MACRO(QT_DECLARE_STRONGLY_ORDERED_LITERAL_TYPE, __VA_ARGS__)
+
+namespace QtPrivate {
+
+template <typename T>
+constexpr bool IsIntegralType_v = std::numeric_limits<std::remove_const_t<T>>::is_specialized
+ && std::numeric_limits<std::remove_const_t<T>>::is_integer;
+
+template <typename T>
+constexpr bool IsFloatType_v = std::is_floating_point_v<T>;
+
+#if QFLOAT16_IS_NATIVE
+template <>
+constexpr bool IsFloatType_v<QtPrivate::NativeFloat16Type> = true;
+#endif
+
+} // namespace QtPrivate
+
+namespace Qt {
+
+template <typename T>
+using if_integral = std::enable_if_t<QtPrivate::IsIntegralType_v<T>, bool>;
+
+template <typename T>
+using if_floating_point = std::enable_if_t<QtPrivate::IsFloatType_v<T>, bool>;
+
+template <typename T, typename U>
+using if_compatible_pointers =
+ std::enable_if_t<std::disjunction_v<std::is_same<T, U>,
+ std::is_base_of<T, U>,
+ std::is_base_of<U, T>>,
+ bool>;
+
+template <typename Enum>
+using if_enum = std::enable_if_t<std::is_enum_v<Enum>, bool>;
+
+template <typename LeftInt, typename RightInt,
+ if_integral<LeftInt> = true,
+ if_integral<RightInt> = true>
+constexpr Qt::strong_ordering compareThreeWay(LeftInt lhs, RightInt rhs) noexcept
+{
+ static_assert(std::is_signed_v<LeftInt> == std::is_signed_v<RightInt>,
+ "Qt::compareThreeWay() does not allow mixed-sign comparison.");
+
+#ifdef __cpp_lib_three_way_comparison
+ return lhs <=> rhs;
+#else
+ if (lhs == rhs)
+ return Qt::strong_ordering::equivalent;
+ else if (lhs < rhs)
+ return Qt::strong_ordering::less;
+ else
+ return Qt::strong_ordering::greater;
+#endif // __cpp_lib_three_way_comparison
+}
+
+template <typename LeftFloat, typename RightFloat,
+ if_floating_point<LeftFloat> = true,
+ if_floating_point<RightFloat> = true>
+constexpr Qt::partial_ordering compareThreeWay(LeftFloat lhs, RightFloat rhs) noexcept
+{
+QT_WARNING_PUSH
+QT_WARNING_DISABLE_FLOAT_COMPARE
+#ifdef __cpp_lib_three_way_comparison
+ return lhs <=> rhs;
+#else
+ if (lhs < rhs)
+ return Qt::partial_ordering::less;
+ else if (lhs > rhs)
+ return Qt::partial_ordering::greater;
+ else if (lhs == rhs)
+ return Qt::partial_ordering::equivalent;
+ else
+ return Qt::partial_ordering::unordered;
+#endif // __cpp_lib_three_way_comparison
+QT_WARNING_POP
+}
+
+template <typename IntType, typename FloatType,
+ if_integral<IntType> = true,
+ if_floating_point<FloatType> = true>
+constexpr Qt::partial_ordering compareThreeWay(IntType lhs, FloatType rhs) noexcept
+{
+ return compareThreeWay(FloatType(lhs), rhs);
+}
+
+template <typename FloatType, typename IntType,
+ if_floating_point<FloatType> = true,
+ if_integral<IntType> = true>
+constexpr Qt::partial_ordering compareThreeWay(FloatType lhs, IntType rhs) noexcept
+{
+ return compareThreeWay(lhs, FloatType(rhs));
+}
+
+template <typename LeftType, typename RightType,
+ if_compatible_pointers<LeftType, RightType> = true>
+constexpr Qt::strong_ordering compareThreeWay(const LeftType *lhs, const RightType *rhs) noexcept
+{
+#ifdef __cpp_lib_three_way_comparison
+ return std::compare_three_way{}(lhs, rhs);
+#else
+ if (lhs == rhs)
+ return Qt::strong_ordering::equivalent;
+ else if (std::less<>{}(lhs, rhs))
+ return Qt::strong_ordering::less;
+ else
+ return Qt::strong_ordering::greater;
+#endif // __cpp_lib_three_way_comparison
+}
+
+template <typename T>
+constexpr Qt::strong_ordering compareThreeWay(const T *lhs, std::nullptr_t rhs) noexcept
+{
+ return compareThreeWay(lhs, static_cast<const T *>(rhs));
+}
+
+template <typename T>
+constexpr Qt::strong_ordering compareThreeWay(std::nullptr_t lhs, const T *rhs) noexcept
+{
+ return compareThreeWay(static_cast<const T *>(lhs), rhs);
+}
+
+template <class Enum, if_enum<Enum> = true>
+constexpr Qt::strong_ordering compareThreeWay(Enum lhs, Enum rhs) noexcept
+{
+ return compareThreeWay(qToUnderlying(lhs), qToUnderlying(rhs));
+}
+
+} // namespace Qt
+
+QT_END_NAMESPACE
+
+#endif // QCOMPAREHELPERS_H
diff --git a/src/corelib/global/qcompilerdetection.h b/src/corelib/global/qcompilerdetection.h
index bfa4f89105..b2340bff8e 100644
--- a/src/corelib/global/qcompilerdetection.h
+++ b/src/corelib/global/qcompilerdetection.h
@@ -1,53 +1,24 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QGLOBAL_H
-# include <QtCore/qglobal.h>
+// Copyright (C) 2022 The Qt Company Ltd.
+// Copyright (C) 2016 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#if 0
+#pragma qt_class(QtCompilerDetection)
+#pragma qt_sync_skip_header_check
+#pragma qt_sync_stop_processing
#endif
#ifndef QCOMPILERDETECTION_H
#define QCOMPILERDETECTION_H
+#include <QtCore/qprocessordetection.h>
+#include <QtCore/qsystemdetection.h>
+#include <QtCore/qtconfiginclude.h>
+
/*
The compiler, must be one of: (Q_CC_x)
+ COVERITY - Coverity cov-scan
SYM - Digital Mars C/C++ (used to be Symantec C++)
MSVC - Microsoft Visual C/C++, Intel C++ for Windows
BOR - Borland/Turbo C++
@@ -74,6 +45,11 @@
Should be sorted most to least authoritative.
*/
+#if defined(__COVERITY__)
+# define Q_CC_COVERITY
+# define Q_COMPILER_COMPLAINS_ABOUT_RETURN_AFTER_UNREACHABLE
+#endif
+
/* Symantec C++ is now Digital Mars */
#if defined(__DMC__) || defined(__SC__)
# define Q_CC_SYM
@@ -83,30 +59,26 @@
# endif
#elif defined(_MSC_VER)
+# define Q_CC_MSVC (_MSC_VER)
+# define Q_CC_MSVC_NET
+# define Q_CC_MSVC_ONLY Q_CC_MSVC
# ifdef __clang__
+# undef Q_CC_MSVC_ONLY
# define Q_CC_CLANG ((__clang_major__ * 100) + __clang_minor__)
+# define Q_CC_CLANG_ONLY Q_CC_CLANG
# endif
-# define Q_CC_MSVC (_MSC_VER)
-# define Q_CC_MSVC_NET
# define Q_OUTOFLINE_TEMPLATE inline
# define Q_COMPILER_MANGLES_RETURN_TYPE
+# define Q_COMPILER_MANGLES_ACCESS_SPECIFIER
# define Q_FUNC_INFO __FUNCSIG__
# define Q_ASSUME_IMPL(expr) __assume(expr)
# define Q_UNREACHABLE_IMPL() __assume(0)
-# define Q_NORETURN __declspec(noreturn)
-# define Q_DECL_DEPRECATED __declspec(deprecated)
-# ifndef Q_CC_CLANG
-# define Q_DECL_DEPRECATED_X(text) __declspec(deprecated(text))
-# endif
# define Q_DECL_EXPORT __declspec(dllexport)
# define Q_DECL_IMPORT __declspec(dllimport)
-# define QT_MAKE_UNCHECKED_ARRAY_ITERATOR(x) stdext::make_unchecked_array_iterator(x) // Since _MSC_VER >= 1800
-# define QT_MAKE_CHECKED_ARRAY_ITERATOR(x, N) stdext::make_checked_array_iterator(x, size_t(N)) // Since _MSC_VER >= 1500
-/* Intel C++ disguising as Visual C++: the `using' keyword avoids warnings */
-# if defined(__INTEL_COMPILER)
-# define Q_DECL_VARIABLE_DEPRECATED
-# define Q_CC_INTEL __INTEL_COMPILER
+# if _MSC_VER < 1938 // stdext is deprecated since VS 2022 17.8
+# define QT_MAKE_CHECKED_ARRAY_ITERATOR(x, N) stdext::make_checked_array_iterator(x, size_t(N)) // Since _MSC_VER >= 1500
# endif
+# define Q_COMPILER_COMPLAINS_ABOUT_RETURN_AFTER_UNREACHABLE
#elif defined(__BORLANDC__) || defined(__TURBOC__)
# define Q_CC_BOR
@@ -141,46 +113,39 @@
# if defined(__MINGW32__)
# define Q_CC_MINGW
# endif
-# if defined(__INTEL_COMPILER)
-/* Intel C++ also masquerades as GCC */
-# define Q_CC_INTEL (__INTEL_COMPILER)
-# ifdef __clang__
-/* Intel C++ masquerades as Clang masquerading as GCC */
-# define Q_CC_CLANG 305
-# endif
-# define Q_ASSUME_IMPL(expr) __assume(expr)
-# define Q_UNREACHABLE_IMPL() __builtin_unreachable()
-# if __INTEL_COMPILER >= 1300 && !defined(__APPLE__)
-# define Q_DECL_DEPRECATED_X(text) __attribute__ ((__deprecated__(text)))
-# endif
-# elif defined(__clang__)
+# if defined(__clang__)
/* Clang also masquerades as GCC */
# if defined(__apple_build_version__)
-# /* http://en.wikipedia.org/wiki/Xcode#Toolchain_Versions */
-# if __apple_build_version__ >= 8020041
-# define Q_CC_CLANG 309
-# elif __apple_build_version__ >= 8000038
-# define Q_CC_CLANG 308
-# elif __apple_build_version__ >= 7000053
-# define Q_CC_CLANG 306
-# elif __apple_build_version__ >= 6000051
-# define Q_CC_CLANG 305
-# elif __apple_build_version__ >= 5030038
-# define Q_CC_CLANG 304
-# elif __apple_build_version__ >= 5000275
-# define Q_CC_CLANG 303
-# elif __apple_build_version__ >= 4250024
-# define Q_CC_CLANG 302
-# elif __apple_build_version__ >= 3180045
-# define Q_CC_CLANG 301
-# elif __apple_build_version__ >= 2111001
-# define Q_CC_CLANG 300
+ // The Clang version reported by Apple Clang in __clang_major__
+ // and __clang_minor__ does _not_ reflect the actual upstream
+ // version of the compiler. To allow consumers to use a single
+ // define to verify the Clang version we hard-code the versions
+ // based on the best available info we have about the actual
+ // version: http://en.wikipedia.org/wiki/Xcode#Toolchain_Versions
+# if __apple_build_version__ >= 14030022 // Xcode 14.3
+# define Q_CC_CLANG 1500
+# elif __apple_build_version__ >= 14000029 // Xcode 14.0
+# define Q_CC_CLANG 1400
+# elif __apple_build_version__ >= 13160021 // Xcode 13.3
+# define Q_CC_CLANG 1300
+# elif __apple_build_version__ >= 13000029 // Xcode 13.0
+# define Q_CC_CLANG 1200
+# elif __apple_build_version__ >= 12050022 // Xcode 12.5
+# define Q_CC_CLANG 1110
+# elif __apple_build_version__ >= 12000032 // Xcode 12.0
+# define Q_CC_CLANG 1000
+# elif __apple_build_version__ >= 11030032 // Xcode 11.4
+# define Q_CC_CLANG 900
+# elif __apple_build_version__ >= 11000033 // Xcode 11.0
+# define Q_CC_CLANG 800
# else
-# error "Unknown Apple Clang version"
+# error "Unsupported Apple Clang version"
# endif
# else
+ // Non-Apple Clang, so we trust the versions reported
# define Q_CC_CLANG ((__clang_major__ * 100) + __clang_minor__)
# endif
+# define Q_CC_CLANG_ONLY Q_CC_CLANG
# if __has_builtin(__builtin_assume)
# define Q_ASSUME_IMPL(expr) __builtin_assume(expr)
# else
@@ -203,6 +168,7 @@
# endif
# else
/* Plain GCC */
+# define Q_CC_GNU_ONLY Q_CC_GNU
# if Q_CC_GNU >= 405
# define Q_ASSUME_IMPL(expr) if (expr){} else __builtin_unreachable()
# define Q_UNREACHABLE_IMPL() __builtin_unreachable()
@@ -213,8 +179,13 @@
# ifdef Q_OS_WIN
# define Q_DECL_EXPORT __declspec(dllexport)
# define Q_DECL_IMPORT __declspec(dllimport)
-# elif defined(QT_VISIBILITY_AVAILABLE)
-# define Q_DECL_EXPORT __attribute__((visibility("default")))
+# else
+# define Q_DECL_EXPORT_OVERRIDABLE __attribute__((visibility("default"), weak))
+# ifdef QT_USE_PROTECTED_VISIBILITY
+# define Q_DECL_EXPORT __attribute__((visibility("protected")))
+# else
+# define Q_DECL_EXPORT __attribute__((visibility("default")))
+# endif
# define Q_DECL_IMPORT __attribute__((visibility("default")))
# define Q_DECL_HIDDEN __attribute__((visibility("hidden")))
# endif
@@ -264,7 +235,6 @@
but it is not defined on older compilers like C Set 3.1 */
#elif defined(__xlC__)
# define Q_CC_XLC
-# define Q_FULL_TEMPLATE_INSTANTIATION
# if __xlC__ < 0x400
# error "Compiler not supported"
# elif __xlC__ >= 0x0600
@@ -335,10 +305,6 @@
# elif defined(__KCC)
# define Q_CC_KAI
-/* Using the `using' keyword avoids Intel C++ for Linux warnings */
-# elif defined(__INTEL_COMPILER)
-# define Q_CC_INTEL (__INTEL_COMPILER)
-
/* Uses CFront, make sure to read the manual how to tweak templates. */
# elif defined(__ghs)
# define Q_CC_GHS
@@ -484,13 +450,21 @@
# define __has_include_next(x) 0
#endif
-// Kept around until all submodules have transitioned
-#define QT_HAS_BUILTIN(x) __has_builtin(x)
-#define QT_HAS_FEATURE(x) __has_feature(x)
-#define QT_HAS_ATTRIBUTE(x) __has_attribute(x)
-#define QT_HAS_CPP_ATTRIBUTE(x) __has_cpp_attribute(x)
-#define QT_HAS_INCLUDE(x) __has_include(x)
-#define QT_HAS_INCLUDE_NEXT(x) __has_include_next(x)
+/*
+ detecting ASAN can be helpful to disable slow tests
+ clang uses feature, gcc defines __SANITIZE_ADDRESS__
+ unconditionally check both in case other compilers mirror
+ either of those options
+ */
+#if __has_feature(address_sanitizer) || defined(__SANITIZE_ADDRESS__)
+# define QT_ASAN_ENABLED
+#endif
+
+#ifdef __cplusplus
+# if __has_include(<version>) /* remove this check once Integrity, QNX have caught up */
+# include <version>
+# endif
+#endif
/*
* C++11 support
@@ -532,9 +506,14 @@
* N1653 Q_COMPILER_VARIADIC_MACROS
* N2242 N2555 Q_COMPILER_VARIADIC_TEMPLATES __cpp_variadic_templates = 200704
*
- * For any future version of the C++ standard, we use only the SD-6 macro.
- * For full listing, see
- * http://isocpp.org/std/standing-documents/sd-6-sg10-feature-test-recommendations
+ *
+ * For the C++ standards C++14 and C++17, we use only the SD-6 macro.
+ *
+ * For any future version of the C++ standard, we use only the C++20 feature test macro.
+ * For library features, we assume <version> is present (this header includes it).
+ *
+ * For a full listing of feature test macros, see
+ * https://en.cppreference.com/w/cpp/feature_test
*
* C++ extensions:
* Q_COMPILER_RESTRICTED_VLA variable-length arrays, prior to __cpp_runtime_arrays
@@ -545,88 +524,7 @@
*/
#define Q_COMPILER_THREADSAFE_STATICS
-#ifdef __cplusplus
-# if __cplusplus < 201103L && !defined(Q_CC_MSVC)
-# error Qt requires a C++11 compiler and yours does not seem to be that.
-# endif
-#endif
-
-#if defined(Q_CC_INTEL) && !defined(Q_CC_MSVC)
-# define Q_COMPILER_RESTRICTED_VLA
-# define Q_COMPILER_VARIADIC_MACROS // C++11 feature supported as an extension in other modes, too
-# if __INTEL_COMPILER < 1200
-# define Q_NO_TEMPLATE_FRIENDS
-# endif
-# if __INTEL_COMPILER >= 1310 && !defined(_WIN32)
-// ICC supports C++14 binary literals in C, C++98, and C++11 modes
-// at least since 13.1, but I can't test further back
-# define Q_COMPILER_BINARY_LITERALS
-# endif
-# if __cplusplus >= 201103L || defined(__INTEL_CXX11_MODE__)
-# if __INTEL_COMPILER >= 1200
-# define Q_COMPILER_AUTO_TYPE
-# define Q_COMPILER_CLASS_ENUM
-# define Q_COMPILER_DECLTYPE
-# define Q_COMPILER_DEFAULT_MEMBERS
-# define Q_COMPILER_DELETE_MEMBERS
-# define Q_COMPILER_EXTERN_TEMPLATES
-# define Q_COMPILER_LAMBDA
-# define Q_COMPILER_RVALUE_REFS
-# define Q_COMPILER_STATIC_ASSERT
-# define Q_COMPILER_VARIADIC_MACROS
-# endif
-# if __INTEL_COMPILER >= 1210
-# define Q_COMPILER_ATTRIBUTES
-# define Q_COMPILER_AUTO_FUNCTION
-# define Q_COMPILER_NULLPTR
-# define Q_COMPILER_TEMPLATE_ALIAS
-# ifndef _CHAR16T // MSVC headers
-# define Q_COMPILER_UNICODE_STRINGS
-# endif
-# define Q_COMPILER_VARIADIC_TEMPLATES
-# endif
-# if __INTEL_COMPILER >= 1300
-# define Q_COMPILER_ATOMICS
-// constexpr support is only partial
-//# define Q_COMPILER_CONSTEXPR
-# define Q_COMPILER_INITIALIZER_LISTS
-# define Q_COMPILER_UNIFORM_INIT
-# define Q_COMPILER_NOEXCEPT
-# endif
-# if __INTEL_COMPILER >= 1400
-// causes issues with QArrayData and QtPrivate::RefCount - Intel issue ID 6000056211, bug DPD200534796
-//# define Q_COMPILER_CONSTEXPR
-# define Q_COMPILER_DELEGATING_CONSTRUCTORS
-# define Q_COMPILER_EXPLICIT_CONVERSIONS
-# define Q_COMPILER_EXPLICIT_OVERRIDES
-# define Q_COMPILER_NONSTATIC_MEMBER_INIT
-# define Q_COMPILER_RANGE_FOR
-# define Q_COMPILER_RAW_STRINGS
-# define Q_COMPILER_REF_QUALIFIERS
-# define Q_COMPILER_UNICODE_STRINGS
-# define Q_COMPILER_UNRESTRICTED_UNIONS
-# endif
-# if __INTEL_COMPILER >= 1500
-# if __INTEL_COMPILER * 100 + __INTEL_COMPILER_UPDATE >= 150001
-// the bug mentioned above is fixed in 15.0.1
-# define Q_COMPILER_CONSTEXPR
-# endif
-# define Q_COMPILER_ALIGNAS
-# define Q_COMPILER_ALIGNOF
-# define Q_COMPILER_INHERITING_CONSTRUCTORS
-# define Q_COMPILER_THREAD_LOCAL
-# define Q_COMPILER_UDL
-# endif
-# elif defined(__STDC_VERSION__) && __STDC_VERSION__ > 199901L
-// C11 features supported. Only tested with ICC 17 and up.
-# define Q_COMPILER_STATIC_ASSERT
-# if __has_include(<threads.h>)
-# define Q_COMPILER_THREAD_LOCAL
-# endif
-# endif
-#endif
-
-#if defined(Q_CC_CLANG) && !defined(Q_CC_INTEL) && !defined(Q_CC_MSVC)
+#if defined(Q_CC_CLANG)
/* General C++ features */
# define Q_COMPILER_RESTRICTED_VLA
# if __has_feature(attribute_deprecated_with_message)
@@ -649,7 +547,8 @@
# endif
/* C++11 features, see http://clang.llvm.org/cxx_status.html */
-# if __cplusplus >= 201103L || defined(__GXX_EXPERIMENTAL_CXX0X__)
+# if (defined(__cplusplus) && __cplusplus >= 201103L) \
+ || defined(__GXX_EXPERIMENTAL_CXX0X__)
/* Detect C++ features using __has_feature(), see http://clang.llvm.org/docs/LanguageExtensions.html#cxx11 */
# if __has_feature(cxx_alignas)
# define Q_COMPILER_ALIGNAS
@@ -747,10 +646,10 @@
# if Q_CC_CLANG >= 209 /* since clang 2.9 */
# define Q_COMPILER_EXTERN_TEMPLATES
# endif
-# endif
+# endif // (defined(__cplusplus) && __cplusplus >= 201103L) || defined(__GXX_EXPERIMENTAL_CXX0X__)
/* C++1y features, deprecated macros. Do not update this list. */
-# if __cplusplus > 201103L
+# if defined(__cplusplus) && __cplusplus > 201103L
//# if __has_feature(cxx_binary_literals)
//# define Q_COMPILER_BINARY_LITERALS // see above
//# endif
@@ -772,7 +671,7 @@
# if __has_feature(cxx_runtime_array)
# define Q_COMPILER_VLA
# endif
-# endif
+# endif // if defined(__cplusplus) && __cplusplus > 201103L
# if defined(__STDC_VERSION__)
# if __has_feature(c_static_assert)
@@ -785,16 +684,13 @@
# endif
# endif
-#endif // Q_CC_CLANG && !Q_CC_INTEL && !Q_CC_MSVC
-
-#if defined(Q_CC_CLANG) && !defined(Q_CC_INTEL)
# ifndef Q_DECL_UNUSED
# define Q_DECL_UNUSED __attribute__((__unused__))
# endif
# define Q_DECL_UNUSED_MEMBER Q_DECL_UNUSED
-#endif
+#endif // defined(Q_CC_CLANG)
-#if defined(Q_CC_GNU) && !defined(Q_CC_INTEL) && !defined(Q_CC_CLANG)
+#if defined(Q_CC_GNU_ONLY)
# define Q_COMPILER_RESTRICTED_VLA
# if Q_CC_GNU >= 403
// GCC supports binary literals in C, C++98 and C++11 modes
@@ -897,7 +793,7 @@
# endif
#endif
-#if defined(Q_CC_MSVC)
+#if defined(Q_CC_MSVC) && !defined(Q_CC_CLANG)
# if defined(__cplusplus)
/* C++11 features supported in VC8 = VC2005: */
# define Q_COMPILER_VARIADIC_MACROS
@@ -954,8 +850,17 @@
# if _MSC_VER >= 1910
# define Q_COMPILER_CONSTEXPR
# endif
+// MSVC versions before 19.36 have a bug in C++20 comparison implementation.
+// This leads to ambiguities when resolving comparison operator overloads in
+// certain scenarios (the buggy MSVC versions were checked using our CI and
+// compiler explorer).
+# if _MSC_VER < 1936
+# define Q_COMPILER_LACKS_THREE_WAY_COMPARE_SYMMETRY
+# endif
+// QTBUG-124376: MSVC is slow at compiling qstrnlen()
+# define Q_COMPILER_SLOW_QSTRNLEN_COMPILATION
# endif /* __cplusplus */
-#endif /* Q_CC_MSVC */
+#endif // defined(Q_CC_MSVC) && !defined(Q_CC_CLANG)
#ifdef Q_COMPILER_UNICODE_STRINGS
# define Q_STDLIB_UNICODE_STRINGS
@@ -999,44 +904,22 @@
# endif // !_HAS_CONSTEXPR
# endif // !__GLIBCXX__ && !_LIBCPP_VERSION
# endif // Q_OS_QNX
-# if (defined(Q_CC_CLANG) || defined(Q_CC_INTEL)) && defined(Q_OS_MAC) && defined(__GNUC_LIBSTD__) \
- && ((__GNUC_LIBSTD__-0) * 100 + __GNUC_LIBSTD_MINOR__-0 <= 402)
+# if defined(Q_CC_CLANG) && defined(Q_OS_DARWIN)
+# if defined(__GNUC_LIBSTD__) && ((__GNUC_LIBSTD__-0) * 100 + __GNUC_LIBSTD_MINOR__-0 <= 402)
// Apple has not updated libstdc++ since 2007, which means it does not have
// <initializer_list> or std::move. Let's disable these features
-# undef Q_COMPILER_INITIALIZER_LISTS
-# undef Q_COMPILER_RVALUE_REFS
-# undef Q_COMPILER_REF_QUALIFIERS
+# undef Q_COMPILER_INITIALIZER_LISTS
+# undef Q_COMPILER_RVALUE_REFS
+# undef Q_COMPILER_REF_QUALIFIERS
// Also disable <atomic>, since it's clearly not there
-# undef Q_COMPILER_ATOMICS
-# endif
-# if defined(Q_CC_CLANG) && defined(Q_CC_INTEL) && Q_CC_INTEL >= 1500
-// ICC 15.x and 16.0 have their own implementation of std::atomic, which is activated when in Clang mode
-// (probably because libc++'s <atomic> on OS X failed to compile), but they're missing some
-// critical definitions. (Reported as Intel Issue ID 6000117277)
-# define __USE_CONSTEXPR 1
-# define __USE_NOEXCEPT 1
-# endif
-#endif
-
-/*
- * C++11 keywords and expressions
- */
-#ifdef Q_COMPILER_NULLPTR
-# define Q_NULLPTR nullptr
-#else
-# define Q_NULLPTR NULL
-#endif
-
-#ifdef Q_COMPILER_DEFAULT_MEMBERS
-# define Q_DECL_EQ_DEFAULT = default
-#else
-# define Q_DECL_EQ_DEFAULT
-#endif
-
-#ifdef Q_COMPILER_DELETE_MEMBERS
-# define Q_DECL_EQ_DELETE = delete
-#else
-# define Q_DECL_EQ_DELETE
+# undef Q_COMPILER_ATOMICS
+# endif
+# if defined(__cpp_lib_memory_resource) \
+ && ((defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && __MAC_OS_X_VERSION_MIN_REQUIRED < 140000) \
+ || (defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && __IPHONE_OS_VERSION_MIN_REQUIRED < 170000))
+# undef __cpp_lib_memory_resource // Only supported on macOS 14 and iOS 17
+# endif
+# endif // defined(Q_CC_CLANG) && defined(Q_OS_DARWIN)
#endif
// Don't break code that is already using Q_COMPILER_DEFAULT_DELETE_MEMBERS
@@ -1044,65 +927,68 @@
# define Q_COMPILER_DEFAULT_DELETE_MEMBERS
#endif
-#if defined Q_COMPILER_CONSTEXPR
-# if defined(__cpp_constexpr) && __cpp_constexpr-0 >= 201304
-# define Q_DECL_CONSTEXPR constexpr
-# define Q_DECL_RELAXED_CONSTEXPR constexpr
-# define Q_CONSTEXPR constexpr
-# define Q_RELAXED_CONSTEXPR constexpr
-# else
-# define Q_DECL_CONSTEXPR constexpr
-# define Q_DECL_RELAXED_CONSTEXPR
-# define Q_CONSTEXPR constexpr
-# define Q_RELAXED_CONSTEXPR const
-# endif
+/*
+ * Compatibility macros for C++11/14 keywords and expressions.
+ * Don't use in new code and port away whenever you have a chance.
+ */
+#define Q_ALIGNOF(x) alignof(x)
+#define Q_DECL_ALIGN(n) alignas(n)
+#define Q_DECL_NOTHROW Q_DECL_NOEXCEPT
+#ifdef __cplusplus
+# define Q_CONSTEXPR constexpr
+# define Q_DECL_CONSTEXPR constexpr
+# define Q_DECL_EQ_DEFAULT = default
+# define Q_DECL_EQ_DELETE = delete
+# define Q_DECL_FINAL final
+# define Q_DECL_NOEXCEPT noexcept
+# define Q_DECL_NOEXCEPT_EXPR(x) noexcept(x)
+# define Q_DECL_OVERRIDE override
+# define Q_DECL_RELAXED_CONSTEXPR constexpr
+# define Q_NULLPTR nullptr
+# define Q_RELAXED_CONSTEXPR constexpr
#else
+# define Q_CONSTEXPR const
# define Q_DECL_CONSTEXPR
# define Q_DECL_RELAXED_CONSTEXPR
-# define Q_CONSTEXPR const
-# define Q_RELAXED_CONSTEXPR const
-#endif
-
-#ifdef Q_COMPILER_EXPLICIT_OVERRIDES
-# define Q_DECL_OVERRIDE override
-# define Q_DECL_FINAL final
-#else
-# ifndef Q_DECL_OVERRIDE
-# define Q_DECL_OVERRIDE
-# endif
-# ifndef Q_DECL_FINAL
-# define Q_DECL_FINAL
+# define Q_NULLPTR NULL
+# define Q_RELAXED_CONSTEXPR const
+# ifdef Q_CC_GNU
+# define Q_DECL_NOEXCEPT __attribute__((__nothrow__))
+# else
+# define Q_DECL_NOEXCEPT
# endif
#endif
-#ifdef Q_COMPILER_NOEXCEPT
-# define Q_DECL_NOEXCEPT noexcept
-# define Q_DECL_NOEXCEPT_EXPR(x) noexcept(x)
-#else
-# define Q_DECL_NOEXCEPT
-# define Q_DECL_NOEXCEPT_EXPR(x)
-#endif
-#define Q_DECL_NOTHROW Q_DECL_NOEXCEPT
-
-#ifndef Q_ALIGNOF
-# define Q_ALIGNOF(x) alignof(x)
-#endif
-
-#ifndef Q_DECL_ALIGN
-# define Q_DECL_ALIGN(n) alignas(n)
-#endif
-
#if __has_cpp_attribute(nodiscard) && (!defined(Q_CC_CLANG) || __cplusplus > 201402L) // P0188R1
// Can't use [[nodiscard]] with Clang and C++11/14, see https://bugs.llvm.org/show_bug.cgi?id=33518
# undef Q_REQUIRED_RESULT
# define Q_REQUIRED_RESULT [[nodiscard]]
#endif
+#if __has_cpp_attribute(nodiscard) >= 201907L /* used for both P1771 and P1301... */
+// [[nodiscard]] constructor (P1771)
+# ifndef Q_NODISCARD_CTOR
+# define Q_NODISCARD_CTOR [[nodiscard]]
+# endif
+// [[nodiscard("reason")]] (P1301)
+# ifndef Q_NODISCARD_X
+# define Q_NODISCARD_X(message) [[nodiscard(message)]]
+# endif
+# ifndef Q_NODISCARD_CTOR_X
+# define Q_NODISCARD_CTOR_X(message) [[nodiscard(message)]]
+# endif
+#endif
+
#if __has_cpp_attribute(maybe_unused)
# undef Q_DECL_UNUSED
# define Q_DECL_UNUSED [[maybe_unused]]
#endif
+#if __has_cpp_attribute(noreturn)
+# undef Q_NORETURN
+# define Q_NORETURN [[noreturn]]
+#endif
+
#if __has_cpp_attribute(deprecated)
# ifdef Q_DECL_DEPRECATED
# undef Q_DECL_DEPRECATED
@@ -1142,6 +1028,15 @@
#ifndef Q_REQUIRED_RESULT
# define Q_REQUIRED_RESULT
#endif
+#ifndef Q_NODISCARD_X
+# define Q_NODISCARD_X(message) Q_REQUIRED_RESULT
+#endif
+#ifndef Q_NODISCARD_CTOR
+# define Q_NODISCARD_CTOR
+#endif
+#ifndef Q_NODISCARD_CTOR_X
+# define Q_NODISCARD_CTOR_X(message) Q_NODISCARD_CTOR
+#endif
#ifndef Q_DECL_DEPRECATED
# define Q_DECL_DEPRECATED
#endif
@@ -1154,6 +1049,9 @@
#ifndef Q_DECL_EXPORT
# define Q_DECL_EXPORT
#endif
+#ifndef Q_DECL_EXPORT_OVERRIDABLE
+# define Q_DECL_EXPORT_OVERRIDABLE Q_DECL_EXPORT
+#endif
#ifndef Q_DECL_IMPORT
# define Q_DECL_IMPORT
#endif
@@ -1199,37 +1097,42 @@
* "Weak overloads" - makes an otherwise confliciting overload weaker
* (by making it a template)
*/
-#define Q_WEAK_OVERLOAD template <typename = void>
+#ifndef Q_QDOC
+# define Q_WEAK_OVERLOAD template <typename = void>
+#else
+# define Q_WEAK_OVERLOAD
+#endif
+
+/*
+ * If one wants to add functions that use post-C++17 APIs, one needs to:
+ *
+ * 1) make them fully inline; and
+ * 2) guard them using the necessary feature-testing macros.
+ *
+ * This decouples the C++ version used to build Qt with the one used by
+ * end-user applications; Qt and the application can either choose any C++
+ * version.
+ *
+ * A problem arises on MSVC for member functions of exported classes. Client
+ * code that tries to use such a function will see it as exported, and simply
+ * try to consume the function's *symbol*. However, if Qt has been built in
+ * C++17, it won't have such a symbol, and linking will fail.
+ *
+ * The workaround: declare such functions as function templates.
+ * (Obviously a function template does not need this marker.)
+*/
+#ifndef Q_QDOC
+# define QT_POST_CXX17_API_IN_EXPORTED_CLASS template <typename = void>
+#else
+# define QT_POST_CXX17_API_IN_EXPORTED_CLASS
+#endif
/*
* Warning/diagnostic handling
*/
#define QT_DO_PRAGMA(text) _Pragma(#text)
-#if defined(Q_CC_INTEL) && defined(Q_CC_MSVC)
-/* icl.exe: Intel compiler on Windows */
-# undef QT_DO_PRAGMA /* not needed */
-# define QT_WARNING_PUSH __pragma(warning(push))
-# define QT_WARNING_POP __pragma(warning(pop))
-# define QT_WARNING_DISABLE_MSVC(number)
-# define QT_WARNING_DISABLE_INTEL(number) __pragma(warning(disable: number))
-# define QT_WARNING_DISABLE_CLANG(text)
-# define QT_WARNING_DISABLE_GCC(text)
-# define QT_WARNING_DISABLE_DEPRECATED QT_WARNING_DISABLE_INTEL(1478 1786)
-# define QT_WARNING_DISABLE_FLOAT_COMPARE QT_WARNING_DISABLE_INTEL(1572)
-# define QT_WARNING_DISABLE_INVALID_OFFSETOF
-#elif defined(Q_CC_INTEL)
-/* icc: Intel compiler on Linux or OS X */
-# define QT_WARNING_PUSH QT_DO_PRAGMA(warning(push))
-# define QT_WARNING_POP QT_DO_PRAGMA(warning(pop))
-# define QT_WARNING_DISABLE_INTEL(number) QT_DO_PRAGMA(warning(disable: number))
-# define QT_WARNING_DISABLE_MSVC(number)
-# define QT_WARNING_DISABLE_CLANG(text)
-# define QT_WARNING_DISABLE_GCC(text)
-# define QT_WARNING_DISABLE_DEPRECATED QT_WARNING_DISABLE_INTEL(1478 1786)
-# define QT_WARNING_DISABLE_FLOAT_COMPARE QT_WARNING_DISABLE_INTEL(1572)
-# define QT_WARNING_DISABLE_INVALID_OFFSETOF
-#elif defined(Q_CC_MSVC) && !defined(Q_CC_CLANG)
+#if defined(Q_CC_MSVC) && !defined(Q_CC_CLANG)
# undef QT_DO_PRAGMA /* not needed */
# define QT_WARNING_PUSH __pragma(warning(push))
# define QT_WARNING_POP __pragma(warning(pop))
@@ -1281,6 +1184,20 @@
QT_WARNING_POP
#endif
+// The body must be a statement:
+#define Q_CAST_IGNORE_ALIGN(body) QT_WARNING_PUSH QT_WARNING_DISABLE_GCC("-Wcast-align") body QT_WARNING_POP
+
+// This macro can be used to calculate member offsets for types with a non standard layout.
+// It uses the fact that offsetof() is allowed to support those types since C++17 as an optional
+// feature. All our compilers do support this, but some issue a warning, so we wrap the offsetof()
+// call in a macro that disables the compiler warning.
+#define Q_OFFSETOF(Class, member) \
+ []() -> size_t { \
+ QT_WARNING_PUSH QT_WARNING_DISABLE_INVALID_OFFSETOF \
+ return offsetof(Class, member); \
+ QT_WARNING_POP \
+ }()
+
/*
Proper for-scoping in MIPSpro CC
*/
@@ -1296,19 +1213,6 @@
#define qMove(x) (x)
#endif
-#define Q_UNREACHABLE() \
- do {\
- Q_ASSERT_X(false, "Q_UNREACHABLE()", "Q_UNREACHABLE was reached");\
- Q_UNREACHABLE_IMPL();\
- } while (false)
-
-#define Q_ASSUME(Expr) \
- do {\
- const bool valueOfExpression = Expr;\
- Q_ASSERT_X(valueOfExpression, "Q_ASSUME()", "Assumption in Q_ASSUME(\"" #Expr "\") was not correct");\
- Q_ASSUME_IMPL(valueOfExpression);\
- } while (false)
-
#if defined(__cplusplus)
#if __has_cpp_attribute(clang::fallthrough)
# define Q_FALLTHROUGH() [[clang::fallthrough]]
@@ -1319,11 +1223,11 @@
#endif
#endif
#ifndef Q_FALLTHROUGH
-# if (defined(Q_CC_GNU) && Q_CC_GNU >= 700) && !defined(Q_CC_INTEL)
+# ifdef Q_CC_GNU
# define Q_FALLTHROUGH() __attribute__((fallthrough))
# else
# define Q_FALLTHROUGH() (void)0
-#endif
+# endif
#endif
@@ -1348,4 +1252,177 @@
# undef QT_COMPILER_SUPPORTS_MIPS_DSPR2
#endif
+// Compiler version check
+#if defined(__cplusplus) && (__cplusplus < 201703L)
+# ifdef Q_CC_MSVC
+# error "Qt requires a C++17 compiler, and a suitable value for __cplusplus. On MSVC, you must pass the /Zc:__cplusplus option to the compiler."
+# else
+# error "Qt requires a C++17 compiler"
+# endif
+#endif // __cplusplus
+
+#if defined(__cplusplus) && defined(Q_CC_MSVC) && !defined(Q_CC_CLANG)
+# if Q_CC_MSVC < 1927
+ // Check below only works with 16.7 or newer
+# error "Qt requires at least Visual Studio 2019 version 16.7 (VC++ version 14.27). Please upgrade."
+# endif
+
+// On MSVC we require /permissive- set by user code. Check that we are
+// under its rules -- for instance, check that std::nullptr_t->bool is
+// not an implicit conversion, as per
+// https://docs.microsoft.com/en-us/cpp/overview/cpp-conformance-improvements?view=msvc-160#nullptr_t-is-only-convertible-to-bool-as-a-direct-initialization
+static_assert(!std::is_convertible_v<std::nullptr_t, bool>,
+ "On MSVC you must pass the /permissive- option to the compiler.");
+#endif
+
+#if defined(QT_BOOTSTRAPPED) || defined(QT_USE_PROTECTED_VISIBILITY) || !defined(__ELF__) || defined(__PIC__)
+// this is fine
+#elif defined(QT_REDUCE_RELOCATIONS)
+# error "You must build your code with position independent code if Qt was configured with -reduce-relocations. "\
+ "Compile your code with -fPIC (and not with -fPIE)."
+#endif
+
+#ifdef Q_PROCESSOR_X86_32
+# if defined(Q_CC_GNU)
+# define QT_FASTCALL __attribute__((regparm(3)))
+# elif defined(Q_CC_MSVC)
+# define QT_FASTCALL __fastcall
+# else
+# define QT_FASTCALL
+# endif
+#else
+# define QT_FASTCALL
+#endif
+
+// enable gcc warnings for printf-style functions
+#if defined(Q_CC_GNU) && !defined(__INSURE__)
+# if defined(Q_CC_MINGW) && !defined(Q_CC_CLANG)
+# define Q_ATTRIBUTE_FORMAT_PRINTF(A, B) \
+ __attribute__((format(gnu_printf, (A), (B))))
+# else
+# define Q_ATTRIBUTE_FORMAT_PRINTF(A, B) \
+ __attribute__((format(printf, (A), (B))))
+# endif
+#else
+# define Q_ATTRIBUTE_FORMAT_PRINTF(A, B)
+#endif
+
+#ifdef Q_CC_MSVC
+# define Q_NEVER_INLINE __declspec(noinline)
+# define Q_ALWAYS_INLINE __forceinline
+#elif defined(Q_CC_GNU)
+# define Q_NEVER_INLINE __attribute__((noinline))
+# define Q_ALWAYS_INLINE inline __attribute__((always_inline))
+#else
+# define Q_NEVER_INLINE
+# define Q_ALWAYS_INLINE inline
+#endif
+
+//defines the type for the WNDPROC on windows
+//the alignment needs to be forced for sse2 to not crash with mingw
+#if defined(Q_OS_WIN)
+# if defined(Q_CC_MINGW) && defined(Q_PROCESSOR_X86_32)
+# define QT_ENSURE_STACK_ALIGNED_FOR_SSE __attribute__ ((force_align_arg_pointer))
+# else
+# define QT_ENSURE_STACK_ALIGNED_FOR_SSE
+# endif
+# define QT_WIN_CALLBACK CALLBACK QT_ENSURE_STACK_ALIGNED_FOR_SSE
+#endif
+
+#ifdef __cpp_conditional_explicit
+#define Q_IMPLICIT explicit(false)
+#else
+#define Q_IMPLICIT
+#endif
+
+#if defined(__cplusplus)
+
+#ifdef __cpp_constinit
+# if defined(Q_CC_MSVC) && !defined(Q_CC_CLANG)
+ // https://developercommunity.visualstudio.com/t/C:-constinit-for-an-optional-fails-if-/1406069
+# define Q_CONSTINIT
+# else
+# define Q_CONSTINIT constinit
+# endif
+#elif defined(__has_cpp_attribute) && __has_cpp_attribute(clang::require_constant_initialization)
+# define Q_CONSTINIT [[clang::require_constant_initialization]]
+#elif defined(Q_CC_GNU_ONLY) && Q_CC_GNU >= 1000
+# define Q_CONSTINIT __constinit
+#else
+# define Q_CONSTINIT
+#endif
+
+#ifndef Q_OUTOFLINE_TEMPLATE
+# define Q_OUTOFLINE_TEMPLATE
+#endif
+#ifndef Q_INLINE_TEMPLATE
+# define Q_INLINE_TEMPLATE inline
+#endif
+
+/*
+ Avoid some particularly useless warnings from some stupid compilers.
+ To get ALL C++ compiler warnings, define QT_CC_WARNINGS or comment out
+ the line "#define QT_NO_WARNINGS". See also QTBUG-26877.
+*/
+#if !defined(QT_CC_WARNINGS)
+# define QT_NO_WARNINGS
+#endif
+#if defined(QT_NO_WARNINGS)
+# if defined(Q_CC_MSVC)
+QT_WARNING_DISABLE_MSVC(4251) /* class 'type' needs to have dll-interface to be used by clients of class 'type2' */
+QT_WARNING_DISABLE_MSVC(4244) /* conversion from 'type1' to 'type2', possible loss of data */
+QT_WARNING_DISABLE_MSVC(4275) /* non - DLL-interface classkey 'identifier' used as base for DLL-interface classkey 'identifier' */
+QT_WARNING_DISABLE_MSVC(4514) /* unreferenced inline function has been removed */
+QT_WARNING_DISABLE_MSVC(4800) /* 'type' : forcing value to bool 'true' or 'false' (performance warning) */
+QT_WARNING_DISABLE_MSVC(4097) /* typedef-name 'identifier1' used as synonym for class-name 'identifier2' */
+QT_WARNING_DISABLE_MSVC(4706) /* assignment within conditional expression */
+QT_WARNING_DISABLE_MSVC(4355) /* 'this' : used in base member initializer list */
+QT_WARNING_DISABLE_MSVC(4710) /* function not inlined */
+QT_WARNING_DISABLE_MSVC(4530) /* C++ exception handler used, but unwind semantics are not enabled. Specify /EHsc */
+# elif defined(Q_CC_BOR)
+# pragma option -w-inl
+# pragma option -w-aus
+# pragma warn -inl
+# pragma warn -pia
+# pragma warn -ccc
+# pragma warn -rch
+# pragma warn -sig
+# endif
+#endif
+
+#if !defined(QT_NO_EXCEPTIONS)
+# if !defined(Q_MOC_RUN)
+# if defined(Q_CC_GNU) && !defined(__cpp_exceptions)
+# define QT_NO_EXCEPTIONS
+# endif
+# elif defined(QT_BOOTSTRAPPED)
+# define QT_NO_EXCEPTIONS
+# endif
+#endif
+
+// libstdc++ shipped with gcc < 11 does not have a fix for defect LWG 3346
+#if __cplusplus >= 202002L && (!defined(_GLIBCXX_RELEASE) || _GLIBCXX_RELEASE >= 11)
+# define QT_COMPILER_HAS_LWG3346
+#endif
+
+#if defined(__cplusplus) && __cplusplus >= 202002L // P0846 doesn't have a feature macro :/
+# if !defined(Q_CC_MSVC_ONLY) || Q_CC_MSVC < 1939 // claims C++20 support but lacks P0846
+ // 1939 is known to work
+ // 1936 is known to fail
+# define QT_COMPILER_HAS_P0846
+# endif
+#endif
+
+#ifdef QT_COMPILER_HAS_P0846
+# define QT_ENABLE_P0846_SEMANTICS_FOR(func)
+#else
+ class QT_CLASS_JUST_FOR_P0846_SIMULATION;
+# define QT_ENABLE_P0846_SEMANTICS_FOR(func) \
+ template <typename T> \
+ void func (QT_CLASS_JUST_FOR_P0846_SIMULATION *); \
+ /* end */
+#endif // !P0846
+
+#endif // __cplusplus
+
#endif // QCOMPILERDETECTION_H
diff --git a/src/corelib/global/qcompilerdetection.qdoc b/src/corelib/global/qcompilerdetection.qdoc
new file mode 100644
index 0000000000..191f26cc1f
--- /dev/null
+++ b/src/corelib/global/qcompilerdetection.qdoc
@@ -0,0 +1,427 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
+
+/*!
+ \headerfile <QtCompilerDetection>
+ \inmodule QtCore
+ \title Compiler-specific Macro Definitions
+ \ingroup funclists
+
+ \brief The <QtCompilerDetection> header file includes various
+ compiler-specific macros.
+
+ The <QtCompilerDetection> header file provides a range of macros (Q_CC_*)
+ that are defined if the application is compiled using the specified
+ compiler. For example, the Q_CC_SUN macro is defined if the application is
+ compiled using Forte Developer, or Sun Studio C++.
+
+ The purpose of these macros is to enable programmers to add
+ compiler-specific code to their application.
+*/
+
+/*!
+ \macro Q_CC_SYM
+ \relates <QtCompilerDetection>
+
+ Defined if the application is compiled using Digital Mars C/C++
+ (used to be Symantec C++).
+*/
+
+/*!
+ \macro Q_CC_MSVC
+ \relates <QtCompilerDetection>
+
+ Defined if the application is compiled using Microsoft Visual
+ C/C++, Intel C++ for Windows.
+*/
+
+/*!
+ \macro Q_CC_CLANG
+ \relates <QtCompilerDetection>
+
+ Defined if the application is compiled using Clang.
+*/
+
+/*!
+ \macro Q_CC_BOR
+ \relates <QtCompilerDetection>
+
+ Defined if the application is compiled using Borland/Turbo C++.
+*/
+
+/*!
+ \macro Q_CC_WAT
+ \relates <QtCompilerDetection>
+
+ Defined if the application is compiled using Watcom C++.
+*/
+
+/*!
+ \macro Q_CC_GNU
+ \relates <QtCompilerDetection>
+
+ Defined if the application is compiled using GNU Compiler Collection (GCC).
+*/
+
+/*!
+ \macro Q_CC_COMEAU
+ \relates <QtCompilerDetection>
+
+ Defined if the application is compiled using Comeau C++.
+*/
+
+/*!
+ \macro Q_CC_EDG
+ \relates <QtCompilerDetection>
+
+ Defined if the application is compiled using Edison Design Group
+ C++.
+*/
+
+/*!
+ \macro Q_CC_OC
+ \relates <QtCompilerDetection>
+
+ Defined if the application is compiled using CenterLine C++.
+*/
+
+/*!
+ \macro Q_CC_SUN
+ \relates <QtCompilerDetection>
+
+ Defined if the application is compiled using Forte Developer, or
+ Sun Studio C++.
+*/
+
+/*!
+ \macro Q_CC_MIPS
+ \relates <QtCompilerDetection>
+
+ Defined if the application is compiled using MIPSpro C++.
+*/
+
+/*!
+ \macro Q_CC_DEC
+ \relates <QtCompilerDetection>
+
+ Defined if the application is compiled using DEC C++.
+*/
+
+/*!
+ \macro Q_CC_HPACC
+ \relates <QtCompilerDetection>
+
+ Defined if the application is compiled using HP aC++.
+*/
+
+/*!
+ \macro Q_CC_USLC
+ \relates <QtCompilerDetection>
+
+ Defined if the application is compiled using SCO OUDK and UDK.
+*/
+
+/*!
+ \macro Q_CC_CDS
+ \relates <QtCompilerDetection>
+
+ Defined if the application is compiled using Reliant C++.
+*/
+
+/*!
+ \macro Q_CC_KAI
+ \relates <QtCompilerDetection>
+
+ Defined if the application is compiled using KAI C++.
+*/
+
+/*!
+ \macro Q_CC_INTEL
+ \relates <QtCompilerDetection>
+ \obsolete
+
+ This macro used to be defined if the application was compiled with the old
+ Intel C++ compiler for Linux, macOS or Windows. The new oneAPI C++ compiler
+ is just a build of Clang and therefore does not define this macro.
+
+ \sa Q_CC_CLANG
+*/
+
+/*!
+ \macro Q_CC_HIGHC
+ \relates <QtCompilerDetection>
+
+ Defined if the application is compiled using MetaWare High C/C++.
+*/
+
+/*!
+ \macro Q_CC_PGI
+ \relates <QtCompilerDetection>
+
+ Defined if the application is compiled using Portland Group C++.
+*/
+
+/*!
+ \macro Q_CC_GHS
+ \relates <QtCompilerDetection>
+
+ Defined if the application is compiled using Green Hills
+ Optimizing C++ Compilers.
+*/
+
+/*!
+ \macro void Q_FALLTHROUGH()
+ \relates <QtCompilerDetection>
+ \since 5.8
+
+ Can be used in switch statements at the end of case block to tell the compiler
+ and other developers that the lack of a break statement is intentional.
+
+ This is useful since a missing break statement is often a bug, and some
+ compilers can be configured to emit warnings when one is not found.
+
+ \sa Q_UNREACHABLE(), Q_UNREACHABLE_RETURN()
+*/
+
+/*!
+ \macro Q_LIKELY(expr)
+ \relates <QtCompilerDetection>
+ \since 4.8
+
+ \brief Hints to the compiler that the enclosed condition, \a expr, is
+ likely to evaluate to \c true.
+
+ Use of this macro can help the compiler to optimize the code.
+
+ Example:
+
+ \snippet code/src_corelib_global_qglobal.cpp qlikely
+
+ \sa Q_UNLIKELY()
+*/
+
+/*!
+ \macro Q_UNLIKELY(expr)
+ \relates <QtCompilerDetection>
+ \since 4.8
+
+ \brief Hints to the compiler that the enclosed condition, \a expr, is
+ likely to evaluate to \c false.
+
+ Use of this macro can help the compiler to optimize the code.
+
+ Example:
+
+ \snippet code/src_corelib_global_qglobal.cpp qunlikely
+
+ \sa Q_LIKELY()
+*/
+
+/*!
+ \macro Q_CONSTINIT
+ \relates <QtCompilerDetection>
+ \since 6.4
+
+ \brief Enforces constant initialization when supported by the compiler.
+
+ If the compiler supports the C++20 \c{constinit} keyword, Clang's
+ \c{[[clang::require_constant_initialization]]} or GCC's \c{__constinit},
+ then this macro expands to the first one of these that is available,
+ otherwise it expands to nothing.
+
+ Variables marked as \c{constinit} cause a compile-error if their
+ initialization would have to be performed at runtime.
+
+ \note Constant-initialized variables may still have load-time impact if
+ they have non-trivial destruction.
+
+ For constants, you can use \c{constexpr} since C++11, but \c{constexpr}
+ makes variables \c{const}, too, whereas \c{constinit} ensures constant
+ initialization, but doesn't make the variable \c{const}:
+
+ \table
+ \header \li Keyword \li Added \li immutable \li constant-initialized
+ \row \li \c{const} \li C++98 \li yes \li not required
+ \row \li \c{constexpr} \li C++11 \li yes \li required
+ \row \li \c{constinit} \li C++20 \li no \li required
+ \endtable
+*/
+
+/*!
+ \macro Q_DECL_EXPORT
+ \relates <QtCompilerDetection>
+
+ This macro marks a symbol for shared library export (see
+ \l{sharedlibrary.html}{Creating Shared Libraries}).
+
+ \sa Q_DECL_IMPORT
+*/
+
+/*!
+ \macro Q_DECL_IMPORT
+ \relates <QtCompilerDetection>
+
+ This macro declares a symbol to be an import from a shared library (see
+ \l{sharedlibrary.html}{Creating Shared Libraries}).
+
+ \sa Q_DECL_EXPORT
+*/
+
+/*!
+ \macro Q_DECL_CONSTEXPR
+ \relates <QtCompilerDetection>
+ \deprecated [6.4] Use the \c constexpr keyword instead.
+
+ This macro can be used to declare variable that should be constructed at compile-time,
+ or an inline function that can be computed at compile-time.
+
+ \sa Q_DECL_RELAXED_CONSTEXPR
+*/
+
+/*!
+ \macro Q_DECL_RELAXED_CONSTEXPR
+ \relates <QtCompilerDetection>
+ \deprecated [6.4] Use the \c constexpr keyword instead.
+
+ This macro can be used to declare an inline function that can be computed
+ at compile-time according to the relaxed rules from C++14.
+
+ \sa Q_DECL_CONSTEXPR
+*/
+
+/*!
+ \macro Q_DECL_NOTHROW
+ \relates <QtCompilerDetection>
+ \since 5.0
+ \deprecated [6.4] Use the \c noexcept keyword instead.
+
+ This macro marks a function as never throwing, under no
+ circumstances. If the function does nevertheless throw, the
+ behavior is undefined.
+
+ \sa Q_DECL_NOEXCEPT, Q_DECL_NOEXCEPT_EXPR()
+*/
+
+/*!
+ \macro Q_DECL_NOEXCEPT
+ \relates <QtCompilerDetection>
+ \since 5.0
+ \deprecated [6.4] Use the \c noexcept keyword instead.
+
+ This macro marks a function as never throwing. If the function
+ does nevertheless throw, the behavior is defined:
+ std::terminate() is called.
+
+
+ \sa Q_DECL_NOTHROW, Q_DECL_NOEXCEPT_EXPR()
+*/
+
+/*!
+ \macro Q_DECL_NOEXCEPT_EXPR(x)
+ \relates <QtCompilerDetection>
+ \since 5.0
+ \deprecated [6.4] Use the \c noexcept keyword instead.
+
+ This macro marks a function as non-throwing if \a x is \c true. If
+ the function does nevertheless throw, the behavior is defined:
+ std::terminate() is called.
+
+
+ \sa Q_DECL_NOTHROW, Q_DECL_NOEXCEPT
+*/
+
+/*!
+ \macro Q_DECL_OVERRIDE
+ \since 5.0
+ \deprecated
+ \relates <QtCompilerDetection>
+
+ This macro can be used to declare an overriding virtual
+ function. Use of this markup will allow the compiler to generate
+ an error if the overriding virtual function does not in fact
+ override anything.
+
+ It expands to "override".
+
+ The macro goes at the end of the function, usually after the
+ \c{const}, if any:
+ \snippet code/src_corelib_global_qglobal.cpp qdecloverride
+
+ \sa Q_DECL_FINAL
+*/
+
+/*!
+ \macro Q_DECL_FINAL
+ \since 5.0
+ \deprecated
+ \relates <QtCompilerDetection>
+
+ This macro can be used to declare an overriding virtual or a class
+ as "final", with Java semantics. Further-derived classes can then
+ no longer override this virtual function, or inherit from this
+ class, respectively.
+
+ It expands to "final".
+
+ The macro goes at the end of the function, usually after the
+ \c{const}, if any:
+ \snippet code/src_corelib_global_qglobal.cpp qdeclfinal-1
+
+ For classes, it goes in front of the \c{:} in the class
+ definition, if any:
+ \snippet code/src_corelib_global_qglobal.cpp qdeclfinal-2
+
+ \sa Q_DECL_OVERRIDE
+*/
+
+/*!
+ \macro const char* Q_FUNC_INFO()
+ \relates <QtCompilerDetection>
+
+ Expands to a string that describe the function the macro resides in. How this string looks
+ more specifically is compiler dependent. With GNU GCC it is typically the function signature,
+ while with other compilers it might be the line and column number.
+
+ Q_FUNC_INFO can be conveniently used with qDebug(). For example, this function:
+
+ \snippet code/src_corelib_global_qglobal.cpp 22
+
+ when instantiated with the integer type, will with the GCC compiler produce:
+
+ \tt{const TInputType& myMin(const TInputType&, const TInputType&) [with TInputType = int] was called with value1: 3 value2: 4}
+
+ If this macro is used outside a function, the behavior is undefined.
+*/
+
+/*!
+ \macro Q_NODISCARD_CTOR
+ \relates <QtCompilerDetection>
+ \since 6.6
+
+ \brief Expands to \c{[[nodiscard]]} on compilers that accept it on constructors.
+
+ Otherwise it expands to nothing.
+
+ Constructors marked as Q_NODISCARD_CTOR cause a compiler warning if a call
+ site doesn't use the resulting object.
+
+ This macro is exists solely to prevent warnings on compilers that don't
+ implement the feature. If your supported platforms all allow \c{[[nodiscard]]}
+ on constructors, we strongly recommend you use the C++ attribute directly instead
+ of this macro.
+
+ \sa Q_NODISCARD_CTOR_X
+*/
+
+/*!
+ \macro Q_NODISCARD_X(message)
+ \macro Q_NODISCARD_CTOR_X(message)
+ \relates <QtCompilerDetection>
+ \since 6.7
+
+ \brief Expand to \c{[[nodiscard(message)]]} on compilers that support the feature.
+
+ Otherwise they expand to \c {[[nodiscard]]} and Q_NODISCARD_CTOR, respectively.
+
+ \sa Q_NODISCARD_CTOR
+*/
diff --git a/src/corelib/global/qconfig-bootstrapped.h b/src/corelib/global/qconfig-bootstrapped.h
index 090dde8312..4d80f23786 100644
--- a/src/corelib/global/qconfig-bootstrapped.h
+++ b/src/corelib/global/qconfig-bootstrapped.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2018 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2018 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
//
// W A R N I N G
@@ -59,6 +23,8 @@
#ifdef QT_BOOTSTRAPPED
+#include <stdlib.h> // for __GLIBC_PREREQ
+
#ifndef QT_NO_EXCEPTIONS
#define QT_NO_EXCEPTIONS
#endif
@@ -77,8 +43,6 @@
#define QT_FEATURE_cborstreamreader -1
#define QT_FEATURE_cborstreamwriter 1
#define QT_CRYPTOGRAPHICHASH_ONLY_SHA1
-#define QT_FEATURE_cxx11_random (__has_include(<random>) ? 1 : -1)
-#define QT_FEATURE_cxx17_bm_searcher -1
#define QT_FEATURE_cxx17_filesystem -1
#define QT_NO_DATASTREAM
#define QT_FEATURE_datestring 1
@@ -98,7 +62,7 @@
#define QT_FEATURE_jalalicalendar -1
#define QT_FEATURE_journald -1
#define QT_FEATURE_futimens -1
-#define QT_FEATURE_futimes -1
+#undef QT_FEATURE_future
#define QT_FEATURE_future -1
#define QT_FEATURE_itemmodel -1
#define QT_FEATURE_library -1
@@ -116,25 +80,19 @@
#else
# define QT_FEATURE_renameat2 -1
#endif
-#define QT_FEATURE_sharedmemory -1
#define QT_FEATURE_shortcut -1
-#define QT_FEATURE_signaling_nan -1
#define QT_FEATURE_slog2 -1
-#ifdef __GLIBC_PREREQ
-# define QT_FEATURE_statx (__GLIBC_PREREQ(2, 28) ? 1 : -1)
-#else
-# define QT_FEATURE_statx -1
-#endif
#define QT_FEATURE_syslog -1
#define QT_NO_SYSTEMLOCALE
-#define QT_FEATURE_systemsemaphore -1
-#define QT_FEATURE_temporaryfile 1
+#define QT_FEATURE_temporaryfile -1
#define QT_FEATURE_textdate 1
+#undef QT_FEATURE_thread
#define QT_FEATURE_thread -1
#define QT_FEATURE_timezone -1
#define QT_FEATURE_topleveldomain -1
#define QT_NO_TRANSLATION
#define QT_FEATURE_translation -1
+#define QT_NO_VARIANT -1
#define QT_NO_COMPRESS
@@ -145,5 +103,8 @@
#define QT_FEATURE_commandlineparser 1
#define QT_FEATURE_settings -1
+#define QT_FEATURE_permissions -1
+
+#define QT_NO_TEMPORARYFILE
#endif // QT_BOOTSTRAPPED
diff --git a/src/corelib/global/qconfig.cpp.in b/src/corelib/global/qconfig.cpp.in
index 7c79d9073d..016bdf40d1 100644
--- a/src/corelib/global/qconfig.cpp.in
+++ b/src/corelib/global/qconfig.cpp.in
@@ -16,5 +16,5 @@ static constexpr auto qt_configure_strs = QT_PREPEND_NAMESPACE(qOffsetStringArra
);
#define QT_CONFIGURE_SETTINGS_PATH "@QT_SYS_CONF_DIR@"
-#define QT_CONFIGURE_LIBLOCATION_TO_PREFIX_PATH "@QT_CONFIGURE_LIBLOCATION_TO_PREFIX_PATH@"
+#define QT_CONFIGURE_LIBLOCATION_TO_PREFIX_PATH "@QT_CONFIGURE_LIBLOCATION_TO_PREFIX_PATH@"_L1
#define QT_CONFIGURE_PREFIX_PATH qt_configure_prefix_path_str + 12
diff --git a/src/corelib/global/qconstructormacros.h b/src/corelib/global/qconstructormacros.h
new file mode 100644
index 0000000000..21492ac31f
--- /dev/null
+++ b/src/corelib/global/qconstructormacros.h
@@ -0,0 +1,38 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QCONSTRUCTORMACROS_H
+#define QCONSTRUCTORMACROS_H
+
+#if 0
+#pragma qt_class(QtConstructorMacros)
+#pragma qt_sync_stop_processing
+#endif
+
+#if defined(__cplusplus)
+
+#ifndef Q_CONSTRUCTOR_FUNCTION
+# define Q_CONSTRUCTOR_FUNCTION0(AFUNC) \
+ namespace { \
+ static const struct AFUNC ## _ctor_class_ { \
+ inline AFUNC ## _ctor_class_() { AFUNC(); } \
+ } AFUNC ## _ctor_instance_; \
+ }
+
+# define Q_CONSTRUCTOR_FUNCTION(AFUNC) Q_CONSTRUCTOR_FUNCTION0(AFUNC)
+#endif
+
+#ifndef Q_DESTRUCTOR_FUNCTION
+# define Q_DESTRUCTOR_FUNCTION0(AFUNC) \
+ namespace { \
+ static const struct AFUNC ## _dtor_class_ { \
+ inline AFUNC ## _dtor_class_() { } \
+ inline ~ AFUNC ## _dtor_class_() { AFUNC(); } \
+ } AFUNC ## _dtor_instance_; \
+ }
+# define Q_DESTRUCTOR_FUNCTION(AFUNC) Q_DESTRUCTOR_FUNCTION0(AFUNC)
+#endif
+
+#endif // __cplusplus
+
+#endif // QCONSTRUCTORMACROS_H
diff --git a/src/corelib/global/qcontainerinfo.h b/src/corelib/global/qcontainerinfo.h
index 21683440f8..14468510a5 100644
--- a/src/corelib/global/qcontainerinfo.h
+++ b/src/corelib/global/qcontainerinfo.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QCONTAINERINFO_H
#define QCONTAINERINFO_H
@@ -87,6 +51,11 @@ template<typename C>
inline constexpr bool has_size_v<C, std::void_t<decltype(C().size())>> = true;
template<typename C, typename = void>
+inline constexpr bool has_reserve_v = false;
+template<typename C>
+inline constexpr bool has_reserve_v<C, std::void_t<decltype(C().reserve(0))>> = true;
+
+template<typename C, typename = void>
inline constexpr bool has_clear_v = false;
template<typename C>
inline constexpr bool has_clear_v<C, std::void_t<decltype(C().clear())>> = true;
diff --git a/src/corelib/global/qdarwinhelpers.h b/src/corelib/global/qdarwinhelpers.h
new file mode 100644
index 0000000000..ad72211663
--- /dev/null
+++ b/src/corelib/global/qdarwinhelpers.h
@@ -0,0 +1,37 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QTDARWINHELPERS_H
+#define QTDARWINHELPERS_H
+
+#if 0
+#pragma qt_class(QtDarwinHelpers)
+#pragma qt_sync_stop_processing
+#endif
+
+/*
+ Utility macros and inline functions
+*/
+
+#ifndef Q_FORWARD_DECLARE_OBJC_CLASS
+# ifdef __OBJC__
+# define Q_FORWARD_DECLARE_OBJC_CLASS(classname) @class classname
+# else
+# define Q_FORWARD_DECLARE_OBJC_CLASS(classname) class classname
+# endif
+#endif
+#ifndef Q_FORWARD_DECLARE_CF_TYPE
+# define Q_FORWARD_DECLARE_CF_TYPE(type) typedef const struct __ ## type * type ## Ref
+#endif
+#ifndef Q_FORWARD_DECLARE_MUTABLE_CF_TYPE
+# define Q_FORWARD_DECLARE_MUTABLE_CF_TYPE(type) typedef struct __ ## type * type ## Ref
+#endif
+#ifndef Q_FORWARD_DECLARE_CG_TYPE
+# define Q_FORWARD_DECLARE_CG_TYPE(type) typedef const struct type *type##Ref
+#endif
+#ifndef Q_FORWARD_DECLARE_MUTABLE_CG_TYPE
+# define Q_FORWARD_DECLARE_MUTABLE_CG_TYPE(type) typedef struct type *type##Ref
+#endif
+
+
+#endif // QTDARWINHELPERS_H
diff --git a/src/corelib/global/qdarwinhelpers.qdoc b/src/corelib/global/qdarwinhelpers.qdoc
new file mode 100644
index 0000000000..a827526634
--- /dev/null
+++ b/src/corelib/global/qdarwinhelpers.qdoc
@@ -0,0 +1,34 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
+
+/*!
+ \macro Q_FORWARD_DECLARE_OBJC_CLASS(classname)
+ \since 5.2
+ \relates <QtDarwinHelpers>
+
+ Forward-declares an Objective-C \a classname in a manner such that it can be
+ compiled as either Objective-C or C++.
+
+ This is primarily intended for use in header files that may be included by
+ both Objective-C and C++ source files.
+*/
+
+/*!
+ \macro Q_FORWARD_DECLARE_CF_TYPE(type)
+ \since 5.2
+ \relates <QtDarwinHelpers>
+
+ Forward-declares a Core Foundation \a type. This includes the actual
+ type and the ref type. For example, Q_FORWARD_DECLARE_CF_TYPE(CFString)
+ declares __CFString and CFStringRef.
+*/
+
+/*!
+ \macro Q_FORWARD_DECLARE_MUTABLE_CF_TYPE(type)
+ \since 5.2
+ \relates <QtDarwinHelpers>
+
+ Forward-declares a mutable Core Foundation \a type. This includes the actual
+ type and the ref type. For example, Q_FORWARD_DECLARE_MUTABLE_CF_TYPE(CFMutableString)
+ declares __CFMutableString and CFMutableStringRef.
+*/
diff --git a/src/corelib/global/qendian.cpp b/src/corelib/global/qendian.cpp
index cc9158e34d..5e46109dd1 100644
--- a/src/corelib/global/qendian.cpp
+++ b/src/corelib/global/qendian.cpp
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2018 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2018 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qendian.h"
@@ -47,6 +11,7 @@ QT_BEGIN_NAMESPACE
/*!
\headerfile <QtEndian>
+ \inmodule QtCore
\title Endian Conversion Functions
\ingroup funclists
\brief The <QtEndian> header provides functions to convert between
@@ -434,28 +399,28 @@ QT_BEGIN_NAMESPACE
/*!
\fn template <typename T> QLEInteger &QLEInteger<T>::operator++()
- Performs a prefix ++ (increment) on this QLEInteger and returns a reference to
+ Performs a prefix \c{++} (increment) on this QLEInteger and returns a reference to
this object.
*/
/*!
\fn template <typename T> QLEInteger QLEInteger<T>::operator++(int)
- Performs a postfix ++ (increment) on this QLEInteger and returns a reference to
+ Performs a postfix \c{++} (increment) on this QLEInteger and returns a reference to
this object.
*/
/*!
\fn template <typename T> QLEInteger &QLEInteger<T>::operator--()
- Performs a prefix -- (decrement) on this QLEInteger and returns a reference to
+ Performs a prefix \c{--} (decrement) on this QLEInteger and returns a reference to
this object.
*/
/*!
\fn template <typename T> QLEInteger QLEInteger<T>::operator--(int)
- Performs a postfix -- (decrement) on this QLEInteger and returns a reference to
+ Performs a postfix \c{--} (decrement) on this QLEInteger and returns a reference to
this object.
*/
@@ -480,8 +445,8 @@ QT_BEGIN_NAMESPACE
The template parameter \c T must be a C++ integer type:
\list
\li 8-bit: char, signed char, unsigned char, qint8, quint8
- \li 16-bit: short, unsigned short, qint16, quint16, char16_t (C++11)
- \li 32-bit: int, unsigned int, qint32, quint32, char32_t (C++11)
+ \li 16-bit: short, unsigned short, qint16, quint16, char16_t
+ \li 32-bit: int, unsigned int, qint32, quint32, char32_t
\li 64-bit: long long, unsigned long long, qint64, quint64
\li platform-specific size: long, unsigned long
\li pointer size: qintptr, quintptr, qptrdiff
@@ -593,28 +558,28 @@ QT_BEGIN_NAMESPACE
/*!
\fn template <typename T> QBEInteger &QBEInteger<T>::operator++()
- Performs a prefix ++ (increment) on this QBEInteger and returns a reference to
+ Performs a prefix \c{++} (increment) on this QBEInteger and returns a reference to
this object.
*/
/*!
\fn template <typename T> QBEInteger QBEInteger<T>::operator++(int)
- Performs a postfix ++ (increment) on this QBEInteger and returns a reference to
+ Performs a postfix \c{++} (increment) on this QBEInteger and returns a reference to
this object.
*/
/*!
\fn template <typename T> QBEInteger &QBEInteger<T>::operator--()
- Performs a prefix -- (decrement) on this QBEInteger and returns a reference to
+ Performs a prefix \c{--} (decrement) on this QBEInteger and returns a reference to
this object.
*/
/*!
\fn template <typename T> QBEInteger QBEInteger<T>::operator--(int)
- Performs a postfix -- (decrement) on this QBEInteger and returns a reference to
+ Performs a postfix \c{--} (decrement) on this QBEInteger and returns a reference to
this object.
*/
diff --git a/src/corelib/global/qendian.h b/src/corelib/global/qendian.h
index 759b3b09ec..8c3b5e4374 100644
--- a/src/corelib/global/qendian.h
+++ b/src/corelib/global/qendian.h
@@ -1,46 +1,14 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Copyright (C) 2021 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// Copyright (C) 2021 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QENDIAN_H
#define QENDIAN_H
+#if 0
+#pragma qt_class(QtEndian)
+#endif
+
#include <QtCore/qfloat16.h>
#include <QtCore/qglobal.h>
@@ -137,6 +105,23 @@ inline constexpr T qbswap(T source)
return T(qbswap_helper(typename QIntegerForSizeof<T>::Unsigned(source)));
}
+#ifdef QT_SUPPORTS_INT128
+// extra definitions for q(u)int128, in case std::is_integral_v<~~> == false
+inline constexpr quint128 qbswap(quint128 source)
+{
+ quint128 result = {};
+ result = qbswap_helper(quint64(source));
+ result <<= 64;
+ result |= qbswap_helper(quint64(source >> 64));
+ return result;
+}
+
+inline constexpr qint128 qbswap(qint128 source)
+{
+ return qint128(qbswap(quint128(source)));
+}
+#endif
+
// floating specializations
template<typename Float>
Float qbswapFloatHelper(Float source)
@@ -313,9 +298,9 @@ public:
}
static constexpr QSpecialInteger max()
- { return QSpecialInteger(std::numeric_limits<T>::max()); }
+ { return QSpecialInteger((std::numeric_limits<T>::max)()); }
static constexpr QSpecialInteger min()
- { return QSpecialInteger(std::numeric_limits<T>::min()); }
+ { return QSpecialInteger((std::numeric_limits<T>::min)()); }
};
template<typename T>
@@ -334,7 +319,7 @@ public:
static constexpr T fromSpecial(T source) { return qFromBigEndian(source); }
};
-#ifdef Q_CLANG_QDOC
+#ifdef Q_QDOC
template<typename T>
class QLEInteger {
public:
@@ -355,8 +340,8 @@ public:
QLEInteger &operator ^=(T i);
QLEInteger &operator ++();
QLEInteger &operator --();
- QLEInteger &operator ++(int);
- QLEInteger &operator --(int);
+ QLEInteger operator ++(int);
+ QLEInteger operator --(int);
static constexpr QLEInteger max();
static constexpr QLEInteger min();
@@ -382,8 +367,8 @@ public:
QBEInteger &operator ^=(T i);
QBEInteger &operator ++();
QBEInteger &operator --();
- QBEInteger &operator ++(int);
- QBEInteger &operator --(int);
+ QBEInteger operator ++(int);
+ QBEInteger operator --(int);
static constexpr QBEInteger max();
static constexpr QBEInteger min();
diff --git a/src/corelib/global/qendian_p.h b/src/corelib/global/qendian_p.h
index bc6194fb06..8d96eba60c 100644
--- a/src/corelib/global/qendian_p.h
+++ b/src/corelib/global/qendian_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2017 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QENDIAN_P_H
#define QENDIAN_P_H
@@ -52,83 +16,195 @@
//
#include <QtCore/qendian.h>
+#include <QtCore/private/qglobal_p.h>
QT_BEGIN_NAMESPACE
-// Note if using multiple of these bitfields in a union; the underlying storage type must
-// match. Since we always use an unsigned storage type, unsigned and signed versions may
-// be used together, but different bit-widths may not.
-template<class S, int pos, int width>
-class QSpecialIntegerBitfield
+enum class QSpecialIntegerBitfieldInitializer {};
+constexpr QSpecialIntegerBitfieldInitializer QSpecialIntegerBitfieldZero{};
+
+template<class S>
+class QSpecialIntegerStorage
{
-protected:
- typedef typename S::StorageType T;
- typedef typename std::make_unsigned<T>::type UT;
+public:
+ using UnsignedStorageType = std::make_unsigned_t<typename S::StorageType>;
- static constexpr UT mask()
+ constexpr QSpecialIntegerStorage() = default;
+ constexpr QSpecialIntegerStorage(QSpecialIntegerBitfieldInitializer) : val(0) {}
+ constexpr QSpecialIntegerStorage(UnsignedStorageType initial) : val(initial) {}
+
+ UnsignedStorageType val;
+};
+
+template<class S, int pos, int width, class T = typename S::StorageType>
+class QSpecialIntegerAccessor;
+
+template<class S, int pos, int width, class T = typename S::StorageType>
+class QSpecialIntegerConstAccessor
+{
+ Q_DISABLE_COPY_MOVE(QSpecialIntegerConstAccessor)
+public:
+ using Storage = const QSpecialIntegerStorage<S>;
+ using Type = T;
+ using UnsignedType = std::make_unsigned_t<T>;
+
+ operator Type() const noexcept
{
- return ((UT(1) << width) - 1) << pos;
+ if constexpr (std::is_signed_v<Type>) {
+ UnsignedType i = S::fromSpecial(storage->val);
+ i <<= (sizeof(Type) * 8) - width - pos;
+ Type t = Type(i);
+ t >>= (sizeof(Type) * 8) - width;
+ return t;
+ }
+ return (S::fromSpecial(storage->val) & mask()) >> pos;
}
+
+ bool operator!() const noexcept { return !(storage->val & S::toSpecial(mask())); }
+
+ static constexpr UnsignedType mask() noexcept
+ {
+ if constexpr (width == sizeof(UnsignedType) * 8) {
+ static_assert(pos == 0);
+ return ~UnsignedType(0);
+ } else {
+ return ((UnsignedType(1) << width) - 1) << pos;
+ }
+ }
+
+private:
+ template<class Storage, typename... Accessors>
+ friend class QSpecialIntegerBitfieldUnion;
+ friend class QSpecialIntegerAccessor<S, pos, width, T>;
+
+ explicit QSpecialIntegerConstAccessor(Storage *storage) : storage(storage) {}
+
+ friend bool operator==(const QSpecialIntegerConstAccessor<S, pos, width, T> &i,
+ const QSpecialIntegerConstAccessor<S, pos, width, T> &j) noexcept
+ {
+ return ((i.storage->val ^ j.storage->val) & S::toSpecial(mask())) == 0;
+ }
+
+ friend bool operator!=(const QSpecialIntegerConstAccessor<S, pos, width, T> &i,
+ const QSpecialIntegerConstAccessor<S, pos, width, T> &j) noexcept
+ {
+ return ((i.storage->val ^ j.storage->val) & S::toSpecial(mask())) != 0;
+ }
+
+ Storage *storage;
+};
+
+template<class S, int pos, int width, class T>
+class QSpecialIntegerAccessor
+{
+ Q_DISABLE_COPY_MOVE(QSpecialIntegerAccessor)
public:
- // FIXME: val is public until qtdeclarative is fixed to not access it directly.
- UT val;
+ using Const = QSpecialIntegerConstAccessor<S, pos, width, T>;
+ using Storage = QSpecialIntegerStorage<S>;
+ using Type = T;
+ using UnsignedType = std::make_unsigned_t<T>;
- QSpecialIntegerBitfield &operator=(T t)
+ QSpecialIntegerAccessor &operator=(Type t)
{
- UT i = S::fromSpecial(val);
- i &= ~mask();
- i |= (UT(t) << pos) & mask();
- val = S::toSpecial(i);
+ UnsignedType i = S::fromSpecial(storage->val);
+ i &= ~Const::mask();
+ i |= (UnsignedType(t) << pos) & Const::mask();
+ storage->val = S::toSpecial(i);
return *this;
}
- operator T() const
+
+ operator Const() { return Const(storage); }
+
+private:
+ template<class Storage, typename... Accessors>
+ friend class QSpecialIntegerBitfieldUnion;
+
+ explicit QSpecialIntegerAccessor(Storage *storage) : storage(storage) {}
+
+ Storage *storage;
+};
+
+template<class S, typename... Accessors>
+class QSpecialIntegerBitfieldUnion
+{
+public:
+ constexpr QSpecialIntegerBitfieldUnion() = default;
+ constexpr QSpecialIntegerBitfieldUnion(QSpecialIntegerBitfieldInitializer initial)
+ : storage(initial)
+ {}
+
+ constexpr QSpecialIntegerBitfieldUnion(
+ typename QSpecialIntegerStorage<S>::UnsignedStorageType initial)
+ : storage(initial)
+ {}
+
+ template<typename A>
+ void set(typename A::Type value)
+ {
+ member<A>() = value;
+ }
+
+ template<typename A>
+ typename A::Type get() const
{
- if (std::is_signed<T>::value) {
- UT i = S::fromSpecial(val);
- i <<= (sizeof(T) * 8) - width - pos;
- T t = T(i);
- t >>= (sizeof(T) * 8) - width;
- return t;
- }
- return (S::fromSpecial(val) & mask()) >> pos;
+ return member<A>();
}
- bool operator!() const { return !(val & S::toSpecial(mask())); }
- bool operator==(QSpecialIntegerBitfield<S, pos, width> i) const
+ typename QSpecialIntegerStorage<S>::UnsignedStorageType data() const
{
- return ((val ^ i.val) & S::toSpecial(mask())) == 0;
+ return storage.val;
}
- bool operator!=(QSpecialIntegerBitfield<S, pos, width> i) const
+
+private:
+ template<typename A>
+ static constexpr bool isAccessor = std::disjunction_v<std::is_same<A, Accessors>...>;
+
+ template<typename A>
+ A member()
+ {
+ static_assert(isAccessor<A>);
+ return A(&storage);
+ }
+
+ template<typename A>
+ typename A::Const member() const
{
- return ((val ^ i.val) & S::toSpecial(mask())) != 0;
+ static_assert(isAccessor<A>);
+ return typename A::Const(&storage);
}
- QSpecialIntegerBitfield &operator+=(T i) { return (*this = (T(*this) + i)); }
- QSpecialIntegerBitfield &operator-=(T i) { return (*this = (T(*this) - i)); }
- QSpecialIntegerBitfield &operator*=(T i) { return (*this = (T(*this) * i)); }
- QSpecialIntegerBitfield &operator/=(T i) { return (*this = (T(*this) / i)); }
- QSpecialIntegerBitfield &operator%=(T i) { return (*this = (T(*this) % i)); }
- QSpecialIntegerBitfield &operator|=(T i) { return (*this = (T(*this) | i)); }
- QSpecialIntegerBitfield &operator&=(T i) { return (*this = (T(*this) & i)); }
- QSpecialIntegerBitfield &operator^=(T i) { return (*this = (T(*this) ^ i)); }
- QSpecialIntegerBitfield &operator>>=(T i) { return (*this = (T(*this) >> i)); }
- QSpecialIntegerBitfield &operator<<=(T i) { return (*this = (T(*this) << i)); }
+ QSpecialIntegerStorage<S> storage;
};
-template<typename T, int pos, int width>
-using QLEIntegerBitfield = QSpecialIntegerBitfield<QLittleEndianStorageType<T>, pos, width>;
+template<typename T, typename... Accessors>
+using QLEIntegerBitfieldUnion
+ = QSpecialIntegerBitfieldUnion<QLittleEndianStorageType<T>, Accessors...>;
+
+template<typename T, typename... Accessors>
+using QBEIntegerBitfieldUnion
+ = QSpecialIntegerBitfieldUnion<QBigEndianStorageType<T>, Accessors...>;
-template<typename T, int pos, int width>
-using QBEIntegerBitfield = QSpecialIntegerBitfield<QBigEndianStorageType<T>, pos, width>;
+template<typename... Accessors>
+using qint32_le_bitfield_union = QLEIntegerBitfieldUnion<int, Accessors...>;
+template<typename... Accessors>
+using quint32_le_bitfield_union = QLEIntegerBitfieldUnion<uint, Accessors...>;
+template<typename... Accessors>
+using qint32_be_bitfield_union = QBEIntegerBitfieldUnion<int, Accessors...>;
+template<typename... Accessors>
+using quint32_be_bitfield_union = QBEIntegerBitfieldUnion<uint, Accessors...>;
-template<int pos, int width>
-using qint32_le_bitfield = QLEIntegerBitfield<int, pos, width>;
-template<int pos, int width>
-using quint32_le_bitfield = QLEIntegerBitfield<uint, pos, width>;
-template<int pos, int width>
-using qint32_be_bitfield = QBEIntegerBitfield<int, pos, width>;
-template<int pos, int width>
-using quint32_be_bitfield = QBEIntegerBitfield<uint, pos, width>;
+template<int pos, int width, typename T = int>
+using qint32_le_bitfield_member
+ = QSpecialIntegerAccessor<QLittleEndianStorageType<int>, pos, width, T>;
+template<int pos, int width, typename T = uint>
+using quint32_le_bitfield_member
+ = QSpecialIntegerAccessor<QLittleEndianStorageType<uint>, pos, width, T>;
+template<int pos, int width, typename T = int>
+using qint32_be_bitfield_member
+ = QSpecialIntegerAccessor<QBigEndianStorageType<int>, pos, width, T>;
+template<int pos, int width, typename T = uint>
+using quint32_be_bitfield_member
+ = QSpecialIntegerAccessor<QBigEndianStorageType<uint>, pos, width, T>;
QT_END_NAMESPACE
diff --git a/src/corelib/global/qexceptionhandling.cpp b/src/corelib/global/qexceptionhandling.cpp
new file mode 100644
index 0000000000..f74eb49546
--- /dev/null
+++ b/src/corelib/global/qexceptionhandling.cpp
@@ -0,0 +1,20 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#include "qexceptionhandling.h"
+
+#include <exception>
+
+QT_BEGIN_NAMESPACE
+
+/*
+ \internal
+ Allows you to call std::terminate() without including <exception>.
+ Called internally from QT_TERMINATE_ON_EXCEPTION
+*/
+Q_NORETURN void qTerminate() noexcept
+{
+ std::terminate();
+}
+
+QT_END_NAMESPACE
diff --git a/src/corelib/global/qexceptionhandling.h b/src/corelib/global/qexceptionhandling.h
new file mode 100644
index 0000000000..76c6185c3e
--- /dev/null
+++ b/src/corelib/global/qexceptionhandling.h
@@ -0,0 +1,46 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QEXCEPTIONHANDLING_H
+#define QEXCEPTIONHANDLING_H
+
+#include <QtCore/qtconfigmacros.h>
+#include <QtCore/qcompilerdetection.h>
+#include <QtCore/qtcoreexports.h>
+
+#if 0
+#pragma qt_class(QtExceptionHandling)
+#pragma qt_sync_stop_processing
+#endif
+
+QT_BEGIN_NAMESPACE
+
+/* These wrap try/catch so we can switch off exceptions later.
+
+ Beware - do not use more than one QT_CATCH per QT_TRY, and do not use
+ the exception instance in the catch block.
+ If you can't live with those constraints, don't use these macros.
+ Use the QT_NO_EXCEPTIONS macro to protect your code instead.
+*/
+Q_NORETURN Q_DECL_COLD_FUNCTION Q_CORE_EXPORT void qTerminate() noexcept;
+#ifdef QT_NO_EXCEPTIONS
+# define QT_TRY if (true)
+# define QT_CATCH(A) else
+# define QT_THROW(A) qt_noop()
+# define QT_RETHROW qt_noop()
+# define QT_TERMINATE_ON_EXCEPTION(expr) do { expr; } while (false)
+#else
+# define QT_TRY try
+# define QT_CATCH(A) catch (A)
+# define QT_THROW(A) throw A
+# define QT_RETHROW throw
+# ifdef Q_COMPILER_NOEXCEPT
+# define QT_TERMINATE_ON_EXCEPTION(expr) do { expr; } while (false)
+# else
+# define QT_TERMINATE_ON_EXCEPTION(expr) do { try { expr; } catch (...) { qTerminate(); } } while (false)
+# endif
+#endif
+
+QT_END_NAMESPACE
+
+#endif // QEXCEPTIONHANDLING_H
diff --git a/src/corelib/global/qflags.h b/src/corelib/global/qflags.h
index 7f96d900fb..cc028e0095 100644
--- a/src/corelib/global/qflags.h
+++ b/src/corelib/global/qflags.h
@@ -1,48 +1,12 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include <QtCore/qglobal.h>
-#include <QtCore/qcompare_impl.h>
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QFLAGS_H
#define QFLAGS_H
+#include <QtCore/qcompare_impl.h>
+#include <QtCore/qtypeinfo.h>
+
#include <initializer_list>
QT_BEGIN_NAMESPACE
@@ -60,7 +24,7 @@ public:
// Microsoft Visual Studio has buggy behavior when it comes to
// unsigned enums: even if the enum is unsigned, the enum tags are
// always signed
-# if !defined(__LP64__) && !defined(Q_CLANG_QDOC)
+# if !defined(__LP64__) && !defined(Q_QDOC)
constexpr inline Q_IMPLICIT QFlag(long value) noexcept : i(int(value)) {}
constexpr inline Q_IMPLICIT QFlag(ulong value) noexcept : i(int(long(value))) {}
# endif
@@ -93,7 +57,7 @@ class QFlags
static_assert((std::is_enum<Enum>::value), "QFlags is only usable on enumeration types.");
public:
-#if defined(Q_CC_MSVC) || defined(Q_CLANG_QDOC)
+#if defined(Q_CC_MSVC) || defined(Q_QDOC)
// see above for MSVC
// the definition below is too complex for qdoc
typedef int Int;
@@ -215,24 +179,37 @@ typedef QFlags<Enum> Flags;
// These are opt-in, for backwards compatibility
#define QT_DECLARE_TYPESAFE_OPERATORS_FOR_FLAGS_ENUM(Flags) \
+[[maybe_unused]] \
constexpr inline Flags operator~(Flags::enum_type e) noexcept \
{ return ~Flags(e); } \
+[[maybe_unused]] \
constexpr inline void operator|(Flags::enum_type f1, int f2) noexcept = delete;
#else
#define QT_DECLARE_TYPESAFE_OPERATORS_FOR_FLAGS_ENUM(Flags) \
+[[maybe_unused]] \
constexpr inline QIncompatibleFlag operator|(Flags::enum_type f1, int f2) noexcept \
{ return QIncompatibleFlag(int(f1) | f2); }
#endif
#define Q_DECLARE_OPERATORS_FOR_FLAGS(Flags) \
+[[maybe_unused]] \
constexpr inline QFlags<Flags::enum_type> operator|(Flags::enum_type f1, Flags::enum_type f2) noexcept \
{ return QFlags<Flags::enum_type>(f1) | f2; } \
+[[maybe_unused]] \
constexpr inline QFlags<Flags::enum_type> operator|(Flags::enum_type f1, QFlags<Flags::enum_type> f2) noexcept \
{ return f2 | f1; } \
+[[maybe_unused]] \
constexpr inline QFlags<Flags::enum_type> operator&(Flags::enum_type f1, Flags::enum_type f2) noexcept \
{ return QFlags<Flags::enum_type>(f1) & f2; } \
+[[maybe_unused]] \
constexpr inline QFlags<Flags::enum_type> operator&(Flags::enum_type f1, QFlags<Flags::enum_type> f2) noexcept \
{ return f2 & f1; } \
+[[maybe_unused]] \
+constexpr inline QFlags<Flags::enum_type> operator^(Flags::enum_type f1, Flags::enum_type f2) noexcept \
+{ return QFlags<Flags::enum_type>(f1) ^ f2; } \
+[[maybe_unused]] \
+constexpr inline QFlags<Flags::enum_type> operator^(Flags::enum_type f1, QFlags<Flags::enum_type> f2) noexcept \
+{ return f2 ^ f1; } \
constexpr inline void operator+(Flags::enum_type f1, Flags::enum_type f2) noexcept = delete; \
constexpr inline void operator+(Flags::enum_type f1, QFlags<Flags::enum_type> f2) noexcept = delete; \
constexpr inline void operator+(int f1, QFlags<Flags::enum_type> f2) noexcept = delete; \
@@ -245,6 +222,34 @@ constexpr inline void operator-(int f1, Flags::enum_type f2) noexcept = delete;
constexpr inline void operator-(Flags::enum_type f1, int f2) noexcept = delete; \
QT_DECLARE_TYPESAFE_OPERATORS_FOR_FLAGS_ENUM(Flags)
+// restore bit-wise enum-enum operators deprecated in C++20,
+// but used in a few places in the API
+#if __cplusplus > 201702L // assume compilers don't warn if in C++17 mode
+ // in C++20 mode, provide user-defined operators to override the deprecated operations:
+# define Q_DECLARE_MIXED_ENUM_OPERATOR(op, Ret, LHS, RHS) \
+ [[maybe_unused]] \
+ constexpr inline Ret operator op (LHS lhs, RHS rhs) noexcept \
+ { return static_cast<Ret>(qToUnderlying(lhs) op qToUnderlying(rhs)); } \
+ /* end */
+#else
+ // in C++17 mode, statically-assert that this compiler's result of the
+ // operation is the same that the C++20 version would produce:
+# define Q_DECLARE_MIXED_ENUM_OPERATOR(op, Ret, LHS, RHS) \
+ static_assert(std::is_same_v<decltype(std::declval<LHS>() op std::declval<RHS>()), Ret>);
+#endif
+
+#define Q_DECLARE_MIXED_ENUM_OPERATORS(Ret, Flags, Enum) \
+ Q_DECLARE_MIXED_ENUM_OPERATOR(|, Ret, Flags, Enum) \
+ Q_DECLARE_MIXED_ENUM_OPERATOR(&, Ret, Flags, Enum) \
+ Q_DECLARE_MIXED_ENUM_OPERATOR(^, Ret, Flags, Enum) \
+ /* end */
+
+#define Q_DECLARE_MIXED_ENUM_OPERATORS_SYMMETRIC(Ret, Flags, Enum) \
+ Q_DECLARE_MIXED_ENUM_OPERATORS(Ret, Flags, Enum) \
+ Q_DECLARE_MIXED_ENUM_OPERATORS(Ret, Enum, Flags) \
+ /* end */
+
+
QT_END_NAMESPACE
#endif // QFLAGS_H
diff --git a/src/corelib/global/qflags.qdoc b/src/corelib/global/qflags.qdoc
new file mode 100644
index 0000000000..dd3b1e4c9b
--- /dev/null
+++ b/src/corelib/global/qflags.qdoc
@@ -0,0 +1,459 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
+
+/*!
+ \class QFlag
+ \inmodule QtCore
+ \brief The QFlag class is a helper data type for QFlags.
+
+ It is equivalent to a plain \c int, except with respect to
+ function overloading and type conversions. You should never need
+ to use this class in your applications.
+
+ \sa QFlags
+*/
+
+/*!
+ \fn QFlag::QFlag(int value)
+
+ Constructs a QFlag object that stores the \a value.
+*/
+
+/*!
+ \fn QFlag::QFlag(uint value)
+ \since 5.3
+
+ Constructs a QFlag object that stores the \a value.
+*/
+
+/*!
+ \fn QFlag::QFlag(short value)
+ \since 5.3
+
+ Constructs a QFlag object that stores the \a value.
+*/
+
+/*!
+ \fn QFlag::QFlag(ushort value)
+ \since 5.3
+
+ Constructs a QFlag object that stores the \a value.
+*/
+
+/*!
+ \fn QFlag::operator int() const
+
+ Returns the value stored by the QFlag object.
+*/
+
+/*!
+ \fn QFlag::operator uint() const
+ \since 5.3
+
+ Returns the value stored by the QFlag object.
+*/
+
+/*!
+ \class QFlags
+ \inmodule QtCore
+ \brief The QFlags class provides a type-safe way of storing
+ OR-combinations of enum values.
+
+
+ \ingroup tools
+
+ The QFlags<Enum> class is a template class, where Enum is an enum
+ type. QFlags is used throughout Qt for storing combinations of
+ enum values.
+
+ The traditional C++ approach for storing OR-combinations of enum
+ values is to use an \c int or \c uint variable. The inconvenience
+ with this approach is that there's no type checking at all; any
+ enum value can be OR'd with any other enum value and passed on to
+ a function that takes an \c int or \c uint.
+
+ Qt uses QFlags to provide type safety. For example, the
+ Qt::Alignment type is simply a typedef for
+ QFlags<Qt::AlignmentFlag>. QLabel::setAlignment() takes a
+ Qt::Alignment parameter, which means that any combination of
+ Qt::AlignmentFlag values, or \c{{ }}, is legal:
+
+ \snippet code/src_corelib_global_qglobal.cpp 0
+
+ If you try to pass a value from another enum or just a plain
+ integer other than 0, the compiler will report an error. If you
+ need to cast integer values to flags in a untyped fashion, you can
+ use the explicit QFlags constructor as cast operator.
+
+ If you want to use QFlags for your own enum types, use
+ the Q_DECLARE_FLAGS() and Q_DECLARE_OPERATORS_FOR_FLAGS().
+
+ Example:
+
+ \snippet code/src_corelib_global_qglobal.cpp 1
+
+ You can then use the \c MyClass::Options type to store
+ combinations of \c MyClass::Option values.
+
+ \section1 Flags and the Meta-Object System
+
+ The Q_DECLARE_FLAGS() macro does not expose the flags to the meta-object
+ system, so they cannot be used by Qt Script or edited in \QD.
+ To make the flags available for these purposes, the Q_FLAG() macro must
+ be used:
+
+ \snippet code/src_corelib_global_qglobal.cpp meta-object flags
+
+ \section1 Naming Convention
+
+ A sensible naming convention for enum types and associated QFlags
+ types is to give a singular name to the enum type (e.g., \c
+ Option) and a plural name to the QFlags type (e.g., \c Options).
+ When a singular name is desired for the QFlags type (e.g., \c
+ Alignment), you can use \c Flag as the suffix for the enum type
+ (e.g., \c AlignmentFlag).
+
+ \sa QFlag
+*/
+
+/*!
+ \typedef QFlags::Int
+ \since 5.0
+
+ Typedef for the integer type used for storage as well as for
+ implicit conversion. Either \c int or \c{unsigned int}, depending
+ on whether the enum's underlying type is signed or unsigned.
+*/
+
+/*!
+ \typedef QFlags::enum_type
+
+ Typedef for the Enum template type.
+*/
+
+/*!
+ \fn template<typename Enum> QFlags<Enum>::QFlags(const QFlags &other)
+
+ Constructs a copy of \a other.
+*/
+
+/*!
+ \fn template <typename Enum> QFlags<Enum>::QFlags(Enum flags)
+
+ Constructs a QFlags object storing the \a flags.
+*/
+
+/*!
+ \fn template <typename Enum> QFlags<Enum>::QFlags()
+ \since 5.15
+
+ Constructs a QFlags object with no flags set.
+*/
+
+/*!
+ \fn template <typename Enum> QFlags<Enum>::QFlags(QFlag flag)
+
+ Constructs a QFlags object initialized with the integer \a flag.
+
+ The QFlag type is a helper type. By using it here instead of \c
+ int, we effectively ensure that arbitrary enum values cannot be
+ cast to a QFlags, whereas untyped enum values (i.e., \c int
+ values) can.
+*/
+
+/*!
+ \fn template <typename Enum> QFlags<Enum>::QFlags(std::initializer_list<Enum> flags)
+ \since 5.4
+
+ Constructs a QFlags object initialized with all \a flags
+ combined using the bitwise OR operator.
+
+ \sa operator|=(), operator|()
+*/
+
+/*!
+ \fn template <typename Enum> QFlags &QFlags<Enum>::operator=(const QFlags &other)
+
+ Assigns \a other to this object and returns a reference to this
+ object.
+*/
+
+/*!
+ \fn template <typename Enum> QFlags &QFlags<Enum>::operator&=(int mask)
+
+ Performs a bitwise AND operation with \a mask and stores the
+ result in this QFlags object. Returns a reference to this object.
+
+ \sa operator&(), operator|=(), operator^=()
+*/
+
+/*!
+ \fn template <typename Enum> QFlags &QFlags<Enum>::operator&=(uint mask)
+
+ \overload
+*/
+
+/*!
+ \fn template <typename Enum> QFlags &QFlags<Enum>::operator&=(Enum mask)
+
+ \overload
+*/
+
+/*!
+ \fn template <typename Enum> QFlags &QFlags<Enum>::operator&=(QFlags mask)
+ \since 6.2
+
+ \overload
+*/
+
+/*!
+ \fn template <typename Enum> QFlags &QFlags<Enum>::operator|=(QFlags other)
+
+ Performs a bitwise OR operation with \a other and stores the
+ result in this QFlags object. Returns a reference to this object.
+
+ \sa operator|(), operator&=(), operator^=()
+*/
+
+/*!
+ \fn template <typename Enum> QFlags &QFlags<Enum>::operator|=(Enum other)
+
+ \overload
+*/
+
+/*!
+ \fn template <typename Enum> QFlags &QFlags<Enum>::operator^=(QFlags other)
+
+ Performs a bitwise XOR operation with \a other and stores the
+ result in this QFlags object. Returns a reference to this object.
+
+ \sa operator^(), operator&=(), operator|=()
+*/
+
+/*!
+ \fn template <typename Enum> QFlags &QFlags<Enum>::operator^=(Enum other)
+
+ \overload
+*/
+
+/*!
+ \fn template <typename Enum> QFlags<Enum>::operator Int() const
+
+ Returns the value stored in the QFlags object as an integer.
+
+ \sa Int
+*/
+
+/*!
+ \fn template <typename Enum> QFlags QFlags<Enum>::operator|(QFlags other) const
+
+ Returns a QFlags object containing the result of the bitwise OR
+ operation on this object and \a other.
+
+ \sa operator|=(), operator^(), operator&(), operator~()
+*/
+
+/*!
+ \fn template <typename Enum> QFlags QFlags<Enum>::operator|(Enum other) const
+
+ \overload
+*/
+
+/*!
+ \fn template <typename Enum> QFlags QFlags<Enum>::operator^(QFlags other) const
+
+ Returns a QFlags object containing the result of the bitwise XOR
+ operation on this object and \a other.
+
+ \sa operator^=(), operator&(), operator|(), operator~()
+*/
+
+/*!
+ \fn template <typename Enum> QFlags QFlags<Enum>::operator^(Enum other) const
+
+ \overload
+*/
+
+/*!
+ \fn template <typename Enum> QFlags QFlags<Enum>::operator&(int mask) const
+
+ Returns a QFlags object containing the result of the bitwise AND
+ operation on this object and \a mask.
+
+ \sa operator&=(), operator|(), operator^(), operator~()
+*/
+
+/*!
+ \fn template <typename Enum> QFlags QFlags<Enum>::operator&(uint mask) const
+
+ \overload
+*/
+
+/*!
+ \fn template <typename Enum> QFlags QFlags<Enum>::operator&(Enum mask) const
+
+ \overload
+*/
+
+/*!
+ \fn template <typename Enum> QFlags QFlags<Enum>::operator&(QFlags mask) const
+ \since 6.2
+
+ \overload
+*/
+
+/*!
+ \fn template <typename Enum> QFlags QFlags<Enum>::operator~() const
+
+ Returns a QFlags object that contains the bitwise negation of
+ this object.
+
+ \sa operator&(), operator|(), operator^()
+*/
+
+/*!
+ \fn template <typename Enum> bool QFlags<Enum>::operator!() const
+
+ Returns \c true if no flag is set (i.e., if the value stored by the
+ QFlags object is 0); otherwise returns \c false.
+*/
+
+/*!
+ \fn template <typename Enum> bool QFlags<Enum>::testFlag(Enum flag) const
+ \since 4.2
+
+ Returns \c true if the flag \a flag is set, otherwise \c false.
+
+ \note if \a flag contains multiple bits set to 1 (for instance, if
+ it's an enumerator equal to the bitwise-OR of other enumerators)
+ then this function will return \c true if and only if all the bits
+ are set in this flags object. On the other hand, if \a flag contains
+ no bits set to 1 (that is, its value as a integer is 0), then this
+ function will return \c true if and only if this flags object also
+ has no bits set to 1.
+
+ \sa testAnyFlag()
+*/
+
+/*!
+ \fn template <typename Enum> bool QFlags<Enum>::testFlags(QFlags flags) const noexcept
+ \since 6.2
+
+ Returns \c true if this flags object matches the given \a flags.
+
+ If \a flags has any flags set, this flags object matches precisely
+ if all flags set in \a flags are also set in this flags object.
+ Otherwise, when \a flags has no flags set, this flags object only
+ matches if it also has no flags set.
+
+ \sa testAnyFlags()
+*/
+
+/*!
+ \fn template <typename Enum> bool QFlags<Enum>::testAnyFlag(Enum flag) const noexcept
+ \since 6.2
+
+ Returns \c true if \b any flag set in \a flag is also set in this
+ flags object, otherwise \c false. If \a flag has no flags set, the
+ return will always be \c false.
+
+ \sa testFlag()
+*/
+
+/*!
+ \fn template <typename Enum> bool QFlags<Enum>::testAnyFlags(QFlags flags) const noexcept
+ \since 6.2
+
+ Returns \c true if \b any flag set in \a flags is also set in this
+ flags object, otherwise \c false. If \a flags has no flags set, the
+ return will always be \c false.
+
+ \sa testFlags()
+*/
+
+/*!
+ \fn template <typename Enum> QFlags QFlags<Enum>::setFlag(Enum flag, bool on)
+ \since 5.7
+
+ Sets the flag \a flag if \a on is \c true or unsets it if
+ \a on is \c false. Returns a reference to this object.
+*/
+
+/*!
+ \fn template <typename Enum> QFlags<Enum> QFlags<Enum>::fromInt(Int i) noexcept
+ \since 6.2
+
+ Constructs a QFlags object representing the integer value \a i.
+*/
+
+/*!
+ \fn template <typename Enum> Int QFlags<Enum>::toInt() const noexcept
+ \since 6.2
+
+ Returns the value stored in the QFlags object as an integer. Note
+ that the returned integer may be signed or unsigned, depending on
+ whether the enum's underlying type is signed or unsigned.
+
+ \sa Int
+*/
+
+/*!
+ \fn template <typename Enum> size_t qHash(QFlags<Enum> flags, size_t seed = 0) noexcept
+ \since 6.2
+ \relates QFlags
+
+ Calculates the hash for the flags \a flags, using \a seed
+ to seed the calculation.
+*/
+
+/*!
+ \fn template <typename Enum> bool operator==(QFlags<Enum> lhs, QFlags<Enum> rhs)
+ \fn template <typename Enum> bool operator==(QFlags<Enum> lhs, Enum rhs)
+ \fn template <typename Enum> bool operator==(Enum lhs, QFlags<Enum> rhs)
+ \since 6.2
+ \relates QFlags
+
+ Compares \a lhs and \a rhs for equality; the two arguments are
+ considered equal if they represent exactly the same value
+ (bitmask).
+*/
+
+/*!
+ \fn template <typename Enum> bool operator!=(QFlags<Enum> lhs, QFlags<Enum> rhs)
+ \fn template <typename Enum> bool operator!=(QFlags<Enum> lhs, Enum rhs)
+ \fn template <typename Enum> bool operator!=(Enum lhs, QFlags<Enum> rhs)
+ \since 6.2
+ \relates QFlags
+
+ Compares \a lhs and \a rhs for inequality; the two arguments are
+ considered different if they don't represent exactly the same value
+ (bitmask).
+*/
+
+/*!
+ \macro Q_DECLARE_FLAGS(Flags, Enum)
+ \relates QFlags
+
+ The Q_DECLARE_FLAGS() macro expands to
+
+ \snippet code/src_corelib_global_qglobal.cpp 2
+
+ \a Enum is the name of an existing enum type, whereas \a Flags is
+ the name of the QFlags<\e{Enum}> typedef.
+
+ See the QFlags documentation for details.
+
+ \sa Q_DECLARE_OPERATORS_FOR_FLAGS()
+*/
+
+/*!
+ \macro Q_DECLARE_OPERATORS_FOR_FLAGS(Flags)
+ \relates QFlags
+
+ The Q_DECLARE_OPERATORS_FOR_FLAGS() macro declares global \c
+ operator|() functions for \a Flags, which is of type QFlags<T>.
+
+ See the QFlags documentation for details.
+
+ \sa Q_DECLARE_FLAGS()
+*/
diff --git a/src/corelib/global/qfloat16.cpp b/src/corelib/global/qfloat16.cpp
index 834d82e0ea..f6f782e364 100644
--- a/src/corelib/global/qfloat16.cpp
+++ b/src/corelib/global/qfloat16.cpp
@@ -1,49 +1,20 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Copyright (C) 2016 by Southwest Research Institute (R)
-** Contact: http://www.qt-project.org/legal
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// Copyright (C) 2016 by Southwest Research Institute (R)
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qfloat16.h"
#include "private/qsimd_p.h"
#include <cmath> // for fpclassify()'s return values
+#include <QtCore/qdatastream.h>
+#include <QtCore/qmetatype.h>
+#include <QtCore/qtextstream.h>
+
+QT_DECL_METATYPE_EXTERN(qfloat16, Q_CORE_EXPORT)
QT_BEGIN_NAMESPACE
+QT_IMPL_METATYPE_EXTERN(qfloat16)
+
/*!
\class qfloat16
\keyword 16-bit Floating Point Support
@@ -52,6 +23,15 @@ QT_BEGIN_NAMESPACE
\inheaderfile QFloat16
\brief Provides 16-bit floating point support.
+ \compares partial
+ \compareswith partial float double {long double} qint8 quint8 qint16 quint16 \
+ qint32 quint32 long {unsigned long} qint64 quint64
+ \endcompareswith
+ \compareswith partial qint128 quint128
+ Comparison with 128-bit integral types is only supported if Qt provides
+ these types.
+ \endcompareswith
+
The \c qfloat16 class provides support for half-precision (16-bit) floating
point data. It is fully compliant with IEEE 754 as a storage type. This
implies that any arithmetic operation on a \c qfloat16 instance results in
@@ -189,43 +169,127 @@ int qfloat16::fpClassify() const noexcept
exactness is stronger the smaller the numbers are.
*/
-#if QT_COMPILER_SUPPORTS(F16C)
+#if QT_COMPILER_SUPPORTS_HERE(F16C)
static inline bool hasFastF16()
{
- // All processors with F16C also support AVX, but YMM registers
- // might not be supported by the OS, or they might be disabled.
- return qCpuHasFeature(F16C) && qCpuHasFeature(AVX);
+ // qsimd.cpp:detectProcessorFeatures() turns off this feature if AVX
+ // state-saving is not enabled by the OS
+ return qCpuHasFeature(F16C);
+}
+
+#if QT_COMPILER_SUPPORTS_HERE(AVX512VL) && QT_COMPILER_SUPPORTS_HERE(AVX512BW)
+static bool hasFastF16Avx256()
+{
+ // 256-bit AVX512 don't have a performance penalty (see qstring.cpp for more info)
+ return qCpuHasFeature(ArchSkylakeAvx512);
}
+static QT_FUNCTION_TARGET(ARCH_SKYLAKE_AVX512)
+void qFloatToFloat16_tail_avx256(quint16 *out, const float *in, qsizetype len) noexcept
+{
+ __mmask16 mask = _bzhi_u32(-1, len);
+ __m256 f32 = _mm256_maskz_loadu_ps(mask, in );
+ __m128i f16 = _mm256_maskz_cvtps_ph(mask, f32, _MM_FROUND_TO_NEAREST_INT);
+ _mm_mask_storeu_epi16(out, mask, f16);
+};
+
+static QT_FUNCTION_TARGET(ARCH_SKYLAKE_AVX512)
+void qFloatFromFloat16_tail_avx256(float *out, const quint16 *in, qsizetype len) noexcept
+{
+ __mmask16 mask = _bzhi_u32(-1, len);
+ __m128i f16 = _mm_maskz_loadu_epi16(mask, in);
+ __m256 f32 = _mm256_cvtph_ps(f16);
+ _mm256_mask_storeu_ps(out, mask, f32);
+};
+#endif
+
QT_FUNCTION_TARGET(F16C)
-void qFloatToFloat16_fast(quint16 *out, const float *in, qsizetype len) Q_DECL_NOEXCEPT
+static void qFloatToFloat16_fast(quint16 *out, const float *in, qsizetype len) noexcept
{
+ constexpr qsizetype Step = sizeof(__m256i) / sizeof(float);
+ constexpr qsizetype HalfStep = sizeof(__m128i) / sizeof(float);
qsizetype i = 0;
- int epilog_i;
- for (; i < len - 7; i += 8)
- _mm_storeu_si128((__m128i *)(out + i), _mm256_cvtps_ph(_mm256_loadu_ps(in + i), 0));
- if (i < len - 3) {
- _mm_storel_epi64((__m128i *)(out + i), _mm_cvtps_ph(_mm_loadu_ps(in + i), 0));
- i += 4;
+
+ if (len >= Step) {
+ auto convertOneChunk = [=](qsizetype offset) QT_FUNCTION_TARGET(F16C) {
+ __m256 f32 = _mm256_loadu_ps(in + offset);
+ __m128i f16 = _mm256_cvtps_ph(f32, _MM_FROUND_TO_NEAREST_INT);
+ _mm_storeu_si128(reinterpret_cast<__m128i *>(out + offset), f16);
+ };
+
+ // main loop: convert Step (8) floats per iteration
+ for ( ; i + Step < len; i += Step)
+ convertOneChunk(i);
+
+ // epilogue: convert the last chunk, possibly overlapping with the last
+ // iteration of the loop
+ return convertOneChunk(len - Step);
}
+
+#if QT_COMPILER_SUPPORTS_HERE(AVX512VL) && QT_COMPILER_SUPPORTS_HERE(AVX512BW)
+ if (hasFastF16Avx256())
+ return qFloatToFloat16_tail_avx256(out, in, len);
+#endif
+
+ if (len >= HalfStep) {
+ auto convertOneChunk = [=](qsizetype offset) QT_FUNCTION_TARGET(F16C) {
+ __m128 f32 = _mm_loadu_ps(in + offset);
+ __m128i f16 = _mm_cvtps_ph(f32, _MM_FROUND_TO_NEAREST_INT);
+ _mm_storel_epi64(reinterpret_cast<__m128i *>(out + offset), f16);
+ };
+
+ // two conversions, possibly overlapping
+ convertOneChunk(0);
+ return convertOneChunk(len - HalfStep);
+ }
+
// Inlining "qfloat16::qfloat16(float f)":
- for (epilog_i = 0; i < len && epilog_i < 3; ++i, ++epilog_i)
+ for ( ; i < len; ++i)
out[i] = _mm_extract_epi16(_mm_cvtps_ph(_mm_set_ss(in[i]), 0), 0);
}
QT_FUNCTION_TARGET(F16C)
-void qFloatFromFloat16_fast(float *out, const quint16 *in, qsizetype len) Q_DECL_NOEXCEPT
+static void qFloatFromFloat16_fast(float *out, const quint16 *in, qsizetype len) noexcept
{
+ constexpr qsizetype Step = sizeof(__m256i) / sizeof(float);
+ constexpr qsizetype HalfStep = sizeof(__m128i) / sizeof(float);
qsizetype i = 0;
- int epilog_i;
- for (; i < len - 7; i += 8)
- _mm256_storeu_ps(out + i, _mm256_cvtph_ps(_mm_loadu_si128((const __m128i *)(in + i))));
- if (i < len - 3) {
- _mm_storeu_ps(out + i, _mm_cvtph_ps(_mm_loadl_epi64((const __m128i *)(in + i))));
- i += 4;
+
+ if (len >= Step) {
+ auto convertOneChunk = [=](qsizetype offset) QT_FUNCTION_TARGET(F16C) {
+ __m128i f16 = _mm_loadu_si128(reinterpret_cast<const __m128i *>(in + offset));
+ __m256 f32 = _mm256_cvtph_ps(f16);
+ _mm256_storeu_ps(out + offset, f32);
+ };
+
+ // main loop: convert Step (8) floats per iteration
+ for ( ; i + Step < len; i += Step)
+ convertOneChunk(i);
+
+ // epilogue: convert the last chunk, possibly overlapping with the last
+ // iteration of the loop
+ return convertOneChunk(len - Step);
+ }
+
+#if QT_COMPILER_SUPPORTS_HERE(AVX512VL) && QT_COMPILER_SUPPORTS_HERE(AVX512BW)
+ if (hasFastF16Avx256())
+ return qFloatFromFloat16_tail_avx256(out, in, len);
+#endif
+
+ if (len >= HalfStep) {
+ auto convertOneChunk = [=](qsizetype offset) QT_FUNCTION_TARGET(F16C) {
+ __m128i f16 = _mm_loadl_epi64(reinterpret_cast<const __m128i *>(in + offset));
+ __m128 f32 = _mm_cvtph_ps(f16);
+ _mm_storeu_ps(out + offset, f32);
+ };
+
+ // two conversions, possibly overlapping
+ convertOneChunk(0);
+ return convertOneChunk(len - HalfStep);
}
+
// Inlining "qfloat16::operator float()":
- for (epilog_i = 0; i < len && epilog_i < 3; ++i, ++epilog_i)
+ for ( ; i < len; ++i)
out[i] = _mm_cvtss_f32(_mm_cvtph_ps(_mm_cvtsi32_si128(in[i])));
}
@@ -308,6 +372,67 @@ Q_CORE_EXPORT void qFloatFromFloat16(float *out, const qfloat16 *in, qsizetype l
out[i] = float(in[i]);
}
+/*!
+ \fn size_t qfloat16::qHash(qfloat16 key, size_t seed)
+ \since 6.5.3
+
+ Returns the hash value for the \a key, using \a seed to seed the
+ calculation.
+
+ \note In Qt versions before 6.5, this operation was provided by the
+ qHash(float) overload. In Qt versions 6.5.0 to 6.5.2, this functionality
+ was broken in various ways. In Qt versions 6.5.3 and 6.6 onwards, this
+ overload restores the Qt 6.4 behavior.
+*/
+
+#ifndef QT_NO_DATASTREAM
+/*!
+ \fn qfloat16::operator<<(QDataStream &ds, qfloat16 f)
+ \relates QDataStream
+ \since 5.9
+
+ Writes a floating point number, \a f, to the stream \a ds using
+ the standard IEEE 754 format. Returns a reference to the stream.
+
+ \note In Qt versions prior to 6.3, this was a member function on
+ QDataStream.
+*/
+QDataStream &operator<<(QDataStream &ds, qfloat16 f)
+{
+ return ds << f.b16;
+}
+
+/*!
+ \fn qfloat16::operator>>(QDataStream &ds, qfloat16 &f)
+ \relates QDataStream
+ \since 5.9
+
+ Reads a floating point number from the stream \a ds into \a f,
+ using the standard IEEE 754 format. Returns a reference to the
+ stream.
+
+ \note In Qt versions prior to 6.3, this was a member function on
+ QDataStream.
+*/
+QDataStream &operator>>(QDataStream &ds, qfloat16 &f)
+{
+ return ds >> f.b16;
+}
+#endif
+
+QTextStream &operator>>(QTextStream &ts, qfloat16 &f16)
+{
+ float f;
+ ts >> f;
+ f16 = qfloat16(f);
+ return ts;
+}
+
+QTextStream &operator<<(QTextStream &ts, qfloat16 f)
+{
+ return ts << float(f);
+}
+
QT_END_NAMESPACE
#include "qfloat16tables.cpp"
diff --git a/src/corelib/global/qfloat16.h b/src/corelib/global/qfloat16.h
index 59739fdcc1..30dd9a60af 100644
--- a/src/corelib/global/qfloat16.h
+++ b/src/corelib/global/qfloat16.h
@@ -1,59 +1,30 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Copyright (C) 2016 by Southwest Research Institute (R)
-** Contact: http://www.qt-project.org/legal
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2022 The Qt Company Ltd.
+// Copyright (C) 2016 by Southwest Research Institute (R)
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QFLOAT16_H
#define QFLOAT16_H
+#include <QtCore/qcompare.h>
#include <QtCore/qglobal.h>
-#include <QtCore/qmetatype.h>
+#include <QtCore/qhashfunctions.h>
+#include <QtCore/qmath.h>
#include <QtCore/qnamespace.h>
+#include <QtCore/qtconfigmacros.h>
+#include <QtCore/qtypes.h>
+
#include <limits>
#include <string.h>
+#include <type_traits>
#if defined(QT_COMPILER_SUPPORTS_F16C) && defined(__AVX2__) && !defined(__F16C__)
-// All processors that support AVX2 do support F16C too. That doesn't mean
-// we're allowed to use the intrinsics directly, so we'll do it only for
-// the Intel and Microsoft's compilers.
-# if defined(Q_CC_INTEL) || defined(Q_CC_MSVC)
+// All processors that support AVX2 do support F16C too, so we could enable the
+// feature unconditionally if __AVX2__ is defined. However, all currently
+// supported compilers except Microsoft's are able to define __F16C__ on their
+// own when the user enables the feature, so we'll trust them.
+# if defined(Q_CC_MSVC) && !defined(Q_CC_CLANG)
# define __F16C__ 1
-# endif
+# endif
#endif
#if defined(QT_COMPILER_SUPPORTS_F16C) && defined(__F16C__)
@@ -67,6 +38,11 @@ QT_BEGIN_NAMESPACE
#pragma qt_no_master_include
#endif
+#ifndef QT_NO_DATASTREAM
+class QDataStream;
+#endif
+class QTextStream;
+
class qfloat16
{
struct Wrap
@@ -76,11 +52,38 @@ class qfloat16
quint16 b16;
constexpr inline explicit Wrap(int value) : b16(quint16(value)) {}
};
+
+#ifdef QT_SUPPORTS_INT128
+ template <typename T>
+ using IsIntegral = std::disjunction<std::is_integral<T>,
+ std::is_same<std::remove_const_t<T>, qint128>,
+ std::is_same<std::remove_const_t<T>, quint128>>;
+#else
+ template <typename T>
+ using IsIntegral = std::is_integral<T>;
+#endif
+ template <typename T>
+ using if_type_is_integral = std::enable_if_t<IsIntegral<std::remove_reference_t<T>>::value,
+ bool>;
+
public:
+ using NativeType = QtPrivate::NativeFloat16Type;
+
+ static constexpr bool IsNative = QFLOAT16_IS_NATIVE;
+ using NearestFloat = std::conditional_t<IsNative, NativeType, float>;
+
constexpr inline qfloat16() noexcept : b16(0) {}
explicit qfloat16(Qt::Initialization) noexcept { }
+
+#if QFLOAT16_IS_NATIVE
+ constexpr inline qfloat16(NativeType f) : nf(f) {}
+ constexpr operator NativeType() const noexcept { return nf; }
+#else
inline qfloat16(float f) noexcept;
inline operator float() const noexcept;
+#endif
+ template <typename T, typename = std::enable_if_t<std::is_arithmetic_v<T> && !std::is_same_v<T, NearestFloat>>>
+ constexpr explicit qfloat16(T value) noexcept : qfloat16(NearestFloat(value)) {}
// Support for qIs{Inf,NaN,Finite}:
bool isInf() const noexcept { return (b16 & 0x7fff) == 0x7c00; }
@@ -91,6 +94,22 @@ public:
qfloat16 copySign(qfloat16 sign) const noexcept
{ return qfloat16(Wrap((sign.b16 & 0x8000) | (b16 & 0x7fff))); }
// Support for std::numeric_limits<qfloat16>
+
+#ifdef __STDCPP_FLOAT16_T__
+private:
+ using Bounds = std::numeric_limits<NativeType>;
+public:
+ static constexpr qfloat16 _limit_epsilon() noexcept { return Bounds::epsilon(); }
+ static constexpr qfloat16 _limit_min() noexcept { return Bounds::min(); }
+ static constexpr qfloat16 _limit_denorm_min() noexcept { return Bounds::denorm_min(); }
+ static constexpr qfloat16 _limit_max() noexcept { return Bounds::max(); }
+ static constexpr qfloat16 _limit_lowest() noexcept { return Bounds::lowest(); }
+ static constexpr qfloat16 _limit_infinity() noexcept { return Bounds::infinity(); }
+ static constexpr qfloat16 _limit_quiet_NaN() noexcept { return Bounds::quiet_NaN(); }
+#if QT_CONFIG(signaling_nan)
+ static constexpr qfloat16 _limit_signaling_NaN() noexcept { return Bounds::signaling_NaN(); }
+#endif
+#else
static constexpr qfloat16 _limit_epsilon() noexcept { return qfloat16(Wrap(0x1400)); }
static constexpr qfloat16 _limit_min() noexcept { return qfloat16(Wrap(0x400)); }
static constexpr qfloat16 _limit_denorm_min() noexcept { return qfloat16(Wrap(1)); }
@@ -101,11 +120,29 @@ public:
#if QT_CONFIG(signaling_nan)
static constexpr qfloat16 _limit_signaling_NaN() noexcept { return qfloat16(Wrap(0x7d00)); }
#endif
+#endif
inline constexpr bool isNormal() const noexcept
{ return (b16 & 0x7c00) && (b16 & 0x7c00) != 0x7c00; }
private:
- quint16 b16;
- constexpr inline explicit qfloat16(Wrap nibble) noexcept : b16(nibble.b16) {}
+ // ABI note: Qt 6's qfloat16 began with just a quint16 member so it ended
+ // up passed in general purpose registers in any function call taking
+ // qfloat16 by value (it has trivial copy constructors). This means the
+ // integer member in the anonymous union below must remain until a
+ // binary-incompatible version of Qt. If you remove it, on platforms using
+ // the System V ABI for C, the native type is passed in FP registers.
+ union {
+ quint16 b16;
+#if QFLOAT16_IS_NATIVE
+ NativeType nf;
+#endif
+ };
+ constexpr inline explicit qfloat16(Wrap nibble) noexcept :
+#if QFLOAT16_IS_NATIVE && defined(__cpp_lib_bit_cast)
+ nf(std::bit_cast<NativeType>(nibble.b16))
+#else
+ b16(nibble.b16)
+#endif
+ {}
Q_CORE_EXPORT static const quint32 mantissatable[];
Q_CORE_EXPORT static const quint32 exponenttable[];
@@ -123,17 +160,23 @@ private:
return f;
}
- friend inline qfloat16 operator+(qfloat16 a, qfloat16 b) noexcept { return qfloat16(static_cast<float>(a) + static_cast<float>(b)); }
- friend inline qfloat16 operator-(qfloat16 a, qfloat16 b) noexcept { return qfloat16(static_cast<float>(a) - static_cast<float>(b)); }
- friend inline qfloat16 operator*(qfloat16 a, qfloat16 b) noexcept { return qfloat16(static_cast<float>(a) * static_cast<float>(b)); }
- friend inline qfloat16 operator/(qfloat16 a, qfloat16 b) noexcept { return qfloat16(static_cast<float>(a) / static_cast<float>(b)); }
+ friend inline qfloat16 operator+(qfloat16 a, qfloat16 b) noexcept { return qfloat16(static_cast<NearestFloat>(a) + static_cast<NearestFloat>(b)); }
+ friend inline qfloat16 operator-(qfloat16 a, qfloat16 b) noexcept { return qfloat16(static_cast<NearestFloat>(a) - static_cast<NearestFloat>(b)); }
+ friend inline qfloat16 operator*(qfloat16 a, qfloat16 b) noexcept { return qfloat16(static_cast<NearestFloat>(a) * static_cast<NearestFloat>(b)); }
+ friend inline qfloat16 operator/(qfloat16 a, qfloat16 b) noexcept { return qfloat16(static_cast<NearestFloat>(a) / static_cast<NearestFloat>(b)); }
+
+ friend size_t qHash(qfloat16 key, size_t seed = 0) noexcept
+ { return qHash(float(key), seed); } // 6.4 algorithm, so keep using it; ### Qt 7: fix QTBUG-116077
+
+QT_WARNING_PUSH
+QT_WARNING_DISABLE_GCC("-Wfloat-conversion")
#define QF16_MAKE_ARITH_OP_FP(FP, OP) \
friend inline FP operator OP(qfloat16 lhs, FP rhs) noexcept { return static_cast<FP>(lhs) OP rhs; } \
friend inline FP operator OP(FP lhs, qfloat16 rhs) noexcept { return lhs OP static_cast<FP>(rhs); }
#define QF16_MAKE_ARITH_OP_EQ_FP(FP, OP_EQ, OP) \
friend inline qfloat16& operator OP_EQ(qfloat16& lhs, FP rhs) noexcept \
- { lhs = qfloat16(float(static_cast<FP>(lhs) OP rhs)); return lhs; }
+ { lhs = qfloat16(NearestFloat(static_cast<FP>(lhs) OP rhs)); return lhs; }
#define QF16_MAKE_ARITH_OP(FP) \
QF16_MAKE_ARITH_OP_FP(FP, +) \
QF16_MAKE_ARITH_OP_FP(FP, -) \
@@ -147,6 +190,9 @@ private:
QF16_MAKE_ARITH_OP(long double)
QF16_MAKE_ARITH_OP(double)
QF16_MAKE_ARITH_OP(float)
+#if QFLOAT16_IS_NATIVE
+ QF16_MAKE_ARITH_OP(NativeType)
+#endif
#undef QF16_MAKE_ARITH_OP
#undef QF16_MAKE_ARITH_OP_FP
@@ -160,46 +206,72 @@ private:
QF16_MAKE_ARITH_OP_INT(/)
#undef QF16_MAKE_ARITH_OP_INT
-QT_WARNING_PUSH
QT_WARNING_DISABLE_FLOAT_COMPARE
- friend inline bool operator>(qfloat16 a, qfloat16 b) noexcept { return static_cast<float>(a) > static_cast<float>(b); }
- friend inline bool operator<(qfloat16 a, qfloat16 b) noexcept { return static_cast<float>(a) < static_cast<float>(b); }
- friend inline bool operator>=(qfloat16 a, qfloat16 b) noexcept { return static_cast<float>(a) >= static_cast<float>(b); }
- friend inline bool operator<=(qfloat16 a, qfloat16 b) noexcept { return static_cast<float>(a) <= static_cast<float>(b); }
- friend inline bool operator==(qfloat16 a, qfloat16 b) noexcept { return static_cast<float>(a) == static_cast<float>(b); }
- friend inline bool operator!=(qfloat16 a, qfloat16 b) noexcept { return static_cast<float>(a) != static_cast<float>(b); }
-
-#define QF16_MAKE_BOOL_OP_FP(FP, OP) \
- friend inline bool operator OP(qfloat16 lhs, FP rhs) noexcept { return static_cast<FP>(lhs) OP rhs; } \
- friend inline bool operator OP(FP lhs, qfloat16 rhs) noexcept { return lhs OP static_cast<FP>(rhs); }
-#define QF16_MAKE_BOOL_OP(FP) \
- QF16_MAKE_BOOL_OP_FP(FP, <) \
- QF16_MAKE_BOOL_OP_FP(FP, >) \
- QF16_MAKE_BOOL_OP_FP(FP, >=) \
- QF16_MAKE_BOOL_OP_FP(FP, <=) \
- QF16_MAKE_BOOL_OP_FP(FP, ==) \
- QF16_MAKE_BOOL_OP_FP(FP, !=)
-
- QF16_MAKE_BOOL_OP(long double)
- QF16_MAKE_BOOL_OP(double)
- QF16_MAKE_BOOL_OP(float)
-#undef QF16_MAKE_BOOL_OP
-#undef QF16_MAKE_BOOL_OP_FP
-
-#define QF16_MAKE_BOOL_OP_INT(OP) \
- friend inline bool operator OP(qfloat16 a, int b) noexcept { return static_cast<float>(a) OP static_cast<float>(b); } \
- friend inline bool operator OP(int a, qfloat16 b) noexcept { return static_cast<float>(a) OP static_cast<float>(b); }
-
- QF16_MAKE_BOOL_OP_INT(>)
- QF16_MAKE_BOOL_OP_INT(<)
- QF16_MAKE_BOOL_OP_INT(>=)
- QF16_MAKE_BOOL_OP_INT(<=)
- QF16_MAKE_BOOL_OP_INT(==)
- QF16_MAKE_BOOL_OP_INT(!=)
-#undef QF16_MAKE_BOOL_OP_INT
+#if QFLOAT16_IS_NATIVE
+# define QF16_CONSTEXPR constexpr
+# define QF16_PARTIALLY_ORDERED Q_DECLARE_PARTIALLY_ORDERED_LITERAL_TYPE
+#else
+# define QF16_CONSTEXPR
+# define QF16_PARTIALLY_ORDERED Q_DECLARE_PARTIALLY_ORDERED
+#endif
+
+ friend QF16_CONSTEXPR bool comparesEqual(const qfloat16 &lhs, const qfloat16 &rhs) noexcept
+ { return static_cast<NearestFloat>(lhs) == static_cast<NearestFloat>(rhs); }
+ friend QF16_CONSTEXPR
+ Qt::partial_ordering compareThreeWay(const qfloat16 &lhs, const qfloat16 &rhs) noexcept
+ { return Qt::compareThreeWay(static_cast<NearestFloat>(lhs), static_cast<NearestFloat>(rhs)); }
+ QF16_PARTIALLY_ORDERED(qfloat16)
+
+#define QF16_MAKE_ORDER_OP_FP(FP) \
+ friend QF16_CONSTEXPR bool comparesEqual(const qfloat16 &lhs, FP rhs) noexcept \
+ { return static_cast<FP>(lhs) == rhs; } \
+ friend QF16_CONSTEXPR \
+ Qt::partial_ordering compareThreeWay(const qfloat16 &lhs, FP rhs) noexcept \
+ { return Qt::compareThreeWay(static_cast<FP>(lhs), rhs); } \
+ QF16_PARTIALLY_ORDERED(qfloat16, FP)
+
+ QF16_MAKE_ORDER_OP_FP(long double)
+ QF16_MAKE_ORDER_OP_FP(double)
+ QF16_MAKE_ORDER_OP_FP(float)
+#if QFLOAT16_IS_NATIVE
+ QF16_MAKE_ORDER_OP_FP(qfloat16::NativeType)
+#endif
+#undef QF16_MAKE_ORDER_OP_FP
+
+ template <typename T, if_type_is_integral<T> = true>
+ friend QF16_CONSTEXPR bool comparesEqual(const qfloat16 &lhs, T rhs) noexcept
+ { return static_cast<NearestFloat>(lhs) == static_cast<NearestFloat>(rhs); }
+ template <typename T, if_type_is_integral<T> = true>
+ friend QF16_CONSTEXPR Qt::partial_ordering compareThreeWay(const qfloat16 &lhs, T rhs) noexcept
+ { return Qt::compareThreeWay(static_cast<NearestFloat>(lhs), static_cast<NearestFloat>(rhs)); }
+
+ QF16_PARTIALLY_ORDERED(qfloat16, qint8)
+ QF16_PARTIALLY_ORDERED(qfloat16, quint8)
+ QF16_PARTIALLY_ORDERED(qfloat16, qint16)
+ QF16_PARTIALLY_ORDERED(qfloat16, quint16)
+ QF16_PARTIALLY_ORDERED(qfloat16, qint32)
+ QF16_PARTIALLY_ORDERED(qfloat16, quint32)
+ QF16_PARTIALLY_ORDERED(qfloat16, long)
+ QF16_PARTIALLY_ORDERED(qfloat16, unsigned long)
+ QF16_PARTIALLY_ORDERED(qfloat16, qint64)
+ QF16_PARTIALLY_ORDERED(qfloat16, quint64)
+#ifdef QT_SUPPORTS_INT128
+ QF16_PARTIALLY_ORDERED(qfloat16, qint128)
+ QF16_PARTIALLY_ORDERED(qfloat16, quint128)
+#endif
+
+#undef QF16_PARTIALLY_ORDERED
+#undef QF16_CONSTEXPR
QT_WARNING_POP
+
+#ifndef QT_NO_DATASTREAM
+ friend Q_CORE_EXPORT QDataStream &operator<<(QDataStream &ds, qfloat16 f);
+ friend Q_CORE_EXPORT QDataStream &operator>>(QDataStream &ds, qfloat16 &f);
+#endif
+ friend Q_CORE_EXPORT QTextStream &operator<<(QTextStream &ts, qfloat16 f);
+ friend Q_CORE_EXPORT QTextStream &operator>>(QTextStream &ts, qfloat16 &f);
};
Q_DECLARE_TYPEINFO(qfloat16, Q_PRIMITIVE_TYPE);
@@ -214,6 +286,43 @@ Q_CORE_EXPORT void qFloatFromFloat16(float *, const qfloat16 *, qsizetype length
[[nodiscard]] inline int qFpClassify(qfloat16 f) noexcept { return f.fpClassify(); }
// [[nodiscard]] quint32 qFloatDistance(qfloat16 a, qfloat16 b);
+[[nodiscard]] inline qfloat16 qSqrt(qfloat16 f)
+{
+#if defined(__cpp_lib_extended_float) && defined(__STDCPP_FLOAT16_T__) && 0
+ // https://wg21.link/p1467 - disabled until tested
+ using namespace std;
+ return sqrt(f);
+#elif QFLOAT16_IS_NATIVE && defined(__HAVE_FLOAT16) && __HAVE_FLOAT16
+ // This C library (glibc) has sqrtf16().
+ return sqrtf16(f);
+#else
+ bool mathUpdatesErrno = true;
+# if defined(__NO_MATH_ERRNO__) || defined(_M_FP_FAST)
+ mathUpdatesErrno = false;
+# elif defined(math_errhandling)
+ mathUpdatesErrno = (math_errhandling & MATH_ERRNO);
+# endif
+
+ // We don't need to set errno to EDOM if (f >= 0 && f != -0 && !isnan(f))
+ // (or if we don't care about errno in the first place). We can merge the
+ // NaN check with by negating and inverting: !(0 > f), and leaving zero to
+ // sqrtf().
+ if (!mathUpdatesErrno || !(0 > f)) {
+# if defined(__AVX512FP16__)
+ __m128h v = _mm_set_sh(f);
+ v = _mm_sqrt_sh(v, v);
+ return _mm_cvtsh_h(v);
+# endif
+ }
+
+ // WG14's N2601 does not provide a way to tell which types an
+ // implementation supports, so we assume it doesn't and fall back to FP32
+ float f32 = float(f);
+ f32 = sqrtf(f32);
+ return qfloat16::NearestFloat(f32);
+#endif
+}
+
// The remainder of these utility functions complement qglobal.h
[[nodiscard]] inline int qRound(qfloat16 d) noexcept
{ return qRound(static_cast<float>(d)); }
@@ -223,8 +332,8 @@ Q_CORE_EXPORT void qFloatFromFloat16(float *, const qfloat16 *, qsizetype length
[[nodiscard]] inline bool qFuzzyCompare(qfloat16 p1, qfloat16 p2) noexcept
{
- float f1 = static_cast<float>(p1);
- float f2 = static_cast<float>(p2);
+ qfloat16::NearestFloat f1 = static_cast<qfloat16::NearestFloat>(p1);
+ qfloat16::NearestFloat f2 = static_cast<qfloat16::NearestFloat>(p2);
// The significand precision for IEEE754 half precision is
// 11 bits (10 explicitly stored), or approximately 3 decimal
// digits. In selecting the fuzzy comparison factor of 102.5f
@@ -248,9 +357,9 @@ Q_CORE_EXPORT void qFloatFromFloat16(float *, const qfloat16 *, qsizetype length
}
inline int qIntCast(qfloat16 f) noexcept
-{ return int(static_cast<float>(f)); }
+{ return int(static_cast<qfloat16::NearestFloat>(f)); }
-#ifndef Q_QDOC
+#if !defined(Q_QDOC) && !QFLOAT16_IS_NATIVE
QT_WARNING_PUSH
QT_WARNING_DISABLE_CLANG("-Wc99-extensions")
QT_WARNING_DISABLE_GCC("-Wold-style-cast")
@@ -275,8 +384,12 @@ inline qfloat16::qfloat16(float f) noexcept
if (mantissa) // keep nan from truncating to inf
mantissa = qMax(1U << shift, mantissa);
} else {
- // round half to even
+ // Round half to even. First round up by adding one in the most
+ // significant bit we'll be discarding:
mantissa += round;
+ // If the last bit we'll be keeping is now set, but all later bits are
+ // clear, we were at half and shouldn't have rounded up; decrement will
+ // clear this last kept bit. Any later set bit hides the decrement.
if (mantissa & (1 << shift))
--mantissa;
}
@@ -306,33 +419,52 @@ inline qfloat16::operator float() const noexcept
return f;
#endif
}
-#endif
+#endif // Q_QDOC and non-native
/*
qHypot compatibility; see ../kernel/qmath.h
*/
namespace QtPrivate {
-template <typename R>
-struct QHypotType<R, qfloat16> { using type = decltype(std::hypot(R(1), 1.0f)); };
-template <typename R>
-struct QHypotType<qfloat16, R> { using type = decltype(std::hypot(1.0f, R(1))); };
-template <> struct QHypotType<qfloat16, qfloat16> { using type = qfloat16; };
+template <> struct QHypotType<qfloat16, qfloat16>
+{
+ using type = qfloat16;
+};
+template <typename R> struct QHypotType<R, qfloat16>
+{
+ using type = std::conditional_t<std::is_floating_point_v<R>, R, double>;
+};
+template <typename R> struct QHypotType<qfloat16, R> : QHypotType<R, qfloat16>
+{
+};
}
+
// Avoid passing qfloat16 to std::hypot(), while ensuring return types
// consistent with the above:
-template<typename F, typename ...Fs> auto qHypot(F first, Fs... rest);
-template <typename T, typename std::enable_if<!std::is_same<qfloat16, T>::value, int>::type = 0>
-auto qHypot(T x, qfloat16 y) { return qHypot(x, float(y)); }
-template <typename T, typename std::enable_if<!std::is_same<qfloat16, T>::value, int>::type = 0>
-auto qHypot(qfloat16 x, T y) { return qHypot(float(x), y); }
-template <> inline auto qHypot(qfloat16 x, qfloat16 y)
+inline auto qHypot(qfloat16 x, qfloat16 y)
{
-#if (defined(QT_COMPILER_SUPPORTS_F16C) && defined(__F16C__)) || defined (__ARM_FP16_FORMAT_IEEE)
+#if defined(QT_COMPILER_SUPPORTS_F16C) && defined(__F16C__) || QFLOAT16_IS_NATIVE
return QtPrivate::QHypotHelper<qfloat16>(x).add(y).result();
#else
return qfloat16(qHypot(float(x), float(y)));
#endif
}
+
+// in ../kernel/qmath.h
+template<typename F, typename ...Fs> auto qHypot(F first, Fs... rest);
+
+template <typename T> typename QtPrivate::QHypotType<T, qfloat16>::type
+qHypot(T x, qfloat16 y)
+{
+ if constexpr (std::is_floating_point_v<T>)
+ return qHypot(x, float(y));
+ else
+ return qHypot(qfloat16(x), y);
+}
+template <typename T> auto qHypot(qfloat16 x, T y)
+{
+ return qHypot(y, x);
+}
+
#if defined(__cpp_lib_hypot) && __cpp_lib_hypot >= 201603L // Expected to be true
// If any are not qfloat16, convert each qfloat16 to float:
/* (The following splits the some-but-not-all-qfloat16 cases up, using
@@ -342,22 +474,22 @@ template <typename Ty, typename Tz,
typename std::enable_if<
// Ty, Tz aren't both qfloat16:
!(std::is_same_v<qfloat16, Ty> && std::is_same_v<qfloat16, Tz>), int>::type = 0>
-auto qHypot(qfloat16 x, Ty y, Tz z) { return qHypot(float(x), y, z); }
+auto qHypot(qfloat16 x, Ty y, Tz z) { return qHypot(qfloat16::NearestFloat(x), y, z); }
template <typename Tx, typename Tz,
typename std::enable_if<
// Tx isn't qfloat16:
!std::is_same_v<qfloat16, Tx>, int>::type = 0>
-auto qHypot(Tx x, qfloat16 y, Tz z) { return qHypot(x, float(y), z); }
+auto qHypot(Tx x, qfloat16 y, Tz z) { return qHypot(x, qfloat16::NearestFloat(y), z); }
template <typename Tx, typename Ty,
typename std::enable_if<
// Neither Tx nor Ty is qfloat16:
!std::is_same_v<qfloat16, Tx> && !std::is_same_v<qfloat16, Ty>, int>::type = 0>
-auto qHypot(Tx x, Ty y, qfloat16 z) { return qHypot(x, y, float(z)); }
+auto qHypot(Tx x, Ty y, qfloat16 z) { return qHypot(x, y, qfloat16::NearestFloat(z)); }
+
// If all are qfloat16, stay with qfloat16 (albeit via float, if no native support):
-template <>
inline auto qHypot(qfloat16 x, qfloat16 y, qfloat16 z)
{
-#if (defined(QT_COMPILER_SUPPORTS_F16C) && defined(__F16C__)) || defined (__ARM_FP16_FORMAT_IEEE)
+#if (defined(QT_COMPILER_SUPPORTS_F16C) && defined(__F16C__)) || QFLOAT16_IS_NATIVE
return QtPrivate::QHypotHelper<qfloat16>(x).add(y).add(z).result();
#else
return qfloat16(qHypot(float(x), float(y), float(z)));
@@ -367,8 +499,6 @@ inline auto qHypot(qfloat16 x, qfloat16 y, qfloat16 z)
QT_END_NAMESPACE
-Q_DECLARE_METATYPE(qfloat16)
-
namespace std {
template<>
class numeric_limits<QT_PREPEND_NAMESPACE(qfloat16)> : public numeric_limits<float>
diff --git a/src/corelib/global/qfloat16tables.cpp b/src/corelib/global/qfloat16tables.cpp
index 55173366c6..4aa620c4e7 100644
--- a/src/corelib/global/qfloat16tables.cpp
+++ b/src/corelib/global/qfloat16tables.cpp
@@ -1,43 +1,7 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 by Southwest Research Institute (R)
-** Copyright (C) 2019 Intel Corporation.
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: http://www.qt-project.org/legal
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 by Southwest Research Institute (R)
+// Copyright (C) 2019 Intel Corporation.
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
/* This file was generated by util/qfloat16-tables/gen_qfloat16_tables.cpp */
diff --git a/src/corelib/global/qforeach.h b/src/corelib/global/qforeach.h
new file mode 100644
index 0000000000..ab0e20b989
--- /dev/null
+++ b/src/corelib/global/qforeach.h
@@ -0,0 +1,84 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// Copyright (C) 2019 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QFOREACH_H
+#define QFOREACH_H
+
+#include <QtCore/qtclasshelpermacros.h>
+#include <QtCore/qtconfigmacros.h>
+#include <QtCore/qtdeprecationmarkers.h>
+#include <QtCore/qttypetraits.h>
+
+QT_BEGIN_NAMESPACE
+
+#if 0
+#pragma qt_class(QForeach)
+#pragma qt_sync_stop_processing
+#endif
+
+#ifndef QT_NO_FOREACH
+
+namespace QtPrivate {
+
+template <typename T>
+class QForeachContainer {
+ Q_DISABLE_COPY_MOVE(QForeachContainer)
+public:
+ QForeachContainer(const T &t) : c(t), i(std::as_const(c).begin()), e(std::as_const(c).end()) {}
+ QForeachContainer(T &&t) : c(std::move(t)), i(std::as_const(c).begin()), e(std::as_const(c).end()) {}
+
+ T c;
+ typename T::const_iterator i, e;
+};
+
+// Containers that have a detach function are considered shared, and are OK in a foreach loop
+template <typename T, typename = decltype(std::declval<T>().detach())>
+inline void warnIfContainerIsNotShared(int) {}
+
+#if QT_DEPRECATED_SINCE(6, 0)
+// Other containers will copy themselves if used in foreach, this use is deprecated
+template <typename T>
+QT_DEPRECATED_VERSION_X_6_0("Do not use foreach/Q_FOREACH with containers which are not implicitly shared. "
+ "Prefer using a range-based for loop with these containers: `for (const auto &it : container)`, "
+ "keeping in mind that range-based for doesn't copy the container as Q_FOREACH does")
+inline void warnIfContainerIsNotShared(...) {}
+#endif
+
+template<typename T>
+QForeachContainer<typename std::decay<T>::type> qMakeForeachContainer(T &&t)
+{
+ warnIfContainerIsNotShared<typename std::decay<T>::type>(0);
+ return QForeachContainer<typename std::decay<T>::type>(std::forward<T>(t));
+}
+
+}
+
+// Use C++17 if statement with initializer. User's code ends up in a else so
+// scoping of different ifs is not broken
+#define Q_FOREACH_IMPL(variable, name, container) \
+ for (auto name = QtPrivate::qMakeForeachContainer(container); name.i != name.e; ++name.i) \
+ if (variable = *name.i; false) {} else
+
+#define Q_FOREACH_JOIN(A, B) Q_FOREACH_JOIN_IMPL(A, B)
+#define Q_FOREACH_JOIN_IMPL(A, B) A ## B
+
+#define Q_FOREACH(variable, container) \
+ Q_FOREACH_IMPL(variable, Q_FOREACH_JOIN(_container_, __LINE__), container)
+#endif // QT_NO_FOREACH
+
+#define Q_FOREVER for(;;)
+#ifndef QT_NO_KEYWORDS
+# ifndef QT_NO_FOREACH
+# ifndef foreach
+# define foreach Q_FOREACH
+# endif
+# endif // QT_NO_FOREACH
+# ifndef forever
+# define forever Q_FOREVER
+# endif
+#endif
+
+QT_END_NAMESPACE
+
+#endif /* QFOREACH_H */
diff --git a/src/corelib/global/qforeach.qdoc b/src/corelib/global/qforeach.qdoc
new file mode 100644
index 0000000000..e6abf0e29c
--- /dev/null
+++ b/src/corelib/global/qforeach.qdoc
@@ -0,0 +1,72 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
+
+/*!
+ \macro forever
+ \relates <QForeach>
+
+ This macro is provided for convenience for writing infinite
+ loops.
+
+ Example:
+
+ \snippet code/src_corelib_global_qglobal.cpp 31
+
+ It is equivalent to \c{for (;;)}.
+
+ If you're worried about namespace pollution, you can disable this
+ macro by adding the following line to your \c .pro file:
+
+ \snippet code/src_corelib_global_qglobal.cpp 32
+
+ If using other build systems, you can add \c QT_NO_KEYWORDS to the
+ list of pre-defined macros.
+
+ \sa Q_FOREVER
+*/
+
+/*!
+ \macro Q_FOREVER
+ \relates <QForeach>
+
+ Same as \l{forever}.
+
+ This macro is available even when \c no_keywords is specified
+ using the \c .pro file's \c CONFIG variable.
+
+ \sa foreach()
+*/
+
+/*!
+ \macro foreach(variable, container)
+ \relates <QForeach>
+
+ This macro is used to implement Qt's \c foreach loop. The \a
+ variable parameter is a variable name or variable definition; the
+ \a container parameter is a Qt container whose value type
+ corresponds to the type of the variable. See \l{The foreach
+ Keyword} for details.
+
+ If you're worried about namespace pollution, you can disable this
+ macro by adding the following line to your \c .pro file:
+
+ \snippet code/src_corelib_global_qglobal.cpp 33
+
+ \note Since Qt 5.7, the use of this macro is discouraged.
+ Use C++11 range-based \c for, possibly with \c {std::as_const()},
+ as needed.
+*/
+
+/*!
+ \macro Q_FOREACH(variable, container)
+ \relates <QForeach>
+
+ Same as foreach(\a variable, \a container).
+
+ This macro is available even when \c no_keywords is specified
+ using the \c .pro file's \c CONFIG variable.
+
+ \note Since Qt 5.7, the use of this macro is discouraged.
+ Use C++11 range-based \c for, possibly with \c {std::as_const()},
+ as needed.
+*/
diff --git a/src/corelib/global/qfunctionpointer.h b/src/corelib/global/qfunctionpointer.h
new file mode 100644
index 0000000000..3884954f89
--- /dev/null
+++ b/src/corelib/global/qfunctionpointer.h
@@ -0,0 +1,23 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QFUNCTIONPOINTER_H
+#define QFUNCTIONPOINTER_H
+
+#include <QtCore/qtconfigmacros.h>
+
+#if 0
+#pragma qt_class(QFunctionPointer)
+#endif
+
+#if defined(__cplusplus)
+
+QT_BEGIN_NAMESPACE
+
+typedef void (*QFunctionPointer)();
+
+QT_END_NAMESPACE
+
+#endif // __cplusplus
+
+#endif // QFUNCTIONPOINTER_H
diff --git a/src/corelib/global/qfunctionpointer.qdoc b/src/corelib/global/qfunctionpointer.qdoc
new file mode 100644
index 0000000000..13f82bc011
--- /dev/null
+++ b/src/corelib/global/qfunctionpointer.qdoc
@@ -0,0 +1,9 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
+
+/*! \typedef QFunctionPointer
+ \relates <QFunctionPointer>
+
+ This is a typedef for \c{void (*)()}, a pointer to a function that takes
+ no arguments and returns void.
+*/
diff --git a/src/corelib/global/qglobal.cpp b/src/corelib/global/qglobal.cpp
index 7cb472a6b5..222c008f8a 100644
--- a/src/corelib/global/qglobal.cpp
+++ b/src/corelib/global/qglobal.cpp
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Copyright (C) 2017 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// Copyright (C) 2017 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qplatformdefs.h"
#include "qstring.h"
@@ -44,34 +8,10 @@
#include "qlist.h"
#include "qdir.h"
#include "qdatetime.h"
-#include "qoperatingsystemversion.h"
-#include "qoperatingsystemversion_p.h"
-#if defined(Q_OS_WIN) || defined(Q_OS_CYGWIN)
-# include "qoperatingsystemversion_win_p.h"
-# include "private/qwinregistry_p.h"
-#endif // Q_OS_WIN || Q_OS_CYGWIN
#include <private/qlocale_tools_p.h>
#include "qnativeinterface.h"
#include "qnativeinterface_p.h"
-#include <qmutex.h>
-#include <QtCore/private/qlocking_p.h>
-
-#include <stdlib.h>
-#include <limits.h>
-#include <stdarg.h>
-#include <string.h>
-
-#include <exception> // For std::terminate
-#ifndef QT_NO_EXCEPTIONS
-#include <new> // For std::bad_alloc
-#endif
-
-#include <errno.h>
-#if defined(Q_CC_MSVC)
-# include <crtdbg.h>
-#endif
-
#ifdef Q_OS_WIN
# include <qt_windows.h>
#endif
@@ -80,28 +20,6 @@
# include <envLib.h>
#endif
-#ifdef Q_OS_ANDROID
-#include <qjniobject.h>
-#endif
-
-#if defined(Q_OS_SOLARIS)
-# include <sys/systeminfo.h>
-#endif
-
-#if defined(Q_OS_DARWIN) && __has_include(<IOKit/IOKitLib.h>)
-# include <IOKit/IOKitLib.h>
-# include <private/qcore_mac_p.h>
-#endif
-
-#ifdef Q_OS_UNIX
-#include <sys/utsname.h>
-#include <private/qcore_unix_p.h>
-#endif
-
-#ifdef Q_OS_BSD4
-#include <sys/sysctl.h>
-#endif
-
#if defined(Q_OS_INTEGRITY)
extern "C" {
// Function mmap resides in libshm_client.a. To be able to link with it one needs
@@ -115,3209 +33,67 @@ extern "C" {
}
#endif
-#include "archdetect.cpp"
-
-#ifdef qFatal
-// the qFatal in this file are just redirections from elsewhere, so
-// don't capture any context again
-# undef qFatal
-#endif
-
QT_BEGIN_NAMESPACE
-// Statically check assumptions about the environment we're running
-// in. The idea here is to error or warn if otherwise implicit Qt
-// assumptions are not fulfilled on new hardware or compilers
-// (if this list becomes too long, consider factoring into a separate file)
-static_assert(UCHAR_MAX == 255, "Qt assumes that char is 8 bits");
-static_assert(sizeof(int) == 4, "Qt assumes that int is 32 bits");
-static_assert(QT_POINTER_SIZE == sizeof(void *), "QT_POINTER_SIZE defined incorrectly");
-static_assert(sizeof(float) == 4, "Qt assumes that float is 32 bits");
-static_assert(sizeof(char16_t) == 2, "Qt assumes that char16_t is 16 bits");
-static_assert(sizeof(char32_t) == 4, "Qt assumes that char32_t is 32 bits");
-#if defined(Q_OS_WIN)
-static_assert(sizeof(wchar_t) == sizeof(char16_t));
-#endif
-static_assert(std::numeric_limits<int>::radix == 2,
- "Qt assumes binary integers");
-static_assert((std::numeric_limits<int>::max() + std::numeric_limits<int>::lowest()) == -1,
- "Qt assumes two's complement integers");
-static_assert(sizeof(wchar_t) == sizeof(char32_t) || sizeof(wchar_t) == sizeof(char16_t),
- "Qt assumes wchar_t is compatible with either char32_t or char16_t");
-
-// While we'd like to check for __STDC_IEC_559__, as per ISO/IEC 9899:2011
-// Annex F (C11, normative for C++11), there are a few corner cases regarding
-// denormals where GHS compiler is relying hardware behavior that is not IEC
-// 559 compliant. So split the check in several subchecks.
-
-// On GHS the compiler reports std::numeric_limits<float>::is_iec559 as false.
-// This is all right according to our needs.
-#if !defined(Q_CC_GHS)
-static_assert(std::numeric_limits<float>::is_iec559,
- "Qt assumes IEEE 754 floating point");
-#endif
-
-// Technically, presence of NaN and infinities are implied from the above check,
-// but double checking our environment doesn't hurt...
-static_assert(std::numeric_limits<float>::has_infinity &&
- std::numeric_limits<float>::has_quiet_NaN &&
- std::numeric_limits<float>::has_signaling_NaN,
- "Qt assumes IEEE 754 floating point");
-
-// is_iec559 checks for ISO/IEC/IEEE 60559:2011 (aka IEEE 754-2008) compliance,
-// but that allows for a non-binary radix. We need to recheck that.
-// Note how __STDC_IEC_559__ would instead check for IEC 60559:1989, aka
-// ANSI/IEEE 754−1985, which specifically implies binary floating point numbers.
-static_assert(std::numeric_limits<float>::radix == 2,
- "Qt assumes binary IEEE 754 floating point");
-
-// not required by the definition of size_t, but we depend on this
-static_assert(sizeof(size_t) == sizeof(void *), "size_t and a pointer don't have the same size");
-static_assert(sizeof(size_t) == sizeof(qsizetype)); // implied by the definition
-static_assert((std::is_same<qsizetype, qptrdiff>::value));
-
-// Check that our own typedefs are not broken.
-static_assert(sizeof(qint8) == 1, "Internal error, qint8 is misdefined");
-static_assert(sizeof(qint16)== 2, "Internal error, qint16 is misdefined");
-static_assert(sizeof(qint32) == 4, "Internal error, qint32 is misdefined");
-static_assert(sizeof(qint64) == 8, "Internal error, qint64 is misdefined");
-
-/*!
- \class QFlag
- \inmodule QtCore
- \brief The QFlag class is a helper data type for QFlags.
-
- It is equivalent to a plain \c int, except with respect to
- function overloading and type conversions. You should never need
- to use this class in your applications.
-
- \sa QFlags
-*/
-
-/*!
- \fn QFlag::QFlag(int value)
-
- Constructs a QFlag object that stores the \a value.
-*/
-
-/*!
- \fn QFlag::QFlag(uint value)
- \since 5.3
-
- Constructs a QFlag object that stores the \a value.
-*/
-
-/*!
- \fn QFlag::QFlag(short value)
- \since 5.3
-
- Constructs a QFlag object that stores the \a value.
-*/
-
-/*!
- \fn QFlag::QFlag(ushort value)
- \since 5.3
-
- Constructs a QFlag object that stores the \a value.
-*/
-
-/*!
- \fn QFlag::operator int() const
-
- Returns the value stored by the QFlag object.
-*/
-
-/*!
- \fn QFlag::operator uint() const
- \since 5.3
-
- Returns the value stored by the QFlag object.
-*/
-
-/*!
- \class QFlags
- \inmodule QtCore
- \brief The QFlags class provides a type-safe way of storing
- OR-combinations of enum values.
-
-
- \ingroup tools
-
- The QFlags<Enum> class is a template class, where Enum is an enum
- type. QFlags is used throughout Qt for storing combinations of
- enum values.
-
- The traditional C++ approach for storing OR-combinations of enum
- values is to use an \c int or \c uint variable. The inconvenience
- with this approach is that there's no type checking at all; any
- enum value can be OR'd with any other enum value and passed on to
- a function that takes an \c int or \c uint.
-
- Qt uses QFlags to provide type safety. For example, the
- Qt::Alignment type is simply a typedef for
- QFlags<Qt::AlignmentFlag>. QLabel::setAlignment() takes a
- Qt::Alignment parameter, which means that any combination of
- Qt::AlignmentFlag values, or \c{{ }}, is legal:
-
- \snippet code/src_corelib_global_qglobal.cpp 0
-
- If you try to pass a value from another enum or just a plain
- integer other than 0, the compiler will report an error. If you
- need to cast integer values to flags in a untyped fashion, you can
- use the explicit QFlags constructor as cast operator.
-
- If you want to use QFlags for your own enum types, use
- the Q_DECLARE_FLAGS() and Q_DECLARE_OPERATORS_FOR_FLAGS().
-
- Example:
-
- \snippet code/src_corelib_global_qglobal.cpp 1
-
- You can then use the \c MyClass::Options type to store
- combinations of \c MyClass::Option values.
-
- \section1 Flags and the Meta-Object System
-
- The Q_DECLARE_FLAGS() macro does not expose the flags to the meta-object
- system, so they cannot be used by Qt Script or edited in Qt Designer.
- To make the flags available for these purposes, the Q_FLAG() macro must
- be used:
-
- \snippet code/src_corelib_global_qglobal.cpp meta-object flags
-
- \section1 Naming Convention
-
- A sensible naming convention for enum types and associated QFlags
- types is to give a singular name to the enum type (e.g., \c
- Option) and a plural name to the QFlags type (e.g., \c Options).
- When a singular name is desired for the QFlags type (e.g., \c
- Alignment), you can use \c Flag as the suffix for the enum type
- (e.g., \c AlignmentFlag).
-
- \sa QFlag
-*/
-
-/*!
- \typedef QFlags::Int
- \since 5.0
-
- Typedef for the integer type used for storage as well as for
- implicit conversion. Either \c int or \c{unsigned int}, depending
- on whether the enum's underlying type is signed or unsigned.
-*/
-
-/*!
- \typedef QFlags::enum_type
-
- Typedef for the Enum template type.
-*/
-
-/*!
- \fn template<typename Enum> QFlags<Enum>::QFlags(const QFlags &other)
-
- Constructs a copy of \a other.
-*/
-
-/*!
- \fn template <typename Enum> QFlags<Enum>::QFlags(Enum flags)
-
- Constructs a QFlags object storing the \a flags.
-*/
-
-/*!
- \fn template <typename Enum> QFlags<Enum>::QFlags()
- \since 5.15
-
- Constructs a QFlags object with no flags set.
-*/
-
-/*!
- \fn template <typename Enum> QFlags<Enum>::QFlags(QFlag flag)
-
- Constructs a QFlags object initialized with the integer \a flag.
-
- The QFlag type is a helper type. By using it here instead of \c
- int, we effectively ensure that arbitrary enum values cannot be
- cast to a QFlags, whereas untyped enum values (i.e., \c int
- values) can.
-*/
-
-/*!
- \fn template <typename Enum> QFlags<Enum>::QFlags(std::initializer_list<Enum> flags)
- \since 5.4
-
- Constructs a QFlags object initialized with all \a flags
- combined using the bitwise OR operator.
-
- \sa operator|=(), operator|()
-*/
-
-/*!
- \fn template <typename Enum> QFlags &QFlags<Enum>::operator=(const QFlags &other)
-
- Assigns \e other to this object and returns a reference to this
- object.
-*/
-
-/*!
- \fn template <typename Enum> QFlags &QFlags<Enum>::operator&=(int mask)
-
- Performs a bitwise AND operation with \a mask and stores the
- result in this QFlags object. Returns a reference to this object.
-
- \sa operator&(), operator|=(), operator^=()
-*/
-
-/*!
- \fn template <typename Enum> QFlags &QFlags<Enum>::operator&=(uint mask)
-
- \overload
-*/
-
-/*!
- \fn template <typename Enum> QFlags &QFlags<Enum>::operator&=(Enum mask)
-
- \overload
-*/
-
-/*!
- \fn template <typename Enum> QFlags &QFlags<Enum>::operator&=(QFlags mask)
- \since 6.2
-
- \overload
-*/
-
-/*!
- \fn template <typename Enum> QFlags &QFlags<Enum>::operator|=(QFlags other)
-
- Performs a bitwise OR operation with \a other and stores the
- result in this QFlags object. Returns a reference to this object.
-
- \sa operator|(), operator&=(), operator^=()
-*/
-
-/*!
- \fn template <typename Enum> QFlags &QFlags<Enum>::operator|=(Enum other)
-
- \overload
-*/
-
-/*!
- \fn template <typename Enum> QFlags &QFlags<Enum>::operator^=(QFlags other)
-
- Performs a bitwise XOR operation with \a other and stores the
- result in this QFlags object. Returns a reference to this object.
-
- \sa operator^(), operator&=(), operator|=()
-*/
-
-/*!
- \fn template <typename Enum> QFlags &QFlags<Enum>::operator^=(Enum other)
-
- \overload
-*/
-
-/*!
- \fn template <typename Enum> QFlags<Enum>::operator Int() const
-
- Returns the value stored in the QFlags object as an integer.
-
- \sa Int
-*/
-
-/*!
- \fn template <typename Enum> QFlags QFlags<Enum>::operator|(QFlags other) const
-
- Returns a QFlags object containing the result of the bitwise OR
- operation on this object and \a other.
-
- \sa operator|=(), operator^(), operator&(), operator~()
-*/
-
-/*!
- \fn template <typename Enum> QFlags QFlags<Enum>::operator|(Enum other) const
-
- \overload
-*/
-
-/*!
- \fn template <typename Enum> QFlags QFlags<Enum>::operator^(QFlags other) const
-
- Returns a QFlags object containing the result of the bitwise XOR
- operation on this object and \a other.
-
- \sa operator^=(), operator&(), operator|(), operator~()
-*/
-
-/*!
- \fn template <typename Enum> QFlags QFlags<Enum>::operator^(Enum other) const
-
- \overload
-*/
-
-/*!
- \fn template <typename Enum> QFlags QFlags<Enum>::operator&(int mask) const
-
- Returns a QFlags object containing the result of the bitwise AND
- operation on this object and \a mask.
-
- \sa operator&=(), operator|(), operator^(), operator~()
-*/
-
-/*!
- \fn template <typename Enum> QFlags QFlags<Enum>::operator&(uint mask) const
-
- \overload
-*/
-
-/*!
- \fn template <typename Enum> QFlags QFlags<Enum>::operator&(Enum mask) const
-
- \overload
-*/
-
-/*!
- \fn template <typename Enum> QFlags QFlags<Enum>::operator&(QFlags mask) const
- \since 6.2
-
- \overload
-*/
-
-/*!
- \fn template <typename Enum> QFlags QFlags<Enum>::operator~() const
-
- Returns a QFlags object that contains the bitwise negation of
- this object.
-
- \sa operator&(), operator|(), operator^()
-*/
-
-/*!
- \fn template <typename Enum> bool QFlags<Enum>::operator!() const
-
- Returns \c true if no flag is set (i.e., if the value stored by the
- QFlags object is 0); otherwise returns \c false.
-*/
-
-/*!
- \fn template <typename Enum> bool QFlags<Enum>::testFlag(Enum flag) const
- \since 4.2
-
- Returns \c true if the flag \a flag is set, otherwise \c false.
-
- \note if \a flag contains multiple bits set to 1 (for instance, if
- it's an enumerator equal to the bitwise-OR of other enumerators)
- then this function will return \c true if and only if all the bits
- are set in this flags object. On the other hand, if \a flag contains
- no bits set to 1 (that is, its value as a integer is 0), then this
- function will return \c true if and only if this flags object also
- has no bits set to 1.
-
- \sa testAnyFlag()
-*/
-
-/*!
- \fn template <typename Enum> bool QFlags<Enum>::testFlags(QFlags flags) const noexcept
- \since 6.2
-
- Returns \c true if this flags object matches the given \a flags.
-
- If \a flags has any flags set, this flags object matches precisely
- if all flags set in \a flags are also set in this flags object.
- Otherwise, when \a flags has no flags set, this flags object only
- matches if it also has no flags set.
-
- \sa testAnyFlags()
-*/
-
-/*!
- \fn template <typename Enum> bool QFlags<Enum>::testAnyFlag(Enum flag) const noexcept
- \since 6.2
-
- Returns \c true if \b any flag set in \a flag is also set in this
- flags object, otherwise \c false. If \a flag has no flags set, the
- return will always be \c false.
-
- \sa testFlag()
-*/
-
-/*!
- \fn template <typename Enum> bool QFlags<Enum>::testAnyFlags(QFlags flags) const noexcept
- \since 6.2
-
- Returns \c true if \b any flag set in \a flags is also set in this
- flags object, otherwise \c false. If \a flags has no flags set, the
- return will always be \c false.
-
- \sa testFlags()
-*/
-
-/*!
- \fn template <typename Enum> QFlags QFlags<Enum>::setFlag(Enum flag, bool on)
- \since 5.7
-
- Sets the flag \a flag if \a on is \c true or unsets it if
- \a on is \c false. Returns a reference to this object.
-*/
-
-/*!
- \fn template <typename Enum> QFlags<Enum> QFlags<Enum>::fromInt(Int i) noexcept
- \since 6.2
-
- Constructs a QFlags object representing the integer value \a i.
-*/
-
-/*!
- \fn template <typename Enum> Int QFlags<Enum>::toInt() const noexcept
- \since 6.2
-
- Returns the value stored in the QFlags object as an integer. Note
- that the returned integer may be signed or unsigned, depending on
- whether the enum's underlying type is signed or unsigned.
-
- \sa Int
-*/
-
-/*!
- \fn template <typename Enum> size_t qHash(QFlags<Enum> flags, size_t seed = 0) noexcept
- \since 6.2
- \relates QFlags
-
- Calculates the hash for the flags \a flags, using \a seed
- to seed the calculation.
-*/
-
-/*!
- \fn template <typename Enum> bool operator==(QFlags<Enum> lhs, QFlags<Enum> rhs)
- \fn template <typename Enum> bool operator==(QFlags<Enum> lhs, Enum rhs)
- \fn template <typename Enum> bool operator==(Enum lhs, QFlags<Enum> rhs)
- \since 6.2
- \relates QFlags
-
- Compares \a lhs and \a rhs for equality; the two arguments are
- considered equal if they represent exactly the same value
- (bitmask).
-*/
-
-/*!
- \fn template <typename Enum> bool operator!=(QFlags<Enum> lhs, QFlags<Enum> rhs)
- \fn template <typename Enum> bool operator!=(QFlags<Enum> lhs, Enum rhs)
- \fn template <typename Enum> bool operator!=(Enum lhs, QFlags<Enum> rhs)
- \since 6.2
- \relates QFlags
-
- Compares \a lhs and \a rhs for inequality; the two arguments are
- considered different if they don't represent exactly the same value
- (bitmask).
-*/
-
-/*!
- \macro Q_DISABLE_COPY(Class)
- \relates QObject
-
- Disables the use of copy constructors and assignment operators
- for the given \a Class.
-
- Instances of subclasses of QObject should not be thought of as
- values that can be copied or assigned, but as unique identities.
- This means that when you create your own subclass of QObject
- (director or indirect), you should \e not give it a copy constructor
- or an assignment operator. However, it may not enough to simply
- omit them from your class, because, if you mistakenly write some code
- that requires a copy constructor or an assignment operator (it's easy
- to do), your compiler will thoughtfully create it for you. You must
- do more.
-
- The curious user will have seen that the Qt classes derived
- from QObject typically include this macro in a private section:
-
- \snippet code/src_corelib_global_qglobal.cpp 43
-
- It declares a copy constructor and an assignment operator in the
- private section, so that if you use them by mistake, the compiler
- will report an error.
-
- \snippet code/src_corelib_global_qglobal.cpp 44
-
- But even this might not catch absolutely every case. You might be
- tempted to do something like this:
-
- \snippet code/src_corelib_global_qglobal.cpp 45
-
- First of all, don't do that. Most compilers will generate code that
- uses the copy constructor, so the privacy violation error will be
- reported, but your C++ compiler is not required to generate code for
- this statement in a specific way. It could generate code using
- \e{neither} the copy constructor \e{nor} the assignment operator we
- made private. In that case, no error would be reported, but your
- application would probably crash when you called a member function
- of \c{w}.
-
- \sa Q_DISABLE_COPY_MOVE
-*/
-
-/*!
- \macro Q_DISABLE_COPY_MOVE(Class)
- \relates QObject
-
- A convenience macro that disables the use of copy constructors, assignment
- operators, move constructors and move assignment operators for the given
- \a Class.
-
- \sa Q_DISABLE_COPY
- \since 5.13
-*/
-
-/*!
- \macro Q_DECLARE_FLAGS(Flags, Enum)
- \relates QFlags
-
- The Q_DECLARE_FLAGS() macro expands to
-
- \snippet code/src_corelib_global_qglobal.cpp 2
-
- \a Enum is the name of an existing enum type, whereas \a Flags is
- the name of the QFlags<\e{Enum}> typedef.
-
- See the QFlags documentation for details.
-
- \sa Q_DECLARE_OPERATORS_FOR_FLAGS()
-*/
-
-/*!
- \macro Q_DECLARE_OPERATORS_FOR_FLAGS(Flags)
- \relates QFlags
-
- The Q_DECLARE_OPERATORS_FOR_FLAGS() macro declares global \c
- operator|() functions for \a Flags, which is of type QFlags<T>.
-
- See the QFlags documentation for details.
-
- \sa Q_DECLARE_FLAGS()
-*/
+using namespace Qt::StringLiterals;
/*!
\headerfile <QtGlobal>
+ \inmodule QtCore
\title Global Qt Declarations
\ingroup funclists
- \brief The <QtGlobal> header file includes the fundamental global
- declarations. It is included by most other Qt header files.
-
- The global declarations include \l{types}, \l{functions} and
- \l{macros}.
-
- The type definitions are partly convenience definitions for basic
- types (some of which guarantee certain bit-sizes on all platforms
- supported by Qt), partly types related to Qt message handling. The
- functions are related to generating messages, Qt version handling
- and comparing and adjusting object values. And finally, some of
- the declared macros enable programmers to add compiler or platform
- specific code to their applications, while others are convenience
- macros for larger operations.
-
- \section1 Types
-
- The header file declares several type definitions that guarantee a
- specified bit-size on all platforms supported by Qt for various
- basic types, for example \l qint8 which is a signed char
- guaranteed to be 8-bit on all platforms supported by Qt. The
- header file also declares the \l qlonglong type definition for \c
- {long long int } (\c __int64 on Windows).
-
- Several convenience type definitions are declared: \l qreal for \c
- double or \c float, \l uchar for \c unsigned char, \l uint for \c unsigned
- int, \l ulong for \c unsigned long and \l ushort for \c unsigned
- short.
-
- Finally, the QtMsgType definition identifies the various messages
- that can be generated and sent to a Qt message handler;
- QtMessageHandler is a type definition for a pointer to a function with
- the signature
- \c {void myMessageHandler(QtMsgType, const QMessageLogContext &, const char *)}.
- QMessageLogContext class contains the line, file, and function the
- message was logged at. This information is created by the QMessageLogger
- class.
-
- \section1 Functions
-
- The <QtGlobal> header file contains several functions comparing
- and adjusting an object's value. These functions take a template
- type as argument: You can retrieve the absolute value of an object
- using the qAbs() function, and you can bound a given object's
- value by given minimum and maximum values using the qBound()
- function. You can retrieve the minimum and maximum of two given
- objects using qMin() and qMax() respectively. All these functions
- return a corresponding template type; the template types can be
- replaced by any other type.
-
- Example:
-
- \snippet code/src_corelib_global_qglobal.cpp 3
-
- <QtGlobal> also contains functions that generate messages from the
- given string argument: qDebug(), qInfo(), qWarning(), qCritical(),
- and qFatal(). These functions call the message handler
- with the given message.
-
- Example:
-
- \snippet code/src_corelib_global_qglobal.cpp 4
-
- The remaining functions are qRound() and qRound64(), which both
- accept a \c double or \c float value as their argument returning
- the value rounded up to the nearest integer and 64-bit integer
- respectively, the qInstallMessageHandler() function which installs
- the given QtMessageHandler, and the qVersion() function which
- returns the version number of Qt at runtime as a string.
-
- \section1 Macros
-
- The <QtGlobal> header file provides a range of macros (Q_CC_*)
- that are defined if the application is compiled using the
- specified platforms. For example, the Q_CC_SUN macro is defined if
- the application is compiled using Forte Developer, or Sun Studio
- C++. The header file also declares a range of macros (Q_OS_*)
- that are defined for the specified platforms. For example,
- Q_OS_UNIX which is defined for the Unix-based systems.
-
- The purpose of these macros is to enable programmers to add
- compiler or platform specific code to their application.
-
- The remaining macros are convenience macros for larger operations:
- The QT_TR_NOOP(), QT_TRANSLATE_NOOP(), and QT_TRANSLATE_NOOP3()
- macros provide the possibility of marking strings for delayed
- translation. QT_TR_N_NOOP(), QT_TRANSLATE_N_NOOP(), and
- QT_TRANSLATE_N_NOOP3() are numerator dependent variants of these.
- The Q_ASSERT() and Q_ASSERT_X() enables warning messages of various
- level of refinement. The Q_FOREACH() and foreach() macros
- implement Qt's foreach loop.
-
- The Q_INT64_C() and Q_UINT64_C() macros wrap signed and unsigned
- 64-bit integer literals in a platform-independent way. The
- Q_CHECK_PTR() macro prints a warning containing the source code's
- file name and line number, saying that the program ran out of
- memory, if the pointer is \nullptr. The qPrintable() and qUtf8Printable()
- macros represent an easy way of printing text.
-
- The QT_POINTER_SIZE macro expands to the size of a pointer in bytes.
-
- The macros QT_VERSION and QT_VERSION_STR expand to a numeric value or a
- string, respectively. These identify the version of Qt that the application
- is compiled with.
-
- \sa <QtAlgorithms>, QSysInfo
-*/
-
-/*!
- \typedef qreal
- \relates <QtGlobal>
-
- Typedef for \c double unless Qt is configured with the
- \c{-qreal float} option.
-*/
-
-/*! \typedef uchar
- \relates <QtGlobal>
-
- Convenience typedef for \c{unsigned char}.
-*/
-
-/*! \typedef ushort
- \relates <QtGlobal>
-
- Convenience typedef for \c{unsigned short}.
-*/
-
-/*! \typedef uint
- \relates <QtGlobal>
-
- Convenience typedef for \c{unsigned int}.
-*/
-
-/*! \typedef ulong
- \relates <QtGlobal>
-
- Convenience typedef for \c{unsigned long}.
-*/
-
-/*! \typedef qint8
- \relates <QtGlobal>
-
- Typedef for \c{signed char}. This type is guaranteed to be 8-bit
- on all platforms supported by Qt.
-*/
-
-/*!
- \typedef quint8
- \relates <QtGlobal>
-
- Typedef for \c{unsigned char}. This type is guaranteed to
- be 8-bit on all platforms supported by Qt.
-*/
-
-/*! \typedef qint16
- \relates <QtGlobal>
-
- Typedef for \c{signed short}. This type is guaranteed to be
- 16-bit on all platforms supported by Qt.
-*/
-
-/*!
- \typedef quint16
- \relates <QtGlobal>
-
- Typedef for \c{unsigned short}. This type is guaranteed to
- be 16-bit on all platforms supported by Qt.
-*/
-
-/*! \typedef qint32
- \relates <QtGlobal>
-
- Typedef for \c{signed int}. This type is guaranteed to be 32-bit
- on all platforms supported by Qt.
-*/
-
-/*!
- \typedef quint32
- \relates <QtGlobal>
-
- Typedef for \c{unsigned int}. This type is guaranteed to
- be 32-bit on all platforms supported by Qt.
-*/
-
-/*! \typedef qint64
- \relates <QtGlobal>
-
- Typedef for \c{long long int}. This type is guaranteed to be 64-bit
- on all platforms supported by Qt.
-
- Literals of this type can be created using the Q_INT64_C() macro:
-
- \snippet code/src_corelib_global_qglobal.cpp 5
-
- \sa Q_INT64_C(), quint64, qlonglong
-*/
-
-/*!
- \typedef quint64
- \relates <QtGlobal>
-
- Typedef for \c{unsigned long long int}. This type is guaranteed to
- be 64-bit on all platforms supported by Qt.
-
- Literals of this type can be created using the Q_UINT64_C()
- macro:
-
- \snippet code/src_corelib_global_qglobal.cpp 6
-
- \sa Q_UINT64_C(), qint64, qulonglong
-*/
-
-/*!
- \typedef qintptr
- \relates <QtGlobal>
-
- Integral type for representing pointers in a signed integer (useful for
- hashing, etc.).
-
- Typedef for either qint32 or qint64. This type is guaranteed to
- be the same size as a pointer on all platforms supported by Qt. On
- a system with 32-bit pointers, qintptr is a typedef for qint32;
- on a system with 64-bit pointers, qintptr is a typedef for
- qint64.
-
- Note that qintptr is signed. Use quintptr for unsigned values.
-
- In order to print values of this type by using formatted-output
- facilities such as \c{printf()}, qDebug(), QString::asprintf() and
- so on, you can use the \c{PRIdQINTPTR} and \c{PRIiQINTPTR}
- macros as format specifiers. They will both print the value as a
- base 10 number.
-
- \code
- qintptr p = 123;
- printf("The pointer is %" PRIdQINTPTR "\n", p);
- \endcode
-
- \sa qptrdiff, qint32, qint64
-*/
-
-/*!
- \macro PRIdQINTPTR
- \macro PRIiQINTPTR
- \since 6.2
- \relates <QtGlobal>
-
- See qintptr.
-*/
-
-/*!
- \typedef quintptr
- \relates <QtGlobal>
-
- Integral type for representing pointers in an unsigned integer (useful for
- hashing, etc.).
-
- Typedef for either quint32 or quint64. This type is guaranteed to
- be the same size as a pointer on all platforms supported by Qt. On
- a system with 32-bit pointers, quintptr is a typedef for quint32;
- on a system with 64-bit pointers, quintptr is a typedef for
- quint64.
-
- Note that quintptr is unsigned. Use qptrdiff for signed values.
-
- In order to print values of this type by using formatted-output
- facilities such as \c{printf()}, qDebug(), QString::asprintf() and
- so on, you can use the following macros as format specifiers:
-
- \list
- \li \c{PRIuQUINTPTR}: prints the value as a base 10 number.
- \li \c{PRIoQUINTPTR}: prints the value as a base 8 number.
- \li \c{PRIxQUINTPTR}: prints the value as a base 16 number, using lowercase \c{a-f} letters.
- \li \c{PRIXQUINTPTR}: prints the value as a base 16 number, using uppercase \c{A-F} letters.
- \endlist
-
- \code
- quintptr p = 123u;
- printf("The pointer value is 0x%" PRIXQUINTPTR "\n", p);
- \endcode
-
- \sa qptrdiff, quint32, quint64
-*/
-
-/*!
- \macro PRIoQUINTPTR
- \macro PRIuQUINTPTR
- \macro PRIxQUINTPTR
- \macro PRIXQUINTPTR
- \since 6.2
- \relates <QtGlobal>
-
- See quintptr.
-*/
-
-/*!
- \typedef qptrdiff
- \relates <QtGlobal>
-
- Integral type for representing pointer differences.
-
- Typedef for either qint32 or qint64. This type is guaranteed to be
- the same size as a pointer on all platforms supported by Qt. On a
- system with 32-bit pointers, quintptr is a typedef for quint32; on
- a system with 64-bit pointers, quintptr is a typedef for quint64.
-
- Note that qptrdiff is signed. Use quintptr for unsigned values.
-
- In order to print values of this type by using formatted-output
- facilities such as \c{printf()}, qDebug(), QString::asprintf() and
- so on, you can use the \c{PRIdQPTRDIFF} and \c{PRIiQPTRDIFF}
- macros as format specifiers. They will both print the value as a
- base 10 number.
-
- \code
- qptrdiff d = 123;
- printf("The difference is %" PRIdQPTRDIFF "\n", d);
- \endcode
-
- \sa quintptr, qint32, qint64
-*/
-
-/*!
- \macro PRIdQPTRDIFF
- \macro PRIiQPTRDIFF
- \since 6.2
- \relates <QtGlobal>
-
- See qptrdiff.
-*/
-
-/*!
- \typedef qsizetype
- \relates <QtGlobal>
- \since 5.10
-
- Integral type providing Posix' \c ssize_t for all platforms.
-
- This type is guaranteed to be the same size as a \c size_t on all
- platforms supported by Qt.
-
- Note that qsizetype is signed. Use \c size_t for unsigned values.
-
- In order to print values of this type by using formatted-output
- facilities such as \c{printf()}, qDebug(), QString::asprintf() and
- so on, you can use the \c{PRIdQSIZETYPE} and \c{PRIiQSIZETYPE}
- macros as format specifiers. They will both print the value as a
- base 10 number.
-
- \code
- qsizetype s = 123;
- printf("The size is %" PRIdQSIZETYPE "\n", s);
- \endcode
-
- \sa qptrdiff
-*/
-
-/*!
- \macro PRIdQSIZETYPE
- \macro PRIiQSIZETYPE
- \since 6.2
- \relates <QtGlobal>
-
- See qsizetype.
-*/
-
-/*!
- \enum QtMsgType
- \relates <QtGlobal>
-
- This enum describes the messages that can be sent to a message
- handler (QtMessageHandler). You can use the enum to identify and
- associate the various message types with the appropriate
- actions.
-
- \value QtDebugMsg
- A message generated by the qDebug() function.
- \value QtInfoMsg
- A message generated by the qInfo() function.
- \value QtWarningMsg
- A message generated by the qWarning() function.
- \value QtCriticalMsg
- A message generated by the qCritical() function.
- \value QtFatalMsg
- A message generated by the qFatal() function.
- \value QtSystemMsg
-
- \c QtInfoMsg was added in Qt 5.5.
-
- \sa QtMessageHandler, qInstallMessageHandler()
-*/
-
-/*! \typedef QFunctionPointer
- \relates <QtGlobal>
-
- This is a typedef for \c{void (*)()}, a pointer to a function that takes
- no arguments and returns void.
-*/
-
-/*! \macro qint64 Q_INT64_C(literal)
- \relates <QtGlobal>
-
- Wraps the signed 64-bit integer \a literal in a
- platform-independent way.
-
- Example:
-
- \snippet code/src_corelib_global_qglobal.cpp 8
-
- \sa qint64, Q_UINT64_C()
-*/
-
-/*! \macro quint64 Q_UINT64_C(literal)
- \relates <QtGlobal>
-
- Wraps the unsigned 64-bit integer \a literal in a
- platform-independent way.
-
- Example:
-
- \snippet code/src_corelib_global_qglobal.cpp 9
-
- \sa quint64, Q_INT64_C()
-*/
-
-/*! \typedef qlonglong
- \relates <QtGlobal>
-
- Typedef for \c{long long int} (\c __int64 on Windows). This is
- the same as \l qint64.
-
- \sa qulonglong, qint64
-*/
-
-/*!
- \typedef qulonglong
- \relates <QtGlobal>
-
- Typedef for \c{unsigned long long int} (\c{unsigned __int64} on
- Windows). This is the same as \l quint64.
-
- \sa quint64, qlonglong
-*/
-
-/*! \fn template <typename T> T qAbs(const T &t)
- \relates <QtGlobal>
-
- Compares \a t to the 0 of type T and returns the absolute
- value. Thus if T is \e {double}, then \a t is compared to
- \e{(double) 0}.
-
- Example:
-
- \snippet code/src_corelib_global_qglobal.cpp 10
-*/
-
-/*! \fn int qRound(double d)
- \relates <QtGlobal>
-
- Rounds \a d to the nearest integer.
-
- Rounds half away from zero (e.g. 0.5 -> 1, -0.5 -> -1).
-
- \note This function does not guarantee correctness for high precisions.
-
- Example:
-
- \snippet code/src_corelib_global_qglobal.cpp 11A
-*/
-
-/*! \fn int qRound(float d)
- \relates <QtGlobal>
-
- Rounds \a d to the nearest integer.
-
- Rounds half away from zero (e.g. 0.5f -> 1, -0.5f -> -1).
-
- \note This function does not guarantee correctness for high precisions.
-
- Example:
-
- \snippet code/src_corelib_global_qglobal.cpp 11B
-*/
-
-/*! \fn qint64 qRound64(double d)
- \relates <QtGlobal>
-
- Rounds \a d to the nearest 64-bit integer.
-
- Rounds half away from zero (e.g. 0.5 -> 1, -0.5 -> -1).
-
- \note This function does not guarantee correctness for high precisions.
-
- Example:
-
- \snippet code/src_corelib_global_qglobal.cpp 12A
-*/
-
-/*! \fn qint64 qRound64(float d)
- \relates <QtGlobal>
-
- Rounds \a d to the nearest 64-bit integer.
-
- Rounds half away from zero (e.g. 0.5f -> 1, -0.5f -> -1).
-
- \note This function does not guarantee correctness for high precisions.
-
- Example:
-
- \snippet code/src_corelib_global_qglobal.cpp 12B
-*/
-
-/*! \fn template <typename T> const T &qMin(const T &a, const T &b)
- \relates <QtGlobal>
-
- Returns the minimum of \a a and \a b.
-
- Example:
-
- \snippet code/src_corelib_global_qglobal.cpp 13
-
- \sa qMax(), qBound()
-*/
-
-/*! \fn template <typename T> const T &qMax(const T &a, const T &b)
- \relates <QtGlobal>
-
- Returns the maximum of \a a and \a b.
-
- Example:
-
- \snippet code/src_corelib_global_qglobal.cpp 14
-
- \sa qMin(), qBound()
-*/
-
-/*! \fn template <typename T> const T &qBound(const T &min, const T &val, const T &max)
- \relates <QtGlobal>
-
- Returns \a val bounded by \a min and \a max. This is equivalent
- to qMax(\a min, qMin(\a val, \a max)).
-
- Example:
-
- \snippet code/src_corelib_global_qglobal.cpp 15
-
- \sa qMin(), qMax()
-*/
-
-/*! \fn template <typename T> auto qOverload(T functionPointer)
- \relates <QtGlobal>
- \since 5.7
-
- Returns a pointer to an overloaded function. The template
- parameter is the list of the argument types of the function.
- \a functionPointer is the pointer to the (member) function:
-
- \snippet code/src_corelib_global_qglobal.cpp 52
-
- If a member function is also const-overloaded \l qConstOverload and
- \l qNonConstOverload need to be used.
-
- qOverload() requires C++14 enabled. In C++11-only code, the helper
- classes QOverload, QConstOverload, and QNonConstOverload can be used directly:
-
- \snippet code/src_corelib_global_qglobal.cpp 53
-
- \note Qt detects the necessary C++14 compiler support by way of the feature
- test recommendations from
- \l{https://isocpp.org/std/standing-documents/sd-6-sg10-feature-test-recommendations}
- {C++ Committee's Standing Document 6}.
-
- \sa qConstOverload(), qNonConstOverload(), {Differences between String-Based
- and Functor-Based Connections}
-*/
-
-/*! \fn template <typename T> auto qConstOverload(T memberFunctionPointer)
- \relates <QtGlobal>
- \since 5.7
-
- Returns the \a memberFunctionPointer pointer to a constant member function:
-
- \snippet code/src_corelib_global_qglobal.cpp 54
-
- \sa qOverload, qNonConstOverload, {Differences between String-Based
- and Functor-Based Connections}
-*/
-
-/*! \fn template <typename T> auto qNonConstOverload(T memberFunctionPointer)
- \relates <QtGlobal>
- \since 5.7
-
- Returns the \a memberFunctionPointer pointer to a non-constant member function:
-
- \snippet code/src_corelib_global_qglobal.cpp 54
-
- \sa qOverload, qNonConstOverload, {Differences between String-Based
- and Functor-Based Connections}
-*/
-
-/*!
- \macro QT_VERSION_CHECK(major, minor, patch)
- \relates <QtGlobal>
-
- Turns the \a major, \a minor and \a patch numbers of a version into an
- integer that encodes all three. When expressed in hexadecimal, this integer
- is of form \c 0xMMNNPP wherein \c{0xMM ==} \a major, \c{0xNN ==} \a minor,
- and \c{0xPP ==} \a patch. This can be compared with another similarly
- processed version ID.
-
- Example:
-
- \snippet code/src_corelib_global_qglobal.cpp qt-version-check
-
- \note the parameters are read as integers in the normal way, so should
- normally be written in decimal (so a \c 0x prefix must be used if writing
- them in hexadecimal). Thuse \c{QT_VERSION_CHECK(5, 15, 0)} is equal to \c
- 0x050e00, which could equally be written \c{QT_VERSION_CHECK(5, 0xe, 0)}.
-
- \sa QT_VERSION
-*/
-
-/*!
- \macro QT_VERSION
- \relates <QtGlobal>
-
- This macro expands to a numeric value of the same form as \l
- QT_VERSION_CHECK() constructs, that specifies the version of Qt with which
- code using it is compiled. For example, if you compile your application with
- Qt 6.1.2, the QT_VERSION macro will expand to \c 0x060102, the same as
- \c{QT_VERSION_CHECK(6, 1, 2)}. Note that this need not agree with the
- version the application will find itself using at \e runtime.
-
- You can use QT_VERSION to select the latest Qt features where available
- while falling back to older implementations otherwise. Using
- QT_VERSION_CHECK() for the value to compare with is recommended.
-
- Example:
-
- \snippet code/src_corelib_global_qglobal.cpp 16
-
- \sa QT_VERSION_STR, QT_VERSION_CHECK(), qVersion()
-*/
-
-/*!
- \macro QT_VERSION_STR
- \relates <QtGlobal>
-
- This macro expands to a string that specifies Qt's version number (for
- example, "6.1.2"). This is the version with which the application is
- compiled. This may be a different version than the version the application
- will find itself using at \e runtime.
-
- \sa qVersion(), QT_VERSION
-*/
-
-/*!
- \relates <QtGlobal>
-
- Returns the version number of Qt at runtime as a string (for example,
- "6.1.2"). This may be a different version than the version the application
- was \e compiled with.
-
- \sa QT_VERSION_STR, QLibraryInfo::version()
-*/
-
-const char *qVersion() noexcept
-{
- return QT_VERSION_STR;
-}
-
-bool qSharedBuild() noexcept
-{
-#ifdef QT_SHARED
- return true;
-#else
- return false;
-#endif
-}
-
-/*****************************************************************************
- System detection routines
- *****************************************************************************/
-
-/*!
- \class QSysInfo
- \inmodule QtCore
- \brief The QSysInfo class provides information about the system.
-
- \list
- \li \l WordSize specifies the size of a pointer for the platform
- on which the application is compiled.
- \li \l ByteOrder specifies whether the platform is big-endian or
- little-endian.
- \endlist
-
- Some constants are defined only on certain platforms. You can use
- the preprocessor symbols Q_OS_WIN and Q_OS_MACOS to test that
- the application is compiled under Windows or \macos.
-
- \sa QLibraryInfo
-*/
-
-/*!
- \enum QSysInfo::Sizes
-
- This enum provides platform-specific information about the sizes of data
- structures used by the underlying architecture.
-
- \value WordSize The size in bits of a pointer for the platform on which
- the application is compiled (32 or 64).
-*/
-
-/*!
- \enum QSysInfo::Endian
-
- \value BigEndian Big-endian byte order (also called Network byte order)
- \value LittleEndian Little-endian byte order
- \value ByteOrder Equals BigEndian or LittleEndian, depending on
- the platform's byte order.
-*/
-
-/*!
- \macro Q_OS_DARWIN
- \relates <QtGlobal>
-
- Defined on Darwin-based operating systems such as \macos, iOS, watchOS, and tvOS.
-*/
-
-/*!
- \macro Q_OS_MAC
- \relates <QtGlobal>
-
- Deprecated synonym for \c Q_OS_DARWIN. Do not use.
-*/
-
-/*!
- \macro Q_OS_OSX
- \relates <QtGlobal>
-
- Deprecated synonym for \c Q_OS_MACOS. Do not use.
-*/
-
-/*!
- \macro Q_OS_MACOS
- \relates <QtGlobal>
-
- Defined on \macos.
-*/
-
-/*!
- \macro Q_OS_IOS
- \relates <QtGlobal>
-
- Defined on iOS.
-*/
-
-/*!
- \macro Q_OS_WATCHOS
- \relates <QtGlobal>
-
- Defined on watchOS.
-*/
-
-/*!
- \macro Q_OS_TVOS
- \relates <QtGlobal>
-
- Defined on tvOS.
-*/
-
-/*!
- \macro Q_OS_WIN
- \relates <QtGlobal>
-
- Defined on all supported versions of Windows. That is, if
- \l Q_OS_WIN32 or \l Q_OS_WIN64 is defined.
-*/
-
-/*!
- \macro Q_OS_WINDOWS
- \relates <QtGlobal>
-
- This is a synonym for Q_OS_WIN.
-*/
-
-/*!
- \macro Q_OS_WIN32
- \relates <QtGlobal>
-
- Defined on 32-bit and 64-bit versions of Windows.
-*/
-
-/*!
- \macro Q_OS_WIN64
- \relates <QtGlobal>
-
- Defined on 64-bit versions of Windows.
-*/
-
-/*!
- \macro Q_OS_CYGWIN
- \relates <QtGlobal>
-
- Defined on Cygwin.
-*/
-
-/*!
- \macro Q_OS_SOLARIS
- \relates <QtGlobal>
-
- Defined on Sun Solaris.
-*/
-
-/*!
- \macro Q_OS_HPUX
- \relates <QtGlobal>
-
- Defined on HP-UX.
-*/
-
-/*!
- \macro Q_OS_LINUX
- \relates <QtGlobal>
-
- Defined on Linux.
-*/
-
-/*!
- \macro Q_OS_ANDROID
- \relates <QtGlobal>
-
- Defined on Android.
-*/
-
-/*!
- \macro Q_OS_FREEBSD
- \relates <QtGlobal>
-
- Defined on FreeBSD.
-*/
-
-/*!
- \macro Q_OS_NETBSD
- \relates <QtGlobal>
-
- Defined on NetBSD.
-*/
-
-/*!
- \macro Q_OS_OPENBSD
- \relates <QtGlobal>
-
- Defined on OpenBSD.
-*/
-
-/*!
- \macro Q_OS_AIX
- \relates <QtGlobal>
-
- Defined on AIX.
-*/
-
-/*!
- \macro Q_OS_HURD
- \relates <QtGlobal>
-
- Defined on GNU Hurd.
-*/
-
-/*!
- \macro Q_OS_QNX
- \relates <QtGlobal>
-
- Defined on QNX Neutrino.
-*/
-
-/*!
- \macro Q_OS_LYNX
- \relates <QtGlobal>
-
- Defined on LynxOS.
-*/
-
-/*!
- \macro Q_OS_BSD4
- \relates <QtGlobal>
-
- Defined on Any BSD 4.4 system.
-*/
-
-/*!
- \macro Q_OS_UNIX
- \relates <QtGlobal>
-
- Defined on Any UNIX BSD/SYSV system.
-*/
-
-/*!
- \macro Q_OS_WASM
- \relates <QtGlobal>
-
- Defined on Web Assembly.
-*/
-
-/*!
- \macro Q_CC_SYM
- \relates <QtGlobal>
-
- Defined if the application is compiled using Digital Mars C/C++
- (used to be Symantec C++).
-*/
-
-/*!
- \macro Q_CC_MSVC
- \relates <QtGlobal>
-
- Defined if the application is compiled using Microsoft Visual
- C/C++, Intel C++ for Windows.
-*/
-
-/*!
- \macro Q_CC_CLANG
- \relates <QtGlobal>
-
- Defined if the application is compiled using Clang.
-*/
-
-/*!
- \macro Q_CC_BOR
- \relates <QtGlobal>
-
- Defined if the application is compiled using Borland/Turbo C++.
-*/
-
-/*!
- \macro Q_CC_WAT
- \relates <QtGlobal>
-
- Defined if the application is compiled using Watcom C++.
-*/
-
-/*!
- \macro Q_CC_GNU
- \relates <QtGlobal>
-
- Defined if the application is compiled using GNU C++.
-*/
-
-/*!
- \macro Q_CC_COMEAU
- \relates <QtGlobal>
-
- Defined if the application is compiled using Comeau C++.
-*/
-
-/*!
- \macro Q_CC_EDG
- \relates <QtGlobal>
-
- Defined if the application is compiled using Edison Design Group
- C++.
-*/
-
-/*!
- \macro Q_CC_OC
- \relates <QtGlobal>
-
- Defined if the application is compiled using CenterLine C++.
-*/
-
-/*!
- \macro Q_CC_SUN
- \relates <QtGlobal>
-
- Defined if the application is compiled using Forte Developer, or
- Sun Studio C++.
-*/
-
-/*!
- \macro Q_CC_MIPS
- \relates <QtGlobal>
-
- Defined if the application is compiled using MIPSpro C++.
-*/
-
-/*!
- \macro Q_CC_DEC
- \relates <QtGlobal>
-
- Defined if the application is compiled using DEC C++.
-*/
-
-/*!
- \macro Q_CC_HPACC
- \relates <QtGlobal>
-
- Defined if the application is compiled using HP aC++.
-*/
-
-/*!
- \macro Q_CC_USLC
- \relates <QtGlobal>
-
- Defined if the application is compiled using SCO OUDK and UDK.
-*/
-
-/*!
- \macro Q_CC_CDS
- \relates <QtGlobal>
-
- Defined if the application is compiled using Reliant C++.
-*/
-
-/*!
- \macro Q_CC_KAI
- \relates <QtGlobal>
-
- Defined if the application is compiled using KAI C++.
-*/
-
-/*!
- \macro Q_CC_INTEL
- \relates <QtGlobal>
-
- Defined if the application is compiled using Intel C++ for Linux,
- Intel C++ for Windows.
-*/
-
-/*!
- \macro Q_CC_HIGHC
- \relates <QtGlobal>
-
- Defined if the application is compiled using MetaWare High C/C++.
-*/
-
-/*!
- \macro Q_CC_PGI
- \relates <QtGlobal>
-
- Defined if the application is compiled using Portland Group C++.
-*/
-
-/*!
- \macro Q_CC_GHS
- \relates <QtGlobal>
-
- Defined if the application is compiled using Green Hills
- Optimizing C++ Compilers.
-*/
-
-/*!
- \macro Q_PROCESSOR_ALPHA
- \relates <QtGlobal>
-
- Defined if the application is compiled for Alpha processors.
-
- \sa QSysInfo::buildCpuArchitecture()
-*/
-
-/*!
- \macro Q_PROCESSOR_ARM
- \relates <QtGlobal>
-
- Defined if the application is compiled for ARM processors. Qt currently
- supports three optional ARM revisions: \l Q_PROCESSOR_ARM_V5, \l
- Q_PROCESSOR_ARM_V6, and \l Q_PROCESSOR_ARM_V7.
-
- \sa QSysInfo::buildCpuArchitecture()
-*/
-/*!
- \macro Q_PROCESSOR_ARM_V5
- \relates <QtGlobal>
-
- Defined if the application is compiled for ARMv5 processors. The \l
- Q_PROCESSOR_ARM macro is also defined when Q_PROCESSOR_ARM_V5 is defined.
-
- \sa QSysInfo::buildCpuArchitecture()
-*/
-/*!
- \macro Q_PROCESSOR_ARM_V6
- \relates <QtGlobal>
-
- Defined if the application is compiled for ARMv6 processors. The \l
- Q_PROCESSOR_ARM and \l Q_PROCESSOR_ARM_V5 macros are also defined when
- Q_PROCESSOR_ARM_V6 is defined.
-
- \sa QSysInfo::buildCpuArchitecture()
-*/
-/*!
- \macro Q_PROCESSOR_ARM_V7
- \relates <QtGlobal>
-
- Defined if the application is compiled for ARMv7 processors. The \l
- Q_PROCESSOR_ARM, \l Q_PROCESSOR_ARM_V5, and \l Q_PROCESSOR_ARM_V6 macros
- are also defined when Q_PROCESSOR_ARM_V7 is defined.
-
- \sa QSysInfo::buildCpuArchitecture()
-*/
-
-/*!
- \macro Q_PROCESSOR_AVR32
- \relates <QtGlobal>
-
- Defined if the application is compiled for AVR32 processors.
-
- \sa QSysInfo::buildCpuArchitecture()
-*/
-
-/*!
- \macro Q_PROCESSOR_BLACKFIN
- \relates <QtGlobal>
-
- Defined if the application is compiled for Blackfin processors.
-
- \sa QSysInfo::buildCpuArchitecture()
-*/
-
-/*!
- \macro Q_PROCESSOR_IA64
- \relates <QtGlobal>
-
- Defined if the application is compiled for IA-64 processors. This includes
- all Itanium and Itanium 2 processors.
-
- \sa QSysInfo::buildCpuArchitecture()
-*/
-
-/*!
- \macro Q_PROCESSOR_MIPS
- \relates <QtGlobal>
-
- Defined if the application is compiled for MIPS processors. Qt currently
- supports seven MIPS revisions: \l Q_PROCESSOR_MIPS_I, \l
- Q_PROCESSOR_MIPS_II, \l Q_PROCESSOR_MIPS_III, \l Q_PROCESSOR_MIPS_IV, \l
- Q_PROCESSOR_MIPS_V, \l Q_PROCESSOR_MIPS_32, and \l Q_PROCESSOR_MIPS_64.
-
- \sa QSysInfo::buildCpuArchitecture()
-*/
-/*!
- \macro Q_PROCESSOR_MIPS_I
- \relates <QtGlobal>
-
- Defined if the application is compiled for MIPS-I processors. The \l
- Q_PROCESSOR_MIPS macro is also defined when Q_PROCESSOR_MIPS_I is defined.
-
- \sa QSysInfo::buildCpuArchitecture()
-*/
-/*!
- \macro Q_PROCESSOR_MIPS_II
- \relates <QtGlobal>
-
- Defined if the application is compiled for MIPS-II processors. The \l
- Q_PROCESSOR_MIPS and \l Q_PROCESSOR_MIPS_I macros are also defined when
- Q_PROCESSOR_MIPS_II is defined.
-
- \sa QSysInfo::buildCpuArchitecture()
-*/
-/*!
- \macro Q_PROCESSOR_MIPS_32
- \relates <QtGlobal>
-
- Defined if the application is compiled for MIPS32 processors. The \l
- Q_PROCESSOR_MIPS, \l Q_PROCESSOR_MIPS_I, and \l Q_PROCESSOR_MIPS_II macros
- are also defined when Q_PROCESSOR_MIPS_32 is defined.
-
- \sa QSysInfo::buildCpuArchitecture()
-*/
-/*!
- \macro Q_PROCESSOR_MIPS_III
- \relates <QtGlobal>
-
- Defined if the application is compiled for MIPS-III processors. The \l
- Q_PROCESSOR_MIPS, \l Q_PROCESSOR_MIPS_I, and \l Q_PROCESSOR_MIPS_II macros
- are also defined when Q_PROCESSOR_MIPS_III is defined.
-
- \sa QSysInfo::buildCpuArchitecture()
-*/
-/*!
- \macro Q_PROCESSOR_MIPS_IV
- \relates <QtGlobal>
-
- Defined if the application is compiled for MIPS-IV processors. The \l
- Q_PROCESSOR_MIPS, \l Q_PROCESSOR_MIPS_I, \l Q_PROCESSOR_MIPS_II, and \l
- Q_PROCESSOR_MIPS_III macros are also defined when Q_PROCESSOR_MIPS_IV is
- defined.
-
- \sa QSysInfo::buildCpuArchitecture()
-*/
-/*!
- \macro Q_PROCESSOR_MIPS_V
- \relates <QtGlobal>
-
- Defined if the application is compiled for MIPS-V processors. The \l
- Q_PROCESSOR_MIPS, \l Q_PROCESSOR_MIPS_I, \l Q_PROCESSOR_MIPS_II, \l
- Q_PROCESSOR_MIPS_III, and \l Q_PROCESSOR_MIPS_IV macros are also defined
- when Q_PROCESSOR_MIPS_V is defined.
-
- \sa QSysInfo::buildCpuArchitecture()
-*/
-/*!
- \macro Q_PROCESSOR_MIPS_64
- \relates <QtGlobal>
-
- Defined if the application is compiled for MIPS64 processors. The \l
- Q_PROCESSOR_MIPS, \l Q_PROCESSOR_MIPS_I, \l Q_PROCESSOR_MIPS_II, \l
- Q_PROCESSOR_MIPS_III, \l Q_PROCESSOR_MIPS_IV, and \l Q_PROCESSOR_MIPS_V
- macros are also defined when Q_PROCESSOR_MIPS_64 is defined.
-
- \sa QSysInfo::buildCpuArchitecture()
-*/
-
-/*!
- \macro Q_PROCESSOR_POWER
- \relates <QtGlobal>
-
- Defined if the application is compiled for POWER processors. Qt currently
- supports two Power variants: \l Q_PROCESSOR_POWER_32 and \l
- Q_PROCESSOR_POWER_64.
-
- \sa QSysInfo::buildCpuArchitecture()
-*/
-/*!
- \macro Q_PROCESSOR_POWER_32
- \relates <QtGlobal>
-
- Defined if the application is compiled for 32-bit Power processors. The \l
- Q_PROCESSOR_POWER macro is also defined when Q_PROCESSOR_POWER_32 is
- defined.
-
- \sa QSysInfo::buildCpuArchitecture()
-*/
-/*!
- \macro Q_PROCESSOR_POWER_64
- \relates <QtGlobal>
-
- Defined if the application is compiled for 64-bit Power processors. The \l
- Q_PROCESSOR_POWER macro is also defined when Q_PROCESSOR_POWER_64 is
- defined.
-
- \sa QSysInfo::buildCpuArchitecture()
-*/
-
-/*!
- \macro Q_PROCESSOR_RISCV
- \relates <QtGlobal>
- \since 5.13
-
- Defined if the application is compiled for RISC-V processors. Qt currently
- supports two RISC-V variants: \l Q_PROCESSOR_RISCV_32 and \l
- Q_PROCESSOR_RISCV_64.
-
- \sa QSysInfo::buildCpuArchitecture()
-*/
-
-/*!
- \macro Q_PROCESSOR_RISCV_32
- \relates <QtGlobal>
- \since 5.13
-
- Defined if the application is compiled for 32-bit RISC-V processors. The \l
- Q_PROCESSOR_RISCV macro is also defined when Q_PROCESSOR_RISCV_32 is
- defined.
-
- \sa QSysInfo::buildCpuArchitecture()
-*/
-
-/*!
- \macro Q_PROCESSOR_RISCV_64
- \relates <QtGlobal>
- \since 5.13
-
- Defined if the application is compiled for 64-bit RISC-V processors. The \l
- Q_PROCESSOR_RISCV macro is also defined when Q_PROCESSOR_RISCV_64 is
- defined.
-
- \sa QSysInfo::buildCpuArchitecture()
-*/
-
-/*!
- \macro Q_PROCESSOR_S390
- \relates <QtGlobal>
-
- Defined if the application is compiled for S/390 processors. Qt supports
- one optional variant of S/390: Q_PROCESSOR_S390_X.
+ \brief The <QtGlobal> header file includes an assortment of other headers.
- \sa QSysInfo::buildCpuArchitecture()
-*/
-/*!
- \macro Q_PROCESSOR_S390_X
- \relates <QtGlobal>
-
- Defined if the application is compiled for S/390x processors. The \l
- Q_PROCESSOR_S390 macro is also defined when Q_PROCESSOR_S390_X is defined.
-
- \sa QSysInfo::buildCpuArchitecture()
-*/
-
-/*!
- \macro Q_PROCESSOR_SH
- \relates <QtGlobal>
-
- Defined if the application is compiled for SuperH processors. Qt currently
- supports one SuperH revision: \l Q_PROCESSOR_SH_4A.
-
- \sa QSysInfo::buildCpuArchitecture()
-*/
-/*!
- \macro Q_PROCESSOR_SH_4A
- \relates <QtGlobal>
-
- Defined if the application is compiled for SuperH 4A processors. The \l
- Q_PROCESSOR_SH macro is also defined when Q_PROCESSOR_SH_4A is defined.
-
- \sa QSysInfo::buildCpuArchitecture()
-*/
-
-/*!
- \macro Q_PROCESSOR_SPARC
- \relates <QtGlobal>
-
- Defined if the application is compiled for SPARC processors. Qt currently
- supports one optional SPARC revision: \l Q_PROCESSOR_SPARC_V9.
-
- \sa QSysInfo::buildCpuArchitecture()
-*/
-/*!
- \macro Q_PROCESSOR_SPARC_V9
- \relates <QtGlobal>
-
- Defined if the application is compiled for SPARC V9 processors. The \l
- Q_PROCESSOR_SPARC macro is also defined when Q_PROCESSOR_SPARC_V9 is
- defined.
-
- \sa QSysInfo::buildCpuArchitecture()
-*/
-
-/*!
- \macro Q_PROCESSOR_X86
- \relates <QtGlobal>
-
- Defined if the application is compiled for x86 processors. Qt currently
- supports two x86 variants: \l Q_PROCESSOR_X86_32 and \l Q_PROCESSOR_X86_64.
-
- \sa QSysInfo::buildCpuArchitecture()
-*/
-/*!
- \macro Q_PROCESSOR_X86_32
- \relates <QtGlobal>
-
- Defined if the application is compiled for 32-bit x86 processors. This
- includes all i386, i486, i586, and i686 processors. The \l Q_PROCESSOR_X86
- macro is also defined when Q_PROCESSOR_X86_32 is defined.
-
- \sa QSysInfo::buildCpuArchitecture()
-*/
-/*!
- \macro Q_PROCESSOR_X86_64
- \relates <QtGlobal>
-
- Defined if the application is compiled for 64-bit x86 processors. This
- includes all AMD64, Intel 64, and other x86_64/x64 processors. The \l
- Q_PROCESSOR_X86 macro is also defined when Q_PROCESSOR_X86_64 is defined.
-
- \sa QSysInfo::buildCpuArchitecture()
-*/
-
-/*!
- \macro QT_DISABLE_DEPRECATED_BEFORE
- \relates <QtGlobal>
-
- This macro can be defined in the project file to disable functions deprecated in
- a specified version of Qt or any earlier version. The default version number is 5.0,
- meaning that functions deprecated in or before Qt 5.0 will not be included.
-
- For instance, when preparing to upgrade to Qt 6.3, setting
- \c{QT_DISABLE_DEPRECATED_BEFORE=0x0602ff} will disable functions deprecated in
- Qt 6.2 and earlier, making it easy to find changes worth making before the
- upgrade. In any release, set \c{QT_DISABLE_DEPRECATED_BEFORE=0x000000} to
- enable all functions, including the ones deprecated in Qt 5.0 (although most
- of those have by now been removed entirely).
-
- \sa QT_DEPRECATED_WARNINGS
-*/
-
-
-/*!
- \macro QT_DEPRECATED_WARNINGS
- \relates <QtGlobal>
-
- Since Qt 5.13, this macro has no effect. In Qt 5.12 and before, if this macro
- is defined, the compiler will generate warnings if any API declared as
- deprecated by Qt is used.
-
- \sa QT_DISABLE_DEPRECATED_BEFORE, QT_NO_DEPRECATED_WARNINGS
-*/
-
-/*!
- \macro QT_NO_DEPRECATED_WARNINGS
- \relates <QtGlobal>
- \since 5.13
-
- This macro can be used to suppress deprecation warnings that would otherwise
- be generated when using deprecated APIs.
-
- \sa QT_DISABLE_DEPRECATED_BEFORE
-*/
-
-#if defined(Q_OS_MAC)
-
-QT_BEGIN_INCLUDE_NAMESPACE
-#include "private/qcore_mac_p.h"
-#include "qnamespace.h"
-QT_END_INCLUDE_NAMESPACE
-
-#ifdef Q_OS_DARWIN
-static const char *osVer_helper(QOperatingSystemVersion version = QOperatingSystemVersion::current())
-{
-#ifdef Q_OS_MACOS
- if (version.majorVersion() == 10) {
- switch (version.minorVersion()) {
- case 9:
- return "Mavericks";
- case 10:
- return "Yosemite";
- case 11:
- return "El Capitan";
- case 12:
- return "Sierra";
- case 13:
- return "High Sierra";
- case 14:
- return "Mojave";
- }
- }
- // unknown, future version
-#else
- Q_UNUSED(version);
-#endif
- return 0;
-}
-#endif
-
-#elif defined(Q_OS_WIN) || defined(Q_OS_CYGWIN)
-
-QT_BEGIN_INCLUDE_NAMESPACE
-#include "qt_windows.h"
-QT_END_INCLUDE_NAMESPACE
-
-# ifndef QT_BOOTSTRAPPED
-class QWindowsSockInit
-{
-public:
- QWindowsSockInit();
- ~QWindowsSockInit();
- int version;
-};
-
-QWindowsSockInit::QWindowsSockInit()
-: version(0)
-{
- //### should we try for 2.2 on all platforms ??
- WSAData wsadata;
-
- // IPv6 requires Winsock v2.0 or better.
- if (WSAStartup(MAKEWORD(2, 0), &wsadata) != 0) {
- qWarning("QTcpSocketAPI: WinSock v2.0 initialization failed.");
- } else {
- version = 0x20;
- }
-}
-
-QWindowsSockInit::~QWindowsSockInit()
-{
- WSACleanup();
-}
-Q_GLOBAL_STATIC(QWindowsSockInit, winsockInit)
-# endif // QT_BOOTSTRAPPED
-
-static QString readVersionRegistryString(const wchar_t *subKey)
-{
- return QWinRegistryKey(HKEY_LOCAL_MACHINE, LR"(SOFTWARE\Microsoft\Windows NT\CurrentVersion)")
- .stringValue(subKey);
-}
-
-static inline QString windows10ReleaseId()
-{
- return readVersionRegistryString(L"ReleaseId");
-}
-
-static QString winSp_helper()
-{
- const auto osv = qWindowsVersionInfo();
- const qint16 major = osv.wServicePackMajor;
- if (major) {
- QString sp = QStringLiteral("SP ") + QString::number(major);
- const qint16 minor = osv.wServicePackMinor;
- if (minor)
- sp += QLatin1Char('.') + QString::number(minor);
-
- return sp;
- }
- return QString();
-}
-
-static const char *osVer_helper(QOperatingSystemVersion version = QOperatingSystemVersion::current())
-{
- Q_UNUSED(version);
- const OSVERSIONINFOEX osver = qWindowsVersionInfo();
- const bool workstation = osver.wProductType == VER_NT_WORKSTATION;
-
-#define Q_WINVER(major, minor) (major << 8 | minor)
- switch (Q_WINVER(osver.dwMajorVersion, osver.dwMinorVersion)) {
- case Q_WINVER(10, 0):
- if (workstation) {
- if (osver.dwBuildNumber >= 22000)
- return "11";
- return "10";
- }
- // else: Server
- if (osver.dwBuildNumber >= 20348)
- return "Server 2022";
- if (osver.dwBuildNumber >= 17763)
- return "Server 2019";
- return "Server 2016";
- }
-#undef Q_WINVER
- // unknown, future version
- return 0;
-}
-
-#endif
-#if defined(Q_OS_UNIX)
-# if (defined(Q_OS_LINUX) && !defined(Q_OS_ANDROID)) || defined(Q_OS_FREEBSD)
-# define USE_ETC_OS_RELEASE
-struct QUnixOSVersion
-{
- // from /etc/os-release older /etc/lsb-release // redhat /etc/redhat-release // debian /etc/debian_version
- QString productType; // $ID $DISTRIB_ID // single line file containing: // Debian
- QString productVersion; // $VERSION_ID $DISTRIB_RELEASE // <Vendor_ID release Version_ID> // single line file <Release_ID/sid>
- QString prettyName; // $PRETTY_NAME $DISTRIB_DESCRIPTION
-};
-
-static QString unquote(const char *begin, const char *end)
-{
- // man os-release says:
- // Variable assignment values must be enclosed in double
- // or single quotes if they include spaces, semicolons or
- // other special characters outside of A–Z, a–z, 0–9. Shell
- // special characters ("$", quotes, backslash, backtick)
- // must be escaped with backslashes, following shell style.
- // All strings should be in UTF-8 format, and non-printable
- // characters should not be used. It is not supported to
- // concatenate multiple individually quoted strings.
- if (*begin == '"') {
- Q_ASSERT(end[-1] == '"');
- return QString::fromUtf8(begin + 1, end - begin - 2);
- }
- return QString::fromUtf8(begin, end - begin);
-}
-static QByteArray getEtcFileContent(const char *filename)
-{
- // we're avoiding QFile here
- int fd = qt_safe_open(filename, O_RDONLY);
- if (fd == -1)
- return QByteArray();
-
- QT_STATBUF sbuf;
- if (QT_FSTAT(fd, &sbuf) == -1) {
- qt_safe_close(fd);
- return QByteArray();
- }
-
- QByteArray buffer(sbuf.st_size, Qt::Uninitialized);
- buffer.resize(qt_safe_read(fd, buffer.data(), sbuf.st_size));
- qt_safe_close(fd);
- return buffer;
-}
-
-static bool readEtcFile(QUnixOSVersion &v, const char *filename,
- const QByteArray &idKey, const QByteArray &versionKey, const QByteArray &prettyNameKey)
-{
-
- QByteArray buffer = getEtcFileContent(filename);
- if (buffer.isEmpty())
- return false;
-
- const char *ptr = buffer.constData();
- const char *end = buffer.constEnd();
- const char *eol;
- QByteArray line;
- for (; ptr != end; ptr = eol + 1) {
- // find the end of the line after ptr
- eol = static_cast<const char *>(memchr(ptr, '\n', end - ptr));
- if (!eol)
- eol = end - 1;
- line.setRawData(ptr, eol - ptr);
-
- if (line.startsWith(idKey)) {
- ptr += idKey.length();
- v.productType = unquote(ptr, eol);
- continue;
- }
-
- if (line.startsWith(prettyNameKey)) {
- ptr += prettyNameKey.length();
- v.prettyName = unquote(ptr, eol);
- continue;
- }
-
- if (line.startsWith(versionKey)) {
- ptr += versionKey.length();
- v.productVersion = unquote(ptr, eol);
- continue;
- }
- }
-
- return true;
-}
-
-static bool readOsRelease(QUnixOSVersion &v)
-{
- QByteArray id = QByteArrayLiteral("ID=");
- QByteArray versionId = QByteArrayLiteral("VERSION_ID=");
- QByteArray prettyName = QByteArrayLiteral("PRETTY_NAME=");
-
- // man os-release(5) says:
- // The file /etc/os-release takes precedence over /usr/lib/os-release.
- // Applications should check for the former, and exclusively use its data
- // if it exists, and only fall back to /usr/lib/os-release if it is
- // missing.
- return readEtcFile(v, "/etc/os-release", id, versionId, prettyName) ||
- readEtcFile(v, "/usr/lib/os-release", id, versionId, prettyName);
-}
-
-static bool readEtcLsbRelease(QUnixOSVersion &v)
-{
- bool ok = readEtcFile(v, "/etc/lsb-release", QByteArrayLiteral("DISTRIB_ID="),
- QByteArrayLiteral("DISTRIB_RELEASE="), QByteArrayLiteral("DISTRIB_DESCRIPTION="));
- if (ok && (v.prettyName.isEmpty() || v.prettyName == v.productType)) {
- // some distributions have redundant information for the pretty name,
- // so try /etc/<lowercasename>-release
-
- // we're still avoiding QFile here
- QByteArray distrorelease = "/etc/" + v.productType.toLatin1().toLower() + "-release";
- int fd = qt_safe_open(distrorelease, O_RDONLY);
- if (fd != -1) {
- QT_STATBUF sbuf;
- if (QT_FSTAT(fd, &sbuf) != -1 && sbuf.st_size > v.prettyName.length()) {
- // file apparently contains interesting information
- QByteArray buffer(sbuf.st_size, Qt::Uninitialized);
- buffer.resize(qt_safe_read(fd, buffer.data(), sbuf.st_size));
- v.prettyName = QString::fromLatin1(buffer.trimmed());
- }
- qt_safe_close(fd);
- }
- }
-
- // some distributions have a /etc/lsb-release file that does not provide the values
- // we are looking for, i.e. DISTRIB_ID, DISTRIB_RELEASE and DISTRIB_DESCRIPTION.
- // Assuming that neither DISTRIB_ID nor DISTRIB_RELEASE were found, or contained valid values,
- // returning false for readEtcLsbRelease will allow further /etc/<lowercasename>-release parsing.
- return ok && !(v.productType.isEmpty() && v.productVersion.isEmpty());
-}
-
-#if defined(Q_OS_LINUX)
-static QByteArray getEtcFileFirstLine(const char *fileName)
-{
- QByteArray buffer = getEtcFileContent(fileName);
- if (buffer.isEmpty())
- return QByteArray();
-
- const char *ptr = buffer.constData();
- int eol = buffer.indexOf("\n");
- return QByteArray(ptr, eol).trimmed();
-}
-
-static bool readEtcRedHatRelease(QUnixOSVersion &v)
-{
- // /etc/redhat-release analysed should be a one line file
- // the format of its content is <Vendor_ID release Version>
- // i.e. "Red Hat Enterprise Linux Workstation release 6.5 (Santiago)"
- QByteArray line = getEtcFileFirstLine("/etc/redhat-release");
- if (line.isEmpty())
- return false;
-
- v.prettyName = QString::fromLatin1(line);
-
- const char keyword[] = "release ";
- int releaseIndex = line.indexOf(keyword);
- v.productType = QString::fromLatin1(line.mid(0, releaseIndex)).remove(QLatin1Char(' '));
- int spaceIndex = line.indexOf(' ', releaseIndex + strlen(keyword));
- v.productVersion = QString::fromLatin1(line.mid(releaseIndex + strlen(keyword),
- spaceIndex > -1 ? spaceIndex - releaseIndex - int(strlen(keyword)) : -1));
- return true;
-}
-
-static bool readEtcDebianVersion(QUnixOSVersion &v)
-{
- // /etc/debian_version analysed should be a one line file
- // the format of its content is <Release_ID/sid>
- // i.e. "jessie/sid"
- QByteArray line = getEtcFileFirstLine("/etc/debian_version");
- if (line.isEmpty())
- return false;
-
- v.productType = QStringLiteral("Debian");
- v.productVersion = QString::fromLatin1(line);
- return true;
-}
-#endif
-
-static bool findUnixOsVersion(QUnixOSVersion &v)
-{
- if (readOsRelease(v))
- return true;
- if (readEtcLsbRelease(v))
- return true;
-#if defined(Q_OS_LINUX)
- if (readEtcRedHatRelease(v))
- return true;
- if (readEtcDebianVersion(v))
- return true;
-#endif
- return false;
-}
-# endif // USE_ETC_OS_RELEASE
-#endif // Q_OS_UNIX
-
-#ifdef Q_OS_ANDROID
-static const char *osVer_helper(QOperatingSystemVersion)
-{
-/* Data:
-
-
-
-Cupcake
-Donut
-Eclair
-Eclair
-Eclair
-Froyo
-Gingerbread
-Gingerbread
-Honeycomb
-Honeycomb
-Honeycomb
-Ice Cream Sandwich
-Ice Cream Sandwich
-Jelly Bean
-Jelly Bean
-Jelly Bean
-KitKat
-KitKat
-Lollipop
-Lollipop
-Marshmallow
-Nougat
-Nougat
-Oreo
-*/
- static const char versions_string[] =
- "\0"
- "Cupcake\0"
- "Donut\0"
- "Eclair\0"
- "Froyo\0"
- "Gingerbread\0"
- "Honeycomb\0"
- "Ice Cream Sandwich\0"
- "Jelly Bean\0"
- "KitKat\0"
- "Lollipop\0"
- "Marshmallow\0"
- "Nougat\0"
- "Oreo\0"
- "\0";
-
- static const int versions_indices[] = {
- 0, 0, 0, 1, 9, 15, 15, 15,
- 22, 28, 28, 40, 40, 40, 50, 50,
- 69, 69, 69, 80, 80, 87, 87, 96,
- 108, 108, 115, -1
- };
+ Up to Qt 6.5, most Qt header files included <QtGlobal>. Before Qt 6.5,
+ <QtGlobal> defined an assortment of global declarations. Most of these
+ have moved, at Qt 6.5, to separate headers, so that source code can
+ include only what it needs, rather than the whole assortment. For now,
+ <QtGlobal> includes those other headers (see next section), but future
+ releases of Qt may remove some of these headers from <QtGlobal> or
+ condition their inclusion on a version check. Likewise, in future
+ releases, some Qt headers that currently include <QtGlobal> may stop
+ doing so. The hope is that this will improve compilation times by
+ avoiding global declarations when they are not used.
- static const int versions_count = (sizeof versions_indices) / (sizeof versions_indices[0]);
-
- // https://source.android.com/source/build-numbers.html
- // https://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels
- const int sdk_int = QJniObject::getStaticField<jint>("android/os/Build$VERSION", "SDK_INT");
- return &versions_string[versions_indices[qBound(0, sdk_int, versions_count - 1)]];
-}
-#endif
-
-/*!
- \since 5.4
-
- Returns the architecture of the CPU that Qt was compiled for, in text
- format. Note that this may not match the actual CPU that the application is
- running on if there's an emulation layer or if the CPU supports multiple
- architectures (like x86-64 processors supporting i386 applications). To
- detect that, use currentCpuArchitecture().
-
- Values returned by this function are stable and will not change over time,
- so applications can rely on the returned value as an identifier, except
- that new CPU types may be added over time.
-
- Typical returned values are (note: list not exhaustive):
- \list
- \li "arm"
- \li "arm64"
- \li "i386"
- \li "ia64"
- \li "mips"
- \li "mips64"
- \li "power"
- \li "power64"
- \li "sparc"
- \li "sparcv9"
- \li "x86_64"
- \endlist
-
- \sa QSysInfo::buildAbi(), QSysInfo::currentCpuArchitecture()
-*/
-QString QSysInfo::buildCpuArchitecture()
-{
- return QStringLiteral(ARCH_PROCESSOR);
-}
-
-/*!
- \since 5.4
-
- Returns the architecture of the CPU that the application is running on, in
- text format. Note that this function depends on what the OS will report and
- may not detect the actual CPU architecture if the OS hides that information
- or is unable to provide it. For example, a 32-bit OS running on a 64-bit
- CPU is usually unable to determine the CPU is actually capable of running
- 64-bit programs.
-
- Values returned by this function are mostly stable: an attempt will be made
- to ensure that they stay constant over time and match the values returned
- by QSysInfo::builldCpuArchitecture(). However, due to the nature of the
- operating system functions being used, there may be discrepancies.
-
- Typical returned values are (note: list not exhaustive):
- \list
- \li "arm"
- \li "arm64"
- \li "i386"
- \li "ia64"
- \li "mips"
- \li "mips64"
- \li "power"
- \li "power64"
- \li "sparc"
- \li "sparcv9"
- \li "x86_64"
- \endlist
-
- \sa QSysInfo::buildAbi(), QSysInfo::buildCpuArchitecture()
-*/
-QString QSysInfo::currentCpuArchitecture()
-{
-#if defined(Q_OS_WIN)
- // We don't need to catch all the CPU architectures in this function;
- // only those where the host CPU might be different than the build target
- // (usually, 64-bit platforms).
- SYSTEM_INFO info;
- GetNativeSystemInfo(&info);
- switch (info.wProcessorArchitecture) {
-# ifdef PROCESSOR_ARCHITECTURE_AMD64
- case PROCESSOR_ARCHITECTURE_AMD64:
- return QStringLiteral("x86_64");
-# endif
-# ifdef PROCESSOR_ARCHITECTURE_IA32_ON_WIN64
- case PROCESSOR_ARCHITECTURE_IA32_ON_WIN64:
-# endif
- case PROCESSOR_ARCHITECTURE_IA64:
- return QStringLiteral("ia64");
- }
-#elif defined(Q_OS_DARWIN) && !defined(Q_OS_MACOS)
- // iOS-based OSes do not return the architecture on uname(2)'s result.
- return buildCpuArchitecture();
-#elif defined(Q_OS_UNIX)
- long ret = -1;
- struct utsname u;
-
-# if defined(Q_OS_SOLARIS)
- // We need a special call for Solaris because uname(2) on x86 returns "i86pc" for
- // both 32- and 64-bit CPUs. Reference:
- // http://docs.oracle.com/cd/E18752_01/html/816-5167/sysinfo-2.html#REFMAN2sysinfo-2
- // http://fxr.watson.org/fxr/source/common/syscall/systeminfo.c?v=OPENSOLARIS
- // http://fxr.watson.org/fxr/source/common/conf/param.c?v=OPENSOLARIS;im=10#L530
- if (ret == -1)
- ret = sysinfo(SI_ARCHITECTURE_64, u.machine, sizeof u.machine);
-# endif
-
- if (ret == -1)
- ret = uname(&u);
-
- // we could use detectUnixVersion() above, but we only need a field no other function does
- if (ret != -1) {
- // the use of QT_BUILD_INTERNAL here is simply to ensure all branches build
- // as we don't often build on some of the less common platforms
-# if defined(Q_PROCESSOR_ARM) || defined(QT_BUILD_INTERNAL)
- if (strcmp(u.machine, "aarch64") == 0)
- return QStringLiteral("arm64");
- if (strncmp(u.machine, "armv", 4) == 0)
- return QStringLiteral("arm");
-# endif
-# if defined(Q_PROCESSOR_POWER) || defined(QT_BUILD_INTERNAL)
- // harmonize "powerpc" and "ppc" to "power"
- if (strncmp(u.machine, "ppc", 3) == 0)
- return QLatin1String("power") + QLatin1String(u.machine + 3);
- if (strncmp(u.machine, "powerpc", 7) == 0)
- return QLatin1String("power") + QLatin1String(u.machine + 7);
- if (strcmp(u.machine, "Power Macintosh") == 0)
- return QLatin1String("power");
-# endif
-# if defined(Q_PROCESSOR_SPARC) || defined(QT_BUILD_INTERNAL)
- // Solaris sysinfo(2) (above) uses "sparcv9", but uname -m says "sun4u";
- // Linux says "sparc64"
- if (strcmp(u.machine, "sun4u") == 0 || strcmp(u.machine, "sparc64") == 0)
- return QStringLiteral("sparcv9");
- if (strcmp(u.machine, "sparc32") == 0)
- return QStringLiteral("sparc");
-# endif
-# if defined(Q_PROCESSOR_X86) || defined(QT_BUILD_INTERNAL)
- // harmonize all "i?86" to "i386"
- if (strlen(u.machine) == 4 && u.machine[0] == 'i'
- && u.machine[2] == '8' && u.machine[3] == '6')
- return QStringLiteral("i386");
- if (strcmp(u.machine, "amd64") == 0) // Solaris
- return QStringLiteral("x86_64");
-# endif
- return QString::fromLatin1(u.machine);
- }
-#endif
- return buildCpuArchitecture();
-}
-
-/*!
- \since 5.4
-
- Returns the full architecture string that Qt was compiled for. This string
- is useful for identifying different, incompatible builds. For example, it
- can be used as an identifier to request an upgrade package from a server.
-
- The values returned from this function are kept stable as follows: the
- mandatory components of the result will not change in future versions of
- Qt, but optional suffixes may be added.
-
- The returned value is composed of three or more parts, separated by dashes
- ("-"). They are:
+ \section1 List of Headers Extracted from <QtGlobal>
\table
- \header \li Component \li Value
- \row \li CPU Architecture \li The same as QSysInfo::buildCpuArchitecture(), such as "arm", "i386", "mips" or "x86_64"
- \row \li Endianness \li "little_endian" or "big_endian"
- \row \li Word size \li Whether it's a 32- or 64-bit application. Possible values are:
- "llp64" (Windows 64-bit), "lp64" (Unix 64-bit), "ilp32" (32-bit)
- \row \li (Optional) ABI \li Zero or more components identifying different ABIs possible in this architecture.
- Currently, Qt has optional ABI components for ARM and MIPS processors: one
- component is the main ABI (such as "eabi", "o32", "n32", "o64"); another is
- whether the calling convention is using hardware floating point registers ("hardfloat"
- is present).
-
- Additionally, if Qt was configured with \c{-qreal float}, the ABI option tag "qreal_float"
- will be present. If Qt was configured with another type as qreal, that type is present after
- "qreal_", with all characters other than letters and digits escaped by an underscore, followed
- by two hex digits. For example, \c{-qreal long double} becomes "qreal_long_20double".
+ \header \li Header \li Summary
+ \row \li <QFlags> \li Type-safe way of combining enum values
+ \row \li \l <QForeach> \li Qt's implementation of foreach and forever loops
+ \row \li \l <QFunctionPointer> \li Typedef for a pointer-to-function type
+ \row \li <QGlobalStatic> \li Thread-safe initialization of global static objects
+ \row \li \l <QOverload> \li Helpers for resolving member function overloads
+ \row \li <QSysInfo> \li A helper class to get system information
+ \row \li \l <QTypeInfo> \li Helpers to get type information
+ \row \li \l <QtAssert> \li Q_ASSERT and other runtime checks
+ \row \li \l <QtClassHelperMacros> \li Qt class helper macros
+ \row \li \l <QtCompilerDetection> \li Compiler-specific macro definitions
+ \row \li \l <QtDeprecationMarkers> \li Deprecation helper macros
+ \row \li \l <QtEnvironmentVariables> \li Helpers for working with environment variables
+ \row \li <QtExceptionHandling> \li Helpers for exception handling
+ \row \li \l <QtLogging> \li Qt logging helpers
+ \row \li <QtMalloc> \li Memory allocation helpers
+ \row \li \l <QtMinMax> \li Helpers for comparing values
+ \row \li \l <QtNumeric> \li Various numeric functions
+ \row \li \l <QtPreprocessorSupport> \li Helper preprocessor macros
+ \row \li \l <QtProcessorDetection> \li Architecture-specific macro definitions
+ \row \li \l <QtResource> \li Helpers for initializing and cleaning resources
+ \row \li \l <QtSwap> \li Implementation of qSwap()
+ \row \li \l <QtSystemDetection> \li Platform-specific macro definitions
+ \row \li \l <QtTranslation> \li Qt translation helpers
+ \row \li \l <QtTypeTraits> \li Qt type traits
+ \row \li \l <QtTypes> \li Qt fundamental type declarations
+ \row \li \l <QtVersionChecks> \li QT_VERSION_CHECK and related checks
+ \row \li \l <QtVersion> \li QT_VERSION_STR and qVersion()
\endtable
-
- \sa QSysInfo::buildCpuArchitecture()
*/
-QString QSysInfo::buildAbi()
-{
- // ARCH_FULL is a concatenation of strings (incl. ARCH_PROCESSOR), which breaks
- // QStringLiteral on MSVC. Since the concatenation behavior we want is specified
- // the same C++11 paper as the Unicode strings, we'll use that macro and hope
- // that Microsoft implements the new behavior when they add support for Unicode strings.
- return QStringLiteral(ARCH_FULL);
-}
-
-static QString unknownText()
-{
- return QStringLiteral("unknown");
-}
-
-/*!
- \since 5.4
-
- Returns the type of the operating system kernel Qt was compiled for. It's
- also the kernel the application is running on, unless the host operating
- system is running a form of compatibility or virtualization layer.
-
- Values returned by this function are stable and will not change over time,
- so applications can rely on the returned value as an identifier, except
- that new OS kernel types may be added over time.
-
- On Windows, this function returns the type of Windows kernel, like "winnt".
- On Unix systems, it returns the same as the output of \c{uname
- -s} (lowercased).
-
- \note This function may return surprising values: it returns "linux"
- for all operating systems running Linux (including Android), "qnx" for all
- operating systems running QNX, "freebsd" for
- Debian/kFreeBSD, and "darwin" for \macos and iOS. For information on the type
- of product the application is running on, see productType().
-
- \sa QFileSelector, kernelVersion(), productType(), productVersion(), prettyProductName()
-*/
-QString QSysInfo::kernelType()
-{
-#if defined(Q_OS_WIN)
- return QStringLiteral("winnt");
-#elif defined(Q_OS_UNIX)
- struct utsname u;
- if (uname(&u) == 0)
- return QString::fromLatin1(u.sysname).toLower();
-#endif
- return unknownText();
-}
-
-/*!
- \since 5.4
-
- Returns the release version of the operating system kernel. On Windows, it
- returns the version of the NT kernel. On Unix systems, including
- Android and \macos, it returns the same as the \c{uname -r}
- command would return.
-
- If the version could not be determined, this function may return an empty
- string.
-
- \sa kernelType(), productType(), productVersion(), prettyProductName()
-*/
-QString QSysInfo::kernelVersion()
-{
-#ifdef Q_OS_WIN
- const auto osver = QOperatingSystemVersion::current();
- return QString::number(osver.majorVersion()) + QLatin1Char('.') + QString::number(osver.minorVersion())
- + QLatin1Char('.') + QString::number(osver.microVersion());
-#else
- struct utsname u;
- if (uname(&u) == 0)
- return QString::fromLatin1(u.release);
- return QString();
-#endif
-}
-
-
-/*!
- \since 5.4
-
- Returns the product name of the operating system this application is
- running in. If the application is running on some sort of emulation or
- virtualization layer (such as WINE on a Unix system), this function will
- inspect the emulation / virtualization layer.
-
- Values returned by this function are stable and will not change over time,
- so applications can rely on the returned value as an identifier, except
- that new OS types may be added over time.
-
- \b{Linux and Android note}: this function returns "android" for Linux
- systems running Android userspace, notably when using the Bionic library.
- For all other Linux systems, regardless of C library being used, it tries
- to determine the distribution name and returns that. If determining the
- distribution name failed, it returns "unknown".
-
- \b{\macos note}: this function returns "osx" for all \macos systems,
- regardless of Apple naming convention. The returned string will be updated
- for Qt 6. Note that this function erroneously returned "macos" for \macos
- 10.12 in Qt versions 5.6.2, 5.7.1, and 5.8.0.
-
- \b{Darwin, iOS, tvOS, and watchOS note}: this function returns "ios" for
- iOS systems, "tvos" for tvOS systems, "watchos" for watchOS systems, and
- "darwin" in case the system could not be determined.
-
- \b{FreeBSD note}: this function returns "debian" for Debian/kFreeBSD and
- "unknown" otherwise.
-
- \b{Windows note}: this function return "windows"
-
- For other Unix-type systems, this function usually returns "unknown".
-
- \sa QFileSelector, kernelType(), kernelVersion(), productVersion(), prettyProductName()
-*/
-QString QSysInfo::productType()
-{
- // similar, but not identical to QFileSelectorPrivate::platformSelectors
-#if defined(Q_OS_WIN)
- return QStringLiteral("windows");
-
-#elif defined(Q_OS_QNX)
- return QStringLiteral("qnx");
-
-#elif defined(Q_OS_ANDROID)
- return QStringLiteral("android");
-
-#elif defined(Q_OS_IOS)
- return QStringLiteral("ios");
-#elif defined(Q_OS_TVOS)
- return QStringLiteral("tvos");
-#elif defined(Q_OS_WATCHOS)
- return QStringLiteral("watchos");
-#elif defined(Q_OS_MACOS)
- return QStringLiteral("macos");
-#elif defined(Q_OS_DARWIN)
- return QStringLiteral("darwin");
-
-#elif defined(USE_ETC_OS_RELEASE) // Q_OS_UNIX
- QUnixOSVersion unixOsVersion;
- findUnixOsVersion(unixOsVersion);
- if (!unixOsVersion.productType.isEmpty())
- return unixOsVersion.productType;
-#endif
- return unknownText();
-}
-
-/*!
- \since 5.4
-
- Returns the product version of the operating system in string form. If the
- version could not be determined, this function returns "unknown".
-
- It will return the Android, iOS, \macos, Windows full-product
- versions on those systems.
-
- Typical returned values are (note: list not exhaustive):
- \list
- \li "2016.09" (Amazon Linux AMI 2016.09)
- \li "7.1" (Android Nougat)
- \li "25" (Fedora 25)
- \li "10.1" (iOS 10.1)
- \li "10.12" (macOS Sierra)
- \li "10.0" (tvOS 10)
- \li "16.10" (Ubuntu 16.10)
- \li "3.1" (watchOS 3.1)
- \li "10" (Windows 10)
- \li "Server 2016" (Windows Server 2016)
- \endlist
-
- On Linux systems, it will try to determine the distribution version and will
- return that. This is also done on Debian/kFreeBSD, so this function will
- return Debian version in that case.
-
- In all other Unix-type systems, this function always returns "unknown".
-
- \note The version string returned from this function is not guaranteed to
- be orderable. On Linux, the version of
- the distribution may jump unexpectedly, please refer to the distribution's
- documentation for versioning practices.
-
- \sa kernelType(), kernelVersion(), productType(), prettyProductName()
-*/
-QString QSysInfo::productVersion()
-{
-#if defined(Q_OS_ANDROID) || defined(Q_OS_DARWIN)
- const auto version = QOperatingSystemVersion::current();
- return QString::number(version.majorVersion()) + QLatin1Char('.') + QString::number(version.minorVersion());
-#elif defined(Q_OS_WIN)
- const char *version = osVer_helper();
- if (version) {
- const QLatin1Char spaceChar(' ');
- return QString::fromLatin1(version).remove(spaceChar).toLower() + winSp_helper().remove(spaceChar).toLower();
- }
- // fall through
-
-#elif defined(USE_ETC_OS_RELEASE) // Q_OS_UNIX
- QUnixOSVersion unixOsVersion;
- findUnixOsVersion(unixOsVersion);
- if (!unixOsVersion.productVersion.isEmpty())
- return unixOsVersion.productVersion;
-#endif
-
- // fallback
- return unknownText();
-}
-
-/*!
- \since 5.4
-
- Returns a prettier form of productType() and productVersion(), containing
- other tokens like the operating system type, codenames and other
- information. The result of this function is suitable for displaying to the
- user, but not for long-term storage, as the string may change with updates
- to Qt.
-
- If productType() is "unknown", this function will instead use the
- kernelType() and kernelVersion() functions.
-
- \sa kernelType(), kernelVersion(), productType(), productVersion()
-*/
-QString QSysInfo::prettyProductName()
-{
-#if defined(Q_OS_ANDROID) || defined(Q_OS_DARWIN) || defined(Q_OS_WIN)
- const auto version = QOperatingSystemVersion::current();
- const int majorVersion = version.majorVersion();
- const QString versionString = QString::number(majorVersion) + QLatin1Char('.')
- + QString::number(version.minorVersion());
- QString result = version.name() + QLatin1Char(' ');
- const char *name = osVer_helper(version);
- if (!name)
- return result + versionString;
- result += QLatin1String(name);
-# if !defined(Q_OS_WIN)
- return result + QLatin1String(" (") + versionString + QLatin1Char(')');
-# else
- // (resembling winver.exe): Windows 10 "Windows 10 Version 1809"
- const auto releaseId = windows10ReleaseId();
- if (!releaseId.isEmpty())
- result += QLatin1String(" Version ") + releaseId;
- return result;
-# endif // Windows
-#elif defined(Q_OS_HAIKU)
- return QLatin1String("Haiku ") + productVersion();
-#elif defined(Q_OS_UNIX)
-# ifdef USE_ETC_OS_RELEASE
- QUnixOSVersion unixOsVersion;
- findUnixOsVersion(unixOsVersion);
- if (!unixOsVersion.prettyName.isEmpty())
- return unixOsVersion.prettyName;
-# endif
- struct utsname u;
- if (uname(&u) == 0)
- return QString::fromLatin1(u.sysname) + QLatin1Char(' ') + QString::fromLatin1(u.release);
-#endif
- return unknownText();
-}
-
-#ifndef QT_BOOTSTRAPPED
-/*!
- \since 5.6
-
- Returns this machine's host name, if one is configured. Note that hostnames
- are not guaranteed to be globally unique, especially if they were
- configured automatically.
-
- This function does not guarantee the returned host name is a Fully
- Qualified Domain Name (FQDN). For that, use QHostInfo to resolve the
- returned name to an FQDN.
-
- This function returns the same as QHostInfo::localHostName().
-
- \sa QHostInfo::localDomainName, machineUniqueId()
-*/
-QString QSysInfo::machineHostName()
-{
- // the hostname can change, so we can't cache it
-#if defined(Q_OS_LINUX)
- // gethostname(3) on Linux just calls uname(2), so do it ourselves
- // and avoid a memcpy
- struct utsname u;
- if (uname(&u) == 0)
- return QString::fromLocal8Bit(u.nodename);
- return QString();
-#else
-# ifdef Q_OS_WIN
- // Important: QtNetwork depends on machineHostName() initializing ws2_32.dll
- winsockInit();
-# endif
-
- char hostName[512];
- if (gethostname(hostName, sizeof(hostName)) == -1)
- return QString();
- hostName[sizeof(hostName) - 1] = '\0';
- return QString::fromLocal8Bit(hostName);
-#endif
-}
-#endif // QT_BOOTSTRAPPED
-
-enum {
- UuidStringLen = sizeof("00000000-0000-0000-0000-000000000000") - 1
-};
-
-/*!
- \since 5.11
-
- Returns a unique ID for this machine, if one can be determined. If no
- unique ID could be determined, this function returns an empty byte array.
- Unlike machineHostName(), the value returned by this function is likely
- globally unique.
-
- A unique ID is useful in network operations to identify this machine for an
- extended period of time, when the IP address could change or if this
- machine could have more than one IP address. For example, the ID could be
- used when communicating with a server or when storing device-specific data
- in shared network storage.
-
- Note that on some systems, this value will persist across reboots and on
- some it will not. Applications should not blindly depend on this fact
- without verifying the OS capabilities. In particular, on Linux systems,
- this ID is usually permanent and it matches the D-Bus machine ID, except
- for nodes without their own storage (replicated nodes).
-
- \sa machineHostName(), bootUniqueId()
-*/
-QByteArray QSysInfo::machineUniqueId()
-{
-#if defined(Q_OS_DARWIN) && __has_include(<IOKit/IOKitLib.h>)
- char uuid[UuidStringLen + 1];
- io_service_t service = IOServiceGetMatchingService(kIOMasterPortDefault, IOServiceMatching("IOPlatformExpertDevice"));
- QCFString stringRef = (CFStringRef)IORegistryEntryCreateCFProperty(service, CFSTR(kIOPlatformUUIDKey), kCFAllocatorDefault, 0);
- CFStringGetCString(stringRef, uuid, sizeof(uuid), kCFStringEncodingMacRoman);
- return QByteArray(uuid);
-#elif defined(Q_OS_BSD4) && defined(KERN_HOSTUUID)
- char uuid[UuidStringLen + 1];
- size_t uuidlen = sizeof(uuid);
- int name[] = { CTL_KERN, KERN_HOSTUUID };
- if (sysctl(name, sizeof name / sizeof name[0], &uuid, &uuidlen, nullptr, 0) == 0
- && uuidlen == sizeof(uuid))
- return QByteArray(uuid, uuidlen - 1);
-#elif defined(Q_OS_UNIX)
- // The modern name on Linux is /etc/machine-id, but that path is
- // unlikely to exist on non-Linux (non-systemd) systems. The old
- // path is more than enough.
- static const char fullfilename[] = "/usr/local/var/lib/dbus/machine-id";
- const char *firstfilename = fullfilename + sizeof("/usr/local") - 1;
- int fd = qt_safe_open(firstfilename, O_RDONLY);
- if (fd == -1 && errno == ENOENT)
- fd = qt_safe_open(fullfilename, O_RDONLY);
-
- if (fd != -1) {
- char buffer[32]; // 128 bits, hex-encoded
- qint64 len = qt_safe_read(fd, buffer, sizeof(buffer));
- qt_safe_close(fd);
-
- if (len != -1)
- return QByteArray(buffer, len);
- }
-#elif defined(Q_OS_WIN)
- // Let's poke at the registry
- // ### Qt 6: Use new helpers from qwinregistry.cpp (once bootstrap builds are obsolete)
- HKEY key = NULL;
- if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Cryptography", 0, KEY_READ | KEY_WOW64_64KEY, &key)
- == ERROR_SUCCESS) {
- wchar_t buffer[UuidStringLen + 1];
- DWORD size = sizeof(buffer);
- bool ok = (RegQueryValueEx(key, L"MachineGuid", NULL, NULL, (LPBYTE)buffer, &size) ==
- ERROR_SUCCESS);
- RegCloseKey(key);
- if (ok)
- return QStringView(buffer, (size - 1) / 2).toLatin1();
- }
-#endif
- return QByteArray();
-}
-
-/*!
- \since 5.11
-
- Returns a unique ID for this machine's boot, if one can be determined. If
- no unique ID could be determined, this function returns an empty byte
- array. This value is expected to change after every boot and can be
- considered globally unique.
-
- This function is currently only implemented for Linux and Apple operating
- systems.
-
- \sa machineUniqueId()
-*/
-QByteArray QSysInfo::bootUniqueId()
-{
-#ifdef Q_OS_LINUX
- // use low-level API here for simplicity
- int fd = qt_safe_open("/proc/sys/kernel/random/boot_id", O_RDONLY);
- if (fd != -1) {
- char uuid[UuidStringLen];
- qint64 len = qt_safe_read(fd, uuid, sizeof(uuid));
- qt_safe_close(fd);
- if (len == UuidStringLen)
- return QByteArray(uuid, UuidStringLen);
- }
-#elif defined(Q_OS_DARWIN)
- // "kern.bootsessionuuid" is only available by name
- char uuid[UuidStringLen + 1];
- size_t uuidlen = sizeof(uuid);
- if (sysctlbyname("kern.bootsessionuuid", uuid, &uuidlen, nullptr, 0) == 0
- && uuidlen == sizeof(uuid))
- return QByteArray(uuid, uuidlen - 1);
-#endif
- return QByteArray();
-};
-
-/*!
- \macro void Q_ASSERT(bool test)
- \relates <QtGlobal>
-
- Prints a warning message containing the source code file name and
- line number if \a test is \c false.
-
- Q_ASSERT() is useful for testing pre- and post-conditions
- during development. It does nothing if \c QT_NO_DEBUG was defined
- during compilation.
-
- Example:
-
- \snippet code/src_corelib_global_qglobal.cpp 17
-
- If \c b is zero, the Q_ASSERT statement will output the following
- message using the qFatal() function:
-
- \snippet code/src_corelib_global_qglobal.cpp 18
-
- \sa Q_ASSERT_X(), qFatal(), {Debugging Techniques}
-*/
-
-/*!
- \macro void Q_ASSERT_X(bool test, const char *where, const char *what)
- \relates <QtGlobal>
-
- Prints the message \a what together with the location \a where,
- the source file name and line number if \a test is \c false.
-
- Q_ASSERT_X is useful for testing pre- and post-conditions during
- development. It does nothing if \c QT_NO_DEBUG was defined during
- compilation.
-
- Example:
-
- \snippet code/src_corelib_global_qglobal.cpp 19
-
- If \c b is zero, the Q_ASSERT_X statement will output the following
- message using the qFatal() function:
-
- \snippet code/src_corelib_global_qglobal.cpp 20
-
- \sa Q_ASSERT(), qFatal(), {Debugging Techniques}
-*/
-
-/*!
- \macro void Q_ASSUME(bool expr)
- \relates <QtGlobal>
- \since 5.0
-
- Causes the compiler to assume that \a expr is \c true. This macro is useful
- for improving code generation, by providing the compiler with hints about
- conditions that it would not otherwise know about. However, there is no
- guarantee that the compiler will actually use those hints.
-
- This macro could be considered a "lighter" version of \l{Q_ASSERT()}. While
- Q_ASSERT will abort the program's execution if the condition is \c false,
- Q_ASSUME will tell the compiler not to generate code for those conditions.
- Therefore, it is important that the assumptions always hold, otherwise
- undefined behaviour may occur.
-
- If \a expr is a constantly \c false condition, Q_ASSUME will tell the compiler
- that the current code execution cannot be reached. That is, Q_ASSUME(false)
- is equivalent to Q_UNREACHABLE().
-
- In debug builds the condition is enforced by an assert to facilitate debugging.
-
- \note Q_LIKELY() tells the compiler that the expression is likely, but not
- the only possibility. Q_ASSUME tells the compiler that it is the only
- possibility.
-
- \sa Q_ASSERT(), Q_UNREACHABLE(), Q_LIKELY()
-*/
-
-/*!
- \macro void Q_UNREACHABLE()
- \relates <QtGlobal>
- \since 5.0
-
- Tells the compiler that the current point cannot be reached by any
- execution, so it may optimize any code paths leading here as dead code, as
- well as code continuing from here.
-
- This macro is useful to mark impossible conditions. For example, given the
- following enum:
-
- \snippet code/src_corelib_global_qglobal.cpp qunreachable-enum
-
- One can write a switch table like so:
-
- \snippet code/src_corelib_global_qglobal.cpp qunreachable-switch
-
- The advantage of inserting Q_UNREACHABLE() at that point is that the
- compiler is told not to generate code for a shape variable containing that
- value. If the macro is missing, the compiler will still generate the
- necessary comparisons for that value. If the case label were removed, some
- compilers could produce a warning that some enum values were not checked.
-
- By using this macro in impossible conditions, code coverage may be improved
- as dead code paths may be eliminated.
-
- In debug builds the condition is enforced by an assert to facilitate debugging.
-
- \sa Q_ASSERT(), Q_ASSUME(), qFatal()
-*/
-
-/*!
- \macro void Q_FALLTHROUGH()
- \relates <QtGlobal>
- \since 5.8
-
- Can be used in switch statements at the end of case block to tell the compiler
- and other developers that that the lack of a break statement is intentional.
-
- This is useful since a missing break statement is often a bug, and some
- compilers can be configured to emit warnings when one is not found.
-
- \sa Q_UNREACHABLE()
-*/
-
-/*!
- \macro void Q_CHECK_PTR(void *pointer)
- \relates <QtGlobal>
-
- If \a pointer is \nullptr, prints a message containing the source
- code's file name and line number, saying that the program ran out
- of memory and aborts program execution. It throws \c std::bad_alloc instead
- if exceptions are enabled.
-
- Q_CHECK_PTR does nothing if \c QT_NO_DEBUG and \c QT_NO_EXCEPTIONS were
- defined during compilation. Therefore you must not use Q_CHECK_PTR to check
- for successful memory allocations because the check will be disabled in
- some cases.
-
- Example:
-
- \snippet code/src_corelib_global_qglobal.cpp 21
-
- \sa qWarning(), {Debugging Techniques}
-*/
-
-/*!
- \fn template <typename T> T *q_check_ptr(T *p)
- \relates <QtGlobal>
-
- Uses Q_CHECK_PTR on \a p, then returns \a p.
-
- This can be used as an inline version of Q_CHECK_PTR.
-*/
-
-/*!
- \macro const char* Q_FUNC_INFO()
- \relates <QtGlobal>
-
- Expands to a string that describe the function the macro resides in. How this string looks
- more specifically is compiler dependent. With GNU GCC it is typically the function signature,
- while with other compilers it might be the line and column number.
-
- Q_FUNC_INFO can be conveniently used with qDebug(). For example, this function:
-
- \snippet code/src_corelib_global_qglobal.cpp 22
-
- when instantiated with the integer type, will with the GCC compiler produce:
-
- \tt{const TInputType& myMin(const TInputType&, const TInputType&) [with TInputType = int] was called with value1: 3 value2: 4}
-
- If this macro is used outside a function, the behavior is undefined.
-*/
-
-/*!
- \internal
- The Q_CHECK_PTR macro calls this function if an allocation check
- fails.
-*/
-void qt_check_pointer(const char *n, int l) noexcept
-{
- // make separate printing calls so that the first one may flush;
- // the second one could want to allocate memory (fputs prints a
- // newline and stderr auto-flushes).
- fputs("Out of memory", stderr);
- fprintf(stderr, " in %s, line %d\n", n, l);
-
- std::terminate();
-}
-
-/*
- \internal
- Allows you to throw an exception without including <new>
- Called internally from Q_CHECK_PTR on certain OS combinations
-*/
-void qBadAlloc()
-{
-#ifndef QT_NO_EXCEPTIONS
- throw std::bad_alloc();
-#else
- std::terminate();
-#endif
-}
-
-/*
- \internal
- Allows you to call std::terminate() without including <exception>.
- Called internally from QT_TERMINATE_ON_EXCEPTION
-*/
-Q_NORETURN void qTerminate() noexcept
-{
- std::terminate();
-}
-
-/*
- The Q_ASSERT macro calls this function when the test fails.
-*/
-void qt_assert(const char *assertion, const char *file, int line) noexcept
-{
- QMessageLogger(file, line, nullptr).fatal("ASSERT: \"%s\" in file %s, line %d", assertion, file, line);
-}
-
-/*
- The Q_ASSERT_X macro calls this function when the test fails.
-*/
-void qt_assert_x(const char *where, const char *what, const char *file, int line) noexcept
-{
- QMessageLogger(file, line, nullptr).fatal("ASSERT failure in %s: \"%s\", file %s, line %d", where, what, file, line);
-}
-
/*
Dijkstra's bisection algorithm to find the square root of an integer.
- Deliberately not exported as part of the Qt API, but used in both
- qsimplerichtext.cpp and qgfxraster_qws.cpp
+ Deliberately not exported as part of the Qt API, but used in
+ qtextdocument.cpp.
*/
Q_CORE_EXPORT Q_DECL_CONST_FUNCTION unsigned int qt_int_sqrt(unsigned int n)
{
@@ -3342,910 +118,10 @@ Q_CORE_EXPORT Q_DECL_CONST_FUNCTION unsigned int qt_int_sqrt(unsigned int n)
return p;
}
-// In the C runtime on all platforms access to the environment is not thread-safe. We
-// add thread-safety for the Qt wrappers.
-static QBasicMutex environmentMutex;
-
-/*
- Wraps tzset(), which accesses the environment, so should only be called while
- we hold the lock on the environment mutex.
-*/
-void qTzSet()
-{
- const auto locker = qt_scoped_lock(environmentMutex);
-#if defined(Q_OS_WIN)
- _tzset();
-#else
- tzset();
-#endif // Q_OS_WIN
-}
-
-/*
- Wrap mktime(), which is specified to behave as if it called tzset(), hence
- shares its implicit environment-dependence.
-*/
-time_t qMkTime(struct tm *when)
-{
- const auto locker = qt_scoped_lock(environmentMutex);
- return mktime(when);
-}
-
-void qAbort()
-{
-#ifdef Q_OS_WIN
- // std::abort() in the MSVC runtime will call _exit(3) if the abort
- // behavior is _WRITE_ABORT_MSG - see also _set_abort_behavior(). This is
- // the default for a debug-mode build of the runtime. Worse, MinGW's
- // std::abort() implementation (in msvcrt.dll) is basically a call to
- // _exit(3) too. Unfortunately, _exit() and _Exit() *do* run the static
- // destructors of objects in DLLs, a violation of the C++ standard (see
- // [support.start.term]). So we bypass std::abort() and directly
- // terminate the application.
-
-# if defined(Q_CC_MSVC) && !defined(Q_CC_INTEL)
- if (IsProcessorFeaturePresent(PF_FASTFAIL_AVAILABLE))
- __fastfail(FAST_FAIL_FATAL_APP_EXIT);
-# else
- RaiseFailFastException(nullptr, nullptr, 0);
-# endif
-
- // Fallback
- TerminateProcess(GetCurrentProcess(), STATUS_FATAL_APP_EXIT);
-
- // Tell the compiler the application has stopped.
- Q_UNREACHABLE_IMPL();
-#else // !Q_OS_WIN
- std::abort();
-#endif
-}
-
// Also specified to behave as if they call tzset():
// localtime() -- but not localtime_r(), which we use when threaded
// strftime() -- not used (except in tests)
-/*!
- \relates <QtGlobal>
- \threadsafe
-
- Returns the value of the environment variable with name \a varName as a
- QByteArray. If no variable by that name is found in the environment, this
- function returns a default-constructed QByteArray.
-
- The Qt environment manipulation functions are thread-safe, but this
- requires that the C library equivalent functions like getenv and putenv are
- not directly called.
-
- To convert the data to a QString use QString::fromLocal8Bit().
-
- \note on desktop Windows, qgetenv() may produce data loss if the
- original string contains Unicode characters not representable in the
- ANSI encoding. Use qEnvironmentVariable() instead.
- On Unix systems, this function is lossless.
-
- \sa qputenv(), qEnvironmentVariable(), qEnvironmentVariableIsSet(),
- qEnvironmentVariableIsEmpty()
-*/
-QByteArray qgetenv(const char *varName)
-{
- const auto locker = qt_scoped_lock(environmentMutex);
-#ifdef Q_CC_MSVC
- size_t requiredSize = 0;
- QByteArray buffer;
- getenv_s(&requiredSize, 0, 0, varName);
- if (requiredSize == 0)
- return buffer;
- buffer.resize(int(requiredSize));
- getenv_s(&requiredSize, buffer.data(), requiredSize, varName);
- // requiredSize includes the terminating null, which we don't want.
- Q_ASSERT(buffer.endsWith('\0'));
- buffer.chop(1);
- return buffer;
-#else
- return QByteArray(::getenv(varName));
-#endif
-}
-
-/*!
- \fn QString qEnvironmentVariable(const char *varName, const QString &defaultValue)
- \fn QString qEnvironmentVariable(const char *varName)
-
- \relates <QtGlobal>
- \since 5.10
-
- These functions return the value of the environment variable, \a varName, as a
- QString. If no variable \a varName is found in the environment and \a defaultValue
- is provided, \a defaultValue is returned. Otherwise QString() is returned.
-
- The Qt environment manipulation functions are thread-safe, but this
- requires that the C library equivalent functions like getenv and putenv are
- not directly called.
-
- The following table describes how to choose between qgetenv() and
- qEnvironmentVariable():
- \table
- \header \li Condition \li Recommendation
- \row
- \li Variable contains file paths or user text
- \li qEnvironmentVariable()
- \row
- \li Windows-specific code
- \li qEnvironmentVariable()
- \row
- \li Unix-specific code, destination variable is not QString and/or is
- used to interface with non-Qt APIs
- \li qgetenv()
- \row
- \li Destination variable is a QString
- \li qEnvironmentVariable()
- \row
- \li Destination variable is a QByteArray or std::string
- \li qgetenv()
- \endtable
-
- \note on Unix systems, this function may produce data loss if the original
- string contains arbitrary binary data that cannot be decoded by the locale
- codec. Use qgetenv() instead for that case. On Windows, this function is
- lossless.
-
- \note the variable name \a varName must contain only US-ASCII characters.
-
- \sa qputenv(), qgetenv(), qEnvironmentVariableIsSet(), qEnvironmentVariableIsEmpty()
-*/
-QString qEnvironmentVariable(const char *varName, const QString &defaultValue)
-{
-#if defined(Q_OS_WIN)
- const auto locker = qt_scoped_lock(environmentMutex);
- QVarLengthArray<wchar_t, 32> wname(int(strlen(varName)) + 1);
- for (int i = 0; i < wname.size(); ++i) // wname.size() is correct: will copy terminating null
- wname[i] = uchar(varName[i]);
- size_t requiredSize = 0;
- QString buffer;
- _wgetenv_s(&requiredSize, 0, 0, wname.data());
- if (requiredSize == 0)
- return defaultValue;
- buffer.resize(int(requiredSize));
- _wgetenv_s(&requiredSize, reinterpret_cast<wchar_t *>(buffer.data()), requiredSize,
- wname.data());
- // requiredSize includes the terminating null, which we don't want.
- Q_ASSERT(buffer.endsWith(QLatin1Char('\0')));
- buffer.chop(1);
- return buffer;
-#else
- QByteArray value = qgetenv(varName);
- if (value.isNull())
- return defaultValue;
-// duplicated in qfile.h (QFile::decodeName)
-#if defined(Q_OS_DARWIN)
- return QString::fromUtf8(value).normalized(QString::NormalizationForm_C);
-#else // other Unix
- return QString::fromLocal8Bit(value);
-#endif
-#endif
-}
-
-QString qEnvironmentVariable(const char *varName)
-{
- return qEnvironmentVariable(varName, QString());
-}
-
-/*!
- \relates <QtGlobal>
- \since 5.1
-
- Returns whether the environment variable \a varName is empty.
-
- Equivalent to
- \snippet code/src_corelib_global_qglobal.cpp is-empty
- except that it's potentially much faster, and can't throw exceptions.
-
- \sa qgetenv(), qEnvironmentVariable(), qEnvironmentVariableIsSet()
-*/
-bool qEnvironmentVariableIsEmpty(const char *varName) noexcept
-{
- const auto locker = qt_scoped_lock(environmentMutex);
-#ifdef Q_CC_MSVC
- // we provide a buffer that can only hold the empty string, so
- // when the env.var isn't empty, we'll get an ERANGE error (buffer
- // too small):
- size_t dummy;
- char buffer = '\0';
- return getenv_s(&dummy, &buffer, 1, varName) != ERANGE;
-#else
- const char * const value = ::getenv(varName);
- return !value || !*value;
-#endif
-}
-
-/*!
- \relates <QtGlobal>
- \since 5.5
-
- Returns the numerical value of the environment variable \a varName.
- If \a ok is not null, sets \c{*ok} to \c true or \c false depending
- on the success of the conversion.
-
- Equivalent to
- \snippet code/src_corelib_global_qglobal.cpp to-int
- except that it's much faster, and can't throw exceptions.
-
- \note there's a limit on the length of the value, which is sufficient for
- all valid values of int, not counting leading zeroes or spaces. Values that
- are too long will either be truncated or this function will set \a ok to \c
- false.
-
- \sa qgetenv(), qEnvironmentVariable(), qEnvironmentVariableIsSet()
-*/
-int qEnvironmentVariableIntValue(const char *varName, bool *ok) noexcept
-{
- static const int NumBinaryDigitsPerOctalDigit = 3;
- static const int MaxDigitsForOctalInt =
- (std::numeric_limits<uint>::digits + NumBinaryDigitsPerOctalDigit - 1) / NumBinaryDigitsPerOctalDigit;
-
- const auto locker = qt_scoped_lock(environmentMutex);
- size_t size;
-#ifdef Q_CC_MSVC
- // we provide a buffer that can hold any int value:
- char buffer[MaxDigitsForOctalInt + 2]; // +1 for NUL +1 for optional '-'
- size_t dummy;
- if (getenv_s(&dummy, buffer, sizeof buffer, varName) != 0) {
- if (ok)
- *ok = false;
- return 0;
- }
- size = strlen(buffer);
-#else
- const char * const buffer = ::getenv(varName);
- if (!buffer || (size = strlen(buffer)) > MaxDigitsForOctalInt + 2) {
- if (ok)
- *ok = false;
- return 0;
- }
-#endif
- return QByteArrayView(buffer, size).toInt(ok, 0);
-}
-
-/*!
- \relates <QtGlobal>
- \since 5.1
-
- Returns whether the environment variable \a varName is set.
-
- Equivalent to
- \snippet code/src_corelib_global_qglobal.cpp is-null
- except that it's potentially much faster, and can't throw exceptions.
-
- \sa qgetenv(), qEnvironmentVariable(), qEnvironmentVariableIsEmpty()
-*/
-bool qEnvironmentVariableIsSet(const char *varName) noexcept
-{
- const auto locker = qt_scoped_lock(environmentMutex);
-#ifdef Q_CC_MSVC
- size_t requiredSize = 0;
- (void)getenv_s(&requiredSize, 0, 0, varName);
- return requiredSize != 0;
-#else
- return ::getenv(varName) != nullptr;
-#endif
-}
-
-/*!
- \relates <QtGlobal>
-
- This function sets the \a value of the environment variable named
- \a varName. It will create the variable if it does not exist. It
- returns 0 if the variable could not be set.
-
- Calling qputenv with an empty value removes the environment variable on
- Windows, and makes it set (but empty) on Unix. Prefer using qunsetenv()
- for fully portable behavior.
-
- \note qputenv() was introduced because putenv() from the standard
- C library was deprecated in VC2005 (and later versions). qputenv()
- uses the replacement function in VC, and calls the standard C
- library's implementation on all other platforms.
-
- \sa qgetenv(), qEnvironmentVariable()
-*/
-bool qputenv(const char *varName, const QByteArray &value)
-{
- const auto locker = qt_scoped_lock(environmentMutex);
-#if defined(Q_CC_MSVC)
- return _putenv_s(varName, value.constData()) == 0;
-#elif (defined(_POSIX_VERSION) && (_POSIX_VERSION-0) >= 200112L) || defined(Q_OS_HAIKU)
- // POSIX.1-2001 has setenv
- return setenv(varName, value.constData(), true) == 0;
-#else
- QByteArray buffer(varName);
- buffer += '=';
- buffer += value;
- char *envVar = qstrdup(buffer.constData());
- int result = putenv(envVar);
- if (result != 0) // error. we have to delete the string.
- delete[] envVar;
- return result == 0;
-#endif
-}
-
-/*!
- \relates <QtGlobal>
-
- This function deletes the variable \a varName from the environment.
-
- Returns \c true on success.
-
- \since 5.1
-
- \sa qputenv(), qgetenv(), qEnvironmentVariable()
-*/
-bool qunsetenv(const char *varName)
-{
- const auto locker = qt_scoped_lock(environmentMutex);
-#if defined(Q_CC_MSVC)
- return _putenv_s(varName, "") == 0;
-#elif (defined(_POSIX_VERSION) && (_POSIX_VERSION-0) >= 200112L) || defined(Q_OS_BSD4) || defined(Q_OS_HAIKU)
- // POSIX.1-2001, BSD and Haiku have unsetenv
- return unsetenv(varName) == 0;
-#elif defined(Q_CC_MINGW)
- // On mingw, putenv("var=") removes "var" from the environment
- QByteArray buffer(varName);
- buffer += '=';
- return putenv(buffer.constData()) == 0;
-#else
- // Fallback to putenv("var=") which will insert an empty var into the
- // environment and leak it
- QByteArray buffer(varName);
- buffer += '=';
- char *envVar = qstrdup(buffer.constData());
- return putenv(envVar) == 0;
-#endif
-}
-
-/*!
- \macro forever
- \relates <QtGlobal>
-
- This macro is provided for convenience for writing infinite
- loops.
-
- Example:
-
- \snippet code/src_corelib_global_qglobal.cpp 31
-
- It is equivalent to \c{for (;;)}.
-
- If you're worried about namespace pollution, you can disable this
- macro by adding the following line to your \c .pro file:
-
- \snippet code/src_corelib_global_qglobal.cpp 32
-
- \sa Q_FOREVER
-*/
-
-/*!
- \macro Q_FOREVER
- \relates <QtGlobal>
-
- Same as \l{forever}.
-
- This macro is available even when \c no_keywords is specified
- using the \c .pro file's \c CONFIG variable.
-
- \sa foreach()
-*/
-
-/*!
- \macro foreach(variable, container)
- \relates <QtGlobal>
-
- This macro is used to implement Qt's \c foreach loop. The \a
- variable parameter is a variable name or variable definition; the
- \a container parameter is a Qt container whose value type
- corresponds to the type of the variable. See \l{The foreach
- Keyword} for details.
-
- If you're worried about namespace pollution, you can disable this
- macro by adding the following line to your \c .pro file:
-
- \snippet code/src_corelib_global_qglobal.cpp 33
-
- \note Since Qt 5.7, the use of this macro is discouraged. It will
- be removed in a future version of Qt. Please use C++11 range-for,
- possibly with qAsConst(), as needed.
-
- \sa qAsConst()
-*/
-
-/*!
- \macro Q_FOREACH(variable, container)
- \relates <QtGlobal>
-
- Same as foreach(\a variable, \a container).
-
- This macro is available even when \c no_keywords is specified
- using the \c .pro file's \c CONFIG variable.
-
- \note Since Qt 5.7, the use of this macro is discouraged. It will
- be removed in a future version of Qt. Please use C++11 range-for,
- possibly with qAsConst(), as needed.
-
- \sa qAsConst()
-*/
-
-/*!
- \fn template <typename T> typename std::add_const<T>::type &qAsConst(T &t)
- \relates <QtGlobal>
- \since 5.7
-
- Returns \a t cast to \c{const T}.
-
- This function is a Qt implementation of C++17's std::as_const(),
- a cast function like std::move(). But while std::move() turns
- lvalues into rvalues, this function turns non-const lvalues into
- const lvalues. Like std::as_const(), it doesn't work on rvalues,
- because it cannot be efficiently implemented for rvalues without
- leaving dangling references.
-
- Its main use in Qt is to prevent implicitly-shared Qt containers
- from detaching:
- \snippet code/src_corelib_global_qglobal.cpp as-const-0
-
- Of course, in this case, you could (and probably should) have declared
- \c s as \c const in the first place:
- \snippet code/src_corelib_global_qglobal.cpp as-const-1
- but often that is not easily possible.
-
- It is important to note that qAsConst() does not copy its argument,
- it just performs a \c{const_cast<const T&>(t)}. This is also the reason
- why it is designed to fail for rvalues: The returned reference would go
- stale too soon. So while this works (but detaches the returned object):
- \snippet code/src_corelib_global_qglobal.cpp as-const-2
-
- this would not:
- \snippet code/src_corelib_global_qglobal.cpp as-const-3
-
- To prevent this construct from compiling (and failing at runtime), qAsConst() has
- a second, deleted, overload which binds to rvalues.
-*/
-
-/*!
- \fn template <typename T> void qAsConst(const T &&t)
- \relates <QtGlobal>
- \since 5.7
- \overload
-
- This overload is deleted to prevent a dangling reference in code like
- \snippet code/src_corelib_global_qglobal.cpp as-const-4
-*/
-
-/*!
- \fn template <typename T, typename U = T> T qExchange(T &obj, U &&newValue)
- \relates <QtGlobal>
- \since 5.14
-
- Replaces the value of \a obj with \a newValue and returns the old value of \a obj.
-
- This is Qt's implementation of std::exchange(). It differs from std::exchange()
- only in that it is \c constexpr already in C++14, and available on all supported
- compilers.
-
- Here is how to use qExchange() to implement move constructors:
- \code
- MyClass(MyClass &&other)
- : m_pointer{qExchange(other.m_pointer, nullptr)},
- m_int{qExchange(other.m_int, 0)},
- m_vector{std::move(other.m_vector)},
- ...
- \endcode
-
- For members of class type, we can use std::move(), as their move-constructor will
- do the right thing. But for scalar types such as raw pointers or integer type, move
- is the same as copy, which, particularly for pointers, is not what we expect. So, we
- cannot use std::move() for such types, but we can use std::exchange()/qExchange() to
- make sure the source object's member is already reset by the time we get to the
- initialization of our next data member, which might come in handy if the constructor
- exits with an exception.
-
- Here is how to use qExchange() to write a loop that consumes the collection it
- iterates over:
- \code
- for (auto &e : qExchange(collection, {})
- doSomethingWith(e);
- \endcode
-
- Which is equivalent to the following, much more verbose code:
- \code
- {
- auto tmp = std::move(collection);
- collection = {}; // or collection.clear()
- for (auto &e : tmp)
- doSomethingWith(e);
- } // destroys 'tmp'
- \endcode
-
- This is perfectly safe, as the for-loop keeps the result of qExchange() alive for as
- long as the loop runs, saving the declaration of a temporary variable. Be aware, though,
- that qExchange() returns a non-const object, so Qt containers may detach.
-*/
-
-/*!
- \fn template <typename Enum> std::underlying_type_t<Enum> qToUnderlying(Enum e)
- \relates <QtGlobal>
- \since 6.2
-
- Converts the enumerator \a e to the equivalent value expressed in its
- enumeration's underlying type.
-*/
-
-/*!
- \macro QT_TR_NOOP(sourceText)
- \relates <QtGlobal>
-
- Marks the UTF-8 encoded string literal \a sourceText for delayed
- translation in the current context (class).
-
- The macro tells lupdate to collect the string, and expands to
- \a sourceText itself.
-
- Example:
-
- \snippet code/src_corelib_global_qglobal.cpp 34
-
- The macro QT_TR_NOOP_UTF8() is identical and obsolete; this applies
- to all other _UTF8 macros as well.
-
- \sa QT_TRANSLATE_NOOP(), {Internationalization with Qt}
-*/
-
-/*!
- \macro QT_TRANSLATE_NOOP(context, sourceText)
- \relates <QtGlobal>
-
- Marks the UTF-8 encoded string literal \a sourceText for delayed
- translation in the given \a context. The \a context is typically
- a class name and also needs to be specified as a string literal.
-
- The macro tells lupdate to collect the string, and expands to
- \a sourceText itself.
-
- Example:
-
- \snippet code/src_corelib_global_qglobal.cpp 35
-
- \sa QT_TR_NOOP(), QT_TRANSLATE_NOOP3(), {Internationalization with Qt}
-*/
-
-/*!
- \macro QT_TRANSLATE_NOOP3(context, sourceText, disambiguation)
- \relates <QtGlobal>
- \since 4.4
-
- Marks the UTF-8 encoded string literal \a sourceText for delayed
- translation in the given \a context with the given \a disambiguation.
- The \a context is typically a class and also needs to be specified
- as a string literal. The string literal \a disambiguation should be
- a short semantic tag to tell apart otherwise identical strings.
-
- The macro tells lupdate to collect the string, and expands to an
- anonymous struct of the two string literals passed as \a sourceText
- and \a disambiguation.
-
- Example:
-
- \snippet code/src_corelib_global_qglobal.cpp 36
-
- \sa QT_TR_NOOP(), QT_TRANSLATE_NOOP(), {Internationalization with Qt}
-*/
-
-/*!
- \macro QT_TR_N_NOOP(sourceText)
- \relates <QtGlobal>
- \since 5.12
-
- Marks the UTF-8 encoded string literal \a sourceText for numerator
- dependent delayed translation in the current context (class).
-
- The macro tells lupdate to collect the string, and expands to
- \a sourceText itself.
-
- The macro expands to \a sourceText.
-
- Example:
-
- \snippet code/src_corelib_global_qglobal.cpp qttrnnoop
-
- \sa QT_TR_NOOP, {Internationalization with Qt}
-*/
-
-/*!
- \macro QT_TRANSLATE_N_NOOP(context, sourceText)
- \relates <QtGlobal>
- \since 5.12
-
- Marks the UTF-8 encoded string literal \a sourceText for numerator
- dependent delayed translation in the given \a context.
- The \a context is typically a class name and also needs to be
- specified as a string literal.
-
- The macro tells lupdate to collect the string, and expands to
- \a sourceText itself.
-
- Example:
-
- \snippet code/src_corelib_global_qglobal.cpp qttranslatennoop
-
- \sa QT_TRANSLATE_NOOP(), QT_TRANSLATE_N_NOOP3(),
- {Internationalization with Qt}
-*/
-
-/*!
- \macro QT_TRANSLATE_N_NOOP3(context, sourceText, comment)
- \relates <QtGlobal>
- \since 5.12
-
- Marks the UTF-8 encoded string literal \a sourceText for numerator
- dependent delayed translation in the given \a context with the given
- \a comment.
- The \a context is typically a class and also needs to be specified
- as a string literal. The string literal \a comment should be
- a short semantic tag to tell apart otherwise identical strings.
-
- The macro tells lupdate to collect the string, and expands to an
- anonymous struct of the two string literals passed as \a sourceText
- and \a comment.
-
- Example:
-
- \snippet code/src_corelib_global_qglobal.cpp qttranslatennoop3
-
- \sa QT_TR_NOOP(), QT_TRANSLATE_NOOP(), QT_TRANSLATE_NOOP3(),
- {Internationalization with Qt}
-*/
-
-/*!
- \fn QString qtTrId(const char *id, int n = -1)
- \relates <QtGlobal>
- \reentrant
- \since 4.6
-
- \brief The qtTrId function finds and returns a translated string.
-
- Returns a translated string identified by \a id.
- If no matching string is found, the id itself is returned. This
- should not happen under normal conditions.
-
- If \a n >= 0, all occurrences of \c %n in the resulting string
- are replaced with a decimal representation of \a n. In addition,
- depending on \a n's value, the translation text may vary.
-
- Meta data and comments can be passed as documented for QObject::tr().
- In addition, it is possible to supply a source string template like that:
-
- \tt{//% <C string>}
-
- or
-
- \tt{\\begincomment% <C string> \\endcomment}
-
- Example:
-
- \snippet code/src_corelib_global_qglobal.cpp qttrid
-
- Creating QM files suitable for use with this function requires passing
- the \c -idbased option to the \c lrelease tool.
-
- \warning This method is reentrant only if all translators are
- installed \e before calling this method. Installing or removing
- translators while performing translations is not supported. Doing
- so will probably result in crashes or other undesirable behavior.
-
- \sa QObject::tr(), QCoreApplication::translate(), {Internationalization with Qt}
-*/
-
-/*!
- \macro QT_TRID_NOOP(id)
- \relates <QtGlobal>
- \since 4.6
-
- \brief The QT_TRID_NOOP macro marks an id for dynamic translation.
-
- The only purpose of this macro is to provide an anchor for attaching
- meta data like to qtTrId().
-
- The macro expands to \a id.
-
- Example:
-
- \snippet code/src_corelib_global_qglobal.cpp qttrid_noop
-
- \sa qtTrId(), {Internationalization with Qt}
-*/
-
-/*!
- \macro QT_TRID_N_NOOP(id)
- \relates <QtGlobal>
- \since 6.3
-
- \brief The QT_TRID_N_NOOP macro marks an id for numerator
- dependent dynamic translation.
-
- The only purpose of this macro is to provide an anchor for attaching
- meta data like to qtTrId().
-
- The macro expands to \a id.
-
- Example:
-
- \snippet code/src_corelib_global_qglobal.cpp qttrid_n_noop
-
- \sa qtTrId(), {Internationalization with Qt}
-*/
-
-/*!
- \macro Q_LIKELY(expr)
- \relates <QtGlobal>
- \since 4.8
-
- \brief Hints to the compiler that the enclosed condition, \a expr, is
- likely to evaluate to \c true.
-
- Use of this macro can help the compiler to optimize the code.
-
- Example:
-
- \snippet code/src_corelib_global_qglobal.cpp qlikely
-
- \sa Q_UNLIKELY()
-*/
-
-/*!
- \macro Q_UNLIKELY(expr)
- \relates <QtGlobal>
- \since 4.8
-
- \brief Hints to the compiler that the enclosed condition, \a expr, is
- likely to evaluate to \c false.
-
- Use of this macro can help the compiler to optimize the code.
-
- Example:
-
- \snippet code/src_corelib_global_qglobal.cpp qunlikely
-
- \sa Q_LIKELY()
-*/
-
-/*!
- \macro QT_POINTER_SIZE
- \relates <QtGlobal>
-
- Expands to the size of a pointer in bytes (4 or 8). This is
- equivalent to \c sizeof(void *) but can be used in a preprocessor
- directive.
-*/
-
-/*!
- \macro const char *qPrintable(const QString &str)
- \relates <QtGlobal>
-
- Returns \a str as a \c{const char *}. This is equivalent to
- \a{str}.toLocal8Bit().constData().
-
- The char pointer will be invalid after the statement in which
- qPrintable() is used. This is because the array returned by
- QString::toLocal8Bit() will fall out of scope.
-
- \note qDebug(), qInfo(), qWarning(), qCritical(), qFatal() expect
- %s arguments to be UTF-8 encoded, while qPrintable() converts to
- local 8-bit encoding. Therefore qUtf8Printable() should be used
- for logging strings instead of qPrintable().
-
- \sa qUtf8Printable()
-*/
-
-/*!
- \macro const char *qUtf8Printable(const QString &str)
- \relates <QtGlobal>
- \since 5.4
-
- Returns \a str as a \c{const char *}. This is equivalent to
- \a{str}.toUtf8().constData().
-
- The char pointer will be invalid after the statement in which
- qUtf8Printable() is used. This is because the array returned by
- QString::toUtf8() will fall out of scope.
-
- Example:
-
- \snippet code/src_corelib_global_qglobal.cpp 37
-
- \sa qPrintable(), qDebug(), qInfo(), qWarning(), qCritical(), qFatal()
-*/
-
-/*!
- \macro const wchar_t *qUtf16Printable(const QString &str)
- \relates <QtGlobal>
- \since 5.7
-
- Returns \a str as a \c{const ushort *}, but cast to a \c{const wchar_t *}
- to avoid warnings. This is equivalent to \a{str}.utf16() plus some casting.
-
- The only useful thing you can do with the return value of this macro is to
- pass it to QString::asprintf() for use in a \c{%ls} conversion. In particular,
- the return value is \e{not} a valid \c{const wchar_t*}!
-
- In general, the pointer will be invalid after the statement in which
- qUtf16Printable() is used. This is because the pointer may have been
- obtained from a temporary expression, which will fall out of scope.
-
- Example:
-
- \snippet code/src_corelib_global_qglobal.cpp qUtf16Printable
-
- \sa qPrintable(), qDebug(), qInfo(), qWarning(), qCritical(), qFatal()
-*/
-
-/*!
- \macro Q_DECLARE_TYPEINFO(Type, Flags)
- \relates <QtGlobal>
-
- You can use this macro to specify information about a custom type
- \a Type. With accurate type information, Qt's \l{Container Classes}
- {generic containers} can choose appropriate storage methods and
- algorithms.
-
- \a Flags can be one of the following:
-
- \list
- \li \c Q_PRIMITIVE_TYPE specifies that \a Type is a POD (plain old
- data) type with no constructor or destructor, and for which memcpy()ing
- creates a valid independent copy of the object.
- \li \c Q_RELOCATABLE_TYPE specifies that \a Type has a constructor
- and/or a destructor but can be moved in memory using \c
- memcpy().
- \li \c Q_MOVABLE_TYPE is the same as \c Q_RELOCATABLE_TYPE. Prefer to use
- \c Q_RELOCATABLE_TYPE in new code. Note: despite the name, this
- has nothing to do with move constructors or C++ move semantics.
- \li \c Q_COMPLEX_TYPE (the default) specifies that \a Type has
- constructors and/or a destructor and that it may not be moved
- in memory.
- \endlist
-
- Example of a "primitive" type:
-
- \snippet code/src_corelib_global_qglobal.cpp 38
-
- An example of a non-POD "primitive" type is QUuid: Even though
- QUuid has constructors (and therefore isn't POD), every bit
- pattern still represents a valid object, and memcpy() can be used
- to create a valid independent copy of a QUuid object.
-
- Example of a relocatable type:
-
- \snippet code/src_corelib_global_qglobal.cpp 39
-
- Qt will try to detect the class of a type using
- \l {https://en.cppreference.com/w/cpp/types/is_trivial} {std::is_trivial_v<T>}
- to identify primitive
- types and it will require both
- \l {https://en.cppreference.com/w/cpp/types/is_trivially_copyable} {std::is_trivially_copyable_v<T>}
- and
- \l {https://en.cppreference.com/w/cpp/types/is_destructible} {std::is_trivially_destructible_v<T>}
- to identify relocatable types.
- Use this macro to tune the behavior.
- For instance many types would be candidates for Q_RELOCATABLE_TYPE despite
- not being trivially-copyable.
-*/
-
-/*!
- \macro Q_UNUSED(name)
- \relates <QtGlobal>
-
- Indicates to the compiler that the parameter with the specified
- \a name is not used in the body of a function. This can be used to
- suppress compiler warnings while allowing functions to be defined
- with meaningful parameter names in their signatures.
-*/
-
struct QInternal_CallBackTable
{
QList<QList<qInternalCallback>> callbacks;
@@ -4294,57 +170,6 @@ bool QInternal::activateCallbacks(Callback cb, void **parameters)
}
/*!
- \macro Q_BYTE_ORDER
- \relates <QtGlobal>
-
- This macro can be used to determine the byte order your system
- uses for storing data in memory. i.e., whether your system is
- little-endian or big-endian. It is set by Qt to one of the macros
- Q_LITTLE_ENDIAN or Q_BIG_ENDIAN. You normally won't need to worry
- about endian-ness, but you might, for example if you need to know
- which byte of an integer or UTF-16 character is stored in the
- lowest address. Endian-ness is important in networking, where
- computers with different values for Q_BYTE_ORDER must pass data
- back and forth.
-
- Use this macro as in the following examples.
-
- \snippet code/src_corelib_global_qglobal.cpp 40
-
- \sa Q_BIG_ENDIAN, Q_LITTLE_ENDIAN
-*/
-
-/*!
- \macro Q_LITTLE_ENDIAN
- \relates <QtGlobal>
-
- This macro represents a value you can compare to the macro
- Q_BYTE_ORDER to determine the endian-ness of your system. In a
- little-endian system, the least significant byte is stored at the
- lowest address. The other bytes follow in increasing order of
- significance.
-
- \snippet code/src_corelib_global_qglobal.cpp 41
-
- \sa Q_BYTE_ORDER, Q_BIG_ENDIAN
-*/
-
-/*!
- \macro Q_BIG_ENDIAN
- \relates <QtGlobal>
-
- This macro represents a value you can compare to the macro
- Q_BYTE_ORDER to determine the endian-ness of your system. In a
- big-endian system, the most significant byte is stored at the
- lowest address. The other bytes follow in decreasing order of
- significance.
-
- \snippet code/src_corelib_global_qglobal.cpp 42
-
- \sa Q_BYTE_ORDER, Q_LITTLE_ENDIAN
-*/
-
-/*!
\macro QT_NAMESPACE
\internal
@@ -4474,296 +299,6 @@ bool QInternal::activateCallbacks(Callback cb, void **parameters)
*/
/*!
- \fn bool qFuzzyCompare(double p1, double p2)
- \relates <QtGlobal>
- \since 4.4
- \threadsafe
-
- Compares the floating point value \a p1 and \a p2 and
- returns \c true if they are considered equal, otherwise \c false.
-
- Note that comparing values where either \a p1 or \a p2 is 0.0 will not work,
- nor does comparing values where one of the values is NaN or infinity.
- If one of the values is always 0.0, use qFuzzyIsNull instead. If one of the
- values is likely to be 0.0, one solution is to add 1.0 to both values.
-
- \snippet code/src_corelib_global_qglobal.cpp 46
-
- The two numbers are compared in a relative way, where the
- exactness is stronger the smaller the numbers are.
-*/
-
-/*!
- \fn bool qFuzzyCompare(float p1, float p2)
- \relates <QtGlobal>
- \since 4.4
- \threadsafe
-
- Compares the floating point value \a p1 and \a p2 and
- returns \c true if they are considered equal, otherwise \c false.
-
- The two numbers are compared in a relative way, where the
- exactness is stronger the smaller the numbers are.
-*/
-
-/*!
- \fn bool qFuzzyIsNull(double d)
- \relates <QtGlobal>
- \since 4.4
- \threadsafe
-
- Returns true if the absolute value of \a d is within 0.000000000001 of 0.0.
-*/
-
-/*!
- \fn bool qFuzzyIsNull(float f)
- \relates <QtGlobal>
- \since 4.4
- \threadsafe
-
- Returns true if the absolute value of \a f is within 0.00001f of 0.0.
-*/
-
-/*!
- \macro QT_REQUIRE_VERSION(int argc, char **argv, const char *version)
- \relates <QtGlobal>
-
- This macro can be used to ensure that the application is run
- with a recent enough version of Qt. This is especially useful
- if your application depends on a specific bug fix introduced in a
- bug-fix release (for example, 6.1.2).
-
- The \a argc and \a argv parameters are the \c main() function's
- \c argc and \c argv parameters. The \a version parameter is a
- string literal that specifies which version of Qt the application
- requires (for example, "6.1.2").
-
- Example:
-
- \snippet code/src_gui_dialogs_qmessagebox.cpp 4
-*/
-
-/*!
- \macro Q_DECL_EXPORT
- \relates <QtGlobal>
-
- This macro marks a symbol for shared library export (see
- \l{sharedlibrary.html}{Creating Shared Libraries}).
-
- \sa Q_DECL_IMPORT
-*/
-
-/*!
- \macro Q_DECL_IMPORT
- \relates <QtGlobal>
-
- This macro declares a symbol to be an import from a shared library (see
- \l{sharedlibrary.html}{Creating Shared Libraries}).
-
- \sa Q_DECL_EXPORT
-*/
-
-/*!
- \macro Q_DECL_CONSTEXPR
- \relates <QtGlobal>
-
- This macro can be used to declare variable that should be constructed at compile-time,
- or an inline function that can be computed at compile-time.
-
- It expands to "constexpr" if your compiler supports that C++11 keyword, or to nothing
- otherwise.
-
- \sa Q_DECL_RELAXED_CONSTEXPR
-*/
-
-/*!
- \macro Q_DECL_RELAXED_CONSTEXPR
- \relates <QtGlobal>
-
- This macro can be used to declare an inline function that can be computed
- at compile-time according to the relaxed rules from C++14.
-
- It expands to "constexpr" if your compiler supports C++14 relaxed constant
- expressions, or to nothing otherwise.
-
- \sa Q_DECL_CONSTEXPR
-*/
-
-/*!
- \macro qDebug(const char *message, ...)
- \relates <QtGlobal>
- \threadsafe
-
- Calls the message handler with the debug message \a message. If no
- message handler has been installed, the message is printed to
- stderr. Under Windows the message is sent to the console, if it is a
- console application; otherwise, it is sent to the debugger. On QNX, the
- message is sent to slogger2. This function does nothing if \c QT_NO_DEBUG_OUTPUT
- was defined during compilation.
-
- If you pass the function a format string and a list of arguments,
- it works in similar way to the C printf() function. The format
- should be a Latin-1 string.
-
- Example:
-
- \snippet code/src_corelib_global_qglobal.cpp 24
-
- If you include \c <QtDebug>, a more convenient syntax is also
- available:
-
- \snippet code/src_corelib_global_qglobal.cpp 25
-
- With this syntax, the function returns a QDebug object that is
- configured to use the QtDebugMsg message type. It automatically
- puts a single space between each item, and outputs a newline at
- the end. It supports many C++ and Qt types.
-
- To suppress the output at runtime, install your own message handler
- with qInstallMessageHandler().
-
- \sa qInfo(), qWarning(), qCritical(), qFatal(), qInstallMessageHandler(),
- {Debugging Techniques}
-*/
-
-/*!
- \macro qInfo(const char *message, ...)
- \relates <QtGlobal>
- \threadsafe
- \since 5.5
-
- Calls the message handler with the informational message \a message. If no
- message handler has been installed, the message is printed to
- stderr. Under Windows, the message is sent to the console, if it is a
- console application; otherwise, it is sent to the debugger. On QNX the
- message is sent to slogger2. This function does nothing if \c QT_NO_INFO_OUTPUT
- was defined during compilation.
-
- If you pass the function a format string and a list of arguments,
- it works in similar way to the C printf() function. The format
- should be a Latin-1 string.
-
- Example:
-
- \snippet code/src_corelib_global_qglobal.cpp qInfo_printf
-
- If you include \c <QtDebug>, a more convenient syntax is also
- available:
-
- \snippet code/src_corelib_global_qglobal.cpp qInfo_stream
-
- With this syntax, the function returns a QDebug object that is
- configured to use the QtInfoMsg message type. It automatically
- puts a single space between each item, and outputs a newline at
- the end. It supports many C++ and Qt types.
-
- To suppress the output at runtime, install your own message handler
- using qInstallMessageHandler().
-
- \sa qDebug(), qWarning(), qCritical(), qFatal(), qInstallMessageHandler(),
- {Debugging Techniques}
-*/
-
-/*!
- \macro qWarning(const char *message, ...)
- \relates <QtGlobal>
- \threadsafe
-
- Calls the message handler with the warning message \a message. If no
- message handler has been installed, the message is printed to
- stderr. Under Windows, the message is sent to the debugger.
- On QNX the message is sent to slogger2. This
- function does nothing if \c QT_NO_WARNING_OUTPUT was defined
- during compilation; it exits if at the nth warning corresponding to the
- counter in environment variable \c QT_FATAL_WARNINGS. That is, if the
- environment variable contains the value 1, it will exit on the 1st message;
- if it contains the value 10, it will exit on the 10th message. Any
- non-numeric value is equivalent to 1.
-
- This function takes a format string and a list of arguments,
- similar to the C printf() function. The format should be a Latin-1
- string.
-
- Example:
- \snippet code/src_corelib_global_qglobal.cpp 26
-
- If you include <QtDebug>, a more convenient syntax is
- also available:
-
- \snippet code/src_corelib_global_qglobal.cpp 27
-
- This syntax inserts a space between each item, and
- appends a newline at the end.
-
- To suppress the output at runtime, install your own message handler
- with qInstallMessageHandler().
-
- \sa qDebug(), qInfo(), qCritical(), qFatal(), qInstallMessageHandler(),
- {Debugging Techniques}
-*/
-
-/*!
- \macro qCritical(const char *message, ...)
- \relates <QtGlobal>
- \threadsafe
-
- Calls the message handler with the critical message \a message. If no
- message handler has been installed, the message is printed to
- stderr. Under Windows, the message is sent to the debugger.
- On QNX the message is sent to slogger2.
-
- It exits if the environment variable QT_FATAL_CRITICALS is not empty.
-
- This function takes a format string and a list of arguments,
- similar to the C printf() function. The format should be a Latin-1
- string.
-
- Example:
- \snippet code/src_corelib_global_qglobal.cpp 28
-
- If you include <QtDebug>, a more convenient syntax is
- also available:
-
- \snippet code/src_corelib_global_qglobal.cpp 29
-
- A space is inserted between the items, and a newline is
- appended at the end.
-
- To suppress the output at runtime, install your own message handler
- with qInstallMessageHandler().
-
- \sa qDebug(), qInfo(), qWarning(), qFatal(), qInstallMessageHandler(),
- {Debugging Techniques}
-*/
-
-/*!
- \macro qFatal(const char *message, ...)
- \relates <QtGlobal>
-
- Calls the message handler with the fatal message \a message. If no
- message handler has been installed, the message is printed to
- stderr. Under Windows, the message is sent to the debugger.
- On QNX the message is sent to slogger2.
-
- If you are using the \b{default message handler} this function will
- abort to create a core dump. On Windows, for debug builds,
- this function will report a _CRT_ERROR enabling you to connect a debugger
- to the application.
-
- This function takes a format string and a list of arguments,
- similar to the C printf() function.
-
- Example:
- \snippet code/src_corelib_global_qglobal.cpp 30
-
- To suppress the output at runtime, install your own message handler
- with qInstallMessageHandler().
-
- \sa qDebug(), qInfo(), qWarning(), qCritical(), qInstallMessageHandler(),
- {Debugging Techniques}
-*/
-
-/*!
\macro qMove(x)
\relates <QtGlobal>
\deprecated
@@ -4776,172 +311,49 @@ bool QInternal::activateCallbacks(Callback cb, void **parameters)
*/
/*!
- \macro Q_DECL_NOTHROW
- \relates <QtGlobal>
- \since 5.0
-
- This macro marks a function as never throwing, under no
- circumstances. If the function does nevertheless throw, the
- behaviour is undefined.
-
- The macro expands to either "throw()", if that has some benefit on
- the compiler, or to C++11 noexcept, if available, or to nothing
- otherwise.
-
- If you need C++11 noexcept semantics, don't use this macro, use
- Q_DECL_NOEXCEPT/Q_DECL_NOEXCEPT_EXPR instead.
-
- \sa Q_DECL_NOEXCEPT, Q_DECL_NOEXCEPT_EXPR()
-*/
-
-/*!
- \macro QT_TERMINATE_ON_EXCEPTION(expr)
- \relates <QtGlobal>
- \internal
-
- In general, use of the Q_DECL_NOEXCEPT macro is preferred over
- Q_DECL_NOTHROW, because it exhibits well-defined behavior and
- supports the more powerful Q_DECL_NOEXCEPT_EXPR variant. However,
- use of Q_DECL_NOTHROW has the advantage that Windows builds
- benefit on a wide range or compiler versions that do not yet
- support the C++11 noexcept feature.
-
- It may therefore be beneficial to use Q_DECL_NOTHROW and emulate
- the C++11 behavior manually with an embedded try/catch.
-
- Qt provides the QT_TERMINATE_ON_EXCEPTION(expr) macro for this
- purpose. It either expands to \c expr (if Qt is compiled without
- exception support or the compiler supports C++11 noexcept
- semantics) or to
- \snippet code/src_corelib_global_qglobal.cpp qterminate
- otherwise.
-
- Since this macro expands to just \c expr if the compiler supports
- C++11 noexcept, expecting the compiler to take over responsibility
- of calling std::terminate() in that case, it should not be used
- outside Q_DECL_NOTHROW functions.
-
- \sa Q_DECL_NOEXCEPT, Q_DECL_NOTHROW, qTerminate()
-*/
-
-/*!
- \macro Q_DECL_NOEXCEPT
+ \macro QT_ENABLE_STRICT_MODE_UP_TO
\relates <QtGlobal>
- \since 5.0
-
- This macro marks a function as never throwing. If the function
- does nevertheless throw, the behaviour is defined:
- std::terminate() is called.
-
- The macro expands to C++11 noexcept, if available, or to nothing
- otherwise.
-
- If you need the operator version of C++11 noexcept, use
- Q_DECL_NOEXCEPT_EXPR(x).
+ \since 6.8
- If you don't need C++11 noexcept semantics, e.g. because your
- function can't possibly throw, don't use this macro, use
- Q_DECL_NOTHROW instead.
+ Defining this macro will disable a number of Qt APIs that are
+ deemed suboptimal or dangerous.
- \sa Q_DECL_NOTHROW, Q_DECL_NOEXCEPT_EXPR()
-*/
-
-/*!
- \macro Q_DECL_NOEXCEPT_EXPR(x)
- \relates <QtGlobal>
- \since 5.0
+ This macro's value must be set to a Qt version, using
+ \l{QT_VERSION_CHECK}'s encoding. For instance, in order to set it
+ to Qt 6.6, define \c{QT_ENABLE_STRICT_MODE_UP_TO=0x060600}.
+ This will disable only the APIs introduced in versions up to (and
+ including) the specified Qt version.
- This macro marks a function as non-throwing if \a x is \c true. If
- the function does nevertheless throw, the behaviour is defined:
- std::terminate() is called.
+ If the \l QT_DISABLE_DEPRECATED_UP_TO macro is \e not defined,
+ then QT_ENABLE_STRICT_MODE_UP_TO will define it as well,
+ to the same value.
- The macro expands to C++11 noexcept(x), if available, or to
- nothing otherwise.
+ This macro should always be set to the minimum Qt version that
+ your project wants to support.
- If you need the always-true version of C++11 noexcept, use
- Q_DECL_NOEXCEPT.
-
- If you don't need C++11 noexcept semantics, e.g. because your
- function can't possibly throw, don't use this macro, use
- Q_DECL_NOTHROW instead.
-
- \sa Q_DECL_NOTHROW, Q_DECL_NOEXCEPT
-*/
-
-/*!
- \macro Q_DECL_OVERRIDE
- \since 5.0
- \deprecated
- \relates <QtGlobal>
+ The APIs disabled by this macro are listed in the table below,
+ together with the minimum value to use in order to disable them.
- This macro can be used to declare an overriding virtual
- function. Use of this markup will allow the compiler to generate
- an error if the overriding virtual function does not in fact
- override anything.
-
- It expands to "override".
-
- The macro goes at the end of the function, usually after the
- \c{const}, if any:
- \snippet code/src_corelib_global_qglobal.cpp qdecloverride
-
- \sa Q_DECL_FINAL
-*/
-
-/*!
- \macro Q_DECL_FINAL
- \since 5.0
- \deprecated
- \relates <QtGlobal>
-
- This macro can be used to declare an overriding virtual or a class
- as "final", with Java semantics. Further-derived classes can then
- no longer override this virtual function, or inherit from this
- class, respectively.
-
- It expands to "final".
-
- The macro goes at the end of the function, usually after the
- \c{const}, if any:
- \snippet code/src_corelib_global_qglobal.cpp qdeclfinal-1
-
- For classes, it goes in front of the \c{:} in the class
- definition, if any:
- \snippet code/src_corelib_global_qglobal.cpp qdeclfinal-2
-
- \sa Q_DECL_OVERRIDE
-*/
-
-/*!
- \macro Q_FORWARD_DECLARE_OBJC_CLASS(classname)
- \since 5.2
- \relates <QtGlobal>
-
- Forward-declares an Objective-C \a classname in a manner such that it can be
- compiled as either Objective-C or C++.
-
- This is primarily intended for use in header files that may be included by
- both Objective-C and C++ source files.
-*/
-
-/*!
- \macro Q_FORWARD_DECLARE_CF_TYPE(type)
- \since 5.2
- \relates <QtGlobal>
-
- Forward-declares a Core Foundation \a type. This includes the actual
- type and the ref type. For example, Q_FORWARD_DECLARE_CF_TYPE(CFString)
- declares __CFString and CFStringRef.
-*/
+ \table
+ \header \li Version \li Disabled APIs
+ \row \li 6.0.0 \li \l{foreach-keyword}{foreach} (see \l{QT_NO_FOREACH})
+ \row \li 6.0.0 \li QString constructors from \c{const char *} (see \l{QT_NO_CAST_FROM_ASCII})
+ \row \li 6.0.0 \li QString conversions towards \c{const char *} / QByteArray (see \l{QT_NO_CAST_TO_ASCII})
+ \row \li 6.0.0 \li QByteArray implicit conversions towards \c{const char *} (see \l{QT_NO_CAST_FROM_BYTEARRAY})
+ \row \li 6.0.0 \li QUrl implicit conversions from QString (see \l{QT_NO_URL_CAST_FROM_STRING})
+ \row \li 6.0.0 \li Allowing narrowing conversions in signal-slot connections (see \l{QT_NO_NARROWING_CONVERSIONS_IN_CONNECT})
+ \row \li 6.0.0 \li Java-style iterators for Qt containers
+ \row \li 6.6.0 \li The qExchange() function (see \l{QT_NO_QEXCHANGE})
+ \row \li 6.7.0 \li Overloads of QObject::connect that do not take a context object (see \l{QT_NO_CONTEXTLESS_CONNECT})
+ \row \li 6.8.0 \li The qAsConst() function (see \l{QT_NO_QASCONST})
+ \row \li 6.8.0 \li File-related I/O classes have their \c{open()} functions marked \c{[[nodiscard]]} (see \l{QT_USE_NODISCARD_FILE_OPEN})
+ \endtable
-/*!
- \macro Q_FORWARD_DECLARE_MUTABLE_CF_TYPE(type)
- \since 5.2
- \relates <QtGlobal>
+ Moreover, individual APIs may also get disabled as part of the
+ setting of QT_DISABLE_DEPRECATED_UP_TO. Please refer to each class'
+ documentation for more details.
- Forward-declares a mutable Core Foundation \a type. This includes the actual
- type and the ref type. For example, Q_FORWARD_DECLARE_MUTABLE_CF_TYPE(CFMutableString)
- declares __CFMutableString and CFMutableStringRef.
+ \sa QT_DISABLE_DEPRECATED_UP_TO, QT_NO_KEYWORDS, QT_VERSION_CHECK
*/
namespace QtPrivate {
diff --git a/src/corelib/global/qglobal.h b/src/corelib/global/qglobal.h
index 25002efdca..1009057bad 100644
--- a/src/corelib/global/qglobal.h
+++ b/src/corelib/global/qglobal.h
@@ -1,46 +1,14 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Copyright (C) 2019 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// Copyright (C) 2019 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QGLOBAL_H
#define QGLOBAL_H
+#if 0
+#pragma qt_class(QtGlobal)
+#endif
+
#ifdef __cplusplus
# include <type_traits>
# include <cstddef>
@@ -49,1432 +17,30 @@
#endif
#ifndef __ASSEMBLER__
# include <assert.h>
+# include <stdbool.h>
# include <stddef.h>
#endif
-/*
- QT_VERSION is (major << 16) | (minor << 8) | patch.
-*/
-#define QT_VERSION QT_VERSION_CHECK(QT_VERSION_MAJOR, QT_VERSION_MINOR, QT_VERSION_PATCH)
-/*
- can be used like #if (QT_VERSION >= QT_VERSION_CHECK(6, 4, 0))
-*/
-#define QT_VERSION_CHECK(major, minor, patch) ((major<<16)|(minor<<8)|(patch))
-
-#ifdef QT_BOOTSTRAPPED
-#include <QtCore/qconfig-bootstrapped.h>
-#else
-#include <QtCore/qconfig.h>
-#include <QtCore/qtcore-config.h>
-#endif
-
-/*
- The QT_CONFIG macro implements a safe compile time check for features of Qt.
- Features can be in three states:
- 0 or undefined: This will lead to a compile error when testing for it
- -1: The feature is not available
- 1: The feature is available
-*/
-#define QT_CONFIG(feature) (1/QT_FEATURE_##feature == 1)
-#define QT_REQUIRE_CONFIG(feature) Q_STATIC_ASSERT_X(QT_FEATURE_##feature == 1, "Required feature " #feature " for file " __FILE__ " not available.")
+#include <QtCore/qtversionchecks.h>
+#include <QtCore/qtconfigmacros.h>
+#include <QtCore/qtcoreexports.h>
-/* These two macros makes it possible to turn the builtin line expander into a
- * string literal. */
-#define QT_STRINGIFY2(x) #x
-#define QT_STRINGIFY(x) QT_STRINGIFY2(x)
+#include <QtCore/qtpreprocessorsupport.h>
#include <QtCore/qsystemdetection.h>
#include <QtCore/qprocessordetection.h>
#include <QtCore/qcompilerdetection.h>
-// This could go to the very beginning of this file, but we're using compiler
-// detection, so it's here.
-#if defined(__cplusplus) && (__cplusplus < 201703L)
-# ifdef Q_CC_MSVC
-# error "Qt requires a C++17 compiler, and a suitable value for __cplusplus. On MSVC, you must pass the /Zc:__cplusplus option to the compiler."
-# else
-# error "Qt requires a C++17 compiler"
-# endif
-#endif // __cplusplus
-
-#if defined(__cplusplus) && defined(Q_CC_MSVC)
-// On MSVC we require /permissive- set by user code. Check that we are
-// under its rules -- for instance, check that std::nullptr_t->bool is
-// not an implicit conversion, as per
-// https://docs.microsoft.com/en-us/cpp/overview/cpp-conformance-improvements?view=msvc-160#nullptr_t-is-only-convertible-to-bool-as-a-direct-initialization
-static_assert(!std::is_convertible_v<std::nullptr_t, bool>,
- "On MSVC you must pass the /permissive- option to the compiler.");
-#endif
-
-#if defined (__ELF__)
-# define Q_OF_ELF
-#endif
-#if defined (__MACH__) && defined (__APPLE__)
-# define Q_OF_MACH_O
-#endif
-
-/*
- Avoid "unused parameter" warnings
-*/
-#define Q_UNUSED(x) (void)x;
-
-#if defined(__cplusplus)
-// Don't use these in C++ mode, use static_assert directly.
-// These are here only to keep old code compiling.
-# define Q_STATIC_ASSERT(Condition) static_assert(bool(Condition), #Condition)
-# define Q_STATIC_ASSERT_X(Condition, Message) static_assert(bool(Condition), Message)
-#elif defined(Q_COMPILER_STATIC_ASSERT)
-// C11 mode - using the _S version in case <assert.h> doesn't do the right thing
-# define Q_STATIC_ASSERT(Condition) _Static_assert(!!(Condition), #Condition)
-# define Q_STATIC_ASSERT_X(Condition, Message) _Static_assert(!!(Condition), Message)
-#else
-// C89 & C99 version
-# define Q_STATIC_ASSERT_PRIVATE_JOIN(A, B) Q_STATIC_ASSERT_PRIVATE_JOIN_IMPL(A, B)
-# define Q_STATIC_ASSERT_PRIVATE_JOIN_IMPL(A, B) A ## B
-# ifdef __COUNTER__
-# define Q_STATIC_ASSERT(Condition) \
- typedef char Q_STATIC_ASSERT_PRIVATE_JOIN(q_static_assert_result, __COUNTER__) [(Condition) ? 1 : -1];
-# else
-# define Q_STATIC_ASSERT(Condition) \
- typedef char Q_STATIC_ASSERT_PRIVATE_JOIN(q_static_assert_result, __LINE__) [(Condition) ? 1 : -1];
-# endif /* __COUNTER__ */
-# define Q_STATIC_ASSERT_X(Condition, Message) Q_STATIC_ASSERT(Condition)
-#endif
-
-#ifdef __cplusplus
-
-#if !defined(QT_NAMESPACE) || defined(Q_MOC_RUN) /* user namespace */
-
-# define QT_PREPEND_NAMESPACE(name) ::name
-# define QT_USE_NAMESPACE
-# define QT_BEGIN_NAMESPACE
-# define QT_END_NAMESPACE
-# define QT_BEGIN_INCLUDE_NAMESPACE
-# define QT_END_INCLUDE_NAMESPACE
-#ifndef QT_BEGIN_MOC_NAMESPACE
-# define QT_BEGIN_MOC_NAMESPACE
-#endif
-#ifndef QT_END_MOC_NAMESPACE
-# define QT_END_MOC_NAMESPACE
-#endif
-# define QT_FORWARD_DECLARE_CLASS(name) class name;
-# define QT_FORWARD_DECLARE_STRUCT(name) struct name;
-# define QT_MANGLE_NAMESPACE(name) name
-
-#else /* user namespace */
-
-# define QT_PREPEND_NAMESPACE(name) ::QT_NAMESPACE::name
-# define QT_USE_NAMESPACE using namespace ::QT_NAMESPACE;
-# define QT_BEGIN_NAMESPACE namespace QT_NAMESPACE {
-# define QT_END_NAMESPACE }
-# define QT_BEGIN_INCLUDE_NAMESPACE }
-# define QT_END_INCLUDE_NAMESPACE namespace QT_NAMESPACE {
-#ifndef QT_BEGIN_MOC_NAMESPACE
-# define QT_BEGIN_MOC_NAMESPACE QT_USE_NAMESPACE
-#endif
-#ifndef QT_END_MOC_NAMESPACE
-# define QT_END_MOC_NAMESPACE
-#endif
-# define QT_FORWARD_DECLARE_CLASS(name) \
- QT_BEGIN_NAMESPACE class name; QT_END_NAMESPACE \
- using QT_PREPEND_NAMESPACE(name);
-
-# define QT_FORWARD_DECLARE_STRUCT(name) \
- QT_BEGIN_NAMESPACE struct name; QT_END_NAMESPACE \
- using QT_PREPEND_NAMESPACE(name);
-
-# define QT_MANGLE_NAMESPACE0(x) x
-# define QT_MANGLE_NAMESPACE1(a, b) a##_##b
-# define QT_MANGLE_NAMESPACE2(a, b) QT_MANGLE_NAMESPACE1(a,b)
-# define QT_MANGLE_NAMESPACE(name) QT_MANGLE_NAMESPACE2( \
- QT_MANGLE_NAMESPACE0(name), QT_MANGLE_NAMESPACE0(QT_NAMESPACE))
-
-namespace QT_NAMESPACE {}
-
-# ifndef QT_BOOTSTRAPPED
-# ifndef QT_NO_USING_NAMESPACE
- /*
- This expands to a "using QT_NAMESPACE" also in _header files_.
- It is the only way the feature can be used without too much
- pain, but if people _really_ do not want it they can add
- DEFINES += QT_NO_USING_NAMESPACE to their .pro files.
- */
- QT_USE_NAMESPACE
-# endif
-# endif
-
-#endif /* user namespace */
-
-#else /* __cplusplus */
-
-# define QT_BEGIN_NAMESPACE
-# define QT_END_NAMESPACE
-# define QT_USE_NAMESPACE
-# define QT_BEGIN_INCLUDE_NAMESPACE
-# define QT_END_INCLUDE_NAMESPACE
-
-#endif /* __cplusplus */
-
-#if defined(Q_OS_DARWIN) && !defined(QT_LARGEFILE_SUPPORT)
-# define QT_LARGEFILE_SUPPORT 64
-#endif
-
#ifndef __ASSEMBLER__
-QT_BEGIN_NAMESPACE
-
-/*
- Size-dependent types (architechture-dependent byte order)
-
- Make sure to update QMetaType when changing these typedefs
-*/
-
-typedef signed char qint8; /* 8 bit signed */
-typedef unsigned char quint8; /* 8 bit unsigned */
-typedef short qint16; /* 16 bit signed */
-typedef unsigned short quint16; /* 16 bit unsigned */
-typedef int qint32; /* 32 bit signed */
-typedef unsigned int quint32; /* 32 bit unsigned */
-// Unlike LL / ULL in C++, for historical reasons, we force the
-// result to be of the requested type.
-#ifdef __cplusplus
-# define Q_INT64_C(c) static_cast<long long>(c ## LL) /* signed 64 bit constant */
-# define Q_UINT64_C(c) static_cast<unsigned long long>(c ## ULL) /* unsigned 64 bit constant */
-#else
-# define Q_INT64_C(c) ((long long)(c ## LL)) /* signed 64 bit constant */
-# define Q_UINT64_C(c) ((unsigned long long)(c ## ULL)) /* unsigned 64 bit constant */
-#endif
-typedef long long qint64; /* 64 bit signed */
-typedef unsigned long long quint64; /* 64 bit unsigned */
-
-typedef qint64 qlonglong;
-typedef quint64 qulonglong;
-
-#ifndef __cplusplus
-// In C++ mode, we define below using QIntegerForSize template
-Q_STATIC_ASSERT_X(sizeof(ptrdiff_t) == sizeof(size_t), "Weird ptrdiff_t and size_t definitions");
-typedef ptrdiff_t qptrdiff;
-typedef ptrdiff_t qsizetype;
-typedef ptrdiff_t qintptr;
-typedef size_t quintptr;
-
-#define PRIdQPTRDIFF "td"
-#define PRIiQPTRDIFF "ti"
-
-#define PRIdQSIZETYPE "td"
-#define PRIiQSIZETYPE "ti"
-
-#define PRIdQINTPTR "td"
-#define PRIiQINTPTR "ti"
-
-#define PRIuQUINTPTR "zu"
-#define PRIoQUINTPTR "zo"
-#define PRIxQUINTPTR "zx"
-#define PRIXQUINTPTR "zX"
-#endif
-
-/*
- Useful type definitions for Qt
-*/
-
-QT_BEGIN_INCLUDE_NAMESPACE
-typedef unsigned char uchar;
-typedef unsigned short ushort;
-typedef unsigned int uint;
-typedef unsigned long ulong;
-QT_END_INCLUDE_NAMESPACE
-
-#if defined(QT_COORD_TYPE)
-typedef QT_COORD_TYPE qreal;
-#else
-typedef double qreal;
-#endif
-
-#if defined(QT_NO_DEPRECATED)
-# undef QT_DEPRECATED
-# undef QT_DEPRECATED_X
-# undef QT_DEPRECATED_VARIABLE
-# undef QT_DEPRECATED_CONSTRUCTOR
-#elif !defined(QT_NO_DEPRECATED_WARNINGS)
-# undef QT_DEPRECATED
-# define QT_DEPRECATED Q_DECL_DEPRECATED
-# undef QT_DEPRECATED_X
-# define QT_DEPRECATED_X(text) Q_DECL_DEPRECATED_X(text)
-# undef QT_DEPRECATED_VARIABLE
-# define QT_DEPRECATED_VARIABLE Q_DECL_VARIABLE_DEPRECATED
-# undef QT_DEPRECATED_CONSTRUCTOR
-# define QT_DEPRECATED_CONSTRUCTOR Q_DECL_CONSTRUCTOR_DEPRECATED explicit
-#else
-# undef QT_DEPRECATED
-# define QT_DEPRECATED
-# undef QT_DEPRECATED_X
-# define QT_DEPRECATED_X(text)
-# undef QT_DEPRECATED_VARIABLE
-# define QT_DEPRECATED_VARIABLE
-# undef QT_DEPRECATED_CONSTRUCTOR
-# define QT_DEPRECATED_CONSTRUCTOR
-# undef Q_DECL_ENUMERATOR_DEPRECATED
-# define Q_DECL_ENUMERATOR_DEPRECATED
-#endif
-
-#ifndef QT_DEPRECATED_WARNINGS_SINCE
-# ifdef QT_DISABLE_DEPRECATED_BEFORE
-# define QT_DEPRECATED_WARNINGS_SINCE QT_DISABLE_DEPRECATED_BEFORE
-# else
-# define QT_DEPRECATED_WARNINGS_SINCE QT_VERSION
-# endif
-#endif
-
-#ifndef QT_DISABLE_DEPRECATED_BEFORE
-#define QT_DISABLE_DEPRECATED_BEFORE QT_VERSION_CHECK(5, 0, 0)
-#endif
-
-/*
- QT_DEPRECATED_SINCE(major, minor) evaluates as true if the Qt version is greater than
- the deprecation point specified.
-
- Use it to specify from which version of Qt a function or class has been deprecated
-
- Example:
- #if QT_DEPRECATED_SINCE(5,1)
- QT_DEPRECATED void deprecatedFunction(); //function deprecated since Qt 5.1
- #endif
-
-*/
-#ifdef QT_DEPRECATED
-#define QT_DEPRECATED_SINCE(major, minor) (QT_VERSION_CHECK(major, minor, 0) > QT_DISABLE_DEPRECATED_BEFORE)
-#else
-#define QT_DEPRECATED_SINCE(major, minor) 0
-#endif
-
-/*
- QT_DEPRECATED_VERSION(major, minor) and QT_DEPRECATED_VERSION_X(major, minor, text)
- outputs a deprecation warning if QT_DEPRECATED_WARNINGS_SINCE is equal or greater
- than the version specified as major, minor. This makes it possible to deprecate a
- function without annoying a user who needs to stick at a specified minimum version
- and therefore can't use the new function.
-*/
-#if QT_DEPRECATED_WARNINGS_SINCE >= QT_VERSION_CHECK(5, 12, 0)
-# define QT_DEPRECATED_VERSION_X_5_12(text) QT_DEPRECATED_X(text)
-# define QT_DEPRECATED_VERSION_5_12 QT_DEPRECATED
-#else
-# define QT_DEPRECATED_VERSION_X_5_12(text)
-# define QT_DEPRECATED_VERSION_5_12
-#endif
-
-#if QT_DEPRECATED_WARNINGS_SINCE >= QT_VERSION_CHECK(5, 13, 0)
-# define QT_DEPRECATED_VERSION_X_5_13(text) QT_DEPRECATED_X(text)
-# define QT_DEPRECATED_VERSION_5_13 QT_DEPRECATED
-#else
-# define QT_DEPRECATED_VERSION_X_5_13(text)
-# define QT_DEPRECATED_VERSION_5_13
-#endif
-
-#if QT_DEPRECATED_WARNINGS_SINCE >= QT_VERSION_CHECK(5, 14, 0)
-# define QT_DEPRECATED_VERSION_X_5_14(text) QT_DEPRECATED_X(text)
-# define QT_DEPRECATED_VERSION_5_14 QT_DEPRECATED
-#else
-# define QT_DEPRECATED_VERSION_X_5_14(text)
-# define QT_DEPRECATED_VERSION_5_14
-#endif
-
-#if QT_DEPRECATED_WARNINGS_SINCE >= QT_VERSION_CHECK(5, 15, 0)
-# define QT_DEPRECATED_VERSION_X_5_15(text) QT_DEPRECATED_X(text)
-# define QT_DEPRECATED_VERSION_5_15 QT_DEPRECATED
-#else
-# define QT_DEPRECATED_VERSION_X_5_15(text)
-# define QT_DEPRECATED_VERSION_5_15
-#endif
-
-#if QT_DEPRECATED_WARNINGS_SINCE >= QT_VERSION_CHECK(6, 0, 0)
-# define QT_DEPRECATED_VERSION_X_6_0(text) QT_DEPRECATED_X(text)
-# define QT_DEPRECATED_VERSION_6_0 QT_DEPRECATED
-#else
-# define QT_DEPRECATED_VERSION_X_6_0(text)
-# define QT_DEPRECATED_VERSION_6_0
-#endif
-
-#if QT_DEPRECATED_WARNINGS_SINCE >= QT_VERSION_CHECK(6, 1, 0)
-# define QT_DEPRECATED_VERSION_X_6_1(text) QT_DEPRECATED_X(text)
-# define QT_DEPRECATED_VERSION_6_1 QT_DEPRECATED
-#else
-# define QT_DEPRECATED_VERSION_X_6_1(text)
-# define QT_DEPRECATED_VERSION_6_1
-#endif
-
-#if QT_DEPRECATED_WARNINGS_SINCE >= QT_VERSION_CHECK(6, 2, 0)
-# define QT_DEPRECATED_VERSION_X_6_2(text) QT_DEPRECATED_X(text)
-# define QT_DEPRECATED_VERSION_6_2 QT_DEPRECATED
-#else
-# define QT_DEPRECATED_VERSION_X_6_2(text)
-# define QT_DEPRECATED_VERSION_6_2
-#endif
-
-#if QT_DEPRECATED_WARNINGS_SINCE >= QT_VERSION_CHECK(6, 3, 0)
-# define QT_DEPRECATED_VERSION_X_6_3(text) QT_DEPRECATED_X(text)
-# define QT_DEPRECATED_VERSION_6_3 QT_DEPRECATED
-#else
-# define QT_DEPRECATED_VERSION_X_6_3(text)
-# define QT_DEPRECATED_VERSION_6_3
-#endif
-
-#if QT_DEPRECATED_WARNINGS_SINCE >= QT_VERSION_CHECK(6, 4, 0)
-# define QT_DEPRECATED_VERSION_X_6_4(text) QT_DEPRECATED_X(text)
-# define QT_DEPRECATED_VERSION_6_4 QT_DEPRECATED
-#else
-# define QT_DEPRECATED_VERSION_X_6_4(text)
-# define QT_DEPRECATED_VERSION_6_4
-#endif
-
-#if QT_DEPRECATED_WARNINGS_SINCE >= QT_VERSION_CHECK(6, 5, 0)
-# define QT_DEPRECATED_VERSION_X_6_5(text) QT_DEPRECATED_X(text)
-# define QT_DEPRECATED_VERSION_6_5 QT_DEPRECATED
-#else
-# define QT_DEPRECATED_VERSION_X_6_5(text)
-# define QT_DEPRECATED_VERSION_6_5
-#endif
-
-#if QT_DEPRECATED_WARNINGS_SINCE >= QT_VERSION_CHECK(6, 6, 0)
-# define QT_DEPRECATED_VERSION_X_6_6(text) QT_DEPRECATED_X(text)
-# define QT_DEPRECATED_VERSION_6_6 QT_DEPRECATED
-#else
-# define QT_DEPRECATED_VERSION_X_6_6(text)
-# define QT_DEPRECATED_VERSION_6_6
-#endif
-
-#define QT_DEPRECATED_VERSION_X_5(minor, text) QT_DEPRECATED_VERSION_X_5_##minor(text)
-#define QT_DEPRECATED_VERSION_X(major, minor, text) QT_DEPRECATED_VERSION_X_##major##_##minor(text)
-
-#define QT_DEPRECATED_VERSION_5(minor) QT_DEPRECATED_VERSION_5_##minor
-#define QT_DEPRECATED_VERSION(major, minor) QT_DEPRECATED_VERSION_##major##_##minor
-
-/*
- QT_REMOVED_SINCE(major, minor) evaluates as true if the Qt version is greater than
- the deprecation point specified \e and QT_BUILD_REMOVED_API is defined.
-
- Use it to remove functions from the API, but not the ABI, by moving their definitions
- into the module's \c{removed_api/} subdir and defining QT_BUILD_REMOVED_API.
-
- Example:
-
- // header
- #if QT_REMOVED_SINCE(6, 3)
- void removedFunction(); // function removed since Qt 6.3
- #endif
-
- // implementation
- // ... moved from here ...
-
- // removed_api/some.cpp
- #define QT_BUILD_REMOVED_API
- #include <QtCore/qglobal.h>
-
- #include <someheader.h>
-
- #if QT_REMOVED_SINCE(6, 3)
- void removedFunction() { newFunction(); }
- #endif
-
- The function is now removed from the API, but remains in the ABI until
- the deprecation point moves past 6.3.
-*/
-#ifdef QT_BUILD_REMOVED_API
-#define QT_REMOVED_SINCE(major, minor) QT_DEPRECATED_SINCE(major, minor)
-#else
-#define QT_REMOVED_SINCE(major, minor) 0
-#endif
-
-#ifdef __cplusplus
-// A tag to help mark stuff deprecated (cf. QStringViewLiteral)
-namespace QtPrivate {
-enum class Deprecated_t {};
-constexpr inline Deprecated_t Deprecated = {};
-}
-#endif
-
-/*
- The Qt modules' export macros.
- The options are:
- - defined(QT_STATIC): Qt was built or is being built in static mode
- - defined(QT_SHARED): Qt was built or is being built in shared/dynamic mode
- If neither was defined, then QT_SHARED is implied. If Qt was compiled in static
- mode, QT_STATIC is defined in qconfig.h. In shared mode, QT_STATIC is implied
- for the bootstrapped tools.
-*/
-
-#ifdef QT_BOOTSTRAPPED
-# ifdef QT_SHARED
-# error "QT_SHARED and QT_BOOTSTRAPPED together don't make sense. Please fix the build"
-# elif !defined(QT_STATIC)
-# define QT_STATIC
-# endif
-#endif
-
-#if defined(QT_SHARED) || !defined(QT_STATIC)
-# ifdef QT_STATIC
-# error "Both QT_SHARED and QT_STATIC defined, please make up your mind"
-# endif
-# ifndef QT_SHARED
-# define QT_SHARED
-# endif
-# if defined(QT_BUILD_CORE_LIB)
-# define Q_CORE_EXPORT Q_DECL_EXPORT
-# else
-# define Q_CORE_EXPORT Q_DECL_IMPORT
-# endif
-#else
-# define Q_CORE_EXPORT
-#endif
-
-/*
- Some classes do not permit copies to be made of an object. These
- classes contains a private copy constructor and assignment
- operator to disable copying (the compiler gives an error message).
-*/
-#define Q_DISABLE_COPY(Class) \
- Class(const Class &) = delete;\
- Class &operator=(const Class &) = delete;
-
-#define Q_DISABLE_COPY_MOVE(Class) \
- Q_DISABLE_COPY(Class) \
- Class(Class &&) = delete; \
- Class &operator=(Class &&) = delete;
-
-/*
- Implementing a move assignment operator using an established
- technique (move-and-swap, pure swap) is just boilerplate.
- Here's a couple of *private* macros for convenience.
-
- To know which one to use:
-
- * if you don't have a move constructor (*) => use pure swap;
- * if you have a move constructor, then
- * if your class holds just memory (no file handles, no user-defined
- datatypes, etc.) => use pure swap;
- * use move and swap.
-
- The preference should always go for the move-and-swap one, as it
- will deterministically destroy the data previously held in *this,
- and not "dump" it in the moved-from object (which may then be alive
- for longer).
-
- The requirement for either macro is the presence of a member swap(),
- which any value class that defines its own special member functions
- should have anyhow.
-
- (*) Many value classes in Qt do not have move constructors; mostly,
- the implicitly shared classes using QSharedDataPointer and friends.
- The reason is mostly historical: those classes require either an
- out-of-line move constructor, which we could not provide before we
- made C++11 mandatory (and that we don't like anyhow), or
- an out-of-line dtor for the Q(E)DSP<Private> member (cf. QPixmap).
-
- If you can however add a move constructor to a class lacking it,
- consider doing so, then reevaluate which macro to choose.
-*/
-#define QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_MOVE_AND_SWAP(Class) \
- Class &operator=(Class &&other) noexcept { \
- Class moved(std::move(other)); \
- swap(moved); \
- return *this; \
- }
-
-#define QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_PURE_SWAP(Class) \
- Class &operator=(Class &&other) noexcept { \
- swap(other); \
- return *this; \
- }
-
-/*
- No, this is not an evil backdoor. QT_BUILD_INTERNAL just exports more symbols
- for Qt's internal unit tests. If you want slower loading times and more
- symbols that can vanish from version to version, feel free to define QT_BUILD_INTERNAL.
-*/
-#if defined(QT_BUILD_INTERNAL) && defined(QT_BUILDING_QT) && defined(QT_SHARED)
-# define Q_AUTOTEST_EXPORT Q_DECL_EXPORT
-#elif defined(QT_BUILD_INTERNAL) && defined(QT_SHARED)
-# define Q_AUTOTEST_EXPORT Q_DECL_IMPORT
-#else
-# define Q_AUTOTEST_EXPORT
-#endif
-
-#define Q_INIT_RESOURCE(name) \
- do { extern int QT_MANGLE_NAMESPACE(qInitResources_ ## name) (); \
- QT_MANGLE_NAMESPACE(qInitResources_ ## name) (); } while (false)
-#define Q_CLEANUP_RESOURCE(name) \
- do { extern int QT_MANGLE_NAMESPACE(qCleanupResources_ ## name) (); \
- QT_MANGLE_NAMESPACE(qCleanupResources_ ## name) (); } while (false)
-
-/*
- * If we're compiling C++ code:
- * - and this is a non-namespace build, declare qVersion as extern "C"
- * - and this is a namespace build, declare it as a regular function
- * (we're already inside QT_BEGIN_NAMESPACE / QT_END_NAMESPACE)
- * If we're compiling C code, simply declare the function. If Qt was compiled
- * in a namespace, qVersion isn't callable anyway.
- */
-#if !defined(QT_NAMESPACE) && defined(__cplusplus) && !defined(Q_QDOC)
-extern "C"
-#endif
-Q_CORE_EXPORT Q_DECL_CONST_FUNCTION const char *qVersion(void) Q_DECL_NOEXCEPT;
+# include <QtCore/qassert.h>
+# include <QtCore/qtnoop.h>
+# include <QtCore/qtypes.h>
+#endif /* !__ASSEMBLER__ */
+#include <QtCore/qtversion.h>
#if defined(__cplusplus)
-#ifndef Q_CONSTRUCTOR_FUNCTION
-# define Q_CONSTRUCTOR_FUNCTION0(AFUNC) \
- namespace { \
- static const struct AFUNC ## _ctor_class_ { \
- inline AFUNC ## _ctor_class_() { AFUNC(); } \
- } AFUNC ## _ctor_instance_; \
- }
-
-# define Q_CONSTRUCTOR_FUNCTION(AFUNC) Q_CONSTRUCTOR_FUNCTION0(AFUNC)
-#endif
-
-#ifndef Q_DESTRUCTOR_FUNCTION
-# define Q_DESTRUCTOR_FUNCTION0(AFUNC) \
- namespace { \
- static const struct AFUNC ## _dtor_class_ { \
- inline AFUNC ## _dtor_class_() { } \
- inline ~ AFUNC ## _dtor_class_() { AFUNC(); } \
- } AFUNC ## _dtor_instance_; \
- }
-# define Q_DESTRUCTOR_FUNCTION(AFUNC) Q_DESTRUCTOR_FUNCTION0(AFUNC)
-#endif
-
-/*
- quintptr and qptrdiff is guaranteed to be the same size as a pointer, i.e.
-
- sizeof(void *) == sizeof(quintptr)
- && sizeof(void *) == sizeof(qptrdiff)
-
- size_t and qsizetype are not guaranteed to be the same size as a pointer, but
- they usually are. We actually check for that in qglobal.cpp.
-*/
-template <int> struct QIntegerForSize;
-template <> struct QIntegerForSize<1> { typedef quint8 Unsigned; typedef qint8 Signed; };
-template <> struct QIntegerForSize<2> { typedef quint16 Unsigned; typedef qint16 Signed; };
-template <> struct QIntegerForSize<4> { typedef quint32 Unsigned; typedef qint32 Signed; };
-template <> struct QIntegerForSize<8> { typedef quint64 Unsigned; typedef qint64 Signed; };
-#if defined(Q_CC_GNU) && defined(__SIZEOF_INT128__)
-template <> struct QIntegerForSize<16> { __extension__ typedef unsigned __int128 Unsigned; __extension__ typedef __int128 Signed; };
-#endif
-template <class T> struct QIntegerForSizeof: QIntegerForSize<sizeof(T)> { };
-typedef QIntegerForSize<Q_PROCESSOR_WORDSIZE>::Signed qregisterint;
-typedef QIntegerForSize<Q_PROCESSOR_WORDSIZE>::Unsigned qregisteruint;
-typedef QIntegerForSizeof<void *>::Unsigned quintptr;
-typedef QIntegerForSizeof<void *>::Signed qptrdiff;
-typedef qptrdiff qintptr;
-using qsizetype = QIntegerForSizeof<std::size_t>::Signed;
-
-// These custom definitions are necessary as we're not defining our
-// datatypes in terms of the language ones, but in terms of integer
-// types that have the sime size. For instance, on a 32-bit platform,
-// qptrdiff is int, while ptrdiff_t may be aliased to long; therefore
-// using %td to print a qptrdiff would be wrong (and raise -Wformat
-// warnings), although both int and long have same bit size on that
-// platform.
-//
-// We know that sizeof(size_t) == sizeof(void *) == sizeof(qptrdiff).
-#if SIZE_MAX == 4294967295ULL
-#define PRIuQUINTPTR "u"
-#define PRIoQUINTPTR "o"
-#define PRIxQUINTPTR "x"
-#define PRIXQUINTPTR "X"
-
-#define PRIdQPTRDIFF "d"
-#define PRIiQPTRDIFF "i"
-
-#define PRIdQINTPTR "d"
-#define PRIiQINTPTR "i"
-
-#define PRIdQSIZETYPE "d"
-#define PRIiQSIZETYPE "i"
-#elif SIZE_MAX == 18446744073709551615ULL
-#define PRIuQUINTPTR "llu"
-#define PRIoQUINTPTR "llo"
-#define PRIxQUINTPTR "llx"
-#define PRIXQUINTPTR "llX"
-
-#define PRIdQPTRDIFF "lld"
-#define PRIiQPTRDIFF "lli"
-
-#define PRIdQINTPTR "lld"
-#define PRIiQINTPTR "lli"
-
-#define PRIdQSIZETYPE "lld"
-#define PRIiQSIZETYPE "lli"
-#else
-#error Unsupported platform (unknown value for SIZE_MAX)
-#endif
-
-/* moc compats (signals/slots) */
-#ifndef QT_MOC_COMPAT
-# define QT_MOC_COMPAT
-#else
-# undef QT_MOC_COMPAT
-# define QT_MOC_COMPAT
-#endif
-
-#ifdef QT_ASCII_CAST_WARNINGS
-# define QT_ASCII_CAST_WARN Q_DECL_DEPRECATED_X("Use fromUtf8, QStringLiteral, or QLatin1String")
-#else
-# define QT_ASCII_CAST_WARN
-#endif
-
-#ifdef Q_PROCESSOR_X86_32
-# if defined(Q_CC_GNU)
-# define QT_FASTCALL __attribute__((regparm(3)))
-# elif defined(Q_CC_MSVC)
-# define QT_FASTCALL __fastcall
-# else
-# define QT_FASTCALL
-# endif
-#else
-# define QT_FASTCALL
-#endif
-
-// enable gcc warnings for printf-style functions
-#if defined(Q_CC_GNU) && !defined(__INSURE__)
-# if defined(Q_CC_MINGW) && !defined(Q_CC_CLANG)
-# define Q_ATTRIBUTE_FORMAT_PRINTF(A, B) \
- __attribute__((format(gnu_printf, (A), (B))))
-# else
-# define Q_ATTRIBUTE_FORMAT_PRINTF(A, B) \
- __attribute__((format(printf, (A), (B))))
-# endif
-#else
-# define Q_ATTRIBUTE_FORMAT_PRINTF(A, B)
-#endif
-
-#ifdef Q_CC_MSVC
-# define Q_NEVER_INLINE __declspec(noinline)
-# define Q_ALWAYS_INLINE __forceinline
-#elif defined(Q_CC_GNU)
-# define Q_NEVER_INLINE __attribute__((noinline))
-# define Q_ALWAYS_INLINE inline __attribute__((always_inline))
-#else
-# define Q_NEVER_INLINE
-# define Q_ALWAYS_INLINE inline
-#endif
-
-//defines the type for the WNDPROC on windows
-//the alignment needs to be forced for sse2 to not crash with mingw
-#if defined(Q_OS_WIN)
-# if defined(Q_CC_MINGW) && defined(Q_PROCESSOR_X86_32)
-# define QT_ENSURE_STACK_ALIGNED_FOR_SSE __attribute__ ((force_align_arg_pointer))
-# else
-# define QT_ENSURE_STACK_ALIGNED_FOR_SSE
-# endif
-# define QT_WIN_CALLBACK CALLBACK QT_ENSURE_STACK_ALIGNED_FOR_SSE
-#endif
-
-/*
- Utility macros and inline functions
-*/
-
-template <typename T>
-constexpr inline T qAbs(const T &t) { return t >= 0 ? t : -t; }
-
-// gcc < 10 doesn't have __has_builtin
-#if defined(Q_PROCESSOR_ARM_64) && (__has_builtin(__builtin_round) || defined(Q_CC_GNU)) && !defined(Q_CC_CLANG)
-// ARM64 has a single instruction that can do C++ rounding with conversion to integer.
-// Note current clang versions have non-constexpr __builtin_round, ### allow clang this path when they fix it.
-constexpr inline int qRound(double d)
-{ return int(__builtin_round(d)); }
-constexpr inline int qRound(float f)
-{ return int(__builtin_roundf(f)); }
-constexpr inline qint64 qRound64(double d)
-{ return qint64(__builtin_round(d)); }
-constexpr inline qint64 qRound64(float f)
-{ return qint64(__builtin_roundf(f)); }
-#elif defined(__SSE2__) && (__has_builtin(__builtin_copysign) || defined(Q_CC_GNU))
-// SSE has binary operations directly on floating point making copysign fast
-constexpr inline int qRound(double d)
-{ return int(d + __builtin_copysign(0.5, d)); }
-constexpr inline int qRound(float f)
-{ return int(f + __builtin_copysignf(0.5f, f)); }
-constexpr inline qint64 qRound64(double d)
-{ return qint64(d + __builtin_copysign(0.5, d)); }
-constexpr inline qint64 qRound64(float f)
-{ return qint64(f + __builtin_copysignf(0.5f, f)); }
-#else
-constexpr inline int qRound(double d)
-{ return d >= 0.0 ? int(d + 0.5) : int(d - 0.5); }
-constexpr inline int qRound(float d)
-{ return d >= 0.0f ? int(d + 0.5f) : int(d - 0.5f); }
-
-constexpr inline qint64 qRound64(double d)
-{ return d >= 0.0 ? qint64(d + 0.5) : qint64(d - 0.5); }
-constexpr inline qint64 qRound64(float d)
-{ return d >= 0.0f ? qint64(d + 0.5f) : qint64(d - 0.5f); }
-#endif
-
-#ifndef Q_FORWARD_DECLARE_OBJC_CLASS
-# ifdef __OBJC__
-# define Q_FORWARD_DECLARE_OBJC_CLASS(classname) @class classname
-# else
-# define Q_FORWARD_DECLARE_OBJC_CLASS(classname) class classname
-# endif
-#endif
-#ifndef Q_FORWARD_DECLARE_CF_TYPE
-# define Q_FORWARD_DECLARE_CF_TYPE(type) typedef const struct __ ## type * type ## Ref
-#endif
-#ifndef Q_FORWARD_DECLARE_MUTABLE_CF_TYPE
-# define Q_FORWARD_DECLARE_MUTABLE_CF_TYPE(type) typedef struct __ ## type * type ## Ref
-#endif
-#ifndef Q_FORWARD_DECLARE_CG_TYPE
-#define Q_FORWARD_DECLARE_CG_TYPE(type) typedef const struct type *type ## Ref;
-#endif
-#ifndef Q_FORWARD_DECLARE_MUTABLE_CG_TYPE
-#define Q_FORWARD_DECLARE_MUTABLE_CG_TYPE(type) typedef struct type *type ## Ref;
-#endif
-
-#ifdef Q_OS_DARWIN
-# define QT_DARWIN_PLATFORM_SDK_EQUAL_OR_ABOVE(macos, ios, tvos, watchos) \
- ((defined(__MAC_OS_X_VERSION_MAX_ALLOWED) && macos != __MAC_NA && __MAC_OS_X_VERSION_MAX_ALLOWED >= macos) || \
- (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && ios != __IPHONE_NA && __IPHONE_OS_VERSION_MAX_ALLOWED >= ios) || \
- (defined(__TV_OS_VERSION_MAX_ALLOWED) && tvos != __TVOS_NA && __TV_OS_VERSION_MAX_ALLOWED >= tvos) || \
- (defined(__WATCH_OS_VERSION_MAX_ALLOWED) && watchos != __WATCHOS_NA && __WATCH_OS_VERSION_MAX_ALLOWED >= watchos))
-
-# define QT_DARWIN_DEPLOYMENT_TARGET_BELOW(macos, ios, tvos, watchos) \
- ((defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && macos != __MAC_NA && __MAC_OS_X_VERSION_MIN_REQUIRED < macos) || \
- (defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && ios != __IPHONE_NA && __IPHONE_OS_VERSION_MIN_REQUIRED < ios) || \
- (defined(__TV_OS_VERSION_MIN_REQUIRED) && tvos != __TVOS_NA && __TV_OS_VERSION_MIN_REQUIRED < tvos) || \
- (defined(__WATCH_OS_VERSION_MIN_REQUIRED) && watchos != __WATCHOS_NA && __WATCH_OS_VERSION_MIN_REQUIRED < watchos))
-
-# define QT_MACOS_IOS_PLATFORM_SDK_EQUAL_OR_ABOVE(macos, ios) \
- QT_DARWIN_PLATFORM_SDK_EQUAL_OR_ABOVE(macos, ios, __TVOS_NA, __WATCHOS_NA)
-# define QT_MACOS_PLATFORM_SDK_EQUAL_OR_ABOVE(macos) \
- QT_DARWIN_PLATFORM_SDK_EQUAL_OR_ABOVE(macos, __IPHONE_NA, __TVOS_NA, __WATCHOS_NA)
-# define QT_IOS_PLATFORM_SDK_EQUAL_OR_ABOVE(ios) \
- QT_DARWIN_PLATFORM_SDK_EQUAL_OR_ABOVE(__MAC_NA, ios, __TVOS_NA, __WATCHOS_NA)
-# define QT_TVOS_PLATFORM_SDK_EQUAL_OR_ABOVE(tvos) \
- QT_DARWIN_PLATFORM_SDK_EQUAL_OR_ABOVE(__MAC_NA, __IPHONE_NA, tvos, __WATCHOS_NA)
-# define QT_WATCHOS_PLATFORM_SDK_EQUAL_OR_ABOVE(watchos) \
- QT_DARWIN_PLATFORM_SDK_EQUAL_OR_ABOVE(__MAC_NA, __IPHONE_NA, __TVOS_NA, watchos)
-
-# define QT_MACOS_IOS_DEPLOYMENT_TARGET_BELOW(macos, ios) \
- QT_DARWIN_DEPLOYMENT_TARGET_BELOW(macos, ios, __TVOS_NA, __WATCHOS_NA)
-# define QT_MACOS_DEPLOYMENT_TARGET_BELOW(macos) \
- QT_DARWIN_DEPLOYMENT_TARGET_BELOW(macos, __IPHONE_NA, __TVOS_NA, __WATCHOS_NA)
-# define QT_IOS_DEPLOYMENT_TARGET_BELOW(ios) \
- QT_DARWIN_DEPLOYMENT_TARGET_BELOW(__MAC_NA, ios, __TVOS_NA, __WATCHOS_NA)
-# define QT_TVOS_DEPLOYMENT_TARGET_BELOW(tvos) \
- QT_DARWIN_DEPLOYMENT_TARGET_BELOW(__MAC_NA, __IPHONE_NA, tvos, __WATCHOS_NA)
-# define QT_WATCHOS_DEPLOYMENT_TARGET_BELOW(watchos) \
- QT_DARWIN_DEPLOYMENT_TARGET_BELOW(__MAC_NA, __IPHONE_NA, __TVOS_NA, watchos)
-
-// Compatibility synonyms, do not use
-# define QT_MAC_PLATFORM_SDK_EQUAL_OR_ABOVE(osx, ios) QT_MACOS_IOS_PLATFORM_SDK_EQUAL_OR_ABOVE(osx, ios)
-# define QT_MAC_DEPLOYMENT_TARGET_BELOW(osx, ios) QT_MACOS_IOS_DEPLOYMENT_TARGET_BELOW(osx, ios)
-# define QT_OSX_PLATFORM_SDK_EQUAL_OR_ABOVE(osx) QT_MACOS_PLATFORM_SDK_EQUAL_OR_ABOVE(osx)
-# define QT_OSX_DEPLOYMENT_TARGET_BELOW(osx) QT_MACOS_DEPLOYMENT_TARGET_BELOW(osx)
-
-// Implemented in qcore_mac_objc.mm
-class Q_CORE_EXPORT QMacAutoReleasePool
-{
-public:
- QMacAutoReleasePool();
- ~QMacAutoReleasePool();
-private:
- Q_DISABLE_COPY(QMacAutoReleasePool)
- void *pool;
-};
-
-#else
-
-#define QT_DARWIN_PLATFORM_SDK_EQUAL_OR_ABOVE(macos, ios, tvos, watchos) (0)
-#define QT_MACOS_IOS_PLATFORM_SDK_EQUAL_OR_ABOVE(macos, ios) (0)
-#define QT_MACOS_PLATFORM_SDK_EQUAL_OR_ABOVE(macos) (0)
-#define QT_IOS_PLATFORM_SDK_EQUAL_OR_ABOVE(ios) (0)
-#define QT_TVOS_PLATFORM_SDK_EQUAL_OR_ABOVE(tvos) (0)
-#define QT_WATCHOS_PLATFORM_SDK_EQUAL_OR_ABOVE(watchos) (0)
-
-#define QT_MAC_PLATFORM_SDK_EQUAL_OR_ABOVE(osx, ios) (0)
-#define QT_OSX_PLATFORM_SDK_EQUAL_OR_ABOVE(osx) (0)
-
-#endif // Q_OS_DARWIN
-
-/*
- Data stream functions are provided by many classes (defined in qdatastream.h)
-*/
-
-class QDataStream;
-
-inline void qt_noop(void) {}
-
-/* These wrap try/catch so we can switch off exceptions later.
-
- Beware - do not use more than one QT_CATCH per QT_TRY, and do not use
- the exception instance in the catch block.
- If you can't live with those constraints, don't use these macros.
- Use the QT_NO_EXCEPTIONS macro to protect your code instead.
-*/
-
-#if !defined(QT_NO_EXCEPTIONS)
-# if !defined(Q_MOC_RUN)
-# if (defined(Q_CC_CLANG) && !defined(Q_CC_INTEL) && !__has_feature(cxx_exceptions)) || \
- (defined(Q_CC_GNU) && !defined(__EXCEPTIONS))
-# define QT_NO_EXCEPTIONS
-# endif
-# elif defined(QT_BOOTSTRAPPED)
-# define QT_NO_EXCEPTIONS
-# endif
-#endif
-
-Q_NORETURN Q_DECL_COLD_FUNCTION Q_CORE_EXPORT void qTerminate() noexcept;
-#ifdef QT_NO_EXCEPTIONS
-# define QT_TRY if (true)
-# define QT_CATCH(A) else
-# define QT_THROW(A) qt_noop()
-# define QT_RETHROW qt_noop()
-# define QT_TERMINATE_ON_EXCEPTION(expr) do { expr; } while (false)
-#else
-# define QT_TRY try
-# define QT_CATCH(A) catch (A)
-# define QT_THROW(A) throw A
-# define QT_RETHROW throw
-# ifdef Q_COMPILER_NOEXCEPT
-# define QT_TERMINATE_ON_EXCEPTION(expr) do { expr; } while (false)
-# else
-# define QT_TERMINATE_ON_EXCEPTION(expr) do { try { expr; } catch (...) { qTerminate(); } } while (false)
-# endif
-#endif
-
-Q_CORE_EXPORT Q_DECL_CONST_FUNCTION bool qSharedBuild() noexcept;
-
-#ifndef Q_OUTOFLINE_TEMPLATE
-# define Q_OUTOFLINE_TEMPLATE
-#endif
-#ifndef Q_INLINE_TEMPLATE
-# define Q_INLINE_TEMPLATE inline
-#endif
-
-/*
- Debugging and error handling
-*/
-
-#if !defined(QT_NO_DEBUG) && !defined(QT_DEBUG)
-# define QT_DEBUG
-#endif
-
-// QtPrivate::asString defined in qstring.h
-#ifndef qPrintable
-# define qPrintable(string) QtPrivate::asString(string).toLocal8Bit().constData()
-#endif
-
-#ifndef qUtf8Printable
-# define qUtf8Printable(string) QtPrivate::asString(string).toUtf8().constData()
-#endif
-
-/*
- Wrap QString::utf16() with enough casts to allow passing it
- to QString::asprintf("%ls") without warnings.
-*/
-#ifndef qUtf16Printable
-# define qUtf16Printable(string) \
- static_cast<const wchar_t*>(static_cast<const void*>(QString(string).utf16()))
-#endif
-
-class QString;
-Q_DECL_COLD_FUNCTION
-Q_CORE_EXPORT QString qt_error_string(int errorCode = -1);
-
-#ifndef Q_CC_MSVC
-Q_NORETURN
-#endif
-Q_DECL_COLD_FUNCTION
-Q_CORE_EXPORT void qt_assert(const char *assertion, const char *file, int line) noexcept;
-
-#if !defined(Q_ASSERT)
-# if defined(QT_NO_DEBUG) && !defined(QT_FORCE_ASSERTS)
-# define Q_ASSERT(cond) static_cast<void>(false && (cond))
-# else
-# define Q_ASSERT(cond) ((cond) ? static_cast<void>(0) : qt_assert(#cond, __FILE__, __LINE__))
-# endif
-#endif
-
-#ifndef Q_CC_MSVC
-Q_NORETURN
-#endif
-Q_DECL_COLD_FUNCTION
-Q_CORE_EXPORT void qt_assert_x(const char *where, const char *what, const char *file, int line) noexcept;
-
-#if !defined(Q_ASSERT_X)
-# if defined(QT_NO_DEBUG) && !defined(QT_FORCE_ASSERTS)
-# define Q_ASSERT_X(cond, where, what) static_cast<void>(false && (cond))
-# else
-# define Q_ASSERT_X(cond, where, what) ((cond) ? static_cast<void>(0) : qt_assert_x(where, what, __FILE__, __LINE__))
-# endif
-#endif
-
-Q_NORETURN Q_CORE_EXPORT void qt_check_pointer(const char *, int) noexcept;
-Q_NORETURN Q_DECL_COLD_FUNCTION
-Q_CORE_EXPORT void qBadAlloc();
-
-#ifdef QT_NO_EXCEPTIONS
-# if defined(QT_NO_DEBUG) && !defined(QT_FORCE_ASSERTS)
-# define Q_CHECK_PTR(p) qt_noop()
-# else
-# define Q_CHECK_PTR(p) do {if (!(p)) qt_check_pointer(__FILE__,__LINE__);} while (false)
-# endif
-#else
-# define Q_CHECK_PTR(p) do { if (!(p)) qBadAlloc(); } while (false)
-#endif
-
-template <typename T>
-inline T *q_check_ptr(T *p) { Q_CHECK_PTR(p); return p; }
-
-typedef void (*QFunctionPointer)();
-
-#if !defined(Q_UNIMPLEMENTED)
-# define Q_UNIMPLEMENTED() qWarning("Unimplemented code.")
-#endif
-
-namespace QTypeTraits {
-
-namespace detail {
-template<typename T, typename U,
- typename = std::enable_if_t<std::is_arithmetic_v<T> && std::is_arithmetic_v<U> &&
- std::is_floating_point_v<T> == std::is_floating_point_v<U> &&
- std::is_signed_v<T> == std::is_signed_v<U> &&
- !std::is_same_v<T, bool> && !std::is_same_v<U, bool> &&
- !std::is_same_v<T, char> && !std::is_same_v<U, char>>>
-struct Promoted
-{
- using type = decltype(T() + U());
-};
-}
-
-template <typename T, typename U>
-using Promoted = typename detail::Promoted<T, U>::type;
-
-}
-
-template <typename T>
-constexpr inline const T &qMin(const T &a, const T &b) { return (a < b) ? a : b; }
-template <typename T>
-constexpr inline const T &qMax(const T &a, const T &b) { return (a < b) ? b : a; }
-template <typename T>
-constexpr inline const T &qBound(const T &min, const T &val, const T &max)
-{
- Q_ASSERT(!(max < min));
- return qMax(min, qMin(max, val));
-}
-template <typename T, typename U>
-constexpr inline QTypeTraits::Promoted<T, U> qMin(const T &a, const U &b)
-{
- using P = QTypeTraits::Promoted<T, U>;
- P _a = a;
- P _b = b;
- return (_a < _b) ? _a : _b;
-}
-template <typename T, typename U>
-constexpr inline QTypeTraits::Promoted<T, U> qMax(const T &a, const U &b)
-{
- using P = QTypeTraits::Promoted<T, U>;
- P _a = a;
- P _b = b;
- return (_a < _b) ? _b : _a;
-}
-template <typename T, typename U>
-constexpr inline QTypeTraits::Promoted<T, U> qBound(const T &min, const U &val, const T &max)
-{
- Q_ASSERT(!(max < min));
- return qMax(min, qMin(max, val));
-}
-template <typename T, typename U>
-constexpr inline QTypeTraits::Promoted<T, U> qBound(const T &min, const T &val, const U &max)
-{
- using P = QTypeTraits::Promoted<T, U>;
- Q_ASSERT(!(P(max) < P(min)));
- return qMax(min, qMin(max, val));
-}
-template <typename T, typename U>
-constexpr inline QTypeTraits::Promoted<T, U> qBound(const U &min, const T &val, const T &max)
-{
- using P = QTypeTraits::Promoted<T, U>;
- Q_ASSERT(!(P(max) < P(min)));
- return qMax(min, qMin(max, val));
-}
-
-[[nodiscard]] constexpr bool qFuzzyCompare(double p1, double p2)
-{
- return (qAbs(p1 - p2) * 1000000000000. <= qMin(qAbs(p1), qAbs(p2)));
-}
-
-[[nodiscard]] constexpr bool qFuzzyCompare(float p1, float p2)
-{
- return (qAbs(p1 - p2) * 100000.f <= qMin(qAbs(p1), qAbs(p2)));
-}
-
-[[nodiscard]] constexpr bool qFuzzyIsNull(double d)
-{
- return qAbs(d) <= 0.000000000001;
-}
-
-[[nodiscard]] constexpr bool qFuzzyIsNull(float f)
-{
- return qAbs(f) <= 0.00001f;
-}
-
-QT_WARNING_PUSH
-QT_WARNING_DISABLE_FLOAT_COMPARE
-
-[[nodiscard]] constexpr bool qIsNull(double d) noexcept
-{
- return d == 0.0;
-}
-
-[[nodiscard]] constexpr bool qIsNull(float f) noexcept
-{
- return f == 0.0f;
-}
-
-QT_WARNING_POP
-
-/*
- Compilers which follow outdated template instantiation rules
- require a class to have a comparison operator to exist when
- a QList of this type is instantiated. It's not actually
- used in the list, though. Hence the dummy implementation.
- Just in case other code relies on it we better trigger a warning
- mandating a real implementation.
-*/
-
-#ifdef Q_FULL_TEMPLATE_INSTANTIATION
-# define Q_DUMMY_COMPARISON_OPERATOR(C) \
- bool operator==(const C&) const { \
- qWarning(#C"::operator==(const "#C"&) was called"); \
- return false; \
- }
-#else
-
-# define Q_DUMMY_COMPARISON_OPERATOR(C)
-#endif
-
-QT_WARNING_PUSH
-// warning: noexcept-expression evaluates to 'false' because of a call to 'void swap(..., ...)'
-QT_WARNING_DISABLE_GCC("-Wnoexcept")
-
-namespace QtPrivate
-{
-namespace SwapExceptionTester { // insulate users from the "using std::swap" below
- using std::swap; // import std::swap
- template <typename T>
- void checkSwap(T &t)
- noexcept(noexcept(swap(t, t)));
- // declared, but not implemented (only to be used in unevaluated contexts (noexcept operator))
-}
-} // namespace QtPrivate
-
-// Documented in ../tools/qalgorithm.qdoc
-template <typename T>
-constexpr void qSwap(T &value1, T &value2)
- noexcept(noexcept(QtPrivate::SwapExceptionTester::checkSwap(value1)))
-{
- using std::swap;
- swap(value1, value2);
-}
-
-QT_WARNING_POP
-
-Q_CORE_EXPORT void *qMallocAligned(size_t size, size_t alignment) Q_ALLOC_SIZE(1);
-Q_CORE_EXPORT void *qReallocAligned(void *ptr, size_t size, size_t oldsize, size_t alignment) Q_ALLOC_SIZE(2);
-Q_CORE_EXPORT void qFreeAligned(void *ptr);
-
-
-/*
- Avoid some particularly useless warnings from some stupid compilers.
- To get ALL C++ compiler warnings, define QT_CC_WARNINGS or comment out
- the line "#define QT_NO_WARNINGS".
-*/
-#if !defined(QT_CC_WARNINGS)
-# define QT_NO_WARNINGS
-#endif
-#if defined(QT_NO_WARNINGS)
-# if defined(Q_CC_MSVC)
-QT_WARNING_DISABLE_MSVC(4251) /* class 'type' needs to have dll-interface to be used by clients of class 'type2' */
-QT_WARNING_DISABLE_MSVC(4244) /* conversion from 'type1' to 'type2', possible loss of data */
-QT_WARNING_DISABLE_MSVC(4275) /* non - DLL-interface classkey 'identifier' used as base for DLL-interface classkey 'identifier' */
-QT_WARNING_DISABLE_MSVC(4514) /* unreferenced inline function has been removed */
-QT_WARNING_DISABLE_MSVC(4800) /* 'type' : forcing value to bool 'true' or 'false' (performance warning) */
-QT_WARNING_DISABLE_MSVC(4097) /* typedef-name 'identifier1' used as synonym for class-name 'identifier2' */
-QT_WARNING_DISABLE_MSVC(4706) /* assignment within conditional expression */
-QT_WARNING_DISABLE_MSVC(4355) /* 'this' : used in base member initializer list */
-QT_WARNING_DISABLE_MSVC(4710) /* function not inlined */
-QT_WARNING_DISABLE_MSVC(4530) /* C++ exception handler used, but unwind semantics are not enabled. Specify /EHsc */
-# elif defined(Q_CC_BOR)
-# pragma option -w-inl
-# pragma option -w-aus
-# pragma warn -inl
-# pragma warn -pia
-# pragma warn -ccc
-# pragma warn -rch
-# pragma warn -sig
-# endif
-#endif
-
-// this adds const to non-const objects (like std::as_const)
-template <typename T>
-constexpr typename std::add_const<T>::type &qAsConst(T &t) noexcept { return t; }
-// prevent rvalue arguments:
-template <typename T>
-void qAsConst(const T &&) = delete;
-
-// like std::exchange
-template <typename T, typename U = T>
-constexpr T qExchange(T &t, U &&newValue)
-noexcept(std::conjunction_v<std::is_nothrow_move_constructible<T>, std::is_nothrow_assignable<T &, U>>)
-{
- T old = std::move(t);
- t = std::forward<U>(newValue);
- return old;
-}
-
-// like std::to_underlying
-template <typename Enum>
-constexpr std::underlying_type_t<Enum> qToUnderlying(Enum e) noexcept
-{
- return static_cast<std::underlying_type_t<Enum>>(e);
-}
-
-#ifdef __cpp_conditional_explicit
-#define Q_IMPLICIT explicit(false)
-#else
-#define Q_IMPLICIT
-#endif
-
-#ifndef QT_NO_FOREACH
-
-namespace QtPrivate {
-
-template <typename T>
-class QForeachContainer {
- Q_DISABLE_COPY(QForeachContainer)
-public:
- QForeachContainer(const T &t) : c(t), i(qAsConst(c).begin()), e(qAsConst(c).end()) {}
- QForeachContainer(T &&t) : c(std::move(t)), i(qAsConst(c).begin()), e(qAsConst(c).end()) {}
-
- QForeachContainer(QForeachContainer &&other)
- : c(std::move(other.c)),
- i(qAsConst(c).begin()),
- e(qAsConst(c).end()),
- control(std::move(other.control))
- {
- }
-
- QForeachContainer &operator=(QForeachContainer &&other)
- {
- c = std::move(other.c);
- i = qAsConst(c).begin();
- e = qAsConst(c).end();
- control = std::move(other.control);
- return *this;
- }
-
- T c;
- typename T::const_iterator i, e;
- int control = 1;
-};
-
-// Containers that have a detach function are considered shared, and are OK in a foreach loop
-template <typename T, typename = decltype(std::declval<T>().detach())>
-inline void warnIfContainerIsNotShared(int) {}
-
-#if QT_DEPRECATED_SINCE(6, 0)
-// Other containers will copy themselves if used in foreach, this use is deprecated
-template <typename T>
-QT_DEPRECATED_VERSION_X_6_0("Do not use foreach/Q_FOREACH with containers which are not implicitly shared. "
- "Prefer using a range-based for loop with these containers: `for (const auto &it : container)`, "
- "keeping in mind that range-based for doesn't copy the container as Q_FOREACH does")
-inline void warnIfContainerIsNotShared(...) {}
-#endif
-
-template<typename T>
-QForeachContainer<typename std::decay<T>::type> qMakeForeachContainer(T &&t)
-{
- warnIfContainerIsNotShared<typename std::decay<T>::type>(0);
- return QForeachContainer<typename std::decay<T>::type>(std::forward<T>(t));
-}
-
-}
-
-// Use C++17 if statement with initializer. User's code ends up in a else so
-// scoping of different ifs is not broken
-#define Q_FOREACH_IMPL(variable, name, container) \
- for (auto name = QtPrivate::qMakeForeachContainer(container); name.i != name.e; ++name.i) \
- if (variable = *name.i; false) {} else
-
-#define Q_FOREACH_JOIN(A, B) Q_FOREACH_JOIN_IMPL(A, B)
-#define Q_FOREACH_JOIN_IMPL(A, B) A ## B
-
-#define Q_FOREACH(variable, container) \
- Q_FOREACH_IMPL(variable, Q_FOREACH_JOIN(_container_, __LINE__), container)
-#endif // QT_NO_FOREACH
-
-#define Q_FOREVER for(;;)
-#ifndef QT_NO_KEYWORDS
-# ifndef QT_NO_FOREACH
-# ifndef foreach
-# define foreach Q_FOREACH
-# endif
-# endif // QT_NO_FOREACH
-# ifndef forever
-# define forever Q_FOREVER
-# endif
-#endif
-
-template <typename T> inline T *qGetPtrHelper(T *ptr) noexcept { return ptr; }
-template <typename Ptr> inline auto qGetPtrHelper(Ptr &ptr) noexcept -> decltype(ptr.get())
-{ static_assert(noexcept(ptr.get()), "Smart d pointers for Q_DECLARE_PRIVATE must have noexcept get()"); return ptr.get(); }
-
-// The body must be a statement:
-#define Q_CAST_IGNORE_ALIGN(body) QT_WARNING_PUSH QT_WARNING_DISABLE_GCC("-Wcast-align") body QT_WARNING_POP
-#define Q_DECLARE_PRIVATE(Class) \
- inline Class##Private* d_func() noexcept \
- { Q_CAST_IGNORE_ALIGN(return reinterpret_cast<Class##Private *>(qGetPtrHelper(d_ptr));) } \
- inline const Class##Private* d_func() const noexcept \
- { Q_CAST_IGNORE_ALIGN(return reinterpret_cast<const Class##Private *>(qGetPtrHelper(d_ptr));) } \
- friend class Class##Private;
-
-#define Q_DECLARE_PRIVATE_D(Dptr, Class) \
- inline Class##Private* d_func() noexcept \
- { Q_CAST_IGNORE_ALIGN(return reinterpret_cast<Class##Private *>(qGetPtrHelper(Dptr));) } \
- inline const Class##Private* d_func() const noexcept \
- { Q_CAST_IGNORE_ALIGN(return reinterpret_cast<const Class##Private *>(qGetPtrHelper(Dptr));) } \
- friend class Class##Private;
-
-#define Q_DECLARE_PUBLIC(Class) \
- inline Class* q_func() noexcept { return static_cast<Class *>(q_ptr); } \
- inline const Class* q_func() const noexcept { return static_cast<const Class *>(q_ptr); } \
- friend class Class;
-
-#define Q_D(Class) Class##Private * const d = d_func()
-#define Q_Q(Class) Class * const q = q_func()
-
-#define QT_TR_NOOP(x) x
-#define QT_TR_NOOP_UTF8(x) x
-#define QT_TRANSLATE_NOOP(scope, x) x
-#define QT_TRANSLATE_NOOP_UTF8(scope, x) x
-#define QT_TRANSLATE_NOOP3(scope, x, comment) {x, comment}
-#define QT_TRANSLATE_NOOP3_UTF8(scope, x, comment) {x, comment}
-
-#ifndef QT_NO_TRANSLATION
-
-#define QT_TR_N_NOOP(x) x
-#define QT_TRANSLATE_N_NOOP(scope, x) x
-#define QT_TRANSLATE_N_NOOP3(scope, x, comment) {x, comment}
-
-// Defined in qcoreapplication.cpp
-// The better name qTrId() is reserved for an upcoming function which would
-// return a much more powerful QStringFormatter instead of a QString.
-Q_CORE_EXPORT QString qtTrId(const char *id, int n = -1);
-
-#define QT_TRID_NOOP(id) id
-#define QT_TRID_N_NOOP(id) id
-
-#endif // QT_NO_TRANSLATION
-
-
-#ifdef Q_QDOC
-// Just for documentation generation
-template<typename T>
-auto qOverload(T functionPointer);
-template<typename T>
-auto qConstOverload(T memberFunctionPointer);
-template<typename T>
-auto qNonConstOverload(T memberFunctionPointer);
-#else
-template <typename... Args>
-struct QNonConstOverload
-{
- template <typename R, typename T>
- constexpr auto operator()(R (T::*ptr)(Args...)) const noexcept -> decltype(ptr)
- { return ptr; }
-
- template <typename R, typename T>
- static constexpr auto of(R (T::*ptr)(Args...)) noexcept -> decltype(ptr)
- { return ptr; }
-};
-
-template <typename... Args>
-struct QConstOverload
-{
- template <typename R, typename T>
- constexpr auto operator()(R (T::*ptr)(Args...) const) const noexcept -> decltype(ptr)
- { return ptr; }
-
- template <typename R, typename T>
- static constexpr auto of(R (T::*ptr)(Args...) const) noexcept -> decltype(ptr)
- { return ptr; }
-};
-
-template <typename... Args>
-struct QOverload : QConstOverload<Args...>, QNonConstOverload<Args...>
-{
- using QConstOverload<Args...>::of;
- using QConstOverload<Args...>::operator();
- using QNonConstOverload<Args...>::of;
- using QNonConstOverload<Args...>::operator();
-
- template <typename R>
- constexpr auto operator()(R (*ptr)(Args...)) const noexcept -> decltype(ptr)
- { return ptr; }
-
- template <typename R>
- static constexpr auto of(R (*ptr)(Args...)) noexcept -> decltype(ptr)
- { return ptr; }
-};
-
-template <typename... Args> constexpr inline QOverload<Args...> qOverload = {};
-template <typename... Args> constexpr inline QConstOverload<Args...> qConstOverload = {};
-template <typename... Args> constexpr inline QNonConstOverload<Args...> qNonConstOverload = {};
-#endif
-
-
-class QByteArray;
-Q_CORE_EXPORT QByteArray qgetenv(const char *varName);
-// need it as two functions because QString is only forward-declared here
-Q_CORE_EXPORT QString qEnvironmentVariable(const char *varName);
-Q_CORE_EXPORT QString qEnvironmentVariable(const char *varName, const QString &defaultValue);
-Q_CORE_EXPORT bool qputenv(const char *varName, const QByteArray& value);
-Q_CORE_EXPORT bool qunsetenv(const char *varName);
-
-Q_CORE_EXPORT bool qEnvironmentVariableIsEmpty(const char *varName) noexcept;
-Q_CORE_EXPORT bool qEnvironmentVariableIsSet(const char *varName) noexcept;
-Q_CORE_EXPORT int qEnvironmentVariableIntValue(const char *varName, bool *ok=nullptr) noexcept;
-
-inline int qIntCast(double f) { return int(f); }
-inline int qIntCast(float f) { return int(f); }
-
-#define QT_MODULE(x)
-
-#if !defined(QT_BOOTSTRAPPED) && defined(QT_REDUCE_RELOCATIONS) && defined(__ELF__) && \
- (!defined(__PIC__) || (defined(__PIE__) && defined(Q_CC_GNU) && Q_CC_GNU >= 500))
-# error "You must build your code with position independent code if Qt was built with -reduce-relocations. "\
- "Compile your code with -fPIC (and not with -fPIE)."
-#endif
-
-#define QT_VA_ARGS_CHOOSE(_1, _2, _3, _4, _5, _6, _7, _8, _9, N, ...) N
-#define QT_VA_ARGS_EXPAND(...) __VA_ARGS__ // Needed for MSVC
-#define QT_VA_ARGS_COUNT(...) QT_VA_ARGS_EXPAND(QT_VA_ARGS_CHOOSE(__VA_ARGS__, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0))
-#define QT_OVERLOADED_MACRO_EXPAND(MACRO, ARGC) MACRO##_##ARGC
-#define QT_OVERLOADED_MACRO_IMP(MACRO, ARGC) QT_OVERLOADED_MACRO_EXPAND(MACRO, ARGC)
-#define QT_OVERLOADED_MACRO(MACRO, ...) QT_VA_ARGS_EXPAND(QT_OVERLOADED_MACRO_IMP(MACRO, QT_VA_ARGS_COUNT(__VA_ARGS__))(__VA_ARGS__))
-
-// This macro can be used to calculate member offsets for types with a non standard layout.
-// It uses the fact that offsetof() is allowed to support those types since C++17 as an optional
-// feature. All our compilers do support this, but some issue a warning, so we wrap the offsetof()
-// call in a macro that disables the compiler warning.
-#define Q_OFFSETOF(Class, member) \
- []() -> size_t { \
- QT_WARNING_PUSH QT_WARNING_DISABLE_INVALID_OFFSETOF \
- return offsetof(Class, member); \
- QT_WARNING_POP \
- }()
-
-QT_END_NAMESPACE
+#include <QtCore/qtclasshelpermacros.h>
// We need to keep QTypeInfo, QSysInfo, QFlags, qDebug & family in qglobal.h for compatibility with Qt 4.
// Be careful when changing the order of these files.
@@ -1485,11 +51,24 @@ QT_END_NAMESPACE
#include <QtCore/qflags.h>
#include <QtCore/qatomic.h>
+#include <QtCore/qconstructormacros.h>
+#include <QtCore/qdarwinhelpers.h>
+#include <QtCore/qexceptionhandling.h>
+#include <QtCore/qforeach.h>
+#include <QtCore/qfunctionpointer.h>
#include <QtCore/qglobalstatic.h>
+#include <QtCore/qmalloc.h>
+#include <QtCore/qminmax.h>
#include <QtCore/qnumeric.h>
+#include <QtCore/qoverload.h>
+#include <QtCore/qswap.h>
+#include <QtCore/qtdeprecationmarkers.h>
+#include <QtCore/qtenvironmentvariables.h>
+#include <QtCore/qtresource.h>
+#include <QtCore/qttranslation.h>
+#include <QtCore/qttypetraits.h>
#include <QtCore/qversiontagging.h>
#endif /* __cplusplus */
-#endif /* !__ASSEMBLER__ */
#endif /* QGLOBAL_H */
diff --git a/src/corelib/global/qglobal_p.h b/src/corelib/global/qglobal_p.h
index 49927ef30f..31f67510e3 100644
--- a/src/corelib/global/qglobal_p.h
+++ b/src/corelib/global/qglobal_p.h
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2017 The Qt Company Ltd.
-** Copyright (C) 2015 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2017 The Qt Company Ltd.
+// Copyright (C) 2015 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QGLOBAL_P_H
#define QGLOBAL_P_H
@@ -60,22 +24,37 @@
#include <QtCore/private/qtcore-config_p.h>
#endif
-#if defined(__cplusplus)
-#ifdef Q_CC_MINGW
-# include <unistd.h> // Define _POSIX_THREAD_SAFE_FUNCTIONS to obtain localtime_r()
+#if defined(Q_CC_MSVC)
+// By default, dynamic initialization uses subsection "$XCU", which is
+// equivalent to #pragma init_seg(user). Additionally, #pragma
+// init_seg(compiler) and init_seg(lib) use "$XCC" and "$XCL" respectively. So
+// place us between "compiler" and "lib".
+# define QT_SUPPORTS_INIT_PRIORITY 1
+
+// warning C4075: initializers put in unrecognized initialization area
+# define Q_DECL_INIT_PRIORITY(nn) \
+ __pragma(warning(disable: 4075)) \
+ __pragma(init_seg(".CRT$XCK" QT_STRINGIFY(nn))) Q_DECL_UNUSED
+#elif defined(Q_OS_QNX)
+// init_priority fails on QNX and we didn't bother investigating why
+# define QT_SUPPORTS_INIT_PRIORITY 0
+#elif defined(Q_OS_WIN) || defined(Q_OF_ELF)
+# define QT_SUPPORTS_INIT_PRIORITY 1
+// priorities 0 to 1000 are reserved to the runtime;
+// we use above 2000 in case someone REALLY needs to go before us
+# define Q_DECL_INIT_PRIORITY(nn) __attribute__((init_priority(2000 + nn), used))
+#elif defined(QT_SHARED)
+// it doesn't support this exactly, but we can work around it
+# define QT_SUPPORTS_INIT_PRIORITY -1
+# define Q_DECL_INIT_PRIORITY(nn) Q_DECL_UNUSED
+#else
+# define QT_SUPPORTS_INIT_PRIORITY 0
#endif
-#include <time.h>
+#if defined(__cplusplus)
QT_BEGIN_NAMESPACE
-// These behave as if they consult the environment, so need to share its locking:
-Q_CORE_EXPORT void qTzSet();
-Q_CORE_EXPORT time_t qMkTime(struct tm *when);
-
-#if !defined(Q_CC_MSVC)
-Q_NORETURN
-#endif
-Q_CORE_EXPORT void qAbort();
+Q_NORETURN Q_CORE_EXPORT void qAbort();
QT_END_NAMESPACE
@@ -151,4 +130,3 @@ QT_END_NAMESPACE
#endif // defined(__cplusplus)
#endif // QGLOBAL_P_H
-
diff --git a/src/corelib/global/qglobalstatic.h b/src/corelib/global/qglobalstatic.h
index 6816721b32..93127adab3 100644
--- a/src/corelib/global/qglobalstatic.h
+++ b/src/corelib/global/qglobalstatic.h
@@ -1,49 +1,14 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include <QtCore/qglobal.h>
+// Copyright (C) 2021 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QGLOBALSTATIC_H
#define QGLOBALSTATIC_H
+#include <QtCore/qassert.h>
#include <QtCore/qatomic.h>
+#include <QtCore/qtclasshelpermacros.h>
+#include <atomic> // for bootstrapped (no thread) builds
#include <type_traits>
QT_BEGIN_NAMESPACE
@@ -55,95 +20,109 @@ enum GuardValues {
Uninitialized = 0,
Initializing = 1
};
-}
-#define Q_GLOBAL_STATIC_INTERNAL_HOLDER(ARGS) \
- struct HolderBase \
- { \
- HolderBase() = default; \
- ~HolderBase() noexcept \
- { \
- if (guard.loadRelaxed() == QtGlobalStatic::Initialized) \
- guard.storeRelaxed(QtGlobalStatic::Destroyed); \
- } \
- Q_DISABLE_COPY_MOVE(HolderBase) \
- }; \
- struct Holder : public HolderBase \
- { \
- Type value; \
- Holder() noexcept(noexcept(typename std::remove_cv<Type>::type ARGS)) \
- : value ARGS \
- { \
- guard.storeRelaxed(QtGlobalStatic::Initialized); \
- } \
- };
-
-#if defined(Q_OS_UNIX) && defined(Q_CC_INTEL)
-// Work around Intel issue ID 6000058488:
-// local statics inside an inline function inside an anonymous namespace are global
-// symbols (this affects the IA-64 C++ ABI, so OS X and Linux only)
-# define Q_GLOBAL_STATIC_INTERNAL_DECORATION Q_DECL_HIDDEN
-#else
-# define Q_GLOBAL_STATIC_INTERNAL_DECORATION Q_DECL_HIDDEN inline
+template <typename QGS> union Holder
+{
+ using Type = typename QGS::QGS_Type;
+ using PlainType = std::remove_cv_t<Type>;
+
+ static constexpr bool ConstructionIsNoexcept = noexcept(QGS::innerFunction(nullptr));
+ Q_CONSTINIT static inline QBasicAtomicInteger<qint8> guard = { QtGlobalStatic::Uninitialized };
+
+ // union's sole member
+ PlainType storage;
+
+ Holder() noexcept(ConstructionIsNoexcept)
+ {
+ QGS::innerFunction(pointer());
+ guard.storeRelaxed(QtGlobalStatic::Initialized);
+ }
+
+ ~Holder()
+ {
+ // TSAN does not support atomic_thread_fence and GCC complains:
+ // https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97868
+ // https://github.com/google/sanitizers/issues/1352
+QT_WARNING_PUSH
+#if defined(Q_CC_GNU_ONLY) && Q_CC_GNU >= 1100
+QT_WARNING_DISABLE_GCC("-Wtsan")
#endif
+ // import changes to *pointer() by other threads before running ~PlainType():
+ std::atomic_thread_fence(std::memory_order_acquire);
+QT_WARNING_POP
+ pointer()->~PlainType();
+ guard.storeRelease(QtGlobalStatic::Destroyed);
+ }
-#define Q_GLOBAL_STATIC_INTERNAL(ARGS) \
- Q_GLOBAL_STATIC_INTERNAL_DECORATION Type *innerFunction() \
- { \
- Q_GLOBAL_STATIC_INTERNAL_HOLDER(ARGS) \
- static Holder holder; \
- return &holder.value; \
+ PlainType *pointer() noexcept
+ {
+ return &storage;
}
-// this class must be POD, unless the compiler supports thread-safe statics
-template <typename T, T *(&innerFunction)(), QBasicAtomicInt &guard>
-struct QGlobalStatic
+ Q_DISABLE_COPY_MOVE(Holder)
+};
+}
+
+template <typename Holder> struct QGlobalStatic
{
- typedef T Type;
+ using Type = typename Holder::Type;
- bool isDestroyed() const { return guard.loadRelaxed() <= QtGlobalStatic::Destroyed; }
- bool exists() const { return guard.loadRelaxed() == QtGlobalStatic::Initialized; }
+ bool isDestroyed() const noexcept { return guardValue() <= QtGlobalStatic::Destroyed; }
+ bool exists() const noexcept { return guardValue() == QtGlobalStatic::Initialized; }
operator Type *()
{
if (isDestroyed())
return nullptr;
- return innerFunction();
+ return instance();
}
Type *operator()()
{
if (isDestroyed())
return nullptr;
- return innerFunction();
+ return instance();
}
Type *operator->()
{
- Q_ASSERT_X(!isDestroyed(), "Q_GLOBAL_STATIC",
+ Q_ASSERT_X(!isDestroyed(), Q_FUNC_INFO,
"The global static was used after being destroyed");
- return innerFunction();
+ return instance();
}
Type &operator*()
{
- Q_ASSERT_X(!isDestroyed(), "Q_GLOBAL_STATIC",
+ Q_ASSERT_X(!isDestroyed(), Q_FUNC_INFO,
"The global static was used after being destroyed");
- return *innerFunction();
+ return *instance();
+ }
+
+protected:
+ static Type *instance() noexcept(Holder::ConstructionIsNoexcept)
+ {
+ static Holder holder;
+ return holder.pointer();
+ }
+ static QtGlobalStatic::GuardValues guardValue() noexcept
+ {
+ return QtGlobalStatic::GuardValues(Holder::guard.loadAcquire());
}
};
#define Q_GLOBAL_STATIC_WITH_ARGS(TYPE, NAME, ARGS) \
QT_WARNING_PUSH \
QT_WARNING_DISABLE_CLANG("-Wunevaluated-expression") \
- namespace { namespace Q_QGS_ ## NAME { \
- typedef TYPE Type; \
- QBasicAtomicInt guard = Q_BASIC_ATOMIC_INITIALIZER(QtGlobalStatic::Uninitialized); \
- Q_GLOBAL_STATIC_INTERNAL(ARGS) \
- } } \
- static QGlobalStatic<TYPE, \
- Q_QGS_ ## NAME::innerFunction, \
- Q_QGS_ ## NAME::guard> NAME; \
+ namespace { struct Q_QGS_ ## NAME { \
+ typedef TYPE QGS_Type; \
+ static void innerFunction(void *pointer) \
+ noexcept(noexcept(std::remove_cv_t<QGS_Type> ARGS)) \
+ { \
+ new (pointer) QGS_Type ARGS; \
+ } \
+ }; } \
+ Q_CONSTINIT static QGlobalStatic<QtGlobalStatic::Holder<Q_QGS_ ## NAME>> NAME; \
QT_WARNING_POP
+ /**/
-#define Q_GLOBAL_STATIC(TYPE, NAME) \
- Q_GLOBAL_STATIC_WITH_ARGS(TYPE, NAME, ())
+#define Q_GLOBAL_STATIC(TYPE, NAME, ...) \
+ Q_GLOBAL_STATIC_WITH_ARGS(TYPE, NAME, (__VA_ARGS__))
QT_END_NAMESPACE
#endif // QGLOBALSTATIC_H
diff --git a/src/corelib/global/qglobalstatic.qdoc b/src/corelib/global/qglobalstatic.qdoc
index e7935d5a9b..38700032b1 100644
--- a/src/corelib/global/qglobalstatic.qdoc
+++ b/src/corelib/global/qglobalstatic.qdoc
@@ -1,32 +1,8 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
- \macro Q_GLOBAL_STATIC(Type, VariableName)
+ \macro Q_GLOBAL_STATIC(Type, VariableName, ...)
\since 5.1
\relates QGlobalStatic
@@ -36,6 +12,11 @@
will not increase the application or the library's load time. Additionally,
the object is initialized in a thread-safe manner on all platforms.
+ Since Qt 6.3, this macro admits variadic arguments, which are used to
+ initialize the object, thus making the need for \l
+ Q_GLOBAL_STATIC_WITH_ARGS unnecessary. Please note the arguments do not
+ require an extra set of parentheses, unlike the older macro.
+
The typical use of this macro is as follows, in a global context (that is,
outside of any function bodies):
@@ -65,10 +46,6 @@
\li the order of initialization and destruction among different
translation units is not determined, leading to possible uses before
initialization or after destruction;
-
- \li if it is found inside a function (that is, not global), it will be
- initialized on first use, but many current compilers (as of 2013) do
- not guarantee that the initialization will be thread-safe;
\endlist
The Q_GLOBAL_STATIC macro solves all of the above problems by guaranteeing
@@ -195,11 +172,11 @@
\omit
\section1 Compatibility with Qt 4 and Qt 5.0
- This macro, in its current form and behavior, was introduced in Qt 5.1.
- Prior to that version, Qt had another macro with the same name that was
- private API. This section is not meant to document how to use
- Q_GLOBAL_STATIC in those versions, but instead to serve as a porting guide
- for Qt code that used those macros.
+ This macro, in its current behavior, was introduced in Qt 5.1. Prior to
+ that version, Qt had another macro with the same name that was private API.
+ This section is not meant to document how to use Q_GLOBAL_STATIC in those
+ versions, but instead to serve as a porting guide for Qt code that used
+ those macros.
The Qt 4 Q_GLOBAL_STATIC macro differed in behavior in the following ways:
@@ -218,24 +195,38 @@
\section1 Implementation Details
- Q_GLOBAL_STATIC is implemented by creating a QBasicAtomicInt called the \c
- guard and a free, inline function called \c innerFunction. The guard
- variable is initialized to value 0 (chosen so that the guard can be placed
- in the .bss section of the binary file), which denotes that construction
- has not yet taken place (uninitialized). The inner function is implemented
- by the helper macro Q_GLOBAL_STATIC_INTERNAL.
-
- Both the guard variable and the inner function are passed as template
- parameters to QGlobalStatic, along with the type \a Type. Both should also
- have static linkage or be placed inside an anonymous namespace, so that the
- visibility of Q_GLOBAL_STATIC is that of a global static. To permit
- multiple Q_GLOBAL_STATIC per translation unit, the guard variable and the
- inner function must have unique names, which can be accomplished by
- concatenating with \a VariableName or by placing them in a namespace that
- has \a VariableName as part of the name. To simplify and improve
- readability on Q_GLOBAL_STATIC_INTERNAL, we chose the namespace solution.
- It's also required for C++98 builds, since static symbols cannot be used as
- template parameters.
+ Q_GLOBAL_STATIC is implemented by creating a type called \c Q_QGS_NAME
+ where \c NAME is the name of the variable the user passed to the macro,
+ inside an unnamed namespace, and a \c static variable of \l QGlobalStatic
+ type, named \c NAME. The use of unnamed namespaces forces the compiler to emit
+ non-exported symbols, often local to the translation unit, and this
+ propagates to the \l QGlobalStatic template instantiation that uses such
+ types. Additionally, because the type is used only for one variable,
+ there's effectively no difference between static and non-static data
+ members.
+
+ The "QGS" type is a \c struct containing a \c typedef to \a TYPE and a
+ static member function that receives a pointer to storage suitable to hold
+ an instance of \a TYPE. It will initialize the storage using a placement \c
+ new and the variadic arguments.
+
+ The majority of the work is done by the public \l QGlobalStatic class and
+ the private \c QtGlobalStatic::Holder class. The \c Holder union has a
+ single non-static member of type \a TYPE, but because this is a union, its
+ construction and destruction are explicitly controlled in the Holder's
+ constructor and destructor. The constructor calls the "QGS" type's static
+ member function with a pointer to this member so it can be initialized
+ and the destructor calls the type's destructor. The \c{Holder} type is
+ therefore neither trivially constructible nor trivially destructible. It is
+ used as a function-local \c static so its initialization is thread-safe due
+ to C++11's requirement that such variables be thread-safely initialized.
+
+ Additionally, both the constructor and destructor modify a guard variable
+ after construction and before destruction, respectively. The guard variable
+ is implemented as a \c {static inline} member instead of a non-static
+ member so the compiler and linker are free to place this variable in memory
+ far from the actual object. This way, if we wanted to, we could mark it
+ aligned-to-cacheline in the future to prevent false sharing.
The guard variable can assume the following values:
@@ -257,42 +248,15 @@
operate solely on the guard variable: the former returns \c true if the guard
is negative, whereas the latter returns \c true only if it is -2.
- The Q_GLOBAL_STATIC_INTERNAL macro implements the actual construction and
- destruction. There are two implementations of it: one for compilers that
- support thread-safe initialization of function-local statics and one for
- compilers that don't. Thread-safe initialization is required by C++11 in
- [stmt.decl], but as of the time of this writing, only compilers based on
- the IA-64 C++ ABI implemented it properly. The implementation requiring
- thread-safe initialization is also used on the Qt bootstrapped tools, which
- disable the "thread" feature.
-
- The implementation requiring thread-safe initialization from the compiler
- is the simplest: it creates the \a Type object as a function-local static
- and returns its address. The actual object is actually inside a holder
- structure so holder's destructor can set the guard variable to the value -2
- (destroyed) when the type has finished destruction. Since we need to set
- the guard \b after the destruction has finished, this code needs to be in a
- base struct's destructor. And it only sets to -2 (destroyed) if it finds
- the guard at -1 (initialized): this is done to ensure that the guard isn't
- set to -2 in the event the type's constructor threw an exception. A holder
- structure is used to avoid creating two statics, which the ABI might
- require duplicating the thread-safe control structures for.
-
- The other implementation is similar to Qt 4's Q_GLOBAL_STATIC, but unlike
- that one, it uses a \l QBasicMutex to provide locking. It is also more
- efficient memory-wise. It use a simple double-checked locking of the mutex
- and then creates the contents on the heap. After that, it creates a
- function-local structure called "Cleanup", whose destructor will be run at
- program exit and will actually destroy the contents.
-
\endomit
- \sa Q_GLOBAL_STATIC_WITH_ARGS(), QGlobalStatic
+ \sa Q_GLOBAL_STATIC_WITH_ARGS(), Q_APPLICATION_STATIC(), QGlobalStatic
*/
/*!
\macro Q_GLOBAL_STATIC_WITH_ARGS(Type, VariableName, Arguments)
\since 5.1
+ \obsolete
\relates QGlobalStatic
Creates a global and static object of type \l QGlobalStatic, of name \a
@@ -310,7 +274,12 @@
\endcode
The \a Arguments macro parameter must always include the parentheses or, if
- C++11 uniform initialization is allowed, the braces.
+ C++11 uniform initialization is allowed, the braces. The above call is
+ equivalent to
+
+ \code
+ Q_GLOBAL_STATIC(MyType, staticType, 42, "Hello", "World")
+ \endcode
Aside from the actual initialization of the contents with the supplied
arguments, this macro behaves identically to Q_GLOBAL_STATIC(). Please
@@ -356,7 +325,7 @@
*/
/*!
- \fn template <typename T, T *(&innerFunction)(), QBasicAtomicInt &guard> bool QGlobalStatic<T, innerFunction, guard>::isDestroyed() const
+ \fn template <typename Holder> bool QGlobalStatic<Holder>::isDestroyed() const
This function returns \c true if the global static object has already
completed destruction (that is, if the destructor for the type has already
@@ -386,7 +355,7 @@
*/
/*!
- \fn template <typename T, T *(&innerFunction)(), QBasicAtomicInt &guard> bool QGlobalStatic<T, innerFunction, guard>::exists() const
+ \fn template <typename Holder> bool QGlobalStatic<Holder>::exists() const
This function returns \c true if the global static object has already
completed initialization (that is, if the constructor for the type has
@@ -436,7 +405,7 @@
/*!
\keyword qglobalstatic-operator-type-ptr
- \fn template <typename T, T *(&innerFunction)(), QBasicAtomicInt &guard> QGlobalStatic<T, innerFunction, guard>::operator Type*()
+ \fn template <typename Holder> QGlobalStatic<Holder>::operator Type*()
This function returns the address of the contents of this global static. If
the contents have not yet been created, they will be created thread-safely
@@ -469,7 +438,7 @@
*/
/*!
- \fn template <typename T, T *(&innerFunction)(), QBasicAtomicInt &guard> Type *QGlobalStatic<T, innerFunction, guard>::operator()()
+ \fn template <typename Holder> Type *QGlobalStatic<Holder>::operator()()
\deprecated
This function returns the address of the contents of this global static. If
@@ -485,7 +454,7 @@
*/
/*!
- \fn template <typename T, T *(&innerFunction)(), QBasicAtomicInt &guard> Type *QGlobalStatic<T, innerFunction, guard>::operator->()
+ \fn template <typename Holder> Type *QGlobalStatic<Holder>::operator->()
This function returns the address of the contents of this global static. If
the contents have not yet been created, they will be created thread-safely
@@ -498,7 +467,7 @@
*/
/*!
- \fn template <typename T, T *(&innerFunction)(), QBasicAtomicInt &guard> Type &QGlobalStatic<T, innerFunction, guard>::operator*()
+ \fn template <typename Holder> Type &QGlobalStatic<Holder>::operator*()
This function returns a reference to the contents of this global static. If
the contents have not yet been created, they will be created thread-safely
diff --git a/src/corelib/global/qhooks.cpp b/src/corelib/global/qhooks.cpp
index 491e126b7a..414b96aac3 100644
--- a/src/corelib/global/qhooks.cpp
+++ b/src/corelib/global/qhooks.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2014 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Volker Krause <volker.krause@kdab.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2014 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Volker Krause <volker.krause@kdab.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qhooks_p.h"
@@ -67,7 +31,7 @@ quintptr Q_CORE_EXPORT qtHookData[] = {
// The required sizes and offsets are tested in tests/auto/other/toolsupport.
// When this fails and the change was intentional, adjust the test and
// adjust this value here.
- 21
+ 22,
};
static_assert(QHooks::LastHookIndex == sizeof(qtHookData) / sizeof(qtHookData[0]));
diff --git a/src/corelib/global/qhooks_p.h b/src/corelib/global/qhooks_p.h
index a51a2ec86b..e266c2a7f9 100644
--- a/src/corelib/global/qhooks_p.h
+++ b/src/corelib/global/qhooks_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2014 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Volker Krause <volker.krause@kdab.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2014 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Volker Krause <volker.krause@kdab.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QHOOKS_H
diff --git a/src/corelib/global/qlibraryinfo.cpp b/src/corelib/global/qlibraryinfo.cpp
index 0ae41cc48e..1b03733d2a 100644
--- a/src/corelib/global/qlibraryinfo.cpp
+++ b/src/corelib/global/qlibraryinfo.cpp
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Copyright (C) 2021 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// Copyright (C) 2021 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qdir.h"
#include "qstringlist.h"
@@ -68,6 +32,8 @@
QT_BEGIN_NAMESPACE
+using namespace Qt::StringLiterals;
+
extern void qDumpCPUFeatures(); // in qsimd.cpp
#if QT_CONFIG(settings)
@@ -116,15 +82,24 @@ void QLibrarySettings::load()
// This code needs to be in the regular library, as otherwise a qt.conf that
// works for qmake would break things for dynamically built Qt tools.
QStringList children = settings->childGroups();
- paths = !children.contains(QLatin1String("Platforms"))
- || children.contains(QLatin1String("Paths"));
+ paths = !children.contains("Platforms"_L1)
+ || children.contains("Paths"_L1);
}
}
+namespace {
+const QString *qtconfManualPath = nullptr;
+}
+
+void QLibraryInfoPrivate::setQtconfManualPath(const QString *path)
+{
+ qtconfManualPath = path;
+}
+
static QSettings *findConfiguration()
{
- if (!QLibraryInfoPrivate::qtconfManualPath.isEmpty())
- return new QSettings(QLibraryInfoPrivate::qtconfManualPath, QSettings::IniFormat);
+ if (qtconfManualPath)
+ return new QSettings(*qtconfManualPath, QSettings::IniFormat);
QString qtconfig = QStringLiteral(":/qt/etc/qt.conf");
if (QFile::exists(qtconfig))
@@ -133,7 +108,7 @@ static QSettings *findConfiguration()
CFBundleRef bundleRef = CFBundleGetMainBundle();
if (bundleRef) {
QCFType<CFURLRef> urlRef = CFBundleCopyResourceURL(bundleRef,
- QCFString(QLatin1String("qt.conf")),
+ QCFString("qt.conf"_L1),
0,
0);
if (urlRef) {
@@ -146,18 +121,16 @@ static QSettings *findConfiguration()
#endif
if (QCoreApplication::instance()) {
QDir pwd(QCoreApplication::applicationDirPath());
- qtconfig = pwd.filePath(QLatin1String("qt" QT_STRINGIFY(QT_VERSION_MAJOR) ".conf"));
+ qtconfig = pwd.filePath(u"qt" QT_STRINGIFY(QT_VERSION_MAJOR) ".conf"_s);
if (QFile::exists(qtconfig))
return new QSettings(qtconfig, QSettings::IniFormat);
- qtconfig = pwd.filePath(QLatin1String("qt.conf"));
+ qtconfig = pwd.filePath("qt.conf"_L1);
if (QFile::exists(qtconfig))
return new QSettings(qtconfig, QSettings::IniFormat);
}
return nullptr; //no luck
}
-QString QLibraryInfoPrivate::qtconfManualPath;
-
QSettings *QLibraryInfoPrivate::configuration()
{
QLibrarySettings *ls = qt_library_settings();
@@ -205,42 +178,8 @@ static bool havePaths() {
QLibraryInfo::QLibraryInfo()
{ }
-#if defined(Q_CC_INTEL) // must be before GNU, Clang and MSVC because ICC/ICL claim to be them
-# ifdef __INTEL_CLANG_COMPILER
-# define ICC_COMPAT "Clang"
-# elif defined(__INTEL_MS_COMPAT_LEVEL)
-# define ICC_COMPAT "Microsoft"
-# elif defined(__GNUC__)
-# define ICC_COMPAT "GCC"
-# else
-# define ICC_COMPAT "no"
-# endif
-# if __INTEL_COMPILER == 1300
-# define ICC_VERSION "13.0"
-# elif __INTEL_COMPILER == 1310
-# define ICC_VERSION "13.1"
-# elif __INTEL_COMPILER == 1400
-# define ICC_VERSION "14.0"
-# elif __INTEL_COMPILER == 1500
-# define ICC_VERSION "15.0"
-# else
-# define ICC_VERSION QT_STRINGIFY(__INTEL_COMPILER)
-# endif
-# ifdef __INTEL_COMPILER_UPDATE
-# define COMPILER_STRING "Intel(R) C++ " ICC_VERSION "." QT_STRINGIFY(__INTEL_COMPILER_UPDATE) \
- " build " QT_STRINGIFY(__INTEL_COMPILER_BUILD_DATE) " [" \
- ICC_COMPAT " compatibility]"
-# else
-# define COMPILER_STRING "Intel(R) C++ " ICC_VERSION \
- " build " QT_STRINGIFY(__INTEL_COMPILER_BUILD_DATE) " [" \
- ICC_COMPAT " compatibility]"
-# endif
-#elif defined(Q_CC_CLANG) // must be before GNU, because clang claims to be GNU too
-# ifdef __apple_build_version__ // Apple clang has other version numbers
-# define COMPILER_STRING "Clang " __clang_version__ " (Apple)"
-# else
-# define COMPILER_STRING "Clang " __clang_version__
-# endif
+#if defined(Q_CC_CLANG) // must be before GNU, because clang claims to be GNU too
+# define COMPILER_STRING __VERSION__ /* already includes the compiler's name */
#elif defined(Q_CC_GHS)
# define COMPILER_STRING "GHS " QT_STRINGIFY(__GHS_VERSION_NUMBER)
#elif defined(Q_CC_GNU)
@@ -270,7 +209,10 @@ QLibraryInfo::QLibraryInfo()
#else
# define SHARED_STRING " static"
#endif
-#define QT_BUILD_STR "Qt " QT_VERSION_STR " (" ARCH_FULL SHARED_STRING DEBUG_STRING " build; by " COMPILER_STRING ")"
+static const char *qt_build_string() noexcept
+{
+ return "Qt " QT_VERSION_STR " (" ARCH_FULL SHARED_STRING DEBUG_STRING " build; by " COMPILER_STRING ")";
+}
/*!
Returns a string describing how this version of Qt was built.
@@ -282,7 +224,7 @@ QLibraryInfo::QLibraryInfo()
const char *QLibraryInfo::build() noexcept
{
- return QT_BUILD_STR;
+ return qt_build_string();
}
/*!
@@ -291,7 +233,7 @@ const char *QLibraryInfo::build() noexcept
false if it was built in release mode.
*/
bool
-QLibraryInfo::isDebugBuild()
+QLibraryInfo::isDebugBuild() noexcept
{
#ifdef QT_DEBUG
return true;
@@ -301,6 +243,19 @@ QLibraryInfo::isDebugBuild()
}
/*!
+ \since 6.5
+ Returns \c true if this is a shared (dynamic) build of Qt.
+*/
+bool QLibraryInfo::isSharedBuild() noexcept
+{
+#ifdef QT_SHARED
+ return true;
+#else
+ return false;
+#endif
+}
+
+/*!
\since 5.8
Returns the version of the Qt library.
@@ -323,7 +278,7 @@ static QString prefixFromAppDirHelper()
if (urlRef) {
QCFString path = CFURLCopyFileSystemPath(urlRef, kCFURLPOSIXPathStyle);
#ifdef Q_OS_MACOS
- QString bundleContentsDir = QString(path) + QLatin1String("/Contents/");
+ QString bundleContentsDir = QString(path) + "/Contents/"_L1;
if (QDir(bundleContentsDir).exists())
return QDir::cleanPath(bundleContentsDir);
#else
@@ -348,8 +303,7 @@ static QString prefixFromQtCoreLibraryHelper(const QString &qtCoreLibraryPath)
{
const QString qtCoreLibrary = QDir::fromNativeSeparators(qtCoreLibraryPath);
const QString libDir = QFileInfo(qtCoreLibrary).absolutePath();
- const QString prefixDir = libDir + QLatin1Char('/')
- + QLatin1String(QT_CONFIGURE_LIBLOCATION_TO_PREFIX_PATH);
+ const QString prefixDir = libDir + "/" QT_CONFIGURE_LIBLOCATION_TO_PREFIX_PATH;
return QDir::cleanPath(prefixDir);
}
#endif
@@ -365,7 +319,7 @@ static HMODULE getWindowsModuleHandle()
}
#endif // Q_OS_WIN
-static QString getRelocatablePrefix()
+static QString getRelocatablePrefix(QLibraryInfoPrivate::UsageMode usageMode)
{
QString prefixPath;
@@ -373,7 +327,14 @@ static QString getRelocatablePrefix()
// For regular builds, the prefix will be relative to the location of the QtCore shared library.
#if defined(QT_STATIC)
prefixPath = prefixFromAppDirHelper();
+ if (usageMode == QLibraryInfoPrivate::UsedFromQtBinDir) {
+ // For Qt tools in a static build, we must chop off the bin directory.
+ constexpr QByteArrayView binDir = qt_configure_strs.viewAt(QLibraryInfo::BinariesPath - 1);
+ constexpr size_t binDirLength = binDir.size() + 1;
+ prefixPath.chop(binDirLength);
+ }
#elif defined(Q_OS_DARWIN) && QT_CONFIG(framework)
+ Q_UNUSED(usageMode);
#ifndef QT_LIBINFIX
#define QT_LIBINFIX ""
#endif
@@ -408,16 +369,22 @@ static QString getRelocatablePrefix()
const QCFString libDirCFString = CFURLCopyFileSystemPath(libDirCFPath, kCFURLPOSIXPathStyle);
- const QString prefixDir = QString(libDirCFString) + QLatin1Char('/')
- + QLatin1String(QT_CONFIGURE_LIBLOCATION_TO_PREFIX_PATH);
+ const QString prefixDir = QString(libDirCFString) + "/" QT_CONFIGURE_LIBLOCATION_TO_PREFIX_PATH;
prefixPath = QDir::cleanPath(prefixDir);
+#elif defined(Q_OS_WASM)
+ // Emscripten expects to find shared libraries at the root of the in-memory
+ // file system when resolving dependencies for for dlopen() calls. So that's
+ // where libqt6core.so would be.
+ prefixPath = QStringLiteral("/");
#elif QT_CONFIG(dlopen)
+ Q_UNUSED(usageMode);
Dl_info info;
int result = dladdr(reinterpret_cast<void *>(&QLibraryInfo::isDebugBuild), &info);
if (result > 0 && info.dli_fname)
prefixPath = prefixFromQtCoreLibraryHelper(QString::fromLocal8Bit(info.dli_fname));
#elif defined(Q_OS_WIN)
+ Q_UNUSED(usageMode);
HMODULE hModule = getWindowsModuleHandle();
const int kBufferSize = 4096;
wchar_t buffer[kBufferSize];
@@ -443,7 +410,7 @@ static QString getRelocatablePrefix()
const QString qtCoreImpLibFileName = implibPrefix
+ QFileInfo(qtCoreFilePath).completeBaseName() + implibSuffix;
const QString qtCoreImpLibPath = qtCoreDirPath
- + slash + QLatin1String(QT_CONFIGURE_LIBLOCATION_TO_PREFIX_PATH)
+ + slash + QT_CONFIGURE_LIBLOCATION_TO_PREFIX_PATH
+ slash + libdir
+ slash + qtCoreImpLibFileName;
if (!QFileInfo::exists(qtCoreImpLibPath)) {
@@ -481,11 +448,12 @@ static QString getRelocatablePrefix()
}
#endif
-static QString getPrefix()
+static QString getPrefix(QLibraryInfoPrivate::UsageMode usageMode)
{
#if QT_CONFIG(relocatable)
- return getRelocatablePrefix();
+ return getRelocatablePrefix(usageMode);
#else
+ Q_UNUSED(usageMode);
return QString::fromLocal8Bit(QT_CONFIGURE_PREFIX_PATH);
#endif
}
@@ -519,21 +487,20 @@ QLibraryInfoPrivate::LocationInfo QLibraryInfoPrivate::locationInfo(QLibraryInfo
"Examples", "examples",
"Tests", "tests"
);
- static constexpr QByteArrayView dot = qtConfEntries.viewAt(1);
- static_assert(dot.size() == 1);
- static_assert(dot[0] == '.');
+ [[maybe_unused]]
+ constexpr QByteArrayView dot{"."};
LocationInfo result;
if (int(loc) < qtConfEntries.count()) {
- result.key = QLatin1String(qtConfEntries.viewAt(loc * 2));
- result.defaultValue = QLatin1String(qtConfEntries.viewAt(loc * 2 + 1));
+ result.key = QLatin1StringView(qtConfEntries.viewAt(loc * 2));
+ result.defaultValue = QLatin1StringView(qtConfEntries.viewAt(loc * 2 + 1));
if (result.key == u"QmlImports")
- result.fallbackKey = u"Qml2Imports"_qs;
+ result.fallbackKey = u"Qml2Imports"_s;
#ifndef Q_OS_WIN // On Windows we use the registry
} else if (loc == QLibraryInfo::SettingsPath) {
- result.key = QLatin1String("Settings");
- result.defaultValue = QLatin1String(dot);
+ result.key = "Settings"_L1;
+ result.defaultValue = QLatin1StringView(dot);
#endif
}
@@ -552,7 +519,19 @@ QLibraryInfoPrivate::LocationInfo QLibraryInfoPrivate::locationInfo(QLibraryInfo
*/
QString QLibraryInfo::path(LibraryPath p)
{
- const LibraryPath loc = p;
+ return QLibraryInfoPrivate::path(p);
+}
+
+
+/*
+ Returns the path specified by \a p.
+
+ The usage mode can be set to UsedFromQtBinDir to enable special handling for executables that
+ live in <install-prefix>/bin.
+ */
+QString QLibraryInfoPrivate::path(QLibraryInfo::LibraryPath p, UsageMode usageMode)
+{
+ const QLibraryInfo::LibraryPath loc = p;
QString ret;
bool fromConf = false;
#if QT_CONFIG(settings)
@@ -563,7 +542,7 @@ QString QLibraryInfo::path(LibraryPath p)
if (!li.key.isNull()) {
QSettings *config = QLibraryInfoPrivate::configuration();
Q_ASSERT(config != nullptr);
- config->beginGroup(QLatin1String("Paths"));
+ config->beginGroup("Paths"_L1);
if (li.fallbackKey.isNull()) {
ret = config->value(li.key, li.defaultValue).toString();
@@ -574,24 +553,28 @@ QString QLibraryInfo::path(LibraryPath p)
ret = v.toString();
}
- int startIndex = 0;
- forever {
- startIndex = ret.indexOf(QLatin1Char('$'), startIndex);
+ qsizetype startIndex = 0;
+ /* We support placeholders of the form $(<ENV_VAR>) in qt.conf.
+ The loop below tries to find all such placeholders, and replaces
+ them with the actual value of the ENV_VAR environment variable
+ */
+ while (true) {
+ startIndex = ret.indexOf(u'$', startIndex);
if (startIndex < 0)
break;
- if (ret.length() < startIndex + 3)
+ if (ret.size() < startIndex + 3)
break;
- if (ret.at(startIndex + 1) != QLatin1Char('(')) {
+ if (ret.at(startIndex + 1) != u'(') {
startIndex++;
continue;
}
- int endIndex = ret.indexOf(QLatin1Char(')'), startIndex + 2);
+ qsizetype endIndex = ret.indexOf(u')', startIndex + 2);
if (endIndex < 0)
break;
auto envVarName = QStringView{ret}.mid(startIndex + 2, endIndex - startIndex - 2);
QString value = QString::fromLocal8Bit(qgetenv(envVarName.toLocal8Bit().constData()));
ret.replace(startIndex, endIndex - startIndex + 1, value);
- startIndex += value.length();
+ startIndex += value.size();
}
config->endGroup();
@@ -602,12 +585,12 @@ QString QLibraryInfo::path(LibraryPath p)
#endif // settings
if (!fromConf) {
- if (loc == PrefixPath) {
- ret = getPrefix();
+ if (loc == QLibraryInfo::PrefixPath) {
+ ret = getPrefix(usageMode);
} else if (int(loc) <= qt_configure_strs.count()) {
ret = QString::fromLocal8Bit(qt_configure_strs.viewAt(loc - 1));
#ifndef Q_OS_WIN // On Windows we use the registry
- } else if (loc == SettingsPath) {
+ } else if (loc == QLibraryInfo::SettingsPath) {
// Use of volatile is a hack to discourage compilers from calling
// strlen(), in the inlined fromLocal8Bit(const char *)'s body, at
// compile-time, as Qt installers binary-patch the path, replacing
@@ -620,13 +603,13 @@ QString QLibraryInfo::path(LibraryPath p)
if (!ret.isEmpty() && QDir::isRelativePath(ret)) {
QString baseDir;
- if (loc == PrefixPath) {
+ if (loc == QLibraryInfo::PrefixPath) {
baseDir = prefixFromAppDirHelper();
} else {
// we make any other path absolute to the prefix directory
- baseDir = path(PrefixPath);
+ baseDir = path(QLibraryInfo::PrefixPath, usageMode);
}
- ret = QDir::cleanPath(baseDir + QLatin1Char('/') + ret);
+ ret = QDir::cleanPath(baseDir + u'/' + ret);
}
return ret;
}
@@ -649,10 +632,9 @@ QStringList QLibraryInfo::platformPluginArguments(const QString &platformName)
#if QT_CONFIG(settings)
QScopedPointer<const QSettings> settings(findConfiguration());
if (!settings.isNull()) {
- const QString key = QLatin1String("Platforms")
- + QLatin1Char('/')
+ const QString key = "Platforms/"_L1
+ platformName
- + QLatin1String("Arguments");
+ + "Arguments"_L1;
return settings->value(key).toStringList();
}
#else
@@ -692,6 +674,42 @@ QStringList QLibraryInfo::platformPluginArguments(const QString &platformName)
\deprecated Use LibraryPath with QLibraryInfo::path() instead.
*/
+/*!
+ \macro QT_VERSION_STR
+ \relates <QtVersion>
+
+ This macro expands to a string that specifies Qt's version number (for
+ example, "6.1.2"). This is the version with which the application is
+ compiled. This may be a different version than the version the application
+ will find itself using at \e runtime.
+
+ \sa qVersion(), QT_VERSION
+*/
+
+/*!
+ \relates <QtVersion>
+
+ Returns the version number of Qt at runtime as a string (for example,
+ "6.1.2"). This is the version of the Qt library in use at \e runtime,
+ which need not be the version the application was \e compiled with.
+
+ \sa QT_VERSION_STR, QLibraryInfo::version()
+*/
+
+const char *qVersion() noexcept
+{
+ return QT_VERSION_STR;
+}
+
+#if QT_DEPRECATED_SINCE(6, 9)
+
+bool qSharedBuild() noexcept
+{
+ return QLibraryInfo::isSharedBuild();
+}
+
+#endif // QT_DEPRECATED_SINCE(6, 9)
+
QT_END_NAMESPACE
#if defined(Q_CC_GNU) && defined(ELF_INTERPRETER)
@@ -741,13 +759,15 @@ extern const char qt_core_interpreter[] __attribute__((section(".interp")))
extern "C" void qt_core_boilerplate() __attribute__((force_align_arg_pointer));
void qt_core_boilerplate()
{
- printf("This is the QtCore library version " QT_BUILD_STR "\n"
- "Copyright (C) 2016 The Qt Company Ltd.\n"
- "Contact: http://www.qt.io/licensing/\n"
+ printf("This is the QtCore library version %s\n"
+ "%s\n"
+ "Contact: https://www.qt.io/licensing/\n"
"\n"
"Installation prefix: %s\n"
"Library path: %s\n"
"Plugin path: %s\n",
+ QT_PREPEND_NAMESPACE(qt_build_string)(),
+ QT_COPYRIGHT,
QT_CONFIGURE_PREFIX_PATH,
qt_configure_strs[QT_PREPEND_NAMESPACE(QLibraryInfo)::LibrariesPath - 1],
qt_configure_strs[QT_PREPEND_NAMESPACE(QLibraryInfo)::PluginsPath - 1]);
diff --git a/src/corelib/global/qlibraryinfo.h b/src/corelib/global/qlibraryinfo.h
index a7d44768c8..d4e8f8b050 100644
--- a/src/corelib/global/qlibraryinfo.h
+++ b/src/corelib/global/qlibraryinfo.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QLIBRARYINFO_H
#define QLIBRARYINFO_H
@@ -51,7 +15,8 @@ class Q_CORE_EXPORT QLibraryInfo
public:
static const char *build() noexcept;
- static bool isDebugBuild();
+ [[nodiscard]] static bool isDebugBuild() noexcept Q_DECL_CONST_FUNCTION;
+ [[nodiscard]] static bool isSharedBuild() noexcept Q_DECL_CONST_FUNCTION;
#ifndef QT_BOOTSTRAPPED
static QVersionNumber version() noexcept Q_DECL_CONST_FUNCTION;
@@ -89,6 +54,13 @@ private:
QLibraryInfo();
};
+#if QT_DEPRECATED_SINCE(6, 9)
+
+QT_DEPRECATED_VERSION_X_6_9("Use QLibraryInfo::isSharedBuild() instead.")
+Q_CORE_EXPORT Q_DECL_CONST_FUNCTION bool qSharedBuild() noexcept;
+
+#endif
+
QT_END_NAMESPACE
#endif // QLIBRARYINFO_H
diff --git a/src/corelib/global/qlibraryinfo_p.h b/src/corelib/global/qlibraryinfo_p.h
index caed0feb84..4b471b932e 100644
--- a/src/corelib/global/qlibraryinfo_p.h
+++ b/src/corelib/global/qlibraryinfo_p.h
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// Copyright (C) 2016 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QLIBRARYINFO_P_H
#define QLIBRARYINFO_P_H
@@ -53,6 +17,7 @@
//
#include "QtCore/qlibraryinfo.h"
+#include "QtCore/private/qglobal_p.h"
#if QT_CONFIG(settings)
# include "QtCore/qsettings.h"
@@ -67,7 +32,7 @@ public:
#if QT_CONFIG(settings)
static QSettings *configuration();
static void reload();
- static QString qtconfManualPath;
+ static void setQtconfManualPath(const QString *qtconfManualPath);
#endif
struct LocationInfo
@@ -78,6 +43,13 @@ public:
};
static LocationInfo locationInfo(QLibraryInfo::LibraryPath loc);
+
+ enum UsageMode {
+ RegularUsage,
+ UsedFromQtBinDir
+ };
+
+ static QString path(QLibraryInfo::LibraryPath p, UsageMode usageMode = RegularUsage);
};
QT_END_NAMESPACE
diff --git a/src/corelib/global/qlogging.cpp b/src/corelib/global/qlogging.cpp
index f2d4a50a2c..dec16e4a77 100644
--- a/src/corelib/global/qlogging.cpp
+++ b/src/corelib/global/qlogging.cpp
@@ -1,43 +1,7 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Copyright (C) 2016 Olivier Goffart <ogoffart@woboq.com>
-** Copyright (C) 2018 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// Copyright (C) 2016 Olivier Goffart <ogoffart@woboq.com>
+// Copyright (C) 2022 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qglobal_p.h"
#include "qlogging.h"
@@ -59,7 +23,6 @@
#include "qthread.h"
#include "private/qloggingregistry_p.h"
#include "private/qcoreapplication_p.h"
-#include "private/qsimd_p.h"
#include <qtcore_tracepoints_p.h>
#endif
#ifdef Q_OS_WIN
@@ -106,17 +69,19 @@
extern char *__progname;
#endif
-#ifndef QT_BOOTSTRAPPED
-#if QT_CONFIG(regularexpression)
-# ifdef __UCLIBC__
-# if __UCLIBC_HAS_BACKTRACE__
-# define QLOGGING_HAVE_BACKTRACE
-# endif
-# elif (defined(__GLIBC__) && defined(__GLIBCXX__)) || (__has_include(<cxxabi.h>) && __has_include(<execinfo.h>))
-# define QLOGGING_HAVE_BACKTRACE
-# endif
+#ifdef QLOGGING_HAVE_BACKTRACE
+# include <qregularexpression.h>
#endif
+#ifdef QLOGGING_USE_EXECINFO_BACKTRACE
+# if QT_CONFIG(dladdr)
+# include <dlfcn.h>
+# endif
+# include BACKTRACE_HEADER
+# include <cxxabi.h>
+#endif // QLOGGING_USE_EXECINFO_BACKTRACE
+
+#ifndef QT_BOOTSTRAPPED
#if defined(Q_OS_LINUX) && (defined(__GLIBC__) || __has_include(<sys/syscall.h>))
# include <sys/syscall.h>
@@ -152,12 +117,6 @@ static QT_PREPEND_NAMESPACE(qint64) qt_gettid()
return qintptr(QThread::currentThreadId());
}
#endif
-
-#ifdef QLOGGING_HAVE_BACKTRACE
-# include <qregularexpression.h>
-# include <cxxabi.h>
-# include <execinfo.h>
-#endif
#endif // !QT_BOOTSTRAPPED
#include <cstdlib>
@@ -169,12 +128,51 @@ static QT_PREPEND_NAMESPACE(qint64) qt_gettid()
QT_BEGIN_NAMESPACE
-#if !defined(Q_CC_MSVC)
+using namespace Qt::StringLiterals;
+
+#ifndef QT_BOOTSTRAPPED
+Q_TRACE_POINT(qtcore, qt_message_print, int type, const char *category, const char *function, const char *file, int line, const QString &message);
+#endif
+
+/*!
+ \headerfile <QtLogging>
+ \inmodule QtCore
+ \title Qt Logging Types
+
+ \brief The <QtLogging> header file defines Qt logging types, functions
+ and macros.
+
+ The <QtLogging> header file contains several types, functions and
+ macros for logging.
+
+ The QtMsgType enum identifies the various messages that can be generated
+ and sent to a Qt message handler; QtMessageHandler is a type definition for
+ a pointer to a function with the signature
+ \c {void myMessageHandler(QtMsgType, const QMessageLogContext &, const char *)}.
+ qInstallMessageHandler() function can be used to install the given
+ QtMessageHandler. QMessageLogContext class contains the line, file, and
+ function the message was logged at. This information is created by the
+ QMessageLogger class.
+
+ <QtLogging> also contains functions that generate messages from the
+ given string argument: qDebug(), qInfo(), qWarning(), qCritical(),
+ and qFatal(). These functions call the message handler
+ with the given message.
+
+ Example:
+
+ \snippet code/src_corelib_global_qglobal.cpp 4
+*/
+
+template <typename String>
+#if !defined(Q_CC_MSVC_ONLY)
Q_NORETURN
#endif
-static void qt_message_fatal(QtMsgType, const QMessageLogContext &context, const QString &message);
+static void qt_message_fatal(QtMsgType, const QMessageLogContext &context, String &&message);
static void qt_message_print(QtMsgType, const QMessageLogContext &context, const QString &message);
-static void qt_message_print(const QString &message);
+static void preformattedMessageHandler(QtMsgType type, const QMessageLogContext &context,
+ const QString &formattedMessage);
+static QString formatLogMessage(QtMsgType type, const QMessageLogContext &context, const QString &str);
static int checked_var_value(const char *varname)
{
@@ -190,6 +188,17 @@ static int checked_var_value(const char *varname)
return ok ? value : 1;
}
+static bool is_fatal_count_down(QAtomicInt &n)
+{
+ // it's fatal if the current value is exactly 1,
+ // otherwise decrement if it's non-zero
+
+ int v = n.loadRelaxed();
+ while (v != 0 && !n.testAndSetRelaxed(v, v - 1, v))
+ qYieldCpu();
+ return v == 1; // we exited the loop, so either v == 0 or CAS succeeded to set n from v to v-1
+}
+
static bool isFatal(QtMsgType msgType)
{
if (msgType == QtFatalMsg)
@@ -197,28 +206,17 @@ static bool isFatal(QtMsgType msgType)
if (msgType == QtCriticalMsg) {
static QAtomicInt fatalCriticals = checked_var_value("QT_FATAL_CRITICALS");
-
- // it's fatal if the current value is exactly 1,
- // otherwise decrement if it's non-zero
- return fatalCriticals.loadRelaxed() && fatalCriticals.fetchAndAddRelaxed(-1) == 1;
+ return is_fatal_count_down(fatalCriticals);
}
if (msgType == QtWarningMsg || msgType == QtCriticalMsg) {
static QAtomicInt fatalWarnings = checked_var_value("QT_FATAL_WARNINGS");
-
- // it's fatal if the current value is exactly 1,
- // otherwise decrement if it's non-zero
- return fatalWarnings.loadRelaxed() && fatalWarnings.fetchAndAddRelaxed(-1) == 1;
+ return is_fatal_count_down(fatalWarnings);
}
return false;
}
-static bool isDefaultCategory(const char *category)
-{
- return !category || strcmp(category, "default") == 0;
-}
-
/*!
Returns true if writing to \c stderr is supported.
@@ -230,6 +228,8 @@ static bool systemHasStderr()
return true;
}
+#ifndef Q_OS_WASM
+
/*!
Returns true if writing to \c stderr will end up in a console/terminal visible to the user.
@@ -314,6 +314,8 @@ bool shouldLogToStderr()
using namespace QtPrivate;
+#endif // ifndef Q_OS_WASM
+
/*!
\class QMessageLogContext
\inmodule QtCore
@@ -348,7 +350,7 @@ using namespace QtPrivate;
\sa QMessageLogContext, qDebug(), qInfo(), qWarning(), qCritical(), qFatal()
*/
-#if defined(Q_CC_MSVC) && defined(QT_DEBUG) && defined(_DEBUG) && defined(_CRT_ERROR)
+#if defined(Q_CC_MSVC_ONLY) && defined(QT_DEBUG) && defined(_DEBUG) && defined(_CRT_ERROR)
static inline void convert_to_wchar_t_elided(wchar_t *d, size_t space, const char *s) noexcept
{
size_t len = qstrlen(s);
@@ -369,14 +371,15 @@ static inline void convert_to_wchar_t_elided(wchar_t *d, size_t space, const cha
\internal
*/
Q_NEVER_INLINE
-static QString qt_message(QtMsgType msgType, const QMessageLogContext &context, const char *msg, va_list ap)
+static void qt_message(QtMsgType msgType, const QMessageLogContext &context, const char *msg, va_list ap)
{
QString buf = QString::vasprintf(msg, ap);
qt_message_print(msgType, context, buf);
- return buf;
+
+ if (isFatal(msgType))
+ qt_message_fatal(msgType, context, buf);
}
-#undef qDebug
/*!
Logs a debug message specified with format \a msg. Additional
parameters, specified by \a msg, may be used.
@@ -385,17 +388,13 @@ static QString qt_message(QtMsgType msgType, const QMessageLogContext &context,
*/
void QMessageLogger::debug(const char *msg, ...) const
{
+ QInternalMessageLogContext ctxt(context);
va_list ap;
va_start(ap, msg); // use variable arg list
- const QString message = qt_message(QtDebugMsg, context, msg, ap);
+ qt_message(QtDebugMsg, ctxt, msg, ap);
va_end(ap);
-
- if (isFatal(QtDebugMsg))
- qt_message_fatal(QtDebugMsg, context, message);
}
-
-#undef qInfo
/*!
Logs an informational message specified with format \a msg. Additional
parameters, specified by \a msg, may be used.
@@ -405,13 +404,11 @@ void QMessageLogger::debug(const char *msg, ...) const
*/
void QMessageLogger::info(const char *msg, ...) const
{
+ QInternalMessageLogContext ctxt(context);
va_list ap;
va_start(ap, msg); // use variable arg list
- const QString message = qt_message(QtInfoMsg, context, msg, ap);
+ qt_message(QtInfoMsg, ctxt, msg, ap);
va_end(ap);
-
- if (isFatal(QtInfoMsg))
- qt_message_fatal(QtInfoMsg, context, message);
}
/*!
@@ -440,17 +437,12 @@ void QMessageLogger::debug(const QLoggingCategory &cat, const char *msg, ...) co
if (!cat.isDebugEnabled())
return;
- QMessageLogContext ctxt;
- ctxt.copyContextFrom(context);
- ctxt.category = cat.categoryName();
+ QInternalMessageLogContext ctxt(context, cat());
va_list ap;
va_start(ap, msg); // use variable arg list
- const QString message = qt_message(QtDebugMsg, ctxt, msg, ap);
+ qt_message(QtDebugMsg, ctxt, msg, ap);
va_end(ap);
-
- if (isFatal(QtDebugMsg))
- qt_message_fatal(QtDebugMsg, ctxt, message);
}
/*!
@@ -467,17 +459,12 @@ void QMessageLogger::debug(QMessageLogger::CategoryFunction catFunc,
if (!cat.isDebugEnabled())
return;
- QMessageLogContext ctxt;
- ctxt.copyContextFrom(context);
- ctxt.category = cat.categoryName();
+ QInternalMessageLogContext ctxt(context, cat());
va_list ap;
va_start(ap, msg); // use variable arg list
- const QString message = qt_message(QtDebugMsg, ctxt, msg, ap);
+ qt_message(QtDebugMsg, ctxt, msg, ap);
va_end(ap);
-
- if (isFatal(QtDebugMsg))
- qt_message_fatal(QtDebugMsg, ctxt, message);
}
#ifndef QT_NO_DEBUG_STREAM
@@ -551,17 +538,12 @@ void QMessageLogger::info(const QLoggingCategory &cat, const char *msg, ...) con
if (!cat.isInfoEnabled())
return;
- QMessageLogContext ctxt;
- ctxt.copyContextFrom(context);
- ctxt.category = cat.categoryName();
+ QInternalMessageLogContext ctxt(context, cat());
va_list ap;
va_start(ap, msg); // use variable arg list
- const QString message = qt_message(QtInfoMsg, ctxt, msg, ap);
+ qt_message(QtInfoMsg, ctxt, msg, ap);
va_end(ap);
-
- if (isFatal(QtInfoMsg))
- qt_message_fatal(QtInfoMsg, ctxt, message);
}
/*!
@@ -578,17 +560,12 @@ void QMessageLogger::info(QMessageLogger::CategoryFunction catFunc,
if (!cat.isInfoEnabled())
return;
- QMessageLogContext ctxt;
- ctxt.copyContextFrom(context);
- ctxt.category = cat.categoryName();
+ QInternalMessageLogContext ctxt(context, cat());
va_list ap;
va_start(ap, msg); // use variable arg list
- const QString message = qt_message(QtInfoMsg, ctxt, msg, ap);
+ qt_message(QtInfoMsg, ctxt, msg, ap);
va_end(ap);
-
- if (isFatal(QtInfoMsg))
- qt_message_fatal(QtInfoMsg, ctxt, message);
}
#ifndef QT_NO_DEBUG_STREAM
@@ -639,7 +616,6 @@ QDebug QMessageLogger::info(QMessageLogger::CategoryFunction catFunc) const
#endif
-#undef qWarning
/*!
Logs a warning message specified with format \a msg. Additional
parameters, specified by \a msg, may be used.
@@ -648,13 +624,11 @@ QDebug QMessageLogger::info(QMessageLogger::CategoryFunction catFunc) const
*/
void QMessageLogger::warning(const char *msg, ...) const
{
+ QInternalMessageLogContext ctxt(context);
va_list ap;
va_start(ap, msg); // use variable arg list
- const QString message = qt_message(QtWarningMsg, context, msg, ap);
+ qt_message(QtWarningMsg, ctxt, msg, ap);
va_end(ap);
-
- if (isFatal(QtWarningMsg))
- qt_message_fatal(QtWarningMsg, context, message);
}
/*!
@@ -669,17 +643,12 @@ void QMessageLogger::warning(const QLoggingCategory &cat, const char *msg, ...)
if (!cat.isWarningEnabled())
return;
- QMessageLogContext ctxt;
- ctxt.copyContextFrom(context);
- ctxt.category = cat.categoryName();
+ QInternalMessageLogContext ctxt(context, cat());
va_list ap;
va_start(ap, msg); // use variable arg list
- const QString message = qt_message(QtWarningMsg, ctxt, msg, ap);
+ qt_message(QtWarningMsg, ctxt, msg, ap);
va_end(ap);
-
- if (isFatal(QtWarningMsg))
- qt_message_fatal(QtWarningMsg, ctxt, message);
}
/*!
@@ -696,17 +665,12 @@ void QMessageLogger::warning(QMessageLogger::CategoryFunction catFunc,
if (!cat.isWarningEnabled())
return;
- QMessageLogContext ctxt;
- ctxt.copyContextFrom(context);
- ctxt.category = cat.categoryName();
+ QInternalMessageLogContext ctxt(context, cat());
va_list ap;
va_start(ap, msg); // use variable arg list
- const QString message = qt_message(QtWarningMsg, ctxt, msg, ap);
+ qt_message(QtWarningMsg, ctxt, msg, ap);
va_end(ap);
-
- if (isFatal(QtWarningMsg))
- qt_message_fatal(QtWarningMsg, ctxt, message);
}
#ifndef QT_NO_DEBUG_STREAM
@@ -754,8 +718,6 @@ QDebug QMessageLogger::warning(QMessageLogger::CategoryFunction catFunc) const
#endif
-#undef qCritical
-
/*!
Logs a critical message specified with format \a msg. Additional
parameters, specified by \a msg, may be used.
@@ -764,13 +726,11 @@ QDebug QMessageLogger::warning(QMessageLogger::CategoryFunction catFunc) const
*/
void QMessageLogger::critical(const char *msg, ...) const
{
+ QInternalMessageLogContext ctxt(context);
va_list ap;
va_start(ap, msg); // use variable arg list
- const QString message = qt_message(QtCriticalMsg, context, msg, ap);
+ qt_message(QtCriticalMsg, ctxt, msg, ap);
va_end(ap);
-
- if (isFatal(QtCriticalMsg))
- qt_message_fatal(QtCriticalMsg, context, message);
}
/*!
@@ -785,17 +745,12 @@ void QMessageLogger::critical(const QLoggingCategory &cat, const char *msg, ...)
if (!cat.isCriticalEnabled())
return;
- QMessageLogContext ctxt;
- ctxt.copyContextFrom(context);
- ctxt.category = cat.categoryName();
+ QInternalMessageLogContext ctxt(context, cat());
va_list ap;
va_start(ap, msg); // use variable arg list
- const QString message = qt_message(QtCriticalMsg, ctxt, msg, ap);
+ qt_message(QtCriticalMsg, ctxt, msg, ap);
va_end(ap);
-
- if (isFatal(QtCriticalMsg))
- qt_message_fatal(QtCriticalMsg, ctxt, message);
}
/*!
@@ -812,17 +767,12 @@ void QMessageLogger::critical(QMessageLogger::CategoryFunction catFunc,
if (!cat.isCriticalEnabled())
return;
- QMessageLogContext ctxt;
- ctxt.copyContextFrom(context);
- ctxt.category = cat.categoryName();
+ QInternalMessageLogContext ctxt(context, cat());
va_list ap;
va_start(ap, msg); // use variable arg list
- const QString message = qt_message(QtCriticalMsg, ctxt, msg, ap);
+ qt_message(QtCriticalMsg, ctxt, msg, ap);
va_end(ap);
-
- if (isFatal(QtCriticalMsg))
- qt_message_fatal(QtCriticalMsg, ctxt, message);
}
#ifndef QT_NO_DEBUG_STREAM
@@ -871,7 +821,51 @@ QDebug QMessageLogger::critical(QMessageLogger::CategoryFunction catFunc) const
#endif
-#undef qFatal
+/*!
+ Logs a fatal message specified with format \a msg for the context \a cat.
+ Additional parameters, specified by \a msg, may be used.
+
+ \since 6.5
+ \sa qCFatal()
+*/
+void QMessageLogger::fatal(const QLoggingCategory &cat, const char *msg, ...) const noexcept
+{
+ QInternalMessageLogContext ctxt(context, cat());
+
+ va_list ap;
+ va_start(ap, msg); // use variable arg list
+ QT_TERMINATE_ON_EXCEPTION(qt_message(QtFatalMsg, ctxt, msg, ap));
+ va_end(ap);
+
+#ifndef Q_CC_MSVC_ONLY
+ Q_UNREACHABLE();
+#endif
+}
+
+/*!
+ Logs a fatal message specified with format \a msg for the context returned
+ by \a catFunc. Additional parameters, specified by \a msg, may be used.
+
+ \since 6.5
+ \sa qCFatal()
+*/
+void QMessageLogger::fatal(QMessageLogger::CategoryFunction catFunc,
+ const char *msg, ...) const noexcept
+{
+ const QLoggingCategory &cat = (*catFunc)();
+
+ QInternalMessageLogContext ctxt(context, cat());
+
+ va_list ap;
+ va_start(ap, msg); // use variable arg list
+ QT_TERMINATE_ON_EXCEPTION(qt_message(QtFatalMsg, ctxt, msg, ap));
+ va_end(ap);
+
+#ifndef Q_CC_MSVC_ONLY
+ Q_UNREACHABLE();
+#endif
+}
+
/*!
Logs a fatal message specified with format \a msg. Additional
parameters, specified by \a msg, may be used.
@@ -880,14 +874,66 @@ QDebug QMessageLogger::critical(QMessageLogger::CategoryFunction catFunc) const
*/
void QMessageLogger::fatal(const char *msg, ...) const noexcept
{
- QString message;
-
+ QInternalMessageLogContext ctxt(context);
va_list ap;
va_start(ap, msg); // use variable arg list
- QT_TERMINATE_ON_EXCEPTION(message = qt_message(QtFatalMsg, context, msg, ap));
+ QT_TERMINATE_ON_EXCEPTION(qt_message(QtFatalMsg, ctxt, msg, ap));
va_end(ap);
- qt_message_fatal(QtFatalMsg, context, message);
+#ifndef Q_CC_MSVC_ONLY
+ Q_UNREACHABLE();
+#endif
+}
+
+#ifndef QT_NO_DEBUG_STREAM
+/*!
+ Logs a fatal message using a QDebug stream.
+
+ \since 6.5
+
+ \sa qFatal(), QDebug
+*/
+QDebug QMessageLogger::fatal() const
+{
+ QDebug dbg = QDebug(QtFatalMsg);
+ QMessageLogContext &ctxt = dbg.stream->context;
+ ctxt.copyContextFrom(context);
+ return dbg;
+}
+
+/*!
+ Logs a fatal message into category \a cat using a QDebug stream.
+
+ \since 6.5
+ \sa qCFatal(), QDebug
+*/
+QDebug QMessageLogger::fatal(const QLoggingCategory &cat) const
+{
+ QDebug dbg = QDebug(QtFatalMsg);
+
+ QMessageLogContext &ctxt = dbg.stream->context;
+ ctxt.copyContextFrom(context);
+ ctxt.category = cat.categoryName();
+
+ return dbg;
+}
+
+/*!
+ Logs a fatal message into category returned by \a catFunc using a QDebug stream.
+
+ \since 6.5
+ \sa qCFatal(), QDebug
+*/
+QDebug QMessageLogger::fatal(QMessageLogger::CategoryFunction catFunc) const
+{
+ return fatal((*catFunc)());
+}
+#endif // QT_NO_DEBUG_STREAM
+
+#if !defined(QT_BOOTSTRAPPED)
+static bool isDefaultCategory(const char *category)
+{
+ return !category || strcmp(category, "default") == 0;
}
/*!
@@ -902,15 +948,20 @@ Q_AUTOTEST_EXPORT QByteArray qCleanupFuncinfo(QByteArray info)
if (info.isEmpty())
return info;
- int pos;
+ qsizetype pos;
// Skip trailing [with XXX] for templates (gcc), but make
// sure to not affect Objective-C message names.
pos = info.size() - 1;
if (info.endsWith(']') && !(info.startsWith('+') || info.startsWith('-'))) {
while (--pos) {
- if (info.at(pos) == '[')
- info.truncate(pos);
+ if (info.at(pos) == '[') {
+ info.truncate(pos);
+ break;
+ }
+ }
+ if (info.endsWith(' ')) {
+ info.chop(1);
}
}
@@ -924,14 +975,21 @@ Q_AUTOTEST_EXPORT QByteArray qCleanupFuncinfo(QByteArray info)
// canonize operator names
info.replace("operator ", "operator");
+ pos = -1;
// remove argument list
forever {
int parencount = 0;
- pos = info.lastIndexOf(')');
+ pos = info.lastIndexOf(')', pos);
if (pos == -1) {
// Don't know how to parse this function name
return info;
}
+ if (info.indexOf('>', pos) != -1
+ || info.indexOf(':', pos) != -1) {
+ // that wasn't the function argument list.
+ --pos;
+ continue;
+ }
// find the beginning of the argument list
--pos;
@@ -949,7 +1007,7 @@ Q_AUTOTEST_EXPORT QByteArray qCleanupFuncinfo(QByteArray info)
info.truncate(++pos);
if (info.at(pos - 1) == ')') {
- if (info.indexOf(operator_call) == pos - (int)strlen(operator_call))
+ if (info.indexOf(operator_call) == pos - qsizetype(strlen(operator_call)))
break;
// this function returns a pointer to a function
@@ -972,19 +1030,19 @@ Q_AUTOTEST_EXPORT QByteArray qCleanupFuncinfo(QByteArray info)
if (pos > -1) {
switch (info.at(pos)) {
case ')':
- if (info.indexOf(operator_call) == pos - (int)strlen(operator_call) + 1)
+ if (info.indexOf(operator_call) == pos - qsizetype(strlen(operator_call)) + 1)
pos -= 2;
break;
case '<':
- if (info.indexOf(operator_lessThan) == pos - (int)strlen(operator_lessThan) + 1)
+ if (info.indexOf(operator_lessThan) == pos - qsizetype(strlen(operator_lessThan)) + 1)
--pos;
break;
case '>':
- if (info.indexOf(operator_greaterThan) == pos - (int)strlen(operator_greaterThan) + 1)
+ if (info.indexOf(operator_greaterThan) == pos - qsizetype(strlen(operator_greaterThan)) + 1)
--pos;
break;
case '=': {
- int operatorLength = (int)strlen(operator_lessThanEqual);
+ auto operatorLength = qsizetype(strlen(operator_lessThanEqual));
if (info.indexOf(operator_lessThanEqual) == pos - operatorLength + 1)
pos -= 2;
else if (info.indexOf(operator_greaterThanEqual) == pos - operatorLength + 1)
@@ -1028,7 +1086,7 @@ Q_AUTOTEST_EXPORT QByteArray qCleanupFuncinfo(QByteArray info)
break;
// find the matching close
- int end = pos;
+ qsizetype end = pos;
templatecount = 1;
--pos;
while (pos && templatecount) {
@@ -1091,6 +1149,7 @@ struct QMessagePattern
int backtraceDepth;
};
QList<BacktraceParams> backtraceArgs; // backtrace arguments in sequence of %{backtrace
+ int maxBacktraceDepth = 0;
#endif
bool fromEnvironment;
@@ -1100,7 +1159,7 @@ struct QMessagePattern
Q_DECLARE_TYPEINFO(QMessagePattern::BacktraceParams, Q_RELOCATABLE_TYPE);
#endif
-QBasicMutex QMessagePattern::mutex;
+Q_CONSTINIT QBasicMutex QMessagePattern::mutex;
QMessagePattern::QMessagePattern()
{
@@ -1109,7 +1168,7 @@ QMessagePattern::QMessagePattern()
#endif
const QString envPattern = QString::fromLocal8Bit(qgetenv("QT_MESSAGE_PATTERN"));
if (envPattern.isEmpty()) {
- setPattern(QLatin1String(defaultPattern));
+ setPattern(QLatin1StringView(defaultPattern));
fromEnvironment = false;
} else {
setPattern(envPattern);
@@ -1124,6 +1183,7 @@ void QMessagePattern::setPattern(const QString &pattern)
timeArgs.clear();
#ifdef QLOGGING_HAVE_BACKTRACE
backtraceArgs.clear();
+ maxBacktraceDepth = 0;
#endif
// scanner
@@ -1132,10 +1192,9 @@ void QMessagePattern::setPattern(const QString &pattern)
bool inPlaceholder = false;
for (int i = 0; i < pattern.size(); ++i) {
const QChar c = pattern.at(i);
- if ((c == QLatin1Char('%'))
- && !inPlaceholder) {
+ if (c == u'%' && !inPlaceholder) {
if ((i + 1 < pattern.size())
- && pattern.at(i + 1) == QLatin1Char('{')) {
+ && pattern.at(i + 1) == u'{') {
// beginning of placeholder
if (!lexeme.isEmpty()) {
lexemes.append(lexeme);
@@ -1147,7 +1206,7 @@ void QMessagePattern::setPattern(const QString &pattern)
lexeme.append(c);
- if ((c == QLatin1Char('}') && inPlaceholder)) {
+ if (c == u'}' && inPlaceholder) {
// end of placeholder
lexemes.append(lexeme);
lexeme.clear();
@@ -1168,37 +1227,36 @@ void QMessagePattern::setPattern(const QString &pattern)
for (int i = 0; i < lexemes.size(); ++i) {
const QString lexeme = lexemes.at(i);
- if (lexeme.startsWith(QLatin1String("%{"))
- && lexeme.endsWith(QLatin1Char('}'))) {
+ if (lexeme.startsWith("%{"_L1) && lexeme.endsWith(u'}')) {
// placeholder
- if (lexeme == QLatin1String(typeTokenC)) {
+ if (lexeme == QLatin1StringView(typeTokenC)) {
tokens[i] = typeTokenC;
- } else if (lexeme == QLatin1String(categoryTokenC))
+ } else if (lexeme == QLatin1StringView(categoryTokenC))
tokens[i] = categoryTokenC;
- else if (lexeme == QLatin1String(messageTokenC))
+ else if (lexeme == QLatin1StringView(messageTokenC))
tokens[i] = messageTokenC;
- else if (lexeme == QLatin1String(fileTokenC))
+ else if (lexeme == QLatin1StringView(fileTokenC))
tokens[i] = fileTokenC;
- else if (lexeme == QLatin1String(lineTokenC))
+ else if (lexeme == QLatin1StringView(lineTokenC))
tokens[i] = lineTokenC;
- else if (lexeme == QLatin1String(functionTokenC))
+ else if (lexeme == QLatin1StringView(functionTokenC))
tokens[i] = functionTokenC;
- else if (lexeme == QLatin1String(pidTokenC))
+ else if (lexeme == QLatin1StringView(pidTokenC))
tokens[i] = pidTokenC;
- else if (lexeme == QLatin1String(appnameTokenC))
+ else if (lexeme == QLatin1StringView(appnameTokenC))
tokens[i] = appnameTokenC;
- else if (lexeme == QLatin1String(threadidTokenC))
+ else if (lexeme == QLatin1StringView(threadidTokenC))
tokens[i] = threadidTokenC;
- else if (lexeme == QLatin1String(qthreadptrTokenC))
+ else if (lexeme == QLatin1StringView(qthreadptrTokenC))
tokens[i] = qthreadptrTokenC;
- else if (lexeme.startsWith(QLatin1String(timeTokenC))) {
+ else if (lexeme.startsWith(QLatin1StringView(timeTokenC))) {
tokens[i] = timeTokenC;
- int spaceIdx = lexeme.indexOf(QChar::fromLatin1(' '));
+ qsizetype spaceIdx = lexeme.indexOf(QChar::fromLatin1(' '));
if (spaceIdx > 0)
- timeArgs.append(lexeme.mid(spaceIdx + 1, lexeme.length() - spaceIdx - 2));
+ timeArgs.append(lexeme.mid(spaceIdx + 1, lexeme.size() - spaceIdx - 2));
else
timeArgs.append(QString());
- } else if (lexeme.startsWith(QLatin1String(backtraceTokenC))) {
+ } else if (lexeme.startsWith(QLatin1StringView(backtraceTokenC))) {
#ifdef QLOGGING_HAVE_BACKTRACE
tokens[i] = backtraceTokenC;
QString backtraceSeparator = QStringLiteral("|");
@@ -1209,7 +1267,7 @@ void QMessagePattern::setPattern(const QString &pattern)
if (m.hasMatch()) {
int depth = m.capturedView(1).toInt();
if (depth <= 0)
- error += QLatin1String("QT_MESSAGE_PATTERN: %{backtrace} depth must be a number greater than 0\n");
+ error += "QT_MESSAGE_PATTERN: %{backtrace} depth must be a number greater than 0\n"_L1;
else
backtraceDepth = depth;
}
@@ -1220,14 +1278,15 @@ void QMessagePattern::setPattern(const QString &pattern)
backtraceParams.backtraceDepth = backtraceDepth;
backtraceParams.backtraceSeparator = backtraceSeparator;
backtraceArgs.append(backtraceParams);
+ maxBacktraceDepth = qMax(maxBacktraceDepth, backtraceDepth);
#else
- error += QLatin1String("QT_MESSAGE_PATTERN: %{backtrace} is not supported by this Qt build\n");
+ error += "QT_MESSAGE_PATTERN: %{backtrace} is not supported by this Qt build\n"_L1;
tokens[i] = "";
#endif
}
#define IF_TOKEN(LEVEL) \
- else if (lexeme == QLatin1String(LEVEL)) { \
+ else if (lexeme == QLatin1StringView(LEVEL)) { \
if (inIf) \
nestedIfError = true; \
tokens[i] = LEVEL; \
@@ -1240,50 +1299,187 @@ void QMessagePattern::setPattern(const QString &pattern)
IF_TOKEN(ifCriticalTokenC)
IF_TOKEN(ifFatalTokenC)
#undef IF_TOKEN
- else if (lexeme == QLatin1String(endifTokenC)) {
+ else if (lexeme == QLatin1StringView(endifTokenC)) {
tokens[i] = endifTokenC;
if (!inIf && !nestedIfError)
- error += QLatin1String("QT_MESSAGE_PATTERN: %{endif} without an %{if-*}\n");
+ error += "QT_MESSAGE_PATTERN: %{endif} without an %{if-*}\n"_L1;
inIf = false;
} else {
tokens[i] = emptyTokenC;
- error += QStringLiteral("QT_MESSAGE_PATTERN: Unknown placeholder %1\n")
- .arg(lexeme);
+ error += "QT_MESSAGE_PATTERN: Unknown placeholder "_L1 + lexeme + '\n'_L1;
}
} else {
- char *literal = new char[lexeme.size() + 1];
- strncpy(literal, lexeme.toLatin1().constData(), lexeme.size());
- literal[lexeme.size()] = '\0';
- literalsVar.emplace_back(literal);
- tokens[i] = literal;
+ using UP = std::unique_ptr<char[]>;
+ tokens[i] = literalsVar.emplace_back(UP(qstrdup(lexeme.toLatin1().constData()))).get();
}
}
if (nestedIfError)
- error += QLatin1String("QT_MESSAGE_PATTERN: %{if-*} cannot be nested\n");
+ error += "QT_MESSAGE_PATTERN: %{if-*} cannot be nested\n"_L1;
else if (inIf)
- error += QLatin1String("QT_MESSAGE_PATTERN: missing %{endif}\n");
+ error += "QT_MESSAGE_PATTERN: missing %{endif}\n"_L1;
- if (!error.isEmpty())
- qt_message_print(error);
+ if (!error.isEmpty()) {
+ // remove the last '\n' because the sinks deal with that on their own
+ error.chop(1);
+
+ QMessageLogContext ctx(QT_MESSAGELOG_FILE, QT_MESSAGELOG_LINE,
+ "QMessagePattern::setPattern", nullptr);
+ preformattedMessageHandler(QtWarningMsg, ctx, error);
+ }
literals.reset(new std::unique_ptr<const char[]>[literalsVar.size() + 1]);
std::move(literalsVar.begin(), literalsVar.end(), &literals[0]);
}
-#if defined(QLOGGING_HAVE_BACKTRACE) && !defined(QT_BOOTSTRAPPED)
+#if defined(QLOGGING_HAVE_BACKTRACE)
// make sure the function has "Message" in the name so the function is removed
+/*
+ A typical backtrace in debug mode looks like:
+ #0 QInternalMessageLogContext::populateBacktrace (this=0x7fffffffd660, frameCount=5) at qlogging.cpp:1342
+ #1 QInternalMessageLogContext::QInternalMessageLogContext (logContext=..., this=<optimized out>) at qlogging_p.h:42
+ #2 QDebug::~QDebug (this=0x7fffffffdac8, __in_chrg=<optimized out>) at qdebug.cpp:160
+
+ In release mode, the QInternalMessageLogContext constructor will be usually
+ inlined. Empirical testing with GCC 13 and Clang 17 suggest they do obey the
+ Q_ALWAYS_INLINE in that constructor even in debug mode and do inline it.
+ Unfortunately, we can't know for sure if it has been.
+*/
+static constexpr int TypicalBacktraceFrameCount = 3;
+static constexpr const char *QtCoreLibraryName = "Qt" QT_STRINGIFY(QT_VERSION_MAJOR) "Core";
+
+#if defined(QLOGGING_USE_STD_BACKTRACE)
+Q_NEVER_INLINE void QInternalMessageLogContext::populateBacktrace(int frameCount)
+{
+ assert(frameCount >= 0);
+ backtrace = std::stacktrace::current(0, TypicalBacktraceFrameCount + frameCount);
+}
-#if ((defined(Q_CC_GNU) && defined(QT_COMPILER_SUPPORTS_SIMD_ALWAYS)) || __has_attribute(optimize)) \
- && !defined(Q_CC_INTEL) && !defined(Q_CC_CLANG)
-// force skipping the frame pointer, to save the backtrace() function some work
-__attribute__((optimize("omit-frame-pointer")))
+static QStringList
+backtraceFramesForLogMessage(int frameCount,
+ const QInternalMessageLogContext::BacktraceStorage &buffer)
+{
+ QStringList result;
+ result.reserve(buffer.size());
+
+ const auto shouldSkipFrame = [](QByteArrayView description)
+ {
+#if defined(_MSVC_STL_VERSION)
+ const auto libraryNameEnd = description.indexOf('!');
+ if (libraryNameEnd != -1) {
+ const auto libraryName = description.first(libraryNameEnd);
+ if (!libraryName.contains(QtCoreLibraryName))
+ return false;
+ }
#endif
-static QStringList backtraceFramesForLogMessage(int frameCount)
+ if (description.contains("populateBacktrace"))
+ return true;
+ if (description.contains("QInternalMessageLogContext"))
+ return true;
+ if (description.contains("~QDebug"))
+ return true;
+ return false;
+ };
+
+ for (const auto &entry : buffer) {
+ const std::string description = entry.description();
+ if (result.isEmpty() && shouldSkipFrame(description))
+ continue;
+ result.append(QString::fromStdString(description));
+ }
+
+ return result;
+}
+
+#elif defined(QLOGGING_USE_EXECINFO_BACKTRACE)
+
+Q_NEVER_INLINE void QInternalMessageLogContext::populateBacktrace(int frameCount)
+{
+ assert(frameCount >= 0);
+ BacktraceStorage &result = backtrace.emplace(TypicalBacktraceFrameCount + frameCount);
+ int n = ::backtrace(result.data(), result.size());
+ if (n <= 0)
+ result.clear();
+ else
+ result.resize(n);
+}
+
+static QStringList
+backtraceFramesForLogMessage(int frameCount,
+ const QInternalMessageLogContext::BacktraceStorage &buffer)
{
+ struct DecodedFrame {
+ QString library;
+ QString function;
+ };
+
QStringList result;
if (frameCount == 0)
return result;
+ auto shouldSkipFrame = [&result](const auto &library, const auto &function) {
+ if (!result.isEmpty() || !library.contains(QLatin1StringView(QtCoreLibraryName)))
+ return false;
+ if (function.isEmpty())
+ return true;
+ if (function.contains("6QDebug"_L1))
+ return true;
+ if (function.contains("14QMessageLogger"_L1))
+ return true;
+ if (function.contains("17qt_message_output"_L1))
+ return true;
+ if (function.contains("26QInternalMessageLogContext"_L1))
+ return true;
+ return false;
+ };
+
+ auto demangled = [](auto &function) -> QString {
+ if (!function.startsWith("_Z"_L1))
+ return function;
+
+ // we optimize for the case where __cxa_demangle succeeds
+ auto fn = [&]() {
+ if constexpr (sizeof(function.at(0)) == 1)
+ return function.data(); // -> const char *
+ else
+ return std::move(function).toUtf8(); // -> QByteArray
+ }();
+ QScopedPointer<char, QScopedPointerPodDeleter> demangled;
+ demangled.reset(abi::__cxa_demangle(fn, nullptr, nullptr, nullptr));
+
+ if (demangled)
+ return QString::fromUtf8(qCleanupFuncinfo(demangled.data()));
+ else
+ return QString::fromUtf8(fn); // restore
+ };
+
+# if QT_CONFIG(dladdr)
+ // use dladdr() instead of backtrace_symbols()
+ QString cachedLibrary;
+ const char *cachedFname = nullptr;
+ auto decodeFrame = [&](void *addr) -> DecodedFrame {
+ Dl_info info;
+ if (!dladdr(addr, &info))
+ return {};
+
+ // These are actually UTF-8, so we'll correct below
+ QLatin1StringView fn(info.dli_sname);
+ QLatin1StringView lib;
+ if (const char *lastSlash = strrchr(info.dli_fname, '/'))
+ lib = QLatin1StringView(lastSlash + 1);
+ else
+ lib = QLatin1StringView(info.dli_fname);
+
+ if (shouldSkipFrame(lib, fn))
+ return {};
+
+ QString function = demangled(fn);
+ if (lib.data() != cachedFname) {
+ cachedFname = lib.data();
+ cachedLibrary = QString::fromUtf8(cachedFname, lib.size());
+ }
+ return { cachedLibrary, function };
+ };
+# else
// The results of backtrace_symbols looks like this:
// /lib/libc.so.6(__libc_start_main+0xf3) [0x4a937413]
// The offset and function name are optional.
@@ -1291,63 +1487,68 @@ static QStringList backtraceFramesForLogMessage(int frameCount)
// This code is protected by QMessagePattern::mutex so it is thread safe on all compilers
static const QRegularExpression rx(QStringLiteral("^(?:[^(]*/)?([^(/]+)\\(([^+]*)(?:[\\+[a-f0-9x]*)?\\) \\[[a-f0-9x]*\\]$"));
- QVarLengthArray<void *, 32> buffer(8 + frameCount);
- int n = backtrace(buffer.data(), buffer.size());
- if (n > 0) {
- int numberPrinted = 0;
- for (int i = 0; i < n && numberPrinted < frameCount; ++i) {
- QScopedPointer<char*, QScopedPointerPodDeleter> strings(backtrace_symbols(buffer.data() + i, 1));
- QString trace = QString::fromLatin1(strings.data()[0]);
- QRegularExpressionMatch m = rx.match(trace);
- if (m.hasMatch()) {
- QString library = m.captured(1);
- QString function = m.captured(2);
-
- // skip the trace from QtCore that are because of the qDebug itself
- if (!numberPrinted && library.contains(QLatin1String("Qt6Core"))
- && (function.isEmpty() || function.contains(QLatin1String("Message"), Qt::CaseInsensitive)
- || function.contains(QLatin1String("QDebug")))) {
- continue;
- }
+ auto decodeFrame = [&](void *&addr) -> DecodedFrame {
+ QScopedPointer<char*, QScopedPointerPodDeleter> strings(backtrace_symbols(&addr, 1));
+ QString trace = QString::fromUtf8(strings.data()[0]);
+ QRegularExpressionMatch m = rx.match(trace);
+ if (!m.hasMatch())
+ return {};
- if (function.startsWith(QLatin1String("_Z"))) {
- QScopedPointer<char, QScopedPointerPodDeleter> demangled(
- abi::__cxa_demangle(function.toUtf8(), nullptr, nullptr, nullptr));
- if (demangled)
- function = QString::fromUtf8(qCleanupFuncinfo(demangled.data()));
- }
+ QString library = m.captured(1);
+ QString function = m.captured(2);
- if (function.isEmpty()) {
- result.append(QLatin1Char('?') + library + QLatin1Char('?'));
- } else {
- result.append(function);
- }
- } else {
- if (numberPrinted == 0) {
- // innermost, unknown frames are usually the logging framework itself
- continue;
- }
+ // skip the trace from QtCore that are because of the qDebug itself
+ if (shouldSkipFrame(library, function))
+ return {};
+
+ function = demangled(function);
+ return { library, function };
+ };
+# endif
+
+ for (void *const &addr : buffer) {
+ DecodedFrame frame = decodeFrame(addr);
+ if (!frame.library.isEmpty()) {
+ if (frame.function.isEmpty())
+ result.append(u'?' + frame.library + u'?');
+ else
+ result.append(frame.function);
+ } else {
+ // innermost, unknown frames are usually the logging framework itself
+ if (!result.isEmpty())
result.append(QStringLiteral("???"));
- }
- numberPrinted++;
}
+
+ if (result.size() == frameCount)
+ break;
}
return result;
}
+#else
+#error "Internal error: backtrace enabled, but no way to gather backtraces available"
+#endif // QLOGGING_USE_..._BACKTRACE
static QString formatBacktraceForLogMessage(const QMessagePattern::BacktraceParams backtraceParams,
- const char *function)
+ const QMessageLogContext &ctx)
{
+ // do we have a backtrace stored?
+ if (ctx.version <= QMessageLogContext::CurrentVersion)
+ return QString();
+
+ auto &fullctx = static_cast<const QInternalMessageLogContext &>(ctx);
+ if (!fullctx.backtrace.has_value())
+ return QString();
+
QString backtraceSeparator = backtraceParams.backtraceSeparator;
int backtraceDepth = backtraceParams.backtraceDepth;
- QStringList frames = backtraceFramesForLogMessage(backtraceDepth);
+ QStringList frames = backtraceFramesForLogMessage(backtraceDepth, *fullctx.backtrace);
if (frames.isEmpty())
return QString();
// if the first frame is unknown, replace it with the context function
- if (function && frames.at(0).startsWith(QLatin1Char('?')))
- frames[0] = QString::fromUtf8(qCleanupFuncinfo(function));
+ if (ctx.function && frames.at(0).startsWith(u'?'))
+ frames[0] = QString::fromUtf8(qCleanupFuncinfo(ctx.function));
return frames.join(backtraceSeparator);
}
@@ -1356,7 +1557,7 @@ static QString formatBacktraceForLogMessage(const QMessagePattern::BacktracePara
Q_GLOBAL_STATIC(QMessagePattern, qMessagePattern)
/*!
- \relates <QtGlobal>
+ \relates <QtLogging>
\since 5.4
Generates a formatted string out of the \a type, \a context, \a str arguments.
@@ -1371,6 +1572,14 @@ Q_GLOBAL_STATIC(QMessagePattern, qMessagePattern)
*/
QString qFormatLogMessage(QtMsgType type, const QMessageLogContext &context, const QString &str)
{
+ return formatLogMessage(type, context, str);
+}
+
+// Separate function so the default message handler can bypass the public,
+// exported function above. Static functions can't get added to the dynamic
+// symbol tables, so they never show up in backtrace_symbols() or equivalent.
+static QString formatLogMessage(QtMsgType type, const QMessageLogContext &context, const QString &str)
+{
QString message;
const auto locker = qt_scoped_lock(QMessagePattern::mutex);
@@ -1384,12 +1593,10 @@ QString qFormatLogMessage(QtMsgType type, const QMessageLogContext &context, con
bool skip = false;
-#ifndef QT_BOOTSTRAPPED
int timeArgsIdx = 0;
#ifdef QLOGGING_HAVE_BACKTRACE
int backtraceArgsIdx = 0;
#endif
-#endif
// we do not convert file, function, line literals to local encoding due to overhead
for (int i = 0; pattern->tokens[i]; ++i) {
@@ -1399,42 +1606,39 @@ QString qFormatLogMessage(QtMsgType type, const QMessageLogContext &context, con
} else if (skip) {
// we skip adding messages, but we have to iterate over
// timeArgsIdx and backtraceArgsIdx anyway
-#ifndef QT_BOOTSTRAPPED
if (token == timeTokenC)
timeArgsIdx++;
#ifdef QLOGGING_HAVE_BACKTRACE
else if (token == backtraceTokenC)
backtraceArgsIdx++;
#endif
-#endif
} else if (token == messageTokenC) {
message.append(str);
} else if (token == categoryTokenC) {
#ifndef Q_OS_ANDROID
// Don't add the category to the message on Android
- message.append(QLatin1String(context.category));
+ message.append(QLatin1StringView(context.category));
#endif
} else if (token == typeTokenC) {
switch (type) {
- case QtDebugMsg: message.append(QLatin1String("debug")); break;
- case QtInfoMsg: message.append(QLatin1String("info")); break;
- case QtWarningMsg: message.append(QLatin1String("warning")); break;
- case QtCriticalMsg:message.append(QLatin1String("critical")); break;
- case QtFatalMsg: message.append(QLatin1String("fatal")); break;
+ case QtDebugMsg: message.append("debug"_L1); break;
+ case QtInfoMsg: message.append("info"_L1); break;
+ case QtWarningMsg: message.append("warning"_L1); break;
+ case QtCriticalMsg:message.append("critical"_L1); break;
+ case QtFatalMsg: message.append("fatal"_L1); break;
}
} else if (token == fileTokenC) {
if (context.file)
- message.append(QLatin1String(context.file));
+ message.append(QLatin1StringView(context.file));
else
- message.append(QLatin1String("unknown"));
+ message.append("unknown"_L1);
} else if (token == lineTokenC) {
message.append(QString::number(context.line));
} else if (token == functionTokenC) {
if (context.function)
message.append(QString::fromLatin1(qCleanupFuncinfo(context.function)));
else
- message.append(QLatin1String("unknown"));
-#ifndef QT_BOOTSTRAPPED
+ message.append("unknown"_L1);
} else if (token == pidTokenC) {
message.append(QString::number(QCoreApplication::applicationPid()));
} else if (token == appnameTokenC) {
@@ -1443,24 +1647,24 @@ QString qFormatLogMessage(QtMsgType type, const QMessageLogContext &context, con
// print the TID as decimal
message.append(QString::number(qt_gettid()));
} else if (token == qthreadptrTokenC) {
- message.append(QLatin1String("0x"));
+ message.append("0x"_L1);
message.append(QString::number(qlonglong(QThread::currentThread()->currentThread()), 16));
#ifdef QLOGGING_HAVE_BACKTRACE
} else if (token == backtraceTokenC) {
QMessagePattern::BacktraceParams backtraceParams = pattern->backtraceArgs.at(backtraceArgsIdx);
backtraceArgsIdx++;
- message.append(formatBacktraceForLogMessage(backtraceParams, context.function));
+ message.append(formatBacktraceForLogMessage(backtraceParams, context));
#endif
} else if (token == timeTokenC) {
QString timeFormat = pattern->timeArgs.at(timeArgsIdx);
timeArgsIdx++;
- if (timeFormat == QLatin1String("process")) {
- quint64 ms = pattern->timer.elapsed();
- message.append(QString::asprintf("%6d.%03d", uint(ms / 1000), uint(ms % 1000)));
- } else if (timeFormat == QLatin1String("boot")) {
+ if (timeFormat == "process"_L1) {
+ quint64 ms = pattern->timer.elapsed();
+ message.append(QString::asprintf("%6d.%03d", uint(ms / 1000), uint(ms % 1000)));
+ } else if (timeFormat == "boot"_L1) {
// just print the milliseconds since the elapsed timer reference
// like the Linux kernel does
- uint ms = QDeadlineTimer::current().deadline();
+ qint64 ms = QDeadlineTimer::current().deadline();
message.append(QString::asprintf("%6d.%03d", uint(ms / 1000), uint(ms % 1000)));
#if QT_CONFIG(datestring)
} else if (timeFormat.isEmpty()) {
@@ -1469,7 +1673,6 @@ QString qFormatLogMessage(QtMsgType type, const QMessageLogContext &context, con
message.append(QDateTime::currentDateTime().toString(timeFormat));
#endif // QT_CONFIG(datestring)
}
-#endif // !QT_BOOTSTRAPPED
} else if (token == ifCategoryTokenC) {
if (isDefaultCategory(context.category))
skip = true;
@@ -1483,16 +1686,30 @@ QString qFormatLogMessage(QtMsgType type, const QMessageLogContext &context, con
HANDLE_IF_TOKEN(Fatal)
#undef HANDLE_IF_TOKEN
} else {
- message.append(QLatin1String(token));
+ message.append(QLatin1StringView(token));
}
}
return message;
}
+#else // QT_BOOTSTRAPPED
+static QString formatLogMessage(QtMsgType type, const QMessageLogContext &context, const QString &str)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(context);
+ return str;
+}
+#endif
+#ifndef QLOGGING_HAVE_BACKTRACE
+void QInternalMessageLogContext::populateBacktrace(int)
+{
+ Q_UNREACHABLE();
+}
+#endif
static void qDefaultMessageHandler(QtMsgType type, const QMessageLogContext &context, const QString &buf);
// pointer to QtMessageHandler debug handler (with context)
-static QBasicAtomicPointer<void (QtMsgType, const QMessageLogContext &, const QString &)> messageHandler = Q_BASIC_ATOMIC_INITIALIZER(nullptr);
+Q_CONSTINIT static QBasicAtomicPointer<void (QtMsgType, const QMessageLogContext &, const QString &)> messageHandler = Q_BASIC_ATOMIC_INITIALIZER(nullptr);
// ------------------------ Alternate logging sinks -------------------------
@@ -1505,13 +1722,14 @@ static QBasicAtomicPointer<void (QtMsgType, const QMessageLogContext &, const QS
#define QT_LOG_CODE 9000
#endif
-static bool slog2_default_handler(QtMsgType type, const QMessageLogContext &context, const QString &message)
+static bool slog2_default_handler(QtMsgType type, const QMessageLogContext &,
+ const QString &message)
{
if (shouldLogToStderr())
return false; // Leave logging up to stderr handler
- QString formattedMessage = qFormatLogMessage(type, context, message);
- formattedMessage.append(QLatin1Char('\n'));
+ QString formattedMessage = message;
+ formattedMessage.append(u'\n');
if (slog2_set_default_buffer((slog2_buffer_t)-1) == 0) {
slog2_buffer_set_config_t buffer_config;
slog2_buffer_t buffer_handle;
@@ -1532,7 +1750,7 @@ static bool slog2_default_handler(QtMsgType type, const QMessageLogContext &cont
// Set as the default buffer
slog2_set_default_buffer(buffer_handle);
}
- int severity;
+ int severity = SLOG2_INFO;
//Determines the severity level
switch (type) {
case QtDebugMsg:
@@ -1561,13 +1779,11 @@ static bool slog2_default_handler(QtMsgType type, const QMessageLogContext &cont
#if QT_CONFIG(journald)
static bool systemd_default_message_handler(QtMsgType type,
const QMessageLogContext &context,
- const QString &message)
+ const QString &formattedMessage)
{
if (shouldLogToStderr())
return false; // Leave logging up to stderr handler
- QString formattedMessage = qFormatLogMessage(type, context, message);
-
int priority = LOG_INFO; // Informational
switch (type) {
case QtDebugMsg:
@@ -1600,13 +1816,12 @@ static bool systemd_default_message_handler(QtMsgType type,
#endif
#if QT_CONFIG(syslog)
-static bool syslog_default_message_handler(QtMsgType type, const QMessageLogContext &context, const QString &message)
+static bool syslog_default_message_handler(QtMsgType type, const QMessageLogContext &context,
+ const QString &formattedMessage)
{
if (shouldLogToStderr())
return false; // Leave logging up to stderr handler
- QString formattedMessage = qFormatLogMessage(type, context, message);
-
int priority = LOG_INFO; // Informational
switch (type) {
case QtDebugMsg:
@@ -1635,13 +1850,11 @@ static bool syslog_default_message_handler(QtMsgType type, const QMessageLogCont
#ifdef Q_OS_ANDROID
static bool android_default_message_handler(QtMsgType type,
const QMessageLogContext &context,
- const QString &message)
+ const QString &formattedMessage)
{
if (shouldLogToStderr())
return false; // Leave logging up to stderr handler
- QString formattedMessage = qFormatLogMessage(type, context, message);
-
android_LogPriority priority = ANDROID_LOG_DEBUG;
switch (type) {
case QtDebugMsg:
@@ -1661,9 +1874,10 @@ static bool android_default_message_handler(QtMsgType type,
break;
};
+ // If application name is a tag ensure it has no spaces
// If a category is defined, use it as an Android logging tag
__android_log_print(priority, isDefaultCategory(context.category) ?
- qPrintable(QCoreApplication::applicationName()) : context.category,
+ qPrintable(QCoreApplication::applicationName().replace(u' ', u'_')) : context.category,
"%s\n", qPrintable(formattedMessage));
return true; // Prevent further output to stderr
@@ -1671,10 +1885,10 @@ static bool android_default_message_handler(QtMsgType type,
#endif //Q_OS_ANDROID
#ifdef Q_OS_WIN
-static void win_outputDebugString_helper(QStringView message)
+static void win_outputDebugString_helper(const QString &message)
{
const qsizetype maxOutputStringLength = 32766;
- static QBasicMutex m;
+ Q_CONSTINIT static QBasicMutex m;
auto locker = qt_unique_lock(m);
// fast path: Avoid string copies if one output is enough
if (message.length() <= maxOutputStringLength) {
@@ -1683,7 +1897,7 @@ static void win_outputDebugString_helper(QStringView message)
wchar_t *messagePart = new wchar_t[maxOutputStringLength + 1];
for (qsizetype i = 0; i < message.length(); i += maxOutputStringLength) {
const qsizetype length = qMin(message.length() - i, maxOutputStringLength);
- const qsizetype len = message.mid(i, length).toWCharArray(messagePart);
+ const qsizetype len = QStringView{message}.mid(i, length).toWCharArray(messagePart);
Q_ASSERT(len == length);
messagePart[len] = 0;
OutputDebugString(messagePart);
@@ -1692,13 +1906,13 @@ static void win_outputDebugString_helper(QStringView message)
}
}
-static bool win_message_handler(QtMsgType type, const QMessageLogContext &context, const QString &message)
+static bool win_message_handler(QtMsgType, const QMessageLogContext &,
+ const QString &formattedMessage)
{
if (shouldLogToStderr())
return false; // Leave logging up to stderr handler
- const QString formattedMessage = qFormatLogMessage(type, context, message).append(QLatin1Char('\n'));
- win_outputDebugString_helper(formattedMessage);
+ win_outputDebugString_helper(formattedMessage + u'\n');
return true; // Prevent further output to stderr
}
@@ -1706,15 +1920,15 @@ static bool win_message_handler(QtMsgType type, const QMessageLogContext &contex
#ifdef Q_OS_WASM
static bool wasm_default_message_handler(QtMsgType type,
- const QMessageLogContext &context,
- const QString &message)
+ const QMessageLogContext &,
+ const QString &formattedMessage)
{
- if (shouldLogToStderr())
- return false; // Leave logging up to stderr handler
+ static bool forceStderrLogging = qEnvironmentVariableIntValue("QT_FORCE_STDERR_LOGGING");
+ if (forceStderrLogging)
+ return false;
- QString formattedMessage = qFormatLogMessage(type, context, message);
- int emOutputFlags = (EM_LOG_CONSOLE | EM_LOG_DEMANGLE);
- QByteArray localMsg = message.toLocal8Bit();
+ int emOutputFlags = EM_LOG_CONSOLE;
+ QByteArray localMsg = formattedMessage.toLocal8Bit();
switch (type) {
case QtDebugMsg:
break;
@@ -1739,58 +1953,89 @@ static bool wasm_default_message_handler(QtMsgType type,
// --------------------------------------------------------------------------
-static void stderr_message_handler(QtMsgType type, const QMessageLogContext &context, const QString &message)
+static void stderr_message_handler(QtMsgType type, const QMessageLogContext &context,
+ const QString &formattedMessage)
{
- QString formattedMessage = qFormatLogMessage(type, context, message);
+ Q_UNUSED(type);
+ Q_UNUSED(context);
// print nothing if message pattern didn't apply / was empty.
// (still print empty lines, e.g. because message itself was empty)
if (formattedMessage.isNull())
return;
-
fprintf(stderr, "%s\n", formattedMessage.toLocal8Bit().constData());
fflush(stderr);
}
+namespace {
+struct SystemMessageSink
+{
+ using Fn = bool(QtMsgType, const QMessageLogContext &, const QString &);
+ Fn *sink;
+ bool messageIsUnformatted = false;
+};
+}
+
+static constexpr SystemMessageSink systemMessageSink = {
+#if defined(QT_BOOTSTRAPPED)
+ nullptr
+#elif defined(Q_OS_WIN)
+ win_message_handler
+#elif QT_CONFIG(slog2)
+ slog2_default_handler
+#elif QT_CONFIG(journald)
+ systemd_default_message_handler
+#elif QT_CONFIG(syslog)
+ syslog_default_message_handler
+#elif defined(Q_OS_ANDROID)
+ android_default_message_handler
+#elif defined(QT_USE_APPLE_UNIFIED_LOGGING)
+ AppleUnifiedLogger::messageHandler, true
+#elif defined Q_OS_WASM
+ wasm_default_message_handler
+#else
+ nullptr
+#endif
+};
+
+static void preformattedMessageHandler(QtMsgType type, const QMessageLogContext &context,
+ const QString &formattedMessage)
+{
+QT_WARNING_PUSH
+QT_WARNING_DISABLE_GCC("-Waddress") // "the address of ~~ will never be NULL
+ if (systemMessageSink.sink && systemMessageSink.sink(type, context, formattedMessage))
+ return;
+QT_WARNING_POP
+
+ stderr_message_handler(type, context, formattedMessage);
+}
+
/*!
\internal
*/
static void qDefaultMessageHandler(QtMsgType type, const QMessageLogContext &context,
const QString &message)
{
- bool handledStderr = false;
-
// A message sink logs the message to a structured or unstructured destination,
// optionally formatting the message if the latter, and returns true if the sink
// handled stderr output as well, which will shortcut our default stderr output.
- // In the future, if we allow multiple/dynamic sinks, this will be iterating
- // a list of sinks.
-#if !defined(QT_BOOTSTRAPPED)
-# if defined(Q_OS_WIN)
- handledStderr |= win_message_handler(type, context, message);
-# elif QT_CONFIG(slog2)
- handledStderr |= slog2_default_handler(type, context, message);
-# elif QT_CONFIG(journald)
- handledStderr |= systemd_default_message_handler(type, context, message);
-# elif QT_CONFIG(syslog)
- handledStderr |= syslog_default_message_handler(type, context, message);
-# elif defined(Q_OS_ANDROID)
- handledStderr |= android_default_message_handler(type, context, message);
-# elif defined(QT_USE_APPLE_UNIFIED_LOGGING)
- handledStderr |= AppleUnifiedLogger::messageHandler(type, context, message);
-# elif defined Q_OS_WASM
- handledStderr |= wasm_default_message_handler(type, context, message);
-# endif
-#endif
+ if (systemMessageSink.messageIsUnformatted) {
+ if (systemMessageSink.sink(type, context, message))
+ return;
+ }
- if (!handledStderr)
- stderr_message_handler(type, context, message);
+ preformattedMessageHandler(type, context, formatLogMessage(type, context, message));
}
-#if defined(Q_COMPILER_THREAD_LOCAL)
+#if defined(QT_BOOTSTRAPPED)
+// there's no message handler in bootstrapped mode; force everything to stderr
+static bool grabMessageHandler() { return false; }
+static void ungrabMessageHandler() { }
+
+#elif defined(Q_COMPILER_THREAD_LOCAL)
-static thread_local bool msgHandlerGrabbed = false;
+Q_CONSTINIT static thread_local bool msgHandlerGrabbed = false;
static bool grabMessageHandler()
{
@@ -1832,25 +2077,14 @@ static void qt_message_print(QtMsgType msgType, const QMessageLogContext &contex
auto msgHandler = messageHandler.loadAcquire();
(msgHandler ? msgHandler : qDefaultMessageHandler)(msgType, context, message);
} else {
- fprintf(stderr, "%s\n", message.toLocal8Bit().constData());
- }
-}
-
-static void qt_message_print(const QString &message)
-{
-#if defined(Q_OS_WIN) && !defined(QT_BOOTSTRAPPED)
- if (!shouldLogToStderr()) {
- win_outputDebugString_helper(message);
- return;
+ stderr_message_handler(msgType, context, message);
}
-#endif
- fprintf(stderr, "%s", message.toLocal8Bit().constData());
- fflush(stderr);
}
-static void qt_message_fatal(QtMsgType, const QMessageLogContext &context, const QString &message)
+template <typename String>
+static void qt_message_fatal(QtMsgType, const QMessageLogContext &context, String &&message)
{
-#if defined(Q_CC_MSVC) && defined(QT_DEBUG) && defined(_DEBUG) && defined(_CRT_ERROR)
+#if defined(Q_CC_MSVC_ONLY) && defined(QT_DEBUG) && defined(_DEBUG) && defined(_CRT_ERROR)
wchar_t contextFileL[256];
// we probably should let the compiler do this for us, by declaring QMessageLogContext::file to
// be const wchar_t * in the first place, but the #ifdefery above is very complex and we
@@ -1869,21 +2103,24 @@ static void qt_message_fatal(QtMsgType, const QMessageLogContext &context, const
_CrtDbgBreak();
#else
Q_UNUSED(context);
- Q_UNUSED(message);
#endif
+ if constexpr (std::is_class_v<String> && !std::is_const_v<String>)
+ message.clear();
+ else
+ Q_UNUSED(message);
qAbort();
}
-
/*!
\internal
*/
void qt_message_output(QtMsgType msgType, const QMessageLogContext &context, const QString &message)
{
- qt_message_print(msgType, context, message);
+ QInternalMessageLogContext ctx(context);
+ qt_message_print(msgType, ctx, message);
if (isFatal(msgType))
- qt_message_fatal(msgType, context, message);
+ qt_message_fatal(msgType, ctx, message);
}
void qErrnoWarning(const char *msg, ...)
@@ -1897,9 +2134,9 @@ void qErrnoWarning(const char *msg, ...)
QString buf = QString::vasprintf(msg, ap);
va_end(ap);
- buf += QLatin1String(" (") + error_string + QLatin1Char(')');
- QMessageLogContext context;
- qt_message_output(QtCriticalMsg, context, buf);
+ buf += " ("_L1 + error_string + u')';
+ QInternalMessageLogContext context{QMessageLogContext()};
+ qt_message_output(QtWarningMsg, context, buf);
}
void qErrnoWarning(int code, const char *msg, ...)
@@ -1911,14 +2148,14 @@ void qErrnoWarning(int code, const char *msg, ...)
QString buf = QString::vasprintf(msg, ap);
va_end(ap);
- buf += QLatin1String(" (") + qt_error_string(code) + QLatin1Char(')');
- QMessageLogContext context;
- qt_message_output(QtCriticalMsg, context, buf);
+ buf += " ("_L1 + qt_error_string(code) + u')';
+ QInternalMessageLogContext context{QMessageLogContext()};
+ qt_message_output(QtWarningMsg, context, buf);
}
/*!
\typedef QtMessageHandler
- \relates <QtGlobal>
+ \relates <QtLogging>
\since 5.0
This is a typedef for a pointer to a function with the following
@@ -1931,42 +2168,69 @@ void qErrnoWarning(int code, const char *msg, ...)
/*!
\fn QtMessageHandler qInstallMessageHandler(QtMessageHandler handler)
- \relates <QtGlobal>
+ \relates <QtLogging>
\since 5.0
- Installs a Qt message \a handler which has been defined
- previously. Returns a pointer to the previous message handler.
-
- The message handler is a function that prints out debug messages,
- warnings, critical and fatal error messages. The Qt library (debug
- mode) contains hundreds of warning messages that are printed
- when internal errors (usually invalid function arguments)
- occur. Qt built in release mode also contains such warnings unless
- QT_NO_WARNING_OUTPUT and/or QT_NO_DEBUG_OUTPUT have been set during
- compilation. If you implement your own message handler, you get total
- control of these messages.
-
- The default message handler prints the message to the standard output
- under X11 or to the debugger under Windows. If it is a fatal message, the
- application aborts immediately after handling that message. Custom
- message handlers should not attempt to exit an application on their own.
-
- Only one message handler can be defined, since this is usually
- done on an application-wide basis to control debug output.
-
- To restore the message handler, call \c qInstallMessageHandler(0).
-
- Example:
+ Installs a Qt message \a handler.
+ Returns a pointer to the previously installed message handler.
+
+ A message handler is a function that prints out debug, info,
+ warning, critical, and fatal messages from Qt's logging infrastructure.
+ By default, Qt uses a standard message handler that formats and
+ prints messages to different sinks specific to the operating system
+ and Qt configuration. Installing your own message handler allows you
+ to assume full control, and for instance log messages to the
+ file system.
+
+ Note that Qt supports \l{QLoggingCategory}{logging categories} for
+ grouping related messages in semantic categories. You can use these
+ to enable or disable logging per category and \l{QtMsgType}{message type}.
+ As the filtering for logging categories is done even before a message
+ is created, messages for disabled types and categories will not reach
+ the message handler.
+
+ A message handler needs to be
+ \l{Reentrancy and Thread-Safety}{reentrant}. That is, it might be called
+ from different threads, in parallel. Therefore, writes to common sinks
+ (like a database, or a file) often need to be synchronized.
+
+ Qt allows to enrich logging messages with further meta-information
+ by calling \l qSetMessagePattern(), or setting the \c QT_MESSAGE_PATTERN
+ environment variable. To keep this formatting, a custom message handler
+ can use \l qFormatLogMessage().
+
+ Try to keep the code in the message handler itself minimal, as expensive
+ operations might block the application. Also, to avoid recursion, any
+ logging messages generated in the message handler itself will be ignored.
+
+ The message handler should always return. For
+ \l{QtFatalMsg}{fatal messages}, the application aborts immediately after
+ handling that message.
+
+ Only one message handler can be installed at a time, for the whole application.
+ If there was a previous custom message handler installed,
+ the function will return a pointer to it. This handler can then
+ be later reinstalled by another call to the method. Also, calling
+ \c qInstallMessageHandler(nullptr) will restore the default
+ message handler.
+
+ Here is an example of a message handler that logs to a local file
+ before calling the default handler:
\snippet code/src_corelib_global_qglobal.cpp 23
+ Note that the C++ standard guarantees that \c{static FILE *f} is
+ initialized in a thread-safe way. We can also expect \c{fprintf()}
+ and \c{fflush()} to be thread-safe, so no further synchronization
+ is necessary.
+
\sa QtMessageHandler, QtMsgType, qDebug(), qInfo(), qWarning(), qCritical(), qFatal(),
- {Debugging Techniques}
+ {Debugging Techniques}, qFormatLogMessage()
*/
/*!
\fn void qSetMessagePattern(const QString &pattern)
- \relates <QtGlobal>
+ \relates <QtLogging>
\since 5.0
\brief Changes the output of the default message handler.
@@ -1999,9 +2263,22 @@ void qErrnoWarning(int code, const char *msg, ...)
\row \li \c{%{backtrace [depth=N] [separator="..."]}} \li A backtrace with the number of frames
specified by the optional \c depth parameter (defaults to 5), and separated by the optional
\c separator parameter (defaults to "|").
- This expansion is available only on some platforms (currently only platfoms using glibc).
- Names are only known for exported functions. If you want to see the name of every function
- in your application, use \c{QMAKE_LFLAGS += -rdynamic}.
+
+ This expansion is available only on some platforms:
+
+ \list
+ \li platforms using glibc;
+ \li platforms shipping C++23's \c{<stacktrace>} header (requires compiling Qt in C++23 mode).
+ \endlist
+
+ Depending on the platform, there are some restrictions on the function
+ names printed by this expansion.
+
+ On some platforms,
+ names are only known for exported functions. If you want to see the name of every function
+ in your application, make sure your application is compiled and linked with \c{-rdynamic},
+ or an equivalent of it.
+
When reading backtraces, take into account that frames might be missing due to inlining or
tail call optimization.
\endtable
@@ -2044,6 +2321,7 @@ QtMessageHandler qInstallMessageHandler(QtMessageHandler h)
return qDefaultMessageHandler;
}
+#ifndef QT_BOOTSTRAPPED
void qSetMessagePattern(const QString &pattern)
{
const auto locker = qt_scoped_lock(QMessagePattern::mutex);
@@ -2051,7 +2329,38 @@ void qSetMessagePattern(const QString &pattern)
if (!qMessagePattern()->fromEnvironment)
qMessagePattern()->setPattern(pattern);
}
+#endif
+static void copyInternalContext(QInternalMessageLogContext *self,
+ const QMessageLogContext &logContext) noexcept
+{
+ if (logContext.version == self->version) {
+ auto other = static_cast<const QInternalMessageLogContext *>(&logContext);
+ self->backtrace = other->backtrace;
+ }
+}
+
+/*!
+ \internal
+ Copies context information from \a logContext into this QMessageLogContext.
+ Returns the number of backtrace frames that are desired.
+*/
+int QInternalMessageLogContext::initFrom(const QMessageLogContext &logContext)
+{
+ version = CurrentVersion + 1;
+ copyContextFrom(logContext);
+
+#ifdef QLOGGING_HAVE_BACKTRACE
+ if (backtrace.has_value())
+ return 0; // we have a stored backtrace, no need to get it again
+
+ // initializes the message pattern, if needed
+ if (auto pattern = qMessagePattern())
+ return pattern->maxBacktraceDepth;
+#endif
+
+ return 0;
+}
/*!
Copies context information from \a logContext into this QMessageLogContext.
@@ -2067,6 +2376,8 @@ QMessageLogContext &QMessageLogContext::copyContextFrom(const QMessageLogContext
this->file = logContext.file;
this->line = logContext.line;
this->function = logContext.function;
+ if (Q_UNLIKELY(version == CurrentVersion + 1))
+ copyInternalContext(static_cast<QInternalMessageLogContext *>(this), logContext);
return *this;
}
@@ -2114,4 +2425,219 @@ QMessageLogContext &QMessageLogContext::copyContextFrom(const QMessageLogContext
\a lineNumber, in function \a functionName, and category \a categoryName.
*/
+/*!
+ \macro qDebug(const char *message, ...)
+ \relates <QtLogging>
+ \threadsafe
+
+ Calls the message handler with the debug message \a message. If no
+ message handler has been installed, the message is printed to
+ stderr. Under Windows the message is sent to the console, if it is a
+ console application; otherwise, it is sent to the debugger. On QNX, the
+ message is sent to slogger2. This function does nothing if \c QT_NO_DEBUG_OUTPUT
+ was defined during compilation.
+
+ If you pass the function a format string and a list of arguments,
+ it works in similar way to the C printf() function. The format
+ should be a Latin-1 string.
+
+ Example:
+
+ \snippet code/src_corelib_global_qglobal.cpp 24
+
+ If you include \c <QtDebug>, a more convenient syntax is also
+ available:
+
+ \snippet code/src_corelib_global_qglobal.cpp 25
+
+ With this syntax, the function returns a QDebug object that is
+ configured to use the QtDebugMsg message type. It automatically
+ puts a single space between each item, and outputs a newline at
+ the end. It supports many C++ and Qt types.
+
+ To suppress the output at runtime, install your own message handler
+ with qInstallMessageHandler().
+
+ \sa qInfo(), qWarning(), qCritical(), qFatal(), qInstallMessageHandler(),
+ {Debugging Techniques}
+*/
+
+/*!
+ \macro qInfo(const char *message, ...)
+ \relates <QtLogging>
+ \threadsafe
+ \since 5.5
+
+ Calls the message handler with the informational message \a message. If no
+ message handler has been installed, the message is printed to
+ stderr. Under Windows, the message is sent to the console, if it is a
+ console application; otherwise, it is sent to the debugger. On QNX the
+ message is sent to slogger2. This function does nothing if \c QT_NO_INFO_OUTPUT
+ was defined during compilation.
+
+ If you pass the function a format string and a list of arguments,
+ it works in similar way to the C printf() function. The format
+ should be a Latin-1 string.
+
+ Example:
+
+ \snippet code/src_corelib_global_qglobal.cpp qInfo_printf
+
+ If you include \c <QtDebug>, a more convenient syntax is also
+ available:
+
+ \snippet code/src_corelib_global_qglobal.cpp qInfo_stream
+
+ With this syntax, the function returns a QDebug object that is
+ configured to use the QtInfoMsg message type. It automatically
+ puts a single space between each item, and outputs a newline at
+ the end. It supports many C++ and Qt types.
+
+ To suppress the output at runtime, install your own message handler
+ using qInstallMessageHandler().
+
+ \sa qDebug(), qWarning(), qCritical(), qFatal(), qInstallMessageHandler(),
+ {Debugging Techniques}
+*/
+
+/*!
+ \macro qWarning(const char *message, ...)
+ \relates <QtLogging>
+ \threadsafe
+
+ Calls the message handler with the warning message \a message. If no
+ message handler has been installed, the message is printed to
+ stderr. Under Windows, the message is sent to the debugger.
+ On QNX the message is sent to slogger2.
+
+ This function takes a format string and a list of arguments,
+ similar to the C printf() function. The format should be a Latin-1
+ string.
+
+ Example:
+ \snippet code/src_corelib_global_qglobal.cpp 26
+
+ If you include <QtDebug>, a more convenient syntax is
+ also available:
+
+ \snippet code/src_corelib_global_qglobal.cpp 27
+
+ This syntax inserts a space between each item, and
+ appends a newline at the end.
+
+ This function does nothing if \c QT_NO_WARNING_OUTPUT was defined
+ during compilation.
+ To suppress the output at runtime, you can set
+ \l{QLoggingCategory}{logging rules} or register a custom
+ \l{QLoggingCategory::installFilter()}{filter}.
+
+ For debugging purposes, it is sometimes convenient to let the
+ program abort for warning messages. This allows you then
+ to inspect the core dump, or attach a debugger - see also \l{qFatal()}.
+ To enable this, set the environment variable \c{QT_FATAL_WARNINGS}
+ to a number \c n. The program terminates then for the n-th warning.
+ That is, if the environment variable is set to 1, it will terminate
+ on the first call; if it contains the value 10, it will exit on the 10th
+ call. Any non-numeric value in the environment variable is equivalent to 1.
+
+ \sa qDebug(), qInfo(), qCritical(), qFatal(), qInstallMessageHandler(),
+ {Debugging Techniques}
+*/
+
+/*!
+ \macro qCritical(const char *message, ...)
+ \relates <QtLogging>
+ \threadsafe
+
+ Calls the message handler with the critical message \a message. If no
+ message handler has been installed, the message is printed to
+ stderr. Under Windows, the message is sent to the debugger.
+ On QNX the message is sent to slogger2.
+
+ This function takes a format string and a list of arguments,
+ similar to the C printf() function. The format should be a Latin-1
+ string.
+
+ Example:
+ \snippet code/src_corelib_global_qglobal.cpp 28
+
+ If you include <QtDebug>, a more convenient syntax is
+ also available:
+
+ \snippet code/src_corelib_global_qglobal.cpp 29
+
+ A space is inserted between the items, and a newline is
+ appended at the end.
+
+ To suppress the output at runtime, you can define
+ \l{QLoggingCategory}{logging rules} or register a custom
+ \l{QLoggingCategory::installFilter()}{filter}.
+
+ For debugging purposes, it is sometimes convenient to let the
+ program abort for critical messages. This allows you then
+ to inspect the core dump, or attach a debugger - see also \l{qFatal()}.
+ To enable this, set the environment variable \c{QT_FATAL_CRITICALS}
+ to a number \c n. The program terminates then for the n-th critical
+ message.
+ That is, if the environment variable is set to 1, it will terminate
+ on the first call; if it contains the value 10, it will exit on the 10th
+ call. Any non-numeric value in the environment variable is equivalent to 1.
+
+ \sa qDebug(), qInfo(), qWarning(), qFatal(), qInstallMessageHandler(),
+ {Debugging Techniques}
+*/
+
+/*!
+ \macro qFatal(const char *message, ...)
+ \relates <QtLogging>
+
+ Calls the message handler with the fatal message \a message. If no
+ message handler has been installed, the message is printed to
+ stderr. Under Windows, the message is sent to the debugger.
+ On QNX the message is sent to slogger2.
+
+ If you are using the \b{default message handler} this function will
+ abort to create a core dump. On Windows, for debug builds,
+ this function will report a _CRT_ERROR enabling you to connect a debugger
+ to the application.
+
+ This function takes a format string and a list of arguments,
+ similar to the C printf() function.
+
+ Example:
+ \snippet code/src_corelib_global_qglobal.cpp 30
+
+ To suppress the output at runtime, install your own message handler
+ with qInstallMessageHandler().
+
+ \sa qDebug(), qInfo(), qWarning(), qCritical(), qInstallMessageHandler(),
+ {Debugging Techniques}
+*/
+
+/*!
+ \enum QtMsgType
+ \relates <QtLogging>
+
+ This enum describes the messages that can be sent to a message
+ handler (QtMessageHandler). You can use the enum to identify and
+ associate the various message types with the appropriate
+ actions.
+
+ \value QtDebugMsg
+ A message generated by the qDebug() function.
+ \value QtInfoMsg
+ A message generated by the qInfo() function.
+ \value QtWarningMsg
+ A message generated by the qWarning() function.
+ \value QtCriticalMsg
+ A message generated by the qCritical() function.
+ \value QtFatalMsg
+ A message generated by the qFatal() function.
+ \omitvalue QtSystemMsg
+
+ \c QtInfoMsg was added in Qt 5.5.
+
+ \sa QtMessageHandler, qInstallMessageHandler()
+*/
+
QT_END_NAMESPACE
diff --git a/src/corelib/global/qlogging.h b/src/corelib/global/qlogging.h
index 2794c747da..aa0ab93a2d 100644
--- a/src/corelib/global/qlogging.h
+++ b/src/corelib/global/qlogging.h
@@ -1,50 +1,18 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include <QtCore/qglobal.h>
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QLOGGING_H
#define QLOGGING_H
+#include <QtCore/qtclasshelpermacros.h>
+#include <QtCore/qtconfigmacros.h>
+#include <QtCore/qtcoreexports.h>
+#include <QtCore/qcontainerfwd.h>
+
#if 0
// header is automatically included in qglobal.h
#pragma qt_no_master_include
+#pragma qt_class(QtLogging)
#endif
QT_BEGIN_NAMESPACE
@@ -57,24 +25,29 @@ QT_BEGIN_NAMESPACE
class QDebug;
class QNoDebug;
+
enum QtMsgType {
QtDebugMsg,
QtWarningMsg,
QtCriticalMsg,
QtFatalMsg,
QtInfoMsg,
- QtSystemMsg = QtCriticalMsg
+#if QT_DEPRECATED_SINCE(6, 7)
+ QtSystemMsg Q_DECL_ENUMERATOR_DEPRECATED_X("Use QtCriticalMsg instead.") = QtCriticalMsg
+#endif
};
+class QInternalMessageLogContext;
class QMessageLogContext
{
Q_DISABLE_COPY(QMessageLogContext)
public:
+ static constexpr int CurrentVersion = 2;
constexpr QMessageLogContext() noexcept = default;
constexpr QMessageLogContext(const char *fileName, int lineNumber, const char *functionName, const char *categoryName) noexcept
: line(lineNumber), file(fileName), function(functionName), category(categoryName) {}
- int version = 2;
+ int version = CurrentVersion;
int line = 0;
const char *file = nullptr;
const char *function = nullptr;
@@ -83,12 +56,18 @@ public:
private:
QMessageLogContext &copyContextFrom(const QMessageLogContext &logContext) noexcept;
+ friend class QInternalMessageLogContext;
friend class QMessageLogger;
- friend class QDebug;
};
class QLoggingCategory;
+#if defined(Q_CC_MSVC_ONLY)
+# define QT_MESSAGE_LOGGER_NORETURN
+#else
+# define QT_MESSAGE_LOGGER_NORETURN Q_NORETURN
+#endif
+
class Q_CORE_EXPORT QMessageLogger
{
Q_DISABLE_COPY(QMessageLogger)
@@ -107,6 +86,8 @@ public:
void warning(const char *msg, ...) const Q_ATTRIBUTE_FORMAT_PRINTF(2, 3);
Q_DECL_COLD_FUNCTION
void critical(const char *msg, ...) const Q_ATTRIBUTE_FORMAT_PRINTF(2, 3);
+ QT_MESSAGE_LOGGER_NORETURN Q_DECL_COLD_FUNCTION
+ void fatal(const char *msg, ...) const noexcept Q_ATTRIBUTE_FORMAT_PRINTF(2, 3);
typedef const QLoggingCategory &(*CategoryFunction)();
@@ -122,12 +103,10 @@ public:
void critical(const QLoggingCategory &cat, const char *msg, ...) const Q_ATTRIBUTE_FORMAT_PRINTF(3, 4);
Q_DECL_COLD_FUNCTION
void critical(CategoryFunction catFunc, const char *msg, ...) const Q_ATTRIBUTE_FORMAT_PRINTF(3, 4);
-
-#ifndef Q_CC_MSVC
- Q_NORETURN
-#endif
- Q_DECL_COLD_FUNCTION
- void fatal(const char *msg, ...) const noexcept Q_ATTRIBUTE_FORMAT_PRINTF(2, 3);
+ QT_MESSAGE_LOGGER_NORETURN Q_DECL_COLD_FUNCTION
+ void fatal(const QLoggingCategory &cat, const char *msg, ...) const noexcept Q_ATTRIBUTE_FORMAT_PRINTF(3, 4);
+ QT_MESSAGE_LOGGER_NORETURN Q_DECL_COLD_FUNCTION
+ void fatal(CategoryFunction catFunc, const char *msg, ...) const noexcept Q_ATTRIBUTE_FORMAT_PRINTF(3, 4);
#ifndef QT_NO_DEBUG_STREAM
QDebug debug() const;
@@ -148,6 +127,12 @@ public:
QDebug critical(const QLoggingCategory &cat) const;
Q_DECL_COLD_FUNCTION
QDebug critical(CategoryFunction catFunc) const;
+ Q_DECL_COLD_FUNCTION
+ QDebug fatal() const;
+ Q_DECL_COLD_FUNCTION
+ QDebug fatal(const QLoggingCategory &cat) const;
+ Q_DECL_COLD_FUNCTION
+ QDebug fatal(CategoryFunction catFunc) const;
QNoDebug noDebug() const noexcept;
#endif // QT_NO_DEBUG_STREAM
@@ -156,6 +141,8 @@ private:
QMessageLogContext context;
};
+#undef QT_MESSAGE_LOGGER_NORETURN
+
#if !defined(QT_MESSAGELOGCONTEXT) && !defined(QT_NO_MESSAGELOGCONTEXT)
# if defined(QT_NO_DEBUG)
# define QT_NO_MESSAGELOGCONTEXT
@@ -208,5 +195,8 @@ Q_CORE_EXPORT void qSetMessagePattern(const QString &messagePattern);
Q_CORE_EXPORT QString qFormatLogMessage(QtMsgType type, const QMessageLogContext &context,
const QString &buf);
+Q_DECL_COLD_FUNCTION
+Q_CORE_EXPORT QString qt_error_string(int errorCode = -1);
+
QT_END_NAMESPACE
#endif // QLOGGING_H
diff --git a/src/corelib/global/qlogging_p.h b/src/corelib/global/qlogging_p.h
index 3d0c097ffe..bc331c80c0 100644
--- a/src/corelib/global/qlogging_p.h
+++ b/src/corelib/global/qlogging_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2018 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2018 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QLOGGING_P_H
#define QLOGGING_P_H
@@ -51,6 +15,24 @@
// We mean it.
//
+#include <QtCore/private/qglobal_p.h>
+#include "qlogging.h"
+#include "qloggingcategory.h"
+
+#if !defined(QT_BOOTSTRAPPED) && QT_CONFIG(regularexpression)
+# if __has_include(<cxxabi.h>) && QT_CONFIG(backtrace)
+# include <optional>
+# include "qvarlengtharray.h"
+# define QLOGGING_USE_EXECINFO_BACKTRACE
+# define QLOGGING_HAVE_BACKTRACE
+# elif QT_CONFIG(cxx23_stacktrace)
+# include <optional>
+# include <stacktrace>
+# define QLOGGING_USE_STD_BACKTRACE
+# define QLOGGING_HAVE_BACKTRACE
+# endif
+#endif // QT_BOOTSTRAPPED
+
QT_BEGIN_NAMESPACE
namespace QtPrivate {
@@ -59,6 +41,38 @@ Q_CORE_EXPORT bool shouldLogToStderr();
}
+class QInternalMessageLogContext : public QMessageLogContext
+{
+public:
+ static constexpr int DefaultBacktraceDepth = 32;
+
+#if defined(QLOGGING_USE_EXECINFO_BACKTRACE)
+ using BacktraceStorage = QVarLengthArray<void *, DefaultBacktraceDepth>;
+#elif defined(QLOGGING_USE_STD_BACKTRACE)
+ using BacktraceStorage = std::stacktrace;
+#else
+ using BacktraceStorage = bool; // dummy
+#endif
+
+ std::optional<BacktraceStorage> backtrace;
+
+ Q_ALWAYS_INLINE QInternalMessageLogContext(const QMessageLogContext &logContext)
+ {
+ int backtraceFrames = initFrom(logContext);
+ if (backtraceFrames)
+ populateBacktrace(backtraceFrames);
+ }
+ QInternalMessageLogContext(const QMessageLogContext &logContext,
+ const QLoggingCategory &categoryOverride)
+ : QInternalMessageLogContext(logContext)
+ {
+ category = categoryOverride.categoryName();
+ }
+
+ int initFrom(const QMessageLogContext &logContext);
+ void populateBacktrace(int frameCount);
+};
+
QT_END_NAMESPACE
#endif // QLOGGING_P_H
diff --git a/src/corelib/global/qmalloc.cpp b/src/corelib/global/qmalloc.cpp
index aeba9ed19b..d413a35c6b 100644
--- a/src/corelib/global/qmalloc.cpp
+++ b/src/corelib/global/qmalloc.cpp
@@ -1,42 +1,7 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+#include "qmalloc.h"
#include "qplatformdefs.h"
#include <stdlib.h>
@@ -80,6 +45,7 @@ void *qReallocAligned(void *oldptr, size_t newsize, size_t oldsize, size_t align
// However, we need to store the actual pointer, so we need to allocate actually size +
// alignment anyway.
+ qptrdiff oldoffset = oldptr ? static_cast<char *>(oldptr) - static_cast<char *>(actualptr) : 0;
void *real = realloc(actualptr, newsize + alignment);
if (!real)
return nullptr;
@@ -89,7 +55,6 @@ void *qReallocAligned(void *oldptr, size_t newsize, size_t oldsize, size_t align
void **faked_ptr = reinterpret_cast<void **>(faked);
if (oldptr) {
- qptrdiff oldoffset = static_cast<char *>(oldptr) - static_cast<char *>(actualptr);
qptrdiff newoffset = reinterpret_cast<char *>(faked_ptr) - static_cast<char *>(real);
if (oldoffset != newoffset)
memmove(faked_ptr, static_cast<char *>(real) + oldoffset, qMin(oldsize, newsize));
diff --git a/src/corelib/global/qmalloc.h b/src/corelib/global/qmalloc.h
new file mode 100644
index 0000000000..83dfff358b
--- /dev/null
+++ b/src/corelib/global/qmalloc.h
@@ -0,0 +1,26 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QMALLOC_H
+#define QMALLOC_H
+
+#include <QtCore/qcompilerdetection.h>
+#include <QtCore/qtconfigmacros.h>
+#include <QtCore/qtcoreexports.h>
+
+#include <cstddef> // size_t
+
+#if 0
+#pragma qt_class(QtMalloc)
+#pragma qt_sync_stop_processing
+#endif
+
+QT_BEGIN_NAMESPACE
+
+Q_CORE_EXPORT void *qMallocAligned(size_t size, size_t alignment) Q_ALLOC_SIZE(1);
+Q_CORE_EXPORT void *qReallocAligned(void *ptr, size_t size, size_t oldsize, size_t alignment) Q_ALLOC_SIZE(2);
+Q_CORE_EXPORT void qFreeAligned(void *ptr);
+
+QT_END_NAMESPACE
+
+#endif // QMALLOC_H
diff --git a/src/corelib/global/qminmax.h b/src/corelib/global/qminmax.h
new file mode 100644
index 0000000000..e6fb62bf9d
--- /dev/null
+++ b/src/corelib/global/qminmax.h
@@ -0,0 +1,88 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QMINMAX_H
+#define QMINMAX_H
+
+#if 0
+#pragma qt_class(QtMinMax)
+#pragma qt_sync_stop_processing
+#endif
+
+#include <QtCore/qassert.h>
+#include <QtCore/qtconfigmacros.h>
+
+#include <type_traits>
+
+QT_BEGIN_NAMESPACE
+
+namespace QTypeTraits {
+
+namespace detail {
+template<typename T, typename U,
+ typename = std::enable_if_t<std::is_arithmetic_v<T> && std::is_arithmetic_v<U> &&
+ std::is_floating_point_v<T> == std::is_floating_point_v<U> &&
+ std::is_signed_v<T> == std::is_signed_v<U> &&
+ !std::is_same_v<T, bool> && !std::is_same_v<U, bool> &&
+ !std::is_same_v<T, char> && !std::is_same_v<U, char>>>
+struct Promoted
+{
+ using type = decltype(T() + U());
+};
+}
+
+template <typename T, typename U>
+using Promoted = typename detail::Promoted<T, U>::type;
+
+}
+
+template <typename T>
+constexpr inline const T &qMin(const T &a, const T &b) { return (a < b) ? a : b; }
+template <typename T>
+constexpr inline const T &qMax(const T &a, const T &b) { return (a < b) ? b : a; }
+template <typename T>
+constexpr inline const T &qBound(const T &min, const T &val, const T &max)
+{
+ Q_ASSERT(!(max < min));
+ return qMax(min, qMin(max, val));
+}
+template <typename T, typename U>
+constexpr inline QTypeTraits::Promoted<T, U> qMin(const T &a, const U &b)
+{
+ using P = QTypeTraits::Promoted<T, U>;
+ P _a = a;
+ P _b = b;
+ return (_a < _b) ? _a : _b;
+}
+template <typename T, typename U>
+constexpr inline QTypeTraits::Promoted<T, U> qMax(const T &a, const U &b)
+{
+ using P = QTypeTraits::Promoted<T, U>;
+ P _a = a;
+ P _b = b;
+ return (_a < _b) ? _b : _a;
+}
+template <typename T, typename U>
+constexpr inline QTypeTraits::Promoted<T, U> qBound(const T &min, const U &val, const T &max)
+{
+ Q_ASSERT(!(max < min));
+ return qMax(min, qMin(max, val));
+}
+template <typename T, typename U>
+constexpr inline QTypeTraits::Promoted<T, U> qBound(const T &min, const T &val, const U &max)
+{
+ using P = QTypeTraits::Promoted<T, U>;
+ Q_ASSERT(!(P(max) < P(min)));
+ return qMax(min, qMin(max, val));
+}
+template <typename T, typename U>
+constexpr inline QTypeTraits::Promoted<T, U> qBound(const U &min, const T &val, const T &max)
+{
+ using P = QTypeTraits::Promoted<T, U>;
+ Q_ASSERT(!(P(max) < P(min)));
+ return qMax(min, qMin(max, val));
+}
+
+QT_END_NAMESPACE
+
+#endif // QMINMAX_H
diff --git a/src/corelib/global/qminmax.qdoc b/src/corelib/global/qminmax.qdoc
new file mode 100644
index 0000000000..36f680b4c7
--- /dev/null
+++ b/src/corelib/global/qminmax.qdoc
@@ -0,0 +1,39 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
+
+/*! \fn template <typename T> const T &qMin(const T &a, const T &b)
+ \relates <QtMinMax>
+
+ Returns the minimum of \a a and \a b.
+
+ Example:
+
+ \snippet code/src_corelib_global_qglobal.cpp 13
+
+ \sa qMax(), qBound()
+*/
+
+/*! \fn template <typename T> const T &qMax(const T &a, const T &b)
+ \relates <QtMinMax>
+
+ Returns the maximum of \a a and \a b.
+
+ Example:
+
+ \snippet code/src_corelib_global_qglobal.cpp 14
+
+ \sa qMin(), qBound()
+*/
+
+/*! \fn template <typename T> const T &qBound(const T &min, const T &val, const T &max)
+ \relates <QtMinMax>
+
+ Returns \a val bounded by \a min and \a max. This is equivalent
+ to qMax(\a min, qMin(\a val, \a max)).
+
+ Example:
+
+ \snippet code/src_corelib_global_qglobal.cpp 15
+
+ \sa qMin(), qMax()
+*/
diff --git a/src/corelib/global/qnamespace.h b/src/corelib/global/qnamespace.h
index 6052234545..2398c0a1a4 100644
--- a/src/corelib/global/qnamespace.h
+++ b/src/corelib/global/qnamespace.h
@@ -1,47 +1,16 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Copyright (C) 2020 Klaralvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// Copyright (C) 2020 Klaralvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QNAMESPACE_H
#define QNAMESPACE_H
+#if 0
+#pragma qt_class(Qt)
+#endif
+
#include <QtCore/qglobal.h>
+#include <QtCore/qcompare.h>
#include <QtCore/qtmetamacros.h>
#if defined(__OBJC__) && !defined(__cplusplus)
@@ -78,6 +47,12 @@ namespace Qt {
transparent
};
+ enum class ColorScheme {
+ Unknown,
+ Light,
+ Dark,
+ };
+
enum MouseButton {
NoButton = 0x00000000,
LeftButton = 0x00000001,
@@ -208,6 +183,7 @@ namespace Qt {
// size of a multi-variant string.
TextLongestVariant = 0x80000
};
+ Q_DECLARE_MIXED_ENUM_OPERATORS_SYMMETRIC(int, AlignmentFlag, TextFlag)
enum TextElideMode {
ElideLeft,
@@ -215,6 +191,7 @@ namespace Qt {
ElideMiddle,
ElideNone
};
+ Q_DECLARE_MIXED_ENUM_OPERATORS_SYMMETRIC(int, TextElideMode, TextFlag)
enum WhiteSpaceMode {
WhiteSpaceNormal,
@@ -236,7 +213,7 @@ namespace Qt {
ToolTip = Popup | Sheet,
SplashScreen = ToolTip | Dialog,
Desktop = 0x00000010 | Window,
- SubWindow = 0x00000012,
+ SubWindow = 0x00000012, // Note QTBUG-115729 before using
ForeignWindow = 0x00000020 | Window,
CoverWindow = 0x00000040 | Window,
@@ -446,7 +423,7 @@ namespace Qt {
enum ApplicationAttribute
{
// AA_ImmediateWidgetCreation = 0,
- // AA_MSWindowsUseDirect3DByDefault = 1,
+ AA_QtQuickUseDefaultSizePolicy = 1 QT_TECH_PREVIEW_API,
AA_DontShowIconsInMenus = 2,
AA_NativeWindows = 3,
AA_DontCreateNativeWidgetSiblings = 4,
@@ -455,7 +432,7 @@ namespace Qt {
AA_MacDontSwapCtrlAndMeta = 7,
AA_Use96Dpi = 8,
AA_DisableNativeVirtualKeyboard = 9,
- // AA_X11InitThreads = 10,
+ AA_DontUseNativeMenuWindows = 10,
AA_SynthesizeTouchForUnhandledMouseEvents = 11,
AA_SynthesizeMouseForUnhandledTouchEvents = 12,
#if QT_DEPRECATED_SINCE(6, 0)
@@ -485,7 +462,7 @@ namespace Qt {
AA_DisableShaderDiskCache = 27,
AA_DontShowShortcutsInContextMenus = 28,
AA_CompressTabletEvents = 29,
- // AA_DisableWindowContextHelpButton = 30,
+ AA_DontUsePopupWindows = 30,
AA_DisableSessionManager = 31,
// Add new attributes before this line
@@ -626,7 +603,11 @@ namespace Qt {
Key_twosuperior = 0x0b2,
Key_threesuperior = 0x0b3,
Key_acute = 0x0b4,
- Key_mu = 0x0b5,
+ Key_micro = 0x0b5,
+#if QT_DEPRECATED_SINCE(6, 11)
+ Key_mu Q_DECL_ENUMERATOR_DEPRECATED_X("This key was misnamed, use Key_micro instead")
+ = Key_micro,
+#endif
Key_paragraph = 0x0b6,
Key_periodcentered = 0x0b7,
Key_cedilla = 0x0b8,
@@ -1610,6 +1591,11 @@ namespace Qt {
};
inline constexpr Initialization Uninitialized = Initialization::Uninitialized;
+ struct Disambiguated_t {
+ explicit Disambiguated_t() = default;
+ };
+ inline constexpr Disambiguated_t Disambiguated{};
+
enum CoordinateSystem {
DeviceCoordinates,
LogicalCoordinates
@@ -1690,6 +1676,10 @@ namespace Qt {
VeryCoarseTimer
};
+ enum class TimerId {
+ Invalid = 0,
+ };
+
enum ScrollPhase {
NoScrollPhase = 0,
ScrollBegin,
@@ -1727,6 +1717,12 @@ namespace Qt {
PassThrough
};
+ enum class PermissionStatus {
+ Undetermined,
+ Granted,
+ Denied,
+ };
+
// QTBUG-48701
enum ReturnByValueConstant { ReturnByValue }; // ### Qt 7: Remove me
@@ -1770,6 +1766,7 @@ namespace Qt {
Q_ENUM_NS(DayOfWeek)
Q_ENUM_NS(CursorShape)
Q_ENUM_NS(GlobalColor)
+ Q_ENUM_NS(ColorScheme)
Q_ENUM_NS(AspectRatioMode)
Q_ENUM_NS(TransformationMode)
Q_FLAG_NS(ImageConversionFlags)
@@ -1817,10 +1814,11 @@ namespace Qt {
Q_ENUM_NS(TimerType)
Q_ENUM_NS(ScrollPhase)
Q_ENUM_NS(MouseEventSource)
- Q_FLAG_NS(MouseEventFlag)
+ Q_FLAG_NS(MouseEventFlags)
Q_ENUM_NS(ChecksumType)
Q_ENUM_NS(HighDpiScaleFactorRoundingPolicy)
Q_ENUM_NS(TabFocusBehavior)
+ Q_ENUM_NS(PermissionStatus)
#endif // Q_DOC
}
@@ -1911,18 +1909,14 @@ public:
return combination;
}
#endif
-
- friend constexpr bool operator==(QKeyCombination lhs, QKeyCombination rhs) noexcept
+ bool operator<(QKeyCombination) const = delete;
+private:
+ friend constexpr bool comparesEqual(const QKeyCombination &lhs,
+ const QKeyCombination &rhs) noexcept
{
return lhs.combination == rhs.combination;
}
-
- friend constexpr bool operator!=(QKeyCombination lhs, QKeyCombination rhs) noexcept
- {
- return lhs.combination != rhs.combination;
- }
-
- bool operator<(QKeyCombination) const = delete;
+ Q_DECLARE_EQUALITY_COMPARABLE_LITERAL_TYPE(QKeyCombination)
};
Q_DECLARE_TYPEINFO(QKeyCombination, Q_RELOCATABLE_TYPE);
diff --git a/src/corelib/global/qnamespace.qdoc b/src/corelib/global/qnamespace.qdoc
index 59a479d3d4..ddfade675a 100644
--- a/src/corelib/global/qnamespace.qdoc
+++ b/src/corelib/global/qnamespace.qdoc
@@ -1,30 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Copyright (C) 2020 Klaralvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2022 The Qt Company Ltd.
+// Copyright (C) 2020 Klaralvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
\namespace Qt
@@ -108,6 +84,19 @@
QCoreApplication::testAttribute().
+ \value [since 6.7] AA_QtQuickUseDefaultSizePolicy Qt Quick Layouts use the built-in size
+ policy of \l Item. For example, when this is set, \l Button fills the available
+ width, but has a fixed height. When this is not set, it will use the default
+ sizing behavior of the layout it's in, which is to use its implicit size as the
+ preferred size. This is explained in detail in \l {Specifying preferred size} and
+ \l {Size constraints}. When this is set, the default size policy of the item
+ with the layout can be overridden by explicitly setting
+ \l{Layout::fillWidth}{Layout.fillWidth} or
+ \l{Layout::fillHeight}{Layout.fillHeight}.
+ \b Note: This API is considered tech preview and may change or be removed in future
+ versions of Qt.
+
+
\value AA_DontShowIconsInMenus Actions with the Icon property won't be
shown in any menus unless specifically set by the
QAction::iconVisibleInMenu property.
@@ -118,9 +107,11 @@
\value AA_DontShowShortcutsInContextMenus Actions with the Shortcut property
won't be shown in any shortcut menus unless specifically set by the
QAction::shortcutVisibleInContextMenu property. This value was added
- in Qt 5.10, and defaults to the preference reported by the implementation
- of QPlatformIntegration::styleHint. To override the platform integration,
- set this attribute after QCoreApplication has been instantiated.
+ in Qt 5.10, and is by default based on the value reported by
+ QStyleHints::showShortcutsInContextMenus(). To override the default
+ behavior, set the style hint before QCoreApplication has been
+ instantiated, or set this attribute after QCoreApplication has
+ been instantiated.
\value AA_NativeWindows Ensures that widgets have native windows.
@@ -142,15 +133,15 @@
set to true won't be used as a native menubar (e.g, the menubar at
the top of the main screen on \macos).
- \value AA_MacDontSwapCtrlAndMeta Keyboard shortcuts on \macos are typically
+ \value AA_MacDontSwapCtrlAndMeta Keyboard shortcuts on Apple platforms are typically
based on the Command (or Cmd) keyboard modifier, represented by
the ⌘ symbol. For example, the 'Copy' action is Command+C (⌘+C).
To ease cross platform development Qt will by default remap Command
to the Qt::ControlModifier, to align with other platforms. This
allows creating keyboard shortcuts such as "Ctrl+J", which on
\macos will then map to Command+J, as expected by \macos users. The
- actual Control (or Ctrl) modifier on \macos, represented by ⌃, is
- mapped to Qt::MetaModifier.
+ actual Control (or Ctrl) modifier on Apple platforms, represented by ⌃,
+ is mapped to Qt::MetaModifier.
When this attribute is true Qt will not do the remapping, and pressing
the Command modifier will result in Qt::MetaModifier, while pressing
@@ -213,9 +204,9 @@
\value AA_UseStyleSheetPropagationInWidgetStyles By default, Qt Style Sheets
disable regular QWidget palette and font propagation. When this flag
- is enabled, font and palette changes propagate as though the user had
- manually called the corresponding QWidget methods. See
- \l{The Style Sheet Syntax#Inheritance}{The Style Sheet Syntax - Inheritance}
+ is enabled, font and palette changes done from a style sheet will propagate
+ a single time, when the style sheet is set.
+ See \l{The Style Sheet Syntax#Inheritance}{The Style Sheet Syntax - Inheritance}
for more details.
This value was added in Qt 5.7.
@@ -282,6 +273,17 @@
Currently supported on the Windows platform only.
This value was added in 5.15
+ \value AA_DontUseNativeMenuWindows Menu popup windows (e.g. context menus,
+ combo box menus, and non-native menubar menus) created while this
+ attribute is set to true will not be represented as native top
+ level windows, unless required by the implementation.
+ This value was added in Qt 6.8.
+
+ \value AA_DontUsePopupWindows When this attribute is set, popups will always appear
+ as items in the scene, rather than having their own dedicated windows.
+ Setting this attribute will only affect Qt Quick applications.
+ This value was added in Qt 6.8.
+
\omitvalue AA_AttributeCount
\omitvalue AA_EnableHighDpiScaling
\omitvalue AA_UseHighDpiPixmaps
@@ -639,7 +641,7 @@
connection types, using a bitwise OR. When Qt::UniqueConnection is
set, QObject::connect() will fail if the connection already exists
(i.e. if the same signal is already connected to the same slot
- for the same pair of objects). This flag was introduced in Qt 4.6.
+ for the same pair of objects).
\value SingleShotConnection
This is a flag that can be combined with any one of the above
@@ -752,15 +754,25 @@
Mean Time has zero offset from it. Neither UTC nor OffsetFromUTC
has any transitions.
+ When specifying a datetime using OffsetFromUTC, the offset from UTC must
+ also be supplied (it is measured in seconds). To specify a datetime using
+ TimeZone, a QTimeZone must be supplied. From Qt 6.5, a QTimeZone can now
+ package a timespec with, where needed, an offset as a lightweight time
+ description, so that passing a QTimeZone now provides a uniform way to use
+ datetime APIs, saving the need to call them differently for different
+ timespecs.
+
\note After a change to the system time-zone setting, the behavior
of LocalTime-based QDateTime objects created before the change is
undefined: QDateTime may have cached data that the change
- invalidates. (This is not triggered by transitions of the system
+ invalidates. (This is not triggered by \e transitions of the system
time-zone.) In long-running processes, updates to the system's
time-zone data (e.g. when politicians change the rules for a zone)
may likewise lead to conflicts between the updated time-zone
information and data cached by QDateTime objects created before
the update, using either LocalTime or TimeZone.
+
+ \sa QTimeZone, QDateTime
*/
/*!
@@ -798,14 +810,29 @@
/*!
\enum Qt::DockWidgetArea
- \value LeftDockWidgetArea
- \value RightDockWidgetArea
- \value TopDockWidgetArea
- \value BottomDockWidgetArea
- \value AllDockWidgetAreas
- \value NoDockWidgetArea
+ Represents the areas a QDockWidget can be plugged to.
+ \note A floating dock widget with tabs can be docked anywhere.
+
+ \value LeftDockWidgetArea The left dock area of a QMainWindow.
+ \value RightDockWidgetArea The right dock area of a QMainWindow.
+ \value TopDockWidgetArea The top dock area of a QMainWindow.
+ \value BottomDockWidgetArea The bottom dock area of a QMainWindow.
+ \value AllDockWidgetAreas All dock widget areas (default).
+ \value NoDockWidgetArea No dock widget areas.
\omitvalue DockWidgetArea_Mask
+ \sa QDockWidget::setAllowedAreas, QDockWidget::isAreaAllowed
+*/
+
+/*!
+ \enum Qt::ColorScheme
+
+ Represents the appearance of an application's theme,
+ defined by QGuiApplication::palette().
+
+ \value Unknown The appearance is unknown.
+ \value Light The background colors are lighter than the text color, i.e. the theme is light.
+ \value Dark The background colors are darker than the text color, i.e. the theme is dark.
*/
/*!
@@ -977,8 +1004,7 @@
\value WA_Hover Forces Qt to generate paint events when the mouse
enters or leaves the widget. This feature is typically used when
- implementing custom styles; see the \l{widgets/styles}{Styles}
- example for details.
+ implementing custom styles.
\value WA_InputMethodEnabled Enables input methods for Asian languages.
Must be set when creating custom text editing widgets.
@@ -1303,7 +1329,7 @@
to this top level window. This attribute has no effect on non-X11
platforms.
- \value WA_AlwaysStackOnTop Since Qt 5.4, this value forces QOpenGLWidget and
+ \value [since 5.4] WA_AlwaysStackOnTop Forces QOpenGLWidget and
QQuickWidget to be drawn last, on top of other widgets. Ignored for other
type of widgets. Setting this attribute breaks the stacking order, but
allows having a semi-transparent OpenGL widget with other widgets visible
@@ -1439,6 +1465,7 @@
\value Key_Help
\value Key_Direction_L
\value Key_Direction_R
+
\value Key_Space
\value Key_Any
\value Key_Exclam
@@ -1530,7 +1557,8 @@
\value Key_twosuperior
\value Key_threesuperior
\value Key_acute
- \value Key_mu
+ \value [since 6.7] Key_micro
+ \value Key_mu Deprecated alias for Key_micro
\value Key_paragraph
\value Key_periodcentered
\value Key_cedilla
@@ -1575,6 +1603,7 @@
\value Key_ssharp
\value Key_division
\value Key_ydiaeresis
+
\value Key_Multi_key
\value Key_Codeinput
\value Key_SingleCandidate
@@ -2222,11 +2251,17 @@
you call QWidget::activateWindow() manually).
\value FramelessWindowHint Produces a borderless window.
- The user cannot move or resize a borderless window via the window
- system. On X11, the result of the flag is dependent on the window manager and its
+
+ On X11, the result of the flag is dependent on the window manager and its
ability to understand Motif and/or NETWM hints. Most existing
modern window managers can handle this.
+ \note If the window manager relies on the frame to interactively manipulate
+ the window, the user can no longer move or resize the window via the window
+ system, but this side effect should not be relied on. To produce a fixed
+ size window that can not be resized, please set QWindow::setMinimumSize()
+ and QWindow::setMaximumSize() to the same size.
+
\value NoDropShadowWindowHint Disables window drop shadow on supporting platforms.
The \c CustomizeWindowHint flag is used to enable customization of
@@ -2761,8 +2796,7 @@
\value CheckStateRole This role is used to obtain the checked state of
an item. (Qt::CheckState)
\value InitialSortOrderRole This role is used to obtain the initial sort order
- of a header view section. (Qt::SortOrder). This
- role was introduced in Qt 4.8.
+ of a header view section. (Qt::SortOrder).
Accessibility roles (with associated types):
@@ -2865,7 +2899,10 @@
\value ElideLeft The ellipsis should appear at the beginning of the text.
\value ElideRight The ellipsis should appear at the end of the text.
\value ElideMiddle The ellipsis should appear in the middle of the text.
- \value ElideNone Ellipsis should NOT appear in the text.
+ \value ElideNone Ellipsis should NOT appear in the text. When passed to functions such as
+ QFontMetrics::elidedText(), this will cause the full string to return unless
+ the text contains multi-length variants. Elision in this case must be done
+ by clipping to the component width.
Qt::ElideMiddle is normally the most appropriate choice for URLs (e.g.,
"\l{http://bugreports.qt.io/browse/QTWEBSITE-13}{http://bugreports.qt.../QTWEBSITE-13/}"),
@@ -3030,6 +3067,11 @@
*/
/*!
+ \enum Qt::Disambiguated_t
+ \internal
+*/
+
+/*!
\enum Qt::CoordinateSystem
\since 4.6
@@ -3110,8 +3152,8 @@
the Qt::GestureStarted state and ending with a gesture in the
Qt::GestureFinished or Qt::GestureCanceled states.
- \value IgnoredGesturesPropagateToParent Since Qt 4.7, this flag allows you
- to fine-tune gesture event propagation. By setting the flag when
+ \value [since 4.7] IgnoredGesturesPropagateToParent Allows fine-tuning of
+ gesture event propagation. By setting the flag when
\l{QGraphicsObject::grabGesture()}{grabbing} a gesture all ignored partial
gestures will propagate to their parent items.
@@ -3199,6 +3241,26 @@
*/
/*!
+ \enum Qt::TimerId
+ \since 6.8
+ \relates QObject
+ \relates QTimer
+ \relates QChronoTimer
+
+ This is used to represent timer IDs (for example, QTimer and QChronoTimer).
+ The underlying type is \c int. You can use \l qToUnderlying() to convert
+ Qt::TimerId to \c int.
+
+ \value Invalid Represents a no-op timer ID; it's usage depends on the
+ context, for example, this is the value returned by QObject::startTimer()
+ to indicate it failed to start a timer; whereas QChronoTimer::id() returns
+ this value when the timer is inactive, that is, \c timer.isActive()
+ returns \c false.
+
+ \sa QTimer::id(), QChronoTimer::id(), QObject::startTimer()
+*/
+
+/*!
\enum Qt::ScrollPhase
\since 5.2
@@ -3294,6 +3356,38 @@
*/
/*!
+ \enum Qt::PermissionStatus
+
+ This enum describes the possible statuses of a permissions.
+
+ \value Undetermined
+ The permission status is not yet known. Permission should be requested
+ via QCoreApplication::requestPermission() to determine the actual status.
+ This status will never be the result of requesting a permission.
+
+ \value Granted
+ The user has explicitly granted the application the permission,
+ or the permission is known to not require user authorization on
+ the given platform.
+
+ \value Denied
+ The user has explicitly denied the application the requested permission,
+ or the permission is known to not be accessible or applicable to applications
+ on the given platform.
+
+ \note On Android, there is no \c Undetermined status by the platform's APIs.
+ Thus, if a permission is denied for an app,
+ \l QCoreApplication::checkPermission() returns \c Undetermined
+ by default until \l QCoreApplication::requestPermission() is called.
+ After that \l QCoreApplication::checkPermission() reports a non \c Undetermined
+ status.
+
+ \since 6.5
+ \sa QCoreApplication::requestPermission(), QCoreApplication::checkPermission(),
+ {Application Permissions}
+*/
+
+/*!
\enum Qt::ReturnByValueConstant
\since 5.15
@@ -3313,6 +3407,8 @@
\since 6.0
\brief The QKeyCombination class stores a combination of a key with optional modifiers.
+ \compares equality
+
The QKeyCombination class can be used to represent a combination of a key
with zero or more keyboard modifiers.
@@ -3395,14 +3491,14 @@
#endif
/*!
- \fn bool QKeyCombination::operator==(QKeyCombination lhs, QKeyCombination rhs) noexcept
+ \fn bool QKeyCombination::operator==(const QKeyCombination &lhs, const QKeyCombination &rhs)
Returns \c true if \a lhs and \a rhs have the same combination
of key and modifiers, and \c false otherwise.
*/
/*!
- \fn bool QKeyCombination::operator!=(QKeyCombination lhs, QKeyCombination rhs) noexcept
+ \fn bool QKeyCombination::operator!=(const QKeyCombination &lhs, const QKeyCombination &rhs)
Returns \c true if \a lhs and \a rhs have different combinations
of key and modifiers, otherwise \c false.
diff --git a/src/corelib/global/qnativeinterface.h b/src/corelib/global/qnativeinterface.h
index bc25600efc..89f33651c5 100644
--- a/src/corelib/global/qnativeinterface.h
+++ b/src/corelib/global/qnativeinterface.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QNATIVEINTERFACE_H
#define QNATIVEINTERFACE_H
diff --git a/src/corelib/global/qnativeinterface_p.h b/src/corelib/global/qnativeinterface_p.h
index 65332eeecb..aa7705e153 100644
--- a/src/corelib/global/qnativeinterface_p.h
+++ b/src/corelib/global/qnativeinterface_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QNATIVEINTERFACE_P_H
#define QNATIVEINTERFACE_P_H
@@ -51,13 +15,13 @@
// We mean it.
//
-#include <QtCore/qglobal.h>
+#include <QtCore/private/qglobal_p.h>
#include <QtCore/qloggingcategory.h>
QT_BEGIN_NAMESPACE
namespace QtPrivate {
-Q_CORE_EXPORT Q_DECLARE_LOGGING_CATEGORY(lcNativeInterface)
+Q_DECLARE_EXPORTED_LOGGING_CATEGORY(lcNativeInterface, Q_CORE_EXPORT)
}
// Provides a definition for the interface destructor
diff --git a/src/corelib/global/qnumeric.cpp b/src/corelib/global/qnumeric.cpp
index 63055a0b61..a46039c5da 100644
--- a/src/corelib/global/qnumeric.cpp
+++ b/src/corelib/global/qnumeric.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2019 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2019 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qnumeric.h"
#include "qnumeric_p.h"
@@ -44,61 +8,72 @@
QT_BEGIN_NAMESPACE
/*!
+ \headerfile <QtNumeric>
+ \inmodule QtCore
+ \title Qt Numeric Functions
+
+ \brief The <QtNumeric> header file provides common numeric functions.
+
+ The <QtNumeric> header file contains various numeric functions
+ for comparing and adjusting a numeric value.
+*/
+
+/*!
Returns \c true if the double \a {d} is equivalent to infinity.
- \relates <QtGlobal>
+ \relates <QtNumeric>
\sa qInf()
*/
Q_CORE_EXPORT bool qIsInf(double d) { return qt_is_inf(d); }
/*!
Returns \c true if the double \a {d} is not a number (NaN).
- \relates <QtGlobal>
+ \relates <QtNumeric>
*/
Q_CORE_EXPORT bool qIsNaN(double d) { return qt_is_nan(d); }
/*!
Returns \c true if the double \a {d} is a finite number.
- \relates <QtGlobal>
+ \relates <QtNumeric>
*/
Q_CORE_EXPORT bool qIsFinite(double d) { return qt_is_finite(d); }
/*!
Returns \c true if the float \a {f} is equivalent to infinity.
- \relates <QtGlobal>
+ \relates <QtNumeric>
\sa qInf()
*/
Q_CORE_EXPORT bool qIsInf(float f) { return qt_is_inf(f); }
/*!
Returns \c true if the float \a {f} is not a number (NaN).
- \relates <QtGlobal>
+ \relates <QtNumeric>
*/
Q_CORE_EXPORT bool qIsNaN(float f) { return qt_is_nan(f); }
/*!
Returns \c true if the float \a {f} is a finite number.
- \relates <QtGlobal>
+ \relates <QtNumeric>
*/
Q_CORE_EXPORT bool qIsFinite(float f) { return qt_is_finite(f); }
#if QT_CONFIG(signaling_nan)
/*!
Returns the bit pattern of a signalling NaN as a double.
- \relates <QtGlobal>
+ \relates <QtNumeric>
*/
Q_CORE_EXPORT double qSNaN() { return qt_snan(); }
#endif
/*!
Returns the bit pattern of a quiet NaN as a double.
- \relates <QtGlobal>
+ \relates <QtNumeric>
\sa qIsNaN()
*/
Q_CORE_EXPORT double qQNaN() { return qt_qnan(); }
/*!
Returns the bit pattern for an infinite number as a double.
- \relates <QtGlobal>
+ \relates <QtNumeric>
\sa qIsInf()
*/
Q_CORE_EXPORT double qInf() { return qt_inf(); }
@@ -107,7 +82,7 @@ Q_CORE_EXPORT double qInf() { return qt_inf(); }
\fn int qFpClassify(double val)
\fn int qFpClassify(float val)
- \relates <QtGlobal>
+ \relates <QtNumeric>
Classifies a floating-point value.
The return values are defined in \c{<cmath>}: returns one of the following,
@@ -159,7 +134,7 @@ static inline quint32 f2i(float f)
\sa qFuzzyCompare()
\since 5.2
- \relates <QtGlobal>
+ \relates <QtNumeric>
*/
Q_CORE_EXPORT quint32 qFloatDistance(float a, float b)
{
@@ -217,7 +192,7 @@ static inline quint64 d2i(double d)
\sa qFuzzyCompare()
\since 5.2
- \relates <QtGlobal>
+ \relates <QtNumeric>
*/
Q_CORE_EXPORT quint64 qFloatDistance(double a, double b)
{
@@ -256,6 +231,7 @@ Q_CORE_EXPORT quint64 qFloatDistance(double a, double b)
/*!
\fn template<typename T> bool qAddOverflow(T v1, T v2, T *result)
+ \relates <QtNumeric>
\since 6.1
Adds two values \a v1 and \a v2, of a numeric type \c T and records the
@@ -287,6 +263,7 @@ Q_CORE_EXPORT quint64 qFloatDistance(double a, double b)
/*!
\fn template<typename T> bool qSubOverflow(T v1, T v2, T *result)
+ \relates <QtNumeric>
\since 6.1
Subtracts \a v2 from \a v1 and records the resulting value in \a result. If
@@ -318,6 +295,7 @@ Q_CORE_EXPORT quint64 qFloatDistance(double a, double b)
/*!
\fn template<typename T> bool qMulOverflow(T v1, T v2, T *result)
+ \relates <QtNumeric>
\since 6.1
Multiplies \a v1 and \a v2, and records the resulting value in \a result. If
@@ -349,4 +327,170 @@ Q_CORE_EXPORT quint64 qFloatDistance(double a, double b)
This can be faster than calling the version with only variable arguments.
*/
+/*! \fn template <typename T> T qAbs(const T &t)
+ \relates <QtNumeric>
+
+ Compares \a t to the 0 of type T and returns the absolute
+ value. Thus if T is \e {double}, then \a t is compared to
+ \e{(double) 0}.
+
+ Example:
+
+ \snippet code/src_corelib_global_qglobal.cpp 10
+*/
+
+/*! \fn int qRound(double d)
+ \relates <QtNumeric>
+
+ Rounds \a d to the nearest integer.
+
+ Rounds half away from zero (e.g. 0.5 -> 1, -0.5 -> -1).
+
+ \note This function does not guarantee correctness for high precisions.
+
+ Example:
+
+ \snippet code/src_corelib_global_qglobal.cpp 11A
+
+ \note If the value \a d is outside the range of \c int,
+ the behavior is undefined.
+*/
+
+/*! \fn int qRound(float d)
+ \relates <QtNumeric>
+
+ Rounds \a d to the nearest integer.
+
+ Rounds half away from zero (e.g. 0.5f -> 1, -0.5f -> -1).
+
+ \note This function does not guarantee correctness for high precisions.
+
+ Example:
+
+ \snippet code/src_corelib_global_qglobal.cpp 11B
+
+ \note If the value \a d is outside the range of \c int,
+ the behavior is undefined.
+*/
+
+/*! \fn qint64 qRound64(double d)
+ \relates <QtNumeric>
+
+ Rounds \a d to the nearest 64-bit integer.
+
+ Rounds half away from zero (e.g. 0.5 -> 1, -0.5 -> -1).
+
+ \note This function does not guarantee correctness for high precisions.
+
+ Example:
+
+ \snippet code/src_corelib_global_qglobal.cpp 12A
+
+ \note If the value \a d is outside the range of \c qint64,
+ the behavior is undefined.
+*/
+
+/*! \fn qint64 qRound64(float d)
+ \relates <QtNumeric>
+
+ Rounds \a d to the nearest 64-bit integer.
+
+ Rounds half away from zero (e.g. 0.5f -> 1, -0.5f -> -1).
+
+ \note This function does not guarantee correctness for high precisions.
+
+ Example:
+
+ \snippet code/src_corelib_global_qglobal.cpp 12B
+
+ \note If the value \a d is outside the range of \c qint64,
+ the behavior is undefined.
+*/
+
+/*!
+ \fn bool qFuzzyCompare(double p1, double p2)
+ \relates <QtNumeric>
+ \since 4.4
+ \threadsafe
+
+ Compares the floating point value \a p1 and \a p2 and
+ returns \c true if they are considered equal, otherwise \c false.
+
+ Note that comparing values where either \a p1 or \a p2 is 0.0 will not work,
+ nor does comparing values where one of the values is NaN or infinity.
+ If one of the values is always 0.0, use qFuzzyIsNull instead. If one of the
+ values is likely to be 0.0, one solution is to add 1.0 to both values.
+
+ \snippet code/src_corelib_global_qglobal.cpp 46
+
+ The two numbers are compared in a relative way, where the
+ exactness is stronger the smaller the numbers are.
+*/
+
+/*!
+ \fn bool qFuzzyCompare(float p1, float p2)
+ \relates <QtNumeric>
+ \since 4.4
+ \threadsafe
+
+ Compares the floating point value \a p1 and \a p2 and
+ returns \c true if they are considered equal, otherwise \c false.
+
+ The two numbers are compared in a relative way, where the
+ exactness is stronger the smaller the numbers are.
+*/
+
+/*!
+ \fn bool qFuzzyIsNull(double d)
+ \relates <QtNumeric>
+ \since 4.4
+ \threadsafe
+
+ Returns true if the absolute value of \a d is within 0.000000000001 of 0.0.
+*/
+
+/*!
+ \fn bool qFuzzyIsNull(float f)
+ \relates <QtNumeric>
+ \since 4.4
+ \threadsafe
+
+ Returns true if the absolute value of \a f is within 0.00001f of 0.0.
+*/
+
+namespace QtNumericTests {
+
+template <typename T> static constexpr T max = std::numeric_limits<T>::max();
+template <typename T> static constexpr T min = std::numeric_limits<T>::min();
+
+static_assert(qt_saturate<short>(max<unsigned>) == max<short>);
+static_assert(qt_saturate<int>(max<unsigned>) == max<int>);
+static_assert(qt_saturate<qint64>(max<unsigned>) == qint64(max<unsigned>));
+
+static_assert(qt_saturate<short>(max<int>) == max<short>);
+static_assert(qt_saturate<unsigned>(max<int>) == unsigned(max<int>));
+static_assert(qt_saturate<qint64>(max<int>) == qint64(max<int>));
+
+static_assert(qt_saturate<short>(max<qint64>) == max<short>);
+static_assert(qt_saturate<int>(max<qint64>) == max<int>);
+static_assert(qt_saturate<unsigned>(max<qint64>) == max<unsigned>);
+static_assert(qt_saturate<quint64>(max<qint64>) == quint64(max<qint64>));
+
+static_assert(qt_saturate<short>(max<quint64>) == max<short>);
+static_assert(qt_saturate<int>(max<quint64>) == max<int>);
+static_assert(qt_saturate<unsigned>(max<quint64>) == max<unsigned>);
+static_assert(qt_saturate<qint64>(max<quint64>) == max<qint64>);
+
+static_assert(qt_saturate<short>(min<int>) == min<short>);
+static_assert(qt_saturate<qint64>(min<int>) == qint64(min<int>));
+static_assert(qt_saturate<unsigned>(min<int>) == 0);
+static_assert(qt_saturate<quint64>(min<int>) == 0);
+
+static_assert(qt_saturate<short>(min<qint64>) == min<short>);
+static_assert(qt_saturate<int>(min<qint64>) == min<int>);
+static_assert(qt_saturate<unsigned>(min<qint64>) == 0);
+static_assert(qt_saturate<quint64>(min<qint64>) == 0);
+
+} // namespace QtNumericTests
+
QT_END_NAMESPACE
diff --git a/src/corelib/global/qnumeric.h b/src/corelib/global/qnumeric.h
index 49d795902c..2238c13da0 100644
--- a/src/corelib/global/qnumeric.h
+++ b/src/corelib/global/qnumeric.h
@@ -1,46 +1,17 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QNUMERIC_H
#define QNUMERIC_H
-#include <QtCore/qglobal.h>
+#if 0
+#pragma qt_class(QtNumeric)
+#endif
+
+#include <QtCore/qtconfigmacros.h>
+#include <QtCore/qtcoreexports.h>
+#include <QtCore/qtypes.h>
+
#include <cmath>
#include <limits>
#include <type_traits>
@@ -114,11 +85,9 @@ Q_CORE_EXPORT quint64 qFloatDistance(double a, double b);
// size_t. Implementations for 8- and 16-bit types will work but may not be as
// efficient. Implementations for 64-bit may be missing on 32-bit platforms.
-#if (((defined(Q_CC_INTEL) ? (Q_CC_INTEL >= 1800 && !defined(Q_OS_WIN)) : defined(Q_CC_GNU)) \
- && Q_CC_GNU >= 500) \
- || __has_builtin(__builtin_add_overflow)) \
+#if (Q_CC_GNU >= 500 || __has_builtin(__builtin_add_overflow)) \
&& !(QT_POINTER_SIZE == 4 && defined(Q_CC_CLANG))
-// GCC 5, ICC 18, and Clang 3.8 have builtins to detect overflows
+// GCC 5 and Clang 3.8 have builtins to detect overflows
// 32 bit Clang has the builtins but tries to link a library which hasn't
#define Q_INTRINSIC_MUL_OVERFLOW64
@@ -219,7 +188,7 @@ qMulOverflow(T v1, T v2, T *r)
typename LargerInt::Signed, typename LargerInt::Unsigned>;
Larger lr = Larger(v1) * Larger(v2);
*r = T(lr);
- return lr > std::numeric_limits<T>::max() || lr < std::numeric_limits<T>::min();
+ return lr > (std::numeric_limits<T>::max)() || lr < (std::numeric_limits<T>::min)();
}
# if defined(Q_INTRINSIC_MUL_OVERFLOW64)
@@ -324,15 +293,15 @@ template <typename T, T V2> bool qMulOverflow(T v1, std::integral_constant<T, V2
} else if constexpr (V2 == -1) {
// multiplication by -1 is valid *except* for signed minimum values
// (necessary to avoid diving min() by -1, which is an overflow)
- if (v1 < 0 && v1 == std::numeric_limits<T>::min())
+ if (v1 < 0 && v1 == (std::numeric_limits<T>::min)())
return true;
*r = -v1;
return false;
} else {
// For 64-bit multiplications on 32-bit platforms, let's instead compare v1
// against the bounds that would overflow.
- constexpr T Highest = std::numeric_limits<T>::max() / V2;
- constexpr T Lowest = std::numeric_limits<T>::min() / V2;
+ constexpr T Highest = (std::numeric_limits<T>::max)() / V2;
+ constexpr T Lowest = (std::numeric_limits<T>::min)() / V2;
if constexpr (Highest > Lowest) {
if (v1 > Highest || v1 < Lowest)
return true;
@@ -350,9 +319,91 @@ template <typename T, T V2> bool qMulOverflow(T v1, std::integral_constant<T, V2
template <auto V2, typename T> bool qMulOverflow(T v1, T *r)
{
+ if constexpr (V2 == 2)
+ return qAddOverflow(v1, v1, r);
return qMulOverflow(v1, std::integral_constant<T, V2>{}, r);
}
+template <typename T>
+constexpr inline T qAbs(const T &t) { return t >= 0 ? t : -t; }
+
+// gcc < 10 doesn't have __has_builtin
+#if defined(Q_PROCESSOR_ARM_64) && (__has_builtin(__builtin_round) || defined(Q_CC_GNU)) && !defined(Q_CC_CLANG)
+// ARM64 has a single instruction that can do C++ rounding with conversion to integer.
+// Note current clang versions have non-constexpr __builtin_round, ### allow clang this path when they fix it.
+constexpr inline int qRound(double d)
+{ return int(__builtin_round(d)); }
+constexpr inline int qRound(float f)
+{ return int(__builtin_roundf(f)); }
+constexpr inline qint64 qRound64(double d)
+{ return qint64(__builtin_round(d)); }
+constexpr inline qint64 qRound64(float f)
+{ return qint64(__builtin_roundf(f)); }
+#elif defined(__SSE2__) && (__has_builtin(__builtin_copysign) || defined(Q_CC_GNU))
+// SSE has binary operations directly on floating point making copysign fast
+constexpr inline int qRound(double d)
+{ return int(d + __builtin_copysign(0.5, d)); }
+constexpr inline int qRound(float f)
+{ return int(f + __builtin_copysignf(0.5f, f)); }
+constexpr inline qint64 qRound64(double d)
+{ return qint64(d + __builtin_copysign(0.5, d)); }
+constexpr inline qint64 qRound64(float f)
+{ return qint64(f + __builtin_copysignf(0.5f, f)); }
+#else
+constexpr inline int qRound(double d)
+{ return d >= 0.0 ? int(d + 0.5) : int(d - 0.5); }
+constexpr inline int qRound(float d)
+{ return d >= 0.0f ? int(d + 0.5f) : int(d - 0.5f); }
+
+constexpr inline qint64 qRound64(double d)
+{ return d >= 0.0 ? qint64(d + 0.5) : qint64(d - 0.5); }
+constexpr inline qint64 qRound64(float d)
+{ return d >= 0.0f ? qint64(d + 0.5f) : qint64(d - 0.5f); }
+#endif
+
+namespace QtPrivate {
+template <typename T>
+constexpr inline const T &min(const T &a, const T &b) { return (a < b) ? a : b; }
+}
+
+[[nodiscard]] constexpr bool qFuzzyCompare(double p1, double p2)
+{
+ return (qAbs(p1 - p2) * 1000000000000. <= QtPrivate::min(qAbs(p1), qAbs(p2)));
+}
+
+[[nodiscard]] constexpr bool qFuzzyCompare(float p1, float p2)
+{
+ return (qAbs(p1 - p2) * 100000.f <= QtPrivate::min(qAbs(p1), qAbs(p2)));
+}
+
+[[nodiscard]] constexpr bool qFuzzyIsNull(double d)
+{
+ return qAbs(d) <= 0.000000000001;
+}
+
+[[nodiscard]] constexpr bool qFuzzyIsNull(float f)
+{
+ return qAbs(f) <= 0.00001f;
+}
+
+QT_WARNING_PUSH
+QT_WARNING_DISABLE_FLOAT_COMPARE
+
+[[nodiscard]] constexpr bool qIsNull(double d) noexcept
+{
+ return d == 0.0;
+}
+
+[[nodiscard]] constexpr bool qIsNull(float f) noexcept
+{
+ return f == 0.0f;
+}
+
+QT_WARNING_POP
+
+inline int qIntCast(double f) { return int(f); }
+inline int qIntCast(float f) { return int(f); }
+
QT_END_NAMESPACE
#endif // QNUMERIC_H
diff --git a/src/corelib/global/qnumeric_p.h b/src/corelib/global/qnumeric_p.h
index 823a1812de..d40e6b964b 100644
--- a/src/corelib/global/qnumeric_p.h
+++ b/src/corelib/global/qnumeric_p.h
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Copyright (C) 2020 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// Copyright (C) 2021 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QNUMERIC_P_H
#define QNUMERIC_P_H
@@ -54,11 +18,16 @@
#include "QtCore/private/qglobal_p.h"
#include "QtCore/qnumeric.h"
+#include "QtCore/qsimd.h"
#include <cmath>
#include <limits>
#include <type_traits>
-#if !defined(Q_CC_MSVC) && (defined(Q_OS_QNX) || defined(Q_CC_INTEL))
+#ifndef __has_extension
+# define __has_extension(X) 0
+#endif
+
+#if !defined(Q_CC_MSVC) && defined(Q_OS_QNX)
# include <math.h>
# ifdef isnan
# define QT_MATH_H_DEFINES_MACROS
@@ -86,6 +55,8 @@ QT_END_NAMESPACE
QT_BEGIN_NAMESPACE
+class qfloat16;
+
namespace qnumeric_std_wrapper {
#if defined(QT_MATH_H_DEFINES_MACROS)
# undef QT_MATH_H_DEFINES_MACROS
@@ -173,22 +144,38 @@ Q_DECL_CONST_FUNCTION static inline int qt_fpclassify(float f)
return qnumeric_std_wrapper::fpclassify(f);
}
-#ifndef Q_CLANG_QDOC
+#ifndef Q_QDOC
namespace {
/*!
Returns true if the double \a v can be converted to type \c T, false if
it's out of range. If the conversion is successful, the converted value is
stored in \a value; if it was not successful, \a value will contain the
minimum or maximum of T, depending on the sign of \a d. If \c T is
- unsigned, then \a value contains the absolute value of \a v.
+ unsigned, then \a value contains the absolute value of \a v. If \c T is \c
+ float, an underflow is also signalled by returning false and setting \a
+ value to zero.
This function works for v containing infinities, but not NaN. It's the
caller's responsibility to exclude that possibility before calling it.
*/
-template<typename T>
-static inline bool convertDoubleTo(double v, T *value, bool allow_precision_upgrade = true)
+template <typename T> static inline std::enable_if_t<std::is_integral_v<T>, bool>
+convertDoubleTo(double v, T *value, bool allow_precision_upgrade = true)
{
- static_assert(std::numeric_limits<T>::is_integer);
+ static_assert(std::is_integral_v<T>);
+ constexpr bool TypeIsLarger = std::numeric_limits<T>::digits > std::numeric_limits<double>::digits;
+
+ if constexpr (TypeIsLarger) {
+ using S = std::make_signed_t<T>;
+ constexpr S max_mantissa = S(1) << std::numeric_limits<double>::digits;
+ // T has more bits than double's mantissa, so don't allow "upgrading"
+ // to T (makes it look like the number had more precision than really
+ // was transmitted)
+ if (!allow_precision_upgrade && !(v <= double(max_mantissa) && v >= double(-max_mantissa - 1)))
+ return false;
+ }
+
+ constexpr T Tmin = (std::numeric_limits<T>::min)();
+ constexpr T Tmax = (std::numeric_limits<T>::max)();
// The [conv.fpint] (7.10 Floating-integral conversions) section of the C++
// standard says only exact conversions are guaranteed. Converting
@@ -200,23 +187,90 @@ static inline bool convertDoubleTo(double v, T *value, bool allow_precision_upgr
// correct, but Clang, ICC and MSVC don't realize that it's a constant and
// the math call stays in the compiled code.
+#if defined(Q_PROCESSOR_X86_64) && defined(__SSE2__)
+ // Of course, UB doesn't apply if we use intrinsics, in which case we are
+ // allowed to dpeend on exactly the processor's behavior. This
+ // implementation uses the truncating conversions from Scalar Double to
+ // integral types (CVTTSD2SI and VCVTTSD2USI), which is documented to
+ // return the "indefinite integer value" if the range of the target type is
+ // exceeded. (only implemented for x86-64 to avoid having to deal with the
+ // non-existence of the 64-bit intrinsics on i386)
+
+ if (std::numeric_limits<T>::is_signed) {
+ __m128d mv = _mm_set_sd(v);
+# ifdef __AVX512F__
+ // use explicit round control and suppress exceptions
+ if (sizeof(T) > 4)
+ *value = T(_mm_cvtt_roundsd_i64(mv, _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC));
+ else
+ *value = _mm_cvtt_roundsd_i32(mv, _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC);
+# else
+ *value = sizeof(T) > 4 ? T(_mm_cvttsd_si64(mv)) : _mm_cvttsd_si32(mv);
+# endif
+
+ // if *value is the "indefinite integer value", check if the original
+ // variable \a v is the same value (Tmin is an exact representation)
+ if (*value == Tmin && !_mm_ucomieq_sd(mv, _mm_set_sd(Tmin))) {
+ // v != Tmin, so it was out of range
+ if (v > 0)
+ *value = Tmax;
+ return false;
+ }
+
+ // convert the integer back to double and compare for equality with v,
+ // to determine if we've lost any precision
+ __m128d mi = _mm_setzero_pd();
+ mi = sizeof(T) > 4 ? _mm_cvtsi64_sd(mv, *value) : _mm_cvtsi32_sd(mv, *value);
+ return _mm_ucomieq_sd(mv, mi);
+ }
+
+# ifdef __AVX512F__
+ if (!std::numeric_limits<T>::is_signed) {
+ // Same thing as above, but this function operates on absolute values
+ // and the "indefinite integer value" for the 64-bit unsigned
+ // conversion (Tmax) is not representable in double, so it can never be
+ // the result of an in-range conversion. This is implemented for AVX512
+ // and later because of the unsigned conversion instruction. Converting
+ // to unsigned without losing an extra bit of precision prior to AVX512
+ // is left to the compiler below.
+
+ v = fabs(v);
+ __m128d mv = _mm_set_sd(v);
+
+ // use explicit round control and suppress exceptions
+ if (sizeof(T) > 4)
+ *value = T(_mm_cvtt_roundsd_u64(mv, _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC));
+ else
+ *value = _mm_cvtt_roundsd_u32(mv, _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC);
+
+ if (*value == Tmax) {
+ // no double can have an exact value of quint64(-1), but they can
+ // quint32(-1), so we need to compare for that
+ if (TypeIsLarger || _mm_ucomieq_sd(mv, _mm_set_sd(Tmax)))
+ return false;
+ }
+
+ // return true if it was an exact conversion
+ __m128d mi = _mm_setzero_pd();
+ mi = sizeof(T) > 4 ? _mm_cvtu64_sd(mv, *value) : _mm_cvtu32_sd(mv, *value);
+ return _mm_ucomieq_sd(mv, mi);
+ }
+# endif
+#endif
+
double supremum;
if (std::numeric_limits<T>::is_signed) {
- supremum = -1.0 * std::numeric_limits<T>::min(); // -1 * (-2^63) = 2^63, exact (for T = qint64)
- *value = std::numeric_limits<T>::min();
- if (v < std::numeric_limits<T>::min())
+ supremum = -1.0 * Tmin; // -1 * (-2^63) = 2^63, exact (for T = qint64)
+ *value = Tmin;
+ if (v < Tmin)
return false;
} else {
using ST = typename std::make_signed<T>::type;
- supremum = -2.0 * std::numeric_limits<ST>::min(); // -2 * (-2^63) = 2^64, exact (for T = quint64)
+ supremum = -2.0 * (std::numeric_limits<ST>::min)(); // -2 * (-2^63) = 2^64, exact (for T = quint64)
v = fabs(v);
}
- if (std::is_integral<T>::value && sizeof(T) > 4 && !allow_precision_upgrade) {
- if (v > double(Q_INT64_C(1)<<53) || v < double(-((Q_INT64_C(1)<<53) + 1)))
- return false;
- }
- *value = std::numeric_limits<T>::max();
+ *value = Tmax;
if (v >= supremum)
return false;
@@ -231,6 +285,116 @@ QT_WARNING_DISABLE_FLOAT_COMPARE
QT_WARNING_POP
}
+template <typename T> static
+std::enable_if_t<std::is_floating_point_v<T> || std::is_same_v<T, qfloat16>, bool>
+convertDoubleTo(double v, T *value, bool allow_precision_upgrade = true)
+{
+ Q_UNUSED(allow_precision_upgrade);
+ constexpr T Huge = std::numeric_limits<T>::infinity();
+
+ if constexpr (std::numeric_limits<double>::max_exponent <=
+ std::numeric_limits<T>::max_exponent) {
+ // no UB can happen
+ *value = T(v);
+ return true;
+ }
+
+#if defined(__SSE2__) && (defined(Q_CC_GNU) || __has_extension(gnu_asm))
+ // The x86 CVTSD2SH instruction from SSE2 does what we want:
+ // - converts out-of-range doubles to ±infinity and sets #O
+ // - converts underflows to zero and sets #U
+ // We need to clear any previously-stored exceptions from it before the
+ // operation (3-cycle cost) and obtain the new state afterwards (1 cycle).
+
+ unsigned csr = _MM_MASK_MASK; // clear stored exception indicators
+ auto sse_check_result = [&](auto result) {
+ if ((csr & (_MM_EXCEPT_UNDERFLOW | _MM_EXCEPT_OVERFLOW)) == 0)
+ return true;
+ if (csr & _MM_EXCEPT_OVERFLOW)
+ return false;
+
+ // According to IEEE 754[1], #U is also set when the result is tiny and
+ // inexact, but still non-zero, so detect that (this won't generate
+ // good code for types without hardware support).
+ // [1] https://en.wikipedia.org/wiki/Floating-point_arithmetic#Exception_handling
+ return result != 0;
+ };
+
+ // Written directly in assembly because both Clang and GCC have been
+ // observed to reorder the STMXCSR instruction above the conversion
+ // operation. MSVC generates horrid code when using the intrinsics anyway,
+ // so it's not a loss.
+ // See https://github.com/llvm/llvm-project/issues/83661.
+ if constexpr (std::is_same_v<T, float>) {
+# ifdef __AVX__
+ asm ("vldmxcsr %[csr]\n\t"
+ "vcvtsd2ss %[in], %[in], %[out]\n\t"
+ "vstmxcsr %[csr]"
+ : [csr] "+m" (csr), [out] "=v" (*value) : [in] "v" (v));
+# else
+ asm ("ldmxcsr %[csr]\n\t"
+ "cvtsd2ss %[in], %[out]\n\t"
+ "stmxcsr %[csr]"
+ : [csr] "+m" (csr), [out] "=v" (*value) : [in] "v" (v));
+# endif
+ return sse_check_result(*value);
+ }
+
+# if defined(__F16C__) || defined(__AVX512FP16__)
+ if constexpr (sizeof(T) == 2 && std::numeric_limits<T>::max_exponent == 16) {
+ // qfloat16 or std::float16_t, but not std::bfloat16_t or std::bfloat8_t
+ auto doConvert = [&](auto *out) {
+ asm ("vldmxcsr %[csr]\n\t"
+# ifdef __AVX512FP16__
+ // AVX512FP16 & AVX10 have an instruction for this
+ "vcvtsd2sh %[in], %[in], %[out]\n\t"
+# else
+ "vcvtsd2ss %[in], %[in], %[out]\n\t" // sets DEST[MAXVL-1:128] := 0
+ "vcvtps2ph %[rc], %[out], %[out]\n\t"
+# endif
+ "vstmxcsr %[csr]"
+ : [csr] "+m" (csr), [out] "=v" (*out)
+ : [in] "v" (v), [rc] "i" (_MM_FROUND_CUR_DIRECTION)
+ );
+ return sse_check_result(out);
+ };
+
+ if constexpr (std::is_same_v<T, qfloat16> && !std::is_void_v<typename T::NativeType>) {
+ typename T::NativeType tmp;
+ bool b = doConvert(&tmp);
+ *value = tmp;
+ return b;
+ } else {
+# ifndef Q_CC_CLANG
+ // Clang can only implement this if it has a native FP16 type
+ return doConvert(value);
+# endif
+ }
+ }
+# endif
+#endif // __SSE2__ && inline assembly
+
+ if (!qt_is_finite(v) && std::numeric_limits<T>::has_infinity) {
+ // infinity (or NaN)
+ *value = T(v);
+ return true;
+ }
+
+ // Check for in-range value to ensure the conversion is not UB (see the
+ // comment above for Standard language).
+ if (std::fabs(v) > (std::numeric_limits<T>::max)()) {
+ *value = v < 0 ? -Huge : Huge;
+ return false;
+ }
+
+ *value = T(v);
+ if (v != 0 && *value == 0) {
+ // Underflow through loss of precision
+ return false;
+ }
+ return true;
+}
+
template <typename T> inline bool add_overflow(T v1, T v2, T *r) { return qAddOverflow(v1, v2, r); }
template <typename T> inline bool sub_overflow(T v1, T v2, T *r) { return qSubOverflow(v1, v2, r); }
template <typename T> inline bool mul_overflow(T v1, T v2, T *r) { return qMulOverflow(v1, v2, r); }
@@ -265,7 +429,42 @@ template <auto V2, typename T> bool mul_overflow(T v1, T *r)
return qMulOverflow<V2, T>(v1, r);
}
}
-#endif // Q_CLANG_QDOC
+#endif // Q_QDOC
+
+/*
+ Safely narrows \a x to \c{To}. Let \c L be
+ \c{std::numeric_limit<To>::min()} and \c H be \c{std::numeric_limit<To>::max()}.
+
+ If \a x is less than L, returns L. If \a x is greater than H,
+ returns H. Otherwise, returns \c{To(x)}.
+*/
+template <typename To, typename From>
+static constexpr auto qt_saturate(From x)
+{
+ static_assert(std::is_integral_v<To>);
+ static_assert(std::is_integral_v<From>);
+
+ [[maybe_unused]]
+ constexpr auto Lo = (std::numeric_limits<To>::min)();
+ constexpr auto Hi = (std::numeric_limits<To>::max)();
+
+ if constexpr (std::is_signed_v<From> == std::is_signed_v<To>) {
+ // same signedness, we can accept regular integer conversion rules
+ return x < Lo ? Lo :
+ x > Hi ? Hi :
+ /*else*/ To(x);
+ } else {
+ if constexpr (std::is_signed_v<From>) { // ie. !is_signed_v<To>
+ if (x < From{0})
+ return To{0};
+ }
+
+ // from here on, x >= 0
+ using FromU = std::make_unsigned_t<From>;
+ using ToU = std::make_unsigned_t<To>;
+ return FromU(x) > ToU(Hi) ? Hi : To(x); // assumes Hi >= 0
+ }
+}
QT_END_NAMESPACE
diff --git a/src/corelib/global/qoperatingsystemversion.cpp b/src/corelib/global/qoperatingsystemversion.cpp
index 8c4a393742..cf6063fca0 100644
--- a/src/corelib/global/qoperatingsystemversion.cpp
+++ b/src/corelib/global/qoperatingsystemversion.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qoperatingsystemversion.h"
@@ -51,6 +15,7 @@
#include <qdebug.h>
#ifdef Q_OS_ANDROID
+#include <QtCore/private/qjnihelpers_p.h>
#include <QJniObject>
#endif
@@ -69,7 +34,7 @@ QT_BEGIN_NAMESPACE
operating system version (as opposed to the kernel version number or
marketing version).
- Presently, Android, Apple Platforms (iOS, macOS, tvOS, and watchOS),
+ Presently, Android, Apple Platforms (iOS, macOS, tvOS, watchOS, and visionOS),
and Windows are supported.
The \a majorVersion(), \a minorVersion(), and \a microVersion() functions
@@ -133,6 +98,7 @@ QT_BEGIN_NAMESPACE
\value MacOS The Apple macOS operating system.
\value TvOS The Apple tvOS operating system.
\value WatchOS The Apple watchOS operating system.
+ \value VisionOS The Apple visionOS operating system.
\value Windows The Microsoft Windows operating system.
\value Unknown An unknown or unsupported operating system.
@@ -146,13 +112,15 @@ QT_BEGIN_NAMESPACE
*/
/*!
+ \fn QOperatingSystemVersion::current()
Returns a QOperatingSystemVersion indicating the current OS and its version number.
\sa currentType()
*/
-QOperatingSystemVersion QOperatingSystemVersion::current()
+QOperatingSystemVersionBase QOperatingSystemVersionBase::current()
{
- return QOperatingSystemVersionBase::current();
+ static const QOperatingSystemVersionBase v = current_impl();
+ return v;
}
#if !defined(Q_OS_DARWIN) && !defined(Q_OS_WIN)
@@ -209,11 +177,13 @@ QOperatingSystemVersionBase QOperatingSystemVersionBase::current_impl()
{ 9, 0 }, // API level 28
{ 10, 0 }, // API level 29
{ 11, 0 }, // API level 30
+ { 12, 0 }, // API level 31
+ { 12, 0 }, // API level 32
+ { 13, 0 }, // API level 33
};
// This will give us at least the first 2 version components
- const size_t versionIdx = size_t(QJniObject::getStaticField<jint>(
- "android/os/Build$VERSION", "SDK_INT")) - 1;
+ const size_t versionIdx = QtAndroidPrivate::androidSdkVersion() - 1;
if (versionIdx < sizeof(versions) / sizeof(versions[0])) {
version.m_major = versions[versionIdx].major;
version.m_minor = versions[versionIdx].minor;
@@ -228,21 +198,15 @@ QOperatingSystemVersionBase QOperatingSystemVersionBase::current_impl()
#endif
return version;
}
-
-QOperatingSystemVersionBase QOperatingSystemVersionBase::current()
-{
- static const QOperatingSystemVersionBase v = current_impl();
- return v;
-}
#endif
-static inline int compareVersionComponents(int lhs, int rhs)
+static inline int compareVersionComponents(int lhs, int rhs) noexcept
{
return lhs >= 0 && rhs >= 0 ? lhs - rhs : 0;
}
int QOperatingSystemVersionBase::compare(QOperatingSystemVersionBase v1,
- QOperatingSystemVersionBase v2)
+ QOperatingSystemVersionBase v2) noexcept
{
if (v1.m_major == v2.m_major) {
if (v1.m_minor == v2.m_minor) {
@@ -253,12 +217,6 @@ int QOperatingSystemVersionBase::compare(QOperatingSystemVersionBase v1,
return compareVersionComponents(v1.m_major, v2.m_major);
}
-int QOperatingSystemVersion::compare(const QOperatingSystemVersion &v1,
- const QOperatingSystemVersion &v2)
-{
- return QOperatingSystemVersionBase::compare(v1, v2);
-}
-
/*!
\fn QVersionNumber QOperatingSystemVersion::version() const
@@ -345,11 +303,6 @@ int QOperatingSystemVersion::compare(const QOperatingSystemVersion &v1,
\sa type()
*/
-QString QOperatingSystemVersion::name() const
-{
- return QOperatingSystemVersionBase::name();
-}
-
QString QOperatingSystemVersionBase::name(QOperatingSystemVersionBase osversion)
{
switch (osversion.type()) {
@@ -373,6 +326,8 @@ QString QOperatingSystemVersionBase::name(QOperatingSystemVersionBase osversion)
return QStringLiteral("tvOS");
case QOperatingSystemVersionBase::WatchOS:
return QStringLiteral("watchOS");
+ case QOperatingSystemVersionBase::VisionOS:
+ return QStringLiteral("visionOS");
case QOperatingSystemVersionBase::Android:
return QStringLiteral("Android");
case QOperatingSystemVersionBase::Unknown:
@@ -398,6 +353,8 @@ bool QOperatingSystemVersionBase::isAnyOfType(std::initializer_list<OSType> type
return std::find(types.begin(), types.end(), type) != types.end();
}
+#ifndef QT_BOOTSTRAPPED
+
/*!
\variable QOperatingSystemVersion::Windows7
\brief a version corresponding to Windows 7 (version 6.1).
@@ -424,7 +381,7 @@ const QOperatingSystemVersion QOperatingSystemVersion::Windows8_1 =
/*!
\variable QOperatingSystemVersion::Windows10
- \brief a version corresponding to Windows 10 (version 10.0).
+ \brief a version corresponding to general Windows 10 (version 10.0).
\since 5.9
*/
const QOperatingSystemVersion QOperatingSystemVersion::Windows10 =
@@ -432,51 +389,95 @@ const QOperatingSystemVersion QOperatingSystemVersion::Windows10 =
/*!
\variable QOperatingSystemVersion::Windows10_1809
- \brief a version corresponding to Windows 10 1809 (version 10.0.17763).
+ \brief a version corresponding to Windows 10 October 2018 Update
+ Version 1809 (version 10.0.17763).
\since 6.3
*/
+const QOperatingSystemVersionBase QOperatingSystemVersion::Windows10_1809;
/*!
\variable QOperatingSystemVersion::Windows10_1903
- \brief a version corresponding to Windows 10 1903 (version 10.0.18362).
+ \brief a version corresponding to Windows 10 May 2019 Update
+ Version 1903 (version 10.0.18362).
\since 6.3
*/
+const QOperatingSystemVersionBase QOperatingSystemVersion::Windows10_1903;
/*!
\variable QOperatingSystemVersion::Windows10_1909
- \brief a version corresponding to Windows 10 1909 (version 10.0.18363).
+ \brief a version corresponding to Windows 10 November 2019 Update
+ Version 1909 (version 10.0.18363).
\since 6.3
*/
+const QOperatingSystemVersionBase QOperatingSystemVersion::Windows10_1909;
/*!
\variable QOperatingSystemVersion::Windows10_2004
- \brief a version corresponding to Windows 10 2004 (version 10.0.19041).
+ \brief a version corresponding to Windows 10 May 2020 Update
+ Version 2004 (version 10.0.19041).
\since 6.3
*/
+const QOperatingSystemVersionBase QOperatingSystemVersion::Windows10_2004;
/*!
\variable QOperatingSystemVersion::Windows10_20H2
- \brief a version corresponding to Windows 10 20H2 (version 10.0.19042).
+ \brief a version corresponding to Windows 10 October 2020 Update
+ Version 20H2 (version 10.0.19042).
\since 6.3
*/
+const QOperatingSystemVersionBase QOperatingSystemVersion::Windows10_20H2;
/*!
\variable QOperatingSystemVersion::Windows10_21H1
- \brief a version corresponding to Windows 10 21H1 (version 10.0.19043).
+ \brief a version corresponding to Windows 10 May 2021 Update
+ Version 21H1 (version 10.0.19043).
\since 6.3
*/
+const QOperatingSystemVersionBase QOperatingSystemVersion::Windows10_21H1;
/*!
\variable QOperatingSystemVersion::Windows10_21H2
- \brief a version corresponding to Windows 10 21H2 (version 10.0.19044).
+ \brief a version corresponding to Windows 10 November 2021 Update
+ Version 21H2 (version 10.0.19044).
\since 6.3
*/
+const QOperatingSystemVersionBase QOperatingSystemVersion::Windows10_21H2;
+
+/*!
+ \variable QOperatingSystemVersion::Windows10_22H2
+ \brief a version corresponding to Windows 10 October 2022 Update
+ Version 22H2 (version 10.0.19045).
+ \since 6.5
+ */
+const QOperatingSystemVersionBase QOperatingSystemVersion::Windows10_22H2;
/*!
\variable QOperatingSystemVersion::Windows11
- \brief a version corresponding to Windows 11 (version 10.0.22000).
+ \brief a version corresponding to the initial release of Windows 11
+ (version 10.0.22000).
\since 6.3
*/
+const QOperatingSystemVersionBase QOperatingSystemVersion::Windows11;
+
+/*!
+ \variable QOperatingSystemVersion::Windows11_21H2
+ \brief a version corresponding to Windows 11 Version 21H2 (version 10.0.22000).
+ \since 6.4
+ */
+const QOperatingSystemVersionBase QOperatingSystemVersion::Windows11_21H2;
+
+/*!
+ \variable QOperatingSystemVersion::Windows11_22H2
+ \brief a version corresponding to Windows 11 Version 22H2 (version 10.0.22621).
+ \since 6.4
+ */
+const QOperatingSystemVersionBase QOperatingSystemVersion::Windows11_22H2;
+
+/*!
+ \variable QOperatingSystemVersion::Windows11_23H2
+ \brief a version corresponding to Windows 11 Version 23H2 (version 10.0.22631).
+ \since 6.6
+ */
/*!
\variable QOperatingSystemVersion::OSXMavericks
@@ -536,24 +537,11 @@ const QOperatingSystemVersion QOperatingSystemVersion::MacOSCatalina =
/*!
\variable QOperatingSystemVersion::MacOSBigSur
- \brief a version corresponding to macOS Big Sur
-
- The actual version number depends on whether the application was built
- using the Xcode 12 SDK. If it was, the version number corresponds
- to macOS 11.0. If not it will correspond to macOS 10.16.
-
- By comparing QOperatingSystemVersion::current() to this constant
- you will always end up comparing to the right version number.
+ \brief a version corresponding to macOS Big Sur (version 11).
\since 6.0
*/
-const QOperatingSystemVersion QOperatingSystemVersion::MacOSBigSur = [] {
-#if defined(Q_OS_DARWIN)
- if (QMacVersion::buildSDK(QMacVersion::ApplicationBinary) >= QOperatingSystemVersion(QOperatingSystemVersion::MacOS, 10, 16))
- return QOperatingSystemVersion(QOperatingSystemVersion::MacOS, 11, 0);
- else
-#endif
- return QOperatingSystemVersion(QOperatingSystemVersion::MacOS, 10, 16);
-}();
+const QOperatingSystemVersion QOperatingSystemVersion::MacOSBigSur =
+ QOperatingSystemVersion(QOperatingSystemVersion::MacOS, 11, 0);
/*!
\variable QOperatingSystemVersion::MacOSMonterey
@@ -564,6 +552,19 @@ const QOperatingSystemVersion QOperatingSystemVersion::MacOSMonterey =
QOperatingSystemVersion(QOperatingSystemVersion::MacOS, 12, 0);
/*!
+ \variable QOperatingSystemVersion::MacOSVentura
+ \brief a version corresponding to macOS Ventura (version 13).
+ \since 6.4
+*/
+const QOperatingSystemVersionBase QOperatingSystemVersion::MacOSVentura;
+
+/*!
+ \variable QOperatingSystemVersion::MacOSSonoma
+ \brief a version corresponding to macOS Sonoma (version 14).
+ \since 6.5
+*/
+
+/*!
\variable QOperatingSystemVersion::AndroidJellyBean
\brief a version corresponding to Android Jelly Bean (version 4.1, API level 16).
\since 5.9
@@ -679,6 +680,35 @@ const QOperatingSystemVersion QOperatingSystemVersion::Android10 =
const QOperatingSystemVersion QOperatingSystemVersion::Android11 =
QOperatingSystemVersion(QOperatingSystemVersion::Android, 11, 0);
+/*!
+ \variable QOperatingSystemVersion::Android12
+ \brief a version corresponding to Android 12 (version 12.0, API level 31).
+ \since 6.5
+ */
+const QOperatingSystemVersionBase QOperatingSystemVersion::Android12;
+
+/*!
+ \variable QOperatingSystemVersion::Android12L
+ \brief a version corresponding to Android 12L (version 12.0, API level 32).
+ \since 6.5
+ */
+const QOperatingSystemVersionBase QOperatingSystemVersion::Android12L;
+
+/*!
+ \variable QOperatingSystemVersion::Android13
+ \brief a version corresponding to Android 13 (version 13.0, API level 33).
+ \since 6.5
+ */
+const QOperatingSystemVersionBase QOperatingSystemVersion::Android13;
+
+/*!
+ \variable QOperatingSystemVersion::Android14
+ \brief a version corresponding to Android 14 (version 14.0, API level 34).
+ \since 6.7
+ */
+
+#endif // !QT_BOOTSTRAPPED
+
#ifndef QT_NO_DEBUG_STREAM
QDebug operator<<(QDebug debug, const QOperatingSystemVersion &ov)
{
diff --git a/src/corelib/global/qoperatingsystemversion.h b/src/corelib/global/qoperatingsystemversion.h
index 2ab08a5427..a9f30dc275 100644
--- a/src/corelib/global/qoperatingsystemversion.h
+++ b/src/corelib/global/qoperatingsystemversion.h
@@ -1,43 +1,8 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include <QtCore/qglobal.h>
+#include <QtCore/qcompare.h>
#include <QtCore/qversionnumber.h>
#ifndef QOPERATINGSYSTEMVERSION_H
@@ -45,6 +10,12 @@
QT_BEGIN_NAMESPACE
+#if 0
+# pragma qt_class(QOperatingSystemVersionBase)
+# pragma qt_class(QOperatingSystemVersion)
+# pragma qt_sync_stop_processing // we have some ifdef'ery fooling syncqt
+#endif
+
class QString;
class QOperatingSystemVersionBase
@@ -59,7 +30,8 @@ public:
IOS,
TvOS,
WatchOS,
- Android
+ Android,
+ VisionOS
};
constexpr QOperatingSystemVersionBase(OSType osType,
@@ -86,6 +58,8 @@ public:
return TvOS;
#elif defined(Q_OS_WATCHOS)
return WatchOS;
+#elif defined(Q_OS_VISIONOS)
+ return VisionOS;
#elif defined(Q_OS_ANDROID)
return Android;
#else
@@ -109,39 +83,77 @@ public:
constexpr OSType type() const { return m_os; }
inline QString name() const { return name(*this); }
- friend bool operator>(QOperatingSystemVersionBase lhs, QOperatingSystemVersionBase rhs)
- { return lhs.type() == rhs.type() && QOperatingSystemVersionBase::compare(lhs, rhs) > 0; }
+protected:
+ static Q_CORE_EXPORT int compare(QOperatingSystemVersionBase v1,
+ QOperatingSystemVersionBase v2) noexcept;
- friend bool operator>=(QOperatingSystemVersionBase lhs, QOperatingSystemVersionBase rhs)
- { return lhs.type() == rhs.type() && QOperatingSystemVersionBase::compare(lhs, rhs) >= 0; }
+ friend Qt::partial_ordering compareThreeWay(const QOperatingSystemVersionBase &lhs,
+ const QOperatingSystemVersionBase &rhs) noexcept
+ {
+ if (lhs.type() != rhs.type())
+ return Qt::partial_ordering::unordered;
+ const int res = QOperatingSystemVersionBase::compare(lhs, rhs);
+ return Qt::compareThreeWay(res, 0);
+ }
+#ifdef __cpp_lib_three_way_comparison
+ friend std::partial_ordering
+ operator<=>(QOperatingSystemVersionBase lhs, QOperatingSystemVersionBase rhs) noexcept
+ { return compareThreeWay(lhs, rhs); }
+#else
+ friend bool
+ operator>(QOperatingSystemVersionBase lhs, QOperatingSystemVersionBase rhs) noexcept
+ { return is_gt(compareThreeWay(lhs, rhs)); }
- friend bool operator<(QOperatingSystemVersionBase lhs, QOperatingSystemVersionBase rhs)
- { return lhs.type() == rhs.type() && QOperatingSystemVersionBase::compare(lhs, rhs) < 0; }
+ friend bool
+ operator>=(QOperatingSystemVersionBase lhs, QOperatingSystemVersionBase rhs) noexcept
+ { return is_gteq(compareThreeWay(lhs, rhs)); }
- friend bool operator<=(QOperatingSystemVersionBase lhs, QOperatingSystemVersionBase rhs)
- { return lhs.type() == rhs.type() && QOperatingSystemVersionBase::compare(lhs, rhs) <= 0; }
+ friend bool
+ operator<(QOperatingSystemVersionBase lhs, QOperatingSystemVersionBase rhs) noexcept
+ { return is_lt(compareThreeWay(lhs, rhs)); }
-protected:
- static Q_CORE_EXPORT int compare(QOperatingSystemVersionBase v1,
- QOperatingSystemVersionBase v2);
+ friend bool
+ operator<=(QOperatingSystemVersionBase lhs, QOperatingSystemVersionBase rhs) noexcept
+ { return is_lteq(compareThreeWay(lhs, rhs)); }
+#endif
QOperatingSystemVersionBase() = default;
private:
static QOperatingSystemVersionBase current_impl();
-
OSType m_os;
int m_major;
int m_minor;
int m_micro;
};
-// ### Qt 7: Un-export the class, export relevant functions. Remove the enum.
-class Q_CORE_EXPORT QOperatingSystemVersion : public QOperatingSystemVersionBase
+#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0) && !defined(QT_BOOTSTRAPPED) && !defined(Q_QDOC)
+class QOperatingSystemVersionUnexported : public QOperatingSystemVersionBase
+{
+public:
+ using QOperatingSystemVersionBase::QOperatingSystemVersionBase;
+ constexpr QOperatingSystemVersionUnexported(QOperatingSystemVersionBase other) noexcept
+ : QOperatingSystemVersionBase(other) {}
+#else
+class QOperatingSystemVersion : public QOperatingSystemVersionBase
+{
+ using QOperatingSystemVersionUnexported = QOperatingSystemVersionBase;
+#endif
+
+ // ### Qt7: Regroup with the rest below
+ static constexpr QOperatingSystemVersionBase MacOSSonoma { QOperatingSystemVersionBase::MacOS, 14, 0 };
+ static constexpr QOperatingSystemVersionBase Android14 { QOperatingSystemVersionBase::Android, 14, 0 };
+ static constexpr QOperatingSystemVersionBase Windows11_23H2 { QOperatingSystemVersionBase::Windows, 10, 0, 22631 };
+
+#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0) && !defined(QT_BOOTSTRAPPED) && !defined(Q_QDOC)
+};
+
+class Q_CORE_EXPORT QOperatingSystemVersion : public QOperatingSystemVersionUnexported
{
+#endif
public:
// ### Qt7: Remove. Keep synchronized with QOperatingSystemVersionBase::OSType until then!
-#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0)
+#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0) && !defined(QT_BOOTSTRAPPED)
enum OSType {
Unknown = 0,
Windows,
@@ -149,16 +161,15 @@ public:
IOS,
TvOS,
WatchOS,
- Android
+ Android,
+ VisionOS
};
#endif
- // ### Qt7: remove the branch with static const variables. Then group and sort the inline ones.
- // Since the exported variables emit symbols they cannot be cherry-picked back to patch-releases
- // without breaking our BC promises. They must be fully inline but we cannot make that change
- // until Qt7
- // @note: New entries should be added after the if-def-ery until Qt 7!!
-#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0)
+ // ### Qt7: remove the branch with static const variables. Then group and
+ // sort the inline ones. Until then, new entries should be added to
+ // QOperatingSystemVersionUnexported.
+#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0) && !defined(QT_BOOTSTRAPPED)
static const QOperatingSystemVersion Windows7;
static const QOperatingSystemVersion Windows8;
static const QOperatingSystemVersion Windows8_1;
@@ -201,12 +212,8 @@ public:
static constexpr QOperatingSystemVersionBase MacOSHighSierra { QOperatingSystemVersionBase::MacOS, 10, 13 };
static constexpr QOperatingSystemVersionBase MacOSMojave { QOperatingSystemVersionBase::MacOS, 10, 14 };
static constexpr QOperatingSystemVersionBase MacOSCatalina { QOperatingSystemVersionBase::MacOS, 10, 15 };
-#if QT_MACOS_PLATFORM_SDK_EQUAL_OR_ABOVE(__MAC_11_0)
static constexpr QOperatingSystemVersionBase MacOSBigSur = { QOperatingSystemVersionBase::MacOS, 11, 0 };
static constexpr QOperatingSystemVersionBase MacOSMonterey = { QOperatingSystemVersionBase::MacOS, 12, 0 };
-#else // ### Qt 7: Verify the assumption
-# error Either you are using an outdated SDK or my assumption that Qt7 would require at least 11.0 was wrong
-#endif
static constexpr QOperatingSystemVersionBase AndroidJellyBean { QOperatingSystemVersionBase::Android, 4, 1 };
static constexpr QOperatingSystemVersionBase AndroidJellyBean_MR1 { QOperatingSystemVersionBase::Android, 4, 2 };
@@ -222,7 +229,7 @@ public:
static constexpr QOperatingSystemVersionBase AndroidPie { QOperatingSystemVersionBase::Android, 9, 0 };
static constexpr QOperatingSystemVersionBase Android10 { QOperatingSystemVersionBase::Android, 10, 0 };
static constexpr QOperatingSystemVersionBase Android11 { QOperatingSystemVersionBase::Android, 11, 0 };
-#endif // New (static constexpr) entries go here, only cherry-pick as far back as 6.3 (QTBUG-97808):
+#endif
static constexpr QOperatingSystemVersionBase Windows10_1809 { QOperatingSystemVersionBase::Windows, 10, 0, 17763 }; // RS5
static constexpr QOperatingSystemVersionBase Windows10_1903 { QOperatingSystemVersionBase::Windows, 10, 0, 18362 }; // 19H1
@@ -231,24 +238,36 @@ public:
static constexpr QOperatingSystemVersionBase Windows10_20H2 { QOperatingSystemVersionBase::Windows, 10, 0, 19042 };
static constexpr QOperatingSystemVersionBase Windows10_21H1 { QOperatingSystemVersionBase::Windows, 10, 0, 19043 };
static constexpr QOperatingSystemVersionBase Windows10_21H2 { QOperatingSystemVersionBase::Windows, 10, 0, 19044 };
+ static constexpr QOperatingSystemVersionBase Windows10_22H2 { QOperatingSystemVersionBase::Windows, 10, 0, 19045 };
static constexpr QOperatingSystemVersionBase Windows11 { QOperatingSystemVersionBase::Windows, 10, 0, 22000 };
+ static constexpr QOperatingSystemVersionBase Windows11_21H2 = Windows11;
+ static constexpr QOperatingSystemVersionBase Windows11_22H2 { QOperatingSystemVersionBase::Windows, 10, 0, 22621 };
+
+ static constexpr QOperatingSystemVersionBase Android12 { QOperatingSystemVersionBase::Android, 12, 0 };
+ static constexpr QOperatingSystemVersionBase Android12L { QOperatingSystemVersionBase::Android, 12, 0 };
+ static constexpr QOperatingSystemVersionBase Android13 { QOperatingSystemVersionBase::Android, 13, 0 };
+
+ static constexpr QOperatingSystemVersionBase MacOSVentura { QOperatingSystemVersionBase::MacOS, 13, 0 };
constexpr QOperatingSystemVersion(const QOperatingSystemVersionBase &osversion)
- : QOperatingSystemVersionBase(osversion) {}
+ : QOperatingSystemVersionUnexported(osversion) {}
constexpr QOperatingSystemVersion(OSType osType, int vmajor, int vminor = -1, int vmicro = -1)
- : QOperatingSystemVersionBase(QOperatingSystemVersionBase::OSType(osType), vmajor, vminor,
+ : QOperatingSystemVersionUnexported(QOperatingSystemVersionBase::OSType(osType), vmajor, vminor,
vmicro)
{
}
+#if QT_CORE_REMOVED_SINCE(6, 3) || defined(Q_QDOC)
static QOperatingSystemVersion current();
+#endif
static constexpr OSType currentType()
{
return OSType(QOperatingSystemVersionBase::currentType());
}
+#if QT_CORE_REMOVED_SINCE(6, 3) || defined(Q_QDOC)
QVersionNumber version() const { return QOperatingSystemVersionBase::version(); }
constexpr int majorVersion() const { return QOperatingSystemVersionBase::majorVersion(); }
@@ -257,17 +276,22 @@ public:
constexpr int segmentCount() const
{ return QOperatingSystemVersionBase::segmentCount(); }
+#endif // QT_CORE_REMOVED_SINCE(6, 3)
constexpr OSType type() const { return OSType(QOperatingSystemVersionBase::type()); }
- bool isAnyOfType(std::initializer_list<OSType> types) const;
+ QT7_ONLY(Q_CORE_EXPORT) bool isAnyOfType(std::initializer_list<OSType> types) const;
+#if QT_CORE_REMOVED_SINCE(6, 3) || defined(Q_QDOC)
QString name() const;
+#endif
private:
QOperatingSystemVersion() = default;
+#if QT_CORE_REMOVED_SINCE(6, 3)
// ### Qt 7: Remove. It's only here for backwards compat with previous inline calls.
[[maybe_unused]] static int compare(const QOperatingSystemVersion &v1,
const QOperatingSystemVersion &v2);
+#endif
};
Q_DECLARE_TYPEINFO(QOperatingSystemVersion, Q_PRIMITIVE_TYPE);
diff --git a/src/corelib/global/qoperatingsystemversion_darwin.mm b/src/corelib/global/qoperatingsystemversion_darwin.mm
index 1666b4e9cf..f8d9fbd027 100644
--- a/src/corelib/global/qoperatingsystemversion_darwin.mm
+++ b/src/corelib/global/qoperatingsystemversion_darwin.mm
@@ -1,62 +1,57 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qoperatingsystemversion_p.h"
+
#import <Foundation/Foundation.h>
+#include <QtCore/qfile.h>
+#include <QtCore/qversionnumber.h>
+
+#if !defined(QT_BOOTSTRAPPED)
+#include <QtCore/qprocess.h>
+#endif
+
QT_BEGIN_NAMESPACE
+using namespace Qt::StringLiterals;
+
QOperatingSystemVersionBase QOperatingSystemVersionBase::current_impl()
{
NSOperatingSystemVersion osv = NSProcessInfo.processInfo.operatingSystemVersion;
- QOperatingSystemVersionBase v;
- v.m_os = currentType();
- v.m_major = osv.majorVersion;
- v.m_minor = osv.minorVersion;
- v.m_micro = osv.patchVersion;
- return v;
-}
+ QVersionNumber versionNumber(osv.majorVersion, osv.minorVersion, osv.patchVersion);
-QOperatingSystemVersionBase QOperatingSystemVersionBase::current()
-{
- static const QOperatingSystemVersionBase v = current_impl();
- return v;
+ if (versionNumber.majorVersion() == 10 && versionNumber.minorVersion() >= 16) {
+ // The process is running in system version compatibility mode,
+ // due to the executable being built against a pre-macOS 11 SDK.
+ // This might happen even if we require a more recent SDK for
+ // building Qt applications, as the Qt 'app' might be a plugin
+ // hosted inside a host that used an earlier SDK. But, since we
+ // require a recent SDK for the Qt app itself, the application
+ // should be prepared for versions numbers beyond 10, and we can
+ // resolve the real version number here.
+#if !defined(QT_BOOTSTRAPPED) && QT_CONFIG(process)
+ QProcess sysctl;
+ QProcessEnvironment nonCompatEnvironment;
+ nonCompatEnvironment.insert("SYSTEM_VERSION_COMPAT"_L1, "0"_L1);
+ sysctl.setProcessEnvironment(nonCompatEnvironment);
+ sysctl.start("/usr/sbin/sysctl"_L1, QStringList() << "-b"_L1 << "kern.osproductversion"_L1);
+ if (sysctl.waitForFinished()) {
+ auto versionString = QString::fromLatin1(sysctl.readAll());
+ auto nonCompatSystemVersion = QVersionNumber::fromString(versionString);
+ if (!nonCompatSystemVersion.isNull())
+ versionNumber = nonCompatSystemVersion;
+ }
+#endif
+ }
+
+ QOperatingSystemVersionBase operatingSystemVersion;
+ operatingSystemVersion.m_os = currentType();
+ operatingSystemVersion.m_major = versionNumber.majorVersion();
+ operatingSystemVersion.m_minor = versionNumber.minorVersion();
+ operatingSystemVersion.m_micro = versionNumber.microVersion();
+
+ return operatingSystemVersion;
}
QT_END_NAMESPACE
diff --git a/src/corelib/global/qoperatingsystemversion_p.h b/src/corelib/global/qoperatingsystemversion_p.h
index 6922f4ad54..5d1480d524 100644
--- a/src/corelib/global/qoperatingsystemversion_p.h
+++ b/src/corelib/global/qoperatingsystemversion_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QOPERATINGSYSTEMVERSION_P_H
#define QOPERATINGSYSTEMVERSION_P_H
@@ -52,6 +16,7 @@
//
#include "qoperatingsystemversion.h"
+#include "private/qglobal_p.h"
#ifdef Q_OS_WIN
#include <qt_windows.h>
diff --git a/src/corelib/global/qoperatingsystemversion_win.cpp b/src/corelib/global/qoperatingsystemversion_win.cpp
index 9dc8c96105..a209fb17b6 100644
--- a/src/corelib/global/qoperatingsystemversion_win.cpp
+++ b/src/corelib/global/qoperatingsystemversion_win.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qoperatingsystemversion_win_p.h"
@@ -87,13 +51,18 @@ OSVERSIONINFOEX qWindowsVersionInfo()
result.wServicePackMinor = 0;
const QByteArray winVerOverride = qgetenv("QT_WINVER_OVERRIDE");
- if (winVerOverride == "WINDOWS10" || winVerOverride == "2016") {
+ if (winVerOverride == "WINDOWS10" || winVerOverride == "2016"
+ || winVerOverride == "2019" || winVerOverride == "2022") {
result.dwMajorVersion = 10;
+ } else if (winVerOverride == "WINDOWS11") {
+ result.dwMajorVersion = 10;
+ result.dwBuildNumber = 22000;
} else {
return realResult;
}
- if (winVerOverride == "2016") {
+ if (winVerOverride == "2016" || winVerOverride == "2019"
+ || winVerOverride == "2022") {
// If the current host OS is a domain controller and the override OS
// is also a server type OS, preserve that information
if (result.wProductType == VER_NT_WORKSTATION)
@@ -108,17 +77,14 @@ OSVERSIONINFOEX qWindowsVersionInfo()
return realResult;
}
-QOperatingSystemVersionBase QOperatingSystemVersionBase::current()
+QOperatingSystemVersionBase QOperatingSystemVersionBase::current_impl()
{
- static QOperatingSystemVersionBase v = [](){
- QOperatingSystemVersionBase v;
- v.m_os = currentType();
- const OSVERSIONINFOEX osv = qWindowsVersionInfo();
- v.m_major = osv.dwMajorVersion;
- v.m_minor = osv.dwMinorVersion;
- v.m_micro = osv.dwBuildNumber;
- return v;
- }();
+ QOperatingSystemVersionBase v;
+ v.m_os = currentType();
+ const OSVERSIONINFOEX osv = qWindowsVersionInfo();
+ v.m_major = osv.dwMajorVersion;
+ v.m_minor = osv.dwMinorVersion;
+ v.m_micro = osv.dwBuildNumber;
return v;
}
diff --git a/src/corelib/global/qoperatingsystemversion_win_p.h b/src/corelib/global/qoperatingsystemversion_win_p.h
index 446bd286fc..92fc0e12f3 100644
--- a/src/corelib/global/qoperatingsystemversion_win_p.h
+++ b/src/corelib/global/qoperatingsystemversion_win_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2017 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2017 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QOPERATINGSYSTEMVERSION_WIN_P_H
#define QOPERATINGSYSTEMVERSION_WIN_P_H
@@ -51,7 +15,7 @@
// We mean it.
//
-#include <QtCore/qglobal.h>
+#include <QtCore/private/qglobal_p.h>
#include <qt_windows.h>
QT_BEGIN_NAMESPACE
diff --git a/src/corelib/global/qoverload.h b/src/corelib/global/qoverload.h
new file mode 100644
index 0000000000..9376e1e246
--- /dev/null
+++ b/src/corelib/global/qoverload.h
@@ -0,0 +1,80 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QOVERLOAD_H
+#define QOVERLOAD_H
+
+#include <QtCore/qtconfigmacros.h>
+
+#if 0
+#pragma qt_class(QOverload)
+#endif
+
+QT_BEGIN_NAMESPACE
+
+#ifdef Q_QDOC
+// Just for documentation generation
+template<typename T>
+auto qOverload(T functionPointer);
+template<typename T>
+auto qConstOverload(T memberFunctionPointer);
+template<typename T>
+auto qNonConstOverload(T memberFunctionPointer);
+#else
+template <typename... Args>
+struct QNonConstOverload
+{
+ template <typename R, typename T>
+ constexpr auto operator()(R (T::*ptr)(Args...)) const noexcept -> decltype(ptr)
+ { return ptr; }
+
+ template <typename R, typename T>
+ static constexpr auto of(R (T::*ptr)(Args...)) noexcept -> decltype(ptr)
+ { return ptr; }
+};
+
+template <typename... Args>
+struct QConstOverload
+{
+ template <typename R, typename T>
+ constexpr auto operator()(R (T::*ptr)(Args...) const) const noexcept -> decltype(ptr)
+ { return ptr; }
+
+ template <typename R, typename T>
+ static constexpr auto of(R (T::*ptr)(Args...) const) noexcept -> decltype(ptr)
+ { return ptr; }
+};
+
+template <typename... Args>
+struct QOverload : QConstOverload<Args...>, QNonConstOverload<Args...>
+{
+ using QConstOverload<Args...>::of;
+ using QConstOverload<Args...>::operator();
+ using QNonConstOverload<Args...>::of;
+ using QNonConstOverload<Args...>::operator();
+
+ template <typename R>
+ constexpr auto operator()(R (*ptr)(Args...)) const noexcept -> decltype(ptr)
+ { return ptr; }
+
+ template <typename R>
+ static constexpr auto of(R (*ptr)(Args...)) noexcept -> decltype(ptr)
+ { return ptr; }
+};
+
+template <typename... Args> constexpr inline QOverload<Args...> qOverload = {};
+template <typename... Args> constexpr inline QConstOverload<Args...> qConstOverload = {};
+template <typename... Args> constexpr inline QNonConstOverload<Args...> qNonConstOverload = {};
+
+#endif // Q_QDOC
+
+#define QT_VA_ARGS_CHOOSE(_1, _2, _3, _4, _5, _6, _7, _8, _9, N, ...) N
+#define QT_VA_ARGS_EXPAND(...) __VA_ARGS__ // Needed for MSVC
+#define QT_VA_ARGS_COUNT(...) QT_VA_ARGS_EXPAND(QT_VA_ARGS_CHOOSE(__VA_ARGS__, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0))
+#define QT_OVERLOADED_MACRO_EXPAND(MACRO, ARGC) MACRO##_##ARGC
+#define QT_OVERLOADED_MACRO_IMP(MACRO, ARGC) QT_OVERLOADED_MACRO_EXPAND(MACRO, ARGC)
+#define QT_OVERLOADED_MACRO(MACRO, ...) QT_VA_ARGS_EXPAND(QT_OVERLOADED_MACRO_IMP(MACRO, QT_VA_ARGS_COUNT(__VA_ARGS__))(__VA_ARGS__))
+
+QT_END_NAMESPACE
+
+#endif /* QOVERLOAD_H */
diff --git a/src/corelib/global/qoverload.qdoc b/src/corelib/global/qoverload.qdoc
new file mode 100644
index 0000000000..f11e266483
--- /dev/null
+++ b/src/corelib/global/qoverload.qdoc
@@ -0,0 +1,43 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
+
+/*! \fn template <typename T> auto qOverload(T functionPointer)
+ \relates <QOverload>
+ \since 5.7
+
+ Returns a pointer to an overloaded function. The template
+ parameter is the list of the argument types of the function.
+ \a functionPointer is the pointer to the (member) function:
+
+ \snippet code/src_corelib_global_qglobal.cpp 52
+
+ If a member function is also const-overloaded \l qConstOverload and
+ \l qNonConstOverload need to be used.
+
+ \sa qConstOverload(), qNonConstOverload(), {Differences between String-Based
+ and Functor-Based Connections}
+*/
+
+/*! \fn template <typename T> auto qConstOverload(T memberFunctionPointer)
+ \relates <QOverload>
+ \since 5.7
+
+ Returns the \a memberFunctionPointer pointer to a constant member function:
+
+ \snippet code/src_corelib_global_qglobal.cpp 54
+
+ \sa qOverload, qNonConstOverload, {Differences between String-Based
+ and Functor-Based Connections}
+*/
+
+/*! \fn template <typename T> auto qNonConstOverload(T memberFunctionPointer)
+ \relates <QOverload>
+ \since 5.7
+
+ Returns the \a memberFunctionPointer pointer to a non-constant member function:
+
+ \snippet code/src_corelib_global_qglobal.cpp 54
+
+ \sa qOverload, qNonConstOverload, {Differences between String-Based
+ and Functor-Based Connections}
+*/
diff --git a/src/corelib/global/qprocessordetection.h b/src/corelib/global/qprocessordetection.h
index 72cc0b4ad4..f7298bbb86 100644
--- a/src/corelib/global/qprocessordetection.h
+++ b/src/corelib/global/qprocessordetection.h
@@ -1,45 +1,12 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QGLOBAL_H
-# include <QtCore/qglobal.h>
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2016 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+
+#if 0
+#pragma qt_class(QtProcessorDetection)
+#pragma qt_sync_skip_header_check
+#pragma qt_sync_stop_processing
#endif
#ifndef QPROCESSORDETECTION_H
@@ -84,8 +51,8 @@
Alpha is bi-endian, use endianness auto-detection implemented below.
*/
-// #elif defined(__alpha__) || defined(_M_ALPHA)
-// # define Q_PROCESSOR_ALPHA
+#if defined(__alpha__) || defined(_M_ALPHA)
+# define Q_PROCESSOR_ALPHA
// Q_BYTE_ORDER not defined, use endianness auto-detection
/*
@@ -94,7 +61,7 @@
ARM is bi-endian, detect using __ARMEL__ or __ARMEB__, falling back to
auto-detection implemented below.
*/
-#if defined(__arm__) || defined(__TARGET_ARCH_ARM) || defined(_M_ARM) || defined(_M_ARM64) || defined(__aarch64__) || defined(__ARM64__)
+#elif defined(__arm__) || defined(__TARGET_ARCH_ARM) || defined(_M_ARM) || defined(_M_ARM64) || defined(__aarch64__) || defined(__ARM64__)
# if defined(__aarch64__) || defined(__ARM64__) || defined(_M_ARM64)
# define Q_PROCESSOR_ARM_64
# define Q_PROCESSOR_WORDSIZE 8
@@ -176,6 +143,15 @@
// # define Q_BYTE_ORDER Q_LITTLE_ENDIAN
/*
+ PA-RISC family, no revisions or variants
+
+ PA-RISC is big-endian.
+*/
+#elif defined(__hppa__)
+# define Q_PROCESSOR_HPPA
+# define Q_BYTE_ORDER Q_BIG_ENDIAN
+
+/*
X86 family, known variants: 32- and 64-bit
X86 is little-endian.
@@ -224,6 +200,29 @@
// Q_BYTE_ORDER not defined, use endianness auto-detection
/*
+ LoongArch family, known variants: 32- and 64-bit
+
+ LoongArch is little-endian.
+*/
+#elif defined(__loongarch__)
+# define Q_PROCESSOR_LOONGARCH
+# if __loongarch_grlen == 64
+# define Q_PROCESSOR_LOONGARCH_64
+# else
+# define Q_PROCESSOR_LOONGARCH_32
+# endif
+# define Q_BYTE_ORDER Q_LITTLE_ENDIAN
+
+/*
+ Motorola 68000 family, no revisions or variants
+
+ M68K is big-endian.
+*/
+#elif defined(__m68k__)
+# define Q_PROCESSOR_M68K
+# define Q_BYTE_ORDER Q_BIG_ENDIAN
+
+/*
MIPS family, known revisions: I, II, III, IV, 32, 64
MIPS is bi-endian, use endianness auto-detection implemented below.
@@ -327,7 +326,7 @@
*/
#elif defined(__sparc__)
# define Q_PROCESSOR_SPARC
-# if defined(__sparc_v9__)
+# if defined(__sparc_v9__) || defined(__sparcv9)
# define Q_PROCESSOR_SPARC_V9
# endif
# if defined(__sparc64__)
@@ -342,6 +341,8 @@
# define Q_PROCESSOR_WORDSIZE 8
#ifdef QT_COMPILER_SUPPORTS_SSE2
# define Q_PROCESSOR_X86 6 // enables SIMD support
+# define Q_PROCESSOR_X86_64 // wasm64
+# define Q_PROCESSOR_WASM_64
#endif
#endif
diff --git a/src/corelib/global/qprocessordetection.qdoc b/src/corelib/global/qprocessordetection.qdoc
new file mode 100644
index 0000000000..e6605fb9b9
--- /dev/null
+++ b/src/corelib/global/qprocessordetection.qdoc
@@ -0,0 +1,448 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
+
+/*!
+ \headerfile <QtProcessorDetection>
+ \inmodule QtCore
+ \title Architecture-specific Macro Definitions
+ \ingroup funclists
+
+ \brief The <QtProcessorDetection> header file includes various
+ architecture-specific macros.
+
+ The <QtProcessorDetection> header file declares a range of macros
+ (Q_PROCESSOR_*) that are defined if the application is compiled for
+ specified processor architectures. For example, the Q_PROCESSOR_X86 macro is
+ defined if the application is compiled for x86 processors.
+
+ The purpose of these macros is to enable programmers to add
+ architecture-specific code to their application.
+*/
+
+/*!
+ \macro Q_PROCESSOR_ALPHA
+ \relates <QtProcessorDetection>
+
+ Defined if the application is compiled for Alpha processors.
+
+ \sa QSysInfo::buildCpuArchitecture()
+*/
+
+/*!
+ \macro Q_PROCESSOR_ARM
+ \relates <QtProcessorDetection>
+
+ Defined if the application is compiled for ARM processors. Qt currently
+ supports three optional ARM revisions: \l Q_PROCESSOR_ARM_V5, \l
+ Q_PROCESSOR_ARM_V6, and \l Q_PROCESSOR_ARM_V7.
+
+ \sa QSysInfo::buildCpuArchitecture()
+*/
+/*!
+ \macro Q_PROCESSOR_ARM_V5
+ \relates <QtProcessorDetection>
+
+ Defined if the application is compiled for ARMv5 processors. The \l
+ Q_PROCESSOR_ARM macro is also defined when Q_PROCESSOR_ARM_V5 is defined.
+
+ \sa QSysInfo::buildCpuArchitecture()
+*/
+/*!
+ \macro Q_PROCESSOR_ARM_V6
+ \relates <QtProcessorDetection>
+
+ Defined if the application is compiled for ARMv6 processors. The \l
+ Q_PROCESSOR_ARM and \l Q_PROCESSOR_ARM_V5 macros are also defined when
+ Q_PROCESSOR_ARM_V6 is defined.
+
+ \sa QSysInfo::buildCpuArchitecture()
+*/
+/*!
+ \macro Q_PROCESSOR_ARM_V7
+ \relates <QtProcessorDetection>
+
+ Defined if the application is compiled for ARMv7 processors. The \l
+ Q_PROCESSOR_ARM, \l Q_PROCESSOR_ARM_V5, and \l Q_PROCESSOR_ARM_V6 macros
+ are also defined when Q_PROCESSOR_ARM_V7 is defined.
+
+ \sa QSysInfo::buildCpuArchitecture()
+*/
+
+/*!
+ \macro Q_PROCESSOR_AVR32
+ \relates <QtProcessorDetection>
+
+ Defined if the application is compiled for AVR32 processors.
+
+ \sa QSysInfo::buildCpuArchitecture()
+*/
+
+/*!
+ \macro Q_PROCESSOR_BLACKFIN
+ \relates <QtProcessorDetection>
+
+ Defined if the application is compiled for Blackfin processors.
+
+ \sa QSysInfo::buildCpuArchitecture()
+*/
+
+/*!
+ \macro Q_PROCESSOR_HPPA
+ \relates <QtProcessorDetection>
+
+ Defined if the application is compiled for PA-RISC processors.
+
+ \sa QSysInfo::buildCpuArchitecture()
+*/
+
+/*!
+ \macro Q_PROCESSOR_IA64
+ \relates <QtProcessorDetection>
+
+ Defined if the application is compiled for IA-64 processors. This includes
+ all Itanium and Itanium 2 processors.
+
+ \sa QSysInfo::buildCpuArchitecture()
+*/
+
+/*!
+ \macro Q_PROCESSOR_LOONGARCH
+ \relates <QtProcessorDetection>
+ \since 6.5
+
+ Defined if the application is compiled for LoongArch processors.
+
+ \sa QSysInfo::buildCpuArchitecture()
+*/
+
+/*!
+ \macro Q_PROCESSOR_LOONGARCH_32
+ \relates <QtProcessorDetection>
+ \since 6.5
+
+ Defined if the application is compiled for 32-bit LoongArch processors.
+ The \l Q_PROCESSOR_LOONGARCH macro is also defined when
+ Q_PROCESSOR_LOONGARCH_32 is defined.
+
+ \sa QSysInfo::buildCpuArchitecture()
+*/
+
+/*!
+ \macro Q_PROCESSOR_LOONGARCH_64
+ \relates <QtProcessorDetection>
+ \since 6.5
+
+ Defined if the application is compiled for 64-bit LoongArch processors.
+ The \l Q_PROCESSOR_LOONGARCH macro is also defined when
+ Q_PROCESSOR_LOONGARCH_64 is defined.
+
+ \sa QSysInfo::buildCpuArchitecture()
+*/
+
+/*!
+ \macro Q_PROCESSOR_M68K
+ \relates <QtProcessorDetection>
+
+ Defined if the application is compiled for Motorola 68000 processors.
+
+ \sa QSysInfo::buildCpuArchitecture()
+*/
+
+/*!
+ \macro Q_PROCESSOR_MIPS
+ \relates <QtProcessorDetection>
+
+ Defined if the application is compiled for MIPS processors. Qt currently
+ supports seven MIPS revisions: \l Q_PROCESSOR_MIPS_I, \l
+ Q_PROCESSOR_MIPS_II, \l Q_PROCESSOR_MIPS_III, \l Q_PROCESSOR_MIPS_IV, \l
+ Q_PROCESSOR_MIPS_V, \l Q_PROCESSOR_MIPS_32, and \l Q_PROCESSOR_MIPS_64.
+
+ \sa QSysInfo::buildCpuArchitecture()
+*/
+/*!
+ \macro Q_PROCESSOR_MIPS_I
+ \relates <QtProcessorDetection>
+
+ Defined if the application is compiled for MIPS-I processors. The \l
+ Q_PROCESSOR_MIPS macro is also defined when Q_PROCESSOR_MIPS_I is defined.
+
+ \sa QSysInfo::buildCpuArchitecture()
+*/
+/*!
+ \macro Q_PROCESSOR_MIPS_II
+ \relates <QtProcessorDetection>
+
+ Defined if the application is compiled for MIPS-II processors. The \l
+ Q_PROCESSOR_MIPS and \l Q_PROCESSOR_MIPS_I macros are also defined when
+ Q_PROCESSOR_MIPS_II is defined.
+
+ \sa QSysInfo::buildCpuArchitecture()
+*/
+/*!
+ \macro Q_PROCESSOR_MIPS_32
+ \relates <QtProcessorDetection>
+
+ Defined if the application is compiled for MIPS32 processors. The \l
+ Q_PROCESSOR_MIPS, \l Q_PROCESSOR_MIPS_I, and \l Q_PROCESSOR_MIPS_II macros
+ are also defined when Q_PROCESSOR_MIPS_32 is defined.
+
+ \sa QSysInfo::buildCpuArchitecture()
+*/
+/*!
+ \macro Q_PROCESSOR_MIPS_III
+ \relates <QtProcessorDetection>
+
+ Defined if the application is compiled for MIPS-III processors. The \l
+ Q_PROCESSOR_MIPS, \l Q_PROCESSOR_MIPS_I, and \l Q_PROCESSOR_MIPS_II macros
+ are also defined when Q_PROCESSOR_MIPS_III is defined.
+
+ \sa QSysInfo::buildCpuArchitecture()
+*/
+/*!
+ \macro Q_PROCESSOR_MIPS_IV
+ \relates <QtProcessorDetection>
+
+ Defined if the application is compiled for MIPS-IV processors. The \l
+ Q_PROCESSOR_MIPS, \l Q_PROCESSOR_MIPS_I, \l Q_PROCESSOR_MIPS_II, and \l
+ Q_PROCESSOR_MIPS_III macros are also defined when Q_PROCESSOR_MIPS_IV is
+ defined.
+
+ \sa QSysInfo::buildCpuArchitecture()
+*/
+/*!
+ \macro Q_PROCESSOR_MIPS_V
+ \relates <QtProcessorDetection>
+
+ Defined if the application is compiled for MIPS-V processors. The \l
+ Q_PROCESSOR_MIPS, \l Q_PROCESSOR_MIPS_I, \l Q_PROCESSOR_MIPS_II, \l
+ Q_PROCESSOR_MIPS_III, and \l Q_PROCESSOR_MIPS_IV macros are also defined
+ when Q_PROCESSOR_MIPS_V is defined.
+
+ \sa QSysInfo::buildCpuArchitecture()
+*/
+/*!
+ \macro Q_PROCESSOR_MIPS_64
+ \relates <QtProcessorDetection>
+
+ Defined if the application is compiled for MIPS64 processors. The \l
+ Q_PROCESSOR_MIPS, \l Q_PROCESSOR_MIPS_I, \l Q_PROCESSOR_MIPS_II, \l
+ Q_PROCESSOR_MIPS_III, \l Q_PROCESSOR_MIPS_IV, and \l Q_PROCESSOR_MIPS_V
+ macros are also defined when Q_PROCESSOR_MIPS_64 is defined.
+
+ \sa QSysInfo::buildCpuArchitecture()
+*/
+
+/*!
+ \macro Q_PROCESSOR_POWER
+ \relates <QtProcessorDetection>
+
+ Defined if the application is compiled for POWER processors. Qt currently
+ supports two Power variants: \l Q_PROCESSOR_POWER_32 and \l
+ Q_PROCESSOR_POWER_64.
+
+ \sa QSysInfo::buildCpuArchitecture()
+*/
+/*!
+ \macro Q_PROCESSOR_POWER_32
+ \relates <QtProcessorDetection>
+
+ Defined if the application is compiled for 32-bit Power processors. The \l
+ Q_PROCESSOR_POWER macro is also defined when Q_PROCESSOR_POWER_32 is
+ defined.
+
+ \sa QSysInfo::buildCpuArchitecture()
+*/
+/*!
+ \macro Q_PROCESSOR_POWER_64
+ \relates <QtProcessorDetection>
+
+ Defined if the application is compiled for 64-bit Power processors. The \l
+ Q_PROCESSOR_POWER macro is also defined when Q_PROCESSOR_POWER_64 is
+ defined.
+
+ \sa QSysInfo::buildCpuArchitecture()
+*/
+
+/*!
+ \macro Q_PROCESSOR_RISCV
+ \relates <QtProcessorDetection>
+ \since 5.13
+
+ Defined if the application is compiled for RISC-V processors. Qt currently
+ supports two RISC-V variants: \l Q_PROCESSOR_RISCV_32 and \l
+ Q_PROCESSOR_RISCV_64.
+
+ \sa QSysInfo::buildCpuArchitecture()
+*/
+
+/*!
+ \macro Q_PROCESSOR_RISCV_32
+ \relates <QtProcessorDetection>
+ \since 5.13
+
+ Defined if the application is compiled for 32-bit RISC-V processors. The \l
+ Q_PROCESSOR_RISCV macro is also defined when Q_PROCESSOR_RISCV_32 is
+ defined.
+
+ \sa QSysInfo::buildCpuArchitecture()
+*/
+
+/*!
+ \macro Q_PROCESSOR_RISCV_64
+ \relates <QtProcessorDetection>
+ \since 5.13
+
+ Defined if the application is compiled for 64-bit RISC-V processors. The \l
+ Q_PROCESSOR_RISCV macro is also defined when Q_PROCESSOR_RISCV_64 is
+ defined.
+
+ \sa QSysInfo::buildCpuArchitecture()
+*/
+
+/*!
+ \macro Q_PROCESSOR_S390
+ \relates <QtProcessorDetection>
+
+ Defined if the application is compiled for S/390 processors. Qt supports
+ one optional variant of S/390: Q_PROCESSOR_S390_X.
+
+ \sa QSysInfo::buildCpuArchitecture()
+*/
+/*!
+ \macro Q_PROCESSOR_S390_X
+ \relates <QtProcessorDetection>
+
+ Defined if the application is compiled for S/390x processors. The \l
+ Q_PROCESSOR_S390 macro is also defined when Q_PROCESSOR_S390_X is defined.
+
+ \sa QSysInfo::buildCpuArchitecture()
+*/
+
+/*!
+ \macro Q_PROCESSOR_SH
+ \relates <QtProcessorDetection>
+
+ Defined if the application is compiled for SuperH processors. Qt currently
+ supports one SuperH revision: \l Q_PROCESSOR_SH_4A.
+
+ \sa QSysInfo::buildCpuArchitecture()
+*/
+/*!
+ \macro Q_PROCESSOR_SH_4A
+ \relates <QtProcessorDetection>
+
+ Defined if the application is compiled for SuperH 4A processors. The \l
+ Q_PROCESSOR_SH macro is also defined when Q_PROCESSOR_SH_4A is defined.
+
+ \sa QSysInfo::buildCpuArchitecture()
+*/
+
+/*!
+ \macro Q_PROCESSOR_SPARC
+ \relates <QtProcessorDetection>
+
+ Defined if the application is compiled for SPARC processors. Qt currently
+ supports one optional SPARC revision: \l Q_PROCESSOR_SPARC_V9.
+
+ \sa QSysInfo::buildCpuArchitecture()
+*/
+/*!
+ \macro Q_PROCESSOR_SPARC_V9
+ \relates <QtProcessorDetection>
+
+ Defined if the application is compiled for SPARC V9 processors. The \l
+ Q_PROCESSOR_SPARC macro is also defined when Q_PROCESSOR_SPARC_V9 is
+ defined.
+
+ \sa QSysInfo::buildCpuArchitecture()
+*/
+
+/*!
+ \macro Q_PROCESSOR_X86
+ \relates <QtProcessorDetection>
+
+ Defined if the application is compiled for x86 processors. Qt currently
+ supports two x86 variants: \l Q_PROCESSOR_X86_32 and \l Q_PROCESSOR_X86_64.
+
+ \sa QSysInfo::buildCpuArchitecture()
+*/
+/*!
+ \macro Q_PROCESSOR_X86_32
+ \relates <QtProcessorDetection>
+
+ Defined if the application is compiled for 32-bit x86 processors. This
+ includes all i386, i486, i586, and i686 processors. The \l Q_PROCESSOR_X86
+ macro is also defined when Q_PROCESSOR_X86_32 is defined.
+
+ \sa QSysInfo::buildCpuArchitecture()
+*/
+/*!
+ \macro Q_PROCESSOR_X86_64
+ \relates <QtProcessorDetection>
+
+ Defined if the application is compiled for 64-bit x86 processors. This
+ includes all AMD64, Intel 64, and other x86_64/x64 processors. The \l
+ Q_PROCESSOR_X86 macro is also defined when Q_PROCESSOR_X86_64 is defined.
+
+ \sa QSysInfo::buildCpuArchitecture()
+*/
+
+/*!
+ \macro Q_BYTE_ORDER
+ \relates <QtProcessorDetection>
+
+ This macro can be used to determine the byte order your system
+ uses for storing data in memory. i.e., whether your system is
+ little-endian or big-endian. It is set by Qt to one of the macros
+ Q_LITTLE_ENDIAN or Q_BIG_ENDIAN. You normally won't need to worry
+ about endian-ness, but you might, for example if you need to know
+ which byte of an integer or UTF-16 character is stored in the
+ lowest address. Endian-ness is important in networking, where
+ computers with different values for Q_BYTE_ORDER must pass data
+ back and forth.
+
+ Use this macro as in the following examples.
+
+ \snippet code/src_corelib_global_qglobal.cpp 40
+
+ \sa Q_BIG_ENDIAN, Q_LITTLE_ENDIAN
+*/
+
+/*!
+ \macro Q_LITTLE_ENDIAN
+ \relates <QtProcessorDetection>
+
+ This macro represents a value you can compare to the macro
+ Q_BYTE_ORDER to determine the endian-ness of your system. In a
+ little-endian system, the least significant byte is stored at the
+ lowest address. The other bytes follow in increasing order of
+ significance.
+
+ \snippet code/src_corelib_global_qglobal.cpp 41
+
+ \sa Q_BYTE_ORDER, Q_BIG_ENDIAN
+*/
+
+/*!
+ \macro Q_BIG_ENDIAN
+ \relates <QtProcessorDetection>
+
+ This macro represents a value you can compare to the macro
+ Q_BYTE_ORDER to determine the endian-ness of your system. In a
+ big-endian system, the most significant byte is stored at the
+ lowest address. The other bytes follow in decreasing order of
+ significance.
+
+ \snippet code/src_corelib_global_qglobal.cpp 42
+
+ \sa Q_BYTE_ORDER, Q_LITTLE_ENDIAN
+*/
+
+/*!
+ \macro QT_POINTER_SIZE
+ \relates <QtProcessorDetection>
+
+ Expands to the size of a pointer in bytes (4 or 8). This is
+ equivalent to \c sizeof(void *) but can be used in a preprocessor
+ directive.
+*/
diff --git a/src/corelib/global/qrandom.cpp b/src/corelib/global/qrandom.cpp
index 34df85133b..fd742898f8 100644
--- a/src/corelib/global/qrandom.cpp
+++ b/src/corelib/global/qrandom.cpp
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 Intel Corporation.
-** Copyright (C) 2021 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 Intel Corporation.
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
// for rand_s
#define _CRT_RAND_S
@@ -46,7 +10,6 @@
#include <qendian.h>
#include <qmutex.h>
#include <qobjectdefs.h>
-#include <qthreadstorage.h>
#include <errno.h>
@@ -54,7 +17,9 @@
# include <sys/auxv.h>
#endif
-#if !QT_CONFIG(getentropy) && (!defined(Q_OS_BSD4) || defined(__GLIBC__)) && !defined(Q_OS_WIN)
+#if QT_CONFIG(getentropy) && __has_include(<sys/random.h>)
+# include <sys/random.h>
+#elif !QT_CONFIG(getentropy) && (!defined(Q_OS_BSD4) || defined(__GLIBC__)) && !defined(Q_OS_WIN)
# include "qdeadlinetimer.h"
# include "qhashfunctions.h"
#endif // !QT_CONFIG(getentropy)
@@ -228,7 +193,7 @@ static void fallback_fill(quint32 *ptr, qsizetype left) noexcept
arc4random_buf(ptr, left * sizeof(*ptr));
}
#else
-static QBasicAtomicInteger<unsigned> seed = Q_BASIC_ATOMIC_INITIALIZER(0U);
+Q_CONSTINIT static QBasicAtomicInteger<unsigned> seed = Q_BASIC_ATOMIC_INITIALIZER(0U);
static void fallback_update_seed(unsigned value)
{
// Update the seed to be used for the fallback mechanism, if we need to.
@@ -352,16 +317,17 @@ struct QRandomGenerator::SystemAndGlobalGenerators
// the state in case another thread tries to lock the mutex. It's not
// a common scenario, but since sizeof(QRandomGenerator) >= 2560, the
// overhead is actually acceptable.
- // 2) We use both alignas and std::aligned_storage<..., 64> because
- // some implementations of std::aligned_storage can't align to more
- // than a primitive type's alignment.
+ // 2) We use both alignas(T) and alignas(64) because some implementations
+ // can't align to more than a primitive type's alignment.
// 3) We don't store the entire system QRandomGenerator, only the space
// used by the QRandomGenerator::type member. This is fine because we
// (ab)use the common initial sequence exclusion to aliasing rules.
QBasicMutex globalPRNGMutex;
struct ShortenedSystem { uint type; } system_;
SystemGenerator sys;
- alignas(64) std::aligned_storage<sizeof(QRandomGenerator64), 64>::type global_;
+ alignas(64) struct {
+ alignas(QRandomGenerator64) uchar data[sizeof(QRandomGenerator64)];
+ } global_;
constexpr SystemAndGlobalGenerators()
: globalPRNGMutex{}, system_{0}, sys{}, global_{}
@@ -378,7 +344,7 @@ struct QRandomGenerator::SystemAndGlobalGenerators
static SystemAndGlobalGenerators *self()
{
- static SystemAndGlobalGenerators g;
+ Q_CONSTINIT static SystemAndGlobalGenerators g;
static_assert(sizeof(g) > sizeof(QRandomGenerator64));
return &g;
}
@@ -411,8 +377,9 @@ struct QRandomGenerator::SystemAndGlobalGenerators
struct PRNGLocker
{
+ Q_DISABLE_COPY_MOVE(PRNGLocker)
const bool locked;
- PRNGLocker(const QRandomGenerator *that)
+ Q_NODISCARD_CTOR explicit PRNGLocker(const QRandomGenerator *that)
: locked(that == globalNoInit())
{
if (locked)
@@ -681,7 +648,7 @@ inline QRandomGenerator::SystemGenerator &QRandomGenerator::SystemGenerator::sel
\fn bool operator==(const QRandomGenerator &rng1, const QRandomGenerator &rng2)
\relates QRandomGenerator
- Returns true if the two the two engines \a rng1 and \a rng2 are at the same
+ Returns true if the two engines \a rng1 and \a rng2 are at the same
state or if they are both reading from the operating system facilities,
false otherwise.
*/
@@ -689,7 +656,7 @@ inline QRandomGenerator::SystemGenerator &QRandomGenerator::SystemGenerator::sel
/*!
\fn bool QRandomGenerator::operator!=(const QRandomGenerator &rng1, const QRandomGenerator &rng2)
- Returns \c true if the two the two engines \a rng1 and \a rng2 are at
+ Returns \c true if the two engines \a rng1 and \a rng2 are at
different states or if one of them is reading from the operating system
facilities and the other is not, \c false otherwise.
*/
@@ -799,7 +766,7 @@ inline QRandomGenerator::SystemGenerator &QRandomGenerator::SystemGenerator::sel
*/
/*!
- \fn template <typename UInt> void QRandomGenerator::fillRange(UInt *buffer, qsizetype count)
+ \fn template <typename UInt, QRandomGenerator::IfValidUInt<UInt> = true> void QRandomGenerator::fillRange(UInt *buffer, qsizetype count)
Generates \a count 32- or 64-bit quantities (depending on the type \c UInt)
and stores them in the buffer pointed by \a buffer. This is the most
@@ -815,7 +782,7 @@ inline QRandomGenerator::SystemGenerator &QRandomGenerator::SystemGenerator::sel
*/
/*!
- \fn template <typename UInt, size_t N> void QRandomGenerator::fillRange(UInt (&buffer)[N])
+ \fn template <typename UInt, size_t N, QRandomGenerator::IfValidUInt<UInt> = true> void QRandomGenerator::fillRange(UInt (&buffer)[N])
Generates \c N 32- or 64-bit quantities (depending on the type \c UInt) and
stores them in the \a buffer array. This is the most efficient way to
diff --git a/src/corelib/global/qrandom.h b/src/corelib/global/qrandom.h
index 7639937da4..f8e53f4009 100644
--- a/src/corelib/global/qrandom.h
+++ b/src/corelib/global/qrandom.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QRANDOM_H
#define QRANDOM_H
@@ -203,8 +167,8 @@ public:
void seed(quint32 s = 1) { *this = { s }; }
void seed(std::seed_seq &sseq) noexcept { *this = { sseq }; }
Q_CORE_EXPORT void discard(unsigned long long z);
- static constexpr result_type min() { return std::numeric_limits<result_type>::min(); }
- static constexpr result_type max() { return std::numeric_limits<result_type>::max(); }
+ static constexpr result_type min() { return (std::numeric_limits<result_type>::min)(); }
+ static constexpr result_type max() { return (std::numeric_limits<result_type>::max)(); }
static inline Q_DECL_CONST_FUNCTION QRandomGenerator *system();
static inline Q_DECL_CONST_FUNCTION QRandomGenerator *global();
@@ -229,15 +193,9 @@ private:
union Storage {
uint dummy;
-#ifdef Q_COMPILER_UNRESTRICTED_UNIONS
RandomEngine twister;
RandomEngine &engine() { return twister; }
const RandomEngine &engine() const { return twister; }
-#else
- std::aligned_storage<sizeof(RandomEngine), alignof(RandomEngine)>::type buffer;
- RandomEngine &engine() { return reinterpret_cast<RandomEngine &>(buffer); }
- const RandomEngine &engine() const { return reinterpret_cast<const RandomEngine &>(buffer); }
-#endif
static_assert(std::is_trivially_destructible<RandomEngine>::value,
"std::mersenne_twister not trivially destructible as expected");
@@ -283,8 +241,8 @@ public:
QRandomGenerator::discard(z * 2);
}
- static constexpr result_type min() { return std::numeric_limits<result_type>::min(); }
- static constexpr result_type max() { return std::numeric_limits<result_type>::max(); }
+ static constexpr result_type min() { return (std::numeric_limits<result_type>::min)(); }
+ static constexpr result_type max() { return (std::numeric_limits<result_type>::max)(); }
static Q_DECL_CONST_FUNCTION Q_CORE_EXPORT QRandomGenerator64 *system();
static Q_DECL_CONST_FUNCTION Q_CORE_EXPORT QRandomGenerator64 *global();
static Q_CORE_EXPORT QRandomGenerator64 securelySeeded();
diff --git a/src/corelib/global/qrandom_p.h b/src/corelib/global/qrandom_p.h
index b8968c703e..c0209f97d2 100644
--- a/src/corelib/global/qrandom_p.h
+++ b/src/corelib/global/qrandom_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2017 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2017 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QRANDOM_P_H
#define QRANDOM_P_H
diff --git a/src/corelib/global/qsimd.cpp b/src/corelib/global/qsimd.cpp
index 025c50b6e8..8bc5381591 100644
--- a/src/corelib/global/qsimd.cpp
+++ b/src/corelib/global/qsimd.cpp
@@ -1,60 +1,34 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2019 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// Copyright (C) 2022 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
// we need ICC to define the prototype for _rdseed64_step
#define __INTEL_COMPILER_USE_INTRINSIC_PROTOTYPES
+#undef _FORTIFY_SOURCE // otherwise, the always_inline from stdio.h fail to inline
#include "qsimd_p.h"
#include "qalgorithms.h"
-#include <QByteArray>
+
#include <stdio.h>
+#include <string.h>
+
+#if defined(QT_NO_DEBUG) && !defined(NDEBUG)
+# define NDEBUG
+#endif
+#include <assert.h>
#ifdef Q_OS_LINUX
# include "../testlib/3rdparty/valgrind_p.h"
#endif
+#define QT_FUNCTION_TARGET_BASELINE
+
#if defined(Q_OS_WIN)
# if !defined(Q_CC_GNU)
# include <intrin.h>
# endif
-# if defined(Q_PROCESSOR_ARM64)
+# if defined(Q_PROCESSOR_ARM_64)
+# include <qt_windows.h>
# include <processthreadsapi.h>
# endif
#elif defined(Q_OS_LINUX) && defined(Q_PROCESSOR_MIPS_32)
@@ -88,6 +62,14 @@
QT_BEGIN_NAMESPACE
+template <typename T, uint N> QT_FUNCTION_TARGET_BASELINE
+uint arraysize(T (&)[N])
+{
+ // Same as std::size, but with QT_FUNCTION_TARGET_BASELIE,
+ // otherwise some versions of GCC fail to compile.
+ return N;
+}
+
#if defined(Q_PROCESSOR_ARM)
/* Data:
neon
@@ -117,16 +99,11 @@ static const int features_indices[] = {
# include "qsimd_x86.cpp" // generated by util/x86simdgen
#else
static const char features_string[] = "";
-static const int features_indices[] = { };
+static const int features_indices[] = { 0 };
#endif
// end generated
-#if defined (Q_OS_NACL)
-static inline uint detectProcessorFeatures()
-{
- return 0;
-}
-#elif defined(Q_PROCESSOR_ARM)
+#if defined(Q_PROCESSOR_ARM)
static inline quint64 detectProcessorFeatures()
{
quint64 features = 0;
@@ -166,7 +143,7 @@ static inline quint64 detectProcessorFeatures()
features |= CpuFeatureAES;
#endif
return features;
-#elif defined(Q_OS_WIN) && defined(Q_PROCESSOR_ARM64)
+#elif defined(Q_OS_WIN) && defined(Q_PROCESSOR_ARM_64)
features |= CpuFeatureNEON;
if (IsProcessorFeaturePresent(PF_ARM_V8_CRC32_INSTRUCTIONS_AVAILABLE) != 0)
features |= CpuFeatureCRC32;
@@ -194,9 +171,23 @@ static inline quint64 detectProcessorFeatures()
#else
# define PICreg "%%rbx"
#endif
+#ifdef __SSE2_MATH__
+# define X86_BASELINE "no-sse3"
+#else
+# define X86_BASELINE "no-sse"
+#endif
+
+#if defined(Q_CC_GNU)
+// lower the target for functions in this file
+# undef QT_FUNCTION_TARGET_BASELINE
+# define QT_FUNCTION_TARGET_BASELINE __attribute__((target(X86_BASELINE)))
+# define QT_FUNCTION_TARGET_STRING_BASELINE_RDRND \
+ X86_BASELINE "," QT_FUNCTION_TARGET_STRING_RDRND
+#endif
static bool checkRdrndWorks() noexcept;
+QT_FUNCTION_TARGET_BASELINE
static int maxBasicCpuidSupported()
{
#if defined(Q_CC_EMSCRIPTEN)
@@ -244,6 +235,7 @@ static int maxBasicCpuidSupported()
#endif
}
+QT_FUNCTION_TARGET_BASELINE
static void cpuidFeatures01(uint &ecx, uint &edx)
{
#if defined(Q_CC_GNU) && !defined(Q_CC_EMSCRIPTEN)
@@ -273,6 +265,7 @@ static void cpuidFeatures01(uint &ecx, uint &edx)
inline void __cpuidex(int info[4], int, __int64) { memset(info, 0, 4*sizeof(int));}
#endif
+QT_FUNCTION_TARGET_BASELINE
static void cpuidFeatures07_00(uint &ebx, uint &ecx, uint &edx)
{
#if defined(Q_CC_GNU) && !defined(Q_CC_EMSCRIPTEN)
@@ -306,6 +299,7 @@ static void cpuidFeatures07_00(uint &ebx, uint &ecx, uint &edx)
#endif
}
+QT_FUNCTION_TARGET_BASELINE
#if defined(Q_OS_WIN) && !(defined(Q_CC_GNU) || defined(Q_CC_GHS))
// fallback overload in case this intrinsic does not exist: unsigned __int64 _xgetbv(unsigned int);
inline quint64 _xgetbv(__int64) { return 0; }
@@ -327,22 +321,7 @@ static void xgetbv(uint in, uint &eax, uint &edx)
#endif
}
-// Flags from the XCR0 state register
-enum XCR0Flags {
- X87 = 1 << 0,
- XMM0_15 = 1 << 1,
- YMM0_15Hi128 = 1 << 2,
- BNDRegs = 1 << 3,
- BNDCSR = 1 << 4,
- OpMask = 1 << 5,
- ZMM0_15Hi256 = 1 << 6,
- ZMM16_31 = 1 << 7,
-
- SSEState = XMM0_15,
- AVXState = XMM0_15 | YMM0_15Hi128,
- AVX512State = AVXState | OpMask | ZMM0_15Hi256 | ZMM16_31
-};
-
+QT_FUNCTION_TARGET_BASELINE
static quint64 adjustedXcr0(quint64 xcr0)
{
/*
@@ -362,59 +341,54 @@ static quint64 adjustedXcr0(quint64 xcr0)
constexpr quintptr cpu_capabilities64 = commpage + 0x10;
quint64 capab = *reinterpret_cast<quint64 *>(cpu_capabilities64);
if (capab & kHasAVX512F)
- xcr0 |= AVX512State;
+ xcr0 |= XSave_Avx512State;
#endif
return xcr0;
}
+QT_FUNCTION_TARGET_BASELINE
static quint64 detectProcessorFeatures()
{
- static const quint64 AllAVX2 = CpuFeatureAVX2 | AllAVX512;
- static const quint64 AllAVX = CpuFeatureAVX | AllAVX2;
-
quint64 features = 0;
int cpuidLevel = maxBasicCpuidSupported();
#if Q_PROCESSOR_X86 < 5
if (cpuidLevel < 1)
return 0;
#else
- Q_ASSERT(cpuidLevel >= 1);
+ assert(cpuidLevel >= 1);
#endif
uint results[X86CpuidMaxLeaf] = {};
- cpuidFeatures01(results[Leaf1ECX], results[Leaf1EDX]);
+ cpuidFeatures01(results[Leaf01ECX], results[Leaf01EDX]);
if (cpuidLevel >= 7)
- cpuidFeatures07_00(results[Leaf7_0EBX], results[Leaf7_0ECX], results[Leaf7_0EDX]);
+ cpuidFeatures07_00(results[Leaf07_00EBX], results[Leaf07_00ECX], results[Leaf07_00EDX]);
// populate our feature list
- for (uint i = 0; i < sizeof(x86_locators) / sizeof(x86_locators[0]); ++i) {
+ for (uint i = 0; i < arraysize(x86_locators); ++i) {
uint word = x86_locators[i] / 32;
uint bit = 1U << (x86_locators[i] % 32);
- quint64 feature = Q_UINT64_C(1) << (i + 1);
+ quint64 feature = Q_UINT64_C(1) << i;
if (results[word] & bit)
features |= feature;
}
// now check the AVX state
quint64 xcr0 = 0;
- if (results[Leaf1ECX] & (1u << 27)) {
+ if (results[Leaf01ECX] & (1u << 27)) {
// XGETBV enabled
uint xgetbvA = 0, xgetbvD = 0;
xgetbv(0, xgetbvA, xgetbvD);
xcr0 = xgetbvA;
- if (sizeof(XCR0Flags) > sizeof(xgetbvA))
+ if (sizeof(XSaveBits) > sizeof(xgetbvA))
xcr0 |= quint64(xgetbvD) << 32;
xcr0 = adjustedXcr0(xcr0);
}
- if ((xcr0 & AVXState) != AVXState) {
- // support for YMM registers is disabled, disable all AVX
- features &= ~AllAVX;
- } else if ((xcr0 & AVX512State) != AVX512State) {
- // support for ZMM registers or mask registers is disabled, disable all AVX512
- features &= ~AllAVX512;
+ for (auto req : xsave_requirements) {
+ if ((xcr0 & req.xsave_state) != req.xsave_state)
+ features &= ~req.cpu_features;
}
if (features & CpuFeatureRDRND && !checkRdrndWorks())
@@ -577,32 +551,38 @@ static inline uint detectProcessorFeatures()
}
#endif
-static const int features_count = (sizeof features_indices) / (sizeof features_indices[0]);
-
// record what CPU features were enabled by default in this Qt build
static const quint64 minFeature = qCompilerCpuFeatures;
-#ifdef Q_ATOMIC_INT64_IS_SUPPORTED
-Q_CORE_EXPORT QBasicAtomicInteger<quint64> qt_cpu_features[1] = { Q_BASIC_ATOMIC_INITIALIZER(0) };
-#else
-Q_CORE_EXPORT QBasicAtomicInteger<unsigned> qt_cpu_features[2] = { Q_BASIC_ATOMIC_INITIALIZER(0), Q_BASIC_ATOMIC_INITIALIZER(0) };
-#endif
+static constexpr auto SimdInitialized = QCpuFeatureType(1) << (sizeof(QCpuFeatureType) * 8 - 1);
+Q_ATOMIC(QCpuFeatureType) QT_MANGLE_NAMESPACE(qt_cpu_features)[1] = { 0 };
-quint64 qDetectCpuFeatures()
+QT_FUNCTION_TARGET_BASELINE
+uint64_t QT_MANGLE_NAMESPACE(qDetectCpuFeatures)()
{
auto minFeatureTest = minFeature;
-#if defined(Q_OS_LINUX) && defined(Q_PROCESSOR_ARM_64)
- // Yocto hard-codes CRC32+AES on. Since they are unlikely to be used
- // automatically by compilers, we can just add runtime check.
- minFeatureTest &= ~(CpuFeatureAES|CpuFeatureCRC32);
+#if defined(Q_PROCESSOR_X86_64) && defined(cpu_feature_shstk)
+ // Controlflow Enforcement Technology (CET) is an OS-assisted
+ // hardware-feature, meaning the CPUID bit may be disabled if the OS
+ // doesn't support it, but that's ok.
+ minFeatureTest &= ~CpuFeatureSHSTK;
#endif
- quint64 f = detectProcessorFeatures();
- QByteArray disable = qgetenv("QT_NO_CPU_FEATURE");
- if (!disable.isEmpty()) {
- disable.prepend(' ');
- for (int i = 0; i < features_count; ++i) {
- if (disable.contains(features_string + features_indices[i]))
- f &= ~(Q_UINT64_C(1) << i);
+ QCpuFeatureType f = detectProcessorFeatures();
+
+ // Intentionally NOT qgetenv (this code runs too early)
+ if (char *disable = getenv("QT_NO_CPU_FEATURE"); disable && *disable) {
+#if _POSIX_C_SOURCE >= 200112L
+ char *saveptr = nullptr;
+ auto strtok = [&saveptr](char *str, const char *delim) {
+ return ::strtok_r(str, delim, &saveptr);
+ };
+#endif
+ while (char *token = strtok(disable, " ")) {
+ disable = nullptr;
+ for (uint i = 0; i < arraysize(features_indices); ++i) {
+ if (strcmp(token, features_string + features_indices[i]) == 0)
+ f &= ~(Q_UINT64_C(1) << i);
+ }
}
}
@@ -612,37 +592,36 @@ quint64 qDetectCpuFeatures()
bool runningOnValgrind = false;
#endif
if (Q_UNLIKELY(!runningOnValgrind && minFeatureTest != 0 && (f & minFeatureTest) != minFeatureTest)) {
- quint64 missing = minFeatureTest & ~f;
+ quint64 missing = minFeatureTest & ~quint64(f);
fprintf(stderr, "Incompatible processor. This Qt build requires the following features:\n ");
- for (int i = 0; i < features_count; ++i) {
+ for (uint i = 0; i < arraysize(features_indices); ++i) {
if (missing & (Q_UINT64_C(1) << i))
fprintf(stderr, "%s", features_string + features_indices[i]);
}
fprintf(stderr, "\n");
fflush(stderr);
- qFatal("Aborted. Incompatible processor: missing feature 0x%llx -%s.", missing,
- features_string + features_indices[qCountTrailingZeroBits(missing)]);
+ qAbort();
}
- qt_cpu_features[0].storeRelaxed(f | quint32(QSimdInitialized));
-#ifndef Q_ATOMIC_INT64_IS_SUPPORTED
- qt_cpu_features[1].storeRelaxed(f >> 32);
-#endif
+ assert((f & SimdInitialized) == 0);
+ f |= SimdInitialized;
+ std::atomic_store_explicit(QT_MANGLE_NAMESPACE(qt_cpu_features), f, std::memory_order_relaxed);
return f;
}
+QT_FUNCTION_TARGET_BASELINE
void qDumpCPUFeatures()
{
- quint64 features = qCpuFeatures() & ~quint64(QSimdInitialized);
+ quint64 features = detectProcessorFeatures() & ~SimdInitialized;
printf("Processor features: ");
- for (int i = 0; i < features_count; ++i) {
+ for (uint i = 0; i < arraysize(features_indices); ++i) {
if (features & (Q_UINT64_C(1) << i))
printf("%s%s", features_string + features_indices[i],
minFeature & (Q_UINT64_C(1) << i) ? "[required]" : "");
}
if ((features = (qCompilerCpuFeatures & ~features))) {
printf("\n!!!!!!!!!!!!!!!!!!!!\n!!! Missing required features:");
- for (int i = 0; i < features_count; ++i) {
+ for (uint i = 0; i < arraysize(features_indices); ++i) {
if (features & (Q_UINT64_C(1) << i))
printf("%s", features_string + features_indices[i]);
}
@@ -723,7 +702,8 @@ out:
return ptr;
}
-static QT_FUNCTION_TARGET(RDRND) Q_DECL_COLD_FUNCTION bool checkRdrndWorks() noexcept
+QT_FUNCTION_TARGET(BASELINE_RDRND) Q_DECL_COLD_FUNCTION
+static bool checkRdrndWorks() noexcept
{
/*
* Some AMD CPUs (e.g. AMD A4-6250J and AMD Ryzen 3000-series) have a
@@ -776,8 +756,20 @@ QT_FUNCTION_TARGET(RDRND) qsizetype qRandomCpu(void *buffer, qsizetype count) no
ptr = qt_random_rdrnd(ptr, end);
return ptr - reinterpret_cast<unsigned *>(buffer);
}
-#elif defined(Q_PROCESSOR_X86) && !defined(Q_OS_NACL) && !defined(Q_PROCESSOR_ARM)
+#elif defined(Q_PROCESSOR_X86) && !defined(Q_PROCESSOR_ARM)
static bool checkRdrndWorks() noexcept { return false; }
#endif // Q_PROCESSOR_X86 && RDRND
+#if QT_SUPPORTS_INIT_PRIORITY
+namespace {
+struct QSimdInitializer
+{
+ inline QSimdInitializer() { QT_MANGLE_NAMESPACE(qDetectCpuFeatures)(); }
+};
+}
+
+// This is intentionally a dynamic initialization of the variable
+Q_DECL_INIT_PRIORITY(01) static QSimdInitializer initializer;
+#endif
+
QT_END_NAMESPACE
diff --git a/src/corelib/global/qsimd.h b/src/corelib/global/qsimd.h
index 5fd34d0092..4ef925ca33 100644
--- a/src/corelib/global/qsimd.h
+++ b/src/corelib/global/qsimd.h
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Copyright (C) 2018 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// Copyright (C) 2022 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QSIMD_H
#define QSIMD_H
@@ -89,20 +53,20 @@
# define QT_COMPILER_USES_mips_dspr2 -1
#endif
-#if defined(Q_PROCESSOR_X86)
-#if defined(Q_CC_MSVC)
+#if defined(Q_PROCESSOR_X86) && defined(Q_CC_MSVC)
// MSVC doesn't define __SSE2__, so do it ourselves
-# if (defined(_M_X64) || _M_IX86_FP >= 2)
+# if (defined(_M_X64) || _M_IX86_FP >= 2) && defined(QT_COMPILER_SUPPORTS_SSE2)
# define __SSE__ 1
# define __SSE2__ 1
# endif
-#if (defined(_M_AVX) || defined(__AVX__))
+# if (defined(_M_AVX) || defined(__AVX__))
// Visual Studio defines __AVX__ when /arch:AVX is passed, but not the earlier macros
// See: https://msdn.microsoft.com/en-us/library/b0084kay.aspx
# define __SSE3__ 1
# define __SSSE3__ 1
# define __SSE4_1__ 1
# define __SSE4_2__ 1
+# define __POPCNT__ 1
# ifndef __AVX__
# define __AVX__ 1
# endif
@@ -110,7 +74,17 @@
# ifdef __SSE2__
# define QT_VECTORCALL __vectorcall
# endif
-#endif
+# ifdef __AVX2__
+// MSVC defines __AVX2__ with /arch:AVX2
+# define __F16C__ 1
+# define __RDRND__ 1
+# define __FMA__ 1
+# define __BMI__ 1
+# define __BMI2__ 1
+# define __MOVBE__ 1
+# define __LZCNT__ 1
+# endif
+// Starting with /arch:AVX512, MSVC defines all the macros
#endif
#if defined(Q_PROCESSOR_X86) && defined(__SSE2__)
diff --git a/src/corelib/global/qsimd_p.h b/src/corelib/global/qsimd_p.h
index 118a62e6ac..012eb6cf4f 100644
--- a/src/corelib/global/qsimd_p.h
+++ b/src/corelib/global/qsimd_p.h
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2018 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// Copyright (C) 2022 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QSIMD_P_H
#define QSIMD_P_H
@@ -55,34 +19,21 @@
#include <QtCore/private/qglobal_p.h>
#include <QtCore/qsimd.h>
+QT_WARNING_PUSH
+QT_WARNING_DISABLE_CLANG("-Wundef")
+QT_WARNING_DISABLE_GCC("-Wundef")
+QT_WARNING_DISABLE_INTEL(103)
+
+#define ALIGNMENT_PROLOGUE_16BYTES(ptr, i, length) \
+ for (; i < static_cast<int>(qMin(static_cast<quintptr>(length), ((4 - ((reinterpret_cast<quintptr>(ptr) >> 2) & 0x3)) & 0x3))); ++i)
+
+#define ALIGNMENT_PROLOGUE_32BYTES(ptr, i, length) \
+ for (; i < static_cast<int>(qMin(static_cast<quintptr>(length), ((8 - ((reinterpret_cast<quintptr>(ptr) >> 2) & 0x7)) & 0x7))); ++i)
+
+#define SIMD_EPILOGUE(i, length, max) \
+ for (int _i = 0; _i < max && i < length; ++i, ++_i)
+
/*
- * qt_module_config.prf defines the QT_COMPILER_SUPPORTS_XXX macros.
- * They mean the compiler supports the necessary flags and the headers
- * for the x86 and ARM intrinsics:
- * - GCC: the -mXXX or march=YYY flag is necessary before #include
- * up to 4.8; GCC >= 4.9 can include unconditionally
- * - Intel CC: #include can happen unconditionally
- * - MSVC: #include can happen unconditionally
- * - RVCT: ???
- *
- * We will try to include all headers possible under this configuration.
- *
- * MSVC does not define __SSE2__ & family, so we will define them. MSVC 2013 &
- * up do define __AVX__ if the -arch:AVX option is passed on the command-line.
- *
- * Supported XXX are:
- * Flag | Arch | GCC | Intel CC | MSVC |
- * ARM_NEON | ARM | I & C | None | ? |
- * SSE2 | x86 | I & C | I & C | I & C |
- * SSE3 | x86 | I & C | I & C | I only |
- * SSSE3 | x86 | I & C | I & C | I only |
- * SSE4_1 | x86 | I & C | I & C | I only |
- * SSE4_2 | x86 | I & C | I & C | I only |
- * AVX | x86 | I & C | I & C | I & C |
- * AVX2 | x86 | I & C | I & C | I only |
- * AVX512xx | x86 | I & C | I & C | I only |
- * I = intrinsics; C = code generation
- *
* Code can use the following constructs to determine compiler support & status:
* - #ifdef __XXX__ (e.g: #ifdef __AVX__ or #ifdef __ARM_NEON__)
* If this test passes, then the compiler is already generating code for that
@@ -103,6 +54,9 @@
* sub-arch. Only inside such functions is the use of the intrisics
* guaranteed to work. This is useful with runtime detection (see below).
*
+ * The distinction between QT_COMPILER_SUPPORTS and QT_COMPILER_SUPPORTS_HERE is
+ * historical: GCC 4.8 needed the distinction.
+ *
* Runtime detection of a CPU sub-architecture can be done with the
* qCpuHasFeature(XXX) function. There are two strategies for generating
* optimized code like that:
@@ -145,7 +99,7 @@
#define QT_COMPILER_SUPPORTS(x) (QT_COMPILER_SUPPORTS_ ## x - 0)
-#if defined(Q_PROCESSOR_ARM) && defined(QT_COMPILER_SUPPORTS_SIMD_ALWAYS)
+#if defined(Q_PROCESSOR_ARM)
# define QT_COMPILER_SUPPORTS_HERE(x) ((__ARM_FEATURE_ ## x) || (__ ## x ## __) || QT_COMPILER_SUPPORTS(x))
# if defined(Q_CC_GNU)
/* GCC requires attributes for a function */
@@ -162,35 +116,96 @@
# if !defined(__MIPS_DSPR2__) && defined(__mips_dspr2) && defined(Q_PROCESSOR_MIPS_32)
# define __MIPS_DSPR2__
# endif
-#elif defined(Q_PROCESSOR_X86) && defined(QT_COMPILER_SUPPORTS_SIMD_ALWAYS)
+#elif defined(Q_PROCESSOR_X86)
# if defined(Q_CC_CLANG) && defined(Q_CC_MSVC)
# define QT_COMPILER_SUPPORTS_HERE(x) (__ ## x ## __)
# else
# define QT_COMPILER_SUPPORTS_HERE(x) ((__ ## x ## __) || QT_COMPILER_SUPPORTS(x))
# endif
-# if defined(Q_CC_GNU) && !defined(Q_CC_INTEL)
+# if defined(Q_CC_GNU)
/* GCC requires attributes for a function */
# define QT_FUNCTION_TARGET(x) __attribute__((__target__(QT_FUNCTION_TARGET_STRING_ ## x)))
# else
# define QT_FUNCTION_TARGET(x)
# endif
-#elif defined(Q_PROCESSOR_ARM)
-# define QT_COMPILER_SUPPORTS_HERE(x) ((__ARM_FEATURE_ ## x) || (__ ## x ## __))
-# define QT_FUNCTION_TARGET(x)
#else
# define QT_COMPILER_SUPPORTS_HERE(x) (__ ## x ## __)
# define QT_FUNCTION_TARGET(x)
#endif
+#if defined(__SSE2__) && !defined(QT_COMPILER_SUPPORTS_SSE2) && !defined(QT_BOOTSTRAPPED)
+// Intrinsic support appears to be missing, so pretend these features don't exist
+# undef __SSE__
+# undef __SSE2__
+# undef __SSE3__
+# undef __SSSE3__
+# undef __SSE4_1__
+# undef __SSE4_2__
+# undef __AES__
+# undef __POPCNT__
+# undef __AVX__
+# undef __F16C__
+# undef __RDRND__
+# undef __AVX2__
+# undef __BMI__
+# undef __BMI2__
+# undef __FMA__
+# undef __MOVBE__
+# undef __RDSEED__
+# undef __AVX512F__
+# undef __AVX512ER__
+# undef __AVX512CD__
+# undef __AVX512PF__
+# undef __AVX512DQ__
+# undef __AVX512BW__
+# undef __AVX512VL__
+# undef __AVX512IFMA__
+# undef __AVX512VBMI__
+# undef __SHA__
+# undef __AVX512VBMI2__
+# undef __AVX512BITALG__
+# undef __AVX512VNNI__
+# undef __AVX512VPOPCNTDQ__
+# undef __GFNI__
+# undef __VAES__
+#endif
+
#ifdef Q_PROCESSOR_X86
/* -- x86 intrinsic support -- */
+# if defined(QT_COMPILER_SUPPORTS_RDSEED) && defined(Q_OS_QNX)
+// The compiler for QNX is missing the intrinsic
+# undef QT_COMPILER_SUPPORTS_RDSEED
+# endif
# if defined(Q_CC_MSVC) && (defined(_M_X64) || _M_IX86_FP >= 2)
// MSVC doesn't define __SSE2__, so do it ourselves
# define __SSE__ 1
# endif
-# if defined(Q_CC_GNU) && !defined(Q_CC_INTEL) && !defined(Q_OS_WASM)
+# if defined(Q_OS_WIN) && defined(Q_CC_GNU) && !defined(Q_CC_CLANG)
+// 64-bit GCC on Windows does not support AVX, so we hack around it by forcing
+// it to emit unaligned loads & stores
+// See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=49001
+asm(
+ ".macro vmovapd args:vararg\n"
+ " vmovupd \\args\n"
+ ".endm\n"
+ ".macro vmovaps args:vararg\n"
+ " vmovups \\args\n"
+ ".endm\n"
+ ".macro vmovdqa args:vararg\n"
+ " vmovdqu \\args\n"
+ ".endm\n"
+ ".macro vmovdqa32 args:vararg\n"
+ " vmovdqu32 \\args\n"
+ ".endm\n"
+ ".macro vmovdqa64 args:vararg\n"
+ " vmovdqu64 \\args\n"
+ ".endm\n"
+);
+# endif
+
+# if defined(Q_CC_GNU) && !defined(Q_OS_WASM)
// GCC 4.4 and Clang 2.8 added a few more intrinsics there
# include <x86intrin.h>
# endif
@@ -198,71 +213,46 @@
# include <immintrin.h>
# endif
-# if defined(__SSE4_2__) && defined(QT_COMPILER_SUPPORTS_SIMD_ALWAYS) && (defined(Q_CC_INTEL) || defined(Q_CC_MSVC))
-// POPCNT instructions:
-// All processors that support SSE4.2 support POPCNT
-// (but neither MSVC nor the Intel compiler define this macro)
-# define __POPCNT__ 1
-# endif
-
-// AVX intrinsics
-# if defined(__AVX__) && defined(QT_COMPILER_SUPPORTS_SIMD_ALWAYS) && (defined(Q_CC_INTEL) || defined(Q_CC_MSVC))
-// PCLMULQDQ instructions:
-// All processors that support AVX support PCLMULQDQ
-// (but neither MSVC nor the Intel compiler define this macro)
-# define __PCLMUL__ 1
-# endif
-
-# if defined(__AVX2__) && defined(QT_COMPILER_SUPPORTS_SIMD_ALWAYS) && (defined(Q_CC_INTEL) || defined(Q_CC_MSVC))
-// F16C instructions:
-// All processors that support AVX2 support F16C:
-// (but neither MSVC nor the Intel compiler define this macro)
-# define __F16C__ 1
-# endif
-
-# if defined(__BMI__) && !defined(__BMI2__) && defined(Q_CC_INTEL)
-// BMI2 instructions:
-// All processors that support BMI support BMI2 (and AVX2)
-// (but neither MSVC nor the Intel compiler define this macro)
-# define __BMI2__ 1
-# endif
+# include <QtCore/private/qsimd_x86_p.h>
-# include "qsimd_x86_p.h"
-
-// Haswell sub-architecture
+// x86-64 sub-architecture version 3
//
// The Intel Core 4th generation was codenamed "Haswell" and introduced AVX2,
-// BMI1, BMI2, FMA, LZCNT, MOVBE, which makes it a good divider for a
-// sub-target for us. The first AMD processor with AVX2 support (Zen) has the
-// same features.
-//
-// macOS's fat binaries support the "x86_64h" sub-architecture and the GNU libc
-// ELF loader also supports a "haswell/" subdir (e.g., /usr/lib/haswell).
-# define QT_FUNCTION_TARGET_STRING_ARCH_HASWELL "arch=haswell"
-# if defined(__AVX2__) && defined(__BMI__) && defined(__BMI2__) && defined(__F16C__) && \
- defined(__FMA__) && defined(__LZCNT__) && defined(__RDRND__)
+// BMI1, BMI2, FMA, LZCNT, MOVBE. This feature set was chosen as the version 3
+// of the x86-64 ISA (x86-64-v3) and is supported by GCC and Clang. On systems
+// with the GNU libc, libraries with this feature can be installed on a
+// "glibc-hwcaps/x86-64-v3" subdir. macOS's fat binaries support the "x86_64h"
+// sub-architecture too.
+
+# if defined(__AVX2__)
+// List of features present with -march=x86-64-v3 and not architecturally
+// implied by __AVX2__
+# define ARCH_HASWELL_MACROS \
+ (__AVX2__ + __BMI__ + __BMI2__ + __F16C__ + __FMA__ + __LZCNT__ + __POPCNT__)
+# if ARCH_HASWELL_MACROS != 7
+# error "Please enable all x86-64-v3 extensions; you probably want to use -march=haswell or -march=x86-64-v3 instead of -mavx2"
+# endif
+static_assert(ARCH_HASWELL_MACROS, "Undeclared identifiers indicate which features are missing.");
# define __haswell__ 1
+# undef ARCH_HASWELL_MACROS
# endif
-// This constant does not include all CPU features found in a Haswell, only
-// those that we'd have optimized code for.
-// Note: must use Q_CONSTEXPR here, as this file may be compiled in C mode.
-QT_BEGIN_NAMESPACE
-static const quint64 CpuFeatureArchHaswell = 0
- | CpuFeatureSSE2
- | CpuFeatureSSE3
- | CpuFeatureSSSE3
- | CpuFeatureSSE4_1
- | CpuFeatureSSE4_2
- | CpuFeatureFMA
- | CpuFeaturePOPCNT
- | CpuFeatureAVX
- | CpuFeatureF16C
- | CpuFeatureAVX2
- | CpuFeatureBMI
- | CpuFeatureBMI2;
-QT_END_NAMESPACE
-
+// x86-64 sub-architecture version 4
+//
+// Similar to the above, x86-64-v4 matches the AVX512 variant of the Intel Core
+// 6th generation (codename "Skylake"). AMD Zen4 is the their first processor
+// with AVX512 support and it includes all of these too. The GNU libc subdir for
+// this is "glibc-hwcaps/x86-64-v4".
+//
+# define ARCH_SKX_MACROS (__AVX512F__ + __AVX512BW__ + __AVX512CD__ + __AVX512DQ__ + __AVX512VL__)
+# if ARCH_SKX_MACROS != 0
+# if ARCH_SKX_MACROS != 5
+# error "Please enable all x86-64-v4 extensions; you probably want to use -march=skylake-avx512 or -march=x86-64-v4 instead of -mavx512f"
+# endif
+static_assert(ARCH_SKX_MACROS, "Undeclared identifiers indicate which features are missing.");
+# define __skylake_avx512__ 1
+# endif
+# undef ARCH_SKX_MACROS
#endif /* Q_PROCESSOR_X86 */
// NEON intrinsics
@@ -317,12 +307,6 @@ inline uint8_t vaddv_u8(uint8x8_t v8)
#endif
#endif
-
-#ifdef __cplusplus
-#include <qatomic.h>
-
-QT_BEGIN_NAMESPACE
-
#ifndef Q_PROCESSOR_X86
enum CPUFeatures {
#if defined(Q_PROCESSOR_ARM)
@@ -335,21 +319,25 @@ enum CPUFeatures {
CpuFeatureDSP = 2,
CpuFeatureDSPR2 = 4,
#endif
-
- // used only to indicate that the CPU detection was initialised
- QSimdInitialized = 1
};
-static const quint64 qCompilerCpuFeatures = 0
+static const uint64_t qCompilerCpuFeatures = 0
#if defined __ARM_NEON__
| CpuFeatureNEON
#endif
+#if !(defined(Q_OS_LINUX) && defined(Q_PROCESSOR_ARM_64))
+ // Yocto Project recipes enable Crypto extension for all ARMv8 configs,
+ // even for targets without the Crypto extension. That's wrong, but as
+ // the compiler never generates the code for them on their own, most
+ // code never notices the problem. But we would. By not setting the
+ // bits here, we force a runtime detection.
#if defined __ARM_FEATURE_CRC32
| CpuFeatureCRC32
#endif
#if defined __ARM_FEATURE_CRYPTO
| CpuFeatureAES
#endif
+#endif // Q_OS_LINUX && Q_PROCESSOR_ARM64
#if defined __mips_dsp
| CpuFeatureDSP
#endif
@@ -359,58 +347,71 @@ static const quint64 qCompilerCpuFeatures = 0
;
#endif
-#ifdef Q_ATOMIC_INT64_IS_SUPPORTED
-extern Q_CORE_EXPORT QBasicAtomicInteger<quint64> qt_cpu_features[1];
+#ifdef __cplusplus
+# include <atomic>
+# define Q_ATOMIC(T) std::atomic<T>
+QT_BEGIN_NAMESPACE
+using std::atomic_load_explicit;
+static constexpr auto memory_order_relaxed = std::memory_order_relaxed;
+extern "C" {
#else
-extern Q_CORE_EXPORT QBasicAtomicInteger<unsigned> qt_cpu_features[2];
+# include <stdatomic.h>
+# define Q_ATOMIC(T) _Atomic(T)
#endif
-Q_CORE_EXPORT quint64 qDetectCpuFeatures();
-#if defined(Q_PROCESSOR_X86) && QT_COMPILER_SUPPORTS_HERE(RDRND) && !defined(QT_BOOTSTRAPPED)
-Q_CORE_EXPORT qsizetype qRandomCpu(void *, qsizetype) noexcept;
+#ifdef Q_PROCESSOR_X86
+typedef uint64_t QCpuFeatureType;
+static const QCpuFeatureType qCompilerCpuFeatures = _compilerCpuFeatures;
+static const QCpuFeatureType CpuFeatureArchHaswell = cpu_haswell;
+static const QCpuFeatureType CpuFeatureArchSkylakeAvx512 = cpu_skylake_avx512;
#else
-static inline qsizetype qRandomCpu(void *, qsizetype) noexcept
-{
- return 0;
-}
+typedef unsigned QCpuFeatureType;
#endif
+extern Q_CORE_EXPORT Q_ATOMIC(QCpuFeatureType) QT_MANGLE_NAMESPACE(qt_cpu_features)[1];
+Q_CORE_EXPORT uint64_t QT_MANGLE_NAMESPACE(qDetectCpuFeatures)();
-static inline quint64 qCpuFeatures()
+static inline uint64_t qCpuFeatures()
{
- quint64 features = qt_cpu_features[0].loadRelaxed();
-#ifndef Q_ATOMIC_INT64_IS_SUPPORTED
- features |= quint64(qt_cpu_features[1].loadRelaxed()) << 32;
-#endif
- if (Q_UNLIKELY(features == 0)) {
- features = qDetectCpuFeatures();
- Q_ASSUME(features != 0);
+#ifdef QT_BOOTSTRAPPED
+ return qCompilerCpuFeatures; // no detection
+#else
+ quint64 features = atomic_load_explicit(QT_MANGLE_NAMESPACE(qt_cpu_features), memory_order_relaxed);
+ if (!QT_SUPPORTS_INIT_PRIORITY) {
+ if (Q_UNLIKELY(features == 0))
+ features = QT_MANGLE_NAMESPACE(qDetectCpuFeatures)();
}
return features;
+#endif
}
#define qCpuHasFeature(feature) (((qCompilerCpuFeatures & CpuFeature ## feature) == CpuFeature ## feature) \
|| ((qCpuFeatures() & CpuFeature ## feature) == CpuFeature ## feature))
-inline bool qHasHwrng()
+#ifdef __cplusplus
+} // extern "C"
+
+# if defined(Q_PROCESSOR_X86) && QT_COMPILER_SUPPORTS_HERE(RDRND) && !defined(QT_BOOTSTRAPPED)
+Q_CORE_EXPORT qsizetype qRandomCpu(void *, qsizetype) noexcept;
+
+static inline bool qHasHwrng()
{
-#if defined(Q_PROCESSOR_X86) && QT_COMPILER_SUPPORTS_HERE(RDRND)
return qCpuHasFeature(RDRND);
-#else
+}
+# else
+static inline qsizetype qRandomCpu(void *, qsizetype) noexcept
+{
+ return 0;
+}
+static inline bool qHasHwrng()
+{
return false;
-#endif
}
-
-#define ALIGNMENT_PROLOGUE_16BYTES(ptr, i, length) \
- for (; i < static_cast<int>(qMin(static_cast<quintptr>(length), ((4 - ((reinterpret_cast<quintptr>(ptr) >> 2) & 0x3)) & 0x3))); ++i)
-
-#define ALIGNMENT_PROLOGUE_32BYTES(ptr, i, length) \
- for (; i < static_cast<int>(qMin(static_cast<quintptr>(length), ((8 - ((reinterpret_cast<quintptr>(ptr) >> 2) & 0x7)) & 0x7))); ++i)
+# endif
QT_END_NAMESPACE
#endif // __cplusplus
-#define SIMD_EPILOGUE(i, length, max) \
- for (int _i = 0; _i < max && i < length; ++i, ++_i)
+QT_WARNING_POP
#endif // QSIMD_P_H
diff --git a/src/corelib/global/qsimd_x86.cpp b/src/corelib/global/qsimd_x86.cpp
index be17f44c09..9a3bd80b39 100644
--- a/src/corelib/global/qsimd_x86.cpp
+++ b/src/corelib/global/qsimd_x86.cpp
@@ -1,45 +1,9 @@
-/****************************************************************************
-**
-** Copyright (C) 2018 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
+// Copyright (C) 2022 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
// This is a generated file. DO NOT EDIT.
-// Please see util/x86simdgen/generate.pl
-#include "qsimd_p.h"
+// Please see util/x86simdgen/README.md
+
+#include "qsimd_x86_p.h"
static const char features_string[] =
" sse2\0"
@@ -55,101 +19,202 @@ static const char features_string[] =
" f16c\0"
" rdrnd\0"
" bmi\0"
- " hle\0"
" avx2\0"
" bmi2\0"
- " rtm\0"
" avx512f\0"
" avx512dq\0"
" rdseed\0"
" avx512ifma\0"
- " avx512pf\0"
- " avx512er\0"
" avx512cd\0"
" sha\0"
" avx512bw\0"
" avx512vl\0"
" avx512vbmi\0"
+ " waitpkg\0"
" avx512vbmi2\0"
+ " shstk\0"
" gfni\0"
" vaes\0"
- " avx512vnni\0"
" avx512bitalg\0"
" avx512vpopcntdq\0"
- " avx5124nniw\0"
- " avx5124fmaps\0"
+ " hybrid\0"
+ " ibt\0"
+ " avx512fp16\0"
+ " raoint\0"
+ " cmpccxadd\0"
+ " avxifma\0"
+ " lam\0"
"\0";
-static const quint16 features_indices[] = {
- 306, 0, 6, 12, 19, 24, 32, 40,
- 47, 55, 60, 65, 71, 78, 83, 88,
- 94, 100, 105, 114, 124, 132, 144, 154,
- 164, 174, 179, 189, 199, 211, 224, 230,
- 236, 248, 262, 279, 292
+static const uint16_t features_indices[] = {
+ 0, 6, 12, 19, 24, 32, 40, 47,
+ 55, 60, 65, 71, 78, 83, 89, 95,
+ 104, 114, 122, 134, 144, 149, 159, 169,
+ 181, 190, 203, 210, 216, 222, 236, 253,
+ 261, 266, 278, 286, 297, 306,
};
enum X86CpuidLeaves {
- Leaf1ECX,
- Leaf1EDX,
- Leaf7_0EBX,
- Leaf7_0ECX,
- Leaf7_0EDX,
+ Leaf01EDX,
+ Leaf01ECX,
+ Leaf07_00EBX,
+ Leaf07_00ECX,
+ Leaf07_00EDX,
+ Leaf07_01EAX,
+ Leaf07_01EDX,
+ Leaf13_01EAX,
+ Leaf80000001hECX,
+ Leaf80000008hEBX,
X86CpuidMaxLeaf
};
-static const quint8 x86_locators[] = {
- Leaf1EDX*32 + 26, // sse2
- Leaf1ECX*32 + 0, // sse3
- Leaf1ECX*32 + 9, // ssse3
- Leaf1ECX*32 + 12, // fma
- Leaf1ECX*32 + 19, // sse4.1
- Leaf1ECX*32 + 20, // sse4.2
- Leaf1ECX*32 + 22, // movbe
- Leaf1ECX*32 + 23, // popcnt
- Leaf1ECX*32 + 25, // aes
- Leaf1ECX*32 + 28, // avx
- Leaf1ECX*32 + 29, // f16c
- Leaf1ECX*32 + 30, // rdrnd
- Leaf7_0EBX*32 + 3, // bmi
- Leaf7_0EBX*32 + 4, // hle
- Leaf7_0EBX*32 + 5, // avx2
- Leaf7_0EBX*32 + 8, // bmi2
- Leaf7_0EBX*32 + 11, // rtm
- Leaf7_0EBX*32 + 16, // avx512f
- Leaf7_0EBX*32 + 17, // avx512dq
- Leaf7_0EBX*32 + 18, // rdseed
- Leaf7_0EBX*32 + 21, // avx512ifma
- Leaf7_0EBX*32 + 26, // avx512pf
- Leaf7_0EBX*32 + 27, // avx512er
- Leaf7_0EBX*32 + 28, // avx512cd
- Leaf7_0EBX*32 + 29, // sha
- Leaf7_0EBX*32 + 30, // avx512bw
- Leaf7_0EBX*32 + 31, // avx512vl
- Leaf7_0ECX*32 + 1, // avx512vbmi
- Leaf7_0ECX*32 + 6, // avx512vbmi2
- Leaf7_0ECX*32 + 8, // gfni
- Leaf7_0ECX*32 + 9, // vaes
- Leaf7_0ECX*32 + 11, // avx512vnni
- Leaf7_0ECX*32 + 12, // avx512bitalg
- Leaf7_0ECX*32 + 14, // avx512vpopcntdq
- Leaf7_0EDX*32 + 2, // avx5124nniw
- Leaf7_0EDX*32 + 3 // avx5124fmaps
+static const uint16_t x86_locators[] = {
+ Leaf01EDX*32 + 26, // sse2
+ Leaf01ECX*32 + 0, // sse3
+ Leaf01ECX*32 + 9, // ssse3
+ Leaf01ECX*32 + 12, // fma
+ Leaf01ECX*32 + 19, // sse4.1
+ Leaf01ECX*32 + 20, // sse4.2
+ Leaf01ECX*32 + 22, // movbe
+ Leaf01ECX*32 + 23, // popcnt
+ Leaf01ECX*32 + 25, // aes
+ Leaf01ECX*32 + 28, // avx
+ Leaf01ECX*32 + 29, // f16c
+ Leaf01ECX*32 + 30, // rdrnd
+ Leaf07_00EBX*32 + 3, // bmi
+ Leaf07_00EBX*32 + 5, // avx2
+ Leaf07_00EBX*32 + 8, // bmi2
+ Leaf07_00EBX*32 + 16, // avx512f
+ Leaf07_00EBX*32 + 17, // avx512dq
+ Leaf07_00EBX*32 + 18, // rdseed
+ Leaf07_00EBX*32 + 21, // avx512ifma
+ Leaf07_00EBX*32 + 28, // avx512cd
+ Leaf07_00EBX*32 + 29, // sha
+ Leaf07_00EBX*32 + 30, // avx512bw
+ Leaf07_00EBX*32 + 31, // avx512vl
+ Leaf07_00ECX*32 + 1, // avx512vbmi
+ Leaf07_00ECX*32 + 5, // waitpkg
+ Leaf07_00ECX*32 + 6, // avx512vbmi2
+ Leaf07_00ECX*32 + 7, // shstk
+ Leaf07_00ECX*32 + 8, // gfni
+ Leaf07_00ECX*32 + 9, // vaes
+ Leaf07_00ECX*32 + 12, // avx512bitalg
+ Leaf07_00ECX*32 + 14, // avx512vpopcntdq
+ Leaf07_00EDX*32 + 15, // hybrid
+ Leaf07_00EDX*32 + 20, // ibt
+ Leaf07_00EDX*32 + 23, // avx512fp16
+ Leaf07_01EAX*32 + 3, // raoint
+ Leaf07_01EAX*32 + 6, // cmpccxadd
+ Leaf07_01EAX*32 + 23, // avxifma
+ Leaf07_01EAX*32 + 26, // lam
+};
+
+struct X86Architecture
+{
+ uint64_t features;
+ char name[17 + 1];
+};
+
+static const struct X86Architecture x86_architectures[] = {
+ { cpu_core2, "Core2" },
+ { cpu_westmere, "Westmere" },
+ { cpu_sandybridge, "Sandy Bridge" },
+ { cpu_silvermont, "Silvermont" },
+ { cpu_ivybridge, "Ivy Bridge" },
+ { cpu_goldmont, "Goldmont" },
+ { cpu_haswell, "Haswell" },
+ { cpu_broadwell, "Broadwell" },
+ { cpu_tremont, "Tremont" },
+ { cpu_skylake, "Skylake" },
+ { cpu_skylake_avx512, "Skylake (Avx512)" },
+ { cpu_cascadelake, "Cascade Lake" },
+ { cpu_cooperlake, "Cooper Lake" },
+ { cpu_cannonlake, "Cannon Lake" },
+ { cpu_gracemont, "Gracemont" },
+ { cpu_icelake_client, "Ice Lake (Client)" },
+ { cpu_icelake_server, "Ice Lake (Server)" },
+ { cpu_crestmont, "Crestmont" },
+ { cpu_tigerlake, "Tiger Lake" },
+ { cpu_clearwaterforest, "Clearwater Forest" },
+ { cpu_grandridge, "Grand Ridge" },
+ { cpu_raptorcove, "Raptor Cove" },
+ { cpu_redwoodcove, "Redwood Cove" },
+ { cpu_emeraldrapids, "Emerald Rapids" },
+ { cpu_graniterapids, "Granite Rapids" },
+};
+
+enum XSaveBits {
+ XSave_X87 = 0x0001, // X87 and MMX state
+ XSave_SseState = 0x0002, // SSE: 128 bits of XMM registers
+ XSave_Ymm_Hi128 = 0x0004, // AVX: high 128 bits in YMM registers
+ XSave_Bndregs = 0x0008, // Memory Protection Extensions
+ XSave_Bndcsr = 0x0010, // Memory Protection Extensions
+ XSave_OpMask = 0x0020, // AVX512: k0 through k7
+ XSave_Zmm_Hi256 = 0x0040, // AVX512: high 256 bits of ZMM0-15
+ XSave_Hi16_Zmm = 0x0080, // AVX512: all 512 bits of ZMM16-31
+ XSave_PTState = 0x0100, // Processor Trace
+ XSave_PKRUState = 0x0200, // Protection Key
+ XSave_CetUState = 0x0800, // CET: user mode
+ XSave_CetSState = 0x1000, // CET: supervisor mode
+ XSave_HdcState = 0x2000, // Hardware Duty Cycle
+ XSave_UintrState = 0x4000, // User Interrupts
+ XSave_HwpState = 0x10000, // Hardware P-State
+ XSave_Xtilecfg = 0x20000, // AMX: XTILECFG register
+ XSave_Xtiledata = 0x40000, // AMX: data in the tiles
+ XSave_AvxState = XSave_SseState | XSave_Ymm_Hi128,
+ XSave_MPXState = XSave_Bndregs | XSave_Bndcsr,
+ XSave_Avx512State = XSave_AvxState | XSave_OpMask | XSave_Zmm_Hi256 | XSave_Hi16_Zmm,
+ XSave_CetState = XSave_CetUState | XSave_CetSState,
+ XSave_AmxState = XSave_Xtilecfg | XSave_Xtiledata,
+};
+
+// List of features requiring XSave_AvxState
+static const uint64_t XSaveReq_AvxState = 0
+ | cpu_feature_fma
+ | cpu_feature_avx
+ | cpu_feature_f16c
+ | cpu_feature_avx2
+ | cpu_feature_avx512f
+ | cpu_feature_avx512dq
+ | cpu_feature_avx512ifma
+ | cpu_feature_avx512cd
+ | cpu_feature_avx512bw
+ | cpu_feature_avx512vl
+ | cpu_feature_avx512vbmi
+ | cpu_feature_avx512vbmi2
+ | cpu_feature_vaes
+ | cpu_feature_avx512bitalg
+ | cpu_feature_avx512vpopcntdq
+ | cpu_feature_avx512fp16
+ | cpu_feature_avxifma;
+
+// List of features requiring XSave_Avx512State
+static const uint64_t XSaveReq_Avx512State = 0
+ | cpu_feature_avx512f
+ | cpu_feature_avx512dq
+ | cpu_feature_avx512ifma
+ | cpu_feature_avx512cd
+ | cpu_feature_avx512bw
+ | cpu_feature_avx512vl
+ | cpu_feature_avx512vbmi
+ | cpu_feature_avx512vbmi2
+ | cpu_feature_avx512bitalg
+ | cpu_feature_avx512vpopcntdq
+ | cpu_feature_avx512fp16;
+
+// List of features requiring XSave_CetState
+static const uint64_t XSaveReq_CetState = 0
+ | cpu_feature_shstk;
+
+struct XSaveRequirementMapping
+{
+ uint64_t cpu_features;
+ uint64_t xsave_state;
+};
+
+static const struct XSaveRequirementMapping xsave_requirements[] = {
+ { XSaveReq_AvxState, XSave_AvxState },
+ { XSaveReq_Avx512State, XSave_Avx512State },
+ { XSaveReq_CetState, XSave_CetState },
};
-// List of AVX512 features (see detectProcessorFeatures())
-static const quint64 AllAVX512 = 0
- | CpuFeatureAVX512F
- | CpuFeatureAVX512DQ
- | CpuFeatureAVX512IFMA
- | CpuFeatureAVX512PF
- | CpuFeatureAVX512ER
- | CpuFeatureAVX512CD
- | CpuFeatureAVX512BW
- | CpuFeatureAVX512VL
- | CpuFeatureAVX512VBMI
- | CpuFeatureAVX512VBMI2
- | CpuFeatureAVX512VNNI
- | CpuFeatureAVX512BITALG
- | CpuFeatureAVX512VPOPCNTDQ
- | CpuFeatureAVX5124NNIW
- | CpuFeatureAVX5124FMAPS;
diff --git a/src/corelib/global/qsimd_x86_p.h b/src/corelib/global/qsimd_x86_p.h
index 82e3008a24..1ec89d0c6c 100644
--- a/src/corelib/global/qsimd_x86_p.h
+++ b/src/corelib/global/qsimd_x86_p.h
@@ -1,51 +1,7 @@
-/****************************************************************************
-**
-** Copyright (C) 2018 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
+// Copyright (C) 2022 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
// This is a generated file. DO NOT EDIT.
-// Please see util/x86simdgen/generate.pl
-#ifndef QSIMD_P_H
-# error "Please include <private/qsimd_p.h> instead"
-#endif
-#ifndef QSIMD_X86_P_H
-#define QSIMD_X86_P_H
-
-#include "qsimd_p.h"
+// Please see util/x86simdgen/README.md
//
// W A R N I N G
@@ -58,204 +14,536 @@
// We mean it.
//
-QT_BEGIN_NAMESPACE
+// This is a generated file. DO NOT EDIT.
+// Please see util/x86simdgen/README.md
+#ifndef QSIMD_X86_P_H
+#define QSIMD_X86_P_H
-// used only to indicate that the CPU detection was initialized
-#define QSimdInitialized (Q_UINT64_C(1) << 0)
+#include <stdint.h>
// in CPUID Leaf 1, EDX:
-#define CpuFeatureSSE2 (Q_UINT64_C(1) << 1)
-#define QT_FUNCTION_TARGET_STRING_SSE2 "sse2"
+#define cpu_feature_sse2 (UINT64_C(1) << 0)
// in CPUID Leaf 1, ECX:
-#define CpuFeatureSSE3 (Q_UINT64_C(1) << 2)
+#define cpu_feature_sse3 (UINT64_C(1) << 1)
+#define cpu_feature_ssse3 (UINT64_C(1) << 2)
+#define cpu_feature_fma (UINT64_C(1) << 3)
+#define cpu_feature_sse4_1 (UINT64_C(1) << 4)
+#define cpu_feature_sse4_2 (UINT64_C(1) << 5)
+#define cpu_feature_movbe (UINT64_C(1) << 6)
+#define cpu_feature_popcnt (UINT64_C(1) << 7)
+#define cpu_feature_aes (UINT64_C(1) << 8)
+#define cpu_feature_avx (UINT64_C(1) << 9)
+#define cpu_feature_f16c (UINT64_C(1) << 10)
+#define cpu_feature_rdrnd (UINT64_C(1) << 11)
+
+// in CPUID Leaf 7, Sub-leaf 0, EBX:
+#define cpu_feature_bmi (UINT64_C(1) << 12)
+#define cpu_feature_avx2 (UINT64_C(1) << 13)
+#define cpu_feature_bmi2 (UINT64_C(1) << 14)
+#define cpu_feature_avx512f (UINT64_C(1) << 15)
+#define cpu_feature_avx512dq (UINT64_C(1) << 16)
+#define cpu_feature_rdseed (UINT64_C(1) << 17)
+#define cpu_feature_avx512ifma (UINT64_C(1) << 18)
+#define cpu_feature_avx512cd (UINT64_C(1) << 19)
+#define cpu_feature_sha (UINT64_C(1) << 20)
+#define cpu_feature_avx512bw (UINT64_C(1) << 21)
+#define cpu_feature_avx512vl (UINT64_C(1) << 22)
+
+// in CPUID Leaf 7, Sub-leaf 0, ECX:
+#define cpu_feature_avx512vbmi (UINT64_C(1) << 23)
+#define cpu_feature_waitpkg (UINT64_C(1) << 24)
+#define cpu_feature_avx512vbmi2 (UINT64_C(1) << 25)
+#define cpu_feature_shstk (UINT64_C(1) << 26)
+#define cpu_feature_gfni (UINT64_C(1) << 27)
+#define cpu_feature_vaes (UINT64_C(1) << 28)
+#define cpu_feature_avx512bitalg (UINT64_C(1) << 29)
+#define cpu_feature_avx512vpopcntdq (UINT64_C(1) << 30)
+
+// in CPUID Leaf 7, Sub-leaf 0, EDX:
+#define cpu_feature_hybrid (UINT64_C(1) << 31)
+#define cpu_feature_ibt (UINT64_C(1) << 32)
+#define cpu_feature_avx512fp16 (UINT64_C(1) << 33)
+
+// in CPUID Leaf 7, Sub-leaf 1, EAX:
+#define cpu_feature_raoint (UINT64_C(1) << 34)
+#define cpu_feature_cmpccxadd (UINT64_C(1) << 35)
+#define cpu_feature_avxifma (UINT64_C(1) << 36)
+#define cpu_feature_lam (UINT64_C(1) << 37)
+
+// CPU architectures
+#define cpu_x86_64 (0 \
+ | cpu_feature_sse2)
+#define cpu_core2 (cpu_x86_64 \
+ | cpu_feature_sse3 \
+ | cpu_feature_ssse3)
+#define cpu_nhm (cpu_core2 \
+ | cpu_feature_sse4_1 \
+ | cpu_feature_sse4_2 \
+ | cpu_feature_popcnt)
+#define cpu_wsm (cpu_nhm)
+#define cpu_snb (cpu_wsm \
+ | cpu_feature_avx)
+#define cpu_ivb (cpu_snb \
+ | cpu_feature_f16c \
+ | cpu_feature_rdrnd)
+#define cpu_hsw (cpu_ivb \
+ | cpu_feature_avx2 \
+ | cpu_feature_fma \
+ | cpu_feature_bmi \
+ | cpu_feature_bmi2 \
+ | cpu_feature_movbe)
+#define cpu_bdw (cpu_hsw \
+ | cpu_feature_rdseed)
+#define cpu_bdx (cpu_bdw)
+#define cpu_skl (cpu_bdw)
+#define cpu_skx (cpu_skl \
+ | cpu_feature_avx512f \
+ | cpu_feature_avx512dq \
+ | cpu_feature_avx512cd \
+ | cpu_feature_avx512bw \
+ | cpu_feature_avx512vl)
+#define cpu_clx (cpu_skx)
+#define cpu_cpx (cpu_clx)
+#define cpu_plc (cpu_skx \
+ | cpu_feature_avx512ifma \
+ | cpu_feature_avx512vbmi)
+#define cpu_snc (cpu_plc \
+ | cpu_feature_avx512vbmi2 \
+ | cpu_feature_gfni \
+ | cpu_feature_vaes \
+ | cpu_feature_avx512bitalg \
+ | cpu_feature_avx512vpopcntdq)
+#define cpu_wlc (cpu_snc \
+ | cpu_feature_shstk \
+ | cpu_feature_ibt)
+#define cpu_glc (cpu_wlc \
+ | cpu_feature_waitpkg)
+#define cpu_rpc (cpu_glc)
+#define cpu_rwc (cpu_rpc)
+#define cpu_slm (cpu_wsm \
+ | cpu_feature_rdrnd \
+ | cpu_feature_movbe)
+#define cpu_glm (cpu_slm \
+ | cpu_feature_rdseed)
+#define cpu_tnt (cpu_glm \
+ | cpu_feature_gfni \
+ | cpu_feature_waitpkg)
+#define cpu_grt (cpu_skl \
+ | cpu_feature_gfni \
+ | cpu_feature_vaes \
+ | cpu_feature_shstk \
+ | cpu_feature_ibt \
+ | cpu_feature_waitpkg)
+#define cpu_cmt (cpu_grt \
+ | cpu_feature_cmpccxadd \
+ | cpu_feature_avxifma)
+#define cpu_cnl (cpu_plc)
+#define cpu_icl (cpu_snc)
+#define cpu_tgl (cpu_wlc)
+#define cpu_adl (cpu_grt)
+#define cpu_rpl (cpu_grt)
+#define cpu_mtl (cpu_cmt)
+#define cpu_arl (cpu_cmt)
+#define cpu_lnl (cpu_cmt)
+#define cpu_icx (cpu_snc)
+#define cpu_spr (cpu_glc)
+#define cpu_emr (cpu_spr)
+#define cpu_gnr (cpu_glc)
+#define cpu_srf (cpu_cmt \
+ | cpu_feature_cmpccxadd \
+ | cpu_feature_avxifma)
+#define cpu_grr (cpu_srf \
+ | cpu_feature_raoint)
+#define cpu_cwf (cpu_srf)
+#define cpu_nehalem (cpu_nhm)
+#define cpu_westmere (cpu_wsm)
+#define cpu_sandybridge (cpu_snb)
+#define cpu_ivybridge (cpu_ivb)
+#define cpu_haswell (cpu_hsw)
+#define cpu_broadwell (cpu_bdw)
+#define cpu_skylake (cpu_skl)
+#define cpu_skylake_avx512 (cpu_skx)
+#define cpu_cascadelake (cpu_clx)
+#define cpu_cooperlake (cpu_cpx)
+#define cpu_palmcove (cpu_plc)
+#define cpu_cannonlake (cpu_cnl)
+#define cpu_sunnycove (cpu_snc)
+#define cpu_icelake_client (cpu_icl)
+#define cpu_icelake_server (cpu_icx)
+#define cpu_willowcove (cpu_wlc)
+#define cpu_tigerlake (cpu_tgl)
+#define cpu_goldencove (cpu_glc)
+#define cpu_alderlake (cpu_adl)
+#define cpu_raptorcove (cpu_rpc)
+#define cpu_raptorlake (cpu_rpl)
+#define cpu_redwoodcove (cpu_rwc)
+#define cpu_meteorlake (cpu_mtl)
+#define cpu_arrowlake (cpu_arl)
+#define cpu_lunarlake (cpu_lnl)
+#define cpu_sapphirerapids (cpu_spr)
+#define cpu_emeraldrapids (cpu_emr)
+#define cpu_graniterapids (cpu_gnr)
+#define cpu_silvermont (cpu_slm)
+#define cpu_goldmont (cpu_glm)
+#define cpu_tremont (cpu_tnt)
+#define cpu_gracemont (cpu_grt)
+#define cpu_crestmont (cpu_cmt)
+#define cpu_grandridge (cpu_grr)
+#define cpu_sierraforest (cpu_srf)
+#define cpu_clearwaterforest (cpu_cwf)
+
+// __attribute__ target strings for GCC and Clang
+#define QT_FUNCTION_TARGET_STRING_SSE2 "sse2"
#define QT_FUNCTION_TARGET_STRING_SSE3 "sse3"
-#define CpuFeatureSSSE3 (Q_UINT64_C(1) << 3)
#define QT_FUNCTION_TARGET_STRING_SSSE3 "ssse3"
-#define CpuFeatureFMA (Q_UINT64_C(1) << 4)
#define QT_FUNCTION_TARGET_STRING_FMA "fma"
-#define CpuFeatureSSE4_1 (Q_UINT64_C(1) << 5)
#define QT_FUNCTION_TARGET_STRING_SSE4_1 "sse4.1"
-#define CpuFeatureSSE4_2 (Q_UINT64_C(1) << 6)
#define QT_FUNCTION_TARGET_STRING_SSE4_2 "sse4.2"
-#define CpuFeatureMOVBE (Q_UINT64_C(1) << 7)
#define QT_FUNCTION_TARGET_STRING_MOVBE "movbe"
-#define CpuFeaturePOPCNT (Q_UINT64_C(1) << 8)
#define QT_FUNCTION_TARGET_STRING_POPCNT "popcnt"
-#define CpuFeatureAES (Q_UINT64_C(1) << 9)
#define QT_FUNCTION_TARGET_STRING_AES "aes,sse4.2"
-#define CpuFeatureAVX (Q_UINT64_C(1) << 10)
#define QT_FUNCTION_TARGET_STRING_AVX "avx"
-#define CpuFeatureF16C (Q_UINT64_C(1) << 11)
-#define QT_FUNCTION_TARGET_STRING_F16C "f16c"
-#define CpuFeatureRDRND (Q_UINT64_C(1) << 12)
+#define QT_FUNCTION_TARGET_STRING_F16C "f16c,avx"
#define QT_FUNCTION_TARGET_STRING_RDRND "rdrnd"
-
-// in CPUID Leaf 7, Sub-leaf 0, EBX:
-#define CpuFeatureBMI (Q_UINT64_C(1) << 13)
#define QT_FUNCTION_TARGET_STRING_BMI "bmi"
-#define CpuFeatureHLE (Q_UINT64_C(1) << 14)
-#define QT_FUNCTION_TARGET_STRING_HLE "hle"
-#define CpuFeatureAVX2 (Q_UINT64_C(1) << 15)
-#define QT_FUNCTION_TARGET_STRING_AVX2 "avx2"
-#define CpuFeatureBMI2 (Q_UINT64_C(1) << 16)
+#define QT_FUNCTION_TARGET_STRING_AVX2 "avx2,avx"
#define QT_FUNCTION_TARGET_STRING_BMI2 "bmi2"
-#define CpuFeatureRTM (Q_UINT64_C(1) << 17)
-#define QT_FUNCTION_TARGET_STRING_RTM "rtm"
-#define CpuFeatureAVX512F (Q_UINT64_C(1) << 18)
-#define QT_FUNCTION_TARGET_STRING_AVX512F "avx512f"
-#define CpuFeatureAVX512DQ (Q_UINT64_C(1) << 19)
-#define QT_FUNCTION_TARGET_STRING_AVX512DQ "avx512dq"
-#define CpuFeatureRDSEED (Q_UINT64_C(1) << 20)
+#define QT_FUNCTION_TARGET_STRING_AVX512F "avx512f,avx"
+#define QT_FUNCTION_TARGET_STRING_AVX512DQ "avx512dq,avx512f"
#define QT_FUNCTION_TARGET_STRING_RDSEED "rdseed"
-#define CpuFeatureAVX512IFMA (Q_UINT64_C(1) << 21)
-#define QT_FUNCTION_TARGET_STRING_AVX512IFMA "avx512ifma"
-#define CpuFeatureAVX512PF (Q_UINT64_C(1) << 22)
-#define QT_FUNCTION_TARGET_STRING_AVX512PF "avx512pf"
-#define CpuFeatureAVX512ER (Q_UINT64_C(1) << 23)
-#define QT_FUNCTION_TARGET_STRING_AVX512ER "avx512er"
-#define CpuFeatureAVX512CD (Q_UINT64_C(1) << 24)
-#define QT_FUNCTION_TARGET_STRING_AVX512CD "avx512cd"
-#define CpuFeatureSHA (Q_UINT64_C(1) << 25)
+#define QT_FUNCTION_TARGET_STRING_AVX512IFMA "avx512ifma,avx512f"
+#define QT_FUNCTION_TARGET_STRING_AVX512CD "avx512cd,avx512f"
#define QT_FUNCTION_TARGET_STRING_SHA "sha"
-#define CpuFeatureAVX512BW (Q_UINT64_C(1) << 26)
-#define QT_FUNCTION_TARGET_STRING_AVX512BW "avx512bw"
-#define CpuFeatureAVX512VL (Q_UINT64_C(1) << 27)
-#define QT_FUNCTION_TARGET_STRING_AVX512VL "avx512vl"
-
-// in CPUID Leaf 7, Sub-leaf 0, ECX:
-#define CpuFeatureAVX512VBMI (Q_UINT64_C(1) << 28)
-#define QT_FUNCTION_TARGET_STRING_AVX512VBMI "avx512vbmi"
-#define CpuFeatureAVX512VBMI2 (Q_UINT64_C(1) << 29)
-#define QT_FUNCTION_TARGET_STRING_AVX512VBMI2 "avx512vbmi2"
-#define CpuFeatureGFNI (Q_UINT64_C(1) << 30)
+#define QT_FUNCTION_TARGET_STRING_AVX512BW "avx512bw,avx512f"
+#define QT_FUNCTION_TARGET_STRING_AVX512VL "avx512vl,avx512f"
+#define QT_FUNCTION_TARGET_STRING_AVX512VBMI "avx512vbmi,avx512f"
+#define QT_FUNCTION_TARGET_STRING_WAITPKG "waitpkg"
+#define QT_FUNCTION_TARGET_STRING_AVX512VBMI2 "avx512vbmi2,avx512f"
+#define QT_FUNCTION_TARGET_STRING_SHSTK "shstk"
#define QT_FUNCTION_TARGET_STRING_GFNI "gfni"
-#define CpuFeatureVAES (Q_UINT64_C(1) << 31)
-#define QT_FUNCTION_TARGET_STRING_VAES "vaes"
-#define CpuFeatureAVX512VNNI (Q_UINT64_C(1) << 32)
-#define QT_FUNCTION_TARGET_STRING_AVX512VNNI "avx512vnni"
-#define CpuFeatureAVX512BITALG (Q_UINT64_C(1) << 33)
-#define QT_FUNCTION_TARGET_STRING_AVX512BITALG "avx512bitalg"
-#define CpuFeatureAVX512VPOPCNTDQ (Q_UINT64_C(1) << 34)
-#define QT_FUNCTION_TARGET_STRING_AVX512VPOPCNTDQ "avx512vpopcntdq"
-
-// in CPUID Leaf 7, Sub-leaf 0, EDX:
-#define CpuFeatureAVX5124NNIW (Q_UINT64_C(1) << 35)
-#define QT_FUNCTION_TARGET_STRING_AVX5124NNIW "avx5124nniw"
-#define CpuFeatureAVX5124FMAPS (Q_UINT64_C(1) << 36)
-#define QT_FUNCTION_TARGET_STRING_AVX5124FMAPS "avx5124fmaps"
+#define QT_FUNCTION_TARGET_STRING_VAES "vaes,avx2,avx,aes"
+#define QT_FUNCTION_TARGET_STRING_AVX512BITALG "avx512bitalg,avx512f"
+#define QT_FUNCTION_TARGET_STRING_AVX512VPOPCNTDQ "avx512vpopcntdq,avx512f"
+#define QT_FUNCTION_TARGET_STRING_HYBRID "hybrid"
+#define QT_FUNCTION_TARGET_STRING_IBT "ibt"
+#define QT_FUNCTION_TARGET_STRING_AVX512FP16 "avx512fp16,avx512f,f16c"
+#define QT_FUNCTION_TARGET_STRING_RAOINT "raoint"
+#define QT_FUNCTION_TARGET_STRING_CMPCCXADD "cmpccxadd"
+#define QT_FUNCTION_TARGET_STRING_AVXIFMA "avxifma,avx"
+#define QT_FUNCTION_TARGET_STRING_LAM "lam"
+#define QT_FUNCTION_TARGET_STRING_ARCH_X86_64 "sse2"
+#define QT_FUNCTION_TARGET_STRING_ARCH_CORE2 QT_FUNCTION_TARGET_STRING_ARCH_X86_64 ",sse3,ssse3,cx16"
+#define QT_FUNCTION_TARGET_STRING_ARCH_NHM QT_FUNCTION_TARGET_STRING_ARCH_CORE2 ",sse4.1,sse4.2,popcnt"
+#define QT_FUNCTION_TARGET_STRING_ARCH_WSM QT_FUNCTION_TARGET_STRING_ARCH_NHM
+#define QT_FUNCTION_TARGET_STRING_ARCH_SNB QT_FUNCTION_TARGET_STRING_ARCH_WSM ",avx"
+#define QT_FUNCTION_TARGET_STRING_ARCH_IVB QT_FUNCTION_TARGET_STRING_ARCH_SNB ",f16c,rdrnd,fsgsbase"
+#define QT_FUNCTION_TARGET_STRING_ARCH_HSW QT_FUNCTION_TARGET_STRING_ARCH_IVB ",avx2,fma,bmi,bmi2,lzcnt,movbe"
+#define QT_FUNCTION_TARGET_STRING_ARCH_BDW QT_FUNCTION_TARGET_STRING_ARCH_HSW ",adx,rdseed"
+#define QT_FUNCTION_TARGET_STRING_ARCH_BDX QT_FUNCTION_TARGET_STRING_ARCH_BDW
+#define QT_FUNCTION_TARGET_STRING_ARCH_SKL QT_FUNCTION_TARGET_STRING_ARCH_BDW ",xsavec,xsaves"
+#define QT_FUNCTION_TARGET_STRING_ARCH_SKX QT_FUNCTION_TARGET_STRING_ARCH_SKL ",avx512f,avx512dq,avx512cd,avx512bw,avx512vl"
+#define QT_FUNCTION_TARGET_STRING_ARCH_CLX QT_FUNCTION_TARGET_STRING_ARCH_SKX ",avx512vnni"
+#define QT_FUNCTION_TARGET_STRING_ARCH_CPX QT_FUNCTION_TARGET_STRING_ARCH_CLX ",avx512bf16"
+#define QT_FUNCTION_TARGET_STRING_ARCH_PLC QT_FUNCTION_TARGET_STRING_ARCH_SKX ",avx512ifma,avx512vbmi"
+#define QT_FUNCTION_TARGET_STRING_ARCH_SNC QT_FUNCTION_TARGET_STRING_ARCH_PLC ",avx512vbmi2,gfni,vaes,vpclmulqdq,avx512vnni,avx512bitalg,avx512vpopcntdq"
+#define QT_FUNCTION_TARGET_STRING_ARCH_WLC QT_FUNCTION_TARGET_STRING_ARCH_SNC ",shstk,movdiri,movdir64b,ibt,keylocker"
+#define QT_FUNCTION_TARGET_STRING_ARCH_GLC QT_FUNCTION_TARGET_STRING_ARCH_WLC ",avx512bf16,avxvnni,cldemote,waitpkg,serialize,uintr"
+#define QT_FUNCTION_TARGET_STRING_ARCH_RPC QT_FUNCTION_TARGET_STRING_ARCH_GLC
+#define QT_FUNCTION_TARGET_STRING_ARCH_RWC QT_FUNCTION_TARGET_STRING_ARCH_RPC ",prefetchiti"
+#define QT_FUNCTION_TARGET_STRING_ARCH_SLM QT_FUNCTION_TARGET_STRING_ARCH_WSM ",rdrnd,movbe"
+#define QT_FUNCTION_TARGET_STRING_ARCH_GLM QT_FUNCTION_TARGET_STRING_ARCH_SLM ",fsgsbase,rdseed,lzcnt,xsavec,xsaves"
+#define QT_FUNCTION_TARGET_STRING_ARCH_TNT QT_FUNCTION_TARGET_STRING_ARCH_GLM ",clwb,gfni,cldemote,waitpkg,movdiri,movdir64b"
+#define QT_FUNCTION_TARGET_STRING_ARCH_GRT QT_FUNCTION_TARGET_STRING_ARCH_SKL ",avxvnni,gfni,vaes,vpclmulqdq,serialize,shstk,cldemote,movdiri,movdir64b,ibt,waitpkg,keylocker"
+#define QT_FUNCTION_TARGET_STRING_ARCH_CMT QT_FUNCTION_TARGET_STRING_ARCH_GRT ",cmpccxadd,avxifma,avxneconvert,avxvnniint8"
+#define QT_FUNCTION_TARGET_STRING_ARCH_CNL QT_FUNCTION_TARGET_STRING_ARCH_PLC
+#define QT_FUNCTION_TARGET_STRING_ARCH_ICL QT_FUNCTION_TARGET_STRING_ARCH_SNC
+#define QT_FUNCTION_TARGET_STRING_ARCH_TGL QT_FUNCTION_TARGET_STRING_ARCH_WLC
+#define QT_FUNCTION_TARGET_STRING_ARCH_ADL QT_FUNCTION_TARGET_STRING_ARCH_GRT
+#define QT_FUNCTION_TARGET_STRING_ARCH_RPL QT_FUNCTION_TARGET_STRING_ARCH_GRT
+#define QT_FUNCTION_TARGET_STRING_ARCH_MTL QT_FUNCTION_TARGET_STRING_ARCH_CMT
+#define QT_FUNCTION_TARGET_STRING_ARCH_ARL QT_FUNCTION_TARGET_STRING_ARCH_CMT
+#define QT_FUNCTION_TARGET_STRING_ARCH_LNL QT_FUNCTION_TARGET_STRING_ARCH_CMT
+#define QT_FUNCTION_TARGET_STRING_ARCH_ICX QT_FUNCTION_TARGET_STRING_ARCH_SNC ",pconfig"
+#define QT_FUNCTION_TARGET_STRING_ARCH_SPR QT_FUNCTION_TARGET_STRING_ARCH_GLC ",pconfig,amx-tile,amx-bf16,amx-int8"
+#define QT_FUNCTION_TARGET_STRING_ARCH_EMR QT_FUNCTION_TARGET_STRING_ARCH_SPR
+#define QT_FUNCTION_TARGET_STRING_ARCH_GNR QT_FUNCTION_TARGET_STRING_ARCH_GLC ",pconfig,amx-tile,amx-bf16,amx-int8,amx-fp16,amx-complex"
+#define QT_FUNCTION_TARGET_STRING_ARCH_SRF QT_FUNCTION_TARGET_STRING_ARCH_CMT ",cmpccxadd,avxifma,avxneconvert,avxvnniint8"
+#define QT_FUNCTION_TARGET_STRING_ARCH_GRR QT_FUNCTION_TARGET_STRING_ARCH_SRF ",raoint"
+#define QT_FUNCTION_TARGET_STRING_ARCH_CWF QT_FUNCTION_TARGET_STRING_ARCH_SRF
+#define QT_FUNCTION_TARGET_STRING_ARCH_NEHALEM QT_FUNCTION_TARGET_STRING_ARCH_NHM
+#define QT_FUNCTION_TARGET_STRING_ARCH_WESTMERE QT_FUNCTION_TARGET_STRING_ARCH_WSM
+#define QT_FUNCTION_TARGET_STRING_ARCH_SANDYBRIDGE QT_FUNCTION_TARGET_STRING_ARCH_SNB
+#define QT_FUNCTION_TARGET_STRING_ARCH_IVYBRIDGE QT_FUNCTION_TARGET_STRING_ARCH_IVB
+#define QT_FUNCTION_TARGET_STRING_ARCH_HASWELL QT_FUNCTION_TARGET_STRING_ARCH_HSW
+#define QT_FUNCTION_TARGET_STRING_ARCH_BROADWELL QT_FUNCTION_TARGET_STRING_ARCH_BDW
+#define QT_FUNCTION_TARGET_STRING_ARCH_SKYLAKE QT_FUNCTION_TARGET_STRING_ARCH_SKL
+#define QT_FUNCTION_TARGET_STRING_ARCH_SKYLAKE_AVX512 QT_FUNCTION_TARGET_STRING_ARCH_SKX
+#define QT_FUNCTION_TARGET_STRING_ARCH_CASCADELAKE QT_FUNCTION_TARGET_STRING_ARCH_CLX
+#define QT_FUNCTION_TARGET_STRING_ARCH_COOPERLAKE QT_FUNCTION_TARGET_STRING_ARCH_CPX
+#define QT_FUNCTION_TARGET_STRING_ARCH_PALMCOVE QT_FUNCTION_TARGET_STRING_ARCH_PLC
+#define QT_FUNCTION_TARGET_STRING_ARCH_CANNONLAKE QT_FUNCTION_TARGET_STRING_ARCH_CNL
+#define QT_FUNCTION_TARGET_STRING_ARCH_SUNNYCOVE QT_FUNCTION_TARGET_STRING_ARCH_SNC
+#define QT_FUNCTION_TARGET_STRING_ARCH_ICELAKE_CLIENT QT_FUNCTION_TARGET_STRING_ARCH_ICL
+#define QT_FUNCTION_TARGET_STRING_ARCH_ICELAKE_SERVER QT_FUNCTION_TARGET_STRING_ARCH_ICX
+#define QT_FUNCTION_TARGET_STRING_ARCH_WILLOWCOVE QT_FUNCTION_TARGET_STRING_ARCH_WLC
+#define QT_FUNCTION_TARGET_STRING_ARCH_TIGERLAKE QT_FUNCTION_TARGET_STRING_ARCH_TGL
+#define QT_FUNCTION_TARGET_STRING_ARCH_GOLDENCOVE QT_FUNCTION_TARGET_STRING_ARCH_GLC
+#define QT_FUNCTION_TARGET_STRING_ARCH_ALDERLAKE QT_FUNCTION_TARGET_STRING_ARCH_ADL
+#define QT_FUNCTION_TARGET_STRING_ARCH_RAPTORCOVE QT_FUNCTION_TARGET_STRING_ARCH_RPC
+#define QT_FUNCTION_TARGET_STRING_ARCH_RAPTORLAKE QT_FUNCTION_TARGET_STRING_ARCH_RPL
+#define QT_FUNCTION_TARGET_STRING_ARCH_REDWOODCOVE QT_FUNCTION_TARGET_STRING_ARCH_RWC
+#define QT_FUNCTION_TARGET_STRING_ARCH_METEORLAKE QT_FUNCTION_TARGET_STRING_ARCH_MTL
+#define QT_FUNCTION_TARGET_STRING_ARCH_ARROWLAKE QT_FUNCTION_TARGET_STRING_ARCH_ARL
+#define QT_FUNCTION_TARGET_STRING_ARCH_LUNARLAKE QT_FUNCTION_TARGET_STRING_ARCH_LNL
+#define QT_FUNCTION_TARGET_STRING_ARCH_SAPPHIRERAPIDS QT_FUNCTION_TARGET_STRING_ARCH_SPR
+#define QT_FUNCTION_TARGET_STRING_ARCH_EMERALDRAPIDS QT_FUNCTION_TARGET_STRING_ARCH_EMR
+#define QT_FUNCTION_TARGET_STRING_ARCH_GRANITERAPIDS QT_FUNCTION_TARGET_STRING_ARCH_GNR
+#define QT_FUNCTION_TARGET_STRING_ARCH_SILVERMONT QT_FUNCTION_TARGET_STRING_ARCH_SLM
+#define QT_FUNCTION_TARGET_STRING_ARCH_GOLDMONT QT_FUNCTION_TARGET_STRING_ARCH_GLM
+#define QT_FUNCTION_TARGET_STRING_ARCH_TREMONT QT_FUNCTION_TARGET_STRING_ARCH_TNT
+#define QT_FUNCTION_TARGET_STRING_ARCH_GRACEMONT QT_FUNCTION_TARGET_STRING_ARCH_GRT
+#define QT_FUNCTION_TARGET_STRING_ARCH_CRESTMONT QT_FUNCTION_TARGET_STRING_ARCH_CMT
+#define QT_FUNCTION_TARGET_STRING_ARCH_GRANDRIDGE QT_FUNCTION_TARGET_STRING_ARCH_GRR
+#define QT_FUNCTION_TARGET_STRING_ARCH_SIERRAFOREST QT_FUNCTION_TARGET_STRING_ARCH_SRF
+#define QT_FUNCTION_TARGET_STRING_ARCH_CLEARWATERFOREST QT_FUNCTION_TARGET_STRING_ARCH_CWF
-static const quint64 qCompilerCpuFeatures = 0
+static const uint64_t _compilerCpuFeatures = 0
#ifdef __SSE2__
- | CpuFeatureSSE2
+ | cpu_feature_sse2
#endif
#ifdef __SSE3__
- | CpuFeatureSSE3
+ | cpu_feature_sse3
#endif
#ifdef __SSSE3__
- | CpuFeatureSSSE3
+ | cpu_feature_ssse3
#endif
#ifdef __FMA__
- | CpuFeatureFMA
+ | cpu_feature_fma
#endif
#ifdef __SSE4_1__
- | CpuFeatureSSE4_1
+ | cpu_feature_sse4_1
#endif
#ifdef __SSE4_2__
- | CpuFeatureSSE4_2
+ | cpu_feature_sse4_2
#endif
#ifdef __MOVBE__
- | CpuFeatureMOVBE
+ | cpu_feature_movbe
#endif
#ifdef __POPCNT__
- | CpuFeaturePOPCNT
+ | cpu_feature_popcnt
#endif
#ifdef __AES__
- | CpuFeatureAES
+ | cpu_feature_aes
#endif
#ifdef __AVX__
- | CpuFeatureAVX
+ | cpu_feature_avx
#endif
#ifdef __F16C__
- | CpuFeatureF16C
+ | cpu_feature_f16c
#endif
#ifdef __RDRND__
- | CpuFeatureRDRND
+ | cpu_feature_rdrnd
#endif
#ifdef __BMI__
- | CpuFeatureBMI
-#endif
-#ifdef __HLE__
- | CpuFeatureHLE
+ | cpu_feature_bmi
#endif
#ifdef __AVX2__
- | CpuFeatureAVX2
+ | cpu_feature_avx2
#endif
#ifdef __BMI2__
- | CpuFeatureBMI2
-#endif
-#ifdef __RTM__
- | CpuFeatureRTM
+ | cpu_feature_bmi2
#endif
#ifdef __AVX512F__
- | CpuFeatureAVX512F
+ | cpu_feature_avx512f
#endif
#ifdef __AVX512DQ__
- | CpuFeatureAVX512DQ
+ | cpu_feature_avx512dq
#endif
#ifdef __RDSEED__
- | CpuFeatureRDSEED
+ | cpu_feature_rdseed
#endif
#ifdef __AVX512IFMA__
- | CpuFeatureAVX512IFMA
-#endif
-#ifdef __AVX512PF__
- | CpuFeatureAVX512PF
-#endif
-#ifdef __AVX512ER__
- | CpuFeatureAVX512ER
+ | cpu_feature_avx512ifma
#endif
#ifdef __AVX512CD__
- | CpuFeatureAVX512CD
+ | cpu_feature_avx512cd
#endif
#ifdef __SHA__
- | CpuFeatureSHA
+ | cpu_feature_sha
#endif
#ifdef __AVX512BW__
- | CpuFeatureAVX512BW
+ | cpu_feature_avx512bw
#endif
#ifdef __AVX512VL__
- | CpuFeatureAVX512VL
+ | cpu_feature_avx512vl
#endif
#ifdef __AVX512VBMI__
- | CpuFeatureAVX512VBMI
+ | cpu_feature_avx512vbmi
+#endif
+#ifdef __WAITPKG__
+ | cpu_feature_waitpkg
#endif
#ifdef __AVX512VBMI2__
- | CpuFeatureAVX512VBMI2
+ | cpu_feature_avx512vbmi2
+#endif
+#ifdef __SHSTK__
+ | cpu_feature_shstk
#endif
#ifdef __GFNI__
- | CpuFeatureGFNI
+ | cpu_feature_gfni
#endif
#ifdef __VAES__
- | CpuFeatureVAES
-#endif
-#ifdef __AVX512VNNI__
- | CpuFeatureAVX512VNNI
+ | cpu_feature_vaes
#endif
#ifdef __AVX512BITALG__
- | CpuFeatureAVX512BITALG
+ | cpu_feature_avx512bitalg
#endif
#ifdef __AVX512VPOPCNTDQ__
- | CpuFeatureAVX512VPOPCNTDQ
+ | cpu_feature_avx512vpopcntdq
+#endif
+#ifdef __HYBRID__
+ | cpu_feature_hybrid
+#endif
+#ifdef __IBT__
+ | cpu_feature_ibt
#endif
-#ifdef __AVX5124NNIW__
- | CpuFeatureAVX5124NNIW
+#ifdef __AVX512FP16__
+ | cpu_feature_avx512fp16
#endif
-#ifdef __AVX5124FMAPS__
- | CpuFeatureAVX5124FMAPS
+#ifdef __RAOINT__
+ | cpu_feature_raoint
+#endif
+#ifdef __CMPCCXADD__
+ | cpu_feature_cmpccxadd
+#endif
+#ifdef __AVXIFMA__
+ | cpu_feature_avxifma
+#endif
+#ifdef __LAM__
+ | cpu_feature_lam
#endif
;
-QT_END_NAMESPACE
+#if (defined __cplusplus) && __cplusplus >= 201103L
+enum X86CpuFeatures : uint64_t {
+ CpuFeatureSSE2 = cpu_feature_sse2, ///< Streaming SIMD Extensions 2
+ CpuFeatureSSE3 = cpu_feature_sse3, ///< Streaming SIMD Extensions 3
+ CpuFeatureSSSE3 = cpu_feature_ssse3, ///< Supplemental Streaming SIMD Extensions 3
+ CpuFeatureFMA = cpu_feature_fma, ///< Fused Multiply-Add
+ CpuFeatureSSE4_1 = cpu_feature_sse4_1, ///< Streaming SIMD Extensions 4.1
+ CpuFeatureSSE4_2 = cpu_feature_sse4_2, ///< Streaming SIMD Extensions 4.2
+ CpuFeatureMOVBE = cpu_feature_movbe, ///< MOV Big Endian
+ CpuFeaturePOPCNT = cpu_feature_popcnt, ///< Population count
+ CpuFeatureAES = cpu_feature_aes, ///< Advenced Encryption Standard
+ CpuFeatureAVX = cpu_feature_avx, ///< Advanced Vector Extensions
+ CpuFeatureF16C = cpu_feature_f16c, ///< 16-bit Float Conversion
+ CpuFeatureRDRND = cpu_feature_rdrnd, ///< Random number generator
+ CpuFeatureBMI = cpu_feature_bmi, ///< Bit Manipulation Instructions
+ CpuFeatureAVX2 = cpu_feature_avx2, ///< Advanced Vector Extensions 2
+ CpuFeatureBMI2 = cpu_feature_bmi2, ///< Bit Manipulation Instructions 2
+ CpuFeatureAVX512F = cpu_feature_avx512f, ///< AVX512 Foundation
+ CpuFeatureAVX512DQ = cpu_feature_avx512dq, ///< AVX512 Double & Quadword
+ CpuFeatureRDSEED = cpu_feature_rdseed, ///< Random number generator for seeding
+ CpuFeatureAVX512IFMA = cpu_feature_avx512ifma, ///< AVX512 Integer Fused Multiply-Add
+ CpuFeatureAVX512CD = cpu_feature_avx512cd, ///< AVX512 Conflict Detection
+ CpuFeatureSHA = cpu_feature_sha, ///< SHA-1 and SHA-256 instructions
+ CpuFeatureAVX512BW = cpu_feature_avx512bw, ///< AVX512 Byte & Word
+ CpuFeatureAVX512VL = cpu_feature_avx512vl, ///< AVX512 Vector Length
+ CpuFeatureAVX512VBMI = cpu_feature_avx512vbmi, ///< AVX512 Vector Byte Manipulation Instructions
+ CpuFeatureWAITPKG = cpu_feature_waitpkg, ///< User-Level Monitor / Wait
+ CpuFeatureAVX512VBMI2 = cpu_feature_avx512vbmi2, ///< AVX512 Vector Byte Manipulation Instructions 2
+ CpuFeatureSHSTK = cpu_feature_shstk, ///< Control Flow Enforcement Technology Shadow Stack
+ CpuFeatureGFNI = cpu_feature_gfni, ///< Galois Field new instructions
+ CpuFeatureVAES = cpu_feature_vaes, ///< 256- and 512-bit AES
+ CpuFeatureAVX512BITALG = cpu_feature_avx512bitalg, ///< AVX512 Bit Algorithms
+ CpuFeatureAVX512VPOPCNTDQ = cpu_feature_avx512vpopcntdq, ///< AVX512 Population Count
+ CpuFeatureHYBRID = cpu_feature_hybrid, ///< Hybrid processor
+ CpuFeatureIBT = cpu_feature_ibt, ///< Control Flow Enforcement Technology Indirect Branch Tracking
+ CpuFeatureAVX512FP16 = cpu_feature_avx512fp16, ///< AVX512 16-bit Floating Point
+ CpuFeatureRAOINT = cpu_feature_raoint, ///< Remote Atomic Operations, Integer
+ CpuFeatureCMPCCXADD = cpu_feature_cmpccxadd, ///< CMPccXADD instructions
+ CpuFeatureAVXIFMA = cpu_feature_avxifma, ///< AVX-IFMA instructions
+ CpuFeatureLAM = cpu_feature_lam, ///< Linear Address Masking
+}; // enum X86CpuFeatures
+
+enum X86CpuArchitectures : uint64_t {
+ CpuArchx8664 = cpu_x86_64,
+ CpuArchCore2 = cpu_core2,
+ CpuArchNHM = cpu_nhm,
+ CpuArchWSM = cpu_wsm,
+ CpuArchSNB = cpu_snb,
+ CpuArchIVB = cpu_ivb,
+ CpuArchHSW = cpu_hsw, ///< hle,rtm
+ CpuArchBDW = cpu_bdw,
+ CpuArchBDX = cpu_bdx,
+ CpuArchSKL = cpu_skl,
+ CpuArchSKX = cpu_skx, ///< clwb
+ CpuArchCLX = cpu_clx,
+ CpuArchCPX = cpu_cpx,
+ CpuArchPLC = cpu_plc, ///< sha
+ CpuArchSNC = cpu_snc, ///< fsrm,rdpid
+ CpuArchWLC = cpu_wlc, ///< avx512vp2intersect
+ CpuArchGLC = cpu_glc, ///< tsxldtrk
+ CpuArchRPC = cpu_rpc,
+ CpuArchRWC = cpu_rwc,
+ CpuArchSLM = cpu_slm,
+ CpuArchGLM = cpu_glm,
+ CpuArchTNT = cpu_tnt,
+ CpuArchGRT = cpu_grt, ///< rdpid
+ CpuArchCMT = cpu_cmt,
+ CpuArchCNL = cpu_cnl,
+ CpuArchICL = cpu_icl,
+ CpuArchTGL = cpu_tgl,
+ CpuArchADL = cpu_adl,
+ CpuArchRPL = cpu_rpl,
+ CpuArchMTL = cpu_mtl,
+ CpuArchARL = cpu_arl,
+ CpuArchLNL = cpu_lnl,
+ CpuArchICX = cpu_icx,
+ CpuArchSPR = cpu_spr,
+ CpuArchEMR = cpu_emr,
+ CpuArchGNR = cpu_gnr,
+ CpuArchSRF = cpu_srf,
+ CpuArchGRR = cpu_grr,
+ CpuArchCWF = cpu_cwf,
+ CpuArchNehalem = cpu_nehalem, ///< Intel Core i3/i5/i7
+ CpuArchWestmere = cpu_westmere, ///< Intel Core i3/i5/i7
+ CpuArchSandyBridge = cpu_sandybridge, ///< Second Generation Intel Core i3/i5/i7
+ CpuArchIvyBridge = cpu_ivybridge, ///< Third Generation Intel Core i3/i5/i7
+ CpuArchHaswell = cpu_haswell, ///< Fourth Generation Intel Core i3/i5/i7
+ CpuArchBroadwell = cpu_broadwell, ///< Fifth Generation Intel Core i3/i5/i7
+ CpuArchSkylake = cpu_skylake, ///< Sixth Generation Intel Core i3/i5/i7
+ CpuArchSkylakeAvx512 = cpu_skylake_avx512, ///< Intel Xeon Scalable
+ CpuArchCascadeLake = cpu_cascadelake, ///< Second Generation Intel Xeon Scalable
+ CpuArchCooperLake = cpu_cooperlake, ///< Third Generation Intel Xeon Scalable
+ CpuArchPalmCove = cpu_palmcove,
+ CpuArchCannonLake = cpu_cannonlake, ///< Intel Core i3-8121U
+ CpuArchSunnyCove = cpu_sunnycove,
+ CpuArchIceLakeClient = cpu_icelake_client, ///< Tenth Generation Intel Core i3/i5/i7
+ CpuArchIceLakeServer = cpu_icelake_server, ///< Third Generation Intel Xeon Scalable
+ CpuArchWillowCove = cpu_willowcove,
+ CpuArchTigerLake = cpu_tigerlake, ///< Eleventh Generation Intel Core i3/i5/i7
+ CpuArchGoldenCove = cpu_goldencove,
+ CpuArchAlderLake = cpu_alderlake, ///< Twelfth Generation Intel Core
+ CpuArchRaptorCove = cpu_raptorcove,
+ CpuArchRaptorLake = cpu_raptorlake, ///< Thirteenth Generation Intel Core
+ CpuArchRedwoodCove = cpu_redwoodcove,
+ CpuArchMeteorLake = cpu_meteorlake,
+ CpuArchArrowLake = cpu_arrowlake,
+ CpuArchLunarLake = cpu_lunarlake,
+ CpuArchSapphireRapids = cpu_sapphirerapids, ///< Fourth Generation Intel Xeon Scalable
+ CpuArchEmeraldRapids = cpu_emeraldrapids, ///< Fifth Generation Intel Xeon Scalable
+ CpuArchGraniteRapids = cpu_graniterapids,
+ CpuArchSilvermont = cpu_silvermont,
+ CpuArchGoldmont = cpu_goldmont,
+ CpuArchTremont = cpu_tremont,
+ CpuArchGracemont = cpu_gracemont,
+ CpuArchCrestmont = cpu_crestmont,
+ CpuArchGrandRidge = cpu_grandridge,
+ CpuArchSierraForest = cpu_sierraforest,
+ CpuArchClearwaterForest = cpu_clearwaterforest,
+}; // enum X86cpuArchitectures
+#endif /* C++11 */
-#endif // QSIMD_X86_P_H
+#endif /* QSIMD_X86_P_H */
diff --git a/src/corelib/global/qswap.h b/src/corelib/global/qswap.h
new file mode 100644
index 0000000000..3d533c8a95
--- /dev/null
+++ b/src/corelib/global/qswap.h
@@ -0,0 +1,38 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QTCORE_QSWAP_H
+#define QTCORE_QSWAP_H
+
+#include <QtCore/qtconfigmacros.h>
+
+#include <type_traits>
+#include <utility>
+
+#if 0
+#pragma qt_class(QtSwap)
+#pragma qt_sync_stop_processing
+#endif
+
+QT_BEGIN_NAMESPACE
+
+template <typename T>
+constexpr void qSwap(T &value1, T &value2)
+ noexcept(std::is_nothrow_swappable_v<T>)
+{
+ using std::swap;
+ swap(value1, value2);
+}
+
+// pure compile-time micro-optimization for our own headers, so not documented:
+template <typename T>
+constexpr inline void qt_ptr_swap(T* &lhs, T* &rhs) noexcept
+{
+ T *tmp = lhs;
+ lhs = rhs;
+ rhs = tmp;
+}
+
+QT_END_NAMESPACE
+
+#endif // QTCORE_QSWAP_H
diff --git a/src/corelib/global/qswap.qdoc b/src/corelib/global/qswap.qdoc
new file mode 100644
index 0000000000..bffad903f9
--- /dev/null
+++ b/src/corelib/global/qswap.qdoc
@@ -0,0 +1,38 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
+
+/*!
+ \fn template <typename T> void qSwap(T &lhs, T &rhs)
+ \relates <QtSwap>
+
+ Exchanges the values of variables \a lhs and \a rhs,
+ taking type-specific \c{swap()} overloads into account.
+
+ This function is Qt's version of
+ \l{https://www.boost.org/doc/libs/release/libs/core/doc/html/core/swap.html}{\c{boost::swap()}},
+ and is equivalent to
+ \code
+ using std::swap; // bring std::swap into scope (for built-in types)
+ swap(lhs, rhs); // unqualified call (picks up type-specific overloads
+ // via Argument-Dependent Lookup, or falls back to std::swap)
+ \endcode
+
+ Use this function primarily in generic code, where you would traditionally
+ have written the above two lines, because you don't know anything about \c{T}.
+
+ If you already know what \c{T} is, then use one of the following options, in
+ order of preference:
+
+ \list
+ \li \c{lhs.swap(rhs);} if such a member-swap exists
+ \li \c{std::swap(lhs, rhs);} if no type-specific \c{swap()} exists
+ \endlist
+
+ See
+ \l{https://www.boost.org/doc/libs/release/libs/core/doc/html/core/swap.html}{\c{boost::swap()} on boost.org}
+ for more details.
+
+ See also
+ \l{https://en.cppreference.com/w/cpp/algorithm/swap}{\c{std::swap} on cppreference.com},
+ \l{https://en.cppreference.com/w/cpp/named_req/Swappable}{\c{Swappable} on cppreference.com}.
+*/
diff --git a/src/corelib/global/qsysinfo.cpp b/src/corelib/global/qsysinfo.cpp
new file mode 100644
index 0000000000..79cb76b236
--- /dev/null
+++ b/src/corelib/global/qsysinfo.cpp
@@ -0,0 +1,1072 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// Copyright (C) 2022 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#include "qsysinfo.h"
+
+#include <QtCore/qbytearray.h>
+#include <QtCore/qoperatingsystemversion.h>
+#include <QtCore/qstring.h>
+
+#include <private/qoperatingsystemversion_p.h>
+
+#ifdef Q_OS_UNIX
+# include <sys/utsname.h>
+# include <private/qcore_unix_p.h>
+#endif
+
+#ifdef Q_OS_ANDROID
+#include <QtCore/private/qjnihelpers_p.h>
+#include <qjniobject.h>
+#endif
+
+#if defined(Q_OS_SOLARIS)
+# include <sys/systeminfo.h>
+#endif
+
+#if defined(Q_OS_DARWIN)
+# include "qnamespace.h"
+# include <private/qcore_mac_p.h>
+# if __has_include(<IOKit/IOKitLib.h>)
+# include <IOKit/IOKitLib.h>
+# endif
+#endif
+
+#ifdef Q_OS_BSD4
+# include <sys/sysctl.h>
+#endif
+
+#if defined(Q_OS_WIN) || defined(Q_OS_CYGWIN)
+# include "qoperatingsystemversion_win_p.h"
+# include "private/qwinregistry_p.h"
+# include "qt_windows.h"
+#endif // Q_OS_WIN || Q_OS_CYGWIN
+
+#include "archdetect.cpp"
+
+QT_BEGIN_NAMESPACE
+
+using namespace Qt::StringLiterals;
+
+/*!
+ \class QSysInfo
+ \inmodule QtCore
+ \brief The QSysInfo class provides information about the system.
+
+ \list
+ \li \l WordSize specifies the size of a pointer for the platform
+ on which the application is compiled.
+ \li \l ByteOrder specifies whether the platform is big-endian or
+ little-endian.
+ \endlist
+
+ Some constants are defined only on certain platforms. You can use
+ the preprocessor symbols Q_OS_WIN and Q_OS_MACOS to test that
+ the application is compiled under Windows or \macos.
+
+ \sa QLibraryInfo
+*/
+
+/*!
+ \enum QSysInfo::Sizes
+
+ This enum provides platform-specific information about the sizes of data
+ structures used by the underlying architecture.
+
+ \value WordSize The size in bits of a pointer for the platform on which
+ the application is compiled (32 or 64).
+*/
+
+/*!
+ \enum QSysInfo::Endian
+
+ \value BigEndian Big-endian byte order (also called Network byte order)
+ \value LittleEndian Little-endian byte order
+ \value ByteOrder Equals BigEndian or LittleEndian, depending on
+ the platform's byte order.
+*/
+
+#if defined(Q_OS_DARWIN)
+
+static const char *osVer_helper(QOperatingSystemVersion version = QOperatingSystemVersion::current())
+{
+#ifdef Q_OS_MACOS
+ if (version.majorVersion() == 13)
+ return "Ventura";
+ if (version.majorVersion() == 12)
+ return "Monterey";
+ // Compare against predefined constant to handle 10.16/11.0
+ if (QOperatingSystemVersion::MacOSBigSur.version().isPrefixOf(version.version()))
+ return "Big Sur";
+ if (version.majorVersion() == 10) {
+ switch (version.minorVersion()) {
+ case 9:
+ return "Mavericks";
+ case 10:
+ return "Yosemite";
+ case 11:
+ return "El Capitan";
+ case 12:
+ return "Sierra";
+ case 13:
+ return "High Sierra";
+ case 14:
+ return "Mojave";
+ case 15:
+ return "Catalina";
+ }
+ }
+ // unknown, future version
+#else
+ Q_UNUSED(version);
+#endif
+ return nullptr;
+}
+
+#elif defined(Q_OS_WIN) || defined(Q_OS_CYGWIN)
+
+# ifndef QT_BOOTSTRAPPED
+class QWindowsSockInit
+{
+public:
+ QWindowsSockInit();
+ ~QWindowsSockInit();
+ int version;
+};
+
+QWindowsSockInit::QWindowsSockInit()
+: version(0)
+{
+ //### should we try for 2.2 on all platforms ??
+ WSAData wsadata;
+
+ // IPv6 requires Winsock v2.0 or better.
+ if (WSAStartup(MAKEWORD(2, 0), &wsadata) != 0) {
+ qWarning("QTcpSocketAPI: WinSock v2.0 initialization failed.");
+ } else {
+ version = 0x20;
+ }
+}
+
+QWindowsSockInit::~QWindowsSockInit()
+{
+ WSACleanup();
+}
+Q_GLOBAL_STATIC(QWindowsSockInit, winsockInit)
+# endif // QT_BOOTSTRAPPED
+
+static QString readVersionRegistryString(const wchar_t *subKey)
+{
+ return QWinRegistryKey(HKEY_LOCAL_MACHINE, LR"(SOFTWARE\Microsoft\Windows NT\CurrentVersion)")
+ .stringValue(subKey);
+}
+
+static inline QString windowsDisplayVersion()
+{
+ // https://tickets.puppetlabs.com/browse/FACT-3058
+ // The "ReleaseId" key stopped updating since Windows 10 20H2.
+ if (QOperatingSystemVersion::current() >= QOperatingSystemVersion::Windows10_20H2)
+ return readVersionRegistryString(L"DisplayVersion");
+ else
+ return readVersionRegistryString(L"ReleaseId");
+}
+
+static QString winSp_helper()
+{
+ const auto osv = qWindowsVersionInfo();
+ const qint16 major = osv.wServicePackMajor;
+ if (major) {
+ QString sp = QStringLiteral("SP ") + QString::number(major);
+ const qint16 minor = osv.wServicePackMinor;
+ if (minor)
+ sp += u'.' + QString::number(minor);
+
+ return sp;
+ }
+ return QString();
+}
+
+static const char *osVer_helper(QOperatingSystemVersion version = QOperatingSystemVersion::current())
+{
+ Q_UNUSED(version);
+ const OSVERSIONINFOEX osver = qWindowsVersionInfo();
+ const bool workstation = osver.wProductType == VER_NT_WORKSTATION;
+
+#define Q_WINVER(major, minor) (major << 8 | minor)
+ switch (Q_WINVER(osver.dwMajorVersion, osver.dwMinorVersion)) {
+ case Q_WINVER(10, 0):
+ if (workstation) {
+ if (osver.dwBuildNumber >= 22000)
+ return "11";
+ return "10";
+ }
+ // else: Server
+ if (osver.dwBuildNumber >= 20348)
+ return "Server 2022";
+ if (osver.dwBuildNumber >= 17763)
+ return "Server 2019";
+ return "Server 2016";
+ }
+#undef Q_WINVER
+ // unknown, future version
+ return nullptr;
+}
+
+#endif
+#if defined(Q_OS_UNIX)
+# if (defined(Q_OS_LINUX) && !defined(Q_OS_ANDROID)) || defined(Q_OS_FREEBSD)
+# define USE_ETC_OS_RELEASE
+struct QUnixOSVersion
+{
+ // from /etc/os-release older /etc/lsb-release // redhat /etc/redhat-release // debian /etc/debian_version
+ QString productType; // $ID $DISTRIB_ID // single line file containing: // Debian
+ QString productVersion; // $VERSION_ID $DISTRIB_RELEASE // <Vendor_ID release Version_ID> // single line file <Release_ID/sid>
+ QString prettyName; // $PRETTY_NAME $DISTRIB_DESCRIPTION
+};
+
+static QString unquote(QByteArrayView str)
+{
+ // man os-release says:
+ // Variable assignment values must be enclosed in double
+ // or single quotes if they include spaces, semicolons or
+ // other special characters outside of A–Z, a–z, 0–9. Shell
+ // special characters ("$", quotes, backslash, backtick)
+ // must be escaped with backslashes, following shell style.
+ // All strings should be in UTF-8 format, and non-printable
+ // characters should not be used. It is not supported to
+ // concatenate multiple individually quoted strings.
+ if (str.size() >= 2 && str.front() == '"' && str.back() == '"')
+ str = str.sliced(1).chopped(1);
+ return QString::fromUtf8(str);
+}
+
+static QByteArray getEtcFileContent(const char *filename)
+{
+ // we're avoiding QFile here
+ int fd = qt_safe_open(filename, O_RDONLY);
+ if (fd == -1)
+ return QByteArray();
+
+ QT_STATBUF sbuf;
+ if (QT_FSTAT(fd, &sbuf) == -1) {
+ qt_safe_close(fd);
+ return QByteArray();
+ }
+
+ QByteArray buffer(sbuf.st_size, Qt::Uninitialized);
+ buffer.resize(qt_safe_read(fd, buffer.data(), sbuf.st_size));
+ qt_safe_close(fd);
+ return buffer;
+}
+
+static bool readEtcFile(QUnixOSVersion &v, const char *filename,
+ const QByteArray &idKey, const QByteArray &versionKey, const QByteArray &prettyNameKey)
+{
+
+ QByteArray buffer = getEtcFileContent(filename);
+ if (buffer.isEmpty())
+ return false;
+
+ const char *ptr = buffer.constData();
+ const char *end = buffer.constEnd();
+ const char *eol;
+ QByteArray line;
+ for (; ptr != end; ptr = eol + 1) {
+ // find the end of the line after ptr
+ eol = static_cast<const char *>(memchr(ptr, '\n', end - ptr));
+ if (!eol)
+ eol = end - 1;
+ line.setRawData(ptr, eol - ptr);
+
+ if (line.startsWith(idKey)) {
+ ptr += idKey.size();
+ v.productType = unquote({ptr, eol});
+ continue;
+ }
+
+ if (line.startsWith(prettyNameKey)) {
+ ptr += prettyNameKey.size();
+ v.prettyName = unquote({ptr, eol});
+ continue;
+ }
+
+ if (line.startsWith(versionKey)) {
+ ptr += versionKey.size();
+ v.productVersion = unquote({ptr, eol});
+ continue;
+ }
+ }
+
+ return true;
+}
+
+static bool readOsRelease(QUnixOSVersion &v)
+{
+ QByteArray id = QByteArrayLiteral("ID=");
+ QByteArray versionId = QByteArrayLiteral("VERSION_ID=");
+ QByteArray prettyName = QByteArrayLiteral("PRETTY_NAME=");
+
+ // man os-release(5) says:
+ // The file /etc/os-release takes precedence over /usr/lib/os-release.
+ // Applications should check for the former, and exclusively use its data
+ // if it exists, and only fall back to /usr/lib/os-release if it is
+ // missing.
+ return readEtcFile(v, "/etc/os-release", id, versionId, prettyName) ||
+ readEtcFile(v, "/usr/lib/os-release", id, versionId, prettyName);
+}
+
+static bool readEtcLsbRelease(QUnixOSVersion &v)
+{
+ bool ok = readEtcFile(v, "/etc/lsb-release", QByteArrayLiteral("DISTRIB_ID="),
+ QByteArrayLiteral("DISTRIB_RELEASE="), QByteArrayLiteral("DISTRIB_DESCRIPTION="));
+ if (ok && (v.prettyName.isEmpty() || v.prettyName == v.productType)) {
+ // some distributions have redundant information for the pretty name,
+ // so try /etc/<lowercasename>-release
+
+ // we're still avoiding QFile here
+ QByteArray distrorelease = "/etc/" + v.productType.toLatin1().toLower() + "-release";
+ int fd = qt_safe_open(distrorelease, O_RDONLY);
+ if (fd != -1) {
+ QT_STATBUF sbuf;
+ if (QT_FSTAT(fd, &sbuf) != -1 && sbuf.st_size > v.prettyName.size()) {
+ // file apparently contains interesting information
+ QByteArray buffer(sbuf.st_size, Qt::Uninitialized);
+ buffer.resize(qt_safe_read(fd, buffer.data(), sbuf.st_size));
+ v.prettyName = QString::fromLatin1(buffer.trimmed());
+ }
+ qt_safe_close(fd);
+ }
+ }
+
+ // some distributions have a /etc/lsb-release file that does not provide the values
+ // we are looking for, i.e. DISTRIB_ID, DISTRIB_RELEASE and DISTRIB_DESCRIPTION.
+ // Assuming that neither DISTRIB_ID nor DISTRIB_RELEASE were found, or contained valid values,
+ // returning false for readEtcLsbRelease will allow further /etc/<lowercasename>-release parsing.
+ return ok && !(v.productType.isEmpty() && v.productVersion.isEmpty());
+}
+
+#if defined(Q_OS_LINUX)
+static QByteArray getEtcFileFirstLine(const char *fileName)
+{
+ QByteArray buffer = getEtcFileContent(fileName);
+ if (buffer.isEmpty())
+ return QByteArray();
+
+ const char *ptr = buffer.constData();
+ return QByteArray(ptr, buffer.indexOf("\n")).trimmed();
+}
+
+static bool readEtcRedHatRelease(QUnixOSVersion &v)
+{
+ // /etc/redhat-release analysed should be a one line file
+ // the format of its content is <Vendor_ID release Version>
+ // i.e. "Red Hat Enterprise Linux Workstation release 6.5 (Santiago)"
+ QByteArray line = getEtcFileFirstLine("/etc/redhat-release");
+ if (line.isEmpty())
+ return false;
+
+ v.prettyName = QString::fromLatin1(line);
+
+ const char keyword[] = "release ";
+ const qsizetype releaseIndex = line.indexOf(keyword);
+ v.productType = QString::fromLatin1(line.mid(0, releaseIndex)).remove(u' ');
+ const qsizetype spaceIndex = line.indexOf(' ', releaseIndex + strlen(keyword));
+ v.productVersion = QString::fromLatin1(line.mid(releaseIndex + strlen(keyword),
+ spaceIndex > -1 ? spaceIndex - releaseIndex - int(strlen(keyword)) : -1));
+ return true;
+}
+
+static bool readEtcDebianVersion(QUnixOSVersion &v)
+{
+ // /etc/debian_version analysed should be a one line file
+ // the format of its content is <Release_ID/sid>
+ // i.e. "jessie/sid"
+ QByteArray line = getEtcFileFirstLine("/etc/debian_version");
+ if (line.isEmpty())
+ return false;
+
+ v.productType = QStringLiteral("Debian");
+ v.productVersion = QString::fromLatin1(line);
+ return true;
+}
+#endif
+
+static bool findUnixOsVersion(QUnixOSVersion &v)
+{
+ if (readOsRelease(v))
+ return true;
+ if (readEtcLsbRelease(v))
+ return true;
+#if defined(Q_OS_LINUX)
+ if (readEtcRedHatRelease(v))
+ return true;
+ if (readEtcDebianVersion(v))
+ return true;
+#endif
+ return false;
+}
+# endif // USE_ETC_OS_RELEASE
+#endif // Q_OS_UNIX
+
+#ifdef Q_OS_ANDROID
+static const char *osVer_helper(QOperatingSystemVersion)
+{
+ // https://source.android.com/source/build-numbers.html
+ // https://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels
+ const int sdk_int = QtAndroidPrivate::androidSdkVersion();
+ switch (sdk_int) {
+ case 3:
+ return "Cupcake";
+ case 4:
+ return "Donut";
+ case 5:
+ case 6:
+ case 7:
+ return "Eclair";
+ case 8:
+ return "Froyo";
+ case 9:
+ case 10:
+ return "Gingerbread";
+ case 11:
+ case 12:
+ case 13:
+ return "Honeycomb";
+ case 14:
+ case 15:
+ return "Ice Cream Sandwich";
+ case 16:
+ case 17:
+ case 18:
+ return "Jelly Bean";
+ case 19:
+ case 20:
+ return "KitKat";
+ case 21:
+ case 22:
+ return "Lollipop";
+ case 23:
+ return "Marshmallow";
+ case 24:
+ case 25:
+ return "Nougat";
+ case 26:
+ case 27:
+ return "Oreo";
+ case 28:
+ return "Pie";
+ case 29:
+ return "10";
+ case 30:
+ return "11";
+ case 31:
+ return "12";
+ case 32:
+ return "12L";
+ case 33:
+ return "13";
+ default:
+ break;
+ }
+
+ return "";
+}
+#endif
+
+/*!
+ \since 5.4
+
+ Returns the architecture of the CPU that Qt was compiled for, in text
+ format. Note that this may not match the actual CPU that the application is
+ running on if there's an emulation layer or if the CPU supports multiple
+ architectures (like x86-64 processors supporting i386 applications). To
+ detect that, use currentCpuArchitecture().
+
+ Values returned by this function are stable and will not change over time,
+ so applications can rely on the returned value as an identifier, except
+ that new CPU types may be added over time.
+
+ Typical returned values are (note: list not exhaustive):
+ \list
+ \li "arm"
+ \li "arm64"
+ \li "i386"
+ \li "ia64"
+ \li "mips"
+ \li "mips64"
+ \li "power"
+ \li "power64"
+ \li "sparc"
+ \li "sparcv9"
+ \li "x86_64"
+ \endlist
+
+ \sa QSysInfo::buildAbi(), QSysInfo::currentCpuArchitecture()
+*/
+QString QSysInfo::buildCpuArchitecture()
+{
+ return QStringLiteral(ARCH_PROCESSOR);
+}
+
+/*!
+ \since 5.4
+
+ Returns the architecture of the CPU that the application is running on, in
+ text format. Note that this function depends on what the OS will report and
+ may not detect the actual CPU architecture if the OS hides that information
+ or is unable to provide it. For example, a 32-bit OS running on a 64-bit
+ CPU is usually unable to determine the CPU is actually capable of running
+ 64-bit programs.
+
+ Values returned by this function are mostly stable: an attempt will be made
+ to ensure that they stay constant over time and match the values returned
+ by QSysInfo::builldCpuArchitecture(). However, due to the nature of the
+ operating system functions being used, there may be discrepancies.
+
+ Typical returned values are (note: list not exhaustive):
+ \list
+ \li "arm"
+ \li "arm64"
+ \li "i386"
+ \li "ia64"
+ \li "mips"
+ \li "mips64"
+ \li "power"
+ \li "power64"
+ \li "sparc"
+ \li "sparcv9"
+ \li "x86_64"
+ \endlist
+
+ \sa QSysInfo::buildAbi(), QSysInfo::buildCpuArchitecture()
+*/
+QString QSysInfo::currentCpuArchitecture()
+{
+#if defined(Q_OS_WIN)
+ // We don't need to catch all the CPU architectures in this function;
+ // only those where the host CPU might be different than the build target
+ // (usually, 64-bit platforms).
+ SYSTEM_INFO info;
+ GetNativeSystemInfo(&info);
+ switch (info.wProcessorArchitecture) {
+# ifdef PROCESSOR_ARCHITECTURE_AMD64
+ case PROCESSOR_ARCHITECTURE_AMD64:
+ return QStringLiteral("x86_64");
+# endif
+# ifdef PROCESSOR_ARCHITECTURE_IA32_ON_WIN64
+ case PROCESSOR_ARCHITECTURE_IA32_ON_WIN64:
+# endif
+ case PROCESSOR_ARCHITECTURE_IA64:
+ return QStringLiteral("ia64");
+ }
+#elif defined(Q_OS_DARWIN) && !defined(Q_OS_MACOS)
+ // iOS-based OSes do not return the architecture on uname(2)'s result.
+ return buildCpuArchitecture();
+#elif defined(Q_OS_UNIX)
+ long ret = -1;
+ struct utsname u;
+
+# if defined(Q_OS_SOLARIS)
+ // We need a special call for Solaris because uname(2) on x86 returns "i86pc" for
+ // both 32- and 64-bit CPUs. Reference:
+ // http://docs.oracle.com/cd/E18752_01/html/816-5167/sysinfo-2.html#REFMAN2sysinfo-2
+ // http://fxr.watson.org/fxr/source/common/syscall/systeminfo.c?v=OPENSOLARIS
+ // http://fxr.watson.org/fxr/source/common/conf/param.c?v=OPENSOLARIS;im=10#L530
+ if (ret == -1)
+ ret = sysinfo(SI_ARCHITECTURE_64, u.machine, sizeof u.machine);
+# endif
+
+ if (ret == -1)
+ ret = uname(&u);
+
+ // we could use detectUnixVersion() above, but we only need a field no other function does
+ if (ret != -1) {
+ // the use of QT_BUILD_INTERNAL here is simply to ensure all branches build
+ // as we don't often build on some of the less common platforms
+# if defined(Q_PROCESSOR_ARM) || defined(QT_BUILD_INTERNAL)
+ if (strcmp(u.machine, "aarch64") == 0)
+ return QStringLiteral("arm64");
+ if (strncmp(u.machine, "armv", 4) == 0)
+ return QStringLiteral("arm");
+# endif
+# if defined(Q_PROCESSOR_POWER) || defined(QT_BUILD_INTERNAL)
+ // harmonize "powerpc" and "ppc" to "power"
+ if (strncmp(u.machine, "ppc", 3) == 0)
+ return "power"_L1 + QLatin1StringView(u.machine + 3);
+ if (strncmp(u.machine, "powerpc", 7) == 0)
+ return "power"_L1 + QLatin1StringView(u.machine + 7);
+ if (strcmp(u.machine, "Power Macintosh") == 0)
+ return "power"_L1;
+# endif
+# if defined(Q_PROCESSOR_SPARC) || defined(QT_BUILD_INTERNAL)
+ // Solaris sysinfo(2) (above) uses "sparcv9", but uname -m says "sun4u";
+ // Linux says "sparc64"
+ if (strcmp(u.machine, "sun4u") == 0 || strcmp(u.machine, "sparc64") == 0)
+ return QStringLiteral("sparcv9");
+ if (strcmp(u.machine, "sparc32") == 0)
+ return QStringLiteral("sparc");
+# endif
+# if defined(Q_PROCESSOR_X86) || defined(QT_BUILD_INTERNAL)
+ // harmonize all "i?86" to "i386"
+ if (strlen(u.machine) == 4 && u.machine[0] == 'i'
+ && u.machine[2] == '8' && u.machine[3] == '6')
+ return QStringLiteral("i386");
+ if (strcmp(u.machine, "amd64") == 0) // Solaris
+ return QStringLiteral("x86_64");
+# endif
+ return QString::fromLatin1(u.machine);
+ }
+#endif
+ return buildCpuArchitecture();
+}
+
+/*!
+ \since 5.4
+
+ Returns the full architecture string that Qt was compiled for. This string
+ is useful for identifying different, incompatible builds. For example, it
+ can be used as an identifier to request an upgrade package from a server.
+
+ The values returned from this function are kept stable as follows: the
+ mandatory components of the result will not change in future versions of
+ Qt, but optional suffixes may be added.
+
+ The returned value is composed of three or more parts, separated by dashes
+ ("-"). They are:
+
+ \table
+ \header \li Component \li Value
+ \row \li CPU Architecture \li The same as QSysInfo::buildCpuArchitecture(), such as "arm", "i386", "mips" or "x86_64"
+ \row \li Endianness \li "little_endian" or "big_endian"
+ \row \li Word size \li Whether it's a 32- or 64-bit application. Possible values are:
+ "llp64" (Windows 64-bit), "lp64" (Unix 64-bit), "ilp32" (32-bit)
+ \row \li (Optional) ABI \li Zero or more components identifying different ABIs possible in this architecture.
+ Currently, Qt has optional ABI components for ARM and MIPS processors: one
+ component is the main ABI (such as "eabi", "o32", "n32", "o64"); another is
+ whether the calling convention is using hardware floating point registers ("hardfloat"
+ is present).
+
+ Additionally, if Qt was configured with \c{-qreal float}, the ABI option tag "qreal_float"
+ will be present. If Qt was configured with another type as qreal, that type is present after
+ "qreal_", with all characters other than letters and digits escaped by an underscore, followed
+ by two hex digits. For example, \c{-qreal long double} becomes "qreal_long_20double".
+ \endtable
+
+ \sa QSysInfo::buildCpuArchitecture()
+*/
+QString QSysInfo::buildAbi()
+{
+ // ARCH_FULL is a concatenation of strings (incl. ARCH_PROCESSOR), which breaks
+ // QStringLiteral on MSVC. Since the concatenation behavior we want is specified
+ // the same C++11 paper as the Unicode strings, we'll use that macro and hope
+ // that Microsoft implements the new behavior when they add support for Unicode strings.
+ return QStringLiteral(ARCH_FULL);
+}
+
+static QString unknownText()
+{
+ return QStringLiteral("unknown");
+}
+
+/*!
+ \since 5.4
+
+ Returns the type of the operating system kernel Qt was compiled for. It's
+ also the kernel the application is running on, unless the host operating
+ system is running a form of compatibility or virtualization layer.
+
+ Values returned by this function are stable and will not change over time,
+ so applications can rely on the returned value as an identifier, except
+ that new OS kernel types may be added over time.
+
+ On Windows, this function returns the type of Windows kernel, like "winnt".
+ On Unix systems, it returns the same as the output of \c{uname
+ -s} (lowercased).
+
+ \note This function may return surprising values: it returns "linux"
+ for all operating systems running Linux (including Android), "qnx" for all
+ operating systems running QNX, "freebsd" for
+ Debian/kFreeBSD, and "darwin" for \macos and iOS. For information on the type
+ of product the application is running on, see productType().
+
+ \sa QFileSelector, kernelVersion(), productType(), productVersion(), prettyProductName()
+*/
+QString QSysInfo::kernelType()
+{
+#if defined(Q_OS_WIN)
+ return QStringLiteral("winnt");
+#elif defined(Q_OS_UNIX)
+ struct utsname u;
+ if (uname(&u) == 0)
+ return QString::fromLatin1(u.sysname).toLower();
+#endif
+ return unknownText();
+}
+
+/*!
+ \since 5.4
+
+ Returns the release version of the operating system kernel. On Windows, it
+ returns the version of the NT kernel. On Unix systems, including
+ Android and \macos, it returns the same as the \c{uname -r}
+ command would return.
+
+ If the version could not be determined, this function may return an empty
+ string.
+
+ \sa kernelType(), productType(), productVersion(), prettyProductName()
+*/
+QString QSysInfo::kernelVersion()
+{
+#ifdef Q_OS_WIN
+ const auto osver = QOperatingSystemVersion::current();
+ return QString::asprintf("%d.%d.%d",
+ osver.majorVersion(), osver.minorVersion(), osver.microVersion());
+#else
+ struct utsname u;
+ if (uname(&u) == 0)
+ return QString::fromLatin1(u.release);
+ return QString();
+#endif
+}
+
+
+/*!
+ \since 5.4
+
+ Returns the product name of the operating system this application is
+ running in. If the application is running on some sort of emulation or
+ virtualization layer (such as WINE on a Unix system), this function will
+ inspect the emulation / virtualization layer.
+
+ Values returned by this function are stable and will not change over time,
+ so applications can rely on the returned value as an identifier, except
+ that new OS types may be added over time.
+
+ \b{Linux and Android note}: this function returns "android" for Linux
+ systems running Android userspace, notably when using the Bionic library.
+ For all other Linux systems, regardless of C library being used, it tries
+ to determine the distribution name and returns that. If determining the
+ distribution name failed, it returns "unknown".
+
+ \b{\macos note}: this function returns "macos" for all \macos systems,
+ regardless of Apple naming convention. Previously, in Qt 5, it returned
+ "osx", again regardless of Apple naming conventions.
+
+ \b{Darwin, iOS, tvOS, and watchOS note}: this function returns "ios" for
+ iOS systems, "tvos" for tvOS systems, "watchos" for watchOS systems, and
+ "darwin" in case the system could not be determined.
+
+ \b{FreeBSD note}: this function returns "debian" for Debian/kFreeBSD and
+ "unknown" otherwise.
+
+ \b{Windows note}: this function return "windows"
+
+ For other Unix-type systems, this function usually returns "unknown".
+
+ \sa QFileSelector, kernelType(), kernelVersion(), productVersion(), prettyProductName()
+*/
+QString QSysInfo::productType()
+{
+ // similar, but not identical to QFileSelectorPrivate::platformSelectors
+#if defined(Q_OS_WIN)
+ return QStringLiteral("windows");
+
+#elif defined(Q_OS_QNX)
+ return QStringLiteral("qnx");
+
+#elif defined(Q_OS_ANDROID)
+ return QStringLiteral("android");
+
+#elif defined(Q_OS_IOS)
+ return QStringLiteral("ios");
+#elif defined(Q_OS_TVOS)
+ return QStringLiteral("tvos");
+#elif defined(Q_OS_WATCHOS)
+ return QStringLiteral("watchos");
+#elif defined(Q_OS_VISIONOS)
+ return QStringLiteral("visionos");
+#elif defined(Q_OS_MACOS)
+ return QStringLiteral("macos");
+#elif defined(Q_OS_DARWIN)
+ return QStringLiteral("darwin");
+#elif defined(Q_OS_WASM)
+ return QStringLiteral("wasm");
+
+#elif defined(USE_ETC_OS_RELEASE) // Q_OS_UNIX
+ QUnixOSVersion unixOsVersion;
+ findUnixOsVersion(unixOsVersion);
+ if (!unixOsVersion.productType.isEmpty())
+ return unixOsVersion.productType;
+#endif
+ return unknownText();
+}
+
+/*!
+ \since 5.4
+
+ Returns the product version of the operating system in string form. If the
+ version could not be determined, this function returns "unknown".
+
+ It will return the Android, iOS, \macos, Windows full-product
+ versions on those systems.
+
+ Typical returned values are (note: list not exhaustive):
+ \list
+ \li "12" (Android 12)
+ \li "36" (Fedora 36)
+ \li "15.5" (iOS 15.5)
+ \li "12.4" (macOS Monterey)
+ \li "22.04" (Ubuntu 22.04)
+ \li "8.6" (watchOS 8.6)
+ \li "11" (Windows 11)
+ \li "Server 2022" (Windows Server 2022)
+ \endlist
+
+ On Linux systems, it will try to determine the distribution version and will
+ return that. This is also done on Debian/kFreeBSD, so this function will
+ return Debian version in that case.
+
+ In all other Unix-type systems, this function always returns "unknown".
+
+ \note The version string returned from this function is not guaranteed to
+ be orderable. On Linux, the version of
+ the distribution may jump unexpectedly, please refer to the distribution's
+ documentation for versioning practices.
+
+ \sa kernelType(), kernelVersion(), productType(), prettyProductName()
+*/
+QString QSysInfo::productVersion()
+{
+#if defined(Q_OS_ANDROID) || defined(Q_OS_DARWIN)
+ const auto version = QOperatingSystemVersion::current();
+ return QString::asprintf("%d.%d", version.majorVersion(), version.minorVersion());
+#elif defined(Q_OS_WIN)
+ const char *version = osVer_helper();
+ if (version) {
+ const QLatin1Char spaceChar(' ');
+ return QString::fromLatin1(version).remove(spaceChar).toLower() + winSp_helper().remove(spaceChar).toLower();
+ }
+ // fall through
+
+#elif defined(USE_ETC_OS_RELEASE) // Q_OS_UNIX
+ QUnixOSVersion unixOsVersion;
+ findUnixOsVersion(unixOsVersion);
+ if (!unixOsVersion.productVersion.isEmpty())
+ return unixOsVersion.productVersion;
+#endif
+
+ // fallback
+ return unknownText();
+}
+
+/*!
+ \since 5.4
+
+ Returns a prettier form of productType() and productVersion(), containing
+ other tokens like the operating system type, codenames and other
+ information. The result of this function is suitable for displaying to the
+ user, but not for long-term storage, as the string may change with updates
+ to Qt.
+
+ If productType() is "unknown", this function will instead use the
+ kernelType() and kernelVersion() functions.
+
+ \sa kernelType(), kernelVersion(), productType(), productVersion()
+*/
+QString QSysInfo::prettyProductName()
+{
+#if defined(Q_OS_ANDROID) || defined(Q_OS_DARWIN) || defined(Q_OS_WIN)
+ const auto version = QOperatingSystemVersion::current();
+ const int majorVersion = version.majorVersion();
+ const QString versionString = QString::asprintf("%d.%d", majorVersion, version.minorVersion());
+ QString result = version.name() + u' ';
+ const char *name = osVer_helper(version);
+ if (!name)
+ return result + versionString;
+ result += QLatin1StringView(name);
+# if !defined(Q_OS_WIN)
+ return result + " ("_L1 + versionString + u')';
+# else
+ // (resembling winver.exe): Windows 10 "Windows 10 Version 1809"
+ const auto displayVersion = windowsDisplayVersion();
+ if (!displayVersion.isEmpty())
+ result += " Version "_L1 + displayVersion;
+ return result;
+# endif // Windows
+#elif defined(Q_OS_HAIKU)
+ return "Haiku "_L1 + productVersion();
+#elif defined(Q_OS_UNIX)
+# ifdef USE_ETC_OS_RELEASE
+ QUnixOSVersion unixOsVersion;
+ findUnixOsVersion(unixOsVersion);
+ if (!unixOsVersion.prettyName.isEmpty())
+ return unixOsVersion.prettyName;
+# endif
+ struct utsname u;
+ if (uname(&u) == 0)
+ return QString::fromLatin1(u.sysname) + u' ' + QString::fromLatin1(u.release);
+#endif
+ return unknownText();
+}
+
+#ifndef QT_BOOTSTRAPPED
+/*!
+ \since 5.6
+
+ Returns this machine's host name, if one is configured. Note that hostnames
+ are not guaranteed to be globally unique, especially if they were
+ configured automatically.
+
+ This function does not guarantee the returned host name is a Fully
+ Qualified Domain Name (FQDN). For that, use QHostInfo to resolve the
+ returned name to an FQDN.
+
+ This function returns the same as QHostInfo::localHostName().
+
+ \sa QHostInfo::localDomainName, machineUniqueId()
+*/
+QString QSysInfo::machineHostName()
+{
+ // the hostname can change, so we can't cache it
+#if defined(Q_OS_LINUX)
+ // gethostname(3) on Linux just calls uname(2), so do it ourselves
+ // and avoid a memcpy
+ struct utsname u;
+ if (uname(&u) == 0)
+ return QString::fromLocal8Bit(u.nodename);
+ return QString();
+#else
+# ifdef Q_OS_WIN
+ // Important: QtNetwork depends on machineHostName() initializing ws2_32.dll
+ winsockInit();
+ QString hostName;
+ hostName.resize(512);
+ unsigned long len = hostName.size();
+ BOOL res = GetComputerNameEx(ComputerNameDnsHostname,
+ reinterpret_cast<wchar_t *>(const_cast<quint16 *>(hostName.utf16())), &len);
+ if (!res && len > 512) {
+ hostName.resize(len - 1);
+ GetComputerNameEx(ComputerNameDnsHostname,
+ reinterpret_cast<wchar_t *>(const_cast<quint16 *>(hostName.utf16())), &len);
+ }
+ hostName.truncate(len);
+ return hostName;
+# else // !Q_OS_WIN
+
+ char hostName[512];
+ if (gethostname(hostName, sizeof(hostName)) == -1)
+ return QString();
+ hostName[sizeof(hostName) - 1] = '\0';
+ return QString::fromLocal8Bit(hostName);
+# endif
+#endif
+}
+#endif // QT_BOOTSTRAPPED
+
+enum {
+ UuidStringLen = sizeof("00000000-0000-0000-0000-000000000000") - 1
+};
+
+/*!
+ \since 5.11
+
+ Returns a unique ID for this machine, if one can be determined. If no
+ unique ID could be determined, this function returns an empty byte array.
+ Unlike machineHostName(), the value returned by this function is likely
+ globally unique.
+
+ A unique ID is useful in network operations to identify this machine for an
+ extended period of time, when the IP address could change or if this
+ machine could have more than one IP address. For example, the ID could be
+ used when communicating with a server or when storing device-specific data
+ in shared network storage.
+
+ Note that on some systems, this value will persist across reboots and on
+ some it will not. Applications should not blindly depend on this fact
+ without verifying the OS capabilities. In particular, on Linux systems,
+ this ID is usually permanent and it matches the D-Bus machine ID, except
+ for nodes without their own storage (replicated nodes).
+
+ \sa machineHostName(), bootUniqueId()
+*/
+QByteArray QSysInfo::machineUniqueId()
+{
+#if defined(Q_OS_DARWIN) && __has_include(<IOKit/IOKitLib.h>)
+ char uuid[UuidStringLen + 1];
+ io_service_t service = IOServiceGetMatchingService(kIOMainPortDefault, IOServiceMatching("IOPlatformExpertDevice"));
+ QCFString stringRef = (CFStringRef)IORegistryEntryCreateCFProperty(service, CFSTR(kIOPlatformUUIDKey), kCFAllocatorDefault, 0);
+ CFStringGetCString(stringRef, uuid, sizeof(uuid), kCFStringEncodingMacRoman);
+ return QByteArray(uuid);
+#elif defined(Q_OS_BSD4) && defined(KERN_HOSTUUID)
+ char uuid[UuidStringLen + 1];
+ size_t uuidlen = sizeof(uuid);
+ int name[] = { CTL_KERN, KERN_HOSTUUID };
+ if (sysctl(name, sizeof name / sizeof name[0], &uuid, &uuidlen, nullptr, 0) == 0
+ && uuidlen == sizeof(uuid))
+ return QByteArray(uuid, uuidlen - 1);
+#elif defined(Q_OS_UNIX)
+ // The modern name on Linux is /etc/machine-id, but that path is
+ // unlikely to exist on non-Linux (non-systemd) systems. The old
+ // path is more than enough.
+ static const char fullfilename[] = "/usr/local/var/lib/dbus/machine-id";
+ const char *firstfilename = fullfilename + sizeof("/usr/local") - 1;
+ int fd = qt_safe_open(firstfilename, O_RDONLY);
+ if (fd == -1 && errno == ENOENT)
+ fd = qt_safe_open(fullfilename, O_RDONLY);
+
+ if (fd != -1) {
+ char buffer[32]; // 128 bits, hex-encoded
+ qint64 len = qt_safe_read(fd, buffer, sizeof(buffer));
+ qt_safe_close(fd);
+
+ if (len != -1)
+ return QByteArray(buffer, len);
+ }
+#elif defined(Q_OS_WIN)
+ // Let's poke at the registry
+ const QString machineGuid = QWinRegistryKey(HKEY_LOCAL_MACHINE, LR"(SOFTWARE\Microsoft\Cryptography)")
+ .stringValue(u"MachineGuid"_s);
+ if (!machineGuid.isEmpty())
+ return machineGuid.toLatin1();
+#endif
+ return QByteArray();
+}
+
+/*!
+ \since 5.11
+
+ Returns a unique ID for this machine's boot, if one can be determined. If
+ no unique ID could be determined, this function returns an empty byte
+ array. This value is expected to change after every boot and can be
+ considered globally unique.
+
+ This function is currently only implemented for Linux and Apple operating
+ systems.
+
+ \sa machineUniqueId()
+*/
+QByteArray QSysInfo::bootUniqueId()
+{
+#ifdef Q_OS_LINUX
+ // use low-level API here for simplicity
+ int fd = qt_safe_open("/proc/sys/kernel/random/boot_id", O_RDONLY);
+ if (fd != -1) {
+ char uuid[UuidStringLen];
+ qint64 len = qt_safe_read(fd, uuid, sizeof(uuid));
+ qt_safe_close(fd);
+ if (len == UuidStringLen)
+ return QByteArray(uuid, UuidStringLen);
+ }
+#elif defined(Q_OS_DARWIN)
+ // "kern.bootsessionuuid" is only available by name
+ char uuid[UuidStringLen + 1];
+ size_t uuidlen = sizeof(uuid);
+ if (sysctlbyname("kern.bootsessionuuid", uuid, &uuidlen, nullptr, 0) == 0
+ && uuidlen == sizeof(uuid))
+ return QByteArray(uuid, uuidlen - 1);
+#endif
+ return QByteArray();
+};
+
+QT_END_NAMESPACE
diff --git a/src/corelib/global/qsysinfo.h b/src/corelib/global/qsysinfo.h
index 04379ecd7e..01f6313299 100644
--- a/src/corelib/global/qsysinfo.h
+++ b/src/corelib/global/qsysinfo.h
@@ -1,48 +1,14 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include <QtCore/qglobal.h>
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2016 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QSYSINFO_H
#define QSYSINFO_H
+#include <QtCore/qtconfigmacros.h>
+#include <QtCore/qprocessordetection.h>
+#include <QtCore/qtcoreexports.h>
+
QT_BEGIN_NAMESPACE
/*
@@ -50,6 +16,8 @@ QT_BEGIN_NAMESPACE
*/
class QString;
+class QByteArray;
+
class Q_CORE_EXPORT QSysInfo
{
public:
diff --git a/src/corelib/global/qsystemdetection.h b/src/corelib/global/qsystemdetection.h
index c8f98042c9..b29f2e9496 100644
--- a/src/corelib/global/qsystemdetection.h
+++ b/src/corelib/global/qsystemdetection.h
@@ -1,45 +1,11 @@
-/****************************************************************************
-**
-** Copyright (C) 2019 The Qt Company Ltd.
-** Copyright (C) 2019 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2019 The Qt Company Ltd.
+// Copyright (C) 2019 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
-#ifndef QGLOBAL_H
-# include <QtCore/qglobal.h>
+#if 0
+#pragma qt_class(QtSystemDetection)
+#pragma qt_sync_skip_header_check
+#pragma qt_sync_stop_processing
#endif
#ifndef QSYSTEMDETECTION_H
@@ -53,6 +19,7 @@
IOS - iOS
WATCHOS - watchOS
TVOS - tvOS
+ VISIONOS - visionOS
WIN32 - Win32 (Windows 2000/XP/Vista/7 and Windows Server 2003/2008)
CYGWIN - Cygwin
SOLARIS - Sun Solaris
@@ -72,6 +39,7 @@
ANDROID - Android platform
HAIKU - Haiku
WEBOS - LG WebOS
+ WASM - WebAssembly
The following operating systems have variants:
LINUX - both Q_OS_LINUX and Q_OS_ANDROID are defined when building for Android
@@ -84,20 +52,18 @@
#if defined(__APPLE__) && (defined(__GNUC__) || defined(__xlC__) || defined(__xlc__))
# include <TargetConditionals.h>
+# define Q_OS_APPLE
# if defined(TARGET_OS_MAC) && TARGET_OS_MAC
# define Q_OS_DARWIN
# define Q_OS_BSD4
-# ifdef __LP64__
-# define Q_OS_DARWIN64
-# else
-# define Q_OS_DARWIN32
-# endif
# if defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE
# define QT_PLATFORM_UIKIT
# if defined(TARGET_OS_WATCH) && TARGET_OS_WATCH
# define Q_OS_WATCHOS
# elif defined(TARGET_OS_TV) && TARGET_OS_TV
# define Q_OS_TVOS
+# elif defined(TARGET_OS_VISION) && TARGET_OS_VISION
+# define Q_OS_VISIONOS
# else
# // TARGET_OS_IOS is only available in newer SDKs,
# // so assume any other iOS-based platform is iOS for now
@@ -128,8 +94,6 @@
# define Q_OS_SOLARIS
#elif defined(hpux) || defined(__hpux)
# define Q_OS_HPUX
-#elif defined(__native_client__)
-# define Q_OS_NACL
#elif defined(__EMSCRIPTEN__)
# define Q_OS_WASM
#elif defined(__linux__) || defined(__linux)
@@ -161,7 +125,7 @@
# define Q_OS_INTEGRITY
#elif defined(__rtems__)
# define Q_OS_RTEMS
-#elif defined(VXWORKS) /* there is no "real" VxWorks define - this has to be set in the mkspec! */
+#elif defined(__vxworks)
# define Q_OS_VXWORKS
#elif defined(__HAIKU__)
# define Q_OS_HAIKU
@@ -187,93 +151,77 @@
// Compatibility synonyms
#ifdef Q_OS_DARWIN
-#define Q_OS_MAC
-#endif
-#ifdef Q_OS_DARWIN32
-#define Q_OS_MAC32
-#endif
-#ifdef Q_OS_DARWIN64
-#define Q_OS_MAC64
-#endif
-#ifdef Q_OS_MACOS
-#define Q_OS_MACX
-#define Q_OS_OSX
+# pragma clang diagnostic push
+# pragma clang diagnostic ignored "-Wunknown-pragmas"
+# define Q_OS_MAC // FIXME: Deprecate
+# ifdef __LP64__
+# define Q_OS_DARWIN64
+# pragma clang deprecated(Q_OS_DARWIN64, "use Q_OS_DARWIN and QT_POINTER_SIZE/Q_PROCESSOR_* instead")
+# define Q_OS_MAC64
+# pragma clang deprecated(Q_OS_MAC64, "use Q_OS_DARWIN and QT_POINTER_SIZE/Q_PROCESSOR_* instead")
+# else
+# define Q_OS_DARWIN32
+# pragma clang deprecated(Q_OS_DARWIN32, "use Q_OS_DARWIN and QT_POINTER_SIZE/Q_PROCESSOR_* instead")
+# define Q_OS_MAC32
+# pragma clang deprecated(Q_OS_MAC32, "use Q_OS_DARWIN and QT_POINTER_SIZE/Q_PROCESSOR_* instead")
+# endif
+# ifdef Q_OS_MACOS
+# define Q_OS_MACX
+# pragma clang deprecated(Q_OS_MACX, "use Q_OS_MACOS instead")
+# define Q_OS_OSX
+# pragma clang deprecated(Q_OS_OSX, "use Q_OS_MACOS instead")
+# endif
+# pragma clang diagnostic pop
#endif
#ifdef Q_OS_DARWIN
# include <Availability.h>
# include <AvailabilityMacros.h>
-#
-# ifdef Q_OS_MACOS
-# if !defined(__MAC_OS_X_VERSION_MIN_REQUIRED) || __MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_10_6
-# undef __MAC_OS_X_VERSION_MIN_REQUIRED
-# define __MAC_OS_X_VERSION_MIN_REQUIRED __MAC_10_6
-# endif
-# if !defined(MAC_OS_X_VERSION_MIN_REQUIRED) || MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_6
-# undef MAC_OS_X_VERSION_MIN_REQUIRED
-# define MAC_OS_X_VERSION_MIN_REQUIRED MAC_OS_X_VERSION_10_6
-# endif
-# endif
-#
-# // Numerical checks are preferred to named checks, but to be safe
-# // we define the missing version names in case Qt uses them.
-#
-# if !defined(__MAC_10_11)
-# define __MAC_10_11 101100
-# endif
-# if !defined(__MAC_10_12)
-# define __MAC_10_12 101200
-# endif
-# if !defined(__MAC_10_13)
-# define __MAC_10_13 101300
-# endif
-# if !defined(__MAC_10_14)
-# define __MAC_10_14 101400
-# endif
-# if !defined(__MAC_10_15)
-# define __MAC_10_15 101500
-# endif
-# if !defined(__MAC_10_16)
-# define __MAC_10_16 101600
-# endif
-# if !defined(MAC_OS_X_VERSION_10_11)
-# define MAC_OS_X_VERSION_10_11 __MAC_10_11
-# endif
-# if !defined(MAC_OS_X_VERSION_10_12)
-# define MAC_OS_X_VERSION_10_12 __MAC_10_12
-# endif
-# if !defined(MAC_OS_X_VERSION_10_13)
-# define MAC_OS_X_VERSION_10_13 __MAC_10_13
-# endif
-# if !defined(MAC_OS_X_VERSION_10_14)
-# define MAC_OS_X_VERSION_10_14 __MAC_10_14
-# endif
-# if !defined(MAC_OS_X_VERSION_10_15)
-# define MAC_OS_X_VERSION_10_15 __MAC_10_15
-# endif
-# if !defined(MAC_OS_X_VERSION_10_16)
-# define MAC_OS_X_VERSION_10_16 __MAC_10_16
-# endif
-#
-# if !defined(__IPHONE_10_0)
-# define __IPHONE_10_0 100000
-# endif
-# if !defined(__IPHONE_10_1)
-# define __IPHONE_10_1 100100
-# endif
-# if !defined(__IPHONE_10_2)
-# define __IPHONE_10_2 100200
-# endif
-# if !defined(__IPHONE_10_3)
-# define __IPHONE_10_3 100300
-# endif
-# if !defined(__IPHONE_11_0)
-# define __IPHONE_11_0 110000
-# endif
-# if !defined(__IPHONE_12_0)
-# define __IPHONE_12_0 120000
-# endif
-#endif
+
+# define QT_DARWIN_PLATFORM_SDK_EQUAL_OR_ABOVE(macos, ios, tvos, watchos) \
+ ((defined(__MAC_OS_X_VERSION_MAX_ALLOWED) && macos != __MAC_NA && __MAC_OS_X_VERSION_MAX_ALLOWED >= macos) || \
+ (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && ios != __IPHONE_NA && __IPHONE_OS_VERSION_MAX_ALLOWED >= ios) || \
+ (defined(__TV_OS_VERSION_MAX_ALLOWED) && tvos != __TVOS_NA && __TV_OS_VERSION_MAX_ALLOWED >= tvos) || \
+ (defined(__WATCH_OS_VERSION_MAX_ALLOWED) && watchos != __WATCHOS_NA && __WATCH_OS_VERSION_MAX_ALLOWED >= watchos))
+
+# define QT_DARWIN_DEPLOYMENT_TARGET_BELOW(macos, ios, tvos, watchos) \
+ ((defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && macos != __MAC_NA && __MAC_OS_X_VERSION_MIN_REQUIRED < macos) || \
+ (defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && ios != __IPHONE_NA && __IPHONE_OS_VERSION_MIN_REQUIRED < ios) || \
+ (defined(__TV_OS_VERSION_MIN_REQUIRED) && tvos != __TVOS_NA && __TV_OS_VERSION_MIN_REQUIRED < tvos) || \
+ (defined(__WATCH_OS_VERSION_MIN_REQUIRED) && watchos != __WATCHOS_NA && __WATCH_OS_VERSION_MIN_REQUIRED < watchos))
+
+# define QT_MACOS_IOS_PLATFORM_SDK_EQUAL_OR_ABOVE(macos, ios) \
+ QT_DARWIN_PLATFORM_SDK_EQUAL_OR_ABOVE(macos, ios, __TVOS_NA, __WATCHOS_NA)
+# define QT_MACOS_PLATFORM_SDK_EQUAL_OR_ABOVE(macos) \
+ QT_DARWIN_PLATFORM_SDK_EQUAL_OR_ABOVE(macos, __IPHONE_NA, __TVOS_NA, __WATCHOS_NA)
+# define QT_IOS_PLATFORM_SDK_EQUAL_OR_ABOVE(ios) \
+ QT_DARWIN_PLATFORM_SDK_EQUAL_OR_ABOVE(__MAC_NA, ios, __TVOS_NA, __WATCHOS_NA)
+# define QT_TVOS_PLATFORM_SDK_EQUAL_OR_ABOVE(tvos) \
+ QT_DARWIN_PLATFORM_SDK_EQUAL_OR_ABOVE(__MAC_NA, __IPHONE_NA, tvos, __WATCHOS_NA)
+# define QT_WATCHOS_PLATFORM_SDK_EQUAL_OR_ABOVE(watchos) \
+ QT_DARWIN_PLATFORM_SDK_EQUAL_OR_ABOVE(__MAC_NA, __IPHONE_NA, __TVOS_NA, watchos)
+
+# define QT_MACOS_IOS_DEPLOYMENT_TARGET_BELOW(macos, ios) \
+ QT_DARWIN_DEPLOYMENT_TARGET_BELOW(macos, ios, __TVOS_NA, __WATCHOS_NA)
+# define QT_MACOS_DEPLOYMENT_TARGET_BELOW(macos) \
+ QT_DARWIN_DEPLOYMENT_TARGET_BELOW(macos, __IPHONE_NA, __TVOS_NA, __WATCHOS_NA)
+# define QT_IOS_DEPLOYMENT_TARGET_BELOW(ios) \
+ QT_DARWIN_DEPLOYMENT_TARGET_BELOW(__MAC_NA, ios, __TVOS_NA, __WATCHOS_NA)
+# define QT_TVOS_DEPLOYMENT_TARGET_BELOW(tvos) \
+ QT_DARWIN_DEPLOYMENT_TARGET_BELOW(__MAC_NA, __IPHONE_NA, tvos, __WATCHOS_NA)
+# define QT_WATCHOS_DEPLOYMENT_TARGET_BELOW(watchos) \
+ QT_DARWIN_DEPLOYMENT_TARGET_BELOW(__MAC_NA, __IPHONE_NA, __TVOS_NA, watchos)
+
+#else // !Q_OS_DARWIN
+
+#define QT_DARWIN_PLATFORM_SDK_EQUAL_OR_ABOVE(macos, ios, tvos, watchos) (0)
+#define QT_MACOS_IOS_PLATFORM_SDK_EQUAL_OR_ABOVE(macos, ios) (0)
+#define QT_MACOS_PLATFORM_SDK_EQUAL_OR_ABOVE(macos) (0)
+#define QT_IOS_PLATFORM_SDK_EQUAL_OR_ABOVE(ios) (0)
+#define QT_TVOS_PLATFORM_SDK_EQUAL_OR_ABOVE(tvos) (0)
+#define QT_WATCHOS_PLATFORM_SDK_EQUAL_OR_ABOVE(watchos) (0)
+
+#endif // Q_OS_DARWIN
#ifdef __LSB_VERSION__
# if __LSB_VERSION__ < 40
@@ -284,4 +232,11 @@
#endif
#endif
+#if defined (__ELF__)
+# define Q_OF_ELF
+#endif
+#if defined (__MACH__) && defined (__APPLE__)
+# define Q_OF_MACH_O
+#endif
+
#endif // QSYSTEMDETECTION_H
diff --git a/src/corelib/global/qsystemdetection.qdoc b/src/corelib/global/qsystemdetection.qdoc
new file mode 100644
index 0000000000..a48a79bbb2
--- /dev/null
+++ b/src/corelib/global/qsystemdetection.qdoc
@@ -0,0 +1,219 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
+
+/*!
+ \headerfile <QtSystemDetection>
+ \inmodule QtCore
+ \title Platform-specific Macro Definitions
+ \ingroup funclists
+
+ \brief The <QtSystemDetection> header file includes various
+ platfrom-specific macros.
+
+ The <QtSystemDetection> header file declares a range of macros (Q_OS_*)
+ that are defined for the specified platforms. For example, Q_OS_UNIX which
+ is defined for Unix-based systems.
+
+ The purpose of these macros is to enable programmers to add
+ platform-specific code to their application.
+*/
+
+/*!
+ \macro Q_OS_DARWIN
+ \relates <QtSystemDetection>
+
+ Defined on Darwin-based operating systems such as \macos, iOS, watchOS, and tvOS.
+
+ \note Unless you are dealing with code specific to the Darwin kernel,
+ prefer Q_OS_APPLE to refer to the family of Apple operating systems.
+*/
+
+/*!
+ \macro Q_OS_APPLE
+ \relates <QtSystemDetection>
+
+ Defined on Apple operating systems such as \macos, iOS, watchOS, and tvOS.
+*/
+
+/*!
+ \macro Q_OS_MAC
+ \relates <QtSystemDetection>
+
+ Deprecated synonym for \c Q_OS_DARWIN. Do not use.
+*/
+
+/*!
+ \macro Q_OS_OSX
+ \relates <QtSystemDetection>
+
+ Deprecated synonym for \c Q_OS_MACOS. Do not use.
+*/
+
+/*!
+ \macro Q_OS_MACOS
+ \relates <QtSystemDetection>
+
+ Defined on \macos.
+*/
+
+/*!
+ \macro Q_OS_IOS
+ \relates <QtSystemDetection>
+
+ Defined on iOS.
+*/
+
+/*!
+ \macro Q_OS_WATCHOS
+ \relates <QtSystemDetection>
+
+ Defined on watchOS.
+*/
+
+/*!
+ \macro Q_OS_TVOS
+ \relates <QtSystemDetection>
+
+ Defined on tvOS.
+*/
+
+/*!
+ \macro Q_OS_VISIONOS
+ \relates <QtSystemDetection>
+
+ Defined on visionOS.
+*/
+
+/*!
+ \macro Q_OS_WIN
+ \relates <QtSystemDetection>
+
+ Defined on all supported versions of Windows. That is, if
+ \l Q_OS_WIN32 or \l Q_OS_WIN64 is defined.
+*/
+
+/*!
+ \macro Q_OS_WINDOWS
+ \relates <QtSystemDetection>
+
+ This is a synonym for Q_OS_WIN.
+*/
+
+/*!
+ \macro Q_OS_WIN32
+ \relates <QtSystemDetection>
+
+ Defined on 32-bit and 64-bit versions of Windows.
+*/
+
+/*!
+ \macro Q_OS_WIN64
+ \relates <QtSystemDetection>
+
+ Defined on 64-bit versions of Windows.
+*/
+
+/*!
+ \macro Q_OS_CYGWIN
+ \relates <QtSystemDetection>
+
+ Defined on Cygwin.
+*/
+
+/*!
+ \macro Q_OS_SOLARIS
+ \relates <QtSystemDetection>
+
+ Defined on Sun Solaris.
+*/
+
+/*!
+ \macro Q_OS_HPUX
+ \relates <QtSystemDetection>
+
+ Defined on HP-UX.
+*/
+
+/*!
+ \macro Q_OS_LINUX
+ \relates <QtSystemDetection>
+
+ Defined on Linux.
+*/
+
+/*!
+ \macro Q_OS_ANDROID
+ \relates <QtSystemDetection>
+
+ Defined on Android.
+*/
+
+/*!
+ \macro Q_OS_FREEBSD
+ \relates <QtSystemDetection>
+
+ Defined on FreeBSD.
+*/
+
+/*!
+ \macro Q_OS_NETBSD
+ \relates <QtSystemDetection>
+
+ Defined on NetBSD.
+*/
+
+/*!
+ \macro Q_OS_OPENBSD
+ \relates <QtSystemDetection>
+
+ Defined on OpenBSD.
+*/
+
+/*!
+ \macro Q_OS_AIX
+ \relates <QtSystemDetection>
+
+ Defined on AIX.
+*/
+
+/*!
+ \macro Q_OS_HURD
+ \relates <QtSystemDetection>
+
+ Defined on GNU Hurd.
+*/
+
+/*!
+ \macro Q_OS_QNX
+ \relates <QtSystemDetection>
+
+ Defined on QNX Neutrino.
+*/
+
+/*!
+ \macro Q_OS_LYNX
+ \relates <QtSystemDetection>
+
+ Defined on LynxOS.
+*/
+
+/*!
+ \macro Q_OS_BSD4
+ \relates <QtSystemDetection>
+
+ Defined on any BSD 4.4 system.
+*/
+
+/*!
+ \macro Q_OS_UNIX
+ \relates <QtSystemDetection>
+
+ Defined on any UNIX BSD/SYSV system.
+*/
+
+/*!
+ \macro Q_OS_WASM
+ \relates <QtSystemDetection>
+
+ Defined on Web Assembly.
+*/
diff --git a/src/corelib/global/qt_pch.h b/src/corelib/global/qt_pch.h
index eccb7ba169..3f224cda85 100644
--- a/src/corelib/global/qt_pch.h
+++ b/src/corelib/global/qt_pch.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
/*
* This is a precompiled header file for use in Xcode / Mac GCC /
@@ -50,36 +14,31 @@
// for rand_s, _CRT_RAND_S must be #defined before #including stdlib.h.
// put it at the beginning so some indirect inclusion doesn't break it
#ifndef _CRT_RAND_S
-#define _CRT_RAND_S
+# define _CRT_RAND_S
#endif
#include <stdlib.h>
#include <qglobal.h>
#ifdef Q_OS_WIN
-# ifdef Q_CC_MINGW
+# ifdef Q_CC_MINGW
// <unistd.h> must be included before any other header pulls in <time.h>.
-# include <unistd.h> // Define _POSIX_THREAD_SAFE_FUNCTIONS to obtain localtime_r()
-# endif
-# define _POSIX_
-# include <limits.h>
-# undef _POSIX_
-# if defined(Q_CC_CLANG) && defined(Q_CC_MSVC)
-// See https://bugs.llvm.org/show_bug.cgi?id=41226
-# include <wchar.h>
-__declspec(selectany) auto *__wmemchr_symbol_loader_value = wmemchr(L"", L'0', 0);
-# endif
-# endif
-# include <qcoreapplication.h>
-# include <qcoreevent.h>
-# include <qiodevice.h>
-# include <qlist.h>
-# include <qvariant.h> /* All moc generated code has this include */
-# include <qobject.h>
-# if QT_CONFIG(regularexpression)
-# include <qregularexpression.h>
-# endif
-# include <qscopedpointer.h>
-# include <qshareddata.h>
-# include <qstring.h>
-# include <qstringlist.h>
-# include <qtimer.h>
+# include <unistd.h> // Define _POSIX_THREAD_SAFE_FUNCTIONS to obtain localtime_r()
+# endif // Q_CC_MINGW
+# define _POSIX_
+# include <limits.h>
+# undef _POSIX_
+#endif // Q_OS_WIN
+#include <qcoreapplication.h>
+#include <qcoreevent.h>
+#include <qiodevice.h>
+#include <qlist.h>
+#include <qvariant.h> /* All moc generated code has this include */
+#include <qobject.h>
+#if QT_CONFIG(regularexpression)
+# include <qregularexpression.h>
+#endif
+#include <qscopedpointer.h>
+#include <qshareddata.h>
+#include <qstring.h>
+#include <qstringlist.h>
+#include <qtimer.h>
#endif
diff --git a/src/corelib/global/qt_windows.h b/src/corelib/global/qt_windows.h
index 15255b9434..5586d0b927 100644
--- a/src/corelib/global/qt_windows.h
+++ b/src/corelib/global/qt_windows.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QT_WINDOWS_H
#define QT_WINDOWS_H
@@ -55,7 +19,7 @@
# define _WIN32_IE 0x0A00
#endif
#ifndef NTDDI_VERSION
-# define NTDDI_VERSION 0x0A00000B // NTDDI_WIN10_CO
+# define NTDDI_VERSION 0x0A00000C // NTDDI_WIN10_NI
#endif
#ifndef NOMINMAX
diff --git a/src/corelib/global/qtclasshelpermacros.h b/src/corelib/global/qtclasshelpermacros.h
new file mode 100644
index 0000000000..8839e80fb9
--- /dev/null
+++ b/src/corelib/global/qtclasshelpermacros.h
@@ -0,0 +1,132 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QTCLASSHELPERMACROS_H
+#define QTCLASSHELPERMACROS_H
+
+#include <QtCore/qtconfigmacros.h>
+
+#if 0
+#pragma qt_class(QtClassHelperMacros)
+#pragma qt_sync_stop_processing
+#endif
+
+QT_BEGIN_NAMESPACE
+
+#if defined(__cplusplus)
+
+/*
+ Some classes do not permit copies to be made of an object. These
+ classes contains a private copy constructor and assignment
+ operator to disable copying (the compiler gives an error message).
+*/
+#define Q_DISABLE_COPY(Class) \
+ Class(const Class &) = delete;\
+ Class &operator=(const Class &) = delete;
+
+#define Q_DISABLE_COPY_MOVE(Class) \
+ Q_DISABLE_COPY(Class) \
+ Class(Class &&) = delete; \
+ Class &operator=(Class &&) = delete;
+
+/*
+ Implementing a move assignment operator using an established
+ technique (move-and-swap, pure swap) is just boilerplate.
+ Here's a couple of *private* macros for convenience.
+
+ To know which one to use:
+
+ * if you don't have a move constructor (*) => use pure swap;
+ * if you have a move constructor, then
+ * if your class holds just memory (no file handles, no user-defined
+ datatypes, etc.) => use pure swap;
+ * use move and swap.
+
+ The preference should always go for the move-and-swap one, as it
+ will deterministically destroy the data previously held in *this,
+ and not "dump" it in the moved-from object (which may then be alive
+ for longer).
+
+ The requirement for either macro is the presence of a member swap(),
+ which any value class that defines its own special member functions
+ should have anyhow.
+
+ (*) Many value classes in Qt do not have move constructors; mostly,
+ the implicitly shared classes using QSharedDataPointer and friends.
+ The reason is mostly historical: those classes require either an
+ out-of-line move constructor, which we could not provide before we
+ made C++11 mandatory (and that we don't like anyhow), or
+ an out-of-line dtor for the Q(E)DSP<Private> member (cf. QPixmap).
+
+ If you can however add a move constructor to a class lacking it,
+ consider doing so, then reevaluate which macro to choose.
+*/
+#define QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_MOVE_AND_SWAP(Class) \
+ Class &operator=(Class &&other) noexcept { \
+ Class moved(std::move(other)); \
+ swap(moved); \
+ return *this; \
+ }
+
+#define QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_PURE_SWAP(Class) \
+ Class &operator=(Class &&other) noexcept { \
+ swap(other); \
+ return *this; \
+ }
+
+template <typename T> inline T *qGetPtrHelper(T *ptr) noexcept { return ptr; }
+template <typename Ptr> inline auto qGetPtrHelper(Ptr &ptr) noexcept -> decltype(ptr.get())
+{ static_assert(noexcept(ptr.get()), "Smart d pointers for Q_DECLARE_PRIVATE must have noexcept get()"); return ptr.get(); }
+
+class QObject;
+class QObjectPrivate;
+namespace QtPrivate {
+ template <typename ObjPrivate> void assertObjectType(QObjectPrivate *d);
+ inline const QObject *getQObject(const QObjectPrivate *d);
+}
+
+#define Q_DECLARE_PRIVATE(Class) \
+ inline Class##Private* d_func() noexcept \
+ { Q_CAST_IGNORE_ALIGN(return reinterpret_cast<Class##Private *>(qGetPtrHelper(d_ptr));) } \
+ inline const Class##Private* d_func() const noexcept \
+ { Q_CAST_IGNORE_ALIGN(return reinterpret_cast<const Class##Private *>(qGetPtrHelper(d_ptr));) } \
+ friend class Class##Private;
+
+#define Q_DECLARE_PRIVATE_D(Dptr, Class) \
+ inline Class##Private* d_func() noexcept \
+ { Q_CAST_IGNORE_ALIGN(return reinterpret_cast<Class##Private *>(qGetPtrHelper(Dptr));) } \
+ inline const Class##Private* d_func() const noexcept \
+ { Q_CAST_IGNORE_ALIGN(return reinterpret_cast<const Class##Private *>(qGetPtrHelper(Dptr));) } \
+ friend class Class##Private;
+
+#define Q_DECLARE_PUBLIC(Class) \
+ inline Class* q_func() noexcept { return static_cast<Class *>(q_ptr); } \
+ inline const Class* q_func() const noexcept { return static_cast<const Class *>(q_ptr); } \
+ friend class Class; \
+ friend const QObject *QtPrivate::getQObject(const QObjectPrivate *d); \
+ template <typename ObjPrivate> friend void QtPrivate::assertObjectType(QObjectPrivate *d);
+
+#define Q_D(Class) Class##Private * const d = d_func()
+#define Q_Q(Class) Class * const q = q_func()
+
+/*
+ Specialize a shared type with:
+
+ Q_DECLARE_SHARED(type)
+
+ where 'type' is the name of the type to specialize. NOTE: shared
+ types must define a member-swap, and be defined in the same
+ namespace as Qt for this to work.
+*/
+
+#define Q_DECLARE_SHARED(TYPE) \
+Q_DECLARE_TYPEINFO(TYPE, Q_RELOCATABLE_TYPE); \
+inline void swap(TYPE &value1, TYPE &value2) \
+ noexcept(noexcept(value1.swap(value2))) \
+{ value1.swap(value2); }
+
+#endif // __cplusplus
+
+QT_END_NAMESPACE
+
+#endif // QTCLASSHELPERMACROS_H
diff --git a/src/corelib/global/qtclasshelpermacros.qdoc b/src/corelib/global/qtclasshelpermacros.qdoc
new file mode 100644
index 0000000000..8eaee7e5d2
--- /dev/null
+++ b/src/corelib/global/qtclasshelpermacros.qdoc
@@ -0,0 +1,59 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
+
+/*!
+ \macro Q_DISABLE_COPY(Class)
+ \relates <QtClassHelperMacros>
+
+ Disables the use of copy constructors and assignment operators
+ for the given \a Class.
+
+ Instances of subclasses of QObject should not be thought of as
+ values that can be copied or assigned, but as unique identities.
+ This means that when you create your own subclass of QObject
+ (director or indirect), you should \e not give it a copy constructor
+ or an assignment operator. However, it may not enough to simply
+ omit them from your class, because, if you mistakenly write some code
+ that requires a copy constructor or an assignment operator (it's easy
+ to do), your compiler will thoughtfully create it for you. You must
+ do more.
+
+ The curious user will have seen that the Qt classes derived
+ from QObject typically include this macro in a private section:
+
+ \snippet code/src_corelib_global_qglobal.cpp 43
+
+ It declares a copy constructor and an assignment operator in the
+ private section, so that if you use them by mistake, the compiler
+ will report an error.
+
+ \snippet code/src_corelib_global_qglobal.cpp 44
+
+ But even this might not catch absolutely every case. You might be
+ tempted to do something like this:
+
+ \snippet code/src_corelib_global_qglobal.cpp 45
+
+ First of all, don't do that. Most compilers will generate code that
+ uses the copy constructor, so the privacy violation error will be
+ reported, but your C++ compiler is not required to generate code for
+ this statement in a specific way. It could generate code using
+ \e{neither} the copy constructor \e{nor} the assignment operator we
+ made private. In that case, no error would be reported, but your
+ application would probably crash when you called a member function
+ of \c{w}.
+
+ \sa Q_DISABLE_COPY_MOVE
+*/
+
+/*!
+ \macro Q_DISABLE_COPY_MOVE(Class)
+ \relates <QtClassHelperMacros>
+
+ A convenience macro that disables the use of copy constructors, assignment
+ operators, move constructors and move assignment operators for the given
+ \a Class.
+
+ \sa Q_DISABLE_COPY
+ \since 5.13
+*/
diff --git a/src/corelib/global/qtconfiginclude.h b/src/corelib/global/qtconfiginclude.h
new file mode 100644
index 0000000000..8b22a47ac7
--- /dev/null
+++ b/src/corelib/global/qtconfiginclude.h
@@ -0,0 +1,22 @@
+// Copyright (C) 2022 Intel Corporation
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QTCONFIGINCLUDE_H
+#define QTCONFIGINCLUDE_H
+
+#if 0
+# pragma qt_sync_stop_processing
+#endif
+
+#include <QtCore/qconfig.h>
+
+#ifdef QT_BOOTSTRAPPED
+// qconfig-bootstrapped.h is not supposed to be a part of the synced header files. So we find it by
+// the include path specified for Bootstrap library in the source tree instead of the build tree as
+// it's done for regular header files.
+#include "qconfig-bootstrapped.h"
+#else
+#include <QtCore/qtcore-config.h>
+#endif
+
+#endif // QTCONFIGINCLUDE_H
diff --git a/src/corelib/global/qtconfigmacros.h b/src/corelib/global/qtconfigmacros.h
new file mode 100644
index 0000000000..018161eac4
--- /dev/null
+++ b/src/corelib/global/qtconfigmacros.h
@@ -0,0 +1,208 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QTCONFIGMACROS_H
+#define QTCONFIGMACROS_H
+
+#if 0
+# pragma qt_sync_stop_processing
+#endif
+
+#include <QtCore/qtconfiginclude.h>
+
+#include <assert.h>
+
+/*
+ The Qt modules' export macros.
+ The options are:
+ - defined(QT_STATIC): Qt was built or is being built in static mode
+ - defined(QT_SHARED): Qt was built or is being built in shared/dynamic mode
+ If neither was defined, then QT_SHARED is implied. If Qt was compiled in static
+ mode, QT_STATIC is defined in qconfig.h. In shared mode, QT_STATIC is implied
+ for the bootstrapped tools.
+*/
+
+#ifdef QT_BOOTSTRAPPED
+# ifdef QT_SHARED
+# error "QT_SHARED and QT_BOOTSTRAPPED together don't make sense. Please fix the build"
+# elif !defined(QT_STATIC)
+# define QT_STATIC
+# endif
+#endif
+
+#if defined(QT_SHARED) || !defined(QT_STATIC)
+# ifdef QT_STATIC
+# error "Both QT_SHARED and QT_STATIC defined, please make up your mind"
+# endif
+# ifndef QT_SHARED
+# define QT_SHARED
+# endif
+#endif
+
+/*
+ No, this is not an evil backdoor. QT_BUILD_INTERNAL just exports more symbols
+ for Qt's internal unit tests. If you want slower loading times and more
+ symbols that can vanish from version to version, feel free to define QT_BUILD_INTERNAL.
+
+ \note After adding Q_AUTOTEST_EXPORT to a method, you'll need to wrap any unittests
+ that will use that method in "#ifdef QT_BUILD_INTERNAL".
+*/
+#if defined(QT_BUILD_INTERNAL) && defined(QT_BUILDING_QT) && defined(QT_SHARED)
+# define Q_AUTOTEST_EXPORT Q_DECL_EXPORT
+#elif defined(QT_BUILD_INTERNAL) && defined(QT_SHARED)
+# define Q_AUTOTEST_EXPORT Q_DECL_IMPORT
+#else
+# define Q_AUTOTEST_EXPORT
+#endif
+
+/*
+ The QT_CONFIG macro implements a safe compile time check for features of Qt.
+ Features can be in three states:
+ 0 or undefined: This will lead to a compile error when testing for it
+ -1: The feature is not available
+ 1: The feature is available
+*/
+#define QT_CONFIG(feature) (1/QT_FEATURE_##feature == 1)
+#define QT_REQUIRE_CONFIG(feature) static_assert(QT_FEATURE_##feature == 1, "Required feature " #feature " for file " __FILE__ " not available.")
+
+/* moc compats (signals/slots) */
+#ifndef QT_MOC_COMPAT
+# define QT_MOC_COMPAT
+#else
+# undef QT_MOC_COMPAT
+# define QT_MOC_COMPAT
+#endif
+
+/*
+ Debugging and error handling
+*/
+
+#if !defined(QT_NO_DEBUG) && !defined(QT_DEBUG)
+# define QT_DEBUG
+#endif
+
+// valid for both C and C++
+#define QT_MANGLE_NAMESPACE0(x) x
+#define QT_MANGLE_NAMESPACE1(a, b) a##_##b
+#define QT_MANGLE_NAMESPACE2(a, b) QT_MANGLE_NAMESPACE1(a,b)
+#if !defined(QT_NAMESPACE) || defined(Q_MOC_RUN) /* user namespace */
+# define QT_MANGLE_NAMESPACE(name) name
+#else
+# define QT_MANGLE_NAMESPACE(name) QT_MANGLE_NAMESPACE2( \
+ QT_MANGLE_NAMESPACE0(name), QT_MANGLE_NAMESPACE0(QT_NAMESPACE))
+#endif
+
+#ifdef __cplusplus
+
+#if !defined(QT_NAMESPACE) || defined(Q_MOC_RUN) /* user namespace */
+
+# define QT_PREPEND_NAMESPACE(name) ::name
+# define QT_USE_NAMESPACE
+# define QT_BEGIN_NAMESPACE
+# define QT_END_NAMESPACE
+# define QT_BEGIN_INCLUDE_NAMESPACE
+# define QT_END_INCLUDE_NAMESPACE
+# define QT_FORWARD_DECLARE_CLASS(name) class name;
+# define QT_FORWARD_DECLARE_STRUCT(name) struct name;
+
+#elif defined(QT_INLINE_NAMESPACE) /* user inline namespace FIXME in Qt 7: Default */
+
+# define QT_PREPEND_NAMESPACE(name) ::QT_NAMESPACE::name
+# define QT_USE_NAMESPACE
+# define QT_BEGIN_NAMESPACE inline namespace QT_NAMESPACE {
+# define QT_END_NAMESPACE }
+# define QT_BEGIN_INCLUDE_NAMESPACE }
+# define QT_END_INCLUDE_NAMESPACE inline namespace QT_NAMESPACE {
+# define QT_FORWARD_DECLARE_CLASS(name) \
+QT_BEGIN_NAMESPACE class name; QT_END_NAMESPACE
+
+# define QT_FORWARD_DECLARE_STRUCT(name) \
+QT_BEGIN_NAMESPACE struct name; QT_END_NAMESPACE
+
+inline namespace QT_NAMESPACE {}
+
+#else /* user namespace */
+
+# define QT_PREPEND_NAMESPACE(name) ::QT_NAMESPACE::name
+# define QT_USE_NAMESPACE using namespace ::QT_NAMESPACE;
+# define QT_BEGIN_NAMESPACE namespace QT_NAMESPACE {
+# define QT_END_NAMESPACE }
+# define QT_BEGIN_INCLUDE_NAMESPACE }
+# define QT_END_INCLUDE_NAMESPACE namespace QT_NAMESPACE {
+# define QT_FORWARD_DECLARE_CLASS(name) \
+ QT_BEGIN_NAMESPACE class name; QT_END_NAMESPACE \
+ using QT_PREPEND_NAMESPACE(name);
+
+# define QT_FORWARD_DECLARE_STRUCT(name) \
+ QT_BEGIN_NAMESPACE struct name; QT_END_NAMESPACE \
+ using QT_PREPEND_NAMESPACE(name);
+
+namespace QT_NAMESPACE {}
+
+# ifndef QT_BOOTSTRAPPED
+# ifndef QT_NO_USING_NAMESPACE
+ /*
+ This expands to a "using QT_NAMESPACE" also in _header files_.
+ It is the only way the feature can be used without too much
+ pain, but if people _really_ do not want it they can add
+ QT_NO_USING_NAMESPACE to their build configuration.
+ */
+ QT_USE_NAMESPACE
+# endif
+# endif
+
+#endif /* user namespace */
+
+#else /* __cplusplus */
+
+# define QT_BEGIN_NAMESPACE
+# define QT_END_NAMESPACE
+# define QT_USE_NAMESPACE
+# define QT_BEGIN_INCLUDE_NAMESPACE
+# define QT_END_INCLUDE_NAMESPACE
+
+#endif /* __cplusplus */
+
+/* ### Qt 6.9 (or later): remove *_MOC_* macros (moc does not need them since 6.5) */
+#ifndef QT_BEGIN_MOC_NAMESPACE
+# define QT_BEGIN_MOC_NAMESPACE QT_USE_NAMESPACE
+#endif
+#ifndef QT_END_MOC_NAMESPACE
+# define QT_END_MOC_NAMESPACE
+#endif
+
+/*
+ Strict mode
+*/
+#ifdef QT_ENABLE_STRICT_MODE_UP_TO
+#ifndef QT_DISABLE_DEPRECATED_UP_TO
+# define QT_DISABLE_DEPRECATED_UP_TO QT_ENABLE_STRICT_MODE_UP_TO
+#endif
+
+#if QT_ENABLE_STRICT_MODE_UP_TO >= QT_VERSION_CHECK(6, 0, 0)
+# define QT_NO_FOREACH
+# define QT_NO_CAST_FROM_ASCII
+# define QT_NO_CAST_TO_ASCII
+# define QT_NO_CAST_FROM_BYTEARRAY
+# define QT_NO_URL_CAST_FROM_STRING
+# define QT_NO_NARROWING_CONVERSIONS_IN_CONNECT
+# define QT_NO_JAVA_STYLE_ITERATORS
+#endif // 6.0.0
+
+#if QT_ENABLE_STRICT_MODE_UP_TO >= QT_VERSION_CHECK(6, 6, 0)
+# define QT_NO_QEXCHANGE
+#endif // 6.6.0
+
+#if QT_ENABLE_STRICT_MODE_UP_TO >= QT_VERSION_CHECK(6, 7, 0)
+# define QT_NO_CONTEXTLESS_CONNECT
+#endif // 6.7.0
+
+#if QT_ENABLE_STRICT_MODE_UP_TO >= QT_VERSION_CHECK(6, 8, 0)
+# define QT_NO_QASCONST
+# if !defined(QT_USE_NODISCARD_FILE_OPEN) && !defined(QT_NO_USE_NODISCARD_FILE_OPEN)
+# define QT_USE_NODISCARD_FILE_OPEN
+# endif
+#endif // 6.8.0
+#endif // QT_ENABLE_STRICT_MODE_UP_TO
+
+#endif /* QTCONFIGMACROS_H */
diff --git a/src/corelib/global/qtdeprecationmarkers.h b/src/corelib/global/qtdeprecationmarkers.h
new file mode 100644
index 0000000000..6df5ebce6d
--- /dev/null
+++ b/src/corelib/global/qtdeprecationmarkers.h
@@ -0,0 +1,347 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QTDEPRECATIONMARKERS_H
+#define QTDEPRECATIONMARKERS_H
+
+#include <QtCore/qtconfigmacros.h>
+#include <QtCore/qtversionchecks.h>
+#include <QtCore/qcompilerdetection.h> // for Q_DECL_DEPRECATED
+
+#if 0
+#pragma qt_class(QtDeprecationMarkers)
+#pragma qt_sync_stop_processing
+#endif
+
+QT_BEGIN_NAMESPACE
+
+#if defined(QT_NO_DEPRECATED)
+# undef QT_DEPRECATED
+# undef QT_DEPRECATED_X
+# undef QT_DEPRECATED_VARIABLE
+# undef QT_DEPRECATED_CONSTRUCTOR
+#elif !defined(QT_NO_DEPRECATED_WARNINGS)
+# undef QT_DEPRECATED
+# define QT_DEPRECATED Q_DECL_DEPRECATED
+# undef QT_DEPRECATED_X
+# define QT_DEPRECATED_X(text) Q_DECL_DEPRECATED_X(text)
+# undef QT_DEPRECATED_VARIABLE
+# define QT_DEPRECATED_VARIABLE Q_DECL_VARIABLE_DEPRECATED
+# undef QT_DEPRECATED_CONSTRUCTOR
+# define QT_DEPRECATED_CONSTRUCTOR Q_DECL_CONSTRUCTOR_DEPRECATED explicit
+#else
+# undef QT_DEPRECATED
+# define QT_DEPRECATED
+# undef QT_DEPRECATED_X
+# define QT_DEPRECATED_X(text)
+# undef QT_DEPRECATED_VARIABLE
+# define QT_DEPRECATED_VARIABLE
+# undef QT_DEPRECATED_CONSTRUCTOR
+# define QT_DEPRECATED_CONSTRUCTOR
+# undef Q_DECL_ENUMERATOR_DEPRECATED
+# define Q_DECL_ENUMERATOR_DEPRECATED
+# undef Q_DECL_ENUMERATOR_DEPRECATED_X
+# define Q_DECL_ENUMERATOR_DEPRECATED_X(ignored)
+#endif
+
+// If the deprecated macro is defined, use its value
+#if !defined(QT_DISABLE_DEPRECATED_UP_TO) && defined(QT_DISABLE_DEPRECATED_BEFORE)
+# define QT_DISABLE_DEPRECATED_UP_TO QT_DISABLE_DEPRECATED_BEFORE
+#endif
+
+// If the deprecated macro is defined, use its value
+#if !defined(QT_WARN_DEPRECATED_UP_TO) && defined(QT_DEPRECATED_WARNINGS_SINCE)
+# define QT_WARN_DEPRECATED_UP_TO QT_DEPRECATED_WARNINGS_SINCE
+#endif
+
+#ifndef QT_WARN_DEPRECATED_UP_TO
+# ifdef QT_DISABLE_DEPRECATED_UP_TO
+# define QT_WARN_DEPRECATED_UP_TO QT_DISABLE_DEPRECATED_UP_TO
+# else
+# define QT_WARN_DEPRECATED_UP_TO QT_VERSION
+# endif
+#endif
+
+#ifndef QT_DISABLE_DEPRECATED_UP_TO
+#define QT_DISABLE_DEPRECATED_UP_TO QT_VERSION_CHECK(5, 0, 0)
+#endif
+
+/*
+ QT_DEPRECATED_SINCE(major, minor) evaluates as true if the Qt version is greater than
+ the deprecation point specified.
+
+ Use it to specify from which version of Qt a function or class has been deprecated
+
+ Example:
+ #if QT_DEPRECATED_SINCE(5,1)
+ QT_DEPRECATED void deprecatedFunction(); //function deprecated since Qt 5.1
+ #endif
+
+*/
+#ifdef QT_DEPRECATED
+#define QT_DEPRECATED_SINCE(major, minor) (QT_VERSION_CHECK(major, minor, 0) > QT_DISABLE_DEPRECATED_UP_TO)
+#else
+#define QT_DEPRECATED_SINCE(major, minor) 0
+#endif
+
+/*
+ QT_DEPRECATED_VERSION(major, minor) and QT_DEPRECATED_VERSION_X(major, minor, text)
+ outputs a deprecation warning if QT_WARN_DEPRECATED_UP_TO is equal to or greater
+ than the version specified as major, minor. This makes it possible to deprecate a
+ function without annoying a user who needs to stay compatible with a specified minimum
+ version and therefore can't use the new function.
+*/
+#if QT_WARN_DEPRECATED_UP_TO >= QT_VERSION_CHECK(5, 12, 0)
+# define QT_DEPRECATED_VERSION_X_5_12(text) QT_DEPRECATED_X(text)
+# define QT_DEPRECATED_VERSION_5_12 QT_DEPRECATED
+#else
+# define QT_DEPRECATED_VERSION_X_5_12(text)
+# define QT_DEPRECATED_VERSION_5_12
+#endif
+
+#if QT_WARN_DEPRECATED_UP_TO >= QT_VERSION_CHECK(5, 13, 0)
+# define QT_DEPRECATED_VERSION_X_5_13(text) QT_DEPRECATED_X(text)
+# define QT_DEPRECATED_VERSION_5_13 QT_DEPRECATED
+#else
+# define QT_DEPRECATED_VERSION_X_5_13(text)
+# define QT_DEPRECATED_VERSION_5_13
+#endif
+
+#if QT_WARN_DEPRECATED_UP_TO >= QT_VERSION_CHECK(5, 14, 0)
+# define QT_DEPRECATED_VERSION_X_5_14(text) QT_DEPRECATED_X(text)
+# define QT_DEPRECATED_VERSION_5_14 QT_DEPRECATED
+#else
+# define QT_DEPRECATED_VERSION_X_5_14(text)
+# define QT_DEPRECATED_VERSION_5_14
+#endif
+
+#if QT_WARN_DEPRECATED_UP_TO >= QT_VERSION_CHECK(5, 15, 0)
+# define QT_DEPRECATED_VERSION_X_5_15(text) QT_DEPRECATED_X(text)
+# define QT_DEPRECATED_VERSION_5_15 QT_DEPRECATED
+#else
+# define QT_DEPRECATED_VERSION_X_5_15(text)
+# define QT_DEPRECATED_VERSION_5_15
+#endif
+
+#if QT_WARN_DEPRECATED_UP_TO >= QT_VERSION_CHECK(6, 0, 0)
+# define QT_DEPRECATED_VERSION_X_6_0(text) QT_DEPRECATED_X(text)
+# define QT_DEPRECATED_VERSION_6_0 QT_DEPRECATED
+#else
+# define QT_DEPRECATED_VERSION_X_6_0(text)
+# define QT_DEPRECATED_VERSION_6_0
+#endif
+
+#if QT_WARN_DEPRECATED_UP_TO >= QT_VERSION_CHECK(6, 1, 0)
+# define QT_DEPRECATED_VERSION_X_6_1(text) QT_DEPRECATED_X(text)
+# define QT_DEPRECATED_VERSION_6_1 QT_DEPRECATED
+#else
+# define QT_DEPRECATED_VERSION_X_6_1(text)
+# define QT_DEPRECATED_VERSION_6_1
+#endif
+
+#if QT_WARN_DEPRECATED_UP_TO >= QT_VERSION_CHECK(6, 2, 0)
+# define QT_DEPRECATED_VERSION_X_6_2(text) QT_DEPRECATED_X(text)
+# define QT_DEPRECATED_VERSION_6_2 QT_DEPRECATED
+#else
+# define QT_DEPRECATED_VERSION_X_6_2(text)
+# define QT_DEPRECATED_VERSION_6_2
+#endif
+
+#if QT_WARN_DEPRECATED_UP_TO >= QT_VERSION_CHECK(6, 3, 0)
+# define QT_DEPRECATED_VERSION_X_6_3(text) QT_DEPRECATED_X(text)
+# define QT_DEPRECATED_VERSION_6_3 QT_DEPRECATED
+#else
+# define QT_DEPRECATED_VERSION_X_6_3(text)
+# define QT_DEPRECATED_VERSION_6_3
+#endif
+
+#if QT_WARN_DEPRECATED_UP_TO >= QT_VERSION_CHECK(6, 4, 0)
+# define QT_DEPRECATED_VERSION_X_6_4(text) QT_DEPRECATED_X(text)
+# define QT_DEPRECATED_VERSION_6_4 QT_DEPRECATED
+#else
+# define QT_DEPRECATED_VERSION_X_6_4(text)
+# define QT_DEPRECATED_VERSION_6_4
+#endif
+
+#if QT_WARN_DEPRECATED_UP_TO >= QT_VERSION_CHECK(6, 5, 0)
+# define QT_DEPRECATED_VERSION_X_6_5(text) QT_DEPRECATED_X(text)
+# define QT_DEPRECATED_VERSION_6_5 QT_DEPRECATED
+#else
+# define QT_DEPRECATED_VERSION_X_6_5(text)
+# define QT_DEPRECATED_VERSION_6_5
+#endif
+
+#if QT_WARN_DEPRECATED_UP_TO >= QT_VERSION_CHECK(6, 6, 0)
+# define QT_DEPRECATED_VERSION_X_6_6(text) QT_DEPRECATED_X(text)
+# define QT_DEPRECATED_VERSION_6_6 QT_DEPRECATED
+#else
+# define QT_DEPRECATED_VERSION_X_6_6(text)
+# define QT_DEPRECATED_VERSION_6_6
+#endif
+
+#if QT_WARN_DEPRECATED_UP_TO >= QT_VERSION_CHECK(6, 7, 0)
+# define QT_DEPRECATED_VERSION_X_6_7(text) QT_DEPRECATED_X(text)
+# define QT_DEPRECATED_VERSION_6_7 QT_DEPRECATED
+#else
+# define QT_DEPRECATED_VERSION_X_6_7(text)
+# define QT_DEPRECATED_VERSION_6_7
+#endif
+
+#if QT_WARN_DEPRECATED_UP_TO >= QT_VERSION_CHECK(6, 8, 0)
+# define QT_DEPRECATED_VERSION_X_6_8(text) QT_DEPRECATED_X(text)
+# define QT_DEPRECATED_VERSION_6_8 QT_DEPRECATED
+#else
+# define QT_DEPRECATED_VERSION_X_6_8(text)
+# define QT_DEPRECATED_VERSION_6_8
+#endif
+
+#if QT_WARN_DEPRECATED_UP_TO >= QT_VERSION_CHECK(6, 9, 0)
+# define QT_DEPRECATED_VERSION_X_6_9(text) QT_DEPRECATED_X(text)
+# define QT_DEPRECATED_VERSION_6_9 QT_DEPRECATED
+#else
+# define QT_DEPRECATED_VERSION_X_6_9(text)
+# define QT_DEPRECATED_VERSION_6_9
+#endif
+
+#if QT_WARN_DEPRECATED_UP_TO >= QT_VERSION_CHECK(6, 10, 0)
+# define QT_DEPRECATED_VERSION_X_6_10(text) QT_DEPRECATED_X(text)
+# define QT_DEPRECATED_VERSION_6_10 QT_DEPRECATED
+#else
+# define QT_DEPRECATED_VERSION_X_6_10(text)
+# define QT_DEPRECATED_VERSION_6_10
+#endif
+
+#if QT_WARN_DEPRECATED_UP_TO >= QT_VERSION_CHECK(6, 11, 0)
+# define QT_DEPRECATED_VERSION_X_6_11(text) QT_DEPRECATED_X(text)
+# define QT_DEPRECATED_VERSION_6_11 QT_DEPRECATED
+#else
+# define QT_DEPRECATED_VERSION_X_6_11(text)
+# define QT_DEPRECATED_VERSION_6_11
+#endif
+
+#define QT_DEPRECATED_VERSION_X_5(minor, text) QT_DEPRECATED_VERSION_X_5_##minor(text)
+#define QT_DEPRECATED_VERSION_X(major, minor, text) QT_DEPRECATED_VERSION_X_##major##_##minor(text)
+
+#define QT_DEPRECATED_VERSION_5(minor) QT_DEPRECATED_VERSION_5_##minor
+#define QT_DEPRECATED_VERSION(major, minor) QT_DEPRECATED_VERSION_##major##_##minor
+
+/*
+ QT_IF_DEPRECATED_SINCE(major, minor, whenTrue, whenFalse) expands to
+ \a whenTrue if the specified (\a major, \a minor) version is less than or
+ equal to the deprecation version defined by QT_DISABLE_DEPRECATED_UP_TO,
+ and to \a whenFalse otherwise.
+
+ Currently used for QT_INLINE_SINCE(maj, min), but can also be helpful for
+ other macros of that kind.
+
+ The implementation uses QT_DEPRECATED_SINCE(maj, min) to define a bunch of
+ helper QT_IF_DEPRECATED_SINCE_X_Y macros, which expand to \a whenTrue or
+ \a whenFalse depending on the value of QT_DEPRECATED_SINCE.
+
+ If you need to use QT_IF_DEPRECATED_SINCE() for a (major, minor) version,
+ that is not yet covered by the list below, you need to copy the definition
+ and change the major and minor versions accordingly. For example, for
+ version (X, Y), you will need to add
+
+ \code
+ #if QT_DEPRECATED_SINCE(X, Y)
+ # define QT_IF_DEPRECATED_SINCE_X_Y(whenTrue, whenFalse) whenFalse
+ #else
+ # define QT_IF_DEPRECATED_SINCE_X_Y(whenTrue, whenFalse) whenTrue
+ #endif
+ \endcode
+*/
+
+#define QT_IF_DEPRECATED_SINCE(major, minor, whenTrue, whenFalse) \
+ QT_IF_DEPRECATED_SINCE_ ## major ## _ ## minor(whenTrue, whenFalse)
+
+#if QT_DEPRECATED_SINCE(6, 0)
+# define QT_IF_DEPRECATED_SINCE_6_0(whenTrue, whenFalse) whenFalse
+#else
+# define QT_IF_DEPRECATED_SINCE_6_0(whenTrue, whenFalse) whenTrue
+#endif
+
+#if QT_DEPRECATED_SINCE(6, 1)
+# define QT_IF_DEPRECATED_SINCE_6_1(whenTrue, whenFalse) whenFalse
+#else
+# define QT_IF_DEPRECATED_SINCE_6_1(whenTrue, whenFalse) whenTrue
+#endif
+
+#if QT_DEPRECATED_SINCE(6, 2)
+# define QT_IF_DEPRECATED_SINCE_6_2(whenTrue, whenFalse) whenFalse
+#else
+# define QT_IF_DEPRECATED_SINCE_6_2(whenTrue, whenFalse) whenTrue
+#endif
+
+#if QT_DEPRECATED_SINCE(6, 3)
+# define QT_IF_DEPRECATED_SINCE_6_3(whenTrue, whenFalse) whenFalse
+#else
+# define QT_IF_DEPRECATED_SINCE_6_3(whenTrue, whenFalse) whenTrue
+#endif
+
+#if QT_DEPRECATED_SINCE(6, 4)
+# define QT_IF_DEPRECATED_SINCE_6_4(whenTrue, whenFalse) whenFalse
+#else
+# define QT_IF_DEPRECATED_SINCE_6_4(whenTrue, whenFalse) whenTrue
+#endif
+
+#if QT_DEPRECATED_SINCE(6, 5)
+# define QT_IF_DEPRECATED_SINCE_6_5(whenTrue, whenFalse) whenFalse
+#else
+# define QT_IF_DEPRECATED_SINCE_6_5(whenTrue, whenFalse) whenTrue
+#endif
+
+#if QT_DEPRECATED_SINCE(6, 6)
+# define QT_IF_DEPRECATED_SINCE_6_6(whenTrue, whenFalse) whenFalse
+#else
+# define QT_IF_DEPRECATED_SINCE_6_6(whenTrue, whenFalse) whenTrue
+#endif
+
+#if QT_DEPRECATED_SINCE(6, 7)
+# define QT_IF_DEPRECATED_SINCE_6_7(whenTrue, whenFalse) whenFalse
+#else
+# define QT_IF_DEPRECATED_SINCE_6_7(whenTrue, whenFalse) whenTrue
+#endif
+
+#if QT_DEPRECATED_SINCE(6, 8)
+# define QT_IF_DEPRECATED_SINCE_6_8(whenTrue, whenFalse) whenFalse
+#else
+# define QT_IF_DEPRECATED_SINCE_6_8(whenTrue, whenFalse) whenTrue
+#endif
+
+#if QT_DEPRECATED_SINCE(6, 9)
+# define QT_IF_DEPRECATED_SINCE_6_9(whenTrue, whenFalse) whenFalse
+#else
+# define QT_IF_DEPRECATED_SINCE_6_9(whenTrue, whenFalse) whenTrue
+#endif
+
+#if QT_DEPRECATED_SINCE(6, 10)
+# define QT_IF_DEPRECATED_SINCE_6_10(whenTrue, whenFalse) whenFalse
+#else
+# define QT_IF_DEPRECATED_SINCE_6_10(whenTrue, whenFalse) whenTrue
+#endif
+
+#if QT_DEPRECATED_SINCE(6, 11)
+# define QT_IF_DEPRECATED_SINCE_6_11(whenTrue, whenFalse) whenFalse
+#else
+# define QT_IF_DEPRECATED_SINCE_6_11(whenTrue, whenFalse) whenTrue
+#endif
+
+#ifdef __cplusplus
+// A tag to help mark stuff deprecated (cf. QStringViewLiteral)
+namespace QtPrivate {
+enum class Deprecated_t {};
+constexpr inline Deprecated_t Deprecated = {};
+}
+#endif
+
+#ifdef QT_ASCII_CAST_WARNINGS
+# define QT_ASCII_CAST_WARN \
+ Q_DECL_DEPRECATED_X("Use fromUtf8, QStringLiteral, or QLatin1StringView")
+#else
+# define QT_ASCII_CAST_WARN
+#endif
+
+QT_END_NAMESPACE
+
+#endif // QTDEPRECATIONMARKERS_H
diff --git a/src/corelib/global/qtdeprecationmarkers.qdoc b/src/corelib/global/qtdeprecationmarkers.qdoc
new file mode 100644
index 0000000000..2dd572533e
--- /dev/null
+++ b/src/corelib/global/qtdeprecationmarkers.qdoc
@@ -0,0 +1,64 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
+
+/*!
+ \headerfile <QtDeprecationMarkers>
+ \inmodule QtCore
+ \title Qt Deprecation Macros
+
+ \brief The <QtDeprecationMarkers> header file contains deprecation helper macros.
+
+ The header file declares several macros for disabling deprecated Qt APIs
+ and enabling/disabling compiler warnings when they are used.
+*/
+
+/*!
+ \macro QT_DISABLE_DEPRECATED_BEFORE
+ \relates <QtDeprecationMarkers>
+ \deprecated [6.5] Use QT_DISABLE_DEPRECATED_UP_TO instead
+
+ \sa QT_DISABLE_DEPRECATED_UP_TO
+*/
+
+/*!
+ \macro QT_DISABLE_DEPRECATED_UP_TO
+ \relates <QtDeprecationMarkers>
+
+ This macro can be defined in the project file to disable functions
+ deprecated in a specified version of Qt or any earlier version. The default
+ version number is 5.0, meaning that functions deprecated in or before
+ Qt 5.0 will not be included.
+
+ For instance, when preparing to upgrade to Qt 6.3, after eliminating all
+ deprecation warnings, you can set \c{QT_DISABLE_DEPRECATED_UP_TO=0x060300}
+ to exclude from your builds the Qt APIs you no longer use. In your own
+ project's build configuration, this will ensure that anyone adding new calls
+ to the deprecated APIs will know about it right away. If you also build Qt
+ for yourself, including this define in your build configuration for Qt will
+ make your binaries smaller by leaving out even the implementation of the
+ deprecated APIs.
+
+ \sa QT_DEPRECATED_WARNINGS, QT_DISABLE_DEPRECATED_UP_TO
+*/
+
+/*!
+ \macro QT_DEPRECATED_WARNINGS
+ \relates <QtDeprecationMarkers>
+
+ Since Qt 5.13, this macro has no effect. In Qt 5.12 and before, if this macro
+ is defined, the compiler will generate warnings if any API declared as
+ deprecated by Qt is used.
+
+ \sa QT_DISABLE_DEPRECATED_UP_TO, QT_NO_DEPRECATED_WARNINGS
+*/
+
+/*!
+ \macro QT_NO_DEPRECATED_WARNINGS
+ \relates <QtDeprecationMarkers>
+ \since 5.13
+
+ This macro can be used to suppress deprecation warnings that would otherwise
+ be generated when using deprecated APIs.
+
+ \sa QT_DISABLE_DEPRECATED_UP_TO
+*/
diff --git a/src/corelib/global/qtenvironmentvariables.cpp b/src/corelib/global/qtenvironmentvariables.cpp
new file mode 100644
index 0000000000..cf5955902a
--- /dev/null
+++ b/src/corelib/global/qtenvironmentvariables.cpp
@@ -0,0 +1,429 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#include "qtenvironmentvariables.h"
+#include "qtenvironmentvariables_p.h"
+
+#include <qplatformdefs.h>
+#include <QtCore/qbytearray.h>
+#include <QtCore/qmutex.h>
+#include <QtCore/qstring.h>
+#include <QtCore/qvarlengtharray.h>
+
+#include <QtCore/private/qlocking_p.h>
+
+QT_BEGIN_NAMESPACE
+
+// In the C runtime on all platforms access to the environment is not thread-safe. We
+// add thread-safety for the Qt wrappers.
+Q_CONSTINIT static QBasicMutex environmentMutex;
+
+/*!
+ \relates <QtEnvironmentVariables>
+ \threadsafe
+
+ Returns the value of the environment variable with name \a varName as a
+ QByteArray. If no variable by that name is found in the environment, this
+ function returns a default-constructed QByteArray.
+
+ The Qt environment manipulation functions are thread-safe, but this
+ requires that the C library equivalent functions like getenv and putenv are
+ not directly called.
+
+ To convert the data to a QString use QString::fromLocal8Bit().
+
+ \note on desktop Windows, qgetenv() may produce data loss if the
+ original string contains Unicode characters not representable in the
+ ANSI encoding. Use qEnvironmentVariable() instead.
+ On Unix systems, this function is lossless.
+
+ \sa qputenv(), qEnvironmentVariable(), qEnvironmentVariableIsSet(),
+ qEnvironmentVariableIsEmpty()
+*/
+QByteArray qgetenv(const char *varName)
+{
+ const auto locker = qt_scoped_lock(environmentMutex);
+#ifdef Q_CC_MSVC
+ size_t requiredSize = 0;
+ QByteArray buffer;
+ getenv_s(&requiredSize, 0, 0, varName);
+ if (requiredSize == 0)
+ return buffer;
+ buffer.resize(qsizetype(requiredSize));
+ getenv_s(&requiredSize, buffer.data(), requiredSize, varName);
+ // requiredSize includes the terminating null, which we don't want.
+ Q_ASSERT(buffer.endsWith('\0'));
+ buffer.chop(1);
+ return buffer;
+#else
+ return QByteArray(::getenv(varName));
+#endif
+}
+
+/*!
+ \fn QString qEnvironmentVariable(const char *varName, const QString &defaultValue)
+ \fn QString qEnvironmentVariable(const char *varName)
+
+ \relates <QtEnvironmentVariables>
+ \since 5.10
+
+ These functions return the value of the environment variable, \a varName, as a
+ QString. If no variable \a varName is found in the environment and \a defaultValue
+ is provided, \a defaultValue is returned. Otherwise QString() is returned.
+
+ The Qt environment manipulation functions are thread-safe, but this
+ requires that the C library equivalent functions like getenv and putenv are
+ not directly called.
+
+ The following table describes how to choose between qgetenv() and
+ qEnvironmentVariable():
+ \table
+ \header \li Condition \li Recommendation
+ \row
+ \li Variable contains file paths or user text
+ \li qEnvironmentVariable()
+ \row
+ \li Windows-specific code
+ \li qEnvironmentVariable()
+ \row
+ \li Unix-specific code, destination variable is not QString and/or is
+ used to interface with non-Qt APIs
+ \li qgetenv()
+ \row
+ \li Destination variable is a QString
+ \li qEnvironmentVariable()
+ \row
+ \li Destination variable is a QByteArray or std::string
+ \li qgetenv()
+ \endtable
+
+ \note on Unix systems, this function may produce data loss if the original
+ string contains arbitrary binary data that cannot be decoded by the locale
+ codec. Use qgetenv() instead for that case. On Windows, this function is
+ lossless.
+
+ \note the variable name \a varName must contain only US-ASCII characters.
+
+ \sa qputenv(), qgetenv(), qEnvironmentVariableIsSet(), qEnvironmentVariableIsEmpty()
+*/
+QString qEnvironmentVariable(const char *varName, const QString &defaultValue)
+{
+#if defined(Q_OS_WIN)
+ QVarLengthArray<wchar_t, 32> wname(qsizetype(strlen(varName)) + 1);
+ for (qsizetype i = 0; i < wname.size(); ++i) // wname.size() is correct: will copy terminating null
+ wname[i] = uchar(varName[i]);
+ size_t requiredSize = 0;
+ auto locker = qt_unique_lock(environmentMutex);
+ _wgetenv_s(&requiredSize, 0, 0, wname.data());
+ if (requiredSize == 0)
+ return defaultValue;
+ QString buffer(qsizetype(requiredSize), Qt::Uninitialized);
+ _wgetenv_s(&requiredSize, reinterpret_cast<wchar_t *>(buffer.data()), requiredSize,
+ wname.data());
+ locker.unlock();
+ // requiredSize includes the terminating null, which we don't want.
+ Q_ASSERT(buffer.endsWith(QChar(u'\0')));
+ buffer.chop(1);
+ return buffer;
+#else
+ QByteArray value = qgetenv(varName);
+ if (value.isNull())
+ return defaultValue;
+// duplicated in qfile.h (QFile::decodeName)
+#if defined(Q_OS_DARWIN)
+ return QString::fromUtf8(value).normalized(QString::NormalizationForm_C);
+#else // other Unix
+ return QString::fromLocal8Bit(value);
+#endif
+#endif
+}
+
+QString qEnvironmentVariable(const char *varName)
+{
+ return qEnvironmentVariable(varName, QString());
+}
+
+/*!
+ \relates <QtEnvironmentVariables>
+ \since 5.1
+
+ Returns whether the environment variable \a varName is empty.
+
+ Equivalent to
+ \snippet code/src_corelib_global_qglobal.cpp is-empty
+ except that it's potentially much faster, and can't throw exceptions.
+
+ \sa qgetenv(), qEnvironmentVariable(), qEnvironmentVariableIsSet()
+*/
+bool qEnvironmentVariableIsEmpty(const char *varName) noexcept
+{
+ const auto locker = qt_scoped_lock(environmentMutex);
+#ifdef Q_CC_MSVC
+ // we provide a buffer that can only hold the empty string, so
+ // when the env.var isn't empty, we'll get an ERANGE error (buffer
+ // too small):
+ size_t dummy;
+ char buffer = '\0';
+ return getenv_s(&dummy, &buffer, 1, varName) != ERANGE;
+#else
+ const char * const value = ::getenv(varName);
+ return !value || !*value;
+#endif
+}
+
+/*!
+ \relates <QtEnvironmentVariables>
+ \since 5.5
+
+ Returns the numerical value of the environment variable \a varName.
+ If \a ok is not null, sets \c{*ok} to \c true or \c false depending
+ on the success of the conversion.
+
+ Equivalent to
+ \snippet code/src_corelib_global_qglobal.cpp to-int
+ except that it's much faster, and can't throw exceptions.
+
+ \note there's a limit on the length of the value, which is sufficient for
+ all valid values of int, not counting leading zeroes or spaces. Values that
+ are too long will either be truncated or this function will set \a ok to \c
+ false.
+
+ \sa qgetenv(), qEnvironmentVariable(), qEnvironmentVariableIsSet()
+*/
+int qEnvironmentVariableIntValue(const char *varName, bool *ok) noexcept
+{
+ static const int NumBinaryDigitsPerOctalDigit = 3;
+ static const int MaxDigitsForOctalInt =
+ (std::numeric_limits<uint>::digits + NumBinaryDigitsPerOctalDigit - 1) / NumBinaryDigitsPerOctalDigit;
+
+ const auto locker = qt_scoped_lock(environmentMutex);
+ size_t size;
+#ifdef Q_CC_MSVC
+ // we provide a buffer that can hold any int value:
+ char buffer[MaxDigitsForOctalInt + 2]; // +1 for NUL +1 for optional '-'
+ size_t dummy;
+ if (getenv_s(&dummy, buffer, sizeof buffer, varName) != 0) {
+ if (ok)
+ *ok = false;
+ return 0;
+ }
+ size = strlen(buffer);
+#else
+ const char * const buffer = ::getenv(varName);
+ if (!buffer || (size = strlen(buffer)) > MaxDigitsForOctalInt + 2) {
+ if (ok)
+ *ok = false;
+ return 0;
+ }
+#endif
+ return QByteArrayView(buffer, size).toInt(ok, 0);
+}
+
+/*!
+ \relates <QtEnvironmentVariables>
+ \since 5.1
+
+ Returns whether the environment variable \a varName is set.
+
+ Equivalent to
+ \snippet code/src_corelib_global_qglobal.cpp is-null
+ except that it's potentially much faster, and can't throw exceptions.
+
+ \sa qgetenv(), qEnvironmentVariable(), qEnvironmentVariableIsEmpty()
+*/
+bool qEnvironmentVariableIsSet(const char *varName) noexcept
+{
+ const auto locker = qt_scoped_lock(environmentMutex);
+#ifdef Q_CC_MSVC
+ size_t requiredSize = 0;
+ (void)getenv_s(&requiredSize, 0, 0, varName);
+ return requiredSize != 0;
+#else
+ return ::getenv(varName) != nullptr;
+#endif
+}
+
+/*!
+ \fn bool qputenv(const char *varName, QByteArrayView value)
+ \relates <QtEnvironmentVariables>
+
+ This function sets the \a value of the environment variable named
+ \a varName. It will create the variable if it does not exist. It
+ returns 0 if the variable could not be set.
+
+ Calling qputenv with an empty value removes the environment variable on
+ Windows, and makes it set (but empty) on Unix. Prefer using qunsetenv()
+ for fully portable behavior.
+
+ \note qputenv() was introduced because putenv() from the standard
+ C library was deprecated in VC2005 (and later versions). qputenv()
+ uses the replacement function in VC, and calls the standard C
+ library's implementation on all other platforms.
+
+ \note In Qt versions prior to 6.5, the \a value argument was QByteArray,
+ not QByteArrayView.
+
+ \sa qgetenv(), qEnvironmentVariable()
+*/
+bool qputenv(const char *varName, QByteArrayView raw)
+{
+ auto protect = [](const char *str) { return str ? str : ""; };
+
+ std::string value{protect(raw.data()), size_t(raw.size())}; // NUL-terminates w/SSO
+
+#if defined(Q_CC_MSVC)
+ const auto locker = qt_scoped_lock(environmentMutex);
+ return _putenv_s(varName, value.data()) == 0;
+#elif (defined(_POSIX_VERSION) && (_POSIX_VERSION-0) >= 200112L) || defined(Q_OS_HAIKU)
+ // POSIX.1-2001 has setenv
+ const auto locker = qt_scoped_lock(environmentMutex);
+ return setenv(varName, value.data(), true) == 0;
+#else
+ std::string buffer;
+ buffer += protect(varName);
+ buffer += '=';
+ buffer += value;
+ char *envVar = qstrdup(buffer.data());
+ int result = [&] {
+ const auto locker = qt_scoped_lock(environmentMutex);
+ return putenv(envVar);
+ }();
+ if (result != 0) // error. we have to delete the string.
+ delete[] envVar;
+ return result == 0;
+#endif
+}
+
+/*!
+ \relates <QtEnvironmentVariables>
+
+ This function deletes the variable \a varName from the environment.
+
+ Returns \c true on success.
+
+ \since 5.1
+
+ \sa qputenv(), qgetenv(), qEnvironmentVariable()
+*/
+bool qunsetenv(const char *varName)
+{
+#if defined(Q_CC_MSVC)
+ const auto locker = qt_scoped_lock(environmentMutex);
+ return _putenv_s(varName, "") == 0;
+#elif (defined(_POSIX_VERSION) && (_POSIX_VERSION-0) >= 200112L) || defined(Q_OS_BSD4) || defined(Q_OS_HAIKU)
+ // POSIX.1-2001, BSD and Haiku have unsetenv
+ const auto locker = qt_scoped_lock(environmentMutex);
+ return unsetenv(varName) == 0;
+#elif defined(Q_CC_MINGW)
+ // On mingw, putenv("var=") removes "var" from the environment
+ QByteArray buffer(varName);
+ buffer += '=';
+ const auto locker = qt_scoped_lock(environmentMutex);
+ return putenv(buffer.constData()) == 0;
+#else
+ // Fallback to putenv("var=") which will insert an empty var into the
+ // environment and leak it
+ QByteArray buffer(varName);
+ buffer += '=';
+ char *envVar = qstrdup(buffer.constData());
+ const auto locker = qt_scoped_lock(environmentMutex);
+ return putenv(envVar) == 0;
+#endif
+}
+
+/* Various time-related APIs that need to consult system settings also need
+ protection with the same lock as the environment, since those system settings
+ include part of the environment (principally TZ).
+
+ First, tzset(), which POSIX explicitly says accesses the environment.
+*/
+void qTzSet()
+{
+ const auto locker = qt_scoped_lock(environmentMutex);
+#if defined(Q_OS_WIN)
+ _tzset();
+#else
+ tzset();
+#endif // Q_OS_WIN
+}
+
+/* Wrap mktime(), which is specified to behave as if it called tzset(), hence
+ shares its implicit environment-dependence.
+*/
+time_t qMkTime(struct tm *when)
+{
+ const auto locker = qt_scoped_lock(environmentMutex);
+#if defined(Q_OS_WIN)
+ // QTBUG-83881 MS's mktime() seems to need _tzset() called first.
+ _tzset();
+#endif
+ return mktime(when);
+}
+
+/* For localtime(), POSIX mandates that it behave as if it called tzset().
+ For the alternatives to it, we need (if only for compatibility) to do the
+ same explicitly, which should ensure a re-parse of timezone info.
+*/
+bool qLocalTime(time_t utc, struct tm *local)
+{
+ const auto locker = qt_scoped_lock(environmentMutex);
+#if defined(Q_OS_WIN)
+ // The doc of localtime_s() says that it corrects for the same things
+ // _tzset() sets the globals for, but QTBUG-109974 reveals a need for an
+ // explicit call, all the same.
+ _tzset();
+ return !localtime_s(local, &utc);
+#elif QT_CONFIG(thread) && defined(_POSIX_THREAD_SAFE_FUNCTIONS)
+ // Use the reentrant version of localtime() where available, as it is
+ // thread-safe and doesn't use a shared static data area.
+ // As localtime_r() is not specified to work as if it called tzset(),
+ // make an explicit call.
+ tzset();
+ if (tm *res = localtime_r(&utc, local)) {
+ Q_ASSERT(res == local);
+ Q_UNUSED(res);
+ return true;
+ }
+ return false;
+#else
+ // POSIX mandates that localtime() behaves as if it called tzset().
+ // Returns shared static data which may be overwritten at any time (albeit
+ // our lock probably keeps it safe). So copy the result promptly:
+ if (tm *res = localtime(&utc)) {
+ *local = *res;
+ return true;
+ }
+ return false;
+#endif
+}
+
+/* Access to the tzname[] global in one thread is UB if any other is calling
+ tzset() or anything that behaves as if it called tzset(). So also lock this
+ access to prevent such collisions.
+
+ Parameter dstIndex must be 1 for DST or 0 for standard time.
+ Returns the relevant form of the name of local-time's zone.
+*/
+QString qTzName(int dstIndex)
+{
+ char name[512];
+ bool ok;
+#if defined(_UCRT) // i.e., MSVC and MinGW-UCRT
+ size_t s = 0;
+ {
+ const auto locker = qt_scoped_lock(environmentMutex);
+ ok = _get_tzname(&s, name, 512, dstIndex) != 0;
+ }
+#else
+ {
+ const auto locker = qt_scoped_lock(environmentMutex);
+ const char *const src = tzname[dstIndex];
+ ok = src != nullptr;
+ if (ok)
+ memcpy(name, src, std::min(sizeof(name), strlen(src) + 1));
+ }
+#endif // Q_OS_WIN
+ return ok ? QString::fromLocal8Bit(name) : QString();
+}
+
+QT_END_NAMESPACE
diff --git a/src/corelib/global/qtenvironmentvariables.h b/src/corelib/global/qtenvironmentvariables.h
new file mode 100644
index 0000000000..e7be182677
--- /dev/null
+++ b/src/corelib/global/qtenvironmentvariables.h
@@ -0,0 +1,38 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QTENVIRONMENTVARIABLES_H
+#define QTENVIRONMENTVARIABLES_H
+
+#include <QtCore/qtconfigmacros.h>
+#include <QtCore/qtcoreexports.h>
+#include <QtCore/qtdeprecationmarkers.h>
+
+#if 0
+#pragma qt_class(QtEnvironmentVariables)
+#pragma qt_sync_stop_processing
+#endif
+
+QT_BEGIN_NAMESPACE
+
+class QByteArray;
+class QByteArrayView;
+class QString;
+
+Q_CORE_EXPORT QByteArray qgetenv(const char *varName);
+// need it as two functions because QString is only forward-declared here
+Q_CORE_EXPORT QString qEnvironmentVariable(const char *varName);
+Q_CORE_EXPORT QString qEnvironmentVariable(const char *varName, const QString &defaultValue);
+#if QT_CORE_REMOVED_SINCE(6, 5)
+Q_CORE_EXPORT bool qputenv(const char *varName, const QByteArray &value);
+#endif
+Q_CORE_EXPORT bool qputenv(const char *varName, QByteArrayView value);
+Q_CORE_EXPORT bool qunsetenv(const char *varName);
+
+Q_CORE_EXPORT bool qEnvironmentVariableIsEmpty(const char *varName) noexcept;
+Q_CORE_EXPORT bool qEnvironmentVariableIsSet(const char *varName) noexcept;
+Q_CORE_EXPORT int qEnvironmentVariableIntValue(const char *varName, bool *ok=nullptr) noexcept;
+
+QT_END_NAMESPACE
+
+#endif /* QTENVIRONMENTVARIABLES_H */
diff --git a/src/corelib/global/qtenvironmentvariables_p.h b/src/corelib/global/qtenvironmentvariables_p.h
new file mode 100644
index 0000000000..0c81d36db6
--- /dev/null
+++ b/src/corelib/global/qtenvironmentvariables_p.h
@@ -0,0 +1,39 @@
+// Copyright (C) 2017 The Qt Company Ltd.
+// Copyright (C) 2015 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QTENVIRONMENTVARIABLES_P_H
+#define QTENVIRONMENTVARIABLES_P_H
+// Nothing but (tests and) ../time/qlocaltime.cpp should access this.
+#if defined(__cplusplus)
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an implementation
+// detail. This header file may change from version to version without notice,
+// or even be removed.
+//
+// We mean it.
+//
+
+#include "qglobal_p.h"
+
+#ifdef Q_CC_MINGW
+# include <unistd.h> // Define _POSIX_THREAD_SAFE_FUNCTIONS to obtain localtime_r()
+#endif
+#include <time.h>
+
+QT_BEGIN_NAMESPACE
+
+// These (behave as if they) consult the environment, so need to share its locking:
+Q_CORE_EXPORT void qTzSet();
+Q_CORE_EXPORT time_t qMkTime(struct tm *when);
+Q_CORE_EXPORT bool qLocalTime(time_t utc, struct tm *local);
+Q_CORE_EXPORT QString qTzName(int dstIndex);
+
+QT_END_NAMESPACE
+
+#endif // defined(__cplusplus)
+#endif // QTENVIRONMENTVARIABLES_P_H
diff --git a/src/corelib/global/qtnoop.h b/src/corelib/global/qtnoop.h
new file mode 100644
index 0000000000..c84e6c8a99
--- /dev/null
+++ b/src/corelib/global/qtnoop.h
@@ -0,0 +1,20 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QTNOOP_H
+#define QTNOOP_H
+
+#if 0
+#pragma qt_sync_stop_processing
+#endif
+
+#ifdef __cplusplus
+constexpr
+#endif
+inline void qt_noop(void)
+#ifdef __cplusplus
+ noexcept
+#endif
+{}
+
+#endif // QTNOOP_H
diff --git a/src/corelib/global/qtpreprocessorsupport.h b/src/corelib/global/qtpreprocessorsupport.h
new file mode 100644
index 0000000000..73bbeb68b6
--- /dev/null
+++ b/src/corelib/global/qtpreprocessorsupport.h
@@ -0,0 +1,26 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QTPREPROCESSORSUPPORT_H
+#define QTPREPROCESSORSUPPORT_H
+
+#if 0
+#pragma qt_class(QtPreprocessorSupport)
+#pragma qt_sync_stop_processing
+#endif
+
+/* These two macros makes it possible to turn the builtin line expander into a
+ * string literal. */
+#define QT_STRINGIFY2(x) #x
+#define QT_STRINGIFY(x) QT_STRINGIFY2(x)
+
+/*
+ Avoid "unused parameter" warnings
+*/
+#define Q_UNUSED(x) (void)x;
+
+#if !defined(Q_UNIMPLEMENTED)
+# define Q_UNIMPLEMENTED() qWarning("Unimplemented code.")
+#endif
+
+#endif // QTPREPROCESSORSUPPORT_H
diff --git a/src/corelib/global/qtpreprocessorsupport.qdoc b/src/corelib/global/qtpreprocessorsupport.qdoc
new file mode 100644
index 0000000000..c9fedf4ec1
--- /dev/null
+++ b/src/corelib/global/qtpreprocessorsupport.qdoc
@@ -0,0 +1,20 @@
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
+
+/*!
+ \macro Q_UNUSED(name)
+ \relates <QtPreprocessorSupport>
+
+ Indicates to the compiler that the parameter with the specified
+ \a name is not used in the body of a function. This can be used to
+ suppress compiler warnings while allowing functions to be defined
+ with meaningful parameter names in their signatures.
+*/
+
+/*!
+ \macro QT_STRINGIFY(arg)
+ \relates <QtPreprocessorSupport>
+
+ The macro can be used to turn the builtin line expander \a arg into a string
+ literal.
+*/
diff --git a/src/corelib/global/qtrace_p.h b/src/corelib/global/qtrace_p.h
index d9011c6066..f4e39ffe2b 100644
--- a/src/corelib/global/qtrace_p.h
+++ b/src/corelib/global/qtrace_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2017 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Rafael Roquetto <rafael.roquetto@kdab.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2017 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Rafael Roquetto <rafael.roquetto@kdab.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QTRACE_P_H
#define QTRACE_P_H
@@ -93,7 +57,7 @@
* qcoreapplication_qrect(const QRect &rect)
*
* The provider file is then parsed by src/tools/tracegen, which can be
- * switched to output either ETW or LTTNG tracepoint definitions. The provider
+ * switched to output either ETW, CTF or LTTNG tracepoint definitions. The provider
* name is deduced to be basename(provider_file).
*
* To use the above (inside qtcore), you need to include
@@ -111,12 +75,56 @@
* - QByteArray
* - QUrl
* - QRect
+ * - QRectF
+ * - QSize
+ * - QSizeF
*
* Dynamic arrays are supported using the syntax illustrated by
* qcoreapplication_baz above.
+ *
+ * One can also add prefix for the generated providername_tracepoints_p.h file
+ * by specifying it inside brackets '{ }' in the tracepoints file. One can
+ * for example add forward declaration for a type:
+ *
+ * {
+ * QT_BEGIN_NAMESPACE
+ * class QEvent;
+ * QT_END_NAMESPACE
+ * }
+ *
+ * Metadata
+ *
+ * Metadata is used to add textual information for different types such
+ * as enums and flags. How this data is handled depends on the used backend.
+ * For ETW, the values are converted to text, for CTF and LTTNG they are used to add
+ * CTF enumerations, which are converted to text after tracing.
+ *
+ * Enumererations are specified using ENUM:
+ *
+ * ENUM {
+ * Enum0 = 0,
+ * Enum1 = 1,
+ * Enum2,
+ * RANGE(RangeEnum, 3 ... 10),
+ * } Name;
+ *
+ * Name must match to one of the enumerations used in the tracepoints. Range of values
+ * can be provided using RANGE(name, first ... last). All values must be unique.
+ *
+ * Flags are specified using FLAGS:
+ *
+ * FLAGS {
+ * Default = 0,
+ * Flag0 = 1,
+ * Flag1 = 2,
+ * Flag2 = 4,
+ * } Name;
+ *
+ * Name must match to one of the flags used in the tracepoints. Each value must be
+ * power of two and unique.
*/
-#include <QtCore/qglobal.h>
+#include <QtCore/private/qglobal_p.h>
#include <QtCore/qscopeguard.h>
QT_BEGIN_NAMESPACE
@@ -140,6 +148,91 @@ QT_BEGIN_NAMESPACE
# define Q_TRACE_ENABLED(x) false
#endif // defined(Q_TRACEPOINT) && !defined(QT_BOOTSTRAPPED)
+
+/*
+ * The Qt tracepoints can also be defined directly in the source files using
+ * the following macros. If using these macros, the tracepoints file is automatically
+ * generated using the tracepointgen tool. The tool scans the input files for
+ * these macros. These macros are ignored during compile time. Both automatic
+ * generation and manually specifying tracepoints in a file can't be done at the same
+ * time for the same provider.
+ *
+ * - Q_TRACE_INSTRUMENT(provider)
+ * Generate entry/exit tracepoints for a function. For example, member function
+ *
+ * void SomeClass::method(int param1, float param2)
+ * {
+ * ...
+ * }
+ *
+ * converted to use tracepoints:
+ *
+ * void Q_TRACE_INSTRUMENT(provider) SomeClass::method(int param1, float param2)
+ * {
+ * Q_TRACE_SCOPE(SomeClass_method, param1, param2);
+ * ...
+ * }
+ *
+ * generates following tracepoints in provider.tracepoints file:
+ *
+ * SomeClass_method_entry(int param1, float param2)
+ * SomeClass_method_exit()
+ *
+ * - Q_TRACE_PARAM_REPLACE(in, out)
+ * Can be used with Q_TRACE_INSTRUMENT to replace parameter type in with type out.
+ * If a parameter type is not supported by the tracegen tool, one can use this to
+ * change it to another supported type.
+ *
+ * void Q_TRACE_INSTRUMENT(provider) SomeClass::method(int param1, UserType param2)
+ * {
+ * Q_TRACE_PARAM_REPLACE(UserType, QString);
+ * Q_TRACE_SCOPE(SomeClass_method, param1, param2.toQString());
+ * }
+ *
+ * - Q_TRACE_POINT(provider, tracepoint, ...)
+ * Manually specify tracepoint for the provider. 'tracepoint' is the full name
+ * of the tracepoint and ... can be zero or more parameters.
+ *
+ * Q_TRACE_POINT(provider, SomeClass_function_entry, int param1, int param2);
+ *
+ * generates following tracepoint:
+ *
+ * SomeClass_function_entry(int param1, int param2)
+ *
+ * - Q_TRACE_PREFIX(provider, prefix)
+ * Provide prefix for the tracepoint. Multiple prefixes can be specified for the same
+ * provider in different files, they are all concatenated into one in the
+ * provider.tracepoints file.
+ *
+ * Q_TRACE_PREFIX(provider,
+ * "QT_BEGIN_NAMESPACE" \
+ * "class QEvent;" \
+ * "QT_END_NAMESPACE")
+ *
+ * - Q_TRACE_METADATA(provider, metadata)
+ * Provides metadata for the tracepoint provider.
+ *
+ * Q_TRACE_METADATA(qtgui,
+ * "ENUM {" \
+ * "Format_Invalid," \
+ * "Format_Mono," \
+ * "Format_MonoLSB," \
+ * "Format_Indexed8," \
+ * ...
+ * "} QImage::Format;" \
+ * );
+ *
+ * If the content of enum is empty or contains keyword AUTO, then the tracepointgen tool
+ * tries to find the enumeration from header files.
+ *
+ * Q_TRACE_METADATA(qtcore, "ENUM { AUTO, RANGE User ... MaxUser } QEvent::Type;");
+ */
+#define Q_TRACE_INSTRUMENT(provider)
+#define Q_TRACE_PARAM_REPLACE(in, out)
+#define Q_TRACE_POINT(provider, tracepoint, ...)
+#define Q_TRACE_PREFIX(provider, prefix)
+#define Q_TRACE_METADATA(provider, metadata)
+
QT_END_NAMESPACE
#endif // QTRACE_P_H
diff --git a/src/corelib/global/qtresource.h b/src/corelib/global/qtresource.h
new file mode 100644
index 0000000000..535903aac0
--- /dev/null
+++ b/src/corelib/global/qtresource.h
@@ -0,0 +1,21 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QTRESOURCE_H
+#define QTRESOURCE_H
+
+#include <QtCore/qtconfigmacros.h>
+
+#if 0
+#pragma qt_class(QtResource)
+#pragma qt_sync_stop_processing
+#endif
+
+#define Q_INIT_RESOURCE(name) \
+ do { extern int QT_MANGLE_NAMESPACE(qInitResources_ ## name) (); \
+ QT_MANGLE_NAMESPACE(qInitResources_ ## name) (); } while (false)
+#define Q_CLEANUP_RESOURCE(name) \
+ do { extern int QT_MANGLE_NAMESPACE(qCleanupResources_ ## name) (); \
+ QT_MANGLE_NAMESPACE(qCleanupResources_ ## name) (); } while (false)
+
+#endif // QTRESOURCE_H
diff --git a/src/corelib/global/qtresource.qdoc b/src/corelib/global/qtresource.qdoc
new file mode 100644
index 0000000000..abc5265987
--- /dev/null
+++ b/src/corelib/global/qtresource.qdoc
@@ -0,0 +1,54 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
+
+/*!
+ \macro void Q_INIT_RESOURCE(name)
+ \relates <QtResource>
+
+ Initializes the resources specified by the \c .qrc file with the
+ specified base \a name. Normally, when resources are built as part
+ of the application, the resources are loaded automatically at
+ startup. The Q_INIT_RESOURCE() macro is necessary on some platforms
+ for resources stored in a static library.
+
+ For example, if your application's resources are listed in a file
+ called \c myapp.qrc, you can ensure that the resources are
+ initialized at startup by adding this line to your \c main()
+ function:
+
+ \snippet code/src_corelib_io_qdir.cpp 13
+
+ If the file name contains characters that cannot be part of a valid C++ function name
+ (such as '-'), they have to be replaced by the underscore character ('_').
+
+ \note This macro cannot be used in a namespace. It should be called from
+ main(). If that is not possible, the following workaround can be used
+ to init the resource \c myapp from the function \c{MyNamespace::myFunction}:
+
+ \snippet code/src_corelib_io_qdir.cpp 14
+
+ \sa Q_CLEANUP_RESOURCE(), {The Qt Resource System}
+*/
+
+/*!
+ \since 4.1
+ \macro void Q_CLEANUP_RESOURCE(name)
+ \relates <QtResource>
+
+ Unloads the resources specified by the \c .qrc file with the base
+ name \a name.
+
+ Normally, Qt resources are unloaded automatically when the
+ application terminates, but if the resources are located in a
+ plugin that is being unloaded, call Q_CLEANUP_RESOURCE() to force
+ removal of your resources.
+
+ \note This macro cannot be used in a namespace. Please see the
+ Q_INIT_RESOURCE documentation for a workaround.
+
+ Example:
+
+ \snippet code/src_corelib_io_qdir.cpp 15
+
+ \sa Q_INIT_RESOURCE(), {The Qt Resource System}
+*/
diff --git a/src/corelib/global/qtsymbolmacros.h b/src/corelib/global/qtsymbolmacros.h
new file mode 100644
index 0000000000..18cdc85f72
--- /dev/null
+++ b/src/corelib/global/qtsymbolmacros.h
@@ -0,0 +1,65 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QTSYMBOLMACROS_H
+#define QTSYMBOLMACROS_H
+
+#if 0
+# pragma qt_sync_stop_processing
+#endif
+
+// For GHS symbol keeping.
+#include <QtCore/qcompilerdetection.h>
+#include <QtCore/qtpreprocessorsupport.h>
+
+// For handling namespaced resources.
+#ifdef QT_NAMESPACE
+# define QT_RCC_MANGLE_NAMESPACE0(x) x
+# define QT_RCC_MANGLE_NAMESPACE1(a, b) a##_##b
+# define QT_RCC_MANGLE_NAMESPACE2(a, b) QT_RCC_MANGLE_NAMESPACE1(a,b)
+# define QT_RCC_MANGLE_NAMESPACE(name) QT_RCC_MANGLE_NAMESPACE2( \
+ QT_RCC_MANGLE_NAMESPACE0(name), QT_RCC_MANGLE_NAMESPACE0(QT_NAMESPACE))
+#else
+# define QT_RCC_MANGLE_NAMESPACE(name) name
+#endif
+
+// GHS needs special handling to keep a symbol around.
+#if defined(Q_CC_GHS)
+# define Q_GHS_KEEP_REFERENCE(S) QT_DO_PRAGMA(ghs reference S ##__Fv)
+#else
+# define Q_GHS_KEEP_REFERENCE(S)
+#endif
+
+// Macros to ensure a symbol is not dropped by the linker even if it's not used.
+#define QT_DECLARE_EXTERN_SYMBOL(NAME, RETURN_TYPE) \
+ extern RETURN_TYPE NAME(); \
+ Q_GHS_KEEP_REFERENCE(NAME)
+
+#define QT_DECLARE_EXTERN_SYMBOL_INT(NAME) \
+ QT_DECLARE_EXTERN_SYMBOL(NAME, int)
+
+#define QT_DECLARE_EXTERN_SYMBOL_VOID(NAME) \
+ QT_DECLARE_EXTERN_SYMBOL(NAME, void)
+
+#define QT_KEEP_SYMBOL_VAR_NAME(NAME) NAME ## _keep
+
+#define QT_KEEP_SYMBOL_HELPER(NAME, VAR_NAME) \
+ volatile auto VAR_NAME = &NAME; \
+ Q_UNUSED(VAR_NAME)
+
+#define QT_KEEP_SYMBOL(NAME) \
+ QT_KEEP_SYMBOL_HELPER(NAME, QT_KEEP_SYMBOL_VAR_NAME(NAME))
+
+
+// Similar to the ones above, but for rcc resource symbols specifically.
+#define QT_GET_RESOURCE_INIT_SYMBOL(NAME) \
+ QT_RCC_MANGLE_NAMESPACE(qInitResources_ ## NAME)
+
+#define QT_DECLARE_EXTERN_RESOURCE(NAME) \
+ QT_DECLARE_EXTERN_SYMBOL_INT(QT_GET_RESOURCE_INIT_SYMBOL(NAME))
+
+#define QT_KEEP_RESOURCE(NAME) \
+ QT_KEEP_SYMBOL(QT_GET_RESOURCE_INIT_SYMBOL(NAME))
+
+#endif // QTSYMBOLMACROS_H
+
diff --git a/src/corelib/global/qttranslation.h b/src/corelib/global/qttranslation.h
new file mode 100644
index 0000000000..fb0a2244cc
--- /dev/null
+++ b/src/corelib/global/qttranslation.h
@@ -0,0 +1,44 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QTTRANSLATION_H
+#define QTTRANSLATION_H
+
+#include <QtCore/qtconfigmacros.h> // QT_NO_TRANSLATION should be defined here as well
+#include <QtCore/qtcoreexports.h>
+
+#if 0
+#pragma qt_class(QtTranslation)
+#pragma qt_sync_stop_processing
+#endif
+
+QT_BEGIN_NAMESPACE
+
+class QString;
+
+#define QT_TR_NOOP(x) x
+#define QT_TR_NOOP_UTF8(x) x
+#define QT_TRANSLATE_NOOP(scope, x) x
+#define QT_TRANSLATE_NOOP_UTF8(scope, x) x
+#define QT_TRANSLATE_NOOP3(scope, x, comment) {x, comment}
+#define QT_TRANSLATE_NOOP3_UTF8(scope, x, comment) {x, comment}
+
+#ifndef QT_NO_TRANSLATION
+
+#define QT_TR_N_NOOP(x) x
+#define QT_TRANSLATE_N_NOOP(scope, x) x
+#define QT_TRANSLATE_N_NOOP3(scope, x, comment) {x, comment}
+
+// Defined in qcoreapplication.cpp
+// The better name qTrId() is reserved for an upcoming function which would
+// return a much more powerful QStringFormatter instead of a QString.
+Q_CORE_EXPORT QString qtTrId(const char *id, int n = -1);
+
+#define QT_TRID_NOOP(id) id
+#define QT_TRID_N_NOOP(id) id
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_TRANSLATION
+
+#endif /* QTTRANSLATION_H */
diff --git a/src/corelib/global/qttranslation.qdoc b/src/corelib/global/qttranslation.qdoc
new file mode 100644
index 0000000000..b2b0b1f3c3
--- /dev/null
+++ b/src/corelib/global/qttranslation.qdoc
@@ -0,0 +1,206 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
+
+/*!
+ \macro QT_TR_NOOP(sourceText)
+ \relates <QtTranslation>
+
+ Marks the UTF-8 encoded string literal \a sourceText for delayed
+ translation in the current context (class).
+
+ The macro tells lupdate to collect the string, and expands to
+ \a sourceText itself.
+
+ Example:
+
+ \snippet code/src_corelib_global_qglobal.cpp 34
+
+ The macro QT_TR_NOOP_UTF8() is identical and obsolete; this applies
+ to all other _UTF8 macros as well.
+
+ \sa QT_TRANSLATE_NOOP(), {Internationalization with Qt}
+*/
+
+/*!
+ \macro QT_TRANSLATE_NOOP(context, sourceText)
+ \relates <QtTranslation>
+
+ Marks the UTF-8 encoded string literal \a sourceText for delayed
+ translation in the given \a context. The \a context is typically
+ a class name and also needs to be specified as a string literal.
+
+ The macro tells lupdate to collect the string, and expands to
+ \a sourceText itself.
+
+ Example:
+
+ \snippet code/src_corelib_global_qglobal.cpp 35
+
+ \sa QT_TR_NOOP(), QT_TRANSLATE_NOOP3(), {Internationalization with Qt}
+*/
+
+/*!
+ \macro QT_TRANSLATE_NOOP3(context, sourceText, disambiguation)
+ \relates <QtTranslation>
+ \since 4.4
+
+ Marks the UTF-8 encoded string literal \a sourceText for delayed
+ translation in the given \a context with the given \a disambiguation.
+ The \a context is typically a class and also needs to be specified
+ as a string literal. The string literal \a disambiguation should be
+ a short semantic tag to tell apart otherwise identical strings.
+
+ The macro tells lupdate to collect the string, and expands to an
+ anonymous struct of the two string literals passed as \a sourceText
+ and \a disambiguation.
+
+ Example:
+
+ \snippet code/src_corelib_global_qglobal.cpp 36
+
+ \sa QT_TR_NOOP(), QT_TRANSLATE_NOOP(), {Internationalization with Qt}
+*/
+
+/*!
+ \macro QT_TR_N_NOOP(sourceText)
+ \relates <QtTranslation>
+ \since 5.12
+
+ Marks the UTF-8 encoded string literal \a sourceText for numerator
+ dependent delayed translation in the current context (class).
+
+ The macro tells lupdate to collect the string, and expands to
+ \a sourceText itself.
+
+ The macro expands to \a sourceText.
+
+ Example:
+
+ \snippet code/src_corelib_global_qglobal.cpp qttrnnoop
+
+ \sa QT_TR_NOOP, {Internationalization with Qt}
+*/
+
+/*!
+ \macro QT_TRANSLATE_N_NOOP(context, sourceText)
+ \relates <QtTranslation>
+ \since 5.12
+
+ Marks the UTF-8 encoded string literal \a sourceText for numerator
+ dependent delayed translation in the given \a context.
+ The \a context is typically a class name and also needs to be
+ specified as a string literal.
+
+ The macro tells lupdate to collect the string, and expands to
+ \a sourceText itself.
+
+ Example:
+
+ \snippet code/src_corelib_global_qglobal.cpp qttranslatennoop
+
+ \sa QT_TRANSLATE_NOOP(), QT_TRANSLATE_N_NOOP3(),
+ {Internationalization with Qt}
+*/
+
+/*!
+ \macro QT_TRANSLATE_N_NOOP3(context, sourceText, comment)
+ \relates <QtTranslation>
+ \since 5.12
+
+ Marks the UTF-8 encoded string literal \a sourceText for numerator
+ dependent delayed translation in the given \a context with the given
+ \a comment.
+ The \a context is typically a class and also needs to be specified
+ as a string literal. The string literal \a comment should be
+ a short semantic tag to tell apart otherwise identical strings.
+
+ The macro tells lupdate to collect the string, and expands to an
+ anonymous struct of the two string literals passed as \a sourceText
+ and \a comment.
+
+ Example:
+
+ \snippet code/src_corelib_global_qglobal.cpp qttranslatennoop3
+
+ \sa QT_TR_NOOP(), QT_TRANSLATE_NOOP(), QT_TRANSLATE_NOOP3(),
+ {Internationalization with Qt}
+*/
+
+/*!
+ \fn QString qtTrId(const char *id, int n = -1)
+ \relates <QtTranslation>
+ \reentrant
+ \since 4.6
+
+ \brief The qtTrId function finds and returns a translated string.
+
+ Returns a translated string identified by \a id.
+ If no matching string is found, the id itself is returned. This
+ should not happen under normal conditions.
+
+ If \a n >= 0, all occurrences of \c %n in the resulting string
+ are replaced with a decimal representation of \a n. In addition,
+ depending on \a n's value, the translation text may vary.
+
+ Meta data and comments can be passed as documented for QObject::tr().
+ In addition, it is possible to supply a source string template like that:
+
+ \tt{//% <C string>}
+
+ or
+
+ \tt{\\begincomment% <C string> \\endcomment}
+
+ Example:
+
+ \snippet code/src_corelib_global_qglobal.cpp qttrid
+
+ Creating QM files suitable for use with this function requires passing
+ the \c -idbased option to the \c lrelease tool.
+
+ \warning This method is reentrant only if all translators are
+ installed \e before calling this method. Installing or removing
+ translators while performing translations is not supported. Doing
+ so will probably result in crashes or other undesirable behavior.
+
+ \sa QObject::tr(), QCoreApplication::translate(), {Internationalization with Qt}
+*/
+
+/*!
+ \macro QT_TRID_NOOP(id)
+ \relates <QtTranslation>
+ \since 4.6
+
+ \brief The QT_TRID_NOOP macro marks an id for dynamic translation.
+
+ The only purpose of this macro is to provide an anchor for attaching
+ meta data like to qtTrId().
+
+ The macro expands to \a id.
+
+ Example:
+
+ \snippet code/src_corelib_global_qglobal.cpp qttrid_noop
+
+ \sa qtTrId(), {Internationalization with Qt}
+*/
+
+/*!
+ \macro QT_TRID_N_NOOP(id)
+ \relates <QtTranslation>
+ \since 6.3
+
+ \brief The QT_TRID_N_NOOP macro marks an id for numerator
+ dependent dynamic translation.
+
+ The only purpose of this macro is to provide an anchor for attaching
+ meta data like to qtTrId().
+
+ The macro expands to \a id.
+
+ Example:
+
+ \snippet code/src_corelib_global_qglobal.cpp qttrid_n_noop
+
+ \sa qtTrId(), {Internationalization with Qt}
+*/
diff --git a/src/corelib/global/qttypetraits.h b/src/corelib/global/qttypetraits.h
new file mode 100644
index 0000000000..1efb24bf70
--- /dev/null
+++ b/src/corelib/global/qttypetraits.h
@@ -0,0 +1,65 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QTTYPETRAITS_H
+#define QTTYPETRAITS_H
+
+#include <QtCore/qtconfigmacros.h>
+#include <QtCore/qtdeprecationmarkers.h>
+
+#include <type_traits>
+#include <utility>
+
+#if 0
+#pragma qt_class(QtTypeTraits)
+#pragma qt_sync_stop_processing
+#endif
+
+QT_BEGIN_NAMESPACE
+
+// like std::to_underlying
+template <typename Enum>
+constexpr std::underlying_type_t<Enum> qToUnderlying(Enum e) noexcept
+{
+ return static_cast<std::underlying_type_t<Enum>>(e);
+}
+
+#ifndef QT_NO_QASCONST
+#if QT_DEPRECATED_SINCE(6, 6)
+
+// this adds const to non-const objects (like std::as_const)
+template <typename T>
+QT_DEPRECATED_VERSION_X_6_6("Use std::as_const() instead.")
+constexpr typename std::add_const<T>::type &qAsConst(T &t) noexcept { return t; }
+// prevent rvalue arguments:
+template <typename T>
+void qAsConst(const T &&) = delete;
+
+#endif // QT_DEPRECATED_SINCE(6, 6)
+#endif // QT_NO_QASCONST
+
+#ifndef QT_NO_QEXCHANGE
+
+// like std::exchange
+template <typename T, typename U = T>
+constexpr T qExchange(T &t, U &&newValue)
+noexcept(std::conjunction_v<std::is_nothrow_move_constructible<T>,
+ std::is_nothrow_assignable<T &, U>>)
+{
+ T old = std::move(t);
+ t = std::forward<U>(newValue);
+ return old;
+}
+
+#endif // QT_NO_QEXCHANGE
+
+namespace QtPrivate {
+// helper to be used to trigger a "dependent static_assert(false)"
+// (for instance, in a final `else` branch of a `if constexpr`.)
+template <typename T> struct type_dependent_false : std::false_type {};
+template <auto T> struct value_dependent_false : std::false_type {};
+}
+
+QT_END_NAMESPACE
+
+#endif // QTTYPETRAITS_H
diff --git a/src/corelib/global/qttypetraits.qdoc b/src/corelib/global/qttypetraits.qdoc
new file mode 100644
index 0000000000..ed814d6f43
--- /dev/null
+++ b/src/corelib/global/qttypetraits.qdoc
@@ -0,0 +1,146 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
+
+/*!
+ \headerfile <QtTypeTraits>
+ \inmodule QtCore
+ \since 6.5
+ \title Qt Type Traits
+ \brief Functionality for type traits and transformations.
+*/
+
+/*!
+ \fn template <typename Enum> std::underlying_type_t<Enum> qToUnderlying(Enum e)
+ \relates <QtTypeTraits>
+ \since 6.2
+
+ Converts the enumerator \a e to the equivalent value expressed in its
+ enumeration's underlying type.
+*/
+
+/*!
+ \fn template <typename T> typename std::add_const<T>::type &qAsConst(T &t)
+ \relates <QtTypeTraits>
+ \since 5.7
+
+ \deprecated [6.6] Use std::as_const() instead.
+
+ Returns \a t cast to \c{const T}.
+
+ This function is a Qt implementation of C++17's std::as_const(),
+ a cast function like std::move(). But while std::move() turns
+ lvalues into rvalues, this function turns non-const lvalues into
+ const lvalues. Like std::as_const(), it doesn't work on rvalues,
+ because it cannot be efficiently implemented for rvalues without
+ leaving dangling references.
+
+ Its main use in Qt is to prevent implicitly-shared Qt containers
+ from detaching:
+ \snippet code/src_corelib_global_qglobal.cpp as-const-0
+
+ Of course, in this case, you could (and probably should) have declared
+ \c s as \c const in the first place:
+ \snippet code/src_corelib_global_qglobal.cpp as-const-1
+ but often that is not easily possible.
+
+ It is important to note that qAsConst() does not copy its argument,
+ it just performs a \c{const_cast<const T&>(t)}. This is also the reason
+ why it is designed to fail for rvalues: The returned reference would go
+ stale too soon. So while this works (but detaches the returned object):
+ \snippet code/src_corelib_global_qglobal.cpp as-const-2
+
+ this would not:
+ \snippet code/src_corelib_global_qglobal.cpp as-const-3
+
+ To prevent this construct from compiling (and failing at runtime), qAsConst() has
+ a second, deleted, overload which binds to rvalues.
+
+ \note You can make the qAsConst() function unavailable by defining
+ the \l{QT_NO_QASCONST} macro.
+*/
+
+/*!
+ \macro QT_NO_QASCONST
+ \since 6.8
+ \relates <QtTypeTraits>
+
+ Defining this macro removes the availability of the qAsConst()
+ function.
+
+ \sa qAsConst
+*/
+
+/*!
+ \fn template <typename T> void qAsConst(const T &&t)
+ \relates <QtTypeTraits>
+ \since 5.7
+ \overload
+
+ \deprecated [6.6]
+
+ This overload is deleted to prevent a dangling reference in code like
+ \snippet code/src_corelib_global_qglobal.cpp as-const-4
+*/
+
+/*!
+ \fn template <typename T, typename U = T> T qExchange(T &obj, U &&newValue)
+ \relates <QtTypeTraits>
+ \since 5.14
+
+ Replaces the value of \a obj with \a newValue and returns the old value of \a obj.
+
+ This is Qt's implementation of std::exchange(). It differs from std::exchange()
+ only in that it is \c constexpr already before C++20 and noexcept already before C++23.
+
+ We strongly advise to use std::exchange() when you don't need the C++20 or C++23 variants.
+ You can make qExchange() unavailable by defining the \l{QT_NO_QEXCHANGE} macro.
+
+ Here is how to use qExchange() to implement move constructors:
+ \code
+ MyClass(MyClass &&other)
+ : m_pointer{qExchange(other.m_pointer, nullptr)},
+ m_int{qExchange(other.m_int, 0)},
+ m_vector{std::move(other.m_vector)},
+ ...
+ \endcode
+
+ For members of class type, we can use std::move(), as their move-constructor will
+ do the right thing. But for scalar types such as raw pointers or integer type, move
+ is the same as copy, which, particularly for pointers, is not what we expect. So, we
+ cannot use std::move() for such types, but we can use std::exchange()/qExchange() to
+ make sure the source object's member is already reset by the time we get to the
+ initialization of our next data member, which might come in handy if the constructor
+ exits with an exception.
+
+ Here is how to use qExchange() to write a loop that consumes the collection it
+ iterates over:
+ \code
+ for (auto &e : qExchange(collection, {})
+ doSomethingWith(e);
+ \endcode
+
+ Which is equivalent to the following, much more verbose code:
+ \code
+ {
+ auto tmp = std::move(collection);
+ collection = {}; // or collection.clear()
+ for (auto &e : tmp)
+ doSomethingWith(e);
+ } // destroys 'tmp'
+ \endcode
+
+ This is perfectly safe, as the for-loop keeps the result of qExchange() alive for as
+ long as the loop runs, saving the declaration of a temporary variable. Be aware, though,
+ that qExchange() returns a non-const object, so Qt containers may detach.
+*/
+
+/*!
+ \macro QT_NO_QEXCHANGE
+ \since 6.6
+ \relates <QtTypeTraits>
+
+ Defining this macro removes the availability of the qExchange()
+ function.
+
+ \sa qExchange
+*/
diff --git a/src/corelib/global/qtversion.h b/src/corelib/global/qtversion.h
new file mode 100644
index 0000000000..775f2479a9
--- /dev/null
+++ b/src/corelib/global/qtversion.h
@@ -0,0 +1,38 @@
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QTVERSION_H
+#define QTVERSION_H
+
+#if 0
+#pragma qt_class(QtVersion)
+#pragma qt_sync_stop_processing
+#endif
+
+#ifndef __ASSEMBLER__
+
+#include <QtCore/qcompilerdetection.h>
+#include <QtCore/qtconfigmacros.h>
+#include <QtCore/qtcoreexports.h>
+
+QT_BEGIN_NAMESPACE
+
+/*
+ * If we're compiling C++ code:
+ * - and this is a non-namespace build, declare qVersion as extern "C"
+ * - and this is a namespace build, declare it as a regular function
+ * (we're already inside QT_BEGIN_NAMESPACE / QT_END_NAMESPACE)
+ * If we're compiling C code, simply declare the function. If Qt was compiled
+ * in a namespace, qVersion isn't callable anyway.
+ */
+#if !defined(QT_NAMESPACE) && defined(__cplusplus) && !defined(Q_QDOC)
+extern "C"
+#endif
+/* defined in qlibraryinfo.cpp */
+Q_CORE_EXPORT Q_DECL_CONST_FUNCTION const char *qVersion(void) Q_DECL_NOEXCEPT;
+
+QT_END_NAMESPACE
+
+#endif // __ASSEMBLER__
+
+#endif // QTVERSION_H
diff --git a/src/corelib/global/qtversionchecks.cpp b/src/corelib/global/qtversionchecks.cpp
new file mode 100644
index 0000000000..3e3f4547f1
--- /dev/null
+++ b/src/corelib/global/qtversionchecks.cpp
@@ -0,0 +1,46 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+/*!
+ \macro QT_VERSION_CHECK(major, minor, patch)
+ \relates <QtVersionChecks>
+
+ Turns the \a major, \a minor and \a patch numbers of a version into an
+ integer that encodes all three. When expressed in hexadecimal, this integer
+ is of form \c 0xMMNNPP wherein \c{0xMM ==} \a major, \c{0xNN ==} \a minor,
+ and \c{0xPP ==} \a patch. This can be compared with another similarly
+ processed version ID.
+
+ Example:
+
+ \snippet code/src_corelib_global_qglobal.cpp qt-version-check
+
+ \note the parameters are read as integers in the normal way, so should
+ normally be written in decimal (so a \c 0x prefix must be used if writing
+ them in hexadecimal). Thus \c{QT_VERSION_CHECK(5, 15, 0)} is equal to \c
+ 0x050f00, which could equally be written \c{QT_VERSION_CHECK(5, 0xf, 0)}.
+
+ \sa QT_VERSION
+*/
+
+/*!
+ \macro QT_VERSION
+ \relates <QtVersionChecks>
+
+ This macro expands to a numeric value of the same form as \l
+ QT_VERSION_CHECK() constructs, that specifies the version of Qt with which
+ code using it is compiled. For example, if you compile your application with
+ Qt 6.1.2, the QT_VERSION macro will expand to \c 0x060102, the same as
+ \c{QT_VERSION_CHECK(6, 1, 2)}. Note that this need not agree with the
+ version the application will find itself using at \e runtime.
+
+ You can use QT_VERSION to select the latest Qt features where available
+ while falling back to older implementations otherwise. Using
+ QT_VERSION_CHECK() for the value to compare with is recommended.
+
+ Example:
+
+ \snippet code/src_corelib_global_qglobal.cpp 16
+
+ \sa QT_VERSION_STR, QT_VERSION_CHECK(), qVersion()
+*/
diff --git a/src/corelib/global/qtversionchecks.h b/src/corelib/global/qtversionchecks.h
new file mode 100644
index 0000000000..86fc094f4e
--- /dev/null
+++ b/src/corelib/global/qtversionchecks.h
@@ -0,0 +1,114 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QTVERSIONCHECKS_H
+#define QTVERSIONCHECKS_H
+
+#if 0
+#pragma qt_class(QtVersionChecks)
+#pragma qt_sync_stop_processing
+#endif
+
+#include <QtCore/qtconfiginclude.h>
+
+/*
+ QT_VERSION is (major << 16) | (minor << 8) | patch.
+*/
+#define QT_VERSION QT_VERSION_CHECK(QT_VERSION_MAJOR, QT_VERSION_MINOR, QT_VERSION_PATCH)
+/*
+ can be used like #if (QT_VERSION >= QT_VERSION_CHECK(6, 4, 0))
+*/
+#define QT_VERSION_CHECK(major, minor, patch) ((major<<16)|(minor<<8)|(patch))
+
+/*
+ Helper macros to make some simple code active in Qt 6 or Qt 7 only,
+ like:
+ struct QT6_ONLY(Q_CORE_EXPORT) QTrivialClass
+ {
+ void QT7_ONLY(Q_CORE_EXPORT) void operate();
+ }
+*/
+#if QT_VERSION_MAJOR == 7 || defined(QT_BOOTSTRAPPED)
+# define QT7_ONLY(...) __VA_ARGS__
+# define QT6_ONLY(...)
+#elif QT_VERSION_MAJOR == 6
+# define QT7_ONLY(...)
+# define QT6_ONLY(...) __VA_ARGS__
+#else
+# error Qt major version not 6 or 7
+#endif
+
+/* Macro and tag type to help overload resolution on functions
+ that are, e.g., QT_REMOVED_SINCE'ed. Example use:
+
+ #if QT_CORE_REMOVED_SINCE(6, 4)
+ int size() const;
+ #endif
+ qsizetype size(QT6_DECL_NEW_OVERLOAD) const;
+
+ in the normal cpp file:
+
+ qsizetype size(QT6_IMPL_NEW_OVERLOAD) const {
+ ~~~
+ }
+
+ in removed_api.cpp:
+
+ int size() const { return int(size(QT6_CALL_NEW_OVERLOAD)); }
+*/
+#ifdef Q_QDOC
+# define QT6_DECL_NEW_OVERLOAD
+# define QT6_DECL_NEW_OVERLOAD_TAIL
+# define QT6_IMPL_NEW_OVERLOAD
+# define QT6_IMPL_NEW_OVERLOAD_TAIL
+# define QT6_CALL_NEW_OVERLOAD
+# define QT6_CALL_NEW_OVERLOAD_TAIL
+#else
+# define QT6_DECL_NEW_OVERLOAD QT6_ONLY(Qt::Disambiguated_t = Qt::Disambiguated)
+# define QT6_DECL_NEW_OVERLOAD_TAIL QT6_ONLY(, QT6_DECL_NEW_OVERLOAD)
+# define QT6_IMPL_NEW_OVERLOAD QT6_ONLY(Qt::Disambiguated_t)
+# define QT6_IMPL_NEW_OVERLOAD_TAIL QT6_ONLY(, QT6_IMPL_NEW_OVERLOAD)
+# define QT6_CALL_NEW_OVERLOAD QT6_ONLY(Qt::Disambiguated)
+# define QT6_CALL_NEW_OVERLOAD_TAIL QT6_ONLY(, QT6_CALL_NEW_OVERLOAD)
+#endif
+
+/*
+ Macro to tag Tech Preview APIs.
+ It expands to nothing, because we want to use it in places where
+ nothing is generally allowed (not even an attribute); for instance:
+ to tag other macros, Q_PROPERTY declarations, and so on.
+
+ Still: use it as if it were an C++ attribute.
+
+ To mark a class as TP:
+ class QT_TECH_PREVIEW_API Q_CORE_EXPORT QClass { ... };
+
+ To mark a function:
+ QT_TECH_PREVIEW_API void qFunction();
+
+ To mark an enumeration or enumerator:
+ enum class QT_TECH_PREVIEW_API QEnum {
+ Enum1,
+ Enum2 QT_TECH_PREVIEW_API,
+ };
+
+ To mark parts of a class:
+ class QClass : public QObject
+ {
+ // Q_OBJECT omitted d/t QTBUG-123229
+
+ QT_TECH_PREVIEW_API
+ Q_PROPERTY(int countNG ...) // this is TP
+
+ Q_PROPERTY(int count ...) // this is stable API
+
+ public:
+ QT_TECH_PREVIEW_API
+ void f(); // TP
+
+ void g(); // stable
+ };
+*/
+#define QT_TECH_PREVIEW_API
+
+#endif /* QTVERSIONCHECKS_H */
diff --git a/src/corelib/global/qtypeinfo.h b/src/corelib/global/qtypeinfo.h
index 96b52ca0b2..255a2b33c6 100644
--- a/src/corelib/global/qtypeinfo.h
+++ b/src/corelib/global/qtypeinfo.h
@@ -1,51 +1,17 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include <QtCore/qglobal.h>
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2016 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QTYPEINFO_H
+#define QTYPEINFO_H
+
+#include <QtCore/qcompilerdetection.h>
#include <QtCore/qcontainerfwd.h>
+
#include <variant>
#include <optional>
#include <tuple>
-
-#ifndef QTYPEINFO_H
-#define QTYPEINFO_H
+#include <type_traits>
QT_BEGIN_NAMESPACE
@@ -55,9 +21,30 @@ class QDebug;
QTypeInfo - type trait functionality
*/
+namespace QtPrivate {
+
+// A trivially copyable class must also have a trivial, non-deleted
+// destructor [class.prop/1.3], CWG1734. Some implementations don't
+// check for a trivial destructor, because of backwards compatibility
+// with C++98's definition of trivial copyability.
+// Since trivial copiability has implications for the ABI, implementations
+// can't "just fix" their traits. So, although formally redundant, we
+// explicitly check for trivial destruction here.
template <typename T>
inline constexpr bool qIsRelocatable = std::is_trivially_copyable_v<T> && std::is_trivially_destructible_v<T>;
+// Denotes types that are trivially default constructible, and for which
+// value-initialization can be achieved by filling their storage with 0 bits.
+// There is no type trait we can use for this, so we hardcode a list of
+// possibilities that we know are OK on the architectures that we support.
+// The most notable exception are pointers to data members, which for instance
+// on the Itanium ABI are initialized to -1.
+template <typename T>
+inline constexpr bool qIsValueInitializationBitwiseZero =
+ std::is_scalar_v<T> && !std::is_member_object_pointer_v<T>;
+
+}
+
/*
The catch-all template.
*/
@@ -67,10 +54,11 @@ class QTypeInfo
{
public:
enum {
- isPointer = std::is_pointer_v<T>,
- isIntegral = std::is_integral_v<T>,
+ isPointer [[deprecated("Use std::is_pointer instead")]] = std::is_pointer_v<T>,
+ isIntegral [[deprecated("Use std::is_integral instead")]] = std::is_integral_v<T>,
isComplex = !std::is_trivial_v<T>,
- isRelocatable = qIsRelocatable<T>,
+ isRelocatable = QtPrivate::qIsRelocatable<T>,
+ isValueInitializationBitwiseZero = QtPrivate::qIsValueInitializationBitwiseZero<T>,
};
};
@@ -79,10 +67,11 @@ class QTypeInfo<void>
{
public:
enum {
- isPointer = false,
- isIntegral = false,
+ isPointer [[deprecated("Use std::is_pointer instead")]] = false,
+ isIntegral [[deprecated("Use std::is_integral instead")]] = false,
isComplex = false,
isRelocatable = false,
+ isValueInitializationBitwiseZero = false,
};
};
@@ -113,20 +102,33 @@ class QTypeInfoMerger
public:
static constexpr bool isComplex = ((QTypeInfo<Ts>::isComplex) || ...);
static constexpr bool isRelocatable = ((QTypeInfo<Ts>::isRelocatable) && ...);
- static constexpr bool isPointer = false;
- static constexpr bool isIntegral = false;
+ [[deprecated("Use std::is_pointer instead")]] static constexpr bool isPointer = false;
+ [[deprecated("Use std::is_integral instead")]] static constexpr bool isIntegral = false;
+ static constexpr bool isValueInitializationBitwiseZero = false;
+ static_assert(!isRelocatable ||
+ std::is_copy_constructible_v<T> ||
+ std::is_move_constructible_v<T>,
+ "All Ts... are Q_RELOCATABLE_TYPE, but T is neither copy- nor move-constructible, "
+ "so cannot be Q_RELOCATABLE_TYPE. Please mark T as Q_COMPLEX_TYPE manually.");
};
+// QTypeInfo for std::pair:
+// std::pair is spec'ed to be struct { T1 first; T2 second; }, so, unlike tuple<>,
+// we _can_ specialize QTypeInfo for pair<>:
+template <class T1, class T2>
+class QTypeInfo<std::pair<T1, T2>> : public QTypeInfoMerger<std::pair<T1, T2>, T1, T2> {};
+
#define Q_DECLARE_MOVABLE_CONTAINER(CONTAINER) \
template <typename ...T> \
class QTypeInfo<CONTAINER<T...>> \
{ \
public: \
enum { \
- isPointer = false, \
- isIntegral = false, \
+ isPointer [[deprecated("Use std::is_pointer instead")]] = false, \
+ isIntegral [[deprecated("Use std::is_integral instead")]] = false, \
isComplex = true, \
isRelocatable = true, \
+ isValueInitializationBitwiseZero = false, \
}; \
}
@@ -164,10 +166,15 @@ class QTypeInfo<TYPE > \
public: \
enum { \
isComplex = (((FLAGS) & Q_PRIMITIVE_TYPE) == 0) && !std::is_trivial_v<TYPE>, \
- isRelocatable = !isComplex || ((FLAGS) & Q_RELOCATABLE_TYPE) || qIsRelocatable<TYPE>, \
- isPointer = false, \
- isIntegral = std::is_integral< TYPE >::value, \
+ isRelocatable = !isComplex || ((FLAGS) & Q_RELOCATABLE_TYPE) || QtPrivate::qIsRelocatable<TYPE>, \
+ isPointer [[deprecated("Use std::is_pointer instead")]] = std::is_pointer_v< TYPE >, \
+ isIntegral [[deprecated("Use std::is_integral instead")]] = std::is_integral< TYPE >::value, \
+ isValueInitializationBitwiseZero = QtPrivate::qIsValueInitializationBitwiseZero<TYPE>, \
}; \
+ static_assert(!isRelocatable || \
+ std::is_copy_constructible_v<TYPE > || \
+ std::is_move_constructible_v<TYPE >, \
+ #TYPE " is neither copy- nor move-constructible, so cannot be Q_RELOCATABLE_TYPE"); \
}
#define Q_DECLARE_TYPEINFO(TYPE, FLAGS) \
@@ -179,23 +186,6 @@ template<typename T> class QFlags;
template<typename T>
Q_DECLARE_TYPEINFO_BODY(QFlags<T>, Q_PRIMITIVE_TYPE);
-/*
- Specialize a shared type with:
-
- Q_DECLARE_SHARED(type)
-
- where 'type' is the name of the type to specialize. NOTE: shared
- types must define a member-swap, and be defined in the same
- namespace as Qt for this to work.
-*/
-
-#define Q_DECLARE_SHARED_IMPL(TYPE, FLAGS) \
-Q_DECLARE_TYPEINFO(TYPE, FLAGS); \
-inline void swap(TYPE &value1, TYPE &value2) \
- noexcept(noexcept(value1.swap(value2))) \
-{ value1.swap(value2); }
-#define Q_DECLARE_SHARED(TYPE) Q_DECLARE_SHARED_IMPL(TYPE, Q_RELOCATABLE_TYPE)
-
namespace QTypeTraits
{
@@ -264,7 +254,7 @@ using expand_operator_equal_recursive = std::conjunction<expand_operator_equal<T
template<typename T>
struct expand_operator_equal_tuple : has_operator_equal<T> {};
template<typename T>
-struct expand_operator_equal_tuple<std::optional<T>> : has_operator_equal<T> {};
+struct expand_operator_equal_tuple<std::optional<T>> : expand_operator_equal_recursive<T> {};
template<typename T1, typename T2>
struct expand_operator_equal_tuple<std::pair<T1, T2>> : expand_operator_equal_recursive<T1, T2> {};
template<typename ...T>
@@ -304,7 +294,7 @@ using expand_operator_less_than_recursive = std::conjunction<expand_operator_les
template<typename T>
struct expand_operator_less_than_tuple : has_operator_less_than<T> {};
template<typename T>
-struct expand_operator_less_than_tuple<std::optional<T>> : has_operator_less_than<T> {};
+struct expand_operator_less_than_tuple<std::optional<T>> : expand_operator_less_than_recursive<T> {};
template<typename T1, typename T2>
struct expand_operator_less_than_tuple<std::pair<T1, T2>> : expand_operator_less_than_recursive<T1, T2> {};
template<typename ...T>
diff --git a/src/corelib/global/qtypeinfo.qdoc b/src/corelib/global/qtypeinfo.qdoc
new file mode 100644
index 0000000000..75a92da197
--- /dev/null
+++ b/src/corelib/global/qtypeinfo.qdoc
@@ -0,0 +1,48 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
+
+/*!
+ \macro Q_DECLARE_TYPEINFO(Type, Flags)
+ \relates <QTypeInfo>
+
+ You can use this macro to specify information about a custom type
+ \a Type. With accurate type information, Qt's \l{Container Classes}
+ {generic containers} can choose appropriate storage methods and
+ algorithms.
+
+ \a Flags can be one of the following:
+
+ \list
+ \li \c Q_PRIMITIVE_TYPE specifies that \a Type requires no
+ operation to be performed in order to be properly destroyed,
+ and that it is possible to use memcpy() in order to create a
+ valid independent copy of an object.
+ \li \c Q_RELOCATABLE_TYPE specifies that \a Type has a constructor
+ and/or a destructor, but it can still be \e{relocated} in memory
+ by using \c memcpy().
+ \li \c Q_MOVABLE_TYPE is the same as \c Q_RELOCATABLE_TYPE. Prefer to use
+ \c Q_RELOCATABLE_TYPE in new code. Note: despite the name, this
+ has nothing to do with move constructors or C++ move semantics.
+ \li \c Q_COMPLEX_TYPE (the default) specifies that \a Type has
+ constructors and/or a destructor and that it may not be moved
+ in memory.
+ \endlist
+
+ Example of a "primitive" type:
+
+ \snippet code/src_corelib_global_qglobal.cpp 38
+
+ An example of a non-POD "primitive" type is QUuid: Even though
+ QUuid has constructors (and therefore isn't POD), every bit
+ pattern still represents a valid object, and memcpy() can be used
+ to create a valid independent copy of a QUuid object.
+
+ Example of a relocatable type:
+
+ \snippet code/src_corelib_global_qglobal.cpp 39
+
+ Qt will try to detect the class of a type using standard C++ type traits;
+ use this macro to tune the behavior.
+ For instance many types would be candidates for Q_RELOCATABLE_TYPE despite
+ not being trivially-copyable.
+*/
diff --git a/src/corelib/global/qtypes.cpp b/src/corelib/global/qtypes.cpp
new file mode 100644
index 0000000000..9de3960e2f
--- /dev/null
+++ b/src/corelib/global/qtypes.cpp
@@ -0,0 +1,528 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// Copyright (C) 2022 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#include "qtypes.h"
+
+#include <QtCore/qcompilerdetection.h>
+#include <QtCore/qsystemdetection.h>
+#include <QtCore/qprocessordetection.h>
+
+#include <climits>
+#include <limits>
+#include <type_traits>
+
+QT_BEGIN_NAMESPACE
+
+/*!
+ \headerfile <QtTypes>
+ \inmodule QtCore
+ \title Qt Type Declarations
+
+ \brief The <QtTypes> header file includes Qt fundamental type declarations.
+
+ The header file declares several type definitions that guarantee a
+ specified bit-size on all platforms supported by Qt for various
+ basic types, for example \l qint8 which is a signed char
+ guaranteed to be 8-bit on all platforms supported by Qt. The
+ header file also declares the \l qlonglong type definition for
+ \c {long long int}.
+
+ Several convenience type definitions are declared: \l qreal for \c
+ double or \c float, \l uchar for \c {unsigned char}, \l uint for
+ \c {unsigned int}, \l ulong for \c {unsigned long} and \l ushort
+ for \c {unsigned short}.
+
+ The header also provides series of macros that make it possible to print
+ some Qt type aliases (qsizetype, qintptr, etc.) via a formatted output
+ facility such as printf() or qDebug() without raising formatting warnings
+ and without the need of a type cast.
+*/
+
+/*!
+ \typedef qreal
+ \relates <QtTypes>
+
+ Typedef for \c double unless Qt is configured with the
+ \c{-qreal float} option.
+*/
+
+/*! \typedef uchar
+ \relates <QtTypes>
+
+ Convenience typedef for \c{unsigned char}.
+*/
+
+/*! \typedef ushort
+ \relates <QtTypes>
+
+ Convenience typedef for \c{unsigned short}.
+*/
+
+/*! \typedef uint
+ \relates <QtTypes>
+
+ Convenience typedef for \c{unsigned int}.
+*/
+
+/*! \typedef ulong
+ \relates <QtTypes>
+
+ Convenience typedef for \c{unsigned long}.
+*/
+
+/*! \typedef qint8
+ \relates <QtTypes>
+
+ Typedef for \c{signed char}. This type is guaranteed to be 8-bit
+ on all platforms supported by Qt.
+*/
+
+/*!
+ \typedef quint8
+ \relates <QtTypes>
+
+ Typedef for \c{unsigned char}. This type is guaranteed to
+ be 8-bit on all platforms supported by Qt.
+*/
+
+/*! \typedef qint16
+ \relates <QtTypes>
+
+ Typedef for \c{signed short}. This type is guaranteed to be
+ 16-bit on all platforms supported by Qt.
+*/
+
+/*!
+ \typedef quint16
+ \relates <QtTypes>
+
+ Typedef for \c{unsigned short}. This type is guaranteed to
+ be 16-bit on all platforms supported by Qt.
+*/
+
+/*! \typedef qint32
+ \relates <QtTypes>
+
+ Typedef for \c{signed int}. This type is guaranteed to be 32-bit
+ on all platforms supported by Qt.
+*/
+
+/*!
+ \typedef quint32
+ \relates <QtTypes>
+
+ Typedef for \c{unsigned int}. This type is guaranteed to
+ be 32-bit on all platforms supported by Qt.
+*/
+
+/*! \typedef qint64
+ \relates <QtTypes>
+
+ Typedef for \c{long long int}. This type is guaranteed to be 64-bit
+ on all platforms supported by Qt.
+
+ Literals of this type can be created using the Q_INT64_C() macro:
+
+ \snippet code/src_corelib_global_qglobal.cpp 5
+
+ \sa Q_INT64_C(), quint64, qlonglong
+*/
+
+/*!
+ \typedef quint64
+ \relates <QtTypes>
+
+ Typedef for \c{unsigned long long int}. This type is guaranteed to
+ be 64-bit on all platforms supported by Qt.
+
+ Literals of this type can be created using the Q_UINT64_C()
+ macro:
+
+ \snippet code/src_corelib_global_qglobal.cpp 6
+
+ \sa Q_UINT64_C(), qint64, qulonglong
+*/
+
+/*!
+ \typedef qint128
+ \relates <QtTypes>
+ \since 6.6
+
+ Typedef for \c{__int128} on platforms that support it (Qt defines the macro
+ \l QT_SUPPORTS_INT128 if this is the case).
+
+ Literals of this type can be created using the Q_INT128_C() macro.
+
+ \sa Q_INT128_C(), Q_INT128_MIN, Q_INT128_MAX, quint128, QT_SUPPORTS_INT128
+*/
+
+/*!
+ \typedef quint128
+ \relates <QtTypes>
+ \since 6.6
+
+ Typedef for \c{unsigned __int128} on platforms that support it (Qt defines
+ the macro \l QT_SUPPORTS_INT128 if this is the case).
+
+ Literals of this type can be created using the Q_UINT128_C() macro.
+
+ \sa Q_UINT128_C(), Q_UINT128_MAX, qint128, QT_SUPPORTS_INT128
+*/
+
+/*!
+ \macro QT_SUPPORTS_INT128
+ \relates <QtTypes>
+ \since 6.6
+
+ Qt defines this macro as well as the \l qint128 and \l quint128 types if
+ the platform has support for 128-bit integer types.
+
+ \sa qint128, quint128, Q_INT128_C(), Q_UINT128_C(), Q_INT128_MIN, Q_INT128_MAX, Q_UINT128_MAX
+*/
+
+/*!
+ \typedef qintptr
+ \relates <QtTypes>
+
+ Integral type for representing pointers in a signed integer (useful for
+ hashing, etc.).
+
+ Typedef for either qint32 or qint64. This type is guaranteed to
+ be the same size as a pointer on all platforms supported by Qt. On
+ a system with 32-bit pointers, qintptr is a typedef for qint32;
+ on a system with 64-bit pointers, qintptr is a typedef for
+ qint64.
+
+ Note that qintptr is signed. Use quintptr for unsigned values.
+
+ In order to print values of this type by using formatted-output
+ facilities such as \c{printf()}, qDebug(), QString::asprintf() and
+ so on, you can use the \c{PRIdQINTPTR} and \c{PRIiQINTPTR}
+ macros as format specifiers. They will both print the value as a
+ base 10 number.
+
+ \code
+ qintptr p = 123;
+ printf("The pointer is %" PRIdQINTPTR "\n", p);
+ \endcode
+
+ \sa qptrdiff, qint32, qint64
+*/
+
+/*! \typedef qlonglong
+ \relates <QtTypes>
+
+ Typedef for \c{long long int} (\c __int64 on Windows). This is
+ the same as \l qint64.
+
+ \sa qulonglong, qint64
+*/
+
+/*!
+ \typedef qulonglong
+ \relates <QtTypes>
+
+ Typedef for \c{unsigned long long int} (\c{unsigned __int64} on
+ Windows). This is the same as \l quint64.
+
+ \sa quint64, qlonglong
+*/
+
+/*!
+ \macro PRIdQINTPTR
+ \macro PRIiQINTPTR
+ \since 6.2
+ \relates <QtTypes>
+
+ See \l qintptr.
+*/
+
+/*!
+ \typedef quintptr
+ \relates <QtTypes>
+
+ Integral type for representing pointers in an unsigned integer (useful for
+ hashing, etc.).
+
+ Typedef for either quint32 or quint64. This type is guaranteed to
+ be the same size as a pointer on all platforms supported by Qt. On
+ a system with 32-bit pointers, quintptr is a typedef for quint32;
+ on a system with 64-bit pointers, quintptr is a typedef for
+ quint64.
+
+ Note that quintptr is unsigned. Use qptrdiff for signed values.
+
+ In order to print values of this type by using formatted-output
+ facilities such as \c{printf()}, qDebug(), QString::asprintf() and
+ so on, you can use the following macros as format specifiers:
+
+ \list
+ \li \c{PRIuQUINTPTR}: prints the value as a base 10 number.
+ \li \c{PRIoQUINTPTR}: prints the value as a base 8 number.
+ \li \c{PRIxQUINTPTR}: prints the value as a base 16 number, using lowercase \c{a-f} letters.
+ \li \c{PRIXQUINTPTR}: prints the value as a base 16 number, using uppercase \c{A-F} letters.
+ \endlist
+
+ \code
+ quintptr p = 123u;
+ printf("The pointer value is 0x%" PRIXQUINTPTR "\n", p);
+ \endcode
+
+ \sa qptrdiff, quint32, quint64
+*/
+
+/*!
+ \macro PRIoQUINTPTR
+ \macro PRIuQUINTPTR
+ \macro PRIxQUINTPTR
+ \macro PRIXQUINTPTR
+ \since 6.2
+ \relates <QtTypes>
+
+ See quintptr.
+*/
+
+/*!
+ \typedef qptrdiff
+ \relates <QtTypes>
+
+ Integral type for representing pointer differences.
+
+ Typedef for either qint32 or qint64. This type is guaranteed to be
+ the same size as a pointer on all platforms supported by Qt. On a
+ system with 32-bit pointers, quintptr is a typedef for quint32; on
+ a system with 64-bit pointers, quintptr is a typedef for quint64.
+
+ Note that qptrdiff is signed. Use quintptr for unsigned values.
+
+ In order to print values of this type by using formatted-output
+ facilities such as \c{printf()}, qDebug(), QString::asprintf() and
+ so on, you can use the \c{PRIdQPTRDIFF} and \c{PRIiQPTRDIFF}
+ macros as format specifiers. They will both print the value as a
+ base 10 number.
+
+ \code
+ qptrdiff d = 123;
+ printf("The difference is %" PRIdQPTRDIFF "\n", d);
+ \endcode
+
+ \sa quintptr, qint32, qint64
+*/
+
+/*!
+ \macro PRIdQPTRDIFF
+ \macro PRIiQPTRDIFF
+ \since 6.2
+ \relates <QtTypes>
+
+ See qptrdiff.
+*/
+
+/*!
+ \typedef qsizetype
+ \relates <QtTypes>
+ \since 5.10
+
+ Integral type providing Posix' \c ssize_t for all platforms.
+
+ This type is guaranteed to be the same size as a \c size_t on all
+ platforms supported by Qt.
+
+ Note that qsizetype is signed. Use \c size_t for unsigned values.
+
+ In order to print values of this type by using formatted-output
+ facilities such as \c{printf()}, qDebug(), QString::asprintf() and
+ so on, you can use the \c{PRIdQSIZETYPE} and \c{PRIiQSIZETYPE}
+ macros as format specifiers. They will both print the value as a
+ base 10 number.
+
+ \code
+ qsizetype s = 123;
+ printf("The size is %" PRIdQSIZETYPE "\n", s);
+ \endcode
+
+ \sa qptrdiff
+*/
+
+/*!
+ \macro PRIdQSIZETYPE
+ \macro PRIiQSIZETYPE
+ \since 6.2
+ \relates <QtTypes>
+
+ See qsizetype.
+*/
+
+/*! \macro qint64 Q_INT64_C(literal)
+ \relates <QtTypes>
+
+ Wraps the signed 64-bit integer \a literal in a
+ platform-independent way.
+
+ Example:
+
+ \snippet code/src_corelib_global_qglobal.cpp 8
+
+ \sa qint64, Q_UINT64_C(), Q_INT128_C()
+*/
+
+/*! \macro quint64 Q_UINT64_C(literal)
+ \relates <QtTypes>
+
+ Wraps the unsigned 64-bit integer \a literal in a
+ platform-independent way.
+
+ Example:
+
+ \snippet code/src_corelib_global_qglobal.cpp 9
+
+ \sa quint64, Q_INT64_C(), Q_UINT128_C()
+*/
+
+/*!
+ \macro qint128 Q_INT128_C(literal)
+ \relates <QtTypes>
+ \since 6.6
+
+ Wraps the signed 128-bit integer \a literal in a
+ platform-independent way.
+
+ \note Unlike Q_INT64_C(), this macro is only available in C++, not in C.
+ This is because compilers do not provide these literals as built-ins and C
+ does not have support for user-defined literals.
+
+ \sa qint128, Q_UINT128_C(), Q_INT128_MIN, Q_INT128_MAX, Q_INT64_C(), QT_SUPPORTS_INT128
+*/
+
+/*!
+ \macro quint128 Q_UINT128_C(literal)
+ \relates <QtTypes>
+ \since 6.6
+
+ Wraps the unsigned 128-bit integer \a literal in a
+ platform-independent way.
+
+ \note Unlike Q_UINT64_C(), this macro is only available in C++, not in C.
+ This is because compilers do not provide these literals as built-ins and C
+ does not have support for user-defined literals.
+
+ \sa quint128, Q_INT128_C(), Q_UINT128_MAX, Q_UINT64_C(), QT_SUPPORTS_INT128
+*/
+
+/*!
+ \macro Q_UINT128_MAX
+ \relates <QtTypes>
+ \since 6.6
+
+ This macro expands to a compile-time constant representing the
+ maximum value representable in a \l quint128.
+
+ This macro is available in both C++ and C modes.
+
+ The minimum of \l quint128 is 0 (zero), so a \c{Q_UINT128_MIN} is neither
+ needed nor provided.
+
+ \sa Q_INT128_MAX, quint128, Q_UINT128_C, QT_SUPPORTS_INT128
+*/
+
+/*!
+ \macro Q_INT128_MIN
+ \relates <QtTypes>
+ \since 6.6
+
+ This macro expands to a compile-time constant representing the
+ minimum value representable in a \l qint128.
+
+ This macro is available in both C++ and C modes.
+
+ \sa Q_INT128_MAX, qint128, Q_INT128_C, QT_SUPPORTS_INT128
+*/
+
+/*!
+ \macro Q_INT128_MAX
+ \relates <QtTypes>
+ \since 6.6
+
+ This macro expands to a compile-time constant representing the
+ maximum value representable in a \l qint128.
+
+ This macro is available in both C++ and C modes.
+
+ \sa Q_INT128_MIN, Q_UINT128_MAX, qint128, Q_INT128_C, QT_SUPPORTS_INT128
+*/
+
+// Statically check assumptions about the environment we're running
+// in. The idea here is to error or warn if otherwise implicit Qt
+// assumptions are not fulfilled on new hardware or compilers
+// (if this list becomes too long, consider factoring into a separate file)
+static_assert(UCHAR_MAX == 255, "Qt assumes that char is 8 bits");
+static_assert(sizeof(int) == 4, "Qt assumes that int is 32 bits");
+static_assert(QT_POINTER_SIZE == sizeof(void *), "QT_POINTER_SIZE defined incorrectly");
+static_assert(sizeof(float) == 4, "Qt assumes that float is 32 bits");
+static_assert(sizeof(char16_t) == 2, "Qt assumes that char16_t is 16 bits");
+static_assert(sizeof(char32_t) == 4, "Qt assumes that char32_t is 32 bits");
+#if defined(Q_OS_WIN)
+static_assert(sizeof(wchar_t) == sizeof(char16_t));
+#endif
+static_assert(std::numeric_limits<int>::radix == 2,
+ "Qt assumes binary integers");
+static_assert((std::numeric_limits<int>::max() + std::numeric_limits<int>::lowest()) == -1,
+ "Qt assumes two's complement integers");
+static_assert(sizeof(wchar_t) == sizeof(char32_t) || sizeof(wchar_t) == sizeof(char16_t),
+ "Qt assumes wchar_t is compatible with either char32_t or char16_t");
+
+// While we'd like to check for __STDC_IEC_559__, as per ISO/IEC 9899:2011
+// Annex F (C11, normative for C++11), there are a few corner cases regarding
+// denormals where GHS compiler is relying hardware behavior that is not IEC
+// 559 compliant. So split the check in several subchecks.
+
+// On GHS the compiler reports std::numeric_limits<float>::is_iec559 as false.
+// This is all right according to our needs.
+#if !defined(Q_CC_GHS)
+static_assert(std::numeric_limits<float>::is_iec559,
+ "Qt assumes IEEE 754 floating point");
+#endif
+
+// Technically, presence of NaN and infinities are implied from the above check,
+// but double checking our environment doesn't hurt...
+static_assert(std::numeric_limits<float>::has_infinity &&
+ std::numeric_limits<float>::has_quiet_NaN,
+ "Qt assumes IEEE 754 floating point");
+
+// is_iec559 checks for ISO/IEC/IEEE 60559:2011 (aka IEEE 754-2008) compliance,
+// but that allows for a non-binary radix. We need to recheck that.
+// Note how __STDC_IEC_559__ would instead check for IEC 60559:1989, aka
+// ANSI/IEEE 754−1985, which specifically implies binary floating point numbers.
+static_assert(std::numeric_limits<float>::radix == 2,
+ "Qt assumes binary IEEE 754 floating point");
+
+// not required by the definition of size_t, but we depend on this
+static_assert(sizeof(size_t) == sizeof(void *), "size_t and a pointer don't have the same size");
+static_assert(sizeof(size_t) == sizeof(qsizetype)); // implied by the definition
+static_assert((std::is_same<qsizetype, qptrdiff>::value));
+static_assert(std::is_same_v<std::size_t, size_t>);
+
+// Check that our own typedefs are not broken.
+static_assert(sizeof(qint8) == 1, "Internal error, qint8 is misdefined");
+static_assert(sizeof(qint16)== 2, "Internal error, qint16 is misdefined");
+static_assert(sizeof(qint32) == 4, "Internal error, qint32 is misdefined");
+static_assert(sizeof(qint64) == 8, "Internal error, qint64 is misdefined");
+#ifdef QT_SUPPORTS_INT128
+static_assert(sizeof(qint128) == 16, "Internal error, qint128 is misdefined");
+#endif
+
+#ifdef QT_SUPPORTS_INT128
+// Standard Library supports for 128-bit integers:
+// Implementation | Version | Note
+// ---------------------|---------|------
+// GNU libstdc++ | 11.1.0 |
+// LLVM libc++ | 3.5 | May change if compiler has __is_integral()
+// MS STL | none |
+
+# if defined(_LIBCPP_VERSION) || (defined(_GLIBCXX_RELEASE) && _GLIBCXX_RELEASE >= 11)
+static_assert(std::numeric_limits<quint128>::max() == Q_UINT128_MAX);
+# endif
+#endif
+
+QT_END_NAMESPACE
diff --git a/src/corelib/global/qtypes.h b/src/corelib/global/qtypes.h
new file mode 100644
index 0000000000..db9ba38e4c
--- /dev/null
+++ b/src/corelib/global/qtypes.h
@@ -0,0 +1,283 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// Copyright (C) 2022 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QTYPES_H
+#define QTYPES_H
+
+#include <QtCore/qprocessordetection.h>
+#include <QtCore/qtconfigmacros.h>
+#include <QtCore/qassert.h>
+
+#ifdef __cplusplus
+# include <cstddef>
+# include <cstdint>
+# if defined(__STDCPP_FLOAT16_T__) && __has_include(<stdfloat>)
+// P1467 implementation - https://wg21.link/p1467
+# include <stdfloat>
+# endif // defined(__STDCPP_FLOAT16_T__) && __has_include(<stdfloat>)
+#else
+# include <assert.h>
+#endif
+
+#if 0
+#pragma qt_class(QtTypes)
+#pragma qt_class(QIntegerForSize)
+#pragma qt_sync_stop_processing
+#endif
+
+/*
+ Useful type definitions for Qt
+*/
+typedef unsigned char uchar;
+typedef unsigned short ushort;
+typedef unsigned int uint;
+typedef unsigned long ulong;
+
+QT_BEGIN_NAMESPACE
+
+/*
+ Size-dependent types (architecture-dependent byte order)
+
+ Make sure to update QMetaType when changing these typedefs
+*/
+
+typedef signed char qint8; /* 8 bit signed */
+typedef unsigned char quint8; /* 8 bit unsigned */
+typedef short qint16; /* 16 bit signed */
+typedef unsigned short quint16; /* 16 bit unsigned */
+typedef int qint32; /* 32 bit signed */
+typedef unsigned int quint32; /* 32 bit unsigned */
+// Unlike LL / ULL in C++, for historical reasons, we force the
+// result to be of the requested type.
+#ifdef __cplusplus
+# define Q_INT64_C(c) static_cast<long long>(c ## LL) /* signed 64 bit constant */
+# define Q_UINT64_C(c) static_cast<unsigned long long>(c ## ULL) /* unsigned 64 bit constant */
+#else
+# define Q_INT64_C(c) ((long long)(c ## LL)) /* signed 64 bit constant */
+# define Q_UINT64_C(c) ((unsigned long long)(c ## ULL)) /* unsigned 64 bit constant */
+#endif
+typedef long long qint64; /* 64 bit signed */
+typedef unsigned long long quint64; /* 64 bit unsigned */
+
+typedef qint64 qlonglong;
+typedef quint64 qulonglong;
+
+#if defined(__SIZEOF_INT128__) && !defined(QT_NO_INT128)
+# define QT_SUPPORTS_INT128 __SIZEOF_INT128__
+#else
+# undef QT_SUPPORTS_INT128
+#endif
+
+#if defined(QT_SUPPORTS_INT128)
+__extension__ typedef __int128_t qint128;
+__extension__ typedef __uint128_t quint128;
+
+// limits:
+# ifdef __cplusplus /* need to avoid c-style-casts in C++ mode */
+# define QT_C_STYLE_CAST(type, x) static_cast<type>(x)
+# else /* but C doesn't have constructor-style casts */
+# define QT_C_STYLE_CAST(type, x) ((type)(x))
+# endif
+# ifndef Q_UINT128_MAX /* allow qcompilerdetection.h/user override */
+# define Q_UINT128_MAX QT_C_STYLE_CAST(quint128, -1)
+# endif
+# define Q_INT128_MAX QT_C_STYLE_CAST(qint128, Q_UINT128_MAX / 2)
+# define Q_INT128_MIN (-Q_INT128_MAX - 1)
+
+# ifdef __cplusplus
+ namespace QtPrivate::NumberLiterals {
+ namespace detail {
+ template <quint128 accu, int base>
+ constexpr quint128 construct() { return accu; }
+
+ template <quint128 accu, int base, char C, char...Cs>
+ constexpr quint128 construct()
+ {
+ if constexpr (C != '\'') { // ignore digit separators
+ const int digitValue = '0' <= C && C <= '9' ? C - '0' :
+ 'a' <= C && C <= 'z' ? C - 'a' + 10 :
+ 'A' <= C && C <= 'Z' ? C - 'A' + 10 :
+ /* else */ -1 ;
+ static_assert(digitValue >= 0 && digitValue < base,
+ "Invalid character");
+ // accu * base + digitValue <= MAX, but without overflow:
+ static_assert(accu <= (Q_UINT128_MAX - digitValue) / base,
+ "Overflow occurred");
+ return construct<accu * base + digitValue, base, Cs...>();
+ } else {
+ return construct<accu, base, Cs...>();
+ }
+ }
+
+ template <char C, char...Cs>
+ constexpr quint128 parse0xb()
+ {
+ constexpr quint128 accu = 0;
+ if constexpr (C == 'x' || C == 'X')
+ return construct<accu, 16, Cs...>(); // base 16, skip 'x'
+ else if constexpr (C == 'b' || C == 'B')
+ return construct<accu, 2, Cs...>(); // base 2, skip 'b'
+ else
+ return construct<accu, 8, C, Cs...>(); // base 8, include C
+ }
+
+ template <char...Cs>
+ constexpr quint128 parse0()
+ {
+ if constexpr (sizeof...(Cs) == 0) // this was just a literal 0
+ return 0;
+ else
+ return parse0xb<Cs...>();
+ }
+
+ template <char C, char...Cs>
+ constexpr quint128 parse()
+ {
+ if constexpr (C == '0')
+ return parse0<Cs...>(); // base 2, 8, or 16 (or just a literal 0), skip '0'
+ else
+ return construct<0, 10, C, Cs...>(); // initial accu 0, base 10, include C
+ }
+ } // namespace detail
+ template <char...Cs>
+ constexpr quint128 operator""_quint128() noexcept
+ { return QtPrivate::NumberLiterals::detail::parse<Cs...>(); }
+ template <char...Cs>
+ constexpr qint128 operator""_qint128() noexcept
+ { return qint128(QtPrivate::NumberLiterals::detail::parse<Cs...>()); }
+
+ #ifndef Q_UINT128_C // allow qcompilerdetection.h/user override
+ # define Q_UINT128_C(c) ([]{ using namespace QtPrivate::NumberLiterals; return c ## _quint128; }())
+ #endif
+ #ifndef Q_INT128_C // allow qcompilerdetection.h/user override
+ # define Q_INT128_C(c) ([]{ using namespace QtPrivate::NumberLiterals; return c ## _qint128; }())
+ #endif
+
+ } // namespace QtPrivate::NumberLiterals
+# endif // __cplusplus
+#endif // QT_SUPPORTS_INT128
+
+#ifndef __cplusplus
+// In C++ mode, we define below using QIntegerForSize template
+static_assert(sizeof(ptrdiff_t) == sizeof(size_t), "Weird ptrdiff_t and size_t definitions");
+typedef ptrdiff_t qptrdiff;
+typedef ptrdiff_t qsizetype;
+typedef ptrdiff_t qintptr;
+typedef size_t quintptr;
+
+#define PRIdQPTRDIFF "td"
+#define PRIiQPTRDIFF "ti"
+
+#define PRIdQSIZETYPE "td"
+#define PRIiQSIZETYPE "ti"
+
+#define PRIdQINTPTR "td"
+#define PRIiQINTPTR "ti"
+
+#define PRIuQUINTPTR "zu"
+#define PRIoQUINTPTR "zo"
+#define PRIxQUINTPTR "zx"
+#define PRIXQUINTPTR "zX"
+#endif
+
+#if defined(QT_COORD_TYPE)
+typedef QT_COORD_TYPE qreal;
+#else
+typedef double qreal;
+#endif
+
+#if defined(__cplusplus)
+/*
+ quintptr are qptrdiff is guaranteed to be the same size as a pointer, i.e.
+
+ sizeof(void *) == sizeof(quintptr)
+ && sizeof(void *) == sizeof(qptrdiff)
+
+ While size_t and qsizetype are not guaranteed to be the same size as a pointer,
+ they usually are and we do check for that in qtypes.cpp, just to be sure.
+*/
+template <int> struct QIntegerForSize;
+template <> struct QIntegerForSize<1> { typedef quint8 Unsigned; typedef qint8 Signed; };
+template <> struct QIntegerForSize<2> { typedef quint16 Unsigned; typedef qint16 Signed; };
+template <> struct QIntegerForSize<4> { typedef quint32 Unsigned; typedef qint32 Signed; };
+template <> struct QIntegerForSize<8> { typedef quint64 Unsigned; typedef qint64 Signed; };
+#if defined(QT_SUPPORTS_INT128)
+template <> struct QIntegerForSize<16> { typedef quint128 Unsigned; typedef qint128 Signed; };
+#endif
+template <class T> struct QIntegerForSizeof: QIntegerForSize<sizeof(T)> { };
+typedef QIntegerForSize<Q_PROCESSOR_WORDSIZE>::Signed qregisterint;
+typedef QIntegerForSize<Q_PROCESSOR_WORDSIZE>::Unsigned qregisteruint;
+typedef QIntegerForSizeof<void *>::Unsigned quintptr;
+typedef QIntegerForSizeof<void *>::Signed qptrdiff;
+typedef qptrdiff qintptr;
+using qsizetype = QIntegerForSizeof<std::size_t>::Signed;
+
+// These custom definitions are necessary as we're not defining our
+// datatypes in terms of the language ones, but in terms of integer
+// types that have the sime size. For instance, on a 32-bit platform,
+// qptrdiff is int, while ptrdiff_t may be aliased to long; therefore
+// using %td to print a qptrdiff would be wrong (and raise -Wformat
+// warnings), although both int and long have same bit size on that
+// platform.
+//
+// We know that sizeof(size_t) == sizeof(void *) == sizeof(qptrdiff).
+#if SIZE_MAX == 0xffffffffULL
+#define PRIuQUINTPTR "u"
+#define PRIoQUINTPTR "o"
+#define PRIxQUINTPTR "x"
+#define PRIXQUINTPTR "X"
+
+#define PRIdQPTRDIFF "d"
+#define PRIiQPTRDIFF "i"
+
+#define PRIdQINTPTR "d"
+#define PRIiQINTPTR "i"
+
+#define PRIdQSIZETYPE "d"
+#define PRIiQSIZETYPE "i"
+#elif SIZE_MAX == 0xffffffffffffffffULL
+#define PRIuQUINTPTR "llu"
+#define PRIoQUINTPTR "llo"
+#define PRIxQUINTPTR "llx"
+#define PRIXQUINTPTR "llX"
+
+#define PRIdQPTRDIFF "lld"
+#define PRIiQPTRDIFF "lli"
+
+#define PRIdQINTPTR "lld"
+#define PRIiQINTPTR "lli"
+
+#define PRIdQSIZETYPE "lld"
+#define PRIiQSIZETYPE "lli"
+#else
+#error Unsupported platform (unknown value for SIZE_MAX)
+#endif
+
+// Define a native float16 type
+namespace QtPrivate {
+#if defined(__STDCPP_FLOAT16_T__)
+# define QFLOAT16_IS_NATIVE 1
+using NativeFloat16Type = std::float16_t;
+#elif defined(Q_CC_CLANG) && defined(__FLT16_MAX__) && 0
+// disabled due to https://github.com/llvm/llvm-project/issues/56963
+# define QFLOAT16_IS_NATIVE 1
+using NativeFloat16Type = decltype(__FLT16_MAX__);
+#elif defined(Q_CC_GNU_ONLY) && defined(__FLT16_MAX__)
+# define QFLOAT16_IS_NATIVE 1
+# ifdef __ARM_FP16_FORMAT_IEEE
+using NativeFloat16Type = __fp16;
+# else
+using NativeFloat16Type = _Float16;
+# endif
+#else
+# define QFLOAT16_IS_NATIVE 0
+using NativeFloat16Type = void;
+#endif
+} // QtPrivate
+
+#endif // __cplusplus
+
+QT_END_NAMESPACE
+
+#endif // QTYPES_H
diff --git a/src/corelib/global/qversiontagging.cpp b/src/corelib/global/qversiontagging.cpp
index a0d15ae871..a8191869cc 100644
--- a/src/corelib/global/qversiontagging.cpp
+++ b/src/corelib/global/qversiontagging.cpp
@@ -1,58 +1,43 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2022 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qglobal.h"
+#include "qversiontagging.h"
+extern "C" {
#define SYM QT_MANGLE_NAMESPACE(qt_version_tag)
-//#define SSYM QT_STRINGIFY(SYM)
+#define SSYM QT_STRINGIFY(SYM)
+
+// With compilers that have the "alias" attribute, the macro creates a global
+// variable "qt_version_tag_M_m" (M: major, m: minor) as an alias to either
+// qt_version_tag or _qt_version_tag. Everywhere else, we simply create a new
+// global variable qt_version_tag_M_m without aliasing to a single variable.
+//
+// Additionally, on systems using ELF binaries (Linux, FreeBSD, etc.), we
+// create ELF versions by way of the .symver assembly directive[1].
+//
+// Unfortunately, Clang on Darwin systems says it supports the "alias"
+// attribute, but fails when used. That's a Clang bug (as of XCode 12).
+//
+// [1] https://sourceware.org/binutils/docs/as/Symver.html
-#if defined(Q_CC_GNU) && defined(Q_OF_ELF) && !defined(Q_OS_ANDROID)
+#if defined(Q_CC_GNU) && defined(Q_OF_ELF)
# define make_versioned_symbol2(sym, m, n, separator) \
- Q_CORE_EXPORT extern const char sym ## _ ## m ## _ ## n = 0; \
+ Q_CORE_EXPORT extern __attribute__((alias("_" SSYM))) const char sym ## _ ## m ## _ ## n; \
asm(".symver " QT_STRINGIFY(sym) "_" QT_STRINGIFY(m) "_" QT_STRINGIFY(n) ", " \
QT_STRINGIFY(sym) separator "Qt_" QT_STRINGIFY(m) "." QT_STRINGIFY(n))
+
+extern const char QT_MANGLE_NAMESPACE(_qt_version_tag) = 0;
+#elif __has_attribute(alias) && !defined(Q_OS_DARWIN)
+# define make_versioned_symbol2(sym, m, n, separator) \
+ Q_CORE_EXPORT extern __attribute__((alias(SSYM))) const char sym ## _ ## m ## _ ## n
+extern const char SYM = 0;
#else
-# define make_versioned_symbol2(sym, m, n, separator)
+# define make_versioned_symbol2(sym, m, n, separator) \
+ Q_CORE_EXPORT extern const char sym ## _ ## m ## _ ## n = 0;
#endif
#define make_versioned_symbol(sym, m, n, separator) make_versioned_symbol2(sym, m, n, separator)
-extern "C" {
#if QT_VERSION_MINOR > 0
make_versioned_symbol(SYM, QT_VERSION_MAJOR, 0, "@");
#endif
@@ -108,3 +93,9 @@ make_versioned_symbol(SYM, QT_VERSION_MAJOR, 15, "@");
// the default version:
make_versioned_symbol(SYM, QT_VERSION_MAJOR, QT_VERSION_MINOR, "@@");
}
+
+QT_BEGIN_NAMESPACE
+
+static_assert(std::is_trivially_destructible_v<QtPrivate::QVersionTag>);
+
+QT_END_NAMESPACE
diff --git a/src/corelib/global/qversiontagging.h b/src/corelib/global/qversiontagging.h
index 75c2e9df7e..965d53e88f 100644
--- a/src/corelib/global/qversiontagging.h
+++ b/src/corelib/global/qversiontagging.h
@@ -1,88 +1,138 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-// qglobal.h includes this header, so keep it outside of our include guards
-#include <QtCore/qglobal.h>
+// Copyright (C) 2022 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#if !defined(QVERSIONTAGGING_H)
#define QVERSIONTAGGING_H
+#if 0
+#pragma qt_no_master_include
+#endif
+
+#include <QtCore/qcompilerdetection.h>
+#include <QtCore/qtconfigmacros.h>
+#include <QtCore/qtversionchecks.h>
+#include <QtCore/qtypes.h>
+
QT_BEGIN_NAMESPACE
/*
- * Ugly hack warning and explanation:
+ * Explanation
+ *
+ * This file causes all libraries, plugins, and applications that #include this
+ * file to automatically pull in a symbol found in QtCore that encodes the
+ * current Qt version number at the time of compilation. The relocation is
+ * designed so that it's impossible for the dynamic linker to perform lazy
+ * binding. Instead, it must resolve at load time or fail. That way, attempting
+ * to load such a library or plugin while an older QtCore is loaded will fail.
+ * Similarly, if an older QtCore is found when launching an application, the
+ * application will fail to launch.
+ *
+ * It's also possible to inspect which version is required by decoding the
+ * .qtversion section. The second pointer-sized variable is the required
+ * version, for example, for Qt 6.4.1:
*
- * This file causes all ELF modules, be they libraries or applications, to use the
- * qt_version_tag symbol that is present in QtCore. Such symbol is versioned,
- * so the linker will automatically pull the current Qt version and add it to
- * the ELF header of the library/application. The assembly produces one section
- * called ".qtversion" containing two 32-bit values. The first is a
- * relocation to the qt_version_tag symbol (which is what causes the ELF
- * version to get used). The second value is the current Qt version at the time
- * of compilation.
+ * Hex dump of section [18] '.qtversion', 16 bytes at offset 0x1ee48:
+ * 0x00000000 b0ffffff ffffffff 01040600 00000000 ................
+ * ^^^^^^^^ ^^^^^^^^
*
* There will only be one copy of the section in the output library or application.
+ *
+ * This functionality can be disabled by defining QT_NO_VERSION_TAGGING. It's
+ * disabled if Qt was built statically.
+ *
+ * Windows notes:
+ *
+ * On Windows, the address of a __declspec(dllimport) variable is not a
+ * constant expression, unlike Unix systems. So we instead use the address of
+ * the import variable, which is created by prefixing the external name with
+ * "__imp_". Using that variable causes an import of the corresponding symbol
+ * from QtCore DLL.
+ *
+ * With MinGW (GCC and Clang), we use a C++17 inline variable, so the compiler
+ * and linker automatically merge the variables. The "used" __attribute__
+ * tells the compiler to always emit that variable, whether it's used or not.
+ *
+ * MSVC has no equivalent to that attribute, so instead we create an extern
+ * const variable and tell the linker to merge them all via
+ * __declspec(selectany).
+ *
+ * Unix notes:
+ *
+ * On Unix, we use the same C++17 inline variable solution as MinGW, but we
+ * don't need the "__imp_" trick.
+ *
+ * Additionally, on ELF systems like Linux and FreeBSD, the symbol in question
+ * is simply "qt_version_tag" in both QtCore and in this ELF module, but it
+ * has an ELF version attached to it (see qversiontagging.cpp and
+ * QtFlagHandlingHelpers.cmake). That way, the error message from the dynamic
+ * linker will say it can't find version "Qt_6.x".
*/
-#if defined(QT_BUILD_CORE_LIB) || defined(QT_BOOTSTRAPPED) || defined(QT_NO_VERSION_TAGGING) || defined(QT_STATIC)
+namespace QtPrivate {
+struct QVersionTag
+{
+ const void *symbol;
+ quintptr version;
+ constexpr QVersionTag(const void *sym, int currentVersion = QT_VERSION)
+ : symbol(sym), version(currentVersion)
+ {}
+};
+}
+
+#if !defined(QT_NO_VERSION_TAGGING) && (defined(QT_BUILD_CORE_LIB) || defined(QT_BOOTSTRAPPED) || defined(QT_STATIC))
// don't make tags in QtCore, bootstrapped systems or if the user asked not to
-#elif defined(Q_CC_GNU) && !defined(Q_OS_ANDROID)
-# if defined(Q_PROCESSOR_X86) && (defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD_KERNEL))
-# if defined(Q_PROCESSOR_X86_64) && QT_POINTER_SIZE == 8 // x86-64 64-bit
-# define QT_VERSION_TAG_RELOC(sym) ".quad " QT_STRINGIFY(QT_MANGLE_NAMESPACE(sym)) "@GOT\n"
-# else // x86 or x86-64 32-bit (x32)
-# define QT_VERSION_TAG_RELOC(sym) ".long " QT_STRINGIFY(QT_MANGLE_NAMESPACE(sym)) "@GOT\n"
-# endif
-# define QT_VERSION_TAG(sym) \
- asm ( \
- ".section .qtversion, \"aG\", @progbits, " QT_STRINGIFY(QT_MANGLE_NAMESPACE(sym)) ", comdat\n" \
- ".align 8\n" \
- QT_VERSION_TAG_RELOC(sym) \
- ".long " QT_STRINGIFY(QT_VERSION) "\n" \
- ".align 8\n" \
- ".previous" \
- )
+# define QT_NO_VERSION_TAGGING
+#endif
+
+#if defined(Q_OS_WIN)
+# ifdef Q_PROCESSOR_X86_32
+// 32-bit x86 convention does prepend a _
+# define QT_MANGLE_IMPORT_PREFIX _imp__
+# else
+// Calling convention on other architectures does not prepend a _
+# define QT_MANGLE_IMPORT_PREFIX __imp_
+# endif
+# if defined(Q_CC_MSVC_ONLY)
+# pragma section(".qtversion",read,shared)
+# define QT_VERSION_TAG_SECTION __declspec(allocate(".qtversion"))
+# define QT_VERSION_TAG_ATTRIBUTE __declspec(selectany) extern const
+# else
+# define QT_VERSION_TAG_ATTRIBUTE __attribute__((used)) constexpr inline
# endif
+# define QT_VERSION_TAG2(sym, imp) \
+ extern "C" const char * const imp; \
+ QT_VERSION_TAG_ATTRIBUTE QT_VERSION_TAG_SECTION QtPrivate::QVersionTag sym ## _used(&imp)
+# define QT_VERSION_TAG(sym, imp) QT_VERSION_TAG2(sym, imp)
+#elif defined(Q_CC_GNU) && __has_attribute(used)
+# ifdef Q_OS_DARWIN
+# define QT_VERSION_TAG_SECTION __attribute__((section("__DATA,.qtversion")))
+# endif
+# define QT_VERSION_TAG_ATTRIBUTE __attribute__((visibility("hidden"), used))
+# define QT_VERSION_TAG2(sym, imp) \
+ extern "C" Q_DECL_IMPORT const char sym; \
+ QT_VERSION_TAG_ATTRIBUTE QT_VERSION_TAG_SECTION constexpr inline QtPrivate::QVersionTag sym ## _use(&sym)
+# define QT_VERSION_TAG(sym, imp) QT_VERSION_TAG2(sym, imp)
+#endif
+
+#ifdef Q_OF_ELF
+# define QT_VERSION_TAG_SYMBOL(prefix, sym, m, n) sym
+#else
+# define QT_VERSION_TAG_SYMBOL2(prefix, sym, m, n) prefix ## sym ## _ ## m ## _ ## n
+# define QT_VERSION_TAG_SYMBOL(prefix, sym, m, n) QT_VERSION_TAG_SYMBOL2(prefix, sym, m, n)
#endif
-#if defined(QT_VERSION_TAG)
-QT_VERSION_TAG(qt_version_tag);
+#if defined(QT_VERSION_TAG) && !defined(QT_NO_VERSION_TAGGING)
+# ifndef QT_VERSION_TAG_SECTION
+# define QT_VERSION_TAG_SECTION __attribute__((section(".qtversion")))
+# endif
+# define QT_MANGLED_VERSION_TAG_IMPORT QT_VERSION_TAG_SYMBOL(QT_MANGLE_IMPORT_PREFIX, QT_MANGLE_NAMESPACE(qt_version_tag), QT_VERSION_MAJOR, QT_VERSION_MINOR)
+# define QT_MANGLED_VERSION_TAG QT_VERSION_TAG_SYMBOL(, QT_MANGLE_NAMESPACE(qt_version_tag), QT_VERSION_MAJOR, QT_VERSION_MINOR)
+
+QT_VERSION_TAG(QT_MANGLED_VERSION_TAG, QT_MANGLED_VERSION_TAG_IMPORT);
+
+# undef QT_MANGLED_VERSION_TAG
+# undef QT_MANGLED_VERSION_TAG_IMPORT
+# undef QT_VERSION_TAG_SECTION
#endif
QT_END_NAMESPACE
diff --git a/src/corelib/global/qvolatile_p.h b/src/corelib/global/qvolatile_p.h
index 211cb3d90c..36787ecd87 100644
--- a/src/corelib/global/qvolatile_p.h
+++ b/src/corelib/global/qvolatile_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QVOLATILE_P_H
#define QVOLATILE_P_H
@@ -51,7 +15,7 @@
// We mean it.
//
-#include <QtCore/qglobal.h>
+#include <QtCore/private/qglobal_p.h>
QT_BEGIN_NAMESPACE
diff --git a/src/corelib/global/qxpfunctional.h b/src/corelib/global/qxpfunctional.h
new file mode 100644
index 0000000000..cbeef8b293
--- /dev/null
+++ b/src/corelib/global/qxpfunctional.h
@@ -0,0 +1,195 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+#ifndef QXPFUNCTIONAL_H
+#define QXPFUNCTIONAL_H
+
+#include <QtCore/qglobal.h>
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. Types and functions defined in this
+// file can reliably be replaced by their std counterparts, once available.
+// You may use these definitions in your own code, but be aware that we
+// will remove them once Qt depends on the C++ version that supports
+// them in namespace std. There will be NO deprecation warning, the
+// definitions will JUST go away.
+//
+// If you can't agree to these terms, don't use these definitions!
+//
+// We mean it.
+//
+
+#include <QtCore/q23functional.h>
+#include <QtCore/q20type_traits.h>
+#include <utility>
+
+QT_BEGIN_NAMESPACE
+
+namespace qxp {
+// like P0792r9's function_ref:
+
+// [func.wrap.ref], non-owning wrapper
+template<class... S> class function_ref; // not defined
+
+// template<class R, class... ArgTypes>
+// class function_ref<R(ArgTypes...) cv noexcept(noex)>; // see below
+//
+// [func.wrap.ref.general]
+// The header provides partial specializations of function_ref for each combination
+// of the possible replacements of the placeholders cv and noex where:
+// - cv is either const or empty.
+// - noex is either true or false.
+
+namespace detail {
+
+template <typename T>
+using if_function = std::enable_if_t<std::is_function_v<T>, bool>;
+template <typename T>
+using if_non_function = std::enable_if_t<!std::is_function_v<T>, bool>;
+
+template <typename From, typename To>
+using copy_const_t = std::conditional_t<
+ std::is_const_v<From>,
+ std::add_const_t<To>,
+ To
+ >;
+
+template <class Const>
+union BoundEntityType {
+ template <typename F, if_function<F> = true>
+ explicit constexpr BoundEntityType(F *f)
+ : fun(reinterpret_cast<QFunctionPointer>(f)) {}
+ template <typename T, if_non_function<T> = true>
+ explicit constexpr BoundEntityType(T *t)
+ : obj(static_cast<Const*>(t)) {}
+ Const *obj;
+ QFunctionPointer fun;
+};
+
+template <bool noex, class Const, class R, class... ArgTypes>
+class function_ref_base
+{
+protected:
+ ~function_ref_base() = default;
+
+ using BoundEntityType = detail::BoundEntityType<Const>;
+
+ template <typename... Ts>
+ using is_invocable_using = std::conditional_t<
+ noex,
+ std::is_nothrow_invocable_r<R, Ts..., ArgTypes...>,
+ std::is_invocable_r<R, Ts..., ArgTypes...>
+ >;
+
+ using ThunkPtr = R(*)(BoundEntityType, ArgTypes&&...) noexcept(noex);
+
+ BoundEntityType m_bound_entity;
+ ThunkPtr m_thunk_ptr;
+
+public:
+ template<
+ class F,
+ std::enable_if_t<std::conjunction_v<
+ std::is_function<F>,
+ is_invocable_using<F>
+ >, bool> = true
+ >
+ Q_IMPLICIT function_ref_base(F* f) noexcept
+ : m_bound_entity(f),
+ m_thunk_ptr([](BoundEntityType ctx, ArgTypes&&... args) noexcept(noex) -> R {
+ return q23::invoke_r<R>(reinterpret_cast<F*>(ctx.fun),
+ std::forward<ArgTypes>(args)...);
+ })
+ {}
+
+ template<
+ class F,
+ std::enable_if_t<std::conjunction_v<
+ std::negation<std::is_same<q20::remove_cvref_t<F>, function_ref_base>>,
+#ifdef Q_OS_VXWORKS
+ // The VxWorks compiler is trying to match this ctor against
+ // qxp::function_ref in lieu of using the copy-constructor, so ban
+ // matching against the equivalent qxp::function_ref here.
+ // This doesn't change anything on other platforms, so to save
+ // on compile-speed, enable it only for VxWorks:
+ std::negation<
+ std::is_same<
+ q20::remove_cvref_t<F>,
+ std::conditional_t<
+ std::is_const_v<Const>,
+ qxp::function_ref<R(ArgTypes...) const noexcept(noex)>,
+ qxp::function_ref<R(ArgTypes...) noexcept(noex)>
+ >
+ >
+ >,
+#endif // Q_OS_VXWORKS
+ std::negation<std::is_member_pointer<std::remove_reference_t<F>>>,
+ is_invocable_using<copy_const_t<Const, std::remove_reference_t<F>>&>
+ >, bool> = true
+ >
+ Q_IMPLICIT constexpr function_ref_base(F&& f) noexcept
+ : m_bound_entity(std::addressof(f)),
+ m_thunk_ptr([](BoundEntityType ctx, ArgTypes&&... args) noexcept(noex) -> R {
+ using That = copy_const_t<Const, std::remove_reference_t<F>>;
+ return q23::invoke_r<R>(*static_cast<That*>(ctx.obj),
+ std::forward<ArgTypes>(args)...);
+ })
+ {}
+
+protected:
+ template <
+ class T,
+ std::enable_if_t<std::negation_v<
+ std::disjunction<
+ std::is_same<T, function_ref_base>,
+ std::is_pointer<T>
+ >
+ >, bool> = true
+ >
+ function_ref_base& operator=(T) = delete;
+
+ // Invocation [func.wrap.ref.inv]
+ R operator()(ArgTypes... args) const noexcept(noex)
+ {
+ return m_thunk_ptr(m_bound_entity, std::forward<ArgTypes>(args)...);
+ }
+
+};
+
+} // namespace detail
+
+#define QT_SPECIALIZE_FUNCTION_REF(cv, noex) \
+ template<class R, class... ArgTypes> \
+ class function_ref<R(ArgTypes...) cv noexcept( noex )> \
+ : private detail::function_ref_base< noex , cv void, R, ArgTypes...> \
+ { \
+ using base = detail::function_ref_base< noex , cv void, R, ArgTypes...>; \
+ \
+ public: \
+ using base::base; \
+ using base::operator(); \
+ } \
+ /* end */
+
+QT_SPECIALIZE_FUNCTION_REF( , false);
+QT_SPECIALIZE_FUNCTION_REF(const, false);
+QT_SPECIALIZE_FUNCTION_REF( , true );
+QT_SPECIALIZE_FUNCTION_REF(const, true );
+
+#undef QT_SPECIALIZE_FUNCTION_REF
+
+// deduction guides [func.wrap.ref.deduct]
+
+template <
+ class F,
+ detail::if_function<F> = true
+>
+function_ref(F*) -> function_ref<F>;
+
+} // namespace qxp
+
+QT_END_NAMESPACE
+
+#endif /* QXPFUNCTIONAL_H */
diff --git a/src/corelib/global/qxptype_traits.h b/src/corelib/global/qxptype_traits.h
new file mode 100644
index 0000000000..d1641e1d0d
--- /dev/null
+++ b/src/corelib/global/qxptype_traits.h
@@ -0,0 +1,121 @@
+// Copyright (C) 2023 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>, Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QXPTYPE_TRAITS_H
+#define QXPTYPE_TRAITS_H
+
+#include <QtCore/qtconfigmacros.h>
+#include <QtCore/qcompilerdetection.h>
+
+#include <type_traits>
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. Types and functions defined in this
+// file can reliably be replaced by their std counterparts, once available.
+// You may use these definitions in your own code, but be aware that we
+// will remove them once Qt depends on the C++ version that supports
+// them in namespace std. There will be NO deprecation warning, the
+// definitions will JUST go away.
+//
+// If you can't agree to these terms, don't use these definitions!
+//
+// We mean it.
+//
+
+QT_BEGIN_NAMESPACE
+
+// like std::experimental::{nonesuch,is_detected/_v}(LFTSv2)
+namespace qxp {
+
+struct nonesuch {
+ ~nonesuch() = delete;
+ nonesuch(const nonesuch&) = delete;
+ void operator=(const nonesuch&) = delete;
+};
+
+namespace _detail {
+ template <typename T, typename Void, template <typename...> class Op, typename...Args>
+ struct detector {
+ using value_t = std::false_type;
+ using type = T;
+ };
+ template <typename T, template <typename...> class Op, typename...Args>
+ struct detector<T, std::void_t<Op<Args...>>, Op, Args...> {
+ using value_t = std::true_type;
+ using type = Op<Args...>;
+ };
+} // namespace _detail
+
+template <template <typename...> class Op, typename...Args>
+using is_detected = typename _detail::detector<qxp::nonesuch, void, Op, Args...>::value_t;
+
+template <template <typename...> class Op, typename...Args>
+constexpr inline bool is_detected_v = is_detected<Op, Args...>::value;
+
+
+// qxp::is_virtual_base_of_v<B, D> is true if and only if B is a virtual base class of D.
+// Just like is_base_of:
+// * only works on complete types;
+// * B and D must be class types;
+// * ignores cv-qualifications;
+// * B may be inaccessibile.
+
+namespace _detail {
+ // Check that From* can be converted to To*, ignoring accessibility.
+ // This can be done using a C cast (see [expr.cast]/4).
+QT_WARNING_PUSH
+QT_WARNING_DISABLE_GCC("-Wold-style-cast")
+QT_WARNING_DISABLE_CLANG("-Wold-style-cast")
+ template <typename From, typename To>
+ using is_virtual_base_conversion_test = decltype(
+ (To *)std::declval<From *>()
+ );
+QT_WARNING_POP
+
+ template <typename Base, typename Derived, typename = void>
+ struct is_virtual_base_of : std::false_type {};
+
+ template <typename Base, typename Derived>
+ struct is_virtual_base_of<
+ Base, Derived,
+ std::enable_if_t<
+ std::conjunction_v<
+ // Base is a base class of Derived.
+ std::is_base_of<Base, Derived>,
+
+ // Check that Derived* can be converted to Base*, ignoring
+ // accessibility. If this is possible, then Base is
+ // an unambiguous base of Derived (=> virtual bases are always
+ // unambiguous).
+ qxp::is_detected<is_virtual_base_conversion_test, Derived, Base>,
+
+ // Check that Base* can _not_ be converted to Derived*,
+ // again ignoring accessibility. This seals the deal:
+ // if this conversion cannot happen, it means that Base is an
+ // ambiguous base and/or it is a virtual base.
+ // But we have already established that Base is an unambiguous
+ // base, hence: Base is a virtual base.
+ std::negation<
+ qxp::is_detected<is_virtual_base_conversion_test, Base, Derived>
+ >
+ >
+ >
+ > : std::true_type {};
+}
+
+template <typename Base, typename Derived>
+using is_virtual_base_of = _detail::is_virtual_base_of<std::remove_cv_t<Base>, std::remove_cv_t<Derived>>;
+
+template <typename Base, typename Derived>
+constexpr inline bool is_virtual_base_of_v = is_virtual_base_of<Base, Derived>::value;
+
+} // namespace qxp
+
+QT_END_NAMESPACE
+
+#endif // QXPTYPE_TRAITS_H
+
diff --git a/src/corelib/io/forkfd_qt.c b/src/corelib/io/forkfd_qt.c
new file mode 100644
index 0000000000..7107b2c6a0
--- /dev/null
+++ b/src/corelib/io/forkfd_qt.c
@@ -0,0 +1,15 @@
+// Copyright (C) 2016 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE
+#endif
+#include <QtCore/qglobal.h>
+
+#define FORKFD_NO_SPAWNFD
+#if defined(QT_NO_DEBUG) && !defined(NDEBUG)
+# define NDEBUG
+#endif
+
+#include <forkfd.h>
+#include "../../3rdparty/forkfd/forkfd.c"
diff --git a/src/corelib/io/forkfd_qt.cpp b/src/corelib/io/forkfd_qt.cpp
deleted file mode 100644
index cf44874153..0000000000
--- a/src/corelib/io/forkfd_qt.cpp
+++ /dev/null
@@ -1,48 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include <QtCore/qglobal.h>
-
-#define FORKFD_NO_SPAWNFD
-#if defined(QT_NO_DEBUG) && !defined(NDEBUG)
-# define NDEBUG
-#endif
-
-#include <forkfd.h>
-#include "../../3rdparty/forkfd/forkfd.c"
diff --git a/src/corelib/io/qabstractfileengine.cpp b/src/corelib/io/qabstractfileengine.cpp
index d6b2b6a10e..ea5ce13b5e 100644
--- a/src/corelib/io/qabstractfileengine.cpp
+++ b/src/corelib/io/qabstractfileengine.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "private/qabstractfileengine_p.h"
#include "private/qfsfileengine_p.h"
@@ -46,7 +10,7 @@
#include "qreadwritelock.h"
#include "qvariant.h"
// built-in handlers
-#include "qdiriterator.h"
+#include "qdirlisting.h"
#include "qstringbuilder.h"
#include <QtCore/private/qfilesystementry_p.h>
@@ -55,6 +19,19 @@
QT_BEGIN_NAMESPACE
+using namespace Qt::StringLiterals;
+
+static QString appendSlashIfNeeded(const QString &path)
+{
+ if (!path.isEmpty() && !path.endsWith(u'/')
+#ifdef Q_OS_ANDROID
+ && !path.startsWith("content:/"_L1)
+#endif
+ )
+ return QString{path + u'/'};
+ return path;
+}
+
/*!
\class QAbstractFileEngineHandler
\inmodule QtCore
@@ -101,17 +78,20 @@ QT_BEGIN_NAMESPACE
\sa QAbstractFileEngine, QAbstractFileEngine::create()
*/
-static QBasicAtomicInt qt_file_engine_handlers_in_use = Q_BASIC_ATOMIC_INITIALIZER(false);
+Q_CONSTINIT static QBasicAtomicInt qt_file_engine_handlers_in_use = Q_BASIC_ATOMIC_INITIALIZER(false);
/*
All application-wide handlers are stored in this list. The mutex must be
acquired to ensure thread safety.
*/
-Q_GLOBAL_STATIC_WITH_ARGS(QReadWriteLock, fileEngineHandlerMutex, (QReadWriteLock::Recursive))
-static bool qt_abstractfileenginehandlerlist_shutDown = false;
+Q_GLOBAL_STATIC(QReadWriteLock, fileEngineHandlerMutex, QReadWriteLock::Recursive)
+Q_CONSTINIT static bool qt_abstractfileenginehandlerlist_shutDown = false;
class QAbstractFileEngineHandlerList : public QList<QAbstractFileEngineHandler *>
{
+ Q_DISABLE_COPY_MOVE(QAbstractFileEngineHandlerList)
public:
+ QAbstractFileEngineHandlerList() = default;
+
~QAbstractFileEngineHandlerList()
{
QWriteLocker locker(fileEngineHandlerMutex());
@@ -157,29 +137,27 @@ QAbstractFileEngineHandler::~QAbstractFileEngineHandler()
Handles calls to custom file engine handlers.
*/
-QAbstractFileEngine *qt_custom_file_engine_handler_create(const QString &path)
+std::unique_ptr<QAbstractFileEngine> qt_custom_file_engine_handler_create(const QString &path)
{
- QAbstractFileEngine *engine = nullptr;
-
if (qt_file_engine_handlers_in_use.loadRelaxed()) {
QReadLocker locker(fileEngineHandlerMutex());
// check for registered handlers that can load the file
- QAbstractFileEngineHandlerList *handlers = fileEngineHandlers();
- for (int i = 0; i < handlers->size(); i++) {
- if ((engine = handlers->at(i)->create(path)))
- break;
+ for (QAbstractFileEngineHandler *handler : std::as_const(*fileEngineHandlers())) {
+ if (auto engine = handler->create(path))
+ return engine;
}
}
- return engine;
+ return nullptr;
}
/*!
- \fn QAbstractFileEngine *QAbstractFileEngineHandler::create(const QString &fileName) const
+ \fn std::unique_ptr<QAbstractFileEngine> QAbstractFileEngineHandler::create(const QString &fileName) const
- Creates a file engine for file \a fileName. Returns 0 if this
- file handler cannot handle \a fileName.
+ If this file handler can handle \a fileName, this method creates a file
+ engine and returns it wrapped in a std::unique_ptr; otherwise returns
+ nullptr.
Example:
@@ -201,16 +179,15 @@ QAbstractFileEngine *qt_custom_file_engine_handler_create(const QString &path)
\sa QAbstractFileEngineHandler
*/
-QAbstractFileEngine *QAbstractFileEngine::create(const QString &fileName)
+std::unique_ptr<QAbstractFileEngine> QAbstractFileEngine::create(const QString &fileName)
{
QFileSystemEntry entry(fileName);
QFileSystemMetaData metaData;
- QAbstractFileEngine *engine = QFileSystemEngine::resolveEntryAndCreateLegacyEngine(entry, metaData);
+ auto engine = QFileSystemEngine::createLegacyEngine(entry, metaData);
#ifndef QT_NO_FSFILEENGINE
- if (!engine)
- // fall back to regular file engine
- return new QFSFileEngine(entry.filePath());
+ if (!engine) // fall back to regular file engine
+ engine = std::make_unique<QFSFileEngine>(entry.filePath());
#endif
return engine;
@@ -264,6 +241,8 @@ QAbstractFileEngine *QAbstractFileEngine::create(const QString &fileName)
the base name).
\value AbsoluteLinkTarget The full file name of the file that this file is a
link to. (This will be empty if this file is not a link.)
+ \value RawLinkPath The raw link path of the file that this file is a
+ link to. (This will be empty if this file is not a link.)
\value CanonicalName Often very similar to AbsoluteLinkTarget. Will return the true path to the file.
\value CanonicalPathName Same as CanonicalName, excluding the base name.
\value BundleName Returns the name of the bundle implies BundleType is set.
@@ -326,20 +305,6 @@ QAbstractFileEngine *QAbstractFileEngine::create(const QString &fileName)
*/
/*!
- \enum QAbstractFileEngine::FileTime
-
- These are used by the fileTime() function.
-
- \value BirthTime When the file was born (created).
- \value MetadataChangeTime When the file's metadata was last changed.
- \value ModificationTime When the file was most recently modified.
- \value AccessTime When the file was most recently accessed (e.g.
- read or written to).
-
- \sa setFileName()
-*/
-
-/*!
\enum QAbstractFileEngine::FileOwner
\value OwnerUser The user who owns the file.
@@ -469,7 +434,7 @@ bool QAbstractFileEngine::seek(qint64 pos)
Returns \c true if the file is a sequential access device; returns
false if the file is a direct access device.
- Operations involving size() and seek(int) are not valid on
+ Operations involving size() and seek(qint64) are not valid on
sequential devices.
*/
bool QAbstractFileEngine::isSequential() const
@@ -627,12 +592,15 @@ bool QAbstractFileEngine::isRelativePath() const
QStringList QAbstractFileEngine::entryList(QDir::Filters filters, const QStringList &filterNames) const
{
QStringList ret;
- QDirIterator it(fileName(), filterNames, filters);
- while (it.hasNext()) {
- it.next();
- ret << it.fileName();
- }
+#ifdef QT_BOOTSTRAPPED
+ Q_UNUSED(filters);
+ Q_UNUSED(filterNames);
+ Q_UNREACHABLE_RETURN(ret);
+#else
+ for (const auto &dirEntry : QDirListing(fileName(), filterNames, filters))
+ ret.emplace_back(dirEntry.fileName());
return ret;
+#endif
}
/*!
@@ -732,7 +700,7 @@ QString QAbstractFileEngine::owner(FileOwner owner) const
\sa fileTime()
*/
-bool QAbstractFileEngine::setFileTime(const QDateTime &newDate, FileTime time)
+bool QAbstractFileEngine::setFileTime(const QDateTime &newDate, QFile::FileTime time)
{
Q_UNUSED(newDate);
Q_UNUSED(time);
@@ -749,7 +717,7 @@ bool QAbstractFileEngine::setFileTime(const QDateTime &newDate, FileTime time)
\sa setFileName(), QDateTime, QDateTime::isValid(), FileTime
*/
-QDateTime QAbstractFileEngine::fileTime(FileTime time) const
+QDateTime QAbstractFileEngine::fileTime(QFile::FileTime time) const
{
Q_UNUSED(time);
return QDateTime();
@@ -811,10 +779,7 @@ bool QAbstractFileEngine::atEnd() const
uchar *QAbstractFileEngine::map(qint64 offset, qint64 size, QFile::MemoryMapFlags flags)
{
- MapExtensionOption option;
- option.offset = offset;
- option.size = size;
- option.flags = flags;
+ const MapExtensionOption option(offset, size, flags);
MapExtensionReturn r;
if (!extension(MapExtension, &option, &r))
return nullptr;
@@ -835,8 +800,7 @@ uchar *QAbstractFileEngine::map(qint64 offset, qint64 size, QFile::MemoryMapFlag
*/
bool QAbstractFileEngine::unmap(uchar *address)
{
- UnMapExtensionOption options;
- options.address = address;
+ const UnMapExtensionOption options(address);
return extension(UnMapExtension, &options);
}
@@ -863,11 +827,12 @@ bool QAbstractFileEngine::cloneTo(QAbstractFileEngine *target)
\internal
If all you want is to iterate over entries in a directory, see
- QDirIterator instead. This class is only for custom file engine authors.
+ QDirListing instead. This class is useful only for custom file engine
+ authors.
QAbstractFileEngineIterator is a unidirectional single-use virtual
- iterator that plugs into QDirIterator, providing transparent proxy
- iteration for custom file engines.
+ iterator that plugs into QDirListing, providing transparent proxy
+ iteration for custom file engines (for example, QResourceFileEngine).
You can subclass QAbstractFileEngineIterator to provide an iterator when
writing your own file engine. To plug the iterator into your file system,
@@ -888,10 +853,11 @@ bool QAbstractFileEngine::cloneTo(QAbstractFileEngine *target)
You can call dirName() to get the directory name, nameFilters() to get a
stringlist of name filters, and filters() to get the entry filters.
- The pure virtual function hasNext() returns \c true if the current directory
- has at least one more entry (i.e., the directory name is valid and
- accessible, and we have not reached the end of the entry list), and false
- otherwise. Reimplement next() to seek to the next entry.
+ The pure virtual function advance(), as its name implies, advances the
+ iterator to the next entry in the current directory; if the operation
+ was successful this method returns \c true, otherwise it returns \c
+ false. You have to reimplement this function in your sub-class to work
+ with your file engine implementation.
The pure virtual function currentFileName() returns the name of the
current entry without advancing the iterator. The currentFilePath()
@@ -906,15 +872,7 @@ bool QAbstractFileEngine::cloneTo(QAbstractFileEngine *target)
Note: QAbstractFileEngineIterator does not deal with QDir::IteratorFlags;
it simply returns entries for a single directory.
- \sa QDirIterator
-*/
-
-/*!
- \enum QAbstractFileEngineIterator::EntryInfoType
- \internal
-
- This enum describes the different types of information that can be
- requested through the QAbstractFileEngineIterator::entryInfo() function.
+ \sa QDirListing
*/
/*!
@@ -924,56 +882,45 @@ bool QAbstractFileEngine::cloneTo(QAbstractFileEngine *target)
Synonym for QAbstractFileEngineIterator.
*/
-class QAbstractFileEngineIteratorPrivate
-{
-public:
- QString path;
- QDir::Filters filters;
- QStringList nameFilters;
- QFileInfo fileInfo;
-};
+/*!
+ \typedef QAbstractFileEngine::IteratorUniquePtr
+ \since 6.8
+
+ Synonym for std::unique_ptr<Iterator> (that is a
+ std::unique_ptr<QAbstractFileEngineIterator>).
+*/
/*!
Constructs a QAbstractFileEngineIterator, using the entry filters \a
filters, and wildcard name filters \a nameFilters.
*/
-QAbstractFileEngineIterator::QAbstractFileEngineIterator(QDir::Filters filters,
+QAbstractFileEngineIterator::QAbstractFileEngineIterator(const QString &path, QDir::Filters filters,
const QStringList &nameFilters)
- : d(new QAbstractFileEngineIteratorPrivate)
+ : m_filters(filters),
+ m_nameFilters(nameFilters),
+ m_path(appendSlashIfNeeded(path))
{
- d->nameFilters = nameFilters;
- d->filters = filters;
}
/*!
Destroys the QAbstractFileEngineIterator.
- \sa QDirIterator
+ \sa QDirListing
*/
QAbstractFileEngineIterator::~QAbstractFileEngineIterator()
{
}
/*!
- Returns the path for this iterator. QDirIterator is responsible for
- assigning this path; it cannot change during the iterator's lifetime.
+
+ Returns the path for this iterator. The path is set by beginEntryList().
+ The path should't be changed once iteration begins.
\sa nameFilters(), filters()
*/
QString QAbstractFileEngineIterator::path() const
{
- return d->path;
-}
-
-/*!
- \internal
-
- Sets the iterator path to \a path. This function is called from within
- QDirIterator.
-*/
-void QAbstractFileEngineIterator::setPath(const QString &path)
-{
- d->path = path;
+ return m_path;
}
/*!
@@ -983,7 +930,7 @@ void QAbstractFileEngineIterator::setPath(const QString &path)
*/
QStringList QAbstractFileEngineIterator::nameFilters() const
{
- return d->nameFilters;
+ return m_nameFilters;
}
/*!
@@ -993,7 +940,7 @@ QStringList QAbstractFileEngineIterator::nameFilters() const
*/
QDir::Filters QAbstractFileEngineIterator::filters() const
{
- return d->filters;
+ return m_filters;
}
/*!
@@ -1014,15 +961,10 @@ QDir::Filters QAbstractFileEngineIterator::filters() const
QString QAbstractFileEngineIterator::currentFilePath() const
{
QString name = currentFileName();
- if (!name.isNull()) {
- QString tmp = path();
- if (!tmp.isEmpty()) {
- if (!tmp.endsWith(QLatin1Char('/')))
- tmp.append(QLatin1Char('/'));
- name.prepend(tmp);
- }
- }
- return name;
+ if (name.isNull())
+ return name;
+
+ return path() + name;
}
/*!
@@ -1037,75 +979,42 @@ QString QAbstractFileEngineIterator::currentFilePath() const
QFileInfo QAbstractFileEngineIterator::currentFileInfo() const
{
QString path = currentFilePath();
- if (d->fileInfo.filePath() != path)
- d->fileInfo.setFile(path);
+ if (m_fileInfo.filePath() != path)
+ m_fileInfo.setFile(path);
// return a shallow copy
- return d->fileInfo;
+ return m_fileInfo;
}
/*!
- \internal
-
- Returns the entry info \a type for this iterator's current directory entry
- as a QVariant. If \a type is undefined for this entry, a null QVariant is
- returned.
-
- \sa QAbstractFileEngine::beginEntryList(), QDir::beginEntryList()
-*/
-QVariant QAbstractFileEngineIterator::entryInfo(EntryInfoType type) const
-{
- Q_UNUSED(type);
- return QVariant();
-}
-
-/*!
- \fn virtual QString QAbstractFileEngineIterator::next() = 0
+ \fn virtual bool QAbstractFileEngineIterator::advance() = 0
This pure virtual function advances the iterator to the next directory
- entry, and returns the file path to the current entry.
+ entry; if the operation was successful this method returns \c true,
+ otherwise it returs \c false.
This function can optionally make use of nameFilters() and filters() to
optimize its performance.
Reimplement this function in a subclass to advance the iterator.
-
- \sa QDirIterator::next()
*/
/*!
- \fn virtual bool QAbstractFileEngineIterator::hasNext() const = 0
-
- This pure virtual function returns \c true if there is at least one more
- entry in the current directory (i.e., the iterator path is valid and
- accessible, and the iterator has not reached the end of the entry list).
+ Returns a QAbstractFileEngine::IteratorUniquePtr, that can be used
+ to iterate over the entries in \a path, using \a filters for entry
+ filtering and \a filterNames for name filtering. This function is called
+ by QDirListing to initiate directory iteration.
- \sa QDirIterator::hasNext()
+ \sa QDirListing
*/
-
-/*!
- Returns an instance of a QAbstractFileEngineIterator using \a filters for
- entry filtering and \a filterNames for name filtering. This function is
- called by QDirIterator to initiate directory iteration.
-
- QDirIterator takes ownership of the returned instance, and deletes it when
- it's done.
-
- \sa QDirIterator
-*/
-QAbstractFileEngine::Iterator *QAbstractFileEngine::beginEntryList(QDir::Filters filters, const QStringList &filterNames)
+QAbstractFileEngine::IteratorUniquePtr
+QAbstractFileEngine::beginEntryList(const QString &path, QDir::Filters filters,
+ const QStringList &filterNames)
{
+ Q_UNUSED(path);
Q_UNUSED(filters);
Q_UNUSED(filterNames);
- return nullptr;
-}
-
-/*!
- \internal
-*/
-QAbstractFileEngine::Iterator *QAbstractFileEngine::endEntryList()
-{
- return nullptr;
+ return {};
}
/*!
diff --git a/src/corelib/io/qabstractfileengine_p.h b/src/corelib/io/qabstractfileengine_p.h
index 9649e67029..b2e0b248da 100644
--- a/src/corelib/io/qabstractfileengine_p.h
+++ b/src/corelib/io/qabstractfileengine_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QABSTRACTFILEENGINE_P_H
#define QABSTRACTFILEENGINE_P_H
@@ -55,6 +19,7 @@
#include "QtCore/qfile.h"
#include "QtCore/qdir.h"
+#include <memory>
#include <optional>
#ifdef open
@@ -109,18 +74,14 @@ public:
CanonicalPathName,
BundleName,
JunctionName,
+ RawLinkPath,
NFileNames // Must be last.
};
enum FileOwner {
OwnerUser,
OwnerGroup
};
- enum FileTime {
- AccessTime,
- BirthTime,
- MetadataChangeTime,
- ModificationTime
- };
+
virtual ~QAbstractFileEngine();
@@ -151,8 +112,8 @@ public:
virtual QString fileName(FileName file=DefaultName) const;
virtual uint ownerId(FileOwner) const;
virtual QString owner(FileOwner) const;
- virtual bool setFileTime(const QDateTime &newDate, FileTime time);
- virtual QDateTime fileTime(FileTime time) const;
+ virtual bool setFileTime(const QDateTime &newDate, QFile::FileTime time);
+ virtual QDateTime fileTime(QFile::FileTime time) const;
virtual void setFileName(const QString &file);
virtual int handle() const;
virtual bool cloneTo(QAbstractFileEngine *target);
@@ -161,8 +122,11 @@ public:
bool unmap(uchar *ptr);
typedef QAbstractFileEngineIterator Iterator;
- virtual Iterator *beginEntryList(QDir::Filters filters, const QStringList &filterNames);
- virtual Iterator *endEntryList();
+ using IteratorUniquePtr = std::unique_ptr<Iterator>;
+
+ virtual IteratorUniquePtr
+ beginEntryList(const QString &path, QDir::Filters filters, const QStringList &filterNames);
+ virtual IteratorUniquePtr endEntryList() { return {}; }
virtual qint64 read(char *data, qint64 maxlen);
virtual qint64 readLine(char *data, qint64 maxlen);
@@ -183,26 +147,33 @@ public:
{};
class MapExtensionOption : public ExtensionOption {
+ Q_DISABLE_COPY_MOVE(MapExtensionOption)
public:
qint64 offset;
qint64 size;
QFile::MemoryMapFlags flags;
+ constexpr MapExtensionOption(qint64 off, qint64 sz, QFile::MemoryMapFlags f)
+ : offset(off), size(sz), flags(f) {}
};
class MapExtensionReturn : public ExtensionReturn {
+ Q_DISABLE_COPY_MOVE(MapExtensionReturn)
public:
- uchar *address;
+ MapExtensionReturn() = default;
+ uchar *address = nullptr;
};
class UnMapExtensionOption : public ExtensionOption {
+ Q_DISABLE_COPY_MOVE(UnMapExtensionOption)
public:
- uchar *address;
+ uchar *address = nullptr;
+ constexpr UnMapExtensionOption(uchar *p) : address(p) {}
};
virtual bool extension(Extension extension, const ExtensionOption *option = nullptr, ExtensionReturn *output = nullptr);
virtual bool supportsExtension(Extension extension) const;
// Factory
- static QAbstractFileEngine *create(const QString &fileName);
+ static std::unique_ptr<QAbstractFileEngine> create(const QString &fileName);
protected:
void setError(QFile::FileError error, const QString &str);
@@ -220,21 +191,21 @@ Q_DECLARE_OPERATORS_FOR_FLAGS(QAbstractFileEngine::FileFlags)
class Q_CORE_EXPORT QAbstractFileEngineHandler
{
+ Q_DISABLE_COPY_MOVE(QAbstractFileEngineHandler)
public:
QAbstractFileEngineHandler();
virtual ~QAbstractFileEngineHandler();
- virtual QAbstractFileEngine *create(const QString &fileName) const = 0;
+ virtual std::unique_ptr<QAbstractFileEngine> create(const QString &fileName) const = 0;
};
-class QAbstractFileEngineIteratorPrivate;
class Q_CORE_EXPORT QAbstractFileEngineIterator
{
public:
- QAbstractFileEngineIterator(QDir::Filters filters, const QStringList &nameFilters);
+ QAbstractFileEngineIterator(const QString &path, QDir::Filters filters,
+ const QStringList &nameFilters);
virtual ~QAbstractFileEngineIterator();
- virtual QString next() = 0;
- virtual bool hasNext() const = 0;
+ virtual bool advance() = 0;
QString path() const;
QStringList nameFilters() const;
@@ -242,19 +213,20 @@ public:
virtual QString currentFileName() const = 0;
virtual QFileInfo currentFileInfo() const;
- QString currentFilePath() const;
+ virtual QString currentFilePath() const;
protected:
- enum EntryInfoType {
- };
- virtual QVariant entryInfo(EntryInfoType type) const;
+ mutable QFileInfo m_fileInfo;
private:
Q_DISABLE_COPY_MOVE(QAbstractFileEngineIterator)
friend class QDirIterator;
friend class QDirIteratorPrivate;
- void setPath(const QString &path);
- QScopedPointer<QAbstractFileEngineIteratorPrivate> d;
+ friend class QDirListingPrivate;
+
+ QDir::Filters m_filters;
+ QStringList m_nameFilters;
+ QString m_path;
};
class QAbstractFileEnginePrivate
@@ -273,7 +245,7 @@ public:
Q_DECLARE_PUBLIC(QAbstractFileEngine)
};
-QAbstractFileEngine *qt_custom_file_engine_handler_create(const QString &path);
+std::unique_ptr<QAbstractFileEngine> qt_custom_file_engine_handler_create(const QString &path);
QT_END_NAMESPACE
diff --git a/src/corelib/io/qbuffer.cpp b/src/corelib/io/qbuffer.cpp
index 595fcd2724..763620692c 100644
--- a/src/corelib/io/qbuffer.cpp
+++ b/src/corelib/io/qbuffer.cpp
@@ -1,46 +1,12 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qbuffer.h"
#include <QtCore/qmetaobject.h>
#include "private/qiodevice_p.h"
+#include <limits>
+
QT_BEGIN_NAMESPACE
/** QBufferPrivate **/
@@ -49,15 +15,9 @@ class QBufferPrivate : public QIODevicePrivate
Q_DECLARE_PUBLIC(QBuffer)
public:
- QBufferPrivate()
- : buf(nullptr)
-#ifndef QT_NO_QOBJECT
- , writtenSinceLastEmit(0), signalConnectionCount(0), signalsEmitted(false)
-#endif
- { }
- ~QBufferPrivate() { }
+ QBufferPrivate() = default;
- QByteArray *buf;
+ QByteArray *buf = nullptr;
QByteArray defaultBuf;
qint64 peek(char *data, qint64 maxSize) override;
@@ -67,9 +27,9 @@ public:
// private slots
void _q_emitSignals();
- qint64 writtenSinceLastEmit;
- int signalConnectionCount;
- bool signalsEmitted;
+ qint64 writtenSinceLastEmit = 0;
+ int signalConnectionCount = 0;
+ bool signalsEmitted = false;
#endif
};
@@ -212,7 +172,7 @@ QBuffer::~QBuffer()
}
/*!
- Makes QBuffer uses the QByteArray pointed to by \a
+ Makes QBuffer use the QByteArray pointed to by \a
byteArray as its internal buffer. The caller is responsible for
ensuring that \a byteArray remains valid until the QBuffer is
destroyed, or until setBuffer() is called to change the buffer.
@@ -307,16 +267,31 @@ void QBuffer::setData(const QByteArray &data)
}
/*!
- \fn void QBuffer::setData(const char *data, int size)
-
\overload
Sets the contents of the internal buffer to be the first \a size
bytes of \a data.
+
+ \note In Qt versions prior to 6.5, this function took the length as
+ an \c{int} parameter, potentially truncating sizes.
*/
+void QBuffer::setData(const char *data, qsizetype size)
+{
+ Q_D(QBuffer);
+ if (isOpen()) {
+ qWarning("QBuffer::setData: Buffer is open");
+ return;
+ }
+ d->buf->replace(qsizetype(0), d->buf->size(), // ### QByteArray lacks assign(ptr, n)
+ data, size);
+}
/*!
\reimp
+
+ Unlike QFile, opening a QBuffer QIODevice::WriteOnly does not truncate it.
+ However, pos() is set to 0. Use QIODevice::Append or QIODevice::Truncate to
+ change either behavior.
*/
bool QBuffer::open(OpenMode flags)
{
@@ -366,18 +341,19 @@ qint64 QBuffer::size() const
bool QBuffer::seek(qint64 pos)
{
Q_D(QBuffer);
- if (pos > d->buf->size() && isWritable()) {
- if (seek(d->buf->size())) {
- const qint64 gapSize = pos - d->buf->size();
- if (write(QByteArray(gapSize, 0)) != gapSize) {
- qWarning("QBuffer::seek: Unable to fill gap");
- return false;
- }
- } else {
+ const auto oldBufSize = d->buf->size();
+ constexpr qint64 MaxSeekPos = (std::numeric_limits<decltype(oldBufSize)>::max)();
+ if (pos <= MaxSeekPos && pos > oldBufSize && isWritable()) {
+ QT_TRY {
+ d->buf->resize(qsizetype(pos), '\0');
+ } QT_CATCH(const std::bad_alloc &) {} // swallow, failure case is handled below
+ if (d->buf->size() != pos) {
+ qWarning("QBuffer::seek: Unable to fill gap");
return false;
}
- } else if (pos > d->buf->size() || pos < 0) {
- qWarning("QBuffer::seek: Invalid pos: %d", int(pos));
+ }
+ if (pos > d->buf->size() || pos < 0) {
+ qWarning("QBuffer::seek: Invalid pos: %lld", pos);
return false;
}
return QIODevice::seek(pos);
@@ -421,17 +397,19 @@ qint64 QBuffer::readData(char *data, qint64 len)
qint64 QBuffer::writeData(const char *data, qint64 len)
{
Q_D(QBuffer);
- int extraBytes = pos() + len - d->buf->size();
- if (extraBytes > 0) { // overflow
- int newSize = d->buf->size() + extraBytes;
- d->buf->resize(newSize);
- if (d->buf->size() != newSize) { // could not resize
+ const quint64 required = quint64(pos()) + quint64(len); // cannot overflow (pos() ≥ 0, len ≥ 0)
+
+ if (required > quint64(d->buf->size())) { // capacity exceeded
+ // The following must hold, since qsizetype covers half the virtual address space:
+ Q_ASSERT(required <= quint64((std::numeric_limits<qsizetype>::max)()));
+ d->buf->resize(qsizetype(required));
+ if (quint64(d->buf->size()) != required) { // could not resize
qWarning("QBuffer::writeData: Memory allocation error");
return -1;
}
}
- memcpy(d->buf->data() + pos(), data, int(len));
+ memcpy(d->buf->data() + pos(), data, size_t(len));
#ifndef QT_NO_QOBJECT
d->writtenSinceLastEmit += len;
@@ -444,15 +422,22 @@ qint64 QBuffer::writeData(const char *data, qint64 len)
}
#ifndef QT_NO_QOBJECT
+static bool is_tracked_signal(const QMetaMethod &signal)
+{
+ // dynamic initialization: minimize the number of guard variables:
+ static const struct {
+ QMetaMethod readyReadSignal = QMetaMethod::fromSignal(&QBuffer::readyRead);
+ QMetaMethod bytesWrittenSignal = QMetaMethod::fromSignal(&QBuffer::bytesWritten);
+ } sigs;
+ return signal == sigs.readyReadSignal || signal == sigs.bytesWrittenSignal;
+}
/*!
\reimp
\internal
*/
void QBuffer::connectNotify(const QMetaMethod &signal)
{
- static const QMetaMethod readyReadSignal = QMetaMethod::fromSignal(&QBuffer::readyRead);
- static const QMetaMethod bytesWrittenSignal = QMetaMethod::fromSignal(&QBuffer::bytesWritten);
- if (signal == readyReadSignal || signal == bytesWrittenSignal)
+ if (is_tracked_signal(signal))
d_func()->signalConnectionCount++;
}
@@ -463,9 +448,7 @@ void QBuffer::connectNotify(const QMetaMethod &signal)
void QBuffer::disconnectNotify(const QMetaMethod &signal)
{
if (signal.isValid()) {
- static const QMetaMethod readyReadSignal = QMetaMethod::fromSignal(&QBuffer::readyRead);
- static const QMetaMethod bytesWrittenSignal = QMetaMethod::fromSignal(&QBuffer::bytesWritten);
- if (signal == readyReadSignal || signal == bytesWrittenSignal)
+ if (is_tracked_signal(signal))
d_func()->signalConnectionCount--;
} else {
d_func()->signalConnectionCount = 0;
diff --git a/src/corelib/io/qbuffer.h b/src/corelib/io/qbuffer.h
index c2aba92a10..4cbbfe7c52 100644
--- a/src/corelib/io/qbuffer.h
+++ b/src/corelib/io/qbuffer.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QBUFFER_H
#define QBUFFER_H
@@ -69,7 +33,10 @@ public:
void setBuffer(QByteArray *a);
void setData(const QByteArray &data);
- inline void setData(const char *data, int len);
+#if QT_CORE_REMOVED_SINCE(6, 5) && QT_POINTER_SIZE != 4
+ void setData(const char *data, int len) { setData(data, qsizetype(len)); }
+#endif
+ void setData(const char *data, qsizetype len);
const QByteArray &data() const;
bool open(OpenMode openMode) override;
@@ -96,9 +63,6 @@ private:
Q_PRIVATE_SLOT(d_func(), void _q_emitSignals())
};
-inline void QBuffer::setData(const char *adata, int alen)
-{ setData(QByteArray(adata, alen)); }
-
QT_END_NAMESPACE
#endif // QBUFFER_H
diff --git a/src/corelib/io/qdataurl.cpp b/src/corelib/io/qdataurl.cpp
index 9cb1b9abd0..65b934b3f6 100644
--- a/src/corelib/io/qdataurl.cpp
+++ b/src/corelib/io/qdataurl.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qplatformdefs.h"
#include "qurl.h"
@@ -43,6 +7,8 @@
QT_BEGIN_NAMESPACE
+using namespace Qt::Literals;
+
/*!
\internal
@@ -51,41 +17,45 @@ QT_BEGIN_NAMESPACE
*/
Q_CORE_EXPORT bool qDecodeDataUrl(const QUrl &uri, QString &mimeType, QByteArray &payload)
{
- if (uri.scheme() != QLatin1String("data") || !uri.host().isEmpty())
+ if (uri.scheme() != "data"_L1 || !uri.host().isEmpty())
return false;
- mimeType = QLatin1String("text/plain;charset=US-ASCII");
+ mimeType = QStringLiteral("text/plain;charset=US-ASCII");
// the following would have been the correct thing, but
// reality often differs from the specification. People have
// data: URIs with ? and #
//QByteArray data = QByteArray::fromPercentEncoding(uri.path(QUrl::FullyEncoded).toLatin1());
- QByteArray data = QByteArray::fromPercentEncoding(uri.url(QUrl::FullyEncoded | QUrl::RemoveScheme).toLatin1());
+ const QByteArray dataArray =
+ QByteArray::fromPercentEncoding(uri.url(QUrl::FullyEncoded | QUrl::RemoveScheme).toLatin1());
+ QByteArrayView data = dataArray;
// parse it:
- int pos = data.indexOf(',');
+ const qsizetype pos = data.indexOf(',');
if (pos != -1) {
- payload = data.mid(pos + 1);
+ payload = data.mid(pos + 1).toByteArray();
data.truncate(pos);
data = data.trimmed();
// find out if the payload is encoded in Base64
- if (data.endsWith(";base64")) {
+ constexpr auto base64 = ";base64"_L1;
+ if (QLatin1StringView{data}.endsWith(base64, Qt::CaseInsensitive)) {
payload = QByteArray::fromBase64(payload);
- data.chop(7);
+ data.chop(base64.size());
}
- if (data.toLower().startsWith("charset")) {
- int i = 7; // strlen("charset")
+ QLatin1StringView textPlain;
+ constexpr auto charset = "charset"_L1;
+ if (QLatin1StringView{data}.startsWith(charset, Qt::CaseInsensitive)) {
+ qsizetype i = charset.size();
while (data.at(i) == ' ')
++i;
if (data.at(i) == '=')
- data.prepend("text/plain;");
+ textPlain = "text/plain;"_L1;
}
if (!data.isEmpty())
- mimeType = QLatin1String(data.trimmed());
-
+ mimeType = textPlain + QLatin1StringView(data.trimmed());
}
return true;
diff --git a/src/corelib/io/qdataurl_p.h b/src/corelib/io/qdataurl_p.h
index fd5c7df50b..2763056cc4 100644
--- a/src/corelib/io/qdataurl_p.h
+++ b/src/corelib/io/qdataurl_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QDATAURL_P_H
#define QDATAURL_P_H
@@ -55,7 +19,6 @@
#include "QtCore/qurl.h"
#include "QtCore/qbytearray.h"
#include "QtCore/qstring.h"
-#include "QtCore/qpair.h"
QT_BEGIN_NAMESPACE
diff --git a/src/corelib/io/qdebug.cpp b/src/corelib/io/qdebug.cpp
index a7ce66ad14..64b693fea5 100644
--- a/src/corelib/io/qdebug.cpp
+++ b/src/corelib/io/qdebug.cpp
@@ -1,76 +1,35 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifdef QT_NO_DEBUG
-#undef QT_NO_DEBUG
-#endif
-#ifdef qDebug
-#undef qDebug
-#endif
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2016 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qdebug.h"
#include "private/qdebug_p.h"
#include "qmetaobject.h"
+#include <private/qlogging_p.h>
#include <private/qtextstream_p.h>
#include <private/qtools_p.h>
-#include <ctype.h>
+
+#include <array>
+#include <q20chrono.h>
QT_BEGIN_NAMESPACE
-using QtMiscUtils::toHexUpper;
-using QtMiscUtils::toHexLower;
-using QtMiscUtils::fromHex;
+using namespace QtMiscUtils;
/*
Returns a human readable representation of the first \a maxSize
- characters in \a data.
+ characters in \a data. The size, \a len, is a 64-bit quantity to
+ avoid truncation due to implicit conversions in callers.
*/
-QByteArray QtDebugUtils::toPrintable(const char *data, int len, int maxSize)
+QByteArray QtDebugUtils::toPrintable(const char *data, qint64 len, qsizetype maxSize)
{
if (!data)
return "(null)";
QByteArray out;
- for (int i = 0; i < qMin(len, maxSize); ++i) {
+ for (qsizetype i = 0; i < qMin(len, maxSize); ++i) {
char c = data[i];
- if (isprint(c)) {
+ if (isAsciiPrintable(c)) {
out += c;
} else {
switch (c) {
@@ -192,15 +151,15 @@ QByteArray QtDebugUtils::toPrintable(const char *data, int len, int maxSize)
Flushes any pending data to be written and destroys the debug stream.
*/
-// Has been defined in the header / inlined before Qt 5.4
QDebug::~QDebug()
{
if (stream && !--stream->ref) {
- if (stream->space && stream->buffer.endsWith(QLatin1Char(' ')))
+ if (stream->space && stream->buffer.endsWith(u' '))
stream->buffer.chop(1);
if (stream->message_output) {
+ QInternalMessageLogContext ctxt(stream->context);
qt_message_output(stream->type,
- stream->context,
+ ctxt,
stream->buffer);
}
delete stream;
@@ -222,7 +181,7 @@ void QDebug::putUcs4(uint ucs4)
stream->ts << "\\u" << qSetFieldWidth(4);
else
stream->ts << "\\U" << qSetFieldWidth(8);
- stream->ts << Qt::hex << qSetPadChar(QLatin1Char('0')) << ucs4 << Qt::reset;
+ stream->ts << Qt::hex << qSetPadChar(u'0') << ucs4 << Qt::reset;
}
maybeQuote('\'');
}
@@ -230,17 +189,15 @@ void QDebug::putUcs4(uint ucs4)
// These two functions return true if the character should be printed by QDebug.
// For QByteArray, this is technically identical to US-ASCII isprint();
// for QString, we use QChar::isPrint, which requires a full UCS-4 decode.
-static inline bool isPrintable(uint ucs4)
-{ return QChar::isPrint(ucs4); }
-static inline bool isPrintable(ushort uc)
-{ return QChar::isPrint(uc); }
+static inline bool isPrintable(char32_t ucs4) { return QChar::isPrint(ucs4); }
+static inline bool isPrintable(char16_t uc) { return QChar::isPrint(uc); }
static inline bool isPrintable(uchar c)
-{ return c >= ' ' && c < 0x7f; }
+{ return isAsciiPrintable(c); }
template <typename Char>
-static inline void putEscapedString(QTextStreamPrivate *d, const Char *begin, int length, bool isUnicode = true)
+static inline void putEscapedString(QTextStreamPrivate *d, const Char *begin, size_t length, bool isUnicode = true)
{
- QChar quote(QLatin1Char('"'));
+ QChar quote(u'"');
d->write(&quote, 1);
bool lastWasHexEscape = false;
@@ -250,7 +207,7 @@ static inline void putEscapedString(QTextStreamPrivate *d, const Char *begin, in
if (Q_UNLIKELY(lastWasHexEscape)) {
if (fromHex(*p) != -1) {
// yes, insert it
- QChar quotes[] = { QLatin1Char('"'), QLatin1Char('"') };
+ QChar quotes[] = { quote, quote };
d->write(quotes, 2);
}
lastWasHexEscape = false;
@@ -258,7 +215,7 @@ static inline void putEscapedString(QTextStreamPrivate *d, const Char *begin, in
if (sizeof(Char) == sizeof(QChar)) {
// Surrogate characters are category Cs (Other_Surrogate), so isPrintable = false for them
- int runLength = 0;
+ qsizetype runLength = 0;
while (p + runLength != end &&
isPrintable(p[runLength]) && p[runLength] != '\\' && p[runLength] != '"')
++runLength;
@@ -274,8 +231,8 @@ static inline void putEscapedString(QTextStreamPrivate *d, const Char *begin, in
}
// print as an escape sequence (maybe, see below for surrogate pairs)
- int buflen = 2;
- ushort buf[sizeof "\\U12345678" - 1];
+ qsizetype buflen = 2;
+ char16_t buf[std::char_traits<char>::length("\\U12345678")];
buf[0] = '\\';
switch (*p) {
@@ -311,7 +268,7 @@ static inline void putEscapedString(QTextStreamPrivate *d, const Char *begin, in
if (QChar::isHighSurrogate(*p)) {
if ((p + 1) != end && QChar::isLowSurrogate(p[1])) {
// properly-paired surrogates
- uint ucs4 = QChar::surrogateToUcs4(*p, p[1]);
+ char32_t ucs4 = QChar::surrogateToUcs4(*p, p[1]);
if (isPrintable(ucs4)) {
buf[0] = *p;
buf[1] = p[1];
@@ -334,8 +291,8 @@ static inline void putEscapedString(QTextStreamPrivate *d, const Char *begin, in
// improperly-paired surrogates, fall through
}
buf[1] = 'u';
- buf[2] = toHexUpper(ushort(*p) >> 12);
- buf[3] = toHexUpper(ushort(*p) >> 8);
+ buf[2] = toHexUpper(char16_t(*p) >> 12);
+ buf[3] = toHexUpper(char16_t(*p) >> 8);
buf[4] = toHexUpper(*p >> 4);
buf[5] = toHexUpper(*p);
buflen = 6;
@@ -355,12 +312,12 @@ void QDebug::putString(const QChar *begin, size_t length)
if (stream->noQuotes) {
// no quotes, write the string directly too (no pretty-printing)
// this respects the QTextStream state, though
- stream->ts.d_ptr->putString(begin, int(length));
+ stream->ts.d_ptr->putString(begin, qsizetype(length));
} else {
// we'll reset the QTextStream formatting mechanisms, so save the state
QDebugStateSaver saver(*this);
stream->ts.d_ptr->params.reset();
- putEscapedString(stream->ts.d_ptr.data(), reinterpret_cast<const ushort *>(begin), int(length));
+ putEscapedString(stream->ts.d_ptr.data(), reinterpret_cast<const char16_t *>(begin), length);
}
}
@@ -373,17 +330,188 @@ void QDebug::putByteArray(const char *begin, size_t length, Latin1Content conten
if (stream->noQuotes) {
// no quotes, write the string directly too (no pretty-printing)
// this respects the QTextStream state, though
- QString string = content == ContainsLatin1 ? QString::fromLatin1(begin, int(length)) : QString::fromUtf8(begin, int(length));
+ QString string = content == ContainsLatin1 ? QString::fromLatin1(begin, qsizetype(length))
+ : QString::fromUtf8(begin, qsizetype(length));
stream->ts.d_ptr->putString(string);
} else {
// we'll reset the QTextStream formatting mechanisms, so save the state
QDebugStateSaver saver(*this);
stream->ts.d_ptr->params.reset();
putEscapedString(stream->ts.d_ptr.data(), reinterpret_cast<const uchar *>(begin),
- int(length), content == ContainsLatin1);
+ length, content == ContainsLatin1);
}
}
+static QByteArray timeUnit(qint64 num, qint64 den)
+{
+ using namespace std::chrono;
+ using namespace q20::chrono;
+
+ if (num == 1 && den > 1) {
+ // sub-multiple of seconds
+ char prefix = '\0';
+ auto tryprefix = [&](auto d, char c) {
+ static_assert(decltype(d)::num == 1, "not an SI prefix");
+ if (den == decltype(d)::den)
+ prefix = c;
+ };
+
+ // "u" should be "µ", but debugging output is not always UTF-8-safe
+ tryprefix(std::milli{}, 'm');
+ tryprefix(std::micro{}, 'u');
+ tryprefix(std::nano{}, 'n');
+ tryprefix(std::pico{}, 'p');
+ tryprefix(std::femto{}, 'f');
+ tryprefix(std::atto{}, 'a');
+ // uncommon ones later
+ tryprefix(std::centi{}, 'c');
+ tryprefix(std::deci{}, 'd');
+ if (prefix) {
+ char unit[3] = { prefix, 's' };
+ return QByteArray(unit, sizeof(unit) - 1);
+ }
+ }
+
+ const char *unit = nullptr;
+ if (num > 1 && den == 1) {
+ // multiple of seconds - but we don't use SI prefixes
+ auto tryunit = [&](auto d, const char *name) {
+ static_assert(decltype(d)::period::den == 1, "not a multiple of a second");
+ if (unit || num % decltype(d)::period::num)
+ return;
+ unit = name;
+ num /= decltype(d)::period::num;
+ };
+ tryunit(years{}, "yr");
+ tryunit(weeks{}, "wk");
+ tryunit(days{}, "d");
+ tryunit(hours{}, "h");
+ tryunit(minutes{}, "min");
+ }
+ if (!unit)
+ unit = "s";
+
+ if (num == 1 && den == 1)
+ return unit;
+ if (Q_UNLIKELY(num < 1 || den < 1))
+ return QString::asprintf("<invalid time unit %lld/%lld>", num, den).toLatin1();
+
+ // uncommon units: will return something like "[2/3]s"
+ // strlen("[/]min") = 6
+ char buf[2 * (std::numeric_limits<qint64>::digits10 + 2) + 10];
+ size_t len = 0;
+ auto appendChar = [&](char c) {
+ Q_ASSERT(len < sizeof(buf));
+ buf[len++] = c;
+ };
+ auto appendNumber = [&](qint64 value) {
+ if (value >= 10'000 && (value % 1000) == 0)
+ len += qsnprintf(buf + len, sizeof(buf) - len, "%.6g", double(value)); // "1e+06"
+ else
+ len += qsnprintf(buf + len, sizeof(buf) - len, "%lld", value);
+ };
+ appendChar('[');
+ appendNumber(num);
+ if (den != 1) {
+ appendChar('/');
+ appendNumber(den);
+ }
+ appendChar(']');
+ memcpy(buf + len, unit, strlen(unit));
+ return QByteArray(buf, len + strlen(unit));
+}
+
+/*!
+ \since 6.6
+ \internal
+ Helper to the std::chrono::duration debug streaming output.
+ */
+void QDebug::putTimeUnit(qint64 num, qint64 den)
+{
+ stream->ts << timeUnit(num, den); // ### optimize
+}
+
+namespace {
+
+#ifdef QT_SUPPORTS_INT128
+
+constexpr char Q_INT128_MIN_STR[] = "-170141183460469231731687303715884105728";
+
+constexpr int Int128BufferSize = sizeof(Q_INT128_MIN_STR);
+using Int128Buffer = std::array<char, Int128BufferSize>;
+ // numeric_limits<qint128>::digits10 may not exist
+
+static char *i128ToStringHelper(Int128Buffer &buffer, quint128 n)
+{
+ auto dst = buffer.data() + buffer.size();
+ *--dst = '\0'; // NUL-terminate
+ if (n == 0) {
+ *--dst = '0'; // and done
+ } else {
+ while (n != 0) {
+ *--dst = "0123456789"[n % 10];
+ n /= 10;
+ }
+ }
+ return dst;
+}
+#endif // QT_SUPPORTS_INT128
+
+[[maybe_unused]]
+static const char *int128Warning()
+{
+ const char *msg = "Qt was not compiled with int128 support.";
+ qWarning("%s", msg);
+ return msg;
+}
+
+} // unnamed namespace
+
+/*!
+ \since 6.7
+ \internal
+ Helper to the qint128 debug streaming output.
+ */
+void QDebug::putInt128([[maybe_unused]] const void *p)
+{
+#ifdef QT_SUPPORTS_INT128
+ Q_ASSERT(p);
+ qint128 i;
+ memcpy(&i, p, sizeof(i)); // alignment paranoia
+ if (i == Q_INT128_MIN) {
+ // -i is not representable, hardcode the result:
+ stream->ts << Q_INT128_MIN_STR;
+ } else {
+ Int128Buffer buffer;
+ auto dst = i128ToStringHelper(buffer, i < 0 ? -i : i);
+ if (i < 0)
+ *--dst = '-';
+ stream->ts << dst;
+ }
+ return;
+#endif // QT_SUPPORTS_INT128
+ stream->ts << int128Warning();
+}
+
+/*!
+ \since 6.7
+ \internal
+ Helper to the quint128 debug streaming output.
+ */
+void QDebug::putUInt128([[maybe_unused]] const void *p)
+{
+#ifdef QT_SUPPORTS_INT128
+ Q_ASSERT(p);
+ quint128 i;
+ memcpy(&i, p, sizeof(i)); // alignment paranoia
+ Int128Buffer buffer;
+ stream->ts << i128ToStringHelper(buffer, i);
+ return;
+#endif // QT_SUPPORTS_INT128
+ stream->ts << int128Warning();
+}
+
+
/*!
\fn QDebug::swap(QDebug &other)
\since 5.0
@@ -460,6 +588,29 @@ QDebug &QDebug::resetFormat()
/*!
+ \fn bool QDebug::quoteStrings() const
+ \since 6.7
+
+ Returns \c true if this QDebug instance will quote strings streamed into
+ it (which is the default).
+
+ \sa QDebugStateSaver, quote(), noquote(), setQuoteStrings()
+*/
+
+/*!
+ \fn void QDebug::setQuoteStrings(bool b)
+ \since 6.7
+
+ Enables quoting of strings streamed into this QDebug instance if \a b is
+ \c true; otherwise quoting is disabled.
+
+ The default is to quote strings.
+
+ \sa QDebugStateSaver, quote(), noquote(), quoteStrings()
+*/
+
+
+/*!
\fn QDebug &QDebug::quote()
\since 5.4
@@ -728,7 +879,7 @@ QDebug &QDebug::resetFormat()
*/
/*!
- \fn QDebug &QDebug::operator<<(QLatin1String t)
+ \fn QDebug &QDebug::operator<<(QLatin1StringView t)
Writes the string, \a t, to the stream and returns a reference to the
stream. Normally, QDebug prints the string inside quotes and transforms
@@ -798,6 +949,53 @@ QDebug &QDebug::resetFormat()
*/
/*!
+ \since 6.5
+ \fn template <typename Char, typename...Args> QDebug &QDebug::operator<<(const std::basic_string<Char, Args...> &s)
+ \fn template <typename Char, typename...Args> QDebug &QDebug::operator<<(std::basic_string_view<Char, Args...> s)
+
+ Writes the string or string-view \a s to the stream and returns a reference
+ to the stream.
+
+ These operators only participate in overload resolution if \c Char is one of
+ \list
+ \li char
+ \li char8_t (C++20 only)
+ \li char16_t
+ \li char32_t
+ \li wchar_t
+ \endlist
+*/
+
+/*!
+ \since 6.6
+ \fn template <typename Rep, typename Period> QDebug &QDebug::operator<<(std::chrono::duration<Rep, Period> duration)
+
+ Prints the time duration \a duration to the stream and returns a reference
+ to the stream. The printed string is the numeric representation of the
+ period followed by the time unit, similar to what the C++ Standard Library
+ would produce with \c{std::ostream}.
+
+ The unit is not localized.
+*/
+
+/*!
+ \fn template <typename T, QDebug::if_qint128<T>> QDebug::operator<<(T i)
+ \fn template <typename T, QDebug::if_quint128<T>> QDebug::operator<<(T i)
+ \since 6.7
+
+ Prints the textual representation of the 128-bit integer \a i.
+
+ \note This operator is only available if Qt supports 128-bit integer types.
+ If 128-bit integer types are available in your build, but the Qt libraries
+ were compiled without, the operator will print a warning instead.
+
+ \note Because the operator is a function template, no implicit conversions
+ are performed on its argument. It must be exactly qint128/quint128.
+
+ \sa QT_SUPPORTS_INT128
+*/
+
+/*!
\fn template <class T> QString QDebug::toString(T &&object)
\since 6.0
@@ -898,7 +1096,7 @@ QDebug &QDebug::resetFormat()
*/
/*!
- \fn template <class T1, class T2> QDebug operator<<(QDebug debug, const QPair<T1, T2> &pair)
+ \fn template <class T1, class T2> QDebug operator<<(QDebug debug, const std::pair<T1, T2> &pair)
\relates QDebug
Writes the contents of \a pair to \a debug. Both \c T1 and
@@ -906,11 +1104,12 @@ QDebug &QDebug::resetFormat()
*/
/*!
- \fn template <class T1, class T2> QDebug operator<<(QDebug debug, const std::pair<T1, T2> &pair)
+ \since 6.7
+ \fn template <class T> QDebug operator<<(QDebug debug, const std::optional<T> &opt)
\relates QDebug
- Writes the contents of \a pair to \a debug. Both \c T1 and
- \c T2 need to support streaming into QDebug.
+ Writes the contents of \a opt (or \c nullopt if not set) to \a debug.
+ \c T needs to support streaming into QDebug.
*/
/*!
@@ -946,6 +1145,13 @@ QDebug &QDebug::resetFormat()
*/
/*!
+ \since 6.7
+ \fn QDebug &QDebug::operator<<(std::nullopt_t)
+
+ Writes nullopt to the stream.
+*/
+
+/*!
\class QDebugStateSaver
\inmodule QtCore
\brief Convenience class for custom QDebug operators.
@@ -961,6 +1167,10 @@ QDebug &QDebug::resetFormat()
so that using << Qt::hex in a QDebug operator doesn't affect other QDebug
operators.
+ QDebugStateSaver is typically used in the implementation of an operator<<() for debugging:
+
+ \snippet customtype/customtypeexample.cpp custom type streaming operator
+
\since 5.1
*/
@@ -979,7 +1189,7 @@ public:
{
const bool currentSpaces = m_stream->space;
if (currentSpaces && !m_spaces)
- if (m_stream->buffer.endsWith(QLatin1Char(' ')))
+ if (m_stream->buffer.endsWith(u' '))
m_stream->buffer.chop(1);
m_stream->space = m_spaces;
@@ -1040,7 +1250,6 @@ void qt_QMetaEnum_flagDebugOperator(QDebug &debug, size_t sizeofT, int value)
#ifndef QT_NO_QOBJECT
/*!
- \fn QDebug qt_QMetaEnum_debugOperator(QDebug &, int value, const QMetaObject *, const char *name)
\internal
Formats the given enum \a value for debug output.
@@ -1087,7 +1296,7 @@ QDebug qt_QMetaEnum_debugOperator(QDebug &dbg, qint64 value, const QMetaObject *
dbg << scope << u"::";
}
- const char *key = me.valueToKey(value);
+ const char *key = me.valueToKey(static_cast<int>(value));
const bool scoped = me.isScoped() || verbosity & 1;
if (scoped || !key)
dbg << me.enumName() << (!key ? u"(" : u"::");
@@ -1156,7 +1365,7 @@ QDebug qt_QMetaEnum_flagDebugOperator(QDebug &debug, quint64 value, const QMetaO
debug << '(';
}
- debug << me.valueToKeys(value);
+ debug << me.valueToKeys(static_cast<int>(value));
if (enumScope)
debug << ')';
diff --git a/src/corelib/io/qdebug.h b/src/corelib/io/qdebug.h
index bfcdf42f0d..4797bcd169 100644
--- a/src/corelib/io/qdebug.h
+++ b/src/corelib/io/qdebug.h
@@ -1,67 +1,41 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2016 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QDEBUG_H
#define QDEBUG_H
-#include <QtCore/qalgorithms.h>
-#include <QtCore/qhash.h>
-#include <QtCore/qlist.h>
-#include <QtCore/qmap.h>
+#if 0
+#pragma qt_class(QtDebug)
+#endif
+
+#include <QtCore/qcontainerfwd.h>
#include <QtCore/qtextstream.h>
+#include <QtCore/qtypes.h>
#include <QtCore/qstring.h>
-#include <QtCore/qset.h>
-#include <QtCore/qvarlengtharray.h>
#include <QtCore/qcontiguouscache.h>
#include <QtCore/qsharedpointer.h>
// all these have already been included by various headers above, but don't rely on indirect includes:
-#include <vector>
+#include <chrono>
#include <list>
#include <map>
+#include <optional>
+#include <string>
+#include <string_view>
#include <utility>
+#include <vector>
-QT_BEGIN_NAMESPACE
+#if !defined(QT_LEAN_HEADERS) || QT_LEAN_HEADERS < 1
+# include <QtCore/qlist.h>
+# include <QtCore/qmap.h>
+# include <QtCore/qset.h>
+# include <QtCore/qvarlengtharray.h>
+#endif
+QT_BEGIN_NAMESPACE
-class Q_CORE_EXPORT QDebug : public QIODeviceBase
+class QT6_ONLY(Q_CORE_EXPORT) QDebug : public QIODeviceBase
{
friend class QMessageLogger;
friend class QDebugStateSaver;
@@ -93,21 +67,24 @@ class Q_CORE_EXPORT QDebug : public QIODeviceBase
enum Latin1Content { ContainsBinary = 0, ContainsLatin1 };
- void putUcs4(uint ucs4);
- void putString(const QChar *begin, size_t length);
- void putByteArray(const char *begin, size_t length, Latin1Content content);
+ QT7_ONLY(Q_CORE_EXPORT) void putUcs4(uint ucs4);
+ QT7_ONLY(Q_CORE_EXPORT) void putString(const QChar *begin, size_t length);
+ QT7_ONLY(Q_CORE_EXPORT) void putByteArray(const char *begin, size_t length, Latin1Content content);
+ QT7_ONLY(Q_CORE_EXPORT) void putTimeUnit(qint64 num, qint64 den);
+ QT7_ONLY(Q_CORE_EXPORT) void putInt128(const void *i);
+ QT7_ONLY(Q_CORE_EXPORT) void putUInt128(const void *i);
public:
explicit QDebug(QIODevice *device) : stream(new Stream(device)) {}
explicit QDebug(QString *string) : stream(new Stream(string)) {}
explicit QDebug(QtMsgType t) : stream(new Stream(t)) {}
QDebug(const QDebug &o) : stream(o.stream) { ++stream->ref; }
- QDebug(QDebug &&other) noexcept : stream{qExchange(other.stream, nullptr)} {}
+ QDebug(QDebug &&other) noexcept : stream{std::exchange(other.stream, nullptr)} {}
inline QDebug &operator=(const QDebug &other);
QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_MOVE_AND_SWAP(QDebug)
~QDebug();
- inline void swap(QDebug &other) noexcept { qSwap(stream, other.stream); }
+ void swap(QDebug &other) noexcept { qt_ptr_swap(stream, other.stream); }
- QDebug &resetFormat();
+ QT7_ONLY(Q_CORE_EXPORT) QDebug &resetFormat();
inline QDebug &space() { stream->space = true; stream->ts << ' '; return *this; }
inline QDebug &nospace() { stream->space = false; return *this; }
@@ -120,6 +97,9 @@ public:
bool autoInsertSpaces() const { return stream->space; }
void setAutoInsertSpaces(bool b) { stream->space = b; }
+ [[nodiscard]] bool quoteStrings() const noexcept { return !stream->noQuotes; }
+ void setQuoteStrings(bool b) { stream->noQuotes = !b; }
+
inline QDebug &quote() { stream->noQuotes = false; return *this; }
inline QDebug &noquote() { stream->noQuotes = true; return *this; }
inline QDebug &maybeQuote(char c = '"') { if (!stream->noQuotes) stream->ts << c; return *this; }
@@ -129,7 +109,7 @@ public:
inline QDebug &operator<<(char t) { stream->ts << t; return maybeSpace(); }
inline QDebug &operator<<(signed short t) { stream->ts << t; return maybeSpace(); }
inline QDebug &operator<<(unsigned short t) { stream->ts << t; return maybeSpace(); }
- inline QDebug &operator<<(char16_t t) { return *this << QChar(ushort(t)); }
+ inline QDebug &operator<<(char16_t t) { return *this << QChar(t); }
inline QDebug &operator<<(char32_t t) { putUcs4(t); return maybeSpace(); }
inline QDebug &operator<<(signed int t) { stream->ts << t; return maybeSpace(); }
inline QDebug &operator<<(unsigned int t) { stream->ts << t; return maybeSpace(); }
@@ -137,20 +117,20 @@ public:
inline QDebug &operator<<(unsigned long t) { stream->ts << t; return maybeSpace(); }
inline QDebug &operator<<(qint64 t) { stream->ts << t; return maybeSpace(); }
inline QDebug &operator<<(quint64 t) { stream->ts << t; return maybeSpace(); }
+ inline QDebug &operator<<(qfloat16 t) { stream->ts << t; return maybeSpace(); }
inline QDebug &operator<<(float t) { stream->ts << t; return maybeSpace(); }
inline QDebug &operator<<(double t) { stream->ts << t; return maybeSpace(); }
inline QDebug &operator<<(const char* t) { stream->ts << QString::fromUtf8(t); return maybeSpace(); }
inline QDebug &operator<<(const char16_t *t) { stream->ts << QStringView(t); return maybeSpace(); }
-#if QT_STRINGVIEW_LEVEL < 2
- inline QDebug &operator<<(const QString & t) { putString(t.constData(), uint(t.length())); return maybeSpace(); }
-#endif
+ inline QDebug &operator<<(const QString & t) { putString(t.constData(), size_t(t.size())); return maybeSpace(); }
inline QDebug &operator<<(QStringView s) { putString(s.data(), size_t(s.size())); return maybeSpace(); }
inline QDebug &operator<<(QUtf8StringView s) { putByteArray(reinterpret_cast<const char*>(s.data()), s.size(), ContainsBinary); return maybeSpace(); }
- inline QDebug &operator<<(QLatin1String t) { putByteArray(t.latin1(), t.size(), ContainsLatin1); return maybeSpace(); }
+ inline QDebug &operator<<(QLatin1StringView t) { putByteArray(t.latin1(), t.size(), ContainsLatin1); return maybeSpace(); }
inline QDebug &operator<<(const QByteArray & t) { putByteArray(t.constData(), t.size(), ContainsBinary); return maybeSpace(); }
inline QDebug &operator<<(QByteArrayView t) { putByteArray(t.constData(), t.size(), ContainsBinary); return maybeSpace(); }
inline QDebug &operator<<(const void * t) { stream->ts << t; return maybeSpace(); }
inline QDebug &operator<<(std::nullptr_t) { stream->ts << "(nullptr)"; return maybeSpace(); }
+ inline QDebug &operator<<(std::nullopt_t) { stream->ts << "nullopt"; return maybeSpace(); }
inline QDebug &operator<<(QTextStreamFunction f) {
stream->ts << f;
return *this;
@@ -159,6 +139,89 @@ public:
inline QDebug &operator<<(QTextStreamManipulator m)
{ stream->ts << m; return *this; }
+#ifdef Q_QDOC
+ template <typename Char, typename...Args>
+ QDebug &operator<<(const std::basic_string<Char, Args...> &s);
+
+ template <typename Char, typename...Args>
+ QDebug &operator<<(std::basic_string_view<Char, Args...> s);
+#else
+ template <typename...Args>
+ QDebug &operator<<(const std::basic_string<char, Args...> &s)
+ { return *this << QUtf8StringView(s); }
+
+ template <typename...Args>
+ QDebug &operator<<(std::basic_string_view<char, Args...> s)
+ { return *this << QUtf8StringView(s); }
+
+#ifdef __cpp_char8_t
+ template <typename...Args>
+ QDebug &operator<<(const std::basic_string<char8_t, Args...> &s)
+ { return *this << QUtf8StringView(s); }
+
+ template <typename...Args>
+ QDebug &operator<<(std::basic_string_view<char8_t, Args...> s)
+ { return *this << QUtf8StringView(s); }
+#endif // __cpp_char8_t
+
+ template <typename...Args>
+ QDebug &operator<<(const std::basic_string<char16_t, Args...> &s)
+ { return *this << QStringView(s); }
+
+ template <typename...Args>
+ QDebug &operator<<(std::basic_string_view<char16_t, Args...> s)
+ { return *this << QStringView(s); }
+
+ template <typename...Args>
+ QDebug &operator<<(const std::basic_string<wchar_t, Args...> &s)
+ {
+ if constexpr (sizeof(wchar_t) == 2)
+ return *this << QStringView(s);
+ else
+ return *this << QString::fromWCharArray(s.data(), s.size()); // ### optimize
+ }
+
+ template <typename...Args>
+ QDebug &operator<<(std::basic_string_view<wchar_t, Args...> s)
+ {
+ if constexpr (sizeof(wchar_t) == 2)
+ return *this << QStringView(s);
+ else
+ return *this << QString::fromWCharArray(s.data(), s.size()); // ### optimize
+ }
+
+ template <typename...Args>
+ QDebug &operator<<(const std::basic_string<char32_t, Args...> &s)
+ { return *this << QString::fromUcs4(s.data(), s.size()); }
+
+ template <typename...Args>
+ QDebug &operator<<(std::basic_string_view<char32_t, Args...> s)
+ { return *this << QString::fromUcs4(s.data(), s.size()); }
+#endif // !Q_QDOC
+
+ template <typename Rep, typename Period>
+ QDebug &operator<<(std::chrono::duration<Rep, Period> duration)
+ {
+ stream->ts << duration.count();
+ putTimeUnit(Period::num, Period::den);
+ return maybeSpace();
+ }
+
+#ifdef QT_SUPPORTS_INT128
+private:
+ // Constrained templates so they only match q(u)int128 without conversions.
+ // Also keeps these operators out of the ABI.
+ template <typename T>
+ using if_qint128 = std::enable_if_t<std::is_same_v<T, qint128>, bool>;
+ template <typename T>
+ using if_quint128 = std::enable_if_t<std::is_same_v<T, quint128>, bool>;
+public:
+ template <typename T, if_qint128<T> = true>
+ QDebug &operator<<(T i128) { putInt128(&i128); return maybeSpace(); }
+ template <typename T, if_quint128<T> = true>
+ QDebug &operator<<(T u128) { putUInt128(&u128); return maybeSpace(); }
+#endif // QT_SUPPORTS_INT128
+
template <typename T>
static QString toString(T &&object)
{
@@ -172,10 +235,12 @@ public:
Q_DECLARE_SHARED(QDebug)
class QDebugStateSaverPrivate;
-class Q_CORE_EXPORT QDebugStateSaver
+class QDebugStateSaver
{
public:
+ Q_NODISCARD_CTOR Q_CORE_EXPORT
QDebugStateSaver(QDebug &dbg);
+ Q_CORE_EXPORT
~QDebugStateSaver();
private:
Q_DISABLE_COPY(QDebugStateSaver)
@@ -248,66 +313,83 @@ template<typename Container, typename ...T>
using QDebugIfHasDebugStreamContainer =
std::enable_if_t<std::conjunction_v<QTypeTraits::has_ostream_operator_container<QDebug, Container, T>...>, QDebug>;
-#ifndef Q_CLANG_QDOC
+#ifndef Q_QDOC
template<typename T>
inline QDebugIfHasDebugStreamContainer<QList<T>, T> operator<<(QDebug debug, const QList<T> &vec)
{
- return QtPrivate::printSequentialContainer(debug, "QList", vec);
+ return QtPrivate::printSequentialContainer(std::move(debug), "QList", vec);
}
template<typename T, qsizetype P>
inline QDebugIfHasDebugStream<T> operator<<(QDebug debug, const QVarLengthArray<T, P> &vec)
{
- return QtPrivate::printSequentialContainer(debug, "QVarLengthArray", vec);
+ return QtPrivate::printSequentialContainer(std::move(debug), "QVarLengthArray", vec);
}
template <typename T, typename Alloc>
inline QDebugIfHasDebugStream<T> operator<<(QDebug debug, const std::vector<T, Alloc> &vec)
{
- return QtPrivate::printSequentialContainer(debug, "std::vector", vec);
+ return QtPrivate::printSequentialContainer(std::move(debug), "std::vector", vec);
}
template <typename T, typename Alloc>
inline QDebugIfHasDebugStream<T> operator<<(QDebug debug, const std::list<T, Alloc> &vec)
{
- return QtPrivate::printSequentialContainer(debug, "std::list", vec);
+ return QtPrivate::printSequentialContainer(std::move(debug), "std::list", vec);
+}
+
+template <typename T>
+inline QDebugIfHasDebugStream<T> operator<<(QDebug debug, std::initializer_list<T> list)
+{
+ return QtPrivate::printSequentialContainer(std::move(debug), "std::initializer_list", list);
}
template <typename Key, typename T, typename Compare, typename Alloc>
inline QDebugIfHasDebugStream<Key, T> operator<<(QDebug debug, const std::map<Key, T, Compare, Alloc> &map)
{
- return QtPrivate::printSequentialContainer(debug, "std::map", map); // yes, sequential: *it is std::pair
+ return QtPrivate::printSequentialContainer(std::move(debug), "std::map", map); // yes, sequential: *it is std::pair
}
template <typename Key, typename T, typename Compare, typename Alloc>
inline QDebugIfHasDebugStream<Key, T> operator<<(QDebug debug, const std::multimap<Key, T, Compare, Alloc> &map)
{
- return QtPrivate::printSequentialContainer(debug, "std::multimap", map); // yes, sequential: *it is std::pair
+ return QtPrivate::printSequentialContainer(std::move(debug), "std::multimap", map); // yes, sequential: *it is std::pair
}
template <class Key, class T>
inline QDebugIfHasDebugStreamContainer<QMap<Key, T>, Key, T> operator<<(QDebug debug, const QMap<Key, T> &map)
{
- return QtPrivate::printAssociativeContainer(debug, "QMap", map);
+ return QtPrivate::printAssociativeContainer(std::move(debug), "QMap", map);
}
template <class Key, class T>
inline QDebugIfHasDebugStreamContainer<QMultiMap<Key, T>, Key, T> operator<<(QDebug debug, const QMultiMap<Key, T> &map)
{
- return QtPrivate::printAssociativeContainer(debug, "QMultiMap", map);
+ return QtPrivate::printAssociativeContainer(std::move(debug), "QMultiMap", map);
}
template <class Key, class T>
inline QDebugIfHasDebugStreamContainer<QHash<Key, T>, Key, T> operator<<(QDebug debug, const QHash<Key, T> &hash)
{
- return QtPrivate::printAssociativeContainer(debug, "QHash", hash);
+ return QtPrivate::printAssociativeContainer(std::move(debug), "QHash", hash);
}
template <class Key, class T>
inline QDebugIfHasDebugStreamContainer<QMultiHash<Key, T>, Key, T> operator<<(QDebug debug, const QMultiHash<Key, T> &hash)
{
- return QtPrivate::printAssociativeContainer(debug, "QMultiHash", hash);
+ return QtPrivate::printAssociativeContainer(std::move(debug), "QMultiHash", hash);
+}
+
+template <class T>
+inline QDebugIfHasDebugStream<T> operator<<(QDebug debug, const std::optional<T> &opt)
+{
+ const QDebugStateSaver saver(debug);
+ if (!opt)
+ debug.nospace() << std::nullopt;
+ else
+ debug.nospace() << "std::optional(" << *opt << ')';
+ return debug;
}
template <class T1, class T2>
@@ -321,7 +403,7 @@ inline QDebugIfHasDebugStream<T1, T2> operator<<(QDebug debug, const std::pair<T
template <typename T>
inline QDebugIfHasDebugStreamContainer<QSet<T>, T> operator<<(QDebug debug, const QSet<T> &set)
{
- return QtPrivate::printSequentialContainer(debug, "QSet", set);
+ return QtPrivate::printSequentialContainer(std::move(debug), "QSet", set);
}
template <class T>
@@ -329,7 +411,7 @@ inline QDebugIfHasDebugStream<T> operator<<(QDebug debug, const QContiguousCache
{
const QDebugStateSaver saver(debug);
debug.nospace() << "QContiguousCache(";
- for (int i = cache.firstIndex(); i <= cache.lastIndex(); ++i) {
+ for (qsizetype i = cache.firstIndex(); i <= cache.lastIndex(); ++i) {
debug << cache[i];
if (i != cache.lastIndex())
debug << ", ";
@@ -373,15 +455,12 @@ template <typename T>
QDebug operator<<(QDebug debug, const QSet<T> &set);
template <class T1, class T2>
-QDebug operator<<(QDebug debug, const QPair<T1, T2> &pair);
-
-template <class T1, class T2>
QDebug operator<<(QDebug debug, const std::pair<T1, T2> &pair);
template <typename T>
QDebug operator<<(QDebug debug, const QContiguousCache<T> &cache);
-#endif // Q_CLANG_QDOC
+#endif // Q_QDOC
template <class T>
inline QDebug operator<<(QDebug debug, const QSharedPointer<T> &ptr)
@@ -410,7 +489,7 @@ void qt_QMetaEnum_flagDebugOperator(QDebug &debug, size_t sizeofT, Int value)
debug.resetFormat();
debug.nospace() << "QFlags(" << Qt::hex << Qt::showbase;
bool needSeparator = false;
- for (uint i = 0; i < sizeofT * 8; ++i) {
+ for (size_t i = 0; i < sizeofT * 8; ++i) {
if (value & (Int(1) << i)) {
if (needSeparator)
debug << '|';
@@ -492,7 +571,7 @@ inline QDebug operator<<(QDebug debug, QKeyCombination combination)
return debug;
}
-#ifdef Q_OS_MAC
+#ifdef Q_OS_DARWIN
// We provide QDebug stream operators for commonly used Core Foundation
// and Core Graphics types, as well as NSObject. Additional CF/CG types
@@ -529,6 +608,7 @@ inline QDebug operator<<(QDebug debug, QKeyCombination combination)
QT_END_NAMESPACE
Q_FORWARD_DECLARE_CF_TYPE(CFString);
+struct objc_object;
Q_FORWARD_DECLARE_OBJC_CLASS(NSObject);
QT_FOR_EACH_CORE_FOUNDATION_TYPE(QT_FORWARD_DECLARE_CF_TYPE)
QT_FOR_EACH_MUTABLE_CORE_FOUNDATION_TYPE(QT_FORWARD_DECLARE_MUTABLE_CF_TYPE)
@@ -553,6 +633,10 @@ QT_BEGIN_NAMESPACE
}
// Defined in qcore_mac_objc.mm
+#if defined(__OBJC__)
+Q_CORE_EXPORT QDebug operator<<(QDebug, id);
+#endif
+Q_CORE_EXPORT QDebug operator<<(QDebug, objc_object *);
Q_CORE_EXPORT QDebug operator<<(QDebug, const NSObject *);
Q_CORE_EXPORT QDebug operator<<(QDebug, CFStringRef);
@@ -566,7 +650,7 @@ QT_FOR_EACH_MUTABLE_CORE_GRAPHICS_TYPE(QT_FORWARD_DECLARE_QDEBUG_OPERATOR_FOR_CF
#undef QT_FORWARD_DECLARE_CG_TYPE
#undef QT_FORWARD_DECLARE_MUTABLE_CG_TYPE
-#endif // Q_OS_MAC
+#endif // Q_OS_DARWIN
QT_END_NAMESPACE
diff --git a/src/corelib/io/qdebug_p.h b/src/corelib/io/qdebug_p.h
index 1ca632338f..810fc3b4b6 100644
--- a/src/corelib/io/qdebug_p.h
+++ b/src/corelib/io/qdebug_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QDEBUG_P_H
#define QDEBUG_P_H
@@ -61,7 +25,7 @@ QT_BEGIN_NAMESPACE
namespace QtDebugUtils {
-Q_CORE_EXPORT QByteArray toPrintable(const char *data, int len, int maxSize);
+Q_CORE_EXPORT QByteArray toPrintable(const char *data, qint64 len, qsizetype maxSize);
// inline helpers for formatting basic classes.
@@ -114,11 +78,10 @@ static inline void formatNonNullQEnum(QDebug &debug, const char *prefix, QEnum v
template <class Enum>
static inline void formatQFlags(QDebug &debug, const QFlags<Enum> &value)
{
- const QMetaObject *metaObject = qt_getEnumMetaObject(Enum());
- const QMetaEnum me = metaObject->enumerator(metaObject->indexOfEnumerator(qt_getEnumName(Enum())));
+ const QMetaEnum me = QMetaEnum::fromType<QFlags<Enum>>();
const QDebugStateSaver saver(debug);
debug.noquote();
- debug << me.valueToKeys(value);
+ debug << me.valueToKeys(value.toInt());
}
template <class Enum>
diff --git a/src/corelib/io/qdir.cpp b/src/corelib/io/qdir.cpp
index 9d540b2581..9291201d88 100644
--- a/src/corelib/io/qdir.cpp
+++ b/src/corelib/io/qdir.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qplatformdefs.h"
#include "qdir.h"
@@ -45,7 +9,7 @@
#ifndef QT_NO_DEBUG_STREAM
#include "qdebug.h"
#endif
-#include "qdiriterator.h"
+#include "qdirlisting.h"
#include "qdatetime.h"
#include "qstring.h"
#if QT_CONFIG(regularexpression)
@@ -57,9 +21,10 @@
#include "qfilesystemengine_p.h"
#include <qstringbuilder.h>
-#ifdef QT_BUILD_CORE_LIB
-# include "qresource.h"
-# include "private/qcoreglobaldata_p.h"
+#ifndef QT_BOOTSTRAPPED
+# include <qcollator.h>
+# include "qreadwritelock.h"
+# include "qmutex.h"
#endif
#include <algorithm>
@@ -68,6 +33,8 @@
QT_BEGIN_NAMESPACE
+using namespace Qt::StringLiterals;
+
#if defined(Q_OS_WIN)
static QString driveSpec(const QString &path)
{
@@ -91,67 +58,65 @@ enum {
};
// Return the length of the root part of an absolute path, for use by cleanPath(), cd().
-static int rootLength(const QString &name, bool allowUncPaths)
+static qsizetype rootLength(QStringView name, bool allowUncPaths)
{
- const int len = name.length();
+ const qsizetype len = name.size();
// starts with double slash
- if (allowUncPaths && name.startsWith(QLatin1String("//"))) {
+ if (allowUncPaths && name.startsWith("//"_L1)) {
// Server name '//server/path' is part of the prefix.
- const int nextSlash = name.indexOf(QLatin1Char('/'), 2);
+ const qsizetype nextSlash = name.indexOf(u'/', 2);
return nextSlash >= 0 ? nextSlash + 1 : len;
}
#if defined(Q_OS_WIN)
- if (len >= 2 && name.at(1) == QLatin1Char(':')) {
+ if (len >= 2 && name.at(1) == u':') {
// Handle a possible drive letter
- return len > 2 && name.at(2) == QLatin1Char('/') ? 3 : 2;
+ return len > 2 && name.at(2) == u'/' ? 3 : 2;
}
#endif
- if (name.at(0) == QLatin1Char('/'))
+ if (name.at(0) == u'/')
return 1;
return 0;
}
//************* QDirPrivate
-QDirPrivate::QDirPrivate(const QString &path, const QStringList &nameFilters_, QDir::SortFlags sort_, QDir::Filters filters_)
- : QSharedData()
- , fileListsInitialized(false)
- , nameFilters(nameFilters_)
- , sort(sort_)
- , filters(filters_)
+QDirPrivate::QDirPrivate(const QString &path, const QStringList &nameFilters_,
+ QDir::SortFlags sort_, QDir::Filters filters_)
+ : QSharedData(), nameFilters(nameFilters_), sort(sort_), filters(filters_)
{
setPath(path.isEmpty() ? QString::fromLatin1(".") : path);
- bool empty = nameFilters.isEmpty();
- if (!empty) {
- empty = true;
- for (int i = 0; i < nameFilters.size(); ++i) {
- if (!nameFilters.at(i).isEmpty()) {
- empty = false;
- break;
- }
- }
- }
+ auto isEmpty = [](const auto &e) { return e.isEmpty(); };
+ const bool empty = std::all_of(nameFilters.cbegin(), nameFilters.cend(), isEmpty);
if (empty)
nameFilters = QStringList(QString::fromLatin1("*"));
}
QDirPrivate::QDirPrivate(const QDirPrivate &copy)
- : QSharedData(copy)
- , fileListsInitialized(false)
- , nameFilters(copy.nameFilters)
- , sort(copy.sort)
- , filters(copy.filters)
- , dirEntry(copy.dirEntry)
- , metaData(copy.metaData)
-{
+ : QSharedData(copy),
+ // mutex is not copied
+ nameFilters(copy.nameFilters),
+ sort(copy.sort),
+ filters(copy.filters),
+ // fileEngine is not copied
+ dirEntry(copy.dirEntry)
+{
+ QMutexLocker locker(&copy.fileCache.mutex);
+ fileCache.fileListsInitialized = copy.fileCache.fileListsInitialized.load();
+ fileCache.files = copy.fileCache.files;
+ fileCache.fileInfos = copy.fileCache.fileInfos;
+ fileCache.absoluteDirEntry = copy.fileCache.absoluteDirEntry;
+ fileCache.metaData = copy.fileCache.metaData;
}
bool QDirPrivate::exists() const
{
if (!fileEngine) {
- QFileSystemEngine::fillMetaData(dirEntry, metaData,
- QFileSystemMetaData::ExistsAttribute | QFileSystemMetaData::DirectoryType); // always stat
- return metaData.exists() && metaData.isDirectory();
+ QMutexLocker locker(&fileCache.mutex);
+ QFileSystemEngine::fillMetaData(
+ dirEntry, fileCache.metaData,
+ QFileSystemMetaData::ExistsAttribute
+ | QFileSystemMetaData::DirectoryType); // always stat
+ return fileCache.metaData.exists() && fileCache.metaData.isDirectory();
}
const QAbstractFileEngine::FileFlags info =
fileEngine->fileFlags(QAbstractFileEngine::DirectoryType
@@ -165,10 +130,10 @@ bool QDirPrivate::exists() const
// static
inline QChar QDirPrivate::getFilterSepChar(const QString &nameFilter)
{
- QChar sep(QLatin1Char(';'));
- int i = nameFilter.indexOf(sep, 0);
- if (i == -1 && nameFilter.indexOf(QLatin1Char(' '), 0) != -1)
- sep = QChar(QLatin1Char(' '));
+ QChar sep(u';');
+ qsizetype i = nameFilter.indexOf(sep, 0);
+ if (i == -1 && nameFilter.indexOf(u' ', 0) != -1)
+ sep = QChar(u' ');
return sep;
}
@@ -186,64 +151,97 @@ inline QStringList QDirPrivate::splitFilters(const QString &nameFilter, QChar se
inline void QDirPrivate::setPath(const QString &path)
{
QString p = QDir::fromNativeSeparators(path);
- if (p.endsWith(QLatin1Char('/'))
- && p.length() > 1
+ if (p.endsWith(u'/')
+ && p.size() > 1
#if defined(Q_OS_WIN)
&& (!(p.length() == 3 && p.at(1).unicode() == ':' && p.at(0).isLetter()))
#endif
) {
- p.truncate(p.length() - 1);
+ p.truncate(p.size() - 1);
}
-
dirEntry = QFileSystemEntry(p, QFileSystemEntry::FromInternalPath());
- metaData.clear();
- initFileEngine();
- clearFileLists();
- absoluteDirEntry = QFileSystemEntry();
+ clearCache(IncludingMetaData);
+ fileCache.absoluteDirEntry = QFileSystemEntry();
}
-inline void QDirPrivate::clearFileLists()
+inline QString QDirPrivate::resolveAbsoluteEntry() const
{
- fileListsInitialized = false;
- files.clear();
- fileInfos.clear();
-}
+ QMutexLocker locker(&fileCache.mutex);
+ if (!fileCache.absoluteDirEntry.isEmpty())
+ return fileCache.absoluteDirEntry.filePath();
-inline void QDirPrivate::resolveAbsoluteEntry() const
-{
- if (!absoluteDirEntry.isEmpty() || dirEntry.isEmpty())
- return;
+ if (dirEntry.isEmpty())
+ return dirEntry.filePath();
QString absoluteName;
if (!fileEngine) {
if (!dirEntry.isRelative() && dirEntry.isClean()) {
- absoluteDirEntry = dirEntry;
- return;
+ fileCache.absoluteDirEntry = dirEntry;
+ return dirEntry.filePath();
}
absoluteName = QFileSystemEngine::absoluteName(dirEntry).filePath();
} else {
absoluteName = fileEngine->fileName(QAbstractFileEngine::AbsoluteName);
}
-
- absoluteDirEntry = QFileSystemEntry(QDir::cleanPath(absoluteName), QFileSystemEntry::FromInternalPath());
+ auto absoluteFileSystemEntry =
+ QFileSystemEntry(QDir::cleanPath(absoluteName), QFileSystemEntry::FromInternalPath());
+ fileCache.absoluteDirEntry = absoluteFileSystemEntry;
+ return absoluteFileSystemEntry.filePath();
}
/* For sorting */
struct QDirSortItem
{
+ QDirSortItem() = default;
+ QDirSortItem(const QFileInfo &fi, QDir::SortFlags sort)
+ : item(fi)
+ {
+ // A dir e.g. "dirA.bar" doesn't have actually have an extension/suffix, when
+ // sorting by type such "suffix" should be ignored but that would complicate
+ // the code and uses can change the behavior by setting DirsFirst/DirsLast
+ if (sort.testAnyFlag(QDir::Type))
+ suffix_cache = item.suffix();
+ }
+
mutable QString filename_cache;
- mutable QString suffix_cache;
+ QString suffix_cache;
QFileInfo item;
};
-
class QDirSortItemComparator
{
QDir::SortFlags qt_cmp_si_sort_flags;
+
+#ifndef QT_BOOTSTRAPPED
+ QCollator *collator = nullptr;
+#endif
public:
- QDirSortItemComparator(QDir::SortFlags flags) : qt_cmp_si_sort_flags(flags) {}
+#ifndef QT_BOOTSTRAPPED
+ QDirSortItemComparator(QDir::SortFlags flags, QCollator *coll = nullptr)
+ : qt_cmp_si_sort_flags(flags), collator(coll)
+ {
+ Q_ASSERT(!qt_cmp_si_sort_flags.testAnyFlag(QDir::LocaleAware) || collator);
+
+ if (collator && qt_cmp_si_sort_flags.testAnyFlag(QDir::IgnoreCase))
+ collator->setCaseSensitivity(Qt::CaseInsensitive);
+ }
+#else
+ QDirSortItemComparator(QDir::SortFlags flags)
+ : qt_cmp_si_sort_flags(flags)
+ {
+ }
+#endif
bool operator()(const QDirSortItem &, const QDirSortItem &) const;
+
+ int compareStrings(const QString &a, const QString &b, Qt::CaseSensitivity cs) const
+ {
+#ifndef QT_BOOTSTRAPPED
+ if (collator)
+ return collator->compare(a, b);
+#endif
+ return a.compare(b, cs);
+ }
};
bool QDirSortItemComparator::operator()(const QDirSortItem &n1, const QDirSortItem &n2) const
@@ -256,43 +254,25 @@ bool QDirSortItemComparator::operator()(const QDirSortItem &n1, const QDirSortIt
if ((qt_cmp_si_sort_flags & QDir::DirsLast) && (f1->item.isDir() != f2->item.isDir()))
return !f1->item.isDir();
+ const bool ic = qt_cmp_si_sort_flags.testAnyFlag(QDir::IgnoreCase);
+ const auto qtcase = ic ? Qt::CaseInsensitive : Qt::CaseSensitive;
+
qint64 r = 0;
int sortBy = ((qt_cmp_si_sort_flags & QDir::SortByMask)
| (qt_cmp_si_sort_flags & QDir::Type)).toInt();
switch (sortBy) {
case QDir::Time: {
- QDateTime firstModified = f1->item.lastModified();
- QDateTime secondModified = f2->item.lastModified();
-
- // QDateTime by default will do all sorts of conversions on these to
- // find timezones, which is incredibly expensive. As we aren't
- // presenting these to the user, we don't care (at all) about the
- // local timezone, so force them to UTC to avoid that conversion.
- firstModified.setTimeSpec(Qt::UTC);
- secondModified.setTimeSpec(Qt::UTC);
-
+ const QDateTime firstModified = f1->item.lastModified(QTimeZone::UTC);
+ const QDateTime secondModified = f2->item.lastModified(QTimeZone::UTC);
r = firstModified.msecsTo(secondModified);
break;
}
case QDir::Size:
r = f2->item.size() - f1->item.size();
break;
- case QDir::Type:
- {
- bool ic = qt_cmp_si_sort_flags.testAnyFlag(QDir::IgnoreCase);
-
- if (f1->suffix_cache.isNull())
- f1->suffix_cache = ic ? f1->item.suffix().toLower()
- : f1->item.suffix();
- if (f2->suffix_cache.isNull())
- f2->suffix_cache = ic ? f2->item.suffix().toLower()
- : f2->item.suffix();
-
- r = qt_cmp_si_sort_flags & QDir::LocaleAware
- ? f1->suffix_cache.localeAwareCompare(f2->suffix_cache)
- : f1->suffix_cache.compare(f2->suffix_cache);
- }
+ case QDir::Type:
+ r = compareStrings(f1->suffix_cache, f2->suffix_cache, qtcase);
break;
default:
;
@@ -300,69 +280,89 @@ bool QDirSortItemComparator::operator()(const QDirSortItem &n1, const QDirSortIt
if (r == 0 && sortBy != QDir::Unsorted) {
// Still not sorted - sort by name
- bool ic = qt_cmp_si_sort_flags.testAnyFlag(QDir::IgnoreCase);
if (f1->filename_cache.isNull())
- f1->filename_cache = ic ? f1->item.fileName().toLower()
- : f1->item.fileName();
+ f1->filename_cache = f1->item.fileName();
if (f2->filename_cache.isNull())
- f2->filename_cache = ic ? f2->item.fileName().toLower()
- : f2->item.fileName();
+ f2->filename_cache = f2->item.fileName();
- r = qt_cmp_si_sort_flags & QDir::LocaleAware
- ? f1->filename_cache.localeAwareCompare(f2->filename_cache)
- : f1->filename_cache.compare(f2->filename_cache);
+ r = compareStrings(f1->filename_cache, f2->filename_cache, qtcase);
}
if (qt_cmp_si_sort_flags & QDir::Reversed)
return r > 0;
return r < 0;
}
-inline void QDirPrivate::sortFileList(QDir::SortFlags sort, QFileInfoList &l,
+inline void QDirPrivate::sortFileList(QDir::SortFlags sort, const QFileInfoList &l,
QStringList *names, QFileInfoList *infos)
{
- // names and infos are always empty lists or 0 here
- int n = l.size();
- if (n > 0) {
- if (n == 1 || (sort & QDir::SortByMask) == QDir::Unsorted) {
- if (infos)
- *infos = l;
- if (names) {
- for (int i = 0; i < n; ++i)
- names->append(l.at(i).fileName());
- }
+ Q_ASSERT(names || infos);
+ Q_ASSERT(!infos || infos->isEmpty());
+ Q_ASSERT(!names || names->isEmpty());
+
+ const qsizetype n = l.size();
+ if (n == 0)
+ return;
+
+ if (n == 1 || (sort & QDir::SortByMask) == QDir::Unsorted) {
+ if (infos)
+ *infos = l;
+
+ if (names) {
+ for (const QFileInfo &fi : l)
+ names->append(fi.fileName());
+ }
+ } else {
+ QScopedArrayPointer<QDirSortItem> si(new QDirSortItem[n]);
+ for (qsizetype i = 0; i < n; ++i)
+ si[i] = QDirSortItem{l.at(i), sort};
+
+#ifndef QT_BOOTSTRAPPED
+ if (sort.testAnyFlag(QDir::LocaleAware)) {
+ QCollator coll;
+ std::sort(si.data(), si.data() + n, QDirSortItemComparator(sort, &coll));
} else {
- QScopedArrayPointer<QDirSortItem> si(new QDirSortItem[n]);
- for (int i = 0; i < n; ++i)
- si[i].item = l.at(i);
std::sort(si.data(), si.data() + n, QDirSortItemComparator(sort));
- // put them back in the list(s)
- if (infos) {
- for (int i = 0; i < n; ++i)
- infos->append(si[i].item);
- }
+ }
+#else
+ std::sort(si.data(), si.data() + n, QDirSortItemComparator(sort));
+#endif // QT_BOOTSTRAPPED
+
+ // put them back in the list(s)
+ for (qsizetype i = 0; i < n; ++i) {
+ auto &fileInfo = si[i].item;
+ if (infos)
+ infos->append(fileInfo);
if (names) {
- for (int i = 0; i < n; ++i)
- names->append(si[i].item.fileName());
+ const bool cached = !si[i].filename_cache.isNull();
+ names->append(cached ? si[i].filename_cache : fileInfo.fileName());
}
}
}
}
+
inline void QDirPrivate::initFileLists(const QDir &dir) const
{
- if (!fileListsInitialized) {
+ QMutexLocker locker(&fileCache.mutex);
+ if (!fileCache.fileListsInitialized) {
QFileInfoList l;
- QDirIterator it(dir);
- while (it.hasNext())
- l.append(it.nextFileInfo());
- sortFileList(sort, l, &files, &fileInfos);
- fileListsInitialized = true;
+ for (const auto &dirEntry : QDirListing(dir))
+ l.emplace_back(dirEntry.fileInfo());
+
+ sortFileList(sort, l, &fileCache.files, &fileCache.fileInfos);
+ fileCache.fileListsInitialized = true;
}
}
-inline void QDirPrivate::initFileEngine()
+inline void QDirPrivate::clearCache(MetaDataClearing mode)
{
- fileEngine.reset(QFileSystemEngine::resolveEntryAndCreateLegacyEngine(dirEntry, metaData));
+ QMutexLocker locker(&fileCache.mutex);
+ if (mode == IncludingMetaData)
+ fileCache.metaData.clear();
+ fileCache.fileListsInitialized = false;
+ fileCache.files.clear();
+ fileCache.fileInfos.clear();
+ fileEngine = QFileSystemEngine::createLegacyEngine(dirEntry, fileCache.metaData);
}
/*!
@@ -374,6 +374,7 @@ inline void QDirPrivate::initFileEngine()
\ingroup shared
\reentrant
+ \compares equality
A QDir is used to manipulate path names, access information
regarding paths and files, and manipulate the underlying file
@@ -395,7 +396,7 @@ inline void QDirPrivate::initFileEngine()
\snippet code/src_corelib_io_qdir.cpp 0
On Windows, the second example above will be translated to
- \c{C:\Documents and Settings} when used to access files.
+ \c{C:\Users} when used to access files.
Examples of relative paths:
@@ -529,8 +530,8 @@ inline void QDirPrivate::initFileEngine()
\snippet code/src_corelib_io_qdir.cpp 4
- (We could also use the static convenience function
- QFile::exists().)
+ (We could also use one of the static convenience functions
+ QFileInfo::exists() or QFile::exists().)
Traversing directories and reading a file:
@@ -541,7 +542,12 @@ inline void QDirPrivate::initFileEngine()
\snippet qdir-listfiles/main.cpp 0
- \sa QFileInfo, QFile, QFileDialog, QCoreApplication::applicationDirPath(), {Find Files Example}
+ \section1 Platform Specific Issues
+
+ \include android-content-uri-limitations.qdocinc
+
+ \sa QFileInfo, QFile, QFileDialog, QCoreApplication::applicationDirPath(),
+ {Fetch More Example}
*/
/*!
@@ -645,7 +651,7 @@ void QDir::setPath(const QString &path)
*/
QString QDir::path() const
{
- const QDirPrivate* d = d_ptr.constData();
+ Q_D(const QDir);
return d->dirEntry.filePath();
}
@@ -659,9 +665,11 @@ QString QDir::path() const
*/
QString QDir::absolutePath() const
{
- const QDirPrivate* d = d_ptr.constData();
- d->resolveAbsoluteEntry();
- return d->absoluteDirEntry.filePath();
+ Q_D(const QDir);
+ if (!d->fileEngine)
+ return d->resolveAbsoluteEntry();
+
+ return d->fileEngine->fileName(QAbstractFileEngine::AbsoluteName);
}
/*!
@@ -682,9 +690,11 @@ QString QDir::absolutePath() const
*/
QString QDir::canonicalPath() const
{
- const QDirPrivate* d = d_ptr.constData();
+ Q_D(const QDir);
if (!d->fileEngine) {
- QFileSystemEntry answer = QFileSystemEngine::canonicalName(d->dirEntry, d->metaData);
+ QMutexLocker locker(&d->fileCache.mutex);
+ QFileSystemEntry answer =
+ QFileSystemEngine::canonicalName(d->dirEntry, d->fileCache.metaData);
return answer.filePath();
}
return d->fileEngine->fileName(QAbstractFileEngine::CanonicalName);
@@ -703,29 +713,31 @@ QString QDir::canonicalPath() const
*/
QString QDir::dirName() const
{
- const QDirPrivate* d = d_ptr.constData();
- return d->dirEntry.fileName();
+ Q_D(const QDir);
+ if (!d_ptr->fileEngine)
+ return d->dirEntry.fileName();
+ return d->fileEngine->fileName(QAbstractFileEngine::BaseName);
}
#ifdef Q_OS_WIN
-static int drivePrefixLength(const QString &path)
+static qsizetype drivePrefixLength(QStringView path)
{
// Used to extract path's drive for use as prefix for an "absolute except for drive" path
- const int size = path.length();
- int drive = 2; // length of drive prefix
+ const qsizetype size = path.size();
+ qsizetype drive = 2; // length of drive prefix
if (size > 1 && path.at(1).unicode() == ':') {
if (Q_UNLIKELY(!path.at(0).isLetter()))
return 0;
- } else if (path.startsWith(QLatin1String("//"))) {
+ } else if (path.startsWith("//"_L1)) {
// UNC path; use its //server/share part as "drive" - it's as sane a
// thing as we can do.
- for (int i = 2; i-- > 0; ) { // Scan two "path fragments":
+ for (int i = 0 ; i < 2 ; ++i) { // Scan two "path fragments":
while (drive < size && path.at(drive).unicode() == '/')
drive++;
if (drive >= size) {
qWarning("Base directory starts with neither a drive nor a UNC share: %s",
- qUtf8Printable(QDir::toNativeSeparators(path)));
+ qUtf8Printable(QDir::toNativeSeparators(path.toString())));
return 0;
}
while (drive < size && path.at(drive).unicode() != '/')
@@ -749,7 +761,7 @@ static bool treatAsAbsolute(const QString &path)
// a colon in the path.
// FIXME: relies on virtual file-systems having colons in their prefixes.
// The case of an MS-absolute C:/... path happens to work either way.
- return (path.contains(QLatin1Char(':')) && QFileInfo(path).isAbsolute())
+ return (path.contains(u':') && QFileInfo(path).isAbsolute())
|| QFileSystemEntry(path).isAbsolute();
}
@@ -767,22 +779,22 @@ QString QDir::filePath(const QString &fileName) const
if (treatAsAbsolute(fileName))
return fileName;
- const QDirPrivate* d = d_ptr.constData();
+ Q_D(const QDir);
QString ret = d->dirEntry.filePath();
if (fileName.isEmpty())
return ret;
#ifdef Q_OS_WIN
- if (fileName.startsWith(QLatin1Char('/')) || fileName.startsWith(QLatin1Char('\\'))) {
+ if (fileName.startsWith(u'/') || fileName.startsWith(u'\\')) {
// Handle the "absolute except for drive" case (i.e. \blah not c:\blah):
- const int drive = drivePrefixLength(ret);
+ const qsizetype drive = drivePrefixLength(ret);
return drive > 0 ? QStringView{ret}.left(drive) % fileName : fileName;
}
#endif // Q_OS_WIN
- if (ret.isEmpty() || ret.endsWith(QLatin1Char('/')))
+ if (ret.isEmpty() || ret.endsWith(u'/'))
return ret % fileName;
- return ret % QLatin1Char('/') % fileName;
+ return ret % u'/' % fileName;
}
/*!
@@ -798,16 +810,15 @@ QString QDir::absoluteFilePath(const QString &fileName) const
if (treatAsAbsolute(fileName))
return fileName;
- const QDirPrivate* d = d_ptr.constData();
- d->resolveAbsoluteEntry();
- const QString absoluteDirPath = d->absoluteDirEntry.filePath();
+ Q_D(const QDir);
+ QString absoluteDirPath = d->resolveAbsoluteEntry();
if (fileName.isEmpty())
return absoluteDirPath;
#ifdef Q_OS_WIN
// Handle the "absolute except for drive" case (i.e. \blah not c:\blah):
- if (fileName.startsWith(QLatin1Char('/')) || fileName.startsWith(QLatin1Char('\\'))) {
+ if (fileName.startsWith(u'/') || fileName.startsWith(u'\\')) {
// Combine absoluteDirPath's drive with fileName
- const int drive = drivePrefixLength(absoluteDirPath);
+ const qsizetype drive = drivePrefixLength(absoluteDirPath);
if (Q_LIKELY(drive))
return QStringView{absoluteDirPath}.left(drive) % fileName;
@@ -816,8 +827,8 @@ QString QDir::absoluteFilePath(const QString &fileName) const
return QString();
}
#endif // Q_OS_WIN
- if (!absoluteDirPath.endsWith(QLatin1Char('/')))
- return absoluteDirPath % QLatin1Char('/') % fileName;
+ if (!absoluteDirPath.endsWith(u'/'))
+ return absoluteDirPath % u'/' % fileName;
return absoluteDirPath % fileName;
}
@@ -847,9 +858,10 @@ QString QDir::relativeFilePath(const QString &fileName) const
}
if (fileDrive.toLower() != dirDrive.toLower()
- || (file.startsWith(QLatin1String("//"))
- && !dir.startsWith(QLatin1String("//"))))
+ || (file.startsWith("//"_L1)
+ && !dir.startsWith("//"_L1))) {
return file;
+ }
dir.remove(0, dirDrive.size());
if (!fileDriveMissing)
@@ -857,8 +869,8 @@ QString QDir::relativeFilePath(const QString &fileName) const
#endif
QString result;
- const auto dirElts = dir.tokenize(QLatin1Char('/'), Qt::SkipEmptyParts);
- const auto fileElts = file.tokenize(QLatin1Char('/'), Qt::SkipEmptyParts);
+ const auto dirElts = dir.tokenize(u'/', Qt::SkipEmptyParts);
+ const auto fileElts = file.tokenize(u'/', Qt::SkipEmptyParts);
const auto dend = dirElts.end();
const auto fend = fileElts.end();
@@ -881,20 +893,20 @@ QString QDir::relativeFilePath(const QString &fileName) const
}
while (dit != dend) {
- result += QLatin1String("../");
+ result += "../"_L1;
++dit;
}
if (fit != fend) {
while (fit != fend) {
result += *fit++;
- result += QLatin1Char('/');
+ result += u'/';
}
result.chop(1);
}
if (result.isEmpty())
- result = QLatin1String(".");
+ result = "."_L1;
return result;
}
@@ -916,16 +928,16 @@ QString QDir::relativeFilePath(const QString &fileName) const
QString QDir::toNativeSeparators(const QString &pathName)
{
#if defined(Q_OS_WIN)
- int i = pathName.indexOf(QLatin1Char('/'));
+ qsizetype i = pathName.indexOf(u'/');
if (i != -1) {
QString n(pathName);
QChar * const data = n.data();
- data[i++] = QLatin1Char('\\');
+ data[i++] = u'\\';
for (; i < n.length(); ++i) {
- if (data[i] == QLatin1Char('/'))
- data[i] = QLatin1Char('\\');
+ if (data[i] == u'/')
+ data[i] = u'\\';
}
return n;
@@ -973,19 +985,19 @@ bool QDir::cd(const QString &dirName)
// Don't detach just yet.
const QDirPrivate * const d = d_ptr.constData();
- if (dirName.isEmpty() || dirName == QLatin1String("."))
+ if (dirName.isEmpty() || dirName == u'.')
return true;
QString newPath;
if (isAbsolutePath(dirName)) {
newPath = qt_cleanPath(dirName);
} else {
newPath = d->dirEntry.filePath();
- if (!newPath.endsWith(QLatin1Char('/')))
- newPath += QLatin1Char('/');
+ if (!newPath.endsWith(u'/'))
+ newPath += u'/';
newPath += dirName;
- if (dirName.indexOf(QLatin1Char('/')) >= 0
- || dirName == QLatin1String("..")
- || d->dirEntry.filePath() == QLatin1String(".")) {
+ if (dirName.indexOf(u'/') >= 0
+ || dirName == ".."_L1
+ || d->dirEntry.filePath() == u'.') {
bool ok;
newPath = qt_cleanPath(newPath, &ok);
if (!ok)
@@ -998,7 +1010,7 @@ bool QDir::cd(const QString &dirName)
while (dir.cdUp())
;
*/
- if (newPath.startsWith(QLatin1String(".."))) {
+ if (newPath.startsWith(".."_L1)) {
newPath = QFileInfo(newPath).absoluteFilePath();
}
}
@@ -1021,6 +1033,9 @@ bool QDir::cd(const QString &dirName)
otherwise returns \c false. Note that the logical cdUp() operation is
not performed if the new directory does not exist.
+ \note On Android, this is not supported for content URIs. For more information,
+ see \l {Android: DocumentFile.getParentFile()}{DocumentFile.getParentFile()}.
+
\sa cd(), isReadable(), exists(), path()
*/
bool QDir::cdUp()
@@ -1033,7 +1048,7 @@ bool QDir::cdUp()
*/
QStringList QDir::nameFilters() const
{
- const QDirPrivate* d = d_ptr.constData();
+ Q_D(const QDir);
return d->nameFilters;
}
@@ -1054,14 +1069,22 @@ QStringList QDir::nameFilters() const
*/
void QDir::setNameFilters(const QStringList &nameFilters)
{
- QDirPrivate* d = d_ptr.data();
- d->initFileEngine();
- d->clearFileLists();
-
+ Q_D(QDir);
+ d->clearCache(QDirPrivate::KeepMetaData);
d->nameFilters = nameFilters;
}
-#ifdef QT_BUILD_CORE_LIB
+#ifndef QT_BOOTSTRAPPED
+
+namespace {
+struct DirSearchPaths {
+ mutable QReadWriteLock mutex;
+ QHash<QString, QStringList> paths;
+};
+}
+
+Q_GLOBAL_STATIC(DirSearchPaths, dirSearchPaths)
+
/*!
\since 4.3
@@ -1084,24 +1107,24 @@ void QDir::setNameFilters(const QStringList &nameFilters)
*/
void QDir::setSearchPaths(const QString &prefix, const QStringList &searchPaths)
{
- if (prefix.length() < 2) {
+ if (prefix.size() < 2) {
qWarning("QDir::setSearchPaths: Prefix must be longer than 1 character");
return;
}
- for (int i = 0; i < prefix.count(); ++i) {
- if (!prefix.at(i).isLetterOrNumber()) {
+ for (QChar ch : prefix) {
+ if (!ch.isLetterOrNumber()) {
qWarning("QDir::setSearchPaths: Prefix can only contain letters or numbers");
return;
}
}
- QWriteLocker lock(&QCoreGlobalData::instance()->dirSearchPathsLock);
- QHash<QString, QStringList> &paths = QCoreGlobalData::instance()->dirSearchPaths;
+ DirSearchPaths &conf = *dirSearchPaths;
+ const QWriteLocker lock(&conf.mutex);
if (searchPaths.isEmpty()) {
- paths.remove(prefix);
+ conf.paths.remove(prefix);
} else {
- paths.insert(prefix, searchPaths);
+ conf.paths.insert(prefix, searchPaths);
}
}
@@ -1117,8 +1140,9 @@ void QDir::addSearchPath(const QString &prefix, const QString &path)
if (path.isEmpty())
return;
- QWriteLocker lock(&QCoreGlobalData::instance()->dirSearchPathsLock);
- QCoreGlobalData::instance()->dirSearchPaths[prefix] += path;
+ DirSearchPaths &conf = *dirSearchPaths;
+ const QWriteLocker lock(&conf.mutex);
+ conf.paths[prefix] += path;
}
/*!
@@ -1130,18 +1154,22 @@ void QDir::addSearchPath(const QString &prefix, const QString &path)
*/
QStringList QDir::searchPaths(const QString &prefix)
{
- QReadLocker lock(&QCoreGlobalData::instance()->dirSearchPathsLock);
- return QCoreGlobalData::instance()->dirSearchPaths.value(prefix);
+ if (!dirSearchPaths.exists())
+ return QStringList();
+
+ const DirSearchPaths &conf = *dirSearchPaths;
+ const QReadLocker lock(&conf.mutex);
+ return conf.paths.value(prefix);
}
-#endif // QT_BUILD_CORE_LIB
+#endif // QT_BOOTSTRAPPED
/*!
Returns the value set by setFilter()
*/
QDir::Filters QDir::filter() const
{
- const QDirPrivate* d = d_ptr.constData();
+ Q_D(const QDir);
return d->filters;
}
@@ -1220,10 +1248,8 @@ QDir::Filters QDir::filter() const
*/
void QDir::setFilter(Filters filters)
{
- QDirPrivate* d = d_ptr.data();
- d->initFileEngine();
- d->clearFileLists();
-
+ Q_D(QDir);
+ d->clearCache(QDirPrivate::KeepMetaData);
d->filters = filters;
}
@@ -1234,7 +1260,7 @@ void QDir::setFilter(Filters filters)
*/
QDir::SortFlags QDir::sorting() const
{
- const QDirPrivate* d = d_ptr.constData();
+ Q_D(const QDir);
return d->sort;
}
@@ -1267,6 +1293,7 @@ QDir::SortFlags QDir::sorting() const
after the directories, again in reverse order.
*/
+#ifndef QT_BOOTSTRAPPED
/*!
Sets the sort order used by entryList() and entryInfoList().
@@ -1277,10 +1304,8 @@ QDir::SortFlags QDir::sorting() const
*/
void QDir::setSorting(SortFlags sort)
{
- QDirPrivate* d = d_ptr.data();
- d->initFileEngine();
- d->clearFileLists();
-
+ Q_D(QDir);
+ d->clearCache(QDirPrivate::KeepMetaData);
d->sort = sort;
}
@@ -1289,13 +1314,16 @@ void QDir::setSorting(SortFlags sort)
Equivalent to entryList().count().
+ \note In Qt versions prior to 6.5, this function returned \c{uint}, not
+ \c{qsizetype}.
+
\sa operator[](), entryList()
*/
-uint QDir::count() const
+qsizetype QDir::count(QT6_IMPL_NEW_OVERLOAD) const
{
- const QDirPrivate* d = d_ptr.constData();
+ Q_D(const QDir);
d->initFileLists(*this);
- return d->files.count();
+ return d->fileCache.files.size();
}
/*!
@@ -1303,13 +1331,15 @@ uint QDir::count() const
names. Equivalent to entryList().at(index).
\a pos must be a valid index position in the list (i.e., 0 <= pos < count()).
+ \note In Qt versions prior to 6.5, \a pos was an \c{int}, not \c{qsizetype}.
+
\sa count(), entryList()
*/
-QString QDir::operator[](int pos) const
+QString QDir::operator[](qsizetype pos) const
{
- const QDirPrivate* d = d_ptr.constData();
+ Q_D(const QDir);
d->initFileLists(*this);
- return d->files[pos];
+ return d->fileCache.files[pos];
}
/*!
@@ -1333,7 +1363,7 @@ QString QDir::operator[](int pos) const
*/
QStringList QDir::entryList(Filters filters, SortFlags sort) const
{
- const QDirPrivate* d = d_ptr.constData();
+ Q_D(const QDir);
return entryList(d->nameFilters, filters, sort);
}
@@ -1356,7 +1386,7 @@ QStringList QDir::entryList(Filters filters, SortFlags sort) const
*/
QFileInfoList QDir::entryInfoList(Filters filters, SortFlags sort) const
{
- const QDirPrivate* d = d_ptr.constData();
+ Q_D(const QDir);
return entryInfoList(d->nameFilters, filters, sort);
}
@@ -1379,24 +1409,34 @@ QFileInfoList QDir::entryInfoList(Filters filters, SortFlags sort) const
QStringList QDir::entryList(const QStringList &nameFilters, Filters filters,
SortFlags sort) const
{
- const QDirPrivate* d = d_ptr.constData();
+ Q_D(const QDir);
if (filters == NoFilter)
filters = d->filters;
if (sort == NoSort)
sort = d->sort;
+ const bool needsSorting = (sort & QDir::SortByMask) != QDir::Unsorted;
+
if (filters == d->filters && sort == d->sort && nameFilters == d->nameFilters) {
- d->initFileLists(*this);
- return d->files;
+ // Don't fill a QFileInfo cache if we just need names
+ if (needsSorting || d->fileCache.fileListsInitialized) {
+ d->initFileLists(*this);
+ return d->fileCache.files;
+ }
}
- QFileInfoList l;
- QDirIterator it(d->dirEntry.filePath(), nameFilters, filters);
- while (it.hasNext())
- l.append(it.nextFileInfo());
+ QDirListing dirList(d->dirEntry.filePath(), nameFilters, filters);
QStringList ret;
- d->sortFileList(sort, l, &ret, nullptr);
+ if (needsSorting) {
+ QFileInfoList l;
+ for (const auto &dirEntry : dirList)
+ l.emplace_back(dirEntry.fileInfo());
+ d->sortFileList(sort, l, &ret, nullptr);
+ } else {
+ for (const auto &dirEntry : dirList)
+ ret.emplace_back(dirEntry.fileName());
+ }
return ret;
}
@@ -1419,7 +1459,7 @@ QStringList QDir::entryList(const QStringList &nameFilters, Filters filters,
QFileInfoList QDir::entryInfoList(const QStringList &nameFilters, Filters filters,
SortFlags sort) const
{
- const QDirPrivate* d = d_ptr.constData();
+ Q_D(const QDir);
if (filters == NoFilter)
filters = d->filters;
@@ -1428,17 +1468,17 @@ QFileInfoList QDir::entryInfoList(const QStringList &nameFilters, Filters filter
if (filters == d->filters && sort == d->sort && nameFilters == d->nameFilters) {
d->initFileLists(*this);
- return d->fileInfos;
+ return d->fileCache.fileInfos;
}
QFileInfoList l;
- QDirIterator it(d->dirEntry.filePath(), nameFilters, filters);
- while (it.hasNext())
- l.append(it.nextFileInfo());
+ for (const auto &dirEntry : QDirListing(d->dirEntry.filePath(), nameFilters, filters))
+ l.emplace_back(dirEntry.fileInfo());
QFileInfoList ret;
d->sortFileList(sort, l, nullptr, &ret);
return ret;
}
+#endif // !QT_BOOTSTRAPPED
/*!
Creates a sub-directory called \a dirName.
@@ -1462,7 +1502,7 @@ QFileInfoList QDir::entryInfoList(const QStringList &nameFilters, Filters filter
*/
bool QDir::mkdir(const QString &dirName, QFile::Permissions permissions) const
{
- const QDirPrivate *d = d_ptr.constData();
+ Q_D(const QDir);
if (dirName.isEmpty()) {
qWarning("QDir::mkdir: Empty or null file name");
@@ -1484,7 +1524,7 @@ bool QDir::mkdir(const QString &dirName, QFile::Permissions permissions) const
*/
bool QDir::mkdir(const QString &dirName) const
{
- const QDirPrivate* d = d_ptr.constData();
+ Q_D(const QDir);
if (dirName.isEmpty()) {
qWarning("QDir::mkdir: Empty or null file name");
@@ -1508,7 +1548,7 @@ bool QDir::mkdir(const QString &dirName) const
*/
bool QDir::rmdir(const QString &dirName) const
{
- const QDirPrivate* d = d_ptr.constData();
+ Q_D(const QDir);
if (dirName.isEmpty()) {
qWarning("QDir::rmdir: Empty or null file name");
@@ -1536,7 +1576,7 @@ bool QDir::rmdir(const QString &dirName) const
*/
bool QDir::mkpath(const QString &dirPath) const
{
- const QDirPrivate* d = d_ptr.constData();
+ Q_D(const QDir);
if (dirPath.isEmpty()) {
qWarning("QDir::mkpath: Empty or null file name");
@@ -1562,7 +1602,7 @@ bool QDir::mkpath(const QString &dirPath) const
*/
bool QDir::rmpath(const QString &dirPath) const
{
- const QDirPrivate* d = d_ptr.constData();
+ Q_D(const QDir);
if (dirPath.isEmpty()) {
qWarning("QDir::rmpath: Empty or null file name");
@@ -1575,6 +1615,7 @@ bool QDir::rmpath(const QString &dirPath) const
return d->fileEngine->rmdir(fn, true);
}
+#ifndef QT_BOOTSTRAPPED
/*!
\since 5.0
Removes the directory, including all its contents.
@@ -1603,12 +1644,11 @@ bool QDir::removeRecursively()
bool success = true;
const QString dirPath = path();
// not empty -- we must empty it first
- QDirIterator di(dirPath, QDir::AllEntries | QDir::Hidden | QDir::System | QDir::NoDotAndDotDot);
- while (di.hasNext()) {
- const QFileInfo fi = di.nextFileInfo();
- const QString &filePath = di.filePath();
+ constexpr auto dirFilters = QDir::AllEntries | QDir::Hidden | QDir::System | QDir::NoDotAndDotDot;
+ for (const auto &dirEntry : QDirListing(dirPath, dirFilters)) {
+ const QString &filePath = dirEntry.filePath();
bool ok;
- if (fi.isDir() && !fi.isSymLink()) {
+ if (dirEntry.isDir() && !dirEntry.isSymLink()) {
ok = QDir(filePath).removeRecursively(); // recursive
} else {
ok = QFile::remove(filePath);
@@ -1628,6 +1668,7 @@ bool QDir::removeRecursively()
return success;
}
+#endif // !QT_BOOTSTRAPPED
/*!
Returns \c true if the directory is readable \e and we can open files
@@ -1640,13 +1681,15 @@ bool QDir::removeRecursively()
*/
bool QDir::isReadable() const
{
- const QDirPrivate* d = d_ptr.constData();
+ Q_D(const QDir);
if (!d->fileEngine) {
- if (!d->metaData.hasFlags(QFileSystemMetaData::UserReadPermission))
- QFileSystemEngine::fillMetaData(d->dirEntry, d->metaData, QFileSystemMetaData::UserReadPermission);
-
- return d->metaData.permissions().testAnyFlag(QFile::ReadUser);
+ QMutexLocker locker(&d->fileCache.mutex);
+ if (!d->fileCache.metaData.hasFlags(QFileSystemMetaData::UserReadPermission)) {
+ QFileSystemEngine::fillMetaData(d->dirEntry, d->fileCache.metaData,
+ QFileSystemMetaData::UserReadPermission);
+ }
+ return d->fileCache.metaData.permissions().testAnyFlag(QFile::ReadUser);
}
const QAbstractFileEngine::FileFlags info =
@@ -1743,7 +1786,7 @@ bool QDir::isRelative() const
*/
bool QDir::makeAbsolute()
{
- const QDirPrivate *d = d_ptr.constData();
+ Q_D(const QDir);
std::unique_ptr<QDirPrivate> dir;
if (!!d->fileEngine) {
QString absolutePath = d->fileEngine->fileName(QAbstractFileEngine::AbsoluteName);
@@ -1753,16 +1796,18 @@ bool QDir::makeAbsolute()
dir.reset(new QDirPrivate(*d_ptr.constData()));
dir->setPath(absolutePath);
} else { // native FS
- d->resolveAbsoluteEntry();
+ QString absoluteFilePath = d->resolveAbsoluteEntry();
dir.reset(new QDirPrivate(*d_ptr.constData()));
- dir->setPath(d->absoluteDirEntry.filePath());
+ dir->setPath(absoluteFilePath);
}
d_ptr = dir.release(); // actually detach
return true;
}
/*!
- Returns \c true if directory \a dir and this directory have the same
+ \fn bool QDir::operator==(const QDir &lhs, const QDir &rhs)
+
+ Returns \c true if directory \a lhs and directory \a rhs have the same
path and their sort and filter settings are the same; otherwise
returns \c false.
@@ -1770,10 +1815,10 @@ bool QDir::makeAbsolute()
\snippet code/src_corelib_io_qdir.cpp 10
*/
-bool QDir::operator==(const QDir &dir) const
+bool comparesEqual(const QDir &lhs, const QDir &rhs)
{
- const QDirPrivate *d = d_ptr.constData();
- const QDirPrivate *other = dir.d_ptr.constData();
+ const QDirPrivate *d = lhs.d_ptr.constData();
+ const QDirPrivate *other = rhs.d_ptr.constData();
if (d == other)
return true;
@@ -1797,18 +1842,18 @@ bool QDir::operator==(const QDir &dir) const
if (d->dirEntry.filePath() == other->dirEntry.filePath())
return true;
- if (exists()) {
- if (!dir.exists())
+ if (lhs.exists()) {
+ if (!rhs.exists())
return false; //can't be equal if only one exists
// Both exist, fallback to expensive canonical path computation
- return canonicalPath().compare(dir.canonicalPath(), sensitive) == 0;
+ return lhs.canonicalPath().compare(rhs.canonicalPath(), sensitive) == 0;
} else {
- if (dir.exists())
+ if (rhs.exists())
return false; //can't be equal if only one exists
// Neither exists, compare absolute paths rather than canonical (which would be empty strings)
- d->resolveAbsoluteEntry();
- other->resolveAbsoluteEntry();
- return d->absoluteDirEntry.filePath().compare(other->absoluteDirEntry.filePath(), sensitive) == 0;
+ QString thisFilePath = d->resolveAbsoluteEntry();
+ QString otherFilePath = other->resolveAbsoluteEntry();
+ return thisFilePath.compare(otherFilePath, sensitive) == 0;
}
}
return false;
@@ -1833,11 +1878,10 @@ QDir &QDir::operator=(const QDir &dir)
*/
/*!
- \fn bool QDir::operator!=(const QDir &dir) const
+ \fn bool QDir::operator!=(const QDir &lhs, const QDir &rhs)
- Returns \c true if directory \a dir and this directory have different
- paths or different sort or filter settings; otherwise returns
- false.
+ Returns \c true if directory \a lhs and directory \a rhs have different
+ paths or different sort or filter settings; otherwise returns \c false.
Example:
@@ -1904,9 +1948,10 @@ bool QDir::exists(const QString &name) const
qWarning("QDir::exists: Empty or null file name");
return false;
}
- return QFile::exists(filePath(name));
+ return QFileInfo::exists(filePath(name));
}
+#ifndef QT_BOOTSTRAPPED
/*!
Returns whether the directory is empty.
@@ -1922,16 +1967,18 @@ bool QDir::exists(const QString &name) const
*/
bool QDir::isEmpty(Filters filters) const
{
- const auto d = d_ptr.constData();
- QDirIterator it(d->dirEntry.filePath(), d->nameFilters, filters);
- return !it.hasNext();
+ Q_D(const QDir);
+ QDirListing dirList(d->dirEntry.filePath(), d->nameFilters, filters);
+ return dirList.cbegin() == dirList.cend();
}
+#endif // !QT_BOOTSTRAPPED
/*!
Returns a list of the root directories on this system.
On Windows this returns a list of QFileInfo objects containing "C:/",
- "D:/", etc. On other operating systems, it returns a list containing
+ "D:/", etc. This does not return drives with ejectable media that are empty.
+ On other operating systems, it returns a list containing
just one root directory (i.e. "/").
\sa root(), rootPath()
@@ -2160,7 +2207,7 @@ QString qt_normalizePathSegments(const QString &name, QDirPrivate::PathNormaliza
{
const bool allowUncPaths = flags.testAnyFlag(QDirPrivate::AllowUncPaths);
const bool isRemote = flags.testAnyFlag(QDirPrivate::RemotePath);
- const int len = name.length();
+ const qsizetype len = name.size();
if (ok)
*ok = false;
@@ -2168,15 +2215,15 @@ QString qt_normalizePathSegments(const QString &name, QDirPrivate::PathNormaliza
if (len == 0)
return name;
- int i = len - 1;
+ qsizetype i = len - 1;
QVarLengthArray<char16_t> outVector(len);
- int used = len;
+ qsizetype used = len;
char16_t *out = outVector.data();
- const ushort *p = name.utf16();
- const ushort *prefix = p;
- int up = 0;
+ const char16_t *p = reinterpret_cast<const char16_t *>(name.data());
+ const char16_t *prefix = p;
+ qsizetype up = 0;
- const int prefixLength = rootLength(name, allowUncPaths);
+ const qsizetype prefixLength = rootLength(name, allowUncPaths);
p += prefixLength;
i -= prefixLength;
@@ -2187,10 +2234,10 @@ QString qt_normalizePathSegments(const QString &name, QDirPrivate::PathNormaliza
--i;
}
- auto isDot = [](const ushort *p, int i) {
+ auto isDot = [](const char16_t *p, qsizetype i) {
return i > 1 && p[i - 1] == '.' && p[i - 2] == '/';
};
- auto isDotDot = [](const ushort *p, int i) {
+ auto isDotDot = [](const char16_t *p, qsizetype i) {
return i > 2 && p[i - 1] == '.' && p[i - 2] == '.' && p[i - 3] == '/';
};
@@ -2293,7 +2340,7 @@ QString qt_normalizePathSegments(const QString &name, QDirPrivate::PathNormaliza
// string only consists of a prefix followed by one or more slashes. Just skip the slash.
++used;
}
- for (int i = prefixLength - 1; i >= 0; --i)
+ for (qsizetype i = prefixLength - 1; i >= 0; --i)
out[--used] = prefix[i];
} else {
if (isEmpty) {
@@ -2311,7 +2358,7 @@ QString qt_normalizePathSegments(const QString &name, QDirPrivate::PathNormaliza
// If path was not modified return the original value
if (used == 0)
return name;
- return QString::fromUtf16(out + used, len - used);
+ return QStringView(out + used, len - used).toString();
}
static QString qt_cleanPath(const QString &path, bool *ok)
@@ -2325,9 +2372,9 @@ static QString qt_cleanPath(const QString &path, bool *ok)
QString ret = qt_normalizePathSegments(name, OSSupportsUncPaths ? QDirPrivate::AllowUncPaths : QDirPrivate::DefaultNormalization, ok);
// Strip away last slash except for root directories
- if (ret.length() > 1 && ret.endsWith(QLatin1Char('/'))) {
+ if (ret.size() > 1 && ret.endsWith(u'/')) {
#if defined (Q_OS_WIN)
- if (!(ret.length() == 3 && ret.at(1) == QLatin1Char(':')))
+ if (!(ret.length() == 3 && ret.at(1) == u':'))
#endif
ret.chop(1);
}
@@ -2371,10 +2418,8 @@ bool QDir::isRelativePath(const QString &path)
*/
void QDir::refresh() const
{
- QDirPrivate *d = const_cast<QDir*>(this)->d_ptr.data();
- d->metaData.clear();
- d->initFileEngine();
- d->clearFileLists();
+ QDirPrivate *d = const_cast<QDir *>(this)->d_func();
+ d->clearCache(QDirPrivate::IncludingMetaData);
}
/*!
@@ -2397,59 +2442,6 @@ QStringList QDir::nameFiltersFromString(const QString &nameFilter)
return QDirPrivate::splitFilters(nameFilter);
}
-/*!
- \macro void Q_INIT_RESOURCE(name)
- \relates QDir
-
- Initializes the resources specified by the \c .qrc file with the
- specified base \a name. Normally, when resources are built as part
- of the application, the resources are loaded automatically at
- startup. The Q_INIT_RESOURCE() macro is necessary on some platforms
- for resources stored in a static library.
-
- For example, if your application's resources are listed in a file
- called \c myapp.qrc, you can ensure that the resources are
- initialized at startup by adding this line to your \c main()
- function:
-
- \snippet code/src_corelib_io_qdir.cpp 13
-
- If the file name contains characters that cannot be part of a valid C++ function name
- (such as '-'), they have to be replaced by the underscore character ('_').
-
- \note This macro cannot be used in a namespace. It should be called from
- main(). If that is not possible, the following workaround can be used
- to init the resource \c myapp from the function \c{MyNamespace::myFunction}:
-
- \snippet code/src_corelib_io_qdir.cpp 14
-
- \sa Q_CLEANUP_RESOURCE(), {The Qt Resource System}
-*/
-
-/*!
- \since 4.1
- \macro void Q_CLEANUP_RESOURCE(name)
- \relates QDir
-
- Unloads the resources specified by the \c .qrc file with the base
- name \a name.
-
- Normally, Qt resources are unloaded automatically when the
- application terminates, but if the resources are located in a
- plugin that is being unloaded, call Q_CLEANUP_RESOURCE() to force
- removal of your resources.
-
- \note This macro cannot be used in a namespace. Please see the
- Q_INIT_RESOURCE documentation for a workaround.
-
- Example:
-
- \snippet code/src_corelib_io_qdir.cpp 15
-
- \sa Q_INIT_RESOURCE(), {The Qt Resource System}
-*/
-
-
#ifndef QT_NO_DEBUG_STREAM
QDebug operator<<(QDebug debug, QDir::Filters filters)
{
@@ -2457,25 +2449,25 @@ QDebug operator<<(QDebug debug, QDir::Filters filters)
debug.resetFormat();
QStringList flags;
if (filters == QDir::NoFilter) {
- flags << QLatin1String("NoFilter");
+ flags << "NoFilter"_L1;
} else {
- if (filters & QDir::Dirs) flags << QLatin1String("Dirs");
- if (filters & QDir::AllDirs) flags << QLatin1String("AllDirs");
- if (filters & QDir::Files) flags << QLatin1String("Files");
- if (filters & QDir::Drives) flags << QLatin1String("Drives");
- if (filters & QDir::NoSymLinks) flags << QLatin1String("NoSymLinks");
- if (filters & QDir::NoDot) flags << QLatin1String("NoDot");
- if (filters & QDir::NoDotDot) flags << QLatin1String("NoDotDot");
- if ((filters & QDir::AllEntries) == QDir::AllEntries) flags << QLatin1String("AllEntries");
- if (filters & QDir::Readable) flags << QLatin1String("Readable");
- if (filters & QDir::Writable) flags << QLatin1String("Writable");
- if (filters & QDir::Executable) flags << QLatin1String("Executable");
- if (filters & QDir::Modified) flags << QLatin1String("Modified");
- if (filters & QDir::Hidden) flags << QLatin1String("Hidden");
- if (filters & QDir::System) flags << QLatin1String("System");
- if (filters & QDir::CaseSensitive) flags << QLatin1String("CaseSensitive");
+ if (filters & QDir::Dirs) flags << "Dirs"_L1;
+ if (filters & QDir::AllDirs) flags << "AllDirs"_L1;
+ if (filters & QDir::Files) flags << "Files"_L1;
+ if (filters & QDir::Drives) flags << "Drives"_L1;
+ if (filters & QDir::NoSymLinks) flags << "NoSymLinks"_L1;
+ if (filters & QDir::NoDot) flags << "NoDot"_L1;
+ if (filters & QDir::NoDotDot) flags << "NoDotDot"_L1;
+ if ((filters & QDir::AllEntries) == QDir::AllEntries) flags << "AllEntries"_L1;
+ if (filters & QDir::Readable) flags << "Readable"_L1;
+ if (filters & QDir::Writable) flags << "Writable"_L1;
+ if (filters & QDir::Executable) flags << "Executable"_L1;
+ if (filters & QDir::Modified) flags << "Modified"_L1;
+ if (filters & QDir::Hidden) flags << "Hidden"_L1;
+ if (filters & QDir::System) flags << "System"_L1;
+ if (filters & QDir::CaseSensitive) flags << "CaseSensitive"_L1;
}
- debug.noquote() << "QDir::Filters(" << flags.join(QLatin1Char('|')) << ')';
+ debug.noquote() << "QDir::Filters(" << flags.join(u'|') << ')';
return debug;
}
@@ -2487,18 +2479,18 @@ static QDebug operator<<(QDebug debug, QDir::SortFlags sorting)
debug << "QDir::SortFlags(NoSort)";
} else {
QString type;
- if ((sorting & QDir::SortByMask) == QDir::Name) type = QLatin1String("Name");
- if ((sorting & QDir::SortByMask) == QDir::Time) type = QLatin1String("Time");
- if ((sorting & QDir::SortByMask) == QDir::Size) type = QLatin1String("Size");
- if ((sorting & QDir::SortByMask) == QDir::Unsorted) type = QLatin1String("Unsorted");
+ if ((sorting & QDir::SortByMask) == QDir::Name) type = "Name"_L1;
+ if ((sorting & QDir::SortByMask) == QDir::Time) type = "Time"_L1;
+ if ((sorting & QDir::SortByMask) == QDir::Size) type = "Size"_L1;
+ if ((sorting & QDir::SortByMask) == QDir::Unsorted) type = "Unsorted"_L1;
QStringList flags;
- if (sorting & QDir::DirsFirst) flags << QLatin1String("DirsFirst");
- if (sorting & QDir::DirsLast) flags << QLatin1String("DirsLast");
- if (sorting & QDir::IgnoreCase) flags << QLatin1String("IgnoreCase");
- if (sorting & QDir::LocaleAware) flags << QLatin1String("LocaleAware");
- if (sorting & QDir::Type) flags << QLatin1String("Type");
- debug.noquote() << "QDir::SortFlags(" << type << '|' << flags.join(QLatin1Char('|')) << ')';
+ if (sorting & QDir::DirsFirst) flags << "DirsFirst"_L1;
+ if (sorting & QDir::DirsLast) flags << "DirsLast"_L1;
+ if (sorting & QDir::IgnoreCase) flags << "IgnoreCase"_L1;
+ if (sorting & QDir::LocaleAware) flags << "LocaleAware"_L1;
+ if (sorting & QDir::Type) flags << "Type"_L1;
+ debug.noquote() << "QDir::SortFlags(" << type << '|' << flags.join(u'|') << ')';
}
return debug;
}
@@ -2508,7 +2500,7 @@ QDebug operator<<(QDebug debug, const QDir &dir)
QDebugStateSaver save(debug);
debug.resetFormat();
debug << "QDir(" << dir.path() << ", nameFilters = {"
- << dir.nameFilters().join(QLatin1Char(','))
+ << dir.nameFilters().join(u',')
<< "}, "
<< dir.sorting()
<< ','
diff --git a/src/corelib/io/qdir.h b/src/corelib/io/qdir.h
index 38a4d8d961..53c0900f95 100644
--- a/src/corelib/io/qdir.h
+++ b/src/corelib/io/qdir.h
@@ -1,45 +1,10 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QDIR_H
#define QDIR_H
+#include <QtCore/qcompare.h>
#include <QtCore/qstring.h>
#include <QtCore/qfile.h>
#include <QtCore/qfileinfo.h>
@@ -102,7 +67,7 @@ public:
QDir(const QString &path = QString());
QDir(const QString &path, const QString &nameFilter,
SortFlags sort = SortFlags(Name | IgnoreCase), Filters filter = AllEntries);
-#ifdef Q_CLANG_QDOC
+#ifdef Q_QDOC
QDir(const std::filesystem::path &path);
QDir(const std::filesystem::path &path, const QString &nameFilter,
SortFlags sort = SortFlags(Name | IgnoreCase), Filters filter = AllEntries);
@@ -124,10 +89,10 @@ public:
QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_PURE_SWAP(QDir)
void swap(QDir &other) noexcept
- { qSwap(d_ptr, other.d_ptr); }
+ { d_ptr.swap(other.d_ptr); }
void setPath(const QString &path);
-#ifdef Q_CLANG_QDOC
+#ifdef Q_QDOC
void setPath(const std::filesystem::path &path);
#elif QT_CONFIG(cxx17_filesystem)
template<typename T, QtPrivate::ForceFilesystemPath<T> = 0>
@@ -139,7 +104,7 @@ public:
QString path() const;
QString absolutePath() const;
QString canonicalPath() const;
-#if QT_CONFIG(cxx17_filesystem) || defined(Q_CLANG_QDOC)
+#if QT_CONFIG(cxx17_filesystem) || defined(Q_QDOC)
std::filesystem::path filesystemPath() const
{ return QtPrivate::toFilesystemPath(path()); }
std::filesystem::path filesystemAbsolutePath() const
@@ -148,9 +113,10 @@ public:
{ return QtPrivate::toFilesystemPath(canonicalPath()); }
#endif // QT_CONFIG(cxx17_filesystem)
+#ifndef QT_BOOTSTRAPPED
static void setSearchPaths(const QString &prefix, const QStringList &searchPaths);
static void addSearchPath(const QString &prefix, const QString &path);
-#ifdef Q_CLANG_QDOC
+#ifdef Q_QDOC
static void addSearchPath(const QString &prefix, const std::filesystem::path &path);
#elif QT_CONFIG(cxx17_filesystem)
template<typename T, QtPrivate::ForceFilesystemPath<T> = 0>
@@ -160,6 +126,7 @@ public:
}
#endif // QT_CONFIG(cxx17_filesystem)
static QStringList searchPaths(const QString &prefix);
+#endif // QT_BOOTSTRAPPED
QString dirName() const;
QString filePath(const QString &fileName) const;
@@ -180,10 +147,16 @@ public:
SortFlags sorting() const;
void setSorting(SortFlags sort);
+#if QT_CORE_REMOVED_SINCE(6, 5)
uint count() const;
+#endif
+ qsizetype count(QT6_DECL_NEW_OVERLOAD) const;
bool isEmpty(Filters filters = Filters(AllEntries | NoDotAndDotDot)) const;
+#if QT_CORE_REMOVED_SINCE(6, 5) && QT_POINTER_SIZE != 4
QString operator[](int) const;
+#endif
+ QString operator[](qsizetype) const;
static QStringList nameFiltersFromString(const QString &nameFilter);
@@ -213,8 +186,10 @@ public:
inline bool isAbsolute() const { return !isRelative(); }
bool makeAbsolute();
+#if QT_CORE_REMOVED_SINCE(6, 8)
bool operator==(const QDir &dir) const;
inline bool operator!=(const QDir &dir) const { return !operator==(dir); }
+#endif
bool remove(const QString &fileName);
bool rename(const QString &oldName, const QString &newName);
@@ -225,18 +200,18 @@ public:
constexpr static inline QChar listSeparator() noexcept
{
#if defined(Q_OS_WIN)
- return QLatin1Char(';');
+ return u';';
#else
- return QLatin1Char(':');
+ return u':';
#endif
}
static QChar separator()
{
#if defined(Q_OS_WIN)
- return QLatin1Char('\\');
+ return u'\\';
#else
- return QLatin1Char('/');
+ return u'/';
#endif
}
@@ -265,7 +240,10 @@ protected:
QSharedDataPointer<QDirPrivate> d_ptr;
private:
+ friend Q_CORE_EXPORT bool comparesEqual(const QDir &lhs, const QDir &rhs);
+ Q_DECLARE_EQUALITY_COMPARABLE(QDir)
friend class QDirIterator;
+ friend class QDirListing;
// Q_DECLARE_PRIVATE equivalent for shared data pointers
QDirPrivate *d_func();
const QDirPrivate *d_func() const { return d_ptr.constData(); }
diff --git a/src/corelib/io/qdir_p.h b/src/corelib/io/qdir_p.h
index af105de8db..7dce69c195 100644
--- a/src/corelib/io/qdir_p.h
+++ b/src/corelib/io/qdir_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QDIR_P_H
#define QDIR_P_H
@@ -54,6 +18,8 @@
#include "qfilesystementry_p.h"
#include "qfilesystemmetadata_p.h"
+#include <QtCore/qmutex.h>
+
#include <memory>
QT_BEGIN_NAMESPACE
@@ -73,14 +39,13 @@ public:
QDir::SortFlags sort_ = QDir::SortFlags(QDir::Name | QDir::IgnoreCase),
QDir::Filters filters_ = QDir::AllEntries);
- explicit QDirPrivate(const QDirPrivate &copy);
+ explicit QDirPrivate(const QDirPrivate &copy); // Copies everything except mutex and fileEngine
bool exists() const;
- void initFileEngine();
void initFileLists(const QDir &dir) const;
- static void sortFileList(QDir::SortFlags, QFileInfoList &, QStringList *, QFileInfoList *);
+ static void sortFileList(QDir::SortFlags, const QFileInfoList &, QStringList *, QFileInfoList *);
static inline QChar getFilterSepChar(const QString &nameFilter);
@@ -88,13 +53,10 @@ public:
void setPath(const QString &path);
- void clearFileLists();
-
- void resolveAbsoluteEntry() const;
+ enum MetaDataClearing { KeepMetaData, IncludingMetaData };
+ void clearCache(MetaDataClearing mode);
- mutable bool fileListsInitialized;
- mutable QStringList files;
- mutable QFileInfoList fileInfos;
+ QString resolveAbsoluteEntry() const;
QStringList nameFilters;
QDir::SortFlags sort;
@@ -103,8 +65,17 @@ public:
std::unique_ptr<QAbstractFileEngine> fileEngine;
QFileSystemEntry dirEntry;
- mutable QFileSystemEntry absoluteDirEntry;
- mutable QFileSystemMetaData metaData;
+
+ struct FileCache
+ {
+ QMutex mutex;
+ QStringList files;
+ QFileInfoList fileInfos;
+ std::atomic<bool> fileListsInitialized = false;
+ QFileSystemEntry absoluteDirEntry;
+ QFileSystemMetaData metaData;
+ };
+ mutable FileCache fileCache;
};
Q_DECLARE_OPERATORS_FOR_FLAGS(QDirPrivate::PathNormalizations)
diff --git a/src/corelib/io/qdirentryinfo_p.h b/src/corelib/io/qdirentryinfo_p.h
new file mode 100644
index 0000000000..7ed5391ff0
--- /dev/null
+++ b/src/corelib/io/qdirentryinfo_p.h
@@ -0,0 +1,156 @@
+// Copyright (C) 2024 Ahmad Samir <a.samirh78@gmail.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QDIRENTRYINFO_P_H
+#define QDIRENTRYINFO_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QtCore/private/qfileinfo_p.h>
+#include <QtCore/private/qfilesystementry_p.h>
+#include <QtCore/private/qfilesystemmetadata_p.h>
+
+QT_BEGIN_NAMESPACE
+
+class QDirEntryInfo
+{
+ const QFileSystemMetaData &ensureFilled(QFileSystemMetaData::MetaDataFlags what)
+ {
+ if (!metaData.hasFlags(what))
+ QFileSystemEngine::fillMetaData(entry, metaData, what);
+ return metaData;
+ }
+
+public:
+ const QFileInfo &fileInfo()
+ {
+ if (!fileInfoOpt) {
+ fileInfoOpt.emplace(new QFileInfoPrivate(entry, metaData));
+ metaData.clear();
+ }
+ return *fileInfoOpt;
+ }
+
+ QString fileName()
+ { return fileInfoOpt ? fileInfoOpt->fileName() : entry.fileName(); }
+ QString baseName()
+ { return fileInfoOpt ? fileInfoOpt->baseName() : entry.baseName(); }
+ QString completeBaseName() const
+ { return fileInfoOpt ? fileInfoOpt->completeBaseName() : entry.completeBaseName(); }
+ QString suffix() const
+ { return fileInfoOpt ? fileInfoOpt->suffix() : entry.suffix(); }
+ QString completeSuffix() const
+ { return fileInfoOpt ? fileInfoOpt->completeSuffix() : entry.completeSuffix(); }
+ QString filePath()
+ { return fileInfoOpt ? fileInfoOpt->filePath() : entry.filePath(); }
+
+ QString bundleName() { return fileInfo().bundleName(); }
+
+ QString canonicalFilePath()
+ {
+ // QFileInfo caches these strings
+ return fileInfo().canonicalFilePath();
+ }
+
+ QString absoluteFilePath() {
+ // QFileInfo caches these strings
+ return fileInfo().absoluteFilePath();
+ }
+
+ QString absolutePath() {
+ // QFileInfo caches these strings
+ return fileInfo().absolutePath();
+ }
+
+
+ bool isDir() {
+ if (fileInfoOpt)
+ return fileInfoOpt->isDir();
+
+ return ensureFilled(QFileSystemMetaData::DirectoryType).isDirectory();
+ }
+
+ bool isFile() {
+ if (fileInfoOpt)
+ return fileInfoOpt->isFile();
+
+ return ensureFilled(QFileSystemMetaData::FileType).isFile();
+ }
+
+ bool isSymLink() {
+ if (fileInfoOpt)
+ return fileInfoOpt->isSymLink();
+
+ return ensureFilled(QFileSystemMetaData::LegacyLinkType).isLegacyLink();
+ }
+
+ bool isSymbolicLink() {
+ if (fileInfoOpt)
+ return fileInfoOpt->isSymbolicLink();
+
+ return ensureFilled(QFileSystemMetaData::LinkType).isLink();
+ }
+
+ bool exists() {
+ if (fileInfoOpt)
+ return fileInfoOpt->exists();
+
+ return ensureFilled(QFileSystemMetaData::ExistsAttribute).exists();
+ }
+
+ bool isHidden() {
+ if (fileInfoOpt)
+ return fileInfoOpt->isHidden();
+
+ return ensureFilled(QFileSystemMetaData::HiddenAttribute).isHidden();
+ }
+
+ bool isReadable() {
+ if (fileInfoOpt)
+ return fileInfoOpt->isReadable();
+
+ return ensureFilled(QFileSystemMetaData::UserReadPermission).isReadable();
+ }
+
+ bool isWritable() {
+ if (fileInfoOpt)
+ return fileInfoOpt->isWritable();
+
+ return ensureFilled(QFileSystemMetaData::UserWritePermission).isWritable();
+ }
+
+ bool isExecutable() {
+ if (fileInfoOpt)
+ return fileInfoOpt->isExecutable();
+
+ return ensureFilled(QFileSystemMetaData::UserExecutePermission).isExecutable();
+ }
+
+ qint64 size() { return fileInfo().size(); }
+
+ QDateTime fileTime(QFile::FileTime type, const QTimeZone &tz)
+ {
+ return fileInfo().fileTime(type, tz);
+ }
+
+private:
+ friend class QDirListingPrivate;
+ friend class QDirListing;
+
+ QFileSystemEntry entry;
+ QFileSystemMetaData metaData;
+ std::optional<QFileInfo> fileInfoOpt;
+};
+
+QT_END_NAMESPACE
+
+#endif // QDIRENTRYINFO_P_H
diff --git a/src/corelib/io/qdiriterator.cpp b/src/corelib/io/qdiriterator.cpp
index 7e86aacdb1..3604e673e2 100644
--- a/src/corelib/io/qdiriterator.cpp
+++ b/src/corelib/io/qdiriterator.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
/*!
\since 4.3
@@ -70,6 +34,9 @@
you cannot iterate directories in reverse order) and does not allow random
access.
+ \note This class is deprecated and may be removed in a Qt release. Use
+ QDirListing instead.
+
\sa QDir, QDir::entryList()
*/
@@ -92,6 +59,8 @@
#include "qdiriterator.h"
#include "qdir_p.h"
#include "qabstractfileengine_p.h"
+#include "qdirlisting.h"
+#include "qdirentryinfo_p.h"
#include <QtCore/qset.h>
#include <QtCore/qstack.h>
@@ -108,295 +77,74 @@
#include <QtCore/private/qduplicatetracker_p.h>
#include <memory>
+#include <stack>
+#include <vector>
QT_BEGIN_NAMESPACE
-template <class Iterator>
-class QDirIteratorPrivateIteratorStack : public QStack<Iterator *>
-{
-public:
- ~QDirIteratorPrivateIteratorStack()
- {
- qDeleteAll(*this);
- }
-};
+using namespace Qt::StringLiterals;
class QDirIteratorPrivate
{
-public:
- QDirIteratorPrivate(const QFileSystemEntry &entry, const QStringList &nameFilters,
- QDir::Filters _filters, QDirIterator::IteratorFlags flags, bool resolveEngine = true);
-
- void advance();
-
- bool entryMatches(const QString & fileName, const QFileInfo &fileInfo);
- void pushDirectory(const QFileInfo &fileInfo);
- void checkAndPushDirectory(const QFileInfo &);
- bool matchesFilters(const QString &fileName, const QFileInfo &fi) const;
-
- std::unique_ptr<QAbstractFileEngine> engine;
-
- QFileSystemEntry dirEntry;
- const QStringList nameFilters;
- const QDir::Filters filters;
- const QDirIterator::IteratorFlags iteratorFlags;
-
-#if QT_CONFIG(regularexpression)
- QList<QRegularExpression> nameRegExps;
-#endif
-
- QDirIteratorPrivateIteratorStack<QAbstractFileEngineIterator> fileEngineIterators;
-#ifndef QT_NO_FILESYSTEMITERATOR
- QDirIteratorPrivateIteratorStack<QFileSystemIterator> nativeIterators;
-#endif
-
- QFileInfo currentFileInfo;
- QFileInfo nextFileInfo;
+ static QDirListing::IteratorFlags toDirListingFlags(QDirIterator::IteratorFlags flags)
+ {
+ using F = QDirListing::IteratorFlag;
+ QDirListing::IteratorFlags listerFlags;
- // Loop protection
- QDuplicateTracker<QString> visitedLinks;
-};
+ if (flags & QDirIterator::NoIteratorFlags)
+ listerFlags.setFlag(F::NoFlag);
+ if (flags & QDirIterator::FollowSymlinks)
+ listerFlags.setFlag(F::FollowSymlinks);
+ if (flags & QDirIterator::Subdirectories)
+ listerFlags.setFlag(F::Recursive);
-/*!
- \internal
-*/
-QDirIteratorPrivate::QDirIteratorPrivate(const QFileSystemEntry &entry, const QStringList &nameFilters,
- QDir::Filters _filters, QDirIterator::IteratorFlags flags, bool resolveEngine)
- : dirEntry(entry)
- , nameFilters(nameFilters.contains(QLatin1String("*")) ? QStringList() : nameFilters)
- , filters(QDir::NoFilter == _filters ? QDir::AllEntries : _filters)
- , iteratorFlags(flags)
-{
-#if QT_CONFIG(regularexpression)
- nameRegExps.reserve(nameFilters.size());
- for (const auto &filter : nameFilters) {
- auto re = QRegularExpression::fromWildcard(filter, (filters & QDir::CaseSensitive ?
- Qt::CaseSensitive : Qt::CaseInsensitive));
- nameRegExps.append(re);
+ return listerFlags;
}
-#endif
- QFileSystemMetaData metaData;
- if (resolveEngine)
- engine.reset(QFileSystemEngine::resolveEntryAndCreateLegacyEngine(dirEntry, metaData));
- QFileInfo fileInfo(new QFileInfoPrivate(dirEntry, metaData));
-
- // Populate fields for hasNext() and next()
- pushDirectory(fileInfo);
- advance();
-}
-/*!
- \internal
-*/
-void QDirIteratorPrivate::pushDirectory(const QFileInfo &fileInfo)
-{
- QString path = fileInfo.filePath();
-
-#ifdef Q_OS_WIN
- if (fileInfo.isSymLink())
- path = fileInfo.canonicalFilePath();
-#endif
-
- if ((iteratorFlags & QDirIterator::FollowSymlinks)) {
- // Stop link loops
- if (visitedLinks.hasSeen(fileInfo.canonicalFilePath()))
- return;
+public:
+ QDirIteratorPrivate(const QDir &dir, QDirIterator::IteratorFlags flags)
+ : lister(dir, toDirListingFlags(flags))
+ {
+ init();
}
-
- if (engine) {
- engine->setFileName(path);
- QAbstractFileEngineIterator *it = engine->beginEntryList(filters, nameFilters);
- if (it) {
- it->setPath(path);
- fileEngineIterators << it;
- } else {
- // No iterator; no entry list.
- }
- } else {
-#ifndef QT_NO_FILESYSTEMITERATOR
- QFileSystemIterator *it = new QFileSystemIterator(fileInfo.d_ptr->fileEntry,
- filters, nameFilters, iteratorFlags);
- nativeIterators << it;
-#else
- qWarning("Qt was built with -no-feature-filesystemiterator: no files/plugins will be found!");
-#endif
+ QDirIteratorPrivate(const QString &path, QDirIterator::IteratorFlags flags)
+ : lister(path, toDirListingFlags(flags))
+ {
+ init();
}
-}
-
-inline bool QDirIteratorPrivate::entryMatches(const QString & fileName, const QFileInfo &fileInfo)
-{
- checkAndPushDirectory(fileInfo);
-
- if (matchesFilters(fileName, fileInfo)) {
- currentFileInfo = nextFileInfo;
- nextFileInfo = fileInfo;
-
- //We found a matching entry.
- return true;
+ QDirIteratorPrivate(const QString &path, QDir::Filters filters,
+ QDirIterator::IteratorFlags flags)
+ : lister(path, filters, toDirListingFlags(flags))
+ {
+ init();
}
-
- return false;
-}
-
-/*!
- \internal
-*/
-void QDirIteratorPrivate::advance()
-{
- if (engine) {
- while (!fileEngineIterators.isEmpty()) {
- // Find the next valid iterator that matches the filters.
- QAbstractFileEngineIterator *it;
- while (it = fileEngineIterators.top(), it->hasNext()) {
- it->next();
- if (entryMatches(it->currentFileName(), it->currentFileInfo()))
- return;
- }
-
- fileEngineIterators.pop();
- delete it;
- }
- } else {
-#ifndef QT_NO_FILESYSTEMITERATOR
- QFileSystemEntry nextEntry;
- QFileSystemMetaData nextMetaData;
-
- while (!nativeIterators.isEmpty()) {
- // Find the next valid iterator that matches the filters.
- QFileSystemIterator *it;
- while (it = nativeIterators.top(), it->advance(nextEntry, nextMetaData)) {
- QFileInfo info(new QFileInfoPrivate(nextEntry, nextMetaData));
-
- if (entryMatches(nextEntry.fileName(), info))
- return;
- nextMetaData = QFileSystemMetaData();
- }
-
- nativeIterators.pop();
- delete it;
- }
-#endif
+ QDirIteratorPrivate(const QString &path, const QStringList &nameFilters, QDir::Filters filters,
+ QDirIterator::IteratorFlags flags)
+ : lister(path, nameFilters, filters, toDirListingFlags(flags))
+ {
+ init();
}
- currentFileInfo = nextFileInfo;
- nextFileInfo = QFileInfo();
-}
-
-/*!
- \internal
- */
-void QDirIteratorPrivate::checkAndPushDirectory(const QFileInfo &fileInfo)
-{
- // If we're doing flat iteration, we're done.
- if (!(iteratorFlags & QDirIterator::Subdirectories))
- return;
-
- // Never follow non-directory entries
- if (!fileInfo.isDir())
- return;
-
- // Follow symlinks only when asked
- if (!(iteratorFlags & QDirIterator::FollowSymlinks) && fileInfo.isSymLink())
- return;
-
- // Never follow . and ..
- QString fileName = fileInfo.fileName();
- if (QLatin1String(".") == fileName || QLatin1String("..") == fileName)
- return;
-
- // No hidden directories unless requested
- if (!(filters & QDir::AllDirs) && !(filters & QDir::Hidden) && fileInfo.isHidden())
- return;
-
- pushDirectory(fileInfo);
-}
-
-/*!
- \internal
-
- This convenience function implements the iterator's filtering logics and
- applies then to the current directory entry.
-
- It returns \c true if the current entry matches the filters (i.e., the
- current entry will be returned as part of the directory iteration);
- otherwise, false is returned.
-*/
-
-bool QDirIteratorPrivate::matchesFilters(const QString &fileName, const QFileInfo &fi) const
-{
- if (fileName.isEmpty())
- return false;
-
- // filter . and ..?
- const int fileNameSize = fileName.size();
- const bool dotOrDotDot = fileName[0] == QLatin1Char('.')
- && ((fileNameSize == 1)
- ||(fileNameSize == 2 && fileName[1] == QLatin1Char('.')));
- if ((filters & QDir::NoDot) && dotOrDotDot && fileNameSize == 1)
- return false;
- if ((filters & QDir::NoDotDot) && dotOrDotDot && fileNameSize == 2)
- return false;
-
- // name filter
-#if QT_CONFIG(regularexpression)
- // Pass all entries through name filters, except dirs if the AllDirs
- if (!nameFilters.isEmpty() && !((filters & QDir::AllDirs) && fi.isDir())) {
- bool matched = false;
- for (const auto &re : nameRegExps) {
- if (re.match(fileName).hasMatch()) {
- matched = true;
- break;
- }
- }
- if (!matched)
- return false;
- }
-#endif
- // skip symlinks
- const bool skipSymlinks = filters.testAnyFlag(QDir::NoSymLinks);
- const bool includeSystem = filters.testAnyFlag(QDir::System);
- if (skipSymlinks && fi.isSymLink()) {
- // The only reason to save this file is if it is a broken link and we are requesting system files.
- if (!includeSystem || fi.exists())
- return false;
+ void init()
+ {
+ it = lister.begin();
+ if (it != lister.end())
+ nextFileInfo = it->fileInfo();
}
- // filter hidden
- const bool includeHidden = filters.testAnyFlag(QDir::Hidden);
- if (!includeHidden && !dotOrDotDot && fi.isHidden())
- return false;
-
- // filter system files
- if (!includeSystem && (!(fi.isFile() || fi.isDir() || fi.isSymLink())
- || (!fi.exists() && fi.isSymLink())))
- return false;
-
- // skip directories
- const bool skipDirs = !(filters & (QDir::Dirs | QDir::AllDirs));
- if (skipDirs && fi.isDir())
- return false;
-
- // skip files
- const bool skipFiles = !(filters & QDir::Files);
- if (skipFiles && fi.isFile())
- // Basically we need a reason not to exclude this file otherwise we just eliminate it.
- return false;
-
- // filter permissions
- const bool filterPermissions = ((filters & QDir::PermissionMask)
- && (filters & QDir::PermissionMask) != QDir::PermissionMask);
- const bool doWritable = !filterPermissions || (filters & QDir::Writable);
- const bool doExecutable = !filterPermissions || (filters & QDir::Executable);
- const bool doReadable = !filterPermissions || (filters & QDir::Readable);
- if (filterPermissions
- && ((doReadable && !fi.isReadable())
- || (doWritable && !fi.isWritable())
- || (doExecutable && !fi.isExecutable()))) {
- return false;
+ void advance()
+ {
+ currentFileInfo = nextFileInfo;
+ if (++it != lister.end()) {
+ nextFileInfo = it->fileInfo();
+ }
}
- return true;
-}
+ QDirListing lister;
+ QDirListing::const_iterator it = {};
+ QFileInfo currentFileInfo;
+ QFileInfo nextFileInfo;
+};
/*!
Constructs a QDirIterator that can iterate over \a dir's entrylist, using
@@ -414,9 +162,8 @@ bool QDirIteratorPrivate::matchesFilters(const QString &fileName, const QFileInf
\sa hasNext(), next(), IteratorFlags
*/
QDirIterator::QDirIterator(const QDir &dir, IteratorFlags flags)
+ : d(new QDirIteratorPrivate(dir, flags))
{
- const QDirPrivate *other = dir.d_ptr.constData();
- d.reset(new QDirIteratorPrivate(other->dirEntry, other->nameFilters, other->filters, flags, bool(other->fileEngine)));
}
/*!
@@ -433,7 +180,7 @@ QDirIterator::QDirIterator(const QDir &dir, IteratorFlags flags)
\sa hasNext(), next(), IteratorFlags
*/
QDirIterator::QDirIterator(const QString &path, QDir::Filters filters, IteratorFlags flags)
- : d(new QDirIteratorPrivate(QFileSystemEntry(path), QStringList(), filters, flags))
+ : d(new QDirIteratorPrivate(path, filters, flags))
{
}
@@ -450,7 +197,7 @@ QDirIterator::QDirIterator(const QString &path, QDir::Filters filters, IteratorF
\sa hasNext(), next(), IteratorFlags
*/
QDirIterator::QDirIterator(const QString &path, IteratorFlags flags)
- : d(new QDirIteratorPrivate(QFileSystemEntry(path), QStringList(), QDir::NoFilter, flags))
+ : d(new QDirIteratorPrivate(path, flags))
{
}
@@ -474,7 +221,7 @@ QDirIterator::QDirIterator(const QString &path, IteratorFlags flags)
*/
QDirIterator::QDirIterator(const QString &path, const QStringList &nameFilters,
QDir::Filters filters, IteratorFlags flags)
- : d(new QDirIteratorPrivate(QFileSystemEntry(path), nameFilters, filters, flags))
+ : d(new QDirIteratorPrivate(path, nameFilters, filters, flags))
{
}
@@ -500,7 +247,7 @@ QDirIterator::~QDirIterator()
QString QDirIterator::next()
{
d->advance();
- return filePath();
+ return d->currentFileInfo.filePath();
}
/*!
@@ -520,7 +267,7 @@ QString QDirIterator::next()
QFileInfo QDirIterator::nextFileInfo()
{
d->advance();
- return fileInfo();
+ return d->currentFileInfo;
}
/*!
@@ -531,14 +278,7 @@ QFileInfo QDirIterator::nextFileInfo()
*/
bool QDirIterator::hasNext() const
{
- if (d->engine)
- return !d->fileEngineIterators.isEmpty();
- else
-#ifndef QT_NO_FILESYSTEMITERATOR
- return !d->nativeIterators.isEmpty();
-#else
- return false;
-#endif
+ return d->it != d->lister.end();
}
/*!
@@ -581,7 +321,7 @@ QFileInfo QDirIterator::fileInfo() const
*/
QString QDirIterator::path() const
{
- return d->dirEntry.filePath();
+ return d->lister.iteratorPath();
}
QT_END_NAMESPACE
diff --git a/src/corelib/io/qdiriterator.h b/src/corelib/io/qdiriterator.h
index f3a4b979ac..7fa612ebe0 100644
--- a/src/corelib/io/qdiriterator.h
+++ b/src/corelib/io/qdiriterator.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QDIRITERATOR_H
#define QDIRITERATOR_H
diff --git a/src/corelib/io/qdirlisting.cpp b/src/corelib/io/qdirlisting.cpp
new file mode 100644
index 0000000000..008003e856
--- /dev/null
+++ b/src/corelib/io/qdirlisting.cpp
@@ -0,0 +1,673 @@
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2024 Ahmad Samir <a.samirh78@gmail.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+/*!
+ \since 6.8
+ \class QDirListing
+ \inmodule QtCore
+ \brief The QDirListing class provides an STL-style iterator for directory entries.
+
+ You can use QDirListing to navigate entries of a directory one at a time.
+ It is similar to QDir::entryList() and QDir::entryInfoList(), but because
+ it lists entries one at a time instead of all at once, it scales better
+ and is more suitable for large directories. It also supports listing
+ directory contents recursively, and following symbolic links. Unlike
+ QDir::entryList(), QDirListing does not support sorting.
+
+ The QDirListing constructor takes a QDir or a directory path as
+ argument. Here's how to iterate over all entries recursively:
+
+ \snippet code/src_corelib_io_qdirlisting.cpp 0
+
+ Here's how to find and read all files filtered by name, recursively:
+
+ \snippet code/src_corelib_io_qdirlisting.cpp 1
+
+ Iterators constructed by QDirListing (QDirListing::const_iterator) are
+ forward-only (you cannot iterate directories in reverse order) and don't
+ allow random access. They can be used in ranged-for loops (or with STL
+ alogrithms that don't require random access iterators). Dereferencing
+ a valid iterator returns a QDirListing::DirEntry object. The (c)end()
+ iterator marks the end of the iteration. Dereferencing the end iterator
+ is undefiend behavior.
+
+ QDirListing::DirEntry offers a subset of QFileInfo's API (for example,
+ fileName(), filePath(), exists()). Internally, DirEntry only constructs
+ a QFileInfo object if needed, that is, if the info hasn't been already
+ fetched by other system functions. You can use DirEntry::fileInfo()
+ to get a QFileInfo. For example:
+
+ \snippet code/src_corelib_io_qdirlisting.cpp 3
+ \snippet code/src_corelib_io_qdirlisting.cpp 4
+
+ \sa QDir, QDir::entryList()
+*/
+
+/*! \enum QDirListing::IteratorFlag
+
+ This enum class describes flags can be used to configure the behavior of
+ QDirListing. These flags can be bitwise OR'ed together.
+
+ \value NoFlag The default value, representing no flags. The iterator
+ will return entries for the assigned path.
+
+ \value FollowSymlinks When combined with Recursive, this flag enables
+ iterating through all subdirectories of the assigned path, following
+ all symbolic links. Symbolic link loops (e.g., link => . or link =>
+ ..) are automatically detected and ignored.
+
+ \value Recursive List entries inside all subdirectories as well.
+*/
+
+#include "qdirlisting.h"
+#include "qdirentryinfo_p.h"
+
+#include "qdir_p.h"
+#include "qabstractfileengine_p.h"
+
+#include <QtCore/qset.h>
+
+#if QT_CONFIG(regularexpression)
+#include <QtCore/qregularexpression.h>
+#endif
+
+#include <QtCore/private/qfilesystemiterator_p.h>
+#include <QtCore/private/qfilesystementry_p.h>
+#include <QtCore/private/qfilesystemmetadata_p.h>
+#include <QtCore/private/qfilesystemengine_p.h>
+#include <QtCore/private/qfileinfo_p.h>
+#include <QtCore/private/qduplicatetracker_p.h>
+
+#include <memory>
+#include <stack>
+#include <vector>
+
+QT_BEGIN_NAMESPACE
+
+using namespace Qt::StringLiterals;
+
+class QDirListingPrivate
+{
+public:
+ void init(bool resolveEngine);
+ void advance();
+
+ bool entryMatches(QDirEntryInfo &info);
+ void pushDirectory(QDirEntryInfo &info);
+ void pushInitialDirectory();
+
+ void checkAndPushDirectory(QDirEntryInfo &info);
+ bool matchesFilters(QDirEntryInfo &data) const;
+ bool hasIterators() const;
+
+ std::unique_ptr<QAbstractFileEngine> engine;
+ QDirEntryInfo initialEntryInfo;
+ QStringList nameFilters;
+ QDir::Filters filters;
+ QDirListing::IteratorFlags iteratorFlags;
+ QDirEntryInfo currentEntryInfo;
+
+#if QT_CONFIG(regularexpression)
+ QList<QRegularExpression> nameRegExps;
+#endif
+
+ using FEngineIteratorPtr = std::unique_ptr<QAbstractFileEngineIterator>;
+ std::stack<FEngineIteratorPtr, std::vector<FEngineIteratorPtr>> fileEngineIterators;
+#ifndef QT_NO_FILESYSTEMITERATOR
+ using FsIteratorPtr = std::unique_ptr<QFileSystemIterator>;
+ std::stack<FsIteratorPtr, std::vector<FsIteratorPtr>> nativeIterators;
+#endif
+
+ // Loop protection
+ QDuplicateTracker<QString> visitedLinks;
+};
+
+void QDirListingPrivate::init(bool resolveEngine = true)
+{
+ if (nameFilters.contains("*"_L1))
+ nameFilters.clear();
+
+ if (filters == QDir::NoFilter)
+ filters = QDir::AllEntries;
+
+#if QT_CONFIG(regularexpression)
+ nameRegExps.reserve(nameFilters.size());
+ const auto cs = filters.testAnyFlags(QDir::CaseSensitive) ? Qt::CaseSensitive
+ : Qt::CaseInsensitive;
+ for (const auto &filter : nameFilters)
+ nameRegExps.emplace_back(QRegularExpression::fromWildcard(filter, cs));
+#endif
+
+ if (resolveEngine) {
+ engine = QFileSystemEngine::createLegacyEngine(initialEntryInfo.entry,
+ initialEntryInfo.metaData);
+ }
+
+ pushDirectory(initialEntryInfo);
+}
+
+void QDirListingPrivate::pushDirectory(QDirEntryInfo &entryInfo)
+{
+ const QString path = [&entryInfo] {
+#ifdef Q_OS_WIN
+ if (entryInfo.isSymLink())
+ return entryInfo.canonicalFilePath();
+#endif
+ return entryInfo.filePath();
+ }();
+
+
+ if (iteratorFlags.testAnyFlags(QDirListing::IteratorFlag::FollowSymlinks)) {
+ // Stop link loops
+ if (visitedLinks.hasSeen(entryInfo.canonicalFilePath()))
+ return;
+ }
+
+ if (engine) {
+ engine->setFileName(path);
+ if (auto it = engine->beginEntryList(path, filters, nameFilters)) {
+ fileEngineIterators.emplace(std::move(it));
+ } else {
+ // No iterator; no entry list.
+ }
+ } else {
+#ifndef QT_NO_FILESYSTEMITERATOR
+ QFileSystemEntry *fentry = nullptr;
+ if (entryInfo.fileInfoOpt)
+ fentry = &entryInfo.fileInfoOpt->d_ptr->fileEntry;
+ else
+ fentry = &entryInfo.entry;
+ nativeIterators.emplace(std::make_unique<QFileSystemIterator>(*fentry, filters));
+#else
+ qWarning("Qt was built with -no-feature-filesystemiterator: no files/plugins will be found!");
+#endif
+ }
+}
+
+bool QDirListingPrivate::entryMatches(QDirEntryInfo &entryInfo)
+{
+ checkAndPushDirectory(entryInfo);
+ return matchesFilters(entryInfo);
+}
+
+/*!
+ \internal
+
+ Advances the internal iterator, either a QAbstractFileEngineIterator (e.g.
+ QResourceFileEngineIterator) or a QFileSystemIterator (which uses low-level
+ system methods, e.g. readdir() on Unix).
+
+ An iterator stack is used for holding the iterators.
+
+ A typical example of doing recursive iteration:
+ - while iterating directory A we find a sub-dir B
+ - an iterator for B is added to the iterator stack
+ - B's iterator is processed (the top() of the stack) first; then loop
+ goes back to processing A's iterator
+*/
+void QDirListingPrivate::advance()
+{
+ // Use get() in both code paths below because the iterator returned by top()
+ // may be invalidated due to reallocation when appending new iterators in
+ // pushDirectory().
+
+ if (engine) {
+ while (!fileEngineIterators.empty()) {
+ // Find the next valid iterator that matches the filters.
+ QAbstractFileEngineIterator *it;
+ while (it = fileEngineIterators.top().get(), it->advance()) {
+ QDirEntryInfo entryInfo;
+ entryInfo.fileInfoOpt = it->currentFileInfo();
+ if (entryMatches(entryInfo)) {
+ currentEntryInfo = std::move(entryInfo);
+ return;
+ }
+ }
+
+ fileEngineIterators.pop();
+ }
+ } else {
+#ifndef QT_NO_FILESYSTEMITERATOR
+ QDirEntryInfo entryInfo;
+ while (!nativeIterators.empty()) {
+ // Find the next valid iterator that matches the filters.
+ QFileSystemIterator *it;
+ while (it = nativeIterators.top().get(), it->advance(entryInfo.entry, entryInfo.metaData)) {
+ if (entryMatches(entryInfo)) {
+ currentEntryInfo = std::move(entryInfo);
+ return;
+ }
+ entryInfo = {};
+ }
+
+ nativeIterators.pop();
+ }
+#endif
+ }
+}
+
+void QDirListingPrivate::checkAndPushDirectory(QDirEntryInfo &entryInfo)
+{
+ using F = QDirListing::IteratorFlag;
+ // If we're doing flat iteration, we're done.
+ if (!iteratorFlags.testAnyFlags(F::Recursive))
+ return;
+
+ // Never follow non-directory entries
+ if (!entryInfo.isDir())
+ return;
+
+ // Follow symlinks only when asked
+ if (!iteratorFlags.testAnyFlags(F::FollowSymlinks) && entryInfo.isSymLink())
+ return;
+
+ // Never follow . and ..
+ const QString &fileName = entryInfo.fileName();
+ if ("."_L1 == fileName || ".."_L1 == fileName)
+ return;
+
+ // No hidden directories unless requested
+ if (!filters.testAnyFlags(QDir::AllDirs | QDir::Hidden) && entryInfo.isHidden())
+ return;
+
+ pushDirectory(entryInfo);
+}
+
+/*!
+ \internal
+
+ This functions returns \c true if the current entry matches the filters
+ (i.e., the current entry will be returned as part of the directory
+ iteration); otherwise, \c false is returned.
+*/
+bool QDirListingPrivate::matchesFilters(QDirEntryInfo &entryInfo) const
+{
+ const QString &fileName = entryInfo.fileName();
+ if (fileName.isEmpty())
+ return false;
+
+ // filter . and ..?
+ const qsizetype fileNameSize = fileName.size();
+ const bool dotOrDotDot = fileName[0] == u'.'
+ && ((fileNameSize == 1)
+ ||(fileNameSize == 2 && fileName[1] == u'.'));
+ if ((filters & QDir::NoDot) && dotOrDotDot && fileNameSize == 1)
+ return false;
+ if ((filters & QDir::NoDotDot) && dotOrDotDot && fileNameSize == 2)
+ return false;
+
+ // name filter
+#if QT_CONFIG(regularexpression)
+ // Pass all entries through name filters, except dirs if AllDirs is set
+ if (!nameRegExps.isEmpty() && !(filters.testAnyFlags(QDir::AllDirs) && entryInfo.isDir())) {
+ auto regexMatchesName = [&fileName](const auto &re) {
+ return re.match(fileName).hasMatch();
+ };
+ if (std::none_of(nameRegExps.cbegin(), nameRegExps.cend(), regexMatchesName))
+ return false;
+ }
+#endif
+ // skip symlinks
+ const bool skipSymlinks = filters.testAnyFlag(QDir::NoSymLinks);
+ const bool includeSystem = filters.testAnyFlag(QDir::System);
+ if (skipSymlinks && entryInfo.isSymLink()) {
+ // The only reason to save this file is if it is a broken link and we are requesting system files.
+ if (!includeSystem || entryInfo.exists())
+ return false;
+ }
+
+ // filter hidden
+ const bool includeHidden = filters.testAnyFlag(QDir::Hidden);
+ if (!includeHidden && !dotOrDotDot && entryInfo.isHidden())
+ return false;
+
+ // filter system files
+ if (!includeSystem) {
+ if (!entryInfo.isFile() && !entryInfo.isDir() && !entryInfo.isSymLink())
+ return false;
+ if (entryInfo.isSymLink() && !entryInfo.exists())
+ return false;
+ }
+
+ // skip directories
+ const bool skipDirs = !(filters & (QDir::Dirs | QDir::AllDirs));
+ if (skipDirs && entryInfo.isDir())
+ return false;
+
+ // skip files
+ const bool skipFiles = !(filters & QDir::Files);
+ if (skipFiles && entryInfo.isFile())
+ // Basically we need a reason not to exclude this file otherwise we just eliminate it.
+ return false;
+
+ // filter permissions
+ const auto perms = filters & QDir::PermissionMask;
+ const bool filterPermissions = perms != 0 && perms != QDir::PermissionMask;
+ if (filterPermissions) {
+ const bool doWritable = filters.testAnyFlags(QDir::Writable);
+ const bool doExecutable = filters.testAnyFlags(QDir::Executable);
+ const bool doReadable = filters.testAnyFlags(QDir::Readable);
+ if ((doReadable && !entryInfo.isReadable())
+ || (doWritable && !entryInfo.isWritable())
+ || (doExecutable && !entryInfo.isExecutable())) {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+bool QDirListingPrivate::hasIterators() const
+{
+ if (engine)
+ return !fileEngineIterators.empty();
+
+#if !defined(QT_NO_FILESYSTEMITERATOR)
+ return !nativeIterators.empty();
+#endif
+
+ return false;
+}
+
+/*!
+ Constructs a QDirListing that can iterate over \a dir's entries, using
+ \a dir's name filters and the QDir::Filters set in \a dir. You can pass
+ options via \a flags to decide how the directory should be iterated.
+
+ By default, \a flags is NoIteratorFlags, which provides the same behavior
+ as in QDir::entryList().
+
+ The sorting in \a dir is ignored.
+
+ \note To list symlinks that point to non existing files, QDir::System
+ must be set in \a dir's QDir::Filters.
+
+ \sa hasNext(), next(), IteratorFlags
+*/
+QDirListing::QDirListing(const QDir &dir, IteratorFlags flags)
+ : d(new QDirListingPrivate)
+{
+ const QDirPrivate *other = dir.d_ptr.constData();
+ d->initialEntryInfo.entry = other->dirEntry;
+ d->nameFilters = other->nameFilters;
+ d->filters = other->filters;
+ d->iteratorFlags = flags;
+ const bool resolveEngine = other->fileEngine ? true : false;
+ d->init(resolveEngine);
+}
+
+/*!
+ Constructs a QDirListing that can iterate over \a path. Entries are
+ filtered according to \a filters. You can pass options via \a flags to
+ decide how the directory should be iterated.
+
+ By default, \a filters is QDir::NoFilter, and \a flags is NoIteratorFlags,
+ which provides the same behavior as in QDir::entryList().
+
+ \note To list symlinks that point to non existing files, QDir::System
+ must be set in \a filters.
+
+ \sa hasNext(), next(), IteratorFlags
+*/
+QDirListing::QDirListing(const QString &path, QDir::Filters filters, IteratorFlags flags)
+ : d(new QDirListingPrivate)
+{
+ d->initialEntryInfo.entry = QFileSystemEntry(path);
+ d->filters = filters;
+ d->iteratorFlags = flags;
+ d->init();
+}
+
+/*!
+ Constructs a QDirListing that can iterate over \a path. You can pass
+ options via \a flags to decide how the directory should be iterated.
+
+ By default, \a flags is NoIteratorFlags, which provides the same behavior
+ as in QDir::entryList().
+
+ \sa hasNext(), next(), IteratorFlags
+*/
+QDirListing::QDirListing(const QString &path, IteratorFlags flags)
+ : d(new QDirListingPrivate)
+{
+ d->initialEntryInfo.entry = QFileSystemEntry(path);
+ d->filters = QDir::NoFilter;
+ d->iteratorFlags = flags;
+ d->init();
+}
+
+/*!
+ Constructs a QDirListing that can iterate over \a path, using \a
+ nameFilters and \a filters. You can pass options via \a flags to decide
+ how the directory should be iterated.
+
+ By default, \a flags is NoIteratorFlags, which provides the same behavior
+ as QDir::entryList().
+
+ For example, the following iterator could be used to iterate over audio
+ files:
+
+ \snippet code/src_corelib_io_qdirlisting.cpp 2
+
+ \note To list symlinks that point to non existing files, QDir::System
+ must be set in \a flags.
+
+ \sa hasNext(), next(), IteratorFlags, QDir::setNameFilters()
+*/
+QDirListing::QDirListing(const QString &path, const QStringList &nameFilters, QDir::Filters filters,
+ IteratorFlags flags)
+ : d(new QDirListingPrivate)
+{
+ d->initialEntryInfo.entry = QFileSystemEntry(path);
+ d->nameFilters = nameFilters;
+ d->filters = filters;
+ d->iteratorFlags = flags;
+ d->init();
+}
+
+/*!
+ Destroys the QDirListing.
+*/
+QDirListing::~QDirListing() = default;
+
+/*!
+ Returns the directory path used to construct this QDirListing.
+*/
+QString QDirListing::iteratorPath() const
+{
+ return d->initialEntryInfo.filePath();
+}
+
+/*!
+ \fn QDirListing::const_iterator QDirListing::begin() const
+ \fn QDirListing::const_iterator QDirListing::cbegin() const
+ \fn QDirListing::const_iterator QDirListing::end() const
+ \fn QDirListing::const_iterator QDirListing::cend() const
+
+ begin()/cbegin() returns a QDirListing::const_iterator that enables
+ iterating over directory entries using a ranged-for loop; dereferencing
+ this iterator returns a \c{const QFileInfo &}.
+
+ end()/cend() return a sentinel const_iterator that signals the end of
+ the iteration. Dereferencing this iterator is undefined behavior.
+
+ For example:
+ \snippet code/src_corelib_io_qdirlisting.cpp 0
+
+ Here's how to find and read all files filtered by name, recursively:
+ \snippet code/src_corelib_io_qdirlisting.cpp 1
+
+ \note As this is a unidirectional (forward-only) iterator, calling
+ begin()/cbegin() more than once on the same QDirListing object could
+ result in unexpected behavior (for example, some entries being skipped).
+
+ \sa fileInfo(), fileName(), filePath()
+*/
+QDirListing::const_iterator QDirListing::begin() const
+{
+ const_iterator it{d.get()};
+ return ++it;
+}
+
+/*!
+ \fn const QDirListing::DirEntry &QDirListing::const_iterator::operator*() const
+
+ Returns a \c{const QDirListing::DirEntry &} of the directory entry this
+ iterator points to.
+*/
+
+/*!
+ \fn const QDirListing::DirEntry *QDirListing::const_iterator::operator->() const
+
+ Returns a \c{const QDirListing::DirEntry *} to the directory entry this
+ iterator points to.
+*/
+
+/*!
+ Advances the iterator and returns a reference to it.
+*/
+QDirListing::const_iterator &QDirListing::const_iterator::operator++()
+{
+ dirListPtr->advance();
+ if (!dirListPtr->hasIterators())
+ *this = {}; // All done, make `this` the end() iterator
+ return *this;
+}
+
+/*!
+ \fn QFileInfo QDirListing::DirEntry::fileInfo() const
+ \fn QString QDirListing::DirEntry::fileName() const
+ \fn QString QDirListing::DirEntry::baseName() const
+ \fn QString QDirListing::DirEntry::completeBaseName() const
+ \fn QString QDirListing::DirEntry::suffix() const
+ \fn QString QDirListing::DirEntry::bundleName() const
+ \fn QString QDirListing::DirEntry::completeSuffix() const
+ \fn QString QDirListing::DirEntry::filePath() const
+ \fn QString QDirListing::DirEntry::canonicalFilePath() const
+ \fn QString QDirListing::DirEntry::absoluteFilePath() const
+ \fn QString QDirListing::DirEntry::absolutePath() const
+ \fn bool QDirListing::DirEntry::isDir() const
+ \fn bool QDirListing::DirEntry::isFile() const
+ \fn bool QDirListing::DirEntry::isSymLink() const
+ \fn bool QDirListing::DirEntry::exists() const
+ \fn bool QDirListing::DirEntry::isHidden() const
+ \fn bool QDirListing::DirEntry::isReadable() const
+ \fn bool QDirListing::DirEntry::isWritable() const
+ \fn bool QDirListing::DirEntry::isExecutable() const
+ \fn qint64 QDirListing::DirEntry::size() const
+ \fn QDateTime QDirListing::DirEntry::fileTime(QFile::FileTime type, const QTimeZone &tz) const
+ \fn QDateTime QDirListing::DirEntry::birthTime(const QTimeZone &tz) const;
+ \fn QDateTime QDirListing::DirEntry::metadataChangeTime(const QTimeZone &tz) const;
+ \fn QDateTime QDirListing::DirEntry::lastModified(const QTimeZone &tz) const;
+ \fn QDateTime QDirListing::DirEntry::lastRead(const QTimeZone &tz) const;
+
+ See the QFileInfo methods with the same names.
+*/
+
+QFileInfo QDirListing::DirEntry::fileInfo() const
+{
+ return dirListPtr->currentEntryInfo.fileInfo();
+}
+
+QString QDirListing::DirEntry::fileName() const
+{
+ return dirListPtr->currentEntryInfo.fileName();
+}
+
+QString QDirListing::DirEntry::baseName() const
+{
+ return dirListPtr->currentEntryInfo.baseName();
+}
+
+QString QDirListing::DirEntry::completeBaseName() const
+{
+ return dirListPtr->currentEntryInfo.completeBaseName();
+}
+
+QString QDirListing::DirEntry::suffix() const
+{
+ return dirListPtr->currentEntryInfo.suffix();
+}
+
+QString QDirListing::DirEntry::bundleName() const
+{
+ return dirListPtr->currentEntryInfo.bundleName();
+}
+
+QString QDirListing::DirEntry::completeSuffix() const
+{
+ return dirListPtr->currentEntryInfo.completeSuffix();
+}
+
+QString QDirListing::DirEntry::filePath() const
+{
+ return dirListPtr->currentEntryInfo.filePath();
+}
+
+QString QDirListing::DirEntry::canonicalFilePath() const
+{
+ return dirListPtr->currentEntryInfo.canonicalFilePath();
+}
+
+QString QDirListing::DirEntry::absoluteFilePath() const
+{
+ return dirListPtr->currentEntryInfo.absoluteFilePath();
+}
+
+QString QDirListing::DirEntry::absolutePath() const
+{
+ return dirListPtr->currentEntryInfo.absolutePath();
+}
+
+bool QDirListing::DirEntry::isDir() const
+{
+ return dirListPtr->currentEntryInfo.isDir();
+}
+
+bool QDirListing::DirEntry::isFile() const
+{
+ return dirListPtr->currentEntryInfo.isFile();
+}
+
+bool QDirListing::DirEntry::isSymLink() const
+{
+ return dirListPtr->currentEntryInfo.isSymLink();
+}
+
+bool QDirListing::DirEntry::exists() const
+{
+ return dirListPtr->currentEntryInfo.exists();
+}
+
+bool QDirListing::DirEntry::isHidden() const
+{
+ return dirListPtr->currentEntryInfo.isHidden();
+}
+
+bool QDirListing::DirEntry::isReadable() const
+{
+ return dirListPtr->currentEntryInfo.isReadable();
+}
+
+bool QDirListing::DirEntry::isWritable() const
+{
+ return dirListPtr->currentEntryInfo.isWritable();
+}
+
+bool QDirListing::DirEntry::isExecutable() const
+{
+ return dirListPtr->currentEntryInfo.isExecutable();
+}
+
+qint64 QDirListing::DirEntry::size() const
+{
+ return dirListPtr->currentEntryInfo.size();
+}
+
+QDateTime QDirListing::DirEntry::fileTime(QFile::FileTime type, const QTimeZone &tz) const
+{
+ return dirListPtr->currentEntryInfo.fileTime(type, tz);
+}
+
+QT_END_NAMESPACE
diff --git a/src/corelib/io/qdirlisting.h b/src/corelib/io/qdirlisting.h
new file mode 100644
index 0000000000..d19fe3c666
--- /dev/null
+++ b/src/corelib/io/qdirlisting.h
@@ -0,0 +1,119 @@
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2024 Ahmad Samir <a.samirh78@gmail.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QDILISTING_H
+#define QDILISTING_H
+
+#include <QtCore/qdir.h>
+
+#include <iterator>
+#include <memory>
+
+QT_BEGIN_NAMESPACE
+
+class QDirListingPrivate;
+
+class Q_CORE_EXPORT QDirListing
+{
+public:
+ enum class IteratorFlag {
+ NoFlag = 0x0,
+ FollowSymlinks = 0x1,
+ Recursive = 0x2
+ };
+ Q_DECLARE_FLAGS(IteratorFlags, IteratorFlag)
+
+ QDirListing(const QDir &dir, IteratorFlags flags = IteratorFlag::NoFlag);
+ QDirListing(const QString &path, IteratorFlags flags = IteratorFlag::NoFlag);
+ QDirListing(const QString &path, QDir::Filters filter,
+ IteratorFlags flags = IteratorFlag::NoFlag);
+ QDirListing(const QString &path, const QStringList &nameFilters,
+ QDir::Filters filters = QDir::NoFilter,
+ IteratorFlags flags = IteratorFlag::NoFlag);
+
+ ~QDirListing();
+
+ QString iteratorPath() const;
+
+ class Q_CORE_EXPORT DirEntry
+ {
+ friend class QDirListing;
+ QDirListingPrivate *dirListPtr = nullptr;
+ public:
+ QString fileName() const;
+ QString baseName() const;
+ QString completeBaseName() const;
+ QString suffix() const;
+ QString bundleName() const;
+ QString completeSuffix() const;
+ QString filePath() const;
+ bool isDir() const;
+ bool isFile() const;
+ bool isSymLink() const;
+ bool exists() const;
+ bool isHidden() const;
+ bool isReadable() const;
+ bool isWritable() const;
+ bool isExecutable() const;
+ QFileInfo fileInfo() const;
+ QString canonicalFilePath() const;
+ QString absoluteFilePath() const;
+ QString absolutePath() const;
+ qint64 size() const;
+
+ QDateTime birthTime(const QTimeZone &tz) const { return fileTime(QFile::FileBirthTime, tz); }
+ QDateTime metadataChangeTime(const QTimeZone &tz) const { return fileTime(QFile::FileMetadataChangeTime, tz); }
+ QDateTime lastModified(const QTimeZone &tz) const { return fileTime(QFile::FileModificationTime, tz); }
+ QDateTime lastRead(const QTimeZone &tz) const { return fileTime(QFile::FileAccessTime, tz); }
+ QDateTime fileTime(QFile::FileTime type, const QTimeZone &tz) const;
+ };
+
+ class const_iterator
+ {
+ friend class QDirListing;
+ const_iterator(QDirListingPrivate *dp) : dirListPtr(dp) { dirEntry.dirListPtr = dp; }
+ QDirListingPrivate *dirListPtr = nullptr;
+ DirEntry dirEntry;
+ public:
+ using iterator_category = std::input_iterator_tag;
+ using value_type = DirEntry;
+ using difference_type = qint64;
+ using pointer = const value_type *;
+ using reference = const value_type &;
+
+ const_iterator() = default;
+ reference operator*() const { return dirEntry; }
+ pointer operator->() const { return &dirEntry; }
+ Q_CORE_EXPORT const_iterator &operator++();
+ const_iterator operator++(int) { auto tmp = *this; operator++(); return tmp; };
+ friend bool operator==(const const_iterator &lhs, const const_iterator &rhs)
+ {
+ // This is only used for the sentinel end iterator
+ return lhs.dirListPtr == nullptr && rhs.dirListPtr == nullptr;
+ }
+ friend bool operator!=(const const_iterator &lhs, const const_iterator &rhs)
+ { return !(lhs == rhs); }
+ };
+
+ const_iterator begin() const;
+ const_iterator cbegin() const { return begin(); }
+ const_iterator end() const { return {}; }
+ const_iterator cend() const { return end(); }
+
+ // Qt compatibility
+ const_iterator constBegin() const { return begin(); }
+ const_iterator constEnd() const { return end(); }
+
+private:
+ Q_DISABLE_COPY(QDirListing)
+
+ std::unique_ptr<QDirListingPrivate> d;
+ friend class QDir;
+};
+
+Q_DECLARE_OPERATORS_FOR_FLAGS(QDirListing::IteratorFlags)
+
+QT_END_NAMESPACE
+
+#endif // QDILISTING_H
diff --git a/src/corelib/io/qfile.cpp b/src/corelib/io/qfile.cpp
index 2329613f45..52188dde51 100644
--- a/src/corelib/io/qfile.cpp
+++ b/src/corelib/io/qfile.cpp
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Copyright (C) 2017 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// Copyright (C) 2017 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qplatformdefs.h"
#include "qdebug.h"
@@ -61,6 +25,8 @@
QT_BEGIN_NAMESPACE
+using namespace Qt::StringLiterals;
+
Q_DECL_COLD_FUNCTION
static bool file_already_open(QFile &file, const char *where = nullptr)
{
@@ -110,7 +76,7 @@ QFilePrivate::openExternalFile(QIODevice::OpenMode flags, FILE *fh, QFile::FileH
QAbstractFileEngine *QFilePrivate::engine() const
{
if (!fileEngine)
- fileEngine.reset(QAbstractFileEngine::create(fileName));
+ fileEngine = QAbstractFileEngine::create(fileName);
return fileEngine.get();
}
@@ -184,13 +150,20 @@ QAbstractFileEngine *QFilePrivate::engine() const
data and operator>>() to read it back. See the class
documentation for details.
- When you use QFile, QFileInfo, and QDir to access the file system
- with Qt, you can use Unicode file names. On Unix, these file
- names are converted to an 8-bit encoding. If you want to use
- standard C++ APIs (\c <cstdio> or \c <iostream>) or
- platform-specific APIs to access files instead of QFile, you can
- use the encodeName() and decodeName() functions to convert
- between Unicode file names and 8-bit file names.
+ \section1 Signals
+
+ Unlike other QIODevice implementations, such as QTcpSocket, QFile does not
+ emit the aboutToClose(), bytesWritten(), or readyRead() signals. This
+ implementation detail means that QFile is not suitable for reading and
+ writing certain types of files, such as device files on Unix platforms.
+
+ \section1 Platform Specific Issues
+
+ \l{Input/Output and Networking}{Qt APIs related to I/O} use UTF-16 based
+ QStrings to represent file paths. Standard C++ APIs (\c <cstdio> or
+ \c <iostream>) or platform-specific APIs however often need a 8-bit encoded
+ path. You can use encodeName() and decodeName() to convert between both
+ representations.
On Unix, there are some special system files (e.g. in \c /proc) for which
size() will always return 0, yet you may still be able to read more data
@@ -203,15 +176,6 @@ QAbstractFileEngine *QFilePrivate::engine() const
\snippet file/file.cpp 3
- \section1 Signals
-
- Unlike other QIODevice implementations, such as QTcpSocket, QFile does not
- emit the aboutToClose(), bytesWritten(), or readyRead() signals. This
- implementation detail means that QFile is not suitable for reading and
- writing certain types of files, such as device files on Unix platforms.
-
- \section1 Platform Specific Issues
-
File permissions are handled differently on Unix-like systems and
Windows. In a non \l{QIODevice::isWritable()}{writable}
directory on Unix-like systems, files cannot be created. This is not always
@@ -226,6 +190,8 @@ QAbstractFileEngine *QFilePrivate::engine() const
function mostly useless for NTFS volumes. It may still be of use for USB
sticks that use VFAT file systems. POSIX ACLs are not manipulated, either.
+ \include android-content-uri-limitations.qdocinc
+
\sa QTextStream, QDataStream, QFileInfo, QDir, {The Qt Resource System}
*/
@@ -260,6 +226,15 @@ QFile::QFile(QObject *parent)
}
/*!
Constructs a new file object to represent the file with the given \a name.
+
+//! [qfile-explicit-constructor-note]
+ \note In versions up to and including Qt 6.8, this constructor is
+ implicit, for backward compatibility. Starting from Qt 6.9 this
+ constructor is unconditionally \c{explicit}. Users can force this
+ constructor to be \c{explicit} even in earlier versions of Qt by
+ defining the \c{QT_EXPLICIT_QFILE_CONSTRUCTION_FROM_PATH} macro
+ before including any Qt header.
+//! [qfile-explicit-constructor-note]
*/
QFile::QFile(const QString &name)
: QFileDevice(*new QFilePrivate, nullptr)
@@ -347,10 +322,10 @@ QFile::setFileName(const QString &name)
/*!
\fn QByteArray QFile::encodeName(const QString &fileName)
- Converts \a fileName to the local 8-bit
- encoding determined by the user's locale. This is sufficient for
- file names that the user chooses. File names hard-coded into the
- application should only use 7-bit ASCII filename characters.
+ Converts \a fileName to an 8-bit encoding that you can use in native
+ APIs. On Windows, the encoding is the one from active Windows (ANSI)
+ codepage. On other platforms, this is UTF-8, for \macos in decomposed
+ form (NFD).
\sa decodeName()
*/
@@ -484,6 +459,24 @@ QFile::remove(const QString &fileName)
and sets the fileName() to the path at which the file can be found within the trash;
otherwise returns \c false.
+//! [move-to-trash-common]
+ The time for this function to run is independent of the size of the file
+ being trashed. If this function is called on a directory, it may be
+ proportional to the number of files being trashed.
+
+ This function uses the Windows and \macos APIs to perform the trashing on
+ those two operating systems. Elsewhere (Unix systems), this function
+ implements the \l{FreeDesktop.org Trash specification version 1.0}.
+
+ \note When using the FreeDesktop.org Trash implementation, this function
+ will fail if it is unable to move the files to the trash location by way of
+ file renames and hardlinks. This condition arises if the file being trashed
+ resides on a volume (mount point) on which the current user does not have
+ permission to create the \c{.Trash} directory, or with some unusual
+ filesystem types or configurations (such as sub-volumes that aren't
+ themselves mount points).
+//! [move-to-trash-common]
+
\note On systems where the system API doesn't report the location of the file in the
trash, fileName() will be set to the null string once the file has been moved. On
systems that don't have a trash can, this function always returns false.
@@ -521,9 +514,12 @@ QFile::moveToTrash()
and sets \a pathInTrash (if provided) to the path at which the file can be found within
the trash; otherwise returns \c false.
+ \include qfile.cpp move-to-trash-common
+
\note On systems where the system API doesn't report the path of the file in the
trash, \a pathInTrash will be set to the null string once the file has been moved.
On systems that don't have a trash can, this function always returns false.
+
*/
bool
QFile::moveToTrash(const QString &fileName, QString *pathInTrash)
@@ -588,7 +584,7 @@ QFile::rename(const QString &newName)
return false;
}
-#ifdef Q_OS_LINUX
+#if defined(Q_OS_LINUX) && QT_CONFIG(temporaryfile)
// rename() on Linux simply does nothing when renaming "foo" to "Foo" on a case-insensitive
// FS, such as FAT32. Move the file away and rename in 2 steps to work around.
QTemporaryFileName tfn(d->fileName);
@@ -616,7 +612,7 @@ QFile::rename(const QString &newName)
// report both errors
d->setError(QFile::RenameError,
tr("Error while renaming: %1").arg(error.toString())
- + QLatin1Char('\n')
+ + u'\n'
+ tr("Unable to restore from %1: %2").
arg(QDir::toNativeSeparators(tmp.filePath()), error2.toString()));
return false;
@@ -759,6 +755,9 @@ QFile::link(const QString &fileName, const QString &linkName)
\include qfile-copy.qdocinc
+ \note On Android, this operation is not yet supported for \c content
+ scheme URIs.
+
\sa setFileName()
*/
@@ -789,8 +788,8 @@ QFile::copy(const QString &newName)
error = true;
d->setError(QFile::CopyError, tr("Cannot open %1 for input").arg(d->fileName));
} else {
- const auto fileTemplate = QLatin1String("%1/qt_temp.XXXXXX");
-#ifdef QT_NO_TEMPORARYFILE
+ const auto fileTemplate = "%1/qt_temp.XXXXXX"_L1;
+#if !QT_CONFIG(temporaryfile)
QFile out(fileTemplate.arg(QFileInfo(newName).path()));
if (!out.open(QIODevice::ReadWrite))
error = true;
@@ -803,9 +802,9 @@ QFile::copy(const QString &newName)
}
#endif
if (error) {
+ d->setError(QFile::CopyError, tr("Cannot open for output: %1").arg(out.errorString()));
out.close();
close();
- d->setError(QFile::CopyError, tr("Cannot open for output: %1").arg(out.errorString()));
} else {
if (!d->engine()->cloneTo(out.d_func()->engine())) {
char block[4096];
@@ -817,7 +816,8 @@ QFile::copy(const QString &newName)
totalRead += in;
if (in != out.write(block, in)) {
close();
- d->setError(QFile::CopyError, tr("Failure to write block"));
+ d->setError(QFile::CopyError, tr("Failure to write block: %1")
+ .arg(out.errorString()));
error = true;
break;
}
@@ -837,10 +837,11 @@ QFile::copy(const QString &newName)
if (!out.rename(newName)) {
error = true;
close();
- d->setError(QFile::CopyError, tr("Cannot create %1 for output").arg(newName));
+ d->setError(QFile::CopyError, tr("Cannot create %1 for output: %2")
+ .arg(newName, out.errorString()));
}
}
-#ifdef QT_NO_TEMPORARYFILE
+#if !QT_CONFIG(temporaryfile)
if (error)
out.remove();
#else
@@ -867,6 +868,9 @@ QFile::copy(const QString &newName)
\include qfile-copy.qdocinc
+ \note On Android, this operation is not yet supported for \c content
+ scheme URIs.
+
\sa rename()
*/
@@ -889,6 +893,11 @@ QFile::copy(const QString &fileName, const QString &newName)
will try to create a new file before opening it. The file will be
created with mode 0666 masked by the umask on POSIX systems, and
with permissions inherited from the parent directory on Windows.
+ On Android, it's expected to have access permission to the parent
+ of the file name, otherwise, it won't be possible to create this
+ non-existing file.
+
+ \sa QT_USE_NODISCARD_FILE_OPEN
\sa QIODevice::OpenMode, setFileName()
*/
@@ -934,7 +943,7 @@ bool QFile::open(OpenMode mode)
such permissions will generate warnings when the Security tab of the Properties dialog
is opened. Granting the group all permissions granted to others avoids such warnings.
- \sa QIODevice::OpenMode, setFileName()
+ \sa QIODevice::OpenMode, setFileName(), QT_USE_NODISCARD_FILE_OPEN
\since 6.3
*/
bool QFile::open(OpenMode mode, QFile::Permissions permissions)
@@ -991,7 +1000,7 @@ bool QFile::open(OpenMode mode, QFile::Permissions permissions)
you cannot use this QFile with a QFileInfo.
\endlist
- \sa close()
+ \sa close(), QT_USE_NODISCARD_FILE_OPEN
\b{Note for the Windows Platform}
@@ -1057,7 +1066,7 @@ bool QFile::open(FILE *fh, OpenMode mode, FileHandleFlags handleFlags)
\warning Since this function opens the file without specifying the file name,
you cannot use this QFile with a QFileInfo.
- \sa close()
+ \sa close(), QT_USE_NODISCARD_FILE_OPEN
*/
bool QFile::open(int fd, OpenMode mode, FileHandleFlags handleFlags)
{
@@ -1177,6 +1186,8 @@ qint64 QFile::size() const
\since 6.0
Constructs a new file object to represent the file with the given \a name.
+
+ \include qfile.cpp qfile-explicit-constructor-note
*/
/*!
\fn QFile::QFile(const std::filesystem::path &name, QObject *parent)
@@ -1262,6 +1273,107 @@ qint64 QFile::size() const
*/
+/*!
+ \class QNtfsPermissionCheckGuard
+ \since 6.6
+ \inmodule QtCore
+ \brief The QNtfsPermissionCheckGuard class is a RAII class to manage NTFS
+ permission checking.
+
+ \ingroup io
+
+ For performance reasons, QFile, QFileInfo, and related classes do not
+ perform full ownership and permission (ACL) checking on NTFS file systems
+ by default. During the lifetime of any instance of this class, that
+ default is overridden and advanced checking is performed. This provides
+ a safe and easy way to manage enabling and disabling this change to the
+ default behavior.
+
+ Example:
+
+ \snippet ntfsp.cpp raii
+
+ This class is available only on Windows.
+
+ \section1 qt_ntfs_permission_lookup
+
+ Prior to Qt 6.6, the user had to directly manipulate the global variable
+ \c qt_ntfs_permission_lookup. However, this was a non-atomic global
+ variable and as such it was prone to data races.
+
+ The variable \c qt_ntfs_permission_lookup is therefore deprecated since Qt
+ 6.6.
+*/
+
+/*!
+ \fn QNtfsPermissionCheckGuard::QNtfsPermissionCheckGuard()
+
+ Creates a guard and calls the function qEnableNtfsPermissionChecks().
+*/
+
+/*!
+ \fn QNtfsPermissionCheckGuard::~QNtfsPermissionCheckGuard()
+
+ Destroys the guard and calls the function qDisableNtfsPermissionChecks().
+*/
+
+
+/*!
+ \fn bool qEnableNtfsPermissionChecks()
+ \since 6.6
+ \threadsafe
+ \relates QNtfsPermissionCheckGuard
+
+ Enables permission checking on NTFS file systems. Returns \c true if the check
+ was already enabled before the call to this function, meaning that there
+ are other users.
+
+ This function is only available on Windows and makes the direct
+ manipulation of \l qt_ntfs_permission_lookup obsolete.
+
+ This is a low-level function, please consider the RAII class
+ \l QNtfsPermissionCheckGuard instead.
+
+ \note The thread-safety of this function holds only as long as there are no
+ concurrent updates to \l qt_ntfs_permission_lookup.
+*/
+
+/*!
+ \fn bool qDisableNtfsPermissionChecks()
+ \since 6.6
+ \threadsafe
+ \relates QNtfsPermissionCheckGuard
+
+ Disables permission checking on NTFS file systems. Returns \c true if the
+ check is disabled, meaning that there are no more users.
+
+ This function is only available on Windows and makes the direct
+ manipulation of \l qt_ntfs_permission_lookup obsolete.
+
+ This is a low-level function and must (only) be called to match one earlier
+ call to qEnableNtfsPermissionChecks(). Please consider the RAII class
+ \l QNtfsPermissionCheckGuard instead.
+
+ \note The thread-safety of this function holds only as long as there are no
+ concurrent updates to \l qt_ntfs_permission_lookup.
+*/
+
+/*!
+ \fn bool qAreNtfsPermissionChecksEnabled()
+ \since 6.6
+ \threadsafe
+ \relates QNtfsPermissionCheckGuard
+
+ Checks the status of the permission checks on NTFS file systems. Returns
+ \c true if the check is enabled.
+
+ This function is only available on Windows and makes the direct
+ manipulation of \l qt_ntfs_permission_lookup obsolete.
+
+ \note The thread-safety of this function holds only as long as there are no
+ concurrent updates to \l qt_ntfs_permission_lookup.
+*/
+
QT_END_NAMESPACE
#ifndef QT_NO_QOBJECT
diff --git a/src/corelib/io/qfile.h b/src/corelib/io/qfile.h
index 71246751fe..058b2fa236 100644
--- a/src/corelib/io/qfile.h
+++ b/src/corelib/io/qfile.h
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// Copyright (C) 2016 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QFILE_H
#define QFILE_H
@@ -47,7 +11,7 @@
#if QT_CONFIG(cxx17_filesystem)
#include <filesystem>
-#elif defined(Q_CLANG_QDOC)
+#elif defined(Q_QDOC)
namespace std {
namespace filesystem {
class path {
@@ -62,6 +26,34 @@ namespace std {
QT_BEGIN_NAMESPACE
+#if defined(Q_OS_WIN) || defined(Q_QDOC)
+
+#if QT_DEPRECATED_SINCE(6,6)
+QT_DEPRECATED_VERSION_X_6_6("Use QNtfsPermissionCheckGuard RAII class instead.")
+Q_CORE_EXPORT extern int qt_ntfs_permission_lookup; // defined in qfilesystemengine_win.cpp
+#endif
+
+Q_CORE_EXPORT bool qEnableNtfsPermissionChecks() noexcept;
+Q_CORE_EXPORT bool qDisableNtfsPermissionChecks() noexcept;
+Q_CORE_EXPORT bool qAreNtfsPermissionChecksEnabled() noexcept;
+
+class QNtfsPermissionCheckGuard
+{
+ Q_DISABLE_COPY_MOVE(QNtfsPermissionCheckGuard)
+public:
+ Q_NODISCARD_CTOR
+ QNtfsPermissionCheckGuard()
+ {
+ qEnableNtfsPermissionChecks();
+ }
+
+ ~QNtfsPermissionCheckGuard()
+ {
+ qDisableNtfsPermissionChecks();
+ }
+};
+#endif // Q_OS_WIN
+
#if QT_CONFIG(cxx17_filesystem)
namespace QtPrivate {
inline QString fromFilesystemPath(const std::filesystem::path &path)
@@ -90,6 +82,13 @@ using ForceFilesystemPath = typename std::enable_if_t<std::is_same_v<std::filesy
class QTemporaryFile;
class QFilePrivate;
+// ### Qt 7: remove this, and make constructors always explicit.
+#if (QT_VERSION >= QT_VERSION_CHECK(6, 9, 0)) || defined(QT_EXPLICIT_QFILE_CONSTRUCTION_FROM_PATH)
+# define QFILE_MAYBE_EXPLICIT explicit
+#else
+# define QFILE_MAYBE_EXPLICIT Q_IMPLICIT
+#endif
+
class Q_CORE_EXPORT QFile : public QFileDevice
{
#ifndef QT_NO_QOBJECT
@@ -99,12 +98,12 @@ class Q_CORE_EXPORT QFile : public QFileDevice
public:
QFile();
- QFile(const QString &name);
-#ifdef Q_CLANG_QDOC
- QFile(const std::filesystem::path &name);
+ QFILE_MAYBE_EXPLICIT QFile(const QString &name);
+#ifdef Q_QDOC
+ QFILE_MAYBE_EXPLICIT QFile(const std::filesystem::path &name);
#elif QT_CONFIG(cxx17_filesystem)
template<typename T, QtPrivate::ForceFilesystemPath<T> = 0>
- QFile(const T &name) : QFile(QtPrivate::fromFilesystemPath(name))
+ QFILE_MAYBE_EXPLICIT QFile(const T &name) : QFile(QtPrivate::fromFilesystemPath(name))
{
}
#endif // QT_CONFIG(cxx17_filesystem)
@@ -113,7 +112,7 @@ public:
explicit QFile(QObject *parent);
QFile(const QString &name, QObject *parent);
-#ifdef Q_CLANG_QDOC
+#ifdef Q_QDOC
QFile(const std::filesystem::path &path, QObject *parent);
#elif QT_CONFIG(cxx17_filesystem)
template<typename T, QtPrivate::ForceFilesystemPath<T> = 0>
@@ -125,12 +124,12 @@ public:
~QFile();
QString fileName() const override;
-#if QT_CONFIG(cxx17_filesystem) || defined(Q_CLANG_QDOC)
+#if QT_CONFIG(cxx17_filesystem) || defined(Q_QDOC)
std::filesystem::path filesystemFileName() const
{ return QtPrivate::toFilesystemPath(fileName()); }
#endif
void setFileName(const QString &name);
-#ifdef Q_CLANG_QDOC
+#ifdef Q_QDOC
void setFileName(const std::filesystem::path &name);
#elif QT_CONFIG(cxx17_filesystem)
template<typename T, QtPrivate::ForceFilesystemPath<T> = 0>
@@ -172,7 +171,7 @@ public:
bool exists() const;
static bool exists(const QString &fileName);
-#ifdef Q_CLANG_QDOC
+#ifdef Q_QDOC
static bool exists(const std::filesystem::path &fileName);
#elif QT_CONFIG(cxx17_filesystem)
template<typename T, QtPrivate::ForceFilesystemPath<T> = 0>
@@ -184,7 +183,7 @@ public:
QString symLinkTarget() const;
static QString symLinkTarget(const QString &fileName);
-#ifdef Q_CLANG_QDOC
+#ifdef Q_QDOC
std::filesystem::path filesystemSymLinkTarget() const;
static std::filesystem::path filesystemSymLinkTarget(const std::filesystem::path &fileName);
#elif QT_CONFIG(cxx17_filesystem)
@@ -201,7 +200,7 @@ public:
bool remove();
static bool remove(const QString &fileName);
-#ifdef Q_CLANG_QDOC
+#ifdef Q_QDOC
static bool remove(const std::filesystem::path &fileName);
#elif QT_CONFIG(cxx17_filesystem)
template<typename T, QtPrivate::ForceFilesystemPath<T> = 0>
@@ -213,7 +212,7 @@ public:
bool moveToTrash();
static bool moveToTrash(const QString &fileName, QString *pathInTrash = nullptr);
-#ifdef Q_CLANG_QDOC
+#ifdef Q_QDOC
static bool moveToTrash(const std::filesystem::path &fileName, QString *pathInTrash = nullptr);
#elif QT_CONFIG(cxx17_filesystem)
template<typename T, QtPrivate::ForceFilesystemPath<T> = 0>
@@ -225,7 +224,7 @@ public:
bool rename(const QString &newName);
static bool rename(const QString &oldName, const QString &newName);
-#ifdef Q_CLANG_QDOC
+#ifdef Q_QDOC
bool rename(const std::filesystem::path &newName);
static bool rename(const std::filesystem::path &oldName,
const std::filesystem::path &newName);
@@ -245,7 +244,7 @@ public:
bool link(const QString &newName);
static bool link(const QString &fileName, const QString &newName);
-#ifdef Q_CLANG_QDOC
+#ifdef Q_QDOC
bool link(const std::filesystem::path &newName);
static bool link(const std::filesystem::path &fileName,
const std::filesystem::path &newName);
@@ -265,7 +264,7 @@ public:
bool copy(const QString &newName);
static bool copy(const QString &fileName, const QString &newName);
-#ifdef Q_CLANG_QDOC
+#ifdef Q_QDOC
bool copy(const std::filesystem::path &newName);
static bool copy(const std::filesystem::path &fileName,
const std::filesystem::path &newName);
@@ -283,10 +282,10 @@ public:
}
#endif // QT_CONFIG(cxx17_filesystem)
- bool open(OpenMode flags) override;
- bool open(OpenMode flags, Permissions permissions);
- bool open(FILE *f, OpenMode ioFlags, FileHandleFlags handleFlags=DontCloseHandle);
- bool open(int fd, OpenMode ioFlags, FileHandleFlags handleFlags=DontCloseHandle);
+ QFILE_MAYBE_NODISCARD bool open(OpenMode flags) override;
+ QFILE_MAYBE_NODISCARD bool open(OpenMode flags, Permissions permissions);
+ QFILE_MAYBE_NODISCARD bool open(FILE *f, OpenMode ioFlags, FileHandleFlags handleFlags=DontCloseHandle);
+ QFILE_MAYBE_NODISCARD bool open(int fd, OpenMode ioFlags, FileHandleFlags handleFlags=DontCloseHandle);
qint64 size() const override;
@@ -297,7 +296,7 @@ public:
static Permissions permissions(const QString &filename);
bool setPermissions(Permissions permissionSpec) override;
static bool setPermissions(const QString &filename, Permissions permissionSpec);
-#ifdef Q_CLANG_QDOC
+#ifdef Q_QDOC
static Permissions permissions(const std::filesystem::path &filename);
static bool setPermissions(const std::filesystem::path &filename, Permissions permissionSpec);
#elif QT_CONFIG(cxx17_filesystem)
diff --git a/src/corelib/io/qfile_p.h b/src/corelib/io/qfile_p.h
index d866b8e8a2..e4e305309a 100644
--- a/src/corelib/io/qfile_p.h
+++ b/src/corelib/io/qfile_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QFILE_P_H
#define QFILE_P_H
diff --git a/src/corelib/io/qfiledevice.cpp b/src/corelib/io/qfiledevice.cpp
index ff8de7c0bb..431dc65f5b 100644
--- a/src/corelib/io/qfiledevice.cpp
+++ b/src/corelib/io/qfiledevice.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qplatformdefs.h"
#include "qfiledevice.h"
@@ -125,9 +89,9 @@ void QFileDevicePrivate::setError(QFileDevice::FileError err, int errNum)
\value ReadGroup The file is readable by the group.
\value WriteGroup The file is writable by the group.
\value ExeGroup The file is executable by the group.
- \value ReadOther The file is readable by anyone.
- \value WriteOther The file is writable by anyone.
- \value ExeOther The file is executable by anyone.
+ \value ReadOther The file is readable by others.
+ \value WriteOther The file is writable by others.
+ \value ExeOther The file is executable by others.
\warning Because of differences in the platforms supported by Qt,
the semantics of ReadUser, WriteUser and ExeUser are
@@ -145,6 +109,25 @@ void QFileDevicePrivate::setError(QFileDevice::FileError err, int errNum)
decrementing \c qt_ntfs_permission_lookup by 1.
\snippet ntfsp.cpp 1
+
+ \note Since this is a non-atomic global variable, it is only safe
+ to increment or decrement \c qt_ntfs_permission_lookup before any
+ threads other than the main thread have started or after every thread
+ other than the main thread has ended.
+
+ \note From Qt 6.6 the variable \c qt_ntfs_permission_lookup is
+ deprecated. Please use the following alternatives.
+
+ The safe and easy way to manage permission checks is to use the RAII class
+ \c QNtfsPermissionCheckGuard.
+
+ \snippet ntfsp.cpp raii
+
+ If you need more fine-grained control, it is possible to manage the permission
+ with the following functions instead:
+
+ \snippet ntfsp.cpp free-funcs
+
*/
//************* QFileDevice
@@ -163,10 +146,10 @@ void QFileDevicePrivate::setError(QFileDevice::FileError err, int errNum)
QFileDevice is the base class for I/O devices that can read and write text and binary files
and \l{The Qt Resource System}{resources}. QFile offers the main functionality,
QFileDevice serves as a base class for sharing functionality with other file devices such
- as QTemporaryFile, by providing all the operations that can be done on files that have
- been opened by QFile or QTemporaryFile.
+ as QSaveFile, by providing all the operations that can be done on files that have
+ been opened by QFile or QSaveFile.
- \sa QFile, QTemporaryFile
+ \sa QFile, QSaveFile
*/
/*!
@@ -185,6 +168,35 @@ void QFileDevicePrivate::setError(QFileDevice::FileError err, int errNum)
handle is left open when the QFile object is destroyed.
*/
+/*!
+ \macro QT_USE_NODISCARD_FILE_OPEN
+ \macro QT_NO_USE_NODISCARD_FILE_OPEN
+ \relates QFileDevice
+ \since 6.8
+
+ File-related I/O classes (such as QFile, QSaveFile, QTemporaryFile)
+ have an \c{open()} method to open the file they act upon. It is
+ important to check the return value of the call to \c{open()}
+ before proceeding with reading or writing data into the file.
+
+ For this reason, starting with Qt 6.8, some overloads of \c{open()}
+ have been marked with the \c{[[nodiscard]]} attribute. Since this
+ change may raise warnings in existing codebases, user code can
+ opt-in or opt-out from having the attribute applied by defining
+ certain macros:
+
+ \list
+ \li If the \c{QT_USE_NODISCARD_FILE_OPEN} macro is defined,
+ overloads of \c{open()} are marked as \c{[[nodiscard]]}.
+ \li If the \c{QT_NO_USE_NODISCARD_FILE_OPEN} is defined, the
+ overloads of \c{open()} are \e{not} marked as \c{[[nodiscard]]}.
+ \li If neither macro is defined, then the default up to and
+ including Qt 6.9 is not to have the attribute. Starting from Qt 6.10,
+ the attribute is automatically applied.
+ \li If both macros are defined, the program is ill-formed.
+ \endlist
+*/
+
#ifdef QT_NO_QOBJECT
QFileDevice::QFileDevice()
: QIODevice(*new QFileDevicePrivate)
@@ -751,15 +763,6 @@ bool QFileDevice::unmap(uchar *address)
\sa setFileTime(), fileTime(), QFileInfo::fileTime()
*/
-static inline QAbstractFileEngine::FileTime FileDeviceTimeToAbstractFileEngineTime(QFileDevice::FileTime time)
-{
- static_assert(int(QFileDevice::FileAccessTime) == int(QAbstractFileEngine::AccessTime));
- static_assert(int(QFileDevice::FileBirthTime) == int(QAbstractFileEngine::BirthTime));
- static_assert(int(QFileDevice::FileMetadataChangeTime) == int(QAbstractFileEngine::MetadataChangeTime));
- static_assert(int(QFileDevice::FileModificationTime) == int(QAbstractFileEngine::ModificationTime));
- return QAbstractFileEngine::FileTime(time);
-}
-
/*!
\since 5.10
Returns the file time specified by \a time.
@@ -773,7 +776,7 @@ QDateTime QFileDevice::fileTime(QFileDevice::FileTime time) const
Q_D(const QFileDevice);
if (d->engine())
- return d->engine()->fileTime(FileDeviceTimeToAbstractFileEngineTime(time));
+ return d->engine()->fileTime(time);
return QDateTime();
}
@@ -796,7 +799,7 @@ bool QFileDevice::setFileTime(const QDateTime &newDate, QFileDevice::FileTime fi
return false;
}
- if (!d->fileEngine->setFileTime(newDate, FileDeviceTimeToAbstractFileEngineTime(fileTime))) {
+ if (!d->fileEngine->setFileTime(newDate, fileTime)) {
d->setError(d->fileEngine->error(), d->fileEngine->errorString());
return false;
}
diff --git a/src/corelib/io/qfiledevice.h b/src/corelib/io/qfiledevice.h
index e6546a7eb8..5274025715 100644
--- a/src/corelib/io/qfiledevice.h
+++ b/src/corelib/io/qfiledevice.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QFILEDEVICE_H
#define QFILEDEVICE_H
@@ -48,6 +12,22 @@ QT_BEGIN_NAMESPACE
class QDateTime;
class QFileDevicePrivate;
+#if !defined(QT_USE_NODISCARD_FILE_OPEN) && !defined(QT_NO_USE_NODISCARD_FILE_OPEN)
+# if QT_VERSION < QT_VERSION_CHECK(6, 10, 0)
+# define QT_NO_USE_NODISCARD_FILE_OPEN
+# else
+# define QT_USE_NODISCARD_FILE_OPEN
+# endif
+#endif
+
+#if defined(QT_USE_NODISCARD_FILE_OPEN) && defined(QT_NO_USE_NODISCARD_FILE_OPEN)
+#error "Inconsistent macro definition for nodiscard QFile::open"
+#elif defined(QT_USE_NODISCARD_FILE_OPEN)
+#define QFILE_MAYBE_NODISCARD [[nodiscard]]
+#else /* QT_NO_USE_NODISCARD_FILE_OPEN */
+#define QFILE_MAYBE_NODISCARD
+#endif
+
class Q_CORE_EXPORT QFileDevice : public QIODevice
{
#ifndef QT_NO_QOBJECT
diff --git a/src/corelib/io/qfiledevice_p.h b/src/corelib/io/qfiledevice_p.h
index 2b97773c2f..72b43ed5a1 100644
--- a/src/corelib/io/qfiledevice_p.h
+++ b/src/corelib/io/qfiledevice_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QFILEDEVICE_P_H
#define QFILEDEVICE_P_H
@@ -62,6 +26,11 @@
# include <qt_windows.h>
# include <winnt.h> // for SECURITY_DESCRIPTOR
# include <optional>
+# if defined(QT_BOOTSTRAPPED)
+# define QT_FEATURE_fslibs -1
+# else
+# define QT_FEATURE_fslibs 1
+# endif // QT_BOOTSTRAPPED
#endif
QT_BEGIN_NAMESPACE
@@ -155,9 +124,11 @@ private:
static constexpr auto MaxACLSize =
sizeof(ACL) + (sizeof(ACCESS_ALLOWED_ACE) + SECURITY_MAX_SID_SIZE) * MaxNumACEs;
- SECURITY_DESCRIPTOR sd;
SECURITY_ATTRIBUTES sa;
+#if QT_CONFIG(fslibs)
+ SECURITY_DESCRIPTOR sd;
alignas(DWORD) char aclStorage[MaxACLSize];
+#endif
};
#endif // Q_OS_UNIX
diff --git a/src/corelib/io/qfileinfo.cpp b/src/corelib/io/qfileinfo.cpp
index da19ba625c..6bc0128aff 100644
--- a/src/corelib/io/qfileinfo.cpp
+++ b/src/corelib/io/qfileinfo.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qplatformdefs.h"
#include "qfileinfo.h"
@@ -46,6 +10,10 @@
QT_BEGIN_NAMESPACE
+using namespace Qt::StringLiterals;
+
+QT_IMPL_METATYPE_EXTERN(QFileInfo)
+
QString QFileInfoPrivate::getFileName(QAbstractFileEngine::FileName name) const
{
if (cache_enabled && !fileNames[(int)name].isNull())
@@ -70,6 +38,9 @@ QString QFileInfoPrivate::getFileName(QAbstractFileEngine::FileName name) const
case QAbstractFileEngine::AbsoluteLinkTarget:
ret = QFileSystemEngine::getLinkTarget(fileEntry, metaData).filePath();
break;
+ case QAbstractFileEngine::RawLinkPath:
+ ret = QFileSystemEngine::getRawLinkPath(fileEntry, metaData).filePath();
+ break;
case QAbstractFileEngine::JunctionName:
ret = QFileSystemEngine::getJunctionTarget(fileEntry, metaData).filePath();
break;
@@ -95,7 +66,7 @@ QString QFileInfoPrivate::getFileName(QAbstractFileEngine::FileName name) const
ret = fileEngine->fileName(name);
}
if (ret.isNull())
- ret = QLatin1String("");
+ ret = ""_L1;
if (cache_enabled)
fileNames[(int)name] = ret;
return ret;
@@ -119,7 +90,7 @@ QString QFileInfoPrivate::getFileOwner(QAbstractFileEngine::FileOwner own) const
ret = fileEngine->owner(own);
}
if (ret.isNull())
- ret = QLatin1String("");
+ ret = ""_L1;
if (cache_enabled)
fileOwners[(int)own] = ret;
return ret;
@@ -186,7 +157,7 @@ uint QFileInfoPrivate::getFileFlags(QAbstractFileEngine::FileFlags request) cons
return fileFlags & request.toInt();
}
-QDateTime &QFileInfoPrivate::getFileTime(QAbstractFileEngine::FileTime request) const
+QDateTime &QFileInfoPrivate::getFileTime(QFile::FileTime request) const
{
Q_ASSERT(fileEngine); // should never be called when using the native FS
if (!cache_enabled)
@@ -194,16 +165,16 @@ QDateTime &QFileInfoPrivate::getFileTime(QAbstractFileEngine::FileTime request)
uint cf = 0;
switch (request) {
- case QAbstractFileEngine::AccessTime:
+ case QFile::FileAccessTime:
cf = CachedATime;
break;
- case QAbstractFileEngine::BirthTime:
+ case QFile::FileBirthTime:
cf = CachedBTime;
break;
- case QAbstractFileEngine::MetadataChangeTime:
+ case QFile::FileMetadataChangeTime:
cf = CachedMCTime;
break;
- case QAbstractFileEngine::ModificationTime:
+ case QFile::FileModificationTime:
cf = CachedMTime;
break;
}
@@ -221,72 +192,84 @@ QDateTime &QFileInfoPrivate::getFileTime(QAbstractFileEngine::FileTime request)
\class QFileInfo
\inmodule QtCore
\reentrant
- \brief The QFileInfo class provides system-independent file information.
+ \brief The QFileInfo class provides an OS-independent API to retrieve
+ information about file system entries.
\ingroup io
\ingroup shared
- QFileInfo provides information about a file's name and position
- (path) in the file system, its access rights and whether it is a
- directory or symbolic link, etc. The file's size and last
- modified/read times are also available. QFileInfo can also be
- used to obtain information about a Qt \l{resource
- system}{resource}.
-
- A QFileInfo can point to a file with either a relative or an
- absolute file path. Absolute file paths begin with the directory
- separator "/" (or with a drive specification on Windows). Relative
- file names begin with a directory name or a file name and specify
- a path relative to the current working directory. An example of an
- absolute path is the string "/tmp/quartz". A relative path might
- look like "src/fatlib". You can use the function isRelative() to
- check whether a QFileInfo is using a relative or an absolute file
- path. You can call the function makeAbsolute() to convert a
- relative QFileInfo's path to an absolute path.
+ \compares equality
+
+ QFileInfo provides information about a file system entry, such as its
+ name, path, access rights and whether it is a regular file, directory or
+ symbolic link. The entry's size and last modified/read times are also
+ available. QFileInfo can also be used to obtain information about a Qt
+ \l{resource system}{resource}.
+ A QFileInfo can point to a file system entry with either an absolute or
+ a relative path:
+ \list
+ \li \include qfileinfo.cpp absolute-path-unix-windows
+
+ \li \include qfileinfo.cpp relative-path-note
+ \endlist
+
+ An example of an absolute path is the string \c {"/tmp/quartz"}. A relative
+ path may look like \c {"src/fatlib"}. You can use the function isRelative()
+ to check whether a QFileInfo is using a relative or an absolute path. You
+ can call the function makeAbsolute() to convert a relative QFileInfo's
+ path to an absolute path.
+
+//! [qresource-virtual-fs-colon]
\note Paths starting with a colon (\e{:}) are always considered
absolute, as they denote a QResource.
+//! [qresource-virtual-fs-colon]
+
+ The file system entry path that the QFileInfo works on is set in the
+ constructor or later with setFile(). Use exists() to see if the entry
+ actually exists and size() to get its size.
+
+ The file system entry's type is obtained with isFile(), isDir(), and
+ isSymLink(). The symLinkTarget() function provides the absolute path of
+ the target the symlink points to.
+
+ The path elements of the file system entry can be extracted with path()
+ and fileName(). The fileName()'s parts can be extracted with baseName(),
+ suffix(), or completeSuffix(). QFileInfo objects referring to directories
+ created by Qt classes will not have a trailing directory separator
+ \c{'/'}. If you wish to use trailing separators in your own file info
+ objects, just append one to the entry's path given to the constructors
+ or setFile().
- The file that the QFileInfo works on is set in the constructor or
- later with setFile(). Use exists() to see if the file exists and
- size() to get its size.
+ Date and time related information are returned by birthTime(), fileTime(),
+ lastModified(), lastRead(), and metadataChangeTime().
+ Information about
+ access permissions can be obtained with isReadable(), isWritable(), and
+ isExecutable(). Ownership information can be obtained with
+ owner(), ownerId(), group(), and groupId(). You can also examine
+ permissions and ownership in a single statement using the permission()
+ function.
- The file's type is obtained with isFile(), isDir() and
- isSymLink(). The symLinkTarget() function provides the name of the file
- the symlink points to.
+ \section1 Symbolic Links and Shortcuts
- On Unix (including \macos and iOS), the property getter functions in this
- class return the properties such as times and size of the target file, not
- the symlink, because Unix handles symlinks transparently. Opening a symlink
- using QFile effectively opens the link's target. For example:
+ On Unix (including \macos and iOS), the property getter functions in
+ this class return the properties such as times and size of the target,
+ not the symlink, because Unix handles symlinks transparently. Opening
+ a symlink using QFile effectively opens the link's target. For example:
\snippet code/src_corelib_io_qfileinfo.cpp 0
On Windows, shortcuts (\c .lnk files) are currently treated as symlinks. As
- on Unix systems, the property getters return the size of the targeted file,
- not the \c .lnk file itself. This behavior is deprecated and will likely be
- removed in a future version of Qt, after which \c .lnk files will be treated
- as regular files.
+ on Unix systems, the property getters return the size of the target,
+ not the \c .lnk file itself. This behavior is deprecated and will likely
+ be removed in a future version of Qt, after which \c .lnk files will be
+ treated as regular files.
\snippet code/src_corelib_io_qfileinfo.cpp 1
- Elements of the file's name can be extracted with path() and
- fileName(). The fileName()'s parts can be extracted with
- baseName(), suffix() or completeSuffix(). QFileInfo objects to
- directories created by Qt classes will not have a trailing file
- separator. If you wish to use trailing separators in your own file
- info objects, just append one to the file name given to the constructors
- or setFile().
-
- The file's dates are returned by birthTime(), lastModified(), lastRead() and
- fileTime(). Information about the file's access permissions is
- obtained with isReadable(), isWritable() and isExecutable(). The
- file's ownership is available from owner(), ownerId(), group() and
- groupId(). You can examine a file's permissions and ownership in a
- single statement using the permission() function.
+ \section1 NTFS permissions
- \target NTFS permissions
- \note On NTFS file systems, ownership and permissions checking is
+ On NTFS file systems, ownership and permissions checking is
disabled by default for performance reasons. To enable it,
include the following line:
@@ -297,25 +280,54 @@ QDateTime &QFileInfoPrivate::getFileTime(QAbstractFileEngine::FileTime request)
\snippet ntfsp.cpp 1
- \section1 Performance Issues
+ \note Since this is a non-atomic global variable, it is only safe
+ to increment or decrement \c qt_ntfs_permission_lookup before any
+ threads other than the main thread have started or after every thread
+ other than the main thread has ended.
+
+ \note From Qt 6.6 the variable \c qt_ntfs_permission_lookup is
+ deprecated. Please use the following alternatives.
+
+ The safe and easy way to manage permission checks is to use the RAII class
+ \c QNtfsPermissionCheckGuard.
- Some of QFileInfo's functions query the file system, but for
- performance reasons, some functions only operate on the
- file name itself. For example: To return the absolute path of
- a relative file name, absolutePath() has to query the file system.
- The path() function, however, can work on the file name directly,
- and so it is faster.
+ \snippet ntfsp.cpp raii
- \note To speed up performance, QFileInfo caches information about
- the file.
+ If you need more fine-grained control, it is possible to manage the permission
+ with the following functions instead:
- Because files can be changed by other users or programs, or
- even by other parts of the same program, there is a function that
- refreshes the file information: refresh(). If you want to switch
- off a QFileInfo's caching and force it to access the file system
- every time you request information from it call setCaching(false).
- If you want to make sure that all information is read from the
- file system, use stat().
+ \snippet ntfsp.cpp free-funcs
+
+ \section1 Performance Considerations
+
+ Some of QFileInfo's functions have to query the file system, but for
+ performance reasons, some functions only operate on the path string.
+ For example: To return the absolute path of a relative entry's path,
+ absolutePath() has to query the file system. The path() function, however,
+ can work on the file name directly, and so it is faster.
+
+ QFileInfo also caches information about the file system entry it refers
+ to. Because the file system can be changed by other users or programs,
+ or even by other parts of the same program, there is a function that
+ refreshes the information stored in QFileInfo, namely refresh(). To switch
+ off a QFileInfo's caching (that is, force it to query the underlying file
+ system every time you request information from it), call setCaching(false).
+
+ Fetching information from the file system is typically done by calling
+ (possibly) expensive system functions, so QFileInfo (depending on the
+ implementation) might not fetch all the information from the file system
+ at construction. To make sure that all information is read from the file
+ system immediately, use the stat() member function.
+
+ \l{birthTime()}, \l{fileTime()}, \l{lastModified()}, \l{lastRead()},
+ and \l{metadataChangeTime()} return times in \e{local time} by default.
+ Since native file system API typically uses UTC, this requires a conversion.
+ If you don't actually need the local time, you can avoid this by requesting
+ the time in QTimeZone::UTC directly.
+
+ \section1 Platform Specific Issues
+
+ \include android-content-uri-limitations.qdocinc
\sa QDir, QFile
*/
@@ -336,9 +348,8 @@ QFileInfo::QFileInfo(QFileInfoPrivate *p) : d_ptr(p)
}
/*!
- Constructs an empty QFileInfo object.
-
- Note that an empty QFileInfo object contain no file reference.
+ Constructs an empty QFileInfo object that doesn't refer to any file
+ system entry.
\sa setFile()
*/
@@ -347,12 +358,16 @@ QFileInfo::QFileInfo() : d_ptr(new QFileInfoPrivate())
}
/*!
- Constructs a new QFileInfo that gives information about the given
- file. The \a file can also include an absolute or relative path.
+ Constructs a QFileInfo that gives information about a file system entry
+ located at \a path that can be absolute or relative.
+
+//! [preserve-relative-path]
+ If \a path is relative, the QFileInfo will also have a relative path.
+//! [preserve-relative-path]
\sa setFile(), isRelative(), QDir::setCurrent(), QDir::isRelativePath()
*/
-QFileInfo::QFileInfo(const QString &file) : d_ptr(new QFileInfoPrivate(file))
+QFileInfo::QFileInfo(const QString &path) : d_ptr(new QFileInfoPrivate(path))
{
}
@@ -371,18 +386,20 @@ QFileInfo::QFileInfo(const QFileDevice &file) : d_ptr(new QFileInfoPrivate(file.
/*!
Constructs a new QFileInfo that gives information about the given
- \a file relative to the directory \a dir.
+ file system entry \a path that is relative to the directory \a dir.
+//! [preserve-relative-or-absolute]
If \a dir has a relative path, the QFileInfo will also have a
relative path.
- If \a file is an absolute path, then the directory specified
- by \a dir will be disregarded.
+ If \a path is absolute, then the directory specified by \a dir
+ will be disregarded.
+//! [preserve-relative-or-absolute]
\sa isRelative()
*/
-QFileInfo::QFileInfo(const QDir &dir, const QString &file)
- : d_ptr(new QFileInfoPrivate(dir.filePath(file)))
+QFileInfo::QFileInfo(const QDir &dir, const QString &path)
+ : d_ptr(new QFileInfoPrivate(dir.filePath(path)))
{
}
@@ -404,58 +421,57 @@ QFileInfo::~QFileInfo()
}
/*!
- \fn bool QFileInfo::operator!=(const QFileInfo &fileinfo) const
+ \fn bool QFileInfo::operator!=(const QFileInfo &lhs, const QFileInfo &rhs)
- Returns \c true if this QFileInfo object refers to a different file
- than the one specified by \a fileinfo; otherwise returns \c false.
+ Returns \c true if QFileInfo \a lhs refers to a different file system
+ entry than the one referred to by \a rhs; otherwise returns \c false.
\sa operator==()
*/
/*!
- Returns \c true if this QFileInfo object refers to a file in the same
- location as \a fileinfo; otherwise returns \c false.
+ \fn bool QFileInfo::operator==(const QFileInfo &lhs, const QFileInfo &rhs)
- Note that the result of comparing two empty QFileInfo objects,
- containing no file references (file paths that do not exist or
- are empty), is undefined.
+ Returns \c true if QFileInfo \a lhs and QFileInfo \a rhs refer to the same
+ entry on the file system; otherwise returns \c false.
- \warning This will not compare two different symbolic links
- pointing to the same file.
+ Note that the result of comparing two empty QFileInfo objects, containing
+ no file system entry references (paths that do not exist or are empty),
+ is undefined.
- \warning Long and short file names that refer to the same file on Windows
- are treated as if they referred to different files.
+ \warning This will not compare two different symbolic links pointing to
+ the same target.
+
+ \warning On Windows, long and short paths that refer to the same file
+ system entry are treated as if they referred to different entries.
\sa operator!=()
*/
-bool QFileInfo::operator==(const QFileInfo &fileinfo) const
+bool comparesEqual(const QFileInfo &lhs, const QFileInfo &rhs)
{
- Q_D(const QFileInfo);
- // ### Qt 5: understand long and short file names on Windows
- // ### (GetFullPathName()).
- if (fileinfo.d_ptr == d_ptr)
+ if (rhs.d_ptr == lhs.d_ptr)
return true;
- if (d->isDefaultConstructed || fileinfo.d_ptr->isDefaultConstructed)
+ if (lhs.d_ptr->isDefaultConstructed || rhs.d_ptr->isDefaultConstructed)
return false;
// Assume files are the same if path is the same
- if (d->fileEntry.filePath() == fileinfo.d_ptr->fileEntry.filePath())
+ if (lhs.d_ptr->fileEntry.filePath() == rhs.d_ptr->fileEntry.filePath())
return true;
Qt::CaseSensitivity sensitive;
- if (d->fileEngine == nullptr || fileinfo.d_ptr->fileEngine == nullptr) {
- if (d->fileEngine != fileinfo.d_ptr->fileEngine) // one is native, the other is a custom file-engine
+ if (lhs.d_ptr->fileEngine == nullptr || rhs.d_ptr->fileEngine == nullptr) {
+ if (lhs.d_ptr->fileEngine != rhs.d_ptr->fileEngine) // one is native, the other is a custom file-engine
return false;
sensitive = QFileSystemEngine::isCaseSensitive() ? Qt::CaseSensitive : Qt::CaseInsensitive;
} else {
- if (d->fileEngine->caseSensitive() != fileinfo.d_ptr->fileEngine->caseSensitive())
+ if (lhs.d_ptr->fileEngine->caseSensitive() != rhs.d_ptr->fileEngine->caseSensitive())
return false;
- sensitive = d->fileEngine->caseSensitive() ? Qt::CaseSensitive : Qt::CaseInsensitive;
+ sensitive = lhs.d_ptr->fileEngine->caseSensitive() ? Qt::CaseSensitive : Qt::CaseInsensitive;
}
// Fallback to expensive canonical path computation
- return canonicalFilePath().compare(fileinfo.canonicalFilePath(), sensitive) == 0;
+ return lhs.canonicalFilePath().compare(rhs.canonicalFilePath(), sensitive) == 0;
}
/*!
@@ -476,24 +492,30 @@ QFileInfo &QFileInfo::operator=(const QFileInfo &fileinfo)
*/
/*!
- Sets the file that the QFileInfo provides information about to \a
- file.
+ Sets the path of the file system entry that this QFileInfo provides
+ information about to \a path that can be absolute or relative.
+
+//! [absolute-path-unix-windows]
+ On Unix, absolute paths begin with the directory separator \c {'/'}.
+ On Windows, absolute paths begin with a drive specification (for example,
+ \c {D:/}).
+//! [ absolute-path-unix-windows]
- The \a file can also include an absolute or relative file path.
- Absolute paths begin with the directory separator (e.g. "/" under
- Unix) or a drive specification (under Windows). Relative file
- names begin with a directory name or a file name and specify a
- path relative to the current directory.
+//! [relative-path-note]
+ Relative paths begin with a directory name or a regular file name and
+ specify a file system entry's path relative to the current working
+ directory.
+//! [relative-path-note]
Example:
\snippet code/src_corelib_io_qfileinfo.cpp 2
\sa isRelative(), QDir::setCurrent(), QDir::isRelativePath()
*/
-void QFileInfo::setFile(const QString &file)
+void QFileInfo::setFile(const QString &path)
{
bool caching = d_ptr.constData()->cache_enabled;
- *this = QFileInfo(file);
+ *this = QFileInfo(path);
d_ptr->cache_enabled = caching;
}
@@ -516,27 +538,29 @@ void QFileInfo::setFile(const QFileDevice &file)
/*!
\overload
- Sets the file that the QFileInfo provides information about to \a
- file in directory \a dir.
+ Sets the path of the file system entry that this QFileInfo provides
+ information about to \a path in directory \a dir.
- If \a file includes a relative path, the QFileInfo will also
- have a relative path.
+ \include qfileinfo.cpp preserve-relative-or-absolute
\sa isRelative()
*/
-void QFileInfo::setFile(const QDir &dir, const QString &file)
+void QFileInfo::setFile(const QDir &dir, const QString &path)
{
- setFile(dir.filePath(file));
+ setFile(dir.filePath(path));
}
/*!
- Returns an absolute path including the file name.
+ Returns the absolute full path to the file system entry this QFileInfo
+ refers to, including the entry's name.
+
+ \include qfileinfo.cpp absolute-path-unix-windows
+
+//! [windows-network-shares]
+ On Windows, the paths of network shares that are not mapped to a drive
+ letter begin with \c{//sharename/}.
+//! [windows-network-shares]
- The absolute path name consists of the full path and the file
- name. On Unix this will always begin with the root, '/',
- directory. On Windows this will always begin 'D:/' where D is a
- drive letter, except for network shares that are not mapped to a
- drive letter, in which case the path will begin '//sharename/'.
QFileInfo will uppercase drive letters. Note that QDir does not do
this. The code snippet below shows this.
@@ -555,15 +579,16 @@ QString QFileInfo::absoluteFilePath() const
{
Q_D(const QFileInfo);
if (d->isDefaultConstructed)
- return QLatin1String("");
+ return ""_L1;
return d->getFileName(QAbstractFileEngine::AbsoluteName);
}
/*!
- Returns the canonical path including the file name, i.e. an absolute
- path without symbolic links or redundant "." or ".." elements.
+ Returns the file system entry's canonical path, including the entry's
+ name, that is, an absolute path without symbolic links or redundant
+ \c{'.'} or \c{'..'} elements.
- If the file does not exist, canonicalFilePath() returns an empty
+ If the entry does not exist, canonicalFilePath() returns an empty
string.
\sa filePath(), absoluteFilePath(), dir()
@@ -572,19 +597,18 @@ QString QFileInfo::canonicalFilePath() const
{
Q_D(const QFileInfo);
if (d->isDefaultConstructed)
- return QLatin1String("");
+ return ""_L1;
return d->getFileName(QAbstractFileEngine::CanonicalName);
}
/*!
- Returns a file's path absolute path. This doesn't include the
- file name.
+ Returns the absolute path of the file system entry this QFileInfo refers to,
+ excluding the entry's name.
+
+ \include qfileinfo.cpp absolute-path-unix-windows
- On Unix the absolute path will always begin with the root, '/',
- directory. On Windows this will always begin 'D:/' where D is a
- drive letter, except for network shares that are not mapped to a
- drive letter, in which case the path will begin '//sharename/'.
+ \include qfileinfo.cpp windows-network-shares
In contrast to canonicalPath() symbolic links or redundant "." or
".." elements are not necessarily removed.
@@ -598,17 +622,16 @@ QString QFileInfo::absolutePath() const
{
Q_D(const QFileInfo);
- if (d->isDefaultConstructed) {
- return QLatin1String("");
- }
+ if (d->isDefaultConstructed)
+ return ""_L1;
return d->getFileName(QAbstractFileEngine::AbsolutePathName);
}
/*!
- Returns the file's path canonical path (excluding the file name),
+ Returns the file system entry's canonical path (excluding the entry's name),
i.e. an absolute path without symbolic links or redundant "." or ".." elements.
- If the file does not exist, canonicalPath() returns an empty string.
+ If the entry does not exist, this method returns an empty string.
\sa path(), absolutePath()
*/
@@ -616,16 +639,16 @@ QString QFileInfo::canonicalPath() const
{
Q_D(const QFileInfo);
if (d->isDefaultConstructed)
- return QLatin1String("");
+ return ""_L1;
return d->getFileName(QAbstractFileEngine::CanonicalPathName);
}
/*!
- Returns the file's path. This doesn't include the file name.
+ Returns the path of the file system entry this QFileInfo refers to,
+ excluding the entry's name.
- Note that, if this QFileInfo object is given a path ending in a
- slash, the name of the file is considered empty and this function
- will return the entire path.
+ \include qfileinfo.cpp path-ends-with-slash-empty-name-component
+ In this case, this function will return the entire path.
\sa filePath(), absolutePath(), canonicalPath(), dir(), fileName(), isRelative()
*/
@@ -633,29 +656,28 @@ QString QFileInfo::path() const
{
Q_D(const QFileInfo);
if (d->isDefaultConstructed)
- return QLatin1String("");
+ return ""_L1;
return d->fileEntry.path();
}
/*!
\fn bool QFileInfo::isAbsolute() const
- Returns \c true if the file path is absolute, otherwise returns \c false (i.e.
- the path is relative).
+ Returns \c true if the file system entry's path is absolute, otherwise
+ returns \c false (that is, the path is relative).
- \note Paths starting with a colon (\e{:}) are always considered absolute, as
- they denote a QResource.
+ \include qfileinfo.cpp qresource-virtual-fs-colon
\sa isRelative()
*/
/*!
- Returns \c true if the file path is relative, otherwise returns \c
- false (i.e. the path is absolute). (E.g. under Unix a path is absolute
- if it begins with a "/").
+ Returns \c true if the file system entry's path is relative, otherwise
+ returns \c false (that is, the path is absolute).
- \note Paths starting with a colon (\e{:}) are always considered absolute,
- as they denote a QResource.
+ \include qfileinfo.cpp absolute-path-unix-windows
+
+ \include qfileinfo.cpp qresource-virtual-fs-colon
\sa isAbsolute()
*/
@@ -670,9 +692,9 @@ bool QFileInfo::isRelative() const
}
/*!
- Converts the file's path to an absolute path if it is not already in that form.
- Returns \c true to indicate that the path was converted; otherwise returns \c false
- to indicate that the path was already absolute.
+ If the file system entry's path is relative, this method converts it to
+ an absolute path and returns \c true; if the path is already absolute,
+ this method returns \c false.
\sa filePath(), isRelative()
*/
@@ -687,10 +709,11 @@ bool QFileInfo::makeAbsolute()
}
/*!
- Returns \c true if the file exists; otherwise returns \c false.
+ Returns \c true if the file system entry this QFileInfo refers to exists;
+ otherwise returns \c false.
- \note If the file is a symlink that points to a non-existing
- file, false is returned.
+ \note If the entry is a symlink that points to a non-existing
+ target, this method returns \c false.
*/
bool QFileInfo::exists() const
{
@@ -708,24 +731,23 @@ bool QFileInfo::exists() const
/*!
\since 5.2
- Returns \c true if the \a file exists; otherwise returns \c false.
+ Returns \c true if the file system entry \a path exists; otherwise
+ returns \c false.
- \note If \a file is a symlink that points to a non-existing
- file, false is returned.
+ \note If \a path is a symlink that points to a non-existing
+ target, this method returns \c false.
\note Using this function is faster than using
- \c QFileInfo(file).exists() for file system access.
+ \c QFileInfo(path).exists() for file system access.
*/
-bool QFileInfo::exists(const QString &file)
+bool QFileInfo::exists(const QString &path)
{
- if (file.isEmpty())
+ if (path.isEmpty())
return false;
- QFileSystemEntry entry(file);
+ QFileSystemEntry entry(path);
QFileSystemMetaData data;
- std::unique_ptr<QAbstractFileEngine> engine
- {QFileSystemEngine::resolveEntryAndCreateLegacyEngine(entry, data)};
// Expensive fallback to non-QFileSystemEngine implementation
- if (engine)
+ if (auto engine = QFileSystemEngine::createLegacyEngine(entry, data))
return QFileInfo(new QFileInfoPrivate(entry, data, std::move(engine))).exists();
QFileSystemEngine::fillMetaData(entry, data, QFileSystemMetaData::ExistsAttribute);
@@ -733,8 +755,9 @@ bool QFileInfo::exists(const QString &file)
}
/*!
- Refreshes the information about the file, i.e. reads in information
- from the file system the next time a cached property is fetched.
+ Refreshes the information about the file system entry this QFileInfo
+ refers to, that is, reads in information from the file system the next
+ time a cached property is fetched.
*/
void QFileInfo::refresh()
{
@@ -743,8 +766,8 @@ void QFileInfo::refresh()
}
/*!
- Returns the file name, including the path (which may be absolute
- or relative).
+ Returns the path of the file system entry this QFileInfo refers to;
+ the path may be absolute or relative.
\sa absoluteFilePath(), canonicalFilePath(), isRelative()
*/
@@ -752,18 +775,21 @@ QString QFileInfo::filePath() const
{
Q_D(const QFileInfo);
if (d->isDefaultConstructed)
- return QLatin1String("");
+ return ""_L1;
return d->fileEntry.filePath();
}
/*!
- Returns the name of the file, excluding the path.
+ Returns the name of the file system entry this QFileInfo refers to,
+ excluding the path.
Example:
\snippet code/src_corelib_io_qfileinfo.cpp 3
- Note that, if this QFileInfo object is given a path ending in a
- slash, the name of the file is considered empty.
+//! [path-ends-with-slash-empty-name-component]
+ \note If this QFileInfo is given a path ending with a directory separator
+ \c{'/'}, the entry's name part is considered empty.
+//! [path-ends-with-slash-empty-name-component]
\sa isRelative(), filePath(), baseName(), suffix()
*/
@@ -771,8 +797,10 @@ QString QFileInfo::fileName() const
{
Q_D(const QFileInfo);
if (d->isDefaultConstructed)
- return QLatin1String("");
- return d->fileEntry.fileName();
+ return ""_L1;
+ if (!d->fileEngine)
+ return d->fileEntry.fileName();
+ return d->fileEngine->fileName(QAbstractFileEngine::BaseName);
}
/*!
@@ -791,7 +819,7 @@ QString QFileInfo::bundleName() const
{
Q_D(const QFileInfo);
if (d->isDefaultConstructed)
- return QLatin1String("");
+ return ""_L1;
return d->getFileName(QAbstractFileEngine::BundleName);
}
@@ -815,8 +843,10 @@ QString QFileInfo::baseName() const
{
Q_D(const QFileInfo);
if (d->isDefaultConstructed)
- return QLatin1String("");
- return d->fileEntry.baseName();
+ return ""_L1;
+ if (!d->fileEngine)
+ return d->fileEntry.baseName();
+ return QFileSystemEntry(d->fileEngine->fileName(QAbstractFileEngine::BaseName)).baseName();
}
/*!
@@ -834,8 +864,11 @@ QString QFileInfo::completeBaseName() const
{
Q_D(const QFileInfo);
if (d->isDefaultConstructed)
- return QLatin1String("");
- return d->fileEntry.completeBaseName();
+ return ""_L1;
+ if (!d->fileEngine)
+ return d->fileEntry.completeBaseName();
+ const QString fileEngineBaseName = d->fileEngine->fileName(QAbstractFileEngine::BaseName);
+ return QFileSystemEntry(fileEngineBaseName).completeBaseName();
}
/*!
@@ -853,7 +886,7 @@ QString QFileInfo::completeSuffix() const
{
Q_D(const QFileInfo);
if (d->isDefaultConstructed)
- return QLatin1String("");
+ return ""_L1;
return d->fileEntry.completeSuffix();
}
@@ -876,15 +909,16 @@ QString QFileInfo::suffix() const
{
Q_D(const QFileInfo);
if (d->isDefaultConstructed)
- return QLatin1String("");
+ return ""_L1;
return d->fileEntry.suffix();
}
/*!
- Returns the path of the object's parent directory as a QDir object.
+ Returns a QDir object representing the path of the parent directory of the
+ file system entry that this QFileInfo refers to.
- \b{Note:} The QDir returned always corresponds to the object's
+ \note The QDir returned always corresponds to the object's
parent directory, even if the QFileInfo represents a directory.
For each of the following, dir() returns the QDir
@@ -906,7 +940,10 @@ QDir QFileInfo::dir() const
}
/*!
- Returns the file's absolute path as a QDir object.
+ Returns a QDir object representing the absolute path of the parent
+ directory of the file system entry that this QFileInfo refers to.
+
+ \snippet code/src_corelib_io_qfileinfo.cpp 11
\sa dir(), filePath(), fileName(), isRelative()
*/
@@ -916,13 +953,13 @@ QDir QFileInfo::absoluteDir() const
}
/*!
- Returns \c true if the user can read the file; otherwise returns \c false.
+ Returns \c true if the user can read the file system entry this QFileInfo
+ refers to; otherwise returns \c false.
- If the file is a symlink, this function returns true if the target is
- readable (not the symlink).
+ \include qfileinfo.cpp info-about-target-not-symlink
\note If the \l{NTFS permissions} check has not been enabled, the result
- on Windows will merely reflect whether the file exists.
+ on Windows will merely reflect whether the entry exists.
\sa isWritable(), isExecutable(), permission()
*/
@@ -931,18 +968,18 @@ bool QFileInfo::isReadable() const
Q_D(const QFileInfo);
return d->checkAttribute<bool>(
QFileSystemMetaData::UserReadPermission,
- [d]() { return (d->metaData.permissions() & QFile::ReadUser) != 0; },
+ [d]() { return d->metaData.isReadable(); },
[d]() { return d->getFileFlags(QAbstractFileEngine::ReadUserPerm); });
}
/*!
- Returns \c true if the user can write to the file; otherwise returns \c false.
+ Returns \c true if the user can write to the file system entry this
+ QFileInfo refers to; otherwise returns \c false.
- If the file is a symlink, this function returns true if the target is
- writeable (not the symlink).
+ \include qfileinfo.cpp info-about-target-not-symlink
\note If the \l{NTFS permissions} check has not been enabled, the result on
- Windows will merely reflect whether the file is marked as Read Only.
+ Windows will merely reflect whether the entry is marked as Read Only.
\sa isReadable(), isExecutable(), permission()
*/
@@ -951,15 +988,18 @@ bool QFileInfo::isWritable() const
Q_D(const QFileInfo);
return d->checkAttribute<bool>(
QFileSystemMetaData::UserWritePermission,
- [d]() { return (d->metaData.permissions() & QFile::WriteUser) != 0; },
+ [d]() { return d->metaData.isWritable(); },
[d]() { return d->getFileFlags(QAbstractFileEngine::WriteUserPerm); });
}
/*!
- Returns \c true if the file is executable; otherwise returns \c false.
+ Returns \c true if the file system entry this QFileInfo refers to is
+ executable; otherwise returns \c false.
- If the file is a symlink, this function returns true if the target is
- executable (not the symlink).
+//! [info-about-target-not-symlink]
+ If the file is a symlink, this function returns information about the
+ target, not the symlink.
+//! [info-about-target-not-symlink]
\sa isReadable(), isWritable(), permission()
*/
@@ -968,15 +1008,16 @@ bool QFileInfo::isExecutable() const
Q_D(const QFileInfo);
return d->checkAttribute<bool>(
QFileSystemMetaData::UserExecutePermission,
- [d]() { return (d->metaData.permissions() & QFile::ExeUser) != 0; },
+ [d]() { return d->metaData.isExecutable(); },
[d]() { return d->getFileFlags(QAbstractFileEngine::ExeUserPerm); });
}
/*!
- Returns \c true if this is a `hidden' file; otherwise returns \c false.
+ Returns \c true if the file system entry this QFileInfo refers to is
+ `hidden'; otherwise returns \c false.
\b{Note:} This function returns \c true for the special entries "." and
- ".." on Unix, even though QDir::entryList threats them as shown. And note
+ ".." on Unix, even though QDir::entryList treats them as shown. And note
that, since this function inspects the file name, on Unix it will inspect
the name of the symlink, if this file is a symlink, not the target's name.
@@ -1018,10 +1059,10 @@ bool QFileInfo::isNativePath() const
/*!
Returns \c true if this object points to a file or to a symbolic
link to a file. Returns \c false if the
- object points to something which isn't a file, such as a directory.
+ object points to something that is not a file (such as a directory)
+ or that does not exist.
- If the file is a symlink, this function returns true if the target is a
- regular file (not the symlink).
+ \include qfileinfo.cpp info-about-target-not-symlink
\sa isDir(), isSymLink(), isBundle()
*/
@@ -1036,10 +1077,11 @@ bool QFileInfo::isFile() const
/*!
Returns \c true if this object points to a directory or to a symbolic
- link to a directory; otherwise returns \c false.
+ link to a directory. Returns \c false if the
+ object points to something that is not a directory (such as a file)
+ or that does not exist.
- If the file is a symlink, this function returns true if the target is a
- directory (not the symlink).
+ \include qfileinfo.cpp info-about-target-not-symlink
\sa isFile(), isSymLink(), isBundle()
*/
@@ -1058,8 +1100,7 @@ bool QFileInfo::isDir() const
Returns \c true if this object points to a bundle or to a symbolic
link to a bundle on \macos and iOS; otherwise returns \c false.
- If the file is a symlink, this function returns true if the target is a
- bundle (not the symlink).
+ \include qfileinfo.cpp info-about-target-not-symlink
\sa isDir(), isSymLink(), isFile()
*/
@@ -1073,8 +1114,8 @@ bool QFileInfo::isBundle() const
}
/*!
- Returns \c true if this object points to a symbolic link or shortcut;
- otherwise returns \c false.
+ Returns \c true if this object points to a symbolic link, shortcut,
+ or alias; otherwise returns \c false.
Symbolic links exist on Unix (including \macos and iOS) and Windows
and are typically created by the \c{ln -s} or \c{mklink} commands,
@@ -1082,15 +1123,18 @@ bool QFileInfo::isBundle() const
the \l{symLinkTarget()}{link's target}.
In addition, true will be returned for shortcuts (\c *.lnk files) on
- Windows. This behavior is deprecated and will likely change in a future
- version of Qt. Opening those will open the \c .lnk file itself.
+ Windows, and aliases on \macos. This behavior is deprecated and will
+ likely change in a future version of Qt. Opening a shortcut or alias
+ will open the \c .lnk or alias file itself.
Example:
\snippet code/src_corelib_io_qfileinfo.cpp 9
- \note If the symlink points to a non existing file, exists() returns
- false.
+//! [symlink-target-exists-behavior]
+ \note exists() returns \c true if the symlink points to an existing
+ target, otherwise it returns \c false.
+//! [symlink-target-exists-behavior]
\sa isFile(), isDir(), symLinkTarget()
*/
@@ -1115,10 +1159,10 @@ bool QFileInfo::isSymLink() const
opens the \l{symLinkTarget()}{link's target}.
In contrast to isSymLink(), false will be returned for shortcuts
- (\c *.lnk files) on Windows. Use QFileInfo::isShortcut() instead.
+ (\c *.lnk files) on Windows and aliases on \macos. Use QFileInfo::isShortcut()
+ and QFileInfo::isAlias() instead.
- \note If the symlink points to a non existing file, exists() returns
- false.
+ \include qfileinfo.cpp symlink-target-exists-behavior
\sa isFile(), isDir(), isShortcut(), symLinkTarget()
*/
@@ -1158,6 +1202,29 @@ bool QFileInfo::isShortcut() const
[d]() { return d->getFileFlags(QAbstractFileEngine::LinkType); });
}
+/*!
+ Returns \c true if this object points to an alias;
+ otherwise returns \c false.
+
+ \since 6.4
+
+ Aliases only exist on \macos. They are treated as regular files, so
+ opening an alias will open the file itself. In order to open the file
+ or directory an alias references use symLinkTarget().
+
+ \note Even if an alias points to a non existing file,
+ isAlias() returns true.
+
+ \sa isFile(), isDir(), isSymLink(), symLinkTarget()
+*/
+bool QFileInfo::isAlias() const
+{
+ Q_D(const QFileInfo);
+ return d->checkAttribute<bool>(
+ QFileSystemMetaData::LegacyLinkType,
+ [d]() { return d->metaData.isAlias(); },
+ [d]() { return d->getFileFlags(QAbstractFileEngine::LinkType); });
+}
/*!
\since 5.15
@@ -1214,8 +1281,8 @@ bool QFileInfo::isRoot() const
link.
This name may not represent an existing file; it is only a string.
- QFileInfo::exists() returns \c true if the symlink points to an
- existing file.
+
+ \include qfileinfo.cpp symlink-target-exists-behavior
\sa exists(), isSymLink(), isDir(), isFile()
*/
@@ -1223,11 +1290,30 @@ QString QFileInfo::symLinkTarget() const
{
Q_D(const QFileInfo);
if (d->isDefaultConstructed)
- return QLatin1String("");
+ return ""_L1;
return d->getFileName(QAbstractFileEngine::AbsoluteLinkTarget);
}
/*!
+ \since 6.6
+ Read the path the symlink references.
+
+ Returns the raw path referenced by the symbolic link, without resolving a relative
+ path relative to the directory containing the symbolic link. The returned string will
+ only be an absolute path if the symbolic link actually references it as such. Returns
+ an empty string if the object is not a symbolic link.
+
+ \sa symLinkTarget(), exists(), isSymLink(), isDir(), isFile()
+*/
+QString QFileInfo::readSymLink() const
+{
+ Q_D(const QFileInfo);
+ if (d->isDefaultConstructed)
+ return {};
+ return d->getFileName(QAbstractFileEngine::RawLinkPath);
+}
+
+/*!
\since 6.2
Resolves an NTFS junction to the path it references.
@@ -1245,7 +1331,7 @@ QString QFileInfo::junctionTarget() const
{
Q_D(const QFileInfo);
if (d->isDefaultConstructed)
- return QLatin1String("");
+ return ""_L1;
return d->getFileName(QAbstractFileEngine::JunctionName);
}
@@ -1258,8 +1344,7 @@ QString QFileInfo::junctionTarget() const
milliseconds). On Windows, it will return an empty string unless
the \l{NTFS permissions} check has been enabled.
- If the file is a symlink, this function returns the owner of the target
- (not the symlink).
+ \include qfileinfo.cpp info-about-target-not-symlink
\sa ownerId(), group(), groupId()
*/
@@ -1267,7 +1352,7 @@ QString QFileInfo::owner() const
{
Q_D(const QFileInfo);
if (d->isDefaultConstructed)
- return QLatin1String("");
+ return ""_L1;
return d->getFileOwner(QAbstractFileEngine::OwnerUser);
}
@@ -1277,8 +1362,7 @@ QString QFileInfo::owner() const
On Windows and on systems where files do not have owners this
function returns ((uint) -2).
- If the file is a symlink, this function returns the id of the owner of the target
- (not the symlink).
+ \include qfileinfo.cpp info-about-target-not-symlink
\sa owner(), group(), groupId()
*/
@@ -1299,8 +1383,7 @@ uint QFileInfo::ownerId() const
This function can be time consuming under Unix (in the order of
milliseconds).
- If the file is a symlink, this function returns the owning group of the
- target (not the symlink).
+ \include qfileinfo.cpp info-about-target-not-symlink
\sa groupId(), owner(), ownerId()
*/
@@ -1308,7 +1391,7 @@ QString QFileInfo::group() const
{
Q_D(const QFileInfo);
if (d->isDefaultConstructed)
- return QLatin1String("");
+ return ""_L1;
return d->getFileOwner(QAbstractFileEngine::OwnerGroup);
}
@@ -1318,8 +1401,7 @@ QString QFileInfo::group() const
On Windows and on systems where files do not have groups this
function always returns (uint) -2.
- If the file is a symlink, this function returns the id of the group owning the
- target (not the symlink).
+ \include qfileinfo.cpp info-about-target-not-symlink
\sa group(), owner(), ownerId()
*/
@@ -1346,8 +1428,7 @@ uint QFileInfo::groupId() const
Example:
\snippet code/src_corelib_io_qfileinfo.cpp 10
- If the file is a symlink, this function checks the permissions of the
- target (not the symlink).
+ \include qfileinfo.cpp info-about-target-not-symlink
\sa isReadable(), isWritable(), isExecutable()
*/
@@ -1372,8 +1453,7 @@ bool QFileInfo::permission(QFile::Permissions permissions) const
\note The result might be inaccurate on Windows if the
\l{NTFS permissions} check has not been enabled.
- If the file is a symlink, this function returns the permissions of the
- target (not the symlink).
+ \include qfileinfo.cpp info-about-target-not-symlink
*/
QFile::Permissions QFileInfo::permissions() const
{
@@ -1391,8 +1471,7 @@ QFile::Permissions QFileInfo::permissions() const
Returns the file size in bytes. If the file does not exist or cannot be
fetched, 0 is returned.
- If the file is a symlink, the size of the target file is returned
- (not the symlink).
+ \include qfileinfo.cpp info-about-target-not-symlink
\sa exists()
*/
@@ -1413,77 +1492,180 @@ qint64 QFileInfo::size() const
/*!
\fn QDateTime QFileInfo::birthTime() const
+
+ Returns the date and time when the file was created (born), in local time.
+
+ If the file birth time is not available, this function returns an invalid QDateTime.
+
+ \include qfileinfo.cpp info-about-target-not-symlink
+
+ This function overloads QFileInfo::birthTime(const QTimeZone &tz), and
+ returns the same as \c{birthTime(QTimeZone::LocalTime)}.
+
\since 5.10
- Returns the date and time when the file was created / born.
+ \sa lastModified(), lastRead(), metadataChangeTime(), fileTime()
+*/
+
+/*!
+ \fn QDateTime QFileInfo::birthTime(const QTimeZone &tz) const
+
+ Returns the date and time when the file was created (born).
+
+ \include qfileinfo.cpp file-times-in-time-zone
If the file birth time is not available, this function returns an invalid
QDateTime.
- If the file is a symlink, the time of the target file is returned
- (not the symlink).
+ \include qfileinfo.cpp info-about-target-not-symlink
- \sa lastModified(), lastRead(), metadataChangeTime()
+ \since 6.6
+ \sa lastModified(const QTimeZone &), lastRead(const QTimeZone &),
+ metadataChangeTime(const QTimeZone &),
+ fileTime(QFileDevice::FileTime, const QTimeZone &)
*/
/*!
\fn QDateTime QFileInfo::metadataChangeTime() const
+
+ Returns the date and time when the file's metadata was last changed,
+ in local time.
+
+ A metadata change occurs when the file is first created, but it also
+ occurs whenever the user writes or sets inode information (for example,
+ changing the file permissions).
+
+ \include qfileinfo.cpp info-about-target-not-symlink
+
+ This function overloads QFileInfo::metadataChangeTime(const QTimeZone &tz),
+ and returns the same as \c{metadataChangeTime(QTimeZone::LocalTime)}.
+
\since 5.10
- Returns the date and time when the file metadata was changed. A metadata
- change occurs when the file is created, but it also occurs whenever the
- user writes or sets inode information (for example, changing the file
- permissions).
+ \sa birthTime(), lastModified(), lastRead(), fileTime()
+*/
+
+/*!
+ \fn QDateTime QFileInfo::metadataChangeTime(const QTimeZone &tz) const
+
+ Returns the date and time when the file's metadata was last changed.
+ A metadata change occurs when the file is first created, but it also
+ occurs whenever the user writes or sets inode information (for example,
+ changing the file permissions).
- If the file is a symlink, the time of the target file is returned
- (not the symlink).
+ \include qfileinfo.cpp file-times-in-time-zone
- \sa lastModified(), lastRead()
+ \include qfileinfo.cpp info-about-target-not-symlink
+
+ \since 6.6
+ \sa birthTime(const QTimeZone &), lastModified(const QTimeZone &),
+ lastRead(const QTimeZone &),
+ fileTime(QFileDevice::FileTime time, const QTimeZone &)
*/
/*!
\fn QDateTime QFileInfo::lastModified() const
- Returns the date and local time when the file was last modified.
+ Returns the date and time when the file was last modified.
+
+ \include qfileinfo.cpp info-about-target-not-symlink
- If the file is a symlink, the time of the target file is returned
- (not the symlink).
+ This function overloads \l{QFileInfo::lastModified(const QTimeZone &)},
+ and returns the same as \c{lastModified(QTimeZone::LocalTime)}.
\sa birthTime(), lastRead(), metadataChangeTime(), fileTime()
*/
/*!
+ \fn QDateTime QFileInfo::lastModified(const QTimeZone &tz) const
+
+ Returns the date and time when the file was last modified.
+
+ \include qfileinfo.cpp file-times-in-time-zone
+
+ \include qfileinfo.cpp info-about-target-not-symlink
+
+ \since 6.6
+ \sa birthTime(const QTimeZone &), lastRead(const QTimeZone &),
+ metadataChangeTime(const QTimeZone &),
+ fileTime(QFileDevice::FileTime, const QTimeZone &)
+*/
+
+/*!
\fn QDateTime QFileInfo::lastRead() const
- Returns the date and local time when the file was last read (accessed).
+ Returns the date and time when the file was last read (accessed).
- On platforms where this information is not available, returns the
- same as lastModified().
+ On platforms where this information is not available, returns the same
+ time as lastModified().
- If the file is a symlink, the time of the target file is returned
- (not the symlink).
+ \include qfileinfo.cpp info-about-target-not-symlink
+
+ This function overloads \l{QFileInfo::lastRead(const QTimeZone &)},
+ and returns the same as \c{lastRead(QTimeZone::LocalTime)}.
\sa birthTime(), lastModified(), metadataChangeTime(), fileTime()
*/
/*!
+ \fn QDateTime QFileInfo::lastRead(const QTimeZone &tz) const
+
+ Returns the date and time when the file was last read (accessed).
+
+ \include qfileinfo.cpp file-times-in-time-zone
+
+ On platforms where this information is not available, returns the same
+ time as lastModified().
+
+ \include qfileinfo.cpp info-about-target-not-symlink
+
+ \since 6.6
+ \sa birthTime(const QTimeZone &), lastModified(const QTimeZone &),
+ metadataChangeTime(const QTimeZone &),
+ fileTime(QFileDevice::FileTime, const QTimeZone &)
+*/
+
+#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0) && !defined(QT_BOOTSTRAPPED)
+/*!
+ Returns the file time specified by \a time.
+
+ If the time cannot be determined, an invalid date time is returned.
+
+ \include qfileinfo.cpp info-about-target-not-symlink
+
+ This function overloads
+ \l{QFileInfo::fileTime(QFileDevice::FileTime, const QTimeZone &)},
+ and returns the same as \c{fileTime(time, QTimeZone::LocalTime)}.
+
\since 5.10
+ \sa birthTime(), lastModified(), lastRead(), metadataChangeTime()
+*/
+QDateTime QFileInfo::fileTime(QFile::FileTime time) const {
+ return fileTime(time, QTimeZone::LocalTime);
+}
+#endif
+
+/*!
+ Returns the file time specified by \a time.
+
+//! [file-times-in-time-zone]
+ The returned time is in the time zone specified by \a tz. For example,
+ you can use QTimeZone::LocalTime or QTimeZone::UTC to get the time in
+ the Local time zone or UTC, respectively. Since native file system API
+ typically uses UTC, using QTimeZone::UTC is often faster, as it does not
+ require any conversions.
+//! [file-times-in-time-zone]
- Returns the file time specified by \a time. If the time cannot be
- determined, an invalid date time is returned.
+ If the time cannot be determined, an invalid date time is returned.
- If the file is a symlink, the time of the target file is returned
- (not the symlink).
+ \include qfileinfo.cpp info-about-target-not-symlink
- \sa QFile::FileTime, QDateTime::isValid()
+ \since 6.6
+ \sa birthTime(const QTimeZone &), lastModified(const QTimeZone &),
+ lastRead(const QTimeZone &), metadataChangeTime(const QTimeZone &),
+ QDateTime::isValid()
*/
-QDateTime QFileInfo::fileTime(QFile::FileTime time) const
+QDateTime QFileInfo::fileTime(QFile::FileTime time, const QTimeZone &tz) const
{
- static_assert(int(QFile::FileAccessTime) == int(QAbstractFileEngine::AccessTime));
- static_assert(int(QFile::FileBirthTime) == int(QAbstractFileEngine::BirthTime));
- static_assert(int(QFile::FileMetadataChangeTime) == int(QAbstractFileEngine::MetadataChangeTime));
- static_assert(int(QFile::FileModificationTime) == int(QAbstractFileEngine::ModificationTime));
-
Q_D(const QFileInfo);
- auto fetime = QAbstractFileEngine::FileTime(time);
QFileSystemMetaData::MetaDataFlags flag;
switch (time) {
case QFile::FileAccessTime:
@@ -1500,10 +1682,11 @@ QDateTime QFileInfo::fileTime(QFile::FileTime time) const
break;
}
- return d->checkAttribute<QDateTime>(
- flag,
- [=]() { return d->metaData.fileTime(fetime).toLocalTime(); },
- [=]() { return d->getFileTime(fetime).toLocalTime(); });
+ auto fsLambda = [d, time]() { return d->metaData.fileTime(time); };
+ auto engineLambda = [d, time]() { return d->getFileTime(time); };
+ const auto dt =
+ d->checkAttribute<QDateTime>(flag, std::move(fsLambda), std::move(engineLambda));
+ return dt.toTimeZone(tz);
}
/*!
@@ -1587,24 +1770,22 @@ QDebug operator<<(QDebug dbg, const QFileInfo &fi)
\sa setFile(), isRelative(), QDir::setCurrent(), QDir::isRelativePath()
*/
/*!
- \fn QFileInfo::QFileInfo(const QDir &dir, const std::filesystem::path &file)
+ \fn QFileInfo::QFileInfo(const QDir &dir, const std::filesystem::path &path)
\since 6.0
- Constructs a new QFileInfo that gives information about the given
- \a file relative to the directory \a dir.
+ Constructs a new QFileInfo that gives information about the file system
+ entry at \a path that is relative to the directory \a dir.
- If \a dir has a relative path, the QFileInfo will also have a
- relative path.
-
- If \a file is an absolute path, then the directory specified
- by \a dir will be disregarded.
+ \include qfileinfo.cpp preserve-relative-or-absolute
*/
/*!
- \fn void QFileInfo::setFile(const std::filesystem::path &file)
+ \fn void QFileInfo::setFile(const std::filesystem::path &path)
\since 6.0
- Sets the file that the QFileInfo provides information about to \a
- file.
+ Sets the path of file system entry that this QFileInfo provides
+ information about to \a path.
+
+ \include qfileinfo.cpp preserve-relative-path
*/
/*!
\fn std::filesystem::path QFileInfo::filesystemFilePath() const
@@ -1656,6 +1837,13 @@ QDebug operator<<(QDebug dbg, const QFileInfo &fi)
\sa symLinkTarget()
*/
/*!
+ \fn std::filesystem::path QFileInfo::filesystemReadSymLink() const
+ \since 6.6
+
+ Returns readSymLink() as a \c{std::filesystem::path}.
+ \sa readSymLink()
+*/
+/*!
\fn std::filesystem::path QFileInfo::filesystemJunctionTarget() const
\since 6.2
diff --git a/src/corelib/io/qfileinfo.h b/src/corelib/io/qfileinfo.h
index 4bc5db9e2b..72c8519446 100644
--- a/src/corelib/io/qfileinfo.h
+++ b/src/corelib/io/qfileinfo.h
@@ -1,50 +1,16 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QFILEINFO_H
#define QFILEINFO_H
+#include <QtCore/qcompare.h>
#include <QtCore/qfile.h>
#include <QtCore/qlist.h>
#include <QtCore/qshareddata.h>
#include <QtCore/qmetatype.h>
#include <QtCore/qdatetime.h>
+#include <QtCore/qtimezone.h>
QT_BEGIN_NAMESPACE
@@ -56,6 +22,7 @@ class QFileInfoPrivate;
class Q_CORE_EXPORT QFileInfo
{
friend class QDirIteratorPrivate;
+ friend class QDirListingPrivate;
public:
explicit QFileInfo(QFileInfoPrivate *d);
@@ -70,7 +37,7 @@ public:
QFILEINFO_MAYBE_EXPLICIT QFileInfo(const QFileDevice &file);
QFILEINFO_MAYBE_EXPLICIT QFileInfo(const QDir &dir, const QString &file);
QFileInfo(const QFileInfo &fileinfo);
-#ifdef Q_CLANG_QDOC
+#ifdef Q_QDOC
QFileInfo(const std::filesystem::path &file);
QFileInfo(const QDir &dir, const std::filesystem::path &file);
#elif QT_CONFIG(cxx17_filesystem)
@@ -91,15 +58,17 @@ public:
QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_PURE_SWAP(QFileInfo)
void swap(QFileInfo &other) noexcept
- { qSwap(d_ptr, other.d_ptr); }
+ { d_ptr.swap(other.d_ptr); }
+#if QT_CORE_REMOVED_SINCE(6, 8)
bool operator==(const QFileInfo &fileinfo) const;
inline bool operator!=(const QFileInfo &fileinfo) const { return !(operator==(fileinfo)); }
+#endif
void setFile(const QString &file);
void setFile(const QFileDevice &file);
void setFile(const QDir &dir, const QString &file);
-#ifdef Q_CLANG_QDOC
+#ifdef Q_QDOC
void setFile(const std::filesystem::path &file);
#elif QT_CONFIG(cxx17_filesystem)
template<typename T, QtPrivate::ForceFilesystemPath<T> = 0>
@@ -113,7 +82,7 @@ public:
QString filePath() const;
QString absoluteFilePath() const;
QString canonicalFilePath() const;
-#if QT_CONFIG(cxx17_filesystem) || defined(Q_CLANG_QDOC)
+#if QT_CONFIG(cxx17_filesystem) || defined(Q_QDOC)
std::filesystem::path filesystemFilePath() const
{ return QtPrivate::toFilesystemPath(filePath()); }
std::filesystem::path filesystemAbsoluteFilePath() const
@@ -131,7 +100,7 @@ public:
QString path() const;
QString absolutePath() const;
QString canonicalPath() const;
-#if QT_CONFIG(cxx17_filesystem) || defined(Q_CLANG_QDOC)
+#if QT_CONFIG(cxx17_filesystem) || defined(Q_QDOC)
std::filesystem::path filesystemPath() const { return QtPrivate::toFilesystemPath(path()); }
std::filesystem::path filesystemAbsolutePath() const
{ return QtPrivate::toFilesystemPath(absolutePath()); }
@@ -156,17 +125,22 @@ public:
bool isSymLink() const;
bool isSymbolicLink() const;
bool isShortcut() const;
+ bool isAlias() const;
bool isJunction() const;
bool isRoot() const;
bool isBundle() const;
QString symLinkTarget() const;
+ QString readSymLink() const;
QString junctionTarget() const;
-#if QT_CONFIG(cxx17_filesystem) || defined(Q_CLANG_QDOC)
+#if QT_CONFIG(cxx17_filesystem) || defined(Q_QDOC)
std::filesystem::path filesystemSymLinkTarget() const
{ return QtPrivate::toFilesystemPath(symLinkTarget()); }
+ std::filesystem::path filesystemReadSymLink() const
+ { return QtPrivate::toFilesystemPath(readSymLink()); }
+
std::filesystem::path filesystemJunctionTarget() const
{ return QtPrivate::toFilesystemPath(junctionTarget()); }
#endif // QT_CONFIG(cxx17_filesystem)
@@ -187,6 +161,12 @@ public:
QDateTime lastRead() const { return fileTime(QFile::FileAccessTime); }
QDateTime fileTime(QFile::FileTime time) const;
+ QDateTime birthTime(const QTimeZone &tz) const { return fileTime(QFile::FileBirthTime, tz); }
+ QDateTime metadataChangeTime(const QTimeZone &tz) const { return fileTime(QFile::FileMetadataChangeTime, tz); }
+ QDateTime lastModified(const QTimeZone &tz) const { return fileTime(QFile::FileModificationTime, tz); }
+ QDateTime lastRead(const QTimeZone &tz) const { return fileTime(QFile::FileAccessTime, tz); }
+ QDateTime fileTime(QFile::FileTime time, const QTimeZone &tz) const;
+
bool caching() const;
void setCaching(bool on);
void stat();
@@ -195,6 +175,8 @@ protected:
QSharedDataPointer<QFileInfoPrivate> d_ptr;
private:
+ friend Q_CORE_EXPORT bool comparesEqual(const QFileInfo &lhs, const QFileInfo &rhs);
+ Q_DECLARE_EQUALITY_COMPARABLE(QFileInfo)
QFileInfoPrivate* d_func();
inline const QFileInfoPrivate* d_func() const
{
@@ -212,6 +194,6 @@ Q_CORE_EXPORT QDebug operator<<(QDebug, const QFileInfo &);
QT_END_NAMESPACE
-Q_DECLARE_METATYPE(QFileInfo)
+QT_DECL_METATYPE_EXTERN(QFileInfo, Q_CORE_EXPORT)
#endif // QFILEINFO_H
diff --git a/src/corelib/io/qfileinfo_p.h b/src/corelib/io/qfileinfo_p.h
index 333ea70adc..4091a7464a 100644
--- a/src/corelib/io/qfileinfo_p.h
+++ b/src/corelib/io/qfileinfo_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QFILEINFO_P_H
#define QFILEINFO_P_H
@@ -91,7 +55,7 @@ public:
: QSharedData(copy),
fileEntry(copy.fileEntry),
metaData(copy.metaData),
- fileEngine(QFileSystemEngine::resolveEntryAndCreateLegacyEngine(fileEntry, metaData)),
+ fileEngine(QFileSystemEngine::createLegacyEngine(fileEntry, metaData)),
cachedFlags(0),
#ifndef QT_NO_FSFILEENGINE
isDefaultConstructed(false),
@@ -101,8 +65,8 @@ public:
cache_enabled(copy.cache_enabled), fileFlags(0), fileSize(0)
{}
inline QFileInfoPrivate(const QString &file)
- : fileEntry(QDir::fromNativeSeparators(file)),
- fileEngine(QFileSystemEngine::resolveEntryAndCreateLegacyEngine(fileEntry, metaData)),
+ : fileEntry(file),
+ fileEngine(QFileSystemEngine::createLegacyEngine(fileEntry, metaData)),
cachedFlags(0),
#ifndef QT_NO_FSFILEENGINE
isDefaultConstructed(file.isEmpty()),
@@ -117,7 +81,7 @@ public:
: QSharedData(),
fileEntry(file),
metaData(data),
- fileEngine(QFileSystemEngine::resolveEntryAndCreateLegacyEngine(fileEntry, metaData)),
+ fileEngine(QFileSystemEngine::createLegacyEngine(fileEntry, metaData)),
cachedFlags(0),
isDefaultConstructed(false),
cache_enabled(true), fileFlags(0), fileSize(0)
@@ -158,7 +122,7 @@ public:
}
uint getFileFlags(QAbstractFileEngine::FileFlags) const;
- QDateTime &getFileTime(QAbstractFileEngine::FileTime) const;
+ QDateTime &getFileTime(QFile::FileTime) const;
QString getFileName(QAbstractFileEngine::FileName) const;
QString getFileOwner(QAbstractFileEngine::FileOwner own) const;
@@ -169,7 +133,7 @@ public:
mutable QString fileNames[QAbstractFileEngine::NFileNames];
mutable QString fileOwners[2]; // QAbstractFileEngine::FileOwner: OwnerUser and OwnerGroup
- mutable QDateTime fileTimes[4]; // QAbstractFileEngine::FileTime: BirthTime, MetadataChangeTime, ModificationTime, AccessTime
+ mutable QDateTime fileTimes[4]; // QFile::FileTime: FileBirthTime, FileMetadataChangeTime, FileModificationTime, FileAccessTime
mutable uint cachedFlags : 30;
bool const isDefaultConstructed : 1; // QFileInfo is a default constructed instance
@@ -182,8 +146,8 @@ public:
{ if (cache_enabled) cachedFlags |= c; }
template <typename Ret, typename FSLambda, typename EngineLambda>
- Ret checkAttribute(Ret defaultValue, QFileSystemMetaData::MetaDataFlags fsFlags, const FSLambda &fsLambda,
- const EngineLambda &engineLambda) const
+ Ret checkAttribute(Ret defaultValue, QFileSystemMetaData::MetaDataFlags fsFlags,
+ FSLambda fsLambda, EngineLambda engineLambda) const
{
if (isDefaultConstructed)
return defaultValue;
@@ -197,10 +161,10 @@ public:
}
template <typename Ret, typename FSLambda, typename EngineLambda>
- Ret checkAttribute(QFileSystemMetaData::MetaDataFlags fsFlags, const FSLambda &fsLambda,
- const EngineLambda &engineLambda) const
+ Ret checkAttribute(QFileSystemMetaData::MetaDataFlags fsFlags, FSLambda fsLambda,
+ EngineLambda engineLambda) const
{
- return checkAttribute(Ret(), fsFlags, fsLambda, engineLambda);
+ return checkAttribute(Ret(), std::move(fsFlags), std::move(fsLambda), engineLambda);
}
};
diff --git a/src/corelib/io/qfileselector.cpp b/src/corelib/io/qfileselector.cpp
index dd6257a885..7f5480c274 100644
--- a/src/corelib/io/qfileselector.cpp
+++ b/src/corelib/io/qfileselector.cpp
@@ -1,42 +1,6 @@
-/***************************************************************************
-**
-** Copyright (C) 2013 BlackBerry Limited. All rights reserved.
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2013 BlackBerry Limited. All rights reserved.
+// Copyright (C) 2016 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qfileselector.h"
#include "qfileselector_p.h"
@@ -52,11 +16,13 @@
QT_BEGIN_NAMESPACE
+using namespace Qt::StringLiterals;
+
//Environment variable to allow tooling full control of file selectors
static const char env_override[] = "QT_NO_BUILTIN_SELECTORS";
Q_GLOBAL_STATIC(QFileSelectorSharedData, sharedData);
-static QBasicMutex sharedDataMutex;
+Q_CONSTINIT static QBasicMutex sharedDataMutex;
QFileSelectorPrivate::QFileSelectorPrivate()
: QObjectPrivate()
@@ -196,9 +162,9 @@ QString QFileSelector::select(const QString &filePath) const
static bool isLocalScheme(const QString &file)
{
- bool local = file == QLatin1String("qrc");
+ bool local = file == "qrc"_L1;
#ifdef Q_OS_ANDROID
- local |= file == QLatin1String("assets");
+ local |= file == "assets"_L1;
#endif
return local;
}
@@ -217,11 +183,11 @@ QUrl QFileSelector::select(const QUrl &filePath) const
return filePath;
QUrl ret(filePath);
if (isLocalScheme(filePath.scheme())) {
- QLatin1String scheme(":");
+ auto scheme = ":"_L1;
#ifdef Q_OS_ANDROID
// use other scheme because ":" means "qrc" here
- if (filePath.scheme() == QLatin1String("assets"))
- scheme = QLatin1String("assets:");
+ if (filePath.scheme() == "assets"_L1)
+ scheme = "assets:"_L1;
#endif
QString equivalentPath = scheme + filePath.path();
@@ -244,19 +210,20 @@ QUrl QFileSelector::select(const QUrl &filePath) const
return ret;
}
-QString QFileSelectorPrivate::selectionHelper(const QString &path, const QString &fileName, const QStringList &selectors, const QChar &indicator)
+QString QFileSelectorPrivate::selectionHelper(const QString &path, const QString &fileName,
+ const QStringList &selectors, QChar indicator)
{
/* selectionHelper does a depth-first search of possible selected files. Because there is strict
selector ordering in the API, we can stop checking as soon as we find the file in a directory
which does not contain any other valid selector directories.
*/
- Q_ASSERT(path.isEmpty() || path.endsWith(QLatin1Char('/')));
+ Q_ASSERT(path.isEmpty() || path.endsWith(u'/'));
for (const QString &s : selectors) {
QString prospectiveBase = path;
if (!indicator.isNull())
prospectiveBase += indicator;
- prospectiveBase += s + QLatin1Char('/');
+ prospectiveBase += s + u'/';
QStringList remainingSelectors = selectors;
remainingSelectors.removeAll(s);
if (!QDir(prospectiveBase).exists())
@@ -328,7 +295,7 @@ void QFileSelectorPrivate::updateSelectors()
QLatin1Char pathSep(',');
QStringList envSelectors = QString::fromLatin1(qgetenv("QT_FILE_SELECTORS"))
.split(pathSep, Qt::SkipEmptyParts);
- if (envSelectors.count())
+ if (envSelectors.size())
sharedData->staticSelectors << envSelectors;
if (!qEnvironmentVariableIsEmpty(env_override))
@@ -356,7 +323,7 @@ QStringList QFileSelectorPrivate::platformSelectors()
ret << QSysInfo::kernelType();
# endif
QString productName = QSysInfo::productType();
- if (productName != QLatin1String("unknown"))
+ if (productName != "unknown"_L1)
ret << productName; // "opensuse", "fedora", "osx", "ios", "android"
#endif
return ret;
diff --git a/src/corelib/io/qfileselector.h b/src/corelib/io/qfileselector.h
index c9c2f564f6..bb840fe083 100644
--- a/src/corelib/io/qfileselector.h
+++ b/src/corelib/io/qfileselector.h
@@ -1,41 +1,5 @@
-/***************************************************************************
-**
-** Copyright (C) 2013 BlackBerry Limited. All rights reserved.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2013 BlackBerry Limited. All rights reserved.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QFILESELECTOR_H
#define QFILESELECTOR_H
diff --git a/src/corelib/io/qfileselector_p.h b/src/corelib/io/qfileselector_p.h
index 024d0b190d..bc0593bca6 100644
--- a/src/corelib/io/qfileselector_p.h
+++ b/src/corelib/io/qfileselector_p.h
@@ -1,41 +1,5 @@
-/***************************************************************************
-**
-** Copyright (C) 2013 BlackBerry Limited. All rights reserved.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2013 BlackBerry Limited. All rights reserved.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QFILESELECTOR_P_H
#define QFILESELECTOR_P_H
@@ -71,7 +35,7 @@ public:
static QStringList platformSelectors();
static void addStatics(const QStringList &); //For loading GUI statics from other Qt modules
static QString selectionHelper(const QString &path, const QString &fileName,
- const QStringList &selectors, const QChar &indicator = QLatin1Char('+'));
+ const QStringList &selectors, QChar indicator = u'+');
QFileSelectorPrivate();
QString select(const QString &filePath) const;
diff --git a/src/corelib/io/qfilesystemengine.cpp b/src/corelib/io/qfilesystemengine.cpp
index f00aba78c3..d8b215816c 100644
--- a/src/corelib/io/qfilesystemengine.cpp
+++ b/src/corelib/io/qfilesystemengine.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qfilesystemengine_p.h"
#include <QtCore/qdir.h>
@@ -61,9 +25,9 @@ QString QFileSystemEngine::slowCanonicalized(const QString &path)
return path;
QFileInfo fi;
- const QChar slash(QLatin1Char('/'));
+ const QChar slash(u'/');
QString tmpPath = path;
- int separatorPos = 0;
+ qsizetype separatorPos = 0;
QSet<QString> nonSymlinks;
QDuplicateTracker<QString> known;
@@ -74,7 +38,7 @@ QString QFileSystemEngine::slowCanonicalized(const QString &path)
if (tmpPath.size() >= 2 && tmpPath.at(0) == slash && tmpPath.at(1) == slash) {
// UNC, skip past the first two elements
separatorPos = tmpPath.indexOf(slash, 2);
- } else if (tmpPath.size() >= 3 && tmpPath.at(1) == QLatin1Char(':') && tmpPath.at(2) == slash) {
+ } else if (tmpPath.size() >= 3 && tmpPath.at(1) == u':' && tmpPath.at(2) == slash) {
// volume root, skip since it can not be a symlink
separatorPos = 2;
}
@@ -119,12 +83,11 @@ static inline bool _q_checkEntry(QFileSystemEntry &entry, QFileSystemMetaData &d
return true;
}
-static inline bool _q_checkEntry(QAbstractFileEngine *&engine, bool resolvingEntry)
+static inline bool _q_checkEntry(std::unique_ptr<QAbstractFileEngine> &engine, bool resolvingEntry)
{
if (resolvingEntry) {
if (!(engine->fileFlags(QAbstractFileEngine::FlagsMask) & QAbstractFileEngine::ExistsFlag)) {
- delete engine;
- engine = nullptr;
+ engine.reset();
return false;
}
}
@@ -132,22 +95,23 @@ static inline bool _q_checkEntry(QAbstractFileEngine *&engine, bool resolvingEnt
return true;
}
-static bool _q_resolveEntryAndCreateLegacyEngine_recursive(QFileSystemEntry &entry, QFileSystemMetaData &data,
- QAbstractFileEngine *&engine, bool resolvingEntry = false)
+static bool _q_createLegacyEngine_recursive(QFileSystemEntry &entry, QFileSystemMetaData &data,
+ std::unique_ptr<QAbstractFileEngine> &engine,
+ bool resolvingEntry = false)
{
QString const &filePath = entry.filePath();
if ((engine = qt_custom_file_engine_handler_create(filePath)))
return _q_checkEntry(engine, resolvingEntry);
#if defined(QT_BUILD_CORE_LIB)
- for (int prefixSeparator = 0; prefixSeparator < filePath.size(); ++prefixSeparator) {
+ for (qsizetype prefixSeparator = 0; prefixSeparator < filePath.size(); ++prefixSeparator) {
QChar const ch = filePath[prefixSeparator];
- if (ch == QLatin1Char('/'))
+ if (ch == u'/')
break;
- if (ch == QLatin1Char(':')) {
+ if (ch == u':') {
if (prefixSeparator == 0) {
- engine = new QResourceFileEngine(filePath);
+ engine = std::make_unique<QResourceFileEngine>(filePath);
return _q_checkEntry(engine, resolvingEntry);
}
@@ -155,10 +119,11 @@ static bool _q_resolveEntryAndCreateLegacyEngine_recursive(QFileSystemEntry &ent
break;
const QStringList &paths = QDir::searchPaths(filePath.left(prefixSeparator));
- for (int i = 0; i < paths.count(); i++) {
- entry = QFileSystemEntry(QDir::cleanPath(paths.at(i) % QLatin1Char('/') % QStringView{filePath}.mid(prefixSeparator + 1)));
+ for (int i = 0; i < paths.size(); i++) {
+ entry = QFileSystemEntry(QDir::cleanPath(
+ paths.at(i) % u'/' % QStringView{filePath}.mid(prefixSeparator + 1)));
// Recurse!
- if (_q_resolveEntryAndCreateLegacyEngine_recursive(entry, data, engine, true))
+ if (_q_createLegacyEngine_recursive(entry, data, engine, true))
return true;
}
@@ -188,12 +153,13 @@ static bool _q_resolveEntryAndCreateLegacyEngine_recursive(QFileSystemEntry &ent
QFileSystemEngine API should be used to query and interact with the file
system object.
*/
-QAbstractFileEngine *QFileSystemEngine::resolveEntryAndCreateLegacyEngine(
- QFileSystemEntry &entry, QFileSystemMetaData &data) {
+std::unique_ptr<QAbstractFileEngine>
+QFileSystemEngine::createLegacyEngine(QFileSystemEntry &entry, QFileSystemMetaData &data)
+{
QFileSystemEntry copy = entry;
- QAbstractFileEngine *engine = nullptr;
+ std::unique_ptr<QAbstractFileEngine> engine;
- if (_q_resolveEntryAndCreateLegacyEngine_recursive(copy, data, engine))
+ if (_q_createLegacyEngine_recursive(copy, data, engine))
// Reset entry to resolved copy.
entry = copy;
else
diff --git a/src/corelib/io/qfilesystemengine_mac.mm b/src/corelib/io/qfilesystemengine_mac.mm
index 02765322f8..e3f567b7a4 100644
--- a/src/corelib/io/qfilesystemengine_mac.mm
+++ b/src/corelib/io/qfilesystemengine_mac.mm
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2019 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2019 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qplatformdefs.h"
#include "qfilesystemengine_p.h"
diff --git a/src/corelib/io/qfilesystemengine_p.h b/src/corelib/io/qfilesystemengine_p.h
index 6fac1ae4be..814915407e 100644
--- a/src/corelib/io/qfilesystemengine_p.h
+++ b/src/corelib/io/qfilesystemengine_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QFILESYSTEMENGINE_P_H
#define QFILESYSTEMENGINE_P_H
@@ -56,6 +20,7 @@
#include "qfilesystemmetadata_p.h"
#include <QtCore/private/qsystemerror_p.h>
+#include <memory>
#include <optional>
QT_BEGIN_NAMESPACE
@@ -103,6 +68,8 @@ public:
}
static QFileSystemEntry getLinkTarget(const QFileSystemEntry &link, QFileSystemMetaData &data);
+ static QFileSystemEntry getRawLinkPath(const QFileSystemEntry &link,
+ QFileSystemMetaData &data);
static QFileSystemEntry getJunctionTarget(const QFileSystemEntry &link, QFileSystemMetaData &data);
static QFileSystemEntry canonicalName(const QFileSystemEntry &entry, QFileSystemMetaData &data);
static QFileSystemEntry absoluteName(const QFileSystemEntry &entry);
@@ -128,7 +95,7 @@ public:
static bool fillMetaData(int fd, QFileSystemMetaData &data); // what = PosixStatFlags
static QByteArray id(int fd);
static bool setFileTime(int fd, const QDateTime &newDate,
- QAbstractFileEngine::FileTime whatTime, QSystemError &error);
+ QFile::FileTime whatTime, QSystemError &error);
static bool setPermissions(int fd, QFile::Permissions permissions, QSystemError &error,
QFileSystemMetaData *data = nullptr);
#endif
@@ -143,7 +110,7 @@ public:
QFileSystemMetaData::MetaDataFlags what);
static QByteArray id(HANDLE fHandle);
static bool setFileTime(HANDLE fHandle, const QDateTime &newDate,
- QAbstractFileEngine::FileTime whatTime, QSystemError &error);
+ QFile::FileTime whatTime, QSystemError &error);
static QString owner(const QFileSystemEntry &entry, QAbstractFileEngine::FileOwner own);
static QString nativeAbsoluteFilePath(const QString &path);
static bool isDirPath(const QString &path, bool *existed);
@@ -170,13 +137,14 @@ public:
// unused, therefore not implemented
static bool setFileTime(const QFileSystemEntry &entry, const QDateTime &newDate,
- QAbstractFileEngine::FileTime whatTime, QSystemError &error);
+ QFile::FileTime whatTime, QSystemError &error);
static bool setCurrentPath(const QFileSystemEntry &entry);
static QFileSystemEntry currentPath();
- static QAbstractFileEngine *resolveEntryAndCreateLegacyEngine(QFileSystemEntry &entry,
- QFileSystemMetaData &data);
+ static std::unique_ptr<QAbstractFileEngine>
+ createLegacyEngine(QFileSystemEntry &entry, QFileSystemMetaData &data);
+
private:
static QString slowCanonicalized(const QString &path);
#if defined(Q_OS_WIN)
diff --git a/src/corelib/io/qfilesystemengine_unix.cpp b/src/corelib/io/qfilesystemengine_unix.cpp
index 6e8229daec..bda2962f8d 100644
--- a/src/corelib/io/qfilesystemengine_unix.cpp
+++ b/src/corelib/io/qfilesystemengine_unix.cpp
@@ -1,63 +1,34 @@
-/****************************************************************************
-**
-** Copyright (C) 2018 Intel Corporation.
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2013 Samuel Gaist <samuel.gaist@edeltech.ch>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2018 Intel Corporation.
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2013 Samuel Gaist <samuel.gaist@edeltech.ch>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qplatformdefs.h"
#include "qfilesystemengine_p.h"
#include "qfile.h"
#include "qstorageinfo.h"
+#include "qurl.h"
#include <QtCore/qoperatingsystemversion.h>
#include <QtCore/private/qcore_unix_p.h>
#include <QtCore/private/qfiledevice_p.h>
+#include <QtCore/private/qfunctions_p.h>
#include <QtCore/qvarlengtharray.h>
#ifndef QT_BOOTSTRAPPED
# include <QtCore/qstandardpaths.h>
+# include <QtCore/private/qtemporaryfile_p.h>
#endif // QT_BOOTSTRAPPED
+#include <grp.h>
#include <pwd.h>
#include <stdlib.h> // for realpath()
#include <unistd.h>
#include <stdio.h>
#include <errno.h>
+#include <chrono>
+#include <memory> // for std::unique_ptr
+
#if __has_include(<paths.h>)
# include <paths.h>
#endif
@@ -65,9 +36,14 @@
# define _PATH_TMP "/tmp"
#endif
-#if defined(Q_OS_MAC)
+#if defined(Q_OS_DARWIN)
# include <QtCore/private/qcore_mac_p.h>
# include <CoreFoundation/CFBundle.h>
+# include <UniformTypeIdentifiers/UTType.h>
+# include <UniformTypeIdentifiers/UTCoreTypes.h>
+# include <Foundation/Foundation.h>
+# include <sys/clonefile.h>
+# include <copyfile.h>
#endif
#ifdef Q_OS_MACOS
@@ -78,15 +54,6 @@
#include <MobileCoreServices/MobileCoreServices.h>
#endif
-#if defined(Q_OS_DARWIN)
-# include <sys/clonefile.h>
-# include <copyfile.h>
-// We cannot include <Foundation/Foundation.h> (it's an Objective-C header), but
-// we need these declarations:
-Q_FORWARD_DECLARE_OBJC_CLASS(NSString);
-extern "C" NSString *NSTemporaryDirectory();
-#endif
-
#if defined(Q_OS_LINUX)
# include <sys/ioctl.h>
# include <sys/sendfile.h>
@@ -111,6 +78,8 @@ struct statx { mode_t stx_mode; }; // dummy
QT_BEGIN_NAMESPACE
+using namespace Qt::StringLiterals;
+
enum {
#ifdef Q_OS_ANDROID
// On Android, the link(2) system call has been observed to always fail
@@ -154,10 +123,9 @@ static bool isPackage(const QFileSystemMetaData &data, const QFileSystemEntry &e
QString suffix = info.suffix();
if (suffix.length() > 0) {
- // First step: is the extension known ?
- QCFType<CFStringRef> extensionRef = suffix.toCFString();
- QCFType<CFStringRef> uniformTypeIdentifier = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, extensionRef, NULL);
- if (UTTypeConformsTo(uniformTypeIdentifier, kUTTypeBundle))
+ // First step: is it a bundle?
+ const auto *utType = [UTType typeWithFilenameExtension:suffix.toNSString()];
+ if ([utType conformsToType:UTTypeBundle])
return true;
// Second step: check if an application knows the package type
@@ -178,7 +146,7 @@ static bool isPackage(const QFileSystemMetaData &data, const QFileSystemEntry &e
QCFType<CFBundleRef> bundle = CFBundleCreate(kCFAllocatorDefault, application);
CFStringRef identifier = CFBundleGetIdentifier(bundle);
QString applicationId = QString::fromCFString(identifier);
- if (applicationId != QLatin1String("com.apple.finder"))
+ if (applicationId != "com.apple.finder"_L1)
return true;
}
#endif
@@ -191,51 +159,39 @@ static bool isPackage(const QFileSystemMetaData &data, const QFileSystemEntry &e
namespace {
namespace GetFileTimes {
-#if !QT_CONFIG(futimens) && (QT_CONFIG(futimes))
-template <typename T>
-static inline typename std::enable_if_t<(&T::st_atim, &T::st_mtim, true)> get(const T *p, struct timeval *access, struct timeval *modification)
+qint64 time_t_toMsecs(time_t t)
{
- access->tv_sec = p->st_atim.tv_sec;
- access->tv_usec = p->st_atim.tv_nsec / 1000;
-
- modification->tv_sec = p->st_mtim.tv_sec;
- modification->tv_usec = p->st_mtim.tv_nsec / 1000;
+ using namespace std::chrono;
+ return milliseconds{seconds{t}}.count();
}
-template <typename T>
-static inline typename std::enable_if_t<(&T::st_atimespec, &T::st_mtimespec, true)> get(const T *p, struct timeval *access, struct timeval *modification)
+// fallback set
+[[maybe_unused]] qint64 atime(const QT_STATBUF &statBuffer, ulong)
{
- access->tv_sec = p->st_atimespec.tv_sec;
- access->tv_usec = p->st_atimespec.tv_nsec / 1000;
-
- modification->tv_sec = p->st_mtimespec.tv_sec;
- modification->tv_usec = p->st_mtimespec.tv_nsec / 1000;
+ return time_t_toMsecs(statBuffer.st_atime);
}
-
-# ifndef st_atimensec
-// if "st_atimensec" is defined, this would expand to invalid C++
-template <typename T>
-static inline typename std::enable_if_t<(&T::st_atimensec, &T::st_mtimensec, true)> get(const T *p, struct timeval *access, struct timeval *modification)
+[[maybe_unused]] qint64 birthtime(const QT_STATBUF &, ulong)
{
- access->tv_sec = p->st_atime;
- access->tv_usec = p->st_atimensec / 1000;
-
- modification->tv_sec = p->st_mtime;
- modification->tv_usec = p->st_mtimensec / 1000;
+ return Q_INT64_C(0);
}
-# endif
-#endif
-
-qint64 timespecToMSecs(const timespec &spec)
+[[maybe_unused]] qint64 ctime(const QT_STATBUF &statBuffer, ulong)
{
- return (qint64(spec.tv_sec) * 1000) + (spec.tv_nsec / 1000000);
+ return time_t_toMsecs(statBuffer.st_ctime);
+}
+[[maybe_unused]] qint64 mtime(const QT_STATBUF &statBuffer, ulong)
+{
+ return time_t_toMsecs(statBuffer.st_mtime);
}
-// fallback set
-[[maybe_unused]] qint64 atime(const QT_STATBUF &statBuffer, ulong) { return qint64(statBuffer.st_atime) * 1000; }
-[[maybe_unused]] qint64 birthtime(const QT_STATBUF &, ulong) { return Q_INT64_C(0); }
-[[maybe_unused]] qint64 ctime(const QT_STATBUF &statBuffer, ulong) { return qint64(statBuffer.st_ctime) * 1000; }
-[[maybe_unused]] qint64 mtime(const QT_STATBUF &statBuffer, ulong) { return qint64(statBuffer.st_mtime) * 1000; }
+// T is either a stat.timespec or statx.statx_timestamp,
+// both have tv_sec and tv_nsec members
+template<typename T>
+qint64 timespecToMSecs(const T &spec)
+{
+ using namespace std::chrono;
+ const nanoseconds nsecs = seconds{spec.tv_sec} + nanoseconds{spec.tv_nsec};
+ return duration_cast<milliseconds>(nsecs).count();
+}
// Xtim, POSIX.1-2008
template <typename T>
@@ -370,17 +326,12 @@ inline void QFileSystemMetaData::fillFromStatxBuf(const struct statx &statxBuffe
size_ = qint64(statxBuffer.stx_size);
// Times
- auto toMSecs = [](struct statx_timestamp ts)
- {
- return qint64(ts.tv_sec) * 1000 + (ts.tv_nsec / 1000000);
- };
- accessTime_ = toMSecs(statxBuffer.stx_atime);
- metadataChangeTime_ = toMSecs(statxBuffer.stx_ctime);
- modificationTime_ = toMSecs(statxBuffer.stx_mtime);
- if (statxBuffer.stx_mask & STATX_BTIME)
- birthTime_ = toMSecs(statxBuffer.stx_btime);
- else
- birthTime_ = 0;
+ using namespace GetFileTimes;
+ accessTime_ = timespecToMSecs(statxBuffer.stx_atime);
+ metadataChangeTime_ = timespecToMSecs(statxBuffer.stx_ctime);
+ modificationTime_ = timespecToMSecs(statxBuffer.stx_mtime);
+ const bool birthMask = statxBuffer.stx_mask & STATX_BTIME;
+ birthTime_ = birthMask ? timespecToMSecs(statxBuffer.stx_btime) : 0;
userId_ = statxBuffer.stx_uid;
groupId_ = statxBuffer.stx_gid;
@@ -623,7 +574,7 @@ QFileSystemEntry QFileSystemEngine::getLinkTarget(const QFileSystemEntry &link,
Q_CHECK_FILE_NAME(link, link);
QByteArray s = qt_readlink(link.nativeFilePath().constData());
- if (s.length() > 0) {
+ if (s.size() > 0) {
QString ret;
if (!data.hasFlags(QFileSystemMetaData::DirectoryType))
fillMetaData(link, data, QFileSystemMetaData::DirectoryType);
@@ -631,15 +582,15 @@ QFileSystemEntry QFileSystemEngine::getLinkTarget(const QFileSystemEntry &link,
QDir parent(link.filePath());
parent.cdUp();
ret = parent.path();
- if (!ret.isEmpty() && !ret.endsWith(QLatin1Char('/')))
- ret += QLatin1Char('/');
+ if (!ret.isEmpty() && !ret.endsWith(u'/'))
+ ret += u'/';
}
ret += QFile::decodeName(s);
- if (!ret.startsWith(QLatin1Char('/')))
- ret.prepend(absoluteName(link).path() + QLatin1Char('/'));
+ if (!ret.startsWith(u'/'))
+ ret.prepend(absoluteName(link).path() + u'/');
ret = QDir::cleanPath(ret);
- if (ret.size() > 1 && ret.endsWith(QLatin1Char('/')))
+ if (ret.size() > 1 && ret.endsWith(u'/'))
ret.chop(1);
return QFileSystemEntry(ret);
}
@@ -677,45 +628,60 @@ QFileSystemEntry QFileSystemEngine::getLinkTarget(const QFileSystemEntry &link,
}
//static
+QFileSystemEntry QFileSystemEngine::getRawLinkPath(const QFileSystemEntry &link,
+ QFileSystemMetaData &data)
+{
+ Q_UNUSED(data)
+ const QByteArray path = qt_readlink(link.nativeFilePath().constData());
+ const QString ret = QFile::decodeName(path);
+ return QFileSystemEntry(ret);
+}
+
+//static
QFileSystemEntry QFileSystemEngine::canonicalName(const QFileSystemEntry &entry, QFileSystemMetaData &data)
{
Q_CHECK_FILE_NAME(entry, entry);
-#if !defined(Q_OS_MAC) && !defined(Q_OS_QNX) && !defined(Q_OS_ANDROID) && !defined(Q_OS_HAIKU) && _POSIX_VERSION < 200809L
+#if !defined(Q_OS_DARWIN) && !defined(Q_OS_QNX) && !defined(Q_OS_ANDROID) && !defined(Q_OS_HAIKU) && _POSIX_VERSION < 200809L
// realpath(X,0) is not supported
Q_UNUSED(data);
return QFileSystemEntry(slowCanonicalized(absoluteName(entry).filePath()));
#else
- char stack_result[PATH_MAX+1];
- char *resolved_name = nullptr;
+# if defined(Q_OS_DARWIN) || defined(Q_OS_ANDROID) || _POSIX_VERSION < 200801L
+ // used to store the result of realpath in case where realpath cannot allocate itself
+ char stack_result[PATH_MAX + 1];
+#else
+ // enables unconditionally passing stack_result below
+ std::nullptr_t stack_result = nullptr;
+# endif
+ auto resolved_path_deleter = [&](char *ptr) {
+ // frees resolved_name if it was allocated by realpath
+# if defined(Q_OS_DARWIN) || defined(Q_OS_ANDROID) || _POSIX_VERSION < 200801L
+ // ptr is either null, or points to stack_result
+ Q_ASSERT(!ptr || ptr == stack_result);
+ return;
+#else
+ free(ptr);
+# endif
+ };
+ std::unique_ptr<char, decltype (resolved_path_deleter)> resolved_name {nullptr, resolved_path_deleter};
# if defined(Q_OS_DARWIN) || defined(Q_OS_ANDROID)
// On some Android and macOS versions, realpath() will return a path even if
// it does not exist. To work around this, we check existence in advance.
if (!data.hasFlags(QFileSystemMetaData::ExistsAttribute))
fillMetaData(entry, data, QFileSystemMetaData::ExistsAttribute);
- if (!data.exists()) {
+ if (!data.exists())
errno = ENOENT;
- } else {
- resolved_name = stack_result;
- }
- if (resolved_name && realpath(entry.nativeFilePath().constData(), resolved_name) == nullptr)
- resolved_name = nullptr;
+ else
+ resolved_name.reset(realpath(entry.nativeFilePath().constData(), stack_result));
# else
-# if _POSIX_VERSION >= 200801L // ask realpath to allocate memory
- resolved_name = realpath(entry.nativeFilePath().constData(), nullptr);
-# else
- resolved_name = stack_result;
- if (realpath(entry.nativeFilePath().constData(), resolved_name) == nullptr)
- resolved_name = nullptr;
-# endif
+ resolved_name.reset(realpath(entry.nativeFilePath().constData(), stack_result));
# endif
if (resolved_name) {
data.knownFlagsMask |= QFileSystemMetaData::ExistsAttribute;
data.entryFlags |= QFileSystemMetaData::ExistsAttribute;
- QString canonicalPath = QDir::cleanPath(QFile::decodeName(resolved_name));
- if (resolved_name != stack_result)
- free(resolved_name);
+ QString canonicalPath = QDir::cleanPath(QFile::decodeName(resolved_name.get()));
return QFileSystemEntry(canonicalPath);
} else if (errno == ENOENT || errno == ENOTDIR) { // file doesn't exist
data.knownFlagsMask |= QFileSystemMetaData::ExistsAttribute;
@@ -740,13 +706,13 @@ QFileSystemEntry QFileSystemEngine::absoluteName(const QFileSystemEntry &entry)
QFileSystemEntry cur(currentPath());
result = cur.nativeFilePath();
}
- if (!orig.isEmpty() && !(orig.length() == 1 && orig[0] == '.')) {
+ if (!orig.isEmpty() && !(orig.size() == 1 && orig[0] == '.')) {
if (!result.isEmpty() && !result.endsWith('/'))
result.append('/');
result.append(orig);
}
- if (result.length() == 1 && result[0] == '/')
+ if (result.size() == 1 && result[0] == '/')
return QFileSystemEntry(result, QFileSystemEntry::FromNativePath());
const bool isDir = result.endsWith('/');
@@ -757,7 +723,7 @@ QFileSystemEntry QFileSystemEngine::absoluteName(const QFileSystemEntry &entry)
QFileSystemEntry resultingEntry(result, QFileSystemEntry::FromNativePath());
QString stringVersion = QDir::cleanPath(resultingEntry.filePath());
if (isDir)
- stringVersion.append(QLatin1Char('/'));
+ stringVersion.append(u'/');
return QFileSystemEntry(stringVersion);
}
@@ -796,7 +762,7 @@ QByteArray QFileSystemEngine::id(int fd)
QString QFileSystemEngine::resolveUserName(uint userId)
{
#if QT_CONFIG(thread) && defined(_POSIX_THREAD_SAFE_FUNCTIONS) && !defined(Q_OS_OPENBSD)
- int size_max = sysconf(_SC_GETPW_R_SIZE_MAX);
+ long size_max = sysconf(_SC_GETPW_R_SIZE_MAX);
if (size_max == -1)
size_max = 1024;
QVarLengthArray<char, 1024> buf(size_max);
@@ -822,7 +788,7 @@ QString QFileSystemEngine::resolveUserName(uint userId)
QString QFileSystemEngine::resolveGroupName(uint groupId)
{
#if QT_CONFIG(thread) && defined(_POSIX_THREAD_SAFE_FUNCTIONS) && !defined(Q_OS_OPENBSD)
- int size_max = sysconf(_SC_GETPW_R_SIZE_MAX);
+ long size_max = sysconf(_SC_GETPW_R_SIZE_MAX);
if (size_max == -1)
size_max = 1024;
QVarLengthArray<char, 1024> buf(size_max);
@@ -838,7 +804,7 @@ QString QFileSystemEngine::resolveGroupName(uint groupId)
struct group entry;
// Some large systems have more members than the POSIX max size
// Loop over by doubling the buffer size (upper limit 250k)
- for (unsigned size = size_max; size < 256000; size += size)
+ for (long size = size_max; size < 256000; size += size)
{
buf.resize(size);
// ERANGE indicates that the buffer was too small
@@ -851,7 +817,7 @@ QString QFileSystemEngine::resolveGroupName(uint groupId)
#endif
if (gr)
return QFile::decodeName(QByteArray(gr->gr_name));
-#else // Integrity || WASM
+#else // Integrity || WASM || VxWorks
Q_UNUSED(groupId);
#endif
return QString();
@@ -884,6 +850,8 @@ bool QFileSystemEngine::fillMetaData(const QFileSystemEntry &entry, QFileSystemM
if (!data.hasFlags(QFileSystemMetaData::DirectoryType))
what |= QFileSystemMetaData::DirectoryType;
}
+ if (what & QFileSystemMetaData::AliasType)
+ what |= QFileSystemMetaData::LinkType;
#endif
#ifdef UF_HIDDEN
if (what & QFileSystemMetaData::HiddenAttribute) {
@@ -1019,8 +987,11 @@ bool QFileSystemEngine::fillMetaData(const QFileSystemEntry &entry, QFileSystemM
#if defined(Q_OS_DARWIN)
if (what & QFileSystemMetaData::AliasType) {
- if (entryErrno == 0 && hasResourcePropertyFlag(data, entry, kCFURLIsAliasFileKey))
- data.entryFlags |= QFileSystemMetaData::AliasType;
+ if (entryErrno == 0 && hasResourcePropertyFlag(data, entry, kCFURLIsAliasFileKey)) {
+ // kCFURLIsAliasFileKey includes symbolic links, so filter those out
+ if (!(data.entryFlags & QFileSystemMetaData::LinkType))
+ data.entryFlags |= QFileSystemMetaData::AliasType;
+ }
data.knownFlagsMask |= QFileSystemMetaData::AliasType;
}
@@ -1035,7 +1006,7 @@ bool QFileSystemEngine::fillMetaData(const QFileSystemEntry &entry, QFileSystemM
if (what & QFileSystemMetaData::HiddenAttribute
&& !data.isHidden()) {
QString fileName = entry.fileName();
- if ((fileName.size() > 0 && fileName.at(0) == QLatin1Char('.'))
+ if (fileName.startsWith(u'.')
#if defined(Q_OS_DARWIN)
|| (entryErrno == 0 && hasResourcePropertyFlag(data, entry, kCFURLIsHiddenKey))
#endif
@@ -1131,7 +1102,7 @@ static bool createDirectoryWithParents(const QByteArray &nativeName, mode_t mode
return false;
// mkdir failed because the parent dir doesn't exist, so try to create it
- int slash = nativeName.lastIndexOf('/');
+ qsizetype slash = nativeName.lastIndexOf('/');
if (slash < 1)
return false;
@@ -1149,22 +1120,21 @@ static bool createDirectoryWithParents(const QByteArray &nativeName, mode_t mode
bool QFileSystemEngine::createDirectory(const QFileSystemEntry &entry, bool createParents,
std::optional<QFile::Permissions> permissions)
{
- QString dirName = entry.filePath();
+ QByteArray dirName = entry.nativeFilePath();
Q_CHECK_FILE_NAME(dirName, false);
// Darwin doesn't support trailing /'s, so remove for everyone
- while (dirName.size() > 1 && dirName.endsWith(QLatin1Char('/')))
+ while (dirName.size() > 1 && dirName.endsWith(u'/'))
dirName.chop(1);
// try to mkdir this directory
- QByteArray nativeName = QFile::encodeName(dirName);
mode_t mode = permissions ? QtPrivate::toMode_t(*permissions) : 0777;
- if (QT_MKDIR(nativeName, mode) == 0)
+ if (QT_MKDIR(dirName, mode) == 0)
return true;
if (!createParents)
return false;
- return createDirectoryWithParents(nativeName, mode, false);
+ return createDirectoryWithParents(dirName, mode, false);
}
//static
@@ -1174,7 +1144,7 @@ bool QFileSystemEngine::removeDirectory(const QFileSystemEntry &entry, bool remo
if (removeEmptyParents) {
QString dirName = QDir::cleanPath(entry.filePath());
- for (int oldslash = 0, slash=dirName.length(); slash > 0; oldslash = slash) {
+ for (qsizetype oldslash = 0, slash=dirName.size(); slash > 0; oldslash = slash) {
const QByteArray chunk = QFile::encodeName(dirName.left(slash));
QT_STATBUF st;
if (QT_STAT(chunk.constData(), &st) != -1) {
@@ -1204,42 +1174,169 @@ bool QFileSystemEngine::createLink(const QFileSystemEntry &source, const QFileSy
return false;
}
-#ifndef Q_OS_DARWIN
+#ifdef Q_OS_DARWIN
+// see qfilesystemengine_mac.mm
+#elif defined(QT_BOOTSTRAPPED) || !defined(AT_FDCWD)
+// bootstrapped tools don't need this, and we don't want QStorageInfo
+//static
+bool QFileSystemEngine::moveFileToTrash(const QFileSystemEntry &, QFileSystemEntry &,
+ QSystemError &error)
+{
+ error = QSystemError(ENOSYS, QSystemError::StandardLibraryError);
+ return false;
+}
+#else
/*
Implementing as per https://specifications.freedesktop.org/trash-spec/trashspec-1.0.html
*/
-// bootstrapped tools don't need this, and we don't want QStorageInfo
-#ifndef QT_BOOTSTRAPPED
-static QString freeDesktopTrashLocation(const QString &sourcePath)
+namespace {
+struct FreeDesktopTrashOperation
{
- auto makeTrashDir = [](const QDir &topDir, const QString &trashDir) -> QString {
- auto ownerPerms = QFileDevice::ReadOwner
- | QFileDevice::WriteOwner
- | QFileDevice::ExeOwner;
- QString targetDir = topDir.filePath(trashDir);
- // deliberately not using mkpath, since we want to fail if topDir doesn't exist
- if (topDir.mkdir(trashDir))
- QFile::setPermissions(targetDir, ownerPerms);
- if (QFileInfo(targetDir).isDir())
- return targetDir;
- return QString();
- };
- auto isSticky = [](const QFileInfo &fileInfo) -> bool {
- struct stat st;
- if (stat(QFile::encodeName(fileInfo.absoluteFilePath()).constData(), &st) == 0)
- return st.st_mode & S_ISVTX;
+ /*
+ "A trash directory contains two subdirectories, named info and files."
+ */
+ QString trashPath;
+ int filesDirFd = -1;
+ int infoDirFd = -1;
+ qsizetype volumePrefixLength = 0;
- return false;
- };
+ // relative file paths to the filesDirFd and infoDirFd from above
+ QByteArray tempTrashFileName;
+ QByteArray infoFilePath;
+
+ int infoFileFd = -1; // if we've already opened it
+ ~FreeDesktopTrashOperation()
+ {
+ close();
+ }
+
+ constexpr bool isTrashDirOpen() const { return filesDirFd != -1 && infoDirFd != -1; }
+
+ void close()
+ {
+ int savedErrno = errno;
+ if (infoFileFd != -1) {
+ Q_ASSERT(infoDirFd != -1);
+ Q_ASSERT(!infoFilePath.isEmpty());
+ Q_ASSERT(!trashPath.isEmpty());
+
+ QT_CLOSE(infoFileFd);
+ unlinkat(infoDirFd, infoFilePath, 0);
+ infoFileFd = -1;
+ }
+ if (!tempTrashFileName.isEmpty()) {
+ Q_ASSERT(filesDirFd != -1);
+ unlinkat(filesDirFd, tempTrashFileName, 0);
+ }
+ if (filesDirFd >= 0)
+ QT_CLOSE(filesDirFd);
+ if (infoDirFd >= 0)
+ QT_CLOSE(infoDirFd);
+ filesDirFd = infoDirFd = -1;
+ errno = savedErrno;
+ }
+
+ bool tryCreateInfoFile(const QString &filePath, QSystemError &error)
+ {
+ QByteArray p = QFile::encodeName(filePath) + ".trashinfo";
+ infoFileFd = qt_safe_openat(infoDirFd, p, QT_OPEN_RDWR | QT_OPEN_CREAT | QT_OPEN_EXCL, 0666);
+ if (infoFileFd < 0) {
+ error = QSystemError(errno, QSystemError::StandardLibraryError);
+ return false;
+ }
+ infoFilePath = std::move(p);
+ return true;
+ }
+
+ void commit()
+ {
+ QT_CLOSE(infoFileFd);
+ infoFileFd = -1;
+ tempTrashFileName = {};
+ }
+
+ // opens a directory and returns the file descriptor
+ static int openDirFd(int dfd, const char *path, int mode = 0)
+ {
+ mode |= QT_OPEN_RDONLY | O_NOFOLLOW | O_DIRECTORY;
+ return qt_safe_openat(dfd, path, mode);
+ }
+
+ // opens an XDG Trash directory that is a subdirectory of dfd, creating if necessary
+ static int openOrCreateDir(int dfd, const char *path)
+ {
+ // try to open it as a dir, first
+ int fd = openDirFd(dfd, path);
+ if (fd >= 0 || errno != ENOENT)
+ return fd;
+
+ // try to mkdirat
+ if (mkdirat(dfd, path, 0700) < 0)
+ return -1;
+
+ // try to open it again
+ return openDirFd(dfd, path);
+ }
+
+ // opens or makes the XDG Trash hierarchy on parentfd (may be -1) called targetDir
+ bool getTrashDir(int parentfd, QString targetDir, const QFileSystemEntry &source,
+ QSystemError &error)
+ {
+ if (parentfd == AT_FDCWD)
+ trashPath = targetDir;
+ QByteArray nativePath = QFile::encodeName(targetDir);
+
+ // open the directory
+ int trashfd = openOrCreateDir(parentfd, nativePath);
+ if (trashfd < 0 && errno != ENOENT) {
+ error = QSystemError(errno, QSystemError::StandardLibraryError);
+ return false;
+ }
- QString trash;
- const QStorageInfo sourceStorage(sourcePath);
- const QStorageInfo homeStorage(QDir::home());
- // We support trashing of files outside the users home partition
- if (sourceStorage != homeStorage) {
- const QLatin1String dotTrash(".Trash");
- QDir topDir(sourceStorage.rootPath());
+ // check if it is ours (even if we've just mkdirat'ed it)
+ if (QT_STATBUF st; QT_FSTAT(trashfd, &st) < 0) {
+ error = QSystemError(errno, QSystemError::StandardLibraryError);
+ return false;
+ } else if (st.st_uid != getuid()) {
+ error = QSystemError(EPERM, QSystemError::StandardLibraryError);
+ return false;
+ }
+
+ filesDirFd = openOrCreateDir(trashfd, "files");
+ if (filesDirFd >= 0) {
+ // try to link our file-to-be-trashed here
+ QTemporaryFileName tfn("XXXXXX"_L1);
+ for (int i = 0; i < 16; ++i) {
+ QByteArray attempt = tfn.generateNext();
+ if (linkat(AT_FDCWD, source.nativeFilePath(), filesDirFd, attempt, 0) == 0) {
+ tempTrashFileName = std::move(attempt);
+ break;
+ }
+ if (errno != EEXIST)
+ break;
+ }
+
+ // man 2 link on Linux has:
+ // EPERM The filesystem containing oldpath and newpath does not
+ // support the creation of hard links.
+ // EPERM oldpath is a directory.
+ // EPERM oldpath is marked immutable or append‐only.
+ // EMLINK The file referred to by oldpath already has the maximum
+ // number of links to it.
+ if (!tempTrashFileName.isEmpty() || errno == EPERM || errno == EMLINK)
+ infoDirFd = openOrCreateDir(trashfd, "info");
+ }
+ error = QSystemError(errno, QSystemError::StandardLibraryError);
+ if (infoDirFd < 0)
+ close();
+ QT_CLOSE(trashfd);
+ return infoDirFd >= 0;
+ }
+
+ bool openMountPointTrashLocation(const QFileSystemEntry &source,
+ const QStorageInfo &sourceStorage, QSystemError &error)
+ {
/*
Method 1:
"An administrator can create an $topdir/.Trash directory. The permissions on this
@@ -1250,21 +1347,31 @@ static QString freeDesktopTrashLocation(const QString &sourcePath)
(if it supports trashing in top directories) MUST check for the presence
of $topdir/.Trash."
*/
- const QString userID = QString::number(::getuid());
- if (topDir.cd(dotTrash)) {
- const QFileInfo trashInfo(topDir.path());
- // we MUST check that the sticky bit is set, and that it is not a symlink
- if (trashInfo.isSymLink()) {
+ const auto dotTrash = "/.Trash"_L1;
+ const QString userID = QString::number(::getuid());
+ QFileSystemEntry dotTrashDir(sourceStorage.rootPath() + dotTrash);
+
+ // we MUST check that the sticky bit is set, and that it is not a symlink
+ int genericTrashFd = openDirFd(AT_FDCWD, dotTrashDir.nativeFilePath());
+ QT_STATBUF st = {};
+ if (genericTrashFd < 0 && errno != ENOENT && errno != EACCES) {
+ // O_DIRECTORY + O_NOFOLLOW produces ENOTDIR on Linux
+ if (QT_LSTAT(dotTrashDir.nativeFilePath(), &st) == 0 && S_ISLNK(st.st_mode)) {
// we SHOULD report the failed check to the administrator
qCritical("Warning: '%s' is a symlink to '%s'",
- trashInfo.absoluteFilePath().toLocal8Bit().constData(),
- trashInfo.symLinkTarget().toLatin1().constData());
- } else if (!isSticky(trashInfo)) {
+ dotTrashDir.nativeFilePath().constData(),
+ qt_readlink(dotTrashDir.nativeFilePath()).constData());
+ error = QSystemError(ELOOP, QSystemError::StandardLibraryError);
+ }
+ } else if (genericTrashFd >= 0) {
+ QT_FSTAT(genericTrashFd, &st);
+ if ((st.st_mode & S_ISVTX) == 0) {
// we SHOULD report the failed check to the administrator
qCritical("Warning: '%s' doesn't have sticky bit set!",
- trashInfo.absoluteFilePath().toLocal8Bit().constData());
- } else if (trashInfo.isDir()) {
+ dotTrashDir.nativeFilePath().constData());
+ error = QSystemError(EPERM, QSystemError::StandardLibraryError);
+ } else {
/*
"If the directory exists and passes the checks, a subdirectory of the
$topdir/.Trash directory is to be used as the user's trash directory
@@ -1274,9 +1381,14 @@ static QString freeDesktopTrashLocation(const QString &sourcePath)
the implementation MUST immediately create it, without any warnings or
delays for the user."
*/
- trash = makeTrashDir(topDir, userID);
+ if (getTrashDir(genericTrashFd, userID, source, error)) {
+ // recreate the resulting path
+ trashPath = dotTrashDir.filePath() + u'/' + userID;
+ }
}
+ QT_CLOSE(genericTrashFd);
}
+
/*
Method 2:
"If an $topdir/.Trash directory is absent, an $topdir/.Trash-$uid directory is to be
@@ -1284,138 +1396,146 @@ static QString freeDesktopTrashLocation(const QString &sourcePath)
file, if an $topdir/.Trash-$uid directory does not exist, the implementation MUST
immediately create it, without any warnings or delays for the user."
*/
- if (trash.isEmpty()) {
- topDir = QDir(sourceStorage.rootPath());
- const QString userTrashDir = dotTrash + QLatin1Char('-') + userID;
- trash = makeTrashDir(topDir, userTrashDir);
+ if (!isTrashDirOpen())
+ getTrashDir(AT_FDCWD, sourceStorage.rootPath() + dotTrash + u'-' + userID, source, error);
+
+ if (isTrashDirOpen()) {
+ volumePrefixLength = sourceStorage.rootPath().size();
+ if (volumePrefixLength == 1)
+ volumePrefixLength = 0; // isRoot
+ else
+ ++volumePrefixLength; // to include the slash
}
+ return isTrashDirOpen();
}
- /*
- "If both (1) and (2) fail [...], the implementation MUST either trash the
- file into the user's “home trash” or refuse to trash it."
-
- We trash the file into the user's home trash.
- "Its name and location are $XDG_DATA_HOME/Trash"; $XDG_DATA_HOME is what
- QStandardPaths returns for GenericDataLocation. If that doesn't exist, then
- we are not running on a freedesktop.org-compliant environment, and give up.
- */
- if (trash.isEmpty()) {
- QDir topDir = QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation);
- trash = makeTrashDir(topDir, QLatin1String("Trash"));
- if (!QFileInfo(trash).isDir()) {
- qWarning("Unable to establish trash directory in %s",
- topDir.path().toLocal8Bit().constData());
- }
+ bool openHomeTrashLocation(const QFileSystemEntry &source, QSystemError &error)
+ {
+ QString topDir = QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation);
+ return getTrashDir(AT_FDCWD, topDir + "/Trash"_L1, source, error);
}
- return trash;
-}
-#endif // QT_BOOTSTRAPPED
+ bool findTrashFor(const QFileSystemEntry &source, QSystemError &error)
+ {
+ /*
+ First, try the standard Trash in $XDG_DATA_DIRS:
+ "Its name and location are $XDG_DATA_HOME/Trash"; $XDG_DATA_HOME is what
+ QStandardPaths returns for GenericDataLocation. If that doesn't exist, then
+ we are not running on a freedesktop.org-compliant environment, and give up.
+ */
+ if (openHomeTrashLocation(source, error))
+ return true;
+ if (error.errorCode != EXDEV)
+ return false;
+
+ // didn't work, try to find the trash outside the home filesystem
+ const QStorageInfo sourceStorage(source.filePath());
+ if (!sourceStorage.isValid())
+ return false;
+ return openMountPointTrashLocation(source, sourceStorage, error);
+ }
+};
+} // unnamed namespace
//static
bool QFileSystemEngine::moveFileToTrash(const QFileSystemEntry &source,
QFileSystemEntry &newLocation, QSystemError &error)
{
-#ifdef QT_BOOTSTRAPPED
- Q_UNUSED(source);
- Q_UNUSED(newLocation);
- error = QSystemError(ENOSYS, QSystemError::StandardLibraryError);
- return false;
-#else
- const QFileInfo sourceInfo(source.filePath());
- if (!sourceInfo.exists()) {
- error = QSystemError(ENOENT, QSystemError::StandardLibraryError);
+ const QFileSystemEntry sourcePath = [&] {
+ if (QString path = source.filePath(); path.size() > 1 && path.endsWith(u'/')) {
+ path.chop(1);
+ return absoluteName(QFileSystemEntry(path));
+ }
+ return absoluteName(source);
+ }();
+ FreeDesktopTrashOperation op;
+ if (!op.findTrashFor(sourcePath, error))
return false;
- }
- const QString sourcePath = sourceInfo.absoluteFilePath();
- QDir trashDir(freeDesktopTrashLocation(sourcePath));
- if (!trashDir.exists())
- return false;
- /*
- "A trash directory contains two subdirectories, named info and files."
- */
- const QLatin1String filesDir("files");
- const QLatin1String infoDir("info");
- trashDir.mkdir(filesDir);
- int savedErrno = errno;
- trashDir.mkdir(infoDir);
- if (!savedErrno)
- savedErrno = errno;
- if (!trashDir.exists(filesDir) || !trashDir.exists(infoDir)) {
- error = QSystemError(savedErrno, QSystemError::StandardLibraryError);
- return false;
- }
/*
"The $trash/files directory contains the files and directories that were trashed.
The names of files in this directory are to be determined by the implementation;
the only limitation is that they must be unique within the directory. Even if a
file with the same name and location gets trashed many times, each subsequent
trashing must not overwrite a previous copy."
- */
- const QString trashedName = sourceInfo.isDir()
- ? QDir(sourcePath).dirName()
- : sourceInfo.fileName();
- QString uniqueTrashedName = QLatin1Char('/') + trashedName;
- QString infoFileName;
- int counter = 0;
- QFile infoFile;
- auto makeUniqueTrashedName = [trashedName, &counter]() -> QString {
- ++counter;
- return QString(QLatin1String("/%1-%2"))
- .arg(trashedName)
- .arg(counter, 4, 10, QLatin1Char('0'));
- };
- do {
- while (QFile::exists(trashDir.filePath(filesDir) + uniqueTrashedName))
- uniqueTrashedName = makeUniqueTrashedName();
- /*
- "The $trash/info directory contains an "information file" for every file and directory
- in $trash/files. This file MUST have exactly the same name as the file or directory in
- $trash/files, plus the extension ".trashinfo"
- [...]
- When trashing a file or directory, the implementation MUST create the corresponding
- file in $trash/info first. Moreover, it MUST try to do this in an atomic fashion,
- so that if two processes try to trash files with the same filename this will result
- in two different trash files. On Unix-like systems this is done by generating a
- filename, and then opening with O_EXCL. If that succeeds the creation was atomic
- (at least on the same machine), if it fails you need to pick another filename."
- */
- infoFileName = trashDir.filePath(infoDir)
- + uniqueTrashedName + QLatin1String(".trashinfo");
- infoFile.setFileName(infoFileName);
- if (!infoFile.open(QIODevice::NewOnly | QIODevice::WriteOnly | QIODevice::Text))
- uniqueTrashedName = makeUniqueTrashedName();
- } while (!infoFile.isOpen());
- const QString targetPath = trashDir.filePath(filesDir) + uniqueTrashedName;
- const QFileSystemEntry target(targetPath);
-
- /*
- We might fail to rename if source and target are on different file systems.
- In that case, we don't try further, i.e. copying and removing the original
- is usually not what the user would expect to happen.
+ We first try the unchanged base name, then try something different if it collides.
+
+ "The $trash/info directory contains an "information file" for every file and directory
+ in $trash/files. This file MUST have exactly the same name as the file or directory in
+ $trash/files, plus the extension ".trashinfo"
+ [...]
+ When trashing a file or directory, the implementation MUST create the corresponding
+ file in $trash/info first. Moreover, it MUST try to do this in an atomic fashion,
+ so that if two processes try to trash files with the same filename this will result
+ in two different trash files. On Unix-like systems this is done by generating a
+ filename, and then opening with O_EXCL. If that succeeds the creation was atomic
+ (at least on the same machine), if it fails you need to pick another filename."
*/
- if (!renameFile(source, target, error)) {
- infoFile.close();
- infoFile.remove();
- return false;
+ QString uniqueTrashedName = sourcePath.fileName();
+ if (!op.tryCreateInfoFile(uniqueTrashedName, error) && error.errorCode == EEXIST) {
+ // we'll use a counter, starting with the file's inode number to avoid
+ // collisions
+ qulonglong counter;
+ if (QT_STATBUF st; Q_LIKELY(QT_STAT(source.nativeFilePath(), &st) == 0)) {
+ counter = st.st_ino;
+ } else {
+ error = QSystemError(errno, QSystemError::StandardLibraryError);
+ return false;
+ }
+
+ QString uniqueTrashBase = std::move(uniqueTrashedName);
+ for (;;) {
+ uniqueTrashedName = QString::asprintf("%ls-%llu", qUtf16Printable(uniqueTrashBase),
+ counter++);
+ if (op.tryCreateInfoFile(uniqueTrashedName, error))
+ break;
+ if (error.errorCode != EEXIST)
+ return false;
+ };
}
QByteArray info =
"[Trash Info]\n"
- "Path=" + sourcePath.toUtf8() + "\n"
- "DeletionDate=" + QDateTime::currentDateTime().toString(QLatin1String("yyyy-MM-ddThh:mm:ss")).toUtf8()
+ "Path=" + QUrl::toPercentEncoding(source.filePath().mid(op.volumePrefixLength), "/") + "\n"
+ "DeletionDate=" + QDateTime::currentDateTime().toString(Qt::ISODate).toUtf8()
+ "\n";
- infoFile.write(info);
- infoFile.close();
+ if (QT_WRITE(op.infoFileFd, info.data(), info.size()) < 0) {
+ error = QSystemError(errno, QSystemError::StandardLibraryError);
+ return false;
+ }
+
+ /*
+ If we've already linked the file-to-be-trashed into the trash
+ directory, we know it's in the same mountpoint and we won't get ENOSPC
+ renaming the temporary file to the target name either.
+ */
+ bool renamed;
+ if (op.tempTrashFileName.isEmpty()) {
+ /*
+ We did not get a link (we're trying to trash a directory or on a
+ filesystem that doesn't support hardlinking), so rename straight
+ from the original name. We might fail to rename if source and target
+ are on different file systems.
+ */
+ renamed = renameat(AT_FDCWD, source.nativeFilePath(), op.filesDirFd,
+ QFile::encodeName(uniqueTrashedName)) == 0;
+ } else {
+ renamed = renameat(op.filesDirFd, op.tempTrashFileName, op.filesDirFd,
+ QFile::encodeName(uniqueTrashedName)) == 0;
+ if (renamed)
+ removeFile(source, error); // success, delete the original file
+ }
+ if (!renamed) {
+ error = QSystemError(errno, QSystemError::StandardLibraryError);
+ return false;
+ }
- newLocation = QFileSystemEntry(targetPath);
+ op.commit();
+ newLocation = QFileSystemEntry(op.trashPath + "/files/"_L1 + uniqueTrashedName);
return true;
-#endif // QT_BOOTSTRAPPED
}
-#endif // Q_OS_DARWIN
+#endif // !Q_OS_DARWIN && !QT_BOOTSTRAPPED
//static
bool QFileSystemEngine::copyFile(const QFileSystemEntry &source, const QFileSystemEntry &target, QSystemError &error)
@@ -1563,28 +1683,22 @@ bool QFileSystemEngine::setPermissions(int fd, QFile::Permissions permissions, Q
}
//static
-bool QFileSystemEngine::setFileTime(int fd, const QDateTime &newDate, QAbstractFileEngine::FileTime time, QSystemError &error)
+bool QFileSystemEngine::setFileTime(int fd, const QDateTime &newDate, QFile::FileTime time, QSystemError &error)
{
- if (!newDate.isValid() || time == QAbstractFileEngine::BirthTime ||
- time == QAbstractFileEngine::MetadataChangeTime) {
+ if (!newDate.isValid()
+ || time == QFile::FileBirthTime || time == QFile::FileMetadataChangeTime) {
error = QSystemError(EINVAL, QSystemError::StandardLibraryError);
return false;
}
#if QT_CONFIG(futimens)
- struct timespec ts[2];
+ // UTIME_OMIT: leave file timestamp unchanged
+ struct timespec ts[2] = {{0, UTIME_OMIT}, {0, UTIME_OMIT}};
- ts[0].tv_sec = ts[1].tv_sec = 0;
- ts[0].tv_nsec = ts[1].tv_nsec = UTIME_OMIT;
-
- const qint64 msecs = newDate.toMSecsSinceEpoch();
-
- if (time == QAbstractFileEngine::AccessTime) {
- ts[0].tv_sec = msecs / 1000;
- ts[0].tv_nsec = (msecs % 1000) * 1000000;
- } else if (time == QAbstractFileEngine::ModificationTime) {
- ts[1].tv_sec = msecs / 1000;
- ts[1].tv_nsec = (msecs % 1000) * 1000000;
+ if (time == QFile::FileAccessTime || time == QFile::FileModificationTime) {
+ const int idx = time == QFile::FileAccessTime ? 0 : 1;
+ const std::chrono::milliseconds msecs{newDate.toMSecsSinceEpoch()};
+ ts[idx] = durationToTimespec(msecs);
}
if (futimens(fd, ts) == -1) {
@@ -1593,33 +1707,6 @@ bool QFileSystemEngine::setFileTime(int fd, const QDateTime &newDate, QAbstractF
}
return true;
-#elif QT_CONFIG(futimes)
- struct timeval tv[2];
- QT_STATBUF st;
-
- if (QT_FSTAT(fd, &st) == -1) {
- error = QSystemError(errno, QSystemError::StandardLibraryError);
- return false;
- }
-
- GetFileTimes::get(&st, &tv[0], &tv[1]);
-
- const qint64 msecs = newDate.toMSecsSinceEpoch();
-
- if (time == QAbstractFileEngine::AccessTime) {
- tv[0].tv_sec = msecs / 1000;
- tv[0].tv_usec = (msecs % 1000) * 1000;
- } else if (time == QAbstractFileEngine::ModificationTime) {
- tv[1].tv_sec = msecs / 1000;
- tv[1].tv_usec = (msecs % 1000) * 1000;
- }
-
- if (futimes(fd, tv) == -1) {
- error = QSystemError(errno, QSystemError::StandardLibraryError);
- return false;
- }
-
- return true;
#else
Q_UNUSED(fd);
error = QSystemError(ENOSYS, QSystemError::StandardLibraryError);
@@ -1637,13 +1724,13 @@ QString QFileSystemEngine::homePath()
QString QFileSystemEngine::rootPath()
{
- return QLatin1String("/");
+ return u"/"_s;
}
QString QFileSystemEngine::tempPath()
{
#ifdef QT_UNIX_TEMP_PATH_OVERRIDE
- return QLatin1String(QT_UNIX_TEMP_PATH_OVERRIDE);
+ return QT_UNIX_TEMP_PATH_OVERRIDE ""_L1;
#else
QString temp = QFile::decodeName(qgetenv("TMPDIR"));
if (temp.isEmpty()) {
@@ -1653,7 +1740,7 @@ QString QFileSystemEngine::tempPath()
temp = QString::fromCFString((CFStringRef)nsPath);
#endif
} else {
- temp = QLatin1String(_PATH_TMP);
+ temp = _PATH_TMP ""_L1;
}
}
return QDir(QDir::cleanPath(temp)).canonicalPath();
diff --git a/src/corelib/io/qfilesystemengine_win.cpp b/src/corelib/io/qfilesystemengine_win.cpp
index 60285cfea8..3ec32e31a1 100644
--- a/src/corelib/io/qfilesystemengine_win.cpp
+++ b/src/corelib/io/qfilesystemengine_win.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qfilesystemengine_p.h"
#include "qoperatingsystemversion.h"
@@ -56,6 +20,7 @@
#if QT_CONFIG(regularexpression)
#include "qregularexpression.h"
#endif
+#include "qstring.h"
#include <sys/types.h>
#include <direct.h>
@@ -72,6 +37,8 @@
#define SECURITY_WIN32
#include <security.h>
+#include <QtCore/private/qfunctions_win_p.h>
+
#ifndef SPI_GETPLATFORMTYPE
#define SPI_GETPLATFORMTYPE 257
#endif
@@ -137,12 +104,6 @@ typedef struct _REPARSE_DATA_BUFFER {
CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 42, METHOD_BUFFERED, FILE_ANY_ACCESS)
#endif
-#if defined(QT_BOOTSTRAPPED)
-# define QT_FEATURE_fslibs -1
-#else
-# define QT_FEATURE_fslibs 1
-#endif // QT_BOOTSTRAPPED
-
#if QT_CONFIG(fslibs)
#include <aclapi.h>
#include <authz.h>
@@ -151,9 +112,12 @@ static PSID currentUserSID = nullptr;
static PSID currentGroupSID = nullptr;
static PSID worldSID = nullptr;
static HANDLE currentUserImpersonatedToken = nullptr;
+#endif // fslibs
QT_BEGIN_NAMESPACE
+using namespace Qt::StringLiterals;
+#if QT_CONFIG(fslibs)
namespace {
struct GlobalSid
{
@@ -407,20 +371,46 @@ constexpr NonSpecificPermissions toNonSpecificPermissions(PermissionTag tag,
return NonSpecificPermissions::fromInt((permissions.toInt() >> int(tag)) & 0x7);
}
+[[maybe_unused]] // Not currently used; included to show how to do it (without bit-rotting).
constexpr QFileDevice::Permissions toSpecificPermissions(PermissionTag tag,
NonSpecificPermissions permissions)
{
return QFileDevice::Permissions::fromInt(permissions.toInt() << int(tag));
}
-QT_END_NAMESPACE
-
} // anonymous namespace
#endif // QT_CONFIG(fslibs)
-QT_BEGIN_NAMESPACE
+#if QT_DEPRECATED_SINCE(6,6)
+int qt_ntfs_permission_lookup = 0;
+#endif
+
+static QBasicAtomicInt qt_ntfs_permission_lookup_v2 = Q_BASIC_ATOMIC_INITIALIZER(0);
+
+QT_WARNING_PUSH
+QT_WARNING_DISABLE_DEPRECATED
+
+bool qEnableNtfsPermissionChecks() noexcept
+{
+ return qt_ntfs_permission_lookup_v2.fetchAndAddRelaxed(1)
+QT_IF_DEPRECATED_SINCE(6, 6, /*nothing*/, + qt_ntfs_permission_lookup)
+ != 0;
+}
+
+bool qDisableNtfsPermissionChecks() noexcept
+{
+ return qt_ntfs_permission_lookup_v2.fetchAndSubRelaxed(1)
+QT_IF_DEPRECATED_SINCE(6, 6, /*nothing*/, + qt_ntfs_permission_lookup)
+ == 1;
+}
-Q_CORE_EXPORT int qt_ntfs_permission_lookup = 0;
+bool qAreNtfsPermissionChecksEnabled() noexcept
+{
+ return qt_ntfs_permission_lookup_v2.loadRelaxed()
+QT_IF_DEPRECATED_SINCE(6, 6, /*nothing*/, + qt_ntfs_permission_lookup)
+ ;
+}
+QT_WARNING_POP
/*!
\class QNativeFilePermissions
@@ -476,8 +466,8 @@ QNativeFilePermissions::QNativeFilePermissions(std::optional<QFileDevice::Permis
ACCESS_MASK denyMask, allowMask;
};
- auto makeMasks = [this, isDir](NonSpecificPermissions allowPermissions,
- NonSpecificPermissions denyPermissions, bool owner) {
+ auto makeMasks = [isDir](NonSpecificPermissions allowPermissions,
+ NonSpecificPermissions denyPermissions, bool owner) {
constexpr ACCESS_MASK AllowRead = FILE_READ_DATA | FILE_READ_ATTRIBUTES | FILE_READ_EA;
constexpr ACCESS_MASK DenyRead = FILE_READ_DATA | FILE_READ_EA;
@@ -593,6 +583,9 @@ QNativeFilePermissions::QNativeFilePermissions(std::optional<QFileDevice::Permis
sa.bInheritHandle = FALSE;
isNull = false;
+#else
+ Q_UNUSED(perms);
+ Q_UNUSED(isDir);
#endif // QT_CONFIG(fslibs)
ok = true;
}
@@ -602,7 +595,7 @@ QNativeFilePermissions::QNativeFilePermissions(std::optional<QFileDevice::Permis
Return pointer to a \c SECURITY_ATTRIBUTES object describing the permissions.
The returned pointer many be null if default permissions were requested or
- during bootstrap. The calles must call \c isOk() to check if the object
+ during bootstrap. The callers must call \c isOk() to check if the object
was successfully constructed before using this method.
*/
SECURITY_ATTRIBUTES *QNativeFilePermissions::securityAttributes()
@@ -681,14 +674,14 @@ static QString readSymLink(const QFileSystemEntry &link)
#if QT_CONFIG(fslibs) && QT_CONFIG(regularexpression)
initGlobalSid();
- QRegularExpression matchVolumeRe(QLatin1String("^Volume\\{([a-z]|[0-9]|-)+\\}\\\\"),
+ QRegularExpression matchVolumeRe("^Volume\\{([a-z]|[0-9]|-)+\\}\\\\"_L1,
QRegularExpression::CaseInsensitiveOption);
auto matchVolume = matchVolumeRe.match(result);
if (matchVolume.hasMatch()) {
Q_ASSERT(matchVolume.capturedStart() == 0);
DWORD len;
wchar_t buffer[MAX_PATH];
- const QString volumeName = QLatin1String("\\\\?\\") + matchVolume.captured();
+ const QString volumeName = "\\\\?\\"_L1 + matchVolume.captured();
if (GetVolumePathNamesForVolumeName(reinterpret_cast<LPCWSTR>(volumeName.utf16()),
buffer, MAX_PATH, &len)
!= 0) {
@@ -705,21 +698,16 @@ static QString readLink(const QFileSystemEntry &link)
#if QT_CONFIG(fslibs)
QString ret;
- bool neededCoInit = false;
IShellLink *psl; // pointer to IShellLink i/f
WIN32_FIND_DATA wfd;
wchar_t szGotPath[MAX_PATH];
+ QComHelper comHelper;
+
// Get pointer to the IShellLink interface.
HRESULT hres = CoCreateInstance(CLSID_ShellLink, nullptr, CLSCTX_INPROC_SERVER, IID_IShellLink,
(LPVOID *)&psl);
- if (hres == CO_E_NOTINITIALIZED) { // COM was not initialized
- neededCoInit = true;
- CoInitialize(nullptr);
- hres = CoCreateInstance(CLSID_ShellLink, nullptr, CLSCTX_INPROC_SERVER, IID_IShellLink,
- (LPVOID *)&psl);
- }
if (SUCCEEDED(hres)) { // Get pointer to the IPersistFile interface.
IPersistFile *ppf;
hres = psl->QueryInterface(IID_IPersistFile, (LPVOID *)&ppf);
@@ -735,8 +723,6 @@ static QString readLink(const QFileSystemEntry &link)
}
psl->Release();
}
- if (neededCoInit)
- CoUninitialize();
return ret;
#else
@@ -748,10 +734,10 @@ static QString readLink(const QFileSystemEntry &link)
static bool uncShareExists(const QString &server)
{
// This code assumes the UNC path is always like \\?\UNC\server...
- const auto parts = QStringView{server}.split(QLatin1Char('\\'), Qt::SkipEmptyParts);
+ const auto parts = QStringView{server}.split(u'\\', Qt::SkipEmptyParts);
if (parts.count() >= 3) {
QStringList shares;
- if (QFileSystemEngine::uncListSharesOnServer(QLatin1String("\\\\") + parts.at(2), &shares))
+ if (QFileSystemEngine::uncListSharesOnServer("\\\\"_L1 + parts.at(2), &shares))
return parts.count() < 4
|| shares.contains(parts.at(3).toString(), Qt::CaseInsensitive);
}
@@ -761,11 +747,11 @@ static bool uncShareExists(const QString &server)
static inline bool getFindData(QString path, WIN32_FIND_DATA &findData)
{
// path should not end with a trailing slash
- while (path.endsWith(QLatin1Char('\\')))
+ while (path.endsWith(u'\\'))
path.chop(1);
// can't handle drives
- if (!path.endsWith(QLatin1Char(':'))) {
+ if (!path.endsWith(u':')) {
HANDLE hFind = ::FindFirstFile((wchar_t*)path.utf16(), &findData);
if (hFind != INVALID_HANDLE_VALUE) {
::FindClose(hFind);
@@ -776,7 +762,6 @@ static inline bool getFindData(QString path, WIN32_FIND_DATA &findData)
return false;
}
-#if defined(__IFileOperation_INTERFACE_DEFINED__)
class FileOperationProgressSink : public IFileOperationProgressSink
{
public:
@@ -837,9 +822,10 @@ public:
return (dwFlags & TSF_DELETE_RECYCLE_IF_POSSIBLE) ? S_OK : E_FAIL;
}
HRESULT STDMETHODCALLTYPE PostDeleteItem(DWORD /* dwFlags */, IShellItem * /* psiItem */,
- HRESULT /* hrDelete */,
+ HRESULT hrDelete,
IShellItem *psiNewlyCreated) override
{
+ deleteResult = hrDelete;
if (psiNewlyCreated) {
wchar_t *pszName = nullptr;
psiNewlyCreated->GetDisplayName(SIGDN_FILESYSPATH, &pszName);
@@ -860,10 +846,10 @@ public:
HRESULT STDMETHODCALLTYPE ResumeTimer() override { return S_OK; }
QString targetPath;
+ HRESULT deleteResult = S_OK;
private:
ULONG ref;
};
-#endif
bool QFileSystemEngine::uncListSharesOnServer(const QString &server, QStringList *list)
{
@@ -900,6 +886,18 @@ void QFileSystemEngine::clearWinStatData(QFileSystemMetaData &data)
QFileSystemEntry QFileSystemEngine::getLinkTarget(const QFileSystemEntry &link,
QFileSystemMetaData &data)
{
+ QFileSystemEntry ret = getRawLinkPath(link, data);
+ if (!ret.isEmpty() && ret.isRelative()) {
+ QString target = absoluteName(link).path() + u'/' + ret.filePath();
+ ret = QFileSystemEntry(QDir::cleanPath(target));
+ }
+ return ret;
+}
+
+//static
+QFileSystemEntry QFileSystemEngine::getRawLinkPath(const QFileSystemEntry &link,
+ QFileSystemMetaData &data)
+{
Q_CHECK_FILE_NAME(link, link);
if (data.missingFlags(QFileSystemMetaData::LinkType))
@@ -910,12 +908,7 @@ QFileSystemEntry QFileSystemEngine::getLinkTarget(const QFileSystemEntry &link,
target = readLink(link);
else if (data.isLink())
target = readSymLink(link);
- QFileSystemEntry ret(target);
- if (!target.isEmpty() && ret.isRelative()) {
- target.prepend(absoluteName(link).path() + QLatin1Char('/'));
- ret = QFileSystemEntry(QDir::cleanPath(target));
- }
- return ret;
+ return QFileSystemEntry(target);
}
//static
@@ -932,7 +925,7 @@ QFileSystemEntry QFileSystemEngine::junctionTarget(const QFileSystemEntry &link,
target = readSymLink(link);
QFileSystemEntry ret(target);
if (!target.isEmpty() && ret.isRelative()) {
- target.prepend(absoluteName(link).path() + QLatin1Char('/'));
+ target.prepend(absoluteName(link).path() + u'/');
ret = QFileSystemEntry(QDir::cleanPath(target));
}
return ret;
@@ -975,8 +968,8 @@ QString QFileSystemEngine::nativeAbsoluteFilePath(const QString &path)
// (which is an invalid filename) this function will strip the space off and viola,
// the file is later reported as existing. Therefore, we re-add the whitespace that
// was at the end of path in order to keep the filename invalid.
- if (!path.isEmpty() && path.at(path.size() - 1) == QLatin1Char(' '))
- absPath.append(QLatin1Char(' '));
+ if (!path.isEmpty() && path.at(path.size() - 1) == u' ')
+ absPath.append(u' ');
return absPath;
}
@@ -993,17 +986,17 @@ QFileSystemEntry QFileSystemEngine::absoluteName(const QFileSystemEntry &entry)
else
ret = QDir::fromNativeSeparators(nativeAbsoluteFilePath(entry.filePath()));
} else {
- ret = QDir::cleanPath(QDir::currentPath() + QLatin1Char('/') + entry.filePath());
+ ret = QDir::cleanPath(QDir::currentPath() + u'/' + entry.filePath());
}
// The path should be absolute at this point.
// From the docs :
// Absolute paths begin with the directory separator "/"
// (optionally preceded by a drive specification under Windows).
- if (ret.at(0) != QLatin1Char('/')) {
+ if (ret.at(0) != u'/') {
Q_ASSERT(ret.length() >= 2);
Q_ASSERT(ret.at(0).isLetter());
- Q_ASSERT(ret.at(1) == QLatin1Char(':'));
+ Q_ASSERT(ret.at(1) == u':');
// Force uppercase drive letters.
ret[0] = ret.at(0).toUpper();
@@ -1076,7 +1069,7 @@ QByteArray QFileSystemEngine::id(HANDLE fHandle)
//static
bool QFileSystemEngine::setFileTime(HANDLE fHandle, const QDateTime &newDate,
- QAbstractFileEngine::FileTime time, QSystemError &error)
+ QFile::FileTime time, QSystemError &error)
{
FILETIME fTime;
FILETIME *pLastWrite = nullptr;
@@ -1084,15 +1077,15 @@ bool QFileSystemEngine::setFileTime(HANDLE fHandle, const QDateTime &newDate,
FILETIME *pCreationTime = nullptr;
switch (time) {
- case QAbstractFileEngine::ModificationTime:
+ case QFile::FileModificationTime:
pLastWrite = &fTime;
break;
- case QAbstractFileEngine::AccessTime:
+ case QFile::FileAccessTime:
pLastAccess = &fTime;
break;
- case QAbstractFileEngine::BirthTime:
+ case QFile::FileBirthTime:
pCreationTime = &fTime;
break;
@@ -1115,8 +1108,7 @@ QString QFileSystemEngine::owner(const QFileSystemEntry &entry, QAbstractFileEng
{
QString name;
#if QT_CONFIG(fslibs)
- extern int qt_ntfs_permission_lookup;
- if (qt_ntfs_permission_lookup > 0) {
+ if (qAreNtfsPermissionChecksEnabled()) {
initGlobalSid();
{
PSID pOwner = 0;
@@ -1170,7 +1162,7 @@ bool QFileSystemEngine::fillPermissions(const QFileSystemEntry &entry, QFileSyst
QFileSystemMetaData::MetaDataFlags what)
{
#if QT_CONFIG(fslibs)
- if (qt_ntfs_permission_lookup > 0) {
+ if (qAreNtfsPermissionChecksEnabled()) {
initGlobalSid();
QString fname = entry.nativeFilePath();
@@ -1196,7 +1188,7 @@ bool QFileSystemEngine::fillPermissions(const QFileSystemEntry &entry, QFileSyst
// Check for generic permissions and file-specific bits that most closely
// represent POSIX permissions.
- // Contants like FILE_GENERIC_{READ,WRITE,EXECUTE} cannot be used
+ // Constants like FILE_GENERIC_{READ,WRITE,EXECUTE} cannot be used
// here because they contain permission bits shared between all of them.
if (accessMask & (GENERIC_READ | FILE_READ_DATA))
data.entryFlags |= readFlags;
@@ -1263,9 +1255,8 @@ bool QFileSystemEngine::fillPermissions(const QFileSystemEntry &entry, QFileSyst
QString fname = entry.filePath();
QString ext = fname.right(4).toLower();
- if (data.isDirectory() || ext == QLatin1String(".exe") || ext == QLatin1String(".com")
- || ext == QLatin1String(".bat") || ext == QLatin1String(".pif")
- || ext == QLatin1String(".cmd")) {
+ if (data.isDirectory() || ext == ".exe"_L1 || ext == ".com"_L1
+ || ext == ".bat"_L1 || ext == ".pif"_L1 || ext == ".cmd"_L1) {
data.entryFlags |= QFileSystemMetaData::OwnerExecutePermission
| QFileSystemMetaData::GroupExecutePermission
| QFileSystemMetaData::OtherExecutePermission
@@ -1300,7 +1291,7 @@ static bool tryDriveUNCFallback(const QFileSystemEntry &fname, QFileSystemMetaDa
DWORD drivesBitmask = ::GetLogicalDrives();
::SetErrorMode(oldErrorMode);
int drivebit =
- 1 << (fname.filePath().at(0).toUpper().unicode() - QLatin1Char('A').unicode());
+ 1 << (fname.filePath().at(0).toUpper().unicode() - u'A');
if (drivesBitmask & drivebit) {
fileAttrib = FILE_ATTRIBUTE_DIRECTORY | FILE_ATTRIBUTE_SYSTEM;
entryExists = true;
@@ -1308,7 +1299,7 @@ static bool tryDriveUNCFallback(const QFileSystemEntry &fname, QFileSystemMetaDa
} else {
const QString &path = fname.nativeFilePath();
bool is_dir = false;
- if (path.startsWith(QLatin1String("\\\\?\\UNC"))) {
+ if (path.startsWith("\\\\?\\UNC"_L1)) {
// UNC - stat doesn't work for all cases (Windows bug)
int s = path.indexOf(path.at(0),7);
if (s > 0) {
@@ -1397,7 +1388,7 @@ bool QFileSystemEngine::fillMetaData(const QFileSystemEntry &entry, QFileSystemM
// Check for ".lnk": Directories named ".lnk" should be skipped, corrupted
// link files should still be detected as links.
const QString origFilePath = entry.filePath();
- if (origFilePath.endsWith(QLatin1String(".lnk")) && !isDirPath(origFilePath, nullptr)) {
+ if (origFilePath.endsWith(".lnk"_L1) && !isDirPath(origFilePath, nullptr)) {
data.entryFlags |= QFileSystemMetaData::WinLnkType;
fname = QFileSystemEntry(readLink(entry));
} else {
@@ -1470,8 +1461,8 @@ static inline bool rmDir(const QString &path)
bool QFileSystemEngine::isDirPath(const QString &dirPath, bool *existed)
{
QString path = dirPath;
- if (path.length() == 2 && path.at(1) == QLatin1Char(':'))
- path += QLatin1Char('\\');
+ if (path.length() == 2 && path.at(1) == u':')
+ path += u'\\';
const QString longPath = QFSFileEnginePrivate::longFileName(path);
DWORD fileAttrib = ::GetFileAttributes(reinterpret_cast<const wchar_t*>(longPath.utf16()));
@@ -1500,11 +1491,11 @@ static bool createDirectoryWithParents(const QString &nativeName,
bool shouldMkdirFirst = true)
{
const auto isUNCRoot = [](const QString &nativeName) {
- return nativeName.startsWith(QLatin1String("\\\\"))
+ return nativeName.startsWith("\\\\"_L1)
&& nativeName.count(QDir::separator()) <= 3;
};
const auto isDriveName = [](const QString &nativeName) {
- return nativeName.size() == 2 && nativeName.at(1) == QLatin1Char(':');
+ return nativeName.size() == 2 && nativeName.at(1) == u':';
};
const auto isDir = [](const QString &nativeName) {
bool exists = false;
@@ -1572,7 +1563,7 @@ bool QFileSystemEngine::removeDirectory(const QFileSystemEntry &entry, bool remo
for (int oldslash = 0, slash=dirName.length(); slash > 0; oldslash = slash) {
const auto chunkRef = QStringView{dirName}.left(slash);
if (chunkRef.length() == 2 && chunkRef.at(0).isLetter()
- && chunkRef.at(1) == QLatin1Char(':')) {
+ && chunkRef.at(1) == u':') {
break;
}
const QString chunk = chunkRef.toString();
@@ -1592,8 +1583,8 @@ QString QFileSystemEngine::rootPath()
{
QString ret = QString::fromLatin1(qgetenv("SystemDrive"));
if (ret.isEmpty())
- ret = QLatin1String("c:");
- ret.append(QLatin1Char('/'));
+ ret = "c:"_L1;
+ ret.append(u'/');
return ret;
}
@@ -1651,13 +1642,13 @@ QString QFileSystemEngine::tempPath()
QString::fromWCharArray(tempPath, len);
}
if (!ret.isEmpty()) {
- while (ret.endsWith(QLatin1Char('\\')))
+ while (ret.endsWith(u'\\'))
ret.chop(1);
ret = QDir::fromNativeSeparators(ret);
}
if (ret.isEmpty()) {
- ret = QLatin1String("C:/tmp");
- } else if (ret.length() >= 2 && ret[1] == QLatin1Char(':'))
+ ret = "C:/tmp"_L1;
+ } else if (ret.length() >= 2 && ret[1] == u':')
ret[0] = ret.at(0).toUpper(); // Force uppercase drive letters.
return ret;
}
@@ -1680,23 +1671,20 @@ bool QFileSystemEngine::setCurrentPath(const QFileSystemEntry &entry)
QFileSystemEntry QFileSystemEngine::currentPath()
{
- QString ret;
- DWORD size = 0;
- wchar_t currentName[PATH_MAX];
- size = ::GetCurrentDirectory(PATH_MAX, currentName);
- if (size != 0) {
- if (size > PATH_MAX) {
- wchar_t *newCurrentName = new wchar_t[size];
- if (::GetCurrentDirectory(PATH_MAX, newCurrentName) != 0)
- ret = QString::fromWCharArray(newCurrentName, size);
- delete [] newCurrentName;
- } else {
- ret = QString::fromWCharArray(currentName, size);
- }
+ QString ret(PATH_MAX, Qt::Uninitialized);
+ DWORD size = GetCurrentDirectoryW(PATH_MAX, reinterpret_cast<wchar_t *>(ret.data()));
+ if (size > PATH_MAX) {
+ // try again after enlarging the buffer
+ ret.resize(size);
+ size = GetCurrentDirectoryW(size, reinterpret_cast<wchar_t *>(ret.data()));
+
+ // note: the current directory may have changed underneath us; if the
+ // new one is even bigger, we may return a truncated string!
}
- if (ret.length() >= 2 && ret[1] == QLatin1Char(':'))
+ if (size >= 2 && ret.at(1) == u':')
ret[0] = ret.at(0).toUpper(); // Force uppercase drive letters.
- return QFileSystemEntry(ret, QFileSystemEntry::FromNativePath());
+ ret.resize(size);
+ return QFileSystemEntry(std::move(ret), QFileSystemEntry::FromNativePath());
}
//static
@@ -1704,18 +1692,11 @@ bool QFileSystemEngine::createLink(const QFileSystemEntry &source, const QFileSy
QSystemError &error)
{
bool ret = false;
+ QComHelper comHelper;
IShellLink *psl = nullptr;
HRESULT hres = CoCreateInstance(CLSID_ShellLink, nullptr, CLSCTX_INPROC_SERVER, IID_IShellLink,
reinterpret_cast<void **>(&psl));
- bool neededCoInit = false;
- if (hres == CO_E_NOTINITIALIZED) { // COM was not initialized
- neededCoInit = true;
- CoInitialize(nullptr);
- hres = CoCreateInstance(CLSID_ShellLink, nullptr, CLSCTX_INPROC_SERVER, IID_IShellLink,
- reinterpret_cast<void **>(&psl));
- }
-
if (SUCCEEDED(hres)) {
const auto name = QDir::toNativeSeparators(source.filePath());
const auto pathName = QDir::toNativeSeparators(source.path());
@@ -1735,9 +1716,6 @@ bool QFileSystemEngine::createLink(const QFileSystemEntry &source, const QFileSy
if (!ret)
error = QSystemError(::GetLastError(), QSystemError::NativeError);
- if (neededCoInit)
- CoUninitialize();
-
return ret;
}
@@ -1805,8 +1783,8 @@ bool QFileSystemEngine::moveFileToTrash(const QFileSystemEntry &source,
// we need the "display name" of the file, so can't use nativeAbsoluteFilePath
const QString sourcePath = QDir::toNativeSeparators(absoluteName(source).filePath());
-# if defined(__IFileOperation_INTERFACE_DEFINED__)
- CoInitialize(nullptr);
+ QComHelper comHelper;
+
IFileOperation *pfo = nullptr;
IShellItem *deleteItem = nullptr;
FileOperationProgressSink *sink = nullptr;
@@ -1819,7 +1797,6 @@ bool QFileSystemEngine::moveFileToTrash(const QFileSystemEntry &source,
deleteItem->Release();
if (pfo)
pfo->Release();
- CoUninitialize();
if (!SUCCEEDED(hres))
error = QSystemError(hres, QSystemError::NativeError);
});
@@ -1840,11 +1817,13 @@ bool QFileSystemEngine::moveFileToTrash(const QFileSystemEntry &source,
hres = pfo->PerformOperations();
if (!SUCCEEDED(hres))
return false;
- newLocation = QFileSystemEntry(sink->targetPath);
-# endif // no IFileOperation in SDK (mingw, likely) - fall back to SHFileOperation
+ if (!SUCCEEDED(sink->deleteResult)) {
+ error = QSystemError(sink->deleteResult, QSystemError::NativeError);
+ return false;
+ }
+ newLocation = QFileSystemEntry(sink->targetPath);
return true;
-
}
//static
@@ -1883,7 +1862,7 @@ static inline QDateTime fileTimeToQDateTime(const FILETIME *time)
FileTimeToSystemTime(time, &sTime);
return QDateTime(QDate(sTime.wYear, sTime.wMonth, sTime.wDay),
QTime(sTime.wHour, sTime.wMinute, sTime.wSecond, sTime.wMilliseconds),
- Qt::UTC);
+ QTimeZone::UTC);
}
QDateTime QFileSystemMetaData::birthTime() const
diff --git a/src/corelib/io/qfilesystementry.cpp b/src/corelib/io/qfilesystementry.cpp
index bb39a46642..ac1691d30e 100644
--- a/src/corelib/io/qfilesystementry.cpp
+++ b/src/corelib/io/qfilesystementry.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qfilesystementry_p.h"
@@ -48,14 +12,20 @@
QT_BEGIN_NAMESPACE
+using namespace Qt::StringLiterals;
+
+// Assigned to m_lastSeparator and m_firstDotInFileName to indicate resolveFilePath()
+// hasn't been called yet
+constexpr int Uninitialized = -2;
+
#ifdef Q_OS_WIN
static bool isUncRoot(const QString &server)
{
QString localPath = QDir::toNativeSeparators(server);
- if (!localPath.startsWith(QLatin1String("\\\\")))
+ if (!localPath.startsWith("\\\\"_L1))
return false;
- int idx = localPath.indexOf(QLatin1Char('\\'), 2);
+ int idx = localPath.indexOf(u'\\', 2);
if (idx == -1 || idx + 1 == localPath.length())
return true;
@@ -65,8 +35,8 @@ static bool isUncRoot(const QString &server)
static inline QString fixIfRelativeUncPath(const QString &path)
{
QString currentPath = QDir::currentPath();
- if (currentPath.startsWith(QLatin1String("//")))
- return currentPath % QChar(QLatin1Char('/')) % path;
+ if (currentPath.startsWith("//"_L1))
+ return currentPath % QChar(u'/') % path;
return path;
}
#endif
@@ -85,8 +55,8 @@ QFileSystemEntry::QFileSystemEntry()
*/
QFileSystemEntry::QFileSystemEntry(const QString &filePath)
: m_filePath(QDir::fromNativeSeparators(filePath)),
- m_lastSeparator(-2),
- m_firstDotInFileName(-2),
+ m_lastSeparator(Uninitialized),
+ m_firstDotInFileName(Uninitialized),
m_lastDotInFileName(0)
{
}
@@ -98,8 +68,8 @@ QFileSystemEntry::QFileSystemEntry(const QString &filePath)
*/
QFileSystemEntry::QFileSystemEntry(const QString &filePath, FromInternalPath /* dummy */)
: m_filePath(filePath),
- m_lastSeparator(-2),
- m_firstDotInFileName(-2),
+ m_lastSeparator(Uninitialized),
+ m_firstDotInFileName(Uninitialized),
m_lastDotInFileName(0)
{
}
@@ -110,8 +80,8 @@ QFileSystemEntry::QFileSystemEntry(const QString &filePath, FromInternalPath /*
*/
QFileSystemEntry::QFileSystemEntry(const NativePath &nativeFilePath, FromNativePath /* dummy */)
: m_nativeFilePath(nativeFilePath),
- m_lastSeparator(-2),
- m_firstDotInFileName(-2),
+ m_lastSeparator(Uninitialized),
+ m_firstDotInFileName(Uninitialized),
m_lastDotInFileName(0)
{
}
@@ -119,8 +89,8 @@ QFileSystemEntry::QFileSystemEntry(const NativePath &nativeFilePath, FromNativeP
QFileSystemEntry::QFileSystemEntry(const QString &filePath, const NativePath &nativeFilePath)
: m_filePath(QDir::fromNativeSeparators(filePath)),
m_nativeFilePath(nativeFilePath),
- m_lastSeparator(-2),
- m_firstDotInFileName(-2),
+ m_lastSeparator(Uninitialized),
+ m_firstDotInFileName(Uninitialized),
m_lastDotInFileName(0)
{
}
@@ -166,7 +136,7 @@ QString QFileSystemEntry::fileName() const
{
findLastSeparator();
#if defined(Q_OS_WIN)
- if (m_lastSeparator == -1 && m_filePath.length() >= 2 && m_filePath.at(1) == QLatin1Char(':'))
+ if (m_lastSeparator == -1 && m_filePath.length() >= 2 && m_filePath.at(1) == u':')
return m_filePath.mid(2);
#endif
return m_filePath.mid(m_lastSeparator + 1);
@@ -177,15 +147,15 @@ QString QFileSystemEntry::path() const
findLastSeparator();
if (m_lastSeparator == -1) {
#if defined(Q_OS_WIN)
- if (m_filePath.length() >= 2 && m_filePath.at(1) == QLatin1Char(':'))
+ if (m_filePath.length() >= 2 && m_filePath.at(1) == u':')
return m_filePath.left(2);
#endif
- return QString(QLatin1Char('.'));
+ return QString(u'.');
}
if (m_lastSeparator == 0)
- return QString(QLatin1Char('/'));
+ return QString(u'/');
#if defined(Q_OS_WIN)
- if (m_lastSeparator == 2 && m_filePath.at(1) == QLatin1Char(':'))
+ if (m_lastSeparator == 2 && m_filePath.at(1) == u':')
return m_filePath.left(m_lastSeparator + 1);
#endif
return m_filePath.left(m_lastSeparator);
@@ -201,7 +171,7 @@ QString QFileSystemEntry::baseName() const
length--;
}
#if defined(Q_OS_WIN)
- if (m_lastSeparator == -1 && m_filePath.length() >= 2 && m_filePath.at(1) == QLatin1Char(':'))
+ if (m_lastSeparator == -1 && m_filePath.length() >= 2 && m_filePath.at(1) == u':')
return m_filePath.mid(2, length - 2);
#endif
return m_filePath.mid(m_lastSeparator + 1, length);
@@ -217,7 +187,7 @@ QString QFileSystemEntry::completeBaseName() const
length--;
}
#if defined(Q_OS_WIN)
- if (m_lastSeparator == -1 && m_filePath.length() >= 2 && m_filePath.at(1) == QLatin1Char(':'))
+ if (m_lastSeparator == -1 && m_filePath.length() >= 2 && m_filePath.at(1) == u':')
return m_filePath.mid(2, length - 2);
#endif
return m_filePath.mid(m_lastSeparator + 1, length);
@@ -259,8 +229,8 @@ bool QFileSystemEntry::isAbsolute() const
&& m_filePath.at(1).unicode() == ':'
&& m_filePath.at(2).unicode() == '/')
|| (m_filePath.length() >= 2
- && m_filePath.at(0) == QLatin1Char('/')
- && m_filePath.at(1) == QLatin1Char('/')));
+ && m_filePath.at(0) == u'/'
+ && m_filePath.at(1) == u'/'));
}
#else
bool QFileSystemEntry::isRelative() const
@@ -285,8 +255,8 @@ bool QFileSystemEntry::isDriveRoot() const
bool QFileSystemEntry::isDriveRootPath(const QString &path)
{
return (path.length() == 3
- && path.at(0).isLetter() && path.at(1) == QLatin1Char(':')
- && path.at(2) == QLatin1Char('/'));
+ && path.at(0).isLetter() && path.at(1) == u':'
+ && path.at(2) == u'/');
}
QString QFileSystemEntry::removeUncOrLongPathPrefix(QString path)
@@ -320,7 +290,7 @@ QString QFileSystemEntry::removeUncOrLongPathPrefix(QString path)
bool QFileSystemEntry::isRootPath(const QString &path)
{
- if (path == QLatin1String("/")
+ if (path == "/"_L1
#if defined(Q_OS_WIN)
|| isDriveRootPath(path)
|| isUncRoot(path)
@@ -337,19 +307,24 @@ bool QFileSystemEntry::isRoot() const
return isRootPath(m_filePath);
}
+bool QFileSystemEntry::isEmpty() const
+{
+ return m_filePath.isEmpty() && m_nativeFilePath.isEmpty();
+}
+
// private methods
void QFileSystemEntry::findLastSeparator() const
{
- if (m_lastSeparator == -2) {
+ if (m_lastSeparator == Uninitialized) {
resolveFilePath();
- m_lastSeparator = m_filePath.lastIndexOf(QLatin1Char('/'));
+ m_lastSeparator = m_filePath.lastIndexOf(u'/');
}
}
void QFileSystemEntry::findFileNameSeparators() const
{
- if (m_firstDotInFileName == -2) {
+ if (m_firstDotInFileName == Uninitialized) {
resolveFilePath();
int firstDotInFileName = -1;
int lastDotInFileName = -1;
@@ -402,7 +377,7 @@ bool QFileSystemEntry::isClean() const
bool dotok = true; // checking for ".." or "." starts to relative paths
bool slashok = true;
for (QString::const_iterator iter = m_filePath.constBegin(); iter != m_filePath.constEnd(); ++iter) {
- if (*iter == QLatin1Char('/')) {
+ if (*iter == u'/') {
if (dots == 1 || dots == 2)
return false; // path contains "./" or "../"
if (!slashok)
@@ -412,7 +387,7 @@ bool QFileSystemEntry::isClean() const
slashok = false;
} else if (dotok) {
slashok = true;
- if (*iter == QLatin1Char('.')) {
+ if (*iter == u'.') {
dots++;
if (dots > 2)
dotok = false;
diff --git a/src/corelib/io/qfilesystementry_p.h b/src/corelib/io/qfilesystementry_p.h
index ba0c7812e9..8b5d506b0b 100644
--- a/src/corelib/io/qfilesystementry_p.h
+++ b/src/corelib/io/qfilesystementry_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QFILESYSTEMENTRY_P_H
#define QFILESYSTEMENTRY_P_H
@@ -69,36 +33,34 @@ public:
struct FromNativePath{};
struct FromInternalPath{};
- QFileSystemEntry();
- explicit QFileSystemEntry(const QString &filePath);
-
- QFileSystemEntry(const QString &filePath, FromInternalPath dummy);
- QFileSystemEntry(const NativePath &nativeFilePath, FromNativePath dummy);
- QFileSystemEntry(const QString &filePath, const NativePath &nativeFilePath);
-
- QString filePath() const;
- QString fileName() const;
- QString path() const;
- NativePath nativeFilePath() const;
- QString baseName() const;
- QString completeBaseName() const;
- QString suffix() const;
- QString completeSuffix() const;
- bool isAbsolute() const;
- bool isRelative() const;
- bool isClean() const;
+ Q_AUTOTEST_EXPORT QFileSystemEntry();
+ Q_AUTOTEST_EXPORT explicit QFileSystemEntry(const QString &filePath);
+
+ Q_AUTOTEST_EXPORT QFileSystemEntry(const QString &filePath, FromInternalPath dummy);
+ Q_AUTOTEST_EXPORT QFileSystemEntry(const NativePath &nativeFilePath, FromNativePath dummy);
+ Q_AUTOTEST_EXPORT QFileSystemEntry(const QString &filePath, const NativePath &nativeFilePath);
+
+ Q_AUTOTEST_EXPORT QString filePath() const;
+ Q_AUTOTEST_EXPORT QString fileName() const;
+ Q_AUTOTEST_EXPORT QString path() const;
+ Q_AUTOTEST_EXPORT NativePath nativeFilePath() const;
+ Q_AUTOTEST_EXPORT QString baseName() const;
+ Q_AUTOTEST_EXPORT QString completeBaseName() const;
+ Q_AUTOTEST_EXPORT QString suffix() const;
+ Q_AUTOTEST_EXPORT QString completeSuffix() const;
+ Q_AUTOTEST_EXPORT bool isAbsolute() const;
+ Q_AUTOTEST_EXPORT bool isRelative() const;
+ Q_AUTOTEST_EXPORT bool isClean() const;
#if defined(Q_OS_WIN)
- bool isDriveRoot() const;
+ Q_AUTOTEST_EXPORT bool isDriveRoot() const;
static bool isDriveRootPath(const QString &path);
static QString removeUncOrLongPathPrefix(QString path);
#endif
- bool isRoot() const;
+ Q_AUTOTEST_EXPORT bool isRoot() const;
+
+ Q_AUTOTEST_EXPORT bool isEmpty() const;
- bool isEmpty() const
- {
- return m_filePath.isEmpty() && m_nativeFilePath.isEmpty();
- }
void clear()
{
*this = QFileSystemEntry();
diff --git a/src/corelib/io/qfilesystemiterator_p.h b/src/corelib/io/qfilesystemiterator_p.h
index 5e4e424e69..2973b85cd2 100644
--- a/src/corelib/io/qfilesystemiterator_p.h
+++ b/src/corelib/io/qfilesystemiterator_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QFILESYSTEMITERATOR_P_H
#define QFILESYSTEMITERATOR_P_H
@@ -56,44 +20,48 @@
#ifndef QT_NO_FILESYSTEMITERATOR
#include <QtCore/qdir.h>
-#include <QtCore/qdiriterator.h>
#include <QtCore/qstringlist.h>
#include <QtCore/private/qfilesystementry_p.h>
#include <QtCore/private/qfilesystemmetadata_p.h>
-// Platform-specific headers
#if !defined(Q_OS_WIN)
-#include <QtCore/qscopedpointer.h>
+#include <private/qstringconverter_p.h>
#endif
+#include <memory>
+
QT_BEGIN_NAMESPACE
class QFileSystemIterator
{
public:
- QFileSystemIterator(const QFileSystemEntry &entry, QDir::Filters filters,
- const QStringList &nameFilters, QDirIterator::IteratorFlags flags
- = QDirIterator::FollowSymlinks | QDirIterator::Subdirectories);
+ QFileSystemIterator(const QFileSystemEntry &entry, QDir::Filters filters);
~QFileSystemIterator();
bool advance(QFileSystemEntry &fileEntry, QFileSystemMetaData &metaData);
private:
- QFileSystemEntry::NativePath nativePath;
+ QString dirPath;
// Platform-specific data
#if defined(Q_OS_WIN)
- QString dirPath;
+ QFileSystemEntry::NativePath nativePath;
HANDLE findFileHandle;
QStringList uncShares;
bool uncFallback;
int uncShareIndex;
bool onlyDirs;
#else
- QT_DIR *dir;
- QT_DIRENT *dirEntry;
- int lastError;
+ struct DirStreamCloser {
+ void operator()(QT_DIR *dir) { if (dir) QT_CLOSEDIR(dir); }
+ };
+ using DirPtr = std::unique_ptr<QT_DIR, DirStreamCloser>;
+ DirPtr dir;
+
+ QT_DIRENT *dirEntry = nullptr;
+ int lastError = 0;
+ QStringDecoder toUtf16;
#endif
Q_DISABLE_COPY_MOVE(QFileSystemIterator)
diff --git a/src/corelib/io/qfilesystemiterator_unix.cpp b/src/corelib/io/qfilesystemiterator_unix.cpp
index cf01eeff15..a1130728ef 100644
--- a/src/corelib/io/qfilesystemiterator_unix.cpp
+++ b/src/corelib/io/qfilesystemiterator_unix.cpp
@@ -1,49 +1,13 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qplatformdefs.h"
#include "qfilesystemiterator_p.h"
-#include <private/qstringconverter_p.h>
-
#ifndef QT_NO_FILESYSTEMITERATOR
+#include <qvarlengtharray.h>
+
#include <memory>
#include <stdlib.h>
@@ -51,53 +15,66 @@
QT_BEGIN_NAMESPACE
-static bool checkNameDecodable(const char *d_name, qsizetype len)
-{
- // This function is called in a loop from advance() below, but the loop is
- // usually run only once.
-
- return QUtf8::isValidUtf8(QByteArrayView(d_name, len)).isValidUtf8;
-}
-
-QFileSystemIterator::QFileSystemIterator(const QFileSystemEntry &entry, QDir::Filters filters,
- const QStringList &nameFilters, QDirIterator::IteratorFlags flags)
- : nativePath(entry.nativeFilePath())
- , dir(nullptr)
- , dirEntry(nullptr)
- , lastError(0)
+/*
+ Native filesystem iterator, which uses ::opendir()/readdir()/dirent from the system
+ libraries to iterate over the directory represented by \a entry.
+*/
+QFileSystemIterator::QFileSystemIterator(const QFileSystemEntry &entry, QDir::Filters filters)
+ : dirPath(entry.filePath()),
+ toUtf16(QStringDecoder::Utf8)
{
Q_UNUSED(filters);
- Q_UNUSED(nameFilters);
- Q_UNUSED(flags);
- if ((dir = QT_OPENDIR(nativePath.constData())) == nullptr) {
+ dir.reset(QT_OPENDIR(entry.nativeFilePath().constData()));
+ if (!dir) {
lastError = errno;
} else {
- if (!nativePath.endsWith('/'))
- nativePath.append('/');
+ if (!dirPath.endsWith(u'/'))
+ dirPath.append(u'/');
}
}
-QFileSystemIterator::~QFileSystemIterator()
-{
- if (dir)
- QT_CLOSEDIR(dir);
-}
+QFileSystemIterator::~QFileSystemIterator() = default;
bool QFileSystemIterator::advance(QFileSystemEntry &fileEntry, QFileSystemMetaData &metaData)
{
+ auto asFileEntry = [this](QStringView name) {
+#ifdef Q_OS_DARWIN
+ // must match QFile::decodeName
+ QString normalized = name.toString().normalized(QString::NormalizationForm_C);
+ name = normalized;
+#endif
+ return QFileSystemEntry(dirPath + name, QFileSystemEntry::FromInternalPath());
+ };
if (!dir)
return false;
for (;;) {
- dirEntry = QT_READDIR(dir);
+ // From readdir man page:
+ // If the end of the directory stream is reached, NULL is returned and errno is
+ // not changed. If an error occurs, NULL is returned and errno is set to indicate
+ // the error. To distinguish end of stream from an error, set errno to zero before
+ // calling readdir() and then check the value of errno if NULL is returned.
+ errno = 0;
+ dirEntry = QT_READDIR(dir.get());
if (dirEntry) {
- qsizetype len = strlen(dirEntry->d_name);
- if (checkNameDecodable(dirEntry->d_name, len)) {
- fileEntry = QFileSystemEntry(nativePath + QByteArray(dirEntry->d_name, len), QFileSystemEntry::FromNativePath());
+ // POSIX allows readdir() to return a file name in struct dirent that
+ // extends past the end of the d_name array (it's a char[1] array on QNX, for
+ // example). Therefore, we *must* call strlen() on it to get the actual length
+ // of the file name. See:
+ // https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/dirent.h.html#tag_13_07_05
+ QByteArrayView name(dirEntry->d_name, strlen(dirEntry->d_name));
+ // name.size() is sufficient here, see QUtf8::convertToUnicode() for details
+ QVarLengthArray<char16_t> buffer(name.size());
+ auto *end = toUtf16.appendToBuffer(buffer.data(), name);
+ buffer.resize(end - buffer.constData());
+ if (!toUtf16.hasError()) {
+ fileEntry = asFileEntry(buffer);
metaData.fillFromDirEnt(*dirEntry);
return true;
+ } else {
+ errno = EILSEQ; // Invalid or incomplete multibyte or wide character
}
} else {
break;
diff --git a/src/corelib/io/qfilesystemiterator_win.cpp b/src/corelib/io/qfilesystemiterator_win.cpp
index ac52dacdce..7644a1a078 100644
--- a/src/corelib/io/qfilesystemiterator_win.cpp
+++ b/src/corelib/io/qfilesystemiterator_win.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qfilesystemiterator_p.h"
#include "qfilesystemengine_p.h"
@@ -46,30 +10,29 @@
QT_BEGIN_NAMESPACE
+using namespace Qt::StringLiterals;
+
bool done = true;
-QFileSystemIterator::QFileSystemIterator(const QFileSystemEntry &entry, QDir::Filters filters,
- const QStringList &nameFilters, QDirIterator::IteratorFlags flags)
- : nativePath(entry.nativeFilePath())
- , dirPath(entry.filePath())
+QFileSystemIterator::QFileSystemIterator(const QFileSystemEntry &entry, QDir::Filters filters)
+ : dirPath(entry.filePath())
+ , nativePath(entry.nativeFilePath())
, findFileHandle(INVALID_HANDLE_VALUE)
, uncFallback(false)
, uncShareIndex(0)
, onlyDirs(false)
{
- Q_UNUSED(nameFilters);
- Q_UNUSED(flags);
- if (nativePath.endsWith(u".lnk"_qs) && !QFileSystemEngine::isDirPath(dirPath, nullptr)) {
+ if (nativePath.endsWith(u".lnk"_s) && !QFileSystemEngine::isDirPath(dirPath, nullptr)) {
QFileSystemMetaData metaData;
QFileSystemEntry link = QFileSystemEngine::getLinkTarget(entry, metaData);
nativePath = link.nativeFilePath();
}
- if (!nativePath.endsWith(QLatin1Char('\\')))
- nativePath.append(QLatin1Char('\\'));
- nativePath.append(QLatin1Char('*'));
+ if (!nativePath.endsWith(u'\\'))
+ nativePath.append(u'\\');
+ nativePath.append(u'*');
// In MSVC2015+ case we prepend //?/ for longer file-name support
- if (!dirPath.endsWith(QLatin1Char('/')))
- dirPath.append(QLatin1Char('/'));
+ if (!dirPath.endsWith(u'/'))
+ dirPath.append(u'/');
if ((filters & (QDir::Dirs|QDir::Drives)) && (!(filters & (QDir::Files))))
onlyDirs = true;
}
@@ -97,10 +60,10 @@ bool QFileSystemIterator::advance(QFileSystemEntry &fileEntry, QFileSystemMetaDa
findFileHandle = FindFirstFileEx((const wchar_t *)nativePath.utf16(), FINDEX_INFO_LEVELS(infoLevel), &findData,
FINDEX_SEARCH_OPS(searchOps), 0, dwAdditionalFlags);
if (findFileHandle == INVALID_HANDLE_VALUE) {
- if (nativePath.startsWith(QLatin1String("\\\\?\\UNC\\"))) {
- const auto parts = QStringView{nativePath}.split(QLatin1Char('\\'), Qt::SkipEmptyParts);
+ if (nativePath.startsWith("\\\\?\\UNC\\"_L1)) {
+ const auto parts = QStringView{nativePath}.split(u'\\', Qt::SkipEmptyParts);
if (parts.count() == 4 && QFileSystemEngine::uncListSharesOnServer(
- QLatin1String("\\\\") + parts.at(2), &uncShares)) {
+ "\\\\"_L1 + parts.at(2), &uncShares)) {
if (uncShares.isEmpty())
return false; // No shares found in the server
uncFallback = true;
@@ -129,7 +92,7 @@ bool QFileSystemIterator::advance(QFileSystemEntry &fileEntry, QFileSystemMetaDa
QString fileName = QString::fromWCharArray(findData.cFileName);
fileEntry = QFileSystemEntry(dirPath + fileName);
metaData = QFileSystemMetaData();
- if (!fileName.endsWith(QLatin1String(".lnk"))) {
+ if (!fileName.endsWith(".lnk"_L1)) {
metaData.fillFromFindData(findData, true);
}
return true;
diff --git a/src/corelib/io/qfilesystemmetadata_p.h b/src/corelib/io/qfilesystemmetadata_p.h
index 6340e204db..c10b66afaf 100644
--- a/src/corelib/io/qfilesystemmetadata_p.h
+++ b/src/corelib/io/qfilesystemmetadata_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QFILESYSTEMMETADATA_P_H
#define QFILESYSTEMMETADATA_P_H
@@ -54,6 +18,7 @@
#include "qplatformdefs.h"
#include <QtCore/qglobal.h>
#include <QtCore/qdatetime.h>
+#include <QtCore/qtimezone.h>
#include <QtCore/private/qabstractfileengine_p.h>
// Platform-specific includes
@@ -221,11 +186,15 @@ public:
QDateTime metadataChangeTime() const;
QDateTime modificationTime() const;
- QDateTime fileTime(QAbstractFileEngine::FileTime time) const;
+ QDateTime fileTime(QFile::FileTime time) const;
uint userId() const;
uint groupId() const;
uint ownerId(QAbstractFileEngine::FileOwner owner) const;
+ bool isReadable() const { return permissions().testAnyFlags(QFile::ReadUser); }
+ bool isWritable() const { return permissions().testAnyFlags(QFile::WriteUser); }
+ bool isExecutable() const { return permissions().testAnyFlags(QFile::ExeUser); }
+
#ifdef Q_OS_UNIX
void fillFromStatxBuf(const struct statx &statBuffer);
void fillFromStatBuf(const QT_STATBUF &statBuffer);
@@ -243,7 +212,7 @@ private:
MetaDataFlags knownFlagsMask;
MetaDataFlags entryFlags;
- qint64 size_;
+ qint64 size_ = 0;
// Platform-specific data goes here:
#if defined(Q_OS_WIN)
@@ -254,13 +223,13 @@ private:
FILETIME lastWriteTime_;
#else
// msec precision
- qint64 accessTime_;
- qint64 birthTime_;
- qint64 metadataChangeTime_;
- qint64 modificationTime_;
+ qint64 accessTime_ = 0;
+ qint64 birthTime_ = 0;
+ qint64 metadataChangeTime_ = 0;
+ qint64 modificationTime_ = 0;
- uint userId_;
- uint groupId_;
+ uint userId_ = (uint) -2;
+ uint groupId_ = (uint) -2;
#endif
};
@@ -278,19 +247,19 @@ inline bool QFileSystemMetaData::isAlias() const { return fal
#endif
#if defined(Q_OS_UNIX) || defined (Q_OS_WIN)
-inline QDateTime QFileSystemMetaData::fileTime(QAbstractFileEngine::FileTime time) const
+inline QDateTime QFileSystemMetaData::fileTime(QFile::FileTime time) const
{
switch (time) {
- case QAbstractFileEngine::ModificationTime:
+ case QFile::FileModificationTime:
return modificationTime();
- case QAbstractFileEngine::AccessTime:
+ case QFile::FileAccessTime:
return accessTime();
- case QAbstractFileEngine::BirthTime:
+ case QFile::FileBirthTime:
return birthTime();
- case QAbstractFileEngine::MetadataChangeTime:
+ case QFile::FileMetadataChangeTime:
return metadataChangeTime();
}
@@ -300,13 +269,29 @@ inline QDateTime QFileSystemMetaData::fileTime(QAbstractFileEngine::FileTime tim
#if defined(Q_OS_UNIX)
inline QDateTime QFileSystemMetaData::birthTime() const
-{ return birthTime_ ? QDateTime::fromMSecsSinceEpoch(birthTime_, Qt::UTC) : QDateTime(); }
+{
+ return birthTime_
+ ? QDateTime::fromMSecsSinceEpoch(birthTime_, QTimeZone::UTC)
+ : QDateTime();
+}
inline QDateTime QFileSystemMetaData::metadataChangeTime() const
-{ return metadataChangeTime_ ? QDateTime::fromMSecsSinceEpoch(metadataChangeTime_, Qt::UTC) : QDateTime(); }
+{
+ return metadataChangeTime_
+ ? QDateTime::fromMSecsSinceEpoch(metadataChangeTime_, QTimeZone::UTC)
+ : QDateTime();
+}
inline QDateTime QFileSystemMetaData::modificationTime() const
-{ return modificationTime_ ? QDateTime::fromMSecsSinceEpoch(modificationTime_, Qt::UTC) : QDateTime(); }
+{
+ return modificationTime_
+ ? QDateTime::fromMSecsSinceEpoch(modificationTime_, QTimeZone::UTC)
+ : QDateTime();
+}
inline QDateTime QFileSystemMetaData::accessTime() const
-{ return accessTime_ ? QDateTime::fromMSecsSinceEpoch(accessTime_, Qt::UTC) : QDateTime(); }
+{
+ return accessTime_
+ ? QDateTime::fromMSecsSinceEpoch(accessTime_, QTimeZone::UTC)
+ : QDateTime();
+}
inline uint QFileSystemMetaData::userId() const { return userId_; }
inline uint QFileSystemMetaData::groupId() const { return groupId_; }
diff --git a/src/corelib/io/qfilesystemwatcher.cpp b/src/corelib/io/qfilesystemwatcher.cpp
index bd5a73da84..7138f8260b 100644
--- a/src/corelib/io/qfilesystemwatcher.cpp
+++ b/src/corelib/io/qfilesystemwatcher.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qfilesystemwatcher.h"
#include "qfilesystemwatcher_p.h"
@@ -67,6 +31,8 @@
QT_BEGIN_NAMESPACE
+using namespace Qt::StringLiterals;
+
Q_LOGGING_CATEGORY(lcWatcher, "qt.core.filesystemwatcher")
QFileSystemWatcherEngine *QFileSystemWatcherPrivate::createNativeEngine(QObject *parent)
@@ -92,29 +58,29 @@ QFileSystemWatcherPrivate::QFileSystemWatcherPrivate()
{
}
+void QFileSystemWatcherPrivate::connectEngine(QFileSystemWatcherEngine *engine)
+{
+ QObjectPrivate::connect(engine, &QFileSystemWatcherEngine::fileChanged,
+ this, &QFileSystemWatcherPrivate::fileChanged);
+ QObjectPrivate::connect(engine, &QFileSystemWatcherEngine::directoryChanged,
+ this, &QFileSystemWatcherPrivate::directoryChanged);
+}
+
void QFileSystemWatcherPrivate::init()
{
Q_Q(QFileSystemWatcher);
native = createNativeEngine(q);
if (native) {
- QObject::connect(native,
- SIGNAL(fileChanged(QString,bool)),
- q,
- SLOT(_q_fileChanged(QString,bool)));
- QObject::connect(native,
- SIGNAL(directoryChanged(QString,bool)),
- q,
- SLOT(_q_directoryChanged(QString,bool)));
+ connectEngine(native);
#if defined(Q_OS_WIN)
- QObject::connect(static_cast<QWindowsFileSystemWatcherEngine *>(native),
- &QWindowsFileSystemWatcherEngine::driveLockForRemoval,
- q, [this] (const QString &p) { _q_winDriveLockForRemoval(p); });
- QObject::connect(static_cast<QWindowsFileSystemWatcherEngine *>(native),
- &QWindowsFileSystemWatcherEngine::driveLockForRemovalFailed,
- q, [this] (const QString &p) { _q_winDriveLockForRemovalFailed(p); });
- QObject::connect(static_cast<QWindowsFileSystemWatcherEngine *>(native),
- &QWindowsFileSystemWatcherEngine::driveRemoved,
- q, [this] (const QString &p) { _q_winDriveRemoved(p); });
+ auto *windowsWatcher = static_cast<QWindowsFileSystemWatcherEngine *>(native);
+ using WinE = QWindowsFileSystemWatcherEngine;
+ QObjectPrivate::connect(windowsWatcher, &WinE::driveLockForRemoval,
+ this, &QFileSystemWatcherPrivate::winDriveLockForRemoval);
+ QObjectPrivate::connect(windowsWatcher, &WinE::driveLockForRemovalFailed,
+ this, &QFileSystemWatcherPrivate::winDriveLockForRemovalFailed);
+ QObjectPrivate::connect(windowsWatcher, &WinE::driveRemoved,
+ this, &QFileSystemWatcherPrivate::winDriveRemoved);
#endif // Q_OS_WIN
}
}
@@ -126,17 +92,10 @@ void QFileSystemWatcherPrivate::initPollerEngine()
Q_Q(QFileSystemWatcher);
poller = new QPollingFileSystemWatcherEngine(q); // that was a mouthful
- QObject::connect(poller,
- SIGNAL(fileChanged(QString,bool)),
- q,
- SLOT(_q_fileChanged(QString,bool)));
- QObject::connect(poller,
- SIGNAL(directoryChanged(QString,bool)),
- q,
- SLOT(_q_directoryChanged(QString,bool)));
+ connectEngine(poller);
}
-void QFileSystemWatcherPrivate::_q_fileChanged(const QString &path, bool removed)
+void QFileSystemWatcherPrivate::fileChanged(const QString &path, bool removed)
{
Q_Q(QFileSystemWatcher);
qCDebug(lcWatcher) << "file changed" << path << "removed?" << removed << "watching?" << files.contains(path);
@@ -149,7 +108,7 @@ void QFileSystemWatcherPrivate::_q_fileChanged(const QString &path, bool removed
emit q->fileChanged(path, QFileSystemWatcher::QPrivateSignal());
}
-void QFileSystemWatcherPrivate::_q_directoryChanged(const QString &path, bool removed)
+void QFileSystemWatcherPrivate::directoryChanged(const QString &path, bool removed)
{
Q_Q(QFileSystemWatcher);
qCDebug(lcWatcher) << "directory changed" << path << "removed?" << removed << "watching?" << directories.contains(path);
@@ -164,7 +123,7 @@ void QFileSystemWatcherPrivate::_q_directoryChanged(const QString &path, bool re
#if defined(Q_OS_WIN)
-void QFileSystemWatcherPrivate::_q_winDriveLockForRemoval(const QString &path)
+void QFileSystemWatcherPrivate::winDriveLockForRemoval(const QString &path)
{
// Windows: Request to lock a (removable/USB) drive for removal, release
// its paths under watch, temporarily storing them should the lock fail.
@@ -181,7 +140,7 @@ void QFileSystemWatcherPrivate::_q_winDriveLockForRemoval(const QString &path)
}
}
-void QFileSystemWatcherPrivate::_q_winDriveLockForRemovalFailed(const QString &path)
+void QFileSystemWatcherPrivate::winDriveLockForRemovalFailed(const QString &path)
{
// Windows: Request to lock a (removable/USB) drive failed (blocked by other
// application), restore the watched paths.
@@ -195,7 +154,7 @@ void QFileSystemWatcherPrivate::_q_winDriveLockForRemovalFailed(const QString &p
}
}
-void QFileSystemWatcherPrivate::_q_winDriveRemoved(const QString &path)
+void QFileSystemWatcherPrivate::winDriveRemoved(const QString &path)
{
// Windows: Drive finally removed, clear out paths stored in lock request.
if (!path.isEmpty())
@@ -364,14 +323,14 @@ QStringList QFileSystemWatcher::addPaths(const QStringList &paths)
#ifdef QT_BUILD_INTERNAL
const QString on = objectName();
- if (Q_UNLIKELY(on.startsWith(QLatin1String("_qt_autotest_force_engine_")))) {
+ if (Q_UNLIKELY(on.startsWith("_qt_autotest_force_engine_"_L1))) {
// Autotest override case - use the explicitly selected engine only
const auto forceName = QStringView{on}.mid(26);
- if (forceName == QLatin1String("poller")) {
+ if (forceName == "poller"_L1) {
qCDebug(lcWatcher, "QFileSystemWatcher: skipping native engine, using only polling engine");
d_func()->initPollerEngine();
return d->poller;
- } else if (forceName == QLatin1String("native")) {
+ } else if (forceName == "native"_L1) {
qCDebug(lcWatcher, "QFileSystemWatcher: skipping polling engine, using only native engine");
return d->native;
}
diff --git a/src/corelib/io/qfilesystemwatcher.h b/src/corelib/io/qfilesystemwatcher.h
index cd64115f8f..668bc143b2 100644
--- a/src/corelib/io/qfilesystemwatcher.h
+++ b/src/corelib/io/qfilesystemwatcher.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QFILESYSTEMWATCHER_H
#define QFILESYSTEMWATCHER_H
@@ -70,10 +34,6 @@ public:
Q_SIGNALS:
void fileChanged(const QString &path, QPrivateSignal);
void directoryChanged(const QString &path, QPrivateSignal);
-
-private:
- Q_PRIVATE_SLOT(d_func(), void _q_fileChanged(const QString &path, bool removed))
- Q_PRIVATE_SLOT(d_func(), void _q_directoryChanged(const QString &path, bool removed))
};
QT_END_NAMESPACE
diff --git a/src/corelib/io/qfilesystemwatcher_fsevents.mm b/src/corelib/io/qfilesystemwatcher_fsevents.mm
index b6d285cec3..0d9b84890a 100644
--- a/src/corelib/io/qfilesystemwatcher_fsevents.mm
+++ b/src/corelib/io/qfilesystemwatcher_fsevents.mm
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include <qplatformdefs.h>
@@ -217,8 +181,8 @@ void QFseventsFileSystemWatcherEngine::processEvent(ConstFSEventStreamRef stream
lastReceivedEvent = qMax(lastReceivedEvent, eventIds[i]);
QString path = QFile::decodeName(eventPaths[i]);
- if (path.endsWith(QDir::separator()))
- path = path.mid(0, path.size() - 1);
+ if (path.size() > 1 && path.endsWith(QDir::separator()))
+ path.chop(1);
if (eFlags & kFSEventStreamEventFlagMustScanSubDirs) {
DEBUG("\tmust rescan directory because of coalesced events");
@@ -346,8 +310,8 @@ QStringList QFseventsFileSystemWatcherEngine::addPaths(const QStringList &paths,
auto sg = qScopeGuard([&]{ unhandled.push_back(path); });
QString origPath = path.normalized(QString::NormalizationForm_C);
QString realPath = origPath;
- if (realPath.endsWith(QDir::separator()))
- realPath = realPath.mid(0, realPath.size() - 1);
+ if (realPath.size() > 1 && realPath.endsWith(QDir::separator()))
+ realPath.chop(1);
QString watchedPath, parentPath;
realPath = QFileInfo(realPath).canonicalFilePath();
@@ -437,8 +401,8 @@ QStringList QFseventsFileSystemWatcherEngine::removePaths(const QStringList &pat
for (const QString &origPath : paths) {
auto sg = qScopeGuard([&]{ unhandled.push_back(origPath); });
QString realPath = origPath;
- if (realPath.endsWith(QDir::separator()))
- realPath = realPath.mid(0, realPath.size() - 1);
+ if (realPath.size() > 1 && realPath.endsWith(QDir::separator()))
+ realPath.chop(1);
QFileInfo fi(realPath);
realPath = fi.canonicalFilePath();
diff --git a/src/corelib/io/qfilesystemwatcher_fsevents_p.h b/src/corelib/io/qfilesystemwatcher_fsevents_p.h
index ad23805afb..173ad1d52d 100644
--- a/src/corelib/io/qfilesystemwatcher_fsevents_p.h
+++ b/src/corelib/io/qfilesystemwatcher_fsevents_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QFILESYSTEMWATCHER_FSEVENTS_P_H
#define QFILESYSTEMWATCHER_FSEVENTS_P_H
diff --git a/src/corelib/io/qfilesystemwatcher_inotify.cpp b/src/corelib/io/qfilesystemwatcher_inotify.cpp
index 27e0b13b0b..e60f688110 100644
--- a/src/corelib/io/qfilesystemwatcher_inotify.cpp
+++ b/src/corelib/io/qfilesystemwatcher_inotify.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qfilesystemwatcher.h"
#include "qfilesystemwatcher_inotify_p.h"
@@ -253,13 +217,14 @@ QInotifyFileSystemWatcherEngine::QInotifyFileSystemWatcherEngine(int fd, QObject
notifier(fd, QSocketNotifier::Read, this)
{
fcntl(inotifyFd, F_SETFD, FD_CLOEXEC);
- connect(&notifier, SIGNAL(activated(QSocketDescriptor)), SLOT(readFromInotify()));
+ QObject::connect(&notifier, &QSocketNotifier::activated,
+ this, &QInotifyFileSystemWatcherEngine::readFromInotify);
}
QInotifyFileSystemWatcherEngine::~QInotifyFileSystemWatcherEngine()
{
notifier.setEnabled(false);
- for (int id : qAsConst(pathToID))
+ for (int id : std::as_const(pathToID))
inotify_rm_watch(inotifyFd, id < 0 ? -id : id);
::close(inotifyFd);
@@ -370,7 +335,7 @@ void QInotifyFileSystemWatcherEngine::readFromInotify()
return;
QVarLengthArray<char, 4096> buffer(buffSize);
- buffSize = read(inotifyFd, buffer.data(), buffSize);
+ buffSize = int(read(inotifyFd, buffer.data(), buffSize));
char *at = buffer.data();
char * const end = at + buffSize;
diff --git a/src/corelib/io/qfilesystemwatcher_inotify_p.h b/src/corelib/io/qfilesystemwatcher_inotify_p.h
index b63729cde4..05f87df14c 100644
--- a/src/corelib/io/qfilesystemwatcher_inotify_p.h
+++ b/src/corelib/io/qfilesystemwatcher_inotify_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QFILESYSTEMWATCHER_INOTIFY_P_H
#define QFILESYSTEMWATCHER_INOTIFY_P_H
diff --git a/src/corelib/io/qfilesystemwatcher_kqueue.cpp b/src/corelib/io/qfilesystemwatcher_kqueue.cpp
index 06383a103a..7a9be337bf 100644
--- a/src/corelib/io/qfilesystemwatcher_kqueue.cpp
+++ b/src/corelib/io/qfilesystemwatcher_kqueue.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include <qplatformdefs.h>
@@ -87,7 +51,7 @@ QKqueueFileSystemWatcherEngine::~QKqueueFileSystemWatcherEngine()
notifier.setEnabled(false);
close(kqfd);
- for (int id : qAsConst(pathToID))
+ for (int id : std::as_const(pathToID))
::close(id < 0 ? -id : id);
}
@@ -201,7 +165,7 @@ void QKqueueFileSystemWatcherEngine::readFromKqueue()
int r;
struct kevent kev;
struct timespec ts = { 0, 0 }; // 0 ts, because we want to poll
- EINTR_LOOP(r, kevent(kqfd, 0, 0, &kev, 1, &ts));
+ QT_EINTR_LOOP(r, kevent(kqfd, 0, 0, &kev, 1, &ts));
if (r < 0) {
perror("QKqueueFileSystemWatcherEngine: error during kevent wait");
return;
@@ -254,3 +218,5 @@ void QKqueueFileSystemWatcherEngine::readFromKqueue()
}
QT_END_NAMESPACE
+
+#include "moc_qfilesystemwatcher_kqueue_p.cpp"
diff --git a/src/corelib/io/qfilesystemwatcher_kqueue_p.h b/src/corelib/io/qfilesystemwatcher_kqueue_p.h
index ec92e1d667..05844d5be9 100644
--- a/src/corelib/io/qfilesystemwatcher_kqueue_p.h
+++ b/src/corelib/io/qfilesystemwatcher_kqueue_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QFILESYSTEMWATCHER_KQUEUE_P_H
#define QFILESYSTEMWATCHER_KQUEUE_P_H
diff --git a/src/corelib/io/qfilesystemwatcher_p.h b/src/corelib/io/qfilesystemwatcher_p.h
index cecfe03ff5..c34e3e2408 100644
--- a/src/corelib/io/qfilesystemwatcher_p.h
+++ b/src/corelib/io/qfilesystemwatcher_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QFILESYSTEMWATCHER_P_H
#define QFILESYSTEMWATCHER_P_H
@@ -105,13 +69,15 @@ public:
QStringList files, directories;
// private slots
- void _q_fileChanged(const QString &path, bool removed);
- void _q_directoryChanged(const QString &path, bool removed);
+ void fileChanged(const QString &path, bool removed);
+ void directoryChanged(const QString &path, bool removed);
+
+ void connectEngine(QFileSystemWatcherEngine *e);
#if defined(Q_OS_WIN)
- void _q_winDriveLockForRemoval(const QString &);
- void _q_winDriveLockForRemovalFailed(const QString &);
- void _q_winDriveRemoved(const QString &);
+ void winDriveLockForRemoval(const QString &);
+ void winDriveLockForRemovalFailed(const QString &);
+ void winDriveRemoved(const QString &);
private:
QHash<QChar, QStringList> temporarilyRemovedPaths;
diff --git a/src/corelib/io/qfilesystemwatcher_polling.cpp b/src/corelib/io/qfilesystemwatcher_polling.cpp
index 6920eab258..d34c8c49e8 100644
--- a/src/corelib/io/qfilesystemwatcher_polling.cpp
+++ b/src/corelib/io/qfilesystemwatcher_polling.cpp
@@ -1,53 +1,25 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qfilesystemwatcher_polling_p.h"
+
+#include <QtCore/qlatin1stringview.h>
#include <QtCore/qscopeguard.h>
#include <QtCore/qtimer.h>
+#include <chrono>
+
+using namespace std::chrono_literals;
+
QT_BEGIN_NAMESPACE
+using namespace Qt::StringLiterals;
+
+static constexpr auto PollingInterval = 1s;
+
QPollingFileSystemWatcherEngine::QPollingFileSystemWatcherEngine(QObject *parent)
- : QFileSystemWatcherEngine(parent),
- timer(this)
+ : QFileSystemWatcherEngine(parent)
{
- connect(&timer, SIGNAL(timeout()), SLOT(timeout()));
}
QStringList QPollingFileSystemWatcherEngine::addPaths(const QStringList &paths,
@@ -64,8 +36,8 @@ QStringList QPollingFileSystemWatcherEngine::addPaths(const QStringList &paths,
if (directories->contains(path))
continue;
directories->append(path);
- if (!path.endsWith(QLatin1Char('/')))
- fi = QFileInfo(path + QLatin1Char('/'));
+ if (!path.endsWith(u'/'))
+ fi = QFileInfo(path + u'/');
this->directories.insert(path, fi);
} else {
if (files->contains(path))
@@ -76,10 +48,17 @@ QStringList QPollingFileSystemWatcherEngine::addPaths(const QStringList &paths,
sg.dismiss();
}
+ std::chrono::milliseconds interval = PollingInterval;
+#ifdef QT_BUILD_INTERNAL
+ if (Q_UNLIKELY(parent()->objectName().startsWith("_qt_autotest_force_engine_"_L1))) {
+ interval = 10ms; // Special case to speed up the unittests
+ }
+#endif
+
if ((!this->files.isEmpty() ||
!this->directories.isEmpty()) &&
!timer.isActive()) {
- timer.start(PollingInterval);
+ timer.start(interval, this);
}
return unhandled;
@@ -108,8 +87,11 @@ QStringList QPollingFileSystemWatcherEngine::removePaths(const QStringList &path
return unhandled;
}
-void QPollingFileSystemWatcherEngine::timeout()
+void QPollingFileSystemWatcherEngine::timerEvent(QTimerEvent *e)
{
+ if (e->timerId() != timer.timerId())
+ return QFileSystemWatcherEngine::timerEvent(e);
+
for (auto it = files.begin(), end = files.end(); it != end; /*erasing*/) {
QString path = it.key();
QFileInfo fi(path);
@@ -127,8 +109,8 @@ void QPollingFileSystemWatcherEngine::timeout()
for (auto it = directories.begin(), end = directories.end(); it != end; /*erasing*/) {
QString path = it.key();
QFileInfo fi(path);
- if (!path.endsWith(QLatin1Char('/')))
- fi = QFileInfo(path + QLatin1Char('/'));
+ if (!path.endsWith(u'/'))
+ fi = QFileInfo(path + u'/');
if (!fi.exists()) {
it = directories.erase(it);
emit directoryChanged(path, true);
diff --git a/src/corelib/io/qfilesystemwatcher_polling_p.h b/src/corelib/io/qfilesystemwatcher_polling_p.h
index e60132381b..b65ff05575 100644
--- a/src/corelib/io/qfilesystemwatcher_polling_p.h
+++ b/src/corelib/io/qfilesystemwatcher_polling_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QFILESYSTEMWATCHER_POLLING_P_H
#define QFILESYSTEMWATCHER_POLLING_P_H
@@ -51,11 +15,11 @@
// We mean it.
//
+#include <QtCore/qbasictimer.h>
#include <QtCore/qfileinfo.h>
#include <QtCore/qmutex.h>
#include <QtCore/qdatetime.h>
#include <QtCore/qdir.h>
-#include <QtCore/qtimer.h>
#include <QtCore/qhash.h>
#include "qfilesystemwatcher_p.h"
@@ -63,8 +27,6 @@
QT_REQUIRE_CONFIG(filesystemwatcher);
QT_BEGIN_NAMESPACE
-enum { PollingInterval = 1000 };
-
class QPollingFileSystemWatcherEngine : public QFileSystemWatcherEngine
{
Q_OBJECT
@@ -82,7 +44,7 @@ class QPollingFileSystemWatcherEngine : public QFileSystemWatcherEngine
: ownerId(fileInfo.ownerId()),
groupId(fileInfo.groupId()),
permissions(fileInfo.permissions()),
- lastModified(fileInfo.lastModified())
+ lastModified(fileInfo.lastModified(QTimeZone::UTC))
{
if (fileInfo.isDir()) {
entries = fileInfo.absoluteDir().entryList(QDir::AllEntries);
@@ -101,7 +63,7 @@ class QPollingFileSystemWatcherEngine : public QFileSystemWatcherEngine
return (ownerId != fileInfo.ownerId()
|| groupId != fileInfo.groupId()
|| permissions != fileInfo.permissions()
- || lastModified != fileInfo.lastModified());
+ || lastModified != fileInfo.lastModified(QTimeZone::UTC));
}
};
@@ -113,11 +75,11 @@ public:
QStringList addPaths(const QStringList &paths, QStringList *files, QStringList *directories) override;
QStringList removePaths(const QStringList &paths, QStringList *files, QStringList *directories) override;
-private Q_SLOTS:
- void timeout();
+private:
+ void timerEvent(QTimerEvent *) final;
private:
- QTimer timer;
+ QBasicTimer timer;
};
QT_END_NAMESPACE
diff --git a/src/corelib/io/qfilesystemwatcher_win.cpp b/src/corelib/io/qfilesystemwatcher_win.cpp
index 5d8a5b3682..5418265ba2 100644
--- a/src/corelib/io/qfilesystemwatcher_win.cpp
+++ b/src/corelib/io/qfilesystemwatcher_win.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qfilesystemwatcher.h"
#include "qfilesystemwatcher_win_p.h"
@@ -63,6 +27,8 @@
QT_BEGIN_NAMESPACE
+using namespace Qt::StringLiterals;
+
// #define WINQFSW_DEBUG
#ifdef WINQFSW_DEBUG
# define DEBUG qDebug
@@ -75,8 +41,8 @@ static Qt::HANDLE createChangeNotification(const QString &path, uint flags)
// Volume and folder paths need a trailing slash for proper notification
// (e.g. "c:" -> "c:/").
QString nativePath = QDir::toNativeSeparators(path);
- if ((flags & FILE_NOTIFY_CHANGE_ATTRIBUTES) == 0 && !nativePath.endsWith(QLatin1Char('\\')))
- nativePath.append(QLatin1Char('\\'));
+ if ((flags & FILE_NOTIFY_CHANGE_ATTRIBUTES) == 0 && !nativePath.endsWith(u'\\'))
+ nativePath.append(u'\\');
const HANDLE result = FindFirstChangeNotification(reinterpret_cast<const wchar_t *>(nativePath.utf16()),
FALSE, flags);
DEBUG() << __FUNCTION__ << nativePath << Qt::hex << Qt::showbase << flags << "returns" << result;
@@ -274,7 +240,7 @@ bool QWindowsRemovableDriveListener::nativeEventFilter(const QByteArray &, void
// Set up listening for WM_DEVICECHANGE+DBT_CUSTOMEVENT for a removable drive path,
void QWindowsRemovableDriveListener::addPath(const QString &p)
{
- const wchar_t drive = p.size() >= 2 && p.at(0).isLetter() && p.at(1) == QLatin1Char(':')
+ const wchar_t drive = p.size() >= 2 && p.at(0).isLetter() && p.at(1) == u':'
? wchar_t(p.at(0).toUpper().unicode()) : L'\0';
if (!drive)
return;
@@ -351,9 +317,9 @@ QWindowsFileSystemWatcherEngine::QWindowsFileSystemWatcherEngine(QObject *parent
QWindowsFileSystemWatcherEngine::~QWindowsFileSystemWatcherEngine()
{
- for (auto *thread : qAsConst(threads))
+ for (auto *thread : std::as_const(threads))
thread->stop();
- for (auto *thread : qAsConst(threads))
+ for (auto *thread : std::as_const(threads))
thread->wait();
qDeleteAll(threads);
}
@@ -366,12 +332,7 @@ QStringList QWindowsFileSystemWatcherEngine::addPaths(const QStringList &paths,
QStringList unhandled;
for (const QString &path : paths) {
auto sg = qScopeGuard([&] { unhandled.push_back(path); });
- QString normalPath = path;
- if ((normalPath.endsWith(QLatin1Char('/')) && !normalPath.endsWith(QLatin1String(":/")))
- || (normalPath.endsWith(QLatin1Char('\\')) && !normalPath.endsWith(QLatin1String(":\\")))) {
- normalPath.chop(1);
- }
- QFileInfo fileInfo(normalPath);
+ QFileInfo fileInfo(path);
fileInfo.stat();
if (!fileInfo.exists())
continue;
@@ -385,7 +346,7 @@ QStringList QWindowsFileSystemWatcherEngine::addPaths(const QStringList &paths,
continue;
}
- DEBUG() << "Looking for a thread/handle for" << normalPath;
+ DEBUG() << "Looking for a thread/handle for" << fileInfo.path();
const QString absolutePath = isDir ? fileInfo.absoluteFilePath() : fileInfo.absolutePath();
const uint flags = isDir
@@ -467,7 +428,7 @@ QStringList QWindowsFileSystemWatcherEngine::addPaths(const QStringList &paths,
// now look for a thread to insert
bool found = false;
- for (QWindowsFileSystemWatcherEngineThread *thread : qAsConst(threads)) {
+ for (QWindowsFileSystemWatcherEngineThread *thread : std::as_const(threads)) {
const auto locker = qt_scoped_lock(thread->mutex);
if (thread->handles.count() < MAXIMUM_WAIT_OBJECTS) {
DEBUG() << "Added handle" << handle.handle << "for" << absolutePath << "to watch" << fileInfo.absoluteFilePath()
@@ -529,11 +490,8 @@ QStringList QWindowsFileSystemWatcherEngine::removePaths(const QStringList &path
QStringList unhandled;
for (const QString &path : paths) {
auto sg = qScopeGuard([&] { unhandled.push_back(path); });
- QString normalPath = path;
- if (normalPath.endsWith(QLatin1Char('/')) || normalPath.endsWith(QLatin1Char('\\')))
- normalPath.chop(1);
- QFileInfo fileInfo(normalPath);
- DEBUG() << "removing" << normalPath;
+ QFileInfo fileInfo(path);
+ DEBUG() << "removing" << fileInfo.path();
QString absolutePath = fileInfo.absoluteFilePath();
QList<QWindowsFileSystemWatcherEngineThread *>::iterator jt, end;
end = threads.end();
@@ -620,7 +578,7 @@ QWindowsFileSystemWatcherEngineThread::~QWindowsFileSystemWatcherEngineThread()
CloseHandle(handles.at(0));
handles[0] = INVALID_HANDLE_VALUE;
- for (HANDLE h : qAsConst(handles)) {
+ for (HANDLE h : std::as_const(handles)) {
if (h == INVALID_HANDLE_VALUE)
continue;
FindCloseChangeNotification(h);
@@ -631,10 +589,10 @@ Q_DECL_COLD_FUNCTION
static QString msgFindNextFailed(const QWindowsFileSystemWatcherEngineThread::PathInfoHash &pathInfos)
{
QString str;
- str += QLatin1String("QFileSystemWatcher: FindNextChangeNotification failed for");
+ str += "QFileSystemWatcher: FindNextChangeNotification failed for"_L1;
for (const QWindowsFileSystemWatcherEngine::PathInfo &pathInfo : pathInfos)
- str += QLatin1String(" \"") + QDir::toNativeSeparators(pathInfo.absolutePath) + QLatin1Char('"');
- str += QLatin1Char(' ');
+ str += " \""_L1 + QDir::toNativeSeparators(pathInfo.absolutePath) + u'"';
+ str += u' ';
return str;
}
@@ -750,3 +708,4 @@ void QWindowsFileSystemWatcherEngineThread::wakeup()
QT_END_NAMESPACE
# include "qfilesystemwatcher_win.moc"
+# include "moc_qfilesystemwatcher_win_p.cpp"
diff --git a/src/corelib/io/qfilesystemwatcher_win_p.h b/src/corelib/io/qfilesystemwatcher_win_p.h
index 778ed8ce23..79cec00c39 100644
--- a/src/corelib/io/qfilesystemwatcher_win_p.h
+++ b/src/corelib/io/qfilesystemwatcher_win_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QFILESYSTEMWATCHER_WIN_P_H
#define QFILESYSTEMWATCHER_WIN_P_H
@@ -140,7 +104,10 @@ public:
Q_DECLARE_TYPEINFO(QFileSystemWatcherPathKey, Q_RELOCATABLE_TYPE);
-inline size_t qHash(const QFileSystemWatcherPathKey &key) { return qHash(key.toCaseFolded()); }
+inline size_t qHash(const QFileSystemWatcherPathKey &key, size_t seed = 0)
+{
+ return qHash(key.toCaseFolded(), seed);
+}
class QWindowsFileSystemWatcherEngineThread : public QThread
{
diff --git a/src/corelib/io/qfsfileengine.cpp b/src/corelib/io/qfsfileengine.cpp
index 4ba35abacb..f49106edd4 100644
--- a/src/corelib/io/qfsfileengine.cpp
+++ b/src/corelib/io/qfsfileengine.cpp
@@ -1,48 +1,11 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2016 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qfsfileengine_p.h"
#include "qfsfileengine_iterator_p.h"
#include "qfilesystemengine_p.h"
#include "qdatetime.h"
-#include "qdiriterator.h"
#include "qset.h"
#include <QtCore/qdebug.h>
@@ -54,12 +17,14 @@
#endif
#include <stdio.h>
#include <stdlib.h>
-#if defined(Q_OS_MAC)
+#if defined(Q_OS_DARWIN)
# include <private/qcore_mac_p.h>
#endif
QT_BEGIN_NAMESPACE
+using namespace Qt::StringLiterals;
+
#ifdef Q_OS_WIN
# ifndef S_ISREG
# define S_ISREG(x) (((x) & S_IFMT) == S_IFREG)
@@ -173,14 +138,14 @@ ProcessOpenModeResult processOpenModeFlags(QIODevice::OpenMode openMode)
result.ok = false;
if ((openMode & QFile::NewOnly) && (openMode & QFile::ExistingOnly)) {
qWarning("NewOnly and ExistingOnly are mutually exclusive");
- result.error = QLatin1String("NewOnly and ExistingOnly are mutually exclusive");
+ result.error = "NewOnly and ExistingOnly are mutually exclusive"_L1;
return result;
}
if ((openMode & QFile::ExistingOnly) && !(openMode & (QFile::ReadOnly | QFile::WriteOnly))) {
qWarning("ExistingOnly must be specified alongside ReadOnly, WriteOnly, or ReadWrite");
- result.error = QLatin1String(
- "ExistingOnly must be specified alongside ReadOnly, WriteOnly, or ReadWrite");
+ result.error =
+ "ExistingOnly must be specified alongside ReadOnly, WriteOnly, or ReadWrite"_L1;
return result;
}
@@ -235,7 +200,7 @@ bool QFSFileEngine::open(QIODevice::OpenMode openMode,
Q_D(QFSFileEngine);
if (d->fileEntry.isEmpty()) {
qWarning("QFSFileEngine::open: No file name specified");
- setError(QFile::OpenError, QLatin1String("No file name specified"));
+ setError(QFile::OpenError, "No file name specified"_L1);
return false;
}
@@ -307,7 +272,7 @@ bool QFSFileEnginePrivate::openFh(QIODevice::OpenMode openMode, FILE *fh)
if (ret != 0) {
q->setError(errno == EMFILE ? QFile::ResourceError : QFile::OpenError,
- QSystemError::stdString());
+ QSystemError::stdString(errno));
this->openMode = QIODevice::NotOpen;
this->fh = nullptr;
@@ -362,14 +327,14 @@ bool QFSFileEnginePrivate::openFd(QIODevice::OpenMode openMode, int fd)
// Seek to the end when in Append mode.
if (openMode & QFile::Append) {
- int ret;
+ QT_OFF_T ret;
do {
ret = QT_LSEEK(fd, 0, SEEK_END);
} while (ret == -1 && errno == EINTR);
if (ret == -1) {
q->setError(errno == EMFILE ? QFile::ResourceError : QFile::OpenError,
- QSystemError::stdString());
+ QSystemError::stdString(errno));
this->openMode = QIODevice::NotOpen;
this->fd = -1;
@@ -428,7 +393,7 @@ bool QFSFileEnginePrivate::closeFdFh()
if (!flushed || !closed) {
if (flushed) {
// If not flushed, we want the flush error to fall through.
- q->setError(QFile::UnspecifiedError, QSystemError::stdString());
+ q->setError(QFile::UnspecifiedError, QSystemError::stdString(errno));
}
return false;
}
@@ -480,7 +445,7 @@ bool QFSFileEnginePrivate::flushFh()
if (ret != 0) {
q->setError(errno == ENOSPC ? QFile::ResourceError : QFile::WriteError,
- QSystemError::stdString());
+ QSystemError::stdString(errno));
return false;
}
return true;
@@ -502,7 +467,7 @@ void QFSFileEnginePrivate::unmapAll()
{
if (!maps.isEmpty()) {
const QList<uchar*> keys = maps.keys(); // Make a copy since unmap() modifies the map.
- for (int i = 0; i < keys.count(); ++i)
+ for (int i = 0; i < keys.size(); ++i)
unmap(keys.at(i));
}
}
@@ -555,11 +520,11 @@ bool QFSFileEngine::seek(qint64 pos)
/*!
\reimp
*/
-QDateTime QFSFileEngine::fileTime(FileTime time) const
+QDateTime QFSFileEngine::fileTime(QFile::FileTime time) const
{
Q_D(const QFSFileEngine);
- if (time == AccessTime) {
+ if (time == QFile::FileAccessTime) {
// always refresh for the access time
d->metaData.clearFlags(QFileSystemMetaData::AccessTime);
}
@@ -595,14 +560,14 @@ bool QFSFileEnginePrivate::seekFdFh(qint64 pos)
} while (ret != 0 && errno == EINTR);
if (ret != 0) {
- q->setError(QFile::ReadError, QSystemError::stdString());
+ q->setError(QFile::ReadError, QSystemError::stdString(errno));
return false;
}
} else {
// Unbuffered stdio mode.
if (QT_LSEEK(fd, QT_OFF_T(pos), SEEK_SET) == -1) {
+ q->setError(QFile::PositionError, QSystemError::stdString(errno));
qWarning("QFile::at: Cannot set file position %lld", pos);
- q->setError(QFile::PositionError, QSystemError::stdString());
return false;
}
}
@@ -655,17 +620,15 @@ qint64 QFSFileEnginePrivate::readFdFh(char *data, qint64 len)
// Buffered stdlib mode.
size_t result;
- bool retry = true;
do {
result = fread(data + readBytes, 1, size_t(len - readBytes), fh);
- eof = feof(fh);
- if (retry && eof && result == 0) {
+ eof = feof(fh); // Doesn't change errno
+ if (eof && result == 0) {
// On OS X, this is needed, e.g., if a file was written to
// through another stream since our last read. See test
// tst_QFile::appendAndRead
QT_FSEEK(fh, QT_FTELL(fh), SEEK_SET); // re-sync stream.
- retry = false;
- continue;
+ break;
}
readBytes += result;
} while (!eof && (result == 0 ? errno == EINTR : readBytes < len));
@@ -685,12 +648,13 @@ qint64 QFSFileEnginePrivate::readFdFh(char *data, qint64 len)
result = QT_READ(fd, data + readBytes, chunkSize);
} while (result > 0 && (readBytes += result) < len);
- eof = !(result == -1);
+ // QT_READ (::read()) returns 0 to indicate end-of-file
+ eof = result == 0;
}
if (!eof && readBytes == 0) {
readBytes = -1;
- q->setError(QFile::ReadError, QSystemError::stdString());
+ q->setError(QFile::ReadError, QSystemError::stdString(errno));
}
return readBytes;
@@ -735,8 +699,8 @@ qint64 QFSFileEnginePrivate::readLineFdFh(char *data, qint64 maxlen)
// does the same, so we'd get two '\0' at the end - passing maxlen + 1
// solves this.
if (!fgets(data, int(maxlen + 1), fh)) {
- if (!feof(fh))
- q->setError(QFile::ReadError, QSystemError::stdString());
+ if (!feof(fh)) // Doesn't change errno
+ q->setError(QFile::ReadError, QSystemError::stdString(errno));
return -1; // error
}
@@ -813,7 +777,8 @@ qint64 QFSFileEnginePrivate::writeFdFh(const char *data, qint64 len)
if (len && writtenBytes == 0) {
writtenBytes = -1;
- q->setError(errno == ENOSPC ? QFile::ResourceError : QFile::WriteError, QSystemError::stdString());
+ q->setError(errno == ENOSPC ? QFile::ResourceError : QFile::WriteError,
+ QSystemError::stdString(errno));
} else {
// reset the cached size, if any
metaData.clearFlags(QFileSystemMetaData::SizeAttribute);
@@ -826,18 +791,13 @@ qint64 QFSFileEnginePrivate::writeFdFh(const char *data, qint64 len)
/*!
\internal
*/
-QAbstractFileEngine::Iterator *QFSFileEngine::beginEntryList(QDir::Filters filters, const QStringList &filterNames)
+QAbstractFileEngine::IteratorUniquePtr
+QFSFileEngine::beginEntryList(const QString &path, QDir::Filters filters,
+ const QStringList &filterNames)
{
- return new QFSFileEngineIterator(filters, filterNames);
+ return std::make_unique<QFSFileEngineIterator>(path, filters, filterNames);
}
-/*!
- \internal
-*/
-QAbstractFileEngine::Iterator *QFSFileEngine::endEntryList()
-{
- return nullptr;
-}
#endif // QT_NO_FILESYSTEMITERATOR
/*!
@@ -940,7 +900,7 @@ bool QFSFileEngine::supportsExtension(Extension extension) const
\reimp
*/
-/*! \fn bool QFSFileEngine::setFileTime(const QDateTime &newDate, QAbstractFileEngine::FileTime time)
+/*! \fn bool QFSFileEngine::setFileTime(const QDateTime &newDate, QFile::FileTime time)
\reimp
*/
@@ -1030,29 +990,32 @@ bool QFSFileEngine::remove()
return ret;
}
-/*!
- \reimp
+/*
+ An alternative to setFileName() when you have already constructed
+ a QFileSystemEntry.
*/
-bool QFSFileEngine::rename(const QString &newName)
+void QFSFileEngine::setFileEntry(QFileSystemEntry &&entry)
{
Q_D(QFSFileEngine);
- QSystemError error;
- bool ret = QFileSystemEngine::renameFile(d->fileEntry, QFileSystemEntry(newName), error);
- if (!ret)
- setError(QFile::RenameError, error.toString());
- return ret;
+ d->init();
+ d->fileEntry = std::move(entry);
}
-/*!
- \reimp
-*/
-bool QFSFileEngine::renameOverwrite(const QString &newName)
+
+bool QFSFileEngine::rename_helper(const QString &newName, RenameMode mode)
{
Q_D(QFSFileEngine);
+
+ auto func = mode == Rename ? QFileSystemEngine::renameFile
+ : QFileSystemEngine::renameOverwriteFile;
QSystemError error;
- bool ret = QFileSystemEngine::renameOverwriteFile(d->fileEntry, QFileSystemEntry(newName), error);
- if (!ret)
+ auto newEntry = QFileSystemEntry(newName);
+ const bool ret = func(d->fileEntry, newEntry, error);
+ if (!ret) {
setError(QFile::RenameError, error.toString());
- return ret;
+ return false;
+ }
+ setFileEntry(std::move(newEntry));
+ return true;
}
/*!
diff --git a/src/corelib/io/qfsfileengine_iterator.cpp b/src/corelib/io/qfsfileengine_iterator.cpp
index 2494ea856c..fb0332f7f3 100644
--- a/src/corelib/io/qfsfileengine_iterator.cpp
+++ b/src/corelib/io/qfsfileengine_iterator.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qfsfileengine_iterator_p.h"
#include "qfileinfo_p.h"
@@ -45,9 +9,10 @@
QT_BEGIN_NAMESPACE
-QFSFileEngineIterator::QFSFileEngineIterator(QDir::Filters filters, const QStringList &filterNames)
- : QAbstractFileEngineIterator(filters, filterNames)
- , done(false)
+QFSFileEngineIterator::QFSFileEngineIterator(const QString &path, QDir::Filters filters,
+ const QStringList &filterNames)
+ : QAbstractFileEngineIterator(path, filters, filterNames),
+ nativeIterator(new QFileSystemIterator(QFileSystemEntry(path), filters))
{
}
@@ -55,48 +20,30 @@ QFSFileEngineIterator::~QFSFileEngineIterator()
{
}
-bool QFSFileEngineIterator::hasNext() const
+bool QFSFileEngineIterator::advance()
{
- if (!done && !nativeIterator) {
- nativeIterator.reset(new QFileSystemIterator(QFileSystemEntry(path()),
- filters(), nameFilters()));
- advance();
- }
-
- return !done;
-}
-
-QString QFSFileEngineIterator::next()
-{
- if (!hasNext())
- return QString();
-
- advance();
- return currentFilePath();
-}
-
-void QFSFileEngineIterator::advance() const
-{
- currentInfo = nextInfo;
+ if (!nativeIterator)
+ return false;
QFileSystemEntry entry;
QFileSystemMetaData data;
if (nativeIterator->advance(entry, data)) {
- nextInfo = QFileInfo(new QFileInfoPrivate(entry, data));
+ m_fileInfo = QFileInfo(new QFileInfoPrivate(entry, data));
+ return true;
} else {
- done = true;
nativeIterator.reset();
+ return false;
}
}
QString QFSFileEngineIterator::currentFileName() const
{
- return currentInfo.fileName();
+ return m_fileInfo.fileName();
}
QFileInfo QFSFileEngineIterator::currentFileInfo() const
{
- return currentInfo;
+ return m_fileInfo;
}
QT_END_NAMESPACE
diff --git a/src/corelib/io/qfsfileengine_iterator_p.h b/src/corelib/io/qfsfileengine_iterator_p.h
index bde00bf578..b91c5d9973 100644
--- a/src/corelib/io/qfsfileengine_iterator_p.h
+++ b/src/corelib/io/qfsfileengine_iterator_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QFSFILEENGINE_ITERATOR_P_H
#define QFSFILEENGINE_ITERATOR_P_H
@@ -59,27 +23,19 @@
QT_BEGIN_NAMESPACE
-class QFSFileEngineIteratorPrivate;
-class QFSFileEngineIteratorPlatformSpecificData;
-
class QFSFileEngineIterator : public QAbstractFileEngineIterator
{
public:
- QFSFileEngineIterator(QDir::Filters filters, const QStringList &filterNames);
+ QFSFileEngineIterator(const QString &path, QDir::Filters filters, const QStringList &filterNames);
~QFSFileEngineIterator();
- QString next() override;
- bool hasNext() const override;
+ bool advance() override;
QString currentFileName() const override;
QFileInfo currentFileInfo() const override;
private:
- void advance() const;
mutable QScopedPointer<QFileSystemIterator> nativeIterator;
- mutable QFileInfo currentInfo;
- mutable QFileInfo nextInfo;
- mutable bool done;
};
QT_END_NAMESPACE
diff --git a/src/corelib/io/qfsfileengine_p.h b/src/corelib/io/qfsfileengine_p.h
index 4ebba61bb6..dfc40e20b6 100644
--- a/src/corelib/io/qfsfileengine_p.h
+++ b/src/corelib/io/qfsfileengine_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QFSFILEENGINE_P_H
#define QFSFILEENGINE_P_H
@@ -96,8 +60,12 @@ public:
bool isSequential() const override;
bool remove() override;
bool copy(const QString &newName) override;
- bool rename(const QString &newName) override;
- bool renameOverwrite(const QString &newName) override;
+
+ bool rename(const QString &newName) override
+ { return rename_helper(newName, Rename); }
+ bool renameOverwrite(const QString &newName) override
+ { return rename_helper(newName, RenameOverwrite); }
+
bool link(const QString &newName) override;
bool mkdir(const QString &dirName, bool createParentDirectories,
std::optional<QFile::Permissions> permissions) const override;
@@ -112,14 +80,15 @@ public:
QString fileName(FileName file) const override;
uint ownerId(FileOwner) const override;
QString owner(FileOwner) const override;
- bool setFileTime(const QDateTime &newDate, FileTime time) override;
- QDateTime fileTime(FileTime time) const override;
+ bool setFileTime(const QDateTime &newDate, QFile::FileTime time) override;
+ QDateTime fileTime(QFile::FileTime time) const override;
void setFileName(const QString &file) override;
+ void setFileEntry(QFileSystemEntry &&entry);
int handle() const override;
#ifndef QT_NO_FILESYSTEMITERATOR
- Iterator *beginEntryList(QDir::Filters filters, const QStringList &filterNames) override;
- Iterator *endEntryList() override;
+ IteratorUniquePtr beginEntryList(const QString &path, QDir::Filters filters,
+ const QStringList &filterNames) override;
#endif
qint64 read(char *data, qint64 maxlen) override;
@@ -146,6 +115,10 @@ public:
protected:
QFSFileEngine(QFSFileEnginePrivate &dd);
+
+private:
+ enum RenameMode : int { Rename, RenameOverwrite };
+ bool rename_helper(const QString &newName, RenameMode mode);
};
class Q_AUTOTEST_EXPORT QFSFileEnginePrivate : public QAbstractFileEnginePrivate
@@ -187,6 +160,9 @@ public:
#ifndef Q_OS_WIN
bool isSequentialFdFh() const;
#endif
+#ifdef Q_OS_WIN
+ bool nativeRenameOverwrite(const QFileSystemEntry &newEntry);
+#endif
uchar *map(qint64 offset, qint64 size, QFile::MemoryMapFlags flags);
bool unmap(uchar *ptr);
diff --git a/src/corelib/io/qfsfileengine_unix.cpp b/src/corelib/io/qfsfileengine_unix.cpp
index d071c85cb3..5806689182 100644
--- a/src/corelib/io/qfsfileengine_unix.cpp
+++ b/src/corelib/io/qfsfileengine_unix.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qplatformdefs.h"
#include "private/qabstractfileengine_p.h"
@@ -101,7 +65,7 @@ static inline QString msgOpenDirectory()
#if QT_CONFIG(translation)
return QIODevice::tr(message);
#else
- return QLatin1String(message);
+ return QLatin1StringView(message);
#endif
}
@@ -151,14 +115,14 @@ bool QFSFileEnginePrivate::nativeOpenImpl(QIODevice::OpenMode openMode, mode_t m
// Seek to the end when in Append mode.
if (flags & QFile::Append) {
- int ret;
+ QT_OFF_T ret;
do {
ret = QT_LSEEK(fd, 0, SEEK_END);
} while (ret == -1 && errno == EINTR);
if (ret == -1) {
q->setError(errno == EMFILE ? QFile::ResourceError : QFile::OpenError,
- qt_error_string(int(errno)));
+ qt_error_string(errno));
return false;
}
}
@@ -196,9 +160,9 @@ bool QFSFileEnginePrivate::nativeSyncToDisk()
Q_Q(QFSFileEngine);
int ret;
#if defined(_POSIX_SYNCHRONIZED_IO) && _POSIX_SYNCHRONIZED_IO > 0
- EINTR_LOOP(ret, fdatasync(nativeHandle()));
+ QT_EINTR_LOOP(ret, fdatasync(nativeHandle()));
#else
- EINTR_LOOP(ret, fsync(nativeHandle()));
+ QT_EINTR_LOOP(ret, fsync(nativeHandle()));
#endif
if (ret != 0)
q->setError(QFile::WriteError, qt_error_string(errno));
@@ -257,7 +221,7 @@ qint64 QFSFileEnginePrivate::nativeRead(char *data, qint64 len)
}
if (readBytes == 0 && !feof(fh)) {
// if we didn't read anything and we're not at EOF, it must be an error
- q->setError(QFile::ReadError, qt_error_string(int(errno)));
+ q->setError(QFile::ReadError, qt_error_string(errno));
return -1;
}
return readBytes;
@@ -486,6 +450,12 @@ QString QFSFileEngine::fileName(FileName file) const
return entry.filePath();
}
return QString();
+ case RawLinkPath:
+ if (d->isSymlink()) {
+ QFileSystemEntry entry = QFileSystemEngine::getRawLinkPath(d->fileEntry, d->metaData);
+ return entry.filePath();
+ }
+ return QString();
case JunctionName:
return QString();
case DefaultName:
@@ -498,7 +468,8 @@ QString QFSFileEngine::fileName(FileName file) const
bool QFSFileEngine::isRelativePath() const
{
Q_D(const QFSFileEngine);
- return d->fileEntry.filePath().length() ? d->fileEntry.filePath().at(0) != QLatin1Char('/') : true;
+ const QString fp = d->fileEntry.filePath();
+ return fp.isEmpty() || fp.at(0) != u'/';
}
uint QFSFileEngine::ownerId(FileOwner own) const
@@ -524,6 +495,10 @@ bool QFSFileEngine::setPermissions(uint perms)
Q_D(QFSFileEngine);
QSystemError error;
bool ok;
+
+ // clear cached state (if any)
+ d->metaData.clearFlags(QFileSystemMetaData::Permissions);
+
if (d->fd != -1)
ok = QFileSystemEngine::setPermissions(d->fd, QFile::Permissions(perms), error);
else
@@ -550,7 +525,7 @@ bool QFSFileEngine::setSize(qint64 size)
return ret;
}
-bool QFSFileEngine::setFileTime(const QDateTime &newDate, FileTime time)
+bool QFSFileEngine::setFileTime(const QDateTime &newDate, QFile::FileTime time)
{
Q_D(QFSFileEngine);
@@ -585,16 +560,16 @@ uchar *QFSFileEnginePrivate::map(qint64 offset, qint64 size, QFile::MemoryMapFla
Q_Q(QFSFileEngine);
if (openMode == QIODevice::NotOpen) {
- q->setError(QFile::PermissionsError, qt_error_string(int(EACCES)));
+ q->setError(QFile::PermissionsError, qt_error_string(EACCES));
return nullptr;
}
if (offset < 0 || offset > maxFileOffset
- || size < 0 || quint64(size) > quint64(size_t(-1))) {
- q->setError(QFile::UnspecifiedError, qt_error_string(int(EINVAL)));
+ || size <= 0
+ || quint64(size) > quint64(size_t(-1))) {
+ q->setError(QFile::UnspecifiedError, qt_error_string(EINVAL));
return nullptr;
}
-
// If we know the mapping will extend beyond EOF, fail early to avoid
// undefined behavior. Otherwise, let mmap have its say.
if (doStat(QFileSystemMetaData::SizeAttribute)
@@ -619,7 +594,7 @@ uchar *QFSFileEnginePrivate::map(qint64 offset, qint64 size, QFile::MemoryMapFla
int extra = offset % pageSize;
if (quint64(size + extra) > quint64((size_t)-1)) {
- q->setError(QFile::UnspecifiedError, qt_error_string(int(EINVAL)));
+ q->setError(QFile::UnspecifiedError, qt_error_string(EINVAL));
return nullptr;
}
@@ -637,16 +612,16 @@ uchar *QFSFileEnginePrivate::map(qint64 offset, qint64 size, QFile::MemoryMapFla
switch(errno) {
case EBADF:
- q->setError(QFile::PermissionsError, qt_error_string(int(EACCES)));
+ q->setError(QFile::PermissionsError, qt_error_string(EACCES));
break;
case ENFILE:
case ENOMEM:
- q->setError(QFile::ResourceError, qt_error_string(int(errno)));
+ q->setError(QFile::ResourceError, qt_error_string(errno));
break;
case EINVAL:
// size are out of bounds
default:
- q->setError(QFile::UnspecifiedError, qt_error_string(int(errno)));
+ q->setError(QFile::UnspecifiedError, qt_error_string(errno));
break;
}
return nullptr;
diff --git a/src/corelib/io/qfsfileengine_win.cpp b/src/corelib/io/qfsfileengine_win.cpp
index 60e25d34f1..4ac305f49b 100644
--- a/src/corelib/io/qfsfileengine_win.cpp
+++ b/src/corelib/io/qfsfileengine_win.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qplatformdefs.h"
#include "private/qabstractfileengine_p.h"
@@ -63,17 +27,21 @@
#define SECURITY_WIN32
#include <security.h>
+#include <memory>
+
#ifndef PATH_MAX
#define PATH_MAX FILENAME_MAX
#endif
QT_BEGIN_NAMESPACE
+using namespace Qt::StringLiterals;
+
static inline bool isUncPath(const QString &path)
{
// Starts with \\, but not \\.
- return (path.startsWith(QLatin1String("\\\\"))
- && path.size() > 2 && path.at(2) != QLatin1Char('.'));
+ return (path.startsWith("\\\\"_L1)
+ && path.size() > 2 && path.at(2) != u'.');
}
/*!
@@ -81,13 +49,13 @@ static inline bool isUncPath(const QString &path)
*/
QString QFSFileEnginePrivate::longFileName(const QString &path)
{
- if (path.startsWith(QLatin1String("\\\\.\\")))
+ if (path.startsWith("\\\\.\\"_L1))
return path;
QString absPath = QFileSystemEngine::nativeAbsoluteFilePath(path);
- QString prefix = QLatin1String("\\\\?\\");
+ QString prefix = "\\\\?\\"_L1;
if (isUncPath(absPath)) {
- prefix.append(QLatin1String("UNC\\")); // "\\\\?\\UNC\\"
+ prefix.append("UNC\\"_L1); // "\\\\?\\UNC\\"
absPath.remove(0, 2);
}
return prefix + absPath;
@@ -428,6 +396,35 @@ bool QFSFileEnginePrivate::nativeIsSequential() const
|| (fileType == FILE_TYPE_PIPE);
}
+bool QFSFileEnginePrivate::nativeRenameOverwrite(const QFileSystemEntry &newEntry)
+{
+ if (fileHandle == INVALID_HANDLE_VALUE)
+ return false;
+ const QString newFilePath = newEntry.nativeFilePath();
+ const size_t nameByteLength = newFilePath.length() * sizeof(wchar_t);
+ if (nameByteLength + sizeof(wchar_t) > std::numeric_limits<DWORD>::max())
+ return false;
+
+ constexpr size_t RenameInfoSize = sizeof(FILE_RENAME_INFO);
+ const size_t renameDataSize = RenameInfoSize + nameByteLength + sizeof(wchar_t);
+ QVarLengthArray<char> v(qsizetype(renameDataSize), 0);
+
+ auto *renameInfo = q20::construct_at(reinterpret_cast<FILE_RENAME_INFO *>(v.data()));
+ auto renameInfoRAII = qScopeGuard([&] { std::destroy_at(renameInfo); });
+ renameInfo->ReplaceIfExists = TRUE;
+ renameInfo->RootDirectory = nullptr;
+ renameInfo->FileNameLength = DWORD(nameByteLength);
+ memcpy(renameInfo->FileName, newFilePath.data(), nameByteLength);
+
+ bool res = SetFileInformationByHandle(fileHandle, FileRenameInfo, renameInfo,
+ DWORD(renameDataSize));
+ if (!res) {
+ DWORD error = GetLastError();
+ q_func()->setError(QFile::RenameError, qt_error_string(int(error)));
+ }
+ return res;
+}
+
bool QFSFileEngine::caseSensitive() const
{
return false;
@@ -438,7 +435,7 @@ QString QFSFileEngine::currentPath(const QString &fileName)
QString ret;
//if filename is a drive: then get the pwd of that drive
if (fileName.length() >= 2 &&
- fileName.at(0).isLetter() && fileName.at(1) == QLatin1Char(':')) {
+ fileName.at(0).isLetter() && fileName.at(1) == u':') {
int drv = fileName.toUpper().at(0).toLatin1() - 'A' + 1;
if (_getdrive() != drv) {
wchar_t buf[PATH_MAX];
@@ -450,7 +447,7 @@ QString QFSFileEngine::currentPath(const QString &fileName)
//just the pwd
ret = QFileSystemEngine::currentPath().filePath();
}
- if (ret.length() >= 2 && ret[1] == QLatin1Char(':'))
+ if (ret.length() >= 2 && ret[1] == u':')
ret[0] = ret.at(0).toUpper(); // Force uppercase drive letters.
return ret;
}
@@ -653,6 +650,8 @@ QString QFSFileEngine::fileName(FileName file) const
}
case AbsoluteLinkTarget:
return QFileSystemEngine::getLinkTarget(d->fileEntry, d->metaData).filePath();
+ case RawLinkPath:
+ return QFileSystemEngine::getRawLinkPath(d->fileEntry, d->metaData).filePath();
case BundleName:
return QString();
case JunctionName:
@@ -689,6 +688,10 @@ bool QFSFileEngine::setPermissions(uint perms)
{
Q_D(QFSFileEngine);
QSystemError error;
+
+ // clear cached state (if any)
+ d->metaData.clearFlags(QFileSystemMetaData::Permissions);
+
bool ret = QFileSystemEngine::setPermissions(d->fileEntry, QFile::Permissions(perms), error);
if (!ret)
setError(QFile::PermissionsError, error.toString());
@@ -734,7 +737,7 @@ bool QFSFileEngine::setSize(qint64 size)
return false;
}
-bool QFSFileEngine::setFileTime(const QDateTime &newDate, FileTime time)
+bool QFSFileEngine::setFileTime(const QDateTime &newDate, QFile::FileTime time)
{
Q_D(QFSFileEngine);
@@ -743,7 +746,7 @@ bool QFSFileEngine::setFileTime(const QDateTime &newDate, FileTime time)
return false;
}
- if (!newDate.isValid() || time == QAbstractFileEngine::MetadataChangeTime) {
+ if (!newDate.isValid() || time == QFile::FileMetadataChangeTime) {
setError(QFile::UnspecifiedError, qt_error_string(ERROR_INVALID_PARAMETER));
return false;
}
diff --git a/src/corelib/io/qiodevice.cpp b/src/corelib/io/qiodevice.cpp
index e362535852..b0029e2af7 100644
--- a/src/corelib/io/qiodevice.cpp
+++ b/src/corelib/io/qiodevice.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
//#define QIODEVICE_DEBUG
@@ -45,48 +9,42 @@
#include "qfile.h"
#include "qstringlist.h"
#include "qdir.h"
-#include "private/qbytearray_p.h"
+#include "private/qtools_p.h"
#include <algorithm>
-#ifdef QIODEVICE_DEBUG
-# include <ctype.h>
-#endif
-
QT_BEGIN_NAMESPACE
-#ifdef QIODEVICE_DEBUG
-void debugBinaryString(const QByteArray &input)
+using namespace Qt::StringLiterals;
+using namespace QtMiscUtils;
+
+[[maybe_unused]]
+static void debugBinaryString(const char *input, qint64 maxlen)
{
QByteArray tmp;
- int startOffset = 0;
- for (int i = 0; i < input.size(); ++i) {
+ qlonglong startOffset = 0;
+ for (qint64 i = 0; i < maxlen; ++i) {
tmp += input[i];
- if ((i % 16) == 15 || i == (input.size() - 1)) {
- printf("\n%15d:", startOffset);
+ if ((i % 16) == 15 || i == (maxlen - 1)) {
+ printf("\n%15lld:", startOffset);
startOffset += tmp.size();
- for (int j = 0; j < tmp.size(); ++j)
+ for (qsizetype j = 0; j < tmp.size(); ++j)
printf(" %02x", int(uchar(tmp[j])));
- for (int j = tmp.size(); j < 16 + 1; ++j)
+ for (qsizetype j = tmp.size(); j < 16 + 1; ++j)
printf(" ");
- for (int j = 0; j < tmp.size(); ++j)
- printf("%c", isprint(int(uchar(tmp[j]))) ? tmp[j] : '.');
+ for (qsizetype j = 0; j < tmp.size(); ++j)
+ printf("%c", isAsciiPrintable(tmp[j]) ? tmp[j] : '.');
tmp.clear();
}
}
printf("\n\n");
}
-void debugBinaryString(const char *data, qint64 maxlen)
-{
- debugBinaryString(QByteArray(data, maxlen));
-}
-#endif
-
#define Q_VOID
+Q_DECL_COLD_FUNCTION
static void checkWarnMessage(const QIODevice *device, const char *function, const char *what)
{
#ifndef QT_NO_WARNING_OUTPUT
@@ -130,9 +88,9 @@ static void checkWarnMessage(const QIODevice *device, const char *function, cons
#define CHECK_MAXBYTEARRAYSIZE(function) \
do { \
- if (maxSize >= MaxByteArraySize) { \
+ if (maxSize >= QByteArray::max_size()) { \
checkWarnMessage(this, #function, "maxSize argument exceeds QByteArray size limit"); \
- maxSize = MaxByteArraySize - 1; \
+ maxSize = QByteArray::max_size() - 1; \
} \
} while (0)
@@ -703,15 +661,18 @@ void QIODevice::setCurrentReadChannel(int channel)
void QIODevicePrivate::setReadChannelCount(int count)
{
if (count > readBuffers.size()) {
+ readBuffers.reserve(count);
+
// If readBufferChunkSize is zero, we should bypass QIODevice's
// read buffers, even if the QIODeviceBase::Unbuffered flag is not
// set when opened. However, if a read transaction is started or
// ungetChar() is called, we still have to use the internal buffer.
// To support these cases, pass a default value to the QRingBuffer
// constructor.
- readBuffers.insert(readBuffers.end(), count - readBuffers.size(),
- QRingBuffer(readBufferChunkSize != 0 ? readBufferChunkSize
- : QIODEVICE_BUFFERSIZE));
+
+ while (readBuffers.size() < count)
+ readBuffers.emplace_back(readBufferChunkSize != 0 ? readBufferChunkSize
+ : QIODEVICE_BUFFERSIZE);
} else {
readBuffers.resize(count);
}
@@ -762,8 +723,9 @@ void QIODevicePrivate::setWriteChannelCount(int count)
// If writeBufferChunkSize is zero (default value), we don't use
// QIODevice's write buffers.
if (writeBufferChunkSize != 0) {
- writeBuffers.insert(writeBuffers.end(), count - writeBuffers.size(),
- QRingBuffer(writeBufferChunkSize));
+ writeBuffers.reserve(count);
+ while (writeBuffers.size() < count)
+ writeBuffers.emplace_back(writeBufferChunkSize);
}
} else {
writeBuffers.resize(count);
@@ -1047,7 +1009,7 @@ qint64 QIODevice::read(char *data, qint64 maxSize)
*data = c;
#if defined QIODEVICE_DEBUG
printf("%p \tread 0x%hhx (%c) returning 1 (shortcut)\n", this,
- int(c), isprint(c) ? c : '?');
+ int(c), isAsciiPrintable(c) ? c : '?');
#endif
if (d->buffer.isEmpty())
readData(data, 0);
@@ -1240,13 +1202,13 @@ QByteArray QIODevice::read(qint64 maxSize)
CHECK_MAXLEN(read, result);
CHECK_MAXBYTEARRAYSIZE(read);
- result.resize(int(maxSize));
+ result.resize(qsizetype(maxSize));
qint64 readBytes = d->read(result.data(), result.size());
if (readBytes <= 0)
result.clear();
else
- result.resize(int(readBytes));
+ result.resize(qsizetype(readBytes));
return result;
}
@@ -1257,7 +1219,9 @@ QByteArray QIODevice::read(qint64 maxSize)
This function has no way of reporting errors; returning an empty
QByteArray can mean either that no data was currently available
- for reading, or that an error occurred.
+ for reading, or that an error occurred. This function also has no
+ way of indicating that more data may have been available and
+ couldn't be read.
*/
QByteArray QIODevice::readAll()
{
@@ -1278,7 +1242,7 @@ QByteArray QIODevice::readAll()
: d->buffer.size());
qint64 readResult;
do {
- if (readBytes + readChunkSize >= MaxByteArraySize) {
+ if (readBytes + readChunkSize >= QByteArray::max_size()) {
// If resize would fail, don't read more, return what we have.
break;
}
@@ -1291,10 +1255,9 @@ QByteArray QIODevice::readAll()
} while (readResult > 0);
} else {
// Read it all in one go.
- // If resize fails, don't read anything.
readBytes -= d->pos;
- if (readBytes >= MaxByteArraySize)
- return QByteArray();
+ if (readBytes >= QByteArray::max_size())
+ readBytes = QByteArray::max_size();
result.resize(readBytes);
readBytes = d->read(result.data(), readBytes);
}
@@ -1302,7 +1265,7 @@ QByteArray QIODevice::readAll()
if (readBytes <= 0)
result.clear();
else
- result.resize(int(readBytes));
+ result.resize(qsizetype(readBytes));
return result;
}
@@ -1363,7 +1326,7 @@ qint64 QIODevice::readLine(char *data, qint64 maxSize)
#if defined QIODEVICE_DEBUG
printf("%p \treturning %lld, d->pos = %lld, d->buffer.size() = %lld, size() = %lld\n",
this, readBytes, d->pos, d->buffer.size(), size());
- debugBinaryString(data, int(readBytes));
+ debugBinaryString(data, readBytes);
#endif
return readBytes;
@@ -1407,7 +1370,7 @@ qint64 QIODevicePrivate::readLine(char *data, qint64 maxSize)
#if defined QIODEVICE_DEBUG
printf("%p \tread from buffer: %lld bytes, last character read: %hhx\n", q,
readSoFar, data[readSoFar - 1]);
- debugBinaryString(data, int(readSoFar));
+ debugBinaryString(data, readSoFar);
#endif
if (data[readSoFar - 1] == '\n') {
if (openMode & QIODevice::Text) {
@@ -1434,7 +1397,7 @@ qint64 QIODevicePrivate::readLine(char *data, qint64 maxSize)
printf("%p \tread from readLineData: %lld bytes, readSoFar = %lld bytes\n", q,
readBytes, readSoFar);
if (readBytes > 0) {
- debugBinaryString(data, int(readSoFar + readBytes));
+ debugBinaryString(data, readSoFar + readBytes);
}
#endif
if (readBytes < 0) {
@@ -1485,19 +1448,19 @@ QByteArray QIODevice::readLine(qint64 maxSize)
qint64 readBytes = 0;
if (maxSize == 0) {
// Size is unknown, read incrementally.
- maxSize = MaxByteArraySize - 1;
+ maxSize = QByteArray::max_size() - 1;
// The first iteration needs to leave an extra byte for the terminating null
result.resize(1);
qint64 readResult;
do {
- result.resize(int(qMin(maxSize, qint64(result.size() + d->buffer.chunkSize()))));
+ result.resize(qsizetype(qMin(maxSize, qint64(result.size() + d->buffer.chunkSize()))));
readResult = d->readLine(result.data() + readBytes, result.size() - readBytes);
if (readResult > 0 || readBytes == 0)
readBytes += readResult;
} while (readResult == d->buffer.chunkSize()
- && result[int(readBytes - 1)] != '\n');
+ && result[qsizetype(readBytes - 1)] != '\n');
} else {
CHECK_LINEMAXLEN(readLine, result);
CHECK_MAXBYTEARRAYSIZE(readLine);
@@ -1537,7 +1500,7 @@ qint64 QIODevice::readLineData(char *data, qint64 maxSize)
Q_D(QIODevice);
qint64 readSoFar = 0;
char c;
- int lastReadReturn = 0;
+ qint64 lastReadReturn = 0;
d->baseReadLineDataCalled = true;
while (readSoFar < maxSize && (lastReadReturn = read(&c, 1)) == 1) {
@@ -1827,7 +1790,7 @@ void QIODevice::ungetChar(char c)
}
#if defined QIODEVICE_DEBUG
- printf("%p QIODevice::ungetChar(0x%hhx '%c')\n", this, c, isprint(c) ? c : '?');
+ printf("%p QIODevice::ungetChar(0x%hhx '%c')\n", this, c, isAsciiPrintable(c) ? c : '?');
#endif
d->buffer.ungetChar(c);
@@ -2166,7 +2129,7 @@ QString QIODevice::errorString() const
Q_D(const QIODevice);
if (d->errorString.isEmpty()) {
#ifdef QT_NO_QOBJECT
- return QLatin1String(QT_TRANSLATE_NOOP(QIODevice, "Unknown error"));
+ return QLatin1StringView(QT_TRANSLATE_NOOP(QIODevice, "Unknown error"));
#else
return tr("Unknown error");
#endif
@@ -2241,23 +2204,23 @@ QDebug operator<<(QDebug debug, QIODevice::OpenMode modes)
debug << "OpenMode(";
QStringList modeList;
if (modes == QIODevice::NotOpen) {
- modeList << QLatin1String("NotOpen");
+ modeList << "NotOpen"_L1;
} else {
if (modes & QIODevice::ReadOnly)
- modeList << QLatin1String("ReadOnly");
+ modeList << "ReadOnly"_L1;
if (modes & QIODevice::WriteOnly)
- modeList << QLatin1String("WriteOnly");
+ modeList << "WriteOnly"_L1;
if (modes & QIODevice::Append)
- modeList << QLatin1String("Append");
+ modeList << "Append"_L1;
if (modes & QIODevice::Truncate)
- modeList << QLatin1String("Truncate");
+ modeList << "Truncate"_L1;
if (modes & QIODevice::Text)
- modeList << QLatin1String("Text");
+ modeList << "Text"_L1;
if (modes & QIODevice::Unbuffered)
- modeList << QLatin1String("Unbuffered");
+ modeList << "Unbuffered"_L1;
}
std::sort(modeList.begin(), modeList.end());
- debug << modeList.join(QLatin1Char('|'));
+ debug << modeList.join(u'|');
debug << ')';
return debug;
}
diff --git a/src/corelib/io/qiodevice.h b/src/corelib/io/qiodevice.h
index fd97e8d1e5..7844e0f125 100644
--- a/src/corelib/io/qiodevice.h
+++ b/src/corelib/io/qiodevice.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QIODEVICE_H
#define QIODEVICE_H
diff --git a/src/corelib/io/qiodevice_p.h b/src/corelib/io/qiodevice_p.h
index 83c16eeddc..f69c055ac5 100644
--- a/src/corelib/io/qiodevice_p.h
+++ b/src/corelib/io/qiodevice_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QIODEVICE_P_H
#define QIODEVICE_P_H
@@ -53,9 +17,9 @@
#include "QtCore/qbytearray.h"
#include "QtCore/qiodevice.h"
-#include "QtCore/qlist.h"
#include "QtCore/qobjectdefs.h"
#include "QtCore/qstring.h"
+#include "QtCore/qvarlengtharray.h"
#include "private/qringbuffer_p.h"
#ifndef QT_NO_QOBJECT
#include "private/qobject_p.h"
@@ -75,6 +39,7 @@ class Q_CORE_EXPORT QIODevicePrivate
#endif
{
Q_DECLARE_PUBLIC(QIODevice)
+ Q_DISABLE_COPY_MOVE(QIODevicePrivate)
public:
QIODevicePrivate();
@@ -134,8 +99,8 @@ public:
int readBufferChunkSize = QIODEVICE_BUFFERSIZE;
int writeBufferChunkSize = 0;
- QList<QRingBuffer> readBuffers;
- QList<QRingBuffer> writeBuffers;
+ QVarLengthArray<QRingBuffer, 2> readBuffers;
+ QVarLengthArray<QRingBuffer, 1> writeBuffers;
QString errorString;
QIODevice::OpenMode openMode = QIODevice::NotOpen;
diff --git a/src/corelib/io/qiodevicebase.h b/src/corelib/io/qiodevicebase.h
index 3c6ca89f7a..aab63d4351 100644
--- a/src/corelib/io/qiodevicebase.h
+++ b/src/corelib/io/qiodevicebase.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QIODEVICEBASE_H
#define QIODEVICEBASE_H
diff --git a/src/corelib/io/qipaddress.cpp b/src/corelib/io/qipaddress.cpp
index 93a74ccd09..c2b274f8b5 100644
--- a/src/corelib/io/qipaddress.cpp
+++ b/src/corelib/io/qipaddress.cpp
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// Copyright (C) 2016 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qipaddress_p.h"
#include "private/qlocale_tools_p.h"
@@ -44,20 +8,23 @@
#include "qvarlengtharray.h"
QT_BEGIN_NAMESPACE
+
+using namespace Qt::StringLiterals;
+
namespace QIPAddressUtils {
-static QString number(quint8 val, int base = 10)
+static QString number(quint8 val)
{
QString zero = QStringLiteral("0");
- return val ? qulltoa(val, base, zero) : zero;
+ return val ? qulltoa(val, 10, zero) : zero;
}
typedef QVarLengthArray<char, 64> Buffer;
static const QChar *checkedToAscii(Buffer &buffer, const QChar *begin, const QChar *end)
{
- const ushort *const ubegin = reinterpret_cast<const ushort *>(begin);
- const ushort *const uend = reinterpret_cast<const ushort *>(end);
- const ushort *src = ubegin;
+ const auto *const ubegin = reinterpret_cast<const char16_t *>(begin);
+ const auto *const uend = reinterpret_cast<const char16_t *>(end);
+ auto *src = ubegin;
buffer.resize(uend - ubegin + 1);
char *dst = buffer.data();
@@ -93,14 +60,12 @@ static bool parseIp4Internal(IPv4Address &address, const char *ptr, bool acceptL
ptr[1] != '.' && ptr[1] != '\0')
return false;
- const char *endptr;
- bool ok;
- quint64 ll = qstrntoull(ptr, stop - ptr, &endptr, 0, &ok);
- quint32 x = ll;
- if (!ok || endptr == ptr || ll != x)
+ auto [ll, used] = qstrntoull(ptr, stop - ptr, 0);
+ const quint32 x = quint32(ll);
+ if (used <= 0 || ll != x)
return false;
- if (*endptr == '.' || dotCount == 3) {
+ if (ptr[used] == '.' || dotCount == 3) {
if (x & ~0xff)
return false;
address <<= 8;
@@ -115,15 +80,13 @@ static bool parseIp4Internal(IPv4Address &address, const char *ptr, bool acceptL
}
address |= x;
- if (dotCount == 3 && *endptr != '\0')
- return false;
- else if (dotCount == 3 || *endptr == '\0')
- return true;
- if (*endptr != '.')
+ if (dotCount == 3 || ptr[used] == '\0')
+ return ptr[used] == '\0';
+ if (ptr[used] != '.')
return false;
++dotCount;
- ptr = endptr + 1;
+ ptr += used + 1;
}
return false;
}
@@ -132,12 +95,9 @@ void toString(QString &appendTo, IPv4Address address)
{
// reconstructing is easy
// use the fast operator% that pre-calculates the size
- appendTo += number(address >> 24)
- % QLatin1Char('.')
- % number(address >> 16)
- % QLatin1Char('.')
- % number(address >> 8)
- % QLatin1Char('.')
+ appendTo += number(address >> 24) % u'.'
+ % number(address >> 16) % u'.'
+ % number(address >> 8) % u'.'
% number(address);
}
@@ -214,18 +174,16 @@ const QChar *parseIp6(IPv6Address &address, const QChar *begin, const QChar *end
continue;
}
- const char *endptr;
- bool ok;
- quint64 ll = qstrntoull(ptr, stop - ptr, &endptr, 16, &ok);
+ auto [ll, used] = qstrntoull(ptr, stop - ptr, 16);
quint16 x = ll;
// Reject malformed fields:
// - failed to parse
// - too many hex digits
- if (!ok || endptr > ptr + 4)
+ if (used <= 0 || used > 4)
return begin + (ptr - buffer.data());
- if (*endptr == '.') {
+ if (ptr[used] == '.') {
// this could be an IPv4 address
// it's only valid in the last element
if (pos != 12)
@@ -245,11 +203,11 @@ const QChar *parseIp6(IPv6Address &address, const QChar *begin, const QChar *end
address[pos++] = x >> 8;
address[pos++] = x & 0xff;
- if (*endptr == '\0')
+ if (ptr[used] == '\0')
break;
- if (*endptr != ':')
- return begin + (endptr - buffer.data());
- ptr = endptr + 1;
+ if (ptr[used] != ':')
+ return begin + (used + ptr - buffer.data());
+ ptr += used + 1;
}
return pos == 16 ? nullptr : end;
}
@@ -285,7 +243,7 @@ void toString(QString &appendTo, const IPv6Address address)
if (address[12] != 0 || address[13] != 0 || address[14] != 0) {
embeddedIp4 = true;
} else if (address[15] == 0) {
- appendTo.append(QLatin1String("::"));
+ appendTo.append("::"_L1);
return;
}
}
diff --git a/src/corelib/io/qipaddress_p.h b/src/corelib/io/qipaddress_p.h
index ea31e5883d..af3ab52dfd 100644
--- a/src/corelib/io/qipaddress_p.h
+++ b/src/corelib/io/qipaddress_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QIPADDRESS_P_H
#define QIPADDRESS_P_H
diff --git a/src/corelib/io/qlockfile.cpp b/src/corelib/io/qlockfile.cpp
index e6812cedde..0eb6acb694 100644
--- a/src/corelib/io/qlockfile.cpp
+++ b/src/corelib/io/qlockfile.cpp
@@ -1,43 +1,7 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 David Faure <faure+bluesystems@kde.org>
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2017 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2013 David Faure <faure+bluesystems@kde.org>
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2017 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qlockfile.h"
#include "qlockfile_p.h"
@@ -50,6 +14,8 @@
QT_BEGIN_NAMESPACE
+using namespace Qt::StringLiterals;
+
namespace {
struct LockFileInfo
{
@@ -94,7 +60,7 @@ static QString machineName()
When protecting for a short-term operation, it is acceptable to call lock() and wait
until any running operation finishes.
When protecting a resource over a long time, however, the application should always
- call setStaleLockTime(0) and then tryLock() with a short timeout, in order to
+ call setStaleLockTime(0ms) and then tryLock() with a short timeout, in order to
warn the user that the resource is locked.
If the process holding the lock crashes, the lock file stays on disk and can prevent
@@ -172,20 +138,24 @@ QString QLockFile::fileName() const
meanwhile, so one way to detect a stale lock file is by the fact that
it has been around for a long time.
+ This is an overloaded function, equivalent to calling:
+ \code
+ setStaleLockTime(std::chrono::milliseconds{staleLockTime});
+ \endcode
+
\sa staleLockTime()
*/
void QLockFile::setStaleLockTime(int staleLockTime)
{
- Q_D(QLockFile);
- d->staleLockTime = staleLockTime;
+ setStaleLockTime(std::chrono::milliseconds{staleLockTime});
}
-/*! \fn void QLockFile::setStaleLockTime(std::chrono::milliseconds value)
- \overload
+/*!
\since 6.2
- Sets the interval after which a lock file is considered stale to \a value.
- The default value is 30 seconds.
+ Sets the interval after which a lock file is considered stale to \a staleLockTime.
+ The default value is 30s.
+
If your application typically keeps the file locked for more than 30 seconds
(for instance while saving megabytes of data for 2 minutes), you should set
a bigger value using setStaleLockTime().
@@ -198,6 +168,11 @@ void QLockFile::setStaleLockTime(int staleLockTime)
\sa staleLockTime()
*/
+void QLockFile::setStaleLockTime(std::chrono::milliseconds staleLockTime)
+{
+ Q_D(QLockFile);
+ d->staleLockTime = staleLockTime;
+}
/*!
Returns the time in milliseconds after which
@@ -207,8 +182,7 @@ void QLockFile::setStaleLockTime(int staleLockTime)
*/
int QLockFile::staleLockTime() const
{
- Q_D(const QLockFile);
- return d->staleLockTime;
+ return int(staleLockTimeAsDuration().count());
}
/*! \fn std::chrono::milliseconds QLockFile::staleLockTimeAsDuration() const
@@ -220,6 +194,11 @@ int QLockFile::staleLockTime() const
\sa setStaleLockTime()
*/
+std::chrono::milliseconds QLockFile::staleLockTimeAsDuration() const
+{
+ Q_D(const QLockFile);
+ return d->staleLockTime;
+}
/*!
Returns \c true if the lock was acquired by this QLockFile instance,
@@ -250,7 +229,7 @@ bool QLockFile::isLocked() const
*/
bool QLockFile::lock()
{
- return tryLock(-1);
+ return tryLock(std::chrono::milliseconds::max());
}
/*!
@@ -275,10 +254,38 @@ bool QLockFile::lock()
*/
bool QLockFile::tryLock(int timeout)
{
+ return tryLock(std::chrono::milliseconds{ timeout });
+}
+
+/*!
+ \overload
+ \since 6.2
+
+ Attempts to create the lock file. This function returns \c true if the
+ lock was obtained; otherwise it returns \c false. If another process (or
+ another thread) has created the lock file already, this function will
+ wait for at most \a timeout for the lock file to become available.
+
+ If the lock was obtained, it must be released with unlock()
+ before another process (or thread) can successfully lock it.
+
+ Calling this function multiple times on the same lock from the same
+ thread without unlocking first is not allowed, this function will
+ \e always return false when attempting to lock the file recursively.
+
+ \sa lock(), unlock()
+*/
+bool QLockFile::tryLock(std::chrono::milliseconds timeout)
+{
+ using namespace std::chrono_literals;
+ using Msec = std::chrono::milliseconds;
+
Q_D(QLockFile);
- QDeadlineTimer timer(qMax(timeout, -1)); // QDT only takes -1 as "forever"
- int sleepTime = 100;
- forever {
+
+ QDeadlineTimer timer(timeout < 0ms ? Msec::max() : timeout);
+
+ Msec sleepTime = 100ms;
+ while (true) {
d->lockError = d->tryLock_sys();
switch (d->lockError) {
case NoError:
@@ -289,11 +296,11 @@ bool QLockFile::tryLock(int timeout)
return false;
case LockFailedError:
if (!d->isLocked && d->isApparentlyStale()) {
- if (Q_UNLIKELY(QFileInfo(d->fileName).lastModified() > QDateTime::currentDateTimeUtc()))
+ if (Q_UNLIKELY(QFileInfo(d->fileName).lastModified(QTimeZone::UTC) > QDateTime::currentDateTimeUtc()))
qInfo("QLockFile: Lock file '%ls' has a modification time in the future", qUtf16Printable(d->fileName));
// Stale lock from another thread/process
// Ensure two processes don't remove it at the same time
- QLockFile rmlock(d->fileName + QLatin1String(".rmlock"));
+ QLockFile rmlock(d->fileName + ".rmlock"_L1);
if (rmlock.tryLock()) {
if (d->isApparentlyStale() && d->removeStaleLock())
continue;
@@ -302,39 +309,21 @@ bool QLockFile::tryLock(int timeout)
break;
}
- int remainingTime = timer.remainingTime();
- if (remainingTime == 0)
+ auto remainingTime = std::chrono::duration_cast<Msec>(timer.remainingTimeAsDuration());
+ if (remainingTime == 0ms)
return false;
- else if (uint(sleepTime) > uint(remainingTime))
+
+ if (sleepTime > remainingTime)
sleepTime = remainingTime;
- QThread::msleep(sleepTime);
- if (sleepTime < 5 * 1000)
+ QThread::sleep(sleepTime);
+ if (sleepTime < 5s)
sleepTime *= 2;
}
// not reached
return false;
}
-/*! \fn bool QLockFile::tryLock(std::chrono::milliseconds timeout)
- \overload
- \since 6.2
-
- Attempts to create the lock file. This function returns \c true if the
- lock was obtained; otherwise it returns \c false. If another process (or
- another thread) has created the lock file already, this function will
- wait for at most \a timeout for the lock file to become available.
-
- If the lock was obtained, it must be released with unlock()
- before another process (or thread) can successfully lock it.
-
- Calling this function multiple times on the same lock from the same
- thread without unlocking first is not allowed, this function will
- \e always return false when attempting to lock the file recursively.
-
- \sa lock(), unlock()
-*/
-
/*!
\fn void QLockFile::unlock()
Releases the lock, by deleting the lock file.
@@ -447,8 +436,10 @@ bool QLockFilePrivate::isApparentlyStale() const
}
}
- const qint64 age = QFileInfo(fileName).lastModified().msecsTo(QDateTime::currentDateTimeUtc());
- return staleLockTime > 0 && qAbs(age) > staleLockTime;
+ const QDateTime lastMod = QFileInfo(fileName).lastModified(QTimeZone::UTC);
+ using namespace std::chrono;
+ const milliseconds age{lastMod.msecsTo(QDateTime::currentDateTimeUtc())};
+ return staleLockTime > 0ms && abs(age) > staleLockTime;
}
/*!
diff --git a/src/corelib/io/qlockfile.h b/src/corelib/io/qlockfile.h
index aa5ad5e772..af481ab59b 100644
--- a/src/corelib/io/qlockfile.h
+++ b/src/corelib/io/qlockfile.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 David Faure <faure+bluesystems@kde.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2013 David Faure <faure+bluesystems@kde.org>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QLOCKFILE_H
#define QLOCKFILE_H
@@ -43,9 +7,7 @@
#include <QtCore/qstring.h>
#include <QtCore/qscopedpointer.h>
-#if __has_include(<chrono>)
-# include <chrono>
-#endif
+#include <chrono>
QT_BEGIN_NAMESPACE
@@ -60,22 +22,16 @@ public:
QString fileName() const;
bool lock();
- bool tryLock(int timeout = 0);
+ bool tryLock(int timeout);
void unlock();
void setStaleLockTime(int);
int staleLockTime() const;
-#if __has_include(<chrono>)
- bool tryLock(std::chrono::milliseconds timeout) { return tryLock(int(timeout.count())); }
+ bool tryLock(std::chrono::milliseconds timeout = std::chrono::milliseconds::zero());
- void setStaleLockTime(std::chrono::milliseconds value) { setStaleLockTime(int(value.count())); }
-
- std::chrono::milliseconds staleLockTimeAsDuration() const
- {
- return std::chrono::milliseconds(staleLockTime());
- }
-#endif
+ void setStaleLockTime(std::chrono::milliseconds value);
+ std::chrono::milliseconds staleLockTimeAsDuration() const;
bool isLocked() const;
bool getLockInfo(qint64 *pid, QString *hostname, QString *appname) const;
diff --git a/src/corelib/io/qlockfile_p.h b/src/corelib/io/qlockfile_p.h
index 5b69347206..299b13b21a 100644
--- a/src/corelib/io/qlockfile_p.h
+++ b/src/corelib/io/qlockfile_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 David Faure <faure+bluesystems@kde.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2013 David Faure <faure+bluesystems@kde.org>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QLOCKFILE_P_H
#define QLOCKFILE_P_H
@@ -68,15 +32,7 @@ class QLockFilePrivate
{
public:
QLockFilePrivate(const QString &fn)
- : fileName(fn),
-#ifdef Q_OS_WIN
- fileHandle(INVALID_HANDLE_VALUE),
-#else
- fileHandle(-1),
-#endif
- staleLockTime(30 * 1000), // 30 seconds
- lockError(QLockFile::NoError),
- isLocked(false)
+ : fileName(fn)
{
}
QLockFile::LockError tryLock_sys();
@@ -91,14 +47,16 @@ public:
static bool isProcessRunning(qint64 pid, const QString &appname);
QString fileName;
+
#ifdef Q_OS_WIN
- Qt::HANDLE fileHandle;
+ Qt::HANDLE fileHandle = INVALID_HANDLE_VALUE;
#else
- int fileHandle;
+ int fileHandle = -1;
#endif
- int staleLockTime; // "int milliseconds" is big enough for 24 days
- QLockFile::LockError lockError;
- bool isLocked;
+
+ std::chrono::milliseconds staleLockTime = std::chrono::seconds{30};
+ QLockFile::LockError lockError = QLockFile::NoError;
+ bool isLocked = false;
static int getLockFileHandle(QLockFile *f)
{
diff --git a/src/corelib/io/qlockfile_unix.cpp b/src/corelib/io/qlockfile_unix.cpp
index fb728144a4..47aff8b973 100644
--- a/src/corelib/io/qlockfile_unix.cpp
+++ b/src/corelib/io/qlockfile_unix.cpp
@@ -1,43 +1,7 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 David Faure <faure+bluesystems@kde.org>
-** Copyright (C) 2017 Intel Corporation.
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2013 David Faure <faure+bluesystems@kde.org>
+// Copyright (C) 2017 Intel Corporation.
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "private/qlockfile_p.h"
@@ -52,13 +16,14 @@
#include "private/qcore_unix_p.h" // qt_safe_open
#include "private/qabstractfileengine_p.h"
+#include "private/qfilesystementry_p.h"
#include "private/qtemporaryfile_p.h"
#if !defined(Q_OS_INTEGRITY)
#include <sys/file.h> // flock
#endif
-#if defined(Q_OS_RTEMS) || defined(Q_OS_QNX)
+#if defined(Q_OS_RTEMS)
// flock() does not work in these OSes and produce warnings when we try to use
# undef LOCK_EX
# undef LOCK_NB
@@ -205,7 +170,7 @@ bool QLockFilePrivate::removeStaleLock()
bool QLockFilePrivate::isProcessRunning(qint64 pid, const QString &appname)
{
- if (::kill(pid, 0) == -1 && errno == ESRCH)
+ if (::kill(pid_t(pid), 0) == -1 && errno == ESRCH)
return false; // PID doesn't exist anymore
const QString processName = processNameByPid(pid);
@@ -244,7 +209,7 @@ QString QLockFilePrivate::processNameByPid(qint64 pid)
if (buf.endsWith(deleted))
buf.chop(strlen(deleted));
- return QFileInfo(QFile::decodeName(buf)).fileName();
+ return QFileSystemEntry(buf, QFileSystemEntry::FromNativePath()).fileName();
#elif defined(Q_OS_HAIKU)
thread_info info;
if (get_thread_info(pid, &info) != B_OK)
@@ -277,7 +242,27 @@ QString QLockFilePrivate::processNameByPid(qint64 pid)
QString name = QFile::decodeName(kp.ki_comm);
# endif
return name;
+#elif defined(Q_OS_QNX)
+ char exePath[PATH_MAX];
+ sprintf(exePath, "/proc/%lld/exefile", pid);
+ int fd = qt_safe_open(exePath, O_RDONLY);
+ if (fd == -1)
+ return QString();
+
+ QT_STATBUF sbuf;
+ if (QT_FSTAT(fd, &sbuf) == -1) {
+ qt_safe_close(fd);
+ return QString();
+ }
+
+ QByteArray buffer(sbuf.st_size, Qt::Uninitialized);
+ buffer.resize(qt_safe_read(fd, buffer.data(), sbuf.st_size - 1));
+ if (buffer.isEmpty()) {
+ // The pid is gone. Return some invalid process name to fail the test.
+ return QStringLiteral("/ERROR/");
+ }
+ return QFileSystemEntry(buffer, QFileSystemEntry::FromNativePath()).fileName();
#else
Q_UNUSED(pid);
return QString();
diff --git a/src/corelib/io/qlockfile_win.cpp b/src/corelib/io/qlockfile_win.cpp
index 6c0d2c1f8d..b9d7721517 100644
--- a/src/corelib/io/qlockfile_win.cpp
+++ b/src/corelib/io/qlockfile_win.cpp
@@ -1,43 +1,7 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 David Faure <faure+bluesystems@kde.org>
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2017 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2013 David Faure <faure+bluesystems@kde.org>
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2017 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "private/qlockfile_p.h"
#include "private/qfilesystementry_p.h"
@@ -142,10 +106,10 @@ QString QLockFilePrivate::processNameByPid(qint64 pid)
if (!length)
return QString();
QString name = QString::fromWCharArray(buf, length);
- int i = name.lastIndexOf(QLatin1Char('\\'));
+ int i = name.lastIndexOf(u'\\');
if (i >= 0)
name.remove(0, i + 1);
- i = name.lastIndexOf(QLatin1Char('.'));
+ i = name.lastIndexOf(u'.');
if (i >= 0)
name.truncate(i);
return name;
diff --git a/src/corelib/io/qloggingcategory.cpp b/src/corelib/io/qloggingcategory.cpp
index 9d08a2cdac..10763dd65a 100644
--- a/src/corelib/io/qloggingcategory.cpp
+++ b/src/corelib/io/qloggingcategory.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2017 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qloggingcategory.h"
#include "qloggingregistry_p.h"
@@ -43,21 +7,7 @@
QT_BEGIN_NAMESPACE
const char qtDefaultCategoryName[] = "default";
-
-Q_GLOBAL_STATIC_WITH_ARGS(QLoggingCategory, qtDefaultCategory,
- (qtDefaultCategoryName))
-
-#ifndef Q_ATOMIC_INT8_IS_SUPPORTED
-static void setBoolLane(QBasicAtomicInt *atomic, bool enable, int shift)
-{
- const int bit = 1 << shift;
-
- if (enable)
- atomic->fetchAndOrRelaxed(bit);
- else
- atomic->fetchAndAndRelaxed(~bit);
-}
-#endif
+Q_GLOBAL_STATIC(QLoggingCategory, qtDefaultCategory, qtDefaultCategoryName)
/*!
\class QLoggingCategory
@@ -70,7 +20,8 @@ static void setBoolLane(QBasicAtomicInt *atomic, bool enable, int shift)
QLoggingCategory represents a certain logging category - identified by a
string - at runtime. A category can be configured to enable or disable
- logging of messages per message type.
+ logging of messages per message type. An exception are fatal messages,
+ which are always enabled.
To check whether a message type is enabled or not, use one of these methods:
\l isDebugEnabled(), \l isInfoEnabled(), \l isWarningEnabled(), and
@@ -89,6 +40,9 @@ static void setBoolLane(QBasicAtomicInt *atomic, bool enable, int shift)
\snippet qloggingcategory/main.cpp 1
+ There is also the Q_DECLARE_EXPORTED_LOGGING_CATEGORY() macro in
+ order to use a logging category across library boundaries.
+
Category names are free text; to configure categories using \l{Logging Rules}, their
names should follow this convention:
\list
@@ -126,7 +80,7 @@ static void setBoolLane(QBasicAtomicInt *atomic, bool enable, int shift)
If no argument is passed, all messages are logged. Only Qt internal categories
which start with \c{qt} are handled differently: For these, only messages of type
- \c QtInfoMsg, \c QtWarningMsg, and \c QtCriticalMsg are logged by default.
+ \c QtInfoMsg, \c QtWarningMsg, \c QtCriticalMsg, and \c QFatalMsg are logged by default.
\note Logging categories are not affected by your C++ build configuration.
That is, whether messages are printed does not change depending on whether
@@ -326,17 +280,10 @@ bool QLoggingCategory::isEnabled(QtMsgType msgtype) const
void QLoggingCategory::setEnabled(QtMsgType type, bool enable)
{
switch (type) {
-#ifdef Q_ATOMIC_INT8_IS_SUPPORTED
case QtDebugMsg: bools.enabledDebug.storeRelaxed(enable); break;
case QtInfoMsg: bools.enabledInfo.storeRelaxed(enable); break;
case QtWarningMsg: bools.enabledWarning.storeRelaxed(enable); break;
case QtCriticalMsg: bools.enabledCritical.storeRelaxed(enable); break;
-#else
- case QtDebugMsg: setBoolLane(&enabled, enable, DebugShift); break;
- case QtInfoMsg: setBoolLane(&enabled, enable, InfoShift); break;
- case QtWarningMsg: setBoolLane(&enabled, enable, WarningShift); break;
- case QtCriticalMsg: setBoolLane(&enabled, enable, CriticalShift); break;
-#endif
case QtFatalMsg: break;
}
}
@@ -346,7 +293,7 @@ void QLoggingCategory::setEnabled(QtMsgType type, bool enable)
Returns the object itself. This allows for both: a QLoggingCategory variable, and
a factory method that returns a QLoggingCategory, to be used in \l qCDebug(),
- \l qCWarning(), or \l qCCritical() macros.
+ \l qCWarning(), \l qCCritical(), or \l qCFatal() macros.
*/
/*!
@@ -354,7 +301,7 @@ void QLoggingCategory::setEnabled(QtMsgType type, bool enable)
Returns the object itself. This allows for both: a QLoggingCategory variable, and
a factory method that returns a QLoggingCategory, to be used in \l qCDebug(),
- \l qCWarning(), or \l qCCritical() macros.
+ \l qCWarning(), \l qCCritical(), or \l qCFatal() macros.
*/
/*!
@@ -381,13 +328,27 @@ QLoggingCategory *QLoggingCategory::defaultCategory()
*/
/*!
- Installs a function \a filter that is used to determine which categories
- and message types should be enabled. Returns a pointer to the previous
- installed filter.
-
- Every QLoggingCategory object created is passed to the filter, and the
- filter is free to change the respective category configuration with
- \l setEnabled().
+ \brief Take control of how logging categories are configured.
+
+ Installs a function \a filter that is used to determine which categories and
+ message types should be enabled. If \a filter is \nullptr, the default
+ message filter is reinstated. Returns a pointer to the previously-installed
+ filter.
+
+ Every QLoggingCategory object that already exists is passed to the filter
+ before \c installFilter() returns, and the filter is free to change each
+ category's configuration with \l setEnabled(). Any category it doesn't
+ change will retain the configuration it was given by the prior filter, so
+ the new filter does not need to delegate to the prior filter during this
+ initial pass over existing categories.
+
+ Any new categories added later will be passed to the new filter; a filter
+ that only aims to tweak the configuration of a select few categories, rather
+ than completely overriding the logging policy, can first pass the new
+ category to the prior filter, to give it its standard configuration, and
+ then tweak that as desired, if it is one of the categories of specific
+ interest to the filter. The code that installs the new filter can record the
+ return from \c installFilter() for the filter to use in such later calls.
When you define your filter, note that it can be called from different threads; but never
concurrently. This filter cannot call any static functions from QLoggingCategory.
@@ -395,6 +356,10 @@ QLoggingCategory *QLoggingCategory::defaultCategory()
Example:
\snippet qloggingcategory/main.cpp 21
+ installed (in \c{main()}, for example) by
+
+ \snippet qloggingcategory/main.cpp 22
+
Alternatively, you can configure the default filter via \l setFilterRules().
*/
QLoggingCategory::CategoryFilter
@@ -592,9 +557,49 @@ void QLoggingCategory::setFilterRules(const QString &rules)
\sa qCritical()
*/
+
+/*!
+ \macro qCFatal(category)
+ \relates QLoggingCategory
+ \since 6.5
+
+ Returns an output stream for fatal messages in the logging category,
+ \a category.
+
+ If you are using the \b{default message handler}, the returned stream will abort
+ to create a core dump. On Windows, for debug builds, this function will
+ report a \c _CRT_ERROR enabling you to connect a debugger to the application.
+
+ Example:
+
+ \snippet qloggingcategory/main.cpp 16
+
+ \sa qFatal()
+*/
+
+/*!
+ \macro qCFatal(category, const char *message, ...)
+ \relates QLoggingCategory
+ \since 6.5
+
+ Logs a fatal message, \a message, in the logging category, \a category.
+ \a message may contain place holders to be replaced by additional arguments,
+ similar to the C printf() function.
+
+ Example:
+
+ \snippet qloggingcategory/main.cpp 17
+
+ If you are using the \b{default message handler}, this function will abort
+ to create a core dump. On Windows, for debug builds, this function will
+ report a \c _CRT_ERROR enabling you to connect a debugger to the application.
+
+ \sa qFatal()
+*/
+
/*!
\macro Q_DECLARE_LOGGING_CATEGORY(name)
- \sa Q_LOGGING_CATEGORY()
+ \sa Q_LOGGING_CATEGORY(), Q_DECLARE_EXPORTED_LOGGING_CATEGORY()
\relates QLoggingCategory
\since 5.2
@@ -605,8 +610,31 @@ void QLoggingCategory::setFilterRules(const QString &rules)
*/
/*!
+ \macro Q_DECLARE_EXPORTED_LOGGING_CATEGORY(name, EXPORT_MACRO)
+ \sa Q_LOGGING_CATEGORY(), Q_DECLARE_LOGGING_CATEGORY()
+ \relates QLoggingCategory
+ \since 6.5
+
+ Declares a logging category \a name. The macro can be used to declare
+ a common logging category shared in different parts of the program.
+
+ This works exactly like Q_DECLARE_LOGGING_CATEGORY(). However,
+ the logging category declared by this macro is additionally
+ qualified with \a EXPORT_MACRO. This is useful if the logging
+ category needs to be exported from a dynamic library.
+
+ For example:
+
+ \code
+ Q_DECLARE_EXPORTED_LOGGING_CATEGORY(lcCore, LIB_EXPORT_MACRO)
+ \endcode
+
+ This macro must be used outside of a class or function.
+*/
+
+/*!
\macro Q_LOGGING_CATEGORY(name, string)
- \sa Q_DECLARE_LOGGING_CATEGORY()
+ \sa Q_DECLARE_LOGGING_CATEGORY(), Q_DECLARE_EXPORTED_LOGGING_CATEGORY()
\relates QLoggingCategory
\since 5.2
@@ -634,8 +662,7 @@ void QLoggingCategory::setFilterRules(const QString &rules)
with a specific name. The implicitly-defined QLoggingCategory object is
created on first use, in a thread-safe manner.
- This macro must be used outside of a class or method. It is only defined
- if variadic macros are supported.
+ This macro must be used outside of a class or method.
*/
QT_END_NAMESPACE
diff --git a/src/corelib/io/qloggingcategory.h b/src/corelib/io/qloggingcategory.h
index 5a66bb2e68..7c32beea1a 100644
--- a/src/corelib/io/qloggingcategory.h
+++ b/src/corelib/io/qloggingcategory.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QLOGGINGCATEGORY_H
#define QLOGGINGCATEGORY_H
@@ -55,17 +19,11 @@ public:
bool isEnabled(QtMsgType type) const;
void setEnabled(QtMsgType type, bool enable);
-#ifdef Q_ATOMIC_INT8_IS_SUPPORTED
bool isDebugEnabled() const { return bools.enabledDebug.loadRelaxed(); }
bool isInfoEnabled() const { return bools.enabledInfo.loadRelaxed(); }
bool isWarningEnabled() const { return bools.enabledWarning.loadRelaxed(); }
bool isCriticalEnabled() const { return bools.enabledCritical.loadRelaxed(); }
-#else
- bool isDebugEnabled() const { return enabled.loadRelaxed() >> DebugShift & 1; }
- bool isInfoEnabled() const { return enabled.loadRelaxed() >> InfoShift & 1; }
- bool isWarningEnabled() const { return enabled.loadRelaxed() >> WarningShift & 1; }
- bool isCriticalEnabled() const { return enabled.loadRelaxed() >> CriticalShift & 1; }
-#endif
+
const char *categoryName() const { return name; }
// allows usage of both factory method and variable in qCX macros
@@ -85,19 +43,11 @@ private:
Q_DECL_UNUSED_MEMBER void *d; // reserved for future use
const char *name;
-#ifdef Q_BIG_ENDIAN
- enum { DebugShift = 0, WarningShift = 8, CriticalShift = 16, InfoShift = 24 };
-#else
- enum { DebugShift = 24, WarningShift = 16, CriticalShift = 8, InfoShift = 0};
-#endif
-
struct AtomicBools {
-#ifdef Q_ATOMIC_INT8_IS_SUPPORTED
QBasicAtomicInteger<bool> enabledDebug;
QBasicAtomicInteger<bool> enabledWarning;
QBasicAtomicInteger<bool> enabledCritical;
QBasicAtomicInteger<bool> enabledInfo;
-#endif
};
union {
AtomicBools bools;
@@ -112,16 +62,11 @@ template <QtMsgType Which> struct QLoggingCategoryMacroHolder
static const bool IsOutputEnabled;
const QLoggingCategory *category = nullptr;
bool control = false;
- QLoggingCategoryMacroHolder(const QLoggingCategory &cat)
+ explicit QLoggingCategoryMacroHolder(const QLoggingCategory &cat)
{
if (IsOutputEnabled)
init(cat);
}
- QLoggingCategoryMacroHolder(QMessageLogger::CategoryFunction catfunc)
- {
- if (IsOutputEnabled)
- init(catfunc());
- }
void init(const QLoggingCategory &cat) noexcept
{
category = &cat;
@@ -134,12 +79,16 @@ template <QtMsgType Which> struct QLoggingCategoryMacroHolder
control = cat.isInfoEnabled();
} else if constexpr (Which == QtWarningMsg) {
control = cat.isWarningEnabled();
- } else {
+ } else if constexpr (Which == QtCriticalMsg) {
control = cat.isCriticalEnabled();
+ } else if constexpr (Which == QtFatalMsg) {
+ control = true;
+ } else {
+ static_assert(QtPrivate::value_dependent_false<Which>(), "Unknown Qt message type");
}
}
- operator const char *() const { return category->categoryName(); }
- operator bool() const { return Q_UNLIKELY(control); }
+ const char *name() const { return category->categoryName(); }
+ explicit operator bool() const { return Q_UNLIKELY(control); }
};
template <QtMsgType Which> const bool QLoggingCategoryMacroHolder<Which>::IsOutputEnabled = true;
@@ -155,7 +104,10 @@ template <> const bool QLoggingCategoryMacroHolder<QtWarningMsg>::IsOutputEnable
} // unnamed namespace
#define Q_DECLARE_LOGGING_CATEGORY(name) \
- extern const QLoggingCategory &name();
+ const QLoggingCategory &name();
+
+#define Q_DECLARE_EXPORTED_LOGGING_CATEGORY(name, export_macro) \
+ export_macro Q_DECLARE_LOGGING_CATEGORY(name)
#define Q_LOGGING_CATEGORY(name, ...) \
const QLoggingCategory &name() \
@@ -165,13 +117,14 @@ template <> const bool QLoggingCategoryMacroHolder<QtWarningMsg>::IsOutputEnable
}
#define QT_MESSAGE_LOGGER_COMMON(category, level) \
- for (QLoggingCategoryMacroHolder<level> qt_category(category); qt_category; qt_category.control = false) \
- QMessageLogger(QT_MESSAGELOG_FILE, QT_MESSAGELOG_LINE, QT_MESSAGELOG_FUNC, qt_category)
+ for (QLoggingCategoryMacroHolder<level> qt_category((category)()); qt_category; qt_category.control = false) \
+ QMessageLogger(QT_MESSAGELOG_FILE, QT_MESSAGELOG_LINE, QT_MESSAGELOG_FUNC, qt_category.name())
#define qCDebug(category, ...) QT_MESSAGE_LOGGER_COMMON(category, QtDebugMsg).debug(__VA_ARGS__)
#define qCInfo(category, ...) QT_MESSAGE_LOGGER_COMMON(category, QtInfoMsg).info(__VA_ARGS__)
#define qCWarning(category, ...) QT_MESSAGE_LOGGER_COMMON(category, QtWarningMsg).warning(__VA_ARGS__)
#define qCCritical(category, ...) QT_MESSAGE_LOGGER_COMMON(category, QtCriticalMsg).critical(__VA_ARGS__)
+#define qCFatal(category, ...) QT_MESSAGE_LOGGER_COMMON(category, QtFatalMsg).fatal(__VA_ARGS__)
QT_END_NAMESPACE
diff --git a/src/corelib/io/qloggingregistry.cpp b/src/corelib/io/qloggingregistry.cpp
index 73b98190a7..b4181a2fa6 100644
--- a/src/corelib/io/qloggingregistry.cpp
+++ b/src/corelib/io/qloggingregistry.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qloggingregistry_p.h"
@@ -60,14 +24,15 @@
QT_BEGIN_NAMESPACE
+using namespace Qt::StringLiterals;
+
Q_GLOBAL_STATIC(QLoggingRegistry, qtLoggingRegistry)
/*!
\internal
Constructs a logging rule with default values.
*/
-QLoggingRule::QLoggingRule() :
- enabled(false)
+QLoggingRule::QLoggingRule()
{
}
@@ -75,9 +40,7 @@ QLoggingRule::QLoggingRule() :
\internal
Constructs a logging rule.
*/
-QLoggingRule::QLoggingRule(QStringView pattern, bool enabled) :
- messageType(-1),
- enabled(enabled)
+QLoggingRule::QLoggingRule(QStringView pattern, bool enabled) : enabled(enabled)
{
parse(pattern);
}
@@ -87,7 +50,7 @@ QLoggingRule::QLoggingRule(QStringView pattern, bool enabled) :
Return value 1 means filter passed, 0 means filter doesn't influence this
category, -1 means category doesn't pass this filter.
*/
-int QLoggingRule::pass(QLatin1String cat, QtMsgType msgType) const
+int QLoggingRule::pass(QLatin1StringView cat, QtMsgType msgType) const
{
// check message type
if (messageType > -1 && messageType != msgType)
@@ -101,7 +64,7 @@ int QLoggingRule::pass(QLatin1String cat, QtMsgType msgType) const
return 0;
}
- const int idx = cat.indexOf(category);
+ const qsizetype idx = cat.indexOf(category);
if (idx >= 0) {
if (flags == MidFilter) {
// matches somewhere
@@ -112,7 +75,7 @@ int QLoggingRule::pass(QLatin1String cat, QtMsgType msgType) const
return (enabled ? 1 : -1);
} else if (flags == RightFilter) {
// matches right
- if (idx == (cat.size() - category.count()))
+ if (idx == (cat.size() - category.size()))
return (enabled ? 1 : -1);
}
}
@@ -133,34 +96,35 @@ void QLoggingRule::parse(QStringView pattern)
QStringView p;
// strip trailing ".messagetype"
- if (pattern.endsWith(QLatin1String(".debug"))) {
+ if (pattern.endsWith(".debug"_L1)) {
p = pattern.chopped(6); // strlen(".debug")
messageType = QtDebugMsg;
- } else if (pattern.endsWith(QLatin1String(".info"))) {
+ } else if (pattern.endsWith(".info"_L1)) {
p = pattern.chopped(5); // strlen(".info")
messageType = QtInfoMsg;
- } else if (pattern.endsWith(QLatin1String(".warning"))) {
+ } else if (pattern.endsWith(".warning"_L1)) {
p = pattern.chopped(8); // strlen(".warning")
messageType = QtWarningMsg;
- } else if (pattern.endsWith(QLatin1String(".critical"))) {
+ } else if (pattern.endsWith(".critical"_L1)) {
p = pattern.chopped(9); // strlen(".critical")
messageType = QtCriticalMsg;
} else {
p = pattern;
}
- if (!p.contains(QLatin1Char('*'))) {
+ const QChar asterisk = u'*';
+ if (!p.contains(asterisk)) {
flags = FullText;
} else {
- if (p.endsWith(QLatin1Char('*'))) {
+ if (p.endsWith(asterisk)) {
flags |= LeftFilter;
p = p.chopped(1);
}
- if (p.startsWith(QLatin1Char('*'))) {
+ if (p.startsWith(asterisk)) {
flags |= RightFilter;
p = p.mid(1);
}
- if (p.contains(QLatin1Char('*'))) // '*' only supported at start/end
+ if (p.contains(asterisk)) // '*' only supported at start/end
flags = PatternFlags();
}
@@ -216,33 +180,33 @@ void QLoggingSettingsParser::parseNextLine(QStringView line)
line = line.trimmed();
// comment
- if (line.startsWith(QLatin1Char(';')))
+ if (line.startsWith(u';'))
return;
- if (line.startsWith(QLatin1Char('[')) && line.endsWith(QLatin1Char(']'))) {
+ if (line.startsWith(u'[') && line.endsWith(u']')) {
// new section
auto sectionName = line.mid(1).chopped(1).trimmed();
- m_inRulesSection = sectionName.compare(QLatin1String("rules"), Qt::CaseInsensitive) == 0;
+ m_inRulesSection = sectionName.compare("rules"_L1, Qt::CaseInsensitive) == 0;
return;
}
if (m_inRulesSection) {
- int equalPos = line.indexOf(QLatin1Char('='));
+ const qsizetype equalPos = line.indexOf(u'=');
if (equalPos != -1) {
- if (line.lastIndexOf(QLatin1Char('=')) == equalPos) {
+ if (line.lastIndexOf(u'=') == equalPos) {
const auto key = line.left(equalPos).trimmed();
#if QT_CONFIG(settings)
QString tmp;
- QSettingsPrivate::iniUnescapedKey(key.toUtf8(), 0, key.length(), tmp);
+ QSettingsPrivate::iniUnescapedKey(key.toUtf8(), tmp);
QStringView pattern = qToStringViewIgnoringNull(tmp);
#else
QStringView pattern = key;
#endif
const auto valueStr = line.mid(equalPos + 1).trimmed();
int value = -1;
- if (valueStr == QLatin1String("true"))
+ if (valueStr == "true"_L1)
value = 1;
- else if (valueStr == QLatin1String("false"))
+ else if (valueStr == "false"_L1)
value = 0;
QLoggingRule rule(pattern, (value == 1));
if (rule.flags != 0 && (value != -1))
@@ -277,20 +241,29 @@ QLoggingRegistry::QLoggingRegistry()
static bool qtLoggingDebug()
{
- static const bool debugEnv = qEnvironmentVariableIsSet("QT_LOGGING_DEBUG");
+ static const bool debugEnv = [] {
+ bool debug = qEnvironmentVariableIsSet("QT_LOGGING_DEBUG");
+ if (debug)
+ debugMsg("QT_LOGGING_DEBUG environment variable is set.");
+ return debug;
+ }();
return debugEnv;
}
static QList<QLoggingRule> loadRulesFromFile(const QString &filePath)
{
+ if (qtLoggingDebug()) {
+ debugMsg("Checking \"%s\" for rules",
+ QDir::toNativeSeparators(filePath).toUtf8().constData());
+ }
+
QFile file(filePath);
if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
- if (qtLoggingDebug())
- debugMsg("Loading \"%s\" ...",
- QDir::toNativeSeparators(file.fileName()).toUtf8().constData());
QTextStream stream(&file);
QLoggingSettingsParser parser;
parser.setContent(stream);
+ if (qtLoggingDebug())
+ debugMsg("Loaded %td rules", static_cast<ptrdiff_t>(parser.rules().size()));
return parser.rules();
}
return QList<QLoggingRule>();
@@ -303,19 +276,30 @@ static QList<QLoggingRule> loadRulesFromFile(const QString &filePath)
*/
void QLoggingRegistry::initializeRules()
{
+ if (qtLoggingDebug()) {
+ debugMsg("Initializing the rules database ...");
+ debugMsg("Checking %s environment variable", "QTLOGGING_CONF");
+ }
QList<QLoggingRule> er, qr, cr;
// get rules from environment
const QByteArray rulesFilePath = qgetenv("QT_LOGGING_CONF");
if (!rulesFilePath.isEmpty())
er = loadRulesFromFile(QFile::decodeName(rulesFilePath));
+ if (qtLoggingDebug())
+ debugMsg("Checking %s environment variable", "QT_LOGGING_RULES");
+
const QByteArray rulesSrc = qgetenv("QT_LOGGING_RULES").replace(';', '\n');
if (!rulesSrc.isEmpty()) {
- QTextStream stream(rulesSrc);
- QLoggingSettingsParser parser;
- parser.setImplicitRulesSection(true);
- parser.setContent(stream);
- er += parser.rules();
+ QTextStream stream(rulesSrc);
+ QLoggingSettingsParser parser;
+ parser.setImplicitRulesSection(true);
+ parser.setContent(stream);
+
+ if (qtLoggingDebug())
+ debugMsg("Loaded %td rules", static_cast<ptrdiff_t>(parser.rules().size()));
+
+ er += parser.rules();
}
const QString configFileName = QStringLiteral("qtlogging.ini");
@@ -380,10 +364,10 @@ void QLoggingRegistry::unregisterCategory(QLoggingCategory *cat)
for enabling debugging by default for category \a categoryName. The
category name must start with "qt."
*/
-void QLoggingRegistry::registerEnvironmentOverrideForCategory(QByteArrayView categoryName,
- QByteArrayView environment)
+void QLoggingRegistry::registerEnvironmentOverrideForCategory(const char *categoryName,
+ const char *environment)
{
- qtCategoryEnvironmentOverrides.insert(categoryName, environment);
+ qtCategoryEnvironmentOverrides.insert_or_assign(categoryName, environment);
}
/*!
@@ -475,11 +459,11 @@ void QLoggingRegistry::defaultCategoryFilter(QLoggingCategory *cat)
if (it == reg->qtCategoryEnvironmentOverrides.end())
debug = false;
else
- debug = qEnvironmentVariableIntValue(it.value().data());
+ debug = qEnvironmentVariableIntValue(it->second);
}
}
- const auto categoryName = QLatin1String(cat->categoryName());
+ const auto categoryName = QLatin1StringView(cat->categoryName());
for (const auto &ruleSet : reg->ruleSets) {
for (const auto &rule : ruleSet) {
diff --git a/src/corelib/io/qloggingregistry_p.h b/src/corelib/io/qloggingregistry_p.h
index 0009d8d2ea..92b96f0ba4 100644
--- a/src/corelib/io/qloggingregistry_p.h
+++ b/src/corelib/io/qloggingregistry_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QLOGGINGREGISTRY_P_H
#define QLOGGINGREGISTRY_P_H
@@ -54,11 +18,13 @@
#include <QtCore/private/qglobal_p.h>
#include <QtCore/qloggingcategory.h>
#include <QtCore/qlist.h>
-#include <QtCore/qmap.h>
+#include <QtCore/qhash.h>
#include <QtCore/qmutex.h>
#include <QtCore/qstring.h>
#include <QtCore/qtextstream.h>
+#include <map>
+
class tst_QLoggingRegistry;
QT_BEGIN_NAMESPACE
@@ -78,7 +44,7 @@ class Q_AUTOTEST_EXPORT QLoggingRule
public:
QLoggingRule();
QLoggingRule(QStringView pattern, bool enabled);
- int pass(QLatin1String categoryName, QtMsgType type) const;
+ int pass(QLatin1StringView categoryName, QtMsgType type) const;
enum PatternFlag {
FullText = 0x1,
@@ -89,9 +55,9 @@ public:
Q_DECLARE_FLAGS(PatternFlags, PatternFlag)
QString category;
- int messageType;
+ int messageType = -1;
PatternFlags flags;
- bool enabled;
+ bool enabled = false;
private:
void parse(QStringView pattern);
@@ -120,6 +86,7 @@ private:
class Q_AUTOTEST_EXPORT QLoggingRegistry
{
+ Q_DISABLE_COPY_MOVE(QLoggingRegistry)
public:
QLoggingRegistry();
@@ -131,7 +98,7 @@ public:
#ifndef QT_BUILD_INTERNAL
Q_CORE_EXPORT // always export from QtCore
#endif
- void registerEnvironmentOverrideForCategory(QByteArrayView categoryName, QByteArrayView environment);
+ void registerEnvironmentOverrideForCategory(const char *categoryName, const char *environment);
void setApiRules(const QString &content);
@@ -161,7 +128,7 @@ private:
QList<QLoggingRule> ruleSets[NumRuleSets];
QHash<QLoggingCategory *, QtMsgType> categories;
QLoggingCategory::CategoryFilter categoryFilter;
- QMap<QByteArrayView, QByteArrayView> qtCategoryEnvironmentOverrides;
+ std::map<QByteArrayView, const char *> qtCategoryEnvironmentOverrides;
friend class ::tst_QLoggingRegistry;
};
@@ -174,12 +141,12 @@ public:
{}
private:
- static const char *registerOverride(QByteArrayView categoryName, QByteArrayView environment)
+ static const char *registerOverride(const char *categoryName, const char *environment)
{
QLoggingRegistry *c = QLoggingRegistry::instance();
if (c)
c->registerEnvironmentOverrideForCategory(categoryName, environment);
- return categoryName.data();
+ return categoryName;
}
};
diff --git a/src/corelib/io/qnoncontiguousbytedevice.cpp b/src/corelib/io/qnoncontiguousbytedevice.cpp
index 73075c532f..260fea7969 100644
--- a/src/corelib/io/qnoncontiguousbytedevice.cpp
+++ b/src/corelib/io/qnoncontiguousbytedevice.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qnoncontiguousbytedevice_p.h"
#include <qbuffer.h>
@@ -136,14 +100,18 @@ QNonContiguousByteDevice::~QNonContiguousByteDevice()
}
// FIXME we should scrap this whole implementation and instead change the ByteArrayImpl to be able to cope with sub-arrays?
-QNonContiguousByteDeviceBufferImpl::QNonContiguousByteDeviceBufferImpl(QBuffer *b) : QNonContiguousByteDevice()
+QNonContiguousByteDeviceBufferImpl::QNonContiguousByteDeviceBufferImpl(QBuffer *b)
+ : QNonContiguousByteDevice(),
+ buffer(b),
+ byteArray(QByteArray::fromRawData(buffer->buffer().constData() + buffer->pos(),
+ buffer->size() - buffer->pos())),
+ arrayImpl(new QNonContiguousByteDeviceByteArrayImpl(&byteArray))
{
- buffer = b;
- byteArray = QByteArray::fromRawData(buffer->buffer().constData() + buffer->pos(), buffer->size() - buffer->pos());
- arrayImpl = new QNonContiguousByteDeviceByteArrayImpl(&byteArray);
arrayImpl->setParent(this);
- connect(arrayImpl, SIGNAL(readyRead()), SIGNAL(readyRead()));
- connect(arrayImpl, SIGNAL(readProgress(qint64,qint64)), SIGNAL(readProgress(qint64,qint64)));
+ connect(arrayImpl, &QNonContiguousByteDevice::readyRead, this,
+ &QNonContiguousByteDevice::readyRead);
+ connect(arrayImpl, &QNonContiguousByteDevice::readProgress, this,
+ &QNonContiguousByteDevice::readProgress);
}
QNonContiguousByteDeviceBufferImpl::~QNonContiguousByteDeviceBufferImpl()
@@ -175,9 +143,9 @@ qint64 QNonContiguousByteDeviceBufferImpl::size() const
return arrayImpl->size();
}
-QNonContiguousByteDeviceByteArrayImpl::QNonContiguousByteDeviceByteArrayImpl(QByteArray *ba) : QNonContiguousByteDevice(), currentPosition(0)
+QNonContiguousByteDeviceByteArrayImpl::QNonContiguousByteDeviceByteArrayImpl(QByteArray *ba)
+ : QNonContiguousByteDevice(), byteArray(ba), currentPosition(0)
{
- byteArray = ba;
}
QNonContiguousByteDeviceByteArrayImpl::~QNonContiguousByteDeviceByteArrayImpl()
@@ -281,14 +249,19 @@ qint64 QNonContiguousByteDeviceRingBufferImpl::size() const
QNonContiguousByteDeviceIoDeviceImpl::QNonContiguousByteDeviceIoDeviceImpl(QIODevice *d)
: QNonContiguousByteDevice(),
- currentReadBuffer(nullptr), currentReadBufferSize(16*1024),
- currentReadBufferAmount(0), currentReadBufferPosition(0), totalAdvancements(0),
- eof(false)
+ device(d),
+ currentReadBuffer(nullptr),
+ currentReadBufferSize(16 * 1024),
+ currentReadBufferAmount(0),
+ currentReadBufferPosition(0),
+ totalAdvancements(0),
+ eof(false),
+ initialPosition(d->pos())
{
- device = d;
- initialPosition = d->pos();
- connect(device, SIGNAL(readyRead()), this, SIGNAL(readyRead()), Qt::QueuedConnection);
- connect(device, SIGNAL(readChannelFinished()), this, SIGNAL(readyRead()), Qt::QueuedConnection);
+ connect(device, &QIODevice::readyRead, this,
+ &QNonContiguousByteDevice::readyRead);
+ connect(device, &QIODevice::readChannelFinished, this,
+ &QNonContiguousByteDevice::readyRead);
}
QNonContiguousByteDeviceIoDeviceImpl::~QNonContiguousByteDeviceIoDeviceImpl()
@@ -298,7 +271,7 @@ QNonContiguousByteDeviceIoDeviceImpl::~QNonContiguousByteDeviceIoDeviceImpl()
const char *QNonContiguousByteDeviceIoDeviceImpl::readPointer(qint64 maximumLength, qint64 &len)
{
- if (eof == true) {
+ if (eof) {
len = -1;
return nullptr;
}
@@ -314,7 +287,8 @@ const char *QNonContiguousByteDeviceIoDeviceImpl::readPointer(qint64 maximumLeng
return currentReadBuffer->data() + currentReadBufferPosition;
}
- qint64 haveRead = device->read(currentReadBuffer->data(), qMin(maximumLength, currentReadBufferSize));
+ qint64 haveRead = device->read(currentReadBuffer->data(),
+ qMin(maximumLength, currentReadBufferSize));
if ((haveRead == -1) || (haveRead == 0 && device->atEnd() && !device->isSequential())) {
eof = true;
@@ -348,7 +322,7 @@ bool QNonContiguousByteDeviceIoDeviceImpl::advanceReadPointer(qint64 amount)
if (currentReadBufferPosition > currentReadBufferAmount) {
qint64 i = currentReadBufferPosition - currentReadBufferAmount;
while (i > 0) {
- if (device->getChar(nullptr) == false) {
+ if (!device->getChar(nullptr)) {
emit readProgress(totalAdvancements - i, size());
return false; // ### FIXME handle eof
}
@@ -364,7 +338,7 @@ bool QNonContiguousByteDeviceIoDeviceImpl::advanceReadPointer(qint64 amount)
bool QNonContiguousByteDeviceIoDeviceImpl::atEnd() const
{
- return eof == true;
+ return eof;
}
bool QNonContiguousByteDeviceIoDeviceImpl::reset()
@@ -403,18 +377,16 @@ qint64 QNonContiguousByteDeviceIoDeviceImpl::pos() const
return device->pos();
}
-QByteDeviceWrappingIoDevice::QByteDeviceWrappingIoDevice(QNonContiguousByteDevice *bd) : QIODevice((QObject*)nullptr)
+QByteDeviceWrappingIoDevice::QByteDeviceWrappingIoDevice(QNonContiguousByteDevice *bd)
+ : QIODevice(nullptr), byteDevice(bd)
{
- byteDevice = bd;
- connect(bd, SIGNAL(readyRead()), SIGNAL(readyRead()));
+ connect(bd, &QNonContiguousByteDevice::readyRead, this, &QIODevice::readyRead);
open(ReadOnly);
}
QByteDeviceWrappingIoDevice::~QByteDeviceWrappingIoDevice()
-{
-
-}
+ = default;
bool QByteDeviceWrappingIoDevice::isSequential() const
{
@@ -519,9 +491,10 @@ std::shared_ptr<QNonContiguousByteDevice> QNonContiguousByteDeviceFactory::creat
\internal
*/
-QNonContiguousByteDevice* QNonContiguousByteDeviceFactory::create(std::shared_ptr<QRingBuffer> ringBuffer)
+QNonContiguousByteDevice *
+QNonContiguousByteDeviceFactory::create(std::shared_ptr<QRingBuffer> ringBuffer)
{
- return new QNonContiguousByteDeviceRingBufferImpl(ringBuffer);
+ return new QNonContiguousByteDeviceRingBufferImpl(std::move(ringBuffer));
}
/*!
@@ -529,7 +502,8 @@ QNonContiguousByteDevice* QNonContiguousByteDeviceFactory::create(std::shared_pt
\internal
*/
-std::shared_ptr<QNonContiguousByteDevice> QNonContiguousByteDeviceFactory::createShared(std::shared_ptr<QRingBuffer> ringBuffer)
+std::shared_ptr<QNonContiguousByteDevice>
+QNonContiguousByteDeviceFactory::createShared(std::shared_ptr<QRingBuffer> ringBuffer)
{
return std::make_shared<QNonContiguousByteDeviceRingBufferImpl>(std::move(ringBuffer));
}
@@ -551,7 +525,8 @@ QNonContiguousByteDevice* QNonContiguousByteDeviceFactory::create(QByteArray *by
\internal
*/
-std::shared_ptr<QNonContiguousByteDevice> QNonContiguousByteDeviceFactory::createShared(QByteArray *byteArray)
+std::shared_ptr<QNonContiguousByteDevice>
+QNonContiguousByteDeviceFactory::createShared(QByteArray *byteArray)
{
return std::make_shared<QNonContiguousByteDeviceByteArrayImpl>(byteArray);
}
diff --git a/src/corelib/io/qnoncontiguousbytedevice_p.h b/src/corelib/io/qnoncontiguousbytedevice_p.h
index 94d8e5ef9c..eb75034c6a 100644
--- a/src/corelib/io/qnoncontiguousbytedevice_p.h
+++ b/src/corelib/io/qnoncontiguousbytedevice_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QNONCONTIGUOUSBYTEDEVICE_P_H
#define QNONCONTIGUOUSBYTEDEVICE_P_H
@@ -102,6 +66,7 @@ public:
class QNonContiguousByteDeviceByteArrayImpl : public QNonContiguousByteDevice
{
+ Q_OBJECT
public:
explicit QNonContiguousByteDeviceByteArrayImpl(QByteArray *ba);
~QNonContiguousByteDeviceByteArrayImpl();
@@ -119,6 +84,7 @@ protected:
class QNonContiguousByteDeviceRingBufferImpl : public QNonContiguousByteDevice
{
+ Q_OBJECT
public:
explicit QNonContiguousByteDeviceRingBufferImpl(std::shared_ptr<QRingBuffer> rb);
~QNonContiguousByteDeviceRingBufferImpl();
@@ -179,6 +145,7 @@ protected:
// ... and the reverse thing
class QByteDeviceWrappingIoDevice : public QIODevice
{
+ Q_OBJECT
public:
explicit QByteDeviceWrappingIoDevice(QNonContiguousByteDevice *bd);
~QByteDeviceWrappingIoDevice();
diff --git a/src/corelib/io/qntdll_p.h b/src/corelib/io/qntdll_p.h
index caf34ddb5f..1669d4a6dd 100644
--- a/src/corelib/io/qntdll_p.h
+++ b/src/corelib/io/qntdll_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QNTDLL_P_H
#define QNTDLL_P_H
@@ -51,6 +15,8 @@
// We mean it.
//
+#include <QtCore/private/qglobal_p.h>
+
#include <winternl.h>
QT_BEGIN_NAMESPACE
@@ -68,7 +34,7 @@ typedef struct _FILE_FS_SECTOR_SIZE_INFORMATION {
ULONG ByteOffsetForPartitionAlignment;
} FILE_FS_SECTOR_SIZE_INFORMATION, *PFILE_FS_SECTOR_SIZE_INFORMATION;
-#if !defined(Q_CC_CLANG) && !defined(Q_CC_MINGW)
+#if !defined(Q_CC_MINGW)
// keep the following enumeration as is, taken from
// https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/wdm/ne-wdm-_fsinfoclass
// Unfortunately we can't include the wdm.h header, so we duplicate the code here.
diff --git a/src/corelib/io/qprocess.cpp b/src/corelib/io/qprocess.cpp
index 23c90daff4..108ee0b7c3 100644
--- a/src/corelib/io/qprocess.cpp
+++ b/src/corelib/io/qprocess.cpp
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// Copyright (C) 2022 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
//#define QPROCESS_DEBUG
@@ -71,6 +35,8 @@ QT_BEGIN_NAMESPACE
\reentrant
\since 4.6
+ \compares equality
+
A process's environment is composed of a set of key=value pairs known as
environment variables. The QProcessEnvironment class wraps that concept
and allows easy manipulation of those variables. It's meant to be used
@@ -98,7 +64,7 @@ QStringList QProcessEnvironmentPrivate::toList() const
QStringList result;
result.reserve(vars.size());
for (auto it = vars.cbegin(), end = vars.cend(); it != end; ++it)
- result << nameToString(it.key()) + QLatin1Char('=') + valueToString(it.value());
+ result << nameToString(it.key()) + u'=' + valueToString(it.value());
return result;
}
@@ -108,7 +74,7 @@ QProcessEnvironment QProcessEnvironmentPrivate::fromList(const QStringList &list
QStringList::ConstIterator it = list.constBegin(),
end = list.constEnd();
for ( ; it != end; ++it) {
- int pos = it->indexOf(QLatin1Char('='), 1);
+ const qsizetype pos = it->indexOf(u'=', 1);
if (pos < 1)
continue;
@@ -148,15 +114,27 @@ void QProcessEnvironmentPrivate::insert(const QProcessEnvironmentPrivate &other)
}
/*!
+ \enum QProcessEnvironment::Initialization
+
+ This enum contains a token that is used to disambiguate constructors.
+
+ \value InheritFromParent A QProcessEnvironment will be created that, when
+ set on a QProcess, causes it to inherit variables from its parent.
+
+ \since 6.3
+*/
+
+/*!
Creates a new QProcessEnvironment object. This constructor creates an
empty environment. If set on a QProcess, this will cause the current
- environment variables to be removed.
+ environment variables to be removed (except for PATH and SystemRoot
+ on Windows).
*/
QProcessEnvironment::QProcessEnvironment() : d(new QProcessEnvironmentPrivate) { }
/*!
Creates an object that when set on QProcess will cause it to be executed with
- environment variables inherited from the parent process.
+ environment variables inherited from its parent process.
\note The created object does not store any environment variables by itself,
it just indicates to QProcess to arrange for inheriting the environment at the
@@ -172,7 +150,7 @@ QProcessEnvironment::QProcessEnvironment() : d(new QProcessEnvironmentPrivate) {
\sa inheritsFromParent(), systemEnvironment()
\since 6.3
*/
-QProcessEnvironment::QProcessEnvironment(QProcessEnvironment::Initialization) : d(nullptr) { }
+QProcessEnvironment::QProcessEnvironment(QProcessEnvironment::Initialization) noexcept { }
/*!
Frees the resources associated with this QProcessEnvironment object.
@@ -208,15 +186,17 @@ QProcessEnvironment &QProcessEnvironment::operator=(const QProcessEnvironment &o
*/
/*!
- \fn bool QProcessEnvironment::operator !=(const QProcessEnvironment &other) const
+ \fn bool QProcessEnvironment::operator!=(const QProcessEnvironment &lhs, const QProcessEnvironment &rhs)
- Returns \c true if this and the \a other QProcessEnvironment objects are different.
+ Returns \c true if the process environment objects \a lhs and \a rhs are different.
\sa operator==()
*/
/*!
- Returns \c true if this and the \a other QProcessEnvironment objects are equal.
+ \fn bool QProcessEnvironment::operator==(const QProcessEnvironment &lhs, const QProcessEnvironment &rhs)
+
+ Returns \c true if the process environment objects \a lhs and \a rhs are equal.
Two QProcessEnvironment objects are considered equal if they have the same
set of key=value pairs. The comparison of keys is done case-sensitive on
@@ -224,12 +204,12 @@ QProcessEnvironment &QProcessEnvironment::operator=(const QProcessEnvironment &o
\sa operator!=(), contains()
*/
-bool QProcessEnvironment::operator==(const QProcessEnvironment &other) const
+bool comparesEqual(const QProcessEnvironment &lhs, const QProcessEnvironment &rhs)
{
- if (d == other.d)
+ if (lhs.d == rhs.d)
return true;
- return d && other.d && d->vars == other.d->vars;
+ return lhs.d && rhs.d && lhs.d->vars == rhs.d->vars;
}
/*!
@@ -476,6 +456,97 @@ void QProcessPrivate::Channel::clear()
\note QProcess is not supported on VxWorks, iOS, tvOS, or watchOS.
+ \section1 Finding the Executable
+
+ The program to be run can be set either by calling setProgram() or directly
+ in the start() call. The effect of calling start() with the program name
+ and arguments is equivalent to calling setProgram() and setArguments()
+ before that function and then calling the overload without those
+ parameters.
+
+ QProcess interprets the program name in one of three different ways,
+ similar to how Unix shells and the Windows command interpreter operate in
+ their own command-lines:
+
+ \list
+ \li If the program name is an absolute path, then that is the exact
+ executable that will be launched and QProcess performs no searching.
+
+ \li If the program name is a relative path with more than one path
+ component (that is, it contains at least one slash), the starting
+ directory where that relative path is searched is OS-dependent: on
+ Windows, it's the parent process' current working dir, while on Unix it's
+ the one set with setWorkingDirectory().
+
+ \li If the program name is a plain file name with no slashes, the
+ behavior is operating-system dependent. On Unix systems, QProcess will
+ search the \c PATH environment variable; on Windows, the search is
+ performed by the OS and will first the parent process' current directory
+ before the \c PATH environment variable (see the documentation for
+ \l{CreateProcess} for the full list).
+ \endlist
+
+ To avoid platform-dependent behavior or any issues with how the current
+ application was launched, it is advisable to always pass an absolute path
+ to the executable to be launched. For auxiliary binaries shipped with the
+ application, one can construct such a path starting with
+ QCoreApplication::applicationDirPath(). Similarly, to explicitly run an
+ executable that is to be found relative to the directory set with
+ setWorkingDirectory(), use a program path starting with "./" or "../" as
+ the case may be.
+
+ On Windows, the ".exe" suffix is not required for most uses, except those
+ outlined in the \l{CreateProcess} documentation. Additionally, QProcess
+ will convert the Unix-style forward slashes to Windows path backslashes for
+ the program name. This allows code using QProcess to be written in a
+ cross-platform manner, as shown in the examples above.
+
+ QProcess does not support directly executing Unix shell or Windows command
+ interpreter built-in functions, such as \c{cmd.exe}'s \c dir command or the
+ Bourne shell's \c export. On Unix, even though many shell built-ins are
+ also provided as separate executables, their behavior may differ from those
+ implemented as built-ins. To run those commands, one should explicitly
+ execute the interpreter with suitable options. For Unix systems, launch
+ "/bin/sh" with two arguments: "-c" and a string with the command-line to be
+ run. For Windows, due to the non-standard way \c{cmd.exe} parses its
+ command-line, use setNativeArguments() (for example, "/c dir d:").
+
+ \section1 Environment variables
+
+ The QProcess API offers methods to manipulate the environment variables
+ that the child process will see. By default, the child process will have a
+ copy of the current process environment variables that exist at the time
+ the start() function is called. This means that any modifications performed
+ using qputenv() prior to that call will be reflected in the child process'
+ environment. Note that QProcess makes no attempt to prevent race conditions
+ with qputenv() happening in other threads, so it is recommended to avoid
+ qputenv() after the application's initial start up.
+
+ The environment for a specific child can be modified using the
+ processEnvironment() and setProcessEnvironment() functions, which use the
+ \l QProcessEnvironment class. By default, processEnvironment() will return
+ an object for which QProcessEnvironment::inheritsFromParent() is true.
+ Setting an environment that does not inherit from the parent will cause
+ QProcess to use exactly that environment for the child when it is started.
+
+ The normal scenario starts from the current environment by calling
+ QProcessEnvironment::systemEnvironment() and then proceeds to adding,
+ changing, or removing specific variables. The resulting variable roster can
+ then be applied to a QProcess with setProcessEnvironment().
+
+ It is possible to remove all variables from the environment or to start
+ from an empty environment, using the QProcessEnvironment() default
+ constructor. This is not advisable outside of controlled and
+ system-specific conditions, as there may be system variables that are set
+ in the current process environment and are required for proper execution
+ of the child process.
+
+ On Windows, QProcess will copy the current process' \c "PATH" and \c
+ "SystemRoot" environment variables if they were unset. It is not possible
+ to unset them completely, but it is possible to set them to empty values.
+ Setting \c "PATH" to empty on Windows will likely cause the child process
+ to fail to start.
+
\section1 Communicating via Channels
Processes have two predefined output channels: The standard
@@ -524,11 +595,6 @@ void QProcessPrivate::Channel::clear()
command line option; X11 applications generally accept a
\c{-geometry} command line option.
- \note On QNX, setting the working directory may cause all
- application threads, with the exception of the QProcess caller
- thread, to temporarily freeze during the spawning process,
- owing to a limitation in the operating system.
-
\section1 Synchronous Process API
QProcess provides a set of functions which allow it to be used
@@ -556,15 +622,6 @@ void QProcessPrivate::Channel::clear()
\snippet process/process.cpp 0
- \section1 Notes for Windows Users
-
- Some Windows commands (for example, \c dir) are not provided by
- separate applications, but by the command interpreter itself.
- If you attempt to use QProcess to execute these commands directly,
- it won't work. One possible solution is to execute the command
- interpreter itself (\c{cmd.exe} on some Windows systems), and ask
- the interpreter to execute the desired command.
-
\sa QBuffer, QFile, QTcpSocket
*/
@@ -752,6 +809,98 @@ void QProcessPrivate::Channel::clear()
*/
/*!
+ \class QProcess::UnixProcessParameters
+ \inmodule QtCore
+ \note This struct is only available on Unix platforms
+ \since 6.6
+
+ This struct can be used to pass extra, Unix-specific configuration for the
+ child process using QProcess::setUnixProcessParameters().
+
+ Its members are:
+ \list
+ \li UnixProcessParameters::flags Flags, see QProcess::UnixProcessFlags
+ \li UnixProcessParameters::lowestFileDescriptorToClose The lowest file
+ descriptor to close.
+ \endlist
+
+ When the QProcess::UnixProcessFlags::CloseFileDescriptors flag is set in
+ the \c flags field, QProcess closes the application's open file descriptors
+ before executing the child process. The descriptors 0, 1, and 2 (that is,
+ \c stdin, \c stdout, and \c stderr) are left alone, along with the ones
+ numbered lower than the value of the \c lowestFileDescriptorToClose field.
+
+ All of the settings above can also be manually achieved by calling the
+ respective POSIX function from a handler set with
+ QProcess::setChildProcessModifier(). This structure allows QProcess to deal
+ with any platform-specific differences, benefit from certain optimizations,
+ and reduces code duplication. Moreover, if any of those functions fail,
+ QProcess will enter QProcess::FailedToStart state, while the child process
+ modifier callback is not allowed to fail.
+
+ \sa QProcess::setUnixProcessParameters(), QProcess::setChildProcessModifier()
+*/
+
+/*!
+ \enum QProcess::UnixProcessFlag
+ \since 6.6
+
+ These flags can be used in the \c flags field of \l UnixProcessParameters.
+
+ \value CloseFileDescriptors Close all file descriptors above the threshold
+ defined by \c lowestFileDescriptorToClose, preventing any currently
+ open descriptor in the parent process from accidentally leaking to the
+ child. The \c stdin, \c stdout, and \c stderr file descriptors are
+ never closed.
+
+ \value [since 6.7] CreateNewSession Starts a new process session, by calling
+ \c{setsid(2)}. This allows the child process to outlive the session
+ the current process is in. This is one of the steps that
+ startDetached() takes to allow the process to detach, and is also one
+ of the steps to daemonize a process.
+
+ \value [since 6.7] DisconnectControllingTerminal Requests that the process
+ disconnect from its controlling terminal, if it has one. If it has
+ none, nothing happens. Processes still connected to a controlling
+ terminal may get a Hang Up (\c SIGHUP) signal if the terminal
+ closes, or one of the other terminal-control signals (\c SIGTSTP, \c
+ SIGTTIN, \c SIGTTOU). Note that on some operating systems, a process
+ may only disconnect from the controlling terminal if it is the
+ session leader, meaning the \c CreateNewSession flag may be
+ required. Like it, this is one of the steps to daemonize a process.
+
+ \value IgnoreSigPipe Always sets the \c SIGPIPE signal to ignored
+ (\c SIG_IGN), even if the \c ResetSignalHandlers flag was set. By
+ default, if the child attempts to write to its standard output or
+ standard error after the respective channel was closed with
+ QProcess::closeReadChannel(), it would get the \c SIGPIPE signal and
+ terminate immediately; with this flag, the write operation fails
+ without a signal and the child may continue executing.
+
+ \value [since 6.7] ResetIds Drops any retained, effective user or group
+ ID the current process may still have (see \c{setuid(2)} and
+ \c{setgid(2)}, plus QCoreApplication::setSetuidAllowed()). This is
+ useful if the current process was setuid or setgid and does not wish
+ the child process to retain the elevated privileges.
+
+ \value ResetSignalHandlers Resets all Unix signal handlers back to their
+ default state (that is, pass \c SIG_DFL to \c{signal(2)}). This flag
+ is useful to ensure any ignored (\c SIG_IGN) signal does not affect
+ the child's behavior.
+
+ \value UseVFork Requests that QProcess use \c{vfork(2)} to start the child
+ process. Use this flag to indicate that the callback function set
+ with setChildProcessModifier() is safe to execute in the child side of
+ a \c{vfork(2)}; that is, the callback does not modify any non-local
+ variables (directly or through any function it calls), nor attempts
+ to communicate with the parent process. It is implementation-defined
+ if QProcess will actually use \c{vfork(2)} and if \c{vfork(2)} is
+ different from standard \c{fork(2)}.
+
+ \sa setUnixProcessParameters(), unixProcessParameters()
+*/
+
+/*!
\fn void QProcess::errorOccurred(QProcess::ProcessError error)
\since 5.6
@@ -869,7 +1018,7 @@ void QProcessPrivate::setErrorAndEmit(QProcess::ProcessError error, const QStrin
Q_Q(QProcess);
Q_ASSERT(error != QProcess::UnknownError);
setError(error, description);
- emit q->errorOccurred(processError);
+ emit q->errorOccurred(QProcess::ProcessError(processError));
}
/*!
@@ -1092,10 +1241,8 @@ void QProcessPrivate::processFinished()
cleanup();
- if (crashed) {
- exitStatus = QProcess::CrashExit;
+ if (exitStatus == QProcess::CrashExit)
setErrorAndEmit(QProcess::Crashed);
- }
// we received EOF now:
emit q->readChannelFinished();
@@ -1103,7 +1250,7 @@ void QProcessPrivate::processFinished()
//emit q->standardOutputClosed();
//emit q->standardErrorClosed();
- emit q->finished(exitCode, exitStatus);
+ emit q->finished(exitCode, QProcess::ExitStatus(exitStatus));
#if defined QPROCESS_DEBUG
qDebug("QProcessPrivate::processFinished(): process is dead");
@@ -1188,7 +1335,7 @@ QProcess::~QProcess()
QProcess::ProcessChannelMode QProcess::processChannelMode() const
{
Q_D(const QProcess);
- return d->processChannelMode;
+ return ProcessChannelMode(d->processChannelMode);
}
/*!
@@ -1218,7 +1365,7 @@ void QProcess::setProcessChannelMode(ProcessChannelMode mode)
QProcess::InputChannelMode QProcess::inputChannelMode() const
{
Q_D(const QProcess);
- return d->inputChannelMode;
+ return InputChannelMode(d->inputChannelMode);
}
/*!
@@ -1356,6 +1503,9 @@ void QProcess::setStandardInputFile(const QString &fileName)
Calling setStandardOutputFile() after the process has started has
no effect.
+ If \a fileName is an empty string, it stops redirecting the standard
+ output. This is useful for restoring the standard output after redirection.
+
\sa setStandardInputFile(), setStandardErrorFile(),
setStandardOutputProcess()
*/
@@ -1415,7 +1565,7 @@ void QProcess::setStandardOutputProcess(QProcess *destination)
dto->stdinChannel.pipeFrom(dfrom);
}
-#if defined(Q_OS_WIN) || defined(Q_CLANG_QDOC)
+#if defined(Q_OS_WIN) || defined(Q_QDOC)
/*!
\since 4.7
@@ -1499,12 +1649,12 @@ void QProcess::setCreateProcessArgumentsModifier(CreateProcessArgumentModifier m
\note This function is only available on Unix platforms.
- \sa setChildProcessModifier()
+ \sa setChildProcessModifier(), unixProcessParameters()
*/
std::function<void(void)> QProcess::childProcessModifier() const
{
Q_D(const QProcess);
- return d->childProcessModifier;
+ return d->unixExtras ? d->unixExtras->childProcessModifier : std::function<void(void)>();
}
/*!
@@ -1513,20 +1663,28 @@ std::function<void(void)> QProcess::childProcessModifier() const
Sets the \a modifier function for the child process, for Unix systems
(including \macos; for Windows, see setCreateProcessArgumentsModifier()).
The function contained by the \a modifier argument will be invoked in the
- child process after \c{fork()} is completed and QProcess has set up the
- standard file descriptors for the child process, but before \c{execve()},
- inside start(). The modifier is useful to change certain properties of the
- child process, such as setting up additional file descriptors or closing
- others, changing the nice level, disconnecting from the controlling TTY,
- etc.
+ child process after \c{fork()} or \c{vfork()} is completed and QProcess has
+ set up the standard file descriptors for the child process, but before
+ \c{execve()}, inside start().
The following shows an example of setting up a child process to run without
privileges:
\snippet code/src_corelib_io_qprocess.cpp 4
- If the modifier function needs to exit the process, remember to use
- \c{_exit()}, not \c{exit()}.
+ If the modifier function experiences a failure condition, it can use
+ failChildProcessModifier() to report the situation to the QProcess caller.
+ Alternatively, it may use other methods of stopping the process, like
+ \c{_exit()}, or \c{abort()}.
+
+ Certain properties of the child process, such as closing all extraneous
+ file descriptors or disconnecting from the controlling TTY, can be more
+ readily achieved by using setUnixProcessParameters(), which can detect
+ failure and report a \l{QProcess::}{FailedToStart} condition. The modifier
+ is useful to change certain uncommon properties of the child process, such
+ as setting up additional file descriptors. If both a child process modifier
+ and Unix process parameters are set, the modifier is run before these
+ parameters are applied.
\note In multithreaded applications, this function must be careful not to
call any functions that may lock mutexes that may have been in use in
@@ -1534,12 +1692,125 @@ std::function<void(void)> QProcess::childProcessModifier() const
"async-signal-safe" is advised). Most of the Qt API is unsafe inside this
callback, including qDebug(), and may lead to deadlocks.
- \sa childProcessModifier()
+ \note If the UnixProcessParameters::UseVFork flag is set via
+ setUnixProcessParameters(), QProcess may use \c{vfork()} semantics to
+ start the child process, so this function must obey even stricter
+ constraints. First, because it is still sharing memory with the parent
+ process, it must not write to any non-local variable and must obey proper
+ ordering semantics when reading from them, to avoid data races. Second,
+ even more library functions may misbehave; therefore, this function should
+ only make use of low-level system calls, such as \c{read()},
+ \c{write()}, \c{setsid()}, \c{nice()}, and similar.
+
+ \sa childProcessModifier(), failChildProcessModifier(), setUnixProcessParameters()
*/
void QProcess::setChildProcessModifier(const std::function<void(void)> &modifier)
{
Q_D(QProcess);
- d->childProcessModifier = modifier;
+ if (!d->unixExtras)
+ d->unixExtras.reset(new QProcessPrivate::UnixExtras);
+ d->unixExtras->childProcessModifier = modifier;
+}
+
+/*!
+ \fn void QProcess::failChildProcessModifier(const char *description, int error) noexcept
+ \since 6.7
+
+ This functions can be used inside the modifier set with
+ setChildProcessModifier() to indicate an error condition was encountered.
+ When the modifier calls these functions, QProcess will emit errorOccurred()
+ with code QProcess::FailedToStart in the parent process. The \a description
+ can be used to include some information in errorString() to help diagnose
+ the problem, usually the name of the call that failed, similar to the C
+ Library function \c{perror()}. Additionally, the \a error parameter can be
+ an \c{<errno.h>} error code whose text form will also be included.
+
+ For example, a child modifier could prepare an extra file descriptor for
+ the child process this way:
+
+ \code
+ process.setChildProcessModifier([fd, &process]() {
+ if (dup2(fd, TargetFileDescriptor) < 0)
+ process.failChildProcessModifier(errno, "aux comm channel");
+ });
+ process.start();
+ \endcode
+
+ Where \c{fd} is a file descriptor currently open in the parent process. If
+ the \c{dup2()} system call resulted in an \c EBADF condition, the process
+ errorString() could be "Child process modifier reported error: aux comm
+ channel: Bad file descriptor".
+
+ This function does not return to the caller. Using it anywhere except in
+ the child modifier and with the correct QProcess object is undefined
+ behavior.
+
+ \note The implementation imposes a length limit to the \a description
+ parameter to about 500 characters. This does not include the text from the
+ \a error code.
+
+ \sa setChildProcessModifier(), setUnixProcessParameters()
+*/
+
+/*!
+ \since 6.6
+ Returns the \l UnixProcessParameters object describing extra flags and
+ settings that will be applied to the child process on Unix systems. The
+ default settings correspond to a default-constructed UnixProcessParameters.
+
+ \note This function is only available on Unix platforms.
+
+ \sa childProcessModifier()
+*/
+auto QProcess::unixProcessParameters() const noexcept -> UnixProcessParameters
+{
+ Q_D(const QProcess);
+ return d->unixExtras ? d->unixExtras->processParameters : UnixProcessParameters{};
+}
+
+/*!
+ \since 6.6
+ Sets the extra settings and parameters for the child process on Unix
+ systems to be \a params. This function can be used to ask QProcess to
+ modify the child process before launching the target executable.
+
+ This function can be used to change certain properties of the child
+ process, such as closing all extraneous file descriptors, changing the nice
+ level of the child, or disconnecting from the controlling TTY. For more
+ fine-grained control of the child process or to modify it in other ways,
+ use the setChildProcessModifier() function. If both a child process
+ modifier and Unix process parameters are set, the modifier is run before
+ these parameters are applied.
+
+ \note This function is only available on Unix platforms.
+
+ \sa unixProcessParameters(), setChildProcessModifier()
+*/
+void QProcess::setUnixProcessParameters(const UnixProcessParameters &params)
+{
+ Q_D(QProcess);
+ if (!d->unixExtras)
+ d->unixExtras.reset(new QProcessPrivate::UnixExtras);
+ d->unixExtras->processParameters = params;
+}
+
+/*!
+ \since 6.6
+ \overload
+
+ Sets the extra settings for the child process on Unix systems to \a
+ flagsOnly. This is the same as the overload with just the \c flags field
+ set.
+ \note This function is only available on Unix platforms.
+
+ \sa unixProcessParameters(), setChildProcessModifier()
+*/
+void QProcess::setUnixProcessParameters(UnixProcessFlags flagsOnly)
+{
+ Q_D(QProcess);
+ if (!d->unixExtras)
+ d->unixExtras.reset(new QProcessPrivate::UnixExtras);
+ d->unixExtras->processParameters = { flagsOnly };
}
#endif
@@ -1563,9 +1834,6 @@ QString QProcess::workingDirectory() const
process in this directory. The default behavior is to start the
process in the working directory of the calling process.
- \note On QNX, this may cause all application threads to
- temporarily freeze.
-
\sa workingDirectory(), start()
*/
void QProcess::setWorkingDirectory(const QString &dir)
@@ -1633,7 +1901,7 @@ qint64 QProcess::bytesToWrite() const
QProcess::ProcessError QProcess::error() const
{
Q_D(const QProcess);
- return d->processError;
+ return ProcessError(d->processError);
}
/*!
@@ -1644,7 +1912,7 @@ QProcess::ProcessError QProcess::error() const
QProcess::ProcessState QProcess::state() const
{
Q_D(const QProcess);
- return d->processState;
+ return ProcessState(d->processState);
}
/*!
@@ -1691,7 +1959,8 @@ QStringList QProcess::environment() const
Note how, on Windows, environment variable names are case-insensitive.
- \sa processEnvironment(), QProcessEnvironment::systemEnvironment(), setEnvironment()
+ \sa processEnvironment(), QProcessEnvironment::systemEnvironment(),
+ {Environment variables}
*/
void QProcess::setProcessEnvironment(const QProcessEnvironment &environment)
{
@@ -1701,12 +1970,12 @@ void QProcess::setProcessEnvironment(const QProcessEnvironment &environment)
/*!
\since 4.6
- Returns the environment that QProcess will pass to its child
- process, or an empty object if no environment has been set using
- setEnvironment() or setProcessEnvironment(). If no environment has
- been set, the environment of the calling process will be used.
+ Returns the environment that QProcess will pass to its child process. If no
+ environment has been set using setProcessEnvironment(), this method returns
+ an object indicating the environment will be inherited from the parent.
- \sa setProcessEnvironment(), setEnvironment(), QProcessEnvironment::isEmpty()
+ \sa setProcessEnvironment(), QProcessEnvironment::inheritsFromParent(),
+ {Environment variables}
*/
QProcessEnvironment QProcess::processEnvironment() const
{
@@ -1720,7 +1989,8 @@ QProcessEnvironment QProcess::processEnvironment() const
Returns \c true if the process was started successfully; otherwise
returns \c false (if the operation timed out or if an error
- occurred).
+ occurred). If the process had already started successfully before this
+ function, it returns immediately.
This function can operate without an event loop. It is
useful when writing non-GUI applications and when performing
@@ -1731,9 +2001,6 @@ QProcessEnvironment QProcess::processEnvironment() const
If msecs is -1, this function will not time out.
- \note On some UNIX operating systems, this function may return true but
- the process may later report a QProcess::FailedToStart error.
-
\sa started(), waitForReadyRead(), waitForBytesWritten(), waitForFinished()
*/
bool QProcess::waitForStarted(int msecs)
@@ -1841,8 +2108,7 @@ void QProcess::setProcessState(ProcessState state)
*/
auto QProcess::setupChildProcess() -> Use_setChildProcessModifier_Instead
{
- Q_UNREACHABLE();
- return {};
+ Q_UNREACHABLE_RETURN({});
}
#endif
@@ -1884,27 +2150,38 @@ QByteArray QProcess::readAllStandardOutput()
*/
QByteArray QProcess::readAllStandardError()
{
- ProcessChannel tmp = readChannel();
- setReadChannel(StandardError);
- QByteArray data = readAll();
- setReadChannel(tmp);
+ Q_D(QProcess);
+ QByteArray data;
+ if (d->processChannelMode == MergedChannels) {
+ qWarning("QProcess::readAllStandardError: Called with MergedChannels");
+ } else {
+ ProcessChannel tmp = readChannel();
+ setReadChannel(StandardError);
+ data = readAll();
+ setReadChannel(tmp);
+ }
return data;
}
/*!
Starts the given \a program in a new process, passing the command line
- arguments in \a arguments.
+ arguments in \a arguments. See setProgram() for information about how
+ QProcess searches for the executable to be run. The OpenMode is set to \a
+ mode. No further splitting of the arguments is performed.
The QProcess object will immediately enter the Starting state. If the
process starts successfully, QProcess will emit started(); otherwise,
- errorOccurred() will be emitted.
-
- \note Processes are started asynchronously, which means the started()
- and errorOccurred() signals may be delayed. Call waitForStarted() to make
- sure the process has started (or has failed to start) and those signals
- have been emitted.
-
- \note No further splitting of the arguments is performed.
+ errorOccurred() will be emitted. Do note that on platforms that are able to
+ start child processes synchronously (notably Windows), those signals will
+ be emitted before this function returns and this QProcess object will
+ transition to either QProcess::Running or QProcess::NotRunning state,
+ respectively. On others paltforms, the started() and errorOccurred()
+ signals will be delayed.
+
+ Call waitForStarted() to make sure the process has started (or has failed
+ to start) and those signals have been emitted. It is safe to call that
+ function even if the process starting state is already known, though the
+ signal will not be emitted again.
\b{Windows:} The arguments are quoted and joined into a command line
that is compatible with the \c CommandLineToArgvW() Windows function.
@@ -1913,12 +2190,16 @@ QByteArray QProcess::readAllStandardError()
not follow the \c CommandLineToArgvW() rules is cmd.exe and, by
consequence, all batch scripts.
- The OpenMode is set to \a mode.
-
If the QProcess object is already running a process, a warning may be
printed at the console, and the existing process will continue running
unaffected.
+ \note Success at starting the child process only implies the operating
+ system has successfully created the process and assigned the resources
+ every process has, such as its process ID. The child process may crash or
+ otherwise fail very early and thus not produce its expected output. On most
+ operating systems, this may include dynamic linking errors.
+
\sa processId(), started(), waitForStarted(), setNativeArguments()
*/
void QProcess::start(const QString &program, const QStringList &arguments, OpenMode mode)
@@ -2000,6 +2281,10 @@ void QProcess::start(OpenMode mode)
void QProcess::startCommand(const QString &command, OpenMode mode)
{
QStringList args = splitCommand(command);
+ if (args.isEmpty()) {
+ qWarning("QProcess::startCommand: empty or whitespace-only command was provided");
+ return;
+ }
const QString program = args.takeFirst();
start(program, args, mode);
}
@@ -2019,9 +2304,6 @@ void QProcess::startCommand(const QString &command, OpenMode mode)
If workingDirectory() is empty, the working directory is inherited
from the calling process.
- \note On QNX, this may cause all application threads to
- temporarily freeze.
-
If the function is successful then *\a pid is set to the process identifier
of the started process; otherwise, it's set to -1. Note that the child
process may exit and the PID may become invalid without notice.
@@ -2154,7 +2436,7 @@ QStringList QProcess::splitCommand(QStringView command)
// "hello world". three consecutive double quotes represent
// the quote character itself.
for (int i = 0; i < command.size(); ++i) {
- if (command.at(i) == QLatin1Char('"')) {
+ if (command.at(i) == u'"') {
++quoteCount;
if (quoteCount == 3) {
// third consecutive quote
@@ -2202,7 +2484,12 @@ QString QProcess::program() const
Set the \a program to use when starting the process.
This function must be called before start().
- \sa start(), setArguments(), program()
+ If \a program is an absolute path, it specifies the exact executable that
+ will be launched. Relative paths will be resolved in a platform-specific
+ manner, which includes searching the \c PATH environment variable (see
+ \l{Finding the Executable} for details).
+
+ \sa start(), setArguments(), program(), QStandardPaths::findExecutable()
*/
void QProcess::setProgram(const QString &program)
{
@@ -2304,7 +2591,7 @@ int QProcess::exitCode() const
QProcess::ExitStatus QProcess::exitStatus() const
{
Q_D(const QProcess);
- return d->exitStatus;
+ return ExitStatus(d->exitStatus);
}
/*!
@@ -2365,18 +2652,6 @@ bool QProcess::startDetached(const QString &program,
return process.startDetached(pid);
}
-QT_BEGIN_INCLUDE_NAMESPACE
-#if defined(Q_OS_MACOS)
-# include <crt_externs.h>
-# define environ (*_NSGetEnviron())
-#elif defined(QT_PLATFORM_UIKIT)
- static char *qt_empty_environ[] = { 0 };
-#define environ qt_empty_environ
-#elif !defined(Q_OS_WIN)
- extern char **environ;
-#endif
-QT_END_INCLUDE_NAMESPACE
-
/*!
\since 4.1
@@ -2398,12 +2673,7 @@ QT_END_INCLUDE_NAMESPACE
*/
QStringList QProcess::systemEnvironment()
{
- QStringList tmp;
- char *entry = nullptr;
- int count = 0;
- while ((entry = environ[count++]))
- tmp << QString::fromLocal8Bit(entry);
- return tmp;
+ return QProcessEnvironment::systemEnvironment().toStringList();
}
/*!
diff --git a/src/corelib/io/qprocess.h b/src/corelib/io/qprocess.h
index 50740c092b..34724a6794 100644
--- a/src/corelib/io/qprocess.h
+++ b/src/corelib/io/qprocess.h
@@ -1,45 +1,11 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2023 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QPROCESS_H
#define QPROCESS_H
+#include <QtCore/qcompare.h>
#include <QtCore/qiodevice.h>
#include <QtCore/qstringlist.h>
#include <QtCore/qshareddata.h>
@@ -48,7 +14,7 @@
QT_REQUIRE_CONFIG(processenvironment);
-#if defined(Q_OS_WIN) || defined(Q_CLANG_QDOC)
+#if defined(Q_OS_WIN) || defined(Q_QDOC)
struct _PROCESS_INFORMATION;
struct _SECURITY_ATTRIBUTES;
struct _STARTUPINFOW;
@@ -68,17 +34,19 @@ public:
enum Initialization { InheritFromParent };
QProcessEnvironment();
- QProcessEnvironment(Initialization);
+ QProcessEnvironment(Initialization) noexcept;
QProcessEnvironment(const QProcessEnvironment &other);
~QProcessEnvironment();
QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_PURE_SWAP(QProcessEnvironment)
QProcessEnvironment &operator=(const QProcessEnvironment &other);
- void swap(QProcessEnvironment &other) noexcept { qSwap(d, other.d); }
+ void swap(QProcessEnvironment &other) noexcept { d.swap(other.d); }
+#if QT_CORE_REMOVED_SINCE(6, 8)
bool operator==(const QProcessEnvironment &other) const;
inline bool operator!=(const QProcessEnvironment &other) const
- { return !(*this == other); }
+ { return !operator==(other); }
+#endif
bool isEmpty() const;
[[nodiscard]] bool inheritsFromParent() const;
@@ -98,6 +66,9 @@ public:
static QProcessEnvironment systemEnvironment();
private:
+ friend Q_CORE_EXPORT bool comparesEqual(const QProcessEnvironment &lhs,
+ const QProcessEnvironment &rhs);
+ Q_DECLARE_EQUALITY_COMPARABLE(QProcessEnvironment)
friend class QProcessPrivate;
friend class QProcessEnvironmentPrivate;
QSharedDataPointer<QProcessEnvironmentPrivate> d;
@@ -186,7 +157,7 @@ public:
void setStandardErrorFile(const QString &fileName, OpenMode mode = Truncate);
void setStandardOutputProcess(QProcess *destination);
-#if defined(Q_OS_WIN) || defined(Q_CLANG_QDOC)
+#if defined(Q_OS_WIN) || defined(Q_QDOC)
QString nativeArguments() const;
void setNativeArguments(const QString &arguments);
struct CreateProcessArguments
@@ -205,10 +176,33 @@ public:
typedef std::function<void(CreateProcessArguments *)> CreateProcessArgumentModifier;
CreateProcessArgumentModifier createProcessArgumentsModifier() const;
void setCreateProcessArgumentsModifier(CreateProcessArgumentModifier modifier);
-#endif // Q_OS_WIN || Q_CLANG_QDOC
-#if defined(Q_OS_UNIX) || defined(Q_CLANG_QDOC)
+#endif // Q_OS_WIN || Q_QDOC
+#if defined(Q_OS_UNIX) || defined(Q_QDOC)
std::function<void(void)> childProcessModifier() const;
void setChildProcessModifier(const std::function<void(void)> &modifier);
+ Q_NORETURN void failChildProcessModifier(const char *description, int error = 0) noexcept;
+
+ enum class UnixProcessFlag : quint32 {
+ ResetSignalHandlers = 0x0001, // like POSIX_SPAWN_SETSIGDEF
+ IgnoreSigPipe = 0x0002,
+ // some room if we want to add IgnoreSigHup or so
+ CloseFileDescriptors = 0x0010,
+ UseVFork = 0x0020, // like POSIX_SPAWN_USEVFORK
+ CreateNewSession = 0x0040, // like POSIX_SPAWN_SETSID
+ DisconnectControllingTerminal = 0x0080,
+ ResetIds = 0x0100, // like POSIX_SPAWN_RESETIDS
+ };
+ Q_DECLARE_FLAGS(UnixProcessFlags, UnixProcessFlag)
+ struct UnixProcessParameters
+ {
+ UnixProcessFlags flags = {};
+ int lowestFileDescriptorToClose = 0;
+
+ quint32 _reserved[6] {};
+ };
+ UnixProcessParameters unixProcessParameters() const noexcept;
+ void setUnixProcessParameters(const UnixProcessParameters &params);
+ void setUnixProcessParameters(UnixProcessFlags flagsOnly);
#endif
QString workingDirectory() const;
@@ -292,6 +286,10 @@ private:
Q_PRIVATE_SLOT(d_func(), void _q_processDied())
};
+#ifdef Q_OS_UNIX
+Q_DECLARE_OPERATORS_FOR_FLAGS(QProcess::UnixProcessFlags)
+#endif
+
#endif // QT_CONFIG(process)
QT_END_NAMESPACE
diff --git a/src/corelib/io/qprocess_darwin.mm b/src/corelib/io/qprocess_darwin.mm
index 2c3c296cb4..29b6c6f25d 100644
--- a/src/corelib/io/qprocess_darwin.mm
+++ b/src/corelib/io/qprocess_darwin.mm
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include <private/qprocess_p.h>
diff --git a/src/corelib/io/qprocess_p.h b/src/corelib/io/qprocess_p.h
index aec8f458fc..9510101e74 100644
--- a/src/corelib/io/qprocess_p.h
+++ b/src/corelib/io/qprocess_p.h
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2016 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QPROCESS_P_H
#define QPROCESS_P_H
@@ -295,29 +259,12 @@ public:
bool _q_startupNotification();
void _q_processDied();
- QProcess::ProcessChannelMode processChannelMode = QProcess::SeparateChannels;
- QProcess::InputChannelMode inputChannelMode = QProcess::ManagedInputChannel;
- QProcess::ProcessError processError = QProcess::UnknownError;
- QProcess::ProcessState processState = QProcess::NotRunning;
- QString workingDirectory;
-#ifdef Q_OS_WIN
- Q_PROCESS_INFORMATION *pid = nullptr;
-#else
- qint64 pid = 0;
-#endif
-
- bool emittedReadyRead = false;
- bool emittedBytesWritten = false;
-
Channel stdinChannel;
Channel stdoutChannel;
Channel stderrChannel;
bool openChannels();
bool openChannelsForDetached();
bool openChannel(Channel &channel);
-#if defined(Q_OS_UNIX)
- void commitChannels();
-#endif
void closeChannel(Channel *channel);
void closeWriteChannel();
void closeChannels();
@@ -325,26 +272,38 @@ public:
QString program;
QStringList arguments;
+ QString workingDirectory;
+ QProcessEnvironment environment = QProcessEnvironment::InheritFromParent;
#if defined(Q_OS_WIN)
QString nativeArguments;
QProcess::CreateProcessArgumentModifier modifyCreateProcessArgs;
+ QWinEventNotifier *processFinishedNotifier = nullptr;
+ Q_PROCESS_INFORMATION *pid = nullptr;
#else
- std::function<void(void)> childProcessModifier;
-#endif
- QProcessEnvironment environment = QProcessEnvironment::InheritFromParent;
-
-#ifdef Q_OS_UNIX
- Q_PIPE childStartedPipe[2] = {INVALID_Q_PIPE, INVALID_Q_PIPE};
+ struct UnixExtras {
+ std::function<void(void)> childProcessModifier;
+ QProcess::UnixProcessParameters processParameters;
+ };
+ std::unique_ptr<UnixExtras> unixExtras;
QSocketNotifier *stateNotifier = nullptr;
+ Q_PIPE childStartedPipe[2] = {INVALID_Q_PIPE, INVALID_Q_PIPE};
+ pid_t pid = 0;
int forkfd = -1;
-#else
- QWinEventNotifier *processFinishedNotifier = nullptr;
#endif
+ int exitCode = 0;
+ quint8 processState = QProcess::NotRunning;
+ quint8 exitStatus = QProcess::NormalExit;
+ quint8 processError = QProcess::UnknownError;
+ quint8 processChannelMode = QProcess::SeparateChannels;
+ quint8 inputChannelMode = QProcess::ManagedInputChannel;
+ bool emittedReadyRead = false;
+ bool emittedBytesWritten = false;
+
void start(QIODevice::OpenMode mode);
void startProcess();
#if defined(Q_OS_UNIX)
- void execChild(const char *workingDirectory, char **argv, char **envp);
+ void commitChannels() const;
#endif
bool processStarted(QString *errorMessage = nullptr);
void processFinished();
@@ -363,10 +322,6 @@ public:
bool startDetached(qint64 *pPid);
- int exitCode = 0;
- QProcess::ExitStatus exitStatus = QProcess::NormalExit;
- bool crashed = false;
-
bool waitForStarted(const QDeadlineTimer &deadline);
bool waitForReadyRead(const QDeadlineTimer &deadline);
bool waitForBytesWritten(const QDeadlineTimer &deadline);
@@ -379,6 +334,9 @@ public:
void cleanup();
void setError(QProcess::ProcessError error, const QString &description = QString());
void setErrorAndEmit(QProcess::ProcessError error, const QString &description = QString());
+
+ const QProcessEnvironmentPrivate *environmentPrivate() const
+ { return environment.d.constData(); }
};
#endif // QT_CONFIG(process)
diff --git a/src/corelib/io/qprocess_unix.cpp b/src/corelib/io/qprocess_unix.cpp
index bf19fc2183..5c696433fd 100644
--- a/src/corelib/io/qprocess_unix.cpp
+++ b/src/corelib/io/qprocess_unix.cpp
@@ -1,43 +1,7 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Copyright (C) 2021 Intel Corporation.
-** Copyright (C) 2021 Alex Trotsenko.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// Copyright (C) 2022 Intel Corporation.
+// Copyright (C) 2021 Alex Trotsenko.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
//#define QPROCESS_DEBUG
#include "qdebug.h"
@@ -50,7 +14,7 @@
#include "private/qcore_unix_p.h"
#include "private/qlocking_p.h"
-#ifdef Q_OS_MAC
+#ifdef Q_OS_DARWIN
#include <private/qcore_mac_p.h>
#endif
@@ -69,20 +33,45 @@
#endif
#include <errno.h>
+#include <limits.h>
#include <stdlib.h>
#include <string.h>
+#include <sys/resource.h>
+#include <termios.h>
+#include <unistd.h>
+
+#if __has_include(<paths.h>)
+# include <paths.h>
+#endif
+#if __has_include(<linux/close_range.h>)
+// FreeBSD's is in <unistd.h>
+# include <linux/close_range.h>
+#endif
#if QT_CONFIG(process)
#include <forkfd.h>
#endif
+#ifndef O_PATH
+# define O_PATH 0
+#endif
+#ifndef _PATH_DEV
+# define _PATH_DEV "/dev/"
+#endif
+#ifndef _PATH_TTY
+# define _PATH_TTY _PATH_DEV "tty"
+#endif
+
+#ifdef Q_OS_FREEBSD
+__attribute__((weak))
+#endif
+extern char **environ;
+
QT_BEGIN_NAMESPACE
-#if !defined(Q_OS_DARWIN)
+using namespace Qt::StringLiterals;
-QT_BEGIN_INCLUDE_NAMESPACE
-extern char **environ;
-QT_END_INCLUDE_NAMESPACE
+#if !defined(Q_OS_DARWIN)
QProcessEnvironment QProcessEnvironment::systemEnvironment()
{
@@ -105,6 +94,70 @@ QProcessEnvironment QProcessEnvironment::systemEnvironment()
#if QT_CONFIG(process)
+namespace QtVforkSafe {
+// Certain libc functions we need to call in the child process scenario aren't
+// safe under vfork() because they do more than just place the system call to
+// the kernel and set errno on return. For those, we'll create a function
+// pointer like:
+// static constexpr auto foobar = __libc_foobar;
+// while for all other OSes, it'll be
+// using ::foobar;
+// allowing the code for the child side of the vfork to simply use
+// QtVforkSafe::foobar(args);
+//
+// Currently known issues are:
+//
+// - FreeBSD's libthr sigaction() wrapper locks a rwlock
+// https://github.com/freebsd/freebsd-src/blob/8dad5ece49479ba6cdcd5bb4c2799bbd61add3e6/lib/libthr/thread/thr_sig.c#L575-L641
+// - MUSL's sigaction() locks a mutex if the signal is SIGABR
+// https://github.com/bminor/musl/blob/718f363bc2067b6487900eddc9180c84e7739f80/src/signal/sigaction.c#L63-L85
+//
+// All other functions called in the child side are vfork-safe, provided that
+// PThread cancellation is disabled and Unix signals are blocked.
+#if defined(__MUSL__)
+# define LIBC_PREFIX __libc_
+#elif defined(Q_OS_FREEBSD)
+// will cause QtCore to link to ELF version "FBSDprivate_1.0"
+# define LIBC_PREFIX _
+#endif
+
+#ifdef LIBC_PREFIX
+# define CONCAT(x, y) CONCAT2(x, y)
+# define CONCAT2(x, y) x ## y
+# define DECLARE_FUNCTIONS(NAME) \
+ extern decltype(::NAME) CONCAT(LIBC_PREFIX, NAME); \
+ static constexpr auto NAME = std::addressof(CONCAT(LIBC_PREFIX, NAME));
+#else // LIBC_PREFIX
+# define DECLARE_FUNCTIONS(NAME) using ::NAME;
+#endif // LIBC_PREFIX
+
+extern "C" {
+DECLARE_FUNCTIONS(sigaction)
+}
+
+#undef LIBC_PREFIX
+#undef DECLARE_FUNCTIONS
+
+// similar to qt_ignore_sigpipe() in qcore_unix_p.h, but vfork-safe
+static void change_sigpipe(decltype(SIG_DFL) new_handler)
+{
+ struct sigaction sa;
+ memset(&sa, 0, sizeof(sa));
+ sa.sa_handler = new_handler;
+ sigaction(SIGPIPE, &sa, nullptr);
+}
+} // namespace QtVforkSafe
+
+static int opendirfd(QByteArray encodedName)
+{
+ // We append "/." to the name to ensure that the directory is actually
+ // traversable (i.e., has the +x bit set). This avoids later problems
+ // with fchdir().
+ if (encodedName != "/" && !encodedName.endsWith("/."))
+ encodedName += "/.";
+ return qt_safe_open(encodedName, QT_OPEN_RDONLY | O_DIRECTORY | O_PATH);
+}
+
namespace {
struct AutoPipe
{
@@ -128,22 +181,13 @@ struct AutoPipe
struct ChildError
{
- qint64 code;
- char function[8];
-};
-
-// Used for argv and envp arguments to execve()
-struct CharPointerList
-{
- std::unique_ptr<char *[]> pointers;
-
- CharPointerList(const QString &argv0, const QStringList &args);
- explicit CharPointerList(const QProcessEnvironmentPrivate *env);
-
-private:
- QByteArray data;
- void updatePointers(qsizetype count);
+ int code;
+ char function[_POSIX_PIPE_BUF - sizeof(code)];
};
+static_assert(std::is_trivial_v<ChildError>);
+#ifdef PIPE_BUF
+static_assert(PIPE_BUF >= sizeof(ChildError)); // PIPE_BUF may be bigger
+#endif
struct QProcessPoller
{
@@ -178,10 +222,139 @@ QProcessPoller::QProcessPoller(const QProcessPrivate &proc)
int QProcessPoller::poll(const QDeadlineTimer &deadline)
{
- return qt_poll_msecs(pfds, n_pfds, deadline.remainingTime());
+ return qt_safe_poll(pfds, n_pfds, deadline);
}
-CharPointerList::CharPointerList(const QString &program, const QStringList &args)
+struct QChildProcess
+{
+ // Used for argv and envp arguments to execve()
+ struct CharPointerList
+ {
+ std::unique_ptr<char *[]> pointers;
+
+ CharPointerList(const QString &argv0, const QStringList &args);
+ explicit CharPointerList(const QProcessEnvironmentPrivate *env);
+ /*implicit*/ operator char **() const { return pointers.get(); }
+
+ private:
+ QByteArray data;
+ void updatePointers(qsizetype count);
+ };
+
+ const QProcessPrivate *d;
+ CharPointerList argv;
+ CharPointerList envp;
+ sigset_t oldsigset;
+ int workingDirectory = -2;
+ bool isUsingVfork = usingVfork();
+
+ bool ok() const
+ {
+ return workingDirectory != -1;
+ }
+
+ QChildProcess(QProcessPrivate *d)
+ : d(d), argv(resolveExecutable(d->program), d->arguments),
+ envp(d->environmentPrivate())
+ {
+ // Block Unix signals, to ensure the user's handlers aren't run in the
+ // child side and do something weird, especially if the handler and the
+ // user of QProcess are completely different codebases.
+ maybeBlockSignals();
+
+ // Disable PThread cancellation until the child has successfully been
+ // executed. We make a number of POSIX calls in the child that are thread
+ // cancellation points and could cause an unexpected stack unwind. That
+ // would be bad enough with regular fork(), but it's likely fatal with
+ // vfork().
+ disableThreadCancellations();
+
+ if (!d->workingDirectory.isEmpty()) {
+ workingDirectory = opendirfd(QFile::encodeName(d->workingDirectory));
+ if (workingDirectory < 0) {
+ d->setErrorAndEmit(QProcess::FailedToStart, "chdir: "_L1 + qt_error_string());
+ d->cleanup();
+ }
+ }
+
+ }
+ ~QChildProcess() noexcept(false)
+ {
+ if (workingDirectory >= 0)
+ close(workingDirectory);
+
+ restoreThreadCancellations();
+ restoreSignalMask();
+ }
+
+ void maybeBlockSignals() noexcept
+ {
+ // We only block Unix signals if we're using vfork(), to avoid a
+ // changing behavior to the user's modifier and because in some OSes
+ // this action would block crashing signals too.
+ if (isUsingVfork) {
+ sigset_t emptyset;
+ sigfillset(&emptyset);
+ pthread_sigmask(SIG_SETMASK, &emptyset, &oldsigset);
+ }
+ }
+
+ void restoreSignalMask() const noexcept
+ {
+ if (isUsingVfork)
+ pthread_sigmask(SIG_SETMASK, &oldsigset, nullptr);
+ }
+
+ bool usingVfork() const noexcept;
+
+ template <typename Lambda> int doFork(Lambda &&childLambda)
+ {
+ pid_t pid;
+ if (isUsingVfork) {
+ QT_IGNORE_DEPRECATIONS(pid = vfork();)
+ } else {
+ pid = fork();
+ }
+ if (pid == 0)
+ _exit(childLambda());
+ return pid;
+ }
+
+ int startChild(pid_t *pid)
+ {
+ int ffdflags = FFD_CLOEXEC | (isUsingVfork ? 0 : FFD_USE_FORK);
+ return ::vforkfd(ffdflags, pid, &QChildProcess::startProcess, this);
+ }
+
+private:
+ Q_NORETURN void startProcess() const noexcept;
+ static int startProcess(void *self) noexcept
+ {
+ static_cast<QChildProcess *>(self)->startProcess();
+ Q_UNREACHABLE_RETURN(-1);
+ }
+
+#if defined(PTHREAD_CANCEL_DISABLE)
+ int oldstate;
+ void disableThreadCancellations() noexcept
+ {
+ // the following is *not* noexcept, but it won't throw while disabling
+ pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &oldstate);
+ }
+ void restoreThreadCancellations() noexcept(false)
+ {
+ // this doesn't touch errno
+ pthread_setcancelstate(oldstate, nullptr);
+ }
+#else
+ void disableThreadCancellations() noexcept {}
+ void restoreThreadCancellations() {}
+#endif
+
+ static QString resolveExecutable(const QString &program);
+};
+
+QChildProcess::CharPointerList::CharPointerList(const QString &program, const QStringList &args)
{
qsizetype count = 1 + args.size();
pointers.reset(new char *[count + 1]);
@@ -204,7 +377,7 @@ CharPointerList::CharPointerList(const QString &program, const QStringList &args
updatePointers(count);
}
-CharPointerList::CharPointerList(const QProcessEnvironmentPrivate *environment)
+QChildProcess::CharPointerList::CharPointerList(const QProcessEnvironmentPrivate *environment)
{
if (!environment)
return;
@@ -230,7 +403,7 @@ CharPointerList::CharPointerList(const QProcessEnvironmentPrivate *environment)
updatePointers(count);
}
-void CharPointerList::updatePointers(qsizetype count)
+void QChildProcess::CharPointerList::updatePointers(qsizetype count)
{
char *const base = const_cast<char *>(data.constBegin());
for (qsizetype i = 0; i < count; ++i)
@@ -251,7 +424,8 @@ static int qt_create_pipe(int *pipe)
qt_safe_close(pipe[1]);
int pipe_ret = qt_safe_pipe(pipe);
if (pipe_ret != 0) {
- qErrnoWarning("QProcessPrivate::createPipe: Cannot create pipe %p", pipe);
+ QScopedValueRollback rollback(errno);
+ qErrnoWarning("QProcess: Cannot create pipe");
}
return pipe_ret;
}
@@ -300,8 +474,10 @@ bool QProcessPrivate::openChannel(Channel &channel)
if (channel.type == Channel::Normal) {
// we're piping this channel to our own process
- if (qt_create_pipe(channel.pipe) != 0)
+ if (qt_create_pipe(channel.pipe) != 0) {
+ setErrorAndEmit(QProcess::FailedToStart, "pipe: "_L1 + qt_error_string(errno));
return false;
+ }
// create the socket notifiers
if (threadData.loadRelaxed()->hasEventDispatcher()) {
@@ -349,7 +525,6 @@ bool QProcessPrivate::openChannel(Channel &channel)
setErrorAndEmit(QProcess::FailedToStart,
QProcess::tr("Could not open input redirection for reading"));
}
- cleanup();
return false;
} else {
Q_ASSERT_X(channel.process, "QProcess::start", "Internal error");
@@ -381,8 +556,10 @@ bool QProcessPrivate::openChannel(Channel &channel)
Q_ASSERT(sink->pipe[0] == INVALID_Q_PIPE && sink->pipe[1] == INVALID_Q_PIPE);
Q_PIPE pipe[2] = { -1, -1 };
- if (qt_create_pipe(pipe) != 0)
+ if (qt_create_pipe(pipe) != 0) {
+ setErrorAndEmit(QProcess::FailedToStart, "pipe: "_L1 + qt_error_string(errno));
return false;
+ }
sink->pipe[0] = pipe[0];
source->pipe[1] = pipe[1];
@@ -391,7 +568,7 @@ bool QProcessPrivate::openChannel(Channel &channel)
}
}
-void QProcessPrivate::commitChannels()
+void QProcessPrivate::commitChannels() const
{
// copy the stdin socket if asked to (without closing on exec)
if (stdinChannel.pipe[0] != INVALID_Q_PIPE)
@@ -409,19 +586,19 @@ void QProcessPrivate::commitChannels()
}
}
-static QString resolveExecutable(const QString &program)
+inline QString QChildProcess::resolveExecutable(const QString &program)
{
#ifdef Q_OS_DARWIN
// allow invoking of .app bundles on the Mac.
QFileInfo fileInfo(program);
- if (program.endsWith(QLatin1String(".app")) && fileInfo.isDir()) {
+ if (program.endsWith(".app"_L1) && fileInfo.isDir()) {
QCFType<CFURLRef> url = CFURLCreateWithFileSystemPath(0,
QCFString(fileInfo.absoluteFilePath()),
kCFURLPOSIXPathStyle, true);
{
// CFBundle is not reentrant, since CFBundleCreate might return a reference
// to a cached bundle object. Protect the bundle calls with a mutex lock.
- static QBasicMutex cfbundleMutex;
+ Q_CONSTINIT static QBasicMutex cfbundleMutex;
const auto locker = qt_scoped_lock(cfbundleMutex);
QCFType<CFBundleRef> bundle = CFBundleCreate(0, url);
// 'executableURL' can be either relative or absolute ...
@@ -436,25 +613,86 @@ static QString resolveExecutable(const QString &program)
}
#endif
- if (!program.contains(QLatin1Char('/'))) {
- QString exeFilePath = QStandardPaths::findExecutable(program);
- if (!exeFilePath.isEmpty())
- return exeFilePath;
+ if (!program.contains(u'/')) {
+ // findExecutable() returns its argument if it's an absolute path,
+ // otherwise it searches $PATH; returns empty if not found (we handle
+ // that case much later)
+ return QStandardPaths::findExecutable(program);
}
return program;
}
+extern "C" {
+__attribute__((weak)) pid_t __interceptor_vfork();
+}
+
+inline bool globalUsingVfork() noexcept
+{
+#if defined(__SANITIZE_ADDRESS__) || __has_feature(address_sanitizer)
+ // ASan writes to global memory, so we mustn't use vfork().
+ return false;
+#endif
+#if defined(__SANITIZE_THREAD__) || __has_feature(thread_sanitizer)
+ // Ditto, apparently
+ return false;
+#endif
+#if defined(Q_OS_LINUX) && !QT_CONFIG(forkfd_pidfd)
+ // some broken environments are known to have problems with the new Linux
+ // API, so we have a way for users to opt-out during configure time (see
+ // QTBUG-86285)
+ return false;
+#endif
+#if defined(Q_OS_DARWIN)
+ // Using vfork() for startDetached() is causing problems. We don't know
+ // why: without the tools to investigate why it happens, we didn't bother.
+ return false;
+#endif
+
+ // Dynamically detect whether libasan or libtsan are loaded into the
+ // process' memory. We need this because the user's code may be compiled
+ // with ASan or TSan, but not Qt.
+ return __interceptor_vfork == nullptr;
+}
+
+inline bool QChildProcess::usingVfork() const noexcept
+{
+ if (!globalUsingVfork())
+ return false;
+
+ if (!d->unixExtras || !d->unixExtras->childProcessModifier)
+ return true; // no modifier was supplied
+
+ // if a modifier was supplied, use fork() unless the user opts in to
+ // vfork()
+ auto flags = d->unixExtras->processParameters.flags;
+ return flags.testFlag(QProcess::UnixProcessFlag::UseVFork);
+}
+
+#ifdef QT_BUILD_INTERNAL
+Q_AUTOTEST_EXPORT bool _qprocessUsingVfork() noexcept
+{
+ return globalUsingVfork();
+}
+#endif
+
void QProcessPrivate::startProcess()
{
Q_Q(QProcess);
+ q->setProcessState(QProcess::Starting);
#if defined (QPROCESS_DEBUG)
qDebug("QProcessPrivate::startProcess()");
#endif
// Initialize pipes
- if (!openChannels() || qt_create_pipe(childStartedPipe) != 0) {
- setErrorAndEmit(QProcess::FailedToStart, qt_error_string(errno));
+ if (!openChannels()) {
+ // openChannel sets the error string
+ Q_ASSERT(!errorString.isEmpty());
+ cleanup();
+ return;
+ }
+ if (qt_create_pipe(childStartedPipe) != 0) {
+ setErrorAndEmit(QProcess::FailedToStart, "pipe: "_L1 + qt_error_string(errno));
cleanup();
return;
}
@@ -469,30 +707,15 @@ void QProcessPrivate::startProcess()
q, SLOT(_q_startupNotification()));
}
- // Start the process (platform dependent)
- q->setProcessState(QProcess::Starting);
-
// Prepare the arguments and the environment
- const CharPointerList argv(resolveExecutable(program), arguments);
- const CharPointerList envp(environment.d.constData());
-
- // Encode the working directory if it's non-empty, otherwise just pass 0.
- const char *workingDirPtr = nullptr;
- QByteArray encodedWorkingDirectory;
- if (!workingDirectory.isEmpty()) {
- encodedWorkingDirectory = QFile::encodeName(workingDirectory);
- workingDirPtr = encodedWorkingDirectory.constData();
+ QChildProcess childProcess(this);
+ if (!childProcess.ok()) {
+ Q_ASSERT(processError != QProcess::UnknownError);
+ return;
}
- int ffdflags = FFD_CLOEXEC;
-
- // QTBUG-86285
-#if !QT_CONFIG(forkfd_pidfd)
- ffdflags |= FFD_USE_FORK;
-#endif
-
- pid_t childPid;
- forkfd = ::forkfd(ffdflags , &childPid);
+ // Start the child.
+ forkfd = childProcess.startChild(&pid);
int lastForkErrno = errno;
if (forkfd == -1) {
@@ -507,13 +730,6 @@ void QProcessPrivate::startProcess()
return;
}
- // Start the child.
- if (forkfd == FFD_CHILD_PROCESS) {
- execChild(workingDirPtr, argv.pointers.get(), envp.pointers.get());
- ::_exit(-1);
- }
-
- pid = qint64(childPid);
Q_ASSERT(pid > 0);
// parent
@@ -545,47 +761,187 @@ void QProcessPrivate::startProcess()
::fcntl(stderrChannel.pipe[0], F_SETFL, ::fcntl(stderrChannel.pipe[0], F_GETFL) | O_NONBLOCK);
}
-void QProcessPrivate::execChild(const char *workingDir, char **argv, char **envp)
+// we need an errno number to use to indicate the child process modifier threw,
+// something the regular operations shouldn't set.
+static constexpr int FakeErrnoForThrow = std::numeric_limits<int>::max();
+
+static QString startFailureErrorMessage(ChildError &err, [[maybe_unused]] ssize_t bytesRead)
+{
+ // ChildError is less than the POSIX pipe buffer atomic size, so the read
+ // must not have been truncated
+ Q_ASSERT(bytesRead == sizeof(err));
+
+ qsizetype len = qstrnlen(err.function, sizeof(err.function));
+ QString complement = QString::fromUtf8(err.function, len);
+ if (err.code == FakeErrnoForThrow)
+ return QProcess::tr("Child process modifier threw an exception: %1")
+ .arg(std::move(complement));
+ if (err.code == 0)
+ return QProcess::tr("Child process modifier reported error: %1")
+ .arg(std::move(complement));
+ if (err.code < 0)
+ return QProcess::tr("Child process modifier reported error: %1: %2")
+ .arg(std::move(complement), qt_error_string(-err.code));
+ return QProcess::tr("Child process set up failed: %1: %2")
+ .arg(std::move(complement), qt_error_string(err.code));
+}
+
+Q_NORETURN void
+failChildProcess(const QProcessPrivate *d, const char *description, int code) noexcept
{
- ::signal(SIGPIPE, SIG_DFL); // reset the signal that we ignored
+ ChildError error = {};
+ error.code = code;
+ qstrncpy(error.function, description, sizeof(error.function));
+ qt_safe_write(d->childStartedPipe[1], &error, sizeof(error));
+ _exit(-1);
+}
- ChildError error = { 0, {} }; // force zeroing of function[8]
+void QProcess::failChildProcessModifier(const char *description, int error) noexcept
+{
+ // We signal user errors with negative errnos
+ failChildProcess(d_func(), description, -error);
+}
+// See IMPORTANT notice below
+static const char *applyProcessParameters(const QProcess::UnixProcessParameters &params)
+{
+ // Apply Unix signal handler parameters.
+ // We don't expect signal() to fail, so we ignore its return value
+ bool ignore_sigpipe = params.flags.testFlag(QProcess::UnixProcessFlag::IgnoreSigPipe);
+ if (ignore_sigpipe)
+ QtVforkSafe::change_sigpipe(SIG_IGN);
+ if (params.flags.testFlag(QProcess::UnixProcessFlag::ResetSignalHandlers)) {
+ struct sigaction sa = {};
+ sa.sa_handler = SIG_DFL;
+ for (int sig = 1; sig < NSIG; ++sig) {
+ if (!ignore_sigpipe || sig != SIGPIPE)
+ QtVforkSafe::sigaction(sig, &sa, nullptr);
+ }
+
+ // and unmask all signals
+ sigset_t set;
+ sigemptyset(&set);
+ sigprocmask(SIG_SETMASK, &set, nullptr);
+ }
+
+ // Close all file descriptors above stderr.
+ // This isn't expected to fail, so we ignore close()'s return value.
+ if (params.flags.testFlag(QProcess::UnixProcessFlag::CloseFileDescriptors)) {
+ int r = -1;
+ int fd = qMax(STDERR_FILENO + 1, params.lowestFileDescriptorToClose);
+#if QT_CONFIG(close_range)
+ // On FreeBSD, this probably won't fail.
+ // On Linux, this will fail with ENOSYS before kernel 5.9.
+ r = close_range(fd, INT_MAX, 0);
+#endif
+ if (r == -1) {
+ // We *could* read /dev/fd to find out what file descriptors are
+ // open, but we won't. We CANNOT use opendir() here because it
+ // allocates memory. Using getdents(2) plus either strtoul() or
+ // std::from_chars() would be acceptable.
+ int max_fd = INT_MAX;
+ if (struct rlimit limit; getrlimit(RLIMIT_NOFILE, &limit) == 0)
+ max_fd = limit.rlim_cur;
+ for ( ; fd < max_fd; ++fd)
+ close(fd);
+ }
+ }
+
+ // Apply session and process group settings. This may fail.
+ if (params.flags.testFlag(QProcess::UnixProcessFlag::CreateNewSession)) {
+ if (setsid() < 0)
+ return "setsid";
+ }
+
+ // Disconnect from the controlling TTY. This probably won't fail. Must be
+ // done after the session settings from above.
+ if (params.flags.testFlag(QProcess::UnixProcessFlag::DisconnectControllingTerminal)) {
+ if (int fd = open(_PATH_TTY, O_RDONLY | O_NOCTTY); fd >= 0) {
+ // we still have a controlling TTY; give it up
+ int r = ioctl(fd, TIOCNOTTY);
+ int savedErrno = errno;
+ close(fd);
+ if (r != 0) {
+ errno = savedErrno;
+ return "ioctl";
+ }
+ }
+ }
+
+ // Apply UID and GID parameters last. This isn't expected to fail either:
+ // either we're trying to impersonate what we already are, or we're EUID or
+ // EGID root, in which case we are allowed to do this.
+ if (params.flags.testFlag(QProcess::UnixProcessFlag::ResetIds)) {
+ int r = setgid(getgid());
+ r = setuid(getuid());
+ (void) r;
+ }
+
+ return nullptr;
+}
+
+// the noexcept here adds an extra layer of protection
+static void callChildProcessModifier(const QProcessPrivate *d) noexcept
+{
+ QT_TRY {
+ if (d->unixExtras->childProcessModifier)
+ d->unixExtras->childProcessModifier();
+ } QT_CATCH (std::exception &e) {
+ failChildProcess(d, e.what(), FakeErrnoForThrow);
+ } QT_CATCH (...) {
+ failChildProcess(d, "throw", FakeErrnoForThrow);
+ }
+}
+
+// IMPORTANT:
+//
+// This function is called in a vfork() context on some OSes (notably, Linux
+// with forkfd), so it MUST NOT modify any non-local variable because it's
+// still sharing memory with the parent process.
+void QChildProcess::startProcess() const noexcept
+{
// Render channels configuration.
- commitChannels();
+ d->commitChannels();
// make sure this fd is closed if execv() succeeds
- qt_safe_close(childStartedPipe[0]);
+ qt_safe_close(d->childStartedPipe[0]);
// enter the working directory
- if (workingDir && QT_CHDIR(workingDir) == -1) {
- // failed, stop the process
- strcpy(error.function, "chdir");
- goto report_errno;
+ if (workingDirectory >= 0 && fchdir(workingDirectory) == -1)
+ failChildProcess(d, "fchdir", errno);
+
+ bool sigpipeHandled = false;
+ bool sigmaskHandled = false;
+ if (d->unixExtras) {
+ // FIRST we call the user modifier function, before we dropping
+ // privileges or closing non-standard file descriptors
+ callChildProcessModifier(d);
+
+ // then we apply our other user-provided parameters
+ if (const char *what = applyProcessParameters(d->unixExtras->processParameters))
+ failChildProcess(d, what, errno);
+
+ auto flags = d->unixExtras->processParameters.flags;
+ using P = QProcess::UnixProcessFlag;
+ sigpipeHandled = flags.testAnyFlags(P::ResetSignalHandlers | P::IgnoreSigPipe);
+ sigmaskHandled = flags.testFlag(P::ResetSignalHandlers);
+ }
+ if (!sigpipeHandled) {
+ // reset the signal that we ignored
+ QtVforkSafe::change_sigpipe(SIG_DFL); // reset the signal that we ignored
+ }
+ if (!sigmaskHandled) {
+ // restore the signal mask from the parent, if applyProcessParameters()
+ // hasn't completely reset it
+ restoreSignalMask();
}
-
- if (childProcessModifier)
- childProcessModifier();
// execute the process
- if (!envp) {
+ if (!envp.pointers)
qt_safe_execv(argv[0], argv);
- strcpy(error.function, "execvp");
- } else {
-#if defined (QPROCESS_DEBUG)
- fprintf(stderr, "QProcessPrivate::execChild() starting %s\n", argv[0]);
-#endif
+ else
qt_safe_execve(argv[0], argv, envp);
- strcpy(error.function, "execve");
- }
-
- // notify failure
- // don't use strerror or any other routines that may allocate memory, since
- // some buggy libc versions can deadlock on locked mutexes.
-report_errno:
- error.code = errno;
- qt_safe_write(childStartedPipe[1], &error, sizeof(error));
- childStartedPipe[1] = -1;
+ failChildProcess(d, "execve", errno);
}
bool QProcessPrivate::processStarted(QString *errorMessage)
@@ -593,7 +949,7 @@ bool QProcessPrivate::processStarted(QString *errorMessage)
Q_Q(QProcess);
ChildError buf;
- int ret = qt_safe_read(childStartedPipe[0], &buf, sizeof(buf));
+ ssize_t ret = qt_safe_read(childStartedPipe[0], &buf, sizeof(buf));
if (stateNotifier) {
stateNotifier->setEnabled(false);
@@ -623,7 +979,7 @@ bool QProcessPrivate::processStarted(QString *errorMessage)
// did we read an error message?
if (errorMessage)
- *errorMessage = QLatin1String(buf.function) + QLatin1String(": ") + qt_error_string(buf.code);
+ *errorMessage = startFailureErrorMessage(buf, ret);
return false;
}
@@ -741,7 +1097,7 @@ void QProcessPrivate::terminateProcess()
qDebug("QProcessPrivate::terminateProcess() pid=%jd", intmax_t(pid));
#endif
if (pid > 0)
- ::kill(pid_t(pid), SIGTERM);
+ ::kill(pid, SIGTERM);
}
void QProcessPrivate::killProcess()
@@ -750,20 +1106,20 @@ void QProcessPrivate::killProcess()
qDebug("QProcessPrivate::killProcess() pid=%jd", intmax_t(pid));
#endif
if (pid > 0)
- ::kill(pid_t(pid), SIGKILL);
+ ::kill(pid, SIGKILL);
}
bool QProcessPrivate::waitForStarted(const QDeadlineTimer &deadline)
{
- const qint64 msecs = deadline.remainingTime();
#if defined (QPROCESS_DEBUG)
+ const qint64 msecs = deadline.remainingTime();
qDebug("QProcessPrivate::waitForStarted(%lld) waiting for child to start (fd = %d)",
msecs, childStartedPipe[0]);
#endif
pollfd pfd = qt_make_pollfd(childStartedPipe[0], POLLIN);
- if (qt_poll_msecs(&pfd, 1, msecs) == 0) {
+ if (qt_safe_poll(&pfd, 1, deadline) == 0) {
setError(QProcess::Timedout);
#if defined (QPROCESS_DEBUG)
qDebug("QProcessPrivate::waitForStarted(%lld) == false (timed out)", msecs);
@@ -912,35 +1268,31 @@ void QProcessPrivate::waitForDeadChild()
Q_ASSERT(forkfd != -1);
// read the process information from our fd
- forkfd_info info;
+ forkfd_info info = {}; // Silence -Wmaybe-uninitialized; Thiago says forkfd_wait cannot fail here
+ // (QTBUG-119081)
int ret;
- EINTR_LOOP(ret, forkfd_wait(forkfd, &info, nullptr));
+ QT_EINTR_LOOP(ret, forkfd_wait(forkfd, &info, nullptr));
exitCode = info.status;
- crashed = info.code != CLD_EXITED;
+ exitStatus = info.code == CLD_EXITED ? QProcess::NormalExit : QProcess::CrashExit;
delete stateNotifier;
stateNotifier = nullptr;
- EINTR_LOOP(ret, forkfd_close(forkfd));
+ QT_EINTR_LOOP(ret, forkfd_close(forkfd));
forkfd = -1; // Child is dead, don't try to kill it anymore
#if defined QPROCESS_DEBUG
qDebug() << "QProcessPrivate::waitForDeadChild() dead with exitCode"
- << exitCode << ", crashed?" << crashed;
+ << exitCode << ", crashed?" << (info.code != CLD_EXITED);
#endif
}
bool QProcessPrivate::startDetached(qint64 *pid)
{
- QByteArray encodedWorkingDirectory = QFile::encodeName(workingDirectory);
-
- static_assert(PIPE_BUF >= sizeof(ChildError));
- ChildError childStatus = { 0, {} };
-
AutoPipe startedPipe, pidPipe;
if (!startedPipe || !pidPipe) {
- setErrorAndEmit(QProcess::FailedToStart, QLatin1String("pipe: ") + qt_error_string(errno));
+ setErrorAndEmit(QProcess::FailedToStart, "pipe: "_L1 + qt_error_string(errno));
return false;
}
@@ -950,54 +1302,35 @@ bool QProcessPrivate::startDetached(qint64 *pid)
return false;
}
- const CharPointerList argv(resolveExecutable(program), arguments);
- const CharPointerList envp(environment.d.constData());
+ // see startProcess() for more information
+ QChildProcess childProcess(this);
+ if (!childProcess.ok()) {
+ Q_ASSERT(processError != QProcess::UnknownError);
+ return false;
+ }
- pid_t childPid = fork();
- if (childPid == 0) {
- ::signal(SIGPIPE, SIG_DFL); // reset the signal that we ignored
+ childStartedPipe[1] = startedPipe[1]; // for failChildProcess()
+ pid_t childPid = childProcess.doFork([&] {
::setsid();
qt_safe_close(startedPipe[0]);
qt_safe_close(pidPipe[0]);
- auto reportFailed = [&](const char *function) {
- childStatus.code = errno;
- strcpy(childStatus.function, function);
- qt_safe_write(startedPipe[1], &childStatus, sizeof(childStatus));
- ::_exit(1);
- };
-
- if (!encodedWorkingDirectory.isEmpty()) {
- if (QT_CHDIR(encodedWorkingDirectory.constData()) < 0)
- reportFailed("chdir: ");
- }
-
- pid_t doubleForkPid = fork();
- if (doubleForkPid == 0) {
- // Render channels configuration.
- commitChannels();
-
- if (envp.pointers)
- qt_safe_execve(argv.pointers[0], argv.pointers.get(), envp.pointers.get());
- else
- qt_safe_execv(argv.pointers[0], argv.pointers.get());
-
- reportFailed("execv: ");
- } else if (doubleForkPid == -1) {
- reportFailed("fork: ");
- }
+ pid_t doubleForkPid;
+ if (childProcess.startChild(&doubleForkPid) == -1)
+ failChildProcess(this, "fork", errno);
// success
qt_safe_write(pidPipe[1], &doubleForkPid, sizeof(pid_t));
- ::_exit(1);
- }
+ return 0;
+ });
+ childStartedPipe[1] = -1;
int savedErrno = errno;
closeChannels();
if (childPid == -1) {
- setErrorAndEmit(QProcess::FailedToStart, QLatin1String("fork: ") + qt_error_string(savedErrno));
+ setErrorAndEmit(QProcess::FailedToStart, "fork: "_L1 + qt_error_string(savedErrno));
return false;
}
@@ -1011,6 +1344,7 @@ bool QProcessPrivate::startDetached(qint64 *pid)
// successfully execve()'d the target process. If it returns any positive
// result, it means one of the two children wrote an error result. Negative
// values should not happen.
+ ChildError childStatus;
ssize_t startResult = qt_safe_read(startedPipe[0], &childStatus, sizeof(childStatus));
// reap the intermediate child
@@ -1026,10 +1360,8 @@ bool QProcessPrivate::startDetached(qint64 *pid)
} else if (!success) {
if (pid)
*pid = -1;
- QString msg;
- if (startResult == sizeof(childStatus))
- msg = QLatin1String(childStatus.function) + qt_error_string(childStatus.code);
- setErrorAndEmit(QProcess::FailedToStart, msg);
+ setErrorAndEmit(QProcess::FailedToStart,
+ startFailureErrorMessage(childStatus, startResult));
}
return success;
}
diff --git a/src/corelib/io/qprocess_win.cpp b/src/corelib/io/qprocess_win.cpp
index d316af7c38..e64b133815 100644
--- a/src/corelib/io/qprocess_win.cpp
+++ b/src/corelib/io/qprocess_win.cpp
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2017 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2017 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
//#define QPROCESS_DEBUG
#include <qdebug.h>
@@ -64,6 +28,10 @@
QT_BEGIN_NAMESPACE
+constexpr UINT KillProcessExitCode = 0xf291;
+
+using namespace Qt::StringLiterals;
+
QProcessEnvironment QProcessEnvironment::systemEnvironment()
{
QProcessEnvironment env;
@@ -172,6 +140,7 @@ static bool qt_create_pipe(Q_PIPE *pipe, bool isInputPipe, BOOL defInheritFlag)
DWORD dwError = GetLastError();
if (dwError != ERROR_PIPE_BUSY || !--attempts) {
qErrnoWarning(dwError, "QProcess: CreateNamedPipe failed.");
+ SetLastError(dwError);
return false;
}
}
@@ -186,8 +155,10 @@ static bool qt_create_pipe(Q_PIPE *pipe, bool isInputPipe, BOOL defInheritFlag)
FILE_FLAG_OVERLAPPED,
NULL);
if (hClient == INVALID_HANDLE_VALUE) {
+ DWORD dwError = GetLastError();
qErrnoWarning("QProcess: CreateFile failed.");
CloseHandle(hServer);
+ SetLastError(dwError);
return false;
}
@@ -204,10 +175,12 @@ static bool qt_create_pipe(Q_PIPE *pipe, bool isInputPipe, BOOL defInheritFlag)
WaitForSingleObject(overlapped.hEvent, INFINITE);
break;
default:
+ dwError = GetLastError();
qErrnoWarning(dwError, "QProcess: ConnectNamedPipe failed.");
CloseHandle(overlapped.hEvent);
CloseHandle(hClient);
CloseHandle(hServer);
+ SetLastError(dwError);
return false;
}
}
@@ -233,8 +206,13 @@ bool QProcessPrivate::openChannel(Channel &channel)
switch (channel.type) {
case Channel::Normal: {
// we're piping this channel to our own process
- if (&channel == &stdinChannel)
- return qt_create_pipe(channel.pipe, true, FALSE);
+ if (&channel == &stdinChannel) {
+ if (!qt_create_pipe(channel.pipe, true, FALSE)) {
+ setErrorAndEmit(QProcess::FailedToStart, "pipe: "_L1 + qt_error_string(errno));
+ return false;
+ }
+ return true;
+ }
if (&channel == &stdoutChannel) {
if (!stdoutChannel.reader) {
@@ -247,8 +225,10 @@ bool QProcessPrivate::openChannel(Channel &channel)
q->connect(stderrChannel.reader, SIGNAL(readyRead()), SLOT(_q_canReadStandardError()));
}
}
- if (!qt_create_pipe(channel.pipe, false, FALSE))
+ if (!qt_create_pipe(channel.pipe, false, FALSE)) {
+ setErrorAndEmit(QProcess::FailedToStart, "pipe: "_L1 + qt_error_string(errno));
return false;
+ }
channel.reader->setHandle(channel.pipe[0]);
channel.reader->startAsyncRead();
@@ -297,7 +277,6 @@ bool QProcessPrivate::openChannel(Channel &channel)
setErrorAndEmit(QProcess::FailedToStart,
QProcess::tr("Could not open output redirection for writing"));
}
- cleanup();
return false;
}
case Channel::PipeSource: {
@@ -314,8 +293,10 @@ bool QProcessPrivate::openChannel(Channel &channel)
Q_ASSERT(source == &stdoutChannel);
Q_ASSERT(sink->process == this && sink->type == Channel::PipeSink);
- if (!qt_create_pipe(source->pipe, /* in = */ false, TRUE)) // source is stdout
+ if (!qt_create_pipe(source->pipe, /* in = */ false, TRUE)) { // source is stdout
+ setErrorAndEmit(QProcess::FailedToStart, "pipe: "_L1 + qt_error_string(errno));
return false;
+ }
sink->pipe[0] = source->pipe[0];
source->pipe[0] = INVALID_Q_PIPE;
@@ -334,8 +315,10 @@ bool QProcessPrivate::openChannel(Channel &channel)
Q_ASSERT(sink == &stdinChannel);
Q_ASSERT(source->process == this && source->type == Channel::PipeSource);
- if (!qt_create_pipe(sink->pipe, /* in = */ true, TRUE)) // sink is stdin
+ if (!qt_create_pipe(sink->pipe, /* in = */ true, TRUE)) { // sink is stdin
+ setErrorAndEmit(QProcess::FailedToStart, "pipe: "_L1 + qt_error_string(errno));
return false;
+ }
source->pipe[1] = sink->pipe[1];
sink->pipe[1] = INVALID_Q_PIPE;
@@ -391,44 +374,44 @@ static QString qt_create_commandline(const QString &program, const QStringList &
QString args;
if (!program.isEmpty()) {
QString programName = program;
- if (!programName.startsWith(QLatin1Char('\"')) && !programName.endsWith(QLatin1Char('\"')) && programName.contains(QLatin1Char(' ')))
- programName = QLatin1Char('\"') + programName + QLatin1Char('\"');
- programName.replace(QLatin1Char('/'), QLatin1Char('\\'));
+ if (!programName.startsWith(u'\"') && !programName.endsWith(u'\"') && programName.contains(u' '))
+ programName = u'\"' + programName + u'\"';
+ programName.replace(u'/', u'\\');
// add the program as the first arg ... it works better
- args = programName + QLatin1Char(' ');
+ args = programName + u' ';
}
- for (int i=0; i<arguments.size(); ++i) {
+ for (qsizetype i = 0; i < arguments.size(); ++i) {
QString tmp = arguments.at(i);
// Quotes are escaped and their preceding backslashes are doubled.
- int index = tmp.indexOf(QLatin1Char('"'));
+ qsizetype index = tmp.indexOf(u'"');
while (index >= 0) {
// Escape quote
- tmp.insert(index++, QLatin1Char('\\'));
+ tmp.insert(index++, u'\\');
// Double preceding backslashes (ignoring the one we just inserted)
- for (int i = index - 2 ; i >= 0 && tmp.at(i) == QLatin1Char('\\') ; --i) {
- tmp.insert(i, QLatin1Char('\\'));
+ for (qsizetype i = index - 2 ; i >= 0 && tmp.at(i) == u'\\' ; --i) {
+ tmp.insert(i, u'\\');
index++;
}
- index = tmp.indexOf(QLatin1Char('"'), index + 1);
+ index = tmp.indexOf(u'"', index + 1);
}
- if (tmp.isEmpty() || tmp.contains(QLatin1Char(' ')) || tmp.contains(QLatin1Char('\t'))) {
+ if (tmp.isEmpty() || tmp.contains(u' ') || tmp.contains(u'\t')) {
// The argument must not end with a \ since this would be interpreted
// as escaping the quote -- rather put the \ behind the quote: e.g.
// rather use "foo"\ than "foo\"
- int i = tmp.length();
- while (i > 0 && tmp.at(i - 1) == QLatin1Char('\\'))
+ qsizetype i = tmp.length();
+ while (i > 0 && tmp.at(i - 1) == u'\\')
--i;
- tmp.insert(i, QLatin1Char('"'));
- tmp.prepend(QLatin1Char('"'));
+ tmp.insert(i, u'"');
+ tmp.prepend(u'"');
}
- args += QLatin1Char(' ') + tmp;
+ args += u' ' + tmp;
}
if (!nativeArguments.isEmpty()) {
if (!args.isEmpty())
- args += QLatin1Char(' ');
+ args += u' ';
args += nativeArguments;
}
@@ -441,7 +424,7 @@ static QByteArray qt_create_environment(const QProcessEnvironmentPrivate::Map &e
QProcessEnvironmentPrivate::Map copy = environment;
// add PATH if necessary (for DLL loading)
- QProcessEnvironmentPrivate::Key pathKey(QLatin1String("PATH"));
+ QProcessEnvironmentPrivate::Key pathKey("PATH"_L1);
if (!copy.contains(pathKey)) {
QByteArray path = qgetenv("PATH");
if (!path.isEmpty())
@@ -449,7 +432,7 @@ static QByteArray qt_create_environment(const QProcessEnvironmentPrivate::Map &e
}
// add systemroot if needed
- QProcessEnvironmentPrivate::Key rootKey(QLatin1String("SystemRoot"));
+ QProcessEnvironmentPrivate::Key rootKey("SystemRoot"_L1);
if (!copy.contains(rootKey)) {
QByteArray systemRoot = qgetenv("SystemRoot");
if (!systemRoot.isEmpty())
@@ -471,14 +454,14 @@ static QByteArray qt_create_environment(const QProcessEnvironmentPrivate::Map &e
envlist.resize(envlist.size() + tmpSize);
tmpSize = it.key().length() * sizeof(wchar_t);
- memcpy(envlist.data() + pos, it.key().utf16(), tmpSize);
+ memcpy(envlist.data() + pos, it.key().data(), tmpSize);
pos += tmpSize;
memcpy(envlist.data() + pos, &equal, sizeof(wchar_t));
pos += sizeof(wchar_t);
tmpSize = it.value().length() * sizeof(wchar_t);
- memcpy(envlist.data() + pos, it.value().utf16(), tmpSize);
+ memcpy(envlist.data() + pos, it.value().data(), tmpSize);
pos += tmpSize;
memcpy(envlist.data() + pos, &nul, sizeof(wchar_t));
@@ -555,9 +538,9 @@ void QProcessPrivate::startProcess()
q->setProcessState(QProcess::Starting);
if (!openChannels()) {
- QString errorString = QProcess::tr("Process failed to start: %1").arg(qt_error_string());
+ // openChannel sets the error string
+ Q_ASSERT(!errorString.isEmpty());
cleanup();
- setErrorAndEmit(QProcess::FailedToStart, errorString);
return;
}
@@ -666,7 +649,7 @@ void QProcessPrivate::terminateProcess()
void QProcessPrivate::killProcess()
{
if (pid)
- TerminateProcess(pid->hProcess, 0xf291);
+ TerminateProcess(pid->hProcess, KillProcessExitCode);
}
bool QProcessPrivate::waitForStarted(const QDeadlineTimer &)
@@ -816,8 +799,11 @@ void QProcessPrivate::findExitCode()
Q_ASSERT(pid);
if (GetExitCodeProcess(pid->hProcess, &theExitCode)) {
exitCode = theExitCode;
- crashed = (exitCode == 0xf291 // our magic number, see killProcess
- || (theExitCode >= 0x80000000 && theExitCode < 0xD0000000));
+ if (exitCode == KillProcessExitCode
+ || (theExitCode >= 0x80000000 && theExitCode < 0xD0000000))
+ exitStatus = QProcess::CrashExit;
+ else
+ exitStatus = QProcess::NormalExit;
}
}
diff --git a/src/corelib/io/qresource.cpp b/src/corelib/io/qresource.cpp
index af0b9429af..005380720b 100644
--- a/src/corelib/io/qresource.cpp
+++ b/src/corelib/io/qresource.cpp
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2019 The Qt Company Ltd.
-** Copyright (C) 2020 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2019 The Qt Company Ltd.
+// Copyright (C) 2020 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qresource.h"
#include "qresource_p.h"
@@ -69,7 +33,7 @@
# include <zstd.h>
#endif
-#if defined(Q_OS_UNIX) && !defined(Q_OS_NACL) && !defined(Q_OS_INTEGRITY)
+#if defined(Q_OS_UNIX) && !defined(Q_OS_INTEGRITY)
# define QT_USE_MMAP
# include <sys/mman.h>
#endif
@@ -78,6 +42,8 @@
QT_BEGIN_NAMESPACE
+using namespace Qt::StringLiterals;
+
// Symbols used by code generated by RCC.
// They cause compilation errors if the RCC content couldn't
// be interpreted by this QtCore version.
@@ -116,7 +82,7 @@ public:
inline QStringView next()
{
- int start = m_pos;
+ const qsizetype start = m_pos;
while (m_pos < m_len && m_data[m_pos] != m_splitChar)
++m_pos;
return QStringView(m_data + start, m_pos - start);
@@ -125,7 +91,7 @@ public:
const QChar *m_data;
qsizetype m_len;
qsizetype m_pos = 0;
- QChar m_splitChar = QLatin1Char('/');
+ QChar m_splitChar = u'/';
};
// resource glue
@@ -164,7 +130,7 @@ public:
return QResource::NoCompression;
}
const uchar *data(int node, qint64 *size) const;
- quint64 lastModified(int node) const;
+ qint64 lastModified(int node) const;
QStringList children(int node) const;
virtual QString mappingRoot() const { return QString(); }
bool mappingRootSubdir(const QString &path, QString *match = nullptr) const;
@@ -189,7 +155,7 @@ static QString cleanPath(const QString &_path)
QString path = QDir::cleanPath(_path);
// QDir::cleanPath does not remove two trailing slashes under _Windows_
// due to support for UNC paths. Remove those manually.
- if (path.startsWith(QLatin1String("//")))
+ if (path.startsWith("//"_L1))
path.remove(0, 1);
return path;
}
@@ -201,7 +167,6 @@ struct QResourceGlobalData
{
QRecursiveMutex resourceMutex;
ResourceList resourceList;
- QStringList resourceSearchPaths;
};
Q_GLOBAL_STATIC(QResourceGlobalData, resourceGlobalData)
@@ -211,9 +176,6 @@ static inline QRecursiveMutex &resourceMutex()
static inline ResourceList *resourceList()
{ return &resourceGlobalData->resourceList; }
-static inline QStringList *resourceSearchPaths()
-{ return &resourceGlobalData->resourceSearchPaths; }
-
/*!
\class QResource
\inmodule QtCore
@@ -271,6 +233,19 @@ static inline QStringList *resourceSearchPaths()
itself will be unmapped from memory when the last QResource that points
to it is destroyed.
+ \section2 Corruption and Security
+
+ The QResource class performs some checks on the file passed to determine
+ whether it is supported by the current version of Qt. Those tests are only
+ to check the file header does not request features (such as Zstandard
+ decompression) that have not been compiled in or that the file is not of a
+ future version of Qt. They do not confirm the validity of the entire file.
+
+ QResource should not be used on files whose provenance cannot be trusted.
+ Applications should be designed to attempt to load only resource files
+ whose provenance is at least as trustworthy as that of the application
+ itself or its plugins.
+
\sa {The Qt Resource System}, QFile, QDir, QFileInfo
*/
@@ -307,11 +282,11 @@ public:
QLocale locale;
QString fileName, absoluteFilePath;
QList<QResourceRoot *> related;
- mutable qint64 size;
- mutable quint64 lastModified;
- mutable const uchar *data;
+ qint64 size;
+ qint64 lastModified;
+ const uchar *data;
mutable QStringList children;
- mutable quint8 compressionAlgo;
+ quint8 compressionAlgo;
bool container;
/* 2 or 6 padding bytes */
@@ -381,29 +356,23 @@ void QResourcePrivate::ensureInitialized() const
if (!related.isEmpty())
return;
QResourcePrivate *that = const_cast<QResourcePrivate *>(this);
- if (fileName == QLatin1String(":"))
- that->fileName += QLatin1Char('/');
+ if (fileName == ":"_L1)
+ that->fileName += u'/';
that->absoluteFilePath = fileName;
- if (!that->absoluteFilePath.startsWith(QLatin1Char(':')))
- that->absoluteFilePath.prepend(QLatin1Char(':'));
+ if (!that->absoluteFilePath.startsWith(u':'))
+ that->absoluteFilePath.prepend(u':');
QStringView path(fileName);
- if (path.startsWith(QLatin1Char(':')))
+ if (path.startsWith(u':'))
path = path.mid(1);
- if (path.startsWith(QLatin1Char('/'))) {
+ if (path.startsWith(u'/')) {
that->load(path.toString());
} else {
- const auto locker = qt_scoped_lock(resourceMutex());
- QStringList searchPaths = *resourceSearchPaths();
- searchPaths << QLatin1String("");
- for (int i = 0; i < searchPaths.size(); ++i) {
- const QString searchPath(searchPaths.at(i) + QLatin1Char('/') + path);
- if (that->load(searchPath)) {
- that->absoluteFilePath = QLatin1Char(':') + searchPath;
- break;
- }
- }
+ // Should we search QDir::searchPath() before falling back to root ?
+ const QString searchPath(u'/' + path);
+ if (that->load(searchPath))
+ that->absoluteFilePath = u':' + searchPath;
}
}
@@ -414,7 +383,7 @@ void QResourcePrivate::ensureChildren() const
return;
QString path = absoluteFilePath, k;
- if (path.startsWith(QLatin1Char(':')))
+ if (path.startsWith(u':'))
path = path.mid(1);
QDuplicateTracker<QString> kids(related.size());
QString cleaned = cleanPath(path);
@@ -797,7 +766,7 @@ inline QString QResourceRoot::name(int node) const
ret.resize(name_length);
QChar *strData = ret.data();
- qFromBigEndian<ushort>(names + name_offset, name_length, strData);
+ qFromBigEndian<char16_t>(names + name_offset, name_length, strData);
return ret;
}
@@ -808,14 +777,14 @@ int QResourceRoot::findNode(const QString &_path, const QLocale &locale) const
QString root = mappingRoot();
if (!root.isEmpty()) {
if (root == path) {
- path = QLatin1Char('/');
+ path = u'/';
} else {
- if (!root.endsWith(QLatin1Char('/')))
- root += QLatin1Char('/');
+ if (!root.endsWith(u'/'))
+ root += u'/';
if (path.size() >= root.size() && path.startsWith(root))
- path = path.mid(root.length() - 1);
+ path = path.mid(root.size() - 1);
if (path.isEmpty())
- path = QLatin1Char('/');
+ path = u'/';
}
}
}
@@ -823,7 +792,7 @@ int QResourceRoot::findNode(const QString &_path, const QLocale &locale) const
qDebug() << "!!!!" << "START" << path << locale.territory() << locale.language();
#endif
- if (path == QLatin1String("/"))
+ if (path == "/"_L1)
return 0;
// the root node is always first
@@ -959,14 +928,14 @@ const uchar *QResourceRoot::data(int node, qint64 *size) const
return nullptr;
}
-quint64 QResourceRoot::lastModified(int node) const
+qint64 QResourceRoot::lastModified(int node) const
{
if (node == -1 || version < 0x02)
return 0;
const int offset = findOffset(node) + 14;
- return qFromBigEndian<quint64>(tree + offset);
+ return qFromBigEndian<qint64>(tree + offset);
}
QStringList QResourceRoot::children(int node) const
@@ -1228,7 +1197,7 @@ bool QDynamicFileResourceRoot::registerSelf(const QString &f)
static QString qt_resource_fixResourceRoot(QString r)
{
if (!r.isEmpty()) {
- if (r.startsWith(QLatin1Char(':')))
+ if (r.startsWith(u':'))
r = r.mid(1);
if (!r.isEmpty())
r = QDir::cleanPath(r);
@@ -1249,7 +1218,7 @@ static QString qt_resource_fixResourceRoot(QString r)
bool QResource::registerResource(const QString &rccFilename, const QString &resourceRoot)
{
QString r = qt_resource_fixResourceRoot(resourceRoot);
- if (!r.isEmpty() && r[0] != QLatin1Char('/')) {
+ if (!r.isEmpty() && r[0] != u'/') {
qWarning("QDir::registerResource: Registering a resource [%ls] must be rooted in an "
"absolute path (start with /) [%ls]",
qUtf16Printable(rccFilename), qUtf16Printable(resourceRoot));
@@ -1318,7 +1287,7 @@ bool QResource::unregisterResource(const QString &rccFilename, const QString &re
bool QResource::registerResource(const uchar *rccData, const QString &resourceRoot)
{
QString r = qt_resource_fixResourceRoot(resourceRoot);
- if (!r.isEmpty() && r[0] != QLatin1Char('/')) {
+ if (!r.isEmpty() && r[0] != u'/') {
qWarning("QDir::registerResource: Registering a resource [%p] must be rooted in an "
"absolute path (start with /) [%ls]",
rccData, qUtf16Printable(resourceRoot));
@@ -1512,7 +1481,7 @@ QAbstractFileEngine::FileFlags QResourceFileEngine::fileFlags(QAbstractFileEngin
}
if (type & FlagsMask) {
ret |= ExistsFlag;
- if (d->resource.absoluteFilePath() == QLatin1String(":/"))
+ if (d->resource.absoluteFilePath() == ":/"_L1)
ret |= RootFlag;
}
return ret;
@@ -1522,24 +1491,24 @@ QString QResourceFileEngine::fileName(FileName file) const
{
Q_D(const QResourceFileEngine);
if (file == BaseName) {
- int slash = d->resource.fileName().lastIndexOf(QLatin1Char('/'));
+ const qsizetype slash = d->resource.fileName().lastIndexOf(u'/');
if (slash == -1)
return d->resource.fileName();
return d->resource.fileName().mid(slash + 1);
} else if (file == PathName || file == AbsolutePathName) {
const QString path = (file == AbsolutePathName) ? d->resource.absoluteFilePath()
: d->resource.fileName();
- const int slash = path.lastIndexOf(QLatin1Char('/'));
+ const qsizetype slash = path.lastIndexOf(u'/');
if (slash == -1)
- return QLatin1String(":");
+ return ":"_L1;
else if (slash <= 1)
- return QLatin1String(":/");
+ return ":/"_L1;
return path.left(slash);
} else if (file == CanonicalName || file == CanonicalPathName) {
const QString absoluteFilePath = d->resource.absoluteFilePath();
if (file == CanonicalPathName) {
- const int slash = absoluteFilePath.lastIndexOf(QLatin1Char('/'));
+ const qsizetype slash = absoluteFilePath.lastIndexOf(u'/');
if (slash != -1)
return absoluteFilePath.left(slash);
}
@@ -1554,10 +1523,10 @@ uint QResourceFileEngine::ownerId(FileOwner) const
return nobodyID;
}
-QDateTime QResourceFileEngine::fileTime(FileTime time) const
+QDateTime QResourceFileEngine::fileTime(QFile::FileTime time) const
{
Q_D(const QResourceFileEngine);
- if (time == ModificationTime)
+ if (time == QFile::FileModificationTime)
return d->resource.lastModified();
return QDateTime();
}
@@ -1565,18 +1534,11 @@ QDateTime QResourceFileEngine::fileTime(FileTime time) const
/*!
\internal
*/
-QAbstractFileEngine::Iterator *QResourceFileEngine::beginEntryList(QDir::Filters filters,
- const QStringList &filterNames)
-{
- return new QResourceFileEngineIterator(filters, filterNames);
-}
-
-/*!
- \internal
-*/
-QAbstractFileEngine::Iterator *QResourceFileEngine::endEntryList()
+QAbstractFileEngine::IteratorUniquePtr
+QResourceFileEngine::beginEntryList(const QString &path, QDir::Filters filters,
+ const QStringList &filterNames)
{
- return nullptr;
+ return std::make_unique<QResourceFileEngineIterator>(path, filters, filterNames);
}
bool QResourceFileEngine::extension(Extension extension, const ExtensionOption *option, ExtensionReturn *output)
@@ -1608,7 +1570,7 @@ uchar *QResourceFileEnginePrivate::map(qint64 offset, qint64 size, QFile::Memory
qint64 max = resource.uncompressedSize();
qint64 end;
if (offset < 0 || size <= 0 || !resource.isValid() ||
- add_overflow(offset, size, &end) || end > max) {
+ qAddOverflow(offset, size, &end) || end > max) {
q->setError(QFile::UnspecifiedError, QString());
return nullptr;
}
diff --git a/src/corelib/io/qresource.h b/src/corelib/io/qresource.h
index 0361f435b3..ca968b5180 100644
--- a/src/corelib/io/qresource.h
+++ b/src/corelib/io/qresource.h
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Copyright (C) 2019 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// Copyright (C) 2019 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QRESOURCE_H
#define QRESOURCE_H
diff --git a/src/corelib/io/qresource_iterator.cpp b/src/corelib/io/qresource_iterator.cpp
index 29a9e22294..abb61d3b46 100644
--- a/src/corelib/io/qresource_iterator.cpp
+++ b/src/corelib/io/qresource_iterator.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qresource.h"
#include "qresource_iterator_p.h"
@@ -44,9 +8,10 @@
QT_BEGIN_NAMESPACE
-QResourceFileEngineIterator::QResourceFileEngineIterator(QDir::Filters filters,
+QResourceFileEngineIterator::QResourceFileEngineIterator(const QString &path, QDir::Filters filters,
const QStringList &filterNames)
- : QAbstractFileEngineIterator(filters, filterNames), index(-1)
+ : QAbstractFileEngineIterator(path, filters, filterNames),
+ index(-1)
{
}
@@ -54,15 +19,7 @@ QResourceFileEngineIterator::~QResourceFileEngineIterator()
{
}
-QString QResourceFileEngineIterator::next()
-{
- if (!hasNext())
- return QString();
- ++index;
- return currentFilePath();
-}
-
-bool QResourceFileEngineIterator::hasNext() const
+bool QResourceFileEngineIterator::advance()
{
if (index == -1) {
// Lazy initialization of the iterator
@@ -70,19 +27,34 @@ bool QResourceFileEngineIterator::hasNext() const
if (!resource.isValid())
return false;
- // Initialize and move to the next entry.
+ // Initialize and move to the first entry.
entries = resource.children();
+ if (entries.isEmpty())
+ return false;
+
index = 0;
+ return true;
}
- return index < entries.size();
+ if (index < entries.size() - 1) {
+ ++index;
+ return true;
+ }
+
+ return false;
}
QString QResourceFileEngineIterator::currentFileName() const
{
- if (index <= 0 || index > entries.size())
+ if (index < 0 || index > entries.size())
return QString();
- return entries.at(index - 1);
+ return entries.at(index);
+}
+
+QFileInfo QResourceFileEngineIterator::currentFileInfo() const
+{
+ m_fileInfo = QFileInfo(currentFilePath());
+ return m_fileInfo;
}
QT_END_NAMESPACE
diff --git a/src/corelib/io/qresource_iterator_p.h b/src/corelib/io/qresource_iterator_p.h
index 207a88b0ba..bcbbc46b51 100644
--- a/src/corelib/io/qresource_iterator_p.h
+++ b/src/corelib/io/qresource_iterator_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QRESOURCE_ITERATOR_P_H
#define QRESOURCE_ITERATOR_P_H
@@ -60,13 +24,14 @@ class QResourceFileEngineIteratorPrivate;
class QResourceFileEngineIterator : public QAbstractFileEngineIterator
{
public:
- QResourceFileEngineIterator(QDir::Filters filters, const QStringList &filterNames);
+ QResourceFileEngineIterator(const QString &path, QDir::Filters filters,
+ const QStringList &filterNames);
~QResourceFileEngineIterator();
- QString next() override;
- bool hasNext() const override;
+ bool advance() override;
QString currentFileName() const override;
+ QFileInfo currentFileInfo() const override;
private:
mutable QStringList entries;
diff --git a/src/corelib/io/qresource_p.h b/src/corelib/io/qresource_p.h
index 19db6b24cd..37fddd7a41 100644
--- a/src/corelib/io/qresource_p.h
+++ b/src/corelib/io/qresource_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QRESOURCE_P_H
#define QRESOURCE_P_H
@@ -83,10 +47,10 @@ public:
uint ownerId(FileOwner) const override;
- QDateTime fileTime(FileTime time) const override;
+ QDateTime fileTime(QFile::FileTime time) const override;
- Iterator *beginEntryList(QDir::Filters filters, const QStringList &filterNames) override;
- Iterator *endEntryList() override;
+ IteratorUniquePtr beginEntryList(const QString &path, QDir::Filters filters,
+ const QStringList &filterNames) override;
bool extension(Extension extension, const ExtensionOption *option = nullptr, ExtensionReturn *output = nullptr) override;
bool supportsExtension(Extension extension) const override;
diff --git a/src/corelib/io/qsavefile.cpp b/src/corelib/io/qsavefile.cpp
index afe39287bd..cc59bb3725 100644
--- a/src/corelib/io/qsavefile.cpp
+++ b/src/corelib/io/qsavefile.cpp
@@ -1,45 +1,9 @@
-/****************************************************************************
-**
-** Copyright (C) 2012 David Faure <faure@kde.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2012 David Faure <faure@kde.org>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qsavefile.h"
-#ifndef QT_NO_TEMPORARYFILE
+#if QT_CONFIG(temporaryfile)
#include "qplatformdefs.h"
#include "private/qsavefile_p.h"
@@ -55,6 +19,8 @@
QT_BEGIN_NAMESPACE
+using namespace Qt::StringLiterals;
+
QSaveFilePrivate::QSaveFilePrivate()
: writeError(QFileDevice::NoError),
useTemporaryFile(true),
@@ -147,10 +113,10 @@ QSaveFile::QSaveFile(const QString &name, QObject *parent)
QSaveFile::~QSaveFile()
{
Q_D(QSaveFile);
- QFileDevice::close();
- if (d->fileEngine) {
+ if (isOpen()) {
+ QFileDevice::close();
+ Q_ASSERT(d->fileEngine);
d->fileEngine->remove();
- d->fileEngine.reset();
}
}
@@ -186,7 +152,7 @@ void QSaveFile::setFileName(const QString &name)
QIODevice::ReadWrite, QIODevice::Append, QIODevice::NewOnly and
QIODevice::ExistingOnly are not supported at the moment.
- \sa QIODevice::OpenMode, setFileName()
+ \sa QIODevice::OpenMode, setFileName(), QT_USE_NODISCARD_FILE_OPEN
*/
bool QSaveFile::open(OpenMode mode)
{
@@ -234,7 +200,7 @@ bool QSaveFile::open(OpenMode mode)
}
auto openDirectly = [&]() {
- d->fileEngine.reset(QAbstractFileEngine::create(d->finalFileName));
+ d->fileEngine = QAbstractFileEngine::create(d->finalFileName);
if (d->fileEngine->open(mode | QIODevice::Unbuffered)) {
d->useTemporaryFile = false;
QFileDevice::open(mode);
@@ -246,10 +212,10 @@ bool QSaveFile::open(OpenMode mode)
bool requiresDirectWrite = false;
#ifdef Q_OS_WIN
// check if it is an Alternate Data Stream
- requiresDirectWrite = d->finalFileName == d->fileName && d->fileName.indexOf(QLatin1Char(':'), 2) > 1;
+ requiresDirectWrite = d->finalFileName == d->fileName && d->fileName.indexOf(u':', 2) > 1;
#elif defined(Q_OS_ANDROID)
// check if it is a content:// URL
- requiresDirectWrite = d->fileName.startsWith(QLatin1String("content://"));
+ requiresDirectWrite = d->fileName.startsWith("content://"_L1);
#endif
if (requiresDirectWrite) {
// yes, we can't rename onto it...
@@ -332,7 +298,7 @@ bool QSaveFile::commit()
}
QFileDevice::close(); // calls flush()
- const auto fe = std::move(d->fileEngine);
+ const auto &fe = d->fileEngine;
// Sync to disk if possible. Ignore errors (e.g. not supported).
fe->syncToDisk();
@@ -446,4 +412,4 @@ QT_END_NAMESPACE
#include "moc_qsavefile.cpp"
#endif
-#endif // QT_NO_TEMPORARYFILE
+#endif // QT_CONFIG(temporaryfile)
diff --git a/src/corelib/io/qsavefile.h b/src/corelib/io/qsavefile.h
index 200068d30d..4dd712d4b6 100644
--- a/src/corelib/io/qsavefile.h
+++ b/src/corelib/io/qsavefile.h
@@ -1,48 +1,12 @@
-/****************************************************************************
-**
-** Copyright (C) 2012 David Faure <faure@kde.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2012 David Faure <faure@kde.org>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QSAVEFILE_H
#define QSAVEFILE_H
#include <QtCore/qglobal.h>
-#ifndef QT_NO_TEMPORARYFILE
+#if QT_CONFIG(temporaryfile)
#include <QtCore/qfiledevice.h>
#include <QtCore/qstring.h>
@@ -75,7 +39,7 @@ public:
QString fileName() const override;
void setFileName(const QString &name);
- bool open(OpenMode flags) override;
+ QFILE_MAYBE_NODISCARD bool open(OpenMode flags) override;
bool commit();
void cancelWriting();
@@ -98,6 +62,6 @@ private:
QT_END_NAMESPACE
-#endif // QT_NO_TEMPORARYFILE
+#endif // QT_CONFIG(temporaryfile)
#endif // QSAVEFILE_H
diff --git a/src/corelib/io/qsavefile_p.h b/src/corelib/io/qsavefile_p.h
index 3f81df9ae2..4d0f40fbb0 100644
--- a/src/corelib/io/qsavefile_p.h
+++ b/src/corelib/io/qsavefile_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 David Faure <faure@kde.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2013 David Faure <faure@kde.org>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QSAVEFILE_P_H
#define QSAVEFILE_P_H
@@ -53,7 +17,7 @@
#include <QtCore/qglobal.h>
-#ifndef QT_NO_TEMPORARYFILE
+#if QT_CONFIG(temporaryfile)
#include "private/qfiledevice_p.h"
@@ -78,6 +42,6 @@ protected:
QT_END_NAMESPACE
-#endif // QT_NO_TEMPORARYFILE
+#endif // QT_CONFIG(temporaryfile)
#endif // QSAVEFILE_P_H
diff --git a/src/corelib/io/qsettings.cpp b/src/corelib/io/qsettings.cpp
index e72b4349c8..6934ca4404 100644
--- a/src/corelib/io/qsettings.cpp
+++ b/src/corelib/io/qsettings.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include <qdebug.h>
#include "qplatformdefs.h"
@@ -48,11 +12,12 @@
#include "qfileinfo.h"
#include "qmutex.h"
#include "private/qlocking_p.h"
+#include "private/qtools_p.h"
#include "qlibraryinfo.h"
#include "qtemporaryfile.h"
#include "qstandardpaths.h"
#include <qdatastream.h>
-#include <qstringconverter.h>
+#include "private/qstringconverter_p.h"
#ifndef QT_NO_GEOM_VARIANT
#include "qsize.h"
@@ -79,12 +44,13 @@
# include <shlobj.h>
#endif
-#if defined(Q_OS_UNIX) && !defined(Q_OS_MAC) && !defined(Q_OS_ANDROID)
+#if defined(Q_OS_UNIX) && !defined(Q_OS_DARWIN) && !defined(Q_OS_ANDROID)
#define Q_XDG_PLATFORM
#endif
-#if !defined(QT_NO_STANDARDPATHS) && (defined(Q_XDG_PLATFORM) || defined(QT_PLATFORM_UIKIT))
-#define QSETTINGS_USE_QSTANDARDPATHS
+#if !defined(QT_NO_STANDARDPATHS) \
+ && (defined(Q_XDG_PLATFORM) || defined(QT_PLATFORM_UIKIT) || defined(Q_OS_ANDROID))
+# define QSETTINGS_USE_QSTANDARDPATHS
#endif
// ************************************************************************
@@ -99,6 +65,9 @@
QT_BEGIN_NAMESPACE
+using namespace Qt::StringLiterals;
+using namespace QtMiscUtils;
+
struct QConfFileCustomFormat
{
QString extension;
@@ -129,9 +98,9 @@ Q_GLOBAL_STATIC(ConfFileCache, unusedCacheFunc)
Q_GLOBAL_STATIC(PathHash, pathHashFunc)
Q_GLOBAL_STATIC(CustomFormatVector, customFormatVectorFunc)
-static QBasicMutex settingsGlobalMutex;
+Q_CONSTINIT static QBasicMutex settingsGlobalMutex;
-static QSettings::Format globalDefaultFormat = QSettings::NativeFormat;
+Q_CONSTINIT static QSettings::Format globalDefaultFormat = QSettings::NativeFormat;
QConfFile::QConfFile(const QString &fileName, bool _userPerms)
: name(fileName), size(0), ref(1), userPerms(_userPerms)
@@ -148,11 +117,10 @@ QConfFile::~QConfFile()
ParsedSettingsMap QConfFile::mergedKeyMap() const
{
ParsedSettingsMap result = originalKeys;
- ParsedSettingsMap::const_iterator i;
- for (i = removedKeys.begin(); i != removedKeys.end(); ++i)
+ for (auto i = removedKeys.begin(); i != removedKeys.end(); ++i)
result.remove(i.key());
- for (i = addedKeys.begin(); i != addedKeys.end(); ++i)
+ for (auto i = addedKeys.begin(); i != addedKeys.end(); ++i)
result.insert(i.key(), i.value());
return result;
}
@@ -161,12 +129,12 @@ bool QConfFile::isWritable() const
{
QFileInfo fileInfo(name);
-#ifndef QT_NO_TEMPORARYFILE
+#if QT_CONFIG(temporaryfile)
if (fileInfo.exists()) {
#endif
QFile file(name);
return file.open(QFile::ReadWrite);
-#ifndef QT_NO_TEMPORARYFILE
+#if QT_CONFIG(temporaryfile)
} else {
// Create the directories to the file.
QDir dir(fileInfo.absolutePath());
@@ -229,13 +197,30 @@ QSettingsPrivate::~QSettingsPrivate()
{
}
-QString QSettingsPrivate::actualKey(const QString &key) const
+QString QSettingsPrivate::actualKey(QAnyStringView key) const
{
auto n = normalizedKey(key);
Q_ASSERT_X(!n.isEmpty(), "QSettings", "empty key");
return groupPrefix + n;
}
+namespace {
+ // ### this needs some public API (QStringConverter?)
+ QChar *write(QChar *out, QUtf8StringView v)
+ {
+ return QUtf8::convertToUnicode(out, QByteArrayView(v));
+ }
+ QChar *write(QChar *out, QLatin1StringView v)
+ {
+ return QLatin1::convertToUnicode(out, v);
+ }
+ QChar *write(QChar *out, QStringView v)
+ {
+ memcpy(out, v.data(), v.size() * sizeof(QChar));
+ return out + v.size();
+ }
+}
+
/*
Returns a string that never starts nor ends with a slash (or an
empty string). Examples:
@@ -243,38 +228,49 @@ QString QSettingsPrivate::actualKey(const QString &key) const
"foo" becomes "foo"
"/foo//bar///" becomes "foo/bar"
"///" becomes ""
-
- This function is optimized to avoid a QString deep copy in the
- common case where the key is already normalized.
*/
-QString QSettingsPrivate::normalizedKey(const QString &key)
+QString QSettingsPrivate::normalizedKey(QAnyStringView key)
{
- QString result = key;
+ QString result(key.size(), Qt::Uninitialized);
+ auto out = const_cast<QChar*>(result.constData()); // don't detach
- int i = 0;
- while (i < result.size()) {
- while (result.at(i) == QLatin1Char('/')) {
- result.remove(i, 1);
- if (i == result.size())
- goto after_loop;
- }
- while (result.at(i) != QLatin1Char('/')) {
- ++i;
- if (i == result.size())
- return result;
+ const bool maybeEndsInSlash = key.visit([&out](auto key) {
+ using View = decltype(key);
+
+ auto it = key.begin();
+ const auto end = key.end();
+
+ while (it != end) {
+ while (*it == u'/') {
+ ++it;
+ if (it == end)
+ return true;
+ }
+ auto mark = it;
+ while (*it != u'/') {
+ ++it;
+ if (it == end)
+ break;
+ }
+ out = write(out, View{mark, it});
+ if (it == end)
+ return false;
+ Q_ASSERT(*it == u'/');
+ *out++ = u'/';
+ ++it;
}
- ++i; // leave the slash alone
- }
+ return true;
+ });
-after_loop:
- if (!result.isEmpty())
- result.truncate(i - 1); // remove the trailing slash
+ if (maybeEndsInSlash && out != result.constData())
+ --out; // remove the trailing slash
+ result.truncate(out - result.constData());
return result;
}
// see also qsettings_win.cpp and qsettings_mac.cpp
-#if !defined(Q_OS_WIN) && !defined(Q_OS_MAC) && !defined(Q_OS_WASM)
+#if !defined(Q_OS_WIN) && !defined(Q_OS_DARWIN) && !defined(Q_OS_WASM)
QSettingsPrivate *QSettingsPrivate::create(QSettings::Format format, QSettings::Scope scope,
const QString &organization, const QString &application)
{
@@ -292,7 +288,7 @@ QSettingsPrivate *QSettingsPrivate::create(const QString &fileName, QSettings::F
void QSettingsPrivate::processChild(QStringView key, ChildSpec spec, QStringList &result)
{
if (spec != AllKeys) {
- int slashPos = key.indexOf(QLatin1Char('/'));
+ qsizetype slashPos = key.indexOf(u'/');
if (slashPos == -1) {
if (spec != ChildKeys)
return;
@@ -310,7 +306,7 @@ void QSettingsPrivate::beginGroupOrArray(const QSettingsGroup &group)
groupStack.push(group);
const QString name = group.name();
if (!name.isEmpty())
- groupPrefix += name + QLatin1Char('/');
+ groupPrefix += name + u'/';
}
/*
@@ -346,30 +342,27 @@ void QSettingsPrivate::requestUpdate()
QStringList QSettingsPrivate::variantListToStringList(const QVariantList &l)
{
QStringList result;
- result.reserve(l.count());
- QVariantList::const_iterator it = l.constBegin();
- for (; it != l.constEnd(); ++it)
- result.append(variantToString(*it));
+ result.reserve(l.size());
+ for (auto v : l)
+ result.append(variantToString(v));
return result;
}
QVariant QSettingsPrivate::stringListToVariantList(const QStringList &l)
{
QStringList outStringList = l;
- for (int i = 0; i < outStringList.count(); ++i) {
+ for (qsizetype i = 0; i < outStringList.size(); ++i) {
const QString &str = outStringList.at(i);
- if (str.startsWith(QLatin1Char('@'))) {
- if (str.length() >= 2 && str.at(1) == QLatin1Char('@')) {
- outStringList[i].remove(0, 1);
- } else {
+ if (str.startsWith(u'@')) {
+ if (str.size() < 2 || str.at(1) != u'@') {
QVariantList variantList;
- const int stringCount = l.count();
- variantList.reserve(stringCount);
- for (int j = 0; j < stringCount; ++j)
- variantList.append(stringToVariant(l.at(j)));
+ variantList.reserve(l.size());
+ for (const auto &s : l)
+ variantList.append(stringToVariant(s));
return variantList;
}
+ outStringList[i].remove(0, 1);
}
}
return outStringList;
@@ -381,14 +374,12 @@ QString QSettingsPrivate::variantToString(const QVariant &v)
switch (v.metaType().id()) {
case QMetaType::UnknownType:
- result = QLatin1String("@Invalid()");
+ result = "@Invalid()"_L1;
break;
case QMetaType::QByteArray: {
QByteArray a = v.toByteArray();
- result = QLatin1String("@ByteArray(")
- + QLatin1String(a.constData(), a.size())
- + QLatin1Char(')');
+ result = "@ByteArray("_L1 + QLatin1StringView(a) + u')';
break;
}
@@ -405,9 +396,9 @@ QString QSettingsPrivate::variantToString(const QVariant &v)
case QMetaType::Double: {
result = v.toString();
if (result.contains(QChar::Null))
- result = QLatin1String("@String(") + result + QLatin1Char(')');
- else if (result.startsWith(QLatin1Char('@')))
- result.prepend(QLatin1Char('@'));
+ result = "@String("_L1 + result + u')';
+ else if (result.startsWith(u'@'))
+ result.prepend(u'@');
break;
}
#ifndef QT_NO_GEOM_VARIANT
@@ -446,9 +437,9 @@ QString QSettingsPrivate::variantToString(const QVariant &v)
s << v;
}
- result = QLatin1String(typeSpec)
- + QLatin1String(a.constData(), a.size())
- + QLatin1Char(')');
+ result = QLatin1StringView(typeSpec)
+ + QLatin1StringView(a.constData(), a.size())
+ + u')';
#else
Q_ASSERT(!"QSettings: Cannot save custom types without QDataStream support");
#endif
@@ -462,25 +453,25 @@ QString QSettingsPrivate::variantToString(const QVariant &v)
QVariant QSettingsPrivate::stringToVariant(const QString &s)
{
- if (s.startsWith(QLatin1Char('@'))) {
- if (s.endsWith(QLatin1Char(')'))) {
- if (s.startsWith(QLatin1String("@ByteArray("))) {
- return QVariant(QStringView{s}.mid(11, s.size() - 12).toLatin1());
- } else if (s.startsWith(QLatin1String("@String("))) {
- return QVariant(QStringView{s}.mid(8, s.size() - 9).toString());
- } else if (s.startsWith(QLatin1String("@Variant("))
- || s.startsWith(QLatin1String("@DateTime("))) {
+ if (s.startsWith(u'@')) {
+ if (s.endsWith(u')')) {
+ if (s.startsWith("@ByteArray("_L1)) {
+ return QVariant(QStringView{s}.sliced(11).chopped(1).toLatin1());
+ } else if (s.startsWith("@String("_L1)) {
+ return QVariant(QStringView{s}.sliced(8).chopped(1).toString());
+ } else if (s.startsWith("@Variant("_L1)
+ || s.startsWith("@DateTime("_L1)) {
#ifndef QT_NO_DATASTREAM
QDataStream::Version version;
int offset;
- if (s.at(1) == QLatin1Char('D')) {
+ if (s.at(1) == u'D') {
version = QDataStream::Qt_5_6;
offset = 10;
} else {
version = QDataStream::Qt_4_0;
offset = 9;
}
- QByteArray a = QStringView{s}.mid(offset).toLatin1();
+ QByteArray a = QStringView{s}.sliced(offset).toLatin1();
QDataStream stream(&a, QIODevice::ReadOnly);
stream.setVersion(version);
QVariant result;
@@ -490,53 +481,50 @@ QVariant QSettingsPrivate::stringToVariant(const QString &s)
Q_ASSERT(!"QSettings: Cannot load custom types without QDataStream support");
#endif
#ifndef QT_NO_GEOM_VARIANT
- } else if (s.startsWith(QLatin1String("@Rect("))) {
+ } else if (s.startsWith("@Rect("_L1)) {
QStringList args = QSettingsPrivate::splitArgs(s, 5);
if (args.size() == 4)
return QVariant(QRect(args[0].toInt(), args[1].toInt(), args[2].toInt(), args[3].toInt()));
- } else if (s.startsWith(QLatin1String("@Size("))) {
+ } else if (s.startsWith("@Size("_L1)) {
QStringList args = QSettingsPrivate::splitArgs(s, 5);
if (args.size() == 2)
return QVariant(QSize(args[0].toInt(), args[1].toInt()));
- } else if (s.startsWith(QLatin1String("@Point("))) {
+ } else if (s.startsWith("@Point("_L1)) {
QStringList args = QSettingsPrivate::splitArgs(s, 6);
if (args.size() == 2)
return QVariant(QPoint(args[0].toInt(), args[1].toInt()));
#endif
- } else if (s == QLatin1String("@Invalid()")) {
+ } else if (s == "@Invalid()"_L1) {
return QVariant();
}
}
- if (s.startsWith(QLatin1String("@@")))
- return QVariant(s.mid(1));
+ if (s.startsWith("@@"_L1))
+ return QVariant(s.sliced(1));
}
return QVariant(s);
}
-static const char hexDigits[] = "0123456789ABCDEF";
-
void QSettingsPrivate::iniEscapedKey(const QString &key, QByteArray &result)
{
- result.reserve(result.length() + key.length() * 3 / 2);
- for (int i = 0; i < key.size(); ++i) {
+ result.reserve(result.size() + key.size() * 3 / 2);
+ for (qsizetype i = 0; i < key.size(); ++i) {
uint ch = key.at(i).unicode();
if (ch == '/') {
result += '\\';
- } else if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || (ch >= '0' && ch <= '9')
- || ch == '_' || ch == '-' || ch == '.') {
+ } else if (isAsciiLetterOrNumber(ch) || ch == '_' || ch == '-' || ch == '.') {
result += (char)ch;
} else if (ch <= 0xFF) {
result += '%';
- result += hexDigits[ch / 16];
- result += hexDigits[ch % 16];
+ result += QtMiscUtils::toHexUpper(ch / 16);
+ result += QtMiscUtils::toHexUpper(ch % 16);
} else {
result += "%U";
QByteArray hexCode;
- for (int i = 0; i < 4; ++i) {
- hexCode.prepend(hexDigits[ch % 16]);
+ for (int j = 0; j < 4; ++j) {
+ hexCode.prepend(QtMiscUtils::toHexUpper(ch % 16));
ch >>= 4;
}
result += hexCode;
@@ -544,49 +532,50 @@ void QSettingsPrivate::iniEscapedKey(const QString &key, QByteArray &result)
}
}
-bool QSettingsPrivate::iniUnescapedKey(const QByteArray &key, int from, int to, QString &result)
+bool QSettingsPrivate::iniUnescapedKey(QByteArrayView key, QString &result)
{
+ const QString decoded = QString::fromUtf8(key);
+ const qsizetype size = decoded.size();
+ result.reserve(result.size() + size);
+ qsizetype i = 0;
bool lowercaseOnly = true;
- int i = from;
- result.reserve(result.length() + (to - from));
- while (i < to) {
- char16_t ch = (uchar)key.at(i);
+ while (i < size) {
+ char16_t ch = decoded.at(i).unicode();
if (ch == '\\') {
- result += QLatin1Char('/');
+ result += u'/';
++i;
continue;
}
- if (ch != '%' || i == to - 1) {
- if (uint(ch - 'A') <= 'Z' - 'A') // only for ASCII
+ if (ch != '%' || i == size - 1) {
+ QChar qch(ch);
+ if (qch.isUpper())
lowercaseOnly = false;
- result += ch;
+ result += qch;
++i;
continue;
}
int numDigits = 2;
- int firstDigitPos = i + 1;
+ qsizetype firstDigitPos = i + 1;
- ch = key.at(i + 1);
+ ch = decoded.at(i + 1).unicode();
if (ch == 'U') {
++firstDigitPos;
numDigits = 4;
}
- if (firstDigitPos + numDigits > to) {
- result += QLatin1Char('%');
- // ### missing U
+ if (firstDigitPos + numDigits > size) {
+ result += u'%';
++i;
continue;
}
bool ok;
- ch = key.mid(firstDigitPos, numDigits).toUShort(&ok, 16);
+ ch = QStringView(decoded).sliced(firstDigitPos, numDigits).toUShort(&ok, 16);
if (!ok) {
- result += QLatin1Char('%');
- // ### missing U
+ result += u'%';
++i;
continue;
}
@@ -604,25 +593,20 @@ void QSettingsPrivate::iniEscapedString(const QString &str, QByteArray &result)
{
bool needsQuotes = false;
bool escapeNextIfDigit = false;
- bool useCodec = !str.startsWith(QLatin1String("@ByteArray("))
- && !str.startsWith(QLatin1String("@Variant("));
-
- int i;
- int startPos = result.size();
+ const bool useCodec = !(str.startsWith("@ByteArray("_L1)
+ || str.startsWith("@Variant("_L1)
+ || str.startsWith("@DateTime("_L1));
+ const qsizetype startPos = result.size();
QStringEncoder toUtf8(QStringEncoder::Utf8);
result.reserve(startPos + str.size() * 3 / 2);
- const QChar *unicode = str.unicode();
- for (i = 0; i < str.size(); ++i) {
- uint ch = unicode[i].unicode();
+ for (QChar qch : str) {
+ uint ch = qch.unicode();
if (ch == ';' || ch == ',' || ch == '=')
needsQuotes = true;
- if (escapeNextIfDigit
- && ((ch >= '0' && ch <= '9')
- || (ch >= 'a' && ch <= 'f')
- || (ch >= 'A' && ch <= 'F'))) {
+ if (escapeNextIfDigit && isHexDigit(ch)) {
result += "\\x" + QByteArray::number(ch, 16);
continue;
}
@@ -666,7 +650,7 @@ void QSettingsPrivate::iniEscapedString(const QString &str, QByteArray &result)
escapeNextIfDigit = true;
} else if (useCodec) {
// slow
- result += toUtf8(unicode[i]);
+ result += toUtf8(qch);
} else {
result += (char)ch;
}
@@ -681,11 +665,11 @@ void QSettingsPrivate::iniEscapedString(const QString &str, QByteArray &result)
}
}
-inline static void iniChopTrailingSpaces(QString &str, int limit)
+inline static void iniChopTrailingSpaces(QString &str, qsizetype limit)
{
- int n = str.size() - 1;
+ qsizetype n = str.size() - 1;
QChar ch;
- while (n >= limit && ((ch = str.at(n)) == QLatin1Char(' ') || ch == QLatin1Char('\t')))
+ while (n >= limit && ((ch = str.at(n)) == u' ' || ch == u'\t'))
str.truncate(n--);
}
@@ -702,7 +686,7 @@ void QSettingsPrivate::iniEscapedStringList(const QStringList &strs, QByteArray
*/
result += "@Invalid()";
} else {
- for (int i = 0; i < strs.size(); ++i) {
+ for (qsizetype i = 0; i < strs.size(); ++i) {
if (i != 0)
result += ", ";
iniEscapedString(strs.at(i), result);
@@ -710,7 +694,7 @@ void QSettingsPrivate::iniEscapedStringList(const QStringList &strs, QByteArray
}
}
-bool QSettingsPrivate::iniUnescapedStringList(const QByteArray &str, int from, int to,
+bool QSettingsPrivate::iniUnescapedStringList(QByteArrayView str,
QString &stringResult, QStringList &stringListResult)
{
static const char escapeCodes[][2] =
@@ -732,22 +716,22 @@ bool QSettingsPrivate::iniUnescapedStringList(const QByteArray &str, int from, i
bool inQuotedString = false;
bool currentValueIsQuoted = false;
char16_t escapeVal = 0;
- int i = from;
+ qsizetype i = 0;
char ch;
QStringDecoder fromUtf8(QStringDecoder::Utf8);
StSkipSpaces:
- while (i < to && ((ch = str.at(i)) == ' ' || ch == '\t'))
+ while (i < str.size() && ((ch = str.at(i)) == ' ' || ch == '\t'))
++i;
// fallthrough
StNormal:
- int chopLimit = stringResult.length();
- while (i < to) {
+ qsizetype chopLimit = stringResult.size();
+ while (i < str.size()) {
switch (str.at(i)) {
case '\\':
++i;
- if (i >= to)
+ if (i >= str.size())
goto end;
ch = str.at(i++);
@@ -761,17 +745,17 @@ StNormal:
if (ch == 'x') {
escapeVal = 0;
- if (i >= to)
+ if (i >= str.size())
goto end;
ch = str.at(i);
- if ((ch >= '0' && ch <= '9') || (ch >= 'A' && ch <= 'F') || (ch >= 'a' && ch <= 'f'))
+ if (isHexDigit(ch))
goto StHexEscape;
- } else if (ch >= '0' && ch <= '7') {
- escapeVal = ch - '0';
+ } else if (const int o = fromOct(ch); o != -1) {
+ escapeVal = o;
goto StOctEscape;
} else if (ch == '\n' || ch == '\r') {
- if (i < to) {
+ if (i < str.size()) {
char ch2 = str.at(i);
// \n, \r, \r\n, and \n\r are legitimate line terminators in INI files
if ((ch2 == '\n' || ch2 == '\r') && ch2 != ch)
@@ -780,7 +764,7 @@ StNormal:
} else {
// the character is skipped
}
- chopLimit = stringResult.length();
+ chopLimit = stringResult.size();
break;
case '"':
++i;
@@ -806,15 +790,15 @@ StNormal:
}
Q_FALLTHROUGH();
default: {
- int j = i + 1;
- while (j < to) {
+ qsizetype j = i + 1;
+ while (j < str.size()) {
ch = str.at(j);
if (ch == '\\' || ch == '"' || ch == ',')
break;
++j;
}
- stringResult += fromUtf8(QByteArrayView(str).first(j).sliced(i));
+ stringResult += fromUtf8(str.first(j).sliced(i));
i = j;
}
}
@@ -824,17 +808,15 @@ StNormal:
goto end;
StHexEscape:
- if (i >= to) {
+ if (i >= str.size()) {
stringResult += escapeVal;
goto end;
}
ch = str.at(i);
- if (ch >= 'a')
- ch -= 'a' - 'A';
- if ((ch >= '0' && ch <= '9') || (ch >= 'A' && ch <= 'F')) {
+ if (const int h = fromHex(ch); h != -1) {
escapeVal <<= 4;
- escapeVal += strchr(hexDigits, ch) - hexDigits;
+ escapeVal += h;
++i;
goto StHexEscape;
} else {
@@ -843,15 +825,15 @@ StHexEscape:
}
StOctEscape:
- if (i >= to) {
+ if (i >= str.size()) {
stringResult += escapeVal;
goto end;
}
ch = str.at(i);
- if (ch >= '0' && ch <= '7') {
+ if (const int o = fromOct(ch); o != -1) {
escapeVal <<= 3;
- escapeVal += ch - '0';
+ escapeVal += o;
++i;
goto StOctEscape;
} else {
@@ -865,22 +847,22 @@ end:
return isStringList;
}
-QStringList QSettingsPrivate::splitArgs(const QString &s, int idx)
+QStringList QSettingsPrivate::splitArgs(const QString &s, qsizetype idx)
{
- int l = s.length();
+ qsizetype l = s.size();
Q_ASSERT(l > 0);
- Q_ASSERT(s.at(idx) == QLatin1Char('('));
- Q_ASSERT(s.at(l - 1) == QLatin1Char(')'));
+ Q_ASSERT(s.at(idx) == u'(');
+ Q_ASSERT(s.at(l - 1) == u')');
QStringList result;
QString item;
for (++idx; idx < l; ++idx) {
QChar c = s.at(idx);
- if (c == QLatin1Char(')')) {
+ if (c == u')') {
Q_ASSERT(idx == l - 1);
result.append(item);
- } else if (c == QLatin1Char(' ')) {
+ } else if (c == u' ') {
result.append(item);
item.clear();
} else {
@@ -896,20 +878,30 @@ QStringList QSettingsPrivate::splitArgs(const QString &s, int idx)
void QConfFileSettingsPrivate::initFormat()
{
- extension = (format == QSettings::NativeFormat) ? QLatin1String(".conf") : QLatin1String(".ini");
+#if defined(Q_OS_WASM)
+ extension = (format == QSettings::NativeFormat || format == QSettings::WebIndexedDBFormat)
+ ? ".conf"_L1
+ : ".ini"_L1;
+#else
+ extension = (format == QSettings::NativeFormat) ? ".conf"_L1 : ".ini"_L1;
+#endif
readFunc = nullptr;
writeFunc = nullptr;
-#if defined(Q_OS_MAC)
+#if defined(Q_OS_DARWIN)
caseSensitivity = (format == QSettings::NativeFormat) ? Qt::CaseSensitive : IniCaseSensitivity;
#else
caseSensitivity = IniCaseSensitivity;
#endif
+#if defined Q_OS_WASM
+ if (format > QSettings::IniFormat && format != QSettings::WebIndexedDBFormat) {
+#else
if (format > QSettings::IniFormat) {
+#endif
const auto locker = qt_scoped_lock(settingsGlobalMutex);
const CustomFormatVector *customFormatVector = customFormatVectorFunc();
- int i = (int)format - (int)QSettings::CustomFormat1;
+ qsizetype i = qsizetype(format) - qsizetype(QSettings::CustomFormat1);
if (i >= 0 && i < customFormatVector->size()) {
QConfFileCustomFormat info = customFormatVector->at(i);
extension = info.extension;
@@ -923,7 +915,11 @@ void QConfFileSettingsPrivate::initFormat()
void QConfFileSettingsPrivate::initAccess()
{
if (!confFiles.isEmpty()) {
+#if defined Q_OS_WASM
+ if (format > QSettings::IniFormat && format != QSettings::WebIndexedDBFormat) {
+#else
if (format > QSettings::IniFormat) {
+#endif
if (!readFunc)
setStatus(QSettings::AccessError);
}
@@ -945,9 +941,9 @@ static QString windowsConfigPath(const KNOWNFOLDERID &type)
if (result.isEmpty()) {
if (type == FOLDERID_ProgramData) {
- result = QLatin1String("C:\\temp\\qt-common");
+ result = "C:\\temp\\qt-common"_L1;
} else if (type == FOLDERID_RoamingAppData) {
- result = QLatin1String("C:\\temp\\qt-user");
+ result = "C:\\temp\\qt-user"_L1;
}
}
@@ -961,26 +957,43 @@ static inline int pathHashKey(QSettings::Format format, QSettings::Scope scope)
}
#ifndef Q_OS_WIN
-static QString make_user_path()
+static constexpr QChar sep = u'/';
+
+#if !defined(QSETTINGS_USE_QSTANDARDPATHS) || defined(Q_OS_ANDROID)
+static QString make_user_path_without_qstandard_paths()
{
- static constexpr QChar sep = QLatin1Char('/');
-#ifndef QSETTINGS_USE_QSTANDARDPATHS
- // Non XDG platforms (OS X, iOS, Android...) have used this code path erroneously
- // for some time now. Moving away from that would require migrating existing settings.
QByteArray env = qgetenv("XDG_CONFIG_HOME");
if (env.isEmpty()) {
- return QDir::homePath() + QLatin1String("/.config/");
+ return QDir::homePath() + "/.config/"_L1;
} else if (env.startsWith('/')) {
return QFile::decodeName(env) + sep;
- } else {
- return QDir::homePath() + sep + QFile::decodeName(env) + sep;
}
+
+ return QDir::homePath() + sep + QFile::decodeName(env) + sep;
+}
+#endif // !QSETTINGS_USE_QSTANDARDPATHS || Q_OS_ANDROID
+
+static QString make_user_path()
+{
+#ifndef QSETTINGS_USE_QSTANDARDPATHS
+ // Non XDG platforms (OS X, iOS, Android...) have used this code path erroneously
+ // for some time now. Moving away from that would require migrating existing settings.
+ // The migration has already been done for Android.
+ return make_user_path_without_qstandard_paths();
#else
- // When using a proper XDG platform, use QStandardPaths rather than the above hand-written code;
- // it makes the use of test mode from unit tests possible.
+
+#ifdef Q_OS_ANDROID
+ // If an old settings path exists, use it instead of creating a new one
+ QString ret = make_user_path_without_qstandard_paths();
+ if (QFile(ret).exists())
+ return ret;
+#endif // Q_OS_ANDROID
+
+ // When using a proper XDG platform or Android platform, use QStandardPaths rather than the
+ // above hand-written code. It makes the use of test mode from unit tests possible.
// Ideally all platforms should use this, but see above for the migration issue.
return QStandardPaths::writableLocation(QStandardPaths::GenericConfigLocation) + sep;
-#endif
+#endif // !QSETTINGS_USE_QSTANDARDPATHS
}
#endif // !Q_OS_WIN
@@ -995,7 +1008,7 @@ static std::unique_lock<QBasicMutex> initDefaultPaths(std::unique_lock<QBasicMut
avoid a dead-lock, we can't hold the global mutex while
calling it.
*/
- QString systemPath = QLibraryInfo::path(QLibraryInfo::SettingsPath) + QLatin1Char('/');
+ QString systemPath = QLibraryInfo::path(QLibraryInfo::SettingsPath) + u'/';
locker.lock();
if (pathHash->isEmpty()) {
@@ -1016,7 +1029,7 @@ static std::unique_lock<QBasicMutex> initDefaultPaths(std::unique_lock<QBasicMut
const QString userPath = make_user_path();
pathHash->insert(pathHashKey(QSettings::IniFormat, QSettings::UserScope), Path(userPath, false));
pathHash->insert(pathHashKey(QSettings::IniFormat, QSettings::SystemScope), Path(systemPath, false));
-#ifndef Q_OS_MAC
+#ifndef Q_OS_DARWIN
pathHash->insert(pathHashKey(QSettings::NativeFormat, QSettings::UserScope), Path(userPath, false));
pathHash->insert(pathHashKey(QSettings::NativeFormat, QSettings::SystemScope), Path(systemPath, false));
#endif
@@ -1028,8 +1041,8 @@ static std::unique_lock<QBasicMutex> initDefaultPaths(std::unique_lock<QBasicMut
static Path getPath(QSettings::Format format, QSettings::Scope scope)
{
- Q_ASSERT((int)QSettings::NativeFormat == 0);
- Q_ASSERT((int)QSettings::IniFormat == 1);
+ Q_ASSERT(int(QSettings::NativeFormat) == 0);
+ Q_ASSERT(int(QSettings::IniFormat) == 1);
auto locker = qt_unique_lock(settingsGlobalMutex);
PathHash *pathHash = pathHashFunc();
@@ -1065,7 +1078,7 @@ QConfFileSettingsPrivate::QConfFileSettingsPrivate(QSettings::Format format,
QString org = organization;
if (org.isEmpty()) {
setStatus(QSettings::AccessError);
- org = QLatin1String("Unknown Organization");
+ org = "Unknown Organization"_L1;
}
QString appFile = org + QDir::separator() + application + extension;
@@ -1092,16 +1105,16 @@ QConfFileSettingsPrivate::QConfFileSettingsPrivate(QSettings::Format format,
QStringList paths;
if (!application.isEmpty()) {
paths.reserve(dirs.size() * 2);
- for (const auto &dir : qAsConst(dirs))
- paths.append(dir + QLatin1Char('/') + appFile);
+ for (const auto &dir : std::as_const(dirs))
+ paths.append(dir + u'/' + appFile);
} else {
paths.reserve(dirs.size());
}
- for (const auto &dir : qAsConst(dirs))
- paths.append(dir + QLatin1Char('/') + orgFile);
+ for (const auto &dir : std::as_const(dirs))
+ paths.append(dir + u'/' + orgFile);
// Note: No check for existence of files is done intentionally.
- for (const auto &path : qAsConst(paths))
+ for (const auto &path : std::as_const(paths))
confFiles.append(QConfFile::fromName(path, false));
} else
#endif // Q_XDG_PLATFORM && !QT_NO_STANDARDPATHS
@@ -1111,9 +1124,7 @@ QConfFileSettingsPrivate::QConfFileSettingsPrivate(QSettings::Format format,
confFiles.append(QConfFile::fromName(systemPath.path + orgFile, false));
}
-#ifndef Q_OS_WASM // wasm needs to delay access until after file sync
initAccess();
-#endif
}
QConfFileSettingsPrivate::QConfFileSettingsPrivate(const QString &fileName,
@@ -1134,7 +1145,7 @@ QConfFileSettingsPrivate::~QConfFileSettingsPrivate()
ConfFileHash *usedHash = usedHashFunc();
ConfFileCache *unusedCache = unusedCacheFunc();
- for (auto conf_file : qAsConst(confFiles)) {
+ for (auto conf_file : std::as_const(confFiles)) {
if (!conf_file->ref.deref()) {
if (conf_file->size == 0) {
delete conf_file;
@@ -1168,18 +1179,18 @@ void QConfFileSettingsPrivate::remove(const QString &key)
QConfFile *confFile = confFiles.at(0);
QSettingsKey theKey(key, caseSensitivity);
- QSettingsKey prefix(key + QLatin1Char('/'), caseSensitivity);
+ QSettingsKey prefix(key + u'/', caseSensitivity);
const auto locker = qt_scoped_lock(confFile->mutex);
ensureSectionParsed(confFile, theKey);
ensureSectionParsed(confFile, prefix);
- ParsedSettingsMap::iterator i = confFile->addedKeys.lowerBound(prefix);
+ auto i = confFile->addedKeys.lowerBound(prefix);
while (i != confFile->addedKeys.end() && i.key().startsWith(prefix))
i = confFile->addedKeys.erase(i);
confFile->addedKeys.remove(theKey);
- ParsedSettingsMap::const_iterator j = const_cast<const ParsedSettingsMap *>(&confFile->originalKeys)->lowerBound(prefix);
+ auto j = const_cast<const ParsedSettingsMap *>(&confFile->originalKeys)->lowerBound(prefix);
while (j != confFile->originalKeys.constEnd() && j.key().startsWith(prefix)) {
confFile->removedKeys.insert(j.key(), QVariant());
++j;
@@ -1208,7 +1219,7 @@ std::optional<QVariant> QConfFileSettingsPrivate::get(const QString &key) const
ParsedSettingsMap::const_iterator j;
bool found = false;
- for (auto confFile : qAsConst(confFiles)) {
+ for (auto confFile : std::as_const(confFiles)) {
const auto locker = qt_scoped_lock(confFile->mutex);
if (!confFile->addedKeys.isEmpty()) {
@@ -1233,12 +1244,11 @@ std::optional<QVariant> QConfFileSettingsPrivate::get(const QString &key) const
QStringList QConfFileSettingsPrivate::children(const QString &prefix, ChildSpec spec) const
{
QStringList result;
- ParsedSettingsMap::const_iterator j;
QSettingsKey thePrefix(prefix, caseSensitivity);
- int startPos = prefix.size();
+ qsizetype startPos = prefix.size();
- for (auto confFile : qAsConst(confFiles)) {
+ for (auto confFile : std::as_const(confFiles)) {
const auto locker = qt_scoped_lock(confFile->mutex);
if (thePrefix.isEmpty())
@@ -1246,18 +1256,18 @@ QStringList QConfFileSettingsPrivate::children(const QString &prefix, ChildSpec
else
ensureSectionParsed(confFile, thePrefix);
- j = const_cast<const ParsedSettingsMap *>(
- &confFile->originalKeys)->lowerBound( thePrefix);
- while (j != confFile->originalKeys.constEnd() && j.key().startsWith(thePrefix)) {
- if (!confFile->removedKeys.contains(j.key()))
- processChild(QStringView{j.key().originalCaseKey()}.mid(startPos), spec, result);
- ++j;
+ const auto &originalKeys = confFile->originalKeys;
+ auto i = originalKeys.lowerBound(thePrefix);
+ while (i != originalKeys.end() && i.key().startsWith(thePrefix)) {
+ if (!confFile->removedKeys.contains(i.key()))
+ processChild(QStringView{i.key().originalCaseKey()}.sliced(startPos), spec, result);
+ ++i;
}
- j = const_cast<const ParsedSettingsMap *>(
- &confFile->addedKeys)->lowerBound(thePrefix);
- while (j != confFile->addedKeys.constEnd() && j.key().startsWith(thePrefix)) {
- processChild(QStringView{j.key().originalCaseKey()}.mid(startPos), spec, result);
+ const auto &addedKeys = confFile->addedKeys;
+ auto j = addedKeys.lowerBound(thePrefix);
+ while (j != addedKeys.end() && j.key().startsWith(thePrefix)) {
+ processChild(QStringView{j.key().originalCaseKey()}.sliced(startPos), spec, result);
++j;
}
@@ -1289,7 +1299,7 @@ void QConfFileSettingsPrivate::sync()
// people probably won't be checking the status a whole lot, so in case of
// error we just try to go on and make the best of it
- for (auto confFile : qAsConst(confFiles)) {
+ for (auto confFile : std::as_const(confFiles)) {
const auto locker = qt_scoped_lock(confFile->mutex);
syncConfFile(confFile);
}
@@ -1311,7 +1321,11 @@ QString QConfFileSettingsPrivate::fileName() const
bool QConfFileSettingsPrivate::isWritable() const
{
+#if defined(Q_OS_WASM)
+ if (format > QSettings::IniFormat && format != QSettings::WebIndexedDBFormat && !writeFunc)
+#else
if (format > QSettings::IniFormat && !writeFunc)
+#endif
return false;
if (confFiles.isEmpty())
@@ -1324,13 +1338,13 @@ void QConfFileSettingsPrivate::syncConfFile(QConfFile *confFile)
{
bool readOnly = confFile->addedKeys.isEmpty() && confFile->removedKeys.isEmpty();
+ QFileInfo fileInfo(confFile->name);
/*
We can often optimize the read-only case, if the file on disk
hasn't changed.
*/
if (readOnly && confFile->size > 0) {
- QFileInfo fileInfo(confFile->name);
- if (confFile->size == fileInfo.size() && confFile->timeStamp == fileInfo.lastModified())
+ if (confFile->size == fileInfo.size() && confFile->timeStamp == fileInfo.lastModified(QTimeZone::UTC))
return;
}
@@ -1340,6 +1354,14 @@ void QConfFileSettingsPrivate::syncConfFile(QConfFile *confFile)
}
#ifndef QT_BOOTSTRAPPED
+ QString lockFileName = confFile->name + ".lock"_L1;
+
+# if defined(Q_OS_ANDROID) && defined(QSETTINGS_USE_QSTANDARDPATHS)
+ // On android and if it is a content URL put the lock file in a
+ // writable location to prevent permissions issues and invalid paths.
+ if (confFile->name.startsWith("content:"_L1))
+ lockFileName = make_user_path() + QFileInfo(lockFileName).fileName();
+# endif
/*
Use a lockfile in order to protect us against other QSettings instances
trying to write the same settings at the same time.
@@ -1347,7 +1369,7 @@ void QConfFileSettingsPrivate::syncConfFile(QConfFile *confFile)
We only need to lock if we are actually writing as only concurrent writes are a problem.
Concurrent read and write are not a problem because the writing operation is atomic.
*/
- QLockFile lockFile(confFile->name + QLatin1String(".lock"));
+ QLockFile lockFile(lockFileName);
if (!readOnly && !lockFile.lock() && atomicSyncOnly) {
setStatus(QSettings::AccessError);
return;
@@ -1358,13 +1380,13 @@ void QConfFileSettingsPrivate::syncConfFile(QConfFile *confFile)
We hold the lock. Let's reread the file if it has changed
since last time we read it.
*/
- QFileInfo fileInfo(confFile->name);
+ fileInfo.refresh();
bool mustReadFile = true;
bool createFile = !fileInfo.exists();
if (!readOnly)
mustReadFile = (confFile->size != fileInfo.size()
- || (confFile->size != 0 && confFile->timeStamp != fileInfo.lastModified()));
+ || (confFile->size != 0 && confFile->timeStamp != fileInfo.lastModified(QTimeZone::UTC)));
if (mustReadFile) {
confFile->unparsedIniSections.clear();
@@ -1382,7 +1404,14 @@ void QConfFileSettingsPrivate::syncConfFile(QConfFile *confFile)
*/
if (file.isReadable() && file.size() != 0) {
bool ok = false;
-#ifdef Q_OS_MAC
+
+#ifdef Q_OS_WASM
+ if (format == QSettings::WebIndexedDBFormat) {
+ QByteArray data = file.readAll();
+ ok = readIniFile(data, &confFile->unparsedIniSections);
+ } else
+#endif
+#ifdef Q_OS_DARWIN
if (format == QSettings::NativeFormat) {
QByteArray data = file.readAll();
ok = readPlistFile(data, &confFile->originalKeys);
@@ -1396,7 +1425,7 @@ void QConfFileSettingsPrivate::syncConfFile(QConfFile *confFile)
ok = readFunc(file, tempNewKeys);
if (ok) {
- QSettings::SettingsMap::const_iterator i = tempNewKeys.constBegin();
+ auto i = tempNewKeys.constBegin();
while (i != tempNewKeys.constEnd()) {
confFile->originalKeys.insert(QSettingsKey(i.key(), caseSensitivity),
i.value());
@@ -1410,7 +1439,7 @@ void QConfFileSettingsPrivate::syncConfFile(QConfFile *confFile)
}
confFile->size = fileInfo.size();
- confFile->timeStamp = fileInfo.lastModified();
+ confFile->timeStamp = fileInfo.lastModified(QTimeZone::UTC);
}
/*
@@ -1425,6 +1454,11 @@ void QConfFileSettingsPrivate::syncConfFile(QConfFile *confFile)
#if !defined(QT_BOOTSTRAPPED) && QT_CONFIG(temporaryfile)
QSaveFile sf(confFile->name);
sf.setDirectWriteFallback(!atomicSyncOnly);
+# ifdef Q_OS_ANDROID
+ // QSaveFile requires direct write when using content scheme URL in Android
+ if (confFile->name.startsWith("content:"_L1))
+ sf.setDirectWriteFallback(true);
+# endif
#else
QFile sf(confFile->name);
#endif
@@ -1433,7 +1467,12 @@ void QConfFileSettingsPrivate::syncConfFile(QConfFile *confFile)
return;
}
-#ifdef Q_OS_MAC
+#ifdef Q_OS_WASM
+ if (format == QSettings::WebIndexedDBFormat) {
+ ok = writeIniFile(sf, mergedKeys);
+ } else
+#endif
+#ifdef Q_OS_DARWIN
if (format == QSettings::NativeFormat) {
ok = writePlistFile(sf, mergedKeys);
} else
@@ -1443,7 +1482,7 @@ void QConfFileSettingsPrivate::syncConfFile(QConfFile *confFile)
} else if (writeFunc) {
QSettings::SettingsMap tempOriginalKeys;
- ParsedSettingsMap::const_iterator i = mergedKeys.constBegin();
+ auto i = mergedKeys.constBegin();
while (i != mergedKeys.constEnd()) {
tempOriginalKeys.insert(i.key(), i.value());
++i;
@@ -1462,9 +1501,9 @@ void QConfFileSettingsPrivate::syncConfFile(QConfFile *confFile)
confFile->addedKeys.clear();
confFile->removedKeys.clear();
- QFileInfo fileInfo(confFile->name);
+ fileInfo.refresh();
confFile->size = fileInfo.size();
- confFile->timeStamp = fileInfo.lastModified();
+ confFile->timeStamp = fileInfo.lastModified(QTimeZone::UTC);
// If we have created the file, apply the file perms
if (createFile) {
@@ -1479,6 +1518,8 @@ void QConfFileSettingsPrivate::syncConfFile(QConfFile *confFile)
}
}
+namespace SettingsImpl {
+
enum { Space = 0x1, Special = 0x2 };
static const char charTraits[256] =
@@ -1505,10 +1546,16 @@ static const char charTraits[256] =
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};
-bool QConfFileSettingsPrivate::readIniLine(const QByteArray &data, int &dataPos,
- int &lineStart, int &lineLen, int &equalsPos)
+} // namespace SettingsImpl
+
+using SettingsImpl::charTraits;
+
+bool QConfFileSettingsPrivate::readIniLine(QByteArrayView data, qsizetype &dataPos,
+ qsizetype &lineStart, qsizetype &lineLen,
+ qsizetype &equalsPos)
{
- int dataLen = data.length();
+ using namespace SettingsImpl;
+ qsizetype dataLen = data.size();
bool inQuotes = false;
equalsPos = -1;
@@ -1517,7 +1564,7 @@ bool QConfFileSettingsPrivate::readIniLine(const QByteArray &data, int &dataPos,
while (lineStart < dataLen && (charTraits[uint(uchar(data.at(lineStart)))] & Space))
++lineStart;
- int i = lineStart;
+ qsizetype i = lineStart;
while (i < dataLen) {
char ch = data.at(i);
while (!(charTraits[uchar(ch)] & Special)) {
@@ -1576,7 +1623,7 @@ break_out_of_outer_loop:
possible, so if the user doesn't check the status he will get the
most out of the file anyway.
*/
-bool QConfFileSettingsPrivate::readIniFile(const QByteArray &data,
+bool QConfFileSettingsPrivate::readIniFile(QByteArrayView data,
UnparsedSettingsMap *unparsedIniSections)
{
#define FLUSH_CURRENT_SECTION() \
@@ -1586,59 +1633,56 @@ bool QConfFileSettingsPrivate::readIniFile(const QByteArray &data,
sectionPosition)]; \
if (!sectionData.isEmpty()) \
sectionData.append('\n'); \
- sectionData += data.mid(currentSectionStart, lineStart - currentSectionStart); \
+ sectionData += data.first(lineStart).sliced(currentSectionStart); \
sectionPosition = ++position; \
}
QString currentSection;
- int currentSectionStart = 0;
- int dataPos = 0;
- int lineStart;
- int lineLen;
- int equalsPos;
- int position = 0;
- int sectionPosition = 0;
+ qsizetype currentSectionStart = 0;
+ qsizetype dataPos = 0;
+ qsizetype lineStart;
+ qsizetype lineLen;
+ qsizetype equalsPos;
+ qsizetype position = 0;
+ qsizetype sectionPosition = 0;
bool ok = true;
- // skip potential utf8 BOM
- const uchar *dd = (const uchar *)data.constData();
- if (data.size() >= 3 && dd[0] == 0xef && dd[1] == 0xbb && dd[2] == 0xbf)
- dataPos = 3;
+ // Skip possible UTF-8 BOM:
+ if (data.startsWith("\xef\xbb\xbf"))
+ data = data.sliced(3);
while (readIniLine(data, dataPos, lineStart, lineLen, equalsPos)) {
- char ch = data.at(lineStart);
- if (ch == '[') {
+ QByteArrayView line = data.sliced(lineStart, lineLen);
+ if (line.startsWith('[')) {
FLUSH_CURRENT_SECTION();
- // this is a section
- QByteArray iniSection;
- int idx = data.indexOf(']', lineStart);
- if (idx == -1 || idx >= lineStart + lineLen) {
+ // This starts a new section.
+ qsizetype idx = line.indexOf(']');
+ Q_ASSERT(idx == -1 || idx > 0); // line[0] is '[', not ']'.
+ Q_ASSERT(idx < lineLen); // (including -1 < lineLen, if no ']' present.)
+ if (idx < 0) {
ok = false;
- iniSection = data.mid(lineStart + 1, lineLen - 1);
- } else {
- iniSection = data.mid(lineStart + 1, idx - lineStart - 1);
+ idx = lineLen; // so line.first(idx) is just line
}
-
- iniSection = iniSection.trimmed();
+ QByteArrayView iniSection = line.first(idx).sliced(1).trimmed();
if (iniSection.compare("general", Qt::CaseInsensitive) == 0) {
currentSection.clear();
} else {
if (iniSection.compare("%general", Qt::CaseInsensitive) == 0) {
- currentSection = QLatin1String(iniSection.constData() + 1);
+ currentSection = QLatin1StringView(iniSection.constData() + 1, iniSection.size() - 1);
} else {
currentSection.clear();
- iniUnescapedKey(iniSection, 0, iniSection.size(), currentSection);
+ iniUnescapedKey(iniSection, currentSection);
}
- currentSection += QLatin1Char('/');
+ currentSection += u'/';
}
currentSectionStart = dataPos;
}
++position;
}
- Q_ASSERT(lineStart == data.length());
+ Q_ASSERT(lineStart == data.size());
FLUSH_CURRENT_SECTION();
return ok;
@@ -1646,57 +1690,53 @@ bool QConfFileSettingsPrivate::readIniFile(const QByteArray &data,
#undef FLUSH_CURRENT_SECTION
}
-bool QConfFileSettingsPrivate::readIniSection(const QSettingsKey &section, const QByteArray &data,
+bool QConfFileSettingsPrivate::readIniSection(const QSettingsKey &section, QByteArrayView data,
ParsedSettingsMap *settingsMap)
{
QStringList strListValue;
bool sectionIsLowercase = (section == section.originalCaseKey());
- int equalsPos;
+ qsizetype equalsPos;
bool ok = true;
- int dataPos = 0;
- int lineStart;
- int lineLen;
- int position = section.originalKeyPosition();
+ qsizetype dataPos = 0;
+ qsizetype lineStart;
+ qsizetype lineLen;
+ qsizetype position = section.originalKeyPosition();
while (readIniLine(data, dataPos, lineStart, lineLen, equalsPos)) {
- char ch = data.at(lineStart);
- Q_ASSERT(ch != '[');
+ QByteArrayView line = data.sliced(lineStart, lineLen);
+ Q_ASSERT(!line.startsWith('['));
if (equalsPos == -1) {
- if (ch != ';')
+ if (!line.startsWith(';'))
ok = false;
continue;
}
+ // Shift equalPos indexing to be within line, rather than data:
+ equalsPos -= lineStart;
+ // Assured by readIniLine:
+ Q_ASSERT(equalsPos >= 0 && equalsPos < lineLen);
- int keyEnd = equalsPos;
- while (keyEnd > lineStart && ((ch = data.at(keyEnd - 1)) == ' ' || ch == '\t'))
- --keyEnd;
- int valueStart = equalsPos + 1;
+ QByteArrayView key = line.first(equalsPos).trimmed();
+ QByteArrayView value = line.sliced(equalsPos + 1);
- QString key = section.originalCaseKey();
- bool keyIsLowercase = (iniUnescapedKey(data, lineStart, keyEnd, key) && sectionIsLowercase);
+ QString strKey = section.originalCaseKey();
+ const Qt::CaseSensitivity casing = iniUnescapedKey(key, strKey) && sectionIsLowercase
+ ? Qt::CaseSensitive
+ : IniCaseSensitivity;
QString strValue;
- strValue.reserve(lineLen - (valueStart - lineStart));
- bool isStringList = iniUnescapedStringList(data, valueStart, lineStart + lineLen,
- strValue, strListValue);
- QVariant variant;
- if (isStringList) {
- variant = stringListToVariantList(strListValue);
- } else {
- variant = stringToVariant(strValue);
- }
+ strValue.reserve(value.size());
+ QVariant variant = iniUnescapedStringList(value, strValue, strListValue)
+ ? stringListToVariantList(strListValue)
+ : stringToVariant(strValue);
/*
We try to avoid the expensive toLower() call in
QSettingsKey by passing Qt::CaseSensitive when the
key is already in lowercase.
*/
- settingsMap->insert(QSettingsKey(key, keyIsLowercase ? Qt::CaseSensitive
- : IniCaseSensitivity,
- position),
- variant);
+ settingsMap->insert(QSettingsKey(strKey, casing, position), std::move(variant));
++position;
}
@@ -1707,9 +1747,9 @@ class QSettingsIniKey : public QString
{
public:
inline QSettingsIniKey() : position(-1) {}
- inline QSettingsIniKey(const QString &str, int pos = -1) : QString(str), position(pos) {}
+ inline QSettingsIniKey(const QString &str, qsizetype pos = -1) : QString(str), position(pos) {}
- int position;
+ qsizetype position;
};
Q_DECLARE_TYPEINFO(QSettingsIniKey, Q_RELOCATABLE_TYPE);
@@ -1724,7 +1764,7 @@ typedef QMap<QSettingsIniKey, QVariant> IniKeyMap;
struct QSettingsIniSection
{
- int position;
+ qsizetype position;
IniKeyMap keyMap;
inline QSettingsIniSection() : position(-1) {}
@@ -1741,7 +1781,6 @@ typedef QMap<QString, QSettingsIniSection> IniMap;
bool QConfFileSettingsPrivate::writeIniFile(QIODevice &device, const ParsedSettingsMap &map)
{
IniMap iniMap;
- IniMap::const_iterator i;
#ifdef Q_OS_WIN
const char * const eol = "\r\n";
@@ -1749,12 +1788,12 @@ bool QConfFileSettingsPrivate::writeIniFile(QIODevice &device, const ParsedSetti
const char eol = '\n';
#endif
- for (ParsedSettingsMap::const_iterator j = map.constBegin(); j != map.constEnd(); ++j) {
+ for (auto j = map.constBegin(); j != map.constEnd(); ++j) {
QString section;
QSettingsIniKey key(j.key().originalCaseKey(), j.key().originalKeyPosition());
- int slashPos;
+ qsizetype slashPos;
- if ((slashPos = key.indexOf(QLatin1Char('/'))) != -1) {
+ if ((slashPos = key.indexOf(u'/')) != -1) {
section = key.left(slashPos);
key.remove(0, slashPos + 1);
}
@@ -1762,21 +1801,21 @@ bool QConfFileSettingsPrivate::writeIniFile(QIODevice &device, const ParsedSetti
QSettingsIniSection &iniSection = iniMap[section];
// -1 means infinity
- if (uint(key.position) < uint(iniSection.position))
+ if (size_t(key.position) < size_t(iniSection.position))
iniSection.position = key.position;
iniSection.keyMap[key] = j.value();
}
- const int sectionCount = iniMap.size();
+ const qsizetype sectionCount = iniMap.size();
QList<QSettingsIniKey> sections;
sections.reserve(sectionCount);
- for (i = iniMap.constBegin(); i != iniMap.constEnd(); ++i)
+ for (auto i = iniMap.constBegin(); i != iniMap.constEnd(); ++i)
sections.append(QSettingsIniKey(i.key(), i.value().position));
std::sort(sections.begin(), sections.end());
bool writeError = false;
- for (int j = 0; !writeError && j < sectionCount; ++j) {
- i = iniMap.constFind(sections.at(j));
+ for (qsizetype j = 0; !writeError && j < sectionCount; ++j) {
+ auto i = iniMap.constFind(sections.at(j));
Q_ASSERT(i != iniMap.constEnd());
QByteArray realSection;
@@ -1799,7 +1838,7 @@ bool QConfFileSettingsPrivate::writeIniFile(QIODevice &device, const ParsedSetti
device.write(realSection);
const IniKeyMap &ents = i.value().keyMap;
- for (IniKeyMap::const_iterator j = ents.constBegin(); j != ents.constEnd(); ++j) {
+ for (auto j = ents.constBegin(); j != ents.constEnd(); ++j) {
QByteArray block;
iniEscapedKey(j.key(), block);
block += '=';
@@ -1829,8 +1868,8 @@ bool QConfFileSettingsPrivate::writeIniFile(QIODevice &device, const ParsedSetti
void QConfFileSettingsPrivate::ensureAllSectionsParsed(QConfFile *confFile) const
{
- UnparsedSettingsMap::const_iterator i = confFile->unparsedIniSections.constBegin();
- const UnparsedSettingsMap::const_iterator end = confFile->unparsedIniSections.constEnd();
+ auto i = confFile->unparsedIniSections.constBegin();
+ const auto end = confFile->unparsedIniSections.constEnd();
for (; i != end; ++i) {
if (!QConfFileSettingsPrivate::readIniSection(i.key(), i.value(), &confFile->originalKeys))
@@ -1847,7 +1886,7 @@ void QConfFileSettingsPrivate::ensureSectionParsed(QConfFile *confFile,
UnparsedSettingsMap::iterator i;
- int indexOfSlash = key.indexOf(QLatin1Char('/'));
+ qsizetype indexOfSlash = key.indexOf(u'/');
if (indexOfSlash != -1) {
i = confFile->unparsedIniSections.upperBound(key);
if (i == confFile->unparsedIniSections.begin())
@@ -2084,12 +2123,10 @@ void QConfFileSettingsPrivate::ensureSectionParsed(QConfFile *confFile,
\snippet settings/settings.cpp 15
- Note that type information is not preserved when reading settings from INI
- files; all values will be returned as QString.
-
- The \l{tools/settingseditor}{Settings Editor} example lets you
- experiment with different settings location and with fallbacks
- turned on or off.
+ Note that INI files lose the distinction between numeric data and the
+ strings used to encode them, so values written as numbers shall be read back
+ as QString. The numeric value can be recovered using \l QString::toInt(), \l
+ QString::toDouble() and related functions.
\section1 Restoring the State of a GUI Application
@@ -2116,9 +2153,6 @@ void QConfFileSettingsPrivate::ensureSectionParsed(QConfFile *confFile,
\codeline
\snippet settings/settings.cpp 21
- See the \l{mainwindows/application}{Application} example for a
- self-contained example that uses QSettings.
-
\section1 Accessing Settings from Multiple Threads or Processes Simultaneously
QSettings is \l{reentrant}. This means that you can use
@@ -2160,8 +2194,8 @@ void QConfFileSettingsPrivate::ensureSectionParsed(QConfFile *confFile,
following files are used by default:
\list 1
- \li \c{$HOME/.config/MySoft/Star Runner.conf} (Qt for Embedded Linux: \c{$HOME/Settings/MySoft/Star Runner.conf})
- \li \c{$HOME/.config/MySoft.conf} (Qt for Embedded Linux: \c{$HOME/Settings/MySoft.conf})
+ \li \c{$HOME/.config/MySoft/Star Runner.conf}
+ \li \c{$HOME/.config/MySoft.conf}
\li for each directory <dir> in $XDG_CONFIG_DIRS: \c{<dir>/MySoft/Star Runner.conf}
\li for each directory <dir> in $XDG_CONFIG_DIRS: \c{<dir>/MySoft.conf}
\endlist
@@ -2198,8 +2232,8 @@ void QConfFileSettingsPrivate::ensureSectionParsed(QConfFile *confFile,
used on Unix, \macos, and iOS:
\list 1
- \li \c{$HOME/.config/MySoft/Star Runner.ini} (Qt for Embedded Linux: \c{$HOME/Settings/MySoft/Star Runner.ini})
- \li \c{$HOME/.config/MySoft.ini} (Qt for Embedded Linux: \c{$HOME/Settings/MySoft.ini})
+ \li \c{$HOME/.config/MySoft/Star Runner.ini}
+ \li \c{$HOME/.config/MySoft.ini}
\li for each directory <dir> in $XDG_CONFIG_DIRS: \c{<dir>/MySoft/Star Runner.ini}
\li for each directory <dir> in $XDG_CONFIG_DIRS: \c{<dir>/MySoft.ini}
\endlist
@@ -2334,7 +2368,7 @@ void QConfFileSettingsPrivate::ensureSectionParsed(QConfFile *confFile,
\endlist
- \sa QVariant, QSessionManager, {Settings Editor Example}, {Qt Widgets - Application Example}
+ \sa QVariant, QSessionManager
*/
/*! \enum QSettings::Status
@@ -2368,9 +2402,20 @@ void QConfFileSettingsPrivate::ensureSectionParsed(QConfFile *confFile,
On 32-bit Windows or from a 64-bit application on 64-bit Windows,
this works the same as specifying NativeFormat.
This enum value was added in Qt 5.7.
- \value IniFormat Store the settings in INI files. Note that type information
- is not preserved when reading settings from INI files;
- all values will be returned as QString.
+ \value IniFormat Store the settings in INI files. Note that INI files
+ lose the distinction between numeric data and the
+ strings used to encode them, so values written as
+ numbers shall be read back as QString.
+ \value WebLocalStorageFormat
+ WASM only: Store the settings in window.localStorage for the current
+ origin. If cookies are not allowed, this falls back to the INI format.
+ This provides up to 5MiB storage per origin, but access to it is
+ synchronous and JSPI is not required.
+ \value WebIndexedDBFormat
+ WASM only: Store the settings in an Indexed DB for the current
+ origin. If cookies are not allowed, this falls back to the INI format.
+ This requires JSPI, but provides more storage than
+ WebLocalStorageFormat.
\value InvalidFormat Special value returned by registerFormat().
\omitvalue CustomFormat1
@@ -2428,16 +2473,19 @@ void QConfFileSettingsPrivate::ensureSectionParsed(QConfFile *confFile,
such as "General/someKey", the key will be located in the
"%General" section, \e not in the "General" section.
- \li In line with most implementations today, QSettings will
- assume the INI file is utf-8 encoded. This means that keys and values
+ \li In line with most implementations today, QSettings will assume that
+ \e values in the INI file are utf-8 encoded. This means that \e values
will be decoded as utf-8 encoded entries and written back as utf-8.
+ To retain backward compatibility with older Qt versions, \e keys in the
+ INI file are written in %-encoded format, but can be read in both
+ %-encoded and utf-8 formats.
\endlist
\section2 Compatibility with older Qt versions
Please note that this behavior is different to how QSettings behaved
- in versions of Qt prior to Qt 6. INI files written with Qt 5 or earlier aree
+ in versions of Qt prior to Qt 6. INI files written with Qt 5 or earlier are
however fully readable by a Qt 6 based application (unless a ini codec
different from utf8 had been set). But INI files written with Qt 6
will only be readable by older Qt versions if you set the "iniCodec" to
@@ -2686,10 +2734,11 @@ QSettings::~QSettings()
{
Q_D(QSettings);
if (d->pendingChanges) {
+ // Don't cause a failing flush() to std::terminate() the whole
+ // application - dtors are implicitly noexcept!
QT_TRY {
d->flush();
} QT_CATCH(...) {
- ; // ok. then don't flush but at least don't throw in the destructor
}
}
}
@@ -2881,9 +2930,12 @@ void QSettings::setAtomicSyncRequired(bool enable)
Call endGroup() to reset the current group to what it was before
the corresponding beginGroup() call. Groups can be nested.
+ \note In Qt versions prior to 6.4, this function took QString, not
+ QAnyStringView.
+
\sa endGroup(), group()
*/
-void QSettings::beginGroup(const QString &prefix)
+void QSettings::beginGroup(QAnyStringView prefix)
{
Q_D(QSettings);
d->beginGroupOrArray(QSettingsGroup(d->normalizedKey(prefix)));
@@ -2908,7 +2960,7 @@ void QSettings::endGroup()
}
QSettingsGroup group = d->groupStack.pop();
- int len = group.toString().size();
+ qsizetype len = group.toString().size();
if (len > 0)
d->groupPrefix.truncate(d->groupPrefix.size() - (len + 1));
@@ -2937,13 +2989,16 @@ QString QSettings::group() const
Use beginWriteArray() to write the array in the first place.
+ \note In Qt versions prior to 6.4, this function took QString, not
+ QAnyStringView.
+
\sa beginWriteArray(), endArray(), setArrayIndex()
*/
-int QSettings::beginReadArray(const QString &prefix)
+int QSettings::beginReadArray(QAnyStringView prefix)
{
Q_D(QSettings);
d->beginGroupOrArray(QSettingsGroup(d->normalizedKey(prefix), false));
- return value(QLatin1String("size")).toInt();
+ return value("size"_L1).toInt();
}
/*!
@@ -2973,17 +3028,20 @@ int QSettings::beginReadArray(const QString &prefix)
To read back an array, use beginReadArray().
+ \note In Qt versions prior to 6.4, this function took QString, not
+ QAnyStringView.
+
\sa beginReadArray(), endArray(), setArrayIndex()
*/
-void QSettings::beginWriteArray(const QString &prefix, int size)
+void QSettings::beginWriteArray(QAnyStringView prefix, int size)
{
Q_D(QSettings);
d->beginGroupOrArray(QSettingsGroup(d->normalizedKey(prefix), size < 0));
if (size < 0)
- remove(QLatin1String("size"));
+ remove("size"_L1);
else
- setValue(QLatin1String("size"), size);
+ setValue("size"_L1, size);
}
/*!
@@ -3001,13 +3059,13 @@ void QSettings::endArray()
}
QSettingsGroup group = d->groupStack.top();
- int len = group.toString().size();
+ qsizetype len = group.toString().size();
d->groupStack.pop();
if (len > 0)
d->groupPrefix.truncate(d->groupPrefix.size() - (len + 1));
if (group.arraySizeGuess() != -1)
- setValue(group.name() + QLatin1String("/size"), group.arraySizeGuess());
+ setValue(group.name() + "/size"_L1, group.arraySizeGuess());
if (!group.isArray())
qWarning("QSettings::endArray: Expected endGroup() instead");
@@ -3030,7 +3088,7 @@ void QSettings::setArrayIndex(int i)
}
QSettingsGroup &top = d->groupStack.top();
- int len = top.toString().size();
+ qsizetype len = top.toString().size();
top.setArrayIndex(qMax(i, 0));
d->groupPrefix.replace(d->groupPrefix.size() - len - 1, len, top.toString());
}
@@ -3136,9 +3194,12 @@ bool QSettings::isWritable() const
\snippet code/src_corelib_io_qsettings.cpp 23
+ \note In Qt versions prior to 6.4, this function took QString, not
+ QAnyStringView.
+
\sa value(), remove(), contains()
*/
-void QSettings::setValue(const QString &key, const QVariant &value)
+void QSettings::setValue(QAnyStringView key, const QVariant &value)
{
Q_D(QSettings);
if (key.isEmpty()) {
@@ -3170,9 +3231,12 @@ void QSettings::setValue(const QString &key, const QVariant &value)
case-sensitive keys. To avoid portability problems, see the
\l{Section and Key Syntax} rules.
+ \note In Qt versions prior to 6.4, this function took QString, not
+ QAnyStringView.
+
\sa setValue(), value(), contains()
*/
-void QSettings::remove(const QString &key)
+void QSettings::remove(QAnyStringView key)
{
Q_D(QSettings);
/*
@@ -3205,9 +3269,12 @@ void QSettings::remove(const QString &key)
case-sensitive keys. To avoid portability problems, see the
\l{Section and Key Syntax} rules.
+ \note In Qt versions prior to 6.4, this function took QString, not
+ QAnyStringView.
+
\sa value(), setValue()
*/
-bool QSettings::contains(const QString &key) const
+bool QSettings::contains(QAnyStringView key) const
{
Q_D(const QSettings);
return d->get(d->actualKey(key)) != std::nullopt;
@@ -3255,6 +3322,9 @@ bool QSettings::event(QEvent *event)
#endif
/*!
+ \fn QSettings::value(QAnyStringView key) const
+ \fn QSettings::value(QAnyStringView key, const QVariant &defaultValue) const
+
Returns the value for setting \a key. If the setting doesn't
exist, returns \a defaultValue.
@@ -3270,16 +3340,34 @@ bool QSettings::event(QEvent *event)
\snippet code/src_corelib_io_qsettings.cpp 26
+ \note In Qt versions prior to 6.4, this function took QString, not
+ QAnyStringView.
+
\sa setValue(), contains(), remove()
*/
-QVariant QSettings::value(const QString &key, const QVariant &defaultValue) const
+QVariant QSettings::value(QAnyStringView key) const
{
Q_D(const QSettings);
+ return d->value(key, nullptr);
+}
+
+QVariant QSettings::value(QAnyStringView key, const QVariant &defaultValue) const
+{
+ Q_D(const QSettings);
+ return d->value(key, &defaultValue);
+}
+
+QVariant QSettingsPrivate::value(QAnyStringView key, const QVariant *defaultValue) const
+{
if (key.isEmpty()) {
qWarning("QSettings::value: Empty key passed");
return QVariant();
}
- return d->get(d->actualKey(key)).value_or(defaultValue);
+ if (std::optional r = get(actualKey(key)))
+ return std::move(*r);
+ if (defaultValue)
+ return *defaultValue;
+ return QVariant();
}
/*!
@@ -3326,8 +3414,6 @@ QSettings::Format QSettings::defaultFormat()
\row \li SystemScope \li \c FOLDERID_ProgramData
\row \li{1,2} Unix \li{1,2} NativeFormat, IniFormat \li UserScope \li \c $HOME/.config
\row \li SystemScope \li \c /etc/xdg
- \row \li{1,2} Qt for Embedded Linux \li{1,2} NativeFormat, IniFormat \li UserScope \li \c $HOME/Settings
- \row \li SystemScope \li \c /etc/xdg
\row \li{1,2} \macos and iOS \li{1,2} IniFormat \li UserScope \li \c $HOME/.config
\row \li SystemScope \li \c /etc/xdg
\endtable
@@ -3433,18 +3519,18 @@ QSettings::Format QSettings::registerFormat(const QString &extension, ReadFunc r
const auto locker = qt_scoped_lock(settingsGlobalMutex);
CustomFormatVector *customFormatVector = customFormatVectorFunc();
- int index = customFormatVector->size();
+ qsizetype index = customFormatVector->size();
if (index == 16) // the QSettings::Format enum has room for 16 custom formats
return QSettings::InvalidFormat;
QConfFileCustomFormat info;
- info.extension = QLatin1Char('.') + extension;
+ info.extension = u'.' + extension;
info.readFunc = readFunc;
info.writeFunc = writeFunc;
info.caseSensitivity = caseSensitivity;
customFormatVector->append(info);
- return QSettings::Format((int)QSettings::CustomFormat1 + index);
+ return QSettings::Format(int(QSettings::CustomFormat1) + index);
}
QT_END_NAMESPACE
diff --git a/src/corelib/io/qsettings.h b/src/corelib/io/qsettings.h
index 05b30b562b..8bc73eb016 100644
--- a/src/corelib/io/qsettings.h
+++ b/src/corelib/io/qsettings.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QSETTINGS_H
#define QSETTINGS_H
@@ -82,12 +46,17 @@ public:
#endif
enum Format {
- NativeFormat,
- IniFormat,
+ NativeFormat = 0,
+ IniFormat = 1,
-#if defined(Q_OS_WIN) || defined(Q_CLANG_QDOC)
- Registry32Format,
- Registry64Format,
+#if defined(Q_OS_WIN) || defined(Q_QDOC)
+ Registry32Format = 2,
+ Registry64Format = 3,
+#endif
+
+#if defined(Q_OS_WASM) || defined(Q_QDOC)
+ WebLocalStorageFormat = 4,
+ WebIndexedDBFormat = 5,
#endif
InvalidFormat = 16,
@@ -148,12 +117,19 @@ public:
bool isAtomicSyncRequired() const;
void setAtomicSyncRequired(bool enable);
+#if QT_CORE_REMOVED_SINCE(6, 4)
void beginGroup(const QString &prefix);
+#endif
+ void beginGroup(QAnyStringView prefix);
void endGroup();
QString group() const;
+#if QT_CORE_REMOVED_SINCE(6, 4)
int beginReadArray(const QString &prefix);
void beginWriteArray(const QString &prefix, int size = -1);
+#endif
+ int beginReadArray(QAnyStringView prefix);
+ void beginWriteArray(QAnyStringView prefix, int size = -1);
void endArray();
void setArrayIndex(int i);
@@ -162,11 +138,21 @@ public:
QStringList childGroups() const;
bool isWritable() const;
+#if QT_CORE_REMOVED_SINCE(6, 4)
void setValue(const QString &key, const QVariant &value);
- QVariant value(const QString &key, const QVariant &defaultValue = QVariant()) const;
+ QVariant value(const QString &key, const QVariant &defaultValue) const;
+ QVariant value(const QString &key) const;
+#endif
+ void setValue(QAnyStringView key, const QVariant &value);
+ QVariant value(QAnyStringView key, const QVariant &defaultValue) const;
+ QVariant value(QAnyStringView key) const;
+#if QT_CORE_REMOVED_SINCE(6, 4)
void remove(const QString &key);
bool contains(const QString &key) const;
+#endif
+ void remove(QAnyStringView key);
+ bool contains(QAnyStringView key) const;
void setFallbacksEnabled(bool b);
bool fallbacksEnabled() const;
diff --git a/src/corelib/io/qsettings_mac.cpp b/src/corelib/io/qsettings_mac.cpp
index 59f0015b63..144ed59dc2 100644
--- a/src/corelib/io/qsettings_mac.cpp
+++ b/src/corelib/io/qsettings_mac.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qsettings.h"
@@ -50,6 +14,8 @@
QT_BEGIN_NAMESPACE
+using namespace Qt::StringLiterals;
+
static const CFStringRef hostNames[2] = { kCFPreferencesCurrentHost, kCFPreferencesAnyHost };
static const int numHostNames = 2;
@@ -291,18 +257,16 @@ static QString comify(const QString &organization)
{
for (int i = organization.size() - 1; i >= 0; --i) {
QChar ch = organization.at(i);
- if (ch == QLatin1Char('.') || ch == QChar(0x3002) || ch == QChar(0xff0e)
+ if (ch == u'.' || ch == QChar(0x3002) || ch == QChar(0xff0e)
|| ch == QChar(0xff61)) {
QString suffix = organization.mid(i + 1).toLower();
- if (suffix.size() == 2 || suffix == QLatin1String("com")
- || suffix == QLatin1String("org") || suffix == QLatin1String("net")
- || suffix == QLatin1String("edu") || suffix == QLatin1String("gov")
- || suffix == QLatin1String("mil") || suffix == QLatin1String("biz")
- || suffix == QLatin1String("info") || suffix == QLatin1String("name")
- || suffix == QLatin1String("pro") || suffix == QLatin1String("aero")
- || suffix == QLatin1String("coop") || suffix == QLatin1String("museum")) {
+ if (suffix.size() == 2 || suffix == "com"_L1 || suffix == "org"_L1
+ || suffix == "net"_L1 || suffix == "edu"_L1 || suffix == "gov"_L1
+ || suffix == "mil"_L1 || suffix == "biz"_L1 || suffix == "info"_L1
+ || suffix == "name"_L1 || suffix == "pro"_L1 || suffix == "aero"_L1
+ || suffix == "coop"_L1 || suffix == "museum"_L1) {
QString result = organization;
- result.replace(QLatin1Char('/'), QLatin1Char(' '));
+ result.replace(u'/', u' ');
return result;
}
break;
@@ -321,13 +285,13 @@ static QString comify(const QString &organization)
} else if (uc >= 'A' && uc <= 'Z') {
domain += ch.toLower();
} else {
- domain += QLatin1Char(' ');
+ domain += u' ';
}
}
domain = domain.simplified();
- domain.replace(QLatin1Char(' '), QLatin1Char('-'));
+ domain.replace(u' ', u'-');
if (!domain.isEmpty())
- domain.append(QLatin1String(".com"));
+ domain.append(".com"_L1);
return domain;
}
@@ -380,35 +344,34 @@ QMacSettingsPrivate::QMacSettingsPrivate(QSettings::Scope scope, const QString &
if (main_bundle_identifier != NULL) {
QString bundle_identifier(qtKey(main_bundle_identifier));
// CFBundleGetIdentifier returns identifier separated by slashes rather than periods.
- QStringList bundle_identifier_components = bundle_identifier.split(QLatin1Char('/'));
+ QStringList bundle_identifier_components = bundle_identifier.split(u'/');
// pre-reverse them so that when they get reversed again below, they are in the com.company.product format.
QStringList bundle_identifier_components_reversed;
for (int i=0; i<bundle_identifier_components.size(); ++i) {
const QString &bundle_identifier_component = bundle_identifier_components.at(i);
bundle_identifier_components_reversed.push_front(bundle_identifier_component);
}
- domainName = bundle_identifier_components_reversed.join(QLatin1Char('.'));
+ domainName = bundle_identifier_components_reversed.join(u'.');
}
}
}
// if no bundle identifier yet. use a hard coded string.
- if (domainName.isEmpty()) {
- domainName = QLatin1String("unknown-organization.trolltech.com");
- }
+ if (domainName.isEmpty())
+ domainName = "unknown-organization.trolltech.com"_L1;
- while ((nextDot = domainName.indexOf(QLatin1Char('.'), curPos)) != -1) {
+ while ((nextDot = domainName.indexOf(u'.', curPos)) != -1) {
javaPackageName.prepend(QStringView{domainName}.mid(curPos, nextDot - curPos));
- javaPackageName.prepend(QLatin1Char('.'));
+ javaPackageName.prepend(u'.');
curPos = nextDot + 1;
}
javaPackageName.prepend(QStringView{domainName}.mid(curPos));
javaPackageName = std::move(javaPackageName).toLower();
if (curPos == 0)
- javaPackageName.prepend(QLatin1String("com."));
+ javaPackageName.prepend("com."_L1);
suiteId = javaPackageName;
if (!application.isEmpty()) {
- javaPackageName += QLatin1Char('.') + application;
+ javaPackageName += u'.' + application;
applicationId = javaPackageName;
}
@@ -436,13 +399,13 @@ QMacSettingsPrivate::~QMacSettingsPrivate()
void QMacSettingsPrivate::remove(const QString &key)
{
- QStringList keys = children(key + QLatin1Char('/'), AllKeys);
+ QStringList keys = children(key + u'/', AllKeys);
// If i == -1, then delete "key" itself.
for (int i = -1; i < keys.size(); ++i) {
QString subKey = key;
if (i >= 0) {
- subKey += QLatin1Char('/');
+ subKey += u'/';
subKey += keys.at(i);
}
CFPreferencesSetValue(macKey(subKey), 0, domains[0].applicationOrSuiteId,
@@ -534,7 +497,7 @@ void QMacSettingsPrivate::flush()
bool QMacSettingsPrivate::isWritable() const
{
QMacSettingsPrivate *that = const_cast<QMacSettingsPrivate *>(this);
- QString impossibleKey(QLatin1String("qt_internal/"));
+ QString impossibleKey("qt_internal/"_L1);
QSettings::Status oldStatus = that->status;
that->status = QSettings::NoError;
@@ -554,9 +517,9 @@ QString QMacSettingsPrivate::fileName() const
QString result;
if (scope == QSettings::UserScope)
result = QDir::homePath();
- result += QLatin1String("/Library/Preferences/");
+ result += "/Library/Preferences/"_L1;
result += QString::fromCFString(domains[0].applicationOrSuiteId);
- result += QLatin1String(".plist");
+ result += ".plist"_L1;
return result;
}
@@ -566,7 +529,7 @@ QSettingsPrivate *QSettingsPrivate::create(QSettings::Format format,
const QString &application)
{
#ifndef QT_BOOTSTRAPPED
- if (organization == QLatin1String("Qt"))
+ if (organization == "Qt"_L1)
{
QString organizationDomain = QCoreApplication::organizationDomain();
QString applicationName = QCoreApplication::applicationName();
diff --git a/src/corelib/io/qsettings_p.h b/src/corelib/io/qsettings_p.h
index ddcbe0f76c..4229abd874 100644
--- a/src/corelib/io/qsettings_p.h
+++ b/src/corelib/io/qsettings_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QSETTINGS_P_H
#define QSETTINGS_P_H
@@ -80,11 +44,11 @@ static const Qt::CaseSensitivity IniCaseSensitivity = Qt::CaseSensitive;
class QSettingsKey : public QString
{
public:
- inline QSettingsKey(const QString &key, Qt::CaseSensitivity cs, int /* position */ = -1)
+ inline QSettingsKey(const QString &key, Qt::CaseSensitivity cs, qsizetype /* position */ = -1)
: QString(key) { Q_ASSERT(cs == Qt::CaseSensitive); Q_UNUSED(cs); }
inline QString originalCaseKey() const { return *this; }
- inline int originalKeyPosition() const { return -1; }
+ inline qsizetype originalKeyPosition() const { return -1; }
};
#else
static const Qt::CaseSensitivity IniCaseSensitivity = Qt::CaseInsensitive;
@@ -92,7 +56,7 @@ static const Qt::CaseSensitivity IniCaseSensitivity = Qt::CaseInsensitive;
class QSettingsKey : public QString
{
public:
- inline QSettingsKey(const QString &key, Qt::CaseSensitivity cs, int position = -1)
+ inline QSettingsKey(const QString &key, Qt::CaseSensitivity cs, qsizetype position = -1)
: QString(key), theOriginalKey(key), theOriginalKeyPosition(position)
{
if (cs == Qt::CaseInsensitive)
@@ -100,11 +64,11 @@ public:
}
inline QString originalCaseKey() const { return theOriginalKey; }
- inline int originalKeyPosition() const { return theOriginalKeyPosition; }
+ inline qsizetype originalKeyPosition() const { return theOriginalKeyPosition; }
private:
QString theOriginalKey;
- int theOriginalKeyPosition;
+ qsizetype theOriginalKeyPosition;
};
#endif
@@ -126,13 +90,13 @@ public:
inline QString name() const { return str; }
inline QString toString() const;
inline bool isArray() const { return num != -1; }
- inline int arraySizeGuess() const { return maxNum; }
- inline void setArrayIndex(int i)
+ inline qsizetype arraySizeGuess() const { return maxNum; }
+ inline void setArrayIndex(qsizetype i)
{ num = i + 1; if (maxNum != -1 && num > maxNum) maxNum = num; }
QString str;
- int num;
- int maxNum;
+ qsizetype num;
+ qsizetype maxNum;
};
Q_DECLARE_TYPEINFO(QSettingsGroup, Q_RELOCATABLE_TYPE);
@@ -141,13 +105,13 @@ inline QString QSettingsGroup::toString() const
QString result;
result = str;
if (num > 0) {
- result += QLatin1Char('/');
+ result += u'/';
result += QString::number(num);
}
return result;
}
-class Q_AUTOTEST_EXPORT QConfFile
+class QConfFile
{
public:
~QConfFile();
@@ -156,6 +120,7 @@ public:
bool isWritable() const;
static QConfFile *fromName(const QString &name, bool _userPerms);
+ Q_AUTOTEST_EXPORT
static void clearCache();
QString name;
@@ -208,13 +173,14 @@ public:
virtual bool isWritable() const = 0;
virtual QString fileName() const = 0;
- QString actualKey(const QString &key) const;
+ QVariant value(QAnyStringView key, const QVariant *defaultValue) const;
+ QString actualKey(QAnyStringView key) const;
void beginGroupOrArray(const QSettingsGroup &group);
void setStatus(QSettings::Status status) const;
void requestUpdate();
void update();
- static QString normalizedKey(const QString &key);
+ static QString normalizedKey(QAnyStringView key);
static QSettingsPrivate *create(QSettings::Format format, QSettings::Scope scope,
const QString &organization, const QString &application);
static QSettingsPrivate *create(const QString &fileName, QSettings::Format format);
@@ -229,12 +195,12 @@ public:
static QString variantToString(const QVariant &v);
static QVariant stringToVariant(const QString &s);
static void iniEscapedKey(const QString &key, QByteArray &result);
- static bool iniUnescapedKey(const QByteArray &key, int from, int to, QString &result);
+ static bool iniUnescapedKey(QByteArrayView key, QString &result);
static void iniEscapedString(const QString &str, QByteArray &result);
static void iniEscapedStringList(const QStringList &strs, QByteArray &result);
- static bool iniUnescapedStringList(const QByteArray &str, int from, int to,
- QString &stringResult, QStringList &stringListResult);
- static QStringList splitArgs(const QString &s, int idx);
+ static bool iniUnescapedStringList(QByteArrayView str, QString &stringResult,
+ QStringList &stringListResult);
+ static QStringList splitArgs(const QString &s, qsizetype idx);
QSettings::Format format;
QSettings::Scope scope;
@@ -250,10 +216,6 @@ protected:
mutable QSettings::Status status;
};
-#ifdef Q_OS_WASM
-class QWasmSettingsPrivate;
-#endif
-
class QConfFileSettingsPrivate : public QSettingsPrivate
{
public:
@@ -274,18 +236,22 @@ public:
bool isWritable() const override;
QString fileName() const override;
- bool readIniFile(const QByteArray &data, UnparsedSettingsMap *unparsedIniSections);
- static bool readIniSection(const QSettingsKey &section, const QByteArray &data,
+ bool readIniFile(QByteArrayView data, UnparsedSettingsMap *unparsedIniSections);
+ static bool readIniSection(const QSettingsKey &section, QByteArrayView data,
ParsedSettingsMap *settingsMap);
- static bool readIniLine(const QByteArray &data, int &dataPos, int &lineStart, int &lineLen,
- int &equalsPos);
+ static bool readIniLine(QByteArrayView data, qsizetype &dataPos,
+ qsizetype &lineStart, qsizetype &lineLen,
+ qsizetype &equalsPos);
+
+protected:
+ const QList<QConfFile *> &getConfFiles() const { return confFiles; }
private:
void initFormat();
virtual void initAccess();
void syncConfFile(QConfFile *confFile);
bool writeIniFile(QIODevice &device, const ParsedSettingsMap &map);
-#ifdef Q_OS_MAC
+#ifdef Q_OS_DARWIN
bool readPlistFile(const QByteArray &data, ParsedSettingsMap *map) const;
bool writePlistFile(QIODevice &file, const ParsedSettingsMap &map) const;
#endif
@@ -297,9 +263,9 @@ private:
QSettings::WriteFunc writeFunc;
QString extension;
Qt::CaseSensitivity caseSensitivity;
- int nextPosition;
+ qsizetype nextPosition;
#ifdef Q_OS_WASM
- friend class QWasmSettingsPrivate;
+ friend class QWasmIDBSettingsPrivate;
#endif
};
diff --git a/src/corelib/io/qsettings_wasm.cpp b/src/corelib/io/qsettings_wasm.cpp
index 9e016aa4f4..7d80ff82d3 100644
--- a/src/corelib/io/qsettings_wasm.cpp
+++ b/src/corelib/io/qsettings_wasm.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2019 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qsettings.h"
#ifndef QT_NO_SETTINGS
@@ -46,213 +10,393 @@
#include <QFile>
#endif // QT_NO_QOBJECT
#include <QDebug>
+#include <QtCore/private/qstdweb_p.h>
#include <QFileInfo>
#include <QDir>
+#include <QList>
+#include <QSet>
+
#include <emscripten.h>
+# include <emscripten/proxying.h>
+# include <emscripten/threading.h>
+# include <emscripten/val.h>
QT_BEGIN_NAMESPACE
-static bool isReadReady = false;
+using emscripten::val;
+using namespace Qt::StringLiterals;
-class QWasmSettingsPrivate : public QConfFileSettingsPrivate
+namespace {
+QStringView keyNameFromPrefixedStorageName(QStringView prefix, QStringView prefixedStorageName)
+{
+ // Return the key slice after m_keyPrefix, or an empty string view if no match
+ if (!prefixedStorageName.startsWith(prefix))
+ return QStringView();
+ return prefixedStorageName.sliced(prefix.length());
+}
+} // namespace
+
+//
+// Native settings implementation for WebAssembly using window.localStorage
+// as the storage backend. localStorage is a key-value store with a synchronous
+// API and a 5MB storage limit.
+//
+class QWasmLocalStorageSettingsPrivate final : public QSettingsPrivate
{
public:
- QWasmSettingsPrivate(QSettings::Scope scope, const QString &organization,
- const QString &application);
- ~QWasmSettingsPrivate();
-
- std::optional<QVariant> get(const QString &key) const override;
- QStringList children(const QString &prefix, ChildSpec spec) const override;
- void clear() override;
- void sync() override;
- void flush() override;
- bool isWritable() const override;
-
- void syncToLocal(const char *data, int size);
- void loadLocal(const QByteArray &filename);
- void setReady();
- void initAccess() override;
+ QWasmLocalStorageSettingsPrivate(QSettings::Scope scope, const QString &organization,
+ const QString &application);
+ ~QWasmLocalStorageSettingsPrivate() final = default;
+
+ void remove(const QString &key) final;
+ void set(const QString &key, const QVariant &value) final;
+ std::optional<QVariant> get(const QString &key) const final;
+ QStringList children(const QString &prefix, ChildSpec spec) const final;
+ void clear() final;
+ void sync() final;
+ void flush() final;
+ bool isWritable() const final;
+ QString fileName() const final;
private:
- QString databaseName;
- QString id;
+ QStringList m_keyPrefixes;
};
-static void QWasmSettingsPrivate_onLoad(void *userData, void *dataPtr, int size)
+QWasmLocalStorageSettingsPrivate::QWasmLocalStorageSettingsPrivate(QSettings::Scope scope,
+ const QString &organization,
+ const QString &application)
+ : QSettingsPrivate(QSettings::NativeFormat, scope, organization, application)
{
- QWasmSettingsPrivate *wasm = reinterpret_cast<QWasmSettingsPrivate *>(userData);
-
- QFile file(wasm->fileName());
- QFileInfo fileInfo(wasm->fileName());
- QDir dir(fileInfo.path());
- if (!dir.exists())
- dir.mkpath(fileInfo.path());
+ if (organization.isEmpty()) {
+ setStatus(QSettings::AccessError);
+ return;
+ }
- if (file.open(QFile::WriteOnly)) {
- file.write(reinterpret_cast<char *>(dataPtr), size);
- file.close();
- wasm->setReady();
+ // The key prefix contians "qt" to separate Qt keys from other keys on localStorage, a
+ // version tag to allow for making changes to the key format in the future, the org
+ // and app names.
+ //
+ // User code could could create separate settings object with different org and app names,
+ // and would expect them to have separate settings. Also, different webassembly instances
+ // on the page could write to the same window.localStorage. Add the org and app name
+ // to the key prefix to differentiate, even if that leads to keys with redundant sections
+ // for the common case of a single org and app name.
+ //
+ // Also, the common Qt mechanism for user/system scope and all-application settings are
+ // implemented, using different prefixes.
+ const QString allAppsSetting = QStringLiteral("all-apps");
+ const QString systemSetting = QStringLiteral("sys-tem");
+
+ const QLatin1String separator("-");
+ const QLatin1String doubleSeparator("--");
+ const QString escapedOrganization = QString(organization).replace(separator, doubleSeparator);
+ const QString escapedApplication = QString(application).replace(separator, doubleSeparator);
+ const QString prefix = "qt-v0-" + escapedOrganization + separator;
+ if (scope == QSettings::Scope::UserScope) {
+ if (!escapedApplication.isEmpty())
+ m_keyPrefixes.push_back(prefix + escapedApplication + separator);
+ m_keyPrefixes.push_back(prefix + allAppsSetting + separator);
+ }
+ if (!escapedApplication.isEmpty()) {
+ m_keyPrefixes.push_back(prefix + escapedApplication + separator + systemSetting
+ + separator);
}
+ m_keyPrefixes.push_back(prefix + allAppsSetting + separator + systemSetting + separator);
}
-static void QWasmSettingsPrivate_onError(void *userData)
+void QWasmLocalStorageSettingsPrivate::remove(const QString &key)
{
- QWasmSettingsPrivate *wasm = reinterpret_cast<QWasmSettingsPrivate *>(userData);
- if (wasm)
- wasm->setStatus(QSettings::AccessError);
+ const std::string removed = QString(m_keyPrefixes.first() + key).toStdString();
+
+ qstdweb::runTaskOnMainThread<void>([this, &removed, &key]() {
+ std::vector<std::string> children = { removed };
+ const int length = val::global("window")["localStorage"]["length"].as<int>();
+ for (int i = 0; i < length; ++i) {
+ const QString storedKeyWithPrefix = QString::fromStdString(
+ val::global("window")["localStorage"].call<val>("key", i).as<std::string>());
+
+ const QStringView storedKey = keyNameFromPrefixedStorageName(
+ m_keyPrefixes.first(), QStringView(storedKeyWithPrefix));
+ if (storedKey.isEmpty() || !storedKey.startsWith(key))
+ continue;
+
+ children.push_back(storedKeyWithPrefix.toStdString());
+ }
+
+ for (const auto &child : children)
+ val::global("window")["localStorage"].call<val>("removeItem", child);
+ });
}
-static void QWasmSettingsPrivate_onStore(void *userData)
+void QWasmLocalStorageSettingsPrivate::set(const QString &key, const QVariant &value)
{
- QWasmSettingsPrivate *wasm = reinterpret_cast<QWasmSettingsPrivate *>(userData);
- if (wasm)
- wasm->setStatus(QSettings::NoError);
+ qstdweb::runTaskOnMainThread<void>([this, &key, &value]() {
+ const std::string keyString = QString(m_keyPrefixes.first() + key).toStdString();
+ const std::string valueString = QSettingsPrivate::variantToString(value).toStdString();
+ val::global("window")["localStorage"].call<void>("setItem", keyString, valueString);
+ });
}
-static void QWasmSettingsPrivate_onCheck(void *userData, int exists)
+std::optional<QVariant> QWasmLocalStorageSettingsPrivate::get(const QString &key) const
{
- QWasmSettingsPrivate *wasm = reinterpret_cast<QWasmSettingsPrivate *>(userData);
- if (wasm) {
- if (exists)
- wasm->loadLocal(wasm->fileName().toLocal8Bit());
- else
- wasm->setReady();
- }
+ return qstdweb::runTaskOnMainThread<std::optional<QVariant>>(
+ [this, &key]() -> std::optional<QVariant> {
+ for (const auto &prefix : m_keyPrefixes) {
+ const std::string keyString = QString(prefix + key).toStdString();
+ const emscripten::val value =
+ val::global("window")["localStorage"].call<val>("getItem", keyString);
+ if (!value.isNull()) {
+ return QSettingsPrivate::stringToVariant(
+ QString::fromStdString(value.as<std::string>()));
+ }
+ if (!fallbacks) {
+ return std::nullopt;
+ }
+ }
+ return std::nullopt;
+ });
}
-QSettingsPrivate *QSettingsPrivate::create(QSettings::Format format,
- QSettings::Scope scope,
- const QString &organization,
- const QString &application)
+QStringList QWasmLocalStorageSettingsPrivate::children(const QString &prefix, ChildSpec spec) const
{
- Q_UNUSED(format);
- if (organization == QLatin1String("Qt"))
- {
- QString organizationDomain = QCoreApplication::organizationDomain();
- QString applicationName = QCoreApplication::applicationName();
+ return qstdweb::runTaskOnMainThread<QStringList>([this, &prefix, &spec]() -> QStringList {
+ QSet<QString> nodes;
+ // Loop through all keys on window.localStorage, return Qt keys belonging to
+ // this application, with the correct prefix, and according to ChildSpec.
+ QStringList children;
+ const int length = val::global("window")["localStorage"]["length"].as<int>();
+ for (int i = 0; i < length; ++i) {
+ for (const auto &storagePrefix : m_keyPrefixes) {
+ const QString keyString =
+ QString::fromStdString(val::global("window")["localStorage"]
+ .call<val>("key", i)
+ .as<std::string>());
+
+ const QStringView key =
+ keyNameFromPrefixedStorageName(storagePrefix, QStringView(keyString));
+ if (!key.isEmpty() && key.startsWith(prefix)) {
+ QStringList children;
+ QSettingsPrivate::processChild(key.sliced(prefix.length()), spec, children);
+ if (!children.isEmpty())
+ nodes.insert(children.first());
+ }
+ if (!fallbacks)
+ break;
+ }
+ }
+
+ return QStringList(nodes.begin(), nodes.end());
+ });
+}
- QSettingsPrivate *newSettings;
- newSettings = new QWasmSettingsPrivate(scope, organizationDomain, applicationName);
+void QWasmLocalStorageSettingsPrivate::clear()
+{
+ qstdweb::runTaskOnMainThread<void>([this]() {
+ // Get all Qt keys from window.localStorage
+ const int length = val::global("window")["localStorage"]["length"].as<int>();
+ QStringList keys;
+ keys.reserve(length);
+ for (int i = 0; i < length; ++i)
+ keys.append(QString::fromStdString(
+ (val::global("window")["localStorage"].call<val>("key", i).as<std::string>())));
+
+ // Remove all Qt keys. Note that localStorage does not guarantee a stable
+ // iteration order when the storage is mutated, which is why removal is done
+ // in a second step after getting all keys.
+ for (const QString &key : keys) {
+ if (!keyNameFromPrefixedStorageName(m_keyPrefixes.first(), key).isEmpty())
+ val::global("window")["localStorage"].call<val>("removeItem", key.toStdString());
+ }
+ });
+}
- newSettings->beginGroupOrArray(QSettingsGroup(normalizedKey(organization)));
- if (!application.isEmpty())
- newSettings->beginGroupOrArray(QSettingsGroup(normalizedKey(application)));
+void QWasmLocalStorageSettingsPrivate::sync() { }
- return newSettings;
- }
- return new QWasmSettingsPrivate(scope, organization, application);
-}
+void QWasmLocalStorageSettingsPrivate::flush() { }
-QWasmSettingsPrivate::QWasmSettingsPrivate(QSettings::Scope scope, const QString &organization,
- const QString &application)
- : QConfFileSettingsPrivate(QSettings::NativeFormat, scope, organization, application)
+bool QWasmLocalStorageSettingsPrivate::isWritable() const
{
- setStatus(QSettings::AccessError); // access error until sandbox gets loaded
- databaseName = organization;
- id = application;
-
- emscripten_idb_async_exists("/home/web_user",
- fileName().toLocal8Bit(),
- reinterpret_cast<void*>(this),
- QWasmSettingsPrivate_onCheck,
- QWasmSettingsPrivate_onError);
+ return true;
}
-QWasmSettingsPrivate::~QWasmSettingsPrivate()
+QString QWasmLocalStorageSettingsPrivate::fileName() const
{
+ return QString();
}
- void QWasmSettingsPrivate::initAccess()
+//
+// Native settings implementation for WebAssembly using the indexed database as
+// the storage backend
+//
+class QWasmIDBSettingsPrivate : public QConfFileSettingsPrivate
{
- if (isReadReady)
- QConfFileSettingsPrivate::initAccess();
-}
+public:
+ QWasmIDBSettingsPrivate(QSettings::Scope scope, const QString &organization,
+ const QString &application);
+ ~QWasmIDBSettingsPrivate();
+
+ void clear() override;
+ void sync() override;
+
+private:
+ bool writeSettingsToTemporaryFile(const QString &fileName, void *dataPtr, int size);
+ void loadIndexedDBFiles();
+
+
+ QString databaseName;
+ QString id;
+};
-std::optional<QVariant> QWasmSettingsPrivate::get(const QString &key) const
+constexpr char DbName[] = "/home/web_user";
+
+QWasmIDBSettingsPrivate::QWasmIDBSettingsPrivate(QSettings::Scope scope,
+ const QString &organization,
+ const QString &application)
+ : QConfFileSettingsPrivate(QSettings::WebIndexedDBFormat, scope, organization, application)
{
- if (isReadReady)
- return QConfFileSettingsPrivate::get(key);
+ Q_ASSERT_X(qstdweb::haveJspi(), Q_FUNC_INFO, "QWasmIDBSettingsPrivate needs JSPI to work");
+
+ if (organization.isEmpty()) {
+ setStatus(QSettings::AccessError);
+ return;
+ }
+
+ databaseName = organization;
+ id = application;
- return std::nullopt;
+ loadIndexedDBFiles();
+
+ QConfFileSettingsPrivate::initAccess();
}
-QStringList QWasmSettingsPrivate::children(const QString &prefix, ChildSpec spec) const
+QWasmIDBSettingsPrivate::~QWasmIDBSettingsPrivate() = default;
+
+bool QWasmIDBSettingsPrivate::writeSettingsToTemporaryFile(const QString &fileName, void *dataPtr,
+ int size)
{
- return QConfFileSettingsPrivate::children(prefix, spec);
+ QFile file(fileName);
+ QFileInfo fileInfo(fileName);
+ QDir dir(fileInfo.path());
+ if (!dir.exists())
+ dir.mkpath(fileInfo.path());
+
+ if (!file.open(QFile::WriteOnly))
+ return false;
+
+ return size == file.write(reinterpret_cast<char *>(dataPtr), size);
}
-void QWasmSettingsPrivate::clear()
+void QWasmIDBSettingsPrivate::clear()
{
QConfFileSettingsPrivate::clear();
- emscripten_idb_async_delete("/home/web_user",
- fileName().toLocal8Bit(),
- reinterpret_cast<void*>(this),
- QWasmSettingsPrivate_onStore,
- QWasmSettingsPrivate_onError);
+
+ int error = 0;
+ emscripten_idb_delete(DbName, fileName().toLocal8Bit(), &error);
+ setStatus(!!error ? QSettings::AccessError : QSettings::NoError);
}
-void QWasmSettingsPrivate::sync()
+void QWasmIDBSettingsPrivate::sync()
{
+ // Reload the files, in case there were any changes in IndexedDB, and flush them to disk.
+ // Thanks to this, QConfFileSettingsPrivate::sync will handle key merging correctly.
+ loadIndexedDBFiles();
+
QConfFileSettingsPrivate::sync();
QFile file(fileName());
if (file.open(QFile::ReadOnly)) {
QByteArray dataPointer = file.readAll();
- emscripten_idb_async_store("/home/web_user",
- fileName().toLocal8Bit(),
- reinterpret_cast<void *>(dataPointer.data()),
- dataPointer.length(),
- reinterpret_cast<void*>(this),
- QWasmSettingsPrivate_onStore,
- QWasmSettingsPrivate_onError);
+ int error = 0;
+ emscripten_idb_store(DbName, fileName().toLocal8Bit(),
+ reinterpret_cast<void *>(dataPointer.data()), dataPointer.length(),
+ &error);
+ setStatus(!!error ? QSettings::AccessError : QSettings::NoError);
}
}
-void QWasmSettingsPrivate::flush()
-{
- sync();
-}
-
-bool QWasmSettingsPrivate::isWritable() const
-{
- return isReadReady && QConfFileSettingsPrivate::isWritable();
-}
-
-void QWasmSettingsPrivate::syncToLocal(const char *data, int size)
+void QWasmIDBSettingsPrivate::loadIndexedDBFiles()
{
- QFile file(fileName());
-
- if (file.open(QFile::WriteOnly)) {
- file.write(data, size + 1);
- QByteArray data = file.readAll();
-
- emscripten_idb_async_store("/home/web_user",
- fileName().toLocal8Bit(),
- reinterpret_cast<void *>(data.data()),
- data.length(),
- reinterpret_cast<void*>(this),
- QWasmSettingsPrivate_onStore,
- QWasmSettingsPrivate_onError);
- setReady();
+ for (const auto *confFile : getConfFiles()) {
+ int exists = 0;
+ int error = 0;
+ emscripten_idb_exists(DbName, confFile->name.toLocal8Bit(), &exists, &error);
+ if (error) {
+ setStatus(QSettings::AccessError);
+ return;
+ }
+ if (exists) {
+ void *contents;
+ int size;
+ emscripten_idb_load(DbName, confFile->name.toLocal8Bit(), &contents, &size, &error);
+ if (error || !writeSettingsToTemporaryFile(confFile->name, contents, size)) {
+ setStatus(QSettings::AccessError);
+ return;
+ }
+ }
}
}
-void QWasmSettingsPrivate::loadLocal(const QByteArray &filename)
+QSettingsPrivate *QSettingsPrivate::create(QSettings::Format format, QSettings::Scope scope,
+ const QString &organization, const QString &application)
{
- emscripten_idb_async_load("/home/web_user",
- filename.data(),
- reinterpret_cast<void*>(this),
- QWasmSettingsPrivate_onLoad,
- QWasmSettingsPrivate_onError);
-}
+ // Make WebLocalStorageFormat the default native format
+ if (format == QSettings::NativeFormat)
+ format = QSettings::WebLocalStorageFormat;
+
+ // Check if cookies are enabled (required for using persistent storage)
+
+ const bool cookiesEnabled = qstdweb::runTaskOnMainThread<bool>(
+ []() { return val::global("navigator")["cookieEnabled"].as<bool>(); });
+
+ constexpr QLatin1StringView cookiesWarningMessage(
+ "QSettings::%1 requires cookies, falling back to IniFormat with temporary file");
+ if (!cookiesEnabled) {
+ if (format == QSettings::WebLocalStorageFormat) {
+ qWarning() << cookiesWarningMessage.arg("WebLocalStorageFormat");
+ format = QSettings::IniFormat;
+ } else if (format == QSettings::WebIndexedDBFormat) {
+ qWarning() << cookiesWarningMessage.arg("WebIndexedDBFormat");
+ format = QSettings::IniFormat;
+ }
+ }
+ if (format == QSettings::WebIndexedDBFormat && !qstdweb::haveJspi()) {
+ qWarning() << "QSettings::WebIndexedDBFormat requires JSPI, falling back to IniFormat with "
+ "temporary file";
+ format = QSettings::IniFormat;
+ }
-void QWasmSettingsPrivate::setReady()
-{
- isReadReady = true;
- setStatus(QSettings::NoError);
- QConfFileSettingsPrivate::initAccess();
+ // Create settings backend according to selected format
+ switch (format) {
+ case QSettings::Format::WebLocalStorageFormat:
+ return new QWasmLocalStorageSettingsPrivate(scope, organization, application);
+ case QSettings::Format::WebIndexedDBFormat:
+ return new QWasmIDBSettingsPrivate(scope, organization, application);
+ case QSettings::Format::IniFormat:
+ case QSettings::Format::CustomFormat1:
+ case QSettings::Format::CustomFormat2:
+ case QSettings::Format::CustomFormat3:
+ case QSettings::Format::CustomFormat4:
+ case QSettings::Format::CustomFormat5:
+ case QSettings::Format::CustomFormat6:
+ case QSettings::Format::CustomFormat7:
+ case QSettings::Format::CustomFormat8:
+ case QSettings::Format::CustomFormat9:
+ case QSettings::Format::CustomFormat10:
+ case QSettings::Format::CustomFormat11:
+ case QSettings::Format::CustomFormat12:
+ case QSettings::Format::CustomFormat13:
+ case QSettings::Format::CustomFormat14:
+ case QSettings::Format::CustomFormat15:
+ case QSettings::Format::CustomFormat16:
+ return new QConfFileSettingsPrivate(format, scope, organization, application);
+ case QSettings::Format::InvalidFormat:
+ return nullptr;
+ case QSettings::Format::NativeFormat:
+ Q_UNREACHABLE();
+ break;
+ }
}
QT_END_NAMESPACE
diff --git a/src/corelib/io/qsettings_win.cpp b/src/corelib/io/qsettings_win.cpp
index caa8c84f24..e88d738fe4 100644
--- a/src/corelib/io/qsettings_win.cpp
+++ b/src/corelib/io/qsettings_win.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qsettings.h"
@@ -60,6 +24,8 @@
QT_BEGIN_NAMESPACE
+using namespace Qt::StringLiterals;
+
/* Keys are stored in QStrings. If the variable name starts with 'u', this is a "user"
key, ie. "foo/bar/alpha/beta". If the variable name starts with 'r', this is a "registry"
key, ie. "\foo\bar\alpha\beta". */
@@ -76,7 +42,7 @@ static const REGSAM registryPermissions = KEY_READ | KEY_WRITE;
static QString keyPath(const QString &rKey)
{
- int idx = rKey.lastIndexOf(QLatin1Char('\\'));
+ int idx = rKey.lastIndexOf(u'\\');
if (idx == -1)
return QString();
return rKey.left(idx + 1);
@@ -84,7 +50,7 @@ static QString keyPath(const QString &rKey)
static QString keyName(const QString &rKey)
{
- int idx = rKey.lastIndexOf(QLatin1Char('\\'));
+ int idx = rKey.lastIndexOf(u'\\');
QString res;
if (idx == -1)
@@ -92,8 +58,8 @@ static QString keyName(const QString &rKey)
else
res = rKey.mid(idx + 1);
- if (res == QLatin1String("Default") || res == QLatin1String("."))
- res = QLatin1String("");
+ if (res == "Default"_L1 || res == "."_L1)
+ res = ""_L1;
return res;
}
@@ -248,7 +214,7 @@ static QStringList childKeysOrGroups(HKEY parentHandle, QSettingsPrivate::ChildS
continue;
}
if (item.isEmpty())
- item = QLatin1String(".");
+ item = "."_L1;
result.append(item);
}
return result;
@@ -267,7 +233,7 @@ static void allKeys(HKEY parentHandle, const QString &rSubKey, NameSet *result,
for (int i = 0; i < childKeys.size(); ++i) {
QString s = rSubKey;
if (!s.isEmpty())
- s += QLatin1Char('\\');
+ s += u'\\';
s += childKeys.at(i);
result->insert(s, QString());
}
@@ -275,7 +241,7 @@ static void allKeys(HKEY parentHandle, const QString &rSubKey, NameSet *result,
for (int i = 0; i < childGroups.size(); ++i) {
QString s = rSubKey;
if (!s.isEmpty())
- s += QLatin1Char('\\');
+ s += u'\\';
s += childGroups.at(i);
allKeys(parentHandle, s, result, access);
}
@@ -411,9 +377,9 @@ QWinSettingsPrivate::QWinSettingsPrivate(QSettings::Scope scope, const QString &
deleteWriteHandleOnExit = false;
if (!organization.isEmpty()) {
- QString prefix = QLatin1String("Software\\") + organization;
- QString orgPrefix = prefix + QLatin1String("\\OrganizationDefaults");
- QString appPrefix = prefix + QLatin1Char('\\') + application;
+ QString prefix = "Software\\"_L1 + organization;
+ QString orgPrefix = prefix + "\\OrganizationDefaults"_L1;
+ QString appPrefix = prefix + u'\\' + application;
if (scope == QSettings::UserScope) {
if (!application.isEmpty())
@@ -438,34 +404,34 @@ QWinSettingsPrivate::QWinSettingsPrivate(QString rPath, REGSAM access)
{
deleteWriteHandleOnExit = false;
- if (rPath.startsWith(QLatin1Char('\\')))
+ if (rPath.startsWith(u'\\'))
rPath.remove(0, 1);
int keyLength;
HKEY keyName;
- if (rPath.startsWith(QLatin1String("HKEY_CURRENT_USER"))) {
+ if (rPath.startsWith("HKEY_CURRENT_USER"_L1)) {
keyLength = 17;
keyName = HKEY_CURRENT_USER;
- } else if (rPath.startsWith(QLatin1String("HKCU"))) {
+ } else if (rPath.startsWith("HKCU"_L1)) {
keyLength = 4;
keyName = HKEY_CURRENT_USER;
- } else if (rPath.startsWith(QLatin1String("HKEY_LOCAL_MACHINE"))) {
+ } else if (rPath.startsWith("HKEY_LOCAL_MACHINE"_L1)) {
keyLength = 18;
keyName = HKEY_LOCAL_MACHINE;
- } else if (rPath.startsWith(QLatin1String("HKLM"))) {
+ } else if (rPath.startsWith("HKLM"_L1)) {
keyLength = 4;
keyName = HKEY_LOCAL_MACHINE;
- } else if (rPath.startsWith(QLatin1String("HKEY_CLASSES_ROOT"))) {
+ } else if (rPath.startsWith("HKEY_CLASSES_ROOT"_L1)) {
keyLength = 17;
keyName = HKEY_CLASSES_ROOT;
- } else if (rPath.startsWith(QLatin1String("HKCR"))) {
+ } else if (rPath.startsWith("HKCR"_L1)) {
keyLength = 4;
keyName = HKEY_CLASSES_ROOT;
- } else if (rPath.startsWith(QLatin1String("HKEY_USERS"))) {
+ } else if (rPath.startsWith("HKEY_USERS"_L1)) {
keyLength = 10;
keyName = HKEY_USERS;
- } else if (rPath.startsWith(QLatin1String("HKU"))) {
+ } else if (rPath.startsWith("HKU"_L1)) {
keyLength = 3;
keyName = HKEY_USERS;
} else {
@@ -474,7 +440,7 @@ QWinSettingsPrivate::QWinSettingsPrivate(QString rPath, REGSAM access)
if (rPath.length() == keyLength)
regList.append(RegistryKey(keyName, QString(), false, access));
- else if (rPath[keyLength] == QLatin1Char('\\'))
+ else if (rPath[keyLength] == u'\\')
regList.append(RegistryKey(keyName, rPath.mid(keyLength+1), false, access));
}
@@ -672,8 +638,8 @@ void QWinSettingsPrivate::set(const QString &uKey, const QVariant &value)
}
if (type == REG_BINARY) {
- QString s = variantToString(value);
- regValueBuff = QByteArray(reinterpret_cast<const char*>(s.utf16()), s.length() * 2);
+ const QString s = variantToString(value);
+ regValueBuff = QByteArray(reinterpret_cast<const char *>(s.data()), s.length() * 2);
} else {
QStringList::const_iterator it = l.constBegin();
for (; it != l.constEnd(); ++it) {
@@ -759,15 +725,21 @@ QStringList QWinSettingsPrivate::children(const QString &uKey, ChildSpec spec) c
for (const RegistryKey &r : regList) {
HKEY parent_handle = r.handle();
- if (parent_handle == 0)
- continue;
+ if (parent_handle == 0) {
+ if (fallbacks)
+ continue;
+ break;
+ }
HKEY handle = openKey(parent_handle, KEY_READ, rKey, access);
- if (handle == 0)
- continue;
+ if (handle == 0) {
+ if (fallbacks)
+ continue;
+ break;
+ }
if (spec == AllKeys) {
NameSet keys;
- allKeys(handle, QLatin1String(""), &keys, access);
+ allKeys(handle, ""_L1, &keys, access);
mergeKeySets(&result, keys);
} else { // ChildGroups or ChildKeys
QStringList names = childKeysOrGroups(handle, spec);
@@ -807,9 +779,9 @@ QString QWinSettingsPrivate::fileName() const
const RegistryKey &key = regList.at(0);
QString result;
if (key.parentHandle() == HKEY_CURRENT_USER)
- result = QLatin1String("\\HKEY_CURRENT_USER\\");
+ result = "\\HKEY_CURRENT_USER\\"_L1;
else
- result = QLatin1String("\\HKEY_LOCAL_MACHINE\\");
+ result = "\\HKEY_LOCAL_MACHINE\\"_L1;
return result + regList.at(0).key();
}
diff --git a/src/corelib/io/qstandardpaths.cpp b/src/corelib/io/qstandardpaths.cpp
index de14b44454..792721f50d 100644
--- a/src/corelib/io/qstandardpaths.cpp
+++ b/src/corelib/io/qstandardpaths.cpp
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// Copyright (C) 2016 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qstandardpaths.h"
@@ -60,6 +24,7 @@
QT_BEGIN_NAMESPACE
+using namespace Qt::StringLiterals;
/*!
\class QStandardPaths
\inmodule QtCore
@@ -153,6 +118,20 @@ QT_BEGIN_NAMESPACE
configuration files should be written. This is an application-specific directory,
and the returned path is never empty.
This enum value was added in Qt 5.5.
+ \value PublicShareLocation Returns a directory location where user-specific publicly shared files
+ and directories can be stored. This is a generic value. Note that the returned path may be
+ empty if the system has no concept of a publicly shared location.
+ This enum value was added in Qt 6.4.
+ \value TemplatesLocation Returns a directory location where user-specific
+ template files can be stored. This is a generic value. Note that the returned path may be
+ empty if the system has no concept of a templates location.
+ This enum value was added in Qt 6.4.
+ \value [since 6.7] StateLocation Returns a directory location where user-specific application
+ state data files should be written. This is an application-specific directory,
+ and the returned path is never empty.
+ \value [since 6.7] GenericStateLocation Returns a directory location where shared state data files
+ across applications should be written. This value might be generic or application-specific,
+ but the returned path is never empty.
The following table gives examples of paths on different operating systems.
The first path is the writable path (unless noted). Other, additional
@@ -193,6 +172,9 @@ QT_BEGIN_NAMESPACE
\row \li CacheLocation
\li "~/Library/Caches/<APPNAME>", "/Library/Caches/<APPNAME>"
\li "C:/Users/<USER>/AppData/Local/<APPNAME>/cache"
+ \row \li StateLocation
+ \li "~/Library/Preferences/<APPNAME>/State"
+ \li "C:/Users/<USER>/AppData/Local/<APPNAME>/State", "C:/ProgramData/<APPNAME>/State"
\row \li GenericDataLocation
\li "~/Library/Application Support", "/Library/Application Support"
\li "C:/Users/<USER>/AppData/Local", "C:/ProgramData", "<APPDIR>", "<APPDIR>/data"
@@ -207,20 +189,29 @@ QT_BEGIN_NAMESPACE
\li "C:/Users/<USER>/AppData/Local", "C:/ProgramData"
\row \li DownloadLocation
\li "~/Downloads"
- \li "C:/Users/<USER>/Documents"
+ \li "C:/Users/<USER>/Downloads"
\row \li GenericCacheLocation
\li "~/Library/Caches", "/Library/Caches"
\li "C:/Users/<USER>/AppData/Local/cache"
+ \row \li GenericStateLocation
+ \li "~/Library/Preferences/State"
+ \li "C:/Users/<USER>/AppData/Local/State", "C:/ProgramData/State"
\row \li AppDataLocation
\li "~/Library/Application Support/<APPNAME>", "/Library/Application Support/<APPNAME>". "<APPDIR>/../Resources"
\li "C:/Users/<USER>/AppData/Roaming/<APPNAME>", "C:/ProgramData/<APPNAME>", "<APPDIR>", "<APPDIR>/data", "<APPDIR>/data/<APPNAME>"
\row \li AppConfigLocation
\li "~/Library/Preferences/<APPNAME>"
\li "C:/Users/<USER>/AppData/Local/<APPNAME>", "C:/ProgramData/<APPNAME>"
+ \row \li PublicShareLocation
+ \li "~/Public"
+ \li "C:/Users/Public"
+ \row \li TemplatesLocation
+ \li "~/Templates"
+ \li "C:/Users/<USER>/AppData/Roaming/Microsoft/Windows/Templates"
\endtable
\table
- \header \li Path type \li Linux
+ \header \li Path type \li Linux and other UNIX operating systems
\row \li DesktopLocation
\li "~/Desktop"
\row \li DocumentsLocation
@@ -243,6 +234,8 @@ QT_BEGIN_NAMESPACE
\li "~/.local/share/<APPNAME>", "/usr/local/share/<APPNAME>", "/usr/share/<APPNAME>"
\row \li CacheLocation
\li "~/.cache/<APPNAME>"
+ \row \li StateLocation
+ \li "~/.local/state/<APPNAME>"
\row \li GenericDataLocation
\li "~/.local/share", "/usr/local/share", "/usr/share"
\row \li RuntimeLocation
@@ -255,10 +248,16 @@ QT_BEGIN_NAMESPACE
\li "~/Downloads"
\row \li GenericCacheLocation
\li "~/.cache"
+ \row \li GenericStateLocation
+ \li "~/.local/state"
\row \li AppDataLocation
\li "~/.local/share/<APPNAME>", "/usr/local/share/<APPNAME>", "/usr/share/<APPNAME>"
\row \li AppConfigLocation
\li "~/.config/<APPNAME>", "/etc/xdg/<APPNAME>"
+ \row \li PublicShareLocation
+ \li "~/Public"
+ \row \li TemplatesLocation
+ \li "~/Templates"
\endtable
\table
@@ -267,7 +266,7 @@ QT_BEGIN_NAMESPACE
\li "<APPROOT>/files"
\li "<APPROOT>/Documents/Desktop"
\row \li DocumentsLocation
- \li "<USER>/Documents", "<USER>/<APPNAME>/Documents"
+ \li "<USER>/Documents" [*], "<USER>/<APPNAME>/Documents"
\li "<APPROOT>/Documents"
\row \li FontsLocation
\li "/system/fonts" (not writable)
@@ -276,13 +275,13 @@ QT_BEGIN_NAMESPACE
\li not supported (directory not readable)
\li not supported
\row \li MusicLocation
- \li "<USER>/Music", "<USER>/<APPNAME>/Music"
+ \li "<USER>/Music" [*], "<USER>/<APPNAME>/Music"
\li "<APPROOT>/Documents/Music"
\row \li MoviesLocation
- \li "<USER>/Movies", "<USER>/<APPNAME>/Movies"
+ \li "<USER>/Movies" [*], "<USER>/<APPNAME>/Movies"
\li "<APPROOT>/Documents/Movies"
\row \li PicturesLocation
- \li "<USER>/Pictures", "<USER>/<APPNAME>/Pictures"
+ \li "<USER>/Pictures" [*], "<USER>/<APPNAME>/Pictures"
\li "<APPROOT>/Documents/Pictures", "assets-library://"
\row \li TempLocation
\li "<APPROOT>/cache"
@@ -296,9 +295,13 @@ QT_BEGIN_NAMESPACE
\row \li CacheLocation
\li "<APPROOT>/cache", "<USER>/<APPNAME>/cache"
\li "<APPROOT>/Library/Caches"
+ \row \li StateLocation
+ \li "<APPROOT>/files/state"
+ \row \li GenericStateLocation (there is shared state)
+ \li "<APPROOT>/files/state"
\row \li GenericDataLocation
- \li "<USER>"
- \li "<APPROOT>/Documents"
+ \li "<USER>" [*] or "<USER>/<APPNAME>/files"
+ \li "<APPROOT>/Library/Application Support"
\row \li RuntimeLocation
\li "<APPROOT>/cache"
\li not supported
@@ -309,7 +312,7 @@ QT_BEGIN_NAMESPACE
\li "<APPROOT>/files/settings" (there is no shared settings)
\li "<APPROOT>/Library/Preferences"
\row \li DownloadLocation
- \li "<USER>/Downloads", "<USER>/<APPNAME>/Downloads"
+ \li "<USER>/Downloads" [*], "<USER>/<APPNAME>/Downloads"
\li "<APPROOT>/Documents/Downloads"
\row \li GenericCacheLocation
\li "<APPROOT>/cache" (there is no shared cache)
@@ -320,6 +323,12 @@ QT_BEGIN_NAMESPACE
\row \li AppConfigLocation
\li "<APPROOT>/files/settings"
\li "<APPROOT>/Library/Preferences/<APPNAME>"
+ \row \li PublicShareLocation
+ \li not supported
+ \li not supported
+ \row \li TemplatesLocation
+ \li not supported
+ \li not supported
\endtable
In the table above, \c <APPNAME> is usually the organization name, the
@@ -339,6 +348,11 @@ QT_BEGIN_NAMESPACE
\note On Android, reading/writing to GenericDataLocation needs the READ_EXTERNAL_STORAGE/WRITE_EXTERNAL_STORAGE permission granted.
+ \note [*] On Android 11 and above, public directories are no longer directly accessible
+ in scoped storage mode. Thus, paths of the form \c "<USER>/DirName" are not returned.
+ Instead, you can use \l QFileDialog which uses the Storage Access Framework (SAF)
+ to access such directories.
+
\note On iOS, if you do pass \c {QStandardPaths::standardLocations(QStandardPaths::PicturesLocation).last()}
as argument to \l{QFileDialog::setDirectory()},
a native image picker dialog will be used for accessing the user's photo album.
@@ -388,7 +402,7 @@ QString QStandardPaths::locate(StandardLocation type, const QString &fileName, L
{
const QStringList &dirs = standardLocations(type);
for (QStringList::const_iterator dir = dirs.constBegin(); dir != dirs.constEnd(); ++dir) {
- const QString path = *dir + QLatin1Char('/') + fileName;
+ const QString path = *dir + u'/' + fileName;
if (existsAsSpecified(path, options))
return path;
}
@@ -403,7 +417,7 @@ QStringList QStandardPaths::locateAll(StandardLocation type, const QString &file
const QStringList &dirs = standardLocations(type);
QStringList result;
for (QStringList::const_iterator dir = dirs.constBegin(); dir != dirs.constEnd(); ++dir) {
- const QString path = *dir + QLatin1Char('/') + fileName;
+ const QString path = *dir + u'/' + fileName;
if (existsAsSpecified(path, options))
result.append(path);
}
@@ -414,11 +428,9 @@ QStringList QStandardPaths::locateAll(StandardLocation type, const QString &file
static QStringList executableExtensions()
{
// If %PATHEXT% does not contain .exe, it is either empty, malformed, or distorted in ways that we cannot support, anyway.
- const QStringList pathExt = QString::fromLocal8Bit(qgetenv("PATHEXT")).toLower().split(QLatin1Char(';'));
- return pathExt.contains(QLatin1String(".exe"), Qt::CaseInsensitive) ?
- pathExt :
- QStringList() << QLatin1String(".exe") << QLatin1String(".com")
- << QLatin1String(".bat") << QLatin1String(".cmd");
+ const QStringList pathExt = QString::fromLocal8Bit(qgetenv("PATHEXT")).toLower().split(u';');
+ return pathExt.contains(".exe"_L1, Qt::CaseInsensitive) ?
+ pathExt : QStringList{".exe"_L1, ".com"_L1, ".bat"_L1, ".cmd"_L1};
}
#endif
@@ -437,7 +449,7 @@ static inline QString searchExecutable(const QStringList &searchPaths,
{
const QDir currentDir = QDir::current();
for (const QString &searchPath : searchPaths) {
- const QString candidate = currentDir.absoluteFilePath(searchPath + QLatin1Char('/') + executableName);
+ const QString candidate = currentDir.absoluteFilePath(searchPath + u'/' + executableName);
const QString absPath = checkExecutable(candidate);
if (!absPath.isEmpty())
return absPath;
@@ -456,7 +468,7 @@ static inline QString
{
const QDir currentDir = QDir::current();
for (const QString &searchPath : searchPaths) {
- const QString candidateRoot = currentDir.absoluteFilePath(searchPath + QLatin1Char('/') + executableName);
+ const QString candidateRoot = currentDir.absoluteFilePath(searchPath + u'/' + executableName);
for (const QString &suffix : suffixes) {
const QString absPath = checkExecutable(candidateRoot + suffix);
if (!absPath.isEmpty())
@@ -506,7 +518,7 @@ QString QStandardPaths::findExecutable(const QString &executableName, const QStr
searchPaths.reserve(rawPaths.size());
for (const QString &rawPath : rawPaths) {
QString cleanPath = QDir::cleanPath(rawPath);
- if (cleanPath.size() > 1 && cleanPath.endsWith(QLatin1Char('/')))
+ if (cleanPath.size() > 1 && cleanPath.endsWith(u'/'))
cleanPath.truncate(cleanPath.size() - 1);
searchPaths.push_back(cleanPath);
}
@@ -516,9 +528,9 @@ QString QStandardPaths::findExecutable(const QString &executableName, const QStr
// On Windows, if the name does not have a suffix or a suffix not
// in PATHEXT ("xx.foo"), append suffixes from PATHEXT.
static const QStringList executable_extensions = executableExtensions();
- if (executableName.contains(QLatin1Char('.'))) {
+ if (executableName.contains(u'.')) {
const QString suffix = QFileInfo(executableName).suffix();
- if (suffix.isEmpty() || !executable_extensions.contains(QLatin1Char('.') + suffix, Qt::CaseInsensitive))
+ if (suffix.isEmpty() || !executable_extensions.contains(u'.' + suffix, Qt::CaseInsensitive))
return searchExecutableAppendSuffix(searchPaths, executableName, executable_extensions);
} else {
return searchExecutableAppendSuffix(searchPaths, executableName, executable_extensions);
@@ -528,10 +540,12 @@ QString QStandardPaths::findExecutable(const QString &executableName, const QStr
}
/*!
+ \fn QString QStandardPaths::displayName(StandardLocation type)
+
\include standardpath/functiondocs.qdocinc displayName
*/
-#if !defined(Q_OS_MAC) && !defined(QT_BOOTSTRAPPED)
+#if !defined(Q_OS_DARWIN) && !defined(QT_BOOTSTRAPPED)
QString QStandardPaths::displayName(StandardLocation type)
{
switch (type) {
@@ -557,6 +571,8 @@ QString QStandardPaths::displayName(StandardLocation type)
return QCoreApplication::translate("QStandardPaths", "Application Data");
case CacheLocation:
return QCoreApplication::translate("QStandardPaths", "Cache");
+ case StateLocation:
+ return QCoreApplication::translate("QStandardPaths", "State");
case GenericDataLocation:
return QCoreApplication::translate("QStandardPaths", "Shared Data");
case RuntimeLocation:
@@ -567,11 +583,17 @@ QString QStandardPaths::displayName(StandardLocation type)
return QCoreApplication::translate("QStandardPaths", "Shared Configuration");
case GenericCacheLocation:
return QCoreApplication::translate("QStandardPaths", "Shared Cache");
+ case GenericStateLocation:
+ return QCoreApplication::translate("QStandardPaths", "Shared State");
case DownloadLocation:
return QCoreApplication::translate("QStandardPaths", "Download");
case AppDataLocation:
case AppConfigLocation:
return QCoreApplication::translate("QStandardPaths", "Application Configuration");
+ case PublicShareLocation:
+ return QCoreApplication::translate("QStandardPaths", "Public");
+ case TemplatesLocation:
+ return QCoreApplication::translate("QStandardPaths", "Templates");
}
// not reached
return QString();
@@ -584,7 +606,7 @@ QString QStandardPaths::displayName(StandardLocation type)
\include standardpath/functiondocs.qdocinc setTestModeEnabled
*/
-static bool qsp_testMode = false;
+Q_CONSTINIT static bool qsp_testMode = false;
void QStandardPaths::setTestModeEnabled(bool testMode)
{
diff --git a/src/corelib/io/qstandardpaths.h b/src/corelib/io/qstandardpaths.h
index 2ee228beec..56aa2b100c 100644
--- a/src/corelib/io/qstandardpaths.h
+++ b/src/corelib/io/qstandardpaths.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QSTANDARDPATHS_H
#define QSTANDARDPATHS_H
@@ -72,7 +36,11 @@ public:
GenericCacheLocation,
GenericConfigLocation,
AppDataLocation,
- AppConfigLocation
+ AppConfigLocation,
+ PublicShareLocation,
+ TemplatesLocation,
+ StateLocation,
+ GenericStateLocation,
};
Q_ENUM(StandardLocation)
diff --git a/src/corelib/io/qstandardpaths_android.cpp b/src/corelib/io/qstandardpaths_android.cpp
index d5ece85818..f39b6855b6 100644
--- a/src/corelib/io/qstandardpaths_android.cpp
+++ b/src/corelib/io/qstandardpaths_android.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qstandardpaths.h"
@@ -48,21 +12,24 @@
QT_BEGIN_NAMESPACE
+Q_DECLARE_JNI_CLASS(Environment, "android/os/Environment");
+Q_DECLARE_JNI_CLASS(File, "java/io/File");
+
using namespace QNativeInterface;
+using namespace Qt::StringLiterals;
typedef QMap<QString, QString> AndroidDirCache;
Q_GLOBAL_STATIC(AndroidDirCache, androidDirCache)
static QString testDir()
{
- return QStandardPaths::isTestModeEnabled() ? QLatin1String("/qttest")
- : QLatin1String("");
+ return QStandardPaths::isTestModeEnabled() ? "/qttest"_L1 : ""_L1;
}
static inline QString getAbsolutePath(const QJniObject &file)
{
- QJniObject path = file.callObjectMethod("getAbsolutePath",
- "()Ljava/lang/String;");
+ QJniObject path = file.callMethod<jstring>("getAbsolutePath");
+
if (!path.isValid())
return QString();
@@ -70,12 +37,54 @@ static inline QString getAbsolutePath(const QJniObject &file)
}
/*
+ * The root of the external storage
+ *
+ */
+static QString getExternalStorageDirectory()
+{
+ QString &path = (*androidDirCache)[QStringLiteral("EXT_ROOT")];
+ if (!path.isEmpty())
+ return path;
+
+ QJniObject file = QJniObject::callStaticMethod<QtJniTypes::File>("android/os/Environment",
+ "getExternalStorageDirectory");
+ if (!file.isValid())
+ return QString();
+
+ return (path = getAbsolutePath(file));
+}
+
+/*
+ * Locations where applications can place user files shared by all apps (public).
+ * E.g., /storage/Music
+ */
+static QString getExternalStoragePublicDirectory(const char *directoryField)
+{
+ QString &path = (*androidDirCache)[QLatin1String(directoryField)];
+ if (!path.isEmpty())
+ return path;
+
+ QJniObject dirField = QJniObject::getStaticField<jstring>("android/os/Environment",
+ directoryField);
+ if (!dirField.isValid())
+ return QString();
+
+ QJniObject file = QJniObject::callStaticMethod<QtJniTypes::File>("android/os/Environment",
+ "getExternalStoragePublicDirectory",
+ dirField.object<jstring>());
+ if (!file.isValid())
+ return QString();
+
+ return (path = getAbsolutePath(file));
+}
+
+/*
* Locations where applications can place persistent files it owns.
* E.g., /storage/org.app/Music
*/
static QString getExternalFilesDir(const char *directoryField = nullptr)
{
- QString &path = (*androidDirCache)[QLatin1String("APPNAME_%1").arg(QLatin1String(directoryField))];
+ QString &path = (*androidDirCache)["APPNAME_%1"_L1.arg(QLatin1StringView(directoryField))];
if (!path.isEmpty())
return path;
@@ -83,18 +92,15 @@ static QString getExternalFilesDir(const char *directoryField = nullptr)
if (!appCtx.isValid())
return QString();
- QJniObject dirField = QJniObject::fromString(QLatin1String(""));
+ QJniObject dirField = QJniObject::fromString(""_L1);
if (directoryField && strlen(directoryField) > 0) {
- dirField = QJniObject::getStaticObjectField("android/os/Environment",
- directoryField,
- "Ljava/lang/String;");
+ dirField = QJniObject::getStaticField<QtJniTypes::Environment, jstring>(directoryField);
if (!dirField.isValid())
return QString();
}
- QJniObject file = appCtx.callObjectMethod("getExternalFilesDir",
- "(Ljava/lang/String;)Ljava/io/File;",
- dirField.object());
+ QJniObject file = appCtx.callMethod<QtJniTypes::File>("getExternalFilesDir",
+ dirField.object<jstring>());
if (!file.isValid())
return QString();
@@ -116,8 +122,7 @@ static QString getExternalCacheDir()
if (!appCtx.isValid())
return QString();
- QJniObject file = appCtx.callObjectMethod("getExternalCacheDir",
- "()Ljava/io/File;");
+ QJniObject file = appCtx.callMethod<QtJniTypes::File>("getExternalCacheDir");
if (!file.isValid())
return QString();
@@ -138,8 +143,7 @@ static QString getCacheDir()
if (!appCtx.isValid())
return QString();
- QJniObject file = appCtx.callObjectMethod("getCacheDir",
- "()Ljava/io/File;");
+ QJniObject file = appCtx.callMethod<QtJniTypes::File>("getCacheDir");
if (!file.isValid())
return QString();
@@ -160,33 +164,45 @@ static QString getFilesDir()
if (!appCtx.isValid())
return QString();
- QJniObject file = appCtx.callObjectMethod("getFilesDir",
- "()Ljava/io/File;");
+ QJniObject file = appCtx.callMethod<QtJniTypes::File>("getFilesDir");
if (!file.isValid())
return QString();
return (path = getAbsolutePath(file));
}
+static QString getSdkBasedExternalDir(const char *directoryField = nullptr)
+{
+ return (QNativeInterface::QAndroidApplication::sdkVersion() >= 30)
+ ? getExternalFilesDir(directoryField)
+ : getExternalStoragePublicDirectory(directoryField);
+}
+
QString QStandardPaths::writableLocation(StandardLocation type)
{
switch (type) {
case QStandardPaths::MusicLocation:
- return getExternalFilesDir("DIRECTORY_MUSIC");
+ return getSdkBasedExternalDir("DIRECTORY_MUSIC");
case QStandardPaths::MoviesLocation:
- return getExternalFilesDir("DIRECTORY_MOVIES");
+ return getSdkBasedExternalDir("DIRECTORY_MOVIES");
case QStandardPaths::PicturesLocation:
- return getExternalFilesDir("DIRECTORY_PICTURES");
+ return getSdkBasedExternalDir("DIRECTORY_PICTURES");
case QStandardPaths::DocumentsLocation:
- return getExternalFilesDir("DIRECTORY_DOCUMENTS");
+ return getSdkBasedExternalDir("DIRECTORY_DOCUMENTS");
case QStandardPaths::DownloadLocation:
- return getExternalFilesDir("DIRECTORY_DOWNLOADS");
+ return getSdkBasedExternalDir("DIRECTORY_DOWNLOADS");
case QStandardPaths::GenericConfigLocation:
case QStandardPaths::ConfigLocation:
case QStandardPaths::AppConfigLocation:
- return getFilesDir() + testDir() + QLatin1String("/settings");
+ return getFilesDir() + testDir() + "/settings"_L1;
+ case QStandardPaths::StateLocation:
+ case QStandardPaths::GenericStateLocation:
+ return getFilesDir() + testDir() + "/state"_L1;
case QStandardPaths::GenericDataLocation:
- return getExternalFilesDir() + testDir();
+ {
+ return QAndroidApplication::sdkVersion() >= 30 ?
+ getExternalFilesDir() + testDir() : getExternalStorageDirectory() + testDir();
+ }
case QStandardPaths::AppDataLocation:
case QStandardPaths::AppLocalDataLocation:
return getFilesDir() + testDir();
@@ -200,6 +216,8 @@ QString QStandardPaths::writableLocation(StandardLocation type)
return getFilesDir();
case QStandardPaths::ApplicationsLocation:
case QStandardPaths::FontsLocation:
+ case QStandardPaths::PublicShareLocation:
+ case QStandardPaths::TemplatesLocation:
default:
break;
}
@@ -209,59 +227,53 @@ QString QStandardPaths::writableLocation(StandardLocation type)
QStringList QStandardPaths::standardLocations(StandardLocation type)
{
- if (type == MusicLocation) {
- return QStringList() << writableLocation(type)
- << getExternalFilesDir("DIRECTORY_MUSIC")
- << getExternalFilesDir("DIRECTORY_PODCASTS")
- << getExternalFilesDir("DIRECTORY_NOTIFICATIONS")
- << getExternalFilesDir("DIRECTORY_ALARMS");
- }
-
- if (type == MoviesLocation) {
- return QStringList() << writableLocation(type)
- << getExternalFilesDir("DIRECTORY_MOVIES");
- }
-
- if (type == PicturesLocation) {
- return QStringList() << writableLocation(type)
- << getExternalFilesDir("DIRECTORY_PICTURES");
- }
+ QStringList locations;
- if (type == DocumentsLocation) {
- return QStringList() << writableLocation(type)
- << getExternalFilesDir("DIRECTORY_DOCUMENTS");
- }
-
- if (type == DownloadLocation) {
- return QStringList() << writableLocation(type)
- << getExternalFilesDir("DIRECTORY_DOWNLOADS");
- }
-
- if (type == AppDataLocation || type == AppLocalDataLocation) {
- return QStringList() << writableLocation(type)
- << getExternalFilesDir();
- }
-
- if (type == CacheLocation) {
- return QStringList() << writableLocation(type)
- << getExternalCacheDir();
- }
-
- if (type == FontsLocation) {
+ if (type == MusicLocation) {
+ locations << getExternalFilesDir("DIRECTORY_MUSIC");
+ // Place the public dirs before the app own dirs
+ if (QNativeInterface::QAndroidApplication::sdkVersion() < 30) {
+ locations << getExternalStoragePublicDirectory("DIRECTORY_PODCASTS")
+ << getExternalStoragePublicDirectory("DIRECTORY_NOTIFICATIONS")
+ << getExternalStoragePublicDirectory("DIRECTORY_ALARMS");
+ }
+ locations << getExternalFilesDir("DIRECTORY_PODCASTS")
+ << getExternalFilesDir("DIRECTORY_NOTIFICATIONS")
+ << getExternalFilesDir("DIRECTORY_ALARMS");
+ } else if (type == MoviesLocation) {
+ locations << getExternalFilesDir("DIRECTORY_MOVIES");
+ } else if (type == PicturesLocation) {
+ locations << getExternalFilesDir("DIRECTORY_PICTURES");
+ } else if (type == DocumentsLocation) {
+ locations << getExternalFilesDir("DIRECTORY_DOCUMENTS");
+ } else if (type == DownloadLocation) {
+ locations << getExternalFilesDir("DIRECTORY_DOWNLOADS");
+ } else if (type == AppDataLocation || type == AppLocalDataLocation) {
+ locations << getExternalFilesDir();
+ } else if (type == CacheLocation) {
+ locations << getExternalCacheDir();
+ } else if (type == FontsLocation) {
QString &fontLocation = (*androidDirCache)[QStringLiteral("FONT_LOCATION")];
- if (!fontLocation.isEmpty())
- return QStringList(fontLocation);
-
- const QByteArray ba = qgetenv("QT_ANDROID_FONT_LOCATION");
- if (!ba.isEmpty())
- return QStringList((fontLocation = QDir::cleanPath(QString::fromLocal8Bit(ba))));
-
- // Don't cache the fallback, as we might just have been called before
- // QT_ANDROID_FONT_LOCATION has been set.
- return QStringList(QLatin1String("/system/fonts"));
+ if (!fontLocation.isEmpty()) {
+ locations << fontLocation;
+ } else {
+ const QByteArray ba = qgetenv("QT_ANDROID_FONT_LOCATION");
+ if (!ba.isEmpty()) {
+ locations << (fontLocation = QDir::cleanPath(QString::fromLocal8Bit(ba)));
+ } else {
+ // Don't cache the fallback, as we might just have been called before
+ // QT_ANDROID_FONT_LOCATION has been set.
+ locations << "/system/fonts"_L1;
+ }
+ }
}
- return QStringList(writableLocation(type));
+ const QString writable = writableLocation(type);
+ if (!writable.isEmpty())
+ locations.prepend(writable);
+
+ locations.removeDuplicates();
+ return locations;
}
QT_END_NAMESPACE
diff --git a/src/corelib/io/qstandardpaths_haiku.cpp b/src/corelib/io/qstandardpaths_haiku.cpp
index 044d69fe45..93eba134f3 100644
--- a/src/corelib/io/qstandardpaths_haiku.cpp
+++ b/src/corelib/io/qstandardpaths_haiku.cpp
@@ -1,41 +1,5 @@
-/***************************************************************************
-**
-** Copyright (C) 2015 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Tobias Koenig <tobias.koenig@kdab.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2015 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Tobias Koenig <tobias.koenig@kdab.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qstandardpaths.h"
@@ -61,10 +25,10 @@ void appendOrganizationAndApp(QString &path)
#ifndef QT_BOOTSTRAPPED
const QString org = QCoreApplication::organizationName();
if (!org.isEmpty())
- path += QLatin1Char('/') + org;
+ path += u'/' + org;
const QString appName = QCoreApplication::applicationName();
if (!appName.isEmpty())
- path += QLatin1Char('/') + appName;
+ path += u'/' + appName;
#else
Q_UNUSED(path);
#endif
@@ -137,6 +101,8 @@ QString QStandardPaths::writableLocation(StandardLocation type)
case MusicLocation:
case MoviesLocation:
case DownloadLocation:
+ case PublicShareLocation:
+ case TemplatesLocation:
case HomeLocation:
return haikuStandardPath(B_USER_DIRECTORY);
case FontsLocation:
@@ -154,8 +120,10 @@ QString QStandardPaths::writableLocation(StandardLocation type)
return haikuAppStandardPath(B_USER_CACHE_DIRECTORY);
case GenericCacheLocation:
return haikuStandardPath(B_USER_CACHE_DIRECTORY);
- case ConfigLocation: // fall through
+ case ConfigLocation:
case AppConfigLocation:
+ case StateLocation:
+ case GenericStateLocation:
return haikuAppStandardPath(B_USER_SETTINGS_DIRECTORY);
case GenericConfigLocation:
return haikuStandardPath(B_USER_SETTINGS_DIRECTORY);
@@ -178,6 +146,8 @@ QStringList QStandardPaths::standardLocations(StandardLocation type)
case MusicLocation:
case MoviesLocation:
case DownloadLocation:
+ case PublicShareLocation:
+ case TemplatesLocation:
case HomeLocation:
paths += haikuStandardPath(B_USER_NONPACKAGED_DIRECTORY);
break;
diff --git a/src/corelib/io/qstandardpaths_mac.mm b/src/corelib/io/qstandardpaths_mac.mm
index a95e6a3bb1..2acbe92736 100644
--- a/src/corelib/io/qstandardpaths_mac.mm
+++ b/src/corelib/io/qstandardpaths_mac.mm
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qstandardpaths.h"
@@ -53,6 +17,8 @@
QT_BEGIN_NAMESPACE
+using namespace Qt::StringLiterals;
+
static QString pathForDirectory(NSSearchPathDirectory directory,
NSSearchPathDomainMask mask)
{
@@ -85,6 +51,9 @@ static NSSearchPathDirectory searchPathDirectory(QStandardPaths::StandardLocatio
return NSCachesDirectory;
case QStandardPaths::DownloadLocation:
return NSDownloadsDirectory;
+ case QStandardPaths::PublicShareLocation:
+ return NSSharedPublicDirectory;
+ case QStandardPaths::TemplatesLocation:
default:
return (NSSearchPathDirectory)0;
}
@@ -95,10 +64,10 @@ static void appendOrganizationAndApp(QString &path)
#ifndef QT_BOOTSTRAPPED
const QString org = QCoreApplication::organizationName();
if (!org.isEmpty())
- path += QLatin1Char('/') + org;
+ path += u'/' + org;
const QString appName = QCoreApplication::applicationName();
if (!appName.isEmpty())
- path += QLatin1Char('/') + appName;
+ path += u'/' + appName;
#else
Q_UNUSED(path);
#endif
@@ -120,30 +89,42 @@ static QString baseWritableLocation(QStandardPaths::StandardLocation type,
#if defined(QT_PLATFORM_UIKIT)
// These locations point to non-existing write-protected paths. Use sensible fallbacks.
case QStandardPaths::MusicLocation:
- path = pathForDirectory(NSDocumentDirectory, mask) + QLatin1String("/Music");
+ path = pathForDirectory(NSDocumentDirectory, mask) + "/Music"_L1;
break;
case QStandardPaths::MoviesLocation:
- path = pathForDirectory(NSDocumentDirectory, mask) + QLatin1String("/Movies");
+ path = pathForDirectory(NSDocumentDirectory, mask) + "/Movies"_L1;
break;
case QStandardPaths::PicturesLocation:
- path = pathForDirectory(NSDocumentDirectory, mask) + QLatin1String("/Pictures");
+ path = pathForDirectory(NSDocumentDirectory, mask) + "/Pictures"_L1;
break;
case QStandardPaths::DownloadLocation:
- path = pathForDirectory(NSDocumentDirectory, mask) + QLatin1String("/Downloads");
+ path = pathForDirectory(NSDocumentDirectory, mask) + "/Downloads"_L1;
break;
case QStandardPaths::DesktopLocation:
- path = pathForDirectory(NSDocumentDirectory, mask) + QLatin1String("/Desktop");
+ path = pathForDirectory(NSDocumentDirectory, mask) + "/Desktop"_L1;
break;
case QStandardPaths::ApplicationsLocation:
break;
+ case QStandardPaths::PublicShareLocation:
+ path = pathForDirectory(NSDocumentDirectory, mask) + "/Public"_L1;
+ break;
+ case QStandardPaths::TemplatesLocation:
+ path = pathForDirectory(NSDocumentDirectory, mask) + "/Templates"_L1;
+ break;
#endif
case QStandardPaths::FontsLocation:
- path = pathForDirectory(NSLibraryDirectory, mask) + QLatin1String("/Fonts");
+ path = pathForDirectory(NSLibraryDirectory, mask) + "/Fonts"_L1;
break;
case QStandardPaths::ConfigLocation:
case QStandardPaths::GenericConfigLocation:
case QStandardPaths::AppConfigLocation:
- path = pathForDirectory(NSLibraryDirectory, mask) + QLatin1String("/Preferences");
+ path = pathForDirectory(NSLibraryDirectory, mask) + "/Preferences"_L1;
+ break;
+ case QStandardPaths::StateLocation:
+ if (appendOrgAndApp) { break; }
+ Q_FALLTHROUGH();
+ case QStandardPaths::GenericStateLocation:
+ path = pathForDirectory(NSLibraryDirectory, mask) + "/Preferences/State"_L1;
break;
default:
path = pathForDirectory(dir, mask);
@@ -158,6 +139,11 @@ static QString baseWritableLocation(QStandardPaths::StandardLocation type,
case QStandardPaths::CacheLocation:
appendOrganizationAndApp(path);
break;
+ case QStandardPaths::StateLocation:
+ path = pathForDirectory(NSLibraryDirectory, mask) + "/Preferences"_L1;
+ appendOrganizationAndApp(path);
+ path += "/State"_L1;
+ break;
default:
break;
}
@@ -170,7 +156,7 @@ QString QStandardPaths::writableLocation(StandardLocation type)
{
QString location = baseWritableLocation(type, NSUserDomainMask, true);
if (isTestModeEnabled())
- location = location.replace(QDir::homePath(), QDir::homePath() + QLatin1String("/.qttest"));
+ location = location.replace(QDir::homePath(), QDir::homePath() + "/.qttest"_L1);
return location;
}
@@ -181,7 +167,7 @@ QStringList QStandardPaths::standardLocations(StandardLocation type)
#if defined(QT_PLATFORM_UIKIT)
if (type == PicturesLocation)
- dirs << writableLocation(PicturesLocation) << QLatin1String("assets-library://");
+ dirs << writableLocation(PicturesLocation) << "assets-library://"_L1;
#endif
if (type == GenericDataLocation || type == FontsLocation || type == ApplicationsLocation
diff --git a/src/corelib/io/qstandardpaths_unix.cpp b/src/corelib/io/qstandardpaths_unix.cpp
index fa35265257..e38f670895 100644
--- a/src/corelib/io/qstandardpaths_unix.cpp
+++ b/src/corelib/io/qstandardpaths_unix.cpp
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Copyright (C) 2020 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// Copyright (C) 2020 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qstandardpaths.h"
#include <qdir.h>
@@ -58,38 +22,44 @@
QT_BEGIN_NAMESPACE
+using namespace Qt::StringLiterals;
+
static void appendOrganizationAndApp(QString &path)
{
#ifndef QT_BOOTSTRAPPED
const QString org = QCoreApplication::organizationName();
if (!org.isEmpty())
- path += QLatin1Char('/') + org;
+ path += u'/' + org;
const QString appName = QCoreApplication::applicationName();
if (!appName.isEmpty())
- path += QLatin1Char('/') + appName;
+ path += u'/' + appName;
#else
Q_UNUSED(path);
#endif
}
#if QT_CONFIG(regularexpression)
-static QLatin1String xdg_key_name(QStandardPaths::StandardLocation type)
+static QLatin1StringView xdg_key_name(QStandardPaths::StandardLocation type)
{
switch (type) {
case QStandardPaths::DesktopLocation:
- return QLatin1String("DESKTOP");
+ return "DESKTOP"_L1;
case QStandardPaths::DocumentsLocation:
- return QLatin1String("DOCUMENTS");
+ return "DOCUMENTS"_L1;
case QStandardPaths::PicturesLocation:
- return QLatin1String("PICTURES");
+ return "PICTURES"_L1;
case QStandardPaths::MusicLocation:
- return QLatin1String("MUSIC");
+ return "MUSIC"_L1;
case QStandardPaths::MoviesLocation:
- return QLatin1String("VIDEOS");
+ return "VIDEOS"_L1;
case QStandardPaths::DownloadLocation:
- return QLatin1String("DOWNLOAD");
+ return "DOWNLOAD"_L1;
+ case QStandardPaths::PublicShareLocation:
+ return "PUBLICSHARE"_L1;
+ case QStandardPaths::TemplatesLocation:
+ return "TEMPLATES"_L1;
default:
- return QLatin1String();
+ return {};
}
}
#endif
@@ -210,25 +180,56 @@ QString QStandardPaths::writableLocation(StandardLocation type)
case CacheLocation:
case GenericCacheLocation:
{
- // http://standards.freedesktop.org/basedir-spec/basedir-spec-0.6.html
- QString xdgCacheHome = QFile::decodeName(qgetenv("XDG_CACHE_HOME"));
- if (isTestModeEnabled())
- xdgCacheHome = QDir::homePath() + QLatin1String("/.qttest/cache");
- if (xdgCacheHome.isEmpty())
- xdgCacheHome = QDir::homePath() + QLatin1String("/.cache");
+ QString xdgCacheHome;
+ if (isTestModeEnabled()) {
+ xdgCacheHome = QDir::homePath() + "/.qttest/cache"_L1;
+ } else {
+ // http://standards.freedesktop.org/basedir-spec/basedir-spec-0.6.html
+ xdgCacheHome = QFile::decodeName(qgetenv("XDG_CACHE_HOME"));
+ if (!xdgCacheHome.startsWith(u'/'))
+ xdgCacheHome.clear(); // spec says relative paths should be ignored
+
+ if (xdgCacheHome.isEmpty())
+ xdgCacheHome = QDir::homePath() + "/.cache"_L1;
+ }
if (type == QStandardPaths::CacheLocation)
appendOrganizationAndApp(xdgCacheHome);
return xdgCacheHome;
}
+ case StateLocation:
+ case GenericStateLocation:
+ {
+ QString xdgStateHome;
+ if (isTestModeEnabled()) {
+ xdgStateHome = QDir::homePath() + "/.qttest/state"_L1;
+ } else {
+ // http://standards.freedesktop.org/basedir-spec/basedir-spec-0.8.html
+ xdgStateHome = QFile::decodeName(qgetenv("XDG_STATE_HOME"));
+ if (!xdgStateHome.startsWith(u'/'))
+ xdgStateHome.clear(); // spec says relative paths should be ignored
+
+ if (xdgStateHome.isEmpty())
+ xdgStateHome = QDir::homePath() + "/.local/state"_L1;
+ }
+ if (type == QStandardPaths::StateLocation)
+ appendOrganizationAndApp(xdgStateHome);
+ return xdgStateHome;
+ }
case AppDataLocation:
case AppLocalDataLocation:
case GenericDataLocation:
{
- QString xdgDataHome = QFile::decodeName(qgetenv("XDG_DATA_HOME"));
- if (isTestModeEnabled())
- xdgDataHome = QDir::homePath() + QLatin1String("/.qttest/share");
- if (xdgDataHome.isEmpty())
- xdgDataHome = QDir::homePath() + QLatin1String("/.local/share");
+ QString xdgDataHome;
+ if (isTestModeEnabled()) {
+ xdgDataHome = QDir::homePath() + "/.qttest/share"_L1;
+ } else {
+ xdgDataHome = QFile::decodeName(qgetenv("XDG_DATA_HOME"));
+ if (!xdgDataHome.startsWith(u'/'))
+ xdgDataHome.clear(); // spec says relative paths should be ignored
+
+ if (xdgDataHome.isEmpty())
+ xdgDataHome = QDir::homePath() + "/.local/share"_L1;
+ }
if (type == AppDataLocation || type == AppLocalDataLocation)
appendOrganizationAndApp(xdgDataHome);
return xdgDataHome;
@@ -237,12 +238,18 @@ QString QStandardPaths::writableLocation(StandardLocation type)
case GenericConfigLocation:
case AppConfigLocation:
{
- // http://standards.freedesktop.org/basedir-spec/latest/
- QString xdgConfigHome = QFile::decodeName(qgetenv("XDG_CONFIG_HOME"));
- if (isTestModeEnabled())
- xdgConfigHome = QDir::homePath() + QLatin1String("/.qttest/config");
- if (xdgConfigHome.isEmpty())
- xdgConfigHome = QDir::homePath() + QLatin1String("/.config");
+ QString xdgConfigHome;
+ if (isTestModeEnabled()) {
+ xdgConfigHome = QDir::homePath() + "/.qttest/config"_L1;
+ } else {
+ // http://standards.freedesktop.org/basedir-spec/latest/
+ xdgConfigHome = QFile::decodeName(qgetenv("XDG_CONFIG_HOME"));
+ if (!xdgConfigHome.startsWith(u'/'))
+ xdgConfigHome.clear(); // spec says relative paths should be ignored
+
+ if (xdgConfigHome.isEmpty())
+ xdgConfigHome = QDir::homePath() + "/.config"_L1;
+ }
if (type == AppConfigLocation)
appendOrganizationAndApp(xdgConfigHome);
return xdgConfigHome;
@@ -250,12 +257,15 @@ QString QStandardPaths::writableLocation(StandardLocation type)
case RuntimeLocation:
{
QString xdgRuntimeDir = QFile::decodeName(qgetenv("XDG_RUNTIME_DIR"));
+ if (!xdgRuntimeDir.startsWith(u'/'))
+ xdgRuntimeDir.clear(); // spec says relative paths should be ignored
+
bool fromEnv = !xdgRuntimeDir.isEmpty();
if (xdgRuntimeDir.isEmpty() || !checkXdgRuntimeDir(xdgRuntimeDir)) {
// environment variable not set or is set to something unsuitable
const uint myUid = uint(geteuid());
const QString userName = QFileSystemEngine::resolveUserName(myUid);
- xdgRuntimeDir = QDir::tempPath() + QLatin1String("/runtime-") + userName;
+ xdgRuntimeDir = QDir::tempPath() + "/runtime-"_L1 + userName;
if (!fromEnv) {
#ifndef Q_OS_WASM
@@ -276,30 +286,33 @@ QString QStandardPaths::writableLocation(StandardLocation type)
#if QT_CONFIG(regularexpression)
// http://www.freedesktop.org/wiki/Software/xdg-user-dirs
QString xdgConfigHome = QFile::decodeName(qgetenv("XDG_CONFIG_HOME"));
+ if (!xdgConfigHome.startsWith(u'/'))
+ xdgConfigHome.clear(); // spec says relative paths should be ignored
+
if (xdgConfigHome.isEmpty())
- xdgConfigHome = QDir::homePath() + QLatin1String("/.config");
- QFile file(xdgConfigHome + QLatin1String("/user-dirs.dirs"));
- const QLatin1String key = xdg_key_name(type);
+ xdgConfigHome = QDir::homePath() + "/.config"_L1;
+ QFile file(xdgConfigHome + "/user-dirs.dirs"_L1);
+ const QLatin1StringView key = xdg_key_name(type);
if (!key.isEmpty() && !isTestModeEnabled() && file.open(QIODevice::ReadOnly)) {
QTextStream stream(&file);
// Only look for lines like: XDG_DESKTOP_DIR="$HOME/Desktop"
- QRegularExpression exp(QLatin1String("^XDG_(.*)_DIR=(.*)$"));
+ static const QRegularExpression exp(u"^XDG_(.*)_DIR=(.*)$"_s);
QString result;
while (!stream.atEnd()) {
const QString &line = stream.readLine();
QRegularExpressionMatch match = exp.match(line);
if (match.hasMatch() && match.capturedView(1) == key) {
QStringView value = match.capturedView(2);
- if (value.length() > 2
- && value.startsWith(QLatin1Char('\"'))
- && value.endsWith(QLatin1Char('\"')))
- value = value.mid(1, value.length() - 2);
+ if (value.size() > 2
+ && value.startsWith(u'\"')
+ && value.endsWith(u'\"'))
+ value = value.mid(1, value.size() - 2);
// value can start with $HOME
- if (value.startsWith(QLatin1String("$HOME")))
+ if (value.startsWith("$HOME"_L1))
result = QDir::homePath() + value.mid(5);
else
result = value.toString();
- if (result.length() > 1 && result.endsWith(QLatin1Char('/')))
+ if (result.size() > 1 && result.endsWith(u'/'))
result.chop(1);
}
}
@@ -311,31 +324,39 @@ QString QStandardPaths::writableLocation(StandardLocation type)
QString path;
switch (type) {
case DesktopLocation:
- path = QDir::homePath() + QLatin1String("/Desktop");
+ path = QDir::homePath() + "/Desktop"_L1;
break;
case DocumentsLocation:
- path = QDir::homePath() + QLatin1String("/Documents");
+ path = QDir::homePath() + "/Documents"_L1;
break;
case PicturesLocation:
- path = QDir::homePath() + QLatin1String("/Pictures");
+ path = QDir::homePath() + "/Pictures"_L1;
break;
case FontsLocation:
- path = writableLocation(GenericDataLocation) + QLatin1String("/fonts");
+ path = writableLocation(GenericDataLocation) + "/fonts"_L1;
break;
case MusicLocation:
- path = QDir::homePath() + QLatin1String("/Music");
+ path = QDir::homePath() + "/Music"_L1;
break;
case MoviesLocation:
- path = QDir::homePath() + QLatin1String("/Videos");
+ path = QDir::homePath() + "/Videos"_L1;
break;
case DownloadLocation:
- path = QDir::homePath() + QLatin1String("/Downloads");
+ path = QDir::homePath() + "/Downloads"_L1;
break;
case ApplicationsLocation:
- path = writableLocation(GenericDataLocation) + QLatin1String("/applications");
+ path = writableLocation(GenericDataLocation) + "/applications"_L1;
+ break;
+
+ case PublicShareLocation:
+ path = QDir::homePath() + "/Public"_L1;
+ break;
+
+ case TemplatesLocation:
+ path = QDir::homePath() + "/Templates"_L1;
break;
default:
@@ -345,41 +366,48 @@ QString QStandardPaths::writableLocation(StandardLocation type)
return path;
}
-static QStringList xdgDataDirs()
+static QStringList dirsList(const QString &xdgEnvVar)
{
QStringList dirs;
// http://standards.freedesktop.org/basedir-spec/latest/
+ // Normalize paths, skip relative paths (the spec says relative paths
+ // should be ignored)
+ for (const auto dir : qTokenize(xdgEnvVar, u':'))
+ if (dir.startsWith(u'/'))
+ dirs.push_back(QDir::cleanPath(dir.toString()));
+
+ // Remove duplicates from the list, there's no use for duplicated paths
+ // in XDG_* env vars - if whatever is being looked for is not found in
+ // the given directory the first time, it won't be there the second time.
+ // Plus duplicate paths causes problems for example for mimetypes,
+ // where duplicate paths here lead to duplicated mime types returned
+ // for a file, eg "text/plain,text/plain" instead of "text/plain"
+ dirs.removeDuplicates();
+
+ return dirs;
+}
+
+static QStringList xdgDataDirs()
+{
+ // http://standards.freedesktop.org/basedir-spec/latest/
QString xdgDataDirsEnv = QFile::decodeName(qgetenv("XDG_DATA_DIRS"));
- if (xdgDataDirsEnv.isEmpty()) {
- dirs.append(QString::fromLatin1("/usr/local/share"));
- dirs.append(QString::fromLatin1("/usr/share"));
- } else {
- // Normalize paths, skip relative paths
- for (const auto dir : qTokenize(xdgDataDirsEnv, u':')) {
- if (dir.startsWith(QLatin1Char('/')))
- dirs.push_back(QDir::cleanPath(dir.toString()));
- }
- // Remove duplicates from the list, there's no use for duplicated
- // paths in XDG_DATA_DIRS - if it's not found in the given
- // directory the first time, it won't be there the second time.
- // Plus duplicate paths causes problems for example for mimetypes,
- // where duplicate paths here lead to duplicated mime types returned
- // for a file, eg "text/plain,text/plain" instead of "text/plain"
- dirs.removeDuplicates();
- }
+ QStringList dirs = dirsList(xdgDataDirsEnv);
+ if (dirs.isEmpty())
+ dirs = QStringList{u"/usr/local/share"_s, u"/usr/share"_s};
+
return dirs;
}
static QStringList xdgConfigDirs()
{
- QStringList dirs;
// http://standards.freedesktop.org/basedir-spec/latest/
const QString xdgConfigDirs = QFile::decodeName(qgetenv("XDG_CONFIG_DIRS"));
- if (xdgConfigDirs.isEmpty())
- dirs.append(QString::fromLatin1("/etc/xdg"));
- else
- dirs = xdgConfigDirs.split(QLatin1Char(':'));
+
+ QStringList dirs = dirsList(xdgConfigDirs);
+ if (dirs.isEmpty())
+ dirs.push_back(u"/etc/xdg"_s);
+
return dirs;
}
@@ -393,7 +421,7 @@ QStringList QStandardPaths::standardLocations(StandardLocation type)
break;
case AppConfigLocation:
dirs = xdgConfigDirs();
- for (int i = 0; i < dirs.count(); ++i)
+ for (int i = 0; i < dirs.size(); ++i)
appendOrganizationAndApp(dirs[i]);
break;
case GenericDataLocation:
@@ -401,20 +429,20 @@ QStringList QStandardPaths::standardLocations(StandardLocation type)
break;
case ApplicationsLocation:
dirs = xdgDataDirs();
- for (int i = 0; i < dirs.count(); ++i)
- dirs[i].append(QLatin1String("/applications"));
+ for (int i = 0; i < dirs.size(); ++i)
+ dirs[i].append("/applications"_L1);
break;
case AppDataLocation:
case AppLocalDataLocation:
dirs = xdgDataDirs();
- for (int i = 0; i < dirs.count(); ++i)
+ for (int i = 0; i < dirs.size(); ++i)
appendOrganizationAndApp(dirs[i]);
break;
case FontsLocation:
- dirs += QDir::homePath() + QLatin1String("/.fonts");
+ dirs += QDir::homePath() + "/.fonts"_L1;
dirs += xdgDataDirs();
- for (int i = 1; i < dirs.count(); ++i)
- dirs[i].append(QLatin1String("/fonts"));
+ for (int i = 1; i < dirs.size(); ++i)
+ dirs[i].append("/fonts"_L1);
break;
default:
break;
diff --git a/src/corelib/io/qstandardpaths_win.cpp b/src/corelib/io/qstandardpaths_win.cpp
index 36541a4f81..805ce65a5a 100644
--- a/src/corelib/io/qstandardpaths_win.cpp
+++ b/src/corelib/io/qstandardpaths_win.cpp
@@ -1,53 +1,15 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qstandardpaths.h"
#include <qdir.h>
-#include <private/qsystemlibrary_p.h>
#include <qstringlist.h>
#ifndef QT_BOOTSTRAPPED
#include <qcoreapplication.h>
#endif
-#include <qoperatingsystemversion.h>
#include <qt_windows.h>
#include <shlobj.h>
#include <intshcut.h>
@@ -57,6 +19,8 @@
QT_BEGIN_NAMESPACE
+using namespace Qt::StringLiterals;
+
static QString convertCharArray(const wchar_t *path)
{
return QDir::fromNativeSeparators(QString::fromWCharArray(path));
@@ -79,10 +43,10 @@ static void appendOrganizationAndApp(QString &path) // Courtesy qstandardpaths_u
#ifndef QT_BOOTSTRAPPED
const QString &org = QCoreApplication::organizationName();
if (!org.isEmpty())
- path += QLatin1Char('/') + org;
+ path += u'/' + org;
const QString &appName = QCoreApplication::applicationName();
if (!appName.isEmpty())
- path += QLatin1Char('/') + appName;
+ path += u'/' + appName;
#else // !QT_BOOTSTRAPPED
Q_UNUSED(path);
#endif
@@ -91,17 +55,12 @@ static void appendOrganizationAndApp(QString &path) // Courtesy qstandardpaths_u
static inline void appendTestMode(QString &path)
{
if (QStandardPaths::isTestModeEnabled())
- path += QLatin1String("/qttest");
+ path += "/qttest"_L1;
}
-static bool isProcessLowIntegrity() {
-#ifdef Q_CC_MINGW
- // GetCurrentProcessToken was introduced in MinGW w64 in v7
- // Disable function until Qt CI is updated
- return false;
-#else
- // non-leaking pseudo-handle. Expanded inline function GetCurrentProcessToken()
- // (was made an inline function in Windows 8).
+static bool isProcessLowIntegrity()
+{
+ // same as GetCurrentProcessToken()
const auto process_token = HANDLE(quintptr(-4));
QVarLengthArray<char,256> token_info_buf(256);
@@ -119,7 +78,6 @@ static bool isProcessLowIntegrity() {
// there's no point in checking before dereferencing
DWORD integrity_level = *GetSidSubAuthority(token_info->Label.Sid, *GetSidSubAuthorityCount(token_info->Label.Sid) - 1);
return (integrity_level < SECURITY_MANDATORY_MEDIUM_RID);
-#endif
}
// Map QStandardPaths::StandardLocation to KNOWNFOLDERID of SHGetKnownFolderPath()
@@ -140,12 +98,17 @@ static GUID writableSpecialFolderId(QStandardPaths::StandardLocation type)
FOLDERID_LocalAppData, // GenericDataLocation ("Local" path)
GUID(), // RuntimeLocation
FOLDERID_LocalAppData, // ConfigLocation ("Local" path)
- GUID(), GUID(), // DownloadLocation/GenericCacheLocation
+ FOLDERID_Downloads, // DownloadLocation
+ GUID(), // GenericCacheLocation
FOLDERID_LocalAppData, // GenericConfigLocation ("Local" path)
FOLDERID_RoamingAppData,// AppDataLocation ("Roaming" path)
FOLDERID_LocalAppData, // AppConfigLocation ("Local" path)
+ FOLDERID_Public, // PublicShareLocation
+ FOLDERID_Templates, // TemplatesLocation
+ GUID(), // StateLocation
+ GUID(), // GenericStateLocation
};
- static_assert(sizeof(folderIds) / sizeof(folderIds[0]) == size_t(QStandardPaths::AppConfigLocation + 1));
+ static_assert(sizeof(folderIds) / sizeof(folderIds[0]) == size_t(QStandardPaths::GenericStateLocation + 1));
// folders for low integrity processes
static const GUID folderIds_li[] = {
@@ -162,10 +125,15 @@ static GUID writableSpecialFolderId(QStandardPaths::StandardLocation type)
FOLDERID_LocalAppDataLow,// GenericDataLocation ("Local" path)
GUID(), // RuntimeLocation
FOLDERID_LocalAppDataLow,// ConfigLocation ("Local" path)
- GUID(), GUID(), // DownloadLocation/GenericCacheLocation
+ FOLDERID_Downloads, // DownloadLocation
+ GUID(), // GenericCacheLocation
FOLDERID_LocalAppDataLow,// GenericConfigLocation ("Local" path)
FOLDERID_RoamingAppData, // AppDataLocation ("Roaming" path)
FOLDERID_LocalAppDataLow,// AppConfigLocation ("Local" path)
+ FOLDERID_Public, // PublicShareLocation
+ FOLDERID_Templates, // TemplatesLocation
+ GUID(), // StateLocation
+ GUID(), // GenericStateLocation
};
static_assert(sizeof(folderIds_li) == sizeof(folderIds));
@@ -191,12 +159,6 @@ QString QStandardPaths::writableLocation(StandardLocation type)
{
QString result;
switch (type) {
- case DownloadLocation:
- result = sHGetKnownFolderPath(FOLDERID_Downloads);
- if (result.isEmpty())
- result = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation);
- break;
-
case CacheLocation:
// Although Microsoft has a Cache key it is a pointer to IE's cache, not a cache
// location for everyone. Most applications seem to be using a
@@ -205,7 +167,7 @@ QString QStandardPaths::writableLocation(StandardLocation type)
if (!result.isEmpty()) {
appendTestMode(result);
appendOrganizationAndApp(result);
- result += QLatin1String("/cache");
+ result += "/cache"_L1;
}
break;
@@ -213,7 +175,7 @@ QString QStandardPaths::writableLocation(StandardLocation type)
result = sHGetKnownFolderPath(writableSpecialFolderId(GenericDataLocation));
if (!result.isEmpty()) {
appendTestMode(result);
- result += QLatin1String("/cache");
+ result += "/cache"_L1;
}
break;
@@ -226,6 +188,23 @@ QString QStandardPaths::writableLocation(StandardLocation type)
result = QDir::tempPath();
break;
+ case StateLocation:
+ result = sHGetKnownFolderPath(writableSpecialFolderId(AppLocalDataLocation));
+ if (!result.isEmpty()) {
+ appendTestMode(result);
+ appendOrganizationAndApp(result);
+ result += "/State"_L1;
+ }
+ break;
+
+ case GenericStateLocation:
+ result = sHGetKnownFolderPath(writableSpecialFolderId(GenericDataLocation));
+ if (!result.isEmpty()) {
+ appendTestMode(result);
+ result += "/State"_L1;
+ }
+ break;
+
default:
result = sHGetKnownFolderPath(writableSpecialFolderId(type));
if (!result.isEmpty() && isConfigLocation(type)) {
@@ -264,7 +243,7 @@ QStringList QStandardPaths::standardLocations(StandardLocation type)
QString applicationDirPath = qApp ? QCoreApplication::applicationDirPath()
: QFileInfo(qAppFileName()).path();
dirs.append(applicationDirPath);
- const QString dataDir = applicationDirPath + QLatin1String("/data");
+ const QString dataDir = applicationDirPath + "/data"_L1;
dirs.append(dataDir);
if (!isGenericConfigLocation(type)) {
diff --git a/src/corelib/io/qstorageinfo.cpp b/src/corelib/io/qstorageinfo.cpp
index 86b8ae0ac3..b7a17febaf 100644
--- a/src/corelib/io/qstorageinfo.cpp
+++ b/src/corelib/io/qstorageinfo.cpp
@@ -1,41 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2014 Ivan Komissarov <ABBAPOH@gmail.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2022 The Qt Company Ltd.
+// Copyright (C) 2015 Ivan Komissarov <ABBAPOH@gmail.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qstorageinfo.h"
#include "qstorageinfo_p.h"
@@ -44,6 +9,8 @@
QT_BEGIN_NAMESPACE
+QT_IMPL_METATYPE_EXTERN(QStorageInfo)
+
/*!
\class QStorageInfo
\inmodule QtCore
@@ -53,6 +20,8 @@ QT_BEGIN_NAMESPACE
\ingroup io
\ingroup shared
+ \compares equality
+
Allows retrieving information about the volume's space, its mount point,
label, and filesystem name.
@@ -70,6 +39,11 @@ QT_BEGIN_NAMESPACE
\snippet code/src_corelib_io_qstorageinfo.cpp 2
*/
+QStorageInfo::QStorageInfo(QStorageInfoPrivate &dd)
+ : d(&dd)
+{
+}
+
/*!
Constructs an empty QStorageInfo object.
@@ -274,9 +248,10 @@ QByteArray QStorageInfo::device() const
Returns the subvolume name for this volume.
Some filesystem types allow multiple subvolumes inside one device, which
- may be mounted in different paths. If the subvolume could be detected, it
- is returned here. The format of the subvolume name is specific to each
- filesystem type.
+ may be mounted in different paths (e.g. 'bind' mounts on Unix, or Btrfs
+ filesystem subvolumes). If the subvolume could be detected, its name is
+ returned by this function. The format of the subvolume name is specific
+ to each filesystem type.
If this volume was not mounted from a subvolume of a larger filesystem or
if the subvolume could not be detected, this function returns an empty byte
@@ -397,7 +372,7 @@ QList<QStorageInfo> QStorageInfo::mountedVolumes()
return QStorageInfoPrivate::mountedVolumes();
}
-Q_GLOBAL_STATIC_WITH_ARGS(QStorageInfo, getRoot, (QStorageInfoPrivate::root()))
+Q_GLOBAL_STATIC(QStorageInfo, getRoot, QStorageInfoPrivate::root())
/*!
Returns a QStorageInfo object that represents the system root volume.
@@ -413,22 +388,29 @@ QStorageInfo QStorageInfo::root()
}
/*!
- \fn bool QStorageInfo::operator==(const QStorageInfo &first, const QStorageInfo &second)
+ \fn bool QStorageInfo::operator==(const QStorageInfo &lhs, const QStorageInfo &rhs)
- Returns true if the \a first QStorageInfo object refers to the same drive or volume
- as the \a second; otherwise it returns false.
+ Returns \c true if the QStorageInfo object \a lhs refers to the same drive or
+ volume as the QStorageInfo object \a rhs; otherwise it returns \c false.
Note that the result of comparing two invalid QStorageInfo objects is always
positive.
*/
/*!
- \fn bool QStorageInfo::operator!=(const QStorageInfo &first, const QStorageInfo &second)
+ \fn bool QStorageInfo::operator!=(const QStorageInfo &lhs, const QStorageInfo &rhs)
- Returns true if the \a first QStorageInfo object refers to a different drive or
- volume than the \a second; otherwise returns false.
+ Returns \c true if the QStorageInfo object \a lhs refers to a different drive or
+ volume than the QStorageInfo object \a rhs; otherwise returns \c false.
*/
+bool comparesEqual(const QStorageInfo &lhs, const QStorageInfo &rhs)
+{
+ if (lhs.d == rhs.d)
+ return true;
+ return lhs.device() == rhs.device() && lhs.rootPath() == rhs.rootPath();
+}
+
#ifndef QT_NO_DEBUG_STREAM
QDebug operator<<(QDebug debug, const QStorageInfo &s)
{
diff --git a/src/corelib/io/qstorageinfo.h b/src/corelib/io/qstorageinfo.h
index d441915a9e..3784fe8e47 100644
--- a/src/corelib/io/qstorageinfo.h
+++ b/src/corelib/io/qstorageinfo.h
@@ -1,46 +1,11 @@
-/****************************************************************************
-**
-** Copyright (C) 2014 Ivan Komissarov <ABBAPOH@gmail.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2014 Ivan Komissarov <ABBAPOH@gmail.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QSTORAGEINFO_H
#define QSTORAGEINFO_H
#include <QtCore/qbytearray.h>
+#include <QtCore/qcompare.h>
#include <QtCore/qdir.h>
#include <QtCore/qlist.h>
#include <QtCore/qmetatype.h>
@@ -65,7 +30,7 @@ public:
QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_PURE_SWAP(QStorageInfo)
inline void swap(QStorageInfo &other) noexcept
- { qSwap(d, other.d); }
+ { d.swap(other.d); }
void setPath(const QString &path);
@@ -92,18 +57,10 @@ public:
static QStorageInfo root();
private:
+ explicit QStorageInfo(QStorageInfoPrivate &dd);
friend class QStorageInfoPrivate;
- friend inline bool operator==(const QStorageInfo &first, const QStorageInfo &second)
- {
- if (first.d == second.d)
- return true;
- return first.device() == second.device() && first.rootPath() == second.rootPath();
- }
-
- friend inline bool operator!=(const QStorageInfo &first, const QStorageInfo &second)
- {
- return !(first == second);
- }
+ friend Q_CORE_EXPORT bool comparesEqual(const QStorageInfo &lhs, const QStorageInfo &rhs);
+ Q_DECLARE_EQUALITY_COMPARABLE(QStorageInfo)
friend Q_CORE_EXPORT QDebug operator<<(QDebug, const QStorageInfo &);
QExplicitlySharedDataPointer<QStorageInfoPrivate> d;
@@ -120,6 +77,6 @@ Q_CORE_EXPORT QDebug operator<<(QDebug debug, const QStorageInfo &);
QT_END_NAMESPACE
-Q_DECLARE_METATYPE(QStorageInfo)
+QT_DECL_METATYPE_EXTERN(QStorageInfo, Q_CORE_EXPORT)
#endif // QSTORAGEINFO_H
diff --git a/src/corelib/io/qstorageinfo_linux.cpp b/src/corelib/io/qstorageinfo_linux.cpp
new file mode 100644
index 0000000000..a9d46e7395
--- /dev/null
+++ b/src/corelib/io/qstorageinfo_linux.cpp
@@ -0,0 +1,288 @@
+// Copyright (C) 2021 The Qt Company Ltd.
+// Copyright (C) 2014 Ivan Komissarov <ABBAPOH@gmail.com>
+// Copyright (C) 2016 Intel Corporation.
+// Copyright (C) 2023 Ahmad Samir <a.samirh78@gmail.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#include "qstorageinfo_linux_p.h"
+
+#include "qdirlisting.h"
+#include <private/qcore_unix_p.h>
+#include <private/qtools_p.h>
+
+#include <q20memory.h>
+
+#include <sys/ioctl.h>
+#include <sys/statfs.h>
+
+// so we don't have to #include <linux/fs.h>, which is known to cause conflicts
+#ifndef FSLABEL_MAX
+# define FSLABEL_MAX 256
+#endif
+#ifndef FS_IOC_GETFSLABEL
+# define FS_IOC_GETFSLABEL _IOR(0x94, 49, char[FSLABEL_MAX])
+#endif
+
+// or <linux/statfs.h>
+#ifndef ST_RDONLY
+# define ST_RDONLY 0x0001 /* mount read-only */
+#endif
+
+QT_BEGIN_NAMESPACE
+
+using namespace Qt::StringLiterals;
+
+// udev encodes the labels with ID_LABEL_FS_ENC which is done with
+// blkid_encode_string(). Within this function some 1-byte utf-8
+// characters not considered safe (e.g. '\' or ' ') are encoded as hex
+static QString decodeFsEncString(QString &&str)
+{
+ using namespace QtMiscUtils;
+ qsizetype start = str.indexOf(u'\\');
+ if (start < 0)
+ return std::move(str);
+
+ // decode in-place
+ QString decoded = std::move(str);
+ auto ptr = reinterpret_cast<char16_t *>(decoded.begin());
+ qsizetype in = start;
+ qsizetype out = start;
+ qsizetype size = decoded.size();
+
+ while (in < size) {
+ Q_ASSERT(ptr[in] == u'\\');
+ if (size - in >= 4 && ptr[in + 1] == u'x') { // we need four characters: \xAB
+ int c = fromHex(ptr[in + 2]) << 4;
+ c |= fromHex(ptr[in + 3]);
+ if (Q_UNLIKELY(c < 0))
+ c = QChar::ReplacementCharacter; // bad hex sequence
+ ptr[out++] = c;
+ in += 4;
+ }
+
+ for ( ; in < size; ++in) {
+ char16_t c = ptr[in];
+ if (c == u'\\')
+ break;
+ ptr[out++] = c;
+ }
+ }
+ decoded.resize(out);
+ return decoded;
+}
+
+static inline dev_t deviceIdForPath(const QString &device)
+{
+ QT_STATBUF st;
+ if (QT_STAT(QFile::encodeName(device), &st) < 0)
+ return 0;
+ return st.st_dev;
+}
+
+static inline quint64 retrieveDeviceId(const QByteArray &device, quint64 deviceId = 0)
+{
+ // major = 0 implies an anonymous block device, so we need to stat() the
+ // actual device to get its dev_t. This is required for btrfs (and possibly
+ // others), which always uses them for all the subvolumes (including the
+ // root):
+ // https://codebrowser.dev/linux/linux/fs/btrfs/disk-io.c.html#btrfs_init_fs_root
+ // https://codebrowser.dev/linux/linux/fs/super.c.html#get_anon_bdev
+ // For everything else, we trust the parameter.
+ if (major(deviceId) != 0)
+ return deviceId;
+
+ // don't even try to stat() a relative path or "/"
+ if (device.size() < 2 || !device.startsWith('/'))
+ return 0;
+
+ QT_STATBUF st;
+ if (QT_STAT(device, &st) < 0)
+ return 0;
+ if (!S_ISBLK(st.st_mode))
+ return 0;
+ return st.st_rdev;
+}
+
+static QDirListing devicesByLabel()
+{
+ static const char pathDiskByLabel[] = "/dev/disk/by-label";
+ static constexpr auto LabelFileFilter =
+ QDir::AllEntries | QDir::System | QDir::Hidden | QDir::NoDotAndDotDot;
+
+ return QDirListing(QLatin1StringView(pathDiskByLabel), LabelFileFilter);
+}
+
+static inline auto retrieveLabels()
+{
+ struct Entry {
+ QString label;
+ quint64 deviceId;
+ };
+ QList<Entry> result;
+
+ for (const auto &dirEntry : devicesByLabel()) {
+ quint64 deviceId = retrieveDeviceId(QFile::encodeName(dirEntry.filePath()));
+ if (!deviceId)
+ continue;
+ result.emplaceBack(Entry{ decodeFsEncString(dirEntry.fileName()), deviceId });
+ }
+ return result;
+}
+
+static std::optional<QString> retrieveLabelViaIoctl(const QString &path)
+{
+ // FS_IOC_GETFSLABEL was introduced in v4.18; previously it was btrfs-specific.
+ int fd = qt_safe_open(QFile::encodeName(path).constData(), QT_OPEN_RDONLY);
+ if (fd < 0)
+ return std::nullopt;
+
+ // Note: it doesn't append the null terminator (despite what the man page
+ // says) and the return code on success (0) does not indicate the length.
+ char label[FSLABEL_MAX] = {};
+ int r = ioctl(fd, FS_IOC_GETFSLABEL, &label);
+ close(fd);
+ if (r < 0)
+ return std::nullopt;
+ return QString::fromUtf8(label);
+}
+
+static inline QString retrieveLabel(const QStorageInfoPrivate &d, quint64 deviceId)
+{
+ if (auto label = retrieveLabelViaIoctl(d.rootPath))
+ return *label;
+
+ deviceId = retrieveDeviceId(d.device, deviceId);
+ if (!deviceId)
+ return QString();
+
+ for (const auto &dirEntry : devicesByLabel()) {
+ if (retrieveDeviceId(QFile::encodeName(dirEntry.filePath())) == deviceId)
+ return decodeFsEncString(dirEntry.fileName());
+ }
+ return QString();
+}
+
+void QStorageInfoPrivate::retrieveVolumeInfo()
+{
+ struct statfs64 statfs_buf;
+ int result;
+ QT_EINTR_LOOP(result, statfs64(QFile::encodeName(rootPath).constData(), &statfs_buf));
+ if (result == 0) {
+ valid = true;
+ ready = true;
+
+ bytesTotal = statfs_buf.f_blocks * statfs_buf.f_frsize;
+ bytesFree = statfs_buf.f_bfree * statfs_buf.f_frsize;
+ bytesAvailable = statfs_buf.f_bavail * statfs_buf.f_frsize;
+ blockSize = int(statfs_buf.f_bsize);
+ readOnly = (statfs_buf.f_flags & ST_RDONLY) != 0;
+ }
+}
+
+static std::vector<MountInfo> parseMountInfo(FilterMountInfo filter = FilterMountInfo::All)
+{
+ QFile file(u"/proc/self/mountinfo"_s);
+ if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
+ return {};
+
+ QByteArray mountinfo = file.readAll();
+ file.close();
+
+ return doParseMountInfo(mountinfo, filter);
+}
+
+void QStorageInfoPrivate::doStat()
+{
+ retrieveVolumeInfo();
+ if (!ready)
+ return;
+
+ rootPath = QFileInfo(rootPath).canonicalFilePath();
+ if (rootPath.isEmpty())
+ return;
+
+ std::vector<MountInfo> infos = parseMountInfo();
+ if (infos.empty()) {
+ rootPath = u'/';
+ return;
+ }
+
+ // We iterate over the /proc/self/mountinfo list backwards because then any
+ // matching isParentOf must be the actual mount point because it's the most
+ // recent mount on that path. Linux does allow mounting over non-empty
+ // directories, such as in:
+ // # mount | tail -2
+ // tmpfs on /tmp/foo/bar type tmpfs (rw,relatime,inode64)
+ // tmpfs on /tmp/foo type tmpfs (rw,relatime,inode64)
+ //
+ // We try to match the device ID in case there's a mount --move.
+ // We can't *rely* on it because some filesystems like btrfs will assign
+ // device IDs to subvolumes that aren't listed in /proc/self/mountinfo.
+
+ const QString oldRootPath = std::exchange(rootPath, QString());
+ const dev_t rootPathDevId = deviceIdForPath(oldRootPath);
+ MountInfo *best = nullptr;
+ for (auto it = infos.rbegin(); it != infos.rend(); ++it) {
+ if (!isParentOf(it->mountPoint, oldRootPath))
+ continue;
+ if (rootPathDevId == it->stDev) {
+ // device ID matches; this is definitely the best option
+ best = q20::to_address(it);
+ break;
+ }
+ if (!best) {
+ // if we can't find a device ID match, this parent path is probably
+ // the correct one
+ best = q20::to_address(it);
+ }
+ }
+ if (best) {
+ auto stDev = best->stDev;
+ setFromMountInfo(std::move(*best));
+ name = retrieveLabel(*this, stDev);
+ }
+}
+
+QList<QStorageInfo> QStorageInfoPrivate::mountedVolumes()
+{
+ std::vector<MountInfo> infos = parseMountInfo(FilterMountInfo::Filtered);
+ if (infos.empty())
+ return QList{root()};
+
+ std::optional<decltype(retrieveLabels())> labelMap;
+ auto labelForDevice = [&labelMap](const QStorageInfoPrivate &d, quint64 devid) {
+ if (d.fileSystemType == "tmpfs")
+ return QString();
+
+ if (auto label = retrieveLabelViaIoctl(d.rootPath))
+ return *label;
+
+ devid = retrieveDeviceId(d.device, devid);
+ if (!devid)
+ return QString();
+
+ if (!labelMap)
+ labelMap = retrieveLabels();
+ for (auto &[deviceLabel, deviceId] : std::as_const(*labelMap)) {
+ if (devid == deviceId)
+ return deviceLabel;
+ }
+ return QString();
+ };
+
+ QList<QStorageInfo> volumes;
+ for (MountInfo &info : infos) {
+ const auto infoStDev = info.stDev;
+ QStorageInfoPrivate d(std::move(info));
+ d.retrieveVolumeInfo();
+ if (d.bytesTotal <= 0 && d.rootPath != u'/')
+ continue;
+ if (infoStDev != deviceIdForPath(d.rootPath))
+ continue; // probably something mounted over this mountpoint
+ d.name = labelForDevice(d, infoStDev);
+ volumes.emplace_back(QStorageInfo(*new QStorageInfoPrivate(std::move(d))));
+ }
+ return volumes;
+}
+
+QT_END_NAMESPACE
diff --git a/src/corelib/io/qstorageinfo_linux_p.h b/src/corelib/io/qstorageinfo_linux_p.h
new file mode 100644
index 0000000000..6f5e107ec6
--- /dev/null
+++ b/src/corelib/io/qstorageinfo_linux_p.h
@@ -0,0 +1,244 @@
+// Copyright (C) 2021 The Qt Company Ltd.
+// Copyright (C) 2014 Ivan Komissarov <ABBAPOH@gmail.com>
+// Copyright (C) 2016 Intel Corporation.
+// Copyright (C) 2023 Ahmad Samir <a.samirh78@gmail.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QSTORAGEINFO_LINUX_P_H
+#define QSTORAGEINFO_LINUX_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API.
+// This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include "qstorageinfo_p.h"
+
+#include <QtCore/qsystemdetection.h>
+#include <QtCore/private/qlocale_tools_p.h>
+
+#include <sys/sysmacros.h> // makedev()
+
+QT_BEGIN_NAMESPACE
+
+using namespace Qt::StringLiterals;
+using MountInfo = QStorageInfoPrivate::MountInfo;
+
+static const char MountInfoPath[] = "/proc/self/mountinfo";
+
+static std::optional<dev_t> deviceNumber(QByteArrayView devno)
+{
+ // major:minor
+ auto it = devno.cbegin();
+ auto r = qstrntoll(it, devno.size(), 10);
+ if (!r.ok())
+ return std::nullopt;
+ int rdevmajor = int(r.result);
+ it += r.used;
+
+ if (*it != ':')
+ return std::nullopt;
+
+ r = qstrntoll(++it, devno.size() - r.used + 1, 10);
+ if (!r.ok())
+ return std::nullopt;
+
+ return makedev(rdevmajor, r.result);
+}
+
+// Helper function to parse paths that the kernel inserts escape sequences
+// for.
+static QByteArray parseMangledPath(QByteArrayView path)
+{
+ // The kernel escapes with octal the following characters:
+ // space ' ', tab '\t', backslash '\\', and newline '\n'
+ // See:
+ // https://codebrowser.dev/linux/linux/fs/proc_namespace.c.html#show_mountinfo
+ // https://codebrowser.dev/linux/linux/fs/seq_file.c.html#mangle_path
+
+ QByteArray ret(path.size(), '\0');
+ char *dst = ret.data();
+ const char *src = path.data();
+ const char *srcEnd = path.data() + path.size();
+ while (src != srcEnd) {
+ switch (*src) {
+ case ' ': // Shouldn't happen
+ return {};
+
+ case '\\': {
+ // It always uses exactly three octal characters.
+ ++src;
+ char c = (*src++ - '0') << 6;
+ c |= (*src++ - '0') << 3;
+ c |= (*src++ - '0');
+ *dst++ = c;
+ break;
+ }
+
+ default:
+ *dst++ = *src++;
+ break;
+ }
+ }
+ // If "path" contains any of the characters this method is demangling,
+ // "ret" would be oversized with extra '\0' characters at the end.
+ ret.resize(dst - ret.data());
+ return ret;
+}
+
+// Indexes into the "fields" std::array in parseMountInfo()
+// static constexpr short MountId = 0;
+// static constexpr short ParentId = 1;
+static constexpr short DevNo = 2;
+static constexpr short FsRoot = 3;
+static constexpr short MountPoint = 4;
+static constexpr short MountOptions = 5;
+// static constexpr short OptionalFields = 6;
+// static constexpr short Separator = 7;
+static constexpr short FsType = 8;
+static constexpr short MountSource = 9;
+static constexpr short SuperOptions = 10;
+static constexpr short FieldCount = 11;
+
+// Splits a line from /proc/self/mountinfo into fields; fields are separated
+// by a single space.
+static void tokenizeLine(std::array<QByteArrayView, FieldCount> &fields, QByteArrayView line)
+{
+ size_t fieldIndex = 0;
+ qsizetype from = 0;
+ const char *begin = line.data();
+ const qsizetype len = line.size();
+ qsizetype spaceIndex = -1;
+ while ((spaceIndex = line.indexOf(' ', from)) != -1 && fieldIndex < FieldCount) {
+ fields[fieldIndex] = QByteArrayView{begin + from, begin + spaceIndex};
+ from = spaceIndex;
+
+ // Skip "OptionalFields" and Separator fields
+ if (fieldIndex == MountOptions) {
+ static constexpr char separatorField[] = " - ";
+ const qsizetype sepIndex = line.indexOf(separatorField, from);
+ if (sepIndex == -1) {
+ qCWarning(lcStorageInfo,
+ "Malformed line (missing '-' separator field) while parsing '%s':\n%s",
+ MountInfoPath, line.constData());
+ fields.fill({});
+ return;
+ }
+
+ from = sepIndex + strlen(separatorField);
+ // Continue parsing at FsType field
+ fieldIndex = FsType;
+ continue;
+ }
+
+ if (from + 1 < len)
+ ++from; // Skip the space at spaceIndex
+
+ ++fieldIndex;
+ }
+
+ // Currently we don't use the last field, so just check the index
+ if (fieldIndex != SuperOptions) {
+ qCInfo(lcStorageInfo,
+ "Expected %d fields while parsing line from '%s', but found %zu instead:\n%.*s",
+ FieldCount, MountInfoPath, fieldIndex, int(line.size()), line.data());
+ fields.fill({});
+ }
+}
+
+// parseMountInfo() is called from:
+// - QStorageInfoPrivate::initRootPath(), where a list of all mounted volumes is needed
+// - QStorageInfoPrivate::mountedVolumes(), where some filesystem types are ignored
+// (see shouldIncludefs())
+enum class FilterMountInfo {
+ All,
+ Filtered,
+};
+
+[[maybe_unused]] static std::vector<MountInfo>
+doParseMountInfo(const QByteArray &mountinfo, FilterMountInfo filter = FilterMountInfo::All)
+{
+ // https://www.kernel.org/doc/Documentation/filesystems/proc.txt:
+ // 36 35 98:0 /mnt1 /mnt2 rw,noatime master:1 - ext3 /dev/root rw,errors=continue
+ // (1)(2)(3) (4) (5) (6) (7) (8) (9) (10) (11)
+
+ auto it = mountinfo.cbegin();
+ const auto end = mountinfo.cend();
+ auto nextLine = [&it, &end]() -> QByteArrayView {
+ auto nIt = std::find(it, end, '\n');
+ if (nIt != end) {
+ QByteArrayView ba(it, nIt);
+ it = ++nIt; // Advance
+ return ba;
+ }
+ return {};
+ };
+
+ std::vector<MountInfo> infos;
+ std::array<QByteArrayView, FieldCount> fields;
+ QByteArrayView line;
+
+ auto checkField = [&line](QByteArrayView field) {
+ if (field.isEmpty()) {
+ qDebug("Failed to parse line from %s:\n%.*s", MountInfoPath, int(line.size()),
+ line.data());
+ return false;
+ }
+ return true;
+ };
+
+ // mountinfo has a stable format, no empty lines
+ while (!(line = nextLine()).isEmpty()) {
+ fields.fill({});
+ tokenizeLine(fields, line);
+
+ MountInfo info;
+ QByteArray mountP = parseMangledPath(fields[MountPoint]);
+ if (!checkField(mountP))
+ continue;
+ info.mountPoint = QFile::decodeName(mountP);
+
+ if (!checkField(fields[FsType]))
+ continue;
+ info.fsType = fields[FsType].toByteArray();
+
+ if (filter == FilterMountInfo::Filtered && !shouldIncludeFs(info.mountPoint, info.fsType))
+ continue;
+
+ std::optional<dev_t> devno = deviceNumber(fields[DevNo]);
+ if (!devno) {
+ checkField({});
+ continue;
+ }
+ info.stDev = *devno;
+
+ QByteArrayView fsRootView = fields[FsRoot];
+ if (!checkField(fsRootView))
+ continue;
+
+ // If the filesystem root is "/" -- it's not a *sub*-volume/bind-mount,
+ // in that case we leave info.fsRoot empty
+ if (fsRootView != "/") {
+ info.fsRoot = parseMangledPath(fsRootView);
+ if (!checkField(info.fsRoot))
+ continue;
+ }
+
+ info.device = parseMangledPath(fields[MountSource]);
+ if (!checkField(info.device))
+ continue;
+
+ infos.push_back(std::move(info));
+ }
+ return infos;
+}
+
+QT_END_NAMESPACE
+
+#endif // QSTORAGEINFO_LINUX_P_H
diff --git a/src/corelib/io/qstorageinfo_mac.cpp b/src/corelib/io/qstorageinfo_mac.cpp
index 8b06543d71..c6c0f501da 100644
--- a/src/corelib/io/qstorageinfo_mac.cpp
+++ b/src/corelib/io/qstorageinfo_mac.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2014 Ivan Komissarov <ABBAPOH@gmail.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2014 Ivan Komissarov <ABBAPOH@gmail.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qstorageinfo_p.h"
@@ -79,9 +43,9 @@ void QStorageInfoPrivate::retrievePosixInfo()
QT_STATFSBUF statfs_buf;
int result = QT_STATFS(QFile::encodeName(rootPath).constData(), &statfs_buf);
if (result == 0) {
- device = QByteArray(statfs_buf.f_mntfromname);
+ device.assign(statfs_buf.f_mntfromname);
readOnly = (statfs_buf.f_flags & MNT_RDONLY) != 0;
- fileSystemType = QByteArray(statfs_buf.f_fstypename);
+ fileSystemType.assign(statfs_buf.f_fstypename);
blockSize = statfs_buf.f_bsize;
}
}
@@ -196,9 +160,4 @@ QList<QStorageInfo> QStorageInfoPrivate::mountedVolumes()
return volumes;
}
-QStorageInfo QStorageInfoPrivate::root()
-{
- return QStorageInfo(QStringLiteral("/"));
-}
-
QT_END_NAMESPACE
diff --git a/src/corelib/io/qstorageinfo_p.h b/src/corelib/io/qstorageinfo_p.h
index c0f7595c08..3af4b81ca4 100644
--- a/src/corelib/io/qstorageinfo_p.h
+++ b/src/corelib/io/qstorageinfo_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2014 Ivan Komissarov <ABBAPOH@gmail.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2014 Ivan Komissarov <ABBAPOH@gmail.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QSTORAGEINFO_P_H
#define QSTORAGEINFO_P_H
@@ -51,36 +15,77 @@
// We mean it.
//
+#include <QtCore/qloggingcategory.h>
+#include <QtCore/qsystemdetection.h>
+#include <QtCore/qtenvironmentvariables.h>
#include <QtCore/private/qglobal_p.h>
#include "qstorageinfo.h"
+#ifdef Q_OS_UNIX
+#include <sys/types.h> // dev_t
+#endif
+
QT_BEGIN_NAMESPACE
+inline Q_LOGGING_CATEGORY(lcStorageInfo, "qt.core.qstorageinfo", QtWarningMsg)
+
class QStorageInfoPrivate : public QSharedData
{
public:
- inline QStorageInfoPrivate() : QSharedData(),
- bytesTotal(-1), bytesFree(-1), bytesAvailable(-1), blockSize(-1),
- readOnly(false), ready(false), valid(false)
- {}
+ QStorageInfoPrivate() = default;
- void initRootPath();
void doStat();
static QList<QStorageInfo> mountedVolumes();
- static QStorageInfo root();
+
+ static QStorageInfo root()
+ {
+#ifdef Q_OS_WIN
+ return QStorageInfo(QDir::fromNativeSeparators(QFile::decodeName(qgetenv("SystemDrive"))));
+#else
+ return QStorageInfo(QStringLiteral("/"));
+#endif
+ };
protected:
#if defined(Q_OS_WIN)
+ void initRootPath();
void retrieveVolumeInfo();
void retrieveDiskFreeSpace();
bool queryStorageProperty();
void queryFileFsSectorSizeInformation();
-#elif defined(Q_OS_MAC)
+#elif defined(Q_OS_DARWIN)
+ void initRootPath();
void retrievePosixInfo();
void retrieveUrlProperties(bool initRootPath = false);
void retrieveLabel();
+#elif defined(Q_OS_LINUX)
+ void retrieveVolumeInfo();
+
+public:
+ struct MountInfo {
+ QString mountPoint;
+ QByteArray fsType;
+ QByteArray device;
+ QByteArray fsRoot;
+ dev_t stDev = 0;
+ };
+
+ void setFromMountInfo(MountInfo &&info)
+ {
+ rootPath = std::move(info.mountPoint);
+ fileSystemType = std::move(info.fsType);
+ device = std::move(info.device);
+ subvolume = std::move(info.fsRoot);
+ }
+
+ QStorageInfoPrivate(MountInfo &&info)
+ {
+ setFromMountInfo(std::move(info));
+ }
+
#elif defined(Q_OS_UNIX)
+ void initRootPath();
void retrieveVolumeInfo();
#endif
@@ -91,16 +96,68 @@ public:
QByteArray fileSystemType;
QString name;
- qint64 bytesTotal;
- qint64 bytesFree;
- qint64 bytesAvailable;
- int blockSize;
+ qint64 bytesTotal = -1;
+ qint64 bytesFree = -1;
+ qint64 bytesAvailable = -1;
+ int blockSize = -1;
- bool readOnly;
- bool ready;
- bool valid;
+ bool readOnly = false;
+ bool ready = false;
+ bool valid = false;
};
+// Common helper functions
+template <typename String>
+static bool isParentOf(const String &parent, const QString &dirName)
+{
+ return dirName.startsWith(parent) &&
+ (dirName.size() == parent.size() || dirName.at(parent.size()) == u'/' ||
+ parent.size() == 1);
+}
+
+static inline bool shouldIncludeFs(const QString &mountDir, const QByteArray &fsType)
+{
+#if defined(Q_OS_ANDROID)
+ // "rootfs" is the filesystem type of "/" on Android
+ static constexpr char RootFsStr[] = "";
+#else
+ // "rootfs" is a type of ramfs on Linux, used in the initrd on some distros
+ static constexpr char RootFsStr[] = "rootfs";
+#endif
+
+ using namespace Qt::StringLiterals;
+ /*
+ * This function implements a heuristic algorithm to determine whether a
+ * given mount should be reported to the user. Our objective is to list
+ * only entries that the end-user would find useful.
+ *
+ * We therefore ignore:
+ * - mounted in /dev, /proc, /sys: special mounts
+ * (this will catch /sys/fs/cgroup, /proc/sys/fs/binfmt_misc, /dev/pts,
+ * some of which are tmpfs on Linux)
+ * - mounted in /var/run or /var/lock: most likely pseudofs
+ * (on earlier systemd versions, /var/run was a bind-mount of /run, so
+ * everything would be unnecessarily duplicated)
+ * - filesystem type is "rootfs": artifact of the root-pivot on some Linux
+ * initrd
+ * - if the filesystem total size is zero, it's a pseudo-fs (not checked here).
+ */
+
+ if (isParentOf("/dev"_L1, mountDir)
+ || isParentOf("/proc"_L1, mountDir)
+ || isParentOf("/sys"_L1, mountDir)
+ || isParentOf("/var/run"_L1, mountDir)
+ || isParentOf("/var/lock"_L1, mountDir)) {
+ return false;
+ }
+
+ if (!fsType.isEmpty() && fsType == RootFsStr)
+ return false;
+
+ // size checking in QStorageInfo::mountedVolumes()
+ return true;
+}
+
QT_END_NAMESPACE
#endif // QSTORAGEINFO_P_H
diff --git a/src/corelib/io/qstorageinfo_stub.cpp b/src/corelib/io/qstorageinfo_stub.cpp
new file mode 100644
index 0000000000..f2f7d2eb65
--- /dev/null
+++ b/src/corelib/io/qstorageinfo_stub.cpp
@@ -0,0 +1,25 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#include "qstorageinfo_p.h"
+
+QT_BEGIN_NAMESPACE
+
+void QStorageInfoPrivate::initRootPath()
+{
+ Q_UNIMPLEMENTED();
+ rootPath = QString();
+}
+
+void QStorageInfoPrivate::doStat()
+{
+ Q_UNIMPLEMENTED();
+}
+
+QList<QStorageInfo> QStorageInfoPrivate::mountedVolumes()
+{
+ Q_UNIMPLEMENTED();
+ return QList<QStorageInfo>();
+}
+
+QT_END_NAMESPACE
diff --git a/src/corelib/io/qstorageinfo_unix.cpp b/src/corelib/io/qstorageinfo_unix.cpp
index 566ffe46bc..9df098a389 100644
--- a/src/corelib/io/qstorageinfo_unix.cpp
+++ b/src/corelib/io/qstorageinfo_unix.cpp
@@ -1,47 +1,10 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Copyright (C) 2014 Ivan Komissarov <ABBAPOH@gmail.com>
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// Copyright (C) 2014 Ivan Komissarov <ABBAPOH@gmail.com>
+// Copyright (C) 2016 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qstorageinfo_p.h"
-#include <QtCore/qdiriterator.h>
#include <QtCore/qfileinfo.h>
#include <QtCore/qtextstream.h>
@@ -54,11 +17,7 @@
#if defined(Q_OS_BSD4)
# include <sys/mount.h>
# include <sys/statvfs.h>
-#elif defined(Q_OS_ANDROID)
-# include <sys/mount.h>
-# include <sys/vfs.h>
-# include <mntent.h>
-#elif defined(Q_OS_LINUX) || defined(Q_OS_HURD)
+#elif defined(Q_OS_HURD)
# include <mntent.h>
# include <sys/statvfs.h>
# include <sys/sysmacros.h>
@@ -91,12 +50,6 @@
# if !defined(_STATFS_F_FLAGS) && !defined(Q_OS_NETBSD)
# define _STATFS_F_FLAGS 1
# endif
-#elif defined(Q_OS_ANDROID)
-# define QT_STATFS ::statfs
-# define QT_STATFSBUF struct statfs
-# if !defined(ST_RDONLY)
-# define ST_RDONLY 1 // hack for missing define on Android
-# endif
#elif defined(Q_OS_HAIKU)
# define QT_STATFSBUF struct statvfs
# define QT_STATFS ::statvfs
@@ -119,6 +72,8 @@
QT_BEGIN_NAMESPACE
+using namespace Qt::StringLiterals;
+
class QStorageIterator
{
public:
@@ -140,43 +95,10 @@ private:
#elif defined(Q_OS_SOLARIS)
FILE *fp;
mnttab mnt;
-#elif defined(Q_OS_ANDROID)
- QFile file;
- QByteArray m_rootPath;
- QByteArray m_fileSystemType;
- QByteArray m_device;
- QByteArray m_options;
-#elif defined(Q_OS_LINUX) || defined(Q_OS_HURD)
- struct mountinfoent : public mntent {
- // Details from proc(5) section from /proc/<pid>/mountinfo:
- //(1) mount ID: a unique ID for the mount (may be reused after umount(2)).
- int mount_id;
- //(2) parent ID: the ID of the parent mount (or of self for the top of the mount tree).
-// int parent_id;
- //(3) major:minor: the value of st_dev for files on this filesystem (see stat(2)).
- dev_t rdev;
- //(4) root: the pathname of the directory in the filesystem which forms the root of this mount.
- char *subvolume;
- //(5) mount point: the pathname of the mount point relative to the process's root directory.
-// char *mnt_dir; // in mntent
- //(6) mount options: per-mount options.
-// char *mnt_opts; // in mntent
- //(7) optional fields: zero or more fields of the form "tag[:value]"; see below.
-// int flags;
- //(8) separator: the end of the optional fields is marked by a single hyphen.
-
- //(9) filesystem type: the filesystem type in the form "type[.subtype]".
-// char *mnt_type; // in mntent
- //(10) mount source: filesystem-specific information or "none".
-// char *mnt_fsname; // in mntent
- //(11) super options: per-superblock options.
- char *superopts;
- };
-
+#elif defined(Q_OS_HURD)
FILE *fp;
QByteArray buffer;
mountinfoent mnt;
- bool usingMountinfo;
#elif defined(Q_OS_HAIKU)
BVolumeRoster m_volumeRoster;
@@ -186,51 +108,6 @@ private:
#endif
};
-template <typename String>
-static bool isParentOf(const String &parent, const QString &dirName)
-{
- return dirName.startsWith(parent) &&
- (dirName.size() == parent.size() || dirName.at(parent.size()) == QLatin1Char('/') ||
- parent.size() == 1);
-}
-
-static bool shouldIncludeFs(const QStorageIterator &it)
-{
- /*
- * This function implements a heuristic algorithm to determine whether a
- * given mount should be reported to the user. Our objective is to list
- * only entries that the end-user would find useful.
- *
- * We therefore ignore:
- * - mounted in /dev, /proc, /sys: special mounts
- * (this will catch /sys/fs/cgroup, /proc/sys/fs/binfmt_misc, /dev/pts,
- * some of which are tmpfs on Linux)
- * - mounted in /var/run or /var/lock: most likely pseudofs
- * (on earlier systemd versions, /var/run was a bind-mount of /run, so
- * everything would be unnecessarily duplicated)
- * - filesystem type is "rootfs": artifact of the root-pivot on some Linux
- * initrd
- * - if the filesystem total size is zero, it's a pseudo-fs (not checked here).
- */
-
- QString mountDir = it.rootPath();
- if (isParentOf(QLatin1String("/dev"), mountDir)
- || isParentOf(QLatin1String("/proc"), mountDir)
- || isParentOf(QLatin1String("/sys"), mountDir)
- || isParentOf(QLatin1String("/var/run"), mountDir)
- || isParentOf(QLatin1String("/var/lock"), mountDir)) {
- return false;
- }
-
-#if defined(Q_OS_LINUX) && !defined(Q_OS_ANDROID)
- if (it.fileSystemType() == "rootfs")
- return false;
-#endif
-
- // size checking in mountedVolumes()
- return true;
-}
-
#if defined(Q_OS_BSD4)
#ifndef MNT_NOWAIT
@@ -324,67 +201,8 @@ inline QByteArray QStorageIterator::subvolume() const
{
return QByteArray();
}
-#elif defined(Q_OS_ANDROID)
-
-inline QStorageIterator::QStorageIterator()
-{
- file.setFileName(QString::fromUtf8(_PATH_MOUNTED));
- file.open(QIODevice::ReadOnly | QIODevice::Text);
-}
-
-inline QStorageIterator::~QStorageIterator()
-{
-}
-
-inline bool QStorageIterator::isValid() const
-{
- return file.isOpen();
-}
-
-inline bool QStorageIterator::next()
-{
- QList<QByteArray> data;
- // If file is virtual, file.readLine() may succeed even when file.atEnd().
- do {
- const QByteArray line = file.readLine();
- if (line.isEmpty() && file.atEnd())
- return false;
- data = line.split(' ');
- } while (data.count() < 4);
-
- m_device = data.at(0);
- m_rootPath = data.at(1);
- m_fileSystemType = data.at(2);
- m_options = data.at(3);
-
- return true;
-}
-
-inline QString QStorageIterator::rootPath() const
-{
- return QFile::decodeName(m_rootPath);
-}
-
-inline QByteArray QStorageIterator::fileSystemType() const
-{
- return m_fileSystemType;
-}
-
-inline QByteArray QStorageIterator::device() const
-{
- return m_device;
-}
-
-inline QByteArray QStorageIterator::options() const
-{
- return m_options;
-}
-inline QByteArray QStorageIterator::subvolume() const
-{
- return QByteArray();
-}
-#elif defined(Q_OS_LINUX) || defined(Q_OS_HURD)
+#elif defined(Q_OS_HURD)
static const int bufferSize = 1024; // 2 paths (mount point+device) and metainfo;
// should be enough
@@ -392,28 +210,13 @@ static const int bufferSize = 1024; // 2 paths (mount point+device) and metainfo
inline QStorageIterator::QStorageIterator() :
buffer(QByteArray(bufferSize, 0))
{
- fp = nullptr;
-
-#ifdef Q_OS_LINUX
- // first, try to open /proc/self/mountinfo, which has more details
- fp = ::fopen("/proc/self/mountinfo", "re");
-#endif
- if (fp) {
- usingMountinfo = true;
- } else {
- usingMountinfo = false;
- fp = ::setmntent(_PATH_MOUNTED, "r");
- }
+ fp = ::setmntent(_PATH_MOUNTED, "r");
}
inline QStorageIterator::~QStorageIterator()
{
- if (fp) {
- if (usingMountinfo)
- ::fclose(fp);
- else
- ::endmntent(fp);
- }
+ if (fp)
+ ::endmntent(fp);
}
inline bool QStorageIterator::isValid() const
@@ -423,137 +226,7 @@ inline bool QStorageIterator::isValid() const
inline bool QStorageIterator::next()
{
- mnt.subvolume = nullptr;
- mnt.superopts = nullptr;
- if (!usingMountinfo)
- return ::getmntent_r(fp, &mnt, buffer.data(), buffer.size()) != nullptr;
-
- // Helper function to parse paths that the kernel inserts escape sequences
- // for. The unescaped string is left at \a src and is properly
- // NUL-terminated. Returns a pointer to the delimiter that terminated the
- // path, or nullptr if it failed.
- auto parseMangledPath = [](char *src) {
- // The kernel escapes with octal the following characters:
- // space ' ', tab '\t', backslask '\\', and newline '\n'
- char *dst = src;
- while (*src) {
- switch (*src) {
- case ' ':
- // Unescaped space: end of the field.
- *dst = '\0';
- return src;
-
- default:
- *dst++ = *src++;
- break;
-
- case '\\':
- // It always uses exactly three octal characters.
- ++src;
- char c = (*src++ - '0') << 6;
- c |= (*src++ - '0') << 3;
- c |= (*src++ - '0');
- *dst++ = c;
- break;
- }
- }
-
- // Found a NUL before the end of the field.
- src = nullptr;
- return src;
- };
-
- char *ptr = buffer.data();
- if (fgets(ptr, buffer.size(), fp) == nullptr)
- return false;
-
- size_t len = strlen(ptr);
- if (len == 0)
- return false;
- while (Q_UNLIKELY(ptr[len - 1] != '\n' && !feof(fp))) {
- // buffer wasn't large enough. Enlarge and try again.
- // (we're readidng from the kernel, so OOM is unlikely)
- buffer.resize((buffer.size() + 4096) & ~4095);
- ptr = buffer.data();
- if (fgets(ptr + len, buffer.size() - len, fp) == nullptr)
- return false;
-
- len += strlen(ptr + len);
- Q_ASSERT(len < size_t(buffer.size()));
- }
- ptr[len - 1] = '\0';
- const char *const stop = ptr + len - 1;
-
- // parse the line
- bool ok;
- mnt.mnt_freq = 0;
- mnt.mnt_passno = 0;
-
- mnt.mount_id = qstrntoll(ptr, stop - ptr, const_cast<const char **>(&ptr), 10, &ok);
- if (!ok)
- return false;
-
- int parent_id = qstrntoll(ptr, stop - ptr, const_cast<const char **>(&ptr), 10, &ok);
- Q_UNUSED(parent_id);
- if (!ok)
- return false;
-
- int rdevmajor = qstrntoll(ptr, stop - ptr, const_cast<const char **>(&ptr), 10, &ok);
- if (!ok)
- return false;
- if (*ptr != ':')
- return false;
- int rdevminor = qstrntoll(ptr + 1, stop - ptr - 1, const_cast<const char **>(&ptr), 10, &ok);
- if (!ok)
- return false;
- mnt.rdev = makedev(rdevmajor, rdevminor);
-
- if (*ptr != ' ')
- return false;
-
- mnt.subvolume = ++ptr;
- ptr = parseMangledPath(ptr);
- if (!ptr)
- return false;
-
- // unset a subvolume of "/" -- it's not a *sub* volume
- if (mnt.subvolume + 1 == ptr)
- *mnt.subvolume = '\0';
-
- mnt.mnt_dir = ++ptr;
- ptr = parseMangledPath(ptr);
- if (!ptr)
- return false;
-
- mnt.mnt_opts = ++ptr;
- ptr = strchr(ptr, ' ');
- if (!ptr)
- return false;
-
- // we don't parse the flags, so just find the separator
- if (char *const dashed = strstr(ptr, " - ")) {
- *ptr = '\0';
- ptr = dashed + strlen(" - ") - 1;
- } else {
- return false;
- }
-
- mnt.mnt_type = ++ptr;
- ptr = strchr(ptr, ' ');
- if (!ptr)
- return false;
- *ptr = '\0';
-
- mnt.mnt_fsname = ++ptr;
- ptr = parseMangledPath(ptr);
- if (!ptr)
- return false;
-
- mnt.superopts = ++ptr;
- ptr += strcspn(ptr, " \n");
- *ptr = '\0';
-
- return true;
+ return ::getmntent_r(fp, &mnt, buffer.data(), buffer.size()) != nullptr;
}
inline QString QStorageIterator::rootPath() const
@@ -568,47 +241,17 @@ inline QByteArray QStorageIterator::fileSystemType() const
inline QByteArray QStorageIterator::device() const
{
- // check that the device exists
- if (mnt.mnt_fsname[0] == '/' && access(mnt.mnt_fsname, F_OK) != 0) {
- // It doesn't, so let's try to resolve the dev_t from /dev/block.
- // Note how strlen("4294967295") == digits10 + 1, so we need to add 1
- // for each number, plus the ':'.
- char buf[sizeof("/dev/block/") + 2 * std::numeric_limits<unsigned>::digits10 + 3];
- QByteArray dev(PATH_MAX, Qt::Uninitialized);
- char *devdata = dev.data();
-
- snprintf(buf, sizeof(buf), "/dev/block/%u:%u", major(mnt.rdev), minor(mnt.rdev));
- if (realpath(buf, devdata)) {
- dev.truncate(strlen(devdata));
- return dev;
- }
- }
return QByteArray(mnt.mnt_fsname);
}
inline QByteArray QStorageIterator::options() const
{
- // Merge the two options, starting with the superblock options and letting
- // the per-mount options override.
- const char *superopts = mnt.superopts;
-
- // Both mnt_opts and superopts start with "ro" or "rw", so we can skip the
- // superblock's field (see show_mountinfo() in fs/proc_namespace.c).
- if (superopts && superopts[0] == 'r') {
- if (superopts[2] == '\0') // no other superopts besides "ro" / "rw"?
- superopts = nullptr;
- else if (superopts[2] == ',')
- superopts += 3;
- }
-
- if (superopts)
- return QByteArray(superopts) + ',' + mnt.mnt_opts;
return QByteArray(mnt.mnt_opts);
}
inline QByteArray QStorageIterator::subvolume() const
{
- return QByteArray(mnt.subvolume);
+ return QByteArray();
}
#elif defined(Q_OS_HAIKU)
inline QStorageIterator::QStorageIterator()
@@ -676,6 +319,7 @@ inline QByteArray QStorageIterator::subvolume() const
{
return QByteArray();
}
+
#else
inline QStorageIterator::QStorageIterator()
@@ -722,84 +366,9 @@ inline QByteArray QStorageIterator::subvolume() const
}
#endif
-void QStorageInfoPrivate::initRootPath()
-{
- rootPath = QFileInfo(rootPath).canonicalFilePath();
-
- if (rootPath.isEmpty())
- return;
-
- QStorageIterator it;
- if (!it.isValid()) {
- rootPath = QStringLiteral("/");
- return;
- }
-
- int maxLength = 0;
- const QString oldRootPath = rootPath;
- rootPath.clear();
-
- while (it.next()) {
- const QString mountDir = it.rootPath();
- const QByteArray fsName = it.fileSystemType();
- // we try to find most suitable entry
- if (isParentOf(mountDir, oldRootPath) && maxLength < mountDir.length()) {
- maxLength = mountDir.length();
- rootPath = mountDir;
- device = it.device();
- fileSystemType = fsName;
- subvolume = it.subvolume();
- }
- }
-}
-
-#ifdef Q_OS_LINUX
-// udev encodes the labels with ID_LABEL_FS_ENC which is done with
-// blkid_encode_string(). Within this function some 1-byte utf-8
-// characters not considered safe (e.g. '\' or ' ') are encoded as hex
-static QString decodeFsEncString(const QString &str)
-{
- QString decoded;
- decoded.reserve(str.size());
-
- int i = 0;
- while (i < str.size()) {
- if (i <= str.size() - 4) { // we need at least four characters \xAB
- if (str.at(i) == QLatin1Char('\\') &&
- str.at(i+1) == QLatin1Char('x')) {
- bool bOk;
- const int code = QStringView{str}.mid(i+2, 2).toInt(&bOk, 16);
- // only decode characters between 0x20 and 0x7f but not
- // the backslash to prevent collisions
- if (bOk && code >= 0x20 && code < 0x80 && code != '\\') {
- decoded += QChar(code);
- i += 4;
- continue;
- }
- }
- }
- decoded += str.at(i);
- ++i;
- }
- return decoded;
-}
-#endif
-
static inline QString retrieveLabel(const QByteArray &device)
{
-#ifdef Q_OS_LINUX
- static const char pathDiskByLabel[] = "/dev/disk/by-label";
-
- QFileInfo devinfo(QFile::decodeName(device));
- QString devicePath = devinfo.canonicalFilePath();
-
- QDirIterator it(QLatin1String(pathDiskByLabel), QDir::NoDotAndDotDot);
- while (it.hasNext()) {
- QFileInfo fileInfo = it.nextFileInfo();
- if (fileInfo.isSymLink() && fileInfo.symLinkTarget() == devicePath)
- return decodeFsEncString(fileInfo.fileName());
- }
-#elif defined Q_OS_HAIKU
+#if defined Q_OS_HAIKU
fs_info fsInfo;
memset(&fsInfo, 0, sizeof(fsInfo));
@@ -833,7 +402,7 @@ void QStorageInfoPrivate::retrieveVolumeInfo()
{
QT_STATFSBUF statfs_buf;
int result;
- EINTR_LOOP(result, QT_STATFS(QFile::encodeName(rootPath).constData(), &statfs_buf));
+ QT_EINTR_LOOP(result, QT_STATFS(QFile::encodeName(rootPath).constData(), &statfs_buf));
if (result == 0) {
valid = true;
ready = true;
@@ -847,7 +416,7 @@ void QStorageInfoPrivate::retrieveVolumeInfo()
bytesFree = statfs_buf.f_bfree * statfs_buf.f_frsize;
bytesAvailable = statfs_buf.f_bavail * statfs_buf.f_frsize;
#endif
- blockSize = statfs_buf.f_bsize;
+ blockSize = int(statfs_buf.f_bsize);
#if defined(Q_OS_ANDROID) || defined(Q_OS_BSD4) || defined(Q_OS_INTEGRITY) || defined(Q_OS_RTEMS)
#if defined(_STATFS_F_FLAGS)
readOnly = (statfs_buf.f_flags & ST_RDONLY) != 0;
@@ -858,6 +427,37 @@ void QStorageInfoPrivate::retrieveVolumeInfo()
}
}
+void QStorageInfoPrivate::initRootPath()
+{
+ rootPath = QFileInfo(rootPath).canonicalFilePath();
+
+ if (rootPath.isEmpty())
+ return;
+
+ QStorageIterator it;
+ if (!it.isValid()) {
+ rootPath = QStringLiteral("/");
+ return;
+ }
+
+ int maxLength = 0;
+ const QString oldRootPath = rootPath;
+ rootPath.clear();
+
+ while (it.next()) {
+ const QString mountDir = it.rootPath();
+ const QByteArray fsName = it.fileSystemType();
+ // we try to find most suitable entry
+ if (maxLength < mountDir.size() && isParentOf(mountDir, oldRootPath)) {
+ maxLength = mountDir.size();
+ rootPath = mountDir;
+ device = it.device();
+ fileSystemType = fsName;
+ subvolume = it.subvolume();
+ }
+ }
+}
+
QList<QStorageInfo> QStorageInfoPrivate::mountedVolumes()
{
QStorageIterator it;
@@ -867,7 +467,7 @@ QList<QStorageInfo> QStorageInfoPrivate::mountedVolumes()
QList<QStorageInfo> volumes;
while (it.next()) {
- if (!shouldIncludeFs(it))
+ if (!shouldIncludeFs(it.rootPath(), it.fileSystemType()))
continue;
const QString mountDir = it.rootPath();
@@ -875,7 +475,7 @@ QList<QStorageInfo> QStorageInfoPrivate::mountedVolumes()
info.d->device = it.device();
info.d->fileSystemType = it.fileSystemType();
info.d->subvolume = it.subvolume();
- if (info.bytesTotal() == 0 && info != root())
+ if (info.bytesTotal() <= 0 && info != root())
continue;
volumes.append(info);
}
@@ -883,9 +483,4 @@ QList<QStorageInfo> QStorageInfoPrivate::mountedVolumes()
return volumes;
}
-QStorageInfo QStorageInfoPrivate::root()
-{
- return QStorageInfo(QStringLiteral("/"));
-}
-
QT_END_NAMESPACE
diff --git a/src/corelib/io/qstorageinfo_win.cpp b/src/corelib/io/qstorageinfo_win.cpp
index d594551425..3ee1df9f3c 100644
--- a/src/corelib/io/qstorageinfo_win.cpp
+++ b/src/corelib/io/qstorageinfo_win.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2014 Ivan Komissarov <ABBAPOH@gmail.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2014 Ivan Komissarov <ABBAPOH@gmail.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qstorageinfo_p.h"
@@ -51,6 +15,8 @@
QT_BEGIN_NAMESPACE
+using namespace Qt::StringLiterals;
+
static const int defaultBufferSize = MAX_PATH + 1;
static QString canonicalPath(const QString &rootPath)
@@ -59,16 +25,16 @@ static QString canonicalPath(const QString &rootPath)
if (path.isEmpty())
return path;
- if (path.startsWith(QLatin1String("\\\\?\\")))
+ if (path.startsWith("\\\\?\\"_L1))
path.remove(0, 4);
- if (path.length() < 2 || path.at(1) != QLatin1Char(':'))
+ if (path.length() < 2 || path.at(1) != u':')
return QString();
path[0] = path[0].toUpper();
if (!(path.at(0).unicode() >= 'A' && path.at(0).unicode() <= 'Z'))
return QString();
- if (!path.endsWith(QLatin1Char('\\')))
- path.append(QLatin1Char('\\'));
+ if (!path.endsWith(u'\\'))
+ path.append(u'\\');
return path;
}
@@ -204,11 +170,6 @@ QList<QStorageInfo> QStorageInfoPrivate::mountedVolumes()
return volumes;
}
-QStorageInfo QStorageInfoPrivate::root()
-{
- return QStorageInfo(QDir::fromNativeSeparators(QFile::decodeName(qgetenv("SystemDrive"))));
-}
-
bool QStorageInfoPrivate::queryStorageProperty()
{
QString path = QDir::toNativeSeparators(uR"(\\.\)" + rootPath);
@@ -242,14 +203,14 @@ bool QStorageInfoPrivate::queryStorageProperty()
nullptr);
CloseHandle(handle);
if (result)
- blockSize = saad.BytesPerPhysicalSector;
+ blockSize = int(saad.BytesPerPhysicalSector);
return result;
}
struct Helper
{
QBasicMutex mutex;
- QSystemLibrary ntdll {u"ntdll"_qs};
+ QSystemLibrary ntdll {u"ntdll"_s};
};
Q_GLOBAL_STATIC(Helper, gNtdllHelper)
diff --git a/src/corelib/io/qtemporarydir.cpp b/src/corelib/io/qtemporarydir.cpp
index db35256704..8187524067 100644
--- a/src/corelib/io/qtemporarydir.cpp
+++ b/src/corelib/io/qtemporarydir.cpp
@@ -1,50 +1,12 @@
-/****************************************************************************
-**
-** Copyright (C) 2017 The Qt Company Ltd.
-** Copyright (C) 2017 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2017 The Qt Company Ltd.
+// Copyright (C) 2017 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qtemporarydir.h"
-#ifndef QT_NO_TEMPORARYFILE
+#if QT_CONFIG(temporaryfile)
#include "qdebug.h"
-#include "qdiriterator.h"
-#include "qpair.h"
#include "qplatformdefs.h"
#include "qrandom.h"
#include "private/qtemporaryfile_p.h"
@@ -57,8 +19,15 @@
#include <errno.h>
#endif
+#include <type_traits>
+
QT_BEGIN_NAMESPACE
+using namespace Qt::StringLiterals;
+
+static_assert(std::is_nothrow_move_constructible_v<QTemporaryDir>);
+static_assert(std::is_nothrow_move_assignable_v<QTemporaryDir>);
+
//************* QTemporaryDirPrivate
class QTemporaryDirPrivate
{
@@ -90,9 +59,9 @@ static QString defaultTemplateName()
baseName = QCoreApplication::applicationName();
if (baseName.isEmpty())
#endif
- baseName = QLatin1String("qt_temp");
+ baseName = "qt_temp"_L1;
- return QDir::tempPath() + QLatin1Char('/') + baseName + QLatin1String("-XXXXXX");
+ return QDir::tempPath() + u'/' + baseName + "-XXXXXX"_L1;
}
void QTemporaryDirPrivate::create(const QString &templateName)
@@ -198,6 +167,39 @@ QTemporaryDir::QTemporaryDir(const QString &templatePath)
}
/*!
+ \fn QTemporaryDir::QTemporaryDir(QTemporaryDir &&other)
+
+ Move-constructs a new QTemporaryDir from \a other.
+
+ \note The moved-from object \a other is placed in a
+ partially-formed state, in which the only valid operations are
+ destruction and assignment of a new value.
+
+ \since 6.4
+*/
+
+/*!
+ \fn QTemporaryDir &QTemporaryDir::operator=(QTemporaryDir&& other)
+
+ Move-assigns \a other to this QTemporaryDir instance.
+
+ \note The moved-from object \a other is placed in a
+ partially-formed state, in which the only valid operations are
+ destruction and assignment of a new value.
+
+ \since 6.4
+*/
+
+/*!
+ \fn void QTemporaryDir::swap(QTemporaryDir &other)
+
+ Swaps temporary-dir \a other with this temporary-dir. This operation is
+ very fast and never fails.
+
+ \since 6.4
+*/
+
+/*!
Destroys the temporary directory object.
If auto remove mode was set, it will automatically delete the directory
including all its contents.
@@ -206,8 +208,12 @@ QTemporaryDir::QTemporaryDir(const QString &templatePath)
*/
QTemporaryDir::~QTemporaryDir()
{
- if (d_ptr->autoRemove)
- remove();
+ if (d_ptr) {
+ if (d_ptr->autoRemove)
+ remove();
+
+ delete d_ptr;
+ }
}
/*!
@@ -260,7 +266,7 @@ QString QTemporaryDir::filePath(const QString &fileName) const
QString ret = d_ptr->pathOrError;
if (!fileName.isEmpty()) {
- ret += QLatin1Char('/');
+ ret += u'/';
ret += fileName;
}
return ret;
@@ -305,7 +311,7 @@ bool QTemporaryDir::remove()
if (!d_ptr->success)
return false;
Q_ASSERT(!path().isEmpty());
- Q_ASSERT(path() != QLatin1String("."));
+ Q_ASSERT(path() != "."_L1);
const bool result = QDir(path()).removeRecursively();
if (!result) {
@@ -318,4 +324,4 @@ bool QTemporaryDir::remove()
QT_END_NAMESPACE
-#endif // QT_NO_TEMPORARYFILE
+#endif // QT_CONFIG(temporaryfile)
diff --git a/src/corelib/io/qtemporarydir.h b/src/corelib/io/qtemporarydir.h
index 5864ce5cfc..8737bf9e26 100644
--- a/src/corelib/io/qtemporarydir.h
+++ b/src/corelib/io/qtemporarydir.h
@@ -1,52 +1,17 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QTEMPORARYDIR_H
#define QTEMPORARYDIR_H
+#include <QtCore/qglobal.h>
#include <QtCore/qdir.h>
#include <QtCore/qscopedpointer.h>
QT_BEGIN_NAMESPACE
-#ifndef QT_NO_TEMPORARYFILE
+#if QT_CONFIG(temporaryfile)
class QTemporaryDirPrivate;
@@ -55,8 +20,17 @@ class Q_CORE_EXPORT QTemporaryDir
public:
QTemporaryDir();
explicit QTemporaryDir(const QString &templateName);
+ QTemporaryDir(QTemporaryDir &&other) noexcept
+ : d_ptr{std::exchange(other.d_ptr, nullptr)}
+ { }
+
+ QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_MOVE_AND_SWAP(QTemporaryDir)
+
~QTemporaryDir();
+ void swap(QTemporaryDir &other) noexcept
+ { qt_ptr_swap(d_ptr, other.d_ptr); }
+
bool isValid() const;
QString errorString() const;
@@ -68,12 +42,17 @@ public:
QString filePath(const QString &fileName) const;
private:
- QScopedPointer<QTemporaryDirPrivate> d_ptr;
+ QTemporaryDirPrivate *d_ptr;
Q_DISABLE_COPY(QTemporaryDir)
};
-#endif // QT_NO_TEMPORARYFILE
+inline void swap(QTemporaryDir &lhs, QTemporaryDir &rhs) noexcept
+{
+ lhs.swap(rhs);
+}
+
+#endif // QT_CONFIG(temporaryfile)
QT_END_NAMESPACE
diff --git a/src/corelib/io/qtemporaryfile.cpp b/src/corelib/io/qtemporaryfile.cpp
index 4b587857a8..4e48a18d91 100644
--- a/src/corelib/io/qtemporaryfile.cpp
+++ b/src/corelib/io/qtemporaryfile.cpp
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2017 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2017 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qtemporaryfile.h"
@@ -59,6 +23,8 @@
QT_BEGIN_NAMESPACE
+using namespace Qt::StringLiterals;
+
#if defined(Q_OS_WIN)
typedef ushort Char;
@@ -79,19 +45,19 @@ QTemporaryFileName::QTemporaryFileName(const QString &templateName)
{
// Ensure there is a placeholder mask
QString qfilename = QDir::fromNativeSeparators(templateName);
- uint phPos = qfilename.length();
- uint phLength = 0;
+ qsizetype phPos = qfilename.size();
+ qsizetype phLength = 0;
while (phPos != 0) {
--phPos;
- if (qfilename[phPos] == QLatin1Char('X')) {
+ if (qfilename[phPos] == u'X') {
++phLength;
continue;
}
if (phLength >= 6
- || qfilename[phPos] == QLatin1Char('/')) {
+ || qfilename[phPos] == u'/') {
++phPos;
break;
}
@@ -101,15 +67,14 @@ QTemporaryFileName::QTemporaryFileName(const QString &templateName)
}
if (phLength < 6)
- qfilename.append(QLatin1String(".XXXXXX"));
+ qfilename.append(".XXXXXX"_L1);
// "Nativify" :-)
- QFileSystemEntry::NativePath filename = QFileSystemEngine::absoluteName(
- QFileSystemEntry(qfilename, QFileSystemEntry::FromInternalPath()))
- .nativeFilePath();
+ QFileSystemEntry::NativePath filename =
+ QFileSystemEntry(QDir::cleanPath(qfilename)).nativeFilePath();
// Find mask in native path
- phPos = filename.length();
+ phPos = filename.size();
phLength = 0;
while (phPos != 0) {
--phPos;
@@ -143,8 +108,8 @@ QTemporaryFileName::QTemporaryFileName(const QString &templateName)
QFileSystemEntry::NativePath QTemporaryFileName::generateNext()
{
Q_ASSERT(length != 0);
- Q_ASSERT(pos < path.length());
- Q_ASSERT(length <= path.length() - pos);
+ Q_ASSERT(pos < path.size());
+ Q_ASSERT(length <= path.size() - pos);
Char *const placeholderStart = (Char *)path.data() + pos;
Char *const placeholderEnd = placeholderStart + length;
@@ -191,13 +156,13 @@ QFileSystemEntry::NativePath QTemporaryFileName::generateNext()
return path;
}
-#ifndef QT_NO_TEMPORARYFILE
+#if QT_CONFIG(temporaryfile)
/*!
\internal
Generates a unique file path from the template \a templ and creates a new
- file based based on those parameters: the \c templ.length characters in \c
+ file based on those parameters: the \c templ.length characters in \c
templ.path starting at \c templ.pos will be replaced by a random sequence of
characters. \a mode specifies the file mode bits (not used on Windows).
@@ -219,8 +184,9 @@ static bool createFileFromTemplate(NativeFileHandle &file, QTemporaryFileName &t
const DWORD shareMode = (flags & QTemporaryFileEngine::Win32NonShared)
? 0u : (FILE_SHARE_READ | FILE_SHARE_WRITE);
+ const DWORD extraAccessFlags = (flags & QTemporaryFileEngine::Win32NonShared) ? DELETE : 0;
file = CreateFile((const wchar_t *)path.constData(),
- GENERIC_READ | GENERIC_WRITE,
+ GENERIC_READ | GENERIC_WRITE | extraAccessFlags,
shareMode, NULL, CREATE_NEW,
FILE_ATTRIBUTE_NORMAL, NULL);
@@ -425,6 +391,18 @@ bool QTemporaryFileEngine::renameOverwrite(const QString &newName)
QFSFileEngine::close();
return ok;
}
+#ifdef Q_OS_WIN
+ if (flags & Win32NonShared) {
+ QFileSystemEntry newEntry(newName, QFileSystemEntry::FromInternalPath());
+ bool ok = d_func()->nativeRenameOverwrite(newEntry);
+ QFSFileEngine::close();
+ if (ok) {
+ // Match what QFSFileEngine::renameOverwrite() does
+ setFileEntry(std::move(newEntry));
+ }
+ return ok;
+ }
+#endif
QFSFileEngine::close();
return QFSFileEngine::renameOverwrite(newName);
}
@@ -440,7 +418,7 @@ bool QTemporaryFileEngine::close()
QString QTemporaryFileEngine::fileName(QAbstractFileEngine::FileName file) const
{
if (isUnnamedFile()) {
- if (file == AbsoluteLinkTarget) {
+ if (file == AbsoluteLinkTarget || file == RawLinkPath) {
// we know our file isn't (won't be) a symlink
return QString();
}
@@ -576,9 +554,9 @@ QString QTemporaryFilePrivate::defaultTemplateName()
baseName = QCoreApplication::applicationName();
if (baseName.isEmpty())
#endif
- baseName = QLatin1String("qt_temp");
+ baseName = "qt_temp"_L1;
- return QDir::tempPath() + QLatin1Char('/') + baseName + QLatin1String(".XXXXXX");
+ return QDir::tempPath() + u'/' + baseName + ".XXXXXX"_L1;
}
//************* QTemporaryFile
@@ -620,6 +598,9 @@ QString QTemporaryFilePrivate::defaultTemplateName()
be placed into the temporary path as returned by QDir::tempPath().
If you specify your own filename, a relative file path will not be placed in the
temporary directory by default, but be relative to the current working directory.
+ It is important to specify the correct directory if the rename() function will be
+ called, as QTemporaryFile can only rename files within the same volume / filesystem
+ as the temporary file itself was created on.
Specified filenames can contain the following template \c XXXXXX
(six upper case "X" characters), which will be replaced by the
@@ -662,6 +643,12 @@ QTemporaryFile::QTemporaryFile()
}
/*!
+ \fn QTemporaryFile::QTemporaryFile(const std::filesystem::path &templateName, QObject *parent)
+ \overload
+ \since 6.7
+*/
+
+/*!
Constructs a QTemporaryFile with a template filename of \a
templateName. Upon opening the temporary file this will be used to create
a unique filename.
@@ -671,7 +658,11 @@ QTemporaryFile::QTemporaryFile()
If \a templateName is a relative path, the path will be relative to the
current working directory. You can use QDir::tempPath() to construct \a
- templateName if you want use the system's temporary directory.
+ templateName if you want use the system's temporary directory. It is
+ important to specify the correct directory if the rename() function will be
+ called, as QTemporaryFile can only rename files within the same volume /
+ filesystem as the temporary file itself was created on.
+
\sa open(), fileTemplate()
*/
@@ -704,7 +695,10 @@ QTemporaryFile::QTemporaryFile(QObject *parent)
If \a templateName is a relative path, the path will be relative to the
current working directory. You can use QDir::tempPath() to construct \a
- templateName if you want use the system's temporary directory.
+ templateName if you want use the system's temporary directory. It is
+ important to specify the correct directory if the rename() function will be
+ called, as QTemporaryFile can only rename files within the same volume /
+ filesystem as the temporary file itself was created on.
\sa open(), fileTemplate()
*/
@@ -737,7 +731,7 @@ QTemporaryFile::~QTemporaryFile()
return true upon success and will set the fileName() to the unique
filename used.
- \sa fileName()
+ \sa fileName(), QT_USE_NODISCARD_FILE_OPEN
*/
/*!
@@ -816,6 +810,12 @@ QString QTemporaryFile::fileTemplate() const
}
/*!
+ \fn void QTemporaryFile::setFileTemplate(const std::filesystem::path &name)
+ \overload
+ \since 6.7
+*/
+
+/*!
Sets the static portion of the file name to \a name. If the file
template contains XXXXXX that will automatically be replaced with
the unique part of the filename, otherwise a filename will be
@@ -823,7 +823,10 @@ QString QTemporaryFile::fileTemplate() const
If \a name contains a relative file path, the path will be relative to the
current working directory. You can use QDir::tempPath() to construct \a
- name if you want use the system's temporary directory.
+ name if you want use the system's temporary directory. It is important to
+ specify the correct directory if the rename() function will be called, as
+ QTemporaryFile can only rename files within the same volume / filesystem as
+ the temporary file itself was created on.
\sa fileTemplate()
*/
@@ -834,11 +837,28 @@ void QTemporaryFile::setFileTemplate(const QString &name)
}
/*!
- \internal
+ \fn bool QTemporaryFile::rename(const std::filesystem::path &newName)
+ \overload
+ \since 6.7
+*/
- This is just a simplified version of QFile::rename() because we know a few
- extra details about what kind of file we have. The documentation is hidden
- from the user because QFile::rename() should be enough.
+/*!
+ Renames the current temporary file to \a newName and returns true if it
+ succeeded.
+
+ This function has an important difference compared to QFile::rename(): it
+ will not perform a copy+delete if the low-level system call to rename the
+ file fails, something that could happen if \a newName specifies a file in a
+ different volume or filesystem than the temporary file was created on. In
+ other words, QTemporaryFile only supports atomic file renaming.
+
+ This functionality is intended to support materializing the destination
+ file with all contents already present, so another process cannot see an
+ incomplete file in the process of being written. The \l QSaveFile class can
+ be used for a similar purpose too, particularly if the destination file is
+ not temporary.
+
+ \sa QSaveFile, QSaveFile::commit(), QFile::rename()
*/
bool QTemporaryFile::rename(const QString &newName)
{
@@ -853,7 +873,6 @@ bool QTemporaryFile::rename(const QString &newName)
if (tef->rename(newName)) {
unsetError();
// engine was able to handle the new name so we just reset it
- tef->setFileName(newName);
d->fileName = newName;
return true;
}
@@ -870,7 +889,11 @@ bool QTemporaryFile::rename(const QString &newName)
Works on the given \a fileName rather than an existing QFile
object.
*/
-
+/*!
+ \fn QTemporaryFile *QTemporaryFile::createNativeFile(const std::filesystem::path &fileName)
+ \overload
+ \since 6.7
+*/
/*!
If \a file is not already a native file, then a QTemporaryFile is created
@@ -958,7 +981,7 @@ bool QTemporaryFile::open(OpenMode flags)
return false;
}
-#endif // QT_NO_TEMPORARYFILE
+#endif // QT_CONFIG(temporaryfile)
QT_END_NAMESPACE
diff --git a/src/corelib/io/qtemporaryfile.h b/src/corelib/io/qtemporaryfile.h
index 93f687bc17..9a4476f9d2 100644
--- a/src/corelib/io/qtemporaryfile.h
+++ b/src/corelib/io/qtemporaryfile.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QTEMPORARYFILE_H
#define QTEMPORARYFILE_H
@@ -50,7 +14,7 @@
QT_BEGIN_NAMESPACE
-#ifndef QT_NO_TEMPORARYFILE
+#if QT_CONFIG(temporaryfile)
class QTemporaryFilePrivate;
class QLockFilePrivate;
@@ -68,26 +32,59 @@ public:
#ifndef QT_NO_QOBJECT
explicit QTemporaryFile(QObject *parent);
QTemporaryFile(const QString &templateName, QObject *parent);
-#endif
+
+# if QT_CONFIG(cxx17_filesystem) || defined(Q_QDOC)
+ Q_WEAK_OVERLOAD
+ explicit QTemporaryFile(const std::filesystem::path &templateName, QObject *parent = nullptr)
+ : QTemporaryFile(QtPrivate::fromFilesystemPath(templateName), parent)
+ {
+ }
+# endif // QT_CONFIG(cxx17_filesystem)
+#endif // !QT_NO_QOBJECT
+
~QTemporaryFile();
bool autoRemove() const;
void setAutoRemove(bool b);
// ### Hides open(flags)
- bool open() { return open(QIODevice::ReadWrite); }
+ QFILE_MAYBE_NODISCARD bool open() { return open(QIODevice::ReadWrite); }
QString fileName() const override;
QString fileTemplate() const;
void setFileTemplate(const QString &name);
+#if QT_CONFIG(cxx17_filesystem) || defined(Q_QDOC)
+ Q_WEAK_OVERLOAD
+ void setFileTemplate(const std::filesystem::path &name)
+ {
+ return setFileTemplate(QtPrivate::fromFilesystemPath(name));
+ }
+#endif // QT_CONFIG(cxx17_filesystem)
// Hides QFile::rename
bool rename(const QString &newName);
+#if QT_CONFIG(cxx17_filesystem) || defined(Q_QDOC)
+ Q_WEAK_OVERLOAD
+ bool rename(const std::filesystem::path &newName)
+ {
+ return rename(QtPrivate::fromFilesystemPath(newName));
+ }
+#endif // QT_CONFIG(cxx17_filesystem)
+
inline static QTemporaryFile *createNativeFile(const QString &fileName)
{ QFile file(fileName); return createNativeFile(file); }
static QTemporaryFile *createNativeFile(QFile &file);
+#if QT_CONFIG(cxx17_filesystem) || defined(Q_QDOC)
+ Q_WEAK_OVERLOAD
+ static QTemporaryFile *createNativeFile(const std::filesystem::path &fileName)
+ {
+ QFile file(fileName);
+ return createNativeFile(file);
+ }
+#endif // QT_CONFIG(cxx17_filesystem)
+
protected:
bool open(OpenMode flags) override;
@@ -97,7 +94,7 @@ private:
Q_DISABLE_COPY(QTemporaryFile)
};
-#endif // QT_NO_TEMPORARYFILE
+#endif // QT_CONFIG(temporaryfile)
QT_END_NAMESPACE
diff --git a/src/corelib/io/qtemporaryfile_p.h b/src/corelib/io/qtemporaryfile_p.h
index ac9c239d21..d160afe41e 100644
--- a/src/corelib/io/qtemporaryfile_p.h
+++ b/src/corelib/io/qtemporaryfile_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QTEMPORARYFILE_P_H
#define QTEMPORARYFILE_P_H
@@ -81,7 +45,7 @@ struct QTemporaryFileName
QFileSystemEntry::NativePath generateNext();
};
-#ifndef QT_NO_TEMPORARYFILE
+#if QT_CONFIG(temporaryfile)
class QTemporaryFilePrivate : public QFilePrivate
{
@@ -124,8 +88,7 @@ public:
if (filePathIsTemplate) {
d->fileEntry.clear();
} else {
- d->fileEntry = QFileSystemEntry(file);
- QFSFileEngine::setFileName(file);
+ QFSFileEngine::setFileEntry(QFileSystemEntry(file));
}
}
~QTemporaryFileEngine();
@@ -152,7 +115,7 @@ public:
bool unnamedFile = false;
};
-#endif // QT_NO_TEMPORARYFILE
+#endif // QT_CONFIG(temporaryfile)
QT_END_NAMESPACE
diff --git a/src/corelib/io/qurl.cpp b/src/corelib/io/qurl.cpp
index 1e74b2ad9f..4360b5b076 100644
--- a/src/corelib/io/qurl.cpp
+++ b/src/corelib/io/qurl.cpp
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2016 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
/*!
\class QUrl
@@ -50,14 +14,18 @@
\ingroup network
\ingroup shared
+ \compares weak
It can parse and construct URLs in both encoded and unencoded
form. QUrl also has support for internationalized domain names
(IDNs).
- The most common way to use QUrl is to initialize it via the
- constructor by passing a QString. Otherwise, setUrl() can also
- be used.
+ The most common way to use QUrl is to initialize it via the constructor by
+ passing a QString containing a full URL. QUrl objects can also be created
+ from a QByteArray containing a full URL using QUrl::fromEncoded(), or
+ heuristically from incomplete URLs using QUrl::fromUserInput(). The URL
+ representation can be obtained from a QUrl using either QUrl::toString() or
+ QUrl::toEncoded().
URLs can be represented in two forms: encoded or unencoded. The
unencoded representation is suitable for showing to users, but
@@ -436,16 +404,17 @@
#include "private/qipaddress_p.h"
#include "qurlquery.h"
#include "private/qdir_p.h"
+#include <private/qtools_p.h>
QT_BEGIN_NAMESPACE
-// in qstring.cpp:
-void qt_from_latin1(char16_t *dst, const char *str, size_t size) noexcept;
+using namespace Qt::StringLiterals;
+using namespace QtMiscUtils;
inline static bool isHex(char c)
{
c |= 0x20;
- return (c >= '0' && c <= '9') || (c >= 'a' && c <= 'f');
+ return isAsciiDigit(c) || (c >= 'a' && c <= 'f');
}
static inline QString ftpScheme()
@@ -526,8 +495,8 @@ public:
struct Error {
QString source;
+ qsizetype position;
ErrorCode code;
- int position;
};
QUrlPrivate();
@@ -540,11 +509,11 @@ public:
std::unique_ptr<Error> cloneError() const;
void clearError();
- void setError(ErrorCode errorCode, const QString &source, int supplement = -1);
- ErrorCode validityError(QString *source = nullptr, int *position = nullptr) const;
- bool validateComponent(Section section, const QString &input, int begin, int end);
+ void setError(ErrorCode errorCode, const QString &source, qsizetype supplement = -1);
+ ErrorCode validityError(QString *source = nullptr, qsizetype *position = nullptr) const;
+ bool validateComponent(Section section, const QString &input, qsizetype begin, qsizetype end);
bool validateComponent(Section section, const QString &input)
- { return validateComponent(section, input, 0, uint(input.length())); }
+ { return validateComponent(section, input, 0, input.size()); }
// no QString scheme() const;
void appendAuthority(QString &appendTo, QUrl::FormattingOptions options, Section appendingTo) const;
@@ -557,15 +526,15 @@ public:
void appendFragment(QString &appendTo, QUrl::FormattingOptions options, Section appendingTo) const;
// the "end" parameters are like STL iterators: they point to one past the last valid element
- bool setScheme(const QString &value, int len, bool doSetError);
- void setAuthority(const QString &auth, int from, int end, QUrl::ParsingMode mode);
- void setUserInfo(const QString &userInfo, int from, int end);
- void setUserName(const QString &value, int from, int end);
- void setPassword(const QString &value, int from, int end);
- bool setHost(const QString &value, int from, int end, QUrl::ParsingMode mode);
- void setPath(const QString &value, int from, int end);
- void setQuery(const QString &value, int from, int end);
- void setFragment(const QString &value, int from, int end);
+ bool setScheme(const QString &value, qsizetype len, bool doSetError);
+ void setAuthority(const QString &auth, qsizetype from, qsizetype end, QUrl::ParsingMode mode);
+ void setUserInfo(const QString &userInfo, qsizetype from, qsizetype end);
+ void setUserName(const QString &value, qsizetype from, qsizetype end);
+ void setPassword(const QString &value, qsizetype from, qsizetype end);
+ bool setHost(const QString &value, qsizetype from, qsizetype end, QUrl::ParsingMode mode);
+ void setPath(const QString &value, qsizetype from, qsizetype end);
+ void setQuery(const QString &value, qsizetype from, qsizetype end);
+ void setFragment(const QString &value, qsizetype from, qsizetype end);
inline bool hasScheme() const { return sectionIsPresent & Scheme; }
inline bool hasAuthority() const { return sectionIsPresent & Authority; }
@@ -642,7 +611,7 @@ inline void QUrlPrivate::clearError()
error.reset();
}
-inline void QUrlPrivate::setError(ErrorCode errorCode, const QString &source, int supplement)
+inline void QUrlPrivate::setError(ErrorCode errorCode, const QString &source, qsizetype supplement)
{
if (error) {
// don't overwrite an error set in a previous section during parsing
@@ -833,11 +802,11 @@ static const ushort * const fragmentInUrl = userNameInUrl + 6;
static inline void parseDecodedComponent(QString &data)
{
- data.replace(QLatin1Char('%'), QLatin1String("%25"));
+ data.replace(u'%', "%25"_L1);
}
static inline QString
-recodeFromUser(const QString &input, const ushort *actions, int from, int to)
+recodeFromUser(const QString &input, const ushort *actions, qsizetype from, qsizetype to)
{
QString output;
const QChar *begin = input.constData() + from;
@@ -853,14 +822,16 @@ recodeFromUser(const QString &input, const ushort *actions, int from, int to)
static inline void appendToUser(QString &appendTo, QStringView value, QUrl::FormattingOptions options,
const ushort *actions)
{
- // Test ComponentFormattingOptions, ignore FormattingOptions.
- if ((options & 0xFFFF0000) == QUrl::PrettyDecoded) {
+ // The stored value is already QUrl::PrettyDecoded, so there's nothing to
+ // do if that's what the user asked for (test only
+ // ComponentFormattingOptions, ignore FormattingOptions).
+ if ((options & 0xFFFF0000) == QUrl::PrettyDecoded ||
+ !qt_urlRecode(appendTo, value, options, actions))
appendTo += value;
- return;
- }
- if (!qt_urlRecode(appendTo, value, options, actions))
- appendTo += value;
+ // copy nullness, if necessary, because QString::operator+=(QStringView) doesn't
+ if (appendTo.isNull() && !value.isNull())
+ appendTo.detach();
}
inline void QUrlPrivate::appendAuthority(QString &appendTo, QUrl::FormattingOptions options, Section appendingTo) const
@@ -870,11 +841,11 @@ inline void QUrlPrivate::appendAuthority(QString &appendTo, QUrl::FormattingOpti
// add '@' only if we added anything
if (hasUserName() || (hasPassword() && (options & QUrl::RemovePassword) == 0))
- appendTo += QLatin1Char('@');
+ appendTo += u'@';
}
appendHost(appendTo, options);
if (!(options & QUrl::RemovePort) && port != -1)
- appendTo += QLatin1Char(':') + QString::number(port);
+ appendTo += u':' + QString::number(port);
}
inline void QUrlPrivate::appendUserInfo(QString &appendTo, QUrl::FormattingOptions options, Section appendingTo) const
@@ -916,7 +887,7 @@ inline void QUrlPrivate::appendUserInfo(QString &appendTo, QUrl::FormattingOptio
if (options & QUrl::RemovePassword || !hasPassword()) {
return;
} else {
- appendTo += QLatin1Char(':');
+ appendTo += u':';
if (!qt_urlRecode(appendTo, password, options, passwordActions))
appendTo += password;
}
@@ -945,14 +916,14 @@ inline void QUrlPrivate::appendPath(QString &appendTo, QUrl::FormattingOptions o
QStringView thePathView(thePath);
if (options & QUrl::RemoveFilename) {
- const int slash = path.lastIndexOf(QLatin1Char('/'));
+ const qsizetype slash = path.lastIndexOf(u'/');
if (slash == -1)
return;
thePathView = QStringView{path}.left(slash + 1);
}
// check if we need to remove trailing slashes
if (options & QUrl::StripTrailingSlash) {
- while (thePathView.length() > 1 && thePathView.endsWith(QLatin1Char('/')))
+ while (thePathView.size() > 1 && thePathView.endsWith(u'/'))
thePathView.chop(1);
}
@@ -975,7 +946,7 @@ inline void QUrlPrivate::appendQuery(QString &appendTo, QUrl::FormattingOptions
// setXXX functions
-inline bool QUrlPrivate::setScheme(const QString &value, int len, bool doSetError)
+inline bool QUrlPrivate::setScheme(const QString &value, qsizetype len, bool doSetError)
{
// schemes are strictly RFC-compliant:
// scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." )
@@ -991,17 +962,17 @@ inline bool QUrlPrivate::setScheme(const QString &value, int len, bool doSetErro
sectionIsPresent |= Scheme;
// validate it:
- int needsLowercasing = -1;
- const ushort *p = value.utf16();
- for (int i = 0; i < len; ++i) {
- if (p[i] >= 'a' && p[i] <= 'z')
+ qsizetype needsLowercasing = -1;
+ const ushort *p = reinterpret_cast<const ushort *>(value.data());
+ for (qsizetype i = 0; i < len; ++i) {
+ if (isAsciiLower(p[i]))
continue;
- if (p[i] >= 'A' && p[i] <= 'Z') {
+ if (isAsciiUpper(p[i])) {
needsLowercasing = i;
continue;
}
if (i) {
- if (p[i] >= '0' && p[i] <= '9')
+ if (isAsciiDigit(p[i]))
continue;
if (p[i] == '+' || p[i] == '-' || p[i] == '.')
continue;
@@ -1020,9 +991,9 @@ inline bool QUrlPrivate::setScheme(const QString &value, int len, bool doSetErro
if (needsLowercasing != -1) {
// schemes are ASCII only, so we don't need the full Unicode toLower
QChar *schemeData = scheme.data(); // force detaching here
- for (int i = needsLowercasing; i >= 0; --i) {
+ for (qsizetype i = needsLowercasing; i >= 0; --i) {
ushort c = schemeData[i].unicode();
- if (c >= 'A' && c <= 'Z')
+ if (isAsciiUpper(c))
schemeData[i] = QChar(c + 0x20);
}
}
@@ -1040,7 +1011,7 @@ inline bool QUrlPrivate::setScheme(const QString &value, int len, bool doSetErro
return true;
}
-inline void QUrlPrivate::setAuthority(const QString &auth, int from, int end, QUrl::ParsingMode mode)
+inline void QUrlPrivate::setAuthority(const QString &auth, qsizetype from, qsizetype end, QUrl::ParsingMode mode)
{
sectionIsPresent &= ~Authority;
sectionIsPresent |= Host;
@@ -1048,33 +1019,33 @@ inline void QUrlPrivate::setAuthority(const QString &auth, int from, int end, QU
// we never actually _loop_
while (from != end) {
- int userInfoIndex = auth.indexOf(QLatin1Char('@'), from);
- if (uint(userInfoIndex) < uint(end)) {
+ qsizetype userInfoIndex = auth.indexOf(u'@', from);
+ if (size_t(userInfoIndex) < size_t(end)) {
setUserInfo(auth, from, userInfoIndex);
if (mode == QUrl::StrictMode && !validateComponent(UserInfo, auth, from, userInfoIndex))
break;
from = userInfoIndex + 1;
}
- int colonIndex = auth.lastIndexOf(QLatin1Char(':'), end - 1);
+ qsizetype colonIndex = auth.lastIndexOf(u':', end - 1);
if (colonIndex < from)
colonIndex = -1;
- if (uint(colonIndex) < uint(end)) {
+ if (size_t(colonIndex) < size_t(end)) {
if (auth.at(from).unicode() == '[') {
// check if colonIndex isn't inside the "[...]" part
- int closingBracket = auth.indexOf(QLatin1Char(']'), from);
- if (uint(closingBracket) > uint(colonIndex))
+ qsizetype closingBracket = auth.indexOf(u']', from);
+ if (size_t(closingBracket) > size_t(colonIndex))
colonIndex = -1;
}
}
- if (uint(colonIndex) < uint(end) - 1) {
+ if (size_t(colonIndex) < size_t(end) - 1) {
// found a colon with digits after it
unsigned long x = 0;
- for (int i = colonIndex + 1; i < end; ++i) {
+ for (qsizetype i = colonIndex + 1; i < end; ++i) {
ushort c = auth.at(i).unicode();
- if (c >= '0' && c <= '9') {
+ if (isAsciiDigit(c)) {
x *= 10;
x += c - '0';
} else {
@@ -1091,8 +1062,8 @@ inline void QUrlPrivate::setAuthority(const QString &auth, int from, int end, QU
}
}
- setHost(auth, from, qMin<uint>(end, colonIndex), mode);
- if (mode == QUrl::StrictMode && !validateComponent(Host, auth, from, qMin<uint>(end, colonIndex))) {
+ setHost(auth, from, qMin<size_t>(end, colonIndex), mode);
+ if (mode == QUrl::StrictMode && !validateComponent(Host, auth, from, qMin<size_t>(end, colonIndex))) {
// clear host too
sectionIsPresent &= ~Authority;
break;
@@ -1109,12 +1080,12 @@ inline void QUrlPrivate::setAuthority(const QString &auth, int from, int end, QU
port = -1;
}
-inline void QUrlPrivate::setUserInfo(const QString &userInfo, int from, int end)
+inline void QUrlPrivate::setUserInfo(const QString &userInfo, qsizetype from, qsizetype end)
{
- int delimIndex = userInfo.indexOf(QLatin1Char(':'), from);
- setUserName(userInfo, from, qMin<uint>(delimIndex, end));
+ qsizetype delimIndex = userInfo.indexOf(u':', from);
+ setUserName(userInfo, from, qMin<size_t>(delimIndex, end));
- if (uint(delimIndex) >= uint(end)) {
+ if (size_t(delimIndex) >= size_t(end)) {
password.clear();
sectionIsPresent &= ~Password;
} else {
@@ -1122,31 +1093,31 @@ inline void QUrlPrivate::setUserInfo(const QString &userInfo, int from, int end)
}
}
-inline void QUrlPrivate::setUserName(const QString &value, int from, int end)
+inline void QUrlPrivate::setUserName(const QString &value, qsizetype from, qsizetype end)
{
sectionIsPresent |= UserName;
userName = recodeFromUser(value, userNameInIsolation, from, end);
}
-inline void QUrlPrivate::setPassword(const QString &value, int from, int end)
+inline void QUrlPrivate::setPassword(const QString &value, qsizetype from, qsizetype end)
{
sectionIsPresent |= Password;
password = recodeFromUser(value, passwordInIsolation, from, end);
}
-inline void QUrlPrivate::setPath(const QString &value, int from, int end)
+inline void QUrlPrivate::setPath(const QString &value, qsizetype from, qsizetype end)
{
// sectionIsPresent |= Path; // not used, save some cycles
path = recodeFromUser(value, pathInIsolation, from, end);
}
-inline void QUrlPrivate::setFragment(const QString &value, int from, int end)
+inline void QUrlPrivate::setFragment(const QString &value, qsizetype from, qsizetype end)
{
sectionIsPresent |= Fragment;
fragment = recodeFromUser(value, fragmentInIsolation, from, end);
}
-inline void QUrlPrivate::setQuery(const QString &value, int from, int iend)
+inline void QUrlPrivate::setQuery(const QString &value, qsizetype from, qsizetype iend)
{
sectionIsPresent |= Query;
query = recodeFromUser(value, queryInIsolation, from, iend);
@@ -1216,16 +1187,14 @@ static const QChar *parseIpFuture(QString &host, const QChar *begin, const QChar
const QChar *const origBegin = begin;
if (begin[3].unicode() != '.')
return &begin[3];
- if ((begin[2].unicode() >= 'A' && begin[2].unicode() <= 'F') ||
- (begin[2].unicode() >= 'a' && begin[2].unicode() <= 'f') ||
- (begin[2].unicode() >= '0' && begin[2].unicode() <= '9')) {
+ if (isHexDigit(begin[2].unicode())) {
// this is so unlikely that we'll just go down the slow path
// decode the whole string, skipping the "[vH." and "]" which we already know to be there
host += QStringView(begin, 4);
// uppercase the version, if necessary
if (begin[2].unicode() >= 'a')
- host[host.length() - 2] = QChar{begin[2].unicode() - 0x20};
+ host[host.size() - 2] = QChar{begin[2].unicode() - 0x20};
begin += 4;
--end;
@@ -1237,18 +1206,14 @@ static const QChar *parseIpFuture(QString &host, const QChar *begin, const QChar
}
for ( ; begin != end; ++begin) {
- if (begin->unicode() >= 'A' && begin->unicode() <= 'Z')
- host += *begin;
- else if (begin->unicode() >= 'a' && begin->unicode() <= 'z')
- host += *begin;
- else if (begin->unicode() >= '0' && begin->unicode() <= '9')
+ if (isAsciiLetterOrNumber(begin->unicode()))
host += *begin;
else if (begin->unicode() < 0x80 && strchr(acceptable, begin->unicode()) != nullptr)
host += *begin;
else
return decoded.isEmpty() ? begin : &origBegin[2];
}
- host += QLatin1Char(']');
+ host += u']';
return nullptr;
}
return &origBegin[2];
@@ -1270,7 +1235,7 @@ static const QChar *parseIp6(QString &host, const QChar *begin, const QChar *end
QIPAddressUtils::IPv6Address address;
QStringView zoneId;
- int zoneIdPosition = decoded.indexOf(zoneIdIdentifier);
+ qsizetype zoneIdPosition = decoded.indexOf(zoneIdIdentifier);
if ((zoneIdPosition != -1) && (decoded.lastIndexOf(zoneIdIdentifier) == zoneIdPosition)) {
zoneId = decoded.mid(zoneIdPosition + zoneIdIdentifier.size());
decoded.truncate(zoneIdPosition);
@@ -1290,23 +1255,24 @@ static const QChar *parseIp6(QString &host, const QChar *begin, const QChar *end
return begin + (ret - decoded.constBegin());
host.reserve(host.size() + (end - begin) + 2); // +2 for the brackets
- host += QLatin1Char('[');
+ host += u'[';
QIPAddressUtils::toString(host, address);
if (!zoneId.isEmpty()) {
host += zoneIdIdentifier;
host += zoneId;
}
- host += QLatin1Char(']');
+ host += u']';
return nullptr;
}
-inline bool QUrlPrivate::setHost(const QString &value, int from, int iend, QUrl::ParsingMode mode)
+inline bool
+QUrlPrivate::setHost(const QString &value, qsizetype from, qsizetype iend, QUrl::ParsingMode mode)
{
const QChar *begin = value.constData() + from;
const QChar *end = value.constData() + iend;
- const int len = end - begin;
+ const qsizetype len = end - begin;
host.clear();
sectionIsPresent |= Host;
if (len == 0)
@@ -1367,14 +1333,14 @@ inline bool QUrlPrivate::setHost(const QString &value, int from, int iend, QUrl:
if (mode == QUrl::TolerantMode && qt_urlRecode(s, QStringView{begin, end}, { }, nullptr)) {
// something was decoded
// anything encoded left?
- int pos = s.indexOf(QChar(0x25)); // '%'
+ qsizetype pos = s.indexOf(QChar(0x25)); // '%'
if (pos != -1) {
setError(InvalidRegNameError, s, pos);
return false;
}
// recurse
- return setHost(s, 0, s.length(), QUrl::StrictMode);
+ return setHost(s, 0, s.size(), QUrl::StrictMode);
}
s = qt_ACE_do(value.mid(from, iend - from), NormalizeAce, ForbidLeadingDot, {});
@@ -1407,15 +1373,15 @@ inline void QUrlPrivate::parse(const QString &url, QUrl::ParsingMode parsingMode
clearError();
// find the important delimiters
- int colon = -1;
- int question = -1;
- int hash = -1;
- const int len = url.length();
+ qsizetype colon = -1;
+ qsizetype question = -1;
+ qsizetype hash = -1;
+ const qsizetype len = url.size();
const QChar *const begin = url.constData();
const ushort *const data = reinterpret_cast<const ushort *>(begin);
- for (int i = 0; i < len; ++i) {
- uint uc = data[i];
+ for (qsizetype i = 0; i < len; ++i) {
+ size_t uc = data[i];
if (uc == '#' && hash == -1) {
hash = i;
@@ -1432,7 +1398,7 @@ inline void QUrlPrivate::parse(const QString &url, QUrl::ParsingMode parsingMode
}
// check if we have a scheme
- int hierStart;
+ qsizetype hierStart;
if (colon != -1 && setScheme(url, colon, /* don't set error */ false)) {
hierStart = colon + 1;
} else {
@@ -1442,12 +1408,12 @@ inline void QUrlPrivate::parse(const QString &url, QUrl::ParsingMode parsingMode
hierStart = 0;
}
- int pathStart;
- int hierEnd = qMin<uint>(qMin<uint>(question, hash), len);
+ qsizetype pathStart;
+ qsizetype hierEnd = qMin<size_t>(qMin<size_t>(question, hash), len);
if (hierEnd - hierStart >= 2 && data[hierStart] == '/' && data[hierStart + 1] == '/') {
// we have an authority, it ends at the first slash after these
- int authorityEnd = hierEnd;
- for (int i = hierStart + 2; i < authorityEnd ; ++i) {
+ qsizetype authorityEnd = hierEnd;
+ for (qsizetype i = hierStart + 2; i < authorityEnd ; ++i) {
if (data[i] == '/') {
authorityEnd = i;
break;
@@ -1472,8 +1438,8 @@ inline void QUrlPrivate::parse(const QString &url, QUrl::ParsingMode parsingMode
path.clear();
}
- if (uint(question) < uint(hash))
- setQuery(url, question + 1, qMin<uint>(hash, len));
+ if (size_t(question) < size_t(hash))
+ setQuery(url, question + 1, qMin<size_t>(hash, len));
if (hash != -1)
setFragment(url, hash + 1, len);
@@ -1489,7 +1455,7 @@ inline void QUrlPrivate::parse(const QString &url, QUrl::ParsingMode parsingMode
if (!validateComponent(Path, url, pathStart, hierEnd))
return;
- if (uint(question) < uint(hash) && !validateComponent(Query, url, question + 1, qMin<uint>(hash, len)))
+ if (size_t(question) < size_t(hash) && !validateComponent(Query, url, question + 1, qMin<size_t>(hash, len)))
return;
if (hash != -1)
validateComponent(Fragment, url, hash + 1, len);
@@ -1503,19 +1469,19 @@ QString QUrlPrivate::toLocalFile(QUrl::FormattingOptions options) const
// magic for shared drive on windows
if (!host.isEmpty()) {
- tmp = QLatin1String("//") + host;
+ tmp = "//"_L1 + host;
#ifdef Q_OS_WIN // QTBUG-42346, WebDAV is visible as local file on Windows only.
if (scheme == webDavScheme())
tmp += webDavSslTag();
#endif
- if (!ourPath.isEmpty() && !ourPath.startsWith(QLatin1Char('/')))
- tmp += QLatin1Char('/');
+ if (!ourPath.isEmpty() && !ourPath.startsWith(u'/'))
+ tmp += u'/';
tmp += ourPath;
} else {
tmp = ourPath;
#ifdef Q_OS_WIN
// magic for drives on windows
- if (ourPath.length() > 2 && ourPath.at(0) == QLatin1Char('/') && ourPath.at(2) == QLatin1Char(':'))
+ if (ourPath.length() > 2 && ourPath.at(0) == u'/' && ourPath.at(2) == u':')
tmp.remove(0, 1);
#endif
}
@@ -1536,7 +1502,7 @@ inline QString QUrlPrivate::mergePaths(const QString &relativePath) const
// path, then return a string consisting of "/" concatenated with
// the reference's path; otherwise,
if (!host.isEmpty() && path.isEmpty())
- return QLatin1Char('/') + relativePath;
+ return u'/' + relativePath;
// Return a string consisting of the reference's path component
// appended to all but the last segment of the base URI's path
@@ -1544,10 +1510,10 @@ inline QString QUrlPrivate::mergePaths(const QString &relativePath) const
// base URI path, or excluding the entire base URI path if it does
// not contain any "/" characters).
QString newPath;
- if (!path.contains(QLatin1Char('/')))
+ if (!path.contains(u'/'))
newPath = relativePath;
else
- newPath = QStringView{path}.left(path.lastIndexOf(QLatin1Char('/')) + 1) + relativePath;
+ newPath = QStringView{path}.left(path.lastIndexOf(u'/') + 1) + relativePath;
return newPath;
}
@@ -1593,7 +1559,7 @@ static void removeDotsFromPath(QString *path)
in += 2;
continue;
} else if (in == end - 2 && in[0].unicode() == '/' && in[1].unicode() == '.') {
- *out++ = QLatin1Char('/');
+ *out++ = u'/';
in += 2;
break;
}
@@ -1634,7 +1600,7 @@ static void removeDotsFromPath(QString *path)
path->truncate(out - path->constData());
}
-inline QUrlPrivate::ErrorCode QUrlPrivate::validityError(QString *source, int *position) const
+inline QUrlPrivate::ErrorCode QUrlPrivate::validityError(QString *source, qsizetype *position) const
{
Q_ASSERT(!source == !position);
if (error) {
@@ -1660,8 +1626,8 @@ inline QUrlPrivate::ErrorCode QUrlPrivate::validityError(QString *source, int *p
if (path.isEmpty())
return NoError;
- if (path.at(0) == QLatin1Char('/')) {
- if (hasAuthority() || path.length() == 1 || path.at(1) != QLatin1Char('/'))
+ if (path.at(0) == u'/') {
+ if (hasAuthority() || path.size() == 1 || path.at(1) != u'/')
return NoError;
if (source) {
*source = path;
@@ -1681,7 +1647,7 @@ inline QUrlPrivate::ErrorCode QUrlPrivate::validityError(QString *source, int *p
return NoError;
// check for a path of "text:text/"
- for (int i = 0; i < path.length(); ++i) {
+ for (qsizetype i = 0; i < path.size(); ++i) {
ushort c = path.at(i).unicode();
if (c == '/') {
// found the slash before the colon
@@ -1700,7 +1666,7 @@ inline QUrlPrivate::ErrorCode QUrlPrivate::validityError(QString *source, int *p
}
bool QUrlPrivate::validateComponent(QUrlPrivate::Section section, const QString &input,
- int begin, int end)
+ qsizetype begin, qsizetype end)
{
// What we need to look out for, that the regular parser tolerates:
// - percent signs not followed by two hex digits
@@ -1721,13 +1687,13 @@ bool QUrlPrivate::validateComponent(QUrlPrivate::Section section, const QString
Q_ASSERT(section != Authority && section != Hierarchy && section != FullUrl);
const ushort *const data = reinterpret_cast<const ushort *>(input.constData());
- for (uint i = uint(begin); i < uint(end); ++i) {
+ for (size_t i = size_t(begin); i < size_t(end); ++i) {
uint uc = data[i];
if (uc >= 0x80)
continue;
bool error = false;
- if ((uc == '%' && (uint(end) < i + 2 || !isHex(data[i + 1]) || !isHex(data[i + 2])))
+ if ((uc == '%' && (size_t(end) < i + 2 || !isHex(data[i + 1]) || !isHex(data[i + 2])))
|| uc <= 0x20 || strchr(forbidden, uc)) {
// found an error
error = true;
@@ -1745,7 +1711,7 @@ bool QUrlPrivate::validateComponent(QUrlPrivate::Section section, const QString
if (section == UserInfo) {
// is it the user name or the password?
errorCode = InvalidUserNameError;
- for (uint j = uint(begin); j < i; ++j)
+ for (size_t j = size_t(begin); j < i; ++j)
if (data[j] == ':') {
errorCode = InvalidPasswordError;
break;
@@ -1778,7 +1744,7 @@ inline void QUrlPrivate::validate() const
if (!isHostValid)
return;
- if (scheme == QLatin1String("mailto")) {
+ if (scheme == "mailto"_L1) {
if (!host.isEmpty() || port != -1 || !userName.isEmpty() || !password.isEmpty()) {
that->isValid = false;
that->errorInfo.setParams(0, QT_TRANSLATE_NOOP(QUrl, "expected empty host, username,"
@@ -1825,7 +1791,20 @@ inline void QUrlPrivate::validate() const
/*!
- Constructs a URL by parsing \a url. QUrl will automatically percent encode
+ Constructs a URL by parsing \a url. Note this constructor expects a proper
+ URL or URL-Reference and will not attempt to guess intent. For example, the
+ following declaration:
+
+ \snippet code/src_corelib_io_qurl.cpp constructor-url-reference
+
+ Will construct a valid URL but it may not be what one expects, as the
+ scheme() part of the input is missing. For a string like the above,
+ applications may want to use fromUserInput(). For this constructor or
+ setUrl(), the following is probably what was intended:
+
+ \snippet code/src_corelib_io_qurl.cpp constructor-url
+
+ QUrl will automatically percent encode
all characters that are not allowed in a URL and decode the percent-encoded
sequences that represent an unreserved character (letters, digits, hyphens,
underscores, dots and tildes). All other characters are left in their
@@ -1870,7 +1849,7 @@ QUrl::QUrl() : d(nullptr)
/*!
Constructs a copy of \a other.
*/
-QUrl::QUrl(const QUrl &other) : d(other.d)
+QUrl::QUrl(const QUrl &other) noexcept : d(other.d)
{
if (d)
d->ref.ref();
@@ -1989,7 +1968,7 @@ void QUrl::setScheme(const QString &scheme)
d->flags &= ~QUrlPrivate::IsLocalFile;
d->scheme.clear();
} else {
- d->setScheme(scheme, scheme.length(), /* do set error */ true);
+ d->setScheme(scheme, scheme.size(), /* do set error */ true);
}
}
@@ -2049,7 +2028,7 @@ void QUrl::setAuthority(const QString &authority, ParsingMode mode)
return;
}
- d->setAuthority(authority, 0, authority.length(), mode);
+ d->setAuthority(authority, 0, authority.size(), mode);
if (authority.isNull()) {
// QUrlPrivate::setAuthority cleared almost everything
// but it leaves the Host bit set
@@ -2120,7 +2099,7 @@ void QUrl::setUserInfo(const QString &userInfo, ParsingMode mode)
return;
}
- d->setUserInfo(trimmed, 0, trimmed.length());
+ d->setUserInfo(trimmed, 0, trimmed.size());
if (userInfo.isNull()) {
// QUrlPrivate::setUserInfo cleared almost everything
// but it leaves the UserName bit set
@@ -2192,7 +2171,7 @@ void QUrl::setUserName(const QString &userName, ParsingMode mode)
mode = TolerantMode;
}
- d->setUserName(data, 0, data.length());
+ d->setUserName(data, 0, data.size());
if (userName.isNull())
d->sectionIsPresent &= ~QUrlPrivate::UserName;
else if (mode == StrictMode && !d->validateComponent(QUrlPrivate::UserName, userName))
@@ -2255,7 +2234,7 @@ void QUrl::setPassword(const QString &password, ParsingMode mode)
mode = TolerantMode;
}
- d->setPassword(data, 0, data.length());
+ d->setPassword(data, 0, data.size());
if (password.isNull())
d->sectionIsPresent &= ~QUrlPrivate::Password;
else if (mode == StrictMode && !d->validateComponent(QUrlPrivate::Password, password))
@@ -2317,18 +2296,18 @@ void QUrl::setHost(const QString &host, ParsingMode mode)
mode = TolerantMode;
}
- if (d->setHost(data, 0, data.length(), mode)) {
+ if (d->setHost(data, 0, data.size(), mode)) {
if (host.isNull())
d->sectionIsPresent &= ~QUrlPrivate::Host;
- } else if (!data.startsWith(QLatin1Char('['))) {
+ } else if (!data.startsWith(u'[')) {
// setHost failed, it might be IPv6 or IPvFuture in need of bracketing
Q_ASSERT(d->error);
- data.prepend(QLatin1Char('['));
- data.append(QLatin1Char(']'));
- if (!d->setHost(data, 0, data.length(), mode)) {
+ data.prepend(u'[');
+ data.append(u']');
+ if (!d->setHost(data, 0, data.size(), mode)) {
// failed again
- if (data.contains(QLatin1Char(':'))) {
+ if (data.contains(u':')) {
// source data contains ':', so it's an IPv6 error
d->error->code = QUrlPrivate::InvalidIPv6AddressError;
}
@@ -2362,8 +2341,8 @@ QString QUrl::host(ComponentFormattingOptions options) const
QString result;
if (d) {
d->appendHost(result, options);
- if (result.startsWith(QLatin1Char('[')))
- result = result.mid(1, result.length() - 2);
+ if (result.startsWith(u'['))
+ result = result.mid(1, result.size() - 2);
}
return result;
}
@@ -2442,7 +2421,7 @@ void QUrl::setPath(const QString &path, ParsingMode mode)
mode = TolerantMode;
}
- d->setPath(data, 0, data.length());
+ d->setPath(data, 0, data.size());
// optimized out, since there is no path delimiter
// if (path.isNull())
@@ -2517,7 +2496,7 @@ QString QUrl::path(ComponentFormattingOptions options) const
QString QUrl::fileName(ComponentFormattingOptions options) const
{
const QString ourPath = path(options);
- const int slash = ourPath.lastIndexOf(QLatin1Char('/'));
+ const qsizetype slash = ourPath.lastIndexOf(u'/');
if (slash == -1)
return ourPath;
return ourPath.mid(slash + 1);
@@ -2578,7 +2557,7 @@ void QUrl::setQuery(const QString &query, ParsingMode mode)
mode = TolerantMode;
}
- d->setQuery(data, 0, data.length());
+ d->setQuery(data, 0, data.size());
if (query.isNull())
d->sectionIsPresent &= ~QUrlPrivate::Query;
else if (mode == StrictMode && !d->validateComponent(QUrlPrivate::Query, query))
@@ -2676,7 +2655,7 @@ void QUrl::setFragment(const QString &fragment, ParsingMode mode)
mode = TolerantMode;
}
- d->setFragment(data, 0, data.length());
+ d->setFragment(data, 0, data.size());
if (fragment.isNull())
d->sectionIsPresent &= ~QUrlPrivate::Fragment;
else if (mode == StrictMode && !d->validateComponent(QUrlPrivate::Fragment, fragment))
@@ -2775,7 +2754,7 @@ QUrl QUrl::resolved(const QUrl &relative) const
t.d->sectionIsPresent |= QUrlPrivate::Query;
}
} else {
- t.d->path = relative.d->path.startsWith(QLatin1Char('/'))
+ t.d->path = relative.d->path.startsWith(u'/')
? relative.d->path
: d->mergePaths(relative.d->path);
if (relative.d->hasQuery()) {
@@ -2882,26 +2861,26 @@ QString QUrl::toString(FormattingOptions options) const
options |= EncodeReserved;
if (!(options & QUrl::RemoveScheme) && d->hasScheme())
- url += d->scheme + QLatin1Char(':');
+ url += d->scheme + u':';
- bool pathIsAbsolute = d->path.startsWith(QLatin1Char('/'));
+ bool pathIsAbsolute = d->path.startsWith(u'/');
if (!((options & QUrl::RemoveAuthority) == QUrl::RemoveAuthority) && d->hasAuthority()) {
- url += QLatin1String("//");
+ url += "//"_L1;
d->appendAuthority(url, options, QUrlPrivate::FullUrl);
} else if (isLocalFile() && pathIsAbsolute) {
// Comply with the XDG file URI spec, which requires triple slashes.
- url += QLatin1String("//");
+ url += "//"_L1;
}
if (!(options & QUrl::RemovePath))
d->appendPath(url, options, QUrlPrivate::FullUrl);
if (!(options & QUrl::RemoveQuery) && d->hasQuery()) {
- url += QLatin1Char('?');
+ url += u'?';
d->appendQuery(url, options, QUrlPrivate::FullUrl);
}
if (!(options & QUrl::RemoveFragment) && d->hasFragment()) {
- url += QLatin1Char('#');
+ url += u'#';
d->appendFragment(url, options, QUrlPrivate::FullUrl);
}
@@ -2970,7 +2949,7 @@ QUrl QUrl::adjusted(QUrl::FormattingOptions options) const
that.detach();
QString path;
d->appendPath(path, options | FullyEncoded, QUrlPrivate::Path);
- that.d->setPath(path, 0, path.length());
+ that.d->setPath(path, 0, path.size());
}
return that;
}
@@ -2991,19 +2970,23 @@ QByteArray QUrl::toEncoded(FormattingOptions options) const
}
/*!
- \fn QUrl QUrl::fromEncoded(const QByteArray &input, ParsingMode parsingMode)
-
Parses \a input and returns the corresponding QUrl. \a input is
assumed to be in encoded form, containing only ASCII characters.
- Parses the URL using \a parsingMode. See setUrl() for more information on
+ Parses the URL using \a mode. See setUrl() for more information on
this parameter. QUrl::DecodedMode is not permitted in this context.
+ \note In Qt versions prior to 6.7, this function took a QByteArray, not
+ QByteArrayView. If you experience compile errors, it's because your code
+ is passing objects that are implicitly convertible to QByteArray, but not
+ QByteArrayView. Wrap the corresponding argument in \c{QByteArray{~~~}} to
+ make the cast explicit. This is backwards-compatible with old Qt versions.
+
\sa toEncoded(), setUrl()
*/
-QUrl QUrl::fromEncoded(const QByteArray &input, ParsingMode mode)
+QUrl QUrl::fromEncoded(QByteArrayView input, ParsingMode mode)
{
- return QUrl(QString::fromUtf8(input.constData(), input.size()), mode);
+ return QUrl(QString::fromUtf8(input), mode);
}
/*!
@@ -3060,17 +3043,6 @@ QString QUrl::fromAce(const QByteArray &domain, QUrl::AceProcessingOptions optio
ForbidLeadingDot /*FIXME: make configurable*/, options);
}
-#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0)
-/*!
- \since 4.2
- \overload
-*/
-QString QUrl::fromAce(const QByteArray &domain)
-{
- return fromAce(domain, {});
-}
-#endif
-
/*!
\since 6.3
@@ -3094,102 +3066,104 @@ QByteArray QUrl::toAce(const QString &domain, AceProcessingOptions options)
.toLatin1();
}
-#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0)
-/*!
- \since 4.2
- \overload
-*/
-QByteArray QUrl::toAce(const QString &domain)
-{
- return toAce(domain, {});
-}
-#endif
-
/*!
\internal
- Returns \c true if this URL is "less than" the given \a url. This
+ \fn bool QUrl::operator<(const QUrl &lhs, const QUrl &rhs)
+
+ Returns \c true if URL \a lhs is "less than" URL \a rhs. This
provides a means of ordering URLs.
*/
-bool QUrl::operator <(const QUrl &url) const
+
+Qt::weak_ordering compareThreeWay(const QUrl &lhs, const QUrl &rhs)
{
- if (!d || !url.d) {
- bool thisIsEmpty = !d || d->isEmpty();
- bool thatIsEmpty = !url.d || url.d->isEmpty();
+ if (!lhs.d || !rhs.d) {
+ bool thisIsEmpty = !lhs.d || lhs.d->isEmpty();
+ bool thatIsEmpty = !rhs.d || rhs.d->isEmpty();
// sort an empty URL first
- return thisIsEmpty && !thatIsEmpty;
+ if (thisIsEmpty) {
+ if (!thatIsEmpty)
+ return Qt::weak_ordering::less;
+ else
+ return Qt::weak_ordering::equivalent;
+ } else {
+ return Qt::weak_ordering::greater;
+ }
}
int cmp;
- cmp = d->scheme.compare(url.d->scheme);
+ cmp = lhs.d->scheme.compare(rhs.d->scheme);
if (cmp != 0)
- return cmp < 0;
+ return Qt::compareThreeWay(cmp, 0);
- cmp = d->userName.compare(url.d->userName);
+ cmp = lhs.d->userName.compare(rhs.d->userName);
if (cmp != 0)
- return cmp < 0;
+ return Qt::compareThreeWay(cmp, 0);
- cmp = d->password.compare(url.d->password);
+ cmp = lhs.d->password.compare(rhs.d->password);
if (cmp != 0)
- return cmp < 0;
+ return Qt::compareThreeWay(cmp, 0);
- cmp = d->host.compare(url.d->host);
+ cmp = lhs.d->host.compare(rhs.d->host);
if (cmp != 0)
- return cmp < 0;
+ return Qt::compareThreeWay(cmp, 0);
- if (d->port != url.d->port)
- return d->port < url.d->port;
+ if (lhs.d->port != rhs.d->port)
+ return Qt::compareThreeWay(lhs.d->port, rhs.d->port);
- cmp = d->path.compare(url.d->path);
+ cmp = lhs.d->path.compare(rhs.d->path);
if (cmp != 0)
- return cmp < 0;
+ return Qt::compareThreeWay(cmp, 0);
- if (d->hasQuery() != url.d->hasQuery())
- return url.d->hasQuery();
+ if (lhs.d->hasQuery() != rhs.d->hasQuery())
+ return rhs.d->hasQuery() ? Qt::weak_ordering::less : Qt::weak_ordering::greater;
- cmp = d->query.compare(url.d->query);
+ cmp = lhs.d->query.compare(rhs.d->query);
if (cmp != 0)
- return cmp < 0;
+ return Qt::compareThreeWay(cmp, 0);
- if (d->hasFragment() != url.d->hasFragment())
- return url.d->hasFragment();
+ if (lhs.d->hasFragment() != rhs.d->hasFragment())
+ return rhs.d->hasFragment() ? Qt::weak_ordering::less : Qt::weak_ordering::greater;
- cmp = d->fragment.compare(url.d->fragment);
- return cmp < 0;
+ cmp = lhs.d->fragment.compare(rhs.d->fragment);
+ return Qt::compareThreeWay(cmp, 0);
}
/*!
- Returns \c true if this URL and the given \a url are equal;
+ \fn bool QUrl::operator==(const QUrl &lhs, const QUrl &rhs)
+
+ Returns \c true if \a lhs and \a rhs URLs are equivalent;
otherwise returns \c false.
\sa matches()
*/
-bool QUrl::operator ==(const QUrl &url) const
+
+bool comparesEqual(const QUrl &lhs, const QUrl &rhs)
{
- if (!d && !url.d)
+ if (!lhs.d && !rhs.d)
return true;
- if (!d)
- return url.d->isEmpty();
- if (!url.d)
- return d->isEmpty();
+ if (!lhs.d)
+ return rhs.d->isEmpty();
+ if (!rhs.d)
+ return lhs.d->isEmpty();
// First, compare which sections are present, since it speeds up the
// processing considerably. We just have to ignore the host-is-present flag
// for local files (the "file" protocol), due to the requirements of the
// XDG file URI specification.
int mask = QUrlPrivate::FullUrl;
- if (isLocalFile())
+ if (lhs.isLocalFile())
mask &= ~QUrlPrivate::Host;
- return (d->sectionIsPresent & mask) == (url.d->sectionIsPresent & mask) &&
- d->scheme == url.d->scheme &&
- d->userName == url.d->userName &&
- d->password == url.d->password &&
- d->host == url.d->host &&
- d->port == url.d->port &&
- d->path == url.d->path &&
- d->query == url.d->query &&
- d->fragment == url.d->fragment;
+ return (lhs.d->sectionIsPresent & mask) == (rhs.d->sectionIsPresent & mask) &&
+ lhs.d->scheme == rhs.d->scheme &&
+ lhs.d->userName == rhs.d->userName &&
+ lhs.d->password == rhs.d->password &&
+ lhs.d->host == rhs.d->host &&
+ lhs.d->port == rhs.d->port &&
+ lhs.d->path == rhs.d->path &&
+ lhs.d->query == rhs.d->query &&
+ lhs.d->fragment == rhs.d->fragment;
}
/*!
@@ -3269,20 +3243,18 @@ bool QUrl::matches(const QUrl &url, FormattingOptions options) const
}
/*!
- Returns \c true if this URL and the given \a url are not equal;
+ \fn bool QUrl::operator !=(const QUrl &lhs, const QUrl &rhs)
+
+ Returns \c true if \a lhs and \a rhs URLs are not equal;
otherwise returns \c false.
\sa matches()
*/
-bool QUrl::operator !=(const QUrl &url) const
-{
- return !(*this == url);
-}
/*!
Assigns the specified \a url to this object.
*/
-QUrl &QUrl::operator =(const QUrl &url)
+QUrl &QUrl::operator =(const QUrl &url) noexcept
{
if (!d) {
if (url.d) {
@@ -3401,11 +3373,11 @@ QUrl QUrl::fromLocalFile(const QString &localFile)
QString deslashified = fromNativeSeparators(localFile);
// magic for drives on windows
- if (deslashified.length() > 1 && deslashified.at(1) == QLatin1Char(':') && deslashified.at(0) != QLatin1Char('/')) {
- deslashified.prepend(QLatin1Char('/'));
- } else if (deslashified.startsWith(QLatin1String("//"))) {
+ if (deslashified.size() > 1 && deslashified.at(1) == u':' && deslashified.at(0) != u'/') {
+ deslashified.prepend(u'/');
+ } else if (deslashified.startsWith("//"_L1)) {
// magic for shared drive on windows
- int indexOfPath = deslashified.indexOf(QLatin1Char('/'), 2);
+ qsizetype indexOfPath = deslashified.indexOf(u'/', 2);
QStringView hostSpec = QStringView{deslashified}.mid(2, indexOfPath - 2);
// Check for Windows-specific WebDAV specification: "//host@SSL/path".
if (hostSpec.endsWith(webDavSslTag(), Qt::CaseInsensitive)) {
@@ -3422,7 +3394,7 @@ QUrl QUrl::fromLocalFile(const QString &localFile)
// Path hostname is not a valid URL host, so set it entirely in the path
// (by leaving deslashified unchanged)
} else if (indexOfPath > 2) {
- deslashified = deslashified.right(deslashified.length() - indexOfPath);
+ deslashified = deslashified.right(deslashified.size() - indexOfPath);
} else {
deslashified.clear();
}
@@ -3486,16 +3458,16 @@ bool QUrl::isParentOf(const QUrl &childUrl) const
if (!d)
return ((childUrl.scheme().isEmpty())
&& (childUrl.authority().isEmpty())
- && childPath.length() > 0 && childPath.at(0) == QLatin1Char('/'));
+ && childPath.size() > 0 && childPath.at(0) == u'/');
QString ourPath = path();
return ((childUrl.scheme().isEmpty() || d->scheme == childUrl.scheme())
&& (childUrl.authority().isEmpty() || authority() == childUrl.authority())
&& childPath.startsWith(ourPath)
- && ((ourPath.endsWith(QLatin1Char('/')) && childPath.length() > ourPath.length())
- || (!ourPath.endsWith(QLatin1Char('/'))
- && childPath.length() > ourPath.length() && childPath.at(ourPath.length()) == QLatin1Char('/'))));
+ && ((ourPath.endsWith(u'/') && childPath.size() > ourPath.size())
+ || (!ourPath.endsWith(u'/') && childPath.size() > ourPath.size()
+ && childPath.at(ourPath.size()) == u'/')));
}
@@ -3541,34 +3513,31 @@ QDebug operator<<(QDebug d, const QUrl &url)
}
#endif
-static QString errorMessage(QUrlPrivate::ErrorCode errorCode, const QString &errorSource, int errorPosition)
+static QString errorMessage(QUrlPrivate::ErrorCode errorCode, const QString &errorSource, qsizetype errorPosition)
{
- QChar c = uint(errorPosition) < uint(errorSource.length()) ?
+ QChar c = size_t(errorPosition) < size_t(errorSource.size()) ?
errorSource.at(errorPosition) : QChar(QChar::Null);
switch (errorCode) {
case QUrlPrivate::NoError:
- Q_ASSERT_X(false, "QUrl::errorString",
- "Impossible: QUrl::errorString should have treated this condition");
- Q_UNREACHABLE();
- return QString();
+ Q_UNREACHABLE_RETURN(QString()); // QUrl::errorString should have treated this condition
case QUrlPrivate::InvalidSchemeError: {
- auto msg = QLatin1String("Invalid scheme (character '%1' not permitted)");
+ auto msg = "Invalid scheme (character '%1' not permitted)"_L1;
return msg.arg(c);
}
case QUrlPrivate::InvalidUserNameError:
- return QLatin1String("Invalid user name (character '%1' not permitted)")
+ return "Invalid user name (character '%1' not permitted)"_L1
.arg(c);
case QUrlPrivate::InvalidPasswordError:
- return QLatin1String("Invalid password (character '%1' not permitted)")
+ return "Invalid password (character '%1' not permitted)"_L1
.arg(c);
case QUrlPrivate::InvalidRegNameError:
- if (errorPosition != -1)
- return QLatin1String("Invalid hostname (character '%1' not permitted)")
+ if (errorPosition >= 0)
+ return "Invalid hostname (character '%1' not permitted)"_L1
.arg(c);
else
return QStringLiteral("Invalid hostname (contains invalid characters)");
@@ -3577,9 +3546,9 @@ static QString errorMessage(QUrlPrivate::ErrorCode errorCode, const QString &err
case QUrlPrivate::InvalidIPv6AddressError:
return QStringLiteral("Invalid IPv6 address");
case QUrlPrivate::InvalidCharacterInIPv6Error:
- return QLatin1String("Invalid IPv6 address (character '%1' not permitted)").arg(c);
+ return "Invalid IPv6 address (character '%1' not permitted)"_L1.arg(c);
case QUrlPrivate::InvalidIPvFutureError:
- return QLatin1String("Invalid IPvFuture address (character '%1' not permitted)").arg(c);
+ return "Invalid IPvFuture address (character '%1' not permitted)"_L1.arg(c);
case QUrlPrivate::HostMissingEndBracket:
return QStringLiteral("Expected ']' to match '[' in hostname");
@@ -3589,15 +3558,15 @@ static QString errorMessage(QUrlPrivate::ErrorCode errorCode, const QString &err
return QStringLiteral("Port field was empty");
case QUrlPrivate::InvalidPathError:
- return QLatin1String("Invalid path (character '%1' not permitted)")
+ return "Invalid path (character '%1' not permitted)"_L1
.arg(c);
case QUrlPrivate::InvalidQueryError:
- return QLatin1String("Invalid query (character '%1' not permitted)")
+ return "Invalid query (character '%1' not permitted)"_L1
.arg(c);
case QUrlPrivate::InvalidFragmentError:
- return QLatin1String("Invalid fragment (character '%1' not permitted)")
+ return "Invalid fragment (character '%1' not permitted)"_L1
.arg(c);
case QUrlPrivate::AuthorityPresentAndPathIsRelative:
@@ -3608,20 +3577,14 @@ static QString errorMessage(QUrlPrivate::ErrorCode errorCode, const QString &err
return QStringLiteral("Relative URL's path component contains ':' before any '/'");
}
- Q_ASSERT_X(false, "QUrl::errorString", "Cannot happen, unknown error");
- Q_UNREACHABLE();
- return QString();
+ Q_UNREACHABLE_RETURN(QString());
}
static inline void appendComponentIfPresent(QString &msg, bool present, const char *componentName,
const QString &component)
{
- if (present) {
- msg += QLatin1String(componentName);
- msg += QLatin1Char('"');
- msg += component;
- msg += QLatin1String("\",");
- }
+ if (present)
+ msg += QLatin1StringView(componentName) % u'"' % component % "\","_L1;
}
/*!
@@ -3644,15 +3607,15 @@ QString QUrl::errorString() const
return msg;
QString errorSource;
- int errorPosition = 0;
+ qsizetype errorPosition = 0;
QUrlPrivate::ErrorCode errorCode = d->validityError(&errorSource, &errorPosition);
if (errorCode == QUrlPrivate::NoError)
return msg;
msg += errorMessage(errorCode, errorSource, errorPosition);
- msg += QLatin1String("; source was \"");
+ msg += "; source was \""_L1;
msg += errorSource;
- msg += QLatin1String("\";");
+ msg += "\";"_L1;
appendComponentIfPresent(msg, d->sectionIsPresent & QUrlPrivate::Scheme,
" scheme = ", d->scheme);
appendComponentIfPresent(msg, d->sectionIsPresent & QUrlPrivate::UserInfo,
@@ -3667,7 +3630,7 @@ QString QUrl::errorString() const
" query = ", d->query);
appendComponentIfPresent(msg, d->sectionIsPresent & QUrlPrivate::Fragment,
" fragment = ", d->fragment);
- if (msg.endsWith(QLatin1Char(',')))
+ if (msg.endsWith(u','))
msg.chop(1);
return msg;
}
@@ -3738,8 +3701,8 @@ static QUrl adjustFtpPath(QUrl url)
{
if (url.scheme() == ftpScheme()) {
QString path = url.path(QUrl::PrettyDecoded);
- if (path.startsWith(QLatin1String("//")))
- url.setPath(QLatin1String("/%2F") + QStringView{path}.mid(2), QUrl::TolerantMode);
+ if (path.startsWith("//"_L1))
+ url.setPath("/%2F"_L1 + QStringView{path}.mid(2), QUrl::TolerantMode);
}
return url;
}
@@ -3824,7 +3787,7 @@ QUrl QUrl::fromUserInput(const QString &userInput, const QString &workingDirecto
if (QDir::isAbsolutePath(trimmedString))
return QUrl::fromLocalFile(trimmedString);
- QUrl urlPrepended = QUrl(QLatin1String("http://") + trimmedString, QUrl::TolerantMode);
+ QUrl urlPrepended = QUrl("http://"_L1 + trimmedString, QUrl::TolerantMode);
// Check the most common case of a valid url with a scheme
// We check if the port would be valid by adding the scheme to handle the case host:port
@@ -3836,7 +3799,7 @@ QUrl QUrl::fromUserInput(const QString &userInput, const QString &workingDirecto
// Else, try the prepended one and adjust the scheme from the host name
if (urlPrepended.isValid() && (!urlPrepended.host().isEmpty() || !urlPrepended.path().isEmpty())) {
- int dotIndex = trimmedString.indexOf(QLatin1Char('.'));
+ qsizetype dotIndex = trimmedString.indexOf(u'.');
const QStringView hostscheme = QStringView{trimmedString}.left(dotIndex);
if (hostscheme.compare(ftpScheme(), Qt::CaseInsensitive) == 0)
urlPrepended.setScheme(ftpScheme());
diff --git a/src/corelib/io/qurl.h b/src/corelib/io/qurl.h
index 62b8e8cd93..d6779cf485 100644
--- a/src/corelib/io/qurl.h
+++ b/src/corelib/io/qurl.h
@@ -1,51 +1,15 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// Copyright (C) 2016 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QURL_H
#define QURL_H
#include <QtCore/qbytearray.h>
+#include <QtCore/qcompare.h>
#include <QtCore/qobjectdefs.h>
#include <QtCore/qstring.h>
#include <QtCore/qlist.h>
-#include <QtCore/qpair.h>
#include <QtCore/qglobal.h>
#if defined(Q_OS_DARWIN) || defined(Q_QDOC)
@@ -179,8 +143,8 @@ public:
#endif
QUrl();
- QUrl(const QUrl &copy);
- QUrl &operator =(const QUrl &copy);
+ QUrl(const QUrl &copy) noexcept;
+ QUrl &operator =(const QUrl &copy) noexcept;
#ifdef QT_NO_URL_CAST_FROM_STRING
explicit QUrl(const QString &url, ParsingMode mode = TolerantMode);
#else
@@ -192,7 +156,7 @@ public:
QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_PURE_SWAP(QUrl)
~QUrl();
- inline void swap(QUrl &other) noexcept { qSwap(d, other.d); }
+ void swap(QUrl &other) noexcept { qt_ptr_swap(d, other.d); }
void setUrl(const QString &url, ParsingMode mode = TolerantMode);
QString url(FormattingOptions options = FormattingOptions(PrettyDecoded)) const;
@@ -201,7 +165,10 @@ public:
[[nodiscard]] QUrl adjusted(FormattingOptions options) const;
QByteArray toEncoded(FormattingOptions options = FullyEncoded) const;
+#if QT_CORE_REMOVED_SINCE(6, 7)
static QUrl fromEncoded(const QByteArray &url, ParsingMode mode = TolerantMode);
+#endif
+ static QUrl fromEncoded(QByteArrayView input, ParsingMode mode = TolerantMode);
enum UserInputResolutionOption {
DefaultResolution,
@@ -264,9 +231,11 @@ public:
void detach();
bool isDetached() const;
+#if QT_CORE_REMOVED_SINCE(6, 8)
bool operator <(const QUrl &url) const;
bool operator ==(const QUrl &url) const;
bool operator !=(const QUrl &url) const;
+#endif
bool matches(const QUrl &url, FormattingOptions options) const;
@@ -287,15 +256,12 @@ public:
};
Q_DECLARE_FLAGS(AceProcessingOptions, AceProcessingOption)
-#if QT_VERSION >= QT_VERSION_CHECK(7, 0, 0)
- static QString fromAce(const QByteArray &, AceProcessingOptions options = {});
- static QByteArray toAce(const QString &, AceProcessingOptions options = {});
-#else
+#if QT_CORE_REMOVED_SINCE(6, 3)
static QString fromAce(const QByteArray &);
static QByteArray toAce(const QString &);
- static QString fromAce(const QByteArray &, AceProcessingOptions options);
- static QByteArray toAce(const QString &, AceProcessingOptions options);
#endif
+ static QString fromAce(const QByteArray &domain, AceProcessingOptions options = {});
+ static QByteArray toAce(const QString &domain, AceProcessingOptions options = {});
static QStringList idnWhitelist();
static QStringList toStringList(const QList<QUrl> &uris, FormattingOptions options = FormattingOptions(PrettyDecoded));
@@ -305,6 +271,11 @@ public:
friend Q_CORE_EXPORT size_t qHash(const QUrl &url, size_t seed) noexcept;
private:
+ friend Q_CORE_EXPORT bool comparesEqual(const QUrl &lhs, const QUrl &rhs);
+ friend Q_CORE_EXPORT Qt::weak_ordering
+ compareThreeWay(const QUrl &lhs, const QUrl &rhs);
+ Q_DECLARE_WEAKLY_ORDERED(QUrl)
+
QUrlPrivate *d;
friend class QUrlQuery;
diff --git a/src/corelib/io/qurl_p.h b/src/corelib/io/qurl_p.h
index 9b755cf5df..9562d1993d 100644
--- a/src/corelib/io/qurl_p.h
+++ b/src/corelib/io/qurl_p.h
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2016 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QURL_P_H
#define QURL_P_H
@@ -65,8 +29,8 @@ extern Q_AUTOTEST_EXPORT qsizetype qt_urlRecode(QString &appendTo, QStringView u
// in qurlidna.cpp
enum AceLeadingDot { AllowLeadingDot, ForbidLeadingDot };
enum AceOperation { ToAceOnly, NormalizeAce };
-extern QString qt_ACE_do(const QString &domain, AceOperation op, AceLeadingDot dot,
- QUrl::AceProcessingOptions options);
+QString Q_CORE_EXPORT qt_ACE_do(const QString &domain, AceOperation op, AceLeadingDot dot,
+ QUrl::AceProcessingOptions options = {});
extern Q_AUTOTEST_EXPORT void qt_punycodeEncoder(QStringView in, QString *output);
extern Q_AUTOTEST_EXPORT QString qt_punycodeDecoder(const QString &pc);
diff --git a/src/corelib/io/qurlidna.cpp b/src/corelib/io/qurlidna.cpp
index b3e67fecf7..a2a81c7605 100644
--- a/src/corelib/io/qurlidna.cpp
+++ b/src/corelib/io/qurlidna.cpp
@@ -1,47 +1,12 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2016 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qurl_p.h"
#include <QtCore/qstringlist.h>
#include <QtCore/private/qnumeric_p.h>
+#include <QtCore/private/qoffsetstringarray_p.h>
#include <QtCore/private/qstringiterator_p.h>
#include <QtCore/private/qunicodetables_p.h>
@@ -49,6 +14,8 @@
QT_BEGIN_NAMESPACE
+using namespace Qt::StringLiterals;
+
// needed by the punycode encoder/decoder
static const uint base = 36;
static const uint tmin = 1;
@@ -106,11 +73,11 @@ Q_AUTOTEST_EXPORT void qt_punycodeEncoder(QStringView in, QString *output)
// Do not try to encode strings that certainly will result in output
// that is longer than allowable domain name label length. Note that
// non-BMP codepoints are encoded as two QChars.
- if (in.length() > MaxDomainLabelLength * 2)
+ if (in.size() > MaxDomainLabelLength * 2)
return;
- int outLen = output->length();
- output->resize(outLen + in.length());
+ int outLen = output->size();
+ output->resize(outLen + in.size());
QChar *d = output->data() + outLen;
bool skipped = false;
@@ -136,7 +103,7 @@ Q_AUTOTEST_EXPORT void qt_punycodeEncoder(QStringView in, QString *output)
// if basic code points were copied, add the delimiter character.
if (h > 0)
- *output += QLatin1Char{'-'};
+ *output += u'-';
// compute the input length in Unicode code points.
uint inputLength = 0;
@@ -165,7 +132,7 @@ Q_AUTOTEST_EXPORT void qt_punycodeEncoder(QStringView in, QString *output)
// delta = delta + (m - n) * (h + 1), fail on overflow
uint tmp;
- if (mul_overflow<uint>(m - n, h + 1, &tmp) || add_overflow<uint>(delta, tmp, &delta)) {
+ if (qMulOverflow<uint>(m - n, h + 1, &tmp) || qAddOverflow<uint>(delta, tmp, &delta)) {
output->truncate(outLen);
return; // punycode_overflow
}
@@ -177,7 +144,7 @@ Q_AUTOTEST_EXPORT void qt_punycodeEncoder(QStringView in, QString *output)
// increase delta until we reach the character processed in this iteration;
// fail if delta overflows.
if (c < n) {
- if (add_overflow<uint>(delta, 1, &delta)) {
+ if (qAddOverflow<uint>(delta, 1, &delta)) {
output->truncate(outLen);
return; // punycode_overflow
}
@@ -197,7 +164,7 @@ Q_AUTOTEST_EXPORT void qt_punycodeEncoder(QStringView in, QString *output)
}
// prepend ACE prefix
- output->insert(outLen, QLatin1String("xn--"));
+ output->insert(outLen, "xn--"_L1);
return;
}
@@ -210,17 +177,17 @@ Q_AUTOTEST_EXPORT QString qt_punycodeDecoder(const QString &pc)
// Do not try to decode strings longer than allowable for a domain label.
// Non-ASCII strings are not allowed here anyway, so there is no need
// to account for surrogates.
- if (pc.length() > MaxDomainLabelLength)
+ if (pc.size() > MaxDomainLabelLength)
return QString();
// strip any ACE prefix
- int start = pc.startsWith(QLatin1String("xn--")) ? 4 : 0;
+ int start = pc.startsWith("xn--"_L1) ? 4 : 0;
if (!start)
return pc;
// find the last delimiter character '-' in the input array. copy
// all data before this delimiter directly to the output array.
- int delimiterPos = pc.lastIndexOf(QLatin1Char{'-'});
+ int delimiterPos = pc.lastIndexOf(u'-');
auto output = delimiterPos < 4 ? std::u32string()
: pc.mid(start, delimiterPos - start).toStdU32String();
@@ -252,7 +219,7 @@ Q_AUTOTEST_EXPORT QString qt_punycodeDecoder(const QString &pc)
// i = i + digit * w, fail on overflow
uint tmp;
- if (mul_overflow<uint>(digit, w, &tmp) || add_overflow<uint>(i, tmp, &i))
+ if (qMulOverflow<uint>(digit, w, &tmp) || qAddOverflow<uint>(i, tmp, &i))
return QString();
// detect threshold to stop reading delta digits
@@ -264,7 +231,7 @@ Q_AUTOTEST_EXPORT QString qt_punycodeDecoder(const QString &pc)
if (digit < t) break;
// w = w * (base - t), fail on overflow
- if (mul_overflow<uint>(w, base - t, &w))
+ if (qMulOverflow<uint>(w, base - t, &w))
return QString();
}
@@ -274,7 +241,7 @@ Q_AUTOTEST_EXPORT QString qt_punycodeDecoder(const QString &pc)
bias = adapt(i - oldi, outputLength + 1, oldi == 0);
// n = n + i div (length(output) + 1), fail on overflow
- if (add_overflow<uint>(n, i / (outputLength + 1), &n))
+ if (qAddOverflow<uint>(n, i / (outputLength + 1), &n))
return QString();
// allow the deltas to wrap around
@@ -310,7 +277,7 @@ Q_AUTOTEST_EXPORT QString qt_punycodeDecoder(const QString &pc)
return QString::fromStdU32String(output);
}
-static const char * const idn_whitelist[] = {
+static constexpr auto idn_whitelist = qOffsetStringArray(
"ac", "ar", "asia", "at",
"biz", "br",
"cat", "ch", "cl", "cn", "com",
@@ -347,26 +314,25 @@ static const char * const idn_whitelist[] = {
"xn--wgbh1c", // Egypt
"xn--wgbl6a", // Qatar
"xn--xkc2al3hye2a" // Sri Lanka
-};
-static const size_t idn_whitelist_size = sizeof idn_whitelist / sizeof *idn_whitelist;
+);
-static QStringList *user_idn_whitelist = nullptr;
+Q_CONSTINIT static QStringList *user_idn_whitelist = nullptr;
static bool lessThan(const QChar *a, int l, const char *c)
{
- const ushort *uc = (const ushort *)a;
- const ushort *e = uc + l;
+ const auto *uc = reinterpret_cast<const char16_t *>(a);
+ const char16_t *e = uc + l;
if (!c || *c == 0)
return false;
while (*c) {
- if (uc == e || *uc != *c)
+ if (uc == e || *uc != static_cast<unsigned char>(*c))
break;
++uc;
++c;
}
- return (uc == e ? *c : *uc < *c);
+ return uc == e ? *c : (*uc < static_cast<unsigned char>(*c));
}
static bool equal(const QChar *a, int l, const char *b)
@@ -383,7 +349,7 @@ static bool equal(const QChar *a, int l, const char *b)
static bool qt_is_idn_enabled(QStringView aceDomain)
{
- auto idx = aceDomain.lastIndexOf(QLatin1Char('.'));
+ auto idx = aceDomain.lastIndexOf(u'.');
if (idx == -1)
return false;
@@ -396,17 +362,17 @@ static bool qt_is_idn_enabled(QStringView aceDomain)
return user_idn_whitelist->contains(tldString);
int l = 0;
- int r = idn_whitelist_size - 1;
+ int r = idn_whitelist.count() - 1;
int i = (l + r + 1) / 2;
while (r != l) {
- if (lessThan(tld, len, idn_whitelist[i]))
+ if (lessThan(tld, len, idn_whitelist.at(i)))
r = i - 1;
else
l = i;
i = (l + r + 1) / 2;
}
- return equal(tld, len, idn_whitelist[i]);
+ return equal(tld, len, idn_whitelist.at(i));
}
template<typename C>
@@ -457,13 +423,19 @@ static QString mapDomainName(const QString &in, QUrl::AceProcessingOptions optio
if (uc >= U'A' && uc <= U'Z')
uc |= 0x20; // lower-case it
- if (!isValidInNormalizedAsciiName(uc))
- return {};
+ if (isValidInNormalizedAsciiName(uc)) {
+ result.append(static_cast<char16_t>(uc));
+ continue;
+ }
+ }
- result.append(static_cast<char16_t>(uc));
+ allAscii = false;
+
+ // Capital sharp S is a special case since UTR #46 revision 31 (Unicode 15.1)
+ if (uc == 0x1E9E && options.testFlag(QUrl::AceTransitionalProcessing)) {
+ result.append(u"ss"_s);
continue;
}
- allAscii = false;
QUnicodeTables::IdnaStatus status = QUnicodeTables::idnaStatus(uc);
@@ -476,14 +448,13 @@ static QString mapDomainName(const QString &in, QUrl::AceProcessingOptions optio
case QUnicodeTables::IdnaStatus::Ignored:
continue;
case QUnicodeTables::IdnaStatus::Valid:
+ case QUnicodeTables::IdnaStatus::Disallowed:
for (auto c : QChar::fromUcs4(uc))
result.append(c);
break;
case QUnicodeTables::IdnaStatus::Mapped:
result.append(QUnicodeTables::idnaMapping(uc));
break;
- case QUnicodeTables::IdnaStatus::Disallowed:
- return {};
default:
Q_UNREACHABLE();
}
@@ -502,7 +473,7 @@ static QString mapDomainName(const QString &in, QUrl::AceProcessingOptions optio
*/
static bool validateAsciiLabel(QStringView label)
{
- if (label.length() > MaxDomainLabelLength)
+ if (label.size() > MaxDomainLabelLength)
return false;
if (label.first() == u'-' || label.last() == u'-')
@@ -517,12 +488,13 @@ class DomainValidityChecker
{
bool domainNameIsBidi = false;
bool hadBidiErrors = false;
+ bool ignoreBidiErrors;
static constexpr char32_t ZWNJ = U'\u200C';
static constexpr char32_t ZWJ = U'\u200D';
public:
- DomainValidityChecker() { }
+ DomainValidityChecker(bool ignoreBidiErrors = false) : ignoreBidiErrors(ignoreBidiErrors) { }
bool checkLabel(const QString &label, QUrl::AceProcessingOptions options);
private:
@@ -743,18 +715,18 @@ bool DomainValidityChecker::checkLabel(const QString &label, QUrl::AceProcessing
if (label != label.normalized(QString::NormalizationForm_C))
return false;
- if (label.length() >= 4) {
+ if (label.size() >= 4) {
// This assumes that the first two characters are in BMP, but that's ok
// because non-BMP characters are unlikely to be used for specifying
// future extensions.
- if (label[2] == QLatin1Char('-') && label[3] == QLatin1Char('-'))
- return false;
+ if (label[2] == u'-' && label[3] == u'-')
+ return ignoreBidiErrors && label.startsWith(u"xn") && validateAsciiLabel(label);
}
- if (label.startsWith(QLatin1Char('-')) || label.endsWith(QLatin1Char('-')))
+ if (label.startsWith(u'-') || label.endsWith(u'-'))
return false;
- if (label.contains(QLatin1Char('.')))
+ if (label.contains(u'.'))
return false;
QStringIterator iter(label);
@@ -770,7 +742,7 @@ bool DomainValidityChecker::checkLabel(const QString &label, QUrl::AceProcessing
for (;;) {
hasJoiners = hasJoiners || c == ZWNJ || c == ZWJ;
- if (!domainNameIsBidi) {
+ if (!ignoreBidiErrors && !domainNameIsBidi) {
switch (QChar::direction(c)) {
case QChar::DirR:
case QChar::DirAL:
@@ -811,25 +783,20 @@ bool DomainValidityChecker::checkLabel(const QString &label, QUrl::AceProcessing
return true;
}
-static QString convertToAscii(const QString &normalizedDomain, AceLeadingDot dot)
+static QString convertToAscii(QStringView normalizedDomain, AceLeadingDot dot)
{
qsizetype lastIdx = 0;
QString aceForm; // this variable is here for caching
QString aceResult;
while (true) {
- auto idx = normalizedDomain.indexOf(u'.', lastIdx);
+ qsizetype idx = normalizedDomain.indexOf(u'.', lastIdx);
if (idx == -1)
idx = normalizedDomain.size();
- const auto labelLength = idx - lastIdx;
- if (labelLength == 0) {
- if (idx == normalizedDomain.size())
- break;
- if (dot == ForbidLeadingDot || idx > 0)
- return {}; // two delimiters in a row -- empty label not allowed
- } else {
- const auto label = QStringView(normalizedDomain).sliced(lastIdx, labelLength);
+ const qsizetype labelLength = idx - lastIdx;
+ if (labelLength) {
+ const auto label = normalizedDomain.sliced(lastIdx, labelLength);
aceForm.clear();
qt_punycodeEncoder(label, &aceForm);
if (aceForm.isEmpty())
@@ -841,6 +808,9 @@ static QString convertToAscii(const QString &normalizedDomain, AceLeadingDot dot
if (idx == normalizedDomain.size())
break;
+ if (labelLength == 0 && (dot == ForbidLeadingDot || idx > 0))
+ return {}; // two delimiters in a row -- empty label not allowed
+
lastIdx = idx + 1;
aceResult += u'.';
}
@@ -848,7 +818,7 @@ static QString convertToAscii(const QString &normalizedDomain, AceLeadingDot dot
return aceResult;
}
-static bool checkAsciiDomainName(const QString &normalizedDomain, AceLeadingDot dot,
+static bool checkAsciiDomainName(QStringView normalizedDomain, AceLeadingDot dot,
bool *usesPunycode)
{
qsizetype lastIdx = 0;
@@ -867,11 +837,11 @@ static bool checkAsciiDomainName(const QString &normalizedDomain, AceLeadingDot
if (dot == ForbidLeadingDot || idx > 0)
return false; // two delimiters in a row -- empty label not allowed
} else {
- const auto label = QStringView(normalizedDomain).sliced(lastIdx, labelLength);
+ const auto label = normalizedDomain.sliced(lastIdx, labelLength);
if (!validateAsciiLabel(label))
return false;
- hasPunycode = hasPunycode || label.startsWith(QLatin1String("xn--"));
+ hasPunycode = hasPunycode || label.startsWith("xn--"_L1);
}
lastIdx = idx + 1;
@@ -920,6 +890,33 @@ static QString convertToUnicode(const QString &asciiDomain, QUrl::AceProcessingO
return result;
}
+static bool checkUnicodeName(const QString &domainName, QUrl::AceProcessingOptions options)
+{
+ qsizetype lastIdx = 0;
+
+ DomainValidityChecker checker(true);
+
+ while (true) {
+ qsizetype idx = domainName.indexOf(u'.', lastIdx);
+ if (idx == -1)
+ idx = domainName.size();
+
+ const qsizetype labelLength = idx - lastIdx;
+ if (labelLength) {
+ const auto label = domainName.sliced(lastIdx, labelLength);
+
+ if (!checker.checkLabel(label, options))
+ return false;
+ }
+
+ if (idx == domainName.size())
+ break;
+
+ lastIdx = idx + 1;
+ }
+ return true;
+}
+
QString qt_ACE_do(const QString &domain, AceOperation op, AceLeadingDot dot,
QUrl::AceProcessingOptions options)
{
@@ -934,12 +931,15 @@ QString qt_ACE_do(const QString &domain, AceOperation op, AceLeadingDot dot,
if (normalized.isEmpty())
return {};
- bool needsCoversionToUnicode;
+ if (!mappedToAscii && !checkUnicodeName(normalized, options))
+ return {};
+
+ bool needsConversionToUnicode;
const QString aceResult = mappedToAscii ? normalized : convertToAscii(normalized, dot);
- if (aceResult.isEmpty() || !checkAsciiDomainName(aceResult, dot, &needsCoversionToUnicode))
+ if (aceResult.isEmpty() || !checkAsciiDomainName(aceResult, dot, &needsConversionToUnicode))
return {};
- if (op == ToAceOnly || !needsCoversionToUnicode
+ if (op == ToAceOnly || !needsConversionToUnicode
|| (!options.testFlag(QUrl::IgnoreIDNWhitelist) && !qt_is_idn_enabled(aceResult))) {
return aceResult;
}
@@ -963,10 +963,10 @@ QStringList QUrl::idnWhitelist()
return *user_idn_whitelist;
static const QStringList list = [] {
QStringList list;
- list.reserve(idn_whitelist_size);
- unsigned int i = 0;
- while (i < idn_whitelist_size) {
- list << QLatin1String(idn_whitelist[i]);
+ list.reserve(idn_whitelist.count());
+ int i = 0;
+ while (i < idn_whitelist.count()) {
+ list << QLatin1StringView(idn_whitelist.at(i));
++i;
}
return list;
diff --git a/src/corelib/io/qurlquery.cpp b/src/corelib/io/qurlquery.cpp
index 637e6c3c01..31f3ee1d90 100644
--- a/src/corelib/io/qurlquery.cpp
+++ b/src/corelib/io/qurlquery.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qurlquery.h"
#include "qurl_p.h"
@@ -60,6 +24,8 @@ QT_BEGIN_NAMESPACE
\ingroup network
\ingroup shared
+ \compares equality
+
It is used to parse the query strings found in URLs like the following:
\image qurl-querystring.png
@@ -95,7 +61,7 @@ QT_BEGIN_NAMESPACE
improperly-encoded strings are passed to the setter or query methods,
QUrlQuery will attempt to recover instead of failing. That is to say, all
functions in this class parse their string arguments as if the
- {{QUrl::TolerantMode}} decoding mode was specified.
+ QUrl::TolerantMode decoding mode was specified.
Application code should strive to always ensure proper encoding and not rely
on TolerantMode parsing fixing the strings. Notably, all user input must be
@@ -159,14 +125,14 @@ QT_BEGIN_NAMESPACE
*/
/*!
- \fn QUrlQuery::QUrlQuery(std::initializer_list<QPair<QString, QString>> list)
+ \fn QUrlQuery::QUrlQuery(std::initializer_list<std::pair<QString, QString>> list)
\since 5.13
Constructs a QUrlQuery object from the \a list of key/value pair.
*/
-typedef QList<QPair<QString, QString> > Map;
+typedef QList<std::pair<QString, QString> > Map;
class QUrlQueryPrivate : public QSharedData
{
@@ -182,7 +148,7 @@ public:
void setQuery(const QString &query);
void addQueryItem(const QString &key, const QString &value)
- { itemList.append(qMakePair(recodeFromUser(key), recodeFromUser(value))); }
+ { itemList.append(std::make_pair(recodeFromUser(key), recodeFromUser(value))); }
int findRecodedKey(const QString &key, int from = 0) const
{
for (int i = from; i < itemList.size(); ++i)
@@ -326,17 +292,17 @@ void QUrlQueryPrivate::setQuery(const QString &query)
if (delimiter == pos) {
// the value delimiter wasn't found, store a null value
- itemList.append(qMakePair(key, QString()));
+ itemList.append(std::make_pair(key, QString()));
} else if (delimiter + 1 == pos) {
// if the delimiter was found but the value is empty, store empty-but-not-null
- itemList.append(qMakePair(key, QString(0, Qt::Uninitialized)));
+ itemList.append(std::make_pair(key, QString(0, Qt::Uninitialized)));
} else {
QString value;
if (!qt_urlRecode(value, QStringView{delimiter + 1, pos},
QUrl::DecodeReserved,
prettyDecodedActions))
value = QString(delimiter + 1, pos - delimiter - 1);
- itemList.append(qMakePair(key, value));
+ itemList.append(std::make_pair(key, value));
}
if (pos != end)
@@ -400,6 +366,16 @@ QUrlQuery::QUrlQuery(const QUrlQuery &other)
}
/*!
+ \since 6.5
+ Moves the contents of the \a other QUrlQuery object, including the query
+ delimiters.
+*/
+QUrlQuery::QUrlQuery(QUrlQuery &&other) noexcept
+ : d(std::move(other.d))
+{
+}
+
+/*!
Copies the contents of the \a other QUrlQuery object, including the query
delimiters.
*/
@@ -425,19 +401,26 @@ QUrlQuery::~QUrlQuery()
}
/*!
- Returns \c true if this object and the \a other object contain the same
+ \fn bool QUrlQuery::operator==(const QUrlQuery &lhs, const QUrlQuery &rhs)
+
+ Returns \c true if QUrlQuery objects \a lhs and \a rhs contain the same
contents, in the same order, and use the same query delimiters.
*/
-bool QUrlQuery::operator ==(const QUrlQuery &other) const
+
+bool comparesEqual(const QUrlQuery &lhs, const QUrlQuery &rhs)
{
- if (d == other.d)
+ if (lhs.d == rhs.d)
return true;
- if (d && other.d)
+ if (lhs.d && rhs.d)
// keep in sync with qHash(QUrlQuery):
- return d->valueDelimiter == other.d->valueDelimiter &&
- d->pairDelimiter == other.d->pairDelimiter &&
- d->itemList == other.d->itemList;
- return false;
+ return lhs.d->valueDelimiter == rhs.d->valueDelimiter &&
+ lhs.d->pairDelimiter == rhs.d->pairDelimiter &&
+ lhs.d->itemList == rhs.d->itemList;
+
+ const QUrlQueryPrivate *x = lhs.d ? lhs.d.data() : rhs.d.data();
+ return x->valueDelimiter == QUrlQuery::defaultQueryValueDelimiter() &&
+ x->pairDelimiter == QUrlQuery::defaultQueryPairDelimiter() &&
+ x->itemList.isEmpty();
}
/*!
@@ -551,7 +534,7 @@ QString QUrlQuery::query(QUrl::ComponentFormattingOptions encoding) const
{
int size = 0;
for ( ; it != end; ++it)
- size += it->first.length() + 1 + it->second.length() + 1;
+ size += it->first.size() + 1 + it->second.size() + 1;
result.reserve(size + size / 4);
}
@@ -580,7 +563,7 @@ QString QUrlQuery::query(QUrl::ComponentFormattingOptions encoding) const
representation of the keys and values of the query string are
percent encoded when returned in query().
- If \a valueDelimiter is set to '(' and \a pairDelimiter is ')',
+ If \a valueDelimiter is set to ',' and \a pairDelimiter is ';',
the above query string would instead be represented like this:
\snippet code/src_corelib_io_qurl.cpp 4
@@ -591,7 +574,7 @@ QString QUrlQuery::query(QUrl::ComponentFormattingOptions encoding) const
\snippet code/src_corelib_io_qurlquery.cpp 0
Use of other characters is not supported and may result in unexpected
- behaviour. This method does not verify that you passed a valid delimiter.
+ behavior. This method does not verify that you passed a valid delimiter.
\sa queryValueDelimiter(), queryPairDelimiter()
*/
@@ -635,14 +618,14 @@ QChar QUrlQuery::queryPairDelimiter() const
\sa queryItems(), isEmpty()
*/
-void QUrlQuery::setQueryItems(const QList<QPair<QString, QString> > &query)
+void QUrlQuery::setQueryItems(const QList<std::pair<QString, QString> > &query)
{
clear();
if (query.isEmpty())
return;
QUrlQueryPrivate *dd = d;
- QList<QPair<QString, QString> >::const_iterator it = query.constBegin(),
+ QList<std::pair<QString, QString> >::const_iterator it = query.constBegin(),
end = query.constEnd();
for ( ; it != end; ++it)
dd->addQueryItem(it->first, it->second);
@@ -656,20 +639,20 @@ void QUrlQuery::setQueryItems(const QList<QPair<QString, QString> > &query)
\sa setQueryItems(), {encoding}{Encoding}
*/
-QList<QPair<QString, QString> > QUrlQuery::queryItems(QUrl::ComponentFormattingOptions encoding) const
+QList<std::pair<QString, QString> > QUrlQuery::queryItems(QUrl::ComponentFormattingOptions encoding) const
{
if (!d)
- return QList<QPair<QString, QString> >();
+ return QList<std::pair<QString, QString> >();
if (idempotentRecodeToUser(encoding))
return d->itemList;
- QList<QPair<QString, QString> > result;
+ QList<std::pair<QString, QString> > result;
Map::const_iterator it = d->itemList.constBegin();
Map::const_iterator end = d->itemList.constEnd();
- result.reserve(d->itemList.count());
+ result.reserve(d->itemList.size());
for ( ; it != end; ++it)
- result << qMakePair(d->recodeToUser(it->first, encoding),
- d->recodeToUser(it->second, encoding));
+ result << std::make_pair(d->recodeToUser(it->first, encoding),
+ d->recodeToUser(it->second, encoding));
return result;
}
@@ -788,7 +771,7 @@ void QUrlQuery::removeAllQueryItems(const QString &key)
if (d.constData()) {
auto *p = d.data();
const QString encodedKey = p->recodeFromUser(key);
- auto firstEqualsEncodedKey = [&encodedKey](const QPair<QString, QString> &item) {
+ auto firstEqualsEncodedKey = [&encodedKey](const std::pair<QString, QString> &item) {
return item.first == encodedKey;
};
p->itemList.removeIf(firstEqualsEncodedKey);
@@ -832,10 +815,15 @@ void QUrlQuery::removeAllQueryItems(const QString &key)
*/
/*!
- \fn bool QUrlQuery::operator!=(const QUrlQuery &other) const
+ \fn bool QUrlQuery::operator!=(const QUrlQuery &lhs, const QUrlQuery &rhs)
- Returns \c true if \a other is not equal to this QUrlQuery. Otherwise, returns \c false.
+ Returns \c true if the QUrlQuery object \a rhs is not equal to \a lhs.
+ Otherwise, returns \c false.
\sa operator==()
*/
QT_END_NAMESPACE
+
+#undef decode
+#undef leave
+#undef encode
diff --git a/src/corelib/io/qurlquery.h b/src/corelib/io/qurlquery.h
index aba5df6a57..061107606e 100644
--- a/src/corelib/io/qurlquery.h
+++ b/src/corelib/io/qurlquery.h
@@ -1,47 +1,11 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// Copyright (C) 2016 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QURLQUERY_H
#define QURLQUERY_H
-#include <QtCore/qpair.h>
+#include <QtCore/qcompare.h>
#include <QtCore/qshareddata.h>
#include <QtCore/qurl.h>
@@ -58,23 +22,26 @@ public:
QUrlQuery();
explicit QUrlQuery(const QUrl &url);
explicit QUrlQuery(const QString &queryString);
- QUrlQuery(std::initializer_list<QPair<QString, QString>> list)
+ QUrlQuery(std::initializer_list<std::pair<QString, QString>> list)
: QUrlQuery()
{
- for (const QPair<QString, QString> &item : list)
+ for (const std::pair<QString, QString> &item : list)
addQueryItem(item.first, item.second);
}
QUrlQuery(const QUrlQuery &other);
+ QUrlQuery(QUrlQuery &&other) noexcept;
QUrlQuery &operator=(const QUrlQuery &other);
QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_PURE_SWAP(QUrlQuery)
~QUrlQuery();
+#if QT_CORE_REMOVED_SINCE(6, 8)
bool operator==(const QUrlQuery &other) const;
bool operator!=(const QUrlQuery &other) const
- { return !(*this == other); }
+ { return !operator==(other); }
+#endif
- void swap(QUrlQuery &other) noexcept { qSwap(d, other.d); }
+ void swap(QUrlQuery &other) noexcept { d.swap(other.d); }
bool isEmpty() const;
bool isDetached() const;
@@ -89,8 +56,8 @@ public:
QChar queryValueDelimiter() const;
QChar queryPairDelimiter() const;
- void setQueryItems(const QList<QPair<QString, QString> > &query);
- QList<QPair<QString, QString> > queryItems(QUrl::ComponentFormattingOptions encoding = QUrl::PrettyDecoded) const;
+ void setQueryItems(const QList<std::pair<QString, QString> > &query);
+ QList<std::pair<QString, QString> > queryItems(QUrl::ComponentFormattingOptions encoding = QUrl::PrettyDecoded) const;
bool hasQueryItem(const QString &key) const;
void addQueryItem(const QString &key, const QString &value);
@@ -103,6 +70,8 @@ public:
static constexpr char16_t defaultQueryPairDelimiter() noexcept { return u'&'; }
private:
+ friend Q_CORE_EXPORT bool comparesEqual(const QUrlQuery &lhs, const QUrlQuery &rhs);
+ Q_DECLARE_EQUALITY_COMPARABLE(QUrlQuery)
friend class QUrl;
friend Q_CORE_EXPORT size_t qHash(const QUrlQuery &key, size_t seed) noexcept;
QSharedDataPointer<QUrlQueryPrivate> d;
diff --git a/src/corelib/io/qurlrecode.cpp b/src/corelib/io/qurlrecode.cpp
index fd5accb108..60dad31a3e 100644
--- a/src/corelib/io/qurlrecode.cpp
+++ b/src/corelib/io/qurlrecode.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qurl.h"
#include "private/qstringconverter_p.h"
@@ -676,7 +640,7 @@ qt_urlRecode(QString &appendTo, QStringView in,
{
uchar actionTable[sizeof defaultActionTable];
if ((encoding & QUrl::FullyDecoded) == QUrl::FullyDecoded) {
- return int(decode(appendTo, in));
+ return decode(appendTo, in);
}
memcpy(actionTable, defaultActionTable, sizeof actionTable);
diff --git a/src/corelib/io/qwindowspipereader.cpp b/src/corelib/io/qwindowspipereader.cpp
index 4435a47cab..31d0dc1417 100644
--- a/src/corelib/io/qwindowspipereader.cpp
+++ b/src/corelib/io/qwindowspipereader.cpp
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2021 Alex Trotsenko <alex1973tr@gmail.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2021 Alex Trotsenko <alex1973tr@gmail.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qwindowspipereader_p.h"
#include <qcoreapplication.h>
@@ -45,6 +9,8 @@
QT_BEGIN_NAMESPACE
+using namespace Qt::StringLiterals;
+
static const DWORD minReadBufferSize = 4096;
QWindowsPipeReader::QWindowsPipeReader(QObject *parent)
@@ -493,7 +459,7 @@ bool QWindowsPipeReader::consumePendingAndEmit(bool allowWinActPosting)
if (emitReadyRead)
emit readyRead();
if (alive && dwError != ERROR_BROKEN_PIPE && dwError != ERROR_PIPE_NOT_CONNECTED)
- emit winError(dwError, QLatin1String("QWindowsPipeReader::consumePendingAndEmit"));
+ emit winError(dwError, "QWindowsPipeReader::consumePendingAndEmit"_L1);
if (alive)
emit pipeClosed();
}
@@ -545,3 +511,5 @@ bool QWindowsPipeReader::waitForNotification()
}
QT_END_NAMESPACE
+
+#include "moc_qwindowspipereader_p.cpp"
diff --git a/src/corelib/io/qwindowspipereader_p.h b/src/corelib/io/qwindowspipereader_p.h
index 22a4365f02..14db4f9313 100644
--- a/src/corelib/io/qwindowspipereader_p.h
+++ b/src/corelib/io/qwindowspipereader_p.h
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2021 Alex Trotsenko <alex1973tr@gmail.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2021 Alex Trotsenko <alex1973tr@gmail.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QWINDOWSPIPEREADER_P_H
#define QWINDOWSPIPEREADER_P_H
diff --git a/src/corelib/io/qwindowspipewriter.cpp b/src/corelib/io/qwindowspipewriter.cpp
index 2d96a3d87d..9d0f6a8a3e 100644
--- a/src/corelib/io/qwindowspipewriter.cpp
+++ b/src/corelib/io/qwindowspipewriter.cpp
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2021 Alex Trotsenko <alex1973tr@gmail.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2021 Alex Trotsenko <alex1973tr@gmail.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qwindowspipewriter_p.h"
#include <qcoreapplication.h>
@@ -350,3 +314,5 @@ bool QWindowsPipeWriter::consumePendingAndEmit(bool allowWinActPosting)
}
QT_END_NAMESPACE
+
+#include "moc_qwindowspipewriter_p.cpp"
diff --git a/src/corelib/io/qwindowspipewriter_p.h b/src/corelib/io/qwindowspipewriter_p.h
index 71e47c9787..c8c82310b8 100644
--- a/src/corelib/io/qwindowspipewriter_p.h
+++ b/src/corelib/io/qwindowspipewriter_p.h
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2021 Alex Trotsenko <alex1973tr@gmail.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2021 Alex Trotsenko <alex1973tr@gmail.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QWINDOWSPIPEWRITER_P_H
#define QWINDOWSPIPEWRITER_P_H
diff --git a/src/corelib/io/qzip.cpp b/src/corelib/io/qzip.cpp
new file mode 100644
index 0000000000..173563ec29
--- /dev/null
+++ b/src/corelib/io/qzip.cpp
@@ -0,0 +1,1347 @@
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#include "qzipreader_p.h"
+#include "qzipwriter_p.h"
+
+#include <qdatetime.h>
+#include <qendian.h>
+#include <qdebug.h>
+#include <qdir.h>
+
+#include <memory>
+
+#include <zlib.h>
+
+// Zip standard version for archives handled by this API
+// (actually, the only basic support of this version is implemented but it is enough for now)
+#define ZIP_VERSION 20
+
+#if 0
+#define ZDEBUG qDebug
+#else
+#define ZDEBUG if (0) qDebug
+#endif
+
+QT_BEGIN_NAMESPACE
+
+static inline uint readUInt(const uchar *data)
+{
+ return (data[0]) + (data[1]<<8) + (data[2]<<16) + (data[3]<<24);
+}
+
+static inline ushort readUShort(const uchar *data)
+{
+ return (data[0]) + (data[1]<<8);
+}
+
+static inline void writeUInt(uchar *data, uint i)
+{
+ data[0] = i & 0xff;
+ data[1] = (i>>8) & 0xff;
+ data[2] = (i>>16) & 0xff;
+ data[3] = (i>>24) & 0xff;
+}
+
+static inline void writeUShort(uchar *data, ushort i)
+{
+ data[0] = i & 0xff;
+ data[1] = (i>>8) & 0xff;
+}
+
+static inline void copyUInt(uchar *dest, const uchar *src)
+{
+ dest[0] = src[0];
+ dest[1] = src[1];
+ dest[2] = src[2];
+ dest[3] = src[3];
+}
+
+static inline void copyUShort(uchar *dest, const uchar *src)
+{
+ dest[0] = src[0];
+ dest[1] = src[1];
+}
+
+static void writeMSDosDate(uchar *dest, const QDateTime& dt)
+{
+ if (dt.isValid()) {
+ quint16 time =
+ (dt.time().hour() << 11) // 5 bit hour
+ | (dt.time().minute() << 5) // 6 bit minute
+ | (dt.time().second() >> 1); // 5 bit double seconds
+
+ dest[0] = time & 0xff;
+ dest[1] = time >> 8;
+
+ quint16 date =
+ ((dt.date().year() - 1980) << 9) // 7 bit year 1980-based
+ | (dt.date().month() << 5) // 4 bit month
+ | (dt.date().day()); // 5 bit day
+
+ dest[2] = char(date);
+ dest[3] = char(date >> 8);
+ } else {
+ dest[0] = 0;
+ dest[1] = 0;
+ dest[2] = 0;
+ dest[3] = 0;
+ }
+}
+
+static int inflate(Bytef *dest, ulong *destLen, const Bytef *source, ulong sourceLen)
+{
+ z_stream stream;
+ int err;
+
+ stream.next_in = const_cast<Bytef*>(source);
+ stream.avail_in = (uInt)sourceLen;
+ if ((uLong)stream.avail_in != sourceLen)
+ return Z_BUF_ERROR;
+
+ stream.next_out = dest;
+ stream.avail_out = (uInt)*destLen;
+ if ((uLong)stream.avail_out != *destLen)
+ return Z_BUF_ERROR;
+
+ stream.zalloc = (alloc_func)nullptr;
+ stream.zfree = (free_func)nullptr;
+
+ err = inflateInit2(&stream, -MAX_WBITS);
+ if (err != Z_OK)
+ return err;
+
+ err = inflate(&stream, Z_FINISH);
+ if (err != Z_STREAM_END) {
+ inflateEnd(&stream);
+ if (err == Z_NEED_DICT || (err == Z_BUF_ERROR && stream.avail_in == 0))
+ return Z_DATA_ERROR;
+ return err;
+ }
+ *destLen = stream.total_out;
+
+ err = inflateEnd(&stream);
+ return err;
+}
+
+static int deflate (Bytef *dest, ulong *destLen, const Bytef *source, ulong sourceLen)
+{
+ z_stream stream;
+ int err;
+
+ stream.next_in = const_cast<Bytef*>(source);
+ stream.avail_in = (uInt)sourceLen;
+ stream.next_out = dest;
+ stream.avail_out = (uInt)*destLen;
+ if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR;
+
+ stream.zalloc = (alloc_func)nullptr;
+ stream.zfree = (free_func)nullptr;
+ stream.opaque = (voidpf)nullptr;
+
+ err = deflateInit2(&stream, Z_DEFAULT_COMPRESSION, Z_DEFLATED, -MAX_WBITS, 8, Z_DEFAULT_STRATEGY);
+ if (err != Z_OK) return err;
+
+ err = deflate(&stream, Z_FINISH);
+ if (err != Z_STREAM_END) {
+ deflateEnd(&stream);
+ return err == Z_OK ? Z_BUF_ERROR : err;
+ }
+ *destLen = stream.total_out;
+
+ err = deflateEnd(&stream);
+ return err;
+}
+
+
+namespace WindowsFileAttributes {
+enum {
+ Dir = 0x10, // FILE_ATTRIBUTE_DIRECTORY
+ File = 0x80, // FILE_ATTRIBUTE_NORMAL
+ TypeMask = 0x90,
+
+ ReadOnly = 0x01, // FILE_ATTRIBUTE_READONLY
+ PermMask = 0x01
+};
+}
+
+namespace UnixFileAttributes {
+enum {
+ Dir = 0040000, // __S_IFDIR
+ File = 0100000, // __S_IFREG
+ SymLink = 0120000, // __S_IFLNK
+ TypeMask = 0170000, // __S_IFMT
+
+ ReadUser = 0400, // __S_IRUSR
+ WriteUser = 0200, // __S_IWUSR
+ ExeUser = 0100, // __S_IXUSR
+ ReadGroup = 0040, // __S_IRGRP
+ WriteGroup = 0020, // __S_IWGRP
+ ExeGroup = 0010, // __S_IXGRP
+ ReadOther = 0004, // __S_IROTH
+ WriteOther = 0002, // __S_IWOTH
+ ExeOther = 0001, // __S_IXOTH
+ PermMask = 0777
+};
+}
+
+static QFile::Permissions modeToPermissions(quint32 mode)
+{
+ QFile::Permissions ret;
+ if (mode & UnixFileAttributes::ReadUser)
+ ret |= QFile::ReadOwner | QFile::ReadUser;
+ if (mode & UnixFileAttributes::WriteUser)
+ ret |= QFile::WriteOwner | QFile::WriteUser;
+ if (mode & UnixFileAttributes::ExeUser)
+ ret |= QFile::ExeOwner | QFile::ExeUser;
+ if (mode & UnixFileAttributes::ReadGroup)
+ ret |= QFile::ReadGroup;
+ if (mode & UnixFileAttributes::WriteGroup)
+ ret |= QFile::WriteGroup;
+ if (mode & UnixFileAttributes::ExeGroup)
+ ret |= QFile::ExeGroup;
+ if (mode & UnixFileAttributes::ReadOther)
+ ret |= QFile::ReadOther;
+ if (mode & UnixFileAttributes::WriteOther)
+ ret |= QFile::WriteOther;
+ if (mode & UnixFileAttributes::ExeOther)
+ ret |= QFile::ExeOther;
+ return ret;
+}
+
+static quint32 permissionsToMode(QFile::Permissions perms)
+{
+ quint32 mode = 0;
+ if (perms & (QFile::ReadOwner | QFile::ReadUser))
+ mode |= UnixFileAttributes::ReadUser;
+ if (perms & (QFile::WriteOwner | QFile::WriteUser))
+ mode |= UnixFileAttributes::WriteUser;
+ if (perms & (QFile::ExeOwner | QFile::ExeUser))
+ mode |= UnixFileAttributes::WriteUser;
+ if (perms & QFile::ReadGroup)
+ mode |= UnixFileAttributes::ReadGroup;
+ if (perms & QFile::WriteGroup)
+ mode |= UnixFileAttributes::WriteGroup;
+ if (perms & QFile::ExeGroup)
+ mode |= UnixFileAttributes::ExeGroup;
+ if (perms & QFile::ReadOther)
+ mode |= UnixFileAttributes::ReadOther;
+ if (perms & QFile::WriteOther)
+ mode |= UnixFileAttributes::WriteOther;
+ if (perms & QFile::ExeOther)
+ mode |= UnixFileAttributes::ExeOther;
+ return mode;
+}
+
+static QDateTime readMSDosDate(const uchar *src)
+{
+ uint dosDate = readUInt(src);
+ quint64 uDate;
+ uDate = (quint64)(dosDate >> 16);
+ uint tm_mday = (uDate & 0x1f);
+ uint tm_mon = ((uDate & 0x1E0) >> 5);
+ uint tm_year = (((uDate & 0x0FE00) >> 9) + 1980);
+ uint tm_hour = ((dosDate & 0xF800) >> 11);
+ uint tm_min = ((dosDate & 0x7E0) >> 5);
+ uint tm_sec = ((dosDate & 0x1f) << 1);
+
+ return QDateTime(QDate(tm_year, tm_mon, tm_mday), QTime(tm_hour, tm_min, tm_sec));
+}
+
+// for details, see http://www.pkware.com/documents/casestudies/APPNOTE.TXT
+
+enum HostOS {
+ HostFAT = 0,
+ HostAMIGA = 1,
+ HostVMS = 2, // VAX/VMS
+ HostUnix = 3,
+ HostVM_CMS = 4,
+ HostAtari = 5, // what if it's a minix filesystem? [cjh]
+ HostHPFS = 6, // filesystem used by OS/2 (and NT 3.x)
+ HostMac = 7,
+ HostZ_System = 8,
+ HostCPM = 9,
+ HostTOPS20 = 10, // pkzip 2.50 NTFS
+ HostNTFS = 11, // filesystem used by Windows NT
+ HostQDOS = 12, // SMS/QDOS
+ HostAcorn = 13, // Archimedes Acorn RISC OS
+ HostVFAT = 14, // filesystem used by Windows 95, NT
+ HostMVS = 15,
+ HostBeOS = 16, // hybrid POSIX/database filesystem
+ HostTandem = 17,
+ HostOS400 = 18,
+ HostOSX = 19
+};
+Q_DECLARE_TYPEINFO(HostOS, Q_PRIMITIVE_TYPE);
+
+enum GeneralPurposeFlag {
+ Encrypted = 0x01,
+ AlgTune1 = 0x02,
+ AlgTune2 = 0x04,
+ HasDataDescriptor = 0x08,
+ PatchedData = 0x20,
+ StrongEncrypted = 0x40,
+ Utf8Names = 0x0800,
+ CentralDirectoryEncrypted = 0x2000
+};
+Q_DECLARE_TYPEINFO(GeneralPurposeFlag, Q_PRIMITIVE_TYPE);
+
+enum CompressionMethod {
+ CompressionMethodStored = 0,
+ CompressionMethodShrunk = 1,
+ CompressionMethodReduced1 = 2,
+ CompressionMethodReduced2 = 3,
+ CompressionMethodReduced3 = 4,
+ CompressionMethodReduced4 = 5,
+ CompressionMethodImploded = 6,
+ CompressionMethodReservedTokenizing = 7, // reserved for tokenizing
+ CompressionMethodDeflated = 8,
+ CompressionMethodDeflated64 = 9,
+ CompressionMethodPKImploding = 10,
+
+ CompressionMethodBZip2 = 12,
+
+ CompressionMethodLZMA = 14,
+
+ CompressionMethodTerse = 18,
+ CompressionMethodLz77 = 19,
+
+ CompressionMethodJpeg = 96,
+ CompressionMethodWavPack = 97,
+ CompressionMethodPPMd = 98,
+ CompressionMethodWzAES = 99
+};
+Q_DECLARE_TYPEINFO(CompressionMethod, Q_PRIMITIVE_TYPE);
+
+struct LocalFileHeader
+{
+ uchar signature[4]; // 0x04034b50
+ uchar version_needed[2];
+ uchar general_purpose_bits[2];
+ uchar compression_method[2];
+ uchar last_mod_file[4];
+ uchar crc_32[4];
+ uchar compressed_size[4];
+ uchar uncompressed_size[4];
+ uchar file_name_length[2];
+ uchar extra_field_length[2];
+};
+Q_DECLARE_TYPEINFO(LocalFileHeader, Q_PRIMITIVE_TYPE);
+
+struct DataDescriptor
+{
+ uchar crc_32[4];
+ uchar compressed_size[4];
+ uchar uncompressed_size[4];
+};
+Q_DECLARE_TYPEINFO(DataDescriptor, Q_PRIMITIVE_TYPE);
+
+struct CentralFileHeader
+{
+ uchar signature[4]; // 0x02014b50
+ uchar version_made[2];
+ uchar version_needed[2];
+ uchar general_purpose_bits[2];
+ uchar compression_method[2];
+ uchar last_mod_file[4];
+ uchar crc_32[4];
+ uchar compressed_size[4];
+ uchar uncompressed_size[4];
+ uchar file_name_length[2];
+ uchar extra_field_length[2];
+ uchar file_comment_length[2];
+ uchar disk_start[2];
+ uchar internal_file_attributes[2];
+ uchar external_file_attributes[4];
+ uchar offset_local_header[4];
+};
+Q_DECLARE_TYPEINFO(CentralFileHeader, Q_PRIMITIVE_TYPE);
+
+struct EndOfDirectory
+{
+ uchar signature[4]; // 0x06054b50
+ uchar this_disk[2];
+ uchar start_of_directory_disk[2];
+ uchar num_dir_entries_this_disk[2];
+ uchar num_dir_entries[2];
+ uchar directory_size[4];
+ uchar dir_start_offset[4];
+ uchar comment_length[2];
+};
+Q_DECLARE_TYPEINFO(EndOfDirectory, Q_PRIMITIVE_TYPE);
+
+struct FileHeader
+{
+ CentralFileHeader h;
+ QByteArray file_name;
+ QByteArray extra_field;
+ QByteArray file_comment;
+};
+Q_DECLARE_TYPEINFO(FileHeader, Q_RELOCATABLE_TYPE);
+
+class QZipPrivate
+{
+public:
+ QZipPrivate(QIODevice *device, bool ownDev)
+ : device(device), ownDevice(ownDev), dirtyFileTree(true), start_of_directory(0)
+ {
+ }
+
+ ~QZipPrivate()
+ {
+ if (ownDevice)
+ delete device;
+ }
+
+ QZipReader::FileInfo fillFileInfo(int index) const;
+
+ QIODevice *device;
+ bool ownDevice;
+ bool dirtyFileTree;
+ QList<FileHeader> fileHeaders;
+ QByteArray comment;
+ uint start_of_directory;
+};
+
+QZipReader::FileInfo QZipPrivate::fillFileInfo(int index) const
+{
+ QZipReader::FileInfo fileInfo;
+ FileHeader header = fileHeaders.at(index);
+ quint32 mode = readUInt(header.h.external_file_attributes);
+ const HostOS hostOS = HostOS(readUShort(header.h.version_made) >> 8);
+ switch (hostOS) {
+ case HostUnix:
+ mode = (mode >> 16) & 0xffff;
+ switch (mode & UnixFileAttributes::TypeMask) {
+ case UnixFileAttributes::SymLink:
+ fileInfo.isSymLink = true;
+ break;
+ case UnixFileAttributes::Dir:
+ fileInfo.isDir = true;
+ break;
+ case UnixFileAttributes::File:
+ default: // ### just for the case; should we warn?
+ fileInfo.isFile = true;
+ break;
+ }
+ fileInfo.permissions = modeToPermissions(mode);
+ break;
+ case HostFAT:
+ case HostNTFS:
+ case HostHPFS:
+ case HostVFAT:
+ switch (mode & WindowsFileAttributes::TypeMask) {
+ case WindowsFileAttributes::Dir:
+ fileInfo.isDir = true;
+ break;
+ case WindowsFileAttributes::File:
+ default:
+ fileInfo.isFile = true;
+ break;
+ }
+ fileInfo.permissions |= QFile::ReadOwner | QFile::ReadUser | QFile::ReadGroup | QFile::ReadOther;
+ if ((mode & WindowsFileAttributes::ReadOnly) == 0)
+ fileInfo.permissions |= QFile::WriteOwner | QFile::WriteUser | QFile::WriteGroup | QFile::WriteOther;
+ if (fileInfo.isDir)
+ fileInfo.permissions |= QFile::ExeOwner | QFile::ExeUser | QFile::ExeGroup | QFile::ExeOther;
+ break;
+ default:
+ qWarning("QZip: Zip entry format at %d is not supported.", index);
+ return fileInfo; // we don't support anything else
+ }
+
+ ushort general_purpose_bits = readUShort(header.h.general_purpose_bits);
+ // if bit 11 is set, the filename and comment fields must be encoded using UTF-8
+ const bool inUtf8 = (general_purpose_bits & Utf8Names) != 0;
+ fileInfo.filePath = inUtf8 ? QString::fromUtf8(header.file_name) : QString::fromLocal8Bit(header.file_name);
+ fileInfo.crc = readUInt(header.h.crc_32);
+ fileInfo.size = readUInt(header.h.uncompressed_size);
+ fileInfo.lastModified = readMSDosDate(header.h.last_mod_file);
+
+ // fix the file path, if broken (convert separators, eat leading and trailing ones)
+ fileInfo.filePath = QDir::fromNativeSeparators(fileInfo.filePath);
+ QStringView filePathRef(fileInfo.filePath);
+ while (filePathRef.startsWith(u'.') || filePathRef.startsWith(u'/'))
+ filePathRef = filePathRef.mid(1);
+ while (filePathRef.endsWith(u'/'))
+ filePathRef.chop(1);
+
+ fileInfo.filePath = filePathRef.toString();
+ return fileInfo;
+}
+
+class QZipReaderPrivate : public QZipPrivate
+{
+public:
+ QZipReaderPrivate(QIODevice *device, bool ownDev)
+ : QZipPrivate(device, ownDev), status(QZipReader::NoError)
+ {
+ }
+
+ void scanFiles();
+
+ QZipReader::Status status;
+};
+
+class QZipWriterPrivate : public QZipPrivate
+{
+public:
+ QZipWriterPrivate(QIODevice *device, bool ownDev)
+ : QZipPrivate(device, ownDev),
+ status(QZipWriter::NoError),
+ permissions(QFile::ReadOwner | QFile::WriteOwner),
+ compressionPolicy(QZipWriter::AlwaysCompress)
+ {
+ }
+
+ QZipWriter::Status status;
+ QFile::Permissions permissions;
+ QZipWriter::CompressionPolicy compressionPolicy;
+
+ enum EntryType { Directory, File, Symlink };
+
+ void addEntry(EntryType type, const QString &fileName, const QByteArray &contents);
+};
+
+static LocalFileHeader toLocalHeader(const CentralFileHeader &ch)
+{
+ LocalFileHeader h;
+ writeUInt(h.signature, 0x04034b50);
+ copyUShort(h.version_needed, ch.version_needed);
+ copyUShort(h.general_purpose_bits, ch.general_purpose_bits);
+ copyUShort(h.compression_method, ch.compression_method);
+ copyUInt(h.last_mod_file, ch.last_mod_file);
+ copyUInt(h.crc_32, ch.crc_32);
+ copyUInt(h.compressed_size, ch.compressed_size);
+ copyUInt(h.uncompressed_size, ch.uncompressed_size);
+ copyUShort(h.file_name_length, ch.file_name_length);
+ copyUShort(h.extra_field_length, ch.extra_field_length);
+ return h;
+}
+
+void QZipReaderPrivate::scanFiles()
+{
+ if (!dirtyFileTree)
+ return;
+
+ if (! (device->isOpen() || device->open(QIODevice::ReadOnly))) {
+ status = QZipReader::FileOpenError;
+ return;
+ }
+
+ if ((device->openMode() & QIODevice::ReadOnly) == 0) { // only read the index from readable files.
+ status = QZipReader::FileReadError;
+ return;
+ }
+
+ dirtyFileTree = false;
+ uchar tmp[4];
+ device->read((char *)tmp, 4);
+ if (readUInt(tmp) != 0x04034b50) {
+ qWarning("QZip: not a zip file!");
+ return;
+ }
+
+ // find EndOfDirectory header
+ int i = 0;
+ int start_of_directory = -1;
+ int num_dir_entries = 0;
+ EndOfDirectory eod;
+ while (start_of_directory == -1) {
+ const int pos = device->size() - int(sizeof(EndOfDirectory)) - i;
+ if (pos < 0 || i > 65535) {
+ qWarning("QZip: EndOfDirectory not found");
+ return;
+ }
+
+ device->seek(pos);
+ device->read((char *)&eod, sizeof(EndOfDirectory));
+ if (readUInt(eod.signature) == 0x06054b50)
+ break;
+ ++i;
+ }
+
+ // have the eod
+ start_of_directory = readUInt(eod.dir_start_offset);
+ num_dir_entries = readUShort(eod.num_dir_entries);
+ ZDEBUG("start_of_directory at %d, num_dir_entries=%d", start_of_directory, num_dir_entries);
+ int comment_length = readUShort(eod.comment_length);
+ if (comment_length != i)
+ qWarning("QZip: failed to parse zip file.");
+ comment = device->read(qMin(comment_length, i));
+
+
+ device->seek(start_of_directory);
+ for (i = 0; i < num_dir_entries; ++i) {
+ FileHeader header;
+ int read = device->read((char *) &header.h, sizeof(CentralFileHeader));
+ if (read < (int)sizeof(CentralFileHeader)) {
+ qWarning("QZip: Failed to read complete header, index may be incomplete");
+ break;
+ }
+ if (readUInt(header.h.signature) != 0x02014b50) {
+ qWarning("QZip: invalid header signature, index may be incomplete");
+ break;
+ }
+
+ int l = readUShort(header.h.file_name_length);
+ header.file_name = device->read(l);
+ if (header.file_name.size() != l) {
+ qWarning("QZip: Failed to read filename from zip index, index may be incomplete");
+ break;
+ }
+ l = readUShort(header.h.extra_field_length);
+ header.extra_field = device->read(l);
+ if (header.extra_field.size() != l) {
+ qWarning("QZip: Failed to read extra field in zip file, skipping file, index may be incomplete");
+ break;
+ }
+ l = readUShort(header.h.file_comment_length);
+ header.file_comment = device->read(l);
+ if (header.file_comment.size() != l) {
+ qWarning("QZip: Failed to read read file comment, index may be incomplete");
+ break;
+ }
+
+ ZDEBUG("found file '%s'", header.file_name.data());
+ fileHeaders.append(header);
+ }
+}
+
+void QZipWriterPrivate::addEntry(EntryType type, const QString &fileName, const QByteArray &contents/*, QFile::Permissions permissions, QZip::Method m*/)
+{
+#ifndef NDEBUG
+ static const char *const entryTypes[] = {
+ "directory",
+ "file ",
+ "symlink " };
+ ZDEBUG() << "adding" << entryTypes[type] <<":" << fileName.toUtf8().data() << (type == 2 ? QByteArray(" -> " + contents).constData() : "");
+#endif
+
+ if (! (device->isOpen() || device->open(QIODevice::WriteOnly))) {
+ status = QZipWriter::FileOpenError;
+ return;
+ }
+ device->seek(start_of_directory);
+
+ // don't compress small files
+ QZipWriter::CompressionPolicy compression = compressionPolicy;
+ if (compressionPolicy == QZipWriter::AutoCompress) {
+ if (contents.size() < 64)
+ compression = QZipWriter::NeverCompress;
+ else
+ compression = QZipWriter::AlwaysCompress;
+ }
+
+ FileHeader header;
+ memset(&header.h, 0, sizeof(CentralFileHeader));
+ writeUInt(header.h.signature, 0x02014b50);
+
+ writeUShort(header.h.version_needed, ZIP_VERSION);
+ writeUInt(header.h.uncompressed_size, contents.size());
+ writeMSDosDate(header.h.last_mod_file, QDateTime::currentDateTime());
+ QByteArray data = contents;
+ if (compression == QZipWriter::AlwaysCompress) {
+ writeUShort(header.h.compression_method, CompressionMethodDeflated);
+
+ ulong len = contents.size();
+ // shamelessly copied form zlib
+ len += (len >> 12) + (len >> 14) + 11;
+ int res;
+ do {
+ data.resize(len);
+ res = deflate((uchar*)data.data(), &len, (const uchar*)contents.constData(), contents.size());
+
+ switch (res) {
+ case Z_OK:
+ data.resize(len);
+ break;
+ case Z_MEM_ERROR:
+ qWarning("QZip: Z_MEM_ERROR: Not enough memory to compress file, skipping");
+ data.resize(0);
+ break;
+ case Z_BUF_ERROR:
+ len *= 2;
+ break;
+ }
+ } while (res == Z_BUF_ERROR);
+ }
+// TODO add a check if data.length() > contents.length(). Then try to store the original and revert the compression method to be uncompressed
+ writeUInt(header.h.compressed_size, data.size());
+ uint crc_32 = ::crc32(0, nullptr, 0);
+ crc_32 = ::crc32(crc_32, (const uchar *)contents.constData(), contents.size());
+ writeUInt(header.h.crc_32, crc_32);
+
+ // if bit 11 is set, the filename and comment fields must be encoded using UTF-8
+ ushort general_purpose_bits = Utf8Names; // always use utf-8
+ writeUShort(header.h.general_purpose_bits, general_purpose_bits);
+
+ const bool inUtf8 = (general_purpose_bits & Utf8Names) != 0;
+ header.file_name = inUtf8 ? fileName.toUtf8() : fileName.toLocal8Bit();
+ if (header.file_name.size() > 0xffff) {
+ qWarning("QZip: Filename is too long, chopping it to 65535 bytes");
+ header.file_name = header.file_name.left(0xffff); // ### don't break the utf-8 sequence, if any
+ }
+ if (header.file_comment.size() + header.file_name.size() > 0xffff) {
+ qWarning("QZip: File comment is too long, chopping it to 65535 bytes");
+ header.file_comment.truncate(0xffff - header.file_name.size()); // ### don't break the utf-8 sequence, if any
+ }
+ writeUShort(header.h.file_name_length, header.file_name.size());
+ //h.extra_field_length[2];
+
+ writeUShort(header.h.version_made, HostUnix << 8);
+ //uchar internal_file_attributes[2];
+ //uchar external_file_attributes[4];
+ quint32 mode = permissionsToMode(permissions);
+ switch (type) {
+ case Symlink:
+ mode |= UnixFileAttributes::SymLink;
+ break;
+ case Directory:
+ mode |= UnixFileAttributes::Dir;
+ break;
+ case File:
+ mode |= UnixFileAttributes::File;
+ break;
+ default:
+ Q_UNREACHABLE();
+ break;
+ }
+ writeUInt(header.h.external_file_attributes, mode << 16);
+ writeUInt(header.h.offset_local_header, start_of_directory);
+
+
+ fileHeaders.append(header);
+
+ LocalFileHeader h = toLocalHeader(header.h);
+ device->write((const char *)&h, sizeof(LocalFileHeader));
+ device->write(header.file_name);
+ device->write(data);
+ start_of_directory = device->pos();
+ dirtyFileTree = true;
+}
+
+////////////////////////////// Reader
+
+/*!
+ \class QZipReader::FileInfo
+ \internal
+ Represents one entry in the zip table of contents.
+*/
+
+/*!
+ \variable QZipReader::FileInfo::filePath
+ The full filepath inside the archive.
+*/
+
+/*!
+ \variable QZipReader::FileInfo::isDir
+ A boolean type indicating if the entry is a directory.
+*/
+
+/*!
+ \variable QZipReader::FileInfo::isFile
+ A boolean type, if it is one this entry is a file.
+*/
+
+/*!
+ \variable QZipReader::FileInfo::isSymLink
+ A boolean type, if it is one this entry is symbolic link.
+*/
+
+/*!
+ \variable QZipReader::FileInfo::permissions
+ A list of flags for the permissions of this entry.
+*/
+
+/*!
+ \variable QZipReader::FileInfo::crc
+ The calculated checksum as a crc type.
+*/
+
+/*!
+ \variable QZipReader::FileInfo::size
+ The total size of the unpacked content.
+*/
+
+/*!
+ \class QZipReader
+ \internal
+ \since 4.5
+
+ \brief the QZipReader class provides a way to inspect the contents of a zip
+ archive and extract individual files from it.
+
+ QZipReader can be used to read a zip archive either from a file or from any
+ device. An in-memory QBuffer for instance. The reader can be used to read
+ which files are in the archive using fileInfoList() and entryInfoAt() but
+ also to extract individual files using fileData() or even to extract all
+ files in the archive using extractAll()
+*/
+
+/*!
+ Create a new zip archive that operates on the \a fileName. The file will be
+ opened with the \a mode.
+*/
+QZipReader::QZipReader(const QString &archive, QIODevice::OpenMode mode)
+{
+ auto f = std::make_unique<QFile>(archive);
+ const bool result = f->open(mode);
+ QZipReader::Status status;
+ const QFileDevice::FileError error = f->error();
+ if (result && error == QFile::NoError) {
+ status = NoError;
+ } else {
+ if (error == QFile::ReadError)
+ status = FileReadError;
+ else if (error == QFile::OpenError)
+ status = FileOpenError;
+ else if (error == QFile::PermissionsError)
+ status = FilePermissionsError;
+ else
+ status = FileError;
+ }
+
+ d = new QZipReaderPrivate(f.get(), /*ownDevice=*/true);
+ Q_UNUSED(f.release());
+ d->status = status;
+}
+
+/*!
+ Create a new zip archive that operates on the archive found in \a device.
+ You have to open the device previous to calling the constructor and only a
+ device that is readable will be scanned for zip filecontent.
+ */
+QZipReader::QZipReader(QIODevice *device)
+ : d(new QZipReaderPrivate(device, /*ownDevice=*/false))
+{
+ Q_ASSERT(device);
+}
+
+/*!
+ Destructor
+*/
+QZipReader::~QZipReader()
+{
+ close();
+ delete d;
+}
+
+/*!
+ Returns device used for reading zip archive.
+*/
+QIODevice* QZipReader::device() const
+{
+ return d->device;
+}
+
+/*!
+ Returns \c true if the user can read the file; otherwise returns \c false.
+*/
+bool QZipReader::isReadable() const
+{
+ return d->device->isReadable();
+}
+
+/*!
+ Returns \c true if the file exists; otherwise returns \c false.
+*/
+bool QZipReader::exists() const
+{
+ QFile *f = qobject_cast<QFile*> (d->device);
+ if (f == nullptr)
+ return true;
+ return f->exists();
+}
+
+/*!
+ Returns the list of files the archive contains.
+*/
+QList<QZipReader::FileInfo> QZipReader::fileInfoList() const
+{
+ d->scanFiles();
+ QList<FileInfo> files;
+ const int numFileHeaders = d->fileHeaders.size();
+ files.reserve(numFileHeaders);
+ for (int i = 0; i < numFileHeaders; ++i)
+ files.append(d->fillFileInfo(i));
+ return files;
+
+}
+
+/*!
+ Return the number of items in the zip archive.
+*/
+int QZipReader::count() const
+{
+ d->scanFiles();
+ return d->fileHeaders.size();
+}
+
+/*!
+ Returns a FileInfo of an entry in the zipfile.
+ The \a index is the index into the directory listing of the zipfile.
+ Returns an invalid FileInfo if \a index is out of boundaries.
+
+ \sa fileInfoList()
+*/
+QZipReader::FileInfo QZipReader::entryInfoAt(int index) const
+{
+ d->scanFiles();
+ if (index >= 0 && index < d->fileHeaders.size())
+ return d->fillFileInfo(index);
+ return QZipReader::FileInfo();
+}
+
+/*!
+ Fetch the file contents from the zip archive and return the uncompressed bytes.
+*/
+QByteArray QZipReader::fileData(const QString &fileName) const
+{
+ d->scanFiles();
+ int i;
+ for (i = 0; i < d->fileHeaders.size(); ++i) {
+ if (QString::fromLocal8Bit(d->fileHeaders.at(i).file_name) == fileName)
+ break;
+ }
+ if (i == d->fileHeaders.size())
+ return QByteArray();
+
+ FileHeader header = d->fileHeaders.at(i);
+
+ ushort version_needed = readUShort(header.h.version_needed);
+ if (version_needed > ZIP_VERSION) {
+ qWarning("QZip: .ZIP specification version %d implementationis needed to extract the data.", version_needed);
+ return QByteArray();
+ }
+
+ ushort general_purpose_bits = readUShort(header.h.general_purpose_bits);
+ int compressed_size = readUInt(header.h.compressed_size);
+ int uncompressed_size = readUInt(header.h.uncompressed_size);
+ int start = readUInt(header.h.offset_local_header);
+ //qDebug("uncompressing file %d: local header at %d", i, start);
+
+ d->device->seek(start);
+ LocalFileHeader lh;
+ d->device->read((char *)&lh, sizeof(LocalFileHeader));
+ uint skip = readUShort(lh.file_name_length) + readUShort(lh.extra_field_length);
+ d->device->seek(d->device->pos() + skip);
+
+ int compression_method = readUShort(lh.compression_method);
+ //qDebug("file=%s: compressed_size=%d, uncompressed_size=%d", fileName.toLocal8Bit().data(), compressed_size, uncompressed_size);
+
+ if ((general_purpose_bits & Encrypted) != 0) {
+ qWarning("QZip: Unsupported encryption method is needed to extract the data.");
+ return QByteArray();
+ }
+
+ //qDebug("file at %lld", d->device->pos());
+ QByteArray compressed = d->device->read(compressed_size);
+ if (compression_method == CompressionMethodStored) {
+ // no compression
+ compressed.truncate(uncompressed_size);
+ return compressed;
+ } else if (compression_method == CompressionMethodDeflated) {
+ // Deflate
+ //qDebug("compressed=%d", compressed.size());
+ compressed.truncate(compressed_size);
+ QByteArray baunzip;
+ ulong len = qMax(uncompressed_size, 1);
+ int res;
+ do {
+ baunzip.resize(len);
+ res = inflate((uchar*)baunzip.data(), &len,
+ (const uchar*)compressed.constData(), compressed_size);
+
+ switch (res) {
+ case Z_OK:
+ if ((int)len != baunzip.size())
+ baunzip.resize(len);
+ break;
+ case Z_MEM_ERROR:
+ qWarning("QZip: Z_MEM_ERROR: Not enough memory");
+ break;
+ case Z_BUF_ERROR:
+ len *= 2;
+ break;
+ case Z_DATA_ERROR:
+ qWarning("QZip: Z_DATA_ERROR: Input data is corrupted");
+ break;
+ }
+ } while (res == Z_BUF_ERROR);
+ return baunzip;
+ }
+
+ qWarning("QZip: Unsupported compression method %d is needed to extract the data.", compression_method);
+ return QByteArray();
+}
+
+/*!
+ Extracts the full contents of the zip file into \a destinationDir on
+ the local filesystem.
+ In case writing or linking a file fails, the extraction will be aborted.
+*/
+bool QZipReader::extractAll(const QString &destinationDir) const
+{
+ QDir baseDir(destinationDir);
+
+ // create directories first
+ const QList<FileInfo> allFiles = fileInfoList();
+ bool foundDirs = false;
+ bool hasDirs = false;
+ for (const FileInfo &fi : allFiles) {
+ const QString absPath = destinationDir + QDir::separator() + fi.filePath;
+ if (fi.isDir) {
+ foundDirs = true;
+ if (!baseDir.mkpath(fi.filePath))
+ return false;
+ if (!QFile::setPermissions(absPath, fi.permissions))
+ return false;
+ } else if (!hasDirs && fi.filePath.contains(u"/")) {
+ // filePath does not have leading or trailing '/', so if we find
+ // one, than the file path contains directories.
+ hasDirs = true;
+ }
+ }
+
+ // Some zip archives can be broken in the sense that they do not report
+ // separate entries for directories, only for files. In this case we
+ // need to recreate directory structure based on the file paths.
+ if (hasDirs && !foundDirs) {
+ for (const FileInfo &fi : allFiles) {
+ const auto dirPath = fi.filePath.left(fi.filePath.lastIndexOf(u"/"));
+ if (!baseDir.mkpath(dirPath))
+ return false;
+ // We will leave the directory permissions default in this case,
+ // because setting dir permissions based on file is incorrect
+ }
+ }
+
+ // set up symlinks
+ for (const FileInfo &fi : allFiles) {
+ const QString absPath = destinationDir + QDir::separator() + fi.filePath;
+ if (fi.isSymLink) {
+ QString destination = QFile::decodeName(fileData(fi.filePath));
+ if (destination.isEmpty())
+ return false;
+ QFileInfo linkFi(absPath);
+ if (!QFile::exists(linkFi.absolutePath()))
+ QDir::root().mkpath(linkFi.absolutePath());
+ if (!QFile::link(destination, absPath))
+ return false;
+ /* cannot change permission of links
+ if (!QFile::setPermissions(absPath, fi.permissions))
+ return false;
+ */
+ }
+ }
+
+ for (const FileInfo &fi : allFiles) {
+ const QString absPath = destinationDir + QDir::separator() + fi.filePath;
+ if (fi.isFile) {
+ QFile f(absPath);
+ if (!f.open(QIODevice::WriteOnly))
+ return false;
+ f.write(fileData(fi.filePath));
+ f.setPermissions(fi.permissions);
+ f.close();
+ }
+ }
+
+ return true;
+}
+
+/*!
+ \enum QZipReader::Status
+
+ The following status values are possible:
+
+ \value NoError No error occurred.
+ \value FileReadError An error occurred when reading from the file.
+ \value FileOpenError The file could not be opened.
+ \value FilePermissionsError The file could not be accessed.
+ \value FileError Another file error occurred.
+*/
+
+/*!
+ Returns a status code indicating the first error that was met by QZipReader,
+ or QZipReader::NoError if no error occurred.
+*/
+QZipReader::Status QZipReader::status() const
+{
+ return d->status;
+}
+
+/*!
+ Close the zip file.
+*/
+void QZipReader::close()
+{
+ d->device->close();
+}
+
+////////////////////////////// Writer
+
+/*!
+ \class QZipWriter
+ \internal
+ \since 4.5
+
+ \brief the QZipWriter class provides a way to create a new zip archive.
+
+ QZipWriter can be used to create a zip archive containing any number of files
+ and directories. The files in the archive will be compressed in a way that is
+ compatible with common zip reader applications.
+*/
+
+
+/*!
+ Create a new zip archive that operates on the \a archive filename. The file will
+ be opened with the \a mode.
+ \sa isValid()
+*/
+QZipWriter::QZipWriter(const QString &fileName, QIODevice::OpenMode mode)
+{
+ auto f = std::make_unique<QFile>(fileName);
+ QZipWriter::Status status;
+ if (f->open(mode) && f->error() == QFile::NoError)
+ status = QZipWriter::NoError;
+ else {
+ if (f->error() == QFile::WriteError)
+ status = QZipWriter::FileWriteError;
+ else if (f->error() == QFile::OpenError)
+ status = QZipWriter::FileOpenError;
+ else if (f->error() == QFile::PermissionsError)
+ status = QZipWriter::FilePermissionsError;
+ else
+ status = QZipWriter::FileError;
+ }
+
+ d = new QZipWriterPrivate(f.get(), /*ownDevice=*/true);
+ Q_UNUSED(f.release());
+ d->status = status;
+}
+
+/*!
+ Create a new zip archive that operates on the archive found in \a device.
+ You have to open the device previous to calling the constructor and
+ only a device that is readable will be scanned for zip filecontent.
+ */
+QZipWriter::QZipWriter(QIODevice *device)
+ : d(new QZipWriterPrivate(device, /*ownDevice=*/false))
+{
+ Q_ASSERT(device);
+}
+
+QZipWriter::~QZipWriter()
+{
+ close();
+ delete d;
+}
+
+/*!
+ Returns device used for writing zip archive.
+*/
+QIODevice* QZipWriter::device() const
+{
+ return d->device;
+}
+
+/*!
+ Returns \c true if the user can write to the archive; otherwise returns \c false.
+*/
+bool QZipWriter::isWritable() const
+{
+ return d->device->isWritable();
+}
+
+/*!
+ Returns \c true if the file exists; otherwise returns \c false.
+*/
+bool QZipWriter::exists() const
+{
+ QFile *f = qobject_cast<QFile*> (d->device);
+ if (f == nullptr)
+ return true;
+ return f->exists();
+}
+
+/*!
+ \enum QZipWriter::Status
+
+ The following status values are possible:
+
+ \value NoError No error occurred.
+ \value FileWriteError An error occurred when writing to the device.
+ \value FileOpenError The file could not be opened.
+ \value FilePermissionsError The file could not be accessed.
+ \value FileError Another file error occurred.
+*/
+
+/*!
+ Returns a status code indicating the first error that was met by QZipWriter,
+ or QZipWriter::NoError if no error occurred.
+*/
+QZipWriter::Status QZipWriter::status() const
+{
+ return d->status;
+}
+
+/*!
+ \enum QZipWriter::CompressionPolicy
+
+ \value AlwaysCompress A file that is added is compressed.
+ \value NeverCompress A file that is added will be stored without changes.
+ \value AutoCompress A file that is added will be compressed only if that will give a smaller file.
+*/
+
+/*!
+ Sets the policy for compressing newly added files to the new \a policy.
+
+ \note the default policy is AlwaysCompress
+
+ \sa compressionPolicy()
+ \sa addFile()
+*/
+void QZipWriter::setCompressionPolicy(CompressionPolicy policy)
+{
+ d->compressionPolicy = policy;
+}
+
+/*!
+ Returns the currently set compression policy.
+ \sa setCompressionPolicy()
+ \sa addFile()
+*/
+QZipWriter::CompressionPolicy QZipWriter::compressionPolicy() const
+{
+ return d->compressionPolicy;
+}
+
+/*!
+ Sets the permissions that will be used for newly added files.
+
+ \note the default permissions are QFile::ReadOwner | QFile::WriteOwner.
+
+ \sa creationPermissions()
+ \sa addFile()
+*/
+void QZipWriter::setCreationPermissions(QFile::Permissions permissions)
+{
+ d->permissions = permissions;
+}
+
+/*!
+ Returns the currently set creation permissions.
+
+ \sa setCreationPermissions()
+ \sa addFile()
+*/
+QFile::Permissions QZipWriter::creationPermissions() const
+{
+ return d->permissions;
+}
+
+/*!
+ Add a file to the archive with \a data as the file contents.
+ The file will be stored in the archive using the \a fileName which
+ includes the full path in the archive.
+
+ The new file will get the file permissions based on the current
+ creationPermissions and it will be compressed using the zip compression
+ based on the current compression policy.
+
+ \sa setCreationPermissions()
+ \sa setCompressionPolicy()
+*/
+void QZipWriter::addFile(const QString &fileName, const QByteArray &data)
+{
+ d->addEntry(QZipWriterPrivate::File, QDir::fromNativeSeparators(fileName), data);
+}
+
+/*!
+ Add a file to the archive with \a device as the source of the contents.
+ The contents returned from QIODevice::readAll() will be used as the
+ filedata.
+ The file will be stored in the archive using the \a fileName which
+ includes the full path in the archive.
+*/
+void QZipWriter::addFile(const QString &fileName, QIODevice *device)
+{
+ Q_ASSERT(device);
+ QIODevice::OpenMode mode = device->openMode();
+ bool opened = false;
+ if ((mode & QIODevice::ReadOnly) == 0) {
+ opened = true;
+ if (! device->open(QIODevice::ReadOnly)) {
+ d->status = FileOpenError;
+ return;
+ }
+ }
+ d->addEntry(QZipWriterPrivate::File, QDir::fromNativeSeparators(fileName), device->readAll());
+ if (opened)
+ device->close();
+}
+
+/*!
+ Create a new directory in the archive with the specified \a dirName and
+ the \a permissions;
+*/
+void QZipWriter::addDirectory(const QString &dirName)
+{
+ QString name(QDir::fromNativeSeparators(dirName));
+ // separator is mandatory
+ if (!name.endsWith(u'/'))
+ name.append(u'/');
+ d->addEntry(QZipWriterPrivate::Directory, name, QByteArray());
+}
+
+/*!
+ Create a new symbolic link in the archive with the specified \a dirName
+ and the \a permissions;
+ A symbolic link contains the destination (relative) path and name.
+*/
+void QZipWriter::addSymLink(const QString &fileName, const QString &destination)
+{
+ d->addEntry(QZipWriterPrivate::Symlink, QDir::fromNativeSeparators(fileName), QFile::encodeName(destination));
+}
+
+/*!
+ Closes the zip file.
+*/
+void QZipWriter::close()
+{
+ if (!(d->device->openMode() & QIODevice::WriteOnly)) {
+ d->device->close();
+ return;
+ }
+
+ //qDebug("QZip::close writing directory, %d entries", d->fileHeaders.size());
+ d->device->seek(d->start_of_directory);
+ // write new directory
+ for (int i = 0; i < d->fileHeaders.size(); ++i) {
+ const FileHeader &header = d->fileHeaders.at(i);
+ d->device->write((const char *)&header.h, sizeof(CentralFileHeader));
+ d->device->write(header.file_name);
+ d->device->write(header.extra_field);
+ d->device->write(header.file_comment);
+ }
+ int dir_size = d->device->pos() - d->start_of_directory;
+ // write end of directory
+ EndOfDirectory eod;
+ memset(&eod, 0, sizeof(EndOfDirectory));
+ writeUInt(eod.signature, 0x06054b50);
+ //uchar this_disk[2];
+ //uchar start_of_directory_disk[2];
+ writeUShort(eod.num_dir_entries_this_disk, d->fileHeaders.size());
+ writeUShort(eod.num_dir_entries, d->fileHeaders.size());
+ writeUInt(eod.directory_size, dir_size);
+ writeUInt(eod.dir_start_offset, d->start_of_directory);
+ writeUShort(eod.comment_length, d->comment.size());
+
+ d->device->write((const char *)&eod, sizeof(EndOfDirectory));
+ d->device->write(d->comment);
+ d->device->close();
+}
+
+QT_END_NAMESPACE
diff --git a/src/corelib/io/qzipreader_p.h b/src/corelib/io/qzipreader_p.h
new file mode 100644
index 0000000000..e6ddd0dc99
--- /dev/null
+++ b/src/corelib/io/qzipreader_p.h
@@ -0,0 +1,87 @@
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QZIPREADER_H
+#define QZIPREADER_H
+
+#include <QtCore/private/qglobal_p.h>
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists for the convenience
+// of the QZipReader class. This header file may change from
+// version to version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QtCore/qdatetime.h>
+#include <QtCore/qfile.h>
+#include <QtCore/qstring.h>
+
+QT_BEGIN_NAMESPACE
+
+class QZipReaderPrivate;
+
+class Q_CORE_EXPORT QZipReader
+{
+public:
+ explicit QZipReader(const QString &fileName, QIODevice::OpenMode mode = QIODevice::ReadOnly );
+
+ explicit QZipReader(QIODevice *device);
+ ~QZipReader();
+
+ QIODevice* device() const;
+
+ bool isReadable() const;
+ bool exists() const;
+
+ struct FileInfo
+ {
+ FileInfo() noexcept
+ : isDir(false), isFile(false), isSymLink(false), crc(0), size(0)
+ {}
+
+ bool isValid() const noexcept { return isDir || isFile || isSymLink; }
+
+ QString filePath;
+ uint isDir : 1;
+ uint isFile : 1;
+ uint isSymLink : 1;
+ QFile::Permissions permissions;
+ uint crc;
+ qint64 size;
+ QDateTime lastModified;
+ };
+
+ QList<FileInfo> fileInfoList() const;
+ int count() const;
+
+ FileInfo entryInfoAt(int index) const;
+ QByteArray fileData(const QString &fileName) const;
+ bool extractAll(const QString &destinationDir) const;
+
+ enum Status {
+ NoError,
+ FileReadError,
+ FileOpenError,
+ FilePermissionsError,
+ FileError
+ };
+
+ Status status() const;
+
+ void close();
+
+private:
+ QZipReaderPrivate *d;
+ Q_DISABLE_COPY_MOVE(QZipReader)
+};
+Q_DECLARE_TYPEINFO(QZipReader::FileInfo, Q_RELOCATABLE_TYPE);
+Q_DECLARE_TYPEINFO(QZipReader::Status, Q_PRIMITIVE_TYPE);
+
+QT_END_NAMESPACE
+
+#endif // QZIPREADER_H
diff --git a/src/corelib/io/qzipwriter_p.h b/src/corelib/io/qzipwriter_p.h
new file mode 100644
index 0000000000..770e6118b6
--- /dev/null
+++ b/src/corelib/io/qzipwriter_p.h
@@ -0,0 +1,77 @@
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+#ifndef QZIPWRITER_H
+#define QZIPWRITER_H
+
+#include <QtCore/private/qglobal_p.h>
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists for the convenience
+// of the QZipWriter class. This header file may change from
+// version to version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QtCore/qstring.h>
+#include <QtCore/qfile.h>
+
+QT_BEGIN_NAMESPACE
+
+class QZipWriterPrivate;
+
+class Q_CORE_EXPORT QZipWriter
+{
+public:
+ explicit QZipWriter(const QString &fileName, QIODevice::OpenMode mode = (QIODevice::WriteOnly | QIODevice::Truncate) );
+
+ explicit QZipWriter(QIODevice *device);
+ ~QZipWriter();
+
+ QIODevice* device() const;
+
+ bool isWritable() const;
+ bool exists() const;
+
+ enum Status {
+ NoError,
+ FileWriteError,
+ FileOpenError,
+ FilePermissionsError,
+ FileError
+ };
+
+ Status status() const;
+
+ enum CompressionPolicy {
+ AlwaysCompress,
+ NeverCompress,
+ AutoCompress
+ };
+
+ void setCompressionPolicy(CompressionPolicy policy);
+ CompressionPolicy compressionPolicy() const;
+
+ void setCreationPermissions(QFile::Permissions permissions);
+ QFile::Permissions creationPermissions() const;
+
+ void addFile(const QString &fileName, const QByteArray &data);
+
+ void addFile(const QString &fileName, QIODevice *device);
+
+ void addDirectory(const QString &dirName);
+
+ void addSymLink(const QString &fileName, const QString &destination);
+
+ void close();
+private:
+ QZipWriterPrivate *d;
+ Q_DISABLE_COPY_MOVE(QZipWriter)
+};
+
+QT_END_NAMESPACE
+
+#endif // QZIPWRITER_H
diff --git a/src/corelib/ipc/qsharedmemory.cpp b/src/corelib/ipc/qsharedmemory.cpp
new file mode 100644
index 0000000000..02761c0263
--- /dev/null
+++ b/src/corelib/ipc/qsharedmemory.cpp
@@ -0,0 +1,689 @@
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#include "qsharedmemory.h"
+#include "qsharedmemory_p.h"
+
+#include "qtipccommon_p.h"
+#include "qsystemsemaphore.h"
+
+#include <q20memory.h>
+#include <qdebug.h>
+#ifdef Q_OS_WIN
+# include <qt_windows.h>
+#endif
+
+#ifndef MAX_PATH
+# define MAX_PATH PATH_MAX
+#endif
+
+QT_BEGIN_NAMESPACE
+
+#if QT_CONFIG(sharedmemory)
+
+using namespace QtIpcCommon;
+using namespace Qt::StringLiterals;
+
+QSharedMemoryPrivate::~QSharedMemoryPrivate()
+{
+ destructBackend();
+}
+
+inline void QSharedMemoryPrivate::constructBackend()
+{
+ using namespace q20;
+ visit([](auto p) { construct_at(p); });
+}
+
+inline void QSharedMemoryPrivate::destructBackend()
+{
+ visit([](auto p) { std::destroy_at(p); });
+}
+
+#if QT_CONFIG(systemsemaphore)
+inline QNativeIpcKey QSharedMemoryPrivate::semaphoreNativeKey() const
+{
+ if (isIpcSupported(IpcType::SharedMemory, QNativeIpcKey::Type::Windows)
+ && nativeKey.type() == QNativeIpcKey::Type::Windows) {
+ // native keys are plain kernel object names, limited to MAX_PATH
+ auto suffix = "_sem"_L1;
+ QString semkey = nativeKey.nativeKey();
+ semkey.truncate(MAX_PATH - suffix.size() - 1);
+ semkey += suffix;
+ return { semkey, QNativeIpcKey::Type::Windows };
+ }
+
+ // System V and POSIX keys appear to operate in different namespaces, so we
+ // can just use the same native key
+ return nativeKey;
+}
+#endif
+
+/*!
+ \class QSharedMemory
+ \inmodule QtCore
+ \since 4.4
+
+ \brief The QSharedMemory class provides access to a shared memory segment.
+
+ QSharedMemory provides access to a \l{Shared Memory}{shared memory segment}
+ by multiple threads and processes. Shared memory segments are identified by a
+ key, represented by \l QNativeIpcKey. A key can be created in a
+ cross-platform manner by using platformSafeKey().
+
+ One QSharedMemory object must create() the segment and this call specifies
+ the size of the segment. All other processes simply attach() to the segment
+ that must already exist. After either operation is successful, the
+ application may call data() to obtain a pointer to the data.
+
+ To support non-atomic operations, QSharedMemory provides API to gain
+ exclusive access: you may lock the shared memory with lock() before reading
+ from or writing to the shared memory, but remember to release the lock with
+ unlock() after you are done.
+
+ By default, QSharedMemory automatically destroys the shared memory segment
+ when the last instance of QSharedMemory is \l{detach()}{detached} from the
+ segment, and no references to the segment remain.
+
+ For details on the key types, platform-specific limitations, and
+ interoperability with older or non-Qt applications, see the \l{Native IPC
+ Keys} documentation. That includes important information for sandboxed
+ applications on Apple platforms, including all apps obtained via the Apple
+ App Store.
+
+ \sa {Inter-Process Communication}, QSystemSemaphore
+ */
+
+/*!
+ \overload QSharedMemory()
+
+ Constructs a shared memory object with the given \a parent. The shared memory
+ object's key is not set by the constructor, so the shared memory object does
+ not have an underlying shared memory segment attached. The key must be set
+ with setNativeKey() before create() or attach() can be used.
+
+ \sa setNativeKey()
+ */
+
+QSharedMemory::QSharedMemory(QObject *parent)
+ : QSharedMemory(QNativeIpcKey(), parent)
+{
+}
+
+/*!
+ \overload
+
+ Constructs a shared memory object with the given \a parent and with
+ its key set to \a key. Because its key is set, its create() and
+ attach() functions can be called.
+
+ \sa setNativeKey(), create(), attach()
+ */
+QSharedMemory::QSharedMemory(const QNativeIpcKey &key, QObject *parent)
+ : QObject(*new QSharedMemoryPrivate(key.type()), parent)
+{
+ setNativeKey(key);
+}
+
+/*!
+ Constructs a shared memory object with the given \a parent and with
+ the legacy key set to \a key. Because its key is set, its create() and
+ attach() functions can be called.
+
+ \sa setKey(), create(), attach()
+ */
+QSharedMemory::QSharedMemory(const QString &key, QObject *parent)
+ : QSharedMemory(legacyNativeKey(key), parent)
+{
+}
+
+/*!
+ The destructor clears the key, which forces the shared memory object
+ to \l {detach()} {detach} from its underlying shared memory
+ segment. If this shared memory object is the last one connected to
+ the shared memory segment, the detach() operation destroys the
+ shared memory segment.
+
+ \sa detach(), isAttached()
+ */
+QSharedMemory::~QSharedMemory()
+{
+ Q_D(QSharedMemory);
+ if (isAttached())
+ detach();
+ d->cleanHandle();
+}
+
+/*!
+ \overload
+
+ Sets the legacy \a key for this shared memory object. If \a key is the same
+ as the current key, the function returns without doing anything. Otherwise,
+ if the shared memory object is attached to an underlying shared memory
+ segment, it will \l {detach()} {detach} from it before setting the new key.
+ This function does not do an attach().
+
+ You can call key() to retrieve the legacy key. This function is mostly the
+ same as:
+
+ \code
+ shm.setNativeKey(QSharedMemory::legacyNativeKey(key));
+ \endcode
+
+ except that it enables obtaining the legacy key using key().
+
+ \sa key(), nativeKey(), isAttached()
+*/
+void QSharedMemory::setKey(const QString &key)
+{
+ setNativeKey(legacyNativeKey(key));
+}
+
+/*!
+ \since 4.8
+ \fn void QSharedMemory::setNativeKey(const QString &key, QNativeIpcKey::Type type)
+
+ Sets the native, platform specific, \a key for this shared memory object of
+ type \a type (the type parameter has been available since Qt 6.6). If \a key
+ is the same as the current native key, the function returns without doing
+ anything. Otherwise, if the shared memory object is attached to an underlying
+ shared memory segment, it will \l {detach()} {detach} from it before setting
+ the new key. This function does not do an attach().
+
+ This function is useful if the native key was shared from another process,
+ though the application must take care to ensure the key type matches what the
+ other process expects. See \l{Native IPC Keys} for more information.
+
+ Portable native keys can be obtained using platformSafeKey().
+
+ You can call nativeKey() to retrieve the native key.
+
+ \sa nativeKey(), nativeIpcKey(), isAttached()
+*/
+
+/*!
+ \since 6.6
+
+ Sets the native, platform specific, \a key for this shared memory object. If
+ \a key is the same as the current native key, the function returns without
+ doing anything. Otherwise, if the shared memory object is attached to an
+ underlying shared memory segment, it will \l {detach()} {detach} from it
+ before setting the new key. This function does not do an attach().
+
+ This function is useful if the native key was shared from another process.
+ See \l{Native IPC Keys} for more information.
+
+ Portable native keys can be obtained using platformSafeKey().
+
+ You can call nativeKey() to retrieve the native key.
+
+ \sa nativeKey(), nativeIpcKey(), isAttached()
+*/
+void QSharedMemory::setNativeKey(const QNativeIpcKey &key)
+{
+ Q_D(QSharedMemory);
+ if (key == d->nativeKey && key.isEmpty())
+ return;
+ if (!isKeyTypeSupported(key.type())) {
+ d->setError(KeyError, tr("%1: unsupported key type")
+ .arg("QSharedMemory::setNativeKey"_L1));
+ return;
+ }
+
+ if (isAttached())
+ detach();
+ d->cleanHandle();
+ if (key.type() == d->nativeKey.type()) {
+ // we can reuse the backend
+ d->nativeKey = key;
+ } else {
+ // we must recreate the backend
+ d->destructBackend();
+ d->nativeKey = key;
+ d->constructBackend();
+ }
+}
+
+bool QSharedMemoryPrivate::initKey(SemaphoreAccessMode mode)
+{
+ if (!cleanHandle())
+ return false;
+#if QT_CONFIG(systemsemaphore)
+ const QString legacyKey = QNativeIpcKeyPrivate::legacyKey(nativeKey);
+ const QNativeIpcKey semKey = legacyKey.isEmpty()
+ ? semaphoreNativeKey()
+ : QSystemSemaphore::legacyNativeKey(legacyKey, nativeKey.type());
+ systemSemaphore.setNativeKey(semKey, 1, mode);
+ if (systemSemaphore.error() != QSystemSemaphore::NoError) {
+ QString function = "QSharedMemoryPrivate::initKey"_L1;
+ errorString = QSharedMemory::tr("%1: unable to set key on lock (%2)")
+ .arg(function, systemSemaphore.errorString());
+ switch(systemSemaphore.error()) {
+ case QSystemSemaphore::PermissionDenied:
+ error = QSharedMemory::PermissionDenied;
+ break;
+ case QSystemSemaphore::KeyError:
+ error = QSharedMemory::KeyError;
+ break;
+ case QSystemSemaphore::AlreadyExists:
+ error = QSharedMemory::AlreadyExists;
+ break;
+ case QSystemSemaphore::NotFound:
+ error = QSharedMemory::NotFound;
+ break;
+ case QSystemSemaphore::OutOfResources:
+ error = QSharedMemory::OutOfResources;
+ break;
+ case QSystemSemaphore::UnknownError:
+ default:
+ error = QSharedMemory::UnknownError;
+ break;
+ }
+ return false;
+ }
+#else
+ Q_UNUSED(mode);
+#endif
+ errorString = QString();
+ error = QSharedMemory::NoError;
+ return true;
+}
+
+/*!
+ Returns the legacy key assigned with setKey() to this shared memory, or a null key
+ if no key has been assigned, or if the segment is using a nativeKey(). The
+ key is the identifier used by Qt applications to identify the shared memory
+ segment.
+
+ You can find the native, platform specific, key used by the operating system
+ by calling nativeKey().
+
+ \sa setKey(), setNativeKey()
+ */
+QString QSharedMemory::key() const
+{
+ Q_D(const QSharedMemory);
+ return QNativeIpcKeyPrivate::legacyKey(d->nativeKey);
+}
+
+/*!
+ \since 4.8
+
+ Returns the native, platform specific, key for this shared memory object. The
+ native key is the identifier used by the operating system to identify the
+ shared memory segment.
+
+ You can use the native key to access shared memory segments that have not
+ been created by Qt, or to grant shared memory access to non-Qt applications.
+ See \l{Native IPC Keys} for more information.
+
+ \sa setNativeKey(), nativeIpcKey()
+*/
+QString QSharedMemory::nativeKey() const
+{
+ Q_D(const QSharedMemory);
+ return d->nativeKey.nativeKey();
+}
+
+/*!
+ \since 6.6
+
+ Returns the key type for this shared memory object. The key type complements
+ the nativeKey() as the identifier used by the operating system to identify
+ the shared memory segment.
+
+ You can use the native key to access shared memory segments that have not
+ been created by Qt, or to grant shared memory access to non-Qt applications.
+ See \l{Native IPC Keys} for more information.
+
+ \sa nativeKey(), setNativeKey()
+*/
+QNativeIpcKey QSharedMemory::nativeIpcKey() const
+{
+ Q_D(const QSharedMemory);
+ return d->nativeKey;
+}
+
+/*!
+ Creates a shared memory segment of \a size bytes with the key passed to the
+ constructor or set with setNativeKey(), then attaches to
+ the new shared memory segment with the given access \a mode and returns
+ \tt true. If a shared memory segment identified by the key already exists,
+ the attach operation is not performed and \tt false is returned. When the
+ return value is \tt false, call error() to determine which error occurred.
+
+ \sa error()
+ */
+bool QSharedMemory::create(qsizetype size, AccessMode mode)
+{
+ Q_D(QSharedMemory);
+ QLatin1StringView function = "QSharedMemory::create"_L1;
+
+#if QT_CONFIG(systemsemaphore)
+ if (!d->initKey(QSystemSemaphore::Create))
+ return false;
+ QSharedMemoryLocker lock(this);
+ if (!d->nativeKey.isEmpty() && !d->tryLocker(&lock, function))
+ return false;
+#else
+ if (!d->initKey({}))
+ return false;
+#endif
+
+ if (size <= 0) {
+ d->error = QSharedMemory::InvalidSize;
+ d->errorString =
+ QSharedMemory::tr("%1: create size is less then 0").arg(function);
+ return false;
+ }
+
+ if (!d->create(size))
+ return false;
+
+ return d->attach(mode);
+}
+
+/*!
+ Returns the size of the attached shared memory segment. If no shared
+ memory segment is attached, 0 is returned.
+
+ \note The size of the segment may be larger than the requested size that was
+ passed to create().
+
+ \sa create(), attach()
+ */
+qsizetype QSharedMemory::size() const
+{
+ Q_D(const QSharedMemory);
+ return d->size;
+}
+
+/*!
+ \enum QSharedMemory::AccessMode
+
+ \value ReadOnly The shared memory segment is read-only. Writing to
+ the shared memory segment is not allowed. An attempt to write to a
+ shared memory segment created with ReadOnly causes the program to
+ abort.
+
+ \value ReadWrite Reading and writing the shared memory segment are
+ both allowed.
+*/
+
+/*!
+ Attempts to attach the process to the shared memory segment
+ identified by the key that was passed to the constructor or to a
+ call to setNativeKey(). The access \a mode is \l {QSharedMemory::}
+ {ReadWrite} by default. It can also be \l {QSharedMemory::}
+ {ReadOnly}. Returns \c true if the attach operation is successful. If
+ false is returned, call error() to determine which error occurred.
+ After attaching the shared memory segment, a pointer to the shared
+ memory can be obtained by calling data().
+
+ \sa isAttached(), detach(), create()
+ */
+bool QSharedMemory::attach(AccessMode mode)
+{
+ Q_D(QSharedMemory);
+
+ if (isAttached() || !d->initKey({}))
+ return false;
+#if QT_CONFIG(systemsemaphore)
+ QSharedMemoryLocker lock(this);
+ if (!d->nativeKey.isEmpty() && !d->tryLocker(&lock, "QSharedMemory::attach"_L1))
+ return false;
+#endif
+
+ if (isAttached() || !d->handle())
+ return false;
+
+ return d->attach(mode);
+}
+
+/*!
+ Returns \c true if this process is attached to the shared memory
+ segment.
+
+ \sa attach(), detach()
+ */
+bool QSharedMemory::isAttached() const
+{
+ Q_D(const QSharedMemory);
+ return (nullptr != d->memory);
+}
+
+/*!
+ Detaches the process from the shared memory segment. If this was the
+ last process attached to the shared memory segment, then the shared
+ memory segment is released by the system, i.e., the contents are
+ destroyed. The function returns \c true if it detaches the shared
+ memory segment. If it returns \c false, it usually means the segment
+ either isn't attached, or it is locked by another process.
+
+ \sa attach(), isAttached()
+ */
+bool QSharedMemory::detach()
+{
+ Q_D(QSharedMemory);
+ if (!isAttached())
+ return false;
+
+#if QT_CONFIG(systemsemaphore)
+ QSharedMemoryLocker lock(this);
+ if (!d->nativeKey.isEmpty() && !d->tryLocker(&lock, "QSharedMemory::detach"_L1))
+ return false;
+#endif
+
+ return d->detach();
+}
+
+/*!
+ Returns a pointer to the contents of the shared memory segment, if one is
+ attached. Otherwise it returns null. The value returned by this function will
+ not change until a \l {detach()}{detach} happens, so it is safe to store this
+ pointer.
+
+ If the memory operations are not atomic, you may lock the shared memory with
+ lock() before reading from or writing, but remember to release the lock with
+ unlock() after you are done.
+
+ \sa attach()
+ */
+void *QSharedMemory::data()
+{
+ Q_D(QSharedMemory);
+ return d->memory;
+}
+
+/*!
+ Returns a const pointer to the contents of the shared memory segment, if one
+ is attached. Otherwise it returns null. The value returned by this function
+ will not change until a \l {detach()}{detach} happens, so it is safe to store
+ this pointer.
+
+ If the memory operations are not atomic, you may lock the shared memory with
+ lock() before reading from or writing, but remember to release the lock with
+ unlock() after you are done.
+
+ \sa attach(), create()
+ */
+const void *QSharedMemory::constData() const
+{
+ Q_D(const QSharedMemory);
+ return d->memory;
+}
+
+/*!
+ \overload data()
+ */
+const void *QSharedMemory::data() const
+{
+ Q_D(const QSharedMemory);
+ return d->memory;
+}
+
+#if QT_CONFIG(systemsemaphore)
+/*!
+ This is a semaphore that locks the shared memory segment for access
+ by this process and returns \c true. If another process has locked the
+ segment, this function blocks until the lock is released. Then it
+ acquires the lock and returns \c true. If this function returns \c false,
+ it means that you have ignored a false return from create() or attach(),
+ that you have set the key with setNativeKey() or that
+ QSystemSemaphore::acquire() failed due to an unknown system error.
+
+ \sa unlock(), data(), QSystemSemaphore::acquire()
+ */
+bool QSharedMemory::lock()
+{
+ Q_D(QSharedMemory);
+ if (d->lockedByMe) {
+ qWarning("QSharedMemory::lock: already locked");
+ return true;
+ }
+ if (d->systemSemaphore.acquire()) {
+ d->lockedByMe = true;
+ return true;
+ }
+ const auto function = "QSharedMemory::lock"_L1;
+ d->errorString = QSharedMemory::tr("%1: unable to lock").arg(function);
+ d->error = QSharedMemory::LockError;
+ return false;
+}
+
+/*!
+ Releases the lock on the shared memory segment and returns \c true, if
+ the lock is currently held by this process. If the segment is not
+ locked, or if the lock is held by another process, nothing happens
+ and false is returned.
+
+ \sa lock()
+ */
+bool QSharedMemory::unlock()
+{
+ Q_D(QSharedMemory);
+ if (!d->lockedByMe)
+ return false;
+ d->lockedByMe = false;
+ if (d->systemSemaphore.release())
+ return true;
+ const auto function = "QSharedMemory::unlock"_L1;
+ d->errorString = QSharedMemory::tr("%1: unable to unlock").arg(function);
+ d->error = QSharedMemory::LockError;
+ return false;
+}
+#endif // QT_CONFIG(systemsemaphore)
+
+/*!
+ \enum QSharedMemory::SharedMemoryError
+
+ \value NoError No error occurred.
+
+ \value PermissionDenied The operation failed because the caller
+ didn't have the required permissions.
+
+ \value InvalidSize A create operation failed because the requested
+ size was invalid.
+
+ \value KeyError The operation failed because of an invalid key.
+
+ \value AlreadyExists A create() operation failed because a shared
+ memory segment with the specified key already existed.
+
+ \value NotFound An attach() failed because a shared memory segment
+ with the specified key could not be found.
+
+ \value LockError The attempt to lock() the shared memory segment
+ failed because create() or attach() failed and returned false, or
+ because a system error occurred in QSystemSemaphore::acquire().
+
+ \value OutOfResources A create() operation failed because there was
+ not enough memory available to fill the request.
+
+ \value UnknownError Something else happened and it was bad.
+*/
+
+/*!
+ Returns a value indicating whether an error occurred, and, if so,
+ which error it was.
+
+ \sa errorString()
+ */
+QSharedMemory::SharedMemoryError QSharedMemory::error() const
+{
+ Q_D(const QSharedMemory);
+ return d->error;
+}
+
+/*!
+ Returns a text description of the last error that occurred. If
+ error() returns an \l {QSharedMemory::SharedMemoryError} {error
+ value}, call this function to get a text string that describes the
+ error.
+
+ \sa error()
+ */
+QString QSharedMemory::errorString() const
+{
+ Q_D(const QSharedMemory);
+ return d->errorString;
+}
+
+void QSharedMemoryPrivate::setUnixErrorString(QLatin1StringView function)
+{
+ // EINVAL is handled in functions so they can give better error strings
+ switch (errno) {
+ case EACCES:
+ errorString = QSharedMemory::tr("%1: permission denied").arg(function);
+ error = QSharedMemory::PermissionDenied;
+ break;
+ case EEXIST:
+ errorString = QSharedMemory::tr("%1: already exists").arg(function);
+ error = QSharedMemory::AlreadyExists;
+ break;
+ case ENOENT:
+ errorString = QSharedMemory::tr("%1: doesn't exist").arg(function);
+ error = QSharedMemory::NotFound;
+ break;
+ case EMFILE:
+ case ENOMEM:
+ case ENOSPC:
+ errorString = QSharedMemory::tr("%1: out of resources").arg(function);
+ error = QSharedMemory::OutOfResources;
+ break;
+ default:
+ errorString = QSharedMemory::tr("%1: unknown error: %2")
+ .arg(function, qt_error_string(errno));
+ error = QSharedMemory::UnknownError;
+#if defined QSHAREDMEMORY_DEBUG
+ qDebug() << errorString << "key" << key << "errno" << errno << EINVAL;
+#endif
+ }
+}
+
+bool QSharedMemory::isKeyTypeSupported(QNativeIpcKey::Type type)
+{
+ if (!isIpcSupported(IpcType::SharedMemory, type))
+ return false;
+ using Variant = decltype(QSharedMemoryPrivate::backend);
+ return Variant::staticVisit(type, [](auto ptr) {
+ using Impl = std::decay_t<decltype(*ptr)>;
+ return Impl::runtimeSupportCheck();
+ });
+}
+
+QNativeIpcKey QSharedMemory::platformSafeKey(const QString &key, QNativeIpcKey::Type type)
+{
+ return QtIpcCommon::platformSafeKey(key, IpcType::SharedMemory, type);
+}
+
+QNativeIpcKey QSharedMemory::legacyNativeKey(const QString &key, QNativeIpcKey::Type type)
+{
+ return QtIpcCommon::legacyPlatformSafeKey(key, IpcType::SharedMemory, type);
+}
+
+#endif // QT_CONFIG(sharedmemory)
+
+QT_END_NAMESPACE
+
+#include "moc_qsharedmemory.cpp"
diff --git a/src/corelib/ipc/qsharedmemory.h b/src/corelib/ipc/qsharedmemory.h
new file mode 100644
index 0000000000..ab448b15c1
--- /dev/null
+++ b/src/corelib/ipc/qsharedmemory.h
@@ -0,0 +1,99 @@
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QSHAREDMEMORY_H
+#define QSHAREDMEMORY_H
+
+#include <QtCore/qtipccommon.h>
+#ifndef QT_NO_QOBJECT
+# include <QtCore/qobject.h>
+#else
+# include <QtCore/qobjectdefs.h>
+# include <QtCore/qscopedpointer.h>
+# include <QtCore/qstring.h>
+#endif
+
+QT_BEGIN_NAMESPACE
+
+#if QT_CONFIG(sharedmemory)
+
+class QSharedMemoryPrivate;
+
+class Q_CORE_EXPORT QSharedMemory : public QObject
+{
+ Q_OBJECT
+ Q_DECLARE_PRIVATE(QSharedMemory)
+
+public:
+ enum AccessMode
+ {
+ ReadOnly,
+ ReadWrite
+ };
+ Q_ENUM(AccessMode)
+
+ enum SharedMemoryError
+ {
+ NoError,
+ PermissionDenied,
+ InvalidSize,
+ KeyError,
+ AlreadyExists,
+ NotFound,
+ LockError,
+ OutOfResources,
+ UnknownError
+ };
+ Q_ENUM(SharedMemoryError)
+
+ QSharedMemory(QObject *parent = nullptr);
+ QSharedMemory(const QNativeIpcKey &key, QObject *parent = nullptr);
+ ~QSharedMemory();
+
+ QSharedMemory(const QString &key, QObject *parent = nullptr);
+ void setKey(const QString &key);
+ QString key() const;
+
+ void setNativeKey(const QNativeIpcKey &key);
+ void setNativeKey(const QString &key, QNativeIpcKey::Type type = QNativeIpcKey::legacyDefaultTypeForOs())
+ { setNativeKey({ key, type }); }
+ QString nativeKey() const;
+ QNativeIpcKey nativeIpcKey() const;
+#if QT_CORE_REMOVED_SINCE(6, 5)
+ void setNativeKey(const QString &key);
+#endif
+
+ bool create(qsizetype size, AccessMode mode = ReadWrite);
+ qsizetype size() const;
+
+ bool attach(AccessMode mode = ReadWrite);
+ bool isAttached() const;
+ bool detach();
+
+ void *data();
+ const void* constData() const;
+ const void *data() const;
+
+#if QT_CONFIG(systemsemaphore)
+ bool lock();
+ bool unlock();
+#endif
+
+ SharedMemoryError error() const;
+ QString errorString() const;
+
+ static bool isKeyTypeSupported(QNativeIpcKey::Type type) Q_DECL_CONST_FUNCTION;
+ static QNativeIpcKey platformSafeKey(const QString &key,
+ QNativeIpcKey::Type type = QNativeIpcKey::DefaultTypeForOs);
+ static QNativeIpcKey legacyNativeKey(const QString &key,
+ QNativeIpcKey::Type type = QNativeIpcKey::legacyDefaultTypeForOs());
+
+private:
+ Q_DISABLE_COPY(QSharedMemory)
+};
+
+#endif // QT_CONFIG(sharedmemory)
+
+QT_END_NAMESPACE
+
+#endif // QSHAREDMEMORY_H
diff --git a/src/corelib/ipc/qsharedmemory_p.h b/src/corelib/ipc/qsharedmemory_p.h
new file mode 100644
index 0000000000..987bb38642
--- /dev/null
+++ b/src/corelib/ipc/qsharedmemory_p.h
@@ -0,0 +1,215 @@
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QSHAREDMEMORY_P_H
+#define QSHAREDMEMORY_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include "qsharedmemory.h"
+
+#include <QtCore/qstring.h>
+
+#if QT_CONFIG(sharedmemory)
+#include "qsystemsemaphore.h"
+#include "qtipccommon_p.h"
+#include "private/qobject_p.h"
+
+#if QT_CONFIG(posix_shm)
+# include <sys/mman.h>
+#endif
+#if QT_CONFIG(sysv_shm)
+# include <sys/shm.h>
+#endif
+
+QT_BEGIN_NAMESPACE
+
+class QSharedMemoryPrivate;
+
+#if QT_CONFIG(systemsemaphore)
+/*!
+ Helper class
+ */
+class QSharedMemoryLocker
+{
+
+public:
+ Q_NODISCARD_CTOR QSharedMemoryLocker(QSharedMemory *sharedMemory) : q_sm(sharedMemory)
+ {
+ Q_ASSERT(q_sm);
+ }
+
+ inline ~QSharedMemoryLocker()
+ {
+ if (q_sm)
+ q_sm->unlock();
+ }
+
+ inline bool lock()
+ {
+ if (q_sm && q_sm->lock())
+ return true;
+ q_sm = nullptr;
+ return false;
+ }
+
+private:
+ QSharedMemory *q_sm;
+};
+#endif // QT_CONFIG(systemsemaphore)
+
+class QSharedMemoryPosix
+{
+public:
+ static constexpr bool Enabled = QT_CONFIG(posix_shm);
+ static bool supports(QNativeIpcKey::Type type)
+ { return type == QNativeIpcKey::Type::PosixRealtime; }
+ static bool runtimeSupportCheck();
+
+ bool handle(QSharedMemoryPrivate *self);
+ bool cleanHandle(QSharedMemoryPrivate *self);
+ bool create(QSharedMemoryPrivate *self, qsizetype size);
+ bool attach(QSharedMemoryPrivate *self, QSharedMemory::AccessMode mode);
+ bool detach(QSharedMemoryPrivate *self);
+
+ int hand = -1;
+};
+
+class QSharedMemorySystemV
+{
+public:
+ static constexpr bool Enabled = QT_CONFIG(sysv_shm);
+ static bool supports(QNativeIpcKey::Type type)
+ { return quint16(type) <= 0xff; }
+ static bool runtimeSupportCheck();
+
+#if QT_CONFIG(sysv_sem)
+ key_t handle(QSharedMemoryPrivate *self);
+ bool cleanHandle(QSharedMemoryPrivate *self);
+ bool create(QSharedMemoryPrivate *self, qsizetype size);
+ bool attach(QSharedMemoryPrivate *self, QSharedMemory::AccessMode mode);
+ bool detach(QSharedMemoryPrivate *self);
+
+private:
+ void updateNativeKeyFile(const QNativeIpcKey &nativeKey);
+
+ QByteArray nativeKeyFile;
+ key_t unix_key = 0;
+#endif
+};
+
+class QSharedMemoryWin32
+{
+public:
+#ifdef Q_OS_WIN32
+ static constexpr bool Enabled = true;
+#else
+ static constexpr bool Enabled = false;
+#endif
+ static bool runtimeSupportCheck() { return Enabled; }
+ static bool supports(QNativeIpcKey::Type type)
+ { return type == QNativeIpcKey::Type::Windows; }
+
+ Qt::HANDLE handle(QSharedMemoryPrivate *self);
+ bool cleanHandle(QSharedMemoryPrivate *self);
+ bool create(QSharedMemoryPrivate *self, qsizetype size);
+ bool attach(QSharedMemoryPrivate *self, QSharedMemory::AccessMode mode);
+ bool detach(QSharedMemoryPrivate *self);
+
+ Qt::HANDLE hand = nullptr;
+};
+
+class Q_AUTOTEST_EXPORT QSharedMemoryPrivate : public QObjectPrivate
+{
+ Q_DECLARE_PUBLIC(QSharedMemory)
+
+public:
+ QSharedMemoryPrivate(QNativeIpcKey::Type type) : nativeKey(type)
+ { constructBackend(); }
+ ~QSharedMemoryPrivate();
+
+ void *memory = nullptr;
+ qsizetype size = 0;
+ QNativeIpcKey nativeKey;
+ QString errorString;
+#if QT_CONFIG(systemsemaphore)
+ using SemaphoreAccessMode = QSystemSemaphore::AccessMode;
+ QSystemSemaphore systemSemaphore{ QNativeIpcKey() };
+ bool lockedByMe = false;
+#else
+ enum SemaphoreAccessMode {};
+#endif
+ QSharedMemory::SharedMemoryError error = QSharedMemory::NoError;
+
+ union Backend {
+ Backend() {}
+ ~Backend() {}
+ QSharedMemoryPosix posix;
+ QSharedMemorySystemV sysv;
+ QSharedMemoryWin32 win32;
+ };
+ QtIpcCommon::IpcStorageVariant<&Backend::posix, &Backend::sysv, &Backend::win32> backend;
+
+ void constructBackend();
+ void destructBackend();
+ bool initKey(SemaphoreAccessMode mode);
+
+ template <typename Lambda> auto visit(const Lambda &lambda)
+ {
+ return backend.visit(nativeKey.type(), lambda);
+ }
+
+ bool handle()
+ {
+ return visit([&](auto p) { return !!p->handle(this); });
+ }
+ bool cleanHandle()
+ {
+ return visit([&](auto p) { return p->cleanHandle(this); });
+ }
+ bool create(qsizetype size)
+ {
+ return visit([&](auto p) { return p->create(this, size); });
+ }
+ bool attach(QSharedMemory::AccessMode mode)
+ {
+ return visit([&](auto p) { return p->attach(this, mode); });
+ }
+ bool detach()
+ {
+ return visit([&](auto p) { return p->detach(this); });
+ }
+
+ inline void setError(QSharedMemory::SharedMemoryError e, const QString &message)
+ { error = e; errorString = message; }
+ void setUnixErrorString(QLatin1StringView function);
+ void setWindowsErrorString(QLatin1StringView function);
+
+#if QT_CONFIG(systemsemaphore)
+ bool tryLocker(QSharedMemoryLocker *locker, const QString &function) {
+ if (!locker->lock()) {
+ errorString = QSharedMemory::tr("%1: unable to lock").arg(function);
+ error = QSharedMemory::LockError;
+ return false;
+ }
+ return true;
+ }
+ QNativeIpcKey semaphoreNativeKey() const;
+#endif // QT_CONFIG(systemsemaphore)
+};
+
+QT_END_NAMESPACE
+
+#endif // QT_CONFIG(sharedmemory)
+
+#endif // QSHAREDMEMORY_P_H
+
diff --git a/src/corelib/ipc/qsharedmemory_posix.cpp b/src/corelib/ipc/qsharedmemory_posix.cpp
new file mode 100644
index 0000000000..582c6628e1
--- /dev/null
+++ b/src/corelib/ipc/qsharedmemory_posix.cpp
@@ -0,0 +1,196 @@
+// Copyright (C) 2015 Konstantin Ritt <ritt.ks@gmail.com>
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2015 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Tobias Koenig <tobias.koenig@kdab.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#include "qsharedmemory.h"
+#include "qsharedmemory_p.h"
+#include "qtipccommon_p.h"
+#include <qfile.h>
+
+#include <errno.h>
+
+#if QT_CONFIG(sharedmemory)
+#if QT_CONFIG(posix_shm)
+#include <sys/types.h>
+#include <sys/mman.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+#include "private/qcore_unix_p.h"
+
+#ifndef O_CLOEXEC
+# define O_CLOEXEC 0
+#endif
+
+QT_BEGIN_NAMESPACE
+
+using namespace Qt::StringLiterals;
+using namespace QtIpcCommon;
+
+bool QSharedMemoryPosix::runtimeSupportCheck()
+{
+ static const bool result = []() {
+ (void)shm_open("", 0, 0); // this WILL fail
+ return errno != ENOSYS;
+ }();
+ return result;
+}
+
+bool QSharedMemoryPosix::handle(QSharedMemoryPrivate *self)
+{
+ // don't allow making handles on empty keys
+ if (self->nativeKey.isEmpty()) {
+ self->setError(QSharedMemory::KeyError,
+ QSharedMemory::tr("%1: key is empty").arg("QSharedMemory::handle"_L1));
+ return false;
+ }
+
+ return true;
+}
+
+bool QSharedMemoryPosix::cleanHandle(QSharedMemoryPrivate *)
+{
+ if (hand != -1)
+ qt_safe_close(hand);
+ hand = -1;
+
+ return true;
+}
+
+bool QSharedMemoryPosix::create(QSharedMemoryPrivate *self, qsizetype size)
+{
+ if (!handle(self))
+ return false;
+
+ const QByteArray shmName = QFile::encodeName(self->nativeKey.nativeKey());
+
+ int fd;
+ QT_EINTR_LOOP(fd, ::shm_open(shmName.constData(), O_RDWR | O_CREAT | O_EXCL | O_CLOEXEC, 0600));
+ if (fd == -1) {
+ const int errorNumber = errno;
+ const auto function = "QSharedMemory::attach (shm_open)"_L1;
+ switch (errorNumber) {
+ case EINVAL:
+ self->setError(QSharedMemory::KeyError,
+ QSharedMemory::tr("%1: bad name").arg(function));
+ break;
+ default:
+ self->setUnixErrorString(function);
+ }
+ return false;
+ }
+
+ // the size may only be set once
+ int ret;
+ QT_EINTR_LOOP(ret, QT_FTRUNCATE(fd, size));
+ if (ret == -1) {
+ self->setUnixErrorString("QSharedMemory::create (ftruncate)"_L1);
+ qt_safe_close(fd);
+ return false;
+ }
+
+ qt_safe_close(fd);
+
+ return true;
+}
+
+bool QSharedMemoryPosix::attach(QSharedMemoryPrivate *self, QSharedMemory::AccessMode mode)
+{
+ const QByteArray shmName = QFile::encodeName(self->nativeKey.nativeKey());
+
+ const int oflag = (mode == QSharedMemory::ReadOnly ? O_RDONLY : O_RDWR);
+ const mode_t omode = (mode == QSharedMemory::ReadOnly ? 0400 : 0600);
+
+ QT_EINTR_LOOP(hand, ::shm_open(shmName.constData(), oflag | O_CLOEXEC, omode));
+ if (hand == -1) {
+ const int errorNumber = errno;
+ const auto function = "QSharedMemory::attach (shm_open)"_L1;
+ switch (errorNumber) {
+ case EINVAL:
+ self->setError(QSharedMemory::KeyError,
+ QSharedMemory::tr("%1: bad name").arg(function));
+ break;
+ default:
+ self->setUnixErrorString(function);
+ }
+ hand = -1;
+ return false;
+ }
+
+ // grab the size
+ QT_STATBUF st;
+ if (QT_FSTAT(hand, &st) == -1) {
+ self->setUnixErrorString("QSharedMemory::attach (fstat)"_L1);
+ cleanHandle(self);
+ return false;
+ }
+ self->size = qsizetype(st.st_size);
+
+ // grab the memory
+ const int mprot = (mode == QSharedMemory::ReadOnly ? PROT_READ : PROT_READ | PROT_WRITE);
+ self->memory = QT_MMAP(0, size_t(self->size), mprot, MAP_SHARED, hand, 0);
+ if (self->memory == MAP_FAILED || !self->memory) {
+ self->setUnixErrorString("QSharedMemory::attach (mmap)"_L1);
+ cleanHandle(self);
+ self->memory = 0;
+ self->size = 0;
+ return false;
+ }
+
+#ifdef F_ADD_SEALS
+ // Make sure the shared memory region will not shrink
+ // otherwise someone could cause SIGBUS on us.
+ // (see http://lwn.net/Articles/594919/)
+ fcntl(hand, F_ADD_SEALS, F_SEAL_SHRINK);
+#endif
+
+ return true;
+}
+
+bool QSharedMemoryPosix::detach(QSharedMemoryPrivate *self)
+{
+ // detach from the memory segment
+ if (::munmap(self->memory, size_t(self->size)) == -1) {
+ self->setUnixErrorString("QSharedMemory::detach (munmap)"_L1);
+ return false;
+ }
+ self->memory = 0;
+ self->size = 0;
+
+#ifdef Q_OS_QNX
+ // On QNX the st_nlink field of struct stat contains the number of
+ // active shm_open() connections to the shared memory file, so we
+ // can use it to automatically clean up the file once the last
+ // user has detached from it.
+
+ // get the number of current attachments
+ int shm_nattch = 0;
+ QT_STATBUF st;
+ if (QT_FSTAT(hand, &st) == 0) {
+ // subtract 2 from linkcount: one for our own open and one for the dir entry
+ shm_nattch = st.st_nlink - 2;
+ }
+
+ cleanHandle(self);
+
+ // if there are no attachments then unlink the shared memory
+ if (shm_nattch == 0) {
+ const QByteArray shmName = QFile::encodeName(self->nativeKey.nativeKey());
+ if (::shm_unlink(shmName.constData()) == -1 && errno != ENOENT)
+ self->setUnixErrorString("QSharedMemory::detach (shm_unlink)"_L1);
+ }
+#else
+ // On non-QNX systems (tested Linux and Haiku), the st_nlink field is always 1,
+ // so we'll simply leak the shared memory files.
+ cleanHandle(self);
+#endif
+
+ return true;
+}
+
+QT_END_NAMESPACE
+
+#endif // QT_CONFIG(posix_shm)
+#endif // QT_CONFIG(sharedmemory)
diff --git a/src/corelib/ipc/qsharedmemory_systemv.cpp b/src/corelib/ipc/qsharedmemory_systemv.cpp
new file mode 100644
index 0000000000..dc9de11091
--- /dev/null
+++ b/src/corelib/ipc/qsharedmemory_systemv.cpp
@@ -0,0 +1,212 @@
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#include "qsharedmemory.h"
+#include "qsharedmemory_p.h"
+
+#include "qtipccommon_p.h"
+
+#include <qdir.h>
+#include <qdebug.h>
+
+#include <errno.h>
+
+#if QT_CONFIG(sharedmemory)
+#if QT_CONFIG(sysv_shm)
+#include <sys/types.h>
+#include <sys/ipc.h>
+#include <sys/mman.h>
+#include <sys/shm.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+#include "private/qcore_unix_p.h"
+#if defined(Q_OS_DARWIN)
+#include "private/qcore_mac_p.h"
+#endif
+
+QT_BEGIN_NAMESPACE
+
+using namespace Qt::StringLiterals;
+using namespace QtIpcCommon;
+
+bool QSharedMemorySystemV::runtimeSupportCheck()
+{
+#if defined(Q_OS_DARWIN)
+ if (qt_apple_isSandboxed())
+ return false;
+#endif
+ static const bool result = []() {
+ (void)shmget(IPC_PRIVATE, ~size_t(0), 0); // this will fail
+ return errno != ENOSYS;
+ }();
+ return result;
+}
+
+
+inline void QSharedMemorySystemV::updateNativeKeyFile(const QNativeIpcKey &nativeKey)
+{
+ Q_ASSERT(nativeKeyFile.isEmpty() );
+ if (!nativeKey.nativeKey().isEmpty())
+ nativeKeyFile = QFile::encodeName(nativeKey.nativeKey());
+}
+
+/*!
+ \internal
+
+ If not already made create the handle used for accessing the shared memory.
+*/
+key_t QSharedMemorySystemV::handle(QSharedMemoryPrivate *self)
+{
+ // already made
+ if (unix_key)
+ return unix_key;
+
+ // don't allow making handles on empty keys
+ if (nativeKeyFile.isEmpty())
+ updateNativeKeyFile(self->nativeKey);
+ if (nativeKeyFile.isEmpty()) {
+ self->setError(QSharedMemory::KeyError,
+ QSharedMemory::tr("%1: key is empty")
+ .arg("QSharedMemory::handle:"_L1));
+ return 0;
+ }
+
+ unix_key = ftok(nativeKeyFile, int(self->nativeKey.type()));
+ if (unix_key < 0) {
+ self->setUnixErrorString("QSharedMemory::handle"_L1);
+ nativeKeyFile.clear();
+ unix_key = 0;
+ }
+ return unix_key;
+}
+
+bool QSharedMemorySystemV::cleanHandle(QSharedMemoryPrivate *self)
+{
+ if (unix_key == 0)
+ return true;
+
+ // Get the number of current attachments
+ struct shmid_ds shmid_ds;
+ QByteArray keyfile = std::exchange(nativeKeyFile, QByteArray());
+
+ int id = shmget(unix_key, 0, 0400);
+ unix_key = 0;
+ if (shmctl(id, IPC_STAT, &shmid_ds))
+ return errno != EINVAL;
+
+ // If there are still attachments, keep the keep file and shm
+ if (shmid_ds.shm_nattch != 0)
+ return true;
+
+ if (shmctl(id, IPC_RMID, &shmid_ds) < 0) {
+ if (errno != EINVAL) {
+ self->setUnixErrorString("QSharedMemory::remove"_L1);
+ return false;
+ }
+ };
+
+ // remove file
+ return unlink(keyfile) == 0;
+}
+
+bool QSharedMemorySystemV::create(QSharedMemoryPrivate *self, qsizetype size)
+{
+ // build file if needed
+ bool createdFile = false;
+ updateNativeKeyFile(self->nativeKey);
+ int built = createUnixKeyFile(nativeKeyFile);
+ if (built == -1) {
+ self->setError(QSharedMemory::KeyError,
+ QSharedMemory::tr("%1: unable to make key")
+ .arg("QSharedMemory::handle:"_L1));
+ return false;
+ }
+ if (built == 1) {
+ createdFile = true;
+ }
+
+ // get handle
+ if (!handle(self)) {
+ if (createdFile)
+ unlink(nativeKeyFile);
+ return false;
+ }
+
+ // create
+ if (-1 == shmget(unix_key, size_t(size), 0600 | IPC_CREAT | IPC_EXCL)) {
+ const auto function = "QSharedMemory::create"_L1;
+ switch (errno) {
+ case EINVAL:
+ self->setError(QSharedMemory::InvalidSize,
+ QSharedMemory::tr("%1: system-imposed size restrictions")
+ .arg("QSharedMemory::handle"_L1));
+ break;
+ default:
+ self->setUnixErrorString(function);
+ }
+ if (createdFile && self->error != QSharedMemory::AlreadyExists)
+ unlink(nativeKeyFile);
+ return false;
+ }
+
+ return true;
+}
+
+bool QSharedMemorySystemV::attach(QSharedMemoryPrivate *self, QSharedMemory::AccessMode mode)
+{
+ // grab the shared memory segment id
+ int id = shmget(unix_key, 0, (mode == QSharedMemory::ReadOnly ? 0400 : 0600));
+ if (-1 == id) {
+ self->setUnixErrorString("QSharedMemory::attach (shmget)"_L1);
+ unix_key = 0;
+ nativeKeyFile.clear();
+ return false;
+ }
+
+ // grab the memory
+ self->memory = shmat(id, nullptr, (mode == QSharedMemory::ReadOnly ? SHM_RDONLY : 0));
+ if (self->memory == MAP_FAILED) {
+ self->memory = nullptr;
+ self->setUnixErrorString("QSharedMemory::attach (shmat)"_L1);
+ return false;
+ }
+
+ // grab the size
+ shmid_ds shmid_ds;
+ if (!shmctl(id, IPC_STAT, &shmid_ds)) {
+ self->size = (qsizetype)shmid_ds.shm_segsz;
+ } else {
+ self->setUnixErrorString("QSharedMemory::attach (shmctl)"_L1);
+ return false;
+ }
+
+ return true;
+}
+
+bool QSharedMemorySystemV::detach(QSharedMemoryPrivate *self)
+{
+ // detach from the memory segment
+ if (shmdt(self->memory) < 0) {
+ const auto function = "QSharedMemory::detach"_L1;
+ switch (errno) {
+ case EINVAL:
+ self->setError(QSharedMemory::NotFound,
+ QSharedMemory::tr("%1: not attached").arg(function));
+ break;
+ default:
+ self->setUnixErrorString(function);
+ }
+ return false;
+ }
+ self->memory = nullptr;
+ self->size = 0;
+
+ return cleanHandle(self);
+}
+
+QT_END_NAMESPACE
+
+#endif // QT_CONFIG(sysv_shm)
+#endif // QT_CONFIG(sharedmemory)
diff --git a/src/corelib/ipc/qsharedmemory_win.cpp b/src/corelib/ipc/qsharedmemory_win.cpp
new file mode 100644
index 0000000000..472f34f9a1
--- /dev/null
+++ b/src/corelib/ipc/qsharedmemory_win.cpp
@@ -0,0 +1,148 @@
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#include "qsharedmemory.h"
+#include "qsharedmemory_p.h"
+#include "qsystemsemaphore.h"
+#include <qdebug.h>
+#include <qt_windows.h>
+
+QT_BEGIN_NAMESPACE
+
+using namespace Qt::StringLiterals;
+
+#if QT_CONFIG(sharedmemory)
+
+void QSharedMemoryPrivate::setWindowsErrorString(QLatin1StringView function)
+{
+ DWORD windowsError = GetLastError();
+ if (windowsError == 0)
+ return;
+ switch (windowsError) {
+ case ERROR_ALREADY_EXISTS:
+ error = QSharedMemory::AlreadyExists;
+ errorString = QSharedMemory::tr("%1: already exists").arg(function);
+ break;
+ case ERROR_FILE_NOT_FOUND:
+ error = QSharedMemory::NotFound;
+ errorString = QSharedMemory::tr("%1: doesn't exist").arg(function);
+ break;
+ case ERROR_COMMITMENT_LIMIT:
+ error = QSharedMemory::InvalidSize;
+ errorString = QSharedMemory::tr("%1: invalid size").arg(function);
+ break;
+ case ERROR_NO_SYSTEM_RESOURCES:
+ case ERROR_NOT_ENOUGH_MEMORY:
+ error = QSharedMemory::OutOfResources;
+ errorString = QSharedMemory::tr("%1: out of resources").arg(function);
+ break;
+ case ERROR_ACCESS_DENIED:
+ error = QSharedMemory::PermissionDenied;
+ errorString = QSharedMemory::tr("%1: permission denied").arg(function);
+ break;
+ default:
+ errorString = QSharedMemory::tr("%1: unknown error: %2")
+ .arg(function, qt_error_string(windowsError));
+ error = QSharedMemory::UnknownError;
+#if defined QSHAREDMEMORY_DEBUG
+ qDebug() << errorString << "key" << key;
+#endif
+ }
+}
+
+HANDLE QSharedMemoryWin32::handle(QSharedMemoryPrivate *self)
+{
+ if (!hand) {
+ const auto function = "QSharedMemory::handle"_L1;
+ if (self->nativeKey.isEmpty()) {
+ self->setError(QSharedMemory::KeyError,
+ QSharedMemory::tr("%1: unable to make key").arg(function));
+ return 0;
+ }
+ hand = OpenFileMapping(FILE_MAP_ALL_ACCESS, false,
+ reinterpret_cast<const wchar_t *>(self->nativeKey.nativeKey().utf16()));
+ if (!hand) {
+ self->setWindowsErrorString(function);
+ return 0;
+ }
+ }
+ return hand;
+}
+
+bool QSharedMemoryWin32::cleanHandle(QSharedMemoryPrivate *)
+{
+ if (hand != 0 && !CloseHandle(hand)) {
+ hand = 0;
+ return false;
+ }
+ hand = 0;
+ return true;
+}
+
+bool QSharedMemoryWin32::create(QSharedMemoryPrivate *self, qsizetype size)
+{
+ const auto function = "QSharedMemory::create"_L1;
+ if (self->nativeKey.isEmpty()) {
+ self->setError(QSharedMemory::KeyError,
+ QSharedMemory::tr("%1: key error").arg(function));
+ return false;
+ }
+
+ // Create the file mapping.
+ DWORD high, low;
+ if constexpr (sizeof(qsizetype) == 8)
+ high = DWORD(quint64(size) >> 32);
+ else
+ high = 0;
+ low = DWORD(size_t(size) & 0xffffffff);
+ hand = CreateFileMapping(INVALID_HANDLE_VALUE, 0, PAGE_READWRITE, high, low,
+ reinterpret_cast<const wchar_t *>(self->nativeKey.nativeKey().utf16()));
+ self->setWindowsErrorString(function);
+
+ // hand is valid when it already exists unlike unix so explicitly check
+ return self->error != QSharedMemory::AlreadyExists && hand;
+}
+
+bool QSharedMemoryWin32::attach(QSharedMemoryPrivate *self, QSharedMemory::AccessMode mode)
+{
+ // Grab a pointer to the memory block
+ int permissions = (mode == QSharedMemory::ReadOnly ? FILE_MAP_READ : FILE_MAP_ALL_ACCESS);
+ self->memory = (void *)MapViewOfFile(handle(self), permissions, 0, 0, 0);
+ if (!self->memory) {
+ self->setWindowsErrorString("QSharedMemory::attach"_L1);
+ cleanHandle(self);
+ return false;
+ }
+
+ // Grab the size of the memory we have been given (a multiple of 4K on windows)
+ MEMORY_BASIC_INFORMATION info;
+ if (!VirtualQuery(self->memory, &info, sizeof(info))) {
+ // Windows doesn't set an error code on this one,
+ // it should only be a kernel memory error.
+ self->setError(QSharedMemory::UnknownError,
+ QSharedMemory::tr("%1: size query failed")
+ .arg("QSharedMemory::attach: "_L1));
+ return false;
+ }
+ self->size = qsizetype(info.RegionSize);
+
+ return true;
+}
+
+bool QSharedMemoryWin32::detach(QSharedMemoryPrivate *self)
+{
+ // umap memory
+ if (!UnmapViewOfFile(self->memory)) {
+ self->setWindowsErrorString("QSharedMemory::detach"_L1);
+ return false;
+ }
+ self->memory = 0;
+ self->size = 0;
+
+ // close handle
+ return cleanHandle(self);
+}
+
+#endif // QT_CONFIG(sharedmemory)
+
+QT_END_NAMESPACE
diff --git a/src/corelib/kernel/qsystemsemaphore.cpp b/src/corelib/ipc/qsystemsemaphore.cpp
index 063363189d..4c24ef6043 100644
--- a/src/corelib/kernel/qsystemsemaphore.cpp
+++ b/src/corelib/ipc/qsystemsemaphore.cpp
@@ -1,49 +1,26 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qsystemsemaphore.h"
#include "qsystemsemaphore_p.h"
-#include <qglobal.h>
+
+#if QT_CONFIG(systemsemaphore)
+#include <QtCore/q20memory.h>
QT_BEGIN_NAMESPACE
-#ifndef QT_NO_SYSTEMSEMAPHORE
+using namespace QtIpcCommon;
+using namespace Qt::StringLiterals;
+
+inline void QSystemSemaphorePrivate::constructBackend()
+{
+ visit([](auto p) { q20::construct_at(p); });
+}
+
+inline void QSystemSemaphorePrivate::destructBackend()
+{
+ visit([](auto p) { std::destroy_at(p); });
+}
/*!
\class QSystemSemaphore
@@ -52,12 +29,10 @@ QT_BEGIN_NAMESPACE
\brief The QSystemSemaphore class provides a general counting system semaphore.
- A semaphore is a generalization of a mutex. While a mutex can be
- locked only once, a semaphore can be acquired multiple times.
- Typically, a semaphore is used to protect a certain number of
- identical resources.
+ A system semaphore is a generalization of \l QSemaphore. Typically, a
+ semaphore is used to protect a certain number of identical resources.
- Like its lighter counterpart QSemaphore, a QSystemSemaphore can be
+ Like its lighter counterpart, a QSystemSemaphore can be
accessed from multiple \l {QThread} {threads}. Unlike QSemaphore, a
QSystemSemaphore can also be accessed from multiple \l {QProcess}
{processes}. This means QSystemSemaphore is a much heavier class, so
@@ -74,67 +49,34 @@ QT_BEGIN_NAMESPACE
process. The function can also be called with a parameter n > 1,
which releases n resources.
- A system semaphore is created with a string key that other processes
- can use to use the same semaphore.
+ System semaphores are identified by a key, represented by \l QNativeIpcKey. A
+ key can be created in a cross-platform manner by using platformSafeKey(). A
+ system semaphore is created by the QSystemSemaphore constructor when passed
+ an access mode parameter of AccessMode::Create. Once it is created, other
+ processes may attach to the same semaphore using the same key and an access
+ mode parameter of AccessMode::Open.
Example: Create a system semaphore
\snippet code/src_corelib_kernel_qsystemsemaphore.cpp 0
- A typical application of system semaphores is for controlling access
- to a circular buffer shared by a producer process and a consumer
- processes.
-
- \section1 Platform-Specific Behavior
-
- When using this class, be aware of the following platform
- differences:
-
- \b{Windows:} QSystemSemaphore does not own its underlying system
- semaphore. Windows owns it. This means that when all instances of
- QSystemSemaphore for a particular key have been destroyed, either by
- having their destructors called, or because one or more processes
- crash, Windows removes the underlying system semaphore.
-
- \b{Unix:}
-
- \list
- \li QSystemSemaphore owns the underlying system semaphore
- in Unix systems. This means that the last process having an instance of
- QSystemSemaphore for a particular key must remove the underlying
- system semaphore in its destructor. If the last process crashes
- without running the QSystemSemaphore destructor, Unix does not
- automatically remove the underlying system semaphore, and the
- semaphore survives the crash. A subsequent process that constructs a
- QSystemSemaphore with the same key will then be given the existing
- system semaphore. In that case, if the QSystemSemaphore constructor
- has specified its \l {QSystemSemaphore::AccessMode} {access mode} as
- \l {QSystemSemaphore::} {Open}, its initial resource count will not
- be reset to the one provided but remain set to the value it received
- in the crashed process. To protect against this, the first process
- to create a semaphore for a particular key (usually a server), must
- pass its \l {QSystemSemaphore::AccessMode} {access mode} as \l
- {QSystemSemaphore::} {Create}, which will force Unix to reset the
- resource count in the underlying system semaphore.
-
- \li When a process using QSystemSemaphore terminates for
- any reason, Unix automatically reverses the effect of all acquire
- operations that were not released. Thus if the process acquires a
- resource and then exits without releasing it, Unix will release that
- resource.
-
- \endlist
-
- \b{Apple platforms:} Sandboxed applications (including apps
- shipped through the Apple App Store) require the key to
- be in the form \c {<application group identifier>/<custom identifier>},
- as documented \l {https://developer.apple.com/library/archive/documentation/Security/Conceptual/AppSandboxDesignGuide/AppSandboxInDepth/AppSandboxInDepth.html#//apple_ref/doc/uid/TP40011183-CH3-SW24}
- {here} and \l {https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_application-groups}
- {here}, and the key length is limited to 30 characters.
-
- \sa QSharedMemory, QSemaphore
+ For details on the key types, platform-specific limitations, and
+ interoperability with older or non-Qt applications, see the \l{Native IPC
+ Keys} documentation. That includes important information for sandboxed
+ applications on Apple platforms, including all apps obtained via the Apple
+ App Store.
+
+ \sa {Inter-Process Communication}, QSharedMemory, QSemaphore
*/
/*!
+ Requests a system semaphore identified by the legacy key \a key.
+ */
+QSystemSemaphore::QSystemSemaphore(const QString &key, int initialValue, AccessMode mode)
+ : QSystemSemaphore(legacyNativeKey(key), initialValue, mode)
+{
+}
+
+/*!
Requests a system semaphore for the specified \a key. The parameters
\a initialValue and \a mode are used according to the following
rules, which are system dependent.
@@ -170,10 +112,10 @@ QT_BEGIN_NAMESPACE
\sa acquire(), key()
*/
-QSystemSemaphore::QSystemSemaphore(const QString &key, int initialValue, AccessMode mode)
- : d(new QSystemSemaphorePrivate)
+QSystemSemaphore::QSystemSemaphore(const QNativeIpcKey &key, int initialValue, AccessMode mode)
+ : d(new QSystemSemaphorePrivate(key.type()))
{
- setKey(key, initialValue, mode);
+ setNativeKey(key, initialValue, mode);
}
/*!
@@ -228,27 +170,33 @@ QSystemSemaphore::~QSystemSemaphore()
create a new semaphore with the new \a key. The \a initialValue and
\a mode parameters are as defined for the constructor.
- \sa QSystemSemaphore(), key()
+ This function is useful if the native key was shared from another process.
+ See \l{Native IPC Keys} for more information.
+
+ \sa QSystemSemaphore(), nativeIpcKey()
*/
-void QSystemSemaphore::setKey(const QString &key, int initialValue, AccessMode mode)
+void QSystemSemaphore::setNativeKey(const QNativeIpcKey &key, int initialValue, AccessMode mode)
{
- if (key == d->key && mode == Open)
+ if (key == d->nativeKey && mode == Open)
return;
- d->clearError();
-#if !defined(Q_OS_WIN) && !defined(QT_POSIX_IPC)
- // optimization to not destroy/create the file & semaphore
- if (key == d->key && mode == Create && d->createdSemaphore && d->createdFile) {
- d->initialValue = initialValue;
- d->unix_key = -1;
- d->handle(mode);
+ if (!isKeyTypeSupported(key.type())) {
+ d->setError(KeyError, tr("%1: unsupported key type")
+ .arg("QSystemSemaphore::setNativeKey"_L1));
return;
}
-#endif
+
+ d->clearError();
d->cleanHandle();
- d->key = key;
+ if (key.type() == d->nativeKey.type()) {
+ // we can reuse the backend
+ d->nativeKey = key;
+ } else {
+ // we must recreate the backend
+ d->destructBackend();
+ d->nativeKey = key;
+ d->constructBackend();
+ }
d->initialValue = initialValue;
- // cache the file name so it doesn't have to be generated all the time.
- d->fileName = d->makeKeyFileName();
d->handle(mode);
}
@@ -256,11 +204,41 @@ void QSystemSemaphore::setKey(const QString &key, int initialValue, AccessMode m
Returns the key assigned to this system semaphore. The key is the
name by which the semaphore can be accessed from other processes.
+ You can use the native key to access system semaphores that have not been
+ created by Qt, or to grant access to non-Qt applications. See \l{Native IPC
+ Keys} for more information.
+
+ \sa setNativeKey()
+ */
+QNativeIpcKey QSystemSemaphore::nativeIpcKey() const
+{
+ return d->nativeKey;
+}
+
+/*!
+ This function works the same as the constructor. It reconstructs
+ this QSystemSemaphore object. If the new \a key is different from
+ the old key, calling this function is like calling the destructor of
+ the semaphore with the old key, then calling the constructor to
+ create a new semaphore with the new \a key. The \a initialValue and
+ \a mode parameters are as defined for the constructor.
+
+ \sa QSystemSemaphore(), key()
+ */
+void QSystemSemaphore::setKey(const QString &key, int initialValue, AccessMode mode)
+{
+ setNativeKey(legacyNativeKey(key), initialValue, mode);
+}
+
+/*!
+ Returns the legacy key assigned to this system semaphore. The key is the
+ name by which the semaphore can be accessed from other processes.
+
\sa setKey()
*/
QString QSystemSemaphore::key() const
{
- return d->key;
+ return QNativeIpcKeyPrivate::legacyKey(d->nativeKey);
}
/*!
@@ -359,6 +337,66 @@ QString QSystemSemaphore::errorString() const
return d->errorString;
}
-#endif // QT_NO_SYSTEMSEMAPHORE
+void QSystemSemaphorePrivate::setUnixErrorString(QLatin1StringView function)
+{
+ // EINVAL is handled in functions so they can give better error strings
+ switch (errno) {
+ case EPERM:
+ case EACCES:
+ errorString = QSystemSemaphore::tr("%1: permission denied").arg(function);
+ error = QSystemSemaphore::PermissionDenied;
+ break;
+ case EEXIST:
+ errorString = QSystemSemaphore::tr("%1: already exists").arg(function);
+ error = QSystemSemaphore::AlreadyExists;
+ break;
+ case ENOENT:
+ errorString = QSystemSemaphore::tr("%1: does not exist").arg(function);
+ error = QSystemSemaphore::NotFound;
+ break;
+ case ERANGE:
+ case ENOSPC:
+ case EMFILE:
+ errorString = QSystemSemaphore::tr("%1: out of resources").arg(function);
+ error = QSystemSemaphore::OutOfResources;
+ break;
+ case ENAMETOOLONG:
+ errorString = QSystemSemaphore::tr("%1: key too long").arg(function);
+ error = QSystemSemaphore::KeyError;
+ break;
+ default:
+ errorString = QSystemSemaphore::tr("%1: unknown error: %2")
+ .arg(function, qt_error_string(errno));
+ error = QSystemSemaphore::UnknownError;
+#if defined QSYSTEMSEMAPHORE_DEBUG
+ qDebug() << errorString << "key" << key << "errno" << errno << EINVAL;
+#endif
+ }
+}
+
+bool QSystemSemaphore::isKeyTypeSupported(QNativeIpcKey::Type type)
+{
+ if (!isIpcSupported(IpcType::SystemSemaphore, type))
+ return false;
+ using Variant = decltype(QSystemSemaphorePrivate::backend);
+ return Variant::staticVisit(type, [](auto ptr) {
+ using Impl = std::decay_t<decltype(*ptr)>;
+ return Impl::runtimeSupportCheck();
+ });
+}
+
+QNativeIpcKey QSystemSemaphore::platformSafeKey(const QString &key, QNativeIpcKey::Type type)
+{
+ return QtIpcCommon::platformSafeKey(key, IpcType::SystemSemaphore, type);
+}
+
+QNativeIpcKey QSystemSemaphore::legacyNativeKey(const QString &key, QNativeIpcKey::Type type)
+{
+ return QtIpcCommon::legacyPlatformSafeKey(key, IpcType::SystemSemaphore, type);
+}
QT_END_NAMESPACE
+
+#include "moc_qsystemsemaphore.cpp"
+
+#endif // QT_CONFIG(systemsemaphore)
diff --git a/src/corelib/ipc/qsystemsemaphore.h b/src/corelib/ipc/qsystemsemaphore.h
new file mode 100644
index 0000000000..df6fd28342
--- /dev/null
+++ b/src/corelib/ipc/qsystemsemaphore.h
@@ -0,0 +1,75 @@
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QSYSTEMSEMAPHORE_H
+#define QSYSTEMSEMAPHORE_H
+
+#include <QtCore/qcoreapplication.h>
+#include <QtCore/qtipccommon.h>
+#include <QtCore/qstring.h>
+#include <QtCore/qscopedpointer.h>
+
+QT_BEGIN_NAMESPACE
+
+#if QT_CONFIG(systemsemaphore)
+
+class QSystemSemaphorePrivate;
+
+class Q_CORE_EXPORT QSystemSemaphore
+{
+ Q_GADGET
+ Q_DECLARE_TR_FUNCTIONS(QSystemSemaphore)
+public:
+ enum AccessMode
+ {
+ Open,
+ Create
+ };
+ Q_ENUM(AccessMode)
+
+ enum SystemSemaphoreError
+ {
+ NoError,
+ PermissionDenied,
+ KeyError,
+ AlreadyExists,
+ NotFound,
+ OutOfResources,
+ UnknownError
+ };
+
+ QSystemSemaphore(const QNativeIpcKey &key, int initialValue = 0, AccessMode = Open);
+ ~QSystemSemaphore();
+
+ void setNativeKey(const QNativeIpcKey &key, int initialValue = 0, AccessMode = Open);
+ void setNativeKey(const QString &key, int initialValue = 0, AccessMode mode = Open,
+ QNativeIpcKey::Type type = QNativeIpcKey::legacyDefaultTypeForOs())
+ { setNativeKey({ key, type }, initialValue, mode); }
+ QNativeIpcKey nativeIpcKey() const;
+
+ QSystemSemaphore(const QString &key, int initialValue = 0, AccessMode mode = Open);
+ void setKey(const QString &key, int initialValue = 0, AccessMode mode = Open);
+ QString key() const;
+
+ bool acquire();
+ bool release(int n = 1);
+
+ SystemSemaphoreError error() const;
+ QString errorString() const;
+
+ static bool isKeyTypeSupported(QNativeIpcKey::Type type) Q_DECL_CONST_FUNCTION;
+ static QNativeIpcKey platformSafeKey(const QString &key,
+ QNativeIpcKey::Type type = QNativeIpcKey::DefaultTypeForOs);
+ static QNativeIpcKey legacyNativeKey(const QString &key,
+ QNativeIpcKey::Type type = QNativeIpcKey::legacyDefaultTypeForOs());
+
+private:
+ Q_DISABLE_COPY(QSystemSemaphore)
+ QScopedPointer<QSystemSemaphorePrivate> d;
+};
+
+#endif // QT_CONFIG(systemsemaphore)
+
+QT_END_NAMESPACE
+
+#endif // QSYSTEMSEMAPHORE_H
diff --git a/src/corelib/ipc/qsystemsemaphore_p.h b/src/corelib/ipc/qsystemsemaphore_p.h
new file mode 100644
index 0000000000..788c4fb784
--- /dev/null
+++ b/src/corelib/ipc/qsystemsemaphore_p.h
@@ -0,0 +1,152 @@
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2022 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QSYSTEMSEMAPHORE_P_H
+#define QSYSTEMSEMAPHORE_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include "qsystemsemaphore.h"
+
+#if QT_CONFIG(systemsemaphore)
+
+#include "qcoreapplication.h"
+#include "qtipccommon_p.h"
+#include "private/qtcore-config_p.h"
+
+#include <sys/types.h>
+#if QT_CONFIG(posix_sem)
+# include <semaphore.h>
+#endif
+#ifndef SEM_FAILED
+# define SEM_FAILED nullptr
+struct sem_t;
+#endif
+#if QT_CONFIG(sysv_sem)
+# include <sys/sem.h>
+#endif
+
+QT_BEGIN_NAMESPACE
+
+class QSystemSemaphorePrivate;
+
+struct QSystemSemaphorePosix
+{
+ static constexpr bool Enabled = QT_CONFIG(posix_sem);
+ static bool supports(QNativeIpcKey::Type type)
+ { return type == QNativeIpcKey::Type::PosixRealtime; }
+ static bool runtimeSupportCheck();
+
+ bool handle(QSystemSemaphorePrivate *self, QSystemSemaphore::AccessMode mode);
+ void cleanHandle(QSystemSemaphorePrivate *self);
+ bool modifySemaphore(QSystemSemaphorePrivate *self, int count);
+
+ sem_t *semaphore = SEM_FAILED;
+ bool createdSemaphore = false;
+};
+
+struct QSystemSemaphoreSystemV
+{
+ static constexpr bool Enabled = QT_CONFIG(sysv_sem);
+ static bool supports(QNativeIpcKey::Type type)
+ { return quint16(type) <= 0xff; }
+ static bool runtimeSupportCheck();
+
+#if QT_CONFIG(sysv_sem)
+ key_t handle(QSystemSemaphorePrivate *self, QSystemSemaphore::AccessMode mode);
+ void cleanHandle(QSystemSemaphorePrivate *self);
+ bool modifySemaphore(QSystemSemaphorePrivate *self, int count);
+
+ QByteArray nativeKeyFile;
+ key_t unix_key = -1;
+ int semaphore = -1;
+ bool createdFile = false;
+ bool createdSemaphore = false;
+#endif
+};
+
+struct QSystemSemaphoreWin32
+{
+#ifdef Q_OS_WIN32
+ static constexpr bool Enabled = true;
+#else
+ static constexpr bool Enabled = false;
+#endif
+ static bool supports(QNativeIpcKey::Type type)
+ { return type == QNativeIpcKey::Type::Windows; }
+ static bool runtimeSupportCheck() { return Enabled; }
+
+ // we can declare the members without the #if
+ Qt::HANDLE handle(QSystemSemaphorePrivate *self, QSystemSemaphore::AccessMode mode);
+ void cleanHandle(QSystemSemaphorePrivate *self);
+ bool modifySemaphore(QSystemSemaphorePrivate *self, int count);
+
+ Qt::HANDLE semaphore = nullptr;
+};
+
+class QSystemSemaphorePrivate
+{
+public:
+ QSystemSemaphorePrivate(QNativeIpcKey::Type type) : nativeKey(type)
+ { constructBackend(); }
+ ~QSystemSemaphorePrivate() { destructBackend(); }
+
+ void setWindowsErrorString(QLatin1StringView function); // Windows only
+ void setUnixErrorString(QLatin1StringView function);
+ inline void setError(QSystemSemaphore::SystemSemaphoreError e, const QString &message)
+ { error = e; errorString = message; }
+ inline void clearError()
+ { setError(QSystemSemaphore::NoError, QString()); }
+
+ QNativeIpcKey nativeKey;
+ QString errorString;
+ int initialValue;
+ QSystemSemaphore::SystemSemaphoreError error = QSystemSemaphore::NoError;
+
+ union Backend {
+ Backend() {}
+ ~Backend() {}
+ QSystemSemaphorePosix posix;
+ QSystemSemaphoreSystemV sysv;
+ QSystemSemaphoreWin32 win32;
+ };
+ QtIpcCommon::IpcStorageVariant<&Backend::posix, &Backend::sysv, &Backend::win32> backend;
+
+ void constructBackend();
+ void destructBackend();
+
+ template <typename Lambda> auto visit(const Lambda &lambda)
+ {
+ return backend.visit(nativeKey.type(), lambda);
+ }
+
+ void handle(QSystemSemaphore::AccessMode mode)
+ {
+ visit([&](auto p) { p->handle(this, mode); });
+ }
+ void cleanHandle()
+ {
+ visit([&](auto p) { p->cleanHandle(this); });
+ }
+ bool modifySemaphore(int count)
+ {
+ return visit([&](auto p) { return p->modifySemaphore(this, count); });
+ }
+};
+
+QT_END_NAMESPACE
+
+#endif // QT_CONFIG(systemsemaphore)
+
+#endif // QSYSTEMSEMAPHORE_P_H
+
diff --git a/src/corelib/ipc/qsystemsemaphore_posix.cpp b/src/corelib/ipc/qsystemsemaphore_posix.cpp
new file mode 100644
index 0000000000..7df9593513
--- /dev/null
+++ b/src/corelib/ipc/qsystemsemaphore_posix.cpp
@@ -0,0 +1,171 @@
+// Copyright (C) 2015 Konstantin Ritt <ritt.ks@gmail.com>
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2015 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Tobias Koenig <tobias.koenig@kdab.com>
+// Copyright (C) 2022 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#include "qsystemsemaphore.h"
+#include "qsystemsemaphore_p.h"
+
+#include <qdebug.h>
+#include <qfile.h>
+#include <qcoreapplication.h>
+
+#if QT_CONFIG(posix_sem)
+
+#include <sys/types.h>
+#include <fcntl.h>
+#include <errno.h>
+
+#ifdef Q_OS_UNIX
+# include "private/qcore_unix_p.h"
+#else
+# define QT_EINTR_LOOP_VAL(var, val, cmd) \
+ (void)var; var = cmd
+# define QT_EINTR_LOOP(var, cmd) QT_EINTR_LOOP_VAL(var, -1, cmd)
+#endif
+
+// OpenBSD 4.2 doesn't define EIDRM, see BUGS section:
+// http://www.openbsd.org/cgi-bin/man.cgi?query=semop&manpath=OpenBSD+4.2
+#if defined(Q_OS_OPENBSD) && !defined(EIDRM)
+#define EIDRM EINVAL
+#endif
+
+QT_BEGIN_NAMESPACE
+
+using namespace Qt::StringLiterals;
+
+bool QSystemSemaphorePosix::runtimeSupportCheck()
+{
+ static const bool result = []() {
+ sem_open("/", 0, 0, 0); // this WILL fail
+ return errno != ENOSYS;
+ }();
+ return result;
+}
+
+bool QSystemSemaphorePosix::handle(QSystemSemaphorePrivate *self, QSystemSemaphore::AccessMode mode)
+{
+ if (semaphore != SEM_FAILED)
+ return true; // we already have a semaphore
+
+ const QByteArray semName = QFile::encodeName(self->nativeKey.nativeKey());
+ if (semName.isEmpty()) {
+ self->setError(QSystemSemaphore::KeyError,
+ QSystemSemaphore::tr("%1: key is empty")
+ .arg("QSystemSemaphore::handle"_L1));
+ return false;
+ }
+
+ // Always try with O_EXCL so we know whether we created the semaphore.
+ int oflag = O_CREAT | O_EXCL;
+ for (int tryNum = 0, maxTries = 1; tryNum < maxTries; ++tryNum) {
+ do {
+ semaphore = ::sem_open(semName.constData(), oflag, 0600, self->initialValue);
+ } while (semaphore == SEM_FAILED && errno == EINTR);
+ if (semaphore == SEM_FAILED && errno == EEXIST) {
+ if (mode == QSystemSemaphore::Create) {
+ if (::sem_unlink(semName.constData()) == -1 && errno != ENOENT) {
+ self->setUnixErrorString("QSystemSemaphore::handle (sem_unlink)"_L1);
+ return false;
+ }
+ // Race condition: the semaphore might be recreated before
+ // we call sem_open again, so we'll retry several times.
+ maxTries = 3;
+ } else {
+ // Race condition: if it no longer exists at the next sem_open
+ // call, we won't realize we created it, so we'll leak it later.
+ oflag &= ~O_EXCL;
+ maxTries = 2;
+ }
+ } else {
+ break;
+ }
+ }
+
+ if (semaphore == SEM_FAILED) {
+ self->setUnixErrorString("QSystemSemaphore::handle"_L1);
+ return false;
+ }
+
+ createdSemaphore = (oflag & O_EXCL) != 0;
+
+ return true;
+}
+
+void QSystemSemaphorePosix::cleanHandle(QSystemSemaphorePrivate *self)
+{
+ if (semaphore != SEM_FAILED) {
+ if (::sem_close(semaphore) == -1) {
+ self->setUnixErrorString("QSystemSemaphore::cleanHandle (sem_close)"_L1);
+#if defined QSYSTEMSEMAPHORE_DEBUG
+ qDebug("QSystemSemaphore::cleanHandle sem_close failed.");
+#endif
+ }
+ semaphore = SEM_FAILED;
+ }
+
+ if (createdSemaphore) {
+ const QByteArray semName = QFile::encodeName(self->nativeKey.nativeKey());
+ if (::sem_unlink(semName) == -1 && errno != ENOENT) {
+ self->setUnixErrorString("QSystemSemaphore::cleanHandle (sem_unlink)"_L1);
+#if defined QSYSTEMSEMAPHORE_DEBUG
+ qDebug("QSystemSemaphorePosix::cleanHandle sem_unlink failed.");
+#endif
+ }
+ createdSemaphore = false;
+ }
+}
+
+bool QSystemSemaphorePosix::modifySemaphore(QSystemSemaphorePrivate *self, int count)
+{
+ if (!handle(self, QSystemSemaphore::Open))
+ return false;
+
+ if (count > 0) {
+ int cnt = count;
+ do {
+ if (::sem_post(semaphore) == -1) {
+#if defined(Q_OS_VXWORKS)
+ if (errno == EINVAL) {
+ semaphore = SEM_FAILED;
+ return modifySemaphore(self, cnt);
+ }
+#endif
+ self->setUnixErrorString("QSystemSemaphore::modifySemaphore (sem_post)"_L1);
+#if defined QSYSTEMSEMAPHORE_DEBUG
+ qDebug("QSystemSemaphorePosix::modify sem_post failed %d %d", count, errno);
+#endif
+ // rollback changes to preserve the SysV semaphore behavior
+ for ( ; cnt < count; ++cnt) {
+ int res;
+ QT_EINTR_LOOP(res, ::sem_wait(semaphore));
+ }
+ return false;
+ }
+ --cnt;
+ } while (cnt > 0);
+ } else {
+ int res;
+ QT_EINTR_LOOP(res, ::sem_wait(semaphore));
+ if (res == -1) {
+ // If the semaphore was removed be nice and create it and then modifySemaphore again
+ if (errno == EINVAL || errno == EIDRM) {
+ semaphore = SEM_FAILED;
+ return modifySemaphore(self, count);
+ }
+ self->setUnixErrorString("QSystemSemaphore::modifySemaphore (sem_wait)"_L1);
+#if defined QSYSTEMSEMAPHORE_DEBUG
+ qDebug("QSystemSemaphorePosix::modify sem_wait failed %d %d", count, errno);
+#endif
+ return false;
+ }
+ }
+
+ self->clearError();
+ return true;
+}
+
+QT_END_NAMESPACE
+
+#endif // QT_CONFIG(posix_sem)
diff --git a/src/corelib/ipc/qsystemsemaphore_systemv.cpp b/src/corelib/ipc/qsystemsemaphore_systemv.cpp
new file mode 100644
index 0000000000..e5d231d1d4
--- /dev/null
+++ b/src/corelib/ipc/qsystemsemaphore_systemv.cpp
@@ -0,0 +1,201 @@
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2022 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#include "qsystemsemaphore.h"
+#include "qsystemsemaphore_p.h"
+
+#include <qdebug.h>
+#include <qfile.h>
+#include <qcoreapplication.h>
+
+#if QT_CONFIG(sysv_sem)
+
+#include <sys/types.h>
+#include <sys/ipc.h>
+#include <sys/sem.h>
+#include <fcntl.h>
+#include <errno.h>
+
+#if defined(Q_OS_DARWIN)
+#include "private/qcore_mac_p.h"
+#endif
+
+#include "private/qcore_unix_p.h"
+
+// OpenBSD 4.2 doesn't define EIDRM, see BUGS section:
+// http://www.openbsd.org/cgi-bin/man.cgi?query=semop&manpath=OpenBSD+4.2
+#if defined(Q_OS_OPENBSD) && !defined(EIDRM)
+#define EIDRM EINVAL
+#endif
+
+QT_BEGIN_NAMESPACE
+
+using namespace Qt::StringLiterals;
+
+bool QSystemSemaphoreSystemV::runtimeSupportCheck()
+{
+#if defined(Q_OS_DARWIN)
+ if (qt_apple_isSandboxed())
+ return false;
+#endif
+ static const bool result = []() {
+ (void)semget(IPC_PRIVATE, -1, 0); // this will fail
+ return errno != ENOSYS;
+ }();
+ return result;
+}
+
+/*!
+ \internal
+
+ Setup unix_key
+ */
+key_t QSystemSemaphoreSystemV::handle(QSystemSemaphorePrivate *self, QSystemSemaphore::AccessMode mode)
+{
+ if (unix_key != -1)
+ return unix_key; // we already have a semaphore
+
+#if defined(Q_OS_DARWIN)
+ if (qt_apple_isSandboxed()) {
+ // attempting to use System V semaphores will get us a SIGSYS
+ self->setError(QSystemSemaphore::PermissionDenied,
+ QSystemSemaphore::tr("%1: System V semaphores are not available for "
+ "sandboxed applications. Please build Qt with "
+ "-feature-ipc_posix")
+ .arg("QSystemSemaphore::handle:"_L1));
+ return -1;
+ }
+#endif
+
+ nativeKeyFile = QFile::encodeName(self->nativeKey.nativeKey());
+ if (nativeKeyFile.isEmpty()) {
+ self->setError(QSystemSemaphore::KeyError,
+ QSystemSemaphore::tr("%1: key is empty")
+ .arg("QSystemSemaphore::handle:"_L1));
+ return -1;
+ }
+
+ // ftok requires that an actual file exists somewhere
+ int built = QtIpcCommon::createUnixKeyFile(nativeKeyFile);
+ if (-1 == built) {
+ self->setError(QSystemSemaphore::KeyError,
+ QSystemSemaphore::tr("%1: unable to make key")
+ .arg("QSystemSemaphore::handle:"_L1));
+
+ return -1;
+ }
+ createdFile = (1 == built);
+
+ // Get the unix key for the created file
+ unix_key = ftok(nativeKeyFile, int(self->nativeKey.type()));
+ if (-1 == unix_key) {
+ self->setError(QSystemSemaphore::KeyError,
+ QSystemSemaphore::tr("%1: ftok failed")
+ .arg("QSystemSemaphore::handle:"_L1));
+ return -1;
+ }
+
+ // Get semaphore
+ semaphore = semget(unix_key, 1, 0600 | IPC_CREAT | IPC_EXCL);
+ if (-1 == semaphore) {
+ if (errno == EEXIST)
+ semaphore = semget(unix_key, 1, 0600 | IPC_CREAT);
+ if (-1 == semaphore) {
+ self->setUnixErrorString("QSystemSemaphore::handle"_L1);
+ cleanHandle(self);
+ return -1;
+ }
+ } else {
+ createdSemaphore = true;
+ // Force cleanup of file, it is possible that it can be left over from a crash
+ createdFile = true;
+ }
+
+ if (mode == QSystemSemaphore::Create) {
+ createdSemaphore = true;
+ createdFile = true;
+ }
+
+ // Created semaphore so initialize its value.
+ if (createdSemaphore && self->initialValue >= 0) {
+ qt_semun init_op;
+ init_op.val = self->initialValue;
+ if (-1 == semctl(semaphore, 0, SETVAL, init_op)) {
+ self->setUnixErrorString("QSystemSemaphore::handle"_L1);
+ cleanHandle(self);
+ return -1;
+ }
+ }
+
+ return unix_key;
+}
+
+/*!
+ \internal
+
+ Cleanup the unix_key
+ */
+void QSystemSemaphoreSystemV::cleanHandle(QSystemSemaphorePrivate *self)
+{
+ unix_key = -1;
+
+ // remove the file if we made it
+ if (createdFile) {
+ unlink(nativeKeyFile.constData());
+ createdFile = false;
+ }
+
+ if (createdSemaphore) {
+ if (-1 != semaphore) {
+ if (-1 == semctl(semaphore, 0, IPC_RMID, 0)) {
+ self->setUnixErrorString("QSystemSemaphore::cleanHandle"_L1);
+#if defined QSYSTEMSEMAPHORE_DEBUG
+ qDebug("QSystemSemaphoreSystemV::cleanHandle semctl failed.");
+#endif
+ }
+ semaphore = -1;
+ }
+ createdSemaphore = false;
+ }
+}
+
+/*!
+ \internal
+ */
+bool QSystemSemaphoreSystemV::modifySemaphore(QSystemSemaphorePrivate *self, int count)
+{
+ if (handle(self, QSystemSemaphore::Open) == -1)
+ return false;
+
+ struct sembuf operation;
+ operation.sem_num = 0;
+ operation.sem_op = count;
+ operation.sem_flg = SEM_UNDO;
+
+ int res;
+ QT_EINTR_LOOP(res, semop(semaphore, &operation, 1));
+ if (-1 == res) {
+ // If the semaphore was removed be nice and create it and then modifySemaphore again
+ if (errno == EINVAL || errno == EIDRM) {
+ semaphore = -1;
+ cleanHandle(self);
+ handle(self, QSystemSemaphore::Open);
+ return modifySemaphore(self, count);
+ }
+ self->setUnixErrorString("QSystemSemaphore::modifySemaphore"_L1);
+#if defined QSYSTEMSEMAPHORE_DEBUG
+ qDebug("QSystemSemaphoreSystemV::modify failed %d %d %d %d %d",
+ count, int(semctl(semaphore, 0, GETVAL)), int(errno), int(EIDRM), int(EINVAL);
+#endif
+ return false;
+ }
+
+ self->clearError();
+ return true;
+}
+
+
+QT_END_NAMESPACE
+
+#endif // QT_CONFIG(sysv_sem)
diff --git a/src/corelib/ipc/qsystemsemaphore_win.cpp b/src/corelib/ipc/qsystemsemaphore_win.cpp
new file mode 100644
index 0000000000..f42fecf71f
--- /dev/null
+++ b/src/corelib/ipc/qsystemsemaphore_win.cpp
@@ -0,0 +1,98 @@
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#include "qsystemsemaphore.h"
+#include "qsystemsemaphore_p.h"
+#include "qcoreapplication.h"
+#include <qdebug.h>
+#include <qt_windows.h>
+
+QT_BEGIN_NAMESPACE
+
+using namespace Qt::StringLiterals;
+
+#if QT_CONFIG(systemsemaphore)
+
+void QSystemSemaphorePrivate::setWindowsErrorString(QLatin1StringView function)
+{
+ BOOL windowsError = GetLastError();
+ if (windowsError == 0)
+ return;
+
+ switch (windowsError) {
+ case ERROR_NO_SYSTEM_RESOURCES:
+ case ERROR_NOT_ENOUGH_MEMORY:
+ error = QSystemSemaphore::OutOfResources;
+ errorString = QCoreApplication::translate("QSystemSemaphore", "%1: out of resources").arg(function);
+ break;
+ case ERROR_ACCESS_DENIED:
+ error = QSystemSemaphore::PermissionDenied;
+ errorString = QCoreApplication::translate("QSystemSemaphore", "%1: permission denied").arg(function);
+ break;
+ default:
+ errorString = QCoreApplication::translate("QSystemSemaphore", "%1: unknown error: %2")
+ .arg(function, qt_error_string(windowsError));
+ error = QSystemSemaphore::UnknownError;
+#if defined QSYSTEMSEMAPHORE_DEBUG
+ qDebug() << errorString << "key" << key;
+#endif
+ }
+}
+
+HANDLE QSystemSemaphoreWin32::handle(QSystemSemaphorePrivate *self, QSystemSemaphore::AccessMode)
+{
+ // don't allow making handles on empty keys
+ if (self->nativeKey.isEmpty())
+ return 0;
+
+ // Create it if it doesn't already exists.
+ if (semaphore == 0) {
+ semaphore = CreateSemaphore(0, self->initialValue, MAXLONG,
+ reinterpret_cast<const wchar_t*>(self->nativeKey.nativeKey().utf16()));
+ if (semaphore == NULL)
+ self->setWindowsErrorString("QSystemSemaphore::handle"_L1);
+ }
+
+ return semaphore;
+}
+
+void QSystemSemaphoreWin32::cleanHandle(QSystemSemaphorePrivate *)
+{
+ if (semaphore && !CloseHandle(semaphore)) {
+#if defined QSYSTEMSEMAPHORE_DEBUG
+ qDebug("QSystemSemaphoreWin32::CloseHandle: sem failed");
+#endif
+ }
+ semaphore = 0;
+}
+
+bool QSystemSemaphoreWin32::modifySemaphore(QSystemSemaphorePrivate *self, int count)
+{
+ if (handle(self, QSystemSemaphore::Open) == nullptr)
+ return false;
+
+ if (count > 0) {
+ if (0 == ReleaseSemaphore(semaphore, count, 0)) {
+ self->setWindowsErrorString("QSystemSemaphore::modifySemaphore"_L1);
+#if defined QSYSTEMSEMAPHORE_DEBUG
+ qDebug("QSystemSemaphore::modifySemaphore ReleaseSemaphore failed");
+#endif
+ return false;
+ }
+ } else {
+ if (WAIT_OBJECT_0 != WaitForSingleObjectEx(semaphore, INFINITE, FALSE)) {
+ self->setWindowsErrorString("QSystemSemaphore::modifySemaphore"_L1);
+#if defined QSYSTEMSEMAPHORE_DEBUG
+ qDebug("QSystemSemaphore::modifySemaphore WaitForSingleObject failed");
+#endif
+ return false;
+ }
+ }
+
+ self->clearError();
+ return true;
+}
+
+#endif // QT_CONFIG(systemsemaphore)
+
+QT_END_NAMESPACE
diff --git a/src/corelib/ipc/qtipccommon.cpp b/src/corelib/ipc/qtipccommon.cpp
new file mode 100644
index 0000000000..b2ae9172fa
--- /dev/null
+++ b/src/corelib/ipc/qtipccommon.cpp
@@ -0,0 +1,610 @@
+// Copyright (C) 2022 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#include "qtipccommon.h"
+#include "qtipccommon_p.h"
+
+#include <qcryptographichash.h>
+#include <qstandardpaths.h>
+#include <qstringconverter.h>
+#include <qurl.h>
+#include <qurlquery.h>
+
+#if defined(Q_OS_DARWIN)
+# include "private/qcore_mac_p.h"
+# if !defined(SHM_NAME_MAX)
+ // Based on PSEMNAMLEN in XNU's posix_sem.c, which would
+ // indicate the max length is 31, _excluding_ the zero
+ // terminator. But in practice (possibly due to an off-
+ // by-one bug in the kernel) the usable bytes are only 30.
+# define SHM_NAME_MAX 30
+# endif
+#elif defined(Q_OS_WINDOWS)
+# include "qt_windows.h"
+#endif
+
+#if QT_CONFIG(sharedmemory) || QT_CONFIG(systemsemaphore)
+
+QT_BEGIN_NAMESPACE
+
+using namespace Qt::StringLiterals;
+
+static QStringView staticTypeToString(QNativeIpcKey::Type type)
+{
+ switch (type) {
+ case QNativeIpcKey::Type::SystemV:
+ return u"systemv";
+ case QNativeIpcKey::Type::PosixRealtime:
+ return u"posix";
+ case QNativeIpcKey::Type::Windows:
+ return u"windows";
+ }
+ return {};
+}
+
+static QString typeToString(QNativeIpcKey::Type type)
+{
+ QStringView typeString = staticTypeToString(type);
+ switch (type) {
+ case QNativeIpcKey::Type::SystemV:
+ case QNativeIpcKey::Type::PosixRealtime:
+ case QNativeIpcKey::Type::Windows:
+ return QString::fromRawData(typeString.constData(), typeString.size());
+ }
+
+ int value = int(type);
+ if (value >= 1 && value <= 0xff) {
+ // System V key with id different from 'Q'
+ typeString = staticTypeToString(QNativeIpcKey::Type::SystemV);
+ return typeString + QString::number(-value); // negative so it prepends a dash
+ }
+
+ return QString(); // invalid!
+}
+
+static QNativeIpcKey::Type stringToType(QStringView typeString)
+{
+ if (typeString == staticTypeToString(QNativeIpcKey::Type::PosixRealtime))
+ return QNativeIpcKey::Type::PosixRealtime;
+ if (typeString == staticTypeToString(QNativeIpcKey::Type::Windows))
+ return QNativeIpcKey::Type::Windows;
+
+ auto fromNumber = [](QStringView number, int low, int high) {
+ bool ok;
+ int n = -number.toInt(&ok, 10);
+ if (!ok || n < low || n > high)
+ return QNativeIpcKey::Type{};
+ return QNativeIpcKey::Type(n);
+ };
+
+ QStringView sysv = staticTypeToString(QNativeIpcKey::Type::SystemV);
+ if (typeString.startsWith(sysv)) {
+ if (typeString.size() == sysv.size())
+ return QNativeIpcKey::Type::SystemV;
+ return fromNumber(typeString.sliced(sysv.size()), 1, 0xff);
+ }
+
+ // invalid!
+ return QNativeIpcKey::Type{};
+}
+
+/*!
+ \internal
+
+ Legacy: this exists for compatibility with QSharedMemory and
+ QSystemSemaphore between 4.4 and 6.6.
+
+ Returns a QNativeIpcKey that contains a platform-safe key using rules
+ similar to QtIpcCommon::platformSafeKey() below, but using an algorithm
+ that is compatible with Qt 4.4 to 6.6. Additionally, the returned
+ QNativeIpcKey will record the input \a key so it can be included in the
+ string form if necessary to pass to other processes.
+*/
+QNativeIpcKey QtIpcCommon::legacyPlatformSafeKey(const QString &key, QtIpcCommon::IpcType ipcType,
+ QNativeIpcKey::Type type)
+{
+ QNativeIpcKey k(type);
+ if (key.isEmpty())
+ return k;
+
+ QByteArray hex = QCryptographicHash::hash(key.toUtf8(), QCryptographicHash::Sha1).toHex();
+
+ if (type == QNativeIpcKey::Type::PosixRealtime) {
+#if defined(Q_OS_DARWIN)
+ if (qt_apple_isSandboxed()) {
+ // Sandboxed applications on Apple platforms require the shared memory name
+ // to be in the form <application group identifier>/<custom identifier>.
+ // Since we don't know which application group identifier the user wants
+ // to apply, we instead document that requirement, and use the key directly.
+ QNativeIpcKeyPrivate::setNativeAndLegacyKeys(k, key, key);
+ } else {
+ // The shared memory name limit on Apple platforms is very low (30 characters),
+ // so we can't use the logic below of combining the prefix, key, and a hash,
+ // to ensure a unique and valid name. Instead we use the first part of the
+ // hash, which should still long enough to avoid collisions in practice.
+ QString native = u'/' + QLatin1StringView(hex).left(SHM_NAME_MAX - 1);
+ QNativeIpcKeyPrivate::setNativeAndLegacyKeys(k, native, key);
+ }
+ return k;
+#endif
+ }
+
+ QString result;
+ result.reserve(1 + 18 + key.size() + 40);
+ switch (ipcType) {
+ case IpcType::SharedMemory:
+ result += "qipc_sharedmemory_"_L1;
+ break;
+ case IpcType::SystemSemaphore:
+ result += "qipc_systemsem_"_L1;
+ break;
+ }
+
+ for (QChar ch : key) {
+ if ((ch >= u'a' && ch <= u'z') ||
+ (ch >= u'A' && ch <= u'Z'))
+ result += ch;
+ }
+ result.append(QLatin1StringView(hex));
+
+ switch (type) {
+ case QNativeIpcKey::Type::Windows:
+ if (isIpcSupported(ipcType, QNativeIpcKey::Type::Windows))
+ QNativeIpcKeyPrivate::setNativeAndLegacyKeys(k, result, key);
+ return k;
+ case QNativeIpcKey::Type::PosixRealtime:
+ result.prepend(u'/');
+ if (isIpcSupported(ipcType, QNativeIpcKey::Type::PosixRealtime))
+ QNativeIpcKeyPrivate::setNativeAndLegacyKeys(k, result, key);
+ return k;
+ case QNativeIpcKey::Type::SystemV:
+ break;
+ }
+ if (isIpcSupported(ipcType, QNativeIpcKey::Type::SystemV)) {
+ result = QStandardPaths::writableLocation(QStandardPaths::TempLocation) + u'/' + result;
+ QNativeIpcKeyPrivate::setNativeAndLegacyKeys(k, result, key);
+ }
+ return k;
+}
+
+/*!
+ \internal
+ Returns a QNativeIpcKey of type \a type, suitable for QSystemSemaphore or
+ QSharedMemory depending on \a ipcType. The returned native key is generated
+ from the Unicode input \a key and is safe for use on for the key type in
+ question in the current OS.
+*/
+QNativeIpcKey QtIpcCommon::platformSafeKey(const QString &key, QtIpcCommon::IpcType ipcType,
+ QNativeIpcKey::Type type)
+{
+ QNativeIpcKey k(type);
+ if (key.isEmpty())
+ return k;
+
+ switch (type) {
+ case QNativeIpcKey::Type::PosixRealtime:
+ if (isIpcSupported(ipcType, QNativeIpcKey::Type::PosixRealtime)) {
+#ifdef SHM_NAME_MAX
+ // The shared memory name limit on Apple platforms is very low (30
+ // characters), so we have to cut it down to avoid ENAMETOOLONG. We
+ // hope that there won't be too many collisions...
+ k.setNativeKey(u'/' + QStringView(key).left(SHM_NAME_MAX - 1));
+#else
+ k.setNativeKey(u'/' + key);
+#endif
+ }
+ return k;
+
+ case QNativeIpcKey::Type::Windows:
+ if (isIpcSupported(ipcType, QNativeIpcKey::Type::Windows)) {
+ QStringView prefix;
+ QStringView payload = key;
+ // see https://learn.microsoft.com/en-us/windows/win32/termserv/kernel-object-namespaces
+ for (QStringView candidate : { u"Local\\", u"Global\\" }) {
+ if (!key.startsWith(candidate))
+ continue;
+ prefix = candidate;
+ payload = payload.sliced(prefix.size());
+ break;
+ }
+
+ QStringView mid;
+ switch (ipcType) {
+ case IpcType::SharedMemory: mid = u"shm_"; break;
+ case IpcType::SystemSemaphore: mid = u"sem_"; break;
+ }
+
+ QString result = prefix + mid + payload;
+#ifdef Q_OS_WINDOWS
+ result.truncate(MAX_PATH);
+#endif
+ k.setNativeKey(result);
+ }
+ return k;
+
+ case QNativeIpcKey::Type::SystemV:
+ break;
+ }
+
+ // System V
+ if (isIpcSupported(ipcType, QNativeIpcKey::Type::SystemV)) {
+ if (key.startsWith(u'/')) {
+ k.setNativeKey(key);
+ } else {
+ QString baseDir = QStandardPaths::writableLocation(QStandardPaths::RuntimeLocation);
+ k.setNativeKey(baseDir + u'/' + key);
+ }
+ }
+ return k;
+}
+
+/*!
+ \class QNativeIpcKey
+ \inmodule QtCore
+ \since 6.6
+ \brief The QNativeIpcKey class holds a native key used by QSystemSemaphore and QSharedMemory.
+
+ \compares equality
+
+ The \l QSharedMemory and \l QSystemSemaphore classes identify their
+ resource using a system-wide identifier known as a "key". The low-level key
+ value as well as the key type are encapsulated in Qt using the \l
+ QNativeIpcKey class.
+
+ Those two classes also provide the means to create native keys from a
+ cross-platform identifier, using QSharedMemory::platformSafeKey() and
+ QSystemSemaphore::platformSafeKey(). Applications should never share the
+ input to those functions, as different versions of Qt may perform different
+ transformations, resulting in different native keys. Instead, the
+ application that created the IPC object should communicate the resulting
+ native key using the methods described below.
+
+ For details on the key types, platform-specific limitations, and
+ interoperability with older or non-Qt applications, see the \l{Native IPC
+ Keys} documentation. That includes important information for sandboxed
+ applications on Apple platforms, including all apps obtained via the Apple
+ App Store.
+
+ \section1 Communicating keys to other processes
+ \section2 Communicating keys to other Qt processes
+
+ If the other process supports QNativeIpcKey, the best way of communicating
+ is via the string representation obtained from toString() and parsing it
+ using fromString(). This representation can be stored on a file whose name
+ is well-known or passed on the command-line to a child process using
+ QProcess::setArguments().
+
+ If the other process does not support QNativeIpcKey, then the two processes
+ can exchange the nativeKey() but the older code is likely unable to adjust
+ its key type. The legacyDefaultTypeForOs() function returns the type that
+ legacy code used, which may not match the \l{DefaultTypeForOs} constant.
+ This is still true even if the old application is not using the same build
+ as the new one (for example, it is a Qt 5 application), provided the
+ options passed to the Qt configure script are the same.
+
+ \section2 Communicating keys to non-Qt processes
+
+ When communicating with non-Qt processes, the application must arrange to
+ obtain the key type the other process is using. This is important
+ particularly on Unix systems, where both \l PosixRealtime and \l SystemV
+ are common.
+
+ \section1 String representation of native keys
+
+ The format of the string representation of a QNativeIpcKey is meant to be
+ stable and therefore backwards and forwards compatible, provided the key
+ type is supported by the Qt version in question. That is to say, an older
+ Qt will fail to parse the string representation of a key type introduced
+ after it was released. However, successfully parsing a string
+ representation does not imply the Qt classes can successfully create an
+ object of that type; applications should verify support using
+ QSharedMemory::isKeyTypeSupported() and QSystemSemaphore::isKeyTypeSupported().
+
+ The format of the string representation is formed by two components,
+ separated by a colon (':'). The first component is the key type, described
+ in the table below. The second component is a type-specific payload, using
+ \l{QByteArray::fromPercentEncoding}{percent-encoding}. For all currently
+ supported key types, the decoded form is identical to the contents of the
+ nativeKey() field.
+
+ \table
+ \row \li Key type \li String representation
+ \row \li \l PosixRealtime \li \c "posix"
+ \row \li \l SystemV \li \c "systemv"
+ \row \li \l Windows \li \c "windows"
+ \row \li Non-standard SystemV \li \c "systemv-" followed by a decimal number
+ \endtable
+
+ This format resembles a URI and allows parsing using URI/URL-parsing
+ functions, such as \l QUrl. When parsed by such API, the key type will show
+ up as the \l{QUrl::scheme()}{scheme}, and the payload will be the
+ \l{QUrl::path()}{path}. Use of query or fragments is reserved.
+
+ \sa QSharedMemory, QSystemSemaphore
+*/
+
+/*!
+ \enum QNativeIpcKey::Type
+
+ This enum describes the backend type for the IPC object. For details on the
+ key types, see the \l{Native IPC Keys} documentation.
+
+ \value SystemV X/Open System Initiative (XSI) or System V (SVr4) API
+ \value PosixRealtime IEEE 1003.1b (POSIX.1b) API
+ \value Windows Win32 API
+
+ \sa setType(), type()
+*/
+
+/*!
+ \variable QNativeIpcKey::DefaultTypeForOs
+
+ This constant expression variable holds the default native IPC type for the
+ current OS. It will be Type::Windows for Windows systems and
+ Type::PosixRealtime elsewhere. Note that this constant is different from
+ what \l QSharedMemory and \l QSystemSemaphore defaulted to on the majority
+ of Unix systems prior to Qt 6.6; see legacyDefaultTypeForOs() for more
+ information.
+*/
+
+/*!
+ \fn QNativeIpcKey::legacyDefaultTypeForOs() noexcept
+
+ Returns the \l{Type} that corresponds to the native IPC key that
+ \l{QSharedMemory} and \l{QSystemSemaphore} used to use prior to Qt 6.6.
+ Applications and libraries that must retain compatibility with code using
+ either class that was compiled with Qt prior to version 6.6 can use this
+ function to determine what IPC type the other applications may be using.
+
+ Note that this function relies on Qt having been built with identical
+ configure-time options.
+*/
+#if defined(Q_OS_DARWIN)
+QNativeIpcKey::Type QNativeIpcKey::defaultTypeForOs_internal() noexcept
+{
+ if (qt_apple_isSandboxed())
+ return Type::PosixRealtime;
+ return Type::SystemV;
+}
+#endif
+
+/*!
+ \fn QNativeIpcKey::QNativeIpcKey() noexcept
+
+ Constructs a QNativeIpcKey object of type \l DefaultTypeForOs with an empty key.
+*/
+
+/*!
+ \fn QNativeIpcKey::QNativeIpcKey(Type type) noexcept
+ \fn QNativeIpcKey::QNativeIpcKey(const QString &key, Type type)
+
+ Constructs a QNativeIpcKey object holding native key \a key (or empty on
+ the overload without the parameter) for type \a type.
+*/
+
+/*!
+ \fn QNativeIpcKey::QNativeIpcKey(const QNativeIpcKey &other)
+ \fn QNativeIpcKey::QNativeIpcKey(QNativeIpcKey &&other) noexcept
+ \fn QNativeIpcKey &QNativeIpcKey::operator=(const QNativeIpcKey &other)
+ \fn QNativeIpcKey &QNativeIpcKey::operator=(QNativeIpcKey &&other) noexcept
+
+ Copies or moves the content of \a other.
+*/
+void QNativeIpcKey::copy_internal(const QNativeIpcKey &other)
+{
+ d = new QNativeIpcKeyPrivate(*other.d);
+}
+
+void QNativeIpcKey::move_internal(QNativeIpcKey &&) noexcept
+{
+ // inline code already moved properly, nothing for us to do here
+}
+
+QNativeIpcKey &QNativeIpcKey::assign_internal(const QNativeIpcKey &other)
+{
+ Q_ASSERT(d || other.d); // only 3 cases to handle
+ if (d && !other.d)
+ *d = {};
+ else if (d)
+ *d = *other.d;
+ else
+ d = new QNativeIpcKeyPrivate(*other.d);
+ return *this;
+}
+
+/*!
+ \fn QNativeIpcKey::~QNativeIpcKey()
+
+ Disposes of this QNativeIpcKey object.
+*/
+void QNativeIpcKey::destroy_internal() noexcept
+{
+ delete d;
+}
+
+/*!
+ \fn QNativeIpcKey::swap(QNativeIpcKey &other) noexcept
+
+ Swaps the native IPC key and type \a other with this object.
+ This operation is very fast and never fails.
+*/
+
+/*!
+ \fn swap(QNativeIpcKey &value1, QNativeIpcKey &value2) noexcept
+ \relates QNativeIpcKey
+
+ Swaps the native IPC key and type \a value1 with \a value2.
+ This operation is very fast and never fails.
+*/
+
+/*!
+ \fn QNativeIpcKey::isEmpty() const
+
+ Returns true if the nativeKey() is empty.
+
+ \sa nativeKey()
+*/
+
+/*!
+ \fn QNativeIpcKey::isValid() const
+
+ Returns true if this object contains a valid native IPC key type. Invalid
+ types are usually the result of a failure to parse a string representation
+ using fromString().
+
+ This function performs no check on the whether the key string is actually
+ supported or valid for the current operating system.
+
+ \sa type(), fromString()
+*/
+
+/*!
+ \fn QNativeIpcKey::type() const noexcept
+
+ Returns the key type associated with this object.
+
+ \sa nativeKey(), setType()
+*/
+
+/*!
+ \fn QNativeIpcKey::setType(Type type)
+
+ Sets the IPC type of this object to \a type.
+
+ \sa type(), setNativeKey()
+*/
+void QNativeIpcKey::setType_internal(Type type)
+{
+ Q_UNUSED(type);
+}
+
+/*!
+ \fn QNativeIpcKey::nativeKey() const noexcept
+
+ Returns the native key string associated with this object.
+
+ \sa setNativeKey(), type()
+*/
+
+/*!
+ \fn QNativeIpcKey::setNativeKey(const QString &newKey)
+
+ Sets the native key for this object to \a newKey.
+
+ \sa nativeKey(), setType()
+*/
+void QNativeIpcKey::setNativeKey_internal(const QString &)
+{
+ d->legacyKey_.clear();
+}
+
+/*!
+ \fn size_t QNativeIpcKey::qHash(const QNativeIpcKey &ipcKey) noexcept
+
+ Returns the hash value for \a ipcKey, using a default seed of \c 0.
+*/
+
+/*!
+ \fn size_t QNativeIpcKey::qHash(const QNativeIpcKey &ipcKey, size_t seed) noexcept
+
+ Returns the hash value for \a ipcKey, using \a seed to seed the calculation.
+*/
+size_t qHash(const QNativeIpcKey &ipcKey, size_t seed) noexcept
+{
+ // by *choice*, we're not including d->legacyKey_ in the hash -- it's
+ // already partially encoded in the key
+ return qHashMulti(seed, ipcKey.key, ipcKey.type());
+}
+
+/*!
+ \fn bool QNativeIpcKey::operator==(const QNativeIpcKey &lhs, const QNativeIpcKey &rhs) noexcept
+ \fn bool QNativeIpcKey::operator!=(const QNativeIpcKey &lhs, const QNativeIpcKey &rhs) noexcept
+
+ Returns true if the \a lhs and \a rhs objects hold the same (or different) contents.
+*/
+int QNativeIpcKey::compare_internal(const QNativeIpcKey &lhs, const QNativeIpcKey &rhs) noexcept
+{
+ return (QNativeIpcKeyPrivate::legacyKey(lhs) == QNativeIpcKeyPrivate::legacyKey(rhs)) ? 0 : 1;
+}
+
+/*!
+ Returns the string representation of this object. String representations
+ are useful to inform other processes of the key this process created and
+ that they should attach to.
+
+ This function returns a null string if the current object is
+ \l{isValid()}{invalid}.
+
+ \sa fromString()
+*/
+QString QNativeIpcKey::toString() const
+{
+ QString prefix = typeToString(type());
+ if (prefix.isEmpty()) {
+ Q_ASSERT(prefix.isNull());
+ return prefix;
+ }
+
+ QString copy = nativeKey();
+ copy.replace(u'%', "%25"_L1);
+ if (copy.startsWith("//"_L1))
+ copy.replace(0, 2, u"/%2F"_s); // ensure it's parsed as a URL path
+
+ QUrl u;
+ u.setScheme(prefix);
+ u.setPath(copy, QUrl::TolerantMode);
+ if (isSlowPath()) {
+ QUrlQuery q;
+ if (!d->legacyKey_.isEmpty())
+ q.addQueryItem(u"legacyKey"_s, QString(d->legacyKey_).replace(u'%', "%25"_L1));
+ u.setQuery(q);
+ }
+ return u.toString(QUrl::DecodeReserved);
+}
+
+/*!
+ Parses the string form \a text and returns the corresponding QNativeIpcKey.
+ String representations are useful to inform other processes of the key this
+ process created and they should attach to.
+
+ If the string could not be parsed, this function returns an
+ \l{isValid()}{invalid} object.
+
+ \sa toString(), isValid()
+*/
+QNativeIpcKey QNativeIpcKey::fromString(const QString &text)
+{
+ QUrl u(text, QUrl::TolerantMode);
+ Type invalidType = {};
+ Type type = stringToType(u.scheme());
+ if (type == invalidType || !u.isValid() || !u.userInfo().isEmpty() || !u.host().isEmpty()
+ || u.port() != -1)
+ return QNativeIpcKey(invalidType);
+
+ QNativeIpcKey result(QString(), type);
+ if (result.type() != type) // range check, just in case
+ return QNativeIpcKey(invalidType);
+
+ // decode the payload
+ result.setNativeKey(u.path());
+
+ if (u.hasQuery()) {
+ const QList items = QUrlQuery(u).queryItems();
+ for (const auto &item : items) {
+ if (item.first == u"legacyKey"_s) {
+ QString legacyKey = QUrl::fromPercentEncoding(item.second.toUtf8());
+ QNativeIpcKeyPrivate::setLegacyKey(result, std::move(legacyKey));
+ } else {
+ // unknown query item
+ return QNativeIpcKey(invalidType);
+ }
+ }
+ }
+ return result;
+}
+
+QT_END_NAMESPACE
+
+#include "moc_qtipccommon.cpp"
+
+#endif // QT_CONFIG(sharedmemory) || QT_CONFIG(systemsemaphore)
diff --git a/src/corelib/ipc/qtipccommon.h b/src/corelib/ipc/qtipccommon.h
new file mode 100644
index 0000000000..74f30cb6a4
--- /dev/null
+++ b/src/corelib/ipc/qtipccommon.h
@@ -0,0 +1,206 @@
+// Copyright (C) 2022 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QNATIVEIPCKEY_H
+#define QNATIVEIPCKEY_H
+
+#include <QtCore/qglobal.h>
+#include <QtCore/qtcore-config.h>
+
+#if QT_CONFIG(sharedmemory) || QT_CONFIG(systemsemaphore)
+# include <QtCore/qstring.h>
+# include <QtCore/qobjectdefs.h>
+
+QT_BEGIN_NAMESPACE
+
+class QNativeIpcKeyPrivate;
+class QNativeIpcKey
+{
+ Q_GADGET_EXPORT(Q_CORE_EXPORT)
+public:
+ enum class Type : quint16 {
+ // 0 is reserved for the invalid type
+ // keep 1 through 0xff free, except for SystemV
+ SystemV = 0x51, // 'Q'
+
+ PosixRealtime = 0x100,
+ Windows,
+ };
+ Q_ENUM(Type)
+
+ static constexpr Type DefaultTypeForOs =
+#ifdef Q_OS_WIN
+ Type::Windows
+#else
+ Type::PosixRealtime
+#endif
+ ;
+ static Type legacyDefaultTypeForOs() noexcept;
+
+ constexpr QNativeIpcKey() noexcept = default;
+
+ explicit constexpr QNativeIpcKey(Type type) noexcept
+ : typeAndFlags{type}
+ {
+ }
+
+ Q_IMPLICIT QNativeIpcKey(const QString &k, Type type = DefaultTypeForOs)
+ : key(k), typeAndFlags{type}
+ {
+ }
+
+ QNativeIpcKey(const QNativeIpcKey &other)
+ : d(other.d), key(other.key), typeAndFlags(other.typeAndFlags)
+ {
+ if (isSlowPath())
+ copy_internal(other);
+ }
+
+ QNativeIpcKey(QNativeIpcKey &&other) noexcept
+ : d(std::exchange(other.d, nullptr)), key(std::move(other.key)),
+ typeAndFlags(std::move(other.typeAndFlags))
+ {
+ if (isSlowPath())
+ move_internal(std::move(other));
+ }
+
+ ~QNativeIpcKey()
+ {
+ if (isSlowPath())
+ destroy_internal();
+ }
+
+ QNativeIpcKey &operator=(const QNativeIpcKey &other)
+ {
+ typeAndFlags = other.typeAndFlags;
+ key = other.key;
+ if (isSlowPath() || other.isSlowPath())
+ return assign_internal(other);
+ Q_ASSERT(!d);
+ return *this;
+ }
+
+ QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_PURE_SWAP(QNativeIpcKey)
+ void swap(QNativeIpcKey &other) noexcept
+ {
+ std::swap(d, other.d);
+ key.swap(other.key);
+ typeAndFlags.swap(other.typeAndFlags);
+ }
+
+ bool isEmpty() const noexcept
+ {
+ return key.isEmpty();
+ }
+
+ bool isValid() const noexcept
+ {
+ return type() != Type{};
+ }
+
+ constexpr Type type() const noexcept
+ {
+ return typeAndFlags.type;
+ }
+
+ constexpr void setType(Type type)
+ {
+ if (isSlowPath())
+ return setType_internal(type);
+ typeAndFlags.type = type;
+ }
+
+ QString nativeKey() const noexcept
+ {
+ return key;
+ }
+ void setNativeKey(const QString &newKey)
+ {
+ key = newKey;
+ if (isSlowPath())
+ setNativeKey_internal(newKey);
+ }
+
+ Q_CORE_EXPORT QString toString() const;
+ Q_CORE_EXPORT static QNativeIpcKey fromString(const QString &string);
+
+private:
+ struct TypeAndFlags {
+ Type type = DefaultTypeForOs;
+ quint16 reserved1 = {};
+ quint32 reserved2 = {};
+
+ void swap(TypeAndFlags &other) noexcept
+ {
+ std::swap(type, other.type);
+ std::swap(reserved1, other.reserved1);
+ std::swap(reserved2, other.reserved2);
+ }
+
+ friend constexpr bool operator==(const TypeAndFlags &lhs, const TypeAndFlags &rhs) noexcept
+ {
+ return lhs.type == rhs.type &&
+ lhs.reserved1 == rhs.reserved1 &&
+ lhs.reserved2 == rhs.reserved2;
+ }
+ };
+
+ QNativeIpcKeyPrivate *d = nullptr;
+ QString key;
+ TypeAndFlags typeAndFlags;
+
+ friend class QNativeIpcKeyPrivate;
+ constexpr bool isSlowPath() const noexcept
+ { return Q_UNLIKELY(d); }
+
+ friend Q_CORE_EXPORT size_t qHash(const QNativeIpcKey &ipcKey, size_t seed) noexcept;
+ friend size_t qHash(const QNativeIpcKey &ipcKey) noexcept
+ { return qHash(ipcKey, 0); }
+
+ Q_CORE_EXPORT void copy_internal(const QNativeIpcKey &other);
+ Q_CORE_EXPORT void move_internal(QNativeIpcKey &&other) noexcept;
+ Q_CORE_EXPORT QNativeIpcKey &assign_internal(const QNativeIpcKey &other);
+ Q_CORE_EXPORT void destroy_internal() noexcept;
+ Q_CORE_EXPORT void setType_internal(Type);
+ Q_CORE_EXPORT void setNativeKey_internal(const QString &);
+ Q_DECL_PURE_FUNCTION Q_CORE_EXPORT static int
+ compare_internal(const QNativeIpcKey &lhs, const QNativeIpcKey &rhs) noexcept;
+
+#ifdef Q_OS_DARWIN
+ Q_DECL_CONST_FUNCTION Q_CORE_EXPORT static Type defaultTypeForOs_internal() noexcept;
+#endif
+ friend bool comparesEqual(const QNativeIpcKey &lhs, const QNativeIpcKey &rhs) noexcept
+ {
+ if (!(lhs.typeAndFlags == rhs.typeAndFlags))
+ return false;
+ if (lhs.key != rhs.key)
+ return false;
+ if (lhs.d == rhs.d)
+ return true;
+ return compare_internal(lhs, rhs) == 0;
+ }
+ Q_DECLARE_EQUALITY_COMPARABLE(QNativeIpcKey)
+};
+
+// not a shared type, exactly, but this works too
+Q_DECLARE_SHARED(QNativeIpcKey)
+
+inline auto QNativeIpcKey::legacyDefaultTypeForOs() noexcept -> Type
+{
+#if defined(Q_OS_WIN)
+ return Type::Windows;
+#elif defined(QT_POSIX_IPC)
+ return Type::PosixRealtime;
+#elif defined(Q_OS_DARWIN)
+ return defaultTypeForOs_internal();
+#else
+ return Type::SystemV;
+#endif
+}
+
+QT_END_NAMESPACE
+
+#endif // QT_CONFIG(sharedmemory) || QT_CONFIG(systemsemaphore)
+
+
+#endif // QNATIVEIPCKEY_H
diff --git a/src/corelib/ipc/qtipccommon_p.h b/src/corelib/ipc/qtipccommon_p.h
new file mode 100644
index 0000000000..72762c5ba7
--- /dev/null
+++ b/src/corelib/ipc/qtipccommon_p.h
@@ -0,0 +1,173 @@
+// Copyright (C) 2022 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QTIPCCOMMON_P_H
+#define QTIPCCOMMON_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include "qtipccommon.h"
+#include <private/qglobal_p.h>
+#include <private/qtcore-config_p.h>
+
+#if QT_CONFIG(sharedmemory) || QT_CONFIG(systemsemaphore)
+
+#if defined(Q_OS_UNIX)
+# include <qfile.h>
+# include <private/qcore_unix_p.h>
+#endif
+
+QT_BEGIN_NAMESPACE
+
+class QNativeIpcKeyPrivate
+{
+public:
+ QString legacyKey_;
+
+ static QString legacyKey(const QNativeIpcKey &key)
+ {
+ if (key.isSlowPath())
+ return key.d->legacyKey_;
+ return QString();
+ }
+ static void setLegacyKey(QNativeIpcKey &key, const QString &legacyKey)
+ {
+ QNativeIpcKeyPrivate::makeExtended(key)->legacyKey_ = legacyKey;
+ }
+ static void setNativeAndLegacyKeys(QNativeIpcKey &key, const QString &nativeKey,
+ const QString &legacyKey)
+ {
+ key.setNativeKey(nativeKey);
+ setLegacyKey(key, legacyKey);
+ }
+
+private:
+ static QNativeIpcKeyPrivate *makeExtended(QNativeIpcKey &key)
+ {
+ if (!key.isSlowPath())
+ key.d = new QNativeIpcKeyPrivate;
+ return key.d;
+ }
+};
+
+namespace QtIpcCommon {
+enum class IpcType {
+ SharedMemory,
+ SystemSemaphore
+};
+
+static constexpr bool isIpcSupported(IpcType ipcType, QNativeIpcKey::Type type)
+{
+ switch (type) {
+ case QNativeIpcKey::Type::SystemV:
+ break;
+
+ case QNativeIpcKey::Type::PosixRealtime:
+ if (ipcType == IpcType::SharedMemory)
+ return QT_CONFIG(posix_shm);
+ return QT_CONFIG(posix_sem);
+
+ case QNativeIpcKey::Type::Windows:
+#ifdef Q_OS_WIN
+ return true;
+#else
+ return false;
+#endif
+ }
+
+ if (ipcType == IpcType::SharedMemory)
+ return QT_CONFIG(sysv_shm);
+ return QT_CONFIG(sysv_sem);
+}
+
+template <auto Member1, auto... Members> class IpcStorageVariant
+{
+ template <typename T, typename C> static C extractClass(T C::*);
+ template <typename T, typename C> static T extractObject(T C::*);
+
+ template <auto M>
+ static constexpr bool IsEnabled = decltype(extractObject(M))::Enabled;
+
+ static_assert(std::is_member_object_pointer_v<decltype(Member1)>);
+ using StorageType = decltype(extractClass(Member1));
+ StorageType d;
+
+public:
+ template <typename Lambda> static auto
+ visit_internal(StorageType &storage, QNativeIpcKey::Type keyType, const Lambda &lambda)
+ {
+ if constexpr ((IsEnabled<Member1> || ... || IsEnabled<Members>)) {
+ if constexpr (IsEnabled<Member1>) {
+ using MemberType1 = decltype(extractObject(Member1));
+ if (MemberType1::supports(keyType))
+ return lambda(&(storage.*Member1));
+ }
+ if constexpr ((... || IsEnabled<Members>))
+ return IpcStorageVariant<Members...>::visit_internal(storage, keyType, lambda);
+ Q_UNREACHABLE();
+ } else {
+ // no backends enabled, but we can't return void
+ return false;
+ }
+ }
+
+ template <typename Lambda> auto visit(QNativeIpcKey::Type keyType, const Lambda &lambda)
+ {
+ return visit_internal(d, keyType, lambda);
+ }
+
+ template <typename Lambda> static auto
+ staticVisit(QNativeIpcKey::Type keyType, const Lambda &lambda)
+ {
+ if constexpr ((IsEnabled<Member1> || ... || IsEnabled<Members>)) {
+ if constexpr (IsEnabled<Member1>) {
+ using MemberType1 = decltype(extractObject(Member1));
+ if (MemberType1::supports(keyType))
+ return lambda(static_cast<MemberType1 *>(nullptr));
+ }
+ if constexpr ((... || IsEnabled<Members>))
+ return IpcStorageVariant<Members...>::staticVisit(keyType, lambda);
+ Q_UNREACHABLE();
+ } else {
+ // no backends enabled, but we can't return void
+ return false;
+ }
+ }
+};
+
+QNativeIpcKey legacyPlatformSafeKey(const QString &key, IpcType ipcType, QNativeIpcKey::Type type);
+QNativeIpcKey platformSafeKey(const QString &key, IpcType ipcType, QNativeIpcKey::Type type);
+
+#ifdef Q_OS_UNIX
+// Convenience function to create the file if needed
+inline int createUnixKeyFile(const QByteArray &fileName)
+{
+ int fd = qt_safe_open(fileName.constData(), O_EXCL | O_CREAT | O_RDWR, 0640);
+ if (fd < 0) {
+ if (errno == EEXIST)
+ return 0;
+ return -1;
+ } else {
+ close(fd);
+ }
+ return 1;
+
+}
+#endif // Q_OS_UNIX
+} // namespace QtIpcCommon
+
+QT_END_NAMESPACE
+
+#endif // QT_CONFIG(sharedmemory) || QT_CONFIG(systemsemaphore)
+
+
+#endif // QTIPCCOMMON_P_H
diff --git a/src/corelib/itemmodels/qabstractitemmodel.cpp b/src/corelib/itemmodels/qabstractitemmodel.cpp
index b28597468f..cd29f2fcc2 100644
--- a/src/corelib/itemmodels/qabstractitemmodel.cpp
+++ b/src/corelib/itemmodels/qabstractitemmodel.cpp
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2020 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2022 The Qt Company Ltd.
+// Copyright (C) 2020 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qabstractitemmodel.h"
#include <private/qabstractitemmodel_p.h>
@@ -50,16 +14,21 @@
# include <qregularexpression.h>
#endif
#include <qstack.h>
+#include <qmap.h>
#include <qbitarray.h>
#include <qdatetime.h>
#include <qloggingcategory.h>
+#include <functional>
+
#include <limits.h>
QT_BEGIN_NAMESPACE
Q_LOGGING_CATEGORY(lcCheckIndex, "qt.core.qabstractitemmodel.checkindex")
+QT_IMPL_METATYPE_EXTERN(QModelIndexList)
+
QPersistentModelIndexData *QPersistentModelIndexData::create(const QModelIndex &index)
{
Q_ASSERT(index.isValid()); // we will _never_ insert an invalid index in the list
@@ -243,7 +212,7 @@ void QPersistentModelIndexData::destroy(QPersistentModelIndexData *data)
*/
/*!
- \fn template <typename Container> QModelRoleDataSpan::QModelRoleDataSpan(Container &c) noexcept
+ \fn template <typename Container, QModelRoleDataSpan::if_compatible_container<Container> = true> QModelRoleDataSpan::QModelRoleDataSpan(Container &c) noexcept
Constructs an QModelRoleDataSpan spanning over the container \a c,
which can be any contiguous container of QModelRoleData objects.
@@ -413,7 +382,7 @@ QPersistentModelIndex::~QPersistentModelIndex()
model index are used when comparing with another persistent model index.
*/
-bool QPersistentModelIndex::operator==(const QPersistentModelIndex &other) const
+bool QPersistentModelIndex::operator==(const QPersistentModelIndex &other) const noexcept
{
if (d && other.d)
return d->index == other.d->index;
@@ -430,12 +399,12 @@ bool QPersistentModelIndex::operator==(const QPersistentModelIndex &other) const
model index are used when comparing with another persistent model index.
*/
-bool QPersistentModelIndex::operator<(const QPersistentModelIndex &other) const
+bool QPersistentModelIndex::operator<(const QPersistentModelIndex &other) const noexcept
{
if (d && other.d)
return d->index < other.d->index;
- return d < other.d;
+ return std::less<>{}(d, other.d);
}
/*!
@@ -508,7 +477,7 @@ QPersistentModelIndex::operator QModelIndex() const
model index are used when comparing with another model index.
*/
-bool QPersistentModelIndex::operator==(const QModelIndex &other) const
+bool QPersistentModelIndex::operator==(const QModelIndex &other) const noexcept
{
if (d)
return d->index == other;
@@ -522,7 +491,7 @@ bool QPersistentModelIndex::operator==(const QModelIndex &other) const
location as the \a other model index; otherwise returns \c{false}.
*/
-bool QPersistentModelIndex::operator!=(const QModelIndex &other) const
+bool QPersistentModelIndex::operator!=(const QModelIndex &other) const noexcept
{
if (d)
return d->index != other;
@@ -717,6 +686,7 @@ QDebug operator<<(QDebug dbg, const QPersistentModelIndex &idx)
class QEmptyItemModel : public QAbstractItemModel
{
+ Q_OBJECT
public:
explicit QEmptyItemModel(QObject *parent = nullptr) : QAbstractItemModel(parent) {}
QModelIndex index(int, int, const QModelIndex &) const override { return QModelIndex(); }
@@ -746,7 +716,7 @@ QAbstractItemModel *QAbstractItemModelPrivate::staticEmptyModel()
void QAbstractItemModelPrivate::invalidatePersistentIndexes()
{
- for (QPersistentModelIndexData *data : qAsConst(persistent.indexes))
+ for (QPersistentModelIndexData *data : std::as_const(persistent.indexes))
data->index = QModelIndex();
persistent.indexes.clear();
}
@@ -766,7 +736,7 @@ void QAbstractItemModelPrivate::invalidatePersistentIndex(const QModelIndex &ind
}
using DefaultRoleNames = QHash<int, QByteArray>;
-Q_GLOBAL_STATIC_WITH_ARGS(DefaultRoleNames, qDefaultRoleNames, (
+Q_GLOBAL_STATIC(DefaultRoleNames, qDefaultRoleNames,
{
{ Qt::DisplayRole, "display" },
{ Qt::DecorationRole, "decoration" },
@@ -774,7 +744,7 @@ Q_GLOBAL_STATIC_WITH_ARGS(DefaultRoleNames, qDefaultRoleNames, (
{ Qt::ToolTipRole, "toolTip" },
{ Qt::StatusTipRole, "statusTip" },
{ Qt::WhatsThisRole, "whatsThis" },
- }))
+ })
const QHash<int,QByteArray> &QAbstractItemModelPrivate::defaultRoleNames()
{
@@ -873,13 +843,13 @@ void QAbstractItemModelPrivate::removePersistentIndexData(QPersistentModelIndexD
Q_UNUSED(removed);
}
// make sure our optimization still works
- for (int i = persistent.moved.count() - 1; i >= 0; --i) {
+ for (int i = persistent.moved.size() - 1; i >= 0; --i) {
int idx = persistent.moved.at(i).indexOf(data);
if (idx >= 0)
persistent.moved[i].remove(idx);
}
// update the references to invalidated persistent indexes
- for (int i = persistent.invalidated.count() - 1; i >= 0; --i) {
+ for (int i = persistent.invalidated.size() - 1; i >= 0; --i) {
int idx = persistent.invalidated.at(i).indexOf(data);
if (idx >= 0)
persistent.invalidated[i].remove(idx);
@@ -894,7 +864,7 @@ void QAbstractItemModelPrivate::rowsAboutToBeInserted(const QModelIndex &parent,
Q_UNUSED(last);
QList<QPersistentModelIndexData *> persistent_moved;
if (first < q->rowCount(parent)) {
- for (auto *data : qAsConst(persistent.indexes)) {
+ for (auto *data : std::as_const(persistent.indexes)) {
const QModelIndex &index = data->index;
if (index.row() >= first && index.isValid() && index.parent() == parent) {
persistent_moved.append(data);
@@ -930,7 +900,7 @@ void QAbstractItemModelPrivate::itemsAboutToBeMoved(const QModelIndex &srcParent
const bool sameParent = (srcParent == destinationParent);
const bool movingUp = (srcFirst > destinationChild);
- for (auto *data : qAsConst(persistent.indexes)) {
+ for (auto *data : std::as_const(persistent.indexes)) {
const QModelIndex &index = data->index;
const QModelIndex &parent = index.parent();
const bool isSourceIndex = (parent == srcParent);
@@ -1028,7 +998,7 @@ void QAbstractItemModelPrivate::rowsAboutToBeRemoved(const QModelIndex &parent,
QList<QPersistentModelIndexData *> persistent_invalidated;
// find the persistent indexes that are affected by the change, either by being in the removed subtree
// or by being on the same level and below the removed rows
- for (auto *data : qAsConst(persistent.indexes)) {
+ for (auto *data : std::as_const(persistent.indexes)) {
bool level_changed = false;
QModelIndex current = data->index;
while (current.isValid()) {
@@ -1080,7 +1050,7 @@ void QAbstractItemModelPrivate::columnsAboutToBeInserted(const QModelIndex &pare
Q_UNUSED(last);
QList<QPersistentModelIndexData *> persistent_moved;
if (first < q->columnCount(parent)) {
- for (auto *data : qAsConst(persistent.indexes)) {
+ for (auto *data : std::as_const(persistent.indexes)) {
const QModelIndex &index = data->index;
if (index.column() >= first && index.isValid() && index.parent() == parent)
persistent_moved.append(data);
@@ -1113,7 +1083,7 @@ void QAbstractItemModelPrivate::columnsAboutToBeRemoved(const QModelIndex &paren
QList<QPersistentModelIndexData *> persistent_invalidated;
// find the persistent indexes that are affected by the change, either by being in the removed subtree
// or by being on the same level and to the right of the removed columns
- for (auto *data : qAsConst(persistent.indexes)) {
+ for (auto *data : std::as_const(persistent.indexes)) {
bool level_changed = false;
QModelIndex current = data->index;
while (current.isValid()) {
@@ -1530,10 +1500,12 @@ void QAbstractItemModel::resetInternalData()
rows to the model, \l{QAbstractItemModel::}{beginInsertRows()} and
\l{QAbstractItemModel::}{endInsertRows()} must be called.
+ \include models.qdocinc {thread-safety-section1}{QAbstractItemModel}
+
\sa {Model Classes}, {Model Subclassing Reference}, QModelIndex,
QAbstractItemView, {Using drag and drop with item views},
- {Simple DOM Model Example}, {Simple Tree Model Example},
- {Editable Tree Model Example}, {Fetch More Example}
+ {Simple Tree Model Example}, {Editable Tree Model Example},
+ {Fetch More Example}
*/
/*!
@@ -1772,7 +1744,13 @@ QAbstractItemModel::~QAbstractItemModel()
For example:
- \snippet ../widgets/itemviews/simpledommodel/dommodel.cpp 2
+ \code
+ int MyModel::columnCount(const QModelIndex &parent) const
+ {
+ Q_UNUSED(parent);
+ return 3;
+ }
+ \endcode
\note When implementing a table based model, columnCount() should return 0
when the parent is valid.
@@ -1857,13 +1835,13 @@ QAbstractItemModel::~QAbstractItemModel()
*/
/*!
- \fn void QAbstractItemModel::rowsMoved(const QModelIndex &parent, int start, int end, const QModelIndex &destination, int row)
+ \fn void QAbstractItemModel::rowsMoved(const QModelIndex &sourceParent, int sourceStart, int sourceEnd, const QModelIndex &destinationParent, int destinationRow)
\since 4.6
This signal is emitted after rows have been moved within the
- model. The items between \a start and \a end
- inclusive, under the given \a parent item have been moved to \a destination
- starting at the row \a row.
+ model. The items between \a sourceStart and \a sourceEnd
+ inclusive, under the given \a sourceParent item have been moved to \a destinationParent
+ starting at the row \a destinationRow.
\b{Note:} Components connected to this signal use it to adapt to changes
in the model's dimensions. It can only be emitted by the QAbstractItemModel
@@ -1889,13 +1867,13 @@ QAbstractItemModel::~QAbstractItemModel()
*/
/*!
- \fn void QAbstractItemModel::columnsMoved(const QModelIndex &parent, int start, int end, const QModelIndex &destination, int column)
+ \fn void QAbstractItemModel::columnsMoved(const QModelIndex &sourceParent, int sourceStart, int sourceEnd, const QModelIndex &destinationParent, int destinationColumn)
\since 4.6
This signal is emitted after columns have been moved within the
- model. The items between \a start and \a end
- inclusive, under the given \a parent item have been moved to \a destination
- starting at the column \a column.
+ model. The items between \a sourceStart and \a sourceEnd
+ inclusive, under the given \a sourceParent item have been moved to \a destinationParent
+ starting at the column \a destinationColumn.
\b{Note:} Components connected to this signal use it to adapt to changes
in the model's dimensions. It can only be emitted by the QAbstractItemModel
@@ -2153,7 +2131,7 @@ QStringList QAbstractItemModel::mimeTypes() const
*/
QMimeData *QAbstractItemModel::mimeData(const QModelIndexList &indexes) const
{
- if (indexes.count() <= 0)
+ if (indexes.size() <= 0)
return nullptr;
QStringList types = mimeTypes();
if (types.isEmpty())
@@ -2192,7 +2170,7 @@ bool QAbstractItemModel::canDropMimeData(const QMimeData *data, Qt::DropAction a
return false;
const QStringList modelTypes = mimeTypes();
- for (int i = 0; i < modelTypes.count(); ++i) {
+ for (int i = 0; i < modelTypes.size(); ++i) {
if (data->hasFormat(modelTypes.at(i)))
return true;
}
@@ -2549,7 +2527,7 @@ QModelIndexList QAbstractItemModel::match(const QModelIndex &start, int role,
// iterates twice if wrapping
for (int i = 0; (wrap && i < 2) || (!wrap && i < 1); ++i) {
- for (int r = from; (r < to) && (allHits || result.count() < hits); ++r) {
+ for (int r = from; (r < to) && (allHits || result.size() < hits); ++r) {
QModelIndex idx = index(r, column, p);
if (!idx.isValid())
continue;
@@ -2571,8 +2549,10 @@ QModelIndexList QAbstractItemModel::match(const QModelIndex &start, int role,
}
}
} else if (matchType == Qt::MatchWildcard) {
- if (rx.pattern().isEmpty())
- rx.setPattern(QRegularExpression::wildcardToRegularExpression(value.toString()));
+ if (rx.pattern().isEmpty()) {
+ const QString pattern = QRegularExpression::wildcardToRegularExpression(value.toString(), QRegularExpression::NonPathWildcardConversion);
+ rx.setPattern(pattern);
+ }
if (cs == Qt::CaseInsensitive)
rx.setPatternOptions(QRegularExpression::CaseInsensitiveOption);
} else
@@ -2615,7 +2595,7 @@ QModelIndexList QAbstractItemModel::match(const QModelIndex &start, int role,
if (hasChildren(parent)) { // search the hierarchy
result += match(index(0, column, parent), role,
(text.isEmpty() ? value : text),
- (allHits ? -1 : hits - result.count()), flags);
+ (allHits ? -1 : hits - result.size()), flags);
}
}
}
@@ -2808,15 +2788,15 @@ bool QAbstractItemModel::decodeData(int row, int column, const QModelIndex &pare
// Compute the number of continuous rows upon insertion and modify the rows to match
QList<int> rowsToInsert(bottom + 1);
- for (int i = 0; i < rows.count(); ++i)
+ for (int i = 0; i < rows.size(); ++i)
rowsToInsert[rows.at(i)] = 1;
- for (int i = 0; i < rowsToInsert.count(); ++i) {
+ for (int i = 0; i < rowsToInsert.size(); ++i) {
if (rowsToInsert.at(i) == 1){
rowsToInsert[i] = dragRowCount;
++dragRowCount;
}
}
- for (int i = 0; i < rows.count(); ++i)
+ for (int i = 0; i < rows.size(); ++i)
rows[i] = top + rowsToInsert.at(rows.at(i));
QBitArray isWrittenTo(dragRowCount * dragColumnCount);
@@ -3352,9 +3332,8 @@ bool QAbstractItemModel::beginMoveColumns(const QModelIndex &sourceParent, int s
destinationChange.needsAdjust = destinationParent.isValid() && destinationParent.row() >= sourceLast && destinationParent.parent() == sourceParent;
d->changes.push(destinationChange);
- d->itemsAboutToBeMoved(sourceParent, sourceFirst, sourceLast, destinationParent, destinationChild, Qt::Horizontal);
-
emit columnsAboutToBeMoved(sourceParent, sourceFirst, sourceLast, destinationParent, destinationChild, QPrivateSignal());
+ d->itemsAboutToBeMoved(sourceParent, sourceFirst, sourceLast, destinationParent, destinationChild, Qt::Horizontal);
return true;
}
@@ -3387,7 +3366,6 @@ void QAbstractItemModel::endMoveColumns()
adjustedSource = createIndex(adjustedSource.row(), adjustedSource.column() + numMoved, adjustedSource.internalPointer());
d->itemsMoved(adjustedSource, removeChange.first, removeChange.last, adjustedDestination, insertChange.first, Qt::Horizontal);
-
emit columnsMoved(adjustedSource, removeChange.first, removeChange.last, adjustedDestination, insertChange.first, QPrivateSignal());
}
@@ -3481,8 +3459,8 @@ void QAbstractItemModel::changePersistentIndexList(const QModelIndexList &from,
if (d->persistent.indexes.isEmpty())
return;
QList<QPersistentModelIndexData *> toBeReinserted;
- toBeReinserted.reserve(to.count());
- for (int i = 0; i < from.count(); ++i) {
+ toBeReinserted.reserve(to.size());
+ for (int i = 0; i < from.size(); ++i) {
if (from.at(i) == to.at(i))
continue;
const auto it = d->persistent.indexes.constFind(from.at(i));
@@ -3495,7 +3473,7 @@ void QAbstractItemModel::changePersistentIndexList(const QModelIndexList &from,
}
}
- for (auto *data : qAsConst(toBeReinserted))
+ for (auto *data : std::as_const(toBeReinserted))
d->persistent.insertMultiAtEnd(data->index, data);
}
@@ -3508,8 +3486,8 @@ QModelIndexList QAbstractItemModel::persistentIndexList() const
{
Q_D(const QAbstractItemModel);
QModelIndexList result;
- result.reserve(d->persistent.indexes.count());
- for (auto *data : qAsConst(d->persistent.indexes))
+ result.reserve(d->persistent.indexes.size());
+ for (auto *data : std::as_const(d->persistent.indexes))
result.append(data->index);
return result;
}
@@ -3761,10 +3739,9 @@ void QAbstractItemModel::multiData(const QModelIndex &index, QModelRoleDataSpan
\note Some general guidelines for subclassing models are available in the
\l{Model Subclassing Reference}.
- \note
+ \include models.qdocinc {thread-safety-section1}{QAbstractTableModel}
- \sa {Model Classes}, QAbstractItemModel, QAbstractListModel,
- {Pixelator Example}
+ \sa {Model Classes}, QAbstractItemModel, QAbstractListModel
*/
/*!
@@ -3915,7 +3892,7 @@ Qt::ItemFlags QAbstractTableModel::flags(const QModelIndex &index) const
\l{Model Subclassing Reference}.
\sa {Model Classes}, {Model Subclassing Reference}, QAbstractItemView,
- QAbstractTableModel, {Item Views Puzzle Example}
+ QAbstractTableModel
*/
/*!
@@ -4193,3 +4170,4 @@ void QAbstractItemModelPrivate::Persistent::insertMultiAtEnd(const QModelIndex&
QT_END_NAMESPACE
#include "moc_qabstractitemmodel.cpp"
+#include "qabstractitemmodel.moc"
diff --git a/src/corelib/itemmodels/qabstractitemmodel.h b/src/corelib/itemmodels/qabstractitemmodel.h
index 0b61275d23..8f22f14989 100644
--- a/src/corelib/itemmodels/qabstractitemmodel.h
+++ b/src/corelib/itemmodels/qabstractitemmodel.h
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2020 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2020 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QABSTRACTITEMMODEL_H
#define QABSTRACTITEMMODEL_H
@@ -214,17 +178,17 @@ public:
QPersistentModelIndex(const QModelIndex &index);
QPersistentModelIndex(const QPersistentModelIndex &other);
~QPersistentModelIndex();
- bool operator<(const QPersistentModelIndex &other) const;
- bool operator==(const QPersistentModelIndex &other) const;
- inline bool operator!=(const QPersistentModelIndex &other) const
+ bool operator<(const QPersistentModelIndex &other) const noexcept;
+ bool operator==(const QPersistentModelIndex &other) const noexcept;
+ inline bool operator!=(const QPersistentModelIndex &other) const noexcept
{ return !operator==(other); }
QPersistentModelIndex &operator=(const QPersistentModelIndex &other);
inline QPersistentModelIndex(QPersistentModelIndex &&other) noexcept
- : d(qExchange(other.d, nullptr)) {}
+ : d(std::exchange(other.d, nullptr)) {}
QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_PURE_SWAP(QPersistentModelIndex)
- inline void swap(QPersistentModelIndex &other) noexcept { qSwap(d, other.d); }
- bool operator==(const QModelIndex &other) const;
- bool operator!=(const QModelIndex &other) const;
+ void swap(QPersistentModelIndex &other) noexcept { qt_ptr_swap(d, other.d); }
+ bool operator==(const QModelIndex &other) const noexcept;
+ bool operator!=(const QModelIndex &other) const noexcept;
QPersistentModelIndex &operator=(const QModelIndex &other);
operator QModelIndex() const;
int row() const;
@@ -309,28 +273,28 @@ public:
virtual Qt::DropActions supportedDropActions() const;
virtual Qt::DropActions supportedDragActions() const;
- virtual bool insertRows(int row, int count, const QModelIndex &parent = QModelIndex());
- virtual bool insertColumns(int column, int count, const QModelIndex &parent = QModelIndex());
- virtual bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex());
- virtual bool removeColumns(int column, int count, const QModelIndex &parent = QModelIndex());
- virtual bool moveRows(const QModelIndex &sourceParent, int sourceRow, int count,
+ Q_INVOKABLE Q_REVISION(6, 4) virtual bool insertRows(int row, int count, const QModelIndex &parent = QModelIndex());
+ Q_INVOKABLE Q_REVISION(6, 4) virtual bool insertColumns(int column, int count, const QModelIndex &parent = QModelIndex());
+ Q_INVOKABLE Q_REVISION(6, 4) virtual bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex());
+ Q_INVOKABLE Q_REVISION(6, 4) virtual bool removeColumns(int column, int count, const QModelIndex &parent = QModelIndex());
+ Q_INVOKABLE Q_REVISION(6, 4) virtual bool moveRows(const QModelIndex &sourceParent, int sourceRow, int count,
const QModelIndex &destinationParent, int destinationChild);
- virtual bool moveColumns(const QModelIndex &sourceParent, int sourceColumn, int count,
+ Q_INVOKABLE Q_REVISION(6, 4) virtual bool moveColumns(const QModelIndex &sourceParent, int sourceColumn, int count,
const QModelIndex &destinationParent, int destinationChild);
- inline bool insertRow(int row, const QModelIndex &parent = QModelIndex());
- inline bool insertColumn(int column, const QModelIndex &parent = QModelIndex());
- inline bool removeRow(int row, const QModelIndex &parent = QModelIndex());
- inline bool removeColumn(int column, const QModelIndex &parent = QModelIndex());
- inline bool moveRow(const QModelIndex &sourceParent, int sourceRow,
+ Q_INVOKABLE Q_REVISION(6, 4) inline bool insertRow(int row, const QModelIndex &parent = QModelIndex());
+ Q_INVOKABLE Q_REVISION(6, 4) inline bool insertColumn(int column, const QModelIndex &parent = QModelIndex());
+ Q_INVOKABLE Q_REVISION(6, 4) inline bool removeRow(int row, const QModelIndex &parent = QModelIndex());
+ Q_INVOKABLE Q_REVISION(6, 4) inline bool removeColumn(int column, const QModelIndex &parent = QModelIndex());
+ Q_INVOKABLE Q_REVISION(6, 4) inline bool moveRow(const QModelIndex &sourceParent, int sourceRow,
const QModelIndex &destinationParent, int destinationChild);
- inline bool moveColumn(const QModelIndex &sourceParent, int sourceColumn,
+ Q_INVOKABLE Q_REVISION(6, 4) inline bool moveColumn(const QModelIndex &sourceParent, int sourceColumn,
const QModelIndex &destinationParent, int destinationChild);
Q_INVOKABLE virtual void fetchMore(const QModelIndex &parent);
Q_INVOKABLE virtual bool canFetchMore(const QModelIndex &parent) const;
Q_INVOKABLE virtual Qt::ItemFlags flags(const QModelIndex &index) const;
- virtual void sort(int column, Qt::SortOrder order = Qt::AscendingOrder);
+ Q_INVOKABLE Q_REVISION(6, 4) virtual void sort(int column, Qt::SortOrder order = Qt::AscendingOrder);
virtual QModelIndex buddy(const QModelIndex &index) const;
Q_INVOKABLE virtual QModelIndexList match(const QModelIndex &start, int role,
const QVariant &value, int hits = 1,
@@ -386,10 +350,10 @@ Q_SIGNALS:
void modelReset(QPrivateSignal);
void rowsAboutToBeMoved( const QModelIndex &sourceParent, int sourceStart, int sourceEnd, const QModelIndex &destinationParent, int destinationRow, QPrivateSignal);
- void rowsMoved( const QModelIndex &parent, int start, int end, const QModelIndex &destination, int row, QPrivateSignal);
+ void rowsMoved( const QModelIndex &sourceParent, int sourceStart, int sourceEnd, const QModelIndex &destinationParent, int destinationRow, QPrivateSignal);
void columnsAboutToBeMoved( const QModelIndex &sourceParent, int sourceStart, int sourceEnd, const QModelIndex &destinationParent, int destinationColumn, QPrivateSignal);
- void columnsMoved( const QModelIndex &parent, int start, int end, const QModelIndex &destination, int column, QPrivateSignal);
+ void columnsMoved( const QModelIndex &sourceParent, int sourceStart, int sourceEnd, const QModelIndex &destinationParent, int destinationColumn, QPrivateSignal);
public Q_SLOTS:
virtual bool submit();
@@ -535,10 +499,16 @@ inline Qt::ItemFlags QModelIndex::flags() const
{ return m ? m->flags(*this) : Qt::ItemFlags(); }
inline size_t qHash(const QModelIndex &index, size_t seed = 0) noexcept
-{ return size_t((size_t(index.row()) << 4) + size_t(index.column()) + index.internalId()) ^ seed; }
+{
+#if QT_VERSION >= QT_VERSION_CHECK(7, 0, 0)
+ return qHashMulti(seed, index.row(), index.column(), index.internalId());
+#else
+ return size_t((size_t(index.row()) << 4) + size_t(index.column()) + index.internalId()) ^ seed;
+#endif
+}
QT_END_NAMESPACE
-Q_DECLARE_METATYPE(QModelIndexList)
+QT_DECL_METATYPE_EXTERN(QModelIndexList, Q_CORE_EXPORT)
#endif // QABSTRACTITEMMODEL_H
diff --git a/src/corelib/itemmodels/qabstractitemmodel_p.h b/src/corelib/itemmodels/qabstractitemmodel_p.h
index e8f00975ed..e34dc3262c 100644
--- a/src/corelib/itemmodels/qabstractitemmodel_p.h
+++ b/src/corelib/itemmodels/qabstractitemmodel_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QABSTRACTITEMMODEL_P_H
#define QABSTRACTITEMMODEL_P_H
@@ -157,6 +121,56 @@ public:
};
Q_DECLARE_TYPEINFO(QAbstractItemModelPrivate::Change, Q_RELOCATABLE_TYPE);
+namespace QtPrivate {
+
+/*!
+ \internal
+ This is a workaround for QTBUG-75172.
+
+ Some predefined model roles are supposed to use certain enum/flag
+ types (e.g. fetching Qt::TextAlignmentRole is supposed to return a
+ variant containing a Qt::Alignment object).
+
+ For historical reasons, a plain `int` was used sometimes. This is
+ surprising to end-users and also sloppy on Qt's part; users were
+ forced to use `int` rather than the correct datatype.
+
+ This function tries both the "right" type and plain `int`, for a
+ given QVariant. This fixes the problem (using the correct datatype)
+ but also keeps compatibility with existing code using `int`.
+
+ ### Qt 7: get rid of this. Always use the correct datatype.
+*/
+template <typename T>
+T legacyEnumValueFromModelData(const QVariant &data)
+{
+ static_assert(std::is_enum_v<T>);
+ if (data.userType() == qMetaTypeId<T>()) {
+ return data.value<T>();
+ } else if (std::is_same_v<std::underlying_type_t<T>, int> ||
+ std::is_same_v<std::underlying_type_t<T>, uint>) {
+ return T(data.toInt());
+ }
+
+ return T();
+}
+
+template <typename T>
+T legacyFlagValueFromModelData(const QVariant &data)
+{
+ if (data.userType() == qMetaTypeId<T>()) {
+ return data.value<T>();
+ } else if (std::is_same_v<std::underlying_type_t<typename T::enum_type>, int> ||
+ std::is_same_v<std::underlying_type_t<typename T::enum_type>, uint>) {
+ return T::fromInt(data.toInt());
+ }
+
+ return T();
+}
+
+} // namespace QtPrivate
+
+
QT_END_NAMESPACE
#endif // QABSTRACTITEMMODEL_P_H
diff --git a/src/corelib/itemmodels/qabstractproxymodel.cpp b/src/corelib/itemmodels/qabstractproxymodel.cpp
index d8a93eee36..abdeefb4da 100644
--- a/src/corelib/itemmodels/qabstractproxymodel.cpp
+++ b/src/corelib/itemmodels/qabstractproxymodel.cpp
@@ -1,47 +1,12 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qabstractproxymodel.h"
#include "qitemselectionmodel.h"
#include <private/qabstractproxymodel_p.h>
#include <QtCore/QSize>
#include <QtCore/QStringList>
+#include <QtCore/QMap>
QT_BEGIN_NAMESPACE
@@ -90,6 +55,87 @@ void QAbstractProxyModelPrivate::_q_sourceModelDestroyed()
model = QAbstractItemModelPrivate::staticEmptyModel();
}
+void QAbstractProxyModelPrivate::emitHeaderDataChanged()
+{
+ Q_Q(QAbstractProxyModel);
+
+ if (updateHorizontalHeader) {
+ if (auto columnCount = q->columnCount(); columnCount > 0)
+ emit q->headerDataChanged(Qt::Horizontal, 0, columnCount - 1);
+ }
+
+ if (updateVerticalHeader) {
+ if (auto rowCount = q->rowCount(); rowCount > 0)
+ emit q->headerDataChanged(Qt::Vertical, 0, rowCount - 1);
+ }
+
+ updateHorizontalHeader = false;
+ updateVerticalHeader = false;
+}
+
+void QAbstractProxyModelPrivate::scheduleHeaderUpdate(Qt::Orientation orientation)
+{
+ const bool isUpdateScheduled = updateHorizontalHeader || updateVerticalHeader;
+
+ if (orientation == Qt::Horizontal && !updateHorizontalHeader)
+ updateHorizontalHeader = true;
+ else if (orientation == Qt::Vertical && !updateVerticalHeader)
+ updateVerticalHeader = true;
+ else
+ return;
+
+ if (!isUpdateScheduled) {
+ Q_Q(QAbstractProxyModel);
+ QMetaObject::invokeMethod(q, [this]() { emitHeaderDataChanged(); }, Qt::QueuedConnection);
+ }
+}
+
+void QAbstractProxyModelPrivate::_q_sourceModelRowsAboutToBeInserted(const QModelIndex &parent, int, int)
+{
+ if (parent.isValid())
+ return;
+ sourceHadZeroRows = model->rowCount() == 0;
+}
+
+void QAbstractProxyModelPrivate::_q_sourceModelRowsInserted(const QModelIndex &parent, int, int)
+{
+ if (parent.isValid())
+ return;
+ if (sourceHadZeroRows)
+ scheduleHeaderUpdate(Qt::Horizontal);
+}
+
+void QAbstractProxyModelPrivate::_q_sourceModelRowsRemoved(const QModelIndex &parent, int, int)
+{
+ if (parent.isValid())
+ return;
+ if (model->rowCount() == 0)
+ scheduleHeaderUpdate(Qt::Horizontal);
+}
+
+void QAbstractProxyModelPrivate::_q_sourceModelColumnsAboutToBeInserted(const QModelIndex &parent, int, int)
+{
+ if (parent.isValid())
+ return;
+ sourceHadZeroColumns = model->columnCount() == 0;
+}
+
+void QAbstractProxyModelPrivate::_q_sourceModelColumnsInserted(const QModelIndex &parent, int, int)
+{
+ if (parent.isValid())
+ return;
+ if (sourceHadZeroColumns)
+ scheduleHeaderUpdate(Qt::Vertical);
+}
+
+void QAbstractProxyModelPrivate::_q_sourceModelColumnsRemoved(const QModelIndex &parent, int, int)
+{
+ if (parent.isValid())
+ return;
+ if (model->columnCount() == 0)
+ scheduleHeaderUpdate(Qt::Vertical);
+}
+
/*!
Constructs a proxy model with the given \a parent.
*/
@@ -131,15 +177,34 @@ void QAbstractProxyModel::setSourceModel(QAbstractItemModel *sourceModel)
d->model.removeBindingUnlessInWrapper();
// Special case to handle nullptr models. Otherwise we will have unwanted
// notifications.
- if (!sourceModel && d->model == QAbstractItemModelPrivate::staticEmptyModel())
+ const QAbstractItemModel *currentModel = d->model.valueBypassingBindings();
+ if (!sourceModel && currentModel == QAbstractItemModelPrivate::staticEmptyModel())
return;
- if (sourceModel != d->model) {
- if (d->model)
- disconnect(d->model, SIGNAL(destroyed()), this, SLOT(_q_sourceModelDestroyed()));
+ static const struct {
+ const char *signalName;
+ const char *slotName;
+ } connectionTable[] = {
+ // clang-format off
+ { SIGNAL(destroyed()), SLOT(_q_sourceModelDestroyed()) },
+ { SIGNAL(rowsAboutToBeInserted(QModelIndex,int,int)), SLOT(_q_sourceModelRowsAboutToBeInserted(QModelIndex,int,int)) },
+ { SIGNAL(rowsInserted(QModelIndex,int,int)), SLOT(_q_sourceModelRowsInserted(QModelIndex,int,int)) },
+ { SIGNAL(rowsRemoved(QModelIndex,int,int)), SLOT(_q_sourceModelRowsRemoved(QModelIndex,int,int)) },
+ { SIGNAL(columnsAboutToBeInserted(QModelIndex,int,int)), SLOT(_q_sourceModelColumnsAboutToBeInserted(QModelIndex,int,int)) },
+ { SIGNAL(columnsInserted(QModelIndex,int,int)), SLOT(_q_sourceModelColumnsInserted(QModelIndex,int,int)) },
+ { SIGNAL(columnsRemoved(QModelIndex,int,int)), SLOT(_q_sourceModelColumnsRemoved(QModelIndex,int,int)) }
+ // clang-format on
+ };
+
+ if (sourceModel != currentModel) {
+ if (currentModel) {
+ for (const auto &c : connectionTable)
+ disconnect(currentModel, c.signalName, this, c.slotName);
+ }
if (sourceModel) {
d->model.setValueBypassingBindings(sourceModel);
- connect(d->model, SIGNAL(destroyed()), this, SLOT(_q_sourceModelDestroyed()));
+ for (const auto &c : connectionTable)
+ connect(sourceModel, c.signalName, this, c.slotName);
} else {
d->model.setValueBypassingBindings(QAbstractItemModelPrivate::staticEmptyModel());
}
@@ -252,13 +317,17 @@ QVariant QAbstractProxyModel::data(const QModelIndex &proxyIndex, int role) cons
QVariant QAbstractProxyModel::headerData(int section, Qt::Orientation orientation, int role) const
{
Q_D(const QAbstractProxyModel);
- int sourceSection;
+ int sourceSection = section;
if (orientation == Qt::Horizontal) {
- const QModelIndex proxyIndex = index(0, section);
- sourceSection = mapToSource(proxyIndex).column();
+ if (rowCount() > 0) {
+ const QModelIndex proxyIndex = index(0, section);
+ sourceSection = mapToSource(proxyIndex).column();
+ }
} else {
- const QModelIndex proxyIndex = index(section, 0);
- sourceSection = mapToSource(proxyIndex).row();
+ if (columnCount() > 0) {
+ const QModelIndex proxyIndex = index(section, 0);
+ sourceSection = mapToSource(proxyIndex).row();
+ }
}
return d->model->headerData(sourceSection, orientation, role);
}
@@ -395,7 +464,7 @@ QMimeData* QAbstractProxyModel::mimeData(const QModelIndexList &indexes) const
{
Q_D(const QAbstractProxyModel);
QModelIndexList list;
- list.reserve(indexes.count());
+ list.reserve(indexes.size());
for (const QModelIndex &index : indexes)
list << mapToSource(index);
return d->model->mimeData(list);
diff --git a/src/corelib/itemmodels/qabstractproxymodel.h b/src/corelib/itemmodels/qabstractproxymodel.h
index bb8c5400dc..8652f500df 100644
--- a/src/corelib/itemmodels/qabstractproxymodel.h
+++ b/src/corelib/itemmodels/qabstractproxymodel.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QABSTRACTPROXYMODEL_H
#define QABSTRACTPROXYMODEL_H
@@ -111,6 +75,12 @@ private:
Q_DECLARE_PRIVATE(QAbstractProxyModel)
Q_DISABLE_COPY(QAbstractProxyModel)
Q_PRIVATE_SLOT(d_func(), void _q_sourceModelDestroyed())
+ Q_PRIVATE_SLOT(d_func(), void _q_sourceModelRowsAboutToBeInserted(QModelIndex, int, int))
+ Q_PRIVATE_SLOT(d_func(), void _q_sourceModelRowsInserted(QModelIndex, int, int))
+ Q_PRIVATE_SLOT(d_func(), void _q_sourceModelRowsRemoved(QModelIndex, int, int))
+ Q_PRIVATE_SLOT(d_func(), void _q_sourceModelColumnsAboutToBeInserted(QModelIndex, int, int))
+ Q_PRIVATE_SLOT(d_func(), void _q_sourceModelColumnsInserted(QModelIndex, int, int))
+ Q_PRIVATE_SLOT(d_func(), void _q_sourceModelColumnsRemoved(QModelIndex, int, int))
};
QT_END_NAMESPACE
diff --git a/src/corelib/itemmodels/qabstractproxymodel_p.h b/src/corelib/itemmodels/qabstractproxymodel_p.h
index 2ddd2428dc..d33666d00b 100644
--- a/src/corelib/itemmodels/qabstractproxymodel_p.h
+++ b/src/corelib/itemmodels/qabstractproxymodel_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QABSTRACTPROXYMODEL_P_H
#define QABSTRACTPROXYMODEL_P_H
@@ -52,6 +16,7 @@
//
//
+#include "qabstractproxymodel.h"
#include "private/qabstractitemmodel_p.h"
#include "private/qproperty_p.h"
@@ -63,7 +28,13 @@ class Q_CORE_EXPORT QAbstractProxyModelPrivate : public QAbstractItemModelPrivat
{
Q_DECLARE_PUBLIC(QAbstractProxyModel)
public:
- QAbstractProxyModelPrivate() : QAbstractItemModelPrivate() { }
+ QAbstractProxyModelPrivate()
+ : QAbstractItemModelPrivate(),
+ sourceHadZeroRows(false),
+ sourceHadZeroColumns(false),
+ updateVerticalHeader(false),
+ updateHorizontalHeader(false)
+ {}
void setModelForwarder(QAbstractItemModel *sourceModel)
{
q_func()->setSourceModel(sourceModel);
@@ -79,8 +50,23 @@ public:
&QAbstractProxyModelPrivate::modelChangedForwarder,
&QAbstractProxyModelPrivate::getModelForwarder, nullptr)
virtual void _q_sourceModelDestroyed();
+ void _q_sourceModelRowsAboutToBeInserted(const QModelIndex &parent, int first, int last);
+ void _q_sourceModelRowsInserted(const QModelIndex &parent, int first, int last);
+ void _q_sourceModelRowsRemoved(const QModelIndex &parent, int first, int last);
+ void _q_sourceModelColumnsAboutToBeInserted(const QModelIndex &parent, int first, int last);
+ void _q_sourceModelColumnsInserted(const QModelIndex &parent, int first, int last);
+ void _q_sourceModelColumnsRemoved(const QModelIndex &parent, int first, int last);
+
void mapDropCoordinatesToSource(int row, int column, const QModelIndex &parent,
int *source_row, int *source_column, QModelIndex *source_parent) const;
+
+ void scheduleHeaderUpdate(Qt::Orientation orientation);
+ void emitHeaderDataChanged();
+
+ unsigned int sourceHadZeroRows : 1;
+ unsigned int sourceHadZeroColumns : 1;
+ unsigned int updateVerticalHeader : 1;
+ unsigned int updateHorizontalHeader : 1;
};
QT_END_NAMESPACE
diff --git a/src/corelib/itemmodels/qconcatenatetablesproxymodel.cpp b/src/corelib/itemmodels/qconcatenatetablesproxymodel.cpp
index 72ff6c1f36..3a49d37cff 100644
--- a/src/corelib/itemmodels/qconcatenatetablesproxymodel.cpp
+++ b/src/corelib/itemmodels/qconcatenatetablesproxymodel.cpp
@@ -1,45 +1,10 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author David Faure <david.faure@kdab.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author David Faure <david.faure@kdab.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qconcatenatetablesproxymodel.h"
#include <private/qabstractitemmodel_p.h>
#include "qsize.h"
+#include "qmap.h"
#include "qdebug.h"
QT_BEGIN_NAMESPACE
@@ -61,26 +26,43 @@ public:
};
SourceModelForRowResult sourceModelForRow(int row) const;
- void _q_slotRowsAboutToBeInserted(const QModelIndex &, int start, int end);
- void _q_slotRowsInserted(const QModelIndex &, int start, int end);
- void _q_slotRowsAboutToBeRemoved(const QModelIndex &, int start, int end);
- void _q_slotRowsRemoved(const QModelIndex &, int start, int end);
- void _q_slotColumnsAboutToBeInserted(const QModelIndex &parent, int start, int end);
- void _q_slotColumnsInserted(const QModelIndex &parent, int, int);
- void _q_slotColumnsAboutToBeRemoved(const QModelIndex &parent, int start, int end);
- void _q_slotColumnsRemoved(const QModelIndex &parent, int, int);
- void _q_slotDataChanged(const QModelIndex &from, const QModelIndex &to, const QList<int> &roles);
- void _q_slotSourceLayoutAboutToBeChanged(const QList<QPersistentModelIndex> &sourceParents, QAbstractItemModel::LayoutChangeHint hint);
- void _q_slotSourceLayoutChanged(const QList<QPersistentModelIndex> &sourceParents, QAbstractItemModel::LayoutChangeHint hint);
- void _q_slotModelAboutToBeReset();
- void _q_slotModelReset();
+ void slotRowsAboutToBeInserted(const QModelIndex &, int start, int end);
+ void slotRowsInserted(const QModelIndex &, int start, int end);
+ void slotRowsAboutToBeRemoved(const QModelIndex &, int start, int end);
+ void slotRowsRemoved(const QModelIndex &, int start, int end);
+ void slotColumnsAboutToBeInserted(const QModelIndex &parent, int start, int end);
+ void slotColumnsInserted(const QModelIndex &parent, int, int);
+ void slotColumnsAboutToBeRemoved(const QModelIndex &parent, int start, int end);
+ void slotColumnsRemoved(const QModelIndex &parent, int, int);
+ void slotDataChanged(const QModelIndex &from, const QModelIndex &to, const QList<int> &roles);
+ void slotSourceLayoutAboutToBeChanged(const QList<QPersistentModelIndex> &sourceParents, QAbstractItemModel::LayoutChangeHint hint);
+ void slotSourceLayoutChanged(const QList<QPersistentModelIndex> &sourceParents, QAbstractItemModel::LayoutChangeHint hint);
+ void slotModelAboutToBeReset();
+ void slotModelReset();
int columnCountAfterChange(const QAbstractItemModel *model, int newCount) const;
int calculatedColumnCount() const;
void updateColumnCount();
bool mapDropCoordinatesToSource(int row, int column, const QModelIndex &parent,
int *sourceRow, int *sourceColumn, QModelIndex *sourceParent, QAbstractItemModel **sourceModel) const;
- QList<QAbstractItemModel *> m_models;
+ struct ModelInfo {
+ using ConnArray = std::array<QMetaObject::Connection, 13>;
+ ModelInfo(QAbstractItemModel *m, ConnArray &&con)
+ : model(m), connections(std::move(con)) {}
+ QAbstractItemModel *model = nullptr;
+ ConnArray connections;
+ };
+ QList<ModelInfo> m_models;
+
+ QList<ModelInfo>::const_iterator findSourceModel(const QAbstractItemModel *m) const
+ {
+ auto byModelPtr = [m](const auto &modInfo) { return modInfo.model == m; };
+ return std::find_if(m_models.cbegin(), m_models.cend(), byModelPtr);
+ }
+
+ bool containsSourceModel(const QAbstractItemModel *m) const
+ { return findSourceModel(m) != m_models.cend(); }
+
int m_rowCount; // have to maintain it here since we can't compute during model destruction
int m_columnCount;
@@ -151,7 +133,7 @@ QModelIndex QConcatenateTablesProxyModel::mapFromSource(const QModelIndex &sourc
if (!sourceIndex.isValid())
return QModelIndex();
const QAbstractItemModel *sourceModel = sourceIndex.model();
- if (!d->m_models.contains(const_cast<QAbstractItemModel *>(sourceModel))) {
+ if (!d->containsSourceModel(sourceModel)) {
qWarning("QConcatenateTablesProxyModel: index from wrong model passed to mapFromSource");
Q_ASSERT(!"QConcatenateTablesProxyModel: index from wrong model passed to mapFromSource");
return QModelIndex();
@@ -243,7 +225,7 @@ Qt::ItemFlags QConcatenateTablesProxyModel::flags(const QModelIndex &index) cons
return Qt::NoItemFlags;
Q_ASSERT(checkIndex(index));
if (!index.isValid())
- return d->m_models.at(0)->flags(index);
+ return d->m_models.at(0).model->flags(index);
const QModelIndex sourceIndex = mapToSource(index);
Q_ASSERT(sourceIndex.isValid());
return sourceIndex.model()->flags(sourceIndex);
@@ -261,7 +243,7 @@ QVariant QConcatenateTablesProxyModel::headerData(int section, Qt::Orientation o
return QVariant();
switch (orientation) {
case Qt::Horizontal:
- return d->m_models.at(0)->headerData(section, orientation, role);
+ return d->m_models.at(0).model->headerData(section, orientation, role);
case Qt::Vertical: {
const auto result = d->sourceModelForRow(section);
Q_ASSERT(result.sourceModel);
@@ -327,7 +309,7 @@ QStringList QConcatenateTablesProxyModel::mimeTypes() const
Q_D(const QConcatenateTablesProxyModel);
if (d->m_models.isEmpty())
return QStringList();
- return d->m_models.at(0)->mimeTypes();
+ return d->m_models.at(0).model->mimeTypes();
}
/*!
@@ -350,7 +332,7 @@ QMimeData *QConcatenateTablesProxyModel::mimeData(const QModelIndexList &indexes
Q_ASSERT(checkIndex(firstIndex, CheckIndexOption::IndexIsValid));
const auto result = d->sourceModelForRow(firstIndex.row());
QModelIndexList sourceIndexes;
- sourceIndexes.reserve(indexes.count());
+ sourceIndexes.reserve(indexes.size());
for (const QModelIndex &index : indexes) {
const QModelIndex sourceIndex = mapToSource(index);
Q_ASSERT(sourceIndex.model() == result.sourceModel); // see documentation above
@@ -369,7 +351,7 @@ bool QConcatenateTablesProxyModelPrivate::mapDropCoordinatesToSource(int row, in
// Drop after the last item
if (row == -1 || row == m_rowCount) {
*sourceRow = -1;
- *sourceModel = m_models.constLast();
+ *sourceModel = m_models.constLast().model;
return true;
}
// Drop between toplevel items
@@ -455,7 +437,11 @@ QSize QConcatenateTablesProxyModel::span(const QModelIndex &index) const
QList<QAbstractItemModel *> QConcatenateTablesProxyModel::sourceModels() const
{
Q_D(const QConcatenateTablesProxyModel);
- return d->m_models.toList();
+ QList<QAbstractItemModel *> ret;
+ ret.reserve(d->m_models.size());
+ for (const auto &info : d->m_models)
+ ret.push_back(info.model);
+ return ret;
}
/*!
@@ -469,30 +455,42 @@ void QConcatenateTablesProxyModel::addSourceModel(QAbstractItemModel *sourceMode
{
Q_D(QConcatenateTablesProxyModel);
Q_ASSERT(sourceModel);
- Q_ASSERT(!d->m_models.contains(sourceModel));
- connect(sourceModel, SIGNAL(dataChanged(QModelIndex,QModelIndex,QList<int>)), this, SLOT(_q_slotDataChanged(QModelIndex,QModelIndex,QList<int>)));
- connect(sourceModel, SIGNAL(rowsInserted(QModelIndex,int,int)), this, SLOT(_q_slotRowsInserted(QModelIndex,int,int)));
- connect(sourceModel, SIGNAL(rowsRemoved(QModelIndex,int,int)), this, SLOT(_q_slotRowsRemoved(QModelIndex,int,int)));
- connect(sourceModel, SIGNAL(rowsAboutToBeInserted(QModelIndex,int,int)), this, SLOT(_q_slotRowsAboutToBeInserted(QModelIndex,int,int)));
- connect(sourceModel, SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int)), this, SLOT(_q_slotRowsAboutToBeRemoved(QModelIndex,int,int)));
-
- connect(sourceModel, SIGNAL(columnsInserted(QModelIndex,int,int)), this, SLOT(_q_slotColumnsInserted(QModelIndex,int,int)));
- connect(sourceModel, SIGNAL(columnsRemoved(QModelIndex,int,int)), this, SLOT(_q_slotColumnsRemoved(QModelIndex,int,int)));
- connect(sourceModel, SIGNAL(columnsAboutToBeInserted(QModelIndex,int,int)), this, SLOT(_q_slotColumnsAboutToBeInserted(QModelIndex,int,int)));
- connect(sourceModel, SIGNAL(columnsAboutToBeRemoved(QModelIndex,int,int)), this, SLOT(_q_slotColumnsAboutToBeRemoved(QModelIndex,int,int)));
-
- connect(sourceModel, SIGNAL(layoutAboutToBeChanged(QList<QPersistentModelIndex>, QAbstractItemModel::LayoutChangeHint)),
- this, SLOT(_q_slotSourceLayoutAboutToBeChanged(QList<QPersistentModelIndex>, QAbstractItemModel::LayoutChangeHint)));
- connect(sourceModel, SIGNAL(layoutChanged(QList<QPersistentModelIndex>, QAbstractItemModel::LayoutChangeHint)),
- this, SLOT(_q_slotSourceLayoutChanged(QList<QPersistentModelIndex>, QAbstractItemModel::LayoutChangeHint)));
- connect(sourceModel, SIGNAL(modelAboutToBeReset()), this, SLOT(_q_slotModelAboutToBeReset()));
- connect(sourceModel, SIGNAL(modelReset()), this, SLOT(_q_slotModelReset()));
+ Q_ASSERT(!d->containsSourceModel(sourceModel));
const int newRows = sourceModel->rowCount();
if (newRows > 0)
beginInsertRows(QModelIndex(), d->m_rowCount, d->m_rowCount + newRows - 1);
d->m_rowCount += newRows;
- d->m_models.append(sourceModel);
+ d->m_models.emplace_back(sourceModel, std::array{
+ QObjectPrivate::connect(sourceModel, &QAbstractItemModel::dataChanged,
+ d, &QConcatenateTablesProxyModelPrivate::slotDataChanged),
+ QObjectPrivate::connect(sourceModel, &QAbstractItemModel::rowsInserted,
+ d, &QConcatenateTablesProxyModelPrivate::slotRowsInserted),
+ QObjectPrivate::connect(sourceModel, &QAbstractItemModel::rowsRemoved,
+ d, &QConcatenateTablesProxyModelPrivate::slotRowsRemoved),
+ QObjectPrivate::connect(sourceModel, &QAbstractItemModel::rowsAboutToBeInserted,
+ d, &QConcatenateTablesProxyModelPrivate::slotRowsAboutToBeInserted),
+ QObjectPrivate::connect(sourceModel, &QAbstractItemModel::rowsAboutToBeRemoved,
+ d, &QConcatenateTablesProxyModelPrivate::slotRowsAboutToBeRemoved),
+
+ QObjectPrivate::connect(sourceModel, &QAbstractItemModel::columnsInserted,
+ d, &QConcatenateTablesProxyModelPrivate::slotColumnsInserted),
+ QObjectPrivate::connect(sourceModel, &QAbstractItemModel::columnsRemoved,
+ d, &QConcatenateTablesProxyModelPrivate::slotColumnsRemoved),
+ QObjectPrivate::connect(sourceModel, &QAbstractItemModel::columnsAboutToBeInserted,
+ d, &QConcatenateTablesProxyModelPrivate::slotColumnsAboutToBeInserted),
+ QObjectPrivate::connect(sourceModel, &QAbstractItemModel::columnsAboutToBeRemoved,
+ d, &QConcatenateTablesProxyModelPrivate::slotColumnsAboutToBeRemoved),
+
+ QObjectPrivate::connect(sourceModel, &QAbstractItemModel::layoutAboutToBeChanged,
+ d, &QConcatenateTablesProxyModelPrivate::slotSourceLayoutAboutToBeChanged),
+ QObjectPrivate::connect(sourceModel, &QAbstractItemModel::layoutChanged,
+ d, &QConcatenateTablesProxyModelPrivate::slotSourceLayoutChanged),
+ QObjectPrivate::connect(sourceModel, &QAbstractItemModel::modelAboutToBeReset,
+ d, &QConcatenateTablesProxyModelPrivate::slotModelAboutToBeReset),
+ QObjectPrivate::connect(sourceModel, &QAbstractItemModel::modelReset,
+ d, &QConcatenateTablesProxyModelPrivate::slotModelReset),
+ });
if (newRows > 0)
endInsertRows();
@@ -507,15 +505,18 @@ void QConcatenateTablesProxyModel::addSourceModel(QAbstractItemModel *sourceMode
void QConcatenateTablesProxyModel::removeSourceModel(QAbstractItemModel *sourceModel)
{
Q_D(QConcatenateTablesProxyModel);
- Q_ASSERT(d->m_models.contains(sourceModel));
- disconnect(sourceModel, nullptr, this, nullptr);
+
+ auto it = d->findSourceModel(sourceModel);
+ Q_ASSERT(it != d->m_models.cend());
+ for (auto &c : it->connections)
+ disconnect(c);
const int rowsRemoved = sourceModel->rowCount();
const int rowsPrior = d->computeRowsPrior(sourceModel); // location of removed section
if (rowsRemoved > 0)
beginRemoveRows(QModelIndex(), rowsPrior, rowsPrior + rowsRemoved - 1);
- d->m_models.removeOne(sourceModel);
+ d->m_models.erase(it);
d->m_rowCount -= rowsRemoved;
if (rowsRemoved > 0)
endRemoveRows();
@@ -523,7 +524,8 @@ void QConcatenateTablesProxyModel::removeSourceModel(QAbstractItemModel *sourceM
d->updateColumnCount();
}
-void QConcatenateTablesProxyModelPrivate::_q_slotRowsAboutToBeInserted(const QModelIndex &parent, int start, int end)
+void QConcatenateTablesProxyModelPrivate::slotRowsAboutToBeInserted(const QModelIndex &parent,
+ int start, int end)
{
Q_Q(QConcatenateTablesProxyModel);
if (parent.isValid()) // not supported, the proxy is a flat model
@@ -533,7 +535,8 @@ void QConcatenateTablesProxyModelPrivate::_q_slotRowsAboutToBeInserted(const QMo
q->beginInsertRows(QModelIndex(), rowsPrior + start, rowsPrior + end);
}
-void QConcatenateTablesProxyModelPrivate::_q_slotRowsInserted(const QModelIndex &parent, int start, int end)
+void QConcatenateTablesProxyModelPrivate::slotRowsInserted(const QModelIndex &parent, int start,
+ int end)
{
Q_Q(QConcatenateTablesProxyModel);
if (parent.isValid()) // flat model
@@ -542,7 +545,8 @@ void QConcatenateTablesProxyModelPrivate::_q_slotRowsInserted(const QModelIndex
q->endInsertRows();
}
-void QConcatenateTablesProxyModelPrivate::_q_slotRowsAboutToBeRemoved(const QModelIndex &parent, int start, int end)
+void QConcatenateTablesProxyModelPrivate::slotRowsAboutToBeRemoved(const QModelIndex &parent,
+ int start, int end)
{
Q_Q(QConcatenateTablesProxyModel);
if (parent.isValid()) // flat model
@@ -552,7 +556,7 @@ void QConcatenateTablesProxyModelPrivate::_q_slotRowsAboutToBeRemoved(const QMod
q->beginRemoveRows(QModelIndex(), rowsPrior + start, rowsPrior + end);
}
-void QConcatenateTablesProxyModelPrivate::_q_slotRowsRemoved(const QModelIndex &parent, int start, int end)
+void QConcatenateTablesProxyModelPrivate::slotRowsRemoved(const QModelIndex &parent, int start, int end)
{
Q_Q(QConcatenateTablesProxyModel);
if (parent.isValid()) // flat model
@@ -561,7 +565,8 @@ void QConcatenateTablesProxyModelPrivate::_q_slotRowsRemoved(const QModelIndex &
q->endRemoveRows();
}
-void QConcatenateTablesProxyModelPrivate::_q_slotColumnsAboutToBeInserted(const QModelIndex &parent, int start, int end)
+void QConcatenateTablesProxyModelPrivate::slotColumnsAboutToBeInserted(const QModelIndex &parent,
+ int start, int end)
{
Q_Q(QConcatenateTablesProxyModel);
if (parent.isValid()) // flat model
@@ -577,7 +582,8 @@ void QConcatenateTablesProxyModelPrivate::_q_slotColumnsAboutToBeInserted(const
m_newColumnCount = newColCount;
}
-void QConcatenateTablesProxyModelPrivate::_q_slotColumnsInserted(const QModelIndex &parent, int start, int end)
+void QConcatenateTablesProxyModelPrivate::slotColumnsInserted(const QModelIndex &parent, int start,
+ int end)
{
Q_UNUSED(start);
Q_UNUSED(end);
@@ -590,7 +596,8 @@ void QConcatenateTablesProxyModelPrivate::_q_slotColumnsInserted(const QModelInd
}
}
-void QConcatenateTablesProxyModelPrivate::_q_slotColumnsAboutToBeRemoved(const QModelIndex &parent, int start, int end)
+void QConcatenateTablesProxyModelPrivate::slotColumnsAboutToBeRemoved(const QModelIndex &parent,
+ int start, int end)
{
Q_Q(QConcatenateTablesProxyModel);
if (parent.isValid()) // flat model
@@ -604,7 +611,8 @@ void QConcatenateTablesProxyModelPrivate::_q_slotColumnsAboutToBeRemoved(const Q
m_newColumnCount = newColCount;
}
-void QConcatenateTablesProxyModelPrivate::_q_slotColumnsRemoved(const QModelIndex &parent, int start, int end)
+void QConcatenateTablesProxyModelPrivate::slotColumnsRemoved(const QModelIndex &parent, int start,
+ int end)
{
Q_Q(QConcatenateTablesProxyModel);
Q_UNUSED(start);
@@ -617,7 +625,9 @@ void QConcatenateTablesProxyModelPrivate::_q_slotColumnsRemoved(const QModelInde
}
}
-void QConcatenateTablesProxyModelPrivate::_q_slotDataChanged(const QModelIndex &from, const QModelIndex &to, const QList<int> &roles)
+void QConcatenateTablesProxyModelPrivate::slotDataChanged(const QModelIndex &from,
+ const QModelIndex &to,
+ const QList<int> &roles)
{
Q_Q(QConcatenateTablesProxyModel);
Q_ASSERT(from.isValid());
@@ -634,7 +644,8 @@ void QConcatenateTablesProxyModelPrivate::_q_slotDataChanged(const QModelIndex &
emit q->dataChanged(myFrom, myTo, roles);
}
-void QConcatenateTablesProxyModelPrivate::_q_slotSourceLayoutAboutToBeChanged(const QList<QPersistentModelIndex> &sourceParents, QAbstractItemModel::LayoutChangeHint hint)
+void QConcatenateTablesProxyModelPrivate::slotSourceLayoutAboutToBeChanged(
+ const QList<QPersistentModelIndex> &sourceParents, QAbstractItemModel::LayoutChangeHint hint)
{
Q_Q(QConcatenateTablesProxyModel);
@@ -656,7 +667,8 @@ void QConcatenateTablesProxyModelPrivate::_q_slotSourceLayoutAboutToBeChanged(co
}
}
-void QConcatenateTablesProxyModelPrivate::_q_slotSourceLayoutChanged(const QList<QPersistentModelIndex> &sourceParents, QAbstractItemModel::LayoutChangeHint hint)
+void QConcatenateTablesProxyModelPrivate::slotSourceLayoutChanged(
+ const QList<QPersistentModelIndex> &sourceParents, QAbstractItemModel::LayoutChangeHint hint)
{
Q_Q(QConcatenateTablesProxyModel);
if (!sourceParents.isEmpty() && !sourceParents.contains(QModelIndex()))
@@ -673,20 +685,20 @@ void QConcatenateTablesProxyModelPrivate::_q_slotSourceLayoutChanged(const QList
emit q->layoutChanged({}, hint);
}
-void QConcatenateTablesProxyModelPrivate::_q_slotModelAboutToBeReset()
+void QConcatenateTablesProxyModelPrivate::slotModelAboutToBeReset()
{
Q_Q(QConcatenateTablesProxyModel);
- Q_ASSERT(m_models.contains(const_cast<QAbstractItemModel *>(static_cast<const QAbstractItemModel *>(q->sender()))));
+ Q_ASSERT(containsSourceModel(static_cast<QAbstractItemModel *>(q->sender())));
q->beginResetModel();
// A reset might reduce both rowCount and columnCount, and we can't notify of both at the same time,
// and notifying of one after the other leaves an intermediary invalid situation.
// So the only safe choice is to forward it as a full reset.
}
-void QConcatenateTablesProxyModelPrivate::_q_slotModelReset()
+void QConcatenateTablesProxyModelPrivate::slotModelReset()
{
Q_Q(QConcatenateTablesProxyModel);
- Q_ASSERT(m_models.contains(const_cast<QAbstractItemModel *>(static_cast<const QAbstractItemModel *>(q->sender()))));
+ Q_ASSERT(containsSourceModel(static_cast<QAbstractItemModel *>(q->sender())));
m_columnCount = calculatedColumnCount();
m_rowCount = computeRowsPrior(nullptr);
q->endResetModel();
@@ -697,10 +709,11 @@ int QConcatenateTablesProxyModelPrivate::calculatedColumnCount() const
if (m_models.isEmpty())
return 0;
- const auto it = std::min_element(m_models.begin(), m_models.end(), [](const QAbstractItemModel* model1, const QAbstractItemModel* model2) {
- return model1->columnCount() < model2->columnCount();
- });
- return (*it)->columnCount();
+ auto byColumnCount = [](const auto &a, const auto &b) {
+ return a.model->columnCount() < b.model->columnCount();
+ };
+ const auto it = std::min_element(m_models.begin(), m_models.end(), byColumnCount);
+ return it->model->columnCount();
}
void QConcatenateTablesProxyModelPrivate::updateColumnCount()
@@ -723,8 +736,8 @@ void QConcatenateTablesProxyModelPrivate::updateColumnCount()
int QConcatenateTablesProxyModelPrivate::columnCountAfterChange(const QAbstractItemModel *model, int newCount) const
{
int newColumnCount = 0;
- for (int i = 0; i < m_models.count(); ++i) {
- const QAbstractItemModel *mod = m_models.at(i);
+ for (qsizetype i = 0; i < m_models.size(); ++i) {
+ const QAbstractItemModel *mod = m_models.at(i).model;
const int colCount = mod == model ? newCount : mod->columnCount();
if (i == 0)
newColumnCount = colCount;
@@ -737,7 +750,7 @@ int QConcatenateTablesProxyModelPrivate::columnCountAfterChange(const QAbstractI
int QConcatenateTablesProxyModelPrivate::computeRowsPrior(const QAbstractItemModel *sourceModel) const
{
int rowsPrior = 0;
- for (const QAbstractItemModel *model : m_models) {
+ for (const auto &[model, _] : m_models) {
if (model == sourceModel)
break;
rowsPrior += model->rowCount();
@@ -749,7 +762,7 @@ QConcatenateTablesProxyModelPrivate::SourceModelForRowResult QConcatenateTablesP
{
QConcatenateTablesProxyModelPrivate::SourceModelForRowResult result;
int rowCount = 0;
- for (QAbstractItemModel *model : m_models) {
+ for (const auto &[model, _] : m_models) {
const int subRowCount = model->rowCount();
if (rowCount + subRowCount > row) {
result.sourceModel = model;
diff --git a/src/corelib/itemmodels/qconcatenatetablesproxymodel.h b/src/corelib/itemmodels/qconcatenatetablesproxymodel.h
index a119bab098..9dbebd7b88 100644
--- a/src/corelib/itemmodels/qconcatenatetablesproxymodel.h
+++ b/src/corelib/itemmodels/qconcatenatetablesproxymodel.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author David Faure <david.faure@kdab.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author David Faure <david.faure@kdab.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QCONCATENATEROWSPROXYMODEL_H
#define QCONCATENATEROWSPROXYMODEL_H
@@ -82,21 +46,6 @@ public:
private:
Q_DECLARE_PRIVATE(QConcatenateTablesProxyModel)
Q_DISABLE_COPY(QConcatenateTablesProxyModel)
-
- Q_PRIVATE_SLOT(d_func(), void _q_slotRowsAboutToBeInserted(const QModelIndex &, int start, int end))
- Q_PRIVATE_SLOT(d_func(), void _q_slotRowsInserted(const QModelIndex &, int start, int end))
- Q_PRIVATE_SLOT(d_func(), void _q_slotRowsAboutToBeRemoved(const QModelIndex &, int start, int end))
- Q_PRIVATE_SLOT(d_func(), void _q_slotRowsRemoved(const QModelIndex &, int start, int end))
- Q_PRIVATE_SLOT(d_func(), void _q_slotColumnsAboutToBeInserted(const QModelIndex &parent, int start, int end))
- Q_PRIVATE_SLOT(d_func(), void _q_slotColumnsInserted(const QModelIndex &parent, int, int))
- Q_PRIVATE_SLOT(d_func(), void _q_slotColumnsAboutToBeRemoved(const QModelIndex &parent, int start, int end))
- Q_PRIVATE_SLOT(d_func(), void _q_slotColumnsRemoved(const QModelIndex &parent, int, int))
- Q_PRIVATE_SLOT(d_func(),
- void _q_slotDataChanged(const QModelIndex &from, const QModelIndex &to, const QList<int> &roles))
- Q_PRIVATE_SLOT(d_func(), void _q_slotSourceLayoutAboutToBeChanged(QList<QPersistentModelIndex>, QAbstractItemModel::LayoutChangeHint))
- Q_PRIVATE_SLOT(d_func(), void _q_slotSourceLayoutChanged(const QList<QPersistentModelIndex> &, QAbstractItemModel::LayoutChangeHint))
- Q_PRIVATE_SLOT(d_func(), void _q_slotModelAboutToBeReset())
- Q_PRIVATE_SLOT(d_func(), void _q_slotModelReset())
};
QT_END_NAMESPACE
diff --git a/src/corelib/itemmodels/qidentityproxymodel.cpp b/src/corelib/itemmodels/qidentityproxymodel.cpp
index 6111cef993..89fa7e5c07 100644
--- a/src/corelib/itemmodels/qidentityproxymodel.cpp
+++ b/src/corelib/itemmodels/qidentityproxymodel.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Stephen Kelly <stephen.kelly@kdab.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2011 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Stephen Kelly <stephen.kelly@kdab.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qidentityproxymodel.h"
#include "qidentityproxymodel_p.h"
@@ -180,7 +144,7 @@ QItemSelection QIdentityProxyModel::mapSelectionFromSource(const QItemSelection&
QItemSelection::const_iterator it = selection.constBegin();
const QItemSelection::const_iterator end = selection.constEnd();
- proxySelection.reserve(selection.count());
+ proxySelection.reserve(selection.size());
for ( ; it != end; ++it) {
Q_ASSERT(it->model() == d->model);
const QItemSelectionRange range(mapFromSource(it->topLeft()), mapFromSource(it->bottomRight()));
@@ -203,7 +167,7 @@ QItemSelection QIdentityProxyModel::mapSelectionToSource(const QItemSelection& s
QItemSelection::const_iterator it = selection.constBegin();
const QItemSelection::const_iterator end = selection.constEnd();
- sourceSelection.reserve(selection.count());
+ sourceSelection.reserve(selection.size());
for ( ; it != end; ++it) {
Q_ASSERT(it->model() == this);
const QItemSelectionRange range(mapToSource(it->topLeft()), mapToSource(it->bottomRight()));
@@ -239,7 +203,7 @@ QModelIndexList QIdentityProxyModel::match(const QModelIndex& start, int role, c
QModelIndexList::const_iterator it = sourceList.constBegin();
const QModelIndexList::const_iterator end = sourceList.constEnd();
QModelIndexList proxyList;
- proxyList.reserve(sourceList.count());
+ proxyList.reserve(sourceList.size());
for ( ; it != end; ++it)
proxyList.append(mapFromSource(*it));
return proxyList;
@@ -326,97 +290,108 @@ void QIdentityProxyModel::setSourceModel(QAbstractItemModel* newSourceModel)
{
beginResetModel();
- if (sourceModel()) {
- disconnect(sourceModel(), SIGNAL(rowsAboutToBeInserted(QModelIndex,int,int)),
- this, SLOT(_q_sourceRowsAboutToBeInserted(QModelIndex,int,int)));
- disconnect(sourceModel(), SIGNAL(rowsInserted(QModelIndex,int,int)),
- this, SLOT(_q_sourceRowsInserted(QModelIndex,int,int)));
- disconnect(sourceModel(), SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int)),
- this, SLOT(_q_sourceRowsAboutToBeRemoved(QModelIndex,int,int)));
- disconnect(sourceModel(), SIGNAL(rowsRemoved(QModelIndex,int,int)),
- this, SLOT(_q_sourceRowsRemoved(QModelIndex,int,int)));
- disconnect(sourceModel(), SIGNAL(rowsAboutToBeMoved(QModelIndex,int,int,QModelIndex,int)),
- this, SLOT(_q_sourceRowsAboutToBeMoved(QModelIndex,int,int,QModelIndex,int)));
- disconnect(sourceModel(), SIGNAL(rowsMoved(QModelIndex,int,int,QModelIndex,int)),
- this, SLOT(_q_sourceRowsMoved(QModelIndex,int,int,QModelIndex,int)));
- disconnect(sourceModel(), SIGNAL(columnsAboutToBeInserted(QModelIndex,int,int)),
- this, SLOT(_q_sourceColumnsAboutToBeInserted(QModelIndex,int,int)));
- disconnect(sourceModel(), SIGNAL(columnsInserted(QModelIndex,int,int)),
- this, SLOT(_q_sourceColumnsInserted(QModelIndex,int,int)));
- disconnect(sourceModel(), SIGNAL(columnsAboutToBeRemoved(QModelIndex,int,int)),
- this, SLOT(_q_sourceColumnsAboutToBeRemoved(QModelIndex,int,int)));
- disconnect(sourceModel(), SIGNAL(columnsRemoved(QModelIndex,int,int)),
- this, SLOT(_q_sourceColumnsRemoved(QModelIndex,int,int)));
- disconnect(sourceModel(), SIGNAL(columnsAboutToBeMoved(QModelIndex,int,int,QModelIndex,int)),
- this, SLOT(_q_sourceColumnsAboutToBeMoved(QModelIndex,int,int,QModelIndex,int)));
- disconnect(sourceModel(), SIGNAL(columnsMoved(QModelIndex,int,int,QModelIndex,int)),
- this, SLOT(_q_sourceColumnsMoved(QModelIndex,int,int,QModelIndex,int)));
- disconnect(sourceModel(), SIGNAL(modelAboutToBeReset()),
- this, SLOT(_q_sourceModelAboutToBeReset()));
- disconnect(sourceModel(), SIGNAL(modelReset()),
- this, SLOT(_q_sourceModelReset()));
- disconnect(sourceModel(), SIGNAL(dataChanged(QModelIndex,QModelIndex,QList<int>)),
- this, SLOT(_q_sourceDataChanged(QModelIndex,QModelIndex,QList<int>)));
- disconnect(sourceModel(), SIGNAL(headerDataChanged(Qt::Orientation,int,int)),
- this, SLOT(_q_sourceHeaderDataChanged(Qt::Orientation,int,int)));
- disconnect(sourceModel(), SIGNAL(layoutAboutToBeChanged(QList<QPersistentModelIndex>,QAbstractItemModel::LayoutChangeHint)),
- this, SLOT(_q_sourceLayoutAboutToBeChanged(QList<QPersistentModelIndex>,QAbstractItemModel::LayoutChangeHint)));
- disconnect(sourceModel(), SIGNAL(layoutChanged(QList<QPersistentModelIndex>,QAbstractItemModel::LayoutChangeHint)),
- this, SLOT(_q_sourceLayoutChanged(QList<QPersistentModelIndex>,QAbstractItemModel::LayoutChangeHint)));
- }
+ Q_D(QIdentityProxyModel);
+
+ // Call QObject::disconnect() unconditionally, if there is an existing source
+ // model, it's disconnected, and if there isn't, then calling disconnect() on
+ // a default-constructed Connection does nothing
+ for (const auto &c : d->m_sourceModelConnections)
+ QObject::disconnect(c);
QAbstractProxyModel::setSourceModel(newSourceModel);
if (sourceModel()) {
- connect(sourceModel(), SIGNAL(rowsAboutToBeInserted(QModelIndex,int,int)),
- SLOT(_q_sourceRowsAboutToBeInserted(QModelIndex,int,int)));
- connect(sourceModel(), SIGNAL(rowsInserted(QModelIndex,int,int)),
- SLOT(_q_sourceRowsInserted(QModelIndex,int,int)));
- connect(sourceModel(), SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int)),
- SLOT(_q_sourceRowsAboutToBeRemoved(QModelIndex,int,int)));
- connect(sourceModel(), SIGNAL(rowsRemoved(QModelIndex,int,int)),
- SLOT(_q_sourceRowsRemoved(QModelIndex,int,int)));
- connect(sourceModel(), SIGNAL(rowsAboutToBeMoved(QModelIndex,int,int,QModelIndex,int)),
- SLOT(_q_sourceRowsAboutToBeMoved(QModelIndex,int,int,QModelIndex,int)));
- connect(sourceModel(), SIGNAL(rowsMoved(QModelIndex,int,int,QModelIndex,int)),
- SLOT(_q_sourceRowsMoved(QModelIndex,int,int,QModelIndex,int)));
- connect(sourceModel(), SIGNAL(columnsAboutToBeInserted(QModelIndex,int,int)),
- SLOT(_q_sourceColumnsAboutToBeInserted(QModelIndex,int,int)));
- connect(sourceModel(), SIGNAL(columnsInserted(QModelIndex,int,int)),
- SLOT(_q_sourceColumnsInserted(QModelIndex,int,int)));
- connect(sourceModel(), SIGNAL(columnsAboutToBeRemoved(QModelIndex,int,int)),
- SLOT(_q_sourceColumnsAboutToBeRemoved(QModelIndex,int,int)));
- connect(sourceModel(), SIGNAL(columnsRemoved(QModelIndex,int,int)),
- SLOT(_q_sourceColumnsRemoved(QModelIndex,int,int)));
- connect(sourceModel(), SIGNAL(columnsAboutToBeMoved(QModelIndex,int,int,QModelIndex,int)),
- SLOT(_q_sourceColumnsAboutToBeMoved(QModelIndex,int,int,QModelIndex,int)));
- connect(sourceModel(), SIGNAL(columnsMoved(QModelIndex,int,int,QModelIndex,int)),
- SLOT(_q_sourceColumnsMoved(QModelIndex,int,int,QModelIndex,int)));
- connect(sourceModel(), SIGNAL(modelAboutToBeReset()),
- SLOT(_q_sourceModelAboutToBeReset()));
- connect(sourceModel(), SIGNAL(modelReset()),
- SLOT(_q_sourceModelReset()));
- connect(sourceModel(), SIGNAL(dataChanged(QModelIndex,QModelIndex,QList<int>)),
- SLOT(_q_sourceDataChanged(QModelIndex,QModelIndex,QList<int>)));
- connect(sourceModel(), SIGNAL(headerDataChanged(Qt::Orientation,int,int)),
- SLOT(_q_sourceHeaderDataChanged(Qt::Orientation,int,int)));
- connect(sourceModel(), SIGNAL(layoutAboutToBeChanged(QList<QPersistentModelIndex>,QAbstractItemModel::LayoutChangeHint)),
- SLOT(_q_sourceLayoutAboutToBeChanged(QList<QPersistentModelIndex>,QAbstractItemModel::LayoutChangeHint)));
- connect(sourceModel(), SIGNAL(layoutChanged(QList<QPersistentModelIndex>,QAbstractItemModel::LayoutChangeHint)),
- SLOT(_q_sourceLayoutChanged(QList<QPersistentModelIndex>,QAbstractItemModel::LayoutChangeHint)));
+ auto *m = sourceModel();
+ d->m_sourceModelConnections = {
+ QObjectPrivate::connect(m, &QAbstractItemModel::rowsAboutToBeInserted, d,
+ &QIdentityProxyModelPrivate::sourceRowsAboutToBeInserted),
+ QObjectPrivate::connect(m, &QAbstractItemModel::rowsInserted, d,
+ &QIdentityProxyModelPrivate::sourceRowsInserted),
+ QObjectPrivate::connect(m, &QAbstractItemModel::rowsAboutToBeRemoved, d,
+ &QIdentityProxyModelPrivate::sourceRowsAboutToBeRemoved),
+ QObjectPrivate::connect(m, &QAbstractItemModel::rowsRemoved, d,
+ &QIdentityProxyModelPrivate::sourceRowsRemoved),
+ QObjectPrivate::connect(m, &QAbstractItemModel::rowsAboutToBeMoved, d,
+ &QIdentityProxyModelPrivate::sourceRowsAboutToBeMoved),
+ QObjectPrivate::connect(m, &QAbstractItemModel::rowsMoved, d,
+ &QIdentityProxyModelPrivate::sourceRowsMoved),
+ QObjectPrivate::connect(m, &QAbstractItemModel::columnsAboutToBeInserted, d,
+ &QIdentityProxyModelPrivate::sourceColumnsAboutToBeInserted),
+ QObjectPrivate::connect(m, &QAbstractItemModel::columnsInserted, d,
+ &QIdentityProxyModelPrivate::sourceColumnsInserted),
+ QObjectPrivate::connect(m, &QAbstractItemModel::columnsAboutToBeRemoved, d,
+ &QIdentityProxyModelPrivate::sourceColumnsAboutToBeRemoved),
+ QObjectPrivate::connect(m, &QAbstractItemModel::columnsRemoved, d,
+ &QIdentityProxyModelPrivate::sourceColumnsRemoved),
+ QObjectPrivate::connect(m, &QAbstractItemModel::columnsAboutToBeMoved, d,
+ &QIdentityProxyModelPrivate::sourceColumnsAboutToBeMoved),
+ QObjectPrivate::connect(m, &QAbstractItemModel::columnsMoved, d,
+ &QIdentityProxyModelPrivate::sourceColumnsMoved),
+ QObjectPrivate::connect(m, &QAbstractItemModel::modelAboutToBeReset, d,
+ &QIdentityProxyModelPrivate::sourceModelAboutToBeReset),
+ QObjectPrivate::connect(m, &QAbstractItemModel::modelReset, d,
+ &QIdentityProxyModelPrivate::sourceModelReset),
+ QObjectPrivate::connect(m, &QAbstractItemModel::dataChanged, d,
+ &QIdentityProxyModelPrivate::sourceDataChanged),
+ QObjectPrivate::connect(m, &QAbstractItemModel::headerDataChanged, d,
+ &QIdentityProxyModelPrivate::sourceHeaderDataChanged),
+ };
+
+ if (d->m_handleLayoutChanges) {
+ d->m_sourceModelConnections.emplace_back(
+ QObjectPrivate::connect(m, &QAbstractItemModel::layoutAboutToBeChanged, d,
+ &QIdentityProxyModelPrivate::sourceLayoutAboutToBeChanged));
+ d->m_sourceModelConnections.emplace_back(
+ QObjectPrivate::connect(m, &QAbstractItemModel::layoutChanged, d,
+ &QIdentityProxyModelPrivate::sourceLayoutChanged));
+ }
}
endResetModel();
}
-void QIdentityProxyModelPrivate::_q_sourceColumnsAboutToBeInserted(const QModelIndex &parent, int start, int end)
+/*!
+ \since 6.7
+
+ If \a b is \c true, this proxy model will handle the source model layout
+ changes (by connecting to \c QAbstractItemModel::layoutAboutToBeChanged
+ and \c QAbstractItemModel::layoutChanged singals).
+
+ The default is for this proxy model to handle the source model layout
+ changes.
+
+ In sub-classes of QIdentityProxyModel, it may be useful to set this to
+ \c false if you need to specially handle the source model layout changes.
+
+ \note Calling this method will only have an effect after calling setSourceModel().
+*/
+void QIdentityProxyModel::setHandleSourceLayoutChanges(bool b)
+{
+ d_func()->m_handleLayoutChanges = b;
+}
+
+/*!
+ \since 6.7
+
+ Returns \c true if this proxy model handles the source model layout
+ changes, otherwise returns \c false.
+*/
+bool QIdentityProxyModel::isHandleSourceLayoutChanges() const
+{
+ return d_func()->m_handleLayoutChanges;
+}
+
+void QIdentityProxyModelPrivate::sourceColumnsAboutToBeInserted(const QModelIndex &parent, int start, int end)
{
Q_ASSERT(parent.isValid() ? parent.model() == model : true);
Q_Q(QIdentityProxyModel);
q->beginInsertColumns(q->mapFromSource(parent), start, end);
}
-void QIdentityProxyModelPrivate::_q_sourceColumnsAboutToBeMoved(const QModelIndex &sourceParent, int sourceStart, int sourceEnd, const QModelIndex &destParent, int dest)
+void QIdentityProxyModelPrivate::sourceColumnsAboutToBeMoved(const QModelIndex &sourceParent,
+ int sourceStart, int sourceEnd,
+ const QModelIndex &destParent,
+ int dest)
{
Q_ASSERT(sourceParent.isValid() ? sourceParent.model() == model : true);
Q_ASSERT(destParent.isValid() ? destParent.model() == model : true);
@@ -424,14 +399,14 @@ void QIdentityProxyModelPrivate::_q_sourceColumnsAboutToBeMoved(const QModelInde
q->beginMoveColumns(q->mapFromSource(sourceParent), sourceStart, sourceEnd, q->mapFromSource(destParent), dest);
}
-void QIdentityProxyModelPrivate::_q_sourceColumnsAboutToBeRemoved(const QModelIndex &parent, int start, int end)
+void QIdentityProxyModelPrivate::sourceColumnsAboutToBeRemoved(const QModelIndex &parent, int start, int end)
{
Q_ASSERT(parent.isValid() ? parent.model() == model : true);
Q_Q(QIdentityProxyModel);
q->beginRemoveColumns(q->mapFromSource(parent), start, end);
}
-void QIdentityProxyModelPrivate::_q_sourceColumnsInserted(const QModelIndex &parent, int start, int end)
+void QIdentityProxyModelPrivate::sourceColumnsInserted(const QModelIndex &parent, int start, int end)
{
Q_ASSERT(parent.isValid() ? parent.model() == model : true);
Q_Q(QIdentityProxyModel);
@@ -441,7 +416,9 @@ void QIdentityProxyModelPrivate::_q_sourceColumnsInserted(const QModelIndex &par
q->endInsertColumns();
}
-void QIdentityProxyModelPrivate::_q_sourceColumnsMoved(const QModelIndex &sourceParent, int sourceStart, int sourceEnd, const QModelIndex &destParent, int dest)
+void QIdentityProxyModelPrivate::sourceColumnsMoved(const QModelIndex &sourceParent,
+ int sourceStart, int sourceEnd,
+ const QModelIndex &destParent, int dest)
{
Q_ASSERT(sourceParent.isValid() ? sourceParent.model() == model : true);
Q_ASSERT(destParent.isValid() ? destParent.model() == model : true);
@@ -454,7 +431,7 @@ void QIdentityProxyModelPrivate::_q_sourceColumnsMoved(const QModelIndex &source
q->endMoveColumns();
}
-void QIdentityProxyModelPrivate::_q_sourceColumnsRemoved(const QModelIndex &parent, int start, int end)
+void QIdentityProxyModelPrivate::sourceColumnsRemoved(const QModelIndex &parent, int start, int end)
{
Q_ASSERT(parent.isValid() ? parent.model() == model : true);
Q_Q(QIdentityProxyModel);
@@ -464,7 +441,9 @@ void QIdentityProxyModelPrivate::_q_sourceColumnsRemoved(const QModelIndex &pare
q->endRemoveColumns();
}
-void QIdentityProxyModelPrivate::_q_sourceDataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QList<int> &roles)
+void QIdentityProxyModelPrivate::sourceDataChanged(const QModelIndex &topLeft,
+ const QModelIndex &bottomRight,
+ const QList<int> &roles)
{
Q_ASSERT(topLeft.isValid() ? topLeft.model() == model : true);
Q_ASSERT(bottomRight.isValid() ? bottomRight.model() == model : true);
@@ -472,13 +451,15 @@ void QIdentityProxyModelPrivate::_q_sourceDataChanged(const QModelIndex &topLeft
emit q->dataChanged(q->mapFromSource(topLeft), q->mapFromSource(bottomRight), roles);
}
-void QIdentityProxyModelPrivate::_q_sourceHeaderDataChanged(Qt::Orientation orientation, int first, int last)
+void QIdentityProxyModelPrivate::sourceHeaderDataChanged(Qt::Orientation orientation, int first,
+ int last)
{
Q_Q(QIdentityProxyModel);
emit q->headerDataChanged(orientation, first, last);
}
-void QIdentityProxyModelPrivate::_q_sourceLayoutAboutToBeChanged(const QList<QPersistentModelIndex> &sourceParents, QAbstractItemModel::LayoutChangeHint hint)
+void QIdentityProxyModelPrivate::sourceLayoutAboutToBeChanged(
+ const QList<QPersistentModelIndex> &sourceParents, QAbstractItemModel::LayoutChangeHint hint)
{
Q_Q(QIdentityProxyModel);
@@ -506,7 +487,8 @@ void QIdentityProxyModelPrivate::_q_sourceLayoutAboutToBeChanged(const QList<QPe
}
}
-void QIdentityProxyModelPrivate::_q_sourceLayoutChanged(const QList<QPersistentModelIndex> &sourceParents, QAbstractItemModel::LayoutChangeHint hint)
+void QIdentityProxyModelPrivate::sourceLayoutChanged(
+ const QList<QPersistentModelIndex> &sourceParents, QAbstractItemModel::LayoutChangeHint hint)
{
Q_Q(QIdentityProxyModel);
@@ -532,26 +514,29 @@ void QIdentityProxyModelPrivate::_q_sourceLayoutChanged(const QList<QPersistentM
emit q->layoutChanged(parents, hint);
}
-void QIdentityProxyModelPrivate::_q_sourceModelAboutToBeReset()
+void QIdentityProxyModelPrivate::sourceModelAboutToBeReset()
{
Q_Q(QIdentityProxyModel);
q->beginResetModel();
}
-void QIdentityProxyModelPrivate::_q_sourceModelReset()
+void QIdentityProxyModelPrivate::sourceModelReset()
{
Q_Q(QIdentityProxyModel);
q->endResetModel();
}
-void QIdentityProxyModelPrivate::_q_sourceRowsAboutToBeInserted(const QModelIndex &parent, int start, int end)
+void QIdentityProxyModelPrivate::sourceRowsAboutToBeInserted(const QModelIndex &parent, int start,
+ int end)
{
Q_ASSERT(parent.isValid() ? parent.model() == model : true);
Q_Q(QIdentityProxyModel);
q->beginInsertRows(q->mapFromSource(parent), start, end);
}
-void QIdentityProxyModelPrivate::_q_sourceRowsAboutToBeMoved(const QModelIndex &sourceParent, int sourceStart, int sourceEnd, const QModelIndex &destParent, int dest)
+void QIdentityProxyModelPrivate::sourceRowsAboutToBeMoved(const QModelIndex &sourceParent,
+ int sourceStart, int sourceEnd,
+ const QModelIndex &destParent, int dest)
{
Q_ASSERT(sourceParent.isValid() ? sourceParent.model() == model : true);
Q_ASSERT(destParent.isValid() ? destParent.model() == model : true);
@@ -559,14 +544,15 @@ void QIdentityProxyModelPrivate::_q_sourceRowsAboutToBeMoved(const QModelIndex &
q->beginMoveRows(q->mapFromSource(sourceParent), sourceStart, sourceEnd, q->mapFromSource(destParent), dest);
}
-void QIdentityProxyModelPrivate::_q_sourceRowsAboutToBeRemoved(const QModelIndex &parent, int start, int end)
+void QIdentityProxyModelPrivate::sourceRowsAboutToBeRemoved(const QModelIndex &parent, int start,
+ int end)
{
Q_ASSERT(parent.isValid() ? parent.model() == model : true);
Q_Q(QIdentityProxyModel);
q->beginRemoveRows(q->mapFromSource(parent), start, end);
}
-void QIdentityProxyModelPrivate::_q_sourceRowsInserted(const QModelIndex &parent, int start, int end)
+void QIdentityProxyModelPrivate::sourceRowsInserted(const QModelIndex &parent, int start, int end)
{
Q_ASSERT(parent.isValid() ? parent.model() == model : true);
Q_Q(QIdentityProxyModel);
@@ -576,7 +562,9 @@ void QIdentityProxyModelPrivate::_q_sourceRowsInserted(const QModelIndex &parent
q->endInsertRows();
}
-void QIdentityProxyModelPrivate::_q_sourceRowsMoved(const QModelIndex &sourceParent, int sourceStart, int sourceEnd, const QModelIndex &destParent, int dest)
+void QIdentityProxyModelPrivate::sourceRowsMoved(const QModelIndex &sourceParent, int sourceStart,
+ int sourceEnd, const QModelIndex &destParent,
+ int dest)
{
Q_ASSERT(sourceParent.isValid() ? sourceParent.model() == model : true);
Q_ASSERT(destParent.isValid() ? destParent.model() == model : true);
@@ -589,7 +577,7 @@ void QIdentityProxyModelPrivate::_q_sourceRowsMoved(const QModelIndex &sourcePar
q->endMoveRows();
}
-void QIdentityProxyModelPrivate::_q_sourceRowsRemoved(const QModelIndex &parent, int start, int end)
+void QIdentityProxyModelPrivate::sourceRowsRemoved(const QModelIndex &parent, int start, int end)
{
Q_ASSERT(parent.isValid() ? parent.model() == model : true);
Q_Q(QIdentityProxyModel);
diff --git a/src/corelib/itemmodels/qidentityproxymodel.h b/src/corelib/itemmodels/qidentityproxymodel.h
index ce2ac68f89..c8fc9d21b7 100644
--- a/src/corelib/itemmodels/qidentityproxymodel.h
+++ b/src/corelib/itemmodels/qidentityproxymodel.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Stephen Kelly <stephen.kelly@kdab.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2011 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Stephen Kelly <stephen.kelly@kdab.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QIDENTITYPROXYMODEL_H
@@ -80,34 +44,15 @@ public:
bool moveRows(const QModelIndex &sourceParent, int sourceRow, int count, const QModelIndex &destinationParent, int destinationChild) override;
bool moveColumns(const QModelIndex &sourceParent, int sourceColumn, int count, const QModelIndex &destinationParent, int destinationChild) override;
+ bool isHandleSourceLayoutChanges() const;
+
protected:
QIdentityProxyModel(QIdentityProxyModelPrivate &dd, QObject* parent);
+ void setHandleSourceLayoutChanges(bool);
private:
Q_DECLARE_PRIVATE(QIdentityProxyModel)
Q_DISABLE_COPY(QIdentityProxyModel)
-
- Q_PRIVATE_SLOT(d_func(), void _q_sourceRowsAboutToBeInserted(QModelIndex,int,int))
- Q_PRIVATE_SLOT(d_func(), void _q_sourceRowsInserted(QModelIndex,int,int))
- Q_PRIVATE_SLOT(d_func(), void _q_sourceRowsAboutToBeRemoved(QModelIndex,int,int))
- Q_PRIVATE_SLOT(d_func(), void _q_sourceRowsRemoved(QModelIndex,int,int))
- Q_PRIVATE_SLOT(d_func(), void _q_sourceRowsAboutToBeMoved(QModelIndex,int,int,QModelIndex,int))
- Q_PRIVATE_SLOT(d_func(), void _q_sourceRowsMoved(QModelIndex,int,int,QModelIndex,int))
-
- Q_PRIVATE_SLOT(d_func(), void _q_sourceColumnsAboutToBeInserted(QModelIndex,int,int))
- Q_PRIVATE_SLOT(d_func(), void _q_sourceColumnsInserted(QModelIndex,int,int))
- Q_PRIVATE_SLOT(d_func(), void _q_sourceColumnsAboutToBeRemoved(QModelIndex,int,int))
- Q_PRIVATE_SLOT(d_func(), void _q_sourceColumnsRemoved(QModelIndex,int,int))
- Q_PRIVATE_SLOT(d_func(), void _q_sourceColumnsAboutToBeMoved(QModelIndex,int,int,QModelIndex,int))
- Q_PRIVATE_SLOT(d_func(), void _q_sourceColumnsMoved(QModelIndex,int,int,QModelIndex,int))
-
- Q_PRIVATE_SLOT(d_func(), void _q_sourceDataChanged(QModelIndex, QModelIndex, QList<int>))
- Q_PRIVATE_SLOT(d_func(), void _q_sourceHeaderDataChanged(Qt::Orientation orientation, int first, int last))
-
- Q_PRIVATE_SLOT(d_func(), void _q_sourceLayoutAboutToBeChanged(const QList<QPersistentModelIndex> &sourceParents, QAbstractItemModel::LayoutChangeHint hint))
- Q_PRIVATE_SLOT(d_func(), void _q_sourceLayoutChanged(const QList<QPersistentModelIndex> &sourceParents, QAbstractItemModel::LayoutChangeHint hint))
- Q_PRIVATE_SLOT(d_func(), void _q_sourceModelAboutToBeReset())
- Q_PRIVATE_SLOT(d_func(), void _q_sourceModelReset())
};
QT_END_NAMESPACE
diff --git a/src/corelib/itemmodels/qidentityproxymodel_p.h b/src/corelib/itemmodels/qidentityproxymodel_p.h
index 7224f773cc..78e1f5316c 100644
--- a/src/corelib/itemmodels/qidentityproxymodel_p.h
+++ b/src/corelib/itemmodels/qidentityproxymodel_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Stephen Kelly <stephen.kelly@kdab.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Stephen Kelly <stephen.kelly@kdab.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QIDENTITYPROXYMODEL_P_H
#define QIDENTITYPROXYMODEL_P_H
@@ -69,28 +33,38 @@ public:
QList<QPersistentModelIndex> layoutChangePersistentIndexes;
QModelIndexList proxyIndexes;
- void _q_sourceRowsAboutToBeInserted(const QModelIndex &parent, int start, int end);
- void _q_sourceRowsInserted(const QModelIndex &parent, int start, int end);
- void _q_sourceRowsAboutToBeRemoved(const QModelIndex &parent, int start, int end);
- void _q_sourceRowsRemoved(const QModelIndex &parent, int start, int end);
- void _q_sourceRowsAboutToBeMoved(const QModelIndex &sourceParent, int sourceStart, int sourceEnd, const QModelIndex &destParent, int dest);
- void _q_sourceRowsMoved(const QModelIndex &sourceParent, int sourceStart, int sourceEnd, const QModelIndex &destParent, int dest);
+ void sourceRowsAboutToBeInserted(const QModelIndex &parent, int start, int end);
+ void sourceRowsInserted(const QModelIndex &parent, int start, int end);
+ void sourceRowsAboutToBeRemoved(const QModelIndex &parent, int start, int end);
+ void sourceRowsRemoved(const QModelIndex &parent, int start, int end);
+ void sourceRowsAboutToBeMoved(const QModelIndex &sourceParent, int sourceStart, int sourceEnd,
+ const QModelIndex &destParent, int dest);
+ void sourceRowsMoved(const QModelIndex &sourceParent, int sourceStart, int sourceEnd,
+ const QModelIndex &destParent, int dest);
- void _q_sourceColumnsAboutToBeInserted(const QModelIndex &parent, int start, int end);
- void _q_sourceColumnsInserted(const QModelIndex &parent, int start, int end);
- void _q_sourceColumnsAboutToBeRemoved(const QModelIndex &parent, int start, int end);
- void _q_sourceColumnsRemoved(const QModelIndex &parent, int start, int end);
- void _q_sourceColumnsAboutToBeMoved(const QModelIndex &sourceParent, int sourceStart, int sourceEnd, const QModelIndex &destParent, int dest);
- void _q_sourceColumnsMoved(const QModelIndex &sourceParent, int sourceStart, int sourceEnd, const QModelIndex &destParent, int dest);
+ void sourceColumnsAboutToBeInserted(const QModelIndex &parent, int start, int end);
+ void sourceColumnsInserted(const QModelIndex &parent, int start, int end);
+ void sourceColumnsAboutToBeRemoved(const QModelIndex &parent, int start, int end);
+ void sourceColumnsRemoved(const QModelIndex &parent, int start, int end);
+ void sourceColumnsAboutToBeMoved(const QModelIndex &sourceParent, int sourceStart,
+ int sourceEnd, const QModelIndex &destParent, int dest);
+ void sourceColumnsMoved(const QModelIndex &sourceParent, int sourceStart, int sourceEnd,
+ const QModelIndex &destParent, int dest);
- void _q_sourceDataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QList<int> &roles);
- void _q_sourceHeaderDataChanged(Qt::Orientation orientation, int first, int last);
+ void sourceDataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight,
+ const QList<int> &roles);
+ void sourceHeaderDataChanged(Qt::Orientation orientation, int first, int last);
- void _q_sourceLayoutAboutToBeChanged(const QList<QPersistentModelIndex> &sourceParents, QAbstractItemModel::LayoutChangeHint hint);
- void _q_sourceLayoutChanged(const QList<QPersistentModelIndex> &sourceParents, QAbstractItemModel::LayoutChangeHint hint);
- void _q_sourceModelAboutToBeReset();
- void _q_sourceModelReset();
+ void sourceLayoutAboutToBeChanged(const QList<QPersistentModelIndex> &sourceParents,
+ QAbstractItemModel::LayoutChangeHint hint);
+ void sourceLayoutChanged(const QList<QPersistentModelIndex> &sourceParents,
+ QAbstractItemModel::LayoutChangeHint hint);
+ void sourceModelAboutToBeReset();
+ void sourceModelReset();
+private:
+ bool m_handleLayoutChanges = true;
+ QVarLengthArray<QMetaObject::Connection, 18> m_sourceModelConnections;
};
QT_END_NAMESPACE
diff --git a/src/corelib/itemmodels/qitemselectionmodel.cpp b/src/corelib/itemmodels/qitemselectionmodel.cpp
index f144bf9357..6df60aaf61 100644
--- a/src/corelib/itemmodels/qitemselectionmodel.cpp
+++ b/src/corelib/itemmodels/qitemselectionmodel.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qitemselectionmodel.h"
#include "qitemselectionmodel_p.h"
@@ -43,6 +7,7 @@
#include <private/qitemselectionmodel_p.h>
#include <private/qabstractitemmodel_p.h>
#include <private/qduplicatetracker_p.h>
+#include <private/qoffsetstringarray_p.h>
#include <qdebug.h>
#include <algorithm>
@@ -50,6 +15,9 @@
QT_BEGIN_NAMESPACE
+QT_IMPL_METATYPE_EXTERN(QItemSelectionRange)
+QT_IMPL_METATYPE_EXTERN(QItemSelection)
+
/*!
\class QItemSelectionRange
\inmodule QtCore
@@ -59,6 +27,8 @@ QT_BEGIN_NAMESPACE
\ingroup model-view
+ \compares equality
+
A QItemSelectionRange contains information about a range of
selected items in a model. A range of items is a contiguous array
of model items, extending to cover a number of adjacent rows and
@@ -248,17 +218,17 @@ QItemSelectionRange QItemSelectionRange::intersected(const QItemSelectionRange &
}
/*!
- \fn bool QItemSelectionRange::operator==(const QItemSelectionRange &other) const
+ \fn bool QItemSelectionRange::operator==(const QItemSelectionRange &lhs, const QItemSelectionRange &rhs)
- Returns \c true if the selection range is exactly the same as the \a other
+ Returns \c true if \a lhs selection range is exactly the same as the \a rhs
range given; otherwise returns \c false.
*/
/*!
- \fn bool QItemSelectionRange::operator!=(const QItemSelectionRange &other) const
+ \fn bool QItemSelectionRange::operator!=(const QItemSelectionRange &lhs, const QItemSelectionRange &rhs)
- Returns \c true if the selection range differs from the \a other range given;
+ Returns \c true if \a lhs selection range differs from the \a rhs range given;
otherwise returns \c false.
*/
@@ -270,7 +240,7 @@ QItemSelectionRange QItemSelectionRange::intersected(const QItemSelectionRange &
*/
-static void rowLengthsFromRange(const QItemSelectionRange &range, QList<QPair<QPersistentModelIndex, uint>> &result)
+static void rowLengthsFromRange(const QItemSelectionRange &range, QList<std::pair<QPersistentModelIndex, uint>> &result)
{
if (range.isValid() && range.model()) {
const QModelIndex topLeft = range.topLeft();
@@ -281,7 +251,7 @@ static void rowLengthsFromRange(const QItemSelectionRange &range, QList<QPair<QP
// We don't need to keep track of ItemIsSelectable and ItemIsEnabled here. That is
// required in indexesFromRange() because that method is called from public API
// which requires the limitation.
- result.push_back(qMakePair(QPersistentModelIndex(topLeft.sibling(row, column)), width));
+ result.emplace_back(topLeft.sibling(row, column), width);
}
}
}
@@ -464,9 +434,9 @@ QModelIndexList QItemSelection::indexes() const
return qSelectionIndexes<QModelIndexList>(*this);
}
-static QList<QPair<QPersistentModelIndex, uint>> qSelectionPersistentRowLengths(const QItemSelection &sel)
+static QList<std::pair<QPersistentModelIndex, uint>> qSelectionPersistentRowLengths(const QItemSelection &sel)
{
- QList<QPair<QPersistentModelIndex, uint>> result;
+ QList<std::pair<QPersistentModelIndex, uint>> result;
for (const QItemSelectionRange &range : sel)
rowLengthsFromRange(range, result);
return result;
@@ -498,15 +468,15 @@ void QItemSelection::merge(const QItemSelection &other, QItemSelectionModel::Sel
if (!range.isValid())
continue;
newSelection.push_back(range);
- for (int t = 0; t < count(); ++t) {
+ for (int t = 0; t < size(); ++t) {
if (range.intersects(at(t)))
intersections.append(at(t).intersected(range));
}
}
// Split the old (and new) ranges using the intersections
- for (int i = 0; i < intersections.count(); ++i) { // for each intersection
- for (int t = 0; t < count();) { // splitt each old range
+ for (int i = 0; i < intersections.size(); ++i) { // for each intersection
+ for (int t = 0; t < size();) { // splitt each old range
if (at(t).intersects(intersections.at(i))) {
split(at(t), intersections.at(i), this);
removeAt(t);
@@ -515,7 +485,7 @@ void QItemSelection::merge(const QItemSelection &other, QItemSelectionModel::Sel
}
}
// only split newSelection if Toggle is specified
- for (int n = 0; (command & QItemSelectionModel::Toggle) && n < newSelection.count();) {
+ for (int n = 0; (command & QItemSelectionModel::Toggle) && n < newSelection.size();) {
if (newSelection.at(n).intersects(intersections.at(i))) {
split(newSelection.at(n), intersections.at(i), &newSelection);
newSelection.removeAt(n);
@@ -582,57 +552,55 @@ void QItemSelection::split(const QItemSelectionRange &range,
void QItemSelectionModelPrivate::initModel(QAbstractItemModel *m)
{
- struct Cx {
- const char *signal;
- const char *slot;
- };
- static const Cx connections[] = {
- { SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int)),
- SLOT(_q_rowsAboutToBeRemoved(QModelIndex,int,int)) },
- { SIGNAL(columnsAboutToBeRemoved(QModelIndex,int,int)),
- SLOT(_q_columnsAboutToBeRemoved(QModelIndex,int,int)) },
- { SIGNAL(rowsAboutToBeInserted(QModelIndex,int,int)),
- SLOT(_q_rowsAboutToBeInserted(QModelIndex,int,int)) },
- { SIGNAL(columnsAboutToBeInserted(QModelIndex,int,int)),
- SLOT(_q_columnsAboutToBeInserted(QModelIndex,int,int)) },
- { SIGNAL(rowsAboutToBeMoved(QModelIndex,int,int,QModelIndex,int)),
- SLOT(_q_layoutAboutToBeChanged()) },
- { SIGNAL(columnsAboutToBeMoved(QModelIndex,int,int,QModelIndex,int)),
- SLOT(_q_layoutAboutToBeChanged()) },
- { SIGNAL(rowsMoved(QModelIndex,int,int,QModelIndex,int)),
- SLOT(_q_layoutChanged()) },
- { SIGNAL(columnsMoved(QModelIndex,int,int,QModelIndex,int)),
- SLOT(_q_layoutChanged()) },
- { SIGNAL(layoutAboutToBeChanged(QList<QPersistentModelIndex>,QAbstractItemModel::LayoutChangeHint)),
- SLOT(_q_layoutAboutToBeChanged(QList<QPersistentModelIndex>,QAbstractItemModel::LayoutChangeHint)) },
- { SIGNAL(layoutChanged(QList<QPersistentModelIndex>,QAbstractItemModel::LayoutChangeHint)),
- SLOT(_q_layoutChanged(QList<QPersistentModelIndex>,QAbstractItemModel::LayoutChangeHint)) },
- { SIGNAL(modelReset()),
- SLOT(reset()) },
- { SIGNAL(destroyed(QObject*)),
- SLOT(_q_modelDestroyed()) },
- { nullptr, nullptr }
- };
-
- if (model == m)
+ Q_Q(QItemSelectionModel);
+ const QAbstractItemModel *oldModel = model.valueBypassingBindings();
+ if (oldModel == m)
return;
- Q_Q(QItemSelectionModel);
- if (model.value()) {
- for (const Cx *cx = &connections[0]; cx->signal; cx++)
- QObject::disconnect(model.value(), cx->signal, q, cx->slot);
+ if (oldModel) {
q->reset();
+ disconnectModel();
}
// Caller has to call notify(), unless calling during construction (the common case).
model.setValueBypassingBindings(m);
- if (model.value()) {
- for (const Cx *cx = &connections[0]; cx->signal; cx++)
- QObject::connect(model.value(), cx->signal, q, cx->slot);
+ if (m) {
+ connections = std::array<QMetaObject::Connection, 12> {
+ QObjectPrivate::connect(m, &QAbstractItemModel::rowsAboutToBeRemoved,
+ this, &QItemSelectionModelPrivate::rowsAboutToBeRemoved),
+ QObjectPrivate::connect(m, &QAbstractItemModel::columnsAboutToBeRemoved,
+ this, &QItemSelectionModelPrivate::columnsAboutToBeRemoved),
+ QObjectPrivate::connect(m, &QAbstractItemModel::rowsAboutToBeInserted,
+ this, &QItemSelectionModelPrivate::rowsAboutToBeInserted),
+ QObjectPrivate::connect(m, &QAbstractItemModel::columnsAboutToBeInserted,
+ this, &QItemSelectionModelPrivate::columnsAboutToBeInserted),
+ QObjectPrivate::connect(m, &QAbstractItemModel::rowsAboutToBeMoved,
+ this, &QItemSelectionModelPrivate::triggerLayoutToBeChanged),
+ QObjectPrivate::connect(m, &QAbstractItemModel::columnsAboutToBeMoved,
+ this, &QItemSelectionModelPrivate::triggerLayoutToBeChanged),
+ QObjectPrivate::connect(m, &QAbstractItemModel::rowsMoved,
+ this, &QItemSelectionModelPrivate::triggerLayoutChanged),
+ QObjectPrivate::connect(m, &QAbstractItemModel::columnsMoved,
+ this, &QItemSelectionModelPrivate::triggerLayoutChanged),
+ QObjectPrivate::connect(m, &QAbstractItemModel::layoutAboutToBeChanged,
+ this, &QItemSelectionModelPrivate::layoutAboutToBeChanged),
+ QObjectPrivate::connect(m, &QAbstractItemModel::layoutChanged,
+ this, &QItemSelectionModelPrivate::layoutChanged),
+ QObject::connect(m, &QAbstractItemModel::modelReset,
+ q, &QItemSelectionModel::reset),
+ QObjectPrivate::connect(m, &QAbstractItemModel::destroyed,
+ this, &QItemSelectionModelPrivate::modelDestroyed)
+ };
}
}
+void QItemSelectionModelPrivate::disconnectModel()
+{
+ for (auto &connection : connections)
+ QObject::disconnect(connection);
+}
+
/*!
\internal
@@ -650,7 +618,7 @@ QItemSelection QItemSelectionModelPrivate::expandSelection(const QItemSelection
QItemSelection expanded;
if (command & QItemSelectionModel::Rows) {
- for (int i = 0; i < selection.count(); ++i) {
+ for (int i = 0; i < selection.size(); ++i) {
QModelIndex parent = selection.at(i).parent();
int colCount = model->columnCount(parent);
QModelIndex tl = model->index(selection.at(i).top(), 0, parent);
@@ -660,7 +628,7 @@ QItemSelection QItemSelectionModelPrivate::expandSelection(const QItemSelection
}
}
if (command & QItemSelectionModel::Columns) {
- for (int i = 0; i < selection.count(); ++i) {
+ for (int i = 0; i < selection.size(); ++i) {
QModelIndex parent = selection.at(i).parent();
int rowCount = model->rowCount(parent);
QModelIndex tl = model->index(0, selection.at(i).left(), parent);
@@ -675,7 +643,7 @@ QItemSelection QItemSelectionModelPrivate::expandSelection(const QItemSelection
/*!
\internal
*/
-void QItemSelectionModelPrivate::_q_rowsAboutToBeRemoved(const QModelIndex &parent,
+void QItemSelectionModelPrivate::rowsAboutToBeRemoved(const QModelIndex &parent,
int start, int end)
{
Q_Q(QItemSelectionModel);
@@ -758,7 +726,7 @@ void QItemSelectionModelPrivate::_q_rowsAboutToBeRemoved(const QModelIndex &pare
/*!
\internal
*/
-void QItemSelectionModelPrivate::_q_columnsAboutToBeRemoved(const QModelIndex &parent,
+void QItemSelectionModelPrivate::columnsAboutToBeRemoved(const QModelIndex &parent,
int start, int end)
{
Q_Q(QItemSelectionModel);
@@ -795,7 +763,7 @@ void QItemSelectionModelPrivate::_q_columnsAboutToBeRemoved(const QModelIndex &p
Split selection ranges if columns are about to be inserted in the middle.
*/
-void QItemSelectionModelPrivate::_q_columnsAboutToBeInserted(const QModelIndex &parent,
+void QItemSelectionModelPrivate::columnsAboutToBeInserted(const QModelIndex &parent,
int start, int end)
{
Q_UNUSED(end);
@@ -825,7 +793,7 @@ void QItemSelectionModelPrivate::_q_columnsAboutToBeInserted(const QModelIndex &
Split selection ranges if rows are about to be inserted in the middle.
*/
-void QItemSelectionModelPrivate::_q_rowsAboutToBeInserted(const QModelIndex &parent,
+void QItemSelectionModelPrivate::rowsAboutToBeInserted(const QModelIndex &parent,
int start, int end)
{
Q_Q(QItemSelectionModel);
@@ -866,7 +834,8 @@ void QItemSelectionModelPrivate::_q_rowsAboutToBeInserted(const QModelIndex &par
preparation for the layoutChanged() signal, where the indexes can be
merged again.
*/
-void QItemSelectionModelPrivate::_q_layoutAboutToBeChanged(const QList<QPersistentModelIndex> &, QAbstractItemModel::LayoutChangeHint hint)
+void QItemSelectionModelPrivate::layoutAboutToBeChanged(const QList<QPersistentModelIndex> &,
+ QAbstractItemModel::LayoutChangeHint hint)
{
savedPersistentIndexes.clear();
savedPersistentCurrentIndexes.clear();
@@ -875,7 +844,7 @@ void QItemSelectionModelPrivate::_q_layoutAboutToBeChanged(const QList<QPersiste
// optimization for when all indexes are selected
// (only if there is lots of items (1000) because this is not entirely correct)
- if (ranges.isEmpty() && currentSelection.count() == 1) {
+ if (ranges.isEmpty() && currentSelection.size() == 1) {
QItemSelectionRange range = currentSelection.constFirst();
QModelIndex parent = range.parent();
tableRowCount = model->rowCount(parent);
@@ -908,14 +877,14 @@ void QItemSelectionModelPrivate::_q_layoutAboutToBeChanged(const QList<QPersiste
/*!
\internal
*/
-static QItemSelection mergeRowLengths(const QList<QPair<QPersistentModelIndex, uint>> &rowLengths)
+static QItemSelection mergeRowLengths(const QList<std::pair<QPersistentModelIndex, uint>> &rowLengths)
{
if (rowLengths.isEmpty())
return QItemSelection();
QItemSelection result;
int i = 0;
- while (i < rowLengths.count()) {
+ while (i < rowLengths.size()) {
const QPersistentModelIndex &tl = rowLengths.at(i).first;
if (!tl.isValid()) {
++i;
@@ -923,7 +892,7 @@ static QItemSelection mergeRowLengths(const QList<QPair<QPersistentModelIndex, u
}
QPersistentModelIndex br = tl;
const uint length = rowLengths.at(i).second;
- while (++i < rowLengths.count()) {
+ while (++i < rowLengths.size()) {
const QPersistentModelIndex &next = rowLengths.at(i).first;
if (!next.isValid())
continue;
@@ -953,7 +922,7 @@ static QItemSelection mergeIndexes(const QList<QPersistentModelIndex> &indexes)
QItemSelection colSpans;
// merge columns
int i = 0;
- while (i < indexes.count()) {
+ while (i < indexes.size()) {
const QPersistentModelIndex &tl = indexes.at(i);
if (!tl.isValid()) {
++i;
@@ -963,7 +932,7 @@ static QItemSelection mergeIndexes(const QList<QPersistentModelIndex> &indexes)
QModelIndex brParent = br.parent();
int brRow = br.row();
int brColumn = br.column();
- while (++i < indexes.count()) {
+ while (++i < indexes.size()) {
const QPersistentModelIndex &next = indexes.at(i);
if (!next.isValid())
continue;
@@ -986,11 +955,11 @@ static QItemSelection mergeIndexes(const QList<QPersistentModelIndex> &indexes)
// merge rows
QItemSelection rowSpans;
i = 0;
- while (i < colSpans.count()) {
+ while (i < colSpans.size()) {
QModelIndex tl = colSpans.at(i).topLeft();
QModelIndex br = colSpans.at(i).bottomRight();
QModelIndex prevTl = tl;
- while (++i < colSpans.count()) {
+ while (++i < colSpans.size()) {
QModelIndex nextTl = colSpans.at(i).topLeft();
QModelIndex nextBr = colSpans.at(i).bottomRight();
@@ -1013,7 +982,7 @@ static QItemSelection mergeIndexes(const QList<QPersistentModelIndex> &indexes)
/*!
\internal
- Sort predicate function for QItemSelectionModelPrivate::_q_layoutChanged(),
+ Sort predicate function for QItemSelectionModelPrivate::layoutChanged(),
sorting by parent first in addition to operator<(). This is to prevent
fragmentation of the selection by grouping indexes with the same row, column
of different parents next to each other, which may happen when a selection
@@ -1031,7 +1000,7 @@ static bool qt_PersistentModelIndexLessThan(const QPersistentModelIndex &i1, con
Merge the selected indexes into selection ranges again.
*/
-void QItemSelectionModelPrivate::_q_layoutChanged(const QList<QPersistentModelIndex> &, QAbstractItemModel::LayoutChangeHint hint)
+void QItemSelectionModelPrivate::layoutChanged(const QList<QPersistentModelIndex> &, QAbstractItemModel::LayoutChangeHint hint)
{
// special case for when all indexes are selected
if (tableSelected && tableColCount == model->columnCount(tableParent)
@@ -1115,9 +1084,10 @@ void QItemSelectionModelPrivate::_q_layoutChanged(const QList<QPersistentModelIn
We decide to break the new rule, imposed by bindable properties, and not break the old
rule, because that may break existing code.
*/
-void QItemSelectionModelPrivate::_q_modelDestroyed()
+void QItemSelectionModelPrivate::modelDestroyed()
{
model.setValueBypassingBindings(nullptr);
+ disconnectModel();
model.notify();
}
@@ -1157,7 +1127,7 @@ void QItemSelectionModelPrivate::_q_modelDestroyed()
\l{QItemSelectionModel::hasSelection()}{hasSelection}, and
\l{QItemSelectionModel::currentIndex()}{currentIndex} are meta-object properties.
- \sa {Model/View Programming}, QAbstractItemModel, {Chart Example}
+ \sa {Model/View Programming}, QAbstractItemModel
*/
/*!
@@ -1326,7 +1296,7 @@ void QItemSelectionModel::select(const QItemSelection &selection, QItemSelection
// If d->ranges is non-empty when the source model is reset the persistent indexes
// it contains will be invalid. We can't clear them in a modelReset slot because that might already
// be too late if another model observer is connected to the same modelReset slot and is invoked first
- // it might call select() on this selection model before any such QItemSelectionModelPrivate::_q_modelReset() slot
+ // it might call select() on this selection model before any such QItemSelectionModelPrivate::modelReset() slot
// is invoked, so it would not be cleared yet. We clear it invalid ranges in it here.
d->ranges.removeIf(QtFunctionObjects::IsNotValid());
@@ -1399,7 +1369,7 @@ void QItemSelectionModel::reset()
void QItemSelectionModel::clearSelection()
{
Q_D(QItemSelectionModel);
- if (d->ranges.count() == 0 && d->currentSelection.count() == 0)
+ if (d->ranges.size() == 0 && d->currentSelection.size() == 0)
return;
select(QItemSelection(), Clear);
@@ -1470,7 +1440,7 @@ bool QItemSelectionModel::isSelected(const QModelIndex &index) const
}
// check currentSelection
- if (d->currentSelection.count()) {
+ if (d->currentSelection.size()) {
if ((d->currentCommand & Deselect) && selected)
selected = !d->currentSelection.contains(index);
else if (d->currentCommand & Toggle)
@@ -1505,8 +1475,8 @@ bool QItemSelectionModel::isRowSelected(int row, const QModelIndex &parent) cons
return false;
// return false if row exist in currentSelection (Deselect)
- if (d->currentCommand & Deselect && d->currentSelection.count()) {
- for (int i=0; i<d->currentSelection.count(); ++i) {
+ if (d->currentCommand & Deselect && d->currentSelection.size()) {
+ for (int i=0; i<d->currentSelection.size(); ++i) {
if (d->currentSelection.at(i).parent() == parent &&
row >= d->currentSelection.at(i).top() &&
row <= d->currentSelection.at(i).bottom())
@@ -1515,11 +1485,11 @@ bool QItemSelectionModel::isRowSelected(int row, const QModelIndex &parent) cons
}
// return false if ranges in both currentSelection and ranges
// intersect and have the same row contained
- if (d->currentCommand & Toggle && d->currentSelection.count()) {
- for (int i=0; i<d->currentSelection.count(); ++i)
+ if (d->currentCommand & Toggle && d->currentSelection.size()) {
+ for (int i=0; i<d->currentSelection.size(); ++i)
if (d->currentSelection.at(i).top() <= row &&
d->currentSelection.at(i).bottom() >= row)
- for (int j=0; j<d->ranges.count(); ++j)
+ for (int j=0; j<d->ranges.size(); ++j)
if (d->ranges.at(j).top() <= row && d->ranges.at(j).bottom() >= row
&& d->currentSelection.at(i).intersected(d->ranges.at(j)).isValid())
return false;
@@ -1534,7 +1504,7 @@ bool QItemSelectionModel::isRowSelected(int row, const QModelIndex &parent) cons
// add ranges and currentSelection and check through them all
QList<QItemSelectionRange>::const_iterator it;
QList<QItemSelectionRange> joined = d->ranges;
- if (d->currentSelection.count())
+ if (d->currentSelection.size())
joined += d->currentSelection;
for (int column = 0; column < colCount; ++column) {
if (!isSelectable(row, column)) {
@@ -1579,8 +1549,8 @@ bool QItemSelectionModel::isColumnSelected(int column, const QModelIndex &parent
return false;
// return false if column exist in currentSelection (Deselect)
- if (d->currentCommand & Deselect && d->currentSelection.count()) {
- for (int i = 0; i < d->currentSelection.count(); ++i) {
+ if (d->currentCommand & Deselect && d->currentSelection.size()) {
+ for (int i = 0; i < d->currentSelection.size(); ++i) {
if (d->currentSelection.at(i).parent() == parent &&
column >= d->currentSelection.at(i).left() &&
column <= d->currentSelection.at(i).right())
@@ -1589,11 +1559,11 @@ bool QItemSelectionModel::isColumnSelected(int column, const QModelIndex &parent
}
// return false if ranges in both currentSelection and the selection model
// intersect and have the same column contained
- if (d->currentCommand & Toggle && d->currentSelection.count()) {
- for (int i = 0; i < d->currentSelection.count(); ++i) {
+ if (d->currentCommand & Toggle && d->currentSelection.size()) {
+ for (int i = 0; i < d->currentSelection.size(); ++i) {
if (d->currentSelection.at(i).left() <= column &&
d->currentSelection.at(i).right() >= column) {
- for (int j = 0; j < d->ranges.count(); ++j) {
+ for (int j = 0; j < d->ranges.size(); ++j) {
if (d->ranges.at(j).left() <= column && d->ranges.at(j).right() >= column
&& d->currentSelection.at(i).intersected(d->ranges.at(j)).isValid()) {
return false;
@@ -1612,7 +1582,7 @@ bool QItemSelectionModel::isColumnSelected(int column, const QModelIndex &parent
// add ranges and currentSelection and check through them all
QList<QItemSelectionRange>::const_iterator it;
QList<QItemSelectionRange> joined = d->ranges;
- if (d->currentSelection.count())
+ if (d->currentSelection.size())
joined += d->currentSelection;
for (int row = 0; row < rowCount; ++row) {
if (!isSelectable(row, column)) {
@@ -1653,7 +1623,7 @@ bool QItemSelectionModel::rowIntersectsSelection(int row, const QModelIndex &par
QItemSelection sel = d->ranges;
sel.merge(d->currentSelection, d->currentCommand);
- for (const QItemSelectionRange &range : qAsConst(sel)) {
+ for (const QItemSelectionRange &range : std::as_const(sel)) {
if (range.parent() != parent)
return false;
int top = range.top();
@@ -1688,7 +1658,7 @@ bool QItemSelectionModel::columnIntersectsSelection(int column, const QModelInde
QItemSelection sel = d->ranges;
sel.merge(d->currentSelection, d->currentCommand);
- for (const QItemSelectionRange &range : qAsConst(sel)) {
+ for (const QItemSelectionRange &range : std::as_const(sel)) {
if (range.parent() != parent)
return false;
int top = range.top();
@@ -1796,7 +1766,7 @@ QModelIndexList QItemSelectionModel::selectedRows(int column) const
QDuplicateTracker<RowOrColumnDefinition> rowsSeen;
const QItemSelection ranges = selection();
- for (int i = 0; i < ranges.count(); ++i) {
+ for (int i = 0; i < ranges.size(); ++i) {
const QItemSelectionRange &range = ranges.at(i);
QModelIndex parent = range.parent();
for (int row = range.top(); row <= range.bottom(); row++) {
@@ -1825,7 +1795,7 @@ QModelIndexList QItemSelectionModel::selectedColumns(int row) const
QDuplicateTracker<RowOrColumnDefinition> columnsSeen;
const QItemSelection ranges = selection();
- for (int i = 0; i < ranges.count(); ++i) {
+ for (int i = 0; i < ranges.size(); ++i) {
const QItemSelectionRange &range = ranges.at(i);
QModelIndex parent = range.parent();
for (int column = range.left(); column <= range.right(); column++) {
@@ -1918,9 +1888,8 @@ void QItemSelectionModel::setModel(QAbstractItemModel *model)
{
Q_D(QItemSelectionModel);
d->model.removeBindingUnlessInWrapper();
- if (d->model == model)
+ if (d->model.valueBypassingBindings() == model)
return;
-
d->initModel(model);
d->model.notify();
}
@@ -1948,9 +1917,9 @@ void QItemSelectionModel::emitSelectionChanged(const QItemSelection &newSelectio
// remove equal ranges
bool advance;
- for (int o = 0; o < deselected.count(); ++o) {
+ for (int o = 0; o < deselected.size(); ++o) {
advance = true;
- for (int s = 0; s < selected.count() && o < deselected.count();) {
+ for (int s = 0; s < selected.size() && o < deselected.size();) {
if (deselected.at(o) == selected.at(s)) {
deselected.removeAt(o);
selected.removeAt(s);
@@ -1965,17 +1934,17 @@ void QItemSelectionModel::emitSelectionChanged(const QItemSelection &newSelectio
// find intersections
QItemSelection intersections;
- for (int o = 0; o < deselected.count(); ++o) {
- for (int s = 0; s < selected.count(); ++s) {
+ for (int o = 0; o < deselected.size(); ++o) {
+ for (int s = 0; s < selected.size(); ++s) {
if (deselected.at(o).intersects(selected.at(s)))
intersections.append(deselected.at(o).intersected(selected.at(s)));
}
}
// compare remaining ranges with intersections and split them to find deselected and selected
- for (int i = 0; i < intersections.count(); ++i) {
+ for (int i = 0; i < intersections.size(); ++i) {
// split deselected
- for (int o = 0; o < deselected.count();) {
+ for (int o = 0; o < deselected.size();) {
if (deselected.at(o).intersects(intersections.at(i))) {
QItemSelection::split(deselected.at(o), intersections.at(i), &deselected);
deselected.removeAt(o);
@@ -1984,7 +1953,7 @@ void QItemSelectionModel::emitSelectionChanged(const QItemSelection &newSelectio
}
}
// split selected
- for (int s = 0; s < selected.count();) {
+ for (int s = 0; s < selected.size();) {
if (selected.at(s).intersects(intersections.at(i))) {
QItemSelection::split(selected.at(s), intersections.at(i), &selected);
selected.removeAt(s);
diff --git a/src/corelib/itemmodels/qitemselectionmodel.h b/src/corelib/itemmodels/qitemselectionmodel.h
index 678ba8bbad..c4b8dadc97 100644
--- a/src/corelib/itemmodels/qitemselectionmodel.h
+++ b/src/corelib/itemmodels/qitemselectionmodel.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QITEMSELECTIONMODEL_H
#define QITEMSELECTIONMODEL_H
@@ -60,8 +24,8 @@ public:
void swap(QItemSelectionRange &other) noexcept
{
- qSwap(tl, other.tl);
- qSwap(br, other.br);
+ tl.swap(other.tl);
+ br.swap(other.br);
}
inline int top() const { return tl.row(); }
@@ -93,12 +57,12 @@ public:
bool intersects(const QItemSelectionRange &other) const;
QItemSelectionRange intersected(const QItemSelectionRange &other) const;
-
+#if QT_CORE_REMOVED_SINCE(6, 8)
inline bool operator==(const QItemSelectionRange &other) const
- { return (tl == other.tl && br == other.br); }
+ { return comparesEqual(*this, other); }
inline bool operator!=(const QItemSelectionRange &other) const
- { return !operator==(other); }
-
+ { return !operator==(other); }
+#endif
inline bool isValid() const
{
return (tl.isValid() && br.isValid() && tl.parent() == br.parent()
@@ -110,6 +74,12 @@ public:
QModelIndexList indexes() const;
private:
+ friend bool comparesEqual(const QItemSelectionRange &lhs,
+ const QItemSelectionRange &rhs) noexcept
+ {
+ return (lhs.tl == rhs.tl && lhs.br == rhs.br);
+ }
+ Q_DECLARE_EQUALITY_COMPARABLE(QItemSelectionRange)
QPersistentModelIndex tl, br;
};
Q_DECLARE_TYPEINFO(QItemSelectionRange, Q_RELOCATABLE_TYPE);
@@ -201,13 +171,6 @@ protected:
private:
Q_DISABLE_COPY(QItemSelectionModel)
- Q_PRIVATE_SLOT(d_func(), void _q_columnsAboutToBeRemoved(const QModelIndex&, int, int))
- Q_PRIVATE_SLOT(d_func(), void _q_rowsAboutToBeRemoved(const QModelIndex&, int, int))
- Q_PRIVATE_SLOT(d_func(), void _q_columnsAboutToBeInserted(const QModelIndex&, int, int))
- Q_PRIVATE_SLOT(d_func(), void _q_rowsAboutToBeInserted(const QModelIndex&, int, int))
- Q_PRIVATE_SLOT(d_func(), void _q_layoutAboutToBeChanged(const QList<QPersistentModelIndex> &parents = QList<QPersistentModelIndex>(), QAbstractItemModel::LayoutChangeHint hint = QAbstractItemModel::NoHint))
- Q_PRIVATE_SLOT(d_func(), void _q_layoutChanged(const QList<QPersistentModelIndex> &parents = QList<QPersistentModelIndex>(), QAbstractItemModel::LayoutChangeHint hint = QAbstractItemModel::NoHint))
- Q_PRIVATE_SLOT(d_func(), void _q_modelDestroyed())
};
Q_DECLARE_OPERATORS_FOR_FLAGS(QItemSelectionModel::SelectionFlags)
@@ -238,7 +201,7 @@ Q_CORE_EXPORT QDebug operator<<(QDebug, const QItemSelectionRange &);
QT_END_NAMESPACE
-Q_DECLARE_METATYPE(QItemSelectionRange)
-Q_DECLARE_METATYPE(QItemSelection)
+QT_DECL_METATYPE_EXTERN(QItemSelectionRange, Q_CORE_EXPORT)
+QT_DECL_METATYPE_EXTERN(QItemSelection, Q_CORE_EXPORT)
#endif // QITEMSELECTIONMODEL_H
diff --git a/src/corelib/itemmodels/qitemselectionmodel_p.h b/src/corelib/itemmodels/qitemselectionmodel_p.h
index b4da31431b..689cd26bd2 100644
--- a/src/corelib/itemmodels/qitemselectionmodel_p.h
+++ b/src/corelib/itemmodels/qitemselectionmodel_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QITEMSELECTIONMODEL_P_H
#define QITEMSELECTIONMODEL_P_H
@@ -51,8 +15,10 @@
// We mean it.
//
+#include "qitemselectionmodel.h"
#include "private/qobject_p.h"
#include "private/qproperty_p.h"
+#include <array>
QT_REQUIRE_CONFIG(itemmodel);
@@ -71,13 +37,23 @@ public:
void initModel(QAbstractItemModel *model);
- void _q_rowsAboutToBeRemoved(const QModelIndex &parent, int start, int end);
- void _q_columnsAboutToBeRemoved(const QModelIndex &parent, int start, int end);
- void _q_rowsAboutToBeInserted(const QModelIndex &parent, int start, int end);
- void _q_columnsAboutToBeInserted(const QModelIndex &parent, int start, int end);
- void _q_layoutAboutToBeChanged(const QList<QPersistentModelIndex> &parents = QList<QPersistentModelIndex>(), QAbstractItemModel::LayoutChangeHint hint = QAbstractItemModel::NoLayoutChangeHint);
- void _q_layoutChanged(const QList<QPersistentModelIndex> &parents = QList<QPersistentModelIndex>(), QAbstractItemModel::LayoutChangeHint hint = QAbstractItemModel::NoLayoutChangeHint);
- void _q_modelDestroyed();
+ void rowsAboutToBeRemoved(const QModelIndex &parent, int start, int end);
+ void columnsAboutToBeRemoved(const QModelIndex &parent, int start, int end);
+ void rowsAboutToBeInserted(const QModelIndex &parent, int start, int end);
+ void columnsAboutToBeInserted(const QModelIndex &parent, int start, int end);
+ void layoutAboutToBeChanged(const QList<QPersistentModelIndex> &parents, QAbstractItemModel::LayoutChangeHint hint);
+ void triggerLayoutToBeChanged()
+ {
+ layoutAboutToBeChanged(QList<QPersistentModelIndex>(), QAbstractItemModel::NoLayoutChangeHint);
+ }
+
+ void layoutChanged(const QList<QPersistentModelIndex> &parents, QAbstractItemModel::LayoutChangeHint hint);
+ void triggerLayoutChanged()
+ {
+ layoutChanged(QList<QPersistentModelIndex>(), QAbstractItemModel::NoLayoutChangeHint);
+ }
+
+ void modelDestroyed();
inline void remove(QList<QItemSelectionRange> &r)
{
@@ -94,7 +70,8 @@ public:
}
void setModel(QAbstractItemModel *mod) { q_func()->setModel(mod); }
- void modelChanged(QAbstractItemModel *mod) { q_func()->modelChanged(mod); }
+ void disconnectModel();
+ void modelChanged(QAbstractItemModel *mod) { emit q_func()->modelChanged(mod); }
Q_OBJECT_COMPAT_PROPERTY_WITH_ARGS(QItemSelectionModelPrivate, QAbstractItemModel *, model,
&QItemSelectionModelPrivate::setModel,
&QItemSelectionModelPrivate::modelChanged, nullptr)
@@ -105,12 +82,13 @@ public:
QItemSelectionModel::SelectionFlags currentCommand;
QList<QPersistentModelIndex> savedPersistentIndexes;
QList<QPersistentModelIndex> savedPersistentCurrentIndexes;
- QList<QPair<QPersistentModelIndex, uint>> savedPersistentRowLengths;
- QList<QPair<QPersistentModelIndex, uint>> savedPersistentCurrentRowLengths;
+ QList<std::pair<QPersistentModelIndex, uint>> savedPersistentRowLengths;
+ QList<std::pair<QPersistentModelIndex, uint>> savedPersistentCurrentRowLengths;
// optimization when all indexes are selected
bool tableSelected;
QPersistentModelIndex tableParent;
int tableColCount, tableRowCount;
+ std::array<QMetaObject::Connection, 12> connections;
};
QT_END_NAMESPACE
diff --git a/src/corelib/itemmodels/qsortfilterproxymodel.cpp b/src/corelib/itemmodels/qsortfilterproxymodel.cpp
index 9ee438d699..a5284dbad4 100644
--- a/src/corelib/itemmodels/qsortfilterproxymodel.cpp
+++ b/src/corelib/itemmodels/qsortfilterproxymodel.cpp
@@ -1,48 +1,11 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qsortfilterproxymodel.h"
#include "qitemselectionmodel.h"
#include <qsize.h>
#include <qdebug.h>
#include <qdatetime.h>
-#include <qpair.h>
#include <qstringlist.h>
#include <private/qabstractitemmodel_p.h>
#include <private/qabstractproxymodel_p.h>
@@ -52,7 +15,7 @@
QT_BEGIN_NAMESPACE
-typedef QList<QPair<QModelIndex, QPersistentModelIndex>> QModelIndexPairList;
+using QModelIndexPairList = QList<std::pair<QModelIndex, QPersistentModelIndex>>;
struct QSortFilterProxyModelDataChanged
{
@@ -145,9 +108,9 @@ private:
class QSortFilterProxyModelPrivate : public QAbstractProxyModelPrivate
{
+public:
Q_DECLARE_PUBLIC(QSortFilterProxyModel)
-public:
enum class Direction {
Rows = 1,
Columns = 2,
@@ -274,6 +237,8 @@ public:
QModelIndexPairList saved_persistent_indexes;
QList<QPersistentModelIndex> saved_layoutChange_parents;
+ std::array<QMetaObject::Connection, 18> sourceConnections;
+
QHash<QModelIndex, Mapping *>::const_iterator create_mapping(
const QModelIndex &source_parent) const;
QHash<QModelIndex, Mapping *>::const_iterator create_mapping_recursive(
@@ -290,7 +255,7 @@ public:
*/
void set_filter_pattern(const QString &pattern)
{
- QRegularExpression re = filter_regularexpression.value();
+ QRegularExpression re = filter_regularexpression.valueBypassingBindings();
const auto cs = re.patternOptions() & QRegularExpression::CaseInsensitiveOption;
re.setPattern(pattern);
re.setPatternOptions(cs);
@@ -367,10 +332,10 @@ public:
int find_source_sort_column() const;
void sort_source_rows(QList<int> &source_rows,
const QModelIndex &source_parent) const;
- QList<QPair<int, QList<int>>> proxy_intervals_for_source_items_to_add(
+ QList<std::pair<int, QList<int>>> proxy_intervals_for_source_items_to_add(
const QList<int> &proxy_to_source, const QList<int> &source_items,
const QModelIndex &source_parent, Qt::Orientation orient) const;
- QList<QPair<int, int>> proxy_intervals_for_source_items(
+ QList<std::pair<int, int>> proxy_intervals_for_source_items(
const QList<int> &source_to_proxy, const QList<int> &source_items) const;
void insert_source_items(
QList<int> &source_to_proxy, QList<int> &proxy_to_source,
@@ -486,7 +451,7 @@ bool QSortFilterProxyModelPrivate::recursiveChildAcceptsRow(int source_row, cons
void QSortFilterProxyModelPrivate::remove_from_mapping(const QModelIndex &source_parent)
{
if (Mapping *m = source_index_mapping.take(source_parent)) {
- for (const QModelIndex &mappedIdx : qAsConst(m->mapped_children))
+ for (const QModelIndex &mappedIdx : std::as_const(m->mapped_children))
remove_from_mapping(mappedIdx);
delete m;
}
@@ -723,8 +688,10 @@ void QSortFilterProxyModelPrivate::sort_source_rows(
QSortFilterProxyModelGreaterThan gt(source_sort_column, source_parent, model, q);
std::stable_sort(source_rows.begin(), source_rows.end(), gt);
}
- } else { // restore the source model order
- std::stable_sort(source_rows.begin(), source_rows.end());
+ } else if (sort_order == Qt::AscendingOrder) {
+ std::stable_sort(source_rows.begin(), source_rows.end(), std::less{});
+ } else {
+ std::stable_sort(source_rows.begin(), source_rows.end(), std::greater{});
}
}
@@ -739,10 +706,10 @@ void QSortFilterProxyModelPrivate::sort_source_rows(
The result is a vector of pairs, where each pair represents a
(start, end) tuple, sorted in ascending order.
*/
-QList<QPair<int, int>> QSortFilterProxyModelPrivate::proxy_intervals_for_source_items(
+QList<std::pair<int, int>> QSortFilterProxyModelPrivate::proxy_intervals_for_source_items(
const QList<int> &source_to_proxy, const QList<int> &source_items) const
{
- QList<QPair<int, int>> proxy_intervals;
+ QList<std::pair<int, int>> proxy_intervals;
if (source_items.isEmpty())
return proxy_intervals;
@@ -759,19 +726,19 @@ QList<QPair<int, int>> QSortFilterProxyModelPrivate::proxy_intervals_for_source_
++source_items_index;
}
// Add interval to result
- proxy_intervals.append(QPair<int, int>(first_proxy_item, last_proxy_item));
+ proxy_intervals.emplace_back(first_proxy_item, last_proxy_item);
}
std::stable_sort(proxy_intervals.begin(), proxy_intervals.end());
// Consolidate adjacent intervals
for (int i = proxy_intervals.size()-1; i > 0; --i) {
- QPair<int, int> &interval = proxy_intervals[i];
- QPair<int, int> &preceeding_interval = proxy_intervals[i - 1];
+ std::pair<int, int> &interval = proxy_intervals[i];
+ std::pair<int, int> &preceeding_interval = proxy_intervals[i - 1];
if (interval.first == preceeding_interval.second + 1) {
preceeding_interval.second = interval.second;
interval.first = interval.second = -1;
}
}
- proxy_intervals.removeIf([](QPair<int, int> interval) { return interval.first < 0; });
+ proxy_intervals.removeIf([](std::pair<int, int> interval) { return interval.first < 0; });
return proxy_intervals;
}
@@ -800,7 +767,7 @@ void QSortFilterProxyModelPrivate::remove_source_items(
const auto end = proxy_intervals.rend();
for (auto it = proxy_intervals.rbegin(); it != end; ++it) {
- const QPair<int, int> &interval = *it;
+ const std::pair<int, int> &interval = *it;
const int proxy_start = interval.first;
const int proxy_end = interval.second;
remove_proxy_interval(source_to_proxy, proxy_to_source, proxy_start, proxy_end,
@@ -854,22 +821,21 @@ void QSortFilterProxyModelPrivate::remove_proxy_interval(
items), where items is a vector containing the (sorted) source items that
should be inserted at that proxy model location.
*/
-QList<QPair<int, QList<int>>> QSortFilterProxyModelPrivate::proxy_intervals_for_source_items_to_add(
+QList<std::pair<int, QList<int>>> QSortFilterProxyModelPrivate::proxy_intervals_for_source_items_to_add(
const QList<int> &proxy_to_source, const QList<int> &source_items,
const QModelIndex &source_parent, Qt::Orientation orient) const
{
Q_Q(const QSortFilterProxyModel);
- QList<QPair<int, QList<int>>> proxy_intervals;
+ QList<std::pair<int, QList<int>>> proxy_intervals;
if (source_items.isEmpty())
return proxy_intervals;
int proxy_low = 0;
int proxy_item = 0;
int source_items_index = 0;
- QList<int> source_items_in_interval;
bool compare = (orient == Qt::Vertical && source_sort_column >= 0 && dynamic_sortfilter);
while (source_items_index < source_items.size()) {
- source_items_in_interval.clear();
+ QList<int> source_items_in_interval;
int first_new_source_item = source_items.at(source_items_index);
source_items_in_interval.append(first_new_source_item);
++source_items_index;
@@ -915,7 +881,7 @@ QList<QPair<int, QList<int>>> QSortFilterProxyModelPrivate::proxy_intervals_for_
}
// Add interval to result
- proxy_intervals.append(QPair<int, QList<int>>(proxy_item, source_items_in_interval));
+ proxy_intervals.emplace_back(proxy_item, std::move(source_items_in_interval));
}
return proxy_intervals;
}
@@ -943,7 +909,7 @@ void QSortFilterProxyModelPrivate::insert_source_items(
const auto end = proxy_intervals.rend();
for (auto it = proxy_intervals.rbegin(); it != end; ++it) {
- const QPair<int, QList<int>> &interval = *it;
+ const std::pair<int, QList<int>> &interval = *it;
const int proxy_start = interval.first;
const QList<int> &source_items = interval.second;
const int proxy_end = proxy_start + source_items.size() - 1;
@@ -995,12 +961,12 @@ void QSortFilterProxyModelPrivate::source_items_inserted(
it = create_mapping(source_parent);
Mapping *m = it.value();
QModelIndex proxy_parent = q->mapFromSource(source_parent);
- if (m->source_rows.count() > 0) {
- q->beginInsertRows(proxy_parent, 0, m->source_rows.count() - 1);
+ if (m->source_rows.size() > 0) {
+ q->beginInsertRows(proxy_parent, 0, m->source_rows.size() - 1);
q->endInsertRows();
}
- if (m->source_columns.count() > 0) {
- q->beginInsertColumns(proxy_parent, 0, m->source_columns.count() - 1);
+ if (m->source_columns.size() > 0) {
+ q->beginInsertColumns(proxy_parent, 0, m->source_columns.size() - 1);
q->endInsertColumns();
}
return;
@@ -1172,7 +1138,7 @@ void QSortFilterProxyModelPrivate::updateChildrenMapping(const QModelIndex &sour
Qt::Orientation orient, int start, int end, int delta_item_count, bool remove)
{
// see if any mapped children should be (re)moved
- QList<QPair<QModelIndex, Mapping *>> moved_source_index_mappings;
+ QList<std::pair<QModelIndex, Mapping *>> moved_source_index_mappings;
auto it2 = parent_mapping->mapped_children.begin();
for ( ; it2 != parent_mapping->mapped_children.end();) {
const QModelIndex source_child_index = *it2;
@@ -1206,12 +1172,12 @@ void QSortFilterProxyModelPrivate::updateChildrenMapping(const QModelIndex &sour
Mapping *cm = source_index_mapping.take(source_child_index);
Q_ASSERT(cm);
// we do not reinsert right away, because the new index might be identical with another, old index
- moved_source_index_mappings.append(QPair<QModelIndex, Mapping*>(new_index, cm));
+ moved_source_index_mappings.emplace_back(new_index, cm);
}
}
// reinsert moved, mapped indexes
- for (auto &pair : qAsConst(moved_source_index_mappings)) {
+ for (auto &pair : std::as_const(moved_source_index_mappings)) {
pair.second->source_parent = pair.first;
source_index_mapping.insert(pair.first, pair.second);
}
@@ -1226,7 +1192,7 @@ void QSortFilterProxyModelPrivate::proxy_item_range(
{
proxy_low = INT_MAX;
proxy_high = INT_MIN;
- for (int i = 0; i < source_items.count(); ++i) {
+ for (int i = 0; i < source_items.size(); ++i) {
int proxy_item = source_to_proxy.at(source_items.at(i));
Q_ASSERT(proxy_item != -1);
if (proxy_item < proxy_low)
@@ -1259,11 +1225,11 @@ QModelIndexPairList QSortFilterProxyModelPrivate::store_persistent_indexes() con
{
Q_Q(const QSortFilterProxyModel);
QModelIndexPairList source_indexes;
- source_indexes.reserve(persistent.indexes.count());
- for (const QPersistentModelIndexData *data : qAsConst(persistent.indexes)) {
+ source_indexes.reserve(persistent.indexes.size());
+ for (const QPersistentModelIndexData *data : std::as_const(persistent.indexes)) {
const QModelIndex &proxy_index = data->index;
QModelIndex source_index = q->mapToSource(proxy_index);
- source_indexes.append(qMakePair(proxy_index, QPersistentModelIndex(source_index)));
+ source_indexes.emplace_back(proxy_index, source_index);
}
return source_indexes;
}
@@ -1279,7 +1245,7 @@ void QSortFilterProxyModelPrivate::update_persistent_indexes(
{
Q_Q(QSortFilterProxyModel);
QModelIndexList from, to;
- const int numSourceIndexes = source_indexes.count();
+ const int numSourceIndexes = source_indexes.size();
from.reserve(numSourceIndexes);
to.reserve(numSourceIndexes);
for (const auto &indexPair : source_indexes) {
@@ -1301,7 +1267,7 @@ void QSortFilterProxyModelPrivate::update_persistent_indexes(
*/
void QSortFilterProxyModelPrivate::filter_about_to_be_changed(const QModelIndex &source_parent)
{
- if (!filter_regularexpression.value().pattern().isEmpty()
+ if (!filter_regularexpression.valueBypassingBindings().pattern().isEmpty()
&& source_index_mapping.constFind(source_parent) == source_index_mapping.constEnd()) {
create_mapping(source_parent);
}
@@ -1363,7 +1329,7 @@ QSet<int> QSortFilterProxyModelPrivate::handle_filter_changed(
Q_Q(QSortFilterProxyModel);
// Figure out which mapped items to remove
QList<int> source_items_remove;
- for (int i = 0; i < proxy_to_source.count(); ++i) {
+ for (int i = 0; i < proxy_to_source.size(); ++i) {
const int source_item = proxy_to_source.at(i);
if ((orient == Qt::Vertical)
? !filterAcceptsRowInternal(source_item, source_parent)
@@ -1471,7 +1437,7 @@ void QSortFilterProxyModelPrivate::_q_sourceDataChanged(const QModelIndex &sourc
QList<int> source_rows_insert;
QList<int> source_rows_change;
QList<int> source_rows_resort;
- int end = qMin(source_bottom_right.row(), m->proxy_rows.count() - 1);
+ int end = qMin(source_bottom_right.row(), m->proxy_rows.size() - 1);
for (int source_row = source_top_left.row(); source_row <= end; ++source_row) {
if (dynamic_sortfilter && !change_in_unmapped_parent) {
if (m->proxy_rows.at(source_row) != -1) {
@@ -2042,7 +2008,9 @@ void QSortFilterProxyModelPrivate::_q_sourceColumnsMoved(
QSortFilterProxyModel::QSortFilterProxyModel(QObject *parent)
: QAbstractProxyModel(*new QSortFilterProxyModelPrivate, parent)
{
- connect(this, SIGNAL(modelReset()), this, SLOT(_q_clearMapping()));
+ Q_D(QSortFilterProxyModel);
+ QObjectPrivate::connect(this, &QAbstractItemModel::modelReset, d,
+ &QSortFilterProxyModelPrivate::_q_clearMapping);
}
/*!
@@ -2067,56 +2035,10 @@ void QSortFilterProxyModel::setSourceModel(QAbstractItemModel *sourceModel)
beginResetModel();
- disconnect(d->model, SIGNAL(dataChanged(QModelIndex,QModelIndex,QList<int>)),
- this, SLOT(_q_sourceDataChanged(QModelIndex,QModelIndex,QList<int>)));
-
- disconnect(d->model, SIGNAL(headerDataChanged(Qt::Orientation,int,int)),
- this, SLOT(_q_sourceHeaderDataChanged(Qt::Orientation,int,int)));
-
- disconnect(d->model, SIGNAL(rowsAboutToBeInserted(QModelIndex,int,int)),
- this, SLOT(_q_sourceRowsAboutToBeInserted(QModelIndex,int,int)));
-
- disconnect(d->model, SIGNAL(rowsInserted(QModelIndex,int,int)),
- this, SLOT(_q_sourceRowsInserted(QModelIndex,int,int)));
-
- disconnect(d->model, SIGNAL(columnsAboutToBeInserted(QModelIndex,int,int)),
- this, SLOT(_q_sourceColumnsAboutToBeInserted(QModelIndex,int,int)));
-
- disconnect(d->model, SIGNAL(columnsInserted(QModelIndex,int,int)),
- this, SLOT(_q_sourceColumnsInserted(QModelIndex,int,int)));
-
- disconnect(d->model, SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int)),
- this, SLOT(_q_sourceRowsAboutToBeRemoved(QModelIndex,int,int)));
-
- disconnect(d->model, SIGNAL(rowsRemoved(QModelIndex,int,int)),
- this, SLOT(_q_sourceRowsRemoved(QModelIndex,int,int)));
-
- disconnect(d->model, SIGNAL(columnsAboutToBeRemoved(QModelIndex,int,int)),
- this, SLOT(_q_sourceColumnsAboutToBeRemoved(QModelIndex,int,int)));
-
- disconnect(d->model, SIGNAL(columnsRemoved(QModelIndex,int,int)),
- this, SLOT(_q_sourceColumnsRemoved(QModelIndex,int,int)));
-
- disconnect(d->model, SIGNAL(rowsAboutToBeMoved(QModelIndex,int,int,QModelIndex,int)),
- this, SLOT(_q_sourceRowsAboutToBeMoved(QModelIndex,int,int,QModelIndex,int)));
-
- disconnect(d->model, SIGNAL(rowsMoved(QModelIndex,int,int,QModelIndex,int)),
- this, SLOT(_q_sourceRowsMoved(QModelIndex,int,int,QModelIndex,int)));
-
- disconnect(d->model, SIGNAL(columnsAboutToBeMoved(QModelIndex,int,int,QModelIndex,int)),
- this, SLOT(_q_sourceColumnsAboutToBeMoved(QModelIndex,int,int,QModelIndex,int)));
-
- disconnect(d->model, SIGNAL(columnsMoved(QModelIndex,int,int,QModelIndex,int)),
- this, SLOT(_q_sourceColumnsMoved(QModelIndex,int,int,QModelIndex,int)));
-
- disconnect(d->model, SIGNAL(layoutAboutToBeChanged(QList<QPersistentModelIndex>,QAbstractItemModel::LayoutChangeHint)),
- this, SLOT(_q_sourceLayoutAboutToBeChanged(QList<QPersistentModelIndex>,QAbstractItemModel::LayoutChangeHint)));
-
- disconnect(d->model, SIGNAL(layoutChanged(QList<QPersistentModelIndex>,QAbstractItemModel::LayoutChangeHint)),
- this, SLOT(_q_sourceLayoutChanged(QList<QPersistentModelIndex>,QAbstractItemModel::LayoutChangeHint)));
-
- disconnect(d->model, SIGNAL(modelAboutToBeReset()), this, SLOT(_q_sourceAboutToBeReset()));
- disconnect(d->model, SIGNAL(modelReset()), this, SLOT(_q_sourceReset()));
+ if (d->model) {
+ for (const QMetaObject::Connection &connection : std::as_const(d->sourceConnections))
+ disconnect(connection);
+ }
// same as in _q_sourceReset()
d->invalidatePersistentIndexes();
@@ -2124,57 +2046,61 @@ void QSortFilterProxyModel::setSourceModel(QAbstractItemModel *sourceModel)
QAbstractProxyModel::setSourceModel(sourceModel);
- connect(d->model, SIGNAL(dataChanged(QModelIndex,QModelIndex,QList<int>)),
- this, SLOT(_q_sourceDataChanged(QModelIndex,QModelIndex,QList<int>)));
+ d->sourceConnections = std::array<QMetaObject::Connection, 18>{
+ QObjectPrivate::connect(d->model, &QAbstractItemModel::dataChanged, d,
+ &QSortFilterProxyModelPrivate::_q_sourceDataChanged),
- connect(d->model, SIGNAL(headerDataChanged(Qt::Orientation,int,int)),
- this, SLOT(_q_sourceHeaderDataChanged(Qt::Orientation,int,int)));
+ QObjectPrivate::connect(d->model, &QAbstractItemModel::headerDataChanged, d,
+ &QSortFilterProxyModelPrivate::_q_sourceHeaderDataChanged),
- connect(d->model, SIGNAL(rowsAboutToBeInserted(QModelIndex,int,int)),
- this, SLOT(_q_sourceRowsAboutToBeInserted(QModelIndex,int,int)));
+ QObjectPrivate::connect(d->model, &QAbstractItemModel::rowsAboutToBeInserted, d,
+ &QSortFilterProxyModelPrivate::_q_sourceRowsAboutToBeInserted),
- connect(d->model, SIGNAL(rowsInserted(QModelIndex,int,int)),
- this, SLOT(_q_sourceRowsInserted(QModelIndex,int,int)));
+ QObjectPrivate::connect(d->model, &QAbstractItemModel::rowsInserted, d,
+ &QSortFilterProxyModelPrivate::_q_sourceRowsInserted),
- connect(d->model, SIGNAL(columnsAboutToBeInserted(QModelIndex,int,int)),
- this, SLOT(_q_sourceColumnsAboutToBeInserted(QModelIndex,int,int)));
+ QObjectPrivate::connect(d->model, &QAbstractItemModel::columnsAboutToBeInserted, d,
+ &QSortFilterProxyModelPrivate::_q_sourceColumnsAboutToBeInserted),
- connect(d->model, SIGNAL(columnsInserted(QModelIndex,int,int)),
- this, SLOT(_q_sourceColumnsInserted(QModelIndex,int,int)));
+ QObjectPrivate::connect(d->model, &QAbstractItemModel::columnsInserted, d,
+ &QSortFilterProxyModelPrivate::_q_sourceColumnsInserted),
- connect(d->model, SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int)),
- this, SLOT(_q_sourceRowsAboutToBeRemoved(QModelIndex,int,int)));
+ QObjectPrivate::connect(d->model, &QAbstractItemModel::rowsAboutToBeRemoved, d,
+ &QSortFilterProxyModelPrivate::_q_sourceRowsAboutToBeRemoved),
- connect(d->model, SIGNAL(rowsRemoved(QModelIndex,int,int)),
- this, SLOT(_q_sourceRowsRemoved(QModelIndex,int,int)));
+ QObjectPrivate::connect(d->model, &QAbstractItemModel::rowsRemoved, d,
+ &QSortFilterProxyModelPrivate::_q_sourceRowsRemoved),
- connect(d->model, SIGNAL(columnsAboutToBeRemoved(QModelIndex,int,int)),
- this, SLOT(_q_sourceColumnsAboutToBeRemoved(QModelIndex,int,int)));
+ QObjectPrivate::connect(d->model, &QAbstractItemModel::columnsAboutToBeRemoved, d,
+ &QSortFilterProxyModelPrivate::_q_sourceColumnsAboutToBeRemoved),
- connect(d->model, SIGNAL(columnsRemoved(QModelIndex,int,int)),
- this, SLOT(_q_sourceColumnsRemoved(QModelIndex,int,int)));
+ QObjectPrivate::connect(d->model, &QAbstractItemModel::columnsRemoved, d,
+ &QSortFilterProxyModelPrivate::_q_sourceColumnsRemoved),
- connect(d->model, SIGNAL(rowsAboutToBeMoved(QModelIndex,int,int,QModelIndex,int)),
- this, SLOT(_q_sourceRowsAboutToBeMoved(QModelIndex,int,int,QModelIndex,int)));
+ QObjectPrivate::connect(d->model, &QAbstractItemModel::rowsAboutToBeMoved, d,
+ &QSortFilterProxyModelPrivate::_q_sourceRowsAboutToBeMoved),
- connect(d->model, SIGNAL(rowsMoved(QModelIndex,int,int,QModelIndex,int)),
- this, SLOT(_q_sourceRowsMoved(QModelIndex,int,int,QModelIndex,int)));
+ QObjectPrivate::connect(d->model, &QAbstractItemModel::rowsMoved, d,
+ &QSortFilterProxyModelPrivate::_q_sourceRowsMoved),
- connect(d->model, SIGNAL(columnsAboutToBeMoved(QModelIndex,int,int,QModelIndex,int)),
- this, SLOT(_q_sourceColumnsAboutToBeMoved(QModelIndex,int,int,QModelIndex,int)));
+ QObjectPrivate::connect(d->model, &QAbstractItemModel::columnsAboutToBeMoved, d,
+ &QSortFilterProxyModelPrivate::_q_sourceColumnsAboutToBeMoved),
- connect(d->model, SIGNAL(columnsMoved(QModelIndex,int,int,QModelIndex,int)),
- this, SLOT(_q_sourceColumnsMoved(QModelIndex,int,int,QModelIndex,int)));
+ QObjectPrivate::connect(d->model, &QAbstractItemModel::columnsMoved, d,
+ &QSortFilterProxyModelPrivate::_q_sourceColumnsMoved),
- connect(d->model, SIGNAL(layoutAboutToBeChanged(QList<QPersistentModelIndex>,QAbstractItemModel::LayoutChangeHint)),
- this, SLOT(_q_sourceLayoutAboutToBeChanged(QList<QPersistentModelIndex>,QAbstractItemModel::LayoutChangeHint)));
+ QObjectPrivate::connect(d->model, &QAbstractItemModel::layoutAboutToBeChanged, d,
+ &QSortFilterProxyModelPrivate::_q_sourceLayoutAboutToBeChanged),
- connect(d->model, SIGNAL(layoutChanged(QList<QPersistentModelIndex>,QAbstractItemModel::LayoutChangeHint)),
- this, SLOT(_q_sourceLayoutChanged(QList<QPersistentModelIndex>,QAbstractItemModel::LayoutChangeHint)));
+ QObjectPrivate::connect(d->model, &QAbstractItemModel::layoutChanged, d,
+ &QSortFilterProxyModelPrivate::_q_sourceLayoutChanged),
- connect(d->model, SIGNAL(modelAboutToBeReset()), this, SLOT(_q_sourceAboutToBeReset()));
- connect(d->model, SIGNAL(modelReset()), this, SLOT(_q_sourceReset()));
+ QObjectPrivate::connect(d->model, &QAbstractItemModel::modelAboutToBeReset, d,
+ &QSortFilterProxyModelPrivate::_q_sourceAboutToBeReset),
+ QObjectPrivate::connect(d->model, &QAbstractItemModel::modelReset, d,
+ &QSortFilterProxyModelPrivate::_q_sourceReset)
+ };
endResetModel();
if (d->update_source_sort_column() && d->dynamic_sortfilter)
d->sort();
@@ -2191,7 +2117,7 @@ QModelIndex QSortFilterProxyModel::index(int row, int column, const QModelIndex
QModelIndex source_parent = mapToSource(parent); // parent is already mapped at this point
IndexMap::const_iterator it = d->create_mapping(source_parent); // but make sure that the children are mapped
- if (it.value()->source_rows.count() <= row || it.value()->source_columns.count() <= column)
+ if (it.value()->source_rows.size() <= row || it.value()->source_columns.size() <= column)
return QModelIndex();
return d->create_index(row, column, it);
@@ -2222,7 +2148,7 @@ QModelIndex QSortFilterProxyModel::sibling(int row, int column, const QModelInde
return QModelIndex();
const IndexMap::const_iterator it = d->index_to_iterator(idx);
- if (it.value()->source_rows.count() <= row || it.value()->source_columns.count() <= column)
+ if (it.value()->source_rows.size() <= row || it.value()->source_columns.size() <= column)
return QModelIndex();
return d->create_index(row, column, it);
@@ -2238,7 +2164,7 @@ int QSortFilterProxyModel::rowCount(const QModelIndex &parent) const
if (parent.isValid() && !source_parent.isValid())
return 0;
IndexMap::const_iterator it = d->create_mapping(source_parent);
- return it.value()->source_rows.count();
+ return it.value()->source_rows.size();
}
/*!
@@ -2251,7 +2177,7 @@ int QSortFilterProxyModel::columnCount(const QModelIndex &parent) const
if (parent.isValid() && !source_parent.isValid())
return 0;
IndexMap::const_iterator it = d->create_mapping(source_parent);
- return it.value()->source_columns.count();
+ return it.value()->source_columns.size();
}
/*!
@@ -2270,7 +2196,7 @@ bool QSortFilterProxyModel::hasChildren(const QModelIndex &parent) const
return true; //we assume we might have children that can be fetched
QSortFilterProxyModelPrivate::Mapping *m = d->create_mapping(source_parent).value();
- return m->source_rows.count() != 0 && m->source_columns.count() != 0;
+ return m->source_rows.size() != 0 && m->source_columns.size() != 0;
}
/*!
@@ -2304,15 +2230,15 @@ QVariant QSortFilterProxyModel::headerData(int section, Qt::Orientation orientat
{
Q_D(const QSortFilterProxyModel);
IndexMap::const_iterator it = d->create_mapping(QModelIndex());
- if (it.value()->source_rows.count() * it.value()->source_columns.count() > 0)
+ if (it.value()->source_rows.size() * it.value()->source_columns.size() > 0)
return QAbstractProxyModel::headerData(section, orientation, role);
int source_section;
if (orientation == Qt::Vertical) {
- if (section < 0 || section >= it.value()->source_rows.count())
+ if (section < 0 || section >= it.value()->source_rows.size())
return QVariant();
source_section = it.value()->source_rows.at(section);
} else {
- if (section < 0 || section >= it.value()->source_columns.count())
+ if (section < 0 || section >= it.value()->source_columns.size())
return QVariant();
source_section = it.value()->source_columns.at(section);
}
@@ -2327,15 +2253,15 @@ bool QSortFilterProxyModel::setHeaderData(int section, Qt::Orientation orientati
{
Q_D(QSortFilterProxyModel);
IndexMap::const_iterator it = d->create_mapping(QModelIndex());
- if (it.value()->source_rows.count() * it.value()->source_columns.count() > 0)
+ if (it.value()->source_rows.size() * it.value()->source_columns.size() > 0)
return QAbstractProxyModel::setHeaderData(section, orientation, value, role);
int source_section;
if (orientation == Qt::Vertical) {
- if (section < 0 || section >= it.value()->source_rows.count())
+ if (section < 0 || section >= it.value()->source_rows.size())
return false;
source_section = it.value()->source_rows.at(section);
} else {
- if (section < 0 || section >= it.value()->source_columns.count())
+ if (section < 0 || section >= it.value()->source_columns.size())
return false;
source_section = it.value()->source_columns.at(section);
}
@@ -2349,7 +2275,7 @@ QMimeData *QSortFilterProxyModel::mimeData(const QModelIndexList &indexes) const
{
Q_D(const QSortFilterProxyModel);
QModelIndexList source_indexes;
- source_indexes.reserve(indexes.count());
+ source_indexes.reserve(indexes.size());
for (const QModelIndex &idx : indexes)
source_indexes << mapToSource(idx);
return d->model->mimeData(source_indexes);
@@ -2395,10 +2321,10 @@ bool QSortFilterProxyModel::insertRows(int row, int count, const QModelIndex &pa
if (parent.isValid() && !source_parent.isValid())
return false;
QSortFilterProxyModelPrivate::Mapping *m = d->create_mapping(source_parent).value();
- if (row > m->source_rows.count())
+ if (row > m->source_rows.size())
return false;
- int source_row = (row >= m->source_rows.count()
- ? m->proxy_rows.count()
+ int source_row = (row >= m->source_rows.size()
+ ? m->proxy_rows.size()
: m->source_rows.at(row));
return d->model->insertRows(source_row, count, source_parent);
}
@@ -2415,10 +2341,10 @@ bool QSortFilterProxyModel::insertColumns(int column, int count, const QModelInd
if (parent.isValid() && !source_parent.isValid())
return false;
QSortFilterProxyModelPrivate::Mapping *m = d->create_mapping(source_parent).value();
- if (column > m->source_columns.count())
+ if (column > m->source_columns.size())
return false;
- int source_column = (column >= m->source_columns.count()
- ? m->proxy_columns.count()
+ int source_column = (column >= m->source_columns.size()
+ ? m->proxy_columns.size()
: m->source_columns.at(column));
return d->model->insertColumns(source_column, count, source_parent);
}
@@ -2435,10 +2361,10 @@ bool QSortFilterProxyModel::removeRows(int row, int count, const QModelIndex &pa
if (parent.isValid() && !source_parent.isValid())
return false;
QSortFilterProxyModelPrivate::Mapping *m = d->create_mapping(source_parent).value();
- if (row + count > m->source_rows.count())
+ if (row + count > m->source_rows.size())
return false;
if ((count == 1)
- || ((d->source_sort_column < 0) && (m->proxy_rows.count() == m->source_rows.count()))) {
+ || ((d->source_sort_column < 0) && (m->proxy_rows.size() == m->source_rows.size()))) {
int source_row = m->source_rows.at(row);
return d->model->removeRows(source_row, count, source_parent);
}
@@ -2450,7 +2376,7 @@ bool QSortFilterProxyModel::removeRows(int row, int count, const QModelIndex &pa
rows.append(m->source_rows.at(i));
std::sort(rows.begin(), rows.end());
- int pos = rows.count() - 1;
+ int pos = rows.size() - 1;
bool ok = true;
while (pos >= 0) {
const int source_end = rows.at(pos--);
@@ -2477,9 +2403,9 @@ bool QSortFilterProxyModel::removeColumns(int column, int count, const QModelInd
if (parent.isValid() && !source_parent.isValid())
return false;
QSortFilterProxyModelPrivate::Mapping *m = d->create_mapping(source_parent).value();
- if (column + count > m->source_columns.count())
+ if (column + count > m->source_columns.size())
return false;
- if ((count == 1) || (m->proxy_columns.count() == m->source_columns.count())) {
+ if ((count == 1) || (m->proxy_columns.size() == m->source_columns.size())) {
int source_column = m->source_columns.at(column);
return d->model->removeColumns(source_column, count, source_parent);
}
@@ -2489,7 +2415,7 @@ bool QSortFilterProxyModel::removeColumns(int column, int count, const QModelInd
for (int i = column; i < column + count; ++i)
columns.append(m->source_columns.at(i));
- int pos = columns.count() - 1;
+ int pos = columns.size() - 1;
bool ok = true;
while (pos >= 0) {
const int source_end = columns.at(pos--);
@@ -2509,11 +2435,7 @@ bool QSortFilterProxyModel::removeColumns(int column, int count, const QModelInd
*/
void QSortFilterProxyModel::fetchMore(const QModelIndex &parent)
{
- Q_D(QSortFilterProxyModel);
- QModelIndex source_parent;
- if (d->indexValid(parent))
- source_parent = mapToSource(parent);
- d->model->fetchMore(source_parent);
+ QAbstractProxyModel::fetchMore(parent);
}
/*!
@@ -2521,11 +2443,7 @@ void QSortFilterProxyModel::fetchMore(const QModelIndex &parent)
*/
bool QSortFilterProxyModel::canFetchMore(const QModelIndex &parent) const
{
- Q_D(const QSortFilterProxyModel);
- QModelIndex source_parent;
- if (d->indexValid(parent))
- source_parent = mapToSource(parent);
- return d->model->canFetchMore(source_parent);
+ return QAbstractProxyModel::canFetchMore(parent);
}
/*!
@@ -2533,11 +2451,7 @@ bool QSortFilterProxyModel::canFetchMore(const QModelIndex &parent) const
*/
Qt::ItemFlags QSortFilterProxyModel::flags(const QModelIndex &index) const
{
- Q_D(const QSortFilterProxyModel);
- QModelIndex source_index;
- if (d->indexValid(index))
- source_index = mapToSource(index);
- return d->model->flags(source_index);
+ return QAbstractProxyModel::flags(index);
}
/*!
@@ -2578,7 +2492,10 @@ QSize QSortFilterProxyModel::span(const QModelIndex &index) const
}
/*!
- \reimp
+ \reimp
+ Sorts the model by \a column in the given \a order.
+ If the sort \a column is less than zero, the model will be sorted by source model row
+ in the given \a order.
*/
void QSortFilterProxyModel::sort(int column, Qt::SortOrder order)
{
@@ -2593,9 +2510,12 @@ void QSortFilterProxyModel::sort(int column, Qt::SortOrder order)
/*!
\since 4.5
- \brief the column currently used for sorting
+ \return the column currently used for sorting
+
+ This returns the most recently used sort column. The default value is -1,
+ which means that this proxy model does not sort.
- This returns the most recently used sort column.
+ \sa sort()
*/
int QSortFilterProxyModel::sortColumn() const
{
@@ -2605,9 +2525,12 @@ int QSortFilterProxyModel::sortColumn() const
/*!
\since 4.5
- \brief the order currently used for sorting
+ \return the order currently used for sorting
- This returns the most recently used sort order.
+ This returns the most recently used sort order. The default value is
+ Qt::AscendingOrder.
+
+ \sa sort()
*/
Qt::SortOrder QSortFilterProxyModel::sortOrder() const
{
@@ -2650,11 +2573,12 @@ QBindable<QRegularExpression> QSortFilterProxyModel::bindableFilterRegularExpres
void QSortFilterProxyModel::setFilterRegularExpression(const QRegularExpression &regularExpression)
{
Q_D(QSortFilterProxyModel);
- Qt::beginPropertyUpdateGroup();
- const bool regExpChanged = regularExpression != d->filter_regularexpression.value();
+ const QScopedPropertyUpdateGroup guard;
+ const bool regExpChanged =
+ regularExpression != d->filter_regularexpression.valueBypassingBindings();
d->filter_regularexpression.removeBindingUnlessInWrapper();
d->filter_casesensitive.removeBindingUnlessInWrapper();
- const Qt::CaseSensitivity cs = filterCaseSensitivity();
+ const Qt::CaseSensitivity cs = d->filter_casesensitive.valueBypassingBindings();
d->filter_about_to_be_changed();
const Qt::CaseSensitivity updatedCs =
regularExpression.patternOptions() & QRegularExpression::CaseInsensitiveOption
@@ -2669,7 +2593,6 @@ void QSortFilterProxyModel::setFilterRegularExpression(const QRegularExpression
d->filter_regularexpression.notify();
if (cs != updatedCs)
d->filter_casesensitive.notify();
- Qt::endPropertyUpdateGroup();
}
/*!
@@ -2696,7 +2619,7 @@ void QSortFilterProxyModel::setFilterKeyColumn(int column)
Q_D(QSortFilterProxyModel);
d->filter_column.removeBindingUnlessInWrapper();
d->filter_about_to_be_changed();
- const auto oldColumn = d->filter_column.value();
+ const auto oldColumn = d->filter_column.valueBypassingBindings();
d->filter_column.setValueBypassingBindings(column);
d->filter_changed(QSortFilterProxyModelPrivate::Direction::Rows);
if (oldColumn != column)
@@ -2745,7 +2668,7 @@ void QSortFilterProxyModel::setFilterCaseSensitivity(Qt::CaseSensitivity cs)
if (cs == d->filter_casesensitive)
return;
- Qt::beginPropertyUpdateGroup();
+ const QScopedPropertyUpdateGroup guard;
QRegularExpression::PatternOptions options =
d->filter_regularexpression.value().patternOptions();
options.setFlag(QRegularExpression::CaseInsensitiveOption, cs == Qt::CaseInsensitive);
@@ -2758,7 +2681,6 @@ void QSortFilterProxyModel::setFilterCaseSensitivity(Qt::CaseSensitivity cs)
d->filter_changed(QSortFilterProxyModelPrivate::Direction::Rows);
d->filter_regularexpression.notify();
d->filter_casesensitive.notify();
- Qt::endPropertyUpdateGroup();
}
QBindable<Qt::CaseSensitivity> QSortFilterProxyModel::bindableFilterCaseSensitivity()
@@ -2937,6 +2859,8 @@ void QSortFilterProxyModel::setFilterFixedString(const QString &pattern)
QComboBox.
The default value is true.
+
+ \sa sortColumn()
*/
bool QSortFilterProxyModel::dynamicSortFilter() const
{
@@ -2993,7 +2917,7 @@ void QSortFilterProxyModel::setSortRole(int role)
{
Q_D(QSortFilterProxyModel);
d->sort_role.removeBindingUnlessInWrapper();
- if (d->sort_role == role)
+ if (d->sort_role.valueBypassingBindings() == role)
return;
d->sort_role.setValueBypassingBindings(role);
d->sort();
@@ -3032,7 +2956,7 @@ void QSortFilterProxyModel::setFilterRole(int role)
{
Q_D(QSortFilterProxyModel);
d->filter_role.removeBindingUnlessInWrapper();
- if (d->filter_role == role)
+ if (d->filter_role.valueBypassingBindings() == role)
return;
d->filter_about_to_be_changed();
d->filter_role.setValueBypassingBindings(role);
diff --git a/src/corelib/itemmodels/qsortfilterproxymodel.h b/src/corelib/itemmodels/qsortfilterproxymodel.h
index b3c7b74453..9d5b2fac9f 100644
--- a/src/corelib/itemmodels/qsortfilterproxymodel.h
+++ b/src/corelib/itemmodels/qsortfilterproxymodel.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QSORTFILTERPROXYMODEL_H
#define QSORTFILTERPROXYMODEL_H
@@ -208,28 +172,6 @@ Q_SIGNALS:
private:
Q_DECLARE_PRIVATE(QSortFilterProxyModel)
Q_DISABLE_COPY(QSortFilterProxyModel)
-
- Q_PRIVATE_SLOT(d_func(),
- void _q_sourceDataChanged(const QModelIndex &source_top_left, const QModelIndex &source_bottom_right,
- const QList<int> &roles))
- Q_PRIVATE_SLOT(d_func(), void _q_sourceHeaderDataChanged(Qt::Orientation orientation, int start, int end))
- Q_PRIVATE_SLOT(d_func(), void _q_sourceAboutToBeReset())
- Q_PRIVATE_SLOT(d_func(), void _q_sourceReset())
- Q_PRIVATE_SLOT(d_func(), void _q_sourceLayoutAboutToBeChanged(const QList<QPersistentModelIndex> &sourceParents, QAbstractItemModel::LayoutChangeHint hint))
- Q_PRIVATE_SLOT(d_func(), void _q_sourceLayoutChanged(const QList<QPersistentModelIndex> &sourceParents, QAbstractItemModel::LayoutChangeHint hint))
- Q_PRIVATE_SLOT(d_func(), void _q_sourceRowsAboutToBeInserted(const QModelIndex &source_parent, int start, int end))
- Q_PRIVATE_SLOT(d_func(), void _q_sourceRowsInserted(const QModelIndex &source_parent, int start, int end))
- Q_PRIVATE_SLOT(d_func(), void _q_sourceRowsAboutToBeRemoved(const QModelIndex &source_parent, int start, int end))
- Q_PRIVATE_SLOT(d_func(), void _q_sourceRowsRemoved(const QModelIndex &source_parent, int start, int end))
- Q_PRIVATE_SLOT(d_func(), void _q_sourceRowsAboutToBeMoved(QModelIndex,int,int,QModelIndex,int))
- Q_PRIVATE_SLOT(d_func(), void _q_sourceRowsMoved(QModelIndex,int,int,QModelIndex,int))
- Q_PRIVATE_SLOT(d_func(), void _q_sourceColumnsAboutToBeInserted(const QModelIndex &source_parent, int start, int end))
- Q_PRIVATE_SLOT(d_func(), void _q_sourceColumnsInserted(const QModelIndex &source_parent, int start, int end))
- Q_PRIVATE_SLOT(d_func(), void _q_sourceColumnsAboutToBeRemoved(const QModelIndex &source_parent, int start, int end))
- Q_PRIVATE_SLOT(d_func(), void _q_sourceColumnsRemoved(const QModelIndex &source_parent, int start, int end))
- Q_PRIVATE_SLOT(d_func(), void _q_sourceColumnsAboutToBeMoved(QModelIndex,int,int,QModelIndex,int))
- Q_PRIVATE_SLOT(d_func(), void _q_sourceColumnsMoved(QModelIndex,int,int,QModelIndex,int))
- Q_PRIVATE_SLOT(d_func(), void _q_clearMapping())
};
QT_END_NAMESPACE
diff --git a/src/corelib/itemmodels/qstringlistmodel.cpp b/src/corelib/itemmodels/qstringlistmodel.cpp
index 829d4cf3ed..dfbe72b289 100644
--- a/src/corelib/itemmodels/qstringlistmodel.cpp
+++ b/src/corelib/itemmodels/qstringlistmodel.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
/*
A simple model that uses a QStringList as its data source.
@@ -44,6 +8,7 @@
#include "qstringlistmodel.h"
#include <QtCore/qlist.h>
+#include <QtCore/qmap.h>
#include <algorithm>
@@ -121,7 +86,7 @@ int QStringListModel::rowCount(const QModelIndex &parent) const
if (parent.isValid())
return 0;
- return lst.count();
+ return lst.size();
}
/*!
@@ -129,7 +94,7 @@ int QStringListModel::rowCount(const QModelIndex &parent) const
*/
QModelIndex QStringListModel::sibling(int row, int column, const QModelIndex &idx) const
{
- if (!idx.isValid() || column != 0 || row >= lst.count() || row < 0)
+ if (!idx.isValid() || column != 0 || row >= lst.size() || row < 0)
return QModelIndex();
return createIndex(row, 0);
@@ -327,12 +292,12 @@ bool QStringListModel::moveRows(const QModelIndex &sourceParent, int sourceRow,
return true;
}
-static bool ascendingLessThan(const QPair<QString, int> &s1, const QPair<QString, int> &s2)
+static bool ascendingLessThan(const std::pair<QString, int> &s1, const std::pair<QString, int> &s2)
{
return s1.first < s2.first;
}
-static bool decendingLessThan(const QPair<QString, int> &s1, const QPair<QString, int> &s2)
+static bool decendingLessThan(const std::pair<QString, int> &s1, const std::pair<QString, int> &s2)
{
return s1.first > s2.first;
}
@@ -344,11 +309,11 @@ void QStringListModel::sort(int, Qt::SortOrder order)
{
emit layoutAboutToBeChanged(QList<QPersistentModelIndex>(), VerticalSortHint);
- QList<QPair<QString, int>> list;
- const int lstCount = lst.count();
+ QList<std::pair<QString, int>> list;
+ const int lstCount = lst.size();
list.reserve(lstCount);
for (int i = 0; i < lstCount; ++i)
- list.append(QPair<QString, int>(lst.at(i), i));
+ list.emplace_back(lst.at(i), i);
if (order == Qt::AscendingOrder)
std::sort(list.begin(), list.end(), ascendingLessThan);
@@ -364,7 +329,7 @@ void QStringListModel::sort(int, Qt::SortOrder order)
QModelIndexList oldList = persistentIndexList();
QModelIndexList newList;
- const int numOldIndexes = oldList.count();
+ const int numOldIndexes = oldList.size();
newList.reserve(numOldIndexes);
for (int i = 0; i < numOldIndexes; ++i)
newList.append(index(forwarding.at(oldList.at(i).row()), 0));
diff --git a/src/corelib/itemmodels/qstringlistmodel.h b/src/corelib/itemmodels/qstringlistmodel.h
index fb53c19f09..b93a9c7173 100644
--- a/src/corelib/itemmodels/qstringlistmodel.h
+++ b/src/corelib/itemmodels/qstringlistmodel.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QSTRINGLISTMODEL_H
#define QSTRINGLISTMODEL_H
diff --git a/src/corelib/itemmodels/qtransposeproxymodel.cpp b/src/corelib/itemmodels/qtransposeproxymodel.cpp
index 558ec45b73..621b54782e 100644
--- a/src/corelib/itemmodels/qtransposeproxymodel.cpp
+++ b/src/corelib/itemmodels/qtransposeproxymodel.cpp
@@ -1,47 +1,12 @@
-/****************************************************************************
-**
-** Copyright (C) 2018 Luca Beldi <v.ronin@yahoo.it>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2018 Luca Beldi <v.ronin@yahoo.it>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qtransposeproxymodel.h"
#include <private/qtransposeproxymodel_p.h>
#include <QtCore/qlist.h>
#include <QtCore/qmetaobject.h>
#include <QtCore/qsize.h>
+#include <QtCore/qmap.h>
QT_BEGIN_NAMESPACE
@@ -67,7 +32,7 @@ void QTransposeProxyModelPrivate::onLayoutChanged(const QList<QPersistentModelIn
Q_ASSERT(layoutChangeProxyIndexes.size() == layoutChangePersistentIndexes.size());
QModelIndexList toList;
toList.reserve(layoutChangePersistentIndexes.size());
- for (const QPersistentModelIndex &persistIdx : qAsConst(layoutChangePersistentIndexes))
+ for (const QPersistentModelIndex &persistIdx : std::as_const(layoutChangePersistentIndexes))
toList << q->mapFromSource(persistIdx);
q->changePersistentIndexList(layoutChangeProxyIndexes, toList);
layoutChangeProxyIndexes.clear();
@@ -170,6 +135,7 @@ void QTransposeProxyModelPrivate::onRowsAboutToBeMoved(const QModelIndex &source
/*!
\since 5.13
\class QTransposeProxyModel
+ \inmodule QtCore
\brief This proxy transposes the source model.
This model will make the rows of the source model become columns of the proxy model and vice-versa.
@@ -206,7 +172,7 @@ void QTransposeProxyModel::setSourceModel(QAbstractItemModel* newSourceModel)
return;
beginResetModel();
if (d->model) {
- for (const QMetaObject::Connection& discIter : qAsConst(d->sourceConnections))
+ for (const QMetaObject::Connection& discIter : std::as_const(d->sourceConnections))
disconnect(discIter);
}
d->sourceConnections.clear();
diff --git a/src/corelib/itemmodels/qtransposeproxymodel.h b/src/corelib/itemmodels/qtransposeproxymodel.h
index 854a547fd4..67ce6f3bef 100644
--- a/src/corelib/itemmodels/qtransposeproxymodel.h
+++ b/src/corelib/itemmodels/qtransposeproxymodel.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2018 Luca Beldi <v.ronin@yahoo.it>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2018 Luca Beldi <v.ronin@yahoo.it>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QTRANSPOSEPROXYMODEL_H
#define QTRANSPOSEPROXYMODEL_H
diff --git a/src/corelib/itemmodels/qtransposeproxymodel_p.h b/src/corelib/itemmodels/qtransposeproxymodel_p.h
index 8cee3d2288..2e0c09b95b 100644
--- a/src/corelib/itemmodels/qtransposeproxymodel_p.h
+++ b/src/corelib/itemmodels/qtransposeproxymodel_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2018 Luca Beldi <v.ronin@yahoo.it>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2018 Luca Beldi <v.ronin@yahoo.it>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QTRANSPOSEPROXYMODEL_P_H
#define QTRANSPOSEPROXYMODEL_P_H
diff --git a/src/corelib/kernel/qabstracteventdispatcher.cpp b/src/corelib/kernel/qabstracteventdispatcher.cpp
index 358a59d05b..f3056a399c 100644
--- a/src/corelib/kernel/qabstracteventdispatcher.cpp
+++ b/src/corelib/kernel/qabstracteventdispatcher.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qabstracteventdispatcher.h"
#include "qabstracteventdispatcher_p.h"
@@ -45,9 +9,12 @@
#include <private/qthread_p.h>
#include <private/qcoreapplication_p.h>
#include <private/qfreelist_p.h>
+#include <private/qnumeric_p.h>
QT_BEGIN_NAMESPACE
+using namespace std::chrono_literals;
+
// we allow for 2^24 = 8^8 = 16777216 simultaneously running timers
struct QtTimerIdFreeListConstants : public QFreeListDefaultConstants
{
@@ -76,7 +43,7 @@ enum {
Size5 = QtTimerIdFreeListConstants::MaxIndex - Offset5
};
-const int QtTimerIdFreeListConstants::Sizes[QtTimerIdFreeListConstants::BlockCount] = {
+Q_CONSTINIT const int QtTimerIdFreeListConstants::Sizes[QtTimerIdFreeListConstants::BlockCount] = {
Size0,
Size1,
Size2,
@@ -88,6 +55,41 @@ const int QtTimerIdFreeListConstants::Sizes[QtTimerIdFreeListConstants::BlockCou
typedef QFreeList<void, QtTimerIdFreeListConstants> QtTimerIdFreeList;
Q_GLOBAL_STATIC(QtTimerIdFreeList, timerIdFreeList)
+template <typename T> static T fromDuration(std::chrono::nanoseconds interval)
+{
+ using namespace std::chrono;
+ qint64 value = ceil<milliseconds>(interval).count();
+ return qt_saturate<T>(value);
+}
+
+#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0)
+static inline QAbstractEventDispatcherV2 *v2(QAbstractEventDispatcher *self)
+{
+ if (QAbstractEventDispatcherPrivate::get(self)->isV2)
+ return static_cast<QAbstractEventDispatcherV2 *>(self);
+ return nullptr;
+}
+
+static inline const QAbstractEventDispatcherV2 *v2(const QAbstractEventDispatcher *self)
+{
+ if (QAbstractEventDispatcherPrivate::get(self)->isV2)
+ return static_cast<const QAbstractEventDispatcherV2 *>(self);
+ return nullptr;
+}
+#endif // Qt 7
+
+QAbstractEventDispatcherPrivate::QAbstractEventDispatcherPrivate()
+{
+ // Create the timer ID free list here to make sure that it is destroyed
+ // after any global static thread that may be using it.
+ // See also QTBUG-58732.
+ if (!timerIdFreeList.isDestroyed())
+ (void)timerIdFreeList();
+}
+
+QAbstractEventDispatcherPrivate::~QAbstractEventDispatcherPrivate()
+ = default;
+
int QAbstractEventDispatcherPrivate::allocateTimerId()
{
// This function may be called after timerIdFreeList() has been destructed
@@ -145,6 +147,15 @@ void QAbstractEventDispatcherPrivate::releaseTimerId(int timerId)
\sa QEventLoop, QCoreApplication, QThread
*/
+/*!
+ \typedef QAbstractEventDispatcher::Duration
+
+ A \c{std::chrono::duration} type that is used in various API in this class.
+ This type exists to facilitate a possible transition to a higher or lower
+ granularity.
+
+ In all current platforms, it is \c nanoseconds.
+*/
/*!
Constructs a new event dispatcher with the given \a parent.
@@ -238,16 +249,39 @@ QAbstractEventDispatcher *QAbstractEventDispatcher::instance(QThread *thread)
*/
/*!
+ \obsolete [6.8] This function will be removed in Qt 7. Use the overload taking \l Duration.
+
Registers a timer with the specified \a interval and \a timerType for the
given \a object and returns the timer id.
*/
int QAbstractEventDispatcher::registerTimer(qint64 interval, Qt::TimerType timerType, QObject *object)
{
- int id = QAbstractEventDispatcherPrivate::allocateTimerId();
+ return int(registerTimer(interval * 1ms, timerType, object));
+}
+
+/*!
+ \since 6.8
+ \overload
+
+ Registers a timer with the specified \a interval and \a timerType for the
+ given \a object and returns the timer id.
+*/
+Qt::TimerId QAbstractEventDispatcher::registerTimer(Duration interval, Qt::TimerType timerType,
+ QObject *object)
+{
+ auto id = Qt::TimerId(QAbstractEventDispatcherPrivate::allocateTimerId());
+#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0)
+ if (QAbstractEventDispatcherV2 *self = v2(this))
+ self->registerTimer(id, interval, timerType, object);
+ else
+ registerTimer(qToUnderlying(id), fromDuration<qint64>(interval), timerType, object);
+#else
registerTimer(id, interval, timerType, object);
+#endif
return id;
}
+#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0)
/*!
\fn void QAbstractEventDispatcher::registerTimer(int timerId, qint64 interval, Qt::TimerType timerType, QObject *object)
@@ -265,15 +299,6 @@ int QAbstractEventDispatcher::registerTimer(qint64 interval, Qt::TimerType timer
*/
/*!
- \fn bool QAbstractEventDispatcher::unregisterTimers(QObject *object)
-
- Unregisters all the timers associated with the given \a object.
- Returns \c true if all timers were successful removed; otherwise returns \c false.
-
- \sa unregisterTimer(), registeredTimers()
-*/
-
-/*!
\fn QList<TimerInfo> QAbstractEventDispatcher::registeredTimers(QObject *object) const
Returns a list of registered timers for \a object. The TimerInfo struct has
@@ -291,6 +316,57 @@ int QAbstractEventDispatcher::registerTimer(qint64 interval, Qt::TimerType timer
\sa Qt::TimerType
*/
+#else // Qt 7
+/*!
+ \fn void QAbstractEventDispatcher::registerTimer(Qt::TimerId timerId, Duration interval, Qt::TimerType timerType, QObject *object)
+ \since 6.8
+
+ Register a timer with the specified \a timerId, \a interval, and \a
+ timerType for the given \a object.
+
+ \sa unregisterTimer(), timersForObject()
+*/
+
+/*!
+ \fn bool QAbstractEventDispatcher::unregisterTimer(Qt::TimerId timerId)
+ \since 6.8
+
+ Unregisters the timer with the given \a timerId.
+ Returns \c true if successful; otherwise returns \c false.
+
+ \sa registerTimer(), unregisterTimers()
+*/
+
+/*!
+ \fn QList<TimerInfoV2> QAbstractEventDispatcher::timersForObject(QObject *object) const
+ \since 6.8
+
+ Returns a list of registered timers for \a object. The TimerInfoV2 struct has
+ \c timerId, \c interval, and \c timerType members.
+
+ \sa Qt::TimerType, registerTimer(), unregisterTimer()
+*/
+
+/*!
+ \fn QAbstractEventDispatcher::remainingTime(Qt::TimerId timerId) const
+
+ Returns the remaining time of the timer with the given \a timerId.
+ If the timer is inactive, the returned value will be negative. If the timer
+ is overdue, the returned value will be 0.
+
+ \sa Qt::TimerType, registerTimer(), unregisterTimer()
+*/
+#endif
+
+/*!
+ \fn bool QAbstractEventDispatcher::unregisterTimers(QObject *object)
+
+ Unregisters all the timers associated with the given \a object. Returns \c
+ true if all timers were successfully removed; otherwise returns \c false.
+
+ \sa unregisterTimer(), registeredTimers()
+*/
+
/*! \fn void QAbstractEventDispatcher::wakeUp()
\threadsafe
@@ -332,6 +408,7 @@ void QAbstractEventDispatcher::closingDown()
/*!
\class QAbstractEventDispatcher::TimerInfo
+ \deprecated [6.8] Use TimerInfoV2
\inmodule QtCore
This struct represents information about a timer:
@@ -339,7 +416,7 @@ void QAbstractEventDispatcher::closingDown()
\l{QAbstractEventDispatcher::TimerInfo::interval}{interval}, and
\l{QAbstractEventDispatcher::TimerInfo::timerType}{timerType}.
- \sa registeredTimers()
+ \sa registeredTimers(), QAbstractEventDispatcher::TimerInfoV2, timersForObject()
*/
/*! \fn QAbstractEventDispatcher::TimerInfo::TimerInfo(int timerId, int interval, Qt::TimerType timerType)
@@ -365,6 +442,37 @@ void QAbstractEventDispatcher::closingDown()
*/
/*!
+ \class QAbstractEventDispatcher::TimerInfoV2
+ \inmodule QtCore
+
+ This struct represents information about a timer:
+ \l{QAbstractEventDispatcher::TimerInfoV2::timerId}{timerId},
+ \l{QAbstractEventDispatcher::TimerInfoV2::interval}{interval}, and
+ \l{QAbstractEventDispatcher::TimerInfoV2::timerType}{timerType}.
+
+ \sa timersForObject()
+*/
+/*!
+ \variable QAbstractEventDispatcher::TimerInfoV2::timerId
+
+ The timer's unique id. This is created by registerTimer() upon creation and
+ uniquely identifies a timer while it is active. It is also used by
+ QTimer::id() and returned by QObject::startTimer().
+*/
+/*!
+ \variable QAbstractEventDispatcher::TimerInfoV2::interval
+
+ The timer's interval.
+*/
+/*!
+ \variable QAbstractEventDispatcher::TimerInfoV2::timerType
+
+ The timer's type
+
+ \sa Qt::TimerType
+*/
+
+/*!
Installs an event filter \a filterObj for all native events received by the application.
The event filter \a filterObj receives events via its \l {QAbstractNativeEventFilter::}{nativeEventFilter()}
@@ -415,7 +523,7 @@ void QAbstractEventDispatcher::installNativeEventFilter(QAbstractNativeEventFilt
void QAbstractEventDispatcher::removeNativeEventFilter(QAbstractNativeEventFilter *filter)
{
Q_D(QAbstractEventDispatcher);
- for (int i = 0; i < d->eventFilters.count(); ++i) {
+ for (int i = 0; i < d->eventFilters.size(); ++i) {
if (d->eventFilters.at(i) == filter) {
d->eventFilters[i] = nullptr;
break;
@@ -448,7 +556,7 @@ bool QAbstractEventDispatcher::filterNativeEvent(const QByteArray &eventType, vo
if (!d->eventFilters.isEmpty()) {
// Raise the loopLevel so that deleteLater() calls in or triggered
// by event_filter() will be processed from the main event loop.
- QScopedScopeLevelCounter scopeLevelCounter(d->threadData);
+ QScopedScopeLevelCounter scopeLevelCounter(d->threadData.loadAcquire());
for (int i = 0; i < d->eventFilters.size(); ++i) {
QAbstractNativeEventFilter *filter = d->eventFilters.at(i);
if (!filter)
@@ -476,6 +584,126 @@ bool QAbstractEventDispatcher::filterNativeEvent(const QByteArray &eventType, vo
\sa awake()
*/
+#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0)
+void QAbstractEventDispatcher::registerTimer(Qt::TimerId timerId, Duration interval,
+ Qt::TimerType timerType, QObject *object)
+{
+ if (QAbstractEventDispatcherV2 *self = v2(this))
+ self->registerTimer(timerId, interval, timerType, object);
+ else
+ registerTimer(int(timerId), fromDuration<qint64>(interval), timerType, object);
+}
+
+bool QAbstractEventDispatcher::unregisterTimer(Qt::TimerId timerId)
+{
+ if (QAbstractEventDispatcherV2 *self = v2(this))
+ return self->unregisterTimer(timerId);
+ return unregisterTimer(int(timerId));
+}
+
+QList<QAbstractEventDispatcher::TimerInfoV2>
+QAbstractEventDispatcher::timersForObject(QObject *object) const
+{
+ if (const QAbstractEventDispatcherV2 *self = v2(this))
+ return self->timersForObject(object);
+ QList<TimerInfo> timers = registeredTimers(object);
+ QList<TimerInfoV2> result;
+ result.reserve(timers.size());
+ for (const TimerInfo &t : timers)
+ result.emplaceBack(TimerInfoV2{ t.interval * 1ms, Qt::TimerId(t.timerId), t.timerType });
+ return result;
+}
+
+QAbstractEventDispatcher::Duration
+QAbstractEventDispatcher::remainingTime(Qt::TimerId timerId) const
+{
+ if (const QAbstractEventDispatcherV2 *self = v2(this))
+ return self->remainingTime(timerId);
+ return const_cast<QAbstractEventDispatcher *>(this)->remainingTime(int(timerId)) * 1ms;
+}
+
+/*!
+ \class QAbstractEventDispatcherV2
+ \inmodule QtCore
+
+ This class is a temporary hack to enable transition to an API based on
+ \c{std::chrono} for the Qt event dispatcher. In Qt 7, it will be merged
+ with QAbstractEventDispatcher, replacing the pure virtuals there with the
+ ones defined here.
+
+ It is recommended applications and libraries port to the new API before
+ that future release to simplify work when the time comes.
+*/
+
+/*!
+ Constructs a new event dispatcher with the given \a parent.
+*/
+QAbstractEventDispatcherV2::QAbstractEventDispatcherV2(QObject *parent)
+ : QAbstractEventDispatcherV2(*new QAbstractEventDispatcherPrivate, parent)
+{
+}
+
+/*!
+ \internal
+*/
+QAbstractEventDispatcherV2::QAbstractEventDispatcherV2(QAbstractEventDispatcherPrivate &dd,
+ QObject *parent)
+ : QAbstractEventDispatcher((dd.isV2 = true, dd), parent)
+{
+}
+
+/*!
+ Destroys the event dispatcher.
+*/
+QAbstractEventDispatcherV2::~QAbstractEventDispatcherV2() = default;
+
+/*!
+ \internal
+ Temporary compatibility override.
+*/
+void QAbstractEventDispatcherV2::registerTimer(int timerId, qint64 interval,
+ Qt::TimerType timerType, QObject *object)
+{
+ auto self = static_cast<QAbstractEventDispatcherV2 *>(this);
+ self->registerTimer(Qt::TimerId(timerId), interval * 1ms, timerType, object);
+}
+
+/*!
+ \internal
+ Temporary compatibility override.
+*/
+bool QAbstractEventDispatcherV2::unregisterTimer(int timerId)
+{
+ auto self = static_cast<QAbstractEventDispatcherV2 *>(this);
+ return self->unregisterTimer(Qt::TimerId(timerId));
+}
+
+/*!
+ \internal
+ Temporary compatibility override.
+*/
+auto QAbstractEventDispatcherV2::registeredTimers(QObject *object) const -> QList<TimerInfo>
+{
+ auto self = static_cast<const QAbstractEventDispatcherV2 *>(this);
+ QList<TimerInfoV2> timers = self->timersForObject(object);
+ QList<TimerInfo> result;
+ result.reserve(timers.size());
+ for (const TimerInfoV2 &t : timers)
+ result.emplaceBack(qToUnderlying(t.timerId), fromDuration<int>(t.interval), t.timerType);
+ return result;
+}
+
+/*!
+ \internal
+ Temporary compatibility override.
+*/
+int QAbstractEventDispatcherV2::remainingTime(int timerId)
+{
+ auto self = static_cast<QAbstractEventDispatcherV2 *>(this);
+ return fromDuration<int>(self->remainingTime(Qt::TimerId(timerId)));
+}
+#endif // ! Qt 7
+
QT_END_NAMESPACE
#include "moc_qabstracteventdispatcher.cpp"
diff --git a/src/corelib/kernel/qabstracteventdispatcher.h b/src/corelib/kernel/qabstracteventdispatcher.h
index 717fdc8984..ad97a93ba2 100644
--- a/src/corelib/kernel/qabstracteventdispatcher.h
+++ b/src/corelib/kernel/qabstracteventdispatcher.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QABSTRACTEVENTDISPATCHER_H
#define QABSTRACTEVENTDISPATCHER_H
@@ -55,6 +19,7 @@ class Q_CORE_EXPORT QAbstractEventDispatcher : public QObject
Q_DECLARE_PRIVATE(QAbstractEventDispatcher)
public:
+ using Duration = std::chrono::nanoseconds;
struct TimerInfo
{
int timerId;
@@ -62,8 +27,13 @@ public:
Qt::TimerType timerType;
inline TimerInfo(int id, int i, Qt::TimerType t)
- : timerId(id), interval(i), timerType(t)
- { }
+ : timerId(id), interval(i), timerType(t) { }
+ };
+ struct TimerInfoV2
+ {
+ Duration interval;
+ Qt::TimerId timerId;
+ Qt::TimerType timerType;
};
explicit QAbstractEventDispatcher(QObject *parent = nullptr);
@@ -76,14 +46,29 @@ public:
virtual void registerSocketNotifier(QSocketNotifier *notifier) = 0;
virtual void unregisterSocketNotifier(QSocketNotifier *notifier) = 0;
+ Qt::TimerId registerTimer(Duration interval, Qt::TimerType timerType, QObject *object);
+
+#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0)
int registerTimer(qint64 interval, Qt::TimerType timerType, QObject *object);
+
+ // old, integer-based API
virtual void registerTimer(int timerId, qint64 interval, Qt::TimerType timerType, QObject *object) = 0;
virtual bool unregisterTimer(int timerId) = 0;
- virtual bool unregisterTimers(QObject *object) = 0;
virtual QList<TimerInfo> registeredTimers(QObject *object) const = 0;
-
virtual int remainingTime(int timerId) = 0;
+ void registerTimer(Qt::TimerId timerId, Duration interval, Qt::TimerType timerType, QObject *object);
+ bool unregisterTimer(Qt::TimerId timerId);
+ QList<TimerInfoV2> timersForObject(QObject *object) const;
+ Duration remainingTime(Qt::TimerId timerId) const;
+#else
+ virtual void registerTimer(Qt::TimerId timerId, Duration interval, Qt::TimerType timerType, QObject *object) = 0;
+ virtual bool unregisterTimer(Qt::TimerId timerId) = 0;
+ virtual QList<TimerInfoV2> timersForObject(QObject *object) const = 0;
+ virtual Duration remainingTime(Qt::TimerId timerId) const = 0;
+#endif
+ virtual bool unregisterTimers(QObject *object) = 0;
+
virtual void wakeUp() = 0;
virtual void interrupt() = 0;
@@ -104,6 +89,40 @@ protected:
};
Q_DECLARE_TYPEINFO(QAbstractEventDispatcher::TimerInfo, Q_PRIMITIVE_TYPE);
+Q_DECLARE_TYPEINFO(QAbstractEventDispatcher::TimerInfoV2, Q_PRIMITIVE_TYPE);
+
+#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0)
+class Q_CORE_EXPORT QAbstractEventDispatcherV2 : public QAbstractEventDispatcher
+{
+ Q_OBJECT
+ Q_DECLARE_PRIVATE(QAbstractEventDispatcher) // not V2
+
+public:
+ explicit QAbstractEventDispatcherV2(QObject *parent = nullptr);
+ ~QAbstractEventDispatcherV2();
+
+ // new virtuals
+ virtual void registerTimer(Qt::TimerId timerId, Duration interval, Qt::TimerType timerType,
+ QObject *object) = 0;
+ virtual bool unregisterTimer(Qt::TimerId timerId) = 0;
+ virtual QList<TimerInfoV2> timersForObject(QObject *object) const = 0;
+ virtual Duration remainingTime(Qt::TimerId timerId) const = 0;
+
+protected:
+ QAbstractEventDispatcherV2(QAbstractEventDispatcherPrivate &, QObject *parent);
+
+private:
+ // final overrides from V1
+ virtual void registerTimer(int timerId, qint64 interval, Qt::TimerType timerType,
+ QObject *object) override final;
+ virtual bool unregisterTimer(int timerId) override final;
+ virtual QList<TimerInfo> registeredTimers(QObject *object) const override final;
+
+ virtual int remainingTime(int timerId) override final;
+};
+#else
+using QAbstractEventDispatcherV2 = QAbstractEventDispatcher;
+#endif // Qt 7
QT_END_NAMESPACE
diff --git a/src/corelib/kernel/qabstracteventdispatcher_p.h b/src/corelib/kernel/qabstracteventdispatcher_p.h
index 5679cae076..2576027d52 100644
--- a/src/corelib/kernel/qabstracteventdispatcher_p.h
+++ b/src/corelib/kernel/qabstracteventdispatcher_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QABSTRACTEVENTDISPATCHER_P_H
#define QABSTRACTEVENTDISPATCHER_P_H
@@ -52,23 +16,34 @@
//
#include "QtCore/qabstracteventdispatcher.h"
+#include "QtCore/qnamespace.h"
#include "private/qobject_p.h"
+#include "QtCore/qttypetraits.h"
QT_BEGIN_NAMESPACE
-Q_CORE_EXPORT uint qGlobalPostedEventsCount();
+Q_AUTOTEST_EXPORT qsizetype qGlobalPostedEventsCount();
class Q_CORE_EXPORT QAbstractEventDispatcherPrivate : public QObjectPrivate
{
Q_DECLARE_PUBLIC(QAbstractEventDispatcher)
public:
- inline QAbstractEventDispatcherPrivate()
- { }
+ QAbstractEventDispatcherPrivate();
+ ~QAbstractEventDispatcherPrivate() override;
QList<QAbstractNativeEventFilter *> eventFilters;
+ bool isV2 = false;
+
static int allocateTimerId();
static void releaseTimerId(int id);
+ static void releaseTimerId(Qt::TimerId id)
+ { releaseTimerId(qToUnderlying(id)); }
+
+ static QAbstractEventDispatcherPrivate *get(QAbstractEventDispatcher *o)
+ { return o->d_func(); }
+ static const QAbstractEventDispatcherPrivate *get(const QAbstractEventDispatcher *o)
+ { return o->d_func(); }
};
QT_END_NAMESPACE
diff --git a/src/corelib/kernel/qabstractnativeeventfilter.cpp b/src/corelib/kernel/qabstractnativeeventfilter.cpp
index 392098a2f5..7b31c0fac5 100644
--- a/src/corelib/kernel/qabstractnativeeventfilter.cpp
+++ b/src/corelib/kernel/qabstractnativeeventfilter.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qabstractnativeeventfilter.h"
#include "qabstracteventdispatcher.h"
@@ -105,6 +69,9 @@ QAbstractNativeEventFilter::~QAbstractNativeEventFilter()
\b {Linux example}
\snippet code/src_corelib_kernel_qabstractnativeeventfilter.cpp 0
+ \b {Windows example}
+ \snippet code/src_corelib_kernel_qabstractnativeeventfilter_win.cpp 0
+
\b {macOS example}
mycocoaeventfilter.h:
diff --git a/src/corelib/kernel/qabstractnativeeventfilter.h b/src/corelib/kernel/qabstractnativeeventfilter.h
index b9a8863bb5..3660a31dba 100644
--- a/src/corelib/kernel/qabstractnativeeventfilter.h
+++ b/src/corelib/kernel/qabstractnativeeventfilter.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QABSTRACTNATIVEEVENTFILTER_H
#define QABSTRACTNATIVEEVENTFILTER_H
diff --git a/src/corelib/kernel/qapplicationstatic.h b/src/corelib/kernel/qapplicationstatic.h
index 33567596e6..bf5e79b8bf 100644
--- a/src/corelib/kernel/qapplicationstatic.h
+++ b/src/corelib/kernel/qapplicationstatic.h
@@ -1,101 +1,85 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// Copyright (C) 2021 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QAPPLICATIONSTATIC_H
#define QAPPLICATIONSTATIC_H
#include <QtCore/QMutex>
+#include <QtCore/qcoreapplication.h>
#include <QtCore/qglobalstatic.h>
+#include <new>
+
QT_BEGIN_NAMESPACE
-#define Q_APPLICATION_STATIC_INTERNAL_HOLDER(ARGS) \
- Q_GLOBAL_STATIC_INTERNAL_HOLDER(ARGS) \
- struct LifecycleHolder : public Holder \
- { \
- LifecycleHolder() { connectLifecycle(); } \
- BaseType *get() \
- { \
- const QMutexLocker locker(&theMutex); \
- if (value.get() == nullptr \
- && guard.loadRelaxed() == QtGlobalStatic::Initialized) { \
- value.reset(ARGS); \
- connectLifecycle(); \
- } \
- return value.get(); \
- } \
- void connectLifecycle() \
- { \
- Q_ASSERT(QCoreApplication::instance()); \
- QObject::connect(QCoreApplication::instance(), \
- &QCoreApplication::destroyed, [this] { \
- const QMutexLocker locker(&theMutex); \
- value.reset(nullptr); \
- }); \
- } \
- };
+namespace QtGlobalStatic {
+template <typename QAS> struct ApplicationHolder
+{
+ using Type = typename QAS::QAS_Type;
+ using PlainType = std::remove_cv_t<Type>;
+
+ Q_CONSTINIT static inline struct { alignas(Type) unsigned char data[sizeof(Type)]; } storage = {};
+ Q_CONSTINIT static inline QBasicAtomicInteger<qint8> guard = { QtGlobalStatic::Uninitialized };
+ Q_CONSTINIT static inline QBasicMutex mutex {};
+
+ static constexpr bool MutexLockIsNoexcept = noexcept(mutex.lock());
+ static constexpr bool ConstructionIsNoexcept = noexcept(QAS::innerFunction(nullptr));
-#define Q_APPLICATION_STATIC_INTERNAL(ARGS) \
- Q_GLOBAL_STATIC_INTERNAL_DECORATION BaseType *innerFunction() \
- { \
- Q_APPLICATION_STATIC_INTERNAL_HOLDER(ARGS) \
- static LifecycleHolder holder; \
- return holder.get(); \
+ ApplicationHolder() = default;
+ Q_DISABLE_COPY_MOVE(ApplicationHolder)
+ ~ApplicationHolder()
+ {
+ if (guard.loadAcquire() == QtGlobalStatic::Initialized) {
+ // No mutex! Up to external code to ensure no race happens.
+ guard.storeRelease(QtGlobalStatic::Destroyed);
+ realPointer()->~PlainType();
+ }
}
-#define Q_APPLICATION_STATIC_WITH_ARGS(TYPE, NAME, ARGS) \
- QT_WARNING_PUSH \
- QT_WARNING_DISABLE_CLANG("-Wunevaluated-expression") \
- namespace { namespace Q_QAS_ ## NAME { \
- typedef TYPE BaseType; \
- typedef std::unique_ptr<BaseType> Type; \
- QBasicAtomicInt guard = Q_BASIC_ATOMIC_INITIALIZER(QtGlobalStatic::Uninitialized); \
- QBasicMutex theMutex; \
- Q_APPLICATION_STATIC_INTERNAL((new BaseType ARGS)) \
- } } \
- static QGlobalStatic<TYPE, \
- Q_QAS_ ## NAME::innerFunction, \
- Q_QAS_ ## NAME::guard> NAME; \
- QT_WARNING_POP
+ static PlainType *realPointer()
+ {
+ return std::launder(reinterpret_cast<PlainType *>(&storage));
+ }
+
+ // called from QGlobalStatic::instance()
+ PlainType *pointer() noexcept(MutexLockIsNoexcept && ConstructionIsNoexcept)
+ {
+ if (guard.loadAcquire() == QtGlobalStatic::Initialized)
+ return realPointer();
+ QMutexLocker locker(&mutex);
+ if (guard.loadRelaxed() == QtGlobalStatic::Uninitialized) {
+ QAS::innerFunction(&storage);
+ const auto *app = QCoreApplication::instance();
+ Q_ASSERT_X(app, Q_FUNC_INFO,
+ "The application static was used without a QCoreApplication instance");
+ QObject::connect(app, &QObject::destroyed, app, reset, Qt::DirectConnection);
+ guard.storeRelease(QtGlobalStatic::Initialized);
+ }
+ return realPointer();
+ }
-#define Q_APPLICATION_STATIC(TYPE, NAME) \
- Q_APPLICATION_STATIC_WITH_ARGS(TYPE, NAME, ())
+ static void reset()
+ {
+ // we only synchronize using the mutex here, not the guard
+ QMutexLocker locker(&mutex);
+ realPointer()->~PlainType();
+ guard.storeRelaxed(QtGlobalStatic::Uninitialized);
+ }
+};
+} // namespace QtGlobalStatic
+
+#define Q_APPLICATION_STATIC(TYPE, NAME, ...) \
+ namespace { struct Q_QAS_ ## NAME { \
+ typedef TYPE QAS_Type; \
+ static void innerFunction(void *pointer) \
+ noexcept(noexcept(std::remove_cv_t<QAS_Type>(__VA_ARGS__))) \
+ { \
+ new (pointer) QAS_Type(__VA_ARGS__); \
+ } \
+ }; } \
+ static QGlobalStatic<QtGlobalStatic::ApplicationHolder<Q_QAS_ ## NAME>> NAME;\
+ /**/
QT_END_NAMESPACE
diff --git a/src/corelib/kernel/qapplicationstatic.qdoc b/src/corelib/kernel/qapplicationstatic.qdoc
index 4d203a78ae..5cbac65df9 100644
--- a/src/corelib/kernel/qapplicationstatic.qdoc
+++ b/src/corelib/kernel/qapplicationstatic.qdoc
@@ -1,98 +1,109 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
- \macro Q_APPLICATION_STATIC(Type, VariableName)
+ \macro Q_APPLICATION_STATIC(Type, VariableName, ...)
\since 6.3
\relates QGlobalStatic
This macro extends Q_GLOBAL_STATIC and creates a global and static object
- of type \l QGlobalStatic, of name \a VariableName and that behaves as a
- pointer to \a Type, where the actual lifetime of the type is bound to the
- QCoreApplication. The object created by Q_APPLICATION_STATIC initializes
- itself on the first use, which means that it will not increase the application
- or the library's load time. Additionally, the object is initialized in a
- thread-safe manner on all platforms.
+ of type \l QGlobalStatic, of name \a VariableName, initialized by the
+ variadic arguments, and that behaves as a pointer to \a Type, where the
+ actual lifetime of the type is bound to the QCoreApplication. The object
+ created by Q_APPLICATION_STATIC initializes itself on the first use, which
+ means that it will not increase the application or the library's load time.
+ Additionally, the object is initialized in a thread-safe manner on all
+ platforms.
In contrast to Q_GLOBAL_STATIC where the type is only meant to be destroyed at
program exit, here the actual lifetime of the type is bound to the lifetime of
the QCoreApplication. This makes it ideal to store semi-static QObjects, which
should also be destroyed once the QCoreApplication is destroyed. This means the
type will get deleted once the QCoreApplication emits the destroyed signal.
- However, as long as the actual holder is still in the initialized state, the
- type will be recreated when it's accessed again once a new QCoreApplication
- has been created.
+ It is permitted for the object to be recreated when it's accessed again, if
+ a new QCoreApplication has also been created.
- Since the value is bound to the QCoreApplication it should only ever be accessed,
- if there is a valid QCoreApplication::instance().
+ Since the value is bound to the QCoreApplication, it should only ever be
+ accessed if there is a valid QCoreApplication::instance(). Accessing this
+ object before QCoreApplication is created or after it's destroyed will
+ produce warnings and may have unpredictable behavior.
The typical use of this macro is as follows, in a global context (that is,
outside of any function bodies):
\code
- Q_APPLICATION_STATIC(MyQObjectType, staticType)
+ Q_APPLICATION_STATIC(MyQObjectType, staticType, "some string", function())
\endcode
+ Do note that the arguments passed in variadic fashion to this macro are
+ evaluated every time the object is constructed, so in the above example,
+ the function \c{function} will be called more than once if the object is
+ recreated.
+
Aside from the value also being bound to the lifetime of the QCoreApplication,
this macro behaves identically to Q_GLOBAL_STATIC(). Please see that macro's
documentation for more information.
- \sa Q_APPLICATION_STATIC_WITH_ARGS(), QGlobalStatic
-*/
-
-/*!
- \macro Q_APPLICATION_STATIC_WITH_ARGS(Type, VariableName, Arguments)
- \since 6.3
- \relates QGlobalStatic
-
- Creates a global and static object of type \l QGlobalStatic, of name \a
- VariableName, initialized by the arguments \a Arguments and that behaves as
- a pointer to \a Type, where the actual lifetime of the type is bound to the
- QCoreApplication. The object created by Q_APPLICATION_STATIC_WITH_ARGS
- initializes itself on the first use, which means that it will not increase
- the application or the library's load time. Additionally, the object is
- initialized in a thread-safe manner on all platforms.
-
- Since the value is bound to the QCoreApplication it should only ever be accessed,
- if there is a valid QCoreApplication::instance().
-
- The typical use of this macro is as follows, in a global context (that is,
- outside of any function bodies):
-
- \code
- Q_APPLICATION_STATIC_WITH_ARGS(MyQObjectType, staticType, (42, "Hello", "World"))
- \endcode
-
- The \a Arguments macro parameter must always include the parentheses or, if
- C++11 uniform initialization is allowed, the braces.
-
- Aside from the actual initialization of the contents with the supplied
- arguments, this macro behaves identically to Q_APPLICATION_STATIC(). Please
- see that macro's documentation for more information.
-
- \sa Q_APPLICATION_STATIC(), QGlobalStatic
+ \section1 Threading guarantees
+
+ The Q_APPLICATION_STATIC macro ensures that the object is initialized only
+ once (per lifetime of a QCoreApplication), even if multiple threads try to
+ concurrently access the object. This is done by providing a per-object
+ mutex; application and library developers need to be aware that their
+ object will be constructed with this mutex locked and therefore must not
+ reenter the same object's initialization, or a deadlock will occur.
+
+ There is no thread-safety on the destruction of the object: user code must
+ not access this object once the QCoreApplication destructor starts to run.
+ User code must arrange to ensure this does not happen, such as by not
+ accessing it once the main thread's event loop has exited.
+
+ Like Q_GLOBAL_STATIC, Q_APPLICATION_STATIC provides no thread-safety
+ guarantees for accesses to the object once creation is finished. It is up
+ to user code to ensure that no racy data accesses happen.
+
+ In case the object created by this operation is a QObject, its associated
+ thread will be the one that succeeded in creating it. It will be destroyed
+ by the main thread, so a \l{QObject::}{moveToThread()} to the main thread
+ or to no thread before destruction is adviseable. Doing so from the
+ constructor of the class in question is a sensible solution if one can't
+ guarantee that the main thread will be the one to initialize the object.
+
+ \omit
+ \section1 Implementation details
+ See \l Q_GLOBAL_STATIC implementation details for an introduction.
+
+ Q_APPLICATION_STATIC uses the same \l QGlobalStatic public class that
+ Q_GLOBAL_STATIC does, but instead uses a QtGlobalStatic::ApplicationHolder
+ template class as the template parameter. The differences to
+ QtGlobalStatic::Holder are:
+
+ \list
+ \li The ApplicationHolder class is empty. Unlike Holder, the storage is
+ provided as a \c {static inline} member, simply so that the static
+ member reset() function can access it without having to save the
+ pointer in a lambda.
+
+ \li The ApplicationHolder constructor is trivial; initialization of the
+ type is instead deferred to the \c pointer() function. This means the
+ C++11 thread-safe initialization of statics does not protect the
+ object.
+
+ \li Instead, ApplicationHolder provides a mutex (implemented as a \c
+ {static inline} member of type \l QBasicMutex) and locks it before
+ constructing or destructing the object.
+
+ \li After constructing the object, it will QObject::connect() the
+ QCoreApplication::destroyed() signal to a function that will in turn
+ destroy the object.
+
+ \li The destructor will destroy the object if the application is
+ exiting without first destroying the QCoreApplication object (i.e., a
+ call to \c ::exit) or this Q_APPLICATION_STATIC is part of a plugin
+ that is being unloaded.
+ \endlist
+
+ \endomit
+
+ \sa Q_GLOBAL_STATIC, QGlobalStatic
*/
diff --git a/src/corelib/kernel/qassociativeiterable.cpp b/src/corelib/kernel/qassociativeiterable.cpp
index f978acbd8b..db17c392a2 100644
--- a/src/corelib/kernel/qassociativeiterable.cpp
+++ b/src/corelib/kernel/qassociativeiterable.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include <QtCore/qassociativeiterable.h>
#include <QtCore/qvariant.h>
diff --git a/src/corelib/kernel/qassociativeiterable.h b/src/corelib/kernel/qassociativeiterable.h
index 6fe0ff670c..f3963d350e 100644
--- a/src/corelib/kernel/qassociativeiterable.h
+++ b/src/corelib/kernel/qassociativeiterable.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QASSOCIATIVEITERABLE_H
#define QASSOCIATIVEITERABLE_H
diff --git a/src/corelib/kernel/qbasictimer.cpp b/src/corelib/kernel/qbasictimer.cpp
index 60de171e14..17711a355e 100644
--- a/src/corelib/kernel/qbasictimer.cpp
+++ b/src/corelib/kernel/qbasictimer.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qbasictimer.h"
#include "qabstracteventdispatcher.h"
@@ -69,10 +33,8 @@ QT_BEGIN_NAMESPACE
can maintain a list of basic timers by holding them in container
that supports move-only types, e.g. std::vector.
- The \l{widgets/wiggly}{Wiggly} example uses QBasicTimer to repaint
- a widget at regular intervals.
-
- \sa QTimer, QTimerEvent, QObject::timerEvent(), Timers, {Wiggly Example}
+ \sa QTimer, QChronoTimer, QTimerEvent, QObject::timerEvent(),
+ Timers, {Affine Transformations}
*/
@@ -122,10 +84,18 @@ QT_BEGIN_NAMESPACE
/*!
\fn QBasicTimer::swap(QBasicTimer &other)
+ \since 5.14
+
+ Swaps the timer \a other with this timer.
+ This operation is very fast and never fails.
+*/
+
+/*!
\fn swap(QBasicTimer &lhs, QBasicTimer &rhs)
+ \relates QBasicTimer
\since 5.14
- Swaps string \a other with this string, or \a lhs with \a rhs.
+ Swaps the timer \a lhs with \a rhs.
This operation is very fast and never fails.
*/
@@ -140,7 +110,13 @@ QT_BEGIN_NAMESPACE
/*!
\fn void QBasicTimer::start(int msec, QObject *object)
- Starts (or restarts) the timer with a \a msec milliseconds timeout. The
+ \obsolete Use chrono overload instead.
+*/
+
+/*!
+ \since 6.5
+
+ Starts (or restarts) the timer with a \a duration timeout. The
timer will be a Qt::CoarseTimer. See Qt::TimerType for information on the
different timer types.
@@ -148,15 +124,23 @@ QT_BEGIN_NAMESPACE
\sa stop(), isActive(), QObject::timerEvent(), Qt::CoarseTimer
*/
-void QBasicTimer::start(int msec, QObject *obj)
+void QBasicTimer::start(std::chrono::milliseconds duration, QObject *object)
{
- start(msec, Qt::CoarseTimer, obj);
+ start(duration, Qt::CoarseTimer, object);
}
/*!
+ \fn QBasicTimer::start(int msec, Qt::TimerType timerType, QObject *obj)
\overload
+ \obsolete
+
+ Use chrono overload instead.
+*/
+
+/*!
+ \since 6.5
- Starts (or restarts) the timer with a \a msec milliseconds timeout and the
+ Starts (or restarts) the timer with a \a duration timeout and the
given \a timerType. See Qt::TimerType for information on the different
timer types.
@@ -164,10 +148,10 @@ void QBasicTimer::start(int msec, QObject *obj)
\sa stop(), isActive(), QObject::timerEvent(), Qt::TimerType
*/
-void QBasicTimer::start(int msec, Qt::TimerType timerType, QObject *obj)
+void QBasicTimer::start(std::chrono::milliseconds duration, Qt::TimerType timerType, QObject *obj)
{
QAbstractEventDispatcher *eventDispatcher = QAbstractEventDispatcher::instance();
- if (Q_UNLIKELY(msec < 0)) {
+ if (Q_UNLIKELY(duration.count() < 0)) {
qWarning("QBasicTimer::start: Timers cannot have negative timeouts");
return;
}
@@ -181,7 +165,7 @@ void QBasicTimer::start(int msec, Qt::TimerType timerType, QObject *obj)
}
stop();
if (obj)
- id = eventDispatcher->registerTimer(msec, timerType, obj);
+ id = int(eventDispatcher->registerTimer(duration, timerType, obj));
}
/*!
@@ -193,7 +177,7 @@ void QBasicTimer::stop()
{
if (id) {
QAbstractEventDispatcher *eventDispatcher = QAbstractEventDispatcher::instance();
- if (eventDispatcher && !eventDispatcher->unregisterTimer(id)) {
+ if (eventDispatcher && !eventDispatcher->unregisterTimer(Qt::TimerId(id))) {
qWarning("QBasicTimer::stop: Failed. Possibly trying to stop from a different thread");
return;
}
diff --git a/src/corelib/kernel/qbasictimer.h b/src/corelib/kernel/qbasictimer.h
index 6a2728dd56..ccc93f6e9b 100644
--- a/src/corelib/kernel/qbasictimer.h
+++ b/src/corelib/kernel/qbasictimer.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QBASICTIMER_H
#define QBASICTIMER_H
@@ -43,6 +7,8 @@
#include <QtCore/qglobal.h>
#include <QtCore/qnamespace.h>
+#include <chrono>
+
QT_BEGIN_NAMESPACE
@@ -58,22 +24,37 @@ public:
inline ~QBasicTimer() { if (id) stop(); }
QBasicTimer(QBasicTimer &&other) noexcept
- : id{qExchange(other.id, 0)}
+ : id{std::exchange(other.id, 0)}
{}
QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_MOVE_AND_SWAP(QBasicTimer)
- void swap(QBasicTimer &other) noexcept { qSwap(id, other.id); }
+ void swap(QBasicTimer &other) noexcept { std::swap(id, other.id); }
bool isActive() const noexcept { return id != 0; }
int timerId() const noexcept { return id; }
-
+ QT_CORE_INLINE_SINCE(6, 5)
void start(int msec, QObject *obj);
+ QT_CORE_INLINE_SINCE(6, 5)
void start(int msec, Qt::TimerType timerType, QObject *obj);
+ void start(std::chrono::milliseconds duration, QObject *obj);
+ void start(std::chrono::milliseconds duration, Qt::TimerType timerType, QObject *obj);
void stop();
};
Q_DECLARE_TYPEINFO(QBasicTimer, Q_RELOCATABLE_TYPE);
+#if QT_CORE_INLINE_IMPL_SINCE(6, 5)
+void QBasicTimer::start(int msec, QObject *obj)
+{
+ start(std::chrono::milliseconds{msec}, obj);
+}
+
+void QBasicTimer::start(int msec, Qt::TimerType t, QObject *obj)
+{
+ start(std::chrono::milliseconds{msec}, t, obj);
+}
+#endif
+
inline void swap(QBasicTimer &lhs, QBasicTimer &rhs) noexcept { lhs.swap(rhs); }
QT_END_NAMESPACE
diff --git a/src/corelib/kernel/qbindingstorage.h b/src/corelib/kernel/qbindingstorage.h
index bfc3e31d3f..1c03b23bfa 100644
--- a/src/corelib/kernel/qbindingstorage.h
+++ b/src/corelib/kernel/qbindingstorage.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QBINDINGSTORAGE_H
#define QBINDINGSTORAGE_H
@@ -65,6 +29,11 @@ struct QBindingStatus
QPropertyDelayedNotifications *groupUpdateData = nullptr;
};
+namespace QtPrivate {
+struct QBindingStatusAccessToken;
+Q_AUTOTEST_EXPORT QBindingStatus *getBindingStatus(QBindingStatusAccessToken);
+}
+
struct QBindingStorageData;
class Q_CORE_EXPORT QBindingStorage
@@ -81,10 +50,13 @@ public:
~QBindingStorage();
bool isEmpty() { return !d; }
+ bool isValid() const noexcept { return bindingStatus; }
+
+ const QBindingStatus *status(QtPrivate::QBindingStatusAccessToken) const;
void registerDependency(const QUntypedPropertyData *data) const
{
- if (!bindingStatus->currentlyEvaluatingBinding)
+ if (!bindingStatus || !bindingStatus->currentlyEvaluatingBinding)
return;
registerDependency_helper(data);
}
@@ -94,8 +66,10 @@ public:
return nullptr;
return bindingData_helper(data);
}
- // ### Qt 7: remove unused BIC shim
+
+#if QT_CORE_REMOVED_SINCE(6, 2)
void maybeUpdateBindingAndRegister(const QUntypedPropertyData *data) const { registerDependency(data); }
+#endif
QtPrivate::QPropertyBindingData *bindingData(QUntypedPropertyData *data, bool create)
{
@@ -104,10 +78,13 @@ public:
return bindingData_helper(data, create);
}
private:
+ void reinitAfterThreadMove();
void clear();
void registerDependency_helper(const QUntypedPropertyData *data) const;
+#if QT_CORE_REMOVED_SINCE(6, 2)
// ### Unused, but keep for BC
void maybeUpdateBindingAndRegister_helper(const QUntypedPropertyData *data) const;
+#endif
QtPrivate::QPropertyBindingData *bindingData_helper(const QUntypedPropertyData *data) const;
QtPrivate::QPropertyBindingData *bindingData_helper(QUntypedPropertyData *data, bool create);
};
diff --git a/src/corelib/kernel/qcfsocketnotifier.cpp b/src/corelib/kernel/qcfsocketnotifier.cpp
index 9b1ed8cbf9..21a22a7439 100644
--- a/src/corelib/kernel/qcfsocketnotifier.cpp
+++ b/src/corelib/kernel/qcfsocketnotifier.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qcfsocketnotifier_p.h"
#include <QtCore/qcoreapplication.h>
@@ -249,7 +213,7 @@ void QCFSocketNotifier::unregisterSocketNotifier(QSocketNotifier *notifier)
void QCFSocketNotifier::removeSocketNotifiers()
{
// Remove CFSockets from the runloop.
- for (MacSocketInfo *socketInfo : qAsConst(macSockets)) {
+ for (MacSocketInfo *socketInfo : std::as_const(macSockets)) {
unregisterSocketInfo(socketInfo);
delete socketInfo;
}
diff --git a/src/corelib/kernel/qcfsocketnotifier_p.h b/src/corelib/kernel/qcfsocketnotifier_p.h
index 12c5bf6334..9bffe132dd 100644
--- a/src/corelib/kernel/qcfsocketnotifier_p.h
+++ b/src/corelib/kernel/qcfsocketnotifier_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QCFSOCKETNOTIFIER_P_H
#define QCFSOCKETNOTIFIER_P_H
diff --git a/src/corelib/kernel/qchronotimer.cpp b/src/corelib/kernel/qchronotimer.cpp
new file mode 100644
index 0000000000..a517c4446b
--- /dev/null
+++ b/src/corelib/kernel/qchronotimer.cpp
@@ -0,0 +1,452 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// Copyright (C) 2016 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#include "qchronotimer.h"
+#include "qtimer_p.h"
+#include "qsingleshottimer_p.h"
+
+#include "qabstracteventdispatcher.h"
+#include "qcoreapplication.h"
+#include "qcoreapplication_p.h"
+#include "qdeadlinetimer.h"
+#include "qmetaobject_p.h"
+#include "qobject_p.h"
+#include "qproperty_p.h"
+#include "qthread.h"
+
+using namespace std::chrono_literals;
+
+QT_BEGIN_NAMESPACE
+
+/*!
+ \class QChronoTimer
+ \inmodule QtCore
+ \since 6.8
+ \ingroup events
+
+ \brief The QChronoTimer class provides repetitive and single-shot timers.
+
+ The QChronoTimer class provides a high-level programming interface for
+ timers. To use it, create a QChronoTimer, either passing the interval to the
+ constructor, or setting it after construction using setInterval(), connect
+ its timeout() signal to the appropriate slots, and call start(). From then
+ on, it will emit the timeout() signal at constant intervals. For example:
+
+ \snippet timers/timers.cpp timer-interval-in-ctor
+ \snippet timers/timers.cpp timer-setinterval
+
+ You can set a timer to time out only once by calling setSingleShot(true).
+
+ QChronoTimer also has singleShot() static methods:
+
+ \snippet timers/timers.cpp qchronotimer-singleshot
+
+ In multithreaded applications, you can use QChronoTimer in any thread
+ that has an event loop. To start an event loop from a non-GUI
+ thread, use QThread::exec(). Qt uses the timer's
+ \l{QObject::thread()}{thread affinity} to determine which thread
+ will emit the \l{QChronoTimer::}{timeout()} signal. Because of this, you
+ must start and stop the timer in its thread; it is not possible to
+ start a timer from another thread.
+
+ As a special case, a QChronoTimer with a timeout of \c 0ns will time out
+ as soon as possible, though the ordering between zero timers and other
+ sources of events is unspecified. Zero timers can be used to do some
+ work while still providing a responsive user interface:
+
+ \snippet timers/timers.cpp zero-timer
+
+ From then on, \c processOneThing() will be called repeatedly. It should
+ be written in such a way that it always returns quickly (for example,
+ after processing one data item) so that Qt can deliver events to the user
+ interface and stop the timer as soon as it has done all its work. This
+ is the traditional way of implementing heavy work in GUI applications,
+ but as multithreading is becoming available on more platforms, a modern
+ alternative is doing the heavy work in a thread other than the GUI (main)
+ thread. Qt has the QThread class, which can be used to achieve that.
+
+ \section1 Accuracy and Timer Resolution
+
+ The accuracy of timers depends on the underlying operating system and
+ hardware. Most platforms support requesting nano-second precision for
+ timers (for example, libc's \c nanosleep), though the accuracy of the
+ timer will not equal this resolution in many real-world situations.
+
+ You can set the \l{Qt::TimerType}{timer type} to tell QChronoTimer which
+ precision to request from the system.
+
+ For Qt::PreciseTimer, QChronoTimer will try to keep the precision at
+ \c 1ns. Precise timers will never time out earlier than expected.
+
+ For Qt::CoarseTimer and Qt::VeryCoarseTimer types, QChronoTimer may wake
+ up earlier than expected, within the margins for those types:
+ \list
+ \li 5% of the interval for Qt::CoarseTimer
+ \li \c 500ms for Qt::VeryCoarseTimer
+ \endlist
+
+ All timer types may time out later than expected if the system is busy or
+ unable to provide the requested accuracy. In such a case of timeout
+ overrun, Qt will emit timeout() only once, even if multiple timeouts have
+ expired, and then will resume the original interval.
+
+ \section1 Alternatives to QChronoTimer
+
+ An alternative to using QChronoTimer is to call QObject::startTimer()
+ for your object and reimplement the QObject::timerEvent() event handler
+ in your class (which must be a sub-class of QObject). The disadvantage
+ is that timerEvent() does not support such high-level features as
+ single-shot timers or signals.
+
+ Another alternative is QBasicTimer. It is typically less cumbersome
+ than using QObject::startTimer() directly. See \l{Timers} for an
+ overview of all three approaches.
+
+ Some operating systems limit the number of timers that may be used;
+ Qt does its best to work around these limitations.
+
+ \sa QBasicTimer, QTimerEvent, QObject::timerEvent(), Timers,
+ {Analog Clock}
+*/
+
+/*!
+ Constructs a timer with the given \a parent, using the default interval,
+ \c 0ns.
+*/
+QChronoTimer::QChronoTimer(QObject *parent)
+ : QChronoTimer(0ns, parent)
+{
+}
+
+/*!
+ Constructs a timer with the given \a parent, using an interval of \a nsec.
+*/
+QChronoTimer::QChronoTimer(std::chrono::nanoseconds nsec, QObject *parent)
+ : QObject(*new QTimerPrivate(nsec, this), parent)
+{
+ Q_ASSERT(!d_func()->isQTimer);
+}
+
+/*!
+ Destroys the timer.
+*/
+QChronoTimer::~QChronoTimer()
+{
+ if (d_func()->isActive()) // stop running timer
+ stop();
+}
+
+/*!
+ \fn void QChronoTimer::timeout()
+
+ This signal is emitted when the timer times out.
+
+ \sa interval, start(), stop()
+*/
+
+/*!
+ \property QChronoTimer::active
+
+ This boolean property is \c true if the timer is running; otherwise
+ \c false.
+*/
+
+/*!
+ Returns \c true if the timer is running (pending); otherwise returns
+ false.
+*/
+bool QChronoTimer::isActive() const
+{
+ return d_func()->isActiveData.value();
+}
+
+QBindable<bool> QChronoTimer::bindableActive()
+{
+ return QBindable<bool>(&d_func()->isActiveData);
+}
+
+/*!
+ Returns a Qt::TimerId representing the timer ID if the timer is running;
+ otherwise returns \c Qt::TimerId::Invalid.
+
+ \sa Qt::TimerId
+*/
+Qt::TimerId QChronoTimer::id() const
+{
+ return d_func()->id;
+}
+
+/*! \overload start()
+
+ Starts or restarts the timer with the timeout specified in \l interval.
+
+ If the timer is already running, it will be
+ \l{QChronoTimer::stop()}{stopped} and restarted.
+
+ If \l singleShot is true, the timer will be activated only once.
+*/
+void QChronoTimer::start()
+{
+ auto *d = d_func();
+ if (d->isActive()) // stop running timer
+ stop();
+ const auto id = Qt::TimerId{QObject::startTimer(d->intervalDuration, d->type)};
+ if (id > Qt::TimerId::Invalid) {
+ d->id = id;
+ d->isActiveData.notify();
+ }
+}
+
+/*!
+ Stops the timer.
+
+ \sa start()
+*/
+void QChronoTimer::stop()
+{
+ auto *d = d_func();
+ if (d->isActive()) {
+ QObject::killTimer(d->id);
+ d->id = Qt::TimerId::Invalid;
+ d->isActiveData.notify();
+ }
+}
+
+/*!
+ \reimp
+*/
+void QChronoTimer::timerEvent(QTimerEvent *e)
+{
+ auto *d = d_func();
+ if (Qt::TimerId{e->timerId()} == d->id) {
+ if (d->single)
+ stop();
+ Q_EMIT timeout(QPrivateSignal());
+ }
+}
+
+/*!
+ \fn template <typename Functor> QMetaObject::Connection QChronoTimer::callOnTimeout(const QObject *context, Functor &&slot, Qt::ConnectionType connectionType = Qt::AutoConnection)
+ \overload callOnTimeout()
+
+ Creates a connection from the timeout() signal to \a slot to be placed in a
+ specific event loop of \a context, with connection type \a connectionType,
+ and returns a handle to the connection.
+
+ This method is provided as a convenience. It's equivalent to calling:
+ \code
+ QObject::connect(timer, &QChronoTimer::timeout, context, slot, connectionType);
+ \endcode
+
+ \sa QObject::connect(), timeout()
+*/
+
+/*!
+ \property QChronoTimer::singleShot
+ \brief Whether the timer is a single-shot timer
+
+ A single-shot timer fires only once, non-single-shot timers fire every
+ \l interval.
+
+ The default value for this property is \c false.
+
+ \sa interval, singleShot()
+*/
+void QChronoTimer::setSingleShot(bool singleShot)
+{
+ d_func()->single = singleShot;
+}
+
+bool QChronoTimer::isSingleShot() const
+{
+ return d_func()->single;
+}
+
+QBindable<bool> QChronoTimer::bindableSingleShot()
+{
+ return QBindable<bool>(&d_func()->single);
+}
+
+/*!
+ \property QChronoTimer::interval
+ \brief The timeout interval
+
+ The default value for this property is \c 0ns.
+
+ A QChronoTimer with a timeout of \c 0ns will time out as soon as all
+ the events in the window system's event queue have been processed.
+
+ Setting the interval of an active timer changes the interval and acquires
+ a new id(). If the timer is not active, only the interval is changed.
+
+ \sa singleShot
+*/
+void QChronoTimer::setInterval(std::chrono::nanoseconds nsec)
+{
+ auto *d = d_func();
+ d->intervalDuration.removeBindingUnlessInWrapper();
+ const bool intervalChanged = nsec != d->intervalDuration.valueBypassingBindings();
+ d->intervalDuration.setValueBypassingBindings(nsec);
+ if (d->isActive()) { // Create new timer
+ QObject::killTimer(d->id); // Restart timer
+ const auto newId = Qt::TimerId{QObject::startTimer(nsec, d->type)};
+ if (newId > Qt::TimerId::Invalid) {
+ // Restarted successfully. No need to update the active state.
+ d->id = newId;
+ } else {
+ // Failed to start the timer.
+ // Need to notify about active state change.
+ d->id = Qt::TimerId::Invalid;
+ d->isActiveData.notify();
+ }
+ }
+ if (intervalChanged)
+ d->intervalDuration.notify();
+}
+
+std::chrono::nanoseconds QChronoTimer::interval() const
+{
+ return d_func()->intervalDuration.value();
+}
+
+QBindable<std::chrono::nanoseconds> QChronoTimer::bindableInterval()
+{
+ return {&d_func()->intervalDuration};
+}
+
+/*!
+ \property QChronoTimer::remainingTime
+ \brief The remaining time
+
+ Returns the remaining duration until the timeout.
+
+ If the timer is inactive, the returned duration will be negative.
+
+ If the timer is overdue, the returned duration will be \c 0ns.
+
+ \sa interval
+*/
+std::chrono::nanoseconds QChronoTimer::remainingTime() const
+{
+ if (isActive())
+ return QAbstractEventDispatcher::instance()->remainingTime(d_func()->id);
+ return std::chrono::nanoseconds::min();
+}
+
+/*!
+ \property QChronoTimer::timerType
+ \brief Controls the accuracy of the timer
+
+ The default value for this property is \c Qt::CoarseTimer.
+
+ \sa Qt::TimerType
+*/
+void QChronoTimer::setTimerType(Qt::TimerType atype)
+{
+ d_func()->type = atype;
+}
+
+Qt::TimerType QChronoTimer::timerType() const
+{
+ return d_func()->type;
+}
+
+QBindable<Qt::TimerType> QChronoTimer::bindableTimerType()
+{
+ return {&d_func()->type};
+}
+
+/*!
+ \overload
+ \reentrant
+
+ This static function calls the slot \a member, on object \a receiver, after
+ time interval \a interval. \a timerType affects the precision of the timer
+
+ \a member has to be a member function of \a receiver; you need to use the
+ \c SLOT() macro to get this parameter.
+
+ This function is provided as a convenience to save the need to use a
+ \l{QObject::timerEvent()}{timerEvent} or create a local QChronoTimer
+ object.
+
+ \sa start(), Qt::TimerType
+*/
+void QChronoTimer::singleShot(std::chrono::nanoseconds interval, Qt::TimerType timerType,
+ const QObject *receiver, const char *member)
+{
+ if (Q_UNLIKELY(interval < 0ns)) {
+ qWarning("QChronoTimer::singleShot: Timers cannot have negative timeouts");
+ return;
+ }
+ if (receiver && member) {
+ if (interval == 0ns) {
+ // special code shortpath for 0-timers
+ const char* bracketPosition = strchr(member, '(');
+ if (!bracketPosition || !(member[0] >= '0' && member[0] <= '2')) {
+ qWarning("QChronoTimer::singleShot: Invalid slot specification");
+ return;
+ }
+ const auto methodName = QByteArrayView(member + 1, // extract method name
+ bracketPosition - 1 - member).trimmed();
+ QMetaObject::invokeMethod(const_cast<QObject *>(receiver),
+ methodName.toByteArray().constData(),
+ Qt::QueuedConnection);
+ return;
+ }
+ (void) new QSingleShotTimer(interval, timerType, receiver, member);
+ }
+}
+
+/*!
+ \internal
+
+ \list
+ \li \a interval the time interval
+ \li \a timerType the type of the timer; this affects the precision of
+ the timer
+ \li \a receiver the receiver or context object; if this is \c nullptr,
+ this method will figure out a context object to use, see code
+ comments below
+ \li \a slotObj a callable, for example a lambda
+ \endlist
+*/
+void QChronoTimer::singleShotImpl(std::chrono::nanoseconds interval, Qt::TimerType timerType,
+ const QObject *receiver, QtPrivate::QSlotObjectBase *slotObj)
+{
+ if (interval == 0ns) {
+ bool deleteReceiver = false;
+ // Optimize: set a receiver context when none is given, such that we can use
+ // QMetaObject::invokeMethod which is more efficient than going through a timer.
+ // We need a QObject living in the current thread. But the QThread itself lives
+ // in a different thread - with the exception of the main QThread which lives in
+ // itself. And QThread::currentThread() is among the few QObjects we know that will
+ // most certainly be there. Note that one can actually call singleShot before the
+ // QApplication is created!
+ if (!receiver && QThread::currentThread() == QCoreApplicationPrivate::mainThread()) {
+ // reuse main thread as context object
+ receiver = QThread::currentThread();
+ } else if (!receiver) {
+ // Create a receiver context object on-demand. According to the benchmarks,
+ // this is still more efficient than going through a timer.
+ receiver = new QObject;
+ deleteReceiver = true;
+ }
+
+ auto h = QtPrivate::invokeMethodHelper({});
+ QMetaObject::invokeMethodImpl(const_cast<QObject *>(receiver), slotObj,
+ Qt::QueuedConnection, h.parameterCount(), h.parameters.data(), h.typeNames.data(),
+ h.metaTypes.data());
+
+ if (deleteReceiver)
+ const_cast<QObject *>(receiver)->deleteLater();
+ return;
+ }
+
+ new QSingleShotTimer(interval, timerType, receiver, slotObj);
+}
+
+QT_END_NAMESPACE
+
+#include "moc_qchronotimer.cpp"
diff --git a/src/corelib/kernel/qchronotimer.h b/src/corelib/kernel/qchronotimer.h
new file mode 100644
index 0000000000..79c475e93c
--- /dev/null
+++ b/src/corelib/kernel/qchronotimer.h
@@ -0,0 +1,149 @@
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QCHRONOTIMER_H
+#define QCHRONOTIMER_H
+
+#ifndef QT_NO_QOBJECT
+
+#include <QtCore/qcoreevent.h>
+#include <QtCore/qnamespace.h>
+#include <QtCore/qobject.h>
+#include <QtCore/qproperty.h>
+
+#include <chrono>
+
+QT_BEGIN_NAMESPACE
+
+class QTimerPrivate;
+class Q_CORE_EXPORT QChronoTimer : public QObject
+{
+ Q_OBJECT
+ Q_PROPERTY(bool singleShot READ isSingleShot WRITE setSingleShot
+ BINDABLE bindableSingleShot FINAL)
+ Q_PROPERTY(std::chrono::nanoseconds interval READ interval WRITE setInterval
+ BINDABLE bindableInterval FINAL)
+ Q_PROPERTY(std::chrono::nanoseconds remainingTime READ remainingTime FINAL)
+ Q_PROPERTY(Qt::TimerType timerType READ timerType WRITE setTimerType
+ BINDABLE bindableTimerType FINAL)
+ Q_PROPERTY(bool active READ isActive STORED false BINDABLE bindableActive FINAL)
+
+ template <typename Functor>
+ using FunctorContext = typename QtPrivate::ContextTypeForFunctor<Functor>::ContextType;
+
+public:
+ explicit QChronoTimer(std::chrono::nanoseconds nsec, QObject *parent = nullptr);
+ explicit QChronoTimer(QObject *parent = nullptr);
+ ~QChronoTimer() override;
+
+ bool isActive() const;
+ QBindable<bool> bindableActive();
+ Qt::TimerId id() const;
+
+ void setInterval(std::chrono::nanoseconds nsec);
+ std::chrono::nanoseconds interval() const;
+ QBindable<std::chrono::nanoseconds> bindableInterval();
+
+ std::chrono::nanoseconds remainingTime() const;
+
+ void setTimerType(Qt::TimerType atype);
+ Qt::TimerType timerType() const;
+ QBindable<Qt::TimerType> bindableTimerType();
+
+ void setSingleShot(bool singleShot);
+ bool isSingleShot() const;
+ QBindable<bool> bindableSingleShot();
+
+ // singleShot with context
+#ifdef Q_QDOC
+ template <typename Functor>
+ static inline void singleShot(std::chrono::nanoseconds interval,
+ const QObject *receiver, Functor &&slot);
+ template <typename Functor>
+ static inline void singleShot(std::chrono::nanoseconds interval interval,
+ Qt::TimerType timerType,
+ const QObject *receiver, Functor &&slot);
+#else
+ template <typename Functor>
+ static void singleShot(std::chrono::nanoseconds interval,
+ const FunctorContext<Functor> *receiver, Functor &&slot)
+ {
+ singleShot(interval, defaultTimerTypeFor(interval), receiver, std::forward<Functor>(slot));
+ }
+ template <typename Functor>
+ static void singleShot(std::chrono::nanoseconds interval, Qt::TimerType timerType,
+ const FunctorContext<Functor> *receiver, Functor &&slot)
+ {
+ using Prototype = void(*)();
+ auto *slotObj = QtPrivate::makeCallableObject<Prototype>(std::forward<Functor>(slot));
+ singleShotImpl(interval, timerType, receiver, slotObj);
+ }
+#endif
+
+ template <typename Functor>
+ static void singleShot(std::chrono::nanoseconds interval, Qt::TimerType timerType,
+ Functor &&slot)
+ { singleShot(interval, timerType, nullptr, std::forward<Functor>(slot)); }
+
+ template <typename Functor>
+ static void singleShot(std::chrono::nanoseconds interval, Functor &&slot)
+ {
+ singleShot(interval, defaultTimerTypeFor(interval), nullptr, std::forward<Functor>(slot));
+ }
+
+ static void singleShot(std::chrono::nanoseconds interval, Qt::TimerType timerType,
+ const QObject *receiver, const char *member);
+ static void singleShot(std::chrono::nanoseconds interval, const QObject *receiver,
+ const char *member)
+ { singleShot(interval, defaultTimerTypeFor(interval), receiver, member); }
+
+#ifdef Q_QDOC
+ template <typename Functor>
+ QMetaObject::Connection callOnTimeout(const QObject *context, Functor &&slot,
+ Qt::ConnectionType connectionType = Qt::AutoConnection);
+#else
+ template <typename ... Args>
+ QMetaObject::Connection callOnTimeout(Args && ...args)
+ {
+ return QObject::connect(this, &QChronoTimer::timeout, std::forward<Args>(args)... );
+ }
+#endif
+
+public Q_SLOTS:
+ void start();
+ void stop();
+
+Q_SIGNALS:
+ void timeout(QPrivateSignal);
+
+protected:
+ void timerEvent(QTimerEvent *) override;
+
+private:
+ Q_DISABLE_COPY(QChronoTimer)
+
+ // QChronoTimer uses QTimerPrivate
+ inline QTimerPrivate *d_func() noexcept
+ { Q_CAST_IGNORE_ALIGN(return reinterpret_cast<QTimerPrivate *>(qGetPtrHelper(d_ptr));) }
+ inline const QTimerPrivate *d_func() const noexcept
+ { Q_CAST_IGNORE_ALIGN(return reinterpret_cast<const QTimerPrivate *>(qGetPtrHelper(d_ptr));) }
+
+ // These two functions are inherited from QObject
+ int startTimer(std::chrono::nanoseconds) = delete;
+ void killTimer(int) = delete;
+
+ static constexpr Qt::TimerType defaultTimerTypeFor(std::chrono::nanoseconds interval) noexcept
+ {
+ using namespace std::chrono_literals;
+ return interval >= 2s ? Qt::CoarseTimer : Qt::PreciseTimer;
+ }
+
+ static void singleShotImpl(std::chrono::nanoseconds interval, Qt::TimerType timerType,
+ const QObject *receiver, QtPrivate::QSlotObjectBase *slotObj);
+};
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_QOBJECT
+
+#endif // QCHRONOTIMER_H
diff --git a/src/corelib/kernel/qcore_foundation.mm b/src/corelib/kernel/qcore_foundation.mm
index 958f0e2bc7..a31040944f 100644
--- a/src/corelib/kernel/qcore_foundation.mm
+++ b/src/corelib/kernel/qcore_foundation.mm
@@ -1,43 +1,7 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2014 Samuel Gaist <samuel.gaist@edeltech.ch>
-** Copyright (C) 2014 Petroules Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2014 Samuel Gaist <samuel.gaist@edeltech.ch>
+// Copyright (C) 2014 Petroules Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include <QtCore/qstring.h>
#include <QtCore/qurl.h>
@@ -46,7 +10,7 @@
#include <QtCore/qbytearray.h>
#include <QtCore/qrect.h>
-#if QT_CONFIG(timezone) && !defined(QT_NO_SYSTEMLOCALE)
+#if QT_CONFIG(timezone)
#include <QtCore/qtimezone.h>
#include <QtCore/private/qtimezoneprivate_p.h>
#include <QtCore/private/qcore_mac_p.h>
@@ -502,7 +466,7 @@ NSDate *QDateTime::toNSDate() const
// ----------------------------------------------------------------------------
-#if QT_CONFIG(timezone) && !defined(QT_NO_SYSTEMLOCALE)
+#if QT_CONFIG(timezone)
/*!
\brief Constructs a new QTimeZone containing a copy of the CFTimeZone \a timeZone.
@@ -531,9 +495,9 @@ QTimeZone QTimeZone::fromCFTimeZone(CFTimeZoneRef timeZone)
CFTimeZoneRef QTimeZone::toCFTimeZone() const
{
#ifndef QT_NO_DYNAMIC_CAST
- Q_ASSERT(dynamic_cast<const QMacTimeZonePrivate *>(d.data()));
+ Q_ASSERT(dynamic_cast<const QMacTimeZonePrivate *>(d.d));
#endif
- const QMacTimeZonePrivate *p = static_cast<const QMacTimeZonePrivate *>(d.data());
+ const QMacTimeZonePrivate *p = static_cast<const QMacTimeZonePrivate *>(d.d);
return reinterpret_cast<CFTimeZoneRef>([p->nsTimeZone() copy]);
}
diff --git a/src/corelib/kernel/qcore_mac.mm b/src/corelib/kernel/qcore_mac.mm
index 435b2a6150..54c4373aed 100644
--- a/src/corelib/kernel/qcore_mac.mm
+++ b/src/corelib/kernel/qcore_mac.mm
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2014 Petroules Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2014 Petroules Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include <private/qcore_mac_p.h>
@@ -55,19 +19,40 @@
#include <objc/runtime.h>
#include <mach-o/dyld.h>
#include <sys/sysctl.h>
+#include <spawn.h>
#include <qdebug.h>
+#include "qendian.h"
#include "qhash.h"
-#include "qpair.h"
#include "qmutex.h"
#include "qvarlengtharray.h"
#include "private/qlocking_p.h"
+#if !defined(QT_BOOTSTRAPPED)
+#include <thread>
+#endif
+
+#if !defined(QT_APPLE_NO_PRIVATE_APIS)
+extern "C" {
+typedef uint32_t csr_config_t;
+extern int csr_get_active_config(csr_config_t *) __attribute__((weak_import));
+
+#ifdef QT_BUILD_INTERNAL
+int responsibility_spawnattrs_setdisclaim(posix_spawnattr_t attrs, int disclaim)
+__attribute__((availability(macos,introduced=10.14),weak_import));
+pid_t responsibility_get_pid_responsible_for_pid(pid_t) __attribute__((weak_import));
+char *** _NSGetArgv();
+extern char **environ;
+#endif
+}
+#endif
+
QT_BEGIN_NAMESPACE
// --------------------------------------------------------------------------
+#if defined(Q_OS_MACOS)
static void initializeStandardUserDefaults()
{
// The standard user defaults are initialized from an ordered list of domains,
@@ -80,6 +65,7 @@ static void initializeStandardUserDefaults()
Q_UNUSED(NSUserDefaults.standardUserDefaults);
}
Q_CONSTRUCTOR_FUNCTION(initializeStandardUserDefaults);
+#endif
// --------------------------------------------------------------------------
@@ -101,17 +87,35 @@ QCFString::operator CFStringRef() const
#if defined(QT_USE_APPLE_UNIFIED_LOGGING)
-bool AppleUnifiedLogger::willMirrorToStderr()
+bool AppleUnifiedLogger::preventsStderrLogging()
{
- // When running under Xcode or LLDB, one or more of these variables will
- // be set, which triggers libsystem_trace.dyld to log messages to stderr
- // as well, via_os_log_impl_mirror_to_stderr. Un-setting these variables
- // is not an option, as that would silence normal NSLog or os_log calls,
- // so instead we skip our own stderr output. See rdar://36919139.
+ // os_log will mirror to stderr if OS_ACTIVITY_DT_MODE is set,
+ // regardless of its value. OS_ACTIVITY_MODE then controls whether
+ // to include info and/or debug messages in this mirroring.
+ // For some reason, when launched under lldb (via Xcode or not),
+ // all levels are included.
+
+ // CFLog will normally log to both stderr, and via os_log.
+ // Setting CFLOG_FORCE_DISABLE_STDERR disables the stderr
+ // logging. Setting CFLOG_FORCE_STDERR will both duplicate
+ // CFLog's output to stderr, and trigger OS_ACTIVITY_DT_MODE,
+ // resulting in os_log calls also being mirrored to stderr.
+ // Setting ACTIVITY_LOG_STDERR has the same effect.
+
+ // NSLog is plumbed to CFLog, and will respond to the same
+ // environment variables as CFLog.
+
+ // We want to disable Qt's default stderr log handler when
+ // os_log has already mirrored to stderr.
static bool willMirror = qEnvironmentVariableIsSet("OS_ACTIVITY_DT_MODE")
- || qEnvironmentVariableIsSet("ACTIVITY_LOG_STDERR")
- || qEnvironmentVariableIsSet("CFLOG_FORCE_STDERR");
- return willMirror;
+ || qEnvironmentVariableIsSet("ACTIVITY_LOG_STDERR")
+ || qEnvironmentVariableIsSet("CFLOG_FORCE_STDERR");
+
+ // As well as when we suspect that Xcode is going to present os_log
+ // as structured log messages.
+ static bool disableStderr = qEnvironmentVariableIsSet("CFLOG_FORCE_DISABLE_STDERR");
+
+ return willMirror || disableStderr;
}
QT_MAC_WEAK_IMPORT(_os_log_default);
@@ -132,7 +136,7 @@ bool AppleUnifiedLogger::messageHandler(QtMsgType msgType, const QMessageLogCont
const bool isDefault = !context.category || !strcmp(context.category, "default");
os_log_t log = isDefault ? OS_LOG_DEFAULT :
- cachedLog(subsystem, QString::fromLatin1(context.category));
+ os_log_create(subsystem.toLatin1().constData(), context.category);
os_log_type_t logType = logTypeForMessageType(msgType);
if (!os_log_type_enabled(log, logType))
@@ -152,7 +156,7 @@ bool AppleUnifiedLogger::messageHandler(QtMsgType msgType, const QMessageLogCont
// system from redacting our log message.
os_log_with_type(log, logType, "%{public}s", qPrintable(message));
- return willMirrorToStderr();
+ return preventsStderrLogging();
}
os_log_type_t AppleUnifiedLogger::logTypeForMessageType(QtMsgType msgType)
@@ -168,33 +172,31 @@ os_log_type_t AppleUnifiedLogger::logTypeForMessageType(QtMsgType msgType)
return OS_LOG_TYPE_DEFAULT;
}
-os_log_t AppleUnifiedLogger::cachedLog(const QString &subsystem, const QString &category)
-{
- static QBasicMutex mutex;
- const auto locker = qt_scoped_lock(mutex);
+#endif // QT_USE_APPLE_UNIFIED_LOGGING
- static QHash<QPair<QString, QString>, os_log_t> logs;
- const auto cacheKey = qMakePair(subsystem, category);
- os_log_t log = logs.value(cacheKey);
+// -------------------------------------------------------------------------
- if (!log) {
- log = os_log_create(subsystem.toLatin1().constData(),
- category.toLatin1().constData());
- logs.insert(cacheKey, log);
+QDebug operator<<(QDebug dbg, id obj)
+{
+ if (!obj) {
+ // Match NSLog
+ dbg << "(null)";
+ return dbg;
+ }
- // Technically we should release the os_log_t resource when done
- // with it, but since we don't know when a category is disabled
- // we keep all cached os_log_t instances until shutdown, where
- // the OS will clean them up for us.
+ for (Class cls = object_getClass(obj); cls; cls = class_getSuperclass(cls)) {
+ if (cls == NSObject.class) {
+ dbg << static_cast<NSObject*>(obj);
+ return dbg;
+ }
}
- return log;
+ // Match NSObject.debugDescription
+ const QDebugStateSaver saver(dbg);
+ dbg.nospace() << '<' << object_getClassName(obj) << ": " << static_cast<void*>(obj) << '>';
+ return dbg;
}
-#endif // QT_USE_APPLE_UNIFIED_LOGGING
-
-// -------------------------------------------------------------------------
-
QDebug operator<<(QDebug dbg, const NSObject *nsObject)
{
return dbg << (nsObject ?
@@ -231,63 +233,42 @@ QT_FOR_EACH_MUTABLE_CORE_GRAPHICS_TYPE(QT_DECLARE_WEAK_QDEBUG_OPERATOR_FOR_CF_TY
QT_END_NAMESPACE
QT_USE_NAMESPACE
+
+#ifdef QT_DEBUG
@interface QT_MANGLE_NAMESPACE(QMacAutoReleasePoolTracker) : NSObject
@end
-@implementation QT_MANGLE_NAMESPACE(QMacAutoReleasePoolTracker) {
- NSAutoreleasePool **m_pool;
-}
-
-- (instancetype)initWithPool:(NSAutoreleasePool **)pool
-{
- if ((self = [self init]))
- m_pool = pool;
- return self;
-}
-
-- (void)dealloc
-{
- if (*m_pool) {
- // The pool is still valid, which means we're not being drained from
- // the corresponding QMacAutoReleasePool (see below).
-
- // QMacAutoReleasePool has only a single member, the NSAutoreleasePool*
- // so the address of that member is also the QMacAutoReleasePool itself.
- QMacAutoReleasePool *pool = reinterpret_cast<QMacAutoReleasePool *>(m_pool);
- qWarning() << "Premature drain of" << pool << "This can happen if you've allocated"
- << "the pool on the heap, or as a member of a heap-allocated object. This is not a"
- << "supported use of QMacAutoReleasePool, and might result in crashes when objects"
- << "in the pool are deallocated and then used later on under the assumption they"
- << "will be valid until" << pool << "has been drained.";
+@implementation QT_MANGLE_NAMESPACE(QMacAutoReleasePoolTracker)
+@end
+QT_NAMESPACE_ALIAS_OBJC_CLASS(QMacAutoReleasePoolTracker);
+#endif // QT_DEBUG
- // Reset the pool so that it's not drained again later on
- *m_pool = nullptr;
- }
+// Use the direct runtime interface to manage autorelease pools, as it
+// has less overhead then allocating NSAutoreleasePools, and allows for
+// a future where we use ARC (where NSAutoreleasePool is not allowed).
+// https://clang.llvm.org/docs/AutomaticReferenceCounting.html#runtime-support
- [super dealloc];
+extern "C" {
+void *objc_autoreleasePoolPush(void);
+void objc_autoreleasePoolPop(void *pool);
}
-@end
-QT_NAMESPACE_ALIAS_OBJC_CLASS(QMacAutoReleasePoolTracker);
QT_BEGIN_NAMESPACE
QMacAutoReleasePool::QMacAutoReleasePool()
- : pool([[NSAutoreleasePool alloc] init])
+ : pool(objc_autoreleasePoolPush())
{
+#ifdef QT_DEBUG
+ static const bool debugAutoReleasePools = qEnvironmentVariableIsSet("QT_DARWIN_DEBUG_AUTORELEASEPOOLS");
+ if (!debugAutoReleasePools)
+ return;
+
Class trackerClass = [QMacAutoReleasePoolTracker class];
-#ifdef QT_DEBUG
void *poolFrame = nullptr;
- if (__builtin_available(macOS 10.14, iOS 12.0, tvOS 12.0, watchOS 5.0, *)) {
- void *frame;
- if (backtrace_from_fp(__builtin_frame_address(0), &frame, 1))
- poolFrame = frame;
- } else {
- static const int maxFrames = 3;
- void *callstack[maxFrames];
- if (backtrace(callstack, maxFrames) == maxFrames)
- poolFrame = callstack[maxFrames - 1];
- }
+ void *frames[2];
+ if (backtrace_from_fp(__builtin_frame_address(0), frames, 2))
+ poolFrame = frames[1];
if (poolFrame) {
Dl_info info;
@@ -313,30 +294,14 @@ QMacAutoReleasePool::QMacAutoReleasePool()
free((char*)symbolName);
}
}
-#endif
- [[[trackerClass alloc] initWithPool:
- reinterpret_cast<NSAutoreleasePool **>(&pool)] autorelease];
+ [[trackerClass new] autorelease];
+#endif // QT_DEBUG
}
QMacAutoReleasePool::~QMacAutoReleasePool()
{
- if (!pool) {
- qWarning() << "Prematurely drained pool" << this << "finally drained. Any objects belonging"
- << "to this pool have already been released, and have potentially been invalid since the"
- << "premature drain earlier on.";
- return;
- }
-
- // Save and reset pool before draining, so that the pool tracker can know
- // that it's being drained by its owning pool.
- NSAutoreleasePool *savedPool = static_cast<NSAutoreleasePool*>(pool);
- pool = nullptr;
-
- // Drain behaves the same as release, with the advantage that
- // if we're ever used in a garbage-collected environment, the
- // drain acts as a hint to the garbage collector to collect.
- [savedPool drain];
+ objc_autoreleasePoolPop(pool);
}
#ifndef QT_NO_DEBUG_STREAM
@@ -358,14 +323,9 @@ QDebug operator<<(QDebug debug, const QCFString &string)
#ifdef Q_OS_MACOS
bool qt_mac_applicationIsInDarkMode()
{
-#if QT_MACOS_PLATFORM_SDK_EQUAL_OR_ABOVE(__MAC_10_14)
- if (__builtin_available(macOS 10.14, *)) {
- auto appearance = [NSApp.effectiveAppearance bestMatchFromAppearancesWithNames:
- @[ NSAppearanceNameAqua, NSAppearanceNameDarkAqua ]];
- return [appearance isEqualToString:NSAppearanceNameDarkAqua];
- }
-#endif
- return false;
+ auto appearance = [NSApp.effectiveAppearance bestMatchFromAppearancesWithNames:
+ @[ NSAppearanceNameAqua, NSAppearanceNameDarkAqua ]];
+ return [appearance isEqualToString:NSAppearanceNameDarkAqua];
}
bool qt_mac_runningUnderRosetta()
@@ -376,6 +336,89 @@ bool qt_mac_runningUnderRosetta()
return translated;
return false;
}
+
+std::optional<uint32_t> qt_mac_sipConfiguration()
+{
+ static auto configuration = []() -> std::optional<uint32_t> {
+#if !defined(QT_APPLE_NO_PRIVATE_APIS)
+ csr_config_t config;
+ if (csr_get_active_config && csr_get_active_config(&config) == 0)
+ return config;
+#endif
+
+ QIOType<io_registry_entry_t> nvram = IORegistryEntryFromPath(kIOMainPortDefault, "IODeviceTree:/options");
+ if (!nvram) {
+ qWarning("Failed to locate NVRAM entry in IO registry");
+ return {};
+ }
+
+ QCFType<CFTypeRef> csrConfig = IORegistryEntryCreateCFProperty(nvram,
+ CFSTR("csr-active-config"), kCFAllocatorDefault, IOOptionBits{});
+ if (!csrConfig)
+ return {}; // SIP config is not available
+
+ if (auto type = CFGetTypeID(csrConfig); type != CFDataGetTypeID()) {
+ qWarning() << "Unexpected SIP config type" << CFCopyTypeIDDescription(type);
+ return {};
+ }
+
+ QByteArray data = QByteArray::fromRawCFData(csrConfig.as<CFDataRef>());
+ if (data.size() != sizeof(uint32_t)) {
+ qWarning() << "Unexpected SIP config size" << data.size();
+ return {};
+ }
+
+ return qFromLittleEndian<uint32_t>(data.constData());
+ }();
+ return configuration;
+}
+
+#define CHECK_SPAWN(expr) \
+ if (int err = (expr)) { \
+ posix_spawnattr_destroy(&attr); \
+ return; \
+ }
+
+#ifdef QT_BUILD_INTERNAL
+void qt_mac_ensureResponsible()
+{
+#if !defined(QT_APPLE_NO_PRIVATE_APIS)
+ if (!responsibility_get_pid_responsible_for_pid || !responsibility_spawnattrs_setdisclaim)
+ return;
+
+ auto pid = getpid();
+ if (responsibility_get_pid_responsible_for_pid(pid) == pid)
+ return; // Already responsible
+
+ posix_spawnattr_t attr = {};
+ CHECK_SPAWN(posix_spawnattr_init(&attr));
+
+ // Behave as exec
+ short flags = POSIX_SPAWN_SETEXEC;
+
+ // Reset signal mask
+ sigset_t no_signals;
+ sigemptyset(&no_signals);
+ CHECK_SPAWN(posix_spawnattr_setsigmask(&attr, &no_signals));
+ flags |= POSIX_SPAWN_SETSIGMASK;
+
+ // Reset all signals to their default handlers
+ sigset_t all_signals;
+ sigfillset(&all_signals);
+ CHECK_SPAWN(posix_spawnattr_setsigdefault(&attr, &all_signals));
+ flags |= POSIX_SPAWN_SETSIGDEF;
+
+ CHECK_SPAWN(posix_spawnattr_setflags(&attr, flags));
+
+ CHECK_SPAWN(responsibility_spawnattrs_setdisclaim(&attr, 1));
+
+ char **argv = *_NSGetArgv();
+ posix_spawnp(&pid, argv[0], nullptr, &attr, argv, environ);
+ posix_spawnattr_destroy(&attr);
+#endif
+}
+#endif // QT_BUILD_INTERNAL
+
#endif
bool qt_apple_isApplicationExtension()
@@ -406,36 +449,64 @@ AppleApplication *qt_apple_sharedApplication()
}
#endif
+#if !defined(QT_BOOTSTRAPPED)
+
+#if defined(Q_OS_MACOS)
+namespace {
+struct SandboxChecker
+{
+ SandboxChecker() : m_thread([this]{
+ m_isSandboxed = []{
+ QCFType<SecStaticCodeRef> staticCode = nullptr;
+ NSURL *executableUrl = NSBundle.mainBundle.executableURL;
+ if (SecStaticCodeCreateWithPath((__bridge CFURLRef)executableUrl,
+ kSecCSDefaultFlags, &staticCode) != errSecSuccess)
+ return false;
+
+ QCFType<SecRequirementRef> sandboxRequirement;
+ if (SecRequirementCreateWithString(CFSTR("entitlement[\"com.apple.security.app-sandbox\"] exists"),
+ kSecCSDefaultFlags, &sandboxRequirement) != errSecSuccess)
+ return false;
+
+ if (SecStaticCodeCheckValidityWithErrors(staticCode,
+ kSecCSBasicValidateOnly, sandboxRequirement, nullptr) != errSecSuccess)
+ return false;
+
+ return true;
+ }();
+ })
+ {}
+ ~SandboxChecker() {
+ std::scoped_lock lock(m_mutex);
+ if (m_thread.joinable())
+ m_thread.detach();
+ }
+ bool isSandboxed() const {
+ std::scoped_lock lock(m_mutex);
+ if (m_thread.joinable())
+ m_thread.join();
+ return m_isSandboxed;
+ }
+private:
+ bool m_isSandboxed;
+ mutable std::thread m_thread;
+ mutable std::mutex m_mutex;
+};
+} // namespace
+static SandboxChecker sandboxChecker;
+#endif // Q_OS_MACOS
+
bool qt_apple_isSandboxed()
{
#if defined(Q_OS_MACOS)
- static bool isSandboxed = []() {
- QCFType<SecStaticCodeRef> staticCode = nullptr;
- NSURL *executableUrl = NSBundle.mainBundle.executableURL;
- if (SecStaticCodeCreateWithPath((__bridge CFURLRef)executableUrl,
- kSecCSDefaultFlags, &staticCode) != errSecSuccess)
- return false;
-
- QCFType<SecRequirementRef> sandboxRequirement;
- if (SecRequirementCreateWithString(CFSTR("entitlement[\"com.apple.security.app-sandbox\"] exists"),
- kSecCSDefaultFlags, &sandboxRequirement) != errSecSuccess)
- return false;
-
- if (SecStaticCodeCheckValidityWithErrors(staticCode,
- kSecCSBasicValidateOnly, sandboxRequirement, nullptr) != errSecSuccess)
- return false;
-
- return true;
- }();
- return isSandboxed;
+ return sandboxChecker.isSandboxed();
#else
return true; // All other Apple platforms
#endif
}
-#if !defined(QT_BOOTSTRAPPED)
QT_END_NAMESPACE
-@implementation NSObject (QtSandboxHelpers)
+@implementation NSObject (QtExtras)
- (id)qt_valueForPrivateKey:(NSString *)key
{
if (qt_apple_isSandboxed())
@@ -445,7 +516,7 @@ QT_END_NAMESPACE
}
@end
QT_BEGIN_NAMESPACE
-#endif
+#endif // !QT_BOOTSTRAPPED
#ifdef Q_OS_MACOS
/*
@@ -496,6 +567,9 @@ void qt_apple_check_os_version()
#elif defined(__TV_OS_VERSION_MIN_REQUIRED)
const char *os = "tvOS";
const int version = __TV_OS_VERSION_MIN_REQUIRED;
+#elif defined(__VISION_OS_VERSION_MIN_REQUIRED)
+ const char *os = "visionOS";
+ const int version = __VISION_OS_VERSION_MIN_REQUIRED;
#elif defined(__IPHONE_OS_VERSION_MIN_REQUIRED)
const char *os = "iOS";
const int version = __IPHONE_OS_VERSION_MIN_REQUIRED;
@@ -503,10 +577,18 @@ void qt_apple_check_os_version()
const char *os = "macOS";
const int version = __MAC_OS_X_VERSION_MIN_REQUIRED;
#endif
- const NSOperatingSystemVersion required = (NSOperatingSystemVersion){
- version / 10000, version / 100 % 100, version % 100};
- const NSOperatingSystemVersion current = NSProcessInfo.processInfo.operatingSystemVersion;
- if (![NSProcessInfo.processInfo isOperatingSystemAtLeastVersion:required]) {
+
+ const auto required = QVersionNumber(version / 10000, version / 100 % 100, version % 100);
+ const auto current = QOperatingSystemVersion::current().version();
+
+#if defined(Q_OS_MACOS)
+ // Check for compatibility version, in which case we can't do a
+ // comparison to the deployment target, which might be e.g. 11.0
+ if (current.majorVersion() == 10 && current.minorVersion() >= 16)
+ return;
+#endif
+
+ if (current < required) {
NSDictionary *plist = NSBundle.mainBundle.infoDictionary;
NSString *applicationName = plist[@"CFBundleDisplayName"];
if (!applicationName)
@@ -517,8 +599,8 @@ void qt_apple_check_os_version()
fprintf(stderr, "Sorry, \"%s\" cannot be run on this version of %s. "
"Qt requires %s %ld.%ld.%ld or later, you have %s %ld.%ld.%ld.\n",
applicationName.UTF8String, os,
- os, long(required.majorVersion), long(required.minorVersion), long(required.patchVersion),
- os, long(current.majorVersion), long(current.minorVersion), long(current.patchVersion));
+ os, long(required.majorVersion()), long(required.minorVersion()), long(required.microVersion()),
+ os, long(current.majorVersion()), long(current.minorVersion()), long(current.microVersion()));
exit(1);
}
@@ -637,7 +719,7 @@ QMacVersion::VersionTuple QMacVersion::versionsForImage(const mach_header *machH
};
static auto makeVersionTuple = [](uint32_t dt, uint32_t sdk, QOperatingSystemVersion::OSType osType) {
- return qMakePair(
+ return std::pair(
QOperatingSystemVersion(osType, dt >> 16 & 0xffff, dt >> 8 & 0xff, dt & 0xff),
QOperatingSystemVersion(osType, sdk >> 16 & 0xffff, sdk >> 8 & 0xff, sdk & 0xff)
);
@@ -652,11 +734,9 @@ QMacVersion::VersionTuple QMacVersion::versionsForImage(const mach_header *machH
|| loadCommand->cmd == LC_VERSION_MIN_TVOS || loadCommand->cmd == LC_VERSION_MIN_WATCHOS) {
auto versionCommand = reinterpret_cast<version_min_command *>(loadCommand);
return makeVersionTuple(versionCommand->version, versionCommand->sdk, osForLoadCommand(loadCommand->cmd));
-#if QT_DARWIN_PLATFORM_SDK_EQUAL_OR_ABOVE(__MAC_10_13, __IPHONE_11_0, __TVOS_11_0, __WATCHOS_4_0)
} else if (loadCommand->cmd == LC_BUILD_VERSION) {
auto versionCommand = reinterpret_cast<build_version_command *>(loadCommand);
return makeVersionTuple(versionCommand->minos, versionCommand->sdk, osForPlatform(versionCommand->platform));
-#endif
}
commandCursor += loadCommand->cmdsize;
}
diff --git a/src/corelib/kernel/qcore_mac_p.h b/src/corelib/kernel/qcore_mac_p.h
index 7b503d10cc..e63c320805 100644
--- a/src/corelib/kernel/qcore_mac_p.h
+++ b/src/corelib/kernel/qcore_mac_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QCORE_MAC_P_H
#define QCORE_MAC_P_H
@@ -54,7 +18,17 @@
#include "private/qglobal_p.h"
#include <QtCore/qoperatingsystemversion.h>
+
+#ifdef Q_OS_MACOS
+#include <mach/port.h>
struct mach_header;
+typedef int kern_return_t;
+typedef mach_port_t io_object_t;
+extern "C" {
+kern_return_t IOObjectRetain(io_object_t object);
+kern_return_t IOObjectRelease(io_object_t object);
+}
+#endif
#ifndef __IMAGECAPTURE__
# define __IMAGECAPTURE__
@@ -103,20 +77,26 @@ struct mach_header;
Q_FORWARD_DECLARE_OBJC_CLASS(NSObject);
Q_FORWARD_DECLARE_OBJC_CLASS(NSString);
+// @compatibility_alias doesn't work with categories or their methods
+#define QtExtras QT_MANGLE_NAMESPACE(QtExtras)
+
QT_BEGIN_NAMESPACE
-template <typename T, typename U, U (*RetainFunction)(U), void (*ReleaseFunction)(U)>
+template <typename T, typename U, auto RetainFunction, auto ReleaseFunction>
class QAppleRefCounted
{
public:
- QAppleRefCounted() : value() {}
- QAppleRefCounted(const T &t) : value(t) {}
- QAppleRefCounted(T &&t) noexcept(std::is_nothrow_move_constructible<T>::value)
+ Q_NODISCARD_CTOR QAppleRefCounted() : value() {}
+ Q_NODISCARD_CTOR QAppleRefCounted(const T &t) : value(t) {}
+ Q_NODISCARD_CTOR QAppleRefCounted(T &&t)
+ noexcept(std::is_nothrow_move_constructible<T>::value)
: value(std::move(t)) {}
- QAppleRefCounted(QAppleRefCounted &&other)
+ Q_NODISCARD_CTOR QAppleRefCounted(QAppleRefCounted &&other)
noexcept(std::is_nothrow_move_assignable<T>::value &&
std::is_nothrow_move_constructible<T>::value)
- : value(qExchange(other.value, T())) {}
- QAppleRefCounted(const QAppleRefCounted &other) : value(other.value) { if (value) RetainFunction(value); }
+ : value(std::exchange(other.value, T())) {}
+ Q_NODISCARD_CTOR QAppleRefCounted(const QAppleRefCounted &other)
+ : value(other.value)
+ { if (value) RetainFunction(value); }
~QAppleRefCounted() { if (value) ReleaseFunction(value); }
operator T() const { return value; }
void swap(QAppleRefCounted &other) noexcept(noexcept(qSwap(value, other.value)))
@@ -132,12 +112,21 @@ protected:
T value;
};
+class QMacAutoReleasePool
+{
+public:
+ Q_NODISCARD_CTOR Q_CORE_EXPORT QMacAutoReleasePool();
+ Q_CORE_EXPORT ~QMacAutoReleasePool();
+private:
+ Q_DISABLE_COPY(QMacAutoReleasePool)
+ void *pool;
+};
#ifdef Q_OS_MACOS
class QMacRootLevelAutoReleasePool
{
public:
- QMacRootLevelAutoReleasePool();
+ Q_NODISCARD_CTOR QMacRootLevelAutoReleasePool();
~QMacRootLevelAutoReleasePool();
private:
QScopedPointer<QMacAutoReleasePool> pool;
@@ -162,7 +151,7 @@ class QCFType : public QAppleRefCounted<T, CFTypeRef, CFRetain, CFRelease>
using Base = QAppleRefCounted<T, CFTypeRef, CFRetain, CFRelease>;
public:
using Base::Base;
- explicit QCFType(CFTypeRef r) : Base(static_cast<T>(r)) {}
+ Q_NODISCARD_CTOR explicit QCFType(CFTypeRef r) : Base(static_cast<T>(r)) {}
template <typename X> X as() const { return reinterpret_cast<X>(this->value); }
static QCFType constructFromGet(const T &t)
{
@@ -172,15 +161,23 @@ public:
}
};
-class Q_CORE_EXPORT QCFString : public QCFType<CFStringRef>
+#ifdef Q_OS_MACOS
+template <typename T>
+class QIOType : public QAppleRefCounted<T, io_object_t, IOObjectRetain, IOObjectRelease>
+{
+ using QAppleRefCounted<T, io_object_t, IOObjectRetain, IOObjectRelease>::QAppleRefCounted;
+};
+#endif
+
+class QCFString : public QCFType<CFStringRef>
{
public:
using QCFType<CFStringRef>::QCFType;
- inline QCFString(const QString &str) : QCFType<CFStringRef>(0), string(str) {}
- inline QCFString(const CFStringRef cfstr = 0) : QCFType<CFStringRef>(cfstr) {}
- inline QCFString(const QCFType<CFStringRef> &other) : QCFType<CFStringRef>(other) {}
- operator QString() const;
- operator CFStringRef() const;
+ Q_NODISCARD_CTOR QCFString(const QString &str) : QCFType<CFStringRef>(0), string(str) {}
+ Q_NODISCARD_CTOR QCFString(const CFStringRef cfstr = 0) : QCFType<CFStringRef>(cfstr) {}
+ Q_NODISCARD_CTOR QCFString(const QCFType<CFStringRef> &other) : QCFType<CFStringRef>(other) {}
+ Q_CORE_EXPORT operator QString() const;
+ Q_CORE_EXPORT operator CFStringRef() const;
private:
QString string;
@@ -189,6 +186,10 @@ private:
#ifdef Q_OS_MACOS
Q_CORE_EXPORT bool qt_mac_applicationIsInDarkMode();
Q_CORE_EXPORT bool qt_mac_runningUnderRosetta();
+Q_CORE_EXPORT std::optional<uint32_t> qt_mac_sipConfiguration();
+#ifdef QT_BUILD_INTERNAL
+Q_AUTOTEST_EXPORT void qt_mac_ensureResponsible();
+#endif
#endif
#ifndef QT_NO_DEBUG_STREAM
@@ -197,15 +198,18 @@ Q_CORE_EXPORT QDebug operator<<(QDebug debug, const QCFString &string);
#endif
Q_CORE_EXPORT bool qt_apple_isApplicationExtension();
+
+#if !defined(QT_BOOTSTRAPPED)
Q_CORE_EXPORT bool qt_apple_isSandboxed();
-#if !defined(QT_BOOTSTRAPPED) && defined(__OBJC__)
+#if defined(__OBJC__)
QT_END_NAMESPACE
-@interface NSObject (QtSandboxHelpers)
+@interface NSObject (QtExtras)
- (id)qt_valueForPrivateKey:(NSString *)key;
@end
QT_BEGIN_NAMESPACE
#endif
+#endif // !QT_BOOTSTRAPPED
#if !defined(QT_BOOTSTRAPPED) && !defined(Q_OS_WATCHOS)
QT_END_NAMESPACE
@@ -232,9 +236,12 @@ QT_BEGIN_NAMESPACE
class Q_CORE_EXPORT AppleUnifiedLogger
{
public:
- static bool messageHandler(QtMsgType msgType, const QMessageLogContext &context, const QString &message,
- const QString &subsystem = QString());
- static bool willMirrorToStderr();
+ static bool messageHandler(QtMsgType msgType, const QMessageLogContext &context,
+ const QString &message)
+ { return messageHandler(msgType, context, message, QString()); }
+ static bool messageHandler(QtMsgType msgType, const QMessageLogContext &context,
+ const QString &message, const QString &subsystem);
+ static bool preventsStderrLogging();
private:
static os_log_type_t logTypeForMessageType(QtMsgType msgType);
static os_log_t cachedLog(const QString &subsystem, const QString &category);
@@ -262,7 +269,7 @@ public:
Q_DISABLE_COPY(QAppleLogActivity)
QAppleLogActivity(QAppleLogActivity &&other)
- : activity(qExchange(other.activity, nullptr)), state(other.state)
+ : activity(std::exchange(other.activity, nullptr)), state(other.state)
{
}
@@ -288,8 +295,8 @@ public:
void swap(QAppleLogActivity &other)
{
- qSwap(activity, other.activity);
- qSwap(state, other.state);
+ activity.swap(other.activity);
+ std::swap(state, other.state);
}
private:
@@ -337,7 +344,7 @@ public:
QMacNotificationObserver(const QMacNotificationObserver &other) = delete;
QMacNotificationObserver(QMacNotificationObserver &&other)
- : observer(qExchange(other.observer, nullptr))
+ : observer(std::exchange(other.observer, nullptr))
{
}
@@ -346,7 +353,7 @@ public:
void swap(QMacNotificationObserver &other) noexcept
{
- qSwap(observer, other.observer);
+ qt_ptr_swap(observer, other.observer);
}
void remove();
@@ -396,9 +403,9 @@ public:
void swap(QMacKeyValueObserver &other) noexcept
{
- qSwap(object, other.object);
- qSwap(keyPath, other.keyPath);
- qSwap(callback, other.callback);
+ qt_ptr_swap(object, other.object);
+ qt_ptr_swap(keyPath, other.keyPath);
+ callback.swap(other.callback);
}
private:
@@ -429,7 +436,7 @@ public:
private:
QMacVersion() = default;
- using VersionTuple = QPair<QOperatingSystemVersion, QOperatingSystemVersion>;
+ using VersionTuple = std::pair<QOperatingSystemVersion, QOperatingSystemVersion>;
static VersionTuple versionsForImage(const mach_header *machHeader);
static VersionTuple applicationVersion();
static VersionTuple libraryVersion();
@@ -437,6 +444,20 @@ private:
// -------------------------------------------------------------------------
+#ifdef __OBJC__
+template <typename T>
+typename std::enable_if<std::is_pointer<T>::value, T>::type
+qt_objc_cast(id object)
+{
+ if ([object isKindOfClass:[typename std::remove_pointer<T>::type class]])
+ return static_cast<T>(object);
+
+ return nil;
+}
+#endif
+
+// -------------------------------------------------------------------------
+
QT_END_NAMESPACE
#endif // QCORE_MAC_P_H
diff --git a/src/corelib/kernel/qcore_unix.cpp b/src/corelib/kernel/qcore_unix.cpp
index ff0c957770..6861251bc2 100644
--- a/src/corelib/kernel/qcore_unix.cpp
+++ b/src/corelib/kernel/qcore_unix.cpp
@@ -1,46 +1,10 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2016 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include <QtCore/private/qglobal_p.h>
+#include <QtCore/qbasicatomic.h>
#include "qcore_unix_p.h"
-#include "qelapsedtimer.h"
#include <stdlib.h>
@@ -50,12 +14,27 @@
# include <unistd.h>
#endif
-#ifdef Q_OS_MAC
+#ifdef Q_OS_DARWIN
#include <mach/mach_time.h>
#endif
QT_BEGIN_NAMESPACE
+void qt_ignore_sigpipe() noexcept // noexcept: sigaction(2) is not a Posix Cancellation Point
+{
+ // Set to ignore SIGPIPE once only.
+ Q_CONSTINIT static QBasicAtomicInt atom = Q_BASIC_ATOMIC_INITIALIZER(0);
+ if (!atom.loadRelaxed()) {
+ // More than one thread could turn off SIGPIPE at the same time
+ // But that's acceptable because they all would be doing the same
+ // action
+ struct sigaction noaction = {};
+ noaction.sa_handler = SIG_IGN;
+ ::sigaction(SIGPIPE, &noaction, nullptr);
+ atom.storeRelaxed(1);
+ }
+}
+
QByteArray qt_readlink(const char *path)
{
#ifndef PATH_MAX
@@ -105,23 +84,15 @@ int qt_open64(const char *pathname, int flags, mode_t mode)
# define ppoll pollts
#endif
-static inline bool time_update(struct timespec *tv, const struct timespec &start,
- const struct timespec &timeout)
-{
- // clock source is (hopefully) monotonic, so we can recalculate how much timeout is left;
- // if it isn't monotonic, we'll simply hope that it hasn't jumped, because we have no alternative
- struct timespec now = qt_gettime();
- *tv = timeout + start - now;
- return tv->tv_sec >= 0;
-}
-
-#if QT_CONFIG(poll_poll)
+[[maybe_unused]]
static inline int timespecToMillisecs(const struct timespec *ts)
{
- return (ts == NULL) ? -1 :
- (ts->tv_sec * 1000) + (ts->tv_nsec / 1000000);
+ using namespace std::chrono;
+ if (!ts)
+ return -1;
+ auto ms = ceil<milliseconds>(timespecToChrono<nanoseconds>(*ts));
+ return int(ms.count());
}
-#endif
// defined in qpoll.cpp
int qt_poll(struct pollfd *fds, nfds_t nfds, const struct timespec *timeout_ts);
@@ -147,31 +118,27 @@ static inline int qt_ppoll(struct pollfd *fds, nfds_t nfds, const struct timespe
using select(2) where necessary. In that case, returns -1 and sets errno
to EINVAL if passed any descriptor greater than or equal to FD_SETSIZE.
*/
-int qt_safe_poll(struct pollfd *fds, nfds_t nfds, const struct timespec *timeout_ts)
+int qt_safe_poll(struct pollfd *fds, nfds_t nfds, QDeadlineTimer deadline)
{
- if (!timeout_ts) {
+ if (deadline.isForever()) {
// no timeout -> block forever
int ret;
- EINTR_LOOP(ret, qt_ppoll(fds, nfds, nullptr));
+ QT_EINTR_LOOP(ret, qt_ppoll(fds, nfds, nullptr));
return ret;
}
- timespec start = qt_gettime();
- timespec timeout = *timeout_ts;
-
+ using namespace std::chrono;
+ nanoseconds remaining = deadline.remainingTimeAsDuration();
// loop and recalculate the timeout as needed
- forever {
- const int ret = qt_ppoll(fds, nfds, &timeout);
+ do {
+ timespec ts = durationToTimespec(remaining);
+ const int ret = qt_ppoll(fds, nfds, &ts);
if (ret != -1 || errno != EINTR)
return ret;
+ remaining = deadline.remainingTimeAsDuration();
+ } while (remaining > 0ns);
- // recalculate the timeout
- if (!time_update(&timeout, start, *timeout_ts)) {
- // timeout during update
- // or clock reset, fake timeout error
- return 0;
- }
- }
+ return 0;
}
#endif // QT_BOOTSTRAPPED
diff --git a/src/corelib/kernel/qcore_unix_p.h b/src/corelib/kernel/qcore_unix_p.h
index abe9bb3738..fd834cb2d9 100644
--- a/src/corelib/kernel/qcore_unix_p.h
+++ b/src/corelib/kernel/qcore_unix_p.h
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2016 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QCORE_UNIX_P_H
#define QCORE_UNIX_P_H
@@ -54,8 +18,8 @@
#include "qplatformdefs.h"
#include <QtCore/private/qglobal_p.h>
-#include "qatomic.h"
#include "qbytearray.h"
+#include "qdeadlinetimer.h"
#ifndef Q_OS_UNIX
# error "qcore_unix_p.h included on a non-Unix system"
@@ -75,14 +39,11 @@
# include <selectLib.h>
#endif
+#include <chrono>
#include <sys/wait.h>
#include <errno.h>
#include <fcntl.h>
-#if !defined(QT_POSIX_IPC) && !defined(QT_NO_SHAREDMEMORY) && !defined(Q_OS_ANDROID)
-# include <sys/ipc.h>
-#endif
-
#if defined(Q_OS_VXWORKS)
# include <ioLib.h>
#endif
@@ -95,7 +56,7 @@
struct sockaddr;
-#define EINTR_LOOP(var, cmd) \
+#define QT_EINTR_LOOP(var, cmd) \
do { \
var = cmd; \
} while (var == -1 && errno == EINTR)
@@ -104,53 +65,78 @@ QT_BEGIN_NAMESPACE
Q_DECLARE_TYPEINFO(pollfd, Q_PRIMITIVE_TYPE);
+static constexpr auto OneSecAsNsecs = std::chrono::nanoseconds(std::chrono::seconds{ 1 }).count();
+
+inline timespec durationToTimespec(std::chrono::nanoseconds timeout) noexcept
+{
+ using namespace std::chrono;
+ const seconds secs = duration_cast<seconds>(timeout);
+ const nanoseconds frac = timeout - secs;
+ struct timespec ts;
+ ts.tv_sec = secs.count();
+ ts.tv_nsec = frac.count();
+ return ts;
+}
+
+template <typename Duration>
+inline Duration timespecToChrono(timespec ts) noexcept
+{
+ using namespace std::chrono;
+ return duration_cast<Duration>(seconds{ts.tv_sec} + nanoseconds{ts.tv_nsec});
+}
+
+inline std::chrono::milliseconds timespecToChronoMs(timespec ts) noexcept
+{
+ return timespecToChrono<std::chrono::milliseconds>(ts);
+}
+
// Internal operator functions for timespecs
-inline timespec &normalizedTimespec(timespec &t)
+constexpr inline timespec &normalizedTimespec(timespec &t)
{
- while (t.tv_nsec >= 1000000000) {
+ while (t.tv_nsec >= OneSecAsNsecs) {
++t.tv_sec;
- t.tv_nsec -= 1000000000;
+ t.tv_nsec -= OneSecAsNsecs;
}
while (t.tv_nsec < 0) {
--t.tv_sec;
- t.tv_nsec += 1000000000;
+ t.tv_nsec += OneSecAsNsecs;
}
return t;
}
-inline bool operator<(const timespec &t1, const timespec &t2)
+constexpr inline bool operator<(const timespec &t1, const timespec &t2)
{ return t1.tv_sec < t2.tv_sec || (t1.tv_sec == t2.tv_sec && t1.tv_nsec < t2.tv_nsec); }
-inline bool operator==(const timespec &t1, const timespec &t2)
+constexpr inline bool operator==(const timespec &t1, const timespec &t2)
{ return t1.tv_sec == t2.tv_sec && t1.tv_nsec == t2.tv_nsec; }
-inline bool operator!=(const timespec &t1, const timespec &t2)
+constexpr inline bool operator!=(const timespec &t1, const timespec &t2)
{ return !(t1 == t2); }
-inline timespec &operator+=(timespec &t1, const timespec &t2)
+constexpr inline timespec &operator+=(timespec &t1, const timespec &t2)
{
t1.tv_sec += t2.tv_sec;
t1.tv_nsec += t2.tv_nsec;
return normalizedTimespec(t1);
}
-inline timespec operator+(const timespec &t1, const timespec &t2)
+constexpr inline timespec operator+(const timespec &t1, const timespec &t2)
{
- timespec tmp;
+ timespec tmp = {};
tmp.tv_sec = t1.tv_sec + t2.tv_sec;
tmp.tv_nsec = t1.tv_nsec + t2.tv_nsec;
return normalizedTimespec(tmp);
}
-inline timespec operator-(const timespec &t1, const timespec &t2)
+constexpr inline timespec operator-(const timespec &t1, const timespec &t2)
{
- timespec tmp;
+ timespec tmp = {};
tmp.tv_sec = t1.tv_sec - (t2.tv_sec - 1);
- tmp.tv_nsec = t1.tv_nsec - (t2.tv_nsec + 1000000000);
+ tmp.tv_nsec = t1.tv_nsec - (t2.tv_nsec + OneSecAsNsecs);
return normalizedTimespec(tmp);
}
-inline timespec operator*(const timespec &t1, int mul)
+constexpr inline timespec operator*(const timespec &t1, int mul)
{
- timespec tmp;
+ timespec tmp = {};
tmp.tv_sec = t1.tv_sec * mul;
tmp.tv_nsec = t1.tv_nsec * mul;
return normalizedTimespec(tmp);
}
-inline timeval timespecToTimeval(const timespec &ts)
+inline timeval timespecToTimeval(timespec ts)
{
timeval tv;
tv.tv_sec = ts.tv_sec;
@@ -158,23 +144,44 @@ inline timeval timespecToTimeval(const timespec &ts)
return tv;
}
+inline timespec &operator+=(timespec &t1, std::chrono::milliseconds msecs)
+{
+ t1 += durationToTimespec(msecs);
+ return t1;
+}
-inline void qt_ignore_sigpipe()
+inline timespec &operator+=(timespec &t1, int ms)
{
- // Set to ignore SIGPIPE once only.
- static QBasicAtomicInt atom = Q_BASIC_ATOMIC_INITIALIZER(0);
- if (!atom.loadRelaxed()) {
- // More than one thread could turn off SIGPIPE at the same time
- // But that's acceptable because they all would be doing the same
- // action
- struct sigaction noaction;
- memset(&noaction, 0, sizeof(noaction));
- noaction.sa_handler = SIG_IGN;
- ::sigaction(SIGPIPE, &noaction, nullptr);
- atom.storeRelaxed(1);
+ t1 += std::chrono::milliseconds{ms};
+ return t1;
+}
+
+inline timespec operator+(const timespec &t1, std::chrono::milliseconds msecs)
+{
+ timespec tmp = t1;
+ tmp += msecs;
+ return tmp;
+}
+
+inline timespec operator+(const timespec &t1, int ms)
+{
+ return t1 + std::chrono::milliseconds{ms};
+}
+
+inline timespec qAbsTimespec(timespec ts)
+{
+ if (ts.tv_sec < 0) {
+ ts.tv_sec = -ts.tv_sec - 1;
+ ts.tv_nsec -= OneSecAsNsecs;
+ }
+ if (ts.tv_sec == 0 && ts.tv_nsec < 0) {
+ ts.tv_nsec = -ts.tv_nsec;
}
+ return normalizedTimespec(ts);
}
+Q_CORE_EXPORT void qt_ignore_sigpipe() noexcept;
+
#if defined(Q_PROCESSOR_X86_32) && defined(__GLIBC__)
# if !__GLIBC_PREREQ(2, 22)
Q_CORE_EXPORT int qt_open64(const char *pathname, int flags, mode_t);
@@ -183,6 +190,16 @@ Q_CORE_EXPORT int qt_open64(const char *pathname, int flags, mode_t);
# endif
#endif
+#ifdef AT_FDCWD
+static inline int qt_safe_openat(int dfd, const char *pathname, int flags, mode_t mode = 0777)
+{
+ // everyone already has O_CLOEXEC
+ int fd;
+ QT_EINTR_LOOP(fd, openat(dfd, pathname, flags | O_CLOEXEC, mode));
+ return fd;
+}
+#endif
+
// don't call QT_OPEN or ::open
// call qt_safe_open
static inline int qt_safe_open(const char *pathname, int flags, mode_t mode = 0777)
@@ -191,7 +208,7 @@ static inline int qt_safe_open(const char *pathname, int flags, mode_t mode = 07
flags |= O_CLOEXEC;
#endif
int fd;
- EINTR_LOOP(fd, QT_OPEN(pathname, flags, mode));
+ QT_EINTR_LOOP(fd, QT_OPEN(pathname, flags, mode));
#ifndef O_CLOEXEC
if (fd != -1)
@@ -263,10 +280,10 @@ static inline int qt_safe_dup2(int oldfd, int newfd, int flags = FD_CLOEXEC)
int ret;
#ifdef QT_THREADSAFE_CLOEXEC
// use dup3
- EINTR_LOOP(ret, ::dup3(oldfd, newfd, flags ? O_CLOEXEC : 0));
+ QT_EINTR_LOOP(ret, ::dup3(oldfd, newfd, flags ? O_CLOEXEC : 0));
return ret;
#else
- EINTR_LOOP(ret, ::dup2(oldfd, newfd));
+ QT_EINTR_LOOP(ret, ::dup2(oldfd, newfd));
if (ret == -1)
return -1;
@@ -279,7 +296,7 @@ static inline int qt_safe_dup2(int oldfd, int newfd, int flags = FD_CLOEXEC)
static inline qint64 qt_safe_read(int fd, void *data, qint64 maxlen)
{
qint64 ret = 0;
- EINTR_LOOP(ret, QT_READ(fd, data, maxlen));
+ QT_EINTR_LOOP(ret, QT_READ(fd, data, maxlen));
return ret;
}
#undef QT_READ
@@ -288,7 +305,7 @@ static inline qint64 qt_safe_read(int fd, void *data, qint64 maxlen)
static inline qint64 qt_safe_write(int fd, const void *data, qint64 len)
{
qint64 ret = 0;
- EINTR_LOOP(ret, QT_WRITE(fd, data, len));
+ QT_EINTR_LOOP(ret, QT_WRITE(fd, data, len));
return ret;
}
#undef QT_WRITE
@@ -303,7 +320,7 @@ static inline qint64 qt_safe_write_nosignal(int fd, const void *data, qint64 len
static inline int qt_safe_close(int fd)
{
int ret;
- EINTR_LOOP(ret, QT_CLOSE(fd));
+ QT_EINTR_LOOP(ret, QT_CLOSE(fd));
return ret;
}
#undef QT_CLOSE
@@ -315,28 +332,28 @@ static inline int qt_safe_execve(const char *filename, char *const argv[],
char *const envp[])
{
int ret;
- EINTR_LOOP(ret, ::execve(filename, argv, envp));
+ QT_EINTR_LOOP(ret, ::execve(filename, argv, envp));
return ret;
}
static inline int qt_safe_execv(const char *path, char *const argv[])
{
int ret;
- EINTR_LOOP(ret, ::execv(path, argv));
+ QT_EINTR_LOOP(ret, ::execv(path, argv));
return ret;
}
static inline int qt_safe_execvp(const char *file, char *const argv[])
{
int ret;
- EINTR_LOOP(ret, ::execvp(file, argv));
+ QT_EINTR_LOOP(ret, ::execvp(file, argv));
return ret;
}
static inline pid_t qt_safe_waitpid(pid_t pid, int *status, int options)
{
int ret;
- EINTR_LOOP(ret, ::waitpid(pid, status, options));
+ QT_EINTR_LOOP(ret, ::waitpid(pid, status, options));
return ret;
}
#endif // QT_CONFIG(process)
@@ -345,9 +362,6 @@ static inline pid_t qt_safe_waitpid(pid_t pid, int *status, int options)
# define _POSIX_MONOTONIC_CLOCK -1
#endif
-// in qelapsedtimer_mac.cpp or qtimestamp_unix.cpp
-timespec qt_gettime() noexcept;
-void qt_nanosleep(timespec amount);
QByteArray qt_readlink(const char *path);
/* non-static */
@@ -365,20 +379,7 @@ inline bool qt_haveLinuxProcfs()
#endif
}
-Q_CORE_EXPORT int qt_safe_poll(struct pollfd *fds, nfds_t nfds, const struct timespec *timeout_ts);
-
-static inline int qt_poll_msecs(struct pollfd *fds, nfds_t nfds, int timeout)
-{
- timespec ts, *pts = nullptr;
-
- if (timeout >= 0) {
- ts.tv_sec = timeout / 1000;
- ts.tv_nsec = (timeout % 1000) * 1000 * 1000;
- pts = &ts;
- }
-
- return qt_safe_poll(fds, nfds, pts);
-}
+Q_CORE_EXPORT int qt_safe_poll(struct pollfd *fds, nfds_t nfds, QDeadlineTimer deadline);
static inline struct pollfd qt_make_pollfd(int fd, short events)
{
diff --git a/src/corelib/kernel/qcore_wasm.cpp b/src/corelib/kernel/qcore_wasm.cpp
new file mode 100644
index 0000000000..fb12ae50c3
--- /dev/null
+++ b/src/corelib/kernel/qcore_wasm.cpp
@@ -0,0 +1,97 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#include <QtCore/qrect.h>
+
+#include <emscripten/val.h>
+
+#if !defined(Q_OS_WASM)
+#error This is a wasm-only file.
+#endif // !defined(Q_OS_WASM)
+
+QT_BEGIN_NAMESPACE
+
+/*!
+ Converts the DOMRect (https://www.w3.org/TR/geometry-1/) \a domRect to QRectF. The behavior is
+ undefined if the provided parameter is not a DOMRect.
+
+ \since 6.5
+ \ingroup platform-type-conversions
+
+ \sa toDOMRect()
+*/
+QRectF QRectF::fromDOMRect(emscripten::val domRect)
+{
+ Q_ASSERT_X(domRect["constructor"]["name"].as<std::string>() == "DOMRect", Q_FUNC_INFO,
+ "Passed object is not a DOMRect");
+
+ return QRectF(domRect["left"].as<qreal>(), domRect["top"].as<qreal>(),
+ domRect["width"].as<qreal>(), domRect["height"].as<qreal>());
+}
+
+/*!
+ Converts this object to a DOMRect (https://www.w3.org/TR/geometry-1/).
+
+ \since 6.5
+ \ingroup platform-type-conversions
+
+ \sa fromDOMRect()
+*/
+emscripten::val QRectF::toDOMRect() const
+{
+ return emscripten::val::global("DOMRect").new_(left(), top(), width(), height());
+}
+
+/*!
+ Converts the \l {https://262.ecma-international.org/#sec-string-object}{ECMAScript string} \a
+ jsString to QString. Behavior is undefined if the provided parameter is not a string.
+
+ \since 6.6
+ \ingroup platform-type-conversions
+
+ \sa toEcmaString()
+*/
+QString QString::fromEcmaString(emscripten::val jsString)
+{
+ Q_ASSERT_X(jsString.isString(), Q_FUNC_INFO, "Passed object is not a string");
+
+ const double length = jsString["length"].as<double>();
+
+ Q_ASSERT_X((double(uint64_t(length)) != double(uint64_t(length) - 1)
+ && double(uint64_t(length)) != double(uint64_t(length) + 1))
+ || !std::numeric_limits<double>::is_iec559,
+ Q_FUNC_INFO, "The floating-point length cannot precisely represent an integer");
+
+ constexpr int zeroTerminatorLength = 1;
+ const auto lengthOfUtf16 = (length + zeroTerminatorLength) * 2;
+
+ Q_ASSERT_X((double(uint64_t(lengthOfUtf16)) != double(uint64_t(lengthOfUtf16) - 1)
+ && double(uint64_t(lengthOfUtf16)) != double(uint64_t(lengthOfUtf16) + 1))
+ || !std::numeric_limits<double>::is_iec559,
+ Q_FUNC_INFO,
+ "The floating-point lengthOfUtf16 cannot precisely represent an integer");
+
+ const QString result(uint64_t(length), Qt::Uninitialized);
+
+ static const emscripten::val stringToUTF16(emscripten::val::module_property("stringToUTF16"));
+ stringToUTF16(jsString, emscripten::val(quintptr(result.data())),
+ emscripten::val(lengthOfUtf16));
+ return result;
+}
+
+/*!
+ Converts this object to an
+ \l {https://262.ecma-international.org/#sec-string-object}{ECMAScript string}.
+
+ \since 6.6
+ \ingroup platform-type-conversions
+
+ \sa fromEcmaString()
+*/
+emscripten::val QString::toEcmaString() const
+{
+ static const emscripten::val UTF16ToString(emscripten::val::module_property("UTF16ToString"));
+ return UTF16ToString(emscripten::val(quintptr(utf16())));
+}
+
+QT_END_NAMESPACE
diff --git a/src/corelib/kernel/qcoreapplication.cpp b/src/corelib/kernel/qcoreapplication.cpp
index bd2da0760d..bd00f69c1c 100644
--- a/src/corelib/kernel/qcoreapplication.cpp
+++ b/src/corelib/kernel/qcoreapplication.cpp
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Copyright (C) 2021 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// Copyright (C) 2021 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qcoreapplication.h"
#include "qcoreapplication_p.h"
@@ -44,6 +8,7 @@
#ifndef QT_NO_QOBJECT
#include "qabstracteventdispatcher.h"
#include "qcoreevent.h"
+#include "qcoreevent_p.h"
#include "qeventloop.h"
#endif
#include "qmetaobject.h"
@@ -67,10 +32,11 @@
#include <private/qthread_p.h>
#if QT_CONFIG(thread)
#include <qthreadpool.h>
+#include <private/qthreadpool_p.h>
#endif
#endif
-#include <qelapsedtimer.h>
#include <qlibraryinfo.h>
+#include <qpointer.h>
#include <qvarlengtharray.h>
#include <private/qfactoryloader_p.h>
#include <private/qfunctions_p.h>
@@ -78,6 +44,10 @@
#include <private/qlocking_p.h>
#include <private/qhooks_p.h>
+#if QT_CONFIG(permissions)
+#include <private/qpermissions_p.h>
+#endif
+
#ifndef QT_NO_QOBJECT
#if defined(Q_OS_UNIX)
# if defined(Q_OS_DARWIN)
@@ -87,7 +57,9 @@
# include "qeventdispatcher_glib_p.h"
# endif
# endif
-# include "qeventdispatcher_unix_p.h"
+# if !defined(Q_OS_WASM)
+# include "qeventdispatcher_unix_p.h"
+# endif
#endif
#ifdef Q_OS_WIN
#include "qeventdispatcher_win_p.h"
@@ -98,7 +70,7 @@
#include <QtCore/qjniobject.h>
#endif
-#ifdef Q_OS_MAC
+#ifdef Q_OS_DARWIN
# include "qcore_mac_p.h"
#endif
@@ -134,20 +106,35 @@
#endif
#include <algorithm>
+#include <memory>
+#include <string>
QT_BEGIN_NAMESPACE
-#if defined(Q_OS_WIN) || defined(Q_OS_MAC)
-extern QString qAppFileName();
+#ifndef QT_NO_QOBJECT
+Q_LOGGING_CATEGORY(lcDeleteLater, "qt.core.qobject.deletelater")
#endif
-#if QT_VERSION >= QT_VERSION_CHECK(7, 0, 0)
-# error "Bump QCoreApplicatoinPrivate::app_compile_version to QT_VERSION_CHECK(7, 0, 0)"
+using namespace Qt::StringLiterals;
+
+Q_TRACE_PREFIX(qtcore,
+ "#include <qcoreevent.h>"
+);
+Q_TRACE_METADATA(qtcore, "ENUM { AUTO, RANGE User ... MaxUser } QEvent::Type;");
+Q_TRACE_POINT(qtcore, QCoreApplication_postEvent_entry, QObject *receiver, QEvent *event, QEvent::Type type);
+Q_TRACE_POINT(qtcore, QCoreApplication_postEvent_exit);
+Q_TRACE_POINT(qtcore, QCoreApplication_postEvent_event_compressed, QObject *receiver, QEvent *event);
+Q_TRACE_POINT(qtcore, QCoreApplication_postEvent_event_posted, QObject *receiver, QEvent *event, QEvent::Type type);
+Q_TRACE_POINT(qtcore, QCoreApplication_sendEvent, QObject *receiver, QEvent *event, QEvent::Type type);
+Q_TRACE_POINT(qtcore, QCoreApplication_sendSpontaneousEvent, QObject *receiver, QEvent *event, QEvent::Type type);
+Q_TRACE_POINT(qtcore, QCoreApplication_notify_entry, QObject *receiver, QEvent *event, QEvent::Type type);
+Q_TRACE_POINT(qtcore, QCoreApplication_notify_exit, bool consumed, bool filtered);
+
+#if defined(Q_OS_WIN) || defined(Q_OS_DARWIN)
+extern QString qAppFileName();
#endif
-// We don't know exactly, but it's at least 6.0.0:
-int QCoreApplicationPrivate::app_compile_version = QT_VERSION_CHECK(6, 0, 0);
-bool QCoreApplicationPrivate::setuidAllowed = false;
+Q_CONSTINIT bool QCoreApplicationPrivate::setuidAllowed = false;
#if !defined(Q_OS_WIN)
#ifdef Q_OS_DARWIN
@@ -204,7 +191,7 @@ QString QCoreApplicationPrivate::appVersion() const
}
#endif // !Q_OS_WIN
-QString *QCoreApplicationPrivate::cachedApplicationFilePath = nullptr;
+Q_CONSTINIT QString *QCoreApplicationPrivate::cachedApplicationFilePath = nullptr;
bool QCoreApplicationPrivate::checkInstance(const char *function)
{
@@ -254,7 +241,11 @@ void QCoreApplicationPrivate::processCommandLineArguments()
// Support for introspection
-extern "C" void Q_CORE_EXPORT qt_startup_hook()
+extern "C" void
+#ifdef QT_SHARED
+Q_DECL_EXPORT_OVERRIDABLE
+#endif
+qt_startup_hook()
{
}
@@ -262,8 +253,8 @@ typedef QList<QtStartUpFunction> QStartUpFuncList;
Q_GLOBAL_STATIC(QStartUpFuncList, preRList)
typedef QList<QtCleanUpFunction> QVFuncList;
Q_GLOBAL_STATIC(QVFuncList, postRList)
-static QBasicMutex globalRoutinesMutex;
-static bool preRoutinesCalled = false;
+Q_CONSTINIT static QBasicMutex globalRoutinesMutex;
+Q_CONSTINIT static bool preRoutinesCalled = false;
/*!
\internal
@@ -314,16 +305,16 @@ static void qt_call_pre_routines()
if (!preRList.exists())
return;
- QVFuncList list;
- {
+ const QStartUpFuncList list = [] {
const auto locker = qt_scoped_lock(globalRoutinesMutex);
// Unlike qt_call_post_routines, we don't empty the list, because
// Q_COREAPP_STARTUP_FUNCTION is a macro, so the user expects
// the function to be executed every time QCoreApplication is created.
- list = *preRList;
- }
- for (int i = 0; i < list.count(); ++i)
- list.at(i)();
+ return *preRList;
+ }();
+
+ for (QtStartUpFunction f : list)
+ f();
}
void Q_CORE_EXPORT qt_call_post_routines()
@@ -341,7 +332,7 @@ void Q_CORE_EXPORT qt_call_post_routines()
if (list.isEmpty())
break;
- for (QtCleanUpFunction f : qAsConst(list))
+ for (QtCleanUpFunction f : std::as_const(list))
f();
}
}
@@ -350,22 +341,22 @@ void Q_CORE_EXPORT qt_call_post_routines()
#ifndef QT_NO_QOBJECT
// app starting up if false
-bool QCoreApplicationPrivate::is_app_running = false;
+Q_CONSTINIT bool QCoreApplicationPrivate::is_app_running = false;
// app closing down if true
-bool QCoreApplicationPrivate::is_app_closing = false;
+Q_CONSTINIT bool QCoreApplicationPrivate::is_app_closing = false;
-Q_CORE_EXPORT uint qGlobalPostedEventsCount()
+qsizetype qGlobalPostedEventsCount()
{
- QThreadData *currentThreadData = QThreadData::current();
- return currentThreadData->postEventList.size() - currentThreadData->postEventList.startOffset;
+ const QPostEventList &l = QThreadData::current()->postEventList;
+ return l.size() - l.startOffset;
}
-QAbstractEventDispatcher *QCoreApplicationPrivate::eventDispatcher = nullptr;
+Q_CONSTINIT QAbstractEventDispatcher *QCoreApplicationPrivate::eventDispatcher = nullptr;
#endif // QT_NO_QOBJECT
-QCoreApplication *QCoreApplication::self = nullptr;
-uint QCoreApplicationPrivate::attribs =
+Q_CONSTINIT QCoreApplication *QCoreApplication::self = nullptr;
+Q_CONSTINIT uint QCoreApplicationPrivate::attribs =
(1 << Qt::AA_SynthesizeMouseForUnhandledTouchEvents) |
(1 << Qt::AA_SynthesizeMouseForUnhandledTabletEvents);
@@ -391,8 +382,8 @@ struct QCoreApplicationData {
bool applicationVersionSet; // true if setApplicationVersion was called
#if QT_CONFIG(library)
- QScopedPointer<QStringList> app_libpaths;
- QScopedPointer<QStringList> manual_libpaths;
+ std::unique_ptr<QStringList> app_libpaths;
+ std::unique_ptr<QStringList> manual_libpaths;
#endif
};
@@ -400,7 +391,7 @@ struct QCoreApplicationData {
Q_GLOBAL_STATIC(QCoreApplicationData, coreappdata)
#ifndef QT_NO_QOBJECT
-static bool quitLockEnabled = true;
+Q_CONSTINIT static bool quitLockEnabled = true;
#endif
#if defined(Q_OS_WIN)
@@ -432,7 +423,7 @@ static inline bool contains(int argc, char **argv, const char *needle)
}
#endif // Q_OS_WIN
-QCoreApplicationPrivate::QCoreApplicationPrivate(int &aargc, char **aargv, uint flags)
+QCoreApplicationPrivate::QCoreApplicationPrivate(int &aargc, char **aargv)
:
#ifndef QT_NO_QOBJECT
QObjectPrivate(),
@@ -452,7 +443,6 @@ QCoreApplicationPrivate::QCoreApplicationPrivate(int &aargc, char **aargv, uint
, q_ptr(nullptr)
#endif
{
- app_compile_version = flags & 0xffffff;
static const char *const empty = "";
if (argc == 0 || argv == nullptr) {
argc = 0;
@@ -487,6 +477,8 @@ QCoreApplicationPrivate::~QCoreApplicationPrivate()
#endif
#if defined(Q_OS_WIN)
delete [] origArgv;
+ if (consoleAllocated)
+ FreeConsole();
#endif
QCoreApplicationPrivate::clearApplicationFilePath();
}
@@ -505,8 +497,7 @@ void QCoreApplicationPrivate::cleanupThreadData()
// need to clear the state of the mainData, just in case a new QCoreApplication comes along.
const auto locker = qt_scoped_lock(thisThreadData->postEventList.mutex);
- for (int i = 0; i < thisThreadData->postEventList.size(); ++i) {
- const QPostEvent &pe = thisThreadData->postEventList.at(i);
+ for (const QPostEvent &pe : std::as_const(thisThreadData->postEventList)) {
if (pe.event) {
--pe.receiver->d_func()->postedEvents;
pe.event->m_posted = false;
@@ -533,7 +524,8 @@ void QCoreApplicationPrivate::eventDispatcherReady()
{
}
-QBasicAtomicPointer<QThread> QCoreApplicationPrivate::theMainThread = Q_BASIC_ATOMIC_INITIALIZER(nullptr);
+Q_CONSTINIT QBasicAtomicPointer<QThread> QCoreApplicationPrivate::theMainThread = Q_BASIC_ATOMIC_INITIALIZER(nullptr);
+Q_CONSTINIT QBasicAtomicPointer<void> QCoreApplicationPrivate::theMainThreadId = Q_BASIC_ATOMIC_INITIALIZER(nullptr);
QThread *QCoreApplicationPrivate::mainThread()
{
Q_ASSERT(theMainThread.loadRelaxed() != nullptr);
@@ -568,11 +560,11 @@ void QCoreApplicationPrivate::checkReceiverThread(QObject *receiver)
void QCoreApplicationPrivate::appendApplicationPathToLibraryPaths()
{
#if QT_CONFIG(library)
- QStringList *app_libpaths = coreappdata()->app_libpaths.data();
+ QStringList *app_libpaths = coreappdata()->app_libpaths.get();
if (!app_libpaths)
coreappdata()->app_libpaths.reset(app_libpaths = new QStringList);
QString app_location = QCoreApplication::applicationFilePath();
- app_location.truncate(app_location.lastIndexOf(QLatin1Char('/')));
+ app_location.truncate(app_location.lastIndexOf(u'/'));
app_location = QDir(app_location).canonicalPath();
if (QFile::exists(app_location) && !app_libpaths->contains(app_location))
app_libpaths->append(app_location);
@@ -586,50 +578,117 @@ QString qAppName()
return QCoreApplication::instance()->d_func()->appName();
}
+void QCoreApplicationPrivate::initConsole()
+{
+#ifdef Q_OS_WINDOWS
+ const QString env = qEnvironmentVariable("QT_WIN_DEBUG_CONSOLE");
+ if (env.isEmpty())
+ return;
+ if (env.compare(u"new"_s, Qt::CaseInsensitive) == 0) {
+ if (AllocConsole() == FALSE)
+ return;
+ consoleAllocated = true;
+ } else if (env.compare(u"attach"_s, Qt::CaseInsensitive) == 0) {
+ // If the calling process is already attached to a console,
+ // the error code returned is ERROR_ACCESS_DENIED.
+ if (!::AttachConsole(ATTACH_PARENT_PROCESS) && ::GetLastError() != ERROR_ACCESS_DENIED)
+ return;
+ } else {
+ // Unknown input, don't make any decision for the user.
+ return;
+ }
+ // The std{in,out,err} handles are read-only, so we need to pass in dummies.
+ FILE *in = nullptr;
+ FILE *out = nullptr;
+ FILE *err = nullptr;
+ freopen_s(&in, "CONIN$", "r", stdin);
+ freopen_s(&out, "CONOUT$", "w", stdout);
+ freopen_s(&err, "CONOUT$", "w", stderr);
+ // However, things wouldn't work if the runtime did not preserve the pointers.
+ Q_ASSERT(in == stdin);
+ Q_ASSERT(out == stdout);
+ Q_ASSERT(err == stderr);
+#endif
+}
+
void QCoreApplicationPrivate::initLocale()
{
-#if defined(Q_OS_UNIX) && !defined(QT_BOOTSTRAPPED)
- static bool qt_locale_initialized = false;
+#if defined(QT_BOOTSTRAPPED)
+ // Don't try to control bootstrap library locale or encoding.
+#elif defined(Q_OS_UNIX)
+ Q_CONSTINIT static bool qt_locale_initialized = false;
if (qt_locale_initialized)
return;
qt_locale_initialized = true;
-#ifdef Q_OS_INTEGRITY
+ // By default the portable "C"/POSIX locale is selected and active.
+ // Apply the locale from the environment, via setlocale(), which will
+ // read LC_ALL, LC_<category>, and LANG, in order (for each category).
+ setlocale(LC_ALL, "");
+
+ // Next, let's ensure that LC_CTYPE is UTF-8, since QStringConverter's
+ // QLocal8Bit hard-codes this, and we need to be consistent.
+# if defined(Q_OS_INTEGRITY)
setlocale(LC_CTYPE, "UTF-8");
-#else
- // Android's Bionic didn't get nl_langinfo until NDK 15 (Android 8.0),
- // which is too new for Qt, so we just assume it's always UTF-8.
- auto nl_langinfo = [](int) { return "UTF-8"; };
-
- const char *locale = setlocale(LC_ALL, "");
- const char *codec = nl_langinfo(CODESET);
- if (Q_UNLIKELY(strcmp(codec, "UTF-8") != 0 && strcmp(codec, "utf8") != 0)) {
- QByteArray oldLocale = locale;
- QByteArray newLocale = setlocale(LC_CTYPE, nullptr);
- if (int dot = newLocale.indexOf('.'); dot != -1)
+# elif defined(Q_OS_QNX)
+ // QNX has no nl_langinfo, so we can't check.
+ // FIXME: Shouldn't we still setlocale("UTF-8")?
+# elif defined(Q_OS_ANDROID) && __ANDROID_API__ < __ANDROID_API_O__
+ // Android 6 still lacks nl_langinfo(), so we can't check.
+ // FIXME: Shouldn't we still setlocale("UTF-8")?
+# elif defined(Q_OS_VXWORKS)
+ // VxWorks has no nl_langinfo, so we can't check.
+# else
+ // std::string's SSO usually saves this the need to allocate:
+ const std::string oldEncoding = nl_langinfo(CODESET);
+ if (!Q_LIKELY(qstricmp(oldEncoding.data(), "UTF-8") == 0
+ || qstricmp(oldEncoding.data(), "utf8") == 0)) {
+ const QByteArray oldLocale = setlocale(LC_ALL, nullptr);
+ QByteArray newLocale;
+ bool warnOnOverride = true;
+# if defined(Q_OS_DARWIN)
+ // Don't warn unless the char encoding has been changed from the
+ // default "C" encoding, or the user touched any of the locale
+ // environment variables to force the "C" char encoding.
+ warnOnOverride = qstrcmp(setlocale(LC_CTYPE, nullptr), "C") != 0
+ || getenv("LC_ALL") || getenv("LC_CTYPE") || getenv("LANG");
+
+ // No need to try language or region specific CTYPEs, as they
+ // all point back to the same generic UTF-8 CTYPE.
+ newLocale = setlocale(LC_CTYPE, "UTF-8");
+# else
+ newLocale = setlocale(LC_CTYPE, nullptr);
+ if (qsizetype dot = newLocale.indexOf('.'); dot != -1)
newLocale.truncate(dot); // remove encoding, if any
- if (int at = newLocale.indexOf('@'); at != -1)
+ if (qsizetype at = newLocale.indexOf('@'); at != -1)
newLocale.truncate(at); // remove variant, as the old de_DE@euro
newLocale += ".UTF-8";
newLocale = setlocale(LC_CTYPE, newLocale);
- // if locale doesn't exist, try some fallbacks
-# ifdef Q_OS_DARWIN
- if (newLocale.isEmpty())
- newLocale = setlocale(LC_CTYPE, "UTF-8");
-# endif
+ // If that locale doesn't exist, try some fallbacks:
if (newLocale.isEmpty())
newLocale = setlocale(LC_CTYPE, "C.UTF-8");
if (newLocale.isEmpty())
newLocale = setlocale(LC_CTYPE, "C.utf8");
-
- qWarning("Detected system locale encoding (%s, locale \"%s\") is not UTF-8.\n"
- "Qt shall use a UTF-8 locale (\"%s\") instead. If this causes problems,\n"
- "reconfigure your locale. See the locale(1) manual for more information.",
- codec, oldLocale.constData(), newLocale.constData());
+# endif
+
+ if (newLocale.isEmpty()) {
+ // Failed to set a UTF-8 locale.
+ qWarning("Detected locale \"%s\" with character encoding \"%s\", which is not UTF-8.\n"
+ "Qt depends on a UTF-8 locale, but has failed to switch to one.\n"
+ "If this causes problems, reconfigure your locale. See the locale(1) manual\n"
+ "for more information.", oldLocale.constData(), oldEncoding.data());
+ } else if (warnOnOverride) {
+ // Let the user know we over-rode their configuration.
+ qWarning("Detected locale \"%s\" with character encoding \"%s\", which is not UTF-8.\n"
+ "Qt depends on a UTF-8 locale, and has switched to \"%s\" instead.\n"
+ "If this causes problems, reconfigure your locale. See the locale(1) manual\n"
+ "for more information.",
+ oldLocale.constData(), oldEncoding.data(), newLocale.constData());
+ }
}
-#endif
-#endif
+# endif // Platform choice
+#endif // Unix
}
@@ -705,7 +764,8 @@ void QCoreApplicationPrivate::initLocale()
to reset the locale that is used for number formatting to "C"-locale.
\sa QGuiApplication, QAbstractEventDispatcher, QEventLoop,
- {Semaphores Example}, {Wait Conditions Example}
+ {Producer and Consumer using Semaphores},
+ {Producer and Consumer using Wait Conditions}
*/
/*!
@@ -748,13 +808,13 @@ QCoreApplication::QCoreApplication(QCoreApplicationPrivate &p)
*/
QCoreApplication::QCoreApplication(int &argc, char **argv
#ifndef Q_QDOC
- , int _internal
+ , int
#endif
)
#ifdef QT_NO_QOBJECT
- : d_ptr(new QCoreApplicationPrivate(argc, argv, _internal))
+ : d_ptr(new QCoreApplicationPrivate(argc, argv))
#else
- : QObject(*new QCoreApplicationPrivate(argc, argv, _internal))
+ : QObject(*new QCoreApplicationPrivate(argc, argv))
#endif
{
d_func()->q_ptr = this;
@@ -771,7 +831,7 @@ QCoreApplication::QCoreApplication(int &argc, char **argv
\value ApplicationFlags QT_VERSION
*/
-void QCoreApplicationPrivate::init()
+void Q_TRACE_INSTRUMENT(qtcore) QCoreApplicationPrivate::init()
{
Q_TRACE_SCOPE(QCoreApplicationPrivate_init);
@@ -781,6 +841,8 @@ void QCoreApplicationPrivate::init()
Q_Q(QCoreApplication);
+ initConsole();
+
initLocale();
Q_ASSERT_X(!QCoreApplication::self, "QCoreApplication", "there should be only one application object");
@@ -788,7 +850,11 @@ void QCoreApplicationPrivate::init()
#if QT_CONFIG(thread)
#ifdef Q_OS_WASM
- QThreadPrivate::idealThreadCount = emscripten::val::global("navigator")["hardwareConcurrency"].as<int>();
+ emscripten::val hardwareConcurrency = emscripten::val::global("navigator")["hardwareConcurrency"];
+ if (hardwareConcurrency.isUndefined())
+ QThreadPrivate::idealThreadCount = 2;
+ else
+ QThreadPrivate::idealThreadCount = hardwareConcurrency.as<int>();
#endif
#endif
@@ -811,8 +877,8 @@ void QCoreApplicationPrivate::init()
// Reset the lib paths, so that they will be recomputed, taking the availability of argv[0]
// into account. If necessary, recompute right away and replay the manual changes on top of the
// new lib paths.
- QStringList *appPaths = coreappdata()->app_libpaths.take();
- QStringList *manualPaths = coreappdata()->manual_libpaths.take();
+ QStringList *appPaths = coreappdata()->app_libpaths.release();
+ QStringList *manualPaths = coreappdata()->manual_libpaths.release();
if (appPaths) {
if (manualPaths) {
// Replay the delta. As paths can only be prepended to the front or removed from
@@ -820,7 +886,7 @@ void QCoreApplicationPrivate::init()
// have been removed. Once the original list is exhausted we know all the remaining
// items have been added.
QStringList newPaths(q->libraryPaths());
- for (int i = manualPaths->length(), j = appPaths->length(); i > 0 || j > 0; qt_noop()) {
+ for (qsizetype i = manualPaths->size(), j = appPaths->size(); i > 0 || j > 0; qt_noop()) {
if (--j < 0) {
newPaths.prepend((*manualPaths)[--i]);
} else if (--i < 0) {
@@ -890,8 +956,10 @@ QCoreApplication::~QCoreApplication()
#if QT_CONFIG(thread)
// Synchronize and stop the global thread pool threads.
QThreadPool *globalThreadPool = nullptr;
+ QThreadPool *guiThreadPool = nullptr;
QT_TRY {
globalThreadPool = QThreadPool::globalInstance();
+ guiThreadPool = QThreadPoolPrivate::qtGuiInstance();
} QT_CATCH (...) {
// swallow the exception, since destructors shouldn't throw
}
@@ -899,6 +967,10 @@ QCoreApplication::~QCoreApplication()
globalThreadPool->waitForDone();
delete globalThreadPool;
}
+ if (guiThreadPool) {
+ guiThreadPool->waitForDone();
+ delete guiThreadPool;
+ }
#endif
#ifndef QT_NO_QOBJECT
@@ -932,7 +1004,10 @@ QCoreApplication::~QCoreApplication()
and must be set before a QCoreApplication instance is created.
\note It is strongly recommended not to enable this option since
- it introduces security risks.
+ it introduces security risks. If this application does enable the flag and
+ starts child processes, it should drop the privileges as early as possible
+ by calling \c{setuid(2)} for itself, or at the latest by using the
+ QProcess::UnixProcessParameters::ResetIds flag.
*/
void QCoreApplication::setSetuidAllowed(bool allow)
{
@@ -952,7 +1027,6 @@ bool QCoreApplication::isSetuidAllowed()
return QCoreApplicationPrivate::setuidAllowed;
}
-
/*!
Sets the attribute \a attribute if \a on is true;
otherwise clears the attribute.
@@ -965,6 +1039,10 @@ bool QCoreApplication::isSetuidAllowed()
*/
void QCoreApplication::setAttribute(Qt::ApplicationAttribute attribute, bool on)
{
+ // Since we bit-shift these values, we can't go higher than 32 on 32 bit operating systems
+ // without changing the storage type of QCoreApplicationPrivate::attribs to quint64.
+ static_assert(Qt::AA_AttributeCount <= sizeof(QCoreApplicationPrivate::attribs) * CHAR_BIT);
+
if (on)
QCoreApplicationPrivate::attribs |= 1 << attribute;
else
@@ -1013,6 +1091,14 @@ bool QCoreApplication::testAttribute(Qt::ApplicationAttribute attribute)
\brief Whether the use of the QEventLoopLocker feature can cause the
application to quit.
+ When this property is \c true the release of the last remaining
+ QEventLoopLocker operating on the application will attempt to
+ quit the application.
+
+ Note that attempting a quit may not necessarily result in the
+ application quitting, for example if there still are open windows,
+ or the QEvent::Quit event is ignored.
+
The default is \c true.
\sa QEventLoopLocker
@@ -1040,7 +1126,7 @@ void QCoreApplication::setQuitLockEnabled(bool enabled)
bool QCoreApplication::notifyInternal2(QObject *receiver, QEvent *event)
{
bool selfRequired = QCoreApplicationPrivate::threadRequiresCoreApplication();
- if (!self && selfRequired)
+ if (selfRequired && !self)
return false;
// Make it possible for Qt Script to hook into events even
@@ -1056,10 +1142,15 @@ bool QCoreApplication::notifyInternal2(QObject *receiver, QEvent *event)
// equivalent to QThreadData::current(), just without the function
// call overhead.
QObjectPrivate *d = receiver->d_func();
- QThreadData *threadData = d->threadData;
+ QThreadData *threadData = d->threadData.loadAcquire();
QScopedScopeLevelCounter scopeLevelCounter(threadData);
if (!selfRequired)
return doNotify(receiver, event);
+
+#if QT_VERSION >= QT_VERSION_CHECK(7, 0, 0)
+ if (threadData->thread.loadRelaxed() != QCoreApplicationPrivate::mainThread())
+ return false;
+#endif
return self->notify(receiver, event);
}
@@ -1118,7 +1209,7 @@ bool QCoreApplication::forwardEvent(QObject *receiver, QEvent *event, QEvent *or
\endlist
\b{Future direction:} This function will not be called for objects that live
- outside the main thread in Qt 6. Applications that need that functionality
+ outside the main thread in Qt 7. Applications that need that functionality
should find other solutions for their event inspection needs in the meantime.
The change may be extended to the main thread, causing this function to be
deprecated.
@@ -1136,6 +1227,11 @@ bool QCoreApplication::notify(QObject *receiver, QEvent *event)
Q_ASSERT(receiver);
Q_ASSERT(event);
+#if QT_VERSION >= QT_VERSION_CHECK(7, 0, 0)
+ Q_ASSERT(receiver->d_func()->threadData.loadAcquire()->thread.loadRelaxed()
+ == QCoreApplicationPrivate::mainThread());
+#endif
+
// no events are delivered after ~QCoreApplication() has started
if (QCoreApplicationPrivate::is_app_closing)
return true;
@@ -1162,15 +1258,15 @@ static bool doNotify(QObject *receiver, QEvent *event)
bool QCoreApplicationPrivate::sendThroughApplicationEventFilters(QObject *receiver, QEvent *event)
{
// We can't access the application event filters outside of the main thread (race conditions)
- Q_ASSERT(receiver->d_func()->threadData.loadRelaxed()->thread.loadAcquire() == mainThread());
+ Q_ASSERT(receiver->d_func()->threadData.loadAcquire()->thread.loadRelaxed() == mainThread());
if (extraData) {
// application event filters are only called for objects in the GUI thread
- for (int i = 0; i < extraData->eventFilters.size(); ++i) {
+ for (qsizetype i = 0; i < extraData->eventFilters.size(); ++i) {
QObject *obj = extraData->eventFilters.at(i);
if (!obj)
continue;
- if (obj->d_func()->threadData != threadData) {
+ if (obj->d_func()->threadData.loadRelaxed() != threadData.loadRelaxed()) {
qWarning("QCoreApplication: Application event filter cannot be in a different thread.");
continue;
}
@@ -1183,12 +1279,14 @@ bool QCoreApplicationPrivate::sendThroughApplicationEventFilters(QObject *receiv
bool QCoreApplicationPrivate::sendThroughObjectEventFilters(QObject *receiver, QEvent *event)
{
- if (receiver != QCoreApplication::instance() && receiver->d_func()->extraData) {
- for (int i = 0; i < receiver->d_func()->extraData->eventFilters.size(); ++i) {
+ if ((receiver->d_func()->threadData.loadRelaxed()->thread.loadAcquire() != mainThread()
+ || receiver != QCoreApplication::instance())
+ && receiver->d_func()->extraData) {
+ for (qsizetype i = 0; i < receiver->d_func()->extraData->eventFilters.size(); ++i) {
QObject *obj = receiver->d_func()->extraData->eventFilters.at(i);
if (!obj)
continue;
- if (obj->d_func()->threadData != receiver->d_func()->threadData) {
+ if (obj->d_func()->threadData.loadRelaxed() != receiver->d_func()->threadData.loadRelaxed()) {
qWarning("QCoreApplication: Object event filter cannot be in a different thread.");
continue;
}
@@ -1214,8 +1312,8 @@ bool QCoreApplicationPrivate::notify_helper(QObject *receiver, QEvent * event)
Q_TRACE_EXIT(QCoreApplication_notify_exit, consumed, filtered);
// send to all application event filters (only does anything in the main thread)
- if (QCoreApplication::self
- && receiver->d_func()->threadData.loadRelaxed()->thread.loadAcquire() == mainThread()
+ if (receiver->d_func()->threadData.loadRelaxed()->thread.loadAcquire() == mainThread()
+ && QCoreApplication::self
&& QCoreApplication::self->d_func()->sendThroughApplicationEventFilters(receiver, event)) {
filtered = true;
return filtered;
@@ -1282,7 +1380,8 @@ bool QCoreApplication::closingDown()
\threadsafe
- \sa exec(), QTimer, QEventLoop::processEvents(), sendPostedEvents()
+ \sa exec(), QTimer, QChronoTimer, QEventLoop::processEvents(),
+ sendPostedEvents()
*/
void QCoreApplication::processEvents(QEventLoop::ProcessEventsFlags flags)
{
@@ -1293,12 +1392,29 @@ void QCoreApplication::processEvents(QEventLoop::ProcessEventsFlags flags)
}
/*!
- \overload processEvents()
+ \overload
Processes pending events for the calling thread for \a ms
milliseconds or until there are no more events to process,
whichever is shorter.
+ This is equivalent to calling:
+ \code
+ QCoreApplication::processEvents(flags, QDeadlineTimer(ms));
+ \endcode
+*/
+void QCoreApplication::processEvents(QEventLoop::ProcessEventsFlags flags, int ms)
+{
+ QCoreApplication::processEvents(flags, QDeadlineTimer(ms));
+}
+
+/*!
+ \since 6.7
+ \overload
+
+ Processes pending events for the calling thread untile \a deadline has expired,
+ or until there are no more events to process, whichever happens first.
+
Use of this function is discouraged. Instead, prefer to move long
operations out of the GUI thread into an auxiliary one and to completely
avoid nested event loop processing. If event processing is really
@@ -1314,9 +1430,9 @@ void QCoreApplication::processEvents(QEventLoop::ProcessEventsFlags flags)
\threadsafe
- \sa exec(), QTimer, QEventLoop::processEvents()
+ \sa exec(), QTimer, QChronoTimer, QEventLoop::processEvents()
*/
-void QCoreApplication::processEvents(QEventLoop::ProcessEventsFlags flags, int ms)
+void QCoreApplication::processEvents(QEventLoop::ProcessEventsFlags flags, QDeadlineTimer deadline)
{
// ### TODO: consider splitting this method into a public and a private
// one, so that a user-invoked processEvents can be detected
@@ -1324,10 +1440,9 @@ void QCoreApplication::processEvents(QEventLoop::ProcessEventsFlags flags, int m
QThreadData *data = QThreadData::current();
if (!data->hasEventDispatcher())
return;
- QElapsedTimer start;
- start.start();
+
while (data->eventDispatcher.loadRelaxed()->processEvents(flags & ~QEventLoop::WaitForMoreEvents)) {
- if (start.elapsed() > ms)
+ if (deadline.hasExpired())
break;
}
}
@@ -1345,10 +1460,10 @@ void QCoreApplication::processEvents(QEventLoop::ProcessEventsFlags flags, int m
main event loop receives events from the window system and
dispatches these to the application widgets.
- To make your application perform idle processing (by executing a
- special function whenever there are no pending events), use a
- QTimer with 0 timeout. More advanced idle processing schemes can
- be achieved using processEvents().
+ To make your application perform idle processing (by executing a special
+ function whenever there are no pending events), use a QChronoTimer
+ with 0ns timeout. More advanced idle processing schemes can be achieved
+ using processEvents().
We recommend that you connect clean-up code to the
\l{QCoreApplication::}{aboutToQuit()} signal, instead of putting it in
@@ -1367,7 +1482,7 @@ int QCoreApplication::exec()
if (!QCoreApplicationPrivate::checkInstance("exec"))
return -1;
- QThreadData *threadData = self->d_func()->threadData;
+ QThreadData *threadData = self->d_func()->threadData.loadAcquire();
if (threadData != QThreadData::current()) {
qWarning("%s::exec: Must be called from the main thread", self->metaObject()->className());
return -1;
@@ -1400,9 +1515,8 @@ void QCoreApplicationPrivate::execCleanup()
{
threadData.loadRelaxed()->quitNow = false;
in_exec = false;
- if (!aboutToQuitEmitted)
- emit q_func()->aboutToQuit(QCoreApplication::QPrivateSignal());
- aboutToQuitEmitted = true;
+
+ qCDebug(lcDeleteLater) << "Sending deferred delete events as part of exec cleanup";
QCoreApplication::sendPostedEvents(nullptr, QEvent::DeferredDelete);
}
@@ -1441,9 +1555,14 @@ void QCoreApplication::exit(int returnCode)
{
if (!self)
return;
- QThreadData *data = self->d_func()->threadData.loadRelaxed();
+ QCoreApplicationPrivate *d = self->d_func();
+ if (!d->aboutToQuitEmitted) {
+ emit self->aboutToQuit(QCoreApplication::QPrivateSignal());
+ d->aboutToQuitEmitted = true;
+ }
+ QThreadData *data = d->threadData.loadRelaxed();
data->quitNow = true;
- for (int i = 0; i < data->eventLoops.size(); ++i) {
+ for (qsizetype i = 0; i < data->eventLoops.size(); ++i) {
QEventLoop *eventLoop = data->eventLoops.at(i);
eventLoop->exit(returnCode);
}
@@ -1581,37 +1700,12 @@ void QCoreApplication::postEvent(QObject *receiver, QEvent *event, int priority)
return;
}
- if (event->type() == QEvent::DeferredDelete)
- receiver->d_ptr->deleteLaterCalled = true;
-
- if (event->type() == QEvent::DeferredDelete && data == QThreadData::current()) {
- // remember the current running eventloop for DeferredDelete
- // events posted in the receiver's thread.
-
- // Events sent by non-Qt event handlers (such as glib) may not
- // have the scopeLevel set correctly. The scope level makes sure that
- // code like this:
- // foo->deleteLater();
- // qApp->processEvents(); // without passing QEvent::DeferredDelete
- // will not cause "foo" to be deleted before returning to the event loop.
-
- // If the scope level is 0 while loopLevel != 0, we are called from a
- // non-conformant code path, and our best guess is that the scope level
- // should be 1. (Loop level 0 is special: it means that no event loops
- // are running.)
- int loopLevel = data->loopLevel;
- int scopeLevel = data->scopeLevel;
- if (scopeLevel == 0 && loopLevel != 0)
- scopeLevel = 1;
- static_cast<QDeferredDeleteEvent *>(event)->level = loopLevel + scopeLevel;
- }
-
// delete the event on exceptions to protect against memory leaks till the event is
// properly owned in the postEventList
- QScopedPointer<QEvent> eventDeleter(event);
+ std::unique_ptr<QEvent> eventDeleter(event);
Q_TRACE(QCoreApplication_postEvent_event_posted, receiver, event, event->type());
data->postEventList.addEvent(QPostEvent(receiver, event, priority));
- eventDeleter.take();
+ Q_UNUSED(eventDeleter.release());
event->m_posted = true;
++receiver->d_func()->postedEvents;
data->canWait = false;
@@ -1632,36 +1726,27 @@ bool QCoreApplication::compressEvent(QEvent *event, QObject *receiver, QPostEven
Q_ASSERT(receiver);
Q_ASSERT(postedEvents);
-#ifdef Q_OS_WIN
+ int receiverPostedEvents = receiver->d_func()->postedEvents.loadRelaxed();
// compress posted timers to this object.
- if (event->type() == QEvent::Timer && receiver->d_func()->postedEvents > 0) {
- int timerId = ((QTimerEvent *) event)->timerId();
- for (int i=0; i<postedEvents->size(); ++i) {
- const QPostEvent &e = postedEvents->at(i);
- if (e.receiver == receiver && e.event && e.event->type() == QEvent::Timer
- && ((QTimerEvent *) e.event)->timerId() == timerId) {
+ if (event->type() == QEvent::Timer && receiverPostedEvents > 0) {
+ int timerId = static_cast<QTimerEvent *>(event)->timerId();
+ auto sameReceiver = [receiver](const QPostEvent &e) { return e.receiver == receiver; };
+ auto it = std::find_if(postedEvents->cbegin(), postedEvents->cend(), sameReceiver);
+ while (receiverPostedEvents > 0 && it != postedEvents->cend()) {
+ if (it->event && it->event->type() == QEvent::Timer
+ && static_cast<QTimerEvent *>(it->event)->timerId() == timerId) {
delete event;
return true;
}
- }
- return false;
- }
-#endif
- if (event->type() == QEvent::DeferredDelete) {
- if (receiver->d_ptr->deleteLaterCalled) {
- // there was a previous DeferredDelete event, so we can drop the new one
- delete event;
- return true;
+ if (--receiverPostedEvents)
+ it = std::find_if(it + 1, postedEvents->cend(), sameReceiver);
}
- // deleteLaterCalled is set to true in postedEvents when queueing the very first
- // deferred deletion event.
return false;
}
- if (event->type() == QEvent::Quit && receiver->d_func()->postedEvents > 0) {
- for (int i = 0; i < postedEvents->size(); ++i) {
- const QPostEvent &cur = postedEvents->at(i);
+ if (event->type() == QEvent::Quit && receiverPostedEvents > 0) {
+ for (const QPostEvent &cur : std::as_const(*postedEvents)) {
if (cur.receiver != receiver
|| cur.event == nullptr
|| cur.event->type() != event->type())
@@ -1710,7 +1795,7 @@ void QCoreApplicationPrivate::sendPostedEvents(QObject *receiver, int event_type
event_type = 0;
}
- if (receiver && receiver->d_func()->threadData != data) {
+ if (receiver && receiver->d_func()->threadData.loadRelaxed() != data) {
qWarning("QCoreApplication::sendPostedEvents: Cannot send "
"posted events for objects in another thread");
return;
@@ -1734,8 +1819,8 @@ void QCoreApplicationPrivate::sendPostedEvents(QObject *receiver, int event_type
// okay. here is the tricky loop. be careful about optimizing
// this, it looks the way it does for good reasons.
- int startOffset = data->postEventList.startOffset;
- int &i = (!event_type && !receiver) ? data->postEventList.startOffset : startOffset;
+ qsizetype startOffset = data->postEventList.startOffset;
+ qsizetype &i = (!event_type && !receiver) ? data->postEventList.startOffset : startOffset;
data->postEventList.insertionOffset = data->postEventList.size();
// Exception-safe cleaning up without the need for a try/catch block
@@ -1794,14 +1879,37 @@ void QCoreApplicationPrivate::sendPostedEvents(QObject *receiver, int event_type
// events posted by the current event loop; or
// 3) if the event was posted before the outermost event loop.
- int eventLevel = static_cast<QDeferredDeleteEvent *>(pe.event)->loopLevel();
- int loopLevel = data->loopLevel + data->scopeLevel;
- const bool allowDeferredDelete =
- (eventLevel > loopLevel
- || (!eventLevel && loopLevel > 0)
- || (event_type == QEvent::DeferredDelete
- && eventLevel == loopLevel));
+ const auto *event = static_cast<QDeferredDeleteEvent *>(pe.event);
+ qCDebug(lcDeleteLater) << "Processing deferred delete event for" << pe.receiver
+ << "with loop level" << event->loopLevel() << "and scope level" << event->scopeLevel();
+
+ qCDebug(lcDeleteLater) << "Checking" << data->thread << "with loop level"
+ << data->loopLevel << "and scope level" << data->scopeLevel;
+
+ bool allowDeferredDelete = false;
+ if (event->loopLevel() == 0 && data->loopLevel > 0) {
+ qCDebug(lcDeleteLater) << "Event was posted outside outermost event loop"
+ << "and current thread has an event loop running.";
+ allowDeferredDelete = true;
+ } else {
+ const int totalEventLevel = event->loopLevel() + event->scopeLevel();
+ const int totalThreadLevel = data->loopLevel + data->scopeLevel;
+
+ if (totalEventLevel > totalThreadLevel) {
+ qCDebug(lcDeleteLater) << "Combined levels of event" << totalEventLevel
+ << "is higher than thread" << totalThreadLevel;
+ allowDeferredDelete = true;
+ } else if (event_type == QEvent::DeferredDelete && totalEventLevel == totalThreadLevel) {
+ qCDebug(lcDeleteLater) << "Explicit send of DeferredDelete and"
+ << "levels of event" << totalEventLevel
+ << "is same as thread" << totalThreadLevel;
+ allowDeferredDelete = true;
+ }
+ }
+
if (!allowDeferredDelete) {
+ qCDebug(lcDeleteLater) << "Failed conditions for deferred delete. Deferring again";
+
// cannot send deferred delete
if (!event_type && !receiver) {
// we must copy it first; we want to re-post the event
@@ -1818,6 +1926,8 @@ void QCoreApplicationPrivate::sendPostedEvents(QObject *receiver, int event_type
data->postEventList.addEvent(pe_copy);
}
continue;
+ } else {
+ qCDebug(lcDeleteLater) << "Sending deferred delete to" << pe.receiver;
}
}
@@ -1884,10 +1994,10 @@ void QCoreApplication::removePostedEvents(QObject *receiver, int eventType)
//we will collect all the posted events for the QObject
//and we'll delete after the mutex was unlocked
QVarLengthArray<QEvent*> events;
- int n = data->postEventList.size();
- int j = 0;
+ qsizetype n = data->postEventList.size();
+ qsizetype j = 0;
- for (int i = 0; i < n; ++i) {
+ for (qsizetype i = 0; i < n; ++i) {
const QPostEvent &pe = data->postEventList.at(i);
if ((!receiver || pe.receiver == receiver)
@@ -1945,8 +2055,7 @@ void QCoreApplicationPrivate::removePostedEvent(QEvent * event)
#endif
}
- for (int i = 0; i < data->postEventList.size(); ++i) {
- const QPostEvent & pe = data->postEventList.at(i);
+ for (const QPostEvent &pe : std::as_const(data->postEventList)) {
if (pe.event == event) {
#ifndef QT_NO_DEBUG
qWarning("QCoreApplication::removePostedEvent: Event of type %d deleted while posted to %s %s",
@@ -1993,7 +2102,13 @@ bool QCoreApplicationPrivate::canQuitAutomatically()
if (!in_exec)
return false;
- if (quitLockEnabled && quitLockRef.loadRelaxed())
+ // The automatic quit functionality is triggered by
+ // both QEventLoopLocker and maybeLastWindowClosed.
+ // In either case, we don't want to quit if there
+ // are active QEventLoopLockers, even if quitLockEnabled
+ // is not enabled, as the property signals whether to
+ // trigger the automatic quit, not whether to block it.
+ if (quitLockRef.loadRelaxed())
return false;
return true;
@@ -2081,6 +2196,12 @@ void QCoreApplicationPrivate::quit()
last-second cleanup. Note that no user interaction is possible in
this state.
+ \note At this point the main event loop is still running, but will
+ not process further events on return except QEvent::DeferredDelete
+ events for objects deleted via deleteLater(). If event processing is
+ needed, use a nested event loop or call QCoreApplication::processEvents()
+ manually.
+
\sa quit()
*/
@@ -2104,12 +2225,15 @@ void QCoreApplicationPrivate::quit()
to all toplevel widgets, where a reimplementation of changeEvent can
re-translate the user interface by passing user-visible strings via the
tr() function to the respective property setters. User-interface classes
- generated by Qt Designer provide a \c retranslateUi() function that can be
+ generated by \QD provide a \c retranslateUi() function that can be
called.
The function returns \c true on success and false on failure.
- \sa removeTranslator(), translate(), QTranslator::load(), {Dynamic Translation}
+ \note QCoreApplication does \e not take ownership of \a translationFile.
+
+ \sa removeTranslator(), translate(), QTranslator::load(),
+ {Writing Source Code for Translation#Prepare for Dynamic Language Changes}{Prepare for Dynamic Language Changes}
*/
bool QCoreApplication::installTranslator(QTranslator *translationFile)
@@ -2172,26 +2296,26 @@ bool QCoreApplication::removeTranslator(QTranslator *translationFile)
static void replacePercentN(QString *result, int n)
{
if (n >= 0) {
- int percentPos = 0;
- int len = 0;
- while ((percentPos = result->indexOf(QLatin1Char('%'), percentPos + len)) != -1) {
+ qsizetype percentPos = 0;
+ qsizetype len = 0;
+ while ((percentPos = result->indexOf(u'%', percentPos + len)) != -1) {
len = 1;
- if (percentPos + len == result->length())
+ if (percentPos + len == result->size())
break;
QString fmt;
- if (result->at(percentPos + len) == QLatin1Char('L')) {
+ if (result->at(percentPos + len) == u'L') {
++len;
- if (percentPos + len == result->length())
+ if (percentPos + len == result->size())
break;
- fmt = QLatin1String("%L1");
+ fmt = "%L1"_L1;
} else {
- fmt = QLatin1String("%1");
+ fmt = "%1"_L1;
}
- if (result->at(percentPos + len) == QLatin1Char('n')) {
+ if (result->at(percentPos + len) == u'n') {
fmt = fmt.arg(n);
++len;
result->replace(percentPos, len, fmt);
- len = fmt.length();
+ len = fmt.size();
}
}
}
@@ -2227,7 +2351,8 @@ static void replacePercentN(QString *result, int n)
This function is not virtual. You can use alternative translation
techniques by subclassing \l QTranslator.
- \sa QObject::tr(), installTranslator(), removeTranslator(), translate()
+ \sa QObject::tr(), installTranslator(), removeTranslator(),
+ {Internationalization and Translations}
*/
QString QCoreApplication::translate(const char *context, const char *sourceText,
const char *disambiguation, int n)
@@ -2283,7 +2408,7 @@ QString QCoreApplication::translate(const char *context, const char *sourceText,
Q_UNUSED(disambiguation);
QString ret = QString::fromUtf8(sourceText);
if (n >= 0)
- ret.replace(QLatin1String("%n"), QString::number(n));
+ ret.replace("%n"_L1, QString::number(n));
return ret;
}
@@ -2385,10 +2510,10 @@ QString QCoreApplication::applicationFilePath()
if (d->argc) {
static QByteArray procName = QByteArray(d->argv[0]);
- if (procName != d->argv[0]) {
+ if (procName != QByteArrayView(d->argv[0])) {
// clear the cache if the procname changes, so we reprocess it.
QCoreApplicationPrivate::clearApplicationFilePath();
- procName = QByteArray(d->argv[0]);
+ procName.assign(d->argv[0]);
}
}
@@ -2399,13 +2524,13 @@ QString QCoreApplication::applicationFilePath()
if (absPath.isEmpty() && !arguments().isEmpty()) {
QString argv0 = QFile::decodeName(arguments().at(0).toLocal8Bit());
- if (!argv0.isEmpty() && argv0.at(0) == QLatin1Char('/')) {
+ if (!argv0.isEmpty() && argv0.at(0) == u'/') {
/*
If argv0 starts with a slash, it is already an absolute
file path.
*/
absPath = argv0;
- } else if (argv0.contains(QLatin1Char('/'))) {
+ } else if (argv0.contains(u'/')) {
/*
If argv0 contains one or more slashes, it is a file path
relative to the current directory.
@@ -2532,7 +2657,7 @@ QStringList QCoreApplication::arguments()
\brief the name of the organization that wrote this application
The value is used by the QSettings class when it is constructed
- using the empty constructor. This saves having to repeat this
+ using the default constructor. This saves having to repeat this
information each time a QSettings object is created.
On Mac, QSettings uses \l {QCoreApplication::}{organizationDomain()} as the organization
@@ -2572,7 +2697,7 @@ QString QCoreApplication::organizationName()
\brief the Internet domain of the organization that wrote this application
The value is used by the QSettings class when it is constructed
- using the empty constructor. This saves having to repeat this
+ using the default constructor. This saves having to repeat this
information each time a QSettings object is created.
On Mac, QSettings uses organizationDomain() as the organization
@@ -2608,11 +2733,15 @@ QString QCoreApplication::organizationDomain()
\property QCoreApplication::applicationName
\brief the name of this application
- The value is used by the QSettings class when it is constructed
- using the empty constructor. This saves having to repeat this
- information each time a QSettings object is created.
+ The application name is used in various Qt classes and modules,
+ most prominently in \l{QSettings} when it is constructed using the default constructor.
+ Other uses are in formatted logging output (see \l{qSetMessagePattern()}),
+ in output by \l{QCommandLineParser}, in \l{QTemporaryDir} and \l{QTemporaryFile}
+ default paths, and in some file locations of \l{QStandardPaths}.
+ \l{Qt D-Bus}, \l{Accessibility}, and the XCB platform integration make use
+ of the application name, too.
- If not set, the application name defaults to the executable name (since 5.0).
+ If not set, the application name defaults to the executable name.
\sa organizationName, organizationDomain, applicationVersion, applicationFilePath()
*/
@@ -2695,6 +2824,155 @@ QString QCoreApplication::applicationVersion()
return coreappdata() ? coreappdata()->applicationVersion : QString();
}
+#if QT_CONFIG(permissions) || defined(Q_QDOC)
+
+/*!
+ Checks the status of the given \a permission
+
+ If the result is Qt::PermissionStatus::Undetermined then permission should be
+ requested via requestPermission() to determine the user's intent.
+
+ \since 6.5
+ \sa requestPermission(), {Application Permissions}
+*/
+Qt::PermissionStatus QCoreApplication::checkPermission(const QPermission &permission)
+{
+ return QPermissions::Private::checkPermission(permission);
+}
+
+/*!
+ \fn template <typename Functor> void QCoreApplication::requestPermission(
+ const QPermission &permission, Functor &&functor)
+
+ Requests the given \a permission.
+
+ \include permissions.qdocinc requestPermission-functor
+
+ The \a functor can be a free-standing or static member function:
+
+ \code
+ qApp->requestPermission(QCameraPermission{}, &permissionUpdated);
+ \endcode
+
+ or a lambda:
+
+ \code
+ qApp->requestPermission(QCameraPermission{}, [](const QPermission &permission) {
+ });
+ \endcode
+
+ \include permissions.qdocinc requestPermission-postamble
+
+ \since 6.5
+ \sa checkPermission(), {Application Permissions}
+*/
+
+/*!
+ \fn template<typename Functor> void QCoreApplication::requestPermission(
+ const QPermission &permission, const QObject *context,
+ Functor functor)
+
+ Requests the given \a permission, in the context of \a context.
+
+ \include permissions.qdocinc requestPermission-functor
+
+ The \a functor can be a free-standing or static member function:
+
+ \code
+ qApp->requestPermission(QCameraPermission{}, context, &permissionUpdated);
+ \endcode
+
+ a lambda:
+
+ \code
+ qApp->requestPermission(QCameraPermission{}, context, [](const QPermission &permission) {
+ });
+ \endcode
+
+ or a slot in the \a context object:
+
+ \code
+ qApp->requestPermission(QCameraPermission{}, this, &CamerWidget::permissionUpdated);
+ \endcode
+
+ The \a functor will be called in the thread of the \a context object. If
+ \a context is destroyed before the request completes, the \a functor will
+ not be called.
+
+ \include permissions.qdocinc requestPermission-postamble
+
+ \since 6.5
+ \overload
+ \sa checkPermission(), {Application Permissions}
+*/
+
+/*!
+ \internal
+
+ Called by the various requestPermission overloads to perform the request.
+
+ Calls the functor encapsulated in the \a slotObjRaw in the given \a context
+ (which may be \c nullptr).
+*/
+void QCoreApplication::requestPermission(const QPermission &requestedPermission,
+ QtPrivate::QSlotObjectBase *slotObjRaw, const QObject *context)
+{
+ QtPrivate::SlotObjUniquePtr slotObj{slotObjRaw}; // adopts
+ Q_ASSERT(slotObj);
+
+ if (QThread::currentThread() != QCoreApplicationPrivate::mainThread()) {
+ qWarning(lcPermissions, "Permissions can only be requested from the GUI (main) thread");
+ return;
+ }
+
+ class PermissionReceiver : public QObject
+ {
+ public:
+ explicit PermissionReceiver(QtPrivate::SlotObjUniquePtr &&slotObject, const QObject *context)
+ : slotObject(std::move(slotObject)), context(context ? context : this)
+ {
+ Q_ASSERT(this->context);
+ moveToThread(this->context->thread());
+ }
+
+ void finalizePermissionRequest(const QPermission &permission)
+ {
+ Q_ASSERT(slotObject);
+ // only execute if context object is still alive
+ if (context) {
+ void *args[] = { nullptr, const_cast<QPermission *>(&permission) };
+ slotObject->call(const_cast<QObject *>(context.data()), args);
+ }
+ deleteLater();
+ }
+
+ private:
+ QtPrivate::SlotObjSharedPtr slotObject;
+ QPointer<const QObject> context;
+ };
+
+ PermissionReceiver *receiver = new PermissionReceiver(std::move(slotObj), context);
+
+ QPermissions::Private::requestPermission(requestedPermission, [=](Qt::PermissionStatus status) {
+ if (status == Qt::PermissionStatus::Undetermined) {
+ Q_ASSERT_X(false, "QPermission",
+ "Internal error: requestPermission() should never return Undetermined");
+ status = Qt::PermissionStatus::Denied;
+ }
+
+ if (QCoreApplication::self) {
+ QPermission permission = requestedPermission;
+ permission.m_status = status;
+ QMetaObject::invokeMethod(receiver,
+ &PermissionReceiver::finalizePermissionRequest,
+ Qt::QueuedConnection,
+ permission);
+ }
+ });
+}
+
+#endif // QT_CONFIG(permissions)
+
#if QT_CONFIG(library)
Q_GLOBAL_STATIC(QRecursiveMutex, libraryPathMutex)
@@ -2725,11 +3003,6 @@ Q_GLOBAL_STATIC(QRecursiveMutex, libraryPathMutex)
directory (and its existence) may change when the directory of
the application executable becomes known.
- If you want to iterate over the list, you can use the \l foreach
- pseudo-keyword:
-
- \snippet code/src_corelib_kernel_qcoreapplication.cpp 2
-
\sa setLibraryPaths(), addLibraryPath(), removeLibraryPath(), QLibrary,
{How to Create Qt Plugins}
*/
@@ -2764,9 +3037,6 @@ QStringList QCoreApplication::libraryPathsLocked()
}
};
setPathsFromEnv(qEnvironmentVariable("QT_PLUGIN_PATH"));
-#ifdef Q_OS_ANDROID
- setPathsFromEnv(qEnvironmentVariable("QT_BUNDLED_LIBS_PATH"));
-#endif
#ifdef Q_OS_DARWIN
// Check the main bundle's PlugIns directory as this is a standard location for Apple OSes.
// Note that the QLibraryInfo::PluginsPath below will coincidentally be the same as this value
@@ -2862,14 +3132,14 @@ void QCoreApplication::addLibraryPath(const QString &path)
QMutexLocker locker(libraryPathMutex());
- QStringList *libpaths = coreappdata()->manual_libpaths.data();
+ QStringList *libpaths = coreappdata()->manual_libpaths.get();
if (libpaths) {
if (libpaths->contains(canonicalPath))
return;
} else {
// make sure that library paths are initialized
libraryPathsLocked();
- QStringList *app_libpaths = coreappdata()->app_libpaths.data();
+ QStringList *app_libpaths = coreappdata()->app_libpaths.get();
if (app_libpaths->contains(canonicalPath))
return;
@@ -2901,14 +3171,14 @@ void QCoreApplication::removeLibraryPath(const QString &path)
QMutexLocker locker(libraryPathMutex());
- QStringList *libpaths = coreappdata()->manual_libpaths.data();
+ QStringList *libpaths = coreappdata()->manual_libpaths.get();
if (libpaths) {
if (libpaths->removeAll(canonicalPath) == 0)
return;
} else {
// make sure that library paths is initialized
libraryPathsLocked();
- QStringList *app_libpaths = coreappdata()->app_libpaths.data();
+ QStringList *app_libpaths = coreappdata()->app_libpaths.get();
if (!app_libpaths->contains(canonicalPath))
return;
diff --git a/src/corelib/kernel/qcoreapplication.h b/src/corelib/kernel/qcoreapplication.h
index a3ef59f379..0078dc3295 100644
--- a/src/corelib/kernel/qcoreapplication.h
+++ b/src/corelib/kernel/qcoreapplication.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QCOREAPPLICATION_H
#define QCOREAPPLICATION_H
@@ -44,6 +8,7 @@
#include <QtCore/qstring.h>
#ifndef QT_NO_QOBJECT
#include <QtCore/qcoreevent.h>
+#include <QtCore/qdeadlinetimer.h>
#include <QtCore/qeventloop.h>
#include <QtCore/qobject.h>
#else
@@ -68,6 +33,11 @@ class QTranslator;
class QPostEventList;
class QAbstractEventDispatcher;
class QAbstractNativeEventFilter;
+class QEventLoopLocker;
+
+#if QT_CONFIG(permissions) || defined(Q_QDOC)
+class QPermission;
+#endif
#define qApp QCoreApplication::instance()
@@ -90,6 +60,11 @@ class Q_CORE_EXPORT QCoreApplication
#endif
Q_DECLARE_PRIVATE(QCoreApplication)
+ friend class QEventLoopLocker;
+#if QT_CONFIG(permissions)
+ using RequestPermissionPrototype = void(*)(QPermission);
+#endif
+
public:
enum { ApplicationFlags = QT_VERSION
};
@@ -119,12 +94,13 @@ public:
static void setSetuidAllowed(bool allow);
static bool isSetuidAllowed();
- static QCoreApplication *instance() { return self; }
+ static QCoreApplication *instance() noexcept { return self; }
#ifndef QT_NO_QOBJECT
static int exec();
static void processEvents(QEventLoop::ProcessEventsFlags flags = QEventLoop::AllEvents);
static void processEvents(QEventLoop::ProcessEventsFlags flags, int maxtime);
+ static void processEvents(QEventLoop::ProcessEventsFlags flags, QDeadlineTimer deadline);
static bool sendEvent(QObject *receiver, QEvent *event);
static void postEvent(QObject *receiver, QEvent *event, int priority = Qt::NormalEventPriority);
@@ -143,6 +119,53 @@ public:
static QString applicationFilePath();
static qint64 applicationPid() Q_DECL_CONST_FUNCTION;
+#if QT_CONFIG(permissions) || defined(Q_QDOC)
+ Qt::PermissionStatus checkPermission(const QPermission &permission);
+
+# ifdef Q_QDOC
+ template <typename Functor>
+ void requestPermission(const QPermission &permission, const QObject *context, Functor functor);
+# else
+ // requestPermission with context or receiver object; need to require here that receiver is the
+ // right type to avoid ambiguity with the private implementation function.
+ template <typename Functor,
+ std::enable_if_t<
+ QtPrivate::AreFunctionsCompatible<RequestPermissionPrototype, Functor>::value,
+ bool> = true>
+ void requestPermission(const QPermission &permission,
+ const typename QtPrivate::ContextTypeForFunctor<Functor>::ContextType *receiver,
+ Functor &&func)
+ {
+ requestPermission(permission,
+ QtPrivate::makeCallableObject<RequestPermissionPrototype>(std::forward<Functor>(func)),
+ receiver);
+ }
+# endif // Q_QDOC
+
+#ifndef QT_NO_CONTEXTLESS_CONNECT
+ #ifdef Q_QDOC
+ template <typename Functor>
+ #else
+ // requestPermission to a functor or function pointer (without context)
+ template <typename Functor,
+ std::enable_if_t<
+ QtPrivate::AreFunctionsCompatible<RequestPermissionPrototype, Functor>::value,
+ bool> = true>
+ #endif
+ void requestPermission(const QPermission &permission, Functor &&func)
+ {
+ requestPermission(permission, nullptr, std::forward<Functor>(func));
+ }
+#endif // QT_NO_CONTEXTLESS_CONNECT
+
+private:
+ // ### Qt 7: rename to requestPermissionImpl to avoid ambiguity
+ void requestPermission(const QPermission &permission,
+ QtPrivate::QSlotObjectBase *slotObj, const QObject *context);
+public:
+
+#endif // QT_CONFIG(permission)
+
#if QT_CONFIG(library)
static void setLibraryPaths(const QStringList &);
static QStringList libraryPaths();
diff --git a/src/corelib/kernel/qcoreapplication_mac.cpp b/src/corelib/kernel/qcoreapplication_mac.cpp
index 6820d565c6..af047fe8cd 100644
--- a/src/corelib/kernel/qcoreapplication_mac.cpp
+++ b/src/corelib/kernel/qcoreapplication_mac.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qcoreapplication.h"
#include "private/qcoreapplication_p.h"
diff --git a/src/corelib/kernel/qcoreapplication_p.h b/src/corelib/kernel/qcoreapplication_p.h
index 1c3891927d..bfd65d2c9a 100644
--- a/src/corelib/kernel/qcoreapplication_p.h
+++ b/src/corelib/kernel/qcoreapplication_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QCOREAPPLICATION_P_H
#define QCOREAPPLICATION_P_H
@@ -55,11 +19,13 @@
#if QT_CONFIG(commandlineparser)
#include "QtCore/qcommandlineoption.h"
#endif
+#include "QtCore/qreadwritelock.h"
#include "QtCore/qtranslator.h"
#if QT_CONFIG(settings)
#include "QtCore/qsettings.h"
#endif
#ifndef QT_NO_QOBJECT
+#include <qloggingcategory.h>
#include "private/qobject_p.h"
#include "private/qlocking_p.h"
#endif
@@ -70,6 +36,10 @@
QT_BEGIN_NAMESPACE
+#ifndef QT_NO_QOBJECT
+Q_DECLARE_LOGGING_CATEGORY(lcDeleteLater)
+#endif
+
typedef QList<QTranslator*> QTranslatorList;
class QAbstractEventDispatcher;
@@ -91,7 +61,7 @@ public:
Gui
};
- QCoreApplicationPrivate(int &aargc, char **aargv, uint flags);
+ QCoreApplicationPrivate(int &aargc, char **aargv);
// If not inheriting from QObjectPrivate: force this class to be polymorphic
#ifdef QT_NO_QOBJECT
@@ -108,6 +78,7 @@ public:
static QString infoDictionaryStringProperty(const QString &propertyName);
#endif
+ void initConsole();
static void initLocale();
static bool checkInstance(const char *method);
@@ -137,6 +108,7 @@ public:
virtual void quit();
static QBasicAtomicPointer<QThread> theMainThread;
+ static QBasicAtomicPointer<void> theMainThreadId;
static QThread *mainThread();
static bool threadRequiresCoreApplication();
@@ -160,6 +132,7 @@ public:
#if defined(Q_OS_WIN)
int origArgc;
char **origArgv; // store unmodified arguments for QCoreApplication::arguments()
+ bool consoleAllocated = false;
#endif
void appendApplicationPathToLibraryPaths(void);
@@ -191,7 +164,6 @@ public:
static bool setuidAllowed;
static uint attribs;
static inline bool testAttribute(uint flag) { return attribs & (1 << flag); }
- static int app_compile_version;
void processCommandLineArguments();
QString qmljs_debug_arguments; // a string containing arguments for js/qml debugging.
diff --git a/src/corelib/kernel/qcoreapplication_platform.h b/src/corelib/kernel/qcoreapplication_platform.h
index 53376340fc..d5f266179e 100644
--- a/src/corelib/kernel/qcoreapplication_platform.h
+++ b/src/corelib/kernel/qcoreapplication_platform.h
@@ -1,55 +1,29 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QCOREAPPLICATION_PLATFORM_H
#define QCOREAPPLICATION_PLATFORM_H
+//
+// W A R N I N G
+// -------------
+//
+// This file is part of the native interface APIs. Usage of
+// this API may make your code source and binary incompatible
+// with future versions of Qt.
+//
+
#include <QtCore/qglobal.h>
#include <QtCore/qnativeinterface.h>
#include <QtCore/qcoreapplication.h>
-#if defined(Q_OS_ANDROID) || defined(Q_CLANG_QDOC)
+#if defined(Q_OS_ANDROID) || defined(Q_QDOC)
+#include <QtCore/qjnitypes.h>
#if QT_CONFIG(future) && !defined(QT_NO_QOBJECT)
#include <QtCore/qfuture.h>
#include <QtCore/qvariant.h>
#endif
-#endif // #if defined(Q_OS_ANDROID) || defined(Q_CLANG_QDOC)
+#endif // #if defined(Q_OS_ANDROID) || defined(Q_QDOC)
#if defined(Q_OS_ANDROID)
class _jobject;
@@ -58,13 +32,21 @@ typedef _jobject* jobject;
QT_BEGIN_NAMESPACE
+#if defined(Q_OS_ANDROID)
+Q_DECLARE_JNI_CLASS(Context, "android/content/Context")
+#endif
+
namespace QNativeInterface
{
-#if defined(Q_OS_ANDROID) || defined(Q_CLANG_QDOC)
+#if defined(Q_OS_ANDROID) || defined(Q_QDOC)
struct Q_CORE_EXPORT QAndroidApplication
{
QT_DECLARE_NATIVE_INTERFACE(QAndroidApplication, 1, QCoreApplication)
- static jobject context();
+#ifdef Q_QDOC
+ static QJniObject context();
+#else
+ static QtJniTypes::Context context();
+#endif
static bool isActivityContext();
static int sdkVersion();
static void hideSplashScreen(int duration = 0);
diff --git a/src/corelib/kernel/qcoreapplication_win.cpp b/src/corelib/kernel/qcoreapplication_win.cpp
index 628313fbac..3a69bec25b 100644
--- a/src/corelib/kernel/qcoreapplication_win.cpp
+++ b/src/corelib/kernel/qcoreapplication_win.cpp
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 Samuel Gaist <samuel.gaist@edeltech.ch>
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2013 Samuel Gaist <samuel.gaist@edeltech.ch>
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qcoreapplication.h"
#include "qcoreapplication_p.h"
@@ -49,12 +13,15 @@
#include <private/qlocking_p.h>
#endif
#include "qtextstream.h"
+#include "qvarlengtharray.h"
#include <ctype.h>
#include <qt_windows.h>
QT_BEGIN_NAMESPACE
-Q_CORE_EXPORT QString qAppFileName() // get application file name
+using namespace Qt::StringLiterals;
+
+QString qAppFileName() // get application file name
{
/*
GetModuleFileName() returns the length of the module name, when it has
@@ -171,8 +138,8 @@ static QString flagsValue(const QWinMessageMapping<IntType> *haystack,
for (auto p = haystack, end = haystack + haystackSize; p < end; ++p) {
if ((p->value & value) == p->value) {
if (!result.isEmpty())
- result += QLatin1String(" | ");
- result += QLatin1String(p->name);
+ result += " | "_L1;
+ result += QLatin1StringView(p->name);
}
}
return result;
@@ -663,8 +630,8 @@ QString decodeMSG(const MSG& msg)
// decoded message, since some of the common messages are quite long, and
// we don't want the decoded information to vary in output position
if (message.size() < 20)
- message.prepend(QString(20 - message.size(), QLatin1Char(' ')));
- message += QLatin1String(": ");
+ message.prepend(QString(20 - message.size(), u' '));
+ message += ": "_L1;
const QString hwndS = QString::asprintf("(%p)", reinterpret_cast<void *>(msg.hwnd));
const QString wParamS = QString::asprintf("(%p)", reinterpret_cast<void *>(wParam));
@@ -674,11 +641,11 @@ QString decodeMSG(const MSG& msg)
switch (msg.message) {
case WM_ACTIVATE:
if (const char *a = activateParameter(uint(wParam)))
- parameters += QLatin1String(a);
- parameters += QLatin1String(" Hwnd ") + hwndS;
+ parameters += QLatin1StringView(a);
+ parameters += " Hwnd "_L1 + hwndS;
break;
case WM_CAPTURECHANGED:
- parameters = QLatin1String("Hwnd gaining capture ") + hwndS;
+ parameters = "Hwnd gaining capture "_L1 + hwndS;
break;
case WM_CREATE:
{
@@ -703,7 +670,7 @@ QString decodeMSG(const MSG& msg)
}
break;
case WM_DESTROY:
- parameters = QLatin1String("Destroy hwnd ") + hwndS;
+ parameters = "Destroy hwnd "_L1 + hwndS;
break;
case 0x02E0u: { // WM_DPICHANGED
auto rect = reinterpret_cast<const RECT *>(lParam);
@@ -714,20 +681,20 @@ QString decodeMSG(const MSG& msg)
break;
case WM_IME_NOTIFY:
{
- parameters = QLatin1String("Command(");
+ parameters = "Command("_L1;
if (const char *c = imeCommand(uint(wParam)))
- parameters += QLatin1String(c);
- parameters += QLatin1String(" : ") + lParamS;
+ parameters += QLatin1StringView(c);
+ parameters += " : "_L1 + lParamS;
}
break;
case WM_IME_SETCONTEXT:
- parameters = QLatin1String("Input context(")
- + QLatin1String(wParam == TRUE ? "Active" : "Inactive")
- + QLatin1String(") Show flags(")
- + imeShowFlags(DWORD(lParam)) + QLatin1Char(')');
+ parameters = "Input context("_L1
+ + (wParam ? "Active"_L1 : "Inactive"_L1)
+ + ") Show flags("_L1
+ + imeShowFlags(DWORD(lParam)) + u')';
break;
case WM_KILLFOCUS:
- parameters = QLatin1String("Hwnd gaining keyboard focus ") + wParamS;
+ parameters = "Hwnd gaining keyboard focus "_L1 + wParamS;
break;
case WM_CHAR:
case WM_IME_CHAR:
@@ -750,7 +717,7 @@ QString decodeMSG(const MSG& msg)
parameters = QStringLiteral("Keyboard layout changed");
break;
case WM_NCACTIVATE:
- parameters = (msg.wParam? QLatin1String("Active Titlebar") : QLatin1String("Inactive Titlebar"));
+ parameters = (msg.wParam? "Active Titlebar"_L1 : "Inactive Titlebar"_L1);
break;
case WM_MOUSEACTIVATE:
{
@@ -777,37 +744,37 @@ QString decodeMSG(const MSG& msg)
case WM_MOUSEMOVE:
parameters = QString::asprintf("x,y(%4d,%4d) Virtual Keys(",
GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))
- + virtualKeys(uint(wParam)) + QLatin1Char(')');
+ + virtualKeys(uint(wParam)) + u')';
break;
case WM_MOVE:
parameters = QString::asprintf("x,y(%4d,%4d)", LOWORD(lParam), HIWORD(lParam));
break;
case WM_ERASEBKGND:
case WM_PAINT:
- parameters = QLatin1String("hdc") + wParamS;
+ parameters = "hdc"_L1 + wParamS;
break;
case WM_QUERYNEWPALETTE:
break; // lParam & wParam are unused
case WM_SETCURSOR:
parameters = QString::asprintf("HitTestCode(0x%x) MouseMsg(", LOWORD(lParam));
if (const char *mouseMsg = findWMstr(HIWORD(lParam)))
- parameters += QLatin1String(mouseMsg);
- parameters += QLatin1Char(')');
+ parameters += QLatin1StringView(mouseMsg);
+ parameters += u')';
break;
case WM_SETFOCUS:
- parameters = QLatin1String("Lost Focus ") + wParamS;
+ parameters = "Lost Focus "_L1 + wParamS;
break;
case WM_SETTEXT:
- parameters = QLatin1String("Set Text (")
+ parameters = "Set Text ("_L1
+ QString::fromWCharArray(reinterpret_cast<const wchar_t *>(lParam))
- + QLatin1Char(')');
+ + u')';
break;
case WM_SIZE:
parameters = QString::asprintf("w,h(%4d,%4d) showmode(",
LOWORD(lParam), HIWORD(lParam));
if (const char *showMode = wmSizeParam(uint(wParam)))
- parameters += QLatin1String(showMode);
- parameters += QLatin1Char(')');
+ parameters += QLatin1StringView(showMode);
+ parameters += u')';
break;
case WM_WINDOWPOSCHANGED:
{
@@ -819,23 +786,23 @@ QString decodeMSG(const MSG& msg)
winPos->x, winPos->y, winPos->cx, winPos->cy,
winPosFlags(winPos->flags).toLatin1().constData());
if (const char *h = winPosInsertAfter(insertAfter))
- parameters += QLatin1String(h);
+ parameters += QLatin1StringView(h);
else
parameters += QString::number(insertAfter, 16);
- parameters += QLatin1Char(')');
+ parameters += u')';
}
break;
case WM_QUERYENDSESSION:
- parameters = QLatin1String("End session: ");
+ parameters = "End session: "_L1;
if (const char *logoffOption = sessionMgrLogOffOption(uint(wParam)))
- parameters += QLatin1String(logoffOption);
+ parameters += QLatin1StringView(logoffOption);
break;
default:
- parameters = QLatin1String("wParam") + wParamS + QLatin1String(" lParam") + lParamS;
+ parameters = "wParam"_L1 + wParamS + " lParam"_L1 + lParamS;
break;
}
- return message + QLatin1String("hwnd") + hwndS + QLatin1Char(' ') + parameters;
+ return message + "hwnd"_L1 + hwndS + u' ' + parameters;
}
QDebug operator<<(QDebug dbg, const MSG &msg)
diff --git a/src/corelib/kernel/qcorecmdlineargs_p.h b/src/corelib/kernel/qcorecmdlineargs_p.h
index 849d72901d..2b8d9763f6 100644
--- a/src/corelib/kernel/qcorecmdlineargs_p.h
+++ b/src/corelib/kernel/qcorecmdlineargs_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QCORECMDLINEARGS_P_H
#define QCORECMDLINEARGS_P_H
diff --git a/src/corelib/kernel/qcoreevent.cpp b/src/corelib/kernel/qcoreevent.cpp
index 85b5d2457e..9c99530268 100644
--- a/src/corelib/kernel/qcoreevent.cpp
+++ b/src/corelib/kernel/qcoreevent.cpp
@@ -1,44 +1,9 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2022 The Qt Company Ltd.
+// Copyright (C) 2016 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qcoreevent.h"
+#include "qcoreevent_p.h"
#include "qcoreapplication.h"
#include "qcoreapplication_p.h"
@@ -50,6 +15,9 @@
QT_BEGIN_NAMESPACE
+Q_TRACE_POINT(qtcore, QEvent_ctor, QEvent *event, QEvent::Type type);
+Q_TRACE_POINT(qtcore, QEvent_dtor, QEvent *event, QEvent::Type type);
+
/*!
\class QEvent
\inmodule QtCore
@@ -111,6 +79,8 @@ QT_BEGIN_NAMESPACE
\value ChildAdded An object gets a child (QChildEvent).
\value ChildPolished A widget child gets polished (QChildEvent).
\value ChildRemoved An object loses a child (QChildEvent).
+ \value [since 6.7] ChildWindowAdded A child window was added to the window.
+ \value [since 6.7] ChildWindowRemoved A child window was removed from the window.
\value Clipboard The clipboard contents have changed.
\value Close Widget was closed (QCloseEvent).
\value CloseSoftwareInputPanel A widget wants to close the software input panel (SIP).
@@ -118,6 +88,8 @@ QT_BEGIN_NAMESPACE
\value ContextMenu Context popup menu (QContextMenuEvent).
\value CursorChange The widget's cursor has changed.
\value DeferredDelete The object will be deleted after it has cleaned up (QDeferredDeleteEvent)
+ \value [since 6.6] DevicePixelRatioChange
+ The devicePixelRatio has changed for this widget's or window's underlying backing store.
\value DragEnter The cursor enters a widget during a drag and drop operation (QDragEnterEvent).
\value DragLeave The cursor leaves a widget during a drag and drop operation (QDragLeaveEvent).
\value DragMove A drag and drop operation is in progress (QDragMoveEvent).
@@ -190,8 +162,12 @@ QT_BEGIN_NAMESPACE
\value OrientationChange The screens orientation has changes (QScreenOrientationChangeEvent).
\value Paint Screen update necessary (QPaintEvent).
\value PaletteChange Palette of the widget changed.
- \value ParentAboutToChange The widget parent is about to change.
- \value ParentChange The widget parent has changed.
+ \value ParentAboutToChange The object parent is about to change.
+ Only sent to some object types, such as QWidget.
+ \value ParentChange The object parent has changed.
+ Only sent to some object types, such as QWidget.
+ \value [since 6.7] ParentWindowAboutToChange The parent window is about to change.
+ \value [since 6.7] ParentWindowChange The parent window has changed.
\value PlatformPanel A platform specific panel has been requested.
\value PlatformSurface A native platform surface has been created or is about to be destroyed (QPlatformSurfaceEvent).
\omitvalue Pointer
@@ -199,7 +175,7 @@ QT_BEGIN_NAMESPACE
\value PolishRequest The widget should be polished.
\value QueryWhatsThis The widget should accept the event if it has "What's This?" help (QHelpEvent).
\value Quit The application has exited.
- \value ReadOnlyChange Widget's read-only state has changed (since Qt 5.4).
+ \value [since 5.4] ReadOnlyChange Widget's read-only state has changed.
\value RequestSoftwareInputPanel A widget wants to open a software input panel (SIP).
\value Resize Widget's size changed (QResizeEvent).
\value ScrollPrepare The object needs to fill in its geometry information (QScrollPrepareEvent).
@@ -226,7 +202,7 @@ QT_BEGIN_NAMESPACE
\omitvalue OkRequest
\value TabletEnterProximity Wacom tablet enter proximity event (QTabletEvent), sent to QApplication.
\value TabletLeaveProximity Wacom tablet leave proximity event (QTabletEvent), sent to QApplication.
- \value TabletTrackingChange The Wacom tablet tracking state has changed (since Qt 5.9).
+ \value [since 5.9] TabletTrackingChange The Wacom tablet tracking state has changed.
\omitvalue ThemeChange
\value ThreadChange The object is moved to another thread. This is the last event sent to this object in the previous thread. See QObject::moveToThread().
\value Timer Regular timer events (QTimerEvent).
@@ -290,6 +266,7 @@ QT_BEGIN_NAMESPACE
\omitvalue NativeGesture
\omitvalue WindowChangeInternal
\omitvalue ScreenChangeInternal
+ \omitvalue WindowAboutToChangeInternal
*/
/*!
@@ -299,7 +276,7 @@ QEvent::QEvent(Type type)
: t(type), m_reserved(0),
m_inputEvent(false), m_pointerEvent(false), m_singlePointEvent(false)
{
- Q_TRACE(QEvent_ctor, this, t);
+ Q_TRACE(QEvent_ctor, this, type);
}
/*!
@@ -456,13 +433,16 @@ struct QBasicAtomicBitField {
QBasicAtomicInteger<uint> next;
QBasicAtomicInteger<uint> data[NumInts];
+ constexpr QBasicAtomicBitField() = default;
+
bool allocateSpecific(int which) noexcept
{
QBasicAtomicInteger<uint> &entry = data[which / BitsPerInt];
const uint old = entry.loadRelaxed();
const uint bit = 1U << (which % BitsPerInt);
- return !(old & bit) // wasn't taken
- && entry.testAndSetRelaxed(old, old | bit); // still wasn't taken
+ if (old & bit)
+ return false; // already taken
+ return (entry.fetchAndOrRelaxed(bit) & bit) == 0;
// don't update 'next' here - it's unlikely that it will need
// to be updated, in the general case, and having 'next'
@@ -496,7 +476,7 @@ struct QBasicAtomicBitField {
typedef QBasicAtomicBitField<QEvent::MaxUser - QEvent::User + 1> UserEventTypeRegistry;
-static UserEventTypeRegistry userEventTypeRegistry;
+Q_CONSTINIT static UserEventTypeRegistry userEventTypeRegistry {};
static inline int registerEventTypeZeroBased(int id) noexcept
{
@@ -539,12 +519,12 @@ int QEvent::registerEventType(int hint) noexcept
started one or more timers. Each timer has a unique identifier. A
timer is started with QObject::startTimer().
- The QTimer class provides a high-level programming interface that
+ The QChronoTimer class provides a high-level programming interface that
uses signals instead of events. It also provides single-shot timers.
The event handler QObject::timerEvent() receives timer events.
- \sa QTimer, QObject::timerEvent(), QObject::startTimer(),
+ \sa QChronoTimer, QObject::timerEvent(), QObject::startTimer(),
QObject::killTimer()
*/
@@ -556,12 +536,7 @@ QTimerEvent::QTimerEvent(int timerId)
: QEvent(Timer), id(timerId)
{}
-/*!
- \internal
-*/
-QTimerEvent::~QTimerEvent()
-{
-}
+Q_IMPL_EVENT_COMMON(QTimerEvent)
/*!
\fn int QTimerEvent::timerId() const
@@ -603,12 +578,7 @@ QChildEvent::QChildEvent(Type type, QObject *child)
: QEvent(type), c(child)
{}
-/*!
- \internal
-*/
-QChildEvent::~QChildEvent()
-{
-}
+Q_IMPL_EVENT_COMMON(QChildEvent)
/*!
\fn QObject *QChildEvent::child() const
@@ -660,12 +630,7 @@ QDynamicPropertyChangeEvent::QDynamicPropertyChangeEvent(const QByteArray &name)
{
}
-/*!
- \internal
-*/
-QDynamicPropertyChangeEvent::~QDynamicPropertyChangeEvent()
-{
-}
+Q_IMPL_EVENT_COMMON(QDynamicPropertyChangeEvent)
/*!
\fn QByteArray QDynamicPropertyChangeEvent::propertyName() const
@@ -677,26 +642,13 @@ QDynamicPropertyChangeEvent::~QDynamicPropertyChangeEvent()
*/
/*!
- Constructs a deferred delete event with an initial loopLevel() of zero.
-*/
-QDeferredDeleteEvent::QDeferredDeleteEvent()
- : QEvent(QEvent::DeferredDelete)
- , level(0)
-{ }
-
-/*!
- \internal
+ Constructs a deferred delete event with the given loop and scope level.
*/
-QDeferredDeleteEvent::~QDeferredDeleteEvent()
+QDeferredDeleteEvent::QDeferredDeleteEvent(int loopLevel, int scopeLevel)
+ : QEvent(QEvent::DeferredDelete), m_loopLevel(loopLevel), m_scopeLevel(scopeLevel)
{ }
-/*! \fn int QDeferredDeleteEvent::loopLevel() const
-
- Returns the loop-level in which the event was posted. The
- loop-level is set by QCoreApplication::postEvent().
-
- \sa QObject::deleteLater()
-*/
+Q_IMPL_EVENT_COMMON(QDeferredDeleteEvent)
QT_END_NAMESPACE
diff --git a/src/corelib/kernel/qcoreevent.h b/src/corelib/kernel/qcoreevent.h
index 780b84f98d..a65dbee7da 100644
--- a/src/corelib/kernel/qcoreevent.h
+++ b/src/corelib/kernel/qcoreevent.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QCOREEVENT_H
#define QCOREEVENT_H
@@ -53,6 +17,29 @@ protected: \
Class &operator=(const Class &other) = default; \
Class &operator=(Class &&) = delete
+#define Q_DECL_EVENT_COMMON(Class) \
+ protected: \
+ Class(const Class &); \
+ Class(Class &&) = delete; \
+ Class &operator=(const Class &other) = default; \
+ Class &operator=(Class &&) = delete; \
+ public: \
+ Class* clone() const override; \
+ ~Class() override; \
+ private:
+
+#define Q_IMPL_EVENT_COMMON(Class) \
+ Class::Class(const Class &) = default; \
+ Class::~Class() = default; \
+ Class* Class::clone() const \
+ { \
+ auto c = new Class(*this); \
+ [[maybe_unused]] QEvent *e = c; \
+ /* check that covariant return is safe to add */ \
+ Q_ASSERT(reinterpret_cast<quintptr>(c) == reinterpret_cast<quintptr>(e)); \
+ return c; \
+ }
+
class QEventPrivate;
class Q_CORE_EXPORT QEvent // event base class
{
@@ -90,7 +77,7 @@ public:
Hide = 18, // widget is hidden
Close = 19, // request to close widget
Quit = 20, // request to quit application
- ParentChange = 21, // widget has been reparented
+ ParentChange = 21, // object has been reparented
ParentAboutToChange = 131, // sent just before the parent change is done
ThreadChange = 22, // object has changed threads
WindowActivate = 24, // window was activated
@@ -285,7 +272,7 @@ public:
StyleAnimationUpdate = 213, // style animation target should be updated
ApplicationStateChange = 214,
- WindowChangeInternal = 215, // internal for QQuickWidget
+ WindowChangeInternal = 215, // internal for QQuickWidget and texture-based widgets
ScreenChangeInternal = 216,
PlatformSurface = 217, // Platform surface created or about to be destroyed
@@ -294,6 +281,16 @@ public:
TabletTrackingChange = 219, // tablet tracking state has changed
+ // GraphicsSceneLeave = 220,
+ WindowAboutToChangeInternal = 221, // internal for QQuickWidget and texture-based widgets
+
+ DevicePixelRatioChange = 222,
+
+ ChildWindowAdded = 223,
+ ChildWindowRemoved = 224,
+ ParentWindowAboutToChange = 225,
+ ParentWindowChange = 226,
+
// 512 reserved for Qt Jambi's MetaCall event
// 513 reserved for Qt Jambi's DeleteOnMainThread event
@@ -357,6 +354,8 @@ private:
friend class QApplication;
friend class QGraphicsScenePrivate;
// from QtTest:
+ // QtWebEngine event handling requires forwarding events as spontaneous.
+ // Impersonated QSpontaneKeyEvent in QtWebEngine to handle such cases.
friend class QSpontaneKeyEvent;
// needs this:
Q_ALWAYS_INLINE
@@ -365,14 +364,11 @@ private:
class Q_CORE_EXPORT QTimerEvent : public QEvent
{
- Q_EVENT_DISABLE_COPY(QTimerEvent);
+ Q_DECL_EVENT_COMMON(QTimerEvent)
public:
explicit QTimerEvent(int timerId);
- ~QTimerEvent();
int timerId() const { return id; }
- QTimerEvent *clone() const override { return new QTimerEvent(*this); };
-
protected:
int id;
};
@@ -381,51 +377,31 @@ class QObject;
class Q_CORE_EXPORT QChildEvent : public QEvent
{
- Q_EVENT_DISABLE_COPY(QChildEvent);
+ Q_DECL_EVENT_COMMON(QChildEvent)
public:
QChildEvent(Type type, QObject *child);
- ~QChildEvent();
+
QObject *child() const { return c; }
bool added() const { return type() == ChildAdded; }
bool polished() const { return type() == ChildPolished; }
bool removed() const { return type() == ChildRemoved; }
- QChildEvent *clone() const override { return new QChildEvent(*this); };
-
protected:
QObject *c;
};
class Q_CORE_EXPORT QDynamicPropertyChangeEvent : public QEvent
{
- Q_EVENT_DISABLE_COPY(QDynamicPropertyChangeEvent);
+ Q_DECL_EVENT_COMMON(QDynamicPropertyChangeEvent)
public:
explicit QDynamicPropertyChangeEvent(const QByteArray &name);
- ~QDynamicPropertyChangeEvent();
inline QByteArray propertyName() const { return n; }
- QDynamicPropertyChangeEvent *clone() const override { return new QDynamicPropertyChangeEvent(*this); };
-
private:
QByteArray n;
};
-class Q_CORE_EXPORT QDeferredDeleteEvent : public QEvent
-{
- Q_EVENT_DISABLE_COPY(QDeferredDeleteEvent);
-public:
- explicit QDeferredDeleteEvent();
- ~QDeferredDeleteEvent();
- int loopLevel() const { return level; }
-
- QDeferredDeleteEvent *clone() const override { return new QDeferredDeleteEvent(*this); };
-
-private:
- int level;
- friend class QCoreApplication;
-};
-
QT_END_NAMESPACE
#endif // QCOREEVENT_H
diff --git a/src/corelib/kernel/qcoreevent_p.h b/src/corelib/kernel/qcoreevent_p.h
new file mode 100644
index 0000000000..ac90baad9b
--- /dev/null
+++ b/src/corelib/kernel/qcoreevent_p.h
@@ -0,0 +1,39 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QCOREEVENT_P_H
+#define QCOREEVENT_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include "QtCore/qcoreevent.h"
+
+QT_BEGIN_NAMESPACE
+
+class QCoreApplication;
+
+class QDeferredDeleteEvent : public QEvent
+{
+ Q_DECL_EVENT_COMMON(QDeferredDeleteEvent)
+public:
+ explicit QDeferredDeleteEvent(int loopLevel, int scopeLevel);
+ int loopLevel() const { return m_loopLevel; }
+ int scopeLevel() const { return m_scopeLevel; }
+
+private:
+ int m_loopLevel = 0;
+ int m_scopeLevel = 0;
+};
+
+QT_END_NAMESPACE
+
+#endif // QCOREEVENT_P_H
diff --git a/src/corelib/kernel/qcoreglobaldata.cpp b/src/corelib/kernel/qcoreglobaldata.cpp
deleted file mode 100644
index 4df5a40e39..0000000000
--- a/src/corelib/kernel/qcoreglobaldata.cpp
+++ /dev/null
@@ -1,59 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qcoreglobaldata_p.h"
-
-QT_BEGIN_NAMESPACE
-
-Q_GLOBAL_STATIC(QCoreGlobalData, globalInstance)
-
-QCoreGlobalData::QCoreGlobalData()
-{
-}
-
-QCoreGlobalData::~QCoreGlobalData()
-{
-}
-
-QCoreGlobalData *QCoreGlobalData::instance()
-{
- return globalInstance();
-}
-
-QT_END_NAMESPACE
diff --git a/src/corelib/kernel/qcoreglobaldata_p.h b/src/corelib/kernel/qcoreglobaldata_p.h
deleted file mode 100644
index 4403c2ebdd..0000000000
--- a/src/corelib/kernel/qcoreglobaldata_p.h
+++ /dev/null
@@ -1,75 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QCOREGLOBALDATA_P_H
-#define QCOREGLOBALDATA_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include <QtCore/private/qglobal_p.h>
-#include "QtCore/qstringlist.h"
-#include "QtCore/qreadwritelock.h"
-#include "QtCore/qhash.h"
-#include "QtCore/qbytearray.h"
-#include "QtCore/qmutex.h"
-
-QT_BEGIN_NAMESPACE
-
-struct QCoreGlobalData
-{
- QCoreGlobalData();
- ~QCoreGlobalData();
-
- QHash<QString, QStringList> dirSearchPaths;
- QReadWriteLock dirSearchPathsLock;
-
- static QCoreGlobalData *instance();
-};
-
-QT_END_NAMESPACE
-#endif // QCOREGLOBALDATA_P_H
diff --git a/src/corelib/kernel/qdeadlinetimer.cpp b/src/corelib/kernel/qdeadlinetimer.cpp
index 20b2107d55..f99e68f990 100644
--- a/src/corelib/kernel/qdeadlinetimer.cpp
+++ b/src/corelib/kernel/qdeadlinetimer.cpp
@@ -1,332 +1,47 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qdeadlinetimer.h"
-#include "qdeadlinetimer_p.h"
#include "private/qnumeric_p.h"
QT_BEGIN_NAMESPACE
-namespace {
- class TimeReference
- {
- enum : unsigned {
- umega = 1000 * 1000,
- ugiga = umega * 1000
- };
-
- enum : qint64 {
- kilo = 1000,
- mega = kilo * 1000,
- giga = mega * 1000
- };
-
- public:
- enum RoundingStrategy {
- RoundDown,
- RoundUp,
- RoundDefault = RoundDown
- };
-
- static constexpr qint64 Min = std::numeric_limits<qint64>::min();
- static constexpr qint64 Max = std::numeric_limits<qint64>::max();
-
- inline TimeReference(qint64 = 0, unsigned = 0);
- inline void updateTimer(qint64 &, unsigned &);
-
- inline bool addNanoseconds(qint64);
- inline bool addMilliseconds(qint64);
- bool addSecsAndNSecs(qint64, qint64);
-
- inline bool subtract(const qint64, const unsigned);
-
- inline bool toMilliseconds(qint64 *, RoundingStrategy = RoundDefault) const;
- inline bool toNanoseconds(qint64 *) const;
-
- inline void saturate(bool toMax);
- static bool sign(qint64, qint64);
-
- private:
- bool adjust(const qint64, const unsigned, qint64 = 0);
-
- private:
- qint64 secs;
- unsigned nsecs;
- };
-}
+QT_IMPL_METATYPE_EXTERN(QDeadlineTimer)
-inline TimeReference::TimeReference(qint64 t1, unsigned t2)
- : secs(t1), nsecs(t2)
-{
-}
+using namespace std::chrono;
-inline void TimeReference::updateTimer(qint64 &t1, unsigned &t2)
-{
- t1 = secs;
- t2 = nsecs;
-}
-
-inline void TimeReference::saturate(bool toMax)
-{
- secs = toMax ? Max : Min;
-}
-
-/*!
- * \internal
- *
- * Determines the sign of a (seconds, nanoseconds) pair
- * for differentiating overflow from underflow. It doesn't
- * deal with equality as it shouldn't ever be called in that case.
- *
- * Returns true if the pair represents a positive time offset
- * false otherwise.
- */
-bool TimeReference::sign(qint64 secs, qint64 nsecs)
-{
- if (secs > 0) {
- if (nsecs > 0)
- return true;
- } else {
- if (nsecs < 0)
- return false;
- }
-
- // They are different in sign
- secs += nsecs / giga;
- if (secs > 0)
- return true;
- else if (secs < 0)
- return false;
-
- // We should never get over|underflow out of
- // the case: secs * giga == -nsecs
- // So the sign of nsecs is the deciding factor
- Q_ASSERT(nsecs % giga != 0);
- return nsecs > 0;
-}
-
-#if defined(Q_OS_UNIX) && !defined(Q_OS_DARWIN)
-inline bool TimeReference::addNanoseconds(qint64 arg)
-{
- return addSecsAndNSecs(arg / giga, arg % giga);
-}
-
-inline bool TimeReference::addMilliseconds(qint64 arg)
+namespace {
+struct TimeReference : std::numeric_limits<qint64>
{
- return addSecsAndNSecs(arg / kilo, (arg % kilo) * mega);
+ static constexpr qint64 Min = min();
+ static constexpr qint64 Max = max();
+};
}
-/*!
- * \internal
- *
- * Adds \a t1 addSecs seconds and \a addNSecs nanoseconds to the
- * time reference. The arguments are normalized to seconds (qint64)
- * and nanoseconds (unsigned) before the actual calculation is
- * delegated to adjust(). If the nanoseconds are negative the
- * owed second used for the normalization is passed on to adjust()
- * as third argument.
- *
- * Returns true if operation was successful, false on over|underflow
- */
-bool TimeReference::addSecsAndNSecs(qint64 addSecs, qint64 addNSecs)
+template <typename Duration1, typename... Durations>
+static qint64 add_saturate(qint64 t1, Duration1 dur, Durations... extra)
{
- // Normalize the arguments
- if (qAbs(addNSecs) >= giga) {
- if (add_overflow<qint64>(addSecs, addNSecs / giga, &addSecs))
- return false;
-
- addNSecs %= giga;
- }
+ qint64 v = dur.count();
+ qint64 saturated = std::numeric_limits<qint64>::max();
+ if (v < 0)
+ saturated = std::numeric_limits<qint64>::min();
- if (addNSecs < 0)
- return adjust(addSecs, ugiga - unsigned(-addNSecs), -1);
+ // convert to nanoseconds with saturation
+ using Ratio = std::ratio_divide<typename Duration1::period, nanoseconds::period>;
+ static_assert(Ratio::den == 1, "sub-multiples of nanosecond are not supported");
+ if (qMulOverflow<Ratio::num>(v, &v))
+ return saturated;
- return adjust(addSecs, unsigned(addNSecs));
-}
-
-/*!
- * \internal
- *
- * Adds \a t1 seconds and \a t2 nanoseconds to the internal members.
- * Takes into account the additional \a carrySeconds we may owe or need to carry over.
- *
- * Returns true if operation was successful, false on over|underflow
- */
-bool TimeReference::adjust(const qint64 t1, const unsigned t2, qint64 carrySeconds)
-{
- static_assert(QDeadlineTimerNanosecondsInT2);
- nsecs += t2;
- if (nsecs >= ugiga) {
- nsecs -= ugiga;
- carrySeconds++;
+ qint64 r;
+ if (qAddOverflow(t1, v, &r))
+ return saturated;
+ if constexpr (sizeof...(Durations)) {
+ // chain more additions
+ return add_saturate(r, extra...);
}
-
- // We don't worry about the order of addition, because the result returned by
- // callers of this function is unchanged regardless of us over|underflowing.
- // If we do, we do so by no more than a second, thus saturating the timer to
- // Forever has the same effect as if we did the arithmetic exactly and salvaged
- // the overflow.
- return !add_overflow<qint64>(secs, t1, &secs) && !add_overflow<qint64>(secs, carrySeconds, &secs);
-}
-
-/*!
- * \internal
- *
- * Subtracts \a t1 seconds and \a t2 nanoseconds from the time reference.
- * When normalizing the nanoseconds to a positive number the owed seconds is
- * passed as third argument to adjust() as the seconds may over|underflow
- * if we do the calculation directly. There is little sense to check the
- * seconds for over|underflow here in case we are going to need to carry
- * over a second _after_ we add the nanoseconds.
- *
- * Returns true if operation was successful, false on over|underflow
- */
-inline bool TimeReference::subtract(const qint64 t1, const unsigned t2)
-{
- Q_ASSERT(t2 < ugiga);
- return adjust(-t1, ugiga - t2, -1);
-}
-
-/*!
- * \internal
- *
- * Converts the time reference to milliseconds.
- *
- * Checks are done without making use of mul_overflow because it may
- * not be implemented on some 32bit platforms.
- *
- * Returns true if operation was successful, false on over|underflow
- */
-inline bool TimeReference::toMilliseconds(qint64 *result, RoundingStrategy rounding) const
-{
- static constexpr qint64 maxSeconds = Max / kilo;
- static constexpr qint64 minSeconds = Min / kilo;
- if (secs > maxSeconds || secs < minSeconds)
- return false;
-
- unsigned ns = rounding == RoundDown ? nsecs : nsecs + umega - 1;
-
- return !add_overflow<qint64>(secs * kilo, ns / umega, result);
-}
-
-/*!
- * \internal
- *
- * Converts the time reference to nanoseconds.
- *
- * Checks are done without making use of mul_overflow because it may
- * not be implemented on some 32bit platforms.
- *
- * Returns true if operation was successful, false on over|underflow
- */
-inline bool TimeReference::toNanoseconds(qint64 *result) const
-{
- static constexpr qint64 maxSeconds = Max / giga;
- static constexpr qint64 minSeconds = Min / giga;
- if (secs > maxSeconds || secs < minSeconds)
- return false;
-
- return !add_overflow<qint64>(secs * giga, nsecs, result);
-}
-#else
-inline bool TimeReference::addNanoseconds(qint64 arg)
-{
- return adjust(arg, 0);
-}
-
-inline bool TimeReference::addMilliseconds(qint64 arg)
-{
- static constexpr qint64 maxMilliseconds = Max / mega;
- if (qAbs(arg) > maxMilliseconds)
- return false;
-
- return addNanoseconds(arg * mega);
-}
-
-inline bool TimeReference::addSecsAndNSecs(qint64 addSecs, qint64 addNSecs)
-{
- static constexpr qint64 maxSeconds = Max / giga;
- static constexpr qint64 minSeconds = Min / giga;
- if (addSecs > maxSeconds || addSecs < minSeconds || add_overflow<qint64>(addSecs * giga, addNSecs, &addNSecs))
- return false;
-
- return addNanoseconds(addNSecs);
-}
-
-inline bool TimeReference::adjust(const qint64 t1, const unsigned t2, qint64 carrySeconds)
-{
- static_assert(!QDeadlineTimerNanosecondsInT2);
- Q_UNUSED(t2);
- Q_UNUSED(carrySeconds);
-
- return !add_overflow<qint64>(secs, t1, &secs);
-}
-
-inline bool TimeReference::subtract(const qint64 t1, const unsigned t2)
-{
- Q_UNUSED(t2);
-
- return addNanoseconds(-t1);
+ return r;
}
-inline bool TimeReference::toMilliseconds(qint64 *result, RoundingStrategy rounding) const
-{
- // Force QDeadlineTimer to treat the border cases as
- // over|underflow and saturate the results returned to the user.
- // We don't want to get valid milliseconds out of saturated timers.
- if (secs == Max || secs == Min)
- return false;
-
- *result = secs / mega;
- if (rounding == RoundUp && secs > *result * mega)
- (*result)++;
-
- return true;
-}
-
-inline bool TimeReference::toNanoseconds(qint64 *result) const
-{
- *result = secs;
- return true;
-}
-#endif
-
/*!
\class QDeadlineTimer
\inmodule QtCore
@@ -336,6 +51,8 @@ inline bool TimeReference::toNanoseconds(qint64 *result) const
\reentrant
\ingroup tools
+ \compares strong
+
The QDeadlineTimer class is usually used to calculate future deadlines and
verify whether the deadline has expired. QDeadlineTimer can also be used
for deadlines without expiration ("forever"). It forms a counterpart to
@@ -369,11 +86,12 @@ inline bool TimeReference::toNanoseconds(qint64 *result) const
\section1 Timer types
- Like QTimer, QDeadlineTimer can select among different levels of coarseness
- on the timers. You can select precise timing by passing Qt::PreciseTimer to
- the functions that set of change the timer, or you can select coarse timing
- by passing Qt::CoarseTimer. Qt::VeryCoarseTimer is currently interpreted
- the same way as Qt::CoarseTimer.
+ Like QTimer and QChronoTimer, QDeadlineTimer can select among
+ different levels of coarseness on the timers. You can select
+ precise timing by passing Qt::PreciseTimer to the functions that
+ set of change the timer, or you can select coarse timing by passing
+ Qt::CoarseTimer. Qt::VeryCoarseTimer is currently interpreted the same
+ way as Qt::CoarseTimer.
This feature is dependent on support from the operating system: if the OS
does not support a coarse timer functionality, then QDeadlineTimer will
@@ -405,7 +123,7 @@ inline bool TimeReference::toNanoseconds(qint64 *result) const
\snippet code/src_corelib_kernel_qdeadlinetimer.cpp 2
- \sa QTime, QTimer, QDeadlineTimer, Qt::TimerType
+ \sa QTime, QChronoTimer, QDeadlineTimer, Qt::TimerType
*/
/*!
@@ -416,10 +134,12 @@ inline bool TimeReference::toNanoseconds(qint64 *result) const
*/
/*!
+ \fn QDeadlineTimer::QDeadlineTimer()
\fn QDeadlineTimer::QDeadlineTimer(Qt::TimerType timerType)
Constructs an expired QDeadlineTimer object. For this object,
- remainingTime() will return 0.
+ remainingTime() will return 0. If \a timerType is not set, then the object
+ will use the \l{Qt::CoarseTimer}{coarse} \l{QDeadlineTimer#Timer types}{timer type}.
The timer type \a timerType may be ignored, since the timer is already
expired. Similarly, for optimization purposes, this function will not
@@ -449,7 +169,7 @@ inline bool TimeReference::toNanoseconds(qint64 *result) const
from the moment of the creation of this object, if msecs is positive. If \a
msecs is zero, this QDeadlineTimer will be marked as expired, causing
remainingTime() to return zero and deadline() to return an indeterminate
- time point in the past. If \a msecs is -1, the timer will be set to never
+ time point in the past. If \a msecs is negative, the timer will be set to never
expire, causing remainingTime() to return -1 and deadline() to return the
maximum value.
@@ -462,10 +182,12 @@ inline bool TimeReference::toNanoseconds(qint64 *result) const
functionality is required, use QDeadlineTimer::current() and add time to
it.
+ \note Prior to Qt 6.6, the only value that caused the timer to never expire
+ was -1.
+
\sa hasExpired(), isForever(), remainingTime(), setRemainingTime()
*/
QDeadlineTimer::QDeadlineTimer(qint64 msecs, Qt::TimerType type) noexcept
- : t2(0)
{
setRemainingTime(msecs, type);
}
@@ -529,51 +251,70 @@ QDeadlineTimer::QDeadlineTimer(qint64 msecs, Qt::TimerType type) noexcept
/*!
Sets the remaining time for this QDeadlineTimer object to \a msecs
milliseconds from now, if \a msecs has a positive value. If \a msecs is
- zero, this QDeadlineTimer object will be marked as expired, whereas a value
- of -1 will set it to never expire.
+ zero, this QDeadlineTimer object will be marked as expired, whereas a
+ negative value will set it to never expire.
+
+ For optimization purposes, if \a msecs is zero, this function may skip
+ obtaining the current time and may instead use a value known to be in the
+ past. If that happens, deadline() may return an unexpected value and this
+ object cannot be used in calculation of how long it is overdue. If that
+ functionality is required, use QDeadlineTimer::current() and add time to
+ it.
The timer type for this QDeadlineTimer object will be set to the specified \a timerType.
+ \note Prior to Qt 6.6, the only value that caused the timer to never expire
+ was -1.
+
\sa setPreciseRemainingTime(), hasExpired(), isForever(), remainingTime()
*/
void QDeadlineTimer::setRemainingTime(qint64 msecs, Qt::TimerType timerType) noexcept
{
- if (msecs == -1) {
+ if (msecs < 0) {
*this = QDeadlineTimer(Forever, timerType);
- return;
+ } else if (msecs == 0) {
+ *this = QDeadlineTimer(timerType);
+ t1 = std::numeric_limits<qint64>::min();
+ } else {
+ *this = current(timerType);
+ milliseconds ms(msecs);
+ t1 = add_saturate(t1, ms);
}
-
- *this = current(timerType);
-
- TimeReference ref(t1, t2);
- if (!ref.addMilliseconds(msecs))
- ref.saturate(msecs > 0);
- ref.updateTimer(t1, t2);
}
/*!
Sets the remaining time for this QDeadlineTimer object to \a secs seconds
plus \a nsecs nanoseconds from now, if \a secs has a positive value. If \a
- secs is -1, this QDeadlineTimer will be set it to never expire. If both
- parameters are zero, this QDeadlineTimer will be marked as expired.
+ secs is negative, this QDeadlineTimer will be set it to never expire (this
+ behavior does not apply to \a nsecs). If both parameters are zero, this
+ QDeadlineTimer will be marked as expired.
+
+ For optimization purposes, if both \a secs and \a nsecs are zero, this
+ function may skip obtaining the current time and may instead use a value
+ known to be in the past. If that happens, deadline() may return an
+ unexpected value and this object cannot be used in calculation of how long
+ it is overdue. If that functionality is required, use
+ QDeadlineTimer::current() and add time to it.
The timer type for this QDeadlineTimer object will be set to the specified
\a timerType.
+ \note Prior to Qt 6.6, the only condition that caused the timer to never
+ expire was when \a secs was -1.
+
\sa setRemainingTime(), hasExpired(), isForever(), remainingTime()
*/
void QDeadlineTimer::setPreciseRemainingTime(qint64 secs, qint64 nsecs, Qt::TimerType timerType) noexcept
{
- if (secs == -1) {
+ if (secs < 0) {
*this = QDeadlineTimer(Forever, timerType);
- return;
+ } else if (secs == 0 && nsecs == 0) {
+ *this = QDeadlineTimer(timerType);
+ t1 = std::numeric_limits<qint64>::min();
+ } else {
+ *this = current(timerType);
+ t1 = add_saturate(t1, seconds{secs}, nanoseconds{nsecs});
}
-
- *this = current(timerType);
- TimeReference ref(t1, t2);
- if (!ref.addSecsAndNSecs(secs, nsecs))
- ref.saturate(TimeReference::sign(secs, nsecs));
- ref.updateTimer(t1, t2);
}
/*!
@@ -623,6 +364,8 @@ bool QDeadlineTimer::hasExpired() const noexcept
{
if (isForever())
return false;
+ if (t1 == std::numeric_limits<qint64>::min())
+ return true;
return *this <= current(timerType());
}
@@ -671,19 +414,8 @@ qint64 QDeadlineTimer::remainingTime() const noexcept
if (isForever())
return -1;
- QDeadlineTimer now = current(timerType());
- TimeReference ref(t1, t2);
-
- qint64 msecs;
- if (!ref.subtract(now.t1, now.t2))
- return 0; // We can only underflow here
-
- // If we fail the conversion, t1 < now.t1 means we underflowed,
- // thus the deadline had long expired
- if (!ref.toMilliseconds(&msecs, TimeReference::RoundUp))
- return t1 < now.t1 ? 0 : -1;
-
- return msecs < 0 ? 0 : msecs;
+ nanoseconds nsecs(remainingTimeNSecs());
+ return ceil<milliseconds>(nsecs).count();
}
/*!
@@ -705,23 +437,19 @@ qint64 QDeadlineTimer::remainingTimeNSecs() const noexcept
/*!
\internal
Same as remainingTimeNSecs, but may return negative remaining times. Does
- not deal with Forever. In case of underflow the result is saturated to
- the minimum possible value, on overflow - the maximum possible value.
+ not deal with Forever. In case of underflow, which is only possible if the
+ timer has expired, an arbitrary negative value is returned.
*/
qint64 QDeadlineTimer::rawRemainingTimeNSecs() const noexcept
{
- QDeadlineTimer now = current(timerType());
- TimeReference ref(t1, t2);
+ if (t1 == std::numeric_limits<qint64>::min())
+ return t1; // we'd saturate to this anyway
- qint64 nsecs;
- if (!ref.subtract(now.t1, now.t2))
- return TimeReference::Min; // We can only underflow here
-
- // If we fail the conversion, t1 < now.t1 means we underflowed,
- // thus the deadline had long expired
- if (!ref.toNanoseconds(&nsecs))
- return t1 < now.t1 ? TimeReference::Min : TimeReference::Max;
- return nsecs;
+ QDeadlineTimer now = current(timerType());
+ qint64 r;
+ if (qSubOverflow(t1, now.t1, &r))
+ return -1; // any negative number is fine
+ return r;
}
/*!
@@ -748,12 +476,11 @@ qint64 QDeadlineTimer::deadline() const noexcept
{
if (isForever())
return TimeReference::Max;
+ if (t1 == TimeReference::Min)
+ return t1;
- qint64 result;
- if (!TimeReference(t1, t2).toMilliseconds(&result))
- return t1 < 0 ? TimeReference::Min : TimeReference::Max;
-
- return result;
+ nanoseconds ns(t1);
+ return duration_cast<milliseconds>(ns).count();
}
/*!
@@ -782,11 +509,7 @@ qint64 QDeadlineTimer::deadlineNSecs() const noexcept
if (isForever())
return TimeReference::Max;
- qint64 result;
- if (!TimeReference(t1, t2).toNanoseconds(&result))
- return t1 < 0 ? TimeReference::Min : TimeReference::Max;
-
- return result;
+ return t1;
}
/*!
@@ -810,11 +533,7 @@ void QDeadlineTimer::setDeadline(qint64 msecs, Qt::TimerType timerType) noexcept
}
type = timerType;
-
- TimeReference ref;
- if (!ref.addMilliseconds(msecs))
- ref.saturate(msecs > 0);
- ref.updateTimer(t1, t2);
+ t1 = add_saturate(0, milliseconds{msecs});
}
/*!
@@ -832,13 +551,7 @@ void QDeadlineTimer::setDeadline(qint64 msecs, Qt::TimerType timerType) noexcept
void QDeadlineTimer::setPreciseDeadline(qint64 secs, qint64 nsecs, Qt::TimerType timerType) noexcept
{
type = timerType;
-
- // We don't pass the seconds to the constructor, because we don't know
- // at this point if t1 holds the seconds or nanoseconds; it's platform specific.
- TimeReference ref;
- if (!ref.addSecsAndNSecs(secs, nsecs))
- ref.saturate(TimeReference::sign(secs, nsecs));
- ref.updateTimer(t1, t2);
+ t1 = add_saturate(0, seconds{secs}, nanoseconds{nsecs});
}
/*!
@@ -854,11 +567,7 @@ QDeadlineTimer QDeadlineTimer::addNSecs(QDeadlineTimer dt, qint64 nsecs) noexcep
if (dt.isForever())
return dt;
- TimeReference ref(dt.t1, dt.t2);
- if (!ref.addNanoseconds(nsecs))
- ref.saturate(nsecs > 0);
- ref.updateTimer(dt.t1, dt.t2);
-
+ dt.t1 = add_saturate(dt.t1, nanoseconds{nsecs});
return dt;
}
@@ -871,11 +580,22 @@ QDeadlineTimer QDeadlineTimer::addNSecs(QDeadlineTimer dt, qint64 nsecs) noexcep
The QDeadlineTimer object will be constructed with the specified \a timerType.
*/
+QDeadlineTimer QDeadlineTimer::current(Qt::TimerType timerType) noexcept
+{
+ // ensure we get nanoseconds; this will work so long as steady_clock's
+ // time_point isn't of finer resolution (picoseconds)
+ std::chrono::nanoseconds ns = std::chrono::steady_clock::now().time_since_epoch();
+
+ QDeadlineTimer result;
+ result.t1 = ns.count();
+ result.type = timerType;
+ return result;
+}
/*!
- \fn bool QDeadlineTimer::operator==(QDeadlineTimer d1, QDeadlineTimer d2)
+ \fn bool QDeadlineTimer::operator==(const QDeadlineTimer &lhs, const QDeadlineTimer &rhs)
- Returns true if the deadline on \a d1 and the deadline in \a d2 are the
+ Returns true if the deadline on \a lhs and the deadline in \a rhs are the
same, false otherwise. The timer type used to create the two deadlines is
ignored. This function is equivalent to:
@@ -886,9 +606,9 @@ QDeadlineTimer QDeadlineTimer::addNSecs(QDeadlineTimer dt, qint64 nsecs) noexcep
*/
/*!
- \fn bool QDeadlineTimer::operator!=(QDeadlineTimer d1, QDeadlineTimer d2)
+ \fn bool QDeadlineTimer::operator!=(const QDeadlineTimer &lhs, const QDeadlineTimer &rhs)
- Returns true if the deadline on \a d1 and the deadline in \a d2 are
+ Returns true if the deadline on \a lhs and the deadline in \a rhs are
different, false otherwise. The timer type used to create the two deadlines
is ignored. This function is equivalent to:
@@ -899,10 +619,10 @@ QDeadlineTimer QDeadlineTimer::addNSecs(QDeadlineTimer dt, qint64 nsecs) noexcep
*/
/*!
- \fn bool QDeadlineTimer::operator<(QDeadlineTimer d1, QDeadlineTimer d2)
+ \fn bool QDeadlineTimer::operator<(const QDeadlineTimer &lhs, const QDeadlineTimer &rhs)
- Returns true if the deadline on \a d1 is earlier than the deadline in \a
- d2, false otherwise. The timer type used to create the two deadlines is
+ Returns true if the deadline on \a lhs is earlier than the deadline in \a
+ rhs, false otherwise. The timer type used to create the two deadlines is
ignored. This function is equivalent to:
\snippet code/src_corelib_kernel_qdeadlinetimer.cpp 10
@@ -912,10 +632,10 @@ QDeadlineTimer QDeadlineTimer::addNSecs(QDeadlineTimer dt, qint64 nsecs) noexcep
*/
/*!
- \fn bool QDeadlineTimer::operator<=(QDeadlineTimer d1, QDeadlineTimer d2)
+ \fn bool QDeadlineTimer::operator<=(const QDeadlineTimer &lhs, const QDeadlineTimer &rhs)
- Returns true if the deadline on \a d1 is earlier than or the same as the
- deadline in \a d2, false otherwise. The timer type used to create the two
+ Returns true if the deadline on \a lhs is earlier than or the same as the
+ deadline in \a rhs, false otherwise. The timer type used to create the two
deadlines is ignored. This function is equivalent to:
\snippet code/src_corelib_kernel_qdeadlinetimer.cpp 11
@@ -925,10 +645,10 @@ QDeadlineTimer QDeadlineTimer::addNSecs(QDeadlineTimer dt, qint64 nsecs) noexcep
*/
/*!
- \fn bool QDeadlineTimer::operator>(QDeadlineTimer d1, QDeadlineTimer d2)
+ \fn bool QDeadlineTimer::operator>(const QDeadlineTimer &lhs, const QDeadlineTimer &rhs)
- Returns true if the deadline on \a d1 is later than the deadline in \a
- d2, false otherwise. The timer type used to create the two deadlines is
+ Returns true if the deadline on \a lhs is later than the deadline in \a
+ rhs, false otherwise. The timer type used to create the two deadlines is
ignored. This function is equivalent to:
\snippet code/src_corelib_kernel_qdeadlinetimer.cpp 12
@@ -938,10 +658,10 @@ QDeadlineTimer QDeadlineTimer::addNSecs(QDeadlineTimer dt, qint64 nsecs) noexcep
*/
/*!
- \fn bool QDeadlineTimer::operator>=(QDeadlineTimer d1, QDeadlineTimer d2)
+ \fn bool QDeadlineTimer::operator>=(const QDeadlineTimer &lhs, const QDeadlineTimer &rhs)
- Returns true if the deadline on \a d1 is later than or the same as the
- deadline in \a d2, false otherwise. The timer type used to create the two
+ Returns true if the deadline on \a lhs is later than or the same as the
+ deadline in \a rhs, false otherwise. The timer type used to create the two
deadlines is ignored. This function is equivalent to:
\snippet code/src_corelib_kernel_qdeadlinetimer.cpp 13
@@ -965,11 +685,7 @@ QDeadlineTimer operator+(QDeadlineTimer dt, qint64 msecs)
if (dt.isForever())
return dt;
- TimeReference ref(dt.t1, dt.t2);
- if (!ref.addMilliseconds(msecs))
- ref.saturate(msecs > 0);
- ref.updateTimer(dt.t1, dt.t2);
-
+ dt.t1 = add_saturate(dt.t1, milliseconds{msecs});
return dt;
}
@@ -1035,11 +751,4 @@ QDeadlineTimer operator+(QDeadlineTimer dt, qint64 msecs)
Returns the time remaining before the deadline.
*/
-/*!
- \fn QPair<qint64, unsigned> QDeadlineTimer::_q_data() const
- \internal
-*/
-
-// the rest of the functions are in qelapsedtimer_xxx.cpp
-
QT_END_NAMESPACE
diff --git a/src/corelib/kernel/qdeadlinetimer.h b/src/corelib/kernel/qdeadlinetimer.h
index 08e80e448c..515cdb5387 100644
--- a/src/corelib/kernel/qdeadlinetimer.h
+++ b/src/corelib/kernel/qdeadlinetimer.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QDEADLINETIMER_H
#define QDEADLINETIMER_H
@@ -43,7 +7,6 @@
#include <QtCore/qelapsedtimer.h>
#include <QtCore/qmetatype.h>
#include <QtCore/qnamespace.h>
-#include <QtCore/qpair.h>
#ifdef max
// un-pollute the namespace. We need std::numeric_limits::max() and std::chrono::duration::max()
@@ -52,25 +15,25 @@
#include <limits>
-#if __has_include(<chrono>)
-# include <chrono>
-#endif
+#include <chrono>
QT_BEGIN_NAMESPACE
class Q_CORE_EXPORT QDeadlineTimer
{
public:
- enum ForeverConstant { Forever };
+ enum class ForeverConstant { Forever };
+ static constexpr ForeverConstant Forever = ForeverConstant::Forever;
- constexpr QDeadlineTimer(Qt::TimerType type_ = Qt::CoarseTimer) noexcept
- : t1(0), t2(0), type(type_) {}
+ constexpr QDeadlineTimer() noexcept = default;
+ constexpr explicit QDeadlineTimer(Qt::TimerType type_) noexcept
+ : type(type_) {}
constexpr QDeadlineTimer(ForeverConstant, Qt::TimerType type_ = Qt::CoarseTimer) noexcept
- : t1(std::numeric_limits<qint64>::max()), t2(0), type(type_) {}
+ : t1((std::numeric_limits<qint64>::max)()), type(type_) {}
explicit QDeadlineTimer(qint64 msecs, Qt::TimerType type = Qt::CoarseTimer) noexcept;
void swap(QDeadlineTimer &other) noexcept
- { qSwap(t1, other.t1); qSwap(t2, other.t2); qSwap(type, other.type); }
+ { std::swap(t1, other.t1); std::swap(type, other.type); }
constexpr bool isForever() const noexcept
{ return t1 == (std::numeric_limits<qint64>::max)(); }
@@ -95,19 +58,6 @@ public:
static QDeadlineTimer addNSecs(QDeadlineTimer dt, qint64 nsecs) noexcept Q_DECL_PURE_FUNCTION;
static QDeadlineTimer current(Qt::TimerType timerType = Qt::CoarseTimer) noexcept;
- friend bool operator==(QDeadlineTimer d1, QDeadlineTimer d2) noexcept
- { return d1.t1 == d2.t1 && d1.t2 == d2.t2; }
- friend bool operator!=(QDeadlineTimer d1, QDeadlineTimer d2) noexcept
- { return !(d1 == d2); }
- friend bool operator<(QDeadlineTimer d1, QDeadlineTimer d2) noexcept
- { return d1.t1 < d2.t1 || (d1.t1 == d2.t1 && d1.t2 < d2.t2); }
- friend bool operator<=(QDeadlineTimer d1, QDeadlineTimer d2) noexcept
- { return d1 == d2 || d1 < d2; }
- friend bool operator>(QDeadlineTimer d1, QDeadlineTimer d2) noexcept
- { return d2 < d1; }
- friend bool operator>=(QDeadlineTimer d1, QDeadlineTimer d2) noexcept
- { return !(d1 < d2); }
-
friend Q_CORE_EXPORT QDeadlineTimer operator+(QDeadlineTimer dt, qint64 msecs);
friend QDeadlineTimer operator+(qint64 msecs, QDeadlineTimer dt)
{ return dt + msecs; }
@@ -120,26 +70,20 @@ public:
QDeadlineTimer &operator-=(qint64 msecs)
{ *this = *this + (-msecs); return *this; }
-#if __has_include(<chrono>) || defined(Q_CLANG_QDOC)
- template <class Clock, class Duration>
+ template <class Clock, class Duration = typename Clock::duration>
QDeadlineTimer(std::chrono::time_point<Clock, Duration> deadline_,
Qt::TimerType type_ = Qt::CoarseTimer) : t2(0)
{ setDeadline(deadline_, type_); }
- template <class Clock, class Duration>
+ template <class Clock, class Duration = typename Clock::duration>
QDeadlineTimer &operator=(std::chrono::time_point<Clock, Duration> deadline_)
{ setDeadline(deadline_); return *this; }
- template <class Clock, class Duration>
- void setDeadline(std::chrono::time_point<Clock, Duration> deadline_,
- Qt::TimerType type_ = Qt::CoarseTimer)
- { setRemainingTime(deadline_ == deadline_.max() ? Duration::max() : deadline_ - Clock::now(), type_); }
+ template <class Clock, class Duration = typename Clock::duration>
+ void setDeadline(std::chrono::time_point<Clock, Duration> tp,
+ Qt::TimerType type_ = Qt::CoarseTimer);
template <class Clock, class Duration = typename Clock::duration>
- std::chrono::time_point<Clock, Duration> deadline() const
- {
- auto val = std::chrono::nanoseconds(rawRemainingTimeNSecs()) + Clock::now();
- return std::chrono::time_point_cast<Duration>(val);
- }
+ std::chrono::time_point<Clock, Duration> deadline() const;
template <class Rep, class Period>
QDeadlineTimer(std::chrono::duration<Rep, Period> remaining, Qt::TimerType type_ = Qt::CoarseTimer)
@@ -153,10 +97,11 @@ public:
template <class Rep, class Period>
void setRemainingTime(std::chrono::duration<Rep, Period> remaining, Qt::TimerType type_ = Qt::CoarseTimer)
{
+ using namespace std::chrono;
if (remaining == remaining.max())
*this = QDeadlineTimer(Forever, type_);
else
- setPreciseRemainingTime(0, std::chrono::nanoseconds(remaining).count(), type_);
+ setPreciseRemainingTime(0, ceil<nanoseconds>(remaining).count(), type_);
}
std::chrono::nanoseconds remainingTimeAsDuration() const noexcept
@@ -178,52 +123,62 @@ public:
template <class Rep, class Period>
friend QDeadlineTimer operator+=(QDeadlineTimer &dt, std::chrono::duration<Rep, Period> value)
{ return dt = dt + value; }
-#endif
private:
- qint64 t1;
- unsigned t2;
- unsigned type;
+ friend bool comparesEqual(const QDeadlineTimer &lhs,
+ const QDeadlineTimer &rhs) noexcept
+ {
+ return lhs.t1 == rhs.t1;
+ }
+ friend Qt::strong_ordering compareThreeWay(const QDeadlineTimer &lhs,
+ const QDeadlineTimer &rhs) noexcept
+ {
+ return Qt::compareThreeWay(lhs.t1, rhs.t1);
+ }
+ Q_DECLARE_STRONGLY_ORDERED(QDeadlineTimer)
- qint64 rawRemainingTimeNSecs() const noexcept;
+ qint64 t1 = 0;
+#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0)
+ unsigned t2 = 0;
+#endif
+ unsigned type = Qt::CoarseTimer;
-public:
- // This is not a public function, it's here only for Qt's internal convenience...
- QPair<qint64, unsigned> _q_data() const { return qMakePair(t1, t2); }
+ qint64 rawRemainingTimeNSecs() const noexcept;
};
-#if __has_include(<chrono>) && (defined(Q_OS_DARWIN) || defined(Q_OS_LINUX) || (defined(Q_CC_MSVC) && Q_CC_MSVC >= 1900))
-// We know for these OS/compilers that the std::chrono::steady_clock uses the same
-// reference time as QDeadlineTimer
-
-template <> inline std::chrono::steady_clock::time_point
-QDeadlineTimer::deadline<std::chrono::steady_clock, std::chrono::steady_clock::duration>() const
+template<class Clock, class Duration>
+std::chrono::time_point<Clock, Duration> QDeadlineTimer::deadline() const
{
- return std::chrono::steady_clock::time_point(std::chrono::nanoseconds(deadlineNSecs()));
+ using namespace std::chrono;
+ if constexpr (std::is_same_v<Clock, steady_clock>) {
+ auto val = duration_cast<Duration>(nanoseconds(deadlineNSecs()));
+ return time_point<Clock, Duration>(val);
+ } else {
+ auto val = nanoseconds(rawRemainingTimeNSecs()) + Clock::now();
+ return time_point_cast<Duration>(val);
+ }
}
-template <> inline void
-QDeadlineTimer::setDeadline<std::chrono::steady_clock, std::chrono::steady_clock::duration>(std::chrono::steady_clock::time_point tp, Qt::TimerType type_)
+template<class Clock, class Duration>
+void QDeadlineTimer::setDeadline(std::chrono::time_point<Clock, Duration> tp, Qt::TimerType type_)
{
using namespace std::chrono;
if (tp == tp.max()) {
*this = Forever;
type = type_;
- } else if (type_ != Qt::PreciseTimer) {
- // if we aren't using PreciseTimer, then we need to convert
- setPreciseRemainingTime(0, duration_cast<nanoseconds>(tp - steady_clock::now()).count(), type_);
- } else {
+ } else if constexpr (std::is_same_v<Clock, steady_clock>) {
setPreciseDeadline(0,
duration_cast<nanoseconds>(tp.time_since_epoch()).count(),
type_);
+ } else {
+ setPreciseRemainingTime(0, duration_cast<nanoseconds>(tp - Clock::now()).count(), type_);
}
}
-#endif
Q_DECLARE_SHARED(QDeadlineTimer)
QT_END_NAMESPACE
-Q_DECLARE_METATYPE(QDeadlineTimer)
+QT_DECL_METATYPE_EXTERN(QDeadlineTimer, Q_CORE_EXPORT)
#endif // QDEADLINETIMER_H
diff --git a/src/corelib/kernel/qdeadlinetimer_p.h b/src/corelib/kernel/qdeadlinetimer_p.h
deleted file mode 100644
index 46e12de6c1..0000000000
--- a/src/corelib/kernel/qdeadlinetimer_p.h
+++ /dev/null
@@ -1,70 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QDEADLINETIMER_P_H
-#define QDEADLINETIMER_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include <QtCore/qglobal.h>
-
-QT_BEGIN_NAMESPACE
-
-enum {
-#if defined(Q_OS_UNIX) && !defined(Q_OS_DARWIN)
- // t1 contains seconds and t2 contains nanoseconds
- QDeadlineTimerNanosecondsInT2 = 1
-#else
- // t1 contains nanoseconds, t2 is always zero
- QDeadlineTimerNanosecondsInT2 = 0
-#endif
-};
-
-QT_END_NAMESPACE
-
-#endif
diff --git a/src/corelib/kernel/qelapsedtimer.cpp b/src/corelib/kernel/qelapsedtimer.cpp
index af26a523c0..511b81a04e 100644
--- a/src/corelib/kernel/qelapsedtimer.cpp
+++ b/src/corelib/kernel/qelapsedtimer.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qelapsedtimer.h"
@@ -111,19 +75,7 @@ QT_BEGIN_NAMESPACE
that the clock used is the same as QElapsedTimer (see
QElapsedTimer::clockType()).
- \section2 32-bit overflows
-
- Some of the clocks used by QElapsedTimer have a limited range and may
- overflow after hitting the upper limit (usually 32-bit). QElapsedTimer
- deals with this overflow issue and presents a consistent timing. However,
- when extracting the time since reference from QElapsedTimer, two
- different processes in the same machine may have different understanding
- of how much time has actually elapsed.
-
- The information on which clocks types may overflow and how to remedy that
- issue is documented along with the clock types.
-
- \sa QTime, QTimer, QDeadlineTimer
+ \sa QTime, QChronoTimer, QDeadlineTimer
*/
/*!
@@ -138,10 +90,13 @@ QT_BEGIN_NAMESPACE
used.
\value SystemTime The human-readable system time. This clock is not monotonic.
- \value MonotonicClock The system's monotonic clock, usually found in Unix systems. This clock is monotonic and does not overflow.
- \value TickCounter The system's tick counter, used on Windows systems. This clock may overflow.
- \value MachAbsoluteTime The Mach kernel's absolute time (\macos and iOS). This clock is monotonic and does not overflow.
- \value PerformanceCounter The high-resolution performance counter provided by Windows. This clock is monotonic and does not overflow.
+ \value MonotonicClock The system's monotonic clock, usually found in Unix systems.
+ This clock is monotonic.
+ \value TickCounter Not used anymore.
+ \value MachAbsoluteTime The Mach kernel's absolute time (\macos and iOS).
+ This clock is monotonic.
+ \value PerformanceCounter The performance counter provided by Windows.
+ This clock is monotonic.
\section2 SystemTime
@@ -159,26 +114,6 @@ QT_BEGIN_NAMESPACE
arbitrary point in the past. This clock type is used on Unix systems
which support POSIX monotonic clocks (\tt{_POSIX_MONOTONIC_CLOCK}).
- This clock does not overflow.
-
- \section2 TickCounter
-
- The tick counter clock type is based on the system's or the processor's
- tick counter, multiplied by the duration of a tick. This clock type is
- used on Windows platforms. If the high-precision performance
- counter is available on Windows, the \tt{PerformanceCounter} clock type
- is used instead.
-
- The TickCounter clock type is the only clock type that may overflow.
- Windows Vista and Windows Server 2008 support the extended 64-bit tick
- counter, which allows avoiding the overflow.
-
- On Windows systems, the clock overflows after 2^32 milliseconds, which
- corresponds to roughly 49.7 days. This means two processes' reckoning of
- the time since the reference may be different by multiples of 2^32
- milliseconds. When comparing such values, it's recommended that the high
- 32 bits of the millisecond count be masked off.
-
\section2 MachAbsoluteTime
This clock type is based on the absolute time presented by Mach kernels,
@@ -187,17 +122,14 @@ QT_BEGIN_NAMESPACE
a POSIX monotonic clock with values differing from the Mach absolute
time.
- This clock is monotonic and does not overflow.
+ This clock is monotonic.
\section2 PerformanceCounter
This clock uses the Windows functions \tt{QueryPerformanceCounter} and
- \tt{QueryPerformanceFrequency} to access the system's high-precision
- performance counter. Since this counter may not be available on all
- systems, QElapsedTimer will fall back to the \tt{TickCounter} clock
- automatically, if this clock cannot be used.
+ \tt{QueryPerformanceFrequency} to access the system's performance counter.
- This clock is monotonic and does not overflow.
+ This clock is monotonic.
\sa clockType(), isMonotonic()
*/
@@ -233,9 +165,229 @@ QT_BEGIN_NAMESPACE
function will return false.
*/
+/*!
+ \fn QElapsedTimer::clockType() noexcept
+
+ Returns the clock type that this QElapsedTimer implementation uses.
+
+ Since Qt 6.6, QElapsedTimer uses \c{std::chrono::steady_clock}, so the
+ clock type is always \l MonotonicClock.
+
+ \sa isMonotonic()
+*/
+
+QElapsedTimer::ClockType QElapsedTimer::clockType() noexcept
+{
+ // we use std::chrono::steady_clock
+ return MonotonicClock;
+}
+
+/*!
+ \fn QElapsedTimer::isMonotonic() noexcept
+
+ Returns \c true if this is a monotonic clock, false otherwise. See the
+ information on the different clock types to understand which ones are
+ monotonic.
+
+ Since Qt 6.6, QElapsedTimer uses \c{std::chrono::steady_clock}, so this
+ function now always returns true.
+
+ \sa clockType(), QElapsedTimer::ClockType
+*/
+bool QElapsedTimer::isMonotonic() noexcept
+{
+ // We trust std::chrono::steady_clock to be steady (monotonic); if the
+ // Standard Library is lying to us, users must complain to their vendor.
+ return true;
+}
+
+/*!
+ \typealias QElapsedTimer::Duration
+ Synonym for \c std::chrono::nanoseconds.
+*/
+
+/*!
+ \typealias QElapsedTimer::TimePoint
+ Synonym for \c {std::chrono::time_point<std::chrono::steady_clock, Duration>}.
+*/
+
+/*!
+ Starts this timer. Once started, a timer value can be checked with elapsed() or msecsSinceReference().
+
+ Normally, a timer is started just before a lengthy operation, such as:
+ \snippet qelapsedtimer/main.cpp 0
+
+ Also, starting a timer makes it valid again.
+
+ \sa restart(), invalidate(), elapsed()
+*/
+void QElapsedTimer::start() noexcept
+{
+ static_assert(sizeof(t1) == sizeof(Duration::rep));
+
+ // This assignment will work so long as TimePoint uses the same time
+ // duration or one of finer granularity than steady_clock::time_point. That
+ // means it will work until the first steady_clock using picoseconds.
+ TimePoint now = std::chrono::steady_clock::now();
+ t1 = now.time_since_epoch().count();
+ QT6_ONLY(t2 = 0);
+}
+
+/*!
+ Restarts the timer and returns the number of milliseconds elapsed since
+ the previous start.
+ This function is equivalent to obtaining the elapsed time with elapsed()
+ and then starting the timer again with start(), but it does so in one
+ single operation, avoiding the need to obtain the clock value twice.
+
+ Calling this function on a QElapsedTimer that is invalid
+ results in undefined behavior.
+
+ The following example illustrates how to use this function to calibrate a
+ parameter to a slow operation (for example, an iteration count) so that
+ this operation takes at least 250 milliseconds:
+
+ \snippet qelapsedtimer/main.cpp 3
+
+ \sa start(), invalidate(), elapsed(), isValid()
+*/
+qint64 QElapsedTimer::restart() noexcept
+{
+ QElapsedTimer old = *this;
+ start();
+ return old.msecsTo(*this);
+}
+
+/*!
+ \since 6.6
+
+ Returns a \c{std::chrono::nanoseconds} with the time since this QElapsedTimer was last
+ started.
+
+ Calling this function on a QElapsedTimer that is invalid
+ results in undefined behavior.
+
+ On platforms that do not provide nanosecond resolution, the value returned
+ will be the best estimate available.
+
+ \sa start(), restart(), hasExpired(), invalidate()
+*/
+auto QElapsedTimer::durationElapsed() const noexcept -> Duration
+{
+ TimePoint then{Duration(t1)};
+ return std::chrono::steady_clock::now() - then;
+}
+
+/*!
+ \since 4.8
+
+ Returns the number of nanoseconds since this QElapsedTimer was last
+ started.
+
+ Calling this function on a QElapsedTimer that is invalid
+ results in undefined behavior.
+
+ On platforms that do not provide nanosecond resolution, the value returned
+ will be the best estimate available.
+
+ \sa start(), restart(), hasExpired(), invalidate()
+*/
+qint64 QElapsedTimer::nsecsElapsed() const noexcept
+{
+ return durationElapsed().count();
+}
+
+/*!
+ Returns the number of milliseconds since this QElapsedTimer was last
+ started.
+
+ Calling this function on a QElapsedTimer that is invalid
+ results in undefined behavior.
+
+ \sa start(), restart(), hasExpired(), isValid(), invalidate()
+*/
+qint64 QElapsedTimer::elapsed() const noexcept
+{
+ using namespace std::chrono;
+ return duration_cast<milliseconds>(durationElapsed()).count();
+}
+
+/*!
+ Returns the number of milliseconds between last time this QElapsedTimer
+ object was started and its reference clock's start.
+
+ This number is usually arbitrary for all clocks except the
+ QElapsedTimer::SystemTime clock. For that clock type, this number is the
+ number of milliseconds since January 1st, 1970 at 0:00 UTC (that is, it
+ is the Unix time expressed in milliseconds).
+
+ On Linux, Windows and Apple platforms, this value is usually the time
+ since the system boot, though it usually does not include the time the
+ system has spent in sleep states.
+
+ \sa clockType(), elapsed()
+*/
+qint64 QElapsedTimer::msecsSinceReference() const noexcept
+{
+ using namespace std::chrono;
+ return duration_cast<milliseconds>(Duration(t1)).count();
+}
+
+/*!
+ \since 6.6
+
+ Returns the time difference between this QElapsedTimer and \a other as a
+ \c{std::chrono::nanoseconds}. If \a other was started before this object,
+ the returned value will be negative. If it was started later, the returned
+ value will be positive.
+
+ The return value is undefined if this object or \a other were invalidated.
+
+ \sa secsTo(), elapsed()
+*/
+auto QElapsedTimer::durationTo(const QElapsedTimer &other) const noexcept -> Duration
+{
+ Duration d1(t1);
+ Duration d2(other.t1);
+ return d2 - d1;
+}
+
+/*!
+ Returns the number of milliseconds between this QElapsedTimer and \a
+ other. If \a other was started before this object, the returned value
+ will be negative. If it was started later, the returned value will be
+ positive.
+
+ The return value is undefined if this object or \a other were invalidated.
+
+ \sa secsTo(), elapsed()
+*/
+qint64 QElapsedTimer::msecsTo(const QElapsedTimer &other) const noexcept
+{
+ using namespace std::chrono;
+ return duration_cast<milliseconds>(durationTo(other)).count();
+}
+
+/*!
+ Returns the number of seconds between this QElapsedTimer and \a other. If
+ \a other was started before this object, the returned value will be
+ negative. If it was started later, the returned value will be positive.
+
+ Calling this function on or with a QElapsedTimer that is invalid
+ results in undefined behavior.
+
+ \sa msecsTo(), elapsed()
+*/
+qint64 QElapsedTimer::secsTo(const QElapsedTimer &other) const noexcept
+{
+ using namespace std::chrono;
+ return duration_cast<seconds>(durationTo(other)).count();
+}
+
static const qint64 invalidData = Q_INT64_C(0x8000000000000000);
/*!
+ \fn QElapsedTimer::invalidate() noexcept
Marks this QElapsedTimer object as invalid.
An invalid object can be checked with isValid(). Calculations of timer
@@ -261,10 +413,12 @@ bool QElapsedTimer::isValid() const noexcept
}
/*!
- Returns \c true if this QElapsedTimer has already expired by \a timeout
- milliseconds (that is, more than \a timeout milliseconds have elapsed).
- The value of \a timeout can be -1 to indicate that this timer does not
- expire, in which case this function will always return false.
+ Returns \c true if elapsed() exceeds the given \a timeout, otherwise \c false.
+
+ A negative \a timeout is interpreted as infinite, so \c false is returned in
+ this case. Otherwise, this is equivalent to \c {elapsed() > timeout}. You
+ can do the same for a duration by comparing durationElapsed() to a duration
+ timeout.
\sa elapsed(), QDeadlineTimer
*/
@@ -275,4 +429,9 @@ bool QElapsedTimer::hasExpired(qint64 timeout) const noexcept
return quint64(elapsed()) > quint64(timeout);
}
+bool operator<(const QElapsedTimer &lhs, const QElapsedTimer &rhs) noexcept
+{
+ return lhs.t1 < rhs.t1;
+}
+
QT_END_NAMESPACE
diff --git a/src/corelib/kernel/qelapsedtimer.h b/src/corelib/kernel/qelapsedtimer.h
index a7523add19..7d8b889f61 100644
--- a/src/corelib/kernel/qelapsedtimer.h
+++ b/src/corelib/kernel/qelapsedtimer.h
@@ -1,49 +1,14 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QELAPSEDTIMER_H
#define QELAPSEDTIMER_H
#include <QtCore/qglobal.h>
-QT_BEGIN_NAMESPACE
+#include <chrono>
+QT_BEGIN_NAMESPACE
class Q_CORE_EXPORT QElapsedTimer
{
@@ -51,16 +16,17 @@ public:
enum ClockType {
SystemTime,
MonotonicClock,
- TickCounter,
+ TickCounter Q_DECL_ENUMERATOR_DEPRECATED_X(
+ "Not supported anymore. Use PerformanceCounter instead."),
MachAbsoluteTime,
PerformanceCounter
};
- constexpr QElapsedTimer()
- : t1(Q_INT64_C(0x8000000000000000)),
- t2(Q_INT64_C(0x8000000000000000))
- {
- }
+ // similar to std::chrono::*_clock
+ using Duration = std::chrono::nanoseconds;
+ using TimePoint = std::chrono::time_point<std::chrono::steady_clock, Duration>;
+
+ constexpr QElapsedTimer() = default;
static ClockType clockType() noexcept;
static bool isMonotonic() noexcept;
@@ -70,11 +36,13 @@ public:
void invalidate() noexcept;
bool isValid() const noexcept;
+ Duration durationElapsed() const noexcept;
qint64 nsecsElapsed() const noexcept;
qint64 elapsed() const noexcept;
bool hasExpired(qint64 timeout) const noexcept;
qint64 msecsSinceReference() const noexcept;
+ Duration durationTo(const QElapsedTimer &other) const noexcept;
qint64 msecsTo(const QElapsedTimer &other) const noexcept;
qint64 secsTo(const QElapsedTimer &other) const noexcept;
@@ -86,8 +54,8 @@ public:
friend bool Q_CORE_EXPORT operator<(const QElapsedTimer &lhs, const QElapsedTimer &rhs) noexcept;
private:
- qint64 t1;
- qint64 t2;
+ qint64 t1 = Q_INT64_C(0x8000000000000000);
+ qint64 t2 = Q_INT64_C(0x8000000000000000);
};
QT_END_NAMESPACE
diff --git a/src/corelib/kernel/qelapsedtimer_generic.cpp b/src/corelib/kernel/qelapsedtimer_generic.cpp
deleted file mode 100644
index 2f7b50ed84..0000000000
--- a/src/corelib/kernel/qelapsedtimer_generic.cpp
+++ /dev/null
@@ -1,205 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qelapsedtimer.h"
-#include "qdeadlinetimer.h"
-#include "qdatetime.h"
-
-QT_BEGIN_NAMESPACE
-
-/*!
- Returns the clock type that this QElapsedTimer implementation uses.
-
- \sa isMonotonic()
-*/
-QElapsedTimer::ClockType QElapsedTimer::clockType() noexcept
-{
- return SystemTime;
-}
-
-/*!
- Returns \c true if this is a monotonic clock, false otherwise. See the
- information on the different clock types to understand which ones are
- monotonic.
-
- \sa clockType(), QElapsedTimer::ClockType
-*/
-bool QElapsedTimer::isMonotonic() noexcept
-{
- return false;
-}
-
-/*!
- Starts this timer. Once started, a timer value can be checked with elapsed() or msecsSinceReference().
-
- Normally, a timer is started just before a lengthy operation, such as:
- \snippet qelapsedtimer/main.cpp 0
-
- Also, starting a timer makes it valid again.
-
- \sa restart(), invalidate(), elapsed()
-*/
-void QElapsedTimer::start() noexcept
-{
- restart();
-}
-
-/*!
- Restarts the timer and returns the number of milliseconds elapsed since
- the previous start.
- This function is equivalent to obtaining the elapsed time with elapsed()
- and then starting the timer again with start(), but it does so in one
- single operation, avoiding the need to obtain the clock value twice.
-
- Calling this function on a QElapsedTimer that is invalid
- results in undefined behavior.
-
- The following example illustrates how to use this function to calibrate a
- parameter to a slow operation (for example, an iteration count) so that
- this operation takes at least 250 milliseconds:
-
- \snippet qelapsedtimer/main.cpp 3
-
- \sa start(), invalidate(), elapsed(), isValid()
-*/
-qint64 QElapsedTimer::restart() noexcept
-{
- qint64 old = t1;
- t1 = QDateTime::currentMSecsSinceEpoch();
- t2 = 0;
- return t1 - old;
-}
-
-/*! \since 4.8
-
- Returns the number of nanoseconds since this QElapsedTimer was last
- started.
-
- Calling this function on a QElapsedTimer that is invalid
- results in undefined behavior.
-
- On platforms that do not provide nanosecond resolution, the value returned
- will be the best estimate available.
-
- \sa start(), restart(), hasExpired(), invalidate()
-*/
-qint64 QElapsedTimer::nsecsElapsed() const noexcept
-{
- return elapsed() * 1000000;
-}
-
-/*!
- Returns the number of milliseconds since this QElapsedTimer was last
- started.
-
- Calling this function on a QElapsedTimer that is invalid
- results in undefined behavior.
-
- \sa start(), restart(), hasExpired(), isValid(), invalidate()
-*/
-qint64 QElapsedTimer::elapsed() const noexcept
-{
- return QDateTime::currentMSecsSinceEpoch() - t1;
-}
-
-/*!
- Returns the number of milliseconds between last time this QElapsedTimer
- object was started and its reference clock's start.
-
- This number is usually arbitrary for all clocks except the
- QElapsedTimer::SystemTime clock. For that clock type, this number is the
- number of milliseconds since January 1st, 1970 at 0:00 UTC (that is, it
- is the Unix time expressed in milliseconds).
-
- On Linux, Windows and Apple platforms, this value is usually the time
- since the system boot, though it usually does not include the time the
- system has spent in sleep states.
-
- \sa clockType(), elapsed()
-*/
-qint64 QElapsedTimer::msecsSinceReference() const noexcept
-{
- return t1;
-}
-
-/*!
- Returns the number of milliseconds between this QElapsedTimer and \a
- other. If \a other was started before this object, the returned value
- will be negative. If it was started later, the returned value will be
- positive.
-
- The return value is undefined if this object or \a other were invalidated.
-
- \sa secsTo(), elapsed()
-*/
-qint64 QElapsedTimer::msecsTo(const QElapsedTimer &other) const noexcept
-{
- qint64 diff = other.t1 - t1;
- return diff;
-}
-
-/*!
- Returns the number of seconds between this QElapsedTimer and \a other. If
- \a other was started before this object, the returned value will be
- negative. If it was started later, the returned value will be positive.
-
- Calling this function on or with a QElapsedTimer that is invalid
- results in undefined behavior.
-
- \sa msecsTo(), elapsed()
-*/
-qint64 QElapsedTimer::secsTo(const QElapsedTimer &other) const noexcept
-{
- return msecsTo(other) / 1000;
-}
-
-bool operator<(const QElapsedTimer &lhs, const QElapsedTimer &rhs) noexcept
-{
- return lhs.t1 < rhs.t1;
-}
-
-QDeadlineTimer QDeadlineTimer::current(Qt::TimerType timerType) noexcept
-{
- QDeadlineTimer result;
- result.t1 = QDateTime::currentMSecsSinceEpoch() * 1000 * 1000;
- result.type = timerType;
- return result;
-}
-
-QT_END_NAMESPACE
diff --git a/src/corelib/kernel/qelapsedtimer_mac.cpp b/src/corelib/kernel/qelapsedtimer_mac.cpp
deleted file mode 100644
index 8fe03c726b..0000000000
--- a/src/corelib/kernel/qelapsedtimer_mac.cpp
+++ /dev/null
@@ -1,166 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-// ask for the latest POSIX, just in case
-#define _POSIX_C_SOURCE 200809L
-
-#include "qelapsedtimer.h"
-#include "qdeadlinetimer.h"
-#include "qdeadlinetimer_p.h"
-#include <sys/time.h>
-#include <time.h>
-#include <unistd.h>
-
-#include <mach/mach_time.h>
-#include <private/qcore_unix_p.h>
-
-QT_BEGIN_NAMESPACE
-
-#ifdef __LP64__
-typedef __int128_t LargeInt;
-#else
-typedef qint64 LargeInt;
-#endif
-
-QElapsedTimer::ClockType QElapsedTimer::clockType() noexcept
-{
- return MachAbsoluteTime;
-}
-
-bool QElapsedTimer::isMonotonic() noexcept
-{
- return true;
-}
-
-static mach_timebase_info_data_t info = { 0, 0 };
-static qint64 absoluteToNSecs(qint64 cpuTime)
-{
- if (info.denom == 0)
- mach_timebase_info(&info);
-
- // don't do multiplication & division if those are equal
- // (mathematically it would be the same, but it's computationally expensive)
- if (info.numer == info.denom)
- return cpuTime;
- qint64 nsecs = LargeInt(cpuTime) * info.numer / info.denom;
- return nsecs;
-}
-
-static qint64 absoluteToMSecs(qint64 cpuTime)
-{
- return absoluteToNSecs(cpuTime) / 1000000;
-}
-
-timespec qt_gettime() noexcept
-{
- timespec tv;
-
- uint64_t cpu_time = mach_absolute_time();
- uint64_t nsecs = absoluteToNSecs(cpu_time);
- tv.tv_sec = nsecs / 1000000000ull;
- tv.tv_nsec = nsecs - (tv.tv_sec * 1000000000ull);
- return tv;
-}
-
-void qt_nanosleep(timespec amount)
-{
- // Mac doesn't have clock_nanosleep, but it does have nanosleep.
- // nanosleep is POSIX.1-1993
-
- int r;
- EINTR_LOOP(r, nanosleep(&amount, &amount));
-}
-
-void QElapsedTimer::start() noexcept
-{
- t1 = mach_absolute_time();
- t2 = 0;
-}
-
-qint64 QElapsedTimer::restart() noexcept
-{
- qint64 old = t1;
- t1 = mach_absolute_time();
- t2 = 0;
-
- return absoluteToMSecs(t1 - old);
-}
-
-qint64 QElapsedTimer::nsecsElapsed() const noexcept
-{
- uint64_t cpu_time = mach_absolute_time();
- return absoluteToNSecs(cpu_time - t1);
-}
-
-qint64 QElapsedTimer::elapsed() const noexcept
-{
- uint64_t cpu_time = mach_absolute_time();
- return absoluteToMSecs(cpu_time - t1);
-}
-
-qint64 QElapsedTimer::msecsSinceReference() const noexcept
-{
- return absoluteToMSecs(t1);
-}
-
-qint64 QElapsedTimer::msecsTo(const QElapsedTimer &other) const noexcept
-{
- return absoluteToMSecs(other.t1 - t1);
-}
-
-qint64 QElapsedTimer::secsTo(const QElapsedTimer &other) const noexcept
-{
- return msecsTo(other) / 1000;
-}
-
-bool operator<(const QElapsedTimer &v1, const QElapsedTimer &v2) noexcept
-{
- return v1.t1 < v2.t1;
-}
-
-QDeadlineTimer QDeadlineTimer::current(Qt::TimerType timerType) noexcept
-{
- static_assert(!QDeadlineTimerNanosecondsInT2);
- QDeadlineTimer result;
- result.type = timerType;
- result.t1 = absoluteToNSecs(mach_absolute_time());
- return result;
-}
-
-QT_END_NAMESPACE
diff --git a/src/corelib/kernel/qelapsedtimer_unix.cpp b/src/corelib/kernel/qelapsedtimer_unix.cpp
deleted file mode 100644
index 07a47d40a7..0000000000
--- a/src/corelib/kernel/qelapsedtimer_unix.cpp
+++ /dev/null
@@ -1,259 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qelapsedtimer.h"
-#include "qdeadlinetimer.h"
-#include "qdeadlinetimer_p.h"
-#if defined(Q_OS_VXWORKS)
-#include "qfunctions_vxworks.h"
-#else
-#include <sys/time.h>
-#include <time.h>
-#endif
-#include <unistd.h>
-
-#include <qatomic.h>
-#include "private/qcore_unix_p.h"
-
-#if defined(QT_NO_CLOCK_MONOTONIC) || defined(QT_BOOTSTRAPPED)
-// turn off the monotonic clock
-# ifdef _POSIX_MONOTONIC_CLOCK
-# undef _POSIX_MONOTONIC_CLOCK
-# endif
-# define _POSIX_MONOTONIC_CLOCK -1
-#endif
-
-QT_BEGIN_NAMESPACE
-
-/*
- * Design:
- *
- * POSIX offers a facility to select the system's monotonic clock when getting
- * the current timestamp. Whereas the functions are mandatory in POSIX.1-2008,
- * the presence of a monotonic clock is a POSIX Option (see the document
- * http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap02.html#tag_02_01_06 )
- *
- * The macro _POSIX_MONOTONIC_CLOCK can therefore assume the following values:
- * -1 monotonic clock is never supported on this system
- * 0 monotonic clock might be supported, runtime check is needed
- * >1 (such as 200809L) monotonic clock is always supported
- *
- * The unixCheckClockType() function will return the clock to use: either
- * CLOCK_MONOTONIC or CLOCK_REALTIME. In the case the POSIX option has a value
- * of zero, then this function stores a static that contains the clock to be
- * used.
- *
- * There's one extra case, which is when CLOCK_REALTIME isn't defined. When
- * that's the case, we'll emulate the clock_gettime function with gettimeofday.
- *
- * Conforming to:
- * POSIX.1b-1993 section "Clocks and Timers"
- * included in UNIX98 (Single Unix Specification v2)
- * included in POSIX.1-2001
- * see http://pubs.opengroup.org/onlinepubs/9699919799/functions/clock_getres.html
- */
-
-#if !defined(CLOCK_REALTIME)
-# define CLOCK_REALTIME 0
-static inline void qt_clock_gettime(int, struct timespec *ts)
-{
- // support clock_gettime with gettimeofday
- struct timeval tv;
- gettimeofday(&tv, 0);
- ts->tv_sec = tv.tv_sec;
- ts->tv_nsec = tv.tv_usec * 1000;
-}
-
-static inline int regularClock()
-{
- return 0;
-}
-#else
-static inline void qt_clock_gettime(clockid_t clock, struct timespec *ts)
-{
- clock_gettime(clock, ts);
-}
-
-static inline clock_t regularClockCheck()
-{
- struct timespec regular_clock_resolution;
- int r = -1;
-
-# ifdef CLOCK_MONOTONIC
- // try the monotonic clock
- r = clock_getres(CLOCK_MONOTONIC, &regular_clock_resolution);
-
-# ifdef Q_OS_LINUX
- // Despite glibc claiming that we should check at runtime, the Linux kernel
- // always supports the monotonic clock
- Q_ASSERT(r == 0);
- return CLOCK_MONOTONIC;
-# endif
-
- if (r == 0)
- return CLOCK_MONOTONIC;
-# endif
-
- // no monotonic, try the realtime clock
- r = clock_getres(CLOCK_REALTIME, &regular_clock_resolution);
- Q_ASSERT(r == 0);
- return CLOCK_REALTIME;
-}
-
-static inline clock_t regularClock()
-{
- static const clock_t clock = regularClockCheck();
- return clock;
-}
-#endif
-
-bool QElapsedTimer::isMonotonic() noexcept
-{
- return clockType() == MonotonicClock;
-}
-
-QElapsedTimer::ClockType QElapsedTimer::clockType() noexcept
-{
- return regularClock() == CLOCK_REALTIME ? SystemTime : MonotonicClock;
-}
-
-static inline void do_gettime(qint64 *sec, qint64 *frac)
-{
- timespec ts;
- qt_clock_gettime(regularClock(), &ts);
- *sec = ts.tv_sec;
- *frac = ts.tv_nsec;
-}
-
-// used in qcore_unix.cpp and qeventdispatcher_unix.cpp
-struct timespec qt_gettime() noexcept
-{
- qint64 sec, frac;
- do_gettime(&sec, &frac);
-
- timespec tv;
- tv.tv_sec = sec;
- tv.tv_nsec = frac;
-
- return tv;
-}
-
-void qt_nanosleep(timespec amount)
-{
- // We'd like to use clock_nanosleep.
- //
- // But clock_nanosleep is from POSIX.1-2001 and both are *not*
- // affected by clock changes when using relative sleeps, even for
- // CLOCK_REALTIME.
- //
- // nanosleep is POSIX.1-1993
-
- int r;
- EINTR_LOOP(r, nanosleep(&amount, &amount));
-}
-
-static qint64 elapsedAndRestart(qint64 sec, qint64 frac,
- qint64 *nowsec, qint64 *nowfrac)
-{
- do_gettime(nowsec, nowfrac);
- sec = *nowsec - sec;
- frac = *nowfrac - frac;
- return (sec * Q_INT64_C(1000000000) + frac) / Q_INT64_C(1000000);
-}
-
-void QElapsedTimer::start() noexcept
-{
- do_gettime(&t1, &t2);
-}
-
-qint64 QElapsedTimer::restart() noexcept
-{
- return elapsedAndRestart(t1, t2, &t1, &t2);
-}
-
-qint64 QElapsedTimer::nsecsElapsed() const noexcept
-{
- qint64 sec, frac;
- do_gettime(&sec, &frac);
- sec = sec - t1;
- frac = frac - t2;
- return sec * Q_INT64_C(1000000000) + frac;
-}
-
-qint64 QElapsedTimer::elapsed() const noexcept
-{
- return nsecsElapsed() / Q_INT64_C(1000000);
-}
-
-qint64 QElapsedTimer::msecsSinceReference() const noexcept
-{
- return t1 * Q_INT64_C(1000) + t2 / Q_INT64_C(1000000);
-}
-
-qint64 QElapsedTimer::msecsTo(const QElapsedTimer &other) const noexcept
-{
- qint64 secs = other.t1 - t1;
- qint64 fraction = other.t2 - t2;
- return (secs * Q_INT64_C(1000000000) + fraction) / Q_INT64_C(1000000);
-}
-
-qint64 QElapsedTimer::secsTo(const QElapsedTimer &other) const noexcept
-{
- return other.t1 - t1;
-}
-
-bool operator<(const QElapsedTimer &v1, const QElapsedTimer &v2) noexcept
-{
- return v1.t1 < v2.t1 || (v1.t1 == v2.t1 && v1.t2 < v2.t2);
-}
-
-QDeadlineTimer QDeadlineTimer::current(Qt::TimerType timerType) noexcept
-{
- static_assert(QDeadlineTimerNanosecondsInT2);
- QDeadlineTimer result;
- qint64 cursec, curnsec;
- do_gettime(&cursec, &curnsec);
- result.t1 = cursec;
- result.t2 = curnsec;
- result.type = timerType;
- return result;
-}
-
-QT_END_NAMESPACE
diff --git a/src/corelib/kernel/qelapsedtimer_win.cpp b/src/corelib/kernel/qelapsedtimer_win.cpp
deleted file mode 100644
index deeeb05921..0000000000
--- a/src/corelib/kernel/qelapsedtimer_win.cpp
+++ /dev/null
@@ -1,172 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qelapsedtimer.h"
-#include "qdeadlinetimer.h"
-#include "qdeadlinetimer_p.h"
-#include <qt_windows.h>
-
-QT_BEGIN_NAMESPACE
-
-// Result of QueryPerformanceFrequency, 0 indicates that the high resolution timer is unavailable
-static quint64 counterFrequency = 0;
-
-static void resolveCounterFrequency()
-{
- static bool done = false;
- if (done)
- return;
-
- // Retrieve the number of high-resolution performance counter ticks per second
- LARGE_INTEGER frequency;
- if (!QueryPerformanceFrequency(&frequency)) {
- qFatal("QueryPerformanceFrequency failed, even though Microsoft documentation promises it wouldn't.");
- counterFrequency = 0;
- } else {
- counterFrequency = frequency.QuadPart;
- }
-
- done = true;
-}
-
-static inline qint64 ticksToNanoseconds(qint64 ticks)
-{
- if (counterFrequency > 0) {
- // QueryPerformanceCounter uses an arbitrary frequency
- qint64 seconds = ticks / counterFrequency;
- qint64 nanoSeconds = (ticks - seconds * counterFrequency) * 1000000000 / counterFrequency;
- return seconds * 1000000000 + nanoSeconds;
- }
- // GetTickCount(64) returns milliseconds
- return ticks * 1000000;
-}
-
-
-static quint64 getTickCount()
-{
- resolveCounterFrequency();
-
- // This avoids a division by zero and disables the high performance counter if it's not available
- if (counterFrequency > 0) {
- LARGE_INTEGER counter;
-
- bool ok = QueryPerformanceCounter(&counter);
- Q_ASSERT_X(ok, "QElapsedTimer::start()",
- "QueryPerformanceCounter failed, although QueryPerformanceFrequency succeeded.");
- Q_UNUSED(ok);
- return counter.QuadPart;
- }
-
- return GetTickCount64();
-}
-
-quint64 qt_msectime()
-{
- return ticksToNanoseconds(getTickCount()) / 1000000;
-}
-
-QElapsedTimer::ClockType QElapsedTimer::clockType() noexcept
-{
- resolveCounterFrequency();
-
- return counterFrequency > 0 ? PerformanceCounter : TickCounter;
-}
-
-bool QElapsedTimer::isMonotonic() noexcept
-{
- return true;
-}
-
-void QElapsedTimer::start() noexcept
-{
- t1 = getTickCount();
- t2 = 0;
-}
-
-qint64 QElapsedTimer::restart() noexcept
-{
- qint64 oldt1 = t1;
- t1 = getTickCount();
- t2 = 0;
- return ticksToNanoseconds(t1 - oldt1) / 1000000;
-}
-
-qint64 QElapsedTimer::nsecsElapsed() const noexcept
-{
- qint64 elapsed = getTickCount() - t1;
- return ticksToNanoseconds(elapsed);
-}
-
-qint64 QElapsedTimer::elapsed() const noexcept
-{
- qint64 elapsed = getTickCount() - t1;
- return ticksToNanoseconds(elapsed) / 1000000;
-}
-
-qint64 QElapsedTimer::msecsSinceReference() const noexcept
-{
- return ticksToNanoseconds(t1) / 1000000;
-}
-
-qint64 QElapsedTimer::msecsTo(const QElapsedTimer &other) const noexcept
-{
- qint64 difference = other.t1 - t1;
- return ticksToNanoseconds(difference) / 1000000;
-}
-
-qint64 QElapsedTimer::secsTo(const QElapsedTimer &other) const noexcept
-{
- return msecsTo(other) / 1000;
-}
-
-bool operator<(const QElapsedTimer &v1, const QElapsedTimer &v2) noexcept
-{
- return (v1.t1 - v2.t1) < 0;
-}
-
-QDeadlineTimer QDeadlineTimer::current(Qt::TimerType timerType) noexcept
-{
- static_assert(!QDeadlineTimerNanosecondsInT2);
- QDeadlineTimer result;
- result.t1 = ticksToNanoseconds(getTickCount());
- result.type = timerType;
- return result;
-}
-
-QT_END_NAMESPACE
diff --git a/src/corelib/kernel/qeventdispatcher_cf.mm b/src/corelib/kernel/qeventdispatcher_cf.mm
index 6f6be9a73b..042b0651f4 100644
--- a/src/corelib/kernel/qeventdispatcher_cf.mm
+++ b/src/corelib/kernel/qeventdispatcher_cf.mm
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qeventdispatcher_cf_p.h"
@@ -205,7 +169,7 @@ static const CFTimeInterval kCFTimeIntervalDistantFuture = std::numeric_limits<C
#pragma mark - Class definition
QEventDispatcherCoreFoundation::QEventDispatcherCoreFoundation(QObject *parent)
- : QAbstractEventDispatcher(parent)
+ : QAbstractEventDispatcherV2(parent)
, m_processEvents(QEventLoop::EventLoopExec)
, m_postedEventsRunLoopSource(this, &QEventDispatcherCoreFoundation::processPostedEvents)
, m_runLoopActivityObserver(this, &QEventDispatcherCoreFoundation::handleRunLoopActivity, kCFRunLoopAllActivities)
@@ -231,7 +195,7 @@ void QEventDispatcherCoreFoundation::startingUp()
QEventDispatcherCoreFoundation::~QEventDispatcherCoreFoundation()
{
invalidateTimer();
- qDeleteAll(m_timerInfoList);
+ m_timerInfoList.clearTimers();
m_cfSocketNotifier.removeSocketNotifiers();
}
@@ -542,26 +506,28 @@ void QEventDispatcherCoreFoundation::unregisterSocketNotifier(QSocketNotifier *n
#pragma mark - Timers
-void QEventDispatcherCoreFoundation::registerTimer(int timerId, qint64 interval, Qt::TimerType timerType, QObject *object)
+void QEventDispatcherCoreFoundation::registerTimer(Qt::TimerId timerId, Duration interval,
+ Qt::TimerType timerType, QObject *object)
{
- qCDebug(lcEventDispatcherTimers) << "Registering timer with id =" << timerId << "interval =" << interval
+ qCDebug(lcEventDispatcherTimers) << "Registering timer with id =" << int(timerId) << "interval =" << interval
<< "type =" << timerType << "object =" << object;
- Q_ASSERT(timerId > 0 && interval >= 0 && object);
+ Q_ASSERT(qToUnderlying(timerId) > 0 && interval.count() >= 0 && object);
Q_ASSERT(object->thread() == thread() && thread() == QThread::currentThread());
m_timerInfoList.registerTimer(timerId, interval, timerType, object);
updateTimers();
}
-bool QEventDispatcherCoreFoundation::unregisterTimer(int timerId)
+bool QEventDispatcherCoreFoundation::unregisterTimer(Qt::TimerId timerId)
{
- Q_ASSERT(timerId > 0);
+ Q_ASSERT(qToUnderlying(timerId) > 0);
Q_ASSERT(thread() == QThread::currentThread());
bool returnValue = m_timerInfoList.unregisterTimer(timerId);
- qCDebug(lcEventDispatcherTimers) << "Unegistered timer with id =" << timerId << "Timers left:" << m_timerInfoList.size();
+ qCDebug(lcEventDispatcherTimers) << "Unegistered timer with id =" << qToUnderlying(timerId)
+ << "Timers left:" << m_timerInfoList.size();
updateTimers();
return returnValue;
@@ -579,22 +545,18 @@ bool QEventDispatcherCoreFoundation::unregisterTimers(QObject *object)
return returnValue;
}
-QList<QAbstractEventDispatcher::TimerInfo> QEventDispatcherCoreFoundation::registeredTimers(QObject *object) const
+QList<QAbstractEventDispatcher::TimerInfoV2>
+QEventDispatcherCoreFoundation::timersForObject(QObject *object) const
{
Q_ASSERT(object);
return m_timerInfoList.registeredTimers(object);
}
-int QEventDispatcherCoreFoundation::remainingTime(int timerId)
+QEventDispatcherCoreFoundation::Duration
+QEventDispatcherCoreFoundation::remainingTime(Qt::TimerId timerId) const
{
- Q_ASSERT(timerId > 0);
- return m_timerInfoList.timerRemainingTime(timerId);
-}
-
-static double timespecToSeconds(const timespec &spec)
-{
- static double nanosecondsPerSecond = 1.0 * 1000 * 1000 * 1000;
- return spec.tv_sec + (spec.tv_nsec / nanosecondsPerSecond);
+ Q_ASSERT(qToUnderlying(timerId) > 0);
+ return m_timerInfoList.remainingDuration(timerId);
}
void QEventDispatcherCoreFoundation::updateTimers()
@@ -602,12 +564,20 @@ void QEventDispatcherCoreFoundation::updateTimers()
if (m_timerInfoList.size() > 0) {
// We have Qt timers registered, so create or reschedule CF timer to match
- timespec tv = { -1, -1 };
- CFAbsoluteTime timeToFire = m_timerInfoList.timerWait(tv) ?
+ using namespace std::chrono_literals;
+ using DoubleSeconds = std::chrono::duration<double, std::ratio<1>>;
+
+ CFAbsoluteTime timeToFire;
+ auto opt = m_timerInfoList.timerWait();
+ DoubleSeconds secs{};
+ if (opt) {
// We have a timer ready to fire right now, or some time in the future
- CFAbsoluteTimeGetCurrent() + timespecToSeconds(tv)
+ secs = DoubleSeconds{*opt};
+ timeToFire = CFAbsoluteTimeGetCurrent() + secs.count();
+ } else {
// We have timers, but they are all currently blocked by callbacks
- : kCFTimeIntervalDistantFuture;
+ timeToFire = kCFTimeIntervalDistantFuture;
+ }
if (!m_runLoopTimer) {
m_runLoopTimer = CFRunLoopTimerCreateWithHandler(kCFAllocatorDefault,
@@ -623,9 +593,9 @@ void QEventDispatcherCoreFoundation::updateTimers()
qCDebug(lcEventDispatcherTimers) << "Re-scheduled CFRunLoopTimer" << m_runLoopTimer;
}
- m_overdueTimerScheduled = !timespecToSeconds(tv);
+ m_overdueTimerScheduled = secs > 0s;
- qCDebug(lcEventDispatcherTimers) << "Next timeout in" << tv << "seconds";
+ qCDebug(lcEventDispatcherTimers) << "Next timeout in" << secs;
} else {
// No Qt timers are registered, so make sure we're not running any CF timers
@@ -647,7 +617,7 @@ void QEventDispatcherCoreFoundation::invalidateTimer()
m_runLoopTimer = 0;
}
+QT_END_NAMESPACE
+
#include "qeventdispatcher_cf.moc"
#include "moc_qeventdispatcher_cf_p.cpp"
-
-QT_END_NAMESPACE
diff --git a/src/corelib/kernel/qeventdispatcher_cf_p.h b/src/corelib/kernel/qeventdispatcher_cf_p.h
index b79c82264c..3575a6fb39 100644
--- a/src/corelib/kernel/qeventdispatcher_cf_p.h
+++ b/src/corelib/kernel/qeventdispatcher_cf_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
/****************************************************************************
**
@@ -99,8 +63,8 @@ Q_FORWARD_DECLARE_OBJC_CLASS(QT_MANGLE_NAMESPACE(RunLoopModeTracker));
QT_BEGIN_NAMESPACE
namespace QtPrivate {
-Q_CORE_EXPORT Q_DECLARE_LOGGING_CATEGORY(lcEventDispatcher);
-Q_CORE_EXPORT Q_DECLARE_LOGGING_CATEGORY(lcEventDispatcherTimers)
+Q_DECLARE_EXPORTED_LOGGING_CATEGORY(lcEventDispatcher, Q_CORE_EXPORT)
+Q_DECLARE_EXPORTED_LOGGING_CATEGORY(lcEventDispatcherTimers, Q_CORE_EXPORT)
}
class QEventDispatcherCoreFoundation;
@@ -204,7 +168,7 @@ private:
CFRunLoopObserverRef m_observer;
};
-class Q_CORE_EXPORT QEventDispatcherCoreFoundation : public QAbstractEventDispatcher
+class Q_CORE_EXPORT QEventDispatcherCoreFoundation : public QAbstractEventDispatcherV2
{
Q_OBJECT
@@ -218,12 +182,12 @@ public:
void registerSocketNotifier(QSocketNotifier *notifier) override;
void unregisterSocketNotifier(QSocketNotifier *notifier) override;
- void registerTimer(int timerId, qint64 interval, Qt::TimerType timerType, QObject *object) override;
- bool unregisterTimer(int timerId) override;
- bool unregisterTimers(QObject *object) override;
- QList<QAbstractEventDispatcher::TimerInfo> registeredTimers(QObject *object) const override;
-
- int remainingTime(int timerId) override;
+ void registerTimer(Qt::TimerId timerId, Duration interval, Qt::TimerType timerType,
+ QObject *object) override final;
+ bool unregisterTimer(Qt::TimerId timerId) override final;
+ bool unregisterTimers(QObject *object) override final;
+ QList<TimerInfoV2> timersForObject(QObject *object) const override final;
+ Duration remainingTime(Qt::TimerId timerId) const override final;
void wakeUp() override;
void interrupt() override;
@@ -240,6 +204,25 @@ protected:
, processedPostedEvents(false), processedTimers(false)
, deferredWakeUp(false), deferredUpdateTimers(false) {}
+ ProcessEventsState(const ProcessEventsState &other)
+ : flags(other.flags.loadAcquire())
+ , wasInterrupted(other.wasInterrupted.loadAcquire())
+ , processedPostedEvents(other.processedPostedEvents.loadAcquire())
+ , processedTimers(other.processedTimers.loadAcquire())
+ , deferredWakeUp(other.deferredWakeUp.loadAcquire())
+ , deferredUpdateTimers(other.deferredUpdateTimers) {}
+
+ ProcessEventsState &operator=(const ProcessEventsState &other)
+ {
+ flags.storeRelease(other.flags.loadAcquire());
+ wasInterrupted.storeRelease(other.wasInterrupted.loadAcquire());
+ processedPostedEvents.storeRelease(other.processedPostedEvents.loadAcquire());
+ processedTimers.storeRelease(other.processedTimers.loadAcquire());
+ deferredWakeUp.storeRelease(other.deferredWakeUp.loadAcquire());
+ deferredUpdateTimers = other.deferredUpdateTimers;
+ return *this;
+ }
+
QAtomicInt flags;
QAtomicInteger<char> wasInterrupted;
QAtomicInteger<char> processedPostedEvents;
diff --git a/src/corelib/kernel/qeventdispatcher_glib.cpp b/src/corelib/kernel/qeventdispatcher_glib.cpp
index 3964c1ceac..1e906c4b27 100644
--- a/src/corelib/kernel/qeventdispatcher_glib.cpp
+++ b/src/corelib/kernel/qeventdispatcher_glib.cpp
@@ -1,55 +1,22 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qeventdispatcher_glib_p.h"
#include "qeventdispatcher_unix_p.h"
+#include <private/qnumeric_p.h>
#include <private/qthread_p.h>
#include "qcoreapplication.h"
#include "qsocketnotifier.h"
#include <QtCore/qlist.h>
-#include <QtCore/qpair.h>
#include <glib.h>
+using namespace std::chrono;
+using namespace std::chrono_literals;
+
QT_BEGIN_NAMESPACE
struct GPollFDWithQSocketNotifier
@@ -77,12 +44,12 @@ static gboolean socketNotifierSourceCheck(GSource *source)
GSocketNotifierSource *src = reinterpret_cast<GSocketNotifierSource *>(source);
bool pending = false;
- for (int i = 0; !pending && i < src->pollfds.count(); ++i) {
+ for (int i = 0; !pending && i < src->pollfds.size(); ++i) {
GPollFDWithQSocketNotifier *p = src->pollfds.at(i);
if (p->pollfd.revents & G_IO_NVAL) {
// disable the invalid socket notifier
- static const char *t[] = { "Read", "Write", "Exception" };
+ const char * const t[] = { "Read", "Write", "Exception" };
qWarning("QSocketNotifier: Invalid socket %d and type '%s', disabling...",
p->pollfd.fd, t[int(p->socketNotifier->type())]);
// ### note, modifies src->pollfds!
@@ -101,7 +68,7 @@ static gboolean socketNotifierSourceDispatch(GSource *source, GSourceFunc, gpoin
QEvent event(QEvent::SockAct);
GSocketNotifierSource *src = reinterpret_cast<GSocketNotifierSource *>(source);
- for (src->activeNotifierPos = 0; src->activeNotifierPos < src->pollfds.count();
+ for (src->activeNotifierPos = 0; src->activeNotifierPos < src->pollfds.size();
++src->activeNotifierPos) {
GPollFDWithQSocketNotifier *p = src->pollfds.at(src->activeNotifierPos);
@@ -112,7 +79,7 @@ static gboolean socketNotifierSourceDispatch(GSource *source, GSourceFunc, gpoin
return true; // ??? don't remove, right?
}
-static GSourceFuncs socketNotifierSourceFuncs = {
+Q_CONSTINIT static GSourceFuncs socketNotifierSourceFuncs = {
socketNotifierSourcePrepare,
socketNotifierSourceCheck,
socketNotifierSourceDispatch,
@@ -131,11 +98,13 @@ struct GTimerSource
static gboolean timerSourcePrepareHelper(GTimerSource *src, gint *timeout)
{
- timespec tv = { 0l, 0l };
- if (!(src->processEventsFlags & QEventLoop::X11ExcludeTimers) && src->timerList.timerWait(tv))
- *timeout = (tv.tv_sec * 1000) + ((tv.tv_nsec + 999999) / 1000 / 1000);
- else
+ if (src->processEventsFlags & QEventLoop::X11ExcludeTimers) {
*timeout = -1;
+ return true;
+ }
+
+ auto remaining = src->timerList.timerWait().value_or(-1ms);
+ *timeout = qt_saturate<gint>(ceil<milliseconds>(remaining).count());
return (*timeout == 0);
}
@@ -146,10 +115,7 @@ static gboolean timerSourceCheckHelper(GTimerSource *src)
|| (src->processEventsFlags & QEventLoop::X11ExcludeTimers))
return false;
- if (src->timerList.updateCurrentTime() < src->timerList.constFirst()->timeout)
- return false;
-
- return true;
+ return !src->timerList.hasPendingTimers();
}
static gboolean timerSourcePrepare(GSource *source, gint *timeout)
@@ -186,7 +152,7 @@ static gboolean timerSourceDispatch(GSource *source, GSourceFunc, gpointer)
return true; // ??? don't remove, right again?
}
-static GSourceFuncs timerSourceFuncs = {
+Q_CONSTINIT static GSourceFuncs timerSourceFuncs = {
timerSourcePrepare,
timerSourceCheck,
timerSourceDispatch,
@@ -233,7 +199,7 @@ static gboolean idleTimerSourceDispatch(GSource *source, GSourceFunc, gpointer)
return true;
}
-static GSourceFuncs idleTimerSourceFuncs = {
+Q_CONSTINIT static GSourceFuncs idleTimerSourceFuncs = {
idleTimerSourcePrepare,
idleTimerSourceCheck,
idleTimerSourceDispatch,
@@ -281,7 +247,7 @@ static gboolean postEventSourceDispatch(GSource *s, GSourceFunc, gpointer)
return true; // i dunno, george...
}
-static GSourceFuncs postEventSourceFuncs = {
+Q_CONSTINIT static GSourceFuncs postEventSourceFuncs = {
postEventSourcePrepare,
postEventSourceCheck,
postEventSourceDispatch,
@@ -296,7 +262,7 @@ QEventDispatcherGlibPrivate::QEventDispatcherGlibPrivate(GMainContext *context)
{
#if GLIB_MAJOR_VERSION == 2 && GLIB_MINOR_VERSION < 32
if (qEnvironmentVariableIsEmpty("QT_NO_THREADED_GLIB")) {
- static QBasicMutex mutex;
+ Q_CONSTINIT static QBasicMutex mutex;
QMutexLocker locker(&mutex);
if (!g_thread_supported())
g_thread_init(NULL);
@@ -361,12 +327,12 @@ void QEventDispatcherGlibPrivate::runTimersOnceWithNormalPriority()
}
QEventDispatcherGlib::QEventDispatcherGlib(QObject *parent)
- : QAbstractEventDispatcher(*(new QEventDispatcherGlibPrivate), parent)
+ : QAbstractEventDispatcherV2(*(new QEventDispatcherGlibPrivate), parent)
{
}
QEventDispatcherGlib::QEventDispatcherGlib(GMainContext *mainContext, QObject *parent)
- : QAbstractEventDispatcher(*(new QEventDispatcherGlibPrivate(mainContext)), parent)
+ : QAbstractEventDispatcherV2(*(new QEventDispatcherGlibPrivate(mainContext)), parent)
{ }
QEventDispatcherGlib::~QEventDispatcherGlib()
@@ -374,7 +340,7 @@ QEventDispatcherGlib::~QEventDispatcherGlib()
Q_D(QEventDispatcherGlib);
// destroy all timer sources
- qDeleteAll(d->timerSource->timerList);
+ d->timerSource->timerList.clearTimers();
d->timerSource->timerList.~QTimerInfoList();
g_source_destroy(&d->timerSource->source);
g_source_unref(&d->timerSource->source);
@@ -384,7 +350,7 @@ QEventDispatcherGlib::~QEventDispatcherGlib()
d->idleTimerSource = nullptr;
// destroy socket notifier source
- for (int i = 0; i < d->socketNotifierSource->pollfds.count(); ++i) {
+ for (int i = 0; i < d->socketNotifierSource->pollfds.size(); ++i) {
GPollFDWithQSocketNotifier *p = d->socketNotifierSource->pollfds[i];
g_source_remove_poll(&d->socketNotifierSource->source, &p->pollfd);
delete p;
@@ -441,7 +407,7 @@ bool QEventDispatcherGlib::processEvents(QEventLoop::ProcessEventsFlags flags)
void QEventDispatcherGlib::registerSocketNotifier(QSocketNotifier *notifier)
{
Q_ASSERT(notifier);
- int sockfd = notifier->socket();
+ int sockfd = int(notifier->socket());
int type = notifier->type();
#ifndef QT_NO_DEBUG
if (sockfd < 0) {
@@ -481,8 +447,7 @@ void QEventDispatcherGlib::unregisterSocketNotifier(QSocketNotifier *notifier)
{
Q_ASSERT(notifier);
#ifndef QT_NO_DEBUG
- int sockfd = notifier->socket();
- if (sockfd < 0) {
+ if (notifier->socket() < 0) {
qWarning("QSocketNotifier: Internal error");
return;
} else if (notifier->thread() != thread()
@@ -494,7 +459,7 @@ void QEventDispatcherGlib::unregisterSocketNotifier(QSocketNotifier *notifier)
Q_D(QEventDispatcherGlib);
- for (int i = 0; i < d->socketNotifierSource->pollfds.count(); ++i) {
+ for (int i = 0; i < d->socketNotifierSource->pollfds.size(); ++i) {
GPollFDWithQSocketNotifier *p = d->socketNotifierSource->pollfds.at(i);
if (p->socketNotifier == notifier) {
// found it
@@ -512,10 +477,11 @@ void QEventDispatcherGlib::unregisterSocketNotifier(QSocketNotifier *notifier)
}
}
-void QEventDispatcherGlib::registerTimer(int timerId, qint64 interval, Qt::TimerType timerType, QObject *object)
+void QEventDispatcherGlib::registerTimer(Qt::TimerId timerId, Duration interval,
+ Qt::TimerType timerType, QObject *object)
{
#ifndef QT_NO_DEBUG
- if (timerId < 1 || interval < 0 || !object) {
+ if (qToUnderlying(timerId) < 1 || interval < 0ns || !object) {
qWarning("QEventDispatcherGlib::registerTimer: invalid arguments");
return;
} else if (object->thread() != thread() || thread() != QThread::currentThread()) {
@@ -528,10 +494,10 @@ void QEventDispatcherGlib::registerTimer(int timerId, qint64 interval, Qt::Timer
d->timerSource->timerList.registerTimer(timerId, interval, timerType, object);
}
-bool QEventDispatcherGlib::unregisterTimer(int timerId)
+bool QEventDispatcherGlib::unregisterTimer(Qt::TimerId timerId)
{
#ifndef QT_NO_DEBUG
- if (timerId < 1) {
+ if (qToUnderlying(timerId) < 1) {
qWarning("QEventDispatcherGlib::unregisterTimer: invalid argument");
return false;
} else if (thread() != QThread::currentThread()) {
@@ -560,28 +526,30 @@ bool QEventDispatcherGlib::unregisterTimers(QObject *object)
return d->timerSource->timerList.unregisterTimers(object);
}
-QList<QEventDispatcherGlib::TimerInfo> QEventDispatcherGlib::registeredTimers(QObject *object) const
+QList<QEventDispatcherGlib::TimerInfoV2> QEventDispatcherGlib::timersForObject(QObject *object) const
{
+#ifndef QT_NO_DEBUG
if (!object) {
- qWarning("QEventDispatcherUNIX:registeredTimers: invalid argument");
- return QList<TimerInfo>();
+ qWarning("QEventDispatcherGlib:timersForObject: invalid argument");
+ return {};
}
+#endif
Q_D(const QEventDispatcherGlib);
return d->timerSource->timerList.registeredTimers(object);
}
-int QEventDispatcherGlib::remainingTime(int timerId)
+QEventDispatcherGlib::Duration QEventDispatcherGlib::remainingTime(Qt::TimerId timerId) const
{
#ifndef QT_NO_DEBUG
- if (timerId < 1) {
+ if (qToUnderlying(timerId) < 1) {
qWarning("QEventDispatcherGlib::remainingTimeTime: invalid argument");
- return -1;
+ return Duration::min();
}
#endif
- Q_D(QEventDispatcherGlib);
- return d->timerSource->timerList.timerRemainingTime(timerId);
+ Q_D(const QEventDispatcherGlib);
+ return d->timerSource->timerList.remainingDuration(timerId);
}
void QEventDispatcherGlib::interrupt()
@@ -606,7 +574,7 @@ bool QEventDispatcherGlib::versionSupported()
}
QEventDispatcherGlib::QEventDispatcherGlib(QEventDispatcherGlibPrivate &dd, QObject *parent)
- : QAbstractEventDispatcher(dd, parent)
+ : QAbstractEventDispatcherV2(dd, parent)
{
}
diff --git a/src/corelib/kernel/qeventdispatcher_glib_p.h b/src/corelib/kernel/qeventdispatcher_glib_p.h
index 63bc4109a8..30783d3858 100644
--- a/src/corelib/kernel/qeventdispatcher_glib_p.h
+++ b/src/corelib/kernel/qeventdispatcher_glib_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QEVENTDISPATCHER_GLIB_P_H
#define QEVENTDISPATCHER_GLIB_P_H
@@ -60,7 +24,7 @@ QT_BEGIN_NAMESPACE
class QEventDispatcherGlibPrivate;
-class Q_CORE_EXPORT QEventDispatcherGlib : public QAbstractEventDispatcher
+class Q_CORE_EXPORT QEventDispatcherGlib : public QAbstractEventDispatcherV2
{
Q_OBJECT
Q_DECLARE_PRIVATE(QEventDispatcherGlib)
@@ -75,12 +39,12 @@ public:
void registerSocketNotifier(QSocketNotifier *socketNotifier) final;
void unregisterSocketNotifier(QSocketNotifier *socketNotifier) final;
- void registerTimer(int timerId, qint64 interval, Qt::TimerType timerType, QObject *object) final;
- bool unregisterTimer(int timerId) final;
- bool unregisterTimers(QObject *object) final;
- QList<TimerInfo> registeredTimers(QObject *object) const final;
-
- int remainingTime(int timerId) final;
+ void registerTimer(Qt::TimerId timerId, Duration interval, Qt::TimerType timerType,
+ QObject *object) override final;
+ bool unregisterTimer(Qt::TimerId timerId) override final;
+ bool unregisterTimers(QObject *object) override final;
+ QList<TimerInfoV2> timersForObject(QObject *object) const override final;
+ Duration remainingTime(Qt::TimerId timerId) const override final;
void wakeUp() final;
void interrupt() final;
diff --git a/src/corelib/kernel/qeventdispatcher_unix.cpp b/src/corelib/kernel/qeventdispatcher_unix.cpp
index c23fab2eef..21bd224415 100644
--- a/src/corelib/kernel/qeventdispatcher_unix.cpp
+++ b/src/corelib/kernel/qeventdispatcher_unix.cpp
@@ -1,50 +1,13 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2016 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qplatformdefs.h"
#include "qcoreapplication.h"
-#include "qpair.h"
+#include "qhash.h"
#include "qsocketnotifier.h"
#include "qthread.h"
-#include "qelapsedtimer.h"
#include "qeventdispatcher_unix_p.h"
#include <private/qthread_p.h>
@@ -55,23 +18,19 @@
#include <stdio.h>
#include <stdlib.h>
-#ifndef QT_NO_EVENTFD
+#if __has_include(<sys/eventfd.h>)
# include <sys/eventfd.h>
+static constexpr bool UsingEventfd = true;
+#else
+static constexpr bool UsingEventfd = false;
#endif
-// VxWorks doesn't correctly set the _POSIX_... options
#if defined(Q_OS_VXWORKS)
-# if defined(_POSIX_MONOTONIC_CLOCK) && (_POSIX_MONOTONIC_CLOCK <= 0)
-# undef _POSIX_MONOTONIC_CLOCK
-# define _POSIX_MONOTONIC_CLOCK 1
-# endif
# include <pipeDrv.h>
-# include <sys/time.h>
#endif
-#if (_POSIX_MONOTONIC_CLOCK-0 <= 0) || defined(QT_BOOTSTRAPPED)
-# include <sys/times.h>
-#endif
+using namespace std::chrono;
+using namespace std::chrono_literals;
QT_BEGIN_NAMESPACE
@@ -91,11 +50,6 @@ static const char *socketType(QSocketNotifier::Type type)
QThreadPipe::QThreadPipe()
{
- fds[0] = -1;
- fds[1] = -1;
-#if defined(Q_OS_VXWORKS)
- name[0] = '\0';
-#endif
}
QThreadPipe::~QThreadPipe()
@@ -103,7 +57,7 @@ QThreadPipe::~QThreadPipe()
if (fds[0] >= 0)
close(fds[0]);
- if (fds[1] >= 0)
+ if (!UsingEventfd && fds[1] >= 0)
close(fds[1]);
#if defined(Q_OS_VXWORKS)
@@ -140,23 +94,25 @@ bool QThreadPipe::init()
// create the pipe
if (pipeDevCreate(name, 128 /*maxMsg*/, 1 /*maxLength*/) != OK) {
- perror("QThreadPipe: Unable to create thread pipe device %s", name);
+ perror("QThreadPipe: Unable to create thread pipe device");
return false;
}
if ((fds[0] = open(name, O_RDWR, 0)) < 0) {
- perror("QThreadPipe: Unable to open pipe device %s", name);
+ perror("QThreadPipe: Unable to open pipe device");
return false;
}
initThreadPipeFD(fds[0]);
fds[1] = fds[0];
#else
-# ifndef QT_NO_EVENTFD
- if ((fds[0] = eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC)) >= 0)
- return true;
+ int ret;
+# ifdef EFD_CLOEXEC
+ ret = fds[0] = eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC);
# endif
- if (qt_safe_pipe(fds, O_NONBLOCK) == -1) {
+ if (!UsingEventfd)
+ ret = qt_safe_pipe(fds, O_NONBLOCK);
+ if (ret == -1) {
perror("QThreadPipe: Unable to create pipe");
return false;
}
@@ -172,15 +128,10 @@ pollfd QThreadPipe::prepare() const
void QThreadPipe::wakeUp()
{
- if (wakeUps.testAndSetAcquire(0, 1)) {
-#ifndef QT_NO_EVENTFD
- if (fds[1] == -1) {
- // eventfd
- eventfd_t value = 1;
- int ret;
- EINTR_LOOP(ret, eventfd_write(fds[0], value));
- return;
- }
+ if ((wakeUps.fetchAndOrAcquire(1) & 1) == 0) {
+# ifdef EFD_CLOEXEC
+ eventfd_write(fds[0], 1);
+ return;
#endif
char c = 0;
qt_safe_write(fds[1], &c, 1);
@@ -201,14 +152,11 @@ int QThreadPipe::check(const pollfd &pfd)
::read(fds[0], c, sizeof(c));
::ioctl(fds[0], FIOFLUSH, 0);
#else
-# ifndef QT_NO_EVENTFD
- if (fds[1] == -1) {
- // eventfd
- eventfd_t value;
- eventfd_read(fds[0], &value);
- } else
+# ifdef EFD_CLOEXEC
+ eventfd_t value;
+ eventfd_read(fds[0], &value);
# endif
- {
+ if (!UsingEventfd) {
while (::read(fds[0], c, sizeof(c)) > 0) {}
}
#endif
@@ -231,7 +179,7 @@ QEventDispatcherUNIXPrivate::QEventDispatcherUNIXPrivate()
QEventDispatcherUNIXPrivate::~QEventDispatcherUNIXPrivate()
{
// cleanup timers
- qDeleteAll(timerList);
+ timerList.clearTimers();
}
void QEventDispatcherUNIXPrivate::setSocketNotifierPending(QSocketNotifier *notifier)
@@ -251,7 +199,7 @@ int QEventDispatcherUNIXPrivate::activateTimers()
void QEventDispatcherUNIXPrivate::markPendingSocketNotifiers()
{
- for (const pollfd &pfd : qAsConst(pollfds)) {
+ for (const pollfd &pfd : std::as_const(pollfds)) {
if (pfd.fd < 0 || pfd.revents == 0)
continue;
@@ -309,11 +257,11 @@ int QEventDispatcherUNIXPrivate::activateSocketNotifiers()
}
QEventDispatcherUNIX::QEventDispatcherUNIX(QObject *parent)
- : QAbstractEventDispatcher(*new QEventDispatcherUNIXPrivate, parent)
+ : QAbstractEventDispatcherV2(*new QEventDispatcherUNIXPrivate, parent)
{ }
QEventDispatcherUNIX::QEventDispatcherUNIX(QEventDispatcherUNIXPrivate &dd, QObject *parent)
- : QAbstractEventDispatcher(dd, parent)
+ : QAbstractEventDispatcherV2(dd, parent)
{ }
QEventDispatcherUNIX::~QEventDispatcherUNIX()
@@ -322,10 +270,10 @@ QEventDispatcherUNIX::~QEventDispatcherUNIX()
/*!
\internal
*/
-void QEventDispatcherUNIX::registerTimer(int timerId, qint64 interval, Qt::TimerType timerType, QObject *obj)
+void QEventDispatcherUNIX::registerTimer(Qt::TimerId timerId, Duration interval, Qt::TimerType timerType, QObject *obj)
{
#ifndef QT_NO_DEBUG
- if (timerId < 1 || interval < 0 || !obj) {
+ if (qToUnderlying(timerId) < 1 || interval.count() < 0 || !obj) {
qWarning("QEventDispatcherUNIX::registerTimer: invalid arguments");
return;
} else if (obj->thread() != thread() || thread() != QThread::currentThread()) {
@@ -341,10 +289,10 @@ void QEventDispatcherUNIX::registerTimer(int timerId, qint64 interval, Qt::Timer
/*!
\internal
*/
-bool QEventDispatcherUNIX::unregisterTimer(int timerId)
+bool QEventDispatcherUNIX::unregisterTimer(Qt::TimerId timerId)
{
#ifndef QT_NO_DEBUG
- if (timerId < 1) {
+ if (qToUnderlying(timerId) < 1) {
qWarning("QEventDispatcherUNIX::unregisterTimer: invalid argument");
return false;
} else if (thread() != QThread::currentThread()) {
@@ -376,12 +324,12 @@ bool QEventDispatcherUNIX::unregisterTimers(QObject *object)
return d->timerList.unregisterTimers(object);
}
-QList<QEventDispatcherUNIX::TimerInfo>
-QEventDispatcherUNIX::registeredTimers(QObject *object) const
+QList<QEventDispatcherUNIX::TimerInfoV2>
+QEventDispatcherUNIX::timersForObject(QObject *object) const
{
if (!object) {
qWarning("QEventDispatcherUNIX:registeredTimers: invalid argument");
- return QList<TimerInfo>();
+ return QList<TimerInfoV2>();
}
Q_D(const QEventDispatcherUNIX);
@@ -481,11 +429,19 @@ bool QEventDispatcherUNIX::processEvents(QEventLoop::ProcessEventsFlags flags)
if (d->interrupt.loadRelaxed())
return false;
- timespec *tm = nullptr;
- timespec wait_tm = { 0, 0 };
-
- if (!canWait || (include_timers && d->timerList.timerWait(wait_tm)))
- tm = &wait_tm;
+ QDeadlineTimer deadline;
+ if (canWait) {
+ if (include_timers) {
+ std::optional<nanoseconds> remaining = d->timerList.timerWait();
+ deadline = remaining ? QDeadlineTimer{*remaining}
+ : QDeadlineTimer(QDeadlineTimer::Forever);
+ } else {
+ deadline = QDeadlineTimer(QDeadlineTimer::Forever);
+ }
+ } else {
+ // Using the default-constructed `deadline`, which is already expired,
+ // ensures the code in the do-while loop in qt_safe_poll runs at least once.
+ }
d->pollfds.clear();
d->pollfds.reserve(1 + (include_notifiers ? d->socketNotifiers.size() : 0));
@@ -498,10 +454,11 @@ bool QEventDispatcherUNIX::processEvents(QEventLoop::ProcessEventsFlags flags)
d->pollfds.append(d->threadPipe.prepare());
int nevents = 0;
-
- switch (qt_safe_poll(d->pollfds.data(), d->pollfds.size(), tm)) {
+ switch (qt_safe_poll(d->pollfds.data(), d->pollfds.size(), deadline)) {
case -1:
- perror("qt_safe_poll");
+ qErrnoWarning("qt_safe_poll");
+ if (QT_CONFIG(poll_exit_on_error))
+ abort();
break;
case 0:
break;
@@ -519,17 +476,17 @@ bool QEventDispatcherUNIX::processEvents(QEventLoop::ProcessEventsFlags flags)
return (nevents > 0);
}
-int QEventDispatcherUNIX::remainingTime(int timerId)
+auto QEventDispatcherUNIX::remainingTime(Qt::TimerId timerId) const -> Duration
{
#ifndef QT_NO_DEBUG
- if (timerId < 1) {
+ if (int(timerId) < 1) {
qWarning("QEventDispatcherUNIX::remainingTime: invalid argument");
- return -1;
+ return Duration::min();
}
#endif
- Q_D(QEventDispatcherUNIX);
- return d->timerList.timerRemainingTime(timerId);
+ Q_D(const QEventDispatcherUNIX);
+ return d->timerList.remainingDuration(timerId);
}
void QEventDispatcherUNIX::wakeUp()
diff --git a/src/corelib/kernel/qeventdispatcher_unix_p.h b/src/corelib/kernel/qeventdispatcher_unix_p.h
index 38115c1e2c..6596e998c9 100644
--- a/src/corelib/kernel/qeventdispatcher_unix_p.h
+++ b/src/corelib/kernel/qeventdispatcher_unix_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QEVENTDISPATCHER_UNIX_P_H
#define QEVENTDISPATCHER_UNIX_P_H
@@ -56,6 +20,7 @@
#include "private/qabstracteventdispatcher_p.h"
#include "private/qcore_unix_p.h"
#include "QtCore/qvarlengtharray.h"
+#include "QtCore/qhash.h"
#include "private/qtimerinfo_unix_p.h"
QT_BEGIN_NAMESPACE
@@ -86,17 +51,17 @@ struct QThreadPipe
int check(const pollfd &pfd);
// note for eventfd(7) support:
- // if fds[1] is -1, then eventfd(7) is in use and is stored in fds[0]
- int fds[2];
+ // fds[0] stores the eventfd, fds[1] is unused
+ int fds[2] = { -1, -1 };
QAtomicInt wakeUps;
#if defined(Q_OS_VXWORKS)
- static const int len_name = 20;
- char name[len_name];
+ static constexpr int len_name = 20;
+ char name[len_name] = {};
#endif
};
-class Q_CORE_EXPORT QEventDispatcherUNIX : public QAbstractEventDispatcher
+class Q_CORE_EXPORT QEventDispatcherUNIX : public QAbstractEventDispatcherV2
{
Q_OBJECT
Q_DECLARE_PRIVATE(QEventDispatcherUNIX)
@@ -110,12 +75,12 @@ public:
void registerSocketNotifier(QSocketNotifier *notifier) final;
void unregisterSocketNotifier(QSocketNotifier *notifier) final;
- void registerTimer(int timerId, qint64 interval, Qt::TimerType timerType, QObject *object) final;
- bool unregisterTimer(int timerId) final;
- bool unregisterTimers(QObject *object) final;
- QList<TimerInfo> registeredTimers(QObject *object) const final;
-
- int remainingTime(int timerId) final;
+ void registerTimer(Qt::TimerId timerId, Duration interval, Qt::TimerType timerType,
+ QObject *object) override final;
+ bool unregisterTimer(Qt::TimerId timerId) override final;
+ bool unregisterTimers(QObject *object) override final;
+ QList<TimerInfoV2> timersForObject(QObject *object) const override final;
+ Duration remainingTime(Qt::TimerId timerId) const override final;
void wakeUp() override;
void interrupt() final;
diff --git a/src/corelib/kernel/qeventdispatcher_wasm.cpp b/src/corelib/kernel/qeventdispatcher_wasm.cpp
index b499cf91fe..4aa435b64b 100644
--- a/src/corelib/kernel/qeventdispatcher_wasm.cpp
+++ b/src/corelib/kernel/qeventdispatcher_wasm.cpp
@@ -1,60 +1,34 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qeventdispatcher_wasm_p.h"
+#include <QtCore/private/qabstracteventdispatcher_p.h> // for qGlobalPostedEventsCount()
#include <QtCore/qcoreapplication.h>
#include <QtCore/qthread.h>
+#include <QtCore/qsocketnotifier.h>
+#include <QtCore/private/qstdweb_p.h>
#include "emscripten.h"
#include <emscripten/html5.h>
#include <emscripten/threading.h>
+#include <emscripten/val.h>
+
+using namespace std::chrono;
+using namespace std::chrono_literals;
QT_BEGIN_NAMESPACE
// using namespace emscripten;
-extern int qGlobalPostedEventsCount(); // from qapplication.cpp
Q_LOGGING_CATEGORY(lcEventDispatcher, "qt.eventdispatcher");
Q_LOGGING_CATEGORY(lcEventDispatcherTimers, "qt.eventdispatcher.timers");
-#ifdef QT_HAVE_EMSCRIPTEN_ASYNCIFY
+#if QT_CONFIG(thread)
+#define LOCK_GUARD(M) std::lock_guard<std::mutex> lock(M)
+#else
+#define LOCK_GUARD(M)
+#endif
// Emscripten asyncify currently supports one level of suspend -
// recursion is not permitted. We track the suspend state here
@@ -62,10 +36,64 @@ Q_LOGGING_CATEGORY(lcEventDispatcherTimers, "qt.eventdispatcher.timers");
// track Qts own usage of asyncify.
static bool g_is_asyncify_suspended = false;
+#if defined(QT_STATIC)
+
+static bool useAsyncify()
+{
+ return qstdweb::haveAsyncify();
+}
+
+static bool useJspi()
+{
+ return qstdweb::haveJspi();
+}
+
+// clang-format off
+EM_ASYNC_JS(void, qt_jspi_suspend_js, (), {
+ ++Module.qtJspiSuspensionCounter;
+
+ await new Promise(resolve => {
+ Module.qtAsyncifyWakeUp.push(resolve);
+ });
+});
+
+EM_JS(bool, qt_jspi_resume_js, (), {
+ if (!Module.qtJspiSuspensionCounter)
+ return false;
+
+ --Module.qtJspiSuspensionCounter;
+
+ setTimeout(() => {
+ const wakeUp = (Module.qtAsyncifyWakeUp ?? []).pop();
+ if (wakeUp) wakeUp();
+ });
+ return true;
+});
+
+EM_JS(bool, qt_jspi_can_resume_js, (), {
+ return Module.qtJspiSuspensionCounter > 0;
+});
+
+EM_JS(void, init_jspi_support_js, (), {
+ Module.qtAsyncifyWakeUp = [];
+ Module.qtJspiSuspensionCounter = 0;
+});
+// clang-format on
+
+void initJspiSupport() {
+ init_jspi_support_js();
+}
+
+Q_CONSTRUCTOR_FUNCTION(initJspiSupport);
+
+// clang-format off
EM_JS(void, qt_asyncify_suspend_js, (), {
+ if (Module.qtSuspendId === undefined)
+ Module.qtSuspendId = 0;
let sleepFn = (wakeUp) => {
Module.qtAsyncifyWakeUp = wakeUp;
};
+ ++Module.qtSuspendId;
return Asyncify.handleSleep(sleepFn);
});
@@ -74,11 +102,61 @@ EM_JS(void, qt_asyncify_resume_js, (), {
if (wakeUp == undefined)
return;
Module.qtAsyncifyWakeUp = undefined;
+ const suspendId = Module.qtSuspendId;
// Delayed wakeup with zero-timer. Workaround/fix for
// https://github.com/emscripten-core/emscripten/issues/10515
- setTimeout(wakeUp);
+ setTimeout(() => {
+ // Another suspend occurred while the timeout was in queue.
+ if (Module.qtSuspendId !== suspendId)
+ return;
+ wakeUp();
+ });
});
+// clang-format on
+
+#else
+
+// EM_JS is not supported for side modules; disable asyncify
+
+static bool useAsyncify()
+{
+ return false;
+}
+
+static bool useJspi()
+{
+ return false;
+}
+
+void qt_jspi_suspend_js()
+{
+ Q_UNREACHABLE();
+}
+
+bool qt_jspi_resume_js()
+{
+ Q_UNREACHABLE();
+ return false;
+}
+
+bool qt_jspi_can_resume_js()
+{
+ Q_UNREACHABLE();
+ return false;
+}
+
+void qt_asyncify_suspend_js()
+{
+ Q_UNREACHABLE();
+}
+
+void qt_asyncify_resume_js()
+{
+ Q_UNREACHABLE();
+}
+
+#endif // defined(QT_STATIC)
// Suspends the main thread until qt_asyncify_resume() is called. Returns
// false immediately if Qt has already suspended the main thread (recursive
@@ -95,36 +173,27 @@ bool qt_asyncify_suspend()
// Wakes any currently suspended main thread. Returns true if the main
// thread was suspended, in which case it will now be asynchronously woken.
-bool qt_asyncify_resume()
+void qt_asyncify_resume()
{
if (!g_is_asyncify_suspended)
- return false;
+ return;
g_is_asyncify_suspended = false;
qt_asyncify_resume_js();
- return true;
-}
-
-// Yields control to the browser, so that it can process events. Must
-// be called on the main thread. Returns false immediately if Qt has
-// already suspended the main thread. Returns true after yielding.
-bool qt_asyncify_yield()
-{
- if (g_is_asyncify_suspended)
- return false;
- emscripten_sleep(0);
- return true;
}
-#endif // QT_HAVE_EMSCRIPTEN_ASYNCIFY
-QEventDispatcherWasm *QEventDispatcherWasm::g_mainThreadEventDispatcher = nullptr;
+Q_CONSTINIT QEventDispatcherWasm *QEventDispatcherWasm::g_mainThreadEventDispatcher = nullptr;
#if QT_CONFIG(thread)
-QVector<QEventDispatcherWasm *> QEventDispatcherWasm::g_secondaryThreadEventDispatchers;
-std::mutex QEventDispatcherWasm::g_secondaryThreadEventDispatchersMutex;
+Q_CONSTINIT QVector<QEventDispatcherWasm *> QEventDispatcherWasm::g_secondaryThreadEventDispatchers;
+Q_CONSTINIT std::mutex QEventDispatcherWasm::g_staticDataMutex;
+emscripten::ProxyingQueue QEventDispatcherWasm::g_proxyingQueue;
+pthread_t QEventDispatcherWasm::g_mainThread;
#endif
+// ### dynamic initialization:
+std::multimap<int, QSocketNotifier *> QEventDispatcherWasm::g_socketNotifiers;
+std::map<int, QEventDispatcherWasm::SocketReadyState> QEventDispatcherWasm::g_socketState;
QEventDispatcherWasm::QEventDispatcherWasm()
- : QAbstractEventDispatcher()
{
// QEventDispatcherWasm operates in two main modes:
// - On the main thread:
@@ -146,9 +215,18 @@ QEventDispatcherWasm::QEventDispatcherWasm()
// dispatchers so we set a global pointer to it.
Q_ASSERT(g_mainThreadEventDispatcher == nullptr);
g_mainThreadEventDispatcher = this;
+#if QT_CONFIG(thread)
+ g_mainThread = pthread_self();
+#endif
+
+ // Call the "onLoaded" JavaScript callback, unless startup tasks
+ // have been registered which should complete first. Run async
+ // to make sure event dispatcher construction (in particular any
+ // subclass construction) has completed first.
+ runAsync(callOnLoadedIfRequired);
} else {
#if QT_CONFIG(thread)
- std::lock_guard<std::mutex> lock(g_secondaryThreadEventDispatchersMutex);
+ std::lock_guard<std::mutex> lock(g_staticDataMutex);
g_secondaryThreadEventDispatchers.append(this);
#endif
}
@@ -162,14 +240,26 @@ QEventDispatcherWasm::~QEventDispatcherWasm()
#if QT_CONFIG(thread)
if (isSecondaryThreadEventDispatcher()) {
- std::lock_guard<std::mutex> lock(g_secondaryThreadEventDispatchersMutex);
+ std::lock_guard<std::mutex> lock(g_staticDataMutex);
g_secondaryThreadEventDispatchers.remove(g_secondaryThreadEventDispatchers.indexOf(this));
} else
#endif
{
if (m_timerId > 0)
emscripten_clear_timeout(m_timerId);
+ if (!g_socketNotifiers.empty()) {
+ qWarning("QEventDispatcherWasm: main thread event dispatcher deleted with active socket notifiers");
+ clearEmscriptenSocketCallbacks();
+ g_socketNotifiers.clear();
+ }
g_mainThreadEventDispatcher = nullptr;
+ if (!g_socketNotifiers.empty()) {
+ qWarning("QEventDispatcherWasm: main thread event dispatcher deleted with active socket notifiers");
+ clearEmscriptenSocketCallbacks();
+ g_socketNotifiers.clear();
+ }
+
+ g_socketState.clear();
}
}
@@ -183,14 +273,22 @@ bool QEventDispatcherWasm::isSecondaryThreadEventDispatcher()
return this != g_mainThreadEventDispatcher;
}
-bool QEventDispatcherWasm::processEvents(QEventLoop::ProcessEventsFlags flags)
+bool QEventDispatcherWasm::isValidEventDispatcherPointer(QEventDispatcherWasm *eventDispatcher)
{
- emit awake();
+ if (eventDispatcher == g_mainThreadEventDispatcher)
+ return true;
+#if QT_CONFIG(thread)
+ if (g_secondaryThreadEventDispatchers.contains(eventDispatcher))
+ return true;
+#endif
+ return false;
+}
- bool hasPendingEvents = qGlobalPostedEventsCount() > 0;
+bool QEventDispatcherWasm::processEvents(QEventLoop::ProcessEventsFlags flags)
+{
+ qCDebug(lcEventDispatcher) << "QEventDispatcherWasm::processEvents flags" << flags;
- qCDebug(lcEventDispatcher) << "QEventDispatcherWasm::processEvents flags" << flags
- << "pending events" << hasPendingEvents;
+ emit awake();
if (isMainThreadEventDispatcher()) {
if (flags & QEventLoop::DialogExec)
@@ -199,45 +297,68 @@ bool QEventDispatcherWasm::processEvents(QEventLoop::ProcessEventsFlags flags)
handleApplicationExec();
}
- if (!(flags & QEventLoop::ExcludeUserInputEvents))
- pollForNativeEvents();
+#if QT_CONFIG(thread)
+ {
+ // Reset wakeUp state: if wakeUp() was called at some point before
+ // this then processPostedEvents() below will service that call.
+ std::unique_lock<std::mutex> lock(m_mutex);
+ m_wakeUpCalled = false;
+ }
+#endif
- hasPendingEvents = qGlobalPostedEventsCount() > 0;
+ processPostedEvents();
- if (!hasPendingEvents && (flags & QEventLoop::WaitForMoreEvents))
- waitForForEvents();
+ // The processPostedEvents() call above may process an event which deletes the
+ // application object and the event dispatcher; stop event processing in that case.
+ if (!isValidEventDispatcherPointer(this))
+ return false;
if (m_interrupted) {
m_interrupted = false;
return false;
}
+ if (flags & QEventLoop::WaitForMoreEvents)
+ wait();
+
if (m_processTimers) {
m_processTimers = false;
processTimers();
}
- hasPendingEvents = qGlobalPostedEventsCount() > 0;
- QCoreApplication::sendPostedEvents();
- return hasPendingEvents;
+ return false;
}
void QEventDispatcherWasm::registerSocketNotifier(QSocketNotifier *notifier)
{
- Q_UNUSED(notifier);
- qWarning("QEventDispatcherWasm::registerSocketNotifier: socket notifiers are not supported");
+ LOCK_GUARD(g_staticDataMutex);
+
+ bool wasEmpty = g_socketNotifiers.empty();
+ g_socketNotifiers.insert({notifier->socket(), notifier});
+ if (wasEmpty)
+ runOnMainThread([] { setEmscriptenSocketCallbacks(); });
}
void QEventDispatcherWasm::unregisterSocketNotifier(QSocketNotifier *notifier)
{
- Q_UNUSED(notifier);
- qWarning("QEventDispatcherWasm::unregisterSocketNotifier: socket notifiers are not supported");
+ LOCK_GUARD(g_staticDataMutex);
+
+ auto notifiers = g_socketNotifiers.equal_range(notifier->socket());
+ for (auto it = notifiers.first; it != notifiers.second; ++it) {
+ if (it->second == notifier) {
+ g_socketNotifiers.erase(it);
+ break;
+ }
+ }
+
+ if (g_socketNotifiers.empty())
+ runOnMainThread([] { clearEmscriptenSocketCallbacks(); });
}
-void QEventDispatcherWasm::registerTimer(int timerId, qint64 interval, Qt::TimerType timerType, QObject *object)
+void QEventDispatcherWasm::registerTimer(Qt::TimerId timerId, Duration interval, Qt::TimerType timerType, QObject *object)
{
#ifndef QT_NO_DEBUG
- if (timerId < 1 || interval < 0 || !object) {
+ if (qToUnderlying(timerId) < 1 || interval < 0ns || !object) {
qWarning("QEventDispatcherWasm::registerTimer: invalid arguments");
return;
} else if (object->thread() != thread() || thread() != QThread::currentThread()) {
@@ -246,16 +367,16 @@ void QEventDispatcherWasm::registerTimer(int timerId, qint64 interval, Qt::Timer
return;
}
#endif
- qCDebug(lcEventDispatcherTimers) << "registerTimer" << timerId << interval << timerType << object;
+ qCDebug(lcEventDispatcherTimers) << "registerTimer" << int(timerId) << interval << timerType << object;
m_timerInfo->registerTimer(timerId, interval, timerType, object);
updateNativeTimer();
}
-bool QEventDispatcherWasm::unregisterTimer(int timerId)
+bool QEventDispatcherWasm::unregisterTimer(Qt::TimerId timerId)
{
#ifndef QT_NO_DEBUG
- if (timerId < 1) {
+ if (qToUnderlying(timerId) < 1) {
qWarning("QEventDispatcherWasm::unregisterTimer: invalid argument");
return false;
} else if (thread() != QThread::currentThread()) {
@@ -265,7 +386,7 @@ bool QEventDispatcherWasm::unregisterTimer(int timerId)
}
#endif
- qCDebug(lcEventDispatcherTimers) << "unregisterTimer" << timerId;
+ qCDebug(lcEventDispatcherTimers) << "unregisterTimer" << int(timerId);
bool ans = m_timerInfo->unregisterTimer(timerId);
updateNativeTimer();
@@ -292,22 +413,22 @@ bool QEventDispatcherWasm::unregisterTimers(QObject *object)
return ans;
}
-QList<QAbstractEventDispatcher::TimerInfo>
-QEventDispatcherWasm::registeredTimers(QObject *object) const
+QList<QAbstractEventDispatcher::TimerInfoV2>
+QEventDispatcherWasm::timersForObject(QObject *object) const
{
#ifndef QT_NO_DEBUG
if (!object) {
qWarning("QEventDispatcherWasm:registeredTimers: invalid argument");
- return QList<TimerInfo>();
+ return {};
}
#endif
return m_timerInfo->registeredTimers(object);
}
-int QEventDispatcherWasm::remainingTime(int timerId)
+QEventDispatcherWasm::Duration QEventDispatcherWasm::remainingTime(Qt::TimerId timerId) const
{
- return m_timerInfo->timerRemainingTime(timerId);
+ return m_timerInfo->remainingDuration(timerId);
}
void QEventDispatcherWasm::interrupt()
@@ -318,40 +439,24 @@ void QEventDispatcherWasm::interrupt()
void QEventDispatcherWasm::wakeUp()
{
-#if QT_CONFIG(thread)
- if (isSecondaryThreadEventDispatcher()) {
- std::lock_guard<std::mutex> lock(m_mutex);
- m_wakeUpCalled = true;
- m_moreEvents.notify_one();
- return;
- }
-#endif
-
-#ifdef QT_HAVE_EMSCRIPTEN_ASYNCIFY
- // The main thread may be asyncify-blocked in processEvents(). If so resume it.
- if (qt_asyncify_resume()) // ### safe to call from secondary thread?
- return;
-#endif
-
- {
-#if QT_CONFIG(thread)
- // This function can be called from any thread (via wakeUp()),
- // so we need to lock access to m_pendingProcessEvents.
- std::lock_guard<std::mutex> lock(m_mutex);
-#endif
- if (m_pendingProcessEvents)
- return;
- m_pendingProcessEvents = true;
- }
-
-#if QT_CONFIG(thread)
- if (!emscripten_is_main_runtime_thread()) {
- runOnMainThread([this](){
- QEventDispatcherWasm::callProcessEvents(this);
+ // The event dispatcher thread may be blocked or suspended by
+ // wait(), or control may have been returned to the browser's
+ // event loop. Make sure the thread is unblocked or make it
+ // process events.
+ bool wasBlocked = wakeEventDispatcherThread();
+ // JSPI does not need a scheduled call to processPostedEvents, as the stack is not unwound
+ // at startup.
+ if (!qstdweb::haveJspi() && !wasBlocked && isMainThreadEventDispatcher()) {
+ {
+ LOCK_GUARD(m_mutex);
+ if (m_pendingProcessEvents)
+ return;
+ m_pendingProcessEvents = true;
+ }
+ runOnMainThreadAsync([this](){
+ QEventDispatcherWasm::callProcessPostedEvents(this);
});
- } else
-#endif
- emscripten_async_call(&QEventDispatcherWasm::callProcessEvents, this, 0);
+ }
}
void QEventDispatcherWasm::handleApplicationExec()
@@ -364,75 +469,108 @@ void QEventDispatcherWasm::handleApplicationExec()
// Note that we don't use asyncify here: Emscripten supports one level of
// asyncify only and we want to reserve that for dialog exec() instead of
// using it for the one qApp exec().
- const bool simulateInfiniteLoop = true;
- emscripten_set_main_loop([](){
- emscripten_pause_main_loop();
- }, 0, simulateInfiniteLoop);
+ // When JSPI is used, awaited async calls are allowed to be nested, so we
+ // proceed normally.
+ if (!qstdweb::haveJspi()) {
+ const bool simulateInfiniteLoop = true;
+ emscripten_set_main_loop([](){
+ emscripten_pause_main_loop();
+ }, 0, simulateInfiniteLoop);
+ }
}
void QEventDispatcherWasm::handleDialogExec()
{
-#ifndef QT_HAVE_EMSCRIPTEN_ASYNCIFY
- qWarning() << "Warning: dialog exec() is not supported on Qt for WebAssembly in this"
- << "configuration. Please use show() instead, or enable experimental support"
- << "for asyncify.\n"
- << "When using exec() (without asyncify) the dialog will show, the user can interact"
- << "with it and the appropriate signals will be emitted on close. However, the"
- << "exec() call never returns, stack content at the time of the exec() call"
- << "is leaked, and the exec() call may interfere with input event processing";
- emscripten_sleep(1); // This call never returns
-#endif
- // For the asyncify case we do nothing here and wait for events in waitForForEvents()
+ if (!useAsyncify()) {
+ qWarning() << "Warning: exec() is not supported on Qt for WebAssembly in this configuration. Please build"
+ << "with asyncify support, or use an asynchronous API like QDialog::open()";
+ emscripten_sleep(1); // This call never returns
+ }
+ // For the asyncify case we do nothing here and wait for events in wait()
}
-void QEventDispatcherWasm::pollForNativeEvents()
+// Blocks/suspends the calling thread. This is possible in two cases:
+// - Caller is a secondary thread: block on m_moreEvents
+// - Caller is the main thread and asyncify is enabled: suspend using qt_asyncify_suspend()
+// Returns false if the wait timed out.
+bool QEventDispatcherWasm::wait(int timeout)
{
- // Secondary thread event dispatchers do not support native events
- if (isSecondaryThreadEventDispatcher())
- return;
+#if QT_CONFIG(thread)
+ using namespace std::chrono_literals;
+ Q_ASSERT(QThread::currentThread() == thread());
+
+ if (isSecondaryThreadEventDispatcher()) {
+ std::unique_lock<std::mutex> lock(m_mutex);
+
+ // If wakeUp() was called there might be pending events in the event
+ // queue which should be processed. Don't block, instead return
+ // so that the event loop can spin and call processEvents() again.
+ if (m_wakeUpCalled)
+ return true;
-#if HAVE_EMSCRIPTEN_ASYNCIFY
- // Asyncify allows us to yield to the browser and have it process native events -
- // but this will fail if we are recursing and are already in a yield.
- bool didYield = qt_asyncify_yield();
- if (!didYield)
- qWarning("QEventDispatcherWasm::processEvents() did not asyncify process native events");
+ auto wait_time = timeout > 0 ? timeout * 1ms : std::chrono::duration<int, std::micro>::max();
+ bool wakeUpCalled = m_moreEvents.wait_for(lock, wait_time, [=] { return m_wakeUpCalled; });
+ return wakeUpCalled;
+ }
#endif
+ Q_ASSERT(emscripten_is_main_runtime_thread());
+ Q_ASSERT(isMainThreadEventDispatcher());
+ if (useAsyncify()) {
+ if (timeout > 0)
+ qWarning() << "QEventDispatcherWasm asyncify wait with timeout is not supported; timeout will be ignored"; // FIXME
+
+ if (useJspi()) {
+ qt_jspi_suspend_js();
+ } else {
+ bool didSuspend = qt_asyncify_suspend();
+ if (!didSuspend) {
+ qWarning("QEventDispatcherWasm: current thread is already suspended; could not asyncify wait for events");
+ return false;
+ }
+ }
+ return true;
+ } else {
+ qWarning("QEventLoop::WaitForMoreEvents is not supported on the main thread without asyncify");
+ Q_UNUSED(timeout);
+ }
+ return false;
}
-// Waits for more events. This is possible in two cases:
-// - On a secondary thread
-// - On the main thread iff asyncify is used
-// Returns true if waiting was possible (at which point it
-// has already happened).
-bool QEventDispatcherWasm::waitForForEvents()
+// Wakes a blocked/suspended event dispatcher thread. Returns true if the
+// thread is unblocked or was resumed, false if the thread state could not
+// be determined.
+bool QEventDispatcherWasm::wakeEventDispatcherThread()
{
#if QT_CONFIG(thread)
if (isSecondaryThreadEventDispatcher()) {
- std::unique_lock<std::mutex> lock(m_mutex);
- m_moreEvents.wait(lock, [=] { return m_wakeUpCalled; });
- m_wakeUpCalled = false;
+ std::lock_guard<std::mutex> lock(m_mutex);
+ m_wakeUpCalled = true;
+ m_moreEvents.notify_one();
return true;
}
#endif
+ Q_ASSERT(isMainThreadEventDispatcher());
+ if (useJspi()) {
- Q_ASSERT(emscripten_is_main_runtime_thread());
-
-#ifdef QT_HAVE_EMSCRIPTEN_ASYNCIFY
- // We can block on the main thread using asyncify:
- bool didSuspend = qt_asyncify_suspend();
- if (!didSuspend)
- qWarning("QEventDispatcherWasm: current thread is already suspended; could not asyncify wait for events");
- return didSuspend;
+#if QT_CONFIG(thread)
+ return qstdweb::runTaskOnMainThread<bool>(
+ []() { return qt_jspi_can_resume_js() && qt_jspi_resume_js(); }, &g_proxyingQueue);
#else
- qWarning("QEventLoop::WaitForMoreEvents is not supported on the main thread without asyncify");
- return false;
+ return qstdweb::runTaskOnMainThread<bool>(
+ []() { return qt_jspi_can_resume_js() && qt_jspi_resume_js(); });
#endif
+
+ } else {
+ if (!g_is_asyncify_suspended)
+ return false;
+ runOnMainThread([]() { qt_asyncify_resume(); });
+ }
+ return true;
}
// Process event activation callbacks for the main thread event dispatcher.
// Must be called on the main thread.
-void QEventDispatcherWasm::callProcessEvents(void *context)
+void QEventDispatcherWasm::callProcessPostedEvents(void *context)
{
Q_ASSERT(emscripten_is_main_runtime_thread());
@@ -440,19 +578,24 @@ void QEventDispatcherWasm::callProcessEvents(void *context)
if (!g_mainThreadEventDispatcher)
return;
- // In the unlikely event that we get a callProcessEvents() call for
+ // In the unlikely event that we get a callProcessPostedEvents() call for
// a previous main thread event dispatcher (i.e. the QApplication
// object was deleted and created again): just ignore it and return.
if (context != g_mainThreadEventDispatcher)
return;
{
-#if QT_CONFIG(thread)
- std::lock_guard<std::mutex> lock(g_mainThreadEventDispatcher->m_mutex);
-#endif
+ LOCK_GUARD(g_mainThreadEventDispatcher->m_mutex);
g_mainThreadEventDispatcher->m_pendingProcessEvents = false;
}
- g_mainThreadEventDispatcher->processEvents(QEventLoop::AllEvents);
+
+ g_mainThreadEventDispatcher->processPostedEvents();
+}
+
+bool QEventDispatcherWasm::processPostedEvents()
+{
+ QCoreApplication::sendPostedEvents();
+ return false;
}
void QEventDispatcherWasm::processTimers()
@@ -476,55 +619,48 @@ void QEventDispatcherWasm::updateNativeTimer()
// access to m_timerInfo), and then call native API to set the new
// wakeup time on the main thread.
- auto timespecToNanosec = [](timespec ts) -> uint64_t {
- return ts.tv_sec * 1000 + ts.tv_nsec / (1000 * 1000);
- };
- timespec toWait;
- bool hasTimer = m_timerInfo->timerWait(toWait);
- uint64_t currentTime = timespecToNanosec(m_timerInfo->currentTime);
- uint64_t toWaitDuration = timespecToNanosec(toWait);
- uint64_t newTargetTime = currentTime + toWaitDuration;
-
- auto maintainNativeTimer = [this, hasTimer, toWaitDuration, newTargetTime]() {
+ const std::optional<std::chrono::nanoseconds> wait = m_timerInfo->timerWait();
+ const auto toWaitDuration = duration_cast<milliseconds>(wait.value_or(0ms));
+ const auto newTargetTimePoint = m_timerInfo->currentTime + toWaitDuration;
+ auto epochNsecs = newTargetTimePoint.time_since_epoch();
+ auto newTargetTime = std::chrono::duration_cast<std::chrono::milliseconds>(epochNsecs);
+ auto maintainNativeTimer = [this, wait, toWaitDuration, newTargetTime]() {
Q_ASSERT(emscripten_is_main_runtime_thread());
- if (!hasTimer) {
+ if (!wait) {
if (m_timerId > 0) {
emscripten_clear_timeout(m_timerId);
m_timerId = 0;
+ m_timerTargetTime = 0ms;
}
return;
}
- if (m_timerTargetTime != 0 && newTargetTime >= m_timerTargetTime)
+ if (m_timerTargetTime != 0ms && newTargetTime >= m_timerTargetTime)
return; // existing timer is good
qCDebug(lcEventDispatcherTimers)
- << "Created new native timer with wait" << toWaitDuration << "timeout" << newTargetTime;
+ << "Created new native timer with wait" << toWaitDuration.count() << "ms"
+ << "timeout" << newTargetTime.count() << "ms";
emscripten_clear_timeout(m_timerId);
- m_timerId = emscripten_set_timeout(&QEventDispatcherWasm::callProcessTimers, toWaitDuration, this);
+ m_timerId = emscripten_set_timeout(&QEventDispatcherWasm::callProcessTimers,
+ toWaitDuration.count(), this);
m_timerTargetTime = newTargetTime;
};
// Update the native timer for this thread/dispatcher. This must be
// done on the main thread where we have access to native API.
+ runOnMainThread([this, maintainNativeTimer]() {
+ Q_ASSERT(emscripten_is_main_runtime_thread());
-#if QT_CONFIG(thread)
- if (isSecondaryThreadEventDispatcher()) {
- runOnMainThread([this, maintainNativeTimer]() {
- Q_ASSERT(emscripten_is_main_runtime_thread());
-
- // "this" may have been deleted, or may be about to be deleted.
- // Check if the pointer we have is still a valid event dispatcher,
- // and keep the mutex locked while updating the native timer to
- // prevent it from being deleted.
- std::lock_guard<std::mutex> lock(g_secondaryThreadEventDispatchersMutex);
- if (g_secondaryThreadEventDispatchers.contains(this))
- maintainNativeTimer();
- });
- } else
-#endif
- maintainNativeTimer();
+ // "this" may have been deleted, or may be about to be deleted.
+ // Check if the pointer we have is still a valid event dispatcher,
+ // and keep the mutex locked while updating the native timer to
+ // prevent it from being deleted.
+ LOCK_GUARD(g_staticDataMutex);
+ if (isValidEventDispatcherPointer(this))
+ maintainNativeTimer();
+ });
}
// Static timer activation callback. Must be called on the main thread
@@ -534,45 +670,331 @@ void QEventDispatcherWasm::callProcessTimers(void *context)
{
Q_ASSERT(emscripten_is_main_runtime_thread());
-
// Note: "context" may be a stale pointer here,
// take care before casting and dereferencing!
// Process timers on this thread if this is the main event dispatcher
if (reinterpret_cast<QEventDispatcherWasm *>(context) == g_mainThreadEventDispatcher) {
- g_mainThreadEventDispatcher->m_timerTargetTime = 0;
+ g_mainThreadEventDispatcher->m_timerTargetTime = 0ms;
g_mainThreadEventDispatcher->processTimers();
return;
}
// Wake and process timers on the secondary thread if this a secondary thread dispatcher
#if QT_CONFIG(thread)
- std::lock_guard<std::mutex> lock(g_secondaryThreadEventDispatchersMutex);
+ std::lock_guard<std::mutex> lock(g_staticDataMutex);
if (g_secondaryThreadEventDispatchers.contains(context)) {
QEventDispatcherWasm *eventDispatcher = reinterpret_cast<QEventDispatcherWasm *>(context);
- eventDispatcher->m_timerTargetTime = 0;
+ eventDispatcher->m_timerTargetTime = 0ms;
eventDispatcher->m_processTimers = true;
eventDispatcher->wakeUp();
}
#endif
}
-#if QT_CONFIG(thread)
+void QEventDispatcherWasm::setEmscriptenSocketCallbacks()
+{
+ qCDebug(lcEventDispatcher) << "setEmscriptenSocketCallbacks";
+
+ emscripten_set_socket_error_callback(nullptr, QEventDispatcherWasm::socketError);
+ emscripten_set_socket_open_callback(nullptr, QEventDispatcherWasm::socketOpen);
+ emscripten_set_socket_listen_callback(nullptr, QEventDispatcherWasm::socketListen);
+ emscripten_set_socket_connection_callback(nullptr, QEventDispatcherWasm::socketConnection);
+ emscripten_set_socket_message_callback(nullptr, QEventDispatcherWasm::socketMessage);
+ emscripten_set_socket_close_callback(nullptr, QEventDispatcherWasm::socketClose);
+}
+
+void QEventDispatcherWasm::clearEmscriptenSocketCallbacks()
+{
+ qCDebug(lcEventDispatcher) << "clearEmscriptenSocketCallbacks";
+
+ emscripten_set_socket_error_callback(nullptr, nullptr);
+ emscripten_set_socket_open_callback(nullptr, nullptr);
+ emscripten_set_socket_listen_callback(nullptr, nullptr);
+ emscripten_set_socket_connection_callback(nullptr, nullptr);
+ emscripten_set_socket_message_callback(nullptr, nullptr);
+ emscripten_set_socket_close_callback(nullptr, nullptr);
+}
+
+void QEventDispatcherWasm::socketError(int socket, int err, const char* msg, void *context)
+{
+ Q_UNUSED(err);
+ Q_UNUSED(msg);
+ Q_UNUSED(context);
+
+ // Emscripten makes socket callbacks while the main thread is busy-waiting for a mutex,
+ // which can cause deadlocks if the callback code also tries to lock the same mutex.
+ // This is most easily reproducible by adding print statements, where each print requires
+ // taking a mutex lock. Work around this by running the callback asynchronously, i.e. by using
+ // a native zero-timer, to make sure the main thread stack is completely unwond before calling
+ // the Qt handler.
+ // It is currently unclear if this problem is caused by code in Qt or in Emscripten, or
+ // if this completely fixes the problem.
+ runAsync([socket](){
+ auto notifiersRange = g_socketNotifiers.equal_range(socket);
+ std::vector<std::pair<int, QSocketNotifier *>> notifiers(notifiersRange.first, notifiersRange.second);
+ for (auto [_, notifier]: notifiers) {
+ QCoreApplication::postEvent(notifier, new QEvent(QEvent::SockAct));
+ }
+ setSocketState(socket, true, true);
+ });
+}
+
+void QEventDispatcherWasm::socketOpen(int socket, void *context)
+{
+ Q_UNUSED(context);
+
+ runAsync([socket](){
+ auto notifiersRange = g_socketNotifiers.equal_range(socket);
+ std::vector<std::pair<int, QSocketNotifier *>> notifiers(notifiersRange.first, notifiersRange.second);
+ for (auto [_, notifier]: notifiers) {
+ if (notifier->type() == QSocketNotifier::Write) {
+ QCoreApplication::postEvent(notifier, new QEvent(QEvent::SockAct));
+ }
+ }
+ setSocketState(socket, false, true);
+ });
+}
+
+void QEventDispatcherWasm::socketListen(int socket, void *context)
+{
+ Q_UNUSED(socket);
+ Q_UNUSED(context);
+}
+
+void QEventDispatcherWasm::socketConnection(int socket, void *context)
+{
+ Q_UNUSED(socket);
+ Q_UNUSED(context);
+}
+
+void QEventDispatcherWasm::socketMessage(int socket, void *context)
+{
+ Q_UNUSED(context);
+
+ runAsync([socket](){
+ auto notifiersRange = g_socketNotifiers.equal_range(socket);
+ std::vector<std::pair<int, QSocketNotifier *>> notifiers(notifiersRange.first, notifiersRange.second);
+ for (auto [_, notifier]: notifiers) {
+ if (notifier->type() == QSocketNotifier::Read) {
+ QCoreApplication::postEvent(notifier, new QEvent(QEvent::SockAct));
+ }
+ }
+ setSocketState(socket, true, false);
+ });
+}
+
+void QEventDispatcherWasm::socketClose(int socket, void *context)
+{
+ Q_UNUSED(context);
+
+ // Emscripten makes emscripten_set_socket_close_callback() calls to socket 0,
+ // which is not a valid socket. see https://github.com/emscripten-core/emscripten/issues/6596
+ if (socket == 0)
+ return;
+
+ runAsync([socket](){
+ auto notifiersRange = g_socketNotifiers.equal_range(socket);
+ std::vector<std::pair<int, QSocketNotifier *>> notifiers(notifiersRange.first, notifiersRange.second);
+ for (auto [_, notifier]: notifiers)
+ QCoreApplication::postEvent(notifier, new QEvent(QEvent::SockClose));
+
+ setSocketState(socket, true, true);
+ clearSocketState(socket);
+ });
+}
+
+void QEventDispatcherWasm::setSocketState(int socket, bool setReadyRead, bool setReadyWrite)
+{
+ LOCK_GUARD(g_staticDataMutex);
+ SocketReadyState &state = g_socketState[socket];
+
+ // Additively update socket ready state, e.g. if it
+ // was already ready read then it stays ready read.
+ state.readyRead |= setReadyRead;
+ state.readyWrite |= setReadyWrite;
+
+ // Wake any waiters for the given readiness. The waiter consumes
+ // the ready state, returning the socket to not-ready.
+ if (QEventDispatcherWasm *waiter = state.waiter)
+ if ((state.readyRead && state.waitForReadyRead) || (state.readyWrite && state.waitForReadyWrite))
+ waiter->wakeEventDispatcherThread();
+}
+
+void QEventDispatcherWasm::clearSocketState(int socket)
+{
+ LOCK_GUARD(g_staticDataMutex);
+ g_socketState.erase(socket);
+}
+
+void QEventDispatcherWasm::waitForSocketState(int timeout, int socket, bool checkRead, bool checkWrite,
+ bool *selectForRead, bool *selectForWrite, bool *socketDisconnect)
+{
+ // Loop until the socket becomes readyRead or readyWrite. Wait for
+ // socket activity if it currently is neither.
+ while (true) {
+ *selectForRead = false;
+ *selectForWrite = false;
+
+ {
+ LOCK_GUARD(g_staticDataMutex);
+
+ // Access or create socket state: we want to register that a thread is waitng
+ // even if we have not received any socket callbacks yet.
+ SocketReadyState &state = g_socketState[socket];
+ if (state.waiter) {
+ qWarning() << "QEventDispatcherWasm::waitForSocketState: a thread is already waiting";
+ break;
+ }
+
+ bool shouldWait = true;
+ if (checkRead && state.readyRead) {
+ shouldWait = false;
+ state.readyRead = false;
+ *selectForRead = true;
+ }
+ if (checkWrite && state.readyWrite) {
+ shouldWait = false;
+ state.readyWrite = false;
+ *selectForRead = true;
+ }
+ if (!shouldWait)
+ break;
+
+ state.waiter = this;
+ state.waitForReadyRead = checkRead;
+ state.waitForReadyWrite = checkWrite;
+ }
+
+ bool didTimeOut = !wait(timeout);
+ {
+ LOCK_GUARD(g_staticDataMutex);
+
+ // Missing socket state after a wakeup means that the socket has been closed.
+ auto it = g_socketState.find(socket);
+ if (it == g_socketState.end()) {
+ *socketDisconnect = true;
+ break;
+ }
+ it->second.waiter = nullptr;
+ it->second.waitForReadyRead = false;
+ it->second.waitForReadyWrite = false;
+ }
+
+ if (didTimeOut)
+ break;
+ }
+}
+
+void QEventDispatcherWasm::socketSelect(int timeout, int socket, bool waitForRead, bool waitForWrite,
+ bool *selectForRead, bool *selectForWrite, bool *socketDisconnect)
+{
+ QEventDispatcherWasm *eventDispatcher = static_cast<QEventDispatcherWasm *>(
+ QAbstractEventDispatcher::instance(QThread::currentThread()));
+
+ if (!eventDispatcher) {
+ qWarning("QEventDispatcherWasm::socketSelect called without eventdispatcher instance");
+ return;
+ }
+
+ eventDispatcher->waitForSocketState(timeout, socket, waitForRead, waitForWrite,
+ selectForRead, selectForWrite, socketDisconnect);
+}
+
+namespace {
+ int g_startupTasks = 0;
+}
+
+// The following functions manages sending the "qtLoaded" event/callback
+// from qtloader.js on startup, once Qt initialization has been completed
+// and the application is ready to display the first frame. This can be
+// either as soon as the event loop is running, or later, if additional
+// startup tasks (e.g. local font loading) have been registered.
+
+void QEventDispatcherWasm::registerStartupTask()
+{
+ ++g_startupTasks;
+}
+
+void QEventDispatcherWasm::completeStarupTask()
+{
+ --g_startupTasks;
+ callOnLoadedIfRequired();
+}
+
+void QEventDispatcherWasm::callOnLoadedIfRequired()
+{
+ if (g_startupTasks > 0)
+ return;
+
+ static bool qtLoadedCalled = false;
+ if (qtLoadedCalled)
+ return;
+ qtLoadedCalled = true;
+
+ Q_ASSERT(g_mainThreadEventDispatcher);
+ g_mainThreadEventDispatcher->onLoaded();
+}
+
+void QEventDispatcherWasm::onLoaded()
+{
+ // TODO: call qtloader.js onLoaded from here, in order to delay
+ // hiding the "Loading..." message until the app is ready to paint
+ // the first frame. Currently onLoaded must be called early before
+ // main() in order to ensure that the screen/container elements
+ // have valid geometry at startup.
+}
namespace {
void trampoline(void *context) {
- std::function<void(void)> *fn = reinterpret_cast<std::function<void(void)> *>(context);
- (*fn)();
- delete fn;
+
+ auto async_fn = [](void *context){
+ std::function<void(void)> *fn = reinterpret_cast<std::function<void(void)> *>(context);
+ (*fn)();
+ delete fn;
+ };
+
+ emscripten_async_call(async_fn, context, 0);
}
}
-// Runs a function on the main thread
+// Runs a function right away
+void QEventDispatcherWasm::run(std::function<void(void)> fn)
+{
+ fn();
+}
+
void QEventDispatcherWasm::runOnMainThread(std::function<void(void)> fn)
{
- void *context = new std::function<void(void)>(fn);
- emscripten_async_run_in_main_runtime_thread_(EM_FUNC_SIG_VI, reinterpret_cast<void *>(trampoline), context);
+#if QT_CONFIG(thread)
+ qstdweb::runTaskOnMainThread<void>(fn, &g_proxyingQueue);
+#else
+ qstdweb::runTaskOnMainThread<void>(fn);
+#endif
+}
+
+// Runs a function asynchronously. Main thread only.
+void QEventDispatcherWasm::runAsync(std::function<void(void)> fn)
+{
+ trampoline(new std::function<void(void)>(fn));
}
+
+// Runs a function on the main thread. The function always runs asynchronously,
+// also if the calling thread is the main thread.
+void QEventDispatcherWasm::runOnMainThreadAsync(std::function<void(void)> fn)
+{
+ void *context = new std::function<void(void)>(fn);
+#if QT_CONFIG(thread)
+ if (!emscripten_is_main_runtime_thread()) {
+ g_proxyingQueue.proxyAsync(g_mainThread, [context]{
+ trampoline(context);
+ });
+ return;
+ }
#endif
+ trampoline(context);
+}
QT_END_NAMESPACE
+
+#include "moc_qeventdispatcher_wasm_p.cpp"
diff --git a/src/corelib/kernel/qeventdispatcher_wasm_p.h b/src/corelib/kernel/qeventdispatcher_wasm_p.h
index 4325481c62..7b257e02ad 100644
--- a/src/corelib/kernel/qeventdispatcher_wasm_p.h
+++ b/src/corelib/kernel/qeventdispatcher_wasm_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QEVENTDISPATCHER_WASM_P_H
#define QEVENTDISPATCHER_WASM_P_H
@@ -56,16 +20,19 @@
#include <QtCore/qloggingcategory.h>
#include <QtCore/qwaitcondition.h>
+#include <chrono>
#include <mutex>
#include <optional>
#include <tuple>
+#include <emscripten/proxying.h>
+
QT_BEGIN_NAMESPACE
Q_DECLARE_LOGGING_CATEGORY(lcEventDispatcher);
Q_DECLARE_LOGGING_CATEGORY(lcEventDispatcherTimers)
-class Q_CORE_EXPORT QEventDispatcherWasm : public QAbstractEventDispatcher
+class Q_CORE_EXPORT QEventDispatcherWasm : public QAbstractEventDispatcherV2
{
Q_OBJECT
public:
@@ -77,32 +44,60 @@ public:
void registerSocketNotifier(QSocketNotifier *notifier) override;
void unregisterSocketNotifier(QSocketNotifier *notifier) override;
- void registerTimer(int timerId, qint64 interval, Qt::TimerType timerType, QObject *object) override;
- bool unregisterTimer(int timerId) override;
- bool unregisterTimers(QObject *object) override;
- QList<QAbstractEventDispatcher::TimerInfo> registeredTimers(QObject *object) const override;
- int remainingTime(int timerId) override;
+ void registerTimer(Qt::TimerId timerId, Duration interval, Qt::TimerType timerType,
+ QObject *object) override final;
+ bool unregisterTimer(Qt::TimerId timerId) override final;
+ bool unregisterTimers(QObject *object) override final;
+ QList<TimerInfoV2> timersForObject(QObject *object) const override final;
+ Duration remainingTime(Qt::TimerId timerId) const override final;
void interrupt() override;
void wakeUp() override;
+ static void runOnMainThread(std::function<void(void)> fn);
+ static void socketSelect(int timeout, int socket, bool waitForRead, bool waitForWrite,
+ bool *selectForRead, bool *selectForWrite, bool *socketDisconnect);
+
+ static void registerStartupTask();
+ static void completeStarupTask();
+ static void callOnLoadedIfRequired();
+ virtual void onLoaded();
+
+protected:
+ virtual bool processPostedEvents();
+
private:
bool isMainThreadEventDispatcher();
bool isSecondaryThreadEventDispatcher();
+ static bool isValidEventDispatcherPointer(QEventDispatcherWasm *eventDispatcher);
void handleApplicationExec();
void handleDialogExec();
- void pollForNativeEvents();
- bool waitForForEvents();
- static void callProcessEvents(void *eventDispatcher);
+ bool wait(int timeout = -1);
+ bool wakeEventDispatcherThread();
+ static void callProcessPostedEvents(void *eventDispatcher);
void processTimers();
void updateNativeTimer();
static void callProcessTimers(void *eventDispatcher);
-#if QT_CONFIG(thread)
- void runOnMainThread(std::function<void(void)> fn);
-#endif
+ static void setEmscriptenSocketCallbacks();
+ static void clearEmscriptenSocketCallbacks();
+ static void socketError(int fd, int err, const char* msg, void *context);
+ static void socketOpen(int fd, void *context);
+ static void socketListen(int fd, void *context);
+ static void socketConnection(int fd, void *context);
+ static void socketMessage(int fd, void *context);
+ static void socketClose(int fd, void *context);
+
+ static void setSocketState(int socket, bool setReadyRead, bool setReadyWrite);
+ static void clearSocketState(int socket);
+ void waitForSocketState(int timeout, int socket, bool checkRead, bool checkWrite,
+ bool *selectForRead, bool *selectForWrite, bool *socketDisconnect);
+
+ static void run(std::function<void(void)> fn);
+ static void runAsync(std::function<void(void)> fn);
+ static void runOnMainThreadAsync(std::function<void(void)> fn);
static QEventDispatcherWasm *g_mainThreadEventDispatcher;
@@ -112,7 +107,7 @@ private:
QTimerInfoList *m_timerInfo = new QTimerInfoList();
long m_timerId = 0;
- uint64_t m_timerTargetTime = 0;
+ std::chrono::milliseconds m_timerTargetTime{};
#if QT_CONFIG(thread)
std::mutex m_mutex;
@@ -120,8 +115,25 @@ private:
std::condition_variable m_moreEvents;
static QVector<QEventDispatcherWasm *> g_secondaryThreadEventDispatchers;
- static std::mutex g_secondaryThreadEventDispatchersMutex;
+ static std::mutex g_staticDataMutex;
+ static emscripten::ProxyingQueue g_proxyingQueue;
+ static pthread_t g_mainThread;
+
+ // Note on mutex usage: the global g_staticDataMutex protects the global (g_ prefixed) data,
+ // while the per eventdispatcher m_mutex protects the state accociated with blocking and waking
+ // that eventdispatcher thread. The locking order is g_staticDataMutex first, then m_mutex.
#endif
+
+ static std::multimap<int, QSocketNotifier *> g_socketNotifiers;
+
+ struct SocketReadyState {
+ QEventDispatcherWasm *waiter = nullptr;
+ bool waitForReadyRead = false;
+ bool waitForReadyWrite = false;
+ bool readyRead = false;
+ bool readyWrite = false;
+ };
+ static std::map<int, SocketReadyState> g_socketState;
};
#endif // QEVENTDISPATCHER_WASM_P_H
diff --git a/src/corelib/kernel/qeventdispatcher_win.cpp b/src/corelib/kernel/qeventdispatcher_win.cpp
index 97e3cbdb04..a7663b2481 100644
--- a/src/corelib/kernel/qeventdispatcher_win.cpp
+++ b/src/corelib/kernel/qeventdispatcher_win.cpp
@@ -1,49 +1,12 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2016 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qeventdispatcher_win_p.h"
#include "qcoreapplication.h"
#include <private/qsystemlibrary_p.h>
#include "qoperatingsystemversion.h"
-#include "qpair.h"
#include "qset.h"
#include "qsocketnotifier.h"
#include "qvarlengtharray.h"
@@ -54,8 +17,6 @@
QT_BEGIN_NAMESPACE
-extern uint qGlobalPostedEventsCount();
-
#ifndef TIME_KILL_SYNCHRONOUS
# define TIME_KILL_SYNCHRONOUS 0x0100
#endif
@@ -94,6 +55,13 @@ class QEventDispatcherWin32Private;
LRESULT QT_WIN_CALLBACK qt_internal_proc(HWND hwnd, UINT message, WPARAM wp, LPARAM lp);
+static quint64 qt_msectime()
+{
+ using namespace std::chrono;
+ auto t = duration_cast<milliseconds>(steady_clock::now().time_since_epoch());
+ return t.count();
+}
+
QEventDispatcherWin32Private::QEventDispatcherWin32Private()
: interrupt(false), internalHwnd(0),
sendPostedEventsTimerId(0), wakeUps(0),
@@ -137,11 +105,7 @@ LRESULT QT_WIN_CALLBACK qt_internal_proc(HWND hwnd, UINT message, WPARAM wp, LPA
if (dispatcher->filterNativeEvent(QByteArrayLiteral("windows_dispatcher_MSG"), &msg, &result))
return result;
-#ifdef GWLP_USERDATA
auto q = reinterpret_cast<QEventDispatcherWin32 *>(GetWindowLongPtr(hwnd, GWLP_USERDATA));
-#else
- auto q = reinterpret_cast<QEventDispatcherWin32 *>(GetWindowLong(hwnd, GWL_USERDATA));
-#endif
QEventDispatcherWin32Private *d = nullptr;
if (q != nullptr)
d = q->d_func();
@@ -171,7 +135,7 @@ LRESULT QT_WIN_CALLBACK qt_internal_proc(HWND hwnd, UINT message, WPARAM wp, LPA
QSNDict *sn_vec[4] = { &d->sn_read, &d->sn_write, &d->sn_except, &d->sn_read };
QSNDict *dict = sn_vec[type];
- QSockNot *sn = dict ? dict->value(wp) : 0;
+ QSockNot *sn = dict ? dict->value(qintptr(wp)) : 0;
if (sn == nullptr) {
d->postActivateSocketNotifiers();
} else {
@@ -249,6 +213,8 @@ LRESULT QT_WIN_CALLBACK qt_internal_proc(HWND hwnd, UINT message, WPARAM wp, LPA
void QEventDispatcherWin32Private::startPostedEventsTimer()
{
+ // we received WM_QT_SENDPOSTEDEVENTS, so allow posting it again
+ wakeUps.storeRelaxed(0);
if (sendPostedEventsTimerId == 0) {
// Start a timer to deliver posted events when the message queue is emptied.
sendPostedEventsTimerId = SetTimer(internalHwnd, SendPostedEventsTimerId,
@@ -325,24 +291,52 @@ static HWND qt_create_internal_window(const QEventDispatcherWin32 *eventDispatch
return 0;
}
-#ifdef GWLP_USERDATA
SetWindowLongPtr(wnd, GWLP_USERDATA, reinterpret_cast<LONG_PTR>(eventDispatcher));
-#else
- SetWindowLong(wnd, GWL_USERDATA, reinterpret_cast<LONG>(eventDispatcher));
-#endif
return wnd;
}
-static void calculateNextTimeout(WinTimerInfo *t, quint64 currentTime)
+static ULONG calculateNextTimeout(WinTimerInfo *t, quint64 currentTime)
{
uint interval = t->interval;
- if ((interval >= 20000u && t->timerType != Qt::PreciseTimer) || t->timerType == Qt::VeryCoarseTimer) {
- // round the interval, VeryCoarseTimers only have full second accuracy
- interval = ((interval + 500)) / 1000 * 1000;
+ ULONG tolerance = TIMERV_DEFAULT_COALESCING;
+ switch (t->timerType) {
+ case Qt::PreciseTimer:
+ // high precision timer is based on millisecond precision
+ // so no adjustment is necessary
+ break;
+
+ case Qt::CoarseTimer:
+ // this timer has up to 5% coarseness
+ // so our boundaries are 20 ms and 20 s
+ // below 20 ms, 5% inaccuracy is below 1 ms, so we convert to high precision
+ // above 20 s, 5% inaccuracy is above 1 s, so we convert to VeryCoarseTimer
+ if (interval >= 20000) {
+ t->timerType = Qt::VeryCoarseTimer;
+ } else if (interval <= 20) {
+ // no adjustment necessary
+ t->timerType = Qt::PreciseTimer;
+ break;
+ } else {
+ tolerance = interval / 20;
+ break;
+ }
+ Q_FALLTHROUGH();
+ case Qt::VeryCoarseTimer:
+ // the very coarse timer is based on full second precision,
+ // so we round to closest second (but never to zero)
+ tolerance = 1000;
+ if (interval < 1000)
+ interval = 1000;
+ else
+ interval = (interval + 500) / 1000 * 1000;
+ currentTime = currentTime / 1000 * 1000;
+ break;
}
+
t->interval = interval;
t->timeout = currentTime + interval;
+ return tolerance;
}
void QEventDispatcherWin32Private::registerTimer(WinTimerInfo *t)
@@ -352,13 +346,13 @@ void QEventDispatcherWin32Private::registerTimer(WinTimerInfo *t)
Q_Q(QEventDispatcherWin32);
bool ok = false;
- calculateNextTimeout(t, qt_msectime());
+ ULONG tolerance = calculateNextTimeout(t, qt_msectime());
uint interval = t->interval;
if (interval == 0u) {
// optimization for single-shot-zero-timer
QCoreApplication::postEvent(q, new QZeroTimerEvent(t->timerId));
ok = true;
- } else if (interval < 20u || t->timerType == Qt::PreciseTimer) {
+ } else if (tolerance == TIMERV_DEFAULT_COALESCING) {
// 3/2016: Although MSDN states timeSetEvent() is deprecated, the function
// is still deemed to be the most reliable precision timer.
t->fastTimerId = timeSetEvent(interval, 1, qt_fast_timer_proc, DWORD_PTR(t),
@@ -368,8 +362,10 @@ void QEventDispatcherWin32Private::registerTimer(WinTimerInfo *t)
if (!ok) {
// user normal timers for (Very)CoarseTimers, or if no more multimedia timers available
- ok = SetTimer(internalHwnd, t->timerId, interval, 0);
+ ok = SetCoalescableTimer(internalHwnd, t->timerId, interval, nullptr, tolerance);
}
+ if (!ok)
+ ok = SetTimer(internalHwnd, t->timerId, interval, nullptr);
if (!ok)
qErrnoWarning("QEventDispatcherWin32::registerTimer: Failed to create a timer");
@@ -412,7 +408,7 @@ void QEventDispatcherWin32Private::sendTimerEvent(int timerId)
}
}
-void QEventDispatcherWin32Private::doWsaAsyncSelect(int socket, long event)
+void QEventDispatcherWin32Private::doWsaAsyncSelect(qintptr socket, long event)
{
Q_ASSERT(internalHwnd);
// BoundsChecker may emit a warning for WSAAsyncSelect when event == 0
@@ -561,7 +557,7 @@ bool QEventDispatcherWin32::processEvents(QEventLoop::ProcessEventsFlags flags)
void QEventDispatcherWin32::registerSocketNotifier(QSocketNotifier *notifier)
{
Q_ASSERT(notifier);
- int sockfd = notifier->socket();
+ qintptr sockfd = notifier->socket();
int type = notifier->type();
#ifndef QT_NO_DEBUG
if (sockfd < 0) {
@@ -585,7 +581,7 @@ void QEventDispatcherWin32::registerSocketNotifier(QSocketNotifier *notifier)
const char *t[] = { "Read", "Write", "Exception" };
/* Variable "socket" below is a function pointer. */
qWarning("QSocketNotifier: Multiple socket notifiers for "
- "same socket %d and type %s", sockfd, t[type]);
+ "same socket %" PRIdQINTPTR " and type %s", sockfd, t[type]);
}
QSockNot *sn = new QSockNot;
@@ -629,7 +625,7 @@ void QEventDispatcherWin32::unregisterSocketNotifier(QSocketNotifier *notifier)
{
Q_ASSERT(notifier);
#ifndef QT_NO_DEBUG
- int sockfd = notifier->socket();
+ qintptr sockfd = notifier->socket();
if (sockfd < 0) {
qWarning("QEventDispatcherWin32::unregisterSocketNotifier: invalid socket identifier");
return;
@@ -646,7 +642,7 @@ void QEventDispatcherWin32::doUnregisterSocketNotifier(QSocketNotifier *notifier
{
Q_D(QEventDispatcherWin32);
int type = notifier->type();
- int sockfd = notifier->socket();
+ qintptr sockfd = notifier->socket();
Q_ASSERT(sockfd >= 0);
QSFDict::iterator it = d->active_fd.find(sockfd);
@@ -774,7 +770,7 @@ QEventDispatcherWin32::registeredTimers(QObject *object) const
Q_D(const QEventDispatcherWin32);
QList<TimerInfo> list;
- for (WinTimerInfo *t : qAsConst(d->timerDict)) {
+ for (WinTimerInfo *t : std::as_const(d->timerDict)) {
Q_ASSERT(t);
if (t->obj == object)
list << TimerInfo(t->timerId, t->interval, t->timerType);
@@ -842,7 +838,7 @@ void QEventDispatcherWin32::closingDown()
Q_ASSERT(d->active_fd.isEmpty());
// clean up any timers
- for (WinTimerInfo *t : qAsConst(d->timerDict))
+ for (WinTimerInfo *t : std::as_const(d->timerDict))
d->unregisterTimer(t);
d->timerDict.clear();
@@ -909,3 +905,5 @@ HWND QEventDispatcherWin32::internalHwnd()
}
QT_END_NAMESPACE
+
+#include "moc_qeventdispatcher_win_p.cpp"
diff --git a/src/corelib/kernel/qeventdispatcher_win_p.h b/src/corelib/kernel/qeventdispatcher_win_p.h
index 49a6d3ebbc..558490a85e 100644
--- a/src/corelib/kernel/qeventdispatcher_win_p.h
+++ b/src/corelib/kernel/qeventdispatcher_win_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QEVENTDISPATCHER_WIN_P_H
#define QEVENTDISPATCHER_WIN_P_H
@@ -64,7 +28,6 @@ class QEventDispatcherWin32Private;
// forward declaration
LRESULT QT_WIN_CALLBACK qt_internal_proc(HWND hwnd, UINT message, WPARAM wp, LPARAM lp);
-quint64 qt_msectime();
class Q_CORE_EXPORT QEventDispatcherWin32 : public QAbstractEventDispatcher
{
@@ -108,9 +71,9 @@ private:
struct QSockNot {
QSocketNotifier *obj;
- int fd;
+ qintptr fd;
};
-typedef QHash<int, QSockNot *> QSNDict;
+typedef QHash<qintptr, QSockNot *> QSNDict;
struct QSockFd {
long event;
@@ -119,7 +82,7 @@ struct QSockFd {
explicit inline QSockFd(long ev = 0, long ma = 0) : event(ev), mask(ma), selected(false) { }
};
-typedef QHash<int, QSockFd> QSFDict;
+typedef QHash<qintptr, QSockFd> QSFDict;
struct WinTimerInfo { // internal timer info
QObject *dispatcher;
@@ -172,7 +135,7 @@ public:
QSFDict active_fd;
bool activateNotifiersPosted;
void postActivateSocketNotifiers();
- void doWsaAsyncSelect(int socket, long event);
+ void doWsaAsyncSelect(qintptr socket, long event);
bool closingDown = false;
diff --git a/src/corelib/kernel/qeventloop.cpp b/src/corelib/kernel/qeventloop.cpp
index b5304332ad..e314a17ff8 100644
--- a/src/corelib/kernel/qeventloop.cpp
+++ b/src/corelib/kernel/qeventloop.cpp
@@ -1,48 +1,12 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qeventloop.h"
#include "qabstracteventdispatcher.h"
#include "qcoreapplication.h"
#include "qcoreapplication_p.h"
-#include "qelapsedtimer.h"
+#include "qdeadlinetimer.h"
#include "qobject_p.h"
#include "qeventloop_p.h"
@@ -152,10 +116,10 @@ bool QEventLoop::processEvents(ProcessEventsFlags flags)
can be used before calling exec(), because modal widgets
use their own local event loop.
- To make your application perform idle processing (i.e. executing a
- special function whenever there are no pending events), use a
- QTimer with 0 timeout. More sophisticated idle processing schemes
- can be achieved using processEvents().
+ To make your application perform idle processing (i.e. executing a special
+ function whenever there are no pending events), use a QChronoTimer with
+ 0ns timeout. More sophisticated idle processing schemes can be achieved
+ using processEvents().
\sa QCoreApplication::quit(), exit(), processEvents()
*/
@@ -187,6 +151,9 @@ int QEventLoop::exec(ProcessEventsFlags flags)
auto threadData = d->threadData.loadRelaxed();
++threadData->loopLevel;
threadData->eventLoops.push(d->q_func());
+ qCDebug(lcDeleteLater) << "Increased" << threadData->thread
+ << "loop level to" << threadData->loopLevel
+ << "with leaf loop now" << threadData->eventLoops.last();
locker.unlock();
}
@@ -205,6 +172,12 @@ int QEventLoop::exec(ProcessEventsFlags flags)
Q_UNUSED(eventLoop); // --release warning
d->inExec = false;
--threadData->loopLevel;
+
+ qCDebug(lcDeleteLater) << "Decreased" << threadData->thread
+ << "loop level to" << threadData->loopLevel
+ << "with leaf loop now" << (threadData->eventLoops.isEmpty()
+ ? nullptr : threadData->eventLoops.last());
+
}
};
LoopReference ref(d, locker);
@@ -222,9 +195,27 @@ int QEventLoop::exec(ProcessEventsFlags flags)
}
/*!
+ \overload
+
Process pending events that match \a flags for a maximum of \a
maxTime milliseconds, or until there are no more events to
process, whichever is shorter.
+
+ Equivalent to calling:
+ \code
+ processEvents(flags, QDeadlineTimer(maxTime));
+ \endcode
+*/
+void QEventLoop::processEvents(ProcessEventsFlags flags, int maxTime)
+{
+ processEvents(flags, QDeadlineTimer(maxTime));
+}
+
+/*!
+ \since 6.7
+
+ Process pending events that match \a flags until \a deadline has expired,
+ or until there are no more events to process, whichever happens first.
This function is especially useful if you have a long running
operation and want to show its progress without allowing user
input, i.e. by using the \l ExcludeUserInputEvents flag.
@@ -237,16 +228,14 @@ int QEventLoop::exec(ProcessEventsFlags flags)
and will be ignored.
\endlist
*/
-void QEventLoop::processEvents(ProcessEventsFlags flags, int maxTime)
+void QEventLoop::processEvents(ProcessEventsFlags flags, QDeadlineTimer deadline)
{
Q_D(QEventLoop);
if (!d->threadData.loadRelaxed()->hasEventDispatcher())
return;
- QElapsedTimer start;
- start.start();
while (processEvents(flags & ~WaitForMoreEvents)) {
- if (start.elapsed() > maxTime)
+ if (deadline.hasExpired())
break;
}
}
@@ -329,57 +318,10 @@ bool QEventLoop::event(QEvent *event)
void QEventLoop::quit()
{ exit(0); }
-
-class QEventLoopLockerPrivate
-{
-public:
- explicit QEventLoopLockerPrivate(QEventLoopPrivate *loop)
- : loop(loop), type(EventLoop)
- {
- loop->ref();
- }
-
- explicit QEventLoopLockerPrivate(QThreadPrivate *thread)
- : thread(thread), type(Thread)
- {
- thread->ref();
- }
-
- explicit QEventLoopLockerPrivate(QCoreApplicationPrivate *app)
- : app(app), type(Application)
- {
- app->ref();
- }
-
- ~QEventLoopLockerPrivate()
- {
- switch (type)
- {
- case EventLoop:
- loop->deref();
- break;
- case Thread:
- thread->deref();
- break;
- default:
- app->deref();
- break;
- }
- }
-
-private:
- union {
- QEventLoopPrivate * loop;
- QThreadPrivate * thread;
- QCoreApplicationPrivate * app;
- };
- enum Type {
- EventLoop,
- Thread,
- Application
- };
- const Type type;
-};
+// If any of these trigger, the Type bits will interfere with the pointer values:
+static_assert(alignof(QEventLoop) >= 4);
+static_assert(alignof(QThread) >= 4);
+static_assert(alignof(QCoreApplication) >= 4);
/*!
\class QEventLoopLocker
@@ -404,12 +346,16 @@ private:
/*!
Creates an event locker operating on the QCoreApplication.
- The application will quit when there are no more QEventLoopLockers operating on it.
+ The application will attempt to quit when there are no more QEventLoopLockers
+ operating on it, as long as QCoreApplication::isQuitLockEnabled() is \c true.
+
+ Note that attempting a quit may not necessarily result in the application quitting,
+ if there for example are open windows, or the QEvent::Quit event is ignored.
\sa QCoreApplication::quit(), QCoreApplication::isQuitLockEnabled()
*/
-QEventLoopLocker::QEventLoopLocker()
- : d_ptr(new QEventLoopLockerPrivate(static_cast<QCoreApplicationPrivate*>(QObjectPrivate::get(QCoreApplication::instance()))))
+QEventLoopLocker::QEventLoopLocker() noexcept
+ : QEventLoopLocker{QCoreApplication::instance(), Type::Application}
{
}
@@ -421,8 +367,8 @@ QEventLoopLocker::QEventLoopLocker()
\sa QEventLoop::quit()
*/
-QEventLoopLocker::QEventLoopLocker(QEventLoop *loop)
- : d_ptr(new QEventLoopLockerPrivate(static_cast<QEventLoopPrivate*>(QObjectPrivate::get(loop))))
+QEventLoopLocker::QEventLoopLocker(QEventLoop *loop) noexcept
+ : QEventLoopLocker{loop, Type::EventLoop}
{
}
@@ -434,18 +380,80 @@ QEventLoopLocker::QEventLoopLocker(QEventLoop *loop)
\sa QThread::quit()
*/
-QEventLoopLocker::QEventLoopLocker(QThread *thread)
- : d_ptr(new QEventLoopLockerPrivate(static_cast<QThreadPrivate*>(QObjectPrivate::get(thread))))
+QEventLoopLocker::QEventLoopLocker(QThread *thread) noexcept
+ : QEventLoopLocker{thread, Type::Thread}
{
}
/*!
+ \fn QEventLoopLocker::QEventLoopLocker(QEventLoopLocker &&other)
+ \since 6.7
+
+ Move-constructs an event-loop locker from \a other. \a other will have a
+ no-op destructor, while responsibility for preventing the
+ QEventLoop/QThread/QCoreApplication from quitting is transferred to the new
+ object.
+*/
+
+/*!
+ \fn QEventLoopLocker &QEventLoopLocker::operator=(QEventLoopLocker &&other)
+ \since 6.7
+
+ Move-assigns this event-loop locker from \a other. \a other will have a
+ no-op destructor, while responsibility for preventing the
+ QEventLoop/QThread/QCoreApplication from quitting is transferred to this
+ object.
+*/
+
+/*!
+ \fn QEventLoopLocker::swap(QEventLoopLocker &other)
+ \since 6.7
+
+ Swaps the object and the state of this QEventLoopLocker with \a other.
+ This operation is very fast and never fails.
+*/
+
+/*!
+ \fn QEventLoopLocker::swap(QEventLoopLocker &lhs, QEventLoopLocker &rhs)
+ \since 6.7
+
+ Swaps the object and the state of \a lhs with \a rhs.
+ This operation is very fast and never fails.
+*/
+
+/*!
Destroys this event loop locker object
*/
QEventLoopLocker::~QEventLoopLocker()
{
- delete d_ptr;
+ visit([](auto p) { p->d_func()->deref(); });
+}
+
+/*!
+ \internal
+*/
+QEventLoopLocker::QEventLoopLocker(void *ptr, Type t) noexcept
+ : p{quintptr(ptr) | quintptr(t)}
+{
+ visit([](auto p) { p->d_func()->ref(); });
+}
+
+/*!
+ \internal
+*/
+template <typename Func>
+void QEventLoopLocker::visit(Func f) const
+{
+ const auto ptr = pointer();
+ if (!ptr)
+ return;
+ switch (type()) {
+ case Type::EventLoop: return f(static_cast<QEventLoop *>(ptr));
+ case Type::Thread: return f(static_cast<QThread *>(ptr));
+ case Type::Application: return f(static_cast<QCoreApplication *>(ptr));
+ }
+ Q_UNREACHABLE();
}
QT_END_NAMESPACE
diff --git a/src/corelib/kernel/qeventloop.h b/src/corelib/kernel/qeventloop.h
index f3896bdd62..ec79c07cd7 100644
--- a/src/corelib/kernel/qeventloop.h
+++ b/src/corelib/kernel/qeventloop.h
@@ -1,55 +1,22 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QEVENTLOOP_H
#define QEVENTLOOP_H
#include <QtCore/qobject.h>
+#include <QtCore/qdeadlinetimer.h>
QT_BEGIN_NAMESPACE
+class QEventLoopLocker;
class QEventLoopPrivate;
class Q_CORE_EXPORT QEventLoop : public QObject
{
Q_OBJECT
Q_DECLARE_PRIVATE(QEventLoop)
+ friend class QEventLoopLocker;
public:
explicit QEventLoop(QObject *parent = nullptr);
@@ -66,9 +33,11 @@ public:
ApplicationExec = 0x80,
};
Q_DECLARE_FLAGS(ProcessEventsFlags, ProcessEventsFlag)
+ Q_FLAG(ProcessEventsFlags)
bool processEvents(ProcessEventsFlags flags = AllEvents);
void processEvents(ProcessEventsFlags flags, int maximumTime);
+ void processEvents(ProcessEventsFlags flags, QDeadlineTimer deadline);
int exec(ProcessEventsFlags flags = AllEvents);
bool isRunning() const;
@@ -86,17 +55,41 @@ Q_DECLARE_OPERATORS_FOR_FLAGS(QEventLoop::ProcessEventsFlags)
class QEventLoopLockerPrivate;
-class Q_CORE_EXPORT QEventLoopLocker
+class QEventLoopLocker
{
public:
- QEventLoopLocker();
- explicit QEventLoopLocker(QEventLoop *loop);
- explicit QEventLoopLocker(QThread *thread);
- ~QEventLoopLocker();
+ Q_NODISCARD_CTOR Q_CORE_EXPORT QEventLoopLocker() noexcept;
+ Q_NODISCARD_CTOR Q_CORE_EXPORT explicit QEventLoopLocker(QEventLoop *loop) noexcept;
+ Q_NODISCARD_CTOR Q_CORE_EXPORT explicit QEventLoopLocker(QThread *thread) noexcept;
+ Q_CORE_EXPORT ~QEventLoopLocker();
+
+ Q_NODISCARD_CTOR QEventLoopLocker(QEventLoopLocker &&other) noexcept
+ : p{std::exchange(other.p, 0)} {}
+ QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_MOVE_AND_SWAP(QEventLoopLocker)
+
+ void swap(QEventLoopLocker &other) noexcept { std::swap(p, other.p); }
+ friend void swap(QEventLoopLocker &lhs, QEventLoopLocker &rhs) noexcept { lhs.swap(rhs); }
private:
Q_DISABLE_COPY(QEventLoopLocker)
- QEventLoopLockerPrivate *d_ptr;
+ friend class QEventLoopLockerPrivate;
+
+ //
+ // Private implementation details.
+ // Do not call from public inline API!
+ //
+ enum class Type : quintptr {
+ EventLoop,
+ Thread,
+ Application,
+ };
+ explicit QEventLoopLocker(void *ptr, Type t) noexcept;
+ quintptr p;
+ static constexpr quintptr TypeMask = 0x3;
+ Type type() const { return Type(p & TypeMask); }
+ void *pointer() const { return reinterpret_cast<void *>(p & ~TypeMask); }
+ template <typename Func>
+ void visit(Func func) const;
};
QT_END_NAMESPACE
diff --git a/src/corelib/kernel/qeventloop_p.h b/src/corelib/kernel/qeventloop_p.h
index 4ad6d92007..1fcb7a8b81 100644
--- a/src/corelib/kernel/qeventloop_p.h
+++ b/src/corelib/kernel/qeventloop_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QEVENTLOOP_P_H
#define QEVENTLOOP_P_H
diff --git a/src/corelib/kernel/qfunctions_p.h b/src/corelib/kernel/qfunctions_p.h
index 8347dcca01..58afc207e6 100644
--- a/src/corelib/kernel/qfunctions_p.h
+++ b/src/corelib/kernel/qfunctions_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
//
// W A R N I N G
@@ -53,9 +17,5 @@
#include <QtCore/private/qglobal_p.h>
-#if defined(Q_OS_VXWORKS)
-# include "QtCore/qfunctions_vxworks.h"
-#endif
-
#endif
diff --git a/src/corelib/kernel/qfunctions_vxworks.cpp b/src/corelib/kernel/qfunctions_vxworks.cpp
deleted file mode 100644
index 61704c1b54..0000000000
--- a/src/corelib/kernel/qfunctions_vxworks.cpp
+++ /dev/null
@@ -1,208 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qglobal.h"
-
-#ifdef Q_OS_VXWORKS
-
-#include "qplatformdefs.h"
-#include "qfunctions_vxworks.h"
-
-#if defined(_WRS_KERNEL)
-#include <vmLib.h>
-#endif
-#include <selectLib.h>
-#include <ioLib.h>
-
-QT_USE_NAMESPACE
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-// no lfind() - used by the TIF image format
-void *lfind(const void* key, const void* base, size_t* elements, size_t size,
- int (*compare)(const void*, const void*))
-{
- const char* current = (char*) base;
- const char* const end = (char*) (current + (*elements) * size);
- while (current != end) {
- if (compare(current, key) == 0)
- return (void*)current;
- current += size;
- }
- return 0;
-}
-
-
-// no rand_r(), but rand()
-// NOTE: this implementation is wrong for multi threaded applications,
-// but there is no way to get it right on VxWorks (in kernel mode)
-#if defined(_WRS_KERNEL)
-int rand_r(unsigned int * /*seedp*/)
-{
- return rand();
-}
-#endif
-
-// no usleep() support
-int usleep(unsigned int usec)
-{
- div_t dt = div(usec, 1000000);
- struct timespec ts = { dt.quot, dt.rem * 1000 };
-
- return nanosleep(&ts, 0);
-}
-
-
-// gettimeofday() is declared, but is missing from the library
-// It IS however defined in the Curtis-Wright X11 libraries, so
-// we have to make the symbol 'weak'
-#if defined(Q_CC_DIAB) && !defined(VXWORKS_DKM) && !defined(VXWORKS_RTP)
-# pragma weak gettimeofday
-#endif
-int gettimeofday(struct timeval *tv, void /*struct timezone*/ *)
-{
- // the compiler will optimize this and will only use one code path
- if (sizeof(struct timeval) == sizeof(struct timespec)) {
- int res = clock_gettime(CLOCK_REALTIME, (struct timespec *) tv);
- if (!res)
- tv->tv_usec /= 1000;
- return res;
- } else {
- struct timespec ts;
-
- int res = clock_gettime(CLOCK_REALTIME, &ts);
- if (!res) {
- tv->tv_sec = ts.tv_sec;
- tv->tv_usec = ts.tv_nsec / 1000;
- }
- return res;
- }
-}
-
-// neither getpagesize() or sysconf(_SC_PAGESIZE) are available
-int getpagesize()
-{
-#if defined(_WRS_KERNEL)
- return vmPageSizeGet();
-#else
- return sysconf(_SC_PAGESIZE);
-#endif
-}
-
-// symlinks are not supported (lstat is now just a call to stat - see qplatformdefs.h)
-int symlink(const char *, const char *)
-{
- errno = EIO;
- return -1;
-}
-
-ssize_t readlink(const char *, char *, size_t)
-{
- errno = EIO;
- return -1;
-}
-
-// there's no truncate(), but ftruncate() support...
-int truncate(const char *path, off_t length)
-{
- int fd = open(path, O_WRONLY, 00777);
- if (fd >= 0) {
- int res = ftruncate(fd, length);
- int en = errno;
- close(fd);
- errno = en;
- return res;
- }
- // errno is already set by open
- return -1;
-}
-
-
-
-// VxWorks doesn't know about passwd & friends.
-// in order to avoid patching the unix fs path everywhere
-// we introduce some dummy functions that simulate a single
-// 'root' user on the system.
-
-uid_t getuid()
-{
- return 0;
-}
-
-gid_t getgid()
-{
- return 0;
-}
-
-uid_t geteuid()
-{
- return 0;
-}
-
-struct passwd *getpwuid(uid_t uid)
-{
- static struct passwd pwbuf = { "root", 0, 0, 0, 0, 0, 0 };
-
- if (uid == 0) {
- return &pwbuf;
- } else {
- errno = ENOENT;
- return 0;
- }
-}
-
-struct group *getgrgid(gid_t gid)
-{
- static struct group grbuf = { "root", 0, 0, 0 };
-
- if (gid == 0) {
- return &grbuf;
- } else {
- errno = ENOENT;
- return 0;
- }
-}
-
-#ifdef __cplusplus
-} // extern "C"
-#endif
-
-#endif // Q_OS_VXWORKS
diff --git a/src/corelib/kernel/qfunctions_vxworks.h b/src/corelib/kernel/qfunctions_vxworks.h
deleted file mode 100644
index 86f243959f..0000000000
--- a/src/corelib/kernel/qfunctions_vxworks.h
+++ /dev/null
@@ -1,195 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QFUNCTIONS_VXWORKS_H
-#define QFUNCTIONS_VXWORKS_H
-
-#include <QtCore/qglobal.h>
-
-#ifdef Q_OS_VXWORKS
-
-#include <unistd.h>
-#include <pthread.h>
-#include <dirent.h>
-#include <signal.h>
-#include <string.h>
-#include <strings.h>
-#include <errno.h>
-#include <sys/types.h>
-#include <sys/ioctl.h>
-#if defined(_WRS_KERNEL)
-#include <sys/times.h>
-#else
-#include <sys/time.h>
-#endif
-#include <sys/socket.h>
-#include <sys/stat.h>
-#include <sys/wait.h>
-#include <netinet/in.h>
-
-// VxWorks has public header mbuf.h which defines following variables for DKM.
-// Let's undef those to because they overlap with Qt variable names-
-// File mbuf.h is included in headers <netinet/in.h> <net/if.h>, so make sure
-// that those are included before undef's.
-#if defined(mbuf)
-# undef mbuf
-#endif
-#if defined(m_data)
-# undef m_data
-#endif
-#if defined(m_type)
-# undef m_type
-#endif
-#if defined(m_next)
-# undef m_next
-#endif
-#if defined(m_len)
-# undef m_len
-#endif
-#if defined(m_flags)
-# undef m_flags
-#endif
-#if defined(m_hdr)
-# undef m_hdr
-#endif
-#if defined(m_ext)
-# undef m_ext
-#endif
-#if defined(m_act)
-# undef m_act
-#endif
-#if defined(m_nextpkt)
-# undef m_nextpkt
-#endif
-#if defined(m_pkthdr)
-# undef m_pkthdr
-#endif
-
-QT_BEGIN_NAMESPACE
-
-#ifdef QT_BUILD_CORE_LIB
-#endif
-
-QT_END_NAMESPACE
-
-#ifndef RTLD_LOCAL
-#define RTLD_LOCAL 0
-#endif
-
-#ifndef NSIG
-#define NSIG _NSIGS
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-// isascii is missing (sometimes!!)
-#ifndef isascii
-inline int isascii(int c) { return (c & 0x7f); }
-#endif
-
-// no lfind() - used by the TIF image format
-void *lfind(const void* key, const void* base, size_t* elements, size_t size,
- int (*compare)(const void*, const void*));
-
-// no rand_r(), but rand()
-// NOTE: this implementation is wrong for multi threaded applications,
-// but there is no way to get it right on VxWorks (in kernel mode)
-#if defined(_WRS_KERNEL)
-int rand_r(unsigned int * /*seedp*/);
-#endif
-
-// no usleep() support
-int usleep(unsigned int);
-
-#if defined(VXWORKS_DKM) || defined(VXWORKS_RTP)
-int gettimeofday(struct timeval *, void *);
-#else
-// gettimeofday() is declared, but is missing from the library.
-// It IS however defined in the Curtis-Wright X11 libraries, so
-// we have to make the symbol 'weak'
-int gettimeofday(struct timeval *tv, void /*struct timezone*/ *) __attribute__((weak));
-#endif
-
-// getpagesize() not available
-int getpagesize();
-
-// symlinks are not supported (lstat is now just a call to stat - see qplatformdefs.h)
-int symlink(const char *, const char *);
-ssize_t readlink(const char *, char *, size_t);
-
-// there's no truncate(), but ftruncate() support...
-int truncate(const char *path, off_t length);
-
-// VxWorks doesn't know about passwd & friends.
-// in order to avoid patching the unix fs path everywhere
-// we introduce some dummy functions that simulate a single
-// 'root' user on the system.
-
-uid_t getuid();
-gid_t getgid();
-uid_t geteuid();
-
-struct passwd {
- char *pw_name; /* user name */
- char *pw_passwd; /* user password */
- uid_t pw_uid; /* user ID */
- gid_t pw_gid; /* group ID */
- char *pw_gecos; /* real name */
- char *pw_dir; /* home directory */
- char *pw_shell; /* shell program */
-};
-
-struct group {
- char *gr_name; /* group name */
- char *gr_passwd; /* group password */
- gid_t gr_gid; /* group ID */
- char **gr_mem; /* group members */
-};
-
-struct passwd *getpwuid(uid_t uid);
-struct group *getgrgid(gid_t gid);
-
-#ifdef __cplusplus
-} // extern "C"
-#endif
-
-#endif // Q_OS_VXWORKS
-#endif // QFUNCTIONS_VXWORKS_H
diff --git a/src/corelib/kernel/qfunctions_win.cpp b/src/corelib/kernel/qfunctions_win.cpp
new file mode 100644
index 0000000000..048fdbc934
--- /dev/null
+++ b/src/corelib/kernel/qfunctions_win.cpp
@@ -0,0 +1,66 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#include "qfunctions_win_p.h"
+
+#include <QtCore/qdebug.h>
+
+#include <combaseapi.h>
+#include <objbase.h>
+
+#if __has_include(<appmodel.h>)
+# include <appmodel.h>
+# define HAS_APPMODEL
+#endif
+
+QT_BEGIN_NAMESPACE
+
+QComHelper::QComHelper(COINIT concurrencyModel)
+{
+ // Avoid overhead of initializing and using obsolete technology
+ concurrencyModel = COINIT(concurrencyModel | COINIT_DISABLE_OLE1DDE);
+
+ m_initResult = CoInitializeEx(nullptr, concurrencyModel);
+
+ if (FAILED(m_initResult))
+ qErrnoWarning(m_initResult, "Failed to initialize COM library");
+}
+
+QComHelper::~QComHelper()
+{
+ Q_ASSERT(m_threadId == GetCurrentThreadId());
+ if (SUCCEEDED(m_initResult))
+ CoUninitialize();
+}
+
+/*!
+ \internal
+ Checks if the application has a \e{package identity}
+
+ Having a \e{package identity} is required to use many modern
+ Windows APIs.
+
+ https://docs.microsoft.com/en-us/windows/apps/desktop/modernize/modernize-packaged-apps
+*/
+bool qt_win_hasPackageIdentity()
+{
+#if defined(HAS_APPMODEL)
+ static const bool hasPackageIdentity = []() {
+ UINT32 length = 0;
+ switch (const auto result = GetCurrentPackageFullName(&length, nullptr)) {
+ case ERROR_INSUFFICIENT_BUFFER:
+ return true;
+ case APPMODEL_ERROR_NO_PACKAGE:
+ return false;
+ default:
+ qWarning("Failed to resolve package identity (error code %ld)", result);
+ return false;
+ }
+ }();
+ return hasPackageIdentity;
+#else
+ return false;
+#endif
+}
+
+QT_END_NAMESPACE
diff --git a/src/corelib/kernel/qfunctions_win_p.h b/src/corelib/kernel/qfunctions_win_p.h
new file mode 100644
index 0000000000..ab5417f8a2
--- /dev/null
+++ b/src/corelib/kernel/qfunctions_win_p.h
@@ -0,0 +1,51 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QFUNCTIONS_WIN_P_H
+#define QFUNCTIONS_WIN_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QtCore/private/qglobal_p.h>
+
+#if defined(Q_OS_WIN) || defined(Q_QDOC)
+
+#if !defined(QT_BOOTSTRAPPED)
+#include <QtCore/private/qfunctions_winrt_p.h>
+#endif
+
+#include <QtCore/qt_windows.h>
+
+QT_BEGIN_NAMESPACE
+
+class Q_CORE_EXPORT QComHelper
+{
+ Q_DISABLE_COPY_MOVE(QComHelper)
+public:
+ QComHelper(COINIT concurrencyModel = COINIT_APARTMENTTHREADED);
+ ~QComHelper();
+
+ bool isValid() const { return SUCCEEDED(m_initResult); }
+ explicit operator bool() const { return isValid(); }
+
+private:
+ HRESULT m_initResult = E_FAIL;
+ DWORD m_threadId{ GetCurrentThreadId() };
+};
+
+Q_CORE_EXPORT bool qt_win_hasPackageIdentity();
+
+QT_END_NAMESPACE
+
+#endif // Q_OS_WIN
+
+#endif // QFUNCTIONS_WIN_P_H
diff --git a/src/corelib/kernel/qfunctions_winrt_p.h b/src/corelib/kernel/qfunctions_winrt_p.h
index 8db94c124b..c895733c93 100644
--- a/src/corelib/kernel/qfunctions_winrt_p.h
+++ b/src/corelib/kernel/qfunctions_winrt_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QFUNCTIONS_WINRT_P_H
#define QFUNCTIONS_WINRT_P_H
@@ -51,7 +15,7 @@
// We mean it.
//
-#include <QtCore/qglobal.h>
+#include <QtCore/private/qglobal_p.h>
#if defined(Q_OS_WIN) && defined(Q_CC_MSVC)
diff --git a/src/corelib/kernel/qiterable.cpp b/src/corelib/kernel/qiterable.cpp
index 7ee7be2696..a8c93fbc1c 100644
--- a/src/corelib/kernel/qiterable.cpp
+++ b/src/corelib/kernel/qiterable.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include <QtCore/qiterable.h>
@@ -43,7 +7,7 @@ QT_BEGIN_NAMESPACE
/*!
\class QBaseIterator
-
+ \inmodule QtCore
QBaseIterator forms the common base class for all iterators operating on
subclasses of QIterable.
*/
@@ -187,7 +151,7 @@ QT_BEGIN_NAMESPACE
/*!
\fn template<class Container> QIterator<Container> &QIterator<Container>::operator++()
- The prefix ++ operator (\c{++it}) advances the iterator to the
+ The prefix \c{++} operator (\c{++it}) advances the iterator to the
next item in the container and returns an iterator to the new current
item.
@@ -200,7 +164,7 @@ QT_BEGIN_NAMESPACE
\fn template<class Container> QIterator<Container> QIterator<Container>::operator++(int)
\overload
- The postfix ++ operator (\c{it++}) advances the iterator to the
+ The postfix \c{++} operator (\c{it++}) advances the iterator to the
next item in the container and returns an iterator to the previously
current item.
*/
@@ -209,7 +173,7 @@ QT_BEGIN_NAMESPACE
/*!
\fn template<class Container> QIterator<Container> &QIterator<Container>::operator--()
- The prefix -- operator (\c{--it}) makes the preceding item
+ The prefix \c{--} operator (\c{--it}) makes the preceding item
current and returns an iterator to the new current item.
Calling this function on QSequentialIterable::begin() leads to undefined results.
@@ -225,7 +189,7 @@ QT_BEGIN_NAMESPACE
\overload
- The postfix -- operator (\c{it--}) makes the preceding item
+ The postfix \c{--} operator (\c{it--}) makes the preceding item
current and returns an iterator to the previously current item.
If the container in the QVariant does not support bi-directional iteration, calling this function
@@ -276,6 +240,7 @@ QT_BEGIN_NAMESPACE
/*!
\fn template<class Container> qsizetype QIterator<Container>::operator-(const QIterator<Container> &j) const
+ \overload
Returns the distance between the two iterators.
@@ -323,7 +288,7 @@ QT_BEGIN_NAMESPACE
/*!
\fn template<class Container> QConstIterator<Container> &QConstIterator<Container>::operator++()
- The prefix ++ operator (\c{++it}) advances the iterator to the
+ The prefix \c{++} operator (\c{++it}) advances the iterator to the
next item in the container and returns an iterator to the new current
item.
@@ -337,7 +302,7 @@ QT_BEGIN_NAMESPACE
\overload
- The postfix ++ operator (\c{it++}) advances the iterator to the
+ The postfix \c{++} operator (\c{it++}) advances the iterator to the
next item in the container and returns an iterator to the previously
current item.
*/
@@ -345,7 +310,7 @@ QT_BEGIN_NAMESPACE
/*!
\fn template<class Container> QConstIterator<Container> &QConstIterator<Container>::operator--()
- The prefix -- operator (\c{--it}) makes the preceding item
+ The prefix \c{--} operator (\c{--it}) makes the preceding item
current and returns an iterator to the new current item.
Calling this function on QIterable<Container>::begin() leads to undefined results.
@@ -361,7 +326,7 @@ QT_BEGIN_NAMESPACE
\overload
- The postfix -- operator (\c{it--}) makes the preceding item
+ The postfix \c{--} operator (\c{it--}) makes the preceding item
current and returns an iterator to the previously current item.
If the container in the QVariant does not support bi-directional iteration, calling this function
@@ -413,6 +378,8 @@ QT_BEGIN_NAMESPACE
/*!
\fn template <class Container> qsizetype QConstIterator<Container>::operator-(const QConstIterator<Container> &j) const
+ \overload
+
Returns the distance between the two iterators.
\sa operator+(), operator-=(), QIterable::canReverseIterate()
@@ -541,7 +508,7 @@ QT_BEGIN_NAMESPACE
/*!
\fn template<class Iterator, typename IteratorCategory> QTaggedIterator<Iterator, IteratorCategory> &QTaggedIterator<Iterator, IteratorCategory>::operator++()
- The prefix ++ operator (\c{++it}) advances the iterator to the
+ The prefix \c{++} operator (\c{++it}) advances the iterator to the
next item in the container and returns an iterator to the new current
item.
@@ -554,7 +521,7 @@ QT_BEGIN_NAMESPACE
\fn template<class Iterator, typename IteratorCategory> QTaggedIterator<Iterator, IteratorCategory> QTaggedIterator<Iterator, IteratorCategory>::operator++(int)
\overload
- The postfix ++ operator (\c{it++}) advances the iterator to the
+ The postfix \c{++} operator (\c{it++}) advances the iterator to the
next item in the container and returns an iterator to the previously
current item.
*/
@@ -563,7 +530,7 @@ QT_BEGIN_NAMESPACE
/*!
\fn template<class Iterator, typename IteratorCategory> QTaggedIterator<Iterator, IteratorCategory> &QTaggedIterator<Iterator, IteratorCategory>::operator--()
- The prefix -- operator (\c{--it}) makes the preceding item
+ The prefix \c{--} operator (\c{--it}) makes the preceding item
current and returns an iterator to the new current item.
Calling this function on QSequentialIterable::begin() leads to undefined results.
@@ -578,7 +545,7 @@ QT_BEGIN_NAMESPACE
\fn template<class Iterator, typename IteratorCategory> QTaggedIterator<Iterator, IteratorCategory> QTaggedIterator<Iterator, IteratorCategory>::operator--(int)
\overload
- The postfix -- operator (\c{it--}) makes the preceding item
+ The postfix \c{--} operator (\c{it--}) makes the preceding item
current and returns an iterator to the previously current item.
If the container in the QVariant does not support bi-directional iteration, calling this function
diff --git a/src/corelib/kernel/qiterable.h b/src/corelib/kernel/qiterable.h
index c77a158420..4adcdfd76f 100644
--- a/src/corelib/kernel/qiterable.h
+++ b/src/corelib/kernel/qiterable.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QITERABLE_H
#define QITERABLE_H
@@ -55,16 +19,16 @@ namespace QtPrivate {
QTaggedPointer<Storage, Tag> m_pointer;
public:
- QConstPreservingPointer(std::nullptr_t) : m_pointer(nullptr, Const) {}
+ Q_NODISCARD_CTOR QConstPreservingPointer(std::nullptr_t) : m_pointer(nullptr, Const) {}
- QConstPreservingPointer(const void *pointer, qsizetype alignment)
+ Q_NODISCARD_CTOR QConstPreservingPointer(const void *pointer, qsizetype alignment)
: m_pointer(reinterpret_cast<Storage *>(const_cast<void *>(pointer)), Const)
{
Q_UNUSED(alignment);
Q_ASSERT(alignment > qsizetype(alignof(Storage)));
}
- QConstPreservingPointer(void *pointer, qsizetype alignment)
+ Q_NODISCARD_CTOR QConstPreservingPointer(void *pointer, qsizetype alignment)
: m_pointer(reinterpret_cast<Storage *>(pointer), Mutable)
{
Q_UNUSED(alignment);
@@ -72,20 +36,20 @@ namespace QtPrivate {
}
template<typename InputType>
- QConstPreservingPointer(const InputType *pointer)
+ Q_NODISCARD_CTOR QConstPreservingPointer(const InputType *pointer)
: m_pointer(reinterpret_cast<Storage *>(const_cast<InputType *>(pointer)), Const)
{
static_assert(alignof(InputType) >= alignof(Storage));
}
template<typename InputType>
- QConstPreservingPointer(InputType *pointer)
+ Q_NODISCARD_CTOR QConstPreservingPointer(InputType *pointer)
: m_pointer(reinterpret_cast<Storage *>(pointer), Mutable)
{
static_assert(alignof(InputType) >= alignof(Storage));
}
- QConstPreservingPointer() = default;
+ Q_NODISCARD_CTOR QConstPreservingPointer() = default;
const Type *constPointer() const
{
@@ -107,37 +71,41 @@ public:
QTaggedIterator(Iterator &&it) : Iterator(std::move(it))
{
const QMetaContainer metaContainer = this->metaContainer();
- if (std::is_base_of_v<std::random_access_iterator_tag, IteratorCategory>
- && !metaContainer.hasRandomAccessIterator()) {
- qFatal("You cannot use this iterator as a random access iterator");
- this->clearIterator();
+ if constexpr (std::is_base_of_v<std::random_access_iterator_tag, IteratorCategory>) {
+ if (!metaContainer.hasRandomAccessIterator()) {
+ qFatal("You cannot use this iterator as a random access iterator");
+ this->clearIterator();
+ }
}
- if (std::is_base_of_v<std::bidirectional_iterator_tag, IteratorCategory>
- && !metaContainer.hasBidirectionalIterator()) {
- qFatal("You cannot use this iterator as a bidirectional iterator");
- this->clearIterator();
+ if constexpr (std::is_base_of_v<std::bidirectional_iterator_tag, IteratorCategory>) {
+ if (!metaContainer.hasBidirectionalIterator()) {
+ qFatal("You cannot use this iterator as a bidirectional iterator");
+ this->clearIterator();
+ }
}
- if (std::is_base_of_v<std::forward_iterator_tag, IteratorCategory>
- && !metaContainer.hasForwardIterator()) {
- qFatal("You cannot use this iterator as a forward iterator");
- this->clearIterator();
+ if constexpr (std::is_base_of_v<std::forward_iterator_tag, IteratorCategory>) {
+ if (!metaContainer.hasForwardIterator()) {
+ qFatal("You cannot use this iterator as a forward iterator");
+ this->clearIterator();
+ }
}
- if (std::is_base_of_v<std::input_iterator_tag, IteratorCategory>
- && !metaContainer.hasInputIterator()) {
- qFatal("You cannot use this iterator as an input iterator");
- this->clearIterator();
+ if constexpr (std::is_base_of_v<std::input_iterator_tag, IteratorCategory>) {
+ if (!metaContainer.hasInputIterator()) {
+ qFatal("You cannot use this iterator as an input iterator");
+ this->clearIterator();
+ }
}
}
bool operator==(const QTaggedIterator &o) const { return Iterator::operator==(o); }
bool operator!=(const QTaggedIterator &o) const { return Iterator::operator!=(o); }
QTaggedIterator &operator++() { Iterator::operator++(); return *this; }
- QTaggedIterator operator++(int x) { return QTaggedIterator(Iterator::operator++(x)); };
+ QTaggedIterator operator++(int x) { return QTaggedIterator(Iterator::operator++(x)); }
QTaggedIterator &operator--() { Iterator::operator--(); return *this; }
- QTaggedIterator operator--(int x) { return QTaggedIterator(Iterator::operator--(x)); };
+ QTaggedIterator operator--(int x) { return QTaggedIterator(Iterator::operator--(x)); }
QTaggedIterator &operator+=(qsizetype j) { Iterator::operator+=(j); return *this; }
QTaggedIterator &operator-=(qsizetype j) { Iterator::operator-=(j); return *this; }
QTaggedIterator operator+(qsizetype j) const { return QTaggedIterator(Iterator::operator+(j)); }
@@ -540,7 +508,7 @@ public:
Container metaContainer() const
{
return m_metaContainer;
- };
+ }
};
QT_END_NAMESPACE
diff --git a/src/corelib/kernel/qiterable_p.h b/src/corelib/kernel/qiterable_p.h
index d975a591fb..6a9c804745 100644
--- a/src/corelib/kernel/qiterable_p.h
+++ b/src/corelib/kernel/qiterable_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QITERABLE_P_H
#define QITERABLE_P_H
@@ -51,7 +15,7 @@
// We mean it.
//
-#include <QtCore/qglobal.h>
+#include <QtCore/private/qglobal_p.h>
#include <QtCore/qvariant.h>
QT_BEGIN_NAMESPACE
diff --git a/src/corelib/kernel/qjniarray.h b/src/corelib/kernel/qjniarray.h
new file mode 100644
index 0000000000..976b4e92e3
--- /dev/null
+++ b/src/corelib/kernel/qjniarray.h
@@ -0,0 +1,464 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QJNIARRAY_H
+#define QJNIARRAY_H
+
+#include <QtCore/qlist.h>
+
+#if defined(Q_QDOC) || defined(Q_OS_ANDROID)
+#include <QtCore/qbytearray.h>
+#include <QtCore/qjniobject.h>
+
+#include <iterator>
+#include <utility>
+#include <QtCore/q20type_traits.h>
+
+QT_BEGIN_NAMESPACE
+
+template <typename T> class QJniArray;
+template <typename T>
+struct QJniArrayIterator
+{
+ QJniArrayIterator() = default;
+
+ constexpr QJniArrayIterator(const QJniArrayIterator &other) noexcept = default;
+ constexpr QJniArrayIterator(QJniArrayIterator &&other) noexcept = default;
+ constexpr QJniArrayIterator &operator=(const QJniArrayIterator &other) noexcept = default;
+ constexpr QJniArrayIterator &operator=(QJniArrayIterator &&other) noexcept = default;
+
+ using difference_type = jsize;
+ using value_type = T;
+ using pointer = T *;
+ using reference = T; // difference to container requirements
+ using const_reference = reference;
+ using iterator_category = std::bidirectional_iterator_tag;
+
+ friend bool operator==(const QJniArrayIterator &lhs, const QJniArrayIterator &rhs) noexcept
+ {
+ return lhs.m_array == rhs.m_array && lhs.m_index == rhs.m_index;
+ }
+ friend bool operator!=(const QJniArrayIterator &lhs, const QJniArrayIterator &rhs) noexcept
+ {
+ return !(lhs == rhs);
+ }
+ const_reference operator*() const
+ {
+ return m_array->at(m_index);
+ }
+ friend QJniArrayIterator &operator++(QJniArrayIterator &that) noexcept
+ {
+ ++that.m_index;
+ return that;
+ }
+ friend QJniArrayIterator operator++(QJniArrayIterator &that, int) noexcept
+ {
+ auto copy = that;
+ ++that;
+ return copy;
+ }
+ friend QJniArrayIterator &operator--(QJniArrayIterator &that) noexcept
+ {
+ --that.m_index;
+ return that;
+ }
+ friend QJniArrayIterator operator--(QJniArrayIterator &that, int) noexcept
+ {
+ auto copy = that;
+ --that;
+ return copy;
+ }
+ void swap(QJniArrayIterator &other) noexcept
+ {
+ std::swap(m_index, other.m_index);
+ qt_ptr_swap(m_array, other.m_array);
+ }
+
+private:
+ using VT = std::remove_const_t<T>;
+ friend class QJniArray<VT>;
+
+ qsizetype m_index = 0;
+ const QJniArray<VT> *m_array = nullptr;
+
+ QJniArrayIterator(qsizetype index, const QJniArray<VT> *array)
+ : m_index(index), m_array(array)
+ {}
+};
+
+class QJniArrayBase
+{
+ // for SFINAE'ing out the fromContainer named constructor
+ template <typename Container, typename = void> struct CanConvertHelper : std::false_type {};
+ template <typename Container>
+ struct CanConvertHelper<Container, std::void_t<decltype(std::data(std::declval<Container>())),
+ decltype(std::size(std::declval<Container>())),
+ typename Container::value_type
+ >
+ > : std::true_type {};
+
+public:
+ using size_type = jsize;
+ using difference_type = size_type;
+
+ operator QJniObject() const { return m_object; }
+
+ template <typename T = jobject>
+ T object() const { return m_object.object<T>(); }
+ bool isValid() const { return m_object.isValid(); }
+
+ size_type size() const
+ {
+ if (jarray array = m_object.object<jarray>())
+ return jniEnv()->GetArrayLength(array);
+ return 0;
+ }
+
+ template <typename Container>
+ static constexpr bool canConvert = CanConvertHelper<q20::remove_cvref_t<Container>>::value;
+ template <typename Container>
+ using IfCanConvert = std::enable_if_t<canConvert<Container>, bool>;
+ template <typename Container
+ , IfCanConvert<Container> = true
+ >
+ static auto fromContainer(Container &&container)
+ {
+ Q_ASSERT_X(size_t(std::size(container)) <= size_t((std::numeric_limits<size_type>::max)()),
+ "QJniArray::fromContainer", "Container is too large for a Java array");
+
+ using ElementType = typename std::remove_reference_t<Container>::value_type;
+ if constexpr (std::disjunction_v<std::is_same<ElementType, jobject>,
+ std::is_same<ElementType, QJniObject>,
+ std::is_same<ElementType, QString>,
+ std::is_base_of<QtJniTypes::JObjectBase, ElementType>
+ >) {
+ return makeObjectArray(std::forward<Container>(container));
+ } else if constexpr (std::is_same_v<ElementType, jfloat>) {
+ return makeArray<jfloat>(std::forward<Container>(container), &JNIEnv::NewFloatArray,
+ &JNIEnv::SetFloatArrayRegion);
+ } else if constexpr (std::is_same_v<ElementType, jdouble>) {
+ return makeArray<jdouble>(std::forward<Container>(container), &JNIEnv::NewDoubleArray,
+ &JNIEnv::SetDoubleArrayRegion);
+ } else if constexpr (std::disjunction_v<std::is_same<ElementType, jboolean>,
+ std::is_same<ElementType, bool>>) {
+ return makeArray<jboolean>(std::forward<Container>(container), &JNIEnv::NewBooleanArray,
+ &JNIEnv::SetBooleanArrayRegion);
+ } else if constexpr (std::disjunction_v<std::is_same<ElementType, jbyte>,
+ std::is_same<ElementType, char>>) {
+ return makeArray<jbyte>(std::forward<Container>(container), &JNIEnv::NewByteArray,
+ &JNIEnv::SetByteArrayRegion);
+ } else if constexpr (std::disjunction_v<std::is_same<ElementType, jchar>,
+ std::is_same<ElementType, QChar>>) {
+ return makeArray<jchar>(std::forward<Container>(container), &JNIEnv::NewCharArray,
+ &JNIEnv::SetCharArrayRegion);
+ } else if constexpr (std::is_same_v<ElementType, jshort>
+ || sizeof(ElementType) == sizeof(jshort)) {
+ return makeArray<jshort>(std::forward<Container>(container), &JNIEnv::NewShortArray,
+ &JNIEnv::SetShortArrayRegion);
+ } else if constexpr (std::is_same_v<ElementType, jint>
+ || sizeof(ElementType) == sizeof(jint)) {
+ return makeArray<jint>(std::forward<Container>(container), &JNIEnv::NewIntArray,
+ &JNIEnv::SetIntArrayRegion);
+ } else if constexpr (std::is_same_v<ElementType, jlong>
+ || sizeof(ElementType) == sizeof(jlong)) {
+ return makeArray<jlong>(std::forward<Container>(container), &JNIEnv::NewLongArray,
+ &JNIEnv::SetLongArrayRegion);
+ }
+ }
+
+protected:
+ QJniArrayBase() = default;
+ ~QJniArrayBase() = default;
+
+ explicit QJniArrayBase(jarray array)
+ : m_object(static_cast<jobject>(array))
+ {
+ }
+ explicit QJniArrayBase(const QJniObject &object)
+ : m_object(object)
+ {}
+ explicit QJniArrayBase(QJniObject &&object) noexcept
+ : m_object(std::move(object))
+ {}
+
+ JNIEnv *jniEnv() const noexcept { return QJniEnvironment::getJniEnv(); }
+
+ template <typename ElementType, typename List, typename NewFn, typename SetFn>
+ static auto makeArray(List &&list, NewFn &&newArray, SetFn &&setRegion);
+ template <typename List>
+ static auto makeObjectArray(List &&list);
+
+private:
+ QJniObject m_object;
+};
+
+template <typename T>
+class QJniArray : public QJniArrayBase
+{
+ friend struct QJniArrayIterator<T>;
+public:
+ using Type = T;
+
+ using value_type = T;
+ using reference = T;
+ using const_reference = const reference;
+
+ // read-only container, so no iterator typedef
+ using const_iterator = QJniArrayIterator<const T>;
+ using const_reverse_iterator = std::reverse_iterator<const_iterator>;
+
+ QJniArray() = default;
+ explicit QJniArray(jarray array) : QJniArrayBase(array) {}
+ explicit QJniArray(const QJniObject &object) : QJniArrayBase(object) {}
+ explicit QJniArray(QJniObject &&object) noexcept : QJniArrayBase(std::move(object)) {}
+
+ // base class destructor is protected, so need to provide all SMFs
+ QJniArray(const QJniArray &other) = default;
+ QJniArray(QJniArray &&other) noexcept = default;
+ QJniArray &operator=(const QJniArray &other) = default;
+ QJniArray &operator=(QJniArray &&other) noexcept = default;
+
+ template <typename Container
+ , IfCanConvert<Container> = true
+ >
+ explicit QJniArray(Container &&container)
+ : QJniArrayBase(QJniArrayBase::fromContainer(std::forward<Container>(container)))
+ {
+ }
+
+ template <typename E = T
+ , IfCanConvert<std::initializer_list<E>> = true
+ >
+ Q_IMPLICIT inline QJniArray(std::initializer_list<T> list)
+ : QJniArrayBase(QJniArrayBase::fromContainer(list))
+ {
+ }
+
+ template <typename Other, std::enable_if_t<std::is_convertible_v<Other, Type>, bool> = true>
+ QJniArray(QJniArray<Other> &&other)
+ : QJniArrayBase(std::forward<QJniArray<Other>>(other))
+ {
+ }
+ ~QJniArray() = default;
+
+ auto arrayObject() const
+ {
+ if constexpr (std::is_convertible_v<jobject, T>)
+ return object<jobjectArray>();
+ else if constexpr (std::is_same_v<T, jbyte>)
+ return object<jbyteArray>();
+ else if constexpr (std::is_same_v<T, jchar>)
+ return object<jcharArray>();
+ else if constexpr (std::is_same_v<T, jboolean>)
+ return object<jbooleanArray>();
+ else if constexpr (std::is_same_v<T, jshort>)
+ return object<jshortArray>();
+ else if constexpr (std::is_same_v<T, jint>)
+ return object<jintArray>();
+ else if constexpr (std::is_same_v<T, jlong>)
+ return object<jlongArray>();
+ else if constexpr (std::is_same_v<T, jfloat>)
+ return object<jfloatArray>();
+ else if constexpr (std::is_same_v<T, jdouble>)
+ return object<jdoubleArray>();
+ else
+ return object<jarray>();
+ }
+
+ const_iterator begin() const noexcept { return {0, this}; }
+ const_iterator constBegin() const noexcept { return begin(); }
+ const_iterator cbegin() const noexcept { return begin(); }
+ const_iterator end() const noexcept { return {size(), this}; }
+ const_iterator constEnd() const noexcept { return {end()}; }
+ const_iterator cend() const noexcept { return {end()}; }
+
+ const_reverse_iterator rbegin() const noexcept { return const_reverse_iterator(end()); }
+ const_reverse_iterator rend() const noexcept { return const_reverse_iterator(begin()); }
+ const_reverse_iterator crbegin() const noexcept { return const_reverse_iterator(end()); }
+ const_reverse_iterator crend() const noexcept { return const_reverse_iterator(begin()); }
+
+ const_reference operator[](size_type i) const { return at(i); }
+ const_reference at(size_type i) const
+ {
+ JNIEnv *env = jniEnv();
+ if constexpr (std::is_convertible_v<jobject, T>) {
+ jobject element = env->GetObjectArrayElement(object<jobjectArray>(), i);
+ if constexpr (std::is_base_of_v<QJniObject, T>)
+ return QJniObject::fromLocalRef(element);
+ else if constexpr (std::is_base_of_v<QtJniTypes::JObjectBase, T>)
+ return T::fromLocalRef(element);
+ else
+ return T{element};
+ } else if constexpr (std::is_base_of_v<std::remove_pointer_t<jobject>, std::remove_pointer_t<T>>) {
+ // jstring, jclass etc
+ return static_cast<T>(env->GetObjectArrayElement(object<jobjectArray>(), i));
+ } else {
+ T res = {};
+ if constexpr (std::is_same_v<T, jbyte>)
+ env->GetByteArrayRegion(object<jbyteArray>(), i, 1, &res);
+ else if constexpr (std::is_same_v<T, jchar>)
+ env->GetCharArrayRegion(object<jcharArray>(), i, 1, &res);
+ else if constexpr (std::is_same_v<T, jboolean>)
+ env->GetBooleanArrayRegion(object<jbooleanArray>(), i, 1, &res);
+ else if constexpr (std::is_same_v<T, jshort>)
+ env->GetShortArrayRegion(object<jshortArray>(), i, 1, &res);
+ else if constexpr (std::is_same_v<T, jint>)
+ env->GetIntArrayRegion(object<jbyteArray>(), i, 1, &res);
+ else if constexpr (std::is_same_v<T, jlong>)
+ env->GetLongArrayRegion(object<jlongArray>(), i, 1, &res);
+ else if constexpr (std::is_same_v<T, jfloat>)
+ env->GetFloatArrayRegion(object<jfloatArray>(), i, 1, &res);
+ else if constexpr (std::is_same_v<T, jdouble>)
+ env->GetDoubleArrayRegion(object<jdoubleArray>(), i, 1, &res);
+ return res;
+ }
+ }
+ auto toContainer() const
+ {
+ JNIEnv *env = jniEnv();
+ if constexpr (std::is_same_v<T, jobject>) {
+ QList<jobject> res;
+ res.reserve(size());
+ for (auto element : *this)
+ res.append(element);
+ return res;
+ } else if constexpr (std::is_same_v<T, jstring>) {
+ QStringList res;
+ res.reserve(size());
+ for (auto element : *this)
+ res.append(QJniObject(element).toString());
+ return res;
+ } else if constexpr (std::is_same_v<T, jbyte>) {
+ const qsizetype bytecount = size();
+ QByteArray res(bytecount, Qt::Initialization::Uninitialized);
+ env->GetByteArrayRegion(object<jbyteArray>(),
+ 0, bytecount, reinterpret_cast<jbyte *>(res.data()));
+ return res;
+ } else {
+ QList<T> res;
+ res.resize(size());
+ if constexpr (std::is_same_v<T, jchar>) {
+ env->GetCharArrayRegion(object<jcharArray>(),
+ 0, res.size(), res.data());
+ } else if constexpr (std::is_same_v<T, jboolean>) {
+ env->GetBooleanArrayRegion(object<jbooleanArray>(),
+ 0, res.size(), res.data());
+ } else if constexpr (std::is_same_v<T, jshort>) {
+ env->GetShortArrayRegion(object<jshortArray>(),
+ 0, res.size(), res.data());
+ } else if constexpr (std::is_same_v<T, jint>) {
+ env->GetIntArrayRegion(object<jintArray>(),
+ 0, res.size(), res.data());
+ } else if constexpr (std::is_same_v<T, jlong>) {
+ env->GetLongArrayRegion(object<jlongArray>(),
+ 0, res.size(), res.data());
+ } else if constexpr (std::is_same_v<T, jfloat>) {
+ env->GetFloatArrayRegion(object<jfloatArray>(),
+ 0, res.size(), res.data());
+ } else if constexpr (std::is_same_v<T, jdouble>) {
+ env->GetDoubleArrayRegion(object<jdoubleArray>(),
+ 0, res.size(), res.data());
+ } else {
+ res.clear();
+ }
+ return res;
+ }
+ }
+};
+
+template <typename ElementType, typename List, typename NewFn, typename SetFn>
+auto QJniArrayBase::makeArray(List &&list, NewFn &&newArray, SetFn &&setRegion)
+{
+ const size_type length = size_type(std::size(list));
+ JNIEnv *env = QJniEnvironment::getJniEnv();
+ auto localArray = (env->*newArray)(length);
+ if (QJniEnvironment::checkAndClearExceptions(env))
+ return QJniArray<ElementType>();
+
+ // can't use static_cast here because we have signed/unsigned mismatches
+ if (length) {
+ (env->*setRegion)(localArray, 0, length,
+ reinterpret_cast<const ElementType *>(std::data(std::as_const(list))));
+ }
+ return QJniArray<ElementType>(localArray);
+};
+
+template <typename List>
+auto QJniArrayBase::makeObjectArray(List &&list)
+{
+ using ElementType = typename q20::remove_cvref_t<List>::value_type;
+ using ResultType = QJniArray<decltype(std::declval<QJniObject::LocalFrame<>>().convertToJni(
+ std::declval<ElementType>()))
+ >;
+
+ if (std::size(list) == 0)
+ return ResultType();
+
+ JNIEnv *env = QJniEnvironment::getJniEnv();
+ const size_type length = size_type(std::size(list));
+
+ // this assumes that all objects in the list have the same class
+ jclass elementClass = nullptr;
+ if constexpr (std::disjunction_v<std::is_same<ElementType, QJniObject>,
+ std::is_base_of<QtJniTypes::JObjectBase, ElementType>>) {
+ elementClass = std::begin(list)->objectClass();
+ } else if constexpr (std::is_same_v<ElementType, QString>) {
+ elementClass = env->FindClass("java/lang/String");
+ } else {
+ elementClass = env->GetObjectClass(*std::begin(list));
+ }
+ auto localArray = env->NewObjectArray(length, elementClass, nullptr);
+ if (QJniEnvironment::checkAndClearExceptions(env))
+ return ResultType();
+
+ // explicitly manage the frame for local references in chunks of 100
+ QJniObject::LocalFrame frame(env);
+ constexpr jint frameCapacity = 100;
+ qsizetype i = 0;
+ for (const auto &element : std::as_const(list)) {
+ if (i % frameCapacity == 0) {
+ if (i)
+ env->PopLocalFrame(nullptr);
+ if (env->PushLocalFrame(frameCapacity) != 0)
+ return ResultType{};
+ }
+ jobject object = frame.convertToJni(element);
+ env->SetObjectArrayElement(localArray, i, object);
+ ++i;
+ }
+ if (i)
+ env->PopLocalFrame(nullptr);
+ return ResultType(localArray);
+}
+
+namespace QtJniTypes
+{
+template <typename T> struct IsJniArray: std::false_type {};
+template <typename T> struct IsJniArray<QJniArray<T>> : std::true_type {};
+template <typename T> struct Traits<QJniArray<T>> {
+ template <IfValidFieldType<T> = true>
+ static constexpr auto signature()
+ {
+ return CTString("[") + Traits<T>::signature();
+ }
+};
+template <typename T> struct Traits<QList<T>> {
+ template <IfValidFieldType<T> = true>
+ static constexpr auto signature()
+ {
+ return CTString("[") + Traits<T>::signature();
+ }
+};
+template <> struct Traits<QByteArray> {
+ static constexpr auto signature()
+ {
+ return CTString("[B");
+ }
+};
+}
+
+QT_END_NAMESPACE
+
+#endif
+
+#endif // QJNIARRAY_H
diff --git a/src/corelib/kernel/qjnienvironment.cpp b/src/corelib/kernel/qjnienvironment.cpp
index 9766ff4d3b..1e2826e76b 100644
--- a/src/corelib/kernel/qjnienvironment.cpp
+++ b/src/corelib/kernel/qjnienvironment.cpp
@@ -1,44 +1,7 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qjnienvironment.h"
-#include "qjniobject.h"
#include "qjnihelpers_p.h"
#include <QtCore/QThread>
@@ -66,8 +29,6 @@ QT_BEGIN_NAMESPACE
It has not been tested for other platforms.
*/
-static const char qJniThreadName[] = "QtThread";
-
class QJniEnvironmentPrivate
{
public:
@@ -83,47 +44,42 @@ public:
}
};
-struct QJniLocalRefDeleterPrivate
-{
- static void cleanup(jobject obj)
- {
- if (!obj)
- return;
-
- QJniEnvironment env;
- env->DeleteLocalRef(obj);
- }
-};
-
-// To simplify this we only define it for jobjects.
-typedef QScopedPointer<_jobject, QJniLocalRefDeleterPrivate> QJniScopedLocalRefPrivate;
-
-
Q_GLOBAL_STATIC(QThreadStorage<QJniEnvironmentPrivateTLS *>, jniEnvTLS)
-
/*!
- \fn QJniEnvironment::QJniEnvironment()
-
Constructs a new JNI Environment object and attaches the current thread to the Java VM.
*/
QJniEnvironment::QJniEnvironment()
: d(new QJniEnvironmentPrivate{})
{
+ d->jniEnv = getJniEnv();
+}
+
+/*!
+ Returns the JNIEnv pointer for the current thread.
+
+ The current thread will be attached to the Java VM.
+*/
+JNIEnv *QJniEnvironment::getJniEnv()
+{
+ JNIEnv *jniEnv = nullptr;
+
JavaVM *vm = QtAndroidPrivate::javaVM();
- const jint ret = vm->GetEnv((void**)&d->jniEnv, JNI_VERSION_1_6);
- if (ret == JNI_OK) // Already attached
- return;
+ const jint ret = vm->GetEnv((void**)&jniEnv, JNI_VERSION_1_6);
if (ret == JNI_EDETACHED) { // We need to (re-)attach
- JavaVMAttachArgs args = { JNI_VERSION_1_6, qJniThreadName, nullptr };
- if (vm->AttachCurrentThread(&d->jniEnv, &args) != JNI_OK)
- return;
-
- if (!jniEnvTLS->hasLocalData()) // If we attached the thread we own it.
- jniEnvTLS->setLocalData(new QJniEnvironmentPrivateTLS);
+ const QByteArray threadName = QThread::currentThread()->objectName().toUtf8();
+ JavaVMAttachArgs args = { JNI_VERSION_1_6,
+ threadName.isEmpty() ? "QtThread" : threadName.constData(),
+ nullptr
+ };
+ if (vm->AttachCurrentThread(&jniEnv, &args) == JNI_OK) {
+ if (!jniEnvTLS->hasLocalData()) // If we attached the thread we own it.
+ jniEnvTLS->setLocalData(new QJniEnvironmentPrivateTLS);
+ }
}
+ return jniEnv;
}
/*!
@@ -148,8 +104,6 @@ bool QJniEnvironment::isValid() const
}
/*!
- \fn JNIEnv *QJniEnvironment::operator->() const
-
Provides access to the JNI Environment's \c JNIEnv pointer.
*/
JNIEnv *QJniEnvironment::operator->() const
@@ -158,8 +112,6 @@ JNIEnv *QJniEnvironment::operator->() const
}
/*!
- \fn JNIEnv &QJniEnvironment::operator*() const
-
Returns the JNI Environment's \c JNIEnv object.
*/
JNIEnv &QJniEnvironment::operator*() const
@@ -168,8 +120,6 @@ JNIEnv &QJniEnvironment::operator*() const
}
/*!
- \fn JNIEnv *QJniEnvironment::jniEnv() const
-
Returns the JNI Environment's \c JNIEnv pointer.
*/
JNIEnv *QJniEnvironment::jniEnv() const
@@ -232,6 +182,16 @@ jmethodID QJniEnvironment::findMethod(jclass clazz, const char *methodName, cons
}
/*!
+ \fn template<typename ...Args> jmethodId QJniEnvironment::findMethod(jclass clazz, const char *methodName)
+ \since 6.4
+
+ Searches for an instance method of a class \a clazz. The method is specified
+ by its \a methodName, the signature is deduced from the template parameters.
+
+ Returns the method ID or \c nullptr if the method is not found.
+*/
+
+/*!
Searches for a static method of a class \a clazz. The method is specified
by its \a methodName and \a signature.
@@ -265,9 +225,28 @@ jmethodID QJniEnvironment::findStaticMethod(jclass clazz, const char *methodName
return nullptr;
}
+/*!
+ \fn template<typename ...Args> jmethodId QJniEnvironment::findStaticMethod(jclass clazz, const char *methodName)
+ \since 6.4
+
+ Searches for an instance method of a class \a clazz. The method is specified
+ by its \a methodName, the signature is deduced from the template parameters.
+
+ Returns the method ID or \c nullptr if the method is not found.
+
+ \code
+ QJniEnvironment env;
+ jclass javaClass = env.findClass("org/qtproject/example/android/CustomClass");
+ jmethodID methodId = env.findStaticMethod<void, jstring>(javaClass, "staticJavaMethod");
+ QJniObject javaMessage = QJniObject::fromString("findStaticMethod example");
+ QJniObject::callStaticMethod<void>(javaClass,
+ methodId,
+ javaMessage.object<jstring>());
+ \endcode
+*/
/*!
- Searches for an member field of a class \a clazz. The field is specified
+ Searches for a member field of a class \a clazz. The field is specified
by its \a fieldName and \a signature.
Returns the field ID or \c nullptr if the field is not found.
@@ -289,6 +268,16 @@ jfieldID QJniEnvironment::findField(jclass clazz, const char *fieldName, const c
}
/*!
+ \fn template<typename T> jfieldID QJniEnvironment::findField(jclass clazz, const char *fieldName)
+ \since 6.4
+
+ Searches for a member field of a class \a clazz. The field is specified
+ by its \a fieldName. The signature of the field is deduced from the template parameter.
+
+ Returns the field ID or \c nullptr if the field is not found.
+*/
+
+/*!
Searches for a static field of a class \a clazz. The field is specified
by its \a fieldName and \a signature.
@@ -311,8 +300,16 @@ jfieldID QJniEnvironment::findStaticField(jclass clazz, const char *fieldName, c
}
/*!
- \fn JavaVM *QJniEnvironment::javaVM()
+ \fn template<typename T> jfieldID QJniEnvironment::findStaticField(jclass clazz, const char *fieldName)
+ \since 6.4
+ Searches for a static field of a class \a clazz. The field is specified
+ by its \a fieldName. The signature of the field is deduced from the template parameter.
+
+ Returns the field ID or \c nullptr if the field is not found.
+*/
+
+/*!
Returns the Java VM interface for the current process. Although it might
be possible to have multiple Java VMs per process, Android allows only one.
@@ -354,6 +351,15 @@ bool QJniEnvironment::registerNativeMethods(const char *className, const JNINati
return registerNativeMethods(clazz, methods, size);
}
+
+/*!
+ \fn bool QJniEnvironment::registerNativeMethods(const char *className, std::initializer_list<JNINativeMethod> methods)
+ \overload
+
+ Registers the native functions methods in \a methods for the Java class \a className.
+ Returns \c true if the registration is successful, otherwise \c false.
+*/
+
#if QT_DEPRECATED_SINCE(6, 2)
/*!
\overload
@@ -409,6 +415,14 @@ bool QJniEnvironment::registerNativeMethods(jclass clazz, const JNINativeMethod
}
/*!
+ \fn bool QJniEnvironment::registerNativeMethods(jclass clazz, std::initializer_list<JNINativeMethod> methods)
+ \overload
+
+ Registers the native functions methods in \a methods for the Java class \a clazz.
+ Returns \c true if the registration is successful, otherwise \c false.
+*/
+
+/*!
\enum QJniEnvironment::OutputMode
\value Silent The exceptions are cleaned silently
@@ -431,20 +445,59 @@ bool QJniEnvironment::registerNativeMethods(jclass clazz, const JNINativeMethod
*/
bool QJniEnvironment::checkAndClearExceptions(QJniEnvironment::OutputMode outputMode)
{
- if (Q_UNLIKELY(d->jniEnv->ExceptionCheck())) {
- if (outputMode != OutputMode::Silent)
- d->jniEnv->ExceptionDescribe();
- d->jniEnv->ExceptionClear();
+ return checkAndClearExceptions(d->jniEnv, outputMode);
+}
- return true;
+namespace {
+ // Any pending exception need to be cleared before calling this
+ QString exceptionMessage(JNIEnv *env, jthrowable exception)
+ {
+ if (!exception)
+ return {};
+
+ auto logError = []() {
+ qWarning() << "QJniEnvironment: a null object returned or an exception occurred while "
+ "fetching a prior exception message";
+ };
+
+ auto checkAndClear = [env]() {
+ if (Q_UNLIKELY(env->ExceptionCheck())) {
+ env->ExceptionClear();
+ return true;
+ }
+ return false;
+ };
+
+ const jclass logClazz = env->FindClass("android/util/Log");
+ if (checkAndClear() || !logClazz) {
+ logError();
+ return {};
+ }
+
+ const jmethodID methodId = env->GetStaticMethodID(logClazz, "getStackTraceString",
+ "(Ljava/lang/Throwable;)Ljava/lang/String;");
+ if (checkAndClear() || !methodId) {
+ logError();
+ return {};
+ }
+
+ jvalue value;
+ value.l = static_cast<jobject>(exception);
+ const jobject messageObj = env->CallStaticObjectMethodA(logClazz, methodId, &value);
+ const jstring jmessage = static_cast<jstring>(messageObj);
+ if (checkAndClear())
+ return {};
+
+ char const *utfMessage = env->GetStringUTFChars(jmessage, 0);
+ const QString message = QString::fromUtf8(utfMessage);
+
+ env->ReleaseStringUTFChars(jmessage, utfMessage);
+
+ return message;
}
-
- return false;
-}
+} // end namespace
/*!
- \fn QJniEnvironment::checkAndClearExceptions(JNIEnv *env, OutputMode outputMode = OutputMode::Verbose)
-
Cleans any pending exceptions for \a env, either silently or reporting
stack backtrace, depending on the \a outputMode. This is useful when you
already have a \c JNIEnv pointer such as in a native function implementation.
@@ -459,9 +512,22 @@ bool QJniEnvironment::checkAndClearExceptions(QJniEnvironment::OutputMode output
bool QJniEnvironment::checkAndClearExceptions(JNIEnv *env, QJniEnvironment::OutputMode outputMode)
{
if (Q_UNLIKELY(env->ExceptionCheck())) {
- if (outputMode != OutputMode::Silent)
- env->ExceptionDescribe();
- env->ExceptionClear();
+ if (outputMode == OutputMode::Verbose) {
+ if (jthrowable exception = env->ExceptionOccurred()) {
+ env->ExceptionClear();
+ const QString message = exceptionMessage(env, exception);
+ // Print to QWARN since env->ExceptionDescribe() does the same
+ if (!message.isEmpty())
+ qWarning().noquote() << message;
+ env->DeleteLocalRef(exception);
+ } else {
+ // if the exception object is null for some reason just
+ env->ExceptionDescribe();
+ env->ExceptionClear();
+ }
+ } else {
+ env->ExceptionClear();
+ }
return true;
}
diff --git a/src/corelib/kernel/qjnienvironment.h b/src/corelib/kernel/qjnienvironment.h
index 16a6413d31..dda8dc0950 100644
--- a/src/corelib/kernel/qjnienvironment.h
+++ b/src/corelib/kernel/qjnienvironment.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QJNI_ENVIRONMENT_H
#define QJNI_ENVIRONMENT_H
@@ -44,6 +8,7 @@
#if defined(Q_QDOC) || defined(Q_OS_ANDROID)
#include <jni.h>
+#include <QtCore/qjnitypes_impl.h>
QT_BEGIN_NAMESPACE
@@ -59,14 +24,56 @@ public:
JNIEnv &operator*() const;
JNIEnv *jniEnv() const;
jclass findClass(const char *className);
+ template<typename Class>
+ jclass findClass() { return findClass(QtJniTypes::Traits<Class>::className().data()); }
jmethodID findMethod(jclass clazz, const char *methodName, const char *signature);
+ template<typename ...Args>
+ jmethodID findMethod(jclass clazz, const char *methodName) {
+ constexpr auto signature = QtJniTypes::methodSignature<Args...>();
+ return findMethod(clazz, methodName, signature.data());
+ }
jmethodID findStaticMethod(jclass clazz, const char *methodName, const char *signature);
+ template<typename ...Args>
+ jmethodID findStaticMethod(jclass clazz, const char *methodName) {
+ constexpr auto signature = QtJniTypes::methodSignature<Args...>();
+ return findStaticMethod(clazz, methodName, signature.data());
+ }
jfieldID findField(jclass clazz, const char *fieldName, const char *signature);
+ template<typename T>
+ jfieldID findField(jclass clazz, const char *fieldName) {
+ constexpr auto signature = QtJniTypes::fieldSignature<T>();
+ return findField(clazz, fieldName, signature.data());
+ }
jfieldID findStaticField(jclass clazz, const char *fieldName, const char *signature);
+ template<typename T>
+ jfieldID findStaticField(jclass clazz, const char *fieldName) {
+ constexpr auto signature = QtJniTypes::fieldSignature<T>();
+ return findStaticField(clazz, fieldName, signature.data());
+ }
static JavaVM *javaVM();
bool registerNativeMethods(const char *className, const JNINativeMethod methods[], int size);
bool registerNativeMethods(jclass clazz, const JNINativeMethod methods[], int size);
+ bool registerNativeMethods(const char *className, std::initializer_list<JNINativeMethod> methods)
+ {
+ return registerNativeMethods(className, std::data(methods), methods.size());
+ }
+
+ bool registerNativeMethods(jclass clazz, std::initializer_list<JNINativeMethod> methods)
+ {
+ return registerNativeMethods(clazz, std::data(methods), methods.size());
+ }
+
+ template<typename Class
+#ifndef Q_QDOC
+ , std::enable_if_t<QtJniTypes::isObjectType<Class>(), bool> = true
+#endif
+ >
+ bool registerNativeMethods(std::initializer_list<JNINativeMethod> methods)
+ {
+ return registerNativeMethods(QtJniTypes::Traits<Class>::className().data(), methods);
+ }
+
#if QT_DEPRECATED_SINCE(6, 2)
// ### Qt 7: remove
QT_DEPRECATED_VERSION_X_6_2("Use the overload with a const JNINativeMethod[] instead.")
@@ -81,6 +88,8 @@ public:
bool checkAndClearExceptions(OutputMode outputMode = OutputMode::Verbose);
static bool checkAndClearExceptions(JNIEnv *env, OutputMode outputMode = OutputMode::Verbose);
+ static JNIEnv *getJniEnv();
+
private:
Q_DISABLE_COPY_MOVE(QJniEnvironment)
QScopedPointer<QJniEnvironmentPrivate> d;
diff --git a/src/corelib/kernel/qjnihelpers.cpp b/src/corelib/kernel/qjnihelpers.cpp
index b2a5dc7441..d900b74d37 100644
--- a/src/corelib/kernel/qjnihelpers.cpp
+++ b/src/corelib/kernel/qjnihelpers.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qjnihelpers_p.h"
@@ -44,7 +8,9 @@
#include "qlist.h"
#include "qmutex.h"
#include "qsemaphore.h"
+#include "qreadwritelock.h"
#include <QtCore/private/qcoreapplication_p.h>
+#include <QtCore/private/qlocking_p.h>
#include <android/log.h>
#include <deque>
@@ -60,8 +26,6 @@ namespace QtAndroidPrivate {
ResumePauseListener::~ResumePauseListener() {}
void ResumePauseListener::handlePause() {}
void ResumePauseListener::handleResume() {}
- GenericMotionEventListener::~GenericMotionEventListener() {}
- KeyEventListener::~KeyEventListener() {}
}
static JavaVM *g_javaVM = nullptr;
@@ -69,43 +33,46 @@ static jobject g_jActivity = nullptr;
static jobject g_jService = nullptr;
static jobject g_jClassLoader = nullptr;
-Q_GLOBAL_STATIC_WITH_ARGS(QtAndroidPrivate::OnBindListener*, g_onBindListener, (nullptr));
-Q_GLOBAL_STATIC(QMutex, g_onBindListenerMutex);
+Q_CONSTINIT static QtAndroidPrivate::OnBindListener *g_onBindListener;
+Q_CONSTINIT static QBasicMutex g_onBindListenerMutex;
Q_GLOBAL_STATIC(QSemaphore, g_waitForServiceSetupSemaphore);
-Q_GLOBAL_STATIC(QAtomicInt, g_serviceSetupLockers);
+Q_CONSTINIT static QBasicAtomicInt g_serviceSetupLockers = Q_BASIC_ATOMIC_INITIALIZER(0);
-namespace {
- struct GenericMotionEventListeners {
- QMutex mutex;
- QList<QtAndroidPrivate::GenericMotionEventListener *> listeners;
- };
-}
-Q_GLOBAL_STATIC(GenericMotionEventListeners, g_genericMotionEventListeners)
+Q_GLOBAL_STATIC(QReadWriteLock, g_updateMutex);
-static jboolean dispatchGenericMotionEvent(JNIEnv *, jclass, jobject event)
+static jboolean updateNativeActivity(JNIEnv *env, jclass = nullptr)
{
- jboolean ret = JNI_FALSE;
- QMutexLocker locker(&g_genericMotionEventListeners()->mutex);
- for (auto *listener : qAsConst(g_genericMotionEventListeners()->listeners))
- ret |= listener->handleGenericMotionEvent(event);
- return ret;
-}
-namespace {
- struct KeyEventListeners {
- QMutex mutex;
- QList<QtAndroidPrivate::KeyEventListener *> listeners;
- };
-}
-Q_GLOBAL_STATIC(KeyEventListeners, g_keyEventListeners)
+ jclass jQtNative = env->FindClass("org/qtproject/qt/android/QtNative");
+ if (QJniEnvironment::checkAndClearExceptions(env))
+ return JNI_FALSE;
-static jboolean dispatchKeyEvent(JNIEnv *, jclass, jobject event)
-{
- jboolean ret = JNI_FALSE;
- QMutexLocker locker(&g_keyEventListeners()->mutex);
- for (auto *listener : qAsConst(g_keyEventListeners()->listeners))
- ret |= listener->handleKeyEvent(event);
- return ret;
+ jmethodID activityMethodID =
+ env->GetStaticMethodID(jQtNative, "activity", "()Landroid/app/Activity;");
+ if (QJniEnvironment::checkAndClearExceptions(env))
+ return JNI_FALSE;
+
+ jobject activity = env->CallStaticObjectMethod(jQtNative, activityMethodID);
+ if (QJniEnvironment::checkAndClearExceptions(env))
+ return JNI_FALSE;
+
+ QWriteLocker locker(g_updateMutex());
+
+ if (g_jActivity) {
+ env->DeleteGlobalRef(g_jActivity);
+ g_jActivity = nullptr;
+ }
+
+ if (activity) {
+ g_jActivity = env->NewGlobalRef(activity);
+ env->DeleteLocalRef(activity);
+ }
+
+ env->DeleteLocalRef(jQtNative);
+ if (QJniEnvironment::checkAndClearExceptions(env))
+ return JNI_FALSE;
+
+ return JNI_TRUE;
}
namespace {
@@ -269,8 +236,7 @@ jint QtAndroidPrivate::initJNI(JavaVM *vm, JNIEnv *env)
}
static const JNINativeMethod methods[] = {
- {"dispatchGenericMotionEvent", "(Landroid/view/MotionEvent;)Z", reinterpret_cast<void *>(dispatchGenericMotionEvent)},
- {"dispatchKeyEvent", "(Landroid/view/KeyEvent;)Z", reinterpret_cast<void *>(dispatchKeyEvent)},
+ {"updateNativeActivity", "()Z", reinterpret_cast<void *>(updateNativeActivity) },
};
const bool regOk = (env->RegisterNatives(jQtNative, methods, sizeof(methods) / sizeof(methods[0])) == JNI_OK);
@@ -278,33 +244,51 @@ jint QtAndroidPrivate::initJNI(JavaVM *vm, JNIEnv *env)
if (!regOk && QJniEnvironment::checkAndClearExceptions(env))
return JNI_ERR;
- if (!registerPermissionNatives())
+ QJniEnvironment qJniEnv;
+ if (!registerPermissionNatives(qJniEnv))
+ return JNI_ERR;
+
+ if (!registerNativeInterfaceNatives(qJniEnv))
return JNI_ERR;
- if (!registerNativeInterfaceNatives())
+ if (!registerExtrasNatives(qJniEnv))
return JNI_ERR;
return JNI_OK;
}
-jobject QtAndroidPrivate::activity()
+Q_CORE_EXPORT jobject qt_androidActivity()
{
+ QReadLocker locker(g_updateMutex());
return g_jActivity;
}
-jobject QtAndroidPrivate::service()
+
+QtJniTypes::Activity QtAndroidPrivate::activity()
+{
+ QReadLocker locker(g_updateMutex());
+ return g_jActivity;
+}
+
+Q_CORE_EXPORT jobject qt_androidService()
{
return g_jService;
}
-jobject QtAndroidPrivate::context()
+QtJniTypes::Service QtAndroidPrivate::service()
{
+ return g_jService;
+}
+
+QtJniTypes::Context QtAndroidPrivate::context()
+{
+ QReadLocker locker(g_updateMutex());
if (g_jActivity)
return g_jActivity;
if (g_jService)
return g_jService;
- return 0;
+ return nullptr;
}
JavaVM *QtAndroidPrivate::javaVM()
@@ -325,30 +309,6 @@ jint QtAndroidPrivate::androidSdkVersion()
return sdkVersion;
}
-void QtAndroidPrivate::registerGenericMotionEventListener(QtAndroidPrivate::GenericMotionEventListener *listener)
-{
- QMutexLocker locker(&g_genericMotionEventListeners()->mutex);
- g_genericMotionEventListeners()->listeners.push_back(listener);
-}
-
-void QtAndroidPrivate::unregisterGenericMotionEventListener(QtAndroidPrivate::GenericMotionEventListener *listener)
-{
- QMutexLocker locker(&g_genericMotionEventListeners()->mutex);
- g_genericMotionEventListeners()->listeners.removeOne(listener);
-}
-
-void QtAndroidPrivate::registerKeyEventListener(QtAndroidPrivate::KeyEventListener *listener)
-{
- QMutexLocker locker(&g_keyEventListeners()->mutex);
- g_keyEventListeners()->listeners.push_back(listener);
-}
-
-void QtAndroidPrivate::unregisterKeyEventListener(QtAndroidPrivate::KeyEventListener *listener)
-{
- QMutexLocker locker(&g_keyEventListeners()->mutex);
- g_keyEventListeners()->listeners.removeOne(listener);
-}
-
void QtAndroidPrivate::waitForServiceSetup()
{
g_waitForServiceSetupSemaphore->acquire();
@@ -356,29 +316,41 @@ void QtAndroidPrivate::waitForServiceSetup()
int QtAndroidPrivate::acuqireServiceSetup(int flags)
{
- g_serviceSetupLockers->ref();
+ g_serviceSetupLockers.ref();
return flags;
}
void QtAndroidPrivate::setOnBindListener(QtAndroidPrivate::OnBindListener *listener)
{
- QMutexLocker lock(g_onBindListenerMutex());
- *g_onBindListener = listener;
- if (!g_serviceSetupLockers->deref())
+ const auto lock = qt_scoped_lock(g_onBindListenerMutex);
+ g_onBindListener = listener;
+ if (!g_serviceSetupLockers.deref())
g_waitForServiceSetupSemaphore->release();
}
jobject QtAndroidPrivate::callOnBindListener(jobject intent)
{
- QMutexLocker lock(g_onBindListenerMutex());
- if (*g_onBindListener)
- return (*g_onBindListener)->onBind(intent);
+ const auto lock = qt_scoped_lock(g_onBindListenerMutex);
+ if (g_onBindListener)
+ return g_onBindListener->onBind(intent);
return nullptr;
}
+Q_CONSTINIT static QBasicAtomicInt g_androidDeadlockProtector = Q_BASIC_ATOMIC_INITIALIZER(0);
+
+bool QtAndroidPrivate::acquireAndroidDeadlockProtector()
+{
+ return g_androidDeadlockProtector.testAndSetAcquire(0, 1);
+}
+
+void QtAndroidPrivate::releaseAndroidDeadlockProtector()
+{
+ g_androidDeadlockProtector.storeRelease(0);
+}
+
QT_END_NAMESPACE
-Q_CORE_EXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved)
+JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved)
{
Q_UNUSED(reserved);
diff --git a/src/corelib/kernel/qjnihelpers_p.h b/src/corelib/kernel/qjnihelpers_p.h
index 2860cef4c3..b5e05fcaf1 100644
--- a/src/corelib/kernel/qjnihelpers_p.h
+++ b/src/corelib/kernel/qjnihelpers_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QJNIHELPERS_H
#define QJNIHELPERS_H
@@ -54,9 +18,13 @@
#include <jni.h>
#include <functional>
#include <QtCore/private/qglobal_p.h>
+#include <QtCore/qcoreapplication_platform.h>
QT_BEGIN_NAMESPACE
+Q_DECLARE_JNI_CLASS(Activity, "android/app/Activity")
+Q_DECLARE_JNI_CLASS(Service, "android/app/Service")
+
namespace QtAndroidPrivate
{
class Q_CORE_EXPORT ActivityResultListener
@@ -81,20 +49,6 @@ namespace QtAndroidPrivate
virtual void handleResume();
};
- class Q_CORE_EXPORT GenericMotionEventListener
- {
- public:
- virtual ~GenericMotionEventListener();
- virtual bool handleGenericMotionEvent(jobject event) = 0;
- };
-
- class Q_CORE_EXPORT KeyEventListener
- {
- public:
- virtual ~KeyEventListener();
- virtual bool handleKeyEvent(jobject event) = 0;
- };
-
class Q_CORE_EXPORT OnBindListener
{
public:
@@ -102,17 +56,18 @@ namespace QtAndroidPrivate
virtual jobject onBind(jobject intent) = 0;
};
- Q_CORE_EXPORT jobject activity();
- Q_CORE_EXPORT jobject service();
- Q_CORE_EXPORT jobject context();
+ Q_CORE_EXPORT QtJniTypes::Activity activity();
+ Q_CORE_EXPORT QtJniTypes::Service service();
+ Q_CORE_EXPORT QtJniTypes::Context context();
Q_CORE_EXPORT JavaVM *javaVM();
Q_CORE_EXPORT jint initJNI(JavaVM *vm, JNIEnv *env);
Q_CORE_EXPORT jclass findClass(const char *className, JNIEnv *env);
jobject classLoader();
Q_CORE_EXPORT jint androidSdkVersion();
- bool registerPermissionNatives();
- bool registerNativeInterfaceNatives();
+ bool registerPermissionNatives(QJniEnvironment &env);
+ bool registerNativeInterfaceNatives(QJniEnvironment &env);
+ bool registerExtrasNatives(QJniEnvironment &env);
Q_CORE_EXPORT void handleActivityResult(jint requestCode, jint resultCode, jobject data);
Q_CORE_EXPORT void registerActivityResultListener(ActivityResultListener *listener);
@@ -127,16 +82,13 @@ namespace QtAndroidPrivate
Q_CORE_EXPORT void registerResumePauseListener(ResumePauseListener *listener);
Q_CORE_EXPORT void unregisterResumePauseListener(ResumePauseListener *listener);
- Q_CORE_EXPORT void registerGenericMotionEventListener(GenericMotionEventListener *listener);
- Q_CORE_EXPORT void unregisterGenericMotionEventListener(GenericMotionEventListener *listener);
-
- Q_CORE_EXPORT void registerKeyEventListener(KeyEventListener *listener);
- Q_CORE_EXPORT void unregisterKeyEventListener(KeyEventListener *listener);
-
Q_CORE_EXPORT void waitForServiceSetup();
Q_CORE_EXPORT int acuqireServiceSetup(int flags);
Q_CORE_EXPORT void setOnBindListener(OnBindListener *listener);
Q_CORE_EXPORT jobject callOnBindListener(jobject intent);
+
+ Q_CORE_EXPORT bool acquireAndroidDeadlockProtector();
+ Q_CORE_EXPORT void releaseAndroidDeadlockProtector();
}
#define Q_JNI_FIND_AND_CHECK_CLASS(CLASS_NAME) \
diff --git a/src/corelib/kernel/qjniobject.cpp b/src/corelib/kernel/qjniobject.cpp
index dfb0dbd36d..8244a4390f 100644
--- a/src/corelib/kernel/qjniobject.cpp
+++ b/src/corelib/kernel/qjniobject.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qjniobject.h"
@@ -44,9 +8,15 @@
#include <QtCore/qbytearray.h>
#include <QtCore/qhash.h>
#include <QtCore/qreadwritelock.h>
+#include <QtCore/qloggingcategory.h>
+
QT_BEGIN_NAMESPACE
+Q_LOGGING_CATEGORY(lcJniThreadCheck, "qt.core.jni.threadcheck")
+
+using namespace Qt::StringLiterals;
+
/*!
\class QJniObject
\inmodule QtCore
@@ -54,7 +24,7 @@ QT_BEGIN_NAMESPACE
\brief A convenience wrapper around the Java Native Interface (JNI).
The QJniObject class wraps a reference to a Java object, ensuring it isn't
- gargage-collected and providing access to most \c JNIEnv method calls
+ garbage-collected and providing access to most \c JNIEnv method calls
(member, static) and fields (setter, getter). It eliminates much
boiler-plate that would normally be needed, with direct JNI access, for
every operation, including exception-handling.
@@ -74,55 +44,77 @@ QT_BEGIN_NAMESPACE
\section1 Method Signatures
- For functions that take no arguments, QJniObject provides convenience functions that will use
- the correct signature based on the provided template type. For example:
+ QJniObject provides convenience functions that will use the correct signature based on the
+ provided template types. For functions that only return and take \l {JNI types}, the
+ signature can be generate at compile time:
\code
jint x = QJniObject::callMethod<jint>("getSize");
QJniObject::callMethod<void>("touch");
+ jint ret = jString1.callMethod<jint>("compareToIgnoreCase", jString2.object<jstring>());
\endcode
- In other cases you will need to supply the signature yourself, and it is important that the
- signature matches the function you want to call. The signature structure is
- \c "(ArgumentsTypes)ReturnType". Array types in the signature must have the \c {[} prefix,
- and the fully-qualified \c Object type names must have the \c L prefix and the \c ; suffix.
+ These functions are variadic templates, and the compiler will deduce the template arguments
+ from the actual argument types. In many situations, only the return type needs to be provided
+ explicitly.
- The example below demonstrates how to call two different static functions:
+ For functions that take other argument types, you need to supply the signature yourself. It is
+ important that the signature matches the function you want to call. The example below
+ demonstrates how to call different static functions:
\code
// Java class
package org.qtproject.qt;
class TestClass
{
- static String fromNumber(int x) { ... }
- static String[] stringArray(String s1, String s2) { ... }
+ static TestClass create() { ... }
+ static String fromNumber(int x) { ... }
+ static String[] stringArray(String s1, String s2) { ... }
}
\endcode
- The signature for the first function is \c {"(I)Ljava/lang/String;"}:
+ The signature structure is \c "(ArgumentsTypes)ReturnType". Array types in the signature
+ must have the \c {[} prefix, and the fully-qualified \c Object type names must have the
+ \c L prefix and the \c ; suffix. The signature for the \c create function is
+ \c {"()Lorg/qtproject/qt/TestClass;}. The signatures for the second and third functions
+ are \c {"(I)Ljava/lang/String;"} and
+ \c {"(Ljava/lang/String;Ljava/lang/String;)[Ljava/lang/String;"}, respectively.
+
+ We can call the \c create() function like this:
+
+ \code
+ // C++ code
+ QJniObject testClass = QJniObject::callStaticObjectMethod("org/qtproject/qt/TestClass",
+ "create",
+ "()Lorg/qtproject/qt/TestClass;");
+ \endcode
+
+ For the second and third function we can rely on QJniObject's template methods to create
+ the implicit signature string, but we can also pass the signature string explicitly:
\code
// C++ code
QJniObject stringNumber = QJniObject::callStaticObjectMethod("org/qtproject/qt/TestClass",
- "fromNumber"
- "(I)Ljava/lang/String;",
- 10);
+ "fromNumber",
+ "(I)Ljava/lang/String;", 10);
\endcode
- and the signature for the second function is
- \c {"(Ljava/lang/String;Ljava/lang/String;)[Ljava/lang/String;"}:
+ For the implicit signature creation to work we need to specify the return type explicitly:
\code
// C++ code
QJniObject string1 = QJniObject::fromString("String1");
QJniObject string2 = QJniObject::fromString("String2");
- QJniObject stringArray = QJniObject::callStaticObjectMethod("org/qtproject/qt/TestClass",
+ QJniObject stringArray = QJniObject::callStaticObjectMethod<jstringArray>(
+ "org/qtproject/qt/TestClass",
"stringArray"
- "(Ljava/lang/String;Ljava/lang/String;)[Ljava/lang/String;"
string1.object<jstring>(),
string2.object<jstring>());
\endcode
+ Note that while the first template parameter specifies the return type of the Java
+ function, the method will still return a QJniObject.
+
\section1 Handling Java Exception
After calling Java functions that might throw exceptions, it is important
@@ -289,100 +281,151 @@ QT_BEGIN_NAMESPACE
class QJniObjectPrivate
{
public:
- QJniObjectPrivate() = default;
+ QJniObjectPrivate()
+ {
+ }
~QJniObjectPrivate() {
- QJniEnvironment env;
+ JNIEnv *env = QJniEnvironment::getJniEnv();
if (m_jobject)
env->DeleteGlobalRef(m_jobject);
if (m_jclass && m_own_jclass)
env->DeleteGlobalRef(m_jclass);
}
- friend jclass QtAndroidPrivate::findClass(const char *className, JNIEnv *env);
- static jclass loadClass(const QByteArray &className, JNIEnv *env, bool binEncoded = false)
- {
- return QJniObject::loadClass(className, env, binEncoded);
- }
-
- static QByteArray toBinaryEncClassName(const QByteArray &className)
+ template <typename ...Args>
+ void construct(const char *signature = nullptr, Args &&...args)
{
- return QJniObject::toBinaryEncClassName(className);
+ if (m_jclass) {
+ JNIEnv *env = QJniEnvironment::getJniEnv();
+ // get default constructor
+ jmethodID constructorId = QJniObject::getCachedMethodID(env, m_jclass, m_className, "<init>",
+ signature ? signature : "()V");
+ if (constructorId) {
+ jobject obj = nullptr;
+ if constexpr (sizeof...(Args) == 0)
+ obj = env->NewObject(m_jclass, constructorId);
+ else
+ obj = env->NewObjectV(m_jclass, constructorId, std::forward<Args>(args)...);
+ if (obj) {
+ m_jobject = env->NewGlobalRef(obj);
+ env->DeleteLocalRef(obj);
+ }
+ }
+ }
}
+ QByteArray m_className;
jobject m_jobject = nullptr;
jclass m_jclass = nullptr;
bool m_own_jclass = true;
- QByteArray m_className;
};
-static inline QLatin1String keyBase()
-{
- return QLatin1String("%1%2:%3");
-}
-
-static QString qt_convertJString(jstring string)
+template <typename ...Args>
+static inline QByteArray cacheKey(Args &&...args)
{
- QJniEnvironment env;
- int strLength = env->GetStringLength(string);
- QString res(strLength, Qt::Uninitialized);
- env->GetStringRegion(string, 0, strLength, reinterpret_cast<jchar *>(res.data()));
- return res;
+ return (QByteArrayView(":") + ... + QByteArrayView(args));
}
-typedef QHash<QString, jclass> JClassHash;
+typedef QHash<QByteArray, jclass> JClassHash;
Q_GLOBAL_STATIC(JClassHash, cachedClasses)
Q_GLOBAL_STATIC(QReadWriteLock, cachedClassesLock)
-static jclass getCachedClass(const QByteArray &classBinEnc, bool *isCached = nullptr)
+static jclass getCachedClass(const QByteArray &className)
{
QReadLocker locker(cachedClassesLock);
- const QHash<QString, jclass>::const_iterator &it = cachedClasses->constFind(QString::fromLatin1(classBinEnc));
- const bool found = (it != cachedClasses->constEnd());
-
- if (isCached)
- *isCached = found;
-
- return found ? it.value() : 0;
+ const auto &it = cachedClasses->constFind(className);
+ return it != cachedClasses->constEnd() ? it.value() : nullptr;
}
-QByteArray QJniObject::toBinaryEncClassName(const QByteArray &className)
+/*!
+ \internal
+
+ Get a JNI object from a jobject variant and do the necessary
+ exception clearing and delete the local reference before returning.
+ The JNI object can be null if there was an exception.
+*/
+static QJniObject getCleanJniObject(jobject object, JNIEnv *env)
{
- return QByteArray(className).replace('/', '.');
+ if (QJniEnvironment::checkAndClearExceptions(env) || !object) {
+ if (object)
+ env->DeleteLocalRef(object);
+ return QJniObject();
+ }
+
+ QJniObject res(object);
+ env->DeleteLocalRef(object);
+ return res;
}
-jclass QJniObject::loadClass(const QByteArray &className, JNIEnv *env, bool binEncoded)
+/*!
+ \internal
+ \a className must be slash-encoded
+*/
+jclass QtAndroidPrivate::findClass(const char *className, JNIEnv *env)
{
- const QByteArray &binEncClassName = binEncoded ? className : QJniObject::toBinaryEncClassName(className);
-
- bool isCached = false;
- jclass clazz = getCachedClass(binEncClassName, &isCached);
- if (clazz || isCached)
+ Q_ASSERT(env);
+ QByteArray classNameArray(className);
+#ifdef QT_DEBUG
+ if (classNameArray.contains('.')) {
+ qWarning("QtAndroidPrivate::findClass: className '%s' should use slash separators!",
+ className);
+ }
+#endif
+ classNameArray.replace('.', '/');
+ jclass clazz = getCachedClass(classNameArray);
+ if (clazz)
return clazz;
- QJniObject classLoader(QtAndroidPrivate::classLoader());
- if (!classLoader.isValid())
- return nullptr;
-
QWriteLocker locker(cachedClassesLock);
- // did we lose the race?
- const QLatin1String key(binEncClassName);
- const QHash<QString, jclass>::const_iterator &it = cachedClasses->constFind(key);
+ // Check again; another thread might have added the class to the cache after
+ // our call to getCachedClass and before we acquired the lock.
+ const auto &it = cachedClasses->constFind(classNameArray);
if (it != cachedClasses->constEnd())
return it.value();
- QJniObject stringName = QJniObject::fromString(key);
- QJniObject classObject = classLoader.callObjectMethod("loadClass",
- "(Ljava/lang/String;)Ljava/lang/Class;",
- stringName.object());
+ // JNIEnv::FindClass wants "a fully-qualified class name or an array type signature"
+ // which is a slash-separated class name.
+ jclass localClazz = env->FindClass(classNameArray.constData());
+ if (localClazz) {
+ clazz = static_cast<jclass>(env->NewGlobalRef(localClazz));
+ env->DeleteLocalRef(localClazz);
+ } else {
+ // Clear the exception silently; we are going to try the ClassLoader next,
+ // so no need for warning unless that fails as well.
+ env->ExceptionClear();
+ }
+
+ if (!clazz) {
+ // Wrong class loader, try our own
+ QJniObject classLoader(QtAndroidPrivate::classLoader());
+ if (!classLoader.isValid())
+ return nullptr;
+
+ // ClassLoader::loadClass on the other hand wants the binary name of the class,
+ // e.g. dot-separated. In testing it works also with /, but better to stick to
+ // the specification.
+ const QString binaryClassName = QString::fromLatin1(className).replace(u'/', u'.');
+ jstring classNameObject = env->NewString(reinterpret_cast<const jchar*>(binaryClassName.constData()),
+ binaryClassName.length());
+ QJniObject classObject = classLoader.callMethod<jclass>("loadClass", classNameObject);
+ env->DeleteLocalRef(classNameObject);
+
+ if (!QJniEnvironment::checkAndClearExceptions(env) && classObject.isValid())
+ clazz = static_cast<jclass>(env->NewGlobalRef(classObject.object()));
+ }
- if (!QJniEnvironment::checkAndClearExceptions(env) && classObject.isValid())
- clazz = static_cast<jclass>(env->NewGlobalRef(classObject.object()));
+ if (clazz)
+ cachedClasses->insert(classNameArray, clazz);
- cachedClasses->insert(key, clazz);
return clazz;
}
-typedef QHash<QString, jmethodID> JMethodIDHash;
+jclass QJniObject::loadClass(const QByteArray &className, JNIEnv *env)
+{
+ return QtAndroidPrivate::findClass(className, env);
+}
+
+typedef QHash<QByteArray, jmethodID> JMethodIDHash;
Q_GLOBAL_STATIC(JMethodIDHash, cachedMethodID)
Q_GLOBAL_STATIC(QReadWriteLock, cachedMethodIDLock)
@@ -401,9 +444,12 @@ jmethodID QJniObject::getMethodID(JNIEnv *env,
return id;
}
-void QJniObject::callVoidMethodV(JNIEnv *env, jmethodID id, va_list args) const
+void QJniObject::callVoidMethodV(JNIEnv *env, jmethodID id, ...) const
{
+ va_list args;
+ va_start(args, id);
env->CallVoidMethodV(d->m_jobject, id, args);
+ va_end(args);
}
jmethodID QJniObject::getCachedMethodID(JNIEnv *env,
@@ -416,10 +462,8 @@ jmethodID QJniObject::getCachedMethodID(JNIEnv *env,
if (className.isEmpty())
return getMethodID(env, clazz, name, signature, isStatic);
- const QString key = keyBase().arg(QLatin1String(className),
- QLatin1String(name),
- QLatin1String(signature));
- QHash<QString, jmethodID>::const_iterator it;
+ const QByteArray key = cacheKey(className, name, signature);
+ QHash<QByteArray, jmethodID>::const_iterator it;
{
QReadLocker locker(cachedMethodIDLock);
@@ -447,7 +491,7 @@ jmethodID QJniObject::getCachedMethodID(JNIEnv *env, const char *name,
return QJniObject::getCachedMethodID(env, d->m_jclass, d->m_className, name, signature, isStatic);
}
-typedef QHash<QString, jfieldID> JFieldIDHash;
+typedef QHash<QByteArray, jfieldID> JFieldIDHash;
Q_GLOBAL_STATIC(JFieldIDHash, cachedFieldID)
Q_GLOBAL_STATIC(QReadWriteLock, cachedFieldIDLock)
@@ -476,10 +520,8 @@ jfieldID QJniObject::getCachedFieldID(JNIEnv *env,
if (className.isNull())
return getFieldID(env, clazz, name, signature, isStatic);
- const QString key = keyBase().arg(QLatin1String(className),
- QLatin1String(name),
- QLatin1String(signature));
- QHash<QString, jfieldID>::const_iterator it;
+ const QByteArray key = cacheKey(className, name, signature);
+ QHash<QByteArray, jfieldID>::const_iterator it;
{
QReadLocker locker(cachedFieldIDLock);
@@ -509,39 +551,6 @@ jfieldID QJniObject::getCachedFieldID(JNIEnv *env,
return QJniObject::getCachedFieldID(env, d->m_jclass, d->m_className, name, signature, isStatic);
}
-jclass QtAndroidPrivate::findClass(const char *className, JNIEnv *env)
-{
- const QByteArray &classDotEnc = QJniObjectPrivate::toBinaryEncClassName(className);
- bool isCached = false;
- jclass clazz = getCachedClass(classDotEnc, &isCached);
-
- if (clazz || isCached)
- return clazz;
-
- const QLatin1String key(classDotEnc);
- if (env) { // We got an env. pointer (We expect this to be the right env. and call FindClass())
- QWriteLocker locker(cachedClassesLock);
- const QHash<QString, jclass>::const_iterator &it = cachedClasses->constFind(key);
- // Did we lose the race?
- if (it != cachedClasses->constEnd())
- return it.value();
-
- jclass fclazz = env->FindClass(className);
- if (!QJniEnvironment::checkAndClearExceptions(env)) {
- clazz = static_cast<jclass>(env->NewGlobalRef(fclazz));
- env->DeleteLocalRef(fclazz);
- }
-
- if (clazz)
- cachedClasses->insert(key, clazz);
- }
-
- if (!clazz) // We didn't get an env. pointer or we got one with the WRONG class loader...
- clazz = QJniObjectPrivate::loadClass(classDotEnc, QJniEnvironment().jniEnv(), true);
-
- return clazz;
-}
-
/*!
\fn QJniObject::QJniObject()
@@ -566,21 +575,11 @@ QJniObject::QJniObject()
QJniObject::QJniObject(const char *className)
: d(new QJniObjectPrivate())
{
- QJniEnvironment env;
- d->m_className = toBinaryEncClassName(className);
- d->m_jclass = loadClass(d->m_className, env.jniEnv(), true);
+ d->m_className = className;
+ d->m_jclass = loadClass(d->m_className, jniEnv());
d->m_own_jclass = false;
- if (d->m_jclass) {
- // get default constructor
- jmethodID constructorId = getCachedMethodID(env.jniEnv(), "<init>", "()V");
- if (constructorId) {
- jobject obj = env->NewObject(d->m_jclass, constructorId);
- if (obj) {
- d->m_jobject = env->NewGlobalRef(obj);
- env->DeleteLocalRef(obj);
- }
- }
- }
+
+ d->construct();
}
/*!
@@ -599,43 +598,31 @@ QJniObject::QJniObject(const char *className)
QJniObject::QJniObject(const char *className, const char *signature, ...)
: d(new QJniObjectPrivate())
{
- QJniEnvironment env;
- d->m_className = toBinaryEncClassName(className);
- d->m_jclass = loadClass(d->m_className, env.jniEnv(), true);
+ d->m_className = className;
+ d->m_jclass = loadClass(d->m_className, jniEnv());
d->m_own_jclass = false;
- if (d->m_jclass) {
- jmethodID constructorId = getCachedMethodID(env.jniEnv(), "<init>", signature);
- if (constructorId) {
- va_list args;
- va_start(args, signature);
- jobject obj = env->NewObjectV(d->m_jclass, constructorId, args);
- va_end(args);
- if (obj) {
- d->m_jobject = env->NewGlobalRef(obj);
- env->DeleteLocalRef(obj);
- }
- }
- }
+
+ va_list args;
+ va_start(args, signature);
+ d->construct(signature, args);
+ va_end(args);
}
-QJniObject::QJniObject(const char *className, const char *signature, const QVaListPrivate &args)
- : d(new QJniObjectPrivate())
-{
+/*!
+ \fn template<typename ...Args> QJniObject::QJniObject(const char *className, Args &&...args)
+ \since 6.4
+
+ Constructs a new JNI object by calling the constructor of \a className with
+ the arguments \a args. This constructor is only available if all \a args are
+ known \l {JNI Types}.
+
+ \code
QJniEnvironment env;
- d->m_className = toBinaryEncClassName(className);
- d->m_jclass = loadClass(d->m_className, env.jniEnv(), true);
- d->m_own_jclass = false;
- if (d->m_jclass) {
- jmethodID constructorId = getCachedMethodID(env.jniEnv(), "<init>", signature);
- if (constructorId) {
- jobject obj = env->NewObjectV(d->m_jclass, constructorId, args);
- if (obj) {
- d->m_jobject = env->NewGlobalRef(obj);
- env->DeleteLocalRef(obj);
- }
- }
- }
-}
+ char* str = "Hello";
+ jstring myJStringArg = env->NewStringUTF(str);
+ QJniObject myNewJavaString("java/lang/String", myJStringArg);
+ \endcode
+*/
/*!
Constructs a new JNI object from \a clazz by calling the constructor with
@@ -650,26 +637,31 @@ QJniObject::QJniObject(const char *className, const char *signature, const QVaLi
QJniObject::QJniObject(jclass clazz, const char *signature, ...)
: d(new QJniObjectPrivate())
{
- QJniEnvironment env;
if (clazz) {
- d->m_jclass = static_cast<jclass>(env->NewGlobalRef(clazz));
- if (d->m_jclass) {
- jmethodID constructorId = getMethodID(env.jniEnv(), d->m_jclass, "<init>", signature);
- if (constructorId) {
- va_list args;
- va_start(args, signature);
- jobject obj = env->NewObjectV(d->m_jclass, constructorId, args);
- va_end(args);
- if (obj) {
- d->m_jobject = env->NewGlobalRef(obj);
- env->DeleteLocalRef(obj);
- }
- }
- }
+ d->m_jclass = static_cast<jclass>(jniEnv()->NewGlobalRef(clazz));
+ va_list args;
+ va_start(args, signature);
+ d->construct(signature, args);
+ va_end(args);
}
}
/*!
+ \fn template<typename ...Args> QJniObject::QJniObject(jclass clazz, Args &&...args)
+ \since 6.4
+
+ Constructs a new JNI object from \a clazz by calling the constructor with
+ the arguments \a args. This constructor is only available if all \a args are
+ known \l {JNI Types}.
+
+ \code
+ QJniEnvironment env;
+ jclass myClazz = env.findClass("org/qtproject/qt/TestClass");
+ QJniObject(myClazz, 3);
+ \endcode
+*/
+
+/*!
Constructs a new JNI object by calling the default constructor of \a clazz.
\note The QJniObject will create a new reference to the class \a clazz
@@ -678,40 +670,8 @@ QJniObject::QJniObject(jclass clazz, const char *signature, ...)
*/
QJniObject::QJniObject(jclass clazz)
- : d(new QJniObjectPrivate())
+ : QJniObject(clazz, "()V")
{
- QJniEnvironment env;
- d->m_jclass = static_cast<jclass>(env->NewGlobalRef(clazz));
- if (d->m_jclass) {
- // get default constructor
- jmethodID constructorId = getMethodID(env.jniEnv(), d->m_jclass, "<init>", "()V");
- if (constructorId) {
- jobject obj = env->NewObject(d->m_jclass, constructorId);
- if (obj) {
- d->m_jobject = env->NewGlobalRef(obj);
- env->DeleteLocalRef(obj);
- }
- }
- }
-}
-
-QJniObject::QJniObject(jclass clazz, const char *signature, const QVaListPrivate &args)
- : d(new QJniObjectPrivate())
-{
- QJniEnvironment env;
- if (clazz) {
- d->m_jclass = static_cast<jclass>(env->NewGlobalRef(clazz));
- if (d->m_jclass) {
- jmethodID constructorId = getMethodID(env.jniEnv(), d->m_jclass, "<init>", signature);
- if (constructorId) {
- jobject obj = env->NewObjectV(d->m_jclass, constructorId, args);
- if (obj) {
- d->m_jobject = env->NewGlobalRef(obj);
- env->DeleteLocalRef(obj);
- }
- }
- }
- }
}
/*!
@@ -732,7 +692,7 @@ QJniObject::QJniObject(jobject object)
if (!object)
return;
- QJniEnvironment env;
+ JNIEnv *env = QJniEnvironment::getJniEnv();
d->m_jobject = env->NewGlobalRef(object);
jclass cls = env->GetObjectClass(object);
d->m_jclass = static_cast<jclass>(env->NewGlobalRef(cls));
@@ -740,25 +700,19 @@ QJniObject::QJniObject(jobject object)
}
/*!
- \brief Get a JNI object from a jobject variant and do the necessary
- exception clearing and delete the local reference before returning.
- The JNI object can be null if there was an exception.
-*/
-QJniObject QJniObject::getCleanJniObject(jobject object)
-{
- if (!object)
- return QJniObject();
+ \fn template<typename Class, typename ...Args> static inline QJniObject QJniObject::construct(Args &&...args)
+ \since 6.4
- QJniEnvironment env;
- if (env.checkAndClearExceptions()) {
- env->DeleteLocalRef(object);
- return QJniObject();
- }
+ Constructs an instance of the Java class that is the equivalent of \c Class and
+ returns a QJniObject containing the JNI object. The arguments in \a args are
+ passed to the Java constructor.
- QJniObject res(object);
- env->DeleteLocalRef(object);
- return res;
-}
+ \code
+ QJniObject javaString = QJniObject::construct<jstring>();
+ \endcode
+
+ This function is only available if all \a args are known \l {JNI Types}.
+*/
/*!
\fn QJniObject::~QJniObject()
@@ -768,7 +722,37 @@ QJniObject QJniObject::getCleanJniObject(jobject object)
QJniObject::~QJniObject()
{}
+namespace {
+QByteArray getClassNameHelper(JNIEnv *env, const QJniObjectPrivate *d)
+{
+ if (env->PushLocalFrame(3) != JNI_OK) // JVM out of memory
+ return QByteArray();
+
+ jmethodID mid = env->GetMethodID(d->m_jclass, "getClass", "()Ljava/lang/Class;");
+ jobject classObject = env->CallObjectMethod(d->m_jobject, mid);
+ jclass classObjectClass = env->GetObjectClass(classObject);
+ mid = env->GetMethodID(classObjectClass, "getName", "()Ljava/lang/String;");
+ jstring stringObject = static_cast<jstring>(env->CallObjectMethod(classObject, mid));
+ const jsize length = env->GetStringUTFLength(stringObject);
+ const char* nameString = env->GetStringUTFChars(stringObject, NULL);
+ const QByteArray result = QByteArray::fromRawData(nameString, length).replace('.', '/');
+ env->ReleaseStringUTFChars(stringObject, nameString);
+ env->PopLocalFrame(nullptr);
+ return result;
+}
+}
+
+/*! \internal
+
+ Returns the JNIEnv of the calling thread.
+*/
+JNIEnv *QJniObject::jniEnv() const noexcept
+{
+ return QJniEnvironment::getJniEnv();
+}
+
/*!
+ \fn jobject QJniObject::object() const
\fn template <typename T> T QJniObject::object() const
Returns the object held by the QJniObject either as jobject or as type T.
@@ -819,96 +803,51 @@ jclass QJniObject::objectClass() const
*/
QByteArray QJniObject::className() const
{
- return d->m_className;
-}
-
-QJniObject QJniObject::callObjectMethodV(const char *methodName,
- const char *signature,
- va_list args) const
-{
- QJniEnvironment env;
- jobject res = nullptr;
- jmethodID id = getCachedMethodID(env.jniEnv(), methodName, signature);
- if (id) {
- res = env->CallObjectMethodV(d->m_jobject, id, args);
- if (env.checkAndClearExceptions()) {
- env->DeleteLocalRef(res);
- res = nullptr;
- }
- }
-
- QJniObject obj(res);
- env->DeleteLocalRef(res);
- return obj;
-}
-
-QJniObject QJniObject::callStaticObjectMethodV(const char *className,
- const char *methodName,
- const char *signature,
- va_list args)
-{
- QJniEnvironment env;
- jobject res = nullptr;
- jclass clazz = loadClass(className, env.jniEnv());
- if (clazz) {
- jmethodID id = QJniObject::getCachedMethodID(env.jniEnv(), clazz, toBinaryEncClassName(className),
- methodName, signature, true);
- if (id) {
- res = env->CallStaticObjectMethodV(clazz, id, args);
- if (env.checkAndClearExceptions()) {
- env->DeleteLocalRef(res);
- res = nullptr;
- }
- }
+ if (d->m_className.isEmpty() && d->m_jclass && d->m_jobject) {
+ JNIEnv *env = jniEnv();
+ d->m_className = getClassNameHelper(env, d.get());
}
-
- QJniObject obj(res);
- env->DeleteLocalRef(res);
- return obj;
-}
-
-QJniObject QJniObject::callStaticObjectMethodV(jclass clazz,
- const char *methodName,
- const char *signature,
- va_list args)
-{
- QJniEnvironment env;
- jmethodID id = getMethodID(env.jniEnv(), clazz, methodName, signature, true);
- if (!id)
- return QJniObject();
-
- return getCleanJniObject(env->CallStaticObjectMethodV(clazz, id, args));
+ return d->m_className;
}
/*!
- \fn template <typename T> T QJniObject::callMethod(const char *methodName, const char *signature, ...) const
+ \fn template <typename Ret, typename ...Args> auto QJniObject::callMethod(const char *methodName, const char *signature, Args &&...args) const
+ \since 6.4
Calls the object's method \a methodName with \a signature specifying the types of any
- subsequent arguments.
+ subsequent arguments \a args, and returns the value (unless \c Ret is \c void). If \c Ret
+ is a jobject type, then the returned value will be a QJniObject.
\code
QJniObject myJavaStrin("org/qtproject/qt/TestClass");
jint index = myJavaString.callMethod<jint>("indexOf", "(I)I", 0x0051);
\endcode
-
*/
/*!
- \fn template <typename T> T QJniObject::callMethod(const char *methodName) const
+ \fn template <typename Ret, typename ...Args> auto QJniObject::callMethod(const char *methodName, Args &&...args) const
+ \since 6.4
- Calls the method \a methodName and returns the value.
+ Calls the method \a methodName with arguments \a args and returns the value
+ (unless \c Ret is \c void). If \c Ret is a jobject type, then the returned value
+ will be a QJniObject.
\code
QJniObject myJavaStrin("org/qtproject/qt/TestClass");
jint size = myJavaString.callMethod<jint>("length");
\endcode
+
+ The method signature is deduced at compile time from \c Ret and the types of \a args.
*/
/*!
- \fn template <typename T> T QJniObject::callStaticMethod(const char *className, const char *methodName, const char *signature, ...)
+ \fn template <typename Ret, typename ...Args> auto QJniObject::callStaticMethod(const char *className, const char *methodName, const char *signature, Args &&...args)
+ \since 6.4
Calls the static method \a methodName from class \a className with \a signature
- specifying the types of any subsequent arguments.
+ specifying the types of any subsequent arguments \a args. Returns the result of
+ the method (unless \c Ret is \c void). If \c Ret is a jobject type, then the
+ returned value will be a QJniObject.
\code
jint a = 2;
@@ -918,20 +857,27 @@ QJniObject QJniObject::callStaticObjectMethodV(jclass clazz,
*/
/*!
- \fn template <typename T> T QJniObject::callStaticMethod(const char *className, const char *methodName)
+ \fn template <typename Ret, typename ...Args> auto QJniObject::callStaticMethod(const char *className, const char *methodName, Args &&...args)
+ \since 6.4
- Calls the static method \a methodName on class \a className and returns the value.
+ Calls the static method \a methodName on class \a className with arguments \a args,
+ and returns the value of type \c Ret (unless \c Ret is \c void). If \c Ret
+ is a jobject type, then the returned value will be a QJniObject.
\code
jint value = QJniObject::callStaticMethod<jint>("MyClass", "staticMethod");
\endcode
+
+ The method signature is deduced at compile time from \c Ret and the types of \a args.
*/
/*!
- \fn template <typename T> T QJniObject::callStaticMethod(jclass clazz, const char *methodName, const char *signature, ...)
+ \fn template <typename Ret, typename ...Args> auto QJniObject::callStaticMethod(jclass clazz, const char *methodName, const char *signature, Args &&...args)
Calls the static method \a methodName from \a clazz with \a signature
- specifying the types of any subsequent arguments.
+ specifying the types of any subsequent arguments. Returns the result of
+ the method (unless \c Ret is \c void). If \c Ret is a jobject type, then the
+ returned value will be a QJniObject.
\code
QJniEnvironment env;
@@ -943,11 +889,15 @@ QJniObject QJniObject::callStaticObjectMethodV(jclass clazz,
*/
/*!
- \fn template <typename T> T QJniObject::callStaticMethod(jclass clazz, jmethodID methodId, ...)
+ \fn template <typename Ret, typename ...Args> auto QJniObject::callStaticMethod(jclass clazz, jmethodID methodId, Args &&...args)
+ \since 6.4
Calls the static method identified by \a methodId from the class \a clazz
- with any subsequent arguments. Useful when \a clazz and \a methodId are
- already cached from previous operations.
+ with any subsequent arguments, and returns the value of type \c Ret (unless
+ \c Ret is \c void). If \c Ret is a jobject type, then the returned value will
+ be a QJniObject.
+
+ Useful when \a clazz and \a methodId are already cached from previous operations.
\code
QJniEnvironment env;
@@ -962,15 +912,32 @@ QJniObject QJniObject::callStaticObjectMethodV(jclass clazz,
*/
/*!
- \fn template <typename T> T QJniObject::callStaticMethod(jclass clazz, const char *methodName)
+ \fn template <typename Ret, typename ...Args> auto QJniObject::callStaticMethod(jclass clazz, const char *methodName, Args &&...args)
+ \since 6.4
- Calls the static method \a methodName on \a clazz and returns the value.
+ Calls the static method \a methodName on \a clazz and returns the value of type \c Ret
+ (unless \c Ret is \c void). If \c Ret is a jobject type, then the returned value will
+ be a QJniObject.
\code
QJniEnvironment env;
jclass javaMathClass = env.findClass("java/lang/Math");
jdouble randNr = QJniObject::callStaticMethod<jdouble>(javaMathClass, "random");
\endcode
+
+ The method signature is deduced at compile time from \c Ret and the types of \a args.
+*/
+
+/*!
+ \fn template <typename Klass, typename Ret, typename ...Args> auto QJniObject::callStaticMethod(const char *methodName, Args &&...args)
+ \since 6.7
+
+ Calls the static method \a methodName on the class \c Klass and returns the value of type
+ \c Ret (unless \c Ret is \c void). If \c Ret is a jobject type, then the returned value will
+ be a QJniObject.
+
+ The method signature is deduced at compile time from \c Ret and the types of \a args.
+ \c Klass needs to be a C++ type with a registered type mapping to a Java type.
*/
/*!
@@ -987,12 +954,11 @@ QJniObject QJniObject::callStaticObjectMethodV(jclass clazz,
*/
QJniObject QJniObject::callObjectMethod(const char *methodName, const char *signature, ...) const
{
- QJniEnvironment env;
- jmethodID id = getCachedMethodID(env.jniEnv(), methodName, signature);
+ jmethodID id = getCachedMethodID(jniEnv(), methodName, signature);
if (id) {
va_list args;
va_start(args, signature);
- QJniObject res = getCleanJniObject(env->CallObjectMethodV(d->m_jobject, id, args));
+ QJniObject res = getCleanJniObject(jniEnv()->CallObjectMethodV(d->m_jobject, id, args), jniEnv());
va_end(args);
return res;
}
@@ -1016,16 +982,16 @@ QJniObject QJniObject::callObjectMethod(const char *methodName, const char *sign
QJniObject QJniObject::callStaticObjectMethod(const char *className, const char *methodName,
const char *signature, ...)
{
- QJniEnvironment env;
- jclass clazz = QJniObject::loadClass(className, env.jniEnv());
+ JNIEnv *env = QJniEnvironment::getJniEnv();
+ jclass clazz = QJniObject::loadClass(className, env);
if (clazz) {
- jmethodID id = QJniObject::getCachedMethodID(env.jniEnv(), clazz,
- QJniObject::toBinaryEncClassName(className),
+ jmethodID id = QJniObject::getCachedMethodID(env, clazz,
+ className,
methodName, signature, true);
if (id) {
va_list args;
va_start(args, signature);
- QJniObject res = getCleanJniObject(env->CallStaticObjectMethodV(clazz, id, args));
+ QJniObject res = getCleanJniObject(env->CallStaticObjectMethodV(clazz, id, args), env);
va_end(args);
return res;
}
@@ -1043,13 +1009,13 @@ QJniObject QJniObject::callStaticObjectMethod(const char *className, const char
QJniObject QJniObject::callStaticObjectMethod(jclass clazz, const char *methodName,
const char *signature, ...)
{
- QJniEnvironment env;
if (clazz) {
+ QJniEnvironment env;
jmethodID id = getMethodID(env.jniEnv(), clazz, methodName, signature, true);
if (id) {
va_list args;
va_start(args, signature);
- QJniObject res = getCleanJniObject(env->CallStaticObjectMethodV(clazz, id, args));
+ QJniObject res = getCleanJniObject(env->CallStaticObjectMethodV(clazz, id, args), env.jniEnv());
va_end(args);
return res;
}
@@ -1075,11 +1041,11 @@ QJniObject QJniObject::callStaticObjectMethod(jclass clazz, const char *methodNa
*/
QJniObject QJniObject::callStaticObjectMethod(jclass clazz, jmethodID methodId, ...)
{
- QJniEnvironment env;
if (clazz && methodId) {
+ QJniEnvironment env;
va_list args;
va_start(args, methodId);
- QJniObject res = getCleanJniObject(env->CallStaticObjectMethodV(clazz, methodId, args));
+ QJniObject res = getCleanJniObject(env->CallStaticObjectMethodV(clazz, methodId, args), env.jniEnv());
va_end(args);
return res;
}
@@ -1088,36 +1054,44 @@ QJniObject QJniObject::callStaticObjectMethod(jclass clazz, jmethodID methodId,
}
/*!
- \fn QJniObject QJniObject::callObjectMethod(const char *methodName) const
+ \fn template<typename Ret, typename ...Args> QJniObject QJniObject::callObjectMethod(const char *methodName, Args &&...args) const
+ \since 6.4
- Calls the Java objects method \a methodName and returns a new QJniObject for
- the returned Java object.
+ Calls the Java objects method \a methodName with arguments \a args and returns a
+ new QJniObject for the returned Java object.
\code
QJniObject myJavaString = QJniObject::fromString("Hello, Java");
QJniObject myJavaString2 = myJavaString1.callObjectMethod<jstring>("toString");
\endcode
+
+ The method signature is deduced at compile time from \c Ret and the types of \a args.
*/
/*!
- \fn QJniObject QJniObject::callStaticObjectMethod(const char *className, const char *methodName)
+ \fn template<typename Ret, typename ...Args> QJniObject QJniObject::callStaticObjectMethod(const char *className, const char *methodName, Args &&...args)
+ \since 6.4
- Calls the static method with \a methodName on the class \a className.
+ Calls the static method with \a methodName on the class \a className, passing
+ arguments \a args, and returns a new QJniObject for the returned Java object.
\code
QJniObject string = QJniObject::callStaticObjectMethod<jstring>("CustomClass", "getClassName");
\endcode
+
+ The method signature is deduced at compile time from \c Ret and the types of \a args.
*/
/*!
- \fn QJniObject QJniObject::callStaticObjectMethod(jclass clazz, const char *methodName)
-
- Calls the static method with \a methodName on \a clazz.
+ \fn template<typename Ret, typename ...Args> QJniObject QJniObject::callStaticObjectMethod(jclass clazz, const char *methodName, Args &&...args)
+ \since 6.4
+ Calls the static method with \a methodName on \a clazz, passing arguments \a args,
+ and returns a new QJniObject for the returned Java object.
*/
/*!
- \fn template <typename T> QJniObject &QJniObject::operator=(T object)
+ \fn template <typename T, std::enable_if_t<std::is_convertible_v<T, jobject>, bool> = true> QJniObject &QJniObject::operator=(T object)
Replace the current object with \a object. The old Java object will be released.
*/
@@ -1138,7 +1112,7 @@ QJniObject QJniObject::callStaticObjectMethod(jclass clazz, jmethodID methodId,
*/
/*!
- \fn T QJniObject::getField(const char *fieldName) const
+ \fn template<typename T> T QJniObject::getField(const char *fieldName) const
Retrieves the value of the field \a fieldName.
@@ -1149,18 +1123,26 @@ QJniObject QJniObject::callStaticObjectMethod(jclass clazz, jmethodID methodId,
*/
/*!
- \fn T QJniObject::getStaticField(const char *className, const char *fieldName)
+ \fn template<typename T> T QJniObject::getStaticField(const char *className, const char *fieldName)
Retrieves the value from the static field \a fieldName on the class \a className.
*/
/*!
- \fn T QJniObject::getStaticField(jclass clazz, const char *fieldName)
+ \fn template<typename T> T QJniObject::getStaticField(jclass clazz, const char *fieldName)
Retrieves the value from the static field \a fieldName on \a clazz.
*/
/*!
+ \fn template <typename Klass, typename T> auto QJniObject::getStaticField(const char *fieldName)
+
+ Retrieves the value from the static field \a fieldName for the class \c Klass.
+
+ \c Klass needs to be a C++ type with a registered type mapping to a Java type.
+*/
+
+/*!
\fn template <typename T> void QJniObject::setStaticField(const char *className, const char *fieldName, T value)
Sets the static field \a fieldName of the class \a className to \a value.
@@ -1173,6 +1155,14 @@ QJniObject QJniObject::callStaticObjectMethod(jclass clazz, jmethodID methodId,
*/
/*!
+ \fn template <typename Klass, typename T> auto QJniObject::setStaticField(const char *fieldName, T value)
+
+ Sets the static field \a fieldName of the class \c Klass to \a value.
+
+ \c Klass needs to be a C++ type with a registered type mapping to a Java type.
+*/
+
+/*!
\fn QJniObject QJniObject::getStaticObjectField(const char *className, const char *fieldName, const char *signature)
Retrieves a JNI object from the field \a fieldName with \a signature from
@@ -1189,18 +1179,18 @@ QJniObject QJniObject::getStaticObjectField(const char *className,
const char *fieldName,
const char *signature)
{
- QJniEnvironment env;
- jclass clazz = QJniObject::loadClass(className, env.jniEnv());
+ JNIEnv *env = QJniEnvironment::getJniEnv();
+ jclass clazz = QJniObject::loadClass(className, env);
if (!clazz)
return QJniObject();
- jfieldID id = QJniObject::getCachedFieldID(env.jniEnv(), clazz,
- QJniObject::toBinaryEncClassName(className),
+ jfieldID id = QJniObject::getCachedFieldID(env, clazz,
+ className,
fieldName,
signature, true);
if (!id)
return QJniObject();
- return getCleanJniObject(env->GetStaticObjectField(clazz, id));
+ return getCleanJniObject(env->GetStaticObjectField(clazz, id), env);
}
/*!
@@ -1218,12 +1208,9 @@ QJniObject QJniObject::getStaticObjectField(const char *className,
QJniObject QJniObject::getStaticObjectField(jclass clazz, const char *fieldName,
const char *signature)
{
- QJniEnvironment env;
- jfieldID id = getFieldID(env.jniEnv(), clazz, fieldName, signature, true);
- if (!id)
- return QJniObject();
-
- return getCleanJniObject(env->GetStaticObjectField(clazz, id));
+ JNIEnv *env = QJniEnvironment::getJniEnv();
+ jfieldID id = getFieldID(env, clazz, fieldName, signature, true);
+ return getCleanJniObject(env->GetStaticObjectField(clazz, id), env);
}
/*!
@@ -1240,7 +1227,7 @@ QJniObject QJniObject::getStaticObjectField(jclass clazz, const char *fieldName,
*/
/*!
- \fn QJniObject QJniObject::getObjectField(const char *fieldName) const
+ \fn template<typename T> QJniObject QJniObject::getObjectField(const char *fieldName) const
Retrieves a JNI object from the field \a fieldName.
@@ -1262,12 +1249,11 @@ QJniObject QJniObject::getStaticObjectField(jclass clazz, const char *fieldName,
*/
QJniObject QJniObject::getObjectField(const char *fieldName, const char *signature) const
{
- QJniEnvironment env;
- jfieldID id = getCachedFieldID(env.jniEnv(), fieldName, signature);
+ jfieldID id = getCachedFieldID(jniEnv(), fieldName, signature);
if (!id)
return QJniObject();
- return getCleanJniObject(env->GetObjectField(d->m_jobject, id));
+ return getCleanJniObject(jniEnv()->GetObjectField(d->m_jobject, id), jniEnv());
}
/*!
@@ -1284,7 +1270,7 @@ QJniObject QJniObject::getObjectField(const char *fieldName, const char *signatu
*/
/*!
- \fn QJniObject QJniObject::getStaticObjectField(const char *className, const char *fieldName)
+ \fn template<typename T> QJniObject QJniObject::getStaticObjectField(const char *className, const char *fieldName)
Retrieves the object from the field \a fieldName on the class \a className.
@@ -1294,7 +1280,7 @@ QJniObject QJniObject::getObjectField(const char *fieldName, const char *signatu
*/
/*!
- \fn QJniObject QJniObject::getStaticObjectField(jclass clazz, const char *fieldName)
+ \fn template<typename T> QJniObject QJniObject::getStaticObjectField(jclass clazz, const char *fieldName)
Retrieves the object from the field \a fieldName on \a clazz.
@@ -1318,8 +1304,11 @@ QJniObject QJniObject::getObjectField(const char *fieldName, const char *signatu
QJniObject QJniObject::fromString(const QString &string)
{
QJniEnvironment env;
- return getCleanJniObject(env->NewString(reinterpret_cast<const jchar*>(string.constData()),
- string.length()));
+ jstring stringRef = env->NewString(reinterpret_cast<const jchar*>(string.constData()),
+ string.length());
+ QJniObject stringObject = getCleanJniObject(stringRef, env.jniEnv());
+ stringObject.d->m_className = "java/lang/String";
+ return stringObject;
}
/*!
@@ -1342,7 +1331,10 @@ QString QJniObject::toString() const
return QString();
QJniObject string = callObjectMethod<jstring>("toString");
- return qt_convertJString(static_cast<jstring>(string.object()));
+ const int strLength = string.jniEnv()->GetStringLength(string.object<jstring>());
+ QString res(strLength, Qt::Uninitialized);
+ string.jniEnv()->GetStringRegion(string.object<jstring>(), 0, strLength, reinterpret_cast<jchar *>(res.data()));
+ return res;
}
/*!
@@ -1363,7 +1355,7 @@ bool QJniObject::isClassAvailable(const char *className)
if (!env.jniEnv())
return false;
- return loadClass(className, env.jniEnv());;
+ return loadClass(className, env.jniEnv());
}
/*!
@@ -1399,13 +1391,17 @@ bool QJniObject::isValid() const
QJniObject QJniObject::fromLocalRef(jobject lref)
{
QJniObject obj(lref);
- QJniEnvironment()->DeleteLocalRef(lref);
+ obj.jniEnv()->DeleteLocalRef(lref);
return obj;
}
bool QJniObject::isSameObject(jobject obj) const
{
- return QJniEnvironment()->IsSameObject(d->m_jobject, obj);
+ if (d->m_jobject == obj)
+ return true;
+ if (!d->m_jobject || !obj)
+ return false;
+ return jniEnv()->IsSameObject(d->m_jobject, obj);
}
bool QJniObject::isSameObject(const QJniObject &other) const
@@ -1415,15 +1411,14 @@ bool QJniObject::isSameObject(const QJniObject &other) const
void QJniObject::assign(jobject obj)
{
- if (isSameObject(obj))
+ if (d && isSameObject(obj))
return;
- jobject jobj = static_cast<jobject>(obj);
d = QSharedPointer<QJniObjectPrivate>::create();
if (obj) {
- QJniEnvironment env;
- d->m_jobject = env->NewGlobalRef(jobj);
- jclass objectClass = env->GetObjectClass(jobj);
+ JNIEnv *env = QJniEnvironment::getJniEnv();
+ d->m_jobject = env->NewGlobalRef(obj);
+ jclass objectClass = env->GetObjectClass(obj);
d->m_jclass = static_cast<jclass>(env->NewGlobalRef(objectClass));
env->DeleteLocalRef(objectClass);
}
diff --git a/src/corelib/kernel/qjniobject.h b/src/corelib/kernel/qjniobject.h
index 80568b2970..589f6489f7 100644
--- a/src/corelib/kernel/qjniobject.h
+++ b/src/corelib/kernel/qjniobject.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QJNIOBJECT_H
#define QJNIOBJECT_H
@@ -52,313 +16,391 @@ class QJniObjectPrivate;
class Q_CORE_EXPORT QJniObject
{
+ friend class QJniArrayBase;
+
+ template <typename ...Args>
+ struct LocalFrame {
+ mutable JNIEnv *env;
+ bool hasFrame = false;
+ explicit LocalFrame(JNIEnv *env = nullptr) noexcept
+ : env(env)
+ {
+ }
+ ~LocalFrame()
+ {
+ if (hasFrame)
+ env->PopLocalFrame(nullptr);
+ }
+ template <typename T>
+ auto newLocalRef(jobject object)
+ {
+ if (!hasFrame) {
+ if (jniEnv()->PushLocalFrame(sizeof...(Args)) < 0)
+ return T{}; // JVM is out of memory, avoid making matters worse
+ hasFrame = true;
+ }
+ return static_cast<T>(jniEnv()->NewLocalRef(object));
+ }
+ template <typename T>
+ auto newLocalRef(const QJniObject &object)
+ {
+ return newLocalRef<T>(object.template object<T>());
+ }
+ JNIEnv *jniEnv() const
+ {
+ if (!env)
+ env = QJniEnvironment::getJniEnv();
+ return env;
+ }
+ bool checkAndClearExceptions()
+ {
+ return env ? QJniEnvironment::checkAndClearExceptions(env) : false;
+ }
+ template <typename T>
+ auto convertToJni(T &&value);
+ template <typename T>
+ auto convertFromJni(QJniObject &&object);
+ };
public:
QJniObject();
explicit QJniObject(const char *className);
explicit QJniObject(const char *className, const char *signature, ...);
- explicit QJniObject(jclass clazz);
- explicit QJniObject(jclass clazz, const char *signature, ...);
- QJniObject(jobject globalRef);
- ~QJniObject();
-
- jobject object() const;
- template <typename T> T object() const
+ template<typename ...Args
+#ifndef Q_QDOC
+ , std::enable_if_t<!std::disjunction_v<QtJniTypes::IsStringType<std::decay_t<Args>>...>>* = nullptr
+#endif
+ >
+ explicit QJniObject(const char *className, Args &&...args)
+ : QJniObject(LocalFrame<Args...>{}, className, std::forward<Args>(args)...)
{
- assertJniObjectType<T>();
- return static_cast<T>(javaObject());
}
-
- jclass objectClass() const;
- QByteArray className() const;
-
- template <typename T>
- T callMethod(const char *methodName, const char *signature, ...) const
+private:
+ template<typename ...Args>
+ explicit QJniObject(LocalFrame<Args...> localFrame, const char *className, Args &&...args)
+ : QJniObject(className, QtJniTypes::constructorSignature<Args...>().data(),
+ localFrame.convertToJni(std::forward<Args>(args))...)
{
- assertJniPrimitiveType<T>();
- QJniEnvironment env;
- T res{};
- jmethodID id = getCachedMethodID(env.jniEnv(), methodName, signature);
- if (id) {
- va_list args;
- va_start(args, signature);
- callMethodForType<T>(env.jniEnv(), res, object(), id, args);
- va_end(args);
- if (env.checkAndClearExceptions())
- res = {};
- }
- return res;
}
+public:
+ explicit QJniObject(jclass clazz);
+ explicit QJniObject(jclass clazz, const char *signature, ...);
+ template<typename ...Args
+#ifndef Q_QDOC
+ , std::enable_if_t<!std::disjunction_v<QtJniTypes::IsStringType<std::decay_t<Args>>...>>* = nullptr
+#endif
+ >
+ explicit QJniObject(jclass clazz, Args &&...args)
+ : QJniObject(clazz, QtJniTypes::constructorSignature<Args...>().data(),
+ std::forward<Args>(args)...)
+ {}
+ QJniObject(jobject globalRef);
- template <>
- void callMethod<void>(const char *methodName, const char *signature, ...) const
- {
- QJniEnvironment env;
- jmethodID id = getCachedMethodID(env.jniEnv(), methodName, signature);
- if (id) {
- va_list args;
- va_start(args, signature);
- callVoidMethodV(env.jniEnv(), id, args);
- va_end(args);
- env.checkAndClearExceptions();
- }
- }
+ QJniObject(const QJniObject &other) noexcept = default;
+ QJniObject(QJniObject &&other) noexcept = default;
+ QJniObject &operator=(const QJniObject &other) noexcept = default;
+ QJniObject &operator=(QJniObject &&other) noexcept = default;
- template <typename T>
- T callMethod(const char *methodName) const
- {
- assertJniPrimitiveType<T>();
- constexpr const char *signature = getTypeSignature<T>();
- return callMethod<T>(methodName, QByteArray(signature).prepend("()").constData());
- }
+ ~QJniObject();
- template <>
- void callMethod<void>(const char *methodName) const
+ template<typename Class, typename ...Args>
+ static inline QJniObject construct(Args &&...args)
{
- callMethod<void>(methodName, "()V");
+ LocalFrame<Args...> frame;
+ return QJniObject(QtJniTypes::Traits<Class>::className().data(),
+ QtJniTypes::constructorSignature<Args...>().data(),
+ frame.convertToJni(std::forward<Args>(args))...);
}
- template <typename T>
- QJniObject callObjectMethod(const char *methodName) const
+ jobject object() const;
+ template <typename T> T object() const
{
- assertJniObjectType<T>();
- constexpr const char *signature = getTypeSignature<T>();
- return callObjectMethod(methodName, QByteArray(signature).prepend("()").constData());
+ QtJniTypes::assertObjectType<T>();
+ return static_cast<T>(javaObject());
}
- QJniObject callObjectMethod(const char *methodName, const char *signature, ...) const;
-
- template <typename T>
- static T callStaticMethod(const char *className, const char *methodName,
- const char *signature, ...)
- {
- assertJniPrimitiveType<T>();
- QJniEnvironment env;
- T res{};
- jclass clazz = QJniObject::loadClass(className, env.jniEnv());
- if (clazz) {
- jmethodID id = getCachedMethodID(env.jniEnv(), clazz,
- QJniObject::toBinaryEncClassName(className),
- methodName, signature, true);
- if (id) {
- va_list args;
- va_start(args, signature);
- callStaticMethodForType<T>(env.jniEnv(), res, clazz, id, args);
- va_end(args);
- if (env.checkAndClearExceptions())
- res = {};
- }
- }
- return res;
- }
+ jclass objectClass() const;
+ QByteArray className() const;
- template <>
- void callStaticMethod<void>(const char *className, const char *methodName,
- const char *signature, ...)
- {
- QJniEnvironment env;
- jclass clazz = QJniObject::loadClass(className, env.jniEnv());
- if (clazz) {
- jmethodID id = getCachedMethodID(env.jniEnv(), clazz,
- QJniObject::toBinaryEncClassName(className),
- methodName, signature, true);
+ template <typename Ret, typename ...Args
+#ifndef Q_QDOC
+ , QtJniTypes::IfValidFieldType<Ret> = true
+#endif
+ >
+ auto callMethod(const char *methodName, const char *signature, Args &&...args) const
+ {
+ LocalFrame<Args...> frame(jniEnv());
+ if constexpr (QtJniTypes::isObjectType<Ret>()) {
+ return frame.template convertFromJni<Ret>(callObjectMethod(methodName, signature,
+ frame.convertToJni(std::forward<Args>(args))...));
+ } else {
+ jmethodID id = getCachedMethodID(frame.jniEnv(), methodName, signature);
if (id) {
- va_list args;
- va_start(args, signature);
- env->CallStaticVoidMethodV(clazz, id, args);
- va_end(args);
- env.checkAndClearExceptions();
+ if constexpr (std::is_same_v<Ret, void>) {
+ callVoidMethodV(frame.jniEnv(), id,
+ frame.convertToJni(std::forward<Args>(args))...);
+ frame.checkAndClearExceptions();
+ } else {
+ Ret res{};
+ callMethodForType<Ret>(frame.jniEnv(), res, object(), id,
+ frame.convertToJni(std::forward<Args>(args))...);
+ if (frame.checkAndClearExceptions())
+ res = {};
+ return res;
+ }
}
+ if constexpr (!std::is_same_v<Ret, void>)
+ return Ret{};
}
}
- template <typename T>
- static T callStaticMethod(const char *className, const char *methodName)
+ template <typename Ret, typename ...Args
+#ifndef Q_QDOC
+ , QtJniTypes::IfValidSignatureTypes<Ret, Args...> = true
+#endif
+ >
+ auto callMethod(const char *methodName, Args &&...args) const
{
- assertJniPrimitiveType<T>();
- constexpr const char *signature = getTypeSignature<T>();
- return callStaticMethod<T>(className, methodName, QByteArray(signature).prepend("()").constData());
+ constexpr auto signature = QtJniTypes::methodSignature<Ret, Args...>();
+ return callMethod<Ret>(methodName, signature.data(), std::forward<Args>(args)...);
}
- template <>
- void callStaticMethod<void>(const char *className, const char *methodName)
+ template <typename Ret, typename ...Args
+#ifndef Q_QDOC
+ , QtJniTypes::IfValidSignatureTypes<Ret, Args...> = true
+#endif
+ >
+ QJniObject callObjectMethod(const char *methodName, Args &&...args) const
{
- callStaticMethod<void>(className, methodName, "()V");
+ QtJniTypes::assertObjectType<Ret>();
+ constexpr auto signature = QtJniTypes::methodSignature<Ret, Args...>();
+ LocalFrame<Args...> frame(jniEnv());
+ return frame.template convertFromJni<Ret>(callObjectMethod(methodName, signature,
+ frame.convertToJni(std::forward<Args>(args))...));
}
- template <typename T>
- static T callStaticMethod(jclass clazz, const char *methodName, const char *signature, ...)
- {
- assertJniPrimitiveType<T>();
- QJniEnvironment env;
- T res{};
- if (clazz) {
- jmethodID id = getMethodID(env.jniEnv(), clazz, methodName, signature, true);
- if (id) {
- va_list args;
- va_start(args, signature);
- callStaticMethodForType<T>(env.jniEnv(), res, clazz, id, args);
- va_end(args);
- if (env.checkAndClearExceptions())
- res = {};
- }
- }
- return res;
- }
+ QJniObject callObjectMethod(const char *methodName, const char *signature, ...) const;
- template <>
- void callStaticMethod<void>(jclass clazz, const char *methodName,
- const char *signature, ...)
+ template <typename Ret, typename ...Args>
+ static auto callStaticMethod(const char *className, const char *methodName, const char *signature, Args &&...args)
{
- QJniEnvironment env;
- if (clazz) {
- jmethodID id = getMethodID(env.jniEnv(), clazz, methodName, signature, true);
- if (id) {
- va_list args;
- va_start(args, signature);
- env->CallStaticVoidMethodV(clazz, id, args);
- va_end(args);
- env.checkAndClearExceptions();
- }
- }
+ JNIEnv *env = QJniEnvironment::getJniEnv();
+ jclass clazz = QJniObject::loadClass(className, env);
+ return callStaticMethod<Ret>(clazz, methodName, signature, std::forward<Args>(args)...);
}
- template <typename T>
- static T callStaticMethod(jclass clazz, jmethodID methodId, ...)
+ template <typename Ret, typename ...Args>
+ static auto callStaticMethod(jclass clazz, const char *methodName, const char *signature, Args &&...args)
{
- assertJniPrimitiveType<T>();
- QJniEnvironment env;
- T res{};
- if (clazz && methodId) {
- va_list args;
- va_start(args, methodId);
- callStaticMethodForType<T>(env.jniEnv(), res, clazz, methodId, args);
- va_end(args);
- if (env.checkAndClearExceptions())
- res = {};
- }
- return res;
+ JNIEnv *env = QJniEnvironment::getJniEnv();
+ jmethodID id = clazz ? getMethodID(env, clazz, methodName, signature, true)
+ : 0;
+ return callStaticMethod<Ret>(clazz, id, std::forward<Args>(args)...);
}
- template <>
- void callStaticMethod<void>(jclass clazz, jmethodID methodId, ...)
- {
- QJniEnvironment env;
- if (clazz && methodId) {
- va_list args;
- va_start(args, methodId);
- env->CallStaticVoidMethodV(clazz, methodId, args);
- va_end(args);
- env.checkAndClearExceptions();
+ template <typename Ret, typename ...Args
+#ifndef Q_QDOC
+ , QtJniTypes::IfValidFieldType<Ret> = true
+#endif
+ >
+ static auto callStaticMethod(jclass clazz, jmethodID methodId, Args &&...args)
+ {
+ LocalFrame<Args...> frame;
+ if constexpr (QtJniTypes::isObjectType<Ret>()) {
+ return frame.template convertFromJni<Ret>(callStaticObjectMethod(clazz, methodId,
+ frame.convertToJni(std::forward<Args>(args))...));
+ } else {
+ if (clazz && methodId) {
+ if constexpr (std::is_same_v<Ret, void>) {
+ callStaticMethodForVoid(frame.jniEnv(), clazz, methodId,
+ frame.convertToJni(std::forward<Args>(args))...);
+ frame.checkAndClearExceptions();
+ } else {
+ Ret res{};
+ callStaticMethodForType<Ret>(frame.jniEnv(), res, clazz, methodId,
+ frame.convertToJni(std::forward<Args>(args))...);
+ if (frame.checkAndClearExceptions())
+ res = {};
+ return res;
+ }
+ }
+ if constexpr (!std::is_same_v<Ret, void>)
+ return Ret{};
}
}
- template <typename T> static T callStaticMethod(jclass clazz, const char *methodName)
+ template <typename Ret, typename ...Args
+#ifndef Q_QDOC
+ , QtJniTypes::IfValidSignatureTypes<Ret, Args...> = true
+#endif
+ >
+ static auto callStaticMethod(const char *className, const char *methodName, Args &&...args)
{
- assertJniPrimitiveType<T>();
- constexpr const char *signature = getTypeSignature<T>();
- return callStaticMethod<T>(clazz, methodName, QByteArray(signature).prepend("()").constData());
+ JNIEnv *env = QJniEnvironment::getJniEnv();
+ jclass clazz = QJniObject::loadClass(className, env);
+ const jmethodID id = clazz ? getMethodID(env, clazz, methodName,
+ QtJniTypes::methodSignature<Ret, Args...>().data(), true)
+ : 0;
+ return callStaticMethod<Ret>(clazz, id, std::forward<Args>(args)...);
}
- template <>
- void callStaticMethod<void>(jclass clazz, const char *methodName)
+ template <typename Ret, typename ...Args
+#ifndef Q_QDOC
+ , QtJniTypes::IfValidSignatureTypes<Ret, Args...> = true
+#endif
+ >
+ static auto callStaticMethod(jclass clazz, const char *methodName, Args &&...args)
{
- callStaticMethod<void>(clazz, methodName, "()V");
+ constexpr auto signature = QtJniTypes::methodSignature<Ret, Args...>();
+ return callStaticMethod<Ret>(clazz, methodName, signature.data(), std::forward<Args>(args)...);
}
-
- template <typename T>
- static QJniObject callStaticObjectMethod(const char *className, const char *methodName)
+ template <typename Klass, typename Ret, typename ...Args
+#ifndef Q_QDOC
+ , QtJniTypes::IfValidSignatureTypes<Ret, Args...> = true
+#endif
+ >
+ static auto callStaticMethod(const char *methodName, Args &&...args)
{
- assertJniObjectType<T>();
- constexpr const char *signature = getTypeSignature<T>();
- return callStaticObjectMethod(className, methodName, QByteArray(signature).prepend("()").constData());
+ JNIEnv *env = QJniEnvironment::getJniEnv();
+ const jclass clazz = QJniObject::loadClass(QtJniTypes::Traits<Klass>::className().data(),
+ env);
+ const jmethodID id = clazz ? getMethodID(env, clazz, methodName,
+ QtJniTypes::methodSignature<Ret, Args...>().data(), true)
+ : 0;
+ return callStaticMethod<Ret>(clazz, id, std::forward<Args>(args)...);
}
static QJniObject callStaticObjectMethod(const char *className, const char *methodName,
const char *signature, ...);
- template <typename T>
- static QJniObject callStaticObjectMethod(jclass clazz, const char *methodName)
- {
- assertJniObjectType<T>();
- constexpr const char *signature = getTypeSignature<T>();
- return callStaticObjectMethod(clazz, methodName, QByteArray(signature).prepend("()").constData());
- }
-
static QJniObject callStaticObjectMethod(jclass clazz, const char *methodName,
const char *signature, ...);
static QJniObject callStaticObjectMethod(jclass clazz, jmethodID methodId, ...);
- template <typename T> T getField(const char *fieldName) const
+
+ template <typename Ret, typename ...Args
+#ifndef Q_QDOC
+ , QtJniTypes::IfValidSignatureTypes<Ret, Args...> = true
+#endif
+ >
+ static QJniObject callStaticObjectMethod(const char *className, const char *methodName, Args &&...args)
{
- assertJniPrimitiveType<T>();
- QJniEnvironment env;
- T res{};
- constexpr const char *signature = getTypeSignature<T>();
- jfieldID id = getCachedFieldID(env.jniEnv(), fieldName, signature);
- if (id) {
- getFieldForType<T>(env.jniEnv(), res, object(), id);
- if (env.checkAndClearExceptions())
- res = {};
- }
- return res;
+ QtJniTypes::assertObjectType<Ret>();
+ constexpr auto signature = QtJniTypes::methodSignature<Ret, Args...>();
+ LocalFrame<Args...> frame;
+ return frame.template convertFromJni<Ret>(callStaticObjectMethod(className, methodName, signature.data(),
+ frame.convertToJni(std::forward<Args>(args))...));
}
- template <typename T>
- static T getStaticField(const char *className, const char *fieldName)
+ template <typename Ret, typename ...Args
+#ifndef Q_QDOC
+ , QtJniTypes::IfValidSignatureTypes<Ret, Args...> = true
+#endif
+ >
+ static QJniObject callStaticObjectMethod(jclass clazz, const char *methodName, Args &&...args)
{
- assertJniPrimitiveType<T>();
- QJniEnvironment env;
- jclass clazz = QJniObject::loadClass(className, env.jniEnv());
- if (!clazz)
- return 0;
+ QtJniTypes::assertObjectType<Ret>();
+ constexpr auto signature = QtJniTypes::methodSignature<Ret, Args...>();
+ LocalFrame<Args...> frame;
+ return frame.template convertFromJni<Ret>(callStaticObjectMethod(clazz, methodName, signature.data(),
+ frame.convertToJni(std::forward<Args>(args))...));
+ }
- constexpr const char *signature = getTypeSignature<T>();
- jfieldID id = getCachedFieldID(env.jniEnv(), clazz,
- QJniObject::toBinaryEncClassName(className),
- fieldName,
- signature, true);
- if (!id)
- return 0;
+ template <typename T
+#ifndef Q_QDOC
+ , QtJniTypes::IfValidFieldType<T> = true
+#endif
+ >
+ auto getField(const char *fieldName) const
+ {
+ LocalFrame<T> frame(jniEnv());
+ if constexpr (QtJniTypes::isObjectType<T>()) {
+ return frame.template convertFromJni<T>(getObjectField<T>(fieldName));
+ } else {
+ T res{};
+ constexpr auto signature = QtJniTypes::fieldSignature<T>();
+ jfieldID id = getCachedFieldID(frame.jniEnv(), fieldName, signature);
+ if (id) {
+ getFieldForType<T>(frame.jniEnv(), res, object(), id);
+ if (frame.checkAndClearExceptions())
+ res = {};
+ }
+ return res;
+ }
+ }
- T res{};
- getStaticFieldForType<T>(env.jniEnv(), res, clazz, id);
- if (env.checkAndClearExceptions())
- res = {};
- return res;
+ template <typename T
+#ifndef Q_QDOC
+ , QtJniTypes::IfValidFieldType<T> = true
+#endif
+ >
+ static auto getStaticField(const char *className, const char *fieldName)
+ {
+ LocalFrame<T> frame;
+ if constexpr (QtJniTypes::isObjectType<T>()) {
+ return frame.template convertFromJni<T>(getStaticObjectField<T>(className, fieldName));
+ } else {
+ jclass clazz = QJniObject::loadClass(className, frame.jniEnv());
+ if (!clazz)
+ return T{};
+ return getStaticField<T>(clazz, fieldName);
+ }
}
- template <typename T>
- static T getStaticField(jclass clazz, const char *fieldName)
- {
- assertJniPrimitiveType<T>();
- QJniEnvironment env;
- T res{};
- constexpr const char *signature = getTypeSignature<T>();
- jfieldID id = getFieldID(env.jniEnv(), clazz, fieldName, signature, true);
- if (id) {
- getStaticFieldForType<T>(env.jniEnv(), res, clazz, id);
- if (env.checkAndClearExceptions())
- res = {};
+ template <typename T
+#ifndef Q_QDOC
+ , QtJniTypes::IfValidFieldType<T> = true
+#endif
+ >
+ static auto getStaticField(jclass clazz, const char *fieldName)
+ {
+ LocalFrame<T> frame;
+ if constexpr (QtJniTypes::isObjectType<T>()) {
+ return frame.template convertFromJni<T>(getStaticObjectField<T>(clazz, fieldName));
+ } else {
+ T res{};
+ constexpr auto signature = QtJniTypes::fieldSignature<T>();
+ jfieldID id = getFieldID(frame.jniEnv(), clazz, fieldName, signature, true);
+ if (id) {
+ getStaticFieldForType<T>(frame.jniEnv(), res, clazz, id);
+ if (frame.checkAndClearExceptions())
+ res = {};
+ }
+ return res;
}
- return res;
}
- template <typename T>
+ template <typename Klass, typename T
+#ifndef Q_QDOC
+ , QtJniTypes::IfValidFieldType<T> = true
+#endif
+ >
+ static auto getStaticField(const char *fieldName)
+ {
+ return getStaticField<T>(QtJniTypes::Traits<Klass>::className(), fieldName);
+ }
+
+ template <typename T
+#ifndef Q_QDOC
+ , std::enable_if_t<QtJniTypes::isObjectType<T>(), bool> = true
+#endif
+ >
QJniObject getObjectField(const char *fieldName) const
{
- assertJniObjectType<T>();
- constexpr const char *signature = getTypeSignature<T>();
+ constexpr auto signature = QtJniTypes::fieldSignature<T>();
return getObjectField(fieldName, signature);
}
QJniObject getObjectField(const char *fieldName, const char *signature) const;
- template <typename T>
+ template <typename T
+#ifndef Q_QDOC
+ , std::enable_if_t<QtJniTypes::isObjectType<T>(), bool> = true
+#endif
+ >
static QJniObject getStaticObjectField(const char *className, const char *fieldName)
{
- assertJniObjectType<T>();
- constexpr const char *signature = getTypeSignature<T>();
+ constexpr auto signature = QtJniTypes::fieldSignature<T>();
return getStaticObjectField(className, fieldName, signature);
}
@@ -366,104 +408,128 @@ public:
const char *fieldName,
const char *signature);
- template <typename T>
+ template <typename T
+#ifndef Q_QDOC
+ , std::enable_if_t<QtJniTypes::isObjectType<T>(), bool> = true
+#endif
+ >
static QJniObject getStaticObjectField(jclass clazz, const char *fieldName)
{
- assertJniObjectType<T>();
- constexpr const char *signature = getTypeSignature<T>();
+ constexpr auto signature = QtJniTypes::fieldSignature<T>();
return getStaticObjectField(clazz, fieldName, signature);
}
static QJniObject getStaticObjectField(jclass clazz, const char *fieldName,
const char *signature);
- template <typename T> void setField(const char *fieldName, T value)
+ template <typename T
+#ifndef Q_QDOC
+ , QtJniTypes::IfValidFieldType<T> = true
+#endif
+ >
+ void setField(const char *fieldName, T value)
{
- assertJniType<T>();
- QJniEnvironment env;
- constexpr const char *signature = getTypeSignature<T>();
- jfieldID id = getCachedFieldID(env.jniEnv(), fieldName, signature);
+ constexpr auto signature = QtJniTypes::fieldSignature<T>();
+ jfieldID id = getCachedFieldID(jniEnv(), fieldName, signature);
if (id) {
- setFieldForType<T>(env.jniEnv(), object(), id, value);
- env.checkAndClearExceptions();
+ setFieldForType<T>(jniEnv(), object(), id, value);
+ QJniEnvironment::checkAndClearExceptions(jniEnv());
}
}
- template <typename T>
+ template <typename T
+#ifndef Q_QDOC
+ , QtJniTypes::IfValidFieldType<T> = true
+#endif
+ >
void setField(const char *fieldName, const char *signature, T value)
{
- assertJniType<T>();
- QJniEnvironment env;
- jfieldID id = getCachedFieldID(env.jniEnv(), fieldName, signature);
+ jfieldID id = getCachedFieldID(jniEnv(), fieldName, signature);
if (id) {
- setFieldForType<T>(env.jniEnv(), object(), id, value);
- env.checkAndClearExceptions();
+ setFieldForType<T>(jniEnv(), object(), id, value);
+ QJniEnvironment::checkAndClearExceptions(jniEnv());
}
}
- template <typename T>
+ template <typename T
+#ifndef Q_QDOC
+ , QtJniTypes::IfValidFieldType<T> = true
+#endif
+ >
static void setStaticField(const char *className, const char *fieldName, T value)
{
- assertJniType<T>();
- QJniEnvironment env;
- jclass clazz = QJniObject::loadClass(className, env.jniEnv());
+ LocalFrame<T> frame;
+ jclass clazz = QJniObject::loadClass(className, frame.jniEnv());
if (!clazz)
return;
- constexpr const char *signature = getTypeSignature<T>();
- jfieldID id = getCachedFieldID(env.jniEnv(), clazz, className, fieldName,
+ constexpr auto signature = QtJniTypes::fieldSignature<T>();
+ jfieldID id = getCachedFieldID(frame.jniEnv(), clazz, className, fieldName,
signature, true);
if (!id)
return;
- setStaticFieldForType<T>(env.jniEnv(), clazz, id, value);
- env.checkAndClearExceptions();
+ setStaticFieldForType<T>(frame.jniEnv(), clazz, id, value);
+ frame.checkAndClearExceptions();
}
- template <typename T>
+ template <typename T
+#ifndef Q_QDOC
+ , QtJniTypes::IfValidFieldType<T> = true
+#endif
+ >
static void setStaticField(const char *className, const char *fieldName,
const char *signature, T value)
{
- assertJniType<T>();
- QJniEnvironment env;
- jclass clazz = QJniObject::loadClass(className, env.jniEnv());
+ JNIEnv *env = QJniEnvironment::getJniEnv();
+ jclass clazz = QJniObject::loadClass(className, env);
if (!clazz)
return;
- jfieldID id = getCachedFieldID(env.jniEnv(), clazz, className, fieldName,
+ jfieldID id = getCachedFieldID(env, clazz, className, fieldName,
signature, true);
if (id) {
- setStaticFieldForType<T>(env.jniEnv(), clazz, id, value);
- env.checkAndClearExceptions();
+ setStaticFieldForType<T>(env, clazz, id, value);
+ QJniEnvironment::checkAndClearExceptions(env);
}
}
- template <typename T>
+ template <typename T
+#ifndef Q_QDOC
+ , QtJniTypes::IfValidFieldType<T> = true
+#endif
+ >
static void setStaticField(jclass clazz, const char *fieldName,
const char *signature, T value)
{
- assertJniType<T>();
- QJniEnvironment env;
- jfieldID id = getFieldID(env.jniEnv(), clazz, fieldName, signature, true);
+ JNIEnv *env = QJniEnvironment::getJniEnv();
+ jfieldID id = getFieldID(env, clazz, fieldName, signature, true);
if (id) {
- setStaticFieldForType<T>(env.jniEnv(), clazz, id, value);
- env.checkAndClearExceptions();
+ setStaticFieldForType<T>(env, clazz, id, value);
+ QJniEnvironment::checkAndClearExceptions(env);
}
}
- template <typename T>
+ template <typename T
+#ifndef Q_QDOC
+ , QtJniTypes::IfValidFieldType<T> = true
+#endif
+ >
static void setStaticField(jclass clazz, const char *fieldName, T value)
{
- assertJniType<T>();
- QJniEnvironment env;
- constexpr const char *signature = getTypeSignature<T>();
- jfieldID id = getFieldID(env.jniEnv(), clazz, fieldName, signature, true);
- if (id) {
- setStaticFieldForType<T>(env.jniEnv(), clazz, id, value);
- env.checkAndClearExceptions();
- }
+ setStaticField(clazz, fieldName, QtJniTypes::fieldSignature<T>(), value);
+ }
+
+ template <typename Klass, typename T
+#ifndef Q_QDOC
+ , QtJniTypes::IfValidFieldType<T> = true
+#endif
+ >
+ static void setStaticField(const char *fieldName, T value)
+ {
+ setStaticField(QtJniTypes::Traits<Klass>::className(), fieldName, value);
}
static QJniObject fromString(const QString &string);
@@ -475,21 +541,27 @@ public:
// This function takes ownership of the jobject and releases the local ref. before returning.
static QJniObject fromLocalRef(jobject lref);
- template <typename T> QJniObject &operator=(T obj)
+ template <typename T,
+ std::enable_if_t<std::is_convertible_v<T, jobject>, bool> = true>
+ QJniObject &operator=(T obj)
{
- assertJniType<T>();
assign(static_cast<T>(obj));
return *this;
}
+protected:
+ QJniObject(Qt::Initialization) {}
+ JNIEnv *jniEnv() const noexcept;
+
private:
- struct QVaListPrivate { operator va_list &() const { return m_args; } va_list &m_args; };
- QJniObject(const char *className, const char *signature, const QVaListPrivate &args);
- QJniObject(jclass clazz, const char *signature, const QVaListPrivate &args);
+ static jclass loadClass(const QByteArray &className, JNIEnv *env);
- static jclass loadClass(const QByteArray &className, JNIEnv *env, bool binEncoded = false);
+#if QT_CORE_REMOVED_SINCE(6, 7)
+ // these need to stay in the ABI as they were used in inline methods before 6.7
+ static jclass loadClass(const QByteArray &className, JNIEnv *env, bool binEncoded);
static QByteArray toBinaryEncClassName(const QByteArray &className);
- static QJniObject getCleanJniObject(jobject obj);
+ void callVoidMethodV(JNIEnv *env, jmethodID id, va_list args) const;
+#endif
static jfieldID getCachedFieldID(JNIEnv *env, jclass clazz, const QByteArray &className,
const char *name, const char *signature,
@@ -507,15 +579,7 @@ private:
static jmethodID getMethodID(JNIEnv *env, jclass clazz, const char *name,
const char *signature, bool isStatic = false);
- void callVoidMethodV(JNIEnv *env, jmethodID id, va_list args) const;
- QJniObject callObjectMethodV(const char *methodName, const char *signature,
- va_list args) const;
-
- static QJniObject callStaticObjectMethodV(const char *className, const char *methodName,
- const char *signature, va_list args);
-
- static QJniObject callStaticObjectMethodV(jclass clazz, const char *methodName,
- const char *signature, va_list args);
+ void callVoidMethodV(JNIEnv *env, jmethodID id, ...) const;
bool isSameObject(jobject obj) const;
bool isSameObject(const QJniObject &other) const;
@@ -525,262 +589,281 @@ private:
friend bool operator==(const QJniObject &, const QJniObject &);
friend bool operator!=(const QJniObject&, const QJniObject&);
- template<bool flag = false>
- static void staticAssertTypeMismatch()
+ template<typename T>
+ static constexpr void callMethodForType(JNIEnv *env, T &res, jobject obj, jmethodID id, ...)
{
- static_assert(flag, "The used type is not supported by this template call. "
- "Use a JNI based type instead.");
+ va_list args = {};
+ va_start(args, id);
+ QtJniTypes::Caller<T>::callMethodForType(env, res, obj, id, args);
+ va_end(args);
}
template<typename T>
- static constexpr bool isJniPrimitiveType()
- {
- if constexpr(!std::is_same<T, jboolean>::value
- && !std::is_same<T, jbyte>::value
- && !std::is_same<T, jchar>::value
- && !std::is_same<T, jshort>::value
- && !std::is_same<T, jint>::value
- && !std::is_same<T, jlong>::value
- && !std::is_same<T, jfloat>::value
- && !std::is_same<T, jdouble>::value) {
- return false;
- }
+ static constexpr void callStaticMethodForType(JNIEnv *env, T &res, jclass clazz,
+ jmethodID id, ...)
+ {
+ if (!clazz || !id)
+ return;
+ va_list args = {};
+ va_start(args, id);
+ QtJniTypes::Caller<T>::callStaticMethodForType(env, res, clazz, id, args);
+ va_end(args);
+ }
- return true;
+ static void callStaticMethodForVoid(JNIEnv *env, jclass clazz, jmethodID id, ...)
+ {
+ if (!clazz || !id)
+ return;
+ va_list args;
+ va_start(args, id);
+ env->CallStaticVoidMethodV(clazz, id, args);
+ va_end(args);
}
+
template<typename T>
- static constexpr void assertJniPrimitiveType()
+ static constexpr void getFieldForType(JNIEnv *env, T &res, jobject obj, jfieldID id)
{
- if constexpr(!isJniPrimitiveType<T>())
- staticAssertTypeMismatch();
+ QtJniTypes::Caller<T>::getFieldForType(env, res, obj, id);
}
template<typename T>
- static constexpr void assertJniObjectType()
+ static constexpr void getStaticFieldForType(JNIEnv *env, T &res, jclass clazz, jfieldID id)
{
- if constexpr(!std::is_convertible<T, jobject>::value)
- staticAssertTypeMismatch();
+ QtJniTypes::Caller<T>::getStaticFieldForType(env, res, clazz, id);
}
template<typename T>
- static constexpr void assertJniType()
+ static constexpr void setFieldForType(JNIEnv *env, jobject obj, jfieldID id, T value)
{
- if constexpr(!isJniPrimitiveType<T>() && !std::is_convertible<T, jobject>::value)
- staticAssertTypeMismatch();
+ if constexpr (QtJniTypes::isObjectType<T>()) {
+ LocalFrame<T> frame(env);
+ env->SetObjectField(obj, id, static_cast<jobject>(frame.convertToJni(value)));
+ } else {
+ QtJniTypes::Caller<T>::setFieldForType(env, obj, id, value);
+ }
}
template<typename T>
- static constexpr const char* getTypeSignature()
- {
- if constexpr(std::is_same<T, jobject>::value)
- return "Ljava/lang/Object;";
- else if constexpr(std::is_same<T, jclass>::value)
- return "Ljava/lang/Class;";
- else if constexpr(std::is_same<T, jstring>::value)
- return "Ljava/lang/String;";
- else if constexpr(std::is_same<T, jobjectArray>::value)
- return "[Ljava/lang/Object;";
- else if constexpr(std::is_same<T, jthrowable>::value)
- return "Ljava/lang/Throwable;";
- else if constexpr(std::is_same<T, jbooleanArray>::value)
- return "[Z";
- else if constexpr(std::is_same<T, jbyteArray>::value)
- return "[B";
- else if constexpr(std::is_same<T, jshortArray>::value)
- return "[S";
- else if constexpr(std::is_same<T, jintArray>::value)
- return "[I";
- else if constexpr(std::is_same<T, jlongArray>::value)
- return "[J";
- else if constexpr(std::is_same<T, jfloatArray>::value)
- return "[F";
- else if constexpr(std::is_same<T, jdoubleArray>::value)
- return "[D";
- else if constexpr(std::is_same<T, jcharArray>::value)
- return "[C";
- else if constexpr(std::is_same<T, jboolean>::value)
- return "Z";
- else if constexpr(std::is_same<T, jbyte>::value)
- return "B";
- else if constexpr(std::is_same<T, jchar>::value)
- return "C";
- else if constexpr(std::is_same<T, jshort>::value)
- return "S";
- else if constexpr(std::is_same<T, jint>::value)
- return "I";
- else if constexpr(std::is_same<T, jlong>::value)
- return "J";
- else if constexpr(std::is_same<T, jfloat>::value)
- return "F";
- else if constexpr(std::is_same<T, jdouble>::value)
- return "D";
- else
- staticAssertTypeMismatch();
+ static constexpr void setStaticFieldForType(JNIEnv *env, jclass clazz, jfieldID id, T value)
+ {
+ if constexpr (QtJniTypes::isObjectType<T>()) {
+ LocalFrame<T> frame(env);
+ env->SetStaticObjectField(clazz, id, static_cast<jobject>(frame.convertToJni(value)));
+ } else {
+ QtJniTypes::Caller<T>::setStaticFieldForType(env, clazz, id, value);
+ }
}
- template<typename T>
- static constexpr void callMethodForType(JNIEnv *env, T &res, jobject obj,
- jmethodID id, va_list args)
- {
- if constexpr(std::is_same<T, jboolean>::value)
- res = env->CallBooleanMethodV(obj, id, args);
- else if constexpr(std::is_same<T, jbyte>::value)
- res = env->CallByteMethodV(obj, id, args);
- else if constexpr(std::is_same<T, jchar>::value)
- res = env->CallCharMethodV(obj, id, args);
- else if constexpr(std::is_same<T, jshort>::value)
- res = env->CallShortMethodV(obj, id, args);
- else if constexpr(std::is_same<T, jint>::value)
- res = env->CallIntMethodV(obj, id, args);
- else if constexpr(std::is_same<T, jlong>::value)
- res = env->CallLongMethodV(obj, id, args);
- else if constexpr(std::is_same<T, jfloat>::value)
- res = env->CallFloatMethodV(obj, id, args);
- else if constexpr(std::is_same<T, jdouble>::value)
- res = env->CallDoubleMethodV(obj, id, args);
- else
- staticAssertTypeMismatch();
+ friend QJniObjectPrivate;
+ QSharedPointer<QJniObjectPrivate> d;
+};
+
+inline bool operator==(const QJniObject &obj1, const QJniObject &obj2)
+{
+ return obj1.isSameObject(obj2);
+}
+
+inline bool operator!=(const QJniObject &obj1, const QJniObject &obj2)
+{
+ return !obj1.isSameObject(obj2);
+}
+
+namespace QtJniTypes {
+struct JObjectBase
+{
+ operator QJniObject() const { return m_object; }
+
+ bool isValid() const { return m_object.isValid(); }
+ jclass objectClass() const { return m_object.objectClass(); }
+ QString toString() const { return m_object.toString(); }
+
+ template <typename T = jobject>
+ T object() const {
+ return m_object.object<T>();
}
- template<typename T>
- static constexpr void callStaticMethodForType(JNIEnv *env, T &res, jclass clazz,
- jmethodID id, va_list args)
- {
- if constexpr(std::is_same<T, jboolean>::value)
- res = env->CallStaticBooleanMethodV(clazz, id, args);
- else if constexpr(std::is_same<T, jbyte>::value)
- res = env->CallStaticByteMethodV(clazz, id, args);
- else if constexpr(std::is_same<T, jchar>::value)
- res = env->CallStaticCharMethodV(clazz, id, args);
- else if constexpr(std::is_same<T, jshort>::value)
- res = env->CallStaticShortMethodV(clazz, id, args);
- else if constexpr(std::is_same<T, jint>::value)
- res = env->CallStaticIntMethodV(clazz, id, args);
- else if constexpr(std::is_same<T, jlong>::value)
- res = env->CallStaticLongMethodV(clazz, id, args);
- else if constexpr(std::is_same<T, jfloat>::value)
- res = env->CallStaticFloatMethodV(clazz, id, args);
- else if constexpr(std::is_same<T, jdouble>::value)
- res = env->CallStaticDoubleMethodV(clazz, id, args);
- else
- staticAssertTypeMismatch();
+protected:
+ JObjectBase() = default;
+ ~JObjectBase() = default;
+
+ Q_IMPLICIT JObjectBase(jobject object) : m_object(object) {}
+ Q_IMPLICIT JObjectBase(const QJniObject &object) : m_object(object) {}
+ Q_IMPLICIT JObjectBase(QJniObject &&object) noexcept : m_object(std::move(object)) {}
+
+ QJniObject m_object;
+};
+
+template<typename Type>
+class JObject : public JObjectBase
+{
+public:
+ using Class = Type;
+
+ JObject()
+ : JObjectBase{QJniObject(QtJniTypes::Traits<Class>::className())}
+ {}
+ Q_IMPLICIT JObject(jobject object) : JObjectBase(object) {}
+ Q_IMPLICIT JObject(const QJniObject &object) : JObjectBase(object) {}
+ Q_IMPLICIT JObject(QJniObject &&object) noexcept : JObjectBase(std::move(object)) {}
+
+ // base class destructor is protected, so need to provide all SMFs
+ JObject(const JObject &other) = default;
+ JObject(JObject &&other) noexcept = default;
+ JObject &operator=(const JObject &other) = default;
+ JObject &operator=(JObject &&other) noexcept = default;
+
+ ~JObject() = default;
+
+ template<typename Arg, typename ...Args
+ , std::enable_if_t<!std::is_same_v<Arg, JObject>, bool> = true
+ , IfValidSignatureTypes<Arg, Args...> = true
+ >
+ explicit JObject(Arg && arg, Args &&...args)
+ : JObjectBase{QJniObject(QtJniTypes::Traits<Class>::className(),
+ std::forward<Arg>(arg), std::forward<Args>(args)...)}
+ {}
+
+ // named constructors avoid ambiguities
+ static Type fromJObject(jobject object) { return Type(object); }
+ template <typename ...Args>
+ static Type construct(Args &&...args) { return Type(std::forward<Args>(args)...); }
+ static Type fromLocalRef(jobject lref) { return Type(QJniObject::fromLocalRef(lref)); }
+
+ static bool registerNativeMethods(std::initializer_list<JNINativeMethod> methods)
+ {
+ QJniEnvironment env;
+ return env.registerNativeMethods<Class>(methods);
}
- template<typename T>
- static constexpr void getFieldForType(JNIEnv *env, T &res, jobject obj,
- jfieldID id)
- {
- if constexpr(std::is_same<T, jboolean>::value)
- res = env->GetBooleanField(obj, id);
- else if constexpr(std::is_same<T, jbyte>::value)
- res = env->GetByteField(obj, id);
- else if constexpr(std::is_same<T, jchar>::value)
- res = env->GetCharField(obj, id);
- else if constexpr(std::is_same<T, jshort>::value)
- res = env->GetShortField(obj, id);
- else if constexpr(std::is_same<T, jint>::value)
- res = env->GetIntField(obj, id);
- else if constexpr(std::is_same<T, jlong>::value)
- res = env->GetLongField(obj, id);
- else if constexpr(std::is_same<T, jfloat>::value)
- res = env->GetFloatField(obj, id);
- else if constexpr(std::is_same<T, jdouble>::value)
- res = env->GetDoubleField(obj, id);
- else
- staticAssertTypeMismatch();
+ // public API forwarding to QJniObject, with the implicit Class template parameter
+ template <typename Ret, typename ...Args
+#ifndef Q_QDOC
+ , QtJniTypes::IfValidSignatureTypes<Ret, Args...> = true
+#endif
+ >
+ static auto callStaticMethod(const char *name, Args &&...args)
+ {
+ return QJniObject::callStaticMethod<Class, Ret, Args...>(name,
+ std::forward<Args>(args)...);
+ }
+ template <typename T
+#ifndef Q_QDOC
+ , QtJniTypes::IfValidFieldType<T> = true
+#endif
+ >
+ static auto getStaticField(const char *field)
+ {
+ return QJniObject::getStaticField<Class, T>(field);
+ }
+ template <typename T
+#ifndef Q_QDOC
+ , QtJniTypes::IfValidFieldType<T> = true
+#endif
+ >
+ static void setStaticField(const char *field, T &&value)
+ {
+ QJniObject::setStaticField<Class, T>(field, std::forward<T>(value));
}
- template<typename T>
- static constexpr void getStaticFieldForType(JNIEnv *env, T &res, jclass clazz,
- jfieldID id)
- {
- if constexpr(std::is_same<T, jboolean>::value)
- res = env->GetStaticBooleanField(clazz, id);
- else if constexpr(std::is_same<T, jbyte>::value)
- res = env->GetStaticByteField(clazz, id);
- else if constexpr(std::is_same<T, jchar>::value)
- res = env->GetStaticCharField(clazz, id);
- else if constexpr(std::is_same<T, jshort>::value)
- res = env->GetStaticShortField(clazz, id);
- else if constexpr(std::is_same<T, jint>::value)
- res = env->GetStaticIntField(clazz, id);
- else if constexpr(std::is_same<T, jlong>::value)
- res = env->GetStaticLongField(clazz, id);
- else if constexpr(std::is_same<T, jfloat>::value)
- res = env->GetStaticFloatField(clazz, id);
- else if constexpr(std::is_same<T, jdouble>::value)
- res = env->GetStaticDoubleField(clazz, id);
- else
- staticAssertTypeMismatch();
+ // keep only these overloads, the rest is made private
+ template <typename Ret, typename ...Args
+#ifndef Q_QDOC
+ , QtJniTypes::IfValidSignatureTypes<Ret, Args...> = true
+#endif
+ >
+ auto callMethod(const char *method, Args &&...args) const
+ {
+ return m_object.callMethod<Ret>(method, std::forward<Args>(args)...);
+ }
+ template <typename T
+#ifndef Q_QDOC
+ , QtJniTypes::IfValidFieldType<T> = true
+#endif
+ >
+ auto getField(const char *fieldName) const
+ {
+ return m_object.getField<T>(fieldName);
}
- template<typename T>
- static constexpr void setFieldForType(JNIEnv *env, jobject obj,
- jfieldID id, T value)
- {
- if constexpr(std::is_same<T, jboolean>::value)
- env->SetBooleanField(obj, id, value);
- else if constexpr(std::is_same<T, jbyte>::value)
- env->SetByteField(obj, id, value);
- else if constexpr(std::is_same<T, jchar>::value)
- env->SetCharField(obj, id, value);
- else if constexpr(std::is_same<T, jshort>::value)
- env->SetShortField(obj, id, value);
- else if constexpr(std::is_same<T, jint>::value)
- env->SetIntField(obj, id, value);
- else if constexpr(std::is_same<T, jlong>::value)
- env->SetLongField(obj, id, value);
- else if constexpr(std::is_same<T, jfloat>::value)
- env->SetFloatField(obj, id, value);
- else if constexpr(std::is_same<T, jdouble>::value)
- env->SetDoubleField(obj, id, value);
- else if constexpr(std::is_convertible<T, jobject>::value)
- env->SetObjectField(obj, id, value);
- else
- staticAssertTypeMismatch();
+ template <typename T
+#ifndef Q_QDOC
+ , QtJniTypes::IfValidFieldType<T> = true
+#endif
+ >
+ void setField(const char *fieldName, T &&value)
+ {
+ m_object.setField(fieldName, std::forward<T>(value));
}
- template<typename T>
- static constexpr void setStaticFieldForType(JNIEnv *env, jclass clazz,
- jfieldID id, T value)
- {
- if constexpr(std::is_same<T, jboolean>::value)
- env->SetStaticBooleanField(clazz, id, value);
- else if constexpr(std::is_same<T, jbyte>::value)
- env->SetStaticByteField(clazz, id, value);
- else if constexpr(std::is_same<T, jchar>::value)
- env->SetStaticCharField(clazz, id, value);
- else if constexpr(std::is_same<T, jshort>::value)
- env->SetStaticShortField(clazz, id, value);
- else if constexpr(std::is_same<T, jint>::value)
- env->SetStaticIntField(clazz, id, value);
- else if constexpr(std::is_same<T, jlong>::value)
- env->SetStaticLongField(clazz, id, value);
- else if constexpr(std::is_same<T, jfloat>::value)
- env->SetStaticFloatField(clazz, id, value);
- else if constexpr(std::is_same<T, jdouble>::value)
- env->SetStaticDoubleField(clazz, id, value);
- else if constexpr(std::is_convertible<T, jobject>::value)
- env->SetStaticObjectField(clazz, id, value);
- else
- staticAssertTypeMismatch();
+ QByteArray className() const {
+ return QtJniTypes::Traits<Class>::className().data();
}
- friend QJniObjectPrivate;
- QSharedPointer<QJniObjectPrivate> d;
+private:
+ friend bool comparesEqual(const JObject &lhs, const JObject &rhs) noexcept
+ { return lhs.m_object == rhs.m_object; }
+ Q_DECLARE_EQUALITY_COMPARABLE_LITERAL_TYPE(JObject);
};
+}
-inline bool operator==(const QJniObject &obj1, const QJniObject &obj2)
+// This cannot be included earlier as QJniArray is a QJniObject subclass, but it
+// must be included so that we can implement QJniObject::LocalFrame conversion.
+QT_END_NAMESPACE
+#include <QtCore/qjniarray.h>
+QT_BEGIN_NAMESPACE
+
+template <typename ...Args>
+template <typename T>
+auto QJniObject::LocalFrame<Args...>::convertToJni(T &&value)
{
- return obj1.isSameObject(obj2);
+ using Type = q20::remove_cvref_t<T>;
+ if constexpr (std::is_same_v<Type, QString>) {
+ return newLocalRef<jstring>(QJniObject::fromString(value));
+ } else if constexpr (QtJniTypes::IsJniArray<Type>::value) {
+ return value.arrayObject();
+ } else if constexpr (QJniArrayBase::canConvert<T>) {
+ using QJniArrayType = decltype(QJniArrayBase::fromContainer(std::forward<T>(value)));
+ using ArrayType = decltype(std::declval<QJniArrayType>().arrayObject());
+ return newLocalRef<ArrayType>(QJniArrayBase::fromContainer(std::forward<T>(value)).template object<jobject>());
+ } else if constexpr (std::is_base_of_v<QJniObject, Type>
+ || std::is_base_of_v<QtJniTypes::JObjectBase, Type>) {
+ return value.object();
+ } else {
+ return std::forward<T>(value);
+ }
}
-inline bool operator!=(const QJniObject &obj1, const QJniObject &obj2)
+template <typename ...Args>
+template <typename T>
+auto QJniObject::LocalFrame<Args...>::convertFromJni(QJniObject &&object)
{
- return !obj1.isSameObject(obj2);
+ using Type = q20::remove_cvref_t<T>;
+ if constexpr (std::is_same_v<Type, QString>) {
+ return object.toString();
+ } else if constexpr (QtJniTypes::IsJniArray<Type>::value) {
+ return T(std::move(object));
+ } else if constexpr (QJniArrayBase::canConvert<Type>) {
+ // if we were to create a QJniArray from Type...
+ using QJniArrayType = decltype(QJniArrayBase::fromContainer(std::declval<Type>()));
+ // then that QJniArray would have elements of type
+ using ElementType = typename QJniArrayType::Type;
+ // construct a QJniArray from a jobject pointer of that type
+ return QJniArray<ElementType>(object.template object<jarray>()).toContainer();
+ } else if constexpr (std::is_array_v<Type>) {
+ using ElementType = std::remove_extent_t<Type>;
+ return QJniArray<ElementType>(std::move(object));
+ } else if constexpr (std::is_base_of_v<QJniObject, Type>
+ && !std::is_same_v<QJniObject, Type>) {
+ return T{std::move(object)};
+ } else if constexpr (std::is_base_of_v<QtJniTypes::JObjectBase, Type>) {
+ return T{std::move(object)};
+ } else {
+ return std::move(object);
+ }
}
+
QT_END_NAMESPACE
#endif
diff --git a/src/corelib/kernel/qjnitypes.h b/src/corelib/kernel/qjnitypes.h
new file mode 100644
index 0000000000..1eaae6312b
--- /dev/null
+++ b/src/corelib/kernel/qjnitypes.h
@@ -0,0 +1,218 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QJNITYPES_H
+#define QJNITYPES_H
+
+#if defined(Q_QDOC) || defined(Q_OS_ANDROID)
+
+#include <QtCore/qjnitypes_impl.h>
+#include <QtCore/qjniobject.h>
+
+QT_BEGIN_NAMESPACE
+
+#define Q_DECLARE_JNI_TYPE_HELPER(Type) \
+namespace QtJniTypes { \
+struct Type : JObject<Type> \
+{ \
+ using JObject::JObject; \
+}; \
+} \
+
+
+#define Q_DECLARE_JNI_TYPE(Type, Signature) \
+Q_DECLARE_JNI_TYPE_HELPER(Type) \
+template<> \
+struct QtJniTypes::Traits<QtJniTypes::Type> { \
+ static constexpr auto signature() \
+ { \
+ static_assert((Signature[0] == 'L' \
+ || Signature[0] == '[') \
+ && Signature[sizeof(Signature) - 2] == ';', \
+ "Type signature needs to start with 'L' or" \
+ " '[' and end with ';'"); \
+ return QtJniTypes::CTString(Signature); \
+ } \
+}; \
+
+#define Q_DECLARE_JNI_CLASS(Type, Signature) \
+Q_DECLARE_JNI_TYPE_HELPER(Type) \
+template<> \
+struct QtJniTypes::Traits<QtJniTypes::Type> { \
+ static constexpr auto className() \
+ { \
+ return QtJniTypes::CTString(Signature); \
+ } \
+ static constexpr auto signature() \
+ { \
+ return QtJniTypes::CTString("L") \
+ + className() \
+ + QtJniTypes::CTString(";"); \
+ } \
+}; \
+
+// Macros for native methods
+
+namespace QtJniMethods {
+namespace Detail {
+// Various helpers to forward a call from a variadic argument function to
+// the real function with proper type conversion. This is needed because we
+// want to write functions that take QJniObjects (subclasses), while Java
+// can only call functions that take jobjects.
+
+// In Var-arg functions, any argument narrower than (unsigned) int or double
+// is promoted to (unsigned) int or double.
+template <typename Arg> struct PromotedType { using Type = Arg; };
+template <> struct PromotedType<bool> { using Type = int; };
+template <> struct PromotedType<char> { using Type = int; };
+template <> struct PromotedType<signed char> { using Type = int; };
+template <> struct PromotedType<unsigned char> { using Type = unsigned int; };
+template <> struct PromotedType<short> { using Type = int; };
+template <> struct PromotedType<unsigned short> { using Type = unsigned int; };
+template <> struct PromotedType<float> { using Type = double; };
+
+// Map any QJniObject type to jobject; that's what's on the va_list
+template <typename Arg>
+struct JNITypeForArgImpl
+{
+ using Type = std::conditional_t<std::disjunction_v<std::is_base_of<QJniObject, Arg>,
+ std::is_base_of<QtJniTypes::JObjectBase, Arg>>,
+ jobject, typename PromotedType<Arg>::Type>;
+ static Arg fromVarArg(Type t)
+ {
+ return static_cast<Arg>(t);
+ }
+};
+
+template <>
+struct JNITypeForArgImpl<QString>
+{
+ using Type = jstring;
+
+ static QString fromVarArg(Type t)
+ {
+ return QJniObject(t).toString();
+ }
+};
+
+template <typename T>
+struct JNITypeForArgImpl<QJniArray<T>>
+{
+ using Type = jobject;
+
+ static QJniArray<T> fromVarArg(Type t)
+ {
+ return QJniArray<T>(t);
+ }
+};
+
+template <typename T>
+struct JNITypeForArgImpl<QList<T>>
+{
+private:
+ using ArrayType = decltype(QJniArrayBase::fromContainer(std::declval<QList<T>>()));
+ using ArrayObjectType = decltype(std::declval<ArrayType>().arrayObject());
+ using ElementType = typename ArrayType::value_type;
+public:
+ using Type = ArrayObjectType;
+
+ static QList<T> fromVarArg(Type t)
+ {
+ return QJniArray<ElementType>(t).toContainer();
+ }
+};
+
+template <typename Arg>
+using JNITypeForArg = typename JNITypeForArgImpl<std::decay_t<Arg>>::Type;
+template <typename Arg, typename Type>
+static inline auto methodArgFromVarArg(Type t) // Type comes from a va_arg, so is always POD
+{
+ return JNITypeForArgImpl<std::decay_t<Arg>>::fromVarArg(t);
+}
+
+// Turn a va_list into a tuple of typed arguments
+template <typename ...Args>
+static constexpr auto makeTupleFromArgsHelper(va_list args)
+{
+ return std::tuple(methodArgFromVarArg<Args>(va_arg(args, JNITypeForArg<Args>))...);
+}
+
+template <typename Ret, typename ...Args>
+static constexpr auto makeTupleFromArgs(Ret (*)(JNIEnv *, jobject, Args...), va_list args)
+{
+ return makeTupleFromArgsHelper<Args...>(args);
+}
+template <typename Ret, typename ...Args>
+static constexpr auto makeTupleFromArgs(Ret (*)(JNIEnv *, jclass, Args...), va_list args)
+{
+ return makeTupleFromArgsHelper<Args...>(args);
+}
+
+// Get the return type of a function point
+template <typename Ret, typename ...Args>
+auto nativeFunctionReturnType(Ret(*function)(Args...))
+{
+ return function(std::declval<Args>()...);
+}
+
+} // namespace Detail
+} // namespace QtJniMethods
+
+// A va_ variadic arguments function that we register with JNI as a proxy
+// for the function we have. This function uses the helpers to unpack the
+// variadic arguments into a tuple of typed arguments, which we then call
+// the actual function with. This then takes care of implicit conversions,
+// e.g. a jobject becomes a QJniObject.
+#define Q_DECLARE_JNI_NATIVE_METHOD_HELPER(Method) \
+static decltype(QtJniMethods::Detail::nativeFunctionReturnType(Method)) \
+va_##Method(JNIEnv *env, jclass thiz, ...) \
+{ \
+ va_list args; \
+ va_start(args, thiz); \
+ auto va_cleanup = qScopeGuard([&args]{ va_end(args); }); \
+ auto argTuple = QtJniMethods::Detail::makeTupleFromArgs(Method, args); \
+ return std::apply([env, thiz](auto &&... args) { \
+ return Method(env, thiz, args...); \
+ }, argTuple); \
+} \
+
+
+#define Q_DECLARE_JNI_NATIVE_METHOD(...) \
+ QT_OVERLOADED_MACRO(QT_DECLARE_JNI_NATIVE_METHOD, __VA_ARGS__) \
+
+#define QT_DECLARE_JNI_NATIVE_METHOD_2(Method, Name) \
+namespace QtJniMethods { \
+Q_DECLARE_JNI_NATIVE_METHOD_HELPER(Method) \
+static constexpr auto Method##_signature = \
+ QtJniTypes::nativeMethodSignature(Method); \
+static const JNINativeMethod Method##_method = { \
+ #Name, Method##_signature.data(), \
+ reinterpret_cast<void *>(va_##Method) \
+}; \
+} \
+
+#define QT_DECLARE_JNI_NATIVE_METHOD_1(Method) \
+ QT_DECLARE_JNI_NATIVE_METHOD_2(Method, Method) \
+
+#define Q_JNI_NATIVE_METHOD(Method) QtJniMethods::Method##_method
+
+#define Q_DECLARE_JNI_NATIVE_METHOD_IN_CURRENT_SCOPE(...) \
+ QT_OVERLOADED_MACRO(QT_DECLARE_JNI_NATIVE_METHOD_IN_CURRENT_SCOPE, __VA_ARGS__) \
+
+#define QT_DECLARE_JNI_NATIVE_METHOD_IN_CURRENT_SCOPE_2(Method, Name) \
+ Q_DECLARE_JNI_NATIVE_METHOD_HELPER(Method) \
+ static inline constexpr auto Method##_signature = QtJniTypes::nativeMethodSignature(Method); \
+ static inline const JNINativeMethod Method##_method = { \
+ #Name, Method##_signature.data(), reinterpret_cast<void *>(va_##Method) \
+ };
+
+#define QT_DECLARE_JNI_NATIVE_METHOD_IN_CURRENT_SCOPE_1(Method) \
+ QT_DECLARE_JNI_NATIVE_METHOD_IN_CURRENT_SCOPE_2(Method, Method) \
+
+#define Q_JNI_NATIVE_SCOPED_METHOD(Method, Scope) Scope::Method##_method
+
+QT_END_NAMESPACE
+
+#endif // defined(Q_QDOC) || defined(Q_OS_ANDROID)
+
+#endif // QJNITYPES_H
diff --git a/src/corelib/kernel/qjnitypes_impl.h b/src/corelib/kernel/qjnitypes_impl.h
new file mode 100644
index 0000000000..d963509023
--- /dev/null
+++ b/src/corelib/kernel/qjnitypes_impl.h
@@ -0,0 +1,373 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QJNITYPES_IMPL_H
+#define QJNITYPES_IMPL_H
+
+#include <QtCore/qglobal.h>
+#include <QtCore/q20type_traits.h>
+
+#if defined(Q_QDOC) || defined(Q_OS_ANDROID)
+#include <jni.h>
+
+QT_BEGIN_NAMESPACE
+
+namespace QtJniTypes
+{
+
+// a constexpr type for string literals of any character width, aware of the length
+// of the string.
+template<size_t N_WITH_NULL, typename BaseType = char>
+struct CTString
+{
+ BaseType m_data[N_WITH_NULL] = {};
+
+ constexpr CTString() noexcept {}
+ // Can be instantiated (only) with a string literal
+ constexpr explicit CTString(const BaseType (&data)[N_WITH_NULL]) noexcept
+ {
+ for (size_t i = 0; i < N_WITH_NULL - 1; ++i)
+ m_data[i] = data[i];
+ }
+
+ constexpr BaseType at(size_t i) const { return m_data[i]; }
+ constexpr BaseType operator[](size_t i) const { return at(i); }
+ static constexpr size_t size() noexcept { return N_WITH_NULL; }
+ constexpr operator const BaseType *() const noexcept { return m_data; }
+ constexpr const BaseType *data() const noexcept { return m_data; }
+ template<size_t N2_WITH_NULL>
+ constexpr bool startsWith(const BaseType (&lit)[N2_WITH_NULL]) const noexcept
+ {
+ if constexpr (N2_WITH_NULL > N_WITH_NULL) {
+ return false;
+ } else {
+ for (size_t i = 0; i < N2_WITH_NULL - 1; ++i) {
+ if (m_data[i] != lit[i])
+ return false;
+ }
+ }
+ return true;
+ }
+ constexpr bool startsWith(BaseType c) const noexcept
+ {
+ return N_WITH_NULL > 1 && m_data[0] == c;
+ }
+ template<size_t N2_WITH_NULL>
+ constexpr bool endsWith(const BaseType (&lit)[N2_WITH_NULL]) const noexcept
+ {
+ if constexpr (N2_WITH_NULL > N_WITH_NULL) {
+ return false;
+ } else {
+ for (size_t i = 0; i < N2_WITH_NULL; ++i) {
+ if (m_data[N_WITH_NULL - i - 1] != lit[N2_WITH_NULL - i - 1])
+ return false;
+ }
+ }
+ return true;
+ }
+ constexpr bool endsWith(BaseType c) const noexcept
+ {
+ return N_WITH_NULL > 1 && m_data[N_WITH_NULL - 2] == c;
+ }
+
+ template<size_t N2_WITH_NULL>
+ friend inline constexpr bool operator==(const CTString<N_WITH_NULL> &lhs,
+ const CTString<N2_WITH_NULL> &rhs) noexcept
+ {
+ if constexpr (N_WITH_NULL != N2_WITH_NULL) {
+ return false;
+ } else {
+ for (size_t i = 0; i < N_WITH_NULL - 1; ++i) {
+ if (lhs.at(i) != rhs.at(i))
+ return false;
+ }
+ }
+ return true;
+ }
+
+ template<size_t N2_WITH_NULL>
+ friend inline constexpr bool operator!=(const CTString<N_WITH_NULL> &lhs,
+ const CTString<N2_WITH_NULL> &rhs) noexcept
+ {
+ return !operator==(lhs, rhs);
+ }
+
+ template<size_t N2_WITH_NULL>
+ friend inline constexpr bool operator==(const CTString<N_WITH_NULL> &lhs,
+ const BaseType (&rhs)[N2_WITH_NULL]) noexcept
+ {
+ return operator==(lhs, CTString<N2_WITH_NULL>(rhs));
+ }
+ template<size_t N2_WITH_NULL>
+ friend inline constexpr bool operator==(const BaseType (&lhs)[N2_WITH_NULL],
+ const CTString<N_WITH_NULL> &rhs) noexcept
+ {
+ return operator==(CTString<N2_WITH_NULL>(lhs), rhs);
+ }
+
+ template<size_t N2_WITH_NULL>
+ friend inline constexpr bool operator!=(const CTString<N_WITH_NULL> &lhs,
+ const BaseType (&rhs)[N2_WITH_NULL]) noexcept
+ {
+ return operator!=(lhs, CTString<N2_WITH_NULL>(rhs));
+ }
+ template<size_t N2_WITH_NULL>
+ friend inline constexpr bool operator!=(const BaseType (&lhs)[N2_WITH_NULL],
+ const CTString<N_WITH_NULL> &rhs) noexcept
+ {
+ return operator!=(CTString<N2_WITH_NULL>(lhs), rhs);
+ }
+
+ template<size_t N2_WITH_NULL>
+ friend inline constexpr auto operator+(const CTString<N_WITH_NULL> &lhs,
+ const CTString<N2_WITH_NULL> &rhs) noexcept
+ {
+ char data[N_WITH_NULL + N2_WITH_NULL - 1] = {};
+ for (size_t i = 0; i < N_WITH_NULL - 1; ++i)
+ data[i] = lhs[i];
+ for (size_t i = 0; i < N2_WITH_NULL - 1; ++i)
+ data[N_WITH_NULL - 1 + i] = rhs[i];
+ return CTString<N_WITH_NULL + N2_WITH_NULL - 1>(data);
+ }
+};
+
+// Helper types that allow us to disable variadic overloads that would conflict
+// with overloads that take a const char*.
+template<typename T, size_t N = 0> struct IsStringType : std::false_type {};
+template<> struct IsStringType<const char *, 0> : std::true_type {};
+template<> struct IsStringType<const char *&, 0> : std::true_type {};
+template<size_t N> struct IsStringType<CTString<N>> : std::true_type {};
+template<size_t N> struct IsStringType<const char[N]> : std::true_type {};
+template<size_t N> struct IsStringType<const char(&)[N]> : std::true_type {};
+template<size_t N> struct IsStringType<char[N]> : std::true_type {};
+
+template <typename T>
+struct Traits {
+ // The return type of className/signature becomes void for any type
+ // not handled here. This indicates that the Traits type is not specialized
+ // for the respective type, which we use to detect invalid types in the
+ // IfValidSignatureTypes and IfValidFieldType predicates below.
+
+ static constexpr auto className()
+ {
+ if constexpr (std::is_same_v<T, jstring>)
+ return CTString("java/lang/String");
+ else if constexpr (std::is_same_v<T, jobject>)
+ return CTString("java/lang/Object");
+ else if constexpr (std::is_same_v<T, jclass>)
+ return CTString("java/lang/Class");
+ else if constexpr (std::is_same_v<T, jthrowable>)
+ return CTString("java/lang/Throwable");
+ // else: return void -> not implemented
+ }
+
+ static constexpr auto signature()
+ {
+ if constexpr (!std::is_same_v<decltype(className()), void>) {
+ // the type signature of any object class is L<className>;
+ return CTString("L") + className() + CTString(";");
+ } else if constexpr (std::is_array_v<T>) {
+ using UnderlyingType = typename std::remove_extent_t<T>;
+ static_assert(!std::is_array_v<UnderlyingType>,
+ "Traits::signature() does not handle multi-dimensional arrays");
+ return CTString("[") + Traits<UnderlyingType>::signature();
+ } else if constexpr (std::is_same_v<T, jobjectArray>) {
+ return CTString("[Ljava/lang/Object;");
+ } else if constexpr (std::is_same_v<T, jbooleanArray>) {
+ return CTString("[Z");
+ } else if constexpr (std::is_same_v<T, jbyteArray>) {
+ return CTString("[B");
+ } else if constexpr (std::is_same_v<T, jshortArray>) {
+ return CTString("[S");
+ } else if constexpr (std::is_same_v<T, jintArray>) {
+ return CTString("[I");
+ } else if constexpr (std::is_same_v<T, jlongArray>) {
+ return CTString("[J");
+ } else if constexpr (std::is_same_v<T, jfloatArray>) {
+ return CTString("[F");
+ } else if constexpr (std::is_same_v<T, jdoubleArray>) {
+ return CTString("[D");
+ } else if constexpr (std::is_same_v<T, jcharArray>) {
+ return CTString("[C");
+ } else if constexpr (std::is_same_v<T, jboolean>) {
+ return CTString("Z");
+ } else if constexpr (std::is_same_v<T, bool>) {
+ return CTString("Z");
+ } else if constexpr (std::is_same_v<T, jbyte>) {
+ return CTString("B");
+ } else if constexpr (std::is_same_v<T, jchar>) {
+ return CTString("C");
+ } else if constexpr (std::is_same_v<T, char>) {
+ return CTString("C");
+ } else if constexpr (std::is_same_v<T, jshort>) {
+ return CTString("S");
+ } else if constexpr (std::is_same_v<T, short>) {
+ return CTString("S");
+ } else if constexpr (std::is_same_v<T, jint>) {
+ return CTString("I");
+ } else if constexpr (std::is_same_v<T, int>) {
+ return CTString("I");
+ } else if constexpr (std::is_same_v<T, uint>) {
+ return CTString("I");
+ } else if constexpr (std::is_same_v<T, jlong>) {
+ return CTString("J");
+ } else if constexpr (std::is_same_v<T, quint64>) {
+ return CTString("J");
+ } else if constexpr (std::is_same_v<T, jfloat>) {
+ return CTString("F");
+ } else if constexpr (std::is_same_v<T, float>) {
+ return CTString("F");
+ } else if constexpr (std::is_same_v<T, jdouble>) {
+ return CTString("D");
+ } else if constexpr (std::is_same_v<T, double>) {
+ return CTString("D");
+ } else if constexpr (std::is_same_v<T, void>) {
+ return CTString("V");
+ } else if constexpr (std::is_enum_v<T>) {
+ return Traits<std::underlying_type_t<T>>::signature();
+ } else if constexpr (std::is_same_v<T, QString>) {
+ return CTString("Ljava/lang/String;");
+ }
+ // else: return void -> not implemented
+ }
+};
+
+template <typename Have, typename Want>
+static constexpr bool sameTypeForJni = (QtJniTypes::Traits<Have>::signature()
+ == QtJniTypes::Traits<Want>::signature())
+ && (sizeof(Have) == sizeof(Want));
+
+template <typename, typename = void>
+struct Caller
+{};
+
+#define MAKE_CALLER(Type, Method) \
+template <typename T> \
+struct Caller<T, std::enable_if_t<sameTypeForJni<T, Type>>> \
+{ \
+ static constexpr void callMethodForType(JNIEnv *env, T &res, jobject obj, jmethodID id, va_list args) \
+ { \
+ res = T(env->Call##Method##MethodV(obj, id, args)); \
+ } \
+ static constexpr void callStaticMethodForType(JNIEnv *env, T &res, jclass clazz, jmethodID id, va_list args) \
+ { \
+ res = T(env->CallStatic##Method##MethodV(clazz, id, args)); \
+ } \
+ static constexpr void getFieldForType(JNIEnv *env, T &res, jobject obj, jfieldID id) \
+ { \
+ res = T(env->Get##Method##Field(obj, id)); \
+ } \
+ static constexpr void getStaticFieldForType(JNIEnv *env, T &res, jclass clazz, jfieldID id) \
+ { \
+ res = T(env->GetStatic##Method##Field(clazz, id)); \
+ } \
+ static constexpr void setFieldForType(JNIEnv *env, jobject obj, jfieldID id, T value) \
+ { \
+ env->Set##Method##Field(obj, id, static_cast<Type>(value)); \
+ } \
+ static constexpr void setStaticFieldForType(JNIEnv *env, jclass clazz, jfieldID id, T value) \
+ { \
+ env->SetStatic##Method##Field(clazz, id, static_cast<Type>(value)); \
+ } \
+}
+
+MAKE_CALLER(jboolean, Boolean);
+MAKE_CALLER(jbyte, Byte);
+MAKE_CALLER(jchar, Char);
+MAKE_CALLER(jshort, Short);
+MAKE_CALLER(jint, Int);
+MAKE_CALLER(jlong, Long);
+MAKE_CALLER(jfloat, Float);
+MAKE_CALLER(jdouble, Double);
+
+#undef MAKE_CALLER
+
+template<typename T>
+static constexpr bool isPrimitiveType()
+{
+ return Traits<T>::signature().size() == 2;
+}
+
+template<typename T>
+static constexpr bool isArrayType()
+{
+ constexpr auto signature = Traits<T>::signature();
+ return signature.startsWith('[') && signature.size() > 2;
+}
+
+template<typename T>
+static constexpr bool isObjectType()
+{
+ if constexpr (std::is_convertible_v<T, jobject>) {
+ return true;
+ } else {
+ constexpr auto signature = Traits<T>::signature();
+ return (signature.startsWith('L') && signature.endsWith(';')) || isArrayType<T>();
+ }
+}
+
+template<typename T>
+static constexpr void assertObjectType()
+{
+ static_assert(isObjectType<T>(),
+ "Type needs to be a JNI object type (convertible to jobject, or with "
+ "an object type signature registered)!");
+}
+
+// A set of types is valid if Traits::signature is implemented for all of them
+template<typename ...Types>
+constexpr bool ValidSignatureTypesDetail = !std::disjunction<std::is_same<
+ decltype(Traits<Types>::signature()),
+ void>...,
+ IsStringType<Types>...>::value;
+template<typename ...Types>
+using IfValidSignatureTypes = std::enable_if_t<
+ ValidSignatureTypesDetail<q20::remove_cvref_t<Types>...>, bool>;
+
+template<typename Type>
+constexpr bool ValidFieldTypeDetail = isObjectType<Type>() || isPrimitiveType<Type>();
+template<typename Type>
+using IfValidFieldType = std::enable_if_t<
+ ValidFieldTypeDetail<q20::remove_cvref_t<Type>>, bool>;
+
+
+template<typename R, typename ...Args, IfValidSignatureTypes<R, Args...> = true>
+static constexpr auto methodSignature()
+{
+ return (CTString("(") +
+ ... + Traits<q20::remove_cvref_t<Args>>::signature())
+ + CTString(")")
+ + Traits<R>::signature();
+}
+
+template<typename T, IfValidSignatureTypes<T> = true>
+static constexpr auto fieldSignature()
+{
+ return QtJniTypes::Traits<T>::signature();
+}
+
+template<typename ...Args, IfValidSignatureTypes<Args...> = true>
+static constexpr auto constructorSignature()
+{
+ return methodSignature<void, Args...>();
+}
+
+template<typename Ret, typename ...Args, IfValidSignatureTypes<Ret, Args...> = true>
+static constexpr auto nativeMethodSignature(Ret (*)(JNIEnv *, jobject, Args...))
+{
+ return methodSignature<Ret, Args...>();
+}
+
+template<typename Ret, typename ...Args, IfValidSignatureTypes<Ret, Args...> = true>
+static constexpr auto nativeMethodSignature(Ret (*)(JNIEnv *, jclass, Args...))
+{
+ return methodSignature<Ret, Args...>();
+}
+
+} // namespace QtJniTypes
+
+QT_END_NAMESPACE
+
+#endif
+
+#endif // QJNITYPES_IMPL_H
diff --git a/src/corelib/kernel/qmath.cpp b/src/corelib/kernel/qmath.cpp
index 2778dc242d..8742a4bee5 100644
--- a/src/corelib/kernel/qmath.cpp
+++ b/src/corelib/kernel/qmath.cpp
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2013 Laszlo Papp <lpapp@kde.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2013 Laszlo Papp <lpapp@kde.org>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include <QtCore/qmath.h>
diff --git a/src/corelib/kernel/qmath.h b/src/corelib/kernel/qmath.h
index 5e8d4fc276..72057ee16d 100644
--- a/src/corelib/kernel/qmath.h
+++ b/src/corelib/kernel/qmath.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QMATH_H
#define QMATH_H
@@ -149,7 +113,7 @@ class QHypotHelper
public:
QHypotHelper(T first) : scale(qAbs(first)), total(1) {}
T result() const
- { return qIsFinite(scale) ? scale > 0 ? scale * T(std::sqrt(total)) : T(0) : scale; }
+ { return qIsFinite(scale) ? scale > 0 ? scale * T(qSqrt(total)) : T(0) : scale; }
template<typename F, typename ...Fs>
auto add(F first, Fs... rest) const
@@ -169,7 +133,7 @@ public:
return QHypotHelper<R>(scale, total);
if (val > scale) {
const R ratio = scale / next;
- return QHypotHelper<R>(val, total * ratio * ratio + 1);
+ return QHypotHelper<R>(val, total * ratio * ratio + R(1));
}
const R ratio = next / scale;
return QHypotHelper<R>(scale, total + ratio * ratio);
@@ -370,6 +334,7 @@ constexpr inline quint64 qConstexprNextPowerOfTwo(qint64 v)
constexpr inline quint32 qNextPowerOfTwo(quint32 v)
{
+ Q_ASSERT(static_cast<qint32>(v) >= 0); // There is a next power of two
#if defined(__cpp_lib_int_pow2) && __cpp_lib_int_pow2 >= 202002L
return std::bit_ceil(v + 1);
#elif defined(QT_HAS_BUILTIN_CLZ)
@@ -383,6 +348,7 @@ constexpr inline quint32 qNextPowerOfTwo(quint32 v)
constexpr inline quint64 qNextPowerOfTwo(quint64 v)
{
+ Q_ASSERT(static_cast<qint64>(v) >= 0); // There is a next power of two
#if defined(__cpp_lib_int_pow2) && __cpp_lib_int_pow2 >= 202002L
return std::bit_ceil(v + 1);
#elif defined(QT_HAS_BUILTIN_CLZLL)
@@ -404,6 +370,16 @@ constexpr inline quint64 qNextPowerOfTwo(qint64 v)
return qNextPowerOfTwo(quint64(v));
}
+constexpr inline unsigned long qNextPowerOfTwo(unsigned long v)
+{
+ return qNextPowerOfTwo(QIntegerForSizeof<long>::Unsigned(v));
+}
+
+constexpr inline unsigned long qNextPowerOfTwo(long v)
+{
+ return qNextPowerOfTwo(QIntegerForSizeof<long>::Unsigned(v));
+}
+
QT_END_NAMESPACE
#endif // QMATH_H
diff --git a/src/corelib/kernel/qmath.qdoc b/src/corelib/kernel/qmath.qdoc
index f8d1f2c0f7..bc365f26fa 100644
--- a/src/corelib/kernel/qmath.qdoc
+++ b/src/corelib/kernel/qmath.qdoc
@@ -1,32 +1,9 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
\headerfile <QtMath>
+ \inmodule QtCore
\title Generic Math Functions
\ingroup funclists
@@ -155,7 +132,7 @@
\since 6.1
\overload
\fn template <typename Tx, typename Ty> auto qHypot(Tx x, Ty y)
- Returns the distance of a point (x, y) from the origin (0, 0).
+ Returns the distance of a point (\a x, \a y) from the origin (0, 0).
This is qSqrt(x * x + y * y), optimized.
In particular, underflow and overflow may be avoided.
@@ -193,7 +170,7 @@
This is as for the two-argument and three-argument forms, supported by
std::hypot(), but with as many numeric parameters as you care to pass to
- it. Uses \a first and each of the \a rest as co-ordinates, performing a
+ it. Uses \a first and each of the \a rest as coordinates, performing a
calculation equivalent to squaring each, summing and returning the square
root, save that underflow and overflow are avoided as far as possible.
@@ -321,7 +298,7 @@
\relates <QtMath>
\since 5.4
- This function returns the nearest power of two greater than \a value. For 0 it returns 1, and for values larger than or equal to 2^31 it returns 0.
+ This function returns the nearest power of two greater than \a value. For 0 it returns 1, and for values larger than or equal to 2^31 the result is undefined.
*/
/*!
@@ -330,7 +307,7 @@
\since 5.4
\overload
- This function returns the nearest power of two greater than \a value. For negative values it returns 0.
+ This function returns the nearest power of two greater than \a value. For negative values the result is undefined.
*/
/*!
@@ -338,7 +315,7 @@
\relates <QtMath>
\since 5.4
- This function returns the nearest power of two greater than \a value. For 0 it returns 1, and for values larger than or equal to 2^63 it returns 0.
+ This function returns the nearest power of two greater than \a value. For 0 it returns 1, and for values larger than or equal to 2^63 the result is undefined.
*/
/*!
@@ -347,5 +324,5 @@
\since 5.4
\overload
- This function returns the nearest power of two greater than \a value. For negative values it returns 0.
+ This function returns the nearest power of two greater than \a value. For negative values the result is undefined.
*/
diff --git a/src/corelib/kernel/qmetacontainer.cpp b/src/corelib/kernel/qmetacontainer.cpp
index 6c83ee40b6..5f68f8fe74 100644
--- a/src/corelib/kernel/qmetacontainer.cpp
+++ b/src/corelib/kernel/qmetacontainer.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qmetacontainer.h"
#include "qmetatype.h"
@@ -50,6 +14,8 @@ QT_BEGIN_NAMESPACE
\ingroup objectmodel
+ \compares equality
+
The class provides a number of primitive container operations, using void*
as operands. This way, you can manipulate a generic container retrieved from
a Variant without knowing its type.
@@ -826,21 +792,19 @@ void QMetaSequence::valueAtConstIterator(const void *iterator, void *result) con
}
/*!
- \fn bool operator==(QMetaSequence a, QMetaSequence b)
+ \fn bool QMetaSequence::operator==(const QMetaSequence &lhs, const QMetaSequence &rhs)
\since 6.0
- \relates QMetaSequence
- Returns \c true if the QMetaSequence \a a represents the same container type
- as the QMetaSequence \a b, otherwise returns \c false.
+ Returns \c true if the QMetaSequence \a lhs represents the same container type
+ as the QMetaSequence \a rhs, otherwise returns \c false.
*/
/*!
- \fn bool operator!=(QMetaSequence a, QMetaSequence b)
+ \fn bool QMetaSequence::operator!=(const QMetaSequence &lhs, const QMetaSequence &rhs)
\since 6.0
- \relates QMetaSequence
- Returns \c true if the QMetaSequence \a a represents a different container
- type than the QMetaSequence \a b, otherwise returns \c false.
+ Returns \c true if the QMetaSequence \a lhs represents a different container
+ type than the QMetaSequence \a rhs, otherwise returns \c false.
*/
diff --git a/src/corelib/kernel/qmetacontainer.h b/src/corelib/kernel/qmetacontainer.h
index 3594a0136a..1bed7f9f7b 100644
--- a/src/corelib/kernel/qmetacontainer.h
+++ b/src/corelib/kernel/qmetacontainer.h
@@ -1,49 +1,16 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QMETACONTAINER_H
#define QMETACONTAINER_H
#include <QtCore/qcontainerinfo.h>
+#include <QtCore/qcompare.h>
#include <QtCore/qflags.h>
#include <QtCore/qglobal.h>
+#include <iterator>
+
QT_BEGIN_NAMESPACE
class QMetaType;
@@ -1009,16 +976,15 @@ public:
bool canGetValueAtConstIterator() const;
void valueAtConstIterator(const void *iterator, void *result) const;
- friend bool operator==(const QMetaSequence &a, const QMetaSequence &b)
- {
- return a.d() == b.d();
- }
- friend bool operator!=(const QMetaSequence &a, const QMetaSequence &b)
+ const QtMetaContainerPrivate::QMetaSequenceInterface *iface() const { return d(); }
+
+private:
+ friend bool comparesEqual(const QMetaSequence &lhs, const QMetaSequence &rhs) noexcept
{
- return a.d() != b.d();
+ return lhs.d() == rhs.d();
}
+ Q_DECLARE_EQUALITY_COMPARABLE(QMetaSequence)
-private:
template<typename T>
struct MetaSequence
{
@@ -1203,16 +1169,15 @@ public:
return nullptr;
}
- friend bool operator==(const QMetaAssociation &a, const QMetaAssociation &b)
- {
- return a.d() == b.d();
- }
- friend bool operator!=(const QMetaAssociation &a, const QMetaAssociation &b)
+ const QtMetaContainerPrivate::QMetaAssociationInterface *iface() const { return d(); }
+
+private:
+ friend bool comparesEqual(const QMetaAssociation &lhs, const QMetaAssociation &rhs) noexcept
{
- return a.d() != b.d();
+ return lhs.d() == rhs.d();
}
+ Q_DECLARE_EQUALITY_COMPARABLE(QMetaAssociation)
-private:
template<typename T>
struct MetaAssociation
{
diff --git a/src/corelib/kernel/qmetaobject.cpp b/src/corelib/kernel/qmetaobject.cpp
index 19c437a4ec..148983f126 100644
--- a/src/corelib/kernel/qmetaobject.cpp
+++ b/src/corelib/kernel/qmetaobject.cpp
@@ -1,70 +1,35 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Copyright (C) 2015 Olivier Goffart <ogoffart@woboq.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// Copyright (C) 2015 Olivier Goffart <ogoffart@woboq.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qmetaobject.h"
+#include "qmetaobject_p.h"
#include "qmetatype.h"
+#include "qmetatype_p.h"
#include "qobject.h"
-#include "qmetaobject_p.h"
+#include "qobject_p.h"
#include <qcoreapplication.h>
-#include <qcoreevent.h>
-#include <qdatastream.h>
-#include <qstringlist.h>
-#include <qthread.h>
#include <qvariant.h>
-#include <qdebug.h>
+
+// qthread(_p).h uses QT_CONFIG(thread) internally and has a dummy
+// interface for the non-thread support case
+#include <qthread.h>
+#include "private/qthread_p.h"
#if QT_CONFIG(thread)
#include <qsemaphore.h>
#endif
-#include "private/qobject_p.h"
-#include "private/qmetaobject_p.h"
-#include "private/qthread_p.h"
-
// for normalizeTypeInternal
#include "private/qmetaobject_moc_p.h"
#include <ctype.h>
+#include <memory>
QT_BEGIN_NAMESPACE
+using namespace Qt::StringLiterals;
+
/*!
\class QMetaObject
\inmodule QtCore
@@ -129,12 +94,17 @@ QT_BEGIN_NAMESPACE
\internal
- \value InvokeSlot
- \value EmitSignal
+ \value InvokeMetaMethod
\value ReadProperty
\value WriteProperty
\value ResetProperty
\value CreateInstance
+ \value IndexOfMethod
+ \value RegisterPropertyMetaType
+ \value RegisterMethodArgumentMetaType
+ \value BindableProperty
+ \value CustomCall
+ \value ConstructInPlace
*/
/*!
@@ -157,13 +127,13 @@ static inline const char *rawStringData(const QMetaObject *mo, int index)
return reinterpret_cast<const char *>(mo->d.stringdata) + offset;
}
-static inline QLatin1String stringDataView(const QMetaObject *mo, int index)
+static inline QByteArrayView stringDataView(const QMetaObject *mo, int index)
{
Q_ASSERT(priv(mo->d.data)->revision >= 7);
uint offset = mo->d.stringdata[2*index];
uint length = mo->d.stringdata[2*index + 1];
const char *string = reinterpret_cast<const char *>(mo->d.stringdata) + offset;
- return QLatin1String(string, length);
+ return {string, qsizetype(length)};
}
static inline QByteArray stringData(const QMetaObject *mo, int index)
@@ -172,22 +142,12 @@ static inline QByteArray stringData(const QMetaObject *mo, int index)
return QByteArray::fromRawData(view.data(), view.size());
}
-static inline const char *rawTypeNameFromTypeInfo(const QMetaObject *mo, uint typeInfo)
+static inline QByteArrayView typeNameFromTypeInfo(const QMetaObject *mo, uint typeInfo)
{
- if (typeInfo & IsUnresolvedType) {
- return rawStringData(mo, typeInfo & TypeNameIndexMask);
- } else {
- return QMetaType(typeInfo).name();
- }
-}
-
-static inline QByteArray typeNameFromTypeInfo(const QMetaObject *mo, uint typeInfo)
-{
- if (typeInfo & IsUnresolvedType) {
- return stringData(mo, typeInfo & TypeNameIndexMask);
- } else {
- return QMetaType(typeInfo).name();
- }
+ if (typeInfo & IsUnresolvedType)
+ return stringDataView(mo, typeInfo & TypeNameIndexMask);
+ else
+ return QByteArrayView(QMetaType(typeInfo).name());
}
static inline int typeFromTypeInfo(const QMetaObject *mo, uint typeInfo)
@@ -197,7 +157,21 @@ static inline int typeFromTypeInfo(const QMetaObject *mo, uint typeInfo)
return QMetaType::fromName(rawStringData(mo, typeInfo & TypeNameIndexMask)).id();
}
-class QMetaMethodPrivate : public QMetaMethod
+static auto parse_scope(QByteArrayView qualifiedKey) noexcept
+{
+ struct R {
+ std::optional<QByteArrayView> scope;
+ QByteArrayView key;
+ };
+ const auto scopePos = qualifiedKey.lastIndexOf("::"_L1);
+ if (scopePos < 0)
+ return R{std::nullopt, qualifiedKey};
+ else
+ return R{qualifiedKey.first(scopePos), qualifiedKey.sliced(scopePos + 2)};
+}
+
+namespace {
+class QMetaMethodPrivate : public QMetaMethodInvoker
{
public:
static const QMetaMethodPrivate *get(const QMetaMethod *q)
@@ -213,18 +187,27 @@ public:
inline uint parameterTypeInfo(int index) const;
inline int parameterType(int index) const;
inline void getParameterTypes(int *types) const;
+ inline const QtPrivate::QMetaTypeInterface *returnMetaTypeInterface() const;
+ inline const QtPrivate::QMetaTypeInterface *const *parameterMetaTypeInterfaces() const;
inline QByteArray parameterTypeName(int index) const;
inline QList<QByteArray> parameterTypes() const;
inline QList<QByteArray> parameterNames() const;
inline QByteArray tag() const;
inline int ownMethodIndex() const;
+ inline int ownConstructorMethodIndex() const;
private:
+ void checkMethodMetaTypeConsistency(const QtPrivate::QMetaTypeInterface *iface, int index) const;
QMetaMethodPrivate();
};
+} // unnamed namespace
+enum { MaximumParamCount = 11 }; // up to 10 arguments + 1 return value
+
+#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0)
/*!
\since 4.5
+ \obsolete [6.5] Please use the variadic overload of this function
Constructs a new instance of this class. You can pass up to ten arguments
(\a val0, \a val1, \a val2, \a val3, \a val4, \a val5, \a val6, \a val7,
@@ -247,54 +230,84 @@ QObject *QMetaObject::newInstance(QGenericArgument val0,
QGenericArgument val8,
QGenericArgument val9) const
{
- if (!inherits(&QObject::staticMetaObject))
- {
- qWarning("QMetaObject::newInstance: type %s does not inherit QObject", className());
- return nullptr;
- }
-
- QByteArray constructorName = className();
- {
- int idx = constructorName.lastIndexOf(':');
- if (idx != -1)
- constructorName.remove(0, idx+1); // remove qualified part
- }
- QVarLengthArray<char, 512> sig;
- sig.append(constructorName.constData(), constructorName.length());
- sig.append('(');
-
- enum { MaximumParamCount = 10 };
- const char *typeNames[] = {val0.name(), val1.name(), val2.name(), val3.name(), val4.name(),
- val5.name(), val6.name(), val7.name(), val8.name(), val9.name()};
+ const char *typeNames[] = {
+ nullptr,
+ val0.name(), val1.name(), val2.name(), val3.name(), val4.name(),
+ val5.name(), val6.name(), val7.name(), val8.name(), val9.name()
+ };
+ const void *parameters[] = {
+ nullptr,
+ val0.data(), val1.data(), val2.data(), val3.data(), val4.data(),
+ val5.data(), val6.data(), val7.data(), val8.data(), val9.data()
+ };
int paramCount;
- for (paramCount = 0; paramCount < MaximumParamCount; ++paramCount) {
+ for (paramCount = 1; paramCount < MaximumParamCount; ++paramCount) {
int len = int(qstrlen(typeNames[paramCount]));
if (len <= 0)
break;
- sig.append(typeNames[paramCount], len);
- sig.append(',');
}
- if (paramCount == 0)
- sig.append(')'); // no parameters
- else
- sig[sig.size() - 1] = ')';
- sig.append('\0');
- int idx = indexOfConstructor(sig.constData());
- if (idx < 0) {
- QByteArray norm = QMetaObject::normalizedSignature(sig.constData());
- idx = indexOfConstructor(norm.constData());
- }
- if (idx < 0)
+ return newInstanceImpl(this, paramCount, parameters, typeNames, nullptr);
+}
+#endif
+
+/*!
+ \fn template <typename... Args> QObject *QMetaObject::newInstance(Args &&... arguments) const
+ \since 6.5
+
+ Constructs a new instance of this class and returns the new object, or
+ \nullptr if no suitable constructor is available. The types of the
+ arguments \a arguments will be used to find a matching constructor, and then
+ forwarded to it the same way signal-slot connections do.
+
+ Note that only constructors that are declared with the Q_INVOKABLE
+ modifier are made available through the meta-object system.
+
+ \sa constructor()
+*/
+
+QObject *QMetaObject::newInstanceImpl(const QMetaObject *mobj, qsizetype paramCount,
+ const void **parameters, const char **typeNames,
+ const QtPrivate::QMetaTypeInterface **metaTypes)
+{
+ if (!mobj->inherits(&QObject::staticMetaObject)) {
+ qWarning("QMetaObject::newInstance: type %s does not inherit QObject", mobj->className());
return nullptr;
+ }
+QT_WARNING_PUSH
+#if Q_CC_GNU >= 1200
+QT_WARNING_DISABLE_GCC("-Wdangling-pointer")
+#endif
+
+ // set the return type
QObject *returnValue = nullptr;
- void *param[] = {&returnValue, val0.data(), val1.data(), val2.data(), val3.data(), val4.data(),
- val5.data(), val6.data(), val7.data(), val8.data(), val9.data()};
+ QMetaType returnValueMetaType = QMetaType::fromType<decltype(returnValue)>();
+ parameters[0] = &returnValue;
+ typeNames[0] = returnValueMetaType.name();
+ if (metaTypes)
+ metaTypes[0] = returnValueMetaType.iface();
+
+QT_WARNING_POP
+
+ // find the constructor
+ auto priv = QMetaObjectPrivate::get(mobj);
+ for (int i = 0; i < priv->constructorCount; ++i) {
+ QMetaMethod m = QMetaMethod::fromRelativeConstructorIndex(mobj, i);
+ if (m.parameterCount() != (paramCount - 1))
+ continue;
+
+ // attempt to call
+ QMetaMethodPrivate::InvokeFailReason r =
+ QMetaMethodPrivate::invokeImpl(m, nullptr, Qt::DirectConnection, paramCount,
+ parameters, typeNames, metaTypes);
+ if (r == QMetaMethodPrivate::InvokeFailReason::None)
+ return returnValue;
+ if (int(r) < 0)
+ return nullptr;
+ }
- if (static_metacall(CreateInstance, idx, param) >= 0)
- return nullptr;
return returnValue;
}
@@ -321,9 +334,9 @@ int QMetaObject::metacall(QObject *object, Call cl, int idx, void **argv)
return object->qt_metacall(cl, idx, argv);
}
-static inline const char *objectClassName(const QMetaObject *m)
+static inline QByteArrayView objectClassName(const QMetaObject *m)
{
- return rawStringData(m, priv(m->d.data)->className);
+ return stringDataView(m, priv(m->d.data)->className);
}
/*!
@@ -333,7 +346,7 @@ static inline const char *objectClassName(const QMetaObject *m)
*/
const char *QMetaObject::className() const
{
- return objectClassName(this);
+ return objectClassName(this).constData();
}
/*!
@@ -388,8 +401,9 @@ const QObject *QMetaObject::cast(const QObject *obj) const
*/
QString QMetaObject::tr(const char *s, const char *c, int n) const
{
- return QCoreApplication::translate(objectClassName(this), s, c, n);
+ return QCoreApplication::translate(className(), s, c, n);
}
+#endif // QT_NO_TRANSLATION
/*!
\since 6.2
@@ -405,11 +419,31 @@ QMetaType QMetaObject::metaType() const
return QMetaType::fromName(className());
} else {
/* in the metatype array, we store
- idx: 0 propertyCount - 1 propertyCount
- data:QMetaType(prop0), ..., QMetaType(propPropCount-1), QMetaType(class),...
- */
- auto iface = this->d.metaTypes[d->propertyCount];
- if (iface == QtPrivate::qMetaTypeInterfaceForType<void>())
+
+ | index | data |
+ |----------------------------------------------------------------------|
+ | 0 | QMetaType(property0) |
+ | ... | ... |
+ | propertyCount - 1 | QMetaType(propertyCount - 1) |
+ | propertyCount | QMetaType(enumerator0) |
+ | ... | ... |
+ | propertyCount + enumeratorCount - 1 | QMetaType(enumeratorCount - 1) |
+ | propertyCount + enumeratorCount | QMetaType(class) |
+
+ */
+#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0)
+ // Before revision 12 we only stored metatypes for enums if they showed
+ // up as types of properties or method arguments or return values.
+ // From revision 12 on, we always store them in a predictable place.
+ const qsizetype offset = d->revision < 12
+ ? d->propertyCount
+ : d->propertyCount + d->enumeratorCount;
+#else
+ const qsizetype offset = d->propertyCount + d->enumeratorCount;
+#endif
+
+ auto iface = this->d.metaTypes[offset];
+ if (iface && QtMetaTypePrivate::isInterfaceFor<void>(iface))
return QMetaType(); // return invalid meta-type for namespaces
if (iface)
return QMetaType(iface);
@@ -417,7 +451,6 @@ QMetaType QMetaObject::metaType() const
return QMetaType::fromName(className()); // try lookup by name in that case
}
}
-#endif // QT_NO_TRANSLATION
/*!
Returns the method offset for this class; i.e. the index position
@@ -602,19 +635,25 @@ bool QMetaObjectPrivate::methodMatch(const QMetaObject *m, const QMetaMethod &me
const QArgumentType *types)
{
const QMetaMethod::Data &data = method.data;
- if (data.argc() != uint(argc))
+ auto priv = QMetaMethodPrivate::get(&method);
+ if (priv->parameterCount() != argc)
return false;
if (stringData(m, data.name()) != name)
return false;
+ const QtPrivate::QMetaTypeInterface * const *ifaces = priv->parameterMetaTypeInterfaces();
int paramsIndex = data.parameters() + 1;
for (int i = 0; i < argc; ++i) {
uint typeInfo = m->d.data[paramsIndex + i];
- if (types[i].type()) {
- if (types[i].type() != typeFromTypeInfo(m, typeInfo))
+ if (int id = types[i].type()) {
+ if (id == QMetaType(ifaces[i]).id())
+ continue;
+ if (id != typeFromTypeInfo(m, typeInfo))
return false;
} else {
+ if (types[i].name() == QMetaType(ifaces[i]).name())
+ continue;
if (types[i].name() != typeNameFromTypeInfo(m, typeInfo))
return false;
}
@@ -794,7 +833,7 @@ int QMetaObjectPrivate::indexOfSignalRelative(const QMetaObject **baseObject,
QMetaMethod conflictMethod = m->d.superdata->method(conflict);
qWarning("QMetaObject::indexOfSignal: signal %s from %s redefined in %s",
conflictMethod.methodSignature().constData(),
- objectClassName(m->d.superdata), objectClassName(m));
+ m->d.superdata->className(), m->className());
}
}
#endif
@@ -979,8 +1018,8 @@ bool QMetaObjectPrivate::checkConnectArgs(const QMetaMethodPrivate *signal,
uint targetTypeInfo = method->parameterTypeInfo(i);
if ((sourceTypeInfo & IsUnresolvedType)
|| (targetTypeInfo & IsUnresolvedType)) {
- QByteArray sourceName = typeNameFromTypeInfo(smeta, sourceTypeInfo);
- QByteArray targetName = typeNameFromTypeInfo(rmeta, targetTypeInfo);
+ QByteArrayView sourceName = typeNameFromTypeInfo(smeta, sourceTypeInfo);
+ QByteArrayView targetName = typeNameFromTypeInfo(rmeta, targetTypeInfo);
if (sourceName != targetName)
return false;
} else {
@@ -993,10 +1032,10 @@ bool QMetaObjectPrivate::checkConnectArgs(const QMetaMethodPrivate *signal,
return true;
}
-static const QMetaObject *QMetaObject_findMetaObject(const QMetaObject *self, const char *name)
+static const QMetaObject *QMetaObject_findMetaObject(const QMetaObject *self, QByteArrayView name)
{
while (self) {
- if (strcmp(objectClassName(self), name) == 0)
+ if (objectClassName(self) == name)
return self;
if (self->d.relatedMetaObjects) {
Q_ASSERT(priv(self->d.data)->revision >= 2);
@@ -1022,27 +1061,28 @@ static const QMetaObject *QMetaObject_findMetaObject(const QMetaObject *self, co
*/
int QMetaObject::indexOfEnumerator(const char *name) const
{
- const QMetaObject *m = this;
- while (m) {
- const QMetaObjectPrivate *d = priv(m->d.data);
- for (int i = 0; i < d->enumeratorCount; ++i) {
- const QMetaEnum e(m, i);
- const char *prop = rawStringData(m, e.data.name());
- if (name[0] == prop[0] && strcmp(name + 1, prop + 1) == 0) {
- i += m->enumeratorOffset();
- return i;
- }
- }
- m = m->d.superdata;
+ return QMetaObjectPrivate::indexOfEnumerator(this, name);
+}
+
+int QMetaObjectPrivate::indexOfEnumerator(const QMetaObject *m, QByteArrayView name)
+{
+ using W = QMetaObjectPrivate::Which;
+ for (auto which : { W::Name, W::Alias }) {
+ if (int index = indexOfEnumerator(m, name, which); index != -1)
+ return index;
}
- // Check alias names:
- m = this;
+ return -1;
+}
+
+int QMetaObjectPrivate::indexOfEnumerator(const QMetaObject *m, QByteArrayView name, Which which)
+{
while (m) {
const QMetaObjectPrivate *d = priv(m->d.data);
for (int i = 0; i < d->enumeratorCount; ++i) {
const QMetaEnum e(m, i);
- const char *prop = rawStringData(m, e.data.alias());
- if (name[0] == prop[0] && strcmp(name + 1, prop + 1) == 0) {
+ const quint32 id = which == Which::Name ? e.data.name() : e.data.alias();
+ QByteArrayView prop = stringDataView(m, id);
+ if (name == prop) {
i += m->enumeratorOffset();
return i;
}
@@ -1066,7 +1106,7 @@ int QMetaObject::indexOfProperty(const char *name) const
for (int i = 0; i < d->propertyCount; ++i) {
const QMetaProperty::Data data = QMetaProperty::getMetaPropertyData(m, i);
const char *prop = rawStringData(m, data.name());
- if (name[0] == prop[0] && strcmp(name + 1, prop + 1) == 0) {
+ if (strcmp(name, prop) == 0) {
i += m->propertyOffset();
return i;
}
@@ -1351,69 +1391,82 @@ QByteArray QMetaObject::normalizedSignature(const char *method)
return result;
}
-enum { MaximumParamCount = 11 }; // up to 10 arguments + 1 return value
-
-/*
- Returns the signatures of all methods whose name matches \a nonExistentMember,
- or an empty QByteArray if there are no matches.
-*/
-static inline QByteArray findMethodCandidates(const QMetaObject *metaObject, const char *nonExistentMember)
+Q_DECL_COLD_FUNCTION static inline bool
+printMethodNotFoundWarning(const QMetaObject *meta, QByteArrayView name, qsizetype paramCount,
+ const char *const *names,
+ const QtPrivate::QMetaTypeInterface * const *metaTypes)
{
+ // now find the candidates we couldn't use
QByteArray candidateMessage;
- // Prevent full string comparison in every iteration.
- const QByteArray memberByteArray = nonExistentMember;
- for (int i = 0; i < metaObject->methodCount(); ++i) {
- const QMetaMethod method = metaObject->method(i);
- if (method.name() == memberByteArray)
+ for (int i = 0; i < meta->methodCount(); ++i) {
+ const QMetaMethod method = meta->method(i);
+ if (method.name() == name)
candidateMessage += " " + method.methodSignature() + '\n';
}
if (!candidateMessage.isEmpty()) {
candidateMessage.prepend("\nCandidates are:\n");
candidateMessage.chop(1);
}
- return candidateMessage;
+
+ QVarLengthArray<char, 512> sig;
+ for (qsizetype i = 1; i < paramCount; ++i) {
+ if (names[i])
+ sig.append(names[i], qstrlen(names[i]));
+ else
+ sig.append(metaTypes[i]->name, qstrlen(metaTypes[i]->name));
+ sig.append(',');
+ }
+ if (paramCount != 1)
+ sig.resize(sig.size() - 1);
+
+ qWarning("QMetaObject::invokeMethod: No such method %s::%.*s(%.*s)%.*s",
+ meta->className(), int(name.size()), name.constData(),
+ int(sig.size()), sig.constData(),
+ int(candidateMessage.size()), candidateMessage.constData());
+ return false;
}
/*!
+ \fn template <typename ReturnArg, typename... Args> bool QMetaObject::invokeMethod(QObject *obj, const char *member, Qt::ConnectionType type, QTemplatedMetaMethodReturnArgument<ReturnArg> ret, Args &&... args)
+ \fn template <typename ReturnArg, typename... Args> bool QMetaObject::invokeMethod(QObject *obj, const char *member, QTemplatedMetaMethodReturnArgument<ReturnArg> ret, Args &&... args)
+ \fn template <typename... Args> bool QMetaObject::invokeMethod(QObject *obj, const char *member, Qt::ConnectionType type, Args &&... args)
+ \fn template <typename... Args> bool QMetaObject::invokeMethod(QObject *obj, const char *member, Args &&... args)
+ \since 6.5
\threadsafe
Invokes the \a member (a signal or a slot name) on the object \a
obj. Returns \c true if the member could be invoked. Returns \c false
if there is no such member or the parameters did not match.
- The invocation can be either synchronous or asynchronous,
- depending on \a type:
+ For the overloads with a QTemplatedMetaMethodReturnArgument parameter, the
+ return value of the \a member function call is placed in \a ret. For the
+ overloads without such a member, the return value of the called function
+ (if any) will be discarded. QTemplatedMetaMethodReturnArgument is an
+ internal type you should not use directly. Instead, use the qReturnArg()
+ function.
+
+ The overloads with a Qt::ConnectionType \a type parameter allow explicitly
+ selecting whether the invocation will be synchronous or not:
\list
- \li If \a type is Qt::DirectConnection, the member will be invoked immediately.
+ \li If \a type is Qt::DirectConnection, the member will be invoked immediately
+ in the current thread.
- \li If \a type is Qt::QueuedConnection,
- a QEvent will be sent and the member is invoked as soon as the application
- enters the main event loop.
+ \li If \a type is Qt::QueuedConnection, a QEvent will be sent and the
+ member is invoked as soon as the application enters the event loop in the
+ thread that the \a obj was created in or was moved to.
\li If \a type is Qt::BlockingQueuedConnection, the method will be invoked in
the same way as for Qt::QueuedConnection, except that the current thread
will block until the event is delivered. Using this connection type to
communicate between objects in the same thread will lead to deadlocks.
- \li If \a type is Qt::AutoConnection, the member is invoked
- synchronously if \a obj lives in the same thread as the
- caller; otherwise it will invoke the member asynchronously.
+ \li If \a type is Qt::AutoConnection, the member is invoked synchronously
+ if \a obj lives in the same thread as the caller; otherwise it will invoke
+ the member asynchronously. This is the behavior of the overloads that do
+ not have the \a type parameter.
\endlist
- The return value of the \a member function call is placed in \a
- ret. If the invocation is asynchronous, the return value cannot
- be evaluated. You can pass up to ten arguments (\a val0, \a val1,
- \a val2, \a val3, \a val4, \a val5, \a val6, \a val7, \a val8,
- and \a val9) to the \a member function.
-
- QGenericArgument and QGenericReturnArgument are internal
- helper classes. Because signals and slots can be dynamically
- invoked, you must enclose the arguments using the Q_ARG() and
- Q_RETURN_ARG() macros. Q_ARG() takes a type name and a
- const reference of that type; Q_RETURN_ARG() takes a type name
- and a non-const reference.
-
You only need to pass the name of the signal or slot to this function,
not the entire signature. For example, to asynchronously invoke
the \l{QThread::quit()}{quit()} slot on a
@@ -1421,8 +1474,62 @@ static inline QByteArray findMethodCandidates(const QMetaObject *metaObject, con
\snippet code/src_corelib_kernel_qmetaobject.cpp 2
+ With asynchronous method invocations, the parameters must be copyable
+ types, because Qt needs to copy the arguments to store them in an event
+ behind the scenes. Since Qt 6.5, this function automatically registers the
+ types being used; however, as a side-effect, it is not possible to make
+ calls using types that are only forward-declared. Additionally, it is not
+ possible to make asynchronous calls that use references to
+ non-const-qualified types as parameters either.
+
+ To synchronously invoke the \c compute(QString, int, double) slot on
+ some arbitrary object \c obj retrieve its return value:
+
+ \snippet code/src_corelib_kernel_qmetaobject.cpp invokemethod-no-macro
+
+ If the "compute" slot does not take exactly one \l QString, one \c int, and
+ one \c double in the specified order, the call will fail. Note how it was
+ necessary to be explicit about the type of the QString, as the character
+ literal is not exactly the right type to match. If the method instead took
+ a \l QStringView, a \l qsizetype, and a \c float, the call would need to be
+ written as:
+
+ \snippet code/src_corelib_kernel_qmetaobject.cpp invokemethod-no-macro-other-types
+
+ The same call can be executed using the Q_ARG() and Q_RETURN_ARG() macros,
+ as in:
+
+ \snippet code/src_corelib_kernel_qmetaobject.cpp 4
+
+ The macros are kept for compatibility with Qt 6.4 and earlier versions, and
+ can be freely mixed with parameters that do not use the macro. They may be
+ necessary in rare situations when calling a method that used a typedef to
+ forward-declared type as a parameter or the return type.
+
+ \sa Q_ARG(), Q_RETURN_ARG(), QMetaMethod::invoke()
+*/
+
+/*!
+ \threadsafe
+ \overload
+ \obsolete [6.5] Please use the variadic overload of this function
+
+ Invokes the \a member (a signal or a slot name) on the object \a
+ obj. Returns \c true if the member could be invoked. Returns \c false
+ if there is no such member or the parameters did not match.
+
+ See the variadic invokeMethod() function for more information. This
+ function should behave the same way as that one, with the following
+ limitations:
+
+ \list
+ \li The number of parameters is limited to 10.
+ \li Parameter names may need to be an exact string match.
+ \li Meta types are not automatically registered.
+ \endlist
+
With asynchronous method invocations, the parameters must be of
- types that are known to Qt's meta-object system, because Qt needs
+ types that are already known to Qt's meta-object system, because Qt needs
to copy the arguments to store them in an event behind the
scenes. If you try to use a queued connection and get the error
message
@@ -1432,14 +1539,6 @@ static inline QByteArray findMethodCandidates(const QMetaObject *metaObject, con
call qRegisterMetaType() to register the data type before you
call invokeMethod().
- To synchronously invoke the \c compute(QString, int, double) slot on
- some arbitrary object \c obj retrieve its return value:
-
- \snippet code/src_corelib_kernel_qmetaobject.cpp 4
-
- If the "compute" slot does not take exactly one QString, one int
- and one double in the specified order, the call will fail.
-
\sa Q_ARG(), Q_RETURN_ARG(), qRegisterMetaType(), QMetaMethod::invoke()
*/
bool QMetaObject::invokeMethod(QObject *obj,
@@ -1460,58 +1559,70 @@ bool QMetaObject::invokeMethod(QObject *obj,
if (!obj)
return false;
- QVarLengthArray<char, 512> sig;
- int len = int(qstrlen(member));
- if (len <= 0)
- return false;
- sig.append(member, len);
- sig.append('(');
-
const char *typeNames[] = {ret.name(), val0.name(), val1.name(), val2.name(), val3.name(),
val4.name(), val5.name(), val6.name(), val7.name(), val8.name(),
val9.name()};
-
+ const void *parameters[] = {ret.data(), val0.data(), val1.data(), val2.data(), val3.data(),
+ val4.data(), val5.data(), val6.data(), val7.data(), val8.data(),
+ val9.data()};
int paramCount;
for (paramCount = 1; paramCount < MaximumParamCount; ++paramCount) {
- len = int(qstrlen(typeNames[paramCount]));
- if (len <= 0)
+ if (qstrlen(typeNames[paramCount]) <= 0)
break;
- sig.append(typeNames[paramCount], len);
- sig.append(',');
}
- if (paramCount == 1)
- sig.append(')'); // no parameters
- else
- sig[sig.size() - 1] = ')';
- sig.append('\0');
+ return invokeMethodImpl(obj, member, type, paramCount, parameters, typeNames, nullptr);
+}
- const QMetaObject *meta = obj->metaObject();
- int idx = meta->indexOfMethod(sig.constData());
- if (idx < 0) {
- QByteArray norm = QMetaObject::normalizedSignature(sig.constData());
- idx = meta->indexOfMethod(norm.constData());
- }
+bool QMetaObject::invokeMethodImpl(QObject *obj, const char *member, Qt::ConnectionType type,
+ qsizetype paramCount, const void * const *parameters,
+ const char * const *typeNames,
+ const QtPrivate::QMetaTypeInterface * const *metaTypes)
+{
+ if (!obj)
+ return false;
- if (idx < 0 || idx >= meta->methodCount()) {
- // This method doesn't belong to us; print out a nice warning with candidates.
- qWarning("QMetaObject::invokeMethod: No such method %s::%s%s",
- meta->className(), sig.constData(), findMethodCandidates(meta, member).constData());
+ Q_ASSERT(paramCount >= 1); // includes the return type
+ Q_ASSERT(parameters);
+ Q_ASSERT(typeNames);
+
+ // find the method
+ QByteArrayView name(member);
+ if (name.isEmpty())
return false;
+
+ const QMetaObject *meta = obj->metaObject();
+ for ( ; meta; meta = meta->superClass()) {
+ auto priv = QMetaObjectPrivate::get(meta);
+ for (int i = 0; i < priv->methodCount; ++i) {
+ QMetaMethod m = QMetaMethod::fromRelativeMethodIndex(meta, i);
+ if (m.parameterCount() != (paramCount - 1))
+ continue;
+ if (name != stringDataView(meta, m.data.name()))
+ continue;
+
+ // attempt to call
+ QMetaMethodPrivate::InvokeFailReason r =
+ QMetaMethodPrivate::invokeImpl(m, obj, type, paramCount, parameters,
+ typeNames, metaTypes);
+ if (int(r) <= 0)
+ return r == QMetaMethodPrivate::InvokeFailReason::None;
+ }
}
- QMetaMethod method = meta->method(idx);
- return method.invoke(obj, type, ret,
- val0, val1, val2, val3, val4, val5, val6, val7, val8, val9);
+
+ // This method doesn't belong to us; print out a nice warning with candidates.
+ return printMethodNotFoundWarning(obj->metaObject(), name, paramCount, typeNames, metaTypes);
}
-bool QMetaObject::invokeMethodImpl(QObject *object, QtPrivate::QSlotObjectBase *slot, Qt::ConnectionType type, void *ret)
+bool QMetaObject::invokeMethodImpl(QObject *object, QtPrivate::QSlotObjectBase *slotObj, Qt::ConnectionType type,
+ qsizetype parameterCount, const void *const *params, const char *const *names,
+ const QtPrivate::QMetaTypeInterface * const *metaTypes)
{
- struct Holder {
- QtPrivate::QSlotObjectBase *obj;
- ~Holder() { obj->destroyIfLastRef(); }
- } holder = { slot };
- Q_UNUSED(holder);
+ // We don't need this now but maybe we want it later, or we may be able to
+ // share more code between the two invokeMethodImpl() overloads:
+ Q_UNUSED(names);
+ auto slot = QtPrivate::SlotObjUniquePtr(slotObj);
- if (! object)
+ if (! object) // ### only if the slot requires the object + not queued?
return false;
Qt::HANDLE currentThreadId = QThread::currentThreadId();
@@ -1523,8 +1634,7 @@ bool QMetaObject::invokeMethodImpl(QObject *object, QtPrivate::QSlotObjectBase *
if (type == Qt::AutoConnection)
type = receiverInSameThread ? Qt::DirectConnection : Qt::QueuedConnection;
- void *argv[] = { ret };
-
+ void **argv = const_cast<void **>(params);
if (type == Qt::DirectConnection) {
slot->call(object, argv);
} else if (type == Qt::QueuedConnection) {
@@ -1533,15 +1643,23 @@ bool QMetaObject::invokeMethodImpl(QObject *object, QtPrivate::QSlotObjectBase *
"queued connections");
return false;
}
+ auto event = std::make_unique<QMetaCallEvent>(std::move(slot), nullptr, -1, parameterCount);
+ void **args = event->args();
+ QMetaType *types = event->types();
+
+ for (int i = 1; i < parameterCount; ++i) {
+ types[i] = QMetaType(metaTypes[i]);
+ args[i] = types[i].create(argv[i]);
+ }
- QCoreApplication::postEvent(object, new QMetaCallEvent(slot, nullptr, -1, 1));
+ QCoreApplication::postEvent(object, event.release());
} else if (type == Qt::BlockingQueuedConnection) {
#if QT_CONFIG(thread)
if (receiverInSameThread)
qWarning("QMetaObject::invokeMethod: Dead lock detected");
QSemaphore semaphore;
- QCoreApplication::postEvent(object, new QMetaCallEvent(slot, nullptr, -1, argv, &semaphore));
+ QCoreApplication::postEvent(object, new QMetaCallEvent(std::move(slot), nullptr, -1, argv, &semaphore));
semaphore.acquire();
#endif // QT_CONFIG(thread)
} else {
@@ -1564,6 +1682,7 @@ bool QMetaObject::invokeMethodImpl(QObject *object, QtPrivate::QSlotObjectBase *
QGenericArgument val8 = QGenericArgument(),
QGenericArgument val9 = QGenericArgument());
\threadsafe
+ \obsolete [6.5] Please use the variadic overload of this function.
\overload invokeMethod()
This overload always invokes the member using the connection type Qt::AutoConnection.
@@ -1583,6 +1702,7 @@ bool QMetaObject::invokeMethodImpl(QObject *object, QtPrivate::QSlotObjectBase *
QGenericArgument val9 = QGenericArgument())
\threadsafe
+ \obsolete [6.5] Please use the variadic overload of this function.
\overload invokeMethod()
This overload can be used if the return value of the member is of no interest.
@@ -1602,6 +1722,7 @@ bool QMetaObject::invokeMethodImpl(QObject *object, QtPrivate::QSlotObjectBase *
QGenericArgument val9 = QGenericArgument())
\threadsafe
+ \obsolete [6.5] Please use the variadic overload of this function.
\overload invokeMethod()
This overload invokes the member using the connection type Qt::AutoConnection and
@@ -1609,31 +1730,44 @@ bool QMetaObject::invokeMethodImpl(QObject *object, QtPrivate::QSlotObjectBase *
*/
/*!
- \fn template<typename Functor, typename FunctorReturnType> bool QMetaObject::invokeMethod(QObject *context, Functor function, Qt::ConnectionType type, FunctorReturnType *ret)
+ \fn template<typename Functor, typename FunctorReturnType> bool QMetaObject::invokeMethod(QObject *context, Functor &&function, Qt::ConnectionType type, FunctorReturnType *ret)
+ \fn template<typename Functor, typename FunctorReturnType> bool QMetaObject::invokeMethod(QObject *context, Functor &&function, FunctorReturnType *ret)
\since 5.10
-
\threadsafe
- \overload
Invokes the \a function in the event loop of \a context. \a function can be a functor
or a pointer to a member function. Returns \c true if the function could be invoked.
Returns \c false if there is no such function or the parameters did not match.
The return value of the function call is placed in \a ret.
+
+ If \a type is set, then the function is invoked using that connection type. Otherwise,
+ Qt::AutoConnection will be used.
*/
/*!
- \fn template<typename Functor, typename FunctorReturnType> bool QMetaObject::invokeMethod(QObject *context, Functor function, FunctorReturnType *ret)
-
- \since 5.10
+ \fn template<typename Functor, typename FunctorReturnType, typename... Args> bool QMetaObject::invokeMethod(QObject *context, Functor &&function, Qt::ConnectionType type, QTemplatedMetaMethodReturnArgument<FunctorReturnType> ret, Args &&...arguments)
+ \fn template<typename Functor, typename FunctorReturnType, typename... Args> bool QMetaObject::invokeMethod(QObject *context, Functor &&function, QTemplatedMetaMethodReturnArgument<FunctorReturnType> ret, Args &&...arguments)
+ \fn template<typename Functor, typename... Args> bool QMetaObject::invokeMethod(QObject *context, Functor &&function, Qt::ConnectionType type, Args &&...arguments)
+ \fn template<typename Functor, typename... Args> bool QMetaObject::invokeMethod(QObject *context, Functor &&function, Args &&...arguments)
+ \since 6.7
\threadsafe
- \overload
- Invokes the \a function in the event loop of \a context using the connection type Qt::AutoConnection.
- \a function can be a functor or a pointer to a member function. Returns \c true if the function could
- be invoked. Returns \c false if there is no such member or the parameters did not match.
- The return value of the function call is placed in \a ret.
+ Invokes the \a function with \a arguments in the event loop of \a context.
+ \a function can be a functor or a pointer to a member function. Returns
+ \c true if the function could be invoked. The return value of the
+ function call is placed in \a ret. The object used for the \a ret argument
+ should be obtained by passing your object to qReturnArg(). For example:
+
+ \badcode
+ MyClass *obj = ...;
+ int result = 0;
+ QMetaObject::invokeMethod(obj, &MyClass::myMethod, qReturnArg(result), parameter);
+ \endcode
+
+ If \a type is set, then the function is invoked using that connection type.
+ Otherwise, Qt::AutoConnection will be used.
*/
/*!
@@ -1664,6 +1798,7 @@ bool QMetaObject::invokeMethodImpl(QObject *object, QtPrivate::QSlotObjectBase *
function.
\ingroup objectmodel
+ \compares equality
A QMetaMethod has a methodType(), a methodSignature(), a list of
parameterTypes() and parameterNames(), a return typeName(), a
@@ -1691,19 +1826,19 @@ bool QMetaObject::invokeMethodImpl(QObject *object, QtPrivate::QSlotObjectBase *
invoked), otherwise returns \c false.
*/
-/*! \fn bool QMetaMethod::operator==(const QMetaMethod &m1, const QMetaMethod &m2)
+/*! \fn bool QMetaMethod::operator==(const QMetaMethod &lhs, const QMetaMethod &rhs)
\since 5.0
\overload
- Returns \c true if method \a m1 is equal to method \a m2,
+ Returns \c true if method \a lhs is equal to method \a rhs,
otherwise returns \c false.
*/
-/*! \fn bool QMetaMethod::operator!=(const QMetaMethod &m1, const QMetaMethod &m2)
+/*! \fn bool QMetaMethod::operator!=(const QMetaMethod &lhs, const QMetaMethod &rhs)
\since 5.0
\overload
- Returns \c true if method \a m1 is not equal to method \a m2,
+ Returns \c true if method \a lhs is not equal to method \a rhs,
otherwise returns \c false.
*/
@@ -1805,6 +1940,35 @@ int QMetaMethodPrivate::parameterCount() const
return data.argc();
}
+inline void
+QMetaMethodPrivate::checkMethodMetaTypeConsistency(const QtPrivate::QMetaTypeInterface *iface,
+ int index) const
+{
+ uint typeInfo = parameterTypeInfo(index);
+ QMetaType mt(iface);
+ if (iface) {
+ if ((typeInfo & IsUnresolvedType) == 0)
+ Q_ASSERT(mt.id() == int(typeInfo & TypeNameIndexMask));
+ Q_ASSERT(mt.name());
+ } else {
+ // The iface can only be null for a parameter if that parameter is a
+ // const-ref to a forward-declared type. Since primitive types are
+ // never incomplete, we can assert it's not one of them.
+
+#define ASSERT_NOT_PRIMITIVE_TYPE(TYPE, METATYPEID, NAME) \
+ Q_ASSERT(typeInfo != QMetaType::TYPE);
+ QT_FOR_EACH_STATIC_PRIMITIVE_NON_VOID_TYPE(ASSERT_NOT_PRIMITIVE_TYPE)
+#undef ASSERT_NOT_PRIMITIVE_TYPE
+ Q_ASSERT(typeInfo != QMetaType::QObjectStar);
+
+ // Prior to Qt 6.4 we failed to record void and void*
+ if (priv(mobj->d.data)->revision >= 11) {
+ Q_ASSERT(typeInfo != QMetaType::Void);
+ Q_ASSERT(typeInfo != QMetaType::VoidStar);
+ }
+ }
+}
+
int QMetaMethodPrivate::parametersDataIndex() const
{
Q_ASSERT(priv(mobj->d.data)->revision >= 7);
@@ -1817,6 +1981,29 @@ uint QMetaMethodPrivate::parameterTypeInfo(int index) const
return mobj->d.data[parametersDataIndex() + index];
}
+const QtPrivate::QMetaTypeInterface *QMetaMethodPrivate::returnMetaTypeInterface() const
+{
+ Q_ASSERT(priv(mobj->d.data)->revision >= 7);
+ if (methodType() == QMetaMethod::Constructor)
+ return nullptr; // constructors don't have return types
+
+ const QtPrivate::QMetaTypeInterface *iface = mobj->d.metaTypes[data.metaTypeOffset()];
+ checkMethodMetaTypeConsistency(iface, -1);
+ return iface;
+}
+
+const QtPrivate::QMetaTypeInterface * const *QMetaMethodPrivate::parameterMetaTypeInterfaces() const
+{
+ Q_ASSERT(priv(mobj->d.data)->revision >= 7);
+ int offset = (methodType() == QMetaMethod::Constructor ? 0 : 1);
+ const auto ifaces = &mobj->d.metaTypes[data.metaTypeOffset() + offset];
+
+ for (int i = 0; i < parameterCount(); ++i)
+ checkMethodMetaTypeConsistency(ifaces[i], i);
+
+ return ifaces;
+}
+
int QMetaMethodPrivate::parameterType(int index) const
{
Q_ASSERT(priv(mobj->d.data)->revision >= 7);
@@ -1837,7 +2024,7 @@ void QMetaMethodPrivate::getParameterTypes(int *types) const
QByteArray QMetaMethodPrivate::parameterTypeName(int index) const
{
int paramsIndex = parametersDataIndex();
- return typeNameFromTypeInfo(mobj, mobj->d.data[paramsIndex + index]);
+ return typeNameFromTypeInfo(mobj, mobj->d.data[paramsIndex + index]).toByteArray();
}
QList<QByteArray> QMetaMethodPrivate::parameterTypes() const
@@ -1847,8 +2034,10 @@ QList<QByteArray> QMetaMethodPrivate::parameterTypes() const
QList<QByteArray> list;
list.reserve(argc);
int paramsIndex = parametersDataIndex();
- for (int i = 0; i < argc; ++i)
- list += typeNameFromTypeInfo(mobj, mobj->d.data[paramsIndex + i]);
+ for (int i = 0; i < argc; ++i) {
+ QByteArrayView name = typeNameFromTypeInfo(mobj, mobj->d.data[paramsIndex + i]);
+ list.emplace_back(name.toByteArray());
+ }
return list;
}
@@ -1872,10 +2061,17 @@ QByteArray QMetaMethodPrivate::tag() const
int QMetaMethodPrivate::ownMethodIndex() const
{
- // recompute the methodIndex by reversing the arithmetic in QMetaObject::property()
+ // recompute the methodIndex by reversing the arithmetic in QMetaObject::method()
return ( data.d - mobj->d.data - priv(mobj->d.data)->methodData)/Data::Size;
}
+int QMetaMethodPrivate::ownConstructorMethodIndex() const
+{
+ // recompute the methodIndex by reversing the arithmetic in QMetaObject::constructor()
+ Q_ASSERT(methodType() == Constructor);
+ return ( data.d - mobj->d.data - priv(mobj->d.data)->constructorData)/Data::Size;
+}
+
/*!
\since 5.0
@@ -2079,10 +2275,9 @@ const char *QMetaMethod::typeName() const
differently, and treat them according to the specific needs of your
application.
- \note Since Qt 5.0, \c moc expands preprocessor macros, so it is necessary
+ \note \c moc expands preprocessor macros, so it is necessary
to surround the definition with \c #ifndef \c Q_MOC_RUN, as shown in the
- example above. This was not required in Qt 4. The code as shown above works
- with Qt 4 too.
+ example above.
*/
const char *QMetaMethod::tag() const
{
@@ -2196,7 +2391,7 @@ QMetaMethod::MethodType QMetaMethod::methodType() const
\since 5.0
Returns the meta-method that corresponds to the given \a signal, or an
- invalid QMetaMethod if \a signal is not a signal of the class.
+ invalid QMetaMethod if \a signal is \c{nullptr} or not a signal of the class.
Example:
@@ -2224,36 +2419,43 @@ QMetaMethod QMetaMethod::fromSignalImpl(const QMetaObject *metaObject, void **si
}
/*!
+ \fn template <typename ReturnArg, typename... Args> bool QMetaMethod::invoke(QObject *obj, Qt::ConnectionType type, QTemplatedMetaMethodReturnArgument<ReturnArg> ret, Args &&... arguments) const
+ \fn template <typename... Args> bool QMetaMethod::invoke(QObject *obj, Qt::ConnectionType type, Args &&... arguments) const
+ \fn template <typename ReturnArg, typename... Args> bool QMetaMethod::invoke(QObject *obj, QTemplatedMetaMethodReturnArgument<ReturnArg> ret, Args &&... arguments) const
+ \fn template <typename... Args> bool QMetaMethod::invoke(QObject *obj, Args &&... arguments) const
+ \since 6.5
+
Invokes this method on the object \a object. Returns \c true if the member could be invoked.
Returns \c false if there is no such member or the parameters did not match.
- The invocation can be either synchronous or asynchronous, depending on the
- \a connectionType:
+ For the overloads with a QTemplatedMetaMethodReturnArgument parameter, the
+ return value of the \a member function call is placed in \a ret. For the
+ overloads without such a member, the return value of the called function
+ (if any) will be discarded. QTemplatedMetaMethodReturnArgument is an
+ internal type you should not use directly. Instead, use the qReturnArg()
+ function.
- \list
- \li If \a connectionType is Qt::DirectConnection, the member will be invoked immediately.
+ The overloads with a Qt::ConnectionType \a type parameter allow explicitly
+ selecting whether the invocation will be synchronous or not:
- \li If \a connectionType is Qt::QueuedConnection,
- a QEvent will be posted and the member is invoked as soon as the application
- enters the main event loop.
+ \list
+ \li If \a type is Qt::DirectConnection, the member will be invoked immediately
+ in the current thread.
- \li If \a connectionType is Qt::AutoConnection, the member is invoked
- synchronously if \a object lives in the same thread as the
- caller; otherwise it will invoke the member asynchronously.
- \endlist
+ \li If \a type is Qt::QueuedConnection, a QEvent will be sent and the
+ member is invoked as soon as the application enters the event loop in the
+ thread the \a obj was created in or was moved to.
- The return value of this method call is placed in \a
- returnValue. If the invocation is asynchronous, the return value cannot
- be evaluated. You can pass up to ten arguments (\a val0, \a val1,
- \a val2, \a val3, \a val4, \a val5, \a val6, \a val7, \a val8,
- and \a val9) to this method call.
+ \li If \a type is Qt::BlockingQueuedConnection, the method will be invoked in
+ the same way as for Qt::QueuedConnection, except that the current thread
+ will block until the event is delivered. Using this connection type to
+ communicate between objects in the same thread will lead to deadlocks.
- QGenericArgument and QGenericReturnArgument are internal
- helper classes. Because signals and slots can be dynamically
- invoked, you must enclose the arguments using the Q_ARG() and
- Q_RETURN_ARG() macros. Q_ARG() takes a type name and a
- const reference of that type; Q_RETURN_ARG() takes a type name
- and a non-const reference.
+ \li If \a type is Qt::AutoConnection, the member is invoked synchronously
+ if \a obj lives in the same thread as the caller; otherwise it will invoke
+ the member asynchronously. This is the behavior of the overloads that do
+ not have the \a type parameter.
+ \endlist
To asynchronously invoke the
\l{QPushButton::animateClick()}{animateClick()} slot on a
@@ -2261,6 +2463,56 @@ QMetaMethod QMetaMethod::fromSignalImpl(const QMetaObject *metaObject, void **si
\snippet code/src_corelib_kernel_qmetaobject.cpp 6
+ With asynchronous method invocations, the parameters must be copyable
+ types, because Qt needs to copy the arguments to store them in an event
+ behind the scenes. Since Qt 6.5, this function automatically registers the
+ types being used; however, as a side-effect, it is not possible to make
+ calls using types that are only forward-declared. Additionally, it is not
+ possible to make asynchronous calls that use references to
+ non-const-qualified types as parameters either.
+
+ To synchronously invoke the \c compute(QString, int, double) slot on
+ some arbitrary object \c obj retrieve its return value:
+
+ \snippet code/src_corelib_kernel_qmetaobject.cpp invoke-no-macro
+
+ If the "compute" slot does not take exactly one \l QString, one \c int, and
+ one \c double in the specified order, the call will fail. Note how it was
+ necessary to be explicit about the type of the QString, as the character
+ literal is not exactly the right type to match. If the method instead took
+ a \l QByteArray, a \l qint64, and a \c{long double}, the call would need to be
+ written as:
+
+ \snippet code/src_corelib_kernel_qmetaobject.cpp invoke-no-macro-other-types
+
+ The same call can be executed using the Q_ARG() and Q_RETURN_ARG() macros,
+ as in:
+
+ \snippet code/src_corelib_kernel_qmetaobject.cpp 8
+
+ \warning this method will not test the validity of the arguments: \a object
+ must be an instance of the class of the QMetaObject of which this QMetaMethod
+ has been constructed with.
+
+ \sa Q_ARG(), Q_RETURN_ARG(), qRegisterMetaType(), QMetaObject::invokeMethod()
+*/
+
+/*!
+ \obsolete [6.5] Please use the variadic overload of this function
+
+ Invokes this method on the object \a object. Returns \c true if the member could be invoked.
+ Returns \c false if there is no such member or the parameters did not match.
+
+ See the variadic invokeMethod() function for more information. This
+ function should behave the same way as that one, with the following
+ limitations:
+
+ \list
+ \li The number of parameters is limited to 10.
+ \li Parameter names may need to be an exact string match.
+ \li Meta types are not automatically registered.
+ \endlist
+
With asynchronous method invocations, the parameters must be of
types that are known to Qt's meta-object system, because Qt needs
to copy the arguments to store them in an event behind the
@@ -2272,22 +2524,9 @@ QMetaMethod QMetaMethod::fromSignalImpl(const QMetaObject *metaObject, void **si
call qRegisterMetaType() to register the data type before you
call QMetaMethod::invoke().
- To synchronously invoke the \c compute(QString, int, double) slot on
- some arbitrary object \c obj retrieve its return value:
-
- \snippet code/src_corelib_kernel_qmetaobject.cpp 8
-
- QMetaObject::normalizedSignature() is used here to ensure that the format
- of the signature is what invoke() expects. E.g. extra whitespace is
- removed.
-
- If the "compute" slot does not take exactly one QString, one int
- and one double in the specified order, the call will fail.
-
- \warning this method will not test the validity of the arguments: \a object
- must be an instance of the class of the QMetaObject of which this QMetaMethod
- has been constructed with. The arguments must have the same type as the ones
- expected by the method, else, the behaviour is undefined.
+ \warning In addition to the limitations of the variadic invoke() overload,
+ the arguments must have the same type as the ones expected by the method,
+ else, the behavior is undefined.
\sa Q_ARG(), Q_RETURN_ARG(), qRegisterMetaType(), QMetaObject::invokeMethod()
*/
@@ -2308,23 +2547,6 @@ bool QMetaMethod::invoke(QObject *object,
if (!object || !mobj)
return false;
- Q_ASSERT(mobj->cast(object));
-
- // check return type
- if (returnValue.data()) {
- const char *retType = typeName();
- if (qstrcmp(returnValue.name(), retType) != 0) {
- // normalize the return value as well
- QByteArray normalized = QMetaObject::normalizedType(returnValue.name());
- if (qstrcmp(normalized.constData(), retType) != 0) {
- // String comparison failed, try compare the metatype.
- int t = returnType();
- if (t == QMetaType::UnknownType || t != QMetaType::fromName(normalized).id())
- return false;
- }
- }
- }
-
// check argument count (we don't allow invoking a method if given too few arguments)
const char *typeNames[] = {
returnValue.name(),
@@ -2339,27 +2561,184 @@ bool QMetaMethod::invoke(QObject *object,
val8.name(),
val9.name()
};
+ void *param[] = {
+ returnValue.data(),
+ val0.data(),
+ val1.data(),
+ val2.data(),
+ val3.data(),
+ val4.data(),
+ val5.data(),
+ val6.data(),
+ val7.data(),
+ val8.data(),
+ val9.data()
+ };
+
int paramCount;
for (paramCount = 1; paramCount < MaximumParamCount; ++paramCount) {
if (qstrlen(typeNames[paramCount]) <= 0)
break;
}
- if (paramCount <= QMetaMethodPrivate::get(this)->parameterCount())
+ return invokeImpl(*this, object, connectionType, paramCount, param, typeNames, nullptr);
+}
+
+bool QMetaMethod::invokeImpl(QMetaMethod self, void *target, Qt::ConnectionType connectionType,
+ qsizetype paramCount, const void *const *parameters,
+ const char *const *typeNames,
+ const QtPrivate::QMetaTypeInterface *const *metaTypes)
+{
+ if (!target || !self.mobj)
return false;
+ QMetaMethodPrivate::InvokeFailReason r =
+ QMetaMethodPrivate::invokeImpl(self, target, connectionType, paramCount, parameters,
+ typeNames, metaTypes);
+ if (Q_LIKELY(r == QMetaMethodPrivate::InvokeFailReason::None))
+ return true;
+
+ if (int(r) >= int(QMetaMethodPrivate::InvokeFailReason::FormalParameterMismatch)) {
+ int n = int(r) - int(QMetaMethodPrivate::InvokeFailReason::FormalParameterMismatch);
+ qWarning("QMetaMethod::invoke: cannot convert formal parameter %d from %s in call to %s::%s",
+ n, typeNames[n + 1] ? typeNames[n + 1] : metaTypes[n + 1]->name,
+ self.mobj->className(), self.methodSignature().constData());
+ }
+ if (r == QMetaMethodPrivate::InvokeFailReason::TooFewArguments) {
+ qWarning("QMetaMethod::invoke: too few arguments (%d) in call to %s::%s",
+ int(paramCount), self.mobj->className(), self.methodSignature().constData());
+ }
+ return false;
+}
- Qt::HANDLE currentThreadId = QThread::currentThreadId();
- QThread *objectThread = object->thread();
- bool receiverInSameThread = false;
- if (objectThread)
- receiverInSameThread = currentThreadId == QThreadData::get2(objectThread)->threadId.loadRelaxed();
+auto QMetaMethodInvoker::invokeImpl(QMetaMethod self, void *target,
+ Qt::ConnectionType connectionType,
+ qsizetype paramCount, const void *const *parameters,
+ const char *const *typeNames,
+ const QtPrivate::QMetaTypeInterface *const *metaTypes) -> InvokeFailReason
+{
+ auto object = static_cast<QObject *>(target);
+ auto priv = QMetaMethodPrivate::get(&self);
+ constexpr bool MetaTypesAreOptional = QT_VERSION < QT_VERSION_CHECK(7, 0, 0);
+ auto methodMetaTypes = priv->parameterMetaTypeInterfaces();
+ auto param = const_cast<void **>(parameters);
+
+ Q_ASSERT(priv->mobj);
+ Q_ASSERT(self.methodType() == Constructor || object);
+ Q_ASSERT(self.methodType() == Constructor || connectionType == Qt::ConnectionType(-1) ||
+ priv->mobj->cast(object));
+ Q_ASSERT(paramCount >= 1); // includes the return type
+ Q_ASSERT(parameters);
+ Q_ASSERT(typeNames);
+ Q_ASSERT(MetaTypesAreOptional || metaTypes);
+
+ if ((paramCount - 1) < qsizetype(priv->data.argc()))
+ return InvokeFailReason::TooFewArguments;
+
+ // 0 is the return type, 1 is the first formal parameter
+ auto checkTypesAreCompatible = [=](int idx) {
+ uint typeInfo = priv->parameterTypeInfo(idx - 1);
+ QByteArrayView userTypeName(typeNames[idx] ? typeNames[idx] : metaTypes[idx]->name);
+
+ if ((typeInfo & IsUnresolvedType) == 0) {
+ // this is a built-in type
+ if (MetaTypesAreOptional && !metaTypes)
+ return int(typeInfo) == QMetaType::fromName(userTypeName).id();
+ return int(typeInfo) == metaTypes[idx]->typeId;
+ }
- // check connection type
- if (connectionType == Qt::AutoConnection) {
- connectionType = receiverInSameThread
- ? Qt::DirectConnection
- : Qt::QueuedConnection;
+ QByteArrayView methodTypeName = stringDataView(priv->mobj, typeInfo & TypeNameIndexMask);
+ if ((MetaTypesAreOptional && !metaTypes) || !metaTypes[idx]) {
+ // compatibility call, compare strings
+ if (methodTypeName == userTypeName)
+ return true;
+
+ // maybe the user type needs normalization
+ QByteArray normalized = normalizeTypeInternal(userTypeName.begin(), userTypeName.end());
+ return methodTypeName == normalized;
+ }
+
+ QMetaType userType(metaTypes[idx]);
+ Q_ASSERT(userType.isValid());
+ if (QMetaType(methodMetaTypes[idx - 1]) == userType)
+ return true;
+
+ // if the parameter type was NOT only forward-declared, it MUST have
+ // matched
+ if (methodMetaTypes[idx - 1])
+ return false;
+
+ // resolve from the name moc stored for us
+ QMetaType resolved = QMetaType::fromName(methodTypeName);
+ return resolved == userType;
+ };
+
+ // force all types to be registered, just in case
+ for (qsizetype i = 0; metaTypes && i < paramCount; ++i)
+ QMetaType(metaTypes[i]).registerType();
+
+ // check formal parameters first (overload set)
+ for (qsizetype i = 1; i < paramCount; ++i) {
+ if (!checkTypesAreCompatible(i))
+ return InvokeFailReason(int(InvokeFailReason::FormalParameterMismatch) + i - 1);
}
+ // handle constructors first
+ if (self.methodType() == Constructor) {
+ if (object) {
+ qWarning("QMetaMethod::invokeMethod: cannot call constructor %s on object %p",
+ self.methodSignature().constData(), object);
+ return InvokeFailReason::ConstructorCallOnObject;
+ }
+
+ if (!parameters[0]) {
+ qWarning("QMetaMethod::invokeMethod: constructor call to %s must assign a return type",
+ self.methodSignature().constData());
+ return InvokeFailReason::ConstructorCallWithoutResult;
+ }
+
+ if (!MetaTypesAreOptional || metaTypes) {
+ if (metaTypes[0]->typeId != QMetaType::QObjectStar) {
+ qWarning("QMetaMethod::invokeMethod: cannot convert QObject* to %s on constructor call %s",
+ metaTypes[0]->name, self.methodSignature().constData());
+ return InvokeFailReason::ReturnTypeMismatch;
+ }
+ }
+
+ int idx = priv->ownConstructorMethodIndex();
+ if (priv->mobj->static_metacall(QMetaObject::CreateInstance, idx, param) >= 0)
+ return InvokeFailReason::ConstructorCallFailed;
+ return {};
+ }
+
+ // regular type - check return type
+ if (parameters[0]) {
+ if (!checkTypesAreCompatible(0)) {
+ const char *retType = typeNames[0] ? typeNames[0] : metaTypes[0]->name;
+ qWarning("QMetaMethod::invokeMethod: return type mismatch for method %s::%s:"
+ " cannot convert from %s to %s during invocation",
+ priv->mobj->className(), priv->methodSignature().constData(),
+ priv->rawReturnTypeName(), retType);
+ return InvokeFailReason::ReturnTypeMismatch;
+ }
+ }
+
+ Qt::HANDLE currentThreadId = nullptr;
+ QThread *objectThread = nullptr;
+ auto receiverInSameThread = [&]() {
+ if (!currentThreadId) {
+ currentThreadId = QThread::currentThreadId();
+ objectThread = object->thread();
+ }
+ if (objectThread)
+ return currentThreadId == QThreadData::get2(objectThread)->threadId.loadRelaxed();
+ return false;
+ };
+
+ // check connection type
+ if (connectionType == Qt::AutoConnection)
+ connectionType = receiverInSameThread() ? Qt::DirectConnection : Qt::QueuedConnection;
+ else if (connectionType == Qt::ConnectionType(-1))
+ connectionType = Qt::DirectConnection;
+
#if !QT_CONFIG(thread)
if (connectionType == Qt::BlockingQueuedConnection) {
connectionType = Qt::DirectConnection;
@@ -2367,69 +2746,53 @@ bool QMetaMethod::invoke(QObject *object,
#endif
// invoke!
- void *param[] = {
- returnValue.data(),
- val0.data(),
- val1.data(),
- val2.data(),
- val3.data(),
- val4.data(),
- val5.data(),
- val6.data(),
- val7.data(),
- val8.data(),
- val9.data()
- };
- int idx_relative = QMetaMethodPrivate::get(this)->ownMethodIndex();
- int idx_offset = mobj->methodOffset();
- Q_ASSERT(QMetaObjectPrivate::get(mobj)->revision >= 6);
- QObjectPrivate::StaticMetaCallFunction callFunction = mobj->d.static_metacall;
+ int idx_relative = priv->ownMethodIndex();
+ int idx_offset = priv->mobj->methodOffset();
+ QObjectPrivate::StaticMetaCallFunction callFunction = priv->mobj->d.static_metacall;
if (connectionType == Qt::DirectConnection) {
- if (callFunction) {
+ if (callFunction)
callFunction(object, QMetaObject::InvokeMetaMethod, idx_relative, param);
- return true;
- } else {
- return QMetaObject::metacall(object, QMetaObject::InvokeMetaMethod, idx_relative + idx_offset, param) < 0;
- }
+ else if (QMetaObject::metacall(object, QMetaObject::InvokeMetaMethod, idx_relative + idx_offset, param) >= 0)
+ return InvokeFailReason::CallViaVirtualFailed;
} else if (connectionType == Qt::QueuedConnection) {
- if (returnValue.data()) {
+ if (parameters[0]) {
qWarning("QMetaMethod::invoke: Unable to invoke methods with return values in "
"queued connections");
- return false;
+ return InvokeFailReason::CouldNotQueueParameter;
}
- QScopedPointer<QMetaCallEvent> event(new QMetaCallEvent(idx_offset, idx_relative, callFunction, nullptr, -1, paramCount));
+ auto event = std::make_unique<QMetaCallEvent>(idx_offset, idx_relative, callFunction, nullptr, -1, paramCount);
QMetaType *types = event->types();
void **args = event->args();
- int argIndex = 0;
+ // fill in the meta types first
for (int i = 1; i < paramCount; ++i) {
- types[i] = QMetaType::fromName(typeNames[i]);
- if (!types[i].isValid() && param[i]) {
- // Try to register the type and try again before reporting an error.
- void *argv[] = { &types[i], &argIndex };
- QMetaObject::metacall(object, QMetaObject::RegisterMethodArgumentMetaType,
- idx_relative + idx_offset, argv);
- if (!types[i].isValid()) {
- qWarning("QMetaMethod::invoke: Unable to handle unregistered datatype '%s'",
- typeNames[i]);
- return false;
- }
- }
- if (types[i].isValid()) {
- args[i] = QMetaType(types[i]).create(param[i]);
- ++argIndex;
+ types[i] = QMetaType(methodMetaTypes[i - 1]);
+ if (!types[i].iface() && (!MetaTypesAreOptional || metaTypes))
+ types[i] = QMetaType(metaTypes[i]);
+ if (!types[i].iface())
+ types[i] = priv->parameterMetaType(i - 1);
+ if (!types[i].iface() && typeNames[i])
+ types[i] = QMetaType::fromName(typeNames[i]);
+ if (!types[i].iface()) {
+ qWarning("QMetaMethod::invoke: Unable to handle unregistered datatype '%s'",
+ typeNames[i]);
+ return InvokeFailReason(int(InvokeFailReason::CouldNotQueueParameter) - i);
}
}
- QCoreApplication::postEvent(object, event.take());
+ // now create copies of our parameters using those meta types
+ for (int i = 1; i < paramCount; ++i)
+ args[i] = types[i].create(parameters[i]);
+
+ QCoreApplication::postEvent(object, event.release());
} else { // blocking queued connection
#if QT_CONFIG(thread)
- if (receiverInSameThread) {
- qWarning("QMetaMethod::invoke: Dead lock detected in "
- "BlockingQueuedConnection: Receiver is %s(%p)",
- mobj->className(), object);
+ if (receiverInSameThread()) {
+ qWarning("QMetaMethod::invoke: Dead lock detected in BlockingQueuedConnection: "
+ "Receiver is %s(%p)", priv->mobj->className(), object);
+ return InvokeFailReason::DeadLockDetected;
}
QSemaphore semaphore;
@@ -2438,7 +2801,7 @@ bool QMetaMethod::invoke(QObject *object,
semaphore.acquire();
#endif // QT_CONFIG(thread)
}
- return true;
+ return {};
}
/*! \fn bool QMetaMethod::invoke(QObject *object,
@@ -2453,6 +2816,7 @@ bool QMetaMethod::invoke(QObject *object,
QGenericArgument val7 = QGenericArgument(),
QGenericArgument val8 = QGenericArgument(),
QGenericArgument val9 = QGenericArgument()) const
+ \obsolete [6.5] Please use the variadic overload of this function
\overload invoke()
This overload always invokes this method using the connection type Qt::AutoConnection.
@@ -2470,7 +2834,7 @@ bool QMetaMethod::invoke(QObject *object,
QGenericArgument val7 = QGenericArgument(),
QGenericArgument val8 = QGenericArgument(),
QGenericArgument val9 = QGenericArgument()) const
-
+ \obsolete [6.5] Please use the variadic overload of this function
\overload invoke()
This overload can be used if the return value of the member is of no interest.
@@ -2488,7 +2852,7 @@ bool QMetaMethod::invoke(QObject *object,
QGenericArgument val7 = QGenericArgument(),
QGenericArgument val8 = QGenericArgument(),
QGenericArgument val9 = QGenericArgument()) const
-
+ \obsolete [6.5] Please use the variadic overload of this function
\overload invoke()
This overload invokes this method using the
@@ -2496,7 +2860,9 @@ bool QMetaMethod::invoke(QObject *object,
*/
/*!
- \since 5.5
+ \fn template <typename ReturnArg, typename... Args> bool QMetaMethod::invokeOnGadget(void *gadget, QTemplatedMetaMethodReturnArgument<ReturnArg> ret, Args &&... arguments) const
+ \fn template <typename... Args> bool QMetaMethod::invokeOnGadget(void *gadget, Args &&... arguments) const
+ \since 6.5
Invokes this method on a Q_GADGET. Returns \c true if the member could be invoked.
Returns \c false if there is no such member or the parameters did not match.
@@ -2505,15 +2871,39 @@ bool QMetaMethod::invoke(QObject *object,
The invocation is always synchronous.
- The return value of this method call is placed in \a
- returnValue. You can pass up to ten arguments (\a val0, \a val1,
- \a val2, \a val3, \a val4, \a val5, \a val6, \a val7, \a val8,
- and \a val9) to this method call.
+ For the overload with a QTemplatedMetaMethodReturnArgument parameter, the
+ return value of the \a member function call is placed in \a ret. For the
+ overload without it, the return value of the called function (if any) will
+ be discarded. QTemplatedMetaMethodReturnArgument is an internal type you
+ should not use directly. Instead, use the qReturnArg() function.
\warning this method will not test the validity of the arguments: \a gadget
must be an instance of the class of the QMetaObject of which this QMetaMethod
- has been constructed with. The arguments must have the same type as the ones
- expected by the method, else, the behavior is undefined.
+ has been constructed with.
+
+ \sa Q_ARG(), Q_RETURN_ARG(), qRegisterMetaType(), QMetaObject::invokeMethod()
+*/
+
+/*!
+ \since 5.5
+ \obsolete [6.5] Please use the variadic overload of this function
+
+ Invokes this method on a Q_GADGET. Returns \c true if the member could be invoked.
+ Returns \c false if there is no such member or the parameters did not match.
+
+ See the variadic invokeMethod() function for more information. This
+ function should behave the same way as that one, with the following
+ limitations:
+
+ \list
+ \li The number of parameters is limited to 10.
+ \li Parameter names may need to be an exact string match.
+ \li Meta types are not automatically registered.
+ \endlist
+
+ \warning In addition to the limitations of the variadic invoke() overload,
+ the arguments must have the same type as the ones expected by the method,
+ else, the behavior is undefined.
\sa Q_ARG(), Q_RETURN_ARG(), qRegisterMetaType(), QMetaObject::invokeMethod()
*/
@@ -2607,6 +2997,7 @@ bool QMetaMethod::invokeOnGadget(void *gadget,
QGenericArgument val9 = QGenericArgument()) const
\overload
+ \obsolete [6.5] Please use the variadic overload of this function
\since 5.5
This overload invokes this method for a \a gadget and ignores return values.
@@ -2676,7 +3067,7 @@ const char *QMetaEnum::name() const
Returns the enum name of the flag (without the scope).
For example, the Qt::AlignmentFlag flag has \c
- AlignmentFlag as the enum name, but \c Alignment as as the type name.
+ AlignmentFlag as the enum name, but \c Alignment as the type name.
Non flag enums has the same type and enum names.
Enum names have the same scope as the type name.
@@ -2692,6 +3083,32 @@ const char *QMetaEnum::enumName() const
}
/*!
+ Returns the meta type of the enum.
+
+ If the QMetaObject that this enum is part of was generated with Qt 6.5 or
+ earlier, this will be an invalid meta type.
+
+ \note This is the meta type of the enum itself, not of its underlying
+ integral type. You can retrieve the meta type of the underlying type of the
+ enum using \l{QMetaType::underlyingType()}.
+
+ \since 6.6
+*/
+QMetaType QMetaEnum::metaType() const
+{
+ if (!mobj)
+ return {};
+
+ const QMetaObjectPrivate *p = priv(mobj->d.data);
+#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0)
+ if (p->revision < 12)
+ QMetaType();
+#endif
+
+ return QMetaType(mobj->d.metaTypes[data.index(mobj) + p->propertyCount]);
+}
+
+/*!
Returns the number of keys.
\sa key()
@@ -2771,7 +3188,34 @@ bool QMetaEnum::isScoped() const
*/
const char *QMetaEnum::scope() const
{
- return mobj ? objectClassName(mobj) : nullptr;
+ return mobj ? mobj->className() : nullptr;
+}
+
+static bool isScopeMatch(QByteArrayView scope, const QMetaEnum *e)
+{
+ const QByteArrayView className = e->enclosingMetaObject()->className();
+
+ // Typical use-cases:
+ // a) Unscoped: namespace N { class C { enum E { F }; }; }; key == "N::C::F"
+ // b) Scoped: namespace N { class C { enum class E { F }; }; }; key == "N::C::E::F"
+ if (scope == className)
+ return true;
+
+ // Not using name() because if isFlag() is true, we want the actual name
+ // of the enum, e.g. "MyFlag", not "MyFlags", e.g.
+ // enum MyFlag { F1, F2 }; Q_DECLARE_FLAGS(MyFlags, MyFlag);
+ QByteArrayView name = e->enumName();
+
+ // Match fully qualified enumerator in unscoped enums, key == "N::C::E::F"
+ // equivalent to use-case "a" above
+ const auto sz = className.size();
+ if (scope.size() == sz + qsizetype(qstrlen("::")) + name.size()
+ && scope.startsWith(className)
+ && scope.sliced(sz, 2) == "::"
+ && scope.sliced(sz + 2) == name)
+ return true;
+
+ return false;
}
/*!
@@ -2791,19 +3235,11 @@ int QMetaEnum::keyToValue(const char *key, bool *ok) const
*ok = false;
if (!mobj || !key)
return -1;
- uint scope = 0;
- const char *qualified_key = key;
- const char *s = key + qstrlen(key);
- while (s > key && *s != ':')
- --s;
- if (s > key && *(s - 1) == ':') {
- scope = s - key - 1;
- key += scope + 2;
- }
+
+ const auto [scope, enumKey] = parse_scope(QLatin1StringView(key));
for (int i = 0; i < int(data.keyCount()); ++i) {
- const QByteArray className = stringData(mobj, priv(mobj->d.data)->className);
- if ((!scope || (className.size() == int(scope) && strncmp(qualified_key, className.constData(), scope) == 0))
- && strcmp(key, rawStringData(mobj, mobj->d.data[data.data() + 2*i])) == 0) {
+ if ((!scope || isScopeMatch(*scope, this))
+ && enumKey == stringDataView(mobj, mobj->d.data[data.data() + 2 * i])) {
if (ok != nullptr)
*ok = true;
return mobj->d.data[data.data() + 2 * i + 1];
@@ -2830,17 +3266,49 @@ const char *QMetaEnum::valueToKey(int value) const
return nullptr;
}
-static auto parse_scope(QLatin1String qualifiedKey) noexcept
+static bool parseEnumFlags(QByteArrayView v, QVarLengthArray<QByteArrayView, 10> &list)
{
- struct R {
- std::optional<QLatin1String> scope;
- QLatin1String key;
- };
- const auto scopePos = qualifiedKey.lastIndexOf(QLatin1String("::"));
- if (scopePos < 0)
- return R{std::nullopt, qualifiedKey};
- else
- return R{qualifiedKey.first(scopePos), qualifiedKey.sliced(scopePos + 2)};
+ v = v.trimmed();
+ if (v.empty()) {
+ qWarning("QMetaEnum::keysToValue: empty keys string.");
+ return false;
+ }
+
+ qsizetype sep = v.indexOf('|', 0);
+ if (sep == 0) {
+ qWarning("QMetaEnum::keysToValue: malformed keys string, starts with '|', \"%s\"",
+ v.constData());
+ return false;
+ }
+
+ if (sep == -1) { // One flag
+ list.push_back(v);
+ return true;
+ }
+
+ if (v.endsWith('|')) {
+ qWarning("QMetaEnum::keysToValue: malformed keys string, ends with '|', \"%s\"",
+ v.constData());
+ return false;
+ }
+
+ const auto begin = v.begin();
+ const auto end = v.end();
+ auto b = begin;
+ for (; b != end && sep != -1; sep = v.indexOf('|', sep)) {
+ list.push_back({b, begin + sep});
+ ++sep; // Skip over '|'
+ b = begin + sep;
+ if (*b == '|') {
+ qWarning("QMetaEnum::keysToValue: malformed keys string, has two consecutive '|': "
+ "\"%s\"", v.constData());
+ return false;
+ }
+ }
+
+ // The rest of the string
+ list.push_back({b, end});
+ return true;
}
/*!
@@ -2860,19 +3328,22 @@ int QMetaEnum::keysToValue(const char *keys, bool *ok) const
if (!mobj || !keys)
return -1;
- auto lookup = [&] (QLatin1String key) -> std::optional<int> {
+ auto lookup = [&] (QByteArrayView key) -> std::optional<int> {
for (int i = data.keyCount() - 1; i >= 0; --i) {
if (key == stringDataView(mobj, mobj->d.data[data.data() + 2*i]))
return mobj->d.data[data.data() + 2*i + 1];
}
return std::nullopt;
};
- auto className = [&] { return stringDataView(mobj, priv(mobj->d.data)->className); };
int value = 0;
- for (const QLatin1String &untrimmed : qTokenize(QLatin1String{keys}, QLatin1Char{'|'})) {
+ QVarLengthArray<QByteArrayView, 10> list;
+ const bool r = parseEnumFlags(QByteArrayView{keys}, list);
+ if (!r)
+ return -1;
+ for (const auto &untrimmed : list) {
const auto parsed = parse_scope(untrimmed.trimmed());
- if (parsed.scope && *parsed.scope != className())
+ if (parsed.scope && !isScopeMatch(*parsed.scope, this))
return -1; // wrong type name in qualified name
if (auto thisValue = lookup(parsed.key))
value |= *thisValue;
@@ -2917,7 +3388,7 @@ QByteArray QMetaEnum::valueToKeys(int value) const
QByteArray keys;
if (!mobj)
return keys;
- QVarLengthArray<QLatin1String, sizeof(int) * CHAR_BIT> parts;
+ QVarLengthArray<QByteArrayView, sizeof(int) * CHAR_BIT> parts;
int v = value;
// reverse iterate to ensure values like Qt::Dialog=0x2|Qt::Window are processed first.
for (int i = data.keyCount() - 1; i >= 0; --i) {
@@ -2940,8 +3411,13 @@ QMetaEnum::QMetaEnum(const QMetaObject *mobj, int index)
Q_ASSERT(index >= 0 && index < priv(mobj->d.data)->enumeratorCount);
}
+int QMetaEnum::Data::index(const QMetaObject *mobj) const
+{
+ return (d - mobj->d.data - priv(mobj->d.data)->enumeratorData) / Size;
+}
+
/*!
- \fn QMetaEnum QMetaEnum::fromType()
+ \fn template<typename T> QMetaEnum QMetaEnum::fromType()
\since 5.5
Returns the QMetaEnum corresponding to the type in the template parameter.
@@ -3027,7 +3503,7 @@ const char *QMetaProperty::typeName() const
// TODO: can the metatype be invalid for dynamic metaobjects?
if (const auto mt = metaType(); mt.isValid())
return mt.name();
- return rawTypeNameFromTypeInfo(mobj, data.type());
+ return typeNameFromTypeInfo(mobj, data.type()).constData();
}
/*! \fn QVariant::Type QMetaProperty::type() const
@@ -3160,19 +3636,20 @@ bool QMetaProperty::isAlias() const
return (data.flags() & Alias);
}
+#if QT_DEPRECATED_SINCE(6, 4)
/*!
\internal
+ Historically:
Executes metacall with QMetaObject::RegisterPropertyMetaType flag.
Returns id of registered type or QMetaType::UnknownType if a type
could not be registered for any reason.
+ Obsolete since Qt 6
*/
int QMetaProperty::registerPropertyType() const
{
- int registerResult = -1;
- void *argv[] = { &registerResult };
- mobj->static_metacall(QMetaObject::RegisterPropertyMetaType, data.index(mobj), argv);
- return registerResult == -1 ? QMetaType::UnknownType : registerResult;
+ return typeId();
}
+#endif
QMetaProperty::QMetaProperty(const QMetaObject *mobj, int index)
: mobj(mobj),
@@ -3180,37 +3657,30 @@ QMetaProperty::QMetaProperty(const QMetaObject *mobj, int index)
{
Q_ASSERT(index >= 0 && index < priv(mobj->d.data)->propertyCount);
- if (data.flags() & EnumOrFlag) {
- const char *type = rawTypeNameFromTypeInfo(mobj, data.type());
- menum = mobj->enumerator(mobj->indexOfEnumerator(type));
- if (!menum.isValid()) {
- const char *enum_name = type;
- const char *scope_name = objectClassName(mobj);
- char *scope_buffer = nullptr;
-
- const char *colon = strrchr(enum_name, ':');
- // ':' will always appear in pairs
- Q_ASSERT(colon <= enum_name || *(colon - 1) == ':');
- if (colon > enum_name) {
- int len = colon - enum_name - 1;
- scope_buffer = (char *)malloc(len + 1);
- memcpy(scope_buffer, enum_name, len);
- scope_buffer[len] = '\0';
- scope_name = scope_buffer;
- enum_name = colon + 1;
- }
+ if (!(data.flags() & EnumOrFlag))
+ return;
+ QByteArrayView enum_name = typeNameFromTypeInfo(mobj, data.type());
+ menum = mobj->enumerator(QMetaObjectPrivate::indexOfEnumerator(mobj, enum_name));
+ if (menum.isValid())
+ return;
- const QMetaObject *scope = nullptr;
- if (qstrcmp(scope_name, "Qt") == 0)
- scope = &Qt::staticMetaObject;
- else
- scope = QMetaObject_findMetaObject(mobj, scope_name);
- if (scope)
- menum = scope->enumerator(scope->indexOfEnumerator(enum_name));
- if (scope_buffer)
- free(scope_buffer);
- }
+ QByteArrayView scope_name;
+ const auto parsed = parse_scope(enum_name);
+ if (parsed.scope) {
+ scope_name = *parsed.scope;
+ enum_name = parsed.key;
+ } else {
+ scope_name = objectClassName(mobj);
}
+
+ const QMetaObject *scope = nullptr;
+ if (scope_name == "Qt")
+ scope = &Qt::staticMetaObject;
+ else
+ scope = QMetaObject_findMetaObject(mobj, QByteArrayView(scope_name));
+
+ if (scope)
+ menum = scope->enumerator(QMetaObjectPrivate::indexOfEnumerator(scope, enum_name));
}
/*!
@@ -3278,31 +3748,43 @@ QVariant QMetaProperty::read(const QObject *object) const
Writes \a value as the property's value to the given \a object. Returns
true if the write succeeded; otherwise returns \c false.
- If \a value is not of the same type type as the property, a conversion
+ If \a value is not of the same type as the property, a conversion
is attempted. An empty QVariant() is equivalent to a call to reset()
if this property is resettable, or setting a default-constructed object
otherwise.
+ \note This function internally makes a copy of \a value. Prefer to use the
+ rvalue overload when possible.
+
\sa read(), reset(), isWritable()
*/
bool QMetaProperty::write(QObject *object, const QVariant &value) const
{
if (!object || !isWritable())
return false;
+ return write(object, QVariant(value));
+}
- QVariant v = value;
+/*!
+ \overload
+ \since 6.6
+*/
+bool QMetaProperty::write(QObject *object, QVariant &&v) const
+{
+ if (!object || !isWritable())
+ return false;
QMetaType t(mobj->d.metaTypes[data.index(mobj)]);
if (t != QMetaType::fromType<QVariant>() && t != v.metaType()) {
if (isEnumType() && !t.metaObject() && v.metaType().id() == QMetaType::QString) {
// Assigning a string to a property of type Q_ENUMS (instead of Q_ENUM)
bool ok;
if (isFlagType())
- v = QVariant(menum.keysToValue(value.toByteArray(), &ok));
+ v = QVariant(menum.keysToValue(v.toByteArray(), &ok));
else
- v = QVariant(menum.keyToValue(value.toByteArray(), &ok));
+ v = QVariant(menum.keyToValue(v.toByteArray(), &ok));
if (!ok)
return false;
- } else if (!value.isValid()) {
+ } else if (!v.isValid()) {
if (isResettable())
return reset(object);
v = QVariant(t, nullptr);
@@ -3397,6 +3879,16 @@ bool QMetaProperty::writeOnGadget(void *gadget, const QVariant &value) const
}
/*!
+ \overload
+ \since 6.6
+*/
+bool QMetaProperty::writeOnGadget(void *gadget, QVariant &&value) const
+{
+ Q_ASSERT(priv(mobj->d.data)->flags & PropertyAccessInStaticMetaCall && mobj->d.static_metacall);
+ return write(reinterpret_cast<QObject*>(gadget), std::move(value));
+}
+
+/*!
\since 5.5
Resets the property for the given \a gadget with a reset method.
@@ -3480,20 +3972,23 @@ int QMetaProperty::notifySignalIndex() const
if (!mobj || data.notifyIndex() == std::numeric_limits<uint>::max())
return -1;
uint methodIndex = data.notifyIndex();
- if (methodIndex & IsUnresolvedSignal) {
- methodIndex &= ~IsUnresolvedSignal;
- const QByteArray signalName = stringData(mobj, methodIndex);
- const QMetaObject *m = mobj;
- const int idx = QMetaObjectPrivate::indexOfMethodRelative<MethodSignal>(&m, signalName, 0, nullptr);
- if (idx >= 0) {
- return idx + m->methodOffset();
- } else {
- qWarning("QMetaProperty::notifySignal: cannot find the NOTIFY signal %s in class %s for property '%s'",
- signalName.constData(), objectClassName(mobj), name());
- return -1;
- }
- }
- return methodIndex + mobj->methodOffset();
+ if (!(methodIndex & IsUnresolvedSignal))
+ return methodIndex + mobj->methodOffset();
+ methodIndex &= ~IsUnresolvedSignal;
+ const QByteArray signalName = stringData(mobj, methodIndex);
+ const QMetaObject *m = mobj;
+ // try 0-arg signal
+ int idx = QMetaObjectPrivate::indexOfMethodRelative<MethodSignal>(&m, signalName, 0, nullptr);
+ if (idx >= 0)
+ return idx + m->methodOffset();
+ // try 1-arg signal
+ QArgumentType argType(typeId());
+ idx = QMetaObjectPrivate::indexOfMethodRelative<MethodSignal>(&m, signalName, 1, &argType);
+ if (idx >= 0)
+ return idx + m->methodOffset();
+ qWarning("QMetaProperty::notifySignal: cannot find the NOTIFY signal %s in class %s for property '%s'",
+ signalName.constData(), mobj->className(), name());
+ return -1;
}
// This method has been around for a while, but the documentation was marked \internal until 5.1
@@ -3654,8 +4149,11 @@ bool QMetaProperty::isBindable() const
\snippet code/src_corelib_kernel_qmetaobject.cpp 5
- This mechanism is free for you to use in your Qt applications. Qt
- doesn't use it for any of its classes.
+ This mechanism is free for you to use in your Qt applications.
+
+ \note It's also used by the \l[ActiveQt]{Active Qt},
+ \l[QtDBus]{Qt D-Bus}, \l[QtQml]{Qt Qml}, and \l{Qt Remote Objects}
+ modules. Some keys might be set when using these modules.
\sa QMetaObject
*/
@@ -3709,23 +4207,24 @@ const char *QMetaClassInfo::value() const
*/
/*!
- \macro QGenericArgument Q_ARG(Type, const Type &value)
+ \macro QMetaMethodArgument Q_ARG(Type, const Type &value)
\relates QMetaObject
This macro takes a \a Type and a \a value of that type and
- returns a \l QGenericArgument object that can be passed to
- QMetaObject::invokeMethod().
+ returns a QMetaMethodArgument, which can be passed to the template
+ QMetaObject::invokeMethod() with the \c {Args &&...} arguments.
\sa Q_RETURN_ARG()
*/
/*!
- \macro QGenericReturnArgument Q_RETURN_ARG(Type, Type &value)
+ \macro QMetaMethodReturnArgument Q_RETURN_ARG(Type, Type &value)
\relates QMetaObject
This macro takes a \a Type and a non-const reference to a \a
- value of that type and returns a QGenericReturnArgument object
- that can be passed to QMetaObject::invokeMethod().
+ value of that type and returns a QMetaMethodReturnArgument, which can be
+ passed to the template QMetaObject::invokeMethod() with the \c {Args &&...}
+ arguments.
\sa Q_ARG()
*/
diff --git a/src/corelib/kernel/qmetaobject.h b/src/corelib/kernel/qmetaobject.h
index 6fe259868f..91f287a8d3 100644
--- a/src/corelib/kernel/qmetaobject.h
+++ b/src/corelib/kernel/qmetaobject.h
@@ -1,47 +1,12 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2014 Olivier Goffart <ogoffart@woboq.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2014 Olivier Goffart <ogoffart@woboq.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QMETAOBJECT_H
#define QMETAOBJECT_H
#include <QtCore/qobjectdefs.h>
+#include <QtCore/qcompare.h>
#include <QtCore/qvariant.h>
QT_BEGIN_NAMESPACE
@@ -81,6 +46,7 @@ public:
inline const QMetaObject *enclosingMetaObject() const { return mobj; }
+#if QT_VERSION <= QT_VERSION_CHECK(7, 0, 0)
bool invoke(QObject *object,
Qt::ConnectionType connectionType,
QGenericReturnArgument returnValue,
@@ -112,7 +78,7 @@ public:
}
inline bool invoke(QObject *object,
Qt::ConnectionType connectionType,
- QGenericArgument val0 = QGenericArgument(nullptr),
+ QGenericArgument val0,
QGenericArgument val1 = QGenericArgument(),
QGenericArgument val2 = QGenericArgument(),
QGenericArgument val3 = QGenericArgument(),
@@ -127,7 +93,7 @@ public:
val0, val1, val2, val3, val4, val5, val6, val7, val8, val9);
}
inline bool invoke(QObject *object,
- QGenericArgument val0 = QGenericArgument(nullptr),
+ QGenericArgument val0,
QGenericArgument val1 = QGenericArgument(),
QGenericArgument val2 = QGenericArgument(),
QGenericArgument val3 = QGenericArgument(),
@@ -154,7 +120,7 @@ public:
QGenericArgument val8 = QGenericArgument(),
QGenericArgument val9 = QGenericArgument()) const;
inline bool invokeOnGadget(void *gadget,
- QGenericArgument val0 = QGenericArgument(nullptr),
+ QGenericArgument val0,
QGenericArgument val1 = QGenericArgument(),
QGenericArgument val2 = QGenericArgument(),
QGenericArgument val3 = QGenericArgument(),
@@ -168,6 +134,78 @@ public:
return invokeOnGadget(gadget, QGenericReturnArgument(),
val0, val1, val2, val3, val4, val5, val6, val7, val8, val9);
}
+#endif
+
+ template <typename ReturnArg, typename... Args>
+#ifdef Q_QDOC
+ bool
+#else
+ QtPrivate::Invoke::IfNotOldStyleArgs<bool, Args...>
+#endif
+ invoke(QObject *obj, Qt::ConnectionType c, QTemplatedMetaMethodReturnArgument<ReturnArg> r,
+ Args &&... arguments) const
+ {
+ auto h = QtPrivate::invokeMethodHelper(r, std::forward<Args>(arguments)...);
+ return invokeImpl(*this, obj, c, h.parameterCount(), h.parameters.data(),
+ h.typeNames.data(), h.metaTypes.data());
+ }
+
+ template <typename... Args>
+#ifdef Q_QDOC
+ bool
+#else
+ QtPrivate::Invoke::IfNotOldStyleArgs<bool, Args...>
+#endif
+ invoke(QObject *obj, Qt::ConnectionType c, Args &&... arguments) const
+ {
+ return invoke(obj, c, QTemplatedMetaMethodReturnArgument<void>{}, std::forward<Args>(arguments)...);
+ }
+
+ template <typename ReturnArg, typename... Args>
+#ifdef Q_QDOC
+ bool
+#else
+ QtPrivate::Invoke::IfNotOldStyleArgs<bool, Args...>
+#endif
+ invoke(QObject *obj, QTemplatedMetaMethodReturnArgument<ReturnArg> r, Args &&... arguments) const
+ {
+ return invoke(obj, Qt::AutoConnection, r, std::forward<Args>(arguments)...);
+ }
+
+ template <typename... Args>
+#ifdef Q_QDOC
+ bool
+#else
+ QtPrivate::Invoke::IfNotOldStyleArgs<bool, Args...>
+#endif
+ invoke(QObject *obj, Args &&... arguments) const
+ {
+ return invoke(obj, Qt::AutoConnection, std::forward<Args>(arguments)...);
+ }
+
+ template <typename ReturnArg, typename... Args>
+#ifdef Q_QDOC
+ bool
+#else
+ QtPrivate::Invoke::IfNotOldStyleArgs<bool, Args...>
+#endif
+ invokeOnGadget(void *gadget, QTemplatedMetaMethodReturnArgument<ReturnArg> r, Args &&... arguments) const
+ {
+ auto h = QtPrivate::invokeMethodHelper(r, std::forward<Args>(arguments)...);
+ return invokeImpl(*this, gadget, Qt::ConnectionType(-1), h.parameterCount(),
+ h.parameters.data(), h.typeNames.data(), h.metaTypes.data());
+ }
+
+ template <typename... Args>
+#ifdef Q_QDOC
+ bool
+#else
+ QtPrivate::Invoke::IfNotOldStyleArgs<bool, Args...>
+#endif
+ invokeOnGadget(void *gadget, Args &&... arguments) const
+ {
+ return invokeOnGadget(gadget, QTemplatedMetaMethodReturnArgument<void>{}, std::forward<Args>(arguments)...);
+ }
inline bool isValid() const { return mobj != nullptr; }
@@ -182,10 +220,14 @@ public:
}
private:
+ static bool invokeImpl(QMetaMethod self, void *target, Qt::ConnectionType, qsizetype paramCount,
+ const void *const *parameters, const char *const *typeNames,
+ const QtPrivate::QMetaTypeInterface *const *metaTypes);
static QMetaMethod fromSignalImpl(const QMetaObject *, void **);
static QMetaMethod fromRelativeMethodIndex(const QMetaObject *mobj, int index);
static QMetaMethod fromRelativeConstructorIndex(const QMetaObject *mobj, int index);
+protected:
struct Data {
enum { Size = 6 };
@@ -199,20 +241,22 @@ private:
const uint *d;
};
+private:
constexpr QMetaMethod(const QMetaObject *metaObject, const Data &data_)
: mobj(metaObject), data(data_)
{}
+protected:
const QMetaObject *mobj;
Data data;
- friend class QMetaMethodPrivate;
friend struct QMetaObject;
friend struct QMetaObjectPrivate;
friend class QObject;
- friend bool operator==(const QMetaMethod &m1, const QMetaMethod &m2) noexcept
- { return m1.data == m2.data; }
- friend bool operator!=(const QMetaMethod &m1, const QMetaMethod &m2) noexcept
- { return !(m1 == m2); }
+
+private:
+ friend bool comparesEqual(const QMetaMethod &lhs, const QMetaMethod &rhs) noexcept
+ { return lhs.data == rhs.data; }
+ Q_DECLARE_EQUALITY_COMPARABLE(QMetaMethod)
};
Q_DECLARE_TYPEINFO(QMetaMethod, Q_RELOCATABLE_TYPE);
@@ -223,6 +267,8 @@ public:
const char *name() const;
const char *enumName() const;
+ QMetaType metaType() const;
+
bool isFlag() const;
bool isScoped() const;
@@ -260,6 +306,7 @@ private:
quint32 flags() const { return d[2]; }
qint32 keyCount() const { return static_cast<qint32>(d[3]); }
quint32 data() const { return d[4]; }
+ int index(const QMetaObject *mobj) const;
const uint *d;
};
@@ -318,12 +365,14 @@ public:
QVariant read(const QObject *obj) const;
bool write(QObject *obj, const QVariant &value) const;
+ bool write(QObject *obj, QVariant &&value) const;
bool reset(QObject *obj) const;
QUntypedBindable bindable(QObject *object) const;
QVariant readOnGadget(const void *gadget) const;
bool writeOnGadget(void *gadget, const QVariant &value) const;
+ bool writeOnGadget(void *gadget, QVariant &&value) const;
bool resetOnGadget(void *gadget) const;
bool hasStdCppSet() const;
@@ -332,7 +381,10 @@ public:
inline const QMetaObject *enclosingMetaObject() const { return mobj; }
private:
+#if QT_DEPRECATED_SINCE(6, 4)
+ QT_DEPRECATED_VERSION_X_6_4("obsolete, simply returns typeId()")
int registerPropertyType() const;
+#endif
struct Data {
enum { Size = 5 };
diff --git a/src/corelib/kernel/qmetaobject_moc_p.h b/src/corelib/kernel/qmetaobject_moc_p.h
index 9770d9c576..ad8c6f92d6 100644
--- a/src/corelib/kernel/qmetaobject_moc_p.h
+++ b/src/corelib/kernel/qmetaobject_moc_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2019 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#if !defined(QMETAOBJECT_P_H) && !defined(UTILS_H)
# error "Include qmetaobject_p.h (or moc's utils.h) before including this file."
@@ -53,6 +17,7 @@
//
#include <QtCore/qbytearray.h>
+#include <QtCore/private/qglobal_p.h>
QT_BEGIN_NAMESPACE
diff --git a/src/corelib/kernel/qmetaobject_p.h b/src/corelib/kernel/qmetaobject_p.h
index 35aa6ea6b9..d2c36fceb4 100644
--- a/src/corelib/kernel/qmetaobject_p.h
+++ b/src/corelib/kernel/qmetaobject_p.h
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Copyright (C) 2014 Olivier Goffart <ogoffart@woboq.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// Copyright (C) 2014 Olivier Goffart <ogoffart@woboq.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QMETAOBJECT_P_H
#define QMETAOBJECT_P_H
@@ -59,11 +23,14 @@
#ifndef QT_NO_QOBJECT
#include <private/qobject_p.h> // For QObjectPrivate::Connection
#endif
+#include <private/qtools_p.h>
#include <QtCore/qvarlengtharray.h>
QT_BEGIN_NAMESPACE
// ### TODO - QTBUG-87869: wrap in a proper Q_NAMESPACE and use scoped enums, to avoid name clashes
+using namespace QtMiscUtils;
+
enum PropertyFlags {
Invalid = 0x00000000,
Readable = 0x00000001,
@@ -167,7 +134,38 @@ Q_DECLARE_TYPEINFO(QArgumentType, Q_RELOCATABLE_TYPE);
typedef QVarLengthArray<QArgumentType, 10> QArgumentTypeArray;
-class QMetaMethodPrivate;
+namespace { class QMetaMethodPrivate; }
+class QMetaMethodInvoker : public QMetaMethod
+{
+ QMetaMethodInvoker() = delete;
+
+public:
+ enum class InvokeFailReason : int {
+ // negative values mean a match was found but the invocation failed
+ // (and a warning has been printed)
+ ReturnTypeMismatch = -1,
+ DeadLockDetected = -2,
+ CallViaVirtualFailed = -3, // no warning
+ ConstructorCallOnObject = -4,
+ ConstructorCallWithoutResult = -5,
+ ConstructorCallFailed = -6, // no warning
+
+ CouldNotQueueParameter = -0x1000,
+
+ // zero is success
+ None = 0,
+
+ // positive values mean the parameters did not match
+ TooFewArguments,
+ FormalParameterMismatch = 0x1000,
+ };
+
+ // shadows the public function
+ static InvokeFailReason Q_CORE_EXPORT
+ invokeImpl(QMetaMethod self, void *target, Qt::ConnectionType, qsizetype paramCount,
+ const void *const *parameters, const char *const *typeNames,
+ const QtPrivate::QMetaTypeInterface *const *metaTypes);
+};
struct QMetaObjectPrivate
{
@@ -176,7 +174,9 @@ struct QMetaObjectPrivate
// revision 9 is Qt 6.0: It adds the metatype of properties and methods
// revision 10 is Qt 6.2: The metatype of the metaobject is stored in the metatypes array
// and metamethods store a flag stating whether they are const
- enum { OutputRevision = 10 }; // Used by moc, qmetaobjectbuilder and qdbus
+ // revision 11 is Qt 6.5: The metatype for void is stored in the metatypes array
+ // revision 12 is Qt 6.6: It adds the metatype for enums
+ enum { OutputRevision = 12 }; // Used by moc, qmetaobjectbuilder and qdbus
enum { IntsPerMethod = QMetaMethod::Data::Size };
enum { IntsPerEnum = QMetaEnum::Data::Size };
enum { IntsPerProperty = QMetaProperty::Data::Size };
@@ -212,6 +212,11 @@ struct QMetaObjectPrivate
int argc, const QArgumentType *types);
static int indexOfConstructor(const QMetaObject *m, const QByteArray &name,
int argc, const QArgumentType *types);
+
+ enum class Which { Name, Alias };
+ static int indexOfEnumerator(const QMetaObject *m, QByteArrayView name, Which which);
+ static int indexOfEnumerator(const QMetaObject *m, QByteArrayView name);
+
Q_CORE_EXPORT static QMetaMethod signal(const QMetaObject *m, int signal_index);
static inline int signalOffset(const QMetaObject *m)
{
@@ -269,11 +274,7 @@ enum { MetaObjectPrivateFieldCount = sizeof(QMetaObjectPrivate) / sizeof(int) };
// mirrored in moc's utils.h
static inline bool is_ident_char(char s)
{
- return ((s >= 'a' && s <= 'z')
- || (s >= 'A' && s <= 'Z')
- || (s >= '0' && s <= '9')
- || s == '_'
- );
+ return isAsciiLetterOrNumber(s) || s == '_';
}
static inline bool is_space(char s)
diff --git a/src/corelib/kernel/qmetaobjectbuilder.cpp b/src/corelib/kernel/qmetaobjectbuilder.cpp
index 1a95d7265f..c2b44a4f00 100644
--- a/src/corelib/kernel/qmetaobjectbuilder.cpp
+++ b/src/corelib/kernel/qmetaobjectbuilder.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qmetaobjectbuilder_p.h"
@@ -89,7 +53,7 @@ Q_CORE_EXPORT bool isBuiltinType(const QByteArray &type)
} // namespace QtPrivate
// copied from qmetaobject.cpp
-[[maybe_unused]] static inline const QMetaObjectPrivate *priv(const uint* data)
+[[maybe_unused]] static inline const QMetaObjectPrivate *qmobPriv(const uint* data)
{ return reinterpret_cast<const QMetaObjectPrivate*>(data); }
class QMetaMethodBuilderPrivate
@@ -195,6 +159,7 @@ public:
QByteArray name;
QByteArray enumName;
+ QMetaType metaType;
bool isFlag;
bool isScoped;
QList<QByteArray> keys;
@@ -558,7 +523,7 @@ QMetaMethodBuilder QMetaObjectBuilder::addConstructor(const QMetaMethod &prototy
QMetaPropertyBuilder QMetaObjectBuilder::addProperty(const QByteArray &name, const QByteArray &type,
int notifierId)
{
- return addProperty(name, type, QMetaType::fromName(name), notifierId);
+ return addProperty(name, type, QMetaType::fromName(type), notifierId);
}
/*!
@@ -633,6 +598,7 @@ QMetaEnumBuilder QMetaObjectBuilder::addEnumerator(const QMetaEnum &prototype)
{
QMetaEnumBuilder en = addEnumerator(prototype.name());
en.setEnumName(prototype.enumName());
+ en.setMetaType(prototype.metaType());
en.setIsFlag(prototype.isFlag());
en.setIsScoped(prototype.isScoped());
int count = prototype.keyCount();
@@ -740,7 +706,7 @@ void QMetaObjectBuilder::addMetaObject(const QMetaObject *prototype,
}
if ((members & RelatedMetaObjects) != 0) {
- Q_ASSERT(priv(prototype->d.data)->revision >= 2);
+ Q_ASSERT(qmobPriv(prototype->d.data)->revision >= 2);
const auto *objects = prototype->d.relatedMetaObjects;
if (objects) {
while (*objects != nullptr) {
@@ -751,7 +717,7 @@ void QMetaObjectBuilder::addMetaObject(const QMetaObject *prototype,
}
if ((members & StaticMetacall) != 0) {
- Q_ASSERT(priv(prototype->d.data)->revision >= 6);
+ Q_ASSERT(qmobPriv(prototype->d.data)->revision >= 6);
if (prototype->d.static_metacall)
setStaticMetacallFunction(prototype->d.static_metacall);
}
@@ -1062,6 +1028,9 @@ int QMetaObjectBuilder::indexOfClassInfo(const QByteArray &name)
}
// Align on a specific type boundary.
+#ifdef ALIGN
+# undef ALIGN
+#endif
#define ALIGN(size,type) \
(size) = ((size) + sizeof(type) - 1) & ~(sizeof(type) - 1)
@@ -1193,8 +1162,8 @@ static int buildMetaObject(QMetaObjectBuilderPrivate *d, char *buf,
}
// Populate the QMetaObjectPrivate structure.
- QMetaObjectPrivate *pmeta
- = reinterpret_cast<QMetaObjectPrivate *>(buf + size);
+ QMetaObjectPrivate *pmeta = buf ? reinterpret_cast<QMetaObjectPrivate *>(buf + size)
+ : nullptr;
//int pmetaSize = size;
dataIndex = MetaObjectPrivateFieldCount;
int methodParametersDataSize =
@@ -1203,7 +1172,7 @@ static int buildMetaObject(QMetaObjectBuilderPrivate *d, char *buf,
- int(d->methods.size()) // return "parameters" don't have names
- int(d->constructors.size()); // "this" parameters don't have names
if constexpr (mode == Construct) {
- static_assert(QMetaObjectPrivate::OutputRevision == 10, "QMetaObjectBuilder should generate the same version as moc");
+ static_assert(QMetaObjectPrivate::OutputRevision == 12, "QMetaObjectBuilder should generate the same version as moc");
pmeta->revision = QMetaObjectPrivate::OutputRevision;
pmeta->flags = d->flags.toInt();
pmeta->className = 0; // Class name is always the first string.
@@ -1439,41 +1408,39 @@ static int buildMetaObject(QMetaObjectBuilderPrivate *d, char *buf,
size += sizeof(SuperData) * (d->relatedMetaObjects.size() + 1);
}
- if (d->properties.size() > 0 || d->methods.size() > 0 || d->constructors.size() > 0) {
- ALIGN(size, QtPrivate::QMetaTypeInterface *);
- auto types = reinterpret_cast<QtPrivate::QMetaTypeInterface **>(buf + size);
- if constexpr (mode == Construct) {
- meta->d.metaTypes = types;
- for (const auto &prop : d->properties) {
- QMetaType mt = prop.metaType;
+ ALIGN(size, QtPrivate::QMetaTypeInterface *);
+ auto types = reinterpret_cast<QtPrivate::QMetaTypeInterface **>(buf + size);
+ if constexpr (mode == Construct) {
+ meta->d.metaTypes = types;
+ for (const auto &prop : d->properties) {
+ QMetaType mt = prop.metaType;
+ *types = reinterpret_cast<QtPrivate::QMetaTypeInterface *&>(mt);
+ types++;
+ }
+ // add metatype interface for this metaobject - must be null
+ // as we can't know our metatype
+ *types = nullptr;
+ types++;
+ for (const auto &method: d->methods) {
+ QMetaType mt(QMetaType::fromName(method.returnType).id());
+ *types = reinterpret_cast<QtPrivate::QMetaTypeInterface *&>(mt);
+ types++;
+ for (const auto &parameterType: method.parameterTypes()) {
+ QMetaType mt = QMetaType::fromName(parameterType);
*types = reinterpret_cast<QtPrivate::QMetaTypeInterface *&>(mt);
types++;
}
- // add metatype interface for this metaobject - must be null
- // as we can't know our metatype
- *types = nullptr;
- types++;
- for (const auto &method: d->methods) {
- QMetaType mt(QMetaType::fromName(method.returnType).id());
+ }
+ for (const auto &constructor : d->constructors) {
+ for (const auto &parameterType : constructor.parameterTypes()) {
+ QMetaType mt = QMetaType::fromName(parameterType);
*types = reinterpret_cast<QtPrivate::QMetaTypeInterface *&>(mt);
types++;
- for (const auto &parameterType: method.parameterTypes()) {
- QMetaType mt = QMetaType::fromName(parameterType);
- *types = reinterpret_cast<QtPrivate::QMetaTypeInterface *&>(mt);
- types++;
- }
- }
- for (const auto &constructor : d->constructors) {
- for (const auto &parameterType : constructor.parameterTypes()) {
- QMetaType mt = QMetaType::fromName(parameterType);
- *types = reinterpret_cast<QtPrivate::QMetaTypeInterface *&>(mt);
- types++;
- }
}
}
- // parameterMetaTypesIndex is equal to the total number of metatypes
- size += sizeof(QMetaType) * parameterMetaTypesIndex;
}
+ // parameterMetaTypesIndex is equal to the total number of metatypes
+ size += sizeof(QMetaType) * parameterMetaTypesIndex;
// Align the final size and return it.
ALIGN(size, void *);
@@ -2341,6 +2308,31 @@ void QMetaEnumBuilder::setEnumName(const QByteArray &alias)
}
/*!
+ Returns the meta type of the enumerator.
+
+ \since 6.6
+*/
+QMetaType QMetaEnumBuilder::metaType() const
+{
+ if (QMetaEnumBuilderPrivate *d = d_func())
+ return d->metaType;
+ return QMetaType();
+}
+
+/*!
+ Sets this enumerator to have the given \c metaType.
+
+ \since 6.6
+ \sa metaType()
+*/
+void QMetaEnumBuilder::setMetaType(QMetaType metaType)
+{
+ QMetaEnumBuilderPrivate *d = d_func();
+ if (d)
+ d->metaType = metaType;
+}
+
+/*!
Returns \c true if this enumerator is used as a flag; otherwise returns
false.
diff --git a/src/corelib/kernel/qmetaobjectbuilder_p.h b/src/corelib/kernel/qmetaobjectbuilder_p.h
index 925fed694b..b52487986c 100644
--- a/src/corelib/kernel/qmetaobjectbuilder_p.h
+++ b/src/corelib/kernel/qmetaobjectbuilder_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QMETAOBJECTBUILDER_P_H
#define QMETAOBJECTBUILDER_P_H
@@ -294,6 +258,9 @@ public:
QByteArray enumName() const;
void setEnumName(const QByteArray &alias);
+ QMetaType metaType() const;
+ void setMetaType(QMetaType metaType);
+
bool isFlag() const;
void setIsFlag(bool value);
diff --git a/src/corelib/kernel/qmetatype.cpp b/src/corelib/kernel/qmetatype.cpp
index 9494ff84f9..387c0f49ab 100644
--- a/src/corelib/kernel/qmetatype.cpp
+++ b/src/corelib/kernel/qmetatype.cpp
@@ -1,41 +1,7 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// Copyright (C) 2021 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com
+// Copyright (C) 2021 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qmetatype.h"
#include "qmetatype_p.h"
@@ -43,6 +9,8 @@
#include "qdatetime.h"
#include "qbytearray.h"
#include "qreadwritelock.h"
+#include "qhash.h"
+#include "qmap.h"
#include "qstring.h"
#include "qstringlist.h"
#include "qlist.h"
@@ -52,14 +20,14 @@
#include "qeasingcurve.h"
#endif
#include "quuid.h"
-#include "qvariant.h"
-#include "qdatastream.h"
#if QT_CONFIG(regularexpression)
# include "qregularexpression.h"
#endif
#ifndef QT_BOOTSTRAPPED
+# include "qdatastream.h"
+
# include "qbitarray.h"
# include "qurl.h"
# include "qvariant.h"
@@ -74,6 +42,7 @@
# include "qmetaobject.h"
# include "qsequentialiterable.h"
# include "qassociativeiterable.h"
+# include "qobject.h"
#endif
#if QT_CONFIG(itemmodel)
@@ -87,7 +56,6 @@
# include "qline.h"
#endif
-#include <bitset>
#include <new>
#include <cstring>
@@ -95,37 +63,64 @@ QT_BEGIN_NAMESPACE
#define NS(x) QT_PREPEND_NAMESPACE(x)
+QT_IMPL_METATYPE_EXTERN_TAGGED(QtMetaTypePrivate::QPairVariantInterfaceImpl, QPairVariantInterfaceImpl)
+
+using QtMetaTypePrivate::isInterfaceFor;
namespace {
-struct DefinedTypesFilter {
- template<typename T>
- struct Acceptor {
- static const bool IsAccepted = QtMetaTypePrivate::TypeDefinition<T>::IsAvailable && QModulesPrivate::QTypeModuleInfo<T>::IsCore;
- };
+struct QMetaTypeDeleter
+{
+ const QtPrivate::QMetaTypeInterface *iface;
+ void operator()(void *data)
+ {
+ if (iface->alignment > __STDCPP_DEFAULT_NEW_ALIGNMENT__) {
+ operator delete(data, std::align_val_t(iface->alignment));
+ } else {
+ operator delete(data);
+ }
+ }
};
struct QMetaTypeCustomRegistry
{
+
+#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0) && !defined(QT_BOOTSTRAPPED)
+ QMetaTypeCustomRegistry()
+ {
+ /* qfloat16 was neither a builtin, nor unconditionally registered
+ in QtCore in Qt <= 6.2.
+ Inserting it as an alias ensures that a QMetaType::id call
+ will get the correct built-in type-id (the interface pointers
+ might still not match, but we already deal with that case.
+ */
+ aliases.insert("qfloat16", QtPrivate::qMetaTypeInterfaceForType<qfloat16>());
+ }
+#endif
+
QReadWriteLock lock;
QList<const QtPrivate::QMetaTypeInterface *> registry;
QHash<QByteArray, const QtPrivate::QMetaTypeInterface *> aliases;
// index of first empty (unregistered) type in registry, if any.
int firstEmpty = 0;
- int registerCustomType(const QtPrivate::QMetaTypeInterface *ti)
+ int registerCustomType(const QtPrivate::QMetaTypeInterface *cti)
{
+ // we got here because cti->typeId is 0, so this is a custom meta type
+ // (not read-only)
+ auto ti = const_cast<QtPrivate::QMetaTypeInterface *>(cti);
{
QWriteLocker l(&lock);
- if (ti->typeId)
- return ti->typeId;
+ if (int id = ti->typeId.loadRelaxed())
+ return id;
QByteArray name =
#ifndef QT_NO_QOBJECT
QMetaObject::normalizedType
#endif
(ti->name);
if (auto ti2 = aliases.value(name)) {
- ti->typeId.storeRelaxed(ti2->typeId.loadRelaxed());
- return ti2->typeId;
+ const auto id = ti2->typeId.loadRelaxed();
+ ti->typeId.storeRelaxed(id);
+ return id;
}
aliases[name] = ti;
int size = registry.size();
@@ -138,11 +133,11 @@ struct QMetaTypeCustomRegistry
registry.append(ti);
firstEmpty = registry.size();
}
- ti->typeId = firstEmpty + QMetaType::User;
+ ti->typeId.storeRelaxed(firstEmpty + QMetaType::User);
}
if (ti->legacyRegisterOp)
ti->legacyRegisterOp();
- return ti->typeId;
+ return ti->typeId.loadRelaxed();
};
void unregisterDynamicType(int id)
@@ -155,13 +150,7 @@ struct QMetaTypeCustomRegistry
auto &ti = registry[idx];
// We must unregister all names.
- auto it = aliases.begin();
- while (it != aliases.end()) {
- if (it.value() == ti)
- it = aliases.erase(it);
- else
- ++it;
- }
+ aliases.removeIf([ti] (const auto &kv) { return kv.value() == ti; });
ti = nullptr;
@@ -179,6 +168,44 @@ Q_GLOBAL_STATIC(QMetaTypeCustomRegistry, customTypeRegistry)
} // namespace
+// used by QVariant::save(): returns the name used in the Q_DECLARE_METATYPE
+// macro (one of them, indetermine which one)
+const char *QtMetaTypePrivate::typedefNameForType(const QtPrivate::QMetaTypeInterface *type_d)
+{
+ const char *name = nullptr;
+ if (!customTypeRegistry.exists())
+ return name;
+ QMetaTypeCustomRegistry *r = &*customTypeRegistry;
+
+ QByteArrayView officialName(type_d->name);
+ QReadLocker l(&r->lock);
+ auto it = r->aliases.constBegin();
+ auto end = r->aliases.constEnd();
+ for ( ; it != end; ++it) {
+ if (it.value() != type_d)
+ continue;
+ if (it.key() == officialName)
+ continue; // skip the official name
+ name = it.key().constData();
+ ++it;
+ break;
+ }
+
+#ifndef QT_NO_DEBUG
+ QByteArrayList otherNames;
+ for ( ; it != end; ++it) {
+ if (it.value() == type_d && it.key() != officialName)
+ otherNames << it.key();
+ }
+ l.unlock();
+ if (!otherNames.isEmpty())
+ qWarning("QMetaType: type %s has more than one typedef alias: %s, %s",
+ type_d->name, name, otherNames.join(", ").constData());
+#endif
+
+ return name;
+}
+
/*!
\macro Q_DECLARE_OPAQUE_POINTER(PointerType)
\relates QMetaType
@@ -235,7 +262,7 @@ Q_GLOBAL_STATIC(QMetaTypeCustomRegistry, customTypeRegistry)
\li Pointers to classes derived from QObject
\li QList<T>, QQueue<T>, QStack<T> or QSet<T>
where T is a registered meta type
- \li QHash<T1, T2>, QMap<T1, T2> or QPair<T1, T2> where T1 and T2 are
+ \li QHash<T1, T2>, QMap<T1, T2> or std::pair<T1, T2> where T1 and T2 are
registered meta types
\li QPointer<T>, QSharedPointer<T>, QWeakPointer<T>, where T is a class that derives from QObject
\li Enumerations registered with Q_ENUM or Q_FLAG
@@ -333,8 +360,12 @@ Q_GLOBAL_STATIC(QMetaTypeCustomRegistry, customTypeRegistry)
\value SChar \c{signed char}
\value UChar \c{unsigned char}
\value Float \c float
+ \value Float16 qfloat16
+ \omitvalue Float128
+ \omitvalue BFloat16
+ \omitvalue Int128
+ \omitvalue UInt128
\value QObjectStar QObject *
- \value QVariant QVariant
\value QCursor QCursor
\value QDate QDate
@@ -352,6 +383,7 @@ Q_GLOBAL_STATIC(QMetaTypeCustomRegistry, customTypeRegistry)
\value QStringList QStringList
\value QVariantMap QVariantMap
\value QVariantHash QVariantHash
+ \value QVariantPair QVariantPair
\value QIcon QIcon
\value QPen QPen
\value QLineF QLineF
@@ -392,13 +424,13 @@ Q_GLOBAL_STATIC(QMetaTypeCustomRegistry, customTypeRegistry)
\value QPersistentModelIndex QPersistentModelIndex (introduced in Qt 5.5)
\value QUuid QUuid
\value QByteArrayList QByteArrayList
+ \value QVariant QVariant
\value User Base value for user types
\value UnknownType This is an invalid type id. It is returned from QMetaType for types that are not registered
- \omitvalue LastCoreType
- \omitvalue LastGuiType
- Additional types can be registered using Q_DECLARE_METATYPE().
+ Additional types can be registered using qRegisterMetaType() or by calling
+ registerType().
\sa type(), typeName()
*/
@@ -408,21 +440,31 @@ Q_GLOBAL_STATIC(QMetaTypeCustomRegistry, customTypeRegistry)
The enum describes attributes of a type supported by QMetaType.
- \value NeedsConstruction This type has non-trivial constructors. If the flag is not set instances can be safely initialized with memset to 0.
- \value NeedsDestruction This type has a non-trivial destructor. If the flag is not set calls to the destructor are not necessary before discarding objects.
+ \value NeedsConstruction This type has a default constructor. If the flag is not set, instances can be safely initialized with memset to 0.
+ \value NeedsCopyConstruction (since 6.5) This type has a non-trivial copy constructor. If the flag is not set, instances can be copied with memcpy.
+ \value NeedsMoveConstruction (since 6.5) This type has a non-trivial move constructor. If the flag is not set, instances can be moved with memcpy.
+ \value NeedsDestruction This type has a non-trivial destructor. If the flag is not set, calls to the destructor are not necessary before discarding objects.
\value RelocatableType An instance of a type having this attribute can be safely moved to a different memory location using memcpy.
\omitvalue MovableType
\omitvalue SharedPointerToQObject
\value IsEnumeration This type is an enumeration.
\value IsUnsignedEnumeration If the type is an Enumeration, its underlying type is unsigned.
- \value PointerToQObject This type is a pointer to a derived of QObject.
+ \value PointerToQObject This type is a pointer to a class derived from QObject.
\value IsPointer This type is a pointer to another type.
\omitvalue WeakPointerToQObject
\omitvalue TrackingPointerToQObject
- \omitvalue IsGadget \omit This type is a Q_GADGET and it's corresponding QMetaObject can be accessed with QMetaType::metaObject Since 5.5. \endomit
+ \omitvalue IsGadget \omit (since Qt 5.5) This type is a Q_GADGET and its corresponding QMetaObject can be accessed with QMetaType::metaObject. \endomit
\omitvalue PointerToGadget
\omitvalue IsQmlList
- \value IsConst Indicates that values of this types are immutable; for instance because they are pointers to const objects.
+ \value IsConst Indicates that values of this type are immutable; for instance, because they are pointers to const objects.
+
+ \note Before Qt 6.5, both the NeedsConstruction and NeedsDestruction flags
+ were incorrectly set if the either copy construtor or destructor were
+ non-trivial (that is, if the type was not trivial).
+
+ Note that the Needs flags may be set but the meta type may not have a
+ publicly-accessible constructor of the relevant type or a
+ publicly-accessible destructor.
*/
/*!
@@ -436,17 +478,19 @@ Q_GLOBAL_STATIC(QMetaTypeCustomRegistry, customTypeRegistry)
The class is used as a helper to marshall types in QVariant and
in queued signals and slots connections. It associates a type
name to a type so that it can be created and destructed
- dynamically at run-time. Declare new types with Q_DECLARE_METATYPE()
- to make them available to QVariant and other template-based functions.
- Call qRegisterMetaType() to make types available to non-template based
- functions, such as the queued signal and slot connections.
+ dynamically at run-time.
- Any class or struct that has a public default
- constructor, a public copy constructor, and a public destructor
- can be registered.
+ Type names can be registered with QMetaType by using either
+ qRegisterMetaType() or registerType(). Registration is not required for
+ most operations; it's only required for operations that attempt to resolve
+ a type name in string form back to a QMetaType object or the type's ID.
+ Those include some old-style signal-slot connections using
+ QObject::connect(), reading user-types from \l QDataStream to \l QVariant,
+ or binding to other languages and IPC mechanisms, like QML, D-Bus,
+ JavaScript, etc.
- The following code allocates and destructs an instance of
- \c{MyClass}:
+ The following code allocates and destructs an instance of \c{MyClass} by
+ its name, which requires that \c{MyClass} have been previously registered:
\snippet code/src_corelib_kernel_qmetatype.cpp 3
@@ -464,6 +508,8 @@ Q_GLOBAL_STATIC(QMetaTypeCustomRegistry, customTypeRegistry)
Returns \c true if this QMetaType object contains valid
information about a type, false otherwise.
+
+ \sa isRegistered()
*/
bool QMetaType::isValid() const
{
@@ -474,31 +520,43 @@ bool QMetaType::isValid() const
\fn bool QMetaType::isRegistered() const
\since 5.0
- Returns \c true if this QMetaType object contains valid
- information about a type, false otherwise.
+ Returns \c true if this QMetaType object has been registered with the Qt
+ global metatype registry. Registration allows the type to be found by its
+ name (using QMetaType::fromName()) or by its ID (using the constructor).
+
+ \sa qRegisterMetaType(), isValid()
*/
bool QMetaType::isRegistered() const
{
- return d_ptr;
+ return d_ptr && d_ptr->typeId.loadRelaxed();
}
/*!
\fn int QMetaType::id() const
\since 5.13
- Returns id type hold by this QMetatype instance.
+ Returns id type held by this QMetatype instance.
*/
/*!
+ \fn void QMetaType::registerType() const
+ \since 6.5
+
+ Registers this QMetaType with the type registry so it can be found by name,
+ using QMetaType::fromName().
+
+ \sa qRegisterMetaType()
+ */
+/*!
\internal
- The slowpath of id(). Precondition: d_ptr != nullptr
-*/
-int QMetaType::idHelper() const
+ Out-of-line path for registerType() and slow path id().
+ */
+int QMetaType::registerHelper(const QtPrivate::QMetaTypeInterface *iface)
{
- Q_ASSERT(d_ptr);
+ Q_ASSERT(iface);
auto reg = customTypeRegistry();
if (reg) {
- return reg->registerCustomType(d_ptr);
+ return reg->registerCustomType(iface);
}
return 0;
}
@@ -536,28 +594,34 @@ int QMetaType::idHelper() const
\fn constexpr TypeFlags QMetaType::flags() const
\since 5.0
- Returns flags of the type for which this QMetaType instance was constructed.
+ Returns flags of the type for which this QMetaType instance was
+ constructed. To inspect specific type traits, prefer using one of the "is-"
+ functions rather than the flags directly.
- \sa QMetaType::TypeFlags, QMetaType::flags()
+ \sa QMetaType::TypeFlags, QMetaType::flags(), isDefaultConstructible(),
+ isCopyConstructible(), isMoveConstructible(), isDestructible(),
+ isEqualityComparable(), isOrdered()
*/
/*!
\fn constexpr const QMetaObject *QMetaType::metaObject() const
\since 5.5
- return a QMetaObject relative to this type.
+ Returns a QMetaObject relative to this type.
If the type is a pointer type to a subclass of QObject, flags() contains
- QMetaType::PointerToQObject and this function returns the corresponding QMetaObject. This can
- be used to in combinaison with QMetaObject::construct to create QObject of this type.
+ QMetaType::PointerToQObject and this function returns the corresponding QMetaObject.
+ This can be used in combination with QMetaObject::newInstance() to create QObjects of this type.
- If the type is a Q_GADGET, flags() contains QMetaType::IsGadget, and this function returns its
- QMetaObject. This can be used to retrieve QMetaMethod and QMetaProperty and use them on a
- pointer of this type. (given by QVariant::data for example)
+ If the type is a Q_GADGET, flags() contains QMetaType::IsGadget.
+ If the type is a pointer to a Q_GADGET, flags() contains QMetaType::PointerToGadget.
+ In both cases, this function returns its QMetaObject.
+ This can be used to retrieve QMetaMethod and QMetaProperty and use them on a
+ pointer of this type for example, as given by QVariant::data().
- If the type is an enumeration, flags() contains QMetaType::IsEnumeration, and this function
- returns the QMetaObject of the enclosing object if the enum was registered as a Q_ENUM or
- \nullptr otherwise
+ If the type is an enumeration, flags() contains QMetaType::IsEnumeration.
+ In this case, this function returns the QMetaObject of the enclosing
+ object if the enum was registered as a Q_ENUM or \nullptr otherwise.
\sa QMetaType::flags()
*/
@@ -574,16 +638,17 @@ int QMetaType::idHelper() const
*/
void *QMetaType::create(const void *copy) const
{
- if (d_ptr && (copy ? !!d_ptr->copyCtr : !!d_ptr->defaultCtr)) {
- void *where =
-#ifdef __STDCPP_DEFAULT_NEW_ALIGNMENT__
- d_ptr->alignment > __STDCPP_DEFAULT_NEW_ALIGNMENT__ ?
- operator new(d_ptr->size, std::align_val_t(d_ptr->alignment)) :
-#endif
- operator new(d_ptr->size);
- return construct(where, copy);
- }
- return nullptr;
+ if (copy ? !isCopyConstructible() : !isDefaultConstructible())
+ return nullptr;
+
+ std::unique_ptr<void, QMetaTypeDeleter> where(nullptr, {d_ptr});
+ if (d_ptr->alignment > __STDCPP_DEFAULT_NEW_ALIGNMENT__)
+ where.reset(operator new(d_ptr->size, std::align_val_t(d_ptr->alignment)));
+ else
+ where.reset(operator new(d_ptr->size));
+
+ QtMetaTypePrivate::construct(d_ptr, where.get(), copy);
+ return where.release();
}
/*!
@@ -597,14 +662,9 @@ void *QMetaType::create(const void *copy) const
*/
void QMetaType::destroy(void *data) const
{
- if (d_ptr) {
- if (d_ptr->dtor)
- d_ptr->dtor(d_ptr, data);
- if (d_ptr->alignment > __STDCPP_DEFAULT_NEW_ALIGNMENT__) {
- operator delete(data, std::align_val_t(d_ptr->alignment));
- } else {
- operator delete(data);
- }
+ if (data && isDestructible()) {
+ QtMetaTypePrivate::destruct(d_ptr, data);
+ QMetaTypeDeleter{d_ptr}(data);
}
}
@@ -638,16 +698,11 @@ void *QMetaType::construct(void *where, const void *copy) const
{
if (!where)
return nullptr;
- if (d_ptr) {
- if (copy && d_ptr->copyCtr) {
- d_ptr->copyCtr(d_ptr, where, copy);
- return where;
- } else if (!copy && d_ptr->defaultCtr) {
- d_ptr->defaultCtr(d_ptr, where);
- return where;
- }
- }
- return nullptr;
+ if (copy ? !isCopyConstructible() : !isDefaultConstructible())
+ return nullptr;
+
+ QtMetaTypePrivate::construct(d_ptr, where, copy);
+ return where;
}
/*!
@@ -663,12 +718,8 @@ void *QMetaType::construct(void *where, const void *copy) const
*/
void QMetaType::destruct(void *data) const
{
- if (!data)
- return;
- if (d_ptr && d_ptr->dtor) {
- d_ptr->dtor(d_ptr, data);
- return;
- }
+ if (data && isDestructible())
+ QtMetaTypePrivate::destruct(d_ptr, data);
}
static QPartialOrdering threeWayCompare(const void *ptr1, const void *ptr2)
@@ -711,7 +762,7 @@ QPartialOrdering QMetaType::compare(const void *lhs, const void *rhs) const
{
if (!lhs || !rhs)
return QPartialOrdering::Unordered;
- if (d_ptr->flags & QMetaType::IsPointer)
+ if (d_ptr && d_ptr->flags & QMetaType::IsPointer)
return threeWayCompare(*reinterpret_cast<const void * const *>(lhs),
*reinterpret_cast<const void * const *>(rhs));
if (d_ptr && d_ptr->lessThan) {
@@ -760,6 +811,68 @@ bool QMetaType::equals(const void *lhs, const void *rhs) const
}
/*!
+ \fn bool QMetaType::isDefaultConstructible() const noexcept
+ \since 6.5
+
+ Returns true if this type can be default-constructed. If it can be, then
+ construct() and create() can be used with a \c{copy} parameter that is
+ null.
+
+ \sa flags(), isCopyConstructible(), isMoveConstructible(), isDestructible()
+ */
+
+/*!
+ \fn bool QMetaType::isCopyConstructible() const noexcept
+ \since 6.5
+
+ Returns true if this type can be copy-constructed. If it can be, then
+ construct() and create() can be used with a \c{copy} parameter that is
+ not null.
+
+ \sa flags(), isDefaultConstructible(), isMoveConstructible(), isDestructible()
+ */
+
+/*!
+ \fn bool QMetaType::isMoveConstructible() const noexcept
+ \since 6.5
+
+ Returns true if this type can be move-constructed. QMetaType currently does
+ not have an API to make use of this trait.
+
+ \sa flags(), isDefaultConstructible(), isCopyConstructible(), isDestructible()
+ */
+
+/*!
+ \fn bool QMetaType::isDestructible() const noexcept
+ \since 6.5
+
+ Returns true if this type can be destroyed. If it can be, then destroy()
+ and destruct() can be called.
+
+ \sa flags(), isDefaultConstructible(), isCopyConstructible(), isMoveConstructible()
+ */
+
+bool QMetaType::isDefaultConstructible(const QtPrivate::QMetaTypeInterface *iface) noexcept
+{
+ return !isInterfaceFor<void>(iface) && QtMetaTypePrivate::isDefaultConstructible(iface);
+}
+
+bool QMetaType::isCopyConstructible(const QtPrivate::QMetaTypeInterface *iface) noexcept
+{
+ return !isInterfaceFor<void>(iface) && QtMetaTypePrivate::isCopyConstructible(iface);
+}
+
+bool QMetaType::isMoveConstructible(const QtPrivate::QMetaTypeInterface *iface) noexcept
+{
+ return !isInterfaceFor<void>(iface) && QtMetaTypePrivate::isMoveConstructible(iface);
+}
+
+bool QMetaType::isDestructible(const QtPrivate::QMetaTypeInterface *iface) noexcept
+{
+ return !isInterfaceFor<void>(iface) && QtMetaTypePrivate::isDestructible(iface);
+}
+
+/*!
Returns \c true if a less than or equality operator for the type described by
this metatype was visible to the metatype declaration, otherwise \c false.
@@ -787,11 +900,22 @@ bool QMetaType::isOrdered() const
*/
void QMetaType::unregisterMetaType(QMetaType type)
{
- if (type.d_ptr && type.d_ptr->typeId.loadRelaxed() >= QMetaType::User) {
- if (auto reg = customTypeRegistry())
- reg->unregisterDynamicType(type.d_ptr->typeId.loadRelaxed());
- type.d_ptr->typeId.storeRelease(0);
+ const QtPrivate::QMetaTypeInterface *d_ptr = type.d_ptr;
+ if (!d_ptr)
+ return;
+
+ const int typeId = d_ptr->typeId.loadRelaxed();
+ if (typeId < QMetaType::User)
+ return;
+
+ // this is a custom meta type (not read-only)
+
+ if (auto reg = customTypeRegistry()) {
+ Q_ASSERT(reg->getCustomType(typeId) == d_ptr);
+ reg->unregisterDynamicType(typeId);
}
+
+ const_cast<QtPrivate::QMetaTypeInterface *>(d_ptr)->typeId.storeRelease(0);
}
/*!
@@ -817,6 +941,12 @@ void QMetaType::unregisterMetaType(QMetaType type)
than the QMetaType \a b, otherwise returns \c false.
*/
+/*! \internal */
+bool QMetaTypeModuleHelper::convert(const void *, int, void *, int) const
+{
+ return false;
+}
+
#define QT_ADD_STATIC_METATYPE(MetaTypeName, MetaTypeId, RealName) \
{ #RealName, sizeof(#RealName) - 1, MetaTypeId },
@@ -832,10 +962,11 @@ static const struct { const char * typeName; int typeNameLength; int type; } typ
{nullptr, 0, QMetaType::UnknownType}
};
-static const struct : QMetaTypeModuleHelper
+// NOLINTNEXTLINE(cppcoreguidelines-virtual-class-destructor): this is not a base class
+static constexpr struct : QMetaTypeModuleHelper
{
template<typename T, typename LiteralWrapper =
- std::conditional_t<std::is_same_v<T, QString>, QLatin1String, const char *>>
+ std::conditional_t<std::is_same_v<T, QString>, QLatin1StringView, const char *>>
static inline bool convertToBool(const T &source)
{
T str = source.toLower();
@@ -879,6 +1010,8 @@ static const struct : QMetaTypeModuleHelper
using Double = double;
using Bool = bool;
using Nullptr = std::nullptr_t;
+ using Char16 = char16_t;
+ using Char32 = char32_t;
#define QMETATYPE_CONVERTER_ASSIGN_DOUBLE(To, From) \
QMETATYPE_CONVERTER(To, From, result = double(source); return true;)
@@ -1033,6 +1166,9 @@ static const struct : QMetaTypeModuleHelper
QMETATYPE_CONVERTER_ASSIGN_QCHAR(ULong);
QMETATYPE_CONVERTER_ASSIGN_QCHAR(UInt);
QMETATYPE_CONVERTER_ASSIGN_QCHAR(ULongLong);
+ QMETATYPE_CONVERTER_ASSIGN_QCHAR(Char16);
+
+ QMETATYPE_CONVERTER(Char16, QChar, result = source.unicode(); return true;)
// conversions to QString
QMETATYPE_CONVERTER_ASSIGN(QString, QChar);
@@ -1070,6 +1206,14 @@ static const struct : QMetaTypeModuleHelper
result = QString::fromLatin1(&s, 1);
return true;
);
+ QMETATYPE_CONVERTER(QString, Char16,
+ result = QChar(source);
+ return true;
+ );
+ QMETATYPE_CONVERTER(QString, Char32,
+ result = QChar::fromUcs4(source).operator QStringView().toString();
+ return true;
+ );
#if QT_CONFIG(datestring)
QMETATYPE_CONVERTER(QString, QDate, result = source.toString(Qt::ISODate); return true;);
QMETATYPE_CONVERTER(QString, QTime, result = source.toString(Qt::ISODateWithMs); return true;);
@@ -1077,7 +1221,7 @@ static const struct : QMetaTypeModuleHelper
#endif
QMETATYPE_CONVERTER(QString, QByteArray, result = QString::fromUtf8(source); return true;);
QMETATYPE_CONVERTER(QString, QStringList,
- return (source.count() == 1) ? (result = source.at(0), true) : false;
+ return (source.size() == 1) ? (result = source.at(0), true) : false;
);
#ifndef QT_BOOTSTRAPPED
QMETATYPE_CONVERTER(QString, QUrl, result = source.toString(); return true;);
@@ -1132,34 +1276,36 @@ static const struct : QMetaTypeModuleHelper
QMETATYPE_CONVERTER_ASSIGN(QRectF, QRect);
QMETATYPE_CONVERTER(QPoint, QPointF, result = source.toPoint(); return true;);
QMETATYPE_CONVERTER_ASSIGN(QPointF, QPoint);
- #endif
+#endif
+ QMETATYPE_CONVERTER(QStringList, QString, result = QStringList() << source; return true;);
+
+#ifndef QT_NO_VARIANT
QMETATYPE_CONVERTER(QByteArrayList, QVariantList,
result.reserve(source.size());
- for (auto v: source)
+ for (const auto &v: source)
result.append(v.toByteArray());
return true;
);
QMETATYPE_CONVERTER(QVariantList, QByteArrayList,
result.reserve(source.size());
- for (auto v: source)
+ for (const auto &v: source)
result.append(QVariant(v));
return true;
);
QMETATYPE_CONVERTER(QStringList, QVariantList,
result.reserve(source.size());
- for (auto v: source)
+ for (const auto &v: source)
result.append(v.toString());
return true;
);
QMETATYPE_CONVERTER(QVariantList, QStringList,
result.reserve(source.size());
- for (auto v: source)
+ for (const auto &v: source)
result.append(QVariant(v));
return true;
);
- QMETATYPE_CONVERTER(QStringList, QString, result = QStringList() << source; return true;);
QMETATYPE_CONVERTER(QVariantHash, QVariantMap,
for (auto it = source.begin(); it != source.end(); ++it)
@@ -1171,7 +1317,7 @@ static const struct : QMetaTypeModuleHelper
result.insert(it.key(), it.value());
return true;
);
-
+#endif // !QT_NO_VARIANT
#ifndef QT_BOOTSTRAPPED
QMETATYPE_CONVERTER_ASSIGN(QCborValue, QString);
QMETATYPE_CONVERTER(QString, QCborValue,
@@ -1512,14 +1658,13 @@ static const struct : QMetaTypeModuleHelper
}
} metatypeHelper = {};
-static const QMetaTypeModuleHelper *qMetaTypeCoreHelper = &metatypeHelper;
-Q_CORE_EXPORT const QMetaTypeModuleHelper *qMetaTypeGuiHelper = nullptr;
-Q_CORE_EXPORT const QMetaTypeModuleHelper *qMetaTypeWidgetsHelper = nullptr;
+Q_CONSTINIT Q_CORE_EXPORT const QMetaTypeModuleHelper *qMetaTypeGuiHelper = nullptr;
+Q_CONSTINIT Q_CORE_EXPORT const QMetaTypeModuleHelper *qMetaTypeWidgetsHelper = nullptr;
static const QMetaTypeModuleHelper *qModuleHelperForType(int type)
{
if (type <= QMetaType::LastCoreType)
- return qMetaTypeCoreHelper;
+ return &metatypeHelper;
if (type >= QMetaType::FirstGuiType && type <= QMetaType::LastGuiType)
return qMetaTypeGuiHelper;
else if (type >= QMetaType::FirstWidgetsType && type <= QMetaType::LastWidgetsType)
@@ -1572,17 +1717,17 @@ private:
QHash<Key, T> map;
};
-typedef QMetaTypeFunctionRegistry<QMetaType::ConverterFunction,QPair<int,int> >
-QMetaTypeConverterRegistry;
+using QMetaTypeConverterRegistry
+ = QMetaTypeFunctionRegistry<QMetaType::ConverterFunction, std::pair<int,int>>;
Q_GLOBAL_STATIC(QMetaTypeConverterRegistry, customTypesConversionRegistry)
using QMetaTypeMutableViewRegistry
- = QMetaTypeFunctionRegistry<QMetaType::MutableViewFunction, QPair<int,int>>;
+ = QMetaTypeFunctionRegistry<QMetaType::MutableViewFunction, std::pair<int,int>>;
Q_GLOBAL_STATIC(QMetaTypeMutableViewRegistry, customTypesMutableViewRegistry)
/*!
- \fn bool QMetaType::registerConverter()
+ \fn template<typename From, typename To> bool QMetaType::registerConverter()
\since 5.2
Registers the possibility of an implicit conversion from type From to type To in the meta
type system. Returns \c true if the registration succeeded, otherwise false.
@@ -1591,7 +1736,7 @@ Q_GLOBAL_STATIC(QMetaTypeMutableViewRegistry, customTypesMutableViewRegistry)
*/
/*!
- \fn template<typename From, typename To> static bool registerConverter(To(From::*function)() const)
+ \fn template<typename From, typename To> static bool QMetaType::registerConverter(To(From::*function)() const)
\since 5.2
\overload
Registers a method \a function like To From::function() const as converter from type From
@@ -1601,26 +1746,27 @@ Q_GLOBAL_STATIC(QMetaTypeMutableViewRegistry, customTypesMutableViewRegistry)
*/
/*!
- \fn template<typename From, typename To> static bool registerConverter(To(From::*function)(bool*) const)
+ \fn template<typename From, typename To> static bool QMetaType::registerConverter(To(From::*function)(bool*) const)
\since 5.2
\overload
Registers a method \a function like To From::function(bool *ok) const as converter from type From
to type To in the meta type system. Returns \c true if the registration succeeded, otherwise false.
- The \a ok pointer can be used by the function to indicate whether the conversion succeeded.
+ The \c ok pointer can be used by the function to indicate whether the conversion succeeded.
\snippet qmetatype/registerConverters.cpp memberOk
*/
/*!
- \fn template<typename From, typename To, typename UnaryFunction> static bool registerConverter(UnaryFunction function)
+ \fn template<typename From, typename To, typename UnaryFunction> static bool QMetaType::registerConverter(UnaryFunction function)
\since 5.2
\overload
Registers a unary function object \a function as converter from type From
to type To in the meta type system. Returns \c true if the registration succeeded, otherwise false.
- \a function must take an instance of type \a From and return an instance of \a To. It can be a function
- pointer, a lambda or a functor object.
+ \a function must take an instance of type \c From and return an instance of \c To. It can be a function
+ pointer, a lambda or a functor object. Since Qt 6.5, the \a function can also return an instance of
+ \c std::optional<To> to be able to indicate failed conversions.
\snippet qmetatype/registerConverters.cpp unaryfunc
*/
@@ -1633,7 +1779,7 @@ Q_GLOBAL_STATIC(QMetaTypeMutableViewRegistry, customTypesMutableViewRegistry)
*/
bool QMetaType::registerConverterFunction(const ConverterFunction &f, QMetaType from, QMetaType to)
{
- if (!customTypesConversionRegistry()->insertIfNotContains(qMakePair(from.id(), to.id()), f)) {
+ if (!customTypesConversionRegistry()->insertIfNotContains({from.id(), to.id()}, f)) {
qWarning("Type conversion already registered from type %s to type %s",
from.name(), to.name());
return false;
@@ -1642,7 +1788,7 @@ bool QMetaType::registerConverterFunction(const ConverterFunction &f, QMetaType
}
/*!
- \fn template<typename From, typename To> static bool registerMutableView(To(From::*function)())
+ \fn template<typename From, typename To> static bool QMetaType::registerMutableView(To(From::*function)())
\since 6.0
\overload
Registers a method \a function like \c {To From::function()} as mutable view of type \c {To} on
@@ -1651,7 +1797,7 @@ bool QMetaType::registerConverterFunction(const ConverterFunction &f, QMetaType
*/
/*!
- \fn template<typename From, typename To, typename UnaryFunction> static bool registerMutableView(UnaryFunction function)
+ \fn template<typename From, typename To, typename UnaryFunction> static bool QMetaType::registerMutableView(UnaryFunction function)
\since 6.0
\overload
Registers a unary function object \a function as mutable view of type To on type From
@@ -1666,7 +1812,7 @@ bool QMetaType::registerConverterFunction(const ConverterFunction &f, QMetaType
*/
bool QMetaType::registerMutableViewFunction(const MutableViewFunction &f, QMetaType from, QMetaType to)
{
- if (!customTypesMutableViewRegistry()->insertIfNotContains(qMakePair(from.id(), to.id()), f)) {
+ if (!customTypesMutableViewRegistry()->insertIfNotContains({from.id(), to.id()}, f)) {
qWarning("Mutable view on type already registered from type %s to type %s",
from.name(), to.name());
return false;
@@ -1699,6 +1845,17 @@ void QMetaType::unregisterConverterFunction(QMetaType from, QMetaType to)
#ifndef QT_NO_DEBUG_STREAM
/*!
+ \fn QDebug QMetaType::operator<<(QDebug d, QMetaType m)
+ \since 6.5
+ Writes the QMetaType \a m to the stream \a d, and returns the stream.
+*/
+QDebug operator<<(QDebug d, QMetaType m)
+{
+ const QDebugStateSaver saver(d);
+ return d.nospace() << "QMetaType(" << m.name() << ")";
+}
+
+/*!
Streams the object at \a rhs to the debug stream \a dbg. Returns \c true
on success, otherwise false.
\since 5.2
@@ -1723,7 +1880,7 @@ bool QMetaType::debugStream(QDebug& dbg, const void *rhs)
*/
/*!
- \fn bool QMetaType::hasRegisteredDebugStreamOperator()
+ \fn template<typename T> bool QMetaType::hasRegisteredDebugStreamOperator()
\deprecated
\since 5.2
@@ -1760,10 +1917,16 @@ static QMetaEnum metaEnumFromType(QMetaType t)
{
if (t.flags() & QMetaType::IsEnumeration) {
if (const QMetaObject *metaObject = t.metaObject()) {
- const QByteArray enumName = t.name();
- const char *lastColon = std::strrchr(enumName, ':');
- return metaObject->enumerator(metaObject->indexOfEnumerator(
- lastColon ? lastColon + 1 : enumName.constData()));
+ QByteArrayView qflagsNamePrefix = "QFlags<";
+ QByteArray enumName = t.name();
+ if (enumName.endsWith('>') && enumName.startsWith(qflagsNamePrefix)) {
+ // extract the template argument
+ enumName.chop(1);
+ enumName = enumName.sliced(qflagsNamePrefix.size());
+ }
+ if (qsizetype lastColon = enumName.lastIndexOf(':'); lastColon != -1)
+ enumName = enumName.sliced(lastColon + 1);
+ return metaObject->enumerator(metaObject->indexOfEnumerator(enumName));
}
}
return QMetaEnum();
@@ -1822,18 +1985,27 @@ static bool convertFromEnum(QMetaType fromType, const void *from, QMetaType toTy
if (toType.id() != QMetaType::QString && toType.id() != QMetaType::QByteArray)
return QMetaType::convert(QMetaType::fromType<qlonglong>(), &ll, toType, to);
}
- Q_ASSERT(toType.id() == QMetaType::QString || toType.id() == QMetaType::QByteArray);
#ifndef QT_NO_QOBJECT
QMetaEnum en = metaEnumFromType(fromType);
if (en.isValid()) {
- const char *key = en.valueToKey(ll);
- if (toType.id() == QMetaType::QString)
- *static_cast<QString *>(to) = QString::fromUtf8(key);
- else
- *static_cast<QByteArray *>(to) = key;
+ if (en.isFlag()) {
+ const QByteArray keys = en.valueToKeys(static_cast<int>(ll));
+ if (toType.id() == QMetaType::QString)
+ *static_cast<QString *>(to) = QString::fromUtf8(keys);
+ else
+ *static_cast<QByteArray *>(to) = keys;
+ } else {
+ const char *key = en.valueToKey(static_cast<int>(ll));
+ if (toType.id() == QMetaType::QString)
+ *static_cast<QString *>(to) = QString::fromUtf8(key);
+ else
+ *static_cast<QByteArray *>(to) = key;
+ }
return true;
}
#endif
+ if (toType.id() == QMetaType::QString || toType.id() == QMetaType::QByteArray)
+ return QMetaType::convert(QMetaType::fromType<qlonglong>(), &ll, toType, to);
return false;
}
@@ -1845,12 +2017,12 @@ static bool convertToEnum(QMetaType fromType, const void *from, QMetaType toType
#ifndef QT_NO_QOBJECT
if (fromTypeId == QMetaType::QString || fromTypeId == QMetaType::QByteArray) {
QMetaEnum en = metaEnumFromType(toType);
- if (!en.isValid())
- return false;
- QByteArray keys = (fromTypeId == QMetaType::QString)
- ? static_cast<const QString *>(from)->toUtf8()
- : *static_cast<const QByteArray *>(from);
- value = en.keysToValue(keys.constData(), &ok);
+ if (en.isValid()) {
+ QByteArray keys = (fromTypeId == QMetaType::QString)
+ ? static_cast<const QString *>(from)->toUtf8()
+ : *static_cast<const QByteArray *>(from);
+ value = en.keysToValue(keys.constData(), &ok);
+ }
}
#endif
if (!ok) {
@@ -1879,8 +2051,7 @@ static bool convertToEnum(QMetaType fromType, const void *from, QMetaType toType
*static_cast<qint64 *>(to) = value;
return true;
default:
- Q_UNREACHABLE();
- return false;
+ Q_UNREACHABLE_RETURN(false);
}
}
@@ -1928,13 +2099,12 @@ static bool convertIterableToVariantHash(QMetaType fromType, const void *from, v
h.insert(it.key().toString(), it.value());
return true;
}
-#endif
static bool convertIterableToVariantPair(QMetaType fromType, const void *from, void *to)
{
- const QMetaType::ConverterFunction * const f =
- customTypesConversionRegistry()->function(qMakePair(fromType.id(),
- qMetaTypeId<QtMetaTypePrivate::QPairVariantInterfaceImpl>()));
+ const int targetId = qMetaTypeId<QtMetaTypePrivate::QPairVariantInterfaceImpl>();
+ const auto f = customTypesConversionRegistry()->function({fromType.id(), targetId});
+
if (!f)
return false;
@@ -1960,7 +2130,6 @@ static bool convertIterableToVariantPair(QMetaType fromType, const void *from, v
return true;
}
-#ifndef QT_BOOTSTRAPPED
static bool convertToSequentialIterable(QMetaType fromType, const void *from, void *to)
{
using namespace QtMetaTypePrivate;
@@ -2086,6 +2255,9 @@ static bool convertToAssociativeIterable(QMetaType fromType, const void *from, v
static bool canConvertMetaObject(QMetaType fromType, QMetaType toType)
{
+ if ((fromType.flags() & QMetaType::IsPointer) != (toType.flags() & QMetaType::IsPointer))
+ return false; // Can not convert between pointer and value
+
const QMetaObject *f = fromType.metaObject();
const QMetaObject *t = toType.metaObject();
if (f && t) {
@@ -2142,7 +2314,7 @@ static bool viewAsAssociativeIterable(QMetaType fromType, void *from, void *to)
return false;
}
-static bool convertQObject(QMetaType fromType, const void *from, QMetaType toType, void *to)
+static bool convertMetaObject(QMetaType fromType, const void *from, QMetaType toType, void *to)
{
// handle QObject conversion
if ((fromType.flags() & QMetaType::PointerToQObject) && (toType.flags() & QMetaType::PointerToQObject)) {
@@ -2155,13 +2327,20 @@ static bool convertQObject(QMetaType fromType, const void *from, QMetaType toTyp
// if fromObject is null, use static fromType to check if conversion works
*static_cast<void **>(to) = nullptr;
return fromType.metaObject()->inherits(toType.metaObject());
- } else {
- return false;
+ }
+ } else if ((fromType.flags() & QMetaType::IsPointer) == (toType.flags() & QMetaType::IsPointer)) {
+ // fromType and toType are of same 'pointedness'
+ const QMetaObject *f = fromType.metaObject();
+ const QMetaObject *t = toType.metaObject();
+ if (f && t && f->inherits(t)) {
+ toType.destruct(to);
+ toType.construct(to, from);
+ return true;
}
}
return false;
}
-#endif
+#endif // !QT_BOOTSTRAPPED
/*!
\fn bool QMetaType::convert(const void *from, int fromTypeId, void *to, int toTypeId)
@@ -2202,8 +2381,7 @@ bool QMetaType::convert(QMetaType fromType, const void *from, QMetaType toType,
if (moduleHelper->convert(from, fromTypeId, to, toTypeId))
return true;
}
- const QMetaType::ConverterFunction * const f =
- customTypesConversionRegistry()->function(qMakePair(fromTypeId, toTypeId));
+ const auto f = customTypesConversionRegistry()->function({fromTypeId, toTypeId});
if (f)
return (*f)(from, to);
@@ -2219,10 +2397,11 @@ bool QMetaType::convert(QMetaType fromType, const void *from, QMetaType toType,
}
}
+#ifndef QT_BOOTSTRAPPED
+# ifndef QT_NO_VARIANT
if (toTypeId == QVariantPair && convertIterableToVariantPair(fromType, from, to))
return true;
-#ifndef QT_BOOTSTRAPPED
// handle iterables
if (toTypeId == QVariantList && convertIterableToVariantList(fromType, from, to))
return true;
@@ -2232,6 +2411,7 @@ bool QMetaType::convert(QMetaType fromType, const void *from, QMetaType toType,
if (toTypeId == QVariantHash && convertIterableToVariantHash(fromType, from, to))
return true;
+# endif
if (toTypeId == qMetaTypeId<QSequentialIterable>())
return convertToSequentialIterable(fromType, from, to);
@@ -2239,7 +2419,7 @@ bool QMetaType::convert(QMetaType fromType, const void *from, QMetaType toType,
if (toTypeId == qMetaTypeId<QAssociativeIterable>())
return convertToAssociativeIterable(fromType, from, to);
- return convertQObject(fromType, from, toType, to);
+ return convertMetaObject(fromType, from, toType, to);
#else
return false;
#endif
@@ -2258,8 +2438,7 @@ bool QMetaType::view(QMetaType fromType, void *from, QMetaType toType, void *to)
int fromTypeId = fromType.id();
int toTypeId = toType.id();
- const QMetaType::MutableViewFunction * const f =
- customTypesMutableViewRegistry()->function(qMakePair(fromTypeId, toTypeId));
+ const auto f = customTypesMutableViewRegistry()->function({fromTypeId, toTypeId});
if (f)
return (*f)(from, to);
@@ -2270,7 +2449,7 @@ bool QMetaType::view(QMetaType fromType, void *from, QMetaType toType, void *to)
if (toTypeId == qMetaTypeId<QAssociativeIterable>())
return viewAsAssociativeIterable(fromType, from, to);
- return convertQObject(fromType, from, toType, to);
+ return convertMetaObject(fromType, from, toType, to);
#else
return false;
#endif
@@ -2301,8 +2480,7 @@ bool QMetaType::canView(QMetaType fromType, QMetaType toType)
if (fromTypeId == UnknownType || toTypeId == UnknownType)
return false;
- const MutableViewFunction * const f =
- customTypesMutableViewRegistry()->function(qMakePair(fromTypeId, toTypeId));
+ const auto f = customTypesMutableViewRegistry()->function({fromTypeId, toTypeId});
if (f)
return true;
@@ -2407,7 +2585,7 @@ bool QMetaType::canConvert(QMetaType fromType, QMetaType toType)
return true;
}
const ConverterFunction * const f =
- customTypesConversionRegistry()->function(qMakePair(fromTypeId, toTypeId));
+ customTypesConversionRegistry()->function(std::make_pair(fromTypeId, toTypeId));
if (f)
return true;
@@ -2417,7 +2595,8 @@ bool QMetaType::canConvert(QMetaType fromType, QMetaType toType)
if (toTypeId == qMetaTypeId<QAssociativeIterable>())
return canConvertToAssociativeIterable(fromType);
-
+#endif
+#ifndef QT_NO_VARIANT
if (toTypeId == QVariantList
&& canConvert(fromType, QMetaType::fromType<QSequentialIterable>())) {
return true;
@@ -2427,11 +2606,11 @@ bool QMetaType::canConvert(QMetaType fromType, QMetaType toType)
&& canConvert(fromType, QMetaType::fromType<QAssociativeIterable>())) {
return true;
}
-#endif
if (toTypeId == QVariantPair && hasRegisteredConverterFunction(
fromType, QMetaType::fromType<QtMetaTypePrivate::QPairVariantInterfaceImpl>()))
return true;
+#endif
if (fromType.flags() & IsEnumeration) {
if (toTypeId == QString || toTypeId == QByteArray)
@@ -2463,7 +2642,7 @@ bool QMetaType::canConvert(QMetaType fromType, QMetaType toType)
*/
/*!
- \fn bool QMetaType::hasRegisteredConverterFunction()
+ \fn template<typename From, typename To> bool QMetaType::hasRegisteredConverterFunction()
Returns \c true, if the meta type system has a registered conversion from type From to type To.
\since 5.2
\overload
@@ -2476,11 +2655,11 @@ bool QMetaType::canConvert(QMetaType fromType, QMetaType toType)
*/
bool QMetaType::hasRegisteredConverterFunction(QMetaType fromType, QMetaType toType)
{
- return customTypesConversionRegistry()->contains(qMakePair(fromType.id(), toType.id()));
+ return customTypesConversionRegistry()->contains({fromType.id(), toType.id()});
}
/*!
- \fn bool QMetaType::hasRegisteredMutableViewFunction()
+ \fn template<typename From, typename To> bool QMetaType::hasRegisteredMutableViewFunction()
Returns \c true, if the meta type system has a registered mutable view on type From of type To.
\since 6.0
\overload
@@ -2493,7 +2672,7 @@ bool QMetaType::hasRegisteredConverterFunction(QMetaType fromType, QMetaType toT
*/
bool QMetaType::hasRegisteredMutableViewFunction(QMetaType fromType, QMetaType toType)
{
- return customTypesMutableViewRegistry()->contains(qMakePair(fromType.id(), toType.id()));
+ return customTypesMutableViewRegistry()->contains({fromType.id(), toType.id()});
}
/*!
@@ -2538,12 +2717,13 @@ static inline int qMetaTypeStaticType(const char *typeName, int length)
*/
static int qMetaTypeCustomType_unlocked(const char *typeName, int length)
{
- if (auto reg = customTypeRegistry()) {
+ if (customTypeRegistry.exists()) {
+ auto reg = &*customTypeRegistry;
#if QT_CONFIG(thread)
Q_ASSERT(!reg->lock.tryLockForWrite());
#endif
- if (auto ti = reg->aliases.value(QByteArray(typeName, length), nullptr)) {
- return ti->typeId;
+ if (auto ti = reg->aliases.value(QByteArray::fromRawData(typeName, length), nullptr)) {
+ return ti->typeId.loadRelaxed();
}
}
return QMetaType::UnknownType;
@@ -2570,6 +2750,20 @@ void QMetaType::registerNormalizedTypedef(const NS(QByteArray) & normalizedTypeN
}
}
+
+static const QtPrivate::QMetaTypeInterface *interfaceForTypeNoWarning(int typeId)
+{
+ const QtPrivate::QMetaTypeInterface *iface = nullptr;
+ if (typeId >= QMetaType::User) {
+ if (customTypeRegistry.exists())
+ iface = customTypeRegistry->getCustomType(typeId);
+ } else {
+ if (auto moduleHelper = qModuleHelperForType(typeId))
+ iface = moduleHelper->interfaceForType(typeId);
+ }
+ return iface;
+}
+
/*!
Returns \c true if the datatype with ID \a type is registered;
otherwise returns \c false.
@@ -2578,7 +2772,7 @@ void QMetaType::registerNormalizedTypedef(const NS(QByteArray) & normalizedTypeN
*/
bool QMetaType::isRegistered(int type)
{
- return QMetaType(type).isRegistered();
+ return interfaceForTypeNoWarning(type) != nullptr;
}
template <bool tryNormalizedType>
@@ -2616,7 +2810,7 @@ static inline int qMetaTypeTypeImpl(const char *typeName, int length)
*/
/*!
- \a internal
+ \internal
Similar to QMetaType::type(); the only difference is that this function
doesn't attempt to normalize the type name (i.e., the lookup will fail
@@ -2646,9 +2840,6 @@ Q_CORE_EXPORT int qMetaTypeTypeInternal(const char *typeName)
Returns \c true if the object is saved successfully; otherwise
returns \c false.
- The type must have been registered with Q_DECLARE_METATYPE()
- beforehand.
-
Normally, you should not need to call this function directly.
Instead, use QVariant's \c operator<<(), which relies on save()
to stream custom types.
@@ -2687,9 +2878,6 @@ bool QMetaType::save(QDataStream &stream, const void *data) const
Returns \c true if the object is loaded successfully; otherwise
returns \c false.
- The type must have been registered with Q_DECLARE_METATYPE()
- beforehand.
-
Normally, you should not need to call this function directly.
Instead, use QVariant's \c operator>>(), which relies on load()
to stream custom types.
@@ -2735,6 +2923,59 @@ bool QMetaType::hasRegisteredDataStreamOperators() const
}
/*!
+ \since 6.6
+
+ If this metatype represents an enumeration, this method returns a
+ metatype of a numeric class of the same signedness and size as the
+ enums underlying type.
+ If it represents a QFlags type, it returns QMetaType::Int.
+ In all other cases an invalid QMetaType is returned.
+ */
+QMetaType QMetaType::underlyingType() const
+{
+ if (!d_ptr || !(flags() & IsEnumeration))
+ return {};
+ /* QFlags has enumeration set so that's handled here (qint32
+ case), as QFlags uses int as the underlying type
+ Note that we do some approximation here, as we cannot
+ differentiate between different underlying types of the
+ same size and signedness (consider char <-> (un)signed char,
+ int <-> long <-> long long).
+
+ ### TODO PENDING: QTBUG-111926 - QFlags supporting >32 bit int
+ */
+ if (flags() & IsUnsignedEnumeration) {
+ switch (sizeOf()) {
+ case 1:
+ return QMetaType::fromType<quint8>();
+ case 2:
+ return QMetaType::fromType<quint16>();
+ case 4:
+ return QMetaType::fromType<quint32>();
+ case 8:
+ return QMetaType::fromType<quint64>();
+ default:
+ break;
+ }
+ } else {
+ switch (sizeOf()) {
+ case 1:
+ return QMetaType::fromType<qint8>();
+ case 2:
+ return QMetaType::fromType<qint16>();
+ case 4:
+ return QMetaType::fromType<qint32>();
+ case 8:
+ return QMetaType::fromType<qint64>();
+ default:
+ break;
+ }
+ }
+ // int128 can be handled above once we have qint128
+ return QMetaType();
+}
+
+/*!
\fn bool QMetaType::load(QDataStream &stream, int type, void *data)
\overload
\deprecated
@@ -2846,8 +3087,9 @@ QMetaType QMetaType::fromName(QByteArrayView typeName)
*/
/*!
- \fn int qRegisterMetaType(const char *typeName)
+ \fn template <typename T> int qRegisterMetaType(const char *typeName)
\relates QMetaType
+ \obsolete
\threadsafe
Registers the type name \a typeName for the type \c{T}. Returns
@@ -2879,13 +3121,12 @@ QMetaType QMetaType::fromName(QByteArrayView typeName)
*/
/*!
- \fn int qRegisterMetaType()
+ \fn template <typename T> int qRegisterMetaType()
\relates QMetaType
\threadsafe
\since 4.2
- Call this function to register the type \c T. \c T must be declared with
- Q_DECLARE_METATYPE(). Returns the meta type Id.
+ Call this function to register the type \c T. Returns the meta type Id.
Example:
@@ -2896,24 +3137,47 @@ QMetaType QMetaType::fromName(QByteArrayView typeName)
pointed to type is fully defined. Use Q_DECLARE_OPAQUE_POINTER() to be able
to register pointers to forward declared types.
- After a type has been registered, you can create and destroy
- objects of that type dynamically at run-time.
+ To use the type \c T in QMetaType, QVariant, or with the
+ QObject::property() API, registration is not necessary.
- To use the type \c T in QVariant, using Q_DECLARE_METATYPE() is
- sufficient. To use the type \c T in queued signal and slot connections,
- \c{qRegisterMetaType<T>()} must be called before the first connection
- is established.
+ To use the type \c T in queued signal and slot connections,
+ \c{qRegisterMetaType<T>()} must be called before the first connection is
+ established. That is typically done in the constructor of the class that
+ uses \c T, or in the \c{main()} function.
- Also, to use type \c T with the QObject::property() API,
- \c{qRegisterMetaType<T>()} must be called before it is used, typically
- in the constructor of the class that uses \c T, or in the \c{main()}
- function.
+ After a type has been registered, it can be found by its name using
+ QMetaType::fromName().
\sa Q_DECLARE_METATYPE()
*/
/*!
- \fn int qMetaTypeId()
+ \fn int qRegisterMetaType(QMetaType meta)
+ \relates QMetaType
+ \threadsafe
+ \since 6.5
+
+ Registers the meta type \a meta and returns its type Id.
+
+ This function requires that \c{T} is a fully defined type at the point
+ where the function is called. For pointer types, it also requires that the
+ pointed to type is fully defined. Use Q_DECLARE_OPAQUE_POINTER() to be able
+ to register pointers to forward declared types.
+
+ To use the type \c T in QMetaType, QVariant, or with the
+ QObject::property() API, registration is not necessary.
+
+ To use the type \c T in queued signal and slot connections,
+ \c{qRegisterMetaType<T>()} must be called before the first connection is
+ established. That is typically done in the constructor of the class that
+ uses \c T, or in the \c{main()} function.
+
+ After a type has been registered, it can be found by its name using
+ QMetaType::fromName().
+ */
+
+/*!
+ \fn template <typename T> int qMetaTypeId()
\relates QMetaType
\threadsafe
\since 4.1
@@ -2936,15 +3200,7 @@ QMetaType QMetaType::fromName(QByteArrayView typeName)
static const QtPrivate::QMetaTypeInterface *interfaceForType(int typeId)
{
- const QtPrivate::QMetaTypeInterface *iface = nullptr;
- if (typeId >= QMetaType::User) {
- if (auto reg = customTypeRegistry())
- iface = reg->getCustomType(typeId);
- } else {
- if (auto moduleHelper = qModuleHelperForType(typeId))
- iface = moduleHelper->interfaceForType(typeId);
- }
-
+ const QtPrivate::QMetaTypeInterface *iface = interfaceForTypeNoWarning(typeId);
if (!iface && typeId != QMetaType::UnknownType)
qWarning("Trying to construct an instance of an invalid type, type id: %i", typeId);
@@ -2952,6 +3208,13 @@ static const QtPrivate::QMetaTypeInterface *interfaceForType(int typeId)
}
/*!
+ \fn QMetaType::QMetaType()
+ \since 6.0
+
+ Constructs a default, invalid, QMetaType object.
+*/
+
+/*!
\fn QMetaType::QMetaType(int typeId)
\since 5.0
@@ -2959,17 +3222,27 @@ static const QtPrivate::QMetaTypeInterface *interfaceForType(int typeId)
*/
QMetaType::QMetaType(int typeId) : QMetaType(interfaceForType(typeId)) {}
+
+/*! \fn size_t qHash(QMetaType type, size_t seed = 0)
+ \relates QMetaType
+ \since 6.4
+
+ Returns the hash value for the \a type, using \a seed to seed the calculation.
+*/
+
namespace QtPrivate {
-#if !defined(QT_BOOTSTRAPPED) && !defined(Q_CC_MSVC)
+#if !defined(QT_BOOTSTRAPPED) && !defined(Q_CC_MSVC) && !defined(Q_OS_INTEGRITY)
// Explicit instantiation definition
-#define QT_METATYPE_DECLARE_TEMPLATE_ITER(TypeName, Id, Name) \
- template class QMetaTypeForType<Name>;
-QT_FOR_EACH_STATIC_PRIMITIVE_TYPE(QT_METATYPE_DECLARE_TEMPLATE_ITER)
+#define QT_METATYPE_DECLARE_TEMPLATE_ITER(TypeName, Id, Name) \
+ template class QMetaTypeForType<Name>; \
+ template struct QMetaTypeInterfaceWrapper<Name>;
+QT_FOR_EACH_STATIC_PRIMITIVE_NON_VOID_TYPE(QT_METATYPE_DECLARE_TEMPLATE_ITER)
QT_FOR_EACH_STATIC_PRIMITIVE_POINTER(QT_METATYPE_DECLARE_TEMPLATE_ITER)
QT_FOR_EACH_STATIC_CORE_CLASS(QT_METATYPE_DECLARE_TEMPLATE_ITER)
QT_FOR_EACH_STATIC_CORE_POINTER(QT_METATYPE_DECLARE_TEMPLATE_ITER)
QT_FOR_EACH_STATIC_CORE_TEMPLATE(QT_METATYPE_DECLARE_TEMPLATE_ITER)
+
#undef QT_METATYPE_DECLARE_TEMPLATE_ITER
#endif
}
diff --git a/src/corelib/kernel/qmetatype.h b/src/corelib/kernel/qmetatype.h
index c68809169c..e3ef1474da 100644
--- a/src/corelib/kernel/qmetatype.h
+++ b/src/corelib/kernel/qmetatype.h
@@ -1,43 +1,7 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Copyright (C) 2018 Intel Corporation.
-** Copyright (C) 2014 Olivier Goffart <ogoffart@woboq.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// Copyright (C) 2018 Intel Corporation.
+// Copyright (C) 2014 Olivier Goffart <ogoffart@woboq.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QMETATYPE_H
#define QMETATYPE_H
@@ -46,14 +10,14 @@
#include <QtCore/qatomic.h>
#include <QtCore/qbytearray.h>
#include <QtCore/qcompare.h>
-#include <QtCore/qvarlengtharray.h>
-#include <QtCore/qrefcount.h>
-#include <QtCore/qscopeguard.h>
#include <QtCore/qdatastream.h>
+#include <QtCore/qfloat16.h>
+#include <QtCore/qhashfunctions.h>
#include <QtCore/qiterable.h>
#ifndef QT_NO_QOBJECT
#include <QtCore/qobjectdefs.h>
#endif
+#include <QtCore/qscopeguard.h>
#include <array>
#include <new>
@@ -61,6 +25,8 @@
#include <list>
#include <map>
#include <functional>
+#include <optional>
+#include <QtCore/q20type_traits.h>
#ifdef Bool
#error qmetatype.h must be included before any header file that defines Bool
@@ -78,8 +44,7 @@ template <typename T>
inline constexpr int qMetaTypeId();
// F is a tuple: (QMetaType::TypeName, QMetaType::TypeNameID, RealType)
-#define QT_FOR_EACH_STATIC_PRIMITIVE_TYPE(F)\
- F(Void, 43, void) \
+#define QT_FOR_EACH_STATIC_PRIMITIVE_NON_VOID_TYPE(F)\
F(Bool, 1, bool) \
F(Int, 2, int) \
F(UInt, 3, uint) \
@@ -99,7 +64,11 @@ inline constexpr int qMetaTypeId();
F(Nullptr, 51, std::nullptr_t) \
F(QCborSimpleType, 52, QCborSimpleType) \
-#define QT_FOR_EACH_STATIC_PRIMITIVE_POINTER(F)\
+#define QT_FOR_EACH_STATIC_PRIMITIVE_TYPE(F) \
+ QT_FOR_EACH_STATIC_PRIMITIVE_NON_VOID_TYPE(F) \
+ F(Void, 43, void) \
+
+#define QT_FOR_EACH_STATIC_PRIMITIVE_POINTER(F) \
F(VoidStar, 31, void*) \
#if QT_CONFIG(easingcurve)
@@ -123,6 +92,12 @@ inline constexpr int qMetaTypeId();
#else
# define QT_FOR_EACH_STATIC_REGULAR_EXPRESSION(F)
#endif
+#ifndef QT_NO_VARIANT
+# define QT_FOR_EACH_STATIC_QVARIANT(F) \
+ F(QVariant, 41, QVariant)
+#else
+# define QT_FOR_EACH_STATIC_QVARIANT(F)
+#endif
#define QT_FOR_EACH_STATIC_CORE_CLASS(F)\
F(QChar, 7, QChar) \
@@ -144,7 +119,7 @@ inline constexpr int qMetaTypeId();
F(QPointF, 26, QPointF) \
QT_FOR_EACH_STATIC_EASINGCURVE(F) \
F(QUuid, 30, QUuid) \
- F(QVariant, 41, QVariant) \
+ QT_FOR_EACH_STATIC_QVARIANT(F) \
QT_FOR_EACH_STATIC_REGULAR_EXPRESSION(F) \
F(QJsonValue, 45, QJsonValue) \
F(QJsonObject, 46, QJsonObject) \
@@ -153,18 +128,26 @@ inline constexpr int qMetaTypeId();
F(QCborValue, 53, QCborValue) \
F(QCborArray, 54, QCborArray) \
F(QCborMap, 55, QCborMap) \
+ F(Float16, 63, qfloat16) \
QT_FOR_EACH_STATIC_ITEMMODEL_CLASS(F)
#define QT_FOR_EACH_STATIC_CORE_POINTER(F)\
F(QObjectStar, 39, QObject*)
-#define QT_FOR_EACH_STATIC_CORE_TEMPLATE(F)\
+#ifndef QT_NO_VARIANT
+# define QT_FOR_EACH_STATIC_CORE_TEMPLATE(F)\
F(QVariantMap, 8, QVariantMap) \
F(QVariantList, 9, QVariantList) \
F(QVariantHash, 28, QVariantHash) \
F(QVariantPair, 58, QVariantPair) \
F(QByteArrayList, 49, QByteArrayList) \
F(QStringList, 11, QStringList) \
+ /**/
+#else
+# define QT_FOR_EACH_STATIC_CORE_TEMPLATE(F)\
+ F(QByteArrayList, 49, QByteArrayList) \
+ F(QStringList, 11, QStringList)
+#endif
#if QT_CONFIG(shortcut)
#define QT_FOR_EACH_STATIC_KEYSEQUENCE_CLASS(F)\
@@ -218,12 +201,20 @@ inline constexpr int qMetaTypeId();
F(UInt, -1, uint, "quint32") \
F(LongLong, -1, qlonglong, "qint64") \
F(ULongLong, -1, qulonglong, "quint64") \
+ F(QByteArrayList, -1, QByteArrayList, "QList<QByteArray>") \
+ F(QStringList, -1, QStringList, "QList<QString>") \
+ QT_FOR_EACH_STATIC_VARIANT_ALIAS_TYPE(F)
+
+#ifndef QT_NO_VARIANT
+#define QT_FOR_EACH_STATIC_VARIANT_ALIAS_TYPE(F) \
F(QVariantList, -1, QVariantList, "QList<QVariant>") \
F(QVariantMap, -1, QVariantMap, "QMap<QString,QVariant>") \
F(QVariantHash, -1, QVariantHash, "QHash<QString,QVariant>") \
F(QVariantPair, -1, QVariantPair, "QPair<QVariant,QVariant>") \
- F(QByteArrayList, -1, QByteArrayList, "QList<QByteArray>") \
- F(QStringList, -1, QStringList, "QList<QString>") \
+ /**/
+#else
+#define QT_FOR_EACH_STATIC_VARIANT_ALIAS_TYPE(F)
+#endif
#define QT_FOR_EACH_STATIC_TYPE(F)\
QT_FOR_EACH_STATIC_PRIMITIVE_TYPE(F)\
@@ -259,14 +250,35 @@ struct QMetaObject;
namespace QtPrivate
{
+class QMetaTypeInterface;
+
+// MSVC is the only supported compiler that includes the type of a variable in
+// its mangled form, so it's not binary-compatible to drop the const in
+// QMetaTypeInterfaceWrapper::metaType for it, which means we must keep the
+// mutable field until Qt 7.
+#if QT_VERSION >= QT_VERSION_CHECK(7, 0, 0) || defined(QT_BOOTSTRAPPED) || !defined(Q_CC_MSVC)
+# define QMTI_MUTABLE
+using NonConstMetaTypeInterface = QMetaTypeInterface;
+#else
+# define QMTI_MUTABLE mutable
+using NonConstMetaTypeInterface = const QMetaTypeInterface;
+#endif
+
class QMetaTypeInterface
{
public:
- ushort revision; // 0 in Qt 6.0. Can increase if new field are added
+
+ /* Revision: Can increase if new field are added, or if semantics changes
+ 0: Initial Revision
+ 1: the meaning of the NeedsDestruction flag changed
+ */
+ static inline constexpr ushort CurrentRevision = 1;
+
+ ushort revision;
ushort alignment;
uint size;
uint flags;
- mutable QBasicAtomicInt typeId;
+ QMTI_MUTABLE QBasicAtomicInt typeId;
using MetaObjectFn = const QMetaObject *(*)(const QMetaTypeInterface *);
MetaObjectFn metaObjectFn;
@@ -295,6 +307,7 @@ public:
using LegacyRegisterOp = void (*)();
LegacyRegisterOp legacyRegisterOp;
};
+#undef QMTI_MUTABLE
/*!
This template is used for implicit conversion from type From to type To.
@@ -327,14 +340,14 @@ To convertImplicit(const From& from)
class Q_CORE_EXPORT QMetaType {
public:
-#ifndef Q_CLANG_QDOC
+#ifndef Q_QDOC
// The code that actually gets compiled.
enum Type {
// these are merged with QVariant
QT_FOR_EACH_STATIC_TYPE(QT_DEFINE_METATYPE_ID)
FirstCoreType = Bool,
- LastCoreType = QVariantPair,
+ LastCoreType = Float16,
FirstGuiType = QFont,
LastGuiType = QColorSpace,
FirstWidgetsType = QSizePolicy,
@@ -363,9 +376,10 @@ public:
QByteArrayList = 49, QObjectStar = 39, SChar = 40,
Void = 43,
Nullptr = 51,
- QVariantMap = 8, QVariantList = 9, QVariantHash = 28,
+ QVariantMap = 8, QVariantList = 9, QVariantHash = 28, QVariantPair = 58,
QCborSimpleType = 52, QCborValue = 53, QCborArray = 54, QCborMap = 55,
Char16 = 56, Char32 = 57,
+ Int128 = 59, UInt128 = 60, Float128 = 61, BFloat16 = 62, Float16 = 63,
// Gui types
QFont = 0x1000, QPixmap = 0x1001, QBrush = 0x1002, QColor = 0x1003, QPalette = 0x1004,
@@ -376,8 +390,8 @@ public:
// Widget types
QSizePolicy = 0x2000,
- LastCoreType = Char32,
- LastGuiType = QColorSpace,
+
+ // Start-point for client-code types:
User = 65536
};
#endif
@@ -400,6 +414,9 @@ public:
IsPointer = 0x800,
IsQmlList =0x1000, // used in the QML engine to recognize QQmlListProperty<T> and list<T>
IsConst = 0x2000,
+ // since 6.5:
+ NeedsCopyConstruction = 0x4000,
+ NeedsMoveConstruction = 0x8000,
};
Q_DECLARE_FLAGS(TypeFlags, TypeFlag)
@@ -417,7 +434,7 @@ public:
{ return QMetaType(type).name(); }
QT_DEPRECATED_VERSION_6_0
static int sizeOf(int type)
- { return QMetaType(type).sizeOf(); }
+ { return int(QMetaType(type).sizeOf()); }
QT_DEPRECATED_VERSION_6_0
static TypeFlags typeFlags(int type)
{ return QMetaType(type).flags(); }
@@ -445,7 +462,12 @@ public:
bool isValid() const;
bool isRegistered() const;
-#if QT_REMOVED_SINCE(6, 1) || defined(Q_QDOC)
+ void registerType() const
+ {
+ // "register" is a reserved keyword
+ registerHelper();
+ }
+#if QT_CORE_REMOVED_SINCE(6, 1) || defined(Q_QDOC)
int id() const;
#else
// ### Qt 7: Remove traces of out of line version
@@ -453,12 +475,7 @@ public:
int id(int = 0) const
{
// keep in sync with the version in removed_api.cpp
- if (d_ptr) {
- if (int id = d_ptr->typeId.loadRelaxed())
- return id;
- return idHelper();
- }
- return 0;
+ return registerHelper();
}
#endif
constexpr qsizetype sizeOf() const;
@@ -474,6 +491,10 @@ public:
QPartialOrdering compare(const void *lhs, const void *rhs) const;
bool equals(const void *lhs, const void *rhs) const;
+ bool isDefaultConstructible() const noexcept { return d_ptr && isDefaultConstructible(d_ptr); }
+ bool isCopyConstructible() const noexcept { return d_ptr && isCopyConstructible(d_ptr); }
+ bool isMoveConstructible() const noexcept { return d_ptr && isMoveConstructible(d_ptr); }
+ bool isDestructible() const noexcept { return d_ptr && isDestructible(d_ptr); }
bool isEqualityComparable() const;
bool isOrdered() const;
@@ -492,6 +513,8 @@ public:
#endif
#endif
+ QMetaType underlyingType() const;
+
template<typename T>
constexpr static QMetaType fromType();
static QMetaType fromName(QByteArrayView name);
@@ -509,9 +532,10 @@ public:
}
friend bool operator!=(QMetaType a, QMetaType b) { return !(a == b); }
-public:
-
#ifndef QT_NO_DEBUG_STREAM
+private:
+ friend Q_CORE_EXPORT QDebug operator<<(QDebug d, QMetaType m);
+public:
bool debugStream(QDebug& dbg, const void *rhs);
bool hasRegisteredDebugStreamOperator() const;
@@ -611,7 +635,14 @@ public:
auto converter = [function = std::move(function)](const void *from, void *to) -> bool {
const From *f = static_cast<const From *>(from);
To *t = static_cast<To *>(to);
- *t = function(*f);
+ auto &&r = function(*f);
+ if constexpr (std::is_same_v<q20::remove_cvref_t<decltype(r)>, std::optional<To>>) {
+ if (!r)
+ return false;
+ *t = *std::forward<decltype(r)>(r);
+ } else {
+ *t = std::forward<decltype(r)>(r);
+ }
return true;
};
return registerConverterImpl<From, To>(std::move(converter), fromType, toType);
@@ -720,7 +751,7 @@ public:
static bool hasRegisteredMutableViewFunction(QMetaType fromType, QMetaType toType);
-#ifndef Q_CLANG_QDOC
+#ifndef Q_QDOC
template<typename, bool> friend struct QtPrivate::SequentialValueTypeIsMetaType;
template<typename, bool> friend struct QtPrivate::AssociativeValueTypeIsMetaType;
template<typename, bool> friend struct QtPrivate::IsMetaTypePair;
@@ -740,7 +771,28 @@ public:
const QtPrivate::QMetaTypeInterface *iface() const { return d_ptr; }
private:
+ static bool isDefaultConstructible(const QtPrivate::QMetaTypeInterface *) noexcept Q_DECL_PURE_FUNCTION;
+ static bool isCopyConstructible(const QtPrivate::QMetaTypeInterface *) noexcept Q_DECL_PURE_FUNCTION;
+ static bool isMoveConstructible(const QtPrivate::QMetaTypeInterface *) noexcept Q_DECL_PURE_FUNCTION;
+ static bool isDestructible(const QtPrivate::QMetaTypeInterface *) noexcept Q_DECL_PURE_FUNCTION;
+
+#if QT_CORE_REMOVED_SINCE(6, 5)
int idHelper() const;
+#endif
+ static int registerHelper(const QtPrivate::QMetaTypeInterface *iface);
+ int registerHelper() const
+ {
+ // keep in sync with the QMetaType::id() version in removed_api.cpp
+ if (d_ptr) {
+ if (int id = d_ptr->typeId.loadRelaxed())
+ return id;
+ return registerHelper(d_ptr);
+ }
+ return 0;
+ }
+
+ friend int qRegisterMetaType(QMetaType meta);
+
friend class QVariant;
const QtPrivate::QMetaTypeInterface *d_ptr = nullptr;
};
@@ -821,6 +873,34 @@ QT_FOR_EACH_AUTOMATIC_TEMPLATE_SMART_POINTER(QT_FORWARD_DECLARE_SHARED_POINTER_T
namespace QtPrivate
{
+ namespace detail {
+ template<typename T, typename ODR_VIOLATION_PREVENTER>
+ struct is_complete_helper
+ {
+ template<typename U>
+ static auto check(U *) -> std::integral_constant<bool, sizeof(U) != 0>;
+ static auto check(...) -> std::false_type;
+ using type = decltype(check(static_cast<T *>(nullptr)));
+ };
+ } // namespace detail
+
+ template <typename T, typename ODR_VIOLATION_PREVENTER>
+ struct is_complete : detail::is_complete_helper<std::remove_reference_t<T>, ODR_VIOLATION_PREVENTER>::type {};
+
+ template <typename T> struct MetatypeDecay { using type = T; };
+ template <typename T> struct MetatypeDecay<const T> { using type = T; };
+ template <typename T> struct MetatypeDecay<const T &> { using type = T; };
+
+ template <typename T> struct IsPointerDeclaredOpaque :
+ std::disjunction<std::is_member_pointer<T>,
+ std::is_function<std::remove_pointer_t<T>>>
+ {};
+ template <> struct IsPointerDeclaredOpaque<void *> : std::true_type {};
+ template <> struct IsPointerDeclaredOpaque<const void *> : std::true_type {};
+
+ // Note: this does not check that T = U* isn't pointing to a
+ // forward-declared type. You may want to combine with
+ // checkTypeIsSuitableForMetaType().
template<typename T>
struct IsPointerToTypeDerivedFromQObject
{
@@ -855,7 +935,6 @@ namespace QtPrivate
static yes_type checkType(const QObject* );
#endif
static no_type checkType(...);
- static_assert(sizeof(T), "Type argument of Q_PROPERTY or Q_DECLARE_METATYPE(T*) must be fully defined");
enum { Value = sizeof(checkType(static_cast<T*>(nullptr))) == sizeof(yes_type) };
};
@@ -874,6 +953,9 @@ namespace QtPrivate
};
};
+ template <typename T>
+ using IsRealGadget = std::bool_constant<IsGadgetHelper<T>::IsRealGadget>;
+
template<typename T, typename Enable = void>
struct IsPointerToGadgetHelper { enum { IsRealGadget = false, IsGadgetOrDerivedFrom = false }; };
@@ -912,13 +994,6 @@ namespace QtPrivate
static constexpr MetaObjectFn metaObjectFunction = nullptr;
};
#ifndef QT_NO_QOBJECT
- template<>
- struct MetaObjectForType<void>
- {
- static constexpr const QMetaObject *value() { return nullptr; }
- using MetaObjectFn = const QMetaObject *(*)(const QMetaTypeInterface *);
- static constexpr MetaObjectFn metaObjectFunction = nullptr;
- };
template<typename T>
struct MetaObjectForType<T*, typename std::enable_if<IsPointerToTypeDerivedFromQObject<T*>::Value>::type>
{
@@ -926,7 +1001,12 @@ namespace QtPrivate
static constexpr const QMetaObject *metaObjectFunction(const QMetaTypeInterface *) { return &T::staticMetaObject; }
};
template<typename T>
- struct MetaObjectForType<T, typename std::enable_if<IsGadgetHelper<T>::IsGadgetOrDerivedFrom>::type>
+ struct MetaObjectForType<T, std::enable_if_t<
+ std::disjunction_v<
+ std::bool_constant<IsGadgetHelper<T>::IsGadgetOrDerivedFrom>,
+ std::is_base_of<QObject, T>
+ >
+ >>
{
static constexpr const QMetaObject *value() { return &T::staticMetaObject; }
static constexpr const QMetaObject *metaObjectFunction(const QMetaTypeInterface *) { return &T::staticMetaObject; }
@@ -1118,12 +1198,28 @@ namespace QtPrivate
};
#endif
+ template <typename X> static constexpr bool checkTypeIsSuitableForMetaType()
+ {
+ using T = typename MetatypeDecay<X>::type;
+ static_assert(is_complete<T, void>::value || std::is_void_v<T>,
+ "Meta Types must be fully defined");
+ static_assert(!std::is_reference_v<T>,
+ "Meta Types cannot be non-const references or rvalue references.");
+ if constexpr (std::is_pointer_v<T> && !IsPointerDeclaredOpaque<T>::value) {
+ using Pointed = std::remove_pointer_t<T>;
+ static_assert(is_complete<Pointed, void>::value,
+ "Pointer Meta Types must either point to fully-defined types "
+ "or be declared with Q_DECLARE_OPAQUE_POINTER(T *)");
+ }
+ return true;
+ }
+
Q_CORE_EXPORT bool isBuiltinType(const QByteArray &type);
} // namespace QtPrivate
template <typename T, int =
QtPrivate::IsPointerToTypeDerivedFromQObject<T>::Value ? QMetaType::PointerToQObject :
- QtPrivate::IsGadgetHelper<T>::IsRealGadget ? QMetaType::IsGadget :
+ QtPrivate::IsRealGadget<T>::value ? QMetaType::IsGadget :
QtPrivate::IsPointerToGadgetHelper<T>::IsRealGadget ? QMetaType::PointerToGadget :
QtPrivate::IsQEnumHelper<T>::Value ? QMetaType::IsEnumeration : 0>
struct QMetaTypeIdQObject
@@ -1150,7 +1246,12 @@ template <typename T>
struct QMetaTypeId2<const T&> : QMetaTypeId2<T> {};
template <typename T>
-struct QMetaTypeId2<T&> { enum {Defined = false }; };
+struct QMetaTypeId2<T&>
+{
+ using NameAsArrayType = void;
+ enum { Defined = false, IsBuiltIn = false };
+ static inline constexpr int qt_metatype_id() { return 0; }
+};
namespace QtPrivate {
template <typename T, bool Defined = QMetaTypeId2<T>::Defined>
@@ -1179,8 +1280,10 @@ namespace QtPrivate {
struct QMetaTypeTypeFlags
{
enum { Flags = (QTypeInfo<T>::isRelocatable ? QMetaType::RelocatableType : 0)
- | (QTypeInfo<T>::isComplex ? QMetaType::NeedsConstruction : 0)
- | (QTypeInfo<T>::isComplex ? QMetaType::NeedsDestruction : 0)
+ | ((!std::is_default_constructible_v<T> || !QTypeInfo<T>::isValueInitializationBitwiseZero) ? QMetaType::NeedsConstruction : 0)
+ | (!std::is_trivially_destructible_v<T> ? QMetaType::NeedsDestruction : 0)
+ | (!std::is_trivially_copy_constructible_v<T> ? QMetaType::NeedsCopyConstruction : 0)
+ | (!std::is_trivially_move_constructible_v<T> ? QMetaType::NeedsMoveConstruction : 0)
| (IsPointerToTypeDerivedFromQObject<T>::Value ? QMetaType::PointerToQObject : 0)
| (IsSharedPointerToTypeDerivedFromQObject<T>::Value ? QMetaType::SharedPointerToQObject : 0)
| (IsWeakPointerToTypeDerivedFromQObject<T>::Value ? QMetaType::WeakPointerToQObject : 0)
@@ -1188,7 +1291,7 @@ namespace QtPrivate {
| (IsEnumOrFlags<T>::value ? QMetaType::IsEnumeration : 0)
| (IsGadgetHelper<T>::IsGadgetOrDerivedFrom ? QMetaType::IsGadget : 0)
| (IsPointerToGadgetHelper<T>::IsGadgetOrDerivedFrom ? QMetaType::PointerToGadget : 0)
- | (QTypeInfo<T>::isPointer ? QMetaType::IsPointer : 0)
+ | (std::is_pointer_v<T> ? QMetaType::IsPointer : 0)
| (IsUnsignedEnum<T> ? QMetaType::IsUnsignedEnumeration : 0)
| (IsQmlListType<T> ? QMetaType::IsQmlList : 0)
| (std::is_const_v<std::remove_pointer_t<T>> ? QMetaType::IsConst : 0)
@@ -1226,7 +1329,7 @@ namespace QtPrivate {
}
template <typename T>
-int qRegisterNormalizedMetaType(const QT_PREPEND_NAMESPACE(QByteArray) &normalizedTypeName)
+int qRegisterNormalizedMetaTypeImplementation(const QT_PREPEND_NAMESPACE(QByteArray) &normalizedTypeName)
{
#ifndef QT_NO_QOBJECT
Q_ASSERT_X(normalizedTypeName == QMetaObject::normalizedType(normalizedTypeName.constData()),
@@ -1254,6 +1357,39 @@ int qRegisterNormalizedMetaType(const QT_PREPEND_NAMESPACE(QByteArray) &normaliz
return id;
}
+// This primary template calls the -Implementation, like all other specialisations should.
+// But the split allows to
+// - in a header:
+// - define a specialization of this template calling an out-of-line function
+// (QT_DECL_METATYPE_EXTERN{,_TAGGED})
+// - in the .cpp file:
+// - define the out-of-line wrapper to call the -Implementation
+// (QT_IMPL_METATYPE_EXTERN{,_TAGGED})
+// The _TAGGED variants let you choose a tag (must be a C identifier) to disambiguate
+// the out-of-line function; the non-_TAGGED variants use the passed class name as tag.
+template <typename T>
+int qRegisterNormalizedMetaType(const QT_PREPEND_NAMESPACE(QByteArray) &normalizedTypeName)
+{
+ return qRegisterNormalizedMetaTypeImplementation<T>(normalizedTypeName);
+}
+
+#define QT_DECL_METATYPE_EXTERN_TAGGED(TYPE, TAG, EXPORT) \
+ QT_BEGIN_NAMESPACE \
+ EXPORT int qRegisterNormalizedMetaType_ ## TAG (const QByteArray &); \
+ template <> inline int qRegisterNormalizedMetaType< TYPE >(const QByteArray &name) \
+ { return qRegisterNormalizedMetaType_ ## TAG (name); } \
+ QT_END_NAMESPACE \
+ Q_DECLARE_METATYPE(TYPE) \
+ /* end */
+#define QT_IMPL_METATYPE_EXTERN_TAGGED(TYPE, TAG) \
+ int qRegisterNormalizedMetaType_ ## TAG (const QByteArray &name) \
+ { return qRegisterNormalizedMetaTypeImplementation< TYPE >(name); } \
+ /* end */
+#define QT_DECL_METATYPE_EXTERN(TYPE, EXPORT) \
+ QT_DECL_METATYPE_EXTERN_TAGGED(TYPE, TYPE, EXPORT)
+#define QT_IMPL_METATYPE_EXTERN(TYPE) \
+ QT_IMPL_METATYPE_EXTERN_TAGGED(TYPE, TYPE)
+
template <typename T>
int qRegisterMetaType(const char *typeName)
{
@@ -1269,6 +1405,9 @@ template <typename T>
inline constexpr int qMetaTypeId()
{
if constexpr (bool(QMetaTypeId2<T>::IsBuiltIn)) {
+ // this has the same result as the below code, but avoids asking the
+ // compiler to load a global variable whose value we know at compile
+ // time
return QMetaTypeId2<T>::MetaType;
} else {
return QMetaType::fromType<T>().id();
@@ -1282,6 +1421,11 @@ inline constexpr int qRegisterMetaType()
return id;
}
+inline int qRegisterMetaType(QMetaType meta)
+{
+ return meta.registerHelper();
+}
+
#ifndef QT_NO_QOBJECT
template <typename T>
struct QMetaTypeIdQObject<T*, QMetaType::PointerToQObject>
@@ -1292,7 +1436,7 @@ struct QMetaTypeIdQObject<T*, QMetaType::PointerToQObject>
static int qt_metatype_id()
{
- static QBasicAtomicInt metatype_id = Q_BASIC_ATOMIC_INITIALIZER(0);
+ Q_CONSTINIT static QBasicAtomicInt metatype_id = Q_BASIC_ATOMIC_INITIALIZER(0);
if (const int id = metatype_id.loadAcquire())
return id;
const char *const cName = T::staticMetaObject.className();
@@ -1314,7 +1458,7 @@ struct QMetaTypeIdQObject<T, QMetaType::IsGadget>
static int qt_metatype_id()
{
- static QBasicAtomicInt metatype_id = Q_BASIC_ATOMIC_INITIALIZER(0);
+ Q_CONSTINIT static QBasicAtomicInt metatype_id = Q_BASIC_ATOMIC_INITIALIZER(0);
if (const int id = metatype_id.loadAcquire())
return id;
const char *const cName = T::staticMetaObject.className();
@@ -1333,7 +1477,7 @@ struct QMetaTypeIdQObject<T*, QMetaType::PointerToGadget>
static int qt_metatype_id()
{
- static QBasicAtomicInt metatype_id = Q_BASIC_ATOMIC_INITIALIZER(0);
+ Q_CONSTINIT static QBasicAtomicInt metatype_id = Q_BASIC_ATOMIC_INITIALIZER(0);
if (const int id = metatype_id.loadAcquire())
return id;
const char *const cName = T::staticMetaObject.className();
@@ -1355,7 +1499,7 @@ struct QMetaTypeIdQObject<T, QMetaType::IsEnumeration>
static int qt_metatype_id()
{
- static QBasicAtomicInt metatype_id = Q_BASIC_ATOMIC_INITIALIZER(0);
+ Q_CONSTINIT static QBasicAtomicInt metatype_id = Q_BASIC_ATOMIC_INITIALIZER(0);
if (const int id = metatype_id.loadAcquire())
return id;
const char *eName = qt_getEnumName(T());
@@ -1372,11 +1516,8 @@ struct QMetaTypeIdQObject<T, QMetaType::IsEnumeration>
#define Q_DECLARE_OPAQUE_POINTER(POINTER) \
QT_BEGIN_NAMESPACE namespace QtPrivate { \
- template <> \
- struct IsPointerToTypeDerivedFromQObject<POINTER > \
- { \
- enum { Value = false }; \
- }; \
+ template <> struct IsPointerDeclaredOpaque<POINTER> \
+ : std::true_type {}; \
} QT_END_NAMESPACE \
/**/
@@ -1388,9 +1529,10 @@ struct QMetaTypeIdQObject<T, QMetaType::IsEnumeration>
struct QMetaTypeId< TYPE > \
{ \
enum { Defined = 1 }; \
+ static_assert(QtPrivate::checkTypeIsSuitableForMetaType<TYPE>()); \
static int qt_metatype_id() \
{ \
- static QBasicAtomicInt metatype_id = Q_BASIC_ATOMIC_INITIALIZER(0); \
+ Q_CONSTINIT static QBasicAtomicInt metatype_id = Q_BASIC_ATOMIC_INITIALIZER(0); \
if (const int id = metatype_id.loadAcquire()) \
return id; \
constexpr auto arr = QtPrivate::typenameHelper<TYPE>(); \
@@ -1438,7 +1580,7 @@ struct QMetaTypeId< SINGLE_ARG_TEMPLATE<T> > \
}; \
static int qt_metatype_id() \
{ \
- static QBasicAtomicInt metatype_id = Q_BASIC_ATOMIC_INITIALIZER(0); \
+ Q_CONSTINIT static QBasicAtomicInt metatype_id = Q_BASIC_ATOMIC_INITIALIZER(0); \
if (const int id = metatype_id.loadRelaxed()) \
return id; \
const char *tName = QMetaType::fromType<T>().name(); \
@@ -1466,7 +1608,7 @@ struct QMetaTypeId< DOUBLE_ARG_TEMPLATE<T, U> > \
}; \
static int qt_metatype_id() \
{ \
- static QBasicAtomicInt metatype_id = Q_BASIC_ATOMIC_INITIALIZER(0); \
+ Q_CONSTINIT static QBasicAtomicInt metatype_id = Q_BASIC_ATOMIC_INITIALIZER(0); \
if (const int id = metatype_id.loadAcquire()) \
return id; \
const char *tName = QMetaType::fromType<T>().name(); \
@@ -1514,7 +1656,7 @@ struct SharedPointerMetaTypeIdHelper<SMART_POINTER<T>, true> \
}; \
static int qt_metatype_id() \
{ \
- static QBasicAtomicInt metatype_id = Q_BASIC_ATOMIC_INITIALIZER(0); \
+ Q_CONSTINIT static QBasicAtomicInt metatype_id = Q_BASIC_ATOMIC_INITIALIZER(0); \
if (const int id = metatype_id.loadAcquire()) \
return id; \
const char * const cName = T::staticMetaObject.className(); \
@@ -1529,7 +1671,7 @@ struct SharedPointerMetaTypeIdHelper<SMART_POINTER<T>, true> \
}; \
template<typename T> \
struct MetaTypeSmartPointerHelper<SMART_POINTER<T> , \
- typename std::enable_if<IsPointerToTypeDerivedFromQObject<T*>::Value>::type> \
+ typename std::enable_if<IsPointerToTypeDerivedFromQObject<T*>::Value && !std::is_const_v<T>>::type> \
{ \
static bool registerConverter() \
{ \
@@ -1733,7 +1875,7 @@ private:
#ifdef Q_CC_MSVC
/// On MSVC, keywords like class or struct are not separated with spaces in constexpr
/// context
- if (msvcKw)
+ if (msvcKw && !is_ident_char(*b))
return true;
#endif
Q_UNUSED(msvcKw);
@@ -2114,6 +2256,7 @@ struct is_std_pair<std::pair<T1_, T2_>> : std::true_type {
using T2 = T2_;
};
+namespace TypeNameHelper {
template<typename T>
constexpr auto typenameHelper()
{
@@ -2154,23 +2297,25 @@ constexpr auto typenameHelper()
#ifdef QT_NAMESPACE
QT_STRINGIFY(QT_NAMESPACE) "::"
#endif
-#ifdef Q_CC_MSVC
- "auto __cdecl QtPrivate::typenameHelper<"
+#if defined(Q_CC_MSVC) && defined(Q_CC_CLANG)
+ "auto __cdecl QtPrivate::TypeNameHelper::typenameHelper(void) [T = "
+#elif defined(Q_CC_MSVC)
+ "auto __cdecl QtPrivate::TypeNameHelper::typenameHelper<"
#elif defined(Q_CC_CLANG)
- "auto QtPrivate::typenameHelper() [T = "
+ "auto QtPrivate::TypeNameHelper::typenameHelper() [T = "
#elif defined(Q_CC_GHS)
- "auto QtPrivate::typenameHelper<T>() [with T="
+ "auto QtPrivate::TypeNameHelper::typenameHelper<T>()[with T="
#else
- "constexpr auto QtPrivate::typenameHelper() [with T = "
+ "constexpr auto QtPrivate::TypeNameHelper::typenameHelper() [with T = "
#endif
) - 1;
-#ifdef Q_CC_MSVC
+#if defined(Q_CC_MSVC) && !defined(Q_CC_CLANG)
constexpr int suffix = sizeof(">(void)");
#else
constexpr int suffix = sizeof("]");
#endif
-#if (defined(Q_CC_GNU) && !defined(Q_CC_INTEL) && !defined(Q_CC_CLANG) && Q_CC_GNU < 804)
+#if defined(Q_CC_GNU_ONLY) && Q_CC_GNU_ONLY < 804
auto func = Q_FUNC_INFO;
const char *begin = func + prefix;
const char *end = func + sizeof(Q_FUNC_INFO) - suffix;
@@ -2187,6 +2332,8 @@ constexpr auto typenameHelper()
return result;
}
}
+} // namespace TypeNameHelper
+using TypeNameHelper::typenameHelper;
template<typename T, typename = void>
struct BuiltinMetaType : std::integral_constant<int, 0>
@@ -2243,28 +2390,45 @@ struct QDebugStreamOperatorForType <T, false>
template<typename T, bool = QTypeTraits::has_stream_operator_v<QDataStream, T>>
struct QDataStreamOperatorForType
{
+ static constexpr QMetaTypeInterface::DataStreamOutFn dataStreamOut = nullptr;
+ static constexpr QMetaTypeInterface::DataStreamInFn dataStreamIn = nullptr;
+};
+
+#ifndef QT_NO_DATASTREAM
+template<typename T>
+struct QDataStreamOperatorForType <T, true>
+{
static void dataStreamOut(const QMetaTypeInterface *, QDataStream &ds, const void *a)
{ ds << *reinterpret_cast<const T *>(a); }
static void dataStreamIn(const QMetaTypeInterface *, QDataStream &ds, void *a)
{ ds >> *reinterpret_cast<T *>(a); }
};
+#endif
-template<typename T>
-struct QDataStreamOperatorForType <T, false>
-{
- static constexpr QMetaTypeInterface::DataStreamOutFn dataStreamOut = nullptr;
- static constexpr QMetaTypeInterface::DataStreamInFn dataStreamIn = nullptr;
-};
+// Performance optimization:
+//
+// Don't add all these symbols to the dynamic symbol tables on ELF systems and
+// on Darwin. Each library is going to have a copy anyway and QMetaType already
+// copes with some of these being "hidden" (see QMetaType::idHelper()). We may
+// as well let the linker know it can always use the local copy.
+//
+// This is currently not enabled for GCC due to
+// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106023
+
+#if !defined(Q_OS_WIN) && defined(Q_CC_CLANG)
+# pragma GCC visibility push(hidden)
+#endif
template<typename S>
class QMetaTypeForType
{
public:
static constexpr decltype(typenameHelper<S>()) name = typenameHelper<S>();
+ static constexpr unsigned Flags = QMetaTypeTypeFlags<S>::Flags;
static constexpr QMetaTypeInterface::DefaultCtrFn getDefaultCtr()
{
- if constexpr (std::is_default_constructible_v<S>) {
+ if constexpr (std::is_default_constructible_v<S> && !QTypeInfo<S>::isValueInitializationBitwiseZero) {
return [](const QMetaTypeInterface *, void *addr) { new (addr) S(); };
} else {
return nullptr;
@@ -2273,7 +2437,7 @@ public:
static constexpr QMetaTypeInterface::CopyCtrFn getCopyCtr()
{
- if constexpr (std::is_copy_constructible_v<S>) {
+ if constexpr (std::is_copy_constructible_v<S> && !std::is_trivially_copy_constructible_v<S>) {
return [](const QMetaTypeInterface *, void *addr, const void *other) {
new (addr) S(*reinterpret_cast<const S *>(other));
};
@@ -2284,7 +2448,7 @@ public:
static constexpr QMetaTypeInterface::MoveCtrFn getMoveCtr()
{
- if constexpr (std::is_move_constructible_v<S>) {
+ if constexpr (std::is_move_constructible_v<S> && !std::is_trivially_move_constructible_v<S>) {
return [](const QMetaTypeInterface *, void *addr, void *other) {
new (addr) S(std::move(*reinterpret_cast<S *>(other)));
};
@@ -2325,11 +2489,17 @@ public:
template<typename T>
struct QMetaTypeInterfaceWrapper
{
- static inline constexpr const QMetaTypeInterface metaType = {
- /*.revision=*/ 0,
+ // if the type ID for T is known at compile-time, then we can declare
+ // the QMetaTypeInterface object const; otherwise, we declare it as
+ // non-const and the .typeId is updated by QMetaType::idHelper().
+ static constexpr bool IsConstMetaTypeInterface = !!BuiltinMetaType<T>::value;
+ using InterfaceType = std::conditional_t<IsConstMetaTypeInterface, const QMetaTypeInterface, NonConstMetaTypeInterface>;
+
+ static inline InterfaceType metaType = {
+ /*.revision=*/ QMetaTypeInterface::CurrentRevision,
/*.alignment=*/ alignof(T),
/*.size=*/ sizeof(T),
- /*.flags=*/ QMetaTypeTypeFlags<T>::Flags,
+ /*.flags=*/ QMetaTypeForType<T>::Flags,
/*.typeId=*/ BuiltinMetaType<T>::value,
/*.metaObjectFn=*/ MetaObjectForType<T>::metaObjectFunction,
/*.name=*/ QMetaTypeForType<T>::getName(),
@@ -2346,6 +2516,9 @@ struct QMetaTypeInterfaceWrapper
};
};
+#if !defined(Q_OS_WIN) && defined(Q_CC_CLANG)
+# pragma GCC visibility pop
+#endif
template<>
class QMetaTypeInterfaceWrapper<void>
@@ -2372,56 +2545,37 @@ public:
/*.legacyRegisterOp=*/ nullptr
};
};
-#undef QT_METATYPE_CONSTEXPRLAMDA
/*
MSVC instantiates extern templates
(https://developercommunity.visualstudio.com/t/c11-extern-templates-doesnt-work-for-class-templat/157868)
+
+ The INTEGRITY compiler apparently does too.
+
+ On Windows (with other compilers or whenever MSVC is fixed), we can't declare
+ QMetaTypeInterfaceWrapper with __declspec(dllimport) because taking its
+ address is not a core constant expression.
*/
-#if !defined(QT_BOOTSTRAPPED) && !defined(Q_CC_MSVC)
+#if !defined(QT_BOOTSTRAPPED) && !defined(Q_CC_MSVC) && !defined(Q_OS_INTEGRITY)
-#if !defined(QT_BUILD_CORE_LIB)
-#define QT_METATYPE_TEMPLATE_EXPORT Q_CORE_EXPORT
+#ifdef QT_NO_DATA_RELOCATION
+# define QT_METATYPE_DECLARE_EXTERN_TEMPLATE_ITER(TypeName, Id, Name) \
+ extern template class Q_CORE_EXPORT QMetaTypeForType<Name>;
#else
-#define QT_METATYPE_TEMPLATE_EXPORT
+# define QT_METATYPE_DECLARE_EXTERN_TEMPLATE_ITER(TypeName, Id, Name) \
+ extern template class Q_CORE_EXPORT QMetaTypeForType<Name>; \
+ extern template struct Q_CORE_EXPORT QMetaTypeInterfaceWrapper<Name>;
#endif
-#define QT_METATYPE_DECLARE_EXTERN_TEMPLATE_ITER(TypeName, Id, Name) \
- extern template class QT_METATYPE_TEMPLATE_EXPORT QMetaTypeForType<Name>;
-QT_WARNING_PUSH
-QT_WARNING_DISABLE_GCC("-Wattributes") // false positive because of QMetaTypeForType<void>
-QT_FOR_EACH_STATIC_PRIMITIVE_TYPE(QT_METATYPE_DECLARE_EXTERN_TEMPLATE_ITER)
-QT_WARNING_POP
+QT_FOR_EACH_STATIC_PRIMITIVE_NON_VOID_TYPE(QT_METATYPE_DECLARE_EXTERN_TEMPLATE_ITER)
QT_FOR_EACH_STATIC_PRIMITIVE_POINTER(QT_METATYPE_DECLARE_EXTERN_TEMPLATE_ITER)
QT_FOR_EACH_STATIC_CORE_CLASS(QT_METATYPE_DECLARE_EXTERN_TEMPLATE_ITER)
QT_FOR_EACH_STATIC_CORE_POINTER(QT_METATYPE_DECLARE_EXTERN_TEMPLATE_ITER)
QT_FOR_EACH_STATIC_CORE_TEMPLATE(QT_METATYPE_DECLARE_EXTERN_TEMPLATE_ITER)
#undef QT_METATYPE_DECLARE_EXTERN_TEMPLATE_ITER
-#undef QT_METATYPE_TEMPLATE_EXPORT
#endif
template<typename T>
-constexpr const QMetaTypeInterface *qMetaTypeInterfaceForType()
-{
- using Ty = std::remove_cv_t<std::remove_reference_t<T>>;
- return &QMetaTypeInterfaceWrapper<Ty>::metaType;
-}
-
-namespace detail {
-template<typename T, typename ODR_VIOLATION_PREVENTER>
-struct is_complete_helper
-{
- template<typename U>
- static auto check(U *) -> std::integral_constant<bool, sizeof(U) != 0>;
- static auto check(...) -> std::false_type;
- using type = decltype(check(static_cast<T *>(nullptr)));
-};
-} // namespace detail
-
-template <typename T, typename ODR_VIOLATION_PREVENTER>
-struct is_complete : detail::is_complete_helper<T, ODR_VIOLATION_PREVENTER>::type {};
-
-template<typename T>
struct qRemovePointerLike
{
using type = std::remove_pointer_t<T>;
@@ -2446,16 +2600,34 @@ struct TypeAndForceComplete
using ForceComplete = ForceComplete_;
};
+template<typename T>
+constexpr const QMetaTypeInterface *qMetaTypeInterfaceForType()
+{
+ // don't check the type is suitable here
+ using Ty = typename MetatypeDecay<T>::type;
+ return &QMetaTypeInterfaceWrapper<Ty>::metaType;
+}
+
template<typename Unique, typename TypeCompletePair>
constexpr const QMetaTypeInterface *qTryMetaTypeInterfaceForType()
{
using T = typename TypeCompletePair::type;
using ForceComplete = typename TypeCompletePair::ForceComplete;
- using Ty = std::remove_cv_t<std::remove_reference_t<T>>;
+ using Ty = typename MetatypeDecay<T>::type;
using Tz = qRemovePointerLike_t<Ty>;
- if constexpr (!is_complete<Tz, Unique>::value && !ForceComplete::value) {
+
+ if constexpr (std::is_void_v<Tz>) {
+ // early out to avoid expanding the rest of the templates
+ return &QMetaTypeInterfaceWrapper<Ty>::metaType;
+ } else if constexpr (ForceComplete::value) {
+ checkTypeIsSuitableForMetaType<Ty>();
+ return &QMetaTypeInterfaceWrapper<Ty>::metaType;
+ } else if constexpr (std::is_reference_v<Tz>) {
+ return nullptr;
+ } else if constexpr (!is_complete<Tz, Unique>::value) {
return nullptr;
} else {
+ // don't check the type is suitable here
return &QMetaTypeInterfaceWrapper<Ty>::metaType;
}
}
@@ -2465,6 +2637,7 @@ constexpr const QMetaTypeInterface *qTryMetaTypeInterfaceForType()
template<typename T>
constexpr QMetaType QMetaType::fromType()
{
+ QtPrivate::checkTypeIsSuitableForMetaType<T>();
return QMetaType(QtPrivate::qMetaTypeInterfaceForType<T>());
}
@@ -2490,7 +2663,14 @@ constexpr const QMetaObject *QMetaType::metaObject() const
template<typename... T>
constexpr const QtPrivate::QMetaTypeInterface *const qt_metaTypeArray[] = {
- QtPrivate::qMetaTypeInterfaceForType<T>()...
+ /*
+ Unique in qTryMetaTypeInterfaceForType does not have to be unique here
+ as we require _all_ types here to be actually complete.
+ We just want to have the additional type processing that exist in
+ QtPrivate::qTryMetaTypeInterfaceForType as opposed to the normal
+ QtPrivate::qMetaTypeInterfaceForType used in QMetaType::fromType
+ */
+ QtPrivate::qTryMetaTypeInterfaceForType<void, QtPrivate::TypeAndForceComplete<T, std::true_type>>()...
};
constexpr const char *QMetaType::name() const
@@ -2503,8 +2683,16 @@ constexpr const QtPrivate::QMetaTypeInterface *const qt_incomplete_metaTypeArray
QtPrivate::qTryMetaTypeInterfaceForType<Unique, T>()...
};
+inline size_t qHash(QMetaType type, size_t seed = 0)
+{
+ // We cannot use d_ptr here since the same type in different DLLs
+ // might result in different pointers!
+ return qHash(type.id(), seed);
+}
+
QT_END_NAMESPACE
-Q_DECLARE_METATYPE(QtMetaTypePrivate::QPairVariantInterfaceImpl)
+QT_DECL_METATYPE_EXTERN_TAGGED(QtMetaTypePrivate::QPairVariantInterfaceImpl,
+ QPairVariantInterfaceImpl, Q_CORE_EXPORT)
#endif // QMETATYPE_H
diff --git a/src/corelib/kernel/qmetatype_p.h b/src/corelib/kernel/qmetatype_p.h
index 16270bc374..7e0457771f 100644
--- a/src/corelib/kernel/qmetatype_p.h
+++ b/src/corelib/kernel/qmetatype_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QMETATYPE_P_H
#define QMETATYPE_P_H
@@ -56,78 +20,6 @@
QT_BEGIN_NAMESPACE
-namespace QModulesPrivate {
-enum Names { Core, Gui, Widgets, Unknown, ModulesCount /* ModulesCount has to be at the end */ };
-
-static inline int moduleForType(const uint typeId)
-{
- if (typeId <= QMetaType::LastCoreType)
- return Core;
- if (typeId >= QMetaType::FirstGuiType && typeId <= QMetaType::LastGuiType)
- return Gui;
- if (typeId >= QMetaType::FirstWidgetsType && typeId <= QMetaType::LastWidgetsType)
- return Widgets;
- return Unknown;
-}
-
-template <typename T>
-class QTypeModuleInfo
-{
-public:
- enum Module : bool {
- IsCore = false,
- IsWidget = false,
- IsGui = false,
- IsUnknown = true
- };
-};
-
-#define QT_ASSIGN_TYPE_TO_MODULE(TYPE, MODULE) \
-template<> \
-class QTypeModuleInfo<TYPE > \
-{ \
-public: \
- enum Module : bool { \
- IsCore = (((MODULE) == (QModulesPrivate::Core))), \
- IsWidget = (((MODULE) == (QModulesPrivate::Widgets))), \
- IsGui = (((MODULE) == (QModulesPrivate::Gui))), \
- IsUnknown = !(IsCore || IsWidget || IsGui) \
- }; \
- static inline int module() { return MODULE; } \
- static_assert((IsUnknown && !(IsCore || IsWidget || IsGui)) \
- || (IsCore && !(IsUnknown || IsWidget || IsGui)) \
- || (IsWidget && !(IsUnknown || IsCore || IsGui)) \
- || (IsGui && !(IsUnknown || IsCore || IsWidget))); \
-};
-
-
-#define QT_DECLARE_CORE_MODULE_TYPES_ITER(TypeName, TypeId, Name) \
- QT_ASSIGN_TYPE_TO_MODULE(Name, QModulesPrivate::Core)
-#define QT_DECLARE_GUI_MODULE_TYPES_ITER(TypeName, TypeId, Name) \
- QT_ASSIGN_TYPE_TO_MODULE(Name, QModulesPrivate::Gui)
-#define QT_DECLARE_WIDGETS_MODULE_TYPES_ITER(TypeName, TypeId, Name) \
- QT_ASSIGN_TYPE_TO_MODULE(Name, QModulesPrivate::Widgets)
-
-QT_WARNING_PUSH
-#if defined(Q_CC_CLANG) && Q_CC_CLANG >= 900
-QT_WARNING_DISABLE_CLANG("-Wconstant-logical-operand")
-#endif
-
-QT_FOR_EACH_STATIC_PRIMITIVE_TYPE(QT_DECLARE_CORE_MODULE_TYPES_ITER)
-QT_FOR_EACH_STATIC_PRIMITIVE_POINTER(QT_DECLARE_CORE_MODULE_TYPES_ITER)
-QT_FOR_EACH_STATIC_CORE_CLASS(QT_DECLARE_CORE_MODULE_TYPES_ITER)
-QT_FOR_EACH_STATIC_CORE_POINTER(QT_DECLARE_CORE_MODULE_TYPES_ITER)
-QT_FOR_EACH_STATIC_CORE_TEMPLATE(QT_DECLARE_CORE_MODULE_TYPES_ITER)
-QT_FOR_EACH_STATIC_GUI_CLASS(QT_DECLARE_GUI_MODULE_TYPES_ITER)
-QT_FOR_EACH_STATIC_WIDGETS_CLASS(QT_DECLARE_WIDGETS_MODULE_TYPES_ITER)
-
-QT_WARNING_POP
-} // namespace QModulesPrivate
-
-#undef QT_DECLARE_CORE_MODULE_TYPES_ITER
-#undef QT_DECLARE_GUI_MODULE_TYPES_ITER
-#undef QT_DECLARE_WIDGETS_MODULE_TYPES_ITER
-
#define QMETATYPE_CONVERTER(To, From, assign_and_return) \
case makePair(QMetaType::To, QMetaType::From): \
if (onlyCheck) \
@@ -146,16 +38,21 @@ QT_WARNING_POP
assign_and_return \
}
-class QMetaTypeModuleHelper
+class Q_CORE_EXPORT QMetaTypeModuleHelper
{
+ Q_DISABLE_COPY_MOVE(QMetaTypeModuleHelper)
+protected:
+ QMetaTypeModuleHelper() = default;
+ ~QMetaTypeModuleHelper() = default;
public:
+ Q_WEAK_OVERLOAD // prevent it from entering the ABI and rendering constexpr useless
static constexpr auto makePair(int from, int to) -> quint64
{
return (quint64(from) << 32) + quint64(to);
}
virtual const QtPrivate::QMetaTypeInterface *interfaceForType(int) const = 0;
- virtual bool convert(const void *, int, void *, int) const { return false; }
+ virtual bool convert(const void *, int, void *, int) const;
};
extern Q_CORE_EXPORT const QMetaTypeModuleHelper *qMetaTypeGuiHelper;
@@ -220,6 +117,94 @@ template<> struct TypeDefinition<QQuaternion> { static const bool IsAvailable =
template<> struct TypeDefinition<QIcon> { static const bool IsAvailable = false; };
#endif
+template <typename T> inline bool isInterfaceFor(const QtPrivate::QMetaTypeInterface *iface)
+{
+ // typeId for built-in types are fixed and require no registration
+ static_assert(QMetaTypeId2<T>::IsBuiltIn, "This function only works for built-in types");
+ static constexpr int typeId = QtPrivate::BuiltinMetaType<T>::value;
+ return iface->typeId.loadRelaxed() == typeId;
+}
+
+template <typename FPointer>
+inline bool checkMetaTypeFlagOrPointer(const QtPrivate::QMetaTypeInterface *iface, FPointer ptr, QMetaType::TypeFlag Flag)
+{
+ // helper to the isXxxConstructible & isDestructible functions below: a
+ // meta type has the trait if the trait is trivial or we have the pointer
+ // to perform the operation
+ Q_ASSERT(!isInterfaceFor<void>(iface));
+ Q_ASSERT(iface->size);
+ return ptr != nullptr || (iface->flags & Flag) == 0;
+}
+
+inline bool isDefaultConstructible(const QtPrivate::QMetaTypeInterface *iface) noexcept
+{
+ return checkMetaTypeFlagOrPointer(iface, iface->defaultCtr, QMetaType::NeedsConstruction);
+}
+
+inline bool isCopyConstructible(const QtPrivate::QMetaTypeInterface *iface) noexcept
+{
+ return checkMetaTypeFlagOrPointer(iface, iface->copyCtr, QMetaType::NeedsCopyConstruction);
+}
+
+inline bool isMoveConstructible(const QtPrivate::QMetaTypeInterface *iface) noexcept
+{
+ return checkMetaTypeFlagOrPointer(iface, iface->moveCtr, QMetaType::NeedsMoveConstruction);
+}
+
+inline bool isDestructible(const QtPrivate::QMetaTypeInterface *iface) noexcept
+{
+ /* For metatypes of revision 1, the NeedsDestruction was set even for trivially
+ destructible types, but their dtor pointer would be null.
+ For that reason, we need the additional check here.
+ */
+ return iface->revision < 1 ||
+ checkMetaTypeFlagOrPointer(iface, iface->dtor, QMetaType::NeedsDestruction);
+}
+
+inline void defaultConstruct(const QtPrivate::QMetaTypeInterface *iface, void *where)
+{
+ Q_ASSERT(isDefaultConstructible(iface));
+ if (iface->defaultCtr)
+ iface->defaultCtr(iface, where);
+ else
+ memset(where, 0, iface->size);
+}
+
+inline void copyConstruct(const QtPrivate::QMetaTypeInterface *iface, void *where, const void *copy)
+{
+ Q_ASSERT(isCopyConstructible(iface));
+ if (iface->copyCtr)
+ iface->copyCtr(iface, where, copy);
+ else
+ memcpy(where, copy, iface->size);
+}
+
+inline void moveConstruct(const QtPrivate::QMetaTypeInterface *iface, void *where, void *copy)
+{
+ Q_ASSERT(isMoveConstructible(iface));
+ if (iface->moveCtr)
+ iface->moveCtr(iface, where, copy);
+ else
+ memcpy(where, copy, iface->size);
+}
+
+inline void construct(const QtPrivate::QMetaTypeInterface *iface, void *where, const void *copy)
+{
+ if (copy)
+ copyConstruct(iface, where, copy);
+ else
+ defaultConstruct(iface, where);
+}
+
+inline void destruct(const QtPrivate::QMetaTypeInterface *iface, void *where)
+{
+ Q_ASSERT(isDestructible(iface));
+ if (iface->dtor)
+ iface->dtor(iface, where);
+}
+
+const char *typedefNameForType(const QtPrivate::QMetaTypeInterface *type_d);
+
template<typename T>
static const QT_PREPEND_NAMESPACE(QtPrivate::QMetaTypeInterface) *getInterfaceFromType()
{
diff --git a/src/corelib/kernel/qmimedata.cpp b/src/corelib/kernel/qmimedata.cpp
index 6a0a4d6ed1..2c0a89dbd7 100644
--- a/src/corelib/kernel/qmimedata.cpp
+++ b/src/corelib/kernel/qmimedata.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qmimedata.h"
@@ -46,12 +10,14 @@
QT_BEGIN_NAMESPACE
-static inline QString textUriListLiteral() { return QStringLiteral("text/uri-list"); }
-static inline QString textHtmlLiteral() { return QStringLiteral("text/html"); }
-static inline QString textPlainLiteral() { return QStringLiteral("text/plain"); }
-static inline QString textPlainUtf8Literal() { return QStringLiteral("text/plain;charset=utf-8"); }
-static inline QString applicationXColorLiteral() { return QStringLiteral("application/x-color"); }
-static inline QString applicationXQtImageLiteral() { return QStringLiteral("application/x-qt-image"); }
+using namespace Qt::StringLiterals;
+
+static inline QString textUriListLiteral() { return u"text/uri-list"_s; }
+static inline QString textHtmlLiteral() { return u"text/html"_s; }
+static inline QString textPlainLiteral() { return u"text/plain"_s; }
+static inline QString textPlainUtf8Literal() { return u"text/plain;charset=utf-8"_s; }
+static inline QString applicationXColorLiteral() { return u"application/x-color"_s; }
+static inline QString applicationXQtImageLiteral() { return u"application/x-qt-image"_s; }
struct QMimeDataStruct
{
@@ -110,6 +76,28 @@ QVariant QMimeDataPrivate::getData(const QString &format) const
return it->data;
}
+static QList<QVariant> dataToUrls(QByteArrayView text)
+{
+ QList<QVariant> list;
+ qsizetype newLineIndex = -1;
+ qsizetype from = 0;
+ const char *begin = text.data();
+ while ((newLineIndex = text.indexOf('\n', from)) != -1) {
+ const auto bav = QByteArrayView(begin + from, begin + newLineIndex).trimmed();
+ if (!bav.isEmpty())
+ list.push_back(QUrl::fromEncoded(bav));
+ from = newLineIndex + 1;
+ if (from >= text.size())
+ break;
+ }
+ if (from != text.size()) {
+ const auto bav = QByteArrayView(begin + from, text.end()).trimmed();
+ if (!bav.isEmpty())
+ list.push_back(QUrl::fromEncoded(bav));
+ }
+ return list;
+}
+
QVariant QMimeDataPrivate::retrieveTypedData(const QString &format, QMetaType type) const
{
Q_Q(const QMimeData);
@@ -118,7 +106,7 @@ QVariant QMimeDataPrivate::retrieveTypedData(const QString &format, QMetaType ty
QVariant data = q->retrieveData(format, type);
// Text data requested: fallback to URL data if available
- if (format == QLatin1String("text/plain") && !data.isValid()) {
+ if (format == "text/plain"_L1 && !data.isValid()) {
data = retrieveTypedData(textUriListLiteral(), QMetaType(QMetaType::QVariantList));
if (data.metaType().id() == QMetaType::QUrl) {
data = QVariant(data.toUrl().toDisplayString());
@@ -126,9 +114,10 @@ QVariant QMimeDataPrivate::retrieveTypedData(const QString &format, QMetaType ty
QString text;
int numUrls = 0;
const QList<QVariant> list = data.toList();
- for (int i = 0; i < list.size(); ++i) {
- if (list.at(i).metaType().id() == QMetaType::QUrl) {
- text += list.at(i).toUrl().toDisplayString() + QLatin1Char('\n');
+ for (const auto &element : list) {
+ if (element.metaType().id() == QMetaType::QUrl) {
+ text += element.toUrl().toDisplayString();
+ text += u'\n';
++numUrls;
}
}
@@ -158,11 +147,12 @@ QVariant QMimeDataPrivate::retrieveTypedData(const QString &format, QMetaType ty
switch (typeId) {
case QMetaType::QString: {
const QByteArray ba = data.toByteArray();
- if (format == QLatin1String("text/html")) {
- auto encoding = QStringConverter::encodingForHtml(ba);
- if (encoding) {
- QStringDecoder toUtf16(*encoding);
- return QString(toUtf16(ba));
+ if (ba.isNull())
+ return QVariant();
+ if (format == "text/html"_L1) {
+ QStringDecoder decoder = QStringDecoder::decoderForHtml(ba);
+ if (decoder.isValid()) {
+ return QString(decoder(ba));
}
// fall back to utf8
}
@@ -170,32 +160,22 @@ QVariant QMimeDataPrivate::retrieveTypedData(const QString &format, QMetaType ty
}
case QMetaType::QColor: {
QVariant newData = data;
-QT_WARNING_PUSH QT_WARNING_DISABLE_DEPRECATED
- newData.convert(QMetaType::QColor);
-QT_WARNING_POP
+ newData.convert(QMetaType(QMetaType::QColor));
return newData;
}
case QMetaType::QVariantList: {
- if (format != QLatin1String("text/uri-list"))
+ if (format != "text/uri-list"_L1)
break;
Q_FALLTHROUGH();
}
case QMetaType::QUrl: {
- QByteArray ba = data.toByteArray();
+ auto bav = data.view<QByteArrayView>();
// Qt 3.x will send text/uri-list with a trailing
// null-terminator (that is *not* sent for any other
// text/* mime-type), so chop it off
- if (ba.endsWith('\0'))
- ba.chop(1);
-
- QList<QByteArray> urls = ba.split('\n');
- QList<QVariant> list;
- for (int i = 0; i < urls.size(); ++i) {
- QByteArray ba = urls.at(i).trimmed();
- if (!ba.isEmpty())
- list.append(QUrl::fromEncoded(ba));
- }
- return list;
+ if (bav.endsWith('\0'))
+ bav.chop(1);
+ return dataToUrls(bav);
}
default:
break;
@@ -215,10 +195,10 @@ QT_WARNING_POP
case QMetaType::QVariantList: {
// has to be list of URLs
QByteArray result;
- QList<QVariant> list = data.toList();
- for (int i = 0; i < list.size(); ++i) {
- if (list.at(i).metaType().id() == QMetaType::QUrl) {
- result += list.at(i).toUrl().toEncoded();
+ const QList<QVariant> list = data.toList();
+ for (const auto &element : list) {
+ if (element.metaType().id() == QMetaType::QUrl) {
+ result += element.toUrl().toEncoded();
result += "\r\n";
}
}
@@ -315,9 +295,9 @@ QT_WARNING_POP
\snippet code/src_corelib_kernel_qmimedata.cpp 8
On Windows, the MIME format does not always map directly to the
- clipboard formats. Qt provides QWinMime to map clipboard
+ clipboard formats. Qt provides QWindowsMimeConverter to map clipboard
formats to open-standard MIME formats. Similarly, the
- QMacPasteboardMime maps MIME to Mac flavors.
+ QUtiMimeConverter maps MIME to Uniform Type Identifiers on macOS and iOS.
\sa QClipboard, QDragEnterEvent, QDragMoveEvent, QDropEvent, QDrag,
{Drag and Drop}
@@ -353,10 +333,10 @@ QList<QUrl> QMimeData::urls() const
if (data.metaType().id() == QMetaType::QUrl)
urls.append(data.toUrl());
else if (data.metaType().id() == QMetaType::QVariantList) {
- QList<QVariant> list = data.toList();
- for (int i = 0; i < list.size(); ++i) {
- if (list.at(i).metaType().id() == QMetaType::QUrl)
- urls.append(list.at(i).toUrl());
+ const QList<QVariant> list = data.toList();
+ for (const auto &element : list) {
+ if (element.metaType().id() == QMetaType::QUrl)
+ urls.append(element.toUrl());
}
}
return urls;
@@ -376,13 +356,7 @@ QList<QUrl> QMimeData::urls() const
void QMimeData::setUrls(const QList<QUrl> &urls)
{
Q_D(QMimeData);
- QList<QVariant> list;
- const int numUrls = urls.size();
- list.reserve(numUrls);
- for (int i = 0; i < numUrls; ++i)
- list.append(urls.at(i));
-
- d->setData(textUriListLiteral(), list);
+ d->setData(textUriListLiteral(), QList<QVariant>(urls.cbegin(), urls.cend()));
}
/*!
@@ -594,18 +568,11 @@ void QMimeData::setData(const QString &mimeType, const QByteArray &data)
{
Q_D(QMimeData);
- if (mimeType == QLatin1String("text/uri-list")) {
- QByteArray ba = data;
+ if (mimeType == "text/uri-list"_L1) {
+ auto ba = QByteArrayView(data);
if (ba.endsWith('\0'))
ba.chop(1);
- QList<QByteArray> urls = ba.split('\n');
- QList<QVariant> list;
- for (int i = 0; i < urls.size(); ++i) {
- QByteArray ba = urls.at(i).trimmed();
- if (!ba.isEmpty())
- list.append(QUrl::fromEncoded(ba));
- }
- d->setData(mimeType, list);
+ d->setData(mimeType, dataToUrls(ba));
} else {
d->setData(mimeType, QVariant(data));
}
diff --git a/src/corelib/kernel/qmimedata.h b/src/corelib/kernel/qmimedata.h
index cf26c08073..0969a7315c 100644
--- a/src/corelib/kernel/qmimedata.h
+++ b/src/corelib/kernel/qmimedata.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QMIMEDATA_H
#define QMIMEDATA_H
diff --git a/src/corelib/kernel/qobject.cpp b/src/corelib/kernel/qobject.cpp
index 8d131cecc5..e1129c5d25 100644
--- a/src/corelib/kernel/qobject.cpp
+++ b/src/corelib/kernel/qobject.cpp
@@ -1,52 +1,18 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Copyright (C) 2016 Intel Corporation.
-** Copyright (C) 2013 Olivier Goffart <ogoffart@woboq.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// Copyright (C) 2016 Intel Corporation.
+// Copyright (C) 2013 Olivier Goffart <ogoffart@woboq.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qobject.h"
#include "qobject_p.h"
+#include "qobject_p_p.h"
#include "qmetaobject_p.h"
#include "qabstracteventdispatcher.h"
#include "qabstracteventdispatcher_p.h"
#include "qcoreapplication.h"
#include "qcoreapplication_p.h"
+#include "qcoreevent_p.h"
#include "qloggingcategory.h"
#include "qvariant.h"
#include "qmetaobject.h"
@@ -56,14 +22,12 @@
#include <qthread.h>
#include <private/qthread_p.h>
#include <qdebug.h>
-#include <qpair.h>
#include <qvarlengtharray.h>
#include <qscopeguard.h>
#include <qset.h>
#if QT_CONFIG(thread)
#include <qsemaphore.h>
#endif
-#include <qsharedpointer.h>
#include <private/qorderedmutexlocker_p.h>
#include <private/qhooks_p.h>
@@ -71,12 +35,24 @@
#include <new>
#include <mutex>
+#include <memory>
#include <ctype.h>
#include <limits.h>
QT_BEGIN_NAMESPACE
+Q_TRACE_POINT(qtcore, QObject_ctor, QObject *object);
+Q_TRACE_POINT(qtcore, QObject_dtor, QObject *object);
+Q_TRACE_POINT(qtcore, QMetaObject_activate_entry, QObject *sender, int signalIndex);
+Q_TRACE_POINT(qtcore, QMetaObject_activate_exit);
+Q_TRACE_POINT(qtcore, QMetaObject_activate_slot_entry, QObject *receiver, int slotIndex);
+Q_TRACE_POINT(qtcore, QMetaObject_activate_slot_exit);
+Q_TRACE_POINT(qtcore, QMetaObject_activate_slot_functor_entry, void *slotObject);
+Q_TRACE_POINT(qtcore, QMetaObject_activate_slot_functor_exit);
+Q_TRACE_POINT(qtcore, QMetaObject_activate_declarative_signal_entry, QObject *sender, int signalIndex);
+Q_TRACE_POINT(qtcore, QMetaObject_activate_declarative_signal_exit);
+
static int DIRECT_CONNECTION_ONLY = 0;
Q_LOGGING_CATEGORY(lcConnectSlotsByName, "qt.core.qmetaobject.connectslotsbyname")
@@ -108,6 +84,8 @@ static int *queuedConnectionTypes(const QMetaMethod &method)
typeIds[i] = QMetaType::VoidStar;
else
typeIds[i] = metaType.id();
+ if (!typeIds[i] && method.parameterTypeName(i).endsWith('*'))
+ typeIds[i] = QMetaType::VoidStar;
if (!typeIds[i]) {
const QByteArray typeName = method.parameterTypeName(i);
qCWarning(lcConnect,
@@ -125,7 +103,7 @@ static int *queuedConnectionTypes(const QMetaMethod &method)
static int *queuedConnectionTypes(const QArgumentType *argumentTypes, int argc)
{
- QScopedArrayPointer<int> types(new int[argc + 1]);
+ auto types = std::make_unique<int[]>(argc + 1);
for (int i = 0; i < argc; ++i) {
const QArgumentType &type = argumentTypes[i];
if (type.type())
@@ -145,10 +123,10 @@ static int *queuedConnectionTypes(const QArgumentType *argumentTypes, int argc)
}
types[argc] = 0;
- return types.take();
+ return types.release();
}
-static QBasicMutex _q_ObjectMutexPool[131];
+Q_CONSTINIT static QBasicMutex _q_ObjectMutexPool[131];
/**
* \internal
@@ -197,6 +175,10 @@ QObjectPrivate::QObjectPrivate(int version)
metaObject = nullptr;
isWindow = false;
deleteLaterCalled = false;
+ isQuickItem = false;
+ willBeWidget = false;
+ wasWidget = false;
+ receiveParentEvents = false; // If object wants ParentAboutToChange and ParentChange
}
QObjectPrivate::~QObjectPrivate()
@@ -209,8 +191,8 @@ QObjectPrivate::~QObjectPrivate()
thisThreadData->eventDispatcher.loadRelaxed()->unregisterTimers(q_ptr);
// release the timer ids back to the pool
- for (int i = 0; i < extraData->runningTimers.size(); ++i)
- QAbstractEventDispatcherPrivate::releaseTimerId(extraData->runningTimers.at(i));
+ for (auto id : std::as_const(extraData->runningTimers))
+ QAbstractEventDispatcherPrivate::releaseTimerId(id);
} else {
qWarning("QObject::~QObject: Timers cannot be stopped from another thread");
}
@@ -245,32 +227,11 @@ static void computeOffsets(const QMetaObject *metaobject, int *signalOffset, int
}
// Used by QAccessibleWidget
-bool QObjectPrivate::isSender(const QObject *receiver, const char *signal) const
-{
- Q_Q(const QObject);
- int signal_index = signalIndex(signal);
- ConnectionData *cd = connections.loadRelaxed();
- if (signal_index < 0 || !cd)
- return false;
- QBasicMutexLocker locker(signalSlotLock(q));
- if (signal_index < cd->signalVectorCount()) {
- const QObjectPrivate::Connection *c = cd->signalVector.loadRelaxed()->at(signal_index).first.loadRelaxed();
-
- while (c) {
- if (c->receiver.loadRelaxed() == receiver)
- return true;
- c = c->nextConnectionList.loadRelaxed();
- }
- }
- return false;
-}
-
-// Used by QAccessibleWidget
QObjectList QObjectPrivate::receiverList(const char *signal) const
{
QObjectList returnValue;
int signal_index = signalIndex(signal);
- ConnectionData *cd = connections.loadRelaxed();
+ ConnectionData *cd = connections.loadAcquire();
if (signal_index < 0 || !cd)
return returnValue;
if (signal_index < cd->signalVectorCount()) {
@@ -286,17 +247,17 @@ QObjectList QObjectPrivate::receiverList(const char *signal) const
return returnValue;
}
-// Used by QAccessibleWidget
-QObjectList QObjectPrivate::senderList() const
+/*!
+ \internal
+ The signalSlotLock() of the sender must be locked while calling this function
+*/
+inline void QObjectPrivate::ensureConnectionData()
{
- QObjectList returnValue;
- ConnectionData *cd = connections.loadRelaxed();
- if (cd) {
- QBasicMutexLocker locker(signalSlotLock(q_func()));
- for (Connection *c = cd->senders; c; c = c->next)
- returnValue << c->sender;
- }
- return returnValue;
+ if (connections.loadRelaxed())
+ return;
+ ConnectionData *cd = new ConnectionData;
+ cd->ref.ref();
+ connections.storeRelease(cd);
}
/*!
@@ -309,7 +270,7 @@ QObjectList QObjectPrivate::senderList() const
Will also add the connection in the sender's list of the receiver.
*/
-void QObjectPrivate::addConnection(int signal, Connection *c)
+inline void QObjectPrivate::addConnection(int signal, Connection *c)
{
Q_ASSERT(c->sender == q_ptr);
ensureConnectionData();
@@ -379,16 +340,16 @@ void QObjectPrivate::ConnectionData::removeConnection(QObjectPrivate::Connection
c->prevConnectionList->nextConnectionList.storeRelaxed(n);
c->prevConnectionList = nullptr;
- Q_ASSERT(c != orphaned.loadRelaxed());
+ Q_ASSERT(c != static_cast<Connection *>(orphaned.load(std::memory_order_relaxed)));
// add c to orphanedConnections
- Connection *o = nullptr;
+ TaggedSignalVector o = nullptr;
/* No ABA issue here: When adding a node, we only care about the list head, it doesn't
* matter if the tail changes.
*/
+ o = orphaned.load(std::memory_order_acquire);
do {
- o = orphaned.loadRelaxed();
c->nextInOrphanList = o;
- } while (!orphaned.testAndSetRelease(o, c));
+ } while (!orphaned.compare_exchange_strong(o, TaggedSignalVector(c), std::memory_order_release));
#ifndef QT_NO_DEBUG
found = false;
@@ -406,7 +367,7 @@ void QObjectPrivate::ConnectionData::removeConnection(QObjectPrivate::Connection
void QObjectPrivate::ConnectionData::cleanOrphanedConnectionsImpl(QObject *sender, LockPolicy lockPolicy)
{
QBasicMutex *senderMutex = signalSlotLock(sender);
- ConnectionOrSignalVector *c = nullptr;
+ TaggedSignalVector c = nullptr;
{
std::unique_lock<QBasicMutex> lock(*senderMutex, std::defer_lock_t{});
if (lockPolicy == NeedToLock)
@@ -417,7 +378,7 @@ void QObjectPrivate::ConnectionData::cleanOrphanedConnectionsImpl(QObject *sende
// Since ref == 1, no activate() is in process since we locked the mutex. That implies,
// that nothing can reference the orphaned connection objects anymore and they can
// be safely deleted
- c = orphaned.fetchAndStoreRelaxed(nullptr);
+ c = orphaned.exchange(nullptr, std::memory_order_relaxed);
}
if (c) {
// Deleting c might run arbitrary user code, so we must not hold the lock
@@ -431,11 +392,11 @@ void QObjectPrivate::ConnectionData::cleanOrphanedConnectionsImpl(QObject *sende
}
}
-void QObjectPrivate::ConnectionData::deleteOrphaned(QObjectPrivate::ConnectionOrSignalVector *o)
+inline void QObjectPrivate::ConnectionData::deleteOrphaned(TaggedSignalVector o)
{
while (o) {
- QObjectPrivate::ConnectionOrSignalVector *next = nullptr;
- if (SignalVector *v = ConnectionOrSignalVector::asSignalVector(o)) {
+ TaggedSignalVector next = nullptr;
+ if (SignalVector *v = static_cast<SignalVector *>(o)) {
next = v->nextInOrphanList;
free(v);
} else {
@@ -461,7 +422,7 @@ bool QObjectPrivate::isSignalConnected(uint signalIndex, bool checkDeclarative)
if (checkDeclarative && isDeclarativeSignalConnected(signalIndex))
return true;
- ConnectionData *cd = connections.loadRelaxed();
+ ConnectionData *cd = connections.loadAcquire();
if (!cd)
return false;
SignalVector *signalVector = cd->signalVector.loadRelaxed();
@@ -484,7 +445,7 @@ bool QObjectPrivate::isSignalConnected(uint signalIndex, bool checkDeclarative)
bool QObjectPrivate::maybeSignalConnected(uint signalIndex) const
{
- ConnectionData *cd = connections.loadRelaxed();
+ ConnectionData *cd = connections.loadAcquire();
if (!cd)
return false;
SignalVector *signalVector = cd->signalVector.loadRelaxed();
@@ -501,6 +462,13 @@ bool QObjectPrivate::maybeSignalConnected(uint signalIndex) const
return false;
}
+void QObjectPrivate::reinitBindingStorageAfterThreadMove()
+{
+ bindingStorage.reinitAfterThreadMove();
+ for (int i = 0; i < children.size(); ++i)
+ children[i]->d_func()->reinitBindingStorageAfterThreadMove();
+}
+
/*!
\internal
*/
@@ -554,7 +522,7 @@ QMetaCallEvent::QMetaCallEvent(QtPrivate::QSlotObjectBase *slotO,
const QObject *sender, int signalId,
void **args, QSemaphore *semaphore)
: QAbstractMetaCallEvent(sender, signalId, semaphore),
- d({slotO, args, nullptr, 0, 0, ushort(-1)}),
+ d({QtPrivate::SlotObjUniquePtr{slotO}, args, nullptr, 0, 0, ushort(-1)}),
prealloc_()
{
if (d.slotObj_)
@@ -564,6 +532,21 @@ QMetaCallEvent::QMetaCallEvent(QtPrivate::QSlotObjectBase *slotO,
/*!
\internal
+ Used for blocking queued connections, just passes \a args through without
+ allocating any memory.
+ */
+QMetaCallEvent::QMetaCallEvent(QtPrivate::SlotObjUniquePtr slotO,
+ const QObject *sender, int signalId,
+ void **args, QSemaphore *semaphore)
+ : QAbstractMetaCallEvent(sender, signalId, semaphore),
+ d{std::move(slotO), args, nullptr, 0, 0, ushort(-1)},
+ prealloc_()
+{
+}
+
+/*!
+ \internal
+
Allocates memory for \a nargs; code creating an event needs to initialize
the void* and int arrays by accessing \a args() and \a types(), respectively.
*/
@@ -588,7 +571,7 @@ QMetaCallEvent::QMetaCallEvent(QtPrivate::QSlotObjectBase *slotO,
const QObject *sender, int signalId,
int nargs)
: QAbstractMetaCallEvent(sender, signalId),
- d({slotO, nullptr, nullptr, nargs, 0, ushort(-1)}),
+ d({QtPrivate::SlotObjUniquePtr(slotO), nullptr, nullptr, nargs, 0, ushort(-1)}),
prealloc_()
{
if (d.slotObj_)
@@ -598,6 +581,22 @@ QMetaCallEvent::QMetaCallEvent(QtPrivate::QSlotObjectBase *slotO,
/*!
\internal
+
+ Allocates memory for \a nargs; code creating an event needs to initialize
+ the void* and int arrays by accessing \a args() and \a types(), respectively.
+ */
+QMetaCallEvent::QMetaCallEvent(QtPrivate::SlotObjUniquePtr slotO,
+ const QObject *sender, int signalId,
+ int nargs)
+ : QAbstractMetaCallEvent(sender, signalId),
+ d{std::move(slotO), nullptr, nullptr, nargs, 0, ushort(-1)},
+ prealloc_()
+{
+ allocArgs();
+}
+
+/*!
+ \internal
*/
QMetaCallEvent::~QMetaCallEvent()
{
@@ -610,8 +609,6 @@ QMetaCallEvent::~QMetaCallEvent()
if (reinterpret_cast<void *>(d.args_) != reinterpret_cast<void *>(prealloc_))
free(d.args_);
}
- if (d.slotObj_)
- d.slotObj_->destroyIfLastRef();
}
/*!
@@ -629,6 +626,25 @@ void QMetaCallEvent::placeMetaCall(QObject *object)
}
}
+QMetaCallEvent* QMetaCallEvent::create_impl(QtPrivate::SlotObjUniquePtr slotObj,
+ const QObject *sender, int signal_index,
+ size_t argc, const void* const argp[],
+ const QMetaType metaTypes[])
+{
+ auto metaCallEvent = std::make_unique<QMetaCallEvent>(std::move(slotObj), sender,
+ signal_index, int(argc));
+
+ void **args = metaCallEvent->args();
+ QMetaType *types = metaCallEvent->types();
+ for (size_t i = 0; i < argc; ++i) {
+ types[i] = metaTypes[i];
+ args[i] = types[i].create(argp[i]);
+ Q_CHECK_PTR(!i || args[i]);
+ }
+
+ return metaCallEvent.release();
+}
+
/*!
\class QSignalBlocker
\brief Exception-safe wrapper around QObject::blockSignals().
@@ -716,6 +732,14 @@ void QMetaCallEvent::placeMetaCall(QObject *object)
*/
/*!
+ \fn void QSignalBlocker::dismiss()
+ \since 6.7
+ Dismisses the QSignalBlocker. It will no longer access the QObject
+ passed to its constructor. unblock(), reblock(), as well as
+ ~QSignalBlocker() will have no effect.
+*/
+
+/*!
\class QObject
\inmodule QtCore
\brief The QObject class is the base class of all Qt objects.
@@ -756,7 +780,7 @@ void QMetaCallEvent::placeMetaCall(QObject *object)
to catch child events.
Last but not least, QObject provides the basic timer support in
- Qt; see QTimer for high-level support for timers.
+ Qt; see QChronoTimer for high-level support for timers.
Notice that the Q_OBJECT macro is mandatory for any object that
implements signals, slots or properties. You also need to run the
@@ -839,20 +863,20 @@ void QMetaCallEvent::placeMetaCall(QObject *object)
\l uic generates code that invokes this function to enable
auto-connection to be performed between widgets on forms created
- with \e{Qt Designer}. More information about using auto-connection with \e{Qt Designer} is
+ with \e{\QD}. More information about using auto-connection with \e{\QD} is
given in the \l{Using a Designer UI File in Your Application} section of
- the \e{Qt Designer} manual.
+ the \l{Qt Widgets Designer Manual}{\QD} manual.
\section1 Dynamic Properties
- From Qt 4.2, dynamic properties can be added to and removed from QObject
+ Dynamic properties can be added to and removed from QObject
instances at run-time. Dynamic properties do not need to be declared at
compile-time, yet they provide the same advantages as static properties
and are manipulated using the same API - using property() to read them
and setProperty() to write them.
- From Qt 4.3, dynamic properties are supported by
- \l{Qt Designer's Widget Editing Mode#The Property Editor}{Qt Designer},
+ Dynamic properties are supported by
+ \l{Qt Widgets Designer's Widget Editing Mode#The Property Editor}{\QD},
and both standard Qt widgets and user-created forms can be given dynamic
properties.
@@ -931,7 +955,7 @@ QObject::QObject(QObjectPrivate &dd, QObject *parent)
QT_TRY {
if (!check_parent_thread(parent, parent ? parent->d_func()->threadData.loadRelaxed() : nullptr, threadData))
parent = nullptr;
- if (d->isWidget) {
+ if (d->willBeWidget) {
if (parent) {
d->parent = parent;
d->parent->d_func()->children.append(this);
@@ -969,8 +993,8 @@ void QObjectPrivate::clearBindingStorage()
outside the parent. If you still do, the destroyed() signal gives
you an opportunity to detect when an object is destroyed.
- \warning Deleting a QObject while pending events are waiting to
- be delivered can cause a crash. You must not delete the QObject
+ \warning Deleting a QObject while it is handling an event
+ delivered to it can cause a crash. You must not delete the QObject
directly if it exists in a different thread than the one currently
executing. Use deleteLater() instead, which will cause the event
loop to delete the object after all pending events have been
@@ -985,6 +1009,16 @@ QObject::~QObject()
d->wasDeleted = true;
d->blockSig = 0; // unblock signals so we always emit destroyed()
+ if (!d->bindingStorage.isValid()) {
+ // this might be the case after an incomplete thread-move
+ // remove this object from the pending list in that case
+ if (QThread *ownThread = thread()) {
+ auto *privThread = static_cast<QThreadPrivate *>(
+ QObjectPrivate::get(ownThread));
+ privThread->removeObjectWithPendingBindingStatusChange(this);
+ }
+ }
+
// If we reached this point, we need to clear the binding data
// as the corresponding properties are no longer useful
d->clearBindingStorage();
@@ -1002,14 +1036,14 @@ QObject::~QObject()
delete sharedRefcount;
}
- if (!d->isWidget && d->isSignalConnected(0)) {
+ if (!d->wasWidget && d->isSignalConnected(0)) {
emit destroyed(this);
}
- if (d->declarativeData && QAbstractDeclarativeData::destroyed)
+ if (!d->isDeletingChildren && d->declarativeData && QAbstractDeclarativeData::destroyed)
QAbstractDeclarativeData::destroyed(d->declarativeData, this);
- QObjectPrivate::ConnectionData *cd = d->connections.loadRelaxed();
+ QObjectPrivate::ConnectionData *cd = d->connections.loadAcquire();
if (cd) {
if (cd->currentSender) {
cd->currentSender->receiverDeleted();
@@ -1017,7 +1051,7 @@ QObject::~QObject()
}
QBasicMutex *signalSlotMutex = signalSlotLock(this);
- QBasicMutexLocker locker(signalSlotMutex);
+ QMutexLocker locker(signalSlotMutex);
// disconnect all receivers
int receiverCount = cd->signalVectorCount();
@@ -1112,7 +1146,7 @@ QObject::~QObject()
d->setParent_helper(nullptr);
}
-QObjectPrivate::Connection::~Connection()
+inline QObjectPrivate::Connection::~Connection()
{
if (ownArgumentTypes) {
const int *v = argumentTypes.loadRelaxed();
@@ -1195,8 +1229,7 @@ QObjectPrivate::Connection::~Connection()
\c dynamic_cast(), with the advantages that it doesn't require
RTTI support and it works across dynamic library boundaries.
- qobject_cast() can also be used in conjunction with interfaces;
- see the \l{tools/plugandpaint/app}{Plug & Paint} example for details.
+ qobject_cast() can also be used in conjunction with interfaces.
\warning If T isn't declared with the Q_OBJECT macro, this
function's return value is undefined.
@@ -1242,6 +1275,10 @@ QObjectPrivate::Connection::~Connection()
QString QObject::objectName() const
{
Q_D(const QObject);
+#if QT_CONFIG(thread)
+ if (QThread::currentThreadId() != d->threadData.loadRelaxed()->threadId.loadRelaxed()) // Unsafe code path
+ return d->extraData ? d->extraData->objectName.valueBypassingBindings() : QString();
+#endif
if (!d->extraData && QtPrivate::isAnyBindingEvaluating()) {
QObjectPrivate *dd = const_cast<QObjectPrivate *>(d);
// extraData is mutable, so this should be safe
@@ -1250,30 +1287,47 @@ QString QObject::objectName() const
return d->extraData ? d->extraData->objectName : QString();
}
-/*
+/*!
+ \fn void QObject::setObjectName(const QString &name)
Sets the object's name to \a name.
*/
-void QObject::setObjectName(const QString &name)
+void QObject::doSetObjectName(const QString &name)
{
Q_D(QObject);
- if (!d->extraData)
- d->extraData = new QObjectPrivate::ExtraData(d);
+ d->ensureExtraData();
d->extraData->objectName.removeBindingUnlessInWrapper();
- if (d->extraData->objectName != name) {
+ if (d->extraData->objectName.valueBypassingBindings() != name) {
d->extraData->objectName.setValueBypassingBindings(name);
d->extraData->objectName.notify(); // also emits a signal
}
}
+/*!
+ \overload
+ \since 6.4
+*/
+void QObject::setObjectName(QAnyStringView name)
+{
+ Q_D(QObject);
+
+ d->ensureExtraData();
+
+ d->extraData->objectName.removeBindingUnlessInWrapper();
+
+ if (d->extraData->objectName.valueBypassingBindings() != name) {
+ d->extraData->objectName.setValueBypassingBindings(name.toString());
+ d->extraData->objectName.notify(); // also emits a signal
+ }
+}
+
QBindable<QString> QObject::bindableObjectName()
{
Q_D(QObject);
- if (!d->extraData)
- d->extraData = new QObjectPrivate::ExtraData(d);
+ d->ensureExtraData();
return QBindable<QString>(&d->extraData->objectName);
}
@@ -1304,6 +1358,17 @@ QBindable<QString> QObject::bindableObjectName()
*/
/*!
+ \fn bool QObject::isQuickItemType() const
+
+ Returns \c true if the object is a QQuickItem; otherwise returns \c false.
+
+ Calling this function is equivalent to calling
+ \c{inherits("QQuickItem")}, except that it is much faster.
+
+ \since 6.4
+*/
+
+/*!
This virtual function receives events to an object and should
return true if the event \a e was recognized and processed.
@@ -1335,18 +1400,21 @@ bool QObject::event(QEvent *e)
break;
case QEvent::DeferredDelete:
- qDeleteInEventHandler(this);
+ qCDebug(lcDeleteLater) << "Deferred deleting" << this;
+ delete this;
break;
case QEvent::MetaCall:
{
QAbstractMetaCallEvent *mce = static_cast<QAbstractMetaCallEvent*>(e);
- if (!d_func()->connections.loadRelaxed()) {
- QBasicMutexLocker locker(signalSlotLock(this));
+ QObjectPrivate::ConnectionData *connections = d_func()->connections.loadAcquire();
+ if (!connections) {
+ QMutexLocker locker(signalSlotLock(this));
d_func()->ensureConnectionData();
+ connections = d_func()->connections.loadRelaxed();
}
- QObjectPrivate::Sender sender(this, const_cast<QObject*>(mce->sender()), mce->signalId());
+ QObjectPrivate::Sender sender(this, const_cast<QObject*>(mce->sender()), mce->signalId(), connections);
mce->placeMetaCall(this);
break;
@@ -1357,12 +1425,20 @@ bool QObject::event(QEvent *e)
QThreadData *threadData = d->threadData.loadRelaxed();
QAbstractEventDispatcher *eventDispatcher = threadData->eventDispatcher.loadRelaxed();
if (eventDispatcher) {
- QList<QAbstractEventDispatcher::TimerInfo> timers = eventDispatcher->registeredTimers(this);
+ QList<QAbstractEventDispatcher::TimerInfoV2> timers = eventDispatcher->timersForObject(this);
if (!timers.isEmpty()) {
+ const bool res = eventDispatcher->unregisterTimers(this);
// do not to release our timer ids back to the pool (since the timer ids are moving to a new thread).
- eventDispatcher->unregisterTimers(this);
- QMetaObject::invokeMethod(this, "_q_reregisterTimers", Qt::QueuedConnection,
- Q_ARG(void*, (new QList<QAbstractEventDispatcher::TimerInfo>(timers))));
+ Q_ASSERT_X(res, Q_FUNC_INFO,
+ "QAbstractEventDispatcher::unregisterTimers() returned false,"
+ " but there are timers associated with this object.");
+ auto reRegisterTimers = [this, timers = std::move(timers)]() {
+ QAbstractEventDispatcher *eventDispatcher =
+ d_func()->threadData.loadRelaxed()->eventDispatcher.loadRelaxed();
+ for (const auto &ti : timers)
+ eventDispatcher->registerTimer(ti.timerId, ti.interval, ti.timerType, this);
+ };
+ QMetaObject::invokeMethod(this, std::move(reRegisterTimers), Qt::QueuedConnection);
}
}
break;
@@ -1384,9 +1460,9 @@ bool QObject::event(QEvent *e)
This event handler can be reimplemented in a subclass to receive
timer events for the object.
- QTimer provides a higher-level interface to the timer
- functionality, and also more general information about timers. The
- timer event is passed in the \a event parameter.
+ QChronoTimer provides higher-level interfaces to the timer functionality,
+ and also more general information about timers. The timer event is passed
+ in the \a event parameter.
\sa startTimer(), killTimer(), event()
*/
@@ -1525,9 +1601,9 @@ QThread *QObject::thread() const
}
/*!
- Changes the thread affinity for this object and its children. The
- object cannot be moved if it has a parent. Event processing will
- continue in the \a targetThread.
+ Changes the thread affinity for this object and its children and
+ returns \c true on success. The object cannot be moved if it has a
+ parent. Event processing will continue in the \a targetThread.
To move an object to the main thread, use QApplication::instance()
to retrieve a pointer to the current application, and then use
@@ -1564,46 +1640,46 @@ QThread *QObject::thread() const
\sa thread()
*/
-void QObject::moveToThread(QThread *targetThread)
+bool QObject::moveToThread(QThread *targetThread QT6_IMPL_NEW_OVERLOAD_TAIL)
{
Q_D(QObject);
if (d->threadData.loadRelaxed()->thread.loadAcquire() == targetThread) {
// object is already in this thread
- return;
+ return true;
}
if (d->parent != nullptr) {
qWarning("QObject::moveToThread: Cannot move objects with a parent");
- return;
+ return false;
}
if (d->isWidget) {
qWarning("QObject::moveToThread: Widgets cannot be moved to a new thread");
- return;
+ return false;
}
if (!d->bindingStorage.isEmpty()) {
qWarning("QObject::moveToThread: Can not move objects that contain bindings or are used in bindings to a new thread.");
- return;
+ return false;
}
QThreadData *currentData = QThreadData::current();
QThreadData *targetData = targetThread ? QThreadData::get2(targetThread) : nullptr;
- QThreadData *thisThreadData = d->threadData.loadRelaxed();
- if (!thisThreadData->thread.loadAcquire() && currentData == targetData) {
+ QThreadData *thisThreadData = d->threadData.loadAcquire();
+ if (!thisThreadData->thread.loadRelaxed() && currentData == targetData) {
// one exception to the rule: we allow moving objects with no thread affinity to the current thread
- currentData = d->threadData;
+ currentData = thisThreadData;
} else if (thisThreadData != currentData) {
qWarning("QObject::moveToThread: Current thread (%p) is not the object's thread (%p).\n"
"Cannot move to target thread (%p)\n",
currentData->thread.loadRelaxed(), thisThreadData->thread.loadRelaxed(), targetData ? targetData->thread.loadRelaxed() : nullptr);
-#ifdef Q_OS_MAC
+#ifdef Q_OS_DARWIN
qWarning("You might be loading two sets of Qt binaries into the same process. "
"Check that all plugins are compiled against the right Qt binaries. Export "
"DYLD_PRINT_LIBRARIES=1 and check that only one set of binaries are being loaded.");
#endif
- return;
+ return false;
}
// prepare to move
@@ -1622,12 +1698,22 @@ void QObject::moveToThread(QThread *targetThread)
currentData->ref();
// move the object
- d_func()->setThreadData_helper(currentData, targetData);
+ auto threadPrivate = targetThread
+ ? static_cast<QThreadPrivate *>(QThreadPrivate::get(targetThread))
+ : nullptr;
+ QBindingStatus *bindingStatus = threadPrivate
+ ? threadPrivate->bindingStatus()
+ : nullptr;
+ if (threadPrivate && !bindingStatus) {
+ bindingStatus = threadPrivate->addObjectWithPendingBindingStatusChange(this);
+ }
+ d_func()->setThreadData_helper(currentData, targetData, bindingStatus);
locker.unlock();
// now currentData can commit suicide if it wants to
currentData->deref();
+ return true;
}
void QObjectPrivate::moveToThread_helper()
@@ -1635,16 +1721,22 @@ void QObjectPrivate::moveToThread_helper()
Q_Q(QObject);
QEvent e(QEvent::ThreadChange);
QCoreApplication::sendEvent(q, &e);
+ bindingStorage.clear();
for (int i = 0; i < children.size(); ++i) {
QObject *child = children.at(i);
child->d_func()->moveToThread_helper();
}
}
-void QObjectPrivate::setThreadData_helper(QThreadData *currentData, QThreadData *targetData)
+void QObjectPrivate::setThreadData_helper(QThreadData *currentData, QThreadData *targetData, QBindingStatus *status)
{
Q_Q(QObject);
+ if (status) {
+ // the new thread is already running
+ this->bindingStorage.bindingStatus = status;
+ }
+
// move posted events
int eventsMoved = 0;
for (int i = 0; i < currentData->postEventList.size(); ++i) {
@@ -1664,7 +1756,7 @@ void QObjectPrivate::setThreadData_helper(QThreadData *currentData, QThreadData
}
// the current emitting thread shouldn't restore currentSender after calling moveToThread()
- ConnectionData *cd = connections.loadRelaxed();
+ ConnectionData *cd = connections.loadAcquire();
if (cd) {
if (cd->currentSender) {
cd->currentSender->receiverDeleted();
@@ -1699,23 +1791,10 @@ void QObjectPrivate::setThreadData_helper(QThreadData *currentData, QThreadData
for (int i = 0; i < children.size(); ++i) {
QObject *child = children.at(i);
- child->d_func()->setThreadData_helper(currentData, targetData);
- }
-}
-
-void QObjectPrivate::_q_reregisterTimers(void *pointer)
-{
- Q_Q(QObject);
- QList<QAbstractEventDispatcher::TimerInfo> *timerList = reinterpret_cast<QList<QAbstractEventDispatcher::TimerInfo> *>(pointer);
- QAbstractEventDispatcher *eventDispatcher = threadData.loadRelaxed()->eventDispatcher.loadRelaxed();
- for (int i = 0; i < timerList->size(); ++i) {
- const QAbstractEventDispatcher::TimerInfo &ti = timerList->at(i);
- eventDispatcher->registerTimer(ti.timerId, ti.interval, ti.timerType, q);
+ child->d_func()->setThreadData_helper(currentData, targetData, status);
}
- delete timerList;
}
-
//
// The timer flag hasTimer is set when startTimer is called.
// It is not reset when killing the timer because more than
@@ -1723,13 +1802,36 @@ void QObjectPrivate::_q_reregisterTimers(void *pointer)
//
/*!
+ \fn int QObject::startTimer(int interval, Qt::TimerType timerType)
+
+ This is an overloaded function that will start a timer of type
+ \a timerType and a timeout of \a interval milliseconds. This is
+ equivalent to calling:
+ \code
+ startTimer(std::chrono::milliseconds{interval}, timerType);
+ \endcode
+
+ \sa timerEvent(), killTimer(), QChronoTimer::singleShot()
+*/
+
+int QObject::startTimer(int interval, Qt::TimerType timerType)
+{
+ // no overflow can happen here:
+ // 2^31 ms * 1,000,000 always fits a 64-bit signed integer type
+ return startTimer(std::chrono::milliseconds{interval}, timerType);
+}
+
+/*!
+ \since 5.9
+ \overload
+
Starts a timer and returns a timer identifier, or returns zero if
it could not start a timer.
- A timer event will occur every \a interval milliseconds until
- killTimer() is called. If \a interval is 0, then the timer event
- occurs once every time there are no more window system events to
- process.
+ A timer event will occur every \a interval until killTimer()
+ is called. If \a interval is equal to \c{std::chrono::duration::zero()},
+ then the timer event occurs once every time there are no more window
+ system events to process.
The virtual timerEvent() function is called with the QTimerEvent
event parameter class when a timer event occurs. Reimplement this
@@ -1742,26 +1844,41 @@ void QObjectPrivate::_q_reregisterTimers(void *pointer)
\snippet code/src_corelib_kernel_qobject.cpp 8
- Note that QTimer's accuracy depends on the underlying operating system and
- hardware. The \a timerType argument allows you to customize the accuracy of
+ Note that the accuracy of QChronoTimer depends on the underlying operating
+ system and hardware.
+
+ The \a timerType argument allows you to customize the accuracy of
the timer. See Qt::TimerType for information on the different timer types.
Most platforms support an accuracy of 20 milliseconds; some provide more.
If Qt is unable to deliver the requested number of timer events, it will
silently discard some.
- The QTimer class provides a high-level programming interface with
- single-shot timers and timer signals instead of events. There is
- also a QBasicTimer class that is more lightweight than QTimer and
- less clumsy than using timer IDs directly.
+ The QTimer and QChronoTimer classes provide a high-level programming
+ interface with single-shot timers and timer signals instead of
+ events. There is also a QBasicTimer class that is more lightweight than
+ QChronoTimer but less clumsy than using timer IDs directly.
- \sa timerEvent(), killTimer(), QTimer::singleShot()
-*/
+ \sa timerEvent(), killTimer(), QChronoTimer::singleShot()
-int QObject::startTimer(int interval, Qt::TimerType timerType)
+ \note Starting from Qt 6.8 the type of \a interval
+ is \c std::chrono::nanoseconds, prior to that it was \c
+ std::chrono::milliseconds. This change is backwards compatible with
+ older releases of Qt.
+
+ \note In Qt 6.8, QObject was changed to use Qt::TimerId to represent timer
+ IDs. This method converts the TimerId to int for backwards compatibility
+ reasons, however you can use Qt::TimerId to check the value returned by
+ this method, for example:
+ \snippet code/src_corelib_kernel_qobject.cpp invalid-timer-id
+
+*/
+int QObject::startTimer(std::chrono::nanoseconds interval, Qt::TimerType timerType)
{
Q_D(QObject);
- if (Q_UNLIKELY(interval < 0)) {
+ using namespace std::chrono_literals;
+
+ if (Q_UNLIKELY(interval < 0ns)) {
qWarning("QObject::startTimer: Timers cannot have negative intervals");
return 0;
}
@@ -1775,53 +1892,15 @@ int QObject::startTimer(int interval, Qt::TimerType timerType)
qWarning("QObject::startTimer: Timers cannot be started from another thread");
return 0;
}
- int timerId = thisThreadData->eventDispatcher.loadRelaxed()->registerTimer(interval, timerType, this);
- if (!d->extraData)
- d->extraData = new QObjectPrivate::ExtraData(d);
+
+ auto dispatcher = thisThreadData->eventDispatcher.loadRelaxed();
+ Qt::TimerId timerId = dispatcher->registerTimer(interval, timerType, this);
+ d->ensureExtraData();
d->extraData->runningTimers.append(timerId);
- return timerId;
+ return int(timerId);
}
/*!
- \since 5.9
- \overload
- \fn int QObject::startTimer(std::chrono::milliseconds time, Qt::TimerType timerType)
-
- Starts a timer and returns a timer identifier, or returns zero if
- it could not start a timer.
-
- A timer event will occur every \a time interval until killTimer()
- is called. If \a time is equal to \c{std::chrono::duration::zero()},
- then the timer event occurs once every time there are no more window
- system events to process.
-
- The virtual timerEvent() function is called with the QTimerEvent
- event parameter class when a timer event occurs. Reimplement this
- function to get timer events.
-
- If multiple timers are running, the QTimerEvent::timerId() can be
- used to find out which timer was activated.
-
- Example:
-
- \snippet code/src_corelib_kernel_qobject.cpp 8
-
- Note that QTimer's accuracy depends on the underlying operating system and
- hardware. The \a timerType argument allows you to customize the accuracy of
- the timer. See Qt::TimerType for information on the different timer types.
- Most platforms support an accuracy of 20 milliseconds; some provide more.
- If Qt is unable to deliver the requested number of timer events, it will
- silently discard some.
-
- The QTimer class provides a high-level programming interface with
- single-shot timers and timer signals instead of events. There is
- also a QBasicTimer class that is more lightweight than QTimer and
- less clumsy than using timer IDs directly.
-
- \sa timerEvent(), killTimer(), QTimer::singleShot()
-*/
-
-/*!
Kills the timer with timer identifier, \a id.
The timer identifier is returned by startTimer() when a timer
@@ -1832,17 +1911,26 @@ int QObject::startTimer(int interval, Qt::TimerType timerType)
void QObject::killTimer(int id)
{
+ killTimer(Qt::TimerId{id});
+}
+
+/*!
+ \since 6.8
+ \overload
+*/
+void QObject::killTimer(Qt::TimerId id)
+{
Q_D(QObject);
if (Q_UNLIKELY(thread() != QThread::currentThread())) {
qWarning("QObject::killTimer: Timers cannot be stopped from another thread");
return;
}
- if (id) {
+ if (id > Qt::TimerId::Invalid) {
int at = d->extraData ? d->extraData->runningTimers.indexOf(id) : -1;
if (at == -1) {
// timer isn't owned by this object
qWarning("QObject::killTimer(): Error: timer id %d is not valid for object %p (%s, %ls), timer has not been killed",
- id,
+ qToUnderlying(id),
this,
metaObject()->className(),
qUtf16Printable(objectName()));
@@ -1858,7 +1946,6 @@ void QObject::killTimer(int id)
}
}
-
/*!
\fn QObject *QObject::parent() const
@@ -1892,18 +1979,19 @@ void QObject::killTimer(int id)
/*!
- \fn template<typename T> T *QObject::findChild(const QString &name, Qt::FindChildOptions options) const
+ \fn template<typename T> T *QObject::findChild(QAnyStringView name, Qt::FindChildOptions options) const
Returns the child of this object that can be cast into type T and
that is called \a name, or \nullptr if there is no such object.
- Omitting the \a name argument causes all object names to be matched.
+ A null \a name argument causes all objects to be matched. An empty,
+ non-null \a name matches only objects whose \l objectName is empty.
The search is performed recursively, unless \a options specifies the
option FindDirectChildrenOnly.
- If there is more than one child matching the search, the most
- direct ancestor is returned. If there are several direct
- ancestors, it is undefined which one will be returned. In that
- case, findChildren() should be used.
+ If there is more than one child matching the search, the most-direct
+ ancestor is returned. If there are several most-direct ancestors, the
+ first child in children() will be returned. In that case, it's better
+ to use findChildren() to get the complete list of all children.
This example returns a child \c{QPushButton} of \c{parentWidget}
named \c{"button1"}, even if the button isn't a direct child of
@@ -1925,11 +2013,32 @@ void QObject::killTimer(int id)
\snippet code/src_corelib_kernel_qobject.cpp 42
+ \note In Qt versions prior to 6.7, this function took \a name as
+ \c{QString}, not \c{QAnyStringView}.
+
\sa findChildren()
*/
/*!
- \fn template<typename T> QList<T> QObject::findChildren(const QString &name, Qt::FindChildOptions options) const
+ \fn template<typename T> T *QObject::findChild(Qt::FindChildOptions options) const
+ \overload
+ \since 6.7
+
+ Returns the child of this object that can be cast into type T, or
+ \nullptr if there is no such object.
+ The search is performed recursively, unless \a options specifies the
+ option FindDirectChildrenOnly.
+
+ If there is more than one child matching the search, the most-direct ancestor
+ is returned. If there are several most-direct ancestors, the first child in
+ children() will be returned. In that case, it's better to use findChildren()
+ to get the complete list of all children.
+
+ \sa findChildren()
+*/
+
+/*!
+ \fn template<typename T> QList<T> QObject::findChildren(QAnyStringView name, Qt::FindChildOptions options) const
Returns all children of this object with the given \a name that can be
cast to type T, or an empty list if there are no such objects.
@@ -1951,6 +2060,9 @@ void QObject::killTimer(int id)
\snippet code/src_corelib_kernel_qobject.cpp 43
+ \note In Qt versions prior to 6.7, this function took \a name as
+ \c{QString}, not \c{QAnyStringView}.
+
\sa findChild()
*/
@@ -1968,7 +2080,7 @@ void QObject::killTimer(int id)
*/
/*!
- \fn QList<T> QObject::findChildren(const QRegularExpression &re, Qt::FindChildOptions options) const
+ \fn template<typename T> QList<T> QObject::findChildren(const QRegularExpression &re, Qt::FindChildOptions options) const
\overload findChildren()
\since 5.0
@@ -2012,46 +2124,26 @@ void QObject::killTimer(int id)
\sa QObject::findChildren()
*/
-static void qt_qFindChildren_with_name(const QObject *parent, const QString &name,
- const QMetaObject &mo, QList<void *> *list,
- Qt::FindChildOptions options)
+static bool matches_objectName_non_null(QObject *obj, QAnyStringView name)
{
- Q_ASSERT(parent);
- Q_ASSERT(list);
- Q_ASSERT(!name.isNull());
- for (QObject *obj : parent->children()) {
- if (mo.cast(obj) && obj->objectName() == name)
- list->append(obj);
- if (options & Qt::FindChildrenRecursively)
- qt_qFindChildren_with_name(obj, name, mo, list, options);
- }
+ if (auto ext = QObjectPrivate::get(obj)->extraData)
+ return ext ->objectName.valueBypassingBindings() == name;
+ return name.isEmpty();
}
/*!
\internal
*/
-void qt_qFindChildren_helper(const QObject *parent, const QString &name,
+void qt_qFindChildren_helper(const QObject *parent, QAnyStringView name,
const QMetaObject &mo, QList<void*> *list, Qt::FindChildOptions options)
{
- if (name.isNull())
- return qt_qFindChildren_helper(parent, mo, list, options);
- else
- return qt_qFindChildren_with_name(parent, name, mo, list, options);
-}
-
-/*!
- \internal
-*/
-void qt_qFindChildren_helper(const QObject *parent, const QMetaObject &mo,
- QList<void*> *list, Qt::FindChildOptions options)
-{
Q_ASSERT(parent);
Q_ASSERT(list);
for (QObject *obj : parent->children()) {
- if (mo.cast(obj))
+ if (mo.cast(obj) && (name.isNull() || matches_objectName_non_null(obj, name)))
list->append(obj);
if (options & Qt::FindChildrenRecursively)
- qt_qFindChildren_helper(obj, mo, list, options);
+ qt_qFindChildren_helper(obj, name, mo, list, options);
}
}
@@ -2078,13 +2170,13 @@ void qt_qFindChildren_helper(const QObject *parent, const QRegularExpression &re
/*!
\internal
- */
-QObject *qt_qFindChild_helper(const QObject *parent, const QString &name, const QMetaObject &mo, Qt::FindChildOptions options)
+*/
+QObject *qt_qFindChild_helper(const QObject *parent, QAnyStringView name, const QMetaObject &mo, Qt::FindChildOptions options)
{
Q_ASSERT(parent);
for (QObject *obj : parent->children()) {
- if (mo.cast(obj) && (name.isNull() || obj->objectName() == name))
- return obj;
+ if (mo.cast(obj) && (name.isNull() || matches_objectName_non_null(obj, name)))
+ return obj;
}
if (options & Qt::FindChildrenRecursively) {
for (QObject *child : parent->children()) {
@@ -2114,7 +2206,7 @@ void QObjectPrivate::deleteChildren()
// delete children objects
// don't use qDeleteAll as the destructor of the child might
// delete siblings
- for (int i = 0; i < children.count(); ++i) {
+ for (int i = 0; i < children.size(); ++i) {
currentChildBeingDeleted = children.at(i);
children[i] = nullptr;
delete currentChildBeingDeleted;
@@ -2167,10 +2259,18 @@ void QObjectPrivate::setParent_helper(QObject *o)
}
}
}
+
+ if (receiveParentEvents) {
+ Q_ASSERT(!isWidget); // Handled in QWidget
+ QEvent e(QEvent::ParentAboutToChange);
+ QCoreApplication::sendEvent(q, &e);
+ }
+
parent = o;
+
if (parent) {
// object hierarchies are constrained to a single thread
- if (threadData != parent->d_func()->threadData) {
+ if (threadData.loadRelaxed() != parent->d_func()->threadData.loadRelaxed()) {
qWarning("QObject::setParent: Cannot set parent, new parent is in a different thread");
parent = nullptr;
return;
@@ -2183,6 +2283,12 @@ void QObjectPrivate::setParent_helper(QObject *o)
}
}
}
+
+ if (receiveParentEvents) {
+ Q_ASSERT(!isWidget); // Handled in QWidget
+ QEvent e(QEvent::ParentChange);
+ QCoreApplication::sendEvent(q, &e);
+ }
}
/*!
@@ -2201,6 +2307,9 @@ void QObjectPrivate::setParent_helper(QObject *o)
If multiple event filters are installed on a single object, the
filter that was installed last is activated first.
+ If \a filterObj has already been installed for this object,
+ this function moves it so it acts as if it was installed last.
+
Here's a \c KeyPressEater class that eats the key presses of its
monitored objects:
@@ -2232,17 +2341,16 @@ void QObject::installEventFilter(QObject *obj)
Q_D(QObject);
if (!obj)
return;
- if (d->threadData != obj->d_func()->threadData) {
+ if (d->threadData.loadRelaxed() != obj->d_func()->threadData.loadRelaxed()) {
qWarning("QObject::installEventFilter(): Cannot filter events for objects in a different thread.");
return;
}
- if (!d->extraData)
- d->extraData = new QObjectPrivate::ExtraData(d);
+ d->ensureExtraData();
- // clean up unused items in the list
- d->extraData->eventFilters.removeAll((QObject *)nullptr);
- d->extraData->eventFilters.removeAll(obj);
+ // clean up unused items in the list along the way:
+ auto isNullOrEquals = [](auto obj) { return [obj](const auto &p) { return !p || p == obj; }; };
+ d->extraData->eventFilters.removeIf(isNullOrEquals(obj));
d->extraData->eventFilters.prepend(obj);
}
@@ -2263,9 +2371,11 @@ void QObject::removeEventFilter(QObject *obj)
{
Q_D(QObject);
if (d->extraData) {
- for (int i = 0; i < d->extraData->eventFilters.count(); ++i) {
- if (d->extraData->eventFilters.at(i) == obj)
- d->extraData->eventFilters[i] = nullptr;
+ for (auto &filter : d->extraData->eventFilters) {
+ if (filter == obj) {
+ filter = nullptr;
+ break;
+ }
}
}
}
@@ -2294,7 +2404,7 @@ void QObject::removeEventFilter(QObject *obj)
QCoreApplication::exec()), the object will be deleted once the
event loop is started. If deleteLater() is called after the main event loop
has stopped, the object will not be deleted.
- Since Qt 4.8, if deleteLater() is called on an object that lives in a
+ If deleteLater() is called on an object that lives in a
thread with no running event loop, the object will be destroyed when the
thread finishes.
@@ -2305,9 +2415,20 @@ void QObject::removeEventFilter(QObject *obj)
event loop was still running: the Qt event loop will delete those objects
as soon as the new nested event loop starts.
- \note It is safe to call this function more than once; when the
- first deferred deletion event is delivered, any pending events for the
- object are removed from the event queue.
+ In situations where Qt is not driving the event dispatcher via e.g.
+ QCoreApplication::exec() or QEventLoop::exec(), deferred deletes
+ will not be processed automatically. To ensure deferred deletion in
+ this scenario, the following workaround can be used:
+
+ \code
+ const auto *eventDispatcher = QThread::currentThread()->eventDispatcher();
+ QObject::connect(eventDispatcher, &QAbstractEventDispatcher::aboutToBlock,
+ QThread::currentThread(), []{
+ if (QThread::currentThread()->loopLevel() == 0)
+ QCoreApplication::sendPostedEvents(nullptr, QEvent::DeferredDelete);
+ }
+ );
+ \endcode
\sa destroyed(), QPointer
*/
@@ -2317,7 +2438,62 @@ void QObject::deleteLater()
if (qApp == this)
qWarning("You are deferring the delete of QCoreApplication, this may not work as expected.");
#endif
- QCoreApplication::postEvent(this, new QDeferredDeleteEvent());
+
+
+ // De-bounce QDeferredDeleteEvents. Use the post event list mutex
+ // to guard access to deleteLaterCalled, so we don't need a separate
+ // mutex in QObjectData.
+ auto eventListLocker = QCoreApplicationPrivate::lockThreadPostEventList(this);
+ if (!eventListLocker.threadData)
+ return;
+
+ // FIXME: The deleteLaterCalled flag is part of a bit field,
+ // so we likely have data races here, even with the mutex above,
+ // as long as we're not guarding every access to the bit field.
+
+ Q_D(QObject);
+ if (d->deleteLaterCalled) {
+ qCDebug(lcDeleteLater) << "Skipping deleteLater for already deferred object" << this;
+ return;
+ }
+
+ d->deleteLaterCalled = true;
+
+ int loopLevel = 0;
+ int scopeLevel = 0;
+
+ auto *objectThreadData = eventListLocker.threadData;
+ if (objectThreadData == QThreadData::current()) {
+ // Remember the current running eventloop for deleteLater
+ // calls in the object's own thread.
+
+ // Events sent by non-Qt event handlers (such as glib) may not
+ // have the scopeLevel set correctly. The scope level makes sure that
+ // code like this:
+ // foo->deleteLater();
+ // qApp->processEvents(); // without passing QEvent::DeferredDelete
+ // will not cause "foo" to be deleted before returning to the event loop.
+
+ loopLevel = objectThreadData->loopLevel;
+ scopeLevel = objectThreadData->scopeLevel;
+
+ // If the scope level is 0 while loopLevel != 0, we are called from a
+ // non-conformant code path, and our best guess is that the scope level
+ // should be 1. (Loop level 0 is special: it means that no event loops
+ // are running.)
+ if (scopeLevel == 0 && loopLevel != 0) {
+ qCDebug(lcDeleteLater) << "Delete later called with scope level 0"
+ << "but loop level is > 0. Assuming scope is 1";
+ scopeLevel = 1;
+ }
+ }
+
+ qCDebug(lcDeleteLater) << "Posting deferred delete for" << this
+ << "with loop level" << loopLevel << "and scope level" << scopeLevel;
+
+ eventListLocker.unlock();
+ QCoreApplication::postEvent(this,
+ new QDeferredDeleteEvent(loopLevel, scopeLevel));
}
/*!
@@ -2330,13 +2506,12 @@ void QObject::deleteLater()
translated string is available.
Example:
- \snippet ../widgets/mainwindows/sdi/mainwindow.cpp implicit tr context
+ \snippet ../widgets/itemviews/spreadsheet/spreadsheet.cpp implicit tr context
\dots
If the same \a sourceText is used in different roles within the
same context, an additional identifying string may be passed in
- \a disambiguation (\nullptr by default). In Qt 4.4 and earlier, this was
- the preferred way to pass comments to translators.
+ \a disambiguation (\nullptr by default).
Example:
@@ -2345,8 +2520,8 @@ void QObject::deleteLater()
See \l{Writing Source Code for Translation} for a detailed description of
Qt's translation mechanisms in general, and the
- \l{Writing Source Code for Translation#Disambiguation}{Disambiguation}
- section for information on disambiguation.
+ \l{Writing Source Code for Translation#Disambiguate Identical Text}
+ {Disambiguate Identical Text} section for information on disambiguation.
\warning This method is reentrant only if all translators are
installed \e before calling this method. Installing or removing
@@ -2360,11 +2535,27 @@ void QObject::deleteLater()
Signals and slots
*****************************************************************************/
+namespace {
+// This class provides (per-thread) storage for qFlagLocation()
+class FlaggedDebugSignatures
+{
+ uint idx = 0;
+ std::array<const char *, 2> locations = {}; // one for the SIGNAL, one for the SLOT
+
+public:
+ void store(const char* method) noexcept
+ { locations[idx++ % locations.size()] = method; }
+
+ bool contains(const char *method) const noexcept
+ { return std::find(locations.begin(), locations.end(), method) != locations.end(); }
+};
+
+Q_CONSTINIT static thread_local FlaggedDebugSignatures flaggedSignatures = {};
+} // unnamed namespace
+
const char *qFlagLocation(const char *method)
{
- QThreadData *currentThreadData = QThreadData::current(false);
- if (currentThreadData != nullptr)
- currentThreadData->flaggedSignatures.store(method);
+ flaggedSignatures.store(method);
return method;
}
@@ -2376,7 +2567,7 @@ static int extract_code(const char *member)
static const char *extract_location(const char *member)
{
- if (QThreadData::current()->flaggedSignatures.contains(member)) {
+ if (flaggedSignatures.contains(member)) {
// signature includes location information after the first null-terminator
const char *location = member + qstrlen(member) + 1;
if (*location != '\0')
@@ -2413,6 +2604,7 @@ static bool check_method_code(int code, const QObject *object, const char *metho
return true;
}
+Q_DECL_COLD_FUNCTION
static void err_method_notfound(const QObject *object,
const char *method, const char *func)
{
@@ -2430,6 +2622,7 @@ static void err_method_notfound(const QObject *object,
object->metaObject()->className(), method + 1, loc ? " in " : "", loc ? loc : "");
}
+Q_DECL_COLD_FUNCTION
static void err_info_about_objects(const char *func, const QObject *sender, const QObject *receiver)
{
QString a = sender ? sender->objectName() : QString();
@@ -2466,7 +2659,7 @@ QObject *QObject::sender() const
{
Q_D(const QObject);
- QBasicMutexLocker locker(signalSlotLock(this));
+ QMutexLocker locker(signalSlotLock(this));
QObjectPrivate::ConnectionData *cd = d->connections.loadRelaxed();
if (!cd || !cd->currentSender)
return nullptr;
@@ -2508,7 +2701,7 @@ int QObject::senderSignalIndex() const
{
Q_D(const QObject);
- QBasicMutexLocker locker(signalSlotLock(this));
+ QMutexLocker locker(signalSlotLock(this));
QObjectPrivate::ConnectionData *cd = d->connections.loadRelaxed();
if (!cd || !cd->currentSender)
return -1;
@@ -2567,13 +2760,13 @@ int QObject::receivers(const char *signal) const
if (!d->isSignalConnected(signal_index))
return receivers;
- if (d->declarativeData && QAbstractDeclarativeData::receivers) {
+ if (!d->isDeletingChildren && d->declarativeData && QAbstractDeclarativeData::receivers) {
receivers += QAbstractDeclarativeData::receivers(d->declarativeData, this,
signal_index);
}
+ QMutexLocker locker(signalSlotLock(this));
QObjectPrivate::ConnectionData *cd = d->connections.loadRelaxed();
- QBasicMutexLocker locker(signalSlotLock(this));
if (cd && signal_index < cd->signalVectorCount()) {
const QObjectPrivate::Connection *c = cd->signalVector.loadRelaxed()->at(signal_index).first.loadRelaxed();
while (c) {
@@ -2595,13 +2788,15 @@ int QObject::receivers(const char *signal) const
\snippet code/src_corelib_kernel_qobject.cpp 49
- As the code snippet above illustrates, you can use this function
- to avoid emitting a signal that nobody listens to.
+ As the code snippet above illustrates, you can use this function to avoid
+ expensive initialization or emitting a signal that nobody listens to.
+ However, in a multithreaded application, connections might change after
+ this function returns and before the signal gets emitted.
\warning This function violates the object-oriented principle of
- modularity. However, it might be useful when you need to perform
- expensive initialization only if something is connected to a
- signal.
+ modularity. In particular, this function must not be called from an
+ override of connectNotify() or disconnectNotify(), as those might get
+ called from any thread.
*/
bool QObject::isSignalConnected(const QMetaMethod &signal) const
{
@@ -2618,7 +2813,7 @@ bool QObject::isSignalConnected(const QMetaMethod &signal) const
signalIndex += QMetaObjectPrivate::signalOffset(signal.mobj);
- QBasicMutexLocker locker(signalSlotLock(this));
+ QMutexLocker locker(signalSlotLock(this));
return d->isSignalConnected(signalIndex, true);
}
@@ -3275,8 +3470,13 @@ bool QObject::disconnect(const QObject *sender, const QMetaMethod &signal,
signal.
\warning This function is called from the thread which performs the
- connection, which may be a different thread from the thread in
- which this object lives.
+ connection, which may be a different thread from the thread in which
+ this object lives. This function may also be called with a QObject internal
+ mutex locked. It is therefore not allowed to re-enter any QObject
+ functions, including isSignalConnected(), from your reimplementation. If
+ you lock a mutex in your reimplementation, make sure that you don't call
+ QObject functions with that mutex held in other places or it will result in
+ a deadlock.
\sa connect(), disconnectNotify()
*/
@@ -3305,12 +3505,12 @@ void QObject::connectNotify(const QMetaMethod &signal)
expensive resources.
\warning This function is called from the thread which performs the
- disconnection, which may be a different thread from the thread in
- which this object lives. This function may also be called with a QObject
- internal mutex locked. It is therefore not allowed to re-enter any
- of any QObject functions from your reimplementation and if you lock
- a mutex in your reimplementation, make sure that you don't call QObject
- functions with that mutex held in other places or it will result in
+ disconnection, which may be a different thread from the thread in which
+ this object lives. This function may also be called with a QObject internal
+ mutex locked. It is therefore not allowed to re-enter any QObject
+ functions, including isSignalConnected(), from your reimplementation. If
+ you lock a mutex in your reimplementation, make sure that you don't call
+ QObject functions with that mutex held in other places or it will result in
a deadlock.
\sa disconnect(), connectNotify()
@@ -3414,7 +3614,7 @@ QObjectPrivate::Connection *QMetaObjectPrivate::connect(const QObject *sender,
c->sender = s;
c->signal_index = signal_index;
c->receiver.storeRelaxed(r);
- QThreadData *td = r->d_func()->threadData;
+ QThreadData *td = r->d_func()->threadData.loadAcquire();
td->ref();
c->receiverThreadData.storeRelaxed(td);
c->method_relative = method_index;
@@ -3519,7 +3719,7 @@ bool QMetaObjectPrivate::disconnect(const QObject *sender,
QObject *s = const_cast<QObject *>(sender);
QBasicMutex *senderMutex = signalSlotLock(sender);
- QBasicMutexLocker locker(senderMutex);
+ QMutexLocker locker(senderMutex);
QObjectPrivate::ConnectionData *scd = QObjectPrivate::get(s)->connections.loadRelaxed();
if (!scd)
@@ -3626,7 +3826,7 @@ void QMetaObject::connectSlotsByName(QObject *o)
// ...we check each object in our list, ...
bool foundIt = false;
- for (int j = 0; j < list.count(); ++j) {
+ for (int j = 0; j < list.size(); ++j) {
const QObject *co = list.at(j);
const QByteArray coName = co->objectName().toLatin1();
@@ -3700,7 +3900,7 @@ struct SlotObjectGuard {
SlotObjectGuard() = default;
// move would be fine, but we do not need it currently
Q_DISABLE_COPY_MOVE(SlotObjectGuard)
- explicit SlotObjectGuard(QtPrivate::QSlotObjectBase *slotObject)
+ Q_NODISCARD_CTOR explicit SlotObjectGuard(QtPrivate::QSlotObjectBase *slotObject)
: m_slotObject(slotObject)
{
if (m_slotObject)
@@ -3708,17 +3908,14 @@ struct SlotObjectGuard {
}
QtPrivate::QSlotObjectBase const *operator->() const
- { return m_slotObject; }
+ { return m_slotObject.get(); }
QtPrivate::QSlotObjectBase *operator->()
- { return m_slotObject; }
+ { return m_slotObject.get(); }
- ~SlotObjectGuard() {
- if (m_slotObject)
- m_slotObject->destroyIfLastRef();
- }
+ ~SlotObjectGuard() = default;
private:
- QtPrivate::QSlotObjectBase *m_slotObject = nullptr;
+ QtPrivate::SlotObjUniquePtr m_slotObject;
};
/*!
@@ -3746,7 +3943,7 @@ static void queued_activate(QObject *sender, int signal, QObjectPrivate::Connect
while (argumentTypes[nargs - 1])
++nargs;
- QBasicMutexLocker locker(signalSlotLock(c->receiver.loadRelaxed()));
+ QMutexLocker locker(signalSlotLock(c->receiver.loadRelaxed()));
QObject *receiver = c->receiver.loadRelaxed();
if (!receiver) {
// the connection has been disconnected before we got the lock
@@ -3774,7 +3971,7 @@ static void queued_activate(QObject *sender, int signal, QObjectPrivate::Connect
args[n] = types[n].create(argv[n]);
}
- if (c->isSingleShot && !QObjectPrivate::disconnect(c)) {
+ if (c->isSingleShot && !QObjectPrivate::removeConnection(c)) {
delete ev;
return;
}
@@ -3827,8 +4024,8 @@ void doActivate(QObject *sender, int signal_index, void **argv)
bool senderDeleted = false;
{
- Q_ASSERT(sp->connections.loadAcquire());
- QObjectPrivate::ConnectionDataPointer connections(sp->connections.loadRelaxed());
+ Q_ASSERT(sp->connections.loadRelaxed());
+ QObjectPrivate::ConnectionDataPointer connections(sp->connections.loadAcquire());
QObjectPrivate::SignalVector *signalVector = connections->signalVector.loadRelaxed();
const QObjectPrivate::ConnectionList *list;
@@ -3882,12 +4079,12 @@ void doActivate(QObject *sender, int signal_index, void **argv)
receiver->metaObject()->className(), receiver);
}
- if (c->isSingleShot && !QObjectPrivate::disconnect(c))
+ if (c->isSingleShot && !QObjectPrivate::removeConnection(c))
continue;
QSemaphore semaphore;
{
- QBasicMutexLocker locker(signalSlotLock(receiver));
+ QMutexLocker locker(signalSlotLock(receiver));
if (!c->isSingleShot && !c->receiver.loadAcquire())
continue;
QMetaCallEvent *ev = c->isSlotObject ?
@@ -3901,10 +4098,12 @@ void doActivate(QObject *sender, int signal_index, void **argv)
#endif
}
- if (c->isSingleShot && !QObjectPrivate::disconnect(c))
+ if (c->isSingleShot && !QObjectPrivate::removeConnection(c))
continue;
- QObjectPrivate::Sender senderData(receiverInSameThread ? receiver : nullptr, sender, signal_index);
+ QObjectPrivate::Sender senderData(
+ receiverInSameThread ? receiver : nullptr, sender, signal_index,
+ receiverInSameThread ? QObjectPrivate::get(receiver)->connections.loadAcquire() : nullptr);
if (c->isSlotObject) {
SlotObjectGuard obj{c->slotObj};
@@ -3953,7 +4152,7 @@ void doActivate(QObject *sender, int signal_index, void **argv)
senderDeleted = true;
}
if (!senderDeleted) {
- sp->connections.loadRelaxed()->cleanOrphanedConnections(sender);
+ sp->connections.loadAcquire()->cleanOrphanedConnections(sender);
if (callbacks_enabled && signal_spy_set->signal_end_callback != nullptr)
signal_spy_set->signal_end_callback(sender, signal_index);
@@ -4030,9 +4229,9 @@ int QObjectPrivate::signalIndex(const char *signalName,
Properties
*****************************************************************************/
-#ifndef QT_NO_PROPERTIES
-
/*!
+ \fn bool QObject::setProperty(const char *name, const QVariant &value)
+
Sets the value of the object's \a name property to \a value.
If the property is defined in the class using Q_PROPERTY then
@@ -4053,17 +4252,24 @@ int QObjectPrivate::signalIndex(const char *signalName,
\sa property(), metaObject(), dynamicPropertyNames(), QMetaProperty::write()
*/
-bool QObject::setProperty(const char *name, const QVariant &value)
+
+/*!
+ \fn bool QObject::setProperty(const char *name, QVariant &&value)
+ \since 6.6
+ \overload setProperty
+*/
+
+bool QObject::doSetProperty(const char *name, const QVariant *lvalue, QVariant *rvalue)
{
Q_D(QObject);
+ const auto &value =*lvalue;
const QMetaObject *meta = metaObject();
if (!name || !meta)
return false;
int id = meta->indexOfProperty(name);
if (id < 0) {
- if (!d->extraData)
- d->extraData = new QObjectPrivate::ExtraData(d);
+ d->ensureExtraData();
const int idx = d->extraData->propertyNames.indexOf(name);
@@ -4075,12 +4281,18 @@ bool QObject::setProperty(const char *name, const QVariant &value)
} else {
if (idx == -1) {
d->extraData->propertyNames.append(name);
- d->extraData->propertyValues.append(value);
+ if (rvalue)
+ d->extraData->propertyValues.append(std::move(*rvalue));
+ else
+ d->extraData->propertyValues.append(*lvalue);
} else {
if (value.userType() == d->extraData->propertyValues.at(idx).userType()
&& value == d->extraData->propertyValues.at(idx))
return false;
- d->extraData->propertyValues[idx] = value;
+ if (rvalue)
+ d->extraData->propertyValues[idx] = std::move(*rvalue);
+ else
+ d->extraData->propertyValues[idx] = *lvalue;
}
}
@@ -4095,7 +4307,7 @@ bool QObject::setProperty(const char *name, const QVariant &value)
qWarning("%s::setProperty: Property \"%s\" invalid,"
" read-only or does not exist", metaObject()->className(), name);
#endif
- return p.write(this, value);
+ return rvalue ? p.write(this, std::move(*rvalue)) : p.write(this, *lvalue);
}
/*!
@@ -4145,42 +4357,24 @@ QList<QByteArray> QObject::dynamicPropertyNames() const
return QList<QByteArray>();
}
-#endif // QT_NO_PROPERTIES
-
-
/*****************************************************************************
QObject debugging output routines.
*****************************************************************************/
+std::string QObjectPrivate::flagsForDumping() const
+{
+ return {};
+}
+
static void dumpRecursive(int level, const QObject *object)
{
if (object) {
- QByteArray buf;
- buf.fill(' ', level / 2 * 8);
- if (level % 2)
- buf += " ";
- QString name = object->objectName();
- QString flags = QLatin1String("");
-#if 0
- if (qApp->focusWidget() == object)
- flags += 'F';
- if (object->isWidgetType()) {
- QWidget * w = (QWidget *)object;
- if (w->isVisible()) {
- QString t("<%1,%2,%3,%4>");
- flags += t.arg(w->x()).arg(w->y()).arg(w->width()).arg(w->height());
- } else {
- flags += 'I';
- }
- }
-#endif
- qDebug("%s%s::%s %s", (const char*)buf, object->metaObject()->className(), name.toLocal8Bit().data(),
- flags.toLatin1().data());
- QObjectList children = object->children();
- if (!children.isEmpty()) {
- for (int i = 0; i < children.size(); ++i)
- dumpRecursive(level+1, children.at(i));
- }
+ const int indent = level * 4;
+ qDebug("%*s%s::%ls %s", indent, "", object->metaObject()->className(),
+ qUtf16Printable(object->objectName()),
+ QObjectPrivate::get(object)->flagsForDumping().c_str());
+ for (auto child : object->children())
+ dumpRecursive(level + 1, child);
}
}
@@ -4213,7 +4407,7 @@ void QObject::dumpObjectInfo() const
objectName().isEmpty() ? "unnamed" : objectName().toLocal8Bit().data());
Q_D(const QObject);
- QBasicMutexLocker locker(signalSlotLock(this));
+ QMutexLocker locker(signalSlotLock(this));
// first, look for connections where this object is the sender
qDebug(" SIGNALS OUT");
@@ -4275,15 +4469,23 @@ void QObject::dumpObjectInfo() const
#ifndef QT_NO_DEBUG_STREAM
+void QObjectPrivate::writeToDebugStream(QDebug &dbg) const
+{
+ Q_Q(const QObject);
+ dbg.nospace() << q->metaObject()->className() << '(' << (const void *)q;
+ if (!q->objectName().isEmpty())
+ dbg << ", name = " << q->objectName();
+ dbg << ')';
+}
+
QDebug operator<<(QDebug dbg, const QObject *o)
{
QDebugStateSaver saver(dbg);
if (!o)
return dbg << "QObject(0x0)";
- dbg.nospace() << o->metaObject()->className() << '(' << (const void *)o;
- if (!o->objectName().isEmpty())
- dbg << ", name = " << o->objectName();
- dbg << ')';
+
+ const QObjectPrivate *d = QObjectPrivate::get(o);
+ d->writeToDebugStream(dbg);
return dbg;
}
#endif
@@ -4293,19 +4495,22 @@ QDebug operator<<(QDebug dbg, const QObject *o)
\relates QObject
This macro associates extra information to the class, which is available
- using QObject::metaObject(). Qt makes only limited use of this feature in
- \l{Qt D-Bus} and \l{Qt QML} modules.
-
- The extra information takes the form of a \a Name string and a \a Value
- literal string.
+ using QObject::metaObject(). The extra information takes the form of a
+ \a Name string and a \a Value literal string.
Example:
\snippet code/src_corelib_kernel_qobject.cpp 35
+ Qt makes use of the macro in \l{Qt D-Bus} and \l{Qt Qml} modules.
+ For instance, when defining \l{QML Object Types} in C++, you can
+ designate a property as the \e default one:
+
+ \snippet code/doc_src_properties.cpp 7
+
\sa QMetaObject::classInfo()
\sa {Using Qt D-Bus Adaptors}
- \sa {Extending QML}
+ \sa {Defining QML Types from C++}
*/
/*!
@@ -4315,15 +4520,6 @@ QDebug operator<<(QDebug dbg, const QObject *o)
This macro tells Qt which interfaces the class implements. This
is used when implementing plugins.
- Example:
-
- \snippet ../widgets/tools/plugandpaint/plugins/basictools/basictoolsplugin.h 1
- \dots
- \snippet ../widgets/tools/plugandpaint/plugins/basictools/basictoolsplugin.h 3
-
- See the \l{tools/plugandpaint/plugins/basictools}{Plug & Paint
- Basic Tools} example for details.
-
\sa Q_DECLARE_INTERFACE(), Q_PLUGIN_METADATA(), {How to Create Qt Plugins}
*/
@@ -4522,6 +4718,13 @@ QDebug operator<<(QDebug dbg, const QObject *o)
Q_GADGET or Q_GADGET_EXPORT instead of Q_OBJECT to enable the meta object system's support
for enums in a class that is not a QObject subclass.
+//! [qobject-macros-private-access-specifier]
+ \note This macro expansion ends with a \c private: access specifier, which makes member
+ declarations immediately after the macro private, too. If you want add public (or protected)
+ members immediately after the macro, you need to use a \c public: (or \c protected:)
+ access specifier.
+//! [qobject-macros-private-access-specifier]
+
\sa {Meta-Object System}, {Signals and Slots}, {Qt's Property System}
*/
@@ -4539,7 +4742,9 @@ QDebug operator<<(QDebug dbg, const QObject *o)
Q_GADGET makes a class member, \c{staticMetaObject}, available.
\c{staticMetaObject} is of type QMetaObject and provides access to the
- enums declared with Q_ENUMS.
+ enums declared with Q_ENUM.
+
+ \include qobject.cpp qobject-macros-private-access-specifier
\sa Q_GADGET_EXPORT
*/
@@ -4566,6 +4771,8 @@ QDebug operator<<(QDebug dbg, const QObject *o)
~~~
\endcode
+ \include qobject.cpp qobject-macros-private-access-specifier
+
\sa Q_GADGET, {Creating Shared Libraries}
*/
@@ -4796,17 +5003,34 @@ QDebug operator<<(QDebug dbg, const QObject *o)
*/
/*!
+ \macro QT_NO_CONTEXTLESS_CONNECT
+ \relates QObject
+ \since 6.7
+
+ Defining this macro will disable the overload of QObject::connect() that
+ connects a signal to a functor, without also specifying a QObject
+ as a receiver/context object (that is, the 3-arguments overload
+ of QObject::connect()).
+
+ Using the context-less overload is error prone, because it is easy
+ to connect to functors that depend on some local state of the
+ receiving end. If such local state gets destroyed, the connection
+ does not get automatically disconnected.
+
+ Moreover, such connections are always direct connections, which may
+ cause issues in multithreaded scenarios (for instance, if the
+ signal is emitted from another thread).
+
+ \sa QObject::connect, Qt::ConnectionType
+*/
+
+/*!
\typedef QObjectList
\relates QObject
Synonym for QList<QObject *>.
*/
-void qDeleteInEventHandler(QObject *o)
-{
- delete o;
-}
-
/*!
\fn template<typename PointerToMemberFunction> QMetaObject::Connection QObject::connect(const QObject *sender, PointerToMemberFunction signal, const QObject *receiver, PointerToMemberFunction method, Qt::ConnectionType type)
\overload connect()
@@ -4900,6 +5124,11 @@ void qDeleteInEventHandler(QObject *o)
However, you should take care that any objects used within the functor
are still alive when the signal is emitted.
+ For this reason, it is recommended to use the overload of connect()
+ that also takes a QObject as a receiver/context. It is possible
+ to disable the usage of the context-less overload by defining the
+ \c{QT_NO_CONTEXTLESS_CONNECT} macro.
+
Overloaded functions can be resolved with help of \l qOverload.
*/
@@ -4965,13 +5194,12 @@ void qDeleteInEventHandler(QObject *o)
*/
QMetaObject::Connection QObject::connectImpl(const QObject *sender, void **signal,
const QObject *receiver, void **slot,
- QtPrivate::QSlotObjectBase *slotObj, Qt::ConnectionType type,
+ QtPrivate::QSlotObjectBase *slotObjRaw, Qt::ConnectionType type,
const int *types, const QMetaObject *senderMetaObject)
{
+ QtPrivate::SlotObjUniquePtr slotObj(slotObjRaw);
if (!signal) {
qCWarning(lcConnect, "QObject::connect: invalid nullptr parameter");
- if (slotObj)
- slotObj->destroyIfLastRef();
return QMetaObject::Connection();
}
@@ -4984,11 +5212,10 @@ QMetaObject::Connection QObject::connectImpl(const QObject *sender, void **signa
}
if (!senderMetaObject) {
qCWarning(lcConnect, "QObject::connect: signal not found in %s", sender->metaObject()->className());
- slotObj->destroyIfLastRef();
return QMetaObject::Connection(nullptr);
}
signal_index += QMetaObjectPrivate::signalOffset(senderMetaObject);
- return QObjectPrivate::connectImpl(sender, signal_index, receiver, slot, slotObj, type, types, senderMetaObject);
+ return QObjectPrivate::connectImpl(sender, signal_index, receiver, slot, slotObj.release(), type, types, senderMetaObject);
}
static void connectWarning(const QObject *sender,
@@ -5013,14 +5240,10 @@ static void connectWarning(const QObject *sender,
*/
QMetaObject::Connection QObjectPrivate::connectImpl(const QObject *sender, int signal_index,
const QObject *receiver, void **slot,
- QtPrivate::QSlotObjectBase *slotObj, int type,
+ QtPrivate::QSlotObjectBase *slotObjRaw, int type,
const int *types, const QMetaObject *senderMetaObject)
{
- auto connectFailureGuard = qScopeGuard([&]()
- {
- if (slotObj)
- slotObj->destroyIfLastRef();
- });
+ QtPrivate::SlotObjUniquePtr slotObj(slotObjRaw);
if (!sender || !receiver || !slotObj || !senderMetaObject) {
connectWarning(sender, senderMetaObject, receiver, "invalid nullptr parameter");
@@ -5032,24 +5255,20 @@ QMetaObject::Connection QObjectPrivate::connectImpl(const QObject *sender, int s
return QMetaObject::Connection();
}
- connectFailureGuard.dismiss();
-
QObject *s = const_cast<QObject *>(sender);
QObject *r = const_cast<QObject *>(receiver);
QOrderedMutexLocker locker(signalSlotLock(sender),
signalSlotLock(receiver));
- if (type & Qt::UniqueConnection && slot && QObjectPrivate::get(s)->connections.loadRelaxed()) {
+ if (type & Qt::UniqueConnection && slot) {
QObjectPrivate::ConnectionData *connections = QObjectPrivate::get(s)->connections.loadRelaxed();
- if (connections->signalVectorCount() > signal_index) {
+ if (connections && connections->signalVectorCount() > signal_index) {
const QObjectPrivate::Connection *c2 = connections->signalVector.loadRelaxed()->at(signal_index).first.loadRelaxed();
while (c2) {
- if (c2->receiver.loadRelaxed() == receiver && c2->isSlotObject && c2->slotObj->compare(slot)) {
- slotObj->destroyIfLastRef();
+ if (c2->receiver.loadRelaxed() == receiver && c2->isSlotObject && c2->slotObj->compare(slot))
return QMetaObject::Connection();
- }
c2 = c2->nextConnectionList.loadRelaxed();
}
}
@@ -5065,13 +5284,13 @@ QMetaObject::Connection QObjectPrivate::connectImpl(const QObject *sender, int s
std::unique_ptr<QObjectPrivate::Connection> c{new QObjectPrivate::Connection};
c->sender = s;
c->signal_index = signal_index;
- QThreadData *td = r->d_func()->threadData;
+ QThreadData *td = r->d_func()->threadData.loadAcquire();
td->ref();
c->receiverThreadData.storeRelaxed(td);
c->receiver.storeRelaxed(r);
- c->slotObj = slotObj;
c->connectionType = type;
c->isSlotObject = true;
+ c->slotObj = slotObj.release();
if (types) {
c->argumentTypes.storeRelaxed(types);
c->ownArgumentTypes = false;
@@ -5102,7 +5321,7 @@ bool QObject::disconnect(const QMetaObject::Connection &connection)
QObjectPrivate::Connection *c = static_cast<QObjectPrivate::Connection *>(connection.d_ptr);
if (!c)
return false;
- const bool disconnected = QObjectPrivate::disconnect(c);
+ const bool disconnected = QObjectPrivate::removeConnection(c);
const_cast<QMetaObject::Connection &>(connection).d_ptr = nullptr;
c->deref(); // has been removed from the QMetaObject::Connection object
return disconnected;
@@ -5220,20 +5439,19 @@ QMetaObject::Connection QObjectPrivate::connect(const QObject *sender, int signa
*/
QMetaObject::Connection QObjectPrivate::connect(const QObject *sender, int signal_index,
const QObject *receiver,
- QtPrivate::QSlotObjectBase *slotObj,
+ QtPrivate::QSlotObjectBase *slotObjRaw,
Qt::ConnectionType type)
{
+ QtPrivate::SlotObjUniquePtr slotObj(slotObjRaw);
if (!sender) {
qCWarning(lcConnect, "QObject::connect: invalid nullptr parameter");
- if (slotObj)
- slotObj->destroyIfLastRef();
return QMetaObject::Connection();
}
const QMetaObject *senderMetaObject = sender->metaObject();
signal_index = methodIndexToSignalIndex(&senderMetaObject, signal_index);
- return QObjectPrivate::connectImpl(sender, signal_index, receiver, /*slot*/ nullptr, slotObj,
- type, /*types*/ nullptr, senderMetaObject);
+ return connectImpl(sender, signal_index, receiver, /*slot*/ nullptr, slotObj.release(),
+ type, /*types*/ nullptr, senderMetaObject);
}
/*!
@@ -5275,7 +5493,7 @@ bool QObjectPrivate::disconnect(const QObject *sender, int signal_index, const Q
\internal
\threadsafe
*/
-bool QObjectPrivate::disconnect(QObjectPrivate::Connection *c)
+inline bool QObjectPrivate::removeConnection(QObjectPrivate::Connection *c)
{
if (!c)
return false;
@@ -5314,6 +5532,33 @@ bool QObjectPrivate::disconnect(QObjectPrivate::Connection *c)
return true;
}
+/*!
+ \internal
+
+ Used by QPropertyAdaptorSlotObject to get an existing instance for a property, if available
+ */
+QtPrivate::QPropertyAdaptorSlotObject *
+QObjectPrivate::getPropertyAdaptorSlotObject(const QMetaProperty &property)
+{
+ if (auto conns = connections.loadAcquire()) {
+ Q_Q(QObject);
+ const QMetaObject *metaObject = q->metaObject();
+ int signal_index = methodIndexToSignalIndex(&metaObject, property.notifySignalIndex());
+ if (signal_index >= conns->signalVectorCount())
+ return nullptr;
+ const auto &connectionList = conns->connectionsForSignal(signal_index);
+ for (auto c = connectionList.first.loadRelaxed(); c;
+ c = c->nextConnectionList.loadRelaxed()) {
+ if (c->isSlotObject) {
+ if (auto p = QtPrivate::QPropertyAdaptorSlotObject::cast(c->slotObj,
+ property.propertyIndex()))
+ return p;
+ }
+ }
+ }
+ return nullptr;
+}
+
/*! \class QMetaObject::Connection
\inmodule QtCore
Represents a handle to a signal-slot (or signal-functor) connection.
diff --git a/src/corelib/kernel/qobject.h b/src/corelib/kernel/qobject.h
index 8a45e73b0e..06cfefd61b 100644
--- a/src/corelib/kernel/qobject.h
+++ b/src/corelib/kernel/qobject.h
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Copyright (C) 2013 Olivier Goffart <ogoffart@woboq.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// Copyright (C) 2013 Olivier Goffart <ogoffart@woboq.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QOBJECT_H
#define QOBJECT_H
@@ -55,10 +19,9 @@
#include <QtCore/qobject_impl.h>
#include <QtCore/qbindingstorage.h>
+#include <QtCore/qtcoreexports.h>
-#if __has_include(<chrono>)
-# include <chrono>
-#endif
+#include <chrono>
QT_BEGIN_NAMESPACE
@@ -81,13 +44,24 @@ struct QDynamicMetaObjectData;
typedef QList<QObject*> QObjectList;
+#if QT_CORE_REMOVED_SINCE(6, 7)
Q_CORE_EXPORT void qt_qFindChildren_helper(const QObject *parent, const QString &name,
const QMetaObject &mo, QList<void *> *list, Qt::FindChildOptions options);
+#endif
+Q_CORE_EXPORT void qt_qFindChildren_helper(const QObject *parent, QAnyStringView name,
+ const QMetaObject &mo, QList<void *> *list,
+ Qt::FindChildOptions options);
+#if QT_CORE_REMOVED_SINCE(6, 7)
Q_CORE_EXPORT void qt_qFindChildren_helper(const QObject *parent, const QMetaObject &mo,
QList<void *> *list, Qt::FindChildOptions options);
+#endif
Q_CORE_EXPORT void qt_qFindChildren_helper(const QObject *parent, const QRegularExpression &re,
const QMetaObject &mo, QList<void *> *list, Qt::FindChildOptions options);
+#if QT_CORE_REMOVED_SINCE(6, 7)
Q_CORE_EXPORT QObject *qt_qFindChild_helper(const QObject *parent, const QString &name, const QMetaObject &mo, Qt::FindChildOptions options);
+#endif
+Q_CORE_EXPORT QObject *qt_qFindChild_helper(const QObject *parent, QAnyStringView name,
+ const QMetaObject &mo, Qt::FindChildOptions options);
class Q_CORE_EXPORT QObjectData
{
@@ -107,8 +81,12 @@ public:
uint receiveChildEvents : 1;
uint isWindow : 1; // for QWindow
uint deleteLaterCalled : 1;
- uint unused : 24;
- int postedEvents;
+ uint isQuickItem : 1;
+ uint willBeWidget : 1; // for handling widget-specific bits in QObject's ctor
+ uint wasWidget : 1; // for properly cleaning up in QObject's dtor
+ uint receiveParentEvents: 1;
+ uint unused : 20;
+ QAtomicInt postedEvents;
QDynamicMetaObjectData *metaObject;
QBindingStorage bindingStorage;
@@ -136,45 +114,58 @@ public:
virtual bool event(QEvent *event);
virtual bool eventFilter(QObject *watched, QEvent *event);
-#if defined(QT_NO_TRANSLATION) || defined(Q_CLANG_QDOC)
+#if defined(QT_NO_TRANSLATION) || defined(Q_QDOC)
static QString tr(const char *sourceText, const char * = nullptr, int = -1)
{ return QString::fromUtf8(sourceText); }
#endif // QT_NO_TRANSLATION
QString objectName() const;
+#if QT_CORE_REMOVED_SINCE(6, 4)
void setObjectName(const QString &name);
+#endif
+ Q_WEAK_OVERLOAD
+ void setObjectName(const QString &name) { doSetObjectName(name); }
+ void setObjectName(QAnyStringView name);
QBindable<QString> bindableObjectName();
inline bool isWidgetType() const { return d_ptr->isWidget; }
inline bool isWindowType() const { return d_ptr->isWindow; }
+ inline bool isQuickItemType() const { return d_ptr->isQuickItem; }
inline bool signalsBlocked() const noexcept { return d_ptr->blockSig; }
bool blockSignals(bool b) noexcept;
QThread *thread() const;
+#if QT_CORE_REMOVED_SINCE(6, 7)
void moveToThread(QThread *thread);
+#endif
+ bool moveToThread(QThread *thread QT6_DECL_NEW_OVERLOAD_TAIL);
int startTimer(int interval, Qt::TimerType timerType = Qt::CoarseTimer);
-#if __has_include(<chrono>)
- Q_ALWAYS_INLINE
- int startTimer(std::chrono::milliseconds time, Qt::TimerType timerType = Qt::CoarseTimer)
- {
- return startTimer(int(time.count()), timerType);
- }
+
+#if QT_CORE_REMOVED_SINCE(6, 8)
+ int startTimer(std::chrono::milliseconds time, Qt::TimerType timerType = Qt::CoarseTimer);
#endif
+ int startTimer(std::chrono::nanoseconds time, Qt::TimerType timerType = Qt::CoarseTimer);
+
void killTimer(int id);
+ void killTimer(Qt::TimerId id);
template<typename T>
- inline T findChild(const QString &aName = QString(), Qt::FindChildOptions options = Qt::FindChildrenRecursively) const
+ T findChild(QAnyStringView aName, Qt::FindChildOptions options = Qt::FindChildrenRecursively) const
{
typedef typename std::remove_cv<typename std::remove_pointer<T>::type>::type ObjType;
+ static_assert(QtPrivate::HasQ_OBJECT_Macro<ObjType>::Value,
+ "No Q_OBJECT in the class passed to QObject::findChild");
return static_cast<T>(qt_qFindChild_helper(this, aName, ObjType::staticMetaObject, options));
}
template<typename T>
- inline QList<T> findChildren(const QString &aName, Qt::FindChildOptions options = Qt::FindChildrenRecursively) const
+ QList<T> findChildren(QAnyStringView aName, Qt::FindChildOptions options = Qt::FindChildrenRecursively) const
{
typedef typename std::remove_cv<typename std::remove_pointer<T>::type>::type ObjType;
+ static_assert(QtPrivate::HasQ_OBJECT_Macro<ObjType>::Value,
+ "No Q_OBJECT in the class passed to QObject::findChildren");
QList<T> list;
qt_qFindChildren_helper(this, aName, ObjType::staticMetaObject,
reinterpret_cast<QList<void *> *>(&list), options);
@@ -182,13 +173,15 @@ public:
}
template<typename T>
+ T findChild(Qt::FindChildOptions options = Qt::FindChildrenRecursively) const
+ {
+ return findChild<T>({}, options);
+ }
+
+ template<typename T>
QList<T> findChildren(Qt::FindChildOptions options = Qt::FindChildrenRecursively) const
{
- typedef typename std::remove_cv<typename std::remove_pointer<T>::type>::type ObjType;
- QList<T> list;
- qt_qFindChildren_helper(this, ObjType::staticMetaObject,
- reinterpret_cast<QList<void *> *>(&list), options);
- return list;
+ return findChildren<T>(QAnyStringView{}, options);
}
#if QT_CONFIG(regularexpression)
@@ -196,6 +189,8 @@ public:
inline QList<T> findChildren(const QRegularExpression &re, Qt::FindChildOptions options = Qt::FindChildrenRecursively) const
{
typedef typename std::remove_cv<typename std::remove_pointer<T>::type>::type ObjType;
+ static_assert(QtPrivate::HasQ_OBJECT_Macro<ObjType>::Value,
+ "No Q_OBJECT in the class passed to QObject::findChildren");
QList<T> list;
qt_qFindChildren_helper(this, re, ObjType::staticMetaObject,
reinterpret_cast<QList<void *> *>(&list), options);
@@ -219,7 +214,7 @@ public:
inline QMetaObject::Connection connect(const QObject *sender, const char *signal,
const char *member, Qt::ConnectionType type = Qt::AutoConnection) const;
-#ifdef Q_CLANG_QDOC
+#ifdef Q_QDOC
template<typename PointerToMemberFunction>
static QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, const QObject *receiver, PointerToMemberFunction method, Qt::ConnectionType type = Qt::AutoConnection);
template<typename PointerToMemberFunction, typename Functor>
@@ -227,54 +222,28 @@ public:
template<typename PointerToMemberFunction, typename Functor>
static QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, const QObject *context, Functor functor, Qt::ConnectionType type = Qt::AutoConnection);
#else
- //Connect a signal to a pointer to qobject member function
+ //connect with context
template <typename Func1, typename Func2>
- static inline QMetaObject::Connection connect(const typename QtPrivate::FunctionPointer<Func1>::Object *sender, Func1 signal,
- const typename QtPrivate::FunctionPointer<Func2>::Object *receiver, Func2 slot,
- Qt::ConnectionType type = Qt::AutoConnection)
+ static inline QMetaObject::Connection
+ connect(const typename QtPrivate::FunctionPointer<Func1>::Object *sender, Func1 signal,
+ const typename QtPrivate::ContextTypeForFunctor<Func2>::ContextType *context, Func2 &&slot,
+ Qt::ConnectionType type = Qt::AutoConnection)
{
typedef QtPrivate::FunctionPointer<Func1> SignalType;
- typedef QtPrivate::FunctionPointer<Func2> SlotType;
+ typedef QtPrivate::FunctionPointer<std::decay_t<Func2>> SlotType;
- static_assert(QtPrivate::HasQ_OBJECT_Macro<typename SignalType::Object>::Value,
- "No Q_OBJECT in the class with the signal");
+ if constexpr (SlotType::ArgumentCount != -1) {
+ static_assert((QtPrivate::AreArgumentsCompatible<typename SlotType::ReturnType, typename SignalType::ReturnType>::value),
+ "Return type of the slot is not compatible with the return type of the signal.");
+ } else {
+ constexpr int FunctorArgumentCount = QtPrivate::ComputeFunctorArgumentCount<std::decay_t<Func2>, typename SignalType::Arguments>::Value;
+ [[maybe_unused]]
+ constexpr int SlotArgumentCount = (FunctorArgumentCount >= 0) ? FunctorArgumentCount : 0;
+ typedef typename QtPrivate::FunctorReturnType<std::decay_t<Func2>, typename QtPrivate::List_Left<typename SignalType::Arguments, SlotArgumentCount>::Value>::Value SlotReturnType;
- //compilation error if the arguments does not match.
- static_assert(int(SignalType::ArgumentCount) >= int(SlotType::ArgumentCount),
- "The slot requires more arguments than the signal provides.");
- static_assert((QtPrivate::CheckCompatibleArguments<typename SignalType::Arguments, typename SlotType::Arguments>::value),
- "Signal and slot arguments are not compatible.");
- static_assert((QtPrivate::AreArgumentsCompatible<typename SlotType::ReturnType, typename SignalType::ReturnType>::value),
- "Return type of the slot is not compatible with the return type of the signal.");
-
- const int *types = nullptr;
- if (type == Qt::QueuedConnection || type == Qt::BlockingQueuedConnection)
- types = QtPrivate::ConnectionTypes<typename SignalType::Arguments>::types();
-
- return connectImpl(sender, reinterpret_cast<void **>(&signal),
- receiver, reinterpret_cast<void **>(&slot),
- new QtPrivate::QSlotObject<Func2, typename QtPrivate::List_Left<typename SignalType::Arguments, SlotType::ArgumentCount>::Value,
- typename SignalType::ReturnType>(slot),
- type, types, &SignalType::Object::staticMetaObject);
- }
-
- //connect to a function pointer (not a member)
- template <typename Func1, typename Func2>
- static inline typename std::enable_if<int(QtPrivate::FunctionPointer<Func2>::ArgumentCount) >= 0, QMetaObject::Connection>::type
- connect(const typename QtPrivate::FunctionPointer<Func1>::Object *sender, Func1 signal, Func2 slot)
- {
- return connect(sender, signal, sender, slot, Qt::DirectConnection);
- }
-
- //connect to a function pointer (not a member)
- template <typename Func1, typename Func2>
- static inline typename std::enable_if<int(QtPrivate::FunctionPointer<Func2>::ArgumentCount) >= 0 &&
- !QtPrivate::FunctionPointer<Func2>::IsPointerToMemberFunction, QMetaObject::Connection>::type
- connect(const typename QtPrivate::FunctionPointer<Func1>::Object *sender, Func1 signal, const QObject *context, Func2 slot,
- Qt::ConnectionType type = Qt::AutoConnection)
- {
- typedef QtPrivate::FunctionPointer<Func1> SignalType;
- typedef QtPrivate::FunctionPointer<Func2> SlotType;
+ static_assert((QtPrivate::AreArgumentsCompatible<SlotReturnType, typename SignalType::ReturnType>::value),
+ "Return type of the slot is not compatible with the return type of the signal.");
+ }
static_assert(QtPrivate::HasQ_OBJECT_Macro<typename SignalType::Object>::Value,
"No Q_OBJECT in the class with the signal");
@@ -282,67 +251,35 @@ public:
//compilation error if the arguments does not match.
static_assert(int(SignalType::ArgumentCount) >= int(SlotType::ArgumentCount),
"The slot requires more arguments than the signal provides.");
- static_assert((QtPrivate::CheckCompatibleArguments<typename SignalType::Arguments, typename SlotType::Arguments>::value),
- "Signal and slot arguments are not compatible.");
- static_assert((QtPrivate::AreArgumentsCompatible<typename SlotType::ReturnType, typename SignalType::ReturnType>::value),
- "Return type of the slot is not compatible with the return type of the signal.");
const int *types = nullptr;
if (type == Qt::QueuedConnection || type == Qt::BlockingQueuedConnection)
types = QtPrivate::ConnectionTypes<typename SignalType::Arguments>::types();
- return connectImpl(sender, reinterpret_cast<void **>(&signal), context, nullptr,
- new QtPrivate::QStaticSlotObject<Func2,
- typename QtPrivate::List_Left<typename SignalType::Arguments, SlotType::ArgumentCount>::Value,
- typename SignalType::ReturnType>(slot),
+ void **pSlot = nullptr;
+ if constexpr (std::is_member_function_pointer_v<std::decay_t<Func2>>) {
+ pSlot = const_cast<void **>(reinterpret_cast<void *const *>(&slot));
+ } else {
+ Q_ASSERT_X((type & Qt::UniqueConnection) == 0, "",
+ "QObject::connect: Unique connection requires the slot to be a pointer to "
+ "a member function of a QObject subclass.");
+ }
+
+ return connectImpl(sender, reinterpret_cast<void **>(&signal), context, pSlot,
+ QtPrivate::makeCallableObject<Func1>(std::forward<Func2>(slot)),
type, types, &SignalType::Object::staticMetaObject);
}
- //connect to a functor
+#ifndef QT_NO_CONTEXTLESS_CONNECT
+ //connect without context
template <typename Func1, typename Func2>
- static inline typename std::enable_if<
- QtPrivate::FunctionPointer<Func2>::ArgumentCount == -1 &&
- !std::is_convertible_v<Func2, const char*>, // don't match old-style connect
- QMetaObject::Connection>::type
- connect(const typename QtPrivate::FunctionPointer<Func1>::Object *sender, Func1 signal, Func2 slot)
+ static inline QMetaObject::Connection
+ connect(const typename QtPrivate::FunctionPointer<Func1>::Object *sender, Func1 signal, Func2 &&slot)
{
- return connect(sender, signal, sender, std::move(slot), Qt::DirectConnection);
- }
-
- //connect to a functor, with a "context" object defining in which event loop is going to be executed
- template <typename Func1, typename Func2>
- static inline typename std::enable_if<
- QtPrivate::FunctionPointer<Func2>::ArgumentCount == -1 &&
- !std::is_convertible_v<Func2, const char*>, // don't match old-style connect
- QMetaObject::Connection>::type
- connect(const typename QtPrivate::FunctionPointer<Func1>::Object *sender, Func1 signal, const QObject *context, Func2 slot,
- Qt::ConnectionType type = Qt::AutoConnection)
- {
- typedef QtPrivate::FunctionPointer<Func1> SignalType;
- const int FunctorArgumentCount = QtPrivate::ComputeFunctorArgumentCount<Func2 , typename SignalType::Arguments>::Value;
-
- static_assert((FunctorArgumentCount >= 0),
- "Signal and slot arguments are not compatible.");
- const int SlotArgumentCount = (FunctorArgumentCount >= 0) ? FunctorArgumentCount : 0;
- typedef typename QtPrivate::FunctorReturnType<Func2, typename QtPrivate::List_Left<typename SignalType::Arguments, SlotArgumentCount>::Value>::Value SlotReturnType;
-
- static_assert((QtPrivate::AreArgumentsCompatible<SlotReturnType, typename SignalType::ReturnType>::value),
- "Return type of the slot is not compatible with the return type of the signal.");
-
- static_assert(QtPrivate::HasQ_OBJECT_Macro<typename SignalType::Object>::Value,
- "No Q_OBJECT in the class with the signal");
-
- const int *types = nullptr;
- if (type == Qt::QueuedConnection || type == Qt::BlockingQueuedConnection)
- types = QtPrivate::ConnectionTypes<typename SignalType::Arguments>::types();
-
- return connectImpl(sender, reinterpret_cast<void **>(&signal), context, nullptr,
- new QtPrivate::QFunctorSlotObject<Func2, SlotArgumentCount,
- typename QtPrivate::List_Left<typename SignalType::Arguments, SlotArgumentCount>::Value,
- typename SignalType::ReturnType>(std::move(slot)),
- type, types, &SignalType::Object::staticMetaObject);
+ return connect(sender, signal, sender, std::forward<Func2>(slot), Qt::DirectConnection);
}
-#endif //Q_CLANG_QDOC
+#endif // QT_NO_CONTEXTLESS_CONNECT
+#endif //Q_QDOC
static bool disconnect(const QObject *sender, const char *signal,
const QObject *receiver, const char *member);
@@ -355,7 +292,7 @@ public:
{ return disconnect(this, nullptr, receiver, member); }
static bool disconnect(const QMetaObject::Connection &);
-#ifdef Q_CLANG_QDOC
+#ifdef Q_QDOC
template<typename PointerToMemberFunction>
static bool disconnect(const QObject *sender, PointerToMemberFunction signal, const QObject *receiver, PointerToMemberFunction method);
#else
@@ -388,18 +325,18 @@ public:
return disconnectImpl(sender, reinterpret_cast<void **>(&signal), receiver, zero,
&SignalType::Object::staticMetaObject);
}
-#endif //Q_CLANG_QDOC
+#endif //Q_QDOC
void dumpObjectTree() const;
void dumpObjectInfo() const;
-#ifndef QT_NO_PROPERTIES
+ QT_CORE_INLINE_SINCE(6, 6)
bool setProperty(const char *name, const QVariant &value);
+ inline bool setProperty(const char *name, QVariant &&value);
QVariant property(const char *name) const;
QList<QByteArray> dynamicPropertyNames() const;
QBindingStorage *bindingStorage() { return &d_ptr->bindingStorage; }
const QBindingStorage *bindingStorage() const { return &d_ptr->bindingStorage; }
-#endif // QT_NO_PROPERTIES
Q_SIGNALS:
void destroyed(QObject * = nullptr);
@@ -447,8 +384,10 @@ protected:
friend class QThreadData;
private:
+ void doSetObjectName(const QString &name);
+ bool doSetProperty(const char *name, const QVariant *lvalue, QVariant *rvalue);
+
Q_DISABLE_COPY(QObject)
- Q_PRIVATE_SLOT(d_func(), void _q_reregisterTimers(void *))
private:
static QMetaObject::Connection connectImpl(const QObject *sender, void **signal,
@@ -465,9 +404,22 @@ inline QMetaObject::Connection QObject::connect(const QObject *asender, const ch
const char *amember, Qt::ConnectionType atype) const
{ return connect(asender, asignal, this, amember, atype); }
+#if QT_CORE_INLINE_IMPL_SINCE(6, 6)
+bool QObject::setProperty(const char *name, const QVariant &value)
+{
+ return doSetProperty(name, &value, nullptr);
+}
+#endif // inline since 6.6
+bool QObject::setProperty(const char *name, QVariant &&value)
+{
+ return doSetProperty(name, &value, &value);
+}
+
template <class T>
inline T qobject_cast(QObject *object)
{
+ static_assert(std::is_pointer_v<T>,
+ "qobject_cast requires to cast towards a pointer type");
typedef typename std::remove_cv<typename std::remove_pointer<T>::type>::type ObjType;
static_assert(QtPrivate::HasQ_OBJECT_Macro<ObjType>::Value,
"qobject_cast requires the type to have a Q_OBJECT macro");
@@ -477,6 +429,10 @@ inline T qobject_cast(QObject *object)
template <class T>
inline T qobject_cast(const QObject *object)
{
+ static_assert(std::is_pointer_v<T>,
+ "qobject_cast requires to cast towards a pointer type");
+ static_assert(std::is_const_v<std::remove_pointer_t<T>>,
+ "qobject_cast cannot cast away constness (use const_cast)");
typedef typename std::remove_cv<typename std::remove_pointer<T>::type>::type ObjType;
static_assert(QtPrivate::HasQ_OBJECT_Macro<ObjType>::Value,
"qobject_cast requires the type to have a Q_OBJECT macro");
@@ -498,7 +454,7 @@ qobject_iid_cast(const QObject *object)
return qobject_iid_cast<std::remove_cv_t<T>>(o);
}
-#if defined(Q_CLANG_QDOC)
+#if defined(Q_QDOC)
# define Q_DECLARE_INTERFACE(IFace, IId)
#elif !defined(Q_MOC_RUN)
# define Q_DECLARE_INTERFACE(IFace, IId) \
@@ -526,15 +482,19 @@ Q_CORE_EXPORT QDebug operator<<(QDebug, const QObject *);
class QSignalBlocker
{
public:
+ Q_NODISCARD_CTOR
inline explicit QSignalBlocker(QObject *o) noexcept;
+ Q_NODISCARD_CTOR
inline explicit QSignalBlocker(QObject &o) noexcept;
inline ~QSignalBlocker();
+ Q_NODISCARD_CTOR
inline QSignalBlocker(QSignalBlocker &&other) noexcept;
inline QSignalBlocker &operator=(QSignalBlocker &&other) noexcept;
inline void reblock() noexcept;
inline void unblock() noexcept;
+ inline void dismiss() noexcept;
private:
Q_DISABLE_COPY(QSignalBlocker)
@@ -599,11 +559,16 @@ void QSignalBlocker::unblock() noexcept
m_inhibited = true;
}
+void QSignalBlocker::dismiss() noexcept
+{
+ m_o = nullptr;
+}
+
namespace QtPrivate {
inline QObject & deref_for_methodcall(QObject &o) { return o; }
inline QObject & deref_for_methodcall(QObject *o) { return *o; }
}
-#define Q_SET_OBJECT_NAME(obj) QT_PREPEND_NAMESPACE(QtPrivate)::deref_for_methodcall(obj).setObjectName(QLatin1String(#obj))
+#define Q_SET_OBJECT_NAME(obj) QT_PREPEND_NAMESPACE(QtPrivate)::deref_for_methodcall(obj).setObjectName(QLatin1StringView(#obj))
QT_END_NAMESPACE
diff --git a/src/corelib/kernel/qobject_impl.h b/src/corelib/kernel/qobject_impl.h
index 0c36417a24..b57d7e50cc 100644
--- a/src/corelib/kernel/qobject_impl.h
+++ b/src/corelib/kernel/qobject_impl.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef Q_QDOC
@@ -73,30 +37,6 @@ namespace QtPrivate {
{ static const int *types() { return nullptr; } };
template <typename... Args> struct ConnectionTypes<List<Args...>, true>
{ static const int *types() { static const int t[sizeof...(Args) + 1] = { (QtPrivate::QMetaTypeIdHelper<Args>::qt_metatype_id())..., 0 }; return t; } };
-
- // implementation of QSlotObjectBase for which the slot is a static function
- // Args and R are the List of arguments and the return type of the signal to which the slot is connected.
- template<typename Func, typename Args, typename R> class QStaticSlotObject : public QSlotObjectBase
- {
- typedef QtPrivate::FunctionPointer<Func> FuncType;
- Func function;
- static void impl(int which, QSlotObjectBase *this_, QObject *r, void **a, bool *ret)
- {
- switch (which) {
- case Destroy:
- delete static_cast<QStaticSlotObject*>(this_);
- break;
- case Call:
- FuncType::template call<Args, R>(static_cast<QStaticSlotObject*>(this_)->function, r, a);
- break;
- case Compare: // not implemented
- case NumOperations:
- Q_UNUSED(ret);
- }
- }
- public:
- explicit QStaticSlotObject(Func f) : QSlotObjectBase(&impl), function(f) {}
- };
}
diff --git a/src/corelib/kernel/qobject_p.h b/src/corelib/kernel/qobject_p.h
index ac77d898da..0ab9bf02ed 100644
--- a/src/corelib/kernel/qobject_p.h
+++ b/src/corelib/kernel/qobject_p.h
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2019 The Qt Company Ltd.
-** Copyright (C) 2013 Olivier Goffart <ogoffart@woboq.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2019 The Qt Company Ltd.
+// Copyright (C) 2013 Olivier Goffart <ogoffart@woboq.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QOBJECT_P_H
#define QOBJECT_P_H
@@ -54,17 +18,27 @@
#include <QtCore/private/qglobal_p.h>
#include "QtCore/qcoreevent.h"
+#include <QtCore/qfunctionaltools_impl.h>
#include "QtCore/qlist.h"
#include "QtCore/qobject.h"
#include "QtCore/qpointer.h"
-#include "QtCore/qreadwritelock.h"
-#include "QtCore/qsharedpointer.h"
#include "QtCore/qvariant.h"
#include "QtCore/qproperty.h"
+#include <QtCore/qshareddata.h>
#include "QtCore/private/qproperty_p.h"
+#include <string>
+
QT_BEGIN_NAMESPACE
+#ifdef Q_MOC_RUN
+#define QT_ANONYMOUS_PROPERTY(text) QT_ANONYMOUS_PROPERTY(text)
+#define QT_ANONYMOUS_PRIVATE_PROPERTY(d, text) QT_ANONYMOUS_PRIVATE_PROPERTY(d, text)
+#elif !defined QT_NO_META_MACROS
+#define QT_ANONYMOUS_PROPERTY(...) QT_ANNOTATE_CLASS(qt_anonymous_property, __VA_ARGS__)
+#define QT_ANONYMOUS_PRIVATE_PROPERTY(d, text) QT_ANNOTATE_CLASS2(qt_anonymous_private_property, d, text)
+#endif
+
class QVariant;
class QThreadData;
class QObjectConnectionListVector;
@@ -117,7 +91,7 @@ public:
QList<QByteArray> propertyNames;
QList<QVariant> propertyValues;
- QList<int> runningTimers;
+ QList<Qt::TimerId> runningTimers;
QList<QPointer<QObject>> eventFilters;
Q_OBJECT_COMPAT_PROPERTY(QObjectPrivate::ExtraData, QString, objectName,
&QObjectPrivate::ExtraData::setObjectNameForwarder,
@@ -125,125 +99,20 @@ public:
QObjectPrivate *parent;
};
+ void ensureExtraData()
+ {
+ if (!extraData)
+ extraData = new ExtraData(this);
+ }
+
typedef void (*StaticMetaCallFunction)(QObject *, QMetaObject::Call, int, void **);
struct Connection;
+ struct ConnectionData;
+ struct ConnectionList;
+ struct ConnectionOrSignalVector;
struct SignalVector;
-
- struct ConnectionOrSignalVector {
- union {
- // linked list of orphaned connections that need cleaning up
- ConnectionOrSignalVector *nextInOrphanList;
- // linked list of connections connected to slots in this object
- Connection *next;
- };
-
- static SignalVector *asSignalVector(ConnectionOrSignalVector *c)
- {
- if (reinterpret_cast<quintptr>(c) & 1)
- return reinterpret_cast<SignalVector *>(reinterpret_cast<quintptr>(c) & ~quintptr(1u));
- return nullptr;
- }
- static Connection *fromSignalVector(SignalVector *v) {
- return reinterpret_cast<Connection *>(reinterpret_cast<quintptr>(v) | quintptr(1u));
- }
- };
-
- struct Connection : public ConnectionOrSignalVector
- {
- // linked list of connections connected to slots in this object, next is in base class
- Connection **prev;
- // linked list of connections connected to signals in this object
- QAtomicPointer<Connection> nextConnectionList;
- Connection *prevConnectionList;
-
- QObject *sender;
- QAtomicPointer<QObject> receiver;
- QAtomicPointer<QThreadData> receiverThreadData;
- union {
- StaticMetaCallFunction callFunction;
- QtPrivate::QSlotObjectBase *slotObj;
- };
- QAtomicPointer<const int> argumentTypes;
- QAtomicInt ref_;
- uint id = 0;
- ushort method_offset;
- ushort method_relative;
- signed int signal_index : 27; // In signal range (see QObjectPrivate::signalIndex())
- ushort connectionType : 2; // 0 == auto, 1 == direct, 2 == queued, 3 == blocking
- ushort isSlotObject : 1;
- ushort ownArgumentTypes : 1;
- ushort isSingleShot : 1;
- Connection() : ref_(2), ownArgumentTypes(true) {
- //ref_ is 2 for the use in the internal lists, and for the use in QMetaObject::Connection
- }
- ~Connection();
- int method() const { Q_ASSERT(!isSlotObject); return method_offset + method_relative; }
- void ref() { ref_.ref(); }
- void freeSlotObject()
- {
- if (isSlotObject) {
- slotObj->destroyIfLastRef();
- isSlotObject = false;
- }
- }
- void deref()
- {
- if (!ref_.deref()) {
- Q_ASSERT(!receiver.loadRelaxed());
- Q_ASSERT(!isSlotObject);
- delete this;
- }
- }
- };
- // ConnectionList is a singly-linked list
- struct ConnectionList {
- QAtomicPointer<Connection> first;
- QAtomicPointer<Connection> last;
- };
-
- struct Sender
- {
- Sender(QObject *receiver, QObject *sender, int signal)
- : receiver(receiver), sender(sender), signal(signal)
- {
- if (receiver) {
- ConnectionData *cd = receiver->d_func()->connections.loadRelaxed();
- previous = cd->currentSender;
- cd->currentSender = this;
- }
- }
- ~Sender()
- {
- if (receiver)
- receiver->d_func()->connections.loadRelaxed()->currentSender = previous;
- }
- void receiverDeleted()
- {
- Sender *s = this;
- while (s) {
- s->receiver = nullptr;
- s = s->previous;
- }
- }
- Sender *previous;
- QObject *receiver;
- QObject *sender;
- int signal;
- };
-
- struct SignalVector : public ConnectionOrSignalVector {
- quintptr allocated;
- // ConnectionList signals[]
- ConnectionList &at(int i)
- {
- return reinterpret_cast<ConnectionList *>(this + 1)[i + 1];
- }
- const ConnectionList &at(int i) const
- {
- return reinterpret_cast<const ConnectionList *>(this + 1)[i + 1];
- }
- int count() const { return static_cast<int>(allocated); }
- };
+ struct Sender;
+ struct TaggedSignalVector;
/*
This contains the all connections from and to an object.
@@ -259,86 +128,6 @@ public:
to a slot in this object. The mutex of the receiver must be locked when touching the pointers of this
linked list.
*/
- struct ConnectionData {
- // the id below is used to avoid activating new connections. When the object gets
- // deleted it's set to 0, so that signal emission stops
- QAtomicInteger<uint> currentConnectionId;
- QAtomicInt ref;
- QAtomicPointer<SignalVector> signalVector;
- Connection *senders = nullptr;
- Sender *currentSender = nullptr; // object currently activating the object
- QAtomicPointer<Connection> orphaned;
-
- ~ConnectionData()
- {
- Q_ASSERT(ref.loadRelaxed() == 0);
- auto *c = orphaned.fetchAndStoreRelaxed(nullptr);
- if (c)
- deleteOrphaned(c);
- SignalVector *v = signalVector.loadRelaxed();
- if (v)
- free(v);
- }
-
- // must be called on the senders connection data
- // assumes the senders and receivers lock are held
- void removeConnection(Connection *c);
- enum LockPolicy {
- NeedToLock,
- // Beware that we need to temporarily release the lock
- // and thus calling code must carefully consider whether
- // invariants still hold.
- AlreadyLockedAndTemporarilyReleasingLock
- };
- void cleanOrphanedConnections(QObject *sender, LockPolicy lockPolicy = NeedToLock)
- {
- if (orphaned.loadRelaxed() && ref.loadAcquire() == 1)
- cleanOrphanedConnectionsImpl(sender, lockPolicy);
- }
- void cleanOrphanedConnectionsImpl(QObject *sender, LockPolicy lockPolicy);
-
- ConnectionList &connectionsForSignal(int signal)
- {
- return signalVector.loadRelaxed()->at(signal);
- }
-
- void resizeSignalVector(uint size)
- {
- SignalVector *vector = this->signalVector.loadRelaxed();
- if (vector && vector->allocated > size)
- return;
- size = (size + 7) & ~7;
- SignalVector *newVector = reinterpret_cast<SignalVector *>(malloc(sizeof(SignalVector) + (size + 1) * sizeof(ConnectionList)));
- int start = -1;
- if (vector) {
- memcpy(newVector, vector, sizeof(SignalVector) + (vector->allocated + 1) * sizeof(ConnectionList));
- start = vector->count();
- }
- for (int i = start; i < int(size); ++i)
- newVector->at(i) = ConnectionList();
- newVector->next = nullptr;
- newVector->allocated = size;
-
- signalVector.storeRelaxed(newVector);
- if (vector) {
- Connection *o = nullptr;
- /* No ABA issue here: When adding a node, we only care about the list head, it doesn't
- * matter if the tail changes.
- */
- do {
- o = orphaned.loadRelaxed();
- vector->nextInOrphanList = o;
- } while (!orphaned.testAndSetRelease(o, ConnectionOrSignalVector::fromSignalVector(vector)));
-
- }
- }
- int signalVectorCount() const
- {
- return signalVector.loadAcquire() ? signalVector.loadRelaxed()->count() : -1;
- }
-
- static void deleteOrphaned(ConnectionOrSignalVector *c);
- };
QObjectPrivate(int version = QObjectPrivateVersion);
virtual ~QObjectPrivate();
@@ -350,14 +139,13 @@ public:
void setParent_helper(QObject *);
void moveToThread_helper();
- void setThreadData_helper(QThreadData *currentData, QThreadData *targetData);
- void _q_reregisterTimers(void *pointer);
+ void setThreadData_helper(QThreadData *currentData, QThreadData *targetData, QBindingStatus *status);
- bool isSender(const QObject *receiver, const char *signal) const;
QObjectList receiverList(const char *signal) const;
- QObjectList senderList() const;
- void addConnection(int signal, Connection *c);
+ inline void ensureConnectionData();
+ inline void addConnection(int signal, Connection *c);
+ static inline bool removeConnection(Connection *c);
static QObjectPrivate *get(QObject *o) { return o->d_func(); }
static const QObjectPrivate *get(const QObject *o) { return o->d_func(); }
@@ -372,6 +160,8 @@ public:
inline void connectNotify(const QMetaMethod &signal);
inline void disconnectNotify(const QMetaMethod &signal);
+ void reinitBindingStorageAfterThreadMove();
+
template <typename Func1, typename Func2>
static inline QMetaObject::Connection connect(const typename QtPrivate::FunctionPointer<Func1>::Object *sender, Func1 signal,
const typename QtPrivate::FunctionPointer<Func2>::Object *receiverPrivate, Func2 slot,
@@ -393,16 +183,15 @@ public:
static bool disconnect(const QObject *sender, int signal_index, void **slot);
static bool disconnect(const QObject *sender, int signal_index, const QObject *receiver,
void **slot);
- static bool disconnect(Connection *c);
- void ensureConnectionData()
- {
- if (connections.loadRelaxed())
- return;
- ConnectionData *cd = new ConnectionData;
- cd->ref.ref();
- connections.storeRelaxed(cd);
- }
+ virtual std::string flagsForDumping() const;
+
+#ifndef QT_NO_DEBUG_STREAM
+ virtual void writeToDebugStream(QDebug &) const;
+#endif
+
+ QtPrivate::QPropertyAdaptorSlotObject *
+ getPropertyAdaptorSlotObject(const QMetaProperty &property);
public:
mutable ExtraData *extraData; // extra data set by the user
@@ -426,8 +215,6 @@ public:
QAtomicPointer<QtSharedPointer::ExternalRefCountData> sharedRefcount;
};
-Q_DECLARE_TYPEINFO(QObjectPrivate::ConnectionList, Q_RELOCATABLE_TYPE);
-
/*
Catch mixing of incompatible library versions.
@@ -452,7 +239,7 @@ inline void QObjectPrivate::checkForIncompatibleLibraryVersion(int version) cons
inline bool QObjectPrivate::isDeclarativeSignalConnected(uint signal_index) const
{
- return declarativeData && QAbstractDeclarativeData::isSignalConnected
+ return !isDeletingChildren && declarativeData && QAbstractDeclarativeData::isSignalConnected
&& QAbstractDeclarativeData::isSignalConnected(declarativeData, q_func(), signal_index);
}
@@ -467,30 +254,10 @@ inline void QObjectPrivate::disconnectNotify(const QMetaMethod &signal)
}
namespace QtPrivate {
+inline const QObject *getQObject(const QObjectPrivate *d) { return d->q_func(); }
template <typename Func>
-struct FunctionStorageByValue
-{
- Func f;
- Func &func() noexcept { return f; }
-};
-
-template <typename Func>
-struct FunctionStorageEmptyBaseClassOptimization : Func
-{
- Func &func() noexcept { return *this; }
- using Func::Func;
-};
-
-template <typename Func>
-using FunctionStorage = typename std::conditional_t<
- std::conjunction_v<
- std::is_empty<Func>,
- std::negation<std::is_final<Func>>
- >,
- FunctionStorageEmptyBaseClassOptimization<Func>,
- FunctionStorageByValue<Func>
- >;
+using FunctionStorage = QtPrivate::CompactStorage<Func>;
template <typename ObjPrivate> inline void assertObjectType(QObjectPrivate *d)
{
@@ -502,18 +269,23 @@ template<typename Func, typename Args, typename R>
class QPrivateSlotObject : public QSlotObjectBase, private FunctionStorage<Func>
{
typedef QtPrivate::FunctionPointer<Func> FuncType;
+#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0)
static void impl(int which, QSlotObjectBase *this_, QObject *r, void **a, bool *ret)
+#else
+ static void impl(QSlotObjectBase *this_, QObject *r, void **a, int which, bool *ret)
+#endif
{
+ const auto that = static_cast<QPrivateSlotObject*>(this_);
switch (which) {
case Destroy:
- delete static_cast<QPrivateSlotObject*>(this_);
+ delete that;
break;
case Call:
- FuncType::template call<Args, R>(static_cast<QPrivateSlotObject*>(this_)->func(),
+ FuncType::template call<Args, R>(that->object(),
static_cast<typename FuncType::Object *>(QObjectPrivate::get(r)), a);
break;
case Compare:
- *ret = *reinterpret_cast<Func *>(a) == static_cast<QPrivateSlotObject*>(this_)->func();
+ *ret = *reinterpret_cast<Func *>(a) == that->object();
break;
case NumOperations: ;
}
@@ -546,7 +318,7 @@ inline QMetaObject::Connection QObjectPrivate::connect(const typename QtPrivate:
types = QtPrivate::ConnectionTypes<typename SignalType::Arguments>::types();
return QObject::connectImpl(sender, reinterpret_cast<void **>(&signal),
- receiverPrivate->q_ptr, reinterpret_cast<void **>(&slot),
+ QtPrivate::getQObject(receiverPrivate), reinterpret_cast<void **>(&slot),
new QtPrivate::QPrivateSlotObject<Func2, typename QtPrivate::List_Left<typename SignalType::Arguments, SlotType::ArgumentCount>::Value,
typename SignalType::ReturnType>(slot),
type, types, &SignalType::Object::staticMetaObject);
@@ -568,9 +340,6 @@ bool QObjectPrivate::disconnect(const typename QtPrivate::FunctionPointer< Func1
&SignalType::Object::staticMetaObject);
}
-Q_DECLARE_TYPEINFO(QObjectPrivate::Connection, Q_RELOCATABLE_TYPE);
-Q_DECLARE_TYPEINFO(QObjectPrivate::Sender, Q_RELOCATABLE_TYPE);
-
class QSemaphore;
class Q_CORE_EXPORT QAbstractMetaCallEvent : public QEvent
{
@@ -607,6 +376,9 @@ public:
QMetaCallEvent(QtPrivate::QSlotObjectBase *slotObj,
const QObject *sender, int signalId,
void **args, QSemaphore *semaphore);
+ QMetaCallEvent(QtPrivate::SlotObjUniquePtr slotObj,
+ const QObject *sender, int signalId,
+ void **args, QSemaphore *semaphore);
// queued - args allocated by event, copied by caller
QMetaCallEvent(ushort method_offset, ushort method_relative,
@@ -616,9 +388,31 @@ public:
QMetaCallEvent(QtPrivate::QSlotObjectBase *slotObj,
const QObject *sender, int signalId,
int nargs);
+ QMetaCallEvent(QtPrivate::SlotObjUniquePtr slotObj,
+ const QObject *sender, int signalId,
+ int nargs);
~QMetaCallEvent() override;
+ template<typename ...Args>
+ static QMetaCallEvent *create(QtPrivate::QSlotObjectBase *slotObj, const QObject *sender,
+ int signal_index, const Args &...argv)
+ {
+ const void* const argp[] = { nullptr, std::addressof(argv)... };
+ const QMetaType metaTypes[] = { QMetaType::fromType<void>(), QMetaType::fromType<Args>()... };
+ constexpr auto argc = sizeof...(Args) + 1;
+ return create_impl(slotObj, sender, signal_index, argc, argp, metaTypes);
+ }
+ template<typename ...Args>
+ static QMetaCallEvent *create(QtPrivate::SlotObjUniquePtr slotObj, const QObject *sender,
+ int signal_index, const Args &...argv)
+ {
+ const void* const argp[] = { nullptr, std::addressof(argv)... };
+ const QMetaType metaTypes[] = { QMetaType::fromType<void>(), QMetaType::fromType<Args>()... };
+ constexpr auto argc = sizeof...(Args) + 1;
+ return create_impl(std::move(slotObj), sender, signal_index, argc, argp, metaTypes);
+ }
+
inline int id() const { return d.method_offset_ + d.method_relative_; }
inline const void * const* args() const { return d.args_; }
inline void ** args() { return d.args_; }
@@ -628,10 +422,22 @@ public:
virtual void placeMetaCall(QObject *object) override;
private:
+ static QMetaCallEvent *create_impl(QtPrivate::QSlotObjectBase *slotObj, const QObject *sender,
+ int signal_index, size_t argc, const void * const argp[],
+ const QMetaType metaTypes[])
+ {
+ if (slotObj)
+ slotObj->ref();
+ return create_impl(QtPrivate::SlotObjUniquePtr{slotObj}, sender,
+ signal_index, argc, argp, metaTypes);
+ }
+ static QMetaCallEvent *create_impl(QtPrivate::SlotObjUniquePtr slotObj, const QObject *sender,
+ int signal_index, size_t argc, const void * const argp[],
+ const QMetaType metaTypes[]);
inline void allocArgs();
struct Data {
- QtPrivate::QSlotObjectBase *slotObj_;
+ QtPrivate::SlotObjUniquePtr slotObj_;
void **args_;
QObjectPrivate::StaticMetaCallFunction callFunction_;
int nargs_;
@@ -646,7 +452,9 @@ class QBoolBlocker
{
Q_DISABLE_COPY_MOVE(QBoolBlocker)
public:
- explicit inline QBoolBlocker(bool &b, bool value = true) : block(b), reset(b) { block = value; }
+ Q_NODISCARD_CTOR explicit QBoolBlocker(bool &b, bool value = true)
+ : block(b), reset(b)
+ { block = value; }
inline ~QBoolBlocker() { block = reset; }
private:
@@ -654,8 +462,6 @@ private:
bool reset;
};
-void Q_CORE_EXPORT qDeleteInEventHandler(QObject *o);
-
struct QAbstractDynamicMetaObject;
struct Q_CORE_EXPORT QDynamicMetaObjectData
{
diff --git a/src/corelib/kernel/qobject_p_p.h b/src/corelib/kernel/qobject_p_p.h
new file mode 100644
index 0000000000..2277af0497
--- /dev/null
+++ b/src/corelib/kernel/qobject_p_p.h
@@ -0,0 +1,257 @@
+// Copyright (C) 2019 The Qt Company Ltd.
+// Copyright (C) 2013 Olivier Goffart <ogoffart@woboq.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QOBJECT_P_P_H
+#define QOBJECT_P_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists for the convenience
+// of qobject.cpp. This header file may change from version to version
+// without notice, or even be removed.
+//
+// We mean it.
+//
+
+// Even though this file is only used by qobject.cpp, the only reason this
+// code lives here is that some special apps/libraries for e.g., QtJambi,
+// Gammaray need access to the structs in this file.
+
+#include <QtCore/qobject.h>
+#include <QtCore/private/qobject_p.h>
+
+QT_BEGIN_NAMESPACE
+
+// ConnectionList is a singly-linked list
+struct QObjectPrivate::ConnectionList
+{
+ QAtomicPointer<Connection> first;
+ QAtomicPointer<Connection> last;
+};
+static_assert(std::is_trivially_destructible_v<QObjectPrivate::ConnectionList>);
+Q_DECLARE_TYPEINFO(QObjectPrivate::ConnectionList, Q_RELOCATABLE_TYPE);
+
+struct QObjectPrivate::TaggedSignalVector
+{
+ quintptr c;
+
+ TaggedSignalVector() = default;
+ TaggedSignalVector(std::nullptr_t) noexcept : c(0) {}
+ TaggedSignalVector(Connection *v) noexcept : c(reinterpret_cast<quintptr>(v)) { Q_ASSERT(v && (reinterpret_cast<quintptr>(v) & 0x1) == 0); }
+ TaggedSignalVector(SignalVector *v) noexcept : c(reinterpret_cast<quintptr>(v) | quintptr(1u)) { Q_ASSERT(v); }
+ explicit operator SignalVector *() const noexcept
+ {
+ if (c & 0x1)
+ return reinterpret_cast<SignalVector *>(c & ~quintptr(1u));
+ return nullptr;
+ }
+ explicit operator Connection *() const noexcept
+ {
+ return reinterpret_cast<Connection *>(c);
+ }
+ operator uintptr_t() const noexcept { return c; }
+};
+
+struct QObjectPrivate::ConnectionOrSignalVector
+{
+ union {
+ // linked list of orphaned connections that need cleaning up
+ TaggedSignalVector nextInOrphanList;
+ // linked list of connections connected to slots in this object
+ Connection *next;
+ };
+};
+static_assert(std::is_trivial_v<QObjectPrivate::ConnectionOrSignalVector>);
+
+struct QObjectPrivate::Connection : public ConnectionOrSignalVector
+{
+ // linked list of connections connected to slots in this object, next is in base class
+ Connection **prev;
+ // linked list of connections connected to signals in this object
+ QAtomicPointer<Connection> nextConnectionList;
+ Connection *prevConnectionList;
+
+ QObject *sender;
+ QAtomicPointer<QObject> receiver;
+ QAtomicPointer<QThreadData> receiverThreadData;
+ union {
+ StaticMetaCallFunction callFunction;
+ QtPrivate::QSlotObjectBase *slotObj;
+ };
+ QAtomicPointer<const int> argumentTypes;
+ QAtomicInt ref_{
+ 2
+ }; // ref_ is 2 for the use in the internal lists, and for the use in QMetaObject::Connection
+ uint id = 0;
+ ushort method_offset;
+ ushort method_relative;
+ signed int signal_index : 27; // In signal range (see QObjectPrivate::signalIndex())
+ ushort connectionType : 2; // 0 == auto, 1 == direct, 2 == queued, 3 == blocking
+ ushort isSlotObject : 1;
+ ushort ownArgumentTypes : 1;
+ ushort isSingleShot : 1;
+ Connection() : ownArgumentTypes(true) { }
+ ~Connection();
+ int method() const
+ {
+ Q_ASSERT(!isSlotObject);
+ return method_offset + method_relative;
+ }
+ void ref() { ref_.ref(); }
+ void freeSlotObject()
+ {
+ if (isSlotObject) {
+ slotObj->destroyIfLastRef();
+ isSlotObject = false;
+ }
+ }
+ void deref()
+ {
+ if (!ref_.deref()) {
+ Q_ASSERT(!receiver.loadRelaxed());
+ Q_ASSERT(!isSlotObject);
+ delete this;
+ }
+ }
+};
+Q_DECLARE_TYPEINFO(QObjectPrivate::Connection, Q_RELOCATABLE_TYPE);
+
+struct QObjectPrivate::SignalVector : public ConnectionOrSignalVector
+{
+ quintptr allocated;
+ // ConnectionList signals[]
+ ConnectionList &at(int i) { return reinterpret_cast<ConnectionList *>(this + 1)[i + 1]; }
+ const ConnectionList &at(int i) const
+ {
+ return reinterpret_cast<const ConnectionList *>(this + 1)[i + 1];
+ }
+ int count() const { return static_cast<int>(allocated); }
+};
+static_assert(
+ std::is_trivial_v<QObjectPrivate::SignalVector>); // it doesn't need to be, but it helps
+
+struct QObjectPrivate::ConnectionData
+{
+ // the id below is used to avoid activating new connections. When the object gets
+ // deleted it's set to 0, so that signal emission stops
+ QAtomicInteger<uint> currentConnectionId;
+ QAtomicInt ref;
+ QAtomicPointer<SignalVector> signalVector;
+ Connection *senders = nullptr;
+ Sender *currentSender = nullptr; // object currently activating the object
+ std::atomic<TaggedSignalVector> orphaned = {};
+
+ ~ConnectionData()
+ {
+ Q_ASSERT(ref.loadRelaxed() == 0);
+ TaggedSignalVector c = orphaned.exchange(nullptr, std::memory_order_relaxed);
+ if (c)
+ deleteOrphaned(c);
+ SignalVector *v = signalVector.loadRelaxed();
+ if (v) {
+ v->~SignalVector();
+ free(v);
+ }
+ }
+
+ // must be called on the senders connection data
+ // assumes the senders and receivers lock are held
+ void removeConnection(Connection *c);
+ enum LockPolicy {
+ NeedToLock,
+ // Beware that we need to temporarily release the lock
+ // and thus calling code must carefully consider whether
+ // invariants still hold.
+ AlreadyLockedAndTemporarilyReleasingLock
+ };
+ void cleanOrphanedConnections(QObject *sender, LockPolicy lockPolicy = NeedToLock)
+ {
+ if (orphaned.load(std::memory_order_relaxed) && ref.loadAcquire() == 1)
+ cleanOrphanedConnectionsImpl(sender, lockPolicy);
+ }
+ void cleanOrphanedConnectionsImpl(QObject *sender, LockPolicy lockPolicy);
+
+ ConnectionList &connectionsForSignal(int signal)
+ {
+ return signalVector.loadRelaxed()->at(signal);
+ }
+
+ void resizeSignalVector(uint size)
+ {
+ SignalVector *vector = this->signalVector.loadRelaxed();
+ if (vector && vector->allocated > size)
+ return;
+ size = (size + 7) & ~7;
+ void *ptr = malloc(sizeof(SignalVector) + (size + 1) * sizeof(ConnectionList));
+ auto newVector = new (ptr) SignalVector;
+
+ int start = -1;
+ if (vector) {
+ // not (yet) existing trait:
+ // static_assert(std::is_relocatable_v<SignalVector>);
+ // static_assert(std::is_relocatable_v<ConnectionList>);
+ memcpy(newVector, vector,
+ sizeof(SignalVector) + (vector->allocated + 1) * sizeof(ConnectionList));
+ start = vector->count();
+ }
+ for (int i = start; i < int(size); ++i)
+ new (&newVector->at(i)) ConnectionList();
+ newVector->next = nullptr;
+ newVector->allocated = size;
+
+ signalVector.storeRelaxed(newVector);
+ if (vector) {
+ TaggedSignalVector o = nullptr;
+ /* No ABA issue here: When adding a node, we only care about the list head, it doesn't
+ * matter if the tail changes.
+ */
+ o = orphaned.load(std::memory_order_acquire);
+ do {
+ vector->nextInOrphanList = o;
+ } while (!orphaned.compare_exchange_strong(o, TaggedSignalVector(vector), std::memory_order_release));
+ }
+ }
+ int signalVectorCount() const
+ {
+ return signalVector.loadAcquire() ? signalVector.loadRelaxed()->count() : -1;
+ }
+
+ static void deleteOrphaned(TaggedSignalVector o);
+};
+
+struct QObjectPrivate::Sender
+{
+ Sender(QObject *receiver, QObject *sender, int signal, ConnectionData *receiverConnections)
+ : receiver(receiver), sender(sender), signal(signal)
+ {
+ if (receiverConnections) {
+ previous = receiverConnections->currentSender;
+ receiverConnections->currentSender = this;
+ }
+ }
+ ~Sender()
+ {
+ if (receiver)
+ receiver->d_func()->connections.loadAcquire()->currentSender = previous;
+ }
+ void receiverDeleted()
+ {
+ Sender *s = this;
+ while (s) {
+ s->receiver = nullptr;
+ s = s->previous;
+ }
+ }
+ Sender *previous = nullptr;
+ QObject *receiver;
+ QObject *sender;
+ int signal;
+};
+Q_DECLARE_TYPEINFO(QObjectPrivate::Sender, Q_RELOCATABLE_TYPE);
+
+QT_END_NAMESPACE
+
+#endif
diff --git a/src/corelib/kernel/qobjectcleanuphandler.cpp b/src/corelib/kernel/qobjectcleanuphandler.cpp
index 831874424f..f46afc2f07 100644
--- a/src/corelib/kernel/qobjectcleanuphandler.cpp
+++ b/src/corelib/kernel/qobjectcleanuphandler.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qobjectcleanuphandler.h"
@@ -96,7 +60,7 @@ QObject *QObjectCleanupHandler::add(QObject *object)
if (!object)
return nullptr;
- connect(object, SIGNAL(destroyed(QObject *)), this, SLOT(objectDestroyed(QObject *)));
+ connect(object, SIGNAL(destroyed(QObject*)), this, SLOT(objectDestroyed(QObject*)));
cleanupObjects.insert(0, object);
return object;
}
@@ -112,7 +76,7 @@ void QObjectCleanupHandler::remove(QObject *object)
int index;
if ((index = cleanupObjects.indexOf(object)) != -1) {
cleanupObjects.removeAt(index);
- disconnect(object, SIGNAL(destroyed(QObject *)), this, SLOT(objectDestroyed(QObject *)));
+ disconnect(object, SIGNAL(destroyed(QObject*)), this, SLOT(objectDestroyed(QObject*)));
}
}
diff --git a/src/corelib/kernel/qobjectcleanuphandler.h b/src/corelib/kernel/qobjectcleanuphandler.h
index add9cf4ec5..b01ed94d47 100644
--- a/src/corelib/kernel/qobjectcleanuphandler.h
+++ b/src/corelib/kernel/qobjectcleanuphandler.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QOBJECTCLEANUPHANDLER_H
#define QOBJECTCLEANUPHANDLER_H
diff --git a/src/corelib/kernel/qobjectdefs.h b/src/corelib/kernel/qobjectdefs.h
index 00a6b62eab..190901d5d1 100644
--- a/src/corelib/kernel/qobjectdefs.h
+++ b/src/corelib/kernel/qobjectdefs.h
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Copyright (C) 2019 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2022 The Qt Company Ltd.
+// Copyright (C) 2019 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QOBJECTDEFS_H
#define QOBJECTDEFS_H
@@ -47,6 +11,7 @@
#include <QtCore/qnamespace.h>
#include <QtCore/qobjectdefs_impl.h>
+#include <QtCore/qtcoreexports.h>
#include <QtCore/qtmetamacros.h>
QT_BEGIN_NAMESPACE
@@ -72,28 +37,31 @@ class QString;
Q_CORE_EXPORT const char *qFlagLocation(const char *method);
#ifndef QT_NO_META_MACROS
-#ifndef QT_NO_DEBUG
-# define QLOCATION "\0" __FILE__ ":" QT_STRINGIFY(__LINE__)
-# ifndef QT_NO_KEYWORDS
-# define METHOD(a) qFlagLocation("0"#a QLOCATION)
+# define QMETHOD_CODE 0 // member type codes
+# define QSLOT_CODE 1
+# define QSIGNAL_CODE 2
+# define QT_PREFIX_CODE(code, a) QT_STRINGIFY(code) #a
+# define QT_STRINGIFY_METHOD(a) QT_PREFIX_CODE(QMETHOD_CODE, a)
+# define QT_STRINGIFY_SLOT(a) QT_PREFIX_CODE(QSLOT_CODE, a)
+# define QT_STRINGIFY_SIGNAL(a) QT_PREFIX_CODE(QSIGNAL_CODE, a)
+# ifndef QT_NO_DEBUG
+# define QLOCATION "\0" __FILE__ ":" QT_STRINGIFY(__LINE__)
+# ifndef QT_NO_KEYWORDS
+# define METHOD(a) qFlagLocation(QT_STRINGIFY_METHOD(a) QLOCATION)
+# endif
+# define SLOT(a) qFlagLocation(QT_STRINGIFY_SLOT(a) QLOCATION)
+# define SIGNAL(a) qFlagLocation(QT_STRINGIFY_SIGNAL(a) QLOCATION)
+# else
+# ifndef QT_NO_KEYWORDS
+# define METHOD(a) QT_STRINGIFY_METHOD(a)
+# endif
+# define SLOT(a) QT_STRINGIFY_SLOT(a)
+# define SIGNAL(a) QT_STRINGIFY_SIGNAL(a)
# endif
-# define SLOT(a) qFlagLocation("1"#a QLOCATION)
-# define SIGNAL(a) qFlagLocation("2"#a QLOCATION)
-#else
-# ifndef QT_NO_KEYWORDS
-# define METHOD(a) "0"#a
-# endif
-# define SLOT(a) "1"#a
-# define SIGNAL(a) "2"#a
-#endif
-
-#define QMETHOD_CODE 0 // member type codes
-#define QSLOT_CODE 1
-#define QSIGNAL_CODE 2
#endif // QT_NO_META_MACROS
-#define Q_ARG(type, data) QArgument<type >(#type, data)
-#define Q_RETURN_ARG(type, data) QReturnArgument<type >(#type, data)
+#define Q_ARG(Type, data) QtPrivate::Invoke::argument<Type>(QT_STRINGIFY(Type), data)
+#define Q_RETURN_ARG(Type, data) QtPrivate::Invoke::returnArgument<Type>(QT_STRINGIFY(Type), data)
class QObject;
class QMetaMethod;
@@ -103,6 +71,7 @@ class QMetaClassInfo;
namespace QtPrivate {
class QMetaTypeInterface;
+template<typename T> constexpr const QMetaTypeInterface *qMetaTypeInterfaceForType();
}
struct QMethodRawArguments
@@ -110,6 +79,7 @@ struct QMethodRawArguments
void **arguments;
};
+#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0)
class Q_CORE_EXPORT QGenericArgument
{
public:
@@ -157,6 +127,108 @@ public:
: QGenericReturnArgument(aName, static_cast<void *>(&aData))
{}
};
+#endif
+
+struct QMetaMethodArgument
+{
+ const QtPrivate::QMetaTypeInterface *metaType;
+ const char *name;
+ const void *data;
+};
+
+struct QMetaMethodReturnArgument
+{
+ const QtPrivate::QMetaTypeInterface *metaType;
+ const char *name;
+ void *data;
+};
+
+template <typename T>
+struct QTemplatedMetaMethodReturnArgument : QMetaMethodReturnArgument
+{
+ using Type = T;
+};
+
+namespace QtPrivate {
+namespace Invoke {
+#if QT_VERSION <= QT_VERSION_CHECK(7, 0, 0)
+template <typename... Args>
+using AreOldStyleArgs = std::disjunction<std::is_base_of<QGenericArgument, Args>...>;
+
+template <typename T, typename... Args> using IfNotOldStyleArgs =
+ std::enable_if_t<!AreOldStyleArgs<Args...>::value, T>;
+#else
+template <typename T, typename... Args> using IfNotOldStyleArgs = T;
+#endif
+
+template <typename T> inline QMetaMethodArgument argument(const char *name, const T &t)
+{
+ if constexpr ((std::is_lvalue_reference_v<T> && std::is_const_v<std::remove_reference_t<T>>) ||
+ !std::is_reference_v<T>) {
+ return { qMetaTypeInterfaceForType<T>(), name, std::addressof(t) };
+ } else {
+ return { nullptr, name, std::addressof(t) };
+ }
+}
+
+template <typename T>
+inline QTemplatedMetaMethodReturnArgument<T> returnArgument(const char *name, T &t)
+{
+ return { qMetaTypeInterfaceForType<T>(), name, std::addressof(t) };
+}
+
+template <typename T> inline const char *typenameHelper(const T &)
+{
+ return nullptr;
+}
+template <typename T> inline const void *dataHelper(const T &t)
+{
+ return std::addressof(t);
+}
+template <typename T> inline const QMetaTypeInterface *metaTypeHelper(const T &)
+{
+ return qMetaTypeInterfaceForType<T>();
+}
+
+inline const char *typenameHelper(QMetaMethodArgument a)
+{ return a.name; }
+inline const void *dataHelper(QMetaMethodArgument a)
+{ return a.data; }
+inline const QMetaTypeInterface *metaTypeHelper(QMetaMethodArgument a)
+{ return a.metaType; }
+
+inline const char *typenameHelper(const char *) = delete;
+template <typename T> inline const void *dataHelper(const char *) = delete;
+inline const QMetaTypeInterface *metaTypeHelper(const char *) = delete;
+inline const char *typenameHelper(const char16_t *) = delete;
+template <typename T> inline const void *dataHelper(const char16_t *) = delete;
+inline const QMetaTypeInterface *metaTypeHelper(const char16_t *) = delete;
+
+} // namespace QtPrivate::Invoke
+
+template <typename... Args> inline auto invokeMethodHelper(QMetaMethodReturnArgument r, const Args &... arguments)
+{
+ std::array params = { const_cast<const void *>(r.data), Invoke::dataHelper(arguments)... };
+ std::array names = { r.name, Invoke::typenameHelper(arguments)... };
+ std::array types = { r.metaType, Invoke::metaTypeHelper(arguments)... };
+ static_assert(params.size() == types.size());
+ static_assert(params.size() == names.size());
+
+ struct R {
+ decltype(params) parameters;
+ decltype(names) typeNames;
+ decltype(types) metaTypes;
+ constexpr qsizetype parameterCount() const { return qsizetype(parameters.size()); }
+ };
+ return R { params, names, types };
+}
+} // namespace QtPrivate
+
+template <typename T> void qReturnArg(const T &&) = delete;
+template <typename T> inline QTemplatedMetaMethodReturnArgument<T> qReturnArg(T &data)
+{
+ return QtPrivate::Invoke::returnArgument(nullptr, data);
+}
struct Q_CORE_EXPORT QMetaObject
{
@@ -169,7 +241,7 @@ struct Q_CORE_EXPORT QMetaObject
{ return const_cast<QObject *>(cast(const_cast<const QObject *>(obj))); }
const QObject *cast(const QObject *obj) const;
-#if !defined(QT_NO_TRANSLATION) || defined(Q_CLANG_QDOC)
+#if !defined(QT_NO_TRANSLATION) || defined(Q_QDOC)
QString tr(const char *s, const char *c, int n = -1) const;
#endif // QT_NO_TRANSLATION
@@ -191,6 +263,7 @@ struct Q_CORE_EXPORT QMetaObject
int indexOfSignal(const char *signal) const;
int indexOfSlot(const char *slot) const;
int indexOfEnumerator(const char *name) const;
+
int indexOfProperty(const char *name) const;
int indexOfClassInfo(const char *name) const;
@@ -224,6 +297,7 @@ struct Q_CORE_EXPORT QMetaObject
static void activate(QObject *sender, const QMetaObject *, int local_signal_index, void **argv);
static void activate(QObject *sender, int signal_offset, int local_signal_index, void **argv);
+#if QT_VERSION <= QT_VERSION_CHECK(7, 0, 0)
static bool invokeMethod(QObject *obj, const char *member,
Qt::ConnectionType,
QGenericReturnArgument ret,
@@ -257,7 +331,7 @@ struct Q_CORE_EXPORT QMetaObject
static inline bool invokeMethod(QObject *obj, const char *member,
Qt::ConnectionType type,
- QGenericArgument val0 = QGenericArgument(nullptr),
+ QGenericArgument val0,
QGenericArgument val1 = QGenericArgument(),
QGenericArgument val2 = QGenericArgument(),
QGenericArgument val3 = QGenericArgument(),
@@ -273,7 +347,7 @@ struct Q_CORE_EXPORT QMetaObject
}
static inline bool invokeMethod(QObject *obj, const char *member,
- QGenericArgument val0 = QGenericArgument(nullptr),
+ QGenericArgument val0,
QGenericArgument val1 = QGenericArgument(),
QGenericArgument val2 = QGenericArgument(),
QGenericArgument val3 = QGenericArgument(),
@@ -287,89 +361,162 @@ struct Q_CORE_EXPORT QMetaObject
return invokeMethod(obj, member, Qt::AutoConnection, QGenericReturnArgument(), val0,
val1, val2, val3, val4, val5, val6, val7, val8, val9);
}
+#endif // Qt < 7.0
+
+ template <typename ReturnArg, typename... Args> static
+#ifdef Q_QDOC
+ bool
+#else
+ QtPrivate::Invoke::IfNotOldStyleArgs<bool, Args...>
+#endif
+ invokeMethod(QObject *obj, const char *member, Qt::ConnectionType c,
+ QTemplatedMetaMethodReturnArgument<ReturnArg> r, Args &&... arguments)
+ {
+ auto h = QtPrivate::invokeMethodHelper(r, std::forward<Args>(arguments)...);
+ return invokeMethodImpl(obj, member, c, h.parameterCount(), h.parameters.data(),
+ h.typeNames.data(), h.metaTypes.data());
+ }
+
+ template <typename... Args> static
+#ifdef Q_QDOC
+ bool
+#else
+ QtPrivate::Invoke::IfNotOldStyleArgs<bool, Args...>
+#endif
+ invokeMethod(QObject *obj, const char *member, Qt::ConnectionType c, Args &&... arguments)
+ {
+ QTemplatedMetaMethodReturnArgument<void> r = {};
+ return invokeMethod(obj, member, c, r, std::forward<Args>(arguments)...);
+ }
+
+ template <typename ReturnArg, typename... Args> static
+#ifdef Q_QDOC
+ bool
+#else
+ QtPrivate::Invoke::IfNotOldStyleArgs<bool, Args...>
+#endif
+ invokeMethod(QObject *obj, const char *member, QTemplatedMetaMethodReturnArgument<ReturnArg> r,
+ Args &&... arguments)
+ {
+ return invokeMethod(obj, member, Qt::AutoConnection, r, std::forward<Args>(arguments)...);
+ }
+
+ template <typename... Args> static
+#ifdef Q_QDOC
+ bool
+#else
+ QtPrivate::Invoke::IfNotOldStyleArgs<bool, Args...>
+#endif
+ invokeMethod(QObject *obj, const char *member, Args &&... arguments)
+ {
+ QTemplatedMetaMethodReturnArgument<void> r = {};
+ return invokeMethod(obj, member, Qt::AutoConnection, r, std::forward<Args>(arguments)...);
+ }
-#ifdef Q_CLANG_QDOC
+#ifdef Q_QDOC
template<typename Functor, typename FunctorReturnType>
- static bool invokeMethod(QObject *context, Functor function, Qt::ConnectionType type = Qt::AutoConnection, FunctorReturnType *ret = nullptr);
+ static bool invokeMethod(QObject *context, Functor &&function, Qt::ConnectionType type = Qt::AutoConnection, FunctorReturnType *ret = nullptr);
template<typename Functor, typename FunctorReturnType>
- static bool invokeMethod(QObject *context, Functor function, FunctorReturnType *ret);
+ static bool invokeMethod(QObject *context, Functor &&function, FunctorReturnType *ret);
+
+ template<typename Functor, typename FunctorReturnType, typename... Args>
+ static bool invokeMethod(QObject *context, Functor &&function, Qt::ConnectionType type, QTemplatedMetaMethodReturnArgument<FunctorReturnType> ret, Args &&...arguments);
+ template<typename Functor, typename FunctorReturnType, typename... Args>
+ static bool invokeMethod(QObject *context, Functor &&function, QTemplatedMetaMethodReturnArgument<FunctorReturnType> ret, Args &&...arguments);
+ template<typename Functor, typename... Args>
+ static bool invokeMethod(QObject *context, Functor &&function, Qt::ConnectionType type, Args &&...arguments);
+ template<typename Functor, typename... Args>
+ static bool invokeMethod(QObject *context, Functor &&function, Args &&...arguments);
#else
-
- // invokeMethod() for member function pointer
template <typename Func>
- static typename std::enable_if<QtPrivate::FunctionPointer<Func>::IsPointerToMemberFunction
- && !std::is_convertible<Func, const char*>::value
- && QtPrivate::FunctionPointer<Func>::ArgumentCount == 0, bool>::type
- invokeMethod(typename QtPrivate::FunctionPointer<Func>::Object *object,
- Func function,
- Qt::ConnectionType type = Qt::AutoConnection,
- typename QtPrivate::FunctionPointer<Func>::ReturnType *ret = nullptr)
+ static std::enable_if_t<!std::disjunction_v<std::is_convertible<Func, const char *>,
+ QtPrivate::Invoke::AreOldStyleArgs<Func>>,
+ bool>
+ invokeMethod(typename QtPrivate::ContextTypeForFunctor<Func>::ContextType *object,
+ Func &&function, Qt::ConnectionType type,
+ typename QtPrivate::Callable<Func>::ReturnType *ret)
{
- return invokeMethodImpl(object, new QtPrivate::QSlotObjectWithNoArgs<Func>(function), type, ret);
+ using R = typename QtPrivate::Callable<Func>::ReturnType;
+ const auto getReturnArg = [ret]() -> QTemplatedMetaMethodReturnArgument<R> {
+ if constexpr (std::is_void_v<R>)
+ return {};
+ else
+ return ret ? qReturnArg(*ret) : QTemplatedMetaMethodReturnArgument<R>{};
+ };
+ return invokeMethod(object, std::forward<Func>(function), type, getReturnArg());
}
-
template <typename Func>
- static typename std::enable_if<QtPrivate::FunctionPointer<Func>::IsPointerToMemberFunction
- && !std::is_convertible<Func, const char*>::value
- && QtPrivate::FunctionPointer<Func>::ArgumentCount == 0, bool>::type
- invokeMethod(typename QtPrivate::FunctionPointer<Func>::Object *object,
- Func function,
- typename QtPrivate::FunctionPointer<Func>::ReturnType *ret)
+ static std::enable_if_t<!std::disjunction_v<std::is_convertible<Func, const char *>,
+ QtPrivate::Invoke::AreOldStyleArgs<Func>>,
+ bool>
+ invokeMethod(typename QtPrivate::ContextTypeForFunctor<Func>::ContextType *object,
+ Func &&function, typename QtPrivate::Callable<Func>::ReturnType *ret)
{
- return invokeMethodImpl(object, new QtPrivate::QSlotObjectWithNoArgs<Func>(function), Qt::AutoConnection, ret);
+ return invokeMethod(object, std::forward<Func>(function), Qt::AutoConnection, ret);
}
- // invokeMethod() for function pointer (not member)
- template <typename Func>
- static typename std::enable_if<!QtPrivate::FunctionPointer<Func>::IsPointerToMemberFunction
- && !std::is_convertible<Func, const char*>::value
- && QtPrivate::FunctionPointer<Func>::ArgumentCount == 0, bool>::type
- invokeMethod(QObject *context, Func function,
- Qt::ConnectionType type = Qt::AutoConnection,
- typename QtPrivate::FunctionPointer<Func>::ReturnType *ret = nullptr)
+ template <typename Func, typename... Args>
+ static std::enable_if_t<!std::disjunction_v<std::is_convertible<Func, const char *>,
+ QtPrivate::Invoke::AreOldStyleArgs<Args...>>,
+ bool>
+ invokeMethod(typename QtPrivate::ContextTypeForFunctor<Func>::ContextType *object,
+ Func &&function, Qt::ConnectionType type,
+ QTemplatedMetaMethodReturnArgument<
+ typename QtPrivate::Callable<Func, Args...>::ReturnType>
+ ret,
+ Args &&...args)
{
- return invokeMethodImpl(context, new QtPrivate::QFunctorSlotObjectWithNoArgsImplicitReturn<Func>(function), type, ret);
+ return invokeMethodCallableHelper(object, std::forward<Func>(function), type, ret,
+ std::forward<Args>(args)...);
}
- template <typename Func>
- static typename std::enable_if<!QtPrivate::FunctionPointer<Func>::IsPointerToMemberFunction
- && !std::is_convertible<Func, const char*>::value
- && QtPrivate::FunctionPointer<Func>::ArgumentCount == 0, bool>::type
- invokeMethod(QObject *context, Func function,
- typename QtPrivate::FunctionPointer<Func>::ReturnType *ret)
+ template <typename Func, typename... Args>
+ static std::enable_if_t<!std::disjunction_v<std::is_convertible<Func, const char *>,
+ QtPrivate::Invoke::AreOldStyleArgs<Args...>>,
+ bool>
+ invokeMethod(typename QtPrivate::ContextTypeForFunctor<Func>::ContextType *object,
+ Func &&function, Qt::ConnectionType type, Args &&...args)
{
- return invokeMethodImpl(context, new QtPrivate::QFunctorSlotObjectWithNoArgsImplicitReturn<Func>(function), Qt::AutoConnection, ret);
+ using R = typename QtPrivate::Callable<Func, Args...>::ReturnType;
+ QTemplatedMetaMethodReturnArgument<R> r{ QtPrivate::qMetaTypeInterfaceForType<R>(), nullptr,
+ nullptr };
+ return invokeMethod(object, std::forward<Func>(function), type, r,
+ std::forward<Args>(args)...);
}
- // invokeMethod() for Functor
- template <typename Func>
- static typename std::enable_if<!QtPrivate::FunctionPointer<Func>::IsPointerToMemberFunction
- && QtPrivate::FunctionPointer<Func>::ArgumentCount == -1
- && !std::is_convertible<Func, const char*>::value, bool>::type
- invokeMethod(QObject *context, Func function,
- Qt::ConnectionType type = Qt::AutoConnection, decltype(function()) *ret = nullptr)
+ template <typename Func, typename... Args>
+ static std::enable_if_t<!std::disjunction_v<std::is_convertible<Func, const char *>,
+ QtPrivate::Invoke::AreOldStyleArgs<Args...>>,
+ bool>
+ invokeMethod(typename QtPrivate::ContextTypeForFunctor<Func>::ContextType *object,
+ Func &&function,
+ QTemplatedMetaMethodReturnArgument<
+ typename QtPrivate::Callable<Func, Args...>::ReturnType>
+ ret,
+ Args &&...args)
{
- return invokeMethodImpl(context,
- new QtPrivate::QFunctorSlotObjectWithNoArgs<Func, decltype(function())>(std::move(function)),
- type,
- ret);
+ return invokeMethod(object, std::forward<Func>(function), Qt::AutoConnection, ret,
+ std::forward<Args>(args)...);
}
- template <typename Func>
- static typename std::enable_if<!QtPrivate::FunctionPointer<Func>::IsPointerToMemberFunction
- && QtPrivate::FunctionPointer<Func>::ArgumentCount == -1
- && !std::is_convertible<Func, const char*>::value, bool>::type
- invokeMethod(QObject *context, Func function, decltype(function()) *ret)
+ template <typename Func, typename... Args>
+ static std::enable_if_t<!std::disjunction_v<std::is_convertible<Func, const char *>,
+ QtPrivate::Invoke::AreOldStyleArgs<Args...>>,
+ bool>
+ invokeMethod(typename QtPrivate::ContextTypeForFunctor<Func>::ContextType *object,
+ Func &&function, Args &&...args)
{
- return invokeMethodImpl(context,
- new QtPrivate::QFunctorSlotObjectWithNoArgs<Func, decltype(function())>(std::move(function)),
- Qt::AutoConnection,
- ret);
+ using R = typename QtPrivate::Callable<Func, Args...>::ReturnType;
+ QTemplatedMetaMethodReturnArgument<R> r{ QtPrivate::qMetaTypeInterfaceForType<R>(), nullptr,
+ nullptr };
+ return invokeMethod(object, std::forward<Func>(function), Qt::AutoConnection, r,
+ std::forward<Args>(args)...);
}
#endif
- QObject *newInstance(QGenericArgument val0 = QGenericArgument(nullptr),
+#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0)
+ QObject *newInstance(QGenericArgument val0,
QGenericArgument val1 = QGenericArgument(),
QGenericArgument val2 = QGenericArgument(),
QGenericArgument val3 = QGenericArgument(),
@@ -379,6 +526,20 @@ struct Q_CORE_EXPORT QMetaObject
QGenericArgument val7 = QGenericArgument(),
QGenericArgument val8 = QGenericArgument(),
QGenericArgument val9 = QGenericArgument()) const;
+#endif
+
+ template <typename... Args>
+#ifdef Q_QDOC
+ QObject *
+#else
+ QtPrivate::Invoke::IfNotOldStyleArgs<QObject *, Args...>
+#endif
+ newInstance(Args &&... arguments) const
+ {
+ auto h = QtPrivate::invokeMethodHelper(QMetaMethodReturnArgument{}, std::forward<Args>(arguments)...);
+ return newInstanceImpl(this, h.parameterCount(), h.parameters.data(),
+ h.typeNames.data(), h.metaTypes.data());
+ }
enum Call {
InvokeMetaMethod,
@@ -389,7 +550,9 @@ struct Q_CORE_EXPORT QMetaObject
IndexOfMethod,
RegisterPropertyMetaType,
RegisterMethodArgumentMetaType,
- BindableProperty
+ BindableProperty,
+ CustomCall,
+ ConstructInPlace,
};
int static_metacall(Call, int, void **) const;
@@ -401,6 +564,7 @@ struct Q_CORE_EXPORT QMetaObject
}
struct SuperData {
+ using Getter = const QMetaObject *(*)();
const QMetaObject *direct;
SuperData() = default;
constexpr SuperData(std::nullptr_t) : direct(nullptr) {}
@@ -409,7 +573,6 @@ struct Q_CORE_EXPORT QMetaObject
constexpr const QMetaObject *operator->() const { return operator const QMetaObject *(); }
#ifdef QT_NO_DATA_RELOCATION
- using Getter = const QMetaObject *(*)();
Getter indirect = nullptr;
constexpr SuperData(Getter g) : direct(nullptr), indirect(g) {}
constexpr operator const QMetaObject *() const
@@ -417,6 +580,7 @@ struct Q_CORE_EXPORT QMetaObject
template <const QMetaObject &MO> static constexpr SuperData link()
{ return SuperData(QMetaObject::staticMetaObject<MO>); }
#else
+ constexpr SuperData(Getter g) : direct(g()) {}
constexpr operator const QMetaObject *() const
{ return direct; }
template <const QMetaObject &MO> static constexpr SuperData link()
@@ -436,8 +600,46 @@ struct Q_CORE_EXPORT QMetaObject
} d;
private:
+ // Just need to have this here with a separate name so the other inline
+ // functions can call this without any ambiguity
+ template <typename Func, typename... Args>
+ static bool
+ invokeMethodCallableHelper(typename QtPrivate::ContextTypeForFunctor<Func>::ContextType *object,
+ Func &&function, Qt::ConnectionType type, const QMetaMethodReturnArgument &ret,
+ Args &&...args)
+ {
+ using Callable = QtPrivate::Callable<Func, Args...>;
+ using ExpectedArguments = typename Callable::Arguments;
+ static_assert(sizeof...(Args) <= ExpectedArguments::size, "Too many arguments");
+ using ActualArguments = QtPrivate::List<Args...>;
+ static_assert(QtPrivate::CheckCompatibleArguments<ActualArguments,
+ ExpectedArguments>::value,
+ "Incompatible arguments");
+
+ auto h = QtPrivate::invokeMethodHelper(ret, std::forward<Args>(args)...);
+
+ // NOLINTNEXTLINE(clang-analyzer-cplusplus.NewDeleteLeaks)
+ auto callable = new QtPrivate::QCallableObject<std::decay_t<Func>, ActualArguments,
+ typename Callable::ReturnType>(std::forward<Func>(function));
+ return invokeMethodImpl(object, callable, type, h.parameterCount(), h.parameters.data(),
+ h.typeNames.data(), h.metaTypes.data());
+ }
+
+ static bool invokeMethodImpl(QObject *object, const char *member, Qt::ConnectionType type,
+ qsizetype parameterCount, const void *const *parameters, const char *const *names,
+ const QtPrivate::QMetaTypeInterface * const *metaTypes);
+ static bool invokeMethodImpl(QObject *object, QtPrivate::QSlotObjectBase *slotObj,
+ Qt::ConnectionType type, qsizetype parameterCount,
+ const void *const *params, const char *const *names,
+ const QtPrivate::QMetaTypeInterface *const *metaTypes);
+#if QT_CORE_REMOVED_SINCE(6, 7)
static bool invokeMethodImpl(QObject *object, QtPrivate::QSlotObjectBase *slot, Qt::ConnectionType type, void *ret);
+#endif
+ static QObject *newInstanceImpl(const QMetaObject *mobj, qsizetype parameterCount,
+ const void **parameters, const char **typeNames,
+ const QtPrivate::QMetaTypeInterface **metaTypes);
friend class QTimer;
+ friend class QChronoTimer;
};
class Q_CORE_EXPORT QMetaObject::Connection {
@@ -461,9 +663,9 @@ public:
operator RestrictedBool() const { return d_ptr && isConnected_helper() ? &Connection::d_ptr : nullptr; }
#endif
- Connection(Connection &&other) noexcept : d_ptr(qExchange(other.d_ptr, nullptr)) {}
+ Connection(Connection &&other) noexcept : d_ptr(std::exchange(other.d_ptr, nullptr)) {}
QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_PURE_SWAP(Connection)
- void swap(Connection &other) noexcept { qSwap(d_ptr, other.d_ptr); }
+ void swap(Connection &other) noexcept { qt_ptr_swap(d_ptr, other.d_ptr); }
};
inline void swap(QMetaObject::Connection &lhs, QMetaObject::Connection &rhs) noexcept
@@ -475,7 +677,7 @@ inline const QMetaObject *QMetaObject::superClass() const
{ return d.superdata; }
namespace QtPrivate {
- /* Trait that tells is a the Object has a Q_OBJECT macro */
+ // Trait that tells if a QObject has a Q_OBJECT macro
template <typename Object> struct HasQ_OBJECT_Macro {
template <typename T>
static char test(int (T::*)(QMetaObject::Call, int, void **));
diff --git a/src/corelib/kernel/qobjectdefs_impl.h b/src/corelib/kernel/qobjectdefs_impl.h
index da9d0f6390..1e953f29b6 100644
--- a/src/corelib/kernel/qobjectdefs_impl.h
+++ b/src/corelib/kernel/qobjectdefs_impl.h
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2013 Olivier Goffart <ogoffart@woboq.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2013 Olivier Goffart <ogoffart@woboq.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QOBJECTDEFS_H
#error Do not include qobjectdefs_impl.h directly
@@ -48,9 +12,15 @@
#pragma qt_sync_stop_processing
#endif
+#include <QtCore/qfunctionaltools_impl.h>
+
+#include <memory>
+
QT_BEGIN_NAMESPACE
class QObject;
class QObjectPrivate;
+class QMetaMethod;
+class QByteArray;
namespace QtPrivate {
template <typename T> struct RemoveRef { typedef T Type; };
@@ -65,37 +35,43 @@ namespace QtPrivate {
the list composed of the first N element of the list
*/
// With variadic template, lists are represented using a variadic template argument instead of the lisp way
- template <typename...> struct List {};
- template <typename Head, typename... Tail> struct List<Head, Tail...> { typedef Head Car; typedef List<Tail...> Cdr; };
+ template <typename... Ts> struct List { static constexpr size_t size = sizeof...(Ts); };
+ template<typename T> struct SizeOfList { static constexpr size_t value = 1; };
+ template<> struct SizeOfList<List<>> { static constexpr size_t value = 0; };
+ template<typename ...Ts> struct SizeOfList<List<Ts...>> { static constexpr size_t value = List<Ts...>::size; };
+ template <typename Head, typename... Tail> struct List<Head, Tail...> {
+ static constexpr size_t size = 1 + sizeof...(Tail);
+ typedef Head Car; typedef List<Tail...> Cdr;
+ };
template <typename, typename> struct List_Append;
template <typename... L1, typename...L2> struct List_Append<List<L1...>, List<L2...>> { typedef List<L1..., L2...> Value; };
template <typename L, int N> struct List_Left {
typedef typename List_Append<List<typename L::Car>,typename List_Left<typename L::Cdr, N - 1>::Value>::Value Value;
};
template <typename L> struct List_Left<L, 0> { typedef List<> Value; };
- // List_Select<L,N> returns (via typedef Value) the Nth element of the list L
- template <typename L, int N> struct List_Select { typedef typename List_Select<typename L::Cdr, N - 1>::Value Value; };
- template <typename L> struct List_Select<L,0> { typedef typename L::Car Value; };
/*
- trick to set the return value of a slot that works even if the signal or the slot returns void
- to be used like function(), ApplyReturnValue<ReturnType>(&return_value)
- if function() returns a value, the operator,(T, ApplyReturnValue<ReturnType>) is called, but if it
- returns void, the builtin one is used without an error.
- */
- template <typename T>
- struct ApplyReturnValue {
- void *data;
- explicit ApplyReturnValue(void *data_) : data(data_) {}
+ This is used to store the return value from a slot, whether the caller
+ wants to store this value (QMetaObject::invokeMethod() with
+ qReturnArg() or non-void signal ) or not.
+ */
+ struct FunctorCallBase
+ {
+ template <typename R, typename Lambda>
+ static void call_internal(void **args, Lambda &&fn) noexcept(noexcept(fn()))
+ {
+ using SlotRet = decltype(fn());
+ if constexpr (std::is_void_v<R> || std::is_void_v<SlotRet>) {
+ Q_UNUSED(args);
+ } else {
+ if (args[0]) {
+ *reinterpret_cast<R *>(args[0]) = fn();
+ return;
+ }
+ }
+ fn();
+ }
};
- template<typename T, typename U>
- void operator,(T &&value, const ApplyReturnValue<U> &container) {
- if (container.data)
- *reinterpret_cast<U *>(container.data) = std::forward<T>(value);
- }
- template<typename T>
- void operator,(T, const ApplyReturnValue<void> &) {}
-
/*
The FunctionPointer<Func> struct is a type trait for function pointer.
@@ -111,7 +87,7 @@ namespace QtPrivate {
and args is the array of pointer to arguments, as used in qt_metacall
The Functor<Func,N> struct is the helper to call a functor of N argument.
- its call function is the same as the FunctionPointer::call function.
+ Its call function is the same as the FunctionPointer::call function.
*/
template<class T> using InvokeGenSeq = typename T::Type;
@@ -158,41 +134,57 @@ namespace QtPrivate {
template <typename, typename, typename, typename> struct FunctorCall;
template <int... II, typename... SignalArgs, typename R, typename Function>
- struct FunctorCall<IndexesList<II...>, List<SignalArgs...>, R, Function> {
- static void call(Function &f, void **arg) {
- f((*reinterpret_cast<typename RemoveRef<SignalArgs>::Type *>(arg[II+1]))...), ApplyReturnValue<R>(arg[0]);
+ struct FunctorCall<IndexesList<II...>, List<SignalArgs...>, R, Function> : FunctorCallBase
+ {
+ static void call(Function &f, void **arg)
+ {
+ call_internal<R>(arg, [&] {
+ return f((*reinterpret_cast<typename RemoveRef<SignalArgs>::Type *>(arg[II+1]))...);
+ });
}
};
template <int... II, typename... SignalArgs, typename R, typename... SlotArgs, typename SlotRet, class Obj>
- struct FunctorCall<IndexesList<II...>, List<SignalArgs...>, R, SlotRet (Obj::*)(SlotArgs...)> {
+ struct FunctorCall<IndexesList<II...>, List<SignalArgs...>, R, SlotRet (Obj::*)(SlotArgs...)> : FunctorCallBase
+ {
static void call(SlotRet (Obj::*f)(SlotArgs...), Obj *o, void **arg)
{
assertObjectType<Obj>(o);
- (o->*f)((*reinterpret_cast<typename RemoveRef<SignalArgs>::Type *>(arg[II+1]))...), ApplyReturnValue<R>(arg[0]);
+ call_internal<R>(arg, [&] {
+ return (o->*f)((*reinterpret_cast<typename RemoveRef<SignalArgs>::Type *>(arg[II+1]))...);
+ });
}
};
template <int... II, typename... SignalArgs, typename R, typename... SlotArgs, typename SlotRet, class Obj>
- struct FunctorCall<IndexesList<II...>, List<SignalArgs...>, R, SlotRet (Obj::*)(SlotArgs...) const> {
+ struct FunctorCall<IndexesList<II...>, List<SignalArgs...>, R, SlotRet (Obj::*)(SlotArgs...) const> : FunctorCallBase
+ {
static void call(SlotRet (Obj::*f)(SlotArgs...) const, Obj *o, void **arg)
{
assertObjectType<Obj>(o);
- (o->*f)((*reinterpret_cast<typename RemoveRef<SignalArgs>::Type *>(arg[II+1]))...), ApplyReturnValue<R>(arg[0]);
+ call_internal<R>(arg, [&] {
+ return (o->*f)((*reinterpret_cast<typename RemoveRef<SignalArgs>::Type *>(arg[II+1]))...);
+ });
}
};
template <int... II, typename... SignalArgs, typename R, typename... SlotArgs, typename SlotRet, class Obj>
- struct FunctorCall<IndexesList<II...>, List<SignalArgs...>, R, SlotRet (Obj::*)(SlotArgs...) noexcept> {
+ struct FunctorCall<IndexesList<II...>, List<SignalArgs...>, R, SlotRet (Obj::*)(SlotArgs...) noexcept> : FunctorCallBase
+ {
static void call(SlotRet (Obj::*f)(SlotArgs...) noexcept, Obj *o, void **arg)
{
assertObjectType<Obj>(o);
- (o->*f)((*reinterpret_cast<typename RemoveRef<SignalArgs>::Type *>(arg[II+1]))...), ApplyReturnValue<R>(arg[0]);
+ call_internal<R>(arg, [&]() noexcept {
+ return (o->*f)((*reinterpret_cast<typename RemoveRef<SignalArgs>::Type *>(arg[II+1]))...);
+ });
}
};
template <int... II, typename... SignalArgs, typename R, typename... SlotArgs, typename SlotRet, class Obj>
- struct FunctorCall<IndexesList<II...>, List<SignalArgs...>, R, SlotRet (Obj::*)(SlotArgs...) const noexcept> {
+ struct FunctorCall<IndexesList<II...>, List<SignalArgs...>, R, SlotRet (Obj::*)(SlotArgs...) const noexcept> : FunctorCallBase
+ {
static void call(SlotRet (Obj::*f)(SlotArgs...) const noexcept, Obj *o, void **arg)
{
assertObjectType<Obj>(o);
- (o->*f)((*reinterpret_cast<typename RemoveRef<SignalArgs>::Type *>(arg[II+1]))...), ApplyReturnValue<R>(arg[0]);
+ call_internal<R>(arg, [&]() noexcept {
+ return (o->*f)((*reinterpret_cast<typename RemoveRef<SignalArgs>::Type *>(arg[II+1]))...);
+ });
}
};
@@ -270,14 +262,6 @@ namespace QtPrivate {
}
};
- template<typename Function, int N> struct Functor
- {
- template <typename SignalArgs, typename R>
- static void call(Function &f, void *, void **arg) {
- FunctorCall<typename Indexes<N>::Value, SignalArgs, R, Function>::call(f, arg);
- }
- };
-
// Traits to detect if there is a conversion between two types,
// and that conversion does not include a narrowing conversion.
template <typename T>
@@ -311,10 +295,9 @@ namespace QtPrivate {
static_assert(CheckCompatibleArguments<FunctionPointer<Signal>::Arguments, FunctionPointer<Slot>::Arguments>::value)
*/
template<typename A1, typename A2> struct AreArgumentsCompatible {
- static int test(const typename RemoveRef<A2>::Type&);
+ static int test(const std::remove_reference_t<A2>&);
static char test(...);
- static const typename RemoveRef<A1>::Type &dummy();
- enum { value = sizeof(test(dummy())) == sizeof(int) };
+ enum { value = sizeof(test(std::declval<std::remove_reference_t<A1>>())) == sizeof(int) };
#ifdef QT_NO_NARROWING_CONVERSIONS_IN_CONNECT
using AreArgumentsConvertibleWithoutNarrowing = AreArgumentsConvertibleWithoutNarrowingBase<std::decay_t<A1>, std::decay_t<A2>>;
static_assert(AreArgumentsConvertibleWithoutNarrowing::value, "Signal and slot arguments are not compatible (narrowing)");
@@ -353,11 +336,10 @@ namespace QtPrivate {
template <typename Functor, typename... ArgList> struct ComputeFunctorArgumentCount<Functor, List<ArgList...>>
{
- template <typename D> static D dummy();
- template <typename F> static auto test(F f) -> decltype(((f.operator()((dummy<ArgList>())...)), int()));
+ template <typename F> static auto test(F f) -> decltype(((f.operator()((std::declval<ArgList>())...)), int()));
static char test(...);
enum {
- Ok = sizeof(test(dummy<Functor>())) == sizeof(int),
+ Ok = sizeof(test(std::declval<Functor>())) == sizeof(int),
Value = Ok ? int(sizeof...(ArgList)) : int(ComputeFunctorArgumentCountHelper<Functor, List<ArgList...>, Ok>::Value)
};
};
@@ -365,19 +347,115 @@ namespace QtPrivate {
/* get the return type of a functor, given the signal argument list */
template <typename Functor, typename ArgList> struct FunctorReturnType;
template <typename Functor, typename ... ArgList> struct FunctorReturnType<Functor, List<ArgList...>> {
- template <typename D> static D dummy();
- typedef decltype(dummy<Functor>().operator()((dummy<ArgList>())...)) Value;
+ typedef decltype(std::declval<Functor>().operator()((std::declval<ArgList>())...)) Value;
};
+ template<typename Func, typename... Args>
+ struct FunctorCallable
+ {
+ using ReturnType = decltype(std::declval<Func>()(std::declval<Args>()...));
+ using Function = ReturnType(*)(Args...);
+ enum {ArgumentCount = sizeof...(Args)};
+ using Arguments = QtPrivate::List<Args...>;
+
+ template <typename SignalArgs, typename R>
+ static void call(Func &f, void *, void **arg) {
+ FunctorCall<typename Indexes<ArgumentCount>::Value, SignalArgs, R, Func>::call(f, arg);
+ }
+ };
+
+ template <typename Functor, typename... Args>
+ struct HasCallOperatorAcceptingArgs
+ {
+ private:
+ template <typename F, typename = void>
+ struct Test : std::false_type
+ {
+ };
+ // We explicitly use .operator() to not return true for pointers to free/static function
+ template <typename F>
+ struct Test<F, std::void_t<decltype(std::declval<F>().operator()(std::declval<Args>()...))>>
+ : std::true_type
+ {
+ };
+
+ public:
+ using Type = Test<Functor>;
+ static constexpr bool value = Type::value;
+ };
+
+ template <typename Functor, typename... Args>
+ constexpr bool
+ HasCallOperatorAcceptingArgs_v = HasCallOperatorAcceptingArgs<Functor, Args...>::value;
+
+ template <typename Func, typename... Args>
+ struct CallableHelper
+ {
+ private:
+ // Could've been std::conditional_t, but that requires all branches to
+ // be valid
+ static auto Resolve(std::true_type CallOperator) -> FunctorCallable<Func, Args...>;
+ static auto Resolve(std::false_type CallOperator) -> FunctionPointer<std::decay_t<Func>>;
+
+ public:
+ using Type = decltype(Resolve(typename HasCallOperatorAcceptingArgs<std::decay_t<Func>,
+ Args...>::Type{}));
+ };
+
+ template<typename Func, typename... Args>
+ struct Callable : CallableHelper<Func, Args...>::Type
+ {};
+ template<typename Func, typename... Args>
+ struct Callable<Func, List<Args...>> : CallableHelper<Func, Args...>::Type
+ {};
+
+ /*
+ Wrapper around ComputeFunctorArgumentCount and CheckCompatibleArgument,
+ depending on whether \a Functor is a PMF or not. Returns -1 if \a Func is
+ not compatible with the \a ExpectedArguments, otherwise returns >= 0.
+ */
+ template<typename Prototype, typename Functor>
+ inline constexpr std::enable_if_t<!std::disjunction_v<std::is_convertible<Prototype, const char *>,
+ std::is_same<std::decay_t<Prototype>, QMetaMethod>,
+ std::is_convertible<Functor, const char *>,
+ std::is_same<std::decay_t<Functor>, QMetaMethod>
+ >,
+ int>
+ countMatchingArguments()
+ {
+ using ExpectedArguments = typename QtPrivate::FunctionPointer<Prototype>::Arguments;
+ using Actual = std::decay_t<Functor>;
+
+ if constexpr (QtPrivate::FunctionPointer<Actual>::IsPointerToMemberFunction
+ || QtPrivate::FunctionPointer<Actual>::ArgumentCount >= 0) {
+ // PMF or free function
+ using ActualArguments = typename QtPrivate::FunctionPointer<Actual>::Arguments;
+ if constexpr (QtPrivate::CheckCompatibleArguments<ExpectedArguments, ActualArguments>::value)
+ return QtPrivate::FunctionPointer<Actual>::ArgumentCount;
+ else
+ return -1;
+ } else {
+ // lambda or functor
+ return QtPrivate::ComputeFunctorArgumentCount<Actual, ExpectedArguments>::Value;
+ }
+ }
+
// internal base class (interface) containing functions required to call a slot managed by a pointer to function.
- class QSlotObjectBase {
- QAtomicInt m_ref;
- // don't use virtual functions here; we don't want the
+ class QSlotObjectBase
+ {
+ // Don't use virtual functions here; we don't want the
// compiler to create tons of per-polymorphic-class stuff that
// we'll never need. We just use one function pointer, and the
// Operations enum below to distinguish requests
+#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0)
+ QAtomicInt m_ref = 1;
typedef void (*ImplFn)(int which, QSlotObjectBase* this_, QObject *receiver, void **args, bool *ret);
const ImplFn m_impl;
+#else
+ using ImplFn = void (*)(QSlotObjectBase* this_, QObject *receiver, void **args, int which, bool *ret);
+ const ImplFn m_impl;
+ QAtomicInt m_ref = 1;
+#endif
protected:
// The operations that can be requested by calls to m_impl,
// see the member functions that call m_impl below for details
@@ -389,80 +467,197 @@ namespace QtPrivate {
NumOperations
};
public:
- explicit QSlotObjectBase(ImplFn fn) : m_ref(1), m_impl(fn) {}
+ explicit QSlotObjectBase(ImplFn fn) : m_impl(fn) {}
+
+ // A custom deleter compatible with std protocols (op()()) we well as
+ // the legacy QScopedPointer protocol (cleanup()).
+ struct Deleter {
+ void operator()(QSlotObjectBase *p) const noexcept
+ { if (p) p->destroyIfLastRef(); }
+ // for the non-standard QScopedPointer protocol:
+ static void cleanup(QSlotObjectBase *p) noexcept { Deleter{}(p); }
+ };
- inline int ref() noexcept { return m_ref.ref(); }
+ bool ref() noexcept { return m_ref.ref(); }
+#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0)
inline void destroyIfLastRef() noexcept
{ if (!m_ref.deref()) m_impl(Destroy, this, nullptr, nullptr, nullptr); }
inline bool compare(void **a) { bool ret = false; m_impl(Compare, this, nullptr, a, &ret); return ret; }
- inline void call(QObject *r, void **a) { m_impl(Call, this, r, a, nullptr); }
+ inline void call(QObject *r, void **a) { m_impl(Call, this, r, a, nullptr); }
+#else
+ inline void destroyIfLastRef() noexcept
+ { if (!m_ref.deref()) m_impl(this, nullptr, nullptr, Destroy, nullptr); }
+
+ inline bool compare(void **a)
+ {
+ bool ret = false;
+ m_impl(this, nullptr, a, Compare, &ret);
+ return ret;
+ }
+ inline void call(QObject *r, void **a) { m_impl(this, r, a, Call, nullptr); }
+#endif
+ bool isImpl(ImplFn f) const { return m_impl == f; }
protected:
~QSlotObjectBase() {}
private:
Q_DISABLE_COPY_MOVE(QSlotObjectBase)
};
- // implementation of QSlotObjectBase for which the slot is a pointer to member function of a QObject
- // Args and R are the List of arguments and the return type of the signal to which the slot is connected.
- template<typename Func, typename Args, typename R> class QSlotObject : public QSlotObjectBase
+ using SlotObjUniquePtr = std::unique_ptr<QSlotObjectBase,
+ QSlotObjectBase::Deleter>;
+ inline SlotObjUniquePtr copy(const SlotObjUniquePtr &other) noexcept
{
- typedef QtPrivate::FunctionPointer<Func> FuncType;
- Func function;
- static void impl(int which, QSlotObjectBase *this_, QObject *r, void **a, bool *ret)
+ if (other)
+ other->ref();
+ return SlotObjUniquePtr{other.get()};
+ }
+
+ class SlotObjSharedPtr {
+ SlotObjUniquePtr obj;
+ public:
+ Q_NODISCARD_CTOR Q_IMPLICIT SlotObjSharedPtr() noexcept = default;
+ Q_NODISCARD_CTOR Q_IMPLICIT SlotObjSharedPtr(std::nullptr_t) noexcept : SlotObjSharedPtr() {}
+ Q_NODISCARD_CTOR explicit SlotObjSharedPtr(SlotObjUniquePtr o)
+ : obj(std::move(o))
{
- switch (which) {
- case Destroy:
- delete static_cast<QSlotObject*>(this_);
- break;
- case Call:
- FuncType::template call<Args, R>(static_cast<QSlotObject*>(this_)->function, static_cast<typename FuncType::Object *>(r), a);
- break;
- case Compare:
- *ret = *reinterpret_cast<Func *>(a) == static_cast<QSlotObject*>(this_)->function;
- break;
- case NumOperations: ;
- }
+ // does NOT ref() (takes unique_ptr by value)
+ // (that's why (QSlotObjectBase*) ctor doesn't exisit: don't know whether that one _should_)
}
- public:
- explicit QSlotObject(Func f) : QSlotObjectBase(&impl), function(f) {}
+ Q_NODISCARD_CTOR SlotObjSharedPtr(const SlotObjSharedPtr &other) noexcept
+ : obj{copy(other.obj)} {}
+ SlotObjSharedPtr &operator=(const SlotObjSharedPtr &other) noexcept
+ { auto copy = other; swap(copy); return *this; }
+
+ Q_NODISCARD_CTOR SlotObjSharedPtr(SlotObjSharedPtr &&other) noexcept = default;
+ SlotObjSharedPtr &operator=(SlotObjSharedPtr &&other) noexcept = default;
+ ~SlotObjSharedPtr() = default;
+
+ void swap(SlotObjSharedPtr &other) noexcept { obj.swap(other.obj); }
+
+ auto get() const noexcept { return obj.get(); }
+ auto operator->() const noexcept { return get(); }
+
+ explicit operator bool() const noexcept { return bool(obj); }
};
- // implementation of QSlotObjectBase for which the slot is a functor (or lambda)
- // N is the number of arguments
+
+
+ // Implementation of QSlotObjectBase for which the slot is a callable (function, PMF, functor, or lambda).
// Args and R are the List of arguments and the return type of the signal to which the slot is connected.
- template<typename Func, int N, typename Args, typename R> class QFunctorSlotObject : public QSlotObjectBase
+ template <typename Func, typename Args, typename R>
+ class QCallableObject : public QSlotObjectBase,
+ private QtPrivate::CompactStorage<std::decay_t<Func>>
{
- typedef QtPrivate::Functor<Func, N> FuncType;
- Func function;
- static void impl(int which, QSlotObjectBase *this_, QObject *r, void **a, bool *ret)
+ using FunctorValue = std::decay_t<Func>;
+ using Storage = QtPrivate::CompactStorage<FunctorValue>;
+ using FuncType = Callable<Func, Args>;
+
+#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0)
+ Q_DECL_HIDDEN static void impl(int which, QSlotObjectBase *this_, QObject *r, void **a, bool *ret)
+#else
+ // Design note: the first three arguments match those for typical Call
+ // and Destroy uses. We return void to enable tail call optimization
+ // for those too.
+ Q_DECL_HIDDEN static void impl(QSlotObjectBase *this_, QObject *r, void **a, int which, bool *ret)
+#endif
{
+ const auto that = static_cast<QCallableObject*>(this_);
switch (which) {
case Destroy:
- delete static_cast<QFunctorSlotObject*>(this_);
+ delete that;
break;
case Call:
- FuncType::template call<Args, R>(static_cast<QFunctorSlotObject*>(this_)->function, r, a);
+ if constexpr (std::is_member_function_pointer_v<FunctorValue>)
+ FuncType::template call<Args, R>(that->object(), static_cast<typename FuncType::Object *>(r), a);
+ else
+ FuncType::template call<Args, R>(that->object(), r, a);
break;
- case Compare: // not implemented
+ case Compare:
+ if constexpr (std::is_member_function_pointer_v<FunctorValue>) {
+ *ret = *reinterpret_cast<FunctorValue *>(a) == that->object();
+ break;
+ }
+ // not implemented otherwise
+ Q_FALLTHROUGH();
case NumOperations:
Q_UNUSED(ret);
}
}
public:
- explicit QFunctorSlotObject(Func f) : QSlotObjectBase(&impl), function(std::move(f)) {}
+ explicit QCallableObject(Func &&f) : QSlotObjectBase(&impl), Storage{std::move(f)} {}
+ explicit QCallableObject(const Func &f) : QSlotObjectBase(&impl), Storage{f} {}
};
- // typedefs for readability for when there are no parameters
+ // Helper to detect the context object type based on the functor type:
+ // QObject for free functions and lambdas; the callee for member function
+ // pointers. The default declaration doesn't have the ContextType typedef,
+ // and so non-functor APIs (like old-style string-based slots) are removed
+ // from the overload set.
+ template <typename Func, typename = void>
+ struct ContextTypeForFunctor {};
+
+ template <typename Func>
+ struct ContextTypeForFunctor<Func,
+ std::enable_if_t<!std::disjunction_v<std::is_convertible<Func, const char *>,
+ std::is_member_function_pointer<Func>
+ >
+ >
+ >
+ {
+ using ContextType = QObject;
+ };
template <typename Func>
- using QSlotObjectWithNoArgs = QSlotObject<Func,
- QtPrivate::List<>,
- typename QtPrivate::FunctionPointer<Func>::ReturnType>;
+ struct ContextTypeForFunctor<Func,
+ std::enable_if_t<std::conjunction_v<std::negation<std::is_convertible<Func, const char *>>,
+ std::is_member_function_pointer<Func>,
+ std::is_convertible<typename QtPrivate::FunctionPointer<Func>::Object *, QObject *>
+ >
+ >
+ >
+ {
+ using ContextType = typename QtPrivate::FunctionPointer<Func>::Object;
+ };
- template <typename Func, typename R>
- using QFunctorSlotObjectWithNoArgs = QFunctorSlotObject<Func, 0, QtPrivate::List<>, R>;
+ /*
+ Returns a suitable QSlotObjectBase object that holds \a func, if possible.
- template <typename Func>
- using QFunctorSlotObjectWithNoArgsImplicitReturn = QFunctorSlotObjectWithNoArgs<Func, typename QtPrivate::FunctionPointer<Func>::ReturnType>;
+ Not available (and thus produces compile-time errors) if the Functor provided is
+ not compatible with the expected Prototype.
+ */
+ template <typename Prototype, typename Functor>
+ static constexpr std::enable_if_t<QtPrivate::countMatchingArguments<Prototype, Functor>() >= 0,
+ QtPrivate::QSlotObjectBase *>
+ makeCallableObject(Functor &&func)
+ {
+ using ExpectedSignature = QtPrivate::FunctionPointer<Prototype>;
+ using ExpectedReturnType = typename ExpectedSignature::ReturnType;
+ using ExpectedArguments = typename ExpectedSignature::Arguments;
+
+ using ActualSignature = QtPrivate::FunctionPointer<Functor>;
+ constexpr int MatchingArgumentCount = QtPrivate::countMatchingArguments<Prototype, Functor>();
+ using ActualArguments = typename QtPrivate::List_Left<ExpectedArguments, MatchingArgumentCount>::Value;
+
+ static_assert(int(ActualSignature::ArgumentCount) <= int(ExpectedSignature::ArgumentCount),
+ "Functor requires more arguments than what can be provided.");
+
+ // NOLINTNEXTLINE(clang-analyzer-cplusplus.NewDeleteLeaks)
+ return new QtPrivate::QCallableObject<std::decay_t<Functor>, ActualArguments, ExpectedReturnType>(std::forward<Functor>(func));
+ }
+
+ template<typename Prototype, typename Functor, typename = void>
+ struct AreFunctionsCompatible : std::false_type {};
+ template<typename Prototype, typename Functor>
+ struct AreFunctionsCompatible<Prototype, Functor, std::enable_if_t<
+ std::is_same_v<decltype(QtPrivate::makeCallableObject<Prototype>(std::forward<Functor>(std::declval<Functor>()))),
+ QtPrivate::QSlotObjectBase *>>
+ > : std::true_type {};
+
+ template<typename Prototype, typename Functor>
+ inline constexpr bool AssertCompatibleFunctions() {
+ static_assert(AreFunctionsCompatible<Prototype, Functor>::value,
+ "Functor is not compatible with expected prototype!");
+ return true;
+ }
}
QT_END_NAMESPACE
diff --git a/src/corelib/kernel/qpermissions.cpp b/src/corelib/kernel/qpermissions.cpp
new file mode 100644
index 0000000000..d0d2d9eb10
--- /dev/null
+++ b/src/corelib/kernel/qpermissions.cpp
@@ -0,0 +1,693 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#include "qpermissions.h"
+#include "qpermissions_p.h"
+#include "qhashfunctions.h"
+
+#include <QtCore/qshareddata.h>
+#include <QtCore/qdebug.h>
+
+QT_BEGIN_NAMESPACE
+
+Q_LOGGING_CATEGORY(lcPermissions, "qt.permissions", QtWarningMsg);
+
+/*!
+ \page permissions.html
+ \title Application Permissions
+ \brief Managing application permissions
+
+ Many features of today's devices and operating systems can have
+ significant privacy, security, and performance implications if
+ misused. It's therefore increasingly common for platforms to
+ require explicit consent from the user before accessing these
+ features.
+
+ The Qt permission APIs allow the application to check or request
+ permission for such features in a cross platform manner.
+
+ \section1 Usage
+
+ A feature that commonly requires user consent is access to the
+ microphone of the device. An application for recording voice
+ memos would perhaps look something like this initially:
+
+ \code
+ void VoiceMemoWidget::onRecordingInitiated()
+ {
+ m_microphone->startRecording();
+ }
+ \endcode
+
+ To ensure this application works well on platforms that
+ require user consent for microphone access we would extend
+ it like this:
+
+ \code
+ void VoiceMemoWidget::onRecordingInitiated()
+ {
+ QMicrophonePermission microphonePermission;
+ switch (qApp->checkPermission(microphonePermission)) {
+ case Qt::PermissionStatus::Undetermined:
+ qApp->requestPermission(microphonePermission, this,
+ &VoiceMemoWidget::onRecordingInitiated);
+ return;
+ case Qt::PermissionStatus::Denied:
+ m_permissionInstructionsDialog->show();
+ return;
+ case Qt::PermissionStatus::Granted:
+ m_microphone->startRecording();
+ }
+ }
+ \endcode
+
+ We first check if we already know the status of the microphone permission.
+ If we don't we initiate a permission request to determine the current
+ status, which will potentially ask the user for consent. We connect the
+ result of the request to the slot we're already in, so that we get another
+ chance at evaluating the permission status.
+
+ Once the permission status is known, either because we had been granted or
+ denied permission at an earlier time, or after getting the result back from
+ the request we just initiated, we redirect the user to a dialog explaining
+ why we can not record voice memos at this time (if the permission was denied),
+ or proceed to using the microphone (if permission was granted).
+
+ \note On \macOS and iOS permissions can currently only be requested for
+ GUI applications.
+
+ \section2 Declaring Permissions
+
+ Some platforms require that the permissions you request are declared
+ up front at build time.
+
+ \section3 Apple platforms
+ \target apple-usage-description
+
+ Each permission you request must be accompanied by a so called
+ \e {usage description} string in the application's \c Info.plist
+ file, describing why the application needs to access the given
+ permission. For example:
+
+ \badcode
+ <key>NSMicrophoneUsageDescription</key>
+ <string>The microphone is used to record voice memos.</string>
+ \endcode
+
+ The relevant usage description keys are described in the documentation
+ for each permission type.
+
+ \sa {Information Property List Files}.
+
+ \section3 Android
+ \target android-uses-permission
+
+ Each permission you request must be accompanied by a \c uses-permission
+ entry in the application's \c AndroidManifest.xml file. For example:
+
+ \badcode
+ <manifest ...>
+ <uses-permission android:name="android.permission.RECORD_AUDIO"/>
+ </manifest>
+ \endcode
+
+ The relevant permission names are described in the documentation
+ for each permission type.
+
+ \sa {Qt Creator: Editing Manifest Files}.
+
+ \section1 Available Permissions
+
+ The following permissions types are available:
+
+ \annotatedlist permissions
+
+ \section1 Best Practices
+
+ To ensure the best possible user experience for the end user we recommend
+ adopting the following best practices for managing application permissions:
+
+ \list
+
+ \li Request the minimal set of permissions needed. For example, if you only
+ need access to the microphone, do \e not request camera permission just in case.
+ Use the properties of individual permission types to limit the permission scope
+ even further, for example QContactsPermission::setReadOnly() to request read
+ only access.
+
+ \li Request permissions in response to specific actions by the user. For example,
+ defer requesting microphone permission until the user presses the button to record
+ audio. Associating the permission request to a specific action gives the user a clearer
+ context of why the permission is needed. Do \e not request all needed permission on
+ startup.
+
+ \li Present extra context and explanation if needed. Sometimes the action by the user
+ is not enough context. Consider presenting an explanation-dialog after the user has
+ initiated the action, but before requesting the permission, so the user is aware of
+ what's about to happen when the system permission dialog subsequently pops up.
+
+ \li Be transparent and explicit about why permissions are needed. In explanation
+ dialogs and usage descriptions, be transparent about why the particular permission
+ is needed for your application to provide a specific feature, so users can make
+ informed decisions.
+
+ \li Account for denied permissions. The permissions you request may be denied
+ for various reasons. You should always account for this situation, by gracefully
+ degrading the experience of your application, and presenting clear explanations
+ the user about the situation.
+
+ \li Never request permissions from a library. The request of permissions should
+ be done as close as possible to the user, where the information needed to make
+ good decisions on the points above is available. Libraries can check permissions,
+ to ensure they have the prerequisites for doing their work, but if the permission
+ is undetermined or denied this should be reflected through the library's API,
+ so that the application in turn can request the necessary permissions.
+
+ \endlist
+*/
+
+
+/*!
+ \class QPermission
+ \inmodule QtCore
+ \inheaderfile QPermissions
+ \since 6.5
+ \brief An opaque wrapper of a typed permission.
+
+ The QPermission class is an opaque wrapper of a \l{typed permission},
+ used when checking or requesting permissions. You do not need to construct
+ this type explicitly, as the type is automatically used when checking or
+ requesting permissions:
+
+ \code
+ qApp->checkPermission(QCameraPermission{});
+ \endcode
+
+ When requesting permissions, the given functor will
+ be passed an instance of a QPermission, which can be used
+ to check the result of the request:
+
+ \code
+ qApp->requestPermission(QCameraPermission{}, [](const QPermission &permission) {
+ if (permission.status() == Qt::PermissionStatus:Granted)
+ takePhoto();
+ });
+ \endcode
+
+ To inspect the properties of the original, typed permission,
+ use the \l {QPermission::}{value()} function:
+
+ \code
+ QLocationPermission locationPermission;
+ locationPermission.setAccuracy(QLocationPermission::Precise);
+ qApp->requestPermission(locationPermission, this, &LocationWidget::permissionUpdated);
+ \endcode
+
+ \code
+ void LocationWidget::permissionUpdated(const QPermission &permission)
+ {
+ if (permission.status() != Qt::PermissionStatus:Granted)
+ return;
+ auto locationPermission = permission.value<QLocationPermission>();
+ if (!locationPermission || locationPermission->accuracy() != QLocationPermission::Precise)
+ return;
+ updatePreciseLocation();
+ }
+ \endcode
+
+ \target typed permission
+ \section2 Typed Permissions
+
+ The following permissions are available:
+
+ \annotatedlist permissions
+
+ \sa {Application Permissions}
+*/
+
+/*!
+ \fn template <typename T, QPermission::if_permission<T>> QPermission::QPermission(const T &type)
+
+ Constructs a permission from the given \l{typed permission} \a type.
+
+ You do not need to construct this type explicitly, as the type is automatically
+ used when checking or requesting permissions.
+
+ This constructor participates in overload resolution only if \c T is one of
+ the \l{typed permission} classes:
+
+ \annotatedlist permissions
+*/
+
+/*!
+ \fn template <typename T, QPermission::if_permission<T>> std::optional<T> QPermission::value() const
+
+ Returns the \l{typed permission} of type \c T, or \c{std::nullopt} if this
+ QPermission object doesn't contain one.
+
+ Use type() for dynamically choosing which typed permission to request.
+
+ This function participates in overload resolution only if \c T is one of
+ the \l{typed permission} classes:
+
+ \annotatedlist permissions
+*/
+
+/*!
+ \fn Qt::PermissionStatus QPermission::status() const
+ Returns the status of the permission.
+*/
+
+/*!
+ \fn QMetaType QPermission::type() const
+ Returns the type of the permission.
+*/
+
+/*
+ \internal
+*/
+const void *QPermission::data(QMetaType requestedType) const
+{
+ const auto actualType = type();
+ if (requestedType != actualType)
+ return nullptr;
+ return m_data.data();
+}
+
+// check alignof(AlignmentCheck) instead of alignof(void*), in case
+// pointers have different alignment inside structs:
+struct AlignmentCheck { void *p; };
+
+#define QT_PERMISSION_IMPL_COMMON(ClassName) \
+ /* Class##Private is unused until we need it: */ \
+ static_assert(sizeof(ClassName) == sizeof(void*), \
+ "You have added too many members to " #ClassName "::ShortData. " \
+ "Decrease their size or switch to using a d-pointer."); \
+ static_assert(alignof(ClassName) == alignof(AlignmentCheck), \
+ "You have added members to " #ClassName "::ShortData that are overaligned. " \
+ "Decrease their alignment or switch to using a d-pointer."); \
+ ClassName::ClassName(const ClassName &other) noexcept = default; \
+ ClassName::~ClassName() = default; \
+ ClassName &ClassName::operator=(const ClassName &other) noexcept = default; \
+ ClassName::ClassName() \
+ /* impl supplied by caller */
+
+
+/*!
+ \class QCameraPermission
+ \brief Access the camera for taking pictures or videos.
+
+ \section1 Requirements
+
+ \include permissions.qdocinc begin-usage-declarations
+ \row
+ \li Apple
+ \li \l{apple-usage-description}{Usage description}
+ \li \c NSCameraUsageDescription
+ \row
+ \li Android
+ \li \l{android-uses-permission}{\c{uses-permission}}
+ \li \c android.permission.CAMERA
+ \include permissions.qdocinc end-usage-declarations
+
+ \include permissions.qdocinc permission-metadata
+*/
+
+QT_PERMISSION_IMPL_COMMON(QCameraPermission)
+ : u{} // stateless, atm
+{}
+
+/*!
+ \class QMicrophonePermission
+ \brief Access the microphone for monitoring or recording sound.
+
+ \section1 Requirements
+
+ \include permissions.qdocinc begin-usage-declarations
+ \row
+ \li Apple
+ \li \l{apple-usage-description}{Usage description}
+ \li \c NSMicrophoneUsageDescription
+ \row
+ \li Android
+ \li \l{android-uses-permission}{\c{uses-permission}}
+ \li \c android.permission.RECORD_AUDIO
+ \include permissions.qdocinc end-usage-declarations
+
+ \include permissions.qdocinc permission-metadata
+*/
+
+QT_PERMISSION_IMPL_COMMON(QMicrophonePermission)
+ : u{} // stateless, atm
+{}
+
+/*!
+ \class QBluetoothPermission
+ \brief Access Bluetooth peripherals.
+
+ \section1 Requirements
+
+ \include permissions.qdocinc begin-usage-declarations
+ \row
+ \li Apple
+ \li \l{apple-usage-description}{Usage description}
+ \li \c NSBluetoothAlwaysUsageDescription
+ \row
+ \li Android
+ \li \l{android-uses-permission}{\c{uses-permission}}
+ \li Up to Android 11 (API Level < 31):
+ \list
+ \li \c android.permission.BLUETOOTH
+ \li \c android.permission.ACCESS_FINE_LOCATION
+ \endlist
+
+ Starting from Android 12 (API Level >= 31):
+ \list
+ \li \c android.permission.BLUETOOTH_ADVERTISE
+ \li \c android.permission.BLUETOOTH_CONNECT
+ \li \c android.permission.BLUETOOTH_SCAN
+ \li \c android.permission.ACCESS_FINE_LOCATION
+ \endlist
+ \include permissions.qdocinc end-usage-declarations
+
+ \note Currently on Android the \c android.permission.ACCESS_FINE_LOCATION
+ permission is requested together with Bluetooth permissions. This is
+ required for Bluetooth to work properly, unless the application provides a
+ strong assertion in the application manifest that it does not use Bluetooth
+ to derive a physical location. This permission coupling may change in
+ future.
+
+ \include permissions.qdocinc permission-metadata
+*/
+
+QT_PERMISSION_IMPL_COMMON(QBluetoothPermission)
+ : u{ShortData{CommunicationMode::Default, {}}}
+{}
+
+/*!
+ \enum QBluetoothPermission::CommunicationMode
+ \since 6.6
+
+ This enum is used to control the allowed Bluetooth communication modes.
+
+ \value Access Allow this device to access other Bluetooth devices. This
+ includes scanning for nearby devices and connecting to them.
+ \value Advertise Allow other Bluetooth devices to discover this device.
+ \value Default This configuration is used by default.
+
+ \note The fine-grained permissions are currently supported only on
+ Android 12 and newer. On older Android versions, as well as on Apple
+ operating systems, any mode results in full Bluetooth access.
+
+ \note For now the \c Access mode on Android also requests the
+ \l {QLocationPermission::Precise}{precise location} permission.
+ This permission coupling may change in the future.
+*/
+
+/*!
+ \since 6.6
+
+ Sets the allowed Bluetooth communication modes to \a modes.
+
+ \note A default-constructed instance of \l {QBluetoothPermission::}
+ {CommunicationModes} has no sense, so an attempt to set such a mode will
+ raise a \c {qWarning()} and fall back to using the
+ \l {QBluetoothPermission::}{Default} mode.
+*/
+void QBluetoothPermission::setCommunicationModes(CommunicationModes modes)
+{
+ if (modes == CommunicationModes{}) {
+ qCWarning(lcPermissions, "QBluetoothPermission: trying to set an invalid empty mode. "
+ "Falling back to CommunicationMode::Default.");
+ u.data.mode = Default;
+ } else {
+ u.data.mode = static_cast<CommunicationMode>(modes.toInt());
+ }
+}
+
+/*!
+ \since 6.6
+
+ Returns the allowed Bluetooth communication modes.
+*/
+QBluetoothPermission::CommunicationModes QBluetoothPermission::communicationModes() const
+{
+ return u.data.mode;
+}
+
+/*!
+ \class QLocationPermission
+ \brief Access the user's location.
+
+ By default the request is for approximate accuracy,
+ and only while the application is in use. Use
+ setAccuracy() and/or setAvailability() to override
+ the default.
+
+ \section1 Requirements
+
+ \include permissions.qdocinc begin-usage-declarations
+ \row
+ \li \macos
+ \li \l{apple-usage-description}{Usage description}
+ \li \c NSLocationUsageDescription
+ \row
+ \li iOS
+ \li \l{apple-usage-description}{Usage description}
+ \li \c NSLocationWhenInUseUsageDescription, and
+ \c NSLocationAlwaysAndWhenInUseUsageDescription if requesting
+ QLocationPermission::Always
+ \row
+ \li Android
+ \li \l{android-uses-permission}{\c{uses-permission}}
+ \li \list
+ \li \c android.permission.ACCESS_FINE_LOCATION for QLocationPermission::Precise
+ \li \c android.permission.ACCESS_COARSE_LOCATION for QLocationPermission::Approximate
+ \li \c android.permission.ACCESS_BACKGROUND_LOCATION for QLocationPermission::Always
+ \endlist
+ \note QLocationPermission::Always \c uses-permission string has
+ to be combined with one or both of QLocationPermission::Precise
+ and QLocationPermission::Approximate strings.
+ \include permissions.qdocinc end-usage-declarations
+
+ \include permissions.qdocinc permission-metadata
+*/
+
+QT_PERMISSION_IMPL_COMMON(QLocationPermission)
+ : u{ShortData{Accuracy::Approximate, Availability::WhenInUse, {}}}
+{}
+
+/*!
+ \enum QLocationPermission::Accuracy
+
+ This enum is used to control the accuracy of the location data.
+
+ \value Approximate An approximate location is requested.
+ \value Precise A precise location is requested.
+*/
+
+/*!
+ \enum QLocationPermission::Availability
+
+ This enum is used to control the availability of the location data.
+
+ \value WhenInUse The location is only available only when the
+ application is in use.
+ \value Always The location is available at all times, including when
+ the application is in the background.
+*/
+
+/*!
+ Sets the desired \a accuracy of the request.
+*/
+void QLocationPermission::setAccuracy(Accuracy accuracy)
+{
+ u.data.accuracy = accuracy;
+}
+
+/*!
+ Returns the accuracy of the request.
+*/
+QLocationPermission::Accuracy QLocationPermission::accuracy() const
+{
+ return u.data.accuracy;
+}
+
+/*!
+ Sets the desired \a availability of the request.
+*/
+void QLocationPermission::setAvailability(Availability availability)
+{
+ u.data.availability = availability;
+}
+
+/*!
+ Returns the availability of the request.
+*/
+QLocationPermission::Availability QLocationPermission::availability() const
+{
+ return u.data.availability;
+}
+
+/*!
+ \class QContactsPermission
+ \brief Access the user's contacts.
+
+ By default the request is for read-only access.
+ Use setAccessMode() to override the default.
+
+ \section1 Requirements
+
+ \include permissions.qdocinc begin-usage-declarations
+ \row
+ \li Apple
+ \li \l{apple-usage-description}{Usage description}
+ \li \c NSContactsUsageDescription
+ \row
+ \li Android
+ \li \l{android-uses-permission}{\c{uses-permission}}
+ \li \c android.permission.READ_CONTACTS. \c android.permission.WRITE_CONTACTS if
+ QContactsPermission::accessMode() is set to AccessMode::ReadWrite.
+ \include permissions.qdocinc end-usage-declarations
+
+ \include permissions.qdocinc permission-metadata
+*/
+
+/*!
+ \enum QContactsPermission::AccessMode
+
+ This enum is used to control access to the contacts data.
+
+ \value ReadOnly Read-only access to the contacts data (the default).
+ \value ReadWrite Read and write access to the contacts data.
+
+ \sa setAccessMode, accessMode
+*/
+
+QT_PERMISSION_IMPL_COMMON(QContactsPermission)
+ : u{ShortData{AccessMode::ReadOnly, {}}}
+{}
+
+/*!
+ Sets whether the request is for read-write (\a mode == AccessMode::ReadOnly) or
+ read-only (\a mode == AccessMode::ReadOnly) access to the contacts.
+*/
+void QContactsPermission::setAccessMode(AccessMode mode)
+{
+ u.data.mode = mode;
+}
+
+/*!
+ Returns AccessMode::ReadWrite when the request is for read-write and
+ AccessMode::ReadOnly when it is for read-only access to the contacts.
+*/
+QContactsPermission::AccessMode QContactsPermission::accessMode() const
+{
+ return u.data.mode;
+}
+
+/*!
+ \class QCalendarPermission
+ \brief Access the user's calendar.
+
+ By default the request is for read-only access.
+ Use setAccessMode() to override the default.
+
+ \section1 Requirements
+
+ \include permissions.qdocinc begin-usage-declarations
+ \row
+ \li Apple
+ \li \l{apple-usage-description}{Usage description}
+ \li \c NSCalendarsUsageDescription
+ \row
+ \li Android
+ \li \l{android-uses-permission}{\c{uses-permission}}
+ \li \c android.permission.READ_CALENDAR. \c android.permission.WRITE_CALENDAR if
+ QCalendarPermission::accessMode() is set to AccessMode::ReadWrite.
+ \include permissions.qdocinc end-usage-declarations
+
+ \include permissions.qdocinc permission-metadata
+*/
+
+/*!
+ \enum QCalendarPermission::AccessMode
+
+ This enum is used to control access to the calendar data.
+
+ \value ReadOnly Read-only access to the calendar data (the default).
+ \value ReadWrite Read and write access to the calendar data.
+
+ \sa setAccessMode, accessMode
+*/
+
+QT_PERMISSION_IMPL_COMMON(QCalendarPermission)
+ : u{ShortData{AccessMode::ReadOnly, {}}}
+{}
+
+/*!
+ Sets whether the request is for read-write (\a mode == AccessMode::ReadOnly) or
+ read-only (\a mode == AccessMode::ReadOnly) access to the calendar.
+*/
+void QCalendarPermission::setAccessMode(AccessMode mode)
+{
+ u.data.mode = mode;
+}
+
+/*!
+ Returns AccessMode::ReadWrite when the request is for read-write and
+ AccessMode::ReadOnly when it is for read-only access to the calendar.
+*/
+QCalendarPermission::AccessMode QCalendarPermission::accessMode() const
+{
+ return u.data.mode;
+}
+
+/*!
+ * \internal
+*/
+
+QPermissionPlugin::~QPermissionPlugin() = default;
+
+#ifndef QT_NO_DEBUG_STREAM
+QDebug operator<<(QDebug debug, const QPermission &permission)
+{
+ const auto verbosity = debug.verbosity();
+ QDebugStateSaver saver(debug);
+ debug.nospace().setVerbosity(0);
+ if (verbosity >= QDebug::DefaultVerbosity)
+ debug << permission.type().name() << "(";
+ debug << permission.status();
+ if (verbosity >= QDebug::DefaultVerbosity)
+ debug << ")";
+ return debug;
+}
+#endif
+
+#undef QT_PERMISSION_IMPL_COMMON
+
+#if !defined(Q_OS_DARWIN) && !defined(Q_OS_ANDROID) && !defined(Q_OS_WASM)
+// Default backend for platforms without a permission implementation.
+// Always returns Granted, to match behavior when not using permission APIs
+// https://bugreports.qt.io/browse/QTBUG-90498?focusedCommentId=725085#comment-725085
+namespace QPermissions::Private
+{
+ Qt::PermissionStatus checkPermission(const QPermission &permission)
+ {
+ qCDebug(lcPermissions) << "No permission backend on this platform."
+ << "Optimistically returning Granted for" << permission;
+ return Qt::PermissionStatus::Granted;
+ }
+
+ void requestPermission(const QPermission &permission, const PermissionCallback &callback)
+ {
+ qCDebug(lcPermissions) << "No permission backend on this platform."
+ << "Optimistically returning Granted for" << permission;
+ callback(Qt::PermissionStatus::Granted);
+ }
+}
+#endif
+
+QT_END_NAMESPACE
+
+#include "moc_qpermissions.cpp"
diff --git a/src/corelib/kernel/qpermissions.h b/src/corelib/kernel/qpermissions.h
new file mode 100644
index 0000000000..9573e377e5
--- /dev/null
+++ b/src/corelib/kernel/qpermissions.h
@@ -0,0 +1,219 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QPERMISSIONS_H
+#define QPERMISSIONS_H
+
+#if 0
+#pragma qt_class(QPermissions)
+#endif
+
+#include <QtCore/qglobal.h>
+#include <QtCore/qtmetamacros.h>
+#include <QtCore/qvariant.h>
+
+#include <QtCore/qshareddata_impl.h>
+#include <QtCore/qtypeinfo.h>
+#include <QtCore/qmetatype.h>
+
+#include <optional>
+
+#if !defined(Q_QDOC)
+QT_REQUIRE_CONFIG(permissions);
+#endif
+
+QT_BEGIN_NAMESPACE
+
+#ifndef QT_NO_DEBUG_STREAM
+class QDebug;
+#endif
+
+struct QMetaObject;
+class QCoreApplication;
+
+class QPermission
+{
+ template <typename T, typename Enable = void>
+ static constexpr inline bool is_permission_v = false;
+
+ template <typename T>
+ using if_permission = std::enable_if_t<is_permission_v<T>, bool>;
+public:
+ explicit QPermission() = default;
+
+ template <typename T, if_permission<T> = true>
+ QPermission(const T &t) : m_data(QVariant::fromValue(t)) {}
+
+ Qt::PermissionStatus status() const { return m_status; }
+
+ QMetaType type() const { return m_data.metaType(); }
+
+ template <typename T, if_permission<T> = true>
+ std::optional<T> value() const
+ {
+ if (auto p = data(QMetaType::fromType<T>()))
+ return *static_cast<const T *>(p);
+ return std::nullopt;
+ }
+
+#ifndef QT_NO_DEBUG_STREAM
+ friend Q_CORE_EXPORT QDebug operator<<(QDebug debug, const QPermission &);
+#endif
+
+private:
+ Q_CORE_EXPORT const void *data(QMetaType id) const;
+
+ Qt::PermissionStatus m_status = Qt::PermissionStatus::Undetermined;
+ QVariant m_data;
+
+ friend class QCoreApplication;
+};
+
+template <typename T>
+constexpr bool QPermission::is_permission_v<T, typename T::QtPermissionHelper> = true;
+
+#define QT_PERMISSION(ClassName) \
+ using QtPermissionHelper = void; \
+ friend class QPermission; \
+ union U { \
+ U() : d(nullptr) {} \
+ U(ShortData _data) : data(_data) {} \
+ U(ClassName##Private *_d) : d(_d) {} \
+ ShortData data; \
+ ClassName##Private *d; \
+ } u; \
+public: \
+ Q_CORE_EXPORT ClassName(); \
+ Q_CORE_EXPORT ClassName(const ClassName &other) noexcept; \
+ ClassName(ClassName &&other) noexcept \
+ : u{other.u} { other.u.d = nullptr; } \
+ Q_CORE_EXPORT ~ClassName(); \
+ Q_CORE_EXPORT ClassName &operator=(const ClassName &other) noexcept; \
+ QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_MOVE_AND_SWAP(ClassName) \
+ void swap(ClassName &other) noexcept { std::swap(u, other.u); } \
+private: \
+ /*end*/
+
+class QLocationPermissionPrivate;
+class QLocationPermission
+{
+ Q_GADGET_EXPORT(Q_CORE_EXPORT)
+public:
+ enum Accuracy : quint8 {
+ Approximate,
+ Precise,
+ };
+ Q_ENUM(Accuracy)
+
+ Q_CORE_EXPORT void setAccuracy(Accuracy accuracy);
+ Q_CORE_EXPORT Accuracy accuracy() const;
+
+ enum Availability : quint8 {
+ WhenInUse,
+ Always,
+ };
+ Q_ENUM(Availability)
+
+ Q_CORE_EXPORT void setAvailability(Availability availability);
+ Q_CORE_EXPORT Availability availability() const;
+
+private:
+ struct ShortData {
+ Accuracy accuracy;
+ Availability availability;
+ char reserved[sizeof(void*) - sizeof(accuracy) - sizeof(availability)];
+ };
+ QT_PERMISSION(QLocationPermission)
+};
+Q_DECLARE_SHARED(QLocationPermission)
+
+class QCalendarPermissionPrivate;
+class QCalendarPermission
+{
+ Q_GADGET_EXPORT(Q_CORE_EXPORT)
+public:
+ enum AccessMode : quint8 {
+ ReadOnly,
+ ReadWrite,
+ };
+ Q_ENUM(AccessMode)
+
+ Q_CORE_EXPORT void setAccessMode(AccessMode mode);
+ Q_CORE_EXPORT AccessMode accessMode() const;
+
+private:
+ struct ShortData {
+ AccessMode mode;
+ char reserved[sizeof(void*) - sizeof(mode)];
+ };
+ QT_PERMISSION(QCalendarPermission)
+};
+Q_DECLARE_SHARED(QCalendarPermission)
+
+class QContactsPermissionPrivate;
+class QContactsPermission
+{
+ Q_GADGET_EXPORT(Q_CORE_EXPORT)
+public:
+ enum AccessMode : quint8 {
+ ReadOnly,
+ ReadWrite,
+ };
+ Q_ENUM(AccessMode)
+
+ Q_CORE_EXPORT void setAccessMode(AccessMode mode);
+ Q_CORE_EXPORT AccessMode accessMode() const;
+
+private:
+ struct ShortData {
+ AccessMode mode;
+ char reserved[sizeof(void*) - sizeof(mode)];
+ };
+ QT_PERMISSION(QContactsPermission)
+};
+Q_DECLARE_SHARED(QContactsPermission)
+
+class QBluetoothPermissionPrivate;
+class QBluetoothPermission
+{
+ Q_GADGET_EXPORT(Q_CORE_EXPORT)
+public:
+ enum CommunicationMode : quint8 {
+ Access = 0x01,
+ Advertise = 0x02,
+ Default = Access | Advertise,
+ };
+ Q_DECLARE_FLAGS(CommunicationModes, CommunicationMode)
+ Q_FLAG(CommunicationModes)
+
+ Q_CORE_EXPORT void setCommunicationModes(CommunicationModes modes);
+ Q_CORE_EXPORT CommunicationModes communicationModes() const;
+
+private:
+ struct ShortData {
+ CommunicationMode mode;
+ char reserved[sizeof(void*) - sizeof(mode)];
+ };
+ QT_PERMISSION(QBluetoothPermission)
+};
+Q_DECLARE_OPERATORS_FOR_FLAGS(QBluetoothPermission::CommunicationModes)
+Q_DECLARE_SHARED(QBluetoothPermission)
+
+#define Q_DECLARE_MINIMAL_PERMISSION(ClassName) \
+ class ClassName##Private; \
+ class ClassName \
+ { \
+ struct ShortData { char reserved[sizeof(void*)]; }; \
+ QT_PERMISSION(ClassName) \
+ }; \
+ Q_DECLARE_SHARED(ClassName)
+
+Q_DECLARE_MINIMAL_PERMISSION(QCameraPermission)
+Q_DECLARE_MINIMAL_PERMISSION(QMicrophonePermission)
+
+#undef QT_PERMISSION
+#undef Q_DECLARE_MINIMAL_PERMISSION
+
+QT_END_NAMESPACE
+
+#endif // QPERMISSIONS_H
diff --git a/src/corelib/kernel/qpermissions_android.cpp b/src/corelib/kernel/qpermissions_android.cpp
new file mode 100644
index 0000000000..6c21ded72c
--- /dev/null
+++ b/src/corelib/kernel/qpermissions_android.cpp
@@ -0,0 +1,189 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#include "qpermissions.h"
+#include "qpermissions_p.h"
+
+#include <QtCore/qstringlist.h>
+#include <QtCore/qfuture.h>
+#include <QtCore/qhash.h>
+
+#include "private/qandroidextras_p.h"
+
+QT_BEGIN_NAMESPACE
+
+using namespace Qt::StringLiterals;
+
+static QStringList nativeLocationPermission(const QLocationPermission &permission)
+{
+ QStringList nativeLocationPermissionList;
+ const int sdkVersion = QtAndroidPrivate::androidSdkVersion();
+ static QString backgroundLocation = u"android.permission.ACCESS_BACKGROUND_LOCATION"_s;
+ static QString fineLocation = u"android.permission.ACCESS_FINE_LOCATION"_s;
+ static QString coarseLocation = u"android.permission.ACCESS_COARSE_LOCATION"_s;
+
+ // Since Android API 30, background location cannot be requested along
+ // with fine or coarse location, but it should be requested separately after
+ // the latter have been granted, see
+ // https://developer.android.com/training/location/permissions
+ if (sdkVersion < 30 || permission.availability() == QLocationPermission::WhenInUse) {
+ if (permission.accuracy() == QLocationPermission::Approximate) {
+ nativeLocationPermissionList << coarseLocation;
+ } else {
+ nativeLocationPermissionList << fineLocation;
+ // Since Android API 31, if precise location is requested, it's advised
+ // to request both fine and coarse location permissions, see
+ // https://developer.android.com/training/location/permissions#approximate-request
+ if (sdkVersion >= 31)
+ nativeLocationPermissionList << coarseLocation;
+ }
+ }
+
+ // NOTE: before Android API 29, background permission doesn't exist yet.
+
+ // Keep the background permission in front to be able to use first()
+ // on the list in checkPermission() because it takes single permission.
+ if (sdkVersion >= 29 && permission.availability() == QLocationPermission::Always)
+ nativeLocationPermissionList.prepend(backgroundLocation);
+
+ return nativeLocationPermissionList;
+}
+
+static QStringList nativeBluetoothPermission(const QBluetoothPermission &permission)
+{
+ // See https://developer.android.com/guide/topics/connectivity/bluetooth/permissions
+ // for the details.
+
+ // API Level < 31
+ static QString bluetoothGeneral = u"android.permission.BLUETOOTH"_s;
+ // API Level >= 31
+ static QString bluetoothScan = u"android.permission.BLUETOOTH_SCAN"_s;
+ static QString bluetoothAdvertise = u"android.permission.BLUETOOTH_ADVERTISE"_s;
+ static QString bluetoothConnect = u"android.permission.BLUETOOTH_CONNECT"_s;
+ // Fine location is currently required for ALL API levels, but that is not
+ // strictly necessary for API Level >= 31. See QTBUG-112164.
+ static QString fineLocation = u"android.permission.ACCESS_FINE_LOCATION"_s;
+
+ if (QtAndroidPrivate::androidSdkVersion() < 31) {
+ return {bluetoothGeneral, fineLocation};
+ } else {
+ const auto modes = permission.communicationModes();
+ QStringList permissionList;
+ if (modes & QBluetoothPermission::Advertise)
+ permissionList << bluetoothAdvertise;
+ if (modes & QBluetoothPermission::Access)
+ permissionList << bluetoothScan << bluetoothConnect << fineLocation;
+ return permissionList;
+ }
+}
+
+static QStringList nativeStringsFromPermission(const QPermission &permission)
+{
+ const auto id = permission.type().id();
+ if (id == qMetaTypeId<QLocationPermission>()) {
+ return nativeLocationPermission(*permission.value<QLocationPermission>());
+ } else if (id == qMetaTypeId<QCameraPermission>()) {
+ return { u"android.permission.CAMERA"_s };
+ } else if (id == qMetaTypeId<QMicrophonePermission>()) {
+ return { u"android.permission.RECORD_AUDIO"_s };
+ } else if (id == qMetaTypeId<QBluetoothPermission>()) {
+ return nativeBluetoothPermission(*permission.value<QBluetoothPermission>());
+ } else if (id == qMetaTypeId<QContactsPermission>()) {
+ const auto readContactsString = u"android.permission.READ_CONTACTS"_s;
+ switch (permission.value<QContactsPermission>()->accessMode()) {
+ case QContactsPermission::AccessMode::ReadOnly:
+ return { readContactsString };
+ case QContactsPermission::AccessMode::ReadWrite:
+ return { readContactsString, u"android.permission.WRITE_CONTACTS"_s };
+ }
+ Q_UNREACHABLE_RETURN({});
+ } else if (id == qMetaTypeId<QCalendarPermission>()) {
+ const auto readContactsString = u"android.permission.READ_CALENDAR"_s;
+ switch (permission.value<QCalendarPermission>()->accessMode()) {
+ case QCalendarPermission::AccessMode::ReadOnly:
+ return { readContactsString };
+ case QCalendarPermission::AccessMode::ReadWrite:
+ return { readContactsString, u"android.permission.WRITE_CALENDAR"_s };
+ }
+ Q_UNREACHABLE_RETURN({});
+ }
+
+ return {};
+}
+
+static Qt::PermissionStatus
+permissionStatusForAndroidResult(QtAndroidPrivate::PermissionResult result)
+{
+ switch (result) {
+ case QtAndroidPrivate::PermissionResult::Authorized: return Qt::PermissionStatus::Granted;
+ case QtAndroidPrivate::PermissionResult::Denied: return Qt::PermissionStatus::Denied;
+ default: return Qt::PermissionStatus::Undetermined;
+ }
+}
+
+using PermissionStatusHash = QHash<int, Qt::PermissionStatus>;
+Q_GLOBAL_STATIC_WITH_ARGS(PermissionStatusHash, g_permissionStatusHash, ({
+ { qMetaTypeId<QCameraPermission>(), Qt::PermissionStatus::Undetermined },
+ { qMetaTypeId<QMicrophonePermission>(), Qt::PermissionStatus::Undetermined },
+ { qMetaTypeId<QBluetoothPermission>(), Qt::PermissionStatus::Undetermined },
+ { qMetaTypeId<QContactsPermission>(), Qt::PermissionStatus::Undetermined },
+ { qMetaTypeId<QCalendarPermission>(), Qt::PermissionStatus::Undetermined },
+ { qMetaTypeId<QLocationPermission>(), Qt::PermissionStatus::Undetermined }
+}));
+
+static Qt::PermissionStatus
+getCombinedStatus(const QList<QtAndroidPrivate::PermissionResult> &androidResults)
+{
+ // Android returns only Denied or Granted
+ for (const auto &result : androidResults) {
+ const auto status = permissionStatusForAndroidResult(result);
+ if (status == Qt::PermissionStatus::Denied)
+ return status;
+ }
+ return Qt::PermissionStatus::Granted;
+}
+
+namespace QPermissions::Private
+{
+ Qt::PermissionStatus checkPermission(const QPermission &permission)
+ {
+ const auto nativePermissionList = nativeStringsFromPermission(permission);
+ if (nativePermissionList.isEmpty())
+ return Qt::PermissionStatus::Granted;
+
+ QList<QtAndroidPrivate::PermissionResult> androidResults;
+ androidResults.reserve(nativePermissionList.size());
+ for (const auto &nativePermission : nativePermissionList)
+ androidResults.push_back(QtAndroidPrivate::checkPermission(nativePermission).result());
+
+ const auto status = getCombinedStatus(androidResults);
+ const auto it = g_permissionStatusHash->constFind(permission.type().id());
+ const bool foundStatus = (it != g_permissionStatusHash->constEnd());
+ const bool itUndetermined = foundStatus && (*it) == Qt::PermissionStatus::Undetermined;
+ if (status == Qt::PermissionStatus::Denied && itUndetermined)
+ return Qt::PermissionStatus::Undetermined;
+ return status;
+ }
+
+ void requestPermission(const QPermission &permission,
+ const QPermissions::Private::PermissionCallback &callback)
+ {
+ const auto nativePermissionList = nativeStringsFromPermission(permission);
+ if (nativePermissionList.isEmpty()) {
+ callback(Qt::PermissionStatus::Granted);
+ return;
+ }
+
+ QtAndroidPrivate::requestPermissions(nativePermissionList).then(qApp,
+ [callback, permission](QFuture<QtAndroidPrivate::PermissionResult> future) {
+ const auto androidResults = future.isValid() ? future.results()
+ : QList{QtAndroidPrivate::Denied};
+ const auto status = getCombinedStatus(androidResults);
+ g_permissionStatusHash->insert(permission.type().id(), status);
+ callback(status);
+ }
+ );
+ }
+}
+
+QT_END_NAMESPACE
diff --git a/src/corelib/kernel/qpermissions_darwin.mm b/src/corelib/kernel/qpermissions_darwin.mm
new file mode 100644
index 0000000000..ae2cb2c423
--- /dev/null
+++ b/src/corelib/kernel/qpermissions_darwin.mm
@@ -0,0 +1,88 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#include "qpermissions.h"
+#include "qpermissions_p.h"
+
+#include <QtCore/private/qfactoryloader_p.h>
+#include <QtCore/private/qcoreapplication_p.h>
+#include <QtCore/qcborarray.h>
+
+QT_BEGIN_NAMESPACE
+
+using namespace Qt::StringLiterals;
+
+namespace {
+
+Q_GLOBAL_STATIC_WITH_ARGS(QFactoryLoader, pluginLoader,
+ (QPermissionPluginInterface_iid, QLatin1String("/permissions"), Qt::CaseInsensitive))
+
+QPermissionPlugin *permissionPlugin(const QPermission &permission)
+{
+ static QMutex mutex;
+ QMutexLocker locker(&mutex);
+
+ const char *permissionType = permission.type().name();
+ qCDebug(lcPermissions, "Looking for permission plugin for %s", permissionType);
+
+ if (Q_UNLIKELY(!pluginLoader)) {
+ qCWarning(lcPermissions, "Cannot check or request permissions during application shutdown");
+ return nullptr;
+ }
+
+ auto metaDataList = pluginLoader()->metaData();
+ for (int i = 0; i < metaDataList.size(); ++i) {
+ auto metaData = metaDataList.at(i).value(QtPluginMetaDataKeys::MetaData).toMap();
+ auto permissions = metaData.value("Permissions"_L1).toArray();
+ if (permissions.contains(QString::fromUtf8(permissionType))) {
+ auto className = metaDataList.at(i).value(QtPluginMetaDataKeys::ClassName).toString();
+ qCDebug(lcPermissions) << "Found matching plugin" << qUtf8Printable(className);
+ auto *plugin = static_cast<QPermissionPlugin*>(pluginLoader()->instance(i));
+ if (!plugin->parent()) {
+ // We want to re-parent the plugin to the factory loader, so that it's
+ // cleaned up properly. To do so we first need to move the plugin to the
+ // same thread as the factory loader, as the plugin might be instantiated
+ // on a secondary thread if triggered from a checkPermission call (which
+ // is allowed on any thread).
+ plugin->moveToThread(pluginLoader->thread());
+
+ // Also, as setParent will involve sending a ChildAdded event to the parent,
+ // we need to make the call on the same thread as the parent lives, as events
+ // are not allowed to be sent to an object owned by another thread.
+ QMetaObject::invokeMethod(plugin, [=] {
+ plugin->setParent(pluginLoader);
+ });
+ }
+ return plugin;
+ }
+ }
+
+ qCWarning(lcPermissions).nospace() << "Could not find permission plugin for "
+ << permission.type().name() << ". Please make sure you have included the "
+ << "required usage description in your Info.plist";
+
+ return nullptr;
+}
+
+} // Unnamed namespace
+
+namespace QPermissions::Private
+{
+ Qt::PermissionStatus checkPermission(const QPermission &permission)
+ {
+ if (auto *plugin = permissionPlugin(permission))
+ return plugin->checkPermission(permission);
+ else
+ return Qt::PermissionStatus::Denied;
+ }
+
+ void requestPermission(const QPermission &permission, const QPermissions::Private::PermissionCallback &callback)
+ {
+ if (auto *plugin = permissionPlugin(permission))
+ plugin->requestPermission(permission, callback);
+ else
+ callback(Qt::PermissionStatus::Denied);
+ }
+}
+
+QT_END_NAMESPACE
diff --git a/src/corelib/kernel/qpermissions_p.h b/src/corelib/kernel/qpermissions_p.h
new file mode 100644
index 0000000000..36f497f198
--- /dev/null
+++ b/src/corelib/kernel/qpermissions_p.h
@@ -0,0 +1,55 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QPERMISSIONS_P_H
+#define QPERMISSIONS_P_H
+
+#include "qpermissions.h"
+
+#include <private/qglobal_p.h>
+#include <QtCore/qloggingcategory.h>
+
+#include <QtCore/QObject>
+
+#include <functional>
+
+QT_REQUIRE_CONFIG(permissions);
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+QT_BEGIN_NAMESPACE
+
+Q_DECLARE_EXPORTED_LOGGING_CATEGORY(lcPermissions, Q_CORE_EXPORT)
+
+namespace QPermissions::Private
+{
+ using PermissionCallback = std::function<void(Qt::PermissionStatus)>;
+
+ Qt::PermissionStatus checkPermission(const QPermission &permission);
+ void requestPermission(const QPermission &permission, const PermissionCallback &callback);
+}
+
+#define QPermissionPluginInterface_iid "org.qt-project.QPermissionPluginInterface.6.5"
+
+class Q_CORE_EXPORT QPermissionPlugin : public QObject
+{
+public:
+ virtual ~QPermissionPlugin();
+
+ virtual Qt::PermissionStatus checkPermission(const QPermission &permission) = 0;
+ virtual void requestPermission(const QPermission &permission,
+ const QPermissions::Private::PermissionCallback &callback) = 0;
+};
+
+QT_END_NAMESPACE
+
+#endif // QPERMISSIONS_P_H
diff --git a/src/corelib/kernel/qpermissions_wasm.cpp b/src/corelib/kernel/qpermissions_wasm.cpp
new file mode 100644
index 0000000000..846e62ccf7
--- /dev/null
+++ b/src/corelib/kernel/qpermissions_wasm.cpp
@@ -0,0 +1,275 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#include <private/qpermissions_p.h>
+#include <private/qstdweb_p.h>
+
+#include <qglobalstatic.h>
+#include <qpermissions.h>
+#include <qmetaobject.h>
+#include <qnamespace.h>
+#include <qmetatype.h>
+#include <qstring.h>
+#include <qtimer.h>
+#include <qhash.h>
+
+#include <emscripten.h>
+#include <emscripten/bind.h>
+#include <emscripten/val.h>
+
+#include <utility>
+#include <string>
+#include <queue>
+
+QT_BEGIN_NAMESPACE
+
+using namespace QPermissions::Private;
+using namespace emscripten;
+
+namespace
+{
+ constexpr const char *wapiGranted = "granted";
+ constexpr const char *wapiDenied = "denied";
+ constexpr const char *wapiPrompt = "prompt";
+ constexpr const char *wapiCamera = "camera";
+ constexpr const char *wapiVideoCapture = "video_capture"; // Alternative to "camera".
+ constexpr const char *wapiMicrophone = "microphone";
+ constexpr const char *wapiAudioCapture = "audio_capture"; // Alternative to "microphone".
+ constexpr const char *wapiGeolocation = "geolocation";
+
+ void updatePermission(const std::string &name, const std::string &state,
+ PermissionCallback callback);
+
+ void checkPermission(const std::string &permissionName)
+ {
+ val permissions = val::global("navigator")["permissions"];
+ if (permissions.isUndefined() || permissions.isNull())
+ return;
+
+ qstdweb::PromiseCallbacks callbacks;
+ callbacks.thenFunc = [permissionName](val permissionState)
+ {
+ updatePermission(permissionName, permissionState["state"].as<std::string>(), {});
+ };
+ callbacks.catchFunc = [permissionName](val)
+ {
+ updatePermission(permissionName, wapiDenied, {});
+ };
+
+ val query = val::object();
+ query.set("name", val(permissionName));
+
+ qstdweb::Promise::make(permissions, QStringLiteral("query"), callbacks, query);
+ }
+
+ void checkPermissions()
+ {
+ checkPermission(wapiCamera);
+ checkPermission(wapiMicrophone);
+ checkPermission(wapiGeolocation);
+ }
+
+ void bootstrapCheckPermissions()
+ {
+ QTimer::singleShot(0, []{checkPermissions();});
+ }
+
+ Q_CONSTRUCTOR_FUNCTION(bootstrapCheckPermissions);
+
+ int permissionTypeIdFromString(const std::string &permission)
+ {
+ if (permission == wapiCamera || permission == wapiVideoCapture)
+ return qMetaTypeId<QCameraPermission>();
+ if (permission == wapiMicrophone || permission == wapiAudioCapture)
+ return qMetaTypeId<QMicrophonePermission>();
+ if (permission == wapiGeolocation)
+ return qMetaTypeId<QLocationPermission>();
+
+ qCWarning(lcPermissions, "Unknown permission type '%s'", permission.c_str());
+
+ return -1;
+ }
+
+ Qt::PermissionStatus permissionStatusFromString(const std::string &state)
+ {
+ if (state == wapiGranted)
+ return Qt::PermissionStatus::Granted;
+ if (state == wapiDenied)
+ return Qt::PermissionStatus::Denied;
+ if (state == wapiPrompt)
+ return Qt::PermissionStatus::Undetermined;
+
+ qCWarning(lcPermissions, "Unknown permission state '%s'", state.c_str());
+
+ return Qt::PermissionStatus::Denied;
+ }
+
+ using PermissionHash = QHash<int, Qt::PermissionStatus>;
+ Q_GLOBAL_STATIC(PermissionHash, permissionStatuses);
+
+ void updatePermission(const std::string &name, const std::string &state, PermissionCallback callback)
+ {
+ qCDebug(lcPermissions) << "Updating" << name << "permission to" << state;
+
+ const int type = permissionTypeIdFromString(name);
+ if (type == -1)
+ return; // Unknown permission type
+
+ const auto status = permissionStatusFromString(state);
+ (*permissionStatuses)[type] = status;
+
+ if (callback)
+ callback(status);
+ }
+
+ void requestMediaDevicePermission(const std::string &device, const PermissionCallback &cb)
+ {
+ Q_ASSERT(cb);
+
+ val mediaDevices = val::global("navigator")["mediaDevices"];
+ if (mediaDevices.isUndefined())
+ return cb(Qt::PermissionStatus::Denied);
+
+ qstdweb::PromiseCallbacks queryCallbacks;
+ queryCallbacks.thenFunc = [device, cb](val)
+ {
+ updatePermission(device, wapiGranted, cb);
+ };
+ queryCallbacks.catchFunc = [device, cb](val error)
+ {
+ if (error["name"].as<std::string>() == "NotAllowedError")
+ return updatePermission(device, wapiDenied, cb);
+ updatePermission(device, wapiPrompt, cb);
+ };
+
+ val constraint = val::object();
+ if (device == wapiCamera)
+ constraint.set("video", true);
+ else
+ constraint.set("audio", true);
+
+ qstdweb::Promise::make(mediaDevices, QStringLiteral("getUserMedia"), queryCallbacks, constraint);
+ }
+
+ using GeoRequest = std::pair<QPermission, PermissionCallback>;
+ Q_GLOBAL_STATIC(std::deque<GeoRequest>, geolocationRequestQueue);
+
+ bool processingLocationRequest = false;
+
+ void processNextGeolocationRequest();
+
+ void geolocationSuccess(val position)
+ {
+ Q_UNUSED(position);
+ Q_ASSERT(geolocationRequestQueue->size());
+
+ processingLocationRequest = false;
+
+ auto cb = geolocationRequestQueue->front().second;
+ geolocationRequestQueue->pop_front();
+ updatePermission(wapiGeolocation, wapiGranted, cb);
+ processNextGeolocationRequest();
+ }
+
+ void geolocationError(val error)
+ {
+ Q_ASSERT(geolocationRequestQueue->size());
+
+ static int deniedError = []
+ {
+ val posErr = val::global("GeolocationPositionError");
+ if (posErr.isUndefined() || posErr.isNull())
+ return 1;
+ return posErr["PERMISSION_DENIED"].as<int>();
+ }();
+
+ processingLocationRequest = false;
+
+ auto cb = geolocationRequestQueue->front().second;
+ geolocationRequestQueue->pop_front();
+
+ const int errorCode = error["code"].as<int>();
+ updatePermission(wapiGeolocation, errorCode == deniedError ? wapiDenied : wapiPrompt, cb);
+ processNextGeolocationRequest();
+ }
+
+ EMSCRIPTEN_BINDINGS(qt_permissions) {
+ function("qtLocationSuccess", &geolocationSuccess);
+ function("qtLocationError", &geolocationError);
+ }
+
+ void processNextGeolocationRequest()
+ {
+ if (processingLocationRequest)
+ return;
+
+ if (geolocationRequestQueue->empty())
+ return;
+
+ processingLocationRequest = true;
+
+ val geolocation = val::global("navigator")["geolocation"];
+ Q_ASSERT(!geolocation.isUndefined());
+ Q_ASSERT(!geolocation.isNull());
+
+ const auto &permission = geolocationRequestQueue->front().first;
+ const auto locationPermission = *permission.value<QLocationPermission>();
+ const bool highAccuracy = locationPermission.accuracy() == QLocationPermission::Precise;
+
+ val options = val::object();
+ options.set("enableHighAccuracy", highAccuracy ? true : false);
+ geolocation.call<void>("getCurrentPosition", val::module_property("qtLocationSuccess"),
+ val::module_property("qtLocationError"), options);
+ }
+
+ void requestGeolocationPermission(const QPermission &permission, const PermissionCallback &cb)
+ {
+ Q_ASSERT(cb);
+ Q_UNUSED(permission);
+ Q_UNUSED(cb);
+
+ val geolocation = val::global("navigator")["geolocation"];
+ if (geolocation.isUndefined() || geolocation.isNull())
+ return cb(Qt::PermissionStatus::Denied);
+
+ if (processingLocationRequest)
+ qCWarning(lcPermissions, "Permission to access location requested, while another request is in progress");
+
+ geolocationRequestQueue->push_back(std::make_pair(permission, cb));
+ processNextGeolocationRequest();
+ }
+} // Unnamed namespace
+
+namespace QPermissions::Private
+{
+ Qt::PermissionStatus checkPermission(const QPermission &permission)
+ {
+ const auto it = permissionStatuses->find(permission.type().id());
+ return it != permissionStatuses->end() ? it.value() : Qt::PermissionStatus::Undetermined;
+ }
+
+ void requestPermission(const QPermission &permission, const PermissionCallback &callback)
+ {
+ Q_ASSERT(permission.type().isValid());
+ Q_ASSERT(callback);
+
+ const auto status = checkPermission(permission);
+ if (status != Qt::PermissionStatus::Undetermined)
+ return callback(status);
+
+ const int requestedTypeId = permission.type().id();
+ if (requestedTypeId == qMetaTypeId<QCameraPermission>())
+ return requestMediaDevicePermission(wapiCamera, callback);
+
+ if (requestedTypeId == qMetaTypeId<QMicrophonePermission>())
+ return requestMediaDevicePermission(wapiMicrophone, callback);
+
+ if (requestedTypeId == qMetaTypeId<QLocationPermission>())
+ return requestGeolocationPermission(permission, callback);
+
+ (*permissionStatuses)[requestedTypeId] = Qt::PermissionStatus::Denied;
+ callback(Qt::PermissionStatus::Denied);
+ }
+}
+
+QT_END_NAMESPACE
diff --git a/src/corelib/kernel/qpointer.h b/src/corelib/kernel/qpointer.h
index b877b56133..39e4ba3e0f 100644
--- a/src/corelib/kernel/qpointer.h
+++ b/src/corelib/kernel/qpointer.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QPOINTER_H
#define QPOINTER_H
@@ -54,15 +18,48 @@ class QPointer
{
static_assert(!std::is_pointer<T>::value, "QPointer's template type must not be a pointer type");
+ template <typename X>
+ using if_convertible = std::enable_if_t<std::is_convertible_v<X*, T*>, bool>;
+ template <typename X>
+ friend class QPointer;
+
using QObjectType =
typename std::conditional<std::is_const<T>::value, const QObject, QObject>::type;
QWeakPointer<QObjectType> wp;
public:
- QPointer() = default;
+ Q_NODISCARD_CTOR
+ QPointer() noexcept = default;
+ Q_NODISCARD_CTOR
+ constexpr QPointer(std::nullptr_t) noexcept : QPointer{} {}
+ Q_WEAK_OVERLOAD
+ Q_NODISCARD_CTOR
inline QPointer(T *p) : wp(p, true) { }
// compiler-generated copy/move ctor/assignment operators are fine!
// compiler-generated dtor is fine!
+ template <typename X, if_convertible<X> = true>
+ Q_NODISCARD_CTOR
+ QPointer(QPointer<X> &&other) noexcept
+ : wp(std::exchange(other.wp, nullptr).internalData(), true) {}
+ template <typename X, if_convertible<X> = true>
+ Q_NODISCARD_CTOR
+ QPointer(const QPointer<X> &other) noexcept
+ : wp(other.wp.internalData(), true) {}
+
+ template <typename X, if_convertible<X> = true>
+ QPointer &operator=(const QPointer<X> &other) noexcept
+ {
+ QPointer(other).swap(*this);
+ return *this;
+ }
+
+ template <typename X, if_convertible<X> = true>
+ QPointer &operator=(QPointer<X> &&other) noexcept
+ {
+ QPointer(std::move(other)).swap(*this);
+ return *this;
+ }
+
#ifdef Q_QDOC
// Stop qdoc from complaining about missing function
~QPointer();
@@ -73,27 +70,30 @@ public:
inline QPointer<T> &operator=(T* p)
{ wp.assign(static_cast<QObjectType*>(p)); return *this; }
- inline T* data() const
+ T* data() const noexcept
{ return static_cast<T*>(wp.internalData()); }
- inline T* get() const
+ T* get() const noexcept
{ return data(); }
- inline T* operator->() const
+ T* operator->() const noexcept
{ return data(); }
- inline T& operator*() const
+ T& operator*() const noexcept
{ return *data(); }
- inline operator T*() const
+ operator T*() const noexcept
{ return data(); }
- inline bool isNull() const
+ bool isNull() const noexcept
{ return wp.isNull(); }
- inline void clear()
+ void clear() noexcept
{ wp.clear(); }
+ friend void swap(QPointer &lhs, QPointer &rhs) noexcept
+ { lhs.swap(rhs); }
+
#define DECLARE_COMPARE_SET(T1, A1, T2, A2) \
- friend bool operator==(T1, T2) \
+ friend bool operator==(T1, T2) noexcept \
{ return A1 == A2; } \
- friend bool operator!=(T1, T2) \
+ friend bool operator!=(T1, T2) noexcept \
{ return A1 != A2; }
#define DECLARE_TEMPLATE_COMPARE_SET(T1, A1, T2, A2) \
@@ -122,10 +122,6 @@ qPointerFromVariant(const QVariant &variant)
return QPointer<T>{qobject_cast<T*>(QtPrivate::EnableInternalData::internalData(wp))};
}
-template <class T>
-inline void swap(QPointer<T> &p1, QPointer<T> &p2) noexcept
-{ p1.swap(p2); }
-
QT_END_NAMESPACE
#endif // QT_NO_QOBJECT
diff --git a/src/corelib/kernel/qpointer.cpp b/src/corelib/kernel/qpointer.qdoc
index 737d73c4b8..9e4c9b2658 100644
--- a/src/corelib/kernel/qpointer.cpp
+++ b/src/corelib/kernel/qpointer.qdoc
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
\class QPointer
@@ -112,6 +76,7 @@
/*!
\fn template <class T> QPointer<T>::QPointer()
+ \fn template <class T> QPointer<T>::QPointer(std::nullptr_t)
Constructs a guarded pointer with value \nullptr.
@@ -134,6 +99,42 @@
*/
/*!
+ \fn template <class T> template <typename X, QPointer<T>::if_convertible<X> = true> QPointer<T>::QPointer(QPointer<X> &&other)
+ \fn template <class T> template <typename X, QPointer<T>::if_convertible<X> = true> QPointer<T>::QPointer(const QPointer<X> &other)
+ \since 6.6
+
+ Conversion constructor. Constructs a new QPointer by moving or copying from
+ \a other.
+
+ The moved-from QPointer is reset to nullptr.
+
+ \note These constructors participate in overload resolution only if \c{X*}
+ is convertible to \c{T*}.
+*/
+
+/*!
+ \fn template <class T> template <typename X, QPointer<T>::if_convertible<X> = true> QPointer<T> &QPointer<T>::operator=(const QPointer<X> &other)
+ \since 6.6
+
+ Conversion assignment operator. Makes this guarded pointer guard the
+ same object guarded by \a other.
+
+ \note This operator participates in overload resolution only if \c{X*}
+ is convertible to \c{T*}.
+*/
+
+/*!
+ \fn template <class T> template <typename X, QPointer<T>::if_convertible<X> = true> &QPointer<T>::operator=(QPointer<X> &&other)
+ \since 6.6.1
+
+ Conversion move-assignment operator. Makes this guarded pointer guard the
+ same object guarded by \a other and resets \a other to nullptr.
+
+ \note This operator participates in overload resolution only if \c{X*}
+ is convertible to \c{T*}.
+*/
+
+/*!
\fn template <class T> void QPointer<T>::swap(QPointer &other)
\since 5.6
@@ -201,7 +202,7 @@
*/
/*!
- \fn template <typename T, typename X> bool QPointer<T>::operator==(X *o, const QPointer<T> &p)
+ \fn template <typename T> template<typename X> bool QPointer<T>::operator==(X *o, const QPointer<T> &p)
Equality operator. Returns \c true if \a o and the guarded
pointer \a p are pointing to the same object, otherwise
@@ -209,7 +210,7 @@
*/
/*!
- \fn template <typename T, typename X> bool QPointer<T>::operator==(const QPointer<T> &p, X *o)
+ \fn template <typename T> template<typename X> bool QPointer<T>::operator==(const QPointer<T> &p, X *o)
Equality operator. Returns \c true if \a o and the guarded
pointer \a p are pointing to the same object, otherwise
@@ -217,7 +218,7 @@
*/
/*!
- \fn template <typename T, typename X> bool QPointer<T>::operator==(const QPointer<T> &p1, const QPointer<X> &p2)
+ \fn template <typename T> template<typename X> bool QPointer<T>::operator==(const QPointer<T> &p1, const QPointer<X> &p2)
Equality operator. Returns \c true if the guarded pointers \a p1 and \a p2
are pointing to the same object, otherwise
@@ -240,21 +241,21 @@
*/
/*!
- \fn template <typename T, typename X> bool QPointer<T>::operator!=(const QPointer<T> &p, X *o)
+ \fn template <typename T> template<typename X> bool QPointer<T>::operator!=(const QPointer<T> &p, X *o)
Inequality operator. Returns \c true if \a o and the guarded
pointer \a p are not pointing to the same object, otherwise
returns \c false.
*/
/*!
- \fn template <typename T, typename X> bool QPointer<T>::operator!=(X *o, const QPointer<T> &p)
+ \fn template <typename T> template<typename X> bool QPointer<T>::operator!=(X *o, const QPointer<T> &p)
Inequality operator. Returns \c true if \a o and the guarded
pointer \a p are not pointing to the same object, otherwise
returns \c false.
*/
/*!
- \fn template <typename T, typename X> bool QPointer<T>::operator!=(const QPointer<T> &p1, const QPointer<X> &p2)
+ \fn template <typename T> template<typename X> bool QPointer<T>::operator!=(const QPointer<T> &p1, const QPointer<X> &p2)
Inequality operator. Returns \c true if the guarded pointers \a p1 and
\a p2 are not pointing to the same object, otherwise
diff --git a/src/corelib/kernel/qpoll.cpp b/src/corelib/kernel/qpoll.cpp
index f41c413db6..58fb0234b4 100644
--- a/src/corelib/kernel/qpoll.cpp
+++ b/src/corelib/kernel/qpoll.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qcore_unix_p.h"
@@ -90,7 +54,7 @@ static inline void qt_poll_examine_ready_read(struct pollfd &pfd)
int res;
char data;
- EINTR_LOOP(res, ::recv(pfd.fd, &data, sizeof(data), MSG_PEEK));
+ QT_EINTR_LOOP(res, ::recv(pfd.fd, &data, sizeof(data), MSG_PEEK));
const int error = (res < 0) ? errno : 0;
if (res == 0) {
@@ -145,7 +109,7 @@ static inline bool qt_poll_is_bad_fd(int fd)
#endif
int ret;
- EINTR_LOOP(ret, fcntl(fd, F_GETFD));
+ QT_EINTR_LOOP(ret, fcntl(fd, F_GETFD));
return (ret == -1 && errno == EBADF);
}
@@ -192,6 +156,11 @@ int qt_poll(struct pollfd *fds, nfds_t nfds, const struct timespec *timeout_ts)
if (fds[i].fd < 0)
continue;
+ if (fds[i].fd > FD_SETSIZE) {
+ errno = EINVAL;
+ return -1;
+ }
+
if (fds[i].events & QT_POLL_EVENTS_MASK)
continue;
diff --git a/src/corelib/kernel/qpoll_p.h b/src/corelib/kernel/qpoll_p.h
index cb6ad82ae7..7c7fa7a5a3 100644
--- a/src/corelib/kernel/qpoll_p.h
+++ b/src/corelib/kernel/qpoll_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QPOLL_P_H
#define QPOLL_P_H
@@ -51,7 +15,7 @@
// We mean it.
//
-#include <QtCore/qglobal.h>
+#include <QtCore/private/qglobal_p.h>
QT_BEGIN_NAMESPACE
diff --git a/src/corelib/kernel/qproperty.cpp b/src/corelib/kernel/qproperty.cpp
index a4135b1f6f..caa9fce787 100644
--- a/src/corelib/kernel/qproperty.cpp
+++ b/src/corelib/kernel/qproperty.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qproperty.h"
#include "qproperty_p.h"
@@ -44,6 +8,9 @@
#include <QScopeGuard>
#include <QtCore/qloggingcategory.h>
#include <QThread>
+#include <QtCore/qmetaobject.h>
+
+#include "qobject_p.h"
QT_BEGIN_NAMESPACE
@@ -60,9 +27,9 @@ void QPropertyBindingPrivatePtr::reset(QtPrivate::RefCounted *ptr) noexcept
{
if (ptr != d) {
if (ptr)
- ptr->ref++;
- auto *old = qExchange(d, ptr);
- if (old && (--old->ref == 0))
+ ptr->addRef();
+ auto *old = std::exchange(d, ptr);
+ if (old && !old->deref())
QPropertyBindingPrivate::destroyAndFreeMemory(static_cast<QPropertyBindingPrivate *>(d));
}
}
@@ -154,7 +121,7 @@ struct QPropertyDelayedNotifications
Change notifications are sent later with notify (following the logic of separating
binding updates and notifications used in non-deferred updates).
*/
- void evaluateBindings(int index, QBindingStatus *status) {
+ void evaluateBindings(PendingBindingObserverList &bindingObservers, qsizetype index, QBindingStatus *status) {
auto *delayed = delayedProperties + index;
auto *bindingData = delayed->originalBindingData;
if (!bindingData)
@@ -170,7 +137,7 @@ struct QPropertyDelayedNotifications
QPropertyBindingDataPointer bindingDataPointer{bindingData};
QPropertyObserverPointer observer = bindingDataPointer.firstObserver();
if (observer)
- observer.evaluateBindings(status);
+ observer.evaluateBindings(bindingObservers, status);
}
/*!
@@ -182,23 +149,23 @@ struct QPropertyDelayedNotifications
\li sends any pending notifications.
\endlist
*/
- void notify(int index) {
+ void notify(qsizetype index) {
auto *delayed = delayedProperties + index;
- auto *bindingData = delayed->originalBindingData;
- if (!bindingData)
+ if (delayed->d_ptr & QPropertyBindingData::BindingBit)
+ return; // already handled
+ if (!delayed->originalBindingData)
return;
-
delayed->originalBindingData = nullptr;
+
+ QPropertyObserverPointer observer { reinterpret_cast<QPropertyObserver *>(delayed->d_ptr & ~QPropertyBindingData::DelayedNotificationBit) };
delayed->d_ptr = 0;
- QPropertyBindingDataPointer bindingDataPointer{bindingData};
- QPropertyObserverPointer observer = bindingDataPointer.firstObserver();
if (observer)
observer.notify(delayed->propertyData);
}
};
-static thread_local QBindingStatus bindingStatus;
+Q_CONSTINIT static thread_local QBindingStatus bindingStatus;
/*!
\since 6.2
@@ -218,7 +185,7 @@ static thread_local QBindingStatus bindingStatus;
properties need to be updated, preventing any external observer from noticing an inconsistent
state.
- \sa Qt::endPropertyUpdateGroup
+ \sa Qt::endPropertyUpdateGroup, QScopedPropertyUpdateGroup
*/
void Qt::beginPropertyUpdateGroup()
{
@@ -238,7 +205,7 @@ void Qt::beginPropertyUpdateGroup()
\warning Calling endPropertyUpdateGroup without a preceding call to beginPropertyUpdateGroup
results in undefined behavior.
- \sa Qt::beginPropertyUpdateGroup
+ \sa Qt::beginPropertyUpdateGroup, QScopedPropertyUpdateGroup
*/
void Qt::endPropertyUpdateGroup()
{
@@ -249,24 +216,69 @@ void Qt::endPropertyUpdateGroup()
if (--data->ref)
return;
groupUpdateData = nullptr;
+ // ensures that bindings are kept alive until endPropertyUpdateGroup concludes
+ PendingBindingObserverList bindingObservers;
// update all delayed properties
auto start = data;
while (data) {
- for (int i = 0; i < data->used; ++i)
- data->evaluateBindings(i, status);
+ for (qsizetype i = 0; i < data->used; ++i)
+ data->evaluateBindings(bindingObservers, i, status);
data = data->next;
}
- // notify all delayed properties
+ // notify all delayed notifications from binding evaluation
+ for (const QBindingObserverPtr &observer: bindingObservers) {
+ QPropertyBindingPrivate *binding = observer.binding();
+ binding->notifyNonRecursive();
+ }
+ // do the same for properties which only have observers
data = start;
while (data) {
- for (int i = 0; i < data->used; ++i)
+ for (qsizetype i = 0; i < data->used; ++i)
data->notify(i);
- auto *next = data->next;
- delete data;
- data = next;
+ delete std::exchange(data, data->next);
}
}
+/*!
+ \since 6.6
+ \class QScopedPropertyUpdateGroup
+ \inmodule QtCore
+ \ingroup tools
+ \brief RAII class around Qt::beginPropertyUpdateGroup()/Qt::endPropertyUpdateGroup().
+
+ This class calls Qt::beginPropertyUpdateGroup() in its constructor and
+ Qt::endPropertyUpdateGroup() in its destructor, making sure the latter
+ function is reliably called even in the presence of early returns or thrown
+ exceptions.
+
+ \note Qt::endPropertyUpdateGroup() may re-throw exceptions thrown by
+ binding evaluations. This means your application may crash
+ (\c{std::terminate()} called) if another exception is causing
+ QScopedPropertyUpdateGroup's destructor to be called during stack
+ unwinding. If you expect exceptions from binding evaluations, use manual
+ Qt::endPropertyUpdateGroup() calls and \c{try}/\c{catch} blocks.
+
+ \sa QProperty
+*/
+
+/*!
+ \fn QScopedPropertyUpdateGroup::QScopedPropertyUpdateGroup()
+
+ Calls Qt::beginPropertyUpdateGroup().
+*/
+
+/*!
+ \fn QScopedPropertyUpdateGroup::~QScopedPropertyUpdateGroup()
+
+ Calls Qt::endPropertyUpdateGroup().
+*/
+
+
+// check everything stored in QPropertyBindingPrivate's union is trivially destructible
+// (though the compiler would also complain if that weren't the case)
+static_assert(std::is_trivially_destructible_v<QPropertyBindingSourceLocation>);
+static_assert(std::is_trivially_destructible_v<std::byte[sizeof(QPropertyBindingSourceLocation)]>);
+
QPropertyBindingPrivate::~QPropertyBindingPrivate()
{
if (firstObserver)
@@ -276,25 +288,51 @@ QPropertyBindingPrivate::~QPropertyBindingPrivate()
+ QPropertyBindingPrivate::getSizeEnsuringAlignment());
}
+void QPropertyBindingPrivate::clearDependencyObservers() {
+ for (size_t i = 0; i < qMin(dependencyObserverCount, inlineDependencyObservers.size()); ++i) {
+ QPropertyObserverPointer p{&inlineDependencyObservers[i]};
+ p.unlink_fast();
+ }
+ if (heapObservers)
+ heapObservers->clear();
+ dependencyObserverCount = 0;
+}
+
+QPropertyObserverPointer QPropertyBindingPrivate::allocateDependencyObserver_slow()
+{
+ ++dependencyObserverCount;
+ if (!heapObservers)
+ heapObservers.reset(new std::vector<QPropertyObserver>());
+ return {&heapObservers->emplace_back()};
+}
+
void QPropertyBindingPrivate::unlinkAndDeref()
{
clearDependencyObservers();
propertyDataPtr = nullptr;
- if (--ref == 0)
+ if (!deref())
destroyAndFreeMemory(this);
}
-void QPropertyBindingPrivate::evaluateRecursive(QBindingStatus *status)
+bool QPropertyBindingPrivate::evaluateRecursive(PendingBindingObserverList &bindingObservers, QBindingStatus *status)
{
if (!status)
status = &bindingStatus;
- return evaluateRecursive_inline(status);
+ return evaluateRecursive_inline(bindingObservers, status);
}
-void QPropertyBindingPrivate::notifyRecursive()
+void QPropertyBindingPrivate::notifyNonRecursive(const PendingBindingObserverList &bindingObservers)
+{
+ notifyNonRecursive();
+ for (auto &&bindingObserver: bindingObservers) {
+ bindingObserver.binding()->notifyNonRecursive();
+ }
+}
+
+QPropertyBindingPrivate::NotificationState QPropertyBindingPrivate::notifyNonRecursive()
{
if (!pendingNotify)
- return;
+ return Delayed;
pendingNotify = false;
Q_ASSERT(!updating);
updating = true;
@@ -305,6 +343,7 @@ void QPropertyBindingPrivate::notifyRecursive()
if (hasStaticObserver)
staticObserverCallback(propertyDataPtr);
updating = false;
+ return Sent;
}
/*!
@@ -416,7 +455,7 @@ QPropertyBindingError QUntypedPropertyBinding::error() const
/*!
Returns the meta-type of the binding.
- If the QUntypedProperyBinding is null, an invalid QMetaType is returned.
+ If the QUntypedPropertyBinding is null, an invalid QMetaType is returned.
*/
QMetaType QUntypedPropertyBinding::valueMetaType() const
{
@@ -428,6 +467,8 @@ QMetaType QUntypedPropertyBinding::valueMetaType() const
QPropertyBindingData::~QPropertyBindingData()
{
QPropertyBindingDataPointer d{this};
+ if (isNotificationDelayed())
+ proxyData()->originalBindingData = nullptr;
for (auto observer = d.firstObserver(); observer;) {
auto next = observer.nextObserver();
observer.unlink();
@@ -474,8 +515,9 @@ QUntypedPropertyBinding QPropertyBindingData::setBinding(const QUntypedPropertyB
newBindingRaw->prependObserver(observer);
newBindingRaw->setStaticObserver(staticObserverCallback, guardCallback);
- newBindingRaw->evaluateRecursive();
- newBindingRaw->notifyRecursive();
+ PendingBindingObserverList bindingObservers;
+ newBindingRaw->evaluateRecursive(bindingObservers);
+ newBindingRaw->notifyNonRecursive(bindingObservers);
} else if (observer) {
d.setObservers(observer.ptr);
} else {
@@ -561,6 +603,11 @@ void QPropertyBindingData::registerWithCurrentlyEvaluatingBinding_helper(Binding
{
QPropertyBindingDataPointer d{this};
+ if (currentState->alreadyCaptureProperties.contains(this))
+ return;
+ else
+ currentState->alreadyCaptureProperties.push_back(this);
+
QPropertyObserverPointer dependencyObserver = currentState->binding->allocateDependencyObserver();
Q_ASSERT(QPropertyObserver::ObserverNotifiesBinding == 0);
dependencyObserver.setBindingToNotify_unsafe(currentState->binding);
@@ -578,18 +625,31 @@ void QPropertyBindingData::notifyObservers(QUntypedPropertyData *propertyDataPtr
return;
QPropertyBindingDataPointer d{this};
+ PendingBindingObserverList bindingObservers;
if (QPropertyObserverPointer observer = d.firstObserver()) {
- if (notifyObserver_helper(propertyDataPtr, observer, storage) == Evaluated) {
- // evaluateBindings() can trash the observers. We need to re-fetch here.
+ if (notifyObserver_helper(propertyDataPtr, storage, observer, bindingObservers) == Evaluated) {
+ /* evaluateBindings() can trash the observers. We need to re-fetch here.
+ "this" might also no longer be valid in case we have a QObjectBindableProperty
+ and consequently d isn't either (this happens when binding evaluation has
+ caused the binding storage to resize.
+ If storage is nullptr, then there is no dynamically resizable storage,
+ and we cannot run into the issue.
+ */
+ if (storage)
+ d = QPropertyBindingDataPointer {storage->bindingData(propertyDataPtr)};
if (QPropertyObserverPointer observer = d.firstObserver())
observer.notify(propertyDataPtr);
+ for (auto &&bindingObserver: bindingObservers)
+ bindingObserver.binding()->notifyNonRecursive();
}
}
}
-QPropertyBindingData::NotificationResult QPropertyBindingData::notifyObserver_helper(
- QUntypedPropertyData *propertyDataPtr, QPropertyObserverPointer observer,
- QBindingStorage *storage) const
+QPropertyBindingData::NotificationResult QPropertyBindingData::notifyObserver_helper
+(
+ QUntypedPropertyData *propertyDataPtr, QBindingStorage *storage,
+ QPropertyObserverPointer observer,
+ PendingBindingObserverList &bindingObservers) const
{
#ifdef QT_HAS_FAST_CURRENT_THREAD_ID
QBindingStatus *status = storage ? storage->bindingStatus : nullptr;
@@ -604,7 +664,7 @@ QPropertyBindingData::NotificationResult QPropertyBindingData::notifyObserver_he
return Delayed;
}
- observer.evaluateBindings(status);
+ observer.evaluateBindings(bindingObservers, status);
return Evaluated;
}
@@ -615,11 +675,15 @@ QPropertyObserver::QPropertyObserver(ChangeHandler changeHandler)
d.setChangeHandler(changeHandler);
}
+#if QT_DEPRECATED_SINCE(6, 6)
QPropertyObserver::QPropertyObserver(QUntypedPropertyData *data)
{
+ QT_WARNING_PUSH QT_WARNING_DISABLE_DEPRECATED
aliasData = data;
next.setTag(ObserverIsAlias);
+ QT_WARNING_POP
}
+#endif
/*! \internal
*/
@@ -689,16 +753,9 @@ void QPropertyObserverPointer::setChangeHandler(QPropertyObserver::ChangeHandler
ptr->next.setTag(QPropertyObserver::ObserverNotifiesChangeHandler);
}
-void QPropertyObserverPointer::setBindingToNotify(QPropertyBindingPrivate *binding)
-{
- Q_ASSERT(ptr->next.tag() != QPropertyObserver::ObserverIsPlaceholder);
- ptr->binding = binding;
- ptr->next.setTag(QPropertyObserver::ObserverNotifiesBinding);
-}
-
/*!
\internal
- The same as as setBindingToNotify, but assumes that the tag is already correct.
+ The same as setBindingToNotify, but assumes that the tag is already correct.
*/
void QPropertyObserverPointer::setBindingToNotify_unsafe(QPropertyBindingPrivate *binding)
{
@@ -737,7 +794,7 @@ void QPropertyObserverPointer::noSelfDependencies(QPropertyBindingPrivate *bindi
}
#endif
-void QPropertyObserverPointer::evaluateBindings(QBindingStatus *status)
+void QPropertyObserverPointer::evaluateBindings(PendingBindingObserverList &bindingObservers, QBindingStatus *status)
{
Q_ASSERT(status);
auto observer = const_cast<QPropertyObserver*>(ptr);
@@ -748,7 +805,9 @@ void QPropertyObserverPointer::evaluateBindings(QBindingStatus *status)
if (QPropertyObserver::ObserverTag(observer->next.tag()) == QPropertyObserver::ObserverNotifiesBinding) {
auto bindingToEvaluate = observer->binding;
QPropertyObserverNodeProtector protector(observer);
- bindingToEvaluate->evaluateRecursive_inline(status);
+ QBindingObserverPtr bindingObserver(observer); // binding must not be gone after evaluateRecursive_inline
+ if (bindingToEvaluate->evaluateRecursive_inline(bindingObservers, status))
+ bindingObservers.push_back(std::move(bindingObserver));
next = protector.next();
}
@@ -1111,6 +1170,38 @@ QString QPropertyBindingError::description() const
*/
/*!
+ \fn template<typename T> QBindable<T>::QBindable(QObject *obj, const char *property)
+
+ Constructs a QBindable for the \l Q_PROPERTY \a property on \a obj. The property must
+ have a notify signal but does not need to have \c BINDABLE in its \c Q_PROPERTY
+ definition, so even binding unaware \c {Q_PROPERTY}s can be bound or used in binding
+ expressions. You must use \c QBindable::value() in binding expressions instead of the
+ normal property \c READ function (or \c MEMBER) to enable dependency tracking if the
+ property is not \c BINDABLE. When binding using a lambda, you may prefer to capture the
+ QBindable by value to avoid the cost of calling this constructor in the binding
+ expression.
+ This constructor should not be used to implement \c BINDABLE for a Q_PROPERTY, as the
+ resulting Q_PROPERTY will not support dependency tracking. To make a property that is
+ usable directly without reading through a QBindable use \l QProperty or
+ \l QObjectBindableProperty.
+
+ \code
+ QProperty<QString> displayText;
+ QDateTimeEdit *dateTimeEdit = findDateTimeEdit();
+ QBindable<QDateTime> dateTimeBindable(dateTimeEdit, "dateTime");
+ displayText.setBinding([dateTimeBindable](){ return dateTimeBindable.value().toString(); });
+ \endcode
+
+ \sa QProperty, QObjectBindableProperty, {Qt Bindable Properties}
+*/
+
+/*!
+ \fn template<typename T> QBindable<T>::QBindable(QObject *obj, const QMetaProperty &property)
+
+ See \l QBindable::QBindable(QObject *obj, const char *property)
+*/
+
+/*!
\fn template<typename T> QPropertyBinding<T> QBindable<T>::makeBinding(const QPropertyBindingSourceLocation &location) const
Constructs a binding evaluating to the underlying property's value, using a specified source
@@ -1188,6 +1279,15 @@ QString QPropertyBindingError::description() const
dynamically, the binding expression. It is represented as a C++ lambda and
can be used to express relationships between different properties in your
application.
+
+ \note For QML, it's important to expose the \l QProperty in \l Q_PROPERTY
+ with the BINDABLE keyword. As a result, the QML engine uses
+ it as the bindable interface to set up the property binding. In turn, the
+ binding can then be interacted with C++ via the normal API:
+ QProperty<T>::onValueChanged, QProperty::takeBinding and QBindable::hasBinding
+ If the property is BINDABLE, the engine will use the change-tracking
+ inherent to the C++ property system for getting notified about changes, and it
+ won't rely on signals being emitted.
*/
/*!
@@ -1218,20 +1318,20 @@ QString QPropertyBindingError::description() const
/*!
\fn template <typename T> QProperty<T>::QProperty(const QPropertyBinding<T> &binding)
- Constructs a property that is tied to the provided \a binding expression. The
- first time the property value is read, the binding is evaluated. Whenever a
- dependency of the binding changes, the binding will be re-evaluated the next
- time the value of this property is read.
+ Constructs a property that is tied to the provided \a binding expression.
+ The property's value is set to the result of evaluating the new binding.
+ Whenever a dependency of the binding changes, the binding will be re-evaluated,
+ and the property's value gets updated accordingly.
*/
/*!
\fn template <typename T> template <typename Functor> QProperty<T>::QProperty(Functor &&f)
- Constructs a property that is tied to the provided binding expression \a f. The
- first time the property value is read, the binding is evaluated. Whenever a
- dependency of the binding changes, the binding will be re-evaluated the next
- time the value of this property is read.
-*/
+ Constructs a property that is tied to the provided binding expression \a f.
+ The property's value is set to the result of evaluating the new binding.
+ Whenever a dependency of the binding changes, the binding will be re-evaluated,
+ and the property's value gets updated accordingly.
+ */
/*!
\fn template <typename T> QProperty<T>::~QProperty()
@@ -1262,23 +1362,13 @@ QString QPropertyBindingError::description() const
*/
/*!
- \fn template <typename T> QProperty<T> &QProperty<T>::operator=(const QPropertyBinding<T> &newBinding)
-
- Associates the value of this property with the provided \a newBinding
- expression and returns a reference to this property. The first time the
- property value is read, the binding is evaluated. Whenever a dependency of the
- binding changes, the binding will be re-evaluated the next time the value of
- this property is read.
-*/
-
-/*!
\fn template <typename T> QPropertyBinding<T> QProperty<T>::setBinding(const QPropertyBinding<T> &newBinding)
Associates the value of this property with the provided \a newBinding
- expression and returns the previously associated binding. The first time the
- property value is read, the binding is evaluated. Whenever a dependency of the
- binding changes, the binding will be re-evaluated the next time the value of
- this property is read.
+ expression and returns the previously associated binding. The property's value
+ is set to the result of evaluating the new binding. Whenever a dependency of
+ the binding changes, the binding will be re-evaluated, and the property's
+ value gets updated accordingly.
*/
/*!
@@ -1286,10 +1376,10 @@ QString QPropertyBindingError::description() const
\overload
Associates the value of this property with the provided functor \a f and
- returns the previously associated binding. The first time the property value
- is read, the binding is evaluated by invoking the call operator () of \a f.
- Whenever a dependency of the binding changes, the binding will be re-evaluated
- the next time the value of this property is read.
+ returns the previously associated binding. The property's value is set to the
+ result of evaluating the new binding. Whenever a dependency of the binding
+ changes, the binding will be re-evaluated, and the property's value gets
+ updated accordingly.
\sa {Formulating a Property Binding}
*/
@@ -1299,9 +1389,10 @@ QString QPropertyBindingError::description() const
\overload
Associates the value of this property with the provided \a newBinding
- expression. The first time the property value is read, the binding is evaluated.
- Whenever a dependency of the binding changes, the binding will be re-evaluated
- the next time the value of this property is read.
+ expression. The property's value is set to the result of evaluating the new
+ binding. Whenever a dependency of the binding changes, the binding will be
+ re-evaluated, and the property's value gets updated accordingly.
+
Returns true if the type of this property is the same as the type the binding
function returns; false otherwise.
@@ -1330,27 +1421,29 @@ QString QPropertyBindingError::description() const
the value of the property changes. On each value change, the handler
is either called immediately, or deferred, depending on the context.
- The callback \a f is expected to be a type that has a plain call operator () without any
- parameters. This means that you can provide a C++ lambda expression, a std::function
- or even a custom struct with a call operator.
+ The callback \a f is expected to be a type that has a plain call operator
+ \c{()} without any parameters. This means that you can provide a C++ lambda
+ expression, a std::function or even a custom struct with a call operator.
- The returned property change handler object keeps track of the registration. When it
- goes out of scope, the callback is de-registered.
+ The returned property change handler object keeps track of the registration.
+ When it goes out of scope, the callback is de-registered.
*/
/*!
\fn template <typename T> template <typename Functor> QPropertyChangeHandler<T, Functor> QProperty<T>::subscribe(Functor f)
- Subscribes the given functor \a f as a callback that is called immediately and whenever
- the value of the property changes in the future. On each value change, the handler
- is either called immediately, or deferred, depending on the context.
+ Subscribes the given functor \a f as a callback that is called immediately and
+ whenever the value of the property changes in the future. On each value
+ change, the handler is either called immediately, or deferred, depending on
+ the context.
- The callback \a f is expected to be a type that can be copied and has a plain call
- operator() without any parameters. This means that you can provide a C++ lambda expression,
- a std::function or even a custom struct with a call operator.
+ The callback \a f is expected to be a type that can be copied and has a plain
+ call operator() without any parameters. This means that you can provide a C++
+ lambda expression, a std::function or even a custom struct with a call
+ operator.
- The returned property change handler object keeps track of the subscription. When it
- goes out of scope, the callback is unsubscribed.
+ The returned property change handler object keeps track of the subscription.
+ When it goes out of scope, the callback is unsubscribed.
*/
/*!
@@ -1359,15 +1452,16 @@ QString QPropertyBindingError::description() const
Subscribes the given functor \a f as a callback that is called whenever
the value of the property changes.
- The callback \a f is expected to be a type that has a plain call operator () without any
- parameters. This means that you can provide a C++ lambda expression, a std::function
- or even a custom struct with a call operator.
+ The callback \a f is expected to be a type that has a plain call operator
+ \c{()} without any parameters. This means that you can provide a C++ lambda
+ expression, a std::function or even a custom struct with a call operator.
- The returned property change handler object keeps track of the subscription. When it
- goes out of scope, the callback is unsubscribed.
+ The returned property change handler object keeps track of the subscription.
+ When it goes out of scope, the callback is unsubscribed.
- This method is in some cases easier to use than onValueChanged(), as the returned object is not a template.
- It can therefore more easily be stored, e.g. as a member in a class.
+ This method is in some cases easier to use than onValueChanged(), as the
+ returned object is not a template. It can therefore more easily be stored,
+ e.g. as a member in a class.
\sa onValueChanged(), subscribe()
*/
@@ -1380,8 +1474,9 @@ QString QPropertyBindingError::description() const
/*!
\class QObjectBindableProperty
\inmodule QtCore
- \brief The QObjectBindableProperty class is a template class that enables automatic property bindings
- for property data stored in QObject derived classes.
+ \brief The QObjectBindableProperty class is a template class that enables
+ automatic property bindings for property data stored in QObject derived
+ classes.
\since 6.0
\ingroup tools
@@ -1394,9 +1489,9 @@ QString QPropertyBindingError::description() const
The extra template parameters are used to identify the surrounding
class and a member function of that class acting as a change handler.
- You can use QObjectBindableProperty to add binding support to code that uses Q_PROPERTY.
- The getter and setter methods must be adapted carefully according to the
- rules described in \l {Bindable Property Getters and Setters}.
+ You can use QObjectBindableProperty to add binding support to code that uses
+ Q_PROPERTY. The getter and setter methods must be adapted carefully according
+ to the rules described in \l {Bindable Property Getters and Setters}.
In order to invoke the change signal on property changes, use
QObjectBindableProperty and pass the change signal as a callback.
@@ -1405,8 +1500,8 @@ QString QPropertyBindingError::description() const
\snippet code/src_corelib_kernel_qproperty.cpp 4
- QObjectBindableProperty is usually not used directly, instead an instance of it is created by
- using the Q_OBJECT_BINDABLE_PROPERTY macro.
+ QObjectBindableProperty is usually not used directly, instead an instance of
+ it is created by using the Q_OBJECT_BINDABLE_PROPERTY macro.
Use the Q_OBJECT_BINDABLE_PROPERTY macro in the class declaration to declare
the property as bindable.
@@ -1425,26 +1520,27 @@ QString QPropertyBindingError::description() const
\snippet code/src_corelib_kernel_qproperty.cpp 2
- The change handler can optionally accept one argument, of the same type as the property,
- in which case it is passed the new value of the property. Otherwise, it should take no
- arguments.
+ The change handler can optionally accept one argument, of the same type as the
+ property, in which case it is passed the new value of the property. Otherwise,
+ it should take no arguments.
If the property does not need a changed notification, you can leave out the
"NOTIFY xChanged" in the Q_PROPERTY macro as well as the last argument
of the Q_OBJECT_BINDABLE_PROPERTY and Q_OBJECT_BINDABLE_PROPERTY_WITH_ARGS
macros.
- \sa Q_OBJECT_BINDABLE_PROPERTY, Q_OBJECT_BINDABLE_PROPERTY_WITH_ARGS, QProperty,
- QObjectComputedProperty, {Qt's Property System}, {Qt Bindable Properties}
+ \sa Q_OBJECT_BINDABLE_PROPERTY, Q_OBJECT_BINDABLE_PROPERTY_WITH_ARGS,
+ QProperty, QObjectComputedProperty, {Qt's Property System}, {Qt Bindable
+ Properties}
*/
/*!
\macro Q_OBJECT_BINDABLE_PROPERTY(containingClass, type, name, signal)
\since 6.0
\relates QObjectBindableProperty
- \brief Declares a \l QObjectBindableProperty inside \a containingClass
- of type \a type with name \a name. If the optional argument \a signal is given,
- this signal will be emitted when the property is marked dirty.
+ \brief Declares a \l QObjectBindableProperty inside \a containingClass of type
+ \a type with name \a name. If the optional argument \a signal is given, this
+ signal will be emitted when the property is marked dirty.
\sa {Qt's Property System}, {Qt Bindable Properties}
*/
@@ -1578,13 +1674,13 @@ QString QPropertyBindingError::description() const
have changed. Whenever a bindable property used in the callback changes,
this happens automatically. If the result of the callback might change
because of a change in a value which is not a bindable property,
- it is the developer's responsibility to call markDirty
+ it is the developer's responsibility to call \c notify
on the QObjectComputedProperty object.
This will inform dependent properties about the potential change.
- Note that calling markDirty might trigger change handlers in dependent
+ Note that calling \c notify might trigger change handlers in dependent
properties, which might in turn use the object the QObjectComputedProperty
- is a member of. So markDirty must not be called when in a transitional
+ is a member of. So \c notify must not be called when in a transitional
or invalid state.
QObjectComputedProperty is not suitable for use with a computation that depends
@@ -1626,30 +1722,35 @@ QString QPropertyBindingError::description() const
/*!
\fn template <typename Class, typename T, auto offset, auto Callback> QObjectBindableProperty<Class, T, offset, Callback>::QObjectBindableProperty(Class *owner, const QPropertyBinding<T> &binding)
- Constructs a property that is tied to the provided \a binding expression. The
- first time the property value is read, the binding is evaluated. Whenever a
- dependency of the binding changes, the binding will be re-evaluated the next
- time the value of this property is read. When the property value changes \a
- owner is notified via the Callback function.
+ Constructs a property that is tied to the provided \a binding expression.
+ The property's value is set to the result of evaluating the new binding.
+ Whenever a dependency of the binding changes, the binding will be
+ re-evaluated, and the property's value gets updated accordingly.
+
+ When the property value changes, \a owner is notified via the Callback
+ function.
*/
/*!
\fn template <typename Class, typename T, auto offset, auto Callback> QObjectBindableProperty<Class, T, offset, Callback>::QObjectBindableProperty(Class *owner, QPropertyBinding<T> &&binding)
- Constructs a property that is tied to the provided \a binding expression. The
- first time the property value is read, the binding is evaluated. Whenever a
- dependency of the binding changes, the binding will be re-evaluated the next
- time the value of this property is read. When the property value changes \a
+ Constructs a property that is tied to the provided \a binding expression.
+ The property's value is set to the result of evaluating the new binding.
+ Whenever a dependency of the binding changes, the binding will be
+ re-evaluated, and the property's value gets updated accordingly.
+
+ When the property value changes, \a
owner is notified via the Callback function.
*/
/*!
\fn template <typename Class, typename T, auto offset, auto Callback> template <typename Functor> QObjectBindableProperty<Class, T, offset, Callback>::QObjectBindableProperty(Functor &&f)
- Constructs a property that is tied to the provided binding expression \a f. The
- first time the property value is read, the binding is evaluated. Whenever a
- dependency of the binding changes, the binding will be re-evaluated the next
- time the value of this property is read.
+ Constructs a property that is tied to the provided binding expression \a f.
+ The property's value is set to the result of evaluating the new binding.
+ Whenever a dependency of the binding changes, the binding will be
+ re-evaluated, and the property's value gets updated accordingly.
+
*/
/*!
@@ -1677,14 +1778,15 @@ QString QPropertyBindingError::description() const
/*!
\fn template <typename Class, typename T, auto offset, auto Callback> void QObjectBindableProperty<Class, T, offset, Callback>::notify()
- Programmatically signals a change of the property. Any binding which depend on it will
- be notified, and if the property has a signal, it will be emitted.
+ Programmatically signals a change of the property. Any binding which depend on
+ it will be notified, and if the property has a signal, it will be emitted.
- This can be useful in combination with setValueBypassingBindings to defer signalling the change
- until a class invariant has been restored.
+ This can be useful in combination with setValueBypassingBindings to defer
+ signalling the change until a class invariant has been restored.
- \note If this property has a binding (i.e. hasBinding() returns true), that binding is not reevaluated when
- notify() is called. Any binding depending on this property is still reevaluated as usual.
+ \note If this property has a binding (i.e. hasBinding() returns true), that
+ binding is not reevaluated when notify() is called. Any binding depending on
+ this property is still reevaluated as usual.
\sa Qt::beginPropertyUpdateGroup(), setValueBypassingBindings()
*/
@@ -1693,11 +1795,12 @@ QString QPropertyBindingError::description() const
\fn template <typename Class, typename T, auto offset, auto Callback> QPropertyBinding<T> QObjectBindableProperty<Class, T, offset, Callback>::setBinding(const QPropertyBinding<T> &newBinding)
Associates the value of this property with the provided \a newBinding
- expression and returns the previously associated binding. The first time the
- property value is read, the binding is evaluated. Whenever a dependency of the
- binding changes, the binding will be re-evaluated the next time the value of
- this property is read. When the property value changes, the owner is notified
- via the Callback function.
+ expression and returns the previously associated binding.
+ The property's value is set to the result of evaluating the new binding. Whenever a dependency of
+ the binding changes, the binding will be re-evaluated,
+ and the property's value gets updated accordingly.
+ When the property value changes, the owner
+ is notified via the Callback function.
*/
/*!
@@ -1705,11 +1808,13 @@ QString QPropertyBindingError::description() const
\overload
Associates the value of this property with the provided functor \a f and
- returns the previously associated binding. The first time the property value
- is read, the binding is evaluated by invoking the call operator () of \a f.
- Whenever a dependency of the binding changes, the binding will be re-evaluated
- the next time the value of this property is read. When the property value
- changes, the owner is notified via the Callback function.
+ returns the previously associated binding. The property's value is set to the
+ result of evaluating the new binding by invoking the call operator \c{()} of \a
+ f. Whenever a dependency of the binding changes, the binding will be
+ re-evaluated, and the property's value gets updated accordingly.
+
+ When the property value changes, the owner is notified via the Callback
+ function.
\sa {Formulating a Property Binding}
*/
@@ -1719,12 +1824,13 @@ QString QPropertyBindingError::description() const
\overload
Associates the value of this property with the provided \a newBinding
- expression. The first time the property value is read, the binding is evaluated.
- Whenever a dependency of the binding changes, the binding will be re-evaluated
- the next time the value of this property is read.
+ expression. The property's value is set to the result of evaluating the new
+ binding. Whenever a dependency of the binding changes, the binding will be
+ re-evaluated, and the property's value gets updated accordingly.
- Returns \c true if the type of this property is the same as the type the binding
- function returns; \c false otherwise.
+
+ Returns \c true if the type of this property is the same as the type the
+ binding function returns; \c false otherwise.
*/
/*!
@@ -1754,47 +1860,49 @@ QString QPropertyBindingError::description() const
\fn template <typename Class, typename T, auto offset, auto Callback> template <typename Functor> QPropertyChangeHandler<T, Functor> QObjectBindableProperty<Class, T, offset, Callback>::onValueChanged(Functor f)
Registers the given functor \a f as a callback that shall be called whenever
- the value of the property changes. On each value change, the handler
- is either called immediately, or deferred, depending on the context.
+ the value of the property changes. On each value change, the handler is either
+ called immediately, or deferred, depending on the context.
- The callback \a f is expected to be a type that has a plain call operator () without any
- parameters. This means that you can provide a C++ lambda expression, a std::function
- or even a custom struct with a call operator.
+ The callback \a f is expected to be a type that has a plain call operator
+ \c{()} without any parameters. This means that you can provide a C++ lambda
+ expression, a std::function or even a custom struct with a call operator.
- The returned property change handler object keeps track of the registration. When it
- goes out of scope, the callback is de-registered.
+ The returned property change handler object keeps track of the registration.
+ When it goes out of scope, the callback is de-registered.
*/
/*!
\fn template <typename Class, typename T, auto offset, auto Callback> template <typename Functor> QPropertyChangeHandler<T, Functor> QObjectBindableProperty<Class, T, offset, Callback>::subscribe(Functor f)
- Subscribes the given functor \a f as a callback that is called immediately and whenever
- the value of the property changes in the future. On each value change, the handler
- is either called immediately, or deferred, depending on the context.
+ Subscribes the given functor \a f as a callback that is called immediately and
+ whenever the value of the property changes in the future. On each value
+ change, the handler is either called immediately, or deferred, depending on
+ the context.
- The callback \a f is expected to be a type that has a plain call operator () without any
- parameters. This means that you can provide a C++ lambda expression, a std::function
- or even a custom struct with a call operator.
+ The callback \a f is expected to be a type that has a plain call operator
+ \c{()} without any parameters. This means that you can provide a C++ lambda
+ expression, a std::function or even a custom struct with a call operator.
- The returned property change handler object keeps track of the subscription. When it
- goes out of scope, the callback is unsubscribed.
+ The returned property change handler object keeps track of the subscription.
+ When it goes out of scope, the callback is unsubscribed.
*/
/*!
\fn template <typename Class, typename T, auto offset, auto Callback> template <typename Functor> QPropertyNotifier QObjectBindableProperty<Class, T, offset, Callback>::addNotifier(Functor f)
- Subscribes the given functor \a f as a callback that is called whenever
- the value of the property changes.
+ Subscribes the given functor \a f as a callback that is called whenever the
+ value of the property changes.
- The callback \a f is expected to be a type that has a plain call operator () without any
- parameters. This means that you can provide a C++ lambda expression, a std::function
- or even a custom struct with a call operator.
+ The callback \a f is expected to be a type that has a plain call operator
+ \c{()} without any parameters. This means that you can provide a C++ lambda
+ expression, a std::function or even a custom struct with a call operator.
- The returned property change handler object keeps track of the subscription. When it
- goes out of scope, the callback is unsubscribed.
+ The returned property change handler object keeps track of the subscription.
+ When it goes out of scope, the callback is unsubscribed.
- This method is in some cases easier to use than onValueChanged(), as the returned object is not a template.
- It can therefore more easily be stored, e.g. as a member in a class.
+ This method is in some cases easier to use than onValueChanged(), as the
+ returned object is not a template. It can therefore more easily be stored,
+ e.g. as a member in a class.
\sa onValueChanged(), subscribe()
*/
@@ -1807,13 +1915,15 @@ QString QPropertyBindingError::description() const
/*!
\class QPropertyChangeHandler
\inmodule QtCore
- \brief The QPropertyChangeHandler class controls the lifecycle of change callback installed on a QProperty.
+ \brief The QPropertyChangeHandler class controls the lifecycle of change
+ callback installed on a QProperty.
\ingroup tools
- QPropertyChangeHandler\<Functor\> is created when registering a
- callback on a QProperty to listen to changes to the property's value, using QProperty::onValueChanged
- and QProperty::subscribe. As long as the change handler is alive, the callback remains installed.
+ QPropertyChangeHandler\<Functor\> is created when registering a callback on a
+ QProperty to listen to changes to the property's value, using
+ QProperty::onValueChanged and QProperty::subscribe. As long as the change
+ handler is alive, the callback remains installed.
A handler instance can be transferred between C++ scopes using move semantics.
*/
@@ -1825,9 +1935,9 @@ QString QPropertyBindingError::description() const
\ingroup tools
- QPropertyNotifier is created when registering a
- callback on a QProperty to listen to changes to the property's value, using QProperty::addNotifier.
- As long as the change handler is alive, the callback remains installed.
+ QPropertyNotifier is created when registering a callback on a QProperty to
+ listen to changes to the property's value, using QProperty::addNotifier. As
+ long as the change handler is alive, the callback remains installed.
A handler instance can be transferred between C++ scopes using move semantics.
*/
@@ -1837,7 +1947,8 @@ QString QPropertyBindingError::description() const
\inmodule QtCore
\internal
- \brief The QPropertyAlias class is a safe alias for a QProperty with same template parameter.
+ \brief The QPropertyAlias class is a safe alias for a QProperty with same
+ template parameter.
\ingroup tools
@@ -1915,33 +2026,14 @@ QString QPropertyBindingError::description() const
*/
/*!
- \fn template <typename T> QPropertyAlias<T> &QPropertyAlias<T>::operator=(T &&newValue)
- \overload
-
- Assigns \a newValue to the aliased property and returns a reference to this
- QPropertyAlias.
-*/
-
-/*!
- \fn template <typename T> QPropertyAlias<T> &QPropertyAlias<T>::operator=(const QPropertyBinding<T> &newBinding)
- \overload
-
- Associates the value of the aliased property with the provided \a newBinding
- expression and returns a reference to this alias. The first time the
- property value is read, either from the property itself or from any alias, the
- binding is evaluated. Whenever a dependency of the binding changes, the
- binding will be re-evaluated the next time the value of this property is read.
-*/
-
-/*!
\fn template <typename T> QPropertyBinding<T> QPropertyAlias<T>::setBinding(const QPropertyBinding<T> &newBinding)
Associates the value of the aliased property with the provided \a newBinding
expression and returns any previous binding the associated with the aliased
- property. The first time the property value is read, either from the property
- itself or from any alias, the binding is evaluated. Whenever a dependency of
- the binding changes, the binding will be re-evaluated the next time the value
- of this property is read.
+ property.The property's value is set to the result of evaluating the new
+ binding. Whenever a dependency of the binding changes, the binding will be
+ re-evaluated, and the property's value gets updated accordingly.
+
Returns any previous binding associated with the property, or a
default-constructed QPropertyBinding<T>.
@@ -1952,10 +2044,10 @@ QString QPropertyBindingError::description() const
\overload
Associates the value of the aliased property with the provided \a newBinding
- expression. The first time the property value is read, either from the
- property itself or from any alias, the binding is evaluated. Whenever a
- dependency of the binding changes, the binding will be re-evaluated the next
- time the value of this property is read.
+ expression. The property's value is set to the result of evaluating the new
+ binding. Whenever a dependency of the binding changes, the binding will be
+ re-evaluated, and the property's value gets updated accordingly.
+
Returns true if the type of this property is the same as the type the binding
function returns; false otherwise.
@@ -1966,10 +2058,10 @@ QString QPropertyBindingError::description() const
\overload
Associates the value of the aliased property with the provided functor \a f
- expression. The first time the property value is read, either from the
- property itself or from any alias, the binding is evaluated. Whenever a
- dependency of the binding changes, the binding will be re-evaluated the next
- time the value of this property is read.
+ expression. The property's value is set to the result of evaluating the new
+ binding. Whenever a dependency of the binding changes, the binding will be
+ re-evaluated, and the property's value gets updated accordingly.
+
Returns any previous binding associated with the property, or a
default-constructed QPropertyBinding<T>.
@@ -2007,9 +2099,9 @@ QString QPropertyBindingError::description() const
the value of the aliased property changes. On each value change, the handler
is either called immediately, or deferred, depending on the context.
- The callback \a f is expected to be a type that has a plain call operator () without any
- parameters. This means that you can provide a C++ lambda expression, a std::function
- or even a custom struct with a call operator.
+ The callback \a f is expected to be a type that has a plain call operator
+ \c{()} without any parameters. This means that you can provide a C++ lambda
+ expression, a std::function or even a custom struct with a call operator.
The returned property change handler object keeps track of the registration. When it
goes out of scope, the callback is de-registered.
@@ -2018,16 +2110,17 @@ QString QPropertyBindingError::description() const
/*!
\fn template <typename T> template <typename Functor> QPropertyChangeHandler<T, Functor> QPropertyAlias<T>::subscribe(Functor f)
- Subscribes the given functor \a f as a callback that is called immediately and whenever
- the value of the aliased property changes in the future. On each value change, the handler
- is either called immediately, or deferred, depending on the context.
+ Subscribes the given functor \a f as a callback that is called immediately and
+ whenever the value of the aliased property changes in the future. On each
+ value change, the handler is either called immediately, or deferred, depending
+ on the context.
- The callback \a f is expected to be a type that has a plain call operator () without any
- parameters. This means that you can provide a C++ lambda expression, a std::function
- or even a custom struct with a call operator.
+ The callback \a f is expected to be a type that has a plain call operator
+ \c{()} without any parameters. This means that you can provide a C++ lambda
+ expression, a std::function or even a custom struct with a call operator.
- The returned property change handler object keeps track of the subscription. When it
- goes out of scope, the callback is unsubscribed.
+ The returned property change handler object keeps track of the subscription.
+ When it goes out of scope, the callback is unsubscribed.
*/
/*!
@@ -2036,15 +2129,16 @@ QString QPropertyBindingError::description() const
Subscribes the given functor \a f as a callback that is called whenever
the value of the aliased property changes.
- The callback \a f is expected to be a type that has a plain call operator () without any
- parameters. This means that you can provide a C++ lambda expression, a std::function
- or even a custom struct with a call operator.
+ The callback \a f is expected to be a type that has a plain call operator
+ \c{()} without any parameters. This means that you can provide a C++ lambda
+ expression, a std::function or even a custom struct with a call operator.
- The returned property change handler object keeps track of the subscription. When it
- goes out of scope, the callback is unsubscribed.
+ The returned property change handler object keeps track of the subscription.
+ When it goes out of scope, the callback is unsubscribed.
- This method is in some cases easier to use than onValueChanged(), as the returned object is not a template.
- It can therefore more easily be stored, e.g. as a member in a class.
+ This method is in some cases easier to use than onValueChanged(), as the
+ returned object is not a template. It can therefore more easily be stored,
+ e.g. as a member in a class.
\sa onValueChanged(), subscribe()
*/
@@ -2196,16 +2290,17 @@ QBindingStorage::~QBindingStorage()
QBindingStoragePrivate(d).destroy();
}
-void QBindingStorage::clear()
+void QBindingStorage::reinitAfterThreadMove()
{
- QBindingStoragePrivate(d).destroy();
- d = nullptr;
+ bindingStatus = &QT_PREPEND_NAMESPACE(bindingStatus);
+ Q_ASSERT(bindingStatus);
}
-// ### Unused, retained for BC with 6.0
-void QBindingStorage::maybeUpdateBindingAndRegister_helper(const QUntypedPropertyData *data) const
+void QBindingStorage::clear()
{
- registerDependency_helper(data);
+ QBindingStoragePrivate(d).destroy();
+ d = nullptr;
+ bindingStatus = nullptr;
}
void QBindingStorage::registerDependency_helper(const QUntypedPropertyData *data) const
@@ -2238,6 +2333,11 @@ QPropertyBindingData *QBindingStorage::bindingData_helper(const QUntypedProperty
return QBindingStoragePrivate(d).get(data);
}
+const QBindingStatus *QBindingStorage::status(QtPrivate::QBindingStatusAccessToken) const
+{
+ return bindingStatus;
+}
+
QPropertyBindingData *QBindingStorage::bindingData_helper(QUntypedPropertyData *data, bool create)
{
return QBindingStoragePrivate(d).get(data, create);
@@ -2315,6 +2415,165 @@ void printMetaTypeMismatch(QMetaType actual, QMetaType expected)
} // namespace BindableWarnings end
+/*!
+ \internal
+ Returns the binding statusof the current thread.
+ */
+QBindingStatus* getBindingStatus(QtPrivate::QBindingStatusAccessToken) { return &QT_PREPEND_NAMESPACE(bindingStatus); }
+
+namespace PropertyAdaptorSlotObjectHelpers {
+void getter(const QUntypedPropertyData *d, void *value)
+{
+ auto adaptor = static_cast<const QtPrivate::QPropertyAdaptorSlotObject *>(d);
+ adaptor->bindingData().registerWithCurrentlyEvaluatingBinding();
+ auto mt = adaptor->metaProperty().metaType();
+ mt.destruct(value);
+ mt.construct(value, adaptor->metaProperty().read(adaptor->object()).data());
+}
+
+void setter(QUntypedPropertyData *d, const void *value)
+{
+ auto adaptor = static_cast<QtPrivate::QPropertyAdaptorSlotObject *>(d);
+ adaptor->bindingData().removeBinding();
+ adaptor->metaProperty().write(adaptor->object(),
+ QVariant(adaptor->metaProperty().metaType(), value));
+}
+
+QUntypedPropertyBinding getBinding(const QUntypedPropertyData *d)
+{
+ auto adaptor = static_cast<const QtPrivate::QPropertyAdaptorSlotObject *>(d);
+ return QUntypedPropertyBinding(adaptor->bindingData().binding());
+}
+
+bool bindingWrapper(QMetaType type, QUntypedPropertyData *d,
+ QtPrivate::QPropertyBindingFunction binding, QUntypedPropertyData *temp,
+ void *value)
+{
+ auto adaptor = static_cast<const QtPrivate::QPropertyAdaptorSlotObject *>(d);
+ type.destruct(value);
+ type.construct(value, adaptor->metaProperty().read(adaptor->object()).data());
+ if (binding.vtable->call(type, temp, binding.functor)) {
+ adaptor->metaProperty().write(adaptor->object(), QVariant(type, value));
+ return true;
+ }
+ return false;
+}
+
+QUntypedPropertyBinding setBinding(QUntypedPropertyData *d, const QUntypedPropertyBinding &binding,
+ QPropertyBindingWrapper wrapper)
+{
+ auto adaptor = static_cast<QPropertyAdaptorSlotObject *>(d);
+ return adaptor->bindingData().setBinding(binding, d, nullptr, wrapper);
+}
+
+void setObserver(const QUntypedPropertyData *d, QPropertyObserver *observer)
+{
+ observer->setSource(static_cast<const QPropertyAdaptorSlotObject *>(d)->bindingData());
+}
+}
+
+QPropertyAdaptorSlotObject::QPropertyAdaptorSlotObject(QObject *o, const QMetaProperty &p)
+ : QSlotObjectBase(&impl), obj(o), metaProperty_(p)
+{
+}
+
+#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0)
+void QPropertyAdaptorSlotObject::impl(int which, QSlotObjectBase *this_, QObject *r, void **a,
+ bool *ret)
+#else
+void QPropertyAdaptorSlotObject::impl(QSlotObjectBase *this_, QObject *r, void **a, int which,
+ bool *ret)
+#endif
+{
+ auto self = static_cast<QPropertyAdaptorSlotObject *>(this_);
+ switch (which) {
+ case Destroy:
+ delete self;
+ break;
+ case Call:
+ if (!self->bindingData_.hasBinding())
+ self->bindingData_.notifyObservers(self);
+ break;
+ case Compare:
+ case NumOperations:
+ Q_UNUSED(r);
+ Q_UNUSED(a);
+ Q_UNUSED(ret);
+ break;
+ }
+}
+
} // namespace QtPrivate end
+QUntypedBindable::QUntypedBindable(QObject *obj, const QMetaProperty &metaProperty,
+ const QtPrivate::QBindableInterface *i)
+ : iface(i)
+{
+ if (!obj)
+ return;
+
+ if (!metaProperty.isValid()) {
+ qCWarning(lcQPropertyBinding) << "QUntypedBindable: Property is not valid";
+ return;
+ }
+
+ if (metaProperty.isBindable()) {
+ *this = metaProperty.bindable(obj);
+ return;
+ }
+
+ if (!metaProperty.hasNotifySignal()) {
+ qCWarning(lcQPropertyBinding)
+ << "QUntypedBindable: Property" << metaProperty.name() << "has no notify signal";
+ return;
+ }
+
+ auto metatype = iface->metaType();
+ if (metaProperty.metaType() != metatype) {
+ qCWarning(lcQPropertyBinding) << "QUntypedBindable: Property" << metaProperty.name()
+ << "of type" << metaProperty.metaType().name()
+ << "does not match requested type" << metatype.name();
+ return;
+ }
+
+ // Test for name pointer equality proves it's exactly the same property
+ if (obj->metaObject()->property(metaProperty.propertyIndex()).name() != metaProperty.name()) {
+ qCWarning(lcQPropertyBinding) << "QUntypedBindable: Property" << metaProperty.name()
+ << "does not belong to this object";
+ return;
+ }
+
+ // Get existing binding data if it exists
+ auto adaptor = QObjectPrivate::get(obj)->getPropertyAdaptorSlotObject(metaProperty);
+
+ if (!adaptor) {
+ adaptor = new QPropertyAdaptorSlotObject(obj, metaProperty);
+
+ auto c = QObjectPrivate::connect(obj, metaProperty.notifySignalIndex(), obj, adaptor,
+ Qt::DirectConnection);
+ Q_ASSERT(c);
+ }
+
+ data = adaptor;
+}
+
+QUntypedBindable::QUntypedBindable(QObject *obj, const char *property,
+ const QtPrivate::QBindableInterface *i)
+ : QUntypedBindable(
+ obj,
+ [=]() -> QMetaProperty {
+ if (!obj)
+ return {};
+ auto propertyIndex = obj->metaObject()->indexOfProperty(property);
+ if (propertyIndex < 0) {
+ qCWarning(lcQPropertyBinding)
+ << "QUntypedBindable: No property named" << property;
+ return {};
+ }
+ return obj->metaObject()->property(propertyIndex);
+ }(),
+ i)
+{
+}
+
QT_END_NAMESPACE
diff --git a/src/corelib/kernel/qproperty.h b/src/corelib/kernel/qproperty.h
index 5258e4533b..0373867a66 100644
--- a/src/corelib/kernel/qproperty.h
+++ b/src/corelib/kernel/qproperty.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QPROPERTY_H
#define QPROPERTY_H
@@ -49,21 +13,32 @@
#include <QtCore/qpropertyprivate.h>
-#if __has_include(<source_location>) && __cplusplus >= 202002L && !defined(Q_CLANG_QDOC)
+#if __has_include(<source_location>) && __cplusplus >= 202002L && !defined(Q_QDOC)
#include <source_location>
#if defined(__cpp_lib_source_location)
#define QT_SOURCE_LOCATION_NAMESPACE std
#define QT_PROPERTY_COLLECT_BINDING_LOCATION
-#define QT_PROPERTY_DEFAULT_BINDING_LOCATION QPropertyBindingSourceLocation(std::source_location::current())
+#if defined(Q_CC_MSVC)
+/* MSVC runs into an issue with constexpr with source location (error C7595)
+ so use the factory function as a workaround */
+# define QT_PROPERTY_DEFAULT_BINDING_LOCATION QPropertyBindingSourceLocation::fromStdSourceLocation(std::source_location::current())
+#else
+/* some versions of gcc in turn run into
+ expression ‘std::source_location::current()’ is not a constant expression
+ so don't use the workaround there */
+# define QT_PROPERTY_DEFAULT_BINDING_LOCATION QPropertyBindingSourceLocation(std::source_location::current())
+#endif
#endif
#endif
-#if !defined(QT_PROPERTY_COLLECT_BINDING_LOCATION) && __has_include(<experimental/source_location>) && !defined(Q_CLANG_QDOC)
+#if __has_include(<experimental/source_location>) && !defined(Q_QDOC)
#include <experimental/source_location>
+#if !defined(QT_PROPERTY_COLLECT_BINDING_LOCATION)
#if defined(__cpp_lib_experimental_source_location)
#define QT_SOURCE_LOCATION_NAMESPACE std::experimental
#define QT_PROPERTY_COLLECT_BINDING_LOCATION
#define QT_PROPERTY_DEFAULT_BINDING_LOCATION QPropertyBindingSourceLocation(std::experimental::source_location::current())
+#endif // defined(__cpp_lib_experimental_source_location)
#endif
#endif
@@ -78,6 +53,17 @@ Q_CORE_EXPORT void beginPropertyUpdateGroup();
Q_CORE_EXPORT void endPropertyUpdateGroup();
}
+class QScopedPropertyUpdateGroup
+{
+ Q_DISABLE_COPY_MOVE(QScopedPropertyUpdateGroup)
+public:
+ Q_NODISCARD_CTOR
+ QScopedPropertyUpdateGroup()
+ { Qt::beginPropertyUpdateGroup(); }
+ ~QScopedPropertyUpdateGroup() noexcept(false)
+ { Qt::endPropertyUpdateGroup(); }
+};
+
template <typename T>
class QPropertyData : public QUntypedPropertyData
{
@@ -104,6 +90,7 @@ public:
void setValueBypassingBindings(rvalue_ref v) { val = std::move(v); }
};
+// ### Qt 7: un-export
struct Q_CORE_EXPORT QPropertyBindingSourceLocation
{
const char *fileName = nullptr;
@@ -111,8 +98,23 @@ struct Q_CORE_EXPORT QPropertyBindingSourceLocation
quint32 line = 0;
quint32 column = 0;
QPropertyBindingSourceLocation() = default;
-#ifdef QT_PROPERTY_COLLECT_BINDING_LOCATION
- QPropertyBindingSourceLocation(const QT_SOURCE_LOCATION_NAMESPACE::source_location &cppLocation)
+#ifdef __cpp_lib_source_location
+ constexpr QPropertyBindingSourceLocation(const std::source_location &cppLocation)
+ {
+ fileName = cppLocation.file_name();
+ functionName = cppLocation.function_name();
+ line = cppLocation.line();
+ column = cppLocation.column();
+ }
+ QT_POST_CXX17_API_IN_EXPORTED_CLASS
+ static consteval QPropertyBindingSourceLocation
+ fromStdSourceLocation(const std::source_location &cppLocation)
+ {
+ return cppLocation;
+ }
+#endif
+#ifdef __cpp_lib_experimental_source_location
+ constexpr QPropertyBindingSourceLocation(const std::experimental::source_location &cppLocation)
{
fileName = cppLocation.file_name();
functionName = cppLocation.function_name();
@@ -226,7 +228,9 @@ public:
ObserverNotifiesBinding, // observer was installed to notify bindings that obsverved property changed
ObserverNotifiesChangeHandler, // observer is a change handler, which runs on every change
ObserverIsPlaceholder, // the observer before this one is currently evaluated in QPropertyObserver::notifyObservers.
- ObserverIsAlias
+#if QT_DEPRECATED_SINCE(6, 6)
+ ObserverIsAlias QT_DEPRECATED_VERSION_X_6_6("Use QProperty and add a binding to the target.")
+#endif
};
protected:
using ChangeHandler = void (*)(QPropertyObserver*, QUntypedPropertyData *);
@@ -259,14 +263,17 @@ public:
QPropertyObserver &operator=(QPropertyObserver &&other) noexcept;
~QPropertyObserver();
- template<typename Property, typename = typename Property::InheritsQUntypedPropertyData>
+ template <typename Property, QtPrivate::IsUntypedPropertyData<Property> = true>
void setSource(const Property &property)
{ setSource(property.bindingData()); }
void setSource(const QtPrivate::QPropertyBindingData &property);
protected:
QPropertyObserver(ChangeHandler changeHandler);
+#if QT_DEPRECATED_SINCE(6, 6)
+ QT_DEPRECATED_VERSION_X_6_6("This constructor was only meant for internal use. Use QProperty and add a binding to the target.")
QPropertyObserver(QUntypedPropertyData *aliasedPropertyPtr);
+#endif
QUntypedPropertyData *aliasedProperty() const
{
@@ -281,10 +288,11 @@ private:
};
template <typename Functor>
-class [[nodiscard]] QPropertyChangeHandler : public QPropertyObserver
+class QPropertyChangeHandler : public QPropertyObserver
{
Functor m_handler;
public:
+ Q_NODISCARD_CTOR
QPropertyChangeHandler(Functor handler)
: QPropertyObserver([](QPropertyObserver *self, QUntypedPropertyData *) {
auto This = static_cast<QPropertyChangeHandler<Functor>*>(self);
@@ -294,7 +302,8 @@ public:
{
}
- template<typename Property, typename = typename Property::InheritsQUntypedPropertyData>
+ template <typename Property, QtPrivate::IsUntypedPropertyData<Property> = true>
+ Q_NODISCARD_CTOR
QPropertyChangeHandler(const Property &property, Functor handler)
: QPropertyObserver([](QPropertyObserver *self, QUntypedPropertyData *) {
auto This = static_cast<QPropertyChangeHandler<Functor>*>(self);
@@ -306,12 +315,14 @@ public:
}
};
-class [[nodiscard]] QPropertyNotifier : public QPropertyObserver
+class QPropertyNotifier : public QPropertyObserver
{
std::function<void()> m_handler;
public:
+ Q_NODISCARD_CTOR
QPropertyNotifier() = default;
template<typename Functor>
+ Q_NODISCARD_CTOR
QPropertyNotifier(Functor handler)
: QPropertyObserver([](QPropertyObserver *self, QUntypedPropertyData *) {
auto This = static_cast<QPropertyNotifier *>(self);
@@ -321,7 +332,9 @@ public:
{
}
- template<typename Functor, typename Property, typename = typename Property::InheritsQUntypedPropertyData>
+ template <typename Functor, typename Property,
+ QtPrivate::IsUntypedPropertyData<Property> = true>
+ Q_NODISCARD_CTOR
QPropertyNotifier(const Property &property, Functor handler)
: QPropertyObserver([](QPropertyObserver *self, QUntypedPropertyData *) {
auto This = static_cast<QPropertyNotifier *>(self);
@@ -358,7 +371,7 @@ public:
explicit QProperty(const QPropertyBinding<T> &binding)
: QProperty()
{ setBinding(binding); }
-#ifndef Q_CLANG_QDOC
+#ifndef Q_QDOC
template <typename Functor>
explicit QProperty(Functor &&f, const QPropertyBindingSourceLocation &location = QT_PROPERTY_DEFAULT_BINDING_LOCATION,
typename std::enable_if_t<std::is_invocable_r_v<T, Functor&>> * = nullptr)
@@ -441,7 +454,7 @@ public:
return true;
}
-#ifndef Q_CLANG_QDOC
+#ifndef Q_QDOC
template <typename Functor>
QPropertyBinding<T> setBinding(Functor &&f,
const QPropertyBindingSourceLocation &location = QT_PROPERTY_DEFAULT_BINDING_LOCATION,
@@ -606,6 +619,60 @@ enum Reason { InvalidInterface, NonBindableInterface, ReadOnlyInterface };
Q_CORE_EXPORT void printUnsuitableBindableWarning(QAnyStringView prefix, Reason reason);
Q_CORE_EXPORT void printMetaTypeMismatch(QMetaType actual, QMetaType expected);
}
+
+namespace PropertyAdaptorSlotObjectHelpers {
+Q_CORE_EXPORT void getter(const QUntypedPropertyData *d, void *value);
+Q_CORE_EXPORT void setter(QUntypedPropertyData *d, const void *value);
+Q_CORE_EXPORT QUntypedPropertyBinding getBinding(const QUntypedPropertyData *d);
+Q_CORE_EXPORT bool bindingWrapper(QMetaType type, QUntypedPropertyData *d,
+ QtPrivate::QPropertyBindingFunction binding,
+ QUntypedPropertyData *temp, void *value);
+Q_CORE_EXPORT QUntypedPropertyBinding setBinding(QUntypedPropertyData *d,
+ const QUntypedPropertyBinding &binding,
+ QPropertyBindingWrapper wrapper);
+Q_CORE_EXPORT void setObserver(const QUntypedPropertyData *d, QPropertyObserver *observer);
+
+template<typename T>
+bool bindingWrapper(QMetaType type, QUntypedPropertyData *d,
+ QtPrivate::QPropertyBindingFunction binding)
+{
+ struct Data : QPropertyData<T>
+ {
+ void *data() { return &this->val; }
+ } temp;
+ return bindingWrapper(type, d, binding, &temp, temp.data());
+}
+
+template<typename T>
+QUntypedPropertyBinding setBinding(QUntypedPropertyData *d, const QUntypedPropertyBinding &binding)
+{
+ return setBinding(d, binding, &bindingWrapper<T>);
+}
+
+template<typename T>
+QUntypedPropertyBinding makeBinding(const QUntypedPropertyData *d,
+ const QPropertyBindingSourceLocation &location)
+{
+ return Qt::makePropertyBinding(
+ [d]() -> T {
+ T r;
+ getter(d, &r);
+ return r;
+ },
+ location);
+}
+
+template<class T>
+inline constexpr QBindableInterface iface = {
+ &getter,
+ &setter,
+ &getBinding,
+ &setBinding<T>,
+ &makeBinding<T>,
+ &setObserver,
+ &QMetaType::fromType<T>,
+};
+}
}
class QUntypedBindable
@@ -618,6 +685,9 @@ protected:
: data(d), iface(i)
{}
+ Q_CORE_EXPORT explicit QUntypedBindable(QObject* obj, const QMetaProperty &property, const QtPrivate::QBindableInterface *i);
+ Q_CORE_EXPORT explicit QUntypedBindable(QObject* obj, const char* property, const QtPrivate::QBindableInterface *i);
+
public:
constexpr QUntypedBindable() = default;
template<typename Property>
@@ -754,6 +824,12 @@ public:
}
}
+ explicit QBindable(QObject *obj, const QMetaProperty &property)
+ : QUntypedBindable(obj, property, &QtPrivate::PropertyAdaptorSlotObjectHelpers::iface<T>) {}
+
+ explicit QBindable(QObject *obj, const char *property)
+ : QUntypedBindable(obj, property, &QtPrivate::PropertyAdaptorSlotObjectHelpers::iface<T>) {}
+
QPropertyBinding<T> makeBinding(const QPropertyBindingSourceLocation &location = QT_PROPERTY_DEFAULT_BINDING_LOCATION) const
{
return static_cast<QPropertyBinding<T> &&>(QUntypedBindable::makeBinding(location));
@@ -783,7 +859,7 @@ public:
#endif
return QPropertyBinding<T>();
}
-#ifndef Q_CLANG_QDOC
+#ifndef Q_QDOC
template <typename Functor>
QPropertyBinding<T> setBinding(Functor &&f,
const QPropertyBindingSourceLocation &location = QT_PROPERTY_DEFAULT_BINDING_LOCATION,
@@ -813,13 +889,16 @@ public:
}
};
+#if QT_DEPRECATED_SINCE(6, 6)
template<typename T>
-class QPropertyAlias : public QPropertyObserver
+class QT_DEPRECATED_VERSION_X_6_6("Class was only meant for internal use, use a QProperty and add a binding to the target")
+QPropertyAlias : public QPropertyObserver
{
Q_DISABLE_COPY_MOVE(QPropertyAlias)
const QtPrivate::QBindableInterface *iface = nullptr;
public:
+ QT_WARNING_PUSH QT_WARNING_DISABLE_DEPRECATED
QPropertyAlias(QProperty<T> *property)
: QPropertyObserver(property),
iface(&QtPrivate::QBindableInterfaceForProperty<QProperty<T>>::iface)
@@ -828,7 +907,7 @@ public:
iface->setObserver(aliasedProperty(), this);
}
- template<typename Property, typename = typename Property::InheritsQUntypedPropertyData>
+ template <typename Property, QtPrivate::IsUntypedPropertyData<Property> = true>
QPropertyAlias(Property *property)
: QPropertyObserver(property),
iface(&QtPrivate::QBindableInterfaceForProperty<Property>::iface)
@@ -885,7 +964,7 @@ public:
return QBindable<T>(aliasedProperty(), iface).setBinding(newBinding);
}
-#ifndef Q_CLANG_QDOC
+#ifndef Q_QDOC
template <typename Functor>
QPropertyBinding<T> setBinding(Functor &&f,
const QPropertyBindingSourceLocation &location = QT_PROPERTY_DEFAULT_BINDING_LOCATION,
@@ -928,14 +1007,16 @@ public:
template<typename Functor>
QPropertyNotifier addNotifier(Functor f)
{
- return QBindable<T>(aliasedProperty(), iface).notify(f);
+ return QBindable<T>(aliasedProperty(), iface).addNotifier(f);
}
bool isValid() const
{
return aliasedProperty() != nullptr;
}
+ QT_WARNING_POP
};
+#endif // QT_DEPRECATED_SINCE(6, 6)
template<typename Class, typename T, auto Offset, auto Signal = nullptr>
class QObjectBindableProperty : public QPropertyData<T>
@@ -975,7 +1056,7 @@ public:
explicit QObjectBindableProperty(const QPropertyBinding<T> &binding)
: QObjectBindableProperty()
{ setBinding(binding); }
-#ifndef Q_CLANG_QDOC
+#ifndef Q_QDOC
template <typename Functor>
explicit QObjectBindableProperty(Functor &&f, const QPropertyBindingSourceLocation &location = QT_PROPERTY_DEFAULT_BINDING_LOCATION,
typename std::enable_if_t<std::is_invocable_r_v<T, Functor&>> * = nullptr)
@@ -1068,7 +1149,7 @@ public:
return true;
}
-#ifndef Q_CLANG_QDOC
+#ifndef Q_QDOC
template <typename Functor>
QPropertyBinding<T> setBinding(Functor &&f,
const QPropertyBindingSourceLocation &location = QT_PROPERTY_DEFAULT_BINDING_LOCATION,
diff --git a/src/corelib/kernel/qproperty_p.h b/src/corelib/kernel/qproperty_p.h
index 5105fd6343..8ae6664a2b 100644
--- a/src/corelib/kernel/qproperty_p.h
+++ b/src/corelib/kernel/qproperty_p.h
@@ -1,41 +1,5 @@
-/***************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QPROPERTY_P_H
#define QPROPERTY_P_H
@@ -51,19 +15,51 @@
// We mean it.
//
-#include <qglobal.h>
+#include <private/qglobal_p.h>
#include <qproperty.h>
+#include <qmetaobject.h>
#include <qscopedpointer.h>
#include <qscopedvaluerollback.h>
+#include <qvariant.h>
#include <vector>
+#include <QtCore/QVarLengthArray>
QT_BEGIN_NAMESPACE
namespace QtPrivate {
Q_CORE_EXPORT bool isAnyBindingEvaluating();
+ struct QBindingStatusAccessToken {};
}
+
+/*!
+ \internal
+ Similar to \c QPropertyBindingPrivatePtr, but stores a
+ \c QPropertyObserver * linking to the QPropertyBindingPrivate*
+ instead of the QPropertyBindingPrivate* itself
+ */
+struct QBindingObserverPtr
+{
+private:
+ QPropertyObserver *d = nullptr;
+public:
+ QBindingObserverPtr() = default;
+ Q_DISABLE_COPY(QBindingObserverPtr);
+ void swap(QBindingObserverPtr &other) noexcept
+ { qt_ptr_swap(d, other.d); }
+ QBindingObserverPtr(QBindingObserverPtr &&other) noexcept : d(std::exchange(other.d, nullptr)) {}
+ QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_MOVE_AND_SWAP(QBindingObserverPtr);
+
+
+ inline QBindingObserverPtr(QPropertyObserver *observer) noexcept;
+ inline ~QBindingObserverPtr();
+ inline QPropertyBindingPrivate *binding() const noexcept;
+ inline QPropertyObserver *operator ->();
+};
+
+using PendingBindingObserverList = QVarLengthArray<QBindingObserverPtr>;
+
// Keep all classes related to QProperty in one compilation unit. Performance of this code is crucial and
// we need to allow the compiler to inline where it makes sense.
@@ -87,6 +83,7 @@ struct QPropertyBindingDataPointer
void Q_ALWAYS_INLINE addObserver(QPropertyObserver *observer);
inline void setFirstObserver(QPropertyObserver *observer);
inline QPropertyObserverPointer firstObserver() const;
+ static QPropertyProxyBindingData *proxyData(QtPrivate::QPropertyBindingData *ptr);
inline int observerCount() const;
@@ -97,11 +94,12 @@ struct QPropertyBindingDataPointer
}
};
-struct [[nodiscard]] QPropertyObserverNodeProtector
+struct QPropertyObserverNodeProtector
{
Q_DISABLE_COPY_MOVE(QPropertyObserverNodeProtector)
QPropertyObserverBase m_placeHolder;
+ Q_NODISCARD_CTOR
QPropertyObserverNodeProtector(QPropertyObserver *observer)
{
// insert m_placeholder after observer into the linked list
@@ -127,33 +125,55 @@ struct QPropertyObserverPointer
void unlink()
{
unlink_common();
+#if QT_DEPRECATED_SINCE(6, 6)
+ QT_WARNING_PUSH QT_WARNING_DISABLE_DEPRECATED
if (ptr->next.tag() == QPropertyObserver::ObserverIsAlias)
ptr->aliasData = nullptr;
+ QT_WARNING_POP
+#endif
}
void unlink_fast()
{
+#if QT_DEPRECATED_SINCE(6, 6)
+ QT_WARNING_PUSH QT_WARNING_DISABLE_DEPRECATED
Q_ASSERT(ptr->next.tag() != QPropertyObserver::ObserverIsAlias);
+ QT_WARNING_POP
+#endif
unlink_common();
}
- void setBindingToNotify(QPropertyBindingPrivate *binding);
+ void setBindingToNotify(QPropertyBindingPrivate *binding)
+ {
+ Q_ASSERT(ptr->next.tag() != QPropertyObserver::ObserverIsPlaceholder);
+ ptr->binding = binding;
+ ptr->next.setTag(QPropertyObserver::ObserverNotifiesBinding);
+ }
+
void setBindingToNotify_unsafe(QPropertyBindingPrivate *binding);
void setChangeHandler(QPropertyObserver::ChangeHandler changeHandler);
+ enum class Notify {Everything, OnlyChangeHandlers};
+
void notify(QUntypedPropertyData *propertyDataPtr);
#ifndef QT_NO_DEBUG
void noSelfDependencies(QPropertyBindingPrivate *binding);
#else
void noSelfDependencies(QPropertyBindingPrivate *) {}
#endif
- void evaluateBindings(QBindingStatus *status);
+ void evaluateBindings(PendingBindingObserverList &bindingObservers, QBindingStatus *status);
void observeProperty(QPropertyBindingDataPointer property);
explicit operator bool() const { return ptr != nullptr; }
QPropertyObserverPointer nextObserver() const { return {ptr->next.data()}; }
+ QPropertyBindingPrivate *binding() const
+ {
+ Q_ASSERT(ptr->next.tag() == QPropertyObserver::ObserverNotifiesBinding);
+ return ptr->binding;
+ }
+
private:
void unlink_common()
{
@@ -186,6 +206,7 @@ struct BindingEvaluationState
QPropertyBindingPrivate *binding;
BindingEvaluationState *previousState = nullptr;
BindingEvaluationState **currentState = nullptr;
+ QVarLengthArray<const QPropertyBindingData *, 8> alreadyCaptureProperties;
};
/*!
@@ -210,6 +231,33 @@ struct CompatPropertySafePoint
QtPrivate::BindingEvaluationState *bindingState = nullptr;
};
+/*!
+ * \internal
+ * While the regular QProperty notification for a compat property runs we
+ * don't want to have any currentCompatProperty set. This would be a _different_
+ * one than the one we are current evaluating. Therefore it's misleading and
+ * prevents the registering of actual dependencies.
+ */
+struct CurrentCompatPropertyThief
+{
+ Q_DISABLE_COPY_MOVE(CurrentCompatPropertyThief)
+public:
+ CurrentCompatPropertyThief(QBindingStatus *status)
+ : status(&status->currentCompatProperty)
+ , stolen(std::exchange(status->currentCompatProperty, nullptr))
+ {
+ }
+
+ ~CurrentCompatPropertyThief()
+ {
+ *status = stolen;
+ }
+
+private:
+ CompatPropertySafePoint **status = nullptr;
+ CompatPropertySafePoint *stolen = nullptr;
+};
+
}
class Q_CORE_EXPORT QPropertyBindingPrivate : public QtPrivate::RefCounted
@@ -254,9 +302,8 @@ protected:
is stored somewhere else. To make efficient use of the space, we instead provide a scratch space
for QQmlPropertyBinding (which stores further binding information there).
Anything stored in the union must be trivially destructible.
+ (checked in qproperty.cpp)
*/
- static_assert(std::is_trivially_destructible_v<QPropertyBindingSourceLocation>);
- static_assert(std::is_trivially_destructible_v<std::byte[sizeof(QPropertyBindingSourceLocation)]>);
using DeclarativeErrorCallback = void(*)(QPropertyBindingPrivate *);
union {
QPropertyBindingSourceLocation location;
@@ -286,6 +333,7 @@ public:
bool isUpdating() {return updating;}
void setSticky(bool keep = true) {m_sticky = keep;}
bool isSticky() {return m_sticky;}
+ void scheduleNotify() {pendingNotify = true;}
QPropertyBindingPrivate(QMetaType metaType, const QtPrivate::BindingFunctionVTable *vtable,
const QPropertyBindingSourceLocation &location, bool isQQmlPropertyBinding=false)
@@ -330,15 +378,7 @@ public:
return observers;
}
- void clearDependencyObservers() {
- for (size_t i = 0; i < qMin(dependencyObserverCount, inlineDependencyObservers.size()); ++i) {
- QPropertyObserverPointer p{&inlineDependencyObservers[i]};
- p.unlink_fast();
- }
- if (heapObservers)
- heapObservers->clear();
- dependencyObserverCount = 0;
- }
+ void clearDependencyObservers();
Q_ALWAYS_INLINE QPropertyObserverPointer allocateDependencyObserver() {
if (dependencyObserverCount < inlineDependencyObservers.size()) {
@@ -348,13 +388,7 @@ public:
return allocateDependencyObserver_slow();
}
- Q_NEVER_INLINE QPropertyObserverPointer allocateDependencyObserver_slow()
- {
- ++dependencyObserverCount;
- if (!heapObservers)
- heapObservers.reset(new std::vector<QPropertyObserver>());
- return {&heapObservers->emplace_back()};
- }
+ QPropertyObserverPointer allocateDependencyObserver_slow();
QPropertyBindingSourceLocation sourceLocation() const
{
@@ -370,10 +404,13 @@ public:
void unlinkAndDeref();
- void evaluateRecursive(QBindingStatus *status = nullptr);
- void Q_ALWAYS_INLINE evaluateRecursive_inline(QBindingStatus *status);
+ bool evaluateRecursive(PendingBindingObserverList &bindingObservers, QBindingStatus *status = nullptr);
- void notifyRecursive();
+ bool Q_ALWAYS_INLINE evaluateRecursive_inline(PendingBindingObserverList &bindingObservers, QBindingStatus *status);
+
+ void notifyNonRecursive(const PendingBindingObserverList &bindingObservers);
+ enum NotificationState : bool { Delayed, Sent };
+ NotificationState notifyNonRecursive();
static QPropertyBindingPrivate *get(const QUntypedPropertyBinding &binding)
{ return static_cast<QPropertyBindingPrivate *>(binding.d.data()); }
@@ -422,9 +459,9 @@ inline void QPropertyBindingDataPointer::fixupAfterMove(QtPrivate::QPropertyBind
{
auto &d = ptr->d_ref();
if (ptr->isNotificationDelayed()) {
- QPropertyProxyBindingData *proxyData
- = reinterpret_cast<QPropertyProxyBindingData*>(d & ~QtPrivate::QPropertyBindingData::BindingBit);
- proxyData->originalBindingData = ptr;
+ QPropertyProxyBindingData *proxy = ptr->proxyData();
+ Q_ASSERT(proxy);
+ proxy->originalBindingData = ptr;
}
// If QPropertyBindingData has been moved, and it has an observer
// we have to adjust the firstObserver's prev pointer to point to
@@ -442,6 +479,17 @@ inline QPropertyObserverPointer QPropertyBindingDataPointer::firstObserver() con
return { reinterpret_cast<QPropertyObserver *>(ptr->d()) };
}
+/*!
+ \internal
+ Returns the proxy data of \a ptr, or \c nullptr if \a ptr has no delayed notification
+ */
+inline QPropertyProxyBindingData *QPropertyBindingDataPointer::proxyData(QtPrivate::QPropertyBindingData *ptr)
+{
+ if (!ptr->isNotificationDelayed())
+ return nullptr;
+ return ptr->proxyData();
+}
+
inline int QPropertyBindingDataPointer::observerCount() const
{
int count = 0;
@@ -478,20 +526,23 @@ class QObjectCompatProperty : public QPropertyData<T>
static bool bindingWrapper(QMetaType type, QUntypedPropertyData *dataPtr, QtPrivate::QPropertyBindingFunction binding)
{
auto *thisData = static_cast<ThisType *>(dataPtr);
+ QBindingStorage *storage = qGetBindingStorage(thisData->owner());
QPropertyData<T> copy;
- binding.vtable->call(type, &copy, binding.functor);
- if constexpr (QTypeTraits::has_operator_equal_v<T>)
- if (copy.valueBypassingBindings() == thisData->valueBypassingBindings())
- return false;
+ {
+ QtPrivate::CurrentCompatPropertyThief thief(storage->bindingStatus);
+ binding.vtable->call(type, &copy, binding.functor);
+ if constexpr (QTypeTraits::has_operator_equal_v<T>)
+ if (copy.valueBypassingBindings() == thisData->valueBypassingBindings())
+ return false;
+ }
// ensure value and setValue know we're currently evaluating our binding
- QBindingStorage *storage = qGetBindingStorage(thisData->owner());
QtPrivate::CompatPropertySafePoint guardThis(storage->bindingStatus, thisData);
(thisData->owner()->*Setter)(copy.valueBypassingBindings());
return true;
}
bool inBindingWrapper(const QBindingStorage *storage) const
{
- return storage->bindingStatus->currentCompatProperty
+ return storage->bindingStatus && storage->bindingStatus->currentCompatProperty
&& QtPrivate::isPropertyInBindingWrapper(this);
}
@@ -516,7 +567,7 @@ public:
{
const QBindingStorage *storage = qGetBindingStorage(owner());
// make sure we don't register this binding as a dependency to itself
- if (storage->bindingStatus->currentlyEvaluatingBinding && !inBindingWrapper(storage))
+ if (storage->bindingStatus && storage->bindingStatus->currentlyEvaluatingBinding && !inBindingWrapper(storage))
storage->registerDependency_helper(this);
return this->val;
}
@@ -576,7 +627,7 @@ public:
return true;
}
-#ifndef Q_CLANG_QDOC
+#ifndef Q_QDOC
template <typename Functor>
QPropertyBinding<T> setBinding(Functor &&f,
const QPropertyBindingSourceLocation &location = QT_PROPERTY_DEFAULT_BINDING_LOCATION,
@@ -615,11 +666,14 @@ public:
QPropertyBindingDataPointer d{bd};
if (QPropertyObserverPointer observer = d.firstObserver()) {
if (!inBindingWrapper(storage)) {
- if (bd->notifyObserver_helper(this, observer, storage)
+ PendingBindingObserverList bindingObservers;
+ if (bd->notifyObserver_helper(this, storage, observer, bindingObservers)
== QtPrivate::QPropertyBindingData::Evaluated) {
// evaluateBindings() can trash the observers. We need to re-fetch here.
if (QPropertyObserverPointer observer = d.firstObserver())
observer.notify(this);
+ for (auto&& bindingObserver: bindingObservers)
+ bindingObserver.binding()->notifyNonRecursive();
}
}
}
@@ -776,13 +830,13 @@ struct QUntypedBindablePrivate
}
};
-inline void QPropertyBindingPrivate::evaluateRecursive_inline(QBindingStatus *status)
+inline bool QPropertyBindingPrivate::evaluateRecursive_inline(PendingBindingObserverList &bindingObservers, QBindingStatus *status)
{
if (updating) {
error = QPropertyBindingError(QPropertyBindingError::BindingLoop);
if (isQQmlPropertyBinding)
errorCallBack(this);
- return;
+ return false;
}
/*
@@ -812,12 +866,21 @@ inline void QPropertyBindingPrivate::evaluateRecursive_inline(QBindingStatus *st
// If there was not, we must not clear it, as that only should happen in notifyRecursive
pendingNotify = pendingNotify || changed;
if (!changed || !firstObserver)
- return;
+ return changed;
firstObserver.noSelfDependencies(this);
- firstObserver.evaluateBindings(status);
+ firstObserver.evaluateBindings(bindingObservers, status);
+ return true;
}
+/*!
+ \internal
+
+ Walks through the list of property observers, and calls any ChangeHandler
+ found there.
+ It doesn't do anything with bindings, which are only handled in
+ QPropertyBindingPrivate::evaluateRecursive.
+ */
inline void QPropertyObserverPointer::notify(QUntypedPropertyData *propertyDataPtr)
{
auto observer = const_cast<QPropertyObserver*>(ptr);
@@ -856,18 +919,16 @@ inline void QPropertyObserverPointer::notify(QUntypedPropertyData *propertyDataP
break;
}
case QPropertyObserver::ObserverNotifiesBinding:
- {
- auto bindingToNotify = observer->binding;
- QPropertyObserverNodeProtector protector(observer);
- bindingToNotify->notifyRecursive();
- next = protector.next();
break;
- }
case QPropertyObserver::ObserverIsPlaceholder:
// recursion is already properly handled somewhere else
break;
+#if QT_DEPRECATED_SINCE(6, 6)
+ QT_WARNING_PUSH QT_WARNING_DISABLE_DEPRECATED
case QPropertyObserver::ObserverIsAlias:
break;
+ QT_WARNING_POP
+#endif
default: Q_UNREACHABLE();
}
observer = next;
@@ -880,6 +941,61 @@ inline QPropertyObserverNodeProtector::~QPropertyObserverNodeProtector()
d.unlink_fast();
}
+QBindingObserverPtr::QBindingObserverPtr(QPropertyObserver *observer) noexcept : d(observer)
+{
+ Q_ASSERT(d);
+ QPropertyObserverPointer{d}.binding()->addRef();
+}
+
+QBindingObserverPtr::~QBindingObserverPtr()
+{
+ if (!d)
+ return;
+
+ QPropertyBindingPrivate *bindingPrivate = binding();
+ if (!bindingPrivate->deref())
+ QPropertyBindingPrivate::destroyAndFreeMemory(bindingPrivate);
+}
+
+QPropertyBindingPrivate *QBindingObserverPtr::binding() const noexcept { return QPropertyObserverPointer{d}.binding(); }
+
+QPropertyObserver *QBindingObserverPtr::operator->() { return d; }
+
+namespace QtPrivate {
+class QPropertyAdaptorSlotObject : public QUntypedPropertyData, public QSlotObjectBase
+{
+ QPropertyBindingData bindingData_;
+ QObject *obj;
+ QMetaProperty metaProperty_;
+
+#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0)
+ static void impl(int which, QSlotObjectBase *this_, QObject *r, void **a, bool *ret);
+#else
+ static void impl(QSlotObjectBase *this_, QObject *r, void **a, int which, bool *ret);
+#endif
+
+ QPropertyAdaptorSlotObject(QObject *o, const QMetaProperty& p);
+
+public:
+ static QPropertyAdaptorSlotObject *cast(QSlotObjectBase *ptr, int propertyIndex)
+ {
+ if (ptr->isImpl(&QPropertyAdaptorSlotObject::impl)) {
+ auto p = static_cast<QPropertyAdaptorSlotObject *>(ptr);
+ if (p->metaProperty_.propertyIndex() == propertyIndex)
+ return p;
+ }
+ return nullptr;
+ }
+
+ inline const QPropertyBindingData &bindingData() const { return bindingData_; }
+ inline QPropertyBindingData &bindingData() { return bindingData_; }
+ inline QObject *object() const { return obj; }
+ inline const QMetaProperty &metaProperty() const { return metaProperty_; }
+
+ friend class QT_PREPEND_NAMESPACE(QUntypedBindable);
+};
+}
+
QT_END_NAMESPACE
#endif // QPROPERTY_P_H
diff --git a/src/corelib/kernel/qpropertyprivate.h b/src/corelib/kernel/qpropertyprivate.h
index 1c7f13046f..86dc08a6bc 100644
--- a/src/corelib/kernel/qpropertyprivate.h
+++ b/src/corelib/kernel/qpropertyprivate.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QPROPERTYPRIVATE_H
#define QPROPERTYPRIVATE_H
@@ -54,6 +18,7 @@
#include <QtCore/qglobal.h>
#include <QtCore/qtaggedpointer.h>
#include <QtCore/qmetatype.h>
+#include <QtCore/qcontainerfwd.h>
#include <functional>
@@ -64,13 +29,20 @@ class QBindingStorage;
template<typename Class, typename T, auto Offset, auto Setter, auto Signal, auto Getter>
class QObjectCompatProperty;
+struct QBindingObserverPtr;
+using PendingBindingObserverList = QVarLengthArray<QBindingObserverPtr>;
+
namespace QtPrivate {
// QPropertyBindingPrivatePtr operates on a RefCountingMixin solely so that we can inline
// the constructor and copy constructor
struct RefCounted {
+
+ int refCount() const { return ref; }
+ void addRef() { ++ref; }
+ bool deref() { return --ref != 0; }
+
+private:
int ref = 0;
- void addRef() {++ref;}
- bool deref() {--ref; return ref;}
};
}
@@ -93,7 +65,7 @@ public:
QPropertyBindingPrivatePtr() noexcept : d(nullptr) { }
~QPropertyBindingPrivatePtr()
{
- if (d && (--d->ref == 0))
+ if (d && !d->deref())
destroyAndFreeMemory();
}
Q_CORE_EXPORT void destroyAndFreeMemory();
@@ -114,14 +86,14 @@ public:
reset(o);
return *this;
}
- QPropertyBindingPrivatePtr(QPropertyBindingPrivatePtr &&o) noexcept : d(qExchange(o.d, nullptr)) {}
+ QPropertyBindingPrivatePtr(QPropertyBindingPrivatePtr &&o) noexcept : d(std::exchange(o.d, nullptr)) {}
QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_MOVE_AND_SWAP(QPropertyBindingPrivatePtr)
operator bool () const noexcept { return d != nullptr; }
bool operator!() const noexcept { return d == nullptr; }
void swap(QPropertyBindingPrivatePtr &other) noexcept
- { qSwap(d, other.d); }
+ { qt_ptr_swap(d, other.d); }
friend bool operator==(const QPropertyBindingPrivatePtr &p1, const QPropertyBindingPrivatePtr &p2) noexcept
{ return p1.d == p2.d; }
@@ -151,15 +123,18 @@ private:
class QUntypedPropertyBinding;
class QPropertyBindingPrivate;
struct QPropertyBindingDataPointer;
+class QPropertyObserver;
struct QPropertyObserverPointer;
class QUntypedPropertyData
{
-public:
- // sentinel to check whether a class inherits QUntypedPropertyData
- struct InheritsQUntypedPropertyData {};
};
+namespace QtPrivate {
+template <typename T>
+using IsUntypedPropertyData = std::enable_if_t<std::is_base_of_v<QUntypedPropertyData, T>, bool>;
+}
+
template <typename T>
class QPropertyData;
@@ -184,6 +159,12 @@ struct QPropertyProxyBindingData
namespace QtPrivate {
struct BindingEvaluationState;
+/* used in BindingFunctionVTable::createFor; on all other compilers, void would work, but on
+ MSVC this causes C2182 when compiling in C++20 mode. As we only need to provide some default
+ value which gets ignored, we introduce this dummy type.
+*/
+struct MSVCWorkAround {};
+
struct BindingFunctionVTable
{
using CallFn = bool(*)(QMetaType, QUntypedPropertyData *, void *);
@@ -194,7 +175,7 @@ struct BindingFunctionVTable
const MoveCtrFn moveConstruct;
const qsizetype size;
- template<typename Callable, typename PropertyType=void>
+ template<typename Callable, typename PropertyType=MSVCWorkAround>
static constexpr BindingFunctionVTable createFor()
{
static_assert (alignof(Callable) <= alignof(std::max_align_t), "Bindings do not support overaligned functors!");
@@ -205,7 +186,7 @@ struct BindingFunctionVTable
static_assert (std::is_invocable_r_v<bool, Callable, QMetaType, QUntypedPropertyData *> );
auto untypedEvaluationFunction = static_cast<Callable *>(f);
return std::invoke(*untypedEvaluationFunction, metaType, dataPtr);
- } else if constexpr (!std::is_same_v<PropertyType, void>) { // check for void to workaround MSVC issue
+ } else if constexpr (!std::is_same_v<PropertyType, MSVCWorkAround>) {
Q_UNUSED(metaType);
QPropertyData<PropertyType> *propertyPtr = static_cast<QPropertyData<PropertyType> *>(dataPtr);
// That is allowed by POSIX even if Callable is a function pointer
@@ -219,8 +200,7 @@ struct BindingFunctionVTable
return true;
} else {
// Our code will never instantiate this
- Q_UNREACHABLE();
- return false;
+ Q_UNREACHABLE_RETURN(false);
}
},
/*destroy*/[](void *f){ static_cast<Callable *>(f)->~Callable(); },
@@ -232,7 +212,7 @@ struct BindingFunctionVTable
}
};
-template<typename Callable, typename PropertyType=void>
+template<typename Callable, typename PropertyType=MSVCWorkAround>
inline constexpr BindingFunctionVTable bindingFunctionVTable = BindingFunctionVTable::createFor<Callable, PropertyType>();
@@ -329,17 +309,23 @@ private:
{
quintptr &d = d_ptr;
if (isNotificationDelayed())
- return reinterpret_cast<QPropertyProxyBindingData *>(d_ptr & ~(BindingBit|DelayedNotificationBit))->d_ptr;
+ return proxyData()->d_ptr;
return d;
}
quintptr d() const { return d_ref(); }
+ QPropertyProxyBindingData *proxyData() const
+ {
+ Q_ASSERT(isNotificationDelayed());
+ return reinterpret_cast<QPropertyProxyBindingData *>(d_ptr & ~(BindingBit|DelayedNotificationBit));
+ }
void registerWithCurrentlyEvaluatingBinding_helper(BindingEvaluationState *currentBinding) const;
void removeBinding_helper();
enum NotificationResult { Delayed, Evaluated };
NotificationResult notifyObserver_helper(
- QUntypedPropertyData *propertyDataPtr, QPropertyObserverPointer observer,
- QBindingStorage *storage) const;
+ QUntypedPropertyData *propertyDataPtr, QBindingStorage *storage,
+ QPropertyObserverPointer observer,
+ PendingBindingObserverList &bindingObservers) const;
};
template <typename T, typename Tag>
diff --git a/src/corelib/kernel/qsequentialiterable.cpp b/src/corelib/kernel/qsequentialiterable.cpp
index aedcc9b373..c331f1de63 100644
--- a/src/corelib/kernel/qsequentialiterable.cpp
+++ b/src/corelib/kernel/qsequentialiterable.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include <QtCore/qsequentialiterable.h>
#include <QtCore/qvariant.h>
diff --git a/src/corelib/kernel/qsequentialiterable.h b/src/corelib/kernel/qsequentialiterable.h
index 7b08e2afa3..dac146d2ad 100644
--- a/src/corelib/kernel/qsequentialiterable.h
+++ b/src/corelib/kernel/qsequentialiterable.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QSEQUENTIALITERABLE_H
#define QSEQUENTIALITERABLE_H
diff --git a/src/corelib/kernel/qsharedmemory.cpp b/src/corelib/kernel/qsharedmemory.cpp
deleted file mode 100644
index 3dbbe75fc4..0000000000
--- a/src/corelib/kernel/qsharedmemory.cpp
+++ /dev/null
@@ -1,681 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qsharedmemory.h"
-#include "qsharedmemory_p.h"
-#include "qsystemsemaphore.h"
-#include <qdir.h>
-#include <qcryptographichash.h>
-#include <qdebug.h>
-#ifdef Q_OS_WIN
-# include <qt_windows.h>
-#endif
-
-#if defined(Q_OS_DARWIN)
-# include "qcore_mac_p.h"
-# if !defined(SHM_NAME_MAX)
- // Based on PSEMNAMLEN in XNU's posix_sem.c, which would
- // indicate the max length is 31, _excluding_ the zero
- // terminator. But in practice (possibly due to an off-
- // by-one bug in the kernel) the usable bytes are only 30.
-# define SHM_NAME_MAX 30
-# endif
-#endif
-
-QT_BEGIN_NAMESPACE
-
-#if !(defined(QT_NO_SHAREDMEMORY) && defined(QT_NO_SYSTEMSEMAPHORE))
-/*!
- \internal
-
- Generate a string from the key which can be any unicode string into
- the subset that the win/unix kernel allows.
-
- On Unix this will be a file name
- */
-QString
-QSharedMemoryPrivate::makePlatformSafeKey(const QString &key,
- const QString &prefix)
-{
- if (key.isEmpty())
- return QString();
-
- QByteArray hex = QCryptographicHash::hash(key.toUtf8(), QCryptographicHash::Sha1).toHex();
-
-#if defined(Q_OS_DARWIN) && defined(QT_POSIX_IPC)
- if (qt_apple_isSandboxed()) {
- // Sandboxed applications on Apple platforms require the shared memory name
- // to be in the form <application group identifier>/<custom identifier>.
- // Since we don't know which application group identifier the user wants
- // to apply, we instead document that requirement, and use the key directly.
- return key;
- } else {
- // The shared memory name limit on Apple platforms is very low (30 characters),
- // so we can't use the logic below of combining the prefix, key, and a hash,
- // to ensure a unique and valid name. Instead we use the first part of the
- // hash, which should still long enough to avoid collisions in practice.
- return QLatin1Char('/') + hex.left(SHM_NAME_MAX - 1);
- }
-#endif
-
- QString result = prefix;
- for (QChar ch : key) {
- if ((ch >= QLatin1Char('a') && ch <= QLatin1Char('z')) ||
- (ch >= QLatin1Char('A') && ch <= QLatin1Char('Z')))
- result += ch;
- }
- result.append(QLatin1String(hex));
-
-#ifdef Q_OS_WIN
- return result;
-#elif defined(QT_POSIX_IPC)
- return QLatin1Char('/') + result;
-#else
- return QDir::tempPath() + QLatin1Char('/') + result;
-#endif
-}
-#endif // QT_NO_SHAREDMEMORY && QT_NO_SHAREDMEMORY
-
-#ifndef QT_NO_SHAREDMEMORY
-
-/*!
- \class QSharedMemory
- \inmodule QtCore
- \since 4.4
-
- \brief The QSharedMemory class provides access to a shared memory segment.
-
- QSharedMemory provides access to a shared memory segment by multiple
- threads and processes. It also provides a way for a single thread or
- process to lock the memory for exclusive access.
-
- When using this class, be aware of the following platform
- differences:
-
- \list
-
- \li Windows: QSharedMemory does not "own" the shared memory segment.
- When all threads or processes that have an instance of QSharedMemory
- attached to a particular shared memory segment have either destroyed
- their instance of QSharedMemory or exited, the Windows kernel
- releases the shared memory segment automatically.
-
- \li Unix: QSharedMemory "owns" the shared memory segment. When the
- last thread or process that has an instance of QSharedMemory
- attached to a particular shared memory segment detaches from the
- segment by destroying its instance of QSharedMemory, the Unix kernel
- release the shared memory segment. But if that last thread or
- process crashes without running the QSharedMemory destructor, the
- shared memory segment survives the crash.
-
- \li HP-UX: Only one attach to a shared memory segment is allowed per
- process. This means that QSharedMemory should not be used across
- multiple threads in the same process in HP-UX.
-
- \li Apple platforms: Sandboxed applications (including apps
- shipped through the Apple App Store) require the use of POSIX
- shared memory (instead of System V shared memory), which adds
- a number of limitations, including:
-
- \list
-
- \li The key must be in the form \c {<application group identifier>/<custom identifier>},
- as documented \l {https://developer.apple.com/library/archive/documentation/Security/Conceptual/AppSandboxDesignGuide/AppSandboxInDepth/AppSandboxInDepth.html#//apple_ref/doc/uid/TP40011183-CH3-SW24}
- {here} and \l {https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_application-groups}
- {here}.
-
- \li The key length is limited to 30 characters.
-
- \li On process exit, the named shared memory entries are not
- cleaned up, so restarting the application and re-creating the
- shared memory under the same name will fail. To work around this,
- fall back to attaching to the existing shared memory entry:
-
- \code
-
- QSharedMemory shm("DEVTEAMID.app-group/shared");
- if (!shm.create(42) && shm.error() == QSharedMemory::AlreadyExists)
- shm.attach();
-
- \endcode
-
-
- \endlist
-
- \endlist
-
- Remember to lock the shared memory with lock() before reading from
- or writing to the shared memory, and remember to release the lock
- with unlock() after you are done.
-
- QSharedMemory automatically destroys the shared memory segment when
- the last instance of QSharedMemory is detached from the segment, and
- no references to the segment remain.
-
- \warning QSharedMemory changes the key in a Qt-specific way, unless otherwise
- specified. Interoperation with non-Qt applications is achieved by first creating
- a default shared memory with QSharedMemory() and then setting a native key with
- setNativeKey(). When using native keys, shared memory is not protected against
- multiple accesses on it (for example, unable to lock()) and a user-defined mechanism
- should be used to achieve such protection.
- */
-
-/*!
- \overload QSharedMemory()
-
- Constructs a shared memory object with the given \a parent. The
- shared memory object's key is not set by the constructor, so the
- shared memory object does not have an underlying shared memory
- segment attached. The key must be set with setKey() or setNativeKey()
- before create() or attach() can be used.
-
- \sa setKey()
- */
-
-#ifndef QT_NO_QOBJECT
-QSharedMemory::QSharedMemory(QObject *parent)
- : QObject(*new QSharedMemoryPrivate, parent)
-{
-}
-#else
-QSharedMemory::QSharedMemory()
- : d_ptr(new QSharedMemoryPrivate)
-{
-}
-#endif
-/*!
- Constructs a shared memory object with the given \a parent and with
- its key set to \a key. Because its key is set, its create() and
- attach() functions can be called.
-
- \sa setKey(), create(), attach()
- */
-#ifndef QT_NO_QOBJECT
-QSharedMemory::QSharedMemory(const QString &key, QObject *parent)
- : QObject(*new QSharedMemoryPrivate, parent)
-{
- setKey(key);
-}
-#else
-QSharedMemory::QSharedMemory(const QString &key)
- : d_ptr(new QSharedMemoryPrivate)
-{
- setKey(key);
-}
-#endif
-
-/*!
- The destructor clears the key, which forces the shared memory object
- to \l {detach()} {detach} from its underlying shared memory
- segment. If this shared memory object is the last one connected to
- the shared memory segment, the detach() operation destroys the
- shared memory segment.
-
- \sa detach(), isAttached()
- */
-QSharedMemory::~QSharedMemory()
-{
- setKey(QString());
-}
-
-/*!
- Sets the platform independent \a key for this shared memory object. If \a key
- is the same as the current key, the function returns without doing anything.
-
- You can call key() to retrieve the platform independent key. Internally,
- QSharedMemory converts this key into a platform specific key. If you instead
- call nativeKey(), you will get the platform specific, converted key.
-
- If the shared memory object is attached to an underlying shared memory
- segment, it will \l {detach()} {detach} from it before setting the new key.
- This function does not do an attach().
-
- \sa key(), nativeKey(), isAttached()
-*/
-void QSharedMemory::setKey(const QString &key)
-{
- Q_D(QSharedMemory);
- if (key == d->key && d->makePlatformSafeKey(key) == d->nativeKey)
- return;
-
- if (isAttached())
- detach();
- d->cleanHandle();
- d->key = key;
- d->nativeKey = d->makePlatformSafeKey(key);
-}
-
-/*!
- \since 4.8
-
- Sets the native, platform specific, \a key for this shared memory object. If
- \a key is the same as the current native key, the function returns without
- doing anything. If all you want is to assign a key to a segment, you should
- call setKey() instead.
-
- You can call nativeKey() to retrieve the native key. If a native key has been
- assigned, calling key() will return a null string.
-
- If the shared memory object is attached to an underlying shared memory
- segment, it will \l {detach()} {detach} from it before setting the new key.
- This function does not do an attach().
-
- The application will not be portable if you set a native key.
-
- \sa nativeKey(), key(), isAttached()
-*/
-void QSharedMemory::setNativeKey(const QString &key)
-{
- Q_D(QSharedMemory);
- if (key == d->nativeKey && d->key.isNull())
- return;
-
- if (isAttached())
- detach();
- d->cleanHandle();
- d->key = QString();
- d->nativeKey = key;
-}
-
-bool QSharedMemoryPrivate::initKey()
-{
- if (!cleanHandle())
- return false;
-#ifndef QT_NO_SYSTEMSEMAPHORE
- systemSemaphore.setKey(QString(), 1);
- systemSemaphore.setKey(key, 1);
- if (systemSemaphore.error() != QSystemSemaphore::NoError) {
- QString function = QLatin1String("QSharedMemoryPrivate::initKey");
- errorString = QSharedMemory::tr("%1: unable to set key on lock").arg(function);
- switch(systemSemaphore.error()) {
- case QSystemSemaphore::PermissionDenied:
- error = QSharedMemory::PermissionDenied;
- break;
- case QSystemSemaphore::KeyError:
- error = QSharedMemory::KeyError;
- break;
- case QSystemSemaphore::AlreadyExists:
- error = QSharedMemory::AlreadyExists;
- break;
- case QSystemSemaphore::NotFound:
- error = QSharedMemory::NotFound;
- break;
- case QSystemSemaphore::OutOfResources:
- error = QSharedMemory::OutOfResources;
- break;
- case QSystemSemaphore::UnknownError:
- default:
- error = QSharedMemory::UnknownError;
- break;
- }
- return false;
- }
-#endif
- errorString = QString();
- error = QSharedMemory::NoError;
- return true;
-}
-
-/*!
- Returns the key assigned with setKey() to this shared memory, or a null key
- if no key has been assigned, or if the segment is using a nativeKey(). The
- key is the identifier used by Qt applications to identify the shared memory
- segment.
-
- You can find the native, platform specific, key used by the operating system
- by calling nativeKey().
-
- \sa setKey(), setNativeKey()
- */
-QString QSharedMemory::key() const
-{
- Q_D(const QSharedMemory);
- return d->key;
-}
-
-/*!
- \since 4.8
-
- Returns the native, platform specific, key for this shared memory object. The
- native key is the identifier used by the operating system to identify the
- shared memory segment.
-
- You can use the native key to access shared memory segments that have not
- been created by Qt, or to grant shared memory access to non-Qt applications.
-
- \sa setKey(), setNativeKey()
-*/
-QString QSharedMemory::nativeKey() const
-{
- Q_D(const QSharedMemory);
- return d->nativeKey;
-}
-
-/*!
- Creates a shared memory segment of \a size bytes with the key passed to the
- constructor, set with setKey() or set with setNativeKey(), then attaches to
- the new shared memory segment with the given access \a mode and returns
- \tt true. If a shared memory segment identified by the key already exists,
- the attach operation is not performed and \tt false is returned. When the
- return value is \tt false, call error() to determine which error occurred.
-
- \sa error()
- */
-bool QSharedMemory::create(qsizetype size, AccessMode mode)
-{
- Q_D(QSharedMemory);
-
- if (!d->initKey())
- return false;
-
-#ifndef QT_NO_SYSTEMSEMAPHORE
-#ifndef Q_OS_WIN
- // Take ownership and force set initialValue because the semaphore
- // might have already existed from a previous crash.
- d->systemSemaphore.setKey(d->key, 1, QSystemSemaphore::Create);
-#endif
-#endif
-
- QString function = QLatin1String("QSharedMemory::create");
-#ifndef QT_NO_SYSTEMSEMAPHORE
- QSharedMemoryLocker lock(this);
- if (!d->key.isNull() && !d->tryLocker(&lock, function))
- return false;
-#endif
-
- if (size <= 0) {
- d->error = QSharedMemory::InvalidSize;
- d->errorString =
- QSharedMemory::tr("%1: create size is less then 0").arg(function);
- return false;
- }
-
- if (!d->create(size))
- return false;
-
- return d->attach(mode);
-}
-
-/*!
- Returns the size of the attached shared memory segment. If no shared
- memory segment is attached, 0 is returned.
-
- \note The size of the segment may be larger than the requested size that was
- passed to create().
-
- \sa create(), attach()
- */
-qsizetype QSharedMemory::size() const
-{
- Q_D(const QSharedMemory);
- return d->size;
-}
-
-/*!
- \enum QSharedMemory::AccessMode
-
- \value ReadOnly The shared memory segment is read-only. Writing to
- the shared memory segment is not allowed. An attempt to write to a
- shared memory segment created with ReadOnly causes the program to
- abort.
-
- \value ReadWrite Reading and writing the shared memory segment are
- both allowed.
-*/
-
-/*!
- Attempts to attach the process to the shared memory segment
- identified by the key that was passed to the constructor or to a
- call to setKey() or setNativeKey(). The access \a mode is \l {QSharedMemory::}
- {ReadWrite} by default. It can also be \l {QSharedMemory::}
- {ReadOnly}. Returns \c true if the attach operation is successful. If
- false is returned, call error() to determine which error occurred.
- After attaching the shared memory segment, a pointer to the shared
- memory can be obtained by calling data().
-
- \sa isAttached(), detach(), create()
- */
-bool QSharedMemory::attach(AccessMode mode)
-{
- Q_D(QSharedMemory);
-
- if (isAttached() || !d->initKey())
- return false;
-#ifndef QT_NO_SYSTEMSEMAPHORE
- QSharedMemoryLocker lock(this);
- if (!d->key.isNull() && !d->tryLocker(&lock, QLatin1String("QSharedMemory::attach")))
- return false;
-#endif
-
- if (isAttached() || !d->handle())
- return false;
-
- return d->attach(mode);
-}
-
-/*!
- Returns \c true if this process is attached to the shared memory
- segment.
-
- \sa attach(), detach()
- */
-bool QSharedMemory::isAttached() const
-{
- Q_D(const QSharedMemory);
- return (nullptr != d->memory);
-}
-
-/*!
- Detaches the process from the shared memory segment. If this was the
- last process attached to the shared memory segment, then the shared
- memory segment is released by the system, i.e., the contents are
- destroyed. The function returns \c true if it detaches the shared
- memory segment. If it returns \c false, it usually means the segment
- either isn't attached, or it is locked by another process.
-
- \sa attach(), isAttached()
- */
-bool QSharedMemory::detach()
-{
- Q_D(QSharedMemory);
- if (!isAttached())
- return false;
-
-#ifndef QT_NO_SYSTEMSEMAPHORE
- QSharedMemoryLocker lock(this);
- if (!d->key.isNull() && !d->tryLocker(&lock, QLatin1String("QSharedMemory::detach")))
- return false;
-#endif
-
- return d->detach();
-}
-
-/*!
- Returns a pointer to the contents of the shared memory segment, if
- one is attached. Otherwise it returns null. Remember to lock the
- shared memory with lock() before reading from or writing to the
- shared memory, and remember to release the lock with unlock() after
- you are done.
-
- \sa attach()
- */
-void *QSharedMemory::data()
-{
- Q_D(QSharedMemory);
- return d->memory;
-}
-
-/*!
- Returns a const pointer to the contents of the shared memory
- segment, if one is attached. Otherwise it returns null. Remember to
- lock the shared memory with lock() before reading from or writing to
- the shared memory, and remember to release the lock with unlock()
- after you are done.
-
- \sa attach(), create()
- */
-const void *QSharedMemory::constData() const
-{
- Q_D(const QSharedMemory);
- return d->memory;
-}
-
-/*!
- \overload data()
- */
-const void *QSharedMemory::data() const
-{
- Q_D(const QSharedMemory);
- return d->memory;
-}
-
-#ifndef QT_NO_SYSTEMSEMAPHORE
-/*!
- This is a semaphore that locks the shared memory segment for access
- by this process and returns \c true. If another process has locked the
- segment, this function blocks until the lock is released. Then it
- acquires the lock and returns \c true. If this function returns \c false,
- it means that you have ignored a false return from create() or attach(),
- that you have set the key with setNativeKey() or that
- QSystemSemaphore::acquire() failed due to an unknown system error.
-
- \sa unlock(), data(), QSystemSemaphore::acquire()
- */
-bool QSharedMemory::lock()
-{
- Q_D(QSharedMemory);
- if (d->lockedByMe) {
- qWarning("QSharedMemory::lock: already locked");
- return true;
- }
- if (d->systemSemaphore.acquire()) {
- d->lockedByMe = true;
- return true;
- }
- QString function = QLatin1String("QSharedMemory::lock");
- d->errorString = QSharedMemory::tr("%1: unable to lock").arg(function);
- d->error = QSharedMemory::LockError;
- return false;
-}
-
-/*!
- Releases the lock on the shared memory segment and returns \c true, if
- the lock is currently held by this process. If the segment is not
- locked, or if the lock is held by another process, nothing happens
- and false is returned.
-
- \sa lock()
- */
-bool QSharedMemory::unlock()
-{
- Q_D(QSharedMemory);
- if (!d->lockedByMe)
- return false;
- d->lockedByMe = false;
- if (d->systemSemaphore.release())
- return true;
- QString function = QLatin1String("QSharedMemory::unlock");
- d->errorString = QSharedMemory::tr("%1: unable to unlock").arg(function);
- d->error = QSharedMemory::LockError;
- return false;
-}
-#endif // QT_NO_SYSTEMSEMAPHORE
-
-/*!
- \enum QSharedMemory::SharedMemoryError
-
- \value NoError No error occurred.
-
- \value PermissionDenied The operation failed because the caller
- didn't have the required permissions.
-
- \value InvalidSize A create operation failed because the requested
- size was invalid.
-
- \value KeyError The operation failed because of an invalid key.
-
- \value AlreadyExists A create() operation failed because a shared
- memory segment with the specified key already existed.
-
- \value NotFound An attach() failed because a shared memory segment
- with the specified key could not be found.
-
- \value LockError The attempt to lock() the shared memory segment
- failed because create() or attach() failed and returned false, or
- because a system error occurred in QSystemSemaphore::acquire().
-
- \value OutOfResources A create() operation failed because there was
- not enough memory available to fill the request.
-
- \value UnknownError Something else happened and it was bad.
-*/
-
-/*!
- Returns a value indicating whether an error occurred, and, if so,
- which error it was.
-
- \sa errorString()
- */
-QSharedMemory::SharedMemoryError QSharedMemory::error() const
-{
- Q_D(const QSharedMemory);
- return d->error;
-}
-
-/*!
- Returns a text description of the last error that occurred. If
- error() returns an \l {QSharedMemory::SharedMemoryError} {error
- value}, call this function to get a text string that describes the
- error.
-
- \sa error()
- */
-QString QSharedMemory::errorString() const
-{
- Q_D(const QSharedMemory);
- return d->errorString;
-}
-
-#endif // QT_NO_SHAREDMEMORY
-
-QT_END_NAMESPACE
-
-#ifndef QT_NO_QOBJECT
-#include "moc_qsharedmemory.cpp"
-#endif
diff --git a/src/corelib/kernel/qsharedmemory.h b/src/corelib/kernel/qsharedmemory.h
deleted file mode 100644
index 0197b18624..0000000000
--- a/src/corelib/kernel/qsharedmemory.h
+++ /dev/null
@@ -1,137 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QSHAREDMEMORY_H
-#define QSHAREDMEMORY_H
-
-#include <QtCore/qglobal.h>
-#ifndef QT_NO_QOBJECT
-# include <QtCore/qobject.h>
-#else
-# include <QtCore/qobjectdefs.h>
-# include <QtCore/qscopedpointer.h>
-# include <QtCore/qstring.h>
-#endif
-QT_BEGIN_NAMESPACE
-
-
-#ifndef QT_NO_SHAREDMEMORY
-
-class QSharedMemoryPrivate;
-
-class Q_CORE_EXPORT QSharedMemory
-#ifndef QT_NO_QOBJECT
- : public QObject
-#endif
-{
-#ifndef QT_NO_QOBJECT
- Q_OBJECT
-#endif
- Q_DECLARE_PRIVATE(QSharedMemory)
-
-public:
- enum AccessMode
- {
- ReadOnly,
- ReadWrite
- };
-
- enum SharedMemoryError
- {
- NoError,
- PermissionDenied,
- InvalidSize,
- KeyError,
- AlreadyExists,
- NotFound,
- LockError,
- OutOfResources,
- UnknownError
- };
-
-#ifndef QT_NO_QOBJECT
- QSharedMemory(QObject *parent = nullptr);
- QSharedMemory(const QString &key, QObject *parent = nullptr);
-#else
- QSharedMemory();
- QSharedMemory(const QString &key);
- static QString tr(const char * str)
- {
- return QString::fromLatin1(str);
- }
-#endif
- ~QSharedMemory();
-
- void setKey(const QString &key);
- QString key() const;
- void setNativeKey(const QString &key);
- QString nativeKey() const;
-
- bool create(qsizetype size, AccessMode mode = ReadWrite);
- qsizetype size() const;
-
- bool attach(AccessMode mode = ReadWrite);
- bool isAttached() const;
- bool detach();
-
- void *data();
- const void* constData() const;
- const void *data() const;
-
-#ifndef QT_NO_SYSTEMSEMAPHORE
- bool lock();
- bool unlock();
-#endif
-
- SharedMemoryError error() const;
- QString errorString() const;
-
-private:
- Q_DISABLE_COPY(QSharedMemory)
-#ifdef QT_NO_QOBJECT
- QScopedPointer<QSharedMemoryPrivate> d_ptr;
-#endif
-};
-
-#endif // QT_NO_SHAREDMEMORY
-
-QT_END_NAMESPACE
-
-#endif // QSHAREDMEMORY_H
-
diff --git a/src/corelib/kernel/qsharedmemory_android.cpp b/src/corelib/kernel/qsharedmemory_android.cpp
deleted file mode 100644
index 7165ebcc3d..0000000000
--- a/src/corelib/kernel/qsharedmemory_android.cpp
+++ /dev/null
@@ -1,110 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2012 Collabora Ltd, author <robin.burchell@collabora.co.uk>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qsharedmemory.h"
-#include "qsharedmemory_p.h"
-#include <qdebug.h>
-
-#ifndef QT_NO_SHAREDMEMORY
-QT_BEGIN_NAMESPACE
-
-QSharedMemoryPrivate::QSharedMemoryPrivate()
- : QObjectPrivate(), memory(0), size(0), error(QSharedMemory::NoError),
-#ifndef QT_NO_SYSTEMSEMAPHORE
- systemSemaphore(QString()), lockedByMe(false),
-#endif
- unix_key(0)
-{
-}
-
-void QSharedMemoryPrivate::setErrorString(QLatin1String function)
-{
- Q_UNUSED(function);
- Q_UNIMPLEMENTED();
-}
-
-key_t QSharedMemoryPrivate::handle()
-{
- Q_UNIMPLEMENTED();
- return 0;
-}
-
-#endif // QT_NO_SHAREDMEMORY
-
-#if !(defined(QT_NO_SHAREDMEMORY) && defined(QT_NO_SYSTEMSEMAPHORE))
-int QSharedMemoryPrivate::createUnixKeyFile(const QString &fileName)
-{
- Q_UNUSED(fileName);
- Q_UNIMPLEMENTED();
- return 0;
-}
-#endif // QT_NO_SHAREDMEMORY && QT_NO_SYSTEMSEMAPHORE
-
-#ifndef QT_NO_SHAREDMEMORY
-
-bool QSharedMemoryPrivate::cleanHandle()
-{
- Q_UNIMPLEMENTED();
- return true;
-}
-
-bool QSharedMemoryPrivate::create(qsizetype size)
-{
- Q_UNUSED(size);
- Q_UNIMPLEMENTED();
- return false;
-}
-
-bool QSharedMemoryPrivate::attach(QSharedMemory::AccessMode mode)
-{
- Q_UNUSED(mode);
- Q_UNIMPLEMENTED();
- return false;
-}
-
-bool QSharedMemoryPrivate::detach()
-{
- Q_UNIMPLEMENTED();
- return false;
-}
-
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_SHAREDMEMORY
diff --git a/src/corelib/kernel/qsharedmemory_p.h b/src/corelib/kernel/qsharedmemory_p.h
deleted file mode 100644
index e06e7e86f3..0000000000
--- a/src/corelib/kernel/qsharedmemory_p.h
+++ /dev/null
@@ -1,186 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QSHAREDMEMORY_P_H
-#define QSHAREDMEMORY_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include "qsharedmemory.h"
-
-#include <QtCore/qstring.h>
-
-#ifdef QT_NO_SHAREDMEMORY
-# ifndef QT_NO_SYSTEMSEMAPHORE
-
-QT_BEGIN_NAMESPACE
-
-namespace QSharedMemoryPrivate
-{
- int createUnixKeyFile(const QString &fileName);
- QString makePlatformSafeKey(const QString &key,
- const QString &prefix = QLatin1String("qipc_sharedmemory_"));
-}
-
-QT_END_NAMESPACE
-
-# endif
-#else
-
-#include "qsystemsemaphore.h"
-
-#ifndef QT_NO_QOBJECT
-# include "private/qobject_p.h"
-#endif
-
-#if !defined(Q_OS_WIN) && !defined(Q_OS_ANDROID) && !defined(Q_OS_INTEGRITY) && !defined(Q_OS_RTEMS)
-# include <sys/sem.h>
-#endif
-
-QT_BEGIN_NAMESPACE
-
-#ifndef QT_NO_SYSTEMSEMAPHORE
-/*!
- Helper class
- */
-class QSharedMemoryLocker
-{
-
-public:
- inline QSharedMemoryLocker(QSharedMemory *sharedMemory) : q_sm(sharedMemory)
- {
- Q_ASSERT(q_sm);
- }
-
- inline ~QSharedMemoryLocker()
- {
- if (q_sm)
- q_sm->unlock();
- }
-
- inline bool lock()
- {
- if (q_sm && q_sm->lock())
- return true;
- q_sm = nullptr;
- return false;
- }
-
-private:
- QSharedMemory *q_sm;
-};
-#endif // QT_NO_SYSTEMSEMAPHORE
-
-class Q_AUTOTEST_EXPORT QSharedMemoryPrivate
-#ifndef QT_NO_QOBJECT
- : public QObjectPrivate
-#endif
-{
-#ifndef QT_NO_QOBJECT
- Q_DECLARE_PUBLIC(QSharedMemory)
-#endif
-
-public:
- QSharedMemoryPrivate();
-
- void *memory;
- qsizetype size;
- QString key;
- QString nativeKey;
- QSharedMemory::SharedMemoryError error;
- QString errorString;
-#ifndef QT_NO_SYSTEMSEMAPHORE
- QSystemSemaphore systemSemaphore;
- bool lockedByMe;
-#endif
-
- static int createUnixKeyFile(const QString &fileName);
- static QString makePlatformSafeKey(const QString &key,
- const QString &prefix = QLatin1String("qipc_sharedmemory_"));
-#ifdef Q_OS_WIN
- Qt::HANDLE handle();
-#elif defined(QT_POSIX_IPC)
- int handle();
-#else
- key_t handle();
-#endif
- bool initKey();
- bool cleanHandle();
- bool create(qsizetype size);
- bool attach(QSharedMemory::AccessMode mode);
- bool detach();
-
- void setErrorString(QLatin1String function);
-
-#ifndef QT_NO_SYSTEMSEMAPHORE
- bool tryLocker(QSharedMemoryLocker *locker, const QString &function) {
- if (!locker->lock()) {
- errorString = QSharedMemory::tr("%1: unable to lock").arg(function);
- error = QSharedMemory::LockError;
- return false;
- }
- return true;
- }
-#endif // QT_NO_SYSTEMSEMAPHORE
-
-private:
-#ifdef Q_OS_WIN
- Qt::HANDLE hand;
-#elif defined(QT_POSIX_IPC)
- int hand;
-#else
- key_t unix_key;
-#endif
-};
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_SHAREDMEMORY
-
-#endif // QSHAREDMEMORY_P_H
-
diff --git a/src/corelib/kernel/qsharedmemory_posix.cpp b/src/corelib/kernel/qsharedmemory_posix.cpp
deleted file mode 100644
index 9406e200be..0000000000
--- a/src/corelib/kernel/qsharedmemory_posix.cpp
+++ /dev/null
@@ -1,234 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2015 Konstantin Ritt <ritt.ks@gmail.com>
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2015 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Tobias Koenig <tobias.koenig@kdab.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qplatformdefs.h"
-
-#include "qsharedmemory.h"
-#include "qsharedmemory_p.h"
-#include "qsystemsemaphore.h"
-#include <qfile.h>
-
-#include <errno.h>
-
-#ifdef QT_POSIX_IPC
-
-#ifndef QT_NO_SHAREDMEMORY
-#include <sys/types.h>
-#include <sys/mman.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <unistd.h>
-
-#include "private/qcore_unix_p.h"
-
-QT_BEGIN_NAMESPACE
-
-int QSharedMemoryPrivate::handle()
-{
- // don't allow making handles on empty keys
- const QString safeKey = makePlatformSafeKey(key);
- if (safeKey.isEmpty()) {
- errorString = QSharedMemory::tr("%1: key is empty").arg(QLatin1String("QSharedMemory::handle"));
- error = QSharedMemory::KeyError;
- return 0;
- }
-
- return 1;
-}
-
-bool QSharedMemoryPrivate::cleanHandle()
-{
- qt_safe_close(hand);
- hand = -1;
-
- return true;
-}
-
-bool QSharedMemoryPrivate::create(qsizetype size)
-{
- if (!handle())
- return false;
-
- const QByteArray shmName = QFile::encodeName(makePlatformSafeKey(key));
-
- int fd;
-#ifdef O_CLOEXEC
- // First try with O_CLOEXEC flag, if that fails, fall back to normal flags
- EINTR_LOOP(fd, ::shm_open(shmName.constData(), O_RDWR | O_CREAT | O_EXCL | O_CLOEXEC, 0600));
- if (fd == -1)
- EINTR_LOOP(fd, ::shm_open(shmName.constData(), O_RDWR | O_CREAT | O_EXCL, 0600));
-#else
- EINTR_LOOP(fd, ::shm_open(shmName.constData(), O_RDWR | O_CREAT | O_EXCL, 0600));
-#endif
- if (fd == -1) {
- const int errorNumber = errno;
- const QLatin1String function("QSharedMemory::attach (shm_open)");
- switch (errorNumber) {
- case EINVAL:
- errorString = QSharedMemory::tr("%1: bad name").arg(function);
- error = QSharedMemory::KeyError;
- break;
- default:
- setErrorString(function);
- }
- return false;
- }
-
- // the size may only be set once
- int ret;
- EINTR_LOOP(ret, QT_FTRUNCATE(fd, size));
- if (ret == -1) {
- setErrorString(QLatin1String("QSharedMemory::create (ftruncate)"));
- qt_safe_close(fd);
- return false;
- }
-
- qt_safe_close(fd);
-
- return true;
-}
-
-bool QSharedMemoryPrivate::attach(QSharedMemory::AccessMode mode)
-{
- const QByteArray shmName = QFile::encodeName(makePlatformSafeKey(key));
-
- const int oflag = (mode == QSharedMemory::ReadOnly ? O_RDONLY : O_RDWR);
- const mode_t omode = (mode == QSharedMemory::ReadOnly ? 0400 : 0600);
-
-#ifdef O_CLOEXEC
- // First try with O_CLOEXEC flag, if that fails, fall back to normal flags
- EINTR_LOOP(hand, ::shm_open(shmName.constData(), oflag | O_CLOEXEC, omode));
- if (hand == -1)
- EINTR_LOOP(hand, ::shm_open(shmName.constData(), oflag, omode));
-#else
- EINTR_LOOP(hand, ::shm_open(shmName.constData(), oflag, omode));
-#endif
- if (hand == -1) {
- const int errorNumber = errno;
- const QLatin1String function("QSharedMemory::attach (shm_open)");
- switch (errorNumber) {
- case EINVAL:
- errorString = QSharedMemory::tr("%1: bad name").arg(function);
- error = QSharedMemory::KeyError;
- break;
- default:
- setErrorString(function);
- }
- hand = -1;
- return false;
- }
-
- // grab the size
- QT_STATBUF st;
- if (QT_FSTAT(hand, &st) == -1) {
- setErrorString(QLatin1String("QSharedMemory::attach (fstat)"));
- cleanHandle();
- return false;
- }
- size = qsizetype(st.st_size);
-
- // grab the memory
- const int mprot = (mode == QSharedMemory::ReadOnly ? PROT_READ : PROT_READ | PROT_WRITE);
- memory = QT_MMAP(0, size_t(size), mprot, MAP_SHARED, hand, 0);
- if (memory == MAP_FAILED || !memory) {
- setErrorString(QLatin1String("QSharedMemory::attach (mmap)"));
- cleanHandle();
- memory = 0;
- size = 0;
- return false;
- }
-
-#ifdef F_ADD_SEALS
- // Make sure the shared memory region will not shrink
- // otherwise someone could cause SIGBUS on us.
- // (see http://lwn.net/Articles/594919/)
- fcntl(hand, F_ADD_SEALS, F_SEAL_SHRINK);
-#endif
-
- return true;
-}
-
-bool QSharedMemoryPrivate::detach()
-{
- // detach from the memory segment
- if (::munmap(memory, size_t(size)) == -1) {
- setErrorString(QLatin1String("QSharedMemory::detach (munmap)"));
- return false;
- }
- memory = 0;
- size = 0;
-
-#ifdef Q_OS_QNX
- // On QNX the st_nlink field of struct stat contains the number of
- // active shm_open() connections to the shared memory file, so we
- // can use it to automatically clean up the file once the last
- // user has detached from it.
-
- // get the number of current attachments
- int shm_nattch = 0;
- QT_STATBUF st;
- if (QT_FSTAT(hand, &st) == 0) {
- // subtract 2 from linkcount: one for our own open and one for the dir entry
- shm_nattch = st.st_nlink - 2;
- }
-
- cleanHandle();
-
- // if there are no attachments then unlink the shared memory
- if (shm_nattch == 0) {
- const QByteArray shmName = QFile::encodeName(makePlatformSafeKey(key));
- if (::shm_unlink(shmName.constData()) == -1 && errno != ENOENT)
- setErrorString(QLatin1String("QSharedMemory::detach (shm_unlink)"));
- }
-#else
- // On non-QNX systems (tested Linux and Haiku), the st_nlink field is always 1,
- // so we'll simply leak the shared memory files.
- cleanHandle();
-#endif
-
- return true;
-}
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_SHAREDMEMORY
-
-#endif // QT_POSIX_IPC
diff --git a/src/corelib/kernel/qsharedmemory_systemv.cpp b/src/corelib/kernel/qsharedmemory_systemv.cpp
deleted file mode 100644
index 65ad23b9f6..0000000000
--- a/src/corelib/kernel/qsharedmemory_systemv.cpp
+++ /dev/null
@@ -1,260 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qplatformdefs.h"
-
-#include "qsharedmemory.h"
-#include "qsharedmemory_p.h"
-#include "qsystemsemaphore.h"
-#include <qdir.h>
-#include <qdebug.h>
-
-#include <errno.h>
-
-#ifndef QT_POSIX_IPC
-
-#ifndef QT_NO_SHAREDMEMORY
-#include <sys/types.h>
-#include <sys/ipc.h>
-#include <sys/shm.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <unistd.h>
-#endif //QT_NO_SHAREDMEMORY
-
-#include "private/qcore_unix_p.h"
-
-#ifndef QT_NO_SHAREDMEMORY
-QT_BEGIN_NAMESPACE
-
-/*!
- \internal
-
- If not already made create the handle used for accessing the shared memory.
-*/
-key_t QSharedMemoryPrivate::handle()
-{
- // already made
- if (unix_key)
- return unix_key;
-
- // don't allow making handles on empty keys
- if (nativeKey.isEmpty()) {
- errorString = QSharedMemory::tr("%1: key is empty").arg(QLatin1String("QSharedMemory::handle:"));
- error = QSharedMemory::KeyError;
- return 0;
- }
-
- // ftok requires that an actual file exists somewhere
- if (!QFile::exists(nativeKey)) {
- errorString = QSharedMemory::tr("%1: UNIX key file doesn't exist").arg(QLatin1String("QSharedMemory::handle:"));
- error = QSharedMemory::NotFound;
- return 0;
- }
-
- unix_key = ftok(QFile::encodeName(nativeKey).constData(), 'Q');
- if (-1 == unix_key) {
- errorString = QSharedMemory::tr("%1: ftok failed").arg(QLatin1String("QSharedMemory::handle:"));
- error = QSharedMemory::KeyError;
- unix_key = 0;
- }
- return unix_key;
-}
-
-#endif // QT_NO_SHAREDMEMORY
-
-#if !(defined(QT_NO_SHAREDMEMORY) && defined(QT_NO_SYSTEMSEMAPHORE))
-/*!
- \internal
- Creates the unix file if needed.
- returns \c true if the unix file was created.
-
- -1 error
- 0 already existed
- 1 created
- */
-int QT_PREPEND_NAMESPACE(QSharedMemoryPrivate)::createUnixKeyFile(const QString &fileName)
-{
- int fd = qt_safe_open(QFile::encodeName(fileName).constData(),
- O_EXCL | O_CREAT | O_RDWR, 0640);
- if (-1 == fd) {
- if (errno == EEXIST)
- return 0;
- return -1;
- } else {
- close(fd);
- }
- return 1;
-}
-#endif // QT_NO_SHAREDMEMORY && QT_NO_SYSTEMSEMAPHORE
-
-#ifndef QT_NO_SHAREDMEMORY
-
-bool QSharedMemoryPrivate::cleanHandle()
-{
- unix_key = 0;
- return true;
-}
-
-bool QSharedMemoryPrivate::create(qsizetype size)
-{
- // build file if needed
- bool createdFile = false;
- int built = createUnixKeyFile(nativeKey);
- if (built == -1) {
- errorString = QSharedMemory::tr("%1: unable to make key").arg(QLatin1String("QSharedMemory::handle:"));
- error = QSharedMemory::KeyError;
- return false;
- }
- if (built == 1) {
- createdFile = true;
- }
-
- // get handle
- if (!handle()) {
- if (createdFile)
- QFile::remove(nativeKey);
- return false;
- }
-
- // create
- if (-1 == shmget(unix_key, size_t(size), 0600 | IPC_CREAT | IPC_EXCL)) {
- const QLatin1String function("QSharedMemory::create");
- switch (errno) {
- case EINVAL:
- errorString = QSharedMemory::tr("%1: system-imposed size restrictions").arg(QLatin1String("QSharedMemory::handle"));
- error = QSharedMemory::InvalidSize;
- break;
- default:
- setErrorString(function);
- }
- if (createdFile && error != QSharedMemory::AlreadyExists)
- QFile::remove(nativeKey);
- return false;
- }
-
- return true;
-}
-
-bool QSharedMemoryPrivate::attach(QSharedMemory::AccessMode mode)
-{
- // grab the shared memory segment id
- int id = shmget(unix_key, 0, (mode == QSharedMemory::ReadOnly ? 0400 : 0600));
- if (-1 == id) {
- setErrorString(QLatin1String("QSharedMemory::attach (shmget)"));
- return false;
- }
-
- // grab the memory
- memory = shmat(id, nullptr, (mode == QSharedMemory::ReadOnly ? SHM_RDONLY : 0));
- if ((void *)-1 == memory) {
- memory = nullptr;
- setErrorString(QLatin1String("QSharedMemory::attach (shmat)"));
- return false;
- }
-
- // grab the size
- shmid_ds shmid_ds;
- if (!shmctl(id, IPC_STAT, &shmid_ds)) {
- size = (qsizetype)shmid_ds.shm_segsz;
- } else {
- setErrorString(QLatin1String("QSharedMemory::attach (shmctl)"));
- return false;
- }
-
- return true;
-}
-
-bool QSharedMemoryPrivate::detach()
-{
- // detach from the memory segment
- if (-1 == shmdt(memory)) {
- const QLatin1String function("QSharedMemory::detach");
- switch (errno) {
- case EINVAL:
- errorString = QSharedMemory::tr("%1: not attached").arg(function);
- error = QSharedMemory::NotFound;
- break;
- default:
- setErrorString(function);
- }
- return false;
- }
- memory = nullptr;
- size = 0;
-
- // Get the number of current attachments
- int id = shmget(unix_key, 0, 0400);
- cleanHandle();
-
- struct shmid_ds shmid_ds;
- if (0 != shmctl(id, IPC_STAT, &shmid_ds)) {
- switch (errno) {
- case EINVAL:
- return true;
- default:
- return false;
- }
- }
- // If there are no attachments then remove it.
- if (shmid_ds.shm_nattch == 0) {
- // mark for removal
- if (-1 == shmctl(id, IPC_RMID, &shmid_ds)) {
- setErrorString(QLatin1String("QSharedMemory::remove"));
- switch (errno) {
- case EINVAL:
- return true;
- default:
- return false;
- }
- }
-
- // remove file
- if (!QFile::remove(nativeKey))
- return false;
- }
- return true;
-}
-
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_SHAREDMEMORY
-
-#endif // QT_POSIX_IPC
diff --git a/src/corelib/kernel/qsharedmemory_unix.cpp b/src/corelib/kernel/qsharedmemory_unix.cpp
deleted file mode 100644
index bc0f3b03ca..0000000000
--- a/src/corelib/kernel/qsharedmemory_unix.cpp
+++ /dev/null
@@ -1,116 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qplatformdefs.h"
-
-#include "qsharedmemory.h"
-#include "qsharedmemory_p.h"
-#include "qsystemsemaphore.h"
-#include <qdebug.h>
-
-#include <errno.h>
-
-#ifndef QT_NO_SHAREDMEMORY
-#include <sys/types.h>
-#ifndef QT_POSIX_IPC
-#include <sys/ipc.h>
-#include <sys/shm.h>
-#else
-#include <sys/mman.h>
-#endif
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <unistd.h>
-#endif //QT_NO_SHAREDMEMORY
-
-#include "private/qcore_unix_p.h"
-
-#ifndef QT_NO_SHAREDMEMORY
-QT_BEGIN_NAMESPACE
-
-QSharedMemoryPrivate::QSharedMemoryPrivate() :
-#ifndef QT_NO_QOBJECT
- QObjectPrivate(),
-#endif
- memory(nullptr), size(0), error(QSharedMemory::NoError),
-#ifndef QT_NO_SYSTEMSEMAPHORE
- systemSemaphore(QString()), lockedByMe(false),
-#endif
-#ifndef QT_POSIX_IPC
- unix_key(0)
-#else
- hand(-1)
-#endif
-{
-}
-
-void QSharedMemoryPrivate::setErrorString(QLatin1String function)
-{
- // EINVAL is handled in functions so they can give better error strings
- switch (errno) {
- case EACCES:
- errorString = QSharedMemory::tr("%1: permission denied").arg(function);
- error = QSharedMemory::PermissionDenied;
- break;
- case EEXIST:
- errorString = QSharedMemory::tr("%1: already exists").arg(function);
- error = QSharedMemory::AlreadyExists;
- break;
- case ENOENT:
- errorString = QSharedMemory::tr("%1: doesn't exist").arg(function);
- error = QSharedMemory::NotFound;
- break;
- case EMFILE:
- case ENOMEM:
- case ENOSPC:
- errorString = QSharedMemory::tr("%1: out of resources").arg(function);
- error = QSharedMemory::OutOfResources;
- break;
- default:
- errorString = QSharedMemory::tr("%1: unknown error %2").arg(function).arg(errno);
- error = QSharedMemory::UnknownError;
-#if defined QSHAREDMEMORY_DEBUG
- qDebug() << errorString << "key" << key << "errno" << errno << EINVAL;
-#endif
- }
-}
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_SHAREDMEMORY
diff --git a/src/corelib/kernel/qsharedmemory_win.cpp b/src/corelib/kernel/qsharedmemory_win.cpp
deleted file mode 100644
index 30ae5fb275..0000000000
--- a/src/corelib/kernel/qsharedmemory_win.cpp
+++ /dev/null
@@ -1,191 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qsharedmemory.h"
-#include "qsharedmemory_p.h"
-#include "qsystemsemaphore.h"
-#include <qdebug.h>
-#include <qt_windows.h>
-
-QT_BEGIN_NAMESPACE
-
-#ifndef QT_NO_SHAREDMEMORY
-
-QSharedMemoryPrivate::QSharedMemoryPrivate() :
-#ifndef QT_NO_QOBJECT
- QObjectPrivate(),
-#endif
- memory(0), size(0), error(QSharedMemory::NoError),
- systemSemaphore(QString()), lockedByMe(false), hand(0)
-{
-}
-
-void QSharedMemoryPrivate::setErrorString(QLatin1String function)
-{
- DWORD windowsError = GetLastError();
- if (windowsError == 0)
- return;
- switch (windowsError) {
- case ERROR_ALREADY_EXISTS:
- error = QSharedMemory::AlreadyExists;
- errorString = QSharedMemory::tr("%1: already exists").arg(function);
- break;
- case ERROR_FILE_NOT_FOUND:
- error = QSharedMemory::NotFound;
- errorString = QSharedMemory::tr("%1: doesn't exist").arg(function);
- break;
- case ERROR_COMMITMENT_LIMIT:
- error = QSharedMemory::InvalidSize;
- errorString = QSharedMemory::tr("%1: invalid size").arg(function);
- break;
- case ERROR_NO_SYSTEM_RESOURCES:
- case ERROR_NOT_ENOUGH_MEMORY:
- error = QSharedMemory::OutOfResources;
- errorString = QSharedMemory::tr("%1: out of resources").arg(function);
- break;
- case ERROR_ACCESS_DENIED:
- error = QSharedMemory::PermissionDenied;
- errorString = QSharedMemory::tr("%1: permission denied").arg(function);
- break;
- default:
- errorString = QSharedMemory::tr("%1: unknown error %2").arg(function).arg(windowsError);
- error = QSharedMemory::UnknownError;
-#if defined QSHAREDMEMORY_DEBUG
- qDebug() << errorString << "key" << key;
-#endif
- }
-}
-
-HANDLE QSharedMemoryPrivate::handle()
-{
- if (!hand) {
- const QLatin1String function("QSharedMemory::handle");
- if (nativeKey.isEmpty()) {
- error = QSharedMemory::KeyError;
- errorString = QSharedMemory::tr("%1: unable to make key").arg(function);
- return 0;
- }
- hand = OpenFileMapping(FILE_MAP_ALL_ACCESS, false,
- reinterpret_cast<const wchar_t *>(nativeKey.utf16()));
- if (!hand) {
- setErrorString(function);
- return 0;
- }
- }
- return hand;
-}
-
-bool QSharedMemoryPrivate::cleanHandle()
-{
- if (hand != 0 && !CloseHandle(hand)) {
- hand = 0;
- setErrorString(QLatin1String("QSharedMemory::cleanHandle"));
- return false;
- }
- hand = 0;
- return true;
-}
-
-bool QSharedMemoryPrivate::create(qsizetype size)
-{
- const QLatin1String function("QSharedMemory::create");
- if (nativeKey.isEmpty()) {
- error = QSharedMemory::KeyError;
- errorString = QSharedMemory::tr("%1: key error").arg(function);
- return false;
- }
-
- // Create the file mapping.
- DWORD high, low;
- if constexpr (sizeof(qsizetype) == 8)
- high = DWORD(quint64(size) >> 32);
- else
- high = 0;
- low = DWORD(size_t(size) & 0xffffffff);
- hand = CreateFileMapping(INVALID_HANDLE_VALUE, 0, PAGE_READWRITE, high, low,
- reinterpret_cast<const wchar_t *>(nativeKey.utf16()));
- setErrorString(function);
-
- // hand is valid when it already exists unlike unix so explicitly check
- return error != QSharedMemory::AlreadyExists && hand;
-}
-
-bool QSharedMemoryPrivate::attach(QSharedMemory::AccessMode mode)
-{
- // Grab a pointer to the memory block
- int permissions = (mode == QSharedMemory::ReadOnly ? FILE_MAP_READ : FILE_MAP_ALL_ACCESS);
- memory = (void *)MapViewOfFile(handle(), permissions, 0, 0, 0);
- if (0 == memory) {
- setErrorString(QLatin1String("QSharedMemory::attach"));
- cleanHandle();
- return false;
- }
-
- // Grab the size of the memory we have been given (a multiple of 4K on windows)
- MEMORY_BASIC_INFORMATION info;
- if (!VirtualQuery(memory, &info, sizeof(info))) {
- // Windows doesn't set an error code on this one,
- // it should only be a kernel memory error.
- error = QSharedMemory::UnknownError;
- errorString = QSharedMemory::tr("%1: size query failed").arg(QLatin1String("QSharedMemory::attach: "));
- return false;
- }
- size = qsizetype(info.RegionSize);
-
- return true;
-}
-
-bool QSharedMemoryPrivate::detach()
-{
- // umap memory
- if (!UnmapViewOfFile(memory)) {
- setErrorString(QLatin1String("QSharedMemory::detach"));
- return false;
- }
- memory = 0;
- size = 0;
-
- // close handle
- return cleanHandle();
-}
-
-#endif //QT_NO_SHAREDMEMORY
-
-
-QT_END_NAMESPACE
diff --git a/src/corelib/kernel/qsignalmapper.cpp b/src/corelib/kernel/qsignalmapper.cpp
index 0c9b0cd951..65d766db4a 100644
--- a/src/corelib/kernel/qsignalmapper.cpp
+++ b/src/corelib/kernel/qsignalmapper.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qglobal.h"
@@ -49,11 +13,6 @@ class QSignalMapperPrivate : public QObjectPrivate
{
Q_DECLARE_PUBLIC(QSignalMapper)
public:
- void _q_senderDestroyed()
- {
- Q_Q(QSignalMapper);
- q->removeMappings(q->sender());
- }
template <class Signal, class Container>
void emitMappedValue(QObject *sender, Signal signal, const Container &mappedValues)
@@ -165,7 +124,7 @@ void QSignalMapper::setMapping(QObject *sender, int id)
{
Q_D(QSignalMapper);
d->intHash.insert(sender, id);
- connect(sender, SIGNAL(destroyed()), this, SLOT(_q_senderDestroyed()));
+ connect(sender, &QObject::destroyed, this, &QSignalMapper::removeMappings);
}
/*!
@@ -178,7 +137,7 @@ void QSignalMapper::setMapping(QObject *sender, const QString &text)
{
Q_D(QSignalMapper);
d->stringHash.insert(sender, text);
- connect(sender, SIGNAL(destroyed()), this, SLOT(_q_senderDestroyed()));
+ connect(sender, &QObject::destroyed, this, &QSignalMapper::removeMappings);
}
/*!
@@ -191,7 +150,7 @@ void QSignalMapper::setMapping(QObject *sender, QObject *object)
{
Q_D(QSignalMapper);
d->objectHash.insert(sender, object);
- connect(sender, SIGNAL(destroyed()), this, SLOT(_q_senderDestroyed()));
+ connect(sender, &QObject::destroyed, this, &QSignalMapper::removeMappings);
}
/*!
diff --git a/src/corelib/kernel/qsignalmapper.h b/src/corelib/kernel/qsignalmapper.h
index e92b275428..af0be52ee5 100644
--- a/src/corelib/kernel/qsignalmapper.h
+++ b/src/corelib/kernel/qsignalmapper.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QSIGNALMAPPER_H
#define QSIGNALMAPPER_H
@@ -74,7 +38,6 @@ public Q_SLOTS:
private:
Q_DISABLE_COPY(QSignalMapper)
- Q_PRIVATE_SLOT(d_func(), void _q_senderDestroyed())
};
QT_END_NAMESPACE
diff --git a/src/corelib/kernel/qsingleshottimer_p.h b/src/corelib/kernel/qsingleshottimer_p.h
new file mode 100644
index 0000000000..dd1402f63a
--- /dev/null
+++ b/src/corelib/kernel/qsingleshottimer_p.h
@@ -0,0 +1,141 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// Copyright (C) 2016 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QSINGLESHOTTIMER_P_H
+#define QSINGLESHOTTIMER_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include "qabstracteventdispatcher.h"
+#include "qcoreapplication.h"
+#include "qmetaobject_p.h"
+#include "private/qnumeric_p.h"
+
+#include <chrono>
+
+QT_BEGIN_NAMESPACE
+
+class QSingleShotTimer : public QObject
+{
+ Q_OBJECT
+
+ Qt::TimerId timerId = Qt::TimerId::Invalid;
+
+public:
+ // use the same duration type
+ using Duration = QAbstractEventDispatcher::Duration;
+
+ inline ~QSingleShotTimer();
+ inline QSingleShotTimer(Duration interval, Qt::TimerType timerType,
+ const QObject *r, const char *member);
+ inline QSingleShotTimer(Duration interval, Qt::TimerType timerType,
+ const QObject *r, QtPrivate::QSlotObjectBase *slotObj);
+
+ inline void startTimerForReceiver(Duration interval, Qt::TimerType timerType,
+ const QObject *receiver);
+
+ static Duration fromMsecs(std::chrono::milliseconds ms)
+ {
+ using namespace std::chrono;
+ using ratio = std::ratio_divide<std::milli, Duration::period>;
+ static_assert(ratio::den == 1);
+
+ Duration::rep r;
+ if (qMulOverflow<ratio::num>(ms.count(), &r)) {
+ qWarning("QTimer::singleShot(std::chrono::milliseconds, ...): "
+ "interval argument overflowed when converted to nanoseconds.");
+ return Duration::max();
+ }
+ return Duration{r};
+ }
+Q_SIGNALS:
+ void timeout();
+
+private:
+ inline void timerEvent(QTimerEvent *) override;
+};
+
+QSingleShotTimer::QSingleShotTimer(Duration interval, Qt::TimerType timerType,
+ const QObject *r, const char *member)
+ : QObject(QAbstractEventDispatcher::instance())
+{
+ connect(this, SIGNAL(timeout()), r, member);
+ startTimerForReceiver(interval, timerType, r);
+}
+
+QSingleShotTimer::QSingleShotTimer(Duration interval, Qt::TimerType timerType,
+ const QObject *r, QtPrivate::QSlotObjectBase *slotObj)
+ : QObject(QAbstractEventDispatcher::instance())
+{
+ int signal_index = QMetaObjectPrivate::signalOffset(&staticMetaObject);
+ Q_ASSERT(QMetaObjectPrivate::signal(&staticMetaObject, signal_index).name() == "timeout");
+ QObjectPrivate::connectImpl(this, signal_index, r ? r : this, nullptr, slotObj,
+ Qt::AutoConnection, nullptr, &staticMetaObject);
+
+ startTimerForReceiver(interval, timerType, r);
+}
+
+QSingleShotTimer::~QSingleShotTimer()
+{
+ if (timerId > Qt::TimerId::Invalid)
+ killTimer(timerId);
+}
+
+/*
+ Move the timer, and the dispatching and handling of the timer event, into
+ the same thread as where it will be handled, so that it fires reliably even
+ if the thread that set up the timer is busy.
+*/
+void QSingleShotTimer::startTimerForReceiver(Duration interval, Qt::TimerType timerType,
+ const QObject *receiver)
+{
+ if (receiver && receiver->thread() != thread()) {
+ // Avoid leaking the QSingleShotTimer instance in case the application exits before the
+ // timer fires
+ connect(QCoreApplication::instance(), &QCoreApplication::aboutToQuit, this,
+ &QObject::deleteLater);
+ setParent(nullptr);
+ moveToThread(receiver->thread());
+
+ QDeadlineTimer deadline(interval, timerType);
+ auto invokable = [this, deadline, timerType] {
+ if (deadline.hasExpired()) {
+ Q_EMIT timeout();
+ } else {
+ timerId = Qt::TimerId{startTimer(deadline.remainingTimeAsDuration(), timerType)};
+ }
+ };
+ QMetaObject::invokeMethod(this, invokable, Qt::QueuedConnection);
+ } else {
+ timerId = Qt::TimerId{startTimer(interval, timerType)};
+ }
+}
+
+void QSingleShotTimer::timerEvent(QTimerEvent *)
+{
+ // need to kill the timer _before_ we emit timeout() in case the
+ // slot connected to timeout calls processEvents()
+ if (timerId > Qt::TimerId::Invalid)
+ killTimer(std::exchange(timerId, Qt::TimerId::Invalid));
+
+ Q_EMIT timeout();
+
+ // we would like to use delete later here, but it feels like a
+ // waste to post a new event to handle this event, so we just unset the flag
+ // and explicitly delete...
+ delete this;
+}
+
+QT_END_NAMESPACE
+
+#endif // QSINGLESHOTTIMER_P_H
diff --git a/src/corelib/kernel/qsocketnotifier.cpp b/src/corelib/kernel/qsocketnotifier.cpp
index 8d4052b8f9..4e4cf3666b 100644
--- a/src/corelib/kernel/qsocketnotifier.cpp
+++ b/src/corelib/kernel/qsocketnotifier.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#define BUILDING_QSOCKETNOTIFIER
#include "qsocketnotifier.h"
@@ -52,12 +16,16 @@
#include <private/qthread_p.h>
#include <QtCore/QLoggingCategory>
+#include <QtCore/qpointer.h>
QT_BEGIN_NAMESPACE
Q_DECLARE_LOGGING_CATEGORY(lcSocketNotifierDeprecation)
Q_LOGGING_CATEGORY(lcSocketNotifierDeprecation, "qt.core.socketnotifier_deprecation");
+QT_IMPL_METATYPE_EXTERN_TAGGED(QSocketNotifier::Type, QSocketNotifier_Type)
+QT_IMPL_METATYPE_EXTERN(QSocketDescriptor)
+
class QSocketNotifierPrivate : public QObjectPrivate
{
Q_DECLARE_PUBLIC(QSocketNotifier)
diff --git a/src/corelib/kernel/qsocketnotifier.h b/src/corelib/kernel/qsocketnotifier.h
index 9c806235fc..8288a6b2b5 100644
--- a/src/corelib/kernel/qsocketnotifier.h
+++ b/src/corelib/kernel/qsocketnotifier.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QSOCKETNOTIFIER_H
#define QSOCKETNOTIFIER_H
@@ -137,7 +101,8 @@ private:
};
QT_END_NAMESPACE
-Q_DECLARE_METATYPE(QSocketNotifier::Type)
-Q_DECLARE_METATYPE(QSocketDescriptor)
+
+QT_DECL_METATYPE_EXTERN_TAGGED(QSocketNotifier::Type, QSocketNotifier_Type, Q_CORE_EXPORT)
+QT_DECL_METATYPE_EXTERN(QSocketDescriptor, Q_CORE_EXPORT)
#endif // QSOCKETNOTIFIER_H
diff --git a/src/corelib/kernel/qsystemerror.cpp b/src/corelib/kernel/qsystemerror.cpp
index 4be4874cf1..428ce62984 100644
--- a/src/corelib/kernel/qsystemerror.cpp
+++ b/src/corelib/kernel/qsystemerror.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include <qglobal.h>
#include "qsystemerror_p.h"
@@ -45,6 +9,7 @@
#endif
#ifdef Q_OS_WIN
# include <qt_windows.h>
+# include <comdef.h>
#endif
#ifndef QT_BOOTSTRAPPED
# include <qcoreapplication.h>
@@ -52,6 +17,8 @@
QT_BEGIN_NAMESPACE
+using namespace Qt::StringLiterals;
+
#if !defined(Q_OS_WIN) && QT_CONFIG(thread) && !defined(Q_OS_INTEGRITY) && !defined(Q_OS_QNX) && \
defined(_POSIX_THREAD_SAFE_FUNCTIONS) && _POSIX_VERSION >= 200112L
namespace {
@@ -80,7 +47,7 @@ static QString windowsErrorString(int errorCode)
{
QString ret;
wchar_t *string = nullptr;
- FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,
+ FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
errorCode,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
@@ -92,11 +59,11 @@ static QString windowsErrorString(int errorCode)
if (ret.isEmpty() && errorCode == ERROR_MOD_NOT_FOUND)
ret = QString::fromLatin1("The specified module could not be found.");
- if (ret.endsWith(QLatin1String("\r\n")))
+ if (ret.endsWith("\r\n"_L1))
ret.chop(2);
if (ret.isEmpty())
ret = QString::fromLatin1("Unknown error 0x%1.")
- .arg(unsigned(errorCode), 8, 16, QLatin1Char('0'));
+ .arg(unsigned(errorCode), 8, 16, '0'_L1);
return ret;
}
#endif
@@ -152,7 +119,7 @@ QString QSystemError::string(ErrorScope errorScope, int errorCode)
qWarning("invalid error scope");
Q_FALLTHROUGH();
case NoError:
- return QLatin1String("No error");
+ return u"No error"_s;
}
}
@@ -167,6 +134,15 @@ QString QSystemError::windowsString(int errorCode)
return windowsErrorString(errorCode == -1 ? GetLastError() : errorCode);
}
+QString QSystemError::windowsComString(HRESULT hr)
+{
+ const _com_error comError(hr);
+ QString result = "COM error 0x"_L1 + QString::number(ulong(hr), 16);
+ if (const wchar_t *msg = comError.ErrorMessage())
+ result += ": "_L1 + QString::fromWCharArray(msg);
+ return result;
+}
+
QString qt_error_string(int code)
{
return windowsErrorString(code == -1 ? GetLastError() : code);
diff --git a/src/corelib/kernel/qsystemerror_p.h b/src/corelib/kernel/qsystemerror_p.h
index 8a07b5d6aa..72ced63dc5 100644
--- a/src/corelib/kernel/qsystemerror_p.h
+++ b/src/corelib/kernel/qsystemerror_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QSYSTEMERROR_P_H
#define QSYSTEMERROR_P_H
@@ -76,10 +40,19 @@ public:
constexpr ErrorScope scope() const { return errorScope; }
constexpr int error() const { return errorCode; }
+ constexpr bool ok() const noexcept { return errorScope == NoError; }
+ static constexpr QSystemError stdError(int error)
+ { return QSystemError(error, StandardLibraryError); }
+
static Q_CORE_EXPORT QString string(ErrorScope errorScope, int errorCode);
static Q_CORE_EXPORT QString stdString(int errorCode = -1);
#ifdef Q_OS_WIN
static Q_CORE_EXPORT QString windowsString(int errorCode = -1);
+ using HRESULT = long;
+ static Q_CORE_EXPORT QString windowsComString(HRESULT hr);
+
+ static constexpr QSystemError nativeError(int error)
+ { return QSystemError(error, NativeError); }
#endif
// data members
diff --git a/src/corelib/kernel/qsystemsemaphore.h b/src/corelib/kernel/qsystemsemaphore.h
deleted file mode 100644
index 262d089e04..0000000000
--- a/src/corelib/kernel/qsystemsemaphore.h
+++ /dev/null
@@ -1,97 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QSYSTEMSEMAPHORE_H
-#define QSYSTEMSEMAPHORE_H
-
-#include <QtCore/qcoreapplication.h>
-#include <QtCore/qstring.h>
-#include <QtCore/qscopedpointer.h>
-
-QT_BEGIN_NAMESPACE
-
-
-#ifndef QT_NO_SYSTEMSEMAPHORE
-
-class QSystemSemaphorePrivate;
-
-class Q_CORE_EXPORT QSystemSemaphore
-{
- Q_DECLARE_TR_FUNCTIONS(QSystemSemaphore)
-public:
- enum AccessMode
- {
- Open,
- Create
- };
-
- enum SystemSemaphoreError
- {
- NoError,
- PermissionDenied,
- KeyError,
- AlreadyExists,
- NotFound,
- OutOfResources,
- UnknownError
- };
-
- QSystemSemaphore(const QString &key, int initialValue = 0, AccessMode mode = Open);
- ~QSystemSemaphore();
-
- void setKey(const QString &key, int initialValue = 0, AccessMode mode = Open);
- QString key() const;
-
- bool acquire();
- bool release(int n = 1);
-
- SystemSemaphoreError error() const;
- QString errorString() const;
-
-private:
- Q_DISABLE_COPY(QSystemSemaphore)
- QScopedPointer<QSystemSemaphorePrivate> d;
-};
-
-#endif // QT_NO_SYSTEMSEMAPHORE
-
-QT_END_NAMESPACE
-
-#endif // QSYSTEMSEMAPHORE_H
-
diff --git a/src/corelib/kernel/qsystemsemaphore_android.cpp b/src/corelib/kernel/qsystemsemaphore_android.cpp
deleted file mode 100644
index 149215bc30..0000000000
--- a/src/corelib/kernel/qsystemsemaphore_android.cpp
+++ /dev/null
@@ -1,83 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2012 Collabora Ltd, author <robin.burchell@collabora.co.uk>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qsystemsemaphore.h"
-#include "qsystemsemaphore_p.h"
-
-#include <qdebug.h>
-
-#ifndef QT_NO_SYSTEMSEMAPHORE
-
-QT_BEGIN_NAMESPACE
-
-QSystemSemaphorePrivate::QSystemSemaphorePrivate() :
- unix_key(-1), semaphore(-1), createdFile(false),
- createdSemaphore(false), error(QSystemSemaphore::NoError)
-{
-}
-
-void QSystemSemaphorePrivate::setErrorString(const QString &function)
-{
- Q_UNUSED(function);
- Q_UNIMPLEMENTED();
-}
-
-key_t QSystemSemaphorePrivate::handle(QSystemSemaphore::AccessMode mode)
-{
- Q_UNUSED(mode);
- Q_UNIMPLEMENTED();
- return -1;
-}
-
-void QSystemSemaphorePrivate::cleanHandle()
-{
- Q_UNIMPLEMENTED();
-}
-
-bool QSystemSemaphorePrivate::modifySemaphore(int count)
-{
- Q_UNUSED(count);
- Q_UNIMPLEMENTED();
- return false;
-}
-
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_SYSTEMSEMAPHORE
diff --git a/src/corelib/kernel/qsystemsemaphore_p.h b/src/corelib/kernel/qsystemsemaphore_p.h
deleted file mode 100644
index 56619d7318..0000000000
--- a/src/corelib/kernel/qsystemsemaphore_p.h
+++ /dev/null
@@ -1,120 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QSYSTEMSEMAPHORE_P_H
-#define QSYSTEMSEMAPHORE_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include "qsystemsemaphore.h"
-
-#ifndef QT_NO_SYSTEMSEMAPHORE
-
-#include "qcoreapplication.h"
-#include "qsharedmemory_p.h"
-#include <sys/types.h>
-#ifdef QT_POSIX_IPC
-# include <semaphore.h>
-#endif
-
-QT_BEGIN_NAMESPACE
-
-class QSystemSemaphorePrivate
-{
-
-public:
- QSystemSemaphorePrivate();
-
- QString makeKeyFileName()
- {
- return QSharedMemoryPrivate::makePlatformSafeKey(key, QLatin1String("qipc_systemsem_"));
- }
-
- inline void setError(QSystemSemaphore::SystemSemaphoreError e, const QString &message)
- { error = e; errorString = message; }
- inline void clearError()
- { setError(QSystemSemaphore::NoError, QString()); }
-
-#ifdef Q_OS_WIN
- Qt::HANDLE handle(QSystemSemaphore::AccessMode mode = QSystemSemaphore::Open);
- void setErrorString(const QString &function);
-#elif defined(QT_POSIX_IPC)
- bool handle(QSystemSemaphore::AccessMode mode = QSystemSemaphore::Open);
- void setErrorString(const QString &function);
-#else
- key_t handle(QSystemSemaphore::AccessMode mode = QSystemSemaphore::Open);
- void setErrorString(const QString &function);
-#endif
- void cleanHandle();
- bool modifySemaphore(int count);
-
- QString key;
- QString fileName;
- int initialValue;
-#ifdef Q_OS_WIN
- Qt::HANDLE semaphore;
- Qt::HANDLE semaphoreLock;
-#elif defined(QT_POSIX_IPC)
- sem_t *semaphore;
- bool createdSemaphore;
-#else
- key_t unix_key;
- int semaphore;
- bool createdFile;
- bool createdSemaphore;
-#endif
- QString errorString;
- QSystemSemaphore::SystemSemaphoreError error;
-};
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_SYSTEMSEMAPHORE
-
-#endif // QSYSTEMSEMAPHORE_P_H
-
diff --git a/src/corelib/kernel/qsystemsemaphore_posix.cpp b/src/corelib/kernel/qsystemsemaphore_posix.cpp
deleted file mode 100644
index 567e154e0d..0000000000
--- a/src/corelib/kernel/qsystemsemaphore_posix.cpp
+++ /dev/null
@@ -1,186 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2015 Konstantin Ritt <ritt.ks@gmail.com>
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2015 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Tobias Koenig <tobias.koenig@kdab.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qsystemsemaphore.h"
-#include "qsystemsemaphore_p.h"
-
-#include <qdebug.h>
-#include <qfile.h>
-#include <qcoreapplication.h>
-
-#ifdef QT_POSIX_IPC
-
-#ifndef QT_NO_SYSTEMSEMAPHORE
-
-#include <sys/types.h>
-#include <fcntl.h>
-#include <errno.h>
-
-#include "private/qcore_unix_p.h"
-
-// OpenBSD 4.2 doesn't define EIDRM, see BUGS section:
-// http://www.openbsd.org/cgi-bin/man.cgi?query=semop&manpath=OpenBSD+4.2
-#if defined(Q_OS_OPENBSD) && !defined(EIDRM)
-#define EIDRM EINVAL
-#endif
-
-QT_BEGIN_NAMESPACE
-
-bool QSystemSemaphorePrivate::handle(QSystemSemaphore::AccessMode mode)
-{
- if (semaphore != SEM_FAILED)
- return true; // we already have a semaphore
-
- if (fileName.isEmpty()) {
- errorString = QSystemSemaphore::tr("%1: key is empty").arg(QLatin1String("QSystemSemaphore::handle"));
- error = QSystemSemaphore::KeyError;
- return false;
- }
-
- const QByteArray semName = QFile::encodeName(fileName);
-
- // Always try with O_EXCL so we know whether we created the semaphore.
- int oflag = O_CREAT | O_EXCL;
- for (int tryNum = 0, maxTries = 1; tryNum < maxTries; ++tryNum) {
- do {
- semaphore = ::sem_open(semName.constData(), oflag, 0600, initialValue);
- } while (semaphore == SEM_FAILED && errno == EINTR);
- if (semaphore == SEM_FAILED && errno == EEXIST) {
- if (mode == QSystemSemaphore::Create) {
- if (::sem_unlink(semName.constData()) == -1 && errno != ENOENT) {
- setErrorString(QLatin1String("QSystemSemaphore::handle (sem_unlink)"));
- return false;
- }
- // Race condition: the semaphore might be recreated before
- // we call sem_open again, so we'll retry several times.
- maxTries = 3;
- } else {
- // Race condition: if it no longer exists at the next sem_open
- // call, we won't realize we created it, so we'll leak it later.
- oflag &= ~O_EXCL;
- maxTries = 2;
- }
- } else {
- break;
- }
- }
-
- if (semaphore == SEM_FAILED) {
- setErrorString(QLatin1String("QSystemSemaphore::handle"));
- return false;
- }
-
- createdSemaphore = (oflag & O_EXCL) != 0;
-
- return true;
-}
-
-void QSystemSemaphorePrivate::cleanHandle()
-{
- if (semaphore != SEM_FAILED) {
- if (::sem_close(semaphore) == -1) {
- setErrorString(QLatin1String("QSystemSemaphore::cleanHandle (sem_close)"));
-#if defined QSYSTEMSEMAPHORE_DEBUG
- qDebug("QSystemSemaphore::cleanHandle sem_close failed.");
-#endif
- }
- semaphore = SEM_FAILED;
- }
-
- if (createdSemaphore) {
- if (::sem_unlink(QFile::encodeName(fileName).constData()) == -1 && errno != ENOENT) {
- setErrorString(QLatin1String("QSystemSemaphore::cleanHandle (sem_unlink)"));
-#if defined QSYSTEMSEMAPHORE_DEBUG
- qDebug("QSystemSemaphore::cleanHandle sem_unlink failed.");
-#endif
- }
- createdSemaphore = false;
- }
-}
-
-bool QSystemSemaphorePrivate::modifySemaphore(int count)
-{
- if (!handle())
- return false;
-
- if (count > 0) {
- int cnt = count;
- do {
- if (::sem_post(semaphore) == -1) {
- setErrorString(QLatin1String("QSystemSemaphore::modifySemaphore (sem_post)"));
-#if defined QSYSTEMSEMAPHORE_DEBUG
- qDebug("QSystemSemaphore::modify sem_post failed %d %d", count, errno);
-#endif
- // rollback changes to preserve the SysV semaphore behavior
- for ( ; cnt < count; ++cnt) {
- int res;
- EINTR_LOOP(res, ::sem_wait(semaphore));
- }
- return false;
- }
- --cnt;
- } while (cnt > 0);
- } else {
- int res;
- EINTR_LOOP(res, ::sem_wait(semaphore));
- if (res == -1) {
- // If the semaphore was removed be nice and create it and then modifySemaphore again
- if (errno == EINVAL || errno == EIDRM) {
- semaphore = SEM_FAILED;
- return modifySemaphore(count);
- }
- setErrorString(QLatin1String("QSystemSemaphore::modifySemaphore (sem_wait)"));
-#if defined QSYSTEMSEMAPHORE_DEBUG
- qDebug("QSystemSemaphore::modify sem_wait failed %d %d", count, errno);
-#endif
- return false;
- }
- }
-
- clearError();
- return true;
-}
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_SYSTEMSEMAPHORE
-
-#endif // QT_POSIX_IPC
diff --git a/src/corelib/kernel/qsystemsemaphore_systemv.cpp b/src/corelib/kernel/qsystemsemaphore_systemv.cpp
deleted file mode 100644
index 1c9fc1f2f7..0000000000
--- a/src/corelib/kernel/qsystemsemaphore_systemv.cpp
+++ /dev/null
@@ -1,224 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qsystemsemaphore.h"
-#include "qsystemsemaphore_p.h"
-
-#include <qdebug.h>
-#include <qfile.h>
-#include <qcoreapplication.h>
-
-#ifndef QT_POSIX_IPC
-
-#ifndef QT_NO_SYSTEMSEMAPHORE
-
-#include <sys/types.h>
-#include <sys/ipc.h>
-#include <sys/sem.h>
-#include <fcntl.h>
-#include <errno.h>
-
-#if defined(Q_OS_DARWIN)
-#include "qcore_mac_p.h"
-#endif
-
-#include "private/qcore_unix_p.h"
-
-// OpenBSD 4.2 doesn't define EIDRM, see BUGS section:
-// http://www.openbsd.org/cgi-bin/man.cgi?query=semop&manpath=OpenBSD+4.2
-#if defined(Q_OS_OPENBSD) && !defined(EIDRM)
-#define EIDRM EINVAL
-#endif
-
-QT_BEGIN_NAMESPACE
-
-/*!
- \internal
-
- Setup unix_key
- */
-key_t QSystemSemaphorePrivate::handle(QSystemSemaphore::AccessMode mode)
-{
-#if defined(Q_OS_DARWIN)
- if (qt_apple_isSandboxed()) {
- errorString = QSystemSemaphore::tr("%1: System V semaphores are not available " \
- "for sandboxed applications. Please build Qt with -feature-ipc_posix")
- .arg(QLatin1String("QSystemSemaphore::handle:"));
- error = QSystemSemaphore::PermissionDenied;
- return -1;
- }
-#endif
-
- if (key.isEmpty()){
- errorString = QSystemSemaphore::tr("%1: key is empty")
- .arg(QLatin1String("QSystemSemaphore::handle:"));
- error = QSystemSemaphore::KeyError;
- return -1;
- }
-
- // ftok requires that an actual file exists somewhere
- if (-1 != unix_key)
- return unix_key;
-
- // Create the file needed for ftok
- int built = QSharedMemoryPrivate::createUnixKeyFile(fileName);
- if (-1 == built) {
- errorString = QSystemSemaphore::tr("%1: unable to make key")
- .arg(QLatin1String("QSystemSemaphore::handle:"));
- error = QSystemSemaphore::KeyError;
- return -1;
- }
- createdFile = (1 == built);
-
-#if !defined(QT_NO_SHAREDMEMORY) && !defined(QT_POSIX_IPC) && !defined(Q_OS_ANDROID)
- // Get the unix key for the created file
- unix_key = ftok(QFile::encodeName(fileName).constData(), 'Q');
-#endif
- if (-1 == unix_key) {
- errorString = QSystemSemaphore::tr("%1: ftok failed")
- .arg(QLatin1String("QSystemSemaphore::handle:"));
- error = QSystemSemaphore::KeyError;
- return -1;
- }
-
- // Get semaphore
- semaphore = semget(unix_key, 1, 0600 | IPC_CREAT | IPC_EXCL);
- if (-1 == semaphore) {
- if (errno == EEXIST)
- semaphore = semget(unix_key, 1, 0600 | IPC_CREAT);
- if (-1 == semaphore) {
- setErrorString(QLatin1String("QSystemSemaphore::handle"));
- cleanHandle();
- return -1;
- }
- } else {
- createdSemaphore = true;
- // Force cleanup of file, it is possible that it can be left over from a crash
- createdFile = true;
- }
-
- if (mode == QSystemSemaphore::Create) {
- createdSemaphore = true;
- createdFile = true;
- }
-
- // Created semaphore so initialize its value.
- if (createdSemaphore && initialValue >= 0) {
- qt_semun init_op;
- init_op.val = initialValue;
- if (-1 == semctl(semaphore, 0, SETVAL, init_op)) {
- setErrorString(QLatin1String("QSystemSemaphore::handle"));
- cleanHandle();
- return -1;
- }
- }
-
- return unix_key;
-}
-
-/*!
- \internal
-
- Cleanup the unix_key
- */
-void QSystemSemaphorePrivate::cleanHandle()
-{
- unix_key = -1;
-
- // remove the file if we made it
- if (createdFile) {
- QFile::remove(fileName);
- createdFile = false;
- }
-
- if (createdSemaphore) {
- if (-1 != semaphore) {
- if (-1 == semctl(semaphore, 0, IPC_RMID, 0)) {
- setErrorString(QLatin1String("QSystemSemaphore::cleanHandle"));
-#if defined QSYSTEMSEMAPHORE_DEBUG
- qDebug("QSystemSemaphore::cleanHandle semctl failed.");
-#endif
- }
- semaphore = -1;
- }
- createdSemaphore = false;
- }
-}
-
-/*!
- \internal
- */
-bool QSystemSemaphorePrivate::modifySemaphore(int count)
-{
- if (-1 == handle())
- return false;
-
- struct sembuf operation;
- operation.sem_num = 0;
- operation.sem_op = count;
- operation.sem_flg = SEM_UNDO;
-
- int res;
- EINTR_LOOP(res, semop(semaphore, &operation, 1));
- if (-1 == res) {
- // If the semaphore was removed be nice and create it and then modifySemaphore again
- if (errno == EINVAL || errno == EIDRM) {
- semaphore = -1;
- cleanHandle();
- handle();
- return modifySemaphore(count);
- }
- setErrorString(QLatin1String("QSystemSemaphore::modifySemaphore"));
-#if defined QSYSTEMSEMAPHORE_DEBUG
- qDebug("QSystemSemaphore::modify failed %d %d %d %d %d",
- count, int(semctl(semaphore, 0, GETVAL)), int(errno), int(EIDRM), int(EINVAL);
-#endif
- return false;
- }
-
- clearError();
- return true;
-}
-
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_SYSTEMSEMAPHORE
-
-#endif // QT_POSIX_IPC
diff --git a/src/corelib/kernel/qsystemsemaphore_unix.cpp b/src/corelib/kernel/qsystemsemaphore_unix.cpp
deleted file mode 100644
index dad2249270..0000000000
--- a/src/corelib/kernel/qsystemsemaphore_unix.cpp
+++ /dev/null
@@ -1,109 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qsystemsemaphore.h"
-#include "qsystemsemaphore_p.h"
-
-#include <qdebug.h>
-#include <qcoreapplication.h>
-
-#ifndef QT_NO_SYSTEMSEMAPHORE
-
-#include <sys/types.h>
-#ifndef QT_POSIX_IPC
-#include <sys/ipc.h>
-#include <sys/sem.h>
-#endif
-#include <fcntl.h>
-#include <errno.h>
-
-#include "private/qcore_unix_p.h"
-
-QT_BEGIN_NAMESPACE
-
-QSystemSemaphorePrivate::QSystemSemaphorePrivate() :
-#ifndef QT_POSIX_IPC
- unix_key(-1), semaphore(-1), createdFile(false),
-#else
- semaphore(SEM_FAILED),
-#endif // QT_POSIX_IPC
- createdSemaphore(false), error(QSystemSemaphore::NoError)
-{
-}
-
-void QSystemSemaphorePrivate::setErrorString(const QString &function)
-{
- // EINVAL is handled in functions so they can give better error strings
- switch (errno) {
- case EPERM:
- case EACCES:
- errorString = QSystemSemaphore::tr("%1: permission denied").arg(function);
- error = QSystemSemaphore::PermissionDenied;
- break;
- case EEXIST:
- errorString = QSystemSemaphore::tr("%1: already exists").arg(function);
- error = QSystemSemaphore::AlreadyExists;
- break;
- case ENOENT:
- errorString = QSystemSemaphore::tr("%1: does not exist").arg(function);
- error = QSystemSemaphore::NotFound;
- break;
- case ERANGE:
- case ENOSPC:
- errorString = QSystemSemaphore::tr("%1: out of resources").arg(function);
- error = QSystemSemaphore::OutOfResources;
- break;
-#if defined(QT_POSIX_IPC)
- case ENAMETOOLONG:
- errorString = QSystemSemaphore::tr("%1: key too long").arg(function);
- error = QSystemSemaphore::KeyError;
- break;
-#endif
- default:
- errorString = QSystemSemaphore::tr("%1: unknown error %2").arg(function).arg(errno);
- error = QSystemSemaphore::UnknownError;
-#if defined QSYSTEMSEMAPHORE_DEBUG
- qDebug() << errorString << "key" << key << "errno" << errno << EINVAL;
-#endif
- }
-}
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_SYSTEMSEMAPHORE
diff --git a/src/corelib/kernel/qsystemsemaphore_win.cpp b/src/corelib/kernel/qsystemsemaphore_win.cpp
deleted file mode 100644
index d19476db4a..0000000000
--- a/src/corelib/kernel/qsystemsemaphore_win.cpp
+++ /dev/null
@@ -1,136 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qsystemsemaphore.h"
-#include "qsystemsemaphore_p.h"
-#include "qcoreapplication.h"
-#include <qdebug.h>
-#include <qt_windows.h>
-
-QT_BEGIN_NAMESPACE
-
-#ifndef QT_NO_SYSTEMSEMAPHORE
-
-QSystemSemaphorePrivate::QSystemSemaphorePrivate() :
- semaphore(0), error(QSystemSemaphore::NoError)
-{
-}
-
-void QSystemSemaphorePrivate::setErrorString(const QString &function)
-{
- BOOL windowsError = GetLastError();
- if (windowsError == 0)
- return;
-
- switch (windowsError) {
- case ERROR_NO_SYSTEM_RESOURCES:
- case ERROR_NOT_ENOUGH_MEMORY:
- error = QSystemSemaphore::OutOfResources;
- errorString = QCoreApplication::translate("QSystemSemaphore", "%1: out of resources").arg(function);
- break;
- case ERROR_ACCESS_DENIED:
- error = QSystemSemaphore::PermissionDenied;
- errorString = QCoreApplication::translate("QSystemSemaphore", "%1: permission denied").arg(function);
- break;
- default:
- errorString = QCoreApplication::translate("QSystemSemaphore", "%1: unknown error %2").arg(function).arg(windowsError);
- error = QSystemSemaphore::UnknownError;
-#if defined QSYSTEMSEMAPHORE_DEBUG
- qDebug() << errorString << "key" << key;
-#endif
- }
-}
-
-HANDLE QSystemSemaphorePrivate::handle(QSystemSemaphore::AccessMode)
-{
- // don't allow making handles on empty keys
- if (key.isEmpty())
- return 0;
-
- // Create it if it doesn't already exists.
- if (semaphore == 0) {
- semaphore = CreateSemaphore(0, initialValue, MAXLONG,
- reinterpret_cast<const wchar_t*>(fileName.utf16()));
- if (semaphore == NULL)
- setErrorString(QLatin1String("QSystemSemaphore::handle"));
- }
-
- return semaphore;
-}
-
-void QSystemSemaphorePrivate::cleanHandle()
-{
- if (semaphore && !CloseHandle(semaphore)) {
-#if defined QSYSTEMSEMAPHORE_DEBUG
- qDebug("QSystemSemaphorePrivate::CloseHandle: sem failed");
-#endif
- }
- semaphore = 0;
-}
-
-bool QSystemSemaphorePrivate::modifySemaphore(int count)
-{
- if (0 == handle())
- return false;
-
- if (count > 0) {
- if (0 == ReleaseSemaphore(semaphore, count, 0)) {
- setErrorString(QLatin1String("QSystemSemaphore::modifySemaphore"));
-#if defined QSYSTEMSEMAPHORE_DEBUG
- qDebug("QSystemSemaphore::modifySemaphore ReleaseSemaphore failed");
-#endif
- return false;
- }
- } else {
- if (WAIT_OBJECT_0 != WaitForSingleObjectEx(semaphore, INFINITE, FALSE)) {
- setErrorString(QLatin1String("QSystemSemaphore::modifySemaphore"));
-#if defined QSYSTEMSEMAPHORE_DEBUG
- qDebug("QSystemSemaphore::modifySemaphore WaitForSingleObject failed");
-#endif
- return false;
- }
- }
-
- clearError();
- return true;
-}
-
-#endif //QT_NO_SYSTEMSEMAPHORE
-
-QT_END_NAMESPACE
diff --git a/src/corelib/kernel/qt_attribution.json b/src/corelib/kernel/qt_attribution.json
index 6d8f4f2abc..86ca3a2664 100644
--- a/src/corelib/kernel/qt_attribution.json
+++ b/src/corelib/kernel/qt_attribution.json
@@ -3,9 +3,9 @@
"Name": "QEventDispatcher on macOS",
"QDocModule": "qtcore",
"QtUsage": "Used in Qt Core on macOS.",
- "Path": "qeventdispatcher_cf_p.h",
+ "Files": "qeventdispatcher_cf_p.h",
- "Description": "Treat as final version; no upstream known",
+ "Comment": "Treat as final version; no upstream known",
"Description": "Implementation of QAbstractEventDispatcher for macOS.",
"License": "BSD 3-clause \"New\" or \"Revised\" License",
"LicenseId": "BSD-3-Clause",
diff --git a/src/corelib/kernel/qtestsupport_core.cpp b/src/corelib/kernel/qtestsupport_core.cpp
index f5b6ed18cd..2ac44bb13d 100644
--- a/src/corelib/kernel/qtestsupport_core.cpp
+++ b/src/corelib/kernel/qtestsupport_core.cpp
@@ -1,99 +1,103 @@
-/****************************************************************************
-**
-** Copyright (C) 2018 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qtestsupport_core.h"
-#ifdef Q_OS_WIN
-#include <qt_windows.h>
-#endif
+#include <thread>
+
+using namespace std::chrono_literals;
QT_BEGIN_NAMESPACE
/*!
- Sleeps for \a ms milliseconds, blocking execution of the
- test. qSleep() will not do any event processing and leave your test
- unresponsive. Network communication might time out while
- sleeping. Use \l {QTest::qWait()} to do non-blocking sleeping.
+ \overload
+
+ Sleeps for \a ms milliseconds, blocking execution of the test.
+
+ Equivalent to calling:
+ \code
+ QTest::qSleep(std::chrono::milliseconds{ms});
+ \endcode
+*/
+void QTest::qSleep(int ms)
+{
+ QTest::qSleep(std::chrono::milliseconds{ms});
+}
+
+/*!
+ \since 6.7
- \a ms must be greater than 0.
+ Sleeps for \a msecs, blocking execution of the test.
- \b {Note:} The qSleep() function calls either \c nanosleep() on
- unix or \c Sleep() on windows, so the accuracy of time spent in
- qSleep() depends on the operating system.
+ This method will not do any event processing and will leave your test
+ unresponsive. Network communication might time out while sleeping.
+ Use \l {QTest::qWait()} to do non-blocking sleeping.
+
+ \a msecs must be greater than 0ms.
+
+ \note Starting from Qt 6.7, this function is implemented using
+ \c {std::this_thread::sleep_for}, so the accuracy of time spent depends
+ on the Standard Library implementation. Before Qt 6.7 this function called
+ either \c nanosleep() on Unix or \c Sleep() on Windows, so the accuracy of
+ time spent in this function depended on the operating system.
Example:
\snippet code/src_qtestlib_qtestcase.cpp 23
\sa {QTest::qWait()}
*/
-Q_CORE_EXPORT void QTest::qSleep(int ms)
+void QTest::qSleep(std::chrono::milliseconds msecs)
{
- Q_ASSERT(ms > 0);
-
-#if defined(Q_OS_WIN)
- Sleep(uint(ms));
-#else
- struct timespec ts = { time_t(ms / 1000), (ms % 1000) * 1000 * 1000 };
- nanosleep(&ts, nullptr);
-#endif
+ Q_ASSERT(msecs > 0ms);
+ std::this_thread::sleep_for(msecs);
}
/*! \fn template <typename Functor> bool QTest::qWaitFor(Functor predicate, int timeout)
+ \since 5.10
+ \overload
+
Waits for \a timeout milliseconds or until the \a predicate returns true.
- Returns \c true if the \a predicate returned true at any point, otherwise returns \c false.
+ This is equivalent to calling:
+ \code
+ qWaitFor(predicate, QDeadlineTimer(timeout));
+ \endcode
+*/
+
+/*! \fn template <typename Functor> bool QTest::qWaitFor(Functor predicate, QDeadlineTimer deadline)
+ \since 6.7
+
+ Waits until \a deadline has expired, or until \a predicate returns true, whichever
+ happens first.
+
+ Returns \c true if \a predicate returned true at any point, otherwise returns \c false.
Example:
- \snippet code/src_corelib_kernel_qtestsupport_core_snippet.cpp 0
+ \snippet code/src_corelib_kernel_qtestsupport_core.cpp 2
The code above will wait for the object to become ready, for a
maximum of three seconds.
-
- \since 5.10
*/
+/*!
+ \overload
-/*! \fn void QTest::qWait(int ms)
+ Waits for \a msecs. Equivalent to calling:
+ \code
+ QTest::qWait(std::chrono::milliseconds{msecs});
+ \endcode
+*/
+Q_CORE_EXPORT void QTest::qWait(int msecs)
+{
+ qWait(std::chrono::milliseconds{msecs});
+}
- Waits for \a ms milliseconds. While waiting, events will be processed and
+/*!
+ \since 6.7
+
+ Waits for \a msecs. While waiting, events will be processed and
your test will stay responsive to user interface events or network communication.
Example:
@@ -105,25 +109,34 @@ Q_CORE_EXPORT void QTest::qSleep(int ms)
\sa QTest::qSleep(), QSignalSpy::wait()
*/
-Q_CORE_EXPORT void QTest::qWait(int ms)
+Q_CORE_EXPORT void QTest::qWait(std::chrono::milliseconds msecs)
{
- // Ideally this method would be implemented in terms of qWaitFor, with
- // a predicate that always returns false, but due to a compiler bug in
- // GCC 6 we can't do that.
+ // Ideally this method would be implemented in terms of qWaitFor(), with a
+ // predicate that always returns false, but qWaitFor() uses the 1-arg overload
+ // of processEvents(), which doesn't handle events posted in this round of event
+ // processing, which, together with the 10ms qSleep() after every processEvents(),
+ // lead to a 10x slow-down in some webengine tests.
Q_ASSERT(QCoreApplication::instance());
- QDeadlineTimer timer(ms, Qt::PreciseTimer);
- int remaining = ms;
+ using namespace std::chrono;
+
+ QDeadlineTimer deadline(msecs, Qt::PreciseTimer);
+
do {
- QCoreApplication::processEvents(QEventLoop::AllEvents, remaining);
+ QCoreApplication::processEvents(QEventLoop::AllEvents, deadline);
QCoreApplication::sendPostedEvents(nullptr, QEvent::DeferredDelete);
- remaining = timer.remainingTime();
- if (remaining <= 0)
+
+ // If dealine is Forever, processEvents() has already looped forever
+ if (deadline.isForever())
break;
- QTest::qSleep(qMin(10, remaining));
- remaining = timer.remainingTime();
- } while (remaining > 0);
+
+ msecs = ceil<milliseconds>(deadline.remainingTimeAsDuration());
+ if (msecs == 0ms)
+ break;
+
+ QTest::qSleep(std::min(10ms, msecs));
+ } while (!deadline.hasExpired());
}
QT_END_NAMESPACE
diff --git a/src/corelib/kernel/qtestsupport_core.h b/src/corelib/kernel/qtestsupport_core.h
index 04e1c50e1c..27265903af 100644
--- a/src/corelib/kernel/qtestsupport_core.h
+++ b/src/corelib/kernel/qtestsupport_core.h
@@ -1,69 +1,32 @@
-/****************************************************************************
-**
-** Copyright (C) 2018 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2018 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QTESTSUPPORT_CORE_H
#define QTESTSUPPORT_CORE_H
#include <QtCore/qcoreapplication.h>
#include <QtCore/qdeadlinetimer.h>
-#include <QtCore/qthread.h>
+
+#include <chrono>
QT_BEGIN_NAMESPACE
namespace QTest {
Q_CORE_EXPORT void qSleep(int ms);
+Q_CORE_EXPORT void qSleep(std::chrono::milliseconds msecs);
template <typename Functor>
-[[nodiscard]] static bool qWaitFor(Functor predicate, int timeout = 5000)
+[[nodiscard]] bool
+qWaitFor(Functor predicate, QDeadlineTimer deadline = QDeadlineTimer(std::chrono::seconds{5}))
{
// We should not spin the event loop in case the predicate is already true,
// otherwise we might send new events that invalidate the predicate.
if (predicate())
return true;
- // qWait() is expected to spin the event loop, even when called with a small
- // timeout like 1ms, so we we can't use a simple while-loop here based on
- // the deadline timer not having timed out. Use do-while instead.
-
- int remaining = timeout;
- QDeadlineTimer deadline(remaining, Qt::PreciseTimer);
+ // qWait() is expected to spin the event loop at least once, even when
+ // called with a small timeout like 1ns.
do {
// We explicitly do not pass the remaining time to processEvents, as
@@ -78,17 +41,26 @@ template <typename Functor>
if (predicate())
return true;
- remaining = int(deadline.remainingTime());
- if (remaining > 0)
- qSleep(qMin(10, remaining));
- remaining = int(deadline.remainingTime());
- } while (remaining > 0);
+ using namespace std::chrono;
+
+ if (const auto remaining = deadline.remainingTimeAsDuration(); remaining > 0ns)
+ qSleep((std::min)(10ms, ceil<milliseconds>(remaining)));
+
+ } while (!deadline.hasExpired());
return predicate(); // Last chance
}
+template <typename Functor>
+[[nodiscard]] bool qWaitFor(Functor predicate, int timeout)
+{
+ return qWaitFor(predicate, QDeadlineTimer{timeout, Qt::PreciseTimer});
+}
+
Q_CORE_EXPORT void qWait(int ms);
+Q_CORE_EXPORT void qWait(std::chrono::milliseconds msecs);
+
} // namespace QTest
QT_END_NAMESPACE
diff --git a/src/corelib/kernel/qtimer.cpp b/src/corelib/kernel/qtimer.cpp
index ddd1213f07..294369c1b3 100644
--- a/src/corelib/kernel/qtimer.cpp
+++ b/src/corelib/kernel/qtimer.cpp
@@ -1,70 +1,23 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2022 The Qt Company Ltd.
+// Copyright (C) 2016 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qtimer.h"
+#include "qtimer_p.h"
+#include "qsingleshottimer_p.h"
+
#include "qabstracteventdispatcher.h"
#include "qcoreapplication.h"
-#include "qobject_p.h"
-#include "qthread.h"
#include "qcoreapplication_p.h"
+#include "qdeadlinetimer.h"
+#include "qmetaobject_p.h"
+#include "qobject_p.h"
#include "qproperty_p.h"
+#include "qthread.h"
-QT_BEGIN_NAMESPACE
-
-static constexpr int INV_TIMER = -1; // invalid timer id
+using namespace std::chrono_literals;
-class QTimerPrivate : public QObjectPrivate
-{
- Q_DECLARE_PUBLIC(QTimer)
-public:
- void setInterval(int msec) { q_func()->setInterval(msec); }
- bool isActiveActualCalculation() const { return id >= 0; }
-
- int id = INV_TIMER;
- Q_OBJECT_COMPAT_PROPERTY_WITH_ARGS(QTimerPrivate, int, inter, &QTimerPrivate::setInterval, 0)
- Q_OBJECT_BINDABLE_PROPERTY_WITH_ARGS(QTimerPrivate, bool, single, false)
- bool nulltimer = false;
- Q_OBJECT_BINDABLE_PROPERTY_WITH_ARGS(QTimerPrivate, Qt::TimerType, type, Qt::CoarseTimer)
- Q_OBJECT_COMPUTED_PROPERTY(QTimerPrivate, bool, isActiveData,
- &QTimerPrivate::isActiveActualCalculation)
-};
+QT_BEGIN_NAMESPACE
/*!
\class QTimer
@@ -121,6 +74,13 @@ public:
more and more platforms, we expect that zero-millisecond
QTimer objects will gradually be replaced by \l{QThread}s.
+ \note Since Qt 6.7 this class is superseded by \l{QChronoTimer}.
+ The maximum interval QTimer supports is limited by the number of
+ milliseconds that would fit in an \c int (which is around 24 days);
+ whereas QChronoTimer stores its interval as \c std::chrono::nanoseconds
+ (which raises that limit to around 292 million years), that is, there is
+ less chance of integer overflow with QChronoTimer.
+
\section1 Accuracy and Timer Resolution
The accuracy of timers depends on the underlying operating system
@@ -157,7 +117,7 @@ public:
used; Qt tries to work around these limitations.
\sa QBasicTimer, QTimerEvent, QObject::timerEvent(), Timers,
- {Analog Clock Example}, {Wiggly Example}
+ {Analog Clock}
*/
/*!
@@ -165,8 +125,9 @@ public:
*/
QTimer::QTimer(QObject *parent)
- : QObject(*new QTimerPrivate, parent)
+ : QObject(*new QTimerPrivate(this), parent)
{
+ Q_ASSERT(d_func()->isQTimer);
}
@@ -176,7 +137,7 @@ QTimer::QTimer(QObject *parent)
QTimer::~QTimer()
{
- if (d_func()->id != INV_TIMER) // stop running timer
+ if (d_func()->isActive()) // stop running timer
stop();
}
@@ -221,9 +182,21 @@ QBindable<bool> QTimer::bindableActive()
*/
int QTimer::timerId() const
{
- return d_func()->id;
+ auto v = qToUnderlying(id());
+ return v == 0 ? -1 : v;
}
+/*!
+ \since 6.8
+ Returns a Qt::TimerId representing the timer ID if the timer is running;
+ otherwise returns \c Qt::TimerId::Invalid.
+
+ \sa Qt::TimerId
+*/
+Qt::TimerId QTimer::id() const
+{
+ return d_func()->id;
+}
/*! \overload start()
@@ -237,11 +210,14 @@ int QTimer::timerId() const
void QTimer::start()
{
Q_D(QTimer);
- if (d->id != INV_TIMER) // stop running timer
+ if (d->isActive()) // stop running timer
stop();
- d->nulltimer = (!d->inter && d->single);
- d->id = QObject::startTimer(d->inter, d->type);
- d->isActiveData.notify();
+
+ Qt::TimerId newId{ QObject::startTimer(d->inter * 1ms, d->type) }; // overflow impossible
+ if (newId > Qt::TimerId::Invalid) {
+ d->id = newId;
+ d->isActiveData.notify();
+ }
}
/*!
@@ -251,14 +227,28 @@ void QTimer::start()
If the timer is already running, it will be
\l{QTimer::stop()}{stopped} and restarted.
- If \l singleShot is true, the timer will be activated only once.
+ If \l singleShot is true, the timer will be activated only once. This is
+ equivalent to:
+
+ \code
+ timer.setInterval(msec);
+ timer.start();
+ \endcode
\note Keeping the event loop busy with a zero-timer is bound to
cause trouble and highly erratic behavior of the UI.
*/
void QTimer::start(int msec)
{
+ start(msec * 1ms);
+}
+
+void QTimer::start(std::chrono::milliseconds interval)
+{
Q_D(QTimer);
+ // This could be narrowing as the interval is stored in an `int` QProperty,
+ // and the type can't be changed in Qt6.
+ const int msec = interval.count();
const bool intervalChanged = msec != d->inter;
d->inter.setValue(msec);
start();
@@ -277,9 +267,9 @@ void QTimer::start(int msec)
void QTimer::stop()
{
Q_D(QTimer);
- if (d->id != INV_TIMER) {
+ if (d->isActive()) {
QObject::killTimer(d->id);
- d->id = INV_TIMER;
+ d->id = Qt::TimerId::Invalid;
d->isActiveData.notify();
}
}
@@ -291,84 +281,13 @@ void QTimer::stop()
void QTimer::timerEvent(QTimerEvent *e)
{
Q_D(QTimer);
- if (e->timerId() == d->id) {
+ if (Qt::TimerId{e->timerId()} == d->id) {
if (d->single)
stop();
emit timeout(QPrivateSignal());
}
}
-class QSingleShotTimer : public QObject
-{
- Q_OBJECT
- int timerId;
- bool hasValidReceiver;
- QPointer<const QObject> receiver;
- QtPrivate::QSlotObjectBase *slotObj;
-public:
- ~QSingleShotTimer();
- QSingleShotTimer(int msec, Qt::TimerType timerType, const QObject *r, const char * m);
- QSingleShotTimer(int msec, Qt::TimerType timerType, const QObject *r, QtPrivate::QSlotObjectBase *slotObj);
-
-Q_SIGNALS:
- void timeout();
-protected:
- void timerEvent(QTimerEvent *) override;
-};
-
-QSingleShotTimer::QSingleShotTimer(int msec, Qt::TimerType timerType, const QObject *r, const char *member)
- : QObject(QAbstractEventDispatcher::instance()), hasValidReceiver(true), slotObj(nullptr)
-{
- timerId = startTimer(msec, timerType);
- connect(this, SIGNAL(timeout()), r, member);
-}
-
-QSingleShotTimer::QSingleShotTimer(int msec, Qt::TimerType timerType, const QObject *r, QtPrivate::QSlotObjectBase *slotObj)
- : QObject(QAbstractEventDispatcher::instance()), hasValidReceiver(r), receiver(r), slotObj(slotObj)
-{
- timerId = startTimer(msec, timerType);
- if (r && thread() != r->thread()) {
- // Avoid leaking the QSingleShotTimer instance in case the application exits before the timer fires
- connect(QCoreApplication::instance(), &QCoreApplication::aboutToQuit, this, &QObject::deleteLater);
- setParent(nullptr);
- moveToThread(r->thread());
- }
-}
-
-QSingleShotTimer::~QSingleShotTimer()
-{
- if (timerId > 0)
- killTimer(timerId);
- if (slotObj)
- slotObj->destroyIfLastRef();
-}
-
-void QSingleShotTimer::timerEvent(QTimerEvent *)
-{
- // need to kill the timer _before_ we emit timeout() in case the
- // slot connected to timeout calls processEvents()
- if (timerId > 0)
- killTimer(timerId);
- timerId = -1;
-
- if (slotObj) {
- // If the receiver was destroyed, skip this part
- if (Q_LIKELY(!receiver.isNull() || !hasValidReceiver)) {
- // We allocate only the return type - we previously checked the function had
- // no arguments.
- void *args[1] = { nullptr };
- slotObj->call(const_cast<QObject*>(receiver.data()), args);
- }
- } else {
- emit timeout();
- }
-
- // we would like to use delete later here, but it feels like a
- // waste to post a new event to handle this event, so we just unset the flag
- // and explicitly delete...
- qDeleteInEventHandler(this);
-}
-
/*!
\internal
@@ -378,14 +297,13 @@ void QSingleShotTimer::timerEvent(QTimerEvent *)
\a timerType is the timer type
\a receiver is the receiver object, can be null. In such a case, it will be the same
as the final sender class.
- \a slot a pointer only used when using Qt::UniqueConnection
\a slotObj the slot object
- */
-void QTimer::singleShotImpl(int msec, Qt::TimerType timerType,
+*/
+void QTimer::singleShotImpl(std::chrono::milliseconds msec, Qt::TimerType timerType,
const QObject *receiver,
QtPrivate::QSlotObjectBase *slotObj)
{
- if (msec == 0) {
+ if (msec == 0ms) {
bool deleteReceiver = false;
// Optimize: set a receiver context when none is given, such that we can use
// QMetaObject::invokeMethod which is more efficient than going through a timer.
@@ -404,19 +322,23 @@ void QTimer::singleShotImpl(int msec, Qt::TimerType timerType,
deleteReceiver = true;
}
+ auto h = QtPrivate::invokeMethodHelper({});
QMetaObject::invokeMethodImpl(const_cast<QObject *>(receiver), slotObj,
- Qt::QueuedConnection, nullptr);
+ Qt::QueuedConnection, h.parameterCount(), h.parameters.data(), h.typeNames.data(),
+ h.metaTypes.data());
if (deleteReceiver)
const_cast<QObject *>(receiver)->deleteLater();
return;
}
- new QSingleShotTimer(msec, timerType, receiver, slotObj);
+ new QSingleShotTimer(QSingleShotTimer::fromMsecs(msec), timerType, receiver, slotObj);
}
/*!
+ \fn void QTimer::singleShot(int msec, const QObject *receiver, const char *member)
\reentrant
+ \deprecated [6.8] Use the chrono overloads.
This static function calls a slot after a given time interval.
It is very convenient to use this function because you do not need
@@ -435,16 +357,11 @@ void QTimer::singleShotImpl(int msec, Qt::TimerType timerType,
\sa start()
*/
-void QTimer::singleShot(int msec, const QObject *receiver, const char *member)
-{
- // coarse timers are worst in their first firing
- // so we prefer a high precision timer for something that happens only once
- // unless the timeout is too big, in which case we go for coarse anyway
- singleShot(msec, msec >= 2000 ? Qt::CoarseTimer : Qt::PreciseTimer, receiver, member);
-}
-
-/*! \overload
+/*!
+ \fn void QTimer::singleShot(int msec, Qt::TimerType timerType, const QObject *receiver, const char *member)
+ \overload
\reentrant
+ \deprecated [6.8] Use the chrono overloads.
This static function calls a slot after a given time interval.
It is very convenient to use this function because you do not need
@@ -457,147 +374,54 @@ void QTimer::singleShot(int msec, const QObject *receiver, const char *member)
\sa start()
*/
-void QTimer::singleShot(int msec, Qt::TimerType timerType, const QObject *receiver, const char *member)
+
+void QTimer::singleShot(std::chrono::milliseconds msec, Qt::TimerType timerType,
+ const QObject *receiver, const char *member)
{
- if (Q_UNLIKELY(msec < 0)) {
+ if (Q_UNLIKELY(msec < 0ms)) {
qWarning("QTimer::singleShot: Timers cannot have negative timeouts");
return;
}
if (receiver && member) {
- if (msec == 0) {
+ if (msec == 0ms) {
// special code shortpath for 0-timers
const char* bracketPosition = strchr(member, '(');
if (!bracketPosition || !(member[0] >= '0' && member[0] <= '2')) {
qWarning("QTimer::singleShot: Invalid slot specification");
return;
}
- QByteArray methodName(member+1, bracketPosition - 1 - member); // extract method name
- QMetaObject::invokeMethod(const_cast<QObject *>(receiver), methodName.constData(), Qt::QueuedConnection);
+ const auto methodName = QByteArrayView(member + 1, // extract method name
+ bracketPosition - 1 - member).trimmed();
+ QMetaObject::invokeMethod(const_cast<QObject *>(receiver), methodName.toByteArray().constData(),
+ Qt::QueuedConnection);
return;
}
- (void) new QSingleShotTimer(msec, timerType, receiver, member);
+ (void) new QSingleShotTimer(QSingleShotTimer::fromMsecs(msec), timerType, receiver, member);
}
}
-/*! \fn template<typename PointerToMemberFunction> void QTimer::singleShot(int msec, const QObject *receiver, PointerToMemberFunction method)
-
- \since 5.4
-
- \overload
- \reentrant
- This static function calls a member function of a QObject after a given time interval.
-
- It is very convenient to use this function because you do not need
- to bother with a \l{QObject::timerEvent()}{timerEvent} or
- create a local QTimer object.
-
- The \a receiver is the receiving object and the \a method is the member function. The
- time interval is \a msec milliseconds.
-
- If \a receiver is destroyed before the interval occurs, the method will not be called.
- The function will be run in the thread of \a receiver. The receiver's thread must have
- a running Qt event loop.
-
- \sa start()
-*/
-
-/*! \fn template<typename PointerToMemberFunction> void QTimer::singleShot(int msec, Qt::TimerType timerType, const QObject *receiver, PointerToMemberFunction method)
-
- \since 5.4
-
- \overload
- \reentrant
- This static function calls a member function of a QObject after a given time interval.
-
- It is very convenient to use this function because you do not need
- to bother with a \l{QObject::timerEvent()}{timerEvent} or
- create a local QTimer object.
-
- The \a receiver is the receiving object and the \a method is the member function. The
- time interval is \a msec milliseconds. The \a timerType affects the
- accuracy of the timer.
-
- If \a receiver is destroyed before the interval occurs, the method will not be called.
- The function will be run in the thread of \a receiver. The receiver's thread must have
- a running Qt event loop.
-
- \sa start()
-*/
-
-/*! \fn template<typename Functor> void QTimer::singleShot(int msec, Functor functor)
-
+/*! \fn template<typename Duration, typename Functor> void QTimer::singleShot(Duration msec, const QObject *context, Functor &&functor)
+ \fn template<typename Duration, typename Functor> void QTimer::singleShot(Duration msec, Qt::TimerType timerType, const QObject *context, Functor &&functor)
+ \fn template<typename Duration, typename Functor> void QTimer::singleShot(Duration msec, Functor &&functor)
+ \fn template<typename Duration, typename Functor> void QTimer::singleShot(Duration msec, Qt::TimerType timerType, Functor &&functor)
\since 5.4
- \overload
\reentrant
- This static function calls \a functor after a given time interval.
+ This static function calls \a functor after \a msec milliseconds.
It is very convenient to use this function because you do not need
to bother with a \l{QObject::timerEvent()}{timerEvent} or
create a local QTimer object.
- The time interval is \a msec milliseconds.
+ If \a context is specified, then the \a functor will be called only if the
+ \a context object has not been destroyed before the interval occurs. The functor
+ will then be run the thread of \a context. The context's thread must have a
+ running Qt event loop.
- \sa start()
-*/
+ If \a functor is a member
+ function of \a context, then the function will be called on the object.
-/*! \fn template<typename Functor> void QTimer::singleShot(int msec, Qt::TimerType timerType, Functor functor)
-
- \since 5.4
-
- \overload
- \reentrant
- This static function calls \a functor after a given time interval.
-
- It is very convenient to use this function because you do not need
- to bother with a \l{QObject::timerEvent()}{timerEvent} or
- create a local QTimer object.
-
- The time interval is \a msec milliseconds. The \a timerType affects the
- accuracy of the timer.
-
- \sa start()
-*/
-
-/*! \fn template<typename Functor> void QTimer::singleShot(int msec, const QObject *context, Functor functor)
-
- \since 5.4
-
- \overload
- \reentrant
- This static function calls \a functor after a given time interval.
-
- It is very convenient to use this function because you do not need
- to bother with a \l{QObject::timerEvent()}{timerEvent} or
- create a local QTimer object.
-
- The time interval is \a msec milliseconds.
-
- If \a context is destroyed before the interval occurs, the method will not be called.
- The function will be run in the thread of \a context. The context's thread must have
- a running Qt event loop.
-
- \sa start()
-*/
-
-/*! \fn template<typename Functor> void QTimer::singleShot(int msec, Qt::TimerType timerType, const QObject *context, Functor functor)
-
- \since 5.4
-
- \overload
- \reentrant
- This static function calls \a functor after a given time interval.
-
- It is very convenient to use this function because you do not need
- to bother with a \l{QObject::timerEvent()}{timerEvent} or
- create a local QTimer object.
-
- The time interval is \a msec milliseconds. The \a timerType affects the
- accuracy of the timer.
-
- If \a context is destroyed before the interval occurs, the method will not be called.
- The function will be run in the thread of \a context. The context's thread must have
- a running Qt event loop.
+ The \a msec parameter can be an \c int or a \c std::chrono::milliseconds value.
\sa start()
*/
@@ -640,43 +464,35 @@ void QTimer::singleShot(int msec, Qt::TimerType timerType, const QObject *receiv
*/
/*!
- \fn template <typename Functor> QMetaObject::Connection QTimer::callOnTimeout(Functor slot, Qt::ConnectionType connectionType = Qt::AutoConnection)
+ \fn template <typename Functor> QMetaObject::Connection QTimer::callOnTimeout(Functor &&slot)
\since 5.12
- \overload
- Creates a connection of type \a connectionType from the timeout() signal
- to \a slot, and returns a handle to the connection.
+ Creates a connection from the timer's timeout() signal to \a slot.
+ Returns a handle to the connection.
- This method is provided for convenience.
- It's equivalent to calling \c {QObject::connect(timer, &QTimer::timeout, timer, slot, connectionType)}.
+ This method is provided for convenience. It's equivalent to calling:
+ \code
+ QObject::connect(timer, &QTimer::timeout, timer, slot, Qt::DirectConnection);
+ \endcode
+
+ \note This overload is not available when \c {QT_NO_CONTEXTLESS_CONNECT} is
+ defined, instead use the callOnTimeout() overload that takes a context object.
\sa QObject::connect(), timeout()
*/
/*!
- \fn template <typename Functor> QMetaObject::Connection QTimer::callOnTimeout(const QObject *context, Functor slot, Qt::ConnectionType connectionType = Qt::AutoConnection)
+ \fn template <typename Functor> QMetaObject::Connection QTimer::callOnTimeout(const QObject *context, Functor &&slot, Qt::ConnectionType connectionType = Qt::AutoConnection)
\since 5.12
\overload callOnTimeout()
Creates a connection from the timeout() signal to \a slot to be placed in a specific
event loop of \a context, and returns a handle to the connection.
- This method is provided for convenience. It's equivalent to calling
- \c {QObject::connect(timer, &QTimer::timeout, context, slot, connectionType)}.
-
- \sa QObject::connect(), timeout()
-*/
-
-/*!
- \fn template <typename MemberFunction> QMetaObject::Connection QTimer::callOnTimeout(const QObject *receiver, MemberFunction *slot, Qt::ConnectionType connectionType = Qt::AutoConnection)
- \since 5.12
- \overload callOnTimeout()
-
- Creates a connection from the timeout() signal to the \a slot in the \a receiver object. Returns
- a handle to the connection.
-
- This method is provided for convenience. It's equivalent to calling
- \c {QObject::connect(timer, &QTimer::timeout, receiver, slot, connectionType)}.
+ This method is provided for convenience. It's equivalent to calling:
+ \code
+ QObject::connect(timer, &QTimer::timeout, context, slot, connectionType);
+ \endcode
\sa QObject::connect(), timeout()
*/
@@ -691,7 +507,13 @@ void QTimer::singleShot(int msec, Qt::TimerType timerType, const QObject *receiv
If the timer is already running, it will be
\l{QTimer::stop()}{stopped} and restarted.
- If \l singleShot is true, the timer will be activated only once.
+ If \l singleShot is true, the timer will be activated only once. This is
+ equivalent to:
+
+ \code
+ timer.setInterval(msec);
+ timer.start();
+ \endcode
*/
/*!
@@ -756,14 +578,30 @@ QBindable<bool> QTimer::bindableSingleShot()
*/
void QTimer::setInterval(int msec)
{
+ setInterval(std::chrono::milliseconds{msec});
+}
+
+void QTimer::setInterval(std::chrono::milliseconds interval)
+{
Q_D(QTimer);
- const bool intervalChanged = msec != d->inter;
- d->inter.setValue(msec);
- if (d->id != INV_TIMER) { // create new timer
+ // This could be narrowing as the interval is stored in an `int` QProperty,
+ // and the type can't be changed in Qt6.
+ const int msec = interval.count();
+ d->inter.removeBindingUnlessInWrapper();
+ const bool intervalChanged = msec != d->inter.valueBypassingBindings();
+ d->inter.setValueBypassingBindings(msec);
+ if (d->isActive()) { // create new timer
QObject::killTimer(d->id); // restart timer
- d->id = QObject::startTimer(msec, d->type);
- // No need to call markDirty() for d->isActiveData here,
- // as timer state actually does not change
+ Qt::TimerId newId{ QObject::startTimer(msec * 1ms, d->type) }; // overflow impossible
+ if (newId > Qt::TimerId::Invalid) {
+ // Restarted successfully. No need to update the active state.
+ d->id = newId;
+ } else {
+ // Failed to start the timer.
+ // Need to notify about active state change.
+ d->id = Qt::TimerId::Invalid;
+ d->isActiveData.notify();
+ }
}
if (intervalChanged)
d->inter.notify();
@@ -793,8 +631,10 @@ QBindable<int> QTimer::bindableInterval()
int QTimer::remainingTime() const
{
Q_D(const QTimer);
- if (d->id != INV_TIMER) {
- return QAbstractEventDispatcher::instance()->remainingTime(d->id);
+ if (d->isActive()) {
+ using namespace std::chrono;
+ auto remaining = QAbstractEventDispatcher::instance()->remainingTime(d->id);
+ return ceil<milliseconds>(remaining).count();
}
return -1;
@@ -825,5 +665,4 @@ QBindable<Qt::TimerType> QTimer::bindableTimerType()
QT_END_NAMESPACE
-#include "qtimer.moc"
#include "moc_qtimer.cpp"
diff --git a/src/corelib/kernel/qtimer.h b/src/corelib/kernel/qtimer.h
index 2b262f6311..854d9072f2 100644
--- a/src/corelib/kernel/qtimer.h
+++ b/src/corelib/kernel/qtimer.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QTIMER_H
#define QTIMER_H
@@ -47,9 +11,7 @@
#include <QtCore/qbasictimer.h> // conceptual inheritance
#include <QtCore/qobject.h>
-#if __has_include(<chrono>)
-# include <chrono>
-#endif
+#include <chrono>
QT_BEGIN_NAMESPACE
@@ -69,6 +31,7 @@ public:
bool isActive() const;
QBindable<bool> bindableActive();
int timerId() const;
+ Qt::TimerId id() const;
void setInterval(int msec);
int interval() const;
@@ -84,85 +47,56 @@ public:
bool isSingleShot() const;
QBindable<bool> bindableSingleShot();
+ QT_CORE_INLINE_SINCE(6, 8)
static void singleShot(int msec, const QObject *receiver, const char *member);
+
+ QT_CORE_INLINE_SINCE(6, 8)
static void singleShot(int msec, Qt::TimerType timerType, const QObject *receiver, const char *member);
-#ifdef Q_CLANG_QDOC
- template<typename PointerToMemberFunction>
- static void singleShot(int msec, const QObject *receiver, PointerToMemberFunction method);
- template<typename PointerToMemberFunction>
- static void singleShot(int msec, Qt::TimerType timerType, const QObject *receiver, PointerToMemberFunction method);
- template<typename Functor>
- static void singleShot(int msec, Functor functor);
- template<typename Functor>
- static void singleShot(int msec, Qt::TimerType timerType, Functor functor);
- template<typename Functor, int>
- static void singleShot(int msec, const QObject *context, Functor functor);
- template<typename Functor, int>
- static void singleShot(int msec, Qt::TimerType timerType, const QObject *context, Functor functor);
- template <typename Functor>
- QMetaObject::Connection callOnTimeout(Functor slot, Qt::ConnectionType connectionType = Qt::AutoConnection);
- template <typename Functor>
- QMetaObject::Connection callOnTimeout(const QObject *context, Functor slot, Qt::ConnectionType connectionType = Qt::AutoConnection);
- template <typename MemberFunction>
- QMetaObject::Connection callOnTimeout(const QObject *receiver, MemberFunction *slot, Qt::ConnectionType connectionType = Qt::AutoConnection);
+ // singleShot with context
+#ifdef Q_QDOC
+ template <typename Duration, typename Functor>
+ static inline void singleShot(Duration interval, const QObject *receiver, Functor &&slot);
+ template <typename Duration, typename Functor>
+ static inline void singleShot(Duration interval, Qt::TimerType timerType,
+ const QObject *receiver, Functor &&slot);
#else
- // singleShot to a QObject slot
- template <typename Duration, typename Func1>
- static inline void singleShot(Duration interval, const typename QtPrivate::FunctionPointer<Func1>::Object *receiver, Func1 slot)
+ template <typename Duration, typename Functor>
+ static inline void singleShot(Duration interval,
+ const typename QtPrivate::ContextTypeForFunctor<Functor>::ContextType *receiver,
+ Functor &&slot)
{
- singleShot(interval, defaultTypeFor(interval), receiver, slot);
+ singleShot(interval, defaultTypeFor(interval), receiver, std::forward<Functor>(slot));
}
- template <typename Duration, typename Func1>
- static inline void singleShot(Duration interval, Qt::TimerType timerType, const typename QtPrivate::FunctionPointer<Func1>::Object *receiver,
- Func1 slot)
+ template <typename Duration, typename Functor>
+ static inline void singleShot(Duration interval, Qt::TimerType timerType,
+ const typename QtPrivate::ContextTypeForFunctor<Functor>::ContextType *receiver,
+ Functor &&slot)
{
- typedef QtPrivate::FunctionPointer<Func1> SlotType;
-
- //compilation error if the slot has arguments.
- static_assert(int(SlotType::ArgumentCount) == 0,
- "The slot must not have any arguments.");
-
+ using Prototype = void(*)();
singleShotImpl(interval, timerType, receiver,
- new QtPrivate::QSlotObject<Func1, typename SlotType::Arguments, void>(slot));
- }
- // singleShot to a functor or function pointer (without context)
- template <typename Duration, typename Func1>
- static inline typename std::enable_if<!QtPrivate::FunctionPointer<Func1>::IsPointerToMemberFunction &&
- !std::is_same<const char*, Func1>::value, void>::type
- singleShot(Duration interval, Func1 slot)
- {
- singleShot(interval, defaultTypeFor(interval), nullptr, std::move(slot));
- }
- template <typename Duration, typename Func1>
- static inline typename std::enable_if<!QtPrivate::FunctionPointer<Func1>::IsPointerToMemberFunction &&
- !std::is_same<const char*, Func1>::value, void>::type
- singleShot(Duration interval, Qt::TimerType timerType, Func1 slot)
- {
- singleShot(interval, timerType, nullptr, std::move(slot));
+ QtPrivate::makeCallableObject<Prototype>(std::forward<Functor>(slot)));
}
- // singleShot to a functor or function pointer (with context)
- template <typename Duration, typename Func1>
- static inline typename std::enable_if<!QtPrivate::FunctionPointer<Func1>::IsPointerToMemberFunction &&
- !std::is_same<const char*, Func1>::value, void>::type
- singleShot(Duration interval, const QObject *context, Func1 slot)
+#endif
+
+ // singleShot without context
+ template <typename Duration, typename Functor>
+ static inline void singleShot(Duration interval, Functor &&slot)
{
- singleShot(interval, defaultTypeFor(interval), context, std::move(slot));
+ singleShot(interval, defaultTypeFor(interval), nullptr, std::forward<Functor>(slot));
}
- template <typename Duration, typename Func1>
- static inline typename std::enable_if<!QtPrivate::FunctionPointer<Func1>::IsPointerToMemberFunction &&
- !std::is_same<const char*, Func1>::value, void>::type
- singleShot(Duration interval, Qt::TimerType timerType, const QObject *context, Func1 slot)
+ template <typename Duration, typename Functor>
+ static inline void singleShot(Duration interval, Qt::TimerType timerType, Functor &&slot)
{
- //compilation error if the slot has arguments.
- typedef QtPrivate::FunctionPointer<Func1> SlotType;
- static_assert(int(SlotType::ArgumentCount) <= 0, "The slot must not have any arguments.");
-
- singleShotImpl(interval, timerType, context,
- new QtPrivate::QFunctorSlotObject<Func1, 0,
- typename QtPrivate::List_Left<void, 0>::Value, void>(std::move(slot)));
+ singleShot(interval, timerType, nullptr, std::forward<Functor>(slot));
}
+#ifdef Q_QDOC
+ template <typename Functor>
+ QMetaObject::Connection callOnTimeout(Functor &&slot);
+ template <typename Functor>
+ QMetaObject::Connection callOnTimeout(const QObject *context, Functor &&slot, Qt::ConnectionType connectionType = Qt::AutoConnection);
+#else
template <typename ... Args>
QMetaObject::Connection callOnTimeout(Args && ...args)
{
@@ -181,11 +115,7 @@ Q_SIGNALS:
void timeout(QPrivateSignal);
public:
-#if __has_include(<chrono>) || defined(Q_QDOC)
- void setInterval(std::chrono::milliseconds value)
- {
- setInterval(int(value.count()));
- }
+ void setInterval(std::chrono::milliseconds value);
std::chrono::milliseconds intervalAsDuration() const
{
@@ -199,19 +129,12 @@ public:
static void singleShot(std::chrono::milliseconds value, const QObject *receiver, const char *member)
{
- singleShot(int(value.count()), receiver, member);
- }
-
- static void singleShot(std::chrono::milliseconds value, Qt::TimerType timerType, const QObject *receiver, const char *member)
- {
- singleShot(int(value.count()), timerType, receiver, member);
+ singleShot(value, defaultTypeFor(value), receiver, member);
}
+ static void singleShot(std::chrono::milliseconds interval, Qt::TimerType timerType,
+ const QObject *receiver, const char *member);
- void start(std::chrono::milliseconds value)
- {
- start(int(value.count()));
- }
-#endif
+ void start(std::chrono::milliseconds value);
protected:
void timerEvent(QTimerEvent *) override;
@@ -224,23 +147,40 @@ private:
inline void killTimer(int){}
static constexpr Qt::TimerType defaultTypeFor(int msecs) noexcept
- { return msecs >= 2000 ? Qt::CoarseTimer : Qt::PreciseTimer; }
+ { return defaultTypeFor(std::chrono::milliseconds{msecs}); }
+
+ static constexpr Qt::TimerType defaultTypeFor(std::chrono::milliseconds interval) noexcept
+ {
+ // coarse timers are worst in their first firing
+ // so we prefer a high precision timer for something that happens only once
+ // unless the timeout is too big, in which case we go for coarse anyway
+ using namespace std::chrono_literals;
+ return interval >= 2s ? Qt::CoarseTimer : Qt::PreciseTimer;
+ }
+
+ QT_CORE_INLINE_SINCE(6, 8)
static void singleShotImpl(int msec, Qt::TimerType timerType,
const QObject *receiver, QtPrivate::QSlotObjectBase *slotObj);
-#if __has_include(<chrono>)
- static Qt::TimerType defaultTypeFor(std::chrono::milliseconds interval)
- { return defaultTypeFor(int(interval.count())); }
-
static void singleShotImpl(std::chrono::milliseconds interval, Qt::TimerType timerType,
- const QObject *receiver, QtPrivate::QSlotObjectBase *slotObj)
- {
- singleShotImpl(int(interval.count()),
- timerType, receiver, slotObj);
- }
-#endif
+ const QObject *receiver, QtPrivate::QSlotObjectBase *slotObj);
};
+#if QT_CORE_INLINE_IMPL_SINCE(6, 8)
+void QTimer::singleShot(int msec, const QObject *receiver, const char *member)
+{ singleShot(std::chrono::milliseconds{msec}, receiver, member); }
+
+void QTimer::singleShot(int msec, Qt::TimerType timerType, const QObject *receiver,
+ const char *member)
+{ singleShot(std::chrono::milliseconds{msec}, timerType, receiver, member); }
+
+void QTimer::singleShotImpl(int msec, Qt::TimerType timerType,
+ const QObject *receiver, QtPrivate::QSlotObjectBase *slotObj)
+{
+ singleShotImpl(std::chrono::milliseconds{msec}, timerType, receiver, slotObj);
+}
+#endif
+
QT_END_NAMESPACE
#endif // QT_NO_QOBJECT
diff --git a/src/corelib/kernel/qtimer_p.h b/src/corelib/kernel/qtimer_p.h
new file mode 100644
index 0000000000..9347f6c241
--- /dev/null
+++ b/src/corelib/kernel/qtimer_p.h
@@ -0,0 +1,73 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+#ifndef QTIMER_P_H
+#define QTIMER_P_H
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists for the convenience
+// of the Qt translation tools. This header file may change from version
+// to version without notice, or even be removed.
+//
+// We mean it.
+//
+#include "qtimer.h"
+#include "qchronotimer.h"
+
+#include "qobject_p.h"
+#include "qproperty_p.h"
+#include "qttypetraits.h"
+
+QT_BEGIN_NAMESPACE
+
+class QTimerPrivate : public QObjectPrivate
+{
+public:
+ QTimerPrivate(QTimer *qq)
+ : q(qq),
+ isQTimer(true)
+ {}
+
+ QTimerPrivate(std::chrono::nanoseconds nsec, QChronoTimer *qq)
+ : intervalDuration(nsec),
+ q(qq)
+ {
+ intervalDuration.notify();
+ }
+
+ static constexpr int INV_TIMER = -1; // invalid timer id
+
+ void setIntervalDuration(std::chrono::nanoseconds nsec)
+ {
+ if (isQTimer) {
+ const auto msec = std::chrono::ceil<std::chrono::milliseconds>(nsec);
+ static_cast<QTimer *>(q)->setInterval(msec);
+ } else {
+ static_cast<QChronoTimer *>(q)->setInterval(nsec);
+ }
+ }
+
+ void setInterval(int msec)
+ {
+ Q_ASSERT(isQTimer);
+ static_cast<QTimer *>(q)->setInterval(msec);
+ }
+
+ bool isActive() const { return id > Qt::TimerId::Invalid; }
+
+ Qt::TimerId id = Qt::TimerId::Invalid;
+ Q_OBJECT_COMPAT_PROPERTY_WITH_ARGS(QTimerPrivate, int, inter, &QTimerPrivate::setInterval, 0)
+ Q_OBJECT_COMPAT_PROPERTY_WITH_ARGS(QTimerPrivate, std::chrono::nanoseconds, intervalDuration,
+ &QTimerPrivate::setIntervalDuration,
+ std::chrono::nanoseconds{0})
+ Q_OBJECT_BINDABLE_PROPERTY_WITH_ARGS(QTimerPrivate, bool, single, false)
+ Q_OBJECT_BINDABLE_PROPERTY_WITH_ARGS(QTimerPrivate, Qt::TimerType, type, Qt::CoarseTimer)
+ Q_OBJECT_COMPUTED_PROPERTY(QTimerPrivate, bool, isActiveData, &QTimerPrivate::isActive)
+
+ QObject *q;
+ const bool isQTimer = false; // true if q is a QTimer*
+};
+
+QT_END_NAMESPACE
+#endif // QTIMER_P_H
diff --git a/src/corelib/kernel/qtimerinfo_unix.cpp b/src/corelib/kernel/qtimerinfo_unix.cpp
index db4d4b1188..b83f0194c2 100644
--- a/src/corelib/kernel/qtimerinfo_unix.cpp
+++ b/src/corelib/kernel/qtimerinfo_unix.cpp
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// Copyright (C) 2016 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include <qelapsedtimer.h>
#include <qcoreapplication.h>
@@ -46,13 +10,12 @@
#include "private/qobject_p.h"
#include "private/qabstracteventdispatcher_p.h"
-#ifdef QTIMERINFO_DEBUG
-# include <QDebug>
-# include <QThread>
-#endif
-
#include <sys/times.h>
+using namespace std::chrono;
+// Implied by "using namespace std::chrono", but be explicit about it, for grep-ability
+using namespace std::chrono_literals;
+
QT_BEGIN_NAMESPACE
Q_CORE_EXPORT bool qt_disable_lowpriority_timers=false;
@@ -62,168 +25,75 @@ Q_CORE_EXPORT bool qt_disable_lowpriority_timers=false;
* timerBitVec array is used for keeping track of timer identifiers.
*/
-QTimerInfoList::QTimerInfoList()
-{
-#if (_POSIX_MONOTONIC_CLOCK-0 <= 0) && !defined(Q_OS_MAC)
- if (!QElapsedTimer::isMonotonic()) {
- // not using monotonic timers, initialize the timeChanged() machinery
- previousTime = qt_gettime();
-
- tms unused;
- previousTicks = times(&unused);
-
- ticksPerSecond = sysconf(_SC_CLK_TCK);
- msPerTick = 1000/ticksPerSecond;
- } else {
- // detected monotonic timers
- previousTime.tv_sec = previousTime.tv_nsec = 0;
- previousTicks = 0;
- ticksPerSecond = 0;
- msPerTick = 0;
- }
-#endif
-
- firstTimerInfo = nullptr;
-}
-
-timespec QTimerInfoList::updateCurrentTime()
-{
- return (currentTime = qt_gettime());
-}
-
-#if ((_POSIX_MONOTONIC_CLOCK-0 <= 0) && !defined(Q_OS_MAC) && !defined(Q_OS_INTEGRITY)) || defined(QT_BOOTSTRAPPED)
+QTimerInfoList::QTimerInfoList() = default;
-timespec qAbsTimespec(const timespec &t)
+steady_clock::time_point QTimerInfoList::updateCurrentTime() const
{
- timespec tmp = t;
- if (tmp.tv_sec < 0) {
- tmp.tv_sec = -tmp.tv_sec - 1;
- tmp.tv_nsec -= 1000000000;
- }
- if (tmp.tv_sec == 0 && tmp.tv_nsec < 0) {
- tmp.tv_nsec = -tmp.tv_nsec;
- }
- return normalizedTimespec(tmp);
+ currentTime = steady_clock::now();
+ return currentTime;
}
-/*
- Returns \c true if the real time clock has changed by more than 10%
- relative to the processor time since the last time this function was
- called. This presumably means that the system time has been changed.
-
- If /a delta is nonzero, delta is set to our best guess at how much the system clock was changed.
-*/
-bool QTimerInfoList::timeChanged(timespec *delta)
-{
- struct tms unused;
- clock_t currentTicks = times(&unused);
-
- clock_t elapsedTicks = currentTicks - previousTicks;
- timespec elapsedTime = currentTime - previousTime;
-
- timespec elapsedTimeTicks;
- elapsedTimeTicks.tv_sec = elapsedTicks / ticksPerSecond;
- elapsedTimeTicks.tv_nsec = (((elapsedTicks * 1000) / ticksPerSecond) % 1000) * 1000 * 1000;
-
- timespec dummy;
- if (!delta)
- delta = &dummy;
- *delta = elapsedTime - elapsedTimeTicks;
-
- previousTicks = currentTicks;
- previousTime = currentTime;
-
- // If tick drift is more than 10% off compared to realtime, we assume that the clock has
- // been set. Of course, we have to allow for the tick granularity as well.
- timespec tickGranularity;
- tickGranularity.tv_sec = 0;
- tickGranularity.tv_nsec = msPerTick * 1000 * 1000;
- return elapsedTimeTicks < ((qAbsTimespec(*delta) - tickGranularity) * 10);
-}
+/*! \internal
+ Updates the currentTime member to the current time, and returns \c true if
+ the first timer's timeout is in the future (after currentTime).
-/*
- repair broken timer
+ The list is sorted by timeout, thus it's enough to check the first timer only.
*/
-void QTimerInfoList::timerRepair(const timespec &diff)
-{
- // repair all timers
- for (int i = 0; i < size(); ++i) {
- QTimerInfo *t = at(i);
- t->timeout = t->timeout + diff;
- }
-}
-
-void QTimerInfoList::repairTimersIfNeeded()
-{
- if (QElapsedTimer::isMonotonic())
- return;
- timespec delta;
- if (timeChanged(&delta))
- timerRepair(delta);
-}
-
-#else // !(_POSIX_MONOTONIC_CLOCK-0 <= 0) && !defined(QT_BOOTSTRAPPED)
-
-void QTimerInfoList::repairTimersIfNeeded()
+bool QTimerInfoList::hasPendingTimers()
{
+ if (timers.isEmpty())
+ return false;
+ return updateCurrentTime() < timers.at(0)->timeout;
}
-#endif
+static bool byTimeout(const QTimerInfo *a, const QTimerInfo *b)
+{ return a->timeout < b->timeout; };
/*
insert timer info into list
*/
void QTimerInfoList::timerInsert(QTimerInfo *ti)
{
- int index = size();
- while (index--) {
- const QTimerInfo * const t = at(index);
- if (!(ti->timeout < t->timeout))
- break;
- }
- insert(index+1, ti);
-}
-
-inline timespec &operator+=(timespec &t1, int ms)
-{
- t1.tv_sec += ms / 1000;
- t1.tv_nsec += ms % 1000 * 1000 * 1000;
- return normalizedTimespec(t1);
-}
-
-inline timespec operator+(const timespec &t1, int ms)
-{
- timespec t2 = t1;
- return t2 += ms;
+ timers.insert(std::upper_bound(timers.cbegin(), timers.cend(), ti, byTimeout),
+ ti);
}
-static timespec roundToMillisecond(timespec val)
+static constexpr milliseconds roundToMillisecond(nanoseconds val)
{
// always round up
// worst case scenario is that the first trigger of a 1-ms timer is 0.999 ms late
-
- int ns = val.tv_nsec % (1000 * 1000);
- val.tv_nsec += 1000 * 1000 - ns;
- return normalizedTimespec(val);
+ return ceil<milliseconds>(val);
}
-#ifdef QTIMERINFO_DEBUG
-QDebug operator<<(QDebug s, timeval tv)
-{
- QDebugStateSaver saver(s);
- s.nospace() << tv.tv_sec << "." << qSetFieldWidth(6) << qSetPadChar(QChar(48)) << tv.tv_usec << Qt::reset;
- return s;
-}
-QDebug operator<<(QDebug s, Qt::TimerType t)
+static_assert(roundToMillisecond(0ns) == 0ms);
+static_assert(roundToMillisecond(1ns) == 1ms);
+static_assert(roundToMillisecond(999'999ns) == 1ms);
+static_assert(roundToMillisecond(1'000'000ns) == 1ms);
+static_assert(roundToMillisecond(999'000'000ns) == 999ms);
+static_assert(roundToMillisecond(999'000'001ns) == 1000ms);
+static_assert(roundToMillisecond(999'999'999ns) == 1000ms);
+static_assert(roundToMillisecond(1s) == 1s);
+
+static constexpr seconds roundToSecs(nanoseconds interval)
{
- QDebugStateSaver saver(s);
- s << (t == Qt::PreciseTimer ? "P" :
- t == Qt::CoarseTimer ? "C" : "VC");
- return s;
+ // The very coarse timer is based on full second precision, so we want to
+ // round the interval to the closest second, rounding 500ms up to 1s.
+ //
+ // std::chrono::round() wouldn't work with all multiples of 500 because for the
+ // middle point it would round to even:
+ // value round() wanted
+ // 500 0 1
+ // 1500 2 2
+ // 2500 2 3
+
+ auto secs = duration_cast<seconds>(interval);
+ const nanoseconds frac = interval - secs;
+ if (frac >= 500ms)
+ ++secs;
+ return secs;
}
-#endif
-static void calculateCoarseTimerTimeout(QTimerInfo *t, timespec currentTime)
+static void calculateCoarseTimerTimeout(QTimerInfo *t, steady_clock::time_point now)
{
// The coarse timer works like this:
// - interval under 40 ms: round to even
@@ -241,214 +111,186 @@ static void calculateCoarseTimerTimeout(QTimerInfo *t, timespec currentTime)
//
// The objective is to make most timers wake up at the same time, thereby reducing CPU wakeups.
- uint interval = uint(t->interval);
- uint msec = uint(t->timeout.tv_nsec) / 1000 / 1000;
- Q_ASSERT(interval >= 20);
+ Q_ASSERT(t->interval >= 20ms);
+
+ const auto timeoutInSecs = time_point_cast<seconds>(t->timeout);
+
+ auto recalculate = [&](const milliseconds frac) {
+ t->timeout = timeoutInSecs + frac;
+ if (t->timeout < now)
+ t->timeout += t->interval;
+ };
// Calculate how much we can round and still keep within 5% error
- uint absMaxRounding = interval / 20;
+ milliseconds interval = roundToMillisecond(t->interval);
+ const milliseconds absMaxRounding = interval / 20;
+
+ auto fracMsec = duration_cast<milliseconds>(t->timeout - timeoutInSecs);
- if (interval < 100 && interval != 25 && interval != 50 && interval != 75) {
+ if (interval < 100ms && interval != 25ms && interval != 50ms && interval != 75ms) {
+ auto fracCount = fracMsec.count();
// special mode for timers of less than 100 ms
- if (interval < 50) {
+ if (interval < 50ms) {
// round to even
// round towards multiples of 50 ms
- bool roundUp = (msec % 50) >= 25;
- msec >>= 1;
- msec |= uint(roundUp);
- msec <<= 1;
+ bool roundUp = (fracCount % 50) >= 25;
+ fracCount >>= 1;
+ fracCount |= roundUp;
+ fracCount <<= 1;
} else {
// round to multiple of 4
// round towards multiples of 100 ms
- bool roundUp = (msec % 100) >= 50;
- msec >>= 2;
- msec |= uint(roundUp);
- msec <<= 2;
- }
- } else {
- uint min = qMax<int>(0, msec - absMaxRounding);
- uint max = qMin(1000u, msec + absMaxRounding);
-
- // find the boundary that we want, according to the rules above
- // extra rules:
- // 1) whatever the interval, we'll take any round-to-the-second timeout
- if (min == 0) {
- msec = 0;
- goto recalculate;
- } else if (max == 1000) {
- msec = 1000;
- goto recalculate;
+ bool roundUp = (fracCount % 100) >= 50;
+ fracCount >>= 2;
+ fracCount |= roundUp;
+ fracCount <<= 2;
}
+ fracMsec = milliseconds{fracCount};
+ recalculate(fracMsec);
+ return;
+ }
- uint wantedBoundaryMultiple;
-
- // 2) if the interval is a multiple of 500 ms and > 5000 ms, we'll always round
- // towards a round-to-the-second
- // 3) if the interval is a multiple of 500 ms, we'll round towards the nearest
- // multiple of 500 ms
- if ((interval % 500) == 0) {
- if (interval >= 5000) {
- msec = msec >= 500 ? max : min;
- goto recalculate;
- } else {
- wantedBoundaryMultiple = 500;
- }
- } else if ((interval % 50) == 0) {
- // 4) same for multiples of 250, 200, 100, 50
- uint mult50 = interval / 50;
- if ((mult50 % 4) == 0) {
- // multiple of 200
- wantedBoundaryMultiple = 200;
- } else if ((mult50 % 2) == 0) {
- // multiple of 100
- wantedBoundaryMultiple = 100;
- } else if ((mult50 % 5) == 0) {
- // multiple of 250
- wantedBoundaryMultiple = 250;
- } else {
- // multiple of 50
- wantedBoundaryMultiple = 50;
- }
- } else {
- wantedBoundaryMultiple = 25;
- }
+ milliseconds min = std::max(0ms, fracMsec - absMaxRounding);
+ milliseconds max = std::min(1000ms, fracMsec + absMaxRounding);
- uint base = msec / wantedBoundaryMultiple * wantedBoundaryMultiple;
- uint middlepoint = base + wantedBoundaryMultiple / 2;
- if (msec < middlepoint)
- msec = qMax(base, min);
- else
- msec = qMin(base + wantedBoundaryMultiple, max);
+ // find the boundary that we want, according to the rules above
+ // extra rules:
+ // 1) whatever the interval, we'll take any round-to-the-second timeout
+ if (min == 0ms) {
+ fracMsec = 0ms;
+ recalculate(fracMsec);
+ return;
+ } else if (max == 1000ms) {
+ fracMsec = 1000ms;
+ recalculate(fracMsec);
+ return;
}
-recalculate:
- if (msec == 1000u) {
- ++t->timeout.tv_sec;
- t->timeout.tv_nsec = 0;
- } else {
- t->timeout.tv_nsec = msec * 1000 * 1000;
+ milliseconds wantedBoundaryMultiple{25};
+
+ // 2) if the interval is a multiple of 500 ms and > 5000 ms, we'll always round
+ // towards a round-to-the-second
+ // 3) if the interval is a multiple of 500 ms, we'll round towards the nearest
+ // multiple of 500 ms
+ if ((interval % 500) == 0ms) {
+ if (interval >= 5s) {
+ fracMsec = fracMsec >= 500ms ? max : min;
+ recalculate(fracMsec);
+ return;
+ } else {
+ wantedBoundaryMultiple = 500ms;
+ }
+ } else if ((interval % 50) == 0ms) {
+ // 4) same for multiples of 250, 200, 100, 50
+ milliseconds mult50 = interval / 50;
+ if ((mult50 % 4) == 0ms) {
+ // multiple of 200
+ wantedBoundaryMultiple = 200ms;
+ } else if ((mult50 % 2) == 0ms) {
+ // multiple of 100
+ wantedBoundaryMultiple = 100ms;
+ } else if ((mult50 % 5) == 0ms) {
+ // multiple of 250
+ wantedBoundaryMultiple = 250ms;
+ } else {
+ // multiple of 50
+ wantedBoundaryMultiple = 50ms;
+ }
}
- if (t->timeout < currentTime)
- t->timeout += interval;
+ milliseconds base = (fracMsec / wantedBoundaryMultiple) * wantedBoundaryMultiple;
+ milliseconds middlepoint = base + wantedBoundaryMultiple / 2;
+ if (fracMsec < middlepoint)
+ fracMsec = qMax(base, min);
+ else
+ fracMsec = qMin(base + wantedBoundaryMultiple, max);
+
+ recalculate(fracMsec);
}
-static void calculateNextTimeout(QTimerInfo *t, timespec currentTime)
+static void calculateNextTimeout(QTimerInfo *t, steady_clock::time_point now)
{
switch (t->timerType) {
case Qt::PreciseTimer:
case Qt::CoarseTimer:
t->timeout += t->interval;
- if (t->timeout < currentTime) {
- t->timeout = currentTime;
+ if (t->timeout < now) {
+ t->timeout = now;
t->timeout += t->interval;
}
-#ifdef QTIMERINFO_DEBUG
- t->expected += t->interval;
- if (t->expected < currentTime) {
- t->expected = currentTime;
- t->expected += t->interval;
- }
-#endif
if (t->timerType == Qt::CoarseTimer)
- calculateCoarseTimerTimeout(t, currentTime);
+ calculateCoarseTimerTimeout(t, now);
return;
case Qt::VeryCoarseTimer:
- // we don't need to take care of the microsecond component of t->interval
- t->timeout.tv_sec += t->interval;
- if (t->timeout.tv_sec <= currentTime.tv_sec)
- t->timeout.tv_sec = currentTime.tv_sec + t->interval;
-#ifdef QTIMERINFO_DEBUG
- t->expected.tv_sec += t->interval;
- if (t->expected.tv_sec <= currentTime.tv_sec)
- t->expected.tv_sec = currentTime.tv_sec + t->interval;
-#endif
- return;
+ // t->interval already rounded to full seconds in registerTimer()
+ t->timeout += t->interval;
+ if (t->timeout <= now)
+ t->timeout = time_point_cast<seconds>(now + t->interval);
+ break;
}
-
-#ifdef QTIMERINFO_DEBUG
- if (t->timerType != Qt::PreciseTimer)
- qDebug() << "timer" << t->timerType << Qt::hex << t->id << Qt::dec << "interval" << t->interval
- << "originally expected at" << t->expected << "will fire at" << t->timeout
- << "or" << (t->timeout - t->expected) << "s late";
-#endif
}
/*
- Returns the time to wait for the next timer, or null if no timers
- are waiting.
-*/
-bool QTimerInfoList::timerWait(timespec &tm)
+ Returns the time to wait for the first timer that has not been activated yet,
+ otherwise returns std::nullopt.
+ */
+std::optional<QTimerInfoList::Duration> QTimerInfoList::timerWait()
{
- timespec currentTime = updateCurrentTime();
- repairTimersIfNeeded();
+ steady_clock::time_point now = updateCurrentTime();
+ auto isWaiting = [](QTimerInfo *tinfo) { return !tinfo->activateRef; };
// Find first waiting timer not already active
- QTimerInfo *t = nullptr;
- for (QTimerInfoList::const_iterator it = constBegin(); it != constEnd(); ++it) {
- if (!(*it)->activateRef) {
- t = *it;
- break;
- }
- }
-
- if (!t)
- return false;
-
- if (currentTime < t->timeout) {
- // time to wait
- tm = roundToMillisecond(t->timeout - currentTime);
- } else {
- // no time to wait
- tm.tv_sec = 0;
- tm.tv_nsec = 0;
- }
-
- return true;
+ auto it = std::find_if(timers.cbegin(), timers.cend(), isWaiting);
+ if (it == timers.cend())
+ return std::nullopt;
+
+ Duration timeToWait = (*it)->timeout - now;
+ if (timeToWait > 0ns)
+ return roundToMillisecond(timeToWait);
+ return 0ms;
}
/*
- Returns the timer's remaining time in milliseconds with the given timerId, or
- null if there is nothing left. If the timer id is not found in the list, the
- returned value will be -1. If the timer is overdue, the returned value will be 0.
+ Returns the timer's remaining time in milliseconds with the given timerId.
+ If the timer id is not found in the list, the returned value will be \c{Duration::min()}.
+ If the timer is overdue, the returned value will be 0.
*/
-int QTimerInfoList::timerRemainingTime(int timerId)
+QTimerInfoList::Duration QTimerInfoList::remainingDuration(Qt::TimerId timerId) const
{
- timespec currentTime = updateCurrentTime();
- repairTimersIfNeeded();
- timespec tm = {0, 0};
-
- for (int i = 0; i < count(); ++i) {
- QTimerInfo *t = at(i);
- if (t->id == timerId) {
- if (currentTime < t->timeout) {
- // time to wait
- tm = roundToMillisecond(t->timeout - currentTime);
- return tm.tv_sec*1000 + tm.tv_nsec/1000/1000;
- } else {
- return 0;
- }
- }
- }
+ const steady_clock::time_point now = updateCurrentTime();
+ auto it = findTimerById(timerId);
+ if (it == timers.cend()) {
#ifndef QT_NO_DEBUG
- qWarning("QTimerInfoList::timerRemainingTime: timer id %i not found", timerId);
+ qWarning("QTimerInfoList::timerRemainingTime: timer id %i not found", int(timerId));
#endif
+ return Duration::min();
+ }
- return -1;
+ const QTimerInfo *t = *it;
+ if (now < t->timeout) // time to wait
+ return t->timeout - now;
+ return 0ms;
}
-void QTimerInfoList::registerTimer(int timerId, qint64 interval, Qt::TimerType timerType, QObject *object)
+void QTimerInfoList::registerTimer(Qt::TimerId timerId, QTimerInfoList::Duration interval,
+ Qt::TimerType timerType, QObject *object)
{
- QTimerInfo *t = new QTimerInfo;
- t->id = timerId;
- t->interval = interval;
- t->timerType = timerType;
- t->obj = object;
- t->activateRef = nullptr;
+ // correct the timer type first
+ if (timerType == Qt::CoarseTimer) {
+ // this timer has up to 5% coarseness
+ // so our boundaries are 20 ms and 20 s
+ // below 20 ms, 5% inaccuracy is below 1 ms, so we convert to high precision
+ // above 20 s, 5% inaccuracy is above 1 s, so we convert to VeryCoarseTimer
+ if (interval >= 20s)
+ timerType = Qt::VeryCoarseTimer;
+ else if (interval <= 20ms)
+ timerType = Qt::PreciseTimer;
+ }
- timespec expected = updateCurrentTime() + interval;
+ QTimerInfo *t = new QTimerInfo(timerId, interval, timerType, object);
+ QTimerInfo::TimePoint expected = updateCurrentTime() + interval;
switch (timerType) {
case Qt::PreciseTimer:
@@ -458,102 +300,69 @@ void QTimerInfoList::registerTimer(int timerId, qint64 interval, Qt::TimerType t
break;
case Qt::CoarseTimer:
- // this timer has up to 5% coarseness
- // so our boundaries are 20 ms and 20 s
- // below 20 ms, 5% inaccuracy is below 1 ms, so we convert to high precision
- // above 20 s, 5% inaccuracy is above 1 s, so we convert to VeryCoarseTimer
- if (interval >= 20000) {
- t->timerType = Qt::VeryCoarseTimer;
- } else {
- t->timeout = expected;
- if (interval <= 20) {
- t->timerType = Qt::PreciseTimer;
- // no adjustment is necessary
- } else if (interval <= 20000) {
- calculateCoarseTimerTimeout(t, currentTime);
- }
- break;
- }
- Q_FALLTHROUGH();
+ t->timeout = expected;
+ t->interval = roundToMillisecond(interval);
+ calculateCoarseTimerTimeout(t, currentTime);
+ break;
+
case Qt::VeryCoarseTimer:
- // the very coarse timer is based on full second precision,
- // so we keep the interval in seconds (round to closest second)
- t->interval /= 500;
- t->interval += 1;
- t->interval >>= 1;
- t->timeout.tv_sec = currentTime.tv_sec + t->interval;
- t->timeout.tv_nsec = 0;
-
- // if we're past the half-second mark, increase the timeout again
- if (currentTime.tv_nsec > 500*1000*1000)
- ++t->timeout.tv_sec;
+ t->interval = roundToSecs(t->interval);
+ const auto currentTimeInSecs = floor<seconds>(currentTime);
+ t->timeout = currentTimeInSecs + t->interval;
+ // If we're past the half-second mark, increase the timeout again
+ if (currentTime - currentTimeInSecs > 500ms)
+ t->timeout += 1s;
}
timerInsert(t);
-
-#ifdef QTIMERINFO_DEBUG
- t->expected = expected;
- t->cumulativeError = 0;
- t->count = 0;
- if (t->timerType != Qt::PreciseTimer)
- qDebug() << "timer" << t->timerType << Qt::hex <<t->id << Qt::dec << "interval" << t->interval << "expected at"
- << t->expected << "will fire first at" << t->timeout;
-#endif
}
-bool QTimerInfoList::unregisterTimer(int timerId)
+bool QTimerInfoList::unregisterTimer(Qt::TimerId timerId)
{
+ auto it = findTimerById(timerId);
+ if (it == timers.cend())
+ return false; // id not found
+
// set timer inactive
- for (int i = 0; i < count(); ++i) {
- QTimerInfo *t = at(i);
- if (t->id == timerId) {
- // found it
- removeAt(i);
- if (t == firstTimerInfo)
- firstTimerInfo = nullptr;
- if (t->activateRef)
- *(t->activateRef) = nullptr;
- delete t;
- return true;
- }
- }
- // id not found
- return false;
+ QTimerInfo *t = *it;
+ if (t == firstTimerInfo)
+ firstTimerInfo = nullptr;
+ if (t->activateRef)
+ *(t->activateRef) = nullptr;
+ delete t;
+ timers.erase(it);
+ return true;
}
bool QTimerInfoList::unregisterTimers(QObject *object)
{
- if (isEmpty())
+ if (timers.isEmpty())
return false;
- for (int i = 0; i < count(); ++i) {
- QTimerInfo *t = at(i);
- if (t->obj == object) {
- // object found
- removeAt(i);
- if (t == firstTimerInfo)
- firstTimerInfo = nullptr;
- if (t->activateRef)
- *(t->activateRef) = nullptr;
- delete t;
- // move back one so that we don't skip the new current item
- --i;
- }
- }
- return true;
+
+ auto associatedWith = [this](QObject *o) {
+ return [this, o](auto &t) {
+ if (t->obj == o) {
+ if (t == firstTimerInfo)
+ firstTimerInfo = nullptr;
+ if (t->activateRef)
+ *(t->activateRef) = nullptr;
+ delete t;
+ return true;
+ }
+ return false;
+ };
+ };
+
+ qsizetype count = timers.removeIf(associatedWith(object));
+ return count > 0;
}
-QList<QAbstractEventDispatcher::TimerInfo> QTimerInfoList::registeredTimers(QObject *object) const
+auto QTimerInfoList::registeredTimers(QObject *object) const -> QList<TimerInfo>
{
- QList<QAbstractEventDispatcher::TimerInfo> list;
- for (int i = 0; i < count(); ++i) {
- const QTimerInfo * const t = at(i);
- if (t->obj == object) {
- list << QAbstractEventDispatcher::TimerInfo(t->id,
- (t->timerType == Qt::VeryCoarseTimer
- ? t->interval * 1000
- : t->interval),
- t->timerType);
- }
+ QList<TimerInfo> list;
+ for (const auto &t : timers) {
+ if (t->obj == object)
+ list.emplaceBack(TimerInfo{t->interval, t->id, t->timerType});
}
return list;
}
@@ -563,31 +372,27 @@ QList<QAbstractEventDispatcher::TimerInfo> QTimerInfoList::registeredTimers(QObj
*/
int QTimerInfoList::activateTimers()
{
- if (qt_disable_lowpriority_timers || isEmpty())
+ if (qt_disable_lowpriority_timers || timers.isEmpty())
return 0; // nothing to do
- int n_act = 0, maxCount = 0;
firstTimerInfo = nullptr;
- timespec currentTime = updateCurrentTime();
- // qDebug() << "Thread" << QThread::currentThreadId() << "woken up at" << currentTime;
- repairTimersIfNeeded();
-
-
+ const steady_clock::time_point now = updateCurrentTime();
+ // qDebug() << "Thread" << QThread::currentThreadId() << "woken up at" << now;
// Find out how many timer have expired
- for (QTimerInfoList::const_iterator it = constBegin(); it != constEnd(); ++it) {
- if (currentTime < (*it)->timeout)
- break;
- maxCount++;
- }
+ auto stillActive = [&now](const QTimerInfo *t) { return now < t->timeout; };
+ // Find first one still active (list is sorted by timeout)
+ auto it = std::find_if(timers.cbegin(), timers.cend(), stillActive);
+ auto maxCount = it - timers.cbegin();
+ int n_act = 0;
//fire the timers.
while (maxCount--) {
- if (isEmpty())
+ if (timers.isEmpty())
break;
- QTimerInfo *currentTimerInfo = constFirst();
- if (currentTime < currentTimerInfo->timeout)
+ QTimerInfo *currentTimerInfo = timers.constFirst();
+ if (now < currentTimerInfo->timeout)
break; // no timer has expired
if (!firstTimerInfo) {
@@ -600,42 +405,24 @@ int QTimerInfoList::activateTimers()
firstTimerInfo = currentTimerInfo;
}
- // remove from list
- removeFirst();
-
-#ifdef QTIMERINFO_DEBUG
- float diff;
- if (currentTime < currentTimerInfo->expected) {
- // early
- timeval early = currentTimerInfo->expected - currentTime;
- diff = -(early.tv_sec + early.tv_usec / 1000000.0);
- } else {
- timeval late = currentTime - currentTimerInfo->expected;
- diff = late.tv_sec + late.tv_usec / 1000000.0;
- }
- currentTimerInfo->cumulativeError += diff;
- ++currentTimerInfo->count;
- if (currentTimerInfo->timerType != Qt::PreciseTimer)
- qDebug() << "timer" << currentTimerInfo->timerType << Qt::hex << currentTimerInfo->id << Qt::dec << "interval"
- << currentTimerInfo->interval << "firing at" << currentTime
- << "(orig" << currentTimerInfo->expected << "scheduled at" << currentTimerInfo->timeout
- << ") off by" << diff << "activation" << currentTimerInfo->count
- << "avg error" << (currentTimerInfo->cumulativeError / currentTimerInfo->count);
-#endif
-
// determine next timeout time
- calculateNextTimeout(currentTimerInfo, currentTime);
+ calculateNextTimeout(currentTimerInfo, now);
+ if (timers.size() > 1) {
+ // Find where "currentTimerInfo" should be in the list so as
+ // to keep the list ordered by timeout
+ auto afterCurrentIt = timers.begin() + 1;
+ auto iter = std::upper_bound(afterCurrentIt, timers.end(), currentTimerInfo, byTimeout);
+ currentTimerInfo = *std::rotate(timers.begin(), afterCurrentIt, iter);
+ }
- // reinsert timer
- timerInsert(currentTimerInfo);
- if (currentTimerInfo->interval > 0)
+ if (currentTimerInfo->interval > 0ms)
n_act++;
// Send event, but don't allow it to recurse:
if (!currentTimerInfo->activateRef) {
currentTimerInfo->activateRef = &currentTimerInfo;
- QTimerEvent e(currentTimerInfo->id);
+ QTimerEvent e(qToUnderlying(currentTimerInfo->id));
QCoreApplication::sendEvent(currentTimerInfo->obj, &e);
// Storing currentTimerInfo's address in its activateRef allows the
diff --git a/src/corelib/kernel/qtimerinfo_unix_p.h b/src/corelib/kernel/qtimerinfo_unix_p.h
index 1a1a101dda..293e9c4d4e 100644
--- a/src/corelib/kernel/qtimerinfo_unix_p.h
+++ b/src/corelib/kernel/qtimerinfo_unix_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QTIMERINFO_UNIX_P_H
#define QTIMERINFO_UNIX_P_H
@@ -53,65 +17,76 @@
#include <QtCore/private/qglobal_p.h>
-// #define QTIMERINFO_DEBUG
-
#include "qabstracteventdispatcher.h"
-#include <sys/time.h> // struct timeval
+#include <sys/time.h> // struct timespec
+#include <chrono>
QT_BEGIN_NAMESPACE
// internal timer info
-struct QTimerInfo {
- int id; // - timer identifier
- qint64 interval; // - timer interval in milliseconds
+struct QTimerInfo
+{
+ using Duration = QAbstractEventDispatcher::Duration;
+ using TimePoint = std::chrono::time_point<std::chrono::steady_clock, Duration>;
+ QTimerInfo(Qt::TimerId timerId, Duration interval, Qt::TimerType type, QObject *obj)
+ : interval(interval), id(timerId), timerType(type), obj(obj)
+ {
+ }
+
+ TimePoint timeout = {}; // - when to actually fire
+ Duration interval = Duration{-1}; // - timer interval
+ Qt::TimerId id = Qt::TimerId::Invalid; // - timer identifier
Qt::TimerType timerType; // - timer type
- timespec timeout; // - when to actually fire
- QObject *obj; // - object to receive event
- QTimerInfo **activateRef; // - ref from activateTimers
-
-#ifdef QTIMERINFO_DEBUG
- timeval expected; // when timer is expected to fire
- float cumulativeError;
- uint count;
-#endif
+ QObject *obj = nullptr; // - object to receive event
+ QTimerInfo **activateRef = nullptr; // - ref from activateTimers
};
-class Q_CORE_EXPORT QTimerInfoList : public QList<QTimerInfo*>
+class Q_CORE_EXPORT QTimerInfoList
{
-#if ((_POSIX_MONOTONIC_CLOCK-0 <= 0) && !defined(Q_OS_MAC)) || defined(QT_BOOTSTRAPPED)
- timespec previousTime;
- clock_t previousTicks;
- int ticksPerSecond;
- int msPerTick;
-
- bool timeChanged(timespec *delta);
- void timerRepair(const timespec &);
-#endif
-
- // state variables used by activateTimers()
- QTimerInfo *firstTimerInfo;
-
public:
+ using Duration = QAbstractEventDispatcher::Duration;
+ using TimerInfo = QAbstractEventDispatcher::TimerInfoV2;
QTimerInfoList();
- timespec currentTime;
- timespec updateCurrentTime();
-
- // must call updateCurrentTime() first!
- void repairTimersIfNeeded();
+ mutable std::chrono::steady_clock::time_point currentTime;
- bool timerWait(timespec &);
+ std::optional<Duration> timerWait();
void timerInsert(QTimerInfo *);
- int timerRemainingTime(int timerId);
+ Duration remainingDuration(Qt::TimerId timerId) const;
- void registerTimer(int timerId, qint64 interval, Qt::TimerType timerType, QObject *object);
- bool unregisterTimer(int timerId);
+ void registerTimer(Qt::TimerId timerId, Duration interval,
+ Qt::TimerType timerType, QObject *object);
+ bool unregisterTimer(Qt::TimerId timerId);
bool unregisterTimers(QObject *object);
- QList<QAbstractEventDispatcher::TimerInfo> registeredTimers(QObject *object) const;
+ QList<TimerInfo> registeredTimers(QObject *object) const;
int activateTimers();
+ bool hasPendingTimers();
+
+ void clearTimers()
+ {
+ qDeleteAll(timers);
+ timers.clear();
+ }
+
+ bool isEmpty() const { return timers.empty(); }
+
+ qsizetype size() const { return timers.size(); }
+
+ auto findTimerById(Qt::TimerId timerId) const
+ {
+ auto matchesId = [timerId](const auto &t) { return t->id == timerId; };
+ return std::find_if(timers.cbegin(), timers.cend(), matchesId);
+ }
+
+private:
+ std::chrono::steady_clock::time_point updateCurrentTime() const;
+
+ // state variables used by activateTimers()
+ QTimerInfo *firstTimerInfo = nullptr;
+ QList<QTimerInfo *> timers;
};
QT_END_NAMESPACE
diff --git a/src/corelib/kernel/qtmetamacros.h b/src/corelib/kernel/qtmetamacros.h
index fb4dfc5b0d..ae68abcfee 100644
--- a/src/corelib/kernel/qtmetamacros.h
+++ b/src/corelib/kernel/qtmetamacros.h
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2019 The Qt Company Ltd.
-** Copyright (C) 2019 Olivier Goffart <ogoffart@woboq.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2019 The Qt Company Ltd.
+// Copyright (C) 2019 Olivier Goffart <ogoffart@woboq.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QTMETAMACROS_H
#define QTMETAMACROS_H
@@ -125,26 +89,27 @@ QT_BEGIN_NAMESPACE
# define QT_TR_FUNCTIONS
#endif
-#ifdef Q_CLANG_QDOC
+#ifdef Q_QDOC
#define QT_TR_FUNCTIONS
#endif
-#if defined(Q_CC_INTEL)
-// Cannot redefine the visibility of a method in an exported class
-# define Q_DECL_HIDDEN_STATIC_METACALL
-#else
-# define Q_DECL_HIDDEN_STATIC_METACALL Q_DECL_HIDDEN
-#endif
+#define Q_DECL_HIDDEN_STATIC_METACALL Q_DECL_HIDDEN
-#if defined(Q_CC_CLANG) && Q_CC_CLANG >= 306
-# define Q_OBJECT_NO_OVERRIDE_WARNING QT_WARNING_DISABLE_CLANG("-Winconsistent-missing-override")
-#elif defined(Q_CC_GNU) && !defined(Q_CC_INTEL) && Q_CC_GNU >= 501
+#if defined(Q_CC_CLANG)
+# if Q_CC_CLANG >= 1100
+# define Q_OBJECT_NO_OVERRIDE_WARNING QT_WARNING_DISABLE_CLANG("-Winconsistent-missing-override") QT_WARNING_DISABLE_CLANG("-Wsuggest-override")
+# elif Q_CC_CLANG >= 306
+# define Q_OBJECT_NO_OVERRIDE_WARNING QT_WARNING_DISABLE_CLANG("-Winconsistent-missing-override")
+# endif
+#elif defined(Q_CC_GNU) && Q_CC_GNU >= 501
# define Q_OBJECT_NO_OVERRIDE_WARNING QT_WARNING_DISABLE_GCC("-Wsuggest-override")
+#elif defined(Q_CC_MSVC)
+# define Q_OBJECT_NO_OVERRIDE_WARNING QT_WARNING_DISABLE_MSVC(26433)
#else
# define Q_OBJECT_NO_OVERRIDE_WARNING
#endif
-#if defined(Q_CC_GNU) && !defined(Q_CC_INTEL) && Q_CC_GNU >= 600
+#if defined(Q_CC_GNU) && Q_CC_GNU >= 600
# define Q_OBJECT_NO_ATTRIBUTES_WARNING QT_WARNING_DISABLE_GCC("-Wattributes")
#else
# define Q_OBJECT_NO_ATTRIBUTES_WARNING
@@ -164,7 +129,7 @@ private: \
Q_OBJECT_NO_ATTRIBUTES_WARNING \
Q_DECL_HIDDEN_STATIC_METACALL static void qt_static_metacall(QObject *, QMetaObject::Call, int, void **); \
QT_WARNING_POP \
- struct QPrivateSignal {}; \
+ struct QPrivateSignal { explicit QPrivateSignal() = default; }; \
QT_ANNOTATE_CLASS(qt_qobject, "")
/* qmake ignore Q_OBJECT */
diff --git a/src/corelib/kernel/qtmochelpers.h b/src/corelib/kernel/qtmochelpers.h
new file mode 100644
index 0000000000..9d75177645
--- /dev/null
+++ b/src/corelib/kernel/qtmochelpers.h
@@ -0,0 +1,86 @@
+// Copyright (C) 2022 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QTMOCHELPERS_H
+#define QTMOCHELPERS_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists to be used by the code that
+// moc generates. This file will not change quickly, but it over the long term,
+// it will likely change or even be removed.
+//
+// We mean it.
+//
+
+#include <QtCore/qglobal.h>
+
+#include <algorithm> // std::min
+#include <limits>
+
+#if 0
+#pragma qt_no_master_include
+#endif
+
+QT_BEGIN_NAMESPACE
+namespace QtMocHelpers {
+// The maximum Size of a string literal is 2 GB on 32-bit and 4 GB on 64-bit
+// (but the compiler is likely to give up before you get anywhere near that much)
+static constexpr size_t MaxStringSize =
+ (std::min)(size_t((std::numeric_limits<uint>::max)()),
+ size_t((std::numeric_limits<qsizetype>::max)()));
+
+template <uint... Nx> constexpr size_t stringDataSizeHelper(std::integer_sequence<uint, Nx...>)
+{
+ // same as:
+ // return (0 + ... + Nx);
+ // but not using the fold expression to avoid exceeding compiler limits
+ size_t total = 0;
+ uint sizes[] = { Nx... };
+ for (uint n : sizes)
+ total += n;
+ return total;
+}
+
+template <int Count, size_t StringSize> struct StringData
+{
+ static_assert(StringSize <= MaxStringSize, "Meta Object data is too big");
+ uint offsetsAndSizes[Count] = {};
+ char stringdata0[StringSize] = {};
+ constexpr StringData() = default;
+};
+
+template <uint... Nx> constexpr auto stringData(const char (&...strings)[Nx])
+{
+ constexpr size_t StringSize = stringDataSizeHelper<Nx...>({});
+ constexpr size_t Count = 2 * sizeof...(Nx);
+
+ StringData<Count, StringSize> result;
+ const char *inputs[] = { strings... };
+ uint sizes[] = { Nx... };
+
+ uint offset = 0;
+ char *output = result.stringdata0;
+ for (size_t i = 0; i < sizeof...(Nx); ++i) {
+ // copy the input string, including the terminating null
+ uint len = sizes[i];
+ for (uint j = 0; j < len; ++j)
+ output[offset + j] = inputs[i][j];
+ result.offsetsAndSizes[2 * i] = offset + sizeof(result.offsetsAndSizes);
+ result.offsetsAndSizes[2 * i + 1] = len - 1;
+ offset += len;
+ }
+
+ return result;
+}
+
+# define QT_MOC_HAS_STRINGDATA 1
+
+} // namespace QtMocHelpers
+QT_END_NAMESPACE
+
+QT_USE_NAMESPACE
+
+#endif // QTMOCHELPERS_H
diff --git a/src/corelib/kernel/qtranslator.cpp b/src/corelib/kernel/qtranslator.cpp
index 1d0c613c17..ec92404a15 100644
--- a/src/corelib/kernel/qtranslator.cpp
+++ b/src/corelib/kernel/qtranslator.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qplatformdefs.h"
@@ -58,7 +22,7 @@
#include "qendian.h"
#include "qresource.h"
-#if defined(Q_OS_UNIX) && !defined(Q_OS_NACL) && !defined(Q_OS_INTEGRITY)
+#if defined(Q_OS_UNIX) && !defined(Q_OS_INTEGRITY)
# define QT_USE_MMAP
# include "private/qcore_unix_p.h"
// for mmap
@@ -75,8 +39,11 @@
QT_BEGIN_NAMESPACE
+namespace {
enum Tag { Tag_End = 1, Tag_SourceText16, Tag_Translation, Tag_Context16, Tag_Obsolete1,
Tag_SourceText, Tag_Context, Tag_Comment, Tag_Obsolete2 };
+}
+
/*
$ mcookie
3cb86418caef9c95cd211cbf60a1bddd
@@ -485,8 +452,8 @@ bool QTranslator::load(const QString & filename, const QString & directory,
QString prefix;
if (QFileInfo(filename).isRelative()) {
prefix = directory;
- if (prefix.length() && !prefix.endsWith(QLatin1Char('/')))
- prefix += QLatin1Char('/');
+ if (prefix.size() && !prefix.endsWith(u'/'))
+ prefix += u'/';
}
const QString suffixOrDotQM = suffix.isNull() ? dotQmLiteral() : suffix;
@@ -508,7 +475,7 @@ bool QTranslator::load(const QString & filename, const QString & directory,
break;
int rightmost = 0;
- for (int i = 0; i < (int)delims.length(); i++) {
+ for (int i = 0; i < (int)delims.size(); i++) {
int k = fname.lastIndexOf(delims[i]);
if (k > rightmost)
rightmost = k;
@@ -530,7 +497,7 @@ bool QTranslatorPrivate::do_load(const QString &realname, const QString &directo
QTranslatorPrivate *d = this;
bool ok = false;
- if (realname.startsWith(QLatin1Char(':'))) {
+ if (realname.startsWith(u':')) {
// If the translation is in a non-compressed resource file, the data is already in
// memory, so no need to use QFile to copy it again.
Q_ASSERT(!d->resource);
@@ -645,8 +612,8 @@ static QString find_translation(const QLocale & locale,
QString path;
if (QFileInfo(filename).isRelative()) {
path = directory;
- if (!path.isEmpty() && !path.endsWith(QLatin1Char('/')))
- path += QLatin1Char('/');
+ if (!path.isEmpty() && !path.endsWith(u'/'))
+ path += u'/';
}
const QString suffixOrDotQM = suffix.isNull() ? dotQmLiteral() : suffix;
@@ -656,19 +623,22 @@ static QString find_translation(const QLocale & locale,
// see http://www.unicode.org/reports/tr35/#LanguageMatching for inspiration
- QStringList languages = locale.uiLanguages();
-#if defined(Q_OS_UNIX)
+ // For each language_country returned by locale.uiLanguages(), add
+ // also a lowercase version to the list. Since these languages are
+ // used to create file names, this is important on case-sensitive
+ // file systems, where otherwise a file called something like
+ // "prefix_en_us.qm" won't be found under the "en_US" locale. Note
+ // that the Qt resource system is always case-sensitive, even on
+ // Windows (in other words: this codepath is *not* UNIX-only).
+ QStringList languages = locale.uiLanguages(QLocale::TagSeparator::Underscore);
for (int i = languages.size()-1; i >= 0; --i) {
QString lang = languages.at(i);
QString lowerLang = lang.toLower();
if (lang != lowerLang)
languages.insert(i + 1, lowerLang);
}
-#endif
-
- for (QString localeName : qAsConst(languages)) {
- localeName.replace(QLatin1Char('-'), QLatin1Char('_'));
+ for (QString localeName : std::as_const(languages)) {
// try the complete locale name first and progressively truncate from
// the end until a matching language tag is found (with or without suffix)
for (;;) {
@@ -682,7 +652,7 @@ static QString find_translation(const QLocale & locale,
realname.truncate(realNameBaseSize);
- int rightmost = localeName.lastIndexOf(QLatin1Char('_'));
+ int rightmost = localeName.lastIndexOf(u'_');
if (rightmost <= 0)
break; // no truncations anymore, break
localeName.truncate(rightmost);
@@ -945,7 +915,7 @@ end:
if (!tn)
return QString();
QString str(tn_length / 2, Qt::Uninitialized);
- qFromBigEndian<ushort>(tn, str.length(), str.data());
+ qFromBigEndian<char16_t>(tn, str.size(), str.data());
return str;
}
diff --git a/src/corelib/kernel/qtranslator.h b/src/corelib/kernel/qtranslator.h
index 1296186134..95d99e8ca8 100644
--- a/src/corelib/kernel/qtranslator.h
+++ b/src/corelib/kernel/qtranslator.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QTRANSLATOR_H
#define QTRANSLATOR_H
diff --git a/src/corelib/kernel/qtranslator_p.h b/src/corelib/kernel/qtranslator_p.h
index e148637ac6..8b4b8b8c48 100644
--- a/src/corelib/kernel/qtranslator_p.h
+++ b/src/corelib/kernel/qtranslator_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QTRANSLATOR_P_H
#define QTRANSLATOR_P_H
diff --git a/src/corelib/kernel/qvariant.cpp b/src/corelib/kernel/qvariant.cpp
index b34da6ca18..92a44c462b 100644
--- a/src/corelib/kernel/qvariant.cpp
+++ b/src/corelib/kernel/qvariant.cpp
@@ -1,50 +1,15 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Copyright (C) 2018 Intel Corporation.
-** Copyright (C) 2015 Olivier Goffart <ogoffart@woboq.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qvariant.h"
+// Copyright (C) 2022 The Qt Company Ltd.
+// Copyright (C) 2021 Intel Corporation.
+// Copyright (C) 2015 Olivier Goffart <ogoffart@woboq.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#include "qvariant_p.h"
#include "qbitarray.h"
#include "qbytearray.h"
#include "qdatastream.h"
#include "qdebug.h"
#include "qmap.h"
+#include "qhash.h"
#include "qdatetime.h"
#if QT_CONFIG(easingcurve)
#include "qeasingcurve.h"
@@ -71,7 +36,6 @@
#include "qjsondocument.h"
#include "qbytearraylist.h"
#endif
-#include "private/qvariant_p.h"
#include "private/qlocale_p.h"
#include "qmetatype_p.h"
#include <qmetaobject.h>
@@ -83,32 +47,43 @@
#include "qline.h"
#endif
+#include <memory>
+
#include <cmath>
#include <float.h>
#include <cstring>
QT_BEGIN_NAMESPACE
+using namespace Qt::StringLiterals;
+
namespace { // anonymous used to hide QVariant handlers
-/*!
- \internal
- */
+static qlonglong qMetaTypeNumberBySize(const QVariant::Private *d)
+{
+ switch (d->typeInterface()->size) {
+ case 1:
+ return d->get<signed char>();
+ case 2:
+ return d->get<short>();
+ case 4:
+ return d->get<int>();
+ case 8:
+ return d->get<qlonglong>();
+ }
+ Q_UNREACHABLE_RETURN(0);
+}
+
static qlonglong qMetaTypeNumber(const QVariant::Private *d)
{
- switch (d->typeId()) {
+ switch (d->typeInterface()->typeId) {
case QMetaType::Int:
- return d->get<int>();
case QMetaType::LongLong:
- return d->get<qlonglong>();
case QMetaType::Char:
- return qlonglong(d->get<char>());
case QMetaType::SChar:
- return qlonglong(d->get<signed char>());
case QMetaType::Short:
- return qlonglong(d->get<short>());
case QMetaType::Long:
- return qlonglong(d->get<long>());
+ return qMetaTypeNumberBySize(d);
case QMetaType::Float:
return qRound64(d->get<float>());
case QMetaType::Double:
@@ -120,54 +95,46 @@ static qlonglong qMetaTypeNumber(const QVariant::Private *d)
return d->get<QCborValue>().toInteger();
#endif
}
- Q_ASSERT(false);
- return 0;
+ Q_UNREACHABLE_RETURN(0);
}
static qulonglong qMetaTypeUNumber(const QVariant::Private *d)
{
- switch (d->typeId()) {
- case QMetaType::UInt:
- return d->get<unsigned int>();
- case QMetaType::ULongLong:
- return d->get<qulonglong>();
- case QMetaType::UChar:
+ switch (d->typeInterface()->size) {
+ case 1:
return d->get<unsigned char>();
- case QMetaType::UShort:
+ case 2:
return d->get<unsigned short>();
- case QMetaType::ULong:
- return d->get<unsigned long>();
+ case 4:
+ return d->get<unsigned int>();
+ case 8:
+ return d->get<qulonglong>();
}
- Q_ASSERT(false);
- return 0;
+ Q_UNREACHABLE_RETURN(0);
}
-static qlonglong qConvertToNumber(const QVariant::Private *d, bool *ok, bool allowStringToBool = false)
+static std::optional<qlonglong> qConvertToNumber(const QVariant::Private *d, bool allowStringToBool = false)
{
- *ok = true;
-
- switch (uint(d->typeId())) {
+ bool ok;
+ switch (d->typeInterface()->typeId) {
case QMetaType::QString: {
const QString &s = d->get<QString>();
- qlonglong l = s.toLongLong(ok);
- if (*ok)
+ if (qlonglong l = s.toLongLong(&ok); ok)
return l;
if (allowStringToBool) {
- if (s == QLatin1String("false") || s == QLatin1String("0")) {
- *ok = true;
+ if (s == "false"_L1 || s == "0"_L1)
return 0;
- }
- if (s == QLatin1String("true") || s == QLatin1String("1")) {
- *ok = true;
+ if (s == "true"_L1 || s == "1"_L1)
return 1;
- }
}
- return 0;
+ return std::nullopt;
}
case QMetaType::QChar:
return d->get<QChar>().unicode();
case QMetaType::QByteArray:
- return d->get<QByteArray>().toLongLong(ok);
+ if (qlonglong l = d->get<QByteArray>().toLongLong(&ok); ok)
+ return l;
+ return std::nullopt;
case QMetaType::Bool:
return qlonglong(d->get<bool>());
#ifndef QT_BOOTSTRAPPED
@@ -192,47 +159,42 @@ static qlonglong qConvertToNumber(const QVariant::Private *d, bool *ok, bool all
case QMetaType::ULongLong:
case QMetaType::UInt:
case QMetaType::UChar:
+ case QMetaType::Char16:
+ case QMetaType::Char32:
case QMetaType::UShort:
case QMetaType::ULong:
-
return qlonglong(qMetaTypeUNumber(d));
}
- QMetaType typeInfo = d->type();
- if (typeInfo.flags() & QMetaType::IsEnumeration
- || d->typeId() == QMetaType::QCborSimpleType) {
- switch (typeInfo.sizeOf()) {
- case 1:
- return d->get<signed char>();
- case 2:
- return d->get<short>();
- case 4:
- return d->get<int>();
- case 8:
- return d->get<qlonglong>();
- }
- }
+ if (d->typeInterface()->flags & QMetaType::IsEnumeration
+ || d->typeInterface()->typeId == QMetaType::QCborSimpleType)
+ return qMetaTypeNumberBySize(d);
- *ok = false;
- return Q_INT64_C(0);
+ return std::nullopt;
}
-static qreal qConvertToRealNumber(const QVariant::Private *d, bool *ok)
+static std::optional<double> qConvertToRealNumber(const QVariant::Private *d)
{
- *ok = true;
- switch (uint(d->typeId())) {
+ bool ok;
+ switch (d->typeInterface()->typeId) {
case QMetaType::QString:
- return d->get<QString>().toDouble(ok);
+ if (double r = d->get<QString>().toDouble(&ok); ok)
+ return r;
+ return std::nullopt;
case QMetaType::Double:
- return qreal(d->get<double>());
+ return d->get<double>();
case QMetaType::Float:
- return qreal(d->get<float>());
+ return double(d->get<float>());
+ case QMetaType::Float16:
+ return double(d->get<qfloat16>());
case QMetaType::ULongLong:
case QMetaType::UInt:
case QMetaType::UChar:
+ case QMetaType::Char16:
+ case QMetaType::Char32:
case QMetaType::UShort:
case QMetaType::ULong:
- return qreal(qMetaTypeUNumber(d));
+ return double(qMetaTypeUNumber(d));
#ifndef QT_BOOTSTRAPPED
case QMetaType::QCborValue:
return d->get<QCborValue>().toDouble();
@@ -241,56 +203,116 @@ static qreal qConvertToRealNumber(const QVariant::Private *d, bool *ok)
#endif
default:
// includes enum conversion as well as invalid types
- return qreal(qConvertToNumber(d, ok));
+ if (std::optional<qlonglong> l = qConvertToNumber(d))
+ return double(*l);
+ return std::nullopt;
}
}
-// the type of d has already been set, but other field are not set
-static void customConstruct(QVariant::Private *d, const void *copy)
+static bool isValidMetaTypeForVariant(const QtPrivate::QMetaTypeInterface *iface, const void *copy)
{
- QtPrivate::QMetaTypeInterface *iface = d->typeInterface();
- if (!(iface && iface->size)) {
- *d = QVariant::Private();
- return;
+ using namespace QtMetaTypePrivate;
+ if (!iface || iface->size == 0)
+ return false;
+
+ Q_ASSERT(!isInterfaceFor<void>(iface)); // only void should have size 0
+ if (!isCopyConstructible(iface) || !isDestructible(iface)) {
+ // all meta types must be copyable (because QVariant is) and
+ // destructible (because QVariant owns it)
+ qWarning("QVariant: Provided metatype for '%s' does not support destruction and "
+ "copy construction", iface->name);
+ return false;
+ }
+ if (!copy && !isDefaultConstructible(iface)) {
+ // non-default-constructible types are acceptable, but not if you're
+ // asking us to construct from nothing
+ qWarning("QVariant: Cannot create type '%s' without a default constructor", iface->name);
+ return false;
}
+ return true;
+}
+
+enum CustomConstructMoveOptions {
+ UseCopy, // custom construct uses the copy ctor unconditionally
+ // future option: TryMove: uses move ctor if available, else copy ctor
+ ForceMove, // custom construct use the move ctor (which must exist)
+};
+
+enum CustomConstructNullabilityOption {
+ MaybeNull, // copy might be null, might be non-null
+ NonNull, // copy is guarantueed to be non-null
+ // future option: AlwaysNull?
+};
+
+// the type of d has already been set, but other field are not set
+template <CustomConstructMoveOptions moveOption = UseCopy, CustomConstructNullabilityOption nullability = MaybeNull>
+static void customConstruct(const QtPrivate::QMetaTypeInterface *iface, QVariant::Private *d,
+ std::conditional_t<moveOption == ForceMove, void *, const void *> copy)
+{
+ using namespace QtMetaTypePrivate;
+ Q_ASSERT(iface);
+ Q_ASSERT(iface->size);
+ Q_ASSERT(!isInterfaceFor<void>(iface));
+ Q_ASSERT(isCopyConstructible(iface));
+ Q_ASSERT(isDestructible(iface));
+ Q_ASSERT(copy || isDefaultConstructible(iface));
+ if constexpr (moveOption == ForceMove)
+ Q_ASSERT(isMoveConstructible(iface));
+ if constexpr (nullability == NonNull)
+ Q_ASSERT(copy != nullptr);
+
+ // need to check for nullptr_t here, as this can get called by fromValue(nullptr). fromValue() uses
+ // std::addressof(value) which in this case returns the address of the nullptr object.
+ // ### Qt 7: remove nullptr_t special casing
+ d->is_null = !copy QT6_ONLY(|| isInterfaceFor<std::nullptr_t>(iface));
+
if (QVariant::Private::canUseInternalSpace(iface)) {
- // QVariant requires type to be copy and default constructible
- Q_ASSERT(iface->copyCtr);
- Q_ASSERT(iface->defaultCtr);
- if (copy)
- iface->copyCtr(iface, &d->data, copy);
- else
- iface->defaultCtr(iface, &d->data);
d->is_shared = false;
- } else {
- d->data.shared = QVariant::PrivateShared::create(iface);
- if (copy)
- iface->copyCtr(iface, d->data.shared->data(), copy);
+ if (!copy && !iface->defaultCtr)
+ return; // trivial default constructor and it's OK to build in 0-filled storage, which we've already done
+ if constexpr (moveOption == ForceMove && nullability == NonNull)
+ moveConstruct(iface, d->data.data, copy);
else
- iface->defaultCtr(iface, d->data.shared->data());
+ construct(iface, d->data.data, copy);
+ } else {
+ d->data.shared = customConstructShared(iface->size, iface->alignment, [=](void *where) {
+ if constexpr (moveOption == ForceMove && nullability == NonNull)
+ moveConstruct(iface, where, copy);
+ else
+ construct(iface, where, copy);
+ });
d->is_shared = true;
}
- // need to check for nullptr_t here, as this can get called by fromValue(nullptr). fromValue() uses
- // std::addressof(value) which in this case returns the address of the nullptr object.
- d->is_null = !copy || QMetaType(iface) == QMetaType::fromType<std::nullptr_t>();
}
static void customClear(QVariant::Private *d)
{
- auto iface = reinterpret_cast<QtPrivate::QMetaTypeInterface *>(d->packedType << 2);
+ const QtPrivate::QMetaTypeInterface *iface = d->typeInterface();
if (!iface)
return;
if (!d->is_shared) {
- if (iface->dtor)
- iface->dtor(iface, &d->data);
+ QtMetaTypePrivate::destruct(iface, d->data.data);
} else {
- if (iface->dtor)
- iface->dtor(iface, d->data.shared->data());
+ QtMetaTypePrivate::destruct(iface, d->data.shared->data());
QVariant::PrivateShared::free(d->data.shared);
}
}
+static QVariant::Private clonePrivate(const QVariant::Private &other)
+{
+ QVariant::Private d = other;
+ if (d.is_shared) {
+ d.data.shared->ref.ref();
+ } else if (const QtPrivate::QMetaTypeInterface *iface = d.typeInterface()) {
+ Q_ASSERT(d.canUseInternalSpace(iface));
+
+ // if not trivially copyable, ask to copy
+ if (iface->copyCtr)
+ QtMetaTypePrivate::copyConstruct(iface, d.data.data, other.data.data);
+ }
+ return d;
+}
} // anonymous used to hide QVariant handlers
@@ -302,6 +324,7 @@ static void customClear(QVariant::Private *d)
\ingroup objectmodel
\ingroup shared
+ \compares equality
Because C++ forbids unions from including types that have
non-default constructors or destructors, most interesting Qt
@@ -399,7 +422,7 @@ static void customClear(QVariant::Private *d)
\value EasingCurve a QEasingCurve
\value Uuid a QUuid
\value ModelIndex a QModelIndex
- \value PersistentModelIndex a QPersistentModelIndex (since 5.5)
+ \value [since 5.5] PersistentModelIndex a QPersistentModelIndex
\value Font a QFont
\value Hash a QVariantHash
\value Icon a QIcon
@@ -494,24 +517,18 @@ void QVariant::create(int type, const void *copy)
*/
void QVariant::create(QMetaType type, const void *copy)
{
- d = Private(type);
- customConstruct(&d, copy);
+ *this = QVariant::fromMetaType(type, copy);
}
/*!
\fn QVariant::~QVariant()
Destroys the QVariant and the contained object.
-
- Note that subclasses that reimplement clear() should reimplement
- the destructor to call clear(). This destructor calls clear(), but
- because it is the destructor, QVariant::clear() is called rather
- than a subclass's clear().
*/
QVariant::~QVariant()
{
- if ((d.is_shared && !d.data.shared->ref.deref()) || (!d.is_shared))
+ if (!d.is_shared || !d.data.shared->ref.deref())
customClear(&d);
}
@@ -523,32 +540,121 @@ QVariant::~QVariant()
*/
QVariant::QVariant(const QVariant &p)
- : d(p.d)
+ : d(clonePrivate(p.d))
{
- if (d.is_shared) {
- d.data.shared->ref.ref();
- return;
+}
+
+/*!
+ \fn template <typename T, typename... Args, QVariant::if_constructible<T, Args...> = true> QVariant::QVariant(std::in_place_type_t<T>, Args&&... args) noexcept(is_noexcept_constructible<q20::remove_cvref_t<T>, Args...>::value)
+
+ \since 6.6
+ Constructs a new variant containing a value of type \c T. The contained
+ value is is initialized with the arguments
+ \c{std::forward<Args>(args)...}.
+
+ This overload only participates in overload resolution if \c T can be
+ constructed from \a args.
+
+ This constructor is provided for STL/std::any compatibility.
+
+ \overload
+ */
+
+/*!
+
+ \fn template <typename T, typename U, typename... Args, QVariant::if_constructible<T, std::initializer_list<U> &, Args...> = true> explicit QVariant::QVariant(std::in_place_type_t<T>, std::initializer_list<U> il, Args&&... args) noexcept(is_noexcept_constructible<q20::remove_cvref_t<T>, std::initializer_list<U> &, Args... >::value)
+
+ \since 6.6
+ \overload
+ This overload exists to support types with constructors taking an
+ \c initializer_list. It behaves otherwise equivalent to the
+ non-initializer list \c{in_place_type_t} overload.
+*/
+
+
+/*!
+ \fn template <typename T, typename... Args, QVariant::if_constructible<T, Args...> = true> QVariant::emplace(Args&&... args)
+
+ \since 6.6
+ Replaces the object currently held in \c{*this} with an object of
+ type \c{T}, constructed from \a{args}\c{...}. If \c{*this} was non-null,
+ the previously held object is destroyed first.
+ If possible, this method will reuse memory allocated by the QVariant.
+ Returns a reference to the newly-created object.
+ */
+
+/*!
+ \fn template <typename T, typename U, typename... Args, QVariant::if_constructible<T, std::initializer_list<U> &, Args...> = true> QVariant::emplace(std::initializer_list<U> list, Args&&... args)
+
+ \since 6.6
+ \overload
+ This overload exists to support types with constructors taking an
+ \c initializer_list. It behaves otherwise equivalent to the
+ non-initializer list overload.
+*/
+
+QVariant::QVariant(std::in_place_t, QMetaType type) : d(type.iface())
+{
+ // we query the metatype instead of detecting it at compile time
+ // so that we can change relocatability of internal types
+ if (!Private::canUseInternalSpace(type.iface())) {
+ d.data.shared = PrivateShared::create(type.sizeOf(), type.alignOf());
+ d.is_shared = true;
}
- QtPrivate::QMetaTypeInterface *iface = d.typeInterface();
- auto other = p.constData();
- if (iface) {
- if (other)
- iface->copyCtr(iface, &d.data, other);
- else
- iface->defaultCtr(iface, &d.data);
+}
+
+/*!
+ \internal
+ Returns a pointer to data suitable for placement new
+ of an object of type \a type
+ Changes the variant's metatype to \a type
+ */
+void *QVariant::prepareForEmplace(QMetaType type)
+{
+ /* There are two cases where we can reuse the existing storage
+ (1) The new type fits in QVariant's SBO storage
+ (2) We are using the externally allocated storage, the variant is
+ detached, and the new type fits into the existing storage.
+ In all other cases (3), we cannot reuse the storage.
+ */
+ auto typeFits = [&] {
+ auto newIface = type.iface();
+ auto oldIface = d.typeInterface();
+ auto newSize = PrivateShared::computeAllocationSize(newIface->size, newIface->alignment);
+ auto oldSize = PrivateShared::computeAllocationSize(oldIface->size, oldIface->alignment);
+ return newSize <= oldSize;
+ };
+ if (Private::canUseInternalSpace(type.iface())) { // (1)
+ clear();
+ d.packedType = quintptr(type.iface()) >> 2;
+ return d.data.data;
+ } else if (d.is_shared && isDetached() && typeFits()) { // (2)
+ QtMetaTypePrivate::destruct(d.typeInterface(), d.data.shared->data());
+ // compare QVariant::PrivateShared::create
+ const auto ps = d.data.shared;
+ const auto align = type.alignOf();
+ ps->offset = PrivateShared::computeOffset(ps, align);
+ d.packedType = quintptr(type.iface()) >> 2;
+ return ps->data();
}
+ // (3)
+ QVariant newVariant(std::in_place, type);
+ swap(newVariant);
+ // const cast is safe, we're in a non-const method
+ return const_cast<void *>(d.storage());
}
/*!
- \fn QVariant::QVariant(const QString &val)
+ \fn QVariant::QVariant(const QString &val) noexcept
Constructs a new variant with a string value, \a val.
*/
/*!
- \fn QVariant::QVariant(QLatin1String val)
+ \fn QVariant::QVariant(QLatin1StringView val)
- Constructs a new variant with a string value, \a val.
+ Constructs a new variant with a QString value from the Latin-1
+ string viewed by \a val.
*/
/*!
@@ -567,37 +673,37 @@ QVariant::QVariant(const QVariant &p)
*/
/*!
- \fn QVariant::QVariant(const QStringList &val)
+ \fn QVariant::QVariant(const QStringList &val) noexcept
Constructs a new variant with a string list value, \a val.
*/
/*!
- \fn QVariant::QVariant(const QMap<QString, QVariant> &val)
+ \fn QVariant::QVariant(const QMap<QString, QVariant> &val) noexcept
Constructs a new variant with a map of \l {QVariant}s, \a val.
*/
/*!
- \fn QVariant::QVariant(const QHash<QString, QVariant> &val)
+ \fn QVariant::QVariant(const QHash<QString, QVariant> &val) noexcept
Constructs a new variant with a hash of \l {QVariant}s, \a val.
*/
/*!
- \fn QVariant::QVariant(QDate val)
+ \fn QVariant::QVariant(QDate val) noexcept
Constructs a new variant with a date value, \a val.
*/
/*!
- \fn QVariant::QVariant(QTime val)
+ \fn QVariant::QVariant(QTime val) noexcept
Constructs a new variant with a time value, \a val.
*/
/*!
- \fn QVariant::QVariant(const QDateTime &val)
+ \fn QVariant::QVariant(const QDateTime &val) noexcept
Constructs a new variant with a date/time value, \a val.
*/
@@ -611,14 +717,14 @@ QVariant::QVariant(const QVariant &p)
/*!
\since 5.0
- \fn QVariant::QVariant(const QUuid &val)
+ \fn QVariant::QVariant(QUuid val) noexcept
Constructs a new variant with an uuid value, \a val.
*/
/*!
\since 5.0
- \fn QVariant::QVariant(const QModelIndex &val)
+ \fn QVariant::QVariant(const QModelIndex &val) noexcept
Constructs a new variant with a QModelIndex value, \a val.
*/
@@ -659,135 +765,135 @@ QVariant::QVariant(const QVariant &p)
*/
/*!
- \fn QVariant::QVariant(const QByteArray &val)
+ \fn QVariant::QVariant(const QByteArray &val) noexcept
Constructs a new variant with a bytearray value, \a val.
*/
/*!
- \fn QVariant::QVariant(const QBitArray &val)
+ \fn QVariant::QVariant(const QBitArray &val) noexcept
Constructs a new variant with a bitarray value, \a val.
*/
/*!
- \fn QVariant::QVariant(const QPoint &val)
+ \fn QVariant::QVariant(QPoint val) noexcept
Constructs a new variant with a point value of \a val.
*/
/*!
- \fn QVariant::QVariant(const QPointF &val)
+ \fn QVariant::QVariant(QPointF val) noexcept
Constructs a new variant with a point value of \a val.
*/
/*!
- \fn QVariant::QVariant(const QRectF &val)
+ \fn QVariant::QVariant(QRectF val)
Constructs a new variant with a rect value of \a val.
*/
/*!
- \fn QVariant::QVariant(const QLineF &val)
+ \fn QVariant::QVariant(QLineF val) noexcept
Constructs a new variant with a line value of \a val.
*/
/*!
- \fn QVariant::QVariant(const QLine &val)
+ \fn QVariant::QVariant(QLine val) noexcept
Constructs a new variant with a line value of \a val.
*/
/*!
- \fn QVariant::QVariant(const QRect &val)
+ \fn QVariant::QVariant(QRect val) noexcept
Constructs a new variant with a rect value of \a val.
*/
/*!
- \fn QVariant::QVariant(const QSize &val)
+ \fn QVariant::QVariant(QSize val) noexcept
Constructs a new variant with a size value of \a val.
*/
/*!
- \fn QVariant::QVariant(const QSizeF &val)
+ \fn QVariant::QVariant(QSizeF val) noexcept
Constructs a new variant with a size value of \a val.
*/
/*!
- \fn QVariant::QVariant(const QUrl &val)
+ \fn QVariant::QVariant(const QUrl &val) noexcept
Constructs a new variant with a url value of \a val.
*/
/*!
- \fn QVariant::QVariant(int val)
+ \fn QVariant::QVariant(int val) noexcept
Constructs a new variant with an integer value, \a val.
*/
/*!
- \fn QVariant::QVariant(uint val)
+ \fn QVariant::QVariant(uint val) noexcept
Constructs a new variant with an unsigned integer value, \a val.
*/
/*!
- \fn QVariant::QVariant(qlonglong val)
+ \fn QVariant::QVariant(qlonglong val) noexcept
Constructs a new variant with a long long integer value, \a val.
*/
/*!
- \fn QVariant::QVariant(qulonglong val)
+ \fn QVariant::QVariant(qulonglong val) noexcept
Constructs a new variant with an unsigned long long integer value, \a val.
*/
/*!
- \fn QVariant::QVariant(bool val)
+ \fn QVariant::QVariant(bool val) noexcept
Constructs a new variant with a boolean value, \a val.
*/
/*!
- \fn QVariant::QVariant(double val)
+ \fn QVariant::QVariant(double val) noexcept
Constructs a new variant with a floating point value, \a val.
*/
/*!
- \fn QVariant::QVariant(float val)
+ \fn QVariant::QVariant(float val) noexcept
Constructs a new variant with a floating point value, \a val.
\since 4.6
*/
/*!
- \fn QVariant::QVariant(const QList<QVariant> &val)
+ \fn QVariant::QVariant(const QList<QVariant> &val) noexcept
Constructs a new variant with a list value, \a val.
*/
/*!
- \fn QVariant::QVariant(QChar c)
+ \fn QVariant::QVariant(QChar c) noexcept
Constructs a new variant with a char value, \a c.
*/
/*!
- \fn QVariant::QVariant(const QLocale &l)
+ \fn QVariant::QVariant(const QLocale &l) noexcept
Constructs a new variant with a locale value, \a l.
*/
/*!
- \fn QVariant::QVariant(const QRegularExpression &re)
+ \fn QVariant::QVariant(const QRegularExpression &re) noexcept
\since 5.0
@@ -805,149 +911,96 @@ QVariant::QVariant(const QVariant &p)
*/
/*!
- Constructs variant of type \a type, and initializes with
- \a copy if \a copy is not \nullptr.
+ Constructs a variant of type \a type, and initializes it with
+ a copy of \c{*copy} if \a copy is not \nullptr (in which case, \a copy
+ must point to an object of type \a type).
- Note that you have to pass the address of the variable you want stored.
+ Note that you have to pass the address of the object you want stored.
Usually, you never have to use this constructor, use QVariant::fromValue()
instead to construct variants from the pointer types represented by
\c QMetaType::VoidStar, and \c QMetaType::QObjectStar.
- \sa QVariant::fromValue(), QMetaType::Type
+ If \a type does not support copy construction and \a copy is not \nullptr,
+ the variant will be invalid. Similarly, if \a copy is \nullptr and
+ \a type does not support default construction, the variant will be
+ invalid.
+
+ \sa QVariant::fromMetaType, QVariant::fromValue(), QMetaType::Type
*/
-QVariant::QVariant(QMetaType type, const void *copy) : d(type)
-{
- customConstruct(&d, copy);
-}
-
-QVariant::QVariant(int val)
- : d(QMetaType::fromType<int>())
-{ d.set(val); }
-QVariant::QVariant(uint val)
- : d(QMetaType::fromType<uint>())
-{ d.set(val); }
-QVariant::QVariant(qlonglong val)
- : d(QMetaType::fromType<qlonglong>())
-{ d.set(val); }
-QVariant::QVariant(qulonglong val)
- : d(QMetaType::fromType<qulonglong>())
-{ d.set(val); }
-QVariant::QVariant(bool val)
- : d(QMetaType::fromType<bool>())
-{ d.set(val); }
-QVariant::QVariant(double val)
- : d(QMetaType::fromType<double>())
-{ d.set(val); }
-QVariant::QVariant(float val)
- : d(QMetaType::fromType<float>())
-{ d.set(val); }
-
-QVariant::QVariant(const QByteArray &val)
- : d(QMetaType::fromType<QByteArray>())
-{ v_construct<QByteArray>(&d, val); }
-QVariant::QVariant(const QBitArray &val)
- : d(QMetaType::fromType<QBitArray>())
-{ v_construct<QBitArray>(&d, val); }
-QVariant::QVariant(const QString &val)
- : d(QMetaType::fromType<QString>())
-{ v_construct<QString>(&d, val); }
-QVariant::QVariant(QChar val)
- : d(QMetaType::fromType<QChar>())
-{ v_construct<QChar>(&d, val); }
-QVariant::QVariant(QLatin1String val)
- : d(QMetaType::fromType<QString>())
-{ v_construct<QString>(&d, val); }
-QVariant::QVariant(const QStringList &val)
- : d(QMetaType::fromType<QStringList>())
-{ v_construct<QStringList>(&d, val); }
-
-QVariant::QVariant(QDate val)
- : d(QMetaType::fromType<QDate>())
-{ v_construct<QDate>(&d, val); }
-QVariant::QVariant(QTime val)
- : d(QMetaType::fromType<QTime>())
-{ v_construct<QTime>(&d, val); }
-QVariant::QVariant(const QDateTime &val)
- : d(QMetaType::fromType<QDateTime>())
-{ v_construct<QDateTime>(&d, val); }
+QVariant::QVariant(QMetaType type, const void *copy)
+ : d()
+{
+ *this = fromMetaType(type, copy);
+}
+
+QVariant::QVariant(int val) noexcept : d(std::piecewise_construct_t{}, val) {}
+QVariant::QVariant(uint val) noexcept : d(std::piecewise_construct_t{}, val) {}
+QVariant::QVariant(qlonglong val) noexcept : d(std::piecewise_construct_t{}, val) {}
+QVariant::QVariant(qulonglong val) noexcept : d(std::piecewise_construct_t{}, val) {}
+QVariant::QVariant(bool val) noexcept : d(std::piecewise_construct_t{}, val) {}
+QVariant::QVariant(double val) noexcept : d(std::piecewise_construct_t{}, val) {}
+QVariant::QVariant(float val) noexcept : d(std::piecewise_construct_t{}, val) {}
+
+QVariant::QVariant(const QByteArray &val) noexcept : d(std::piecewise_construct_t{}, val) {}
+#ifndef QT_BOOTSTRAPPED
+QVariant::QVariant(const QBitArray &val) noexcept : d(std::piecewise_construct_t{}, val) {}
+#endif
+QVariant::QVariant(const QString &val) noexcept : d(std::piecewise_construct_t{}, val) {}
+QVariant::QVariant(QChar val) noexcept : d(std::piecewise_construct_t{}, val) {}
+QVariant::QVariant(const QStringList &val) noexcept : d(std::piecewise_construct_t{}, val) {}
+
+QVariant::QVariant(QDate val) noexcept : d(std::piecewise_construct_t{}, val) {}
+QVariant::QVariant(QTime val) noexcept : d(std::piecewise_construct_t{}, val) {}
+QVariant::QVariant(const QDateTime &val) noexcept : d(std::piecewise_construct_t{}, val) {}
+
+QVariant::QVariant(const QList<QVariant> &list) noexcept : d(std::piecewise_construct_t{}, list) {}
+QVariant::QVariant(const QMap<QString, QVariant> &map) noexcept : d(std::piecewise_construct_t{}, map) {}
+QVariant::QVariant(const QHash<QString, QVariant> &hash) noexcept : d(std::piecewise_construct_t{}, hash) {}
+
+QVariant::QVariant(QLatin1StringView val) : QVariant(QString(val)) {}
+
#if QT_CONFIG(easingcurve)
-QVariant::QVariant(const QEasingCurve &val)
- : d(QMetaType::fromType<QEasingCurve>())
-{ v_construct<QEasingCurve>(&d, val); }
+QVariant::QVariant(const QEasingCurve &val) : d(std::piecewise_construct_t{}, val) {}
#endif
-QVariant::QVariant(const QList<QVariant> &list)
- : d(QMetaType::fromType<QList<QVariant>>())
-{ v_construct<QVariantList>(&d, list); }
-QVariant::QVariant(const QMap<QString, QVariant> &map)
- : d(QMetaType::fromType<QMap<QString, QVariant>>())
-{ v_construct<QVariantMap>(&d, map); }
-QVariant::QVariant(const QHash<QString, QVariant> &hash)
- : d(QMetaType::fromType<QHash<QString, QVariant>>())
-{ v_construct<QVariantHash>(&d, hash); }
#ifndef QT_NO_GEOM_VARIANT
-QVariant::QVariant(const QPoint &pt)
- : d(QMetaType::fromType<QPoint>())
-{ v_construct<QPoint>(&d, pt); }
-QVariant::QVariant(const QPointF &pt)
- : d(QMetaType::fromType<QPointF>())
-{ v_construct<QPointF>(&d, pt); }
-QVariant::QVariant(const QRectF &r)
- : d(QMetaType::fromType<QRectF>())
-{ v_construct<QRectF>(&d, r); }
-QVariant::QVariant(const QLineF &l)
- : d(QMetaType::fromType<QLineF>())
-{ v_construct<QLineF>(&d, l); }
-QVariant::QVariant(const QLine &l)
- : d(QMetaType::fromType<QLine>())
-{ v_construct<QLine>(&d, l); }
-QVariant::QVariant(const QRect &r)
- : d(QMetaType::fromType<QRect>())
-{ v_construct<QRect>(&d, r); }
-QVariant::QVariant(const QSize &s)
- : d(QMetaType::fromType<QSize>())
-{ v_construct<QSize>(&d, s); }
-QVariant::QVariant(const QSizeF &s)
- : d(QMetaType::fromType<QSizeF>())
-{ v_construct<QSizeF>(&d, s); }
+QVariant::QVariant(QPoint pt) noexcept
+ : d(std::piecewise_construct_t{}, pt) {}
+QVariant::QVariant(QPointF pt) noexcept(Private::FitsInInternalSize<sizeof(qreal) * 2>)
+ : d(std::piecewise_construct_t{}, pt) {}
+QVariant::QVariant(QRect r) noexcept(Private::FitsInInternalSize<sizeof(int) * 4>)
+ : d(std::piecewise_construct_t{}, r) {}
+QVariant::QVariant(QRectF r) noexcept(Private::FitsInInternalSize<sizeof(qreal) * 4>)
+ : d(std::piecewise_construct_t{}, r) {}
+QVariant::QVariant(QLine l) noexcept(Private::FitsInInternalSize<sizeof(int) * 4>)
+ : d(std::piecewise_construct_t{}, l) {}
+QVariant::QVariant(QLineF l) noexcept(Private::FitsInInternalSize<sizeof(qreal) * 4>)
+ : d(std::piecewise_construct_t{}, l) {}
+QVariant::QVariant(QSize s) noexcept
+ : d(std::piecewise_construct_t{}, s) {}
+QVariant::QVariant(QSizeF s) noexcept(Private::FitsInInternalSize<sizeof(qreal) * 2>)
+ : d(std::piecewise_construct_t{}, s) {}
#endif
#ifndef QT_BOOTSTRAPPED
-QVariant::QVariant(const QUrl &u)
- : d(QMetaType::fromType<QUrl>())
-{ v_construct<QUrl>(&d, u); }
+QVariant::QVariant(const QUrl &u) noexcept : d(std::piecewise_construct_t{}, u) {}
#endif
-QVariant::QVariant(const QLocale &l)
- : d(QMetaType::fromType<QLocale>())
-{ v_construct<QLocale>(&d, l); }
+QVariant::QVariant(const QLocale &l) noexcept : d(std::piecewise_construct_t{}, l) {}
#if QT_CONFIG(regularexpression)
-QVariant::QVariant(const QRegularExpression &re)
- : d(QMetaType::fromType<QRegularExpression>())
-{ v_construct<QRegularExpression>(&d, re); }
+QVariant::QVariant(const QRegularExpression &re) noexcept : d(std::piecewise_construct_t{}, re) {}
#endif // QT_CONFIG(regularexpression)
-QVariant::QVariant(const QUuid &uuid)
- : d(QMetaType::fromType<QUuid>())
-{ v_construct<QUuid>(&d, uuid); }
+QVariant::QVariant(QUuid uuid) noexcept(Private::FitsInInternalSize<16>) : d(std::piecewise_construct_t{}, uuid) {}
#ifndef QT_BOOTSTRAPPED
-QVariant::QVariant(const QJsonValue &jsonValue)
- : d(QMetaType::fromType<QJsonValue>())
-{ v_construct<QJsonValue>(&d, jsonValue); }
-QVariant::QVariant(const QJsonObject &jsonObject)
- : d(QMetaType::fromType<QJsonObject>())
-{ v_construct<QJsonObject>(&d, jsonObject); }
-QVariant::QVariant(const QJsonArray &jsonArray)
- : d(QMetaType::fromType<QJsonArray>())
-{ v_construct<QJsonArray>(&d, jsonArray); }
-QVariant::QVariant(const QJsonDocument &jsonDocument)
- : d(QMetaType::fromType<QJsonDocument>())
-{ v_construct<QJsonDocument>(&d, jsonDocument); }
+QVariant::QVariant(const QJsonValue &jsonValue) noexcept(Private::FitsInInternalSize<sizeof(CborValueStandIn)>)
+ : d(std::piecewise_construct_t{}, jsonValue)
+{ static_assert(sizeof(CborValueStandIn) == sizeof(QJsonValue)); }
+QVariant::QVariant(const QJsonObject &jsonObject) noexcept : d(std::piecewise_construct_t{}, jsonObject) {}
+QVariant::QVariant(const QJsonArray &jsonArray) noexcept : d(std::piecewise_construct_t{}, jsonArray) {}
+QVariant::QVariant(const QJsonDocument &jsonDocument) : d(std::piecewise_construct_t{}, jsonDocument) {}
#endif // QT_BOOTSTRAPPED
#if QT_CONFIG(itemmodel)
-QVariant::QVariant(const QModelIndex &modelIndex)
- : d(QMetaType::fromType<QModelIndex>())
-{ v_construct<QModelIndex>(&d, modelIndex); }
-QVariant::QVariant(const QPersistentModelIndex &modelIndex)
- : d(QMetaType::fromType<QPersistentModelIndex>())
-{ v_construct<QPersistentModelIndex>(&d, modelIndex); }
+QVariant::QVariant(const QModelIndex &modelIndex) noexcept(Private::FitsInInternalSize<8 + 2 * sizeof(quintptr)>)
+ : d(std::piecewise_construct_t{}, modelIndex) {}
+QVariant::QVariant(const QPersistentModelIndex &modelIndex) : d(std::piecewise_construct_t{}, modelIndex) {}
#endif
/*! \fn QVariant::Type QVariant::type() const
@@ -1014,21 +1067,7 @@ QVariant &QVariant::operator=(const QVariant &variant)
return *this;
clear();
- if (variant.d.is_shared) {
- variant.d.data.shared->ref.ref();
- d = variant.d;
- } else {
- d = variant.d;
- QtPrivate::QMetaTypeInterface *iface = d.typeInterface();
- const void *other = variant.constData();
- if (iface) {
- if (other)
- iface->copyCtr(iface, &d, other);
- else
- iface->defaultCtr(iface, &d);
- }
- }
-
+ d = clonePrivate(variant.d);
return *this;
}
@@ -1051,8 +1090,10 @@ void QVariant::detach()
if (!d.is_shared || d.data.shared->ref.loadRelaxed() == 1)
return;
- Private dd(d.type());
- customConstruct(&dd, constData());
+ Q_ASSERT(isValidMetaTypeForVariant(d.typeInterface(), constData()));
+ Private dd(d.typeInterface());
+ // null variant is never shared; anything else is NonNull
+ customConstruct<UseCopy, NonNull>(d.typeInterface(), &dd, constData());
if (!d.data.shared->ref.deref())
customClear(&d);
d.data.shared = dd.data.shared;
@@ -1081,7 +1122,7 @@ const char *QVariant::typeName() const
*/
void QVariant::clear()
{
- if ((d.is_shared && !d.data.shared->ref.deref()) || (!d.is_shared))
+ if (!d.is_shared || !d.data.shared->ref.deref())
customClear(&d);
d = {};
}
@@ -1098,7 +1139,7 @@ void QVariant::clear()
/*!
\fn QVariant::Type QVariant::nameToType(const char *name)
- \deprecated [6.0] Use \c QMetaType.fromName(name).id() instead
+ \deprecated [6.0] Use \c QMetaType::fromName(name).id() instead
Converts the string representation of the storage type given in \a
name, to its enum representation.
@@ -1243,7 +1284,7 @@ void QVariant::load(QDataStream &s)
void *data = const_cast<void *>(constData());
if (!d.type().load(s, data)) {
s.setStatus(QDataStream::ReadCorruptData);
- qWarning("QVariant::load: unable to load type %d.", d.typeId());
+ qWarning("QVariant::load: unable to load type %d.", d.type().id());
}
}
@@ -1255,7 +1296,7 @@ void QVariant::load(QDataStream &s)
*/
void QVariant::save(QDataStream &s) const
{
- quint32 typeId = d.typeId();
+ quint32 typeId = d.type().id();
bool saveAsUserType = false;
if (typeId >= QMetaType::User) {
typeId = QMetaType::User;
@@ -1314,13 +1355,17 @@ void QVariant::save(QDataStream &s) const
}
}
const char *typeName = nullptr;
- if (saveAsUserType)
- typeName = d.type().name();
+ if (saveAsUserType) {
+ if (s.version() < QDataStream::Qt_6_0)
+ typeName = QtMetaTypePrivate::typedefNameForType(d.type().d_ptr);
+ if (!typeName)
+ typeName = d.type().name();
+ }
s << typeId;
if (s.version() >= QDataStream::Qt_4_2)
s << qint8(d.is_null);
if (typeName)
- s << d.type().name();
+ s << typeName;
if (!isValid()) {
if (s.version() < QDataStream::Qt_5_0)
@@ -1330,16 +1375,28 @@ void QVariant::save(QDataStream &s) const
if (!d.type().save(s, constData())) {
qWarning("QVariant::save: unable to save type '%s' (type id: %d).\n",
- d.type().name(), d.typeId());
+ d.type().name(), d.type().id());
Q_ASSERT_X(false, "QVariant::save", "Invalid type to save");
}
}
/*!
\since 4.4
+ \relates QVariant
Reads a variant \a p from the stream \a s.
+ \note If the stream contains types that aren't the built-in ones (see \l
+ QMetaType::Type), those types must be registered using qRegisterMetaType()
+ or QMetaType::registerType() before the variant can be properly loaded. If
+ an unregistered type is found, QVariant will set the corrupt flag in the
+ stream, stop processing and print a warning. For example, for QList<int>
+ it would print the following:
+
+ \quotation
+ QVariant::load: unknown user type with name QList<int>
+ \endquotation
+
\sa{Serializing Qt Data Types}{Format of the QDataStream operators}
*/
QDataStream &operator>>(QDataStream &s, QVariant &p)
@@ -1350,6 +1407,7 @@ QDataStream &operator>>(QDataStream &s, QVariant &p)
/*!
Writes a variant \a p to the stream \a s.
+ \relates QVariant
\sa{Serializing Qt Data Types}{Format of the QDataStream operators}
*/
@@ -1360,12 +1418,14 @@ QDataStream &operator<<(QDataStream &s, const QVariant &p)
}
/*! \fn QDataStream& operator>>(QDataStream &s, QVariant::Type &p)
+ \relates QVariant
\deprecated [6.0] Stream QMetaType::Type instead.
Reads a variant type \a p in enum representation from the stream \a s.
*/
/*! \fn QDataStream& operator<<(QDataStream &s, const QVariant::Type p)
+ \relates QVariant
\deprecated [6.0] Stream QMetaType::Type instead.
Writes a variant type \a p to the stream \a s.
@@ -1415,8 +1475,13 @@ QString QVariant::toString() const
}
/*!
- Returns the variant as a QMap<QString, QVariant> if the variant
- has type() \l QMetaType::QVariantMap; otherwise returns an empty map.
+ Returns the variant as a QVariantMap if the variant has type() \l
+ QMetaType::QVariantMap. If it doesn't, QVariant will attempt to
+ convert the type to a map and then return it. This will succeed for
+ any type that has registered a converter to QVariantMap or which was
+ declared as a associative container using
+ \l{Q_DECLARE_ASSOCIATIVE_CONTAINER_METATYPE}. If none of those
+ conditions are true, this function will return an empty map.
\sa canConvert(), convert()
*/
@@ -1781,6 +1846,7 @@ QChar QVariant::toChar() const
return qvariant_cast<QChar>(*this);
}
+#ifndef QT_BOOTSTRAPPED
/*!
Returns the variant as a QBitArray if the variant has userType()
\l QMetaType::QBitArray; otherwise returns an empty bit array.
@@ -1791,16 +1857,17 @@ QBitArray QVariant::toBitArray() const
{
return qvariant_cast<QBitArray>(*this);
}
+#endif // QT_BOOTSTRAPPED
template <typename T>
-inline T qNumVariantToHelper(const QVariant::Private &d, bool *ok, const T& val)
+inline T qNumVariantToHelper(const QVariant::Private &d, bool *ok)
{
QMetaType t = QMetaType::fromType<T>();
if (ok)
*ok = true;
if (d.type() == t)
- return val;
+ return d.get<T>();
T ret = 0;
bool success = QMetaType::convert(d.type(), d.storage(), t, &ret);
@@ -1828,7 +1895,7 @@ inline T qNumVariantToHelper(const QVariant::Private &d, bool *ok, const T& val)
*/
int QVariant::toInt(bool *ok) const
{
- return qNumVariantToHelper<int>(d, ok, d.get<int>());
+ return qNumVariantToHelper<int>(d, ok);
}
/*!
@@ -1850,7 +1917,7 @@ int QVariant::toInt(bool *ok) const
*/
uint QVariant::toUInt(bool *ok) const
{
- return qNumVariantToHelper<uint>(d, ok, d.get<unsigned int>());
+ return qNumVariantToHelper<uint>(d, ok);
}
/*!
@@ -1867,7 +1934,7 @@ uint QVariant::toUInt(bool *ok) const
*/
qlonglong QVariant::toLongLong(bool *ok) const
{
- return qNumVariantToHelper<qlonglong>(d, ok, d.get<qlonglong>());
+ return qNumVariantToHelper<qlonglong>(d, ok);
}
/*!
@@ -1884,7 +1951,7 @@ qlonglong QVariant::toLongLong(bool *ok) const
*/
qulonglong QVariant::toULongLong(bool *ok) const
{
- return qNumVariantToHelper<qulonglong>(d, ok, d.get<qulonglong>());
+ return qNumVariantToHelper<qulonglong>(d, ok);
}
/*!
@@ -1924,7 +1991,7 @@ bool QVariant::toBool() const
*/
double QVariant::toDouble(bool *ok) const
{
- return qNumVariantToHelper<double>(d, ok, d.get<double>());
+ return qNumVariantToHelper<double>(d, ok);
}
/*!
@@ -1943,7 +2010,7 @@ double QVariant::toDouble(bool *ok) const
*/
float QVariant::toFloat(bool *ok) const
{
- return qNumVariantToHelper<float>(d, ok, d.get<float>());
+ return qNumVariantToHelper<float>(d, ok);
}
/*!
@@ -1962,13 +2029,17 @@ float QVariant::toFloat(bool *ok) const
*/
qreal QVariant::toReal(bool *ok) const
{
- return qNumVariantToHelper<qreal>(d, ok, d.get<qreal>());
+ return qNumVariantToHelper<qreal>(d, ok);
}
/*!
- Returns the variant as a QVariantList if the variant has userType()
- \l QMetaType::QVariantList or \l QMetaType::QStringList; otherwise returns
- an empty list.
+ Returns the variant as a QVariantList if the variant has userType() \l
+ QMetaType::QVariantList. If it doesn't, QVariant will attempt to convert
+ the type to a list and then return it. This will succeed for any type that
+ has registered a converter to QVariantList or which was declared as a
+ sequential container using \l{Q_DECLARE_SEQUENTIAL_CONTAINER_METATYPE}. If
+ none of those conditions are true, this function will return an empty
+ list.
\sa canConvert(), convert()
*/
@@ -2055,7 +2126,7 @@ bool QVariant::convert(QMetaType targetType)
return false;
// Fail if the value is not initialized or was forced null by a previous failed convert.
- if (oldValue.d.is_null && oldValue.d.typeId() != QMetaType::Nullptr)
+ if (oldValue.d.is_null && oldValue.d.type().id() != QMetaType::Nullptr)
return false;
bool ok = QMetaType::convert(oldValue.d.type(), oldValue.constData(), targetType, data());
@@ -2082,9 +2153,9 @@ bool QVariant::view(int type, void *ptr)
}
/*!
- \fn bool QVariant::operator==(const QVariant &v1, const QVariant &v2)
+ \fn bool QVariant::operator==(const QVariant &lhs, const QVariant &rhs)
- Returns \c true if \a v1 and \a v2 are equal; otherwise returns \c false.
+ Returns \c true if \a lhs and \a rhs are equal; otherwise returns \c false.
QVariant uses the equality operator of the type() contained to check for
equality.
@@ -2108,9 +2179,9 @@ bool QVariant::view(int type, void *ptr)
*/
/*!
- \fn bool QVariant::operator!=(const QVariant &v1, const QVariant &v2)
+ \fn bool QVariant::operator!=(const QVariant &lhs, const QVariant &rhs)
- Returns \c false if \a v1 and \a v2 are equal; otherwise returns \c true.
+ Returns \c false if \a lhs and \a rhs are equal; otherwise returns \c true.
QVariant uses the equality operator of the type() contained to check for
equality.
@@ -2137,6 +2208,8 @@ static bool qIsNumericType(uint tp)
Q_UINT64_C(1) << QMetaType::Double |
Q_UINT64_C(1) << QMetaType::Float |
Q_UINT64_C(1) << QMetaType::Char |
+ Q_UINT64_C(1) << QMetaType::Char16 |
+ Q_UINT64_C(1) << QMetaType::Char32 |
Q_UINT64_C(1) << QMetaType::SChar |
Q_UINT64_C(1) << QMetaType::UChar |
Q_UINT64_C(1) << QMetaType::Short |
@@ -2152,33 +2225,52 @@ static bool qIsNumericType(uint tp)
static bool qIsFloatingPoint(uint tp)
{
- return tp == QMetaType::Double || tp == QMetaType::Float;
+ return tp == QMetaType::Double || tp == QMetaType::Float || tp == QMetaType::Float16;
}
-static int normalizeLowerRanks(uint tp)
+static bool canBeNumericallyCompared(const QtPrivate::QMetaTypeInterface *iface1,
+ const QtPrivate::QMetaTypeInterface *iface2)
{
- static const qulonglong numericTypeBits =
- Q_UINT64_C(1) << QMetaType::Bool |
- Q_UINT64_C(1) << QMetaType::Char |
- Q_UINT64_C(1) << QMetaType::SChar |
- Q_UINT64_C(1) << QMetaType::UChar |
- Q_UINT64_C(1) << QMetaType::Short |
- Q_UINT64_C(1) << QMetaType::UShort;
- return numericTypeBits & (Q_UINT64_C(1) << tp) ? uint(QMetaType::Int) : tp;
-}
+ if (!iface1 || !iface2)
+ return false;
-static int normalizeLong(uint tp)
-{
- const uint IntType = sizeof(long) == sizeof(int) ? QMetaType::Int : QMetaType::LongLong;
- const uint UIntType = sizeof(ulong) == sizeof(uint) ? QMetaType::UInt : QMetaType::ULongLong;
- return tp == QMetaType::Long ? IntType :
- tp == QMetaType::ULong ? UIntType : tp;
+ // We don't need QMetaType::id() here because the type Id is always stored
+ // directly for all built-in types.
+ bool isNumeric1 = qIsNumericType(iface1->typeId);
+ bool isNumeric2 = qIsNumericType(iface2->typeId);
+
+ // if they're both numeric (or QString), then they can be compared
+ if (isNumeric1 && isNumeric2)
+ return true;
+
+ bool isEnum1 = iface1->flags & QMetaType::IsEnumeration;
+ bool isEnum2 = iface2->flags & QMetaType::IsEnumeration;
+
+ // if both are enums, we can only compare if they are the same enum
+ // (the language does allow comparing two different enum types, but that's
+ // usually considered poor coding and produces a warning)
+ if (isEnum1 && isEnum2)
+ return QMetaType(iface1) == QMetaType(iface2);
+
+ // if one is an enum and the other is a numeric, we can compare too
+ if (isEnum1 && isNumeric2)
+ return true;
+ if (isNumeric1 && isEnum2)
+ return true;
+
+ // we need at least one enum and one numeric...
+ return false;
}
-static int numericTypePromotion(uint t1, uint t2)
+static int numericTypePromotion(const QtPrivate::QMetaTypeInterface *iface1,
+ const QtPrivate::QMetaTypeInterface *iface2)
{
- Q_ASSERT(qIsNumericType(t1));
- Q_ASSERT(qIsNumericType(t2));
+ Q_ASSERT(canBeNumericallyCompared(iface1, iface2));
+
+ // We don't need QMetaType::id() here because the type Id is always stored
+ // directly for the types we're comparing against below.
+ uint t1 = iface1->typeId;
+ uint t2 = iface2->typeId;
if ((t1 == QMetaType::Bool && t2 == QMetaType::QString) ||
(t2 == QMetaType::Bool && t1 == QMetaType::QString))
@@ -2202,144 +2294,86 @@ static int numericTypePromotion(uint t1, uint t2)
if (qIsFloatingPoint(t1) || qIsFloatingPoint(t2))
return QMetaType::QReal;
+ auto isUnsigned = [](uint tp) {
+ // only types for which sizeof(T) >= sizeof(int); lesser ones promote to int
+ return tp == QMetaType::ULongLong || tp == QMetaType::ULong ||
+ tp == QMetaType::UInt || tp == QMetaType::Char32;
+ };
+ bool isUnsigned1 = isUnsigned(t1);
+ bool isUnsigned2 = isUnsigned(t2);
+
// integral rules:
- // for all platforms we support, int can always hold the values of lower-ranked types
- t1 = normalizeLowerRanks(t1);
- t2 = normalizeLowerRanks(t2);
-
- // normalize long / ulong: in all platforms we run, they're either the same as int or as long long
- t1 = normalizeLong(t1);
- t2 = normalizeLong(t2);
-
- // implement the other rules
- // the four possibilities are Int, UInt, LongLong and ULongLong
- // if any of the two is ULongLong, then it wins (highest rank, unsigned)
- // otherwise, if one of the two is LongLong, then the other is either LongLong too or lower-ranked
- // otherwise, if one of the two is UInt, then the other is either UInt too or Int
- if (t1 == QMetaType::ULongLong || t2 == QMetaType::ULongLong)
+ // 1) if either type is a 64-bit unsigned, compare as 64-bit unsigned
+ if (isUnsigned1 && iface1->size > sizeof(int))
return QMetaType::ULongLong;
- if (t1 == QMetaType::LongLong || t2 == QMetaType::LongLong)
+ if (isUnsigned2 && iface2->size > sizeof(int))
+ return QMetaType::ULongLong;
+
+ // 2) if either type is 64-bit, compare as 64-bit signed
+ if (iface1->size > sizeof(int) || iface2->size > sizeof(int))
return QMetaType::LongLong;
- if (t1 == QMetaType::UInt || t2 == QMetaType::UInt)
+
+ // 3) if either type is 32-bit unsigned, compare as 32-bit unsigned
+ if (isUnsigned1 || isUnsigned2)
return QMetaType::UInt;
+
+ // 4) otherwise, just do int promotion
return QMetaType::Int;
}
-static bool integralEquals(uint promotedType, const QVariant::Private *d1, const QVariant::Private *d2)
+template <typename Numeric> static QPartialOrdering spaceShip(Numeric lhs, Numeric rhs)
{
- // use toLongLong to retrieve the data, it gets us all the bits
- bool ok;
- qlonglong l1 = qConvertToNumber(d1, &ok, promotedType == QMetaType::Bool);
- if (!ok)
- return false;
-
- qlonglong l2 = qConvertToNumber(d2, &ok, promotedType == QMetaType::Bool);
- if (!ok)
- return false;
-
- if (promotedType == QMetaType::Bool)
- return bool(l1) == bool(l2);
- if (promotedType == QMetaType::Int)
- return int(l1) == int(l2);
- if (promotedType == QMetaType::UInt)
- return uint(l1) == uint(l2);
- if (promotedType == QMetaType::LongLong)
- return l1 == l2;
- if (promotedType == QMetaType::ULongLong)
- return qulonglong(l1) == qulonglong(l2);
-
- Q_UNREACHABLE();
- return 0;
-}
+ if (lhs == rhs)
+ return QPartialOrdering::Equivalent;
+ if constexpr (std::numeric_limits<Numeric>::has_quiet_NaN) {
+ if (std::isnan(lhs) || std::isnan(rhs))
+ return QPartialOrdering::Unordered;
+ }
-namespace {
-template<typename Numeric>
-int spaceShip(Numeric lhs, Numeric rhs)
-{
bool smaller;
if constexpr (std::is_same_v<Numeric, QObject *>)
smaller = std::less<QObject *>()(lhs, rhs); // can't use less all the time because of bool
else
smaller = lhs < rhs;
- if (smaller)
- return -1;
- else if (lhs == rhs)
- return 0;
- else
- return 1;
-}
+ return smaller ? QPartialOrdering::Less : QPartialOrdering::Greater;
}
-static std::optional<int> integralCompare(uint promotedType, const QVariant::Private *d1, const QVariant::Private *d2)
+static QPartialOrdering integralCompare(uint promotedType, const QVariant::Private *d1, const QVariant::Private *d2)
{
// use toLongLong to retrieve the data, it gets us all the bits
- bool ok;
- qlonglong l1 = qConvertToNumber(d1, &ok, promotedType == QMetaType::Bool);
- if (!ok)
- return std::nullopt;
-
- qlonglong l2 = qConvertToNumber(d2, &ok, promotedType == QMetaType::Bool);
- if (!ok)
- return std::nullopt;
-
- if (promotedType == QMetaType::Bool)
- return spaceShip<bool>(l1, l2);
- if (promotedType == QMetaType::Int)
- return spaceShip<int>(l1, l2);
+ std::optional<qlonglong> l1 = qConvertToNumber(d1, promotedType == QMetaType::Bool);
+ std::optional<qlonglong> l2 = qConvertToNumber(d2, promotedType == QMetaType::Bool);
+ if (!l1 || !l2)
+ return QPartialOrdering::Unordered;
if (promotedType == QMetaType::UInt)
- return spaceShip<uint>(l1, l2);
+ return spaceShip<uint>(*l1, *l2);
if (promotedType == QMetaType::LongLong)
- return spaceShip<qlonglong>(l1, l2);
+ return spaceShip<qlonglong>(*l1, *l2);
if (promotedType == QMetaType::ULongLong)
- return spaceShip<qulonglong>(l1, l2);
+ return spaceShip<qulonglong>(*l1, *l2);
- Q_UNREACHABLE();
- return 0;
+ return spaceShip<int>(*l1, *l2);
}
-static std::optional<int> numericCompare(const QVariant::Private *d1, const QVariant::Private *d2)
+static QPartialOrdering numericCompare(const QVariant::Private *d1, const QVariant::Private *d2)
{
- uint promotedType = numericTypePromotion(d1->typeId(), d2->typeId());
+ uint promotedType = numericTypePromotion(d1->typeInterface(), d2->typeInterface());
if (promotedType != QMetaType::QReal)
return integralCompare(promotedType, d1, d2);
- // qreal comparisons
- bool ok;
- qreal r1 = qConvertToRealNumber(d1, &ok);
- if (!ok)
- return std::nullopt;
- qreal r2 = qConvertToRealNumber(d2, &ok);
- if (!ok)
- return std::nullopt;
- if (r1 == r2)
- return 0;
-
- if (std::isnan(r1) || std::isnan(r2))
- return std::nullopt;
- return spaceShip<qreal>(r1, r2);
-}
-
-static bool numericEquals(const QVariant::Private *d1, const QVariant::Private *d2)
-{
- uint promotedType = numericTypePromotion(d1->typeId(), d2->typeId());
- if (promotedType != QMetaType::QReal)
- return integralEquals(promotedType, d1, d2);
- // qreal comparisons
- bool ok;
- qreal r1 = qConvertToRealNumber(d1, &ok);
- if (!ok)
- return false;
- qreal r2 = qConvertToRealNumber(d2, &ok);
- if (!ok)
- return false;
- if (r1 == r2)
- return true;
+ // floating point comparison
+ const auto r1 = qConvertToRealNumber(d1);
+ const auto r2 = qConvertToRealNumber(d2);
+ if (!r1 || !r2)
+ return QPartialOrdering::Unordered;
+ if (*r1 == *r2)
+ return QPartialOrdering::Equivalent;
- return false;
+ return spaceShip(*r1, *r2);
}
#ifndef QT_BOOTSTRAPPED
-static bool canConvertMetaObject(QMetaType fromType, QMetaType toType)
+static bool qvCanConvertMetaObject(QMetaType fromType, QMetaType toType)
{
if ((fromType.flags() & QMetaType::PointerToQObject)
&& (toType.flags() & QMetaType::PointerToQObject)) {
@@ -2350,13 +2384,7 @@ static bool canConvertMetaObject(QMetaType fromType, QMetaType toType)
return false;
}
-static bool pointerEquals(const QVariant::Private *d1, const QVariant::Private *d2)
-{
- // simply check whether both types point to the same data
- return d1->get<QObject *>() == d2->get<QObject *>();
-}
-
-static int pointerCompare(const QVariant::Private *d1, const QVariant::Private *d2)
+static QPartialOrdering pointerCompare(const QVariant::Private *d1, const QVariant::Private *d2)
{
return spaceShip<QObject *>(d1->get<QObject *>(), d2->get<QObject *>());
}
@@ -2371,12 +2399,12 @@ bool QVariant::equals(const QVariant &v) const
if (metatype != v.metaType()) {
// try numeric comparisons, with C++ type promotion rules (no conversion)
- if (qIsNumericType(metatype.id()) && qIsNumericType(v.d.typeId()))
- return numericEquals(&d, &v.d);
+ if (canBeNumericallyCompared(metatype.iface(), v.d.type().iface()))
+ return numericCompare(&d, &v.d) == QPartialOrdering::Equivalent;
#ifndef QT_BOOTSTRAPPED
// if both types are related pointers to QObjects, check if they point to the same object
- if (canConvertMetaObject(metatype, v.metaType()))
- return pointerEquals(&d, &v.d);
+ if (qvCanConvertMetaObject(metatype, v.metaType()))
+ return pointerCompare(&d, &v.d) == QPartialOrdering::Equivalent;
#endif
return false;
}
@@ -2388,18 +2416,6 @@ bool QVariant::equals(const QVariant &v) const
return metatype.equals(d.storage(), v.d.storage());
}
-static QPartialOrdering convertOptionalToPartialOrdering(const std::optional<int> &opt)
-{
- if (!opt)
- return QPartialOrdering::Unordered;
- else if (*opt < 0)
- return QPartialOrdering::Less;
- else if (*opt == 0)
- return QPartialOrdering::Equivalent;
- else
- return QPartialOrdering::Greater;
-}
-
/*!
Compares the objects at \a lhs and \a rhs for ordering.
@@ -2427,11 +2443,11 @@ QPartialOrdering QVariant::compare(const QVariant &lhs, const QVariant &rhs)
QMetaType t = lhs.d.type();
if (t != rhs.d.type()) {
// try numeric comparisons, with C++ type promotion rules (no conversion)
- if (qIsNumericType(lhs.d.typeId()) && qIsNumericType(rhs.d.typeId()))
- return convertOptionalToPartialOrdering(numericCompare(&lhs.d, &rhs.d));
+ if (canBeNumericallyCompared(lhs.d.type().iface(), rhs.d.type().iface()))
+ return numericCompare(&lhs.d, &rhs.d);
#ifndef QT_BOOTSTRAPPED
- if (canConvertMetaObject(lhs.metaType(), rhs.metaType()))
- return convertOptionalToPartialOrdering(pointerCompare(&lhs.d, &rhs.d));
+ if (qvCanConvertMetaObject(lhs.metaType(), rhs.metaType()))
+ return pointerCompare(&lhs.d, &rhs.d);
#endif
return QPartialOrdering::Unordered;
}
@@ -2445,7 +2461,7 @@ QPartialOrdering QVariant::compare(const QVariant &lhs, const QVariant &rhs)
Returns a pointer to the contained object as a generic void* that cannot be
written to.
- \sa QMetaType
+ \sa get_if(), QMetaType
*/
/*!
@@ -2455,7 +2471,7 @@ QPartialOrdering QVariant::compare(const QVariant &lhs, const QVariant &rhs)
This function detaches the QVariant. When called on a \l{isNull}{null-QVariant},
the QVariant will not be null after the call.
- \sa QMetaType
+ \sa get_if(), QMetaType
*/
void *QVariant::data()
{
@@ -2466,6 +2482,42 @@ void *QVariant::data()
}
/*!
+ \since 6.6
+ \fn template <typename T> const T* QVariant::get_if(const QVariant *v)
+ \fn template <typename T> T* QVariant::get_if(QVariant *v)
+
+ If \a v contains an object of type \c T, returns a pointer to the contained
+ object, otherwise returns \nullptr.
+
+ The overload taking a mutable \a v detaches \a v: When called on a
+ \l{isNull()}{null} \a v with matching type \c T, \a v will not be null
+ after the call.
+
+ These functions are provided for compatibility with \c{std::variant}.
+
+ \sa data()
+*/
+
+/*!
+ \since 6.6
+ \fn template <typename T> T &QVariant::get(QVariant &v)
+ \fn template <typename T> const T &QVariant::get(const QVariant &v)
+ \fn template <typename T> T &&QVariant::get(QVariant &&v)
+ \fn template <typename T> const T &&QVariant::get(const QVariant &&v)
+
+ If \a v contains an object of type \c T, returns a reference to the contained
+ object, otherwise the call has undefined behavior.
+
+ The overloads taking a mutable \a v detach \a v: When called on a
+ \l{isNull()}{null} \a v with matching type \c T, \a v will not be null
+ after the call.
+
+ These functions are provided for compatibility with \c{std::variant}.
+
+ \sa get_if(), data()
+*/
+
+/*!
Returns \c true if this is a null variant, false otherwise.
A variant is considered null if it contains no initialized value or a null pointer.
@@ -2489,7 +2541,7 @@ bool QVariant::isNull() const
QDebug QVariant::qdebugHelper(QDebug dbg) const
{
QDebugStateSaver saver(dbg);
- const uint typeId = d.typeId();
+ const uint typeId = d.type().id();
dbg.nospace() << "QVariant(";
if (typeId != QMetaType::UnknownType) {
dbg << d.type().name() << ", ";
@@ -2503,6 +2555,22 @@ QDebug QVariant::qdebugHelper(QDebug dbg) const
return dbg;
}
+QVariant QVariant::moveConstruct(QMetaType type, void *data)
+{
+ QVariant var;
+ var.d = QVariant::Private(type.d_ptr);
+ customConstruct<ForceMove, NonNull>(type.d_ptr, &var.d, data);
+ return var;
+}
+
+QVariant QVariant::copyConstruct(QMetaType type, const void *data)
+{
+ QVariant var;
+ var.d = QVariant::Private(type.d_ptr);
+ customConstruct<UseCopy, NonNull>(type.d_ptr, &var.d, data);
+ return var;
+}
+
#if QT_DEPRECATED_SINCE(6, 0)
QT_WARNING_PUSH
QT_WARNING_DISABLE_DEPRECATED
@@ -2522,7 +2590,7 @@ QT_WARNING_POP
#endif
-/*! \fn template<typename T> void QVariant::setValue(T &&value)
+/*! \fn template<typename T, typename = std::enable_if_t<!std::is_same_v<std::decay_t<T>, QVariant>>> void QVariant::setValue(T &&value)
Stores a copy of \a value. If \c{T} is a type that QVariant
doesn't support, QMetaType is used to store the value. A compile
@@ -2535,19 +2603,19 @@ QT_WARNING_POP
\sa value(), fromValue(), canConvert()
*/
-/*! \fn template<typename T> void QVariant::setValue(const QVariant &value)
+/*! \fn void QVariant::setValue(const QVariant &value)
Copies \a value over this QVariant. It is equivalent to simply
assigning \a value to this QVariant.
*/
-/*! \fn template<typename T> void QVariant::setValue(QVariant &&value)
+/*! \fn void QVariant::setValue(QVariant &&value)
Moves \a value over this QVariant. It is equivalent to simply
move assigning \a value to this QVariant.
*/
-/*! \fn template<typename T> T QVariant::value() const
+/*! \fn template<typename T> T QVariant::value() const &
Returns the stored value converted to the template type \c{T}.
Call canConvert() to find out whether a type can be converted.
@@ -2587,7 +2655,7 @@ QT_WARNING_POP
\sa canView(), Q_DECLARE_SEQUENTIAL_CONTAINER_METATYPE()
*/
-/*! \fn bool QVariant::canConvert() const
+/*! \fn template<typename T> bool QVariant::canConvert() const
Returns \c true if the variant can be converted to the template type \c{T},
otherwise false.
@@ -2603,7 +2671,7 @@ QT_WARNING_POP
\sa convert()
*/
-/*! \fn bool QVariant::canView() const
+/*! \fn template<typename T> bool QVariant::canView() const
Returns \c true if a mutable view of the template type \c{T} can be created on this variant,
otherwise \c false.
@@ -2620,12 +2688,15 @@ QT_WARNING_POP
\snippet code/src_corelib_kernel_qvariant.cpp 7
- \note If you are working with custom types, you should use
- the Q_DECLARE_METATYPE() macro to register your custom type.
-
\sa setValue(), value()
*/
+/*! \fn template<typename T, QVariant::if_rvalue<T> = true> static QVariant QVariant::fromValue(T &&value)
+
+ \since 6.6
+ \overload
+*/
+
/*! \fn template<typename... Types> QVariant QVariant::fromStdVariant(const std::variant<Types...> &value)
\since 5.11
@@ -2640,6 +2711,47 @@ QT_WARNING_POP
*/
/*!
+ \fn template<typename... Types> QVariant QVariant::fromStdVariant(std::variant<Types...> &&value)
+ \since 6.6
+ \overload
+*/
+
+
+/*!
+ \since 6.7
+
+ Creates a variant of type \a type, and initializes it with
+ a copy of \c{*copy} if \a copy is not \nullptr (in which case, \a copy
+ must point to an object of type \a type).
+
+ Note that you have to pass the address of the object you want stored.
+
+ Usually, you never have to use this constructor, use QVariant::fromValue()
+ instead to construct variants from the pointer types represented by
+ \c QMetaType::VoidStar, and \c QMetaType::QObjectStar.
+
+ If \a type does not support copy construction and \a copy is not \nullptr,
+ the variant will be invalid. Similarly, if \a copy is \nullptr and
+ \a type does not support default construction, the variant will be
+ invalid.
+
+ Returns the QVariant created as described above.
+
+ \sa QVariant::fromValue(), QMetaType::Type
+*/
+QVariant QVariant::fromMetaType(QMetaType type, const void *copy)
+{
+ QVariant result;
+ type.registerType();
+ const auto iface = type.iface();
+ if (isValidMetaTypeForVariant(iface, copy)) {
+ result.d = Private(iface);
+ customConstruct(iface, &result.d, copy);
+ }
+ return result;
+}
+
+/*!
\fn template<typename T> T qvariant_cast(const QVariant &value)
\relates QVariant
@@ -2650,6 +2762,14 @@ QT_WARNING_POP
\sa QVariant::value()
*/
+/*!
+ \fn template<typename T> T QVariant::qvariant_cast(QVariant &&value)
+ \overload
+ \since 6.7
+
+ Returns the given \a value converted to the template type \c{T}.
+*/
+
/*! \fn template<typename T> T qVariantValue(const QVariant &value)
\relates QVariant
\deprecated
diff --git a/src/corelib/kernel/qvariant.h b/src/corelib/kernel/qvariant.h
index a61b91cb92..d567bcbb7c 100644
--- a/src/corelib/kernel/qvariant.h
+++ b/src/corelib/kernel/qvariant.h
@@ -1,99 +1,144 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QVARIANT_H
#define QVARIANT_H
#include <QtCore/qatomic.h>
-#include <QtCore/qbytearray.h>
-#include <QtCore/qlist.h>
+#include <QtCore/qcompare.h>
+#include <QtCore/qcontainerfwd.h>
#include <QtCore/qmetatype.h>
-#include <QtCore/qmap.h>
-#include <QtCore/qhash.h>
-#include <QtCore/qstring.h>
-#include <QtCore/qstringlist.h>
-#include <QtCore/qobject.h>
#ifndef QT_NO_DEBUG_STREAM
#include <QtCore/qdebug.h>
#endif
-#ifndef QT_BOOTSTRAPPED
-#include <QtCore/qbytearraylist.h>
-#endif
+
#include <memory>
-#include <type_traits>
+#include <QtCore/q20type_traits.h>
+#include <QtCore/q23utility.h>
#include <variant>
+#if !defined(QT_LEAN_HEADERS) || QT_LEAN_HEADERS < 1
+# include <QtCore/qlist.h>
+# include <QtCore/qstringlist.h>
+# include <QtCore/qbytearraylist.h>
+# include <QtCore/qhash.h>
+# include <QtCore/qmap.h>
+# include <QtCore/qobject.h>
+#endif
+
QT_BEGIN_NAMESPACE
+QT_ENABLE_P0846_SEMANTICS_FOR(get_if)
+QT_ENABLE_P0846_SEMANTICS_FOR(get)
class QBitArray;
class QDataStream;
class QDate;
class QDateTime;
-#if QT_CONFIG(easingcurve)
class QEasingCurve;
-#endif
class QLine;
class QLineF;
class QLocale;
-class QTransform;
-class QTime;
+class QModelIndex;
+class QPersistentModelIndex;
class QPoint;
class QPointF;
-class QSize;
-class QSizeF;
class QRect;
class QRectF;
-#if QT_CONFIG(regularexpression)
class QRegularExpression;
-#endif // QT_CONFIG(regularexpression)
+class QSize;
+class QSizeF;
class QTextFormat;
class QTextLength;
+class QTime;
+class QTransform;
class QUrl;
class QVariant;
template<typename T>
inline T qvariant_cast(const QVariant &);
+namespace QtPrivate {
+template<> constexpr inline bool qIsRelocatable<QVariant> = true;
+}
class Q_CORE_EXPORT QVariant
{
- public:
+ template <typename T, typename... Args>
+ using if_constructible = std::enable_if_t<
+ std::conjunction_v<
+ std::is_copy_constructible<q20::remove_cvref_t<T>>,
+ std::is_destructible<q20::remove_cvref_t<T>>,
+ std::is_constructible<q20::remove_cvref_t<T>, Args...>
+ >,
+ bool>;
+
+ template <typename T>
+ using if_rvalue = std::enable_if_t<!std::is_reference_v<T>, bool>;
+
+ struct CborValueStandIn { qint64 n; void *c; int t; };
+public:
+ struct PrivateShared
+ {
+ private:
+ inline PrivateShared() : ref(1) { }
+ public:
+ static int computeOffset(PrivateShared *ps, size_t align);
+ static size_t computeAllocationSize(size_t size, size_t align);
+ static PrivateShared *create(size_t size, size_t align);
+ static void free(PrivateShared *p);
+
+ alignas(8) QAtomicInt ref;
+ int offset;
+
+ const void *data() const { return reinterpret_cast<const uchar *>(this) + offset; }
+ void *data() { return reinterpret_cast<uchar *>(this) + offset; }
+ };
+
+ struct Private
+ {
+ static constexpr size_t MaxInternalSize = 3 * sizeof(void *);
+ template <size_t S> static constexpr bool FitsInInternalSize = S <= MaxInternalSize;
+ template<typename T> static constexpr bool CanUseInternalSpace =
+ (QTypeInfo<T>::isRelocatable && FitsInInternalSize<sizeof(T)> && alignof(T) <= alignof(double));
+ static constexpr bool canUseInternalSpace(const QtPrivate::QMetaTypeInterface *type)
+ {
+ Q_ASSERT(type);
+ return QMetaType::TypeFlags(type->flags) & QMetaType::RelocatableType &&
+ size_t(type->size) <= MaxInternalSize && size_t(type->alignment) <= alignof(double);
+ }
+
+ union
+ {
+ uchar data[MaxInternalSize] = {};
+ PrivateShared *shared;
+ double _forAlignment; // we want an 8byte alignment on 32bit systems as well
+ } data;
+ quintptr is_shared : 1;
+ quintptr is_null : 1;
+ quintptr packedType : sizeof(QMetaType) * 8 - 2;
+
+ constexpr Private() noexcept : is_shared(false), is_null(true), packedType(0) {}
+ explicit Private(const QtPrivate::QMetaTypeInterface *iface) noexcept;
+ template <typename T> explicit Private(std::piecewise_construct_t, const T &t);
+
+ const void *storage() const
+ { return is_shared ? data.shared->data() : &data.data; }
+
+ // determine internal storage at compile time
+ template<typename T> const T &get() const
+ { return *static_cast<const T *>(CanUseInternalSpace<T> ? &data.data : data.shared->data()); }
+
+ inline const QtPrivate::QMetaTypeInterface *typeInterface() const
+ {
+ return reinterpret_cast<const QtPrivate::QMetaTypeInterface *>(packedType << 2);
+ }
+
+ inline QMetaType type() const
+ {
+ return QMetaType(typeInterface());
+ }
+ };
+
#if QT_DEPRECATED_SINCE(6, 0)
enum QT_DEPRECATED_VERSION_X_6_0("Use QMetaType::Type instead.") Type
{
@@ -175,32 +220,104 @@ class Q_CORE_EXPORT QVariant
explicit QVariant(QMetaType type, const void *copy = nullptr);
QVariant(const QVariant &other);
- QVariant(int i);
- QVariant(uint ui);
- QVariant(qlonglong ll);
- QVariant(qulonglong ull);
- QVariant(bool b);
- QVariant(double d);
- QVariant(float f);
+private:
+ template <typename T, typename ...Args>
+ using is_noexcept_constructible = std::conjunction<
+ std::bool_constant<Private::CanUseInternalSpace<T>>,
+ std::is_nothrow_constructible<T, Args...>
+ >;
+
+public:
+ template <typename T, typename... Args,
+ if_constructible<T, Args...> = true>
+ explicit QVariant(std::in_place_type_t<T>, Args&&... args)
+ noexcept(is_noexcept_constructible<q20::remove_cvref_t<T>, Args...>::value)
+ : QVariant(std::in_place, QMetaType::fromType<q20::remove_cvref_t<T>>() )
+ {
+ void *data = const_cast<void *>(constData());
+ new (data) T(std::forward<Args>(args)...);
+ }
+
+ template <typename T, typename U, typename... Args,
+ if_constructible<T, std::initializer_list<U> &, Args...> = true>
+ explicit QVariant(std::in_place_type_t<T>, std::initializer_list<U> il, Args&&... args)
+ noexcept(is_noexcept_constructible<q20::remove_cvref_t<T>,
+ std::initializer_list<U> &,
+ Args...
+ >::value)
+ : QVariant(std::in_place, QMetaType::fromType<q20::remove_cvref_t<T>>())
+ {
+ char *data = static_cast<char *>(const_cast<void *>(constData()));
+ new (data) T(il, std::forward<Args>(args)...);
+ }
+
+ // primitives
+ QVariant(int i) noexcept;
+ QVariant(uint ui) noexcept;
+ QVariant(qlonglong ll) noexcept;
+ QVariant(qulonglong ull) noexcept;
+ QVariant(bool b) noexcept;
+ QVariant(double d) noexcept;
+ QVariant(float f) noexcept;
+
+ // trivial, trivially-copyable or COW
+ QVariant(QChar qchar) noexcept;
+ QVariant(QDate date) noexcept;
+ QVariant(QTime time) noexcept;
+#ifndef QT_BOOTSTRAPPED
+ QVariant(const QBitArray &bitarray) noexcept;
+#endif
+ QVariant(const QByteArray &bytearray) noexcept;
+ QVariant(const QDateTime &datetime) noexcept;
+ QVariant(const QHash<QString, QVariant> &hash) noexcept;
+ QVariant(const QJsonArray &jsonArray) noexcept;
+ QVariant(const QJsonObject &jsonObject) noexcept;
+ QVariant(const QList<QVariant> &list) noexcept;
+ QVariant(const QLocale &locale) noexcept;
+ QVariant(const QMap<QString, QVariant> &map) noexcept;
+ QVariant(const QRegularExpression &re) noexcept;
+ QVariant(const QString &string) noexcept;
+ QVariant(const QStringList &stringlist) noexcept;
+ QVariant(const QUrl &url) noexcept;
+
+ // conditionally noexcept trivial or trivially-copyable
+ // (most of these are noexcept on 64-bit)
+ QVariant(const QJsonValue &jsonValue) noexcept(Private::FitsInInternalSize<sizeof(CborValueStandIn)>);
+ QVariant(const QModelIndex &modelIndex) noexcept(Private::FitsInInternalSize<8 + 2 * sizeof(quintptr)>);
+ QVariant(QUuid uuid) noexcept(Private::FitsInInternalSize<16>);
+#ifndef QT_NO_GEOM_VARIANT
+ QVariant(QSize size) noexcept;
+ QVariant(QSizeF size) noexcept(Private::FitsInInternalSize<sizeof(qreal) * 2>);
+ QVariant(QPoint pt) noexcept;
+ QVariant(QPointF pt) noexcept(Private::FitsInInternalSize<sizeof(qreal) * 2>);
+ QVariant(QLine line) noexcept(Private::FitsInInternalSize<sizeof(int) * 4>);
+ QVariant(QLineF line) noexcept(Private::FitsInInternalSize<sizeof(qreal) * 4>);
+ QVariant(QRect rect) noexcept(Private::FitsInInternalSize<sizeof(int) * 4>);
+ QVariant(QRectF rect) noexcept(Private::FitsInInternalSize<sizeof(qreal) * 4>);
+#endif
+
+ // not noexcept
+ QVariant(const QEasingCurve &easing) noexcept(false);
+ QVariant(const QJsonDocument &jsonDocument) noexcept(false);
+ QVariant(const QPersistentModelIndex &modelIndex) noexcept(false);
+
#ifndef QT_NO_CAST_FROM_ASCII
- QT_ASCII_CAST_WARN QVariant(const char *str)
+ QT_ASCII_CAST_WARN QVariant(const char *str) noexcept(false)
: QVariant(QString::fromUtf8(str))
{}
#endif
+ QVariant(QLatin1StringView string) noexcept(false); // converts to QString
- QVariant(const QByteArray &bytearray);
- QVariant(const QBitArray &bitarray);
- QVariant(const QString &string);
- QVariant(QLatin1String string);
- QVariant(const QStringList &stringlist);
- QVariant(QChar qchar);
- QVariant(QDate date);
- QVariant(QTime time);
- QVariant(const QDateTime &datetime);
- QVariant(const QList<QVariant> &list);
- QVariant(const QMap<QString, QVariant> &map);
- QVariant(const QHash<QString, QVariant> &hash);
-#ifndef QT_NO_GEOM_VARIANT
+#if !defined(Q_CC_GHS)
+ // GHS has an ICE with this code; use the simplified version below
+ template <typename T,
+ std::enable_if_t<std::disjunction_v<std::is_pointer<T>, std::is_member_pointer<T>>, bool> = false>
+ QVariant(T) = delete;
+#else
+ QVariant(const volatile void *) = delete;
+#endif
+
+#if QT_CORE_REMOVED_SINCE(6, 5)
QVariant(const QSize &size);
QVariant(const QSizeF &size);
QVariant(const QPoint &pt);
@@ -209,25 +326,7 @@ class Q_CORE_EXPORT QVariant
QVariant(const QLineF &line);
QVariant(const QRect &rect);
QVariant(const QRectF &rect);
-#endif
- QVariant(const QLocale &locale);
-#if QT_CONFIG(regularexpression)
- QVariant(const QRegularExpression &re);
-#endif // QT_CONFIG(regularexpression)
-#if QT_CONFIG(easingcurve)
- QVariant(const QEasingCurve &easing);
-#endif
QVariant(const QUuid &uuid);
-#ifndef QT_BOOTSTRAPPED
- QVariant(const QUrl &url);
- QVariant(const QJsonValue &jsonValue);
- QVariant(const QJsonObject &jsonObject);
- QVariant(const QJsonArray &jsonArray);
- QVariant(const QJsonDocument &jsonDocument);
-#endif // QT_BOOTSTRAPPED
-#if QT_CONFIG(itemmodel)
- QVariant(const QModelIndex &modelIndex);
- QVariant(const QPersistentModelIndex &modelIndex);
#endif
QVariant& operator=(const QVariant &other);
@@ -235,7 +334,7 @@ class Q_CORE_EXPORT QVariant
{ other.d = Private(); }
QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_MOVE_AND_SWAP(QVariant)
- inline void swap(QVariant &other) noexcept { qSwap(d, other.d); }
+ inline void swap(QVariant &other) noexcept { std::swap(d, other.d); }
int userType() const { return typeId(); }
int typeId() const { return metaType().id(); }
@@ -276,7 +375,9 @@ class Q_CORE_EXPORT QVariant
float toFloat(bool *ok = nullptr) const;
qreal toReal(bool *ok = nullptr) const;
QByteArray toByteArray() const;
+#ifndef QT_BOOTSTRAPPED
QBitArray toBitArray() const;
+#endif
QString toString() const;
QStringList toStringList() const;
QChar toChar() const;
@@ -331,7 +432,7 @@ class Q_CORE_EXPORT QVariant
QT_DEPRECATED_VERSION_X_6_0("Use typeId() or metaType().")
Type type() const
{
- int type = d.typeId();
+ int type = d.type().id();
return type >= QMetaType::User ? UserType : static_cast<Type>(type);
}
QT_DEPRECATED_VERSION_6_0
@@ -351,6 +452,43 @@ class Q_CORE_EXPORT QVariant
{ return d.storage(); }
inline const void *data() const { return constData(); }
+private:
+ template <typename T>
+ void verifySuitableForEmplace()
+ {
+ static_assert(!std::is_reference_v<T>,
+ "QVariant does not support reference types");
+ static_assert(!std::is_const_v<T>,
+ "QVariant does not support const types");
+ static_assert(std::is_copy_constructible_v<T>,
+ "QVariant requires that the type is copyable");
+ static_assert(std::is_destructible_v<T>,
+ "QVariant requires that the type is destructible");
+ }
+
+ template <typename T, typename... Args>
+ T &emplaceImpl(Args&&... args)
+ {
+ verifySuitableForEmplace<T>();
+ auto data = static_cast<T *>(prepareForEmplace(QMetaType::fromType<T>()));
+ return *q20::construct_at(data, std::forward<Args>(args)...);
+ }
+
+public:
+ template <typename T, typename... Args,
+ if_constructible<T, Args...> = true>
+ T &emplace(Args&&... args)
+ {
+ return emplaceImpl<T>(std::forward<Args>(args)...);
+ }
+
+ template <typename T, typename U, typename... Args,
+ if_constructible<T, std::initializer_list<U> &, Args...> = true>
+ T &emplace(std::initializer_list<U> list, Args&&... args)
+ {
+ return emplaceImpl<T>(list, std::forward<Args>(args)...);
+ }
+
template<typename T, typename = std::enable_if_t<!std::is_same_v<std::decay_t<T>, QVariant>>>
void setValue(T &&avalue)
{
@@ -375,7 +513,7 @@ class Q_CORE_EXPORT QVariant
}
template<typename T>
- inline T value() const
+ inline T value() const &
{ return qvariant_cast<T>(*this); }
template<typename T>
@@ -387,24 +525,74 @@ class Q_CORE_EXPORT QVariant
}
template<typename T>
-#ifndef Q_CLANG_QDOC
- static inline auto fromValue(const T &value) ->
- std::enable_if_t<std::is_copy_constructible_v<T>, QVariant>
+ inline T value() &&
+ { return qvariant_cast<T>(std::move(*this)); }
+
+ template<typename T, if_rvalue<T> = true>
+#ifndef Q_QDOC
+ /* needs is_copy_constructible for variants semantics, is_move_constructible so that moveConstruct works
+ (but copy_constructible implies move_constructble, so don't bother checking)
+ */
+ static inline auto fromValue(T &&value)
+ noexcept(std::is_nothrow_copy_constructible_v<T> && Private::CanUseInternalSpace<T>)
+ -> std::enable_if_t<std::conjunction_v<std::is_copy_constructible<T>,
+ std::is_destructible<T>>, QVariant>
+#else
+ static inline QVariant fromValue(T &&value)
+#endif
+ {
+ // handle special cases
+ using Type = std::remove_cv_t<T>;
+ if constexpr (std::is_null_pointer_v<Type>)
+ return QVariant::fromMetaType(QMetaType::fromType<std::nullptr_t>());
+ else if constexpr (std::is_same_v<Type, QVariant>)
+ return std::forward<T>(value);
+ else if constexpr (std::is_same_v<Type, std::monostate>)
+ return QVariant();
+ QMetaType mt = QMetaType::fromType<Type>();
+ mt.registerType(); // we want the type stored in QVariant to always be registered
+ // T is a forwarding reference, so if T satifies the enable-ifery,
+ // we get this overload even if T is an lvalue reference and thus must check here
+ // Moreover, we only try to move if the type is actually moveable and not if T is const
+ // as in const int i; QVariant::fromValue(std::move(i));
+ if constexpr (std::conjunction_v<std::is_move_constructible<Type>, std::negation<std::is_const<T>>>)
+ return moveConstruct(QMetaType::fromType<Type>(), std::addressof(value));
+ else
+ return copyConstruct(mt, std::addressof(value));
+ }
+
+ template<typename T>
+#ifndef Q_QDOC
+ static inline auto fromValue(const T &value)
+ noexcept(std::is_nothrow_copy_constructible_v<T> && Private::CanUseInternalSpace<T>)
+ -> std::enable_if_t<std::is_copy_constructible_v<T> && std::is_destructible_v<T>, QVariant>
#else
static inline QVariant fromValue(const T &value)
#endif
{
+ if constexpr (std::is_null_pointer_v<T>)
+ return QVariant(QMetaType::fromType<std::nullptr_t>());
+ else if constexpr (std::is_same_v<T, QVariant>)
+ return value;
+ else if constexpr (std::is_same_v<T, std::monostate>)
+ return QVariant();
return QVariant(QMetaType::fromType<T>(), std::addressof(value));
}
template<typename... Types>
static inline QVariant fromStdVariant(const std::variant<Types...> &value)
{
- if (value.valueless_by_exception())
- return QVariant();
- return std::visit([](const auto &arg) { return fromValue(arg); }, value);
+ return fromStdVariantImpl(value);
+ }
+
+ template<typename... Types>
+ static QVariant fromStdVariant(std::variant<Types...> &&value)
+ {
+ return fromStdVariantImpl(std::move(value));
}
+ static QVariant fromMetaType(QMetaType type, const void *copy = nullptr);
+
template<typename T>
bool canConvert() const
{ return canConvert(QMetaType::fromType<T>()); }
@@ -413,113 +601,24 @@ class Q_CORE_EXPORT QVariant
bool canView() const
{ return canView(QMetaType::fromType<T>()); }
-public:
- struct PrivateShared
- {
- private:
- inline PrivateShared() : ref(1) { }
- public:
- static PrivateShared *create(const QtPrivate::QMetaTypeInterface *type)
- {
- Q_ASSERT(type);
- size_t size = type->size;
- size_t align = type->alignment;
-
- size += sizeof(PrivateShared);
- if (align > sizeof(PrivateShared)) {
- // The alignment is larger than the alignment we can guarantee for the pointer
- // directly following PrivateShared, so we need to allocate some additional
- // memory to be able to fit the object into the available memory with suitable
- // alignment.
- size += align - sizeof(PrivateShared);
- }
- void *data = operator new(size);
- auto *ps = new (data) QVariant::PrivateShared();
- ps->offset = int(((quintptr(ps) + sizeof(PrivateShared) + align - 1) & ~(align - 1)) - quintptr(ps));
- return ps;
- }
- static void free(PrivateShared *p)
- {
- p->~PrivateShared();
- operator delete(p);
- }
-
- alignas(8) QAtomicInt ref;
- int offset;
-
- const void *data() const
- { return reinterpret_cast<const unsigned char *>(this) + offset; }
- void *data()
- { return reinterpret_cast<unsigned char *>(this) + offset; }
- };
- struct Private
- {
- static constexpr size_t MaxInternalSize = 3*sizeof(void *);
- template<typename T>
- static constexpr bool CanUseInternalSpace = (QTypeInfo<T>::isRelocatable && sizeof(T) <= MaxInternalSize && alignof(T) <= alignof(double));
- static constexpr bool canUseInternalSpace(QtPrivate::QMetaTypeInterface *type)
- {
- Q_ASSERT(type);
- return QMetaType::TypeFlags(type->flags) & QMetaType::RelocatableType &&
- size_t(type->size) <= MaxInternalSize && size_t(type->alignment) <= alignof(double);
- }
-
- union
- {
- uchar data[MaxInternalSize] = {};
- PrivateShared *shared;
- double _forAlignment; // we want an 8byte alignment on 32bit systems as well
- } data;
- quintptr is_shared : 1;
- quintptr is_null : 1;
- quintptr packedType : sizeof(QMetaType) * 8 - 2;
-
- Private() noexcept : is_shared(false), is_null(true), packedType(0) {}
- explicit Private(QMetaType type) noexcept : is_shared(false), is_null(false)
- {
- quintptr mt = quintptr(type.d_ptr);
- Q_ASSERT((mt & 0x3) == 0);
- packedType = mt >> 2;
- }
- explicit Private(int type) noexcept : Private(QMetaType(type)) {}
-
- const void *storage() const
- { return is_shared ? data.shared->data() : &data.data; }
-
- const void *internalStorage() const
- { Q_ASSERT(is_shared); return &data.data; }
-
- // determine internal storage at compile time
- template<typename T>
- const T &get() const
- { return *static_cast<const T *>(CanUseInternalSpace<T> ? &data.data : data.shared->data()); }
- template<typename T>
- void set(const T &t)
- { *static_cast<T *>(CanUseInternalSpace<T> ? &data.data : data.shared->data()) = t; }
-
- inline QMetaType type() const
- {
- return QMetaType(reinterpret_cast<QtPrivate::QMetaTypeInterface *>(packedType << 2));
- }
-
- inline QtPrivate::QMetaTypeInterface * typeInterface() const
- {
- return reinterpret_cast<QtPrivate::QMetaTypeInterface *>(packedType << 2);
- }
-
- inline int typeId() const
- {
- return type().id();
- }
- };
- public:
static QPartialOrdering compare(const QVariant &lhs, const QVariant &rhs);
private:
- friend inline bool operator==(const QVariant &a, const QVariant &b)
+ template <typename StdVariant>
+ static QVariant fromStdVariantImpl(StdVariant &&v)
+ {
+ if (Q_UNLIKELY(v.valueless_by_exception()))
+ return QVariant();
+ auto visitor = [](auto &&arg) {
+ return QVariant::fromValue(q23::forward_like<StdVariant>(arg));
+ };
+ return std::visit(visitor, std::forward<StdVariant>(v));
+ }
+
+ friend bool comparesEqual(const QVariant &a, const QVariant &b)
{ return a.equals(b); }
- friend inline bool operator!=(const QVariant &a, const QVariant &b)
- { return !a.equals(b); }
+ Q_DECLARE_EQUALITY_COMPARABLE(QVariant)
+
#ifndef QT_NO_DEBUG_STREAM
template <typename T>
friend auto operator<<(const QDebug &debug, const T &variant) -> std::enable_if_t<std::is_same_v<T, QVariant>, QDebug> {
@@ -527,8 +626,48 @@ private:
}
QDebug qdebugHelper(QDebug) const;
#endif
+
+ template <typename T>
+ friend T *get_if(QVariant *v) noexcept
+ {
+ // data() will detach from is_null, returning non-nullptr
+ if (!v || v->d.type() != QMetaType::fromType<T>())
+ return nullptr;
+ return static_cast<T*>(v->data());
+ }
+ template <typename T>
+ friend const T *get_if(const QVariant *v) noexcept
+ {
+ // (const) data() will not detach from is_null, return nullptr
+ if (!v || v->d.is_null || v->d.type() != QMetaType::fromType<T>())
+ return nullptr;
+ return static_cast<const T*>(v->data());
+ }
+
+#define Q_MK_GET(cvref) \
+ template <typename T> \
+ friend T cvref get(QVariant cvref v) \
+ { \
+ if constexpr (std::is_const_v<T cvref>) \
+ Q_ASSERT(!v.d.is_null); \
+ Q_ASSERT(v.d.type() == QMetaType::fromType<q20::remove_cvref_t<T>>()); \
+ return static_cast<T cvref>(*get_if<T>(&v)); \
+ } \
+ /* end */
+ Q_MK_GET(&)
+ Q_MK_GET(const &)
+ Q_MK_GET(&&)
+ Q_MK_GET(const &&)
+#undef Q_MK_GET
+
+ static QVariant moveConstruct(QMetaType type, void *data);
+ static QVariant copyConstruct(QMetaType type, const void *data);
+
template<typename T>
friend inline T qvariant_cast(const QVariant &);
+ template<typename T>
+ friend inline T qvariant_cast(QVariant &&);
+
protected:
Private d;
void create(int type, const void *copy);
@@ -548,6 +687,11 @@ private:
// int variant, so delete this constructor:
QVariant(QMetaType::Type) = delete;
+ // used to setup the QVariant internals for the "real" inplace ctor
+ QVariant(std::in_place_t, QMetaType type);
+ // helper for emplace
+ void *prepareForEmplace(QMetaType type);
+
// These constructors don't create QVariants of the type associated
// with the enum, as expected, but they would create a QVariant of
// type int with the value of the enum value.
@@ -567,18 +711,6 @@ public:
inline const DataPtr &data_ptr() const { return d; }
};
-template<>
-inline QVariant QVariant::fromValue(const QVariant &value)
-{
- return value;
-}
-
-template<>
-inline QVariant QVariant::fromValue(const std::monostate &)
-{
- return QVariant();
-}
-
inline bool QVariant::isValid() const
{
return d.type().isValid();
@@ -613,7 +745,8 @@ QT_WARNING_POP
inline bool QVariant::isDetached() const
{ return !d.is_shared || d.data.shared->ref.loadRelaxed() == 1; }
-Q_DECLARE_SHARED(QVariant)
+inline void swap(QVariant &value1, QVariant &value2) noexcept
+{ value1.swap(value2); }
#ifndef QT_MOC
@@ -634,14 +767,45 @@ template<typename T> inline T qvariant_cast(const QVariant &v)
return t;
}
+template<typename T> inline T qvariant_cast(QVariant &&v)
+{
+ QMetaType targetType = QMetaType::fromType<T>();
+ if (v.d.type() == targetType) {
+ if constexpr (QVariant::Private::CanUseInternalSpace<T>) {
+ return std::move(*reinterpret_cast<T *>(v.d.data.data));
+ } else {
+ if (v.d.data.shared->ref.loadRelaxed() == 1)
+ return std::move(*reinterpret_cast<T *>(v.d.data.shared->data()));
+ else
+ return v.d.get<T>();
+ }
+ }
+ if constexpr (std::is_same_v<T, QVariant>) {
+ // if the metatype doesn't match, but we want a QVariant, just return the current variant
+ return v;
+ } if constexpr (std::is_same_v<T,std::remove_const_t<std::remove_pointer_t<T>> const *>) {
+ // moving a pointer is pointless, just do the same as the const & overload
+ using nonConstT = std::remove_const_t<std::remove_pointer_t<T>> *;
+ QMetaType nonConstTargetType = QMetaType::fromType<nonConstT>();
+ if (v.d.type() == nonConstTargetType)
+ return v.d.get<nonConstT>();
+ }
+
+ T t{};
+ QMetaType::convert(v.metaType(), v.constData(), targetType, &t);
+ return t;
+}
+
+# ifndef QT_NO_VARIANT
template<> inline QVariant qvariant_cast<QVariant>(const QVariant &v)
{
if (v.metaType().id() == QMetaType::QVariant)
return *reinterpret_cast<const QVariant *>(v.constData());
return v;
}
+# endif
-#endif
+#endif // QT_MOC
#ifndef QT_NO_DEBUG_STREAM
#if QT_DEPRECATED_SINCE(6, 0)
diff --git a/src/corelib/kernel/qvariant_p.h b/src/corelib/kernel/qvariant_p.h
index ef6042d745..d2a7390938 100644
--- a/src/corelib/kernel/qvariant_p.h
+++ b/src/corelib/kernel/qvariant_p.h
@@ -1,42 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QVARIANT_P_H
#define QVARIANT_P_H
@@ -52,22 +15,92 @@
// We mean it.
//
-#include <QtCore/qglobal.h>
-#include <QtCore/qvariant.h>
-#include <QtCore/private/qmetatype_p.h>
+#include "qvariant.h"
QT_BEGIN_NAMESPACE
-template <class T>
-inline void v_construct(QVariant::Private *x, const T &t)
+inline auto customConstructSharedImpl(size_t size, size_t align)
{
- if constexpr (QVariant::Private::CanUseInternalSpace<T>) {
- new (&x->data) T(t);
- x->is_shared = false;
+ struct Deleter {
+ void operator()(QVariant::PrivateShared *p) const
+ { QVariant::PrivateShared::free(p); }
+ };
+
+ // this is exception-safe
+ std::unique_ptr<QVariant::PrivateShared, Deleter> ptr;
+ ptr.reset(QVariant::PrivateShared::create(size, align));
+ return ptr;
+}
+
+template <typename F> static QVariant::PrivateShared *
+customConstructShared(size_t size, size_t align, F &&construct)
+{
+ auto ptr = customConstructSharedImpl(size, align);
+ construct(ptr->data());
+ return ptr.release();
+}
+
+inline int QVariant::PrivateShared::computeOffset(PrivateShared *ps, size_t align)
+{
+ return int(((quintptr(ps) + sizeof(PrivateShared) + align - 1) & ~(align - 1)) - quintptr(ps));
+}
+
+inline size_t QVariant::PrivateShared::computeAllocationSize(size_t size, size_t align)
+{
+ size += sizeof(PrivateShared);
+ if (align > sizeof(PrivateShared)) {
+ // The alignment is larger than the alignment we can guarantee for the pointer
+ // directly following PrivateShared, so we need to allocate some additional
+ // memory to be able to fit the object into the available memory with suitable
+ // alignment.
+ size += align - sizeof(PrivateShared);
+ }
+ return size;
+}
+
+inline QVariant::PrivateShared *QVariant::PrivateShared::create(size_t size, size_t align)
+{
+ size = computeAllocationSize(size, align);
+ void *data = operator new(size);
+ auto *ps = new (data) QVariant::PrivateShared();
+ ps->offset = computeOffset(ps, align);
+ return ps;
+}
+
+inline void QVariant::PrivateShared::free(PrivateShared *p)
+{
+ p->~PrivateShared();
+ operator delete(p);
+}
+
+inline QVariant::Private::Private(const QtPrivate::QMetaTypeInterface *iface) noexcept
+ : is_shared(false), is_null(false), packedType(quintptr(iface) >> 2)
+{
+ Q_ASSERT((quintptr(iface) & 0x3) == 0);
+}
+
+template <typename T> inline
+QVariant::Private::Private(std::piecewise_construct_t, const T &t)
+ : is_shared(!CanUseInternalSpace<T>), is_null(std::is_same_v<T, std::nullptr_t>)
+{
+ // confirm noexceptness
+ static constexpr bool isNothrowQVariantConstructible = noexcept(QVariant(t));
+ static constexpr bool isNothrowCopyConstructible = std::is_nothrow_copy_constructible_v<T>;
+ static constexpr bool isNothrowCopyAssignable = std::is_nothrow_copy_assignable_v<T>;
+
+ const QtPrivate::QMetaTypeInterface *iface = QtPrivate::qMetaTypeInterfaceForType<T>();
+ Q_ASSERT((quintptr(iface) & 0x3) == 0);
+ packedType = quintptr(iface) >> 2;
+
+ if constexpr (CanUseInternalSpace<T>) {
+ static_assert(isNothrowQVariantConstructible == isNothrowCopyConstructible);
+ static_assert(isNothrowQVariantConstructible == isNothrowCopyAssignable);
+ new (data.data) T(t);
} else {
- x->data.shared = QVariant::PrivateShared::create(QtPrivate::qMetaTypeInterfaceForType<T>());
- new (x->data.shared->data()) T(t);
- x->is_shared = true;
+ static_assert(!isNothrowQVariantConstructible); // we allocate memory, even if T doesn't
+ data.shared = customConstructShared(sizeof(T), alignof(T), [=](void *where) {
+ new (where) T(t);
+ });
}
}
diff --git a/src/corelib/kernel/qvarianthash.h b/src/corelib/kernel/qvarianthash.h
new file mode 100644
index 0000000000..a36efc6e9a
--- /dev/null
+++ b/src/corelib/kernel/qvarianthash.h
@@ -0,0 +1,20 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QVARIANTHASH_H
+#define QVARIANTHASH_H
+
+#if 0
+#pragma qt_class(QVariantHash)
+#endif
+
+#include <QtCore/qglobal.h>
+
+#include <QtCore/QHash>
+#include <QtCore/QVariant>
+#include <QtCore/QString>
+
+QT_BEGIN_NAMESPACE
+QT_END_NAMESPACE
+
+#endif
diff --git a/src/corelib/kernel/qvariantlist.h b/src/corelib/kernel/qvariantlist.h
new file mode 100644
index 0000000000..5a567854e8
--- /dev/null
+++ b/src/corelib/kernel/qvariantlist.h
@@ -0,0 +1,19 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QVARIANTLIST_H
+#define QVARIANTLIST_H
+
+#if 0
+#pragma qt_class(QVariantList)
+#endif
+
+#include <QtCore/qglobal.h>
+
+#include <QtCore/QList>
+#include <QtCore/QVariant>
+
+QT_BEGIN_NAMESPACE
+QT_END_NAMESPACE
+
+#endif
diff --git a/src/corelib/kernel/qvariantmap.h b/src/corelib/kernel/qvariantmap.h
new file mode 100644
index 0000000000..22cb975b5c
--- /dev/null
+++ b/src/corelib/kernel/qvariantmap.h
@@ -0,0 +1,20 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QVARIANTMAP_H
+#define QVARIANTMAP_H
+
+#if 0
+#pragma qt_class(QVariantMap)
+#endif
+
+#include <QtCore/qglobal.h>
+
+#include <QtCore/QMap>
+#include <QtCore/QVariant>
+#include <QtCore/QString>
+
+QT_BEGIN_NAMESPACE
+QT_END_NAMESPACE
+
+#endif
diff --git a/src/corelib/kernel/qwineventnotifier.cpp b/src/corelib/kernel/qwineventnotifier.cpp
index 073b8f61ab..afbf4227dc 100644
--- a/src/corelib/kernel/qwineventnotifier.cpp
+++ b/src/corelib/kernel/qwineventnotifier.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qwineventnotifier_p.h"
@@ -284,3 +248,5 @@ void QWinEventNotifierPrivate::waitCallback(PTP_CALLBACK_INSTANCE instance, PVOI
}
QT_END_NAMESPACE
+
+#include "moc_qwineventnotifier.cpp"
diff --git a/src/corelib/kernel/qwineventnotifier.h b/src/corelib/kernel/qwineventnotifier.h
index 71a1d29057..bd0ece1f5b 100644
--- a/src/corelib/kernel/qwineventnotifier.h
+++ b/src/corelib/kernel/qwineventnotifier.h
@@ -1,48 +1,12 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QWINEVENTNOTIFIER_H
#define QWINEVENTNOTIFIER_H
#include "QtCore/qobject.h"
-#if defined(Q_OS_WIN) || defined(Q_CLANG_QDOC)
+#if defined(Q_OS_WIN) || defined(Q_QDOC)
QT_BEGIN_NAMESPACE
diff --git a/src/corelib/kernel/qwineventnotifier_p.h b/src/corelib/kernel/qwineventnotifier_p.h
index 4e402ec826..3f78f55e61 100644
--- a/src/corelib/kernel/qwineventnotifier_p.h
+++ b/src/corelib/kernel/qwineventnotifier_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2017 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2017 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QWINEVENTNOTIFIER_P_H
#define QWINEVENTNOTIFIER_P_H
diff --git a/src/corelib/kernel/qwinregistry.cpp b/src/corelib/kernel/qwinregistry.cpp
index ac3b2ec370..d237316577 100644
--- a/src/corelib/kernel/qwinregistry.cpp
+++ b/src/corelib/kernel/qwinregistry.cpp
@@ -1,52 +1,14 @@
-/****************************************************************************
-**
-** Copyright (C) 2019 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2019 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qwinregistry_p.h"
-
#include <QtCore/qvarlengtharray.h>
-
-#include <algorithm>
+#include <QtCore/qendian.h>
+#include <QtCore/qlist.h>
QT_BEGIN_NAMESPACE
-QWinRegistryKey::QWinRegistryKey() :
- m_key(nullptr)
+QWinRegistryKey::QWinRegistryKey()
{
}
@@ -55,8 +17,8 @@ QWinRegistryKey::QWinRegistryKey() :
QWinRegistryKey::QWinRegistryKey(HKEY parentHandle, QStringView subKey,
REGSAM permissions, REGSAM access)
{
- if (RegOpenKeyEx(parentHandle, reinterpret_cast<const wchar_t *>(subKey.utf16()),
- 0, permissions | access, &m_key) != ERROR_SUCCESS) {
+ if (RegOpenKeyExW(parentHandle, reinterpret_cast<const wchar_t *>(subKey.utf16()),
+ 0, permissions | access, &m_key) != ERROR_SUCCESS) {
m_key = nullptr;
}
}
@@ -74,45 +36,99 @@ void QWinRegistryKey::close()
}
}
-QString QWinRegistryKey::stringValue(QStringView subKey) const
+QVariant QWinRegistryKey::value(QStringView subKey) const
{
- QString result;
+ // NOTE: Empty value name is allowed in Windows registry, it means the default
+ // or unnamed value of a key, you can read/write/delete such value normally.
+
if (!isValid())
- return result;
- DWORD type;
- DWORD size;
- auto subKeyC = reinterpret_cast<const wchar_t *>(subKey.utf16());
- if (RegQueryValueEx(m_key, subKeyC, nullptr, &type, nullptr, &size) != ERROR_SUCCESS
- || (type != REG_SZ && type != REG_EXPAND_SZ) || size <= 2) {
- return result;
+ return {};
+
+ // Use nullptr when we need to access the default value.
+ const auto subKeyC = subKey.isEmpty() ? nullptr : reinterpret_cast<const wchar_t *>(subKey.utf16());
+
+ // Get the size and type of the value.
+ DWORD dataType = REG_NONE;
+ DWORD dataSize = 0;
+ LONG ret = RegQueryValueExW(m_key, subKeyC, nullptr, &dataType, nullptr, &dataSize);
+ if (ret != ERROR_SUCCESS)
+ return {};
+
+ // Workaround for rare cases where the trailing '\0' is missing.
+ if (dataType == REG_SZ || dataType == REG_EXPAND_SZ)
+ dataSize += 2;
+ else if (dataType == REG_MULTI_SZ)
+ dataSize += 4;
+
+ // Get the value.
+ QVarLengthArray<unsigned char> data(dataSize);
+ std::fill(data.data(), data.data() + dataSize, 0u);
+
+ ret = RegQueryValueExW(m_key, subKeyC, nullptr, nullptr, data.data(), &dataSize);
+ if (ret != ERROR_SUCCESS)
+ return {};
+
+ switch (dataType) {
+ case REG_SZ:
+ case REG_EXPAND_SZ: {
+ if (dataSize > 0) {
+ return QString::fromWCharArray(
+ reinterpret_cast<const wchar_t *>(data.constData()));
+ }
+ return QString();
+ }
+
+ case REG_MULTI_SZ: {
+ if (dataSize > 0) {
+ QStringList list = {};
+ int i = 0;
+ while (true) {
+ const QString str = QString::fromWCharArray(
+ reinterpret_cast<const wchar_t *>(data.constData()) + i);
+ i += str.length() + 1;
+ if (str.isEmpty())
+ break;
+ list.append(str);
+ }
+ return list;
+ }
+ return QStringList();
+ }
+
+ case REG_NONE: // No specific type, treat as binary data.
+ case REG_BINARY: {
+ if (dataSize > 0) {
+ return QString::fromWCharArray(
+ reinterpret_cast<const wchar_t *>(data.constData()), data.size() / 2);
+ }
+ return QString();
+ }
+
+ case REG_DWORD: // Same as REG_DWORD_LITTLE_ENDIAN
+ return qFromLittleEndian<quint32>(data.constData());
+
+ case REG_DWORD_BIG_ENDIAN:
+ return qFromBigEndian<quint32>(data.constData());
+
+ case REG_QWORD: // Same as REG_QWORD_LITTLE_ENDIAN
+ return qFromLittleEndian<quint64>(data.constData());
+
+ default:
+ break;
}
- // Reserve more for rare cases where trailing '\0' are missing in registry.
- // Rely on 0-termination since strings of size 256 padded with 0 have been
- // observed (QTBUG-84455).
- size += 2;
- QVarLengthArray<unsigned char> buffer(static_cast<int>(size));
- std::fill(buffer.data(), buffer.data() + size, 0u);
- if (RegQueryValueEx(m_key, subKeyC, nullptr, &type, buffer.data(), &size) == ERROR_SUCCESS)
- result = QString::fromWCharArray(reinterpret_cast<const wchar_t *>(buffer.constData()));
- return result;
+
+ return {};
}
-QPair<DWORD, bool> QWinRegistryKey::dwordValue(QStringView subKey) const
+QString QWinRegistryKey::stringValue(QStringView subKey) const
{
- if (!isValid())
- return qMakePair(0, false);
- DWORD type;
- auto subKeyC = reinterpret_cast<const wchar_t *>(subKey.utf16());
- if (RegQueryValueEx(m_key, subKeyC, nullptr, &type, nullptr, nullptr) != ERROR_SUCCESS
- || type != REG_DWORD) {
- return qMakePair(0, false);
- }
- DWORD value = 0;
- DWORD size = sizeof(value);
- const bool ok =
- RegQueryValueEx(m_key, subKeyC, nullptr, nullptr,
- reinterpret_cast<unsigned char *>(&value), &size) == ERROR_SUCCESS;
- return qMakePair(value, ok);
+ return value<QString>(subKey).value_or(QString());
+}
+
+std::pair<DWORD, bool> QWinRegistryKey::dwordValue(QStringView subKey) const
+{
+ const std::optional<DWORD> val = value<DWORD>(subKey);
+ return {val.value_or(0), val.has_value()};
}
QT_END_NAMESPACE
diff --git a/src/corelib/kernel/qwinregistry_p.h b/src/corelib/kernel/qwinregistry_p.h
index a456292835..20b2d10dd7 100644
--- a/src/corelib/kernel/qwinregistry_p.h
+++ b/src/corelib/kernel/qwinregistry_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2019 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2019 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QWINREGISTRY_H
#define QWINREGISTRY_H
@@ -55,33 +19,49 @@
#include <QtCore/qstring.h>
#include <QtCore/qstringview.h>
#include <QtCore/qt_windows.h>
+#include <QtCore/qvariant.h>
QT_BEGIN_NAMESPACE
class Q_CORE_EXPORT QWinRegistryKey
{
-public:
Q_DISABLE_COPY(QWinRegistryKey)
+public:
QWinRegistryKey();
explicit QWinRegistryKey(HKEY parentHandle, QStringView subKey,
REGSAM permissions = KEY_READ, REGSAM access = 0);
~QWinRegistryKey();
QWinRegistryKey(QWinRegistryKey &&other) noexcept
- : m_key(qExchange(other.m_key, nullptr)) {}
+ : m_key(std::exchange(other.m_key, nullptr)) {}
QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_MOVE_AND_SWAP(QWinRegistryKey)
void swap(QWinRegistryKey &other) noexcept { qSwap(m_key, other.m_key); }
- bool isValid() const { return m_key != nullptr; }
- operator HKEY() const { return m_key; }
+ [[nodiscard]] bool isValid() const { return m_key != nullptr; }
+
+ [[nodiscard]] HKEY handle() const { return m_key; }
+
+ operator HKEY() const { return handle(); }
+
void close();
+ [[nodiscard]] QVariant value(QStringView subKey) const;
+ template<typename T>
+ [[nodiscard]] std::optional<T> value(QStringView subKey) const
+ {
+ const QVariant var = value(subKey);
+ if (var.isValid())
+ return qvariant_cast<T>(var);
+ return std::nullopt;
+ }
+
+ // ### TODO: Remove once all usages are migrated to new interface.
QString stringValue(QStringView subKey) const;
- QPair<DWORD, bool> dwordValue(QStringView subKey) const;
+ std::pair<DWORD, bool> dwordValue(QStringView subKey) const;
private:
- HKEY m_key;
+ HKEY m_key = nullptr;
};
QT_END_NAMESPACE
diff --git a/src/corelib/mimetypes/mime/generate.bat b/src/corelib/mimetypes/mime/generate.bat
deleted file mode 100644
index f63fc63693..0000000000
--- a/src/corelib/mimetypes/mime/generate.bat
+++ /dev/null
@@ -1,73 +0,0 @@
-:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
-::
-:: Copyright (C) 2019 Intel Corporation.
-:: Contact: https://www.qt.io/licensing/
-::
-:: This file is part of the tools applications of the Qt Toolkit.
-::
-:: $QT_BEGIN_LICENSE:GPL-EXCEPT$
-:: Commercial License Usage
-:: Licensees holding valid commercial Qt licenses may use this file in
-:: accordance with the commercial license agreement provided with the
-:: Software or, alternatively, in accordance with the terms contained in
-:: a written agreement between you and The Qt Company. For licensing terms
-:: and conditions see https://www.qt.io/terms-conditions. For further
-:: information use the contact form at https://www.qt.io/contact-us.
-::
-:: GNU General Public License Usage
-:: Alternatively, this file may be used under the terms of the GNU
-:: General Public License version 3 as published by the Free Software
-:: Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-:: included in the packaging of this file. Please review the following
-:: information to ensure the GNU General Public License requirements will
-:: be met: https://www.gnu.org/licenses/gpl-3.0.html.
-::
-:: $QT_END_LICENSE$
-::
-:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
-
-@echo off
-setlocal ENABLEDELAYEDEXPANSION ENABLEEXTENSIONS
-set me=%~dp0
-
-:: Check if certain tools are in PATH
-for %%C in (gzip.exe zstd.exe perl.exe) do set %%C=%%~$PATH:C
-
-:: If perl is in PATH, just let it do everything
-if not "%perl.exe%" == "" goto PuntToPerl
-
-set COMPRESS=
-set MACRO=MIME_DATABASE_IS_UNCOMPRESSED
-if not "%gzip.exe%" == "" (
- set COMPRESS=gzip -9
- set MACRO=MIME_DATABASE_IS_GZIP
-)
-
-:: Check if zstd support was enabled
-if /i "%~1" == "--zstd" (
- shift
- if not "%zstd.exe%" == "" (
- set COMPRESS=zstd -19
- set MACRO=MIME_DATABASE_IS_ZSTD
- )
-)
-
-if not "%COMPRESS%" == "" goto CompressedCommon
-
-:: No Compression and no Perl
-:: Just hex-dump with Powershell
-powershell -ExecutionPolicy Bypass %me%hexdump.ps1 %1 %1
-exit /b %errorlevel%
-
-:CompressedCommon
-:: Compress to a temporary file, then hex-dump using Powershell
-echo #define %MACRO%
-set tempfile=generate%RANDOM%.tmp
-%COMPRESS% < %1 > %tempfile%
-powershell -ExecutionPolicy Bypass %me%hexdump.ps1 %tempfile% %1
-del %tempfile%
-exit /b %errorlevel%
-
-:PuntToPerl
-perl %me%generate.pl %*
-exit /b %errorlevel%
diff --git a/src/corelib/mimetypes/mime/generate.pl b/src/corelib/mimetypes/mime/generate.pl
deleted file mode 100644
index c2f96c3dd6..0000000000
--- a/src/corelib/mimetypes/mime/generate.pl
+++ /dev/null
@@ -1,118 +0,0 @@
-#!/usr/bin/perl
-#############################################################################
-##
-## Copyright (C) 2019 Intel Corporation.
-## Contact: https://www.qt.io/licensing/
-##
-## This file is the build configuration utility of the Qt Toolkit.
-##
-## $QT_BEGIN_LICENSE:GPL-EXCEPT$
-## Commercial License Usage
-## Licensees holding valid commercial Qt licenses may use this file in
-## accordance with the commercial license agreement provided with the
-## Software or, alternatively, in accordance with the terms contained in
-## a written agreement between you and The Qt Company. For licensing terms
-## and conditions see https://www.qt.io/terms-conditions. For further
-## information use the contact form at https://www.qt.io/contact-us.
-##
-## GNU General Public License Usage
-## Alternatively, this file may be used under the terms of the GNU
-## General Public License version 3 as published by the Free Software
-## Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-## included in the packaging of this file. Please review the following
-## information to ensure the GNU General Public License requirements will
-## be met: https://www.gnu.org/licenses/gpl-3.0.html.
-##
-## $QT_END_LICENSE$
-##
-#############################################################################
-use strict;
-use warnings;
-use Config;
-local $/; # Enable "slurp" mode
-
-sub checkCommand($) {
- use File::Spec::Functions;
- my $cmd = $_[0] . $Config{_exe};
- for my $path (path()) {
- return 1 if -x catfile($path, $cmd);
- }
- return 0;
-}
-
-my $data;
-my $compress;
-my $macro;
-my $zlib = eval 'use Compress::Zlib; use IO::Compress::Gzip; return 1;';
-my $fname = shift @ARGV;
-
-if ($zlib) {
- # Prefer internal zlib support (useful on Windows where gzip.exe isn't
- # always presnet)
- $macro = "MIME_DATABASE_IS_GZIP";
-} elsif (checkCommand("gzip")) {
- # No builtin support for compression (old Perl?)
- $compress = "gzip -c9";
- $macro = "MIME_DATABASE_IS_GZIP";
-}
-
-# Check if Qt is being built with zstd support
-if ($fname eq "--zstd") {
- $fname = shift @ARGV;
- if (checkCommand("zstd")) {
- $compress = "zstd -cq19 -T1";
- $macro = "MIME_DATABASE_IS_ZSTD";
- }
-}
-
-# Check if xml (from xmlstarlet) is in $PATH
-my $cmd;
-if (checkCommand("xmlstarlet")) {
- # Minify the data before compressing
- $cmd = "xmlstarlet sel -D -B -t -c / $fname";
- $cmd .= "| $compress" if $compress;
-} elsif (checkCommand("xml")) {
- # Minify the data before compressing
- $cmd = "xml sel -D -B -t -c / $fname";
- $cmd .= "| $compress" if $compress;
-} elsif ($compress) {
- $cmd = "$compress < $fname"
-}
-if ($cmd) {
- # Run the command and read everything
- open CMD, "$cmd |";
- binmode CMD;
- $data = <CMD>;
- close CMD;
- die("Failed to run $cmd") if ($? >> 8);
-} else {
- # No command, just read the file
- open F, "<$fname";
- $data = <F>;
- close F;
-}
-
-# Do we need to compress with zlib?
-if (!$compress && $zlib) {
- $data = eval q{
- use Compress::Zlib;
- use IO::Compress::Gzip qw(gzip);
- my $compressed;
- gzip \$data => \$compressed,
- Minimal => 1,
- Level => Z_BEST_COMPRESSION;
- return $compressed;
- };
-}
-
-# Now print as hex
-printf "#define %s\n", $macro if $macro;
-printf "static const unsigned char mimetype_database[] = {";
-my $i = 0;
-map {
- printf "\n " if $i++ % 12 == 0;
- printf "0x%02x, ", ord $_
-} split //, $data;
-printf "\n};\n";
-printf "static constexpr size_t MimeTypeDatabaseOriginalSize = %d;\n",
- (stat $fname)[7];
diff --git a/src/corelib/mimetypes/mime/hexdump.ps1 b/src/corelib/mimetypes/mime/hexdump.ps1
index 25ce8138fa..26fb9dd6e6 100644
--- a/src/corelib/mimetypes/mime/hexdump.ps1
+++ b/src/corelib/mimetypes/mime/hexdump.ps1
@@ -1,30 +1,5 @@
-#############################################################################
-##
-## Copyright (C) 2019 Intel Corporation.
-## Contact: https://www.qt.io/licensing/
-##
-## This file is the build configuration utility of the Qt Toolkit.
-##
-## $QT_BEGIN_LICENSE:GPL-EXCEPT$
-## Commercial License Usage
-## Licensees holding valid commercial Qt licenses may use this file in
-## accordance with the commercial license agreement provided with the
-## Software or, alternatively, in accordance with the terms contained in
-## a written agreement between you and The Qt Company. For licensing terms
-## and conditions see https://www.qt.io/terms-conditions. For further
-## information use the contact form at https://www.qt.io/contact-us.
-##
-## GNU General Public License Usage
-## Alternatively, this file may be used under the terms of the GNU
-## General Public License version 3 as published by the Free Software
-## Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-## included in the packaging of this file. Please review the following
-## information to ensure the GNU General Public License requirements will
-## be met: https://www.gnu.org/licenses/gpl-3.0.html.
-##
-## $QT_END_LICENSE$
-##
-#############################################################################
+# Copyright (C) 2019 Intel Corporation.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
param([String]$path, [String]$orig)
diff --git a/src/corelib/mimetypes/mime/packages/freedesktop.org.xml b/src/corelib/mimetypes/mime/packages/freedesktop.org.xml
index e73929c9bb..b7aa6a1995 100644
--- a/src/corelib/mimetypes/mime/packages/freedesktop.org.xml
+++ b/src/corelib/mimetypes/mime/packages/freedesktop.org.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mime-info [
<!ELEMENT mime-info (mime-type)+>
<!ATTLIST mime-info xmlns CDATA #FIXED "http://www.freedesktop.org/standards/shared-mime-info">
@@ -12,7 +12,7 @@
<!ATTLIST icon name CDATA #REQUIRED>
<!-- a generic icon name as per the Icon Naming Specification, only required if computing
it from the mime-type would not work, See "generic-icon" in the Shared Mime Specification --><!ELEMENT generic-icon EMPTY>
-<!ATTLIST generic-icon name (application-x-executable | audio-x-generic | folder | font-x-generic | image-x-generic | package-x-generic | text-html | text-x-generic | text-x-generic-template | text-x-script | video-x-generic | x-office-address-book | x-office-calendar | x-office-document | x-office-presentation | x-office-spreadsheet) #REQUIRED>
+<!ATTLIST generic-icon name (application-x-executable | audio-x-generic | emblem-symbolic-link | folder | font-x-generic | image-x-generic | media-floppy | media-optical | package-x-generic | text-html | text-x-generic | text-x-generic-template | text-x-script | video-x-generic | x-office-address-book | x-office-calendar | x-office-document | x-office-presentation | x-office-spreadsheet) #REQUIRED>
<!ELEMENT glob EMPTY>
<!ATTLIST glob pattern CDATA #REQUIRED>
<!ATTLIST glob weight CDATA "50">
@@ -43,12 +43,12 @@
]>
<!--
The freedesktop.org shared MIME database (this file) was created by merging
-several existing MIME databases (all released under the GPL).
+several existing MIME databases (all released under the GNU GPL).
It comes with ABSOLUTELY NO WARRANTY, to the extent permitted by law. You may
-redistribute copies of update-mime-database under the terms of the GNU General
-Public License. For more information about these matters, see the file named
-COPYING.
+redistribute copies of freedesktop.org.xml under the terms of the GNU General
+Public License version 2 or later. For more information about these matters,
+see the file named COPYING.
The latest version is available from:
@@ -61,61 +61,85 @@ command to generate the output files.
<mime-info xmlns="http://www.freedesktop.org/standards/shared-mime-info">
<mime-type type="application/x-atari-2600-rom">
<comment>Atari 2600 ROM</comment>
- <comment xml:lang="bg">ROM — Atari 2600</comment>
- <comment xml:lang="ca">ROM d'Atari 2600</comment>
- <comment xml:lang="da">Atari 2600-ROM</comment>
- <comment xml:lang="de">Atari 2600 ROM</comment>
- <comment xml:lang="en-GB">Atari 2600 ROM</comment>
- <comment xml:lang="es">ROM de Atari 2600</comment>
- <comment xml:lang="eu">Atari 2600 ROMa</comment>
- <comment xml:lang="fi">Atari 2600 ROM</comment>
- <comment xml:lang="fr">ROM Atari 2600</comment>
- <comment xml:lang="fur">ROM Atari 2600</comment>
- <comment xml:lang="hr">Atari 2600 ROM</comment>
- <comment xml:lang="hu">Atari 2600 ROM</comment>
- <comment xml:lang="id">Atari 2600 ROM</comment>
- <comment xml:lang="it">ROM Atari 2600</comment>
- <comment xml:lang="kk">Atari 2600 ROM</comment>
- <comment xml:lang="ko">아타리 2600 롬</comment>
- <comment xml:lang="pl">Plik ROM konsoli Atari 2600</comment>
- <comment xml:lang="pt">ROM Atari 2600</comment>
- <comment xml:lang="pt-BR">ROM do Atari 2600</comment>
- <comment xml:lang="sl">Atari 2600 ROM</comment>
- <comment xml:lang="sv">Atari 2600-rom</comment>
- <comment xml:lang="tr">Atari 2600 ROM</comment>
+ <comment xml:lang="zh_TW">雅達利 2600 ROM</comment>
+ <comment xml:lang="zh_CN">雅达利 2600 ROM</comment>
<comment xml:lang="uk">Atari 2600 ROM</comment>
- <comment xml:lang="zh-CN">雅达利 2600 ROM</comment>
- <comment xml:lang="zh-TW">雅達利 2600 ROM</comment>
+ <comment xml:lang="tr">Atari 2600 ROM</comment>
+ <comment xml:lang="sv">Atari 2600-rom</comment>
+ <comment xml:lang="sr">Атари 2600 РОМ</comment>
+ <comment xml:lang="sq">ROM Atari 2600</comment>
+ <comment xml:lang="sl">Atari 2600 ROM</comment>
+ <comment xml:lang="si">Atari 2600 ROM</comment>
+ <comment xml:lang="ru">Atari 2600 ROM</comment>
+ <comment xml:lang="pt_BR">ROM do Atari 2600</comment>
+ <comment xml:lang="pt">ROM Atari 2600</comment>
+ <comment xml:lang="pl">Plik ROM konsoli Atari 2600</comment>
+ <comment xml:lang="nl">Atari 2600-ROM</comment>
+ <comment xml:lang="ko">아타리 2600 롬</comment>
+ <comment xml:lang="kk">Atari 2600 ROM</comment>
+ <comment xml:lang="ka">Atari 2600 ROM</comment>
+ <comment xml:lang="ja">Atari 2600 ROM</comment>
+ <comment xml:lang="it">ROM Atari 2600</comment>
+ <comment xml:lang="is">Atari 2600 ROM</comment>
+ <comment xml:lang="id">Atari 2600 ROM</comment>
+ <comment xml:lang="hu">Atari 2600 ROM</comment>
+ <comment xml:lang="hr">Atari 2600 ROM</comment>
+ <comment xml:lang="he">Atari 2600 ROM</comment>
+ <comment xml:lang="gl">ROM de Atari 2600</comment>
+ <comment xml:lang="fur">ROM Atari 2600</comment>
+ <comment xml:lang="fr">ROM Atari 2600</comment>
+ <comment xml:lang="fi">Atari 2600 -ROM</comment>
+ <comment xml:lang="eu">Atari 2600 ROMa</comment>
+ <comment xml:lang="es">ROM de Atari 2600</comment>
+ <comment xml:lang="en_GB">Atari 2600 ROM</comment>
+ <comment xml:lang="de">Atari-2600-ROM</comment>
+ <comment xml:lang="da">Atari 2600-ROM</comment>
+ <comment xml:lang="ca">ROM d'Atari 2600</comment>
+ <comment xml:lang="bg">ROM — Atari 2600</comment>
+ <comment xml:lang="be">Atari 2600 ROM</comment>
+ <comment xml:lang="ar">روم Atari 2600</comment>
<generic-icon name="application-x-executable"/>
<glob pattern="*.a26"/>
</mime-type>
<mime-type type="application/x-atari-7800-rom">
<comment>Atari 7800 ROM</comment>
- <comment xml:lang="bg">ROM — Atari 7800</comment>
- <comment xml:lang="ca">ROM d'Atari 7800</comment>
- <comment xml:lang="da">Atari 7800-ROM</comment>
- <comment xml:lang="de">Atari 7800 ROM</comment>
- <comment xml:lang="en-GB">Atari 7800 ROM</comment>
- <comment xml:lang="es">ROM de Atari 7800</comment>
- <comment xml:lang="eu">Atari 7800 ROMa</comment>
- <comment xml:lang="fi">Atari 7800 ROM</comment>
- <comment xml:lang="fr">ROM Atari 7800</comment>
- <comment xml:lang="fur">ROM Atari 7800</comment>
- <comment xml:lang="hr">Atari 7800 ROM</comment>
- <comment xml:lang="hu">Atari 7800 ROM</comment>
- <comment xml:lang="id">Atari 7800 ROM</comment>
- <comment xml:lang="it">ROM Atari 7800</comment>
- <comment xml:lang="kk">Atari 7800 ROM</comment>
- <comment xml:lang="ko">아타리 7800 롬</comment>
- <comment xml:lang="pl">Plik ROM konsoli Atari 7800</comment>
- <comment xml:lang="pt">ROM Atari 7800</comment>
- <comment xml:lang="pt-BR">ROM do Atari 7800</comment>
- <comment xml:lang="sl">Atari 7800 ROM</comment>
- <comment xml:lang="sv">Atari 7800-rom</comment>
- <comment xml:lang="tr">Atari 7800 ROM</comment>
+ <comment xml:lang="zh_TW">雅達利 7800 ROM</comment>
+ <comment xml:lang="zh_CN">雅达利 7800 ROM</comment>
<comment xml:lang="uk">Atari 7800 ROM</comment>
- <comment xml:lang="zh-CN">雅达利 7800 ROM</comment>
- <comment xml:lang="zh-TW">雅達利 7800 ROM</comment>
+ <comment xml:lang="tr">Atari 7800 ROM</comment>
+ <comment xml:lang="sv">Atari 7800-rom</comment>
+ <comment xml:lang="sr">Атари 7800 РОМ</comment>
+ <comment xml:lang="sq">ROM Atari 7800</comment>
+ <comment xml:lang="sl">Atari 7800 ROM</comment>
+ <comment xml:lang="si">Atari 7800 ROM</comment>
+ <comment xml:lang="ru">Atari 7800 ROM</comment>
+ <comment xml:lang="pt_BR">ROM do Atari 7800</comment>
+ <comment xml:lang="pt">ROM Atari 7800</comment>
+ <comment xml:lang="pl">Plik ROM konsoli Atari 7800</comment>
+ <comment xml:lang="nl">Atari 7800-ROM</comment>
+ <comment xml:lang="ko">아타리 7800 롬</comment>
+ <comment xml:lang="kk">Atari 7800 ROM</comment>
+ <comment xml:lang="ka">Atari 7800 ROM</comment>
+ <comment xml:lang="ja">Atari 7800 ROM</comment>
+ <comment xml:lang="it">ROM Atari 7800</comment>
+ <comment xml:lang="is">Atari 7800 ROM</comment>
+ <comment xml:lang="id">Atari 7800 ROM</comment>
+ <comment xml:lang="hu">Atari 7800 ROM</comment>
+ <comment xml:lang="hr">Atari 7800 ROM</comment>
+ <comment xml:lang="he">Atari 7800 ROM</comment>
+ <comment xml:lang="gl">ROM de Atari 7800</comment>
+ <comment xml:lang="fur">ROM Atari 7800</comment>
+ <comment xml:lang="fr">ROM Atari 7800</comment>
+ <comment xml:lang="fi">Atari 7800 -ROM</comment>
+ <comment xml:lang="eu">Atari 7800 ROMa</comment>
+ <comment xml:lang="es">ROM de Atari 7800</comment>
+ <comment xml:lang="en_GB">Atari 7800 ROM</comment>
+ <comment xml:lang="de">Atari-7800-ROM</comment>
+ <comment xml:lang="da">Atari 7800-ROM</comment>
+ <comment xml:lang="ca">ROM d'Atari 7800</comment>
+ <comment xml:lang="bg">ROM — Atari 7800</comment>
+ <comment xml:lang="be">Atari 7800 ROM</comment>
+ <comment xml:lang="ar">روم Atari 7800</comment>
<generic-icon name="application-x-executable"/>
<glob pattern="*.a78"/>
<magic>
@@ -124,31 +148,43 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-atari-lynx-rom">
<comment>Atari Lynx ROM</comment>
- <comment xml:lang="bg">ROM — Atari Lynx</comment>
- <comment xml:lang="ca">ROM d'Atari Lynx</comment>
- <comment xml:lang="da">Atari Lynx-ROM</comment>
- <comment xml:lang="de">Atari Lynx ROM</comment>
- <comment xml:lang="en-GB">Atari Lynx ROM</comment>
- <comment xml:lang="es">ROM de Atari Lynx</comment>
- <comment xml:lang="eu">Atari Lynx ROMa</comment>
- <comment xml:lang="fi">Atari Lynx ROM</comment>
- <comment xml:lang="fr">ROM Atari Lynx</comment>
- <comment xml:lang="fur">ROM Atari Lynx</comment>
- <comment xml:lang="hr">Atari Lynx ROM</comment>
- <comment xml:lang="hu">Atari Lynx ROM</comment>
- <comment xml:lang="id">Atari Lynx ROM</comment>
- <comment xml:lang="it">ROM Atari Lynx</comment>
- <comment xml:lang="kk">Atari Lynx ROM</comment>
- <comment xml:lang="ko">아타리 링스 롬</comment>
- <comment xml:lang="pl">Plik ROM konsoli Atari Lynx</comment>
- <comment xml:lang="pt">ROM Atari Lynx</comment>
- <comment xml:lang="pt-BR">ROM do Atari Lynx</comment>
- <comment xml:lang="sl">Atari Lynx ROM</comment>
- <comment xml:lang="sv">Atari Lynx-rom</comment>
- <comment xml:lang="tr">Atari Lynx ROM</comment>
+ <comment xml:lang="zh_TW">雅達利 Lynx ROM</comment>
+ <comment xml:lang="zh_CN">雅达利 Lynx ROM</comment>
<comment xml:lang="uk">Atari Lynx ROM</comment>
- <comment xml:lang="zh-CN">雅达利 Lynx ROM</comment>
- <comment xml:lang="zh-TW">雅達利 Lynx ROM</comment>
+ <comment xml:lang="tr">Atari Lynx ROM</comment>
+ <comment xml:lang="sv">Atari Lynx-rom</comment>
+ <comment xml:lang="sr">Атари Линкс РОМ</comment>
+ <comment xml:lang="sq">ROM Atari Lynx</comment>
+ <comment xml:lang="sl">Atari Lynx ROM</comment>
+ <comment xml:lang="si">Atari Lynx ROM</comment>
+ <comment xml:lang="ru">Atari Lynx ROM</comment>
+ <comment xml:lang="pt_BR">ROM do Atari Lynx</comment>
+ <comment xml:lang="pt">ROM Atari Lynx</comment>
+ <comment xml:lang="pl">Plik ROM konsoli Atari Lynx</comment>
+ <comment xml:lang="nl">Atari Lynx-ROM</comment>
+ <comment xml:lang="ko">아타리 링스 롬</comment>
+ <comment xml:lang="kk">Atari Lynx ROM</comment>
+ <comment xml:lang="ka">Atari Lynx ROM</comment>
+ <comment xml:lang="ja">Atari Lynx ROM</comment>
+ <comment xml:lang="it">ROM Atari Lynx</comment>
+ <comment xml:lang="is">Atari Lynx ROM</comment>
+ <comment xml:lang="id">Atari Lynx ROM</comment>
+ <comment xml:lang="hu">Atari Lynx ROM</comment>
+ <comment xml:lang="hr">Atari Lynx ROM</comment>
+ <comment xml:lang="he">Atari Lynx ROM</comment>
+ <comment xml:lang="gl">ROM de Atari Lynx</comment>
+ <comment xml:lang="fur">ROM Atari Lynx</comment>
+ <comment xml:lang="fr">ROM Atari Lynx</comment>
+ <comment xml:lang="fi">Atari Lynx -ROM</comment>
+ <comment xml:lang="eu">Atari Lynx ROMa</comment>
+ <comment xml:lang="es">ROM de Atari Lynx</comment>
+ <comment xml:lang="en_GB">Atari Lynx ROM</comment>
+ <comment xml:lang="de">Atari-Lynx-ROM</comment>
+ <comment xml:lang="da">Atari Lynx-ROM</comment>
+ <comment xml:lang="ca">ROM d'Atari Lynx</comment>
+ <comment xml:lang="bg">ROM — Atari Lynx</comment>
+ <comment xml:lang="be">Atari Lynx ROM</comment>
+ <comment xml:lang="ar">روم Atari Lynx</comment>
<generic-icon name="application-x-executable"/>
<glob pattern="*.lnx"/>
<magic>
@@ -157,108 +193,76 @@ command to generate the output files.
</mime-type>
<mime-type type="application/andrew-inset">
<comment>ATK inset</comment>
- <comment xml:lang="ar">شكل ATK</comment>
- <comment xml:lang="be-Latn">Ustaŭka ATK</comment>
- <comment xml:lang="bg">Притурка — ATK</comment>
- <comment xml:lang="ca">ATK inset</comment>
- <comment xml:lang="cs">vložka ATK</comment>
- <comment xml:lang="da">ATK-indsættelse</comment>
- <comment xml:lang="de">ATK-Inset</comment>
- <comment xml:lang="el">Ένθετο ATK</comment>
- <comment xml:lang="en-GB">ATK inset</comment>
- <comment xml:lang="es">inserción ATK</comment>
- <comment xml:lang="eu">ATK sartzapena</comment>
- <comment xml:lang="fi">ATK-osio</comment>
- <comment xml:lang="fo">ATK innskot</comment>
- <comment xml:lang="fr">encart ATK</comment>
- <comment xml:lang="fur">inset ATK</comment>
- <comment xml:lang="ga">intlis ATK</comment>
- <comment xml:lang="gl">conxunto ATK</comment>
- <comment xml:lang="he">תוספת ATK</comment>
- <comment xml:lang="hr">ATK umetak</comment>
- <comment xml:lang="hu">ATK betét</comment>
- <comment xml:lang="ia">Folio intercalari ATK</comment>
- <comment xml:lang="id">Inset ATK</comment>
- <comment xml:lang="it">Inset ATK</comment>
- <comment xml:lang="ja">ATK インセット</comment>
- <comment xml:lang="kk">ATK беті</comment>
- <comment xml:lang="ko">ATK inset</comment>
- <comment xml:lang="lt">ATK inset</comment>
- <comment xml:lang="lv">ATK ielaidums</comment>
- <comment xml:lang="nb">ATK-innsats</comment>
- <comment xml:lang="nl">ATK-invoegsel</comment>
- <comment xml:lang="nn">ATK-innskot</comment>
- <comment xml:lang="oc">encart ATK</comment>
- <comment xml:lang="pl">Wstawka ATK</comment>
- <comment xml:lang="pt">Suplemento ATK</comment>
- <comment xml:lang="pt-BR">Conjunto de entrada do ATK</comment>
- <comment xml:lang="ro">Inset ATK</comment>
- <comment xml:lang="ru">Вкладка ATK</comment>
- <comment xml:lang="sk">Vložka ATK</comment>
- <comment xml:lang="sl">Vložka ATK</comment>
- <comment xml:lang="sq">Inset ATK</comment>
- <comment xml:lang="sr">АТК уметак</comment>
- <comment xml:lang="sv">ATK-inlägg</comment>
- <comment xml:lang="tr">ATK iç metni</comment>
- <comment xml:lang="uk">вкладка ATK</comment>
+ <comment xml:lang="zh_TW">ATK 內嵌</comment>
+ <comment xml:lang="zh_CN">ATK 嵌入对象</comment>
<comment xml:lang="vi">Bộ dát ATK</comment>
- <comment xml:lang="zh-CN">ATK 嵌入对象</comment>
- <comment xml:lang="zh-TW">ATK 內嵌</comment>
+ <comment xml:lang="uk">вкладка ATK</comment>
+ <comment xml:lang="tr">ATK iç metni</comment>
+ <comment xml:lang="sv">ATK-inlägg</comment>
+ <comment xml:lang="sr">АТК уметак</comment>
+ <comment xml:lang="sl">Vložka ATK</comment>
+ <comment xml:lang="si">ATK ඇතුළු කිරීම</comment>
+ <comment xml:lang="sk">Vložka ATK</comment>
+ <comment xml:lang="ru">Вкладка ATK</comment>
+ <comment xml:lang="ro">Inset ATK</comment>
+ <comment xml:lang="pt_BR">Conjunto de entrada do ATK</comment>
+ <comment xml:lang="pt">Suplemento ATK</comment>
+ <comment xml:lang="pl">Wstawka ATK</comment>
+ <comment xml:lang="oc">encart ATK</comment>
+ <comment xml:lang="nn">ATK-innskot</comment>
+ <comment xml:lang="nl">ATK-invoegsel</comment>
+ <comment xml:lang="nb">ATK-innsats</comment>
+ <comment xml:lang="lv">ATK ielaidums</comment>
+ <comment xml:lang="lt">ATK inset</comment>
+ <comment xml:lang="ko">ATK 인세트</comment>
+ <comment xml:lang="kk">ATK беті</comment>
+ <comment xml:lang="ja">ATK インセット</comment>
+ <comment xml:lang="it">Inset ATK</comment>
+ <comment xml:lang="is">ATK innfelling</comment>
+ <comment xml:lang="id">Inset ATK</comment>
+ <comment xml:lang="ia">Folio intercalari ATK</comment>
+ <comment xml:lang="hu">ATK betét</comment>
+ <comment xml:lang="hr">ATK umetak</comment>
+ <comment xml:lang="he">תוספת ATK</comment>
+ <comment xml:lang="gl">conxunto ATK</comment>
+ <comment xml:lang="ga">intlis ATK</comment>
+ <comment xml:lang="fur">inset ATK</comment>
+ <comment xml:lang="fr">encart ATK</comment>
+ <comment xml:lang="fo">ATK innskot</comment>
+ <comment xml:lang="fi">ATK-osio</comment>
+ <comment xml:lang="eu">ATK sartzapena</comment>
+ <comment xml:lang="es">inserción ATK</comment>
+ <comment xml:lang="en_GB">ATK inset</comment>
+ <comment xml:lang="el">Ένθετο ATK</comment>
+ <comment xml:lang="de">ATK-Inset</comment>
+ <comment xml:lang="da">ATK-indsættelse</comment>
+ <comment xml:lang="cs">vložka ATK</comment>
+ <comment xml:lang="ca">ATK inset</comment>
+ <comment xml:lang="bg">Притурка — ATK</comment>
+ <comment xml:lang="be@latin">Ustaŭka ATK</comment>
+ <comment xml:lang="be">устаўка ATK</comment>
+ <comment xml:lang="ar">شكل ATK</comment>
<acronym>ATK</acronym>
<expanded-acronym>Andrew Toolkit</expanded-acronym>
<generic-icon name="x-office-document"/>
<glob pattern="*.ez"/>
</mime-type>
<mime-type type="application/epub+zip">
- <comment>electronic book document</comment>
- <comment xml:lang="af">elektronieseboekdokument</comment>
- <comment xml:lang="ar">مستند كتاب إلكتروني</comment>
- <comment xml:lang="ast">documentu de llibru electrónicu</comment>
- <comment xml:lang="be-Latn">elektronnaja kniha</comment>
- <comment xml:lang="bg">Документ — електронна книга</comment>
- <comment xml:lang="ca">document de llibre electrònic</comment>
- <comment xml:lang="cs">dokument elektronické knihy</comment>
- <comment xml:lang="da">elektronisk bogdokument</comment>
- <comment xml:lang="de">Elektronisches Buch</comment>
- <comment xml:lang="el">Έγγραφο ηλεκτρονικού βιβλίου</comment>
- <comment xml:lang="en-GB">electronic book document</comment>
- <comment xml:lang="es">documento de libro electrónico</comment>
- <comment xml:lang="eu">liburu elektronikoaren dokumentua</comment>
- <comment xml:lang="fi">elektroninen kirja</comment>
- <comment xml:lang="fo">elektroniskbóka skjal</comment>
- <comment xml:lang="fr">document livre électronique</comment>
- <comment xml:lang="fur">document libri eletronic</comment>
- <comment xml:lang="ga">leabhar leictreonach</comment>
- <comment xml:lang="gl">documento de libro electrónico</comment>
- <comment xml:lang="he">מסמך מסוג ספר אלקטרוני</comment>
- <comment xml:lang="hr">Dokument elektroničke knjige</comment>
- <comment xml:lang="hu">elektronikus könyvdokumentum</comment>
- <comment xml:lang="ia">Documento de libro electronic</comment>
- <comment xml:lang="id">dokumen buku elektronik</comment>
- <comment xml:lang="it">Documento libro elettronico</comment>
- <comment xml:lang="ja">電子ブックドキュメント</comment>
- <comment xml:lang="kk">электронды кітабы</comment>
- <comment xml:lang="ko">전자책 문서</comment>
- <comment xml:lang="lt">elektroninės knygos dokumentas</comment>
- <comment xml:lang="lv">elektroniskās grāmatas dokuments</comment>
- <comment xml:lang="nl">elektronisch boek</comment>
- <comment xml:lang="nn">elektronisk bok-dokument</comment>
- <comment xml:lang="oc">document libre electronic</comment>
- <comment xml:lang="pl">Dokument książki elektronicznej</comment>
- <comment xml:lang="pt">documento de livro eletrónico</comment>
- <comment xml:lang="pt-BR">Documento de livro eletrônico</comment>
- <comment xml:lang="ro">document carte electronică</comment>
- <comment xml:lang="ru">Электронная книга</comment>
- <comment xml:lang="sk">Dokument elektronickej knihy</comment>
- <comment xml:lang="sl">dokument elektronske knjige</comment>
- <comment xml:lang="sq">Dokument libri elektronik</comment>
- <comment xml:lang="sr">документ електронске књиге</comment>
- <comment xml:lang="sv">elektroniskt bokdokument</comment>
- <comment xml:lang="tr">elektronik kitap belgesi</comment>
+ <comment>Electronic book document</comment>
+ <comment xml:lang="zh_TW">電子書文件</comment>
<comment xml:lang="uk">документ електронної книги</comment>
- <comment xml:lang="vi">tài liệu cuốn sách điện tử</comment>
- <comment xml:lang="zh-CN">电子书文档</comment>
- <comment xml:lang="zh-TW">電子書文件</comment>
+ <comment xml:lang="sv">Elektroniskt bokdokument</comment>
+ <comment xml:lang="sq">Dokument libri elektronik</comment>
+ <comment xml:lang="ru">Документ электронной книги</comment>
+ <comment xml:lang="pt_BR">Documento de livro eletrônico</comment>
+ <comment xml:lang="pl">Dokument książki elektronicznej</comment>
+ <comment xml:lang="ja">電子書籍</comment>
+ <comment xml:lang="it">Documento libro elettronico</comment>
+ <comment xml:lang="gl">Documento de libro electrónico</comment>
+ <comment xml:lang="eu">Liburu elektronikoa</comment>
+ <comment xml:lang="es">documento de libro electrónico</comment>
+ <comment xml:lang="de">E-Book</comment>
+ <comment xml:lang="be">электроннай кніга</comment>
<sub-class-of type="application/zip"/>
<generic-icon name="x-office-document"/>
<magic priority="70">
@@ -273,29 +277,42 @@ command to generate the output files.
</mime-type>
<mime-type type="application/vnd.amazon.mobi8-ebook">
<comment>Kindle book document</comment>
- <comment xml:lang="ca">document de llibre Kindle</comment>
- <comment xml:lang="da">Kindle-bogdokument</comment>
- <comment xml:lang="de">Kindle-Buch-Dokument</comment>
- <comment xml:lang="en-GB">Kindle book document</comment>
- <comment xml:lang="es">documento de libro de Kindle</comment>
- <comment xml:lang="fi">Kindle book -asiakirja</comment>
- <comment xml:lang="fr">document livre Kindle</comment>
- <comment xml:lang="hr">Dokument Kindle knjige</comment>
- <comment xml:lang="hu">Kindle könyvdokumentum</comment>
- <comment xml:lang="id">Dokumen buku Kindle</comment>
- <comment xml:lang="it">Documento libro Kindle</comment>
- <comment xml:lang="kk">Kindle кітап құжаты</comment>
- <comment xml:lang="ko">Kindle 책 문서</comment>
- <comment xml:lang="lt">Kindle knygos dokumentas</comment>
- <comment xml:lang="pl">Dokument książki Kindle</comment>
- <comment xml:lang="pt">documento de livro eletrónico do Kindle</comment>
- <comment xml:lang="pt-BR">Documento livro do Kindle</comment>
- <comment xml:lang="ru">Электронная книга Kindle</comment>
- <comment xml:lang="sv">Kindle-bokdokument</comment>
- <comment xml:lang="tr">Kindle kitap belgesi</comment>
+ <comment xml:lang="zh_TW">Kindle 書文件</comment>
+ <comment xml:lang="zh_CN">Kindle 电子书文档</comment>
<comment xml:lang="uk">документ книги Kindle</comment>
- <comment xml:lang="zh-CN">Kindle 电子书文档</comment>
- <comment xml:lang="zh-TW">Kindle 書文件</comment>
+ <comment xml:lang="tr">Kindle kitap belgesi</comment>
+ <comment xml:lang="sv">Kindle-bokdokument</comment>
+ <comment xml:lang="sr">Документ Киндл књиге</comment>
+ <comment xml:lang="sq">dokument libri Kindle</comment>
+ <comment xml:lang="sl">Dokument knjige Kindle</comment>
+ <comment xml:lang="si">Kindle පොත් ලේඛනය</comment>
+ <comment xml:lang="ru">Документ электронной книги Kindle</comment>
+ <comment xml:lang="pt_BR">Documento livro do Kindle</comment>
+ <comment xml:lang="pt">documento de livro eletrónico do Kindle</comment>
+ <comment xml:lang="pl">Dokument książki Kindle</comment>
+ <comment xml:lang="oc">document libre Kindle</comment>
+ <comment xml:lang="nl">Kindle-boekdocument</comment>
+ <comment xml:lang="lt">Kindle knygos dokumentas</comment>
+ <comment xml:lang="ko">Kindle 책 문서</comment>
+ <comment xml:lang="kk">Kindle кітап құжаты</comment>
+ <comment xml:lang="ja">キンドルブックドキュメント</comment>
+ <comment xml:lang="it">Documento libro Kindle</comment>
+ <comment xml:lang="is">Kindle rafbókarskjal</comment>
+ <comment xml:lang="id">Dokumen buku Kindle</comment>
+ <comment xml:lang="hu">Kindle könyvdokumentum</comment>
+ <comment xml:lang="hr">Dokument Kindle knjige</comment>
+ <comment xml:lang="he">מסמך ספר Kindle</comment>
+ <comment xml:lang="gl">Documento de libro de Kindle</comment>
+ <comment xml:lang="fr">document livre Kindle</comment>
+ <comment xml:lang="fi">Kindle book -asiakirja</comment>
+ <comment xml:lang="eu">Kindle liburu-dokumentua</comment>
+ <comment xml:lang="es">documento de libro de Kindle</comment>
+ <comment xml:lang="en_GB">Kindle book document</comment>
+ <comment xml:lang="de">Kindle E-Book</comment>
+ <comment xml:lang="da">Kindle-bogdokument</comment>
+ <comment xml:lang="ca">document de llibre Kindle</comment>
+ <comment xml:lang="be">дакумент кнігі Kindle</comment>
+ <comment xml:lang="ar">مستند كتاب كندل</comment>
<sub-class-of type="application/x-mobipocket-ebook"/>
<glob pattern="*.azw3"/>
<glob pattern="*.kfx"/>
@@ -303,153 +320,172 @@ command to generate the output files.
</mime-type>
<mime-type type="application/illustrator">
<comment>Adobe Illustrator document</comment>
- <comment xml:lang="af">Adobe Illustrator-dokument</comment>
- <comment xml:lang="ar">مستند أدوبي المصور</comment>
- <comment xml:lang="ast">Documentu d'Adobe Illustrator</comment>
- <comment xml:lang="be-Latn">Dakument Adobe Illustrator</comment>
- <comment xml:lang="bg">Документ — Adobe Illustrator</comment>
- <comment xml:lang="ca">document d'Adobe Illustrator</comment>
- <comment xml:lang="cs">dokument Adobe Illustrator</comment>
- <comment xml:lang="da">Adobe Illustrator-dokument</comment>
- <comment xml:lang="de">Adobe-Illustrator-Dokument</comment>
- <comment xml:lang="el">Έγγραφο Adobe Illustrator</comment>
- <comment xml:lang="en-GB">Adobe Illustrator document</comment>
- <comment xml:lang="eo">dokumento de Adobe Illustrator</comment>
- <comment xml:lang="es">documento de Adobe Illustrator</comment>
- <comment xml:lang="eu">Adobe Illustrator dokumentua</comment>
- <comment xml:lang="fi">Adobe Illustrator -asiakirja</comment>
- <comment xml:lang="fo">Adobe Illustrator skjal</comment>
- <comment xml:lang="fr">document Adobe Illustrator</comment>
- <comment xml:lang="fur">document Adobe Illustrator</comment>
- <comment xml:lang="ga">cáipéis Adobe Illustrator</comment>
- <comment xml:lang="gl">documento de Adobe Ilustrator</comment>
- <comment xml:lang="he">מסמך Adobe Ill</comment>
- <comment xml:lang="hr">Adobe Illustrator dokument</comment>
- <comment xml:lang="hu">Adobe Illustrator-dokumentum</comment>
- <comment xml:lang="ia">Documento Adobe Illustrator</comment>
- <comment xml:lang="id">Dokumen Adobe Illustrator</comment>
- <comment xml:lang="it">Documento Adobe Illustrator</comment>
- <comment xml:lang="ja">Adobe Illustrator ドキュメント</comment>
- <comment xml:lang="ka">Adobe Illustrator-ის დოკუმენტი</comment>
- <comment xml:lang="kk">Adobe Illustrator құжаты</comment>
- <comment xml:lang="ko">Adobe Illustrator 문서</comment>
- <comment xml:lang="lt">Adobe Illustrator dokumentas</comment>
- <comment xml:lang="lv">Adobe Illustrator dokuments</comment>
- <comment xml:lang="ms">Dokumen Adobe Illustrator</comment>
- <comment xml:lang="nb">Adobe Illustrator-dokument</comment>
- <comment xml:lang="nl">Adobe Illustrator-document</comment>
- <comment xml:lang="nn">Adobe Illustrator-dokument</comment>
- <comment xml:lang="oc">document Adobe Illustrator</comment>
- <comment xml:lang="pl">Dokument Adobe Illustrator</comment>
- <comment xml:lang="pt">documento Adobe Illustrator</comment>
- <comment xml:lang="pt-BR">Documento do Adobe Illustrator</comment>
- <comment xml:lang="ro">Document Adobe Illustrator</comment>
- <comment xml:lang="ru">Документ Adobe Illustrator</comment>
- <comment xml:lang="sk">Dokument Adobe Illustrator</comment>
- <comment xml:lang="sl">Dokument Adobe Illustrator</comment>
- <comment xml:lang="sq">Dokument Adobe Illustrator</comment>
- <comment xml:lang="sr">документ Адобе илустратора</comment>
- <comment xml:lang="sv">Adobe Illustrator-dokument</comment>
- <comment xml:lang="tr">Adobe Illustrator belgesi</comment>
- <comment xml:lang="uk">документ Adobe Illustrator</comment>
+ <comment xml:lang="zh_TW">Adobe Illustrator 文件</comment>
+ <comment xml:lang="zh_CN">Adobe Illustrator 文档</comment>
<comment xml:lang="vi">Tài liệu Adobe Illustrator</comment>
- <comment xml:lang="zh-CN">Adobe Illustrator 文档</comment>
- <comment xml:lang="zh-TW">Adobe Illustrator 文件</comment>
+ <comment xml:lang="uk">документ Adobe Illustrator</comment>
+ <comment xml:lang="tr">Adobe Illustrator belgesi</comment>
+ <comment xml:lang="sv">Adobe Illustrator-dokument</comment>
+ <comment xml:lang="sr">документ Адобе илустратора</comment>
+ <comment xml:lang="sq">dokument Adobe Illustrator</comment>
+ <comment xml:lang="sl">Dokument Adobe Illustrator</comment>
+ <comment xml:lang="si">Adobe Illustrator ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument Adobe Illustrator</comment>
+ <comment xml:lang="ru">Документ Adobe Illustrator</comment>
+ <comment xml:lang="ro">Document Adobe Illustrator</comment>
+ <comment xml:lang="pt_BR">Documento do Adobe Illustrator</comment>
+ <comment xml:lang="pt">documento Adobe Illustrator</comment>
+ <comment xml:lang="pl">Dokument Adobe Illustrator</comment>
+ <comment xml:lang="oc">document Adobe Illustrator</comment>
+ <comment xml:lang="nn">Adobe Illustrator-dokument</comment>
+ <comment xml:lang="nl">Adobe Illustrator-document</comment>
+ <comment xml:lang="nb">Adobe Illustrator-dokument</comment>
+ <comment xml:lang="ms">Dokumen Adobe Illustrator</comment>
+ <comment xml:lang="lv">Adobe Illustrator dokuments</comment>
+ <comment xml:lang="lt">Adobe Illustrator dokumentas</comment>
+ <comment xml:lang="ko">Adobe Illustrator 문서</comment>
+ <comment xml:lang="kk">Adobe Illustrator құжаты</comment>
+ <comment xml:lang="ka">Adobe Illustrator-ის დოკუმენტი</comment>
+ <comment xml:lang="ja">Adobe Illustrator ドキュメント</comment>
+ <comment xml:lang="it">Documento Adobe Illustrator</comment>
+ <comment xml:lang="is">Adobe Illustrator skjal</comment>
+ <comment xml:lang="id">Dokumen Adobe Illustrator</comment>
+ <comment xml:lang="ia">Documento Adobe Illustrator</comment>
+ <comment xml:lang="hu">Adobe Illustrator-dokumentum</comment>
+ <comment xml:lang="hr">Adobe Illustrator dokument</comment>
+ <comment xml:lang="he">מסמך Adobe Ill</comment>
+ <comment xml:lang="gl">documento de Adobe Ilustrator</comment>
+ <comment xml:lang="ga">cáipéis Adobe Illustrator</comment>
+ <comment xml:lang="fur">document Adobe Illustrator</comment>
+ <comment xml:lang="fr">document Adobe Illustrator</comment>
+ <comment xml:lang="fo">Adobe Illustrator skjal</comment>
+ <comment xml:lang="fi">Adobe Illustrator -asiakirja</comment>
+ <comment xml:lang="eu">Adobe Illustrator dokumentua</comment>
+ <comment xml:lang="es">documento de Adobe Illustrator</comment>
+ <comment xml:lang="eo">dokumento de Adobe Illustrator</comment>
+ <comment xml:lang="en_GB">Adobe Illustrator document</comment>
+ <comment xml:lang="el">Έγγραφο Adobe Illustrator</comment>
+ <comment xml:lang="de">Adobe-Illustrator-Dokument</comment>
+ <comment xml:lang="da">Adobe Illustrator-dokument</comment>
+ <comment xml:lang="cs">dokument Adobe Illustrator</comment>
+ <comment xml:lang="ca">document d'Adobe Illustrator</comment>
+ <comment xml:lang="bg">Документ — Adobe Illustrator</comment>
+ <comment xml:lang="be@latin">Dakument Adobe Illustrator</comment>
+ <comment xml:lang="be">дакумент Adobe Illustrator</comment>
+ <comment xml:lang="ast">Documentu d'Adobe Illustrator</comment>
+ <comment xml:lang="ar">مستند أدوبي إليستريتور</comment>
+ <comment xml:lang="af">Adobe Illustrator-dokument</comment>
<generic-icon name="image-x-generic"/>
<glob pattern="*.ai"/>
<alias type="application/vnd.adobe.illustrator"/>
</mime-type>
<mime-type type="application/mac-binhex40">
<comment>Macintosh BinHex-encoded file</comment>
- <comment xml:lang="af">Macintosh BinHex-geënkodeerde lêer</comment>
- <comment xml:lang="ar">ملف Macintosh BinHex مشفر</comment>
- <comment xml:lang="ast">Ficheru codificáu en BinHex de Machintosh</comment>
- <comment xml:lang="az">Macintosh BinHex-kodlanmış fayl</comment>
- <comment xml:lang="be-Latn">Fajł Macintosh, BinHex-zakadavany</comment>
- <comment xml:lang="bg">Файл — кодиран във формат BinHex за Macintosh</comment>
- <comment xml:lang="ca">fitxer amb codificació BinHex de Macintosh</comment>
- <comment xml:lang="cs">soubor kódovaný pomocí Macintosh BinHex</comment>
- <comment xml:lang="cy">Ffeil BinHex-amgodwyd Macintosh</comment>
- <comment xml:lang="da">Macintosh BinHex-kodet fil</comment>
- <comment xml:lang="de">Macintosh-Datei (BinHex-kodiert)</comment>
- <comment xml:lang="el">Αρχείο Macintosh κωδικοποίησης BinHex</comment>
- <comment xml:lang="en-GB">Macintosh BinHex-encoded file</comment>
- <comment xml:lang="eo">dosiero kodigita laŭ Macintosh BinHex</comment>
- <comment xml:lang="es">archivo Macintosh codificado con BinHex</comment>
- <comment xml:lang="eu">Macintosh BinHex-ekin kodetutako fitxategia</comment>
- <comment xml:lang="fi">Macintosh BinHex -koodattu tiedosto</comment>
- <comment xml:lang="fo">Macintosh BinHex-bronglað fíla</comment>
- <comment xml:lang="fr">fichier codé Macintosh BinHex</comment>
- <comment xml:lang="fur">file di Macintosh codificât BinHex</comment>
- <comment xml:lang="ga">comhad ionchódaithe le Macintosh BinHex</comment>
- <comment xml:lang="gl">ficheiro de Macintosh codificado con BinHex</comment>
- <comment xml:lang="he">קובץ בקידוד Macintosh BinHex</comment>
- <comment xml:lang="hr">Macintosh BinHex-kôdirana datoteka</comment>
- <comment xml:lang="hu">Macintosh BinHex kódolású fájl</comment>
- <comment xml:lang="ia">File codificate in BinHex de Macintosh</comment>
- <comment xml:lang="id">Berkas tersandi Macintosh BinHex</comment>
- <comment xml:lang="it">File Macintosh codificato BinHex</comment>
- <comment xml:lang="ja">Macintosh BinHex エンコードファイル</comment>
- <comment xml:lang="kk">Macintosh BinHex кодталған файлы</comment>
- <comment xml:lang="ko">매킨토시 BinHex 인코딩된 압축 파일</comment>
- <comment xml:lang="lt">Macintosh BinHex-encoded failas</comment>
- <comment xml:lang="lv">Macintosh BinHex-kodēts datne</comment>
- <comment xml:lang="ms">Fail terenkod-BinHex Macintosh</comment>
- <comment xml:lang="nb">Macintosh BinHe-kodet arkiv</comment>
- <comment xml:lang="nl">Macintosh BinHex-gecodeerd bestand</comment>
- <comment xml:lang="nn">Macintosh BinHex-koda fil</comment>
- <comment xml:lang="oc">fichièr encodat Macintosh BinHex</comment>
- <comment xml:lang="pl">Zakodowany w BinHex plik Macintosh</comment>
- <comment xml:lang="pt">ficheiro codificado em BinHex de Macintosh</comment>
- <comment xml:lang="pt-BR">Arquivo do Macintosh codificado com BinHex</comment>
- <comment xml:lang="ro">Fișier codat Macintosh BinHex</comment>
- <comment xml:lang="ru">Файл (закодированный Macintosh BinHex)</comment>
- <comment xml:lang="sk">Súbor kódovaný pomocou Macintosh BinHex</comment>
- <comment xml:lang="sl">Kodirana datoteka Macintosh (BinHex)</comment>
- <comment xml:lang="sq">File Macintosh i kodifikuar BinHex</comment>
- <comment xml:lang="sr">Мекинтошова БинХекс-кодирана датотека</comment>
- <comment xml:lang="sv">Macintosh BinHex-kodad fil</comment>
- <comment xml:lang="tr">Macintosh BinHex-şifreli dosya</comment>
- <comment xml:lang="uk">файл закодований Macintosh BinHex</comment>
+ <comment xml:lang="zh_TW">Macintosh BinHex 編碼檔</comment>
+ <comment xml:lang="zh_CN">Macintosh BinHex 编码的文件</comment>
<comment xml:lang="vi">Tập tin đã mã hoá BinHex của Macintosh</comment>
- <comment xml:lang="zh-CN">Macintosh BinHex 编码的文件</comment>
- <comment xml:lang="zh-TW">Macintosh BinHex 編碼檔</comment>
+ <comment xml:lang="uk">файл закодований Macintosh BinHex</comment>
+ <comment xml:lang="tr">Macintosh BinHex-şifreli dosya</comment>
+ <comment xml:lang="sv">Macintosh BinHex-kodad fil</comment>
+ <comment xml:lang="sr">Мекинтошова БинХекс-кодирана датотека</comment>
+ <comment xml:lang="sq">kartelë Macintosh koduar me BinHex</comment>
+ <comment xml:lang="sl">Kodirana datoteka Macintosh (BinHex)</comment>
+ <comment xml:lang="si">Macintosh BinHex-කේතනය කළ ගොනුව</comment>
+ <comment xml:lang="sk">Súbor kódovaný pomocou Macintosh BinHex</comment>
+ <comment xml:lang="ru">Файл Macintosh закодированный BinHex</comment>
+ <comment xml:lang="ro">Fișier codat Macintosh BinHex</comment>
+ <comment xml:lang="pt_BR">Arquivo do Macintosh codificado com BinHex</comment>
+ <comment xml:lang="pt">ficheiro codificado em BinHex de Macintosh</comment>
+ <comment xml:lang="pl">Zakodowany w BinHex plik Macintosh</comment>
+ <comment xml:lang="oc">fichièr encodat Macintosh BinHex</comment>
+ <comment xml:lang="nn">Macintosh BinHex-koda fil</comment>
+ <comment xml:lang="nl">Macintosh BinHex-gecodeerd bestand</comment>
+ <comment xml:lang="nb">Macintosh BinHe-kodet arkiv</comment>
+ <comment xml:lang="ms">Fail terenkod-BinHex Macintosh</comment>
+ <comment xml:lang="lv">Macintosh BinHex-kodēts datne</comment>
+ <comment xml:lang="lt">Macintosh BinHex-encoded failas</comment>
+ <comment xml:lang="ko">매킨토시 BinHex 인코딩된 압축 파일</comment>
+ <comment xml:lang="kk">Macintosh BinHex кодталған файлы</comment>
+ <comment xml:lang="ja">Macintosh BinHex エンコードファイル</comment>
+ <comment xml:lang="it">File Macintosh codificato BinHex</comment>
+ <comment xml:lang="is">Macintosh BinHex-kóðuð skrá</comment>
+ <comment xml:lang="id">Berkas tersandi Macintosh BinHex</comment>
+ <comment xml:lang="ia">File codificate in BinHex de Macintosh</comment>
+ <comment xml:lang="hu">Macintosh BinHex kódolású fájl</comment>
+ <comment xml:lang="hr">Macintosh BinHex-kôdirana datoteka</comment>
+ <comment xml:lang="he">קובץ בקידוד Macintosh BinHex</comment>
+ <comment xml:lang="gl">ficheiro de Macintosh codificado con BinHex</comment>
+ <comment xml:lang="ga">comhad ionchódaithe le Macintosh BinHex</comment>
+ <comment xml:lang="fur">file di Macintosh codificât BinHex</comment>
+ <comment xml:lang="fr">fichier codé Macintosh BinHex</comment>
+ <comment xml:lang="fo">Macintosh BinHex-bronglað fíla</comment>
+ <comment xml:lang="fi">Macintosh BinHex -koodattu tiedosto</comment>
+ <comment xml:lang="eu">Macintosh BinHex-ekin kodetutako fitxategia</comment>
+ <comment xml:lang="es">archivo Macintosh codificado con BinHex</comment>
+ <comment xml:lang="eo">dosiero kodigita laŭ Macintosh BinHex</comment>
+ <comment xml:lang="en_GB">Macintosh BinHex-encoded file</comment>
+ <comment xml:lang="el">Αρχείο Macintosh κωδικοποίησης BinHex</comment>
+ <comment xml:lang="de">Macintosh-Datei (BinHex-verschlüsselt)</comment>
+ <comment xml:lang="da">Macintosh BinHex-kodet fil</comment>
+ <comment xml:lang="cy">Ffeil BinHex-amgodwyd Macintosh</comment>
+ <comment xml:lang="cs">soubor kódovaný pomocí Macintosh BinHex</comment>
+ <comment xml:lang="ca">fitxer amb codificació BinHex de Macintosh</comment>
+ <comment xml:lang="bg">Файл — кодиран във формат BinHex за Macintosh</comment>
+ <comment xml:lang="be@latin">Fajł Macintosh, BinHex-zakadavany</comment>
+ <comment xml:lang="be">файл з кадаваннем Macintosh BinHex</comment>
+ <comment xml:lang="az">Macintosh BinHex-kodlanmış fayl</comment>
+ <comment xml:lang="ast">Ficheru codificáu en BinHex de Machintosh</comment>
+ <comment xml:lang="ar">ملف Macintosh BinHex مشفر</comment>
+ <comment xml:lang="af">Macintosh BinHex-geënkodeerde lêer</comment>
+ <sub-class-of type="text/plain"/>
<generic-icon name="package-x-generic"/>
- <magic priority="50">
- <match type="string" value="must be converted with BinHex" offset="11"/>
+ <magic>
+ <match type="string" value="(This file must be converted with BinHex 4.0)" offset="0"/>
+ <match type="string" value="(This file must be converted; you knew that already.)" offset="0"/>
</magic>
+ <glob pattern="*.hqx"/>
</mime-type>
<mime-type type="application/mathematica">
<comment>Mathematica Notebook file</comment>
- <comment xml:lang="bg">Скицник — Mathematica</comment>
- <comment xml:lang="ca">llibreta de Mathematica Notebook</comment>
- <comment xml:lang="da">Mathematica Notebook-fil</comment>
- <comment xml:lang="de">Mathematica-Notebook-Datei</comment>
- <comment xml:lang="en-GB">Mathematica Notebook file</comment>
- <comment xml:lang="es">archivo de Mathematica Notebook</comment>
- <comment xml:lang="eu">Mathematica Notebook fitxategia</comment>
- <comment xml:lang="fi">Mathematica Notebook -tiedosto</comment>
- <comment xml:lang="fr">fichier carnet Mathematica</comment>
- <comment xml:lang="hr">Mathematica Notebook datoteka</comment>
- <comment xml:lang="hu">Mathematica munkafüzetfájl</comment>
- <comment xml:lang="id">Berkas Mathematica Notebook</comment>
- <comment xml:lang="it">File Mathematica Notebook</comment>
- <comment xml:lang="kk">Mathematica блокнот файлы</comment>
- <comment xml:lang="ko">매쓰매티카 기록장 파일</comment>
- <comment xml:lang="pl">Plik notatnika Mathematica</comment>
- <comment xml:lang="pt">ficheiro de Mathematica Notebook do Wolfram</comment>
- <comment xml:lang="pt-BR">Arquivo Notebook do Mathematica</comment>
- <comment xml:lang="ru">Файл Mathematica Notebook</comment>
- <comment xml:lang="sl">Datoteka Mathematica Notebook</comment>
- <comment xml:lang="sv">Mathematica-anteckningsboksfil</comment>
- <comment xml:lang="tr">Mathematica Notebook dosyası</comment>
+ <comment xml:lang="zh_TW">Mathematica 筆記本檔案</comment>
+ <comment xml:lang="zh_CN">Mathematica 笔记本文件</comment>
<comment xml:lang="uk">файл нотатника Mathematica</comment>
- <comment xml:lang="zh-CN">Mathematica 笔记本文件</comment>
- <comment xml:lang="zh-TW">Mathematica 筆記本檔案</comment>
+ <comment xml:lang="tr">Mathematica Notebook dosyası</comment>
+ <comment xml:lang="sv">Mathematica-anteckningsboksfil</comment>
+ <comment xml:lang="sq">kartelë Mathematica Notebook</comment>
+ <comment xml:lang="sl">Datoteka Mathematica Notebook</comment>
+ <comment xml:lang="si">Mathematica Notebook ගොනුව</comment>
+ <comment xml:lang="ru">Файл Mathematica Notebook</comment>
+ <comment xml:lang="pt_BR">Arquivo Notebook do Mathematica</comment>
+ <comment xml:lang="pt">ficheiro de Mathematica Notebook do Wolfram</comment>
+ <comment xml:lang="pl">Plik notatnika Mathematica</comment>
+ <comment xml:lang="nl">Mathematica Notebook-bestand</comment>
+ <comment xml:lang="ko">Mathematica 기록장 파일</comment>
+ <comment xml:lang="kk">Mathematica блокнот файлы</comment>
+ <comment xml:lang="ka">Mathematica Notebook-ის ფაილი</comment>
+ <comment xml:lang="ja">Mathematica ノートブックファイル</comment>
+ <comment xml:lang="it">File Mathematica Notebook</comment>
+ <comment xml:lang="is">Mathematica Notebook skrá</comment>
+ <comment xml:lang="id">Berkas Mathematica Notebook</comment>
+ <comment xml:lang="hu">Mathematica munkafüzetfájl</comment>
+ <comment xml:lang="hr">Mathematica Notebook datoteka</comment>
+ <comment xml:lang="he">קובץ מחברת של Mathematica</comment>
+ <comment xml:lang="gl">Ficheiro de caderno de Mathematica</comment>
+ <comment xml:lang="fr">fichier carnet Mathematica</comment>
+ <comment xml:lang="fi">Mathematica Notebook -tiedosto</comment>
+ <comment xml:lang="eu">Mathematica Notebook fitxategia</comment>
+ <comment xml:lang="es">archivo de Mathematica Notebook</comment>
+ <comment xml:lang="en_GB">Mathematica Notebook file</comment>
+ <comment xml:lang="de">Mathematica-Notebook-Datei</comment>
+ <comment xml:lang="da">Mathematica Notebook-fil</comment>
+ <comment xml:lang="ca">llibreta de Mathematica Notebook</comment>
+ <comment xml:lang="bg">Скицник — Mathematica</comment>
+ <comment xml:lang="be">файл Mathematica Notebook</comment>
+ <comment xml:lang="ar">ملف دفتر ماثماتيكا</comment>
<sub-class-of type="text/plain"/>
<generic-icon name="x-office-document"/>
<glob pattern="*.nb"/>
- <magic priority="50">
+ <magic>
<match value="(************** Content-type: application/mathematica" type="string" offset="0"/>
<match value="This notebook can be used on any computer system with Mathematica" type="string" offset="100:256"/>
<match value="This is a Mathematica Notebook file. It contains ASCII text" type="string" offset="10:256"/>
@@ -458,60 +494,63 @@ command to generate the output files.
</mime-type>
<mime-type type="application/mathml+xml">
<comment>MathML document</comment>
- <comment xml:lang="af">MathML-dokument</comment>
- <comment xml:lang="ar">مستند MathML</comment>
- <comment xml:lang="ast">Documentu MathML</comment>
- <comment xml:lang="az">MathML sənədi</comment>
- <comment xml:lang="be-Latn">Dakument MathML</comment>
- <comment xml:lang="bg">Документ — MathML</comment>
- <comment xml:lang="ca">document MathML</comment>
- <comment xml:lang="cs">dokument MathML</comment>
- <comment xml:lang="cy">Dogfen MathML</comment>
- <comment xml:lang="da">MathML-dokument</comment>
- <comment xml:lang="de">MathML-Dokument</comment>
- <comment xml:lang="el">Έγγραφο MathML</comment>
- <comment xml:lang="en-GB">MathML document</comment>
- <comment xml:lang="eo">MathML-dokumento</comment>
- <comment xml:lang="es">documento MathML</comment>
- <comment xml:lang="eu">MathML dokumentua</comment>
- <comment xml:lang="fi">MathML-asiakirja</comment>
- <comment xml:lang="fo">MathML skjal</comment>
- <comment xml:lang="fr">document MathML</comment>
- <comment xml:lang="fur">document MathML</comment>
- <comment xml:lang="ga">cáipéis MathML</comment>
- <comment xml:lang="gl">documento de MathML</comment>
- <comment xml:lang="he">מסמך MathML</comment>
- <comment xml:lang="hr">MathML dokument</comment>
- <comment xml:lang="hu">MathML-dokumentum</comment>
- <comment xml:lang="ia">Documento MathML</comment>
- <comment xml:lang="id">Dokumen MathML</comment>
- <comment xml:lang="it">Documento MathML</comment>
- <comment xml:lang="ja">MathML ドキュメント</comment>
- <comment xml:lang="ka">MathML-ის დოკუმენტი</comment>
- <comment xml:lang="kk">MathML құжаты</comment>
- <comment xml:lang="ko">MathML 문서</comment>
- <comment xml:lang="lt">MathML dokumentas</comment>
- <comment xml:lang="lv">MathML dokuments</comment>
- <comment xml:lang="ms">Dokumen MathML</comment>
- <comment xml:lang="nb">MathML-dokument</comment>
- <comment xml:lang="nl">MathML-document</comment>
- <comment xml:lang="nn">MathML-dokument</comment>
- <comment xml:lang="oc">document MathML</comment>
- <comment xml:lang="pl">Dokument MathML</comment>
- <comment xml:lang="pt">documento MathML</comment>
- <comment xml:lang="pt-BR">Documento do MathML</comment>
- <comment xml:lang="ro">Document MathML</comment>
- <comment xml:lang="ru">Документ MathML</comment>
- <comment xml:lang="sk">Dokument MathML</comment>
- <comment xml:lang="sl">Dokument MathML</comment>
- <comment xml:lang="sq">Dokument MathML</comment>
- <comment xml:lang="sr">МатМЛ документ</comment>
- <comment xml:lang="sv">MathML-dokument</comment>
- <comment xml:lang="tr">MathML belgesi</comment>
- <comment xml:lang="uk">документ MathML</comment>
+ <comment xml:lang="zh_TW">MathML 文件</comment>
+ <comment xml:lang="zh_CN">MathML 文档</comment>
<comment xml:lang="vi">Tài liệu MathML</comment>
- <comment xml:lang="zh-CN">MathML 文档</comment>
- <comment xml:lang="zh-TW">MathML 文件</comment>
+ <comment xml:lang="uk">документ MathML</comment>
+ <comment xml:lang="tr">MathML belgesi</comment>
+ <comment xml:lang="sv">MathML-dokument</comment>
+ <comment xml:lang="sr">МатМЛ документ</comment>
+ <comment xml:lang="sq">dokument MathML</comment>
+ <comment xml:lang="sl">Dokument MathML</comment>
+ <comment xml:lang="si">MathML ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument MathML</comment>
+ <comment xml:lang="ru">Документ MathML</comment>
+ <comment xml:lang="ro">Document MathML</comment>
+ <comment xml:lang="pt_BR">Documento do MathML</comment>
+ <comment xml:lang="pt">documento MathML</comment>
+ <comment xml:lang="pl">Dokument MathML</comment>
+ <comment xml:lang="oc">document MathML</comment>
+ <comment xml:lang="nn">MathML-dokument</comment>
+ <comment xml:lang="nl">MathML-document</comment>
+ <comment xml:lang="nb">MathML-dokument</comment>
+ <comment xml:lang="ms">Dokumen MathML</comment>
+ <comment xml:lang="lv">MathML dokuments</comment>
+ <comment xml:lang="lt">MathML dokumentas</comment>
+ <comment xml:lang="ko">MathML 문서</comment>
+ <comment xml:lang="kk">MathML құжаты</comment>
+ <comment xml:lang="ka">MathML-ის დოკუმენტი</comment>
+ <comment xml:lang="ja">MathML ドキュメント</comment>
+ <comment xml:lang="it">Documento MathML</comment>
+ <comment xml:lang="is">MathML skjal</comment>
+ <comment xml:lang="id">Dokumen MathML</comment>
+ <comment xml:lang="ia">Documento MathML</comment>
+ <comment xml:lang="hu">MathML-dokumentum</comment>
+ <comment xml:lang="hr">MathML dokument</comment>
+ <comment xml:lang="he">מסמך MathML</comment>
+ <comment xml:lang="gl">documento de MathML</comment>
+ <comment xml:lang="ga">cáipéis MathML</comment>
+ <comment xml:lang="fur">document MathML</comment>
+ <comment xml:lang="fr">document MathML</comment>
+ <comment xml:lang="fo">MathML skjal</comment>
+ <comment xml:lang="fi">MathML-asiakirja</comment>
+ <comment xml:lang="eu">MathML dokumentua</comment>
+ <comment xml:lang="es">documento MathML</comment>
+ <comment xml:lang="eo">MathML-dokumento</comment>
+ <comment xml:lang="en_GB">MathML document</comment>
+ <comment xml:lang="el">Έγγραφο MathML</comment>
+ <comment xml:lang="de">MathML-Dokument</comment>
+ <comment xml:lang="da">MathML-dokument</comment>
+ <comment xml:lang="cy">Dogfen MathML</comment>
+ <comment xml:lang="cs">dokument MathML</comment>
+ <comment xml:lang="ca">document MathML</comment>
+ <comment xml:lang="bg">Документ — MathML</comment>
+ <comment xml:lang="be@latin">Dakument MathML</comment>
+ <comment xml:lang="be">дакумент MathML</comment>
+ <comment xml:lang="az">MathML sənədi</comment>
+ <comment xml:lang="ast">Documentu MathML</comment>
+ <comment xml:lang="ar">مستند MathML</comment>
+ <comment xml:lang="af">MathML-dokument</comment>
<acronym>MathML</acronym>
<expanded-acronym>Mathematical Markup Language</expanded-acronym>
<alias type="text/mathml"/>
@@ -520,55 +559,20 @@ command to generate the output files.
<root-XML namespaceURI="http://www.w3.org/1998/Math/MathML" localName="math"/>
</mime-type>
<mime-type type="application/mbox">
- <comment>mailbox file</comment>
- <comment xml:lang="af">mailbox-lêer</comment>
- <comment xml:lang="ar">ملف صندوق البريد</comment>
- <comment xml:lang="be-Latn">fajł paštovaj skryni</comment>
- <comment xml:lang="bg">Файл — Mailbox</comment>
- <comment xml:lang="ca">fitxer mailbox</comment>
- <comment xml:lang="cs">soubor mailbox</comment>
- <comment xml:lang="da">postkassefil</comment>
- <comment xml:lang="de">Mailbox-Datei</comment>
- <comment xml:lang="el">Αρχείο mailbox</comment>
- <comment xml:lang="en-GB">mailbox file</comment>
- <comment xml:lang="es">archivo de buzón de correo</comment>
- <comment xml:lang="eu">mailbox fitxategia</comment>
- <comment xml:lang="fi">mailbox-tiedosto</comment>
- <comment xml:lang="fo">postkassafíla</comment>
- <comment xml:lang="fr">fichier boîte aux lettres</comment>
- <comment xml:lang="fur">file mailbox</comment>
- <comment xml:lang="ga">comhad bhosca poist</comment>
- <comment xml:lang="gl">ficheiro de caixa de correo</comment>
- <comment xml:lang="he">קובץ תיבת-דואר</comment>
- <comment xml:lang="hr">Datoteka poštanskog sandučića</comment>
- <comment xml:lang="hu">mailbox fájl</comment>
- <comment xml:lang="ia">File de cassa postal</comment>
- <comment xml:lang="id">berkas kotak surat</comment>
- <comment xml:lang="it">File mailbox</comment>
- <comment xml:lang="ja">メールボックスファイル</comment>
- <comment xml:lang="kk">пошта жәшігінің файлы</comment>
- <comment xml:lang="ko">메일함 파일</comment>
- <comment xml:lang="lt">pašto dėžutės failas</comment>
- <comment xml:lang="lv">pastkastītes datne</comment>
- <comment xml:lang="nb">postboksfil</comment>
- <comment xml:lang="nl">mailbox-bestand</comment>
- <comment xml:lang="nn">mailbox-fil</comment>
- <comment xml:lang="oc">fichièr bóstia de letras</comment>
- <comment xml:lang="pl">Plik poczty (Mailbox)</comment>
- <comment xml:lang="pt">ficheiro de caixa de correio</comment>
- <comment xml:lang="pt-BR">Arquivo de caixa de correio</comment>
- <comment xml:lang="ro">fișier căsuță poștală</comment>
- <comment xml:lang="ru">Файл почтового ящика</comment>
- <comment xml:lang="sk">Súbor mailbox</comment>
- <comment xml:lang="sl">datoteka poštnega predala</comment>
- <comment xml:lang="sq">File mailbox</comment>
- <comment xml:lang="sr">датотека поштанског сандучета</comment>
- <comment xml:lang="sv">brevlådefil</comment>
- <comment xml:lang="tr">mailbox dosyası</comment>
+ <comment>Mailbox file</comment>
<comment xml:lang="uk">файл поштової скриньки</comment>
- <comment xml:lang="vi">tập tin hộp thư</comment>
- <comment xml:lang="zh-CN">邮箱文件</comment>
- <comment xml:lang="zh-TW">郵箱檔</comment>
+ <comment xml:lang="sv">Brevlådefil</comment>
+ <comment xml:lang="sq">Kartelë kutie email-esh</comment>
+ <comment xml:lang="ru">Файл почтового ящика</comment>
+ <comment xml:lang="pt_BR">Arquivo de caixa de correio</comment>
+ <comment xml:lang="pl">Plik poczty (Mailbox)</comment>
+ <comment xml:lang="ja">電子郵便</comment>
+ <comment xml:lang="it">File mailbox</comment>
+ <comment xml:lang="gl">Ficheiro Mailbox</comment>
+ <comment xml:lang="eu">Mailbox fitxategia</comment>
+ <comment xml:lang="es">archivo de buzón de correo</comment>
+ <comment xml:lang="de">Mailbox-Datei</comment>
+ <comment xml:lang="be">файл паштовай скрынкі</comment>
<generic-icon name="text-x-generic"/>
<sub-class-of type="text/plain"/>
<magic priority="20">
@@ -578,53 +582,58 @@ command to generate the output files.
</mime-type>
<mime-type type="application/metalink+xml">
<comment>Metalink file</comment>
- <comment xml:lang="af">Metalink-lêer</comment>
- <comment xml:lang="ar">ملف ميتالنك</comment>
- <comment xml:lang="ast">Ficheru d'enllaz meta</comment>
- <comment xml:lang="bg">Изтегляне — Metalink</comment>
- <comment xml:lang="ca">fitxer Metalink</comment>
- <comment xml:lang="cs">soubor metalink</comment>
- <comment xml:lang="da">Metahenvisningsfil</comment>
- <comment xml:lang="de">Metalink-Datei</comment>
- <comment xml:lang="el">Αρχείο Metalink</comment>
- <comment xml:lang="en-GB">Metalink file</comment>
- <comment xml:lang="eo">Metalink-dosiero</comment>
- <comment xml:lang="es">archivo de Metalink</comment>
- <comment xml:lang="eu">Metaestekaren fitxategia</comment>
- <comment xml:lang="fi">Metalink-tiedosto</comment>
- <comment xml:lang="fo">Metalink fíla</comment>
- <comment xml:lang="fr">fichier metalink</comment>
- <comment xml:lang="fur">file Metalink</comment>
- <comment xml:lang="ga">comhad Metalink</comment>
- <comment xml:lang="gl">ficheiro Metalink</comment>
- <comment xml:lang="he">קובץ Metalink</comment>
- <comment xml:lang="hr">Datoteka meta poveznice</comment>
- <comment xml:lang="hu">Metalink fájl</comment>
- <comment xml:lang="ia">File Metalink</comment>
- <comment xml:lang="id">Berkas Metalink</comment>
- <comment xml:lang="it">File Metalink</comment>
- <comment xml:lang="ja">Metalink ファイル</comment>
- <comment xml:lang="kk">Metalink файлы</comment>
- <comment xml:lang="ko">Metalink 파일</comment>
- <comment xml:lang="lt">Metalink failas</comment>
- <comment xml:lang="lv">Metalink datne</comment>
- <comment xml:lang="nl">Metalink bestand</comment>
- <comment xml:lang="oc">fichièr metalink</comment>
- <comment xml:lang="pl">Plik Metalink</comment>
- <comment xml:lang="pt">ficheiro Metalink</comment>
- <comment xml:lang="pt-BR">Arquivo Metalink</comment>
- <comment xml:lang="ro">Fișier Metalink</comment>
- <comment xml:lang="ru">Файл Metalink</comment>
- <comment xml:lang="sk">Súbor Metalink</comment>
- <comment xml:lang="sl">Datoteka povezave Metalink</comment>
- <comment xml:lang="sr">датотека метавезе</comment>
- <comment xml:lang="sv">Metalink-fil</comment>
- <comment xml:lang="tr">Metalink dosyası</comment>
+ <comment xml:lang="zh_TW">Metalink 檔案</comment>
+ <comment xml:lang="zh_CN">Metalink 文件</comment>
<comment xml:lang="uk">файл метапосилання</comment>
- <comment xml:lang="zh-CN">Metalink 文件</comment>
- <comment xml:lang="zh-TW">Metalink 檔案</comment>
+ <comment xml:lang="tr">Metalink dosyası</comment>
+ <comment xml:lang="sv">Metalink-fil</comment>
+ <comment xml:lang="sr">датотека метавезе</comment>
+ <comment xml:lang="sq">kartelë Metalink</comment>
+ <comment xml:lang="sl">Datoteka povezave Metalink</comment>
+ <comment xml:lang="si">Metalink ගොනුව</comment>
+ <comment xml:lang="sk">Súbor Metalink</comment>
+ <comment xml:lang="ru">Файл Metalink</comment>
+ <comment xml:lang="ro">Fișier Metalink</comment>
+ <comment xml:lang="pt_BR">Arquivo Metalink</comment>
+ <comment xml:lang="pt">ficheiro Metalink</comment>
+ <comment xml:lang="pl">Plik Metalink</comment>
+ <comment xml:lang="oc">fichièr metalink</comment>
+ <comment xml:lang="nl">Metalink-bestand</comment>
+ <comment xml:lang="lv">Metalink datne</comment>
+ <comment xml:lang="lt">Metalink failas</comment>
+ <comment xml:lang="ko">Metalink 파일</comment>
+ <comment xml:lang="kk">Metalink файлы</comment>
+ <comment xml:lang="ka">მეტაბმულის ფაილი</comment>
+ <comment xml:lang="ja">Metalink ファイル</comment>
+ <comment xml:lang="it">File Metalink</comment>
+ <comment xml:lang="is">Metalink skrá</comment>
+ <comment xml:lang="id">Berkas Metalink</comment>
+ <comment xml:lang="ia">File Metalink</comment>
+ <comment xml:lang="hu">Metalink fájl</comment>
+ <comment xml:lang="hr">Datoteka meta poveznice</comment>
+ <comment xml:lang="he">קובץ Metalink</comment>
+ <comment xml:lang="gl">ficheiro Metalink</comment>
+ <comment xml:lang="ga">comhad Metalink</comment>
+ <comment xml:lang="fur">file Metalink</comment>
+ <comment xml:lang="fr">fichier metalink</comment>
+ <comment xml:lang="fo">Metalink fíla</comment>
+ <comment xml:lang="fi">Metalink-tiedosto</comment>
+ <comment xml:lang="eu">Metaestekaren fitxategia</comment>
+ <comment xml:lang="es">archivo de Metalink</comment>
+ <comment xml:lang="eo">Metalink-dosiero</comment>
+ <comment xml:lang="en_GB">Metalink file</comment>
+ <comment xml:lang="el">Αρχείο Metalink</comment>
+ <comment xml:lang="de">Metalink-Datei</comment>
+ <comment xml:lang="da">Metahenvisningsfil</comment>
+ <comment xml:lang="cs">soubor metalink</comment>
+ <comment xml:lang="ca">fitxer Metalink</comment>
+ <comment xml:lang="bg">Изтегляне — Metalink</comment>
+ <comment xml:lang="be">файл Metalink</comment>
+ <comment xml:lang="ast">Ficheru d'enllaz meta</comment>
+ <comment xml:lang="ar">ملف ميتالنك</comment>
+ <comment xml:lang="af">Metalink-lêer</comment>
<sub-class-of type="application/xml"/>
- <magic priority="50">
+ <magic>
<match type="string" value="&lt;metalink version=&quot;3.0&quot;" offset="0:256"/>
</magic>
<glob pattern="*.metalink"/>
@@ -632,153 +641,128 @@ command to generate the output files.
</mime-type>
<mime-type type="application/metalink4+xml">
<comment>Metalink file</comment>
- <comment xml:lang="af">Metalink-lêer</comment>
- <comment xml:lang="ar">ملف ميتالنك</comment>
- <comment xml:lang="ast">Ficheru d'enllaz meta</comment>
- <comment xml:lang="bg">Изтегляне — Metalink</comment>
- <comment xml:lang="ca">fitxer Metalink</comment>
- <comment xml:lang="cs">soubor metalink</comment>
- <comment xml:lang="da">Metahenvisningsfil</comment>
- <comment xml:lang="de">Metalink-Datei</comment>
- <comment xml:lang="el">Αρχείο Metalink</comment>
- <comment xml:lang="en-GB">Metalink file</comment>
- <comment xml:lang="eo">Metalink-dosiero</comment>
- <comment xml:lang="es">archivo de Metalink</comment>
- <comment xml:lang="eu">Metaestekaren fitxategia</comment>
- <comment xml:lang="fi">Metalink-tiedosto</comment>
- <comment xml:lang="fo">Metalink fíla</comment>
- <comment xml:lang="fr">fichier metalink</comment>
- <comment xml:lang="fur">file Metalink</comment>
- <comment xml:lang="ga">comhad Metalink</comment>
- <comment xml:lang="gl">ficheiro Metalink</comment>
- <comment xml:lang="he">קובץ Metalink</comment>
- <comment xml:lang="hr">Datoteka meta poveznice</comment>
- <comment xml:lang="hu">Metalink fájl</comment>
- <comment xml:lang="ia">File Metalink</comment>
- <comment xml:lang="id">Berkas Metalink</comment>
- <comment xml:lang="it">File Metalink</comment>
- <comment xml:lang="ja">Metalink ファイル</comment>
- <comment xml:lang="kk">Metalink файлы</comment>
- <comment xml:lang="ko">Metalink 파일</comment>
- <comment xml:lang="lt">Metalink failas</comment>
- <comment xml:lang="lv">Metalink datne</comment>
- <comment xml:lang="nl">Metalink bestand</comment>
- <comment xml:lang="oc">fichièr metalink</comment>
- <comment xml:lang="pl">Plik Metalink</comment>
- <comment xml:lang="pt">ficheiro Metalink</comment>
- <comment xml:lang="pt-BR">Arquivo Metalink</comment>
- <comment xml:lang="ro">Fișier Metalink</comment>
- <comment xml:lang="ru">Файл Metalink</comment>
- <comment xml:lang="sk">Súbor Metalink</comment>
- <comment xml:lang="sl">Datoteka povezave Metalink</comment>
- <comment xml:lang="sr">датотека метавезе</comment>
- <comment xml:lang="sv">Metalink-fil</comment>
- <comment xml:lang="tr">Metalink dosyası</comment>
+ <comment xml:lang="zh_TW">Metalink 檔案</comment>
+ <comment xml:lang="zh_CN">Metalink 文件</comment>
<comment xml:lang="uk">файл метапосилання</comment>
- <comment xml:lang="zh-CN">Metalink 文件</comment>
- <comment xml:lang="zh-TW">Metalink 檔案</comment>
+ <comment xml:lang="tr">Metalink dosyası</comment>
+ <comment xml:lang="sv">Metalink-fil</comment>
+ <comment xml:lang="sr">датотека метавезе</comment>
+ <comment xml:lang="sq">kartelë Metalink</comment>
+ <comment xml:lang="sl">Datoteka povezave Metalink</comment>
+ <comment xml:lang="si">Metalink ගොනුව</comment>
+ <comment xml:lang="sk">Súbor Metalink</comment>
+ <comment xml:lang="ru">Файл Metalink</comment>
+ <comment xml:lang="ro">Fișier Metalink</comment>
+ <comment xml:lang="pt_BR">Arquivo Metalink</comment>
+ <comment xml:lang="pt">ficheiro Metalink</comment>
+ <comment xml:lang="pl">Plik Metalink</comment>
+ <comment xml:lang="oc">fichièr metalink</comment>
+ <comment xml:lang="nl">Metalink-bestand</comment>
+ <comment xml:lang="lv">Metalink datne</comment>
+ <comment xml:lang="lt">Metalink failas</comment>
+ <comment xml:lang="ko">Metalink 파일</comment>
+ <comment xml:lang="kk">Metalink файлы</comment>
+ <comment xml:lang="ka">მეტაბმულის ფაილი</comment>
+ <comment xml:lang="ja">Metalink ファイル</comment>
+ <comment xml:lang="it">File Metalink</comment>
+ <comment xml:lang="is">Metalink skrá</comment>
+ <comment xml:lang="id">Berkas Metalink</comment>
+ <comment xml:lang="ia">File Metalink</comment>
+ <comment xml:lang="hu">Metalink fájl</comment>
+ <comment xml:lang="hr">Datoteka meta poveznice</comment>
+ <comment xml:lang="he">קובץ Metalink</comment>
+ <comment xml:lang="gl">ficheiro Metalink</comment>
+ <comment xml:lang="ga">comhad Metalink</comment>
+ <comment xml:lang="fur">file Metalink</comment>
+ <comment xml:lang="fr">fichier metalink</comment>
+ <comment xml:lang="fo">Metalink fíla</comment>
+ <comment xml:lang="fi">Metalink-tiedosto</comment>
+ <comment xml:lang="eu">Metaestekaren fitxategia</comment>
+ <comment xml:lang="es">archivo de Metalink</comment>
+ <comment xml:lang="eo">Metalink-dosiero</comment>
+ <comment xml:lang="en_GB">Metalink file</comment>
+ <comment xml:lang="el">Αρχείο Metalink</comment>
+ <comment xml:lang="de">Metalink-Datei</comment>
+ <comment xml:lang="da">Metahenvisningsfil</comment>
+ <comment xml:lang="cs">soubor metalink</comment>
+ <comment xml:lang="ca">fitxer Metalink</comment>
+ <comment xml:lang="bg">Изтегляне — Metalink</comment>
+ <comment xml:lang="be">файл Metalink</comment>
+ <comment xml:lang="ast">Ficheru d'enllaz meta</comment>
+ <comment xml:lang="ar">ملف ميتالنك</comment>
+ <comment xml:lang="af">Metalink-lêer</comment>
<sub-class-of type="application/xml"/>
- <magic priority="50">
+ <magic>
<match type="string" value="&lt;metalink xmlns=&quot;urn" offset="0:256"/>
</magic>
<glob pattern="*.meta4"/>
<root-XML namespaceURI="urn:ietf:params:xml:ns:metalink" localName="metalink"/>
</mime-type>
<mime-type type="application/octet-stream">
- <comment>unknown</comment>
- <comment xml:lang="af">onbekend</comment>
- <comment xml:lang="ar">مجهول</comment>
- <comment xml:lang="ast">desconozse</comment>
- <comment xml:lang="be-Latn">nieviadomy</comment>
- <comment xml:lang="bg">Неизвестен тип</comment>
- <comment xml:lang="ca">desconegut</comment>
- <comment xml:lang="cs">neznámý</comment>
- <comment xml:lang="da">ukendt</comment>
- <comment xml:lang="de">unbekannt</comment>
- <comment xml:lang="el">Άγνωστο</comment>
- <comment xml:lang="en-GB">unknown</comment>
- <comment xml:lang="eo">nekonate</comment>
- <comment xml:lang="es">desconocido</comment>
- <comment xml:lang="eu">ezezaguna</comment>
- <comment xml:lang="fi">tuntematon</comment>
- <comment xml:lang="fo">ókent</comment>
- <comment xml:lang="fr">inconnu</comment>
- <comment xml:lang="fur">no cognossût</comment>
- <comment xml:lang="ga">anaithnid</comment>
- <comment xml:lang="gl">descoñecido</comment>
- <comment xml:lang="he">לא ידוע</comment>
- <comment xml:lang="hr">Nepoznato</comment>
- <comment xml:lang="hu">ismeretlen</comment>
- <comment xml:lang="ia">incognite</comment>
- <comment xml:lang="id">tak diketahui</comment>
- <comment xml:lang="it">Sconosciuto</comment>
- <comment xml:lang="ja">不明</comment>
- <comment xml:lang="ka">უცნობი</comment>
- <comment xml:lang="kk">белгісіз</comment>
- <comment xml:lang="ko">알 수 없음</comment>
- <comment xml:lang="lt">nežinoma</comment>
- <comment xml:lang="lv">nezināms</comment>
- <comment xml:lang="ms">Entah</comment>
- <comment xml:lang="nb">ukjent</comment>
- <comment xml:lang="nl">onbekend</comment>
- <comment xml:lang="nn">ukjend</comment>
- <comment xml:lang="oc">desconegut</comment>
- <comment xml:lang="pl">Nieznany typ</comment>
- <comment xml:lang="pt">desconhecido</comment>
- <comment xml:lang="pt-BR">Desconhecido</comment>
- <comment xml:lang="ro">necunoscut</comment>
+ <comment>Unknown</comment>
+ <comment xml:lang="zh_TW">未知</comment>
+ <comment xml:lang="uk">невідомий</comment>
+ <comment xml:lang="sv">Okänd</comment>
+ <comment xml:lang="sq">I panjohur</comment>
<comment xml:lang="ru">Неизвестно</comment>
- <comment xml:lang="sk">Neznámy</comment>
- <comment xml:lang="sl">neznano</comment>
- <comment xml:lang="sq">Nuk njihet</comment>
- <comment xml:lang="sr">непознато</comment>
- <comment xml:lang="sv">okänd</comment>
- <comment xml:lang="tr">bilinmeyen</comment>
- <comment xml:lang="uk">невідомо</comment>
- <comment xml:lang="vi">không rõ</comment>
- <comment xml:lang="zh-CN">未知</comment>
- <comment xml:lang="zh-TW">不明</comment>
+ <comment xml:lang="pt_BR">Desconhecido</comment>
+ <comment xml:lang="pl">Nieznany typ</comment>
+ <comment xml:lang="ja">不明</comment>
+ <comment xml:lang="it">Sconosciuto</comment>
+ <comment xml:lang="gl">Descoñecido</comment>
+ <comment xml:lang="eu">Ezezaguna</comment>
+ <comment xml:lang="es">desconocido</comment>
+ <comment xml:lang="de">Unbekannt</comment>
+ <comment xml:lang="be">невядома</comment>
</mime-type>
<mime-type type="application/x-partial-download">
<comment>Partially downloaded file</comment>
- <comment xml:lang="af">Gedeeltelik afgelaaide lêer</comment>
- <comment xml:lang="ast">Ficheru baxáu parcialmente</comment>
- <comment xml:lang="bg">Частично изтеглен файл</comment>
- <comment xml:lang="ca">fitxer baixat parcialment</comment>
- <comment xml:lang="cs">částečně stažený soubor</comment>
- <comment xml:lang="da">Delvist downloadet fil</comment>
- <comment xml:lang="de">Teilweise heruntergeladene Datei</comment>
- <comment xml:lang="el">Μερικώς ληφθέντο αρχείο</comment>
- <comment xml:lang="en-GB">Partially downloaded file</comment>
- <comment xml:lang="es">archivo descargado parcialmente</comment>
- <comment xml:lang="eu">Partzialki deskargatutako fitxategia</comment>
- <comment xml:lang="fi">Osittain ladattu tiedosto</comment>
- <comment xml:lang="fr">fichier partiellement téléchargé</comment>
- <comment xml:lang="fur">file no discjariât dal dut</comment>
- <comment xml:lang="ga">Comhad leath-íoslódáilte</comment>
- <comment xml:lang="gl">Ficheiro descargado parcialmente</comment>
- <comment xml:lang="he">קובץ שהתקבל חלקית</comment>
- <comment xml:lang="hr">Djelomično preuzeta datoteka</comment>
- <comment xml:lang="hu">Részben letöltött fájl</comment>
- <comment xml:lang="ia">File partialmente discargate</comment>
- <comment xml:lang="id">Berkas yang terunduh sebagian</comment>
- <comment xml:lang="it">File parzialmente scaricato</comment>
- <comment xml:lang="kk">Жартылай жүктелген файл</comment>
- <comment xml:lang="ko">일부 다운로드한 파일</comment>
- <comment xml:lang="lt">Dalinai atsiųstas failas</comment>
- <comment xml:lang="oc">fichièr parcialament telecargat</comment>
- <comment xml:lang="pl">Częściowo pobrany plik</comment>
- <comment xml:lang="pt">ficheiro descarregado parcialmente</comment>
- <comment xml:lang="pt-BR">Arquivo baixado parcialmente</comment>
- <comment xml:lang="ru">Частично загруженный файл</comment>
- <comment xml:lang="sk">Čiastočne stiahnutý súbor</comment>
- <comment xml:lang="sl">Delno prenesena datoteka</comment>
- <comment xml:lang="sr">делимично преузета датотека</comment>
- <comment xml:lang="sv">Delvis hämtad fil</comment>
- <comment xml:lang="tr">Kısmen indirilmiş dosya</comment>
+ <comment xml:lang="zh_TW">已部份下載的檔案</comment>
+ <comment xml:lang="zh_CN">部分下载的文件</comment>
<comment xml:lang="uk">частково отриманий файл</comment>
- <comment xml:lang="zh-CN">部分下载的文件</comment>
- <comment xml:lang="zh-TW">已部份下載的檔案</comment>
+ <comment xml:lang="tr">Kısmen indirilmiş dosya</comment>
+ <comment xml:lang="sv">Delvis hämtad fil</comment>
+ <comment xml:lang="sr">делимично преузета датотека</comment>
+ <comment xml:lang="sq">Kartelë e shkarkuar pjesërisht</comment>
+ <comment xml:lang="sl">Delno prenesena datoteka</comment>
+ <comment xml:lang="si">අර්ධ වශයෙන් බාගත කළ ගොනුව</comment>
+ <comment xml:lang="sk">Čiastočne stiahnutý súbor</comment>
+ <comment xml:lang="ru">Частично загруженный файл</comment>
+ <comment xml:lang="pt_BR">Arquivo baixado parcialmente</comment>
+ <comment xml:lang="pt">ficheiro descarregado parcialmente</comment>
+ <comment xml:lang="pl">Częściowo pobrany plik</comment>
+ <comment xml:lang="oc">fichièr parcialament telecargat</comment>
+ <comment xml:lang="nl">Gedeeltelijk gedownload bestand</comment>
+ <comment xml:lang="lt">Dalinai atsiųstas failas</comment>
+ <comment xml:lang="ko">일부 다운로드한 파일</comment>
+ <comment xml:lang="kk">Жартылай жүктелген файл</comment>
+ <comment xml:lang="ka">ნაწილობრივ გადმოწერილი ფაილი</comment>
+ <comment xml:lang="ja">部分的にダウンロードされたファイル</comment>
+ <comment xml:lang="it">File parzialmente scaricato</comment>
+ <comment xml:lang="is">skrá sótt að hluta</comment>
+ <comment xml:lang="id">Berkas yang terunduh sebagian</comment>
+ <comment xml:lang="ia">File partialmente discargate</comment>
+ <comment xml:lang="hu">Részben letöltött fájl</comment>
+ <comment xml:lang="hr">Djelomično preuzeta datoteka</comment>
+ <comment xml:lang="he">קובץ שהתקבל חלקית</comment>
+ <comment xml:lang="gl">Ficheiro descargado parcialmente</comment>
+ <comment xml:lang="ga">Comhad leath-íoslódáilte</comment>
+ <comment xml:lang="fur">file no discjariât dal dut</comment>
+ <comment xml:lang="fr">fichier partiellement téléchargé</comment>
+ <comment xml:lang="fi">Osittain ladattu tiedosto</comment>
+ <comment xml:lang="eu">Partzialki deskargatutako fitxategia</comment>
+ <comment xml:lang="es">archivo descargado parcialmente</comment>
+ <comment xml:lang="en_GB">Partially downloaded file</comment>
+ <comment xml:lang="el">Μερικώς ληφθέντο αρχείο</comment>
+ <comment xml:lang="de">Teilweise heruntergeladene Datei</comment>
+ <comment xml:lang="da">Delvist downloadet fil</comment>
+ <comment xml:lang="cs">částečně stažený soubor</comment>
+ <comment xml:lang="ca">fitxer baixat parcialment</comment>
+ <comment xml:lang="bg">Частично изтеглен файл</comment>
+ <comment xml:lang="be">часткова спампаваны файл</comment>
+ <comment xml:lang="ast">Ficheru baxáu parcialmente</comment>
+ <comment xml:lang="ar">ملف منزل جزئياً</comment>
+ <comment xml:lang="af">Gedeeltelik afgelaaide lêer</comment>
<generic-icon name="package-x-generic"/>
<glob pattern="*.wkdownload"/>
<glob pattern="*.crdownload"/>
@@ -786,60 +770,63 @@ command to generate the output files.
</mime-type>
<mime-type type="application/oda">
<comment>ODA document</comment>
- <comment xml:lang="af">ODA-dokument</comment>
- <comment xml:lang="ar">مستند ODA</comment>
- <comment xml:lang="ast">Documentu ODA</comment>
- <comment xml:lang="az">ODA sənədi</comment>
- <comment xml:lang="be-Latn">Dakument ODA</comment>
- <comment xml:lang="bg">Документ — ODA</comment>
- <comment xml:lang="ca">document ODA</comment>
- <comment xml:lang="cs">dokument ODA</comment>
- <comment xml:lang="cy">Dogfen ODA</comment>
- <comment xml:lang="da">ODA-dokument</comment>
- <comment xml:lang="de">ODA-Dokument</comment>
- <comment xml:lang="el">Έγγραφο ODA</comment>
- <comment xml:lang="en-GB">ODA document</comment>
- <comment xml:lang="eo">ODA-dokumento</comment>
- <comment xml:lang="es">documento ODA</comment>
- <comment xml:lang="eu">ODA dokumentua</comment>
- <comment xml:lang="fi">ODA-asiakirja</comment>
- <comment xml:lang="fo">ODA skjal</comment>
- <comment xml:lang="fr">document ODA</comment>
- <comment xml:lang="fur">document ODA</comment>
- <comment xml:lang="ga">cáipéis ODA</comment>
- <comment xml:lang="gl">documento ODA</comment>
- <comment xml:lang="he">מסמך ODA</comment>
- <comment xml:lang="hr">ODA dokument</comment>
- <comment xml:lang="hu">ODA-dokumentum</comment>
- <comment xml:lang="ia">Documento ODA</comment>
- <comment xml:lang="id">Dokumen ODA</comment>
- <comment xml:lang="it">Documento ODA</comment>
- <comment xml:lang="ja">ODA ドキュメント</comment>
- <comment xml:lang="ka">ODA დოკუმენტი</comment>
- <comment xml:lang="kk">ODA құжаты</comment>
- <comment xml:lang="ko">ODA 문서</comment>
- <comment xml:lang="lt">ODA dokumentas</comment>
- <comment xml:lang="lv">ODA dokuments</comment>
- <comment xml:lang="ms">Dokumen ODA</comment>
- <comment xml:lang="nb">ODA-dokument</comment>
- <comment xml:lang="nl">ODA-document</comment>
- <comment xml:lang="nn">ODA-dokument</comment>
- <comment xml:lang="oc">document ODA</comment>
- <comment xml:lang="pl">Dokument ODA</comment>
- <comment xml:lang="pt">documento ODA</comment>
- <comment xml:lang="pt-BR">Documento ODA</comment>
- <comment xml:lang="ro">Document ODA</comment>
- <comment xml:lang="ru">Документ ODA</comment>
- <comment xml:lang="sk">Dokument ODA</comment>
- <comment xml:lang="sl">Dokument ODA</comment>
- <comment xml:lang="sq">Dokument ODA</comment>
- <comment xml:lang="sr">ОДА документ</comment>
- <comment xml:lang="sv">ODA-dokument</comment>
- <comment xml:lang="tr">ODA belgesi</comment>
- <comment xml:lang="uk">документ ODA</comment>
+ <comment xml:lang="zh_TW">ODA 文件</comment>
+ <comment xml:lang="zh_CN">ODA 文档</comment>
<comment xml:lang="vi">Tài liệu ODA</comment>
- <comment xml:lang="zh-CN">ODA 文档</comment>
- <comment xml:lang="zh-TW">ODA 文件</comment>
+ <comment xml:lang="uk">документ ODA</comment>
+ <comment xml:lang="tr">ODA belgesi</comment>
+ <comment xml:lang="sv">ODA-dokument</comment>
+ <comment xml:lang="sr">ОДА документ</comment>
+ <comment xml:lang="sq">dokument ODA</comment>
+ <comment xml:lang="sl">Dokument ODA</comment>
+ <comment xml:lang="si">ODA ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument ODA</comment>
+ <comment xml:lang="ru">Документ ODA</comment>
+ <comment xml:lang="ro">Document ODA</comment>
+ <comment xml:lang="pt_BR">Documento ODA</comment>
+ <comment xml:lang="pt">documento ODA</comment>
+ <comment xml:lang="pl">Dokument ODA</comment>
+ <comment xml:lang="oc">document ODA</comment>
+ <comment xml:lang="nn">ODA-dokument</comment>
+ <comment xml:lang="nl">ODA-document</comment>
+ <comment xml:lang="nb">ODA-dokument</comment>
+ <comment xml:lang="ms">Dokumen ODA</comment>
+ <comment xml:lang="lv">ODA dokuments</comment>
+ <comment xml:lang="lt">ODA dokumentas</comment>
+ <comment xml:lang="ko">ODA 문서</comment>
+ <comment xml:lang="kk">ODA құжаты</comment>
+ <comment xml:lang="ka">ODA დოკუმენტი</comment>
+ <comment xml:lang="ja">ODA ドキュメント</comment>
+ <comment xml:lang="it">Documento ODA</comment>
+ <comment xml:lang="is">ODA skjal</comment>
+ <comment xml:lang="id">Dokumen ODA</comment>
+ <comment xml:lang="ia">Documento ODA</comment>
+ <comment xml:lang="hu">ODA-dokumentum</comment>
+ <comment xml:lang="hr">ODA dokument</comment>
+ <comment xml:lang="he">מסמך ODA</comment>
+ <comment xml:lang="gl">documento ODA</comment>
+ <comment xml:lang="ga">cáipéis ODA</comment>
+ <comment xml:lang="fur">document ODA</comment>
+ <comment xml:lang="fr">document ODA</comment>
+ <comment xml:lang="fo">ODA skjal</comment>
+ <comment xml:lang="fi">ODA-asiakirja</comment>
+ <comment xml:lang="eu">ODA dokumentua</comment>
+ <comment xml:lang="es">documento ODA</comment>
+ <comment xml:lang="eo">ODA-dokumento</comment>
+ <comment xml:lang="en_GB">ODA document</comment>
+ <comment xml:lang="el">Έγγραφο ODA</comment>
+ <comment xml:lang="de">ODA-Dokument</comment>
+ <comment xml:lang="da">ODA-dokument</comment>
+ <comment xml:lang="cy">Dogfen ODA</comment>
+ <comment xml:lang="cs">dokument ODA</comment>
+ <comment xml:lang="ca">document ODA</comment>
+ <comment xml:lang="bg">Документ — ODA</comment>
+ <comment xml:lang="be@latin">Dakument ODA</comment>
+ <comment xml:lang="be">дакумент ODA</comment>
+ <comment xml:lang="az">ODA sənədi</comment>
+ <comment xml:lang="ast">Documentu ODA</comment>
+ <comment xml:lang="ar">مستند ODA</comment>
+ <comment xml:lang="af">ODA-dokument</comment>
<acronym>ODA</acronym>
<expanded-acronym>Office Document Architecture</expanded-acronym>
<generic-icon name="x-office-document"/>
@@ -847,49 +834,54 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-wwf">
<comment>WWF document</comment>
- <comment xml:lang="af">WWF-dokument</comment>
- <comment xml:lang="ast">Documentu WWF</comment>
- <comment xml:lang="bg">Документ — WWF</comment>
- <comment xml:lang="ca">document WWF</comment>
- <comment xml:lang="cs">dokument WWF</comment>
- <comment xml:lang="da">WWF-dokument</comment>
- <comment xml:lang="de">WWF-Dokument</comment>
- <comment xml:lang="el">Έγγραφο WWF</comment>
- <comment xml:lang="en-GB">WWF document</comment>
- <comment xml:lang="eo">WWF-dokumento</comment>
- <comment xml:lang="es">documento WWF</comment>
- <comment xml:lang="eu">WWF dokumentua</comment>
- <comment xml:lang="fi">WWF-asiakirja</comment>
- <comment xml:lang="fr">document WWF</comment>
- <comment xml:lang="fur">document WWF</comment>
- <comment xml:lang="ga">cáipéis WWF</comment>
- <comment xml:lang="gl">documento de WWF</comment>
- <comment xml:lang="he">מסמך WWF</comment>
- <comment xml:lang="hr">WWF dokument</comment>
- <comment xml:lang="hu">WWF-dokumentum</comment>
- <comment xml:lang="ia">Documento WWF</comment>
- <comment xml:lang="id">Dokumen WWF</comment>
- <comment xml:lang="it">Documento WWF</comment>
- <comment xml:lang="ja">WWF 文書</comment>
- <comment xml:lang="ka">WWF დოკუმენტი</comment>
- <comment xml:lang="kk">WWF құжаты</comment>
- <comment xml:lang="ko">WWF 문서</comment>
- <comment xml:lang="lt">WWF dokumentas</comment>
- <comment xml:lang="lv">WWF dokuments</comment>
- <comment xml:lang="nl">WWF document</comment>
- <comment xml:lang="oc">document WWF</comment>
- <comment xml:lang="pl">Dokument WWF</comment>
- <comment xml:lang="pt">documento WWF</comment>
- <comment xml:lang="pt-BR">Documento WWF</comment>
- <comment xml:lang="ru">Документ WWF</comment>
- <comment xml:lang="sk">Dokument WWF</comment>
- <comment xml:lang="sl">Dokument WWF</comment>
- <comment xml:lang="sr">ВВФ документ</comment>
- <comment xml:lang="sv">WWF-dokument</comment>
- <comment xml:lang="tr">WWF belgesi</comment>
+ <comment xml:lang="zh_TW">WWF 文件</comment>
+ <comment xml:lang="zh_CN">WWF</comment>
<comment xml:lang="uk">документ WWF</comment>
- <comment xml:lang="zh-CN">WWF</comment>
- <comment xml:lang="zh-TW">WWF 文件</comment>
+ <comment xml:lang="tr">WWF belgesi</comment>
+ <comment xml:lang="sv">WWF-dokument</comment>
+ <comment xml:lang="sr">ВВФ документ</comment>
+ <comment xml:lang="sq">dokument WWF</comment>
+ <comment xml:lang="sl">Dokument WWF</comment>
+ <comment xml:lang="si">WWF ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument WWF</comment>
+ <comment xml:lang="ru">Документ WWF</comment>
+ <comment xml:lang="pt_BR">Documento WWF</comment>
+ <comment xml:lang="pt">documento WWF</comment>
+ <comment xml:lang="pl">Dokument WWF</comment>
+ <comment xml:lang="oc">document WWF</comment>
+ <comment xml:lang="nl">WWF-document</comment>
+ <comment xml:lang="lv">WWF dokuments</comment>
+ <comment xml:lang="lt">WWF dokumentas</comment>
+ <comment xml:lang="ko">WWF 문서</comment>
+ <comment xml:lang="kk">WWF құжаты</comment>
+ <comment xml:lang="ka">WWF დოკუმენტი</comment>
+ <comment xml:lang="ja">WWF ドキュメント</comment>
+ <comment xml:lang="it">Documento WWF</comment>
+ <comment xml:lang="is">WWF skjal</comment>
+ <comment xml:lang="id">Dokumen WWF</comment>
+ <comment xml:lang="ia">Documento WWF</comment>
+ <comment xml:lang="hu">WWF-dokumentum</comment>
+ <comment xml:lang="hr">WWF dokument</comment>
+ <comment xml:lang="he">מסמך WWF</comment>
+ <comment xml:lang="gl">documento de WWF</comment>
+ <comment xml:lang="ga">cáipéis WWF</comment>
+ <comment xml:lang="fur">document WWF</comment>
+ <comment xml:lang="fr">document WWF</comment>
+ <comment xml:lang="fi">WWF-asiakirja</comment>
+ <comment xml:lang="eu">WWF dokumentua</comment>
+ <comment xml:lang="es">documento WWF</comment>
+ <comment xml:lang="eo">WWF-dokumento</comment>
+ <comment xml:lang="en_GB">WWF document</comment>
+ <comment xml:lang="el">Έγγραφο WWF</comment>
+ <comment xml:lang="de">WWF-Dokument</comment>
+ <comment xml:lang="da">WWF-dokument</comment>
+ <comment xml:lang="cs">dokument WWF</comment>
+ <comment xml:lang="ca">document WWF</comment>
+ <comment xml:lang="bg">Документ — WWF</comment>
+ <comment xml:lang="be">дакумент WWF</comment>
+ <comment xml:lang="ast">Documentu WWF</comment>
+ <comment xml:lang="ar">مستند WWF</comment>
+ <comment xml:lang="af">WWF-dokument</comment>
<generic-icon name="x-office-document"/>
<glob pattern="*.wwf"/>
<sub-class-of type="application/pdf"/>
@@ -897,62 +889,66 @@ command to generate the output files.
</mime-type>
<mime-type type="application/pdf">
<comment>PDF document</comment>
- <comment xml:lang="af">PDF-dokument</comment>
- <comment xml:lang="ar">مستند PDF</comment>
- <comment xml:lang="ast">Documentu PDF</comment>
- <comment xml:lang="be-Latn">Dakument PDF</comment>
- <comment xml:lang="bg">Документ — PDF</comment>
- <comment xml:lang="ca">document PDF</comment>
- <comment xml:lang="cs">dokument PDF</comment>
- <comment xml:lang="cy">Dogfen PDF</comment>
- <comment xml:lang="da">PDF-dokument</comment>
- <comment xml:lang="de">PDF-Dokument</comment>
- <comment xml:lang="el">Έγγραφο PDF</comment>
- <comment xml:lang="en-GB">PDF document</comment>
- <comment xml:lang="eo">PDF-dokumento</comment>
- <comment xml:lang="es">documento PDF</comment>
- <comment xml:lang="eu">PDF dokumentua</comment>
- <comment xml:lang="fi">PDF-asiakirja</comment>
- <comment xml:lang="fo">PDF skjal</comment>
- <comment xml:lang="fr">document PDF</comment>
- <comment xml:lang="fur">document PDF</comment>
- <comment xml:lang="ga">cáipéis PDF</comment>
- <comment xml:lang="gl">documento PDF</comment>
- <comment xml:lang="he">מסמך PDF</comment>
- <comment xml:lang="hr">PDF dokument</comment>
- <comment xml:lang="hu">PDF-dokumentum</comment>
- <comment xml:lang="ia">Documento PDF</comment>
- <comment xml:lang="id">Dokumen PDF</comment>
- <comment xml:lang="it">Documento PDF</comment>
- <comment xml:lang="ja">PDF ドキュメント</comment>
- <comment xml:lang="kk">PDF құжаты</comment>
- <comment xml:lang="ko">PDF 문서</comment>
- <comment xml:lang="lt">PDF dokumentas</comment>
- <comment xml:lang="lv">PDF dokuments</comment>
- <comment xml:lang="ms">Dokumen PDF</comment>
- <comment xml:lang="nb">PDF-dokument</comment>
- <comment xml:lang="nl">PDF-document</comment>
- <comment xml:lang="nn">PDF-dokument</comment>
- <comment xml:lang="oc">document PDF</comment>
- <comment xml:lang="pl">Dokument PDF</comment>
- <comment xml:lang="pt">documento PDF</comment>
- <comment xml:lang="pt-BR">Documento PDF</comment>
- <comment xml:lang="ro">Document PDF</comment>
- <comment xml:lang="ru">Документ PDF</comment>
- <comment xml:lang="sk">Dokument PDF</comment>
- <comment xml:lang="sl">Dokument PDF</comment>
- <comment xml:lang="sq">Dokument PDF</comment>
- <comment xml:lang="sr">ПДФ документ</comment>
- <comment xml:lang="sv">PDF-dokument</comment>
- <comment xml:lang="tr">PDF belgesi</comment>
- <comment xml:lang="uk">документ PDF</comment>
+ <comment xml:lang="zh_TW">PDF 文件</comment>
+ <comment xml:lang="zh_CN">PDF 文档</comment>
<comment xml:lang="vi">Tài liệu PDF</comment>
- <comment xml:lang="zh-CN">PDF 文档</comment>
- <comment xml:lang="zh-TW">PDF 文件</comment>
+ <comment xml:lang="uk">документ PDF</comment>
+ <comment xml:lang="tr">PDF belgesi</comment>
+ <comment xml:lang="sv">PDF-dokument</comment>
+ <comment xml:lang="sr">ПДФ документ</comment>
+ <comment xml:lang="sq">dokument PDF</comment>
+ <comment xml:lang="sl">Dokument PDF</comment>
+ <comment xml:lang="si">PDF ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument PDF</comment>
+ <comment xml:lang="ru">Документ PDF</comment>
+ <comment xml:lang="ro">Document PDF</comment>
+ <comment xml:lang="pt_BR">Documento PDF</comment>
+ <comment xml:lang="pt">documento PDF</comment>
+ <comment xml:lang="pl">Dokument PDF</comment>
+ <comment xml:lang="oc">document PDF</comment>
+ <comment xml:lang="nn">PDF-dokument</comment>
+ <comment xml:lang="nl">PDF-document</comment>
+ <comment xml:lang="nb">PDF-dokument</comment>
+ <comment xml:lang="ms">Dokumen PDF</comment>
+ <comment xml:lang="lv">PDF dokuments</comment>
+ <comment xml:lang="lt">PDF dokumentas</comment>
+ <comment xml:lang="ko">PDF 문서</comment>
+ <comment xml:lang="kk">PDF құжаты</comment>
+ <comment xml:lang="ka">PDF დოკუმენტი</comment>
+ <comment xml:lang="ja">PDF ドキュメント</comment>
+ <comment xml:lang="it">Documento PDF</comment>
+ <comment xml:lang="is">PDF skjal</comment>
+ <comment xml:lang="id">Dokumen PDF</comment>
+ <comment xml:lang="ia">Documento PDF</comment>
+ <comment xml:lang="hu">PDF-dokumentum</comment>
+ <comment xml:lang="hr">PDF dokument</comment>
+ <comment xml:lang="he">מסמך PDF</comment>
+ <comment xml:lang="gl">documento PDF</comment>
+ <comment xml:lang="ga">cáipéis PDF</comment>
+ <comment xml:lang="fur">document PDF</comment>
+ <comment xml:lang="fr">document PDF</comment>
+ <comment xml:lang="fo">PDF skjal</comment>
+ <comment xml:lang="fi">PDF-asiakirja</comment>
+ <comment xml:lang="eu">PDF dokumentua</comment>
+ <comment xml:lang="es">documento PDF</comment>
+ <comment xml:lang="eo">PDF-dokumento</comment>
+ <comment xml:lang="en_GB">PDF document</comment>
+ <comment xml:lang="el">Έγγραφο PDF</comment>
+ <comment xml:lang="de">PDF-Dokument</comment>
+ <comment xml:lang="da">PDF-dokument</comment>
+ <comment xml:lang="cy">Dogfen PDF</comment>
+ <comment xml:lang="cs">dokument PDF</comment>
+ <comment xml:lang="ca">document PDF</comment>
+ <comment xml:lang="bg">Документ — PDF</comment>
+ <comment xml:lang="be@latin">Dakument PDF</comment>
+ <comment xml:lang="be">дакумент PDF</comment>
+ <comment xml:lang="ast">Documentu PDF</comment>
+ <comment xml:lang="ar">مستند PDF</comment>
+ <comment xml:lang="af">PDF-dokument</comment>
<acronym>PDF</acronym>
<expanded-acronym>Portable Document Format</expanded-acronym>
<generic-icon name="x-office-document"/>
- <magic priority="50">
+ <magic>
<match type="string" value="%PDF-" offset="0:1024"/>
</magic>
<glob pattern="*.pdf"/>
@@ -963,61 +959,65 @@ command to generate the output files.
</mime-type>
<mime-type type="application/xspf+xml">
<comment>XSPF playlist</comment>
- <comment xml:lang="af">XSPF-speellys</comment>
- <comment xml:lang="ar">قائمة تشغيل XSPF</comment>
- <comment xml:lang="ast">Llista de reproducción XSPF</comment>
- <comment xml:lang="be-Latn">Śpis piesień XSPF</comment>
- <comment xml:lang="bg">Списък за изпълнение — XSPF</comment>
- <comment xml:lang="ca">llista de reproducció XSPF</comment>
- <comment xml:lang="cs">seznam k přehrání XSPF</comment>
- <comment xml:lang="da">XSPF-afspilningsliste</comment>
- <comment xml:lang="de">XSPF-Wiedergabeliste</comment>
- <comment xml:lang="el">Λίστα αναπαραγωγής XSPF</comment>
- <comment xml:lang="en-GB">XSPF playlist</comment>
- <comment xml:lang="eo">XSPF-ludlisto</comment>
- <comment xml:lang="es">lista de reproducción XSPF</comment>
- <comment xml:lang="eu">XSPF erreprodukzio-zerrenda</comment>
- <comment xml:lang="fi">XSPF-soittolista</comment>
- <comment xml:lang="fo">XSPF avspælingarlisti</comment>
- <comment xml:lang="fr">liste de lecture XSPF</comment>
- <comment xml:lang="fur">liste di riproduzion XSPF</comment>
- <comment xml:lang="ga">seinmliosta XSPF</comment>
- <comment xml:lang="gl">lista de reprodución XSPF</comment>
- <comment xml:lang="he">רשימת נגינה XSPF</comment>
- <comment xml:lang="hr">XSPF popis izvođenja</comment>
- <comment xml:lang="hu">XSPF-lejátszólista</comment>
- <comment xml:lang="ia">Lista de selection XSPF</comment>
- <comment xml:lang="id">Senarai pular XSPF</comment>
- <comment xml:lang="it">Playlist XSPF</comment>
- <comment xml:lang="ja">XSPF 再生リスト</comment>
- <comment xml:lang="kk">XSPF ойнау тізімі</comment>
- <comment xml:lang="ko">XSPF 재생 목록</comment>
- <comment xml:lang="lt">XSPF grojaraštis</comment>
- <comment xml:lang="lv">XSPF repertuārs</comment>
- <comment xml:lang="nb">XSPF-spilleliste</comment>
- <comment xml:lang="nl">XSPF-afspeellijst</comment>
- <comment xml:lang="nn">XSPF-speleliste</comment>
- <comment xml:lang="oc">lista de lectura XSPF</comment>
- <comment xml:lang="pl">Lista odtwarzania XSPF</comment>
- <comment xml:lang="pt">lista de reprodução XSPF</comment>
- <comment xml:lang="pt-BR">Lista de reprodução XSPF</comment>
- <comment xml:lang="ro">Listă XSPF</comment>
- <comment xml:lang="ru">Список воспроизведения XSPF</comment>
- <comment xml:lang="sk">Zoznam skladieb XSPF</comment>
- <comment xml:lang="sl">Seznam predvajanja XSPF</comment>
- <comment xml:lang="sq">Listë titujsh XSPF</comment>
- <comment xml:lang="sr">ИксСПФ списак нумера</comment>
- <comment xml:lang="sv">XSPF-spellista</comment>
- <comment xml:lang="tr">XSPF çalma listesi</comment>
- <comment xml:lang="uk">список програвання XSPF</comment>
+ <comment xml:lang="zh_TW">XSPF 播放清單</comment>
+ <comment xml:lang="zh_CN">XSPF 播放列表</comment>
<comment xml:lang="vi">Danh mục nhạc XSPF</comment>
- <comment xml:lang="zh-CN">XSPF 播放列表</comment>
- <comment xml:lang="zh-TW">XSPF 播放清單</comment>
+ <comment xml:lang="uk">список програвання XSPF</comment>
+ <comment xml:lang="tr">XSPF çalma listesi</comment>
+ <comment xml:lang="sv">XSPF-spellista</comment>
+ <comment xml:lang="sr">ИксСПФ списак нумера</comment>
+ <comment xml:lang="sq">luajlistë XSPF</comment>
+ <comment xml:lang="sl">Seznam predvajanja XSPF</comment>
+ <comment xml:lang="si">XSPF ධාවන ලැයිස්තුව</comment>
+ <comment xml:lang="sk">Zoznam skladieb XSPF</comment>
+ <comment xml:lang="ru">Список воспроизведения XSPF</comment>
+ <comment xml:lang="ro">Listă XSPF</comment>
+ <comment xml:lang="pt_BR">Lista de reprodução XSPF</comment>
+ <comment xml:lang="pt">lista de reprodução XSPF</comment>
+ <comment xml:lang="pl">Lista odtwarzania XSPF</comment>
+ <comment xml:lang="oc">lista de lectura XSPF</comment>
+ <comment xml:lang="nn">XSPF-speleliste</comment>
+ <comment xml:lang="nl">XSPF-afspeellijst</comment>
+ <comment xml:lang="nb">XSPF-spilleliste</comment>
+ <comment xml:lang="lv">XSPF repertuārs</comment>
+ <comment xml:lang="lt">XSPF grojaraštis</comment>
+ <comment xml:lang="ko">XSPF 재생 목록</comment>
+ <comment xml:lang="kk">XSPF ойнау тізімі</comment>
+ <comment xml:lang="ka">XSPF დასაკრავი სია</comment>
+ <comment xml:lang="ja">XSPF プレイリスト</comment>
+ <comment xml:lang="it">Playlist XSPF</comment>
+ <comment xml:lang="is">XSPF spilunarlisti</comment>
+ <comment xml:lang="id">Senarai pular XSPF</comment>
+ <comment xml:lang="ia">Lista de selection XSPF</comment>
+ <comment xml:lang="hu">XSPF-lejátszólista</comment>
+ <comment xml:lang="hr">XSPF popis izvođenja</comment>
+ <comment xml:lang="he">רשימת נגינה XSPF</comment>
+ <comment xml:lang="gl">lista de reprodución XSPF</comment>
+ <comment xml:lang="ga">seinmliosta XSPF</comment>
+ <comment xml:lang="fur">liste di riproduzion XSPF</comment>
+ <comment xml:lang="fr">liste de lecture XSPF</comment>
+ <comment xml:lang="fo">XSPF avspælingarlisti</comment>
+ <comment xml:lang="fi">XSPF-soittolista</comment>
+ <comment xml:lang="eu">XSPF erreprodukzio-zerrenda</comment>
+ <comment xml:lang="es">lista de reproducción XSPF</comment>
+ <comment xml:lang="eo">XSPF-ludlisto</comment>
+ <comment xml:lang="en_GB">XSPF playlist</comment>
+ <comment xml:lang="el">Λίστα αναπαραγωγής XSPF</comment>
+ <comment xml:lang="de">XSPF-Wiedergabeliste</comment>
+ <comment xml:lang="da">XSPF-afspilningsliste</comment>
+ <comment xml:lang="cs">seznam k přehrání XSPF</comment>
+ <comment xml:lang="ca">llista de reproducció XSPF</comment>
+ <comment xml:lang="bg">Списък за изпълнение — XSPF</comment>
+ <comment xml:lang="be@latin">Śpis piesień XSPF</comment>
+ <comment xml:lang="be">плэй-ліст XSPF</comment>
+ <comment xml:lang="ast">Llista de reproducción XSPF</comment>
+ <comment xml:lang="ar">قائمة تشغيل XSPF</comment>
+ <comment xml:lang="af">XSPF-speellys</comment>
<acronym>XSPF</acronym>
<expanded-acronym>XML Shareable Playlist Format</expanded-acronym>
<sub-class-of type="application/xml"/>
<generic-icon name="audio-x-generic"/>
- <magic priority="50">
+ <magic>
<match type="string" value="&lt;playlist version=&quot;1" offset="0:64"/>
<match type="string" value="&lt;playlist version='1" offset="0:64"/>
</magic>
@@ -1027,239 +1027,267 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-windows-themepack">
<comment>Microsoft Windows theme pack</comment>
- <comment xml:lang="af">Microsoft Windows-temapak</comment>
- <comment xml:lang="ar">حزمة سمات Microsoft Works</comment>
- <comment xml:lang="ast">Paquete de temes de Microsoft Windows</comment>
- <comment xml:lang="bg">Пакет с тема — Microsoft Windows</comment>
- <comment xml:lang="ca">paquet de temes de Microsoft Windows</comment>
- <comment xml:lang="cs">balík motivů Microsoft Windows</comment>
- <comment xml:lang="da">Microsoft Windows-temapakke</comment>
- <comment xml:lang="de">Microsoft-Windows-Themenpaket</comment>
- <comment xml:lang="el">Πακέτο θέματος Microsoft Windows</comment>
- <comment xml:lang="en-GB">Microsoft Windows theme pack</comment>
- <comment xml:lang="es">paquete de tema para Microsoft Windows</comment>
- <comment xml:lang="eu">Microsoft Windows-en gaiaren paketea</comment>
- <comment xml:lang="fi">Microsoft Windows -teemapaketti</comment>
- <comment xml:lang="fo">Microsoft Windows tema pakki</comment>
- <comment xml:lang="fr">paquet de thèmes Microsoft Windows</comment>
- <comment xml:lang="fur">pachet temis di Microsoft Windows</comment>
- <comment xml:lang="ga">paca téamaí Microsoft Windows</comment>
- <comment xml:lang="gl">paquete de tema de Microsoft Windows</comment>
- <comment xml:lang="he">חבילת ערכות נושא של Microsoft Windows</comment>
- <comment xml:lang="hr">Microsoft Windows paket tema</comment>
- <comment xml:lang="hu">Microsoft Windows témacsomag</comment>
- <comment xml:lang="ia">Pacchetto de themas Microsoft Windows</comment>
- <comment xml:lang="id">Pak tema Microsoft Windows</comment>
- <comment xml:lang="it">Pacchetto temi Microsoft Windows</comment>
- <comment xml:lang="ja">Microsoft Windows テーマパック</comment>
- <comment xml:lang="ka">Microsoft Windows-ის თემის შეკვრა</comment>
- <comment xml:lang="kk">Microsoft Windows тема дестесі</comment>
- <comment xml:lang="ko">Microsoft Windows 테마 패키지</comment>
- <comment xml:lang="lt">Microsoft Windows temų paketas</comment>
- <comment xml:lang="lv">Microsoft Windows motīvu paka</comment>
- <comment xml:lang="nl">Microsoft Windows thema pack</comment>
- <comment xml:lang="oc">paquet de tèmas Microsoft Windows</comment>
- <comment xml:lang="pl">Pakiet motywu Microsoft Windows</comment>
- <comment xml:lang="pt">pacote de tema Microsoft Windows</comment>
- <comment xml:lang="pt-BR">Pacote de temas do Microsoft Windows</comment>
- <comment xml:lang="ro">Pachet de teme Microsoft Windows</comment>
- <comment xml:lang="ru">Пакет темы Microsoft Windows</comment>
- <comment xml:lang="sk">Balík tém Microsoft Windows</comment>
- <comment xml:lang="sl">Datoteka teme Microsoft Windows</comment>
- <comment xml:lang="sr">пакет теме Мајкрософт Виндоуза</comment>
- <comment xml:lang="sv">Microsoft Windows-temapaket</comment>
- <comment xml:lang="tr">Microsoft Windows tema paketi</comment>
+ <comment xml:lang="zh_TW">微軟視窗佈景主題包</comment>
+ <comment xml:lang="zh_CN">Microsoft Windows 主题包</comment>
<comment xml:lang="uk">пакунок з темою Microsoft Windows</comment>
- <comment xml:lang="zh-CN">Microsoft Windows 主题包</comment>
- <comment xml:lang="zh-TW">微軟視窗佈景主題包</comment>
+ <comment xml:lang="tr">Microsoft Windows tema paketi</comment>
+ <comment xml:lang="sv">Microsoft Windows-temapaket</comment>
+ <comment xml:lang="sr">пакет теме Мајкрософт Виндоуза</comment>
+ <comment xml:lang="sq">paketë temash Microsoft Windows</comment>
+ <comment xml:lang="sl">Datoteka teme Microsoft Windows</comment>
+ <comment xml:lang="si">Microsoft Windows තේමා ඇසුරුම</comment>
+ <comment xml:lang="sk">Balík tém Microsoft Windows</comment>
+ <comment xml:lang="ru">Пакет темы Microsoft Windows</comment>
+ <comment xml:lang="ro">Pachet de teme Microsoft Windows</comment>
+ <comment xml:lang="pt_BR">Pacote de temas do Microsoft Windows</comment>
+ <comment xml:lang="pt">pacote de tema Microsoft Windows</comment>
+ <comment xml:lang="pl">Pakiet motywu Microsoft Windows</comment>
+ <comment xml:lang="oc">paquet de tèmas Microsoft Windows</comment>
+ <comment xml:lang="nl">Microsoft Windows-themapakket</comment>
+ <comment xml:lang="lv">Microsoft Windows motīvu paka</comment>
+ <comment xml:lang="lt">Microsoft Windows temų paketas</comment>
+ <comment xml:lang="ko">Microsoft Windows 테마 패키지</comment>
+ <comment xml:lang="kk">Microsoft Windows тема дестесі</comment>
+ <comment xml:lang="ka">Microsoft Windows-ის თემის შეკვრა</comment>
+ <comment xml:lang="ja">Microsoft Windows テーマパック</comment>
+ <comment xml:lang="it">Pacchetto temi Microsoft Windows</comment>
+ <comment xml:lang="is">Microsoft Windows þemapakki</comment>
+ <comment xml:lang="id">Pak tema Microsoft Windows</comment>
+ <comment xml:lang="ia">Pacchetto de themas Microsoft Windows</comment>
+ <comment xml:lang="hu">Microsoft Windows témacsomag</comment>
+ <comment xml:lang="hr">Microsoft Windows paket tema</comment>
+ <comment xml:lang="he">חבילת ערכות נושא של Microsoft Windows</comment>
+ <comment xml:lang="gl">paquete de tema de Microsoft Windows</comment>
+ <comment xml:lang="ga">paca téamaí Microsoft Windows</comment>
+ <comment xml:lang="fur">pachet temis di Microsoft Windows</comment>
+ <comment xml:lang="fr">paquet de thèmes Microsoft Windows</comment>
+ <comment xml:lang="fo">Microsoft Windows tema pakki</comment>
+ <comment xml:lang="fi">Microsoft Windows -teemapaketti</comment>
+ <comment xml:lang="eu">Microsoft Windows-en gaiaren paketea</comment>
+ <comment xml:lang="es">paquete de tema para Microsoft Windows</comment>
+ <comment xml:lang="en_GB">Microsoft Windows theme pack</comment>
+ <comment xml:lang="el">Πακέτο θέματος Microsoft Windows</comment>
+ <comment xml:lang="de">Microsoft-Windows-Themenpaket</comment>
+ <comment xml:lang="da">Microsoft Windows-temapakke</comment>
+ <comment xml:lang="cs">balík motivů Microsoft Windows</comment>
+ <comment xml:lang="ca">paquet de temes de Microsoft Windows</comment>
+ <comment xml:lang="bg">Пакет с тема — Microsoft Windows</comment>
+ <comment xml:lang="be">пакет тэмы Microsoft Windows</comment>
+ <comment xml:lang="ast">Paquete de temes de Microsoft Windows</comment>
+ <comment xml:lang="ar">حزمة سمات Microsoft Works</comment>
+ <comment xml:lang="af">Microsoft Windows-temapak</comment>
<sub-class-of type="application/vnd.ms-cab-compressed"/>
<generic-icon name="package-x-generic"/>
<glob pattern="*.themepack"/>
</mime-type>
<mime-type type="audio/x-amzxml">
<comment>AmazonMP3 download file</comment>
- <comment xml:lang="af">AmazonMP3-aflaailêer</comment>
- <comment xml:lang="ast">Ficheru de descarga AmazonMP3</comment>
- <comment xml:lang="bg">Файл за изтегляне — AmazonMP3</comment>
- <comment xml:lang="ca">fitxer baixat d'AmazonMP3</comment>
- <comment xml:lang="cs">soubor stahování AmazonMP3</comment>
- <comment xml:lang="da">AmazonMP3-downloadfil</comment>
- <comment xml:lang="de">AmazonMP3-Herunterladedatei</comment>
- <comment xml:lang="el">Αρχείο λήψης AmazonMP3</comment>
- <comment xml:lang="en-GB">AmazonMP3 download file</comment>
- <comment xml:lang="es">archivo de descarga de AmazonMP3</comment>
- <comment xml:lang="eu">AmazonMP3 deskarga fitxategia</comment>
- <comment xml:lang="fi">AmazonMP3-lataustiedosto</comment>
- <comment xml:lang="fr">fichier téléchargé AmazonMP3</comment>
- <comment xml:lang="fur">file discjariât AmazonMP3</comment>
- <comment xml:lang="ga">comhad íoslódáilte AmazonMP3</comment>
- <comment xml:lang="gl">Ficheiro de descarga de AmazonMP3</comment>
- <comment xml:lang="he">קובץ הורדת AmazonMP3</comment>
- <comment xml:lang="hr">AmazonMP3 preuzeta datoteka</comment>
- <comment xml:lang="hu">AmazonMP3 letöltésfájl</comment>
- <comment xml:lang="ia">File de discargamento AmazonMP3</comment>
- <comment xml:lang="id">Berkas unduh AmazonMP3</comment>
- <comment xml:lang="it">File scaricamento AmazonMP3</comment>
- <comment xml:lang="ja">AmazonMP3 ダウンロードファイル</comment>
- <comment xml:lang="kk">AmazonMP3 жүктеме файлы</comment>
- <comment xml:lang="ko">AmazonMP3 다운로드 파일</comment>
- <comment xml:lang="lv">AmazonMP3 lejupielādes datne</comment>
- <comment xml:lang="oc">fichièr telecargat AmazonMP3</comment>
- <comment xml:lang="pl">Pobrany plik AmazonMP3</comment>
- <comment xml:lang="pt">ficheiro transferido AmazonMP3</comment>
- <comment xml:lang="pt-BR">Arquivo de download AmazonMP3</comment>
- <comment xml:lang="ru">Файл загрузки AmazonMP3</comment>
- <comment xml:lang="sk">Stiahnutý súbor AmazonMP3 </comment>
- <comment xml:lang="sl">Datoteka prenosa AmazonMP3</comment>
- <comment xml:lang="sr">датотека преузимања АмазонаМП3</comment>
- <comment xml:lang="sv">AmazonMP3-hämtningsfil</comment>
- <comment xml:lang="tr">AmazonMP3 indirme dosyası</comment>
+ <comment xml:lang="zh_TW">AmazonMP3 下載檔</comment>
+ <comment xml:lang="zh_CN">AmazonMP3 下载文件</comment>
<comment xml:lang="uk">файл завантаження AmazonMP3</comment>
- <comment xml:lang="zh-CN">AmazonMP3 下载文件</comment>
- <comment xml:lang="zh-TW">AmazonMP3 下載檔</comment>
+ <comment xml:lang="tr">AmazonMP3 indirme dosyası</comment>
+ <comment xml:lang="sv">AmazonMP3-hämtningsfil</comment>
+ <comment xml:lang="sr">датотека преузимања АмазонаМП3</comment>
+ <comment xml:lang="sq">kartelë shkarkimi AmazonMP3</comment>
+ <comment xml:lang="sl">Datoteka prenosa AmazonMP3</comment>
+ <comment xml:lang="si">AmazonMP3 බාගත කිරීමේ ගොනුව</comment>
+ <comment xml:lang="sk">Stiahnutý súbor AmazonMP3 </comment>
+ <comment xml:lang="ru">Файл загрузки AmazonMP3</comment>
+ <comment xml:lang="pt_BR">Arquivo de download AmazonMP3</comment>
+ <comment xml:lang="pt">ficheiro transferido AmazonMP3</comment>
+ <comment xml:lang="pl">Pobrany plik AmazonMP3</comment>
+ <comment xml:lang="oc">fichièr telecargat AmazonMP3</comment>
+ <comment xml:lang="nl">AmazonMP3-downloadbestand</comment>
+ <comment xml:lang="lv">AmazonMP3 lejupielādes datne</comment>
+ <comment xml:lang="ko">AmazonMP3 다운로드 파일</comment>
+ <comment xml:lang="kk">AmazonMP3 жүктеме файлы</comment>
+ <comment xml:lang="ka">AmazonMP3 გადმოწერის ფაილი</comment>
+ <comment xml:lang="ja">AmazonMP3 ダウンロードファイル</comment>
+ <comment xml:lang="it">File scaricamento AmazonMP3</comment>
+ <comment xml:lang="is">AmazonMP3 niðurhalsskrá</comment>
+ <comment xml:lang="id">Berkas unduh AmazonMP3</comment>
+ <comment xml:lang="ia">File de discargamento AmazonMP3</comment>
+ <comment xml:lang="hu">AmazonMP3 letöltésfájl</comment>
+ <comment xml:lang="hr">AmazonMP3 preuzeta datoteka</comment>
+ <comment xml:lang="he">קובץ הורדת AmazonMP3</comment>
+ <comment xml:lang="gl">Ficheiro de descarga de AmazonMP3</comment>
+ <comment xml:lang="ga">comhad íoslódáilte AmazonMP3</comment>
+ <comment xml:lang="fur">file discjariât AmazonMP3</comment>
+ <comment xml:lang="fr">fichier téléchargé AmazonMP3</comment>
+ <comment xml:lang="fi">AmazonMP3-lataustiedosto</comment>
+ <comment xml:lang="eu">AmazonMP3 deskarga fitxategia</comment>
+ <comment xml:lang="es">archivo de descarga de AmazonMP3</comment>
+ <comment xml:lang="en_GB">AmazonMP3 download file</comment>
+ <comment xml:lang="el">Αρχείο λήψης AmazonMP3</comment>
+ <comment xml:lang="de">Amazon MP3-Download-Datei</comment>
+ <comment xml:lang="da">AmazonMP3-downloadfil</comment>
+ <comment xml:lang="cs">soubor stahování AmazonMP3</comment>
+ <comment xml:lang="ca">fitxer baixat d'AmazonMP3</comment>
+ <comment xml:lang="bg">Файл за изтегляне — AmazonMP3</comment>
+ <comment xml:lang="be">файл спампоўвання AmazonMP3</comment>
+ <comment xml:lang="ast">Ficheru de descarga AmazonMP3</comment>
+ <comment xml:lang="ar">ملف تنزيل AmazonMP3 </comment>
+ <comment xml:lang="af">AmazonMP3-aflaailêer</comment>
<glob pattern="*.amz"/>
</mime-type>
<mime-type type="audio/x-gsm">
<comment>GSM 06.10 audio</comment>
- <comment xml:lang="af">GSM 06.10-oudio</comment>
- <comment xml:lang="ar">GSM 06.10 سمعي</comment>
- <comment xml:lang="ast">Audiu GSM 6.10</comment>
- <comment xml:lang="bg">Аудио — GSM 06.10</comment>
- <comment xml:lang="ca">àudio de GSM 06.10</comment>
- <comment xml:lang="cs">zvuk GSM 06.10</comment>
- <comment xml:lang="da">GSM 06.10-lyd</comment>
- <comment xml:lang="de">GSM-06.10-Audio</comment>
- <comment xml:lang="el">Ήχος GSM 06.10</comment>
- <comment xml:lang="en-GB">GSM 06.10 audio</comment>
- <comment xml:lang="es">audio GSM 06.10</comment>
- <comment xml:lang="eu">GSM 06.10 audioa</comment>
- <comment xml:lang="fi">GSM 06.10 -ääni</comment>
- <comment xml:lang="fo">GSM 06.10 ljóður</comment>
- <comment xml:lang="fr">audio GSM 06.10</comment>
- <comment xml:lang="fur">audio GSM 06.10</comment>
- <comment xml:lang="ga">fuaim GSM 06.10</comment>
- <comment xml:lang="gl">son de GSM 06.10</comment>
- <comment xml:lang="he">שמע GSM 06.10</comment>
- <comment xml:lang="hr">GSM 06.10 zvučni zapis</comment>
- <comment xml:lang="hu">GSM 06.10 hang</comment>
- <comment xml:lang="ia">Audio GSM 06.10</comment>
- <comment xml:lang="id">Audio GSM 06.10</comment>
- <comment xml:lang="it">Audio GSM 06.10</comment>
- <comment xml:lang="ja">GSM 06.10 オーディオ</comment>
- <comment xml:lang="ka">GSM 06.10 აუდიო</comment>
- <comment xml:lang="kk">GSM 06.10 аудиосы</comment>
- <comment xml:lang="ko">GSM 06.10 오디오</comment>
- <comment xml:lang="lt">GSM 06.10 garso įrašas</comment>
- <comment xml:lang="lv">GSM 06.10 audio</comment>
- <comment xml:lang="nl">GSM 06.10 audio</comment>
- <comment xml:lang="oc">àudio GSM 06.10</comment>
- <comment xml:lang="pl">Plik dźwiękowy GSM 06.10</comment>
- <comment xml:lang="pt">áudio GSM 06.10</comment>
- <comment xml:lang="pt-BR">Áudio GSM 06.10</comment>
- <comment xml:lang="ro">GSM 06.10 audio</comment>
- <comment xml:lang="ru">Аудио GSM 06.10</comment>
- <comment xml:lang="sk">Zvuk GSM 06.10</comment>
- <comment xml:lang="sl">Zvočna datoteka GSM 06.10</comment>
- <comment xml:lang="sr">ГСМ 06.10 звук</comment>
- <comment xml:lang="sv">GSM 06.10-ljud</comment>
- <comment xml:lang="tr">GSM 06.10 ses dosyası</comment>
- <comment xml:lang="uk">звук GSM 06.10</comment>
+ <comment xml:lang="zh_TW">GSM 06.10 音訊</comment>
+ <comment xml:lang="zh_CN">GSM 06.10 音频</comment>
<comment xml:lang="vi">Âm thanh GSM 06.10</comment>
- <comment xml:lang="zh-CN">GSM 06.10 音频</comment>
- <comment xml:lang="zh-TW">GSM 06.10 音訊</comment>
+ <comment xml:lang="uk">звук GSM 06.10</comment>
+ <comment xml:lang="tr">GSM 06.10 ses dosyası</comment>
+ <comment xml:lang="sv">GSM 06.10-ljud</comment>
+ <comment xml:lang="sr">ГСМ 06.10 звук</comment>
+ <comment xml:lang="sq">audio GSM 06.10</comment>
+ <comment xml:lang="sl">Zvočna datoteka GSM 06.10</comment>
+ <comment xml:lang="si">GSM 06.10 ශ්‍රව්‍ය</comment>
+ <comment xml:lang="sk">Zvuk GSM 06.10</comment>
+ <comment xml:lang="ru">Аудио GSM 06.10</comment>
+ <comment xml:lang="ro">GSM 06.10 audio</comment>
+ <comment xml:lang="pt_BR">Áudio GSM 06.10</comment>
+ <comment xml:lang="pt">áudio GSM 06.10</comment>
+ <comment xml:lang="pl">Plik dźwiękowy GSM 06.10</comment>
+ <comment xml:lang="oc">àudio GSM 06.10</comment>
+ <comment xml:lang="nl">GSM 06.10 audio</comment>
+ <comment xml:lang="lv">GSM 06.10 audio</comment>
+ <comment xml:lang="lt">GSM 06.10 garso įrašas</comment>
+ <comment xml:lang="ko">GSM 06.10 오디오</comment>
+ <comment xml:lang="kk">GSM 06.10 аудиосы</comment>
+ <comment xml:lang="ka">GSM 06.10 აუდიო</comment>
+ <comment xml:lang="ja">GSM 06.10 オーディオ</comment>
+ <comment xml:lang="it">Audio GSM 06.10</comment>
+ <comment xml:lang="is">GSM 06.10 hljóð</comment>
+ <comment xml:lang="id">Audio GSM 06.10</comment>
+ <comment xml:lang="ia">Audio GSM 06.10</comment>
+ <comment xml:lang="hu">GSM 06.10 hang</comment>
+ <comment xml:lang="hr">GSM 06.10 zvučni zapis</comment>
+ <comment xml:lang="he">שמע GSM 06.10</comment>
+ <comment xml:lang="gl">son de GSM 06.10</comment>
+ <comment xml:lang="ga">fuaim GSM 06.10</comment>
+ <comment xml:lang="fur">audio GSM 06.10</comment>
+ <comment xml:lang="fr">audio GSM 06.10</comment>
+ <comment xml:lang="fo">GSM 06.10 ljóður</comment>
+ <comment xml:lang="fi">GSM 06.10 -ääni</comment>
+ <comment xml:lang="eu">GSM 06.10 audioa</comment>
+ <comment xml:lang="es">sonido GSM 06.10</comment>
+ <comment xml:lang="en_GB">GSM 06.10 audio</comment>
+ <comment xml:lang="el">Ήχος GSM 06.10</comment>
+ <comment xml:lang="de">GSM-06.10-Audio</comment>
+ <comment xml:lang="da">GSM 06.10-lyd</comment>
+ <comment xml:lang="cs">zvuk GSM 06.10</comment>
+ <comment xml:lang="ca">àudio de GSM 06.10</comment>
+ <comment xml:lang="bg">Аудио — GSM 06.10</comment>
+ <comment xml:lang="be">аўдыя GSM 06.10</comment>
+ <comment xml:lang="ast">Audiu GSM 6.10</comment>
+ <comment xml:lang="ar">صوت GSM 06.10</comment>
+ <comment xml:lang="af">GSM 06.10-oudio</comment>
<acronym>GSM</acronym>
<expanded-acronym>Global System for Mobile communications</expanded-acronym>
<glob pattern="*.gsm"/>
</mime-type>
<mime-type type="audio/x-iriver-pla">
<comment>iRiver playlist</comment>
- <comment xml:lang="bg">Списък за изпълнение — iRiver</comment>
- <comment xml:lang="ca">llista de reproducció iRiver</comment>
- <comment xml:lang="da">iRiver-afspilningsliste</comment>
- <comment xml:lang="de">iRiver-Wiedergabeliste</comment>
- <comment xml:lang="en-GB">iRiver playlist</comment>
- <comment xml:lang="es">lista de reproducción de iRiver</comment>
- <comment xml:lang="eu">iRiver erreprodukzio-zerrenda</comment>
- <comment xml:lang="fi">iRiver-soittolista</comment>
- <comment xml:lang="fr">liste de lecture iRiver</comment>
- <comment xml:lang="hr">iRiver popis izvođenja</comment>
- <comment xml:lang="hu">iRiver lejátszólista</comment>
- <comment xml:lang="id">daftar putar iRiver</comment>
- <comment xml:lang="it">Playlist iRiver</comment>
- <comment xml:lang="kk">iRiver ойнау тізімі</comment>
- <comment xml:lang="ko">아이리버 재생 목록</comment>
- <comment xml:lang="pl">Lista odtwarzania iRiver</comment>
- <comment xml:lang="pt">lista de reprodução do iRiver</comment>
- <comment xml:lang="pt-BR">Lista de reprodução do iRiver</comment>
- <comment xml:lang="ru">Список воспроизведения iRiver</comment>
- <comment xml:lang="sk">Zoznam skladieb iRiver</comment>
- <comment xml:lang="sl">Seznam predvajanja iRiver</comment>
- <comment xml:lang="sv">iRiver-spellista</comment>
- <comment xml:lang="tr">iRiver çalma listesi</comment>
+ <comment xml:lang="zh_TW">iRiver 播放清單</comment>
+ <comment xml:lang="zh_CN">iRiver 播放列表</comment>
<comment xml:lang="uk">список відтворення iRiver</comment>
- <comment xml:lang="zh-CN">iRiver 播放列表</comment>
- <comment xml:lang="zh-TW">iRiver 播放清單</comment>
- <magic priority="50">
+ <comment xml:lang="tr">iRiver çalma listesi</comment>
+ <comment xml:lang="sv">iRiver-spellista</comment>
+ <comment xml:lang="sq">luajlistë iRiver</comment>
+ <comment xml:lang="sl">Seznam predvajanja iRiver</comment>
+ <comment xml:lang="si">iRiver ධාවන ලැයිස්තුව</comment>
+ <comment xml:lang="sk">Zoznam skladieb iRiver</comment>
+ <comment xml:lang="ru">Список воспроизведения iRiver</comment>
+ <comment xml:lang="pt_BR">Lista de reprodução do iRiver</comment>
+ <comment xml:lang="pt">lista de reprodução do iRiver</comment>
+ <comment xml:lang="pl">Lista odtwarzania iRiver</comment>
+ <comment xml:lang="oc">lista de lectura iRiver</comment>
+ <comment xml:lang="nl">iRiver-playlist</comment>
+ <comment xml:lang="lt">iRiver grojaraštis</comment>
+ <comment xml:lang="ko">아이리버 재생 목록</comment>
+ <comment xml:lang="kk">iRiver ойнау тізімі</comment>
+ <comment xml:lang="ka">iRiver დასაკრავი სია</comment>
+ <comment xml:lang="ja">iRiver プレイリスト</comment>
+ <comment xml:lang="it">Playlist iRiver</comment>
+ <comment xml:lang="is">iRiver spilunarlisti</comment>
+ <comment xml:lang="id">daftar putar iRiver</comment>
+ <comment xml:lang="hu">iRiver lejátszólista</comment>
+ <comment xml:lang="hr">iRiver popis izvođenja</comment>
+ <comment xml:lang="he">רשימת נגינה של iRiver</comment>
+ <comment xml:lang="gl">Lista de reprodución de iRiver</comment>
+ <comment xml:lang="fr">liste de lecture iRiver</comment>
+ <comment xml:lang="fi">iRiver-soittolista</comment>
+ <comment xml:lang="eu">iRiver erreprodukzio-zerrenda</comment>
+ <comment xml:lang="es">lista de reproducción de iRiver</comment>
+ <comment xml:lang="en_GB">iRiver playlist</comment>
+ <comment xml:lang="de">iRiver-Wiedergabeliste</comment>
+ <comment xml:lang="da">iRiver-afspilningsliste</comment>
+ <comment xml:lang="ca">llista de reproducció iRiver</comment>
+ <comment xml:lang="bg">Списък за изпълнение — iRiver</comment>
+ <comment xml:lang="be">плэй-ліст iRiver</comment>
+ <comment xml:lang="ar">قائمة تشغيل iRiver</comment>
+ <magic>
<match type="string" value="iriver UMS PLA" offset="4"/>
</magic>
<glob pattern="*.pla"/>
</mime-type>
<mime-type type="application/pgp-encrypted">
<comment>PGP/MIME-encrypted message header</comment>
- <comment xml:lang="af">Kop van PGP/MIME-geënkripteerde boodskap</comment>
- <comment xml:lang="ar">ترويسة رسالة PGP/MIME-مشفرة</comment>
- <comment xml:lang="ast">Testera de mensaxe cifrada en PGP/MIME</comment>
- <comment xml:lang="be-Latn">Zahałovak paviedamleńnia, zašyfravany ŭ PGP/MIME</comment>
- <comment xml:lang="bg">Заглавна част на шифрирано съобщение — PGP/MIME</comment>
- <comment xml:lang="ca">capçalera de missatge amb xifrat PGP/MIME</comment>
- <comment xml:lang="cs">záhlaví zprávy zašifrované pomocí PGP/MIME</comment>
- <comment xml:lang="da">PGP-/MIME-krypteret meddelelseshoved</comment>
- <comment xml:lang="de">PGP/MIME-verschlüsselter Nachrichtenkopf</comment>
- <comment xml:lang="el">Κεφαλίδα μηνύματος κρυπτογραφημένου κατά PGP/MIME</comment>
- <comment xml:lang="en-GB">PGP/MIME-encrypted message header</comment>
- <comment xml:lang="eo">PGP/MIME-ĉifrita ĉapo de mesaĝo</comment>
- <comment xml:lang="es">cabecera de mensaje cifrado PGP/MIME</comment>
- <comment xml:lang="eu">PGP/MIME zifratutako mezu-goiburua</comment>
- <comment xml:lang="fi">PGP/MIME-salattu viestiotsikko</comment>
- <comment xml:lang="fo">PGP/MIME-encrypted boð tekshøvd</comment>
- <comment xml:lang="fr">en-tête de message codé PGP/MIME</comment>
- <comment xml:lang="fur">intestazion messaç cifrât in PGP/MIME</comment>
- <comment xml:lang="ga">ceanntásc teachtaireachta ionchódaithe le PGP/MIME</comment>
- <comment xml:lang="gl">cabeceira de mensaxe cifrado PGP/MIME</comment>
- <comment xml:lang="he">כותר של קובץ מוצפן מסוג PGP/MIME</comment>
- <comment xml:lang="hr">PGP/MIME-šrifrirano zaglavlje poruke</comment>
- <comment xml:lang="hu">PGP/MIME titkosított üzenetfejléc</comment>
- <comment xml:lang="ia">Capite de message cryptate con PGP/MIME</comment>
- <comment xml:lang="id">Tajuk pesan terenkripsi PGP/MIME</comment>
- <comment xml:lang="it">Intestazione messaggio PGP/MIME-encrypted</comment>
- <comment xml:lang="ja">PGP/MIME 暗号化メッセージヘッダー</comment>
- <comment xml:lang="kk">PGP/MIME-шифрленген мәлімдеме тақырыптамасы</comment>
- <comment xml:lang="ko">PGP/MIME으로 암호화된 메시지 헤더</comment>
- <comment xml:lang="lt">PGP/MIME užšifruota žinutės antraštė</comment>
- <comment xml:lang="lv">PGP/MIME-šifrēta ziņas galvene</comment>
- <comment xml:lang="ms">Pengepala mesej terenkripsi PGP/MIME</comment>
- <comment xml:lang="nb">PGP/MIME-kryptert meldingshode</comment>
- <comment xml:lang="nl">PGP/MIME-versleutelde berichtkopregels</comment>
- <comment xml:lang="nn">PGP/MIME-kryptert meldingshovud</comment>
- <comment xml:lang="oc">entèsta de messatge encodat PGP/MIME</comment>
- <comment xml:lang="pl">Nagłówek listu zaszyfrowanego PGP/MIME</comment>
- <comment xml:lang="pt">cabeçalho de mensagem encriptada com PGP/MIME</comment>
- <comment xml:lang="pt-BR">Cabeçalho de mensagem criptografada PGP/MIME</comment>
- <comment xml:lang="ro">Antet de mesaj encriptat PGP/MIME</comment>
- <comment xml:lang="ru">Заголовок сообщения, зашифрованный PGP/MIME</comment>
- <comment xml:lang="sk">Hlavičke správy zašifrovaná pomocou PGP/MIME</comment>
- <comment xml:lang="sl">Datoteka glave šifriranega sporočila PGP/MIME</comment>
- <comment xml:lang="sq">Header mesazhi të kriptuar PGP/MIME</comment>
- <comment xml:lang="sr">ПГП/МИМЕ шифровано заглавље поруке</comment>
- <comment xml:lang="sv">PGP/MIME-krypterat meddelandehuvud</comment>
- <comment xml:lang="tr">PGP/MIME-şifreli ileti başlığı</comment>
- <comment xml:lang="uk">заголовок шифрованого PGP/MIME повідомлення</comment>
+ <comment xml:lang="zh_TW">PGP/MIME 加密訊息標頭</comment>
+ <comment xml:lang="zh_CN">PGP/MIME 加密的信件头</comment>
<comment xml:lang="vi">Phần đầu thông điệp đã mật mã bằng PGP/MIME</comment>
- <comment xml:lang="zh-CN">PGP/MIME 加密的信件头</comment>
- <comment xml:lang="zh-TW">PGP/MIME 加密訊息標頭</comment>
- <sub-class-of type="text/plain"/>
- <generic-icon name="text-x-generic"/>
- <magic priority="50">
+ <comment xml:lang="uk">заголовок шифрованого PGP/MIME повідомлення</comment>
+ <comment xml:lang="tr">PGP/MIME-şifreli ileti başlığı</comment>
+ <comment xml:lang="sv">PGP/MIME-krypterat meddelandehuvud</comment>
+ <comment xml:lang="sr">ПГП/МИМЕ шифровано заглавље поруке</comment>
+ <comment xml:lang="sq">krye mesazhi fshehtëzuar me PGP/MIME</comment>
+ <comment xml:lang="sl">Datoteka glave šifriranega sporočila PGP/MIME</comment>
+ <comment xml:lang="si">PGP/MIME-සංකේතනය කළ පණිවිඩ ශීර්ෂකය</comment>
+ <comment xml:lang="sk">Hlavičke správy zašifrovaná pomocou PGP/MIME</comment>
+ <comment xml:lang="ru">Заголовок сообщения, зашифрованный PGP/MIME</comment>
+ <comment xml:lang="ro">Antet de mesaj encriptat PGP/MIME</comment>
+ <comment xml:lang="pt_BR">Cabeçalho de mensagem criptografada PGP/MIME</comment>
+ <comment xml:lang="pt">cabeçalho de mensagem encriptada com PGP/MIME</comment>
+ <comment xml:lang="pl">Nagłówek listu zaszyfrowanego PGP/MIME</comment>
+ <comment xml:lang="oc">entèsta de messatge encodat PGP/MIME</comment>
+ <comment xml:lang="nn">PGP/MIME-kryptert meldingshovud</comment>
+ <comment xml:lang="nl">PGP/MIME-versleutelde berichtkopregels</comment>
+ <comment xml:lang="nb">PGP/MIME-kryptert meldingshode</comment>
+ <comment xml:lang="ms">Pengepala mesej terenkripsi PGP/MIME</comment>
+ <comment xml:lang="lv">PGP/MIME-šifrēta ziņas galvene</comment>
+ <comment xml:lang="lt">PGP/MIME užšifruota žinutės antraštė</comment>
+ <comment xml:lang="ko">PGP/MIME으로 암호화된 메시지 헤더</comment>
+ <comment xml:lang="kk">PGP/MIME-шифрленген мәлімдеме тақырыптамасы</comment>
+ <comment xml:lang="ja">PGP/MIME 暗号化メッセージヘッダー</comment>
+ <comment xml:lang="it">Intestazione messaggio PGP/MIME-encrypted</comment>
+ <comment xml:lang="is">PGP-dulritaður skilaboðahaus</comment>
+ <comment xml:lang="id">Tajuk pesan terenkripsi PGP/MIME</comment>
+ <comment xml:lang="ia">Capite de message cryptate con PGP/MIME</comment>
+ <comment xml:lang="hu">PGP/MIME titkosított üzenetfejléc</comment>
+ <comment xml:lang="hr">PGP/MIME-šrifrirano zaglavlje poruke</comment>
+ <comment xml:lang="he">כותר של קובץ מוצפן מסוג PGP/MIME</comment>
+ <comment xml:lang="gl">cabeceira de mensaxe cifrado PGP/MIME</comment>
+ <comment xml:lang="ga">ceanntásc teachtaireachta ionchódaithe le PGP/MIME</comment>
+ <comment xml:lang="fur">intestazion messaç cifrât in PGP/MIME</comment>
+ <comment xml:lang="fr">en-tête de message codé PGP/MIME</comment>
+ <comment xml:lang="fo">PGP/MIME-encrypted boð tekshøvd</comment>
+ <comment xml:lang="fi">PGP/MIME-salattu viestiotsake</comment>
+ <comment xml:lang="eu">PGP/MIME zifratutako mezu-goiburua</comment>
+ <comment xml:lang="es">cabecera de mensaje cifrado PGP/MIME</comment>
+ <comment xml:lang="eo">PGP/MIME-ĉifrita ĉapo de mesaĝo</comment>
+ <comment xml:lang="en_GB">PGP/MIME-encrypted message header</comment>
+ <comment xml:lang="el">Κεφαλίδα μηνύματος κρυπτογραφημένου κατά PGP/MIME</comment>
+ <comment xml:lang="de">PGP/MIME-verschlüsselter Nachrichtenkopf</comment>
+ <comment xml:lang="da">PGP-/MIME-krypteret meddelelseshoved</comment>
+ <comment xml:lang="cs">záhlaví zprávy zašifrované pomocí PGP/MIME</comment>
+ <comment xml:lang="ca">capçalera de missatge amb xifrat PGP/MIME</comment>
+ <comment xml:lang="bg">Заглавна част на шифрирано съобщение — PGP/MIME</comment>
+ <comment xml:lang="be@latin">Zahałovak paviedamleńnia, zašyfravany ŭ PGP/MIME</comment>
+ <comment xml:lang="be">загаловак паведамлення з шыфраваннем PGP/MIME</comment>
+ <comment xml:lang="ast">Testera de mensaxe cifrada en PGP/MIME</comment>
+ <comment xml:lang="ar">ترويسة رسالة PGP/MIME-مشفرة</comment>
+ <comment xml:lang="af">Kop van PGP/MIME-geënkripteerde boodskap</comment>
+ <magic>
<match type="string" value="-----BEGIN PGP MESSAGE-----" offset="0"/>
</magic>
<glob pattern="*.pgp"/>
@@ -1269,64 +1297,66 @@ command to generate the output files.
</mime-type>
<mime-type type="application/pgp-keys">
<comment>PGP keys</comment>
- <comment xml:lang="af">PGP-sleutels</comment>
- <comment xml:lang="ar">مفاتيح PGP</comment>
- <comment xml:lang="ast">Claves PGP</comment>
- <comment xml:lang="az">PGP açarları</comment>
- <comment xml:lang="be-Latn">Klučy PGP</comment>
- <comment xml:lang="bg">Ключове — PGP</comment>
- <comment xml:lang="ca">claus PGP</comment>
- <comment xml:lang="cs">klíče PGP</comment>
- <comment xml:lang="cy">Allweddi PGP</comment>
- <comment xml:lang="da">PGP-nøgler</comment>
- <comment xml:lang="de">PGP-Schlüssel</comment>
- <comment xml:lang="el">Κλειδιά PGP</comment>
- <comment xml:lang="en-GB">PGP keys</comment>
- <comment xml:lang="eo">PGP-ŝlosiloj</comment>
- <comment xml:lang="es">claves PGP</comment>
- <comment xml:lang="eu">PGP giltzak</comment>
- <comment xml:lang="fi">PGP-avainrengas</comment>
- <comment xml:lang="fo">PGP lyklar</comment>
- <comment xml:lang="fr">clés PGP</comment>
- <comment xml:lang="fur">clâfs PGP</comment>
- <comment xml:lang="ga">eochracha PGP</comment>
- <comment xml:lang="gl">Chaves PGP</comment>
- <comment xml:lang="he">מפתחות PGP</comment>
- <comment xml:lang="hr">PGP ključevi</comment>
- <comment xml:lang="hu">PGP-kulcs</comment>
- <comment xml:lang="ia">Claves PGP</comment>
- <comment xml:lang="id">Kunci PGP</comment>
- <comment xml:lang="it">Chiavi PGP</comment>
- <comment xml:lang="ja">PGP 鍵</comment>
- <comment xml:lang="kk">PGP кілттері</comment>
- <comment xml:lang="ko">PGP 키</comment>
- <comment xml:lang="lt">PGP raktai</comment>
- <comment xml:lang="lv">PGP atslēgas</comment>
- <comment xml:lang="ms">Kekunci PGP</comment>
- <comment xml:lang="nb">PGP-nøkler</comment>
- <comment xml:lang="nl">PGP-sleutels</comment>
- <comment xml:lang="nn">PGP-nøkler</comment>
- <comment xml:lang="oc">claus PGP</comment>
- <comment xml:lang="pl">Klucze PGP</comment>
- <comment xml:lang="pt">chaves PGP</comment>
- <comment xml:lang="pt-BR">Chaves PGP</comment>
- <comment xml:lang="ro">Chei PGP</comment>
- <comment xml:lang="ru">Ключи PGP</comment>
- <comment xml:lang="sk">Kľúče PGP</comment>
- <comment xml:lang="sl">Datoteka ključa PGP</comment>
- <comment xml:lang="sq">Kyçe PGP</comment>
- <comment xml:lang="sr">ПГП кључеви</comment>
- <comment xml:lang="sv">PGP-nycklar</comment>
- <comment xml:lang="tr">PGP anahtarları</comment>
- <comment xml:lang="uk">ключі PGP</comment>
+ <comment xml:lang="zh_TW">PGP 金鑰</comment>
+ <comment xml:lang="zh_CN">PGP 密钥</comment>
<comment xml:lang="vi">Khoá PGP</comment>
- <comment xml:lang="zh-CN">PGP 密钥</comment>
- <comment xml:lang="zh-TW">PGP 金鑰</comment>
+ <comment xml:lang="uk">ключі PGP</comment>
+ <comment xml:lang="tr">PGP anahtarları</comment>
+ <comment xml:lang="sv">PGP-nycklar</comment>
+ <comment xml:lang="sr">ПГП кључеви</comment>
+ <comment xml:lang="sq">kyçe PGP</comment>
+ <comment xml:lang="sl">Datoteka ključa PGP</comment>
+ <comment xml:lang="si">PGP යතුරු</comment>
+ <comment xml:lang="sk">Kľúče PGP</comment>
+ <comment xml:lang="ru">Ключи PGP</comment>
+ <comment xml:lang="ro">Chei PGP</comment>
+ <comment xml:lang="pt_BR">Chaves PGP</comment>
+ <comment xml:lang="pt">chaves PGP</comment>
+ <comment xml:lang="pl">Klucze PGP</comment>
+ <comment xml:lang="oc">claus PGP</comment>
+ <comment xml:lang="nn">PGP-nøkler</comment>
+ <comment xml:lang="nl">PGP-sleutels</comment>
+ <comment xml:lang="nb">PGP-nøkler</comment>
+ <comment xml:lang="ms">Kekunci PGP</comment>
+ <comment xml:lang="lv">PGP atslēgas</comment>
+ <comment xml:lang="lt">PGP raktai</comment>
+ <comment xml:lang="ko">PGP 키</comment>
+ <comment xml:lang="kk">PGP кілттері</comment>
+ <comment xml:lang="ka">PGP გასაღები</comment>
+ <comment xml:lang="ja">PGP 鍵</comment>
+ <comment xml:lang="it">Chiavi PGP</comment>
+ <comment xml:lang="is">PGP-lyklar</comment>
+ <comment xml:lang="id">Kunci PGP</comment>
+ <comment xml:lang="ia">Claves PGP</comment>
+ <comment xml:lang="hu">PGP-kulcs</comment>
+ <comment xml:lang="hr">PGP ključevi</comment>
+ <comment xml:lang="he">מפתחות PGP</comment>
+ <comment xml:lang="gl">Chaves PGP</comment>
+ <comment xml:lang="ga">eochracha PGP</comment>
+ <comment xml:lang="fur">clâfs PGP</comment>
+ <comment xml:lang="fr">clés PGP</comment>
+ <comment xml:lang="fo">PGP lyklar</comment>
+ <comment xml:lang="fi">PGP-avainrengas</comment>
+ <comment xml:lang="eu">PGP giltzak</comment>
+ <comment xml:lang="es">claves PGP</comment>
+ <comment xml:lang="eo">PGP-ŝlosiloj</comment>
+ <comment xml:lang="en_GB">PGP keys</comment>
+ <comment xml:lang="el">Κλειδιά PGP</comment>
+ <comment xml:lang="de">PGP-Schlüssel</comment>
+ <comment xml:lang="da">PGP-nøgler</comment>
+ <comment xml:lang="cy">Allweddi PGP</comment>
+ <comment xml:lang="cs">klíče PGP</comment>
+ <comment xml:lang="ca">claus PGP</comment>
+ <comment xml:lang="bg">Ключове — PGP</comment>
+ <comment xml:lang="be@latin">Klučy PGP</comment>
+ <comment xml:lang="be">ключы PGP</comment>
+ <comment xml:lang="az">PGP açarları</comment>
+ <comment xml:lang="ast">Claves PGP</comment>
+ <comment xml:lang="ar">مفاتيح PGP</comment>
+ <comment xml:lang="af">PGP-sleutels</comment>
<acronym>PGP</acronym>
<expanded-acronym>Pretty Good Privacy</expanded-acronym>
- <sub-class-of type="text/plain"/>
- <generic-icon name="text-x-generic"/>
- <magic priority="50">
+ <magic>
<match type="string" value="-----BEGIN PGP PUBLIC KEY BLOCK-----" offset="0"/>
<match type="string" value="-----BEGIN PGP PRIVATE KEY BLOCK-----" offset="0"/>
<match type="big16" value="0x9501" offset="0"/>
@@ -1342,60 +1372,20 @@ command to generate the output files.
<glob pattern="*.key"/>
</mime-type>
<mime-type type="application/pgp-signature">
- <comment>detached OpenPGP signature</comment>
- <comment xml:lang="af">losstaande OpenPGP-handtekening</comment>
- <comment xml:lang="ar">إمضاء OpenPGP مفصول</comment>
- <comment xml:lang="be-Latn">adłučany podpis OpenPGP</comment>
- <comment xml:lang="bg">Отделѐн подпис — OpenPGP</comment>
- <comment xml:lang="ca">signatura OpenPGP abstreta</comment>
- <comment xml:lang="cs">oddělený podpis OpenPGP</comment>
- <comment xml:lang="da">frigjort OpenPGP-signatur</comment>
- <comment xml:lang="de">isolierte OpenPGP-Signatur</comment>
- <comment xml:lang="el">Αποκομμένη υπογραφή OpenPGP</comment>
- <comment xml:lang="en-GB">detached OpenPGP signature</comment>
- <comment xml:lang="eo">dekroĉa OpenPGP-subskribo</comment>
- <comment xml:lang="es">firma OpenPGP separada</comment>
- <comment xml:lang="eu">desuzturtako OpenPGP sinadura</comment>
- <comment xml:lang="fi">erillinen OpenPGP-allekirjoitus</comment>
- <comment xml:lang="fo">skild OpenPGP undirskrift</comment>
- <comment xml:lang="fr">signature OpenPGP détachée</comment>
- <comment xml:lang="fur">firme OpenPGP distacade</comment>
- <comment xml:lang="ga">síniú OpenPGP scartha</comment>
- <comment xml:lang="gl">sinatura de OpenPGP independente</comment>
- <comment xml:lang="he">חתימת OpenPGP מנותקת</comment>
- <comment xml:lang="hr">Odvojen OpenPGP potpis</comment>
- <comment xml:lang="hu">leválasztott OpenPGP-aláírás</comment>
- <comment xml:lang="ia">Signatura OpenPGP distachate</comment>
- <comment xml:lang="id">tanda tangan OpenPGP yang terlepas</comment>
- <comment xml:lang="it">Firma staccata OpenPGP</comment>
- <comment xml:lang="ja">分離 OpenPGP 署名</comment>
- <comment xml:lang="kk">бөлінген OpenPGP қолтаңбасы</comment>
- <comment xml:lang="ko">분리된 OpenPGP 서명</comment>
- <comment xml:lang="lt">neprisegtas OpenPGP parašas</comment>
- <comment xml:lang="lv">atvienots OpenPGP paraksts</comment>
- <comment xml:lang="ms">Tandatangan OpenPGP terlerai</comment>
- <comment xml:lang="nb">frakoblet OpenPGP-signatur</comment>
- <comment xml:lang="nl">losse OpenPGP-ondertekening</comment>
- <comment xml:lang="nn">fråkopla OpenPGP-signatur</comment>
- <comment xml:lang="oc">signatura OpenPGP destacada</comment>
- <comment xml:lang="pl">Oddzielony podpis OpenPGP</comment>
- <comment xml:lang="pt">assinatura OpenPGP solta</comment>
- <comment xml:lang="pt-BR">Assinatura OpenPGP destacada</comment>
- <comment xml:lang="ro">semnătură OpenPGP detașată</comment>
+ <comment>Detached OpenPGP signature</comment>
+ <comment xml:lang="zh_TW">卸離的 OpenGPG 簽章</comment>
+ <comment xml:lang="uk">відокремлений підпис OpenPGP</comment>
+ <comment xml:lang="sv">Frikopplad OpenPGP-signatur</comment>
<comment xml:lang="ru">Отсоединённая подпись OpenPGP</comment>
- <comment xml:lang="sk">Oddelený podpis OpenPGP</comment>
- <comment xml:lang="sl">odpet podpis OpenPGP</comment>
- <comment xml:lang="sq">Firmë e shkëputur OpenPGP</comment>
- <comment xml:lang="sr">одвојени ОпенПГП потпис</comment>
- <comment xml:lang="sv">frikopplad OpenPGP-signatur</comment>
- <comment xml:lang="tr">müstakil OpenPGP imzası</comment>
- <comment xml:lang="uk">відокремлений OpenPGP підпис</comment>
- <comment xml:lang="vi">chữ ký OpenPGP tách rời</comment>
- <comment xml:lang="zh-CN">分离的 OpenPGP 签名</comment>
- <comment xml:lang="zh-TW">分離的 OpenPGP 簽章</comment>
- <sub-class-of type="text/plain"/>
- <generic-icon name="text-x-generic"/>
- <magic priority="50">
+ <comment xml:lang="pt_BR">Assinatura OpenPGP destacada</comment>
+ <comment xml:lang="pl">Oddzielony podpis OpenPGP</comment>
+ <comment xml:lang="it">Firma staccata OpenPGP</comment>
+ <comment xml:lang="gl">Sinatura OpenPGP desancorada</comment>
+ <comment xml:lang="eu">OpenPGP sinadura askea</comment>
+ <comment xml:lang="es">firma OpenGPG separada</comment>
+ <comment xml:lang="de">Isolierte OpenPGP-Signatur</comment>
+ <comment xml:lang="be">адлучаны подпіс OpenPGP</comment>
+ <magic>
<match type="string" value="-----BEGIN PGP SIGNATURE-----" offset="0"/>
</magic>
<glob pattern="*.asc" weight="10"/>
@@ -1406,33 +1396,44 @@ command to generate the output files.
<!-- defined in RFC 2311 -->
<mime-type type="application/pkcs7-mime">
<comment>PKCS#7 file</comment>
- <comment xml:lang="bg">Файл за PKCS#7</comment>
- <comment xml:lang="ca">fitxer PKCS#7</comment>
- <comment xml:lang="da">PKCS#7-fil</comment>
- <comment xml:lang="de">PKCS#7-Datei</comment>
- <comment xml:lang="en-GB">PKCS#7 file</comment>
- <comment xml:lang="es">archivo PKCS#7</comment>
- <comment xml:lang="eu">PKCS#7 fitxategia</comment>
- <comment xml:lang="fi">PKCS#7-tiedosto</comment>
- <comment xml:lang="fr">fichier PKCS#7</comment>
- <comment xml:lang="hr">PKCS#7 datoteka</comment>
- <comment xml:lang="hu">PKCS#7 fájl</comment>
- <comment xml:lang="id">Berkas PKCS#7</comment>
- <comment xml:lang="it">File PKCS#7</comment>
- <comment xml:lang="kk">PKCS#7 файлы</comment>
- <comment xml:lang="ko">PKCS#7 파일</comment>
- <comment xml:lang="lt">PKCS#7 failas</comment>
- <comment xml:lang="pl">Plik PKCS#7</comment>
- <comment xml:lang="pt">ficheiro PKCS#7</comment>
- <comment xml:lang="pt-BR">Arquivo PKCS#7</comment>
- <comment xml:lang="ru">Файл PKCS#7</comment>
- <comment xml:lang="sk">Súbor PKCS#7</comment>
- <comment xml:lang="sl">Datoteka PKCS#7</comment>
- <comment xml:lang="sv">PKCS#7-fil</comment>
- <comment xml:lang="tr">PKCS#7 dosyası</comment>
+ <comment xml:lang="zh_TW">PKCS#7 檔案</comment>
+ <comment xml:lang="zh_CN">PKCS#7 文件</comment>
<comment xml:lang="uk">файл PKCS#7</comment>
- <comment xml:lang="zh-CN">PKCS#7 文件</comment>
- <comment xml:lang="zh-TW">PKCS#7 檔案</comment>
+ <comment xml:lang="tr">PKCS#7 dosyası</comment>
+ <comment xml:lang="sv">PKCS#7-fil</comment>
+ <comment xml:lang="sq">kartelë PKCS#7</comment>
+ <comment xml:lang="sl">Datoteka PKCS#7</comment>
+ <comment xml:lang="si">PKCS#7 ගොනුව</comment>
+ <comment xml:lang="sk">Súbor PKCS#7</comment>
+ <comment xml:lang="ru">Файл PKCS#7</comment>
+ <comment xml:lang="pt_BR">Arquivo PKCS#7</comment>
+ <comment xml:lang="pt">ficheiro PKCS#7</comment>
+ <comment xml:lang="pl">Plik PKCS#7</comment>
+ <comment xml:lang="oc">fichièr PKCS#7</comment>
+ <comment xml:lang="nl">PKCS#7-bestand</comment>
+ <comment xml:lang="lt">PKCS#7 failas</comment>
+ <comment xml:lang="ko">PKCS#7 파일</comment>
+ <comment xml:lang="kk">PKCS#7 файлы</comment>
+ <comment xml:lang="ka">PKCS#7 ფაილი</comment>
+ <comment xml:lang="ja">PKCS#7 ファイル</comment>
+ <comment xml:lang="it">File PKCS#7</comment>
+ <comment xml:lang="is">PKCS#7 skrá</comment>
+ <comment xml:lang="id">Berkas PKCS#7</comment>
+ <comment xml:lang="hu">PKCS#7 fájl</comment>
+ <comment xml:lang="hr">PKCS#7 datoteka</comment>
+ <comment xml:lang="he">קובץ PKCS#7</comment>
+ <comment xml:lang="gl">Ficheiro PKCS#7</comment>
+ <comment xml:lang="fr">fichier PKCS#7</comment>
+ <comment xml:lang="fi">PKCS#7-tiedosto</comment>
+ <comment xml:lang="eu">PKCS#7 fitxategia</comment>
+ <comment xml:lang="es">archivo PKCS#7</comment>
+ <comment xml:lang="en_GB">PKCS#7 file</comment>
+ <comment xml:lang="de">PKCS#7-Datei</comment>
+ <comment xml:lang="da">PKCS#7-fil</comment>
+ <comment xml:lang="ca">fitxer PKCS#7</comment>
+ <comment xml:lang="bg">Файл за PKCS#7</comment>
+ <comment xml:lang="be">файл PKCS#7</comment>
+ <comment xml:lang="ar">ملف PKCS#7</comment>
<acronym>PKCS</acronym>
<expanded-acronym>Public-Key Cryptography Standards</expanded-acronym>
<generic-icon name="text-x-generic"/>
@@ -1440,57 +1441,19 @@ command to generate the output files.
<glob pattern="*.p7m"/>
</mime-type>
<mime-type type="application/pkcs7-signature">
- <comment>detached S/MIME signature</comment>
- <comment xml:lang="af">losstaande S/MIME-handtekening</comment>
- <comment xml:lang="ar">إمضاء S/MIME مفصول</comment>
- <comment xml:lang="be-Latn">adłučany podpis S/MIME</comment>
- <comment xml:lang="bg">Отделѐн подпис — S/MIME</comment>
- <comment xml:lang="ca">signatura S/MIME abstreta</comment>
- <comment xml:lang="cs">oddělený podpis S/MIME</comment>
- <comment xml:lang="da">frigjort S/MIME-signatur</comment>
- <comment xml:lang="de">isolierte S/MIME-Signatur</comment>
- <comment xml:lang="el">Αποκομμένη υπογραφή S/MIME</comment>
- <comment xml:lang="en-GB">detached S/MIME signature</comment>
- <comment xml:lang="eo">dekroĉa S/MIME-subskribo</comment>
- <comment xml:lang="es">firma S/MIME separada</comment>
- <comment xml:lang="eu">desuzturtako S/MIME sinadura</comment>
- <comment xml:lang="fi">erillinen S/MIME-allekirjoitus</comment>
- <comment xml:lang="fo">skild S/MIME undirskrift</comment>
- <comment xml:lang="fr">signature S/MIME détachée</comment>
- <comment xml:lang="fur">firme S/MIME distacade</comment>
- <comment xml:lang="ga">síniú S/MIME scartha</comment>
- <comment xml:lang="gl">sinatura S/MIME independente</comment>
- <comment xml:lang="he">חתימת S/MIME מנותקת</comment>
- <comment xml:lang="hr">Odvojen S/MIME potpis</comment>
- <comment xml:lang="hu">leválasztott S/MIME-aláírás</comment>
- <comment xml:lang="ia">Signatura S/MIME distachate</comment>
- <comment xml:lang="id">tanda tangan S/MIME yang terlepas</comment>
- <comment xml:lang="it">Firma staccata S/MIME</comment>
- <comment xml:lang="ja">分離 S/MIME 署名</comment>
- <comment xml:lang="kk">бөлінген S/MIME қолтаңбасы</comment>
- <comment xml:lang="ko">분리된 S/MIME 서명</comment>
- <comment xml:lang="lt">neprisegtas S/MIME parašas</comment>
- <comment xml:lang="lv">atvienots S/MIME paraksts</comment>
- <comment xml:lang="ms">Tandatangan S/MIME terlerai</comment>
- <comment xml:lang="nb">frakoblet S/MIME-signatur</comment>
- <comment xml:lang="nl">losse S/MIME-ondertekening</comment>
- <comment xml:lang="nn">fråkopla S/MIME-signatur</comment>
- <comment xml:lang="oc">signatura S/MIME destacada</comment>
- <comment xml:lang="pl">Oddzielony podpis S/MIME</comment>
- <comment xml:lang="pt">assinatura S/MIME solta</comment>
- <comment xml:lang="pt-BR">Assinatura S/MIME destacada</comment>
- <comment xml:lang="ro">semnătură S/MIME detașată</comment>
+ <comment>Detached S/MIME signature</comment>
+ <comment xml:lang="zh_TW">卸離的 S/MIME 簽章</comment>
+ <comment xml:lang="uk">відокремлений підпис S/MIME</comment>
+ <comment xml:lang="sv">Frikopplad S/MIME-signatur</comment>
<comment xml:lang="ru">Отсоединённая подпись S/MIME</comment>
- <comment xml:lang="sk">Oddelený podpis S/MIME</comment>
- <comment xml:lang="sl">odpet podpis S/MIME</comment>
- <comment xml:lang="sq">Firmë e shkëputur S/MIME</comment>
- <comment xml:lang="sr">одвојени С/МИМЕ потпис</comment>
- <comment xml:lang="sv">frikopplad S/MIME-signatur</comment>
- <comment xml:lang="tr">müstakil S/MIME imzası</comment>
- <comment xml:lang="uk">відокремлений S/MIME підпис</comment>
- <comment xml:lang="vi">chữ ký S/MIME tách rời</comment>
- <comment xml:lang="zh-CN">分离的 S/MIME 签名</comment>
- <comment xml:lang="zh-TW">分離的 S/MIME 簽章</comment>
+ <comment xml:lang="pt_BR">Assinatura S/MIME destacada</comment>
+ <comment xml:lang="pl">Oddzielony podpis S/MIME</comment>
+ <comment xml:lang="it">Firma staccata S/MIME</comment>
+ <comment xml:lang="gl">Sinatura S/MIME desancorada</comment>
+ <comment xml:lang="eu">S/MIME sinadura askea</comment>
+ <comment xml:lang="es">firma S/MIME separada</comment>
+ <comment xml:lang="de">Isolierte S/MIME-Signatur</comment>
+ <comment xml:lang="be">адлучаны подпіс S/MIME</comment>
<acronym>S/MIME</acronym>
<expanded-acronym>Secure/Multipurpose Internet Mail Extensions</expanded-acronym>
<sub-class-of type="text/plain"/>
@@ -1499,139 +1462,155 @@ command to generate the output files.
</mime-type>
<mime-type type="application/pkcs8">
<comment>PKCS#8 private key</comment>
- <comment xml:lang="af">PKCS#8- private sleutel</comment>
- <comment xml:lang="ar">رزمة الشهادة PKCS#8</comment>
- <comment xml:lang="bg">Ключ — PKCS#8, частен</comment>
- <comment xml:lang="ca">clau privada PKCS#8</comment>
- <comment xml:lang="cs">soukromý klíč PKCS#8</comment>
- <comment xml:lang="da">PKCS#8-privat nøgle</comment>
- <comment xml:lang="de">PKCS#8 privater Schlüssel</comment>
- <comment xml:lang="el">Ιδιωτικό κλειδί PKCS#8</comment>
- <comment xml:lang="en-GB">PKCS#8 private key</comment>
- <comment xml:lang="es">clave privada PCKS#8</comment>
- <comment xml:lang="eu">PKCS#8 gako pribatua</comment>
- <comment xml:lang="fi">PKCS#8 yksityinen avain</comment>
- <comment xml:lang="fo">PKCS#8 privatur lykil</comment>
- <comment xml:lang="fr">clé privée PKCS#8</comment>
- <comment xml:lang="fur">clâf privade PKCS#8</comment>
- <comment xml:lang="ga">eochair phríobháideach PKCS#8</comment>
- <comment xml:lang="gl">Chave privada PKCS#8</comment>
- <comment xml:lang="he">מפתח פרטי של PKCS#8</comment>
- <comment xml:lang="hr">PKCS#8 privatni ključ</comment>
- <comment xml:lang="hu">PKCS#8 személyes kulcs</comment>
- <comment xml:lang="ia">Clave private PKCS#8</comment>
- <comment xml:lang="id">Kunci privat PKCS#8</comment>
- <comment xml:lang="it">Chiave privata PKCS#8</comment>
- <comment xml:lang="ja">PKCS#8 秘密鍵</comment>
- <comment xml:lang="kk">PKCS#8 меншік кілті</comment>
- <comment xml:lang="ko">PKCS#8 개인 키</comment>
- <comment xml:lang="lt">PKCS#8 asmeninis raktas</comment>
- <comment xml:lang="lv">PKCS#8 privātā atslēga</comment>
- <comment xml:lang="nl">PKCS#8 private sleutel</comment>
- <comment xml:lang="oc">clau privada PKCS#8</comment>
- <comment xml:lang="pl">Klucz prywatny PKCS#8</comment>
- <comment xml:lang="pt">chave privada PKCS#8</comment>
- <comment xml:lang="pt-BR">Chave privada PKCS#8</comment>
- <comment xml:lang="ro">Cheie privată PKCS#8</comment>
- <comment xml:lang="ru">Личный ключ PKCS#8</comment>
- <comment xml:lang="sk">Súkromný kľúč PKCS#8</comment>
- <comment xml:lang="sl">Datoteka osebnega ključa PKCS#8</comment>
- <comment xml:lang="sr">ПКЦС#8 лични кључ</comment>
- <comment xml:lang="sv">Privat PKCS#8-nyckel</comment>
- <comment xml:lang="tr">PKCS#8 özel anahtarı</comment>
+ <comment xml:lang="zh_TW">PKCS#8 私人金鑰</comment>
+ <comment xml:lang="zh_CN">PKCS#8 私钥</comment>
<comment xml:lang="uk">закритий ключ PKCS#8</comment>
- <comment xml:lang="zh-CN">PKCS#8 私钥</comment>
- <comment xml:lang="zh-TW">PKCS#8 私人金鑰</comment>
+ <comment xml:lang="tr">PKCS#8 özel anahtarı</comment>
+ <comment xml:lang="sv">Privat PKCS#8-nyckel</comment>
+ <comment xml:lang="sr">ПКЦС#8 лични кључ</comment>
+ <comment xml:lang="sq">kyç privat PKCS#8</comment>
+ <comment xml:lang="sl">Datoteka osebnega ključa PKCS#8</comment>
+ <comment xml:lang="si">PKCS#8 පුද්ගලික යතුර</comment>
+ <comment xml:lang="sk">Súkromný kľúč PKCS#8</comment>
+ <comment xml:lang="ru">Личный ключ PKCS#8</comment>
+ <comment xml:lang="ro">Cheie privată PKCS#8</comment>
+ <comment xml:lang="pt_BR">Chave privada PKCS#8</comment>
+ <comment xml:lang="pt">chave privada PKCS#8</comment>
+ <comment xml:lang="pl">Klucz prywatny PKCS#8</comment>
+ <comment xml:lang="oc">clau privada PKCS#8</comment>
+ <comment xml:lang="nl">PKCS#8-privésleutel</comment>
+ <comment xml:lang="lv">PKCS#8 privātā atslēga</comment>
+ <comment xml:lang="lt">PKCS#8 asmeninis raktas</comment>
+ <comment xml:lang="ko">PKCS#8 개인 키</comment>
+ <comment xml:lang="kk">PKCS#8 меншік кілті</comment>
+ <comment xml:lang="ja">PKCS#8 秘密鍵</comment>
+ <comment xml:lang="it">Chiave privata PKCS#8</comment>
+ <comment xml:lang="is">PKCS#8 einkalykill</comment>
+ <comment xml:lang="id">Kunci privat PKCS#8</comment>
+ <comment xml:lang="ia">Clave private PKCS#8</comment>
+ <comment xml:lang="hu">PKCS#8 személyes kulcs</comment>
+ <comment xml:lang="hr">PKCS#8 privatni ključ</comment>
+ <comment xml:lang="he">מפתח פרטי של PKCS#8</comment>
+ <comment xml:lang="gl">Chave privada PKCS#8</comment>
+ <comment xml:lang="ga">eochair phríobháideach PKCS#8</comment>
+ <comment xml:lang="fur">clâf privade PKCS#8</comment>
+ <comment xml:lang="fr">clé privée PKCS#8</comment>
+ <comment xml:lang="fo">PKCS#8 privatur lykil</comment>
+ <comment xml:lang="fi">PKCS#8 yksityinen avain</comment>
+ <comment xml:lang="eu">PKCS#8 gako pribatua</comment>
+ <comment xml:lang="es">clave privada PCKS#8</comment>
+ <comment xml:lang="en_GB">PKCS#8 private key</comment>
+ <comment xml:lang="el">Ιδιωτικό κλειδί PKCS#8</comment>
+ <comment xml:lang="de">Privater PKCS#8-Schlüssel</comment>
+ <comment xml:lang="da">PKCS#8-privat nøgle</comment>
+ <comment xml:lang="cs">soukromý klíč PKCS#8</comment>
+ <comment xml:lang="ca">clau privada PKCS#8</comment>
+ <comment xml:lang="bg">Ключ — PKCS#8, частен</comment>
+ <comment xml:lang="be">закрыты ключ PKCS#8</comment>
+ <comment xml:lang="ar">رزمة شهادة PKCS#8</comment>
+ <comment xml:lang="af">PKCS#8- private sleutel</comment>
<acronym>PKCS</acronym>
<expanded-acronym>Public-Key Cryptography Standards</expanded-acronym>
<glob pattern="*.p8"/>
</mime-type>
<mime-type type="application/pkcs8-encrypted">
<comment>PKCS#8 private key (encrypted)</comment>
- <comment xml:lang="af">PKCS#8- private sleutel (geënkripteer)</comment>
- <comment xml:lang="bg">Ключ — PKCS#8, частен, шифриран</comment>
- <comment xml:lang="ca">clau privada PKCS#8 (xifrada)</comment>
- <comment xml:lang="cs">soukromý klíč PKCS#8 (zašifrovaný)</comment>
- <comment xml:lang="da">PKCS#8-privat nøgle (krypteret)</comment>
- <comment xml:lang="de">PKCS#8 privater Schlüssel (verschlüsselt)</comment>
- <comment xml:lang="en-GB">PKCS#8 private key (encrypted)</comment>
- <comment xml:lang="es">clave privada PKCS#8 (cifrada)</comment>
- <comment xml:lang="eu">PKCS#8 gako pribatua (zifratua)</comment>
- <comment xml:lang="fi">PKCS#8 yksityinen avain (salattu)</comment>
- <comment xml:lang="fr">clé privée PKCS#8 (chiffrée)</comment>
- <comment xml:lang="fur">clâf privade PKCS#8 (cifrade)</comment>
- <comment xml:lang="ga">eochair phríobháideach PKCS#8 (criptithe)</comment>
- <comment xml:lang="hr">PKCS#8 privatni ključ (šifriran)</comment>
- <comment xml:lang="hu">PKCS#8 személyes kulcs (titkosított)</comment>
- <comment xml:lang="id">Kunci privat PKCS#8 (terenkripsi)</comment>
- <comment xml:lang="it">Chiave privata PKCS#8 (cifrata)</comment>
- <comment xml:lang="kk">PKCS#8 жеке кілті (шифрленген)</comment>
- <comment xml:lang="ko">PKCS#8 개인 키(암호화됨)</comment>
- <comment xml:lang="pl">Klucz prywatny PKCS#8 (zaszyfrowany)</comment>
- <comment xml:lang="pt">chave privada PKCS#8 (encriptada)</comment>
- <comment xml:lang="pt-BR">Chave privada PKCS#8 (criptografada)</comment>
- <comment xml:lang="ru">Личный ключ PKCS#8 (зашифрованный)</comment>
- <comment xml:lang="sk">Súkromný kľúč PKCS#8 (šifrovaný)</comment>
- <comment xml:lang="sl">Zasebni ključ PKCS#8 (širfirano)</comment>
- <comment xml:lang="sv">Privat PKCS#8-nyckel (krypterad)</comment>
- <comment xml:lang="tr">PKCS#8 özel anahtar (şifrelenmiş)</comment>
+ <comment xml:lang="zh_TW">PKCS#8 私人金鑰 (加密)</comment>
+ <comment xml:lang="zh_CN">PKCS#8 私钥(已加密)</comment>
<comment xml:lang="uk">закритий ключ PKCS#8 (зашифрований)</comment>
- <comment xml:lang="zh-CN">PKCS#8 私钥(已加密)</comment>
- <comment xml:lang="zh-TW">PKCS#8 私人金鑰 (加密)</comment>
+ <comment xml:lang="tr">PKCS#8 özel anahtar (şifrelenmiş)</comment>
+ <comment xml:lang="sv">Privat PKCS#8-nyckel (krypterad)</comment>
+ <comment xml:lang="sq">ky privat PKCS#8 (i fshehtëzuar)</comment>
+ <comment xml:lang="sl">Zasebni ključ PKCS#8 (širfirano)</comment>
+ <comment xml:lang="si">PKCS#8 පුද්ගලික යතුර (සංකේතනය කළ)</comment>
+ <comment xml:lang="sk">Súkromný kľúč PKCS#8 (šifrovaný)</comment>
+ <comment xml:lang="ru">Личный ключ PKCS#8 (зашифрованный)</comment>
+ <comment xml:lang="pt_BR">Chave privada PKCS#8 (criptografada)</comment>
+ <comment xml:lang="pt">chave privada PKCS#8 (encriptada)</comment>
+ <comment xml:lang="pl">Klucz prywatny PKCS#8 (zaszyfrowany)</comment>
+ <comment xml:lang="nl">PKCS#8-privésleutel (versleuteld)</comment>
+ <comment xml:lang="ko">PKCS#8 개인 키(암호화됨)</comment>
+ <comment xml:lang="kk">PKCS#8 жеке кілті (шифрленген)</comment>
+ <comment xml:lang="ja">PKCS#8 プライベートキー (暗号化)</comment>
+ <comment xml:lang="it">Chiave privata PKCS#8 (cifrata)</comment>
+ <comment xml:lang="is">PKCS#8 einkalykill (dulritaður)</comment>
+ <comment xml:lang="id">Kunci privat PKCS#8 (terenkripsi)</comment>
+ <comment xml:lang="hu">PKCS#8 személyes kulcs (titkosított)</comment>
+ <comment xml:lang="hr">PKCS#8 privatni ključ (šifriran)</comment>
+ <comment xml:lang="he">מפתח פרטי מסוג PKCS#8 (מוצפן)</comment>
+ <comment xml:lang="gl">Chave privada PKCS#8 (cifrada)</comment>
+ <comment xml:lang="ga">eochair phríobháideach PKCS#8 (criptithe)</comment>
+ <comment xml:lang="fur">clâf privade PKCS#8 (cifrade)</comment>
+ <comment xml:lang="fr">clé privée PKCS#8 (chiffrée)</comment>
+ <comment xml:lang="fi">PKCS#8 yksityinen avain (salattu)</comment>
+ <comment xml:lang="eu">PKCS#8 gako pribatua (zifratua)</comment>
+ <comment xml:lang="es">clave privada PKCS#8 (cifrada)</comment>
+ <comment xml:lang="en_GB">PKCS#8 private key (encrypted)</comment>
+ <comment xml:lang="de">Privater PKCS#8-Schlüssel (verschlüsselt)</comment>
+ <comment xml:lang="da">PKCS#8-privat nøgle (krypteret)</comment>
+ <comment xml:lang="cs">soukromý klíč PKCS#8 (zašifrovaný)</comment>
+ <comment xml:lang="ca">clau privada PKCS#8 (xifrada)</comment>
+ <comment xml:lang="bg">Ключ — PKCS#8, частен, шифриран</comment>
+ <comment xml:lang="be">закрыты ключ PKCS#8 (зашыфраваны)</comment>
+ <comment xml:lang="ar">مفتاح خاص PKCS#8 (مشفر)</comment>
+ <comment xml:lang="af">PKCS#8- private sleutel (geënkripteer)</comment>
<acronym>PKCS</acronym>
<expanded-acronym>Public-Key Cryptography Standards</expanded-acronym>
<glob pattern="*.p8e"/>
</mime-type>
<mime-type type="application/pkcs10">
<comment>PKCS#10 certification request</comment>
- <comment xml:lang="af">PKCS#10-sertifiseringsversoek</comment>
- <comment xml:lang="ar">طلب شهادة PKCS#10</comment>
- <comment xml:lang="be-Latn">Zapyt sertyfikacyi PKCS#10</comment>
- <comment xml:lang="bg">Заявка за сертификат — PKCS#10</comment>
- <comment xml:lang="ca">sol·licitud de certificació PKCS#10</comment>
- <comment xml:lang="cs">žádost o certifikát PKCS#10</comment>
- <comment xml:lang="da">PKCS#10-certifikatanmodning</comment>
- <comment xml:lang="de">PKCS#10-Zertifikatanfrage</comment>
- <comment xml:lang="el">Αίτηση πιστοποίησης PKCS#10</comment>
- <comment xml:lang="en-GB">PKCS#10 certification request</comment>
- <comment xml:lang="es">petición de certificados PKCS#10</comment>
- <comment xml:lang="eu">PKCS#10 ziurtagirien eskaera</comment>
- <comment xml:lang="fi">PKCS#10-varmennepyyntö</comment>
- <comment xml:lang="fo">PKCS#10 váttanarumbøn</comment>
- <comment xml:lang="fr">requête de certification PKCS#10</comment>
- <comment xml:lang="fur">richieste certificazion PKCS#10</comment>
- <comment xml:lang="ga">iarratas dheimhniúchán PKCS#10</comment>
- <comment xml:lang="gl">Solicitude de certificado PKCS#10</comment>
- <comment xml:lang="he">בקשה מוסמכת PLCS#10</comment>
- <comment xml:lang="hr">PKCS#10 zahtjev vjerodajnice</comment>
- <comment xml:lang="hu">PKCS#10-tanúsítványkérés</comment>
- <comment xml:lang="ia">Requesta de certification PKCS#10</comment>
- <comment xml:lang="id">Permintaan sertifikasi PKCS#10</comment>
- <comment xml:lang="it">Richiesta certificazione PKCS#10</comment>
- <comment xml:lang="ja">PKCS#10 証明書署名要求</comment>
- <comment xml:lang="kk">PKCS#10 сертификацияға сұранымы</comment>
- <comment xml:lang="ko">PKCS#10 인증서 요청</comment>
- <comment xml:lang="lt">PKCS#10 liudijimų užklausa</comment>
- <comment xml:lang="lv">PKCS#10 sertifikācijas pieprasījums</comment>
- <comment xml:lang="nb">PKCS#10-sertifikatforespørsel</comment>
- <comment xml:lang="nl">PKCS#10-certificatieverzoek</comment>
- <comment xml:lang="nn">PKCS#10-sertifiseringsførespurnad</comment>
- <comment xml:lang="oc">requèsta de certificacion PKCS#10</comment>
- <comment xml:lang="pl">Żądanie certyfikatu PKCS#10</comment>
- <comment xml:lang="pt">pedido de certificação PKCS#10</comment>
- <comment xml:lang="pt-BR">Pedido de certificação PKCS#12</comment>
- <comment xml:lang="ro">Cerere de certificat PKCS#10</comment>
- <comment xml:lang="ru">Запрос сертификации PKCS#10</comment>
- <comment xml:lang="sk">Požiadavka na certifikát PKCS#10</comment>
- <comment xml:lang="sl">Datoteka potrdila PKCS#10</comment>
- <comment xml:lang="sq">Kërkesë çertifikimi PKCS#10</comment>
- <comment xml:lang="sr">ПКЦС#10 зхатев уверења</comment>
- <comment xml:lang="sv">PKCS#10-certifikatbegäran</comment>
- <comment xml:lang="tr">PKCS#10 sertifika isteği</comment>
- <comment xml:lang="uk">комплект сертифікатів PKCS#10</comment>
+ <comment xml:lang="zh_TW">PKCS#10 憑證請求</comment>
+ <comment xml:lang="zh_CN">PKCS#10 认证请求</comment>
<comment xml:lang="vi">Yêu cầu chứng nhận PKCS#10</comment>
- <comment xml:lang="zh-CN">PKCS#10 认证请求</comment>
- <comment xml:lang="zh-TW">PKCS#10 憑證請求</comment>
+ <comment xml:lang="uk">комплект сертифікатів PKCS#10</comment>
+ <comment xml:lang="tr">PKCS#10 sertifika isteği</comment>
+ <comment xml:lang="sv">PKCS#10-certifikatbegäran</comment>
+ <comment xml:lang="sr">ПКЦС#10 зхатев уверења</comment>
+ <comment xml:lang="sq">kërkesë certifikimi PKCS#10</comment>
+ <comment xml:lang="sl">Datoteka potrdila PKCS#10</comment>
+ <comment xml:lang="si">PKCS#10 සහතික කිරීමේ ඉල්ලීම</comment>
+ <comment xml:lang="sk">Požiadavka na certifikát PKCS#10</comment>
+ <comment xml:lang="ru">Запрос сертификации PKCS#10</comment>
+ <comment xml:lang="ro">Cerere de certificat PKCS#10</comment>
+ <comment xml:lang="pt_BR">Pedido de certificação PKCS#12</comment>
+ <comment xml:lang="pt">pedido de certificação PKCS#10</comment>
+ <comment xml:lang="pl">Żądanie certyfikatu PKCS#10</comment>
+ <comment xml:lang="oc">requèsta de certificacion PKCS#10</comment>
+ <comment xml:lang="nn">PKCS#10-sertifiseringsførespurnad</comment>
+ <comment xml:lang="nl">PKCS#10-certificatieverzoek</comment>
+ <comment xml:lang="nb">PKCS#10-sertifikatforespørsel</comment>
+ <comment xml:lang="lv">PKCS#10 sertifikācijas pieprasījums</comment>
+ <comment xml:lang="lt">PKCS#10 liudijimų užklausa</comment>
+ <comment xml:lang="ko">PKCS#10 인증서 요청</comment>
+ <comment xml:lang="kk">PKCS#10 сертификацияға сұранымы</comment>
+ <comment xml:lang="ja">PKCS#10 証明書署名要求</comment>
+ <comment xml:lang="it">Richiesta certificazione PKCS#10</comment>
+ <comment xml:lang="is">PKCS#10 skilríkisbeiðni</comment>
+ <comment xml:lang="id">Permintaan sertifikasi PKCS#10</comment>
+ <comment xml:lang="ia">Requesta de certification PKCS#10</comment>
+ <comment xml:lang="hu">PKCS#10-tanúsítványkérés</comment>
+ <comment xml:lang="hr">PKCS#10 zahtjev vjerodajnice</comment>
+ <comment xml:lang="he">בקשה מוסמכת PLCS#10</comment>
+ <comment xml:lang="gl">Solicitude de certificado PKCS#10</comment>
+ <comment xml:lang="ga">iarratas dheimhniúchán PKCS#10</comment>
+ <comment xml:lang="fur">richieste certificazion PKCS#10</comment>
+ <comment xml:lang="fr">requête de certification PKCS#10</comment>
+ <comment xml:lang="fo">PKCS#10 váttanarumbøn</comment>
+ <comment xml:lang="fi">PKCS#10-varmennepyyntö</comment>
+ <comment xml:lang="eu">PKCS#10 ziurtagirien eskaera</comment>
+ <comment xml:lang="es">petición de certificados PKCS#10</comment>
+ <comment xml:lang="en_GB">PKCS#10 certification request</comment>
+ <comment xml:lang="el">Αίτηση πιστοποίησης PKCS#10</comment>
+ <comment xml:lang="de">PKCS#10-Zertifikatanfrage</comment>
+ <comment xml:lang="da">PKCS#10-certifikatanmodning</comment>
+ <comment xml:lang="cs">žádost o certifikát PKCS#10</comment>
+ <comment xml:lang="ca">sol·licitud de certificació PKCS#10</comment>
+ <comment xml:lang="bg">Заявка за сертификат — PKCS#10</comment>
+ <comment xml:lang="be@latin">Zapyt sertyfikacyi PKCS#10</comment>
+ <comment xml:lang="be">запыт сертыфікацыі PKCS#10</comment>
+ <comment xml:lang="ar">طلب شهادة PKCS#10</comment>
+ <comment xml:lang="af">PKCS#10-sertifiseringsversoek</comment>
<acronym>PKCS</acronym>
<expanded-acronym>Public-Key Cryptography Standards</expanded-acronym>
<generic-icon name="text-x-generic"/>
@@ -1639,161 +1618,175 @@ command to generate the output files.
</mime-type>
<mime-type type="application/pkix-cert">
<comment>X.509 certificate</comment>
- <comment xml:lang="af">X.509-sertifikaat</comment>
- <comment xml:lang="ar">شهادة X.509</comment>
- <comment xml:lang="ast">Certificáu X.509</comment>
- <comment xml:lang="bg">Сертификат — X.509</comment>
- <comment xml:lang="ca">certificat X.509</comment>
- <comment xml:lang="cs">certifikát X.509</comment>
- <comment xml:lang="da">X.509-certifikat</comment>
- <comment xml:lang="de">X.509-Zertifikat</comment>
- <comment xml:lang="el">Πιστοποιητικό X.509</comment>
- <comment xml:lang="en-GB">X.509 certificate</comment>
- <comment xml:lang="es">certificado X.509</comment>
- <comment xml:lang="eu">X.509 ziurtagiria</comment>
- <comment xml:lang="fi">X.509-varmenne</comment>
- <comment xml:lang="fo">X.509 prógv</comment>
- <comment xml:lang="fr">certificat X.509</comment>
- <comment xml:lang="fur">certificât X.509</comment>
- <comment xml:lang="ga">teastas X.509</comment>
- <comment xml:lang="gl">Certificado X.509</comment>
- <comment xml:lang="he">אישור X.509</comment>
- <comment xml:lang="hr">X.509 vjerodajnica</comment>
- <comment xml:lang="hu">X.509 tanúsítvány</comment>
- <comment xml:lang="ia">Certificato X.509</comment>
- <comment xml:lang="id">Sertifikat X.509</comment>
- <comment xml:lang="it">Certificato X.509</comment>
- <comment xml:lang="ja">X.509 証明書</comment>
- <comment xml:lang="kk">X.509 сертификаты</comment>
- <comment xml:lang="ko">X.509 인증서</comment>
- <comment xml:lang="lt">X.509 liudijimas</comment>
- <comment xml:lang="lv">X.509 sertifikāts</comment>
- <comment xml:lang="nl">X.509 certificaat</comment>
- <comment xml:lang="oc">certificat X.509</comment>
- <comment xml:lang="pl">Certyfikat X.509</comment>
- <comment xml:lang="pt">certificado X.509</comment>
- <comment xml:lang="pt-BR">Certificado X.509</comment>
- <comment xml:lang="ro">Certificat X.509</comment>
- <comment xml:lang="ru">Сертификат X.509</comment>
- <comment xml:lang="sk">Certifikát X.509</comment>
- <comment xml:lang="sl">Datoteka potrdila X.509</comment>
- <comment xml:lang="sr">Икс.509 уверење</comment>
- <comment xml:lang="sv">X.509-certifikat</comment>
- <comment xml:lang="tr">X.509 sertifikası</comment>
+ <comment xml:lang="zh_TW">X.509 憑證</comment>
+ <comment xml:lang="zh_CN">X.509 证书</comment>
<comment xml:lang="uk">сертифікат X.509</comment>
- <comment xml:lang="zh-CN">X.509 证书</comment>
- <comment xml:lang="zh-TW">X.509 憑證</comment>
+ <comment xml:lang="tr">X.509 sertifikası</comment>
+ <comment xml:lang="sv">X.509-certifikat</comment>
+ <comment xml:lang="sr">Икс.509 уверење</comment>
+ <comment xml:lang="sq">dëshmi X.509</comment>
+ <comment xml:lang="sl">Datoteka potrdila X.509</comment>
+ <comment xml:lang="si">X.509 සහතිකය</comment>
+ <comment xml:lang="sk">Certifikát X.509</comment>
+ <comment xml:lang="ru">Сертификат X.509</comment>
+ <comment xml:lang="ro">Certificat X.509</comment>
+ <comment xml:lang="pt_BR">Certificado X.509</comment>
+ <comment xml:lang="pt">certificado X.509</comment>
+ <comment xml:lang="pl">Certyfikat X.509</comment>
+ <comment xml:lang="oc">certificat X.509</comment>
+ <comment xml:lang="nl">X.509-certificaat</comment>
+ <comment xml:lang="lv">X.509 sertifikāts</comment>
+ <comment xml:lang="lt">X.509 liudijimas</comment>
+ <comment xml:lang="ko">X.509 인증서</comment>
+ <comment xml:lang="kk">X.509 сертификаты</comment>
+ <comment xml:lang="ka">X.509 სერტიფიკატი</comment>
+ <comment xml:lang="ja">X.509 証明書</comment>
+ <comment xml:lang="it">Certificato X.509</comment>
+ <comment xml:lang="is">X.509 skilríki</comment>
+ <comment xml:lang="id">Sertifikat X.509</comment>
+ <comment xml:lang="ia">Certificato X.509</comment>
+ <comment xml:lang="hu">X.509 tanúsítvány</comment>
+ <comment xml:lang="hr">X.509 vjerodajnica</comment>
+ <comment xml:lang="he">אישור X.509</comment>
+ <comment xml:lang="gl">Certificado X.509</comment>
+ <comment xml:lang="ga">teastas X.509</comment>
+ <comment xml:lang="fur">certificât X.509</comment>
+ <comment xml:lang="fr">certificat X.509</comment>
+ <comment xml:lang="fo">X.509 prógv</comment>
+ <comment xml:lang="fi">X.509-varmenne</comment>
+ <comment xml:lang="eu">X.509 ziurtagiria</comment>
+ <comment xml:lang="es">certificado X.509</comment>
+ <comment xml:lang="en_GB">X.509 certificate</comment>
+ <comment xml:lang="el">Πιστοποιητικό X.509</comment>
+ <comment xml:lang="de">X.509-Zertifikat</comment>
+ <comment xml:lang="da">X.509-certifikat</comment>
+ <comment xml:lang="cs">certifikát X.509</comment>
+ <comment xml:lang="ca">certificat X.509</comment>
+ <comment xml:lang="bg">Сертификат — X.509</comment>
+ <comment xml:lang="be">сертыфікат X.509</comment>
+ <comment xml:lang="ast">Certificáu X.509</comment>
+ <comment xml:lang="ar">شهادة X.509</comment>
+ <comment xml:lang="af">X.509-sertifikaat</comment>
+ <magic>
+ <match type="string" value="-----BEGIN CERTIFICATE-----" offset="0"/>
+ <match type="string" value="-----BEGIN X509 CERTIFICATE-----" offset="0"/>
+ </magic>
<glob pattern="*.cer"/>
</mime-type>
<mime-type type="application/pkix-crl">
- <comment>certificate revocation list</comment>
- <comment xml:lang="bg">Списък с отхвърлени сертификати</comment>
- <comment xml:lang="ca">llista de revocació de certificats</comment>
- <comment xml:lang="da">certifikat tilbagetrækkelsesliste</comment>
- <comment xml:lang="de">Zertifikatsperrliste</comment>
- <comment xml:lang="en-GB">certificate revocation list</comment>
- <comment xml:lang="es">lista de revocación de certificados</comment>
- <comment xml:lang="eu">ziurtagiri-errebokatzeen zerrenda</comment>
- <comment xml:lang="fi">Varmenteiden sulkulista</comment>
- <comment xml:lang="fr">liste de révocation de certificat</comment>
- <comment xml:lang="hr">Popis opozvanih vjerodajnica</comment>
- <comment xml:lang="hu">tanúsítvány visszavonási lista</comment>
- <comment xml:lang="id">daftar pencabutan sertifikat</comment>
- <comment xml:lang="it">Elenco certificati di revoca</comment>
- <comment xml:lang="kk">сертификатты қайта шақыру тізімі</comment>
- <comment xml:lang="ko">인증서 철회 목록</comment>
- <comment xml:lang="pl">Lista unieważnień certyfikatów</comment>
- <comment xml:lang="pt">lista de revogação de certificados</comment>
- <comment xml:lang="pt-BR">Lista de revogação de certificados</comment>
- <comment xml:lang="ru">список аннулирования сертификатов</comment>
- <comment xml:lang="sv">certifikatåterkallningslista</comment>
- <comment xml:lang="tr">sertifika iptal listesi</comment>
+ <comment>Certificate revocation list</comment>
<comment xml:lang="uk">список відкликання сертифікатів</comment>
- <comment xml:lang="zh-CN">证书吊销列表</comment>
- <comment xml:lang="zh-TW">憑證撤銷清單</comment>
+ <comment xml:lang="sv">Certifikatåterkallningslista</comment>
+ <comment xml:lang="sq">listë shfuqizimi dëshmish</comment>
+ <comment xml:lang="ru">Список отзыва сертификатов</comment>
+ <comment xml:lang="pt_BR">Lista de revogação de certificado</comment>
+ <comment xml:lang="pl">Lista unieważnień certyfikatów</comment>
+ <comment xml:lang="it">Elenco certificati di revoca</comment>
+ <comment xml:lang="gl">Lista de revogación de certificados</comment>
+ <comment xml:lang="es">lista de revocación de certificados</comment>
+ <comment xml:lang="de">Zertifikat-Widerrufliste</comment>
+ <comment xml:lang="be">спіс адкліканых сертыфікатаў</comment>
+ <magic>
+ <match type="string" value="-----BEGIN X509 CRL-----" offset="0"/>
+ </magic>
<glob pattern="*.crl"/>
</mime-type>
<mime-type type="application/pkix-pkipath">
<comment>PkiPath certification path</comment>
- <comment xml:lang="af">PkiPath-sertifiseringspad</comment>
- <comment xml:lang="ar">مسار شهادة PkiPath</comment>
- <comment xml:lang="ast">Camín de certificación PkiPath</comment>
- <comment xml:lang="bg">Сертификационна верига — PkiPath</comment>
- <comment xml:lang="ca">camí cap a la certificació PkiPath</comment>
- <comment xml:lang="cs">cesta k certifikátu PkiPath</comment>
- <comment xml:lang="da">PkiPath-certifikationssti</comment>
- <comment xml:lang="de">PkiPath-Zertifikatspfad</comment>
- <comment xml:lang="el">Διαδρομή πιστοποιητικού PkiPath</comment>
- <comment xml:lang="en-GB">PkiPath certification path</comment>
- <comment xml:lang="es">ruta de certificación PkiPath</comment>
- <comment xml:lang="eu">PkiPath ziurtagirien bide-izena</comment>
- <comment xml:lang="fi">PkiPath-varmennepolku</comment>
- <comment xml:lang="fo">PkiPath váttanleið</comment>
- <comment xml:lang="fr">chemin de certification PkiPath</comment>
- <comment xml:lang="fur">percors di certificazion PkiPath</comment>
- <comment xml:lang="ga">conair dheimhniúcháin PkiPath</comment>
- <comment xml:lang="gl">Ruta de certificación PkiPath</comment>
- <comment xml:lang="he">נתיב מאושר של PkiPath</comment>
- <comment xml:lang="hr">PkiPath putanja vjerodajnice</comment>
- <comment xml:lang="hu">PkiPath tanúsítványútvonal</comment>
- <comment xml:lang="ia">Cammino de certification PkiPath</comment>
- <comment xml:lang="id">Alamat sertifikasi PkiPath</comment>
- <comment xml:lang="it">Percorso certificazione PkiPath</comment>
- <comment xml:lang="ja">PkiPath 証明書パス</comment>
- <comment xml:lang="kk">PkiPath сертификаттау жолы</comment>
- <comment xml:lang="ko">PkiPath 인증서 요청</comment>
- <comment xml:lang="lt">PkiPath liudijimų maršrutas</comment>
- <comment xml:lang="lv">PkiPath sertifikāta ceļš</comment>
- <comment xml:lang="nl">PkiPath-certificatiepad</comment>
- <comment xml:lang="oc">camin de certificacion PkiPath</comment>
- <comment xml:lang="pl">Ścieżka certyfikacji PkiPath</comment>
- <comment xml:lang="pt">caminho de certificação PkiPath</comment>
- <comment xml:lang="pt-BR">Pedido de certificação PkiPath</comment>
- <comment xml:lang="ro">Cale certificare PkiPath</comment>
- <comment xml:lang="ru">Путь сертификации PkiPath</comment>
- <comment xml:lang="sk">Cesta k certifikátu PkiPath</comment>
- <comment xml:lang="sl">Datoteka poti potrdila PkiPath</comment>
- <comment xml:lang="sr">путања уверења ПкиПат-а</comment>
- <comment xml:lang="sv">PkiPath-certifikatsekvens</comment>
- <comment xml:lang="tr">PkiPath sertifika yolu</comment>
- <comment xml:lang="uk">шлях сертифікації PkiPath</comment>
+ <comment xml:lang="zh_TW">PkiPath 憑證路徑</comment>
+ <comment xml:lang="zh_CN">PkiPath 证书目录</comment>
<comment xml:lang="vi">Đường dẫn cấp chứng nhận PkiPath</comment>
- <comment xml:lang="zh-CN">PkiPath 证书目录</comment>
- <comment xml:lang="zh-TW">PkiPath 憑證路徑</comment>
+ <comment xml:lang="uk">шлях сертифікації PkiPath</comment>
+ <comment xml:lang="tr">PkiPath sertifika yolu</comment>
+ <comment xml:lang="sv">PkiPath-certifikatsekvens</comment>
+ <comment xml:lang="sr">путања уверења ПкиПат-а</comment>
+ <comment xml:lang="sq">shteg dëshmish PkiPath</comment>
+ <comment xml:lang="sl">Datoteka poti potrdila PkiPath</comment>
+ <comment xml:lang="si">PkiPath සහතික කිරීමේ මාර්ගය</comment>
+ <comment xml:lang="sk">Cesta k certifikátu PkiPath</comment>
+ <comment xml:lang="ru">Путь сертификации PkiPath</comment>
+ <comment xml:lang="ro">Cale certificare PkiPath</comment>
+ <comment xml:lang="pt_BR">Pedido de certificação PkiPath</comment>
+ <comment xml:lang="pt">caminho de certificação PkiPath</comment>
+ <comment xml:lang="pl">Ścieżka certyfikacji PkiPath</comment>
+ <comment xml:lang="oc">camin de certificacion PkiPath</comment>
+ <comment xml:lang="nl">PkiPath-certificatiepad</comment>
+ <comment xml:lang="lv">PkiPath sertifikāta ceļš</comment>
+ <comment xml:lang="lt">PkiPath liudijimų maršrutas</comment>
+ <comment xml:lang="ko">PkiPath 인증서 요청</comment>
+ <comment xml:lang="kk">PkiPath сертификаттау жолы</comment>
+ <comment xml:lang="ja">PkiPath 証明書パス</comment>
+ <comment xml:lang="it">Percorso certificazione PkiPath</comment>
+ <comment xml:lang="is">PkiPath vottunarslóð</comment>
+ <comment xml:lang="id">Alamat sertifikasi PkiPath</comment>
+ <comment xml:lang="ia">Cammino de certification PkiPath</comment>
+ <comment xml:lang="hu">PkiPath tanúsítványútvonal</comment>
+ <comment xml:lang="hr">PkiPath putanja vjerodajnice</comment>
+ <comment xml:lang="he">נתיב מאושר של PkiPath</comment>
+ <comment xml:lang="gl">Ruta de certificación PkiPath</comment>
+ <comment xml:lang="ga">conair dheimhniúcháin PkiPath</comment>
+ <comment xml:lang="fur">percors di certificazion PkiPath</comment>
+ <comment xml:lang="fr">chemin de certification PkiPath</comment>
+ <comment xml:lang="fo">PkiPath váttanleið</comment>
+ <comment xml:lang="fi">PkiPath-varmennepolku</comment>
+ <comment xml:lang="eu">PkiPath ziurtagirien bide-izena</comment>
+ <comment xml:lang="es">ruta de certificación PkiPath</comment>
+ <comment xml:lang="en_GB">PkiPath certification path</comment>
+ <comment xml:lang="el">Διαδρομή πιστοποιητικού PkiPath</comment>
+ <comment xml:lang="de">PkiPath-Zertifikatspfad</comment>
+ <comment xml:lang="da">PkiPath-certifikationssti</comment>
+ <comment xml:lang="cs">cesta k certifikátu PkiPath</comment>
+ <comment xml:lang="ca">camí cap a la certificació PkiPath</comment>
+ <comment xml:lang="bg">Сертификационна верига — PkiPath</comment>
+ <comment xml:lang="be">шлях сертыфікацыі PkiPath</comment>
+ <comment xml:lang="ast">Camín de certificación PkiPath</comment>
+ <comment xml:lang="ar">مسار شهادة PkiPath</comment>
+ <comment xml:lang="af">PkiPath-sertifiseringspad</comment>
<glob pattern="*.pkipath"/>
</mime-type>
<mime-type type="application/postscript">
<comment>PostScript document</comment>
- <comment xml:lang="bg">Документ — PostScrip</comment>
- <comment xml:lang="ca">document PostScript</comment>
- <comment xml:lang="da">PostScript-dokument</comment>
- <comment xml:lang="de">PostScript-Dokument</comment>
- <comment xml:lang="en-GB">PostScript document</comment>
- <comment xml:lang="es">documento PostScript</comment>
- <comment xml:lang="eu">PostScript dokumentua</comment>
- <comment xml:lang="fi">PostScript-asiakirja</comment>
- <comment xml:lang="fr">document PostScript</comment>
- <comment xml:lang="hr">PostScript dokument</comment>
- <comment xml:lang="hu">PostScript dokumentum</comment>
- <comment xml:lang="id">Dokumen PostScript</comment>
- <comment xml:lang="it">Documento PostScript</comment>
- <comment xml:lang="kk">PostScript құжаты</comment>
- <comment xml:lang="ko">포스트스크립트 문서</comment>
- <comment xml:lang="lt">PostScript dokumentas</comment>
- <comment xml:lang="pl">Dokument PostScript</comment>
- <comment xml:lang="pt">documento PostScript</comment>
- <comment xml:lang="pt-BR">Documento PostScript</comment>
- <comment xml:lang="ru">Документ PostScript</comment>
- <comment xml:lang="sk">Dokument PostScript</comment>
- <comment xml:lang="sl">Dokument PostScript</comment>
- <comment xml:lang="sv">Postscript-dokument</comment>
- <comment xml:lang="tr">PostScript belgesi</comment>
+ <comment xml:lang="zh_TW">PostScript 文件</comment>
+ <comment xml:lang="zh_CN">PostScript 文档</comment>
<comment xml:lang="uk">документ PostScript</comment>
- <comment xml:lang="zh-CN">PostScript 文档</comment>
- <comment xml:lang="zh-TW">PostScript 文件</comment>
+ <comment xml:lang="tr">PostScript belgesi</comment>
+ <comment xml:lang="sv">Postscript-dokument</comment>
+ <comment xml:lang="sq">dokument PostScript</comment>
+ <comment xml:lang="sl">Dokument PostScript</comment>
+ <comment xml:lang="si">PostScript ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument PostScript</comment>
+ <comment xml:lang="ru">Документ PostScript</comment>
+ <comment xml:lang="pt_BR">Documento PostScript</comment>
+ <comment xml:lang="pt">documento PostScript</comment>
+ <comment xml:lang="pl">Dokument PostScript</comment>
+ <comment xml:lang="oc">document PostScript</comment>
+ <comment xml:lang="nl">PostScript-document</comment>
+ <comment xml:lang="lt">PostScript dokumentas</comment>
+ <comment xml:lang="ko">포스트스크립트 문서</comment>
+ <comment xml:lang="kk">PostScript құжаты</comment>
+ <comment xml:lang="ka">PostScript-ის დოკუმენტი</comment>
+ <comment xml:lang="ja">PostScript ドキュメント</comment>
+ <comment xml:lang="it">Documento PostScript</comment>
+ <comment xml:lang="is">PostScript skjal</comment>
+ <comment xml:lang="id">Dokumen PostScript</comment>
+ <comment xml:lang="hu">PostScript dokumentum</comment>
+ <comment xml:lang="hr">PostScript dokument</comment>
+ <comment xml:lang="he">מסמך PostScript</comment>
+ <comment xml:lang="gl">Documento de PostScript</comment>
+ <comment xml:lang="fr">document PostScript</comment>
+ <comment xml:lang="fi">PostScript-asiakirja</comment>
+ <comment xml:lang="eu">PostScript dokumentua</comment>
+ <comment xml:lang="es">documento PostScript</comment>
+ <comment xml:lang="en_GB">PostScript document</comment>
+ <comment xml:lang="de">PostScript-Dokument</comment>
+ <comment xml:lang="da">PostScript-dokument</comment>
+ <comment xml:lang="ca">document PostScript</comment>
+ <comment xml:lang="bg">Документ — PostScrip</comment>
+ <comment xml:lang="be">дакумент PostScript</comment>
+ <comment xml:lang="ar">مستند بوست سكربت</comment>
<sub-class-of type="text/plain"/>
<generic-icon name="x-office-document"/>
- <magic priority="50">
+ <magic>
<match type="string" value="\004%!" offset="0"/>
<match type="string" value="%!" offset="0"/>
</magic>
@@ -1801,56 +1794,60 @@ command to generate the output files.
</mime-type>
<mime-type type="application/prs.plucker">
<comment>Plucker document</comment>
- <comment xml:lang="af">Plucker-dokument</comment>
- <comment xml:lang="ar">مستند Plucker</comment>
- <comment xml:lang="ast">Documentu Plucker</comment>
- <comment xml:lang="be-Latn">Dakument Plucker</comment>
- <comment xml:lang="bg">Документ — Plucker</comment>
- <comment xml:lang="ca">document Plucker</comment>
- <comment xml:lang="cs">dokument Plucker</comment>
- <comment xml:lang="da">Pluckerdokument</comment>
- <comment xml:lang="de">Plucker-Dokument</comment>
- <comment xml:lang="el">Έγγραφο Plucker</comment>
- <comment xml:lang="en-GB">Plucker document</comment>
- <comment xml:lang="eo">Plucker-dokumento</comment>
- <comment xml:lang="es">documento de Plucker</comment>
- <comment xml:lang="eu">Plucker dokumentua</comment>
- <comment xml:lang="fi">Plucker-asiakirja</comment>
- <comment xml:lang="fo">Plucker skjal</comment>
- <comment xml:lang="fr">document Plucker</comment>
- <comment xml:lang="fur">document Plucker</comment>
- <comment xml:lang="ga">cáipéis Plucker</comment>
- <comment xml:lang="gl">documento de Plucker</comment>
- <comment xml:lang="he">מסמך של Plucker</comment>
- <comment xml:lang="hr">Plucker dokument</comment>
- <comment xml:lang="hu">Plucker dokumentum</comment>
- <comment xml:lang="ia">Documento Plucker</comment>
- <comment xml:lang="id">Dokumen Plucker</comment>
- <comment xml:lang="it">Documento Plucker</comment>
- <comment xml:lang="ja">Plucker ドキュメント</comment>
- <comment xml:lang="kk">Plucker құжаты</comment>
- <comment xml:lang="ko">Plucker 문서</comment>
- <comment xml:lang="lt">Plucker dokumentas</comment>
- <comment xml:lang="lv">Plucker dokuments</comment>
- <comment xml:lang="nb">Plucker-dokument</comment>
- <comment xml:lang="nl">Plucker-document</comment>
- <comment xml:lang="nn">Plucker-dokument</comment>
- <comment xml:lang="oc">document Plucker</comment>
- <comment xml:lang="pl">Dokument Plucker</comment>
- <comment xml:lang="pt">documento Plucker</comment>
- <comment xml:lang="pt-BR">Documento do Plucker</comment>
- <comment xml:lang="ro">Document Plucker</comment>
- <comment xml:lang="ru">Документ Plucker</comment>
- <comment xml:lang="sk">Dokument Plucker</comment>
- <comment xml:lang="sl">Dokument Plucker</comment>
- <comment xml:lang="sq">Dokument Plucker</comment>
- <comment xml:lang="sr">Плакер документ</comment>
- <comment xml:lang="sv">Plucker-dokument</comment>
- <comment xml:lang="tr">Plucker belgesi</comment>
- <comment xml:lang="uk">документ Plucker</comment>
+ <comment xml:lang="zh_TW">Plucker 文件</comment>
+ <comment xml:lang="zh_CN">Plucker 文档</comment>
<comment xml:lang="vi">Tài liệu Plucker</comment>
- <comment xml:lang="zh-CN">Plucker 文档</comment>
- <comment xml:lang="zh-TW">Plucker 文件</comment>
+ <comment xml:lang="uk">документ Plucker</comment>
+ <comment xml:lang="tr">Plucker belgesi</comment>
+ <comment xml:lang="sv">Plucker-dokument</comment>
+ <comment xml:lang="sr">Плакер документ</comment>
+ <comment xml:lang="sq">dokument Plucker</comment>
+ <comment xml:lang="sl">Dokument Plucker</comment>
+ <comment xml:lang="si">ප්ලකර් ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument Plucker</comment>
+ <comment xml:lang="ru">Документ Plucker</comment>
+ <comment xml:lang="ro">Document Plucker</comment>
+ <comment xml:lang="pt_BR">Documento do Plucker</comment>
+ <comment xml:lang="pt">documento Plucker</comment>
+ <comment xml:lang="pl">Dokument Plucker</comment>
+ <comment xml:lang="oc">document Plucker</comment>
+ <comment xml:lang="nn">Plucker-dokument</comment>
+ <comment xml:lang="nl">Plucker-document</comment>
+ <comment xml:lang="nb">Plucker-dokument</comment>
+ <comment xml:lang="lv">Plucker dokuments</comment>
+ <comment xml:lang="lt">Plucker dokumentas</comment>
+ <comment xml:lang="ko">Plucker 문서</comment>
+ <comment xml:lang="kk">Plucker құжаты</comment>
+ <comment xml:lang="ka">Plucker-ის დოკუმენტი</comment>
+ <comment xml:lang="ja">Plucker ドキュメント</comment>
+ <comment xml:lang="it">Documento Plucker</comment>
+ <comment xml:lang="is">Plucker skjal</comment>
+ <comment xml:lang="id">Dokumen Plucker</comment>
+ <comment xml:lang="ia">Documento Plucker</comment>
+ <comment xml:lang="hu">Plucker dokumentum</comment>
+ <comment xml:lang="hr">Plucker dokument</comment>
+ <comment xml:lang="he">מסמך של Plucker</comment>
+ <comment xml:lang="gl">documento de Plucker</comment>
+ <comment xml:lang="ga">cáipéis Plucker</comment>
+ <comment xml:lang="fur">document Plucker</comment>
+ <comment xml:lang="fr">document Plucker</comment>
+ <comment xml:lang="fo">Plucker skjal</comment>
+ <comment xml:lang="fi">Plucker-asiakirja</comment>
+ <comment xml:lang="eu">Plucker dokumentua</comment>
+ <comment xml:lang="es">documento de Plucker</comment>
+ <comment xml:lang="eo">Plucker-dokumento</comment>
+ <comment xml:lang="en_GB">Plucker document</comment>
+ <comment xml:lang="el">Έγγραφο Plucker</comment>
+ <comment xml:lang="de">Plucker-Dokument</comment>
+ <comment xml:lang="da">Pluckerdokument</comment>
+ <comment xml:lang="cs">dokument Plucker</comment>
+ <comment xml:lang="ca">document Plucker</comment>
+ <comment xml:lang="bg">Документ — Plucker</comment>
+ <comment xml:lang="be@latin">Dakument Plucker</comment>
+ <comment xml:lang="be">дакумент Plucker</comment>
+ <comment xml:lang="ast">Documentu Plucker</comment>
+ <comment xml:lang="ar">مستند Plucker</comment>
+ <comment xml:lang="af">Plucker-dokument</comment>
<generic-icon name="x-office-document"/>
<magic priority="80">
<match type="string" value="DataPlkr" offset="60"/>
@@ -1858,44 +1855,53 @@ command to generate the output files.
</mime-type>
<mime-type type="application/raml+yaml">
<comment>RAML document</comment>
- <comment xml:lang="af">RAML-dokument</comment>
- <comment xml:lang="ast">Documentu RAML</comment>
- <comment xml:lang="bg">Документ — RAML</comment>
- <comment xml:lang="ca">document RAML</comment>
- <comment xml:lang="cs">dokument RAML</comment>
- <comment xml:lang="da">RAML-dokument</comment>
- <comment xml:lang="de">RAML-Dokument</comment>
- <comment xml:lang="en-GB">RAML document</comment>
- <comment xml:lang="es">documento RAML</comment>
- <comment xml:lang="eu">RAML dokumentua</comment>
- <comment xml:lang="fi">RAML-asiakirja</comment>
- <comment xml:lang="fr">document RAML</comment>
- <comment xml:lang="fur">document RAML</comment>
- <comment xml:lang="ga">cáipéis RAML</comment>
- <comment xml:lang="he">מסמך RAML</comment>
- <comment xml:lang="hr">RAML dokument</comment>
- <comment xml:lang="hu">RAML dokumentum</comment>
- <comment xml:lang="id">Dokumen RAML</comment>
- <comment xml:lang="it">Documento RAML</comment>
- <comment xml:lang="kk">RAML құжаты</comment>
- <comment xml:lang="ko">RAML 문서</comment>
- <comment xml:lang="lt">RAML dokumentas</comment>
- <comment xml:lang="oc">Document RAML</comment>
- <comment xml:lang="pl">Dokument RAML</comment>
- <comment xml:lang="pt">documento RAML</comment>
- <comment xml:lang="pt-BR">Documento RAML</comment>
- <comment xml:lang="ru">Документ RAML</comment>
- <comment xml:lang="sk">Dokument RAML</comment>
- <comment xml:lang="sl">Dokument RAML</comment>
- <comment xml:lang="sr">РАМЛ документ</comment>
- <comment xml:lang="sv">RAML-dokument</comment>
- <comment xml:lang="tr">RAML belgesi</comment>
+ <comment xml:lang="zh_TW">RAML 文件</comment>
+ <comment xml:lang="zh_CN">RAML 文档</comment>
<comment xml:lang="uk">документ RAML</comment>
- <comment xml:lang="zh-CN">RAML 文档</comment>
- <comment xml:lang="zh-TW">RAML 文件</comment>
+ <comment xml:lang="tr">RAML belgesi</comment>
+ <comment xml:lang="sv">RAML-dokument</comment>
+ <comment xml:lang="sr">РАМЛ документ</comment>
+ <comment xml:lang="sq">dokument RAML</comment>
+ <comment xml:lang="sl">Dokument RAML</comment>
+ <comment xml:lang="si">RAML ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument RAML</comment>
+ <comment xml:lang="ru">Документ RAML</comment>
+ <comment xml:lang="pt_BR">Documento RAML</comment>
+ <comment xml:lang="pt">documento RAML</comment>
+ <comment xml:lang="pl">Dokument RAML</comment>
+ <comment xml:lang="oc">Document RAML</comment>
+ <comment xml:lang="nl">RAML-document</comment>
+ <comment xml:lang="lt">RAML dokumentas</comment>
+ <comment xml:lang="ko">RAML 문서</comment>
+ <comment xml:lang="kk">RAML құжаты</comment>
+ <comment xml:lang="ka">RAML-ის დოკუმენტი</comment>
+ <comment xml:lang="ja">RAML ドキュメント</comment>
+ <comment xml:lang="it">Documento RAML</comment>
+ <comment xml:lang="is">RAML skjal</comment>
+ <comment xml:lang="id">Dokumen RAML</comment>
+ <comment xml:lang="hu">RAML dokumentum</comment>
+ <comment xml:lang="hr">RAML dokument</comment>
+ <comment xml:lang="he">מסמך RAML</comment>
+ <comment xml:lang="gl">Documento RAML</comment>
+ <comment xml:lang="ga">cáipéis RAML</comment>
+ <comment xml:lang="fur">document RAML</comment>
+ <comment xml:lang="fr">document RAML</comment>
+ <comment xml:lang="fi">RAML-asiakirja</comment>
+ <comment xml:lang="eu">RAML dokumentua</comment>
+ <comment xml:lang="es">documento RAML</comment>
+ <comment xml:lang="en_GB">RAML document</comment>
+ <comment xml:lang="de">RAML-Dokument</comment>
+ <comment xml:lang="da">RAML-dokument</comment>
+ <comment xml:lang="cs">dokument RAML</comment>
+ <comment xml:lang="ca">document RAML</comment>
+ <comment xml:lang="bg">Документ — RAML</comment>
+ <comment xml:lang="be">дакумент RAML</comment>
+ <comment xml:lang="ast">Documentu RAML</comment>
+ <comment xml:lang="ar">مستند RAML</comment>
+ <comment xml:lang="af">RAML-dokument</comment>
<acronym>RAML</acronym>
<expanded-acronym>RESTful API Modeling Language</expanded-acronym>
- <sub-class-of type="application/x-yaml"/>
+ <sub-class-of type="application/yaml"/>
<magic>
<match type="string" value="#%RAML " offset="0"/>
</magic>
@@ -1903,48 +1909,51 @@ command to generate the output files.
</mime-type>
<mime-type type="application/relax-ng-compact-syntax">
<comment>RELAX NG XML schema</comment>
- <comment xml:lang="af">RELAX NG XML-skema</comment>
- <comment xml:lang="ar">مخطط RELAX NG XML</comment>
- <comment xml:lang="bg">Схема за XML — RELAX NG</comment>
- <comment xml:lang="ca">esquema XML en RELAX NG</comment>
- <comment xml:lang="cs">schéma RELAX NG XML</comment>
- <comment xml:lang="da">RELAX NG XML-skema</comment>
- <comment xml:lang="de">RELAX NG XML-Schema</comment>
- <comment xml:lang="el">Σχήμα RELAX NG XML</comment>
- <comment xml:lang="en-GB">RELAX NG XML schema</comment>
- <comment xml:lang="es">esquema XML RELAX NG</comment>
- <comment xml:lang="eu">RELAX NG XML eskema</comment>
- <comment xml:lang="fi">RELAX NG XML-skeema</comment>
- <comment xml:lang="fr">schéma XML RELAX NG</comment>
- <comment xml:lang="fur">scheme XML RELAX NG</comment>
- <comment xml:lang="ga">scéimre XML RELAX NG</comment>
- <comment xml:lang="gl">Esquema XML RELAX NG</comment>
- <comment xml:lang="he">סכנת RELAX NG XML</comment>
- <comment xml:lang="hr">RELAX NG XML shema</comment>
- <comment xml:lang="hu">RELAX NG XML-séma</comment>
- <comment xml:lang="ia">Schema XML RELAX NG</comment>
- <comment xml:lang="id">Skema XML RELAX NG</comment>
- <comment xml:lang="it">Schema XML RELAX NG</comment>
- <comment xml:lang="ja">RELAX NG XML スキーマ</comment>
- <comment xml:lang="kk">RELAX NG XML сұлбасы</comment>
- <comment xml:lang="ko">RELAX NG XML 스키마</comment>
- <comment xml:lang="lt">RELAX NG XML schema</comment>
- <comment xml:lang="lv">RELAX NG XML shēma</comment>
- <comment xml:lang="nl">RELAX NG XML schema</comment>
- <comment xml:lang="oc">esquèma XML RELAX NG</comment>
- <comment xml:lang="pl">Schemat XML RELAX NG</comment>
- <comment xml:lang="pt">Esquema RELAX NG XML</comment>
- <comment xml:lang="pt-BR">Esquema XML de RELAX NG</comment>
- <comment xml:lang="ro">Schemă RELAX NG XML</comment>
- <comment xml:lang="ru">XML-схема RELAX NG</comment>
- <comment xml:lang="sk">XML schéma RELAX NG</comment>
- <comment xml:lang="sl">Datoteka shema RELAX NG XML</comment>
- <comment xml:lang="sr">РЕЛАКС НГ ИксМЛ шема</comment>
- <comment xml:lang="sv">RELAX NG XML-schema</comment>
- <comment xml:lang="tr">RELAX NG XML şeması</comment>
+ <comment xml:lang="zh_TW">RELAX NG XML 綱要</comment>
+ <comment xml:lang="zh_CN">RELAX NG XML 模式</comment>
<comment xml:lang="uk">XML-схема RELAX NG</comment>
- <comment xml:lang="zh-CN">RELAX NG XML 模式</comment>
- <comment xml:lang="zh-TW">RELAX NG XML 綱要</comment>
+ <comment xml:lang="tr">RELAX NG XML şeması</comment>
+ <comment xml:lang="sv">RELAX NG XML-schema</comment>
+ <comment xml:lang="sr">РЕЛАКС НГ ИксМЛ шема</comment>
+ <comment xml:lang="sl">Datoteka shema RELAX NG XML</comment>
+ <comment xml:lang="si">RELAX NG XML ක්‍රමය</comment>
+ <comment xml:lang="sk">XML schéma RELAX NG</comment>
+ <comment xml:lang="ru">XML-схема RELAX NG</comment>
+ <comment xml:lang="ro">Schemă RELAX NG XML</comment>
+ <comment xml:lang="pt_BR">Esquema XML de RELAX NG</comment>
+ <comment xml:lang="pt">Esquema RELAX NG XML</comment>
+ <comment xml:lang="pl">Schemat XML RELAX NG</comment>
+ <comment xml:lang="oc">esquèma XML RELAX NG</comment>
+ <comment xml:lang="nl">RELAX NG XML-schema</comment>
+ <comment xml:lang="lv">RELAX NG XML shēma</comment>
+ <comment xml:lang="lt">RELAX NG XML schema</comment>
+ <comment xml:lang="ko">RELAX NG XML 스키마</comment>
+ <comment xml:lang="kk">RELAX NG XML сұлбасы</comment>
+ <comment xml:lang="ja">RELAX NG XML スキーマ</comment>
+ <comment xml:lang="it">Schema XML RELAX NG</comment>
+ <comment xml:lang="is">RELAX NG XML skema</comment>
+ <comment xml:lang="id">Skema XML RELAX NG</comment>
+ <comment xml:lang="ia">Schema XML RELAX NG</comment>
+ <comment xml:lang="hu">RELAX NG XML-séma</comment>
+ <comment xml:lang="hr">RELAX NG XML shema</comment>
+ <comment xml:lang="he">סכנת RELAX NG XML</comment>
+ <comment xml:lang="gl">Esquema XML RELAX NG</comment>
+ <comment xml:lang="ga">scéimre XML RELAX NG</comment>
+ <comment xml:lang="fur">scheme XML RELAX NG</comment>
+ <comment xml:lang="fr">schéma XML RELAX NG</comment>
+ <comment xml:lang="fi">RELAX NG XML-skeema</comment>
+ <comment xml:lang="eu">RELAX NG XML eskema</comment>
+ <comment xml:lang="es">esquema XML RELAX NG</comment>
+ <comment xml:lang="en_GB">RELAX NG XML schema</comment>
+ <comment xml:lang="el">Σχήμα RELAX NG XML</comment>
+ <comment xml:lang="de">RELAX NG XML-Schema</comment>
+ <comment xml:lang="da">RELAX NG XML-skema</comment>
+ <comment xml:lang="cs">schéma RELAX NG XML</comment>
+ <comment xml:lang="ca">esquema XML en RELAX NG</comment>
+ <comment xml:lang="bg">Схема за XML — RELAX NG</comment>
+ <comment xml:lang="be">XML-схема RELAX NG</comment>
+ <comment xml:lang="ar">مخطط RELAX NG XML</comment>
+ <comment xml:lang="af">RELAX NG XML-skema</comment>
<acronym>RELAX NG</acronym>
<expanded-acronym>REgular LAnguage for XML Next Generation</expanded-acronym>
<sub-class-of type="text/plain"/>
@@ -1954,61 +1963,65 @@ command to generate the output files.
</mime-type>
<mime-type type="application/rtf">
<comment>RTF document</comment>
- <comment xml:lang="af">RTF-dokument</comment>
- <comment xml:lang="ar">مستند RTF</comment>
- <comment xml:lang="ast">Documentu RTF</comment>
- <comment xml:lang="be-Latn">Dakument RTF</comment>
- <comment xml:lang="bg">Документ — RTF</comment>
- <comment xml:lang="ca">document RTF</comment>
- <comment xml:lang="cs">dokument RTF</comment>
- <comment xml:lang="da">RTF-dokument</comment>
- <comment xml:lang="de">RTF-Dokument</comment>
- <comment xml:lang="el">Έγγραφο RTF</comment>
- <comment xml:lang="en-GB">RTF document</comment>
- <comment xml:lang="eo">RTF-dokumento</comment>
- <comment xml:lang="es">documento RTF</comment>
- <comment xml:lang="eu">RTF dokumentua</comment>
- <comment xml:lang="fi">RTF-asiakirja</comment>
- <comment xml:lang="fo">RTF skjal</comment>
- <comment xml:lang="fr">document RTF</comment>
- <comment xml:lang="fur">document RTF</comment>
- <comment xml:lang="ga">cáipéis RTF</comment>
- <comment xml:lang="gl">documento RTF</comment>
- <comment xml:lang="he">מסמך RTF</comment>
- <comment xml:lang="hr">RTF dokument</comment>
- <comment xml:lang="hu">RTF dokumentum</comment>
- <comment xml:lang="ia">Documento RTF</comment>
- <comment xml:lang="id">Dokumen RTF</comment>
- <comment xml:lang="it">Documento RTF</comment>
- <comment xml:lang="ja">RTF ドキュメント</comment>
- <comment xml:lang="kk">RTF құжаты</comment>
- <comment xml:lang="ko">RTF 문서</comment>
- <comment xml:lang="lt">RTF dokumentas</comment>
- <comment xml:lang="lv">RTF dokuments</comment>
- <comment xml:lang="nb">RTF-dokument</comment>
- <comment xml:lang="nl">RTF-document</comment>
- <comment xml:lang="nn">TRF-dokument</comment>
- <comment xml:lang="oc">document RTF</comment>
- <comment xml:lang="pl">Dokument RTF</comment>
- <comment xml:lang="pt">documento RTF</comment>
- <comment xml:lang="pt-BR">Documento RTF</comment>
- <comment xml:lang="ro">Document RTF</comment>
- <comment xml:lang="ru">Документ RTF</comment>
- <comment xml:lang="sk">Dokument RTF</comment>
- <comment xml:lang="sl">Dokument RTF</comment>
- <comment xml:lang="sq">Dokument RTF</comment>
- <comment xml:lang="sr">РТФ документ</comment>
- <comment xml:lang="sv">RTF-dokument</comment>
- <comment xml:lang="tr">RTF belgesi</comment>
- <comment xml:lang="uk">документ RTF</comment>
+ <comment xml:lang="zh_TW">RTF 文件</comment>
+ <comment xml:lang="zh_CN">RTF 文档</comment>
<comment xml:lang="vi">Tài liệu RTF</comment>
- <comment xml:lang="zh-CN">RTF 文档</comment>
- <comment xml:lang="zh-TW">RTF 文件</comment>
+ <comment xml:lang="uk">документ RTF</comment>
+ <comment xml:lang="tr">RTF belgesi</comment>
+ <comment xml:lang="sv">RTF-dokument</comment>
+ <comment xml:lang="sr">РТФ документ</comment>
+ <comment xml:lang="sq">dokument RTF</comment>
+ <comment xml:lang="sl">Dokument RTF</comment>
+ <comment xml:lang="si">RTF ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument RTF</comment>
+ <comment xml:lang="ru">Документ RTF</comment>
+ <comment xml:lang="ro">Document RTF</comment>
+ <comment xml:lang="pt_BR">Documento RTF</comment>
+ <comment xml:lang="pt">documento RTF</comment>
+ <comment xml:lang="pl">Dokument RTF</comment>
+ <comment xml:lang="oc">document RTF</comment>
+ <comment xml:lang="nn">TRF-dokument</comment>
+ <comment xml:lang="nl">RTF-document</comment>
+ <comment xml:lang="nb">RTF-dokument</comment>
+ <comment xml:lang="lv">RTF dokuments</comment>
+ <comment xml:lang="lt">RTF dokumentas</comment>
+ <comment xml:lang="ko">RTF 문서</comment>
+ <comment xml:lang="kk">RTF құжаты</comment>
+ <comment xml:lang="ka">RTF დოკუმენტი</comment>
+ <comment xml:lang="ja">RTF ドキュメント</comment>
+ <comment xml:lang="it">Documento RTF</comment>
+ <comment xml:lang="is">RTF skjal</comment>
+ <comment xml:lang="id">Dokumen RTF</comment>
+ <comment xml:lang="ia">Documento RTF</comment>
+ <comment xml:lang="hu">RTF dokumentum</comment>
+ <comment xml:lang="hr">RTF dokument</comment>
+ <comment xml:lang="he">מסמך RTF</comment>
+ <comment xml:lang="gl">documento RTF</comment>
+ <comment xml:lang="ga">cáipéis RTF</comment>
+ <comment xml:lang="fur">document RTF</comment>
+ <comment xml:lang="fr">document RTF</comment>
+ <comment xml:lang="fo">RTF skjal</comment>
+ <comment xml:lang="fi">RTF-asiakirja</comment>
+ <comment xml:lang="eu">RTF dokumentua</comment>
+ <comment xml:lang="es">documento RTF</comment>
+ <comment xml:lang="eo">RTF-dokumento</comment>
+ <comment xml:lang="en_GB">RTF document</comment>
+ <comment xml:lang="el">Έγγραφο RTF</comment>
+ <comment xml:lang="de">RTF-Dokument</comment>
+ <comment xml:lang="da">RTF-dokument</comment>
+ <comment xml:lang="cs">dokument RTF</comment>
+ <comment xml:lang="ca">document RTF</comment>
+ <comment xml:lang="bg">Документ — RTF</comment>
+ <comment xml:lang="be@latin">Dakument RTF</comment>
+ <comment xml:lang="be">дакумент RTF</comment>
+ <comment xml:lang="ast">Documentu RTF</comment>
+ <comment xml:lang="ar">مستند RTF</comment>
+ <comment xml:lang="af">RTF-dokument</comment>
<acronym>RTF</acronym>
<expanded-acronym>Rich Text Format</expanded-acronym>
<sub-class-of type="text/plain"/>
<generic-icon name="x-office-document"/>
- <magic priority="50">
+ <magic>
<match type="string" value="{\\rtf" offset="0"/>
</magic>
<glob pattern="*.rtf"/>
@@ -2016,109 +2029,116 @@ command to generate the output files.
</mime-type>
<mime-type type="application/sieve">
<comment>Sieve mail filter script</comment>
- <comment xml:lang="af">Sieve-posfiltreerskrip</comment>
- <comment xml:lang="ar">سكربت مرشح بريد Sieve</comment>
- <comment xml:lang="be-Latn">Skrypt filtravańnia pošty Sieve</comment>
- <comment xml:lang="bg">Скрипт-филтър за пресяване на поща</comment>
- <comment xml:lang="ca">script de filtre de correu Sieve</comment>
- <comment xml:lang="cs">skript poštovního filtru Sieve</comment>
- <comment xml:lang="da">Sieve e-post-filterprogram</comment>
- <comment xml:lang="de">Sieve-E-Mail-Filterskript</comment>
- <comment xml:lang="el">Δέσμη ενεργειών φιλτραρίσματος αλληλογραφίας Sieve</comment>
- <comment xml:lang="en-GB">Sieve mail filter script</comment>
- <comment xml:lang="es">secuencia de órdenes de filtro en Sieve</comment>
- <comment xml:lang="eu">Sieve posta-iragazki script-a</comment>
- <comment xml:lang="fi">Sieve-postinsuodatuskomentotiedosto</comment>
- <comment xml:lang="fr">script de filtrage de courriel Sieve</comment>
- <comment xml:lang="fur">script filtri pueste Sieve</comment>
- <comment xml:lang="ga">script scagaire r-phost Sieve</comment>
- <comment xml:lang="gl">Script de filtro de correo Sieve</comment>
- <comment xml:lang="he">תסריט סינון דואר של Sieve</comment>
- <comment xml:lang="hr">Sieve skripta filtriranja pošte</comment>
- <comment xml:lang="hu">Sieve levélszűrő parancsfájl</comment>
- <comment xml:lang="ia">Script de filtration de e-mail Sieve</comment>
- <comment xml:lang="id">Skrip filter surat Sieve</comment>
- <comment xml:lang="it">Script filtro posta Sieve</comment>
- <comment xml:lang="ja">Sieve メールフィルタスクリプト</comment>
- <comment xml:lang="kk">Sieve пошталық фильтр сценарийі</comment>
- <comment xml:lang="ko">Sieve 메일 필터 스크립트</comment>
- <comment xml:lang="lt">Sieve pašto filtro scenarijus</comment>
- <comment xml:lang="lv">Sieve pasta filtra skripts</comment>
- <comment xml:lang="nb">Sieve e-postfilter skript</comment>
- <comment xml:lang="nl">Sieve mailfilter-script</comment>
- <comment xml:lang="nn">Sieve e-postfilterskript</comment>
- <comment xml:lang="oc">escript de filtratge de corrièr electronic Sieve</comment>
- <comment xml:lang="pl">Skrypt filtra poczty Sieve</comment>
- <comment xml:lang="pt">Script de filtragem de correio Sieve</comment>
- <comment xml:lang="pt-BR">Script de filtro de mensagens do Sieve</comment>
- <comment xml:lang="ro">Script filtrare email Sieve</comment>
- <comment xml:lang="ru">Сценарий почтового фильтра Sieve</comment>
- <comment xml:lang="sk">Skript poštového filtra Sieve</comment>
- <comment xml:lang="sl">Skriptna datoteka Sieve poštnega filtra</comment>
- <comment xml:lang="sq">Script filtrim poste Sieve</comment>
- <comment xml:lang="sr">Сјев скрипта пропусника поште</comment>
- <comment xml:lang="sv">Sieve-epostfilterskript</comment>
- <comment xml:lang="tr">Sieve posta süzgeç betiği</comment>
- <comment xml:lang="uk">скрипт поштового фільтру Sieve</comment>
+ <comment xml:lang="zh_TW">Sieve 郵件篩選指令稿</comment>
+ <comment xml:lang="zh_CN">Sieve 邮件过滤脚本</comment>
<comment xml:lang="vi">Văn lệnh lọc thư Sieve</comment>
- <comment xml:lang="zh-CN">Sieve 邮件过滤脚本</comment>
- <comment xml:lang="zh-TW">Sieve 郵件篩選指令稿</comment>
- <sub-class-of type="application/xml"/>
+ <comment xml:lang="uk">скрипт поштового фільтру Sieve</comment>
+ <comment xml:lang="tr">Sieve posta süzgeç betiği</comment>
+ <comment xml:lang="sv">Sieve-epostfilterskript</comment>
+ <comment xml:lang="sr">Сјев скрипта пропусника поште</comment>
+ <comment xml:lang="sq">programth filtrimi poste Sieve</comment>
+ <comment xml:lang="sl">Skriptna datoteka Sieve poštnega filtra</comment>
+ <comment xml:lang="si">තැපැල් පෙරහන් ස්ක්‍රිප්ට් පෙරා ගන්න</comment>
+ <comment xml:lang="sk">Skript poštového filtra Sieve</comment>
+ <comment xml:lang="ru">Сценарий почтового фильтра Sieve</comment>
+ <comment xml:lang="ro">Script filtrare email Sieve</comment>
+ <comment xml:lang="pt_BR">Script de filtro de mensagens do Sieve</comment>
+ <comment xml:lang="pt">Script de filtragem de correio Sieve</comment>
+ <comment xml:lang="pl">Skrypt filtra poczty Sieve</comment>
+ <comment xml:lang="oc">escript de filtratge de corrièr electronic Sieve</comment>
+ <comment xml:lang="nn">Sieve e-postfilterskript</comment>
+ <comment xml:lang="nl">Sieve mailfilter-script</comment>
+ <comment xml:lang="nb">Sieve e-postfilter skript</comment>
+ <comment xml:lang="lv">Sieve pasta filtra skripts</comment>
+ <comment xml:lang="lt">Sieve pašto filtro scenarijus</comment>
+ <comment xml:lang="ko">Sieve 메일 필터 스크립트</comment>
+ <comment xml:lang="kk">Sieve пошталық фильтр сценарийі</comment>
+ <comment xml:lang="ja">Sieve メールフィルタスクリプト</comment>
+ <comment xml:lang="it">Script filtro posta Sieve</comment>
+ <comment xml:lang="is">Sieve póstsíuskrifta</comment>
+ <comment xml:lang="id">Skrip filter surat Sieve</comment>
+ <comment xml:lang="ia">Script de filtration de e-mail Sieve</comment>
+ <comment xml:lang="hu">Sieve levélszűrő parancsfájl</comment>
+ <comment xml:lang="hr">Sieve skripta filtriranja pošte</comment>
+ <comment xml:lang="he">תסריט סינון דואר של Sieve</comment>
+ <comment xml:lang="gl">Script de filtro de correo Sieve</comment>
+ <comment xml:lang="ga">script scagaire r-phost Sieve</comment>
+ <comment xml:lang="fur">script filtri pueste Sieve</comment>
+ <comment xml:lang="fr">script de filtrage de courriel Sieve</comment>
+ <comment xml:lang="fi">Sieve-postinsuodatuskomentotiedosto</comment>
+ <comment xml:lang="eu">Sieve posta-iragazki script-a</comment>
+ <comment xml:lang="es">secuencia de órdenes de filtro en Sieve</comment>
+ <comment xml:lang="en_GB">Sieve mail filter script</comment>
+ <comment xml:lang="el">Δέσμη ενεργειών φιλτραρίσματος αλληλογραφίας Sieve</comment>
+ <comment xml:lang="de">Sieve E-Mail-Filterskript</comment>
+ <comment xml:lang="da">Sieve e-post-filterprogram</comment>
+ <comment xml:lang="cs">skript poštovního filtru Sieve</comment>
+ <comment xml:lang="ca">script de filtre de correu Sieve</comment>
+ <comment xml:lang="bg">Скрипт-филтър за пресяване на поща</comment>
+ <comment xml:lang="be@latin">Skrypt filtravańnia pošty Sieve</comment>
+ <comment xml:lang="be">скрыпт паштовага фільтра Sieve</comment>
+ <comment xml:lang="ar">سكربت مرشح بريد Sieve</comment>
+ <comment xml:lang="af">Sieve-posfiltreerskrip</comment>
<generic-icon name="text-x-script"/>
<glob pattern="*.siv"/>
+ <glob pattern="*.sieve"/>
</mime-type>
<mime-type type="application/smil+xml">
<comment>SMIL document</comment>
- <comment xml:lang="af">SMIL-dokument</comment>
- <comment xml:lang="ar">مستند SMIL</comment>
- <comment xml:lang="ast">Documentu SMIL</comment>
- <comment xml:lang="be-Latn">Dakument SMIL</comment>
- <comment xml:lang="bg">Документ — SMIL</comment>
- <comment xml:lang="ca">document SMIL</comment>
- <comment xml:lang="cs">dokument SMIL</comment>
- <comment xml:lang="da">SMIL-dokument</comment>
- <comment xml:lang="de">SMIL-Dokument</comment>
- <comment xml:lang="el">Έγγραφο SMIL</comment>
- <comment xml:lang="en-GB">SMIL document</comment>
- <comment xml:lang="eo">SMIL-dokumento</comment>
- <comment xml:lang="es">documento SMIL</comment>
- <comment xml:lang="eu">SMIL dokumentua</comment>
- <comment xml:lang="fi">SMIL-asiakirja</comment>
- <comment xml:lang="fo">SMIL skjal</comment>
- <comment xml:lang="fr">document SMIL</comment>
- <comment xml:lang="fur">document SMIL</comment>
- <comment xml:lang="ga">cáipéis SMIL</comment>
- <comment xml:lang="gl">documento SMIL</comment>
- <comment xml:lang="he">מסמך SMIL</comment>
- <comment xml:lang="hr">SMIL dokument</comment>
- <comment xml:lang="hu">SMIL dokumentum</comment>
- <comment xml:lang="ia">Documento SMIL</comment>
- <comment xml:lang="id">Dokumen SMIL</comment>
- <comment xml:lang="it">Documento SMIL</comment>
- <comment xml:lang="ja">SMIL ドキュメント</comment>
- <comment xml:lang="kk">SMIL құжаты</comment>
- <comment xml:lang="ko">SMIL 문서</comment>
- <comment xml:lang="lt">SMIL dokumentas</comment>
- <comment xml:lang="lv">SMIL dokuments</comment>
- <comment xml:lang="nb">SMIL-dokument</comment>
- <comment xml:lang="nl">SMIL-document</comment>
- <comment xml:lang="nn">SMIL-dokument</comment>
- <comment xml:lang="oc">document SMIL</comment>
- <comment xml:lang="pl">Dokument SMIL</comment>
- <comment xml:lang="pt">documento SMIL</comment>
- <comment xml:lang="pt-BR">Documento SMIL</comment>
- <comment xml:lang="ro">Document SMIL</comment>
- <comment xml:lang="ru">Документ SMIL</comment>
- <comment xml:lang="sk">Dokument SMIL</comment>
- <comment xml:lang="sl">Dokument SMIL</comment>
- <comment xml:lang="sq">Dokument SMIL</comment>
- <comment xml:lang="sr">СМИЛ документ</comment>
- <comment xml:lang="sv">SMIL-dokument</comment>
- <comment xml:lang="tr">SMIL belgesi</comment>
- <comment xml:lang="uk">документ SMIL</comment>
+ <comment xml:lang="zh_TW">SMIL 文件</comment>
+ <comment xml:lang="zh_CN">SMIL 文档</comment>
<comment xml:lang="vi">Tài liệu SMIL</comment>
- <comment xml:lang="zh-CN">SMIL 文档</comment>
- <comment xml:lang="zh-TW">SMIL 文件</comment>
+ <comment xml:lang="uk">документ SMIL</comment>
+ <comment xml:lang="tr">SMIL belgesi</comment>
+ <comment xml:lang="sv">SMIL-dokument</comment>
+ <comment xml:lang="sr">СМИЛ документ</comment>
+ <comment xml:lang="sq">dokument SMIL</comment>
+ <comment xml:lang="sl">Dokument SMIL</comment>
+ <comment xml:lang="si">SMIL ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument SMIL</comment>
+ <comment xml:lang="ru">Документ SMIL</comment>
+ <comment xml:lang="ro">Document SMIL</comment>
+ <comment xml:lang="pt_BR">Documento SMIL</comment>
+ <comment xml:lang="pt">documento SMIL</comment>
+ <comment xml:lang="pl">Dokument SMIL</comment>
+ <comment xml:lang="oc">document SMIL</comment>
+ <comment xml:lang="nn">SMIL-dokument</comment>
+ <comment xml:lang="nl">SMIL-document</comment>
+ <comment xml:lang="nb">SMIL-dokument</comment>
+ <comment xml:lang="lv">SMIL dokuments</comment>
+ <comment xml:lang="lt">SMIL dokumentas</comment>
+ <comment xml:lang="ko">SMIL 문서</comment>
+ <comment xml:lang="kk">SMIL құжаты</comment>
+ <comment xml:lang="ka">SMIL-ის დოკუმენტი</comment>
+ <comment xml:lang="ja">SMIL ドキュメント</comment>
+ <comment xml:lang="it">Documento SMIL</comment>
+ <comment xml:lang="is">SMIL skjal</comment>
+ <comment xml:lang="id">Dokumen SMIL</comment>
+ <comment xml:lang="ia">Documento SMIL</comment>
+ <comment xml:lang="hu">SMIL dokumentum</comment>
+ <comment xml:lang="hr">SMIL dokument</comment>
+ <comment xml:lang="he">מסמך SMIL</comment>
+ <comment xml:lang="gl">documento SMIL</comment>
+ <comment xml:lang="ga">cáipéis SMIL</comment>
+ <comment xml:lang="fur">document SMIL</comment>
+ <comment xml:lang="fr">document SMIL</comment>
+ <comment xml:lang="fo">SMIL skjal</comment>
+ <comment xml:lang="fi">SMIL-asiakirja</comment>
+ <comment xml:lang="eu">SMIL dokumentua</comment>
+ <comment xml:lang="es">documento SMIL</comment>
+ <comment xml:lang="eo">SMIL-dokumento</comment>
+ <comment xml:lang="en_GB">SMIL document</comment>
+ <comment xml:lang="el">Έγγραφο SMIL</comment>
+ <comment xml:lang="de">SMIL-Dokument</comment>
+ <comment xml:lang="da">SMIL-dokument</comment>
+ <comment xml:lang="cs">dokument SMIL</comment>
+ <comment xml:lang="ca">document SMIL</comment>
+ <comment xml:lang="bg">Документ — SMIL</comment>
+ <comment xml:lang="be@latin">Dakument SMIL</comment>
+ <comment xml:lang="be">дакумент SMIL</comment>
+ <comment xml:lang="ast">Documentu SMIL</comment>
+ <comment xml:lang="ar">مستند SMIL</comment>
+ <comment xml:lang="af">SMIL-dokument</comment>
<acronym>SMIL</acronym>
<expanded-acronym>Synchronized Multimedia Integration Language</expanded-acronym>
<sub-class-of type="application/xml"/>
@@ -2137,51 +2157,56 @@ command to generate the output files.
</mime-type>
<mime-type type="application/vnd.ms-wpl">
<comment>WPL playlist</comment>
- <comment xml:lang="af">WPL-speellys</comment>
- <comment xml:lang="ar">قائمة تشغيل WPL</comment>
- <comment xml:lang="bg">Списък за изпълнение — WPL</comment>
- <comment xml:lang="ca">llista de reproducció WPL</comment>
- <comment xml:lang="cs">seznam k přehrání WPL</comment>
- <comment xml:lang="da">WPL-afspilningsliste</comment>
- <comment xml:lang="de">WPL-Wiedergabeliste</comment>
- <comment xml:lang="el">Λίστα αναπαραγωγής WPL</comment>
- <comment xml:lang="en-GB">WPL playlist</comment>
- <comment xml:lang="eo">WPL-ludlisto</comment>
- <comment xml:lang="es">lista de reproducción WPL</comment>
- <comment xml:lang="eu">WPL erreprodukzio-zerrenda</comment>
- <comment xml:lang="fi">WPL-soittolista</comment>
- <comment xml:lang="fo">WPL avspælingarlisti</comment>
- <comment xml:lang="fr">liste de lecture WPL</comment>
- <comment xml:lang="fur">liste di riproduzion WPL</comment>
- <comment xml:lang="ga">seinmliosta WPL</comment>
- <comment xml:lang="gl">lista de reprodución WPL</comment>
- <comment xml:lang="he">רשימת נגינה WPL</comment>
- <comment xml:lang="hr">WPL popis izvođenja</comment>
- <comment xml:lang="hu">WPL-lejátszólista</comment>
- <comment xml:lang="ia">Lista de selection WPL</comment>
- <comment xml:lang="id">Senarai putar WPL</comment>
- <comment xml:lang="it">Playlist WPL</comment>
- <comment xml:lang="ja">WPL 再生リスト</comment>
- <comment xml:lang="kk">WPL ойнау тізімі</comment>
- <comment xml:lang="ko">WPL 재생 목록</comment>
- <comment xml:lang="lt">WPL grojaraštis</comment>
- <comment xml:lang="lv">WPL repertuārs</comment>
- <comment xml:lang="nl">WPL-afspeellijst</comment>
- <comment xml:lang="oc">lista de lectura WPL</comment>
- <comment xml:lang="pl">Lista odtwarzania WPL</comment>
- <comment xml:lang="pt">lista de reprodução WPL</comment>
- <comment xml:lang="pt-BR">Lista de reprodução do WPL</comment>
- <comment xml:lang="ro">Listă redare WPL</comment>
- <comment xml:lang="ru">Список воспроизведения WPL</comment>
- <comment xml:lang="sk">Zoznam skladieb WPL</comment>
- <comment xml:lang="sl">Seznam predvajanja WPL</comment>
- <comment xml:lang="sr">ВПЛ списак нумера</comment>
- <comment xml:lang="sv">WPL-spellista</comment>
- <comment xml:lang="tr">WPL çalma listesi</comment>
- <comment xml:lang="uk">список відтворення WPL</comment>
+ <comment xml:lang="zh_TW">WPL 播放清單</comment>
+ <comment xml:lang="zh_CN">WPL 播放列表</comment>
<comment xml:lang="vi">Danh mục nhạc WPL</comment>
- <comment xml:lang="zh-CN">WPL 播放列表</comment>
- <comment xml:lang="zh-TW">WPL 播放清單</comment>
+ <comment xml:lang="uk">список відтворення WPL</comment>
+ <comment xml:lang="tr">WPL çalma listesi</comment>
+ <comment xml:lang="sv">WPL-spellista</comment>
+ <comment xml:lang="sr">ВПЛ списак нумера</comment>
+ <comment xml:lang="sq">luajlistë WPL</comment>
+ <comment xml:lang="sl">Seznam predvajanja WPL</comment>
+ <comment xml:lang="si">WPL ධාවන ලැයිස්තුව</comment>
+ <comment xml:lang="sk">Zoznam skladieb WPL</comment>
+ <comment xml:lang="ru">Список воспроизведения WPL</comment>
+ <comment xml:lang="ro">Listă redare WPL</comment>
+ <comment xml:lang="pt_BR">Lista de reprodução do WPL</comment>
+ <comment xml:lang="pt">lista de reprodução WPL</comment>
+ <comment xml:lang="pl">Lista odtwarzania WPL</comment>
+ <comment xml:lang="oc">lista de lectura WPL</comment>
+ <comment xml:lang="nl">WPL-afspeellijst</comment>
+ <comment xml:lang="lv">WPL repertuārs</comment>
+ <comment xml:lang="lt">WPL grojaraštis</comment>
+ <comment xml:lang="ko">WPL 재생 목록</comment>
+ <comment xml:lang="kk">WPL ойнау тізімі</comment>
+ <comment xml:lang="ka">WPL დასაკრავი სია</comment>
+ <comment xml:lang="ja">WPL プレイリスト</comment>
+ <comment xml:lang="it">Playlist WPL</comment>
+ <comment xml:lang="is">WPL spilunarlisti</comment>
+ <comment xml:lang="id">Senarai putar WPL</comment>
+ <comment xml:lang="ia">Lista de selection WPL</comment>
+ <comment xml:lang="hu">WPL-lejátszólista</comment>
+ <comment xml:lang="hr">WPL popis izvođenja</comment>
+ <comment xml:lang="he">רשימת נגינה WPL</comment>
+ <comment xml:lang="gl">lista de reprodución WPL</comment>
+ <comment xml:lang="ga">seinmliosta WPL</comment>
+ <comment xml:lang="fur">liste di riproduzion WPL</comment>
+ <comment xml:lang="fr">liste de lecture WPL</comment>
+ <comment xml:lang="fo">WPL avspælingarlisti</comment>
+ <comment xml:lang="fi">WPL-soittolista</comment>
+ <comment xml:lang="eu">WPL erreprodukzio-zerrenda</comment>
+ <comment xml:lang="es">lista de reproducción WPL</comment>
+ <comment xml:lang="eo">WPL-ludlisto</comment>
+ <comment xml:lang="en_GB">WPL playlist</comment>
+ <comment xml:lang="el">Λίστα αναπαραγωγής WPL</comment>
+ <comment xml:lang="de">WPL-Wiedergabeliste</comment>
+ <comment xml:lang="da">WPL-afspilningsliste</comment>
+ <comment xml:lang="cs">seznam k přehrání WPL</comment>
+ <comment xml:lang="ca">llista de reproducció WPL</comment>
+ <comment xml:lang="bg">Списък за изпълнение — WPL</comment>
+ <comment xml:lang="be">плэй-ліст WPL</comment>
+ <comment xml:lang="ar">قائمة تشغيل WPL</comment>
+ <comment xml:lang="af">WPL-speellys</comment>
<acronym>WPL</acronym>
<expanded-acronym>Windows Media Player Playlist</expanded-acronym>
<generic-icon name="video-x-generic"/>
@@ -2192,55 +2217,58 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-sqlite2">
<comment>SQLite2 database</comment>
- <comment xml:lang="af">SQLite2-databasis</comment>
- <comment xml:lang="ar">قاعدة بيانات SQLite2</comment>
- <comment xml:lang="be-Latn">Baza źviestak SQLite2</comment>
- <comment xml:lang="bg">База от данни — SQLite2</comment>
- <comment xml:lang="ca">base de dades SQLite2</comment>
- <comment xml:lang="cs">databáze SQLite2</comment>
- <comment xml:lang="da">SQLite2-database</comment>
- <comment xml:lang="de">SQLite2-Datenbank</comment>
- <comment xml:lang="el">Βάση δεδομένων SQLite2</comment>
- <comment xml:lang="en-GB">SQLite2 database</comment>
- <comment xml:lang="eo">SQLite2-datumbazo</comment>
- <comment xml:lang="es">base de datos SQLite2</comment>
- <comment xml:lang="eu">SQLite2 datu-basea</comment>
- <comment xml:lang="fi">SQLite2-tietokanta</comment>
- <comment xml:lang="fo">SQLite2 dátustovnur</comment>
- <comment xml:lang="fr">base de données SQLite2</comment>
- <comment xml:lang="fur">base di dâts SQLite2</comment>
- <comment xml:lang="ga">bunachar sonraí SQLite2</comment>
- <comment xml:lang="gl">base de datos SQLite2</comment>
- <comment xml:lang="he">מסד נתונים מסוג SQLite2</comment>
- <comment xml:lang="hr">SQLite2 baza podataka</comment>
- <comment xml:lang="hu">SQLite2 adatbázis</comment>
- <comment xml:lang="ia">Base de datos SQLite2</comment>
- <comment xml:lang="id">Basis data SQLite2</comment>
- <comment xml:lang="it">Database SQLite2</comment>
- <comment xml:lang="ja">SQLite2 データベース</comment>
- <comment xml:lang="kk">SQLite2 дерекқоры</comment>
- <comment xml:lang="ko">SQLite2 데이터베이스</comment>
- <comment xml:lang="lt">SQLite2 duomenų bazė</comment>
- <comment xml:lang="lv">SQLite2 datubāze</comment>
- <comment xml:lang="nb">SQLite2-database</comment>
- <comment xml:lang="nl">SQLite2-gegevensbank</comment>
- <comment xml:lang="nn">SQLite2-database</comment>
- <comment xml:lang="oc">banca de donadas SQLite2</comment>
- <comment xml:lang="pl">Baza danych SQLite2</comment>
- <comment xml:lang="pt">base de dados SQLite2</comment>
- <comment xml:lang="pt-BR">Banco de dados SQLite2</comment>
- <comment xml:lang="ro">Bază de date SQLite2</comment>
- <comment xml:lang="ru">База данных SQLite2</comment>
- <comment xml:lang="sk">Databáza SQLite2</comment>
- <comment xml:lang="sl">Podatkovna zbirka SQLite2</comment>
- <comment xml:lang="sq">Bazë me të dhëna SQLite2</comment>
- <comment xml:lang="sr">СКуЛајт2 база података</comment>
- <comment xml:lang="sv">SQLite2-databas</comment>
- <comment xml:lang="tr">SQLite2 veri tabanı</comment>
- <comment xml:lang="uk">База даних SQLite2</comment>
+ <comment xml:lang="zh_TW">SQLite2 資料庫</comment>
+ <comment xml:lang="zh_CN">SQLite2 数据库</comment>
<comment xml:lang="vi">Cơ sở dữ liệu SQLite2</comment>
- <comment xml:lang="zh-CN">SQLite2 数据库</comment>
- <comment xml:lang="zh-TW">SQLite2 資料庫</comment>
+ <comment xml:lang="uk">База даних SQLite2</comment>
+ <comment xml:lang="tr">SQLite2 veri tabanı</comment>
+ <comment xml:lang="sv">SQLite2-databas</comment>
+ <comment xml:lang="sr">СКуЛајт2 база података</comment>
+ <comment xml:lang="sq">bazë të dhënash SQLite2</comment>
+ <comment xml:lang="sl">Podatkovna zbirka SQLite2</comment>
+ <comment xml:lang="si">SQLite2 දත්ත සමුදාය</comment>
+ <comment xml:lang="sk">Databáza SQLite2</comment>
+ <comment xml:lang="ru">База данных SQLite2</comment>
+ <comment xml:lang="ro">Bază de date SQLite2</comment>
+ <comment xml:lang="pt_BR">Banco de dados SQLite2</comment>
+ <comment xml:lang="pt">base de dados SQLite2</comment>
+ <comment xml:lang="pl">Baza danych SQLite2</comment>
+ <comment xml:lang="oc">banca de donadas SQLite2</comment>
+ <comment xml:lang="nn">SQLite2-database</comment>
+ <comment xml:lang="nl">SQLite2-gegevensbank</comment>
+ <comment xml:lang="nb">SQLite2-database</comment>
+ <comment xml:lang="lv">SQLite2 datubāze</comment>
+ <comment xml:lang="lt">SQLite2 duomenų bazė</comment>
+ <comment xml:lang="ko">SQLite2 데이터베이스</comment>
+ <comment xml:lang="kk">SQLite2 дерекқоры</comment>
+ <comment xml:lang="ja">SQLite2 データベース</comment>
+ <comment xml:lang="it">Database SQLite2</comment>
+ <comment xml:lang="is">SQLite2 gagnagrunnur</comment>
+ <comment xml:lang="id">Basis data SQLite2</comment>
+ <comment xml:lang="ia">Base de datos SQLite2</comment>
+ <comment xml:lang="hu">SQLite2 adatbázis</comment>
+ <comment xml:lang="hr">SQLite2 baza podataka</comment>
+ <comment xml:lang="he">מסד נתונים מסוג SQLite2</comment>
+ <comment xml:lang="gl">base de datos SQLite2</comment>
+ <comment xml:lang="ga">bunachar sonraí SQLite2</comment>
+ <comment xml:lang="fur">base di dâts SQLite2</comment>
+ <comment xml:lang="fr">base de données SQLite2</comment>
+ <comment xml:lang="fo">SQLite2 dátustovnur</comment>
+ <comment xml:lang="fi">SQLite2-tietokanta</comment>
+ <comment xml:lang="eu">SQLite2 datu-basea</comment>
+ <comment xml:lang="es">base de datos SQLite2</comment>
+ <comment xml:lang="eo">SQLite2-datumbazo</comment>
+ <comment xml:lang="en_GB">SQLite2 database</comment>
+ <comment xml:lang="el">Βάση δεδομένων SQLite2</comment>
+ <comment xml:lang="de">SQLite2-Datenbank</comment>
+ <comment xml:lang="da">SQLite2-database</comment>
+ <comment xml:lang="cs">databáze SQLite2</comment>
+ <comment xml:lang="ca">base de dades SQLite2</comment>
+ <comment xml:lang="bg">База от данни — SQLite2</comment>
+ <comment xml:lang="be@latin">Baza źviestak SQLite2</comment>
+ <comment xml:lang="be">база даных SQLite2</comment>
+ <comment xml:lang="ar">قاعدة بيانات SQLite2</comment>
+ <comment xml:lang="af">SQLite2-databasis</comment>
<glob pattern="*.sqlite2"/>
<magic>
<match type="string" value="** This file contains an SQLite" offset="0"/>
@@ -2248,55 +2276,58 @@ command to generate the output files.
</mime-type>
<mime-type type="application/vnd.sqlite3">
<comment>SQLite3 database</comment>
- <comment xml:lang="af">SQLite3-databasis</comment>
- <comment xml:lang="ar">قاعدة بيانات SQLite3</comment>
- <comment xml:lang="be-Latn">Baza źviestak SQLite3</comment>
- <comment xml:lang="bg">База от данни — SQLite3</comment>
- <comment xml:lang="ca">base de dades SQLite3</comment>
- <comment xml:lang="cs">databáze SQLite3</comment>
- <comment xml:lang="da">SQLite3-database</comment>
- <comment xml:lang="de">SQLite3-Datenbank</comment>
- <comment xml:lang="el">Βάση δεδομένων SQLite3</comment>
- <comment xml:lang="en-GB">SQLite3 database</comment>
- <comment xml:lang="eo">SQLite3-datumbazo</comment>
- <comment xml:lang="es">base de datos SQLite3</comment>
- <comment xml:lang="eu">SQLite3 datu-basea</comment>
- <comment xml:lang="fi">SQLite3-tietokanta</comment>
- <comment xml:lang="fo">SQLite3 dátustovnur</comment>
- <comment xml:lang="fr">base de données SQLite3</comment>
- <comment xml:lang="fur">base di dâts SQLite3</comment>
- <comment xml:lang="ga">bunachar sonraí SQLite3</comment>
- <comment xml:lang="gl">base de datos SQLite3</comment>
- <comment xml:lang="he">מסד נתונים מסוג SQLite3</comment>
- <comment xml:lang="hr">SQLite3 baza podataka</comment>
- <comment xml:lang="hu">SQLite3 adatbázis</comment>
- <comment xml:lang="ia">Base de datos SQLite3</comment>
- <comment xml:lang="id">Basis data SQLite3</comment>
- <comment xml:lang="it">Database SQLite3</comment>
- <comment xml:lang="ja">SQLite3 データベース</comment>
- <comment xml:lang="kk">SQLite3 дерекқоры</comment>
- <comment xml:lang="ko">SQLite3 데이터베이스</comment>
- <comment xml:lang="lt">SQLite3 duomenų bazė</comment>
- <comment xml:lang="lv">SQLite3 datubāze</comment>
- <comment xml:lang="nb">SQLite3-database</comment>
- <comment xml:lang="nl">SQLite3-gegevensbank</comment>
- <comment xml:lang="nn">SQLite3-database</comment>
- <comment xml:lang="oc">banca de donadas SQLite3</comment>
- <comment xml:lang="pl">Baza danych SQLite3</comment>
- <comment xml:lang="pt">base de dados SQLite3</comment>
- <comment xml:lang="pt-BR">Banco de dados SQLite3</comment>
- <comment xml:lang="ro">Bază de date SQLite3</comment>
- <comment xml:lang="ru">База данных SQLite3</comment>
- <comment xml:lang="sk">Databáza SQLite3</comment>
- <comment xml:lang="sl">Podatkovna zbirka SQLite3</comment>
- <comment xml:lang="sq">Bazë me të dhëna SQLite3</comment>
- <comment xml:lang="sr">СКуЛајт3 база података</comment>
- <comment xml:lang="sv">SQLite3-databas</comment>
- <comment xml:lang="tr">SQLite3 veri tabanı</comment>
- <comment xml:lang="uk">база даних SQLite3</comment>
+ <comment xml:lang="zh_TW">SQLite3 資料庫</comment>
+ <comment xml:lang="zh_CN">SQLite3 数据库</comment>
<comment xml:lang="vi">Cơ sở dữ liệu SQLite3</comment>
- <comment xml:lang="zh-CN">SQLite3 数据库</comment>
- <comment xml:lang="zh-TW">SQLite3 資料庫</comment>
+ <comment xml:lang="uk">база даних SQLite3</comment>
+ <comment xml:lang="tr">SQLite3 veri tabanı</comment>
+ <comment xml:lang="sv">SQLite3-databas</comment>
+ <comment xml:lang="sr">СКуЛајт3 база података</comment>
+ <comment xml:lang="sq">bazë të dhënash SQLite3</comment>
+ <comment xml:lang="sl">Podatkovna zbirka SQLite3</comment>
+ <comment xml:lang="si">SQLite3 දත්ත සමුදාය</comment>
+ <comment xml:lang="sk">Databáza SQLite3</comment>
+ <comment xml:lang="ru">База данных SQLite3</comment>
+ <comment xml:lang="ro">Bază de date SQLite3</comment>
+ <comment xml:lang="pt_BR">Banco de dados SQLite3</comment>
+ <comment xml:lang="pt">base de dados SQLite3</comment>
+ <comment xml:lang="pl">Baza danych SQLite3</comment>
+ <comment xml:lang="oc">banca de donadas SQLite3</comment>
+ <comment xml:lang="nn">SQLite3-database</comment>
+ <comment xml:lang="nl">SQLite3-gegevensbank</comment>
+ <comment xml:lang="nb">SQLite3-database</comment>
+ <comment xml:lang="lv">SQLite3 datubāze</comment>
+ <comment xml:lang="lt">SQLite3 duomenų bazė</comment>
+ <comment xml:lang="ko">SQLite3 데이터베이스</comment>
+ <comment xml:lang="kk">SQLite3 дерекқоры</comment>
+ <comment xml:lang="ja">SQLite3 データベース</comment>
+ <comment xml:lang="it">Database SQLite3</comment>
+ <comment xml:lang="is">SQLite3 gagnagrunnur</comment>
+ <comment xml:lang="id">Basis data SQLite3</comment>
+ <comment xml:lang="ia">Base de datos SQLite3</comment>
+ <comment xml:lang="hu">SQLite3 adatbázis</comment>
+ <comment xml:lang="hr">SQLite3 baza podataka</comment>
+ <comment xml:lang="he">מסד נתונים מסוג SQLite3</comment>
+ <comment xml:lang="gl">base de datos SQLite3</comment>
+ <comment xml:lang="ga">bunachar sonraí SQLite3</comment>
+ <comment xml:lang="fur">base di dâts SQLite3</comment>
+ <comment xml:lang="fr">base de données SQLite3</comment>
+ <comment xml:lang="fo">SQLite3 dátustovnur</comment>
+ <comment xml:lang="fi">SQLite3-tietokanta</comment>
+ <comment xml:lang="eu">SQLite3 datu-basea</comment>
+ <comment xml:lang="es">base de datos SQLite3</comment>
+ <comment xml:lang="eo">SQLite3-datumbazo</comment>
+ <comment xml:lang="en_GB">SQLite3 database</comment>
+ <comment xml:lang="el">Βάση δεδομένων SQLite3</comment>
+ <comment xml:lang="de">SQLite3-Datenbank</comment>
+ <comment xml:lang="da">SQLite3-database</comment>
+ <comment xml:lang="cs">databáze SQLite3</comment>
+ <comment xml:lang="ca">base de dades SQLite3</comment>
+ <comment xml:lang="bg">База от данни — SQLite3</comment>
+ <comment xml:lang="be@latin">Baza źviestak SQLite3</comment>
+ <comment xml:lang="be">база даных SQLite3</comment>
+ <comment xml:lang="ar">قاعدة بيانات SQLite3</comment>
+ <comment xml:lang="af">SQLite3-databasis</comment>
<glob pattern="*.sqlite3"/>
<magic>
<match type="string" value="SQLite format 3" offset="0"/>
@@ -2305,142 +2336,170 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-apple-systemprofiler+xml">
<comment>Apple System Profiler</comment>
- <comment xml:lang="ca">System Profiler d'Apple</comment>
- <comment xml:lang="da">Apple System Profiler</comment>
- <comment xml:lang="de">Apple-Systeminformationen</comment>
- <comment xml:lang="en-GB">Apple System Profiler</comment>
- <comment xml:lang="es">perfil del sistema de Apple</comment>
- <comment xml:lang="fi">Applen järjestelmän profiloija</comment>
- <comment xml:lang="hr">Apple profiler sustava</comment>
- <comment xml:lang="it">Profiler di sistema Apple</comment>
- <comment xml:lang="pl">Profiler komputera Apple</comment>
- <comment xml:lang="pt">Perfilador do sistema Apple</comment>
- <comment xml:lang="sv">Apple Systeminformation</comment>
+ <comment xml:lang="zh_CN">Apple 系统概述</comment>
<comment xml:lang="uk">засіб профілювання системи Apple</comment>
- <comment xml:lang="zh-CN">Apple 系统概述</comment>
+ <comment xml:lang="tr">Apple Sistem Profilcisi</comment>
+ <comment xml:lang="sv">Apple Systeminformation</comment>
+ <comment xml:lang="sq">Apple System Profiler</comment>
+ <comment xml:lang="si">ඇපල් පද්ධති පැතිකඩ</comment>
+ <comment xml:lang="ru">Apple System Profiler</comment>
+ <comment xml:lang="pt_BR">Apple System Profiler</comment>
+ <comment xml:lang="pt">Perfilador do sistema Apple</comment>
+ <comment xml:lang="pl">Profiler komputera Apple</comment>
+ <comment xml:lang="nl">Apple System Profiler</comment>
+ <comment xml:lang="ko">Apple 시스템 프로파일러</comment>
+ <comment xml:lang="kk">Apple жүйелік профильдеуші</comment>
+ <comment xml:lang="ja">Apple システムプロファイラー</comment>
+ <comment xml:lang="it">Profiler di sistema Apple</comment>
+ <comment xml:lang="is">Apple System Profiler</comment>
+ <comment xml:lang="id">Profiler Sistem Apple</comment>
+ <comment xml:lang="hu">Apple rendszerprofilozó</comment>
+ <comment xml:lang="hr">Apple profiler sustava</comment>
+ <comment xml:lang="he">מאפיין מערכת של Apple</comment>
+ <comment xml:lang="gl">Perfilador de sistema de Appl</comment>
+ <comment xml:lang="fr">Profileur système Apple</comment>
+ <comment xml:lang="fi">Applen järjestelmän profiloija</comment>
+ <comment xml:lang="eu">Apple sistemaren profilatzailea</comment>
+ <comment xml:lang="es">perfil del sistema de Apple</comment>
+ <comment xml:lang="en_GB">Apple System Profiler</comment>
+ <comment xml:lang="de">Apple-Systeminformationen</comment>
+ <comment xml:lang="da">Apple System Profiler</comment>
+ <comment xml:lang="ca">System Profiler d'Apple</comment>
+ <comment xml:lang="be">Apple System Profiler</comment>
+ <comment xml:lang="ar">محلل نظام أبل</comment>
<sub-class-of type="application/xml"/>
- <magic priority="50">
- <match type="string" value="&lt;plist version=&quot;1.0&quot;" offset="0:256"/>
+ <magic>
+ <match type="string" value="&lt;plist version=&quot;1.0&quot;" offset="0:256">
+ <match type="string" value="&lt;key&gt;_SPCommandLineArguments&lt;/key&gt;" offset="34:384"/>
+ </match>
</magic>
<glob pattern="*.spx" weight="40"/>
<root-XML namespaceURI="http://www.apple.com/DTDs/PropertyList-1.0.dtd" localName="plist"/>
</mime-type>
- <mime-type type="application/x-gedcom">
+ <mime-type type="text/vnd.familysearch.gedcom">
<comment>GEDCOM family history</comment>
- <comment xml:lang="af">GEDCOM-familiegeskiedenis</comment>
- <comment xml:lang="ar">تاريخ عائلة GEDCOM</comment>
- <comment xml:lang="be-Latn">Siamiejnaja historyja GEDCOM</comment>
- <comment xml:lang="bg">Родословно дърво — GEDCOM</comment>
- <comment xml:lang="ca">antecedents familiars GEDCOM</comment>
- <comment xml:lang="cs">rodokmen GEDCOM</comment>
- <comment xml:lang="da">GEDCOM-familiehistorie</comment>
- <comment xml:lang="de">GEDCOM-Stammbaum</comment>
- <comment xml:lang="el">Οικογενειακό ιστορικό GEDCOM</comment>
- <comment xml:lang="en-GB">GEDCOM family history</comment>
- <comment xml:lang="es">historial familiar de GEDCOM</comment>
- <comment xml:lang="eu">GEDCOM famili historia</comment>
- <comment xml:lang="fi">GEDCOM-sukuhistoria</comment>
- <comment xml:lang="fo">GEDCOM familjusøga</comment>
- <comment xml:lang="fr">généalogie GEDCOM</comment>
- <comment xml:lang="fur">gjenealogjie GEDCOM</comment>
- <comment xml:lang="ga">stair theaghlach GEDCOM</comment>
- <comment xml:lang="gl">historial de familia GEDCOM</comment>
- <comment xml:lang="he">היסטוריה משפחתית של GEDCOM</comment>
- <comment xml:lang="hr">GEDCOM obiteljska povijest</comment>
- <comment xml:lang="hu">GEDCOM családtörténet</comment>
- <comment xml:lang="ia">Genealogia GEDCOM</comment>
- <comment xml:lang="id">Sejarah keluarga GEDCOM</comment>
- <comment xml:lang="it">Cronologia famiglia GEDCOM</comment>
- <comment xml:lang="ja">GEDCOM 家系図データ</comment>
- <comment xml:lang="ka">GEDCOM ოჯახის ისტორია</comment>
- <comment xml:lang="kk">GEDCOM отбасы тарихы</comment>
- <comment xml:lang="ko">GEDCOM 패밀리 기록</comment>
- <comment xml:lang="lt">GEDCOM šeimos istorija</comment>
- <comment xml:lang="lv">GEDCOM ģimenes vēsture</comment>
- <comment xml:lang="nb">GEDCOM-familiehistorikk</comment>
- <comment xml:lang="nl">GEDCOM-stamboom</comment>
- <comment xml:lang="nn">GEDCOM-familehistorie</comment>
- <comment xml:lang="oc">genealogia GEDCOM</comment>
- <comment xml:lang="pl">Plik historii rodziny GEDCOM</comment>
- <comment xml:lang="pt">história familiar GEDCOM</comment>
- <comment xml:lang="pt-BR">Histórico familiar do GEDCOM</comment>
- <comment xml:lang="ro">Tablou genealogic GEDCOM</comment>
- <comment xml:lang="ru">История семьи GEDCOM</comment>
- <comment xml:lang="sk">Rodokmeň GEDCOM</comment>
- <comment xml:lang="sl">Datoteka družinske zgodovine GEDCOM</comment>
- <comment xml:lang="sq">Kronollogji familje GEDCOM</comment>
- <comment xml:lang="sr">ГЕДКОМ историјат породице</comment>
- <comment xml:lang="sv">GEDCOM-släktträd</comment>
- <comment xml:lang="tr">GEDCOM aile geçmişi</comment>
- <comment xml:lang="uk">історія родини GEDCOM</comment>
+ <comment xml:lang="zh_TW">GEDCOM 族譜</comment>
+ <comment xml:lang="zh_CN">GEDCOM 家谱</comment>
<comment xml:lang="vi">Lịch sử gia đình GEDCOM</comment>
- <comment xml:lang="zh-CN">GEDCOM 家谱</comment>
- <comment xml:lang="zh-TW">GEDCOM 族譜</comment>
+ <comment xml:lang="uk">історія родини GEDCOM</comment>
+ <comment xml:lang="tr">GEDCOM aile geçmişi</comment>
+ <comment xml:lang="sv">GEDCOM-släktträd</comment>
+ <comment xml:lang="sr">ГЕДКОМ историјат породице</comment>
+ <comment xml:lang="sq">historik familjeje GEDCOM</comment>
+ <comment xml:lang="sl">Datoteka družinske zgodovine GEDCOM</comment>
+ <comment xml:lang="si">GEDCOM පවුලේ ඉතිහාසය</comment>
+ <comment xml:lang="sk">Rodokmeň GEDCOM</comment>
+ <comment xml:lang="ru">История семьи GEDCOM</comment>
+ <comment xml:lang="ro">Tablou genealogic GEDCOM</comment>
+ <comment xml:lang="pt_BR">Histórico familiar do GEDCOM</comment>
+ <comment xml:lang="pt">história familiar GEDCOM</comment>
+ <comment xml:lang="pl">Plik historii rodziny GEDCOM</comment>
+ <comment xml:lang="oc">genealogia GEDCOM</comment>
+ <comment xml:lang="nn">GEDCOM-familehistorie</comment>
+ <comment xml:lang="nl">GEDCOM-stamboom</comment>
+ <comment xml:lang="nb">GEDCOM-familiehistorikk</comment>
+ <comment xml:lang="lv">GEDCOM ģimenes vēsture</comment>
+ <comment xml:lang="lt">GEDCOM šeimos istorija</comment>
+ <comment xml:lang="ko">GEDCOM 가족 내력</comment>
+ <comment xml:lang="kk">GEDCOM отбасы тарихы</comment>
+ <comment xml:lang="ka">GEDCOM ოჯახის ისტორია</comment>
+ <comment xml:lang="ja">GEDCOM 家系図データ</comment>
+ <comment xml:lang="it">Cronologia famiglia GEDCOM</comment>
+ <comment xml:lang="is">GEDCOM ættartré</comment>
+ <comment xml:lang="id">Sejarah keluarga GEDCOM</comment>
+ <comment xml:lang="ia">Genealogia GEDCOM</comment>
+ <comment xml:lang="hu">GEDCOM családtörténet</comment>
+ <comment xml:lang="hr">GEDCOM obiteljska povijest</comment>
+ <comment xml:lang="he">היסטוריה משפחתית של GEDCOM</comment>
+ <comment xml:lang="gl">historial de familia GEDCOM</comment>
+ <comment xml:lang="ga">stair theaghlach GEDCOM</comment>
+ <comment xml:lang="fur">gjenealogjie GEDCOM</comment>
+ <comment xml:lang="fr">généalogie GEDCOM</comment>
+ <comment xml:lang="fo">GEDCOM familjusøga</comment>
+ <comment xml:lang="fi">GEDCOM-sukuhistoria</comment>
+ <comment xml:lang="eu">GEDCOM famili historia</comment>
+ <comment xml:lang="es">historial familiar de GEDCOM</comment>
+ <comment xml:lang="en_GB">GEDCOM family history</comment>
+ <comment xml:lang="el">Οικογενειακό ιστορικό GEDCOM</comment>
+ <comment xml:lang="de">GEDCOM-Stammbaum</comment>
+ <comment xml:lang="da">GEDCOM-familiehistorie</comment>
+ <comment xml:lang="cs">rodokmen GEDCOM</comment>
+ <comment xml:lang="ca">antecedents familiars GEDCOM</comment>
+ <comment xml:lang="bg">Родословно дърво — GEDCOM</comment>
+ <comment xml:lang="be@latin">Siamiejnaja historyja GEDCOM</comment>
+ <comment xml:lang="be">гісторыя сям'і GEDCOM</comment>
+ <comment xml:lang="ar">تاريخ عائلة GEDCOM</comment>
+ <comment xml:lang="af">GEDCOM-familiegeskiedenis</comment>
<acronym>GEDCOM</acronym>
<expanded-acronym>GEnealogical Data COMmunication</expanded-acronym>
+ <sub-class-of type="text/plain"/>
<generic-icon name="x-office-document"/>
- <magic priority="50">
+ <magic>
<match type="string" value="0 HEAD" offset="0"/>
</magic>
<glob pattern="*.ged"/>
<glob pattern="*.gedcom"/>
+ <alias type="application/x-gedcom"/>
<alias type="text/gedcom"/>
</mime-type>
<mime-type type="video/x-flv">
<comment>Flash video</comment>
- <comment xml:lang="af">Flash-video</comment>
- <comment xml:lang="ar">Flash مرئي</comment>
- <comment xml:lang="ast">Videu en Flash</comment>
- <comment xml:lang="be-Latn">Videa Flash</comment>
- <comment xml:lang="bg">Видео — Flash</comment>
- <comment xml:lang="ca">vídeo de Flash</comment>
- <comment xml:lang="cs">video Flash</comment>
- <comment xml:lang="da">Flashvideo</comment>
- <comment xml:lang="de">Flash-Video</comment>
- <comment xml:lang="el">Βίντεο Flash</comment>
- <comment xml:lang="en-GB">Flash video</comment>
- <comment xml:lang="eo">Flash-video</comment>
- <comment xml:lang="es">vídeo Flash</comment>
- <comment xml:lang="eu">Flash bideoa</comment>
- <comment xml:lang="fi">Flash-video</comment>
- <comment xml:lang="fo">Flash video</comment>
- <comment xml:lang="fr">vidéo Flash</comment>
- <comment xml:lang="fur">video Flash</comment>
- <comment xml:lang="ga">físeán Flash</comment>
- <comment xml:lang="gl">vídeo Flash</comment>
- <comment xml:lang="he">וידאו של פלאש</comment>
- <comment xml:lang="hr">Flash video snimka</comment>
- <comment xml:lang="hu">Flash videó</comment>
- <comment xml:lang="ia">Video Flash</comment>
- <comment xml:lang="id">Video Flash</comment>
- <comment xml:lang="it">Video Flash</comment>
- <comment xml:lang="ja">Flash 動画</comment>
- <comment xml:lang="ka">Flash-ის ვიდეო</comment>
- <comment xml:lang="kk">Flash видеосы</comment>
- <comment xml:lang="ko">Flash 동영상</comment>
- <comment xml:lang="lt">Flash vaizdo įrašas</comment>
- <comment xml:lang="lv">Flash video</comment>
- <comment xml:lang="nb">Flash-film</comment>
- <comment xml:lang="nl">Flash-video</comment>
- <comment xml:lang="nn">Flash-video</comment>
- <comment xml:lang="oc">vidèo Flash</comment>
- <comment xml:lang="pl">Plik wideo Flash</comment>
- <comment xml:lang="pt">vídeo Flash</comment>
- <comment xml:lang="pt-BR">Vídeo Flash</comment>
- <comment xml:lang="ro">Video Flash</comment>
- <comment xml:lang="ru">Видео Flash</comment>
- <comment xml:lang="sk">Video Flash</comment>
- <comment xml:lang="sl">Video datoteka Flash</comment>
- <comment xml:lang="sq">Video Flash</comment>
- <comment xml:lang="sr">Флеш видео</comment>
- <comment xml:lang="sv">Flash-video</comment>
- <comment xml:lang="tr">Flash video</comment>
- <comment xml:lang="uk">відеокліп Flash</comment>
+ <comment xml:lang="zh_TW">Flash 視訊</comment>
+ <comment xml:lang="zh_CN">Flash 视频</comment>
<comment xml:lang="vi">Ảnh động Flash</comment>
- <comment xml:lang="zh-CN">Flash 视频</comment>
- <comment xml:lang="zh-TW">Flash 視訊</comment>
+ <comment xml:lang="uk">відеокліп Flash</comment>
+ <comment xml:lang="tr">Flash video</comment>
+ <comment xml:lang="sv">Flash-video</comment>
+ <comment xml:lang="sr">Флеш видео</comment>
+ <comment xml:lang="sq">video Flash</comment>
+ <comment xml:lang="sl">Video datoteka Flash</comment>
+ <comment xml:lang="si">ෆ්ලෑෂ් වීඩියෝව</comment>
+ <comment xml:lang="sk">Video Flash</comment>
+ <comment xml:lang="ru">Видео Flash</comment>
+ <comment xml:lang="ro">Video Flash</comment>
+ <comment xml:lang="pt_BR">Vídeo Flash</comment>
+ <comment xml:lang="pt">vídeo Flash</comment>
+ <comment xml:lang="pl">Plik wideo Flash</comment>
+ <comment xml:lang="oc">vidèo Flash</comment>
+ <comment xml:lang="nn">Flash-video</comment>
+ <comment xml:lang="nl">Flash-video</comment>
+ <comment xml:lang="nb">Flash-film</comment>
+ <comment xml:lang="lv">Flash video</comment>
+ <comment xml:lang="lt">Flash vaizdo įrašas</comment>
+ <comment xml:lang="ko">Flash 동영상</comment>
+ <comment xml:lang="kk">Flash видеосы</comment>
+ <comment xml:lang="ka">Flash-ის ვიდეო</comment>
+ <comment xml:lang="ja">Flash 動画</comment>
+ <comment xml:lang="it">Video Flash</comment>
+ <comment xml:lang="is">Flash myndskeið</comment>
+ <comment xml:lang="id">Video Flash</comment>
+ <comment xml:lang="ia">Video Flash</comment>
+ <comment xml:lang="hu">Flash videó</comment>
+ <comment xml:lang="hr">Flash video snimka</comment>
+ <comment xml:lang="he">וידאו Flash</comment>
+ <comment xml:lang="gl">vídeo Flash</comment>
+ <comment xml:lang="ga">físeán Flash</comment>
+ <comment xml:lang="fur">video Flash</comment>
+ <comment xml:lang="fr">vidéo Flash</comment>
+ <comment xml:lang="fo">Flash video</comment>
+ <comment xml:lang="fi">Flash-video</comment>
+ <comment xml:lang="eu">Flash bideoa</comment>
+ <comment xml:lang="es">vídeo Flash</comment>
+ <comment xml:lang="eo">Flash-video</comment>
+ <comment xml:lang="en_GB">Flash video</comment>
+ <comment xml:lang="el">Βίντεο Flash</comment>
+ <comment xml:lang="de">Flash-Video</comment>
+ <comment xml:lang="da">Flashvideo</comment>
+ <comment xml:lang="cs">video Flash</comment>
+ <comment xml:lang="ca">vídeo de Flash</comment>
+ <comment xml:lang="bg">Видео — Flash</comment>
+ <comment xml:lang="be@latin">Videa Flash</comment>
+ <comment xml:lang="be">відэа Flash</comment>
+ <comment xml:lang="ast">Videu en Flash</comment>
+ <comment xml:lang="ar">فيديو فلاش</comment>
+ <comment xml:lang="af">Flash-video</comment>
<generic-icon name="video-x-generic"/>
- <magic priority="50">
+ <magic>
<match type="string" value="FLV" offset="0"/>
</magic>
<glob pattern="*.flv"/>
@@ -2450,50 +2509,55 @@ command to generate the output files.
</mime-type>
<mime-type type="video/x-javafx">
<comment>JavaFX video</comment>
- <comment xml:lang="af">JavaFX-video</comment>
- <comment xml:lang="ast">Videu en JavaFX</comment>
- <comment xml:lang="bg">Видео — JavaFX</comment>
- <comment xml:lang="ca">vídeo de JavaFX</comment>
- <comment xml:lang="cs">video JavaFX</comment>
- <comment xml:lang="da">JavaFX-video</comment>
- <comment xml:lang="de">JavaFX-Video</comment>
- <comment xml:lang="el">Βίντεο JavaFX</comment>
- <comment xml:lang="en-GB">JavaFX video</comment>
- <comment xml:lang="eo">JavaFX-video</comment>
- <comment xml:lang="es">vídeo JavaFX</comment>
- <comment xml:lang="eu">JavaFX bideoa</comment>
- <comment xml:lang="fi">JavaFX-video</comment>
- <comment xml:lang="fo">JavaFX video</comment>
- <comment xml:lang="fr">vidéo JavaFX</comment>
- <comment xml:lang="fur">video JavaFX</comment>
- <comment xml:lang="ga">físeán JavaFX</comment>
- <comment xml:lang="gl">vídeo JavaFX</comment>
- <comment xml:lang="he">וידאו JavaFX</comment>
- <comment xml:lang="hr">JavaFX video snimka</comment>
- <comment xml:lang="hu">JavaFX videó</comment>
- <comment xml:lang="ia">Video JavaFX</comment>
- <comment xml:lang="id">Video JavaFX</comment>
- <comment xml:lang="it">Video JavaFX</comment>
- <comment xml:lang="ja">JavaFX 動画</comment>
- <comment xml:lang="kk">JavaFX аудиосы</comment>
- <comment xml:lang="ko">JavaFX 동영상</comment>
- <comment xml:lang="lt">JavaFX vaizdo įrašas</comment>
- <comment xml:lang="lv">JavaFX video</comment>
- <comment xml:lang="nl">JavaFX video</comment>
- <comment xml:lang="oc">vidèo JavaFX</comment>
- <comment xml:lang="pl">Plik wideo JavaFX</comment>
- <comment xml:lang="pt">vídeo JavaFX</comment>
- <comment xml:lang="pt-BR">Vídeo JavaFX</comment>
- <comment xml:lang="ro">Video JavaFX</comment>
- <comment xml:lang="ru">Видео JavaFX</comment>
- <comment xml:lang="sk">Video JavaFX</comment>
- <comment xml:lang="sl">Video JavaFX</comment>
- <comment xml:lang="sr">ЈаваФИкс видео</comment>
- <comment xml:lang="sv">JavaFX-video</comment>
- <comment xml:lang="tr">JavaFX video</comment>
+ <comment xml:lang="zh_TW">JavaFX 視訊</comment>
+ <comment xml:lang="zh_CN">JavaFX 视频</comment>
<comment xml:lang="uk">відеокліп JavaFX</comment>
- <comment xml:lang="zh-CN">JavaFX 视频</comment>
- <comment xml:lang="zh-TW">JavaFX 視訊</comment>
+ <comment xml:lang="tr">JavaFX video</comment>
+ <comment xml:lang="sv">JavaFX-video</comment>
+ <comment xml:lang="sr">ЈаваФИкс видео</comment>
+ <comment xml:lang="sq">video JavaFX</comment>
+ <comment xml:lang="sl">Video JavaFX</comment>
+ <comment xml:lang="si">JavaFX වීඩියෝව</comment>
+ <comment xml:lang="sk">Video JavaFX</comment>
+ <comment xml:lang="ru">Видео JavaFX</comment>
+ <comment xml:lang="ro">Video JavaFX</comment>
+ <comment xml:lang="pt_BR">Vídeo JavaFX</comment>
+ <comment xml:lang="pt">vídeo JavaFX</comment>
+ <comment xml:lang="pl">Plik wideo JavaFX</comment>
+ <comment xml:lang="oc">vidèo JavaFX</comment>
+ <comment xml:lang="nl">JavaFX video</comment>
+ <comment xml:lang="lv">JavaFX video</comment>
+ <comment xml:lang="lt">JavaFX vaizdo įrašas</comment>
+ <comment xml:lang="ko">JavaFX 동영상</comment>
+ <comment xml:lang="kk">JavaFX аудиосы</comment>
+ <comment xml:lang="ja">JavaFX 動画</comment>
+ <comment xml:lang="it">Video JavaFX</comment>
+ <comment xml:lang="is">JavaFX myndskeið</comment>
+ <comment xml:lang="id">Video JavaFX</comment>
+ <comment xml:lang="ia">Video JavaFX</comment>
+ <comment xml:lang="hu">JavaFX videó</comment>
+ <comment xml:lang="hr">JavaFX video snimka</comment>
+ <comment xml:lang="he">וידאו JavaFX</comment>
+ <comment xml:lang="gl">vídeo JavaFX</comment>
+ <comment xml:lang="ga">físeán JavaFX</comment>
+ <comment xml:lang="fur">video JavaFX</comment>
+ <comment xml:lang="fr">vidéo JavaFX</comment>
+ <comment xml:lang="fo">JavaFX video</comment>
+ <comment xml:lang="fi">JavaFX-video</comment>
+ <comment xml:lang="eu">JavaFX bideoa</comment>
+ <comment xml:lang="es">vídeo JavaFX</comment>
+ <comment xml:lang="eo">JavaFX-video</comment>
+ <comment xml:lang="en_GB">JavaFX video</comment>
+ <comment xml:lang="el">Βίντεο JavaFX</comment>
+ <comment xml:lang="de">JavaFX-Video</comment>
+ <comment xml:lang="da">JavaFX-video</comment>
+ <comment xml:lang="cs">video JavaFX</comment>
+ <comment xml:lang="ca">vídeo de JavaFX</comment>
+ <comment xml:lang="bg">Видео — JavaFX</comment>
+ <comment xml:lang="be">відэа JavaFX</comment>
+ <comment xml:lang="ast">Videu en JavaFX</comment>
+ <comment xml:lang="ar">فيديو JavaFX</comment>
+ <comment xml:lang="af">JavaFX-video</comment>
<generic-icon name="video-x-generic"/>
<magic priority="40">
<match type="string" value="FLV" offset="0"/>
@@ -2506,115 +2570,300 @@ command to generate the output files.
that has been played, and that can be played back again:
http://www.red-bean.com/sgf/ -->
<comment>SGF record</comment>
- <comment xml:lang="af">SGF-rekord</comment>
- <comment xml:lang="ar">تسجيلة SGF</comment>
- <comment xml:lang="be-Latn">Zapisanaja hulnia SGF</comment>
- <comment xml:lang="bg">Запис — SGF</comment>
- <comment xml:lang="ca">registre SGF</comment>
- <comment xml:lang="cs">nahrávka SGF</comment>
- <comment xml:lang="da">SGF-optagelse</comment>
- <comment xml:lang="de">SGF-Aufzeichnung</comment>
- <comment xml:lang="el">Εγγραφή SGF</comment>
- <comment xml:lang="en-GB">SGF record</comment>
- <comment xml:lang="es">grabación SGF</comment>
- <comment xml:lang="eu">SGF erregistroa</comment>
- <comment xml:lang="fi">SGF-nauhoitus</comment>
- <comment xml:lang="fo">SGF met</comment>
- <comment xml:lang="fr">partie SGF</comment>
- <comment xml:lang="fur">regjistrazion SGF</comment>
- <comment xml:lang="ga">taifead SGF</comment>
- <comment xml:lang="gl">Grabación SGF</comment>
- <comment xml:lang="he">הקלטת SGF</comment>
- <comment xml:lang="hr">SGF zapis</comment>
- <comment xml:lang="hu">SGF pontszám</comment>
- <comment xml:lang="ia">Partita SGF</comment>
- <comment xml:lang="id">Catatan SGF</comment>
- <comment xml:lang="it">Registrazione SGF</comment>
- <comment xml:lang="ja">SGF レコード</comment>
- <comment xml:lang="kk">SGF жазбасы</comment>
- <comment xml:lang="ko">SGF 기록 파일</comment>
- <comment xml:lang="lt">SGF įrašas</comment>
- <comment xml:lang="lv">SGF ieraksts</comment>
- <comment xml:lang="nb">SGF-oppføring</comment>
- <comment xml:lang="nl">SGF-record</comment>
- <comment xml:lang="nn">SGF-logg</comment>
- <comment xml:lang="oc">partida SGF</comment>
- <comment xml:lang="pl">Zapis gry SGF</comment>
- <comment xml:lang="pt">gravação SGF</comment>
- <comment xml:lang="pt-BR">Gravação SGF</comment>
- <comment xml:lang="ro">Înregistrare SGF</comment>
- <comment xml:lang="ru">Запись SGF</comment>
- <comment xml:lang="sk">Záznam SGF</comment>
- <comment xml:lang="sl">Datoteka shranjene igre SGF</comment>
- <comment xml:lang="sq">Regjistrim SGF</comment>
- <comment xml:lang="sr">СГФ запис</comment>
- <comment xml:lang="sv">SGF-protokoll</comment>
- <comment xml:lang="tr">SGF kaydı</comment>
- <comment xml:lang="uk">запис SGF</comment>
+ <comment xml:lang="zh_TW">SGF 紀錄</comment>
+ <comment xml:lang="zh_CN">SGF 记录</comment>
<comment xml:lang="vi">Mục ghi SGF</comment>
- <comment xml:lang="zh-CN">SGF 记录</comment>
- <comment xml:lang="zh-TW">SGF 紀錄</comment>
+ <comment xml:lang="uk">запис SGF</comment>
+ <comment xml:lang="tr">SGF kaydı</comment>
+ <comment xml:lang="sv">SGF-protokoll</comment>
+ <comment xml:lang="sr">СГФ запис</comment>
+ <comment xml:lang="sq">regjistrim SGF</comment>
+ <comment xml:lang="sl">Datoteka shranjene igre SGF</comment>
+ <comment xml:lang="si">SGF වාර්තාව</comment>
+ <comment xml:lang="sk">Záznam SGF</comment>
+ <comment xml:lang="ru">Запись SGF</comment>
+ <comment xml:lang="ro">Înregistrare SGF</comment>
+ <comment xml:lang="pt_BR">Gravação SGF</comment>
+ <comment xml:lang="pt">gravação SGF</comment>
+ <comment xml:lang="pl">Zapis gry SGF</comment>
+ <comment xml:lang="oc">partida SGF</comment>
+ <comment xml:lang="nn">SGF-logg</comment>
+ <comment xml:lang="nl">SGF-record</comment>
+ <comment xml:lang="nb">SGF-oppføring</comment>
+ <comment xml:lang="lv">SGF ieraksts</comment>
+ <comment xml:lang="lt">SGF įrašas</comment>
+ <comment xml:lang="ko">SGF 기록 파일</comment>
+ <comment xml:lang="kk">SGF жазбасы</comment>
+ <comment xml:lang="ja">SGF レコード</comment>
+ <comment xml:lang="it">Registrazione SGF</comment>
+ <comment xml:lang="is">SGF færsla</comment>
+ <comment xml:lang="id">Catatan SGF</comment>
+ <comment xml:lang="ia">Partita SGF</comment>
+ <comment xml:lang="hu">SGF pontszám</comment>
+ <comment xml:lang="hr">SGF zapis</comment>
+ <comment xml:lang="he">הקלטת SGF</comment>
+ <comment xml:lang="gl">Grabación SGF</comment>
+ <comment xml:lang="ga">taifead SGF</comment>
+ <comment xml:lang="fur">regjistrazion SGF</comment>
+ <comment xml:lang="fr">partie SGF</comment>
+ <comment xml:lang="fo">SGF met</comment>
+ <comment xml:lang="fi">SGF-tallenne</comment>
+ <comment xml:lang="eu">SGF erregistroa</comment>
+ <comment xml:lang="es">grabación SGF</comment>
+ <comment xml:lang="en_GB">SGF record</comment>
+ <comment xml:lang="el">Εγγραφή SGF</comment>
+ <comment xml:lang="de">SGF-Aufzeichnung</comment>
+ <comment xml:lang="da">SGF-optagelse</comment>
+ <comment xml:lang="cs">nahrávka SGF</comment>
+ <comment xml:lang="ca">registre SGF</comment>
+ <comment xml:lang="bg">Запис — SGF</comment>
+ <comment xml:lang="be@latin">Zapisanaja hulnia SGF</comment>
+ <comment xml:lang="be">запіс SGF</comment>
+ <comment xml:lang="ar">تسجيلة SGF</comment>
+ <comment xml:lang="af">SGF-rekord</comment>
<acronym>SGF</acronym>
<expanded-acronym>Smart Game Format</expanded-acronym>
<generic-icon name="text-x-generic"/>
<glob pattern="*.sgf"/>
<sub-class-of type="text/plain"/>
- <magic priority="50">
+ <magic>
<match type="string" value="(;FF[3]" offset="0"/>
<match type="string" value="(;FF[4]" offset="0"/>
</magic>
</mime-type>
+ <mime-type type="application/x-godot-project">
+ <comment>Godot Engine project</comment>
+ <comment xml:lang="zh_TW">Godot Engine 專案</comment>
+ <comment xml:lang="zh_CN">Godot Engine 项目</comment>
+ <comment xml:lang="uk">проєкт Godot Engine</comment>
+ <comment xml:lang="tr">Godot Engine projesi</comment>
+ <comment xml:lang="sv">Godot Engine-projekt</comment>
+ <comment xml:lang="sl">Projekt Godot Engine</comment>
+ <comment xml:lang="si">ගොඩොට් එන්ජින් ව්යාපෘතිය</comment>
+ <comment xml:lang="ru">Проект Godot Engine</comment>
+ <comment xml:lang="pt_BR">Projeto do Godot Engine</comment>
+ <comment xml:lang="pt">projeto Godot Engine</comment>
+ <comment xml:lang="pl">Projekt Godot Engine</comment>
+ <comment xml:lang="nl">Godot Engine-project</comment>
+ <comment xml:lang="ko">Godot 엔진 프로젝트</comment>
+ <comment xml:lang="kk">Godot Engine жобасы</comment>
+ <comment xml:lang="ja">Godot Engine プロジェクト</comment>
+ <comment xml:lang="it">Progetto Godot Engine</comment>
+ <comment xml:lang="hr">Godot Engine projekt</comment>
+ <comment xml:lang="he">מיזם של מנוע גודו</comment>
+ <comment xml:lang="gl">Proxecto do motor Godot</comment>
+ <comment xml:lang="fi">Godot Engine -projekti</comment>
+ <comment xml:lang="eu">Godot Engine proiektua</comment>
+ <comment xml:lang="es">proyecto de motor Godot</comment>
+ <comment xml:lang="en_GB">Godot Engine project</comment>
+ <comment xml:lang="de">Godot-Engine-Projekt</comment>
+ <comment xml:lang="be">праект Godot Engine</comment>
+ <comment xml:lang="ar">مشروع محرك جودو</comment>
+ <sub-class-of type="text/plain"/>
+ <glob pattern="project.godot"/>
+ </mime-type>
+ <mime-type type="application/x-godot-resource">
+ <comment>Godot Engine resource</comment>
+ <comment xml:lang="zh_CN">Godot Engine 资源</comment>
+ <comment xml:lang="uk">ресурс Godot Engine</comment>
+ <comment xml:lang="tr">Godot Engine kaynağı</comment>
+ <comment xml:lang="sv">Godot Engine-resurs</comment>
+ <comment xml:lang="sl">Vir Godot Engine</comment>
+ <comment xml:lang="si">ගොඩොට් එන්ජින් සම්පත</comment>
+ <comment xml:lang="ru">Ресурс Godot Engine</comment>
+ <comment xml:lang="pt_BR">Recurso do Godot Engine</comment>
+ <comment xml:lang="pt">recurso do Motor Godot</comment>
+ <comment xml:lang="pl">Zasób Godot Engine</comment>
+ <comment xml:lang="nl">Godot Engine-bron</comment>
+ <comment xml:lang="ko">Godot 엔진 자원</comment>
+ <comment xml:lang="kk">Godot Engine ресурсы</comment>
+ <comment xml:lang="ja">Godot Engine リソース</comment>
+ <comment xml:lang="it">Risorsa Godot Engine</comment>
+ <comment xml:lang="hr">Godot Engine resurs</comment>
+ <comment xml:lang="he">משאב של מנוע גודו</comment>
+ <comment xml:lang="gl">Recurso do motor Godot</comment>
+ <comment xml:lang="fi">Godot Engine -resurssi</comment>
+ <comment xml:lang="eu">Godot Engine baliabidea</comment>
+ <comment xml:lang="es">recurso de motor Godot</comment>
+ <comment xml:lang="en_GB">Godot Engine resource</comment>
+ <comment xml:lang="de">Godot-Engine-Ressource</comment>
+ <comment xml:lang="be">рэсурс Godot Engine</comment>
+ <comment xml:lang="ar">مورد محرك جودو</comment>
+ <glob pattern="*.res"/>
+ <glob pattern="*.tres"/>
+ <magic>
+ <match type="string" value="[gd_resource " offset="0"/>
+ </magic>
+ </mime-type>
+ <mime-type type="application/x-godot-scene">
+ <comment>Godot Engine scene</comment>
+ <comment xml:lang="zh_TW">Godot Engine 場景</comment>
+ <comment xml:lang="zh_CN">Godot Engine 场景</comment>
+ <comment xml:lang="uk">сцена Godot Engine</comment>
+ <comment xml:lang="tr">Godot Engine sahnesi</comment>
+ <comment xml:lang="sv">Godot Engine-scen</comment>
+ <comment xml:lang="sl">Prizor Godot Engine</comment>
+ <comment xml:lang="si">ගොඩෝ එන්ජින් දර්ශනය</comment>
+ <comment xml:lang="ru">Сцена Godot Engine</comment>
+ <comment xml:lang="pt_BR">Cena do Godot Engine</comment>
+ <comment xml:lang="pt">cena do Godot Engine</comment>
+ <comment xml:lang="pl">Scena Godot Engine</comment>
+ <comment xml:lang="nl">Godot Engine-scène</comment>
+ <comment xml:lang="ko">Godot 엔진 장면</comment>
+ <comment xml:lang="kk">Godot Engine сахнасы</comment>
+ <comment xml:lang="ja">Godot Engine シーン</comment>
+ <comment xml:lang="it">Scena Godot Engine</comment>
+ <comment xml:lang="hr">Godot Engine scena</comment>
+ <comment xml:lang="he">סצנה של מנוע גודו</comment>
+ <comment xml:lang="gl">Escena do motor Godot</comment>
+ <comment xml:lang="fi">Godot Engine -näkymä</comment>
+ <comment xml:lang="eu">Godot Engine eszena</comment>
+ <comment xml:lang="es">escena de motor Godot</comment>
+ <comment xml:lang="en_GB">Godot Engine scene</comment>
+ <comment xml:lang="de">Godot-Engine-Szene</comment>
+ <comment xml:lang="be">сцэна Godot Engine</comment>
+ <comment xml:lang="ar">مشهد محرك جودو</comment>
+ <glob pattern="*.scn"/>
+ <glob pattern="*.tscn"/>
+ <glob pattern="*.escn"/>
+ <magic>
+ <match type="string" value="[gd_scene " offset="0"/>
+ </magic>
+ </mime-type>
+ <mime-type type="application/x-godot-shader">
+ <comment>Godot Engine shader</comment>
+ <comment xml:lang="zh_CN">Godot Engine 着色器</comment>
+ <comment xml:lang="uk">шейдер Godot Engine</comment>
+ <comment xml:lang="tr">Godot Engine gölgelendiricisi</comment>
+ <comment xml:lang="sv">Godot Engine-shader</comment>
+ <comment xml:lang="sl">Senčilnik Godot Engine</comment>
+ <comment xml:lang="si">ගොඩොට් එන්ජින් සෙවන</comment>
+ <comment xml:lang="ru">Шейдер Godot Engine</comment>
+ <comment xml:lang="pt_BR">Sombra do Godot Engine</comment>
+ <comment xml:lang="pt">sombra do Godot Engine</comment>
+ <comment xml:lang="pl">Program cieniujący Godot Engine</comment>
+ <comment xml:lang="nl">Godot Engine-shader</comment>
+ <comment xml:lang="ko">Godot 엔진 셰이더</comment>
+ <comment xml:lang="kk">Godot Engine шейдері</comment>
+ <comment xml:lang="ja">Godot Engine シェーダー</comment>
+ <comment xml:lang="it">Shader Godot Engine</comment>
+ <comment xml:lang="hr">Godot Engine shader</comment>
+ <comment xml:lang="he">הצללה של מנוע גודו</comment>
+ <comment xml:lang="gl">Sombreador do motor Godot</comment>
+ <comment xml:lang="fi">Godot Engine -varjostin</comment>
+ <comment xml:lang="eu">Godot Engine itzalgilea</comment>
+ <comment xml:lang="es">sombreador de Godot Engine</comment>
+ <comment xml:lang="en_GB">Godot Engine shader</comment>
+ <comment xml:lang="de">Godot-Engine-Shader</comment>
+ <comment xml:lang="be">шэйдар Godot Engine</comment>
+ <comment xml:lang="ar">مظلل محرك جودو</comment>
+ <sub-class-of type="text/plain"/>
+ <glob pattern="*.gdshader"/>
+ </mime-type>
+ <mime-type type="application/x-gdscript">
+ <comment>GDScript script</comment>
+ <comment xml:lang="zh_TW">GDScript 指令稿</comment>
+ <comment xml:lang="zh_CN">GDScript 脚本</comment>
+ <comment xml:lang="uk">скрипт GDScript</comment>
+ <comment xml:lang="tr">GDScript betiği</comment>
+ <comment xml:lang="sv">GDScript-skript</comment>
+ <comment xml:lang="sl">Skript GDScript</comment>
+ <comment xml:lang="si">GDScript පිටපත</comment>
+ <comment xml:lang="ru">Сценарий GDScript</comment>
+ <comment xml:lang="pt_BR">Script GDScript</comment>
+ <comment xml:lang="pl">Skrypt GDScript</comment>
+ <comment xml:lang="nl">GDScript-script</comment>
+ <comment xml:lang="ko">GDScript 스크립트</comment>
+ <comment xml:lang="kk">GDScript скрипті</comment>
+ <comment xml:lang="ka">GDScript-ის სკრიპტი</comment>
+ <comment xml:lang="ja">GDScript スクリプト</comment>
+ <comment xml:lang="it">Script GDScript</comment>
+ <comment xml:lang="hr">GDScript skripta</comment>
+ <comment xml:lang="he">סקריפט GDScript</comment>
+ <comment xml:lang="gl">Script de GDScript</comment>
+ <comment xml:lang="fi">GDScript-skripti</comment>
+ <comment xml:lang="eu">GDScript scripta</comment>
+ <comment xml:lang="es">secuencia de órdenes en GDScript</comment>
+ <comment xml:lang="en_GB">GDScript script</comment>
+ <comment xml:lang="de">GDScript-Skript</comment>
+ <comment xml:lang="be">скрыпт GDScript</comment>
+ <comment xml:lang="ar">سكربت GDScript</comment>
+ <sub-class-of type="text/plain"/>
+ <glob pattern="*.gd"/>
+ </mime-type>
+ <mime-type type="application/its+xml">
+ <comment>ITS translation file</comment>
+ <comment xml:lang="uk">файл перекладу ITS</comment>
+ <comment xml:lang="sv">ITS-översättningsfil</comment>
+ <comment xml:lang="ru">Файл перевода ITS</comment>
+ <comment xml:lang="pl">Plik tłumaczenia ITS</comment>
+ <comment xml:lang="es">archivo de traducción ITS</comment>
+ <comment xml:lang="de">ITS-Übersetzungsdatei</comment>
+ <acronym>ITS</acronym>
+ <expanded-acronym>Internationalization Tag Set</expanded-acronym>
+ <sub-class-of type="application/xml"/>
+ <generic-icon name="text-x-generic"/>
+ <glob pattern="*.its"/>
+ <magic>
+ <match type="string" value="&lt;its" offset="0:256"/>
+ </magic>
+ <root-XML namespaceURI="http://www.w3.org/2005/11/its" localName="its"/>
+ </mime-type>
<mime-type type="application/xliff+xml">
<comment>XLIFF translation file</comment>
- <comment xml:lang="af">XLIFF-vertaallêer</comment>
- <comment xml:lang="ar">ملف ترجمة XLIFF</comment>
- <comment xml:lang="ast">Ficheru de traducciones XLIFF</comment>
- <comment xml:lang="be-Latn">Fajł pierakładu XLIFF</comment>
- <comment xml:lang="bg">Превод — XLIFF</comment>
- <comment xml:lang="ca">fitxer de traducció XLIFF</comment>
- <comment xml:lang="cs">soubor překladu XLIFF</comment>
- <comment xml:lang="da">XLIFF-oversættelsesfil</comment>
- <comment xml:lang="de">XLIFF-Übersetzung</comment>
- <comment xml:lang="el">Αρχείο μετάφρασης XLIFF</comment>
- <comment xml:lang="en-GB">XLIFF translation file</comment>
- <comment xml:lang="es">archivo de traducción XLIFF</comment>
- <comment xml:lang="eu">XLIFF itzulpen-fitxategia</comment>
- <comment xml:lang="fi">XLIFF-käännöstiedosto</comment>
- <comment xml:lang="fo">XLIFF týðingarfíla</comment>
- <comment xml:lang="fr">fichier de traduction XLIFF</comment>
- <comment xml:lang="fur">file di traduzion XLIFF</comment>
- <comment xml:lang="ga">comhad aistriúcháin XLIFF</comment>
- <comment xml:lang="gl">ficheiro de tradución XLIFF</comment>
- <comment xml:lang="he">קובץ תרגום CLIFF</comment>
- <comment xml:lang="hr">XLIFF datoteka prijevoda</comment>
- <comment xml:lang="hu">XLIFF fordítási fájl</comment>
- <comment xml:lang="ia">File de traduction XLIFF</comment>
- <comment xml:lang="id">Berkas terjemahan XLIFF</comment>
- <comment xml:lang="it">File traduzione XLIFF</comment>
- <comment xml:lang="ja">XLIFF 翻訳ファイル</comment>
- <comment xml:lang="kk">XLIFF аударма файлы</comment>
- <comment xml:lang="ko">XLIFF 번역 파일</comment>
- <comment xml:lang="lt">XLIFF vertimo failas</comment>
- <comment xml:lang="lv">XLIFF tulkošanas datne</comment>
- <comment xml:lang="nb">XLIFF-oversettelsesfil</comment>
- <comment xml:lang="nl">XLIFF-vertalingsbestand</comment>
- <comment xml:lang="nn">XLIFF-omsetjingsfil</comment>
- <comment xml:lang="oc">fichièr de traduccion XLIFF</comment>
- <comment xml:lang="pl">Plik tłumaczenia XLIFF</comment>
- <comment xml:lang="pt">ficheiro de tradução XLIFF</comment>
- <comment xml:lang="pt-BR">Arquivo de tradução XLIFF</comment>
- <comment xml:lang="ro">Fișier de traducere XLIFF</comment>
- <comment xml:lang="ru">Файл перевода XLIFF</comment>
- <comment xml:lang="sk">Súbor prekladu XLIFF</comment>
- <comment xml:lang="sl">Datoteka prevoda XLIFF</comment>
- <comment xml:lang="sq">File përkthimesh XLIFF</comment>
- <comment xml:lang="sr">ИксЛИФФ датотека превода</comment>
- <comment xml:lang="sv">XLIFF-översättningsfil</comment>
- <comment xml:lang="tr">XLIFF çeviri dosyası</comment>
- <comment xml:lang="uk">файл перекладу XLIFF</comment>
+ <comment xml:lang="zh_TW">XLIFF 翻譯檔</comment>
+ <comment xml:lang="zh_CN">XLIFF 翻译文件</comment>
<comment xml:lang="vi">Tập tin dịch XLIFF</comment>
- <comment xml:lang="zh-CN">XLIFF 翻译文件</comment>
- <comment xml:lang="zh-TW">XLIFF 翻譯檔</comment>
+ <comment xml:lang="uk">файл перекладу XLIFF</comment>
+ <comment xml:lang="tr">XLIFF çeviri dosyası</comment>
+ <comment xml:lang="sv">XLIFF-översättningsfil</comment>
+ <comment xml:lang="sr">ИксЛИФФ датотека превода</comment>
+ <comment xml:lang="sq">kartelë përkthimesh XLIFF</comment>
+ <comment xml:lang="sl">Datoteka prevoda XLIFF</comment>
+ <comment xml:lang="si">XLIFF පරිවර්තන ගොනුව</comment>
+ <comment xml:lang="sk">Súbor prekladu XLIFF</comment>
+ <comment xml:lang="ru">Файл перевода XLIFF</comment>
+ <comment xml:lang="ro">Fișier de traducere XLIFF</comment>
+ <comment xml:lang="pt_BR">Arquivo de tradução XLIFF</comment>
+ <comment xml:lang="pt">ficheiro de tradução XLIFF</comment>
+ <comment xml:lang="pl">Plik tłumaczenia XLIFF</comment>
+ <comment xml:lang="oc">fichièr de traduccion XLIFF</comment>
+ <comment xml:lang="nn">XLIFF-omsetjingsfil</comment>
+ <comment xml:lang="nl">XLIFF-vertalingsbestand</comment>
+ <comment xml:lang="nb">XLIFF-oversettelsesfil</comment>
+ <comment xml:lang="lv">XLIFF tulkošanas datne</comment>
+ <comment xml:lang="lt">XLIFF vertimo failas</comment>
+ <comment xml:lang="ko">XLIFF 번역 파일</comment>
+ <comment xml:lang="kk">XLIFF аударма файлы</comment>
+ <comment xml:lang="ka">XLIFF თარგმნის ფაილი</comment>
+ <comment xml:lang="ja">XLIFF 翻訳ファイル</comment>
+ <comment xml:lang="it">File traduzione XLIFF</comment>
+ <comment xml:lang="is">XLIFF-þýðingaskrá</comment>
+ <comment xml:lang="id">Berkas terjemahan XLIFF</comment>
+ <comment xml:lang="ia">File de traduction XLIFF</comment>
+ <comment xml:lang="hu">XLIFF fordítási fájl</comment>
+ <comment xml:lang="hr">XLIFF datoteka prijevoda</comment>
+ <comment xml:lang="he">קובץ תרגום CLIFF</comment>
+ <comment xml:lang="gl">ficheiro de tradución XLIFF</comment>
+ <comment xml:lang="ga">comhad aistriúcháin XLIFF</comment>
+ <comment xml:lang="fur">file di traduzion XLIFF</comment>
+ <comment xml:lang="fr">fichier de traduction XLIFF</comment>
+ <comment xml:lang="fo">XLIFF týðingarfíla</comment>
+ <comment xml:lang="fi">XLIFF-käännöstiedosto</comment>
+ <comment xml:lang="eu">XLIFF itzulpen-fitxategia</comment>
+ <comment xml:lang="es">archivo de traducción XLIFF</comment>
+ <comment xml:lang="en_GB">XLIFF translation file</comment>
+ <comment xml:lang="el">Αρχείο μετάφρασης XLIFF</comment>
+ <comment xml:lang="de">XLIFF-Übersetzungsdatei</comment>
+ <comment xml:lang="da">XLIFF-oversættelsesfil</comment>
+ <comment xml:lang="cs">soubor překladu XLIFF</comment>
+ <comment xml:lang="ca">fitxer de traducció XLIFF</comment>
+ <comment xml:lang="bg">Превод — XLIFF</comment>
+ <comment xml:lang="be@latin">Fajł pierakładu XLIFF</comment>
+ <comment xml:lang="be">файл перакладу XLIFF</comment>
+ <comment xml:lang="ast">Ficheru de traducciones XLIFF</comment>
+ <comment xml:lang="ar">ملف ترجمة XLIFF</comment>
+ <comment xml:lang="af">XLIFF-vertaallêer</comment>
<acronym>XLIFF</acronym>
<expanded-acronym>XML Localization Interchange File Format</expanded-acronym>
<sub-class-of type="application/xml"/>
@@ -2627,53 +2876,93 @@ command to generate the output files.
<root-XML namespaceURI="urn:oasis:names:tc:xliff:document:1.1" localName="xliff"/>
<alias type="application/x-xliff"/>
</mime-type>
- <mime-type type="application/x-yaml">
+ <mime-type type="application/toml">
+ <comment>TOML document</comment>
+ <comment xml:lang="zh_CN">TOML 文档</comment>
+ <comment xml:lang="uk">документ TOML</comment>
+ <comment xml:lang="tr">TOML belgesi</comment>
+ <comment xml:lang="sv">TOML-dokument</comment>
+ <comment xml:lang="sq">dokument TOML</comment>
+ <comment xml:lang="sl">Dokument TOML</comment>
+ <comment xml:lang="si">TOML ලේඛනය</comment>
+ <comment xml:lang="ru">Документ TOML</comment>
+ <comment xml:lang="pt_BR">Documento TOML</comment>
+ <comment xml:lang="pl">Dokument TOML</comment>
+ <comment xml:lang="oc">document TOML</comment>
+ <comment xml:lang="nl">TOML-document</comment>
+ <comment xml:lang="ko">TOML 문서</comment>
+ <comment xml:lang="kk">TOML құжаты</comment>
+ <comment xml:lang="ka">TOML დოკუმენტი</comment>
+ <comment xml:lang="ja">TOML ドキュメント</comment>
+ <comment xml:lang="it">Documento TOML</comment>
+ <comment xml:lang="hr">TOML dokument</comment>
+ <comment xml:lang="he">מסמך TOML</comment>
+ <comment xml:lang="gl">Documento TOML</comment>
+ <comment xml:lang="fi">TOML-asiakirja</comment>
+ <comment xml:lang="eu">TOML dokumentua</comment>
+ <comment xml:lang="es">documento TOML</comment>
+ <comment xml:lang="en_GB">TOML document</comment>
+ <comment xml:lang="de">TOML-Dokument</comment>
+ <comment xml:lang="be">дакумент TOML</comment>
+ <comment xml:lang="ar">مستند TOML</comment>
+ <acronym>TOML</acronym>
+ <expanded-acronym>Tom's Obvious Minimal Language</expanded-acronym>
+ <sub-class-of type="text/plain"/>
+ <generic-icon name="text-x-generic"/>
+ <glob pattern="*.toml"/>
+ </mime-type>
+ <mime-type type="application/yaml">
<comment>YAML document</comment>
- <comment xml:lang="af">YAML-dokument</comment>
- <comment xml:lang="ar">مستند YAML</comment>
- <comment xml:lang="ast">Documentu YAML</comment>
- <comment xml:lang="bg">Документ — YAML</comment>
- <comment xml:lang="ca">document YAML</comment>
- <comment xml:lang="cs">dokument YAML</comment>
- <comment xml:lang="da">YAML-dokument</comment>
- <comment xml:lang="de">YAML-Dokument</comment>
- <comment xml:lang="el">Έγγραφο YAML</comment>
- <comment xml:lang="en-GB">YAML document</comment>
- <comment xml:lang="eo">YAML-dokumento</comment>
- <comment xml:lang="es">documento YAML</comment>
- <comment xml:lang="eu">YAML dokumentua</comment>
- <comment xml:lang="fi">YAML-asiakirja</comment>
- <comment xml:lang="fo">YAML skjal</comment>
- <comment xml:lang="fr">document YAML</comment>
- <comment xml:lang="fur">document YAML</comment>
- <comment xml:lang="ga">cáipéis YAML</comment>
- <comment xml:lang="gl">documento YAML</comment>
- <comment xml:lang="he">מסמך YAML</comment>
- <comment xml:lang="hr">YAML dokument</comment>
- <comment xml:lang="hu">YAML-dokumentum</comment>
- <comment xml:lang="ia">Documento YAML</comment>
- <comment xml:lang="id">Dokumen YAML</comment>
- <comment xml:lang="it">Documento YAML</comment>
- <comment xml:lang="ja">YAML ドキュメント</comment>
- <comment xml:lang="kk">YAML құжаты</comment>
- <comment xml:lang="ko">YAML 문서</comment>
- <comment xml:lang="lt">YAML dokumentas</comment>
- <comment xml:lang="lv">YAML dokuments</comment>
- <comment xml:lang="nl">YAML document</comment>
- <comment xml:lang="oc">document YAML</comment>
- <comment xml:lang="pl">Dokument YAML</comment>
- <comment xml:lang="pt">documento YAML</comment>
- <comment xml:lang="pt-BR">Documento YAML</comment>
- <comment xml:lang="ro">Document YAML</comment>
- <comment xml:lang="ru">Документ YAML</comment>
- <comment xml:lang="sk">Dokument YAML</comment>
- <comment xml:lang="sl">Dokument YAML</comment>
- <comment xml:lang="sr">ЈАМЛ документ</comment>
- <comment xml:lang="sv">YAML-dokument</comment>
- <comment xml:lang="tr">YAML belgesi</comment>
+ <comment xml:lang="zh_TW">YAML 文件</comment>
+ <comment xml:lang="zh_CN">YAML 文档</comment>
<comment xml:lang="uk">документ YAML</comment>
- <comment xml:lang="zh-CN">YAML 文档</comment>
- <comment xml:lang="zh-TW">YAML 文件</comment>
+ <comment xml:lang="tr">YAML belgesi</comment>
+ <comment xml:lang="sv">YAML-dokument</comment>
+ <comment xml:lang="sr">ЈАМЛ документ</comment>
+ <comment xml:lang="sq">dokument YAML</comment>
+ <comment xml:lang="sl">Dokument YAML</comment>
+ <comment xml:lang="si">YAML ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument YAML</comment>
+ <comment xml:lang="ru">Документ YAML</comment>
+ <comment xml:lang="ro">Document YAML</comment>
+ <comment xml:lang="pt_BR">Documento YAML</comment>
+ <comment xml:lang="pt">documento YAML</comment>
+ <comment xml:lang="pl">Dokument YAML</comment>
+ <comment xml:lang="oc">document YAML</comment>
+ <comment xml:lang="nl">YAML-document</comment>
+ <comment xml:lang="lv">YAML dokuments</comment>
+ <comment xml:lang="lt">YAML dokumentas</comment>
+ <comment xml:lang="ko">YAML 문서</comment>
+ <comment xml:lang="kk">YAML құжаты</comment>
+ <comment xml:lang="ka">YAML დოკუმენტი</comment>
+ <comment xml:lang="ja">YAML ドキュメント</comment>
+ <comment xml:lang="it">Documento YAML</comment>
+ <comment xml:lang="is">YAML skjal</comment>
+ <comment xml:lang="id">Dokumen YAML</comment>
+ <comment xml:lang="ia">Documento YAML</comment>
+ <comment xml:lang="hu">YAML-dokumentum</comment>
+ <comment xml:lang="hr">YAML dokument</comment>
+ <comment xml:lang="he">מסמך YAML</comment>
+ <comment xml:lang="gl">documento YAML</comment>
+ <comment xml:lang="ga">cáipéis YAML</comment>
+ <comment xml:lang="fur">document YAML</comment>
+ <comment xml:lang="fr">document YAML</comment>
+ <comment xml:lang="fo">YAML skjal</comment>
+ <comment xml:lang="fi">YAML-asiakirja</comment>
+ <comment xml:lang="eu">YAML dokumentua</comment>
+ <comment xml:lang="es">documento YAML</comment>
+ <comment xml:lang="eo">YAML-dokumento</comment>
+ <comment xml:lang="en_GB">YAML document</comment>
+ <comment xml:lang="el">Έγγραφο YAML</comment>
+ <comment xml:lang="de">YAML-Dokument</comment>
+ <comment xml:lang="da">YAML-dokument</comment>
+ <comment xml:lang="cs">dokument YAML</comment>
+ <comment xml:lang="ca">document YAML</comment>
+ <comment xml:lang="bg">Документ — YAML</comment>
+ <comment xml:lang="be">дакумент YAML</comment>
+ <comment xml:lang="ast">Documentu YAML</comment>
+ <comment xml:lang="ar">مستند YAML</comment>
+ <comment xml:lang="af">YAML-dokument</comment>
<acronym>YAML</acronym>
<expanded-acronym>YAML Ain't Markup Language</expanded-acronym>
<sub-class-of type="text/plain"/>
@@ -2683,65 +2972,69 @@ command to generate the output files.
</magic>
<glob pattern="*.yaml"/>
<glob pattern="*.yml"/>
+ <alias type="application/x-yaml"/>
<alias type="text/yaml"/>
<alias type="text/x-yaml"/>
</mime-type>
<mime-type type="application/vnd.corel-draw">
<comment>Corel Draw drawing</comment>
- <comment xml:lang="af">Corel Draw-tekening</comment>
- <comment xml:lang="ar">تصميم Corel Draw</comment>
- <comment xml:lang="ast">Dibuxu de Corel Draw</comment>
- <comment xml:lang="az">Corel Draw çəkimi</comment>
- <comment xml:lang="be-Latn">Rysunak Corel Draw</comment>
- <comment xml:lang="bg">Чертеж — Corel Draw</comment>
- <comment xml:lang="ca">dibuix de Corel Draw</comment>
- <comment xml:lang="cs">kresba Corel Draw</comment>
- <comment xml:lang="cy">Darlun Corel Draw</comment>
- <comment xml:lang="da">Corel Draw-tegning</comment>
- <comment xml:lang="de">Corel-Draw-Zeichnung</comment>
- <comment xml:lang="el">Σχέδιο Corel Draw </comment>
- <comment xml:lang="en-GB">Corel Draw drawing</comment>
- <comment xml:lang="eo">grafikaĵo de Corel Draw</comment>
- <comment xml:lang="es">dibujo de Corel Draw</comment>
- <comment xml:lang="eu">Corel Draw-eko marrazkia</comment>
- <comment xml:lang="fi">Corel Draw -piirros</comment>
- <comment xml:lang="fo">Corel Draw tekning</comment>
- <comment xml:lang="fr">dessin Corel Draw</comment>
- <comment xml:lang="fur">dissen Corel Draw</comment>
- <comment xml:lang="ga">líníocht Corel Draw</comment>
- <comment xml:lang="gl">debuxo de Corel Draw</comment>
- <comment xml:lang="he">ציור של Corel Draw</comment>
- <comment xml:lang="hr">Corel Draw crtež</comment>
- <comment xml:lang="hu">Corel Draw-rajz</comment>
- <comment xml:lang="ia">Designo Corel Draw</comment>
- <comment xml:lang="id">Gambar Corel Draw</comment>
- <comment xml:lang="it">Disegno Corel Draw</comment>
- <comment xml:lang="ja">Corel Draw ドロー</comment>
- <comment xml:lang="ka">Corel Draw-ის ნახაზი</comment>
- <comment xml:lang="kk">Corel Draw суреті</comment>
- <comment xml:lang="ko">Corel Draw 드로잉</comment>
- <comment xml:lang="lt">Corel Draw piešinys</comment>
- <comment xml:lang="lv">Corel Draw zīmējums</comment>
- <comment xml:lang="ms">Lukisan Corel Draw</comment>
- <comment xml:lang="nb">Corel Draw-tegning</comment>
- <comment xml:lang="nl">Corel Draw-tekening</comment>
- <comment xml:lang="nn">Corel Draw-teikning</comment>
- <comment xml:lang="oc">dessenh Corel Draw</comment>
- <comment xml:lang="pl">Rysunek Corel Draw</comment>
- <comment xml:lang="pt">desenho Corel Drawdesenho Corel Draw</comment>
- <comment xml:lang="pt-BR">Desenho do Corel Draw</comment>
- <comment xml:lang="ro">Desen Corel Draw</comment>
- <comment xml:lang="ru">Рисунок Corel Draw</comment>
- <comment xml:lang="sk">Kresba Corel Draw</comment>
- <comment xml:lang="sl">Datoteka risbe Corel Draw</comment>
- <comment xml:lang="sq">Vizatim Corel Draw</comment>
- <comment xml:lang="sr">Корелов цртеж</comment>
- <comment xml:lang="sv">Corel Draw-teckning</comment>
- <comment xml:lang="tr">Corel Draw çizimi</comment>
- <comment xml:lang="uk">малюнок Corel Draw</comment>
+ <comment xml:lang="zh_TW">Corel Draw 繪圖</comment>
+ <comment xml:lang="zh_CN">Corel Draw 绘图</comment>
<comment xml:lang="vi">Bản vẽ Corel Draw</comment>
- <comment xml:lang="zh-CN">Corel Draw 绘图</comment>
- <comment xml:lang="zh-TW">Corel Draw 繪圖</comment>
+ <comment xml:lang="uk">малюнок Corel Draw</comment>
+ <comment xml:lang="tr">Corel Draw çizimi</comment>
+ <comment xml:lang="sv">Corel Draw-teckning</comment>
+ <comment xml:lang="sr">Корелов цртеж</comment>
+ <comment xml:lang="sq">vizatim Corel Draw</comment>
+ <comment xml:lang="sl">Datoteka risbe Corel Draw</comment>
+ <comment xml:lang="si">Corel Draw ඇඳීම</comment>
+ <comment xml:lang="sk">Kresba Corel Draw</comment>
+ <comment xml:lang="ru">Рисунок Corel Draw</comment>
+ <comment xml:lang="ro">Desen Corel Draw</comment>
+ <comment xml:lang="pt_BR">Desenho do Corel Draw</comment>
+ <comment xml:lang="pt">desenho Corel Drawdesenho Corel Draw</comment>
+ <comment xml:lang="pl">Rysunek Corel Draw</comment>
+ <comment xml:lang="oc">dessenh Corel Draw</comment>
+ <comment xml:lang="nn">Corel Draw-teikning</comment>
+ <comment xml:lang="nl">Corel Draw-tekening</comment>
+ <comment xml:lang="nb">Corel Draw-tegning</comment>
+ <comment xml:lang="ms">Lukisan Corel Draw</comment>
+ <comment xml:lang="lv">Corel Draw zīmējums</comment>
+ <comment xml:lang="lt">Corel Draw piešinys</comment>
+ <comment xml:lang="ko">Corel Draw 드로잉</comment>
+ <comment xml:lang="kk">Corel Draw суреті</comment>
+ <comment xml:lang="ka">Corel Draw-ის ნახაზი</comment>
+ <comment xml:lang="ja">Corel Draw ドロー</comment>
+ <comment xml:lang="it">Disegno Corel Draw</comment>
+ <comment xml:lang="is">Corel Draw teikning</comment>
+ <comment xml:lang="id">Gambar Corel Draw</comment>
+ <comment xml:lang="ia">Designo Corel Draw</comment>
+ <comment xml:lang="hu">Corel Draw-rajz</comment>
+ <comment xml:lang="hr">Corel Draw crtež</comment>
+ <comment xml:lang="he">ציור Corel Draw</comment>
+ <comment xml:lang="gl">debuxo de Corel Draw</comment>
+ <comment xml:lang="ga">líníocht Corel Draw</comment>
+ <comment xml:lang="fur">dissen Corel Draw</comment>
+ <comment xml:lang="fr">dessin Corel Draw</comment>
+ <comment xml:lang="fo">Corel Draw tekning</comment>
+ <comment xml:lang="fi">Corel Draw -piirros</comment>
+ <comment xml:lang="eu">Corel Draw-eko marrazkia</comment>
+ <comment xml:lang="es">dibujo de Corel Draw</comment>
+ <comment xml:lang="eo">grafikaĵo de Corel Draw</comment>
+ <comment xml:lang="en_GB">Corel Draw drawing</comment>
+ <comment xml:lang="el">Σχέδιο Corel Draw </comment>
+ <comment xml:lang="de">Corel-Draw-Zeichnung</comment>
+ <comment xml:lang="da">Corel Draw-tegning</comment>
+ <comment xml:lang="cy">Darlun Corel Draw</comment>
+ <comment xml:lang="cs">kresba Corel Draw</comment>
+ <comment xml:lang="ca">dibuix de Corel Draw</comment>
+ <comment xml:lang="bg">Чертеж — Corel Draw</comment>
+ <comment xml:lang="be@latin">Rysunak Corel Draw</comment>
+ <comment xml:lang="be">рысунак Corel Draw</comment>
+ <comment xml:lang="az">Corel Draw çəkimi</comment>
+ <comment xml:lang="ast">Dibuxu de Corel Draw</comment>
+ <comment xml:lang="ar">تصميم Corel Draw</comment>
+ <comment xml:lang="af">Corel Draw-tekening</comment>
<generic-icon name="image-x-generic"/>
<magic priority="80">
<match type="string" value="CDRXvrsn" mask="0xffffff00ffffffff" offset="8"/>
@@ -2757,56 +3050,60 @@ command to generate the output files.
</mime-type>
<mime-type type="application/vnd.hp-hpgl">
<comment>HPGL file</comment>
- <comment xml:lang="af">HPGL-lêer</comment>
- <comment xml:lang="ar">ملف HPGL</comment>
- <comment xml:lang="ast">Ficheru HPGL</comment>
- <comment xml:lang="be-Latn">Fajł HPGL</comment>
- <comment xml:lang="bg">Файл — HPGL</comment>
- <comment xml:lang="ca">fitxer HPGL</comment>
- <comment xml:lang="cs">soubor HPGL</comment>
- <comment xml:lang="da">HPGL-fil</comment>
- <comment xml:lang="de">HPGL-Datei</comment>
- <comment xml:lang="el">Αρχείο HPGL</comment>
- <comment xml:lang="en-GB">HPGL file</comment>
- <comment xml:lang="eo">HPGL-dosiero</comment>
- <comment xml:lang="es">archivo HPGL</comment>
- <comment xml:lang="eu">HPGL fitxategia</comment>
- <comment xml:lang="fi">HPGL-tiedosto</comment>
- <comment xml:lang="fo">HPGL fíla</comment>
- <comment xml:lang="fr">fichier HPGL</comment>
- <comment xml:lang="fur">file HPGL</comment>
- <comment xml:lang="ga">comhad HPGL</comment>
- <comment xml:lang="gl">ficheiro HPGL</comment>
- <comment xml:lang="he">קובץ HGPL</comment>
- <comment xml:lang="hr">HPGL datoteka</comment>
- <comment xml:lang="hu">HPGL fájl</comment>
- <comment xml:lang="ia">File HPGL</comment>
- <comment xml:lang="id">Berkas HPGL</comment>
- <comment xml:lang="it">File HPGL</comment>
- <comment xml:lang="ja">HPGL ファイル</comment>
- <comment xml:lang="kk">HPGL файлы</comment>
- <comment xml:lang="ko">HPGL 파일</comment>
- <comment xml:lang="lt">HPGL failas</comment>
- <comment xml:lang="lv">HPGL datne</comment>
- <comment xml:lang="nb">HPGL-fil</comment>
- <comment xml:lang="nl">HPGL-bestand</comment>
- <comment xml:lang="nn">HPGL-fil</comment>
- <comment xml:lang="oc">fichièr HPGL</comment>
- <comment xml:lang="pl">Plik HPGL</comment>
- <comment xml:lang="pt">ficheiro HPGL</comment>
- <comment xml:lang="pt-BR">Arquivo HPGL</comment>
- <comment xml:lang="ro">Fișier HPGL</comment>
- <comment xml:lang="ru">Файл HPGL</comment>
- <comment xml:lang="sk">Súbor HPGL</comment>
- <comment xml:lang="sl">Datoteka HPGL</comment>
- <comment xml:lang="sq">File HPGL</comment>
- <comment xml:lang="sr">ХПГЛ датотека</comment>
- <comment xml:lang="sv">HPGL-fil</comment>
- <comment xml:lang="tr">HPGL dosyası</comment>
- <comment xml:lang="uk">файл HPGL</comment>
+ <comment xml:lang="zh_TW">HPGL 檔案</comment>
+ <comment xml:lang="zh_CN">HPGL 文件</comment>
<comment xml:lang="vi">Tập tin HPGL</comment>
- <comment xml:lang="zh-CN">HPGL 文件</comment>
- <comment xml:lang="zh-TW">HPGL 檔案</comment>
+ <comment xml:lang="uk">файл HPGL</comment>
+ <comment xml:lang="tr">HPGL dosyası</comment>
+ <comment xml:lang="sv">HPGL-fil</comment>
+ <comment xml:lang="sr">ХПГЛ датотека</comment>
+ <comment xml:lang="sq">kartelë HPGL</comment>
+ <comment xml:lang="sl">Datoteka HPGL</comment>
+ <comment xml:lang="si">HPGL ගොනුව</comment>
+ <comment xml:lang="sk">Súbor HPGL</comment>
+ <comment xml:lang="ru">Файл HPGL</comment>
+ <comment xml:lang="ro">Fișier HPGL</comment>
+ <comment xml:lang="pt_BR">Arquivo HPGL</comment>
+ <comment xml:lang="pt">ficheiro HPGL</comment>
+ <comment xml:lang="pl">Plik HPGL</comment>
+ <comment xml:lang="oc">fichièr HPGL</comment>
+ <comment xml:lang="nn">HPGL-fil</comment>
+ <comment xml:lang="nl">HPGL-bestand</comment>
+ <comment xml:lang="nb">HPGL-fil</comment>
+ <comment xml:lang="lv">HPGL datne</comment>
+ <comment xml:lang="lt">HPGL failas</comment>
+ <comment xml:lang="ko">HPGL 파일</comment>
+ <comment xml:lang="kk">HPGL файлы</comment>
+ <comment xml:lang="ka">HPGL ფაილი</comment>
+ <comment xml:lang="ja">HPGL ファイル</comment>
+ <comment xml:lang="it">File HPGL</comment>
+ <comment xml:lang="is">HPGL skrá</comment>
+ <comment xml:lang="id">Berkas HPGL</comment>
+ <comment xml:lang="ia">File HPGL</comment>
+ <comment xml:lang="hu">HPGL fájl</comment>
+ <comment xml:lang="hr">HPGL datoteka</comment>
+ <comment xml:lang="he">קובץ HGPL</comment>
+ <comment xml:lang="gl">ficheiro HPGL</comment>
+ <comment xml:lang="ga">comhad HPGL</comment>
+ <comment xml:lang="fur">file HPGL</comment>
+ <comment xml:lang="fr">fichier HPGL</comment>
+ <comment xml:lang="fo">HPGL fíla</comment>
+ <comment xml:lang="fi">HPGL-tiedosto</comment>
+ <comment xml:lang="eu">HPGL fitxategia</comment>
+ <comment xml:lang="es">archivo HPGL</comment>
+ <comment xml:lang="eo">HPGL-dosiero</comment>
+ <comment xml:lang="en_GB">HPGL file</comment>
+ <comment xml:lang="el">Αρχείο HPGL</comment>
+ <comment xml:lang="de">HPGL-Datei</comment>
+ <comment xml:lang="da">HPGL-fil</comment>
+ <comment xml:lang="cs">soubor HPGL</comment>
+ <comment xml:lang="ca">fitxer HPGL</comment>
+ <comment xml:lang="bg">Файл — HPGL</comment>
+ <comment xml:lang="be@latin">Fajł HPGL</comment>
+ <comment xml:lang="be">файл HPGL</comment>
+ <comment xml:lang="ast">Ficheru HPGL</comment>
+ <comment xml:lang="ar">ملف HPGL</comment>
+ <comment xml:lang="af">HPGL-lêer</comment>
<acronym>HPGL</acronym>
<expanded-acronym>HP Graphics Language</expanded-acronym>
<generic-icon name="image-x-generic"/>
@@ -2814,118 +3111,140 @@ command to generate the output files.
</mime-type>
<mime-type type="application/vnd.hp-pcl">
<comment>PCL file</comment>
- <comment xml:lang="af">PCL-lêer</comment>
- <comment xml:lang="ar">ملف PCL</comment>
- <comment xml:lang="ast">FIcheru PCL</comment>
- <comment xml:lang="be-Latn">Fajł PCL</comment>
- <comment xml:lang="bg">Файл — PCL</comment>
- <comment xml:lang="ca">fitxer PCL</comment>
- <comment xml:lang="cs">soubor PCL</comment>
- <comment xml:lang="da">PCL-fil</comment>
- <comment xml:lang="de">PCL-Datei</comment>
- <comment xml:lang="el">Αρχείο PCL</comment>
- <comment xml:lang="en-GB">PCL file</comment>
- <comment xml:lang="eo">PCL-dosiero</comment>
- <comment xml:lang="es">archivo PCL</comment>
- <comment xml:lang="eu">PCL fitxategia</comment>
- <comment xml:lang="fi">PCL-tiedosto</comment>
- <comment xml:lang="fo">PCL fíla</comment>
- <comment xml:lang="fr">fichier PCL</comment>
- <comment xml:lang="fur">file PCL</comment>
- <comment xml:lang="ga">comhad PCL</comment>
- <comment xml:lang="gl">ficheiro PCL</comment>
- <comment xml:lang="he">קובץ PCL</comment>
- <comment xml:lang="hr">PCL datoteka</comment>
- <comment xml:lang="hu">PCL fájl</comment>
- <comment xml:lang="ia">File PCL</comment>
- <comment xml:lang="id">Berkas PCL</comment>
- <comment xml:lang="it">File PCL</comment>
- <comment xml:lang="ja">PCL ファイル</comment>
- <comment xml:lang="kk">PCL файлы</comment>
- <comment xml:lang="ko">PCL 파일</comment>
- <comment xml:lang="lt">PCL failas</comment>
- <comment xml:lang="lv">PCL datne</comment>
- <comment xml:lang="nb">PCL-fil</comment>
- <comment xml:lang="nl">PCL-bestand</comment>
- <comment xml:lang="nn">PCL-fil</comment>
- <comment xml:lang="oc">fichièr PCL</comment>
- <comment xml:lang="pl">Plik PCL</comment>
- <comment xml:lang="pt">ficheiro PCL</comment>
- <comment xml:lang="pt-BR">Arquivo PCL</comment>
- <comment xml:lang="ro">Fișier PCL</comment>
- <comment xml:lang="ru">Файл PCL</comment>
- <comment xml:lang="sk">Súbor PCL</comment>
- <comment xml:lang="sl">Datoteka PCL</comment>
- <comment xml:lang="sq">File PCL</comment>
- <comment xml:lang="sr">ПЦЛ датотека</comment>
- <comment xml:lang="sv">PCL-fil</comment>
- <comment xml:lang="tr">PCL dosyası</comment>
- <comment xml:lang="uk">файл PCL</comment>
+ <comment xml:lang="zh_TW">PCL 檔</comment>
+ <comment xml:lang="zh_CN">PCL 文件</comment>
<comment xml:lang="vi">Tập tin PCL</comment>
- <comment xml:lang="zh-CN">PCL 文件</comment>
- <comment xml:lang="zh-TW">PCL 檔</comment>
+ <comment xml:lang="uk">файл PCL</comment>
+ <comment xml:lang="tr">PCL dosyası</comment>
+ <comment xml:lang="sv">PCL-fil</comment>
+ <comment xml:lang="sr">ПЦЛ датотека</comment>
+ <comment xml:lang="sq">kartelë PCL</comment>
+ <comment xml:lang="sl">Datoteka PCL</comment>
+ <comment xml:lang="si">PCL ගොනුව</comment>
+ <comment xml:lang="sk">Súbor PCL</comment>
+ <comment xml:lang="ru">Файл PCL</comment>
+ <comment xml:lang="ro">Fișier PCL</comment>
+ <comment xml:lang="pt_BR">Arquivo PCL</comment>
+ <comment xml:lang="pt">ficheiro PCL</comment>
+ <comment xml:lang="pl">Plik PCL</comment>
+ <comment xml:lang="oc">fichièr PCL</comment>
+ <comment xml:lang="nn">PCL-fil</comment>
+ <comment xml:lang="nl">PCL-bestand</comment>
+ <comment xml:lang="nb">PCL-fil</comment>
+ <comment xml:lang="lv">PCL datne</comment>
+ <comment xml:lang="lt">PCL failas</comment>
+ <comment xml:lang="ko">PCL 파일</comment>
+ <comment xml:lang="kk">PCL файлы</comment>
+ <comment xml:lang="ka">PCL ფაილი</comment>
+ <comment xml:lang="ja">PCL ファイル</comment>
+ <comment xml:lang="it">File PCL</comment>
+ <comment xml:lang="is">PCL skrá</comment>
+ <comment xml:lang="id">Berkas PCL</comment>
+ <comment xml:lang="ia">File PCL</comment>
+ <comment xml:lang="hu">PCL fájl</comment>
+ <comment xml:lang="hr">PCL datoteka</comment>
+ <comment xml:lang="he">קובץ PCL</comment>
+ <comment xml:lang="gl">ficheiro PCL</comment>
+ <comment xml:lang="ga">comhad PCL</comment>
+ <comment xml:lang="fur">file PCL</comment>
+ <comment xml:lang="fr">fichier PCL</comment>
+ <comment xml:lang="fo">PCL fíla</comment>
+ <comment xml:lang="fi">PCL-tiedosto</comment>
+ <comment xml:lang="eu">PCL fitxategia</comment>
+ <comment xml:lang="es">archivo PCL</comment>
+ <comment xml:lang="eo">PCL-dosiero</comment>
+ <comment xml:lang="en_GB">PCL file</comment>
+ <comment xml:lang="el">Αρχείο PCL</comment>
+ <comment xml:lang="de">PCL-Datei</comment>
+ <comment xml:lang="da">PCL-fil</comment>
+ <comment xml:lang="cs">soubor PCL</comment>
+ <comment xml:lang="ca">fitxer PCL</comment>
+ <comment xml:lang="bg">Файл — PCL</comment>
+ <comment xml:lang="be@latin">Fajł PCL</comment>
+ <comment xml:lang="be">файл PCL</comment>
+ <comment xml:lang="ast">FIcheru PCL</comment>
+ <comment xml:lang="ar">ملف PCL</comment>
+ <comment xml:lang="af">PCL-lêer</comment>
<acronym>PCL</acronym>
<expanded-acronym>HP Printer Control Language</expanded-acronym>
<generic-icon name="image-x-generic"/>
<glob pattern="*.pcl"/>
</mime-type>
+ <mime-type type="application/vnd.cups-ppd">
+ <comment>PostScript printer description</comment>
+ <comment xml:lang="uk">опис принтера PostScript</comment>
+ <comment xml:lang="sv">Postscript-skrivarbeskrivning</comment>
+ <comment xml:lang="ru">Описание принтера PostScript</comment>
+ <comment xml:lang="pt_BR">Descrição de impressora PostScript</comment>
+ <comment xml:lang="pl">Opis drukarki PostScript</comment>
+ <comment xml:lang="es">descripción de impresora PostScript</comment>
+ <comment xml:lang="de">PostScript-Druckerbeschreibung</comment>
+ <sub-class-of type="text/plain"/>
+ <magic>
+ <match type="string" value="*PPD-Adobe:" offset="0"/>
+ </magic>
+ <glob pattern="*.ppd"/>
+ </mime-type>
<mime-type type="application/vnd.lotus-1-2-3">
<comment>Lotus 1-2-3 spreadsheet</comment>
- <comment xml:lang="af">Lotus 1-2-3 sigblad</comment>
- <comment xml:lang="ar">جدول Lotus 1-2-3</comment>
- <comment xml:lang="ast">Fueya de cálculu de Lotus 1-2-3</comment>
- <comment xml:lang="az">Lotus 1-2-3 hesab cədvəli</comment>
- <comment xml:lang="be-Latn">Raźlikovy arkuš Lotus 1-2-3</comment>
- <comment xml:lang="bg">Таблица — Lotus 1-2-3</comment>
- <comment xml:lang="ca">full de càlcul de Lotus 1-2-3</comment>
- <comment xml:lang="cs">sešit Lotus 1-2-3</comment>
- <comment xml:lang="cy">Taenlen Lotus 1-2-3</comment>
- <comment xml:lang="da">Lotus 1-2-3-regneark</comment>
- <comment xml:lang="de">Lotus-1-2-3-Tabelle</comment>
- <comment xml:lang="el">Λογιστικό φύλλο Lotus 1-2-3</comment>
- <comment xml:lang="en-GB">Lotus 1-2-3 spreadsheet</comment>
- <comment xml:lang="eo">Kalkultabelo de Lotus 1-2-3</comment>
- <comment xml:lang="es">hoja de cálculo de Lotus 1-2-3</comment>
- <comment xml:lang="eu">Lotus 1-2-3 kalkulu-orria</comment>
- <comment xml:lang="fi">Lotus 1-2-3 -taulukko</comment>
- <comment xml:lang="fo">Lotus 1-2-3 rokniark</comment>
- <comment xml:lang="fr">feuille de calcul Lotus 1-2-3</comment>
- <comment xml:lang="fur">sfuei di calcul Lotus 1-2-3</comment>
- <comment xml:lang="ga">scarbhileog Lotus 1-2-3</comment>
- <comment xml:lang="gl">folla de cálculo de Lotus 1-2-3</comment>
- <comment xml:lang="he">גיליון נתונים של Lotus 1-2-3</comment>
- <comment xml:lang="hr">Lotus 1-2-3 proračunska tablica</comment>
- <comment xml:lang="hu">Lotus 1-2-3-munkafüzet</comment>
- <comment xml:lang="ia">Folio de calculo Lotus 1-2-3</comment>
- <comment xml:lang="id">Lembar sebar Lotus 1-2-3</comment>
- <comment xml:lang="it">Foglio di calcolo Lotus 1-2-3</comment>
- <comment xml:lang="ja">Lotus 1-2-3 スプレッドシート</comment>
- <comment xml:lang="kk">Lotus 1-2-3 электрондық кестесі</comment>
- <comment xml:lang="ko">Lotus 1-2-3 스프레드시트</comment>
- <comment xml:lang="lt">Lotus 1-2-3 skaičialentė</comment>
- <comment xml:lang="lv">Lotus 1-2-3 izklājlapa</comment>
- <comment xml:lang="ms">Hamparan Lotus 1-2-3</comment>
- <comment xml:lang="nb">Lotus 1-2-3 regneark</comment>
- <comment xml:lang="nl">Lotus 1-2-3-rekenblad</comment>
- <comment xml:lang="nn">Lotus 1-2-3 rekneark</comment>
- <comment xml:lang="oc">fuèlh de calcul Lotus 1-2-3</comment>
- <comment xml:lang="pl">Arkusz Lotus 1-2-3</comment>
- <comment xml:lang="pt">folha de cálculo Lotus 1-2-3</comment>
- <comment xml:lang="pt-BR">Planilha do Lotus 1-2-3</comment>
- <comment xml:lang="ro">Foaie de calcul Lotus 1-2-3</comment>
- <comment xml:lang="ru">Электронная таблица Lotus 1-2-3</comment>
- <comment xml:lang="sk">Zošit Lotus 1-2-3</comment>
- <comment xml:lang="sl">Preglednica Lotus 1-2-3</comment>
- <comment xml:lang="sq">Fletë llogaritjesh Lotus 1-2-3</comment>
- <comment xml:lang="sr">Лотусова 1-2-3 табела</comment>
- <comment xml:lang="sv">Lotus 1-2-3-kalkylblad</comment>
- <comment xml:lang="tr">Lotus 1-2-3 hesap çizelgesi</comment>
- <comment xml:lang="uk">ел. таблиця Lotus 1-2-3</comment>
+ <comment xml:lang="zh_TW">Lotus 1-2-3 試算表</comment>
+ <comment xml:lang="zh_CN">Lotus 1-2-3 电子表格</comment>
<comment xml:lang="vi">Bảng tính Lotus 1-2-3</comment>
- <comment xml:lang="zh-CN">Lotus 1-2-3 电子表格</comment>
- <comment xml:lang="zh-TW">Lotus 1-2-3 試算表</comment>
+ <comment xml:lang="uk">електронна таблиця Lotus 1-2-3</comment>
+ <comment xml:lang="tr">Lotus 1-2-3 hesap çizelgesi</comment>
+ <comment xml:lang="sv">Lotus 1-2-3-kalkylblad</comment>
+ <comment xml:lang="sr">Лотусова 1-2-3 табела</comment>
+ <comment xml:lang="sq">fletëllogaritje Lotus 1-2-3</comment>
+ <comment xml:lang="sl">Preglednica Lotus 1-2-3</comment>
+ <comment xml:lang="si">නෙළුම් 1-2-3 පැතුරුම්පත</comment>
+ <comment xml:lang="sk">Zošit Lotus 1-2-3</comment>
+ <comment xml:lang="ru">Электронная таблица Lotus 1-2-3</comment>
+ <comment xml:lang="ro">Foaie de calcul Lotus 1-2-3</comment>
+ <comment xml:lang="pt_BR">Planilha do Lotus 1-2-3</comment>
+ <comment xml:lang="pt">folha de cálculo Lotus 1-2-3</comment>
+ <comment xml:lang="pl">Arkusz Lotus 1-2-3</comment>
+ <comment xml:lang="oc">fuèlh de calcul Lotus 1-2-3</comment>
+ <comment xml:lang="nn">Lotus 1-2-3 rekneark</comment>
+ <comment xml:lang="nl">Lotus 1-2-3-rekenblad</comment>
+ <comment xml:lang="nb">Lotus 1-2-3 regneark</comment>
+ <comment xml:lang="ms">Hamparan Lotus 1-2-3</comment>
+ <comment xml:lang="lv">Lotus 1-2-3 izklājlapa</comment>
+ <comment xml:lang="lt">Lotus 1-2-3 skaičialentė</comment>
+ <comment xml:lang="ko">Lotus 1-2-3 스프레드시트</comment>
+ <comment xml:lang="kk">Lotus 1-2-3 электрондық кестесі</comment>
+ <comment xml:lang="ja">Lotus 1-2-3 スプレッドシート</comment>
+ <comment xml:lang="it">Foglio di calcolo Lotus 1-2-3</comment>
+ <comment xml:lang="is">Lotus 1-2-3 töflureikniskjal</comment>
+ <comment xml:lang="id">Lembar sebar Lotus 1-2-3</comment>
+ <comment xml:lang="ia">Folio de calculo Lotus 1-2-3</comment>
+ <comment xml:lang="hu">Lotus 1-2-3-munkafüzet</comment>
+ <comment xml:lang="hr">Lotus 1-2-3 proračunska tablica</comment>
+ <comment xml:lang="he">גיליון נתונים של Lotus 1-2-3</comment>
+ <comment xml:lang="gl">folla de cálculo de Lotus 1-2-3</comment>
+ <comment xml:lang="ga">scarbhileog Lotus 1-2-3</comment>
+ <comment xml:lang="fur">sfuei di calcul Lotus 1-2-3</comment>
+ <comment xml:lang="fr">feuille de calcul Lotus 1-2-3</comment>
+ <comment xml:lang="fo">Lotus 1-2-3 rokniark</comment>
+ <comment xml:lang="fi">Lotus 1-2-3 -taulukko</comment>
+ <comment xml:lang="eu">Lotus 1-2-3 kalkulu-orria</comment>
+ <comment xml:lang="es">hoja de cálculo de Lotus 1-2-3</comment>
+ <comment xml:lang="eo">Kalkultabelo de Lotus 1-2-3</comment>
+ <comment xml:lang="en_GB">Lotus 1-2-3 spreadsheet</comment>
+ <comment xml:lang="el">Λογιστικό φύλλο Lotus 1-2-3</comment>
+ <comment xml:lang="de">Lotus-1-2-3-Tabelle</comment>
+ <comment xml:lang="da">Lotus 1-2-3-regneark</comment>
+ <comment xml:lang="cy">Taenlen Lotus 1-2-3</comment>
+ <comment xml:lang="cs">sešit Lotus 1-2-3</comment>
+ <comment xml:lang="ca">full de càlcul de Lotus 1-2-3</comment>
+ <comment xml:lang="bg">Таблица — Lotus 1-2-3</comment>
+ <comment xml:lang="be@latin">Raźlikovy arkuš Lotus 1-2-3</comment>
+ <comment xml:lang="be">электронная табліца Lotus 1-2-3</comment>
+ <comment xml:lang="az">Lotus 1-2-3 hesab cədvəli</comment>
+ <comment xml:lang="ast">Fueya de cálculu de Lotus 1-2-3</comment>
+ <comment xml:lang="ar">جدول Lotus 1-2-3</comment>
+ <comment xml:lang="af">Lotus 1-2-3 sigblad</comment>
<generic-icon name="x-office-spreadsheet"/>
- <magic priority="50">
+ <magic>
<match type="string" value="\x00\x00\x02\x00\x06\x04\x06\x00\x08\x00\x00\x00\x00\x00" offset="0"/>
</magic>
<glob pattern="*.123"/>
@@ -2941,97 +3260,133 @@ command to generate the output files.
</mime-type>
<mime-type type="application/vnd.lotus-wordpro">
<comment>Lotus Word Pro document</comment>
- <comment xml:lang="bg">Документ — Lotus Word Pro</comment>
- <comment xml:lang="ca">document de Lotus Word Pro</comment>
- <comment xml:lang="da">Lotus Word Pro-dokument</comment>
- <comment xml:lang="de">Lotus-Word-Pro-Dokument</comment>
- <comment xml:lang="en-GB">Lotus Word Pro document</comment>
- <comment xml:lang="es">documento de Lotus Word Pro</comment>
- <comment xml:lang="eu">Lotus Word Pro dokumentua</comment>
- <comment xml:lang="fi">Lotus Word Pro -asiakirja</comment>
- <comment xml:lang="fr">document Lotus Word Pro</comment>
- <comment xml:lang="hr">Lotus Word Pro dokument</comment>
- <comment xml:lang="hu">Lotus Word Pro dokumentum</comment>
- <comment xml:lang="id">Dokumen Lotus Word Pro</comment>
- <comment xml:lang="it">Documento Lotus Word Pro</comment>
- <comment xml:lang="kk">Lotus Word Pro құжаты</comment>
- <comment xml:lang="ko">로투스 워드 프로 문서</comment>
- <comment xml:lang="pl">Dokument Lotus Word Pro</comment>
- <comment xml:lang="pt">documento Lotus Word Pro</comment>
- <comment xml:lang="pt-BR">Documento do Lotus Word Pro</comment>
- <comment xml:lang="ru">Документ Lotus Word Pro</comment>
- <comment xml:lang="sk">Dokument Lotus Word Pro</comment>
- <comment xml:lang="sl">Dokument Lotus Word Pro</comment>
- <comment xml:lang="sv">Lotus Word Pro-dokument</comment>
- <comment xml:lang="tr">Lotus Word Pro belgesi</comment>
+ <comment xml:lang="zh_TW">Lotus Word Pro 文件</comment>
+ <comment xml:lang="zh_CN">Lotus Word Pro 文档</comment>
<comment xml:lang="uk">документ Lotus Word Pro</comment>
- <comment xml:lang="zh-CN">Lotus Word Pro 文档</comment>
- <comment xml:lang="zh-TW">Lotus Word Pro 文件</comment>
+ <comment xml:lang="tr">Lotus Word Pro belgesi</comment>
+ <comment xml:lang="sv">Lotus Word Pro-dokument</comment>
+ <comment xml:lang="sq">dokument Lotus Word Pro</comment>
+ <comment xml:lang="sl">Dokument Lotus Word Pro</comment>
+ <comment xml:lang="si">Lotus Word Pro ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument Lotus Word Pro</comment>
+ <comment xml:lang="ru">Документ Lotus Word Pro</comment>
+ <comment xml:lang="pt_BR">Documento do Lotus Word Pro</comment>
+ <comment xml:lang="pt">documento Lotus Word Pro</comment>
+ <comment xml:lang="pl">Dokument Lotus Word Pro</comment>
+ <comment xml:lang="oc">document Lotus Word Pro</comment>
+ <comment xml:lang="nl">Lotus Word Pro-document</comment>
+ <comment xml:lang="ko">Lotus 워드 프로 문서</comment>
+ <comment xml:lang="kk">Lotus Word Pro құжаты</comment>
+ <comment xml:lang="ja">Lotus Word Pro ドキュメント</comment>
+ <comment xml:lang="it">Documento Lotus Word Pro</comment>
+ <comment xml:lang="is">Lotus Word Pro skjal</comment>
+ <comment xml:lang="id">Dokumen Lotus Word Pro</comment>
+ <comment xml:lang="hu">Lotus Word Pro dokumentum</comment>
+ <comment xml:lang="hr">Lotus Word Pro dokument</comment>
+ <comment xml:lang="he">מסמך Lotus Word Pro</comment>
+ <comment xml:lang="gl">Documento de Lotus Word Pro</comment>
+ <comment xml:lang="fr">document Lotus Word Pro</comment>
+ <comment xml:lang="fi">Lotus Word Pro -asiakirja</comment>
+ <comment xml:lang="eu">Lotus Word Pro dokumentua</comment>
+ <comment xml:lang="es">documento de Lotus Word Pro</comment>
+ <comment xml:lang="en_GB">Lotus Word Pro document</comment>
+ <comment xml:lang="de">Lotus-Word-Pro-Dokument</comment>
+ <comment xml:lang="da">Lotus Word Pro-dokument</comment>
+ <comment xml:lang="ca">document de Lotus Word Pro</comment>
+ <comment xml:lang="bg">Документ — Lotus Word Pro</comment>
+ <comment xml:lang="be">дакумент Lotus Word Pro</comment>
+ <comment xml:lang="ar">مستند لوتس ورد برو</comment>
<generic-icon name="x-office-document"/>
- <magic priority="50">
+ <magic>
<match type="string" value="WordPro" offset="0"/>
</magic>
<glob pattern="*.lwp"/>
</mime-type>
+ <mime-type type="application/x-lmdb">
+ <comment>LMDB database</comment>
+ <comment xml:lang="uk">база даних LMDB</comment>
+ <comment xml:lang="sv">LMDB-databas</comment>
+ <comment xml:lang="sq">bazë të dhënash LMDB</comment>
+ <comment xml:lang="ru">База данных LMDB</comment>
+ <comment xml:lang="pt_BR">Banco de dados LMDB</comment>
+ <comment xml:lang="pl">Baza danych LMDB</comment>
+ <comment xml:lang="it">Database LMDB</comment>
+ <comment xml:lang="gl">Base de datos LMDB</comment>
+ <comment xml:lang="eu">LMDB datu-basea</comment>
+ <comment xml:lang="es">base de datos LMDB</comment>
+ <comment xml:lang="de">LMDB-Datenbank</comment>
+ <comment xml:lang="be">база даных LMDB</comment>
+ <acronym>LMDB</acronym>
+ <expanded-acronym>Lightning Memory-Mapped Database</expanded-acronym>
+ <generic-icon name="x-office-document"/>
+ <magic>
+ <match offset="16" type="little32" value="0xBEEFC0DE"/>
+ </magic>
+ <glob pattern="*.mdb"/>
+ <glob pattern="*.lmdb"/>
+ </mime-type>
<mime-type type="application/vnd.ms-access">
<comment>JET database</comment>
- <comment xml:lang="af">JET-databasis</comment>
- <comment xml:lang="ar">قاعدة بيانات JET</comment>
- <comment xml:lang="ast">Base de datos JETº</comment>
- <comment xml:lang="be-Latn">Baza źviestak JET</comment>
- <comment xml:lang="bg">База от данни — JET</comment>
- <comment xml:lang="ca">base de dades JET</comment>
- <comment xml:lang="cs">databáze JET</comment>
- <comment xml:lang="da">JET-database</comment>
- <comment xml:lang="de">JET-Datenbank</comment>
- <comment xml:lang="el">Βάση δεδομένων JET</comment>
- <comment xml:lang="en-GB">JET database</comment>
- <comment xml:lang="eo">JET-datumbazo</comment>
- <comment xml:lang="es">base de datos JET</comment>
- <comment xml:lang="eu">JET datu-basea</comment>
- <comment xml:lang="fi">JET-tietokanta</comment>
- <comment xml:lang="fo">JET dátustovnur</comment>
- <comment xml:lang="fr">base de données JET</comment>
- <comment xml:lang="fur">base di dâts JET</comment>
- <comment xml:lang="ga">bunachar sonraí JET</comment>
- <comment xml:lang="gl">base de datos JET</comment>
- <comment xml:lang="he">מסד נתונים מסוג JET</comment>
- <comment xml:lang="hr">JET baza podataka</comment>
- <comment xml:lang="hu">JET adatbázis</comment>
- <comment xml:lang="ia">Base de datos JET</comment>
- <comment xml:lang="id">Basis data JET</comment>
- <comment xml:lang="it">Database JET</comment>
- <comment xml:lang="ja">JET データベース</comment>
- <comment xml:lang="kk">JET дерекқоры</comment>
- <comment xml:lang="ko">JET 데이터베이스</comment>
- <comment xml:lang="lt">JET duomenų bazė</comment>
- <comment xml:lang="lv">JET datubāze</comment>
- <comment xml:lang="nb">JET-database</comment>
- <comment xml:lang="nl">JET-gegevensbank</comment>
- <comment xml:lang="nn">JET-database</comment>
- <comment xml:lang="oc">banca de donadas JET</comment>
- <comment xml:lang="pl">Baza Danych JET</comment>
- <comment xml:lang="pt">base de dados JET</comment>
- <comment xml:lang="pt-BR">Banco de dados JET</comment>
- <comment xml:lang="ro">Bază de date JET</comment>
- <comment xml:lang="ru">База данных JET</comment>
- <comment xml:lang="sk">Databáza JET</comment>
- <comment xml:lang="sl">Podatkovna zbirka JET</comment>
- <comment xml:lang="sq">Bazë me të dhëna JET</comment>
- <comment xml:lang="sr">ЈЕТ база података</comment>
- <comment xml:lang="sv">JET-databas</comment>
- <comment xml:lang="tr">JET veri tabanı</comment>
- <comment xml:lang="uk">База даних JET</comment>
+ <comment xml:lang="zh_TW">JET 資料庫</comment>
+ <comment xml:lang="zh_CN">JET 数据库</comment>
<comment xml:lang="vi">Cơ sở dữ liệu JET</comment>
- <comment xml:lang="zh-CN">JET 数据库</comment>
- <comment xml:lang="zh-TW">JET 資料庫</comment>
+ <comment xml:lang="uk">База даних JET</comment>
+ <comment xml:lang="tr">JET veri tabanı</comment>
+ <comment xml:lang="sv">JET-databas</comment>
+ <comment xml:lang="sr">ЈЕТ база података</comment>
+ <comment xml:lang="sq">bazë të dhënash JET</comment>
+ <comment xml:lang="sl">Podatkovna zbirka JET</comment>
+ <comment xml:lang="si">JET දත්ත සමුදාය</comment>
+ <comment xml:lang="sk">Databáza JET</comment>
+ <comment xml:lang="ru">База данных JET</comment>
+ <comment xml:lang="ro">Bază de date JET</comment>
+ <comment xml:lang="pt_BR">Banco de dados JET</comment>
+ <comment xml:lang="pt">base de dados JET</comment>
+ <comment xml:lang="pl">Baza Danych JET</comment>
+ <comment xml:lang="oc">banca de donadas JET</comment>
+ <comment xml:lang="nn">JET-database</comment>
+ <comment xml:lang="nl">JET-gegevensbank</comment>
+ <comment xml:lang="nb">JET-database</comment>
+ <comment xml:lang="lv">JET datubāze</comment>
+ <comment xml:lang="lt">JET duomenų bazė</comment>
+ <comment xml:lang="ko">JET 데이터베이스</comment>
+ <comment xml:lang="kk">JET дерекқоры</comment>
+ <comment xml:lang="ja">JET データベース</comment>
+ <comment xml:lang="it">Database JET</comment>
+ <comment xml:lang="is">JET gagnagrunnur</comment>
+ <comment xml:lang="id">Basis data JET</comment>
+ <comment xml:lang="ia">Base de datos JET</comment>
+ <comment xml:lang="hu">JET adatbázis</comment>
+ <comment xml:lang="hr">JET baza podataka</comment>
+ <comment xml:lang="he">מסד נתונים מסוג JET</comment>
+ <comment xml:lang="gl">base de datos JET</comment>
+ <comment xml:lang="ga">bunachar sonraí JET</comment>
+ <comment xml:lang="fur">base di dâts JET</comment>
+ <comment xml:lang="fr">base de données JET</comment>
+ <comment xml:lang="fo">JET dátustovnur</comment>
+ <comment xml:lang="fi">JET-tietokanta</comment>
+ <comment xml:lang="eu">JET datu-basea</comment>
+ <comment xml:lang="es">base de datos JET</comment>
+ <comment xml:lang="eo">JET-datumbazo</comment>
+ <comment xml:lang="en_GB">JET database</comment>
+ <comment xml:lang="el">Βάση δεδομένων JET</comment>
+ <comment xml:lang="de">JET-Datenbank</comment>
+ <comment xml:lang="da">JET-database</comment>
+ <comment xml:lang="cs">databáze JET</comment>
+ <comment xml:lang="ca">base de dades JET</comment>
+ <comment xml:lang="bg">База от данни — JET</comment>
+ <comment xml:lang="be@latin">Baza źviestak JET</comment>
+ <comment xml:lang="be">база даных JET</comment>
+ <comment xml:lang="ast">Base de datos JETº</comment>
+ <comment xml:lang="ar">قاعدة بيانات JET</comment>
+ <comment xml:lang="af">JET-databasis</comment>
<acronym>JET</acronym>
<expanded-acronym>Joint Engine Technology</expanded-acronym>
<generic-icon name="x-office-document"/>
- <magic priority="50">
+ <magic>
<match offset="0" type="string" value="\x00\x01\x00\x00Standard Jet DB"/>
</magic>
- <glob pattern="*.mdb"/>
+ <glob pattern="*.mdb" weight="60"/>
<alias type="application/msaccess"/>
<alias type="application/vnd.msaccess"/>
<alias type="application/x-msaccess"/>
@@ -3041,51 +3396,55 @@ command to generate the output files.
</mime-type>
<mime-type type="application/vnd.ms-cab-compressed">
<comment>Microsoft Cabinet archive</comment>
- <comment xml:lang="af">Microsoft Cabinet-argief</comment>
- <comment xml:lang="ar">أرشيف Microsoft Cabinet</comment>
- <comment xml:lang="bg">Архив — Microsoft Cabinet</comment>
- <comment xml:lang="ca">arxiu de Microsoft Cabinet</comment>
- <comment xml:lang="cs">archiv Microsoft Cabinet</comment>
- <comment xml:lang="da">Microsoft Cabinet-arkiv</comment>
- <comment xml:lang="de">Microsoft-Cabinet-Archiv</comment>
- <comment xml:lang="el">Συμπιεσμένο αρχείο Microsoft Cabinet</comment>
- <comment xml:lang="en-GB">Microsoft Cabinet archive</comment>
- <comment xml:lang="es">archivador Cabinet de Microsoft</comment>
- <comment xml:lang="eu">Microsoft Cabinet artxiboa</comment>
- <comment xml:lang="fi">Microsoft Cabinet -arkisto</comment>
- <comment xml:lang="fo">Microsoft Cabinet skjalasavn</comment>
- <comment xml:lang="fr">archive Cab Microsoft</comment>
- <comment xml:lang="fur">archivi Cabinet Microsoft</comment>
- <comment xml:lang="ga">cartlann Microsoft Cabinet</comment>
- <comment xml:lang="gl">arquivo de Microsoft Cabinet</comment>
- <comment xml:lang="he">ארכיון CAB (מיקרוסופט)</comment>
- <comment xml:lang="hr">Microsoft Cabinet arhiva</comment>
- <comment xml:lang="hu">Microsoft Cabinet archívum</comment>
- <comment xml:lang="ia">Archivo Microsoft Cabinet</comment>
- <comment xml:lang="id">Arsip Microsoft Cabinet</comment>
- <comment xml:lang="it">Archivio Microsoft Cabinet</comment>
- <comment xml:lang="ja">Microsoft Cabinet アーカイブ</comment>
- <comment xml:lang="ka">Microsoft-ის Cabinet არქივი</comment>
- <comment xml:lang="kk">Microsoft Cabinet архиві</comment>
- <comment xml:lang="ko">Microsoft Cabinet 압축 파일</comment>
- <comment xml:lang="lt">Microsoft Cabinet archyvas</comment>
- <comment xml:lang="lv">Microsoft kabineta arhīvs</comment>
- <comment xml:lang="nl">Microsoft Cabinet-archief</comment>
- <comment xml:lang="oc">archiu Cab Microsoft</comment>
- <comment xml:lang="pl">Archiwum Microsoft Cabinet</comment>
- <comment xml:lang="pt">arquivo Microsoft Cabinet</comment>
- <comment xml:lang="pt-BR">Pacote Cabinet da Microsoft</comment>
- <comment xml:lang="ro">Arhivă Microsoft Cabinet</comment>
- <comment xml:lang="ru">Архив Microsoft Cabinet</comment>
- <comment xml:lang="sk">Archív Microsoft Cabinet</comment>
- <comment xml:lang="sl">Datoteka arhiva Microsoft Cabinet</comment>
- <comment xml:lang="sr">Мајкрософтова кабинет архива</comment>
- <comment xml:lang="sv">Microsoft Cabinet-arkiv</comment>
- <comment xml:lang="tr">Microsoft Cabinet arşivi</comment>
- <comment xml:lang="uk">архів Cabinet Microsoft</comment>
+ <comment xml:lang="zh_TW">微軟 Cabinet 封存檔</comment>
+ <comment xml:lang="zh_CN">Microsoft Cabinet 归档文件</comment>
<comment xml:lang="vi">Kho lưu Cabinet Microsoft</comment>
- <comment xml:lang="zh-CN">Microsoft Cabinet 归档文件</comment>
- <comment xml:lang="zh-TW">微軟 Cabinet 封存檔</comment>
+ <comment xml:lang="uk">архів Cabinet Microsoft</comment>
+ <comment xml:lang="tr">Microsoft Cabinet arşivi</comment>
+ <comment xml:lang="sv">Microsoft Cabinet-arkiv</comment>
+ <comment xml:lang="sr">Мајкрософтова кабинет архива</comment>
+ <comment xml:lang="sq">arkiv Microsoft Cabinet</comment>
+ <comment xml:lang="sl">Datoteka arhiva Microsoft Cabinet</comment>
+ <comment xml:lang="si">Microsoft කැබිනට් සංරක්ෂිතය</comment>
+ <comment xml:lang="sk">Archív Microsoft Cabinet</comment>
+ <comment xml:lang="ru">Архив Microsoft Cabinet</comment>
+ <comment xml:lang="ro">Arhivă Microsoft Cabinet</comment>
+ <comment xml:lang="pt_BR">Pacote Cabinet da Microsoft</comment>
+ <comment xml:lang="pt">arquivo Microsoft Cabinet</comment>
+ <comment xml:lang="pl">Archiwum Microsoft Cabinet</comment>
+ <comment xml:lang="oc">archiu Cab Microsoft</comment>
+ <comment xml:lang="nl">Microsoft Cabinet-archief</comment>
+ <comment xml:lang="lv">Microsoft kabineta arhīvs</comment>
+ <comment xml:lang="lt">Microsoft Cabinet archyvas</comment>
+ <comment xml:lang="ko">Microsoft Cabinet 압축 파일</comment>
+ <comment xml:lang="kk">Microsoft Cabinet архиві</comment>
+ <comment xml:lang="ka">Microsoft-ის Cabinet არქივი</comment>
+ <comment xml:lang="ja">Microsoft Cabinet アーカイブ</comment>
+ <comment xml:lang="it">Archivio Microsoft Cabinet</comment>
+ <comment xml:lang="is">Microsoft Cabinet safnskrá</comment>
+ <comment xml:lang="id">Arsip Microsoft Cabinet</comment>
+ <comment xml:lang="ia">Archivo Microsoft Cabinet</comment>
+ <comment xml:lang="hu">Microsoft Cabinet archívum</comment>
+ <comment xml:lang="hr">Microsoft Cabinet arhiva</comment>
+ <comment xml:lang="he">ארכיון CAB (מיקרוסופט)</comment>
+ <comment xml:lang="gl">arquivo de Microsoft Cabinet</comment>
+ <comment xml:lang="ga">cartlann Microsoft Cabinet</comment>
+ <comment xml:lang="fur">archivi Cabinet Microsoft</comment>
+ <comment xml:lang="fr">archive Cab Microsoft</comment>
+ <comment xml:lang="fo">Microsoft Cabinet skjalasavn</comment>
+ <comment xml:lang="fi">Microsoft Cabinet -arkisto</comment>
+ <comment xml:lang="eu">Microsoft Cabinet artxiboa</comment>
+ <comment xml:lang="es">archivador Cabinet de Microsoft</comment>
+ <comment xml:lang="en_GB">Microsoft Cabinet archive</comment>
+ <comment xml:lang="el">Συμπιεσμένο αρχείο Microsoft Cabinet</comment>
+ <comment xml:lang="de">Microsoft-Cabinet-Archiv</comment>
+ <comment xml:lang="da">Microsoft Cabinet-arkiv</comment>
+ <comment xml:lang="cs">archiv Microsoft Cabinet</comment>
+ <comment xml:lang="ca">arxiu de Microsoft Cabinet</comment>
+ <comment xml:lang="bg">Архив — Microsoft Cabinet</comment>
+ <comment xml:lang="be">архіў Microsoft Cabinet</comment>
+ <comment xml:lang="ar">أرشيف Microsoft Cabinet</comment>
+ <comment xml:lang="af">Microsoft Cabinet-argief</comment>
<generic-icon name="package-x-generic"/>
<magic priority="60">
<match offset="0" type="string" value="MSCF\0\0\0\0"/>
@@ -3095,58 +3454,62 @@ command to generate the output files.
</mime-type>
<mime-type type="application/vnd.ms-excel">
<comment>Excel spreadsheet</comment>
- <comment xml:lang="af">Excel-sigblad</comment>
- <comment xml:lang="ar">جدول Excel</comment>
- <comment xml:lang="be-Latn">Raźlikovy akruš Excel</comment>
- <comment xml:lang="bg">Таблица — Excel</comment>
- <comment xml:lang="ca">full de càlcul d'Excel</comment>
- <comment xml:lang="cs">sešit Excel</comment>
- <comment xml:lang="da">Excelregneark</comment>
- <comment xml:lang="de">Excel-Tabelle</comment>
- <comment xml:lang="el">Λογιστικό φύλλο Excel</comment>
- <comment xml:lang="en-GB">Excel spreadsheet</comment>
- <comment xml:lang="eo">Excel-kalkultabelo</comment>
- <comment xml:lang="es">hoja de cálculo de Excel</comment>
- <comment xml:lang="eu">Excel kalkulu-orria</comment>
- <comment xml:lang="fi">Excel-taulukko</comment>
- <comment xml:lang="fo">Excel rokniark</comment>
- <comment xml:lang="fr">feuille de calcul Excel</comment>
- <comment xml:lang="fur">sfuei di calcul Excel</comment>
- <comment xml:lang="ga">scarbhileog Excel</comment>
- <comment xml:lang="gl">folla de cálculo de Excel</comment>
- <comment xml:lang="he">גליון נתונים של Excel</comment>
- <comment xml:lang="hr">Excel proračunska tablica</comment>
- <comment xml:lang="hu">Excel táblázat</comment>
- <comment xml:lang="ia">Folio de calculo Excel</comment>
- <comment xml:lang="id">Lembar sebar Excel</comment>
- <comment xml:lang="it">Foglio di calcolo Excel</comment>
- <comment xml:lang="ja">Excel スプレッドシート</comment>
- <comment xml:lang="ka">Excel-ის ცხრილი</comment>
- <comment xml:lang="kk">Excel электрондық кестесі</comment>
- <comment xml:lang="ko">Excel 스프레드시트</comment>
- <comment xml:lang="lt">Excel skaičialentė</comment>
- <comment xml:lang="lv">Excel izklājlapa</comment>
- <comment xml:lang="nb">Excel regneark</comment>
- <comment xml:lang="nl">Excel-rekenblad</comment>
- <comment xml:lang="nn">Excel-rekneark</comment>
- <comment xml:lang="oc">fuèlh de calcul Excel</comment>
- <comment xml:lang="pl">Arkusz Excel</comment>
- <comment xml:lang="pt">folha de cálculo Excel</comment>
- <comment xml:lang="pt-BR">Planilha do Excel</comment>
- <comment xml:lang="ro">Foaie de calcul Excel</comment>
- <comment xml:lang="ru">Электронная таблица Excel</comment>
- <comment xml:lang="sk">Zošit Excel</comment>
- <comment xml:lang="sl">Razpredelnica Microsoft Excel</comment>
- <comment xml:lang="sq">Fletë llogaritje Excel</comment>
- <comment xml:lang="sr">Екселова табела</comment>
- <comment xml:lang="sv">Excel-kalkylblad</comment>
- <comment xml:lang="tr">Excel hesap çizelgesi</comment>
- <comment xml:lang="uk">ел. таблиця Excel</comment>
+ <comment xml:lang="zh_TW">Excel 試算表</comment>
+ <comment xml:lang="zh_CN">Excel 电子表格</comment>
<comment xml:lang="vi">Bảng tính Excel</comment>
- <comment xml:lang="zh-CN">Excel 电子表格</comment>
- <comment xml:lang="zh-TW">Excel 試算表</comment>
+ <comment xml:lang="uk">електронна таблиця Excel</comment>
+ <comment xml:lang="tr">Excel hesap çizelgesi</comment>
+ <comment xml:lang="sv">Excel-kalkylblad</comment>
+ <comment xml:lang="sr">Екселова табела</comment>
+ <comment xml:lang="sq">fletëllogaritje Excel</comment>
+ <comment xml:lang="sl">Razpredelnica Microsoft Excel</comment>
+ <comment xml:lang="si">එක්සෙල් පැතුරුම්පත</comment>
+ <comment xml:lang="sk">Zošit Excel</comment>
+ <comment xml:lang="ru">Электронная таблица Excel</comment>
+ <comment xml:lang="ro">Foaie de calcul Excel</comment>
+ <comment xml:lang="pt_BR">Planilha do Excel</comment>
+ <comment xml:lang="pt">folha de cálculo Excel</comment>
+ <comment xml:lang="pl">Arkusz Excel</comment>
+ <comment xml:lang="oc">fuèlh de calcul Excel</comment>
+ <comment xml:lang="nn">Excel-rekneark</comment>
+ <comment xml:lang="nl">Excel-rekenblad</comment>
+ <comment xml:lang="nb">Excel regneark</comment>
+ <comment xml:lang="lv">Excel izklājlapa</comment>
+ <comment xml:lang="lt">Excel skaičialentė</comment>
+ <comment xml:lang="ko">Excel 스프레드시트</comment>
+ <comment xml:lang="kk">Excel электрондық кестесі</comment>
+ <comment xml:lang="ka">Excel-ის ცხრილი</comment>
+ <comment xml:lang="ja">Excel スプレッドシート</comment>
+ <comment xml:lang="it">Foglio di calcolo Excel</comment>
+ <comment xml:lang="is">Excel töflureikniskjal</comment>
+ <comment xml:lang="id">Lembar sebar Excel</comment>
+ <comment xml:lang="ia">Folio de calculo Excel</comment>
+ <comment xml:lang="hu">Excel táblázat</comment>
+ <comment xml:lang="hr">Excel proračunska tablica</comment>
+ <comment xml:lang="he">גיליון נתונים של Excel</comment>
+ <comment xml:lang="gl">folla de cálculo de Excel</comment>
+ <comment xml:lang="ga">scarbhileog Excel</comment>
+ <comment xml:lang="fur">sfuei di calcul Excel</comment>
+ <comment xml:lang="fr">feuille de calcul Excel</comment>
+ <comment xml:lang="fo">Excel rokniark</comment>
+ <comment xml:lang="fi">Excel-taulukko</comment>
+ <comment xml:lang="eu">Excel kalkulu-orria</comment>
+ <comment xml:lang="es">hoja de cálculo de Excel</comment>
+ <comment xml:lang="eo">Excel-kalkultabelo</comment>
+ <comment xml:lang="en_GB">Excel spreadsheet</comment>
+ <comment xml:lang="el">Λογιστικό φύλλο Excel</comment>
+ <comment xml:lang="de">Excel-Tabelle</comment>
+ <comment xml:lang="da">Excelregneark</comment>
+ <comment xml:lang="cs">sešit Excel</comment>
+ <comment xml:lang="ca">full de càlcul d'Excel</comment>
+ <comment xml:lang="bg">Таблица — Excel</comment>
+ <comment xml:lang="be@latin">Raźlikovy akruš Excel</comment>
+ <comment xml:lang="be">электронная табліца Excel</comment>
+ <comment xml:lang="ar">جدول اكسل</comment>
+ <comment xml:lang="af">Excel-sigblad</comment>
+ <sub-class-of type="application/x-ole-storage"/>
<generic-icon name="x-office-spreadsheet"/>
- <magic priority="50">
+ <magic>
<match type="string" value="Microsoft Excel 5.0 Worksheet" offset="2080"/>
</magic>
<glob pattern="*.xls"/>
@@ -3163,244 +3526,269 @@ command to generate the output files.
</mime-type>
<mime-type type="application/vnd.ms-excel.addin.macroEnabled.12">
<comment>Excel add-in</comment>
- <comment xml:lang="af">Excel-byvoeging</comment>
- <comment xml:lang="bg">Приставка — Excel</comment>
- <comment xml:lang="ca">complement d'Excel</comment>
- <comment xml:lang="cs">doplněk aplikace Excel</comment>
- <comment xml:lang="da">Excel-tilføjelse</comment>
- <comment xml:lang="de">Excel Add-in</comment>
- <comment xml:lang="el">Πρόσθετο Excel</comment>
- <comment xml:lang="en-GB">Excel add-in</comment>
- <comment xml:lang="es">complemento de Excel</comment>
- <comment xml:lang="eu">Excel gehigarria</comment>
- <comment xml:lang="fi">Excel-lisäosa</comment>
- <comment xml:lang="fr">complément Excel</comment>
- <comment xml:lang="fur">zonte Excel</comment>
- <comment xml:lang="ga">breiseán Excel</comment>
- <comment xml:lang="gl">complemento de Excel</comment>
- <comment xml:lang="he">תוסף של Excel</comment>
- <comment xml:lang="hr">Excel dodatak</comment>
- <comment xml:lang="hu">Excel bővítmény</comment>
- <comment xml:lang="ia">Add-in Excel</comment>
- <comment xml:lang="id">Add-in Excel</comment>
- <comment xml:lang="it">Add-in Excel</comment>
- <comment xml:lang="ja">Excel アドイン</comment>
- <comment xml:lang="ka">Excel-ის დამატება</comment>
- <comment xml:lang="kk">Excel қосымшасы</comment>
- <comment xml:lang="ko">Excel 추가 기능</comment>
- <comment xml:lang="lv">Excel pievienojumprogramma</comment>
- <comment xml:lang="nl">Excel add-in</comment>
- <comment xml:lang="oc">complement Excel</comment>
- <comment xml:lang="pl">Dodatek Excel</comment>
- <comment xml:lang="pt">Extensão Excel</comment>
- <comment xml:lang="pt-BR">Suplemento do Excel</comment>
- <comment xml:lang="ru">Дополнение Excel</comment>
- <comment xml:lang="sk">Doplnok aplikácie Excel</comment>
- <comment xml:lang="sl">Vstavek Excel</comment>
- <comment xml:lang="sr">Екселов додатак</comment>
- <comment xml:lang="sv">Excel-tillägg</comment>
- <comment xml:lang="tr">Excel eklentisi</comment>
+ <comment xml:lang="zh_TW">Excel 增益集</comment>
+ <comment xml:lang="zh_CN">Excel 外接程序</comment>
<comment xml:lang="uk">додаток Excel</comment>
- <comment xml:lang="zh-CN">Excel 外接程序</comment>
- <comment xml:lang="zh-TW">Excel 增益集</comment>
+ <comment xml:lang="tr">Excel eklentisi</comment>
+ <comment xml:lang="sv">Excel-tillägg</comment>
+ <comment xml:lang="sr">Екселов додатак</comment>
+ <comment xml:lang="sq">shtojcë Excel</comment>
+ <comment xml:lang="sl">Vstavek Excel</comment>
+ <comment xml:lang="si">එක්සෙල් ඇඩෝනය</comment>
+ <comment xml:lang="sk">Doplnok aplikácie Excel</comment>
+ <comment xml:lang="ru">Дополнение Excel</comment>
+ <comment xml:lang="pt_BR">Suplemento do Excel</comment>
+ <comment xml:lang="pt">Extensão Excel</comment>
+ <comment xml:lang="pl">Dodatek Excel</comment>
+ <comment xml:lang="oc">complement Excel</comment>
+ <comment xml:lang="nl">Excel-add-in</comment>
+ <comment xml:lang="lv">Excel pievienojumprogramma</comment>
+ <comment xml:lang="ko">Excel 추가 기능</comment>
+ <comment xml:lang="kk">Excel қосымшасы</comment>
+ <comment xml:lang="ka">Excel-ის დამატება</comment>
+ <comment xml:lang="ja">Excel アドイン</comment>
+ <comment xml:lang="it">Add-in Excel</comment>
+ <comment xml:lang="is">Excel viðbót</comment>
+ <comment xml:lang="id">Add-in Excel</comment>
+ <comment xml:lang="ia">Add-in Excel</comment>
+ <comment xml:lang="hu">Excel bővítmény</comment>
+ <comment xml:lang="hr">Excel dodatak</comment>
+ <comment xml:lang="he">תוסף של Excel</comment>
+ <comment xml:lang="gl">complemento de Excel</comment>
+ <comment xml:lang="ga">breiseán Excel</comment>
+ <comment xml:lang="fur">zonte Excel</comment>
+ <comment xml:lang="fr">complément Excel</comment>
+ <comment xml:lang="fi">Excel-lisäosa</comment>
+ <comment xml:lang="eu">Excel gehigarria</comment>
+ <comment xml:lang="es">complemento de Excel</comment>
+ <comment xml:lang="en_GB">Excel add-in</comment>
+ <comment xml:lang="el">Πρόσθετο Excel</comment>
+ <comment xml:lang="de">Excel-Add-in</comment>
+ <comment xml:lang="da">Excel-tilføjelse</comment>
+ <comment xml:lang="cs">doplněk aplikace Excel</comment>
+ <comment xml:lang="ca">complement d'Excel</comment>
+ <comment xml:lang="bg">Приставка — Excel</comment>
+ <comment xml:lang="be">надбудова Excel</comment>
+ <comment xml:lang="ar">إضافة اكسل</comment>
+ <comment xml:lang="af">Excel-byvoeging</comment>
<generic-icon name="x-office-spreadsheet"/>
<glob pattern="*.xlam"/>
<sub-class-of type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"/>
</mime-type>
<mime-type type="application/vnd.ms-excel.sheet.binary.macroEnabled.12">
<comment>Excel 2007 binary spreadsheet</comment>
- <comment xml:lang="af">Excel 2007 binêre sigblad</comment>
- <comment xml:lang="bg">Таблица — Excel 2007, двоична</comment>
- <comment xml:lang="ca">full de càlcul binari d'Excel 2007</comment>
- <comment xml:lang="cs">binární formát sešitu Excel 2007</comment>
- <comment xml:lang="da">Binært Excel 2007-regneark</comment>
- <comment xml:lang="de">Excel-2007-Tabelle (binär)</comment>
- <comment xml:lang="el">Δυαδικό λογιστικό φύλλο Excel 2007</comment>
- <comment xml:lang="en-GB">Excel 2007 binary spreadsheet</comment>
- <comment xml:lang="es">hoja de cálculo binaria de Excel 2007</comment>
- <comment xml:lang="eu">Excel 2007 kalkulu-orri binarioa</comment>
- <comment xml:lang="fi">Excel 2007:n binaarinen taulukko</comment>
- <comment xml:lang="fr">feuille de calcul binaire Excel 2007</comment>
- <comment xml:lang="fur">sfuei di calcul binari Excel 2007</comment>
- <comment xml:lang="ga">scarbhileog dhénártha Excel 2007</comment>
- <comment xml:lang="gl">ficheiro binario de folla de cálculo Excel 2007</comment>
- <comment xml:lang="he">גיליון נתונים בינרי של Excel 2007</comment>
- <comment xml:lang="hr">Excel 2007 binarna proračunska tablica</comment>
- <comment xml:lang="hu">Excel 2007 bináris táblázat</comment>
- <comment xml:lang="ia">Folio de calculo binari Excel 2007</comment>
- <comment xml:lang="id">Lembar kerja biner Excel 2007</comment>
- <comment xml:lang="it">Foglio di calcolo binario Excel 2007</comment>
- <comment xml:lang="ja">Excel 2007 バイナリスプレッドシート</comment>
- <comment xml:lang="ka">Excel 2007-ის ბინარული ცხრილი</comment>
- <comment xml:lang="kk">Excel 2007 бинарды кестесі</comment>
- <comment xml:lang="ko">Excel 2007 바이너리 스프레드시트</comment>
- <comment xml:lang="lv">Excel 2007 binārā izklājlapa</comment>
- <comment xml:lang="nl">Excel 2007 binary spreadsheet</comment>
- <comment xml:lang="oc">fuèlh de calcul binaire Excel 2007</comment>
- <comment xml:lang="pl">Binarny arkusz Excel 2007</comment>
- <comment xml:lang="pt">folha de cálculo binária Excel 2007</comment>
- <comment xml:lang="pt-BR">Planilha binária do Excel 2007</comment>
- <comment xml:lang="ru">Двоичная электронная таблица Excel 2007</comment>
- <comment xml:lang="sk">Binárny zošit Excel 2007</comment>
- <comment xml:lang="sl">Binarna preglednica Excel 2007</comment>
- <comment xml:lang="sr">Ексел 2007 бинарна табела</comment>
- <comment xml:lang="sv">Binärt Excel 2007-kalkylblad</comment>
- <comment xml:lang="tr">Excel 2007 ikilik hesap çizelgesi</comment>
+ <comment xml:lang="zh_TW">Excel 2007 二進位試算表</comment>
+ <comment xml:lang="zh_CN">Excel 2007 二进制电子表格</comment>
<comment xml:lang="uk">бінарна електронна таблиця Excel 2007</comment>
- <comment xml:lang="zh-CN">Excel 2007 二进制电子表格</comment>
- <comment xml:lang="zh-TW">Excel 2007 二進位試算表</comment>
+ <comment xml:lang="tr">Excel 2007 ikilik hesap çizelgesi</comment>
+ <comment xml:lang="sv">Binärt Excel 2007-kalkylblad</comment>
+ <comment xml:lang="sr">Ексел 2007 бинарна табела</comment>
+ <comment xml:lang="sq">fletëllogaritje dyore Excel 2007</comment>
+ <comment xml:lang="sl">Binarna preglednica Excel 2007</comment>
+ <comment xml:lang="si">Excel 2007 ද්විමය පැතුරුම්පත</comment>
+ <comment xml:lang="sk">Binárny zošit Excel 2007</comment>
+ <comment xml:lang="ru">Двоичная электронная таблица Excel 2007</comment>
+ <comment xml:lang="pt_BR">Planilha binária do Excel 2007</comment>
+ <comment xml:lang="pt">folha de cálculo binária Excel 2007</comment>
+ <comment xml:lang="pl">Binarny arkusz Excel 2007</comment>
+ <comment xml:lang="oc">fuèlh de calcul binaire Excel 2007</comment>
+ <comment xml:lang="nl">Excel 2007 binair rekenblad</comment>
+ <comment xml:lang="lv">Excel 2007 binārā izklājlapa</comment>
+ <comment xml:lang="ko">Excel 2007 바이너리 스프레드시트</comment>
+ <comment xml:lang="kk">Excel 2007 бинарды кестесі</comment>
+ <comment xml:lang="ka">Excel 2007-ის ბინარული ცხრილი</comment>
+ <comment xml:lang="ja">Excel 2007 バイナリスプレッドシート</comment>
+ <comment xml:lang="it">Foglio di calcolo binario Excel 2007</comment>
+ <comment xml:lang="is">Excel tvíunddarkerfis töflureikniskjal</comment>
+ <comment xml:lang="id">Lembar kerja biner Excel 2007</comment>
+ <comment xml:lang="ia">Folio de calculo binari Excel 2007</comment>
+ <comment xml:lang="hu">Excel 2007 bináris táblázat</comment>
+ <comment xml:lang="hr">Excel 2007 binarna proračunska tablica</comment>
+ <comment xml:lang="he">גיליון נתונים בינרי של Excel 2007</comment>
+ <comment xml:lang="gl">ficheiro binario de folla de cálculo Excel 2007</comment>
+ <comment xml:lang="ga">scarbhileog dhénártha Excel 2007</comment>
+ <comment xml:lang="fur">sfuei di calcul binari Excel 2007</comment>
+ <comment xml:lang="fr">feuille de calcul binaire Excel 2007</comment>
+ <comment xml:lang="fi">Excel 2007 binäärinen taulukko</comment>
+ <comment xml:lang="eu">Excel 2007 kalkulu-orri binarioa</comment>
+ <comment xml:lang="es">hoja de cálculo binaria de Excel 2007</comment>
+ <comment xml:lang="en_GB">Excel 2007 binary spreadsheet</comment>
+ <comment xml:lang="el">Δυαδικό λογιστικό φύλλο Excel 2007</comment>
+ <comment xml:lang="de">Excel-2007-Tabelle (binär)</comment>
+ <comment xml:lang="da">Binært Excel 2007-regneark</comment>
+ <comment xml:lang="cs">binární formát sešitu Excel 2007</comment>
+ <comment xml:lang="ca">full de càlcul binari d'Excel 2007</comment>
+ <comment xml:lang="bg">Таблица — Excel 2007, двоична</comment>
+ <comment xml:lang="be">двайковая электронная табліца Excel 2007</comment>
+ <comment xml:lang="ar">مستند اكسل 2007 ثنائي</comment>
+ <comment xml:lang="af">Excel 2007 binêre sigblad</comment>
<generic-icon name="x-office-spreadsheet"/>
<glob pattern="*.xlsb"/>
<sub-class-of type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"/>
</mime-type>
<mime-type type="application/vnd.ms-excel.sheet.macroEnabled.12">
<comment>Excel spreadsheet</comment>
- <comment xml:lang="af">Excel-sigblad</comment>
- <comment xml:lang="ar">جدول Excel</comment>
- <comment xml:lang="be-Latn">Raźlikovy akruš Excel</comment>
- <comment xml:lang="bg">Таблица — Excel</comment>
- <comment xml:lang="ca">full de càlcul d'Excel</comment>
- <comment xml:lang="cs">sešit Excel</comment>
- <comment xml:lang="da">Excelregneark</comment>
- <comment xml:lang="de">Excel-Tabelle</comment>
- <comment xml:lang="el">Λογιστικό φύλλο Excel</comment>
- <comment xml:lang="en-GB">Excel spreadsheet</comment>
- <comment xml:lang="eo">Excel-kalkultabelo</comment>
- <comment xml:lang="es">hoja de cálculo de Excel</comment>
- <comment xml:lang="eu">Excel kalkulu-orria</comment>
- <comment xml:lang="fi">Excel-taulukko</comment>
- <comment xml:lang="fo">Excel rokniark</comment>
- <comment xml:lang="fr">feuille de calcul Excel</comment>
- <comment xml:lang="fur">sfuei di calcul Excel</comment>
- <comment xml:lang="ga">scarbhileog Excel</comment>
- <comment xml:lang="gl">folla de cálculo de Excel</comment>
- <comment xml:lang="he">גליון נתונים של Excel</comment>
- <comment xml:lang="hr">Excel proračunska tablica</comment>
- <comment xml:lang="hu">Excel táblázat</comment>
- <comment xml:lang="ia">Folio de calculo Excel</comment>
- <comment xml:lang="id">Lembar sebar Excel</comment>
- <comment xml:lang="it">Foglio di calcolo Excel</comment>
- <comment xml:lang="ja">Excel スプレッドシート</comment>
- <comment xml:lang="ka">Excel-ის ცხრილი</comment>
- <comment xml:lang="kk">Excel электрондық кестесі</comment>
- <comment xml:lang="ko">Excel 스프레드시트</comment>
- <comment xml:lang="lt">Excel skaičialentė</comment>
- <comment xml:lang="lv">Excel izklājlapa</comment>
- <comment xml:lang="nb">Excel regneark</comment>
- <comment xml:lang="nl">Excel-rekenblad</comment>
- <comment xml:lang="nn">Excel-rekneark</comment>
- <comment xml:lang="oc">fuèlh de calcul Excel</comment>
- <comment xml:lang="pl">Arkusz Excel</comment>
- <comment xml:lang="pt">folha de cálculo Excel</comment>
- <comment xml:lang="pt-BR">Planilha do Excel</comment>
- <comment xml:lang="ro">Foaie de calcul Excel</comment>
- <comment xml:lang="ru">Электронная таблица Excel</comment>
- <comment xml:lang="sk">Zošit Excel</comment>
- <comment xml:lang="sl">Razpredelnica Microsoft Excel</comment>
- <comment xml:lang="sq">Fletë llogaritje Excel</comment>
- <comment xml:lang="sr">Екселова табела</comment>
- <comment xml:lang="sv">Excel-kalkylblad</comment>
- <comment xml:lang="tr">Excel hesap çizelgesi</comment>
- <comment xml:lang="uk">ел. таблиця Excel</comment>
+ <comment xml:lang="zh_TW">Excel 試算表</comment>
+ <comment xml:lang="zh_CN">Excel 电子表格</comment>
<comment xml:lang="vi">Bảng tính Excel</comment>
- <comment xml:lang="zh-CN">Excel 电子表格</comment>
- <comment xml:lang="zh-TW">Excel 試算表</comment>
+ <comment xml:lang="uk">електронна таблиця Excel</comment>
+ <comment xml:lang="tr">Excel hesap çizelgesi</comment>
+ <comment xml:lang="sv">Excel-kalkylblad</comment>
+ <comment xml:lang="sr">Екселова табела</comment>
+ <comment xml:lang="sq">fletëllogaritje Excel</comment>
+ <comment xml:lang="sl">Razpredelnica Microsoft Excel</comment>
+ <comment xml:lang="si">එක්සෙල් පැතුරුම්පත</comment>
+ <comment xml:lang="sk">Zošit Excel</comment>
+ <comment xml:lang="ru">Электронная таблица Excel</comment>
+ <comment xml:lang="ro">Foaie de calcul Excel</comment>
+ <comment xml:lang="pt_BR">Planilha do Excel</comment>
+ <comment xml:lang="pt">folha de cálculo Excel</comment>
+ <comment xml:lang="pl">Arkusz Excel</comment>
+ <comment xml:lang="oc">fuèlh de calcul Excel</comment>
+ <comment xml:lang="nn">Excel-rekneark</comment>
+ <comment xml:lang="nl">Excel-rekenblad</comment>
+ <comment xml:lang="nb">Excel regneark</comment>
+ <comment xml:lang="lv">Excel izklājlapa</comment>
+ <comment xml:lang="lt">Excel skaičialentė</comment>
+ <comment xml:lang="ko">Excel 스프레드시트</comment>
+ <comment xml:lang="kk">Excel электрондық кестесі</comment>
+ <comment xml:lang="ka">Excel-ის ცხრილი</comment>
+ <comment xml:lang="ja">Excel スプレッドシート</comment>
+ <comment xml:lang="it">Foglio di calcolo Excel</comment>
+ <comment xml:lang="is">Excel töflureikniskjal</comment>
+ <comment xml:lang="id">Lembar sebar Excel</comment>
+ <comment xml:lang="ia">Folio de calculo Excel</comment>
+ <comment xml:lang="hu">Excel táblázat</comment>
+ <comment xml:lang="hr">Excel proračunska tablica</comment>
+ <comment xml:lang="he">גיליון נתונים של Excel</comment>
+ <comment xml:lang="gl">folla de cálculo de Excel</comment>
+ <comment xml:lang="ga">scarbhileog Excel</comment>
+ <comment xml:lang="fur">sfuei di calcul Excel</comment>
+ <comment xml:lang="fr">feuille de calcul Excel</comment>
+ <comment xml:lang="fo">Excel rokniark</comment>
+ <comment xml:lang="fi">Excel-taulukko</comment>
+ <comment xml:lang="eu">Excel kalkulu-orria</comment>
+ <comment xml:lang="es">hoja de cálculo de Excel</comment>
+ <comment xml:lang="eo">Excel-kalkultabelo</comment>
+ <comment xml:lang="en_GB">Excel spreadsheet</comment>
+ <comment xml:lang="el">Λογιστικό φύλλο Excel</comment>
+ <comment xml:lang="de">Excel-Tabelle</comment>
+ <comment xml:lang="da">Excelregneark</comment>
+ <comment xml:lang="cs">sešit Excel</comment>
+ <comment xml:lang="ca">full de càlcul d'Excel</comment>
+ <comment xml:lang="bg">Таблица — Excel</comment>
+ <comment xml:lang="be@latin">Raźlikovy akruš Excel</comment>
+ <comment xml:lang="be">электронная табліца Excel</comment>
+ <comment xml:lang="ar">جدول اكسل</comment>
+ <comment xml:lang="af">Excel-sigblad</comment>
<generic-icon name="x-office-spreadsheet"/>
<glob pattern="*.xlsm"/>
<sub-class-of type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"/>
</mime-type>
<mime-type type="application/vnd.ms-excel.template.macroEnabled.12">
<comment>Excel spreadsheet template</comment>
- <comment xml:lang="af">Excel-sigbladsjabloon</comment>
- <comment xml:lang="bg">Шаблон за таблица — Excel</comment>
- <comment xml:lang="ca">plantilla de full de càlcul d'Excel</comment>
- <comment xml:lang="cs">šablona tabulky Excel</comment>
- <comment xml:lang="da">Excel-regnearksskabelon</comment>
- <comment xml:lang="de">Excel-Tabellenvorlage</comment>
- <comment xml:lang="el">Πρότυπο λογιστικού φύλλου Excel</comment>
- <comment xml:lang="en-GB">Excel spreadsheet template</comment>
- <comment xml:lang="es">plantilla de hoja de cálculo de Excel</comment>
- <comment xml:lang="eu">Excel kalkulu-orri txantiloia</comment>
- <comment xml:lang="fi">Excel-taulukkomalli</comment>
- <comment xml:lang="fr">modèle de feuille de calcul Excel</comment>
- <comment xml:lang="fur">model sfuei di calcul Excel</comment>
- <comment xml:lang="ga">teimpléad scarbhileoige Excel</comment>
- <comment xml:lang="he">תבנית גיליון נתונים של Excel</comment>
- <comment xml:lang="hr">Predložak Excel proračunske tablice</comment>
- <comment xml:lang="hu">Excel munkafüzetsablon</comment>
- <comment xml:lang="ia">Patrono de folio de calculo Excel</comment>
- <comment xml:lang="id">Templat lembar kerja Excel</comment>
- <comment xml:lang="it">Modello foglio di calcolo Excel</comment>
- <comment xml:lang="kk">Excel кестесінің үлгісі</comment>
- <comment xml:lang="ko">Excel 스프레드시트 서식</comment>
- <comment xml:lang="oc">Modèl de fuèlh de calcul Excel</comment>
- <comment xml:lang="pl">Szablon arkusza Excel</comment>
- <comment xml:lang="pt">predefinição da folha de cálculo Excel</comment>
- <comment xml:lang="pt-BR">Modelo de planilha do Excel</comment>
- <comment xml:lang="ru">Шаблон таблицы Excel</comment>
- <comment xml:lang="sk">Šablóna tabuľky aplikácie Excel</comment>
- <comment xml:lang="sl">Predloga preglednice Excel</comment>
- <comment xml:lang="sr">Екселов шаблон табеле</comment>
- <comment xml:lang="sv">Excel-kalkylarksmall</comment>
- <comment xml:lang="tr">Excel hesap çizelgesi şablonu</comment>
+ <comment xml:lang="zh_TW">Excel 試算表範本</comment>
+ <comment xml:lang="zh_CN">Excel 电子表格模板</comment>
<comment xml:lang="uk">шаблон електронної таблиці Excel</comment>
- <comment xml:lang="zh-CN">Excel 电子表格模板</comment>
- <comment xml:lang="zh-TW">Excel 試算表範本</comment>
+ <comment xml:lang="tr">Excel hesap çizelgesi şablonu</comment>
+ <comment xml:lang="sv">Excel-kalkylarksmall</comment>
+ <comment xml:lang="sr">Екселов шаблон табеле</comment>
+ <comment xml:lang="sq">gjedhe fletëllogaritjesh Excel</comment>
+ <comment xml:lang="sl">Predloga preglednice Excel</comment>
+ <comment xml:lang="si">එක්සෙල් පැතුරුම්පත් අච්චුව</comment>
+ <comment xml:lang="sk">Šablóna tabuľky aplikácie Excel</comment>
+ <comment xml:lang="ru">Шаблон таблицы Excel</comment>
+ <comment xml:lang="pt_BR">Modelo de planilha do Excel</comment>
+ <comment xml:lang="pt">predefinição da folha de cálculo Excel</comment>
+ <comment xml:lang="pl">Szablon arkusza Excel</comment>
+ <comment xml:lang="oc">Modèl de fuèlh de calcul Excel</comment>
+ <comment xml:lang="nl">Excel-rekenbladsjabloon</comment>
+ <comment xml:lang="ko">Excel 스프레드시트 서식</comment>
+ <comment xml:lang="kk">Excel кестесінің үлгісі</comment>
+ <comment xml:lang="ja">Excel スプレッドシートテンプレート</comment>
+ <comment xml:lang="it">Modello foglio di calcolo Excel</comment>
+ <comment xml:lang="is">Excel töflureiknisniðmát</comment>
+ <comment xml:lang="id">Templat lembar kerja Excel</comment>
+ <comment xml:lang="ia">Patrono de folio de calculo Excel</comment>
+ <comment xml:lang="hu">Excel munkafüzetsablon</comment>
+ <comment xml:lang="hr">Predložak Excel proračunske tablice</comment>
+ <comment xml:lang="he">תבנית גיליון נתונים של Excel</comment>
+ <comment xml:lang="gl">Modelo de folla de cálculo de Excel</comment>
+ <comment xml:lang="ga">teimpléad scarbhileoige Excel</comment>
+ <comment xml:lang="fur">model sfuei di calcul Excel</comment>
+ <comment xml:lang="fr">modèle de feuille de calcul Excel</comment>
+ <comment xml:lang="fi">Excel-taulukkomalli</comment>
+ <comment xml:lang="eu">Excel kalkulu-orri txantiloia</comment>
+ <comment xml:lang="es">plantilla de hoja de cálculo de Excel</comment>
+ <comment xml:lang="en_GB">Excel spreadsheet template</comment>
+ <comment xml:lang="el">Πρότυπο λογιστικού φύλλου Excel</comment>
+ <comment xml:lang="de">Excel-Tabellenvorlage</comment>
+ <comment xml:lang="da">Excel-regnearksskabelon</comment>
+ <comment xml:lang="cs">šablona tabulky Excel</comment>
+ <comment xml:lang="ca">plantilla de full de càlcul d'Excel</comment>
+ <comment xml:lang="bg">Шаблон за таблица — Excel</comment>
+ <comment xml:lang="be">шаблон электроннай табліцы Excel</comment>
+ <comment xml:lang="ar">قالب جدول اكسل</comment>
+ <comment xml:lang="af">Excel-sigbladsjabloon</comment>
<generic-icon name="x-office-spreadsheet"/>
<glob pattern="*.xltm"/>
<sub-class-of type="application/vnd.openxmlformats-officedocument.spreadsheetml.template"/>
</mime-type>
<mime-type type="application/vnd.ms-powerpoint">
<comment>PowerPoint presentation</comment>
- <comment xml:lang="af">PowerPoint-voorlegging</comment>
- <comment xml:lang="ar">عرض تقديمي PowerPoint</comment>
- <comment xml:lang="be-Latn">Prezentacyja PowerPoint</comment>
- <comment xml:lang="bg">Презентация — PowerPoint</comment>
- <comment xml:lang="ca">presentació de PowerPoint</comment>
- <comment xml:lang="cs">prezentace PowerPoint</comment>
- <comment xml:lang="da">PowerPoint-præsentation</comment>
- <comment xml:lang="de">PowerPoint-Präsentation</comment>
- <comment xml:lang="el">Παρουσίαση PowerPoint</comment>
- <comment xml:lang="en-GB">PowerPoint presentation</comment>
- <comment xml:lang="eo">PowerPoint-prezentaĵo</comment>
- <comment xml:lang="es">presentación de PowerPoint</comment>
- <comment xml:lang="eu">PowerPoint aurkezpena</comment>
- <comment xml:lang="fi">PowerPoint-esitys</comment>
- <comment xml:lang="fo">PowerPoint framløga</comment>
- <comment xml:lang="fr">présentation PowerPoint</comment>
- <comment xml:lang="fur">presentazion PowerPoint</comment>
- <comment xml:lang="ga">láithreoireacht PowerPoint</comment>
- <comment xml:lang="gl">presentación de PowerPoint</comment>
- <comment xml:lang="he">מצגת PowerPoint</comment>
- <comment xml:lang="hr">PowerPoint prezentacija</comment>
- <comment xml:lang="hu">PowerPoint prezentáció</comment>
- <comment xml:lang="ia">Presentation PowerPoint</comment>
- <comment xml:lang="id">Presentasi PowerPoint</comment>
- <comment xml:lang="it">Presentazione PowerPoint</comment>
- <comment xml:lang="ja">PowerPoint プレゼンテーション</comment>
- <comment xml:lang="kk">PowerPoint презентациясы</comment>
- <comment xml:lang="ko">PowerPoint 프레젠테이션</comment>
- <comment xml:lang="lt">PowerPoint pateiktis</comment>
- <comment xml:lang="lv">PowerPoint prezentācija</comment>
- <comment xml:lang="nb">PowerPoint-presentasjon</comment>
- <comment xml:lang="nl">PowerPoint-presentatie</comment>
- <comment xml:lang="nn">PowerPoint-presentasjon</comment>
- <comment xml:lang="oc">presentacion PowerPoint</comment>
- <comment xml:lang="pl">Prezentacja PowerPoint</comment>
- <comment xml:lang="pt">apresentação PowerPoint</comment>
- <comment xml:lang="pt-BR">Apresentação do PowerPoint</comment>
- <comment xml:lang="ro">Prezentare PowerPoint</comment>
- <comment xml:lang="ru">Презентация PowerPoint</comment>
- <comment xml:lang="sk">Prezentácia PowerPoint</comment>
- <comment xml:lang="sl">Predstavitev Microsoft PowerPoint</comment>
- <comment xml:lang="sq">Prezantim PowerPoint</comment>
- <comment xml:lang="sr">Пауер поинт презентација</comment>
- <comment xml:lang="sv">PowerPoint-presentation</comment>
- <comment xml:lang="tr">PowerPoint sunumu</comment>
- <comment xml:lang="uk">презентація PowerPoint</comment>
+ <comment xml:lang="zh_TW">PowerPoint 簡報</comment>
+ <comment xml:lang="zh_CN">PowerPoint 演示文稿</comment>
<comment xml:lang="vi">Trình diễn PowerPoint</comment>
- <comment xml:lang="zh-CN">PowerPoint 演示文稿</comment>
- <comment xml:lang="zh-TW">PowerPoint 簡報</comment>
+ <comment xml:lang="uk">презентація PowerPoint</comment>
+ <comment xml:lang="tr">PowerPoint sunumu</comment>
+ <comment xml:lang="sv">PowerPoint-presentation</comment>
+ <comment xml:lang="sr">Пауер поинт презентација</comment>
+ <comment xml:lang="sq">paraqitje PowerPoint</comment>
+ <comment xml:lang="sl">Predstavitev Microsoft PowerPoint</comment>
+ <comment xml:lang="si">PowerPoint ඉදිරිපත් කිරීම</comment>
+ <comment xml:lang="sk">Prezentácia PowerPoint</comment>
+ <comment xml:lang="ru">Презентация PowerPoint</comment>
+ <comment xml:lang="ro">Prezentare PowerPoint</comment>
+ <comment xml:lang="pt_BR">Apresentação do PowerPoint</comment>
+ <comment xml:lang="pt">apresentação PowerPoint</comment>
+ <comment xml:lang="pl">Prezentacja PowerPoint</comment>
+ <comment xml:lang="oc">presentacion PowerPoint</comment>
+ <comment xml:lang="nn">PowerPoint-presentasjon</comment>
+ <comment xml:lang="nl">PowerPoint-presentatie</comment>
+ <comment xml:lang="nb">PowerPoint-presentasjon</comment>
+ <comment xml:lang="lv">PowerPoint prezentācija</comment>
+ <comment xml:lang="lt">PowerPoint pateiktis</comment>
+ <comment xml:lang="ko">PowerPoint 프레젠테이션</comment>
+ <comment xml:lang="kk">PowerPoint презентациясы</comment>
+ <comment xml:lang="ja">PowerPoint プレゼンテーション</comment>
+ <comment xml:lang="it">Presentazione PowerPoint</comment>
+ <comment xml:lang="is">PowerPoint kynning</comment>
+ <comment xml:lang="id">Presentasi PowerPoint</comment>
+ <comment xml:lang="ia">Presentation PowerPoint</comment>
+ <comment xml:lang="hu">PowerPoint prezentáció</comment>
+ <comment xml:lang="hr">PowerPoint prezentacija</comment>
+ <comment xml:lang="he">מצגת PowerPoint</comment>
+ <comment xml:lang="gl">presentación de PowerPoint</comment>
+ <comment xml:lang="ga">láithreoireacht PowerPoint</comment>
+ <comment xml:lang="fur">presentazion PowerPoint</comment>
+ <comment xml:lang="fr">présentation PowerPoint</comment>
+ <comment xml:lang="fo">PowerPoint framløga</comment>
+ <comment xml:lang="fi">PowerPoint-esitys</comment>
+ <comment xml:lang="eu">PowerPoint aurkezpena</comment>
+ <comment xml:lang="es">presentación de PowerPoint</comment>
+ <comment xml:lang="eo">PowerPoint-prezentaĵo</comment>
+ <comment xml:lang="en_GB">PowerPoint presentation</comment>
+ <comment xml:lang="el">Παρουσίαση PowerPoint</comment>
+ <comment xml:lang="de">PowerPoint-Präsentation</comment>
+ <comment xml:lang="da">PowerPoint-præsentation</comment>
+ <comment xml:lang="cs">prezentace PowerPoint</comment>
+ <comment xml:lang="ca">presentació de PowerPoint</comment>
+ <comment xml:lang="bg">Презентация — PowerPoint</comment>
+ <comment xml:lang="be@latin">Prezentacyja PowerPoint</comment>
+ <comment xml:lang="be">прэзентацыя PowerPoint</comment>
+ <comment xml:lang="ar">عرض تقديمي بوربوينت</comment>
+ <comment xml:lang="af">PowerPoint-voorlegging</comment>
+ <sub-class-of type="application/x-ole-storage"/>
<generic-icon name="x-office-presentation"/>
<glob pattern="*.ppz"/>
<glob pattern="*.ppt"/>
@@ -3412,529 +3800,657 @@ command to generate the output files.
</mime-type>
<mime-type type="application/vnd.ms-powerpoint.addin.macroEnabled.12">
<comment>PowerPoint add-in</comment>
- <comment xml:lang="af">PowerPoint-byvoeging</comment>
- <comment xml:lang="bg">Приставка — PowerPoint</comment>
- <comment xml:lang="ca">complement de PowerPoint</comment>
- <comment xml:lang="cs">doplněk PowerPoint</comment>
- <comment xml:lang="da">PowerPoint-tilføjelse</comment>
- <comment xml:lang="de">PowerPoint Add-in</comment>
- <comment xml:lang="el">Πρόσθετο PowerPoint</comment>
- <comment xml:lang="en-GB">PowerPoint add-in</comment>
- <comment xml:lang="es">complemento de PowerPoint</comment>
- <comment xml:lang="eu">PowerPoint gehigarria</comment>
- <comment xml:lang="fi">PowerPoint-lisäosa</comment>
- <comment xml:lang="fr">complément PowerPoint</comment>
- <comment xml:lang="fur">zonte PowerPoint</comment>
- <comment xml:lang="ga">breiseán PowerPoint</comment>
- <comment xml:lang="gl">complemento de PowerPoint</comment>
- <comment xml:lang="he">תוסף של PowerPoint</comment>
- <comment xml:lang="hr">PowerPoint dodatak</comment>
- <comment xml:lang="hu">PowerPoint bővítmény</comment>
- <comment xml:lang="ia">Add-in PowerPoint</comment>
- <comment xml:lang="id">Add-in PowerPoint</comment>
- <comment xml:lang="it">Add-in PowerPoint</comment>
- <comment xml:lang="ja">PowerPoint アドイン</comment>
- <comment xml:lang="ka">PowerPoint-ის დამატება</comment>
- <comment xml:lang="kk">PowerPoint қосымшасы</comment>
- <comment xml:lang="ko">PowerPoint 추가 기능</comment>
- <comment xml:lang="lv">PowerPoint pievienojumprogramma</comment>
- <comment xml:lang="nl">PowerPoint add-in</comment>
- <comment xml:lang="oc">complement PowerPoint</comment>
- <comment xml:lang="pl">Dodatek PowerPoint</comment>
- <comment xml:lang="pt">extensão PowerPoint</comment>
- <comment xml:lang="pt-BR">Suplemento do PowerPoint</comment>
- <comment xml:lang="ru">Дополнение PowerPoint</comment>
- <comment xml:lang="sk">Doplnok aplikácie PowerPoint </comment>
- <comment xml:lang="sl">Vstavek PowerPoint</comment>
- <comment xml:lang="sr">Пауер поинт додатак</comment>
- <comment xml:lang="sv">PowerPoint-tillägg</comment>
- <comment xml:lang="tr">PowerPoint eklentisi</comment>
+ <comment xml:lang="zh_TW">PowerPoint 增益集</comment>
+ <comment xml:lang="zh_CN">PowerPoint 外接程序</comment>
<comment xml:lang="uk">додаток PowerPoint</comment>
- <comment xml:lang="zh-CN">PowerPoint 外接程序</comment>
- <comment xml:lang="zh-TW">PowerPoint 增益集</comment>
+ <comment xml:lang="tr">PowerPoint eklentisi</comment>
+ <comment xml:lang="sv">PowerPoint-tillägg</comment>
+ <comment xml:lang="sr">Пауер поинт додатак</comment>
+ <comment xml:lang="sq">shtojcë PowerPoint</comment>
+ <comment xml:lang="sl">Vstavek PowerPoint</comment>
+ <comment xml:lang="si">PowerPoint ඇඩෝනය</comment>
+ <comment xml:lang="sk">Doplnok aplikácie PowerPoint </comment>
+ <comment xml:lang="ru">Дополнение PowerPoint</comment>
+ <comment xml:lang="pt_BR">Suplemento do PowerPoint</comment>
+ <comment xml:lang="pt">extensão PowerPoint</comment>
+ <comment xml:lang="pl">Dodatek PowerPoint</comment>
+ <comment xml:lang="oc">complement PowerPoint</comment>
+ <comment xml:lang="nl">PowerPoint-add-in</comment>
+ <comment xml:lang="lv">PowerPoint pievienojumprogramma</comment>
+ <comment xml:lang="ko">PowerPoint 추가 기능</comment>
+ <comment xml:lang="kk">PowerPoint қосымшасы</comment>
+ <comment xml:lang="ka">PowerPoint-ის დამატება</comment>
+ <comment xml:lang="ja">PowerPoint アドイン</comment>
+ <comment xml:lang="it">Add-in PowerPoint</comment>
+ <comment xml:lang="is">PowerPoint viðbót</comment>
+ <comment xml:lang="id">Add-in PowerPoint</comment>
+ <comment xml:lang="ia">Add-in PowerPoint</comment>
+ <comment xml:lang="hu">PowerPoint bővítmény</comment>
+ <comment xml:lang="hr">PowerPoint dodatak</comment>
+ <comment xml:lang="he">תוסף של PowerPoint</comment>
+ <comment xml:lang="gl">complemento de PowerPoint</comment>
+ <comment xml:lang="ga">breiseán PowerPoint</comment>
+ <comment xml:lang="fur">zonte PowerPoint</comment>
+ <comment xml:lang="fr">complément PowerPoint</comment>
+ <comment xml:lang="fi">PowerPoint-lisäosa</comment>
+ <comment xml:lang="eu">PowerPoint gehigarria</comment>
+ <comment xml:lang="es">complemento de PowerPoint</comment>
+ <comment xml:lang="en_GB">PowerPoint add-in</comment>
+ <comment xml:lang="el">Πρόσθετο PowerPoint</comment>
+ <comment xml:lang="de">PowerPoint-Add-in</comment>
+ <comment xml:lang="da">PowerPoint-tilføjelse</comment>
+ <comment xml:lang="cs">doplněk PowerPoint</comment>
+ <comment xml:lang="ca">complement de PowerPoint</comment>
+ <comment xml:lang="bg">Приставка — PowerPoint</comment>
+ <comment xml:lang="be">надбудова PowerPoint</comment>
+ <comment xml:lang="ar">إضافة بوربوينت</comment>
+ <comment xml:lang="af">PowerPoint-byvoeging</comment>
<generic-icon name="x-office-presentation"/>
<glob pattern="*.ppam"/>
</mime-type>
<mime-type type="application/vnd.ms-powerpoint.presentation.macroEnabled.12">
<comment>PowerPoint presentation</comment>
- <comment xml:lang="af">PowerPoint-voorlegging</comment>
- <comment xml:lang="ar">عرض تقديمي PowerPoint</comment>
- <comment xml:lang="be-Latn">Prezentacyja PowerPoint</comment>
- <comment xml:lang="bg">Презентация — PowerPoint</comment>
- <comment xml:lang="ca">presentació de PowerPoint</comment>
- <comment xml:lang="cs">prezentace PowerPoint</comment>
- <comment xml:lang="da">PowerPoint-præsentation</comment>
- <comment xml:lang="de">PowerPoint-Präsentation</comment>
- <comment xml:lang="el">Παρουσίαση PowerPoint</comment>
- <comment xml:lang="en-GB">PowerPoint presentation</comment>
- <comment xml:lang="eo">PowerPoint-prezentaĵo</comment>
- <comment xml:lang="es">presentación de PowerPoint</comment>
- <comment xml:lang="eu">PowerPoint aurkezpena</comment>
- <comment xml:lang="fi">PowerPoint-esitys</comment>
- <comment xml:lang="fo">PowerPoint framløga</comment>
- <comment xml:lang="fr">présentation PowerPoint</comment>
- <comment xml:lang="fur">presentazion PowerPoint</comment>
- <comment xml:lang="ga">láithreoireacht PowerPoint</comment>
- <comment xml:lang="gl">presentación de PowerPoint</comment>
- <comment xml:lang="he">מצגת PowerPoint</comment>
- <comment xml:lang="hr">PowerPoint prezentacija</comment>
- <comment xml:lang="hu">PowerPoint prezentáció</comment>
- <comment xml:lang="ia">Presentation PowerPoint</comment>
- <comment xml:lang="id">Presentasi PowerPoint</comment>
- <comment xml:lang="it">Presentazione PowerPoint</comment>
- <comment xml:lang="ja">PowerPoint プレゼンテーション</comment>
- <comment xml:lang="kk">PowerPoint презентациясы</comment>
- <comment xml:lang="ko">PowerPoint 프레젠테이션</comment>
- <comment xml:lang="lt">PowerPoint pateiktis</comment>
- <comment xml:lang="lv">PowerPoint prezentācija</comment>
- <comment xml:lang="nb">PowerPoint-presentasjon</comment>
- <comment xml:lang="nl">PowerPoint-presentatie</comment>
- <comment xml:lang="nn">PowerPoint-presentasjon</comment>
- <comment xml:lang="oc">presentacion PowerPoint</comment>
- <comment xml:lang="pl">Prezentacja PowerPoint</comment>
- <comment xml:lang="pt">apresentação PowerPoint</comment>
- <comment xml:lang="pt-BR">Apresentação do PowerPoint</comment>
- <comment xml:lang="ro">Prezentare PowerPoint</comment>
- <comment xml:lang="ru">Презентация PowerPoint</comment>
- <comment xml:lang="sk">Prezentácia PowerPoint</comment>
- <comment xml:lang="sl">Predstavitev Microsoft PowerPoint</comment>
- <comment xml:lang="sq">Prezantim PowerPoint</comment>
- <comment xml:lang="sr">Пауер поинт презентација</comment>
- <comment xml:lang="sv">PowerPoint-presentation</comment>
- <comment xml:lang="tr">PowerPoint sunumu</comment>
- <comment xml:lang="uk">презентація PowerPoint</comment>
+ <comment xml:lang="zh_TW">PowerPoint 簡報</comment>
+ <comment xml:lang="zh_CN">PowerPoint 演示文稿</comment>
<comment xml:lang="vi">Trình diễn PowerPoint</comment>
- <comment xml:lang="zh-CN">PowerPoint 演示文稿</comment>
- <comment xml:lang="zh-TW">PowerPoint 簡報</comment>
+ <comment xml:lang="uk">презентація PowerPoint</comment>
+ <comment xml:lang="tr">PowerPoint sunumu</comment>
+ <comment xml:lang="sv">PowerPoint-presentation</comment>
+ <comment xml:lang="sr">Пауер поинт презентација</comment>
+ <comment xml:lang="sq">paraqitje PowerPoint</comment>
+ <comment xml:lang="sl">Predstavitev Microsoft PowerPoint</comment>
+ <comment xml:lang="si">PowerPoint ඉදිරිපත් කිරීම</comment>
+ <comment xml:lang="sk">Prezentácia PowerPoint</comment>
+ <comment xml:lang="ru">Презентация PowerPoint</comment>
+ <comment xml:lang="ro">Prezentare PowerPoint</comment>
+ <comment xml:lang="pt_BR">Apresentação do PowerPoint</comment>
+ <comment xml:lang="pt">apresentação PowerPoint</comment>
+ <comment xml:lang="pl">Prezentacja PowerPoint</comment>
+ <comment xml:lang="oc">presentacion PowerPoint</comment>
+ <comment xml:lang="nn">PowerPoint-presentasjon</comment>
+ <comment xml:lang="nl">PowerPoint-presentatie</comment>
+ <comment xml:lang="nb">PowerPoint-presentasjon</comment>
+ <comment xml:lang="lv">PowerPoint prezentācija</comment>
+ <comment xml:lang="lt">PowerPoint pateiktis</comment>
+ <comment xml:lang="ko">PowerPoint 프레젠테이션</comment>
+ <comment xml:lang="kk">PowerPoint презентациясы</comment>
+ <comment xml:lang="ja">PowerPoint プレゼンテーション</comment>
+ <comment xml:lang="it">Presentazione PowerPoint</comment>
+ <comment xml:lang="is">PowerPoint kynning</comment>
+ <comment xml:lang="id">Presentasi PowerPoint</comment>
+ <comment xml:lang="ia">Presentation PowerPoint</comment>
+ <comment xml:lang="hu">PowerPoint prezentáció</comment>
+ <comment xml:lang="hr">PowerPoint prezentacija</comment>
+ <comment xml:lang="he">מצגת PowerPoint</comment>
+ <comment xml:lang="gl">presentación de PowerPoint</comment>
+ <comment xml:lang="ga">láithreoireacht PowerPoint</comment>
+ <comment xml:lang="fur">presentazion PowerPoint</comment>
+ <comment xml:lang="fr">présentation PowerPoint</comment>
+ <comment xml:lang="fo">PowerPoint framløga</comment>
+ <comment xml:lang="fi">PowerPoint-esitys</comment>
+ <comment xml:lang="eu">PowerPoint aurkezpena</comment>
+ <comment xml:lang="es">presentación de PowerPoint</comment>
+ <comment xml:lang="eo">PowerPoint-prezentaĵo</comment>
+ <comment xml:lang="en_GB">PowerPoint presentation</comment>
+ <comment xml:lang="el">Παρουσίαση PowerPoint</comment>
+ <comment xml:lang="de">PowerPoint-Präsentation</comment>
+ <comment xml:lang="da">PowerPoint-præsentation</comment>
+ <comment xml:lang="cs">prezentace PowerPoint</comment>
+ <comment xml:lang="ca">presentació de PowerPoint</comment>
+ <comment xml:lang="bg">Презентация — PowerPoint</comment>
+ <comment xml:lang="be@latin">Prezentacyja PowerPoint</comment>
+ <comment xml:lang="be">прэзентацыя PowerPoint</comment>
+ <comment xml:lang="ar">عرض تقديمي بوربوينت</comment>
+ <comment xml:lang="af">PowerPoint-voorlegging</comment>
<generic-icon name="x-office-presentation"/>
<glob pattern="*.pptm"/>
<sub-class-of type="application/vnd.openxmlformats-officedocument.presentationml.presentation"/>
</mime-type>
<mime-type type="application/vnd.ms-powerpoint.slide.macroEnabled.12">
<comment>PowerPoint slide</comment>
- <comment xml:lang="af">PowerPoint-skyfie</comment>
- <comment xml:lang="ast">Diapositiva de PowerPoint</comment>
- <comment xml:lang="bg">Кадър — PowerPoint</comment>
- <comment xml:lang="ca">dispositiva de PowerPoint</comment>
- <comment xml:lang="cs">promítání PowerPoint</comment>
- <comment xml:lang="da">PowerPoint-dias</comment>
- <comment xml:lang="de">PowerPoint-Folie</comment>
- <comment xml:lang="el">Διαφάνεια PowerPoint</comment>
- <comment xml:lang="en-GB">PowerPoint slide</comment>
- <comment xml:lang="es">diapositiva de PowerPoint</comment>
- <comment xml:lang="eu">PowerPoint diapositiba</comment>
- <comment xml:lang="fi">PowerPoint-dia</comment>
- <comment xml:lang="fr">diapositive PowerPoint</comment>
- <comment xml:lang="fur">diapositive PowerPoint</comment>
- <comment xml:lang="ga">sleamhnán PowerPoint</comment>
- <comment xml:lang="he">שקופית של PowerPoint</comment>
- <comment xml:lang="hr">PowerPoint prezentacija</comment>
- <comment xml:lang="hu">PowerPoint dia</comment>
- <comment xml:lang="ia">Diapositiva PowerPoint</comment>
- <comment xml:lang="id">Salindia PowerPoint</comment>
- <comment xml:lang="it">Diapositiva PowerPoint</comment>
- <comment xml:lang="kk">PowerPoint слайды</comment>
- <comment xml:lang="ko">PowerPoint 슬라이드</comment>
- <comment xml:lang="oc">Diapositiva PowerPoint</comment>
- <comment xml:lang="pl">Slajd PowerPoint</comment>
- <comment xml:lang="pt">diapositivo PowerPoint</comment>
- <comment xml:lang="pt-BR">Slide do PowerPoint</comment>
- <comment xml:lang="ru">Слайд PowerPoint</comment>
- <comment xml:lang="sk">Snímka aplikácie PowerPoint</comment>
- <comment xml:lang="sl">Prosojnica PowerPoint</comment>
- <comment xml:lang="sr">Пауер поинт слајд</comment>
- <comment xml:lang="sv">PowerPoint-bildspel</comment>
- <comment xml:lang="tr">PowerPoint sunusu</comment>
+ <comment xml:lang="zh_TW">PowerPoint 投影片</comment>
+ <comment xml:lang="zh_CN">PowerPoint 幻灯片</comment>
<comment xml:lang="uk">слайд PowerPoint</comment>
- <comment xml:lang="zh-CN">PowerPoint 幻灯片</comment>
- <comment xml:lang="zh-TW">PowerPoint 投影片</comment>
+ <comment xml:lang="tr">PowerPoint sunusu</comment>
+ <comment xml:lang="sv">PowerPoint-bildspel</comment>
+ <comment xml:lang="sr">Пауер поинт слајд</comment>
+ <comment xml:lang="sq">diapozitiv PowerPoint</comment>
+ <comment xml:lang="sl">Prosojnica PowerPoint</comment>
+ <comment xml:lang="si">PowerPoint ස්ලයිඩය</comment>
+ <comment xml:lang="sk">Snímka aplikácie PowerPoint</comment>
+ <comment xml:lang="ru">Слайд PowerPoint</comment>
+ <comment xml:lang="pt_BR">Slide do PowerPoint</comment>
+ <comment xml:lang="pt">diapositivo PowerPoint</comment>
+ <comment xml:lang="pl">Slajd PowerPoint</comment>
+ <comment xml:lang="oc">Diapositiva PowerPoint</comment>
+ <comment xml:lang="nl">PowerPoint-dia</comment>
+ <comment xml:lang="ko">PowerPoint 슬라이드</comment>
+ <comment xml:lang="kk">PowerPoint слайды</comment>
+ <comment xml:lang="ja">PowerPoint スライド</comment>
+ <comment xml:lang="it">Diapositiva PowerPoint</comment>
+ <comment xml:lang="is">PowerPoint skyggna</comment>
+ <comment xml:lang="id">Salindia PowerPoint</comment>
+ <comment xml:lang="ia">Diapositiva PowerPoint</comment>
+ <comment xml:lang="hu">PowerPoint dia</comment>
+ <comment xml:lang="hr">PowerPoint prezentacija</comment>
+ <comment xml:lang="he">שקופית של PowerPoint</comment>
+ <comment xml:lang="gl">Diapositiva de PowerPoint</comment>
+ <comment xml:lang="ga">sleamhnán PowerPoint</comment>
+ <comment xml:lang="fur">diapositive PowerPoint</comment>
+ <comment xml:lang="fr">diapositive PowerPoint</comment>
+ <comment xml:lang="fi">PowerPoint-dia</comment>
+ <comment xml:lang="eu">PowerPoint diapositiba</comment>
+ <comment xml:lang="es">diapositiva de PowerPoint</comment>
+ <comment xml:lang="en_GB">PowerPoint slide</comment>
+ <comment xml:lang="el">Διαφάνεια PowerPoint</comment>
+ <comment xml:lang="de">PowerPoint-Folie</comment>
+ <comment xml:lang="da">PowerPoint-dias</comment>
+ <comment xml:lang="cs">promítání PowerPoint</comment>
+ <comment xml:lang="ca">dispositiva de PowerPoint</comment>
+ <comment xml:lang="bg">Кадър — PowerPoint</comment>
+ <comment xml:lang="be">слайд PowerPoint</comment>
+ <comment xml:lang="ast">Diapositiva de PowerPoint</comment>
+ <comment xml:lang="ar">شريحة بوربوينت</comment>
+ <comment xml:lang="af">PowerPoint-skyfie</comment>
<generic-icon name="x-office-presentation"/>
<glob pattern="*.sldm"/>
<sub-class-of type="application/vnd.openxmlformats-officedocument.presentationml.slide"/>
</mime-type>
<mime-type type="application/vnd.ms-powerpoint.slideshow.macroEnabled.12">
<comment>PowerPoint presentation</comment>
- <comment xml:lang="af">PowerPoint-voorlegging</comment>
- <comment xml:lang="ar">عرض تقديمي PowerPoint</comment>
- <comment xml:lang="be-Latn">Prezentacyja PowerPoint</comment>
- <comment xml:lang="bg">Презентация — PowerPoint</comment>
- <comment xml:lang="ca">presentació de PowerPoint</comment>
- <comment xml:lang="cs">prezentace PowerPoint</comment>
- <comment xml:lang="da">PowerPoint-præsentation</comment>
- <comment xml:lang="de">PowerPoint-Präsentation</comment>
- <comment xml:lang="el">Παρουσίαση PowerPoint</comment>
- <comment xml:lang="en-GB">PowerPoint presentation</comment>
- <comment xml:lang="eo">PowerPoint-prezentaĵo</comment>
- <comment xml:lang="es">presentación de PowerPoint</comment>
- <comment xml:lang="eu">PowerPoint aurkezpena</comment>
- <comment xml:lang="fi">PowerPoint-esitys</comment>
- <comment xml:lang="fo">PowerPoint framløga</comment>
- <comment xml:lang="fr">présentation PowerPoint</comment>
- <comment xml:lang="fur">presentazion PowerPoint</comment>
- <comment xml:lang="ga">láithreoireacht PowerPoint</comment>
- <comment xml:lang="gl">presentación de PowerPoint</comment>
- <comment xml:lang="he">מצגת PowerPoint</comment>
- <comment xml:lang="hr">PowerPoint prezentacija</comment>
- <comment xml:lang="hu">PowerPoint prezentáció</comment>
- <comment xml:lang="ia">Presentation PowerPoint</comment>
- <comment xml:lang="id">Presentasi PowerPoint</comment>
- <comment xml:lang="it">Presentazione PowerPoint</comment>
- <comment xml:lang="ja">PowerPoint プレゼンテーション</comment>
- <comment xml:lang="kk">PowerPoint презентациясы</comment>
- <comment xml:lang="ko">PowerPoint 프레젠테이션</comment>
- <comment xml:lang="lt">PowerPoint pateiktis</comment>
- <comment xml:lang="lv">PowerPoint prezentācija</comment>
- <comment xml:lang="nb">PowerPoint-presentasjon</comment>
- <comment xml:lang="nl">PowerPoint-presentatie</comment>
- <comment xml:lang="nn">PowerPoint-presentasjon</comment>
- <comment xml:lang="oc">presentacion PowerPoint</comment>
- <comment xml:lang="pl">Prezentacja PowerPoint</comment>
- <comment xml:lang="pt">apresentação PowerPoint</comment>
- <comment xml:lang="pt-BR">Apresentação do PowerPoint</comment>
- <comment xml:lang="ro">Prezentare PowerPoint</comment>
- <comment xml:lang="ru">Презентация PowerPoint</comment>
- <comment xml:lang="sk">Prezentácia PowerPoint</comment>
- <comment xml:lang="sl">Predstavitev Microsoft PowerPoint</comment>
- <comment xml:lang="sq">Prezantim PowerPoint</comment>
- <comment xml:lang="sr">Пауер поинт презентација</comment>
- <comment xml:lang="sv">PowerPoint-presentation</comment>
- <comment xml:lang="tr">PowerPoint sunumu</comment>
- <comment xml:lang="uk">презентація PowerPoint</comment>
+ <comment xml:lang="zh_TW">PowerPoint 簡報</comment>
+ <comment xml:lang="zh_CN">PowerPoint 演示文稿</comment>
<comment xml:lang="vi">Trình diễn PowerPoint</comment>
- <comment xml:lang="zh-CN">PowerPoint 演示文稿</comment>
- <comment xml:lang="zh-TW">PowerPoint 簡報</comment>
+ <comment xml:lang="uk">презентація PowerPoint</comment>
+ <comment xml:lang="tr">PowerPoint sunumu</comment>
+ <comment xml:lang="sv">PowerPoint-presentation</comment>
+ <comment xml:lang="sr">Пауер поинт презентација</comment>
+ <comment xml:lang="sq">paraqitje PowerPoint</comment>
+ <comment xml:lang="sl">Predstavitev Microsoft PowerPoint</comment>
+ <comment xml:lang="si">PowerPoint ඉදිරිපත් කිරීම</comment>
+ <comment xml:lang="sk">Prezentácia PowerPoint</comment>
+ <comment xml:lang="ru">Презентация PowerPoint</comment>
+ <comment xml:lang="ro">Prezentare PowerPoint</comment>
+ <comment xml:lang="pt_BR">Apresentação do PowerPoint</comment>
+ <comment xml:lang="pt">apresentação PowerPoint</comment>
+ <comment xml:lang="pl">Prezentacja PowerPoint</comment>
+ <comment xml:lang="oc">presentacion PowerPoint</comment>
+ <comment xml:lang="nn">PowerPoint-presentasjon</comment>
+ <comment xml:lang="nl">PowerPoint-presentatie</comment>
+ <comment xml:lang="nb">PowerPoint-presentasjon</comment>
+ <comment xml:lang="lv">PowerPoint prezentācija</comment>
+ <comment xml:lang="lt">PowerPoint pateiktis</comment>
+ <comment xml:lang="ko">PowerPoint 프레젠테이션</comment>
+ <comment xml:lang="kk">PowerPoint презентациясы</comment>
+ <comment xml:lang="ja">PowerPoint プレゼンテーション</comment>
+ <comment xml:lang="it">Presentazione PowerPoint</comment>
+ <comment xml:lang="is">PowerPoint kynning</comment>
+ <comment xml:lang="id">Presentasi PowerPoint</comment>
+ <comment xml:lang="ia">Presentation PowerPoint</comment>
+ <comment xml:lang="hu">PowerPoint prezentáció</comment>
+ <comment xml:lang="hr">PowerPoint prezentacija</comment>
+ <comment xml:lang="he">מצגת PowerPoint</comment>
+ <comment xml:lang="gl">presentación de PowerPoint</comment>
+ <comment xml:lang="ga">láithreoireacht PowerPoint</comment>
+ <comment xml:lang="fur">presentazion PowerPoint</comment>
+ <comment xml:lang="fr">présentation PowerPoint</comment>
+ <comment xml:lang="fo">PowerPoint framløga</comment>
+ <comment xml:lang="fi">PowerPoint-esitys</comment>
+ <comment xml:lang="eu">PowerPoint aurkezpena</comment>
+ <comment xml:lang="es">presentación de PowerPoint</comment>
+ <comment xml:lang="eo">PowerPoint-prezentaĵo</comment>
+ <comment xml:lang="en_GB">PowerPoint presentation</comment>
+ <comment xml:lang="el">Παρουσίαση PowerPoint</comment>
+ <comment xml:lang="de">PowerPoint-Präsentation</comment>
+ <comment xml:lang="da">PowerPoint-præsentation</comment>
+ <comment xml:lang="cs">prezentace PowerPoint</comment>
+ <comment xml:lang="ca">presentació de PowerPoint</comment>
+ <comment xml:lang="bg">Презентация — PowerPoint</comment>
+ <comment xml:lang="be@latin">Prezentacyja PowerPoint</comment>
+ <comment xml:lang="be">прэзентацыя PowerPoint</comment>
+ <comment xml:lang="ar">عرض تقديمي بوربوينت</comment>
+ <comment xml:lang="af">PowerPoint-voorlegging</comment>
<generic-icon name="x-office-presentation"/>
<glob pattern="*.ppsm"/>
<sub-class-of type="application/vnd.openxmlformats-officedocument.presentationml.slideshow"/>
</mime-type>
<mime-type type="application/vnd.ms-powerpoint.template.macroEnabled.12">
<comment>PowerPoint presentation template</comment>
- <comment xml:lang="af">PowerPoint-voorleggingsjabloon</comment>
- <comment xml:lang="ast">Plantía de presentaciones de PowerPoint</comment>
- <comment xml:lang="bg">Шаблон за презентация — PowerPoint</comment>
- <comment xml:lang="ca">plantilla de presentació de PowerPoint</comment>
- <comment xml:lang="cs">šablona prezentace PowerPoint</comment>
- <comment xml:lang="da">PowerPoint-præsentationsskabelon</comment>
- <comment xml:lang="de">PowerPoint-Präsentationsvorlage</comment>
- <comment xml:lang="el">Πρότυπο παρουσίασης PowerPoint</comment>
- <comment xml:lang="en-GB">PowerPoint presentation template</comment>
- <comment xml:lang="es">plantilla de presentación de PowerPoint</comment>
- <comment xml:lang="eu">PowerPoint aurkezpen txantiloia</comment>
- <comment xml:lang="fi">PowerPoint-esitysmalli</comment>
- <comment xml:lang="fr">modèle de présentation PowerPoint</comment>
- <comment xml:lang="fur">model di presentazion PowerPoint</comment>
- <comment xml:lang="ga">teimpléad láithreoireachta PowerPoint</comment>
- <comment xml:lang="he">תבנית מצגת PowerPoint</comment>
- <comment xml:lang="hr">Predložak PowerPoint prezentacije</comment>
- <comment xml:lang="hu">PowerPoint bemutatósablon</comment>
- <comment xml:lang="ia">Patrono de presentation PowerPoint</comment>
- <comment xml:lang="id">Templat presentasi PowerPoint</comment>
- <comment xml:lang="it">Modello presentazione PowerPoint</comment>
- <comment xml:lang="kk">PowerPoint презентация үлгісі</comment>
- <comment xml:lang="ko">PowerPoint 프레젠테이션 서식</comment>
- <comment xml:lang="oc">Modèl de presentacion PowerPoint</comment>
- <comment xml:lang="pl">Szablon prezentacji PowerPoint</comment>
- <comment xml:lang="pt">predefinição de apresentação PowerPoint</comment>
- <comment xml:lang="pt-BR">Modelo de apresentação do PowerPoint</comment>
- <comment xml:lang="ru">Шаблон презентации PowerPoint</comment>
- <comment xml:lang="sk">Šablóna prezentácie aplikácie PowerPoint</comment>
- <comment xml:lang="sl">Predloga predstavitve PowerPoint</comment>
- <comment xml:lang="sr">Шаблон презентације Пауер поинта</comment>
- <comment xml:lang="sv">PowerPoint-presentationsmall</comment>
- <comment xml:lang="tr">PowerPoint sunum şablonu</comment>
+ <comment xml:lang="zh_TW">PowerPoint 簡報範本</comment>
+ <comment xml:lang="zh_CN">PowerPoint 演示文稿模板</comment>
<comment xml:lang="uk">шаблон презентації PowerPoint</comment>
- <comment xml:lang="zh-CN">PowerPoint 演示文稿模板</comment>
- <comment xml:lang="zh-TW">PowerPoint 簡報範本</comment>
+ <comment xml:lang="tr">PowerPoint sunum şablonu</comment>
+ <comment xml:lang="sv">PowerPoint-presentationsmall</comment>
+ <comment xml:lang="sr">Шаблон презентације Пауер поинта</comment>
+ <comment xml:lang="sq">gjedhe paraqitjeje PowerPoint</comment>
+ <comment xml:lang="sl">Predloga predstavitve PowerPoint</comment>
+ <comment xml:lang="si">PowerPoint ඉදිරිපත් කිරීමේ අච්චුව</comment>
+ <comment xml:lang="sk">Šablóna prezentácie aplikácie PowerPoint</comment>
+ <comment xml:lang="ru">Шаблон презентации PowerPoint</comment>
+ <comment xml:lang="pt_BR">Modelo de apresentação do PowerPoint</comment>
+ <comment xml:lang="pt">predefinição de apresentação PowerPoint</comment>
+ <comment xml:lang="pl">Szablon prezentacji PowerPoint</comment>
+ <comment xml:lang="oc">Modèl de presentacion PowerPoint</comment>
+ <comment xml:lang="nl">PowerPoint-presentatiesjabloon</comment>
+ <comment xml:lang="ko">PowerPoint 프레젠테이션 서식</comment>
+ <comment xml:lang="kk">PowerPoint презентация үлгісі</comment>
+ <comment xml:lang="ja">PowerPoint プレゼンテーションテンプレート</comment>
+ <comment xml:lang="it">Modello presentazione PowerPoint</comment>
+ <comment xml:lang="is">PowerPoint sniðmát fyrir glærukynningu</comment>
+ <comment xml:lang="id">Templat presentasi PowerPoint</comment>
+ <comment xml:lang="ia">Patrono de presentation PowerPoint</comment>
+ <comment xml:lang="hu">PowerPoint bemutatósablon</comment>
+ <comment xml:lang="hr">Predložak PowerPoint prezentacije</comment>
+ <comment xml:lang="he">תבנית מצגת PowerPoint</comment>
+ <comment xml:lang="gl">Modelo de presentación de PowerPoint</comment>
+ <comment xml:lang="ga">teimpléad láithreoireachta PowerPoint</comment>
+ <comment xml:lang="fur">model di presentazion PowerPoint</comment>
+ <comment xml:lang="fr">modèle de présentation PowerPoint</comment>
+ <comment xml:lang="fi">PowerPoint-esitysmalli</comment>
+ <comment xml:lang="eu">PowerPoint aurkezpen txantiloia</comment>
+ <comment xml:lang="es">plantilla de presentación de PowerPoint</comment>
+ <comment xml:lang="en_GB">PowerPoint presentation template</comment>
+ <comment xml:lang="el">Πρότυπο παρουσίασης PowerPoint</comment>
+ <comment xml:lang="de">PowerPoint-Präsentationsvorlage</comment>
+ <comment xml:lang="da">PowerPoint-præsentationsskabelon</comment>
+ <comment xml:lang="cs">šablona prezentace PowerPoint</comment>
+ <comment xml:lang="ca">plantilla de presentació de PowerPoint</comment>
+ <comment xml:lang="bg">Шаблон за презентация — PowerPoint</comment>
+ <comment xml:lang="be">шаблон прэзентацыі PowerPoint</comment>
+ <comment xml:lang="ast">Plantía de presentaciones de PowerPoint</comment>
+ <comment xml:lang="ar">قالب عرض بوربوينت</comment>
+ <comment xml:lang="af">PowerPoint-voorleggingsjabloon</comment>
<generic-icon name="x-office-presentation"/>
<glob pattern="*.potm"/>
<sub-class-of type="application/vnd.openxmlformats-officedocument.presentationml.template"/>
</mime-type>
- <mime-type type="application/vnd.ms-visio.drawing.main+xml">
+ <mime-type type="application/vnd.ms-visio.drawing.main+xml">
<comment>Office Open XML Visio drawing</comment>
- <comment xml:lang="bg">Чертеж — Office Open XML Visio</comment>
- <comment xml:lang="ca">dibuix en Office Open XML de Visio</comment>
- <comment xml:lang="da">Office Open XML Visio-tegning</comment>
- <comment xml:lang="de">Office-Open-XML-Visio-Zeichnung</comment>
- <comment xml:lang="en-GB">Office Open XML Visio drawing</comment>
- <comment xml:lang="es">dibujo Office Open XML de Visio</comment>
- <comment xml:lang="eu">Office Open XML Visio marrazkia</comment>
- <comment xml:lang="fi">Office Open XML Visio -piirros</comment>
- <comment xml:lang="fr">dessin Visio Office Open XML</comment>
- <comment xml:lang="hr">Office Open XML Visio crtež</comment>
- <comment xml:lang="hu">Office Open XML Visio rajz</comment>
- <comment xml:lang="id">Gambar Office Open XML Visio</comment>
- <comment xml:lang="it">Disegno Visio Office Open XML</comment>
- <comment xml:lang="kk">Office Open XML Visio суреті</comment>
- <comment xml:lang="ko">오피스 오픈 XML 비지오 드로잉</comment>
- <comment xml:lang="pl">Rysunek Office Open XML Visio</comment>
- <comment xml:lang="pt">desenho Visio do Open Office XML</comment>
- <comment xml:lang="pt-BR">Desenho do Office Open XML Visio</comment>
- <comment xml:lang="ru">Рисунок Visio формата Office Open XML</comment>
- <comment xml:lang="sk">Kresba aplikácie Office Open XML Visio</comment>
- <comment xml:lang="sl">Risba Office Open XML Visio</comment>
- <comment xml:lang="sv">Office Open XML Visio-ritning</comment>
- <comment xml:lang="tr">Office Open XML Visio çizimi</comment>
+ <comment xml:lang="zh_TW">Office Open XML Visio 繪圖</comment>
+ <comment xml:lang="zh_CN">Office Open XML Visio 绘图</comment>
<comment xml:lang="uk">малюнок Visio Office Open у XML</comment>
- <comment xml:lang="zh-CN">Office Open XML Visio 绘图</comment>
- <comment xml:lang="zh-TW">Office Open XML Visio 繪圖</comment>
+ <comment xml:lang="tr">Office Open XML Visio çizimi</comment>
+ <comment xml:lang="sv">Office Open XML Visio-ritning</comment>
+ <comment xml:lang="sq">vizatim Office Open XML Visio</comment>
+ <comment xml:lang="sl">Risba Office Open XML Visio</comment>
+ <comment xml:lang="si">කාර්යාල විවෘත XML Visio ඇඳීම</comment>
+ <comment xml:lang="sk">Kresba aplikácie Office Open XML Visio</comment>
+ <comment xml:lang="ru">Рисунок Visio формата Office Open XML</comment>
+ <comment xml:lang="pt_BR">Desenho do Office Open XML Visio</comment>
+ <comment xml:lang="pt">desenho Visio do Open Office XML</comment>
+ <comment xml:lang="pl">Rysunek Office Open XML Visio</comment>
+ <comment xml:lang="nl">Office Open XML Visio-tekening</comment>
+ <comment xml:lang="ko">오피스 오픈 XML Visio 드로잉</comment>
+ <comment xml:lang="kk">Office Open XML Visio суреті</comment>
+ <comment xml:lang="ja">Office Open XML Visio ドロー</comment>
+ <comment xml:lang="it">Disegno Visio Office Open XML</comment>
+ <comment xml:lang="is">Office Open XML Visio teikning</comment>
+ <comment xml:lang="id">Gambar Office Open XML Visio</comment>
+ <comment xml:lang="hu">Office Open XML Visio rajz</comment>
+ <comment xml:lang="hr">Office Open XML Visio crtež</comment>
+ <comment xml:lang="he">ציור Office Open XML Visio</comment>
+ <comment xml:lang="gl">Debuxo de Office Open XML Visio</comment>
+ <comment xml:lang="fr">dessin Visio Office Open XML</comment>
+ <comment xml:lang="fi">Office Open XML Visio -piirros</comment>
+ <comment xml:lang="eu">Office Open XML Visio marrazkia</comment>
+ <comment xml:lang="es">dibujo Office Open XML de Visio</comment>
+ <comment xml:lang="en_GB">Office Open XML Visio drawing</comment>
+ <comment xml:lang="de">Office-Open-XML-Visio-Zeichnung</comment>
+ <comment xml:lang="da">Office Open XML Visio-tegning</comment>
+ <comment xml:lang="ca">dibuix en Office Open XML de Visio</comment>
+ <comment xml:lang="bg">Чертеж — Office Open XML Visio</comment>
+ <comment xml:lang="be">рысунак Office Open XML Visio</comment>
+ <comment xml:lang="ar">رسم فيزيو Open XML</comment>
<generic-icon name="image-x-generic"/>
<glob pattern="*.vsdx"/>
<sub-class-of type="application/zip"/>
</mime-type>
<mime-type type="application/vnd.ms-visio.template.main+xml">
<comment>Office Open XML Visio template</comment>
- <comment xml:lang="bg">Шаблон за чертеж — Office Open XML Visio</comment>
- <comment xml:lang="ca">plantilla en Office Open XML de Visio</comment>
- <comment xml:lang="da">Office Open XML Visio-skabelon</comment>
- <comment xml:lang="de">Office-Open-XML-Visio-Vorlage</comment>
- <comment xml:lang="en-GB">Office Open XML Visio template</comment>
- <comment xml:lang="es">plantilla Office Open XML de Visio</comment>
- <comment xml:lang="eu">Office Open XML Visio txantiloia</comment>
- <comment xml:lang="fi">Office Open XML Visio -malli</comment>
- <comment xml:lang="fr">modèle Visio Office Open XML</comment>
- <comment xml:lang="hr">Office Open XML Visio predložak</comment>
- <comment xml:lang="hu">Office Open XML Visio sablon</comment>
- <comment xml:lang="id">Templat Office Open XML Visio</comment>
- <comment xml:lang="it">Modello Visio Office Open XML</comment>
- <comment xml:lang="kk">Office Open XML Visio үлгісі</comment>
- <comment xml:lang="ko">오피스 오픈 XML 비지오 양식</comment>
- <comment xml:lang="pl">Szablon Office Open XML Visio</comment>
- <comment xml:lang="pt">predefinição Visio do Open Office XML</comment>
- <comment xml:lang="pt-BR">Modelo Office Open XML Visio</comment>
- <comment xml:lang="ru">Шаблон Visio формата Office Open XML</comment>
- <comment xml:lang="sk">Šablóna aplikácie Office Open XML Visio</comment>
- <comment xml:lang="sl">Predloga Office Open XML Visio</comment>
- <comment xml:lang="sv">Office Open XML Visio-mall</comment>
- <comment xml:lang="tr">Office Open XML Visio şablonu</comment>
+ <comment xml:lang="zh_TW">Office Open XML Visio 範本</comment>
+ <comment xml:lang="zh_CN">Office Open XML Visio 模板</comment>
<comment xml:lang="uk">шаблон Visio Office Open у XML</comment>
- <comment xml:lang="zh-CN">Office Open XML Visio 模板</comment>
- <comment xml:lang="zh-TW">Office Open XML Visio 範本</comment>
+ <comment xml:lang="tr">Office Open XML Visio şablonu</comment>
+ <comment xml:lang="sv">Office Open XML Visio-mall</comment>
+ <comment xml:lang="sq">gjedhe Office Open XML Visio</comment>
+ <comment xml:lang="sl">Predloga Office Open XML Visio</comment>
+ <comment xml:lang="si">Office Open XML Visio අච්චුව</comment>
+ <comment xml:lang="sk">Šablóna aplikácie Office Open XML Visio</comment>
+ <comment xml:lang="ru">Шаблон Visio формата Office Open XML</comment>
+ <comment xml:lang="pt_BR">Modelo Office Open XML Visio</comment>
+ <comment xml:lang="pt">predefinição Visio do Open Office XML</comment>
+ <comment xml:lang="pl">Szablon Office Open XML Visio</comment>
+ <comment xml:lang="nl">Office Open XML Visio-sjabloon</comment>
+ <comment xml:lang="ko">오피스 오픈 XML Visio 양식</comment>
+ <comment xml:lang="kk">Office Open XML Visio үлгісі</comment>
+ <comment xml:lang="ja">Office Open XML Visio テンプレート</comment>
+ <comment xml:lang="it">Modello Visio Office Open XML</comment>
+ <comment xml:lang="is">Office Open XML Visio sniðmát</comment>
+ <comment xml:lang="id">Templat Office Open XML Visio</comment>
+ <comment xml:lang="hu">Office Open XML Visio sablon</comment>
+ <comment xml:lang="hr">Office Open XML Visio predložak</comment>
+ <comment xml:lang="he">תבנית Office Open XML Visio</comment>
+ <comment xml:lang="gl">Modelo de Office Open XML Visio</comment>
+ <comment xml:lang="fr">modèle Visio Office Open XML</comment>
+ <comment xml:lang="fi">Office Open XML Visio -malli</comment>
+ <comment xml:lang="eu">Office Open XML Visio txantiloia</comment>
+ <comment xml:lang="es">plantilla Office Open XML de Visio</comment>
+ <comment xml:lang="en_GB">Office Open XML Visio template</comment>
+ <comment xml:lang="de">Office-Open-XML-Visio-Vorlage</comment>
+ <comment xml:lang="da">Office Open XML Visio-skabelon</comment>
+ <comment xml:lang="ca">plantilla en Office Open XML de Visio</comment>
+ <comment xml:lang="bg">Шаблон за чертеж — Office Open XML Visio</comment>
+ <comment xml:lang="be">шаблон Office Open XML Visio</comment>
+ <comment xml:lang="ar">قالب فيزيو Open XML</comment>
<generic-icon name="image-x-generic"/>
<glob pattern="*.vstx"/>
<sub-class-of type="application/zip"/>
</mime-type>
<mime-type type="application/vnd.ms-visio.stencil.main+xml">
<comment>Office Open XML Visio stencil</comment>
- <comment xml:lang="bg">Образци — Office Open XML Visio</comment>
- <comment xml:lang="ca">patró en Office Open XML de Visio</comment>
- <comment xml:lang="da">Office Open XML Visio-stencil</comment>
- <comment xml:lang="de">Office-Open-XML-Visio-Schablone</comment>
- <comment xml:lang="en-GB">Office Open XML Visio stencil</comment>
- <comment xml:lang="es">galería de símbolos Office Open XML de Visio</comment>
- <comment xml:lang="eu">Office Open XML Visio txantiloia</comment>
- <comment xml:lang="fi">Office Open XML Visio -malli</comment>
- <comment xml:lang="fr">stencil Visio Office Open XML</comment>
- <comment xml:lang="hr">Office Open XML Visio šablona</comment>
- <comment xml:lang="hu">Office Open XML Visio stencil</comment>
- <comment xml:lang="id">Stensil Office Open XML Visio</comment>
- <comment xml:lang="it">Stencil Visio Office Open XML</comment>
- <comment xml:lang="kk">Office Open XML Visio трафареті</comment>
- <comment xml:lang="ko">오피스 오픈 XML 비지오 스텐실</comment>
- <comment xml:lang="pl">Wzór Office Open XML Visio</comment>
- <comment xml:lang="pt">estêncil Visio do Open Office XML</comment>
- <comment xml:lang="pt-BR">Estêncil do Office Open XML Visio</comment>
- <comment xml:lang="ru">Трафарет Visio формата Office Open XML</comment>
- <comment xml:lang="sv">Office Open XML Visio-stencil</comment>
- <comment xml:lang="tr">Office Open XML Visio kalıbı</comment>
+ <comment xml:lang="zh_CN">Office Open XML Visio 模具</comment>
<comment xml:lang="uk">трафарет Visio Office Open у XML</comment>
- <comment xml:lang="zh-CN">Office Open XML Visio 模具</comment>
+ <comment xml:lang="tr">Office Open XML Visio kalıbı</comment>
+ <comment xml:lang="sv">Office Open XML Visio-stencil</comment>
+ <comment xml:lang="sq">model Office Open XML Visio</comment>
+ <comment xml:lang="si">කාර්යාල විවෘත XML Visio ස්ටෙන්සිල්</comment>
+ <comment xml:lang="ru">Трафарет Visio формата Office Open XML</comment>
+ <comment xml:lang="pt_BR">Estêncil do Office Open XML Visio</comment>
+ <comment xml:lang="pt">estêncil Visio do Open Office XML</comment>
+ <comment xml:lang="pl">Wzór Office Open XML Visio</comment>
+ <comment xml:lang="nl">Office Open XML Visio-stencil</comment>
+ <comment xml:lang="ko">오피스 오픈 XML Visio 스텐실</comment>
+ <comment xml:lang="kk">Office Open XML Visio трафареті</comment>
+ <comment xml:lang="ja">Office Open XML Visio ステンシル</comment>
+ <comment xml:lang="it">Stencil Visio Office Open XML</comment>
+ <comment xml:lang="is">Office Open XML Visio stensill</comment>
+ <comment xml:lang="id">Stensil Office Open XML Visio</comment>
+ <comment xml:lang="hu">Office Open XML Visio stencil</comment>
+ <comment xml:lang="hr">Office Open XML Visio šablona</comment>
+ <comment xml:lang="he">סטנסיל ל־Visio ב־Open XML מבית Office</comment>
+ <comment xml:lang="gl">Pincel de de Office Open XML Visio</comment>
+ <comment xml:lang="fr">stencil Visio Office Open XML</comment>
+ <comment xml:lang="fi">Office Open XML Visio -malli</comment>
+ <comment xml:lang="eu">Office Open XML Visio txantiloia</comment>
+ <comment xml:lang="es">galería de símbolos Office Open XML de Visio</comment>
+ <comment xml:lang="en_GB">Office Open XML Visio stencil</comment>
+ <comment xml:lang="de">Office-Open-XML-Visio-Schablone</comment>
+ <comment xml:lang="da">Office Open XML Visio-stencil</comment>
+ <comment xml:lang="ca">patró en Office Open XML de Visio</comment>
+ <comment xml:lang="bg">Образци — Office Open XML Visio</comment>
+ <comment xml:lang="be">трафарэт Office Open XML Visio</comment>
+ <comment xml:lang="ar">شكل فيزيو Open XML</comment>
<generic-icon name="image-x-generic"/>
<glob pattern="*.vssx"/>
<sub-class-of type="application/zip"/>
</mime-type>
<mime-type type="application/vnd.ms-visio.drawing.macroEnabled.main+xml">
<comment>Office Open XML Visio drawing</comment>
- <comment xml:lang="bg">Чертеж — Office Open XML Visio</comment>
- <comment xml:lang="ca">dibuix en Office Open XML de Visio</comment>
- <comment xml:lang="da">Office Open XML Visio-tegning</comment>
- <comment xml:lang="de">Office-Open-XML-Visio-Zeichnung</comment>
- <comment xml:lang="en-GB">Office Open XML Visio drawing</comment>
- <comment xml:lang="es">dibujo Office Open XML de Visio</comment>
- <comment xml:lang="eu">Office Open XML Visio marrazkia</comment>
- <comment xml:lang="fi">Office Open XML Visio -piirros</comment>
- <comment xml:lang="fr">dessin Visio Office Open XML</comment>
- <comment xml:lang="hr">Office Open XML Visio crtež</comment>
- <comment xml:lang="hu">Office Open XML Visio rajz</comment>
- <comment xml:lang="id">Gambar Office Open XML Visio</comment>
- <comment xml:lang="it">Disegno Visio Office Open XML</comment>
- <comment xml:lang="kk">Office Open XML Visio суреті</comment>
- <comment xml:lang="ko">오피스 오픈 XML 비지오 드로잉</comment>
- <comment xml:lang="pl">Rysunek Office Open XML Visio</comment>
- <comment xml:lang="pt">desenho Visio do Open Office XML</comment>
- <comment xml:lang="pt-BR">Desenho do Office Open XML Visio</comment>
- <comment xml:lang="ru">Рисунок Visio формата Office Open XML</comment>
- <comment xml:lang="sk">Kresba aplikácie Office Open XML Visio</comment>
- <comment xml:lang="sl">Risba Office Open XML Visio</comment>
- <comment xml:lang="sv">Office Open XML Visio-ritning</comment>
- <comment xml:lang="tr">Office Open XML Visio çizimi</comment>
+ <comment xml:lang="zh_TW">Office Open XML Visio 繪圖</comment>
+ <comment xml:lang="zh_CN">Office Open XML Visio 绘图</comment>
<comment xml:lang="uk">малюнок Visio Office Open у XML</comment>
- <comment xml:lang="zh-CN">Office Open XML Visio 绘图</comment>
- <comment xml:lang="zh-TW">Office Open XML Visio 繪圖</comment>
+ <comment xml:lang="tr">Office Open XML Visio çizimi</comment>
+ <comment xml:lang="sv">Office Open XML Visio-ritning</comment>
+ <comment xml:lang="sq">vizatim Office Open XML Visio</comment>
+ <comment xml:lang="sl">Risba Office Open XML Visio</comment>
+ <comment xml:lang="si">කාර්යාල විවෘත XML Visio ඇඳීම</comment>
+ <comment xml:lang="sk">Kresba aplikácie Office Open XML Visio</comment>
+ <comment xml:lang="ru">Рисунок Visio формата Office Open XML</comment>
+ <comment xml:lang="pt_BR">Desenho do Office Open XML Visio</comment>
+ <comment xml:lang="pt">desenho Visio do Open Office XML</comment>
+ <comment xml:lang="pl">Rysunek Office Open XML Visio</comment>
+ <comment xml:lang="nl">Office Open XML Visio-tekening</comment>
+ <comment xml:lang="ko">오피스 오픈 XML Visio 드로잉</comment>
+ <comment xml:lang="kk">Office Open XML Visio суреті</comment>
+ <comment xml:lang="ja">Office Open XML Visio ドロー</comment>
+ <comment xml:lang="it">Disegno Visio Office Open XML</comment>
+ <comment xml:lang="is">Office Open XML Visio teikning</comment>
+ <comment xml:lang="id">Gambar Office Open XML Visio</comment>
+ <comment xml:lang="hu">Office Open XML Visio rajz</comment>
+ <comment xml:lang="hr">Office Open XML Visio crtež</comment>
+ <comment xml:lang="he">ציור Office Open XML Visio</comment>
+ <comment xml:lang="gl">Debuxo de Office Open XML Visio</comment>
+ <comment xml:lang="fr">dessin Visio Office Open XML</comment>
+ <comment xml:lang="fi">Office Open XML Visio -piirros</comment>
+ <comment xml:lang="eu">Office Open XML Visio marrazkia</comment>
+ <comment xml:lang="es">dibujo Office Open XML de Visio</comment>
+ <comment xml:lang="en_GB">Office Open XML Visio drawing</comment>
+ <comment xml:lang="de">Office-Open-XML-Visio-Zeichnung</comment>
+ <comment xml:lang="da">Office Open XML Visio-tegning</comment>
+ <comment xml:lang="ca">dibuix en Office Open XML de Visio</comment>
+ <comment xml:lang="bg">Чертеж — Office Open XML Visio</comment>
+ <comment xml:lang="be">рысунак Office Open XML Visio</comment>
+ <comment xml:lang="ar">رسم فيزيو Open XML</comment>
<generic-icon name="image-x-generic"/>
<glob pattern="*.vsdm"/>
<sub-class-of type="application/zip"/>
</mime-type>
<mime-type type="application/vnd.ms-visio.template.macroEnabled.main+xml">
<comment>Office Open XML Visio template</comment>
- <comment xml:lang="bg">Шаблон за чертеж — Office Open XML Visio</comment>
- <comment xml:lang="ca">plantilla en Office Open XML de Visio</comment>
- <comment xml:lang="da">Office Open XML Visio-skabelon</comment>
- <comment xml:lang="de">Office-Open-XML-Visio-Vorlage</comment>
- <comment xml:lang="en-GB">Office Open XML Visio template</comment>
- <comment xml:lang="es">plantilla Office Open XML de Visio</comment>
- <comment xml:lang="eu">Office Open XML Visio txantiloia</comment>
- <comment xml:lang="fi">Office Open XML Visio -malli</comment>
- <comment xml:lang="fr">modèle Visio Office Open XML</comment>
- <comment xml:lang="hr">Office Open XML Visio predložak</comment>
- <comment xml:lang="hu">Office Open XML Visio sablon</comment>
- <comment xml:lang="id">Templat Office Open XML Visio</comment>
- <comment xml:lang="it">Modello Visio Office Open XML</comment>
- <comment xml:lang="kk">Office Open XML Visio үлгісі</comment>
- <comment xml:lang="ko">오피스 오픈 XML 비지오 양식</comment>
- <comment xml:lang="pl">Szablon Office Open XML Visio</comment>
- <comment xml:lang="pt">predefinição Visio do Open Office XML</comment>
- <comment xml:lang="pt-BR">Modelo Office Open XML Visio</comment>
- <comment xml:lang="ru">Шаблон Visio формата Office Open XML</comment>
- <comment xml:lang="sk">Šablóna aplikácie Office Open XML Visio</comment>
- <comment xml:lang="sl">Predloga Office Open XML Visio</comment>
- <comment xml:lang="sv">Office Open XML Visio-mall</comment>
- <comment xml:lang="tr">Office Open XML Visio şablonu</comment>
+ <comment xml:lang="zh_TW">Office Open XML Visio 範本</comment>
+ <comment xml:lang="zh_CN">Office Open XML Visio 模板</comment>
<comment xml:lang="uk">шаблон Visio Office Open у XML</comment>
- <comment xml:lang="zh-CN">Office Open XML Visio 模板</comment>
- <comment xml:lang="zh-TW">Office Open XML Visio 範本</comment>
+ <comment xml:lang="tr">Office Open XML Visio şablonu</comment>
+ <comment xml:lang="sv">Office Open XML Visio-mall</comment>
+ <comment xml:lang="sq">gjedhe Office Open XML Visio</comment>
+ <comment xml:lang="sl">Predloga Office Open XML Visio</comment>
+ <comment xml:lang="si">Office Open XML Visio අච්චුව</comment>
+ <comment xml:lang="sk">Šablóna aplikácie Office Open XML Visio</comment>
+ <comment xml:lang="ru">Шаблон Visio формата Office Open XML</comment>
+ <comment xml:lang="pt_BR">Modelo Office Open XML Visio</comment>
+ <comment xml:lang="pt">predefinição Visio do Open Office XML</comment>
+ <comment xml:lang="pl">Szablon Office Open XML Visio</comment>
+ <comment xml:lang="nl">Office Open XML Visio-sjabloon</comment>
+ <comment xml:lang="ko">오피스 오픈 XML Visio 양식</comment>
+ <comment xml:lang="kk">Office Open XML Visio үлгісі</comment>
+ <comment xml:lang="ja">Office Open XML Visio テンプレート</comment>
+ <comment xml:lang="it">Modello Visio Office Open XML</comment>
+ <comment xml:lang="is">Office Open XML Visio sniðmát</comment>
+ <comment xml:lang="id">Templat Office Open XML Visio</comment>
+ <comment xml:lang="hu">Office Open XML Visio sablon</comment>
+ <comment xml:lang="hr">Office Open XML Visio predložak</comment>
+ <comment xml:lang="he">תבנית Office Open XML Visio</comment>
+ <comment xml:lang="gl">Modelo de Office Open XML Visio</comment>
+ <comment xml:lang="fr">modèle Visio Office Open XML</comment>
+ <comment xml:lang="fi">Office Open XML Visio -malli</comment>
+ <comment xml:lang="eu">Office Open XML Visio txantiloia</comment>
+ <comment xml:lang="es">plantilla Office Open XML de Visio</comment>
+ <comment xml:lang="en_GB">Office Open XML Visio template</comment>
+ <comment xml:lang="de">Office-Open-XML-Visio-Vorlage</comment>
+ <comment xml:lang="da">Office Open XML Visio-skabelon</comment>
+ <comment xml:lang="ca">plantilla en Office Open XML de Visio</comment>
+ <comment xml:lang="bg">Шаблон за чертеж — Office Open XML Visio</comment>
+ <comment xml:lang="be">шаблон Office Open XML Visio</comment>
+ <comment xml:lang="ar">قالب فيزيو Open XML</comment>
<generic-icon name="image-x-generic"/>
<glob pattern="*.vstm"/>
<sub-class-of type="application/zip"/>
</mime-type>
<mime-type type="application/vnd.ms-visio.stencil.macroEnabled.main+xml">
<comment>Office Open XML Visio stencil</comment>
- <comment xml:lang="bg">Образци — Office Open XML Visio</comment>
- <comment xml:lang="ca">patró en Office Open XML de Visio</comment>
- <comment xml:lang="da">Office Open XML Visio-stencil</comment>
- <comment xml:lang="de">Office-Open-XML-Visio-Schablone</comment>
- <comment xml:lang="en-GB">Office Open XML Visio stencil</comment>
- <comment xml:lang="es">galería de símbolos Office Open XML de Visio</comment>
- <comment xml:lang="eu">Office Open XML Visio txantiloia</comment>
- <comment xml:lang="fi">Office Open XML Visio -malli</comment>
- <comment xml:lang="fr">stencil Visio Office Open XML</comment>
- <comment xml:lang="hr">Office Open XML Visio šablona</comment>
- <comment xml:lang="hu">Office Open XML Visio stencil</comment>
- <comment xml:lang="id">Stensil Office Open XML Visio</comment>
- <comment xml:lang="it">Stencil Visio Office Open XML</comment>
- <comment xml:lang="kk">Office Open XML Visio трафареті</comment>
- <comment xml:lang="ko">오피스 오픈 XML 비지오 스텐실</comment>
- <comment xml:lang="pl">Wzór Office Open XML Visio</comment>
- <comment xml:lang="pt">estêncil Visio do Open Office XML</comment>
- <comment xml:lang="pt-BR">Estêncil do Office Open XML Visio</comment>
- <comment xml:lang="ru">Трафарет Visio формата Office Open XML</comment>
- <comment xml:lang="sv">Office Open XML Visio-stencil</comment>
- <comment xml:lang="tr">Office Open XML Visio kalıbı</comment>
+ <comment xml:lang="zh_CN">Office Open XML Visio 模具</comment>
<comment xml:lang="uk">трафарет Visio Office Open у XML</comment>
- <comment xml:lang="zh-CN">Office Open XML Visio 模具</comment>
+ <comment xml:lang="tr">Office Open XML Visio kalıbı</comment>
+ <comment xml:lang="sv">Office Open XML Visio-stencil</comment>
+ <comment xml:lang="sq">model Office Open XML Visio</comment>
+ <comment xml:lang="si">කාර්යාල විවෘත XML Visio ස්ටෙන්සිල්</comment>
+ <comment xml:lang="ru">Трафарет Visio формата Office Open XML</comment>
+ <comment xml:lang="pt_BR">Estêncil do Office Open XML Visio</comment>
+ <comment xml:lang="pt">estêncil Visio do Open Office XML</comment>
+ <comment xml:lang="pl">Wzór Office Open XML Visio</comment>
+ <comment xml:lang="nl">Office Open XML Visio-stencil</comment>
+ <comment xml:lang="ko">오피스 오픈 XML Visio 스텐실</comment>
+ <comment xml:lang="kk">Office Open XML Visio трафареті</comment>
+ <comment xml:lang="ja">Office Open XML Visio ステンシル</comment>
+ <comment xml:lang="it">Stencil Visio Office Open XML</comment>
+ <comment xml:lang="is">Office Open XML Visio stensill</comment>
+ <comment xml:lang="id">Stensil Office Open XML Visio</comment>
+ <comment xml:lang="hu">Office Open XML Visio stencil</comment>
+ <comment xml:lang="hr">Office Open XML Visio šablona</comment>
+ <comment xml:lang="he">סטנסיל ל־Visio ב־Open XML מבית Office</comment>
+ <comment xml:lang="gl">Pincel de de Office Open XML Visio</comment>
+ <comment xml:lang="fr">stencil Visio Office Open XML</comment>
+ <comment xml:lang="fi">Office Open XML Visio -malli</comment>
+ <comment xml:lang="eu">Office Open XML Visio txantiloia</comment>
+ <comment xml:lang="es">galería de símbolos Office Open XML de Visio</comment>
+ <comment xml:lang="en_GB">Office Open XML Visio stencil</comment>
+ <comment xml:lang="de">Office-Open-XML-Visio-Schablone</comment>
+ <comment xml:lang="da">Office Open XML Visio-stencil</comment>
+ <comment xml:lang="ca">patró en Office Open XML de Visio</comment>
+ <comment xml:lang="bg">Образци — Office Open XML Visio</comment>
+ <comment xml:lang="be">трафарэт Office Open XML Visio</comment>
+ <comment xml:lang="ar">شكل فيزيو Open XML</comment>
<generic-icon name="image-x-generic"/>
<glob pattern="*.vssm"/>
<sub-class-of type="application/zip"/>
</mime-type>
<mime-type type="application/vnd.ms-word.document.macroEnabled.12">
<comment>Word document</comment>
- <comment xml:lang="af">Word-dokument</comment>
- <comment xml:lang="ar">مستند Word</comment>
- <comment xml:lang="ast">Documentu de Word</comment>
- <comment xml:lang="be-Latn">Dakument Word</comment>
- <comment xml:lang="bg">Документ — Word</comment>
- <comment xml:lang="ca">document Word</comment>
- <comment xml:lang="cs">dokument Word</comment>
- <comment xml:lang="da">Worddokument</comment>
- <comment xml:lang="de">Word-Dokument</comment>
- <comment xml:lang="el">Έγγραφο Word</comment>
- <comment xml:lang="en-GB">Word document</comment>
- <comment xml:lang="eo">Word-dokumento</comment>
- <comment xml:lang="es">documento de Word</comment>
- <comment xml:lang="eu">Word dokumentua</comment>
- <comment xml:lang="fi">Word-asiakirja</comment>
- <comment xml:lang="fo">Word skjal</comment>
- <comment xml:lang="fr">document Word</comment>
- <comment xml:lang="fur">document Word</comment>
- <comment xml:lang="ga">cáipéis Word</comment>
- <comment xml:lang="gl">documento de Word</comment>
- <comment xml:lang="he">מסמך Word</comment>
- <comment xml:lang="hr">Word dokument</comment>
- <comment xml:lang="hu">Word dokumentum</comment>
- <comment xml:lang="ia">Documento Word</comment>
- <comment xml:lang="id">Dokumen Word</comment>
- <comment xml:lang="it">Documento Word</comment>
- <comment xml:lang="ja">Word ドキュメント</comment>
- <comment xml:lang="kk">Word құжаты</comment>
- <comment xml:lang="ko">Word 문서</comment>
- <comment xml:lang="lt">Word dokumentas</comment>
- <comment xml:lang="lv">Word dokuments</comment>
- <comment xml:lang="nb">Word-dokument</comment>
- <comment xml:lang="nl">Word-document</comment>
- <comment xml:lang="nn">Word-dokument</comment>
- <comment xml:lang="oc">document Word</comment>
- <comment xml:lang="pl">Dokument Word</comment>
- <comment xml:lang="pt">documento Word</comment>
- <comment xml:lang="pt-BR">Documento do Word</comment>
- <comment xml:lang="ro">Document Word</comment>
- <comment xml:lang="ru">Документ Word</comment>
- <comment xml:lang="sk">Dokument Word</comment>
- <comment xml:lang="sl">Dokument Word</comment>
- <comment xml:lang="sq">Dokument Word</comment>
- <comment xml:lang="sr">Ворд документ</comment>
- <comment xml:lang="sv">Word-dokument</comment>
- <comment xml:lang="tr">Word belgesi</comment>
- <comment xml:lang="uk">документ Word</comment>
+ <comment xml:lang="zh_TW">Word 文件</comment>
+ <comment xml:lang="zh_CN">Word 文档</comment>
<comment xml:lang="vi">Tài liệu Word</comment>
- <comment xml:lang="zh-CN">Word 文档</comment>
- <comment xml:lang="zh-TW">Word 文件</comment>
+ <comment xml:lang="uk">документ Word</comment>
+ <comment xml:lang="tr">Word belgesi</comment>
+ <comment xml:lang="sv">Word-dokument</comment>
+ <comment xml:lang="sr">Ворд документ</comment>
+ <comment xml:lang="sq">dokument Word</comment>
+ <comment xml:lang="sl">Dokument Word</comment>
+ <comment xml:lang="si">වචන ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument Word</comment>
+ <comment xml:lang="ru">Документ Word</comment>
+ <comment xml:lang="ro">Document Word</comment>
+ <comment xml:lang="pt_BR">Documento do Word</comment>
+ <comment xml:lang="pt">documento Word</comment>
+ <comment xml:lang="pl">Dokument Word</comment>
+ <comment xml:lang="oc">document Word</comment>
+ <comment xml:lang="nn">Word-dokument</comment>
+ <comment xml:lang="nl">Word-document</comment>
+ <comment xml:lang="nb">Word-dokument</comment>
+ <comment xml:lang="lv">Word dokuments</comment>
+ <comment xml:lang="lt">Word dokumentas</comment>
+ <comment xml:lang="ko">Word 문서</comment>
+ <comment xml:lang="kk">Word құжаты</comment>
+ <comment xml:lang="ka">Word -ის დოკუმენტი</comment>
+ <comment xml:lang="ja">Word ドキュメント</comment>
+ <comment xml:lang="it">Documento Word</comment>
+ <comment xml:lang="is">Word skjal</comment>
+ <comment xml:lang="id">Dokumen Word</comment>
+ <comment xml:lang="ia">Documento Word</comment>
+ <comment xml:lang="hu">Word dokumentum</comment>
+ <comment xml:lang="hr">Word dokument</comment>
+ <comment xml:lang="he">מסמך Word</comment>
+ <comment xml:lang="gl">documento de Word</comment>
+ <comment xml:lang="ga">cáipéis Word</comment>
+ <comment xml:lang="fur">document Word</comment>
+ <comment xml:lang="fr">document Word</comment>
+ <comment xml:lang="fo">Word skjal</comment>
+ <comment xml:lang="fi">Word-asiakirja</comment>
+ <comment xml:lang="eu">Word dokumentua</comment>
+ <comment xml:lang="es">documento de Word</comment>
+ <comment xml:lang="eo">Word-dokumento</comment>
+ <comment xml:lang="en_GB">Word document</comment>
+ <comment xml:lang="el">Έγγραφο Word</comment>
+ <comment xml:lang="de">Word-Dokument</comment>
+ <comment xml:lang="da">Worddokument</comment>
+ <comment xml:lang="cs">dokument Word</comment>
+ <comment xml:lang="ca">document Word</comment>
+ <comment xml:lang="bg">Документ — Word</comment>
+ <comment xml:lang="be@latin">Dakument Word</comment>
+ <comment xml:lang="be">дакумент Word</comment>
+ <comment xml:lang="ast">Documentu de Word</comment>
+ <comment xml:lang="ar">مستند ورد</comment>
+ <comment xml:lang="af">Word-dokument</comment>
<generic-icon name="x-office-document"/>
<glob pattern="*.docm"/>
<sub-class-of type="application/vnd.openxmlformats-officedocument.wordprocessingml.document"/>
</mime-type>
<mime-type type="application/vnd.ms-word.template.macroEnabled.12">
<comment>Word document template</comment>
- <comment xml:lang="af">Word-dokumentsjabloon</comment>
- <comment xml:lang="ast">Plantía de documentu de Word</comment>
- <comment xml:lang="bg">Шаблон за документ — Word</comment>
- <comment xml:lang="ca">plantilla de document Word</comment>
- <comment xml:lang="cs">šablona dokumentu Word</comment>
- <comment xml:lang="da">Word-dokumentskabelon</comment>
- <comment xml:lang="de">Word-Dokumentvorlage</comment>
- <comment xml:lang="el">Πρότυπο έγγραφο Word</comment>
- <comment xml:lang="en-GB">Word document template</comment>
- <comment xml:lang="es">plantilla de documento de Word</comment>
- <comment xml:lang="eu">Word dokumentuaren txantiloia</comment>
- <comment xml:lang="fi">Word-asiakirjamalli</comment>
- <comment xml:lang="fr">modèle de document Word</comment>
- <comment xml:lang="fur">model di document Word</comment>
- <comment xml:lang="ga">teimpléad Word</comment>
- <comment xml:lang="he">תבנית מסמך Word</comment>
- <comment xml:lang="hr">Predložak Word dokumenta</comment>
- <comment xml:lang="hu">Word dokumentumsablon</comment>
- <comment xml:lang="ia">Patrono de documento Word</comment>
- <comment xml:lang="id">Templat dokumen Word</comment>
- <comment xml:lang="it">Modello documento Word</comment>
- <comment xml:lang="kk">Word құжатының үлгісі</comment>
- <comment xml:lang="ko">Word 문서 서식</comment>
- <comment xml:lang="oc">modèl de document Word</comment>
- <comment xml:lang="pl">Szablon dokumentu Word</comment>
- <comment xml:lang="pt">modelo de documento Word</comment>
- <comment xml:lang="pt-BR">Modelo de documento do Word</comment>
- <comment xml:lang="ru">Шаблон документа Word</comment>
- <comment xml:lang="sk">Šablóna dokumentu aplikácie Word</comment>
- <comment xml:lang="sl">Predloga dokumenta Word</comment>
- <comment xml:lang="sr">Шаблон Ворд документа</comment>
- <comment xml:lang="sv">Word-dokumentmall</comment>
- <comment xml:lang="tr">Word belgesi şablonu</comment>
+ <comment xml:lang="zh_TW">Word 文件範本</comment>
+ <comment xml:lang="zh_CN">Word 文档模板</comment>
<comment xml:lang="uk">шаблон документа Word</comment>
- <comment xml:lang="zh-CN">Word 文档模板</comment>
- <comment xml:lang="zh-TW">Word 文件範本</comment>
+ <comment xml:lang="tr">Word belgesi şablonu</comment>
+ <comment xml:lang="sv">Word-dokumentmall</comment>
+ <comment xml:lang="sr">Шаблон Ворд документа</comment>
+ <comment xml:lang="sq">gjedhe dokumenti Word</comment>
+ <comment xml:lang="sl">Predloga dokumenta Word</comment>
+ <comment xml:lang="si">වචන ලේඛන ආකෘතිය</comment>
+ <comment xml:lang="sk">Šablóna dokumentu aplikácie Word</comment>
+ <comment xml:lang="ru">Шаблон документа Word</comment>
+ <comment xml:lang="pt_BR">Modelo de documento do Word</comment>
+ <comment xml:lang="pt">modelo de documento Word</comment>
+ <comment xml:lang="pl">Szablon dokumentu Word</comment>
+ <comment xml:lang="oc">modèl de document Word</comment>
+ <comment xml:lang="nl">Word-documentsjabloon</comment>
+ <comment xml:lang="ko">Word 문서 서식</comment>
+ <comment xml:lang="kk">Word құжатының үлгісі</comment>
+ <comment xml:lang="ja">Word ドキュメントテンプレート</comment>
+ <comment xml:lang="it">Modello documento Word</comment>
+ <comment xml:lang="is">Word sniðmát fyrir textaskjal</comment>
+ <comment xml:lang="id">Templat dokumen Word</comment>
+ <comment xml:lang="ia">Patrono de documento Word</comment>
+ <comment xml:lang="hu">Word dokumentumsablon</comment>
+ <comment xml:lang="hr">Predložak Word dokumenta</comment>
+ <comment xml:lang="he">תבנית מסמך Word</comment>
+ <comment xml:lang="gl">Modelo de documento Word</comment>
+ <comment xml:lang="ga">teimpléad Word</comment>
+ <comment xml:lang="fur">model di document Word</comment>
+ <comment xml:lang="fr">modèle de document Word</comment>
+ <comment xml:lang="fi">Word-asiakirjamalli</comment>
+ <comment xml:lang="eu">Word dokumentuaren txantiloia</comment>
+ <comment xml:lang="es">plantilla de documento de Word</comment>
+ <comment xml:lang="en_GB">Word document template</comment>
+ <comment xml:lang="el">Πρότυπο έγγραφο Word</comment>
+ <comment xml:lang="de">Word-Dokumentvorlage</comment>
+ <comment xml:lang="da">Word-dokumentskabelon</comment>
+ <comment xml:lang="cs">šablona dokumentu Word</comment>
+ <comment xml:lang="ca">plantilla de document Word</comment>
+ <comment xml:lang="bg">Шаблон за документ — Word</comment>
+ <comment xml:lang="be">шаблон дакумента Word</comment>
+ <comment xml:lang="ast">Plantía de documentu de Word</comment>
+ <comment xml:lang="ar">قالب مستند ورد</comment>
+ <comment xml:lang="af">Word-dokumentsjabloon</comment>
<generic-icon name="x-office-document"/>
<glob pattern="*.dotm"/>
<sub-class-of type="application/vnd.openxmlformats-officedocument.wordprocessingml.template"/>
</mime-type>
<mime-type type="application/oxps">
<comment>OpenXPS document</comment>
+ <comment xml:lang="zh_TW">OpenXPS 文件</comment>
+ <comment xml:lang="zh_CN">OpenXPS 文档</comment>
+ <comment xml:lang="uk">документ OpenXPS</comment>
+ <comment xml:lang="tr">OpenXPS belgesi</comment>
+ <comment xml:lang="sv">OpenXPS-dokument</comment>
+ <comment xml:lang="sl">Dokument OpenXPS</comment>
+ <comment xml:lang="si">OpenXPS ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument OpenXPS</comment>
+ <comment xml:lang="ru">Документ OpenXPS</comment>
+ <comment xml:lang="pt_BR">Documento OpenXPS</comment>
+ <comment xml:lang="pt">documento OpenXPS</comment>
+ <comment xml:lang="pl">Dokument OpenXPS</comment>
+ <comment xml:lang="oc">document OpenXPS</comment>
+ <comment xml:lang="nl">OpenXPS-document</comment>
+ <comment xml:lang="ko">OpenXPS 문서</comment>
+ <comment xml:lang="kk">OpenXPS құжаты</comment>
+ <comment xml:lang="ka">OpenXPS -ის დოკუმენტი</comment>
+ <comment xml:lang="ja">OpenXPS ドキュメント</comment>
+ <comment xml:lang="it">Documento OpenXPS</comment>
+ <comment xml:lang="is">OpenXPS skjal</comment>
+ <comment xml:lang="id">Dokumen OpenXPS</comment>
+ <comment xml:lang="hu">OpenXPS-dokumentum</comment>
+ <comment xml:lang="hr">OpenXPS dokument</comment>
+ <comment xml:lang="he">מסמך OpenXPS</comment>
+ <comment xml:lang="gl">Documento de OpenXPS</comment>
+ <comment xml:lang="fr">Document OpenXPS</comment>
+ <comment xml:lang="fi">OpenXPS-asiakirja</comment>
+ <comment xml:lang="eu">OpenXPS dokumentua</comment>
+ <comment xml:lang="es">documento OpenXPS</comment>
+ <comment xml:lang="en_GB">OpenXPS document</comment>
+ <comment xml:lang="de">OpenXPS-Dokument</comment>
+ <comment xml:lang="da">OpenXPS-dokument</comment>
+ <comment xml:lang="ca">document OpenXPS</comment>
+ <comment xml:lang="be">дакумент OpenXPS</comment>
+ <comment xml:lang="ar">مستند OpenXPS</comment>
<acronym>OpenXPS</acronym>
<expanded-acronym>Open XML Paper Specification</expanded-acronym>
<sub-class-of type="application/zip"/>
@@ -3943,56 +4459,60 @@ command to generate the output files.
</mime-type>
<mime-type type="application/vnd.ms-xpsdocument">
<comment>XPS document</comment>
- <comment xml:lang="af">XPS-dokument</comment>
- <comment xml:lang="ar">مستند XPS</comment>
- <comment xml:lang="ast">Documentu XPS</comment>
- <comment xml:lang="be-Latn">Dakument XPS</comment>
- <comment xml:lang="bg">Документ — XPS</comment>
- <comment xml:lang="ca">document XPS</comment>
- <comment xml:lang="cs">dokument XPS</comment>
- <comment xml:lang="da">XPS-dokument</comment>
- <comment xml:lang="de">XPS-Dokument</comment>
- <comment xml:lang="el">Έγγραφο XPS</comment>
- <comment xml:lang="en-GB">XPS document</comment>
- <comment xml:lang="eo">XPS-dokumento</comment>
- <comment xml:lang="es">documento XPS</comment>
- <comment xml:lang="eu">XPS dokumentua</comment>
- <comment xml:lang="fi">XPS-asiakirja</comment>
- <comment xml:lang="fo">XPS skjal</comment>
- <comment xml:lang="fr">document XPS</comment>
- <comment xml:lang="fur">document XPS</comment>
- <comment xml:lang="ga">cáipéis XPS</comment>
- <comment xml:lang="gl">documento XPS</comment>
- <comment xml:lang="he">מסמך XPS</comment>
- <comment xml:lang="hr">XPS dokument</comment>
- <comment xml:lang="hu">XPS dokumentum</comment>
- <comment xml:lang="ia">Documento XPS</comment>
- <comment xml:lang="id">Dokumen XPS</comment>
- <comment xml:lang="it">Documento XPS</comment>
- <comment xml:lang="ja">XPS ドキュメント</comment>
- <comment xml:lang="kk">XPS құжаты</comment>
- <comment xml:lang="ko">XPS 문서</comment>
- <comment xml:lang="lt">XPS dokumentas</comment>
- <comment xml:lang="lv">XPS dokuments</comment>
- <comment xml:lang="nb">XPS-dokument</comment>
- <comment xml:lang="nl">XPS-document</comment>
- <comment xml:lang="nn">XPS-dokument</comment>
- <comment xml:lang="oc">document XPS</comment>
- <comment xml:lang="pl">Dokument XPS</comment>
- <comment xml:lang="pt">documento XPS</comment>
- <comment xml:lang="pt-BR">Documento XPS</comment>
- <comment xml:lang="ro">Document XPS</comment>
- <comment xml:lang="ru">Документ XPS</comment>
- <comment xml:lang="sk">Dokument XPS</comment>
- <comment xml:lang="sl">Dokument XPS</comment>
- <comment xml:lang="sq">Dokument XPS</comment>
- <comment xml:lang="sr">ИксПС документ</comment>
- <comment xml:lang="sv">XPS-dokument</comment>
- <comment xml:lang="tr">XPS belgesi</comment>
- <comment xml:lang="uk">документ XPS</comment>
+ <comment xml:lang="zh_TW">XPS 文件</comment>
+ <comment xml:lang="zh_CN">XPS 文档</comment>
<comment xml:lang="vi">Tài liệu XPS</comment>
- <comment xml:lang="zh-CN">XPS 文档</comment>
- <comment xml:lang="zh-TW">XPS 文件</comment>
+ <comment xml:lang="uk">документ XPS</comment>
+ <comment xml:lang="tr">XPS belgesi</comment>
+ <comment xml:lang="sv">XPS-dokument</comment>
+ <comment xml:lang="sr">ИксПС документ</comment>
+ <comment xml:lang="sq">dokument XPS</comment>
+ <comment xml:lang="sl">Dokument XPS</comment>
+ <comment xml:lang="si">XPS ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument XPS</comment>
+ <comment xml:lang="ru">Документ XPS</comment>
+ <comment xml:lang="ro">Document XPS</comment>
+ <comment xml:lang="pt_BR">Documento XPS</comment>
+ <comment xml:lang="pt">documento XPS</comment>
+ <comment xml:lang="pl">Dokument XPS</comment>
+ <comment xml:lang="oc">document XPS</comment>
+ <comment xml:lang="nn">XPS-dokument</comment>
+ <comment xml:lang="nl">XPS-document</comment>
+ <comment xml:lang="nb">XPS-dokument</comment>
+ <comment xml:lang="lv">XPS dokuments</comment>
+ <comment xml:lang="lt">XPS dokumentas</comment>
+ <comment xml:lang="ko">XPS 문서</comment>
+ <comment xml:lang="kk">XPS құжаты</comment>
+ <comment xml:lang="ka">XPS -ის დოკუმენტი</comment>
+ <comment xml:lang="ja">XPS ドキュメント</comment>
+ <comment xml:lang="it">Documento XPS</comment>
+ <comment xml:lang="is">XPS skjal</comment>
+ <comment xml:lang="id">Dokumen XPS</comment>
+ <comment xml:lang="ia">Documento XPS</comment>
+ <comment xml:lang="hu">XPS dokumentum</comment>
+ <comment xml:lang="hr">XPS dokument</comment>
+ <comment xml:lang="he">מסמך XPS</comment>
+ <comment xml:lang="gl">documento XPS</comment>
+ <comment xml:lang="ga">cáipéis XPS</comment>
+ <comment xml:lang="fur">document XPS</comment>
+ <comment xml:lang="fr">document XPS</comment>
+ <comment xml:lang="fo">XPS skjal</comment>
+ <comment xml:lang="fi">XPS-asiakirja</comment>
+ <comment xml:lang="eu">XPS dokumentua</comment>
+ <comment xml:lang="es">documento XPS</comment>
+ <comment xml:lang="eo">XPS-dokumento</comment>
+ <comment xml:lang="en_GB">XPS document</comment>
+ <comment xml:lang="el">Έγγραφο XPS</comment>
+ <comment xml:lang="de">XPS-Dokument</comment>
+ <comment xml:lang="da">XPS-dokument</comment>
+ <comment xml:lang="cs">dokument XPS</comment>
+ <comment xml:lang="ca">document XPS</comment>
+ <comment xml:lang="bg">Документ — XPS</comment>
+ <comment xml:lang="be@latin">Dakument XPS</comment>
+ <comment xml:lang="be">дакумент XPS</comment>
+ <comment xml:lang="ast">Documentu XPS</comment>
+ <comment xml:lang="ar">مستند XPS</comment>
+ <comment xml:lang="af">XPS-dokument</comment>
<acronym>XPS</acronym>
<expanded-acronym>XML Paper Specification</expanded-acronym>
<sub-class-of type="application/zip"/>
@@ -4002,56 +4522,59 @@ command to generate the output files.
</mime-type>
<mime-type type="application/vnd.ms-works">
<comment>Microsoft Works document</comment>
- <comment xml:lang="af">Microsoft Works-dokument</comment>
- <comment xml:lang="ar">مستند Microsoft Works</comment>
- <comment xml:lang="ast">Documentu de Microsoft Works</comment>
- <comment xml:lang="be-Latn">Dakument Microsoft Works</comment>
- <comment xml:lang="bg">Документ — Microsoft Works</comment>
- <comment xml:lang="ca">document de Microsoft Works</comment>
- <comment xml:lang="cs">dokument Microsoft Works</comment>
- <comment xml:lang="da">Microsoft Works-dokument</comment>
- <comment xml:lang="de">Microsoft-Works-Dokument</comment>
- <comment xml:lang="el">Έγγραφο Microsoft Works</comment>
- <comment xml:lang="en-GB">Microsoft Works document</comment>
- <comment xml:lang="es">documento de Microsoft Works</comment>
- <comment xml:lang="eu">Microsoft Works dokumentua</comment>
- <comment xml:lang="fi">Microsoft Works -asiakirja</comment>
- <comment xml:lang="fo">Microsoft Works skjal</comment>
- <comment xml:lang="fr">document Microsoft Works</comment>
- <comment xml:lang="fur">document Microsoft Works</comment>
- <comment xml:lang="ga">cáipéis Microsoft Works</comment>
- <comment xml:lang="gl">documento de Microsoft Works</comment>
- <comment xml:lang="he">מסמך Microsoft Works</comment>
- <comment xml:lang="hr">Microsoft Works dokument</comment>
- <comment xml:lang="hu">Microsoft Works dokumentum</comment>
- <comment xml:lang="ia">Documento Microsoft Works</comment>
- <comment xml:lang="id">Dokumen Microsoft Works</comment>
- <comment xml:lang="it">Documento Microsoft Works</comment>
- <comment xml:lang="ja">Microsoft Works ドキュメント</comment>
- <comment xml:lang="ka">Microsoft Works-ის დოკუმენტი</comment>
- <comment xml:lang="kk">Microsoft Works құжаты</comment>
- <comment xml:lang="ko">Microsoft Works 문서</comment>
- <comment xml:lang="lt">Microsoft Works dokumentas</comment>
- <comment xml:lang="lv">Microsoft Works dokuments</comment>
- <comment xml:lang="nb">Microsoft Works-dokument</comment>
- <comment xml:lang="nl">Microsoft Works-document</comment>
- <comment xml:lang="nn">Microsoft Works-dokument</comment>
- <comment xml:lang="oc">document Microsoft Works</comment>
- <comment xml:lang="pl">Dokument Microsoft Works</comment>
- <comment xml:lang="pt">documento Microsoft Works</comment>
- <comment xml:lang="pt-BR">Documento do Microsoft Works</comment>
- <comment xml:lang="ro">Document Microsoft Works</comment>
- <comment xml:lang="ru">Документ Microsoft Works</comment>
- <comment xml:lang="sk">Dokument Microsoft Works</comment>
- <comment xml:lang="sl">Dokument Microsoft Works</comment>
- <comment xml:lang="sq">Dokument Microsoft Works</comment>
- <comment xml:lang="sr">документ Мајкрософт Воркса</comment>
- <comment xml:lang="sv">Microsoft Works-dokument</comment>
- <comment xml:lang="tr">Microsoft Works belgesi</comment>
- <comment xml:lang="uk">документ Microsoft Works</comment>
+ <comment xml:lang="zh_TW">微軟 Works 文件</comment>
+ <comment xml:lang="zh_CN">Microsoft Works 文档</comment>
<comment xml:lang="vi">Tài liệu Microsoft Works</comment>
- <comment xml:lang="zh-CN">Microsoft Works 文档</comment>
- <comment xml:lang="zh-TW">微軟 Works 文件</comment>
+ <comment xml:lang="uk">документ Microsoft Works</comment>
+ <comment xml:lang="tr">Microsoft Works belgesi</comment>
+ <comment xml:lang="sv">Microsoft Works-dokument</comment>
+ <comment xml:lang="sr">документ Мајкрософт Воркса</comment>
+ <comment xml:lang="sq">dokument Microsoft Works</comment>
+ <comment xml:lang="sl">Dokument Microsoft Works</comment>
+ <comment xml:lang="si">Microsoft Works ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument Microsoft Works</comment>
+ <comment xml:lang="ru">Документ Microsoft Works</comment>
+ <comment xml:lang="ro">Document Microsoft Works</comment>
+ <comment xml:lang="pt_BR">Documento do Microsoft Works</comment>
+ <comment xml:lang="pt">documento Microsoft Works</comment>
+ <comment xml:lang="pl">Dokument Microsoft Works</comment>
+ <comment xml:lang="oc">document Microsoft Works</comment>
+ <comment xml:lang="nn">Microsoft Works-dokument</comment>
+ <comment xml:lang="nl">Microsoft Works-document</comment>
+ <comment xml:lang="nb">Microsoft Works-dokument</comment>
+ <comment xml:lang="lv">Microsoft Works dokuments</comment>
+ <comment xml:lang="lt">Microsoft Works dokumentas</comment>
+ <comment xml:lang="ko">Microsoft Works 문서</comment>
+ <comment xml:lang="kk">Microsoft Works құжаты</comment>
+ <comment xml:lang="ka">Microsoft Works-ის დოკუმენტი</comment>
+ <comment xml:lang="ja">Microsoft Works ドキュメント</comment>
+ <comment xml:lang="it">Documento Microsoft Works</comment>
+ <comment xml:lang="is">Microsoft Works skjal</comment>
+ <comment xml:lang="id">Dokumen Microsoft Works</comment>
+ <comment xml:lang="ia">Documento Microsoft Works</comment>
+ <comment xml:lang="hu">Microsoft Works dokumentum</comment>
+ <comment xml:lang="hr">Microsoft Works dokument</comment>
+ <comment xml:lang="he">מסמך Microsoft Works</comment>
+ <comment xml:lang="gl">documento de Microsoft Works</comment>
+ <comment xml:lang="ga">cáipéis Microsoft Works</comment>
+ <comment xml:lang="fur">document Microsoft Works</comment>
+ <comment xml:lang="fr">document Microsoft Works</comment>
+ <comment xml:lang="fo">Microsoft Works skjal</comment>
+ <comment xml:lang="fi">Microsoft Works -asiakirja</comment>
+ <comment xml:lang="eu">Microsoft Works dokumentua</comment>
+ <comment xml:lang="es">documento de Microsoft Works</comment>
+ <comment xml:lang="en_GB">Microsoft Works document</comment>
+ <comment xml:lang="el">Έγγραφο Microsoft Works</comment>
+ <comment xml:lang="de">Microsoft-Works-Dokument</comment>
+ <comment xml:lang="da">Microsoft Works-dokument</comment>
+ <comment xml:lang="cs">dokument Microsoft Works</comment>
+ <comment xml:lang="ca">document de Microsoft Works</comment>
+ <comment xml:lang="bg">Документ — Microsoft Works</comment>
+ <comment xml:lang="be@latin">Dakument Microsoft Works</comment>
+ <comment xml:lang="be">дакумент Microsoft Works</comment>
+ <comment xml:lang="ast">Documentu de Microsoft Works</comment>
+ <comment xml:lang="ar">مستند Microsoft Works</comment>
+ <comment xml:lang="af">Microsoft Works-dokument</comment>
<sub-class-of type="application/x-ole-storage"/>
<generic-icon name="x-office-document"/>
<glob pattern="*.wcm"/>
@@ -4062,47 +4585,52 @@ command to generate the output files.
</mime-type>
<mime-type type="application/vnd.visio">
<comment>Microsoft Visio document</comment>
- <comment xml:lang="af">Microsoft Visio-dokument</comment>
- <comment xml:lang="ast">Documentu de Microsoft Visio</comment>
- <comment xml:lang="bg">Документ — Microsoft Visio</comment>
- <comment xml:lang="ca">document de Microsoft Visio</comment>
- <comment xml:lang="cs">dokument Microsoft Visio</comment>
- <comment xml:lang="da">Microsoft Visio-dokument</comment>
- <comment xml:lang="de">Microsoft-Visio-Dokument</comment>
- <comment xml:lang="el">Έγγραφο Microsoft Visio</comment>
- <comment xml:lang="en-GB">Microsoft Visio document</comment>
- <comment xml:lang="es">documento de Microsoft Visio</comment>
- <comment xml:lang="eu">Microsoft Visio dokumentua</comment>
- <comment xml:lang="fi">Microsoft Visio -asiakirja</comment>
- <comment xml:lang="fr">document Microsoft Visio</comment>
- <comment xml:lang="fur">document Microsoft Visio</comment>
- <comment xml:lang="ga">cáipéis Microsoft Visio</comment>
- <comment xml:lang="gl">Documento de Microsoft Visio</comment>
- <comment xml:lang="he">מסמך </comment>
- <comment xml:lang="hr">Microsoft Visio dokument</comment>
- <comment xml:lang="hu">Microsoft Visio dokumentum</comment>
- <comment xml:lang="ia">Documento Microsoft Visio</comment>
- <comment xml:lang="id">Dokumen Microsoft Visio</comment>
- <comment xml:lang="it">Documento Microsoft Visio</comment>
- <comment xml:lang="ja">Microsoft Visio ドキュメント</comment>
- <comment xml:lang="ka">Microsoft Visio-ის დოკუმენტი</comment>
- <comment xml:lang="kk">Microsoft Visio құжаты</comment>
- <comment xml:lang="ko">Microsoft Visio 문서</comment>
- <comment xml:lang="lv">Microsoft Visio dokuments</comment>
- <comment xml:lang="nl">Microsoft Visio document</comment>
- <comment xml:lang="oc">document Microsoft Visio</comment>
- <comment xml:lang="pl">Dokument Microsoft Visio</comment>
- <comment xml:lang="pt">documento Microsoft Visio</comment>
- <comment xml:lang="pt-BR">Documento do Microsoft Visio</comment>
- <comment xml:lang="ru">Документ Microsoft Visio</comment>
- <comment xml:lang="sk">Dokument Microsoft Visio</comment>
- <comment xml:lang="sl">Dokument Microsoft Visio</comment>
- <comment xml:lang="sr">документ Мајкрософт Визиа</comment>
- <comment xml:lang="sv">Microsoft Visio-dokument</comment>
- <comment xml:lang="tr">Microsoft Visio belgesi</comment>
+ <comment xml:lang="zh_TW">微軟 Visio 文件</comment>
+ <comment xml:lang="zh_CN">Microsoft Visio 文档</comment>
<comment xml:lang="uk">документ Microsoft Visio</comment>
- <comment xml:lang="zh-CN">Microsoft Visio 文档</comment>
- <comment xml:lang="zh-TW">微軟 Visio 文件</comment>
+ <comment xml:lang="tr">Microsoft Visio belgesi</comment>
+ <comment xml:lang="sv">Microsoft Visio-dokument</comment>
+ <comment xml:lang="sr">документ Мајкрософт Визиа</comment>
+ <comment xml:lang="sq">dokument Microsoft Visio</comment>
+ <comment xml:lang="sl">Dokument Microsoft Visio</comment>
+ <comment xml:lang="si">Microsoft Visio ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument Microsoft Visio</comment>
+ <comment xml:lang="ru">Документ Microsoft Visio</comment>
+ <comment xml:lang="pt_BR">Documento do Microsoft Visio</comment>
+ <comment xml:lang="pt">documento Microsoft Visio</comment>
+ <comment xml:lang="pl">Dokument Microsoft Visio</comment>
+ <comment xml:lang="oc">document Microsoft Visio</comment>
+ <comment xml:lang="nl">Microsoft Visio document</comment>
+ <comment xml:lang="lv">Microsoft Visio dokuments</comment>
+ <comment xml:lang="ko">Microsoft Visio 문서</comment>
+ <comment xml:lang="kk">Microsoft Visio құжаты</comment>
+ <comment xml:lang="ka">Microsoft Visio-ის დოკუმენტი</comment>
+ <comment xml:lang="ja">Microsoft Visio ドキュメント</comment>
+ <comment xml:lang="it">Documento Microsoft Visio</comment>
+ <comment xml:lang="is">Microsoft Visio skjal</comment>
+ <comment xml:lang="id">Dokumen Microsoft Visio</comment>
+ <comment xml:lang="ia">Documento Microsoft Visio</comment>
+ <comment xml:lang="hu">Microsoft Visio dokumentum</comment>
+ <comment xml:lang="hr">Microsoft Visio dokument</comment>
+ <comment xml:lang="he">מסמך Microsoft Visio</comment>
+ <comment xml:lang="gl">Documento de Microsoft Visio</comment>
+ <comment xml:lang="ga">cáipéis Microsoft Visio</comment>
+ <comment xml:lang="fur">document Microsoft Visio</comment>
+ <comment xml:lang="fr">document Microsoft Visio</comment>
+ <comment xml:lang="fi">Microsoft Visio -asiakirja</comment>
+ <comment xml:lang="eu">Microsoft Visio dokumentua</comment>
+ <comment xml:lang="es">documento de Microsoft Visio</comment>
+ <comment xml:lang="en_GB">Microsoft Visio document</comment>
+ <comment xml:lang="el">Έγγραφο Microsoft Visio</comment>
+ <comment xml:lang="de">Microsoft-Visio-Dokument</comment>
+ <comment xml:lang="da">Microsoft Visio-dokument</comment>
+ <comment xml:lang="cs">dokument Microsoft Visio</comment>
+ <comment xml:lang="ca">document de Microsoft Visio</comment>
+ <comment xml:lang="bg">Документ — Microsoft Visio</comment>
+ <comment xml:lang="be">дакумент Microsoft Visio</comment>
+ <comment xml:lang="ast">Documentu de Microsoft Visio</comment>
+ <comment xml:lang="ar">مستند مايكروسوفت فيزو</comment>
+ <comment xml:lang="af">Microsoft Visio-dokument</comment>
<sub-class-of type="application/x-ole-storage"/>
<generic-icon name="x-office-document"/>
<glob pattern="*.vsd"/>
@@ -4112,56 +4640,60 @@ command to generate the output files.
</mime-type>
<mime-type type="application/msword">
<comment>Word document</comment>
- <comment xml:lang="af">Word-dokument</comment>
- <comment xml:lang="ar">مستند Word</comment>
- <comment xml:lang="ast">Documentu de Word</comment>
- <comment xml:lang="be-Latn">Dakument Word</comment>
- <comment xml:lang="bg">Документ — Word</comment>
- <comment xml:lang="ca">document Word</comment>
- <comment xml:lang="cs">dokument Word</comment>
- <comment xml:lang="da">Worddokument</comment>
- <comment xml:lang="de">Word-Dokument</comment>
- <comment xml:lang="el">Έγγραφο Word</comment>
- <comment xml:lang="en-GB">Word document</comment>
- <comment xml:lang="eo">Word-dokumento</comment>
- <comment xml:lang="es">documento de Word</comment>
- <comment xml:lang="eu">Word dokumentua</comment>
- <comment xml:lang="fi">Word-asiakirja</comment>
- <comment xml:lang="fo">Word skjal</comment>
- <comment xml:lang="fr">document Word</comment>
- <comment xml:lang="fur">document Word</comment>
- <comment xml:lang="ga">cáipéis Word</comment>
- <comment xml:lang="gl">documento de Word</comment>
- <comment xml:lang="he">מסמך Word</comment>
- <comment xml:lang="hr">Word dokument</comment>
- <comment xml:lang="hu">Word dokumentum</comment>
- <comment xml:lang="ia">Documento Word</comment>
- <comment xml:lang="id">Dokumen Word</comment>
- <comment xml:lang="it">Documento Word</comment>
- <comment xml:lang="ja">Word ドキュメント</comment>
- <comment xml:lang="kk">Word құжаты</comment>
- <comment xml:lang="ko">Word 문서</comment>
- <comment xml:lang="lt">Word dokumentas</comment>
- <comment xml:lang="lv">Word dokuments</comment>
- <comment xml:lang="nb">Word-dokument</comment>
- <comment xml:lang="nl">Word-document</comment>
- <comment xml:lang="nn">Word-dokument</comment>
- <comment xml:lang="oc">document Word</comment>
- <comment xml:lang="pl">Dokument Word</comment>
- <comment xml:lang="pt">documento Word</comment>
- <comment xml:lang="pt-BR">Documento do Word</comment>
- <comment xml:lang="ro">Document Word</comment>
- <comment xml:lang="ru">Документ Word</comment>
- <comment xml:lang="sk">Dokument Word</comment>
- <comment xml:lang="sl">Dokument Word</comment>
- <comment xml:lang="sq">Dokument Word</comment>
- <comment xml:lang="sr">Ворд документ</comment>
- <comment xml:lang="sv">Word-dokument</comment>
- <comment xml:lang="tr">Word belgesi</comment>
- <comment xml:lang="uk">документ Word</comment>
+ <comment xml:lang="zh_TW">Word 文件</comment>
+ <comment xml:lang="zh_CN">Word 文档</comment>
<comment xml:lang="vi">Tài liệu Word</comment>
- <comment xml:lang="zh-CN">Word 文档</comment>
- <comment xml:lang="zh-TW">Word 文件</comment>
+ <comment xml:lang="uk">документ Word</comment>
+ <comment xml:lang="tr">Word belgesi</comment>
+ <comment xml:lang="sv">Word-dokument</comment>
+ <comment xml:lang="sr">Ворд документ</comment>
+ <comment xml:lang="sq">dokument Word</comment>
+ <comment xml:lang="sl">Dokument Word</comment>
+ <comment xml:lang="si">වචන ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument Word</comment>
+ <comment xml:lang="ru">Документ Word</comment>
+ <comment xml:lang="ro">Document Word</comment>
+ <comment xml:lang="pt_BR">Documento do Word</comment>
+ <comment xml:lang="pt">documento Word</comment>
+ <comment xml:lang="pl">Dokument Word</comment>
+ <comment xml:lang="oc">document Word</comment>
+ <comment xml:lang="nn">Word-dokument</comment>
+ <comment xml:lang="nl">Word-document</comment>
+ <comment xml:lang="nb">Word-dokument</comment>
+ <comment xml:lang="lv">Word dokuments</comment>
+ <comment xml:lang="lt">Word dokumentas</comment>
+ <comment xml:lang="ko">Word 문서</comment>
+ <comment xml:lang="kk">Word құжаты</comment>
+ <comment xml:lang="ka">Word -ის დოკუმენტი</comment>
+ <comment xml:lang="ja">Word ドキュメント</comment>
+ <comment xml:lang="it">Documento Word</comment>
+ <comment xml:lang="is">Word skjal</comment>
+ <comment xml:lang="id">Dokumen Word</comment>
+ <comment xml:lang="ia">Documento Word</comment>
+ <comment xml:lang="hu">Word dokumentum</comment>
+ <comment xml:lang="hr">Word dokument</comment>
+ <comment xml:lang="he">מסמך Word</comment>
+ <comment xml:lang="gl">documento de Word</comment>
+ <comment xml:lang="ga">cáipéis Word</comment>
+ <comment xml:lang="fur">document Word</comment>
+ <comment xml:lang="fr">document Word</comment>
+ <comment xml:lang="fo">Word skjal</comment>
+ <comment xml:lang="fi">Word-asiakirja</comment>
+ <comment xml:lang="eu">Word dokumentua</comment>
+ <comment xml:lang="es">documento de Word</comment>
+ <comment xml:lang="eo">Word-dokumento</comment>
+ <comment xml:lang="en_GB">Word document</comment>
+ <comment xml:lang="el">Έγγραφο Word</comment>
+ <comment xml:lang="de">Word-Dokument</comment>
+ <comment xml:lang="da">Worddokument</comment>
+ <comment xml:lang="cs">dokument Word</comment>
+ <comment xml:lang="ca">document Word</comment>
+ <comment xml:lang="bg">Документ — Word</comment>
+ <comment xml:lang="be@latin">Dakument Word</comment>
+ <comment xml:lang="be">дакумент Word</comment>
+ <comment xml:lang="ast">Documentu de Word</comment>
+ <comment xml:lang="ar">مستند ورد</comment>
+ <comment xml:lang="af">Word-dokument</comment>
<sub-class-of type="application/x-ole-storage"/>
<generic-icon name="x-office-document"/>
<magic priority="60">
@@ -4182,102 +4714,112 @@ command to generate the output files.
</mime-type>
<mime-type type="application/msword-template">
<comment>Word template</comment>
- <comment xml:lang="af">Word-sjabloon</comment>
- <comment xml:lang="ar">قالب Word</comment>
- <comment xml:lang="ast">Plantía de Word</comment>
- <comment xml:lang="be-Latn">Šablon Word</comment>
- <comment xml:lang="bg">Шаблон за документи — Word</comment>
- <comment xml:lang="ca">plantilla de Word</comment>
- <comment xml:lang="cs">šablona Word</comment>
- <comment xml:lang="da">Wordskabelon</comment>
- <comment xml:lang="de">Word-Vorlage</comment>
- <comment xml:lang="el">Πρότυπο έγγραφο Word</comment>
- <comment xml:lang="en-GB">Word template</comment>
- <comment xml:lang="eo">Word-ŝablono</comment>
- <comment xml:lang="es">plantilla de Word</comment>
- <comment xml:lang="eu">Word txantiloia</comment>
- <comment xml:lang="fi">Word-malli</comment>
- <comment xml:lang="fo">Word formur</comment>
- <comment xml:lang="fr">modèle Word</comment>
- <comment xml:lang="fur">model Word</comment>
- <comment xml:lang="ga">teimpléad Word</comment>
- <comment xml:lang="gl">Plantilla de Word</comment>
- <comment xml:lang="he">תבנית Word</comment>
- <comment xml:lang="hr">Word predložak</comment>
- <comment xml:lang="hu">Word sablon</comment>
- <comment xml:lang="ia">Patrono Word</comment>
- <comment xml:lang="id">Templat Word</comment>
- <comment xml:lang="it">Modello Word</comment>
- <comment xml:lang="ja">Word テンプレート</comment>
- <comment xml:lang="kk">Word үлгісі</comment>
- <comment xml:lang="ko">Word 서식</comment>
- <comment xml:lang="lt">Word šablonas</comment>
- <comment xml:lang="lv">Word veidne</comment>
- <comment xml:lang="nb">Word-mal</comment>
- <comment xml:lang="nl">Word-sjabloon</comment>
- <comment xml:lang="nn">Word-mal</comment>
- <comment xml:lang="oc">modèl Word</comment>
- <comment xml:lang="pl">Szablon Word</comment>
- <comment xml:lang="pt">modelo Word</comment>
- <comment xml:lang="pt-BR">Modelo do Word</comment>
- <comment xml:lang="ro">Șablon Word</comment>
- <comment xml:lang="ru">Шаблон Word</comment>
- <comment xml:lang="sk">Šablóna Word</comment>
- <comment xml:lang="sl">Predloga dokumenta Microsoft Word</comment>
- <comment xml:lang="sq">Model Word</comment>
- <comment xml:lang="sr">Ворд шаблон</comment>
- <comment xml:lang="sv">Word-mall</comment>
- <comment xml:lang="tr">Word şablonu</comment>
- <comment xml:lang="uk">шаблон Word</comment>
+ <comment xml:lang="zh_TW">Word 範本</comment>
+ <comment xml:lang="zh_CN">Word 模板</comment>
<comment xml:lang="vi">Mẫu Word</comment>
- <comment xml:lang="zh-CN">Word 模板</comment>
- <comment xml:lang="zh-TW">Word 範本</comment>
+ <comment xml:lang="uk">шаблон Word</comment>
+ <comment xml:lang="tr">Word şablonu</comment>
+ <comment xml:lang="sv">Word-mall</comment>
+ <comment xml:lang="sr">Ворд шаблон</comment>
+ <comment xml:lang="sq">gjedhe Word</comment>
+ <comment xml:lang="sl">Predloga dokumenta Microsoft Word</comment>
+ <comment xml:lang="si">වචන සැකිල්ල</comment>
+ <comment xml:lang="sk">Šablóna Word</comment>
+ <comment xml:lang="ru">Шаблон Word</comment>
+ <comment xml:lang="ro">Șablon Word</comment>
+ <comment xml:lang="pt_BR">Modelo do Word</comment>
+ <comment xml:lang="pt">modelo Word</comment>
+ <comment xml:lang="pl">Szablon Word</comment>
+ <comment xml:lang="oc">modèl Word</comment>
+ <comment xml:lang="nn">Word-mal</comment>
+ <comment xml:lang="nl">Word-sjabloon</comment>
+ <comment xml:lang="nb">Word-mal</comment>
+ <comment xml:lang="lv">Word veidne</comment>
+ <comment xml:lang="lt">Word šablonas</comment>
+ <comment xml:lang="ko">Word 서식</comment>
+ <comment xml:lang="kk">Word үлгісі</comment>
+ <comment xml:lang="ja">Word テンプレート</comment>
+ <comment xml:lang="it">Modello Word</comment>
+ <comment xml:lang="is">Word sniðmát</comment>
+ <comment xml:lang="id">Templat Word</comment>
+ <comment xml:lang="ia">Patrono Word</comment>
+ <comment xml:lang="hu">Word sablon</comment>
+ <comment xml:lang="hr">Word predložak</comment>
+ <comment xml:lang="he">תבנית Word</comment>
+ <comment xml:lang="gl">Plantilla de Word</comment>
+ <comment xml:lang="ga">teimpléad Word</comment>
+ <comment xml:lang="fur">model Word</comment>
+ <comment xml:lang="fr">modèle Word</comment>
+ <comment xml:lang="fo">Word formur</comment>
+ <comment xml:lang="fi">Word-malli</comment>
+ <comment xml:lang="eu">Word txantiloia</comment>
+ <comment xml:lang="es">plantilla de Word</comment>
+ <comment xml:lang="eo">Word-ŝablono</comment>
+ <comment xml:lang="en_GB">Word template</comment>
+ <comment xml:lang="el">Πρότυπο έγγραφο Word</comment>
+ <comment xml:lang="de">Word-Vorlage</comment>
+ <comment xml:lang="da">Wordskabelon</comment>
+ <comment xml:lang="cs">šablona Word</comment>
+ <comment xml:lang="ca">plantilla de Word</comment>
+ <comment xml:lang="bg">Шаблон за документи — Word</comment>
+ <comment xml:lang="be@latin">Šablon Word</comment>
+ <comment xml:lang="be">шаблон Word</comment>
+ <comment xml:lang="ast">Plantía de Word</comment>
+ <comment xml:lang="ar">قالب ورد</comment>
+ <comment xml:lang="af">Word-sjabloon</comment>
<sub-class-of type="application/msword"/>
<generic-icon name="x-office-document"/>
<glob pattern="*.dot"/>
</mime-type>
<mime-type type="application/gml+xml">
<comment>GML document</comment>
- <comment xml:lang="af">GML-dokument</comment>
- <comment xml:lang="ast">Documentu GML</comment>
- <comment xml:lang="bg">Документ — GML</comment>
- <comment xml:lang="ca">document GML</comment>
- <comment xml:lang="cs">dokument GML</comment>
- <comment xml:lang="da">GML-dokument</comment>
- <comment xml:lang="de">GML-Dokument</comment>
- <comment xml:lang="el">Έγγραφο GML</comment>
- <comment xml:lang="en-GB">GML document</comment>
- <comment xml:lang="es">documento GML</comment>
- <comment xml:lang="eu">GML dokumentua</comment>
- <comment xml:lang="fi">GML-asiakirja</comment>
- <comment xml:lang="fr">document GML</comment>
- <comment xml:lang="fur">document GML</comment>
- <comment xml:lang="ga">cáipéis GML</comment>
- <comment xml:lang="gl">Documento GML</comment>
- <comment xml:lang="he">מסמך GML</comment>
- <comment xml:lang="hr">GML dokument</comment>
- <comment xml:lang="hu">GML dokumentum</comment>
- <comment xml:lang="ia">Documento GML</comment>
- <comment xml:lang="id">Dokumen GML</comment>
- <comment xml:lang="it">Documento GML</comment>
- <comment xml:lang="ja">GML ドキュメント</comment>
- <comment xml:lang="kk">GML құжаты</comment>
- <comment xml:lang="ko">GML 문서</comment>
- <comment xml:lang="lt">GML dokumentas</comment>
- <comment xml:lang="lv">GML dokuments</comment>
- <comment xml:lang="oc">document GML</comment>
- <comment xml:lang="pl">Dokument GML</comment>
- <comment xml:lang="pt">documento GML</comment>
- <comment xml:lang="pt-BR">Documento GML</comment>
- <comment xml:lang="ru">Документ GML</comment>
- <comment xml:lang="sk">Dokument GML</comment>
- <comment xml:lang="sl">Dokument GML</comment>
- <comment xml:lang="sr">ГМЛ документ</comment>
- <comment xml:lang="sv">GML-dokument</comment>
- <comment xml:lang="tr">GML belgesi</comment>
+ <comment xml:lang="zh_TW">GML 文件</comment>
+ <comment xml:lang="zh_CN">GML 文档</comment>
<comment xml:lang="uk">документ GML</comment>
- <comment xml:lang="zh-CN">GML 文档</comment>
- <comment xml:lang="zh-TW">GML 文件</comment>
+ <comment xml:lang="tr">GML belgesi</comment>
+ <comment xml:lang="sv">GML-dokument</comment>
+ <comment xml:lang="sr">ГМЛ документ</comment>
+ <comment xml:lang="sq">dokument GML</comment>
+ <comment xml:lang="sl">Dokument GML</comment>
+ <comment xml:lang="si">GML ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument GML</comment>
+ <comment xml:lang="ru">Документ GML</comment>
+ <comment xml:lang="pt_BR">Documento GML</comment>
+ <comment xml:lang="pt">documento GML</comment>
+ <comment xml:lang="pl">Dokument GML</comment>
+ <comment xml:lang="oc">document GML</comment>
+ <comment xml:lang="nl">GML-document</comment>
+ <comment xml:lang="lv">GML dokuments</comment>
+ <comment xml:lang="lt">GML dokumentas</comment>
+ <comment xml:lang="ko">GML 문서</comment>
+ <comment xml:lang="kk">GML құжаты</comment>
+ <comment xml:lang="ka">GML -ის დოკუმენტი</comment>
+ <comment xml:lang="ja">GML ドキュメント</comment>
+ <comment xml:lang="it">Documento GML</comment>
+ <comment xml:lang="is">GML skjal</comment>
+ <comment xml:lang="id">Dokumen GML</comment>
+ <comment xml:lang="ia">Documento GML</comment>
+ <comment xml:lang="hu">GML dokumentum</comment>
+ <comment xml:lang="hr">GML dokument</comment>
+ <comment xml:lang="he">מסמך GML</comment>
+ <comment xml:lang="gl">Documento GML</comment>
+ <comment xml:lang="ga">cáipéis GML</comment>
+ <comment xml:lang="fur">document GML</comment>
+ <comment xml:lang="fr">document GML</comment>
+ <comment xml:lang="fi">GML-asiakirja</comment>
+ <comment xml:lang="eu">GML dokumentua</comment>
+ <comment xml:lang="es">documento GML</comment>
+ <comment xml:lang="en_GB">GML document</comment>
+ <comment xml:lang="el">Έγγραφο GML</comment>
+ <comment xml:lang="de">GML-Dokument</comment>
+ <comment xml:lang="da">GML-dokument</comment>
+ <comment xml:lang="cs">dokument GML</comment>
+ <comment xml:lang="ca">document GML</comment>
+ <comment xml:lang="bg">Документ — GML</comment>
+ <comment xml:lang="be">дакумент GML</comment>
+ <comment xml:lang="ast">Documentu GML</comment>
+ <comment xml:lang="ar">مستند GML</comment>
+ <comment xml:lang="af">GML-dokument</comment>
<acronym>GML</acronym>
<expanded-acronym>Geography Markup Language</expanded-acronym>
<glob pattern="*.gml"/>
@@ -4286,114 +4828,120 @@ command to generate the output files.
</mime-type>
<mime-type type="application/gnunet-directory">
<comment>GNUnet search file</comment>
- <comment xml:lang="af">GNUnet-soeklêer</comment>
- <comment xml:lang="ar">ملف بحث GNUnet</comment>
- <comment xml:lang="be-Latn">fajł pošuku GNUnet</comment>
- <comment xml:lang="bg">Указател за търсене — GNUnet</comment>
- <comment xml:lang="ca">fitxer de cerca GNUnet</comment>
- <comment xml:lang="cs">vyhledávací soubor GNUnet</comment>
- <comment xml:lang="da">GNunet-søgefil</comment>
- <comment xml:lang="de">GNUnet-Suchdatei</comment>
- <comment xml:lang="el">Αρχείο αναζήτησης GNUnet</comment>
- <comment xml:lang="en-GB">GNUnet search file</comment>
- <comment xml:lang="es">archivo de búsqueda GNUnet</comment>
- <comment xml:lang="eu">GNUnet bilaketako fitxategia</comment>
- <comment xml:lang="fi">GNUnet-hakutiedosto</comment>
- <comment xml:lang="fo">GNUnet leitifíla</comment>
- <comment xml:lang="fr">fichier de recherche GNUnet</comment>
- <comment xml:lang="fur">file di ricercje GNUnet</comment>
- <comment xml:lang="ga">comhad cuardaigh GNUnet</comment>
- <comment xml:lang="gl">ficheiro de busca de GNUnet</comment>
- <comment xml:lang="he">קובץ חיפוש של GNUnet</comment>
- <comment xml:lang="hr">GNUnet datoteka pretrage</comment>
- <comment xml:lang="hu">GNUnet keresési fájl</comment>
- <comment xml:lang="ia">File de recerca GNUnet</comment>
- <comment xml:lang="id">Berkas telusur GNUnet</comment>
- <comment xml:lang="it">File ricerca GNUnet</comment>
- <comment xml:lang="ja">GNUnet 検索ファイル</comment>
- <comment xml:lang="ka">GNUnet ძებნის ფაილი</comment>
- <comment xml:lang="kk">GNUnet іздеу файлы</comment>
- <comment xml:lang="ko">GNUnet 검색 파일</comment>
- <comment xml:lang="lt">GNUnet paieškos failas</comment>
- <comment xml:lang="lv">GNUnet meklēšanas datne</comment>
- <comment xml:lang="nb">GNUnet søkefil</comment>
- <comment xml:lang="nl">GNUnet-zoekbestand</comment>
- <comment xml:lang="nn">GNUnet-søkjefil</comment>
- <comment xml:lang="oc">fichièr de recèrca GNUnet</comment>
- <comment xml:lang="pl">Plik wyszukiwania GNUnet</comment>
- <comment xml:lang="pt">ficheiro de procura GNUnet</comment>
- <comment xml:lang="pt-BR">Arquivo de pesquisa do GNUnet</comment>
- <comment xml:lang="ro">Fișier căutare GNUnet</comment>
- <comment xml:lang="ru">Файл поиска GNUnet</comment>
- <comment xml:lang="sk">Vyhľadávací súbor GNUnet</comment>
- <comment xml:lang="sl">Iskalna datoteka GNUnet</comment>
- <comment xml:lang="sq">File kërkimi GNUnet</comment>
- <comment xml:lang="sr">ГНУнет датотека претраге</comment>
- <comment xml:lang="sv">GNUnet-sökfil</comment>
- <comment xml:lang="tr">GNUnet arama dosyası</comment>
- <comment xml:lang="uk">файл пошуку GNUnet</comment>
+ <comment xml:lang="zh_TW">GNUnet 搜尋檔案</comment>
+ <comment xml:lang="zh_CN">GNUnet 搜索文件</comment>
<comment xml:lang="vi">Tập tin tìm kiếm GNUnet</comment>
- <comment xml:lang="zh-CN">GNUnet 搜索文件</comment>
- <comment xml:lang="zh-TW">GNUnet 搜尋檔案</comment>
- <magic priority="50">
+ <comment xml:lang="uk">файл пошуку GNUnet</comment>
+ <comment xml:lang="tr">GNUnet arama dosyası</comment>
+ <comment xml:lang="sv">GNUnet-sökfil</comment>
+ <comment xml:lang="sr">ГНУнет датотека претраге</comment>
+ <comment xml:lang="sq">kartelë kërkimi GNUnet</comment>
+ <comment xml:lang="sl">Iskalna datoteka GNUnet</comment>
+ <comment xml:lang="si">GNUnet සෙවුම් ගොනුව</comment>
+ <comment xml:lang="sk">Vyhľadávací súbor GNUnet</comment>
+ <comment xml:lang="ru">Файл поиска GNUnet</comment>
+ <comment xml:lang="ro">Fișier căutare GNUnet</comment>
+ <comment xml:lang="pt_BR">Arquivo de pesquisa do GNUnet</comment>
+ <comment xml:lang="pt">ficheiro de procura GNUnet</comment>
+ <comment xml:lang="pl">Plik wyszukiwania GNUnet</comment>
+ <comment xml:lang="oc">fichièr de recèrca GNUnet</comment>
+ <comment xml:lang="nn">GNUnet-søkjefil</comment>
+ <comment xml:lang="nl">GNUnet-zoekbestand</comment>
+ <comment xml:lang="nb">GNUnet søkefil</comment>
+ <comment xml:lang="lv">GNUnet meklēšanas datne</comment>
+ <comment xml:lang="lt">GNUnet paieškos failas</comment>
+ <comment xml:lang="ko">GNUnet 검색 파일</comment>
+ <comment xml:lang="kk">GNUnet іздеу файлы</comment>
+ <comment xml:lang="ka">GNUnet ძებნის ფაილი</comment>
+ <comment xml:lang="ja">GNUnet 検索ファイル</comment>
+ <comment xml:lang="it">File ricerca GNUnet</comment>
+ <comment xml:lang="is">GNUnet leitarskrá</comment>
+ <comment xml:lang="id">Berkas telusur GNUnet</comment>
+ <comment xml:lang="ia">File de recerca GNUnet</comment>
+ <comment xml:lang="hu">GNUnet keresési fájl</comment>
+ <comment xml:lang="hr">GNUnet datoteka pretrage</comment>
+ <comment xml:lang="he">קובץ חיפוש של GNUnet</comment>
+ <comment xml:lang="gl">ficheiro de busca de GNUnet</comment>
+ <comment xml:lang="ga">comhad cuardaigh GNUnet</comment>
+ <comment xml:lang="fur">file di ricercje GNUnet</comment>
+ <comment xml:lang="fr">fichier de recherche GNUnet</comment>
+ <comment xml:lang="fo">GNUnet leitifíla</comment>
+ <comment xml:lang="fi">GNUnet-hakutiedosto</comment>
+ <comment xml:lang="eu">GNUnet bilaketako fitxategia</comment>
+ <comment xml:lang="es">archivo de búsqueda GNUnet</comment>
+ <comment xml:lang="en_GB">GNUnet search file</comment>
+ <comment xml:lang="el">Αρχείο αναζήτησης GNUnet</comment>
+ <comment xml:lang="de">GNUnet-Suchdatei</comment>
+ <comment xml:lang="da">GNunet-søgefil</comment>
+ <comment xml:lang="cs">vyhledávací soubor GNUnet</comment>
+ <comment xml:lang="ca">fitxer de cerca GNUnet</comment>
+ <comment xml:lang="bg">Указател за търсене — GNUnet</comment>
+ <comment xml:lang="be@latin">fajł pošuku GNUnet</comment>
+ <comment xml:lang="be">файл пошуку GNUnet</comment>
+ <comment xml:lang="ar">ملف بحث GNUnet</comment>
+ <comment xml:lang="af">GNUnet-soeklêer</comment>
+ <magic>
<match type="string" value="\211GND\r\n\032\n" offset="0"/>
</magic>
<glob pattern="*.gnd"/>
</mime-type>
<mime-type type="application/vnd.ms-tnef">
<comment>TNEF message</comment>
- <comment xml:lang="af">TNEF-boodskap</comment>
- <comment xml:lang="ar">رسالة TNEF</comment>
- <comment xml:lang="ast">Mensaxe TNEF</comment>
- <comment xml:lang="be-Latn">List TNEF</comment>
- <comment xml:lang="bg">Съобщение — TNEF</comment>
- <comment xml:lang="ca">missatge TNEF</comment>
- <comment xml:lang="cs">zpráva TNEF</comment>
- <comment xml:lang="da">TNEF-meddelelse</comment>
- <comment xml:lang="de">TNEF-Nachricht</comment>
- <comment xml:lang="el">Μήνυμα TNEF</comment>
- <comment xml:lang="en-GB">TNEF message</comment>
- <comment xml:lang="es">mensaje TNEF</comment>
- <comment xml:lang="eu">TNEF mezua</comment>
- <comment xml:lang="fi">TNEF-viesti</comment>
- <comment xml:lang="fo">TNEF boð</comment>
- <comment xml:lang="fr">message TNEF</comment>
- <comment xml:lang="fur">messaç TNEF</comment>
- <comment xml:lang="ga">teachtaireacht TNEF</comment>
- <comment xml:lang="gl">mensaxe TNEF</comment>
- <comment xml:lang="he">הודעת TNEF</comment>
- <comment xml:lang="hr">TNEF poruka</comment>
- <comment xml:lang="hu">TNEF üzenet</comment>
- <comment xml:lang="ia">Message TNEF</comment>
- <comment xml:lang="id">Pesan TNEF</comment>
- <comment xml:lang="it">Messaggio TNEF</comment>
- <comment xml:lang="ja">TNEF メッセージ</comment>
- <comment xml:lang="kk">TNEF мәлімдемесі</comment>
- <comment xml:lang="ko">TNEF 메시지</comment>
- <comment xml:lang="lt">TNEF žinutė</comment>
- <comment xml:lang="lv">TNEF ziņojums</comment>
- <comment xml:lang="nb">TNEF-melding</comment>
- <comment xml:lang="nl">TNEF-bericht</comment>
- <comment xml:lang="nn">TNEF-melding</comment>
- <comment xml:lang="oc">messatge TNEF</comment>
- <comment xml:lang="pl">Wiadomość TNEF</comment>
- <comment xml:lang="pt">mensagem TNEF</comment>
- <comment xml:lang="pt-BR">Mensagem TNEF</comment>
- <comment xml:lang="ro">Mesaj TNEF</comment>
- <comment xml:lang="ru">Сообщение TNEF</comment>
- <comment xml:lang="sk">Správa TNEF</comment>
- <comment xml:lang="sl">Datoteka sporočila TNEF</comment>
- <comment xml:lang="sq">Mesazh TNEF</comment>
- <comment xml:lang="sr">ТНЕФ порука</comment>
- <comment xml:lang="sv">TNEF-meddelande</comment>
- <comment xml:lang="tr">TNEF iletisi</comment>
- <comment xml:lang="uk">повідомлення TNEF</comment>
+ <comment xml:lang="zh_TW">TNEF 訊息</comment>
+ <comment xml:lang="zh_CN">TNEF 信件</comment>
<comment xml:lang="vi">Thông điệp TNEF</comment>
- <comment xml:lang="zh-CN">TNEF 信件</comment>
- <comment xml:lang="zh-TW">TNEF 訊息</comment>
+ <comment xml:lang="uk">повідомлення TNEF</comment>
+ <comment xml:lang="tr">TNEF iletisi</comment>
+ <comment xml:lang="sv">TNEF-meddelande</comment>
+ <comment xml:lang="sr">ТНЕФ порука</comment>
+ <comment xml:lang="sq">mesazh TNEF</comment>
+ <comment xml:lang="sl">Datoteka sporočila TNEF</comment>
+ <comment xml:lang="si">TNEF පණිවිඩය</comment>
+ <comment xml:lang="sk">Správa TNEF</comment>
+ <comment xml:lang="ru">Сообщение TNEF</comment>
+ <comment xml:lang="ro">Mesaj TNEF</comment>
+ <comment xml:lang="pt_BR">Mensagem TNEF</comment>
+ <comment xml:lang="pt">mensagem TNEF</comment>
+ <comment xml:lang="pl">Wiadomość TNEF</comment>
+ <comment xml:lang="oc">messatge TNEF</comment>
+ <comment xml:lang="nn">TNEF-melding</comment>
+ <comment xml:lang="nl">TNEF-bericht</comment>
+ <comment xml:lang="nb">TNEF-melding</comment>
+ <comment xml:lang="lv">TNEF ziņojums</comment>
+ <comment xml:lang="lt">TNEF žinutė</comment>
+ <comment xml:lang="ko">TNEF 메시지</comment>
+ <comment xml:lang="kk">TNEF мәлімдемесі</comment>
+ <comment xml:lang="ja">TNEF メッセージ</comment>
+ <comment xml:lang="it">Messaggio TNEF</comment>
+ <comment xml:lang="is">TNEF skilaboð</comment>
+ <comment xml:lang="id">Pesan TNEF</comment>
+ <comment xml:lang="ia">Message TNEF</comment>
+ <comment xml:lang="hu">TNEF üzenet</comment>
+ <comment xml:lang="hr">TNEF poruka</comment>
+ <comment xml:lang="he">הודעת TNEF</comment>
+ <comment xml:lang="gl">mensaxe TNEF</comment>
+ <comment xml:lang="ga">teachtaireacht TNEF</comment>
+ <comment xml:lang="fur">messaç TNEF</comment>
+ <comment xml:lang="fr">message TNEF</comment>
+ <comment xml:lang="fo">TNEF boð</comment>
+ <comment xml:lang="fi">TNEF-viesti</comment>
+ <comment xml:lang="eu">TNEF mezua</comment>
+ <comment xml:lang="es">mensaje TNEF</comment>
+ <comment xml:lang="en_GB">TNEF message</comment>
+ <comment xml:lang="el">Μήνυμα TNEF</comment>
+ <comment xml:lang="de">TNEF-Nachricht</comment>
+ <comment xml:lang="da">TNEF-meddelelse</comment>
+ <comment xml:lang="cs">zpráva TNEF</comment>
+ <comment xml:lang="ca">missatge TNEF</comment>
+ <comment xml:lang="bg">Съобщение — TNEF</comment>
+ <comment xml:lang="be@latin">List TNEF</comment>
+ <comment xml:lang="be">паведамленне TNEF</comment>
+ <comment xml:lang="ast">Mensaxe TNEF</comment>
+ <comment xml:lang="ar">رسالة TNEF</comment>
+ <comment xml:lang="af">TNEF-boodskap</comment>
<acronym>TNEF</acronym>
<expanded-acronym>Transport Neutral Encapsulation Format</expanded-acronym>
- <magic priority="50">
+ <magic>
<match type="little32" value="0x223e9f78" offset="0"/>
</magic>
<glob pattern="*.tnef"/>
@@ -4403,397 +4951,418 @@ command to generate the output files.
</mime-type>
<mime-type type="application/vnd.stardivision.calc">
<comment>StarCalc spreadsheet</comment>
- <comment xml:lang="af">StarCalc-sigblad</comment>
- <comment xml:lang="ar">جدول StarCalc</comment>
- <comment xml:lang="az">StarCalc hesab cədvəli</comment>
- <comment xml:lang="be-Latn">Raźlikovy arkuš StarCalc</comment>
- <comment xml:lang="bg">Таблица — StarCalc</comment>
- <comment xml:lang="ca">full de càlcul de StarCalc</comment>
- <comment xml:lang="cs">sešit StarCalc</comment>
- <comment xml:lang="cy">Taenlen StarCalc</comment>
- <comment xml:lang="da">StarCalc-regneark</comment>
- <comment xml:lang="de">StarCalc-Tabelle</comment>
- <comment xml:lang="el">Λογιστικό φύλλο StarCalc</comment>
- <comment xml:lang="en-GB">StarCalc spreadsheet</comment>
- <comment xml:lang="eo">StarCalc-kalkultabelo</comment>
- <comment xml:lang="es">hoja de cálculo de StarCalc</comment>
- <comment xml:lang="eu">StarCalc kalkulu-orria</comment>
- <comment xml:lang="fi">StarCalc-taulukko</comment>
- <comment xml:lang="fo">StarCalc rokniark</comment>
- <comment xml:lang="fr">feuille de calcul StarCalc</comment>
- <comment xml:lang="fur">sfuei di calcul StarCalc</comment>
- <comment xml:lang="ga">scarbhileog StarCalc</comment>
- <comment xml:lang="gl">folla de cálculo de StarCalc</comment>
- <comment xml:lang="he">גליון נתונים של StarCalc</comment>
- <comment xml:lang="hr">StarCalc proračunska tablica</comment>
- <comment xml:lang="hu">StarCalc-munkafüzet</comment>
- <comment xml:lang="ia">Folio de calculo StarCalc</comment>
- <comment xml:lang="id">Lembar sebar StarCalc</comment>
- <comment xml:lang="it">Foglio di calcolo StarCalc</comment>
- <comment xml:lang="ja">StarCalc スプレッドシート</comment>
- <comment xml:lang="kk">StarCalc электрондық кестесі</comment>
- <comment xml:lang="ko">StarCalc 스프레드시트</comment>
- <comment xml:lang="lt">StarCalc skaičialentė</comment>
- <comment xml:lang="lv">StarCalc izklājlapa</comment>
- <comment xml:lang="ms">Hamparan StarCalc</comment>
- <comment xml:lang="nb">StarCalc-regneark</comment>
- <comment xml:lang="nl">StarCalc-rekenblad</comment>
- <comment xml:lang="nn">StarCalc-rekneark</comment>
- <comment xml:lang="oc">fuèlh de calcul StarCalc</comment>
- <comment xml:lang="pl">Arkusz StarCalc</comment>
- <comment xml:lang="pt">folha de cálculo do StarCalc</comment>
- <comment xml:lang="pt-BR">Planilha do StarCalc</comment>
- <comment xml:lang="ro">Foaie de calcul StarCalc</comment>
- <comment xml:lang="ru">Электронная таблица StarCalc</comment>
- <comment xml:lang="sk">Zošit StarCalc</comment>
- <comment xml:lang="sl">Preglednica StarCalc</comment>
- <comment xml:lang="sq">Fletë llogaritjesh StarCalc</comment>
- <comment xml:lang="sr">Стар калк табела</comment>
- <comment xml:lang="sv">StarCalc-kalkylblad</comment>
- <comment xml:lang="tr">StarCalc hesap çizelgesi</comment>
- <comment xml:lang="uk">ел. таблиця StarCalc</comment>
+ <comment xml:lang="zh_TW">StarCalc 試算表</comment>
+ <comment xml:lang="zh_CN">StarCalc 电子表格</comment>
<comment xml:lang="vi">Bảng tính StarCalc</comment>
- <comment xml:lang="zh-CN">StarCalc 电子表格</comment>
- <comment xml:lang="zh-TW">StarCalc 試算表</comment>
+ <comment xml:lang="uk">електронна таблиця StarCalc</comment>
+ <comment xml:lang="tr">StarCalc hesap çizelgesi</comment>
+ <comment xml:lang="sv">StarCalc-kalkylblad</comment>
+ <comment xml:lang="sr">Стар калк табела</comment>
+ <comment xml:lang="sq">fletëllogaritje StarCalc</comment>
+ <comment xml:lang="sl">Preglednica StarCalc</comment>
+ <comment xml:lang="si">StarCalc පැතුරුම්පත</comment>
+ <comment xml:lang="sk">Zošit StarCalc</comment>
+ <comment xml:lang="ru">Электронная таблица StarCalc</comment>
+ <comment xml:lang="ro">Foaie de calcul StarCalc</comment>
+ <comment xml:lang="pt_BR">Planilha do StarCalc</comment>
+ <comment xml:lang="pt">folha de cálculo do StarCalc</comment>
+ <comment xml:lang="pl">Arkusz StarCalc</comment>
+ <comment xml:lang="oc">fuèlh de calcul StarCalc</comment>
+ <comment xml:lang="nn">StarCalc-rekneark</comment>
+ <comment xml:lang="nl">StarCalc-rekenblad</comment>
+ <comment xml:lang="nb">StarCalc-regneark</comment>
+ <comment xml:lang="ms">Hamparan StarCalc</comment>
+ <comment xml:lang="lv">StarCalc izklājlapa</comment>
+ <comment xml:lang="lt">StarCalc skaičialentė</comment>
+ <comment xml:lang="ko">StarCalc 스프레드시트</comment>
+ <comment xml:lang="kk">StarCalc электрондық кестесі</comment>
+ <comment xml:lang="ja">StarCalc スプレッドシート</comment>
+ <comment xml:lang="it">Foglio di calcolo StarCalc</comment>
+ <comment xml:lang="is">StarCalc töflureikniskjal</comment>
+ <comment xml:lang="id">Lembar sebar StarCalc</comment>
+ <comment xml:lang="ia">Folio de calculo StarCalc</comment>
+ <comment xml:lang="hu">StarCalc-munkafüzet</comment>
+ <comment xml:lang="hr">StarCalc proračunska tablica</comment>
+ <comment xml:lang="he">גיליון נתונים של StarCalc</comment>
+ <comment xml:lang="gl">folla de cálculo de StarCalc</comment>
+ <comment xml:lang="ga">scarbhileog StarCalc</comment>
+ <comment xml:lang="fur">sfuei di calcul StarCalc</comment>
+ <comment xml:lang="fr">feuille de calcul StarCalc</comment>
+ <comment xml:lang="fo">StarCalc rokniark</comment>
+ <comment xml:lang="fi">StarCalc-taulukko</comment>
+ <comment xml:lang="eu">StarCalc kalkulu-orria</comment>
+ <comment xml:lang="es">hoja de cálculo de StarCalc</comment>
+ <comment xml:lang="eo">StarCalc-kalkultabelo</comment>
+ <comment xml:lang="en_GB">StarCalc spreadsheet</comment>
+ <comment xml:lang="el">Λογιστικό φύλλο StarCalc</comment>
+ <comment xml:lang="de">StarCalc-Tabelle</comment>
+ <comment xml:lang="da">StarCalc-regneark</comment>
+ <comment xml:lang="cy">Taenlen StarCalc</comment>
+ <comment xml:lang="cs">sešit StarCalc</comment>
+ <comment xml:lang="ca">full de càlcul de StarCalc</comment>
+ <comment xml:lang="bg">Таблица — StarCalc</comment>
+ <comment xml:lang="be@latin">Raźlikovy arkuš StarCalc</comment>
+ <comment xml:lang="be">электронная табліца StarCalc</comment>
+ <comment xml:lang="az">StarCalc hesab cədvəli</comment>
+ <comment xml:lang="ar">جدول StarCalc</comment>
+ <comment xml:lang="af">StarCalc-sigblad</comment>
<generic-icon name="x-office-spreadsheet"/>
<glob pattern="*.sdc"/>
</mime-type>
<mime-type type="application/vnd.stardivision.chart">
<comment>StarChart chart</comment>
- <comment xml:lang="af">StarChart-grafiek</comment>
- <comment xml:lang="ar">مخطط StarChart</comment>
- <comment xml:lang="az">StarChart cədvəli</comment>
- <comment xml:lang="be-Latn">Dyjahrama StarChart</comment>
- <comment xml:lang="bg">Диаграма — StarChart</comment>
- <comment xml:lang="ca">diagrama de StarChart</comment>
- <comment xml:lang="cs">graf StarChart</comment>
- <comment xml:lang="cy">Siart StarChart</comment>
- <comment xml:lang="da">StarChart-diagram</comment>
- <comment xml:lang="de">StarChart-Diagramm</comment>
- <comment xml:lang="el">Γράφημα StarChart</comment>
- <comment xml:lang="en-GB">StarChart chart</comment>
- <comment xml:lang="eo">StarChart-diagramo</comment>
- <comment xml:lang="es">gráfico de StarChart</comment>
- <comment xml:lang="eu">StarChart diagrama</comment>
- <comment xml:lang="fi">StarChart-kaavio</comment>
- <comment xml:lang="fo">StarChart strikumynd</comment>
- <comment xml:lang="fr">graphique StarChart</comment>
- <comment xml:lang="fur">grafic StarChart</comment>
- <comment xml:lang="ga">cairt StarChart</comment>
- <comment xml:lang="gl">gráfica de StarChart</comment>
- <comment xml:lang="he">טבלה של StarChart</comment>
- <comment xml:lang="hr">StarChart grafikon</comment>
- <comment xml:lang="hu">StarChart-grafikon</comment>
- <comment xml:lang="ia">Graphico StarChart</comment>
- <comment xml:lang="id">Bagan StarChart</comment>
- <comment xml:lang="it">Grafico StarChart</comment>
- <comment xml:lang="ja">StarChart チャート</comment>
- <comment xml:lang="kk">StarChart диаграммасы</comment>
- <comment xml:lang="ko">StarCalc 표</comment>
- <comment xml:lang="lt">StarChart diagrama</comment>
- <comment xml:lang="lv">StarChart diagramma</comment>
- <comment xml:lang="ms">Carta StarChart</comment>
- <comment xml:lang="nb">StarChart graf</comment>
- <comment xml:lang="nl">StarChart-kaart</comment>
- <comment xml:lang="nn">StarChart-graf</comment>
- <comment xml:lang="oc">grafic StarChart</comment>
- <comment xml:lang="pl">Wykres StarChart</comment>
- <comment xml:lang="pt">gráfico do StarChart</comment>
- <comment xml:lang="pt-BR">Gráfico do StarChart</comment>
- <comment xml:lang="ro">Diagramă StarChart</comment>
- <comment xml:lang="ru">Диаграмма StarChart</comment>
- <comment xml:lang="sk">Graf StarChart</comment>
- <comment xml:lang="sl">Datoteka grafikona StarChart</comment>
- <comment xml:lang="sq">Grafik StarChart</comment>
- <comment xml:lang="sr">График Стар Графика</comment>
- <comment xml:lang="sv">StarChart-diagram</comment>
- <comment xml:lang="tr">StarChart çizgesi</comment>
- <comment xml:lang="uk">діаграма StarChart</comment>
+ <comment xml:lang="zh_TW">StarChart 圖表</comment>
+ <comment xml:lang="zh_CN">StarCalc 图表</comment>
<comment xml:lang="vi">Đồ thị StarChart</comment>
- <comment xml:lang="zh-CN">StarCalc 图表</comment>
- <comment xml:lang="zh-TW">StarChart 圖表</comment>
+ <comment xml:lang="uk">діаграма StarChart</comment>
+ <comment xml:lang="tr">StarChart çizgesi</comment>
+ <comment xml:lang="sv">StarChart-diagram</comment>
+ <comment xml:lang="sr">График Стар Графика</comment>
+ <comment xml:lang="sq">grafik StarChart</comment>
+ <comment xml:lang="sl">Datoteka grafikona StarChart</comment>
+ <comment xml:lang="si">StarChart සටහන</comment>
+ <comment xml:lang="sk">Graf StarChart</comment>
+ <comment xml:lang="ru">Диаграмма StarChart</comment>
+ <comment xml:lang="ro">Diagramă StarChart</comment>
+ <comment xml:lang="pt_BR">Gráfico do StarChart</comment>
+ <comment xml:lang="pt">gráfico do StarChart</comment>
+ <comment xml:lang="pl">Wykres StarChart</comment>
+ <comment xml:lang="oc">grafic StarChart</comment>
+ <comment xml:lang="nn">StarChart-graf</comment>
+ <comment xml:lang="nl">StarChart-kaart</comment>
+ <comment xml:lang="nb">StarChart graf</comment>
+ <comment xml:lang="ms">Carta StarChart</comment>
+ <comment xml:lang="lv">StarChart diagramma</comment>
+ <comment xml:lang="lt">StarChart diagrama</comment>
+ <comment xml:lang="ko">StarCalc 표</comment>
+ <comment xml:lang="kk">StarChart диаграммасы</comment>
+ <comment xml:lang="ja">StarChart チャート</comment>
+ <comment xml:lang="it">Grafico StarChart</comment>
+ <comment xml:lang="is">StarChart kort</comment>
+ <comment xml:lang="id">Bagan StarChart</comment>
+ <comment xml:lang="ia">Graphico StarChart</comment>
+ <comment xml:lang="hu">StarChart-grafikon</comment>
+ <comment xml:lang="hr">StarChart grafikon</comment>
+ <comment xml:lang="he">טבלת StarChart</comment>
+ <comment xml:lang="gl">gráfica de StarChart</comment>
+ <comment xml:lang="ga">cairt StarChart</comment>
+ <comment xml:lang="fur">grafic StarChart</comment>
+ <comment xml:lang="fr">graphique StarChart</comment>
+ <comment xml:lang="fo">StarChart strikumynd</comment>
+ <comment xml:lang="fi">StarChart-kaavio</comment>
+ <comment xml:lang="eu">StarChart diagrama</comment>
+ <comment xml:lang="es">gráfico de StarChart</comment>
+ <comment xml:lang="eo">StarChart-diagramo</comment>
+ <comment xml:lang="en_GB">StarChart chart</comment>
+ <comment xml:lang="el">Γράφημα StarChart</comment>
+ <comment xml:lang="de">StarChart-Diagramm</comment>
+ <comment xml:lang="da">StarChart-diagram</comment>
+ <comment xml:lang="cy">Siart StarChart</comment>
+ <comment xml:lang="cs">graf StarChart</comment>
+ <comment xml:lang="ca">diagrama de StarChart</comment>
+ <comment xml:lang="bg">Диаграма — StarChart</comment>
+ <comment xml:lang="be@latin">Dyjahrama StarChart</comment>
+ <comment xml:lang="be">дыяграма StarChart</comment>
+ <comment xml:lang="az">StarChart cədvəli</comment>
+ <comment xml:lang="ar">مخطط StarChart</comment>
+ <comment xml:lang="af">StarChart-grafiek</comment>
<generic-icon name="x-office-spreadsheet"/>
<glob pattern="*.sds"/>
</mime-type>
<mime-type type="application/vnd.stardivision.draw">
<comment>StarDraw drawing</comment>
- <comment xml:lang="af">StarDraw-tekening</comment>
- <comment xml:lang="ar">تصميم StarDraw</comment>
- <comment xml:lang="az">StarDraw çəkimi</comment>
- <comment xml:lang="be-Latn">Rysunak StarDraw</comment>
- <comment xml:lang="bg">Чертеж — StarDraw</comment>
- <comment xml:lang="ca">dibuix de StarDraw</comment>
- <comment xml:lang="cs">kresba StarDraw</comment>
- <comment xml:lang="cy">Darlun StarDraw</comment>
- <comment xml:lang="da">StarDraw-tegning</comment>
- <comment xml:lang="de">StarDraw-Zeichnung</comment>
- <comment xml:lang="el">Σχέδιο StarDraw</comment>
- <comment xml:lang="en-GB">StarDraw drawing</comment>
- <comment xml:lang="eo">StarDraw-grafikaĵo</comment>
- <comment xml:lang="es">dibujo de StarDraw</comment>
- <comment xml:lang="eu">StarDraw marrazkia</comment>
- <comment xml:lang="fi">StarDraw-piirros</comment>
- <comment xml:lang="fo">StarDraw tekning</comment>
- <comment xml:lang="fr">dessin StarDraw</comment>
- <comment xml:lang="fur">dissen StarDraw</comment>
- <comment xml:lang="ga">líníocht StarDraw</comment>
- <comment xml:lang="gl">debuxo de StarDraw</comment>
- <comment xml:lang="he">ציור של StarDrawing</comment>
- <comment xml:lang="hr">StarDraw crtež</comment>
- <comment xml:lang="hu">StarDraw-rajz</comment>
- <comment xml:lang="ia">Designo StarDraw</comment>
- <comment xml:lang="id">Gambar StarDraw</comment>
- <comment xml:lang="it">Disegno StarDraw</comment>
- <comment xml:lang="ja">StarDraw ドロー</comment>
- <comment xml:lang="kk">StarDraw суреті</comment>
- <comment xml:lang="ko">StarCalc 드로잉</comment>
- <comment xml:lang="lt">StarDraw piešinys</comment>
- <comment xml:lang="lv">StarDraw zīmējums</comment>
- <comment xml:lang="ms">Lukisan StarDraw</comment>
- <comment xml:lang="nb">StarDraw tegning</comment>
- <comment xml:lang="nl">StarDraw-tekening</comment>
- <comment xml:lang="nn">StarDraw-teikning</comment>
- <comment xml:lang="oc">dessenh StarDraw</comment>
- <comment xml:lang="pl">Rysunek StarDraw</comment>
- <comment xml:lang="pt">desenho do StarDraw</comment>
- <comment xml:lang="pt-BR">Desenho do StarDraw</comment>
- <comment xml:lang="ro">Desen StarDraw</comment>
- <comment xml:lang="ru">Рисунок StarDraw</comment>
- <comment xml:lang="sk">Kresba StarDraw</comment>
- <comment xml:lang="sl">Datoteka risbe StarDraw</comment>
- <comment xml:lang="sq">Vizatim StarDraw</comment>
- <comment xml:lang="sr">Цртеж Стар Цртежа</comment>
- <comment xml:lang="sv">StarDraw-teckning</comment>
- <comment xml:lang="tr">StarDraw çizimi</comment>
- <comment xml:lang="uk">малюнок StarDraw</comment>
+ <comment xml:lang="zh_TW">StarDraw 繪圖</comment>
+ <comment xml:lang="zh_CN">StarDraw 绘图</comment>
<comment xml:lang="vi">Bản vẽ StarDraw</comment>
- <comment xml:lang="zh-CN">StarDraw 绘图</comment>
- <comment xml:lang="zh-TW">StarDraw 繪圖</comment>
+ <comment xml:lang="uk">малюнок StarDraw</comment>
+ <comment xml:lang="tr">StarDraw çizimi</comment>
+ <comment xml:lang="sv">StarDraw-teckning</comment>
+ <comment xml:lang="sr">Цртеж Стар Цртежа</comment>
+ <comment xml:lang="sq">vizatim StarDraw</comment>
+ <comment xml:lang="sl">Datoteka risbe StarDraw</comment>
+ <comment xml:lang="si">StarDraw ඇඳීම</comment>
+ <comment xml:lang="sk">Kresba StarDraw</comment>
+ <comment xml:lang="ru">Рисунок StarDraw</comment>
+ <comment xml:lang="ro">Desen StarDraw</comment>
+ <comment xml:lang="pt_BR">Desenho do StarDraw</comment>
+ <comment xml:lang="pt">desenho do StarDraw</comment>
+ <comment xml:lang="pl">Rysunek StarDraw</comment>
+ <comment xml:lang="oc">dessenh StarDraw</comment>
+ <comment xml:lang="nn">StarDraw-teikning</comment>
+ <comment xml:lang="nl">StarDraw-tekening</comment>
+ <comment xml:lang="nb">StarDraw tegning</comment>
+ <comment xml:lang="ms">Lukisan StarDraw</comment>
+ <comment xml:lang="lv">StarDraw zīmējums</comment>
+ <comment xml:lang="lt">StarDraw piešinys</comment>
+ <comment xml:lang="ko">StarCalc 드로잉</comment>
+ <comment xml:lang="kk">StarDraw суреті</comment>
+ <comment xml:lang="ja">StarDraw ドロー</comment>
+ <comment xml:lang="it">Disegno StarDraw</comment>
+ <comment xml:lang="is">StarDraw teikning</comment>
+ <comment xml:lang="id">Gambar StarDraw</comment>
+ <comment xml:lang="ia">Designo StarDraw</comment>
+ <comment xml:lang="hu">StarDraw-rajz</comment>
+ <comment xml:lang="hr">StarDraw crtež</comment>
+ <comment xml:lang="he">ציור StarDrawing</comment>
+ <comment xml:lang="gl">debuxo de StarDraw</comment>
+ <comment xml:lang="ga">líníocht StarDraw</comment>
+ <comment xml:lang="fur">dissen StarDraw</comment>
+ <comment xml:lang="fr">dessin StarDraw</comment>
+ <comment xml:lang="fo">StarDraw tekning</comment>
+ <comment xml:lang="fi">StarDraw-piirros</comment>
+ <comment xml:lang="eu">StarDraw marrazkia</comment>
+ <comment xml:lang="es">dibujo de StarDraw</comment>
+ <comment xml:lang="eo">StarDraw-grafikaĵo</comment>
+ <comment xml:lang="en_GB">StarDraw drawing</comment>
+ <comment xml:lang="el">Σχέδιο StarDraw</comment>
+ <comment xml:lang="de">StarDraw-Zeichnung</comment>
+ <comment xml:lang="da">StarDraw-tegning</comment>
+ <comment xml:lang="cy">Darlun StarDraw</comment>
+ <comment xml:lang="cs">kresba StarDraw</comment>
+ <comment xml:lang="ca">dibuix de StarDraw</comment>
+ <comment xml:lang="bg">Чертеж — StarDraw</comment>
+ <comment xml:lang="be@latin">Rysunak StarDraw</comment>
+ <comment xml:lang="be">рысунак StarDraw</comment>
+ <comment xml:lang="az">StarDraw çəkimi</comment>
+ <comment xml:lang="ar">تصميم StarDraw</comment>
+ <comment xml:lang="af">StarDraw-tekening</comment>
<generic-icon name="image-x-generic"/>
<glob pattern="*.sda"/>
</mime-type>
<mime-type type="application/vnd.stardivision.impress">
<comment>StarImpress presentation</comment>
- <comment xml:lang="af">StarImpress-voorlegging</comment>
- <comment xml:lang="ar">عرض تقديمي StarImpress</comment>
- <comment xml:lang="az">StarImpress təqdimatı</comment>
- <comment xml:lang="be-Latn">Prezentacyja StarImpress</comment>
- <comment xml:lang="bg">Презентация — StarImpress</comment>
- <comment xml:lang="ca">presentació de StarImpress</comment>
- <comment xml:lang="cs">prezentace StarImpress</comment>
- <comment xml:lang="cy">Cyflwyniad StarImpress</comment>
- <comment xml:lang="da">StarImpress-præsentation</comment>
- <comment xml:lang="de">StarImpress-Präsentation</comment>
- <comment xml:lang="el">Παρουσίαση StarImpress</comment>
- <comment xml:lang="en-GB">StarImpress presentation</comment>
- <comment xml:lang="eo">StarImpress-prezentaĵo</comment>
- <comment xml:lang="es">presentación de StarImpress</comment>
- <comment xml:lang="eu">StarImpress aurkezpena</comment>
- <comment xml:lang="fi">StarImpress-esitys</comment>
- <comment xml:lang="fo">StarImpress framløga</comment>
- <comment xml:lang="fr">présentation StarImpress</comment>
- <comment xml:lang="fur">presentazion StarImpress</comment>
- <comment xml:lang="ga">láithreoireacht StarImpress</comment>
- <comment xml:lang="gl">presentación de StarImpress</comment>
- <comment xml:lang="he">מצגת של StarImpress</comment>
- <comment xml:lang="hr">StarImpress prezentacija</comment>
- <comment xml:lang="hu">StarImpress-bemutató</comment>
- <comment xml:lang="ia">Presentation StarImpress</comment>
- <comment xml:lang="id">Presentasi StarImpress</comment>
- <comment xml:lang="it">Presentazione StarImpress</comment>
- <comment xml:lang="ja">StarImpress プレゼンテーション</comment>
- <comment xml:lang="kk">StarImpress презентациясы</comment>
- <comment xml:lang="ko">StarImpress 프레젠테이션</comment>
- <comment xml:lang="lt">StarImpress pateiktis</comment>
- <comment xml:lang="lv">StarImpress prezentācija</comment>
- <comment xml:lang="ms">Persembahan StarImpress</comment>
- <comment xml:lang="nb">StarImpress-presentasjon</comment>
- <comment xml:lang="nl">StarImpress-presentatie</comment>
- <comment xml:lang="nn">StarImpress-presentasjon</comment>
- <comment xml:lang="oc">presentacion StarImpress</comment>
- <comment xml:lang="pl">Prezentacja StarImpress</comment>
- <comment xml:lang="pt">apresentação do StarImpress</comment>
- <comment xml:lang="pt-BR">Apresentação do StarImpress</comment>
- <comment xml:lang="ro">Prezentare StarImpress</comment>
- <comment xml:lang="ru">Презентация StarImpress</comment>
- <comment xml:lang="sk">Prezentácia StarImpress</comment>
- <comment xml:lang="sl">Predstavitev StarImpress</comment>
- <comment xml:lang="sq">Prezantim StarImpress</comment>
- <comment xml:lang="sr">Презентација Стар Импреса</comment>
- <comment xml:lang="sv">StarImpress-presentation</comment>
- <comment xml:lang="tr">StarImpress sunumu</comment>
- <comment xml:lang="uk">презентація StarImpress</comment>
+ <comment xml:lang="zh_TW">StarImpress 簡報</comment>
+ <comment xml:lang="zh_CN">StarImpress 演示文稿</comment>
<comment xml:lang="vi">Trình diễn StarImpress</comment>
- <comment xml:lang="zh-CN">StarImpress 演示文稿</comment>
- <comment xml:lang="zh-TW">StarImpress 簡報</comment>
+ <comment xml:lang="uk">презентація StarImpress</comment>
+ <comment xml:lang="tr">StarImpress sunumu</comment>
+ <comment xml:lang="sv">StarImpress-presentation</comment>
+ <comment xml:lang="sr">Презентација Стар Импреса</comment>
+ <comment xml:lang="sq">paraqitje StarImpress</comment>
+ <comment xml:lang="sl">Predstavitev StarImpress</comment>
+ <comment xml:lang="si">StarImpress ඉදිරිපත් කිරීම</comment>
+ <comment xml:lang="sk">Prezentácia StarImpress</comment>
+ <comment xml:lang="ru">Презентация StarImpress</comment>
+ <comment xml:lang="ro">Prezentare StarImpress</comment>
+ <comment xml:lang="pt_BR">Apresentação do StarImpress</comment>
+ <comment xml:lang="pt">apresentação do StarImpress</comment>
+ <comment xml:lang="pl">Prezentacja StarImpress</comment>
+ <comment xml:lang="oc">presentacion StarImpress</comment>
+ <comment xml:lang="nn">StarImpress-presentasjon</comment>
+ <comment xml:lang="nl">StarImpress-presentatie</comment>
+ <comment xml:lang="nb">StarImpress-presentasjon</comment>
+ <comment xml:lang="ms">Persembahan StarImpress</comment>
+ <comment xml:lang="lv">StarImpress prezentācija</comment>
+ <comment xml:lang="lt">StarImpress pateiktis</comment>
+ <comment xml:lang="ko">StarImpress 프레젠테이션</comment>
+ <comment xml:lang="kk">StarImpress презентациясы</comment>
+ <comment xml:lang="ja">StarImpress プレゼンテーション</comment>
+ <comment xml:lang="it">Presentazione StarImpress</comment>
+ <comment xml:lang="is">StarImpress framsetning</comment>
+ <comment xml:lang="id">Presentasi StarImpress</comment>
+ <comment xml:lang="ia">Presentation StarImpress</comment>
+ <comment xml:lang="hu">StarImpress-bemutató</comment>
+ <comment xml:lang="hr">StarImpress prezentacija</comment>
+ <comment xml:lang="he">מצגת StarImpress</comment>
+ <comment xml:lang="gl">presentación de StarImpress</comment>
+ <comment xml:lang="ga">láithreoireacht StarImpress</comment>
+ <comment xml:lang="fur">presentazion StarImpress</comment>
+ <comment xml:lang="fr">présentation StarImpress</comment>
+ <comment xml:lang="fo">StarImpress framløga</comment>
+ <comment xml:lang="fi">StarImpress-esitys</comment>
+ <comment xml:lang="eu">StarImpress aurkezpena</comment>
+ <comment xml:lang="es">presentación de StarImpress</comment>
+ <comment xml:lang="eo">StarImpress-prezentaĵo</comment>
+ <comment xml:lang="en_GB">StarImpress presentation</comment>
+ <comment xml:lang="el">Παρουσίαση StarImpress</comment>
+ <comment xml:lang="de">StarImpress-Präsentation</comment>
+ <comment xml:lang="da">StarImpress-præsentation</comment>
+ <comment xml:lang="cy">Cyflwyniad StarImpress</comment>
+ <comment xml:lang="cs">prezentace StarImpress</comment>
+ <comment xml:lang="ca">presentació de StarImpress</comment>
+ <comment xml:lang="bg">Презентация — StarImpress</comment>
+ <comment xml:lang="be@latin">Prezentacyja StarImpress</comment>
+ <comment xml:lang="be">прэзентацыя StarImpress</comment>
+ <comment xml:lang="az">StarImpress təqdimatı</comment>
+ <comment xml:lang="ar">عرض تقديمي StarImpress</comment>
+ <comment xml:lang="af">StarImpress-voorlegging</comment>
<generic-icon name="x-office-presentation"/>
<glob pattern="*.sdd"/>
<glob pattern="*.sdp"/>
</mime-type>
<mime-type type="application/vnd.stardivision.mail">
<comment>StarMail email</comment>
- <comment xml:lang="af">StarMail-e-pos</comment>
- <comment xml:lang="ar">بريد StarMail الإلكتروني</comment>
- <comment xml:lang="be-Latn">Email StarMail</comment>
- <comment xml:lang="bg">Електронно писмо — StarMail</comment>
- <comment xml:lang="ca">correu electrònic de StarMail</comment>
- <comment xml:lang="cs">e-mail StarMail</comment>
- <comment xml:lang="da">StarMail-e-brev</comment>
- <comment xml:lang="de">StarMail-E-Mail</comment>
- <comment xml:lang="el">Ηλ. μήνυμα StarMail</comment>
- <comment xml:lang="en-GB">StarMail email</comment>
- <comment xml:lang="eo">StarMail-retpoŝto</comment>
- <comment xml:lang="es">correo electrónico de StarMail</comment>
- <comment xml:lang="eu">StarMail helb.el.</comment>
- <comment xml:lang="fi">StarMail-sähköposti</comment>
- <comment xml:lang="fo">StarMail t-postur</comment>
- <comment xml:lang="fr">courriel StarMail</comment>
- <comment xml:lang="fur">e-mail StarMail</comment>
- <comment xml:lang="ga">ríomhphost StarMail</comment>
- <comment xml:lang="gl">Correo electrónico de StarMail</comment>
- <comment xml:lang="he">דוא״ל של StarMail</comment>
- <comment xml:lang="hr">StarMail e-pošta</comment>
- <comment xml:lang="hu">StarMail e-mail</comment>
- <comment xml:lang="ia">Message electronic StarMail</comment>
- <comment xml:lang="id">Email StarMail</comment>
- <comment xml:lang="it">Email StarMail</comment>
- <comment xml:lang="ja">StarMail メール</comment>
- <comment xml:lang="kk">StarMail электрондық хаты</comment>
- <comment xml:lang="ko">StarMail 전자우편</comment>
- <comment xml:lang="lt">StarMail el. laiškas</comment>
- <comment xml:lang="lv">StarMail epasts</comment>
- <comment xml:lang="ms">Emel StarMail</comment>
- <comment xml:lang="nb">StarMail-melding</comment>
- <comment xml:lang="nl">StarMail-e-mail</comment>
- <comment xml:lang="nn">StarMail-fil</comment>
- <comment xml:lang="oc">corrièr electronic StarMail</comment>
- <comment xml:lang="pl">E-Mail StarMail</comment>
- <comment xml:lang="pt">email do StarMail</comment>
- <comment xml:lang="pt-BR">E-mail do StarMail</comment>
- <comment xml:lang="ro">Email StarEmail</comment>
- <comment xml:lang="ru">Электронное письмо StarMail</comment>
- <comment xml:lang="sk">E-mail StarMail</comment>
- <comment xml:lang="sl">Datoteka pošte StarMail</comment>
- <comment xml:lang="sq">Mesazh StarMail</comment>
- <comment xml:lang="sr">Ел. пошта Стар Поште</comment>
- <comment xml:lang="sv">StarMail-e-post</comment>
- <comment xml:lang="tr">StarMail epostası</comment>
- <comment xml:lang="uk">поштове повідомлення StarMail</comment>
+ <comment xml:lang="zh_TW">StarMail 郵件</comment>
+ <comment xml:lang="zh_CN">StarMail 电子邮件</comment>
<comment xml:lang="vi">Thư điện tử StarMail</comment>
- <comment xml:lang="zh-CN">StarMail 电子邮件</comment>
- <comment xml:lang="zh-TW">StarMail 郵件</comment>
+ <comment xml:lang="uk">поштове повідомлення StarMail</comment>
+ <comment xml:lang="tr">StarMail epostası</comment>
+ <comment xml:lang="sv">StarMail-e-post</comment>
+ <comment xml:lang="sr">Ел. пошта Стар Поште</comment>
+ <comment xml:lang="sq">email StarMail</comment>
+ <comment xml:lang="sl">Datoteka pošte StarMail</comment>
+ <comment xml:lang="si">StarMail ඊමේල්</comment>
+ <comment xml:lang="sk">E-mail StarMail</comment>
+ <comment xml:lang="ru">Электронное письмо StarMail</comment>
+ <comment xml:lang="ro">Email StarEmail</comment>
+ <comment xml:lang="pt_BR">E-mail do StarMail</comment>
+ <comment xml:lang="pt">email do StarMail</comment>
+ <comment xml:lang="pl">E-Mail StarMail</comment>
+ <comment xml:lang="oc">corrièr electronic StarMail</comment>
+ <comment xml:lang="nn">StarMail-fil</comment>
+ <comment xml:lang="nl">StarMail-e-mail</comment>
+ <comment xml:lang="nb">StarMail-melding</comment>
+ <comment xml:lang="ms">Emel StarMail</comment>
+ <comment xml:lang="lv">StarMail epasts</comment>
+ <comment xml:lang="lt">StarMail el. laiškas</comment>
+ <comment xml:lang="ko">StarMail 전자우편</comment>
+ <comment xml:lang="kk">StarMail электрондық хаты</comment>
+ <comment xml:lang="ja">StarMail メール</comment>
+ <comment xml:lang="it">Email StarMail</comment>
+ <comment xml:lang="is">StarMail tölvupóstur</comment>
+ <comment xml:lang="id">Email StarMail</comment>
+ <comment xml:lang="ia">Message electronic StarMail</comment>
+ <comment xml:lang="hu">StarMail e-mail</comment>
+ <comment xml:lang="hr">StarMail e-pošta</comment>
+ <comment xml:lang="he">דוא״ל של StarMail</comment>
+ <comment xml:lang="gl">Correo electrónico de StarMail</comment>
+ <comment xml:lang="ga">ríomhphost StarMail</comment>
+ <comment xml:lang="fur">e-mail StarMail</comment>
+ <comment xml:lang="fr">courriel StarMail</comment>
+ <comment xml:lang="fo">StarMail t-postur</comment>
+ <comment xml:lang="fi">StarMail-sähköposti</comment>
+ <comment xml:lang="eu">StarMail helb.el.</comment>
+ <comment xml:lang="es">correo electrónico de StarMail</comment>
+ <comment xml:lang="eo">StarMail-retpoŝto</comment>
+ <comment xml:lang="en_GB">StarMail e-mail</comment>
+ <comment xml:lang="el">Ηλ. μήνυμα StarMail</comment>
+ <comment xml:lang="de">StarMail-E-Mail</comment>
+ <comment xml:lang="da">StarMail-e-brev</comment>
+ <comment xml:lang="cs">e-mail StarMail</comment>
+ <comment xml:lang="ca">correu electrònic de StarMail</comment>
+ <comment xml:lang="bg">Електронно писмо — StarMail</comment>
+ <comment xml:lang="be@latin">Email StarMail</comment>
+ <comment xml:lang="be">Email StarMail</comment>
+ <comment xml:lang="ar">بريد إلكتروني StarMail</comment>
+ <comment xml:lang="af">StarMail-e-pos</comment>
<glob pattern="*.smd"/>
</mime-type>
<mime-type type="application/vnd.stardivision.math">
<comment>StarMath formula</comment>
- <comment xml:lang="af">StarMath-formule</comment>
- <comment xml:lang="ar">صيغة StarMath</comment>
- <comment xml:lang="be-Latn">Formuła StarMath</comment>
- <comment xml:lang="bg">Формула — StarMath</comment>
- <comment xml:lang="ca">fórmula de StarMath</comment>
- <comment xml:lang="cs">vzorec StarMath</comment>
- <comment xml:lang="da">StarMath-formel</comment>
- <comment xml:lang="de">StarMath-Formel</comment>
- <comment xml:lang="el">Μαθηματικός τύπος StarMath</comment>
- <comment xml:lang="en-GB">StarMath formula</comment>
- <comment xml:lang="eo">StarMath-formulo</comment>
- <comment xml:lang="es">fórmula de StarMath</comment>
- <comment xml:lang="eu">StarMath formula</comment>
- <comment xml:lang="fi">StarMath-kaava</comment>
- <comment xml:lang="fo">StarMath frymil</comment>
- <comment xml:lang="fr">formule StarMath</comment>
- <comment xml:lang="fur">formule StarMath</comment>
- <comment xml:lang="ga">foirmle StarMath</comment>
- <comment xml:lang="gl">fórmula de StarMath</comment>
- <comment xml:lang="he">נוסחה של StarMath</comment>
- <comment xml:lang="hr">StarMath formula</comment>
- <comment xml:lang="hu">StarMath-képlet</comment>
- <comment xml:lang="ia">Formula StarMath</comment>
- <comment xml:lang="id">Formula StarMath</comment>
- <comment xml:lang="it">Formula StarMath</comment>
- <comment xml:lang="ja">StarMath 計算式</comment>
- <comment xml:lang="kk">StarMath формуласы</comment>
- <comment xml:lang="ko">StarMath 수식</comment>
- <comment xml:lang="lt">StarMath formulė</comment>
- <comment xml:lang="lv">StarMath formula</comment>
- <comment xml:lang="ms">Formula StarMath</comment>
- <comment xml:lang="nb">StarMath-formel</comment>
- <comment xml:lang="nl">StarMath-formule</comment>
- <comment xml:lang="nn">StarMath-formel</comment>
- <comment xml:lang="oc">formula StarMath</comment>
- <comment xml:lang="pl">Formuła StarMath</comment>
- <comment xml:lang="pt">fórmula do StarMath</comment>
- <comment xml:lang="pt-BR">Fórmula do StarMath</comment>
- <comment xml:lang="ro">Formulă StarMath</comment>
- <comment xml:lang="ru">Формула StarMath</comment>
- <comment xml:lang="sk">Vzorec StarMath</comment>
- <comment xml:lang="sl">Datoteka formule StarMath</comment>
- <comment xml:lang="sq">Formulë StarMath</comment>
- <comment xml:lang="sr">Формула Стар Математике</comment>
- <comment xml:lang="sv">StarMath-formel</comment>
- <comment xml:lang="tr">StarMath formülü</comment>
- <comment xml:lang="uk">формула StarMath</comment>
+ <comment xml:lang="zh_TW">StarMath 公式</comment>
+ <comment xml:lang="zh_CN">StarMath 公式</comment>
<comment xml:lang="vi">Công thức StarMath</comment>
- <comment xml:lang="zh-CN">StarMath 公式</comment>
- <comment xml:lang="zh-TW">StarMath 公式</comment>
+ <comment xml:lang="uk">формула StarMath</comment>
+ <comment xml:lang="tr">StarMath formülü</comment>
+ <comment xml:lang="sv">StarMath-formel</comment>
+ <comment xml:lang="sr">Формула Стар Математике</comment>
+ <comment xml:lang="sq">formulë StarMath</comment>
+ <comment xml:lang="sl">Datoteka formule StarMath</comment>
+ <comment xml:lang="si">StarMath සූත්‍රය</comment>
+ <comment xml:lang="sk">Vzorec StarMath</comment>
+ <comment xml:lang="ru">Формула StarMath</comment>
+ <comment xml:lang="ro">Formulă StarMath</comment>
+ <comment xml:lang="pt_BR">Fórmula do StarMath</comment>
+ <comment xml:lang="pt">fórmula do StarMath</comment>
+ <comment xml:lang="pl">Formuła StarMath</comment>
+ <comment xml:lang="oc">formula StarMath</comment>
+ <comment xml:lang="nn">StarMath-formel</comment>
+ <comment xml:lang="nl">StarMath-formule</comment>
+ <comment xml:lang="nb">StarMath-formel</comment>
+ <comment xml:lang="ms">Formula StarMath</comment>
+ <comment xml:lang="lv">StarMath formula</comment>
+ <comment xml:lang="lt">StarMath formulė</comment>
+ <comment xml:lang="ko">StarMath 수식</comment>
+ <comment xml:lang="kk">StarMath формуласы</comment>
+ <comment xml:lang="ja">StarMath 計算式</comment>
+ <comment xml:lang="it">Formula StarMath</comment>
+ <comment xml:lang="is">StarMath formúla</comment>
+ <comment xml:lang="id">Formula StarMath</comment>
+ <comment xml:lang="ia">Formula StarMath</comment>
+ <comment xml:lang="hu">StarMath-képlet</comment>
+ <comment xml:lang="hr">StarMath formula</comment>
+ <comment xml:lang="he">נוסחה של StarMath</comment>
+ <comment xml:lang="gl">fórmula de StarMath</comment>
+ <comment xml:lang="ga">foirmle StarMath</comment>
+ <comment xml:lang="fur">formule StarMath</comment>
+ <comment xml:lang="fr">formule StarMath</comment>
+ <comment xml:lang="fo">StarMath frymil</comment>
+ <comment xml:lang="fi">StarMath-kaava</comment>
+ <comment xml:lang="eu">StarMath formula</comment>
+ <comment xml:lang="es">fórmula de StarMath</comment>
+ <comment xml:lang="eo">StarMath-formulo</comment>
+ <comment xml:lang="en_GB">StarMath formula</comment>
+ <comment xml:lang="el">Μαθηματικός τύπος StarMath</comment>
+ <comment xml:lang="de">StarMath-Formel</comment>
+ <comment xml:lang="da">StarMath-formel</comment>
+ <comment xml:lang="cs">vzorec StarMath</comment>
+ <comment xml:lang="ca">fórmula de StarMath</comment>
+ <comment xml:lang="bg">Формула — StarMath</comment>
+ <comment xml:lang="be@latin">Formuła StarMath</comment>
+ <comment xml:lang="be">формула StarMath</comment>
+ <comment xml:lang="ar">صيغة StarMath</comment>
+ <comment xml:lang="af">StarMath-formule</comment>
<generic-icon name="x-office-document"/>
<glob pattern="*.smf"/>
</mime-type>
<mime-type type="application/vnd.stardivision.writer">
<comment>StarWriter document</comment>
- <comment xml:lang="af">StarWriter-dokument</comment>
- <comment xml:lang="ar">مستند StarWriter</comment>
- <comment xml:lang="ast">Documentu de StarWriter</comment>
- <comment xml:lang="az">StarWriter sənədi</comment>
- <comment xml:lang="be-Latn">Dakument StarWriter</comment>
- <comment xml:lang="bg">Документ — StarWriter</comment>
- <comment xml:lang="ca">document StarWriter</comment>
- <comment xml:lang="cs">dokument StarWriter</comment>
- <comment xml:lang="cy">Dogfen StarWriter</comment>
- <comment xml:lang="da">StarWriter-dokument</comment>
- <comment xml:lang="de">StarWriter-Dokument</comment>
- <comment xml:lang="el">Έγγραφο StarWriter</comment>
- <comment xml:lang="en-GB">StarWriter document</comment>
- <comment xml:lang="eo">StarWriter-dokumento</comment>
- <comment xml:lang="es">documento de StarWriter</comment>
- <comment xml:lang="eu">StarWriter dokumentua</comment>
- <comment xml:lang="fi">StarWriter-asiakirja</comment>
- <comment xml:lang="fo">StarWriter skjal</comment>
- <comment xml:lang="fr">document StarWriter</comment>
- <comment xml:lang="fur">document StarWriter</comment>
- <comment xml:lang="ga">cáipéis StarWriter</comment>
- <comment xml:lang="gl">documento de StarWriter</comment>
- <comment xml:lang="he">מסמך של StarWriter</comment>
- <comment xml:lang="hr">StarWriter dokument</comment>
- <comment xml:lang="hu">StarWriter-dokumentum</comment>
- <comment xml:lang="ia">Documento StarWriter</comment>
- <comment xml:lang="id">Dokumen StarWriter</comment>
- <comment xml:lang="it">Documento StrarWriter</comment>
- <comment xml:lang="ja">StarWriter ドキュメント</comment>
- <comment xml:lang="kk">StarWriter құжаты</comment>
- <comment xml:lang="ko">StarWriter 문서</comment>
- <comment xml:lang="lt">StarWriter dokumentas</comment>
- <comment xml:lang="lv">StarWriter dokuments</comment>
- <comment xml:lang="ms">Dokumen StarWriter</comment>
- <comment xml:lang="nb">StarWriter-dokument</comment>
- <comment xml:lang="nl">StarWriter-document</comment>
- <comment xml:lang="nn">StarWriter document</comment>
- <comment xml:lang="oc">document StarWriter</comment>
- <comment xml:lang="pl">Dokument StarWriter</comment>
- <comment xml:lang="pt">documento do StarWriter</comment>
- <comment xml:lang="pt-BR">Documento do StarWriter</comment>
- <comment xml:lang="ro">Document StarWriter</comment>
- <comment xml:lang="ru">Документ StarWriter</comment>
- <comment xml:lang="sk">Dokument StarWriter</comment>
- <comment xml:lang="sl">Dokument StarWriter</comment>
- <comment xml:lang="sq">Dokument StarWriter</comment>
- <comment xml:lang="sr">Документ Стар Писца</comment>
- <comment xml:lang="sv">StarWriter-dokument</comment>
- <comment xml:lang="tr">StarWriter belgesi</comment>
- <comment xml:lang="uk">документ StarWriter</comment>
+ <comment xml:lang="zh_TW">StarWriter 文件</comment>
+ <comment xml:lang="zh_CN">StarWriter 文档</comment>
<comment xml:lang="vi">Tài liệu StarWriter</comment>
- <comment xml:lang="zh-CN">StarWriter 文档</comment>
- <comment xml:lang="zh-TW">StarWriter 文件</comment>
+ <comment xml:lang="uk">документ StarWriter</comment>
+ <comment xml:lang="tr">StarWriter belgesi</comment>
+ <comment xml:lang="sv">StarWriter-dokument</comment>
+ <comment xml:lang="sr">Документ Стар Писца</comment>
+ <comment xml:lang="sq">dokument StarWriter</comment>
+ <comment xml:lang="sl">Dokument StarWriter</comment>
+ <comment xml:lang="si">StarWriter ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument StarWriter</comment>
+ <comment xml:lang="ru">Документ StarWriter</comment>
+ <comment xml:lang="ro">Document StarWriter</comment>
+ <comment xml:lang="pt_BR">Documento do StarWriter</comment>
+ <comment xml:lang="pt">documento do StarWriter</comment>
+ <comment xml:lang="pl">Dokument StarWriter</comment>
+ <comment xml:lang="oc">document StarWriter</comment>
+ <comment xml:lang="nn">StarWriter document</comment>
+ <comment xml:lang="nl">StarWriter-document</comment>
+ <comment xml:lang="nb">StarWriter-dokument</comment>
+ <comment xml:lang="ms">Dokumen StarWriter</comment>
+ <comment xml:lang="lv">StarWriter dokuments</comment>
+ <comment xml:lang="lt">StarWriter dokumentas</comment>
+ <comment xml:lang="ko">StarWriter 문서</comment>
+ <comment xml:lang="kk">StarWriter құжаты</comment>
+ <comment xml:lang="ja">StarWriter ドキュメント</comment>
+ <comment xml:lang="it">Documento StrarWriter</comment>
+ <comment xml:lang="is">StarWriter skjal</comment>
+ <comment xml:lang="id">Dokumen StarWriter</comment>
+ <comment xml:lang="ia">Documento StarWriter</comment>
+ <comment xml:lang="hu">StarWriter-dokumentum</comment>
+ <comment xml:lang="hr">StarWriter dokument</comment>
+ <comment xml:lang="he">מסמך StarWriter</comment>
+ <comment xml:lang="gl">documento de StarWriter</comment>
+ <comment xml:lang="ga">cáipéis StarWriter</comment>
+ <comment xml:lang="fur">document StarWriter</comment>
+ <comment xml:lang="fr">document StarWriter</comment>
+ <comment xml:lang="fo">StarWriter skjal</comment>
+ <comment xml:lang="fi">StarWriter-asiakirja</comment>
+ <comment xml:lang="eu">StarWriter dokumentua</comment>
+ <comment xml:lang="es">documento de StarWriter</comment>
+ <comment xml:lang="eo">StarWriter-dokumento</comment>
+ <comment xml:lang="en_GB">StarWriter document</comment>
+ <comment xml:lang="el">Έγγραφο StarWriter</comment>
+ <comment xml:lang="de">StarWriter-Dokument</comment>
+ <comment xml:lang="da">StarWriter-dokument</comment>
+ <comment xml:lang="cy">Dogfen StarWriter</comment>
+ <comment xml:lang="cs">dokument StarWriter</comment>
+ <comment xml:lang="ca">document StarWriter</comment>
+ <comment xml:lang="bg">Документ — StarWriter</comment>
+ <comment xml:lang="be@latin">Dakument StarWriter</comment>
+ <comment xml:lang="be">дакумент StarWriter</comment>
+ <comment xml:lang="az">StarWriter sənədi</comment>
+ <comment xml:lang="ast">Documentu de StarWriter</comment>
+ <comment xml:lang="ar">مستند StarWriter</comment>
+ <comment xml:lang="af">StarWriter-dokument</comment>
<generic-icon name="x-office-document"/>
<glob pattern="*.sdw"/>
<glob pattern="*.vor"/>
@@ -4804,56 +5373,18 @@ command to generate the output files.
<alias type="application/vnd.stardivision.writer-global"/>
</mime-type>
<mime-type type="application/vnd.sun.xml.calc">
- <comment>OpenOffice Calc spreadsheet</comment>
- <comment xml:lang="af">OpenOffice Calc-sigblad</comment>
- <comment xml:lang="ar">جدول Calc المكتب المفتوح</comment>
- <comment xml:lang="be-Latn">Raźlikovy arkuš OpenOffice Calc</comment>
- <comment xml:lang="bg">Таблица — OpenOffice Calc</comment>
- <comment xml:lang="ca">full de càlcul d'OpenOffice Calc</comment>
- <comment xml:lang="cs">sešit OpenOffice Calc</comment>
- <comment xml:lang="da">OpenOffice Calc-regneark</comment>
- <comment xml:lang="de">OpenOffice-Calc-Tabelle</comment>
- <comment xml:lang="el">Λογιστικό φύλλο OpenOffice Calc</comment>
- <comment xml:lang="en-GB">OpenOffice Calc spreadsheet</comment>
+ <comment>LibreOffice Calc spreadsheet</comment>
+ <comment xml:lang="uk">електронна таблиця LibreOffice Calc</comment>
+ <comment xml:lang="sv">LibreOffice Calc-kalkylblad</comment>
+ <comment xml:lang="ru">Электронная таблица LibreOffice Calc</comment>
+ <comment xml:lang="pt_BR">Planilha do LibreOffice Calc</comment>
+ <comment xml:lang="pl">Arkusz LibreOffice Calc</comment>
+ <comment xml:lang="it">Foglio di calcolo LibreOffice Calc</comment>
+ <comment xml:lang="gl">Folla de cálculo de LibreOffice Calc</comment>
+ <comment xml:lang="eu">LibreOffice Calc kalkulu-orria</comment>
<comment xml:lang="es">hoja de cálculo de LibreOffice Calc</comment>
- <comment xml:lang="eu">OpenOffice.org Calc kalkulu-orria</comment>
- <comment xml:lang="fi">OpenOffice Calc -taulukko</comment>
- <comment xml:lang="fo">OpenOffice Calc rokniark</comment>
- <comment xml:lang="fr">feuille de calcul OpenOffice Calc</comment>
- <comment xml:lang="fur">sfuei di calcul OpenOffice Calc</comment>
- <comment xml:lang="ga">scarbhileog OpenOffice Calc</comment>
- <comment xml:lang="gl">folla de cálculo de OpenOffice Calc</comment>
- <comment xml:lang="he">גליון נתונים של OpenOffice Calc</comment>
- <comment xml:lang="hr">OpenOffice Calc proračunska tablica</comment>
- <comment xml:lang="hu">OpenOffice Calc táblázat</comment>
- <comment xml:lang="ia">Folio de calculo OpenOffice Calc</comment>
- <comment xml:lang="id">Lembar sebar OpenOffice Calc</comment>
- <comment xml:lang="it">Foglio di calcolo OpenOffice Calc</comment>
- <comment xml:lang="ja">OpenOffice Calc スプレッドシート</comment>
- <comment xml:lang="ka">OpenOffice Calc-ის ცხრილი</comment>
- <comment xml:lang="kk">OpenOffice Calc электрондық кестесі</comment>
- <comment xml:lang="ko">OpenOffice Calc 스프레드시트</comment>
- <comment xml:lang="lt">OpenOffice Calc skaičialentė</comment>
- <comment xml:lang="lv">OpenOffice Calc izklājlapa</comment>
- <comment xml:lang="nb">OpenOffice Calc-regneark</comment>
- <comment xml:lang="nl">OpenOffice.org Calc-rekenblad</comment>
- <comment xml:lang="nn">OpenOffice Calc-rekneark</comment>
- <comment xml:lang="oc">fuèlh de calcul OpenOffice Calc</comment>
- <comment xml:lang="pl">Arkusz OpenOffice.org Calc</comment>
- <comment xml:lang="pt">folha de cálculo OpenOffice Calc</comment>
- <comment xml:lang="pt-BR">Planilha do OpenOffice Calc</comment>
- <comment xml:lang="ro">Foaie de calcul OpenOffice Calc</comment>
- <comment xml:lang="ru">Электронная таблица OpenOffice Calc</comment>
- <comment xml:lang="sk">Zošit OpenOffice Calc</comment>
- <comment xml:lang="sl">Razpredelnica OpenOffice.org Calc</comment>
- <comment xml:lang="sq">Fletë llogaritjesh OpenOffice Calc</comment>
- <comment xml:lang="sr">Табела Опен Офис Рачуна</comment>
- <comment xml:lang="sv">OpenOffice Calc-kalkylblad</comment>
- <comment xml:lang="tr">OpenOffice Calc hesap çizelgesi</comment>
- <comment xml:lang="uk">ел. таблиця OpenOffice Calc</comment>
- <comment xml:lang="vi">Bảng tính Calc của OpenOffice.org</comment>
- <comment xml:lang="zh-CN">OpenOffice Calc 电子表格</comment>
- <comment xml:lang="zh-TW">OpenOffice Calc 試算表</comment>
+ <comment xml:lang="de">LibreOffice Calc-Tabelle</comment>
+ <comment xml:lang="be">электронная табліца LibreOffice Calc</comment>
<sub-class-of type="application/zip"/>
<generic-icon name="x-office-spreadsheet"/>
<magic priority="70">
@@ -4866,56 +5397,18 @@ command to generate the output files.
<glob pattern="*.sxc"/>
</mime-type>
<mime-type type="application/vnd.sun.xml.calc.template">
- <comment>OpenOffice Calc template</comment>
- <comment xml:lang="af">OpenOffice Calc-sjabloon</comment>
- <comment xml:lang="ar">قالب Calc المكتب المفتوح</comment>
- <comment xml:lang="be-Latn">Šablon OpenOffice Calc</comment>
- <comment xml:lang="bg">Шаблон за таблици — OpenOffice Calc</comment>
- <comment xml:lang="ca">plantilla d'OpenOffice Calc</comment>
- <comment xml:lang="cs">šablona OpenOffice Calc</comment>
- <comment xml:lang="da">OpenOffice Calc-skabelon</comment>
- <comment xml:lang="de">OpenOffice-Calc-Vorlage</comment>
- <comment xml:lang="el">Πρότυπο OpenOffice Calc</comment>
- <comment xml:lang="en-GB">OpenOffice Calc template</comment>
+ <comment>LibreOffice Calc template</comment>
+ <comment xml:lang="uk">шаблон LibreOffice Calc</comment>
+ <comment xml:lang="sv">LibreOffice Calc-mall</comment>
+ <comment xml:lang="ru">Шаблон LibreOffice Calc</comment>
+ <comment xml:lang="pt_BR">Modelo do LibreOffice Calc</comment>
+ <comment xml:lang="pl">Szablon arkusza LibreOffice Calc</comment>
+ <comment xml:lang="it">Modello LibreOffice Calc</comment>
+ <comment xml:lang="gl">Modelo de LibreOffice Calc</comment>
+ <comment xml:lang="eu">LibreOffice Calc txantiloia</comment>
<comment xml:lang="es">plantilla de LibreOffice Calc</comment>
- <comment xml:lang="eu">OpenOffice Calc txantiloia</comment>
- <comment xml:lang="fi">OpenOffice Calc -malli</comment>
- <comment xml:lang="fo">OpenOffice Calc formur</comment>
- <comment xml:lang="fr">modèle OpenOffice Calc</comment>
- <comment xml:lang="fur">model OpenOffice Calc</comment>
- <comment xml:lang="ga">teimpléad OpenOffice Calc</comment>
- <comment xml:lang="gl">modelo de OpenOffice Calc</comment>
- <comment xml:lang="he">תבנית של OpenOffice Calc</comment>
- <comment xml:lang="hr">OpenOffice Calc predložak</comment>
- <comment xml:lang="hu">OpenOffice Calc sablon</comment>
- <comment xml:lang="ia">Patrono OpenOffice Calc</comment>
- <comment xml:lang="id">Templat OpenOffice Calc</comment>
- <comment xml:lang="it">Modello OpenOffice Calc</comment>
- <comment xml:lang="ja">OpenOffice Calc テンプレート</comment>
- <comment xml:lang="ka">OpenOffice Calc-ის შაბლონი</comment>
- <comment xml:lang="kk">OpenOffice Calc үлгісі</comment>
- <comment xml:lang="ko">OpenOffice Calc 스프레드시트 문서 서식</comment>
- <comment xml:lang="lt">OpenOffice Calc šablonas</comment>
- <comment xml:lang="lv">OpenOffice Calc veidne</comment>
- <comment xml:lang="nb">OpenOffice Calc-mal</comment>
- <comment xml:lang="nl">OpenOffice.org Calc-sjabloon</comment>
- <comment xml:lang="nn">OpenOffice Calc-mal</comment>
- <comment xml:lang="oc">modèl OpenOffice Calc</comment>
- <comment xml:lang="pl">Szablon arkusza OpenOffice.org Calc</comment>
- <comment xml:lang="pt">modelo OpenOffice Calc</comment>
- <comment xml:lang="pt-BR">Modelo do OpenOffice Calc</comment>
- <comment xml:lang="ro">Șablon OpenOffice Calc</comment>
- <comment xml:lang="ru">Шаблон OpenOffice Calc</comment>
- <comment xml:lang="sk">Šablóna OpenOffice Calc</comment>
- <comment xml:lang="sl">Predloga OpenOffice.org Calc</comment>
- <comment xml:lang="sq">Model OpenOffice Calc</comment>
- <comment xml:lang="sr">Шаблон Опен Офис Рачуна</comment>
- <comment xml:lang="sv">OpenOffice Calc-mall</comment>
- <comment xml:lang="tr">OpenOffice Calc şablonu</comment>
- <comment xml:lang="uk">шаблон ел.таблиці OpenOffice Calc</comment>
- <comment xml:lang="vi">Mẫu bảng tính Calc của OpenOffice.org</comment>
- <comment xml:lang="zh-CN">OpenOffice Calc 模板</comment>
- <comment xml:lang="zh-TW">OpenOffice Calc 範本</comment>
+ <comment xml:lang="de">LibreOffice Calc-Vorlage</comment>
+ <comment xml:lang="be">шаблон LibreOffice Calc</comment>
<sub-class-of type="application/zip"/>
<generic-icon name="x-office-spreadsheet"/>
<magic priority="70">
@@ -4928,56 +5421,18 @@ command to generate the output files.
<glob pattern="*.stc"/>
</mime-type>
<mime-type type="application/vnd.sun.xml.draw">
- <comment>OpenOffice Draw drawing</comment>
- <comment xml:lang="af">OpenOffice Draw-tekening</comment>
- <comment xml:lang="ar">تصميم Draw المكتب المفتوح</comment>
- <comment xml:lang="be-Latn">Rysunak OpenOffice Draw</comment>
- <comment xml:lang="bg">Чертеж — OpenOffice Draw</comment>
- <comment xml:lang="ca">dibuix d'OpenOffice Draw</comment>
- <comment xml:lang="cs">kresba OpenOffice Draw</comment>
- <comment xml:lang="da">OpenOffice Draw-tegning</comment>
- <comment xml:lang="de">OpenOffice-Draw-Zeichnung</comment>
- <comment xml:lang="el">Σχέδιο OpenOffice Draw</comment>
- <comment xml:lang="en-GB">OpenOffice Draw drawing</comment>
+ <comment>LibreOffice Draw drawing</comment>
+ <comment xml:lang="uk">рисунок LibreOffice Draw</comment>
+ <comment xml:lang="sv">LibreOffice Draw-teckning</comment>
+ <comment xml:lang="ru">Рисунок LibreOffice Draw</comment>
+ <comment xml:lang="pt_BR">Desenho do LibreOffice Draw</comment>
+ <comment xml:lang="pl">Rysunek LibreOffice Draw</comment>
+ <comment xml:lang="it">Disegno LibreOffice Draw</comment>
+ <comment xml:lang="gl">Debuxo de LibreOffice Draw</comment>
+ <comment xml:lang="eu">LibreOffice Draw marrazkia</comment>
<comment xml:lang="es">dibujo de LibreOffice Draw</comment>
- <comment xml:lang="eu">OpenOffice.org Draw marrazkia</comment>
- <comment xml:lang="fi">OpenOffice Draw -piirros</comment>
- <comment xml:lang="fo">OpenOffice Draw tekning</comment>
- <comment xml:lang="fr">dessin OpenOffice Draw</comment>
- <comment xml:lang="fur">dissen OpenOffice Draw</comment>
- <comment xml:lang="ga">líníocht OpenOffice Draw</comment>
- <comment xml:lang="gl">debuxo de OpenOffice Draw</comment>
- <comment xml:lang="he">ציור של OpenOffice Draw</comment>
- <comment xml:lang="hr">OpenOffice Draw crtež</comment>
- <comment xml:lang="hu">OpenOffice Draw rajz</comment>
- <comment xml:lang="ia">Designo OpenOffice Draw</comment>
- <comment xml:lang="id">Gambar OpenOffice Draw</comment>
- <comment xml:lang="it">Disegno OpenOffice Draw</comment>
- <comment xml:lang="ja">OpenOffice Draw ドロー</comment>
- <comment xml:lang="ka">OpenOffice Draw-ის ნახაზი</comment>
- <comment xml:lang="kk">OpenOffice Draw суреті</comment>
- <comment xml:lang="ko">OpenOffice Draw 그림</comment>
- <comment xml:lang="lt">OpenOffice Draw piešinys</comment>
- <comment xml:lang="lv">OpenOffice Draw zīmējums</comment>
- <comment xml:lang="nb">OpenOffice Draw-tegning</comment>
- <comment xml:lang="nl">OpenOffice.org Draw-tekening</comment>
- <comment xml:lang="nn">OpenOffice Draw-teikning</comment>
- <comment xml:lang="oc">dessenh OpenOffice Draw</comment>
- <comment xml:lang="pl">Rysunek OpenOffice.org Draw</comment>
- <comment xml:lang="pt">desenho OpenOffice Draw</comment>
- <comment xml:lang="pt-BR">Desenho do OpenOffice Draw</comment>
- <comment xml:lang="ro">Desen OpenOffice Draw</comment>
- <comment xml:lang="ru">Рисунок OpenOffice Draw</comment>
- <comment xml:lang="sk">Kresba OpenOffice Draw</comment>
- <comment xml:lang="sl">Datoteka risbe OpenOffice.org Draw</comment>
- <comment xml:lang="sq">Vizatim OpenOffice Draw</comment>
- <comment xml:lang="sr">Цртеж Опен Офис Цртежа</comment>
- <comment xml:lang="sv">OpenOffice Draw-teckning</comment>
- <comment xml:lang="tr">OpenOffice Draw çizimi</comment>
- <comment xml:lang="uk">малюнок OpenOffice Draw</comment>
- <comment xml:lang="vi">Bản vẽ Draw của OpenOffice.org</comment>
- <comment xml:lang="zh-CN">OpenOffice Draw 绘图</comment>
- <comment xml:lang="zh-TW">OpenOffice Draw 繪圖</comment>
+ <comment xml:lang="de">LibreOffice Draw-Zeichnung</comment>
+ <comment xml:lang="be">рысунак LibreOffice Draw</comment>
<sub-class-of type="application/zip"/>
<generic-icon name="image-x-generic"/>
<magic priority="70">
@@ -4990,56 +5445,18 @@ command to generate the output files.
<glob pattern="*.sxd"/>
</mime-type>
<mime-type type="application/vnd.sun.xml.draw.template">
- <comment>OpenOffice Draw template</comment>
- <comment xml:lang="af">OpenOffice Draw-sjabloon</comment>
- <comment xml:lang="ar">قالب Draw المكتب المفتوح</comment>
- <comment xml:lang="be-Latn">Šablon OpenOffice Draw</comment>
- <comment xml:lang="bg">Шаблон за чертежи — OpenOffice Draw</comment>
- <comment xml:lang="ca">plantilla d'OpenOffice Draw</comment>
- <comment xml:lang="cs">šablona OpenOffice Draw</comment>
- <comment xml:lang="da">OpenOffice Draw-skabelon</comment>
- <comment xml:lang="de">OpenOffice-Draw-Vorlage</comment>
- <comment xml:lang="el">Πρότυπο OpenOffice Draw</comment>
- <comment xml:lang="en-GB">OpenOffice Draw template</comment>
+ <comment>LibreOffice Draw template</comment>
+ <comment xml:lang="uk">шаблон LibreOffice Draw</comment>
+ <comment xml:lang="sv">LibreOffice Draw-mall</comment>
+ <comment xml:lang="ru">Шаблон LibreOffice Draw</comment>
+ <comment xml:lang="pt_BR">Modelo do LibreOffice Draw</comment>
+ <comment xml:lang="pl">Szablon rysunku LibreOffice Draw</comment>
+ <comment xml:lang="it">Modello LibreOffice Draw</comment>
+ <comment xml:lang="gl">Modelo de LibreOffice Draw</comment>
+ <comment xml:lang="eu">LibreOffice Draw txantiloia</comment>
<comment xml:lang="es">plantilla de LibreOffice Draw</comment>
- <comment xml:lang="eu">OpenOffice Draw txantiloia</comment>
- <comment xml:lang="fi">OpenOffice Draw -malli</comment>
- <comment xml:lang="fo">OpenOffice Draw formur</comment>
- <comment xml:lang="fr">modèle OpenOffice Draw</comment>
- <comment xml:lang="fur">model OpenOffice Draw </comment>
- <comment xml:lang="ga">teimpléad OpenOffice Draw</comment>
- <comment xml:lang="gl">modelo de OpenOffice Draw</comment>
- <comment xml:lang="he">תבנית של OpenOffice Draw</comment>
- <comment xml:lang="hr">Predložak OpenOffice Drawa</comment>
- <comment xml:lang="hu">OpenOffice Draw sablon</comment>
- <comment xml:lang="ia">Patrono OpenOffice Draw</comment>
- <comment xml:lang="id">Templat OpenOffice Draw</comment>
- <comment xml:lang="it">Modello OpenOffice Draw</comment>
- <comment xml:lang="ja">OpenOffice Draw テンプレート</comment>
- <comment xml:lang="ka">OpenOffice Draw-ის შაბლონი</comment>
- <comment xml:lang="kk">OpenOffice Draw үлгісі</comment>
- <comment xml:lang="ko">OpenOffice Draw 그림 문서 서식</comment>
- <comment xml:lang="lt">OpenOffice Draw šablonas</comment>
- <comment xml:lang="lv">OpenOffice Draw veidne</comment>
- <comment xml:lang="nb">OpenOffice Draw-mal</comment>
- <comment xml:lang="nl">OpenOffice.org Draw-sjabloon</comment>
- <comment xml:lang="nn">OpenOffice Draw-mal</comment>
- <comment xml:lang="oc">modèl OpenOffice Draw</comment>
- <comment xml:lang="pl">Szablon rysunku OpenOffice.org Draw</comment>
- <comment xml:lang="pt">modelo OpenOffice Draw</comment>
- <comment xml:lang="pt-BR">Modelo do OpenOffice Draw</comment>
- <comment xml:lang="ro">Șablon OpenOffice Draw</comment>
- <comment xml:lang="ru">Шаблон OpenOffice Draw</comment>
- <comment xml:lang="sk">Šablóna OpenOffice Draw</comment>
- <comment xml:lang="sl">Predloga OpenOffice.org Draw</comment>
- <comment xml:lang="sq">Model OpenOffice Draw</comment>
- <comment xml:lang="sr">Шаблон Опен Офис Цртежа</comment>
- <comment xml:lang="sv">OpenOffice Draw-mall</comment>
- <comment xml:lang="tr">OpenOffice Draw şablonu</comment>
- <comment xml:lang="uk">шаблон малюнку OpenOffice Draw</comment>
- <comment xml:lang="vi">Mẫu bản vẽ Draw của OpenOffice.org</comment>
- <comment xml:lang="zh-CN">OpenOffice Draw 模板</comment>
- <comment xml:lang="zh-TW">OpenOffice Draw 範本</comment>
+ <comment xml:lang="de">LibreOffice Draw-Vorlage</comment>
+ <comment xml:lang="be">шаблон LibreOffice Draw</comment>
<sub-class-of type="application/zip"/>
<generic-icon name="image-x-generic"/>
<magic priority="70">
@@ -5052,58 +5469,18 @@ command to generate the output files.
<glob pattern="*.std"/>
</mime-type>
<mime-type type="application/vnd.sun.xml.impress">
- <comment>OpenOffice Impress presentation</comment>
- <comment xml:lang="af">OpenOffice Impress-voorlegging</comment>
- <comment xml:lang="ar">عرض تقديمي Impress المكتب المفتوح</comment>
- <comment xml:lang="az">OpenOffice Impress sənədi</comment>
- <comment xml:lang="be-Latn">Prezentacyja OpenOffice Impress</comment>
- <comment xml:lang="bg">Презентация — OpenOffice Impress</comment>
- <comment xml:lang="ca">presentació d'OpenOffice Impress</comment>
- <comment xml:lang="cs">prezentace OpenOffice Impress</comment>
- <comment xml:lang="cy">Cyflwyniad OpenOffice (Impress)</comment>
- <comment xml:lang="da">OpenOffice Impress-præsentation</comment>
- <comment xml:lang="de">OpenOffice-Impress-Vorlage</comment>
- <comment xml:lang="el">Παρουσίαση OpenOffice Impress</comment>
- <comment xml:lang="en-GB">OpenOffice Impress presentation</comment>
+ <comment>LibreOffice Impress presentation</comment>
+ <comment xml:lang="uk">презентація LibreOffice Impress</comment>
+ <comment xml:lang="sv">LibreOffice Impress-presentation</comment>
+ <comment xml:lang="ru">Презентация LibreOffice Impress</comment>
+ <comment xml:lang="pt_BR">Apresentação do LibreOffice Impress</comment>
+ <comment xml:lang="pl">Prezentacja LibreOffice Impress</comment>
+ <comment xml:lang="it">Presentazione LibreOffice Impress</comment>
+ <comment xml:lang="gl">Presentación de LibreOffice Impress</comment>
+ <comment xml:lang="eu">LibreOffice Impress aurkezpena</comment>
<comment xml:lang="es">presentación de LibreOffice Impress</comment>
- <comment xml:lang="eu">OpenOffice.org Impress aurkezpena</comment>
- <comment xml:lang="fi">OpenOffice Impress -esitys</comment>
- <comment xml:lang="fo">OpenOffice Impress framløga</comment>
- <comment xml:lang="fr">présentation OpenOffice Impress</comment>
- <comment xml:lang="fur">presentazion OpenOffice Impress</comment>
- <comment xml:lang="ga">láithreoireacht OpenOffice Impress</comment>
- <comment xml:lang="gl">presentación de de OpenOffice Impress</comment>
- <comment xml:lang="he">מצגת של OpenOffice Impress</comment>
- <comment xml:lang="hr">OpenOffice Impress prezentacija</comment>
- <comment xml:lang="hu">OpenOffice Impress bemutató</comment>
- <comment xml:lang="ia">Presentation OpenOffice Impress</comment>
- <comment xml:lang="id">Presentasi OpenOffice Impress</comment>
- <comment xml:lang="it">Presentazione OpenOffice Impress</comment>
- <comment xml:lang="ja">OpenOffice Impress プレゼンテーション</comment>
- <comment xml:lang="ka">OpenOffice Impress-ის პრეზენტაცია</comment>
- <comment xml:lang="kk">OpenOffice Impress презентациясы</comment>
- <comment xml:lang="ko">OpenOffice Impress 프레젠테이션</comment>
- <comment xml:lang="lt">OpenOffice Impress pateiktis</comment>
- <comment xml:lang="lv">OpenOffice Impress prezentācija</comment>
- <comment xml:lang="nb">OpenOffice Impress-presentasjon</comment>
- <comment xml:lang="nl">OpenOffice.org Impress-presentatie</comment>
- <comment xml:lang="nn">OpenOffice Impress-presentasjon</comment>
- <comment xml:lang="oc">presentacion OpenOffice Impress</comment>
- <comment xml:lang="pl">Prezentacja OpenOffice.org Impress</comment>
- <comment xml:lang="pt">apresentação OpenOffice Impress</comment>
- <comment xml:lang="pt-BR">Apresentação do OpenOffice Impress</comment>
- <comment xml:lang="ro">Prezentare OpenOffice Impress</comment>
- <comment xml:lang="ru">Презентация OpenOffice Impress</comment>
- <comment xml:lang="sk">Prezentácia OpenOffice Impress</comment>
- <comment xml:lang="sl">Predstavitev OpenOffice.org Impress</comment>
- <comment xml:lang="sq">Prezantim OpenOffice Impress</comment>
- <comment xml:lang="sr">Презентација Опен Офис Импреса</comment>
- <comment xml:lang="sv">OpenOffice Impress-presentation</comment>
- <comment xml:lang="tr">OpenOffice Impress sunumu</comment>
- <comment xml:lang="uk">презентація OpenOffice Impress</comment>
- <comment xml:lang="vi">Trình diễn Impress của OpenOffice.org</comment>
- <comment xml:lang="zh-CN">OpenOffice Impress 演示文稿</comment>
- <comment xml:lang="zh-TW">OpenOffice Impress 簡報</comment>
+ <comment xml:lang="de">LibreOffice Impress-Präsentation</comment>
+ <comment xml:lang="be">прэзентацыя LibreOffice Impress</comment>
<sub-class-of type="application/zip"/>
<generic-icon name="x-office-presentation"/>
<magic priority="70">
@@ -5116,56 +5493,18 @@ command to generate the output files.
<glob pattern="*.sxi"/>
</mime-type>
<mime-type type="application/vnd.sun.xml.impress.template">
- <comment>OpenOffice Impress template</comment>
- <comment xml:lang="af">OpenOffice Impress-sjabloon</comment>
- <comment xml:lang="ar">قالب Impress المكتب المفتوح</comment>
- <comment xml:lang="be-Latn">Šablon OpenOffice Impress</comment>
- <comment xml:lang="bg">Шаблон за презентации — OpenOffice Impress</comment>
- <comment xml:lang="ca">plantilla d'OpenOffice Impress</comment>
- <comment xml:lang="cs">šablona OpenOffice Impress</comment>
- <comment xml:lang="da">OpenOffice Impress-skabelon</comment>
- <comment xml:lang="de">OpenOffice-Impress-Vorlage</comment>
- <comment xml:lang="el">Πρότυπο OpenOffice Impress</comment>
- <comment xml:lang="en-GB">OpenOffice Impress template</comment>
+ <comment>LibreOffice Impress template</comment>
+ <comment xml:lang="uk">шаблон LibreOffice Impress</comment>
+ <comment xml:lang="sv">LibreOffice Impress-mall</comment>
+ <comment xml:lang="ru">Шаблон LibreOffice Impress</comment>
+ <comment xml:lang="pt_BR">Documento do LibreOffice Impress</comment>
+ <comment xml:lang="pl">Szablon prezentacji LibreOffice Impress</comment>
+ <comment xml:lang="it">Modello LibreOffice Impress</comment>
+ <comment xml:lang="gl">Modelo de LibreOffice Impress</comment>
+ <comment xml:lang="eu">LibreOffice Impress txantiloia</comment>
<comment xml:lang="es">plantilla de LibreOffice Impress</comment>
- <comment xml:lang="eu">OpenOffice Impress txantiloia</comment>
- <comment xml:lang="fi">OpenOffice Impress -malli</comment>
- <comment xml:lang="fo">OpenOffice Impress formur</comment>
- <comment xml:lang="fr">modèle OpenOffice Impress</comment>
- <comment xml:lang="fur">model OpenOffice Impress</comment>
- <comment xml:lang="ga">teimpléad OpenOffice Impress</comment>
- <comment xml:lang="gl">modelo de OpenOffice Impress</comment>
- <comment xml:lang="he">תבנית של OpenOffice Impress</comment>
- <comment xml:lang="hr">Predložak OpenOffice Impressa</comment>
- <comment xml:lang="hu">OpenOffice Impress sablon</comment>
- <comment xml:lang="ia">Patrono OpenOffice Impress</comment>
- <comment xml:lang="id">Templat OpenOffice Impress</comment>
- <comment xml:lang="it">Modello OpenOffice Impress</comment>
- <comment xml:lang="ja">OpenOffice Impress テンプレート</comment>
- <comment xml:lang="ka">OpenOffice Impress-ის შაბლონი</comment>
- <comment xml:lang="kk">OpenOffice Impress үлгісі</comment>
- <comment xml:lang="ko">OpenOffice Impress 프레젠테이션 문서 서식</comment>
- <comment xml:lang="lt">OpenOffice Impress šablonas</comment>
- <comment xml:lang="lv">OpenOffice Impress veidne</comment>
- <comment xml:lang="nb">OpenOffice Impress-mal</comment>
- <comment xml:lang="nl">OpenOffice.org Impress-sjabloon</comment>
- <comment xml:lang="nn">OpenOffice Impress-mal</comment>
- <comment xml:lang="oc">modèl OpenOffice Impress</comment>
- <comment xml:lang="pl">Szablon prezentacji OpenOffice.org Impress</comment>
- <comment xml:lang="pt">modelo OpenOffice Impress</comment>
- <comment xml:lang="pt-BR">Modelo do OpenOffice Impress</comment>
- <comment xml:lang="ro">Șablon OpenOffice Impress</comment>
- <comment xml:lang="ru">Шаблон OpenOffice Impress</comment>
- <comment xml:lang="sk">Šablóna OpenOffice Impress</comment>
- <comment xml:lang="sl">Predloga OpenOffice.org Impress</comment>
- <comment xml:lang="sq">Model OpenOffice Impress</comment>
- <comment xml:lang="sr">Шаблон Опен Офис Импреса</comment>
- <comment xml:lang="sv">OpenOffice Impress-mall</comment>
- <comment xml:lang="tr">OpenOffice Impress şablonu</comment>
- <comment xml:lang="uk">шаблон презентації OpenOffice Impress</comment>
- <comment xml:lang="vi">Mẫu trình diễn Impress của OpenOffice.org</comment>
- <comment xml:lang="zh-CN">OpenOffice Impress 模板</comment>
- <comment xml:lang="zh-TW">OpenOffice Impress 範本</comment>
+ <comment xml:lang="de">LibreOffice Impress-Vorlage</comment>
+ <comment xml:lang="be">шаблон LibreOffice Impress</comment>
<sub-class-of type="application/zip"/>
<generic-icon name="x-office-presentation"/>
<magic priority="70">
@@ -5178,56 +5517,18 @@ command to generate the output files.
<glob pattern="*.sti"/>
</mime-type>
<mime-type type="application/vnd.sun.xml.math">
- <comment>OpenOffice Math formula</comment>
- <comment xml:lang="af">OpenOffice Math-formule</comment>
- <comment xml:lang="ar">صيغة Math المكتب المفتوح</comment>
- <comment xml:lang="be-Latn">Formuła OpenOffice Math</comment>
- <comment xml:lang="bg">Формула — OpenOffice Math</comment>
- <comment xml:lang="ca">fórmula d'OpenOffice Math</comment>
- <comment xml:lang="cs">vzorec OpenOffice Math</comment>
- <comment xml:lang="da">OpenOffice Math-formel</comment>
- <comment xml:lang="de">OpenOffice-Math-Formel</comment>
- <comment xml:lang="el">Μαθηματικός τύπος OpenOffice Math</comment>
- <comment xml:lang="en-GB">OpenOffice Math formula</comment>
+ <comment>LibreOffice Math formula</comment>
+ <comment xml:lang="uk">формула LibreOffice Math</comment>
+ <comment xml:lang="sv">LibreOffice Math-formel</comment>
+ <comment xml:lang="ru">Формула LibreOffice Math</comment>
+ <comment xml:lang="pt_BR">Fórmula do LibreOffice Math</comment>
+ <comment xml:lang="pl">Formuła LibreOffice Math</comment>
+ <comment xml:lang="it">Formula LibreOffice Math</comment>
+ <comment xml:lang="gl">Fórmula de LibreOffice Math</comment>
+ <comment xml:lang="eu">LibreOffice Math formula</comment>
<comment xml:lang="es">fórmula de LibreOffice Math</comment>
- <comment xml:lang="eu">OpenOffice.org Math formula</comment>
- <comment xml:lang="fi">OpenOffice Math -kaava</comment>
- <comment xml:lang="fo">OpenOffice Math frymil</comment>
- <comment xml:lang="fr">formule OpenOffice Math</comment>
- <comment xml:lang="fur">formule OpenOffice Math</comment>
- <comment xml:lang="ga">foirmle OpenOffice Math</comment>
- <comment xml:lang="gl">fórmula de OpenOffice Math</comment>
- <comment xml:lang="he">נוסחה של OpenOffice Math</comment>
- <comment xml:lang="hr">OpenOffice Math formula</comment>
- <comment xml:lang="hu">OpenOffice Math képlet</comment>
- <comment xml:lang="ia">Formula OpenOffice Math</comment>
- <comment xml:lang="id">Formula OpenOffice Math</comment>
- <comment xml:lang="it">Formula OpenOffice Math</comment>
- <comment xml:lang="ja">OpenOffice Math 計算式</comment>
- <comment xml:lang="ka">OpenOffice Math-ის ფორმულა</comment>
- <comment xml:lang="kk">OpenOffice Math формуласы</comment>
- <comment xml:lang="ko">OpenOffice Math 수식</comment>
- <comment xml:lang="lt">OpenOffice Math formulė</comment>
- <comment xml:lang="lv">OpenOffice Math formula</comment>
- <comment xml:lang="nb">OpenOffice Math-formel</comment>
- <comment xml:lang="nl">OpenOffice.org Math-formule</comment>
- <comment xml:lang="nn">OpenOffice Math-formel</comment>
- <comment xml:lang="oc">formula OpenOffice Math</comment>
- <comment xml:lang="pl">Formuła OpenOffice.org Math</comment>
- <comment xml:lang="pt">fórmula OpenOffice Math</comment>
- <comment xml:lang="pt-BR">Fórmula do OpenOffice Math</comment>
- <comment xml:lang="ro">Formulă OpenOffice Math</comment>
- <comment xml:lang="ru">Формула OpenOffice Math</comment>
- <comment xml:lang="sk">Vzorec OpenOffice Math</comment>
- <comment xml:lang="sl">Dokument formule OpenOffice.org Math</comment>
- <comment xml:lang="sq">Formulë OpenOffice Math</comment>
- <comment xml:lang="sr">Формула Опен Офис Математике</comment>
- <comment xml:lang="sv">OpenOffice Math-formel</comment>
- <comment xml:lang="tr">OpenOffice Math formülü</comment>
- <comment xml:lang="uk">формула OpenOffice Math</comment>
- <comment xml:lang="vi">Công thức Math của OpenOffice.org</comment>
- <comment xml:lang="zh-CN">OpenOffice Math 公式</comment>
- <comment xml:lang="zh-TW">OpenOffice Math 公式</comment>
+ <comment xml:lang="de">LibreOffice Math-Formel</comment>
+ <comment xml:lang="be">формула LibreOffice Math</comment>
<sub-class-of type="application/zip"/>
<generic-icon name="x-office-document"/>
<magic priority="70">
@@ -5240,59 +5541,18 @@ command to generate the output files.
<glob pattern="*.sxm"/>
</mime-type>
<mime-type type="application/vnd.sun.xml.writer">
- <comment>OpenOffice Writer document</comment>
- <comment xml:lang="af">OpenOffice Writer-dokument</comment>
- <comment xml:lang="ar">مستند Writer المكتب المفتوح</comment>
- <comment xml:lang="ast">Documentu d'OpenOffice Writer</comment>
- <comment xml:lang="az">OpenOffice Writer sənədi</comment>
- <comment xml:lang="be-Latn">Dakument OpenOffice Writer</comment>
- <comment xml:lang="bg">Документ — OpenOffice Writer</comment>
- <comment xml:lang="ca">document d'OpenOffice Writer</comment>
- <comment xml:lang="cs">dokument OpenOffice Writer</comment>
- <comment xml:lang="cy">Dogfen OpenOffice (Writer)</comment>
- <comment xml:lang="da">OpenOffice Writer-dokument</comment>
- <comment xml:lang="de">OpenOffice-Writer-Dokument</comment>
- <comment xml:lang="el">Έγγραφο OpenOffice Writer</comment>
- <comment xml:lang="en-GB">OpenOffice Writer document</comment>
+ <comment>LibreOffice Writer document</comment>
+ <comment xml:lang="uk">документ LibreOffice Writer</comment>
+ <comment xml:lang="sv">LibreOffice Writer-dokument</comment>
+ <comment xml:lang="ru">Документ LibreOffice Writer</comment>
+ <comment xml:lang="pt_BR">Documento do LibreOffice Writer</comment>
+ <comment xml:lang="pl">Dokument LibreOffice Writer</comment>
+ <comment xml:lang="it">Documento LibreOffice Writer</comment>
+ <comment xml:lang="gl">Documento de LibreOffice Writer</comment>
+ <comment xml:lang="eu">LibreOffice Writer dokumentua</comment>
<comment xml:lang="es">documento de LibreOffice Writer</comment>
- <comment xml:lang="eu">OpenOffice.org Writer dokumentua</comment>
- <comment xml:lang="fi">OpenOffice Writer -asiakirja</comment>
- <comment xml:lang="fo">OpenOffice Writer skjal</comment>
- <comment xml:lang="fr">document OpenOffice Writer</comment>
- <comment xml:lang="fur">document OpenOffice Writer</comment>
- <comment xml:lang="ga">cáipéis OpenOffice Writer</comment>
- <comment xml:lang="gl">documento de OpenOffice Writer</comment>
- <comment xml:lang="he">מסמך של OpenOffice Writer</comment>
- <comment xml:lang="hr">OpenOffice Writer dokument</comment>
- <comment xml:lang="hu">OpenOffice Writer dokumentum</comment>
- <comment xml:lang="ia">Documento OpenOffice Writer</comment>
- <comment xml:lang="id">Dokumen OpenOffice Writer</comment>
- <comment xml:lang="it">Documento OpenOffice Writer</comment>
- <comment xml:lang="ja">OpenOffice Writer ドキュメント</comment>
- <comment xml:lang="ka">OpenOffice Writer-ის დოკუმენტი</comment>
- <comment xml:lang="kk">OpenOffice Writer құжаты</comment>
- <comment xml:lang="ko">OpenOffice Writer 문서</comment>
- <comment xml:lang="lt">OpenOffice Writer dokumentas</comment>
- <comment xml:lang="lv">OpenOffice Writer dokuments</comment>
- <comment xml:lang="nb">OpenOffice Writer-dokument</comment>
- <comment xml:lang="nl">OpenOffice.org Writer-document</comment>
- <comment xml:lang="nn">OpenOffice Writer-dokument</comment>
- <comment xml:lang="oc">document OpenOffice Writer</comment>
- <comment xml:lang="pl">Dokument OpenOffice.org Writer</comment>
- <comment xml:lang="pt">documento OpenOffice Writer</comment>
- <comment xml:lang="pt-BR">Documento do OpenOffice Writer</comment>
- <comment xml:lang="ro">Document OpenOffice Writer</comment>
- <comment xml:lang="ru">Документ OpenOffice Writer</comment>
- <comment xml:lang="sk">Dokument OpenOffice Writer</comment>
- <comment xml:lang="sl">Dokument OpenOffice.org Writer</comment>
- <comment xml:lang="sq">Dokument OpenOffice Writer</comment>
- <comment xml:lang="sr">Документ Опен Офис Писца</comment>
- <comment xml:lang="sv">OpenOffice Writer-dokument</comment>
- <comment xml:lang="tr">OpenOffice Writer belgesi</comment>
- <comment xml:lang="uk">документ OpenOffice Writer</comment>
- <comment xml:lang="vi">Tài liệu Writer của OpenOffice.org</comment>
- <comment xml:lang="zh-CN">OpenOffice Writer 文档</comment>
- <comment xml:lang="zh-TW">OpenOffice Writer 文件</comment>
+ <comment xml:lang="de">LibreOffice Writer-Dokument</comment>
+ <comment xml:lang="be">дакумент LibreOffice Writer</comment>
<sub-class-of type="application/zip"/>
<generic-icon name="x-office-document"/>
<magic priority="70">
@@ -5305,59 +5565,18 @@ command to generate the output files.
<glob pattern="*.sxw"/>
</mime-type>
<mime-type type="application/vnd.sun.xml.writer.global">
- <comment>OpenOffice Writer global document</comment>
- <comment xml:lang="af">OpenOffice Writer globale dokument</comment>
- <comment xml:lang="ar">مستند المكتب المفتوح Writer العالمي</comment>
- <comment xml:lang="ast">Documentu global d'OpenOffice Writer</comment>
- <comment xml:lang="az">OpenOffice Writer qlobal sənədi</comment>
- <comment xml:lang="be-Latn">Hlabalny dakument OpenOffice Writer</comment>
- <comment xml:lang="bg">Глобален документ — OpenOffice Writer</comment>
- <comment xml:lang="ca">document global d'OpenOffice Writer</comment>
- <comment xml:lang="cs">globální dokument OpenOffice Writer</comment>
- <comment xml:lang="cy">Dogfen eang OpenOffice (Writer)</comment>
- <comment xml:lang="da">OpenOffice Writer-globalt dokument</comment>
- <comment xml:lang="de">OpenOffice-Writer-Globaldokument</comment>
- <comment xml:lang="el">Καθολικό έγγραφο OpenOffice Writer</comment>
- <comment xml:lang="en-GB">OpenOffice Writer global document</comment>
+ <comment>LibreOffice Writer global document</comment>
+ <comment xml:lang="uk">загальний документ LibreOffice Writer</comment>
+ <comment xml:lang="sv">LibreOffice Writer-globaldokument</comment>
+ <comment xml:lang="ru">Основной документ LibreOffice Writer</comment>
+ <comment xml:lang="pt_BR">Documento global do LibreOffice Writer</comment>
+ <comment xml:lang="pl">Globalny dokument LibreOffice Writer</comment>
+ <comment xml:lang="it">Documento globale LibreOffice Writer</comment>
+ <comment xml:lang="gl">Documento global de LibreOffice Writer</comment>
+ <comment xml:lang="eu">LibreOffice Writer dokumentu globala</comment>
<comment xml:lang="es">documento global de LibreOffice Writer</comment>
- <comment xml:lang="eu">OpenOffice.org Writer dokumentu globala</comment>
- <comment xml:lang="fi">OpenOffice Writer - yleinen asiakirja</comment>
- <comment xml:lang="fo">OpenOffice Writer heiltøkt skjal</comment>
- <comment xml:lang="fr">document global OpenOffice Writer</comment>
- <comment xml:lang="fur">document globâl OpenOffice Writer</comment>
- <comment xml:lang="ga">cáipéis chomhchoiteann OpenOffice Writer</comment>
- <comment xml:lang="gl">documento global de OpenOffice Writer</comment>
- <comment xml:lang="he">מסמך גלובלי של OpenOffice Writer</comment>
- <comment xml:lang="hr">OpenOffice Writer globalni dokument</comment>
- <comment xml:lang="hu">OpenOffice Writer globális dokumentum</comment>
- <comment xml:lang="ia">Documento global OpenOffice Writer</comment>
- <comment xml:lang="id">Dokumen global OpenOffice Writer</comment>
- <comment xml:lang="it">Documento globale OpenOffice Writer</comment>
- <comment xml:lang="ja">OpenOffice Writer グローバルドキュメント</comment>
- <comment xml:lang="ka">OpenOffice Writer-ის გლობალური დოკუმენტი</comment>
- <comment xml:lang="kk">OpenOffice Writer негізгі құжаты</comment>
- <comment xml:lang="ko">OpenOffice Writer 글로벌 문서</comment>
- <comment xml:lang="lt">OpenOffice Writer bendrinis dokumentas</comment>
- <comment xml:lang="lv">OpenOffice Writer globālais dokuments</comment>
- <comment xml:lang="nb">Global OpenOffice Writer globalt dokument</comment>
- <comment xml:lang="nl">OpenOffice.org Writer-globaal-document</comment>
- <comment xml:lang="nn">OpenOffice Writer globalt dokument</comment>
- <comment xml:lang="oc">document global OpenOffice Writer</comment>
- <comment xml:lang="pl">Globalny dokument OpenOffice.org Writer</comment>
- <comment xml:lang="pt">documento global OpenOffice Writer</comment>
- <comment xml:lang="pt-BR">Documento global do OpenOffice Writer</comment>
- <comment xml:lang="ro">Document global OpenOffice Writer</comment>
- <comment xml:lang="ru">Основной документ OpenOffice Writer</comment>
- <comment xml:lang="sk">Globálny dokument OpenOffice Writer</comment>
- <comment xml:lang="sl">Splošni dokument OpenOffice.org Writer</comment>
- <comment xml:lang="sq">Dokument i përgjithshëm OpenOffice Writer</comment>
- <comment xml:lang="sr">Општи документ Опен Офис Писца</comment>
- <comment xml:lang="sv">OpenOffice Writer-globaldokument</comment>
- <comment xml:lang="tr">OpenOffice Writer global belgesi</comment>
- <comment xml:lang="uk">загальний документ OpenOffice Writer</comment>
- <comment xml:lang="vi">Tài liệu toàn cục Writer của OpenOffice.org</comment>
- <comment xml:lang="zh-CN">OpenOffice Writer 全局文档</comment>
- <comment xml:lang="zh-TW">OpenOffice Writer 主控文件</comment>
+ <comment xml:lang="de">LibreOffice Writer-Globaldokument</comment>
+ <comment xml:lang="be">глабальны дакумент LibreOffice Writer</comment>
<sub-class-of type="application/zip"/>
<generic-icon name="x-office-document"/>
<magic priority="70">
@@ -5370,59 +5589,18 @@ command to generate the output files.
<glob pattern="*.sxg"/>
</mime-type>
<mime-type type="application/vnd.sun.xml.writer.template">
- <comment>OpenOffice Writer template</comment>
- <comment xml:lang="af">OpenOffice Writer-sjabloon</comment>
- <comment xml:lang="ar">قالب Writer المكتب المفتوح</comment>
- <comment xml:lang="az">OpenOffice Writer şablonu</comment>
- <comment xml:lang="be-Latn">Šablon OpenOffice Writer</comment>
- <comment xml:lang="bg">Шаблон за документи — OpenOffice Writer</comment>
- <comment xml:lang="ca">plantilla d'OpenOffice Writer</comment>
- <comment xml:lang="cs">šablona OpenOffice Writer</comment>
- <comment xml:lang="cy">Templed OpenOffice (Writer)</comment>
- <comment xml:lang="da">OpenOffice Writer-skabelon</comment>
- <comment xml:lang="de">OpenOffice-Writer-Vorlage</comment>
- <comment xml:lang="el">Πρότυπο OpenOffice Writer</comment>
- <comment xml:lang="en-GB">OpenOffice Writer template</comment>
+ <comment>LibreOffice Writer template</comment>
+ <comment xml:lang="uk">шаблон LibreOffice Writer</comment>
+ <comment xml:lang="sv">LibreOffice Writer-mall</comment>
+ <comment xml:lang="ru">Шаблон LibreOffice Writer</comment>
+ <comment xml:lang="pt_BR">Modelo do LibreOffice Writer</comment>
+ <comment xml:lang="pl">Szablon dokumentu LibreOffice Writer</comment>
+ <comment xml:lang="it">Modello LibreOffice Writer</comment>
+ <comment xml:lang="gl">Modelo de LibreOffice Writer</comment>
+ <comment xml:lang="eu">LibreOffice Writer txantiloia</comment>
<comment xml:lang="es">plantilla de LibreOffice Writer</comment>
- <comment xml:lang="eu">OpenOffice Writer txantiloia</comment>
- <comment xml:lang="fi">OpenOffice Writer -malli</comment>
- <comment xml:lang="fo">OpenOffice Writer formur</comment>
- <comment xml:lang="fr">modèle OpenOffice Writer</comment>
- <comment xml:lang="fur">model OpenOffice Writer</comment>
- <comment xml:lang="ga">teimpléad OpenOffice Writer</comment>
- <comment xml:lang="gl">modelo de OpenOffice Writer</comment>
- <comment xml:lang="he">תסנית של OpenOffice Writer</comment>
- <comment xml:lang="hr">OpenOffice Writer predložak</comment>
- <comment xml:lang="hu">OpenOffice Writer sablon</comment>
- <comment xml:lang="ia">Patrono OpenOffice Writer</comment>
- <comment xml:lang="id">Templat OpenOffice Writer</comment>
- <comment xml:lang="it">Modello OpenOffice Writer</comment>
- <comment xml:lang="ja">OpenOffice Writer ドキュメントテンプレート</comment>
- <comment xml:lang="ka">OpenOffice Writer-ის შაბლონი</comment>
- <comment xml:lang="kk">OpenOffice Writer үлгісі</comment>
- <comment xml:lang="ko">OpenOffice Writer 문서 서식</comment>
- <comment xml:lang="lt">OpenOffice Writer šablonas</comment>
- <comment xml:lang="lv">OpenOffice Writer veidne</comment>
- <comment xml:lang="ms">Templat OpenOffice Writer</comment>
- <comment xml:lang="nb">OpenOffice Writer-mal</comment>
- <comment xml:lang="nl">OpenOffice.org Writer-sjabloon</comment>
- <comment xml:lang="nn">OpenOffice Writer-mal</comment>
- <comment xml:lang="oc">modèl OpenOffice Writer</comment>
- <comment xml:lang="pl">Szablon dokumentu OpenOffice.org Writer</comment>
- <comment xml:lang="pt">modelo OpenOffice Writer</comment>
- <comment xml:lang="pt-BR">Modelo do OpenOffice Writer</comment>
- <comment xml:lang="ro">Șablon OpenOffice Writer</comment>
- <comment xml:lang="ru">Шаблон OpenOffice Writer</comment>
- <comment xml:lang="sk">Šablóna OpenOffice Writer</comment>
- <comment xml:lang="sl">Predloga OpenOffice.org Writer</comment>
- <comment xml:lang="sq">Model OpenOffice Writer</comment>
- <comment xml:lang="sr">Шаблон Опен Офис Писца</comment>
- <comment xml:lang="sv">OpenOffice Writer-mall</comment>
- <comment xml:lang="tr">OpenOffice Writer şablonu</comment>
- <comment xml:lang="uk">шаблон документа OpenOffice Writer</comment>
- <comment xml:lang="vi">Mẫu tài liệu Writer của OpenOffice.org</comment>
- <comment xml:lang="zh-CN">OpenOffice Writer 模板</comment>
- <comment xml:lang="zh-TW">OpenOffice Writer 範本</comment>
+ <comment xml:lang="de">LibreOffice Writer-Vorlage</comment>
+ <comment xml:lang="be">шаблон LibreOffice Writer</comment>
<sub-class-of type="application/zip"/>
<generic-icon name="x-office-document"/>
<magic priority="70">
@@ -5436,57 +5614,60 @@ command to generate the output files.
</mime-type>
<mime-type type="application/vnd.oasis.opendocument.text">
<comment>ODT document</comment>
- <comment xml:lang="af">ODT-dokument</comment>
- <comment xml:lang="ar">مستند ODT</comment>
- <comment xml:lang="ast">Documentu ODT</comment>
- <comment xml:lang="be-Latn">Dakument ODT</comment>
- <comment xml:lang="bg">Документ — ODT</comment>
- <comment xml:lang="ca">document ODT</comment>
- <comment xml:lang="cs">dokument ODT</comment>
- <comment xml:lang="da">ODT-dokument</comment>
- <comment xml:lang="de">ODT-Dokument</comment>
- <comment xml:lang="el">Έγγραφο ODT</comment>
- <comment xml:lang="en-GB">ODT document</comment>
- <comment xml:lang="eo">ODT-dokumento</comment>
- <comment xml:lang="es">documento ODT</comment>
- <comment xml:lang="eu">ODT dokumentua</comment>
- <comment xml:lang="fi">ODT-asiakirja</comment>
- <comment xml:lang="fo">ODT skjal</comment>
- <comment xml:lang="fr">document ODT</comment>
- <comment xml:lang="fur">document ODT</comment>
- <comment xml:lang="ga">cáipéis ODT</comment>
- <comment xml:lang="gl">documento ODT</comment>
- <comment xml:lang="he">מסמך ODT</comment>
- <comment xml:lang="hr">ODT dokument</comment>
- <comment xml:lang="hu">ODT-dokumentum</comment>
- <comment xml:lang="ia">Documento ODT</comment>
- <comment xml:lang="id">Dokumen ODT</comment>
- <comment xml:lang="it">Documento ODT</comment>
- <comment xml:lang="ja">ODT ドキュメント</comment>
- <comment xml:lang="ka">ODT დოკუმენტი</comment>
- <comment xml:lang="kk">ODT құжаты</comment>
- <comment xml:lang="ko">ODT 문서</comment>
- <comment xml:lang="lt">ODT dokumentas</comment>
- <comment xml:lang="lv">ODT dokuments</comment>
- <comment xml:lang="nb">ODT-dokument</comment>
- <comment xml:lang="nl">ODT-document</comment>
- <comment xml:lang="nn">ODT-dokument</comment>
- <comment xml:lang="oc">document ODT</comment>
- <comment xml:lang="pl">Dokument ODT</comment>
- <comment xml:lang="pt">documento ODT</comment>
- <comment xml:lang="pt-BR">Documento ODT</comment>
- <comment xml:lang="ro">Document ODT</comment>
- <comment xml:lang="ru">Документ ODT</comment>
- <comment xml:lang="sk">Dokument ODT</comment>
- <comment xml:lang="sl">Dokument ODT</comment>
- <comment xml:lang="sq">Dokument ODT</comment>
- <comment xml:lang="sr">ОДТ документ</comment>
- <comment xml:lang="sv">ODT-dokument</comment>
- <comment xml:lang="tr">ODT belgesi</comment>
- <comment xml:lang="uk">документ ODT</comment>
+ <comment xml:lang="zh_TW">ODT 文件</comment>
+ <comment xml:lang="zh_CN">ODT 文档</comment>
<comment xml:lang="vi">Tài liệu ODT</comment>
- <comment xml:lang="zh-CN">ODT 文档</comment>
- <comment xml:lang="zh-TW">ODT 文件</comment>
+ <comment xml:lang="uk">документ ODT</comment>
+ <comment xml:lang="tr">ODT belgesi</comment>
+ <comment xml:lang="sv">ODT-dokument</comment>
+ <comment xml:lang="sr">ОДТ документ</comment>
+ <comment xml:lang="sq">dokument ODT</comment>
+ <comment xml:lang="sl">Dokument ODT</comment>
+ <comment xml:lang="si">ODT ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument ODT</comment>
+ <comment xml:lang="ru">Документ ODT</comment>
+ <comment xml:lang="ro">Document ODT</comment>
+ <comment xml:lang="pt_BR">Documento ODT</comment>
+ <comment xml:lang="pt">documento ODT</comment>
+ <comment xml:lang="pl">Dokument ODT</comment>
+ <comment xml:lang="oc">document ODT</comment>
+ <comment xml:lang="nn">ODT-dokument</comment>
+ <comment xml:lang="nl">ODT-document</comment>
+ <comment xml:lang="nb">ODT-dokument</comment>
+ <comment xml:lang="lv">ODT dokuments</comment>
+ <comment xml:lang="lt">ODT dokumentas</comment>
+ <comment xml:lang="ko">ODT 문서</comment>
+ <comment xml:lang="kk">ODT құжаты</comment>
+ <comment xml:lang="ka">ODT დოკუმენტი</comment>
+ <comment xml:lang="ja">ODT ドキュメント</comment>
+ <comment xml:lang="it">Documento ODT</comment>
+ <comment xml:lang="is">ODT skjal</comment>
+ <comment xml:lang="id">Dokumen ODT</comment>
+ <comment xml:lang="ia">Documento ODT</comment>
+ <comment xml:lang="hu">ODT-dokumentum</comment>
+ <comment xml:lang="hr">ODT dokument</comment>
+ <comment xml:lang="he">מסמך ODT</comment>
+ <comment xml:lang="gl">documento ODT</comment>
+ <comment xml:lang="ga">cáipéis ODT</comment>
+ <comment xml:lang="fur">document ODT</comment>
+ <comment xml:lang="fr">document ODT</comment>
+ <comment xml:lang="fo">ODT skjal</comment>
+ <comment xml:lang="fi">ODT-asiakirja</comment>
+ <comment xml:lang="eu">ODT dokumentua</comment>
+ <comment xml:lang="es">documento ODT</comment>
+ <comment xml:lang="eo">ODT-dokumento</comment>
+ <comment xml:lang="en_GB">ODT document</comment>
+ <comment xml:lang="el">Έγγραφο ODT</comment>
+ <comment xml:lang="de">ODT-Dokument</comment>
+ <comment xml:lang="da">ODT-dokument</comment>
+ <comment xml:lang="cs">dokument ODT</comment>
+ <comment xml:lang="ca">document ODT</comment>
+ <comment xml:lang="bg">Документ — ODT</comment>
+ <comment xml:lang="be@latin">Dakument ODT</comment>
+ <comment xml:lang="be">дакумент ODT</comment>
+ <comment xml:lang="ast">Documentu ODT</comment>
+ <comment xml:lang="ar">مستند ODT</comment>
+ <comment xml:lang="af">ODT-dokument</comment>
<acronym>ODT</acronym>
<expanded-acronym>OpenDocument Text</expanded-acronym>
<sub-class-of type="application/zip"/>
@@ -5502,51 +5683,55 @@ command to generate the output files.
</mime-type>
<mime-type type="application/vnd.oasis.opendocument.text-flat-xml">
<comment>ODT document (Flat XML)</comment>
- <comment xml:lang="af">ODT-dokument (plat XML)</comment>
- <comment xml:lang="ar">مستند ODT (Flat XML)</comment>
- <comment xml:lang="ast">Documentu ODT (XML planu)</comment>
- <comment xml:lang="bg">Документ — ODT (само XML)</comment>
- <comment xml:lang="ca">document ODT (XML pla)</comment>
- <comment xml:lang="cs">dokument ODT (Flat XML)</comment>
- <comment xml:lang="da">ODT-dokument (flad XML)</comment>
- <comment xml:lang="de">ODT-Dokument (Unkomprimiertes XML)</comment>
- <comment xml:lang="el">Έγγραφο ODT (Flat XML)</comment>
- <comment xml:lang="en-GB">ODT document (Flat XML)</comment>
- <comment xml:lang="es">documento ODT (XML plano)</comment>
- <comment xml:lang="eu">ODT dokumentua (XML soila)</comment>
- <comment xml:lang="fi">ODT-asiakirja (Flat XML)</comment>
- <comment xml:lang="fo">ODT skjal (Flat XML)</comment>
- <comment xml:lang="fr">document ODT (XML plat)</comment>
- <comment xml:lang="fur">document ODT (XML sempliç)</comment>
- <comment xml:lang="ga">cáipéis ODT (XML cothrom)</comment>
- <comment xml:lang="gl">documento ODT (XML plano)</comment>
- <comment xml:lang="he">מסמך ODT‏ (Flat XML)</comment>
- <comment xml:lang="hr">ODT dokument (Flat XML)</comment>
- <comment xml:lang="hu">ODT-dokumentum (egyszerű XML)</comment>
- <comment xml:lang="ia">Documento ODT (XML platte)</comment>
- <comment xml:lang="id">Dokumen ODT (Flat XML)</comment>
- <comment xml:lang="it">Documento ODT (XML semplice)</comment>
- <comment xml:lang="ja">ODT ドキュメント (Flat XML)</comment>
- <comment xml:lang="ka">ODT დოკუმენტი (Flat XML)</comment>
- <comment xml:lang="kk">ODT құжаты (Тек XML)</comment>
- <comment xml:lang="ko">ODT 문서(단일 XML)</comment>
- <comment xml:lang="lt">ODT dokumentas (Flat XML)</comment>
- <comment xml:lang="lv">ODT dokuments (plakans XML)</comment>
- <comment xml:lang="nl">ODT document (Flat XML)</comment>
- <comment xml:lang="oc">document ODT (XML plat)</comment>
- <comment xml:lang="pl">Dokument ODT (prosty XML)</comment>
- <comment xml:lang="pt">documento ODT (XML plano)</comment>
- <comment xml:lang="pt-BR">Documento ODT (Flat XML)</comment>
- <comment xml:lang="ro">Document ODT (XML simplu)</comment>
- <comment xml:lang="ru">Документ ODT (простой XML)</comment>
- <comment xml:lang="sk">Dokument ODT (čisté XML)</comment>
- <comment xml:lang="sl">Datoteka dokumenta ODT (nepovezan XML)</comment>
- <comment xml:lang="sr">ОДТ документ (Обични ИксМЛ)</comment>
- <comment xml:lang="sv">ODT-dokument (platt XML)</comment>
- <comment xml:lang="tr">ODT belgesi (Düz XML)</comment>
+ <comment xml:lang="zh_TW">ODT 文件 (Flat XML)</comment>
+ <comment xml:lang="zh_CN">ODT 文档(Flat XML)</comment>
<comment xml:lang="uk">документ ODT (Flat XML)</comment>
- <comment xml:lang="zh-CN">ODT 文档(Flat XML)</comment>
- <comment xml:lang="zh-TW">ODT 文件 (Flat XML)</comment>
+ <comment xml:lang="tr">ODT belgesi (Düz XML)</comment>
+ <comment xml:lang="sv">ODT-dokument (platt XML)</comment>
+ <comment xml:lang="sr">ОДТ документ (Обични ИксМЛ)</comment>
+ <comment xml:lang="sq">dokument ODT (Flat XML)</comment>
+ <comment xml:lang="sl">Datoteka dokumenta ODT (nepovezan XML)</comment>
+ <comment xml:lang="si">ODT ලේඛනය (පැතලි XML)</comment>
+ <comment xml:lang="sk">Dokument ODT (čisté XML)</comment>
+ <comment xml:lang="ru">Документ ODT (простой XML)</comment>
+ <comment xml:lang="ro">Document ODT (XML simplu)</comment>
+ <comment xml:lang="pt_BR">Documento ODT (Flat XML)</comment>
+ <comment xml:lang="pt">documento ODT (XML plano)</comment>
+ <comment xml:lang="pl">Dokument ODT (prosty XML)</comment>
+ <comment xml:lang="oc">document ODT (XML plat)</comment>
+ <comment xml:lang="nl">ODT document (Flat XML)</comment>
+ <comment xml:lang="lv">ODT dokuments (plakans XML)</comment>
+ <comment xml:lang="lt">ODT dokumentas (Flat XML)</comment>
+ <comment xml:lang="ko">ODT 문서(단일 XML)</comment>
+ <comment xml:lang="kk">ODT құжаты (Тек XML)</comment>
+ <comment xml:lang="ka">ODT დოკუმენტი (Flat XML)</comment>
+ <comment xml:lang="ja">ODT ドキュメント (Flat XML)</comment>
+ <comment xml:lang="it">Documento ODT (XML semplice)</comment>
+ <comment xml:lang="is">ODT skjal (flatt XML)</comment>
+ <comment xml:lang="id">Dokumen ODT (Flat XML)</comment>
+ <comment xml:lang="ia">Documento ODT (XML platte)</comment>
+ <comment xml:lang="hu">ODT-dokumentum (egyszerű XML)</comment>
+ <comment xml:lang="hr">ODT dokument (Flat XML)</comment>
+ <comment xml:lang="he">מסמך ODT‏ (Flat XML)</comment>
+ <comment xml:lang="gl">documento ODT (XML plano)</comment>
+ <comment xml:lang="ga">cáipéis ODT (XML cothrom)</comment>
+ <comment xml:lang="fur">document ODT (XML sempliç)</comment>
+ <comment xml:lang="fr">document ODT (XML plat)</comment>
+ <comment xml:lang="fo">ODT skjal (Flat XML)</comment>
+ <comment xml:lang="fi">ODT-asiakirja (Flat XML)</comment>
+ <comment xml:lang="eu">ODT dokumentua (XML soila)</comment>
+ <comment xml:lang="es">documento ODT (XML plano)</comment>
+ <comment xml:lang="en_GB">ODT document (Flat XML)</comment>
+ <comment xml:lang="el">Έγγραφο ODT (Flat XML)</comment>
+ <comment xml:lang="de">ODT-Dokument (einfaches XML)</comment>
+ <comment xml:lang="da">ODT-dokument (flad XML)</comment>
+ <comment xml:lang="cs">dokument ODT (Flat XML)</comment>
+ <comment xml:lang="ca">document ODT (XML pla)</comment>
+ <comment xml:lang="bg">Документ — ODT (само XML)</comment>
+ <comment xml:lang="be">дакумент ODT (плоскі XML)</comment>
+ <comment xml:lang="ast">Documentu ODT (XML planu)</comment>
+ <comment xml:lang="ar">مستند ODT (Flat XML)</comment>
+ <comment xml:lang="af">ODT-dokument (plat XML)</comment>
<acronym>FODT</acronym>
<expanded-acronym>OpenDocument Text (Flat XML)</expanded-acronym>
<sub-class-of type="application/xml"/>
@@ -5555,56 +5740,59 @@ command to generate the output files.
</mime-type>
<mime-type type="application/vnd.oasis.opendocument.text-template">
<comment>ODT template</comment>
- <comment xml:lang="af">ODT-sjabloon</comment>
- <comment xml:lang="ar">قالب ODT</comment>
- <comment xml:lang="be-Latn">Šablon ODT</comment>
- <comment xml:lang="bg">Шаблон за документи — ODT</comment>
- <comment xml:lang="ca">plantilla ODT</comment>
- <comment xml:lang="cs">šablona ODT</comment>
- <comment xml:lang="da">ODT-skabelon</comment>
- <comment xml:lang="de">ODT-Vorlage</comment>
- <comment xml:lang="el">Πρότυπο ODT</comment>
- <comment xml:lang="en-GB">ODT template</comment>
- <comment xml:lang="eo">ODT-ŝablono</comment>
- <comment xml:lang="es">plantilla ODT</comment>
- <comment xml:lang="eu">ODT txantiloia</comment>
- <comment xml:lang="fi">ODT-malli</comment>
- <comment xml:lang="fo">ODT formur</comment>
- <comment xml:lang="fr">modèle ODT</comment>
- <comment xml:lang="fur">model ODT</comment>
- <comment xml:lang="ga">teimpléad ODT</comment>
- <comment xml:lang="gl">modelo ODT</comment>
- <comment xml:lang="he">תבנית ODT</comment>
- <comment xml:lang="hr">ODT predložak</comment>
- <comment xml:lang="hu">ODT-sablon</comment>
- <comment xml:lang="ia">Patrono ODT</comment>
- <comment xml:lang="id">Templat ODT</comment>
- <comment xml:lang="it">Modello ODT</comment>
- <comment xml:lang="ja">ODT テンプレート</comment>
- <comment xml:lang="ka">ODT დოკუმენტი</comment>
- <comment xml:lang="kk">ODT үлгісі</comment>
- <comment xml:lang="ko">ODT 문서 서식</comment>
- <comment xml:lang="lt">ODT šablonas</comment>
- <comment xml:lang="lv">ODT veidne</comment>
- <comment xml:lang="nb">ODT-mal</comment>
- <comment xml:lang="nl">ODT-sjabloon</comment>
- <comment xml:lang="nn">ODT-mal</comment>
- <comment xml:lang="oc">modèl ODT</comment>
- <comment xml:lang="pl">Szablon ODT</comment>
- <comment xml:lang="pt">modelo ODT</comment>
- <comment xml:lang="pt-BR">Modelo ODT</comment>
- <comment xml:lang="ro">Șablon ODT</comment>
- <comment xml:lang="ru">Шаблон ODT</comment>
- <comment xml:lang="sk">Šablóna ODT</comment>
- <comment xml:lang="sl">Predloga dokumenta ODT</comment>
- <comment xml:lang="sq">Model ODT</comment>
- <comment xml:lang="sr">ОДТ шаблон</comment>
- <comment xml:lang="sv">ODT-mall</comment>
- <comment xml:lang="tr">ODT şablonu</comment>
- <comment xml:lang="uk">шаблон ODT</comment>
+ <comment xml:lang="zh_TW">ODT 範本</comment>
+ <comment xml:lang="zh_CN">ODT 模板</comment>
<comment xml:lang="vi">Mẫu ODT</comment>
- <comment xml:lang="zh-CN">ODT 模板</comment>
- <comment xml:lang="zh-TW">ODT 範本</comment>
+ <comment xml:lang="uk">шаблон ODT</comment>
+ <comment xml:lang="tr">ODT şablonu</comment>
+ <comment xml:lang="sv">ODT-mall</comment>
+ <comment xml:lang="sr">ОДТ шаблон</comment>
+ <comment xml:lang="sq">gjedhe ODT</comment>
+ <comment xml:lang="sl">Predloga dokumenta ODT</comment>
+ <comment xml:lang="si">ODT අච්චුව</comment>
+ <comment xml:lang="sk">Šablóna ODT</comment>
+ <comment xml:lang="ru">Шаблон ODT</comment>
+ <comment xml:lang="ro">Șablon ODT</comment>
+ <comment xml:lang="pt_BR">Modelo ODT</comment>
+ <comment xml:lang="pt">modelo ODT</comment>
+ <comment xml:lang="pl">Szablon ODT</comment>
+ <comment xml:lang="oc">modèl ODT</comment>
+ <comment xml:lang="nn">ODT-mal</comment>
+ <comment xml:lang="nl">ODT-sjabloon</comment>
+ <comment xml:lang="nb">ODT-mal</comment>
+ <comment xml:lang="lv">ODT veidne</comment>
+ <comment xml:lang="lt">ODT šablonas</comment>
+ <comment xml:lang="ko">ODT 문서 서식</comment>
+ <comment xml:lang="kk">ODT үлгісі</comment>
+ <comment xml:lang="ka">ODT დოკუმენტი</comment>
+ <comment xml:lang="ja">ODT テンプレート</comment>
+ <comment xml:lang="it">Modello ODT</comment>
+ <comment xml:lang="is">ODT sniðmát</comment>
+ <comment xml:lang="id">Templat ODT</comment>
+ <comment xml:lang="ia">Patrono ODT</comment>
+ <comment xml:lang="hu">ODT-sablon</comment>
+ <comment xml:lang="hr">ODT predložak</comment>
+ <comment xml:lang="he">תבנית ODT</comment>
+ <comment xml:lang="gl">modelo ODT</comment>
+ <comment xml:lang="ga">teimpléad ODT</comment>
+ <comment xml:lang="fur">model ODT</comment>
+ <comment xml:lang="fr">modèle ODT</comment>
+ <comment xml:lang="fo">ODT formur</comment>
+ <comment xml:lang="fi">ODT-malli</comment>
+ <comment xml:lang="eu">ODT txantiloia</comment>
+ <comment xml:lang="es">plantilla ODT</comment>
+ <comment xml:lang="eo">ODT-ŝablono</comment>
+ <comment xml:lang="en_GB">ODT template</comment>
+ <comment xml:lang="el">Πρότυπο ODT</comment>
+ <comment xml:lang="de">ODT-Vorlage</comment>
+ <comment xml:lang="da">ODT-skabelon</comment>
+ <comment xml:lang="cs">šablona ODT</comment>
+ <comment xml:lang="ca">plantilla ODT</comment>
+ <comment xml:lang="bg">Шаблон за документи — ODT</comment>
+ <comment xml:lang="be@latin">Šablon ODT</comment>
+ <comment xml:lang="be">шаблон ODT</comment>
+ <comment xml:lang="ar">قالب ODT</comment>
+ <comment xml:lang="af">ODT-sjabloon</comment>
<acronym>ODT</acronym>
<expanded-acronym>OpenDocument Text</expanded-acronym>
<sub-class-of type="application/zip"/>
@@ -5620,56 +5808,59 @@ command to generate the output files.
</mime-type>
<mime-type type="application/vnd.oasis.opendocument.text-web">
<comment>OTH template</comment>
- <comment xml:lang="af">OTH-sjabloon</comment>
- <comment xml:lang="ar">قالب OTH</comment>
- <comment xml:lang="be-Latn">Šablon OTH</comment>
- <comment xml:lang="bg">Шаблон за страници — OTH</comment>
- <comment xml:lang="ca">plantilla OTH</comment>
- <comment xml:lang="cs">šablona OTH</comment>
- <comment xml:lang="da">OTH-skabelon</comment>
- <comment xml:lang="de">OTH-Vorlage</comment>
- <comment xml:lang="el">Πρότυπο OTH</comment>
- <comment xml:lang="en-GB">OTH template</comment>
- <comment xml:lang="eo">OTH-ŝablono</comment>
- <comment xml:lang="es">plantilla OTH</comment>
- <comment xml:lang="eu">OTH txantiloia</comment>
- <comment xml:lang="fi">OTH-malli</comment>
- <comment xml:lang="fo">OTH formur</comment>
- <comment xml:lang="fr">modèle OTH</comment>
- <comment xml:lang="fur">model OTH</comment>
- <comment xml:lang="ga">teimpléad OTH</comment>
- <comment xml:lang="gl">modelo OTH</comment>
- <comment xml:lang="he">תבנית OTH</comment>
- <comment xml:lang="hr">OTH predložak</comment>
- <comment xml:lang="hu">OTH-sablon</comment>
- <comment xml:lang="ia">Patrono OTH</comment>
- <comment xml:lang="id">Templat OTH</comment>
- <comment xml:lang="it">Modello OTH</comment>
- <comment xml:lang="ja">OTH テンプレート</comment>
- <comment xml:lang="ka">OTH შაბლონი</comment>
- <comment xml:lang="kk">OTH үлгісі</comment>
- <comment xml:lang="ko">OTH 문서 서식</comment>
- <comment xml:lang="lt">OTH šablonas</comment>
- <comment xml:lang="lv">OTH veidne</comment>
- <comment xml:lang="nb">OTH-mal</comment>
- <comment xml:lang="nl">OTH-sjabloon</comment>
- <comment xml:lang="nn">OTH-mal</comment>
- <comment xml:lang="oc">modèl OTH</comment>
- <comment xml:lang="pl">Szablon OTH</comment>
- <comment xml:lang="pt">modelo OTH</comment>
- <comment xml:lang="pt-BR">Modelo OTH</comment>
- <comment xml:lang="ro">Șablon OTH</comment>
- <comment xml:lang="ru">Шаблон OTH</comment>
- <comment xml:lang="sk">Šablóna OTH</comment>
- <comment xml:lang="sl">Predloga OTH</comment>
- <comment xml:lang="sq">Model OTH</comment>
- <comment xml:lang="sr">ОТХ шаблон</comment>
- <comment xml:lang="sv">OTH-mall</comment>
- <comment xml:lang="tr">OTH şablonu</comment>
- <comment xml:lang="uk">шаблон OTH</comment>
+ <comment xml:lang="zh_TW">OTH 範本</comment>
+ <comment xml:lang="zh_CN">OTH 模板</comment>
<comment xml:lang="vi">Mẫu ODH</comment>
- <comment xml:lang="zh-CN">OTH 模板</comment>
- <comment xml:lang="zh-TW">OTH 範本</comment>
+ <comment xml:lang="uk">шаблон OTH</comment>
+ <comment xml:lang="tr">OTH şablonu</comment>
+ <comment xml:lang="sv">OTH-mall</comment>
+ <comment xml:lang="sr">ОТХ шаблон</comment>
+ <comment xml:lang="sq">gjedhe OTH</comment>
+ <comment xml:lang="sl">Predloga OTH</comment>
+ <comment xml:lang="si">OTH අච්චුව</comment>
+ <comment xml:lang="sk">Šablóna OTH</comment>
+ <comment xml:lang="ru">Шаблон OTH</comment>
+ <comment xml:lang="ro">Șablon OTH</comment>
+ <comment xml:lang="pt_BR">Modelo OTH</comment>
+ <comment xml:lang="pt">modelo OTH</comment>
+ <comment xml:lang="pl">Szablon OTH</comment>
+ <comment xml:lang="oc">modèl OTH</comment>
+ <comment xml:lang="nn">OTH-mal</comment>
+ <comment xml:lang="nl">OTH-sjabloon</comment>
+ <comment xml:lang="nb">OTH-mal</comment>
+ <comment xml:lang="lv">OTH veidne</comment>
+ <comment xml:lang="lt">OTH šablonas</comment>
+ <comment xml:lang="ko">OTH 문서 서식</comment>
+ <comment xml:lang="kk">OTH үлгісі</comment>
+ <comment xml:lang="ka">OTH შაბლონი</comment>
+ <comment xml:lang="ja">OTH テンプレート</comment>
+ <comment xml:lang="it">Modello OTH</comment>
+ <comment xml:lang="is">OTH sniðmát</comment>
+ <comment xml:lang="id">Templat OTH</comment>
+ <comment xml:lang="ia">Patrono OTH</comment>
+ <comment xml:lang="hu">OTH-sablon</comment>
+ <comment xml:lang="hr">OTH predložak</comment>
+ <comment xml:lang="he">תבנית OTH</comment>
+ <comment xml:lang="gl">modelo OTH</comment>
+ <comment xml:lang="ga">teimpléad OTH</comment>
+ <comment xml:lang="fur">model OTH</comment>
+ <comment xml:lang="fr">modèle OTH</comment>
+ <comment xml:lang="fo">OTH formur</comment>
+ <comment xml:lang="fi">OTH-malli</comment>
+ <comment xml:lang="eu">OTH txantiloia</comment>
+ <comment xml:lang="es">plantilla OTH</comment>
+ <comment xml:lang="eo">OTH-ŝablono</comment>
+ <comment xml:lang="en_GB">OTH template</comment>
+ <comment xml:lang="el">Πρότυπο OTH</comment>
+ <comment xml:lang="de">OTH-Vorlage</comment>
+ <comment xml:lang="da">OTH-skabelon</comment>
+ <comment xml:lang="cs">šablona OTH</comment>
+ <comment xml:lang="ca">plantilla OTH</comment>
+ <comment xml:lang="bg">Шаблон за страници — OTH</comment>
+ <comment xml:lang="be@latin">Šablon OTH</comment>
+ <comment xml:lang="be">шаблон OTH</comment>
+ <comment xml:lang="ar">قالب OTH</comment>
+ <comment xml:lang="af">OTH-sjabloon</comment>
<acronym>OTH</acronym>
<expanded-acronym>OpenDocument HTML</expanded-acronym>
<sub-class-of type="application/zip"/>
@@ -5685,57 +5876,60 @@ command to generate the output files.
</mime-type>
<mime-type type="application/vnd.oasis.opendocument.text-master">
<comment>ODM document</comment>
- <comment xml:lang="af">ODM-dokument</comment>
- <comment xml:lang="ar">مستند ODM</comment>
- <comment xml:lang="ast">Documentu ODM</comment>
- <comment xml:lang="be-Latn">Dakument ODM</comment>
- <comment xml:lang="bg">Документ — ODM</comment>
- <comment xml:lang="ca">document ODM</comment>
- <comment xml:lang="cs">dokument ODM</comment>
- <comment xml:lang="da">ODM-dokument</comment>
- <comment xml:lang="de">ODM-Dokument</comment>
- <comment xml:lang="el">Έγγραφο ODM</comment>
- <comment xml:lang="en-GB">ODM document</comment>
- <comment xml:lang="eo">ODM-dokumento</comment>
- <comment xml:lang="es">documento ODM</comment>
- <comment xml:lang="eu">ODM dokumentua</comment>
- <comment xml:lang="fi">ODM-asiakirja</comment>
- <comment xml:lang="fo">ODM skjal</comment>
- <comment xml:lang="fr">document ODM</comment>
- <comment xml:lang="fur">document ODM</comment>
- <comment xml:lang="ga">cáipéis ODM</comment>
- <comment xml:lang="gl">documento ODM</comment>
- <comment xml:lang="he">מסמך ODM</comment>
- <comment xml:lang="hr">ODM dokument</comment>
- <comment xml:lang="hu">ODM-dokumentum</comment>
- <comment xml:lang="ia">Documento ODM</comment>
- <comment xml:lang="id">Dokumen ODM</comment>
- <comment xml:lang="it">Documento ODM</comment>
- <comment xml:lang="ja">ODM ドキュメント</comment>
- <comment xml:lang="ka">ODM დოკუმენტი</comment>
- <comment xml:lang="kk">ODM құжаты</comment>
- <comment xml:lang="ko">ODM 문서</comment>
- <comment xml:lang="lt">ODM dokumentas</comment>
- <comment xml:lang="lv">ODM dokuments</comment>
- <comment xml:lang="nb">ODM-dokument</comment>
- <comment xml:lang="nl">ODM-document</comment>
- <comment xml:lang="nn">ODM-dokument</comment>
- <comment xml:lang="oc">document ODM</comment>
- <comment xml:lang="pl">Dokument ODM</comment>
- <comment xml:lang="pt">documento ODM</comment>
- <comment xml:lang="pt-BR">Documento ODM</comment>
- <comment xml:lang="ro">Document ODM</comment>
- <comment xml:lang="ru">Документ ODM</comment>
- <comment xml:lang="sk">Dokument ODM</comment>
- <comment xml:lang="sl">Dokument ODM</comment>
- <comment xml:lang="sq">Dokument ODM</comment>
- <comment xml:lang="sr">ОДМ документ</comment>
- <comment xml:lang="sv">ODM-dokument</comment>
- <comment xml:lang="tr">ODM belgesi</comment>
- <comment xml:lang="uk">документ ODM</comment>
+ <comment xml:lang="zh_TW">ODM 文件</comment>
+ <comment xml:lang="zh_CN">ODM 文档</comment>
<comment xml:lang="vi">Tài liệu ODM</comment>
- <comment xml:lang="zh-CN">ODM 文档</comment>
- <comment xml:lang="zh-TW">ODM 文件</comment>
+ <comment xml:lang="uk">документ ODM</comment>
+ <comment xml:lang="tr">ODM belgesi</comment>
+ <comment xml:lang="sv">ODM-dokument</comment>
+ <comment xml:lang="sr">ОДМ документ</comment>
+ <comment xml:lang="sq">dokument ODM</comment>
+ <comment xml:lang="sl">Dokument ODM</comment>
+ <comment xml:lang="si">ODM ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument ODM</comment>
+ <comment xml:lang="ru">Документ ODM</comment>
+ <comment xml:lang="ro">Document ODM</comment>
+ <comment xml:lang="pt_BR">Documento ODM</comment>
+ <comment xml:lang="pt">documento ODM</comment>
+ <comment xml:lang="pl">Dokument ODM</comment>
+ <comment xml:lang="oc">document ODM</comment>
+ <comment xml:lang="nn">ODM-dokument</comment>
+ <comment xml:lang="nl">ODM-document</comment>
+ <comment xml:lang="nb">ODM-dokument</comment>
+ <comment xml:lang="lv">ODM dokuments</comment>
+ <comment xml:lang="lt">ODM dokumentas</comment>
+ <comment xml:lang="ko">ODM 문서</comment>
+ <comment xml:lang="kk">ODM құжаты</comment>
+ <comment xml:lang="ka">ODM დოკუმენტი</comment>
+ <comment xml:lang="ja">ODM ドキュメント</comment>
+ <comment xml:lang="it">Documento ODM</comment>
+ <comment xml:lang="is">ODM skjal</comment>
+ <comment xml:lang="id">Dokumen ODM</comment>
+ <comment xml:lang="ia">Documento ODM</comment>
+ <comment xml:lang="hu">ODM-dokumentum</comment>
+ <comment xml:lang="hr">ODM dokument</comment>
+ <comment xml:lang="he">מסמך ODM</comment>
+ <comment xml:lang="gl">documento ODM</comment>
+ <comment xml:lang="ga">cáipéis ODM</comment>
+ <comment xml:lang="fur">document ODM</comment>
+ <comment xml:lang="fr">document ODM</comment>
+ <comment xml:lang="fo">ODM skjal</comment>
+ <comment xml:lang="fi">ODM-asiakirja</comment>
+ <comment xml:lang="eu">ODM dokumentua</comment>
+ <comment xml:lang="es">documento ODM</comment>
+ <comment xml:lang="eo">ODM-dokumento</comment>
+ <comment xml:lang="en_GB">ODM document</comment>
+ <comment xml:lang="el">Έγγραφο ODM</comment>
+ <comment xml:lang="de">ODM-Dokument</comment>
+ <comment xml:lang="da">ODM-dokument</comment>
+ <comment xml:lang="cs">dokument ODM</comment>
+ <comment xml:lang="ca">document ODM</comment>
+ <comment xml:lang="bg">Документ — ODM</comment>
+ <comment xml:lang="be@latin">Dakument ODM</comment>
+ <comment xml:lang="be">дакумент ODM</comment>
+ <comment xml:lang="ast">Documentu ODM</comment>
+ <comment xml:lang="ar">مستند ODM</comment>
+ <comment xml:lang="af">ODM-dokument</comment>
<acronym>ODM</acronym>
<expanded-acronym>OpenDocument Master</expanded-acronym>
<sub-class-of type="application/zip"/>
@@ -5751,56 +5945,59 @@ command to generate the output files.
</mime-type>
<mime-type type="application/vnd.oasis.opendocument.graphics">
<comment>ODG drawing</comment>
- <comment xml:lang="af">ODG-tekening</comment>
- <comment xml:lang="ar">تصميم ODG</comment>
- <comment xml:lang="be-Latn">Rysunak ODG</comment>
- <comment xml:lang="bg">Чертеж — ODG</comment>
- <comment xml:lang="ca">dibuix ODG</comment>
- <comment xml:lang="cs">kresba ODG</comment>
- <comment xml:lang="da">ODG-tegning</comment>
- <comment xml:lang="de">ODG-Zeichnung</comment>
- <comment xml:lang="el">Σχέδιο ODG</comment>
- <comment xml:lang="en-GB">ODG drawing</comment>
- <comment xml:lang="eo">ODG-desegnaĵo</comment>
- <comment xml:lang="es">dibujo ODG</comment>
- <comment xml:lang="eu">ODG marrazkia</comment>
- <comment xml:lang="fi">ODG-piirros</comment>
- <comment xml:lang="fo">ODG tekning</comment>
- <comment xml:lang="fr">dessin ODG</comment>
- <comment xml:lang="fur">dissen ODG</comment>
- <comment xml:lang="ga">líníocht ODG</comment>
- <comment xml:lang="gl">debuxo ODG</comment>
- <comment xml:lang="he">ציור ODG</comment>
- <comment xml:lang="hr">ODG crtež</comment>
- <comment xml:lang="hu">ODG-rajz</comment>
- <comment xml:lang="ia">Designo ODG</comment>
- <comment xml:lang="id">Gambar ODG</comment>
- <comment xml:lang="it">Disegno ODG</comment>
- <comment xml:lang="ja">ODG ドロー</comment>
- <comment xml:lang="ka">ODG-ის ნახაზი</comment>
- <comment xml:lang="kk">ODG суреті</comment>
- <comment xml:lang="ko">ODG 드로잉</comment>
- <comment xml:lang="lt">ODG piešinys</comment>
- <comment xml:lang="lv">ODG zīmējums</comment>
- <comment xml:lang="nb">ODG-tegning</comment>
- <comment xml:lang="nl">ODG-tekening</comment>
- <comment xml:lang="nn">ODG-teikning</comment>
- <comment xml:lang="oc">dessenh ODG</comment>
- <comment xml:lang="pl">Rysunek ODG</comment>
- <comment xml:lang="pt">desenho ODG</comment>
- <comment xml:lang="pt-BR">Desenho ODG</comment>
- <comment xml:lang="ro">Desen ODG</comment>
- <comment xml:lang="ru">Рисунок ODG</comment>
- <comment xml:lang="sk">Kresba ODG</comment>
- <comment xml:lang="sl">Datoteka risbe ODG</comment>
- <comment xml:lang="sq">Vizatim ODG</comment>
- <comment xml:lang="sr">ОДГ цртеж</comment>
- <comment xml:lang="sv">ODG-teckning</comment>
- <comment xml:lang="tr">ODG çizimi</comment>
- <comment xml:lang="uk">малюнок ODG</comment>
+ <comment xml:lang="zh_TW">ODG 繪圖</comment>
+ <comment xml:lang="zh_CN">ODG 绘图</comment>
<comment xml:lang="vi">Bản vẽ ODG</comment>
- <comment xml:lang="zh-CN">ODG 绘图</comment>
- <comment xml:lang="zh-TW">ODG 繪圖</comment>
+ <comment xml:lang="uk">малюнок ODG</comment>
+ <comment xml:lang="tr">ODG çizimi</comment>
+ <comment xml:lang="sv">ODG-teckning</comment>
+ <comment xml:lang="sr">ОДГ цртеж</comment>
+ <comment xml:lang="sq">vizatim ODG</comment>
+ <comment xml:lang="sl">Datoteka risbe ODG</comment>
+ <comment xml:lang="si">ODG ඇඳීම</comment>
+ <comment xml:lang="sk">Kresba ODG</comment>
+ <comment xml:lang="ru">Рисунок ODG</comment>
+ <comment xml:lang="ro">Desen ODG</comment>
+ <comment xml:lang="pt_BR">Desenho ODG</comment>
+ <comment xml:lang="pt">desenho ODG</comment>
+ <comment xml:lang="pl">Rysunek ODG</comment>
+ <comment xml:lang="oc">dessenh ODG</comment>
+ <comment xml:lang="nn">ODG-teikning</comment>
+ <comment xml:lang="nl">ODG-tekening</comment>
+ <comment xml:lang="nb">ODG-tegning</comment>
+ <comment xml:lang="lv">ODG zīmējums</comment>
+ <comment xml:lang="lt">ODG piešinys</comment>
+ <comment xml:lang="ko">ODG 드로잉</comment>
+ <comment xml:lang="kk">ODG суреті</comment>
+ <comment xml:lang="ka">ODG-ის ნახაზი</comment>
+ <comment xml:lang="ja">ODG ドロー</comment>
+ <comment xml:lang="it">Disegno ODG</comment>
+ <comment xml:lang="is">ODG teikning</comment>
+ <comment xml:lang="id">Gambar ODG</comment>
+ <comment xml:lang="ia">Designo ODG</comment>
+ <comment xml:lang="hu">ODG-rajz</comment>
+ <comment xml:lang="hr">ODG crtež</comment>
+ <comment xml:lang="he">ציור ODG</comment>
+ <comment xml:lang="gl">debuxo ODG</comment>
+ <comment xml:lang="ga">líníocht ODG</comment>
+ <comment xml:lang="fur">dissen ODG</comment>
+ <comment xml:lang="fr">dessin ODG</comment>
+ <comment xml:lang="fo">ODG tekning</comment>
+ <comment xml:lang="fi">ODG-piirros</comment>
+ <comment xml:lang="eu">ODG marrazkia</comment>
+ <comment xml:lang="es">dibujo ODG</comment>
+ <comment xml:lang="eo">ODG-desegnaĵo</comment>
+ <comment xml:lang="en_GB">ODG drawing</comment>
+ <comment xml:lang="el">Σχέδιο ODG</comment>
+ <comment xml:lang="de">ODG-Zeichnung</comment>
+ <comment xml:lang="da">ODG-tegning</comment>
+ <comment xml:lang="cs">kresba ODG</comment>
+ <comment xml:lang="ca">dibuix ODG</comment>
+ <comment xml:lang="bg">Чертеж — ODG</comment>
+ <comment xml:lang="be@latin">Rysunak ODG</comment>
+ <comment xml:lang="be">рысунак ODG</comment>
+ <comment xml:lang="ar">تصميم ODG</comment>
+ <comment xml:lang="af">ODG-tekening</comment>
<acronym>ODG</acronym>
<expanded-acronym>OpenDocument Drawing</expanded-acronym>
<sub-class-of type="application/zip"/>
@@ -5816,50 +6013,54 @@ command to generate the output files.
</mime-type>
<mime-type type="application/vnd.oasis.opendocument.graphics-flat-xml">
<comment>ODG drawing (Flat XML)</comment>
- <comment xml:lang="af">ODG-tekening (plat XML)</comment>
- <comment xml:lang="ar">رسمة ODG (Flat XML)</comment>
- <comment xml:lang="bg">Чертеж — ODG (само XML)</comment>
- <comment xml:lang="ca">dibuix ODG (XML pla) </comment>
- <comment xml:lang="cs">kresba ODG (Flat XML)</comment>
- <comment xml:lang="da">ODG-tegning (flad XML)</comment>
- <comment xml:lang="de">ODG-Zeichnung (Unkomprimiertes XML)</comment>
- <comment xml:lang="el">Σχέδιο ODG (Flat XML)</comment>
- <comment xml:lang="en-GB">ODG drawing (Flat XML)</comment>
- <comment xml:lang="es">dibujo ODG (XML plano)</comment>
- <comment xml:lang="eu">ODG marrazkia (XML soila)</comment>
- <comment xml:lang="fi">ODG-piirros (Flat XML)</comment>
- <comment xml:lang="fo">ODG tekning (Flat XML)</comment>
- <comment xml:lang="fr">dessin ODG (XML plat)</comment>
- <comment xml:lang="fur">dissen ODG (XML sempliç)</comment>
- <comment xml:lang="ga">líníocht ODG (XML cothrom)</comment>
- <comment xml:lang="gl">debuxo ODB (XML plano)</comment>
- <comment xml:lang="he">ציור ODG (Flat XML(</comment>
- <comment xml:lang="hr">ODG crtež (Flat XML)</comment>
- <comment xml:lang="hu">ODG-rajz (egyszerű XML)</comment>
- <comment xml:lang="ia">Designo ODG (XML platte)</comment>
- <comment xml:lang="id">Gambar ODG (FLAT XML)</comment>
- <comment xml:lang="it">Disegno ODG (XML semplice)</comment>
- <comment xml:lang="ja">ODG ドロー (Flat XML)</comment>
- <comment xml:lang="ka">ODG-ის ნახაზი (Flat XML)</comment>
- <comment xml:lang="kk">ODG сызбасы (Тек XML)</comment>
- <comment xml:lang="ko">ODG 드로잉(단일 XML)</comment>
- <comment xml:lang="lt">ODG piešinys (Flat XML)</comment>
- <comment xml:lang="lv">ODG zīmējums (plakans XML)</comment>
- <comment xml:lang="nl">ODG-tekening (Flat XML)</comment>
- <comment xml:lang="oc">dessenh ODG (XML plat)</comment>
- <comment xml:lang="pl">Rysunek ODG (prosty XML)</comment>
- <comment xml:lang="pt">desenho ODG (XML plano)</comment>
- <comment xml:lang="pt-BR">Desenho ODG (Flat XML)</comment>
- <comment xml:lang="ro">Desen ODG (XML simplu)</comment>
- <comment xml:lang="ru">Рисунок ODG (простой XML)</comment>
- <comment xml:lang="sk">Kresba ODG (čisté XML)</comment>
- <comment xml:lang="sl">Datoteka risbe ODG (nepovezan XML)</comment>
- <comment xml:lang="sr">ОДГ цртеж (Обичан ИксМЛ)</comment>
- <comment xml:lang="sv">ODG-teckning (platt XML)</comment>
- <comment xml:lang="tr">ODG çizimi (Düz XML)</comment>
+ <comment xml:lang="zh_TW">ODG 繪圖 (Flat XML)</comment>
+ <comment xml:lang="zh_CN">ODG 绘图(Flat XML)</comment>
<comment xml:lang="uk">малюнок ODG (простий XML)</comment>
- <comment xml:lang="zh-CN">ODG 绘图(Flat XML)</comment>
- <comment xml:lang="zh-TW">ODG 繪圖 (Flat XML)</comment>
+ <comment xml:lang="tr">ODG çizimi (Düz XML)</comment>
+ <comment xml:lang="sv">ODG-teckning (platt XML)</comment>
+ <comment xml:lang="sr">ОДГ цртеж (Обичан ИксМЛ)</comment>
+ <comment xml:lang="sq">vizatim ODF (Flat XML)</comment>
+ <comment xml:lang="sl">Datoteka risbe ODG (nepovezan XML)</comment>
+ <comment xml:lang="si">ODG ඇඳීම (පැතලි XML)</comment>
+ <comment xml:lang="sk">Kresba ODG (čisté XML)</comment>
+ <comment xml:lang="ru">Рисунок ODG (простой XML)</comment>
+ <comment xml:lang="ro">Desen ODG (XML simplu)</comment>
+ <comment xml:lang="pt_BR">Desenho ODG (Flat XML)</comment>
+ <comment xml:lang="pt">desenho ODG (XML plano)</comment>
+ <comment xml:lang="pl">Rysunek ODG (prosty XML)</comment>
+ <comment xml:lang="oc">dessenh ODG (XML plat)</comment>
+ <comment xml:lang="nl">ODG-tekening (Flat XML)</comment>
+ <comment xml:lang="lv">ODG zīmējums (plakans XML)</comment>
+ <comment xml:lang="lt">ODG piešinys (Flat XML)</comment>
+ <comment xml:lang="ko">ODG 드로잉(단일 XML)</comment>
+ <comment xml:lang="kk">ODG сызбасы (Тек XML)</comment>
+ <comment xml:lang="ka">ODG-ის ნახაზი (Flat XML)</comment>
+ <comment xml:lang="ja">ODG ドロー (Flat XML)</comment>
+ <comment xml:lang="it">Disegno ODG (XML semplice)</comment>
+ <comment xml:lang="is">ODG teikning (flatt XML)</comment>
+ <comment xml:lang="id">Gambar ODG (FLAT XML)</comment>
+ <comment xml:lang="ia">Designo ODG (XML platte)</comment>
+ <comment xml:lang="hu">ODG-rajz (egyszerű XML)</comment>
+ <comment xml:lang="hr">ODG crtež (Flat XML)</comment>
+ <comment xml:lang="he">ציור ODG ‏(Flat XML)</comment>
+ <comment xml:lang="gl">debuxo ODB (XML plano)</comment>
+ <comment xml:lang="ga">líníocht ODG (XML cothrom)</comment>
+ <comment xml:lang="fur">dissen ODG (XML sempliç)</comment>
+ <comment xml:lang="fr">dessin ODG (XML plat)</comment>
+ <comment xml:lang="fo">ODG tekning (Flat XML)</comment>
+ <comment xml:lang="fi">ODG-piirros (Flat XML)</comment>
+ <comment xml:lang="eu">ODG marrazkia (XML soila)</comment>
+ <comment xml:lang="es">dibujo ODG (XML plano)</comment>
+ <comment xml:lang="en_GB">ODG drawing (Flat XML)</comment>
+ <comment xml:lang="el">Σχέδιο ODG (Flat XML)</comment>
+ <comment xml:lang="de">ODG-Zeichnung (einfaches XML)</comment>
+ <comment xml:lang="da">ODG-tegning (flad XML)</comment>
+ <comment xml:lang="cs">kresba ODG (Flat XML)</comment>
+ <comment xml:lang="ca">dibuix ODG (XML pla) </comment>
+ <comment xml:lang="bg">Чертеж — ODG (само XML)</comment>
+ <comment xml:lang="be">рысунак ODG (плоскі XML)</comment>
+ <comment xml:lang="ar">رسمة ODG (Flat XML)</comment>
+ <comment xml:lang="af">ODG-tekening (plat XML)</comment>
<acronym>FODG</acronym>
<expanded-acronym>OpenDocument Drawing (Flat XML)</expanded-acronym>
<sub-class-of type="application/xml"/>
@@ -5868,56 +6069,59 @@ command to generate the output files.
</mime-type>
<mime-type type="application/vnd.oasis.opendocument.graphics-template">
<comment>ODG template</comment>
- <comment xml:lang="af">ODG-sjabloon</comment>
- <comment xml:lang="ar">قالب ODG</comment>
- <comment xml:lang="be-Latn">Šablon ODG</comment>
- <comment xml:lang="bg">Шаблон за чертежи — ODG</comment>
- <comment xml:lang="ca">plantilla ODG</comment>
- <comment xml:lang="cs">šablona ODG</comment>
- <comment xml:lang="da">ODG-skabelon</comment>
- <comment xml:lang="de">ODG-Vorlage</comment>
- <comment xml:lang="el">Πρότυπο ODG</comment>
- <comment xml:lang="en-GB">ODG template</comment>
- <comment xml:lang="eo">ODG-ŝablono</comment>
- <comment xml:lang="es">plantilla ODG</comment>
- <comment xml:lang="eu">ODG txantiloia</comment>
- <comment xml:lang="fi">ODG-malli</comment>
- <comment xml:lang="fo">ODG formur</comment>
- <comment xml:lang="fr">modèle ODG</comment>
- <comment xml:lang="fur">model ODG</comment>
- <comment xml:lang="ga">teimpléad ODG</comment>
- <comment xml:lang="gl">modelo ODG</comment>
- <comment xml:lang="he">תבנית ODG</comment>
- <comment xml:lang="hr">ODG predložak</comment>
- <comment xml:lang="hu">ODG-sablon</comment>
- <comment xml:lang="ia">Patrono ODG</comment>
- <comment xml:lang="id">Templat ODG</comment>
- <comment xml:lang="it">Modello ODG</comment>
- <comment xml:lang="ja">ODG テンプレート</comment>
- <comment xml:lang="ka">ODG-ის შაბლონი</comment>
- <comment xml:lang="kk">ODG үлгісі</comment>
- <comment xml:lang="ko">ODG 문서 서식</comment>
- <comment xml:lang="lt">ODG šablonas</comment>
- <comment xml:lang="lv">ODG veidne</comment>
- <comment xml:lang="nb">ODG-mal</comment>
- <comment xml:lang="nl">ODG-sjabloon</comment>
- <comment xml:lang="nn">ODG-mal</comment>
- <comment xml:lang="oc">modèl ODG</comment>
- <comment xml:lang="pl">Szablon ODG</comment>
- <comment xml:lang="pt">modelo ODG</comment>
- <comment xml:lang="pt-BR">Modelo ODG</comment>
- <comment xml:lang="ro">Șablon ODG</comment>
- <comment xml:lang="ru">Шаблон ODG</comment>
- <comment xml:lang="sk">Šablóna ODG</comment>
- <comment xml:lang="sl">Predloga dokumenta ODG</comment>
- <comment xml:lang="sq">Model ODG</comment>
- <comment xml:lang="sr">ОДГ шаблон</comment>
- <comment xml:lang="sv">ODG-mall</comment>
- <comment xml:lang="tr">ODG şablonu</comment>
- <comment xml:lang="uk">шаблон ODG</comment>
+ <comment xml:lang="zh_TW">ODG 範本</comment>
+ <comment xml:lang="zh_CN">ODG 模板</comment>
<comment xml:lang="vi">Mẫu ODG</comment>
- <comment xml:lang="zh-CN">ODG 模板</comment>
- <comment xml:lang="zh-TW">ODG 範本</comment>
+ <comment xml:lang="uk">шаблон ODG</comment>
+ <comment xml:lang="tr">ODG şablonu</comment>
+ <comment xml:lang="sv">ODG-mall</comment>
+ <comment xml:lang="sr">ОДГ шаблон</comment>
+ <comment xml:lang="sq">gjedhe ODG</comment>
+ <comment xml:lang="sl">Predloga dokumenta ODG</comment>
+ <comment xml:lang="si">ODG අච්චුව</comment>
+ <comment xml:lang="sk">Šablóna ODG</comment>
+ <comment xml:lang="ru">Шаблон ODG</comment>
+ <comment xml:lang="ro">Șablon ODG</comment>
+ <comment xml:lang="pt_BR">Modelo ODG</comment>
+ <comment xml:lang="pt">modelo ODG</comment>
+ <comment xml:lang="pl">Szablon ODG</comment>
+ <comment xml:lang="oc">modèl ODG</comment>
+ <comment xml:lang="nn">ODG-mal</comment>
+ <comment xml:lang="nl">ODG-sjabloon</comment>
+ <comment xml:lang="nb">ODG-mal</comment>
+ <comment xml:lang="lv">ODG veidne</comment>
+ <comment xml:lang="lt">ODG šablonas</comment>
+ <comment xml:lang="ko">ODG 문서 서식</comment>
+ <comment xml:lang="kk">ODG үлгісі</comment>
+ <comment xml:lang="ka">ODG-ის შაბლონი</comment>
+ <comment xml:lang="ja">ODG テンプレート</comment>
+ <comment xml:lang="it">Modello ODG</comment>
+ <comment xml:lang="is">ODG sniðmát</comment>
+ <comment xml:lang="id">Templat ODG</comment>
+ <comment xml:lang="ia">Patrono ODG</comment>
+ <comment xml:lang="hu">ODG-sablon</comment>
+ <comment xml:lang="hr">ODG predložak</comment>
+ <comment xml:lang="he">תבנית ODG</comment>
+ <comment xml:lang="gl">modelo ODG</comment>
+ <comment xml:lang="ga">teimpléad ODG</comment>
+ <comment xml:lang="fur">model ODG</comment>
+ <comment xml:lang="fr">modèle ODG</comment>
+ <comment xml:lang="fo">ODG formur</comment>
+ <comment xml:lang="fi">ODG-malli</comment>
+ <comment xml:lang="eu">ODG txantiloia</comment>
+ <comment xml:lang="es">plantilla ODG</comment>
+ <comment xml:lang="eo">ODG-ŝablono</comment>
+ <comment xml:lang="en_GB">ODG template</comment>
+ <comment xml:lang="el">Πρότυπο ODG</comment>
+ <comment xml:lang="de">ODG-Vorlage</comment>
+ <comment xml:lang="da">ODG-skabelon</comment>
+ <comment xml:lang="cs">šablona ODG</comment>
+ <comment xml:lang="ca">plantilla ODG</comment>
+ <comment xml:lang="bg">Шаблон за чертежи — ODG</comment>
+ <comment xml:lang="be@latin">Šablon ODG</comment>
+ <comment xml:lang="be">шаблон ODG</comment>
+ <comment xml:lang="ar">قالب ODG</comment>
+ <comment xml:lang="af">ODG-sjabloon</comment>
<acronym>ODG</acronym>
<expanded-acronym>OpenDocument Drawing</expanded-acronym>
<sub-class-of type="application/zip"/>
@@ -5933,56 +6137,59 @@ command to generate the output files.
</mime-type>
<mime-type type="application/vnd.oasis.opendocument.presentation">
<comment>ODP presentation</comment>
- <comment xml:lang="af">ODP-voorlegging</comment>
- <comment xml:lang="ar">عرض تقديمي ODP</comment>
- <comment xml:lang="be-Latn">Prezentacyja ODP</comment>
- <comment xml:lang="bg">Презентация — ODP</comment>
- <comment xml:lang="ca">presentació ODP</comment>
- <comment xml:lang="cs">prezentace ODP</comment>
- <comment xml:lang="da">ODP-præsentation</comment>
- <comment xml:lang="de">ODP-Präsentation</comment>
- <comment xml:lang="el">Παρουσίαση ODP</comment>
- <comment xml:lang="en-GB">ODP presentation</comment>
- <comment xml:lang="eo">ODP-prezentaĵo</comment>
- <comment xml:lang="es">presentación ODP</comment>
- <comment xml:lang="eu">ODP aurkezpena</comment>
- <comment xml:lang="fi">ODP-esitys</comment>
- <comment xml:lang="fo">ODP framløga</comment>
- <comment xml:lang="fr">présentation ODP</comment>
- <comment xml:lang="fur">presentazion ODP</comment>
- <comment xml:lang="ga">láithreoireacht ODP</comment>
- <comment xml:lang="gl">presentación ODP</comment>
- <comment xml:lang="he">מצגת ODP</comment>
- <comment xml:lang="hr">ODP prezentacija</comment>
- <comment xml:lang="hu">ODP-prezentáció</comment>
- <comment xml:lang="ia">Presentation ODP</comment>
- <comment xml:lang="id">Presentasi ODP</comment>
- <comment xml:lang="it">Presentazione ODP</comment>
- <comment xml:lang="ja">ODP プレゼンテーション</comment>
- <comment xml:lang="ka">ODP პრეზენტაცია</comment>
- <comment xml:lang="kk">ODP презентациясы</comment>
- <comment xml:lang="ko">ODP 프레젠테이션</comment>
- <comment xml:lang="lt">ODP pateiktis</comment>
- <comment xml:lang="lv">ODP prezentācija</comment>
- <comment xml:lang="nb">ODP-presentasjon</comment>
- <comment xml:lang="nl">ODP-presentatie</comment>
- <comment xml:lang="nn">ODP-presentasjon</comment>
- <comment xml:lang="oc">presentacion ODP</comment>
- <comment xml:lang="pl">Prezentacja ODP</comment>
- <comment xml:lang="pt">apresentação ODP</comment>
- <comment xml:lang="pt-BR">Apresentação ODP</comment>
- <comment xml:lang="ro">Prezentare ODP</comment>
- <comment xml:lang="ru">Презентация ODP</comment>
- <comment xml:lang="sk">Prezentácia ODP</comment>
- <comment xml:lang="sl">Predstavitev ODP</comment>
- <comment xml:lang="sq">Prezantim ODP</comment>
- <comment xml:lang="sr">ОДП презентација</comment>
- <comment xml:lang="sv">ODP-presentation</comment>
- <comment xml:lang="tr">ODP sunumu</comment>
- <comment xml:lang="uk">презентація ODP</comment>
+ <comment xml:lang="zh_TW">ODP 簡報</comment>
+ <comment xml:lang="zh_CN">ODP 演示文稿</comment>
<comment xml:lang="vi">Trình diễn ODM</comment>
- <comment xml:lang="zh-CN">ODP 演示文稿</comment>
- <comment xml:lang="zh-TW">ODP 簡報</comment>
+ <comment xml:lang="uk">презентація ODP</comment>
+ <comment xml:lang="tr">ODP sunumu</comment>
+ <comment xml:lang="sv">ODP-presentation</comment>
+ <comment xml:lang="sr">ОДП презентација</comment>
+ <comment xml:lang="sq">paraqitje ODP</comment>
+ <comment xml:lang="sl">Predstavitev ODP</comment>
+ <comment xml:lang="si">ODP ඉදිරිපත් කිරීම</comment>
+ <comment xml:lang="sk">Prezentácia ODP</comment>
+ <comment xml:lang="ru">Презентация ODP</comment>
+ <comment xml:lang="ro">Prezentare ODP</comment>
+ <comment xml:lang="pt_BR">Apresentação ODP</comment>
+ <comment xml:lang="pt">apresentação ODP</comment>
+ <comment xml:lang="pl">Prezentacja ODP</comment>
+ <comment xml:lang="oc">presentacion ODP</comment>
+ <comment xml:lang="nn">ODP-presentasjon</comment>
+ <comment xml:lang="nl">ODP-presentatie</comment>
+ <comment xml:lang="nb">ODP-presentasjon</comment>
+ <comment xml:lang="lv">ODP prezentācija</comment>
+ <comment xml:lang="lt">ODP pateiktis</comment>
+ <comment xml:lang="ko">ODP 프레젠테이션</comment>
+ <comment xml:lang="kk">ODP презентациясы</comment>
+ <comment xml:lang="ka">ODP პრეზენტაცია</comment>
+ <comment xml:lang="ja">ODP プレゼンテーション</comment>
+ <comment xml:lang="it">Presentazione ODP</comment>
+ <comment xml:lang="is">ODP kynning</comment>
+ <comment xml:lang="id">Presentasi ODP</comment>
+ <comment xml:lang="ia">Presentation ODP</comment>
+ <comment xml:lang="hu">ODP-prezentáció</comment>
+ <comment xml:lang="hr">ODP prezentacija</comment>
+ <comment xml:lang="he">מצגת ODP</comment>
+ <comment xml:lang="gl">presentación ODP</comment>
+ <comment xml:lang="ga">láithreoireacht ODP</comment>
+ <comment xml:lang="fur">presentazion ODP</comment>
+ <comment xml:lang="fr">présentation ODP</comment>
+ <comment xml:lang="fo">ODP framløga</comment>
+ <comment xml:lang="fi">ODP-esitys</comment>
+ <comment xml:lang="eu">ODP aurkezpena</comment>
+ <comment xml:lang="es">presentación ODP</comment>
+ <comment xml:lang="eo">ODP-prezentaĵo</comment>
+ <comment xml:lang="en_GB">ODP presentation</comment>
+ <comment xml:lang="el">Παρουσίαση ODP</comment>
+ <comment xml:lang="de">ODP-Präsentation</comment>
+ <comment xml:lang="da">ODP-præsentation</comment>
+ <comment xml:lang="cs">prezentace ODP</comment>
+ <comment xml:lang="ca">presentació ODP</comment>
+ <comment xml:lang="bg">Презентация — ODP</comment>
+ <comment xml:lang="be@latin">Prezentacyja ODP</comment>
+ <comment xml:lang="be">прэзентацыя ODP</comment>
+ <comment xml:lang="ar">عرض تقديمي ODP</comment>
+ <comment xml:lang="af">ODP-voorlegging</comment>
<acronym>ODP</acronym>
<expanded-acronym>OpenDocument Presentation</expanded-acronym>
<sub-class-of type="application/zip"/>
@@ -5998,50 +6205,54 @@ command to generate the output files.
</mime-type>
<mime-type type="application/vnd.oasis.opendocument.presentation-flat-xml">
<comment>ODP presentation (Flat XML)</comment>
- <comment xml:lang="af">ODP-voorlegging (plat XML)</comment>
- <comment xml:lang="ar">عرض ODP (Flat XML)</comment>
- <comment xml:lang="bg">Презентация — ODP (само XML)</comment>
- <comment xml:lang="ca">presentació ODP (XML pla)</comment>
- <comment xml:lang="cs">prezentace ODP (Flat XML)</comment>
- <comment xml:lang="da">ODP-præsentation (flad XML)</comment>
- <comment xml:lang="de">ODP-Präsentation (Unkomprimiertes XML)</comment>
- <comment xml:lang="el">Παρουσίαση ODP (Flat XML)</comment>
- <comment xml:lang="en-GB">ODP presentation (Flat XML)</comment>
- <comment xml:lang="es">presentación ODP (XML plano)</comment>
- <comment xml:lang="eu">ODP aurkezpena (XML soila)</comment>
- <comment xml:lang="fi">ODP-esitys (Flat XML)</comment>
- <comment xml:lang="fo">ODP framløga (Flat XML)</comment>
- <comment xml:lang="fr">présentation ODP (XML plat)</comment>
- <comment xml:lang="fur">presentazion ODP (XML sempliç)</comment>
- <comment xml:lang="ga">láithreoireacht ODP (XML cothrom)</comment>
- <comment xml:lang="gl">presentación ODP (XML plano)</comment>
- <comment xml:lang="he">מצגת ODP‏ (Flat XML)</comment>
- <comment xml:lang="hr">ODP prezentacija (Flat XML)</comment>
- <comment xml:lang="hu">ODP-prezentáció (egyszerű XML)</comment>
- <comment xml:lang="ia">Presentation ODP (XML platte)</comment>
- <comment xml:lang="id">Presentasi ODP (Flat XML)</comment>
- <comment xml:lang="it">Presentazione ODP (XML semplice)</comment>
- <comment xml:lang="ja">ODP プレゼンテーション (Flat XML)</comment>
- <comment xml:lang="ka">ODP პრეზენტაცია (Flat XML)</comment>
- <comment xml:lang="kk">ODP презентациясы (Тек XML)</comment>
- <comment xml:lang="ko">ODP 프레젠테이션(단일 XML)</comment>
- <comment xml:lang="lt">ODP pateiktis (Flat XML)</comment>
- <comment xml:lang="lv">ODP prezentācija (plakans XML)</comment>
- <comment xml:lang="nl">ODP presentatie (Flat XML)</comment>
- <comment xml:lang="oc">presentacion ODP (XML plat)</comment>
- <comment xml:lang="pl">Prezentacja ODP (prosty XML)</comment>
- <comment xml:lang="pt">apresentação ODP (XML plano)</comment>
- <comment xml:lang="pt-BR">Apresentação ODP (Flat XML)</comment>
- <comment xml:lang="ro">Prezentare ODP (XML simplu)</comment>
- <comment xml:lang="ru">Презентация ODP (простой XML)</comment>
- <comment xml:lang="sk">Prezentácia ODP (čisté XML)</comment>
- <comment xml:lang="sl">Predstavitev ODP (nepovezan XML)</comment>
- <comment xml:lang="sr">ОДП презентација (Обични ИксМЛ)</comment>
- <comment xml:lang="sv">ODP-presentation (platt XML)</comment>
- <comment xml:lang="tr">ODP sunumu (Düz XML)</comment>
+ <comment xml:lang="zh_TW">ODP 範本 (Flat XML)</comment>
+ <comment xml:lang="zh_CN">ODP 演示文稿(Flat XML)</comment>
<comment xml:lang="uk">презентація ODP (Flat XML)</comment>
- <comment xml:lang="zh-CN">ODP 演示文稿(Flat XML)</comment>
- <comment xml:lang="zh-TW">ODP 範本 (Flat XML)</comment>
+ <comment xml:lang="tr">ODP sunumu (Düz XML)</comment>
+ <comment xml:lang="sv">ODP-presentation (platt XML)</comment>
+ <comment xml:lang="sr">ОДП презентација (Обични ИксМЛ)</comment>
+ <comment xml:lang="sq">paraqitje ODF (Flat XML)</comment>
+ <comment xml:lang="sl">Predstavitev ODP (nepovezan XML)</comment>
+ <comment xml:lang="si">ODP ඉදිරිපත් කිරීම (පැතලි XML)</comment>
+ <comment xml:lang="sk">Prezentácia ODP (čisté XML)</comment>
+ <comment xml:lang="ru">Презентация ODP (простой XML)</comment>
+ <comment xml:lang="ro">Prezentare ODP (XML simplu)</comment>
+ <comment xml:lang="pt_BR">Apresentação ODP (Flat XML)</comment>
+ <comment xml:lang="pt">apresentação ODP (XML plano)</comment>
+ <comment xml:lang="pl">Prezentacja ODP (prosty XML)</comment>
+ <comment xml:lang="oc">presentacion ODP (XML plat)</comment>
+ <comment xml:lang="nl">ODP presentatie (Flat XML)</comment>
+ <comment xml:lang="lv">ODP prezentācija (plakans XML)</comment>
+ <comment xml:lang="lt">ODP pateiktis (Flat XML)</comment>
+ <comment xml:lang="ko">ODP 프레젠테이션(단일 XML)</comment>
+ <comment xml:lang="kk">ODP презентациясы (Тек XML)</comment>
+ <comment xml:lang="ka">ODP პრეზენტაცია (Flat XML)</comment>
+ <comment xml:lang="ja">ODP プレゼンテーション (Flat XML)</comment>
+ <comment xml:lang="it">Presentazione ODP (XML semplice)</comment>
+ <comment xml:lang="is">ODP glærukynning (flatt XML)</comment>
+ <comment xml:lang="id">Presentasi ODP (Flat XML)</comment>
+ <comment xml:lang="ia">Presentation ODP (XML platte)</comment>
+ <comment xml:lang="hu">ODP-prezentáció (egyszerű XML)</comment>
+ <comment xml:lang="hr">ODP prezentacija (Flat XML)</comment>
+ <comment xml:lang="he">מצגת ODP‏ (Flat XML)</comment>
+ <comment xml:lang="gl">presentación ODP (XML plano)</comment>
+ <comment xml:lang="ga">láithreoireacht ODP (XML cothrom)</comment>
+ <comment xml:lang="fur">presentazion ODP (XML sempliç)</comment>
+ <comment xml:lang="fr">présentation ODP (XML plat)</comment>
+ <comment xml:lang="fo">ODP framløga (Flat XML)</comment>
+ <comment xml:lang="fi">ODP-esitys (Flat XML)</comment>
+ <comment xml:lang="eu">ODP aurkezpena (XML soila)</comment>
+ <comment xml:lang="es">presentación ODP (XML plano)</comment>
+ <comment xml:lang="en_GB">ODP presentation (Flat XML)</comment>
+ <comment xml:lang="el">Παρουσίαση ODP (Flat XML)</comment>
+ <comment xml:lang="de">ODP-Präsentation (einfaches XML)</comment>
+ <comment xml:lang="da">ODP-præsentation (flad XML)</comment>
+ <comment xml:lang="cs">prezentace ODP (Flat XML)</comment>
+ <comment xml:lang="ca">presentació ODP (XML pla)</comment>
+ <comment xml:lang="bg">Презентация — ODP (само XML)</comment>
+ <comment xml:lang="be">прэзентацыя ODP (плоскі XML)</comment>
+ <comment xml:lang="ar">عرض ODP (Flat XML)</comment>
+ <comment xml:lang="af">ODP-voorlegging (plat XML)</comment>
<acronym>FODP</acronym>
<expanded-acronym>OpenDocument Presentation (Flat XML)</expanded-acronym>
<sub-class-of type="application/xml"/>
@@ -6050,56 +6261,59 @@ command to generate the output files.
</mime-type>
<mime-type type="application/vnd.oasis.opendocument.presentation-template">
<comment>ODP template</comment>
- <comment xml:lang="af">ODP-sjabloon</comment>
- <comment xml:lang="ar">قالب ODP</comment>
- <comment xml:lang="be-Latn">Šablon ODP</comment>
- <comment xml:lang="bg">Шаблон за презентации — ODP</comment>
- <comment xml:lang="ca">plantilla ODP</comment>
- <comment xml:lang="cs">šablona ODP</comment>
- <comment xml:lang="da">ODP-skabelon</comment>
- <comment xml:lang="de">ODP-Vorlage</comment>
- <comment xml:lang="el">Πρότυπο ODP</comment>
- <comment xml:lang="en-GB">ODP template</comment>
- <comment xml:lang="eo">ODP-ŝablono</comment>
- <comment xml:lang="es">plantilla ODP</comment>
- <comment xml:lang="eu">ODP txantiloia</comment>
- <comment xml:lang="fi">ODP-malli</comment>
- <comment xml:lang="fo">ODP formur</comment>
- <comment xml:lang="fr">modèle ODP</comment>
- <comment xml:lang="fur">model ODP</comment>
- <comment xml:lang="ga">teimpléad ODP</comment>
- <comment xml:lang="gl">modelo ODP</comment>
- <comment xml:lang="he">תבנית ODP</comment>
- <comment xml:lang="hr">ODP predložak</comment>
- <comment xml:lang="hu">ODP-sablon</comment>
- <comment xml:lang="ia">Patrono ODP</comment>
- <comment xml:lang="id">Templat ODP</comment>
- <comment xml:lang="it">Modello ODP</comment>
- <comment xml:lang="ja">ODP テンプレート</comment>
- <comment xml:lang="ka">ODP შაბლონი</comment>
- <comment xml:lang="kk">ODP үлгісі</comment>
- <comment xml:lang="ko">ODP 문서 서식</comment>
- <comment xml:lang="lt">ODP šablonas</comment>
- <comment xml:lang="lv">ODP veidne</comment>
- <comment xml:lang="nb">ODP-mal</comment>
- <comment xml:lang="nl">ODP-sjabloon</comment>
- <comment xml:lang="nn">ODP-mal</comment>
- <comment xml:lang="oc">modèl ODP</comment>
- <comment xml:lang="pl">Szablon ODP</comment>
- <comment xml:lang="pt">modelo ODP</comment>
- <comment xml:lang="pt-BR">Modelo ODP</comment>
- <comment xml:lang="ro">Șablon ODP</comment>
- <comment xml:lang="ru">Шаблон ODP</comment>
- <comment xml:lang="sk">Šablóna ODP</comment>
- <comment xml:lang="sl">Predloga dokumenta ODP</comment>
- <comment xml:lang="sq">Model ODP</comment>
- <comment xml:lang="sr">ОДП шаблон</comment>
- <comment xml:lang="sv">ODP-mall</comment>
- <comment xml:lang="tr">ODP şablonu</comment>
- <comment xml:lang="uk">шаблон ODP</comment>
+ <comment xml:lang="zh_TW">ODP 範本</comment>
+ <comment xml:lang="zh_CN">ODP 模板</comment>
<comment xml:lang="vi">Mẫu ODP</comment>
- <comment xml:lang="zh-CN">ODP 模板</comment>
- <comment xml:lang="zh-TW">ODP 範本</comment>
+ <comment xml:lang="uk">шаблон ODP</comment>
+ <comment xml:lang="tr">ODP şablonu</comment>
+ <comment xml:lang="sv">ODP-mall</comment>
+ <comment xml:lang="sr">ОДП шаблон</comment>
+ <comment xml:lang="sq">gjedhe ODP</comment>
+ <comment xml:lang="sl">Predloga dokumenta ODP</comment>
+ <comment xml:lang="si">ODP අච්චුව</comment>
+ <comment xml:lang="sk">Šablóna ODP</comment>
+ <comment xml:lang="ru">Шаблон ODP</comment>
+ <comment xml:lang="ro">Șablon ODP</comment>
+ <comment xml:lang="pt_BR">Modelo ODP</comment>
+ <comment xml:lang="pt">modelo ODP</comment>
+ <comment xml:lang="pl">Szablon ODP</comment>
+ <comment xml:lang="oc">modèl ODP</comment>
+ <comment xml:lang="nn">ODP-mal</comment>
+ <comment xml:lang="nl">ODP-sjabloon</comment>
+ <comment xml:lang="nb">ODP-mal</comment>
+ <comment xml:lang="lv">ODP veidne</comment>
+ <comment xml:lang="lt">ODP šablonas</comment>
+ <comment xml:lang="ko">ODP 문서 서식</comment>
+ <comment xml:lang="kk">ODP үлгісі</comment>
+ <comment xml:lang="ka">ODP შაბლონი</comment>
+ <comment xml:lang="ja">ODP テンプレート</comment>
+ <comment xml:lang="it">Modello ODP</comment>
+ <comment xml:lang="is">ODP sniðmát</comment>
+ <comment xml:lang="id">Templat ODP</comment>
+ <comment xml:lang="ia">Patrono ODP</comment>
+ <comment xml:lang="hu">ODP-sablon</comment>
+ <comment xml:lang="hr">ODP predložak</comment>
+ <comment xml:lang="he">תבנית ODP</comment>
+ <comment xml:lang="gl">modelo ODP</comment>
+ <comment xml:lang="ga">teimpléad ODP</comment>
+ <comment xml:lang="fur">model ODP</comment>
+ <comment xml:lang="fr">modèle ODP</comment>
+ <comment xml:lang="fo">ODP formur</comment>
+ <comment xml:lang="fi">ODP-malli</comment>
+ <comment xml:lang="eu">ODP txantiloia</comment>
+ <comment xml:lang="es">plantilla ODP</comment>
+ <comment xml:lang="eo">ODP-ŝablono</comment>
+ <comment xml:lang="en_GB">ODP template</comment>
+ <comment xml:lang="el">Πρότυπο ODP</comment>
+ <comment xml:lang="de">ODP-Vorlage</comment>
+ <comment xml:lang="da">ODP-skabelon</comment>
+ <comment xml:lang="cs">šablona ODP</comment>
+ <comment xml:lang="ca">plantilla ODP</comment>
+ <comment xml:lang="bg">Шаблон за презентации — ODP</comment>
+ <comment xml:lang="be@latin">Šablon ODP</comment>
+ <comment xml:lang="be">шаблон ODP</comment>
+ <comment xml:lang="ar">قالب ODP</comment>
+ <comment xml:lang="af">ODP-sjabloon</comment>
<acronym>ODP</acronym>
<expanded-acronym>OpenDocument Presentation</expanded-acronym>
<sub-class-of type="application/zip"/>
@@ -6115,56 +6329,59 @@ command to generate the output files.
</mime-type>
<mime-type type="application/vnd.oasis.opendocument.spreadsheet">
<comment>ODS spreadsheet</comment>
- <comment xml:lang="af">ODS-sigblad</comment>
- <comment xml:lang="ar">جدول ODS</comment>
- <comment xml:lang="be-Latn">Raźlikovy arkuš ODS</comment>
- <comment xml:lang="bg">Таблица — ODS</comment>
- <comment xml:lang="ca">full de càlcul ODS</comment>
- <comment xml:lang="cs">sešit ODS</comment>
- <comment xml:lang="da">ODS-regneark</comment>
- <comment xml:lang="de">ODS-Tabelle</comment>
- <comment xml:lang="el">Λογιστικό φύλλο ODS</comment>
- <comment xml:lang="en-GB">ODS spreadsheet</comment>
- <comment xml:lang="eo">ODS-kalkultabelo</comment>
- <comment xml:lang="es">hoja de cálculo ODS</comment>
- <comment xml:lang="eu">ODS kalkulu-orria</comment>
- <comment xml:lang="fi">ODS-taulukko</comment>
- <comment xml:lang="fo">ODS rokniark</comment>
- <comment xml:lang="fr">feuille de calcul ODS</comment>
- <comment xml:lang="fur">sfuei di calcul ODS</comment>
- <comment xml:lang="ga">scarbhileog ODS</comment>
- <comment xml:lang="gl">folla de cálculo ODS</comment>
- <comment xml:lang="he">גליון נתונים ODS</comment>
- <comment xml:lang="hr">ODS proračunska tablica</comment>
- <comment xml:lang="hu">ODS-táblázat</comment>
- <comment xml:lang="ia">Folio de calculo ODS</comment>
- <comment xml:lang="id">Lembar sebar ODS</comment>
- <comment xml:lang="it">Foglio di calcolo ODS</comment>
- <comment xml:lang="ja">ODS スプレッドシート</comment>
- <comment xml:lang="ka">ODS ცხრილი</comment>
- <comment xml:lang="kk">ODS электрондық кестесі</comment>
- <comment xml:lang="ko">ODS 스프레드시트</comment>
- <comment xml:lang="lt">ODS skaičialentė</comment>
- <comment xml:lang="lv">ODS izklājlapa</comment>
- <comment xml:lang="nb">ODS-regneark</comment>
- <comment xml:lang="nl">ODS-rekenblad</comment>
- <comment xml:lang="nn">ODS-rekneark</comment>
- <comment xml:lang="oc">fuèlh de calcul ODS</comment>
- <comment xml:lang="pl">Arkusz ODS</comment>
- <comment xml:lang="pt">folha de cálculo ODS</comment>
- <comment xml:lang="pt-BR">Planilha ODS</comment>
- <comment xml:lang="ro">Foaie de calcul ODS</comment>
- <comment xml:lang="ru">Электронная таблица ODS</comment>
- <comment xml:lang="sk">Zošit ODS</comment>
- <comment xml:lang="sl">Preglednica ODS</comment>
- <comment xml:lang="sq">Fletë llogaritjesh ODS</comment>
- <comment xml:lang="sr">ОДС табела</comment>
- <comment xml:lang="sv">ODS-kalkylblad</comment>
- <comment xml:lang="tr">ODS hesap çizelgesi</comment>
- <comment xml:lang="uk">ел. таблиця ODS</comment>
+ <comment xml:lang="zh_TW">ODS 試算表</comment>
+ <comment xml:lang="zh_CN">ODS 电子表格</comment>
<comment xml:lang="vi">Bảng tính ODS</comment>
- <comment xml:lang="zh-CN">ODS 电子表格</comment>
- <comment xml:lang="zh-TW">ODS 試算表</comment>
+ <comment xml:lang="uk">електронна таблиця ODS</comment>
+ <comment xml:lang="tr">ODS hesap çizelgesi</comment>
+ <comment xml:lang="sv">ODS-kalkylblad</comment>
+ <comment xml:lang="sr">ОДС табела</comment>
+ <comment xml:lang="sq">fletëllogaritje ODS</comment>
+ <comment xml:lang="sl">Preglednica ODS</comment>
+ <comment xml:lang="si">ODS පැතුරුම්පත</comment>
+ <comment xml:lang="sk">Zošit ODS</comment>
+ <comment xml:lang="ru">Электронная таблица ODS</comment>
+ <comment xml:lang="ro">Foaie de calcul ODS</comment>
+ <comment xml:lang="pt_BR">Planilha ODS</comment>
+ <comment xml:lang="pt">folha de cálculo ODS</comment>
+ <comment xml:lang="pl">Arkusz ODS</comment>
+ <comment xml:lang="oc">fuèlh de calcul ODS</comment>
+ <comment xml:lang="nn">ODS-rekneark</comment>
+ <comment xml:lang="nl">ODS-rekenblad</comment>
+ <comment xml:lang="nb">ODS-regneark</comment>
+ <comment xml:lang="lv">ODS izklājlapa</comment>
+ <comment xml:lang="lt">ODS skaičialentė</comment>
+ <comment xml:lang="ko">ODS 스프레드시트</comment>
+ <comment xml:lang="kk">ODS электрондық кестесі</comment>
+ <comment xml:lang="ka">ODS ცხრილი</comment>
+ <comment xml:lang="ja">ODS スプレッドシート</comment>
+ <comment xml:lang="it">Foglio di calcolo ODS</comment>
+ <comment xml:lang="is">ODS töflureikniskjal</comment>
+ <comment xml:lang="id">Lembar sebar ODS</comment>
+ <comment xml:lang="ia">Folio de calculo ODS</comment>
+ <comment xml:lang="hu">ODS-táblázat</comment>
+ <comment xml:lang="hr">ODS proračunska tablica</comment>
+ <comment xml:lang="he">גיליון נתונים ODS</comment>
+ <comment xml:lang="gl">folla de cálculo ODS</comment>
+ <comment xml:lang="ga">scarbhileog ODS</comment>
+ <comment xml:lang="fur">sfuei di calcul ODS</comment>
+ <comment xml:lang="fr">feuille de calcul ODS</comment>
+ <comment xml:lang="fo">ODS rokniark</comment>
+ <comment xml:lang="fi">ODS-taulukko</comment>
+ <comment xml:lang="eu">ODS kalkulu-orria</comment>
+ <comment xml:lang="es">hoja de cálculo ODS</comment>
+ <comment xml:lang="eo">ODS-kalkultabelo</comment>
+ <comment xml:lang="en_GB">ODS spreadsheet</comment>
+ <comment xml:lang="el">Λογιστικό φύλλο ODS</comment>
+ <comment xml:lang="de">ODS-Tabelle</comment>
+ <comment xml:lang="da">ODS-regneark</comment>
+ <comment xml:lang="cs">sešit ODS</comment>
+ <comment xml:lang="ca">full de càlcul ODS</comment>
+ <comment xml:lang="bg">Таблица — ODS</comment>
+ <comment xml:lang="be@latin">Raźlikovy arkuš ODS</comment>
+ <comment xml:lang="be">электронная табліца ODS</comment>
+ <comment xml:lang="ar">جدول ODS</comment>
+ <comment xml:lang="af">ODS-sigblad</comment>
<acronym>ODS</acronym>
<expanded-acronym>OpenDocument Spreadsheet</expanded-acronym>
<sub-class-of type="application/zip"/>
@@ -6180,50 +6397,54 @@ command to generate the output files.
</mime-type>
<mime-type type="application/vnd.oasis.opendocument.spreadsheet-flat-xml">
<comment>ODS spreadsheet (Flat XML)</comment>
- <comment xml:lang="af">ODS-sigblad (plat XML)</comment>
- <comment xml:lang="ar">جدول ODS (Flat XML)</comment>
- <comment xml:lang="bg">Таблица — ODS (само XML)</comment>
- <comment xml:lang="ca">full de càlcul ODS (XML pla)</comment>
- <comment xml:lang="cs">sešit ODS (Flat XML)</comment>
- <comment xml:lang="da">ODS-regneark (flad XML)</comment>
- <comment xml:lang="de">ODS-Tabelle (Unkomprimiertes XML)</comment>
- <comment xml:lang="el">Λογιστικό φύλλο ODS (Flat XML)</comment>
- <comment xml:lang="en-GB">ODS spreadsheet (Flat XML)</comment>
- <comment xml:lang="es">hoja de cálculo ODS (XML plano)</comment>
- <comment xml:lang="eu">ODS kalkulu-orria (XML soila)</comment>
- <comment xml:lang="fi">ODS-laskentataulukko (Flat XML)</comment>
- <comment xml:lang="fo">ODS rokniark (Flat XML)</comment>
- <comment xml:lang="fr">feuille de calcul ODS (XML plat)</comment>
- <comment xml:lang="fur">sfuei di calcul ODS (XML sempliç)</comment>
- <comment xml:lang="ga">scarbhileog ODS (XML cothrom)</comment>
- <comment xml:lang="gl">folla de cálculo ODS (XML plano)</comment>
- <comment xml:lang="he">גליון נתונים ODS‏ (XML פשוט)</comment>
- <comment xml:lang="hr">ODS proračunska tablica (Flat XML)</comment>
- <comment xml:lang="hu">ODS-táblázat (egyszerű XML)</comment>
- <comment xml:lang="ia">Folio de calculo ODS (XML platte)</comment>
- <comment xml:lang="id">Lembar sebar ODS (Flat XML)</comment>
- <comment xml:lang="it">Foglio di calcolo ODS (XML semplice)</comment>
- <comment xml:lang="ja">ODS スプレッドシート (Flat XML)</comment>
- <comment xml:lang="ka">ODS ცხრილი (Flat XML)</comment>
- <comment xml:lang="kk">ODS электрондық кестесі (Тек XML)</comment>
- <comment xml:lang="ko">ODS 스프레드시트(단일 XML)</comment>
- <comment xml:lang="lt">ODS skaičialentė (Flat XML)</comment>
- <comment xml:lang="lv">ODS izklājlapa (plakans XML)</comment>
- <comment xml:lang="nl">ODS spreadsheet (Flat XML)</comment>
- <comment xml:lang="oc">fuèlh de calcul ODS (XML plat)</comment>
- <comment xml:lang="pl">Arkusz ODS (prosty XML)</comment>
- <comment xml:lang="pt">folha de cálculo ODS (XML plano)</comment>
- <comment xml:lang="pt-BR">Planilha ODS (Flat XML)</comment>
- <comment xml:lang="ro">Foaie de calcul ODS (XML simplu)</comment>
- <comment xml:lang="ru">Электронная таблица ODS (простой XML)</comment>
- <comment xml:lang="sk">Zošit ODS (čisté XML)</comment>
- <comment xml:lang="sl">Preglednica ODS (nepovezan XML)</comment>
- <comment xml:lang="sr">ОДС табела (обични ИксМЛ)</comment>
- <comment xml:lang="sv">ODS-kalkylblad (platt XML)</comment>
+ <comment xml:lang="zh_TW">ODS 試算表 (Flat XML)</comment>
+ <comment xml:lang="zh_CN">ODS 电子表格 (Flat XML)</comment>
+ <comment xml:lang="uk">електронна таблиця ODS (Flat XML)</comment>
<comment xml:lang="tr">ODS hesap çizelgesi (Düz XML)</comment>
- <comment xml:lang="uk">ел. таблиця ODS (Flat XML)</comment>
- <comment xml:lang="zh-CN">ODS 电子表格 (Flat XML)</comment>
- <comment xml:lang="zh-TW">ODS 試算表 (Flat XML)</comment>
+ <comment xml:lang="sv">ODS-kalkylblad (platt XML)</comment>
+ <comment xml:lang="sr">ОДС табела (обични ИксМЛ)</comment>
+ <comment xml:lang="sq">fletëllogaritje ODF (Flat XML)</comment>
+ <comment xml:lang="sl">Preglednica ODS (nepovezan XML)</comment>
+ <comment xml:lang="si">ODS පැතුරුම්පත (පැතලි XML)</comment>
+ <comment xml:lang="sk">Zošit ODS (čisté XML)</comment>
+ <comment xml:lang="ru">Электронная таблица ODS (простой XML)</comment>
+ <comment xml:lang="ro">Foaie de calcul ODS (XML simplu)</comment>
+ <comment xml:lang="pt_BR">Planilha ODS (Flat XML)</comment>
+ <comment xml:lang="pt">folha de cálculo ODS (XML plano)</comment>
+ <comment xml:lang="pl">Arkusz ODS (prosty XML)</comment>
+ <comment xml:lang="oc">fuèlh de calcul ODS (XML plat)</comment>
+ <comment xml:lang="nl">ODS spreadsheet (Flat XML)</comment>
+ <comment xml:lang="lv">ODS izklājlapa (plakans XML)</comment>
+ <comment xml:lang="lt">ODS skaičialentė (Flat XML)</comment>
+ <comment xml:lang="ko">ODS 스프레드시트(단일 XML)</comment>
+ <comment xml:lang="kk">ODS электрондық кестесі (Тек XML)</comment>
+ <comment xml:lang="ka">ODS ცხრილი (Flat XML)</comment>
+ <comment xml:lang="ja">ODS スプレッドシート (Flat XML)</comment>
+ <comment xml:lang="it">Foglio di calcolo ODS (XML semplice)</comment>
+ <comment xml:lang="is">ODS töflureikniskjal (flatt XML)</comment>
+ <comment xml:lang="id">Lembar sebar ODS (Flat XML)</comment>
+ <comment xml:lang="ia">Folio de calculo ODS (XML platte)</comment>
+ <comment xml:lang="hu">ODS-táblázat (egyszerű XML)</comment>
+ <comment xml:lang="hr">ODS proračunska tablica (Flat XML)</comment>
+ <comment xml:lang="he">גיליון נתונים ODS‏ (XML פשוט)</comment>
+ <comment xml:lang="gl">folla de cálculo ODS (XML plano)</comment>
+ <comment xml:lang="ga">scarbhileog ODS (XML cothrom)</comment>
+ <comment xml:lang="fur">sfuei di calcul ODS (XML sempliç)</comment>
+ <comment xml:lang="fr">feuille de calcul ODS (XML plat)</comment>
+ <comment xml:lang="fo">ODS rokniark (Flat XML)</comment>
+ <comment xml:lang="fi">ODS-laskentataulukko (Flat XML)</comment>
+ <comment xml:lang="eu">ODS kalkulu-orria (XML soila)</comment>
+ <comment xml:lang="es">hoja de cálculo ODS (XML plano)</comment>
+ <comment xml:lang="en_GB">ODS spreadsheet (Flat XML)</comment>
+ <comment xml:lang="el">Λογιστικό φύλλο ODS (Flat XML)</comment>
+ <comment xml:lang="de">ODS-Tabelle (einfaches XML)</comment>
+ <comment xml:lang="da">ODS-regneark (flad XML)</comment>
+ <comment xml:lang="cs">sešit ODS (Flat XML)</comment>
+ <comment xml:lang="ca">full de càlcul ODS (XML pla)</comment>
+ <comment xml:lang="bg">Таблица — ODS (само XML)</comment>
+ <comment xml:lang="be">электронная табліца ODS (плоскі XML)</comment>
+ <comment xml:lang="ar">جدول ODS (Flat XML)</comment>
+ <comment xml:lang="af">ODS-sigblad (plat XML)</comment>
<acronym>FODS</acronym>
<expanded-acronym>OpenDocument Spreadsheet (Flat XML)</expanded-acronym>
<sub-class-of type="application/xml"/>
@@ -6232,56 +6453,59 @@ command to generate the output files.
</mime-type>
<mime-type type="application/vnd.oasis.opendocument.spreadsheet-template">
<comment>ODS template</comment>
- <comment xml:lang="af">ODS-sjabloon</comment>
- <comment xml:lang="ar">قالب ODS</comment>
- <comment xml:lang="be-Latn">Šablon ODS</comment>
- <comment xml:lang="bg">Шаблон за таблици — ODS</comment>
- <comment xml:lang="ca">plantilla ODS</comment>
- <comment xml:lang="cs">šablona ODS</comment>
- <comment xml:lang="da">ODS-skabelon</comment>
- <comment xml:lang="de">ODS-Vorlage</comment>
- <comment xml:lang="el">Πρότυπο ODS</comment>
- <comment xml:lang="en-GB">ODS template</comment>
- <comment xml:lang="eo">ODS-ŝablono</comment>
- <comment xml:lang="es">plantilla ODS</comment>
- <comment xml:lang="eu">ODS txantiloia</comment>
- <comment xml:lang="fi">ODS-malli</comment>
- <comment xml:lang="fo">ODS formur</comment>
- <comment xml:lang="fr">modèle ODS</comment>
- <comment xml:lang="fur">model ODS</comment>
- <comment xml:lang="ga">teimpléad ODS</comment>
- <comment xml:lang="gl">modelo ODS</comment>
- <comment xml:lang="he">תבנית ODS</comment>
- <comment xml:lang="hr">ODS predložak</comment>
- <comment xml:lang="hu">ODS-sablon</comment>
- <comment xml:lang="ia">Patrono ODS</comment>
- <comment xml:lang="id">Templat ODS</comment>
- <comment xml:lang="it">Modello ODS</comment>
- <comment xml:lang="ja">ODS テンプレート</comment>
- <comment xml:lang="ka">ODS-ის შაბლონი</comment>
- <comment xml:lang="kk">ODS үлгісі</comment>
- <comment xml:lang="ko">ODS 문서 서식</comment>
- <comment xml:lang="lt">ODS šablonas</comment>
- <comment xml:lang="lv">ODS veidne</comment>
- <comment xml:lang="nb">ODS-mal</comment>
- <comment xml:lang="nl">ODS-sjabloon</comment>
- <comment xml:lang="nn">ODS-mal</comment>
- <comment xml:lang="oc">modèl ODS</comment>
- <comment xml:lang="pl">Szablon ODS</comment>
- <comment xml:lang="pt">modelo ODS</comment>
- <comment xml:lang="pt-BR">Modelo ODS</comment>
- <comment xml:lang="ro">Șablon ODS</comment>
- <comment xml:lang="ru">Шаблон ODS</comment>
- <comment xml:lang="sk">Šablóna ODS</comment>
- <comment xml:lang="sl">Predloga dokumenta ODS</comment>
- <comment xml:lang="sq">Model ODS</comment>
- <comment xml:lang="sr">ОДС шаблон</comment>
- <comment xml:lang="sv">ODS-mall</comment>
- <comment xml:lang="tr">ODS şablonu</comment>
- <comment xml:lang="uk">шаблон ODS</comment>
+ <comment xml:lang="zh_TW">ODS 範本</comment>
+ <comment xml:lang="zh_CN">ODS 模板</comment>
<comment xml:lang="vi">Mẫu ODS</comment>
- <comment xml:lang="zh-CN">ODS 模板</comment>
- <comment xml:lang="zh-TW">ODS 範本</comment>
+ <comment xml:lang="uk">шаблон ODS</comment>
+ <comment xml:lang="tr">ODS şablonu</comment>
+ <comment xml:lang="sv">ODS-mall</comment>
+ <comment xml:lang="sr">ОДС шаблон</comment>
+ <comment xml:lang="sq">gjedhe ODS</comment>
+ <comment xml:lang="sl">Predloga dokumenta ODS</comment>
+ <comment xml:lang="si">ODS ආකෘතිය</comment>
+ <comment xml:lang="sk">Šablóna ODS</comment>
+ <comment xml:lang="ru">Шаблон ODS</comment>
+ <comment xml:lang="ro">Șablon ODS</comment>
+ <comment xml:lang="pt_BR">Modelo ODS</comment>
+ <comment xml:lang="pt">modelo ODS</comment>
+ <comment xml:lang="pl">Szablon ODS</comment>
+ <comment xml:lang="oc">modèl ODS</comment>
+ <comment xml:lang="nn">ODS-mal</comment>
+ <comment xml:lang="nl">ODS-sjabloon</comment>
+ <comment xml:lang="nb">ODS-mal</comment>
+ <comment xml:lang="lv">ODS veidne</comment>
+ <comment xml:lang="lt">ODS šablonas</comment>
+ <comment xml:lang="ko">ODS 문서 서식</comment>
+ <comment xml:lang="kk">ODS үлгісі</comment>
+ <comment xml:lang="ka">ODS-ის შაბლონი</comment>
+ <comment xml:lang="ja">ODS テンプレート</comment>
+ <comment xml:lang="it">Modello ODS</comment>
+ <comment xml:lang="is">ODS sniðmát</comment>
+ <comment xml:lang="id">Templat ODS</comment>
+ <comment xml:lang="ia">Patrono ODS</comment>
+ <comment xml:lang="hu">ODS-sablon</comment>
+ <comment xml:lang="hr">ODS predložak</comment>
+ <comment xml:lang="he">תבנית ODS</comment>
+ <comment xml:lang="gl">modelo ODS</comment>
+ <comment xml:lang="ga">teimpléad ODS</comment>
+ <comment xml:lang="fur">model ODS</comment>
+ <comment xml:lang="fr">modèle ODS</comment>
+ <comment xml:lang="fo">ODS formur</comment>
+ <comment xml:lang="fi">ODS-malli</comment>
+ <comment xml:lang="eu">ODS txantiloia</comment>
+ <comment xml:lang="es">plantilla ODS</comment>
+ <comment xml:lang="eo">ODS-ŝablono</comment>
+ <comment xml:lang="en_GB">ODS template</comment>
+ <comment xml:lang="el">Πρότυπο ODS</comment>
+ <comment xml:lang="de">ODS-Vorlage</comment>
+ <comment xml:lang="da">ODS-skabelon</comment>
+ <comment xml:lang="cs">šablona ODS</comment>
+ <comment xml:lang="ca">plantilla ODS</comment>
+ <comment xml:lang="bg">Шаблон за таблици — ODS</comment>
+ <comment xml:lang="be@latin">Šablon ODS</comment>
+ <comment xml:lang="be">шаблон ODS</comment>
+ <comment xml:lang="ar">قالب ODS</comment>
+ <comment xml:lang="af">ODS-sjabloon</comment>
<acronym>ODS</acronym>
<expanded-acronym>OpenDocument Spreadsheet</expanded-acronym>
<sub-class-of type="application/zip"/>
@@ -6297,55 +6521,58 @@ command to generate the output files.
</mime-type>
<mime-type type="application/vnd.oasis.opendocument.chart">
<comment>ODC chart</comment>
- <comment xml:lang="af">ODC-grafiek</comment>
- <comment xml:lang="ar">مخطط ODC</comment>
- <comment xml:lang="be-Latn">Dyjahrama ODC</comment>
- <comment xml:lang="bg">Диаграма — ODC</comment>
- <comment xml:lang="ca">diagrama ODC</comment>
- <comment xml:lang="cs">graf ODC</comment>
- <comment xml:lang="da">ODC-diagram</comment>
- <comment xml:lang="de">ODC-Diagramm</comment>
- <comment xml:lang="el">Διάγραμμα ODC</comment>
- <comment xml:lang="en-GB">ODC chart</comment>
- <comment xml:lang="eo">ODC-diagramo</comment>
- <comment xml:lang="es">gráfico ODC</comment>
- <comment xml:lang="eu">ODC diagrama</comment>
- <comment xml:lang="fi">ODC-kaavio</comment>
- <comment xml:lang="fo">ODC strikumynd</comment>
- <comment xml:lang="fr">graphique ODC</comment>
- <comment xml:lang="fur">grafic ODC</comment>
- <comment xml:lang="ga">cairt ODC</comment>
- <comment xml:lang="gl">gráfica ODC</comment>
- <comment xml:lang="he">תו ODC</comment>
- <comment xml:lang="hr">ODC grafikon</comment>
- <comment xml:lang="hu">ODC-táblázat</comment>
- <comment xml:lang="ia">Graphico ODC</comment>
- <comment xml:lang="id">Bagan ODC</comment>
- <comment xml:lang="it">Grafico ODC</comment>
- <comment xml:lang="ja">ODC チャート</comment>
- <comment xml:lang="kk">ODC диаграммасы</comment>
- <comment xml:lang="ko">ODC 차트</comment>
- <comment xml:lang="lt">ODC diagrama</comment>
- <comment xml:lang="lv">ODC diagramma</comment>
- <comment xml:lang="nb">ODC-graf</comment>
- <comment xml:lang="nl">ODC-grafiek</comment>
- <comment xml:lang="nn">ODC-diagram</comment>
- <comment xml:lang="oc">grafic ODC</comment>
- <comment xml:lang="pl">Wykres ODC</comment>
- <comment xml:lang="pt">gráfico ODC</comment>
- <comment xml:lang="pt-BR">Gráfico ODC</comment>
- <comment xml:lang="ro">Diagramă ODC</comment>
- <comment xml:lang="ru">Диаграмма ODC</comment>
- <comment xml:lang="sk">Graf ODC</comment>
- <comment xml:lang="sl">Datoteka grafikona ODC</comment>
- <comment xml:lang="sq">Grafik ODC</comment>
- <comment xml:lang="sr">ОДЦ график</comment>
- <comment xml:lang="sv">ODC-diagram</comment>
- <comment xml:lang="tr">ODC çizgesi</comment>
- <comment xml:lang="uk">діаграма ODC</comment>
+ <comment xml:lang="zh_TW">ODC 圖表</comment>
+ <comment xml:lang="zh_CN">ODC 图表</comment>
<comment xml:lang="vi">Sơ đồ ODC</comment>
- <comment xml:lang="zh-CN">ODC 图表</comment>
- <comment xml:lang="zh-TW">ODC 圖表</comment>
+ <comment xml:lang="uk">діаграма ODC</comment>
+ <comment xml:lang="tr">ODC çizgesi</comment>
+ <comment xml:lang="sv">ODC-diagram</comment>
+ <comment xml:lang="sr">ОДЦ график</comment>
+ <comment xml:lang="sq">grafik ODC</comment>
+ <comment xml:lang="sl">Datoteka grafikona ODC</comment>
+ <comment xml:lang="si">ODC ප්‍රස්ථාරය</comment>
+ <comment xml:lang="sk">Graf ODC</comment>
+ <comment xml:lang="ru">Диаграмма ODC</comment>
+ <comment xml:lang="ro">Diagramă ODC</comment>
+ <comment xml:lang="pt_BR">Gráfico ODC</comment>
+ <comment xml:lang="pt">gráfico ODC</comment>
+ <comment xml:lang="pl">Wykres ODC</comment>
+ <comment xml:lang="oc">grafic ODC</comment>
+ <comment xml:lang="nn">ODC-diagram</comment>
+ <comment xml:lang="nl">ODC-grafiek</comment>
+ <comment xml:lang="nb">ODC-graf</comment>
+ <comment xml:lang="lv">ODC diagramma</comment>
+ <comment xml:lang="lt">ODC diagrama</comment>
+ <comment xml:lang="ko">ODC 차트</comment>
+ <comment xml:lang="kk">ODC диаграммасы</comment>
+ <comment xml:lang="ja">ODC チャート</comment>
+ <comment xml:lang="it">Grafico ODC</comment>
+ <comment xml:lang="is">ODC graf</comment>
+ <comment xml:lang="id">Bagan ODC</comment>
+ <comment xml:lang="ia">Graphico ODC</comment>
+ <comment xml:lang="hu">ODC-táblázat</comment>
+ <comment xml:lang="hr">ODC grafikon</comment>
+ <comment xml:lang="he">תו ODC</comment>
+ <comment xml:lang="gl">gráfica ODC</comment>
+ <comment xml:lang="ga">cairt ODC</comment>
+ <comment xml:lang="fur">grafic ODC</comment>
+ <comment xml:lang="fr">graphique ODC</comment>
+ <comment xml:lang="fo">ODC strikumynd</comment>
+ <comment xml:lang="fi">ODC-kaavio</comment>
+ <comment xml:lang="eu">ODC diagrama</comment>
+ <comment xml:lang="es">gráfico ODC</comment>
+ <comment xml:lang="eo">ODC-diagramo</comment>
+ <comment xml:lang="en_GB">ODC chart</comment>
+ <comment xml:lang="el">Διάγραμμα ODC</comment>
+ <comment xml:lang="de">ODC-Diagramm</comment>
+ <comment xml:lang="da">ODC-diagram</comment>
+ <comment xml:lang="cs">graf ODC</comment>
+ <comment xml:lang="ca">diagrama ODC</comment>
+ <comment xml:lang="bg">Диаграма — ODC</comment>
+ <comment xml:lang="be@latin">Dyjahrama ODC</comment>
+ <comment xml:lang="be">дыяграма ODC</comment>
+ <comment xml:lang="ar">مخطط ODC</comment>
+ <comment xml:lang="af">ODC-grafiek</comment>
<acronym>ODC</acronym>
<expanded-acronym>OpenDocument Chart</expanded-acronym>
<sub-class-of type="application/zip"/>
@@ -6361,52 +6588,56 @@ command to generate the output files.
</mime-type>
<mime-type type="application/vnd.oasis.opendocument.chart-template">
<comment>ODC template</comment>
- <comment xml:lang="af">ODC-sjabloon</comment>
- <comment xml:lang="ar">قالب ODC</comment>
- <comment xml:lang="bg">Шаблон за диаграми — ODC</comment>
- <comment xml:lang="ca">plantilla ODC</comment>
- <comment xml:lang="cs">šablona ODC</comment>
- <comment xml:lang="da">ODC-skabelon</comment>
- <comment xml:lang="de">ODC-Vorlage</comment>
- <comment xml:lang="el">Πρότυπο ODC</comment>
- <comment xml:lang="en-GB">ODC template</comment>
- <comment xml:lang="eo">ODC-ŝablono</comment>
- <comment xml:lang="es">plantilla ODC</comment>
- <comment xml:lang="eu">ODC txantiloia</comment>
- <comment xml:lang="fi">ODC-malli</comment>
- <comment xml:lang="fo">ODC formur</comment>
- <comment xml:lang="fr">modèle ODC</comment>
- <comment xml:lang="fur">model ODC</comment>
- <comment xml:lang="ga">teimpléad ODC</comment>
- <comment xml:lang="gl">modelo ODC</comment>
- <comment xml:lang="he">תבנית ODC</comment>
- <comment xml:lang="hr">ODC predložak</comment>
- <comment xml:lang="hu">ODC-sablon</comment>
- <comment xml:lang="ia">Patrono ODC</comment>
- <comment xml:lang="id">Templat ODC</comment>
- <comment xml:lang="it">Modello ODC</comment>
- <comment xml:lang="ja">ODC テンプレート</comment>
- <comment xml:lang="ka">ODC შაბლონი</comment>
- <comment xml:lang="kk">ODC үлгісі</comment>
- <comment xml:lang="ko">ODC 문서 서식</comment>
- <comment xml:lang="lt">ODC šablonas</comment>
- <comment xml:lang="lv">ODC veidne</comment>
- <comment xml:lang="nl">ODC-sjabloon</comment>
- <comment xml:lang="oc">modèl ODC</comment>
- <comment xml:lang="pl">Szablon ODC</comment>
- <comment xml:lang="pt">modelo ODC</comment>
- <comment xml:lang="pt-BR">Modelo ODC</comment>
- <comment xml:lang="ro">Șablon ODC</comment>
- <comment xml:lang="ru">Шаблон ODC</comment>
- <comment xml:lang="sk">Šablóna ODC</comment>
- <comment xml:lang="sl">Predloga ODC</comment>
- <comment xml:lang="sr">ОДЦ шаблон</comment>
- <comment xml:lang="sv">ODC-mall</comment>
- <comment xml:lang="tr">ODC şablonu</comment>
- <comment xml:lang="uk">шаблон ODC</comment>
+ <comment xml:lang="zh_TW">ODC 範本</comment>
+ <comment xml:lang="zh_CN">ODC 模板</comment>
<comment xml:lang="vi">Mẫu ODC</comment>
- <comment xml:lang="zh-CN">ODC 模板</comment>
- <comment xml:lang="zh-TW">ODC 範本</comment>
+ <comment xml:lang="uk">шаблон ODC</comment>
+ <comment xml:lang="tr">ODC şablonu</comment>
+ <comment xml:lang="sv">ODC-mall</comment>
+ <comment xml:lang="sr">ОДЦ шаблон</comment>
+ <comment xml:lang="sq">gjedhe ODC</comment>
+ <comment xml:lang="sl">Predloga ODC</comment>
+ <comment xml:lang="si">ODC අච්චුව</comment>
+ <comment xml:lang="sk">Šablóna ODC</comment>
+ <comment xml:lang="ru">Шаблон ODC</comment>
+ <comment xml:lang="ro">Șablon ODC</comment>
+ <comment xml:lang="pt_BR">Modelo ODC</comment>
+ <comment xml:lang="pt">modelo ODC</comment>
+ <comment xml:lang="pl">Szablon ODC</comment>
+ <comment xml:lang="oc">modèl ODC</comment>
+ <comment xml:lang="nl">ODC-sjabloon</comment>
+ <comment xml:lang="lv">ODC veidne</comment>
+ <comment xml:lang="lt">ODC šablonas</comment>
+ <comment xml:lang="ko">ODC 문서 서식</comment>
+ <comment xml:lang="kk">ODC үлгісі</comment>
+ <comment xml:lang="ka">ODC შაბლონი</comment>
+ <comment xml:lang="ja">ODC テンプレート</comment>
+ <comment xml:lang="it">Modello ODC</comment>
+ <comment xml:lang="is">ODC sniðmát</comment>
+ <comment xml:lang="id">Templat ODC</comment>
+ <comment xml:lang="ia">Patrono ODC</comment>
+ <comment xml:lang="hu">ODC-sablon</comment>
+ <comment xml:lang="hr">ODC predložak</comment>
+ <comment xml:lang="he">תבנית ODC</comment>
+ <comment xml:lang="gl">modelo ODC</comment>
+ <comment xml:lang="ga">teimpléad ODC</comment>
+ <comment xml:lang="fur">model ODC</comment>
+ <comment xml:lang="fr">modèle ODC</comment>
+ <comment xml:lang="fo">ODC formur</comment>
+ <comment xml:lang="fi">ODC-malli</comment>
+ <comment xml:lang="eu">ODC txantiloia</comment>
+ <comment xml:lang="es">plantilla ODC</comment>
+ <comment xml:lang="eo">ODC-ŝablono</comment>
+ <comment xml:lang="en_GB">ODC template</comment>
+ <comment xml:lang="el">Πρότυπο ODC</comment>
+ <comment xml:lang="de">ODC-Vorlage</comment>
+ <comment xml:lang="da">ODC-skabelon</comment>
+ <comment xml:lang="cs">šablona ODC</comment>
+ <comment xml:lang="ca">plantilla ODC</comment>
+ <comment xml:lang="bg">Шаблон за диаграми — ODC</comment>
+ <comment xml:lang="be">шаблон ODC</comment>
+ <comment xml:lang="ar">قالب ODC</comment>
+ <comment xml:lang="af">ODC-sjabloon</comment>
<acronym>ODC</acronym>
<expanded-acronym>OpenDocument Chart</expanded-acronym>
<sub-class-of type="application/zip"/>
@@ -6422,56 +6653,59 @@ command to generate the output files.
</mime-type>
<mime-type type="application/vnd.oasis.opendocument.formula">
<comment>ODF formula</comment>
- <comment xml:lang="af">ODF-formule</comment>
- <comment xml:lang="ar">صيغة ODF</comment>
- <comment xml:lang="be-Latn">Formuła ODF</comment>
- <comment xml:lang="bg">Формула — ODF</comment>
- <comment xml:lang="ca">fórmula ODF</comment>
- <comment xml:lang="cs">vzorec ODF</comment>
- <comment xml:lang="da">ODF-formel</comment>
- <comment xml:lang="de">ODF-Formel</comment>
- <comment xml:lang="el">Μαθηματικός τύπος ODF</comment>
- <comment xml:lang="en-GB">ODF formula</comment>
- <comment xml:lang="eo">ODF-formulo</comment>
- <comment xml:lang="es">fórmula ODF</comment>
- <comment xml:lang="eu">ODF formula</comment>
- <comment xml:lang="fi">ODF-kaava</comment>
- <comment xml:lang="fo">ODF frymil</comment>
- <comment xml:lang="fr">formule ODF</comment>
- <comment xml:lang="fur">formule ODF</comment>
- <comment xml:lang="ga">foirmle ODF</comment>
- <comment xml:lang="gl">Fórula ODF</comment>
- <comment xml:lang="he">נוסחת ODF</comment>
- <comment xml:lang="hr">ODF formula</comment>
- <comment xml:lang="hu">ODF-képlet</comment>
- <comment xml:lang="ia">Formula ODF</comment>
- <comment xml:lang="id">Formula ODF</comment>
- <comment xml:lang="it">Formula ODF</comment>
- <comment xml:lang="ja">ODF 計算式</comment>
- <comment xml:lang="ka">ODF-ის ფორმულა</comment>
- <comment xml:lang="kk">ODF формуласы</comment>
- <comment xml:lang="ko">ODF 수식</comment>
- <comment xml:lang="lt">ODF formulė</comment>
- <comment xml:lang="lv">ODF formula</comment>
- <comment xml:lang="nb">ODF-formel</comment>
- <comment xml:lang="nl">ODF-formule</comment>
- <comment xml:lang="nn">ODF-formel</comment>
- <comment xml:lang="oc">formula ODF</comment>
- <comment xml:lang="pl">Formuła ODF</comment>
- <comment xml:lang="pt">fórmula ODF</comment>
- <comment xml:lang="pt-BR">Fórmula ODF</comment>
- <comment xml:lang="ro">Formulă ODF</comment>
- <comment xml:lang="ru">Формула ODF</comment>
- <comment xml:lang="sk">Vzorec ODF</comment>
- <comment xml:lang="sl">Dokument formule ODF</comment>
- <comment xml:lang="sq">Formulë ODF</comment>
- <comment xml:lang="sr">ОДФ формула</comment>
- <comment xml:lang="sv">ODF-formel</comment>
- <comment xml:lang="tr">ODF formülü</comment>
- <comment xml:lang="uk">формула ODF</comment>
+ <comment xml:lang="zh_TW">ODF 公式</comment>
+ <comment xml:lang="zh_CN">ODF 公式</comment>
<comment xml:lang="vi">Công thức ODF</comment>
- <comment xml:lang="zh-CN">ODF 公式</comment>
- <comment xml:lang="zh-TW">ODF 公式</comment>
+ <comment xml:lang="uk">формула ODF</comment>
+ <comment xml:lang="tr">ODF formülü</comment>
+ <comment xml:lang="sv">ODF-formel</comment>
+ <comment xml:lang="sr">ОДФ формула</comment>
+ <comment xml:lang="sq">formulë ODF</comment>
+ <comment xml:lang="sl">Dokument formule ODF</comment>
+ <comment xml:lang="si">ODF සූත්‍රය</comment>
+ <comment xml:lang="sk">Vzorec ODF</comment>
+ <comment xml:lang="ru">Формула ODF</comment>
+ <comment xml:lang="ro">Formulă ODF</comment>
+ <comment xml:lang="pt_BR">Fórmula ODF</comment>
+ <comment xml:lang="pt">fórmula ODF</comment>
+ <comment xml:lang="pl">Formuła ODF</comment>
+ <comment xml:lang="oc">formula ODF</comment>
+ <comment xml:lang="nn">ODF-formel</comment>
+ <comment xml:lang="nl">ODF-formule</comment>
+ <comment xml:lang="nb">ODF-formel</comment>
+ <comment xml:lang="lv">ODF formula</comment>
+ <comment xml:lang="lt">ODF formulė</comment>
+ <comment xml:lang="ko">ODF 수식</comment>
+ <comment xml:lang="kk">ODF формуласы</comment>
+ <comment xml:lang="ka">ODF-ის ფორმულა</comment>
+ <comment xml:lang="ja">ODF 計算式</comment>
+ <comment xml:lang="it">Formula ODF</comment>
+ <comment xml:lang="is">ODF formúla</comment>
+ <comment xml:lang="id">Formula ODF</comment>
+ <comment xml:lang="ia">Formula ODF</comment>
+ <comment xml:lang="hu">ODF-képlet</comment>
+ <comment xml:lang="hr">ODF formula</comment>
+ <comment xml:lang="he">נוסחת ODF</comment>
+ <comment xml:lang="gl">Fórula ODF</comment>
+ <comment xml:lang="ga">foirmle ODF</comment>
+ <comment xml:lang="fur">formule ODF</comment>
+ <comment xml:lang="fr">formule ODF</comment>
+ <comment xml:lang="fo">ODF frymil</comment>
+ <comment xml:lang="fi">ODF-kaava</comment>
+ <comment xml:lang="eu">ODF formula</comment>
+ <comment xml:lang="es">fórmula ODF</comment>
+ <comment xml:lang="eo">ODF-formulo</comment>
+ <comment xml:lang="en_GB">ODF formula</comment>
+ <comment xml:lang="el">Μαθηματικός τύπος ODF</comment>
+ <comment xml:lang="de">ODF-Formel</comment>
+ <comment xml:lang="da">ODF-formel</comment>
+ <comment xml:lang="cs">vzorec ODF</comment>
+ <comment xml:lang="ca">fórmula ODF</comment>
+ <comment xml:lang="bg">Формула — ODF</comment>
+ <comment xml:lang="be@latin">Formuła ODF</comment>
+ <comment xml:lang="be">формула ODF</comment>
+ <comment xml:lang="ar">صيغة ODF</comment>
+ <comment xml:lang="af">ODF-formule</comment>
<acronym>ODF</acronym>
<expanded-acronym>OpenDocument Formula</expanded-acronym>
<sub-class-of type="application/zip"/>
@@ -6487,52 +6721,56 @@ command to generate the output files.
</mime-type>
<mime-type type="application/vnd.oasis.opendocument.formula-template">
<comment>ODF template</comment>
- <comment xml:lang="af">ODF-sjabloon</comment>
- <comment xml:lang="ar">قالب ODF</comment>
- <comment xml:lang="bg">Шаблон за формули — ODF</comment>
- <comment xml:lang="ca">plantilla ODF</comment>
- <comment xml:lang="cs">šablona ODF</comment>
- <comment xml:lang="da">ODF-skabelon</comment>
- <comment xml:lang="de">ODF-Vorlage</comment>
- <comment xml:lang="el">Πρότυπο ODF</comment>
- <comment xml:lang="en-GB">ODF template</comment>
- <comment xml:lang="eo">ODF-ŝablono</comment>
- <comment xml:lang="es">plantilla ODF</comment>
- <comment xml:lang="eu">ODF txantiloia</comment>
- <comment xml:lang="fi">ODF-malli</comment>
- <comment xml:lang="fo">ODF formur</comment>
- <comment xml:lang="fr">modèle ODF</comment>
- <comment xml:lang="fur">model ODF</comment>
- <comment xml:lang="ga">teimpléad ODF</comment>
- <comment xml:lang="gl">modelo ODF</comment>
- <comment xml:lang="he">תבנית ODF</comment>
- <comment xml:lang="hr">ODF predložak</comment>
- <comment xml:lang="hu">ODG-sablon</comment>
- <comment xml:lang="ia">Patrono ODF</comment>
- <comment xml:lang="id">Templat ODF</comment>
- <comment xml:lang="it">Modello ODF</comment>
- <comment xml:lang="ja">ODF テンプレート</comment>
- <comment xml:lang="ka">ODF-ის შაბლონი</comment>
- <comment xml:lang="kk">ODF үлгісі</comment>
- <comment xml:lang="ko">ODF 문서 서식</comment>
- <comment xml:lang="lt">ODF šablonas</comment>
- <comment xml:lang="lv">ODF veidne</comment>
- <comment xml:lang="nl">ODF-sjabloon</comment>
- <comment xml:lang="oc">modèl ODF</comment>
- <comment xml:lang="pl">Szablon ODF</comment>
- <comment xml:lang="pt">modelo ODF</comment>
- <comment xml:lang="pt-BR">Modelo ODF</comment>
- <comment xml:lang="ro">Șablon ODF</comment>
- <comment xml:lang="ru">Шаблон ODF</comment>
- <comment xml:lang="sk">Šablóna ODF</comment>
- <comment xml:lang="sl">Predloga dokumenta ODF</comment>
- <comment xml:lang="sr">ОДФ шаблон</comment>
- <comment xml:lang="sv">ODF-mall</comment>
- <comment xml:lang="tr">ODF şablonu</comment>
- <comment xml:lang="uk">шаблон ODF</comment>
+ <comment xml:lang="zh_TW">ODF 範本</comment>
+ <comment xml:lang="zh_CN">ODF 模板</comment>
<comment xml:lang="vi">Mẫu ODF</comment>
- <comment xml:lang="zh-CN">ODF 模板</comment>
- <comment xml:lang="zh-TW">ODF 範本</comment>
+ <comment xml:lang="uk">шаблон ODF</comment>
+ <comment xml:lang="tr">ODF şablonu</comment>
+ <comment xml:lang="sv">ODF-mall</comment>
+ <comment xml:lang="sr">ОДФ шаблон</comment>
+ <comment xml:lang="sq">gjedhe ODF</comment>
+ <comment xml:lang="sl">Predloga dokumenta ODF</comment>
+ <comment xml:lang="si">ODF ආකෘතිය</comment>
+ <comment xml:lang="sk">Šablóna ODF</comment>
+ <comment xml:lang="ru">Шаблон ODF</comment>
+ <comment xml:lang="ro">Șablon ODF</comment>
+ <comment xml:lang="pt_BR">Modelo ODF</comment>
+ <comment xml:lang="pt">modelo ODF</comment>
+ <comment xml:lang="pl">Szablon ODF</comment>
+ <comment xml:lang="oc">modèl ODF</comment>
+ <comment xml:lang="nl">ODF-sjabloon</comment>
+ <comment xml:lang="lv">ODF veidne</comment>
+ <comment xml:lang="lt">ODF šablonas</comment>
+ <comment xml:lang="ko">ODF 문서 서식</comment>
+ <comment xml:lang="kk">ODF үлгісі</comment>
+ <comment xml:lang="ka">ODF-ის შაბლონი</comment>
+ <comment xml:lang="ja">ODF テンプレート</comment>
+ <comment xml:lang="it">Modello ODF</comment>
+ <comment xml:lang="is">ODF sniðmát</comment>
+ <comment xml:lang="id">Templat ODF</comment>
+ <comment xml:lang="ia">Patrono ODF</comment>
+ <comment xml:lang="hu">ODG-sablon</comment>
+ <comment xml:lang="hr">ODF predložak</comment>
+ <comment xml:lang="he">תבנית ODF</comment>
+ <comment xml:lang="gl">modelo ODF</comment>
+ <comment xml:lang="ga">teimpléad ODF</comment>
+ <comment xml:lang="fur">model ODF</comment>
+ <comment xml:lang="fr">modèle ODF</comment>
+ <comment xml:lang="fo">ODF formur</comment>
+ <comment xml:lang="fi">ODF-malli</comment>
+ <comment xml:lang="eu">ODF txantiloia</comment>
+ <comment xml:lang="es">plantilla ODF</comment>
+ <comment xml:lang="eo">ODF-ŝablono</comment>
+ <comment xml:lang="en_GB">ODF template</comment>
+ <comment xml:lang="el">Πρότυπο ODF</comment>
+ <comment xml:lang="de">ODF-Vorlage</comment>
+ <comment xml:lang="da">ODF-skabelon</comment>
+ <comment xml:lang="cs">šablona ODF</comment>
+ <comment xml:lang="ca">plantilla ODF</comment>
+ <comment xml:lang="bg">Шаблон за формули — ODF</comment>
+ <comment xml:lang="be">шаблон ODF</comment>
+ <comment xml:lang="ar">قالب ODF</comment>
+ <comment xml:lang="af">ODF-sjabloon</comment>
<acronym>ODF</acronym>
<expanded-acronym>OpenDocument Formula</expanded-acronym>
<sub-class-of type="application/zip"/>
@@ -6548,56 +6786,59 @@ command to generate the output files.
</mime-type>
<mime-type type="application/vnd.oasis.opendocument.database">
<comment>ODB database</comment>
- <comment xml:lang="af">ODB-databasis</comment>
- <comment xml:lang="ar">قاعدة بيانات ODB</comment>
- <comment xml:lang="be-Latn">Baza źviestak ODB</comment>
- <comment xml:lang="bg">База от данни — ODB</comment>
- <comment xml:lang="ca">base de dades ODB</comment>
- <comment xml:lang="cs">databáze ODB</comment>
- <comment xml:lang="da">ODB-database</comment>
- <comment xml:lang="de">ODB-Datenbank</comment>
- <comment xml:lang="el">Βάση δεδομένων ODB</comment>
- <comment xml:lang="en-GB">ODB database</comment>
- <comment xml:lang="eo">ODB-datumbazo</comment>
- <comment xml:lang="es">base de datos ODB</comment>
- <comment xml:lang="eu">ODB datu-basea</comment>
- <comment xml:lang="fi">ODB-tietokanta</comment>
- <comment xml:lang="fo">ODB dátustovnur</comment>
- <comment xml:lang="fr">base de données ODB</comment>
- <comment xml:lang="fur">base di dâts ODB</comment>
- <comment xml:lang="ga">bunachar sonraí ODB</comment>
- <comment xml:lang="gl">base de datos ODB</comment>
- <comment xml:lang="he">מסד נתונים ODB</comment>
- <comment xml:lang="hr">ODB baza podataka</comment>
- <comment xml:lang="hu">ODB-adatbázis</comment>
- <comment xml:lang="ia">Base de datos ODB</comment>
- <comment xml:lang="id">Basis data ODB</comment>
- <comment xml:lang="it">Database ODB</comment>
- <comment xml:lang="ja">ODB データベース</comment>
- <comment xml:lang="ka">ODB-ის მონაცემთა ბაზა</comment>
- <comment xml:lang="kk">ODB дерекқоры</comment>
- <comment xml:lang="ko">ODB 데이터베이스</comment>
- <comment xml:lang="lt">ODB duomenų bazė</comment>
- <comment xml:lang="lv">ODB datubāze</comment>
- <comment xml:lang="nb">ODB-database</comment>
- <comment xml:lang="nl">ODB-gegevensbank</comment>
- <comment xml:lang="nn">ODB-database</comment>
- <comment xml:lang="oc">banca de donadas ODB</comment>
- <comment xml:lang="pl">Baza danych ODB</comment>
- <comment xml:lang="pt">base de dados ODB</comment>
- <comment xml:lang="pt-BR">Banco de dados ODB</comment>
- <comment xml:lang="ro">Bază de date ODB</comment>
- <comment xml:lang="ru">База данных ODB</comment>
- <comment xml:lang="sk">Databáza ODB</comment>
- <comment xml:lang="sl">Podatkovna zbirka ODB</comment>
- <comment xml:lang="sq">Bazë me të dhëna ODB</comment>
- <comment xml:lang="sr">ОДБ база података</comment>
- <comment xml:lang="sv">ODB-databas</comment>
- <comment xml:lang="tr">ODB veri tabanı</comment>
- <comment xml:lang="uk">база даних ODB</comment>
+ <comment xml:lang="zh_TW">ODB 資料庫</comment>
+ <comment xml:lang="zh_CN">ODB 数据库</comment>
<comment xml:lang="vi">Cơ sở dữ liệu ODB</comment>
- <comment xml:lang="zh-CN">ODB 数据库</comment>
- <comment xml:lang="zh-TW">ODB 資料庫</comment>
+ <comment xml:lang="uk">база даних ODB</comment>
+ <comment xml:lang="tr">ODB veri tabanı</comment>
+ <comment xml:lang="sv">ODB-databas</comment>
+ <comment xml:lang="sr">ОДБ база података</comment>
+ <comment xml:lang="sq">bazë të dhënash ODB</comment>
+ <comment xml:lang="sl">Podatkovna zbirka ODB</comment>
+ <comment xml:lang="si">ODB දත්ත සමුදාය</comment>
+ <comment xml:lang="sk">Databáza ODB</comment>
+ <comment xml:lang="ru">База данных ODB</comment>
+ <comment xml:lang="ro">Bază de date ODB</comment>
+ <comment xml:lang="pt_BR">Banco de dados ODB</comment>
+ <comment xml:lang="pt">base de dados ODB</comment>
+ <comment xml:lang="pl">Baza danych ODB</comment>
+ <comment xml:lang="oc">banca de donadas ODB</comment>
+ <comment xml:lang="nn">ODB-database</comment>
+ <comment xml:lang="nl">ODB-gegevensbank</comment>
+ <comment xml:lang="nb">ODB-database</comment>
+ <comment xml:lang="lv">ODB datubāze</comment>
+ <comment xml:lang="lt">ODB duomenų bazė</comment>
+ <comment xml:lang="ko">ODB 데이터베이스</comment>
+ <comment xml:lang="kk">ODB дерекқоры</comment>
+ <comment xml:lang="ka">ODB-ის მონაცემთა ბაზა</comment>
+ <comment xml:lang="ja">ODB データベース</comment>
+ <comment xml:lang="it">Database ODB</comment>
+ <comment xml:lang="is">ODB gagnagrunnur</comment>
+ <comment xml:lang="id">Basis data ODB</comment>
+ <comment xml:lang="ia">Base de datos ODB</comment>
+ <comment xml:lang="hu">ODB-adatbázis</comment>
+ <comment xml:lang="hr">ODB baza podataka</comment>
+ <comment xml:lang="he">מסד נתונים ODB</comment>
+ <comment xml:lang="gl">base de datos ODB</comment>
+ <comment xml:lang="ga">bunachar sonraí ODB</comment>
+ <comment xml:lang="fur">base di dâts ODB</comment>
+ <comment xml:lang="fr">base de données ODB</comment>
+ <comment xml:lang="fo">ODB dátustovnur</comment>
+ <comment xml:lang="fi">ODB-tietokanta</comment>
+ <comment xml:lang="eu">ODB datu-basea</comment>
+ <comment xml:lang="es">base de datos ODB</comment>
+ <comment xml:lang="eo">ODB-datumbazo</comment>
+ <comment xml:lang="en_GB">ODB database</comment>
+ <comment xml:lang="el">Βάση δεδομένων ODB</comment>
+ <comment xml:lang="de">ODB-Datenbank</comment>
+ <comment xml:lang="da">ODB-database</comment>
+ <comment xml:lang="cs">databáze ODB</comment>
+ <comment xml:lang="ca">base de dades ODB</comment>
+ <comment xml:lang="bg">База от данни — ODB</comment>
+ <comment xml:lang="be@latin">Baza źviestak ODB</comment>
+ <comment xml:lang="be">база даных ODB</comment>
+ <comment xml:lang="ar">قاعدة بيانات ODB</comment>
+ <comment xml:lang="af">ODB-databasis</comment>
<acronym>ODB</acronym>
<expanded-acronym>OpenDocument Database</expanded-acronym>
<sub-class-of type="application/zip"/>
@@ -6614,57 +6855,60 @@ command to generate the output files.
</mime-type>
<mime-type type="application/vnd.oasis.opendocument.image">
<comment>ODI image</comment>
- <comment xml:lang="af">ODI-beeld</comment>
- <comment xml:lang="ar">صورة ODI</comment>
- <comment xml:lang="ast">Imaxe ODI</comment>
- <comment xml:lang="be-Latn">Vyjava ODI</comment>
- <comment xml:lang="bg">Изображение — ODI</comment>
- <comment xml:lang="ca">imatge ODI</comment>
- <comment xml:lang="cs">obrázek ODI</comment>
- <comment xml:lang="da">ODI-billede</comment>
- <comment xml:lang="de">ODI-Bild</comment>
- <comment xml:lang="el">Εικόνα ODI</comment>
- <comment xml:lang="en-GB">ODI image</comment>
- <comment xml:lang="eo">ODI-bildo</comment>
- <comment xml:lang="es">imagen ODI</comment>
- <comment xml:lang="eu">ODI irudia</comment>
- <comment xml:lang="fi">ODI-kuva</comment>
- <comment xml:lang="fo">ODI mynd</comment>
- <comment xml:lang="fr">image ODI</comment>
- <comment xml:lang="fur">imagjin ODI</comment>
- <comment xml:lang="ga">íomhá ODI</comment>
- <comment xml:lang="gl">imaxe ODI</comment>
- <comment xml:lang="he">תמונת ODI</comment>
- <comment xml:lang="hr">ODI slika</comment>
- <comment xml:lang="hu">ODI-kép</comment>
- <comment xml:lang="ia">Imagine ODI</comment>
- <comment xml:lang="id">Citra ODI</comment>
- <comment xml:lang="it">Immagine ODI</comment>
- <comment xml:lang="ja">ODI 画像</comment>
- <comment xml:lang="ka">ODI გამოსახულება</comment>
- <comment xml:lang="kk">ODI суреті</comment>
- <comment xml:lang="ko">ODI 그림</comment>
- <comment xml:lang="lt">ODI paveikslėlis</comment>
- <comment xml:lang="lv">ODI attēls</comment>
- <comment xml:lang="nb">ODI-bilde</comment>
- <comment xml:lang="nl">ODI-afbeelding</comment>
- <comment xml:lang="nn">ODI-bilete</comment>
- <comment xml:lang="oc">imatge ODI</comment>
- <comment xml:lang="pl">Obraz ODI</comment>
- <comment xml:lang="pt">imagem ODI</comment>
- <comment xml:lang="pt-BR">Imagem ODI</comment>
- <comment xml:lang="ro">Imagine ODI</comment>
- <comment xml:lang="ru">Изображение ODI</comment>
- <comment xml:lang="sk">Obrázok ODI</comment>
- <comment xml:lang="sl">Slikovna datoteka ODI</comment>
- <comment xml:lang="sq">Figurë ODI</comment>
- <comment xml:lang="sr">ОДИ слика</comment>
- <comment xml:lang="sv">ODI-bild</comment>
- <comment xml:lang="tr">ODI görüntüsü</comment>
- <comment xml:lang="uk">зображення ODI</comment>
+ <comment xml:lang="zh_TW">ODI 影像</comment>
+ <comment xml:lang="zh_CN">ODI 图像</comment>
<comment xml:lang="vi">Ảnh ODI</comment>
- <comment xml:lang="zh-CN">ODI 图像</comment>
- <comment xml:lang="zh-TW">ODI 影像</comment>
+ <comment xml:lang="uk">зображення ODI</comment>
+ <comment xml:lang="tr">ODI görüntüsü</comment>
+ <comment xml:lang="sv">ODI-bild</comment>
+ <comment xml:lang="sr">ОДИ слика</comment>
+ <comment xml:lang="sq">figurë ODI</comment>
+ <comment xml:lang="sl">Slikovna datoteka ODI</comment>
+ <comment xml:lang="si">ODI රූපය</comment>
+ <comment xml:lang="sk">Obrázok ODI</comment>
+ <comment xml:lang="ru">Изображение ODI</comment>
+ <comment xml:lang="ro">Imagine ODI</comment>
+ <comment xml:lang="pt_BR">Imagem ODI</comment>
+ <comment xml:lang="pt">imagem ODI</comment>
+ <comment xml:lang="pl">Obraz ODI</comment>
+ <comment xml:lang="oc">imatge ODI</comment>
+ <comment xml:lang="nn">ODI-bilete</comment>
+ <comment xml:lang="nl">ODI-afbeelding</comment>
+ <comment xml:lang="nb">ODI-bilde</comment>
+ <comment xml:lang="lv">ODI attēls</comment>
+ <comment xml:lang="lt">ODI paveikslėlis</comment>
+ <comment xml:lang="ko">ODI 그림</comment>
+ <comment xml:lang="kk">ODI суреті</comment>
+ <comment xml:lang="ka">ODI გამოსახულება</comment>
+ <comment xml:lang="ja">ODI 画像</comment>
+ <comment xml:lang="it">Immagine ODI</comment>
+ <comment xml:lang="is">ODI mynd</comment>
+ <comment xml:lang="id">Citra ODI</comment>
+ <comment xml:lang="ia">Imagine ODI</comment>
+ <comment xml:lang="hu">ODI-kép</comment>
+ <comment xml:lang="hr">ODI slika</comment>
+ <comment xml:lang="he">תמונת ODI</comment>
+ <comment xml:lang="gl">imaxe ODI</comment>
+ <comment xml:lang="ga">íomhá ODI</comment>
+ <comment xml:lang="fur">imagjin ODI</comment>
+ <comment xml:lang="fr">image ODI</comment>
+ <comment xml:lang="fo">ODI mynd</comment>
+ <comment xml:lang="fi">ODI-kuva</comment>
+ <comment xml:lang="eu">ODI irudia</comment>
+ <comment xml:lang="es">imagen ODI</comment>
+ <comment xml:lang="eo">ODI-bildo</comment>
+ <comment xml:lang="en_GB">ODI image</comment>
+ <comment xml:lang="el">Εικόνα ODI</comment>
+ <comment xml:lang="de">ODI-Bild</comment>
+ <comment xml:lang="da">ODI-billede</comment>
+ <comment xml:lang="cs">obrázek ODI</comment>
+ <comment xml:lang="ca">imatge ODI</comment>
+ <comment xml:lang="bg">Изображение — ODI</comment>
+ <comment xml:lang="be@latin">Vyjava ODI</comment>
+ <comment xml:lang="be">выява ODI</comment>
+ <comment xml:lang="ast">Imaxe ODI</comment>
+ <comment xml:lang="ar">صورة ODI</comment>
+ <comment xml:lang="af">ODI-beeld</comment>
<acronym>ODI</acronym>
<expanded-acronym>OpenDocument Image</expanded-acronym>
<sub-class-of type="application/zip"/>
@@ -6680,253 +6924,254 @@ command to generate the output files.
</mime-type>
<mime-type type="application/vnd.openofficeorg.extension">
<comment>OpenOffice.org extension</comment>
- <comment xml:lang="af">OpenOffice.org-uitbreiding</comment>
- <comment xml:lang="ar">امتداد OpenOffice.org</comment>
- <comment xml:lang="ast">Estensión d'OpenOffice.org</comment>
- <comment xml:lang="be-Latn">Pašyreńnie OpenOffice.org</comment>
- <comment xml:lang="bg">Приставка — OpenOffice</comment>
- <comment xml:lang="ca">extensió d'OpenOffice.org</comment>
- <comment xml:lang="cs">rozšíření OpenOffice.org</comment>
- <comment xml:lang="da">OpenOffice.org-udvidelse</comment>
- <comment xml:lang="de">OpenOffice.org-Erweiterung</comment>
- <comment xml:lang="el">Επέκταση OpenOffice.org</comment>
- <comment xml:lang="en-GB">OpenOffice.org extension</comment>
- <comment xml:lang="es">extensión de LibreOffice</comment>
- <comment xml:lang="eu">OpenOffice.org luzapena</comment>
- <comment xml:lang="fi">OpenOffice.org-laajennus</comment>
- <comment xml:lang="fo">OpenOffice.org víðkan</comment>
- <comment xml:lang="fr">extension OpenOffice.org</comment>
- <comment xml:lang="fur">estension OpenOffice.org</comment>
- <comment xml:lang="ga">eisínteacht OpenOffice.org</comment>
- <comment xml:lang="gl">Extensión de OpenOffice.org</comment>
- <comment xml:lang="he">הרחבה של OpenOffice.org</comment>
- <comment xml:lang="hr">OpenOffice.org proširenje</comment>
- <comment xml:lang="hu">OpenOffice.org kiterjesztés</comment>
- <comment xml:lang="ia">Extension OpenOffice.org</comment>
- <comment xml:lang="id">Ekstensi OpenOffice.org</comment>
- <comment xml:lang="it">Estensione OpenOffice.org</comment>
- <comment xml:lang="ja">OpenOffice.org 拡張機能</comment>
- <comment xml:lang="ka">OpenOffice.org-ის გაფართოება</comment>
- <comment xml:lang="kk">OpenOffice.org кеңейтуі</comment>
- <comment xml:lang="ko">OpenOffice.org 확장</comment>
- <comment xml:lang="lt">OpenOffice.org plėtinys</comment>
- <comment xml:lang="lv">OpenOffice.org paplašinājums</comment>
- <comment xml:lang="nl">OpenOffice.org-uitbreiding</comment>
- <comment xml:lang="nn">OpenOffice Writer-utviding</comment>
- <comment xml:lang="oc">extension OpenOffice.org</comment>
- <comment xml:lang="pl">Rozszerzenie OpenOffice.org</comment>
- <comment xml:lang="pt">extensão OpenOffice.org</comment>
- <comment xml:lang="pt-BR">Extensão do OpenOffice</comment>
- <comment xml:lang="ro">Extensie OpenOffice.org</comment>
- <comment xml:lang="ru">Расширение OpenOffice.org</comment>
- <comment xml:lang="sk">Rozšírenie OpenOffice.org</comment>
- <comment xml:lang="sl">Razširitev OpenOffice.org</comment>
- <comment xml:lang="sq">Shtojcë për OpenOffice.org</comment>
- <comment xml:lang="sr">проширење ОпенОфис.орг-а</comment>
- <comment xml:lang="sv">OpenOffice.org-tillägg</comment>
- <comment xml:lang="tr">OpenOffice.org eklentisi</comment>
- <comment xml:lang="uk">розширення OpenOffice.org</comment>
+ <comment xml:lang="zh_TW">OpenOffice.org 擴充套件</comment>
+ <comment xml:lang="zh_CN">OpenOffice.org 扩展</comment>
<comment xml:lang="vi">Phần mở rộng của OpenOffice.org</comment>
- <comment xml:lang="zh-CN">OpenOffice.org 扩展</comment>
- <comment xml:lang="zh-TW">OpenOffice.org 擴充套件</comment>
+ <comment xml:lang="uk">розширення OpenOffice.org</comment>
+ <comment xml:lang="tr">OpenOffice.org eklentisi</comment>
+ <comment xml:lang="sv">OpenOffice.org-tillägg</comment>
+ <comment xml:lang="sr">проширење ОпенОфис.орг-а</comment>
+ <comment xml:lang="sq">zgjerim OpenOffice.org</comment>
+ <comment xml:lang="sl">Razširitev OpenOffice.org</comment>
+ <comment xml:lang="si">OpenOffice.org දිගුව</comment>
+ <comment xml:lang="sk">Rozšírenie OpenOffice.org</comment>
+ <comment xml:lang="ru">Расширение OpenOffice.org</comment>
+ <comment xml:lang="ro">Extensie OpenOffice.org</comment>
+ <comment xml:lang="pt_BR">Extensão do OpenOffice</comment>
+ <comment xml:lang="pt">extensão OpenOffice.org</comment>
+ <comment xml:lang="pl">Rozszerzenie OpenOffice.org</comment>
+ <comment xml:lang="oc">extension OpenOffice.org</comment>
+ <comment xml:lang="nn">OpenOffice Writer-utviding</comment>
+ <comment xml:lang="nl">OpenOffice.org-uitbreiding</comment>
+ <comment xml:lang="lv">OpenOffice.org paplašinājums</comment>
+ <comment xml:lang="lt">OpenOffice.org plėtinys</comment>
+ <comment xml:lang="ko">OpenOffice.org 확장</comment>
+ <comment xml:lang="kk">OpenOffice.org кеңейтуі</comment>
+ <comment xml:lang="ka">OpenOffice.org-ის გაფართოება</comment>
+ <comment xml:lang="ja">OpenOffice.org 拡張機能</comment>
+ <comment xml:lang="it">Estensione OpenOffice.org</comment>
+ <comment xml:lang="is">OpenOffice.org viðauki</comment>
+ <comment xml:lang="id">Ekstensi OpenOffice.org</comment>
+ <comment xml:lang="ia">Extension OpenOffice.org</comment>
+ <comment xml:lang="hu">OpenOffice.org kiterjesztés</comment>
+ <comment xml:lang="hr">OpenOffice.org proširenje</comment>
+ <comment xml:lang="he">הרחבה של OpenOffice.org</comment>
+ <comment xml:lang="gl">Extensión de OpenOffice.org</comment>
+ <comment xml:lang="ga">eisínteacht OpenOffice.org</comment>
+ <comment xml:lang="fur">estension OpenOffice.org</comment>
+ <comment xml:lang="fr">extension OpenOffice.org</comment>
+ <comment xml:lang="fo">OpenOffice.org víðkan</comment>
+ <comment xml:lang="fi">OpenOffice.org-laajennus</comment>
+ <comment xml:lang="eu">OpenOffice.org luzapena</comment>
+ <comment xml:lang="es">extensión de LibreOffice</comment>
+ <comment xml:lang="en_GB">OpenOffice.org extension</comment>
+ <comment xml:lang="el">Επέκταση OpenOffice.org</comment>
+ <comment xml:lang="de">OpenOffice.org-Erweiterung</comment>
+ <comment xml:lang="da">OpenOffice.org-udvidelse</comment>
+ <comment xml:lang="cs">rozšíření OpenOffice.org</comment>
+ <comment xml:lang="ca">extensió d'OpenOffice.org</comment>
+ <comment xml:lang="bg">Приставка — OpenOffice</comment>
+ <comment xml:lang="be@latin">Pašyreńnie OpenOffice.org</comment>
+ <comment xml:lang="be">пашырэнне OpenOffice.org</comment>
+ <comment xml:lang="ast">Estensión d'OpenOffice.org</comment>
+ <comment xml:lang="ar">امتداد OpenOffice.org</comment>
+ <comment xml:lang="af">OpenOffice.org-uitbreiding</comment>
<sub-class-of type="application/zip"/>
<generic-icon name="x-office-document"/>
<glob pattern="*.oxt"/>
</mime-type>
<mime-type type="application/vnd.android.package-archive">
<comment>Android package</comment>
- <comment xml:lang="af">Android-pakket</comment>
- <comment xml:lang="ast">Paquete d'Android</comment>
- <comment xml:lang="bg">Пакет — Android</comment>
- <comment xml:lang="ca">paquet d'Android</comment>
- <comment xml:lang="cs">balíčky systému Android</comment>
- <comment xml:lang="da">Android-pakke</comment>
- <comment xml:lang="de">Android-Paket</comment>
- <comment xml:lang="el">Πακέτο Android</comment>
- <comment xml:lang="en-GB">Android package</comment>
- <comment xml:lang="eo">Android-pakaĵo</comment>
- <comment xml:lang="es">paquete de Android</comment>
- <comment xml:lang="eu">Android paketea</comment>
- <comment xml:lang="fi">Android-paketti</comment>
- <comment xml:lang="fr">paquet Android</comment>
- <comment xml:lang="fur">pachet Android</comment>
- <comment xml:lang="ga">pacáiste Android</comment>
- <comment xml:lang="gl">paquete de Android</comment>
- <comment xml:lang="he">חבילת אנדרויד</comment>
- <comment xml:lang="hr">Android paket</comment>
- <comment xml:lang="hu">Android csomag</comment>
- <comment xml:lang="ia">Pacchetto Android</comment>
- <comment xml:lang="id">Paket Android</comment>
- <comment xml:lang="it">Pacchetto Android</comment>
- <comment xml:lang="ja">Android パッケージ</comment>
- <comment xml:lang="ka">Android-ის პაკეტი</comment>
- <comment xml:lang="kk">Android дестесі</comment>
- <comment xml:lang="ko">Android 패키지</comment>
- <comment xml:lang="lt">Android paketas</comment>
- <comment xml:lang="lv">Android pakotne</comment>
- <comment xml:lang="nl">Android pakket</comment>
- <comment xml:lang="oc">paquet Android</comment>
- <comment xml:lang="pl">Pakiet Androida</comment>
- <comment xml:lang="pt">pacote Android</comment>
- <comment xml:lang="pt-BR">Pacote do Android</comment>
- <comment xml:lang="ru">Пакет Android</comment>
- <comment xml:lang="sk">Balík Android</comment>
- <comment xml:lang="sl">Paket Android</comment>
- <comment xml:lang="sr">Андроидов пакет</comment>
- <comment xml:lang="sv">Android-paket</comment>
- <comment xml:lang="tr">Android paketi</comment>
+ <comment xml:lang="zh_TW">Android 軟體包</comment>
+ <comment xml:lang="zh_CN">Android 应用包</comment>
<comment xml:lang="uk">пакунок Android</comment>
- <comment xml:lang="zh-CN">Android 应用包</comment>
- <comment xml:lang="zh-TW">Android 軟體包</comment>
- <sub-class-of type="application/x-java-archive"/>
+ <comment xml:lang="tr">Android paketi</comment>
+ <comment xml:lang="sv">Android-paket</comment>
+ <comment xml:lang="sr">Андроидов пакет</comment>
+ <comment xml:lang="sq">pakete Android</comment>
+ <comment xml:lang="sl">Paket Android</comment>
+ <comment xml:lang="si">Android පැකේජය</comment>
+ <comment xml:lang="sk">Balík Android</comment>
+ <comment xml:lang="ru">Пакет Android</comment>
+ <comment xml:lang="pt_BR">Pacote do Android</comment>
+ <comment xml:lang="pt">pacote Android</comment>
+ <comment xml:lang="pl">Pakiet Androida</comment>
+ <comment xml:lang="oc">paquet Android</comment>
+ <comment xml:lang="nl">Android-pakket</comment>
+ <comment xml:lang="lv">Android pakotne</comment>
+ <comment xml:lang="lt">Android paketas</comment>
+ <comment xml:lang="ko">Android 패키지</comment>
+ <comment xml:lang="kk">Android дестесі</comment>
+ <comment xml:lang="ka">Android-ის პაკეტი</comment>
+ <comment xml:lang="ja">Android パッケージ</comment>
+ <comment xml:lang="it">Pacchetto Android</comment>
+ <comment xml:lang="is">Android pakki</comment>
+ <comment xml:lang="id">Paket Android</comment>
+ <comment xml:lang="ia">Pacchetto Android</comment>
+ <comment xml:lang="hu">Android csomag</comment>
+ <comment xml:lang="hr">Android paket</comment>
+ <comment xml:lang="he">חבילת Android</comment>
+ <comment xml:lang="gl">paquete de Android</comment>
+ <comment xml:lang="ga">pacáiste Android</comment>
+ <comment xml:lang="fur">pachet Android</comment>
+ <comment xml:lang="fr">paquet Android</comment>
+ <comment xml:lang="fi">Android-paketti</comment>
+ <comment xml:lang="eu">Android paketea</comment>
+ <comment xml:lang="es">paquete de Android</comment>
+ <comment xml:lang="eo">Android-pakaĵo</comment>
+ <comment xml:lang="en_GB">Android package</comment>
+ <comment xml:lang="el">Πακέτο Android</comment>
+ <comment xml:lang="de">Android-Paket</comment>
+ <comment xml:lang="da">Android-pakke</comment>
+ <comment xml:lang="cs">balíčky systému Android</comment>
+ <comment xml:lang="ca">paquet d'Android</comment>
+ <comment xml:lang="bg">Пакет — Android</comment>
+ <comment xml:lang="be">пакет Android</comment>
+ <comment xml:lang="ast">Paquete d'Android</comment>
+ <comment xml:lang="ar">حزمة أندرويد</comment>
+ <comment xml:lang="af">Android-pakket</comment>
+ <sub-class-of type="application/java-archive"/>
<glob pattern="*.apk"/>
</mime-type>
<mime-type type="application/vnd.symbian.install">
<comment>SIS package</comment>
- <comment xml:lang="af">SIS-pakket</comment>
- <comment xml:lang="ar">حزمة SIS</comment>
- <comment xml:lang="ast">Paquete SIS</comment>
- <comment xml:lang="be-Latn">Pakunak SIS</comment>
- <comment xml:lang="bg">Пакет — SIS</comment>
- <comment xml:lang="ca">paquet SIS</comment>
- <comment xml:lang="cs">balíček SIS</comment>
- <comment xml:lang="da">SIS-pakke</comment>
- <comment xml:lang="de">SIS-Paket</comment>
- <comment xml:lang="el">Πακέτο SIS</comment>
- <comment xml:lang="en-GB">SIS package</comment>
- <comment xml:lang="eo">SIS-pakaĵo</comment>
- <comment xml:lang="es">paquete SIS</comment>
- <comment xml:lang="eu">SIS paketea</comment>
- <comment xml:lang="fi">SIS-paketti</comment>
- <comment xml:lang="fo">SIS pakki</comment>
- <comment xml:lang="fr">paquet SIS</comment>
- <comment xml:lang="fur">pachet SIS</comment>
- <comment xml:lang="ga">pacáiste SIS</comment>
- <comment xml:lang="gl">paquete SIS</comment>
- <comment xml:lang="he">חבילת SIS</comment>
- <comment xml:lang="hr">SIS paket</comment>
- <comment xml:lang="hu">SIS csomag</comment>
- <comment xml:lang="ia">Pacchetto SIS</comment>
- <comment xml:lang="id">Paket SIS</comment>
- <comment xml:lang="it">Pacchetto SIS</comment>
- <comment xml:lang="ja">SIS パッケージ</comment>
- <comment xml:lang="kk">SIS дестесі</comment>
- <comment xml:lang="ko">SIS 패키지</comment>
- <comment xml:lang="lt">SIS paketas</comment>
- <comment xml:lang="lv">SIS pakotne</comment>
- <comment xml:lang="nb">SIS-pakke</comment>
- <comment xml:lang="nl">SIS-pakket</comment>
- <comment xml:lang="nn">SIS-pakke</comment>
- <comment xml:lang="oc">paquet SIS</comment>
- <comment xml:lang="pl">Pakiet SIS</comment>
- <comment xml:lang="pt">pacote SIS</comment>
- <comment xml:lang="pt-BR">Pacote SIS</comment>
- <comment xml:lang="ro">Pachet SIS</comment>
- <comment xml:lang="ru">Пакет SIS</comment>
- <comment xml:lang="sk">Balíček SIS</comment>
- <comment xml:lang="sl">Datoteka paketa SIS</comment>
- <comment xml:lang="sq">Paketë SIS</comment>
- <comment xml:lang="sr">СИС пакет</comment>
- <comment xml:lang="sv">SIS-paket</comment>
- <comment xml:lang="tr">SIS paketi</comment>
- <comment xml:lang="uk">пакунок SIS</comment>
+ <comment xml:lang="zh_TW">SIS 軟體包</comment>
+ <comment xml:lang="zh_CN">SIS 软件包</comment>
<comment xml:lang="vi">Gói SIS</comment>
- <comment xml:lang="zh-CN">SIS 软件包</comment>
- <comment xml:lang="zh-TW">SIS 軟體包</comment>
+ <comment xml:lang="uk">пакунок SIS</comment>
+ <comment xml:lang="tr">SIS paketi</comment>
+ <comment xml:lang="sv">SIS-paket</comment>
+ <comment xml:lang="sr">СИС пакет</comment>
+ <comment xml:lang="sq">paketë SIS</comment>
+ <comment xml:lang="sl">Datoteka paketa SIS</comment>
+ <comment xml:lang="si">SIS පැකේජය</comment>
+ <comment xml:lang="sk">Balíček SIS</comment>
+ <comment xml:lang="ru">Пакет SIS</comment>
+ <comment xml:lang="ro">Pachet SIS</comment>
+ <comment xml:lang="pt_BR">Pacote SIS</comment>
+ <comment xml:lang="pt">pacote SIS</comment>
+ <comment xml:lang="pl">Pakiet SIS</comment>
+ <comment xml:lang="oc">paquet SIS</comment>
+ <comment xml:lang="nn">SIS-pakke</comment>
+ <comment xml:lang="nl">SIS-pakket</comment>
+ <comment xml:lang="nb">SIS-pakke</comment>
+ <comment xml:lang="lv">SIS pakotne</comment>
+ <comment xml:lang="lt">SIS paketas</comment>
+ <comment xml:lang="ko">SIS 패키지</comment>
+ <comment xml:lang="kk">SIS дестесі</comment>
+ <comment xml:lang="ja">SIS パッケージ</comment>
+ <comment xml:lang="it">Pacchetto SIS</comment>
+ <comment xml:lang="is">SIS pakki</comment>
+ <comment xml:lang="id">Paket SIS</comment>
+ <comment xml:lang="ia">Pacchetto SIS</comment>
+ <comment xml:lang="hu">SIS csomag</comment>
+ <comment xml:lang="hr">SIS paket</comment>
+ <comment xml:lang="he">חבילת SIS</comment>
+ <comment xml:lang="gl">paquete SIS</comment>
+ <comment xml:lang="ga">pacáiste SIS</comment>
+ <comment xml:lang="fur">pachet SIS</comment>
+ <comment xml:lang="fr">paquet SIS</comment>
+ <comment xml:lang="fo">SIS pakki</comment>
+ <comment xml:lang="fi">SIS-paketti</comment>
+ <comment xml:lang="eu">SIS paketea</comment>
+ <comment xml:lang="es">paquete SIS</comment>
+ <comment xml:lang="eo">SIS-pakaĵo</comment>
+ <comment xml:lang="en_GB">SIS package</comment>
+ <comment xml:lang="el">Πακέτο SIS</comment>
+ <comment xml:lang="de">SIS-Paket</comment>
+ <comment xml:lang="da">SIS-pakke</comment>
+ <comment xml:lang="cs">balíček SIS</comment>
+ <comment xml:lang="ca">paquet SIS</comment>
+ <comment xml:lang="bg">Пакет — SIS</comment>
+ <comment xml:lang="be@latin">Pakunak SIS</comment>
+ <comment xml:lang="be">пакет SIS</comment>
+ <comment xml:lang="ast">Paquete SIS</comment>
+ <comment xml:lang="ar">حزمة SIS</comment>
+ <comment xml:lang="af">SIS-pakket</comment>
<acronym>SIS</acronym>
<expanded-acronym>Symbian Installation File</expanded-acronym>
<generic-icon name="package-x-generic"/>
- <magic priority="50">
+ <magic>
<match type="little32" value="0x10000419" offset="8"/>
</magic>
<glob pattern="*.sis"/>
</mime-type>
<mime-type type="x-epoc/x-sisx-app">
<comment>SISX package</comment>
- <comment xml:lang="af">SISX-pakket</comment>
- <comment xml:lang="ar">حزمة SISX</comment>
- <comment xml:lang="ast">Paquete SISX</comment>
- <comment xml:lang="be-Latn">Pakunak SISX</comment>
- <comment xml:lang="bg">Пакет — SISX</comment>
- <comment xml:lang="ca">paquet SISX</comment>
- <comment xml:lang="cs">balíček SISX</comment>
- <comment xml:lang="da">SISX-pakke</comment>
- <comment xml:lang="de">SISX-Paket</comment>
- <comment xml:lang="el">Πακέτο SISX</comment>
- <comment xml:lang="en-GB">SISX package</comment>
- <comment xml:lang="eo">SISX-pakaĵo</comment>
- <comment xml:lang="es">paquete SISX</comment>
- <comment xml:lang="eu">SISX paketea</comment>
- <comment xml:lang="fi">SISX-paketti</comment>
- <comment xml:lang="fo">SISX pakki</comment>
- <comment xml:lang="fr">paquet SISX</comment>
- <comment xml:lang="fur">pachet SISX</comment>
- <comment xml:lang="ga">pacáiste SISX</comment>
- <comment xml:lang="gl">paquete SISX</comment>
- <comment xml:lang="he">חבילת SISX</comment>
- <comment xml:lang="hr">SISX paket</comment>
- <comment xml:lang="hu">SISX csomag</comment>
- <comment xml:lang="ia">Pacchetto SISX</comment>
- <comment xml:lang="id">Paket SISX</comment>
- <comment xml:lang="it">Pacchetto SISX</comment>
- <comment xml:lang="ja">SISX パッケージ</comment>
- <comment xml:lang="kk">SISX дестесі</comment>
- <comment xml:lang="ko">SISX 패키지</comment>
- <comment xml:lang="lt">SISX paketas</comment>
- <comment xml:lang="lv">SISX pakotne</comment>
- <comment xml:lang="nb">SISX-pakke</comment>
- <comment xml:lang="nl">SISX-pakket</comment>
- <comment xml:lang="nn">SISX-pakke</comment>
- <comment xml:lang="oc">paquet SISX</comment>
- <comment xml:lang="pl">Pakiet SISX</comment>
- <comment xml:lang="pt">pacote SISX</comment>
- <comment xml:lang="pt-BR">Pacote SISX</comment>
- <comment xml:lang="ro">Pachet SISX</comment>
- <comment xml:lang="ru">Пакет SISX</comment>
- <comment xml:lang="sk">Balíček SISX</comment>
- <comment xml:lang="sl">Datoteka paketa SISX</comment>
- <comment xml:lang="sq">Paketë SISX</comment>
- <comment xml:lang="sr">СИСИкс пакет</comment>
- <comment xml:lang="sv">SISX-paket</comment>
- <comment xml:lang="tr">SISX paketi</comment>
- <comment xml:lang="uk">пакунок SISX</comment>
+ <comment xml:lang="zh_TW">SISX 軟體包</comment>
+ <comment xml:lang="zh_CN">SISX 软件包</comment>
<comment xml:lang="vi">Gói SISX</comment>
- <comment xml:lang="zh-CN">SISX 软件包</comment>
- <comment xml:lang="zh-TW">SISX 軟體包</comment>
+ <comment xml:lang="uk">пакунок SISX</comment>
+ <comment xml:lang="tr">SISX paketi</comment>
+ <comment xml:lang="sv">SISX-paket</comment>
+ <comment xml:lang="sr">СИСИкс пакет</comment>
+ <comment xml:lang="sq">paketë SISX</comment>
+ <comment xml:lang="sl">Datoteka paketa SISX</comment>
+ <comment xml:lang="si">SISX පැකේජය</comment>
+ <comment xml:lang="sk">Balíček SISX</comment>
+ <comment xml:lang="ru">Пакет SISX</comment>
+ <comment xml:lang="ro">Pachet SISX</comment>
+ <comment xml:lang="pt_BR">Pacote SISX</comment>
+ <comment xml:lang="pt">pacote SISX</comment>
+ <comment xml:lang="pl">Pakiet SISX</comment>
+ <comment xml:lang="oc">paquet SISX</comment>
+ <comment xml:lang="nn">SISX-pakke</comment>
+ <comment xml:lang="nl">SISX-pakket</comment>
+ <comment xml:lang="nb">SISX-pakke</comment>
+ <comment xml:lang="lv">SISX pakotne</comment>
+ <comment xml:lang="lt">SISX paketas</comment>
+ <comment xml:lang="ko">SISX 패키지</comment>
+ <comment xml:lang="kk">SISX дестесі</comment>
+ <comment xml:lang="ja">SISX パッケージ</comment>
+ <comment xml:lang="it">Pacchetto SISX</comment>
+ <comment xml:lang="is">SISX pakki</comment>
+ <comment xml:lang="id">Paket SISX</comment>
+ <comment xml:lang="ia">Pacchetto SISX</comment>
+ <comment xml:lang="hu">SISX csomag</comment>
+ <comment xml:lang="hr">SISX paket</comment>
+ <comment xml:lang="he">חבילת SISX</comment>
+ <comment xml:lang="gl">paquete SISX</comment>
+ <comment xml:lang="ga">pacáiste SISX</comment>
+ <comment xml:lang="fur">pachet SISX</comment>
+ <comment xml:lang="fr">paquet SISX</comment>
+ <comment xml:lang="fo">SISX pakki</comment>
+ <comment xml:lang="fi">SISX-paketti</comment>
+ <comment xml:lang="eu">SISX paketea</comment>
+ <comment xml:lang="es">paquete SISX</comment>
+ <comment xml:lang="eo">SISX-pakaĵo</comment>
+ <comment xml:lang="en_GB">SISX package</comment>
+ <comment xml:lang="el">Πακέτο SISX</comment>
+ <comment xml:lang="de">SISX-Paket</comment>
+ <comment xml:lang="da">SISX-pakke</comment>
+ <comment xml:lang="cs">balíček SISX</comment>
+ <comment xml:lang="ca">paquet SISX</comment>
+ <comment xml:lang="bg">Пакет — SISX</comment>
+ <comment xml:lang="be@latin">Pakunak SISX</comment>
+ <comment xml:lang="be">пакет SISX</comment>
+ <comment xml:lang="ast">Paquete SISX</comment>
+ <comment xml:lang="ar">حزمة SISX</comment>
+ <comment xml:lang="af">SISX-pakket</comment>
<acronym>SIS</acronym>
<expanded-acronym>Symbian Installation File</expanded-acronym>
<generic-icon name="package-x-generic"/>
- <magic priority="50">
+ <magic>
<match type="little32" value="0x10201a7a" offset="0"/>
</magic>
<glob pattern="*.sisx"/>
</mime-type>
<mime-type type="application/vnd.tcpdump.pcap">
- <comment>network packet capture</comment>
- <comment xml:lang="bg">Прихванати мрежови пакети</comment>
- <comment xml:lang="ca">captura de paquets de xarxa</comment>
- <comment xml:lang="da">Netværkspakkeoptagelse</comment>
- <comment xml:lang="de">Netzwerkpaketmitschnitt</comment>
- <comment xml:lang="en-GB">network packet capture</comment>
- <comment xml:lang="es">captura de paquetes de red</comment>
- <comment xml:lang="eu">sareko pakete kaptura</comment>
- <comment xml:lang="fi">verkkopakettien kaappaus</comment>
- <comment xml:lang="fr">capture de paquet réseau</comment>
- <comment xml:lang="hr">Mrežno hvatanje paketa</comment>
- <comment xml:lang="hu">hálózaticsomag-rögzítés</comment>
- <comment xml:lang="id">tangkapan paket jaringan</comment>
- <comment xml:lang="it">Cattura pacchetti rete</comment>
- <comment xml:lang="kk">ұсталған желілік пакеттер</comment>
- <comment xml:lang="ko">네트워크 패킷 캡처</comment>
+ <comment>Network packet capture</comment>
+ <comment xml:lang="uk">перехоплення пакетів мережі</comment>
+ <comment xml:lang="sv">Nätverkspaketsspårning</comment>
+ <comment xml:lang="ru">Захваченные сетевые пакеты</comment>
+ <comment xml:lang="pt_BR">Captura de pacotes de rede</comment>
<comment xml:lang="pl">Przechwycenie pakietu sieciowego</comment>
- <comment xml:lang="pt">captura dos pacotes de rede</comment>
- <comment xml:lang="pt-BR">Captura de pacotes de rede</comment>
- <comment xml:lang="ru">захваченные сетевые пакеты</comment>
- <comment xml:lang="sv">nätverkspaketsspårning</comment>
- <comment xml:lang="tr">ağ paket yakalaması</comment>
- <comment xml:lang="uk">перехоплення мережевого пакета</comment>
- <comment xml:lang="zh-CN">网络数据包抓取</comment>
- <magic priority="50">
+ <comment xml:lang="it">Cattura pacchetti di rete</comment>
+ <comment xml:lang="gl">Captura de paquetes de red</comment>
+ <comment xml:lang="es">captura de paquetes de red</comment>
+ <comment xml:lang="de">Netzwerkpaket-Aufzeichnung</comment>
+ <comment xml:lang="be">захопленыя сеткавыя пакеты</comment>
+ <magic>
<match type="host32" value="0xa1b2c3d4" offset="0"/>
<match type="host32" value="0xd4c3b2a1" offset="0"/>
</magic>
@@ -6938,63 +7183,67 @@ command to generate the output files.
</mime-type>
<mime-type type="application/vnd.wordperfect">
<comment>WordPerfect document</comment>
- <comment xml:lang="af">WordPerfect-dokument</comment>
- <comment xml:lang="ar">مستند WordPerfect</comment>
- <comment xml:lang="ast">Documentu de WordPerfect</comment>
- <comment xml:lang="az">WordPerfect sənədi</comment>
- <comment xml:lang="be-Latn">Dakument WordPerfect</comment>
- <comment xml:lang="bg">Документ — WordPerfect</comment>
- <comment xml:lang="ca">document WordPerfect</comment>
- <comment xml:lang="cs">dokument WordPerfect</comment>
- <comment xml:lang="cy">Dogfen WordPerfect</comment>
- <comment xml:lang="da">WordPerfect-dokument</comment>
- <comment xml:lang="de">WordPerfect-Dokument</comment>
- <comment xml:lang="el">Έγγραφο WordPerfect</comment>
- <comment xml:lang="en-GB">WordPerfect document</comment>
- <comment xml:lang="eo">WordPerfect-dokumento</comment>
- <comment xml:lang="es">documento de WordPerfect</comment>
- <comment xml:lang="eu">WordPerfect dokumentua</comment>
- <comment xml:lang="fi">WordPerfect-asiakirja</comment>
- <comment xml:lang="fo">WordPerfect skjal</comment>
- <comment xml:lang="fr">document WordPerfect</comment>
- <comment xml:lang="fur">document WordPerfect</comment>
- <comment xml:lang="ga">cáipéis WordPerfect</comment>
- <comment xml:lang="gl">documento de WordPerfect</comment>
- <comment xml:lang="he">מסמך WordPerfect</comment>
- <comment xml:lang="hr">WordPerfect dokument</comment>
- <comment xml:lang="hu">WordPerfect-dokumentum</comment>
- <comment xml:lang="ia">Documento WordPerfect</comment>
- <comment xml:lang="id">Dokumen WordPerfect</comment>
- <comment xml:lang="it">Documento WordPerfect</comment>
- <comment xml:lang="ja">WordPerfect ドキュメント</comment>
- <comment xml:lang="kk">WordPerfect құжаты</comment>
- <comment xml:lang="ko">WordPerfect 문서</comment>
- <comment xml:lang="lt">WordPerfect dokumentas</comment>
- <comment xml:lang="lv">WordPerfect dokuments</comment>
- <comment xml:lang="ms">Dokumen WordPerfect</comment>
- <comment xml:lang="nb">WordPerfect-dokument</comment>
- <comment xml:lang="nl">WordPerfect-document</comment>
- <comment xml:lang="nn">WordPerfect-dokument</comment>
- <comment xml:lang="oc">document WordPerfect</comment>
- <comment xml:lang="pl">Dokument WordPerfect</comment>
- <comment xml:lang="pt">documento WordPerfect</comment>
- <comment xml:lang="pt-BR">Documento do WordPerfect</comment>
- <comment xml:lang="ro">Document WordPerfect</comment>
- <comment xml:lang="ru">Документ WordPerfect</comment>
- <comment xml:lang="sk">Dokument WordPerfect</comment>
- <comment xml:lang="sl">Dokument WordPerfect</comment>
- <comment xml:lang="sq">Dokument WordPerfect</comment>
- <comment xml:lang="sr">документ Ворд перфекта</comment>
- <comment xml:lang="sv">WordPerfect-dokument</comment>
- <comment xml:lang="tr">WordPerfect belgesi</comment>
- <comment xml:lang="uk">документ WordPerfect</comment>
+ <comment xml:lang="zh_TW">WordPerfect 文件</comment>
+ <comment xml:lang="zh_CN">WordPerfect 文档</comment>
<comment xml:lang="vi">Tài liệu WordPerfect</comment>
- <comment xml:lang="zh-CN">WordPerfect 文档</comment>
- <comment xml:lang="zh-TW">WordPerfect 文件</comment>
+ <comment xml:lang="uk">документ WordPerfect</comment>
+ <comment xml:lang="tr">WordPerfect belgesi</comment>
+ <comment xml:lang="sv">WordPerfect-dokument</comment>
+ <comment xml:lang="sr">документ Ворд перфекта</comment>
+ <comment xml:lang="sq">dokument WordPerfect</comment>
+ <comment xml:lang="sl">Dokument WordPerfect</comment>
+ <comment xml:lang="si">WordPerfect ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument WordPerfect</comment>
+ <comment xml:lang="ru">Документ WordPerfect</comment>
+ <comment xml:lang="ro">Document WordPerfect</comment>
+ <comment xml:lang="pt_BR">Documento do WordPerfect</comment>
+ <comment xml:lang="pt">documento WordPerfect</comment>
+ <comment xml:lang="pl">Dokument WordPerfect</comment>
+ <comment xml:lang="oc">document WordPerfect</comment>
+ <comment xml:lang="nn">WordPerfect-dokument</comment>
+ <comment xml:lang="nl">WordPerfect-document</comment>
+ <comment xml:lang="nb">WordPerfect-dokument</comment>
+ <comment xml:lang="ms">Dokumen WordPerfect</comment>
+ <comment xml:lang="lv">WordPerfect dokuments</comment>
+ <comment xml:lang="lt">WordPerfect dokumentas</comment>
+ <comment xml:lang="ko">WordPerfect 문서</comment>
+ <comment xml:lang="kk">WordPerfect құжаты</comment>
+ <comment xml:lang="ka">WordPerfect -ის დოკუმენტი</comment>
+ <comment xml:lang="ja">WordPerfect ドキュメント</comment>
+ <comment xml:lang="it">Documento WordPerfect</comment>
+ <comment xml:lang="is">WordPerfect skjal</comment>
+ <comment xml:lang="id">Dokumen WordPerfect</comment>
+ <comment xml:lang="ia">Documento WordPerfect</comment>
+ <comment xml:lang="hu">WordPerfect-dokumentum</comment>
+ <comment xml:lang="hr">WordPerfect dokument</comment>
+ <comment xml:lang="he">מסמך WordPerfect</comment>
+ <comment xml:lang="gl">documento de WordPerfect</comment>
+ <comment xml:lang="ga">cáipéis WordPerfect</comment>
+ <comment xml:lang="fur">document WordPerfect</comment>
+ <comment xml:lang="fr">document WordPerfect</comment>
+ <comment xml:lang="fo">WordPerfect skjal</comment>
+ <comment xml:lang="fi">WordPerfect-asiakirja</comment>
+ <comment xml:lang="eu">WordPerfect dokumentua</comment>
+ <comment xml:lang="es">documento de WordPerfect</comment>
+ <comment xml:lang="eo">WordPerfect-dokumento</comment>
+ <comment xml:lang="en_GB">WordPerfect document</comment>
+ <comment xml:lang="el">Έγγραφο WordPerfect</comment>
+ <comment xml:lang="de">WordPerfect-Dokument</comment>
+ <comment xml:lang="da">WordPerfect-dokument</comment>
+ <comment xml:lang="cy">Dogfen WordPerfect</comment>
+ <comment xml:lang="cs">dokument WordPerfect</comment>
+ <comment xml:lang="ca">document WordPerfect</comment>
+ <comment xml:lang="bg">Документ — WordPerfect</comment>
+ <comment xml:lang="be@latin">Dakument WordPerfect</comment>
+ <comment xml:lang="be">дакумент WordPerfect</comment>
+ <comment xml:lang="az">WordPerfect sənədi</comment>
+ <comment xml:lang="ast">Documentu de WordPerfect</comment>
+ <comment xml:lang="ar">مستند WordPerfect</comment>
+ <comment xml:lang="af">WordPerfect-dokument</comment>
<alias type="application/x-wordperfect"/>
<alias type="application/wordperfect"/>
<generic-icon name="x-office-document"/>
- <magic priority="50">
+ <magic>
<match type="string" value="WPC" offset="1"/>
<!-- <match type="big32" value="0xff575053c405" offset="0"/> -->
</magic>
@@ -7005,101 +7254,137 @@ command to generate the output files.
<glob pattern="*.wpd"/>
<glob pattern="*.wpp"/>
</mime-type>
- <mime-type type="application/vnd.youtube.yt">
+ <mime-type type="video/vnd.youtube.yt">
<comment>YouTube media archive</comment>
- <comment xml:lang="bg">Медиен архив — YouTube</comment>
- <comment xml:lang="ca">arxiu de mitjans de YouTube</comment>
- <comment xml:lang="da">YouTube-mediearkiv</comment>
- <comment xml:lang="de">YouTube-Medienarchiv</comment>
- <comment xml:lang="en-GB">YouTube media archive</comment>
- <comment xml:lang="es">archivador multimedia de YouTube</comment>
- <comment xml:lang="eu">YouTube media fitxategia</comment>
- <comment xml:lang="fi">YouTube-media-arkisto</comment>
- <comment xml:lang="fr">archive média YouTube</comment>
- <comment xml:lang="hr">YouTube medijska arhiva</comment>
- <comment xml:lang="hu">YouTube médiaarchívum</comment>
- <comment xml:lang="id">Arsip media YouTube</comment>
- <comment xml:lang="it">Archivio multimediale YouTube</comment>
- <comment xml:lang="kk">YouTube медиа архиві</comment>
- <comment xml:lang="ko">유튜브 미디어 저장 파일</comment>
- <comment xml:lang="pl">Archiwum multimediów YouTube</comment>
- <comment xml:lang="pt">arquivo multimédia do YouTube</comment>
- <comment xml:lang="pt-BR">Arquivo de mídia do Youtube</comment>
- <comment xml:lang="ru">Медиа-архив YouTube</comment>
- <comment xml:lang="sk">Archív médií YouTube</comment>
- <comment xml:lang="sv">YouTube-mediaarkiv</comment>
- <comment xml:lang="tr">YouTube ortam arşivi</comment>
+ <comment xml:lang="zh_CN">YouTube 媒体存档</comment>
<comment xml:lang="uk">мультимедійний архів YouTube</comment>
- <comment xml:lang="zh-CN">YouTube 媒体存档</comment>
+ <comment xml:lang="tr">YouTube ortam arşivi</comment>
+ <comment xml:lang="sv">YouTube-mediaarkiv</comment>
+ <comment xml:lang="sq">arkiv media YouTube</comment>
+ <comment xml:lang="sl">Medijski arhiv YouTube</comment>
+ <comment xml:lang="si">YouTube මාධ්‍ය සංරක්ෂිතය</comment>
+ <comment xml:lang="sk">Archív médií YouTube</comment>
+ <comment xml:lang="ru">Медиа-архив YouTube</comment>
+ <comment xml:lang="pt_BR">Arquivo de mídia do Youtube</comment>
+ <comment xml:lang="pt">arquivo multimédia do YouTube</comment>
+ <comment xml:lang="pl">Archiwum multimediów YouTube</comment>
+ <comment xml:lang="oc">archiu mèdia YouTube</comment>
+ <comment xml:lang="nl">YouTube-media-archief</comment>
+ <comment xml:lang="ko">유튜브 미디어 저장 파일</comment>
+ <comment xml:lang="kk">YouTube медиа архиві</comment>
+ <comment xml:lang="ja">YouTube メディアアーカイブ</comment>
+ <comment xml:lang="it">Archivio multimediale YouTube</comment>
+ <comment xml:lang="is">YouTube margmiðlunarsafnskrá</comment>
+ <comment xml:lang="id">Arsip media YouTube</comment>
+ <comment xml:lang="hu">YouTube médiaarchívum</comment>
+ <comment xml:lang="hr">YouTube medijska arhiva</comment>
+ <comment xml:lang="he">ארכיון מדיה של YouTube</comment>
+ <comment xml:lang="gl">Arquivo multimedia de Youtube</comment>
+ <comment xml:lang="fr">archive média YouTube</comment>
+ <comment xml:lang="fi">YouTube-media-arkisto</comment>
+ <comment xml:lang="eu">YouTube media fitxategia</comment>
+ <comment xml:lang="es">archivador multimedia de YouTube</comment>
+ <comment xml:lang="en_GB">YouTube media archive</comment>
+ <comment xml:lang="de">YouTube-Medienarchiv</comment>
+ <comment xml:lang="da">YouTube-mediearkiv</comment>
+ <comment xml:lang="ca">arxiu de mitjans de YouTube</comment>
+ <comment xml:lang="bg">Медиен архив — YouTube</comment>
+ <comment xml:lang="be">архіў мультымедыя YouTube</comment>
+ <comment xml:lang="ar">أرشيف وسائط يوتيوب</comment>
+ <alias type="application/vnd.youtube.yt"/>
<generic-icon name="video-x-generic"/>
+ <magic>
+ <match type="string" value="ftypyt4 " offset="4"/>
+ </magic>
<glob pattern="*.yt"/>
<sub-class-of type="application/zip"/>
</mime-type>
<mime-type type="application/x-spss-por">
<comment>SPSS portable data file</comment>
- <comment xml:lang="bg">Данни — SPSS, преносими</comment>
- <comment xml:lang="ca">fitxer de dades portables SPSS</comment>
- <comment xml:lang="da">SPSS portable data-fil</comment>
- <comment xml:lang="de">SPSS portable Datendatei</comment>
- <comment xml:lang="en-GB">SPSS portable data file</comment>
- <comment xml:lang="es">archivo de datos portátiles de SPSS</comment>
- <comment xml:lang="eu">SPSS datu fitxategi eramangarria</comment>
- <comment xml:lang="fi">Siirrettävä SPSS-tiedosto</comment>
- <comment xml:lang="fr">fichier portable de données SPSS</comment>
- <comment xml:lang="hr">SPSS prenosiva podatkovna datoteka</comment>
- <comment xml:lang="hu">SPSS hordozható adatfájl</comment>
- <comment xml:lang="id">Berkas data portabel SPSS</comment>
- <comment xml:lang="it">File dati SPSS Portable</comment>
- <comment xml:lang="kk">SPSS тасымалы деректер файлы</comment>
- <comment xml:lang="ko">SPSS 휴대 데이터 파일</comment>
- <comment xml:lang="pl">Plik przenośnych danych SPSS</comment>
- <comment xml:lang="pt">ficheiro de dados portátil SPSS</comment>
- <comment xml:lang="pt-BR">Arquivo de dados portáteis SPSS</comment>
- <comment xml:lang="ru">Файл переносимых данных SPSS</comment>
- <comment xml:lang="sk">Súbor prenosných údajov SPSS</comment>
- <comment xml:lang="sv">SPSS portabel datafil</comment>
- <comment xml:lang="tr">SPSS taşınabilir veri dosyası</comment>
+ <comment xml:lang="zh_TW">SPSS 可攜資料檔</comment>
+ <comment xml:lang="zh_CN">SPSS 便携式数据文件</comment>
<comment xml:lang="uk">портативний файл даних SPSS</comment>
- <comment xml:lang="zh-CN">SPSS 便携式数据文件</comment>
- <comment xml:lang="zh-TW">SPSS 可攜資料檔</comment>
+ <comment xml:lang="tr">SPSS taşınabilir veri dosyası</comment>
+ <comment xml:lang="sv">SPSS portabel datafil</comment>
+ <comment xml:lang="sq">kartelë të dhënash të bartshme SPSS</comment>
+ <comment xml:lang="sl">Prenosna podatkovna datoteka SPSS</comment>
+ <comment xml:lang="si">SPSS අතේ ගෙන යා හැකි දත්ත ගොනුව</comment>
+ <comment xml:lang="sk">Súbor prenosných údajov SPSS</comment>
+ <comment xml:lang="ru">Файл переносимых данных SPSS</comment>
+ <comment xml:lang="pt_BR">Arquivo de dados portáteis SPSS</comment>
+ <comment xml:lang="pt">ficheiro de dados portátil SPSS</comment>
+ <comment xml:lang="pl">Plik przenośnych danych SPSS</comment>
+ <comment xml:lang="nl">SPSS-portable-gegevensbestand</comment>
+ <comment xml:lang="ko">SPSS 휴대 데이터 파일</comment>
+ <comment xml:lang="kk">SPSS тасымалы деректер файлы</comment>
+ <comment xml:lang="ka">SPSS გადატანადი მონაცემების ფაილი</comment>
+ <comment xml:lang="ja">SPSS ポータブルデータファイル</comment>
+ <comment xml:lang="it">File dati SPSS Portable</comment>
+ <comment xml:lang="is">yfirfæranleg SPSS gagnaskrá</comment>
+ <comment xml:lang="id">Berkas data portabel SPSS</comment>
+ <comment xml:lang="hu">SPSS hordozható adatfájl</comment>
+ <comment xml:lang="hr">SPSS prenosiva podatkovna datoteka</comment>
+ <comment xml:lang="he">קובץ נתונים נייד של SPSS</comment>
+ <comment xml:lang="gl">Ficheiro de datos portábel de SPSS</comment>
+ <comment xml:lang="fr">fichier portable de données SPSS</comment>
+ <comment xml:lang="fi">Siirrettävä SPSS-tiedosto</comment>
+ <comment xml:lang="eu">SPSS datu fitxategi eramangarria</comment>
+ <comment xml:lang="es">archivo de datos portátiles de SPSS</comment>
+ <comment xml:lang="en_GB">SPSS portable data file</comment>
+ <comment xml:lang="de">Portierbare SPSS-Datendatei</comment>
+ <comment xml:lang="da">SPSS portable data-fil</comment>
+ <comment xml:lang="ca">fitxer de dades portables SPSS</comment>
+ <comment xml:lang="bg">Данни — SPSS, преносими</comment>
+ <comment xml:lang="be">файл пераносу даных SPSS</comment>
+ <comment xml:lang="ar">ملف بيانات SPSS متنقل</comment>
<acronym>SPSS</acronym>
<expanded-acronym>Statistical Package for the Social Sciences</expanded-acronym>
- <magic priority="50">
+ <magic>
<match type="string" offset="40" value="ASCII SPSS PORT FILE"/>
</magic>
<glob pattern="*.por"/>
</mime-type>
<mime-type type="application/x-spss-sav">
<comment>SPSS data file</comment>
- <comment xml:lang="bg">Данни — SPSS</comment>
- <comment xml:lang="ca">fitxer de dades SPSS</comment>
- <comment xml:lang="da">SPSS data-fil</comment>
- <comment xml:lang="de">SPSS-Datendatei</comment>
- <comment xml:lang="en-GB">SPSS data file</comment>
- <comment xml:lang="es">archivo de datos de SPSS</comment>
- <comment xml:lang="eu">SPSS datu fitxategia</comment>
- <comment xml:lang="fi">SPSS-datatiedosto</comment>
- <comment xml:lang="fr">fichier de données SPSS</comment>
- <comment xml:lang="hr">SPSS podatkovna datoteka</comment>
- <comment xml:lang="hu">SPSS adatfájl</comment>
- <comment xml:lang="id">Berkas data SPSS</comment>
- <comment xml:lang="it">File dati SPSS</comment>
- <comment xml:lang="kk">SPSS деректер файлы</comment>
- <comment xml:lang="ko">SPSS 데이터 파일</comment>
- <comment xml:lang="pl">Plik danych SPSS</comment>
- <comment xml:lang="pt">ficheiro de dados SPSS</comment>
- <comment xml:lang="pt-BR">Arquivo de dados SPSS</comment>
- <comment xml:lang="ru">Файл данных SPSS</comment>
- <comment xml:lang="sk">Súbor údajov SPSS</comment>
- <comment xml:lang="sv">SPSS-datafil</comment>
- <comment xml:lang="tr">SPSS veri dosyası</comment>
+ <comment xml:lang="zh_TW">SPSS 資料檔</comment>
+ <comment xml:lang="zh_CN">SPSS 数据文件</comment>
<comment xml:lang="uk">файл даних SPSS</comment>
- <comment xml:lang="zh-CN">SPSS 数据文件</comment>
- <comment xml:lang="zh-TW">SPSS 資料檔</comment>
+ <comment xml:lang="tr">SPSS veri dosyası</comment>
+ <comment xml:lang="sv">SPSS-datafil</comment>
+ <comment xml:lang="sq">kartelë të dhënash SPSS</comment>
+ <comment xml:lang="sl">Podatkovna datoteka SPSS</comment>
+ <comment xml:lang="si">SPSS දත්ත ගොනුව</comment>
+ <comment xml:lang="sk">Súbor údajov SPSS</comment>
+ <comment xml:lang="ru">Файл данных SPSS</comment>
+ <comment xml:lang="pt_BR">Arquivo de dados SPSS</comment>
+ <comment xml:lang="pt">ficheiro de dados SPSS</comment>
+ <comment xml:lang="pl">Plik danych SPSS</comment>
+ <comment xml:lang="nl">SPSS-gegevensbestand</comment>
+ <comment xml:lang="ko">SPSS 데이터 파일</comment>
+ <comment xml:lang="kk">SPSS деректер файлы</comment>
+ <comment xml:lang="ja">SPSS データファイル</comment>
+ <comment xml:lang="it">File dati SPSS</comment>
+ <comment xml:lang="is">SPSS gagnaskrá</comment>
+ <comment xml:lang="id">Berkas data SPSS</comment>
+ <comment xml:lang="hu">SPSS adatfájl</comment>
+ <comment xml:lang="hr">SPSS podatkovna datoteka</comment>
+ <comment xml:lang="he">קובץ נתונים של SPSS</comment>
+ <comment xml:lang="gl">Ficheiro de datos SPSS</comment>
+ <comment xml:lang="fr">fichier de données SPSS</comment>
+ <comment xml:lang="fi">SPSS-datatiedosto</comment>
+ <comment xml:lang="eu">SPSS datu fitxategia</comment>
+ <comment xml:lang="es">archivo de datos de SPSS</comment>
+ <comment xml:lang="en_GB">SPSS data file</comment>
+ <comment xml:lang="de">SPSS-Datendatei</comment>
+ <comment xml:lang="da">SPSS data-fil</comment>
+ <comment xml:lang="ca">fitxer de dades SPSS</comment>
+ <comment xml:lang="bg">Данни — SPSS</comment>
+ <comment xml:lang="be">файл даных SPSS</comment>
+ <comment xml:lang="ar">ملف بيانات SPSS</comment>
<acronym>SPSS</acronym>
<expanded-acronym>Statistical Package for the Social Sciences</expanded-acronym>
<alias type="application/x-spss-savefile"/>
- <magic priority="50">
+ <magic>
<match type="string" offset="0" value="$FL2"/>
<match type="string" offset="0" value="$FL3"/>
</magic>
@@ -7108,181 +7393,191 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-xbel">
<comment>XBEL bookmarks</comment>
- <comment xml:lang="af">XBEL-boekmerke</comment>
- <comment xml:lang="ar">علامات XBEL</comment>
- <comment xml:lang="be-Latn">Zakładki XBEL</comment>
- <comment xml:lang="bg">Отметки — XBEL</comment>
- <comment xml:lang="ca">llista d'adreces d'interès XBEL</comment>
- <comment xml:lang="cs">záložky XBEL</comment>
- <comment xml:lang="da">XBEL-bogmærker</comment>
- <comment xml:lang="de">XBEL-Lesezeichen</comment>
- <comment xml:lang="el">Σελιδοδείκτες XBEL</comment>
- <comment xml:lang="en-GB">XBEL bookmarks</comment>
- <comment xml:lang="eo">XBEL-legosignoj</comment>
- <comment xml:lang="es">marcadores XBEL</comment>
- <comment xml:lang="eu">XBEL laster-markak</comment>
- <comment xml:lang="fi">XBEL-kirjanmerkit</comment>
- <comment xml:lang="fo">XBEL bókamerki</comment>
- <comment xml:lang="fr">marque-pages XBEL</comment>
- <comment xml:lang="fur">segnelibris XBEL</comment>
- <comment xml:lang="ga">leabharmharcanna XBEL</comment>
- <comment xml:lang="gl">Marcadores XBEL</comment>
- <comment xml:lang="he">סימניית XBEL</comment>
- <comment xml:lang="hr">XBEL zabilješka</comment>
- <comment xml:lang="hu">XBEL-könyvjelzők</comment>
- <comment xml:lang="ia">Marcapaginas XBEL</comment>
- <comment xml:lang="id">Bookmark XBEL</comment>
- <comment xml:lang="it">Segnalibri XBEL</comment>
- <comment xml:lang="ja">XBEL ブックマーク</comment>
- <comment xml:lang="kk">XBEL бетбелгілері</comment>
- <comment xml:lang="ko">XBEL 책갈피</comment>
- <comment xml:lang="lt">XBEL žymelės</comment>
- <comment xml:lang="lv">XBEL grāmatzīmes</comment>
- <comment xml:lang="ms">Tandabuku XBEL</comment>
- <comment xml:lang="nb">XBEL-bokmerker</comment>
- <comment xml:lang="nl">XBEL-bladwijzers</comment>
- <comment xml:lang="nn">XBEL-bokmerker</comment>
- <comment xml:lang="oc">marcapaginas XBEL</comment>
- <comment xml:lang="pl">Zakładki XBEL</comment>
- <comment xml:lang="pt">marcadores XBEL</comment>
- <comment xml:lang="pt-BR">Marcadores do XBEL</comment>
- <comment xml:lang="ro">Semne de carte XBEL</comment>
- <comment xml:lang="ru">Закладки XBEL</comment>
- <comment xml:lang="sk">Záložky XBEL</comment>
- <comment xml:lang="sl">Datoteka zaznamkov XBEL</comment>
- <comment xml:lang="sq">Libërshënues XBEL</comment>
- <comment xml:lang="sr">ИксБЕЛ обележивачи</comment>
- <comment xml:lang="sv">XBEL-bokmärken</comment>
- <comment xml:lang="tr">XBEL yer imleri</comment>
- <comment xml:lang="uk">закладки XBEL</comment>
+ <comment xml:lang="zh_TW">XBEL 格式書籤</comment>
+ <comment xml:lang="zh_CN">XBEL 书签</comment>
<comment xml:lang="vi">Liên kết đã lưu XBEL</comment>
- <comment xml:lang="zh-CN">XBEL 书签</comment>
- <comment xml:lang="zh-TW">XBEL 格式書籤</comment>
+ <comment xml:lang="uk">закладки XBEL</comment>
+ <comment xml:lang="tr">XBEL yer imleri</comment>
+ <comment xml:lang="sv">XBEL-bokmärken</comment>
+ <comment xml:lang="sr">ИксБЕЛ обележивачи</comment>
+ <comment xml:lang="sq">faqerojtës XBEL</comment>
+ <comment xml:lang="sl">Datoteka zaznamkov XBEL</comment>
+ <comment xml:lang="si">XBEL පිටුසන්</comment>
+ <comment xml:lang="sk">Záložky XBEL</comment>
+ <comment xml:lang="ru">Закладки XBEL</comment>
+ <comment xml:lang="ro">Semne de carte XBEL</comment>
+ <comment xml:lang="pt_BR">Marcadores do XBEL</comment>
+ <comment xml:lang="pt">marcadores XBEL</comment>
+ <comment xml:lang="pl">Zakładki XBEL</comment>
+ <comment xml:lang="oc">marcapaginas XBEL</comment>
+ <comment xml:lang="nn">XBEL-bokmerker</comment>
+ <comment xml:lang="nl">XBEL-bladwijzers</comment>
+ <comment xml:lang="nb">XBEL-bokmerker</comment>
+ <comment xml:lang="ms">Tandabuku XBEL</comment>
+ <comment xml:lang="lv">XBEL grāmatzīmes</comment>
+ <comment xml:lang="lt">XBEL žymelės</comment>
+ <comment xml:lang="ko">XBEL 책갈피</comment>
+ <comment xml:lang="kk">XBEL бетбелгілері</comment>
+ <comment xml:lang="ja">XBEL ブックマーク</comment>
+ <comment xml:lang="it">Segnalibri XBEL</comment>
+ <comment xml:lang="is">XBEL bókamerki</comment>
+ <comment xml:lang="id">Bookmark XBEL</comment>
+ <comment xml:lang="ia">Marcapaginas XBEL</comment>
+ <comment xml:lang="hu">XBEL-könyvjelzők</comment>
+ <comment xml:lang="hr">XBEL zabilješka</comment>
+ <comment xml:lang="he">סימניית XBEL</comment>
+ <comment xml:lang="gl">Marcadores XBEL</comment>
+ <comment xml:lang="ga">leabharmharcanna XBEL</comment>
+ <comment xml:lang="fur">segnelibris XBEL</comment>
+ <comment xml:lang="fr">marque-pages XBEL</comment>
+ <comment xml:lang="fo">XBEL bókamerki</comment>
+ <comment xml:lang="fi">XBEL-kirjanmerkit</comment>
+ <comment xml:lang="eu">XBEL laster-markak</comment>
+ <comment xml:lang="es">marcadores XBEL</comment>
+ <comment xml:lang="eo">XBEL-legosignoj</comment>
+ <comment xml:lang="en_GB">XBEL bookmarks</comment>
+ <comment xml:lang="el">Σελιδοδείκτες XBEL</comment>
+ <comment xml:lang="de">XBEL-Lesezeichen</comment>
+ <comment xml:lang="da">XBEL-bogmærker</comment>
+ <comment xml:lang="cs">záložky XBEL</comment>
+ <comment xml:lang="ca">llista d'adreces d'interès XBEL</comment>
+ <comment xml:lang="bg">Отметки — XBEL</comment>
+ <comment xml:lang="be@latin">Zakładki XBEL</comment>
+ <comment xml:lang="be">закладкі XBEL</comment>
+ <comment xml:lang="ar">علامات XBEL</comment>
+ <comment xml:lang="af">XBEL-boekmerke</comment>
<acronym>XBEL</acronym>
<expanded-acronym>XML Bookmark Exchange Language</expanded-acronym>
<sub-class-of type="application/xml"/>
<generic-icon name="text-html"/>
- <magic priority="50">
+ <magic>
<match type="string" value="&lt;!DOCTYPE\ xbel" offset="0:256"/>
</magic>
<glob pattern="*.xbel"/>
</mime-type>
<mime-type type="application/x-7z-compressed">
<comment>7-zip archive</comment>
- <comment xml:lang="af">7-zip-argief</comment>
- <comment xml:lang="ar">أرشيف 7-zip</comment>
- <comment xml:lang="ast">Archivu 7-zip</comment>
- <comment xml:lang="be-Latn">Archiŭ 7-zip</comment>
- <comment xml:lang="bg">Архив — 7-zip</comment>
- <comment xml:lang="ca">arxiu 7-zip</comment>
- <comment xml:lang="cs">archiv 7-zip</comment>
- <comment xml:lang="da">7-zip-arkiv</comment>
- <comment xml:lang="de">7zip-Archiv</comment>
- <comment xml:lang="el">Συμπιεσμένο αρχείο 7-zip</comment>
- <comment xml:lang="en-GB">7-zip archive</comment>
- <comment xml:lang="eo">7z-arkivo</comment>
- <comment xml:lang="es">archivador 7-zip</comment>
- <comment xml:lang="eu">7-zip artxiboa</comment>
- <comment xml:lang="fi">7-zip-arkisto</comment>
- <comment xml:lang="fo">7-zip skjalasavn</comment>
- <comment xml:lang="fr">archive 7-zip</comment>
- <comment xml:lang="fur">archivi 7-zip</comment>
- <comment xml:lang="ga">cartlann 7-zip</comment>
- <comment xml:lang="gl">arquivo 7-zip</comment>
- <comment xml:lang="he">ארכיון 7-zip</comment>
- <comment xml:lang="hr">7-zip arhiva</comment>
- <comment xml:lang="hu">7-zip archívum</comment>
- <comment xml:lang="ia">Archivo 7-zip</comment>
- <comment xml:lang="id">Arsip 7-zip</comment>
- <comment xml:lang="it">Archivio 7-zip</comment>
- <comment xml:lang="ja">7-zip アーカイブ</comment>
- <comment xml:lang="ka">7-zip არქივი</comment>
- <comment xml:lang="kk">7-zip архиві</comment>
- <comment xml:lang="ko">7-ZIP 압축 파일</comment>
- <comment xml:lang="lt">7-zip archyvas</comment>
- <comment xml:lang="lv">7-zip arhīvs</comment>
- <comment xml:lang="nb">7-zip-arkiv</comment>
- <comment xml:lang="nl">7-zip-archief</comment>
- <comment xml:lang="nn">7-zip-arkiv</comment>
- <comment xml:lang="oc">archiu 7-zip</comment>
- <comment xml:lang="pl">Archiwum 7-zip</comment>
- <comment xml:lang="pt">arquivo 7-zip</comment>
- <comment xml:lang="pt-BR">Pacote 7-Zip</comment>
- <comment xml:lang="ro">Arhivă 7-zip</comment>
- <comment xml:lang="ru">Архив 7-zip</comment>
- <comment xml:lang="sk">Archív 7-zip</comment>
- <comment xml:lang="sl">Datoteka arhiva 7-zip</comment>
- <comment xml:lang="sq">Arkiv 7-zip</comment>
- <comment xml:lang="sr">7-зип архива</comment>
- <comment xml:lang="sv">7-zip-arkiv</comment>
- <comment xml:lang="tr">7-Zip arşivi</comment>
- <comment xml:lang="uk">архів 7-zip</comment>
+ <comment xml:lang="zh_TW">7-zip 封存檔</comment>
+ <comment xml:lang="zh_CN">7-zip 归档文件</comment>
<comment xml:lang="vi">Kho nén 7-zip</comment>
- <comment xml:lang="zh-CN">7-zip 归档文件</comment>
- <comment xml:lang="zh-TW">7-zip 封存檔</comment>
+ <comment xml:lang="uk">архів 7-zip</comment>
+ <comment xml:lang="tr">7-Zip arşivi</comment>
+ <comment xml:lang="sv">7-zip-arkiv</comment>
+ <comment xml:lang="sr">7-зип архива</comment>
+ <comment xml:lang="sq">arkiv 7-zip</comment>
+ <comment xml:lang="sl">Datoteka arhiva 7-zip</comment>
+ <comment xml:lang="si">7-zip සංරක්ෂිතය</comment>
+ <comment xml:lang="sk">Archív 7-zip</comment>
+ <comment xml:lang="ru">Архив 7-zip</comment>
+ <comment xml:lang="ro">Arhivă 7-zip</comment>
+ <comment xml:lang="pt_BR">Pacote 7-Zip</comment>
+ <comment xml:lang="pt">arquivo 7-zip</comment>
+ <comment xml:lang="pl">Archiwum 7-zip</comment>
+ <comment xml:lang="oc">archiu 7-zip</comment>
+ <comment xml:lang="nn">7-zip-arkiv</comment>
+ <comment xml:lang="nl">7-zip-archief</comment>
+ <comment xml:lang="nb">7-zip-arkiv</comment>
+ <comment xml:lang="lv">7-zip arhīvs</comment>
+ <comment xml:lang="lt">7-zip archyvas</comment>
+ <comment xml:lang="ko">7-ZIP 압축 파일</comment>
+ <comment xml:lang="kk">7-zip архиві</comment>
+ <comment xml:lang="ka">7-zip არქივი</comment>
+ <comment xml:lang="ja">7-zip アーカイブ</comment>
+ <comment xml:lang="it">Archivio 7-zip</comment>
+ <comment xml:lang="is">7-zip safnskrá</comment>
+ <comment xml:lang="id">Arsip 7-zip</comment>
+ <comment xml:lang="ia">Archivo 7-zip</comment>
+ <comment xml:lang="hu">7-zip archívum</comment>
+ <comment xml:lang="hr">7-zip arhiva</comment>
+ <comment xml:lang="he">ארכיון 7-zip</comment>
+ <comment xml:lang="gl">arquivo 7-zip</comment>
+ <comment xml:lang="ga">cartlann 7-zip</comment>
+ <comment xml:lang="fur">archivi 7-zip</comment>
+ <comment xml:lang="fr">archive 7-zip</comment>
+ <comment xml:lang="fo">7-zip skjalasavn</comment>
+ <comment xml:lang="fi">7-zip-arkisto</comment>
+ <comment xml:lang="eu">7-zip artxiboa</comment>
+ <comment xml:lang="es">archivador 7-zip</comment>
+ <comment xml:lang="eo">7z-arkivo</comment>
+ <comment xml:lang="en_GB">7-zip archive</comment>
+ <comment xml:lang="el">Συμπιεσμένο αρχείο 7-zip</comment>
+ <comment xml:lang="de">7-Zip-Archiv</comment>
+ <comment xml:lang="da">7-zip-arkiv</comment>
+ <comment xml:lang="cs">archiv 7-zip</comment>
+ <comment xml:lang="ca">arxiu 7-zip</comment>
+ <comment xml:lang="bg">Архив — 7-zip</comment>
+ <comment xml:lang="be@latin">Archiŭ 7-zip</comment>
+ <comment xml:lang="be">архіў 7-zip</comment>
+ <comment xml:lang="ast">Archivu 7-zip</comment>
+ <comment xml:lang="ar">أرشيف 7-zip</comment>
+ <comment xml:lang="af">7-zip-argief</comment>
<generic-icon name="package-x-generic"/>
<magic priority="60">
<match type="string" value="7z\274\257\047\034" offset="0"/>
</magic>
<glob pattern="*.7z"/>
+ <glob pattern="*.7z.001"/>
</mime-type>
<mime-type type="application/x-abiword">
<comment>AbiWord document</comment>
- <comment xml:lang="af">AbiWord-dokument</comment>
- <comment xml:lang="ar">مستند آبي وورد</comment>
- <comment xml:lang="ast">Documentu d'AbiWord</comment>
- <comment xml:lang="be-Latn">Dakument AbiWord</comment>
- <comment xml:lang="bg">Документ — AbiWord</comment>
- <comment xml:lang="ca">document AbiWord</comment>
- <comment xml:lang="cs">dokument AbiWord</comment>
- <comment xml:lang="da">AbiWord-dokument</comment>
- <comment xml:lang="de">AbiWord-Dokument</comment>
- <comment xml:lang="el">Έγγραφο AbiWord</comment>
- <comment xml:lang="en-GB">AbiWord document</comment>
- <comment xml:lang="eo">AbiWord-dokumento</comment>
- <comment xml:lang="es">documento de Abiword</comment>
- <comment xml:lang="eu">AbiWord dokumentua</comment>
- <comment xml:lang="fi">AbiWord-asiakirja</comment>
- <comment xml:lang="fo">AbiWord skjal</comment>
- <comment xml:lang="fr">document AbiWord</comment>
- <comment xml:lang="fur">document AbiWord</comment>
- <comment xml:lang="ga">cáipéis AbiWord</comment>
- <comment xml:lang="gl">documento de AbiWord</comment>
- <comment xml:lang="he">מסמך AbiWord</comment>
- <comment xml:lang="hr">AbiWord dokument</comment>
- <comment xml:lang="hu">AbiWord-dokumentum</comment>
- <comment xml:lang="ia">Documento AbiWord</comment>
- <comment xml:lang="id">Dokumen AbiWord</comment>
- <comment xml:lang="it">Documento AbiWord</comment>
- <comment xml:lang="ja">AbiWord ドキュメント</comment>
- <comment xml:lang="ka">AbiWord-ის დოკუმენტი</comment>
- <comment xml:lang="kk">AbiWord құжаты</comment>
- <comment xml:lang="ko">AbiWord 문서</comment>
- <comment xml:lang="lt">AbiWord dokumentas</comment>
- <comment xml:lang="lv">AbiWord dokuments</comment>
- <comment xml:lang="ms">Dokumen AbiWord</comment>
- <comment xml:lang="nb">AbiWord-dokument</comment>
- <comment xml:lang="nl">AbiWord-document</comment>
- <comment xml:lang="nn">AbiWord-dokument</comment>
- <comment xml:lang="oc">document AbiWord</comment>
- <comment xml:lang="pl">Dokument AbiWord</comment>
- <comment xml:lang="pt">documento AbiWord</comment>
- <comment xml:lang="pt-BR">Documento do AbiWord</comment>
- <comment xml:lang="ro">Document AbiWord</comment>
- <comment xml:lang="ru">Документ AbiWord</comment>
- <comment xml:lang="sk">Dokument AbiWord</comment>
- <comment xml:lang="sl">Dokument AbiWord</comment>
- <comment xml:lang="sq">Dokument AbiWord</comment>
- <comment xml:lang="sr">Абиворд документ</comment>
- <comment xml:lang="sv">AbiWord-dokument</comment>
- <comment xml:lang="tr">AbiWord belgesi</comment>
- <comment xml:lang="uk">документ AbiWord</comment>
+ <comment xml:lang="zh_TW">AbiWord 文件</comment>
+ <comment xml:lang="zh_CN">AbiWord 文档</comment>
<comment xml:lang="vi">Tài liệu AbiWord</comment>
- <comment xml:lang="zh-CN">AbiWord 文档</comment>
- <comment xml:lang="zh-TW">AbiWord 文件</comment>
+ <comment xml:lang="uk">документ AbiWord</comment>
+ <comment xml:lang="tr">AbiWord belgesi</comment>
+ <comment xml:lang="sv">AbiWord-dokument</comment>
+ <comment xml:lang="sr">Абиворд документ</comment>
+ <comment xml:lang="sq">dokument AbiWord</comment>
+ <comment xml:lang="sl">Dokument AbiWord</comment>
+ <comment xml:lang="si">AbiWord ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument AbiWord</comment>
+ <comment xml:lang="ru">Документ AbiWord</comment>
+ <comment xml:lang="ro">Document AbiWord</comment>
+ <comment xml:lang="pt_BR">Documento do AbiWord</comment>
+ <comment xml:lang="pt">documento AbiWord</comment>
+ <comment xml:lang="pl">Dokument AbiWord</comment>
+ <comment xml:lang="oc">document AbiWord</comment>
+ <comment xml:lang="nn">AbiWord-dokument</comment>
+ <comment xml:lang="nl">AbiWord-document</comment>
+ <comment xml:lang="nb">AbiWord-dokument</comment>
+ <comment xml:lang="ms">Dokumen AbiWord</comment>
+ <comment xml:lang="lv">AbiWord dokuments</comment>
+ <comment xml:lang="lt">AbiWord dokumentas</comment>
+ <comment xml:lang="ko">AbiWord 문서</comment>
+ <comment xml:lang="kk">AbiWord құжаты</comment>
+ <comment xml:lang="ka">AbiWord-ის დოკუმენტი</comment>
+ <comment xml:lang="ja">AbiWord ドキュメント</comment>
+ <comment xml:lang="it">Documento AbiWord</comment>
+ <comment xml:lang="is">AbiWord skjal</comment>
+ <comment xml:lang="id">Dokumen AbiWord</comment>
+ <comment xml:lang="ia">Documento AbiWord</comment>
+ <comment xml:lang="hu">AbiWord-dokumentum</comment>
+ <comment xml:lang="hr">AbiWord dokument</comment>
+ <comment xml:lang="he">מסמך AbiWord</comment>
+ <comment xml:lang="gl">documento de AbiWord</comment>
+ <comment xml:lang="ga">cáipéis AbiWord</comment>
+ <comment xml:lang="fur">document AbiWord</comment>
+ <comment xml:lang="fr">document AbiWord</comment>
+ <comment xml:lang="fo">AbiWord skjal</comment>
+ <comment xml:lang="fi">AbiWord-asiakirja</comment>
+ <comment xml:lang="eu">AbiWord dokumentua</comment>
+ <comment xml:lang="es">documento de AbiWord</comment>
+ <comment xml:lang="eo">AbiWord-dokumento</comment>
+ <comment xml:lang="en_GB">AbiWord document</comment>
+ <comment xml:lang="el">Έγγραφο AbiWord</comment>
+ <comment xml:lang="de">AbiWord-Dokument</comment>
+ <comment xml:lang="da">AbiWord-dokument</comment>
+ <comment xml:lang="cs">dokument AbiWord</comment>
+ <comment xml:lang="ca">document AbiWord</comment>
+ <comment xml:lang="bg">Документ — AbiWord</comment>
+ <comment xml:lang="be@latin">Dakument AbiWord</comment>
+ <comment xml:lang="be">дакумент AbiWord</comment>
+ <comment xml:lang="ast">Documentu d'AbiWord</comment>
+ <comment xml:lang="ar">مستند آبي وورد</comment>
+ <comment xml:lang="af">AbiWord-dokument</comment>
<sub-class-of type="application/xml"/>
<generic-icon name="x-office-document"/>
- <magic priority="50">
+ <magic>
<match type="string" value="&lt;abiword" offset="0:256"/>
<match type="string" value="&lt;!DOCTYPE abiword" offset="0:256"/>
</magic>
@@ -7294,227 +7589,254 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-cue">
<comment>CD image cuesheet</comment>
- <comment xml:lang="ar">صفيحة صورة الـCD جديلة</comment>
- <comment xml:lang="be-Latn">Infarmacyjny arkuš vyjavy CD</comment>
- <comment xml:lang="bg">Съдържание на CD</comment>
- <comment xml:lang="ca">«cuesheet» d'imatge de CD</comment>
- <comment xml:lang="cs">rozvržení stop obrazu CD</comment>
- <comment xml:lang="da">Cd-aftrykscuesheet</comment>
- <comment xml:lang="de">CD-Abbild-Cuesheet</comment>
- <comment xml:lang="el">Φύλλο cue εικόνας CD</comment>
- <comment xml:lang="en-GB">CD image cuesheet</comment>
- <comment xml:lang="es">hoja CUE de imagen de CD</comment>
- <comment xml:lang="eu">CD irudiaren CUE orria</comment>
- <comment xml:lang="fi">CD-vedos cuesheet</comment>
- <comment xml:lang="fr">index de pistes de CD</comment>
- <comment xml:lang="fur">sfuei-brivade CUE de imagjin CD</comment>
- <comment xml:lang="ga">bileog chiúála íomhá CD</comment>
- <comment xml:lang="gl">cue sheet dunha imaxe de CD</comment>
- <comment xml:lang="he">גליון נתונים לתמונת דיסק</comment>
- <comment xml:lang="hr">CD slika s meta podacima</comment>
- <comment xml:lang="hu">CD kép cuesheet</comment>
- <comment xml:lang="ia">Indice de pistas de CD</comment>
- <comment xml:lang="id">Citra cuesheet CD</comment>
- <comment xml:lang="it">Cuesheet immagine CD</comment>
- <comment xml:lang="ja">CD イメージキューシート</comment>
- <comment xml:lang="kk">CD бейнесінің құрама кестесі</comment>
- <comment xml:lang="ko">CD 이미지 큐시트</comment>
- <comment xml:lang="lt">CD atvaizdžio aprašas</comment>
- <comment xml:lang="lv">CD attēla rindulapa</comment>
- <comment xml:lang="nb">Filliste for CD-avtrykk</comment>
- <comment xml:lang="nl">CD-inhoudsopgave</comment>
- <comment xml:lang="nn">CD-bilete-indeksfil</comment>
- <comment xml:lang="oc">indèx de pistas de CD</comment>
- <comment xml:lang="pl">Obraz cuesheet płyty CD</comment>
- <comment xml:lang="pt">índice de imagem do CD</comment>
- <comment xml:lang="pt-BR">Índice de Imagem de CD</comment>
- <comment xml:lang="ro">Imagine CD cuesheet</comment>
- <comment xml:lang="ru">Таблица содержания образа CD</comment>
- <comment xml:lang="sk">Rozvrhnutie stôp obrazu CD</comment>
- <comment xml:lang="sl">Datoteka razpredelnice odtisa CD cue</comment>
- <comment xml:lang="sq">Cuesheet imazhi CD</comment>
- <comment xml:lang="sr">Кју лист ЦД одраза</comment>
- <comment xml:lang="sv">Indexblad för cd-avbild</comment>
- <comment xml:lang="tr">CD görüntüsü çizelgesi</comment>
- <comment xml:lang="uk">таблиця CUE образу CD</comment>
+ <comment xml:lang="zh_TW">CD 映像指示表</comment>
+ <comment xml:lang="zh_CN">CD 映像标记文件</comment>
<comment xml:lang="vi">Tờ tín hiệu báo ảnh CD</comment>
- <comment xml:lang="zh-CN">CD 映像标记文件</comment>
- <comment xml:lang="zh-TW">CD 映像指示表</comment>
+ <comment xml:lang="uk">таблиця CUE образу CD</comment>
+ <comment xml:lang="tr">CD görüntüsü çizelgesi</comment>
+ <comment xml:lang="sv">Indexblad för cd-avbild</comment>
+ <comment xml:lang="sr">Кју лист ЦД одраза</comment>
+ <comment xml:lang="sl">Datoteka razpredelnice odtisa CD cue</comment>
+ <comment xml:lang="si">සීඩී රූප කුට්ටිය</comment>
+ <comment xml:lang="sk">Rozvrhnutie stôp obrazu CD</comment>
+ <comment xml:lang="ru">Таблица содержания образа CD</comment>
+ <comment xml:lang="ro">Imagine CD cuesheet</comment>
+ <comment xml:lang="pt_BR">Índice de Imagem de CD</comment>
+ <comment xml:lang="pt">índice de imagem do CD</comment>
+ <comment xml:lang="pl">Obraz cuesheet płyty CD</comment>
+ <comment xml:lang="oc">indèx de pistas de CD</comment>
+ <comment xml:lang="nn">CD-bilete-indeksfil</comment>
+ <comment xml:lang="nl">CD-inhoudsopgave</comment>
+ <comment xml:lang="nb">Filliste for CD-avtrykk</comment>
+ <comment xml:lang="lv">CD attēla rindulapa</comment>
+ <comment xml:lang="lt">CD atvaizdžio aprašas</comment>
+ <comment xml:lang="ko">CD 이미지 큐시트</comment>
+ <comment xml:lang="kk">CD бейнесінің құрама кестесі</comment>
+ <comment xml:lang="ja">CD イメージキューシート</comment>
+ <comment xml:lang="it">Cuesheet immagine CD</comment>
+ <comment xml:lang="is">cuesheet CD diskmyndar</comment>
+ <comment xml:lang="id">Citra cuesheet CD</comment>
+ <comment xml:lang="ia">Indice de pistas de CD</comment>
+ <comment xml:lang="hu">CD lemezkép-jelölőlap</comment>
+ <comment xml:lang="hr">CD slika s meta podacima</comment>
+ <comment xml:lang="he">גיליון נתונים לדמות תקליטור</comment>
+ <comment xml:lang="gl">cue sheet dunha imaxe de CD</comment>
+ <comment xml:lang="ga">bileog chiúála íomhá CD</comment>
+ <comment xml:lang="fur">sfuei-brivade CUE de imagjin CD</comment>
+ <comment xml:lang="fr">index de pistes de CD</comment>
+ <comment xml:lang="fi">CD-levykuvan taulukko</comment>
+ <comment xml:lang="eu">CD irudiaren CUE orria</comment>
+ <comment xml:lang="es">hoja CUE de imagen de CD</comment>
+ <comment xml:lang="en_GB">CD image cuesheet</comment>
+ <comment xml:lang="el">Φύλλο cue εικόνας CD</comment>
+ <comment xml:lang="de">CD-Abbild-Cuesheet</comment>
+ <comment xml:lang="da">Cd-aftrykscuesheet</comment>
+ <comment xml:lang="cs">rozvržení stop obrazu CD</comment>
+ <comment xml:lang="ca">«cuesheet» d'imatge de CD</comment>
+ <comment xml:lang="bg">Съдържание на CD</comment>
+ <comment xml:lang="be@latin">Infarmacyjny arkuš vyjavy CD</comment>
+ <comment xml:lang="be">табліца разметкі вобраза CD</comment>
+ <comment xml:lang="ar">صفيحة صورة CD جديلة</comment>
<sub-class-of type="text/plain"/>
<generic-icon name="text-x-generic"/>
<glob pattern="*.cue"/>
</mime-type>
<mime-type type="application/x-amipro">
<comment>Lotus AmiPro document</comment>
- <comment xml:lang="af">Lotus AmiPro-dokument</comment>
- <comment xml:lang="ar">مستند Lotus AmiPro</comment>
- <comment xml:lang="ast">Documentu de Lotus AmiPro</comment>
- <comment xml:lang="az">Lotus AmiPro sənədi</comment>
- <comment xml:lang="be-Latn">Dakument Lotus AmiPro</comment>
- <comment xml:lang="bg">Документ — Lotus AmiPro</comment>
- <comment xml:lang="ca">document de Lotus AmiPro</comment>
- <comment xml:lang="cs">dokument Lotus AmiPro</comment>
- <comment xml:lang="cy">Dogfen Lotus AmiPro</comment>
- <comment xml:lang="da">Lotus AmiPro-dokument</comment>
- <comment xml:lang="de">Lotus-AmiPro-Dokument</comment>
- <comment xml:lang="el">Έγγραφο Lotus AmiPro</comment>
- <comment xml:lang="en-GB">Lotus AmiPro document</comment>
- <comment xml:lang="eo">dokumento de Lotus AmiPro</comment>
- <comment xml:lang="es">documento de Lotus AmiPro</comment>
- <comment xml:lang="eu">Lotus AmiPro dokumentua</comment>
- <comment xml:lang="fi">Lotus AmiPro -asiakirja</comment>
- <comment xml:lang="fo">Lotus AmiPro skjal</comment>
- <comment xml:lang="fr">document Lotus AmiPro</comment>
- <comment xml:lang="fur">document Lotus AmiPro</comment>
- <comment xml:lang="ga">cáipéis Lotus AmiPro</comment>
- <comment xml:lang="gl">documento de Lotus AmiPro</comment>
- <comment xml:lang="he">מסמך של Lotus AmiPro</comment>
- <comment xml:lang="hr">Lotus AmiPro dokument</comment>
- <comment xml:lang="hu">Lotus AmiPro-dokumentum</comment>
- <comment xml:lang="ia">Documento Lotus AmiPro</comment>
- <comment xml:lang="id">Dokumen Lotus AmiPro</comment>
- <comment xml:lang="it">Documento Lotus AmiPro</comment>
- <comment xml:lang="ja">Lotus AmiPro ドキュメント</comment>
- <comment xml:lang="kk">Lotus AmiPro құжаты</comment>
- <comment xml:lang="ko">Lotus AmiPro 문서</comment>
- <comment xml:lang="lt">Lotus AmiPro dokumentas</comment>
- <comment xml:lang="lv">Lotus AmiPro dokuments</comment>
- <comment xml:lang="ms">Dokumen Lotus AmiPro</comment>
- <comment xml:lang="nb">Lotus AmiPro-dokument</comment>
- <comment xml:lang="nl">Lotus AmiPro-document</comment>
- <comment xml:lang="nn">Lotus AmiPro-dokument</comment>
- <comment xml:lang="oc">document Lotus AmiPro</comment>
- <comment xml:lang="pl">Dokument Lotus AmiPro</comment>
- <comment xml:lang="pt">documento Lotus AmiPro</comment>
- <comment xml:lang="pt-BR">Documento do Lotus AmiPro</comment>
- <comment xml:lang="ro">Document Lotus AmiPro</comment>
- <comment xml:lang="ru">Документ Lotus AmiPro</comment>
- <comment xml:lang="sk">Dokument Lotus AmiPro</comment>
- <comment xml:lang="sl">Dokument Lotus AmiPro</comment>
- <comment xml:lang="sq">Dokument Lotus AmiPro</comment>
- <comment xml:lang="sr">Лотусов Ами Про документ</comment>
- <comment xml:lang="sv">Lotus AmiPro-dokument</comment>
- <comment xml:lang="tr">Lotus AmiPro belgesi</comment>
- <comment xml:lang="uk">документ Lotus AmiPro</comment>
+ <comment xml:lang="zh_TW">Lotus AmiPro 文件</comment>
+ <comment xml:lang="zh_CN">Lotus AmiPro 文档</comment>
<comment xml:lang="vi">Tài liệu Lotus AmiPro</comment>
- <comment xml:lang="zh-CN">Lotus AmiPro 文档</comment>
- <comment xml:lang="zh-TW">Lotus AmiPro 文件</comment>
+ <comment xml:lang="uk">документ Lotus AmiPro</comment>
+ <comment xml:lang="tr">Lotus AmiPro belgesi</comment>
+ <comment xml:lang="sv">Lotus AmiPro-dokument</comment>
+ <comment xml:lang="sr">Лотусов Ами Про документ</comment>
+ <comment xml:lang="sq">dokument Lotus AmiPro</comment>
+ <comment xml:lang="sl">Dokument Lotus AmiPro</comment>
+ <comment xml:lang="si">Lotus AmiPro ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument Lotus AmiPro</comment>
+ <comment xml:lang="ru">Документ Lotus AmiPro</comment>
+ <comment xml:lang="ro">Document Lotus AmiPro</comment>
+ <comment xml:lang="pt_BR">Documento do Lotus AmiPro</comment>
+ <comment xml:lang="pt">documento Lotus AmiPro</comment>
+ <comment xml:lang="pl">Dokument Lotus AmiPro</comment>
+ <comment xml:lang="oc">document Lotus AmiPro</comment>
+ <comment xml:lang="nn">Lotus AmiPro-dokument</comment>
+ <comment xml:lang="nl">Lotus AmiPro-document</comment>
+ <comment xml:lang="nb">Lotus AmiPro-dokument</comment>
+ <comment xml:lang="ms">Dokumen Lotus AmiPro</comment>
+ <comment xml:lang="lv">Lotus AmiPro dokuments</comment>
+ <comment xml:lang="lt">Lotus AmiPro dokumentas</comment>
+ <comment xml:lang="ko">Lotus AmiPro 문서</comment>
+ <comment xml:lang="kk">Lotus AmiPro құжаты</comment>
+ <comment xml:lang="ja">Lotus AmiPro ドキュメント</comment>
+ <comment xml:lang="it">Documento Lotus AmiPro</comment>
+ <comment xml:lang="is">Lotus AmiPro skjal</comment>
+ <comment xml:lang="id">Dokumen Lotus AmiPro</comment>
+ <comment xml:lang="ia">Documento Lotus AmiPro</comment>
+ <comment xml:lang="hu">Lotus AmiPro-dokumentum</comment>
+ <comment xml:lang="hr">Lotus AmiPro dokument</comment>
+ <comment xml:lang="he">מסמך של Lotus AmiPro</comment>
+ <comment xml:lang="gl">documento de Lotus AmiPro</comment>
+ <comment xml:lang="ga">cáipéis Lotus AmiPro</comment>
+ <comment xml:lang="fur">document Lotus AmiPro</comment>
+ <comment xml:lang="fr">document Lotus AmiPro</comment>
+ <comment xml:lang="fo">Lotus AmiPro skjal</comment>
+ <comment xml:lang="fi">Lotus AmiPro -asiakirja</comment>
+ <comment xml:lang="eu">Lotus AmiPro dokumentua</comment>
+ <comment xml:lang="es">documento de Lotus AmiPro</comment>
+ <comment xml:lang="eo">dokumento de Lotus AmiPro</comment>
+ <comment xml:lang="en_GB">Lotus AmiPro document</comment>
+ <comment xml:lang="el">Έγγραφο Lotus AmiPro</comment>
+ <comment xml:lang="de">Lotus-AmiPro-Dokument</comment>
+ <comment xml:lang="da">Lotus AmiPro-dokument</comment>
+ <comment xml:lang="cy">Dogfen Lotus AmiPro</comment>
+ <comment xml:lang="cs">dokument Lotus AmiPro</comment>
+ <comment xml:lang="ca">document de Lotus AmiPro</comment>
+ <comment xml:lang="bg">Документ — Lotus AmiPro</comment>
+ <comment xml:lang="be@latin">Dakument Lotus AmiPro</comment>
+ <comment xml:lang="be">дакумент Lotus AmiPro</comment>
+ <comment xml:lang="az">Lotus AmiPro sənədi</comment>
+ <comment xml:lang="ast">Documentu de Lotus AmiPro</comment>
+ <comment xml:lang="ar">مستند Lotus AmiPro</comment>
+ <comment xml:lang="af">Lotus AmiPro-dokument</comment>
<generic-icon name="x-office-document"/>
<glob pattern="*.sam"/>
</mime-type>
<mime-type type="application/x-aportisdoc">
<comment>AportisDoc document</comment>
- <comment xml:lang="af">AportisDoc-dokument</comment>
- <comment xml:lang="ar">مستند AportisDoc</comment>
- <comment xml:lang="ast">Documentu d'AportisDoc</comment>
- <comment xml:lang="bg">Документ — AportisDoc</comment>
- <comment xml:lang="ca">document AportisDoc</comment>
- <comment xml:lang="cs">dokument AportisDoc</comment>
- <comment xml:lang="da">AportisDoc-dokument</comment>
- <comment xml:lang="de">AportisDoc-Dokument</comment>
- <comment xml:lang="el">Έγγραφο AportisDoc</comment>
- <comment xml:lang="en-GB">AportisDoc document</comment>
- <comment xml:lang="eo">AportisDoc-dokumento</comment>
- <comment xml:lang="es">documento de AportisDoc</comment>
- <comment xml:lang="eu">AportisDoc dokumentua</comment>
- <comment xml:lang="fi">AportisDoc-asiakirja</comment>
- <comment xml:lang="fo">AportisDoc skjal</comment>
- <comment xml:lang="fr">document AportisDoc</comment>
- <comment xml:lang="fur">document AportisDoc</comment>
- <comment xml:lang="ga">cáipéis AportisDoc</comment>
- <comment xml:lang="gl">documento de AportiDoc</comment>
- <comment xml:lang="he">מסמך AportisDoc</comment>
- <comment xml:lang="hr">AportisDoc dokument</comment>
- <comment xml:lang="hu">AportisDoc-dokumentum</comment>
- <comment xml:lang="ia">Documento AportisDoc</comment>
- <comment xml:lang="id">Dokumen AportisDoc</comment>
- <comment xml:lang="it">Documento AportisDoc</comment>
- <comment xml:lang="ja">AportisDoc ドキュメント</comment>
- <comment xml:lang="ka">AportisDoc-ის დოკუმენტი</comment>
- <comment xml:lang="kk">AportisDoc құжаты</comment>
- <comment xml:lang="ko">AportisDoc 문서</comment>
- <comment xml:lang="lt">AportisDoc dokumentas</comment>
- <comment xml:lang="lv">AportisDoc dokuments</comment>
- <comment xml:lang="nl">AportisDoc-document</comment>
- <comment xml:lang="oc">document AportisDoc</comment>
- <comment xml:lang="pl">Dokument AportisDoc</comment>
- <comment xml:lang="pt">documento AportisDoc</comment>
- <comment xml:lang="pt-BR">Documento do AportisDoc</comment>
- <comment xml:lang="ro">Document AportisDoc</comment>
- <comment xml:lang="ru">Документ AportisDoc</comment>
- <comment xml:lang="sk">Dokument AportisDoc</comment>
- <comment xml:lang="sl">Dokument AportisDoc</comment>
- <comment xml:lang="sr">Апортис Док документ</comment>
- <comment xml:lang="sv">AportisDoc-dokument</comment>
- <comment xml:lang="tr">AportisDoc belgesi</comment>
- <comment xml:lang="uk">документ AportisDoc</comment>
+ <comment xml:lang="zh_TW">AportisDoc 文件</comment>
+ <comment xml:lang="zh_CN">AportisDoc 文档</comment>
<comment xml:lang="vi">Tài liệu AportisDoc</comment>
- <comment xml:lang="zh-CN">AportisDoc 文档</comment>
- <comment xml:lang="zh-TW">AportisDoc 文件</comment>
+ <comment xml:lang="uk">документ AportisDoc</comment>
+ <comment xml:lang="tr">AportisDoc belgesi</comment>
+ <comment xml:lang="sv">AportisDoc-dokument</comment>
+ <comment xml:lang="sr">Апортис Док документ</comment>
+ <comment xml:lang="sq">dokument AportisDoc</comment>
+ <comment xml:lang="sl">Dokument AportisDoc</comment>
+ <comment xml:lang="si">AportisDoc ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument AportisDoc</comment>
+ <comment xml:lang="ru">Документ AportisDoc</comment>
+ <comment xml:lang="ro">Document AportisDoc</comment>
+ <comment xml:lang="pt_BR">Documento do AportisDoc</comment>
+ <comment xml:lang="pt">documento AportisDoc</comment>
+ <comment xml:lang="pl">Dokument AportisDoc</comment>
+ <comment xml:lang="oc">document AportisDoc</comment>
+ <comment xml:lang="nl">AportisDoc-document</comment>
+ <comment xml:lang="lv">AportisDoc dokuments</comment>
+ <comment xml:lang="lt">AportisDoc dokumentas</comment>
+ <comment xml:lang="ko">AportisDoc 문서</comment>
+ <comment xml:lang="kk">AportisDoc құжаты</comment>
+ <comment xml:lang="ka">AportisDoc-ის დოკუმენტი</comment>
+ <comment xml:lang="ja">AportisDoc ドキュメント</comment>
+ <comment xml:lang="it">Documento AportisDoc</comment>
+ <comment xml:lang="is">AportisDoc skjal</comment>
+ <comment xml:lang="id">Dokumen AportisDoc</comment>
+ <comment xml:lang="ia">Documento AportisDoc</comment>
+ <comment xml:lang="hu">AportisDoc-dokumentum</comment>
+ <comment xml:lang="hr">AportisDoc dokument</comment>
+ <comment xml:lang="he">מסמך AportisDoc</comment>
+ <comment xml:lang="gl">documento de AportiDoc</comment>
+ <comment xml:lang="ga">cáipéis AportisDoc</comment>
+ <comment xml:lang="fur">document AportisDoc</comment>
+ <comment xml:lang="fr">document AportisDoc</comment>
+ <comment xml:lang="fo">AportisDoc skjal</comment>
+ <comment xml:lang="fi">AportisDoc-asiakirja</comment>
+ <comment xml:lang="eu">AportisDoc dokumentua</comment>
+ <comment xml:lang="es">documento de AportisDoc</comment>
+ <comment xml:lang="eo">AportisDoc-dokumento</comment>
+ <comment xml:lang="en_GB">AportisDoc document</comment>
+ <comment xml:lang="el">Έγγραφο AportisDoc</comment>
+ <comment xml:lang="de">AportisDoc-Dokument</comment>
+ <comment xml:lang="da">AportisDoc-dokument</comment>
+ <comment xml:lang="cs">dokument AportisDoc</comment>
+ <comment xml:lang="ca">document AportisDoc</comment>
+ <comment xml:lang="bg">Документ — AportisDoc</comment>
+ <comment xml:lang="be">дакумент AportisDoc</comment>
+ <comment xml:lang="ast">Documentu d'AportisDoc</comment>
+ <comment xml:lang="ar">مستند AportisDoc</comment>
+ <comment xml:lang="af">AportisDoc-dokument</comment>
<sub-class-of type="application/vnd.palm"/>
<generic-icon name="x-office-document"/>
- <magic priority="50">
+ <magic>
<match type="string" value="TEXtREAd" offset="60"/>
<match type="string" value="TEXtTlDc" offset="60"/>
</magic>
- <glob pattern="*.pdb"/>
+ <glob pattern="*.pdb" weight="30"/>
<glob pattern="*.pdc"/>
</mime-type>
+ <mime-type type="chemical/x-pdb">
+ <comment>Protein Data Bank file</comment>
+ <comment xml:lang="uk">файл банку даних протеїнів</comment>
+ <comment xml:lang="sv">Protein Data Bank-fil</comment>
+ <comment xml:lang="ru">Файл Protein Data Bank</comment>
+ <comment xml:lang="pl">Plik Protein Data Bank</comment>
+ <comment xml:lang="de">Protein-Datenbank-Datei</comment>
+ <sub-class-of type="text/plain"/>
+ <generic-icon name="text-x-generic"/>
+ <magic priority="40">
+ <match type="string" value="HEADER " offset="0"/>
+ </magic>
+ <glob pattern="*.pdb"/>
+ <glob pattern="*.brk"/>
+ </mime-type>
<mime-type type="application/x-applix-spreadsheet">
<comment>Applix Spreadsheets spreadsheet</comment>
- <comment xml:lang="af">Applix Spreadsheets-sigblad</comment>
- <comment xml:lang="ar">جداول بيانات Applix</comment>
- <comment xml:lang="be-Latn">Raźlikovy arkuš Applix Spreadsheets</comment>
- <comment xml:lang="bg">Таблица — Applix Spreadsheets</comment>
- <comment xml:lang="ca">full de càlcul d'Applix Spreadsheets</comment>
- <comment xml:lang="cs">sešit Applix Spreadsheets</comment>
- <comment xml:lang="da">Applix Spreadsheets-regneark</comment>
- <comment xml:lang="de">Applix-Spreadsheets-Tabelle</comment>
- <comment xml:lang="el">Λογιστικό φύλλο Applix Spreadsheets</comment>
- <comment xml:lang="en-GB">Applix Spreadsheets spreadsheet</comment>
- <comment xml:lang="eo">sterntabelo de Applix Spreadsheets</comment>
- <comment xml:lang="es">hoja de cálculo de Applix Spreadsheets</comment>
- <comment xml:lang="eu">Applix Spreadsheets kalkulu-orria</comment>
- <comment xml:lang="fi">Applix Spreadsheets -taulukko</comment>
- <comment xml:lang="fo">Applix Spreadsheets rokniark</comment>
- <comment xml:lang="fr">feuille de calcul Applix</comment>
- <comment xml:lang="fur">sfuei di calcul Applix Spreadsheets</comment>
- <comment xml:lang="ga">scarbhileog Applix Spreadsheets</comment>
- <comment xml:lang="gl">folla de cálculo de Applix</comment>
- <comment xml:lang="he">גליון נתונים של Applix Spreadsheets</comment>
- <comment xml:lang="hr">Applix Spreadsheets proračunska tablica</comment>
- <comment xml:lang="hu">Applix Spreadsheets-munkafüzet</comment>
- <comment xml:lang="ia">Folio de calculo Applix Spreadsheets</comment>
- <comment xml:lang="id">Lembar sebar Applix Spreadsheets</comment>
- <comment xml:lang="it">Foglio di calcolo Applix Spreadsheets</comment>
- <comment xml:lang="ja">Applix Spreadsheets スプレッドシート</comment>
- <comment xml:lang="ka">Applix Spreadsheets-ის ცხრილი</comment>
- <comment xml:lang="kk">Applix Spreadsheets электрондық кестесі</comment>
- <comment xml:lang="ko">Applix 스프레드시트</comment>
- <comment xml:lang="lt">Applix Spreadsheets skaičialentė</comment>
- <comment xml:lang="lv">Applix Spreadsheets izklājlapa</comment>
- <comment xml:lang="ms">Hamparan Applix Spreadsheets</comment>
- <comment xml:lang="nb">Applix Spreadsheets-regneark</comment>
- <comment xml:lang="nl">Applix Spreadsheets-rekenblad</comment>
- <comment xml:lang="nn">Applix Spreadsheets-dokument</comment>
- <comment xml:lang="oc">fuèlh de calcul Applix</comment>
- <comment xml:lang="pl">Arkusz Applix Spreadsheets</comment>
- <comment xml:lang="pt">folha de cálculo Applix Spreadsheets</comment>
- <comment xml:lang="pt-BR">Planilha do Applix Spreadsheets</comment>
- <comment xml:lang="ro">Foaie de calcul Applix</comment>
- <comment xml:lang="ru">Электронная таблица Applix Spreadsheets</comment>
- <comment xml:lang="sk">Zošit Applix Spreadsheets</comment>
- <comment xml:lang="sl">Razpredelnica Applix Spreadsheets</comment>
- <comment xml:lang="sq">Fletë llogaritjesh Applix Spreadsheets</comment>
- <comment xml:lang="sr">документ Апликсове Табеле</comment>
- <comment xml:lang="sv">Applix Spreadsheets-kalkylblad</comment>
- <comment xml:lang="tr">Applix Spreadsheets hesap çizelgesi</comment>
- <comment xml:lang="uk">ел. таблиця Applix Spreadsheets</comment>
+ <comment xml:lang="zh_TW">Applix Spreadsheets 試算表</comment>
+ <comment xml:lang="zh_CN">Applix Spreadsheets 电子表格</comment>
<comment xml:lang="vi">Bảng tính Applix Spreadsheets</comment>
- <comment xml:lang="zh-CN">Applix Spreadsheets 电子表格</comment>
- <comment xml:lang="zh-TW">Applix Spreadsheets 試算表</comment>
+ <comment xml:lang="uk">електронна таблиця Applix Spreadsheets</comment>
+ <comment xml:lang="tr">Applix Spreadsheets hesap çizelgesi</comment>
+ <comment xml:lang="sv">Applix Spreadsheets-kalkylblad</comment>
+ <comment xml:lang="sr">документ Апликсове Табеле</comment>
+ <comment xml:lang="sq">fletëllogaritje Applix Spreadsheets</comment>
+ <comment xml:lang="sl">Razpredelnica Applix Spreadsheets</comment>
+ <comment xml:lang="si">Applix පැතුරුම්පත් පැතුරුම්පත</comment>
+ <comment xml:lang="sk">Zošit Applix Spreadsheets</comment>
+ <comment xml:lang="ru">Электронная таблица Applix Spreadsheets</comment>
+ <comment xml:lang="ro">Foaie de calcul Applix</comment>
+ <comment xml:lang="pt_BR">Planilha do Applix Spreadsheets</comment>
+ <comment xml:lang="pt">folha de cálculo Applix Spreadsheets</comment>
+ <comment xml:lang="pl">Arkusz Applix Spreadsheets</comment>
+ <comment xml:lang="oc">fuèlh de calcul Applix</comment>
+ <comment xml:lang="nn">Applix Spreadsheets-dokument</comment>
+ <comment xml:lang="nl">Applix Spreadsheets-rekenblad</comment>
+ <comment xml:lang="nb">Applix Spreadsheets-regneark</comment>
+ <comment xml:lang="ms">Hamparan Applix Spreadsheets</comment>
+ <comment xml:lang="lv">Applix Spreadsheets izklājlapa</comment>
+ <comment xml:lang="lt">Applix Spreadsheets skaičialentė</comment>
+ <comment xml:lang="ko">Applix 스프레드시트</comment>
+ <comment xml:lang="kk">Applix Spreadsheets электрондық кестесі</comment>
+ <comment xml:lang="ka">Applix Spreadsheets-ის ცხრილი</comment>
+ <comment xml:lang="ja">Applix Spreadsheets スプレッドシート</comment>
+ <comment xml:lang="it">Foglio di calcolo Applix Spreadsheets</comment>
+ <comment xml:lang="is">Applix Spreadsheets töflureikniskjal</comment>
+ <comment xml:lang="id">Lembar sebar Applix Spreadsheets</comment>
+ <comment xml:lang="ia">Folio de calculo Applix Spreadsheets</comment>
+ <comment xml:lang="hu">Applix Spreadsheets-munkafüzet</comment>
+ <comment xml:lang="hr">Applix Spreadsheets proračunska tablica</comment>
+ <comment xml:lang="he">גיליון נתונים של Applix Spreadsheets</comment>
+ <comment xml:lang="gl">folla de cálculo de Applix</comment>
+ <comment xml:lang="ga">scarbhileog Applix Spreadsheets</comment>
+ <comment xml:lang="fur">sfuei di calcul Applix Spreadsheets</comment>
+ <comment xml:lang="fr">feuille de calcul Applix</comment>
+ <comment xml:lang="fo">Applix Spreadsheets rokniark</comment>
+ <comment xml:lang="fi">Applix Spreadsheets -taulukko</comment>
+ <comment xml:lang="eu">Applix Spreadsheets kalkulu-orria</comment>
+ <comment xml:lang="es">hoja de cálculo de Applix Spreadsheets</comment>
+ <comment xml:lang="eo">sterntabelo de Applix Spreadsheets</comment>
+ <comment xml:lang="en_GB">Applix Spreadsheets spreadsheet</comment>
+ <comment xml:lang="el">Λογιστικό φύλλο Applix Spreadsheets</comment>
+ <comment xml:lang="de">Applix-Spreadsheets-Tabelle</comment>
+ <comment xml:lang="da">Applix Spreadsheets-regneark</comment>
+ <comment xml:lang="cs">sešit Applix Spreadsheets</comment>
+ <comment xml:lang="ca">full de càlcul d'Applix Spreadsheets</comment>
+ <comment xml:lang="bg">Таблица — Applix Spreadsheets</comment>
+ <comment xml:lang="be@latin">Raźlikovy arkuš Applix Spreadsheets</comment>
+ <comment xml:lang="be">электронная табліца Applix Spreadsheets</comment>
+ <comment xml:lang="ar">جداول بيانات Applix</comment>
+ <comment xml:lang="af">Applix Spreadsheets-sigblad</comment>
<generic-icon name="x-office-spreadsheet"/>
- <magic priority="50">
+ <magic>
<match type="string" value="*BEGIN SPREADSHEETS" offset="0"/>
<match type="string" value="*BEGIN" offset="0">
<match type="string" value="SPREADSHEETS" offset="7"/>
@@ -7524,62 +7846,65 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-applix-word">
<comment>Applix Words document</comment>
- <comment xml:lang="af">Applix Words-dokument</comment>
- <comment xml:lang="ar">مستند كلمات Applix</comment>
- <comment xml:lang="ast">Documentu d'Applix Words</comment>
- <comment xml:lang="az">Applix Words sənədi</comment>
- <comment xml:lang="be-Latn">Dakument Applix Words</comment>
- <comment xml:lang="bg">Документ — Applix Words</comment>
- <comment xml:lang="ca">document d'Applix Words</comment>
- <comment xml:lang="cs">dokument Applix Words</comment>
- <comment xml:lang="cy">Dogfen Applix Words</comment>
- <comment xml:lang="da">Applix Words-dokument</comment>
- <comment xml:lang="de">Applix-Words-Dokument</comment>
- <comment xml:lang="el">Έγγραφο Applix Words</comment>
- <comment xml:lang="en-GB">Applix Words document</comment>
- <comment xml:lang="eo">dokumento de Applix Words</comment>
- <comment xml:lang="es">documento de Applix Words</comment>
- <comment xml:lang="eu">Applix Words dokumentua</comment>
- <comment xml:lang="fi">Applix Words -asiakirja</comment>
- <comment xml:lang="fo">Applix Words skjal</comment>
- <comment xml:lang="fr">document Applix Words</comment>
- <comment xml:lang="fur">document Applix Words</comment>
- <comment xml:lang="ga">cáipéis Applix Words</comment>
- <comment xml:lang="gl">documento de Applix Words</comment>
- <comment xml:lang="he">מסמך של Applix Words</comment>
- <comment xml:lang="hr">Applix Words dokument</comment>
- <comment xml:lang="hu">Applix Words-dokumentum</comment>
- <comment xml:lang="ia">Documento Applix Words</comment>
- <comment xml:lang="id">Dokumen Applix Words</comment>
- <comment xml:lang="it">Documento Applix Words</comment>
- <comment xml:lang="ja">Applix Words ドキュメント</comment>
- <comment xml:lang="ka">Applix Words-ის დოკუმენტი</comment>
- <comment xml:lang="kk">Applix Words құжаты</comment>
- <comment xml:lang="ko">Applix Words 문서</comment>
- <comment xml:lang="lt">Applix Words dokumentas</comment>
- <comment xml:lang="lv">Applix Words dokuments</comment>
- <comment xml:lang="ms">Dokumen Perkataan Applix</comment>
- <comment xml:lang="nb">Applix Words-dokument</comment>
- <comment xml:lang="nl">Applix Words-document</comment>
- <comment xml:lang="nn">Applix Words dokument</comment>
- <comment xml:lang="oc">document Applix Words</comment>
- <comment xml:lang="pl">Dokument Applix Words</comment>
- <comment xml:lang="pt">documento Applix Words</comment>
- <comment xml:lang="pt-BR">Documento do Applix Words</comment>
- <comment xml:lang="ro">Document Applix Words</comment>
- <comment xml:lang="ru">Документ Applix Words</comment>
- <comment xml:lang="sk">Dokument Applix Words</comment>
- <comment xml:lang="sl">Dokument Applix Words</comment>
- <comment xml:lang="sq">Dokument Applix Words</comment>
- <comment xml:lang="sr">документ Апликсових Речи</comment>
- <comment xml:lang="sv">Applix Words-dokument</comment>
- <comment xml:lang="tr">Applix Words belgesi</comment>
- <comment xml:lang="uk">документ Applix Words</comment>
+ <comment xml:lang="zh_TW">Applix Words 文件</comment>
+ <comment xml:lang="zh_CN">Applix Words 文档</comment>
<comment xml:lang="vi">Tài liệu Applix Words</comment>
- <comment xml:lang="zh-CN">Applix Words 文档</comment>
- <comment xml:lang="zh-TW">Applix Words 文件</comment>
+ <comment xml:lang="uk">документ Applix Words</comment>
+ <comment xml:lang="tr">Applix Words belgesi</comment>
+ <comment xml:lang="sv">Applix Words-dokument</comment>
+ <comment xml:lang="sr">документ Апликсових Речи</comment>
+ <comment xml:lang="sq">dokument Applix Words</comment>
+ <comment xml:lang="sl">Dokument Applix Words</comment>
+ <comment xml:lang="si">Applix Words ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument Applix Words</comment>
+ <comment xml:lang="ru">Документ Applix Words</comment>
+ <comment xml:lang="ro">Document Applix Words</comment>
+ <comment xml:lang="pt_BR">Documento do Applix Words</comment>
+ <comment xml:lang="pt">documento Applix Words</comment>
+ <comment xml:lang="pl">Dokument Applix Words</comment>
+ <comment xml:lang="oc">document Applix Words</comment>
+ <comment xml:lang="nn">Applix Words dokument</comment>
+ <comment xml:lang="nl">Applix Words-document</comment>
+ <comment xml:lang="nb">Applix Words-dokument</comment>
+ <comment xml:lang="ms">Dokumen Perkataan Applix</comment>
+ <comment xml:lang="lv">Applix Words dokuments</comment>
+ <comment xml:lang="lt">Applix Words dokumentas</comment>
+ <comment xml:lang="ko">Applix Words 문서</comment>
+ <comment xml:lang="kk">Applix Words құжаты</comment>
+ <comment xml:lang="ka">Applix Words-ის დოკუმენტი</comment>
+ <comment xml:lang="ja">Applix Words ドキュメント</comment>
+ <comment xml:lang="it">Documento Applix Words</comment>
+ <comment xml:lang="is">Applix Words skjal</comment>
+ <comment xml:lang="id">Dokumen Applix Words</comment>
+ <comment xml:lang="ia">Documento Applix Words</comment>
+ <comment xml:lang="hu">Applix Words-dokumentum</comment>
+ <comment xml:lang="hr">Applix Words dokument</comment>
+ <comment xml:lang="he">מסמך של Applix Words</comment>
+ <comment xml:lang="gl">documento de Applix Words</comment>
+ <comment xml:lang="ga">cáipéis Applix Words</comment>
+ <comment xml:lang="fur">document Applix Words</comment>
+ <comment xml:lang="fr">document Applix Words</comment>
+ <comment xml:lang="fo">Applix Words skjal</comment>
+ <comment xml:lang="fi">Applix Words -asiakirja</comment>
+ <comment xml:lang="eu">Applix Words dokumentua</comment>
+ <comment xml:lang="es">documento de Applix Words</comment>
+ <comment xml:lang="eo">dokumento de Applix Words</comment>
+ <comment xml:lang="en_GB">Applix Words document</comment>
+ <comment xml:lang="el">Έγγραφο Applix Words</comment>
+ <comment xml:lang="de">Applix-Words-Dokument</comment>
+ <comment xml:lang="da">Applix Words-dokument</comment>
+ <comment xml:lang="cy">Dogfen Applix Words</comment>
+ <comment xml:lang="cs">dokument Applix Words</comment>
+ <comment xml:lang="ca">document d'Applix Words</comment>
+ <comment xml:lang="bg">Документ — Applix Words</comment>
+ <comment xml:lang="be@latin">Dakument Applix Words</comment>
+ <comment xml:lang="be">дакумент Applix Words</comment>
+ <comment xml:lang="az">Applix Words sənədi</comment>
+ <comment xml:lang="ast">Documentu d'Applix Words</comment>
+ <comment xml:lang="ar">مستند كلمات Applix</comment>
+ <comment xml:lang="af">Applix Words-dokument</comment>
<generic-icon name="x-office-document"/>
- <magic priority="50">
+ <magic>
<match type="string" value="*BEGIN" offset="0">
<match type="string" value="WORDS" offset="7"/>
</match>
@@ -7588,56 +7913,59 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-arc">
<comment>ARC archive</comment>
- <comment xml:lang="af">ARC-argief</comment>
- <comment xml:lang="ar">أرشيف ARC</comment>
- <comment xml:lang="be-Latn">Archiŭ ARC</comment>
- <comment xml:lang="bg">Архив — ARC</comment>
- <comment xml:lang="ca">arxiu ARC</comment>
- <comment xml:lang="cs">archiv ARC</comment>
- <comment xml:lang="da">ARC-arkiv</comment>
- <comment xml:lang="de">ARC-Archiv</comment>
- <comment xml:lang="el">Συμπιεσμένο αρχείο ARC</comment>
- <comment xml:lang="en-GB">ARC archive</comment>
- <comment xml:lang="eo">ARC-arkivo</comment>
- <comment xml:lang="es">archivador ARC</comment>
- <comment xml:lang="eu">ARC artxiboa</comment>
- <comment xml:lang="fi">ARC-arkisto</comment>
- <comment xml:lang="fo">ARC skjalasavn</comment>
- <comment xml:lang="fr">archive ARC</comment>
- <comment xml:lang="fur">archivi ARC</comment>
- <comment xml:lang="ga">cartlann ARC</comment>
- <comment xml:lang="gl">arquivo ARC</comment>
- <comment xml:lang="he">ארכיון ARC</comment>
- <comment xml:lang="hr">ARC arhiva</comment>
- <comment xml:lang="hu">ARC-archívum</comment>
- <comment xml:lang="ia">Archivo ARC</comment>
- <comment xml:lang="id">Arsip ARC</comment>
- <comment xml:lang="it">Archivio ARC</comment>
- <comment xml:lang="ja">ARC アーカイブ</comment>
- <comment xml:lang="ka">ARC არქივი</comment>
- <comment xml:lang="kk">ARC архиві</comment>
- <comment xml:lang="ko">ARC 압축 파일</comment>
- <comment xml:lang="lt">ARC archyvas</comment>
- <comment xml:lang="lv">ARC arhīvs</comment>
- <comment xml:lang="nb">ARC-arkiv</comment>
- <comment xml:lang="nl">ARC-archief</comment>
- <comment xml:lang="nn">ARC-arkiv</comment>
- <comment xml:lang="oc">archiu ARC</comment>
- <comment xml:lang="pl">Archiwum ARC</comment>
- <comment xml:lang="pt">arquivo ARC</comment>
- <comment xml:lang="pt-BR">Pacote ARC</comment>
- <comment xml:lang="ro">Arhivă ARC</comment>
- <comment xml:lang="ru">Архив ARC</comment>
- <comment xml:lang="sk">Archív ARC</comment>
- <comment xml:lang="sl">Datoteka arhiva ARC</comment>
- <comment xml:lang="sq">Arkiv ARC</comment>
- <comment xml:lang="sr">АРЦ архива</comment>
- <comment xml:lang="sv">ARC-arkiv</comment>
- <comment xml:lang="tr">ARC arşivi</comment>
- <comment xml:lang="uk">архів ARC</comment>
+ <comment xml:lang="zh_TW">ARC 封存檔</comment>
+ <comment xml:lang="zh_CN">ARC 归档文件</comment>
<comment xml:lang="vi">Kho nén ARC</comment>
- <comment xml:lang="zh-CN">ARC 归档文件</comment>
- <comment xml:lang="zh-TW">ARC 封存檔</comment>
+ <comment xml:lang="uk">архів ARC</comment>
+ <comment xml:lang="tr">ARC arşivi</comment>
+ <comment xml:lang="sv">ARC-arkiv</comment>
+ <comment xml:lang="sr">АРЦ архива</comment>
+ <comment xml:lang="sq">arkiv ARC</comment>
+ <comment xml:lang="sl">Datoteka arhiva ARC</comment>
+ <comment xml:lang="si">ARC ලේඛනාගාරය</comment>
+ <comment xml:lang="sk">Archív ARC</comment>
+ <comment xml:lang="ru">Архив ARC</comment>
+ <comment xml:lang="ro">Arhivă ARC</comment>
+ <comment xml:lang="pt_BR">Pacote ARC</comment>
+ <comment xml:lang="pt">arquivo ARC</comment>
+ <comment xml:lang="pl">Archiwum ARC</comment>
+ <comment xml:lang="oc">archiu ARC</comment>
+ <comment xml:lang="nn">ARC-arkiv</comment>
+ <comment xml:lang="nl">ARC-archief</comment>
+ <comment xml:lang="nb">ARC-arkiv</comment>
+ <comment xml:lang="lv">ARC arhīvs</comment>
+ <comment xml:lang="lt">ARC archyvas</comment>
+ <comment xml:lang="ko">ARC 압축 파일</comment>
+ <comment xml:lang="kk">ARC архиві</comment>
+ <comment xml:lang="ka">ARC არქივი</comment>
+ <comment xml:lang="ja">ARC アーカイブ</comment>
+ <comment xml:lang="it">Archivio ARC</comment>
+ <comment xml:lang="is">ARC safnskrá</comment>
+ <comment xml:lang="id">Arsip ARC</comment>
+ <comment xml:lang="ia">Archivo ARC</comment>
+ <comment xml:lang="hu">ARC-archívum</comment>
+ <comment xml:lang="hr">ARC arhiva</comment>
+ <comment xml:lang="he">ארכיון ARC</comment>
+ <comment xml:lang="gl">arquivo ARC</comment>
+ <comment xml:lang="ga">cartlann ARC</comment>
+ <comment xml:lang="fur">archivi ARC</comment>
+ <comment xml:lang="fr">archive ARC</comment>
+ <comment xml:lang="fo">ARC skjalasavn</comment>
+ <comment xml:lang="fi">ARC-arkisto</comment>
+ <comment xml:lang="eu">ARC artxiboa</comment>
+ <comment xml:lang="es">archivador ARC</comment>
+ <comment xml:lang="eo">ARC-arkivo</comment>
+ <comment xml:lang="en_GB">ARC archive</comment>
+ <comment xml:lang="el">Συμπιεσμένο αρχείο ARC</comment>
+ <comment xml:lang="de">ARC-Archiv</comment>
+ <comment xml:lang="da">ARC-arkiv</comment>
+ <comment xml:lang="cs">archiv ARC</comment>
+ <comment xml:lang="ca">arxiu ARC</comment>
+ <comment xml:lang="bg">Архив — ARC</comment>
+ <comment xml:lang="be@latin">Archiŭ ARC</comment>
+ <comment xml:lang="be">архіў ARC</comment>
+ <comment xml:lang="ar">أرشيف ARC</comment>
+ <comment xml:lang="af">ARC-argief</comment>
<generic-icon name="package-x-generic"/>
<magic priority="60">
<match type="little32" mask="0x8080ffff" value="0x0000081a" offset="0"/>
@@ -7650,57 +7978,60 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-archive">
<comment>AR archive</comment>
- <comment xml:lang="af">AR-argief</comment>
- <comment xml:lang="ar">أرشيف AR</comment>
- <comment xml:lang="be-Latn">Archiŭ AR</comment>
- <comment xml:lang="bg">Архив — AR</comment>
- <comment xml:lang="ca">arxiu AR</comment>
- <comment xml:lang="cs">archiv AR</comment>
- <comment xml:lang="da">AR-arkiv</comment>
- <comment xml:lang="de">AR-Archiv</comment>
- <comment xml:lang="el">Συμπιεσμένο αρχείο AR</comment>
- <comment xml:lang="en-GB">AR archive</comment>
- <comment xml:lang="eo">AR-arkivo</comment>
- <comment xml:lang="es">archivador AR</comment>
- <comment xml:lang="eu">AR artxiboa</comment>
- <comment xml:lang="fi">AR-arkisto</comment>
- <comment xml:lang="fo">AR skjalasavn</comment>
- <comment xml:lang="fr">archive AR</comment>
- <comment xml:lang="fur">archivi AR</comment>
- <comment xml:lang="ga">cartlann AR</comment>
- <comment xml:lang="gl">arquivo AR</comment>
- <comment xml:lang="he">ארכיון AR</comment>
- <comment xml:lang="hr">AR arhiva</comment>
- <comment xml:lang="hu">AR-archívum</comment>
- <comment xml:lang="ia">Archivo AR</comment>
- <comment xml:lang="id">Arsip AR</comment>
- <comment xml:lang="it">Archivio AR</comment>
- <comment xml:lang="ja">AR アーカイブ</comment>
- <comment xml:lang="ka">AR არქივი</comment>
- <comment xml:lang="kk">AR архиві</comment>
- <comment xml:lang="ko">AR 묶음 파일</comment>
- <comment xml:lang="lt">AR archyvas</comment>
- <comment xml:lang="lv">AR arhīvs</comment>
- <comment xml:lang="ms">Arkib AR</comment>
- <comment xml:lang="nb">AR-arkiv</comment>
- <comment xml:lang="nl">AR-archief</comment>
- <comment xml:lang="nn">AR-arkiv</comment>
- <comment xml:lang="oc">archiu AR</comment>
- <comment xml:lang="pl">Archiwum AR</comment>
- <comment xml:lang="pt">arquivo AR</comment>
- <comment xml:lang="pt-BR">Pacote AR</comment>
- <comment xml:lang="ro">Arhivă AR</comment>
- <comment xml:lang="ru">Архив AR</comment>
- <comment xml:lang="sk">Archív AR</comment>
- <comment xml:lang="sl">Datoteka arhiva AR</comment>
- <comment xml:lang="sq">Arkiv AR</comment>
- <comment xml:lang="sr">АР архива</comment>
- <comment xml:lang="sv">AR-arkiv</comment>
- <comment xml:lang="tr">AR arşivi</comment>
- <comment xml:lang="uk">архів AR</comment>
+ <comment xml:lang="zh_TW">AR 封存檔</comment>
+ <comment xml:lang="zh_CN">AR 归档文件</comment>
<comment xml:lang="vi">Kho nén AR</comment>
- <comment xml:lang="zh-CN">AR 归档文件</comment>
- <comment xml:lang="zh-TW">AR 封存檔</comment>
+ <comment xml:lang="uk">архів AR</comment>
+ <comment xml:lang="tr">AR arşivi</comment>
+ <comment xml:lang="sv">AR-arkiv</comment>
+ <comment xml:lang="sr">АР архива</comment>
+ <comment xml:lang="sq">arkiv AR</comment>
+ <comment xml:lang="sl">Datoteka arhiva AR</comment>
+ <comment xml:lang="si">AR ලේඛනාගාරය</comment>
+ <comment xml:lang="sk">Archív AR</comment>
+ <comment xml:lang="ru">Архив AR</comment>
+ <comment xml:lang="ro">Arhivă AR</comment>
+ <comment xml:lang="pt_BR">Pacote AR</comment>
+ <comment xml:lang="pt">arquivo AR</comment>
+ <comment xml:lang="pl">Archiwum AR</comment>
+ <comment xml:lang="oc">archiu AR</comment>
+ <comment xml:lang="nn">AR-arkiv</comment>
+ <comment xml:lang="nl">AR-archief</comment>
+ <comment xml:lang="nb">AR-arkiv</comment>
+ <comment xml:lang="ms">Arkib AR</comment>
+ <comment xml:lang="lv">AR arhīvs</comment>
+ <comment xml:lang="lt">AR archyvas</comment>
+ <comment xml:lang="ko">AR 묶음 파일</comment>
+ <comment xml:lang="kk">AR архиві</comment>
+ <comment xml:lang="ka">AR არქივი</comment>
+ <comment xml:lang="ja">AR アーカイブ</comment>
+ <comment xml:lang="it">Archivio AR</comment>
+ <comment xml:lang="is">AR safnskrá</comment>
+ <comment xml:lang="id">Arsip AR</comment>
+ <comment xml:lang="ia">Archivo AR</comment>
+ <comment xml:lang="hu">AR-archívum</comment>
+ <comment xml:lang="hr">AR arhiva</comment>
+ <comment xml:lang="he">ארכיון AR</comment>
+ <comment xml:lang="gl">arquivo AR</comment>
+ <comment xml:lang="ga">cartlann AR</comment>
+ <comment xml:lang="fur">archivi AR</comment>
+ <comment xml:lang="fr">archive AR</comment>
+ <comment xml:lang="fo">AR skjalasavn</comment>
+ <comment xml:lang="fi">AR-arkisto</comment>
+ <comment xml:lang="eu">AR artxiboa</comment>
+ <comment xml:lang="es">archivador AR</comment>
+ <comment xml:lang="eo">AR-arkivo</comment>
+ <comment xml:lang="en_GB">AR archive</comment>
+ <comment xml:lang="el">Συμπιεσμένο αρχείο AR</comment>
+ <comment xml:lang="de">AR-Archiv</comment>
+ <comment xml:lang="da">AR-arkiv</comment>
+ <comment xml:lang="cs">archiv AR</comment>
+ <comment xml:lang="ca">arxiu AR</comment>
+ <comment xml:lang="bg">Архив — AR</comment>
+ <comment xml:lang="be@latin">Archiŭ AR</comment>
+ <comment xml:lang="be">архіў AR</comment>
+ <comment xml:lang="ar">أرشيف AR</comment>
+ <comment xml:lang="af">AR-argief</comment>
<generic-icon name="package-x-generic"/>
<magic priority="45">
<match type="string" value="&lt;ar&gt;" offset="0"/>
@@ -7711,120 +8042,161 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-arj">
<comment>ARJ archive</comment>
- <comment xml:lang="af">ARJ-argief</comment>
- <comment xml:lang="ar">أرشيف ARJ</comment>
- <comment xml:lang="az">ARJ arxivi</comment>
- <comment xml:lang="be-Latn">Archiŭ ARJ</comment>
- <comment xml:lang="bg">Архив — ARJ</comment>
- <comment xml:lang="ca">arxiu ARJ</comment>
- <comment xml:lang="cs">archiv ARJ</comment>
- <comment xml:lang="cy">Archif ARJ</comment>
- <comment xml:lang="da">ARJ-arkiv</comment>
- <comment xml:lang="de">ARJ-Archiv</comment>
- <comment xml:lang="el">Συμπιεσμένο αρχείο ARJ</comment>
- <comment xml:lang="en-GB">ARJ archive</comment>
- <comment xml:lang="eo">ARJ-arkivo</comment>
- <comment xml:lang="es">archivador ARJ</comment>
- <comment xml:lang="eu">ARJ artxiboa</comment>
- <comment xml:lang="fi">ARJ-arkisto</comment>
- <comment xml:lang="fo">ARJ skjalasavn</comment>
- <comment xml:lang="fr">archive ARJ</comment>
- <comment xml:lang="fur">archivi ARJ</comment>
- <comment xml:lang="ga">cartlann ARJ</comment>
- <comment xml:lang="gl">arquivo ARJ</comment>
- <comment xml:lang="he">ארכיון ARJ</comment>
- <comment xml:lang="hr">ARJ arhiva</comment>
- <comment xml:lang="hu">ARJ-archívum</comment>
- <comment xml:lang="ia">Archivo ARJ</comment>
- <comment xml:lang="id">Arsip ARJ</comment>
- <comment xml:lang="it">Archivio ARJ</comment>
- <comment xml:lang="ja">ARJ アーカイブ</comment>
- <comment xml:lang="ka">ARJ არქივი</comment>
- <comment xml:lang="kk">ARJ архиві</comment>
- <comment xml:lang="ko">ARJ 압축 파일</comment>
- <comment xml:lang="lt">ARJ archyvas</comment>
- <comment xml:lang="lv">ARJ arhīvs</comment>
- <comment xml:lang="ms">Arkib ARJ</comment>
- <comment xml:lang="nb">ARJ-arkiv</comment>
- <comment xml:lang="nl">ARJ-archief</comment>
- <comment xml:lang="nn">ARJ-arkiv</comment>
- <comment xml:lang="oc">archiu ARJ</comment>
- <comment xml:lang="pl">Archiwum ARJ</comment>
- <comment xml:lang="pt">arquivo ARJ</comment>
- <comment xml:lang="pt-BR">Pacote ARJ</comment>
- <comment xml:lang="ro">Arhivă ARJ</comment>
- <comment xml:lang="ru">Архив ARJ</comment>
- <comment xml:lang="sk">Archív ARJ</comment>
- <comment xml:lang="sl">Datoteka arhiva ARJ</comment>
- <comment xml:lang="sq">Arkiv ARJ</comment>
- <comment xml:lang="sr">АРЈ архива</comment>
- <comment xml:lang="sv">ARJ-arkiv</comment>
- <comment xml:lang="tr">ARJ arşivi</comment>
- <comment xml:lang="uk">архів ARJ</comment>
+ <comment xml:lang="zh_TW">ARJ 封存檔</comment>
+ <comment xml:lang="zh_CN">ARJ 归档文件</comment>
<comment xml:lang="vi">Kho nén ARJ</comment>
- <comment xml:lang="zh-CN">ARJ 归档文件</comment>
- <comment xml:lang="zh-TW">ARJ 封存檔</comment>
+ <comment xml:lang="uk">архів ARJ</comment>
+ <comment xml:lang="tr">ARJ arşivi</comment>
+ <comment xml:lang="sv">ARJ-arkiv</comment>
+ <comment xml:lang="sr">АРЈ архива</comment>
+ <comment xml:lang="sq">arkiv ARJ</comment>
+ <comment xml:lang="sl">Datoteka arhiva ARJ</comment>
+ <comment xml:lang="si">ARJ ලේඛනාගාරය</comment>
+ <comment xml:lang="sk">Archív ARJ</comment>
+ <comment xml:lang="ru">Архив ARJ</comment>
+ <comment xml:lang="ro">Arhivă ARJ</comment>
+ <comment xml:lang="pt_BR">Pacote ARJ</comment>
+ <comment xml:lang="pt">arquivo ARJ</comment>
+ <comment xml:lang="pl">Archiwum ARJ</comment>
+ <comment xml:lang="oc">archiu ARJ</comment>
+ <comment xml:lang="nn">ARJ-arkiv</comment>
+ <comment xml:lang="nl">ARJ-archief</comment>
+ <comment xml:lang="nb">ARJ-arkiv</comment>
+ <comment xml:lang="ms">Arkib ARJ</comment>
+ <comment xml:lang="lv">ARJ arhīvs</comment>
+ <comment xml:lang="lt">ARJ archyvas</comment>
+ <comment xml:lang="ko">ARJ 압축 파일</comment>
+ <comment xml:lang="kk">ARJ архиві</comment>
+ <comment xml:lang="ka">ARJ არქივი</comment>
+ <comment xml:lang="ja">ARJ アーカイブ</comment>
+ <comment xml:lang="it">Archivio ARJ</comment>
+ <comment xml:lang="is">ARJ safnskrá</comment>
+ <comment xml:lang="id">Arsip ARJ</comment>
+ <comment xml:lang="ia">Archivo ARJ</comment>
+ <comment xml:lang="hu">ARJ-archívum</comment>
+ <comment xml:lang="hr">ARJ arhiva</comment>
+ <comment xml:lang="he">ארכיון ARJ</comment>
+ <comment xml:lang="gl">arquivo ARJ</comment>
+ <comment xml:lang="ga">cartlann ARJ</comment>
+ <comment xml:lang="fur">archivi ARJ</comment>
+ <comment xml:lang="fr">archive ARJ</comment>
+ <comment xml:lang="fo">ARJ skjalasavn</comment>
+ <comment xml:lang="fi">ARJ-arkisto</comment>
+ <comment xml:lang="eu">ARJ artxiboa</comment>
+ <comment xml:lang="es">archivador ARJ</comment>
+ <comment xml:lang="eo">ARJ-arkivo</comment>
+ <comment xml:lang="en_GB">ARJ archive</comment>
+ <comment xml:lang="el">Συμπιεσμένο αρχείο ARJ</comment>
+ <comment xml:lang="de">ARJ-Archiv</comment>
+ <comment xml:lang="da">ARJ-arkiv</comment>
+ <comment xml:lang="cy">Archif ARJ</comment>
+ <comment xml:lang="cs">archiv ARJ</comment>
+ <comment xml:lang="ca">arxiu ARJ</comment>
+ <comment xml:lang="bg">Архив — ARJ</comment>
+ <comment xml:lang="be@latin">Archiŭ ARJ</comment>
+ <comment xml:lang="be">архіў ARJ</comment>
+ <comment xml:lang="az">ARJ arxivi</comment>
+ <comment xml:lang="ar">أرشيف ARJ</comment>
+ <comment xml:lang="af">ARJ-argief</comment>
<acronym>ARJ</acronym>
<expanded-acronym>Archived by Robert Jung</expanded-acronym>
<generic-icon name="package-x-generic"/>
- <magic priority="50">
+ <magic>
<match type="little16" value="0xea60" offset="0"/>
</magic>
<glob pattern="*.arj"/>
</mime-type>
+ <mime-type type="application/x-asar">
+ <comment>Electron Archive (ASAR)</comment>
+ <comment xml:lang="zh_CN">Electron 归档 (ASAR)</comment>
+ <comment xml:lang="uk">архів Electron (ASAR)</comment>
+ <comment xml:lang="tr">Electron Arşivi (ASAR)</comment>
+ <comment xml:lang="sv">Electron-arkiv (ASAR)</comment>
+ <comment xml:lang="sl">Arhiv Electron (ASAR)</comment>
+ <comment xml:lang="si">ඉලෙක්ට්‍රෝන ලේඛනාගාරය (ASAR)</comment>
+ <comment xml:lang="ru">Electron Archive (ASAR)</comment>
+ <comment xml:lang="pt_BR">Arquivo do Electron (ASAR)</comment>
+ <comment xml:lang="pl">Archiwum Electron (ASAR)</comment>
+ <comment xml:lang="nl">Electron Archive (ASAR)</comment>
+ <comment xml:lang="ko">일렉트론 묶음 파일 (ASAR)</comment>
+ <comment xml:lang="kk">Electron архиві (ASAR)</comment>
+ <comment xml:lang="ja">Electron アーカイブ (ASAR)</comment>
+ <comment xml:lang="it">Archivio Electron (ASAR)</comment>
+ <comment xml:lang="hr">Electron arhiva (ASAR)</comment>
+ <comment xml:lang="he">ארכיון Electron‏ (ASAR)</comment>
+ <comment xml:lang="gl">Arquivo Electron (ASAR)</comment>
+ <comment xml:lang="fi">Electron Archive (ASAR)</comment>
+ <comment xml:lang="eu">Electron artxiboa (ASAR)</comment>
+ <comment xml:lang="es">archivador Electron (ASARP)</comment>
+ <comment xml:lang="en_GB">Electron Archive (ASAR)</comment>
+ <comment xml:lang="de">Electron-Archiv (ASAR)</comment>
+ <comment xml:lang="be">архіў Electron (ASAR)</comment>
+ <comment xml:lang="ar">أرشيف إليكترون (ASAR)</comment>
+ <acronym>ASAR</acronym>
+ <expanded-acronym>Atom Shell Archive Format</expanded-acronym>
+ <magic>
+ <match type="string" value="\004\000\000\000" offset="0">
+ <match type="string" value="{&quot;files&quot;:" offset="16"/>
+ </match>
+ </magic>
+ <glob pattern="*.asar"/>
+ </mime-type>
<mime-type type="application/x-asp">
<comment>ASP page</comment>
- <comment xml:lang="af">ASP-bladsy</comment>
- <comment xml:lang="ar">صفحة ASP</comment>
- <comment xml:lang="ast">Páxina ASP</comment>
- <comment xml:lang="be-Latn">Staronka ASP</comment>
- <comment xml:lang="bg">Страница — ASP</comment>
- <comment xml:lang="ca">pàgina ASP</comment>
- <comment xml:lang="cs">stránka ASP</comment>
- <comment xml:lang="da">ASP-side</comment>
- <comment xml:lang="de">ASP-Seite</comment>
- <comment xml:lang="el">Σελίδα ASP</comment>
- <comment xml:lang="en-GB">ASP page</comment>
- <comment xml:lang="eo">ASP-paĝo</comment>
- <comment xml:lang="es">página ASP</comment>
- <comment xml:lang="eu">ASP orria</comment>
- <comment xml:lang="fi">ASP-sivu</comment>
- <comment xml:lang="fo">ASP síða</comment>
- <comment xml:lang="fr">page ASP</comment>
- <comment xml:lang="fur">pagjine ASP</comment>
- <comment xml:lang="ga">leathanach ASP</comment>
- <comment xml:lang="gl">páxina ASP</comment>
- <comment xml:lang="he">עמוד ASP</comment>
- <comment xml:lang="hr">ASP stranica</comment>
- <comment xml:lang="hu">ASP oldal</comment>
- <comment xml:lang="ia">Pagina ASP</comment>
- <comment xml:lang="id">Halaman ASP</comment>
- <comment xml:lang="it">Pagina ASP</comment>
- <comment xml:lang="ja">ASP ページ</comment>
- <comment xml:lang="ka">ASP გვერდი</comment>
- <comment xml:lang="kk">ASP парағы</comment>
- <comment xml:lang="ko">ASP 페이지</comment>
- <comment xml:lang="lt">ASP puslapis</comment>
- <comment xml:lang="lv">ASP lapa</comment>
- <comment xml:lang="nb">ASP-side</comment>
- <comment xml:lang="nl">ASP-pagina</comment>
- <comment xml:lang="nn">ASP-side</comment>
- <comment xml:lang="oc">pagina ASP</comment>
- <comment xml:lang="pl">Strona ASP</comment>
- <comment xml:lang="pt">página ASP</comment>
- <comment xml:lang="pt-BR">Página ASP</comment>
- <comment xml:lang="ro">Pagină ASP</comment>
- <comment xml:lang="ru">Страница ASP</comment>
- <comment xml:lang="sk">Stránka ASP</comment>
- <comment xml:lang="sl">Datoteka spletne strani ASP</comment>
- <comment xml:lang="sq">Faqe ASP</comment>
- <comment xml:lang="sr">АСП страница</comment>
- <comment xml:lang="sv">ASP-sida</comment>
- <comment xml:lang="tr">ASP sayfası</comment>
- <comment xml:lang="uk">сторінка ASP</comment>
+ <comment xml:lang="zh_TW">ASP 頁面</comment>
+ <comment xml:lang="zh_CN">ASP 页面</comment>
<comment xml:lang="vi">Trang ASP</comment>
- <comment xml:lang="zh-CN">ASP 页面</comment>
- <comment xml:lang="zh-TW">ASP 頁面</comment>
+ <comment xml:lang="uk">сторінка ASP</comment>
+ <comment xml:lang="tr">ASP sayfası</comment>
+ <comment xml:lang="sv">ASP-sida</comment>
+ <comment xml:lang="sr">АСП страница</comment>
+ <comment xml:lang="sq">faqe ASP</comment>
+ <comment xml:lang="sl">Datoteka spletne strani ASP</comment>
+ <comment xml:lang="si">ASP පිටුව</comment>
+ <comment xml:lang="sk">Stránka ASP</comment>
+ <comment xml:lang="ru">Страница ASP</comment>
+ <comment xml:lang="ro">Pagină ASP</comment>
+ <comment xml:lang="pt_BR">Página ASP</comment>
+ <comment xml:lang="pt">página ASP</comment>
+ <comment xml:lang="pl">Strona ASP</comment>
+ <comment xml:lang="oc">pagina ASP</comment>
+ <comment xml:lang="nn">ASP-side</comment>
+ <comment xml:lang="nl">ASP-pagina</comment>
+ <comment xml:lang="nb">ASP-side</comment>
+ <comment xml:lang="lv">ASP lapa</comment>
+ <comment xml:lang="lt">ASP puslapis</comment>
+ <comment xml:lang="ko">ASP 페이지</comment>
+ <comment xml:lang="kk">ASP парағы</comment>
+ <comment xml:lang="ka">ASP გვერდი</comment>
+ <comment xml:lang="ja">ASP ページ</comment>
+ <comment xml:lang="it">Pagina ASP</comment>
+ <comment xml:lang="is">ASP síða</comment>
+ <comment xml:lang="id">Halaman ASP</comment>
+ <comment xml:lang="ia">Pagina ASP</comment>
+ <comment xml:lang="hu">ASP oldal</comment>
+ <comment xml:lang="hr">ASP stranica</comment>
+ <comment xml:lang="he">עמוד ASP</comment>
+ <comment xml:lang="gl">páxina ASP</comment>
+ <comment xml:lang="ga">leathanach ASP</comment>
+ <comment xml:lang="fur">pagjine ASP</comment>
+ <comment xml:lang="fr">page ASP</comment>
+ <comment xml:lang="fo">ASP síða</comment>
+ <comment xml:lang="fi">ASP-sivu</comment>
+ <comment xml:lang="eu">ASP orria</comment>
+ <comment xml:lang="es">página ASP</comment>
+ <comment xml:lang="eo">ASP-paĝo</comment>
+ <comment xml:lang="en_GB">ASP page</comment>
+ <comment xml:lang="el">Σελίδα ASP</comment>
+ <comment xml:lang="de">ASP-Seite</comment>
+ <comment xml:lang="da">ASP-side</comment>
+ <comment xml:lang="cs">stránka ASP</comment>
+ <comment xml:lang="ca">pàgina ASP</comment>
+ <comment xml:lang="bg">Страница — ASP</comment>
+ <comment xml:lang="be@latin">Staronka ASP</comment>
+ <comment xml:lang="be">старонка ASP</comment>
+ <comment xml:lang="ast">Páxina ASP</comment>
+ <comment xml:lang="ar">صفحة ASP</comment>
+ <comment xml:lang="af">ASP-bladsy</comment>
<acronym>ASP</acronym>
<expanded-acronym>Active Server Page</expanded-acronym>
<sub-class-of type="text/plain"/>
@@ -7833,64 +8205,67 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-awk">
<comment>AWK script</comment>
- <comment xml:lang="af">AWK-skrip</comment>
- <comment xml:lang="ar">سكربت AWK</comment>
- <comment xml:lang="ast">Script AWK</comment>
- <comment xml:lang="az">AWK skripti</comment>
- <comment xml:lang="be-Latn">Skrypt AWK</comment>
- <comment xml:lang="bg">Скрипт — AWK</comment>
- <comment xml:lang="ca">script AWK</comment>
- <comment xml:lang="cs">skript AWK</comment>
- <comment xml:lang="cy">Sgript AWK</comment>
- <comment xml:lang="da">AWK-program</comment>
- <comment xml:lang="de">AWK-Skript</comment>
- <comment xml:lang="el">Δέσμη ενεργειών AWK</comment>
- <comment xml:lang="en-GB">AWK script</comment>
- <comment xml:lang="eo">AWK-skripto</comment>
- <comment xml:lang="es">secuencia de órdenes en AWK</comment>
- <comment xml:lang="eu">AWK script-a</comment>
- <comment xml:lang="fi">AWK-komentotiedosto</comment>
- <comment xml:lang="fo">AWK boðrøð</comment>
- <comment xml:lang="fr">script AWK</comment>
- <comment xml:lang="fur">script AWK</comment>
- <comment xml:lang="ga">script AWK</comment>
- <comment xml:lang="gl">script de AWK</comment>
- <comment xml:lang="he">תסריט AWK</comment>
- <comment xml:lang="hr">AWK skripta</comment>
- <comment xml:lang="hu">AWK-parancsfájl</comment>
- <comment xml:lang="ia">Script AWK</comment>
- <comment xml:lang="id">Skrip AWK</comment>
- <comment xml:lang="it">Script AWK</comment>
- <comment xml:lang="ja">AWK スクリプト</comment>
- <comment xml:lang="ka">AWK სცენარი</comment>
- <comment xml:lang="kk">AWK сценарийі</comment>
- <comment xml:lang="ko">AWK 스크립트</comment>
- <comment xml:lang="lt">AWK scenarijus</comment>
- <comment xml:lang="lv">AWK skripts</comment>
- <comment xml:lang="ms">Skrip AWK</comment>
- <comment xml:lang="nb">AWK-skript</comment>
- <comment xml:lang="nl">AWK-script</comment>
- <comment xml:lang="nn">WAK-skript</comment>
- <comment xml:lang="oc">escript AWK</comment>
- <comment xml:lang="pl">Skrypt AWK</comment>
- <comment xml:lang="pt">script AWK</comment>
- <comment xml:lang="pt-BR">Script AWK</comment>
- <comment xml:lang="ro">Script AWK</comment>
- <comment xml:lang="ru">Сценарий AWK</comment>
- <comment xml:lang="sk">Skript AWK</comment>
- <comment xml:lang="sl">Skriptna datoteka AWK</comment>
- <comment xml:lang="sq">Script AWK</comment>
- <comment xml:lang="sr">АВК скрипта</comment>
- <comment xml:lang="sv">AWK-skript</comment>
- <comment xml:lang="tr">AWK betiği</comment>
- <comment xml:lang="uk">скрипт AWK</comment>
+ <comment xml:lang="zh_TW">AWK 指令稿</comment>
+ <comment xml:lang="zh_CN">AWK 脚本</comment>
<comment xml:lang="vi">Văn lệnh AWK</comment>
- <comment xml:lang="zh-CN">AWK 脚本</comment>
- <comment xml:lang="zh-TW">AWK 指令稿</comment>
+ <comment xml:lang="uk">скрипт AWK</comment>
+ <comment xml:lang="tr">AWK betiği</comment>
+ <comment xml:lang="sv">AWK-skript</comment>
+ <comment xml:lang="sr">АВК скрипта</comment>
+ <comment xml:lang="sq">programth AWK</comment>
+ <comment xml:lang="sl">Skriptna datoteka AWK</comment>
+ <comment xml:lang="si">AWK පිටපත</comment>
+ <comment xml:lang="sk">Skript AWK</comment>
+ <comment xml:lang="ru">Сценарий AWK</comment>
+ <comment xml:lang="ro">Script AWK</comment>
+ <comment xml:lang="pt_BR">Script AWK</comment>
+ <comment xml:lang="pt">script AWK</comment>
+ <comment xml:lang="pl">Skrypt AWK</comment>
+ <comment xml:lang="oc">escript AWK</comment>
+ <comment xml:lang="nn">WAK-skript</comment>
+ <comment xml:lang="nl">AWK-script</comment>
+ <comment xml:lang="nb">AWK-skript</comment>
+ <comment xml:lang="ms">Skrip AWK</comment>
+ <comment xml:lang="lv">AWK skripts</comment>
+ <comment xml:lang="lt">AWK scenarijus</comment>
+ <comment xml:lang="ko">AWK 스크립트</comment>
+ <comment xml:lang="kk">AWK сценарийі</comment>
+ <comment xml:lang="ka">AWK სცენარი</comment>
+ <comment xml:lang="ja">AWK スクリプト</comment>
+ <comment xml:lang="it">Script AWK</comment>
+ <comment xml:lang="is">AWK skrifta</comment>
+ <comment xml:lang="id">Skrip AWK</comment>
+ <comment xml:lang="ia">Script AWK</comment>
+ <comment xml:lang="hu">AWK-parancsfájl</comment>
+ <comment xml:lang="hr">AWK skripta</comment>
+ <comment xml:lang="he">תסריט AWK</comment>
+ <comment xml:lang="gl">script de AWK</comment>
+ <comment xml:lang="ga">script AWK</comment>
+ <comment xml:lang="fur">script AWK</comment>
+ <comment xml:lang="fr">script AWK</comment>
+ <comment xml:lang="fo">AWK boðrøð</comment>
+ <comment xml:lang="fi">AWK-komentotiedosto</comment>
+ <comment xml:lang="eu">AWK script-a</comment>
+ <comment xml:lang="es">secuencia de órdenes en AWK</comment>
+ <comment xml:lang="eo">AWK-skripto</comment>
+ <comment xml:lang="en_GB">AWK script</comment>
+ <comment xml:lang="el">Δέσμη ενεργειών AWK</comment>
+ <comment xml:lang="de">AWK-Skript</comment>
+ <comment xml:lang="da">AWK-program</comment>
+ <comment xml:lang="cy">Sgript AWK</comment>
+ <comment xml:lang="cs">skript AWK</comment>
+ <comment xml:lang="ca">script AWK</comment>
+ <comment xml:lang="bg">Скрипт — AWK</comment>
+ <comment xml:lang="be@latin">Skrypt AWK</comment>
+ <comment xml:lang="be">скрыпт AWK</comment>
+ <comment xml:lang="az">AWK skripti</comment>
+ <comment xml:lang="ast">Script AWK</comment>
+ <comment xml:lang="ar">سكربت AWK</comment>
+ <comment xml:lang="af">AWK-skrip</comment>
<sub-class-of type="application/x-executable"/>
<sub-class-of type="text/plain"/>
<generic-icon name="text-x-script"/>
- <magic priority="50">
+ <magic>
<match type="string" value="#!/bin/gawk" offset="0"/>
<match type="string" value="#! /bin/gawk" offset="0"/>
<match type="string" value="#!/usr/bin/gawk" offset="0"/>
@@ -7905,61 +8280,33 @@ command to generate the output files.
<glob pattern="*.awk"/>
</mime-type>
<mime-type type="application/x-bcpio">
- <comment>BCPIO document</comment>
- <comment xml:lang="af">BCPIO-dokument</comment>
- <comment xml:lang="ar">مستند BCPIO</comment>
- <comment xml:lang="ast">Documentu BCPIO</comment>
- <comment xml:lang="az">BCPIO sənədi</comment>
- <comment xml:lang="be-Latn">Dakument BCPIO</comment>
- <comment xml:lang="bg">Документ — BCPIO</comment>
- <comment xml:lang="ca">document BCPIO</comment>
- <comment xml:lang="cs">dokument BCPIO</comment>
- <comment xml:lang="cy">Dogfen BCPIO</comment>
- <comment xml:lang="da">BCPIO-dokument</comment>
- <comment xml:lang="de">BCPIO-Dokument</comment>
- <comment xml:lang="el">Έγγραφο BCPIO</comment>
- <comment xml:lang="en-GB">BCPIO document</comment>
- <comment xml:lang="eo">BCPIO-dokumento</comment>
- <comment xml:lang="es">documento BCPIO</comment>
- <comment xml:lang="eu">BCPIO dokumentua</comment>
- <comment xml:lang="fi">BCPIO-asiakirja</comment>
- <comment xml:lang="fo">BCPIO skjal</comment>
- <comment xml:lang="fr">document BCPIO</comment>
- <comment xml:lang="fur">document BCPIO</comment>
- <comment xml:lang="ga">cáipéis BCPIO</comment>
- <comment xml:lang="gl">documento BCPIO</comment>
- <comment xml:lang="he">מסמך של BCPO</comment>
- <comment xml:lang="hr">BCPIO dokument</comment>
- <comment xml:lang="hu">BCPIO-dokumentum</comment>
- <comment xml:lang="ia">Documento BCPIO</comment>
- <comment xml:lang="id">Dokumen BCPIO</comment>
- <comment xml:lang="it">Documento BCPIO</comment>
- <comment xml:lang="ja">BCPIO ドキュメント</comment>
- <comment xml:lang="ka">BCPIO-ის დოკუმენტი</comment>
- <comment xml:lang="kk">BCPIO құжаты</comment>
- <comment xml:lang="ko">BCPIO 문서</comment>
- <comment xml:lang="lt">BCPIO dokumentas</comment>
- <comment xml:lang="lv">BCPIO dokuments</comment>
- <comment xml:lang="ms">Dokumen BCPIO</comment>
- <comment xml:lang="nb">BCPIO-dokument</comment>
- <comment xml:lang="nl">BCPIO-document</comment>
- <comment xml:lang="nn">BCPIO-dokument</comment>
- <comment xml:lang="oc">document BCPIO</comment>
- <comment xml:lang="pl">Dokument BCPIO</comment>
- <comment xml:lang="pt">documento BCPIO</comment>
- <comment xml:lang="pt-BR">Documento BCPIO</comment>
- <comment xml:lang="ro">Document BCPIO</comment>
- <comment xml:lang="ru">Документ BCPIO</comment>
- <comment xml:lang="sk">Dokument BCPIO</comment>
- <comment xml:lang="sl">Dokument BCPIO</comment>
- <comment xml:lang="sq">Dokument BCPIO</comment>
- <comment xml:lang="sr">БЦПИО документ</comment>
- <comment xml:lang="sv">BCPIO-dokument</comment>
- <comment xml:lang="tr">BCPIO belgesi</comment>
- <comment xml:lang="uk">документ BCPIO</comment>
- <comment xml:lang="vi">Tài liệu BCPIO</comment>
- <comment xml:lang="zh-CN">BCPIO 文档</comment>
- <comment xml:lang="zh-TW">BCPIO 文件</comment>
+ <comment>BCPIO archive</comment>
+ <comment xml:lang="zh_CN">BCPIO 归档</comment>
+ <comment xml:lang="uk">архів BCPIO</comment>
+ <comment xml:lang="tr">BCPIO arşivi</comment>
+ <comment xml:lang="sv">BCPIO-arkiv</comment>
+ <comment xml:lang="sl">Arhiv BCPIO</comment>
+ <comment xml:lang="si">BCPIO ලේඛනාගාරය</comment>
+ <comment xml:lang="sk">Archív BCPIO</comment>
+ <comment xml:lang="ru">Архив BCPIO</comment>
+ <comment xml:lang="pt_BR">Arquivo BCPIO</comment>
+ <comment xml:lang="pl">Archiwum BCPIO</comment>
+ <comment xml:lang="oc">archiu BCPIO</comment>
+ <comment xml:lang="nl">BCPIO-archief</comment>
+ <comment xml:lang="ko">BCPIO 묶음 파일</comment>
+ <comment xml:lang="kk">BCPIO архиві</comment>
+ <comment xml:lang="ja">BCPIO アーカイブ</comment>
+ <comment xml:lang="it">Archivio BCPIO</comment>
+ <comment xml:lang="hr">BCPIO arhiva</comment>
+ <comment xml:lang="he">ארכיון BCPIO</comment>
+ <comment xml:lang="gl">Arquivo BCPIO</comment>
+ <comment xml:lang="fi">BCPIO-arkisto</comment>
+ <comment xml:lang="eu">BCPIO artxiboa</comment>
+ <comment xml:lang="es">archivador BCPIO</comment>
+ <comment xml:lang="en_GB">BCPIO archive</comment>
+ <comment xml:lang="de">BCPIO-Archiv</comment>
+ <comment xml:lang="be">архіў BCPIO</comment>
+ <comment xml:lang="ar">أرشيف BCPIO</comment>
<acronym>BCPIO</acronym>
<expanded-acronym>Binary CPIO</expanded-acronym>
<generic-icon name="package-x-generic"/>
@@ -7967,624 +8314,323 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-bittorrent">
<comment>BitTorrent seed file</comment>
- <comment xml:lang="af">BitTorrent-saadlêer</comment>
- <comment xml:lang="ar">ملف باذر البت تورنت</comment>
- <comment xml:lang="az">BitTorrent seed faylı</comment>
- <comment xml:lang="be-Latn">Fajł krynicy BitTorrent</comment>
- <comment xml:lang="bg">Файл-източник — BitTorrent</comment>
- <comment xml:lang="ca">fitxer de llavor BitTorrent</comment>
- <comment xml:lang="cs">soubor BitTorrent</comment>
- <comment xml:lang="cy">Ffeil hadu BitTorrent</comment>
- <comment xml:lang="da">BitTorrent-frøfil</comment>
- <comment xml:lang="de">BitTorrent-Seed-Datei</comment>
- <comment xml:lang="el">Αρχείο BitTorrent seed</comment>
- <comment xml:lang="en-GB">BitTorrent seed file</comment>
- <comment xml:lang="eo">BitTorrent-semdosiero</comment>
- <comment xml:lang="es">archivo semilla de BitTorrent</comment>
- <comment xml:lang="eu">BitTorrent hazi-fitxategia</comment>
- <comment xml:lang="fi">BitTorrent-siementiedosto</comment>
- <comment xml:lang="fo">BitTorrent seed fíla</comment>
- <comment xml:lang="fr">fichier graine BitTorrent</comment>
- <comment xml:lang="fur">file semence di BitTorrent</comment>
- <comment xml:lang="ga">comhad síl BitTorrent</comment>
- <comment xml:lang="gl">ficheiro de orixe BitTorrent</comment>
- <comment xml:lang="he">קובץ זריעה של BitTorrent</comment>
- <comment xml:lang="hr">BitTorrent datoteka</comment>
- <comment xml:lang="hu">BitTorrent-magfájl</comment>
- <comment xml:lang="ia">File seminal de BitTorrent</comment>
- <comment xml:lang="id">Berkas benih BitTorrent</comment>
- <comment xml:lang="it">File seed BitTorrent</comment>
- <comment xml:lang="ja">BitTorrent シードファイル</comment>
- <comment xml:lang="kk">BitTorrent көз файлы</comment>
- <comment xml:lang="ko">비트토렌트 시드 파일</comment>
- <comment xml:lang="lt">BitTorrent šaltinio failas</comment>
- <comment xml:lang="lv">BitTorrent avota datne</comment>
- <comment xml:lang="ms">Fail seed BitTorrent</comment>
- <comment xml:lang="nb">Fil med utgangsverdi for BitTorrent</comment>
- <comment xml:lang="nl">BitTorrent-bestand</comment>
- <comment xml:lang="nn">Nedlastingsfil for BitTorrent</comment>
- <comment xml:lang="oc">fichièr grana BitTorrent</comment>
- <comment xml:lang="pl">Plik ziarna BitTorrent</comment>
- <comment xml:lang="pt">ficheiro de semente BitTorrent</comment>
- <comment xml:lang="pt-BR">Arquivo semente BitTorrent</comment>
- <comment xml:lang="ro">Fișier sursă-completă BitTorrent</comment>
- <comment xml:lang="ru">Файл источника BitTorrent</comment>
- <comment xml:lang="sk">Súbor BitTorrent</comment>
- <comment xml:lang="sl">Datoteka sejanja BitTorrent</comment>
- <comment xml:lang="sq">File bazë BitTorrent</comment>
- <comment xml:lang="sr">датотека сејача Бит Торента</comment>
- <comment xml:lang="sv">BitTorrent-distributionsfil</comment>
- <comment xml:lang="tr">BitTorrent tohum dosyası</comment>
- <comment xml:lang="uk">файл поширення BitTorrent</comment>
+ <comment xml:lang="zh_TW">BitTorrent 種子檔</comment>
+ <comment xml:lang="zh_CN">BitTorrent 种子文件</comment>
<comment xml:lang="vi">Tải tập hạt BitTorrent</comment>
- <comment xml:lang="zh-CN">BitTorrent 种子文件</comment>
- <comment xml:lang="zh-TW">BitTorrent 種子檔</comment>
- <magic priority="50">
+ <comment xml:lang="uk">файл поширення BitTorrent</comment>
+ <comment xml:lang="tr">BitTorrent tohum dosyası</comment>
+ <comment xml:lang="sv">BitTorrent-distributionsfil</comment>
+ <comment xml:lang="sr">датотека сејача Бит Торента</comment>
+ <comment xml:lang="sq">kartelë seed BitTorrent</comment>
+ <comment xml:lang="sl">Datoteka sejanja BitTorrent</comment>
+ <comment xml:lang="si">BitTorrent බීජ ගොනුව</comment>
+ <comment xml:lang="sk">Súbor BitTorrent</comment>
+ <comment xml:lang="ru">Файл источника BitTorrent</comment>
+ <comment xml:lang="ro">Fișier sursă-completă BitTorrent</comment>
+ <comment xml:lang="pt_BR">Arquivo semente BitTorrent</comment>
+ <comment xml:lang="pt">ficheiro de semente BitTorrent</comment>
+ <comment xml:lang="pl">Plik ziarna BitTorrent</comment>
+ <comment xml:lang="oc">fichièr grana BitTorrent</comment>
+ <comment xml:lang="nn">Nedlastingsfil for BitTorrent</comment>
+ <comment xml:lang="nl">BitTorrent-bestand</comment>
+ <comment xml:lang="nb">Fil med utgangsverdi for BitTorrent</comment>
+ <comment xml:lang="ms">Fail seed BitTorrent</comment>
+ <comment xml:lang="lv">BitTorrent avota datne</comment>
+ <comment xml:lang="lt">BitTorrent šaltinio failas</comment>
+ <comment xml:lang="ko">비트토렌트 시드 파일</comment>
+ <comment xml:lang="kk">BitTorrent көз файлы</comment>
+ <comment xml:lang="ja">BitTorrent シードファイル</comment>
+ <comment xml:lang="it">File seed BitTorrent</comment>
+ <comment xml:lang="is">BitTorrent sáningarskrá</comment>
+ <comment xml:lang="id">Berkas benih BitTorrent</comment>
+ <comment xml:lang="ia">File seminal de BitTorrent</comment>
+ <comment xml:lang="hu">BitTorrent-magfájl</comment>
+ <comment xml:lang="hr">BitTorrent datoteka</comment>
+ <comment xml:lang="he">קובץ זריעה של BitTorrent</comment>
+ <comment xml:lang="gl">ficheiro de orixe BitTorrent</comment>
+ <comment xml:lang="ga">comhad síl BitTorrent</comment>
+ <comment xml:lang="fur">file semence di BitTorrent</comment>
+ <comment xml:lang="fr">fichier graine BitTorrent</comment>
+ <comment xml:lang="fo">BitTorrent seed fíla</comment>
+ <comment xml:lang="fi">BitTorrent-siementiedosto</comment>
+ <comment xml:lang="eu">BitTorrent hazi-fitxategia</comment>
+ <comment xml:lang="es">archivo semilla de BitTorrent</comment>
+ <comment xml:lang="eo">BitTorrent-semdosiero</comment>
+ <comment xml:lang="en_GB">BitTorrent seed file</comment>
+ <comment xml:lang="el">Αρχείο BitTorrent seed</comment>
+ <comment xml:lang="de">BitTorrent-Startdatei</comment>
+ <comment xml:lang="da">BitTorrent-frøfil</comment>
+ <comment xml:lang="cy">Ffeil hadu BitTorrent</comment>
+ <comment xml:lang="cs">soubor BitTorrent</comment>
+ <comment xml:lang="ca">fitxer de llavor BitTorrent</comment>
+ <comment xml:lang="bg">Файл-източник — BitTorrent</comment>
+ <comment xml:lang="be@latin">Fajł krynicy BitTorrent</comment>
+ <comment xml:lang="be">файл раздачы BitTorrent</comment>
+ <comment xml:lang="az">BitTorrent seed faylı</comment>
+ <comment xml:lang="ar">ملف باذر بت تورنت</comment>
+ <comment xml:lang="af">BitTorrent-saadlêer</comment>
+ <magic>
<match type="string" value="d8:announce" offset="0"/>
</magic>
<glob pattern="*.torrent"/>
</mime-type>
<mime-type type="application/x-blender">
<comment>Blender scene</comment>
- <comment xml:lang="af">Blender-toneel</comment>
- <comment xml:lang="ar">مشهد بلندر</comment>
- <comment xml:lang="ast">Escena de Blender</comment>
- <comment xml:lang="be-Latn">Scena Blender</comment>
- <comment xml:lang="bg">Сцена — Blender</comment>
- <comment xml:lang="ca">escena de Blender</comment>
- <comment xml:lang="cs">scéna Blender</comment>
- <comment xml:lang="da">Blenderscene</comment>
- <comment xml:lang="de">Blender-Szene</comment>
- <comment xml:lang="el">Σκηνή Blender</comment>
- <comment xml:lang="en-GB">Blender scene</comment>
- <comment xml:lang="eo">Blender-sceno</comment>
- <comment xml:lang="es">escena de Blender</comment>
- <comment xml:lang="eu">Blender-eko fitxategia</comment>
- <comment xml:lang="fi">Blender-näkymä</comment>
- <comment xml:lang="fo">Blender leikmynd</comment>
- <comment xml:lang="fr">scène Blender</comment>
- <comment xml:lang="fur">sene Blender</comment>
- <comment xml:lang="ga">radharc Blender</comment>
- <comment xml:lang="gl">escena de Blender</comment>
- <comment xml:lang="he">סצנת Blender</comment>
- <comment xml:lang="hr">Blender scena</comment>
- <comment xml:lang="hu">Blender-jelenet</comment>
- <comment xml:lang="ia">Scena Blender</comment>
- <comment xml:lang="id">Scene Blender</comment>
- <comment xml:lang="it">Scena Blender</comment>
- <comment xml:lang="ja">Blender シーン</comment>
- <comment xml:lang="ka">Blender-ის სცენა</comment>
- <comment xml:lang="kk">Blender сахнасы</comment>
- <comment xml:lang="ko">Blender 장면</comment>
- <comment xml:lang="lt">Blender scena</comment>
- <comment xml:lang="lv">Blender aina</comment>
- <comment xml:lang="ms">Babak Blender</comment>
- <comment xml:lang="nb">Blender-scene</comment>
- <comment xml:lang="nl">Blender-scène</comment>
- <comment xml:lang="nn">Blender-scene</comment>
- <comment xml:lang="oc">scèna Blender</comment>
- <comment xml:lang="pl">Scena programu Blender</comment>
- <comment xml:lang="pt">cenário Blender</comment>
- <comment xml:lang="pt-BR">Cena do Blender</comment>
- <comment xml:lang="ro">Scenă Blender</comment>
- <comment xml:lang="ru">Сцена Blender</comment>
- <comment xml:lang="sk">Scéna Blender</comment>
- <comment xml:lang="sl">Datoteka scene Blender</comment>
- <comment xml:lang="sq">Skenë Blender</comment>
- <comment xml:lang="sr">Блендерова сцена</comment>
- <comment xml:lang="sv">Blender-scen</comment>
- <comment xml:lang="tr">Blender sahnesi</comment>
- <comment xml:lang="uk">сцена Blender</comment>
+ <comment xml:lang="zh_TW">Blender 場景</comment>
+ <comment xml:lang="zh_CN">Blender 场景</comment>
<comment xml:lang="vi">Cảnh Blender</comment>
- <comment xml:lang="zh-CN">Blender 场景</comment>
- <comment xml:lang="zh-TW">Blender 場景</comment>
+ <comment xml:lang="uk">сцена Blender</comment>
+ <comment xml:lang="tr">Blender sahnesi</comment>
+ <comment xml:lang="sv">Blender-scen</comment>
+ <comment xml:lang="sr">Блендерова сцена</comment>
+ <comment xml:lang="sq">skenë Blender</comment>
+ <comment xml:lang="sl">Datoteka scene Blender</comment>
+ <comment xml:lang="si">බ්ලෙන්ඩර් දර්ශනය</comment>
+ <comment xml:lang="sk">Scéna Blender</comment>
+ <comment xml:lang="ru">Сцена Blender</comment>
+ <comment xml:lang="ro">Scenă Blender</comment>
+ <comment xml:lang="pt_BR">Cena do Blender</comment>
+ <comment xml:lang="pt">cenário Blender</comment>
+ <comment xml:lang="pl">Scena programu Blender</comment>
+ <comment xml:lang="oc">scèna Blender</comment>
+ <comment xml:lang="nn">Blender-scene</comment>
+ <comment xml:lang="nl">Blender-scène</comment>
+ <comment xml:lang="nb">Blender-scene</comment>
+ <comment xml:lang="ms">Babak Blender</comment>
+ <comment xml:lang="lv">Blender aina</comment>
+ <comment xml:lang="lt">Blender scena</comment>
+ <comment xml:lang="ko">Blender 장면</comment>
+ <comment xml:lang="kk">Blender сахнасы</comment>
+ <comment xml:lang="ka">Blender-ის სცენა</comment>
+ <comment xml:lang="ja">Blender シーン</comment>
+ <comment xml:lang="it">Scena Blender</comment>
+ <comment xml:lang="is">Blender sviðsmynd</comment>
+ <comment xml:lang="id">Scene Blender</comment>
+ <comment xml:lang="ia">Scena Blender</comment>
+ <comment xml:lang="hu">Blender-jelenet</comment>
+ <comment xml:lang="hr">Blender scena</comment>
+ <comment xml:lang="he">סצנת Blender</comment>
+ <comment xml:lang="gl">escena de Blender</comment>
+ <comment xml:lang="ga">radharc Blender</comment>
+ <comment xml:lang="fur">sene Blender</comment>
+ <comment xml:lang="fr">scène Blender</comment>
+ <comment xml:lang="fo">Blender leikmynd</comment>
+ <comment xml:lang="fi">Blender-näkymä</comment>
+ <comment xml:lang="eu">Blender-eko fitxategia</comment>
+ <comment xml:lang="es">escena de Blender</comment>
+ <comment xml:lang="eo">Blender-sceno</comment>
+ <comment xml:lang="en_GB">Blender scene</comment>
+ <comment xml:lang="el">Σκηνή Blender</comment>
+ <comment xml:lang="de">Blender-Szene</comment>
+ <comment xml:lang="da">Blenderscene</comment>
+ <comment xml:lang="cs">scéna Blender</comment>
+ <comment xml:lang="ca">escena de Blender</comment>
+ <comment xml:lang="bg">Сцена — Blender</comment>
+ <comment xml:lang="be@latin">Scena Blender</comment>
+ <comment xml:lang="be">сцэна Blender</comment>
+ <comment xml:lang="ast">Escena de Blender</comment>
+ <comment xml:lang="ar">مشهد بلندر</comment>
+ <comment xml:lang="af">Blender-toneel</comment>
<generic-icon name="image-x-generic"/>
- <glob pattern="*.blender"/>
<glob pattern="*.blend"/>
<glob pattern="*.BLEND"/>
- <magic priority="50">
+ <glob pattern="*.blender"/>
+ <magic>
<match type="string" value="BLENDER" offset="0"/>
</magic>
</mime-type>
<mime-type type="application/x-bzdvi">
- <comment>TeX DVI document (bzip-compressed)</comment>
- <comment xml:lang="af">TeX DVI-dokument (bzip-saamgepers)</comment>
- <comment xml:lang="ar">مستند TeX DVI (مضغوط-bzip)</comment>
- <comment xml:lang="ast">Documentu Tex DVI (comprimíu en bzip)</comment>
- <comment xml:lang="be-Latn">Dakument TeX DVI (bzip-skampresavany)</comment>
- <comment xml:lang="bg">Документ — TeX DVI, компресиран с bzip</comment>
- <comment xml:lang="ca">document de TeX DVI (amb compressió bzip)</comment>
- <comment xml:lang="cs">dokument TeX DVI (komprimovaný pomocí bzip)</comment>
- <comment xml:lang="da">TeX DVI-dokument (bzip-komprimeret)</comment>
- <comment xml:lang="de">TeX-DVI-Dokument (bzip-komprimiert)</comment>
- <comment xml:lang="el">Αρχείο TeX DVI (συμπιεσμένο με bzip)</comment>
- <comment xml:lang="en-GB">TeX DVI document (bzip-compressed)</comment>
- <comment xml:lang="es">documento DVI de TeX (comprimido con bzip)</comment>
- <comment xml:lang="eu">TeX DVI dokumentua (bzip-ekin konprimitua)</comment>
- <comment xml:lang="fi">TeX DVI -asiakirja (bzip-pakattu)</comment>
- <comment xml:lang="fo">TeX DVI skjal (bzip-stappað)</comment>
- <comment xml:lang="fr">document DVI TeX (compressé bzip)</comment>
- <comment xml:lang="fur">document DVI TeX (comprimût cun bzip)</comment>
- <comment xml:lang="ga">cáipéis DVI TeX (comhbhrúite le bzip)</comment>
- <comment xml:lang="gl">documento DVI de TeX (comprimido con bzip)</comment>
- <comment xml:lang="he">מסמך מסוג TeX DVI (מכווץ ע״י bzip)</comment>
- <comment xml:lang="hr">TeX DVI dokument (bzip sažeto)</comment>
- <comment xml:lang="hu">TeX DVI dokumentum (bzip tömörítésű)</comment>
- <comment xml:lang="ia">Documento TeX DVI (comprimite con bzip)</comment>
- <comment xml:lang="id">Dokumen TeX DVI (terkompresi bzip)</comment>
- <comment xml:lang="it">Documento TeX DVI (compresso con bzip)</comment>
- <comment xml:lang="ja">Tex DVI ドキュメント (bzip 圧縮)</comment>
- <comment xml:lang="kk">TeX DVI құжаты (bzip-пен сығылған)</comment>
- <comment xml:lang="ko">TeX DVI 문서(BZIP 압축)</comment>
- <comment xml:lang="lt">TeX DVI dokumentas (suglaudintas su bzip)</comment>
- <comment xml:lang="lv">TeX DVI dokuments (saspiests ar bzip)</comment>
- <comment xml:lang="nb">TeX DVI-dokument (bzip-komprimert)</comment>
- <comment xml:lang="nl">TeX DVI-document (ingepakt met bzip)</comment>
- <comment xml:lang="nn">TeX DVI-dokument (pakka med bzip)</comment>
- <comment xml:lang="oc">document DVI TeX (compressat bzip)</comment>
- <comment xml:lang="pl">Dokument TeX DVI (kompresja bzip)</comment>
- <comment xml:lang="pt">documento TeX DVI (compressão bzip)</comment>
- <comment xml:lang="pt-BR">Documento DVI TeX (compactado com bzip)</comment>
- <comment xml:lang="ro">Document TeX DVI (comprimat bzip)</comment>
- <comment xml:lang="ru">Документ TeX DVI (сжатый bzip)</comment>
- <comment xml:lang="sk">Dokument TeX DVI (komprimovaný pomocou bzip)</comment>
- <comment xml:lang="sl">Dokument TeX DVI (stisnjen z bzip)</comment>
- <comment xml:lang="sq">Dokument Tex DVI (i kompresuar me bzip)</comment>
- <comment xml:lang="sr">ТеКс ДВИ документ (запакована бзипом)</comment>
- <comment xml:lang="sv">TeX DVI-dokument (bzip-komprimerat)</comment>
- <comment xml:lang="tr">TeX DVI belgesi (bzip ile sıkıştırılmış)</comment>
- <comment xml:lang="uk">документ TeX DVI (стиснений bzip)</comment>
- <comment xml:lang="vi">Tài liệu DVI TeX (đã nén bzip)</comment>
- <comment xml:lang="zh-CN">TeX DVI 文档(gzip 压缩)</comment>
- <comment xml:lang="zh-TW">TeX DVI 文件 (bzip 壓縮)</comment>
- <sub-class-of type="application/x-bzip"/>
+ <comment>TeX DVI document (bzip2-compressed)</comment>
+ <comment xml:lang="uk">документ DVI TeX (стиснений bzip2)</comment>
+ <comment xml:lang="sv">TeX DVI-dokument (bzip2-komprimerat)</comment>
+ <comment xml:lang="ru">Документ DVI издательской системы TeX (сжатый bzip2)</comment>
+ <comment xml:lang="pt_BR">Documento DVI TeX (compactado com bzip2)</comment>
+ <comment xml:lang="pl">Dokument TeX DVI (kompresja bzip2)</comment>
+ <comment xml:lang="es">documento DVI de TeX (comprimido con BZIP2)</comment>
+ <comment xml:lang="de">TeX-DVI-Dokument (bzip2-komprimiert)</comment>
+ <sub-class-of type="application/x-bzip2"/>
<generic-icon name="x-office-document"/>
<glob pattern="*.dvi.bz2"/>
</mime-type>
- <mime-type type="application/x-bzip">
- <comment>Bzip archive</comment>
- <comment xml:lang="af">Bzip-argief</comment>
- <comment xml:lang="ar">أرشيف Bzip</comment>
- <comment xml:lang="ast">Archivu Bzip</comment>
- <comment xml:lang="be-Latn">Archiŭ bzip</comment>
- <comment xml:lang="bg">Архив — bzip</comment>
- <comment xml:lang="ca">arxiu bzip</comment>
- <comment xml:lang="cs">archiv bzip</comment>
- <comment xml:lang="da">Bzip-arkiv</comment>
- <comment xml:lang="de">Bzip-Archiv</comment>
- <comment xml:lang="el">Συμπιεσμένο αρχείο Bzip</comment>
- <comment xml:lang="en-GB">Bzip archive</comment>
- <comment xml:lang="eo">Bzip-arkivo</comment>
- <comment xml:lang="es">archivador Bzip</comment>
- <comment xml:lang="eu">Bzip artxiboa</comment>
- <comment xml:lang="fi">Bzip-arkisto</comment>
- <comment xml:lang="fo">Bzip skjalasavn</comment>
- <comment xml:lang="fr">archive bzip</comment>
- <comment xml:lang="fur">archivi Bzip</comment>
- <comment xml:lang="ga">cartlann Bzip</comment>
- <comment xml:lang="gl">arquivo Bzip</comment>
- <comment xml:lang="he">ארכיון Bzip</comment>
- <comment xml:lang="hr">Bzip arhiva</comment>
- <comment xml:lang="hu">Bzip archívum</comment>
- <comment xml:lang="ia">Archivo Bzip</comment>
- <comment xml:lang="id">Arsip Bzip</comment>
- <comment xml:lang="it">Archivio bzip</comment>
- <comment xml:lang="ja">Bzip アーカイブ</comment>
- <comment xml:lang="ka">Bzip არქივი</comment>
- <comment xml:lang="kk">Bzip архиві</comment>
- <comment xml:lang="ko">BZIP 압축 파일</comment>
- <comment xml:lang="lt">Bzip archyvas</comment>
- <comment xml:lang="lv">Bzip arhīvs</comment>
- <comment xml:lang="nb">Bzip-arkiv</comment>
- <comment xml:lang="nl">Bzip-archief</comment>
- <comment xml:lang="nn">Bzip-arkiv</comment>
- <comment xml:lang="oc">archiu bzip</comment>
- <comment xml:lang="pl">Archiwum bzip</comment>
- <comment xml:lang="pt">arquivo Bzip</comment>
- <comment xml:lang="pt-BR">Pacote Bzip</comment>
- <comment xml:lang="ro">Arhivă Bzip</comment>
- <comment xml:lang="ru">Архив BZIP</comment>
- <comment xml:lang="sk">Archív Bzip</comment>
- <comment xml:lang="sl">Datoteka arhiva Bzip</comment>
- <comment xml:lang="sq">Arkiv bzip</comment>
- <comment xml:lang="sr">Бзип архива</comment>
- <comment xml:lang="sv">Bzip-arkiv</comment>
- <comment xml:lang="tr">Bzip arşivi</comment>
- <comment xml:lang="uk">архів bzip</comment>
- <comment xml:lang="vi">Kho nén bzip</comment>
- <comment xml:lang="zh-CN">Bzip 归档文件</comment>
- <comment xml:lang="zh-TW">Bzip 封存檔</comment>
+ <mime-type type="application/x-bzip1">
+ <comment>Bzip1 archive</comment>
+ <comment xml:lang="uk">архів bzip1</comment>
+ <comment xml:lang="sv">Bzip1-arkiv</comment>
+ <comment xml:lang="ru">Архив Bzip1</comment>
+ <comment xml:lang="pl">Archiwum bzip1</comment>
+ <comment xml:lang="es">archivador BZIP1</comment>
+ <comment xml:lang="de">Bzip1-Archiv</comment>
<generic-icon name="package-x-generic"/>
- <magic priority="50">
+ <magic>
+ <match type="string" value="BZ0" offset="0"/>
+ </magic>
+ <glob pattern="*.bz"/>
+ </mime-type>
+ <mime-type type="application/x-bzip1-compressed-tar">
+ <comment>Tar archive (bzip1-compressed)</comment>
+ <comment xml:lang="uk">архів tar (стиснений bzip1)</comment>
+ <comment xml:lang="sv">Tar-arkiv (bzip1-komprimerat)</comment>
+ <comment xml:lang="ru">Архив Tar (сжатый bzip1)</comment>
+ <comment xml:lang="pl">Archiwum tar (kompresja bzip1)</comment>
+ <comment xml:lang="es">archivador TAR (comprimido con BZIP1)</comment>
+ <comment xml:lang="de">Tar-Archiv (bzip1-komprimiert)</comment>
+ <generic-icon name="package-x-generic"/>
+ <sub-class-of type="application/x-bzip1"/>
+ <glob pattern="*.tar.bz"/>
+ <glob pattern="*.tbz"/>
+ </mime-type>
+ <mime-type type="application/x-bzip2">
+ <comment>Bzip2 archive</comment>
+ <comment xml:lang="uk">архів bzip2</comment>
+ <comment xml:lang="sv">Bzip2-arkiv</comment>
+ <comment xml:lang="ru">Архив Bzip2</comment>
+ <comment xml:lang="pt_BR">Pacote Bzip2</comment>
+ <comment xml:lang="pl">Archiwum bzip2</comment>
+ <comment xml:lang="it">Archivio bzip2</comment>
+ <comment xml:lang="gl">Arquivo Bzip2</comment>
+ <comment xml:lang="eu">Bzip2 artxiboa</comment>
+ <comment xml:lang="es">archivador BZIP2</comment>
+ <comment xml:lang="de">Bzip2-Archiv</comment>
+ <comment xml:lang="be">архіў bzip2</comment>
+ <generic-icon name="package-x-generic"/>
+ <magic>
<match type="string" value="BZh" offset="0"/>
</magic>
<glob pattern="*.bz2"/>
- <glob pattern="*.bz"/>
- <alias type="application/x-bzip2"/>
<alias type="application/bzip2"/>
- </mime-type>
- <mime-type type="application/x-bzip-compressed-tar">
- <comment>Tar archive (bzip-compressed)</comment>
- <comment xml:lang="af">Tar-argief (bzip-saamgepers)</comment>
- <comment xml:lang="ar">أرشيف Tar (مضغوط-bzip)</comment>
- <comment xml:lang="ast">Archivu Tar (comprimíu en bzip)</comment>
- <comment xml:lang="be-Latn">Archiŭ tar (bzip-skampresavany)</comment>
- <comment xml:lang="bg">Архив — tar, компресиран с bzip</comment>
- <comment xml:lang="ca">arxiu tar (amb compressió bzip)</comment>
- <comment xml:lang="cs">archiv Tar (komprimovaný pomocí bzip)</comment>
- <comment xml:lang="da">Tar-arkiv (bzip-komprimeret)</comment>
- <comment xml:lang="de">Tar-Archiv (bzip-komprimiert)</comment>
- <comment xml:lang="el">Αρχείο Tar (συμπιεσμένο με bzip)</comment>
- <comment xml:lang="en-GB">Tar archive (bzip-compressed)</comment>
- <comment xml:lang="es">archivador Tar (comprimido con bzip)</comment>
- <comment xml:lang="eu">Tar artxiboa (bzip-ekin konprimitua)</comment>
- <comment xml:lang="fi">Tar-arkisto (bzip-pakattu)</comment>
- <comment xml:lang="fo">Tar skjalasavn (bzip-stappað)</comment>
- <comment xml:lang="fr">archive tar (compressée bzip)</comment>
- <comment xml:lang="fur">archivi Tar (comprimût cun bzip)</comment>
- <comment xml:lang="ga">cartlann Tar (comhbhrúite le bzip)</comment>
- <comment xml:lang="gl">arquivo Tar (comprimido con bzip)</comment>
- <comment xml:lang="he">ארכיון Tar (מכווץ ע״י bzip)</comment>
- <comment xml:lang="hr">Tar arhiva (bzip sažeto)</comment>
- <comment xml:lang="hu">Tar archívum (bzip tömörítésű)</comment>
- <comment xml:lang="ia">Archivo Tar (comprimite con bzip)</comment>
- <comment xml:lang="id">Arsip Tar (terkompresi bzip)</comment>
- <comment xml:lang="it">Archivio tar (compresso con bzip)</comment>
- <comment xml:lang="ja">Tar アーカイブ (bzip 圧縮)</comment>
- <comment xml:lang="kk">Tar архиві (bzip-пен сығылған)</comment>
- <comment xml:lang="ko">TAR 묶음 파일(BZIP 압축)</comment>
- <comment xml:lang="lt">Tar archyvas (suglaudintas su bzip)</comment>
- <comment xml:lang="lv">Tar arhīvs (saspiests ar bzip)</comment>
- <comment xml:lang="nb">Tar-arkiv (bzip-komprimert)</comment>
- <comment xml:lang="nl">Tar-archief (ingepakt met bzip)</comment>
- <comment xml:lang="nn">Tar-arkiv (pakka med bzip)</comment>
- <comment xml:lang="oc">archiu tar (compressat bzip)</comment>
- <comment xml:lang="pl">Archiwum tar (kompresja bzip)</comment>
- <comment xml:lang="pt">arquivo Tar (compressão bzip)</comment>
- <comment xml:lang="pt-BR">Pacote Tar (compactado com bzip)</comment>
- <comment xml:lang="ro">Arhivă Tar (comprimată bzip)</comment>
- <comment xml:lang="ru">Архив TAR (сжатый bzip)</comment>
- <comment xml:lang="sk">Archív Tar (komprimovaný pomocou bzip)</comment>
- <comment xml:lang="sl">Datoteka arhiva Tar (stisnjen z bzip)</comment>
- <comment xml:lang="sq">Arkiv tar (i kompresuar me bzip)</comment>
- <comment xml:lang="sr">Тар архива (запакована бзипом)</comment>
- <comment xml:lang="sv">Tar-arkiv (bzip-komprimerat)</comment>
- <comment xml:lang="tr">Tar arşivi (bzip ile sıkıştırılmış)</comment>
- <comment xml:lang="uk">архів tar (стиснений bzip)</comment>
- <comment xml:lang="vi">Kho nén tar (đã nén bzip)</comment>
- <comment xml:lang="zh-CN">Tar 归档文件(bzip 压缩)</comment>
- <comment xml:lang="zh-TW">Tar 封存檔 (bzip 壓縮)</comment>
+ <alias type="application/x-bzip"/>
+ </mime-type>
+ <mime-type type="application/x-bzip2-compressed-tar">
+ <comment>Tar archive (bzip2-compressed)</comment>
+ <comment xml:lang="uk">архів tar (стиснений bzip2)</comment>
+ <comment xml:lang="sv">Tar-arkiv (bzip2-komprimerat)</comment>
+ <comment xml:lang="ru">Архив Tar (сжатый bzip2)</comment>
+ <comment xml:lang="pl">Archiwum tar (kompresja bzip2)</comment>
+ <comment xml:lang="es">archivador TAR (comprimido con BZIP2)</comment>
+ <comment xml:lang="de">Tar-Archiv (bzip2-komprimiert)</comment>
<generic-icon name="package-x-generic"/>
- <sub-class-of type="application/x-bzip"/>
+ <sub-class-of type="application/x-bzip2"/>
<glob pattern="*.tar.bz2"/>
- <glob pattern="*.tar.bz"/>
<glob pattern="*.tbz2"/>
- <glob pattern="*.tbz"/>
<glob pattern="*.tb2"/>
+ <alias type="application/x-bzip-compressed-tar"/>
+ </mime-type>
+ <mime-type type="application/x-bzip3">
+ <comment>Bzip3 archive</comment>
+ <comment xml:lang="uk">архів bzip3</comment>
+ <comment xml:lang="sv">Bzip3-arkiv</comment>
+ <comment xml:lang="ru">Архив Bzip3</comment>
+ <comment xml:lang="pl">Archiwum bzip3</comment>
+ <comment xml:lang="it">Archivio bzip3</comment>
+ <comment xml:lang="gl">Arquivo Bzip3</comment>
+ <comment xml:lang="eu">Bzip3 artxiboa</comment>
+ <comment xml:lang="es">archivador BZIP3</comment>
+ <comment xml:lang="de">Bzip3-Archiv</comment>
+ <comment xml:lang="be">архіў bzip3</comment>
+ <generic-icon name="package-x-generic"/>
+ <magic>
+ <match type="string" value="BZ3v1" offset="0"/>
+ </magic>
+ <glob pattern="*.bz3"/>
+ </mime-type>
+ <mime-type type="application/x-bzip3-compressed-tar">
+ <comment>Tar archive (bzip3-compressed)</comment>
+ <comment xml:lang="uk">архів tar (стиснений bzip3)</comment>
+ <comment xml:lang="sv">Tar-arkiv (bzip3-komprimerat)</comment>
+ <comment xml:lang="ru">TAR Архив (сжатый bzip3)</comment>
+ <comment xml:lang="pl">Archiwum tar (kompresja bzip3)</comment>
+ <comment xml:lang="it">Archivio tar (compresso con bzip3)</comment>
+ <comment xml:lang="gl">Arquivo Tar (comprimido con bzip3)</comment>
+ <comment xml:lang="eu">Tar artxiboa (bzip3-compressed)</comment>
+ <comment xml:lang="es">archivador TAR (comprimido con BZIP3)</comment>
+ <comment xml:lang="de">Tar-Archiv (bzip3-komprimiert)</comment>
+ <comment xml:lang="be">архіў tar (сцісканне bzip3)</comment>
+ <generic-icon name="package-x-generic"/>
+ <sub-class-of type="application/x-bzip3"/>
+ <glob pattern="*.tar.bz3"/>
+ <glob pattern="*.tbz3"/>
</mime-type>
<mime-type type="application/x-bzpdf">
- <comment>PDF document (bzip-compressed)</comment>
- <comment xml:lang="af">PDF-dokument (bzip-saamgepers)</comment>
- <comment xml:lang="ar">مستند PDF (مضغوط-bzip)</comment>
- <comment xml:lang="ast">Documentu PDF (comprimíu en bzip)</comment>
- <comment xml:lang="be-Latn">Dakument PDF (bzip-skampresavany)</comment>
- <comment xml:lang="bg">Документ — PDF, компресиран с bzip</comment>
- <comment xml:lang="ca">document PDF (amb compressió bzip)</comment>
- <comment xml:lang="cs">dokument PDF (komprimovaný pomocí bzip)</comment>
- <comment xml:lang="da">PDF-dokument (bzip-komprimeret)</comment>
- <comment xml:lang="de">PDF-Dokument (bzip-komprimiert)</comment>
- <comment xml:lang="el">Έγγραφο PDF (συμπιεσμένο με bzip)</comment>
- <comment xml:lang="en-GB">PDF document (bzip-compressed)</comment>
- <comment xml:lang="es">documento PDF (comprimido con bzip)</comment>
- <comment xml:lang="eu">PostScript dokumentua (bzip-ekin konprimitua)</comment>
- <comment xml:lang="fi">PDF-asiakirja (bzip-pakattu)</comment>
- <comment xml:lang="fo">PDF skjal (bzip-stappað)</comment>
- <comment xml:lang="fr">document PDF (compressé bzip)</comment>
- <comment xml:lang="fur">document PDF (comprimût cun bzip)</comment>
- <comment xml:lang="ga">cáipéis PDF (comhbhrúite le bzip)</comment>
- <comment xml:lang="gl">documento PDF (comprimido en bzip)</comment>
- <comment xml:lang="he">מסמך PDF (מכווץ ע״י bzip)</comment>
- <comment xml:lang="hr">PDF dokument (bzip sažet)</comment>
- <comment xml:lang="hu">PDF dokumentum (bzip tömörítésű)</comment>
- <comment xml:lang="ia">Documento PDF (comprimite con bzip)</comment>
- <comment xml:lang="id">Dokumen PDF (terkompresi bzip)</comment>
- <comment xml:lang="it">Documento PDF (compresso con bzip)</comment>
- <comment xml:lang="ja">PDF ドキュメント (bzip 圧縮)</comment>
- <comment xml:lang="kk">PDF құжаты (bzip-пен сығылған)</comment>
- <comment xml:lang="ko">PDF 문서(BZIP 압축)</comment>
- <comment xml:lang="lt">PDF dokumentas (suglaudintas su bzip)</comment>
- <comment xml:lang="lv">PDF dokuments (saspiests ar bzip)</comment>
- <comment xml:lang="nb">PDF-dokument (bzip-komprimert)</comment>
- <comment xml:lang="nl">PDF-document (ingepakt met bzip)</comment>
- <comment xml:lang="nn">PDF-dokument (pakka med bzip)</comment>
- <comment xml:lang="oc">document PDF (compressat bzip)</comment>
- <comment xml:lang="pl">Dokument PDF (kompresja bzip)</comment>
- <comment xml:lang="pt">documento PDF (compressão bzip)</comment>
- <comment xml:lang="pt-BR">Documento PDF (compactado com bzip)</comment>
- <comment xml:lang="ro">Document PDF (comprimat bzip)</comment>
- <comment xml:lang="ru">Документ PDF (сжатый bzip)</comment>
- <comment xml:lang="sk">Dokument PDF (komprimovaný pomocou bzip)</comment>
- <comment xml:lang="sl">Dokument PDF (stisnjen z bzip)</comment>
- <comment xml:lang="sq">Dokument PDF (i kompresuar me bzip)</comment>
- <comment xml:lang="sr">ПДФ документ (запакован бзипом)</comment>
- <comment xml:lang="sv">PDF-dokument (bzip-komprimerat)</comment>
- <comment xml:lang="tr">PDF belgesi (bzip ile sıkıştırılmış)</comment>
- <comment xml:lang="uk">документ PDF (стиснений bzip)</comment>
- <comment xml:lang="vi">Tài liệu PDF (đã nén bzip)</comment>
- <comment xml:lang="zh-CN">PDF 文档(bzip 压缩)</comment>
- <comment xml:lang="zh-TW">PDF 文件 (bzip 壓縮)</comment>
- <sub-class-of type="application/x-bzip"/>
+ <comment>PDF document (bzip2-compressed)</comment>
+ <comment xml:lang="uk">документ PDF (стиснений bzip2)</comment>
+ <comment xml:lang="sv">PDF-dokument (bzip2-komprimerat)</comment>
+ <comment xml:lang="ru">Документ PDF (сжатый bzip2)</comment>
+ <comment xml:lang="pl">Dokument PDF (kompresja bzip2)</comment>
+ <comment xml:lang="es">documento PDF (comprimido con BZIP2)</comment>
+ <comment xml:lang="de">PDF-Dokument (bzip2-komprimiert)</comment>
+ <sub-class-of type="application/x-bzip2"/>
<generic-icon name="x-office-document"/>
<glob pattern="*.pdf.bz2"/>
</mime-type>
<mime-type type="application/x-bzpostscript">
- <comment>PostScript document (bzip-compressed)</comment>
- <comment xml:lang="af">PostScript-dokument (bzip-saamgepers)</comment>
- <comment xml:lang="ar">مستند PostScript (مضغوط-bzip)</comment>
- <comment xml:lang="ast">Documentu PostScript (comprimíu en bzip)</comment>
- <comment xml:lang="be-Latn">Dakument PostScript (bzip-skampresavany)</comment>
- <comment xml:lang="bg">Документ — PostScript, компресиран с bzip</comment>
- <comment xml:lang="ca">document PostScript (amb compressió bzip)</comment>
- <comment xml:lang="cs">dokument PostScript (komprimovaný pomocí bzip)</comment>
- <comment xml:lang="da">PostScript-dokument (bzip-komprimeret)</comment>
- <comment xml:lang="de">PostScript-Dokument (bzip-komprimiert)</comment>
- <comment xml:lang="el">Έγγραφο PostScript (συμπιεσμένο με bzip)</comment>
- <comment xml:lang="en-GB">PostScript document (bzip-compressed)</comment>
- <comment xml:lang="es">documento PostScript (comprimido con bzip)</comment>
- <comment xml:lang="eu">PostScript dokumentua (bzip-ekin konprimitua)</comment>
- <comment xml:lang="fi">PostScript-asiakirja (bzip-pakattu)</comment>
- <comment xml:lang="fo">PostScript skjal (bzip-stappað)</comment>
- <comment xml:lang="fr">document PostScript (compressé bzip)</comment>
- <comment xml:lang="fur">document PostScript (comprimût cun bzip)</comment>
- <comment xml:lang="ga">cáipéis PostScript (comhbhrúite le bzip)</comment>
- <comment xml:lang="gl">documento PostScript (comprimido con bzip)</comment>
- <comment xml:lang="he">מסמך PostDcript (מכווץ ע״י bzip)</comment>
- <comment xml:lang="hr">PostScript dokument (bzip sažet)</comment>
- <comment xml:lang="hu">PostScript dokumentum (bzip tömörítésű)</comment>
- <comment xml:lang="ia">Documento PostScript (comprimite con bzip)</comment>
- <comment xml:lang="id">Dokumen PostScript (terkompresi bzip)</comment>
- <comment xml:lang="it">Documento PostScript (compresso con bzip)</comment>
- <comment xml:lang="ja">PostScript ドキュメント (bzip 圧縮)</comment>
- <comment xml:lang="kk">PostScript құжаты (bzip-пен сығылған)</comment>
- <comment xml:lang="ko">PostScript 문서(BZIP 압축)</comment>
- <comment xml:lang="lt">PostScript dokumentas (suglaudintas su bzip)</comment>
- <comment xml:lang="lv">PostScript dokuments (saspiests ar bzip)</comment>
- <comment xml:lang="nb">PostScript-dokument (bzip-komprimert)</comment>
- <comment xml:lang="nl">PostScript-document (ingepakt met bzip)</comment>
- <comment xml:lang="nn">PostScript-dokument (pakka med bzip)</comment>
- <comment xml:lang="oc">document PostEscript (compressat bzip)</comment>
- <comment xml:lang="pl">Dokument PostScript (kompresja bzip)</comment>
- <comment xml:lang="pt">documento PostScript (compressão bzip)</comment>
- <comment xml:lang="pt-BR">Documento PostScript (compactado com bzip)</comment>
- <comment xml:lang="ro">Document PostScript (comprimat bzip)</comment>
- <comment xml:lang="ru">Документ PostScript (сжатый bzip)</comment>
- <comment xml:lang="sk">Dokument PostScript (komprimovaný pomocou bzip)</comment>
- <comment xml:lang="sl">Dokument PostScript (stisnjen z bzip)</comment>
- <comment xml:lang="sq">Dokument PostScript (i kompresuar me bzip)</comment>
- <comment xml:lang="sr">Постскрипт документ (запакован бзипом)</comment>
- <comment xml:lang="sv">Postscript-dokument (bzip-komprimerat)</comment>
- <comment xml:lang="tr">PostScript belgesi (bzip ile sıkıştırılmış)</comment>
- <comment xml:lang="uk">документ PostScript (стиснене bzip)</comment>
- <comment xml:lang="vi">Tài liệu PostScript (đã nén bzip)</comment>
- <comment xml:lang="zh-CN">PostScript 文档(bzip 压缩)</comment>
- <comment xml:lang="zh-TW">PostScript 文件 (bzip 壓縮)</comment>
- <sub-class-of type="application/x-bzip"/>
+ <comment>PostScript document (bzip2-compressed)</comment>
+ <comment xml:lang="uk">документ PostScript (стиснений bzip2)</comment>
+ <comment xml:lang="sv">Postscript-dokument (bzip2-komprimerat)</comment>
+ <comment xml:lang="ru">Документ PostScript (сжатый bzip2)</comment>
+ <comment xml:lang="pl">Dokument PostScript (kompresja bzip2)</comment>
+ <comment xml:lang="es">documento PostScript (comprimido con BZIP2)</comment>
+ <comment xml:lang="de">PostScript-Dokument (bzip2-komprimiert)</comment>
+ <sub-class-of type="application/x-bzip2"/>
<generic-icon name="x-office-document"/>
<glob pattern="*.ps.bz2"/>
</mime-type>
<mime-type type="application/vnd.comicbook-rar">
- <comment>comic book archive</comment>
- <comment xml:lang="af">strokiesprent-argief</comment>
- <comment xml:lang="ar">أرشيف comic book</comment>
- <comment xml:lang="be-Latn">archiŭ komiksaŭ</comment>
- <comment xml:lang="bg">Архив — комикси</comment>
- <comment xml:lang="ca">arxiu comic book</comment>
- <comment xml:lang="cs">archiv knihy komiksů</comment>
- <comment xml:lang="da">comic book-arkiv</comment>
- <comment xml:lang="de">Comic-Book-Archiv</comment>
- <comment xml:lang="el">Συμπιεσμένο αρχείο κόμικ</comment>
- <comment xml:lang="en-GB">comic book archive</comment>
- <comment xml:lang="es">archivador de libro de cómic</comment>
- <comment xml:lang="eu">komiki artxiboa</comment>
- <comment xml:lang="fi">sarjakuva-arkisto</comment>
- <comment xml:lang="fo">teknisøgubóka skjalasavn</comment>
- <comment xml:lang="fr">archive Comic Book</comment>
- <comment xml:lang="fur">archivi di fumets</comment>
- <comment xml:lang="ga">cartlann chartúin</comment>
- <comment xml:lang="gl">ficheiro de libro de banda deseñada</comment>
- <comment xml:lang="he">ארכיון ספר קומי</comment>
- <comment xml:lang="hr">Strip arhiva</comment>
- <comment xml:lang="hu">képregényarchívum</comment>
- <comment xml:lang="ia">Archivo Comic Book</comment>
- <comment xml:lang="id">arsip buku komik</comment>
- <comment xml:lang="it">Archivio comic book</comment>
- <comment xml:lang="ja">コミックブックアーカイブ</comment>
- <comment xml:lang="kk">комикстар архиві</comment>
- <comment xml:lang="ko">만화책 압축 파일</comment>
- <comment xml:lang="lt">komiksų knygos archyvas</comment>
- <comment xml:lang="lv">komiksu grāmatas arhīvs</comment>
- <comment xml:lang="nb">Tegneseriearkiv</comment>
- <comment xml:lang="nl">stripboek-archief</comment>
- <comment xml:lang="nn">teikneseriearkiv</comment>
- <comment xml:lang="oc">archiu Comic Book</comment>
- <comment xml:lang="pl">Archiwum komiksu</comment>
- <comment xml:lang="pt">arquivo de banda desenhada</comment>
- <comment xml:lang="pt-BR">Pacote de histórias em quadrinhos</comment>
- <comment xml:lang="ro">arhivă benzi desenate</comment>
- <comment xml:lang="ru">Архив комиксов</comment>
- <comment xml:lang="sk">Archív knihy komiksov</comment>
- <comment xml:lang="sl">Datoteka arhiva stripov</comment>
- <comment xml:lang="sq">Arkiv comic book</comment>
- <comment xml:lang="sr">архива стрипа</comment>
- <comment xml:lang="sv">serietidningsarkiv</comment>
- <comment xml:lang="tr">çizgi roman arşivi</comment>
- <comment xml:lang="uk">архів коміксів</comment>
- <comment xml:lang="vi">Kho nén sách tranh chuyện vui</comment>
- <comment xml:lang="zh-CN">漫画书归档文件</comment>
- <comment xml:lang="zh-TW">漫畫書封存檔</comment>
+ <comment>Comic book archive (rar container)</comment>
+ <comment xml:lang="uk">архів коміксів (контейнер rar)</comment>
+ <comment xml:lang="sv">Serietidningsarkiv (rar-behållare)</comment>
+ <comment xml:lang="ru">Архив комиксов (rar-контейнер)</comment>
+ <comment xml:lang="pl">Archiwum komiksu (kontener RAR)</comment>
+ <comment xml:lang="it">Archivio comic book (contenitore rar)</comment>
+ <comment xml:lang="gl">Arquivo de libro de banda deseñada (contedor rar)</comment>
+ <comment xml:lang="es">archivador de libro de historietas (contenedor RAR)</comment>
+ <comment xml:lang="de">Comic-Book-Archiv (rar-Container)</comment>
+ <comment xml:lang="be">архіў comic book (кантэйнер rar)</comment>
<sub-class-of type="application/vnd.rar"/>
<generic-icon name="x-office-document"/>
<glob pattern="*.cbr"/>
<alias type="application/x-cbr"/>
</mime-type>
<mime-type type="application/x-cb7">
- <comment>comic book archive</comment>
- <comment xml:lang="af">strokiesprent-argief</comment>
- <comment xml:lang="ar">أرشيف comic book</comment>
- <comment xml:lang="be-Latn">archiŭ komiksaŭ</comment>
- <comment xml:lang="bg">Архив — комикси</comment>
- <comment xml:lang="ca">arxiu comic book</comment>
- <comment xml:lang="cs">archiv knihy komiksů</comment>
- <comment xml:lang="da">comic book-arkiv</comment>
- <comment xml:lang="de">Comic-Book-Archiv</comment>
- <comment xml:lang="el">Συμπιεσμένο αρχείο κόμικ</comment>
- <comment xml:lang="en-GB">comic book archive</comment>
- <comment xml:lang="es">archivador de libro de cómic</comment>
- <comment xml:lang="eu">komiki artxiboa</comment>
- <comment xml:lang="fi">sarjakuva-arkisto</comment>
- <comment xml:lang="fo">teknisøgubóka skjalasavn</comment>
- <comment xml:lang="fr">archive Comic Book</comment>
- <comment xml:lang="fur">archivi di fumets</comment>
- <comment xml:lang="ga">cartlann chartúin</comment>
- <comment xml:lang="gl">ficheiro de libro de banda deseñada</comment>
- <comment xml:lang="he">ארכיון ספר קומי</comment>
- <comment xml:lang="hr">Strip arhiva</comment>
- <comment xml:lang="hu">képregényarchívum</comment>
- <comment xml:lang="ia">Archivo Comic Book</comment>
- <comment xml:lang="id">arsip buku komik</comment>
- <comment xml:lang="it">Archivio comic book</comment>
- <comment xml:lang="ja">コミックブックアーカイブ</comment>
- <comment xml:lang="kk">комикстар архиві</comment>
- <comment xml:lang="ko">만화책 압축 파일</comment>
- <comment xml:lang="lt">komiksų knygos archyvas</comment>
- <comment xml:lang="lv">komiksu grāmatas arhīvs</comment>
- <comment xml:lang="nb">Tegneseriearkiv</comment>
- <comment xml:lang="nl">stripboek-archief</comment>
- <comment xml:lang="nn">teikneseriearkiv</comment>
- <comment xml:lang="oc">archiu Comic Book</comment>
- <comment xml:lang="pl">Archiwum komiksu</comment>
- <comment xml:lang="pt">arquivo de banda desenhada</comment>
- <comment xml:lang="pt-BR">Pacote de histórias em quadrinhos</comment>
- <comment xml:lang="ro">arhivă benzi desenate</comment>
- <comment xml:lang="ru">Архив комиксов</comment>
- <comment xml:lang="sk">Archív knihy komiksov</comment>
- <comment xml:lang="sl">Datoteka arhiva stripov</comment>
- <comment xml:lang="sq">Arkiv comic book</comment>
- <comment xml:lang="sr">архива стрипа</comment>
- <comment xml:lang="sv">serietidningsarkiv</comment>
- <comment xml:lang="tr">çizgi roman arşivi</comment>
- <comment xml:lang="uk">архів коміксів</comment>
- <comment xml:lang="vi">Kho nén sách tranh chuyện vui</comment>
- <comment xml:lang="zh-CN">漫画书归档文件</comment>
- <comment xml:lang="zh-TW">漫畫書封存檔</comment>
+ <comment>Comic book archive (7z container)</comment>
+ <comment xml:lang="uk">архів коміксів (контейнер 7z)</comment>
+ <comment xml:lang="sv">Serietidningsarkiv (7z-behållare)</comment>
+ <comment xml:lang="ru">Архив комиксов (7z-контейнер)</comment>
+ <comment xml:lang="pl">Archiwum komiksu (kontener 7z)</comment>
+ <comment xml:lang="it">Archivio comic book (contenitore 7z)</comment>
+ <comment xml:lang="gl">Arquivo de libro de banda deseñada (contedor 7z)</comment>
+ <comment xml:lang="es">archivador de libro de historietas (contenedor 7Z)</comment>
+ <comment xml:lang="de">Comic-Book-Archiv (7z-Container)</comment>
+ <comment xml:lang="be">архіў comic book (кантэйнер 7z)</comment>
<sub-class-of type="application/x-7z-compressed"/>
<generic-icon name="x-office-document"/>
<glob pattern="*.cb7"/>
</mime-type>
<mime-type type="application/x-cbt">
- <comment>comic book archive</comment>
- <comment xml:lang="af">strokiesprent-argief</comment>
- <comment xml:lang="ar">أرشيف comic book</comment>
- <comment xml:lang="be-Latn">archiŭ komiksaŭ</comment>
- <comment xml:lang="bg">Архив — комикси</comment>
- <comment xml:lang="ca">arxiu comic book</comment>
- <comment xml:lang="cs">archiv knihy komiksů</comment>
- <comment xml:lang="da">comic book-arkiv</comment>
- <comment xml:lang="de">Comic-Book-Archiv</comment>
- <comment xml:lang="el">Συμπιεσμένο αρχείο κόμικ</comment>
- <comment xml:lang="en-GB">comic book archive</comment>
- <comment xml:lang="es">archivador de libro de cómic</comment>
- <comment xml:lang="eu">komiki artxiboa</comment>
- <comment xml:lang="fi">sarjakuva-arkisto</comment>
- <comment xml:lang="fo">teknisøgubóka skjalasavn</comment>
- <comment xml:lang="fr">archive Comic Book</comment>
- <comment xml:lang="fur">archivi di fumets</comment>
- <comment xml:lang="ga">cartlann chartúin</comment>
- <comment xml:lang="gl">ficheiro de libro de banda deseñada</comment>
- <comment xml:lang="he">ארכיון ספר קומי</comment>
- <comment xml:lang="hr">Strip arhiva</comment>
- <comment xml:lang="hu">képregényarchívum</comment>
- <comment xml:lang="ia">Archivo Comic Book</comment>
- <comment xml:lang="id">arsip buku komik</comment>
- <comment xml:lang="it">Archivio comic book</comment>
- <comment xml:lang="ja">コミックブックアーカイブ</comment>
- <comment xml:lang="kk">комикстар архиві</comment>
- <comment xml:lang="ko">만화책 압축 파일</comment>
- <comment xml:lang="lt">komiksų knygos archyvas</comment>
- <comment xml:lang="lv">komiksu grāmatas arhīvs</comment>
- <comment xml:lang="nb">Tegneseriearkiv</comment>
- <comment xml:lang="nl">stripboek-archief</comment>
- <comment xml:lang="nn">teikneseriearkiv</comment>
- <comment xml:lang="oc">archiu Comic Book</comment>
- <comment xml:lang="pl">Archiwum komiksu</comment>
- <comment xml:lang="pt">arquivo de banda desenhada</comment>
- <comment xml:lang="pt-BR">Pacote de histórias em quadrinhos</comment>
- <comment xml:lang="ro">arhivă benzi desenate</comment>
- <comment xml:lang="ru">Архив комиксов</comment>
- <comment xml:lang="sk">Archív knihy komiksov</comment>
- <comment xml:lang="sl">Datoteka arhiva stripov</comment>
- <comment xml:lang="sq">Arkiv comic book</comment>
- <comment xml:lang="sr">архива стрипа</comment>
- <comment xml:lang="sv">serietidningsarkiv</comment>
- <comment xml:lang="tr">çizgi roman arşivi</comment>
- <comment xml:lang="uk">архів коміксів</comment>
- <comment xml:lang="vi">Kho nén sách tranh chuyện vui</comment>
- <comment xml:lang="zh-CN">漫画书归档文件</comment>
- <comment xml:lang="zh-TW">漫畫書封存檔</comment>
+ <comment>Comic book archive (tar container)</comment>
+ <comment xml:lang="uk">архів коміксів (контейнер tar)</comment>
+ <comment xml:lang="sv">Serietidningsarkiv (tar-behållare)</comment>
+ <comment xml:lang="ru">Архив комиксов (tar-контейнер)</comment>
+ <comment xml:lang="pl">Archiwum komiksu (kontener tar)</comment>
+ <comment xml:lang="it">Archivio comic book (contenitore tar)</comment>
+ <comment xml:lang="gl">Arquivo de libro de banda deseñada (contedor tar)</comment>
+ <comment xml:lang="es">archivador de libro de historietas (contenedor TAR)</comment>
+ <comment xml:lang="de">Comic-Book-Archiv (tar-Container)</comment>
+ <comment xml:lang="be">архіў comic book (кантэйнер tar)</comment>
<sub-class-of type="application/x-tar"/>
<generic-icon name="x-office-document"/>
<glob pattern="*.cbt"/>
</mime-type>
<mime-type type="application/vnd.comicbook+zip">
- <comment>comic book archive</comment>
- <comment xml:lang="af">strokiesprent-argief</comment>
- <comment xml:lang="ar">أرشيف comic book</comment>
- <comment xml:lang="be-Latn">archiŭ komiksaŭ</comment>
- <comment xml:lang="bg">Архив — комикси</comment>
- <comment xml:lang="ca">arxiu comic book</comment>
- <comment xml:lang="cs">archiv knihy komiksů</comment>
- <comment xml:lang="da">comic book-arkiv</comment>
- <comment xml:lang="de">Comic-Book-Archiv</comment>
- <comment xml:lang="el">Συμπιεσμένο αρχείο κόμικ</comment>
- <comment xml:lang="en-GB">comic book archive</comment>
- <comment xml:lang="es">archivador de libro de cómic</comment>
- <comment xml:lang="eu">komiki artxiboa</comment>
- <comment xml:lang="fi">sarjakuva-arkisto</comment>
- <comment xml:lang="fo">teknisøgubóka skjalasavn</comment>
- <comment xml:lang="fr">archive Comic Book</comment>
- <comment xml:lang="fur">archivi di fumets</comment>
- <comment xml:lang="ga">cartlann chartúin</comment>
- <comment xml:lang="gl">ficheiro de libro de banda deseñada</comment>
- <comment xml:lang="he">ארכיון ספר קומי</comment>
- <comment xml:lang="hr">Strip arhiva</comment>
- <comment xml:lang="hu">képregényarchívum</comment>
- <comment xml:lang="ia">Archivo Comic Book</comment>
- <comment xml:lang="id">arsip buku komik</comment>
- <comment xml:lang="it">Archivio comic book</comment>
- <comment xml:lang="ja">コミックブックアーカイブ</comment>
- <comment xml:lang="kk">комикстар архиві</comment>
- <comment xml:lang="ko">만화책 압축 파일</comment>
- <comment xml:lang="lt">komiksų knygos archyvas</comment>
- <comment xml:lang="lv">komiksu grāmatas arhīvs</comment>
- <comment xml:lang="nb">Tegneseriearkiv</comment>
- <comment xml:lang="nl">stripboek-archief</comment>
- <comment xml:lang="nn">teikneseriearkiv</comment>
- <comment xml:lang="oc">archiu Comic Book</comment>
- <comment xml:lang="pl">Archiwum komiksu</comment>
- <comment xml:lang="pt">arquivo de banda desenhada</comment>
- <comment xml:lang="pt-BR">Pacote de histórias em quadrinhos</comment>
- <comment xml:lang="ro">arhivă benzi desenate</comment>
- <comment xml:lang="ru">Архив комиксов</comment>
- <comment xml:lang="sk">Archív knihy komiksov</comment>
- <comment xml:lang="sl">Datoteka arhiva stripov</comment>
- <comment xml:lang="sq">Arkiv comic book</comment>
- <comment xml:lang="sr">архива стрипа</comment>
- <comment xml:lang="sv">serietidningsarkiv</comment>
- <comment xml:lang="tr">çizgi roman arşivi</comment>
- <comment xml:lang="uk">архів коміксів</comment>
- <comment xml:lang="vi">Kho nén sách tranh chuyện vui</comment>
- <comment xml:lang="zh-CN">漫画书归档文件</comment>
- <comment xml:lang="zh-TW">漫畫書封存檔</comment>
+ <comment>Comic book archive (zip container)</comment>
+ <comment xml:lang="uk">архів коміксів (контейнер zip)</comment>
+ <comment xml:lang="sv">Serietidningsarkiv (zip-behållare)</comment>
+ <comment xml:lang="ru">Архив комиксов (zip-контейнер)</comment>
+ <comment xml:lang="pl">Archiwum komiksu (kontener ZIP)</comment>
+ <comment xml:lang="it">Archivio comic book (contenitore zip)</comment>
+ <comment xml:lang="gl">Arquivo de libro de banda deseñada (contedor zip)</comment>
+ <comment xml:lang="es">archivador de libro de historietas (contenedor ZIP)</comment>
+ <comment xml:lang="de">Comic-Book-Archiv (zip-Container)</comment>
+ <comment xml:lang="be">архіў comic book (кантэйнер zip)</comment>
<sub-class-of type="application/zip"/>
<generic-icon name="x-office-document"/>
<glob pattern="*.cbz"/>
@@ -8592,50 +8638,56 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-lrzip">
<comment>Lrzip archive</comment>
- <comment xml:lang="af">Lrzip-argief</comment>
- <comment xml:lang="ar">أرشيف Lrzip</comment>
- <comment xml:lang="bg">Архив — lrzip</comment>
- <comment xml:lang="ca">arxiu lrzip</comment>
- <comment xml:lang="cs">archiv Lrzip</comment>
- <comment xml:lang="da">Lrzip-arkiv</comment>
- <comment xml:lang="de">Lrzip-Archiv</comment>
- <comment xml:lang="el">Συμπιεσμένο αρχείο Lrzip</comment>
- <comment xml:lang="en-GB">Lrzip archive</comment>
- <comment xml:lang="eo">Lrzip-arkivo</comment>
- <comment xml:lang="es">archivador Lrzip</comment>
- <comment xml:lang="eu">Lrzip artxiboa</comment>
- <comment xml:lang="fi">Lrzip-arkisto</comment>
- <comment xml:lang="fo">Lrzip skjalasavn</comment>
- <comment xml:lang="fr">archive lrzip</comment>
- <comment xml:lang="fur">archivi Lrzip</comment>
- <comment xml:lang="ga">cartlann Lrzip</comment>
- <comment xml:lang="gl">arquivo Lrzip</comment>
- <comment xml:lang="he">ארכיון Lrzip</comment>
- <comment xml:lang="hr">Lrzip arhiva</comment>
- <comment xml:lang="hu">Lrzip archívum</comment>
- <comment xml:lang="ia">Archivo Lrzip</comment>
- <comment xml:lang="id">Arsip Lrzip</comment>
- <comment xml:lang="it">Archivio Lrzip</comment>
- <comment xml:lang="ja">Lrzip アーカイブ</comment>
- <comment xml:lang="kk">Lrzip архиві</comment>
- <comment xml:lang="ko">LRZIP 압축 파일</comment>
- <comment xml:lang="lt">Lrzip archyvas</comment>
- <comment xml:lang="lv">Lrzip arhīvs</comment>
- <comment xml:lang="nl">Lrzip archief</comment>
- <comment xml:lang="oc">archiu lrzip</comment>
- <comment xml:lang="pl">Archiwum lrzip</comment>
- <comment xml:lang="pt">arquivo Lrzip</comment>
- <comment xml:lang="pt-BR">Pacote Lrzip</comment>
- <comment xml:lang="ro">Arhivă Lrzip</comment>
- <comment xml:lang="ru">Архив LRZIP</comment>
- <comment xml:lang="sk">Archív Lrzip</comment>
- <comment xml:lang="sl">Datoteka arhiva Lrzip</comment>
- <comment xml:lang="sr">Лрзип архива</comment>
- <comment xml:lang="sv">Lrzip-arkiv</comment>
- <comment xml:lang="tr">Lrzip arşivi</comment>
+ <comment xml:lang="zh_TW">Lrzip 封存檔</comment>
+ <comment xml:lang="zh_CN">Lrzip 归档文件</comment>
<comment xml:lang="uk">архів lrzip</comment>
- <comment xml:lang="zh-CN">Lrzip 归档文件</comment>
- <comment xml:lang="zh-TW">Lrzip 封存檔</comment>
+ <comment xml:lang="tr">Lrzip arşivi</comment>
+ <comment xml:lang="sv">Lrzip-arkiv</comment>
+ <comment xml:lang="sr">Лрзип архива</comment>
+ <comment xml:lang="sq">arkiv Lrzip</comment>
+ <comment xml:lang="sl">Datoteka arhiva Lrzip</comment>
+ <comment xml:lang="si">Lrzip සංරක්ෂිතය</comment>
+ <comment xml:lang="sk">Archív Lrzip</comment>
+ <comment xml:lang="ru">Архив LRZIP</comment>
+ <comment xml:lang="ro">Arhivă Lrzip</comment>
+ <comment xml:lang="pt_BR">Pacote Lrzip</comment>
+ <comment xml:lang="pt">arquivo Lrzip</comment>
+ <comment xml:lang="pl">Archiwum lrzip</comment>
+ <comment xml:lang="oc">archiu lrzip</comment>
+ <comment xml:lang="nl">Lrzip-archief</comment>
+ <comment xml:lang="lv">Lrzip arhīvs</comment>
+ <comment xml:lang="lt">Lrzip archyvas</comment>
+ <comment xml:lang="ko">LRZIP 압축 파일</comment>
+ <comment xml:lang="kk">Lrzip архиві</comment>
+ <comment xml:lang="ja">Lrzip アーカイブ</comment>
+ <comment xml:lang="it">Archivio Lrzip</comment>
+ <comment xml:lang="is">Lrzip safnskrá</comment>
+ <comment xml:lang="id">Arsip Lrzip</comment>
+ <comment xml:lang="ia">Archivo Lrzip</comment>
+ <comment xml:lang="hu">Lrzip archívum</comment>
+ <comment xml:lang="hr">Lrzip arhiva</comment>
+ <comment xml:lang="he">ארכיון Lrzip</comment>
+ <comment xml:lang="gl">arquivo Lrzip</comment>
+ <comment xml:lang="ga">cartlann Lrzip</comment>
+ <comment xml:lang="fur">archivi Lrzip</comment>
+ <comment xml:lang="fr">archive lrzip</comment>
+ <comment xml:lang="fo">Lrzip skjalasavn</comment>
+ <comment xml:lang="fi">Lrzip-arkisto</comment>
+ <comment xml:lang="eu">Lrzip artxiboa</comment>
+ <comment xml:lang="es">archivador LRZIP</comment>
+ <comment xml:lang="eo">Lrzip-arkivo</comment>
+ <comment xml:lang="en_GB">Lrzip archive</comment>
+ <comment xml:lang="el">Συμπιεσμένο αρχείο Lrzip</comment>
+ <comment xml:lang="de">Lrzip-Archiv</comment>
+ <comment xml:lang="da">Lrzip-arkiv</comment>
+ <comment xml:lang="cs">archiv Lrzip</comment>
+ <comment xml:lang="ca">arxiu lrzip</comment>
+ <comment xml:lang="bg">Архив — lrzip</comment>
+ <comment xml:lang="be">архіў Lrzip</comment>
+ <comment xml:lang="ar">أرشيف Lrzip</comment>
+ <comment xml:lang="af">Lrzip-argief</comment>
+ <acronym>Lrzip</acronym>
+ <expanded-acronym>Long Range Zip</expanded-acronym>
<generic-icon name="package-x-generic"/>
<magic priority="60">
<match type="string" value="LRZI" offset="0"/>
@@ -8644,49 +8696,53 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-lrzip-compressed-tar">
<comment>Tar archive (lrzip-compressed)</comment>
- <comment xml:lang="af">Tar-argief (lrzip-saamgepers)</comment>
- <comment xml:lang="ar">أرشيف Tar (مضغوط-lrzip)</comment>
- <comment xml:lang="bg">Архив — tar, компресиран с lrzip</comment>
- <comment xml:lang="ca">arxiu tar (amb compressió lrzip)</comment>
- <comment xml:lang="cs">archiv Tar (komprimovaný pomocí lrzip)</comment>
- <comment xml:lang="da">Tar-arkiv (lrzip-komprimeret)</comment>
- <comment xml:lang="de">Tar-Archiv (lrzip-komprimiert)</comment>
- <comment xml:lang="el">Αρχείο Tar (συμπιεσμένο με lrzip)</comment>
- <comment xml:lang="en-GB">Tar archive (lrzip-compressed)</comment>
- <comment xml:lang="es">archivador Tar (comprimido con lrzip)</comment>
- <comment xml:lang="eu">Tar artxiboa (lrzip-ekin konprimitua)</comment>
- <comment xml:lang="fi">Tar-arkisto (lrzip-pakattu)</comment>
- <comment xml:lang="fo">Tar skjalasavn (lrzip-stappað)</comment>
- <comment xml:lang="fr">archive tar (compressée lrzip)</comment>
- <comment xml:lang="fur">archivi Tar (comprimût cun lrzip)</comment>
- <comment xml:lang="ga">cartlann Tar (comhbhrúite le lrzip)</comment>
- <comment xml:lang="gl">arquivo Tar (comprimido con lrzip)</comment>
- <comment xml:lang="he">ארכיון Tar (מכווץ ע״י lrzip)</comment>
- <comment xml:lang="hr">Tar arhiva (lrzip sažeta)</comment>
- <comment xml:lang="hu">Tar archívum (lrzip tömörítésű)</comment>
- <comment xml:lang="ia">Archivo Tar (comprimite con lrzip)</comment>
- <comment xml:lang="id">Arsip Tar (terkompresi lrzip)</comment>
- <comment xml:lang="it">Archivio tar (compresso con lrzip)</comment>
- <comment xml:lang="ja">Tar アーカイブ (lrzip 圧縮)</comment>
- <comment xml:lang="kk">Tar архиві (lrzip-пен сығылған)</comment>
- <comment xml:lang="ko">TAR 묶음 파일(LRZIP 압축)</comment>
- <comment xml:lang="lt">Tar archyvas (suglaudintas su lrzip)</comment>
- <comment xml:lang="lv">Tar arhīvs (saspiests ar lrzip)</comment>
- <comment xml:lang="nl">Tar archief (lrzip-compressed)</comment>
- <comment xml:lang="oc">archiu tar (compressat lrzip)</comment>
- <comment xml:lang="pl">Archiwum tar (kompresja lrzip)</comment>
- <comment xml:lang="pt">arquivo Tar (compressão Lrzip)</comment>
- <comment xml:lang="pt-BR">Pacote Tar (compactado com lrzip)</comment>
- <comment xml:lang="ro">Arhivă Tar (comprimată lrzip)</comment>
- <comment xml:lang="ru">Архив TAR (сжатый lrzip)</comment>
- <comment xml:lang="sk">Archív Tar (komprimovaný pomocou lrzip)</comment>
- <comment xml:lang="sl">Datoteka arhiva Tar (stisnjen z lrzip)</comment>
- <comment xml:lang="sr">Тар архива (запакована лрзипом)</comment>
- <comment xml:lang="sv">Tar-arkiv (lrzip-komprimerat)</comment>
- <comment xml:lang="tr">Tar arşivi (lrzip ile sıkıştırılmış)</comment>
+ <comment xml:lang="zh_TW">Tar 封存檔 (lrzip 格式壓縮)</comment>
+ <comment xml:lang="zh_CN">Tar 归档文件(lrzip 压缩)</comment>
<comment xml:lang="uk">архів tar (стиснений lrzip)</comment>
- <comment xml:lang="zh-CN">Tar 归档文件(lrzip 压缩)</comment>
- <comment xml:lang="zh-TW">Tar 封存檔 (lrzip 格式壓縮)</comment>
+ <comment xml:lang="tr">Tar arşivi (lrzip ile sıkıştırılmış)</comment>
+ <comment xml:lang="sv">Tar-arkiv (lrzip-komprimerat)</comment>
+ <comment xml:lang="sr">Тар архива (запакована лрзипом)</comment>
+ <comment xml:lang="sq">arkiv tar (ngjeshur me lrzip)</comment>
+ <comment xml:lang="sl">Datoteka arhiva Tar (stisnjen z lrzip)</comment>
+ <comment xml:lang="si">තාර සංරක්ෂිතය (lrzip-සම්පීඩිත)</comment>
+ <comment xml:lang="sk">Archív Tar (komprimovaný pomocou lrzip)</comment>
+ <comment xml:lang="ru">Архив TAR (сжатый lrzip)</comment>
+ <comment xml:lang="ro">Arhivă Tar (comprimată lrzip)</comment>
+ <comment xml:lang="pt_BR">Pacote Tar (compactado com lrzip)</comment>
+ <comment xml:lang="pt">arquivo Tar (compressão Lrzip)</comment>
+ <comment xml:lang="pl">Archiwum tar (kompresja lrzip)</comment>
+ <comment xml:lang="oc">archiu tar (compressat lrzip)</comment>
+ <comment xml:lang="nl">Tar-archief (gecomprimeerd met lrzip)</comment>
+ <comment xml:lang="lv">Tar arhīvs (saspiests ar lrzip)</comment>
+ <comment xml:lang="lt">Tar archyvas (suglaudintas su lrzip)</comment>
+ <comment xml:lang="ko">TAR 묶음 파일(LRZIP 압축)</comment>
+ <comment xml:lang="kk">Tar архиві (lrzip-пен сығылған)</comment>
+ <comment xml:lang="ja">Tar アーカイブ (lrzip 圧縮)</comment>
+ <comment xml:lang="it">Archivio tar (compresso con lrzip)</comment>
+ <comment xml:lang="is">Tar safnskrá (lrzip-þjappað)</comment>
+ <comment xml:lang="id">Arsip Tar (terkompresi lrzip)</comment>
+ <comment xml:lang="ia">Archivo Tar (comprimite con lrzip)</comment>
+ <comment xml:lang="hu">Tar archívum (lrzip tömörítésű)</comment>
+ <comment xml:lang="hr">Tar arhiva (lrzip sažeta)</comment>
+ <comment xml:lang="he">ארכיון Tar (מכווץ ע״י lrzip)</comment>
+ <comment xml:lang="gl">arquivo Tar (comprimido con lrzip)</comment>
+ <comment xml:lang="ga">cartlann Tar (comhbhrúite le lrzip)</comment>
+ <comment xml:lang="fur">archivi Tar (comprimût cun lrzip)</comment>
+ <comment xml:lang="fr">archive tar (compressée lrzip)</comment>
+ <comment xml:lang="fo">Tar skjalasavn (lrzip-stappað)</comment>
+ <comment xml:lang="fi">Tar-arkisto (lrzip-pakattu)</comment>
+ <comment xml:lang="eu">Tar artxiboa (lrzip-ekin konprimitua)</comment>
+ <comment xml:lang="es">archivador TAR (comprimido con LRZIP)</comment>
+ <comment xml:lang="en_GB">Tar archive (lrzip-compressed)</comment>
+ <comment xml:lang="el">Αρχείο Tar (συμπιεσμένο με lrzip)</comment>
+ <comment xml:lang="de">Tar-Archiv (lrzip-komprimiert)</comment>
+ <comment xml:lang="da">Tar-arkiv (lrzip-komprimeret)</comment>
+ <comment xml:lang="cs">archiv Tar (komprimovaný pomocí lrzip)</comment>
+ <comment xml:lang="ca">arxiu tar (amb compressió lrzip)</comment>
+ <comment xml:lang="bg">Архив — tar, компресиран с lrzip</comment>
+ <comment xml:lang="be">архіў tar (сцісканне lrzip)</comment>
+ <comment xml:lang="ar">أرشيف Tar (مضغوط-lrzip)</comment>
+ <comment xml:lang="af">Tar-argief (lrzip-saamgepers)</comment>
<generic-icon name="package-x-generic"/>
<sub-class-of type="application/x-lrzip"/>
<glob pattern="*.tar.lrz"/>
@@ -8694,224 +8750,218 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-apple-diskimage">
<comment>Apple disk image</comment>
- <comment xml:lang="af">Apple-skyfbeeldlêer</comment>
- <comment xml:lang="ast">Imaxe de discu d'Apple</comment>
- <comment xml:lang="bg">Диск — Apple</comment>
- <comment xml:lang="ca">imatge de disc d'Apple</comment>
- <comment xml:lang="cs">obraz disku Apple</comment>
- <comment xml:lang="da">Apple-diskaftryk</comment>
- <comment xml:lang="de">Apple-Datenträgerabbild</comment>
- <comment xml:lang="el">Εικόνα δίσκου Apple</comment>
- <comment xml:lang="en-GB">Apple disk image</comment>
- <comment xml:lang="es">imagen de disco de Apple</comment>
- <comment xml:lang="eu">Apple disko irudia</comment>
- <comment xml:lang="fi">Apple-levytiedosto</comment>
- <comment xml:lang="fr">image disque Apple</comment>
- <comment xml:lang="fur">imagjin disc Apple</comment>
- <comment xml:lang="ga">íomhá diosca Apple</comment>
- <comment xml:lang="gl">imaxe de disco de Appl</comment>
- <comment xml:lang="he">תמונת כונן Apple</comment>
- <comment xml:lang="hr">Apple slika diska</comment>
- <comment xml:lang="hu">Apple lemezkép</comment>
- <comment xml:lang="ia">Imagine de disco Apple</comment>
- <comment xml:lang="id">Image disk Apple</comment>
- <comment xml:lang="it">Immagine disco Apple</comment>
- <comment xml:lang="ja">Apple ディスクイメージ</comment>
- <comment xml:lang="ka">Apple-ის სადისკო გამოსახულება</comment>
- <comment xml:lang="kk">Apple диск бейнесі</comment>
- <comment xml:lang="ko">Apple 디스크 이미지</comment>
- <comment xml:lang="lv">Apple diska attēls</comment>
- <comment xml:lang="nl">Apple disk image</comment>
- <comment xml:lang="oc">imatge disc Apple</comment>
- <comment xml:lang="pl">Obraz dysku Apple</comment>
- <comment xml:lang="pt">imagem de disco Apple</comment>
- <comment xml:lang="pt-BR">Imagem de disco Apple</comment>
- <comment xml:lang="ru">Образ диска Apple Mac OS X</comment>
- <comment xml:lang="sk">Obraz disku Apple</comment>
- <comment xml:lang="sl">Odtis diska Apple</comment>
- <comment xml:lang="sr">Еплов одраз диска</comment>
- <comment xml:lang="sv">Apple-diskavbild</comment>
- <comment xml:lang="tr">Apple disk görüntüsü</comment>
+ <comment xml:lang="zh_TW">Apple 磁碟映像檔</comment>
+ <comment xml:lang="zh_CN">Apple 磁盘映像</comment>
<comment xml:lang="uk">образ диска Apple</comment>
- <comment xml:lang="zh-CN">Apple 磁盘映像</comment>
- <comment xml:lang="zh-TW">Apple 磁碟映像檔</comment>
+ <comment xml:lang="tr">Apple disk görüntüsü</comment>
+ <comment xml:lang="sv">Apple-diskavbild</comment>
+ <comment xml:lang="sr">Еплов одраз диска</comment>
+ <comment xml:lang="sq">pamje disku Apple</comment>
+ <comment xml:lang="sl">Odtis diska Apple</comment>
+ <comment xml:lang="si">ඇපල් තැටි රූපය</comment>
+ <comment xml:lang="sk">Obraz disku Apple</comment>
+ <comment xml:lang="ru">Образ диска Apple Mac OS X</comment>
+ <comment xml:lang="pt_BR">Imagem de disco Apple</comment>
+ <comment xml:lang="pt">imagem de disco Apple</comment>
+ <comment xml:lang="pl">Obraz dysku Apple</comment>
+ <comment xml:lang="oc">imatge disc Apple</comment>
+ <comment xml:lang="nl">Apple-schijfkopiebestand</comment>
+ <comment xml:lang="lv">Apple diska attēls</comment>
+ <comment xml:lang="ko">Apple 디스크 이미지</comment>
+ <comment xml:lang="kk">Apple диск бейнесі</comment>
+ <comment xml:lang="ka">Apple-ის სადისკო გამოსახულება</comment>
+ <comment xml:lang="ja">Apple ディスクイメージ</comment>
+ <comment xml:lang="it">Immagine disco Apple</comment>
+ <comment xml:lang="is">Apple diskmynd</comment>
+ <comment xml:lang="id">Image disk Apple</comment>
+ <comment xml:lang="ia">Imagine de disco Apple</comment>
+ <comment xml:lang="hu">Apple lemezkép</comment>
+ <comment xml:lang="hr">Apple slika diska</comment>
+ <comment xml:lang="he">תמונת כונן Apple</comment>
+ <comment xml:lang="gl">imaxe de disco de Appl</comment>
+ <comment xml:lang="ga">íomhá diosca Apple</comment>
+ <comment xml:lang="fur">imagjin disc Apple</comment>
+ <comment xml:lang="fr">image disque Apple</comment>
+ <comment xml:lang="fi">Apple-levykuva</comment>
+ <comment xml:lang="eu">Apple disko irudia</comment>
+ <comment xml:lang="es">imagen de disco de Apple</comment>
+ <comment xml:lang="en_GB">Apple disk image</comment>
+ <comment xml:lang="el">Εικόνα δίσκου Apple</comment>
+ <comment xml:lang="de">Apple-Datenträgerabbild</comment>
+ <comment xml:lang="da">Apple-diskaftryk</comment>
+ <comment xml:lang="cs">obraz disku Apple</comment>
+ <comment xml:lang="ca">imatge de disc d'Apple</comment>
+ <comment xml:lang="bg">Диск — Apple</comment>
+ <comment xml:lang="be">вобраз дыска Apple</comment>
+ <comment xml:lang="ast">Imaxe de discu d'Apple</comment>
+ <comment xml:lang="ar">صورة قرص أبل</comment>
+ <comment xml:lang="af">Apple-skyfbeeldlêer</comment>
<glob pattern="*.dmg"/>
</mime-type>
- <mime-type type="application/x-raw-disk-image">
+ <mime-type type="application/vnd.efi.img">
<comment>Raw disk image</comment>
- <comment xml:lang="af">Rou skyfbeeldlêer</comment>
- <comment xml:lang="ast">Imaxe de discu en bruto</comment>
- <comment xml:lang="bg">Диск — raw</comment>
- <comment xml:lang="ca">imatge de disc RAW</comment>
- <comment xml:lang="cs">surový obraz disku</comment>
- <comment xml:lang="da">Raw-diskaftryk</comment>
- <comment xml:lang="de">Rohes Datenträgerabbild</comment>
- <comment xml:lang="el">Ανεπεξέργαστη εικόνα δίσκου</comment>
- <comment xml:lang="en-GB">Raw disk image</comment>
- <comment xml:lang="es">imagen de disco en bruto</comment>
- <comment xml:lang="eu">Disko gordinaren irudia</comment>
- <comment xml:lang="fi">Raaka levytiedosto</comment>
- <comment xml:lang="fr">image disque Raw</comment>
- <comment xml:lang="fur">imagjin disc grese</comment>
- <comment xml:lang="ga">Amhíomha diosca</comment>
- <comment xml:lang="gl">Imaxe de disco en bruto</comment>
- <comment xml:lang="he">דמות גולמית של כונן</comment>
- <comment xml:lang="hr">Osnovna slika diska</comment>
- <comment xml:lang="hu">Nyers lemezkép</comment>
- <comment xml:lang="ia">Imagine de disco crude</comment>
- <comment xml:lang="id">Image disk mentah</comment>
- <comment xml:lang="it">Immagine disco raw</comment>
- <comment xml:lang="kk">Шикі диск бейнесі</comment>
- <comment xml:lang="ko">RAW 디스크 이미지</comment>
- <comment xml:lang="oc">imatge disc Raw</comment>
- <comment xml:lang="pl">Surowy obraz dysku</comment>
- <comment xml:lang="pt">imagem de disco Raw</comment>
- <comment xml:lang="pt-BR">Imagem bruta de disco</comment>
- <comment xml:lang="ru">Необработанный образ диска</comment>
- <comment xml:lang="sk">Obraz disku</comment>
- <comment xml:lang="sl">Surovi odtis diska</comment>
- <comment xml:lang="sr">сиров одраз диска</comment>
- <comment xml:lang="sv">Rå diskavbild</comment>
- <comment xml:lang="tr">Ham disk görüntüsü</comment>
+ <comment xml:lang="zh_TW">原始磁碟映像檔</comment>
+ <comment xml:lang="zh_CN">原始磁盘映像</comment>
<comment xml:lang="uk">простий образ диска</comment>
- <comment xml:lang="zh-CN">原始磁盘映像</comment>
- <comment xml:lang="zh-TW">原始磁碟映像檔</comment>
+ <comment xml:lang="tr">Ham disk görüntüsü</comment>
+ <comment xml:lang="sv">Rå diskavbild</comment>
+ <comment xml:lang="sr">сиров одраз диска</comment>
+ <comment xml:lang="sq">pamje disku e papërpunuar</comment>
+ <comment xml:lang="sl">Surovi odtis diska</comment>
+ <comment xml:lang="si">අමු තැටි රූපය</comment>
+ <comment xml:lang="sk">Obraz disku</comment>
+ <comment xml:lang="ru">Необработанный образ диска</comment>
+ <comment xml:lang="pt_BR">Imagem bruta de disco</comment>
+ <comment xml:lang="pt">imagem de disco Raw</comment>
+ <comment xml:lang="pl">Surowy obraz dysku</comment>
+ <comment xml:lang="oc">imatge disc Raw</comment>
+ <comment xml:lang="nl">Onbewerkt schijfkopiebestand</comment>
+ <comment xml:lang="ko">RAW 디스크 이미지</comment>
+ <comment xml:lang="kk">Шикі диск бейнесі</comment>
+ <comment xml:lang="ja">Raw ディスクイメージ</comment>
+ <comment xml:lang="it">Immagine disco raw</comment>
+ <comment xml:lang="is">Hrá diskmynd</comment>
+ <comment xml:lang="id">Image disk mentah</comment>
+ <comment xml:lang="ia">Imagine de disco crude</comment>
+ <comment xml:lang="hu">Nyers lemezkép</comment>
+ <comment xml:lang="hr">Osnovna slika diska</comment>
+ <comment xml:lang="he">דמות גולמית של כונן</comment>
+ <comment xml:lang="gl">Imaxe de disco en bruto</comment>
+ <comment xml:lang="ga">Amhíomha diosca</comment>
+ <comment xml:lang="fur">imagjin disc grese</comment>
+ <comment xml:lang="fr">image disque Raw</comment>
+ <comment xml:lang="fi">Raaka levykuva</comment>
+ <comment xml:lang="eu">Disko gordinaren irudia</comment>
+ <comment xml:lang="es">imagen de disco en bruto</comment>
+ <comment xml:lang="en_GB">Raw disk image</comment>
+ <comment xml:lang="el">Ανεπεξέργαστη εικόνα δίσκου</comment>
+ <comment xml:lang="de">Rohes Datenträgerabbild</comment>
+ <comment xml:lang="da">Raw-diskaftryk</comment>
+ <comment xml:lang="cs">surový obraz disku</comment>
+ <comment xml:lang="ca">imatge de disc RAW</comment>
+ <comment xml:lang="bg">Диск — raw</comment>
+ <comment xml:lang="be">неапрацаваны вобраз дыска</comment>
+ <comment xml:lang="ast">Imaxe de discu en bruto</comment>
+ <comment xml:lang="ar">صورة قرص خام</comment>
+ <comment xml:lang="af">Rou skyfbeeldlêer</comment>
+ <alias type="application/x-raw-disk-image"/>
<glob pattern="*.raw-disk-image"/>
<glob pattern="*.img"/>
</mime-type>
<mime-type type="application/x-raw-floppy-disk-image">
<comment>Floppy disk image</comment>
- <comment xml:lang="af">Disket-skyfbeeldlêer</comment>
- <comment xml:lang="bg">Диск — флопи</comment>
- <comment xml:lang="ca">imatge de disquet</comment>
- <comment xml:lang="cs">obraz diskety</comment>
- <comment xml:lang="da">Floppy-diskaftryk</comment>
- <comment xml:lang="de">Diskettenabbild</comment>
- <comment xml:lang="en-GB">Floppy disk image</comment>
- <comment xml:lang="es">imagen de disquete</comment>
- <comment xml:lang="eu">Diskete disko irudia</comment>
- <comment xml:lang="fi">Disketin levykuva</comment>
- <comment xml:lang="fr">image disquette</comment>
- <comment xml:lang="fur">imagjin disc floppy</comment>
- <comment xml:lang="ga">íomhá diosca fhlapaigh</comment>
- <comment xml:lang="hr">Slika diskete</comment>
- <comment xml:lang="hu">Flopi lemezkép</comment>
- <comment xml:lang="id">Image disk floppy</comment>
- <comment xml:lang="it">Immagine disco floppy</comment>
- <comment xml:lang="kk">Иілгіш диск бейнесі</comment>
- <comment xml:lang="ko">플로피 디스크 이미지</comment>
- <comment xml:lang="pl">Obraz dyskietki</comment>
- <comment xml:lang="pt">imagem da disquete</comment>
- <comment xml:lang="pt-BR">Imagem de disco flexível</comment>
- <comment xml:lang="ru">Образ гибкого диска</comment>
- <comment xml:lang="sk">Obraz pružného disku</comment>
- <comment xml:lang="sv">Diskettavbild</comment>
- <comment xml:lang="tr">Disket görüntüsü</comment>
+ <comment xml:lang="zh_TW">Floppy 軟碟映像檔</comment>
+ <comment xml:lang="zh_CN">软盘映像</comment>
<comment xml:lang="uk">образ дискети</comment>
- <comment xml:lang="zh-CN">软盘映像</comment>
- <comment xml:lang="zh-TW">Floppy 軟碟映像檔</comment>
- <sub-class-of type="application/x-raw-disk-image"/>
+ <comment xml:lang="tr">Disket görüntüsü</comment>
+ <comment xml:lang="sv">Diskettavbild</comment>
+ <comment xml:lang="sr">одраз флопи диска</comment>
+ <comment xml:lang="sq">pamje diskete</comment>
+ <comment xml:lang="sl">Slika diskete</comment>
+ <comment xml:lang="si">නම්ය තැටි රූපය</comment>
+ <comment xml:lang="sk">Obraz pružného disku</comment>
+ <comment xml:lang="ru">Образ дискеты</comment>
+ <comment xml:lang="pt_BR">Imagem de disco flexível</comment>
+ <comment xml:lang="pt">imagem da disquete</comment>
+ <comment xml:lang="pl">Obraz dyskietki</comment>
+ <comment xml:lang="oc">imatge disc disqueta</comment>
+ <comment xml:lang="nl">Diskette-schijfkopiebestand</comment>
+ <comment xml:lang="ko">플로피 디스크 이미지</comment>
+ <comment xml:lang="kk">Иілгіш диск бейнесі</comment>
+ <comment xml:lang="ja">Floppy ディスクイメージ</comment>
+ <comment xml:lang="it">Immagine disco floppy</comment>
+ <comment xml:lang="is">Disklingsmynd</comment>
+ <comment xml:lang="id">Image disk floppy</comment>
+ <comment xml:lang="hu">Flopi lemezkép</comment>
+ <comment xml:lang="hr">Slika diskete</comment>
+ <comment xml:lang="he">דמות תקליטון</comment>
+ <comment xml:lang="gl">Imaxe de disco de Disquete</comment>
+ <comment xml:lang="ga">íomhá diosca fhlapaigh</comment>
+ <comment xml:lang="fur">imagjin disc floppy</comment>
+ <comment xml:lang="fr">image disquette</comment>
+ <comment xml:lang="fi">Levykkeen levykuva</comment>
+ <comment xml:lang="eu">Diskete disko irudia</comment>
+ <comment xml:lang="es">imagen de disquete</comment>
+ <comment xml:lang="en_GB">Floppy disk image</comment>
+ <comment xml:lang="de">Diskettenabbild</comment>
+ <comment xml:lang="da">Floppy-diskaftryk</comment>
+ <comment xml:lang="cs">obraz diskety</comment>
+ <comment xml:lang="ca">imatge de disquet</comment>
+ <comment xml:lang="bg">Диск — флопи</comment>
+ <comment xml:lang="be">вобраз гнуткага дыска</comment>
+ <comment xml:lang="ar">صورة قرص مرن</comment>
+ <comment xml:lang="af">Disket-skyfbeeldlêer</comment>
+ <sub-class-of type="application/vnd.efi.img"/>
+ <generic-icon name="media-floppy"/>
<alias type="application/x-fd-file"/>
<glob pattern="*.fd"/>
<glob pattern="*.qd"/>
</mime-type>
<mime-type type="application/x-raw-disk-image-xz-compressed">
<comment>Raw disk image (XZ-compressed)</comment>
- <comment xml:lang="af">Rou skyfbeeldlêer (XZ-saamgepers)</comment>
- <comment xml:lang="ast">Imaxe de discu en bruto (comprimida en XZ)</comment>
- <comment xml:lang="bg">Диск — raw, компресиран с xz</comment>
- <comment xml:lang="ca">imatge de disc RAW (amb compressió XZ)</comment>
- <comment xml:lang="cs">surový obraz disku (komprimovaný pomocí XZ)</comment>
- <comment xml:lang="da">Raw-diskaftryk (XZ-komprimeret)</comment>
- <comment xml:lang="de">Rohes Datenträgerabbild (XZ-komprimiert)</comment>
- <comment xml:lang="el">Ανεπεξέργαστη εικόνα δίσκου (συμπιεσμένη XZ)</comment>
- <comment xml:lang="en-GB">Raw disk image (XZ-compressed)</comment>
- <comment xml:lang="es">imagen de disco en bruto (comprimida con XZ)</comment>
- <comment xml:lang="eu">Disko gordinaren irudia (XZ-rekin konprimitua)</comment>
- <comment xml:lang="fi">Raaka levytiedosto (XZ-pakattu)</comment>
- <comment xml:lang="fr">image disque Raw (compression XZ)</comment>
- <comment xml:lang="fur">imagjin disc grese (comprimude cun XZ)</comment>
- <comment xml:lang="ga">Amhíomhá (comhbhrúite le XZ)</comment>
- <comment xml:lang="gl">Imaxe de disco en bruto (comprimida en XZ)</comment>
- <comment xml:lang="he">דמות גולמית של כונן (בדחיסת XZ)</comment>
- <comment xml:lang="hr">Osnovna slika diska (XZ sažeta)</comment>
- <comment xml:lang="hu">Nyers lemezkép (XZ tömörítésű)</comment>
- <comment xml:lang="ia">Imagine de disco crude (comprimite con XZ)</comment>
- <comment xml:lang="id">Image disk mentah (terkompresi XZ)</comment>
- <comment xml:lang="it">Immagine disco raw (compressa XZ)</comment>
- <comment xml:lang="kk">Шикі диск бейнесі (XZ-мен сығылған)</comment>
- <comment xml:lang="ko">RAW 디스크 이미지(XZ 압축)</comment>
- <comment xml:lang="oc">imatge disc Raw (compression XZ)</comment>
- <comment xml:lang="pl">Surowy obraz dysku (kompresja XZ)</comment>
- <comment xml:lang="pt">imagem de disco Raw (compressão XZ)</comment>
- <comment xml:lang="pt-BR">Imagem bruta de disco (compactada com XZ)</comment>
- <comment xml:lang="ru">Необработанный образ диска (сжатый xz)</comment>
- <comment xml:lang="sk">Obraz disku (komprimovaný pomocou XZ)</comment>
- <comment xml:lang="sl">Surovi odtis diska (stisnjeno z XZ)</comment>
- <comment xml:lang="sr">сиров одраз диска (запакована ИксЗ-ом)</comment>
- <comment xml:lang="sv">Rå diskavbild (XZ-komprimerad)</comment>
- <comment xml:lang="tr">Ham disk görüntüsü (XZ ile sıkıştırılmış)</comment>
+ <comment xml:lang="zh_TW">原始磁碟映像檔 (XZ 壓縮)</comment>
+ <comment xml:lang="zh_CN">原始磁盘映像(XZ 压缩)</comment>
<comment xml:lang="uk">простий образ диска (стиснений XZ)</comment>
- <comment xml:lang="zh-CN">原始磁盘映像(XZ 压缩)</comment>
- <comment xml:lang="zh-TW">原始磁碟映像檔 (XZ 壓縮)</comment>
+ <comment xml:lang="tr">Ham disk görüntüsü (XZ ile sıkıştırılmış)</comment>
+ <comment xml:lang="sv">Rå diskavbild (XZ-komprimerad)</comment>
+ <comment xml:lang="sr">сиров одраз диска (запакована ИксЗ-ом)</comment>
+ <comment xml:lang="sq">pamje disku e papërpunuar (ngjeshur me XZ)</comment>
+ <comment xml:lang="sl">Surovi odtis diska (stisnjeno z XZ)</comment>
+ <comment xml:lang="si">අමු තැටි රූපය (XZ-සම්පීඩිත)</comment>
+ <comment xml:lang="sk">Obraz disku (komprimovaný pomocou XZ)</comment>
+ <comment xml:lang="ru">Необработанный образ диска (сжатый XZ)</comment>
+ <comment xml:lang="pt_BR">Imagem bruta de disco (compactada com XZ)</comment>
+ <comment xml:lang="pt">imagem de disco Raw (compressão XZ)</comment>
+ <comment xml:lang="pl">Surowy obraz dysku (kompresja XZ)</comment>
+ <comment xml:lang="oc">imatge disc Raw (compression XZ)</comment>
+ <comment xml:lang="nl">Onbewerkt schijfkopiebestand (gecomprimeerd met XZ)</comment>
+ <comment xml:lang="ko">RAW 디스크 이미지(XZ 압축)</comment>
+ <comment xml:lang="kk">Шикі диск бейнесі (XZ-мен сығылған)</comment>
+ <comment xml:lang="ja">Raw ディスクイメージ (XZ 圧縮)</comment>
+ <comment xml:lang="it">Immagine disco raw (compressa XZ)</comment>
+ <comment xml:lang="is">Hrá diskmynd (XZ-þjöppuð)</comment>
+ <comment xml:lang="id">Image disk mentah (terkompresi XZ)</comment>
+ <comment xml:lang="ia">Imagine de disco crude (comprimite con XZ)</comment>
+ <comment xml:lang="hu">Nyers lemezkép (XZ tömörítésű)</comment>
+ <comment xml:lang="hr">Osnovna slika diska (XZ sažeta)</comment>
+ <comment xml:lang="he">דמות גולמית של כונן (בדחיסת XZ)</comment>
+ <comment xml:lang="gl">Imaxe de disco en bruto (comprimida en XZ)</comment>
+ <comment xml:lang="ga">Amhíomhá (comhbhrúite le XZ)</comment>
+ <comment xml:lang="fur">imagjin disc grese (comprimude cun XZ)</comment>
+ <comment xml:lang="fr">image disque Raw (compression XZ)</comment>
+ <comment xml:lang="fi">Raaka levykuva (XZ-pakattu)</comment>
+ <comment xml:lang="eu">Disko gordinaren irudia (XZ-rekin konprimitua)</comment>
+ <comment xml:lang="es">imagen de disco en bruto (comprimida con XZ)</comment>
+ <comment xml:lang="en_GB">Raw disk image (XZ-compressed)</comment>
+ <comment xml:lang="el">Ανεπεξέργαστη εικόνα δίσκου (συμπιεσμένη XZ)</comment>
+ <comment xml:lang="de">Rohes Datenträgerabbild (XZ-komprimiert)</comment>
+ <comment xml:lang="da">Raw-diskaftryk (XZ-komprimeret)</comment>
+ <comment xml:lang="cs">surový obraz disku (komprimovaný pomocí XZ)</comment>
+ <comment xml:lang="ca">imatge de disc RAW (amb compressió XZ)</comment>
+ <comment xml:lang="bg">Диск — raw, компресиран с xz</comment>
+ <comment xml:lang="be">неапрацаваны вобраз дыска (сцісканне XZ)</comment>
+ <comment xml:lang="ast">Imaxe de discu en bruto (comprimida en XZ)</comment>
+ <comment xml:lang="ar">صورة قرص خام (مضغوطة-ZX)</comment>
+ <comment xml:lang="af">Rou skyfbeeldlêer (XZ-saamgepers)</comment>
<sub-class-of type="application/x-xz"/>
<glob pattern="*.raw-disk-image.xz"/>
<glob pattern="*.img.xz"/>
</mime-type>
- <mime-type type="application/x-cd-image">
- <comment>raw CD image</comment>
- <comment xml:lang="af">rou CD-beeldlêer</comment>
- <comment xml:lang="ar">صورة CD خامة</comment>
- <comment xml:lang="ast">imaxe de CD en bruto</comment>
- <comment xml:lang="be-Latn">suvoraja vyjava CD</comment>
- <comment xml:lang="bg">Диск — raw CD</comment>
- <comment xml:lang="ca">imatge de CD en cru</comment>
- <comment xml:lang="cs">surový obraz CD</comment>
- <comment xml:lang="da">raw cd-aftryk</comment>
- <comment xml:lang="de">CD-Roh-Abbild</comment>
- <comment xml:lang="el">Εικόνα περιεχομένου ψηφιακού δίσκου</comment>
- <comment xml:lang="en-GB">raw CD image</comment>
- <comment xml:lang="eo">kruda lumdiskbildo</comment>
- <comment xml:lang="es">imagen de CD en bruto</comment>
- <comment xml:lang="eu">CD gordinaren irudia </comment>
- <comment xml:lang="fi">raaka CD-vedos</comment>
- <comment xml:lang="fo">rá CD mynd</comment>
- <comment xml:lang="fr">image CD brute</comment>
- <comment xml:lang="fur">imagjin CD grese</comment>
- <comment xml:lang="ga">amhíomhá dhlúthdhiosca</comment>
- <comment xml:lang="gl">imaxe de CD en bruto</comment>
- <comment xml:lang="he">תמונת דיסק גולמית</comment>
- <comment xml:lang="hr">Osnovna CD slika</comment>
- <comment xml:lang="hu">nyers CD-lemezkép</comment>
- <comment xml:lang="ia">Imagine CD brute</comment>
- <comment xml:lang="id">citra CD mentah</comment>
- <comment xml:lang="it">Immagine raw CD</comment>
- <comment xml:lang="ja">生 CD イメージ</comment>
- <comment xml:lang="kk">өңделмеген CD бейнесі</comment>
- <comment xml:lang="ko">CD 이미지</comment>
- <comment xml:lang="lt">raw CD atvaizdis</comment>
- <comment xml:lang="lv">CD jēlattēls</comment>
- <comment xml:lang="ms">Imej CD mentah</comment>
- <comment xml:lang="nb">rått CD-bilde</comment>
- <comment xml:lang="nl">ruw CD-beeldbestand</comment>
- <comment xml:lang="nn">rått CD-bilete</comment>
- <comment xml:lang="oc">imatge CD brut</comment>
- <comment xml:lang="pl">Surowy obraz CD</comment>
- <comment xml:lang="pt">imagem em bruto de CD</comment>
- <comment xml:lang="pt-BR">Imagem bruta de CD</comment>
- <comment xml:lang="ro">imagine de CD brută</comment>
+ <mime-type type="application/vnd.efi.iso">
+ <comment>Raw CD image</comment>
+ <comment xml:lang="uk">простий образ CD</comment>
+ <comment xml:lang="sv">Rå cd-avbild</comment>
<comment xml:lang="ru">Необработанный образ компакт-диска</comment>
- <comment xml:lang="sk">Surový obraz CD</comment>
- <comment xml:lang="sl">surovi CD odtis</comment>
- <comment xml:lang="sq">Imazh raw CD</comment>
- <comment xml:lang="sr">сиров одраз ЦД-а</comment>
- <comment xml:lang="sv">rå cd-avbild</comment>
- <comment xml:lang="tr">ham CD görüntüsü</comment>
- <comment xml:lang="uk">образ raw CD</comment>
- <comment xml:lang="vi">ảnh đĩa CD thô</comment>
- <comment xml:lang="zh-CN">原始 CD 映像</comment>
- <comment xml:lang="zh-TW">原生 CD 映像檔</comment>
- <sub-class-of type="application/x-raw-disk-image"/>
+ <comment xml:lang="pl">Surowy obraz CD</comment>
+ <comment xml:lang="it">Immagine raw CD</comment>
+ <comment xml:lang="gl">Imaxe de CD en bruto</comment>
+ <comment xml:lang="eu">CD irudi gordina</comment>
+ <comment xml:lang="es">imagen de CD en bruto</comment>
+ <comment xml:lang="de">CD-Roh-Abbild</comment>
+ <comment xml:lang="be">Неапрацаваны вобраз CD</comment>
+ <sub-class-of type="application/vnd.efi.img"/>
+ <generic-icon name="media-optical"/>
+ <alias type="application/x-cd-image"/>
<alias type="application/x-iso9660-image"/>
<!-- No magic, see https://bugs.freedesktop.org/show_bug.cgi?id=10049 -->
<glob pattern="*.iso" weight="80"/>
@@ -8919,53 +8969,90 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-compressed-iso">
<comment>Compressed CD image</comment>
- <comment xml:lang="ca">imatge de CD amb compressió</comment>
- <comment xml:lang="fi">Pakattu CD-levykuva</comment>
- <comment xml:lang="it">Immagine CD compressa</comment>
- <comment xml:lang="pl">Skompresowany obraz płyty CD</comment>
+ <comment xml:lang="zh_CN">压缩的 CD 映像</comment>
<comment xml:lang="uk">стиснений образ CD</comment>
- <magic priority="50">
+ <comment xml:lang="tr">Sıkıştırılmış CD görüntüsü</comment>
+ <comment xml:lang="sv">Komprimerad cd-avbild</comment>
+ <comment xml:lang="sr">компресовани ЦД одраз</comment>
+ <comment xml:lang="sl">Stisnjena slika CD</comment>
+ <comment xml:lang="si">සම්පීඩිත CD රූපය</comment>
+ <comment xml:lang="ru">Сжатый образ компакт-диска</comment>
+ <comment xml:lang="pt_BR">Imagem de CD compactada</comment>
+ <comment xml:lang="pt">Imagem de CD comprimida</comment>
+ <comment xml:lang="pl">Skompresowany obraz płyty CD</comment>
+ <comment xml:lang="oc">imatge CD compressat</comment>
+ <comment xml:lang="nl">Gecomprimeerd CD-schijfkopiebestand</comment>
+ <comment xml:lang="ko">압축된 CD 이미지</comment>
+ <comment xml:lang="kk">Сығылған CD бейнесі</comment>
+ <comment xml:lang="ja">圧縮 CD イメージ</comment>
+ <comment xml:lang="it">Immagine CD compressa</comment>
+ <comment xml:lang="is">Þjöppuð CD diskmynd</comment>
+ <comment xml:lang="id">Image CD terkompresi</comment>
+ <comment xml:lang="hu">Tömörített CD lemezkép</comment>
+ <comment xml:lang="hr">Sažeta CD slika</comment>
+ <comment xml:lang="he">דמות תקליטור דחוסה</comment>
+ <comment xml:lang="gl">Imaxe de CD comprimido</comment>
+ <comment xml:lang="fr">Image CD compressée</comment>
+ <comment xml:lang="fi">Pakattu CD-levykuva</comment>
+ <comment xml:lang="eu">Konprimatutako CD irudia</comment>
+ <comment xml:lang="es">imagen comprimida de CD</comment>
+ <comment xml:lang="en_GB">Compressed CD image</comment>
+ <comment xml:lang="de">Komprimiertes CD-Abbild</comment>
+ <comment xml:lang="da">Komprimeret CD-aftryk</comment>
+ <comment xml:lang="ca">imatge de CD amb compressió</comment>
+ <comment xml:lang="be">сціснуты вобраз CD</comment>
+ <comment xml:lang="ar">صورة سي دي مضغوطة</comment>
+ <generic-icon name="media-optical"/>
+ <magic>
<match value="CISO" type="string" offset="0"/>
</magic>
<glob pattern="*.cso"/>
</mime-type>
<mime-type type="application/x-iso9660-appimage">
<comment>AppImage application bundle</comment>
- <comment xml:lang="af">AppImage-toepassingsbundel</comment>
- <comment xml:lang="bg">Програмен пакет — AppImage</comment>
- <comment xml:lang="ca">paquet d'aplicació AppImage</comment>
- <comment xml:lang="cs">balíček AppImage s aplikací</comment>
- <comment xml:lang="da">AppImage-programsamling</comment>
- <comment xml:lang="de">AppImage-Anwendungspaket</comment>
- <comment xml:lang="en-GB">AppImage application bundle</comment>
- <comment xml:lang="es">paquete de aplicación AppImage</comment>
- <comment xml:lang="eu">AppImage aplikazio bilduma</comment>
- <comment xml:lang="fi">AppImage-sovelluspaketti</comment>
- <comment xml:lang="fr">lot applicatif AppImage</comment>
- <comment xml:lang="fur">côl di aplicazions AppImage</comment>
- <comment xml:lang="ga">burla feidhmchláir AppImage</comment>
- <comment xml:lang="he">חבילת יישומי AppImage</comment>
- <comment xml:lang="hr">AppImage paket aplikacije</comment>
- <comment xml:lang="hu">AppImage alkalmazáscsomag</comment>
- <comment xml:lang="id">Bundel aplikasi AppImage</comment>
- <comment xml:lang="it">Bundle applicazione AppImage</comment>
- <comment xml:lang="kk">AppImage қолданбалар дестесі</comment>
- <comment xml:lang="ko">AppImage 프로그램 번들</comment>
- <comment xml:lang="pl">Pakiet programu AppImage</comment>
- <comment xml:lang="pt">pacote de aplicação AppImage</comment>
- <comment xml:lang="pt-BR">Pacote de aplicativo AppImage</comment>
- <comment xml:lang="ru">Пакет приложения AppImage</comment>
- <comment xml:lang="sk">Balík aplikácií AppImage</comment>
- <comment xml:lang="sr">скуп програма Ап-слике</comment>
- <comment xml:lang="sv">AppImage-programbunt</comment>
- <comment xml:lang="tr">AppImage uygulama paketi</comment>
+ <comment xml:lang="zh_TW">AppImage 應用程式套組</comment>
+ <comment xml:lang="zh_CN">AppImage 应用组合包</comment>
<comment xml:lang="uk">пакунок із програмами AppImage</comment>
- <comment xml:lang="zh-CN">AppImage 应用组合包</comment>
- <comment xml:lang="zh-TW">AppImage 應用程式套組</comment>
+ <comment xml:lang="tr">AppImage uygulama paketi</comment>
+ <comment xml:lang="sv">AppImage-programbunt</comment>
+ <comment xml:lang="sr">скуп програма Ап-слике</comment>
+ <comment xml:lang="sq">paketë aplikacioni AppImage</comment>
+ <comment xml:lang="si">AppImage යෙදුම් මිටියක්</comment>
+ <comment xml:lang="sk">Balík aplikácií AppImage</comment>
+ <comment xml:lang="ru">Пакет приложения AppImage</comment>
+ <comment xml:lang="pt_BR">Pacote de aplicativo AppImage</comment>
+ <comment xml:lang="pt">pacote de aplicação AppImage</comment>
+ <comment xml:lang="pl">Pakiet programu AppImage</comment>
+ <comment xml:lang="nl">AppImage-toepassingsbundel</comment>
+ <comment xml:lang="ko">AppImage 프로그램 번들</comment>
+ <comment xml:lang="kk">AppImage қолданбалар дестесі</comment>
+ <comment xml:lang="ja">AppImage アプリケーションバンドル</comment>
+ <comment xml:lang="it">Bundle applicazione AppImage</comment>
+ <comment xml:lang="is">AppImage forritavöndull</comment>
+ <comment xml:lang="id">Bundel aplikasi AppImage</comment>
+ <comment xml:lang="hu">AppImage alkalmazáscsomag</comment>
+ <comment xml:lang="hr">AppImage paket aplikacije</comment>
+ <comment xml:lang="he">חבילת יישומי AppImage</comment>
+ <comment xml:lang="gl">Paquete de aplicación de AppImage</comment>
+ <comment xml:lang="ga">burla feidhmchláir AppImage</comment>
+ <comment xml:lang="fur">côl di aplicazions AppImage</comment>
+ <comment xml:lang="fr">lot applicatif AppImage</comment>
+ <comment xml:lang="fi">AppImage-sovelluspaketti</comment>
+ <comment xml:lang="eu">AppImage aplikazio bilduma</comment>
+ <comment xml:lang="es">paquete de aplicación AppImage</comment>
+ <comment xml:lang="en_GB">AppImage application bundle</comment>
+ <comment xml:lang="de">AppImage-Anwendungspaket</comment>
+ <comment xml:lang="da">AppImage-programsamling</comment>
+ <comment xml:lang="cs">balíček AppImage s aplikací</comment>
+ <comment xml:lang="ca">paquet d'aplicació AppImage</comment>
+ <comment xml:lang="bg">Програмен пакет — AppImage</comment>
+ <comment xml:lang="be">пакет праграмы AppImage</comment>
+ <comment xml:lang="ar">حزمة تطبيق AppImage</comment>
+ <comment xml:lang="af">AppImage-toepassingsbundel</comment>
<sub-class-of type="application/x-executable"/>
- <sub-class-of type="application/x-cd-image"/>
+ <sub-class-of type="application/vnd.efi.iso"/>
<generic-icon name="application-x-executable"/>
- <magic priority="50">
+ <magic>
<match value="ELF" type="string" offset="1">
<match value="0x41" type="byte" offset="8">
<match value="0x49" type="byte" offset="9">
@@ -8978,57 +9065,60 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-cdrdao-toc">
<comment>CD Table Of Contents</comment>
- <comment xml:lang="af">CD-inhoudsopgawe</comment>
- <comment xml:lang="ar">جدول محتويات الـ CD</comment>
- <comment xml:lang="be-Latn">Źmieściva CD</comment>
- <comment xml:lang="bg">Съдържание на CD</comment>
- <comment xml:lang="ca">taula de continguts de CD</comment>
- <comment xml:lang="cs">obsah CD</comment>
- <comment xml:lang="da">Cd-indholdsfortegnelse</comment>
- <comment xml:lang="de">CD-Inhaltsverzeichnis</comment>
- <comment xml:lang="el">Πίνακας περιεχομένων CD</comment>
- <comment xml:lang="en-GB">CD Table Of Contents</comment>
- <comment xml:lang="es">índice de contenido de CD</comment>
- <comment xml:lang="eu">CDaren edukien aurkibidea</comment>
- <comment xml:lang="fi">CD-sisällysluettelo</comment>
- <comment xml:lang="fo">CD innihaldsyvurlit</comment>
- <comment xml:lang="fr">table des matières de CD</comment>
- <comment xml:lang="fur">tabele dai contignûts di CD</comment>
- <comment xml:lang="ga">clár ábhar dlúthdhiosca</comment>
- <comment xml:lang="gl">táboa de contidos de CD</comment>
- <comment xml:lang="he">תוכן עניינים של דיסק</comment>
- <comment xml:lang="hr">CD sadržaj</comment>
- <comment xml:lang="hu">CD tartalomjegyzék</comment>
- <comment xml:lang="ia">Tabula de contento de CD</comment>
- <comment xml:lang="id">Tabel Isi CD</comment>
- <comment xml:lang="it">Indice CD</comment>
- <comment xml:lang="ja">CD Table Of Contents</comment>
- <comment xml:lang="kk">CD құрама кестесі</comment>
- <comment xml:lang="ko">CD 내용 목록</comment>
- <comment xml:lang="lt">CD turinys</comment>
- <comment xml:lang="lv">CD satura rādītājs</comment>
- <comment xml:lang="nb">Innholdsfortegnelse for CD</comment>
- <comment xml:lang="nl">CD-inhoudsopgave</comment>
- <comment xml:lang="nn">CD innhaldsliste</comment>
- <comment xml:lang="oc">ensenhador de CD</comment>
- <comment xml:lang="pl">Plik zawartości płyty CD</comment>
- <comment xml:lang="pt">Tabela de conteúdos de CD</comment>
- <comment xml:lang="pt-BR">Sumário de CD</comment>
- <comment xml:lang="ro">Tabel conținut CD</comment>
- <comment xml:lang="ru">Таблица содержания CD</comment>
- <comment xml:lang="sk">Obsah CD</comment>
- <comment xml:lang="sl">Kazalo vsebine CD nosilca</comment>
- <comment xml:lang="sq">Tregues CD</comment>
- <comment xml:lang="sr">табела садржаја ЦД-а</comment>
- <comment xml:lang="sv">Cd-innehållsförteckning</comment>
- <comment xml:lang="tr">CD İçindekiler Tablosu</comment>
- <comment xml:lang="uk">зміст CD</comment>
+ <comment xml:lang="zh_TW">CD 內容目錄</comment>
+ <comment xml:lang="zh_CN">CD 索引</comment>
<comment xml:lang="vi">Mục Lục của đĩa CD</comment>
- <comment xml:lang="zh-CN">CD 索引</comment>
- <comment xml:lang="zh-TW">CD 內容目錄</comment>
+ <comment xml:lang="uk">зміст CD</comment>
+ <comment xml:lang="tr">CD İçindekiler Tablosu</comment>
+ <comment xml:lang="sv">Cd-innehållsförteckning</comment>
+ <comment xml:lang="sr">табела садржаја ЦД-а</comment>
+ <comment xml:lang="sq">Tryezë Lënde CD</comment>
+ <comment xml:lang="sl">Kazalo vsebine CD nosilca</comment>
+ <comment xml:lang="si">CD පටුන</comment>
+ <comment xml:lang="sk">Obsah CD</comment>
+ <comment xml:lang="ru">Содержание компакт-диска</comment>
+ <comment xml:lang="ro">Tabel conținut CD</comment>
+ <comment xml:lang="pt_BR">Sumário de CD</comment>
+ <comment xml:lang="pt">Tabela de conteúdos de CD</comment>
+ <comment xml:lang="pl">Plik zawartości płyty CD</comment>
+ <comment xml:lang="oc">ensenhador de CD</comment>
+ <comment xml:lang="nn">CD innhaldsliste</comment>
+ <comment xml:lang="nl">CD-inhoudsopgave</comment>
+ <comment xml:lang="nb">Innholdsfortegnelse for CD</comment>
+ <comment xml:lang="lv">CD satura rādītājs</comment>
+ <comment xml:lang="lt">CD turinys</comment>
+ <comment xml:lang="ko">CD 내용 목록</comment>
+ <comment xml:lang="kk">CD құрама кестесі</comment>
+ <comment xml:lang="ja">CD Table Of Contents</comment>
+ <comment xml:lang="it">Indice CD</comment>
+ <comment xml:lang="is">Efnisyfirlit CD-disks</comment>
+ <comment xml:lang="id">Tabel Isi CD</comment>
+ <comment xml:lang="ia">Tabula de contento de CD</comment>
+ <comment xml:lang="hu">CD tartalomjegyzék</comment>
+ <comment xml:lang="hr">CD sadržaj</comment>
+ <comment xml:lang="he">תוכן עניינים של דיסק</comment>
+ <comment xml:lang="gl">táboa de contidos de CD</comment>
+ <comment xml:lang="ga">clár ábhar dlúthdhiosca</comment>
+ <comment xml:lang="fur">tabele dai contignûts di CD</comment>
+ <comment xml:lang="fr">table des matières de CD</comment>
+ <comment xml:lang="fo">CD innihaldsyvurlit</comment>
+ <comment xml:lang="fi">CD-sisällysluettelo</comment>
+ <comment xml:lang="eu">CDaren edukien aurkibidea</comment>
+ <comment xml:lang="es">índice de contenido de CD</comment>
+ <comment xml:lang="en_GB">CD Table Of Contents</comment>
+ <comment xml:lang="el">Πίνακας περιεχομένων CD</comment>
+ <comment xml:lang="de">CD-Inhaltsverzeichnis</comment>
+ <comment xml:lang="da">Cd-indholdsfortegnelse</comment>
+ <comment xml:lang="cs">obsah CD</comment>
+ <comment xml:lang="ca">taula de continguts de CD</comment>
+ <comment xml:lang="bg">Съдържание на CD</comment>
+ <comment xml:lang="be@latin">Źmieściva CD</comment>
+ <comment xml:lang="be">табліца змесціва CD</comment>
+ <comment xml:lang="ar">جدول محتويات CD</comment>
+ <comment xml:lang="af">CD-inhoudsopgawe</comment>
<sub-class-of type="text/plain"/>
<generic-icon name="text-x-generic"/>
- <magic priority="50">
+ <magic>
<match type="string" value="CD_ROM\n" offset="0"/>
<match type="string" value="CD_DA\n" offset="0"/>
<match type="string" value="CD_ROM_XA\n" offset="0"/>
@@ -9041,11 +9131,32 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-gd-rom-cue">
<comment>GD-ROM image cuesheet</comment>
- <comment xml:lang="ca">«cuesheet» d'imatge de GD-ROM</comment>
- <comment xml:lang="fi">GD-ROM levykuvan taulukko</comment>
- <comment xml:lang="it">Cuesheet immagine GD-ROM</comment>
- <comment xml:lang="pl">Obraz cuesheet płyty GD-ROM</comment>
<comment xml:lang="uk">таблиця CUE образу GD-ROM</comment>
+ <comment xml:lang="tr">GD-ROM görüntüsü çizelgesi</comment>
+ <comment xml:lang="sv">GD-ROM Indexblad för cd-avbild</comment>
+ <comment xml:lang="si">GD-ROM රූප කුට්ටිය</comment>
+ <comment xml:lang="ru">Файл разметки образа GD-ROM</comment>
+ <comment xml:lang="pt_BR">Índice de Imagem de GD-ROM</comment>
+ <comment xml:lang="pl">Obraz cuesheet płyty GD-ROM</comment>
+ <comment xml:lang="nl">GD-ROM-schijfkopiebestand-cue-sheet</comment>
+ <comment xml:lang="ko">GD-ROM 이미지 큐시트</comment>
+ <comment xml:lang="kk">GD-ROM бейнесінің құрама кестесі</comment>
+ <comment xml:lang="ja">GD-ROM イメージキューシート</comment>
+ <comment xml:lang="it">Cuesheet immagine GD-ROM</comment>
+ <comment xml:lang="is">cuesheet CD-ROM diskmyndar</comment>
+ <comment xml:lang="id">cuesheet image GD-ROM</comment>
+ <comment xml:lang="hu">GD-ROM lemezkép-jelölőlap</comment>
+ <comment xml:lang="hr">GD-ROM popis slika</comment>
+ <comment xml:lang="he">גיליון cue של דמות GD-ROM</comment>
+ <comment xml:lang="fr">Index de pistes GD-ROM</comment>
+ <comment xml:lang="fi">GD-ROM levykuvan taulukko</comment>
+ <comment xml:lang="es">hoja CUE de imagen GD-ROM</comment>
+ <comment xml:lang="en_GB">GD-ROM image cuesheet</comment>
+ <comment xml:lang="de">GD-ROM-Abbild-Cuesheet</comment>
+ <comment xml:lang="da">GD-ROM-aftrykscuesheet</comment>
+ <comment xml:lang="ca">«cuesheet» d'imatge de GD-ROM</comment>
+ <comment xml:lang="be">табліца разметкі вобраза GD-ROM</comment>
+ <comment xml:lang="ar">صفيحة صورة الـGD-ROM جديلة</comment>
<!-- It is a non-standard cuesheet used only for Dreamcast GD-ROM images, it
is typically surrounded by the .bin and .raw files it lists, each one
matching a disc track.
@@ -9056,127 +9167,156 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-discjuggler-cd-image">
<comment>Padus DiscJuggler CD image</comment>
- <comment xml:lang="ca">imatge de CD de Padus DiscJuggler</comment>
- <comment xml:lang="fi">Padus DiscJuggler CD-levykuva</comment>
- <comment xml:lang="it">Immagine CD DiscJuggler Padus</comment>
- <comment xml:lang="pl">Obraz płyty CD programu Padus DiscJuggler</comment>
- <comment xml:lang="pt-BR">Imagem de CD do Padus DiscJuggler</comment>
+ <comment xml:lang="zh_CN">Padus DiscJuggler CD 映像</comment>
<comment xml:lang="uk">образ CD Padus DiscJuggler</comment>
+ <comment xml:lang="tr">Padus DiscJuggler CD görüntüsü</comment>
+ <comment xml:lang="sv">Padus DiscJuggler cd-avbild</comment>
+ <comment xml:lang="si">Padus DiscJuggler CD රූපය</comment>
+ <comment xml:lang="ru">Образ диска Padus DiscJuggler CD</comment>
+ <comment xml:lang="pt_BR">Imagem de CD do Padus DiscJuggler</comment>
+ <comment xml:lang="pl">Obraz płyty CD programu Padus DiscJuggler</comment>
+ <comment xml:lang="nl">Padus DiscJuggler CD-schijfkopiebestand</comment>
+ <comment xml:lang="ko">Padus DiscJuggler CD 이미지</comment>
+ <comment xml:lang="kk">Padus DiscJuggler CD бейнесі</comment>
+ <comment xml:lang="ja">Padus DiscJuggler CD イメージ</comment>
+ <comment xml:lang="it">Immagine CD DiscJuggler Padus</comment>
+ <comment xml:lang="is">Padus DiscJuggler CD diskmynd</comment>
+ <comment xml:lang="id">image CD Padus DiscJuggler</comment>
+ <comment xml:lang="hu">Padus DiscJuggler CD lemezkép</comment>
+ <comment xml:lang="hr">Padus DiscJuggler CD slika</comment>
+ <comment xml:lang="he">תמונת תקליטור Padus DiscJuggler</comment>
+ <comment xml:lang="gl">Imaxe de CD Padus DiscJuggler</comment>
+ <comment xml:lang="fr">Image CD Padus DiscJuggler</comment>
+ <comment xml:lang="fi">Padus DiscJuggler CD-levykuva</comment>
+ <comment xml:lang="es">imagen de CD de Padus DiscJuggler</comment>
+ <comment xml:lang="en_GB">Padus DiscJuggler CD image</comment>
+ <comment xml:lang="de">Padus-DiscJuggler-CD-Abbild</comment>
+ <comment xml:lang="da">Padus DiscJuggler CD-aftryk</comment>
+ <comment xml:lang="ca">imatge de CD de Padus DiscJuggler</comment>
+ <comment xml:lang="be">вобраз CD Padus DiscJuggler</comment>
+ <comment xml:lang="ar">صورة سي دي Padus DiscJuggler</comment>
+ <generic-icon name="media-optical"/>
<glob pattern="*.cdi"/>
</mime-type>
<mime-type type="application/vnd.chess-pgn">
<comment>PGN chess game notation</comment>
- <comment xml:lang="af">PGN-skaakspelnotasie</comment>
- <comment xml:lang="ar">تدوينة لعبة الشطرنج PGN</comment>
- <comment xml:lang="be-Latn">Zaciem ab šachmatnaj partyi PGN</comment>
- <comment xml:lang="bg">Игра шах — PGN</comment>
- <comment xml:lang="ca">notació de joc d'escacs PGN</comment>
- <comment xml:lang="cs">šachová notace PGN</comment>
- <comment xml:lang="da">PGN-skakspilsnotation</comment>
- <comment xml:lang="de">PGN-Schachspielnotation</comment>
- <comment xml:lang="el">Σημειογραφία παιχνιδιού σκακιού PGN</comment>
- <comment xml:lang="en-GB">PGN chess game notation</comment>
- <comment xml:lang="es">notación para juegos de ajedrez PGN</comment>
- <comment xml:lang="eu">PGN xake jokoaren notazioa</comment>
- <comment xml:lang="fi">PGN-šakkipelinotaatio</comment>
- <comment xml:lang="fo">PGN talv teknskipan</comment>
- <comment xml:lang="fr">notation de jeu d'échecs PGN</comment>
- <comment xml:lang="fur">notazion par zûc di scacs PGN</comment>
- <comment xml:lang="ga">nodaireacht chluiche ficheall PGN</comment>
- <comment xml:lang="gl">Notación de xogo de xadrez PGN</comment>
- <comment xml:lang="he">סימון משחק שח PGN</comment>
- <comment xml:lang="hr">PGN zapis šahovske igre</comment>
- <comment xml:lang="hu">PGN sakkfeljegyzés</comment>
- <comment xml:lang="ia">Notation de joco de chacos PGN</comment>
- <comment xml:lang="id">Notasi permainan catur PGN</comment>
- <comment xml:lang="it">Notazione partita a scacchi PGN</comment>
- <comment xml:lang="ja">PGN チェスゲーム記録</comment>
- <comment xml:lang="kk">PGN шахмат ойыны</comment>
- <comment xml:lang="ko">PGN 체스 게임 기보</comment>
- <comment xml:lang="lt">PGN šachmatų žaidimo žymėjimas</comment>
- <comment xml:lang="lv">PGN šaha spēles notācija</comment>
- <comment xml:lang="nb">PGN sjakkspillnotasjon</comment>
- <comment xml:lang="nl">PGN-schaakspelnotatie</comment>
- <comment xml:lang="nn">PGN-sjakkspelnotasjon</comment>
- <comment xml:lang="oc">notacion de jòc d'escacs PGN</comment>
- <comment xml:lang="pl">Plik PGN notacji gry w szachy</comment>
- <comment xml:lang="pt">notação de jogo de xadrez PGN</comment>
- <comment xml:lang="pt-BR">Notação de jogo de xadrez PGN</comment>
- <comment xml:lang="ro">Notație joc șah PGN</comment>
- <comment xml:lang="ru">Шахматная партия PGN</comment>
- <comment xml:lang="sk">Šachová notácia PGN</comment>
- <comment xml:lang="sl">Datoteka opomb šahovske igre PGN</comment>
- <comment xml:lang="sq">Njoftim loje shahu PGN</comment>
- <comment xml:lang="sr">ПГН забелешка шаховске игре</comment>
- <comment xml:lang="sv">PGN-schackpartinotation</comment>
- <comment xml:lang="tr">PGN satranç oyun gösterimi</comment>
- <comment xml:lang="uk">запис гри у шахи PGN</comment>
+ <comment xml:lang="zh_TW">PGN 國際象棋棋譜</comment>
+ <comment xml:lang="zh_CN">PGN 象棋游戏注记</comment>
<comment xml:lang="vi">Cách ghi lượt chơi cờ PGN</comment>
- <comment xml:lang="zh-CN">PGN 象棋游戏注记</comment>
- <comment xml:lang="zh-TW">PGN 國際象棋棋譜</comment>
+ <comment xml:lang="uk">запис гри у шахи PGN</comment>
+ <comment xml:lang="tr">PGN satranç oyun gösterimi</comment>
+ <comment xml:lang="sv">PGN-schackpartinotation</comment>
+ <comment xml:lang="sr">ПГН забелешка шаховске игре</comment>
+ <comment xml:lang="sq">sistem zbardhjeje loje shahu PGN</comment>
+ <comment xml:lang="sl">Datoteka opomb šahovske igre PGN</comment>
+ <comment xml:lang="si">PGN චෙස් ක්‍රීඩා අංකනය</comment>
+ <comment xml:lang="sk">Šachová notácia PGN</comment>
+ <comment xml:lang="ru">Шахматная партия PGN</comment>
+ <comment xml:lang="ro">Notație joc șah PGN</comment>
+ <comment xml:lang="pt_BR">Notação de jogo de xadrez PGN</comment>
+ <comment xml:lang="pt">notação de jogo de xadrez PGN</comment>
+ <comment xml:lang="pl">Plik PGN notacji gry w szachy</comment>
+ <comment xml:lang="oc">notacion de jòc d'escacs PGN</comment>
+ <comment xml:lang="nn">PGN-sjakkspelnotasjon</comment>
+ <comment xml:lang="nl">PGN-schaakspelnotatie</comment>
+ <comment xml:lang="nb">PGN sjakkspillnotasjon</comment>
+ <comment xml:lang="lv">PGN šaha spēles notācija</comment>
+ <comment xml:lang="lt">PGN šachmatų žaidimo žymėjimas</comment>
+ <comment xml:lang="ko">PGN 체스 게임 기보</comment>
+ <comment xml:lang="kk">PGN шахмат ойыны</comment>
+ <comment xml:lang="ja">PGN チェスゲーム記録</comment>
+ <comment xml:lang="it">Notazione partita a scacchi PGN</comment>
+ <comment xml:lang="is">færsla PGN skákleiks</comment>
+ <comment xml:lang="id">Notasi permainan catur PGN</comment>
+ <comment xml:lang="ia">Notation de joco de chacos PGN</comment>
+ <comment xml:lang="hu">PGN sakkfeljegyzés</comment>
+ <comment xml:lang="hr">PGN zapis šahovske igre</comment>
+ <comment xml:lang="he">סימון משחק שח PGN</comment>
+ <comment xml:lang="gl">Notación de xogo de xadrez PGN</comment>
+ <comment xml:lang="ga">nodaireacht chluiche ficheall PGN</comment>
+ <comment xml:lang="fur">notazion par zûc di scacs PGN</comment>
+ <comment xml:lang="fr">notation de jeu d'échecs PGN</comment>
+ <comment xml:lang="fo">PGN talv teknskipan</comment>
+ <comment xml:lang="fi">PGN-šakkipelinotaatio</comment>
+ <comment xml:lang="eu">PGN xake jokoaren notazioa</comment>
+ <comment xml:lang="es">notación para juegos de ajedrez PGN</comment>
+ <comment xml:lang="en_GB">PGN chess game notation</comment>
+ <comment xml:lang="el">Σημειογραφία παιχνιδιού σκακιού PGN</comment>
+ <comment xml:lang="de">PGN-Schachspielnotation</comment>
+ <comment xml:lang="da">PGN-skakspilsnotation</comment>
+ <comment xml:lang="cs">šachová notace PGN</comment>
+ <comment xml:lang="ca">notació de joc d'escacs PGN</comment>
+ <comment xml:lang="bg">Игра шах — PGN</comment>
+ <comment xml:lang="be@latin">Zaciem ab šachmatnaj partyi PGN</comment>
+ <comment xml:lang="be">запіс шахматнай партыі PGN</comment>
+ <comment xml:lang="ar">تدوينة لعبة شطرنج PGN</comment>
+ <comment xml:lang="af">PGN-skaakspelnotasie</comment>
<acronym>PGN</acronym>
<expanded-acronym>Portable Game Notation</expanded-acronym>
<generic-icon name="text-x-generic"/>
<glob pattern="*.pgn"/>
<sub-class-of type="text/plain"/>
- <magic priority="50">
+ <magic>
<match type="string" value="[Event " offset="0"/>
</magic>
<alias type="application/x-chess-pgn"/>
</mime-type>
<mime-type type="application/vnd.ms-htmlhelp">
<comment>CHM document</comment>
- <comment xml:lang="af">CHM-dokument</comment>
- <comment xml:lang="ar">مستند CHM</comment>
- <comment xml:lang="ast">Documentu CHM</comment>
- <comment xml:lang="be-Latn">Dakument CHM</comment>
- <comment xml:lang="bg">Документ — CHM</comment>
- <comment xml:lang="ca">document CHM</comment>
- <comment xml:lang="cs">dokument CHM</comment>
- <comment xml:lang="da">CHM-dokument</comment>
- <comment xml:lang="de">CHM-Dokument</comment>
- <comment xml:lang="el">Έγγραφο CHM</comment>
- <comment xml:lang="en-GB">CHM document</comment>
- <comment xml:lang="eo">CHM-dokumento</comment>
- <comment xml:lang="es">documento CHM</comment>
- <comment xml:lang="eu">CHM dokumentua</comment>
- <comment xml:lang="fi">CHM-asiakirja</comment>
- <comment xml:lang="fo">CHM skjal</comment>
- <comment xml:lang="fr">document CHM</comment>
- <comment xml:lang="fur">document CHM</comment>
- <comment xml:lang="ga">cáipéis CHM</comment>
- <comment xml:lang="gl">documento CHM</comment>
- <comment xml:lang="he">מסמך CHM</comment>
- <comment xml:lang="hr">CHM dokument</comment>
- <comment xml:lang="hu">CHM dokumentum</comment>
- <comment xml:lang="ia">Documento CHM</comment>
- <comment xml:lang="id">Dokumen CHM</comment>
- <comment xml:lang="it">Documento CHM</comment>
- <comment xml:lang="ja">CHM ドキュメント</comment>
- <comment xml:lang="ka">CHM დოკუმენტი</comment>
- <comment xml:lang="kk">CHM құжаты</comment>
- <comment xml:lang="ko">CHM 문서</comment>
- <comment xml:lang="lt">CHM dokumentas</comment>
- <comment xml:lang="lv">CHM dokuments</comment>
- <comment xml:lang="nb">CHM-dokument</comment>
- <comment xml:lang="nl">CHM-document</comment>
- <comment xml:lang="nn">CHM-dokument</comment>
- <comment xml:lang="oc">document CHM</comment>
- <comment xml:lang="pl">Dokument CHM</comment>
- <comment xml:lang="pt">documento CHM</comment>
- <comment xml:lang="pt-BR">Documento CHM</comment>
- <comment xml:lang="ro">Document CHM</comment>
- <comment xml:lang="ru">Документ CHM</comment>
- <comment xml:lang="sk">Dokument CHM</comment>
- <comment xml:lang="sl">Dokument CHM</comment>
- <comment xml:lang="sq">Dokument CHM</comment>
- <comment xml:lang="sr">ЦХМ документ</comment>
- <comment xml:lang="sv">CHM-dokument</comment>
- <comment xml:lang="tr">CHM belgesi</comment>
- <comment xml:lang="uk">документ CHM</comment>
+ <comment xml:lang="zh_TW">CHM 文件</comment>
+ <comment xml:lang="zh_CN">CHM 文档</comment>
<comment xml:lang="vi">Tài liệu CHM</comment>
- <comment xml:lang="zh-CN">CHM 文档</comment>
- <comment xml:lang="zh-TW">CHM 文件</comment>
+ <comment xml:lang="uk">документ CHM</comment>
+ <comment xml:lang="tr">CHM belgesi</comment>
+ <comment xml:lang="sv">CHM-dokument</comment>
+ <comment xml:lang="sr">ЦХМ документ</comment>
+ <comment xml:lang="sq">dokument CHM</comment>
+ <comment xml:lang="sl">Dokument CHM</comment>
+ <comment xml:lang="si">CHM ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument CHM</comment>
+ <comment xml:lang="ru">Документ CHM</comment>
+ <comment xml:lang="ro">Document CHM</comment>
+ <comment xml:lang="pt_BR">Documento CHM</comment>
+ <comment xml:lang="pt">documento CHM</comment>
+ <comment xml:lang="pl">Dokument CHM</comment>
+ <comment xml:lang="oc">document CHM</comment>
+ <comment xml:lang="nn">CHM-dokument</comment>
+ <comment xml:lang="nl">CHM-document</comment>
+ <comment xml:lang="nb">CHM-dokument</comment>
+ <comment xml:lang="lv">CHM dokuments</comment>
+ <comment xml:lang="lt">CHM dokumentas</comment>
+ <comment xml:lang="ko">CHM 문서</comment>
+ <comment xml:lang="kk">CHM құжаты</comment>
+ <comment xml:lang="ka">CHM დოკუმენტი</comment>
+ <comment xml:lang="ja">CHM ドキュメント</comment>
+ <comment xml:lang="it">Documento CHM</comment>
+ <comment xml:lang="is">CHM skjal</comment>
+ <comment xml:lang="id">Dokumen CHM</comment>
+ <comment xml:lang="ia">Documento CHM</comment>
+ <comment xml:lang="hu">CHM dokumentum</comment>
+ <comment xml:lang="hr">CHM dokument</comment>
+ <comment xml:lang="he">מסמך CHM</comment>
+ <comment xml:lang="gl">documento CHM</comment>
+ <comment xml:lang="ga">cáipéis CHM</comment>
+ <comment xml:lang="fur">document CHM</comment>
+ <comment xml:lang="fr">document CHM</comment>
+ <comment xml:lang="fo">CHM skjal</comment>
+ <comment xml:lang="fi">CHM-asiakirja</comment>
+ <comment xml:lang="eu">CHM dokumentua</comment>
+ <comment xml:lang="es">documento CHM</comment>
+ <comment xml:lang="eo">CHM-dokumento</comment>
+ <comment xml:lang="en_GB">CHM document</comment>
+ <comment xml:lang="el">Έγγραφο CHM</comment>
+ <comment xml:lang="de">CHM-Dokument</comment>
+ <comment xml:lang="da">CHM-dokument</comment>
+ <comment xml:lang="cs">dokument CHM</comment>
+ <comment xml:lang="ca">document CHM</comment>
+ <comment xml:lang="bg">Документ — CHM</comment>
+ <comment xml:lang="be@latin">Dakument CHM</comment>
+ <comment xml:lang="be">дакумент CHM</comment>
+ <comment xml:lang="ast">Documentu CHM</comment>
+ <comment xml:lang="ar">مستند CHM</comment>
+ <comment xml:lang="af">CHM-dokument</comment>
<acronym>CHM</acronym>
<expanded-acronym>Compiled Help Modules</expanded-acronym>
<generic-icon name="x-office-document"/>
@@ -9185,225 +9325,191 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-class-file">
<comment>Java byte code</comment>
- <comment xml:lang="af">Java binêre kode</comment>
- <comment xml:lang="ar">رمز بايت الـJava</comment>
- <comment xml:lang="az">Java bayt kodu</comment>
- <comment xml:lang="be-Latn">Bajtavy kod Java</comment>
- <comment xml:lang="bg">Байт код за Java</comment>
- <comment xml:lang="ca">bytecode de Java</comment>
- <comment xml:lang="cs">bajtový kód Java</comment>
- <comment xml:lang="cy">Côd beit Java</comment>
- <comment xml:lang="da">Java-bytekode</comment>
- <comment xml:lang="de">Java-Bytecode</comment>
- <comment xml:lang="el">Συμβολοκώδικας Java</comment>
- <comment xml:lang="en-GB">Java byte code</comment>
- <comment xml:lang="eo">Java-bajtkodo</comment>
- <comment xml:lang="es">bytecode de Java</comment>
- <comment xml:lang="eu">Java byte-kodea</comment>
- <comment xml:lang="fi">Java-tavukoodi</comment>
- <comment xml:lang="fo">Java býtkota</comment>
- <comment xml:lang="fr">code Java binaire</comment>
- <comment xml:lang="fur">bytecode di Java</comment>
- <comment xml:lang="ga">beartchód Java</comment>
- <comment xml:lang="gl">byte code de Java</comment>
- <comment xml:lang="he">קוד Java byte</comment>
- <comment xml:lang="hr">Java bajt kôd</comment>
- <comment xml:lang="hu">Java-bájtkód</comment>
- <comment xml:lang="ia">Codice intermediari de Java</comment>
- <comment xml:lang="id">Kode bita Java</comment>
- <comment xml:lang="it">Bytecode Java</comment>
- <comment xml:lang="ja">Java バイトコード</comment>
- <comment xml:lang="kk">Java байт коды</comment>
- <comment xml:lang="ko">Java 바이트 코드</comment>
- <comment xml:lang="lt">Java baitinis kodas</comment>
- <comment xml:lang="lv">Java bitu kods</comment>
- <comment xml:lang="ms">Kod bait Java</comment>
- <comment xml:lang="nb">Java-bytekode</comment>
- <comment xml:lang="nl">Java-bytecode</comment>
- <comment xml:lang="nn">Jave byte-kode</comment>
- <comment xml:lang="oc">còde Java binari</comment>
- <comment xml:lang="pl">Kod bajtowy Java</comment>
- <comment xml:lang="pt">byte-code Java</comment>
- <comment xml:lang="pt-BR">Código compilado Java</comment>
- <comment xml:lang="ro">Bytecode Java</comment>
- <comment xml:lang="ru">Байт-код Java</comment>
- <comment xml:lang="sk">Bajtový kód Java</comment>
- <comment xml:lang="sl">Datoteka bitne kode Java</comment>
- <comment xml:lang="sq">Byte code Java</comment>
- <comment xml:lang="sr">бајтни ко̂д Јаве</comment>
- <comment xml:lang="sv">Java-bytekod</comment>
- <comment xml:lang="tr">Java derlenmiş kodu</comment>
- <comment xml:lang="uk">Байт-код Java</comment>
+ <comment xml:lang="zh_TW">Java 位元組碼</comment>
+ <comment xml:lang="zh_CN">Java 字节码</comment>
<comment xml:lang="vi">Mã byte Java</comment>
- <comment xml:lang="zh-CN">Java 字节码</comment>
- <comment xml:lang="zh-TW">Java 位元組碼</comment>
+ <comment xml:lang="uk">Байт-код Java</comment>
+ <comment xml:lang="tr">Java derlenmiş kodu</comment>
+ <comment xml:lang="sv">Java-bytekod</comment>
+ <comment xml:lang="sr">бајтни ко̂д Јаве</comment>
+ <comment xml:lang="sl">Datoteka bitne kode Java</comment>
+ <comment xml:lang="si">ජාවා බයිට් කේතය</comment>
+ <comment xml:lang="sk">Bajtový kód Java</comment>
+ <comment xml:lang="ru">Байт-код Java</comment>
+ <comment xml:lang="ro">Bytecode Java</comment>
+ <comment xml:lang="pt_BR">Código compilado Java</comment>
+ <comment xml:lang="pt">byte-code Java</comment>
+ <comment xml:lang="pl">Kod bajtowy Java</comment>
+ <comment xml:lang="oc">còde Java binari</comment>
+ <comment xml:lang="nn">Jave byte-kode</comment>
+ <comment xml:lang="nl">Java-bytecode</comment>
+ <comment xml:lang="nb">Java-bytekode</comment>
+ <comment xml:lang="ms">Kod bait Java</comment>
+ <comment xml:lang="lv">Java bitu kods</comment>
+ <comment xml:lang="lt">Java baitinis kodas</comment>
+ <comment xml:lang="ko">Java 바이트 코드</comment>
+ <comment xml:lang="kk">Java байт коды</comment>
+ <comment xml:lang="ja">Java バイトコード</comment>
+ <comment xml:lang="it">Bytecode Java</comment>
+ <comment xml:lang="is">Java bætkóði</comment>
+ <comment xml:lang="id">Kode bita Java</comment>
+ <comment xml:lang="ia">Codice intermediari de Java</comment>
+ <comment xml:lang="hu">Java-bájtkód</comment>
+ <comment xml:lang="hr">Java bajt kôd</comment>
+ <comment xml:lang="he">קוד Java byte</comment>
+ <comment xml:lang="gl">byte code de Java</comment>
+ <comment xml:lang="ga">beartchód Java</comment>
+ <comment xml:lang="fur">bytecode di Java</comment>
+ <comment xml:lang="fr">code Java binaire</comment>
+ <comment xml:lang="fo">Java býtkota</comment>
+ <comment xml:lang="fi">Java-tavukoodi</comment>
+ <comment xml:lang="eu">Java byte-kodea</comment>
+ <comment xml:lang="es">bytecode de Java</comment>
+ <comment xml:lang="eo">Java-bajtkodo</comment>
+ <comment xml:lang="en_GB">Java byte code</comment>
+ <comment xml:lang="el">Συμβολοκώδικας Java</comment>
+ <comment xml:lang="de">Java-Bytecode</comment>
+ <comment xml:lang="da">Java-bytekode</comment>
+ <comment xml:lang="cy">Côd beit Java</comment>
+ <comment xml:lang="cs">bajtový kód Java</comment>
+ <comment xml:lang="ca">bytecode de Java</comment>
+ <comment xml:lang="bg">Байт код за Java</comment>
+ <comment xml:lang="be@latin">Bajtavy kod Java</comment>
+ <comment xml:lang="be">байт-код Java</comment>
+ <comment xml:lang="az">Java bayt kodu</comment>
+ <comment xml:lang="ar">رمز بايت Java</comment>
+ <comment xml:lang="af">Java binêre kode</comment>
</mime-type>
<mime-type type="application/x-compress">
<comment>UNIX-compressed file</comment>
- <comment xml:lang="af">UNIX-saamgepersde lêer</comment>
- <comment xml:lang="ar">ملف يونكس-مضغوط</comment>
- <comment xml:lang="be-Latn">Skampresavany UNIX-fajł</comment>
- <comment xml:lang="bg">Файл — компресиран за UNIX</comment>
- <comment xml:lang="ca">fitxer amb compressió UNIX</comment>
- <comment xml:lang="cs">soubor komprimovaný v Unixu</comment>
- <comment xml:lang="da">UNIX-komprimeret fil</comment>
- <comment xml:lang="de">UNIX-komprimierte Datei</comment>
- <comment xml:lang="el">Συμπιεσμένο αρχείο UNIX</comment>
- <comment xml:lang="en-GB">UNIX-compressed file</comment>
- <comment xml:lang="eo">UNIX-kunpremita dosiero</comment>
- <comment xml:lang="es">archivo comprimido de Unix</comment>
- <comment xml:lang="eu">UNIX-en konprimitutako fitxategia</comment>
- <comment xml:lang="fi">UNIX-pakattu tiedosto</comment>
- <comment xml:lang="fo">UNIX-stappað fíla</comment>
- <comment xml:lang="fr">fichier compressé UNIX</comment>
- <comment xml:lang="fur">file comprimût di UNIX</comment>
- <comment xml:lang="ga">comhad UNIX-comhbhrúite</comment>
- <comment xml:lang="gl">ficheiro comprimido de UNIX</comment>
- <comment xml:lang="he">קובץ בכיווץ UNIX</comment>
- <comment xml:lang="hr">UNIX sažeta datoteka</comment>
- <comment xml:lang="hu">UNIX tömörítésű fájl</comment>
- <comment xml:lang="ia">File comprimite de UNIX</comment>
- <comment xml:lang="id">Berkas terkompresi UNIX</comment>
- <comment xml:lang="it">File compresso-UNIX</comment>
- <comment xml:lang="ja">UNIX-compress ファイル</comment>
- <comment xml:lang="kk">файл (UNIX-сығылған)</comment>
- <comment xml:lang="ko">UNIX 압축 파일</comment>
- <comment xml:lang="lt">UNIX suglaudintas failas</comment>
- <comment xml:lang="lv">UNIX saspiesta datne</comment>
- <comment xml:lang="ms">Fail termampat-UNIX</comment>
- <comment xml:lang="nb">UNIX-komprimert fil</comment>
- <comment xml:lang="nl">UNIX-ingepakt bestand</comment>
- <comment xml:lang="nn">UNIX-komprimert fil</comment>
- <comment xml:lang="oc">fichièr compressat UNIX</comment>
- <comment xml:lang="pl">Skompresowany plik systemu UNIX</comment>
- <comment xml:lang="pt">ficheiro comprimido UNIX</comment>
- <comment xml:lang="pt-BR">Arquivo compactado do UNIX</comment>
- <comment xml:lang="ro">Fișier comprimat UNIX</comment>
- <comment xml:lang="ru">Файл (UNIX-сжатый)</comment>
- <comment xml:lang="sk">Súbor komprimovaný v Unixe</comment>
- <comment xml:lang="sl">Skrčena Unix datoteka</comment>
- <comment xml:lang="sq">File i kompresuar UNIX</comment>
- <comment xml:lang="sr">датотека запакована ЈУНИКС-ом</comment>
- <comment xml:lang="sv">UNIX-komprimerad fil</comment>
- <comment xml:lang="tr">UNIX-sıkıştırılmış dosyası</comment>
- <comment xml:lang="uk">стиснений файл UNIX</comment>
+ <comment xml:lang="zh_TW">UNIX 壓縮檔</comment>
+ <comment xml:lang="zh_CN">UNIX 压缩文件</comment>
<comment xml:lang="vi">Tập tin đã nén UNIX</comment>
- <comment xml:lang="zh-CN">UNIX 压缩文件</comment>
- <comment xml:lang="zh-TW">UNIX 壓縮檔</comment>
+ <comment xml:lang="uk">стиснений файл UNIX</comment>
+ <comment xml:lang="tr">UNIX-sıkıştırılmış dosyası</comment>
+ <comment xml:lang="sv">UNIX-komprimerad fil</comment>
+ <comment xml:lang="sr">датотека запакована ЈУНИКС-ом</comment>
+ <comment xml:lang="sq">kartelë e ngjeshur me Unix</comment>
+ <comment xml:lang="sl">Skrčena Unix datoteka</comment>
+ <comment xml:lang="si">UNIX සම්පීඩිත ගොනුව</comment>
+ <comment xml:lang="sk">Súbor komprimovaný v Unixe</comment>
+ <comment xml:lang="ru">Сжатый файл UNIX</comment>
+ <comment xml:lang="ro">Fișier comprimat UNIX</comment>
+ <comment xml:lang="pt_BR">Arquivo compactado do UNIX</comment>
+ <comment xml:lang="pt">ficheiro comprimido UNIX</comment>
+ <comment xml:lang="pl">Skompresowany plik systemu UNIX</comment>
+ <comment xml:lang="oc">fichièr compressat UNIX</comment>
+ <comment xml:lang="nn">UNIX-komprimert fil</comment>
+ <comment xml:lang="nl">UNIX-ingepakt bestand</comment>
+ <comment xml:lang="nb">UNIX-komprimert fil</comment>
+ <comment xml:lang="ms">Fail termampat-UNIX</comment>
+ <comment xml:lang="lv">UNIX saspiesta datne</comment>
+ <comment xml:lang="lt">UNIX suglaudintas failas</comment>
+ <comment xml:lang="ko">UNIX 압축 파일</comment>
+ <comment xml:lang="kk">файл (UNIX-сығылған)</comment>
+ <comment xml:lang="ja">UNIX-compress ファイル</comment>
+ <comment xml:lang="it">File compresso-UNIX</comment>
+ <comment xml:lang="is">UNIX-þjöppuð skrá</comment>
+ <comment xml:lang="id">Berkas terkompresi UNIX</comment>
+ <comment xml:lang="ia">File comprimite de UNIX</comment>
+ <comment xml:lang="hu">UNIX tömörítésű fájl</comment>
+ <comment xml:lang="hr">UNIX sažeta datoteka</comment>
+ <comment xml:lang="he">קובץ בכיווץ UNIX</comment>
+ <comment xml:lang="gl">ficheiro comprimido de UNIX</comment>
+ <comment xml:lang="ga">comhad UNIX-comhbhrúite</comment>
+ <comment xml:lang="fur">file comprimût di UNIX</comment>
+ <comment xml:lang="fr">fichier compressé UNIX</comment>
+ <comment xml:lang="fo">UNIX-stappað fíla</comment>
+ <comment xml:lang="fi">UNIX-pakattu tiedosto</comment>
+ <comment xml:lang="eu">UNIX-en konprimitutako fitxategia</comment>
+ <comment xml:lang="es">archivo comprimido de Unix</comment>
+ <comment xml:lang="eo">UNIX-kunpremita dosiero</comment>
+ <comment xml:lang="en_GB">UNIX-compressed file</comment>
+ <comment xml:lang="el">Συμπιεσμένο αρχείο UNIX</comment>
+ <comment xml:lang="de">UNIX-komprimierte Datei</comment>
+ <comment xml:lang="da">UNIX-komprimeret fil</comment>
+ <comment xml:lang="cs">soubor komprimovaný v Unixu</comment>
+ <comment xml:lang="ca">fitxer amb compressió UNIX</comment>
+ <comment xml:lang="bg">Файл — компресиран за UNIX</comment>
+ <comment xml:lang="be@latin">Skampresavany UNIX-fajł</comment>
+ <comment xml:lang="be">файл сціснуты UNIX</comment>
+ <comment xml:lang="ar">ملف يونكس-مضغوط</comment>
+ <comment xml:lang="af">UNIX-saamgepersde lêer</comment>
<generic-icon name="package-x-generic"/>
- <magic priority="50">
+ <magic>
<match type="string" value="\037\235" offset="0"/>
</magic>
<glob pattern="*.Z"/>
</mime-type>
<mime-type type="application/x-compressed-tar">
<comment>Tar archive (gzip-compressed)</comment>
- <comment xml:lang="af">Tar-argief (gzip-saamgepers)</comment>
- <comment xml:lang="ar">أرشيف Tar (مضغوط-gzip)</comment>
- <comment xml:lang="be-Latn">Archiŭ tar (gzip-skampresavany)</comment>
- <comment xml:lang="bg">Архив — tar, компресиран с gzip</comment>
- <comment xml:lang="ca">arxiu tar (amb compressió gzip)</comment>
- <comment xml:lang="cs">archiv tar (komprimovaný pomocí gzip)</comment>
- <comment xml:lang="da">Tar-arkiv (gzip-komprimeret)</comment>
- <comment xml:lang="de">Tar-Archiv (gzip-komprimiert)</comment>
- <comment xml:lang="el">Αρχείο Tar (συμπιεσμένο με gzip)</comment>
- <comment xml:lang="en-GB">Tar archive (gzip-compressed)</comment>
- <comment xml:lang="es">archivador Tar (comprimido con gzip)</comment>
- <comment xml:lang="eu">Tar artxiboa (gzip-ekin konprimitua)</comment>
- <comment xml:lang="fi">Tar-arkisto (gzip-pakattu)</comment>
- <comment xml:lang="fo">Tar skjalasavn (gzip-stappað)</comment>
- <comment xml:lang="fr">archive tar (compressée gzip)</comment>
- <comment xml:lang="fur">archivi Tar (comprimût cun gzip)</comment>
- <comment xml:lang="ga">cartlann Tar (comhbhrúite le gzip)</comment>
- <comment xml:lang="gl">arquivo Tar (comprimido con gzip)</comment>
- <comment xml:lang="he">ארכיון Tar (מכווץ ע״י gzip)</comment>
- <comment xml:lang="hr">Tar arhiva (gzip sažeta)</comment>
- <comment xml:lang="hu">Tar archívum (gzip tömörítésű)</comment>
- <comment xml:lang="ia">Archivo Tar (comprimite con gzip)</comment>
- <comment xml:lang="id">Arsip Tar (terkompresi gzip)</comment>
- <comment xml:lang="it">Archivio tar (compresso con gzip)</comment>
- <comment xml:lang="ja">Tar アーカイブ (gzip 圧縮)</comment>
- <comment xml:lang="kk">Tar архиві (gzip-пен сығылған)</comment>
- <comment xml:lang="ko">TAR 묶음 파일(GZIP 압축)</comment>
- <comment xml:lang="lt">Tar archyvas (suglaudintas su gzip)</comment>
- <comment xml:lang="lv">Tar arhīvs (saspiests ar gzip)</comment>
- <comment xml:lang="nb">Tar-arkiv (gzip-komprimert)</comment>
- <comment xml:lang="nl">Tar-archief (ingepakt met gzip)</comment>
- <comment xml:lang="nn">Tar-arkiv (pakka med gzip)</comment>
- <comment xml:lang="oc">archiu tar (compressat gzip)</comment>
- <comment xml:lang="pl">Archiwum tar (kompresja gzip)</comment>
- <comment xml:lang="pt">arquivo Tar (compressão gzip)</comment>
- <comment xml:lang="pt-BR">Pacote Tar (compactado com gzip)</comment>
- <comment xml:lang="ro">Arhivă Tar (comprimată gzip)</comment>
- <comment xml:lang="ru">Архив TAR (сжатый gzip)</comment>
- <comment xml:lang="sk">Archív Tar (komprimovaný pomocou gzip)</comment>
- <comment xml:lang="sl">Datoteka arhiva Tar (stisnjen z gzip)</comment>
- <comment xml:lang="sq">Arkiv tar (i kompresuar me gzip)</comment>
- <comment xml:lang="sr">Тар архива (запакована гзипом)</comment>
- <comment xml:lang="sv">Tar-arkiv (gzip-komprimerat)</comment>
- <comment xml:lang="tr">Tar arşivi (gzip ile sıkıştırılmış)</comment>
- <comment xml:lang="uk">архів tar (стиснений gzip)</comment>
+ <comment xml:lang="zh_TW">Tar 封存檔 (gzip 壓縮)</comment>
+ <comment xml:lang="zh_CN">Tar 归档文件(gzip 压缩)</comment>
<comment xml:lang="vi">Kho nén tar (đã nén gzip)</comment>
- <comment xml:lang="zh-CN">Tar 归档文件(gzip 压缩)</comment>
- <comment xml:lang="zh-TW">Tar 封存檔 (gzip 壓縮)</comment>
+ <comment xml:lang="uk">архів tar (стиснений gzip)</comment>
+ <comment xml:lang="tr">Tar arşivi (gzip ile sıkıştırılmış)</comment>
+ <comment xml:lang="sv">Tar-arkiv (gzip-komprimerat)</comment>
+ <comment xml:lang="sr">Тар архива (запакована гзипом)</comment>
+ <comment xml:lang="sq">arkiv tar (ngjeshur me gzip)</comment>
+ <comment xml:lang="sl">Datoteka arhiva Tar (stisnjen z gzip)</comment>
+ <comment xml:lang="si">තාර සංරක්ෂිතය (gzip-සම්පීඩිත)</comment>
+ <comment xml:lang="sk">Archív Tar (komprimovaný pomocou gzip)</comment>
+ <comment xml:lang="ru">Архив TAR (сжатый gzip)</comment>
+ <comment xml:lang="ro">Arhivă Tar (comprimată gzip)</comment>
+ <comment xml:lang="pt_BR">Pacote Tar (compactado com gzip)</comment>
+ <comment xml:lang="pt">arquivo Tar (compressão gzip)</comment>
+ <comment xml:lang="pl">Archiwum tar (kompresja gzip)</comment>
+ <comment xml:lang="oc">archiu tar (compressat gzip)</comment>
+ <comment xml:lang="nn">Tar-arkiv (pakka med gzip)</comment>
+ <comment xml:lang="nl">Tar-archief (ingepakt met gzip)</comment>
+ <comment xml:lang="nb">Tar-arkiv (gzip-komprimert)</comment>
+ <comment xml:lang="lv">Tar arhīvs (saspiests ar gzip)</comment>
+ <comment xml:lang="lt">Tar archyvas (suglaudintas su gzip)</comment>
+ <comment xml:lang="ko">TAR 묶음 파일(GZIP 압축)</comment>
+ <comment xml:lang="kk">Tar архиві (gzip-пен сығылған)</comment>
+ <comment xml:lang="ja">Tar アーカイブ (gzip 圧縮)</comment>
+ <comment xml:lang="it">Archivio tar (compresso con gzip)</comment>
+ <comment xml:lang="is">Tar safnskrá (Gzip þjappað)</comment>
+ <comment xml:lang="id">Arsip Tar (terkompresi gzip)</comment>
+ <comment xml:lang="ia">Archivo Tar (comprimite con gzip)</comment>
+ <comment xml:lang="hu">Tar archívum (gzip tömörítésű)</comment>
+ <comment xml:lang="hr">Tar arhiva (gzip sažeta)</comment>
+ <comment xml:lang="he">ארכיון Tar (מכווץ ע״י gzip)</comment>
+ <comment xml:lang="gl">arquivo Tar (comprimido con gzip)</comment>
+ <comment xml:lang="ga">cartlann Tar (comhbhrúite le gzip)</comment>
+ <comment xml:lang="fur">archivi Tar (comprimût cun gzip)</comment>
+ <comment xml:lang="fr">archive tar (compressée gzip)</comment>
+ <comment xml:lang="fo">Tar skjalasavn (gzip-stappað)</comment>
+ <comment xml:lang="fi">Tar-arkisto (gzip-pakattu)</comment>
+ <comment xml:lang="eu">Tar artxiboa (gzip-ekin konprimitua)</comment>
+ <comment xml:lang="es">archivador TAR (comprimido con GZIP)</comment>
+ <comment xml:lang="en_GB">Tar archive (gzip-compressed)</comment>
+ <comment xml:lang="el">Αρχείο Tar (συμπιεσμένο με gzip)</comment>
+ <comment xml:lang="de">Tar-Archiv (gzip-komprimiert)</comment>
+ <comment xml:lang="da">Tar-arkiv (gzip-komprimeret)</comment>
+ <comment xml:lang="cs">archiv tar (komprimovaný pomocí gzip)</comment>
+ <comment xml:lang="ca">arxiu tar (amb compressió gzip)</comment>
+ <comment xml:lang="bg">Архив — tar, компресиран с gzip</comment>
+ <comment xml:lang="be@latin">Archiŭ tar (gzip-skampresavany)</comment>
+ <comment xml:lang="be">архіў tar (сцісканне gzip)</comment>
+ <comment xml:lang="ar">أرشيف Tar (مضغوط-gzip)</comment>
+ <comment xml:lang="af">Tar-argief (gzip-saamgepers)</comment>
<sub-class-of type="application/gzip"/>
<generic-icon name="package-x-generic"/>
<glob pattern="*.tar.gz"/>
<glob pattern="*.tgz"/>
</mime-type>
<mime-type type="application/x-core">
- <comment>program crash data</comment>
- <comment xml:lang="af">programomvaldata</comment>
- <comment xml:lang="ar">معلومات انهيار البرنامج</comment>
- <comment xml:lang="be-Latn">źviestki złamanaj prahramy</comment>
- <comment xml:lang="bg">Данни от забиване на програма</comment>
- <comment xml:lang="ca">dades de fallada de programa</comment>
- <comment xml:lang="cs">data o pádu programu</comment>
- <comment xml:lang="da">programnedbrudsdata</comment>
- <comment xml:lang="de">Daten zu Programmabsturz</comment>
- <comment xml:lang="el">δεδομένα από την κατάρρευση προγράμματος</comment>
- <comment xml:lang="en-GB">program crash data</comment>
- <comment xml:lang="eo">datumo pri kraŝo de programo</comment>
- <comment xml:lang="es">datos de cuelgue de programa</comment>
- <comment xml:lang="eu">programaren kraskaduraren datuak</comment>
- <comment xml:lang="fi">ohjelman kaatumistiedot</comment>
- <comment xml:lang="fo">forrits sordáta</comment>
- <comment xml:lang="fr">données de plantage de programme</comment>
- <comment xml:lang="fur">dâts di colàs di program</comment>
- <comment xml:lang="ga">sonraí tuairte ríomhchláir</comment>
- <comment xml:lang="gl">datos de colgue do programa</comment>
- <comment xml:lang="he">מידע מקריסת תכנית</comment>
- <comment xml:lang="hr">podaci o rušenju programa</comment>
- <comment xml:lang="hu">összeomlott program adatai</comment>
- <comment xml:lang="ia">Datos de fallimento de programma</comment>
- <comment xml:lang="id">data program macet</comment>
- <comment xml:lang="it">Dati crash di applicazione</comment>
- <comment xml:lang="ja">プログラムクラッシュデータ</comment>
- <comment xml:lang="kk">апатты аяқтаудың мәліметтері</comment>
- <comment xml:lang="ko">프로그램 비정상 종료 데이터</comment>
- <comment xml:lang="lt">programos nulūžimo duomenys</comment>
- <comment xml:lang="lv">programmas avārijas dati</comment>
- <comment xml:lang="ms">Data program musnah</comment>
- <comment xml:lang="nb">krasjdata fra program</comment>
- <comment xml:lang="nl">programma-crashgegevens</comment>
- <comment xml:lang="nn">data om programkrasj</comment>
- <comment xml:lang="oc">donadas de plantage de programa</comment>
- <comment xml:lang="pl">Dane awarii programu</comment>
- <comment xml:lang="pt">dados de rebentamento de aplicação</comment>
- <comment xml:lang="pt-BR">Dados de travamento de programa</comment>
- <comment xml:lang="ro">date eroare program</comment>
+ <comment>Program crash data</comment>
+ <comment xml:lang="uk">дані щодо аварії програми</comment>
+ <comment xml:lang="sv">Programkraschdata</comment>
<comment xml:lang="ru">Данные аварийного завершения программы</comment>
- <comment xml:lang="sk">Údaje o páde programu</comment>
- <comment xml:lang="sl">podatki sesutja programa</comment>
- <comment xml:lang="sq">Të dhëna nga programi i bllokuar</comment>
- <comment xml:lang="sr">подаци о падовима програма</comment>
- <comment xml:lang="sv">programkraschdata</comment>
- <comment xml:lang="tr">program çökme verisi</comment>
- <comment xml:lang="uk">аварійні дані про програму</comment>
- <comment xml:lang="vi">dữ liệu sụp đổ chương trình</comment>
- <comment xml:lang="zh-CN">程序崩溃数据</comment>
- <comment xml:lang="zh-TW">程式當掉資料</comment>
- <magic priority="50">
+ <comment xml:lang="pl">Dane awarii programu</comment>
+ <comment xml:lang="it">Dati crash di applicazione</comment>
+ <comment xml:lang="es">datos de cierre inesperado de programa</comment>
+ <comment xml:lang="de">Programmabsturz-Daten</comment>
+ <comment xml:lang="be">даныя пра збой праграмы</comment>
+ <magic>
<match type="string" mask="0xffffffff000000000000000000000000ff" value="\177ELF \004" offset="0"/>
<match type="string" value="\177ELF" offset="0">
<match type="byte" value="1" offset="5">
@@ -9422,60 +9528,63 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-cpio">
<comment>CPIO archive</comment>
- <comment xml:lang="af">CPIO-argief</comment>
- <comment xml:lang="ar">أرشيف CPIO</comment>
- <comment xml:lang="ast">Archivu CPIO</comment>
- <comment xml:lang="az">CPIO arxivi</comment>
- <comment xml:lang="be-Latn">Archiŭ CPIO</comment>
- <comment xml:lang="bg">Архив — CPIO</comment>
- <comment xml:lang="ca">arxiu CPIO</comment>
- <comment xml:lang="cs">archiv CPIO</comment>
- <comment xml:lang="cy">Archif CPIO</comment>
- <comment xml:lang="da">CPIO-arkiv</comment>
- <comment xml:lang="de">CPIO-Archiv</comment>
- <comment xml:lang="el">Συμπιεσμένο αρχείο CPIO</comment>
- <comment xml:lang="en-GB">CPIO archive</comment>
- <comment xml:lang="eo">CPIO-arkivo</comment>
- <comment xml:lang="es">archivador CPIO</comment>
- <comment xml:lang="eu">CPIO artxiboa</comment>
- <comment xml:lang="fi">CPIO-arkisto</comment>
- <comment xml:lang="fo">CPIO skjalasavn</comment>
- <comment xml:lang="fr">archive CPIO</comment>
- <comment xml:lang="fur">archivi CPIO</comment>
- <comment xml:lang="ga">cartlann CPIO</comment>
- <comment xml:lang="gl">arquivo CPIO</comment>
- <comment xml:lang="he">ארכיון CPIO</comment>
- <comment xml:lang="hr">CPIO arhiva</comment>
- <comment xml:lang="hu">CPIO-archívum</comment>
- <comment xml:lang="ia">Archivo CPIO</comment>
- <comment xml:lang="id">Arsip CPIO</comment>
- <comment xml:lang="it">Archivio CPIO</comment>
- <comment xml:lang="ja">CPIO アーカイブ</comment>
- <comment xml:lang="ka">CPIO არქივი</comment>
- <comment xml:lang="kk">CPIO архиві</comment>
- <comment xml:lang="ko">CPIO 묶음 파일</comment>
- <comment xml:lang="lt">CPIO archyvas</comment>
- <comment xml:lang="lv">CPIO arhīvs</comment>
- <comment xml:lang="ms">Arkib CPIO</comment>
- <comment xml:lang="nb">CPIO-arkiv</comment>
- <comment xml:lang="nl">CPIO-archief</comment>
- <comment xml:lang="nn">CPIO-arkiv</comment>
- <comment xml:lang="oc">archiu CPIO</comment>
- <comment xml:lang="pl">Archiwum CPIO</comment>
- <comment xml:lang="pt">arquivo CPIO</comment>
- <comment xml:lang="pt-BR">Pacote CPIO</comment>
- <comment xml:lang="ro">Arhivă CPIO</comment>
- <comment xml:lang="ru">Архив CPIO</comment>
- <comment xml:lang="sk">Archív CPIO</comment>
- <comment xml:lang="sl">Datoteka arhiva CPIO</comment>
- <comment xml:lang="sq">Arkiv CPIO</comment>
- <comment xml:lang="sr">ЦПИО архива</comment>
- <comment xml:lang="sv">CPIO-arkiv</comment>
- <comment xml:lang="tr">CPIO arşivi</comment>
- <comment xml:lang="uk">архів CPIO</comment>
+ <comment xml:lang="zh_TW">CPIO 封存檔</comment>
+ <comment xml:lang="zh_CN">CPIO 归档文件</comment>
<comment xml:lang="vi">Kho nén CPIO</comment>
- <comment xml:lang="zh-CN">CPIO 归档文件</comment>
- <comment xml:lang="zh-TW">CPIO 封存檔</comment>
+ <comment xml:lang="uk">архів CPIO</comment>
+ <comment xml:lang="tr">CPIO arşivi</comment>
+ <comment xml:lang="sv">CPIO-arkiv</comment>
+ <comment xml:lang="sr">ЦПИО архива</comment>
+ <comment xml:lang="sq">arkiv CPIO</comment>
+ <comment xml:lang="sl">Datoteka arhiva CPIO</comment>
+ <comment xml:lang="si">CPIO ලේඛනාගාරය</comment>
+ <comment xml:lang="sk">Archív CPIO</comment>
+ <comment xml:lang="ru">Архив CPIO</comment>
+ <comment xml:lang="ro">Arhivă CPIO</comment>
+ <comment xml:lang="pt_BR">Pacote CPIO</comment>
+ <comment xml:lang="pt">arquivo CPIO</comment>
+ <comment xml:lang="pl">Archiwum CPIO</comment>
+ <comment xml:lang="oc">archiu CPIO</comment>
+ <comment xml:lang="nn">CPIO-arkiv</comment>
+ <comment xml:lang="nl">CPIO-archief</comment>
+ <comment xml:lang="nb">CPIO-arkiv</comment>
+ <comment xml:lang="ms">Arkib CPIO</comment>
+ <comment xml:lang="lv">CPIO arhīvs</comment>
+ <comment xml:lang="lt">CPIO archyvas</comment>
+ <comment xml:lang="ko">CPIO 묶음 파일</comment>
+ <comment xml:lang="kk">CPIO архиві</comment>
+ <comment xml:lang="ka">CPIO არქივი</comment>
+ <comment xml:lang="ja">CPIO アーカイブ</comment>
+ <comment xml:lang="it">Archivio CPIO</comment>
+ <comment xml:lang="is">CPIO safnskrá</comment>
+ <comment xml:lang="id">Arsip CPIO</comment>
+ <comment xml:lang="ia">Archivo CPIO</comment>
+ <comment xml:lang="hu">CPIO-archívum</comment>
+ <comment xml:lang="hr">CPIO arhiva</comment>
+ <comment xml:lang="he">ארכיון CPIO</comment>
+ <comment xml:lang="gl">arquivo CPIO</comment>
+ <comment xml:lang="ga">cartlann CPIO</comment>
+ <comment xml:lang="fur">archivi CPIO</comment>
+ <comment xml:lang="fr">archive CPIO</comment>
+ <comment xml:lang="fo">CPIO skjalasavn</comment>
+ <comment xml:lang="fi">CPIO-arkisto</comment>
+ <comment xml:lang="eu">CPIO artxiboa</comment>
+ <comment xml:lang="es">archivador CPIO</comment>
+ <comment xml:lang="eo">CPIO-arkivo</comment>
+ <comment xml:lang="en_GB">CPIO archive</comment>
+ <comment xml:lang="el">Συμπιεσμένο αρχείο CPIO</comment>
+ <comment xml:lang="de">CPIO-Archiv</comment>
+ <comment xml:lang="da">CPIO-arkiv</comment>
+ <comment xml:lang="cy">Archif CPIO</comment>
+ <comment xml:lang="cs">archiv CPIO</comment>
+ <comment xml:lang="ca">arxiu CPIO</comment>
+ <comment xml:lang="bg">Архив — CPIO</comment>
+ <comment xml:lang="be@latin">Archiŭ CPIO</comment>
+ <comment xml:lang="be">архіў CPIO</comment>
+ <comment xml:lang="az">CPIO arxivi</comment>
+ <comment xml:lang="ast">Archivu CPIO</comment>
+ <comment xml:lang="ar">أرشيف CPIO</comment>
+ <comment xml:lang="af">CPIO-argief</comment>
<generic-icon name="package-x-generic"/>
<magic priority="60">
<match type="host16" value="070707" offset="0"/>
@@ -9487,117 +9596,138 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-cpio-compressed">
<comment>CPIO archive (gzip-compressed)</comment>
- <comment xml:lang="af">CPIO-argief (gzip-saamgepers)</comment>
- <comment xml:lang="ar">أرشيف CPIO (مضغوط-gzip)</comment>
- <comment xml:lang="az">CPIO arxivi (gzip ilə sıxışdırılmış)</comment>
- <comment xml:lang="be-Latn">Archiŭ CPIO (gzip-skampresavany)</comment>
- <comment xml:lang="bg">Архив — CPIO, компресиран с gzip</comment>
- <comment xml:lang="ca">arxiu CPIO (amb compressió gzip)</comment>
- <comment xml:lang="cs">archiv CPIO (komprimovaný pomocí gzip)</comment>
- <comment xml:lang="cy">Archif CPIO (gywasgwyd drwy gzip)</comment>
- <comment xml:lang="da">CPIO-arkiv (gzip-komprimeret)</comment>
- <comment xml:lang="de">CPIO-Archiv (gzip-komprimiert)</comment>
- <comment xml:lang="el">Αρχείο CPIO (συμπιεσμένο με gzip)</comment>
- <comment xml:lang="en-GB">CPIO archive (gzip-compressed)</comment>
- <comment xml:lang="eo">CPIO-arkivo (kunpremita per gzip)</comment>
- <comment xml:lang="es">archivador CPIO (comprimido con gzip)</comment>
- <comment xml:lang="eu">CPIO artxiboa (gzip-ekin konprimitua)</comment>
- <comment xml:lang="fi">CPIO-arkisto (gzip-pakattu)</comment>
- <comment xml:lang="fo">CPIO skjalasavn (gzip-stappað)</comment>
- <comment xml:lang="fr">archive CPIO (compressé gzip)</comment>
- <comment xml:lang="fur">archivi CPIO (comprimût cun gzip)</comment>
- <comment xml:lang="ga">cartlann CPIO (comhbhrúite le gzip)</comment>
- <comment xml:lang="gl">arquivo CPIO (comprimido con gzip)</comment>
- <comment xml:lang="he">ארכיון CPIO (מכווץ ע״י gzip)</comment>
- <comment xml:lang="hr">CPIO arhiva (gzip sažeta)</comment>
- <comment xml:lang="hu">CPIO archívum (gzip tömörítésű)</comment>
- <comment xml:lang="ia">Archivo CPIO (comprimite con gzip)</comment>
- <comment xml:lang="id">Arsip CPIO (terkompresi gzip)</comment>
- <comment xml:lang="it">Archivio CPIO (compresso con gzip)</comment>
- <comment xml:lang="ja">CPIO (gzip 圧縮) アーカイブ</comment>
- <comment xml:lang="ka">CPIO არქივი (gzip-ით შეკუმშული)</comment>
- <comment xml:lang="kk">CPIO архиві (gzip-пен сығылған)</comment>
- <comment xml:lang="ko">CPIO 묶음 파일(GZIP 압축)</comment>
- <comment xml:lang="lt">CPIO archyvas (suglaudintas su gzip)</comment>
- <comment xml:lang="lv">CPIO arhīvs (saspiests ar gzip)</comment>
- <comment xml:lang="ms">Arkib CPIO (dimampatkan-gzip)</comment>
- <comment xml:lang="nb">CPIO-arkiv (gzip-komprimert)</comment>
- <comment xml:lang="nl">CPIO-archief (ingepakt met gzip)</comment>
- <comment xml:lang="nn">CPIO-arkiv (gzip-pakka)</comment>
- <comment xml:lang="oc">archiu CPIO (compressat gzip)</comment>
- <comment xml:lang="pl">Archiwum CPIO (kompresja gzip)</comment>
- <comment xml:lang="pt">arquivo CPIO (compressão gzip)</comment>
- <comment xml:lang="pt-BR">Pacote CPIO (compactado com gzip)</comment>
- <comment xml:lang="ro">Arhivă CPIO (compresie gzip)</comment>
- <comment xml:lang="ru">Архив CPIO (сжатый gzip)</comment>
- <comment xml:lang="sk">Archív CPIO (komprimovaný pomocou gzip)</comment>
- <comment xml:lang="sl">Datoteka arhiva CPIO (skrčena z gzip)</comment>
- <comment xml:lang="sq">Arkiv CPIO (kompresuar me gzip)</comment>
- <comment xml:lang="sr">ЦПИО архива (компресована гзип-ом)</comment>
- <comment xml:lang="sv">CPIO-arkiv (gzip-komprimerat)</comment>
- <comment xml:lang="tr">CPIO arşivi (gzip ile sıkıştırılmış)</comment>
- <comment xml:lang="uk">архів CPIO (стиснений gzip)</comment>
+ <comment xml:lang="zh_TW">CPIO 封存檔 (gzip 壓縮)</comment>
+ <comment xml:lang="zh_CN">CPIO 归档文件(gzip 压缩)</comment>
<comment xml:lang="vi">Kho nén CPIO (đã nén gzip)</comment>
- <comment xml:lang="zh-CN">CPIO 归档文件(gzip 压缩)</comment>
- <comment xml:lang="zh-TW">CPIO 封存檔 (gzip 壓縮)</comment>
+ <comment xml:lang="uk">архів CPIO (стиснений gzip)</comment>
+ <comment xml:lang="tr">CPIO arşivi (gzip ile sıkıştırılmış)</comment>
+ <comment xml:lang="sv">CPIO-arkiv (gzip-komprimerat)</comment>
+ <comment xml:lang="sr">ЦПИО архива (компресована гзип-ом)</comment>
+ <comment xml:lang="sq">arkiv CPIO (ngjeshur me gzip)</comment>
+ <comment xml:lang="sl">Datoteka arhiva CPIO (skrčena z gzip)</comment>
+ <comment xml:lang="si">CPIO සංරක්ෂිතය (gzip-සම්පීඩිත)</comment>
+ <comment xml:lang="sk">Archív CPIO (komprimovaný pomocou gzip)</comment>
+ <comment xml:lang="ru">Архив CPIO (сжатый gzip)</comment>
+ <comment xml:lang="ro">Arhivă CPIO (compresie gzip)</comment>
+ <comment xml:lang="pt_BR">Pacote CPIO (compactado com gzip)</comment>
+ <comment xml:lang="pt">arquivo CPIO (compressão gzip)</comment>
+ <comment xml:lang="pl">Archiwum CPIO (kompresja gzip)</comment>
+ <comment xml:lang="oc">archiu CPIO (compressat gzip)</comment>
+ <comment xml:lang="nn">CPIO-arkiv (gzip-pakka)</comment>
+ <comment xml:lang="nl">CPIO-archief (ingepakt met gzip)</comment>
+ <comment xml:lang="nb">CPIO-arkiv (gzip-komprimert)</comment>
+ <comment xml:lang="ms">Arkib CPIO (dimampatkan-gzip)</comment>
+ <comment xml:lang="lv">CPIO arhīvs (saspiests ar gzip)</comment>
+ <comment xml:lang="lt">CPIO archyvas (suglaudintas su gzip)</comment>
+ <comment xml:lang="ko">CPIO 묶음 파일(GZIP 압축)</comment>
+ <comment xml:lang="kk">CPIO архиві (gzip-пен сығылған)</comment>
+ <comment xml:lang="ka">CPIO არქივი (gzip-ით შეკუმშული)</comment>
+ <comment xml:lang="ja">CPIO (gzip 圧縮) アーカイブ</comment>
+ <comment xml:lang="it">Archivio CPIO (compresso con gzip)</comment>
+ <comment xml:lang="is">CPIO safnskrá (Gzip þjappað)</comment>
+ <comment xml:lang="id">Arsip CPIO (terkompresi gzip)</comment>
+ <comment xml:lang="ia">Archivo CPIO (comprimite con gzip)</comment>
+ <comment xml:lang="hu">CPIO archívum (gzip tömörítésű)</comment>
+ <comment xml:lang="hr">CPIO arhiva (gzip sažeta)</comment>
+ <comment xml:lang="he">ארכיון CPIO (מכווץ ע״י gzip)</comment>
+ <comment xml:lang="gl">arquivo CPIO (comprimido con gzip)</comment>
+ <comment xml:lang="ga">cartlann CPIO (comhbhrúite le gzip)</comment>
+ <comment xml:lang="fur">archivi CPIO (comprimût cun gzip)</comment>
+ <comment xml:lang="fr">archive CPIO (compressé gzip)</comment>
+ <comment xml:lang="fo">CPIO skjalasavn (gzip-stappað)</comment>
+ <comment xml:lang="fi">CPIO-arkisto (gzip-pakattu)</comment>
+ <comment xml:lang="eu">CPIO artxiboa (gzip-ekin konprimitua)</comment>
+ <comment xml:lang="es">archivador CPIO (comprimido con GZIP)</comment>
+ <comment xml:lang="eo">CPIO-arkivo (kunpremita per gzip)</comment>
+ <comment xml:lang="en_GB">CPIO archive (gzip-compressed)</comment>
+ <comment xml:lang="el">Αρχείο CPIO (συμπιεσμένο με gzip)</comment>
+ <comment xml:lang="de">CPIO-Archiv (gzip-komprimiert)</comment>
+ <comment xml:lang="da">CPIO-arkiv (gzip-komprimeret)</comment>
+ <comment xml:lang="cy">Archif CPIO (gywasgwyd drwy gzip)</comment>
+ <comment xml:lang="cs">archiv CPIO (komprimovaný pomocí gzip)</comment>
+ <comment xml:lang="ca">arxiu CPIO (amb compressió gzip)</comment>
+ <comment xml:lang="bg">Архив — CPIO, компресиран с gzip</comment>
+ <comment xml:lang="be@latin">Archiŭ CPIO (gzip-skampresavany)</comment>
+ <comment xml:lang="be">архіў CPIO (сцісканне gzip)</comment>
+ <comment xml:lang="az">CPIO arxivi (gzip ilə sıxışdırılmış)</comment>
+ <comment xml:lang="ar">أرشيف CPIO (مضغوط-gzip)</comment>
+ <comment xml:lang="af">CPIO-argief (gzip-saamgepers)</comment>
<sub-class-of type="application/gzip"/>
<generic-icon name="package-x-generic"/>
<glob pattern="*.cpio.gz"/>
</mime-type>
+ <mime-type type="application/x-perf-data">
+ <comment>Perf data</comment>
+ <comment xml:lang="uk">дані Perf</comment>
+ <comment xml:lang="sv">Perf-data</comment>
+ <comment xml:lang="ru">Данные Perf</comment>
+ <comment xml:lang="pl">Dane wydajności</comment>
+ <comment xml:lang="it">Dati perf</comment>
+ <comment xml:lang="gl">Datos de Perf</comment>
+ <comment xml:lang="es">datos de rendimiento</comment>
+ <comment xml:lang="de">Leistungsdaten</comment>
+ <glob pattern="perf.data" case-sensitive="true"/>
+ <magic priority="50">
+ <match type="string" value="PERFILE2" offset="0"/>
+ </magic>
+ </mime-type>
<mime-type type="application/x-csh">
<comment>C shell script</comment>
- <comment xml:lang="af">C shell-skrip</comment>
- <comment xml:lang="ar">سكربت شِل سي</comment>
- <comment xml:lang="az">C qabıq skripti</comment>
- <comment xml:lang="be-Latn">Skrypt abałonki C</comment>
- <comment xml:lang="bg">Скрипт — обвивка C</comment>
- <comment xml:lang="ca">script C shell</comment>
- <comment xml:lang="cs">skript shellu C</comment>
- <comment xml:lang="cy">Sgript plisgyn C</comment>
- <comment xml:lang="da">C-skalprogram</comment>
- <comment xml:lang="de">C-Shell-Skript</comment>
- <comment xml:lang="el">Δέσμη ενεργειών κελύφους C</comment>
- <comment xml:lang="en-GB">C shell script</comment>
- <comment xml:lang="eo">skripto de C-ŝelo</comment>
- <comment xml:lang="es">secuencia de órdenes de consola en C</comment>
- <comment xml:lang="eu">C shell script-a</comment>
- <comment xml:lang="fi">Csh-komentotiedosto</comment>
- <comment xml:lang="fo">C skel boðrøð</comment>
- <comment xml:lang="fr">script C shell</comment>
- <comment xml:lang="fur">script di shell in C</comment>
- <comment xml:lang="ga">script bhlaoisce C</comment>
- <comment xml:lang="gl">script de C shell</comment>
- <comment xml:lang="he">תסריט מעטפת C</comment>
- <comment xml:lang="hr">C skripta ljuske</comment>
- <comment xml:lang="hu">C héj-parancsfájl</comment>
- <comment xml:lang="ia">Script C-shell</comment>
- <comment xml:lang="id">Skrip shell C</comment>
- <comment xml:lang="it">Script C shell</comment>
- <comment xml:lang="ja">C シェルスクリプト</comment>
- <comment xml:lang="kk">C shell сценарийі</comment>
- <comment xml:lang="ko">C 셸 스크립트</comment>
- <comment xml:lang="lt">C shell scenarijus</comment>
- <comment xml:lang="lv">C čaulas skripts</comment>
- <comment xml:lang="ms">Skrip shell C</comment>
- <comment xml:lang="nb">C-skallskript</comment>
- <comment xml:lang="nl">C-shellscript</comment>
- <comment xml:lang="nn">C-skalskript</comment>
- <comment xml:lang="oc">escript C shell</comment>
- <comment xml:lang="pl">Skrypt powłoki C</comment>
- <comment xml:lang="pt">script de terminal C</comment>
- <comment xml:lang="pt-BR">Script de shell C</comment>
- <comment xml:lang="ro">Script C shell</comment>
- <comment xml:lang="ru">Сценарий C shell</comment>
- <comment xml:lang="sk">Skript shellu C</comment>
- <comment xml:lang="sl">Skriptna datoteka lupine C</comment>
- <comment xml:lang="sq">Script shell C</comment>
- <comment xml:lang="sr">скрипта Ц шкољке</comment>
- <comment xml:lang="sv">Skalskript (csh)</comment>
- <comment xml:lang="tr">C kabuk betiği</comment>
- <comment xml:lang="uk">скрипт оболонки C</comment>
+ <comment xml:lang="zh_TW">C shell 指令稿</comment>
+ <comment xml:lang="zh_CN">C shell 脚本</comment>
<comment xml:lang="vi">Văn lệnh trình bao C</comment>
- <comment xml:lang="zh-CN">C shell 脚本</comment>
- <comment xml:lang="zh-TW">C shell 指令稿</comment>
+ <comment xml:lang="uk">скрипт оболонки C</comment>
+ <comment xml:lang="tr">C kabuk betiği</comment>
+ <comment xml:lang="sv">Skalskript (csh)</comment>
+ <comment xml:lang="sr">скрипта Ц шкољке</comment>
+ <comment xml:lang="sq">programth C shell</comment>
+ <comment xml:lang="sl">Skriptna datoteka lupine C</comment>
+ <comment xml:lang="si">C shell පිටපත</comment>
+ <comment xml:lang="sk">Skript shellu C</comment>
+ <comment xml:lang="ru">Сценарий C shell</comment>
+ <comment xml:lang="ro">Script C shell</comment>
+ <comment xml:lang="pt_BR">Script de shell C</comment>
+ <comment xml:lang="pt">script de terminal C</comment>
+ <comment xml:lang="pl">Skrypt powłoki C</comment>
+ <comment xml:lang="oc">escript C shell</comment>
+ <comment xml:lang="nn">C-skalskript</comment>
+ <comment xml:lang="nl">C-shellscript</comment>
+ <comment xml:lang="nb">C-skallskript</comment>
+ <comment xml:lang="ms">Skrip shell C</comment>
+ <comment xml:lang="lv">C čaulas skripts</comment>
+ <comment xml:lang="lt">C shell scenarijus</comment>
+ <comment xml:lang="ko">C 셸 스크립트</comment>
+ <comment xml:lang="kk">C shell сценарийі</comment>
+ <comment xml:lang="ja">C シェルスクリプト</comment>
+ <comment xml:lang="it">Script C shell</comment>
+ <comment xml:lang="is">C skjeljarskrifta</comment>
+ <comment xml:lang="id">Skrip shell C</comment>
+ <comment xml:lang="ia">Script C-shell</comment>
+ <comment xml:lang="hu">C héj-parancsfájl</comment>
+ <comment xml:lang="hr">C skripta ljuske</comment>
+ <comment xml:lang="he">תסריט מעטפת C</comment>
+ <comment xml:lang="gl">script de C shell</comment>
+ <comment xml:lang="ga">script bhlaoisce C</comment>
+ <comment xml:lang="fur">script di shell in C</comment>
+ <comment xml:lang="fr">script C shell</comment>
+ <comment xml:lang="fo">C skel boðrøð</comment>
+ <comment xml:lang="fi">C shell -komentotiedosto</comment>
+ <comment xml:lang="eu">C shell script-a</comment>
+ <comment xml:lang="es">secuencia de órdenes de consola en C</comment>
+ <comment xml:lang="eo">skripto de C-ŝelo</comment>
+ <comment xml:lang="en_GB">C shell script</comment>
+ <comment xml:lang="el">Δέσμη ενεργειών κελύφους C</comment>
+ <comment xml:lang="de">C-Shell-Skript</comment>
+ <comment xml:lang="da">C-skalprogram</comment>
+ <comment xml:lang="cy">Sgript plisgyn C</comment>
+ <comment xml:lang="cs">skript shellu C</comment>
+ <comment xml:lang="ca">script C shell</comment>
+ <comment xml:lang="bg">Скрипт — обвивка C</comment>
+ <comment xml:lang="be@latin">Skrypt abałonki C</comment>
+ <comment xml:lang="be">скрыпт C shell</comment>
+ <comment xml:lang="az">C qabıq skripti</comment>
+ <comment xml:lang="ar">سكربت شِل سي</comment>
+ <comment xml:lang="af">C shell-skrip</comment>
<sub-class-of type="application/x-shellscript"/>
<sub-class-of type="text/plain"/>
<generic-icon name="text-x-script"/>
@@ -9609,130 +9739,159 @@ command to generate the output files.
</magic>
<glob pattern="*.csh"/>
</mime-type>
- <mime-type type="application/x-dbf">
+ <mime-type type="application/vnd.dbf">
<comment>Xbase document</comment>
- <comment xml:lang="af">Xbase-dokument</comment>
- <comment xml:lang="ar">مستند Xbase</comment>
- <comment xml:lang="ast">Documentu Xbase</comment>
- <comment xml:lang="be-Latn">Dakument Xbase</comment>
- <comment xml:lang="bg">Документ — Xbase</comment>
- <comment xml:lang="ca">document Xbase</comment>
- <comment xml:lang="cs">dokument Xbase</comment>
- <comment xml:lang="da">Xbasedokument</comment>
- <comment xml:lang="de">Xbase-Dokument</comment>
- <comment xml:lang="el">Έγγραφο Xbase</comment>
- <comment xml:lang="en-GB">Xbase document</comment>
- <comment xml:lang="eo">Xbase-dokumento</comment>
- <comment xml:lang="es">documento Xbase</comment>
- <comment xml:lang="eu">Xbase dokumentua</comment>
- <comment xml:lang="fi">Xbase-asiakirja</comment>
- <comment xml:lang="fo">Xbase skjal</comment>
- <comment xml:lang="fr">document Xbase</comment>
- <comment xml:lang="fur">document Xbase</comment>
- <comment xml:lang="ga">cáipéis Xbase</comment>
- <comment xml:lang="gl">documento Xbase</comment>
- <comment xml:lang="he">מסמך Xbase</comment>
- <comment xml:lang="hr">Xbase dokumenet</comment>
- <comment xml:lang="hu">Xbase dokumentum</comment>
- <comment xml:lang="ia">Documento Xbase</comment>
- <comment xml:lang="id">Dokumen Xbase</comment>
- <comment xml:lang="it">Documento Xbase</comment>
- <comment xml:lang="ja">Xbase ドキュメント</comment>
- <comment xml:lang="kk">Xbase құжаты</comment>
- <comment xml:lang="ko">Xbase 문서</comment>
- <comment xml:lang="lt">Xbase dokumentas</comment>
- <comment xml:lang="lv">Xbase dokuments</comment>
- <comment xml:lang="nb">Xbase-dokument</comment>
- <comment xml:lang="nl">Xbase-document</comment>
- <comment xml:lang="nn">Xbase-dokument</comment>
- <comment xml:lang="oc">document Xbase</comment>
- <comment xml:lang="pl">Dokument Xbase</comment>
- <comment xml:lang="pt">documento Xbase</comment>
- <comment xml:lang="pt-BR">Documento do Xbase</comment>
- <comment xml:lang="ro">Document Xbase</comment>
- <comment xml:lang="ru">Документ Xbase</comment>
- <comment xml:lang="sk">Dokument Xbase</comment>
- <comment xml:lang="sl">Dokument Xbase</comment>
- <comment xml:lang="sq">Dokument Xbase</comment>
- <comment xml:lang="sr">документ Иксбазе</comment>
- <comment xml:lang="sv">Xbase-dokument</comment>
- <comment xml:lang="tr">Xbase belgesi</comment>
- <comment xml:lang="uk">документ Xbase</comment>
+ <comment xml:lang="zh_TW">Xbase 文件</comment>
+ <comment xml:lang="zh_CN">Xbase 文档</comment>
<comment xml:lang="vi">Tài liệu Xbase</comment>
- <comment xml:lang="zh-CN">Xbase 文档</comment>
- <comment xml:lang="zh-TW">Xbase 文件</comment>
+ <comment xml:lang="uk">документ Xbase</comment>
+ <comment xml:lang="tr">Xbase belgesi</comment>
+ <comment xml:lang="sv">Xbase-dokument</comment>
+ <comment xml:lang="sr">документ Иксбазе</comment>
+ <comment xml:lang="sq">dokument Xbase</comment>
+ <comment xml:lang="sl">Dokument Xbase</comment>
+ <comment xml:lang="si">Xbase ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument Xbase</comment>
+ <comment xml:lang="ru">Документ Xbase</comment>
+ <comment xml:lang="ro">Document Xbase</comment>
+ <comment xml:lang="pt_BR">Documento do Xbase</comment>
+ <comment xml:lang="pt">documento Xbase</comment>
+ <comment xml:lang="pl">Dokument Xbase</comment>
+ <comment xml:lang="oc">document Xbase</comment>
+ <comment xml:lang="nn">Xbase-dokument</comment>
+ <comment xml:lang="nl">Xbase-document</comment>
+ <comment xml:lang="nb">Xbase-dokument</comment>
+ <comment xml:lang="lv">Xbase dokuments</comment>
+ <comment xml:lang="lt">Xbase dokumentas</comment>
+ <comment xml:lang="ko">Xbase 문서</comment>
+ <comment xml:lang="kk">Xbase құжаты</comment>
+ <comment xml:lang="ja">Xbase ドキュメント</comment>
+ <comment xml:lang="it">Documento Xbase</comment>
+ <comment xml:lang="is">Xbase skjal</comment>
+ <comment xml:lang="id">Dokumen Xbase</comment>
+ <comment xml:lang="ia">Documento Xbase</comment>
+ <comment xml:lang="hu">Xbase dokumentum</comment>
+ <comment xml:lang="hr">Xbase dokumenet</comment>
+ <comment xml:lang="he">מסמך Xbase</comment>
+ <comment xml:lang="gl">documento Xbase</comment>
+ <comment xml:lang="ga">cáipéis Xbase</comment>
+ <comment xml:lang="fur">document Xbase</comment>
+ <comment xml:lang="fr">document Xbase</comment>
+ <comment xml:lang="fo">Xbase skjal</comment>
+ <comment xml:lang="fi">Xbase-asiakirja</comment>
+ <comment xml:lang="eu">Xbase dokumentua</comment>
+ <comment xml:lang="es">documento Xbase</comment>
+ <comment xml:lang="eo">Xbase-dokumento</comment>
+ <comment xml:lang="en_GB">Xbase document</comment>
+ <comment xml:lang="el">Έγγραφο Xbase</comment>
+ <comment xml:lang="de">Xbase-Dokument</comment>
+ <comment xml:lang="da">Xbasedokument</comment>
+ <comment xml:lang="cs">dokument Xbase</comment>
+ <comment xml:lang="ca">document Xbase</comment>
+ <comment xml:lang="bg">Документ — Xbase</comment>
+ <comment xml:lang="be@latin">Dakument Xbase</comment>
+ <comment xml:lang="be">дакумент Xbase</comment>
+ <comment xml:lang="ast">Documentu Xbase</comment>
+ <comment xml:lang="ar">مستند Xbase</comment>
+ <comment xml:lang="af">Xbase-dokument</comment>
<generic-icon name="x-office-document"/>
<glob pattern="*.dbf"/>
- <alias type="application/x-dbase"/>
- <alias type="application/dbf"/>
<alias type="application/dbase"/>
+ <alias type="application/dbf"/>
+ <alias type="application/x-dbase"/>
+ <alias type="application/x-dbf"/>
</mime-type>
<mime-type type="application/ecmascript">
<comment>ECMAScript program</comment>
- <comment xml:lang="af">ECMAScript-program</comment>
- <comment xml:lang="ar">برنامج ECMAScript</comment>
- <comment xml:lang="be-Latn">Prahrama ECMAScript</comment>
- <comment xml:lang="bg">Програма — ECMAScript</comment>
- <comment xml:lang="ca">programa ECMAScript</comment>
- <comment xml:lang="cs">program v jazyce ECMAScript</comment>
- <comment xml:lang="da">ECMAScript-program</comment>
- <comment xml:lang="de">ECMAScript-Programm</comment>
- <comment xml:lang="el">Πρόγραμμα ECMAScript</comment>
- <comment xml:lang="en-GB">ECMAScript program</comment>
- <comment xml:lang="es">programa en ECMAScript</comment>
- <comment xml:lang="eu">ECMAScript programa</comment>
- <comment xml:lang="fi">ECMAScript-ohjelma</comment>
- <comment xml:lang="fo">ECMAScript forrit</comment>
- <comment xml:lang="fr">programme ECMAScript</comment>
- <comment xml:lang="fur">program ECMAScript</comment>
- <comment xml:lang="ga">ríomhchlár ECMAScript</comment>
- <comment xml:lang="gl">programa en ECMAScript</comment>
- <comment xml:lang="he">תכנית EMCAScript</comment>
- <comment xml:lang="hr">ECMAScript program</comment>
- <comment xml:lang="hu">ECMAScript program</comment>
- <comment xml:lang="ia">Programma ECMAScript</comment>
- <comment xml:lang="id">Program ECMAScript</comment>
- <comment xml:lang="it">Programma ECMAScript</comment>
- <comment xml:lang="ja">ECMAScript プログラム</comment>
- <comment xml:lang="ka">ECMAScript პროგრამა</comment>
- <comment xml:lang="kk">ECMAScript программасы</comment>
- <comment xml:lang="ko">ECMAScript 프로그램</comment>
- <comment xml:lang="lt">ECMAScript programa</comment>
- <comment xml:lang="lv">ECMAScript programma</comment>
- <comment xml:lang="nb">ECMAScript-program</comment>
- <comment xml:lang="nl">ECMAScript-programma</comment>
- <comment xml:lang="nn">ECMAScript-program</comment>
- <comment xml:lang="oc">programa ECMAEscript</comment>
- <comment xml:lang="pl">Pogram ECMAScript</comment>
- <comment xml:lang="pt">programa ECMAScript</comment>
- <comment xml:lang="pt-BR">Programa ECMAScript</comment>
- <comment xml:lang="ro">Program ECMAScript</comment>
- <comment xml:lang="ru">Программа ECMAScript</comment>
- <comment xml:lang="sk">Program ECMAScript</comment>
- <comment xml:lang="sl">Programska datoteka ECMAScript</comment>
- <comment xml:lang="sq">Program ECMAScript</comment>
- <comment xml:lang="sr">програм ЕЦМАСкрипте</comment>
- <comment xml:lang="sv">ECMAScript-program</comment>
- <comment xml:lang="tr">ECMAScript programı</comment>
- <comment xml:lang="uk">програма мовою ECMAScript</comment>
+ <comment xml:lang="zh_TW">ECMAScript 程式</comment>
+ <comment xml:lang="zh_CN">ECMAScript 程序</comment>
<comment xml:lang="vi">Chương trình ECMAScript</comment>
- <comment xml:lang="zh-CN">ECMAScript 程序</comment>
- <comment xml:lang="zh-TW">ECMAScript 程式</comment>
+ <comment xml:lang="uk">програма мовою ECMAScript</comment>
+ <comment xml:lang="tr">ECMAScript programı</comment>
+ <comment xml:lang="sv">ECMAScript-program</comment>
+ <comment xml:lang="sr">програм ЕЦМАСкрипте</comment>
+ <comment xml:lang="sq">program ECMAScript</comment>
+ <comment xml:lang="sl">Programska datoteka ECMAScript</comment>
+ <comment xml:lang="si">ECMAScript වැඩසටහන</comment>
+ <comment xml:lang="sk">Program ECMAScript</comment>
+ <comment xml:lang="ru">Программа ECMAScript</comment>
+ <comment xml:lang="ro">Program ECMAScript</comment>
+ <comment xml:lang="pt_BR">Programa ECMAScript</comment>
+ <comment xml:lang="pt">programa ECMAScript</comment>
+ <comment xml:lang="pl">Pogram ECMAScript</comment>
+ <comment xml:lang="oc">programa ECMAEscript</comment>
+ <comment xml:lang="nn">ECMAScript-program</comment>
+ <comment xml:lang="nl">ECMAScript-programma</comment>
+ <comment xml:lang="nb">ECMAScript-program</comment>
+ <comment xml:lang="lv">ECMAScript programma</comment>
+ <comment xml:lang="lt">ECMAScript programa</comment>
+ <comment xml:lang="ko">ECMAScript 프로그램</comment>
+ <comment xml:lang="kk">ECMAScript программасы</comment>
+ <comment xml:lang="ka">ECMAScript პროგრამა</comment>
+ <comment xml:lang="ja">ECMAScript プログラム</comment>
+ <comment xml:lang="it">Programma ECMAScript</comment>
+ <comment xml:lang="is">ECMAScript forrit</comment>
+ <comment xml:lang="id">Program ECMAScript</comment>
+ <comment xml:lang="ia">Programma ECMAScript</comment>
+ <comment xml:lang="hu">ECMAScript program</comment>
+ <comment xml:lang="hr">ECMAScript program</comment>
+ <comment xml:lang="he">תכנית EMCAScript</comment>
+ <comment xml:lang="gl">programa en ECMAScript</comment>
+ <comment xml:lang="ga">ríomhchlár ECMAScript</comment>
+ <comment xml:lang="fur">program ECMAScript</comment>
+ <comment xml:lang="fr">programme ECMAScript</comment>
+ <comment xml:lang="fo">ECMAScript forrit</comment>
+ <comment xml:lang="fi">ECMAScript-ohjelma</comment>
+ <comment xml:lang="eu">ECMAScript programa</comment>
+ <comment xml:lang="es">programa en ECMAScript</comment>
+ <comment xml:lang="en_GB">ECMAScript program</comment>
+ <comment xml:lang="el">Πρόγραμμα ECMAScript</comment>
+ <comment xml:lang="de">ECMAScript-Programm</comment>
+ <comment xml:lang="da">ECMAScript-program</comment>
+ <comment xml:lang="cs">program v jazyce ECMAScript</comment>
+ <comment xml:lang="ca">programa ECMAScript</comment>
+ <comment xml:lang="bg">Програма — ECMAScript</comment>
+ <comment xml:lang="be@latin">Prahrama ECMAScript</comment>
+ <comment xml:lang="be">праграма ECMAScript</comment>
+ <comment xml:lang="ar">برنامج ECMAScript</comment>
+ <comment xml:lang="af">ECMAScript-program</comment>
<alias type="text/ecmascript"/>
- <sub-class-of type="application/x-executable"/>
- <sub-class-of type="text/plain"/>
+ <sub-class-of type="text/javascript"/>
<generic-icon name="text-x-script"/>
<glob pattern="*.es"/>
</mime-type>
<mime-type type="application/x-mame-chd">
<comment>MAME compressed hard disk image</comment>
- <comment xml:lang="ca">imatge de disc dur MAME amb compressió</comment>
- <comment xml:lang="fi">MAME-pakatun kiintolevyn levykuva</comment>
- <comment xml:lang="it">Immagine disco MAME compressa</comment>
- <comment xml:lang="pl">Skompresowany obraz dysku twardego MAME</comment>
<comment xml:lang="uk">стиснений образ жорсткого диска MAME</comment>
+ <comment xml:lang="tr">MAME sıkıştırılmış sabit disk görüntüsü</comment>
+ <comment xml:lang="sv">MAME komprimerad hårddiskavbild</comment>
+ <comment xml:lang="sr">МАМЕ компресовани одраз диска</comment>
+ <comment xml:lang="si">MAME සම්පීඩිත දෘඪ තැටි රූපය</comment>
+ <comment xml:lang="ru">Сжатый образ жесткого диска MAME</comment>
+ <comment xml:lang="pt_BR">Imagem de disco rígido compactado do MAME</comment>
+ <comment xml:lang="pl">Skompresowany obraz dysku twardego MAME</comment>
+ <comment xml:lang="nl">met MAME gecomprimeerd harde-schijfkopiebestand</comment>
+ <comment xml:lang="ko">MAME 압축된 하드 디스크 이미지</comment>
+ <comment xml:lang="kk">MAME сығылған қатты диск бейнесі</comment>
+ <comment xml:lang="ja">MAME 圧縮ハーディディスクイメージ</comment>
+ <comment xml:lang="it">Immagine disco MAME compressa</comment>
+ <comment xml:lang="is">Þjöppuð MAME diskmynd</comment>
+ <comment xml:lang="id">image hard disk MAME terkompresi</comment>
+ <comment xml:lang="hu">MAME tömörített merevlemezkép</comment>
+ <comment xml:lang="hr">MAME komprimirane slike tvrdog diska</comment>
+ <comment xml:lang="he">דמות כונן קשיח בדחיסת MAME</comment>
+ <comment xml:lang="gl">Imaxe de disco duro comprimido MAME</comment>
+ <comment xml:lang="fr">Image de disque dur compressé MAME</comment>
+ <comment xml:lang="fi">MAME pakatun kiintolevyn levykuva</comment>
+ <comment xml:lang="es">imagen comprimida de disco duro de MAME</comment>
+ <comment xml:lang="en_GB">MAME compressed hard disk image</comment>
+ <comment xml:lang="de">MAME-komprimiertes Festplattenabbild</comment>
+ <comment xml:lang="da">MAME-komprimeret harddiskaftryk</comment>
+ <comment xml:lang="ca">imatge de disc dur MAME amb compressió</comment>
+ <comment xml:lang="be">сціснуты вобраз цвёрдага дыска MAME</comment>
+ <comment xml:lang="ar">صورة قرص صلب MAME مضغوطة</comment>
<generic-icon name="application-x-executable"/>
- <magic priority="50">
+ <magic>
<match type="string" value="MComprHD" offset="0"/>
</magic>
<glob pattern="*.chd"/>
@@ -9741,38 +9900,48 @@ command to generate the output files.
<!-- Translate this to Mega-CD if the console was known as such in your locale
Should be Mega-CD in all but en_US, Mexico, Canada and Brazil: https://en.wikipedia.org/wiki/Sega_CD -->
<comment>Sega CD disc image</comment>
- <comment xml:lang="af">Mega CD-skyfbeeldlêer</comment>
- <comment xml:lang="ast">Imaxe de discu de Sega CD</comment>
- <comment xml:lang="bg">Диск — Mega-CD (Sega)</comment>
- <comment xml:lang="ca">imatge de disc de Sega CD</comment>
- <comment xml:lang="cs">obraz disku CD pro Sega</comment>
- <comment xml:lang="da">Sega CD-diskaftryk</comment>
- <comment xml:lang="de">Sega-CD-Datenträgerabbild</comment>
- <comment xml:lang="en-GB">Sega CD disc image</comment>
- <comment xml:lang="es">imagen de disco CD de Sega</comment>
- <comment xml:lang="eu">Sega CD disko irudia</comment>
- <comment xml:lang="fi">Sega CD -levykuva</comment>
- <comment xml:lang="fr">image disque Sega CD</comment>
- <comment xml:lang="fur">imagjin disc CD Sega</comment>
- <comment xml:lang="ga">íomhá dlúthdhiosca Sega</comment>
- <comment xml:lang="he">דמות כונן Sega CD</comment>
- <comment xml:lang="hr">Sega CD slika diska</comment>
- <comment xml:lang="hu">Sega CD-lemezkép</comment>
- <comment xml:lang="id">Image cakram CD Sega</comment>
- <comment xml:lang="it">Immagine disco Sega Mega CD</comment>
- <comment xml:lang="kk">Sega CD диск бейнесі</comment>
- <comment xml:lang="ko">세가 CD 디스크 이미지</comment>
- <comment xml:lang="pl">Obraz płyty konsoli Mega-CD</comment>
- <comment xml:lang="pt">imagem de disco Mega-CD</comment>
- <comment xml:lang="pt-BR">Imagem de disco Sega CD</comment>
- <comment xml:lang="ru">Образ диска CD Sega</comment>
- <comment xml:lang="sk">Obraz disku CD Sega</comment>
- <comment xml:lang="sr">одраз диска Сега ЦД-а</comment>
- <comment xml:lang="sv">Mega-CD-skivavbild</comment>
- <comment xml:lang="tr">Sega CD disk görüntüsü</comment>
+ <comment xml:lang="zh_TW">Sega CD 光碟映像檔</comment>
+ <comment xml:lang="zh_CN">Sega CD 光盘映像</comment>
<comment xml:lang="uk">образ диска Sega CD</comment>
- <comment xml:lang="zh-CN">Sega CD 光盘映像</comment>
- <comment xml:lang="zh-TW">Sega CD 光碟映像檔</comment>
+ <comment xml:lang="tr">Sega CD disk görüntüsü</comment>
+ <comment xml:lang="sv">Mega-CD-skivavbild</comment>
+ <comment xml:lang="sr">одраз диска Сега ЦД-а</comment>
+ <comment xml:lang="sq">pamje disku CD Sega</comment>
+ <comment xml:lang="sl">Slika diska CD Sega</comment>
+ <comment xml:lang="si">Sega CD තැටි රූපය</comment>
+ <comment xml:lang="sk">Obraz disku CD Sega</comment>
+ <comment xml:lang="ru">Образ диска CD Sega</comment>
+ <comment xml:lang="pt_BR">Imagem de disco Sega CD</comment>
+ <comment xml:lang="pt">imagem de disco Mega-CD</comment>
+ <comment xml:lang="pl">Obraz płyty konsoli Mega-CD</comment>
+ <comment xml:lang="oc">imatge disc Sega CD</comment>
+ <comment xml:lang="nl">Sega CD-schijfkopiebestand</comment>
+ <comment xml:lang="ko">세가 CD 디스크 이미지</comment>
+ <comment xml:lang="kk">Sega CD диск бейнесі</comment>
+ <comment xml:lang="ja">Sega CD ディスクイメージ</comment>
+ <comment xml:lang="it">Immagine disco Sega Mega CD</comment>
+ <comment xml:lang="is">Sega CD diskmynd</comment>
+ <comment xml:lang="id">Image cakram CD Sega</comment>
+ <comment xml:lang="hu">Sega CD-lemezkép</comment>
+ <comment xml:lang="hr">Sega CD slika diska</comment>
+ <comment xml:lang="he">דמות כונן Sega CD</comment>
+ <comment xml:lang="gl">Imaxe de disco de Sega CD</comment>
+ <comment xml:lang="ga">íomhá dlúthdhiosca Sega</comment>
+ <comment xml:lang="fur">imagjin disc CD Sega</comment>
+ <comment xml:lang="fr">image disque Sega CD</comment>
+ <comment xml:lang="fi">Sega CD -levykuva</comment>
+ <comment xml:lang="eu">Sega CD disko irudia</comment>
+ <comment xml:lang="es">imagen de disco CD de Sega</comment>
+ <comment xml:lang="en_GB">Sega CD disc image</comment>
+ <comment xml:lang="de">Sega-CD-Datenträgerabbild</comment>
+ <comment xml:lang="da">Sega CD-diskaftryk</comment>
+ <comment xml:lang="cs">obraz disku CD pro Sega</comment>
+ <comment xml:lang="ca">imatge de disc de Sega CD</comment>
+ <comment xml:lang="bg">Диск — Mega-CD (Sega)</comment>
+ <comment xml:lang="be">вобраз CD-дыска Sega</comment>
+ <comment xml:lang="ast">Imaxe de discu de Sega CD</comment>
+ <comment xml:lang="ar">صورة قرص ميجا سي دي</comment>
+ <comment xml:lang="af">Mega CD-skyfbeeldlêer</comment>
<generic-icon name="application-x-executable"/>
<!-- Also matches the application/x-genesis-rom magic values, hence the higher priority -->
<magic priority="60">
@@ -9789,81 +9958,101 @@ command to generate the output files.
<!-- Translate this to Kids Computer Pico if the console was known as such in your locale
Should be Sega Pico in all but Japan: https://en.wikipedia.org/wiki/Sega_Pico -->
<comment>Sega Pico ROM</comment>
- <comment xml:lang="ast">ROM de Sega Pico</comment>
- <comment xml:lang="bg">ROM — Sega Pico</comment>
- <comment xml:lang="ca">ROM de Sega Pico</comment>
- <comment xml:lang="cs">ROM pro Sega Pico</comment>
- <comment xml:lang="da">Sega Pico-ROM</comment>
- <comment xml:lang="de">Sega Pico ROM</comment>
- <comment xml:lang="en-GB">Sega Pico ROM</comment>
- <comment xml:lang="es">ROM de Sega Pico</comment>
- <comment xml:lang="eu">Sega Pico ROM</comment>
- <comment xml:lang="fi">Sega Pico ROM</comment>
- <comment xml:lang="fr">ROM Sega Pico</comment>
- <comment xml:lang="fur">ROM Sega Pico</comment>
- <comment xml:lang="ga">ROM Sega Pico</comment>
- <comment xml:lang="hr">Sega Pico ROM</comment>
- <comment xml:lang="hu">Sega Pico ROM</comment>
- <comment xml:lang="id">ROM Sega Pico</comment>
- <comment xml:lang="it">ROM Sega Pico</comment>
- <comment xml:lang="kk">Sega Pico ROM</comment>
- <comment xml:lang="ko">세가 피코 롬</comment>
- <comment xml:lang="pl">Plik ROM konsoli Sega Pico</comment>
- <comment xml:lang="pt">ROM Sega Pico</comment>
- <comment xml:lang="pt-BR">ROM de Sega Pico</comment>
- <comment xml:lang="ru">Sega Pico ROM</comment>
- <comment xml:lang="sk">ROM pre Sega Pico</comment>
- <comment xml:lang="sr">Сега Пико РОМ</comment>
- <comment xml:lang="sv">Sega Pico-rom</comment>
- <comment xml:lang="tr">Sega Pico ROM</comment>
+ <comment xml:lang="zh_TW">Sega Pico ROM</comment>
+ <comment xml:lang="zh_CN">Sega Pico ROM</comment>
<comment xml:lang="uk">ППП Sega Pico</comment>
- <comment xml:lang="zh-CN">Sega Pico ROM</comment>
- <comment xml:lang="zh-TW">Sega Pico ROM</comment>
+ <comment xml:lang="tr">Sega Pico ROM</comment>
+ <comment xml:lang="sv">Sega Pico-rom</comment>
+ <comment xml:lang="sr">Сега Пико РОМ</comment>
+ <comment xml:lang="sq">ROM Sega Pico</comment>
+ <comment xml:lang="sl">Sega Pico ROM</comment>
+ <comment xml:lang="si">Sega Pico ROM</comment>
+ <comment xml:lang="sk">ROM pre Sega Pico</comment>
+ <comment xml:lang="ru">Sega Pico ROM</comment>
+ <comment xml:lang="pt_BR">ROM de Sega Pico</comment>
+ <comment xml:lang="pt">ROM Sega Pico</comment>
+ <comment xml:lang="pl">Plik ROM konsoli Sega Pico</comment>
+ <comment xml:lang="oc">ROM Sega Pico</comment>
+ <comment xml:lang="nl">Sega Pico-ROM</comment>
+ <comment xml:lang="ko">세가 피코 롬</comment>
+ <comment xml:lang="kk">Sega Pico ROM</comment>
+ <comment xml:lang="ja">キッズコンピュータ・ピコ ROM</comment>
+ <comment xml:lang="it">ROM Sega Pico</comment>
+ <comment xml:lang="is">Sega Pico ROM</comment>
+ <comment xml:lang="id">ROM Sega Pico</comment>
+ <comment xml:lang="hu">Sega Pico ROM</comment>
+ <comment xml:lang="hr">Sega Pico ROM</comment>
+ <comment xml:lang="he">ROM של Sega Pico</comment>
+ <comment xml:lang="gl">ROM de Sega Pico</comment>
+ <comment xml:lang="ga">ROM Sega Pico</comment>
+ <comment xml:lang="fur">ROM Sega Pico</comment>
+ <comment xml:lang="fr">ROM Sega Pico</comment>
+ <comment xml:lang="fi">Sega Pico ROM</comment>
+ <comment xml:lang="eu">Sega Pico ROM</comment>
+ <comment xml:lang="es">ROM de Sega Pico</comment>
+ <comment xml:lang="en_GB">Sega Pico ROM</comment>
+ <comment xml:lang="de">Sega-Pico-ROM</comment>
+ <comment xml:lang="da">Sega Pico-ROM</comment>
+ <comment xml:lang="cs">ROM pro Sega Pico</comment>
+ <comment xml:lang="ca">ROM de Sega Pico</comment>
+ <comment xml:lang="bg">ROM — Sega Pico</comment>
+ <comment xml:lang="be">Sega Pico ROM</comment>
+ <comment xml:lang="ast">ROM de Sega Pico</comment>
+ <comment xml:lang="ar">روم سيجا بيك</comment>
<generic-icon name="application-x-executable"/>
- <magic priority="50">
+ <magic>
<match type="string" value="SEGA PICO" offset="256"/>
</magic>
<glob pattern="*.iso"/>
</mime-type>
<mime-type type="application/x-saturn-rom">
<comment>Sega Saturn disc image</comment>
- <comment xml:lang="af">Sega Saturn-skyfbeeldlêer</comment>
- <comment xml:lang="ast">Imaxe de discu de Sega Saturn</comment>
- <comment xml:lang="bg">Диск — Sega Saturn</comment>
- <comment xml:lang="ca">imatge de disc de Sega Saturn</comment>
- <comment xml:lang="cs">obraz disku pro Sega Saturn</comment>
- <comment xml:lang="da">Sega Saturn-diskaftryk</comment>
- <comment xml:lang="de">Sega-Saturn-Datenträgerabbild</comment>
- <comment xml:lang="el">Εικόνα δίσκου Sega Saturn</comment>
- <comment xml:lang="en-GB">Sega Saturn disc image</comment>
- <comment xml:lang="es">imagen de disco de Sega Saturn</comment>
- <comment xml:lang="eu">Sega Saturn disko irudia</comment>
- <comment xml:lang="fi">Sega Saturn -levykuva</comment>
- <comment xml:lang="fr">image disque Sega Saturn</comment>
- <comment xml:lang="fur">imagjin disc Sega Saturn</comment>
- <comment xml:lang="ga">íomhá diosca Sega Saturn</comment>
- <comment xml:lang="he">דמות כונן Sega Saturn</comment>
- <comment xml:lang="hr">Sega Saturn slika diska</comment>
- <comment xml:lang="hu">Sega Saturn lemezkép</comment>
- <comment xml:lang="ia">Imagine de disco Sega Saturn</comment>
- <comment xml:lang="id">Image cakram Sega Saturn</comment>
- <comment xml:lang="it">Immagine disco Sega Saturn</comment>
- <comment xml:lang="kk">Sega Saturn диск бейнесі</comment>
- <comment xml:lang="ko">세가 새턴 디스크 이미지</comment>
- <comment xml:lang="oc">imatge disc Sega Saturn</comment>
- <comment xml:lang="pl">Obraz płyty konsoli Sega Saturn</comment>
- <comment xml:lang="pt">imagem de disco Sega Saturn</comment>
- <comment xml:lang="pt-BR">Imagem de disco do Sega Saturn</comment>
- <comment xml:lang="ru">Образ диска Sega Saturn</comment>
- <comment xml:lang="sk">Obraz disku Sega Saturn</comment>
- <comment xml:lang="sr">одраз диска Сега Сатурна</comment>
- <comment xml:lang="sv">Sega Saturn-skivavbild</comment>
- <comment xml:lang="tr">Sega Saturn disk görüntüsü</comment>
+ <comment xml:lang="zh_TW">Sega Saturn 光碟映像檔</comment>
+ <comment xml:lang="zh_CN">Sega Saturn 光盘映像</comment>
<comment xml:lang="uk">образ диска Sega Saturn</comment>
- <comment xml:lang="zh-CN">Sega Saturn 光盘映像</comment>
- <comment xml:lang="zh-TW">Sega Saturn 光碟映像檔</comment>
+ <comment xml:lang="tr">Sega Saturn disk görüntüsü</comment>
+ <comment xml:lang="sv">Sega Saturn-skivavbild</comment>
+ <comment xml:lang="sr">одраз диска Сега Сатурна</comment>
+ <comment xml:lang="sq">pamje disku Sega Saturn</comment>
+ <comment xml:lang="sl">Slika diska Sega Saturn</comment>
+ <comment xml:lang="si">සේගා සෙනසුරු තැටි රූපය</comment>
+ <comment xml:lang="sk">Obraz disku Sega Saturn</comment>
+ <comment xml:lang="ru">Образ диска Sega Saturn</comment>
+ <comment xml:lang="pt_BR">Imagem de disco do Sega Saturn</comment>
+ <comment xml:lang="pt">imagem de disco Sega Saturn</comment>
+ <comment xml:lang="pl">Obraz płyty konsoli Sega Saturn</comment>
+ <comment xml:lang="oc">imatge disc Sega Saturn</comment>
+ <comment xml:lang="nl">Sega Saturn-schijfkopiebestand</comment>
+ <comment xml:lang="ko">세가 새턴 디스크 이미지</comment>
+ <comment xml:lang="kk">Sega Saturn диск бейнесі</comment>
+ <comment xml:lang="ja">Sega Saturn ディスクイメージ</comment>
+ <comment xml:lang="it">Immagine disco Sega Saturn</comment>
+ <comment xml:lang="is">Sega Saturn diskmynd</comment>
+ <comment xml:lang="id">Image cakram Sega Saturn</comment>
+ <comment xml:lang="ia">Imagine de disco Sega Saturn</comment>
+ <comment xml:lang="hu">Sega Saturn lemezkép</comment>
+ <comment xml:lang="hr">Sega Saturn slika diska</comment>
+ <comment xml:lang="he">דמות כונן Sega Saturn</comment>
+ <comment xml:lang="gl">Imaxe de disco de Sega Saturn</comment>
+ <comment xml:lang="ga">íomhá diosca Sega Saturn</comment>
+ <comment xml:lang="fur">imagjin disc Sega Saturn</comment>
+ <comment xml:lang="fr">image disque Sega Saturn</comment>
+ <comment xml:lang="fi">Sega Saturn -levykuva</comment>
+ <comment xml:lang="eu">Sega Saturn disko irudia</comment>
+ <comment xml:lang="es">imagen de disco de Sega Saturn</comment>
+ <comment xml:lang="en_GB">Sega Saturn disc image</comment>
+ <comment xml:lang="el">Εικόνα δίσκου Sega Saturn</comment>
+ <comment xml:lang="de">Sega-Saturn-Datenträgerabbild</comment>
+ <comment xml:lang="da">Sega Saturn-diskaftryk</comment>
+ <comment xml:lang="cs">obraz disku pro Sega Saturn</comment>
+ <comment xml:lang="ca">imatge de disc de Sega Saturn</comment>
+ <comment xml:lang="bg">Диск — Sega Saturn</comment>
+ <comment xml:lang="be">вобраз дыска Sega Saturn</comment>
+ <comment xml:lang="ast">Imaxe de discu de Sega Saturn</comment>
+ <comment xml:lang="ar">صورة قرص ميجا ساتورن</comment>
+ <comment xml:lang="af">Sega Saturn-skyfbeeldlêer</comment>
<generic-icon name="application-x-executable"/>
- <magic priority="50">
+ <magic>
<match type="string" value="SEGA SEGASATURN" offset="0"/>
<match type="string" value="SEGA SEGASATURN" offset="16"/>
</magic>
@@ -9871,98 +10060,137 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-dreamcast-rom">
<comment>Dreamcast disc image</comment>
- <comment xml:lang="bg">Диск — Dreamcast</comment>
- <comment xml:lang="ca">imatge de disc de Dreamcast</comment>
- <comment xml:lang="da">Dreamcast-diskaftryk</comment>
- <comment xml:lang="de">Dreamcast-Datenträgerabbild</comment>
- <comment xml:lang="en-GB">Dreamcast disc image</comment>
- <comment xml:lang="es">imagen de disco de Dreamcast</comment>
- <comment xml:lang="eu">Dreamcast disko irudia</comment>
- <comment xml:lang="fi">Dreamcast-levykuva</comment>
- <comment xml:lang="fr">image disque Dreamcast</comment>
- <comment xml:lang="hr">Dreamcast slika disa</comment>
- <comment xml:lang="hu">Dreamcast lemezkép</comment>
- <comment xml:lang="id">Image cakram Dreamcast</comment>
- <comment xml:lang="it">Immagine disco Dreamcast</comment>
- <comment xml:lang="kk">Dreamcast диск бейнесі</comment>
- <comment xml:lang="ko">드림캐스트 디스크 이미지</comment>
- <comment xml:lang="pl">Obraz płyty konsoli Dreamcast</comment>
- <comment xml:lang="pt">imagem de disco Dreamcast</comment>
- <comment xml:lang="pt-BR">Imagem de disco do Dreamcast</comment>
- <comment xml:lang="ru">Образ диска Dreamcast</comment>
- <comment xml:lang="sk">Obraz disku Dreamcast</comment>
- <comment xml:lang="sv">Dreamcast-skivavbild</comment>
- <comment xml:lang="tr">Dreamcast disk görüntüsü</comment>
+ <comment xml:lang="zh_TW">Dreamcast 光碟映像檔</comment>
+ <comment xml:lang="zh_CN">Dreamcast 光盘映像</comment>
<comment xml:lang="uk">образ диска Dreamcast</comment>
- <comment xml:lang="zh-CN">Dreamcast 光盘映像</comment>
- <comment xml:lang="zh-TW">Dreamcast 光碟映像檔</comment>
+ <comment xml:lang="tr">Dreamcast disk görüntüsü</comment>
+ <comment xml:lang="sv">Dreamcast-skivavbild</comment>
+ <comment xml:lang="sq">pamje disku Dreamcast</comment>
+ <comment xml:lang="sl">Slika diska Dreamcast</comment>
+ <comment xml:lang="si">Dreamcast තැටි රූපය</comment>
+ <comment xml:lang="sk">Obraz disku Dreamcast</comment>
+ <comment xml:lang="ru">Образ диска Dreamcast</comment>
+ <comment xml:lang="pt_BR">Imagem de disco do Dreamcast</comment>
+ <comment xml:lang="pt">imagem de disco Dreamcast</comment>
+ <comment xml:lang="pl">Obraz płyty konsoli Dreamcast</comment>
+ <comment xml:lang="oc">imatge disc Dreamcast</comment>
+ <comment xml:lang="nl">Dreamcast-schijfkopiebestand</comment>
+ <comment xml:lang="ko">드림캐스트 디스크 이미지</comment>
+ <comment xml:lang="kk">Dreamcast диск бейнесі</comment>
+ <comment xml:lang="ja">Dreamcast ディスクイメージ</comment>
+ <comment xml:lang="it">Immagine disco Dreamcast</comment>
+ <comment xml:lang="is">Dreamcast diskmynd</comment>
+ <comment xml:lang="id">Image cakram Dreamcast</comment>
+ <comment xml:lang="hu">Dreamcast lemezkép</comment>
+ <comment xml:lang="hr">Dreamcast slika disa</comment>
+ <comment xml:lang="he">דמות כונן Dreamcast</comment>
+ <comment xml:lang="gl">Imaxe de disco de Dreamcast</comment>
+ <comment xml:lang="fr">image disque Dreamcast</comment>
+ <comment xml:lang="fi">Dreamcast-levykuva</comment>
+ <comment xml:lang="eu">Dreamcast disko irudia</comment>
+ <comment xml:lang="es">imagen de disco de Dreamcast</comment>
+ <comment xml:lang="en_GB">Dreamcast disc image</comment>
+ <comment xml:lang="de">Dreamcast-Datenträgerabbild</comment>
+ <comment xml:lang="da">Dreamcast-diskaftryk</comment>
+ <comment xml:lang="ca">imatge de disc de Dreamcast</comment>
+ <comment xml:lang="bg">Диск — Dreamcast</comment>
+ <comment xml:lang="be">вобраз дыска Dreamcast</comment>
+ <comment xml:lang="ar">صورة قرص Dreamcast</comment>
<generic-icon name="application-x-executable"/>
- <magic priority="50">
+ <magic>
<match type="string" value="SEGA SEGAKATANA" offset="16"/>
</magic>
<glob pattern="*.iso"/>
</mime-type>
<mime-type type="application/x-nintendo-ds-rom">
<comment>Nintendo DS ROM</comment>
- <comment xml:lang="ar">Nintendo DS ROM</comment>
- <comment xml:lang="ast">ROM de Nintendo DS</comment>
- <comment xml:lang="be-Latn">Nintendo DS ROM</comment>
- <comment xml:lang="bg">ROM — Nintendo DS</comment>
- <comment xml:lang="ca">ROM de Nintendo DS</comment>
- <comment xml:lang="cs">ROM pro Nintendo DS</comment>
- <comment xml:lang="da">Nintendo DS-ROM</comment>
- <comment xml:lang="de">Nintendo DS ROM</comment>
- <comment xml:lang="el">Nintendo DS ROM</comment>
- <comment xml:lang="en-GB">Nintendo DS ROM</comment>
- <comment xml:lang="es">ROM de Nintendo DS</comment>
- <comment xml:lang="eu">Nintendo DS-ko ROMa</comment>
- <comment xml:lang="fi">Nintendo DS-ROM</comment>
- <comment xml:lang="fo">Nintendo DS ROM</comment>
- <comment xml:lang="fr">ROM Nintendo DS</comment>
- <comment xml:lang="fur">ROM Nintendo DS</comment>
- <comment xml:lang="ga">ROM Nintendo DS</comment>
- <comment xml:lang="gl">ROM de Nintendo DS</comment>
- <comment xml:lang="he">ROM של Nintendo</comment>
- <comment xml:lang="hr">Nintendo DS ROM</comment>
- <comment xml:lang="hu">Nintendo DS ROM</comment>
- <comment xml:lang="ia">ROM pro Nintendo DS</comment>
- <comment xml:lang="id">Memori baca-saja Nintendo DS</comment>
- <comment xml:lang="it">ROM Nintendo DS</comment>
- <comment xml:lang="ja">Nintendo DS ROM</comment>
- <comment xml:lang="kk">Nintendo DS ROM</comment>
- <comment xml:lang="ko">닌텐도 DS 롬</comment>
- <comment xml:lang="lt">Nintendo DS ROM</comment>
- <comment xml:lang="lv">Nintendo DS ROM</comment>
- <comment xml:lang="nb">Nintendo DS-ROM</comment>
- <comment xml:lang="nl">Nintendo-DS-ROM</comment>
- <comment xml:lang="nn">Nintendo DS-ROM</comment>
- <comment xml:lang="oc">ROM Nintendo DS</comment>
- <comment xml:lang="pl">Plik ROM konsoli Nintendo DS</comment>
- <comment xml:lang="pt">ROM Nintendo DS</comment>
- <comment xml:lang="pt-BR">ROM de Nintendo DS</comment>
- <comment xml:lang="ro">ROM Nintendo DS</comment>
- <comment xml:lang="ru">Nintendo DS ROM</comment>
- <comment xml:lang="sk">ROM pre Nintendo DS</comment>
- <comment xml:lang="sl">Bralni pomnilnik Nintendo DS</comment>
- <comment xml:lang="sq">ROM Nintendo DS</comment>
- <comment xml:lang="sr">Нинтендо ДС РОМ</comment>
- <comment xml:lang="sv">Nintendo DS-rom</comment>
- <comment xml:lang="tr">Nintendo DS ROM</comment>
- <comment xml:lang="uk">ППП Nintendo</comment>
+ <comment xml:lang="zh_TW">任天堂 DS ROM</comment>
+ <comment xml:lang="zh_CN">任天堂 DS ROM</comment>
<comment xml:lang="vi">ROM DS Nintendo</comment>
- <comment xml:lang="zh-CN">任天堂 DS ROM</comment>
- <comment xml:lang="zh-TW">任天堂 DS ROM</comment>
+ <comment xml:lang="uk">ППП Nintendo</comment>
+ <comment xml:lang="tr">Nintendo DS ROM</comment>
+ <comment xml:lang="sv">Nintendo DS-rom</comment>
+ <comment xml:lang="sr">Нинтендо ДС РОМ</comment>
+ <comment xml:lang="sq">ROM Nintendo DS</comment>
+ <comment xml:lang="sl">Bralni pomnilnik Nintendo DS</comment>
+ <comment xml:lang="si">Nintendo DS ROM</comment>
+ <comment xml:lang="sk">ROM pre Nintendo DS</comment>
+ <comment xml:lang="ru">Nintendo DS ROM</comment>
+ <comment xml:lang="ro">ROM Nintendo DS</comment>
+ <comment xml:lang="pt_BR">ROM de Nintendo DS</comment>
+ <comment xml:lang="pt">ROM Nintendo DS</comment>
+ <comment xml:lang="pl">Plik ROM konsoli Nintendo DS</comment>
+ <comment xml:lang="oc">ROM Nintendo DS</comment>
+ <comment xml:lang="nn">Nintendo DS-ROM</comment>
+ <comment xml:lang="nl">Nintendo DS-ROM</comment>
+ <comment xml:lang="nb">Nintendo DS-ROM</comment>
+ <comment xml:lang="lv">Nintendo DS ROM</comment>
+ <comment xml:lang="lt">Nintendo DS ROM</comment>
+ <comment xml:lang="ko">닌텐도 DS 롬</comment>
+ <comment xml:lang="kk">Nintendo DS ROM</comment>
+ <comment xml:lang="ja">ニンテンドーDS ROM</comment>
+ <comment xml:lang="it">ROM Nintendo DS</comment>
+ <comment xml:lang="is">Nintendo DS ROM</comment>
+ <comment xml:lang="id">Memori baca-saja Nintendo DS</comment>
+ <comment xml:lang="ia">ROM pro Nintendo DS</comment>
+ <comment xml:lang="hu">Nintendo DS ROM</comment>
+ <comment xml:lang="hr">Nintendo DS ROM</comment>
+ <comment xml:lang="he">ROM של Nintendo</comment>
+ <comment xml:lang="gl">ROM de Nintendo DS</comment>
+ <comment xml:lang="ga">ROM Nintendo DS</comment>
+ <comment xml:lang="fur">ROM Nintendo DS</comment>
+ <comment xml:lang="fr">ROM Nintendo DS</comment>
+ <comment xml:lang="fo">Nintendo DS ROM</comment>
+ <comment xml:lang="fi">Nintendo DS-ROM</comment>
+ <comment xml:lang="eu">Nintendo DS-ko ROMa</comment>
+ <comment xml:lang="es">ROM de Nintendo DS</comment>
+ <comment xml:lang="en_GB">Nintendo DS ROM</comment>
+ <comment xml:lang="el">Nintendo DS ROM</comment>
+ <comment xml:lang="de">Nintendo-DS-ROM</comment>
+ <comment xml:lang="da">Nintendo DS-ROM</comment>
+ <comment xml:lang="cs">ROM pro Nintendo DS</comment>
+ <comment xml:lang="ca">ROM de Nintendo DS</comment>
+ <comment xml:lang="bg">ROM — Nintendo DS</comment>
+ <comment xml:lang="be@latin">Nintendo DS ROM</comment>
+ <comment xml:lang="be">Nintendo DS ROM</comment>
+ <comment xml:lang="ast">ROM de Nintendo DS</comment>
+ <comment xml:lang="ar">روم نينتندو دي</comment>
<generic-icon name="application-x-executable"/>
<glob pattern="*.nds"/>
</mime-type>
<mime-type type="application/x-nintendo-3ds-rom">
<comment>Nintendo 3DS ROM</comment>
- <comment xml:lang="ca">ROM de Nintendo 3DS</comment>
- <comment xml:lang="fi">Nintendo 3DS ROM</comment>
- <comment xml:lang="it">ROM Nintendo 3DS</comment>
- <comment xml:lang="pl">Plik ROM konsoli Nintendo 3DS</comment>
- <comment xml:lang="pt-BR">ROM do Nintendo 3DS</comment>
<comment xml:lang="uk">ППП Nintendo 3DS</comment>
+ <comment xml:lang="tr">Nintendo 3DS ROM</comment>
+ <comment xml:lang="sv">Nintendo 3DS-rom</comment>
+ <comment xml:lang="sl">Nintendo 3DS ROM</comment>
+ <comment xml:lang="si">Nintendo 3DS ROM</comment>
+ <comment xml:lang="ru">Nintendo 3DS ROM</comment>
+ <comment xml:lang="pt_BR">ROM do Nintendo 3DS</comment>
+ <comment xml:lang="pt">ROM Nintendo 3DS</comment>
+ <comment xml:lang="pl">Plik ROM konsoli Nintendo 3DS</comment>
+ <comment xml:lang="oc">ROM Nintendo 3DS</comment>
+ <comment xml:lang="nl">Nintendo 3DS-ROM</comment>
+ <comment xml:lang="ko">닌텐도 3DS 롬</comment>
+ <comment xml:lang="kk">Nintendo 3DS ROM</comment>
+ <comment xml:lang="ja">ニンテンドー3DS ROM</comment>
+ <comment xml:lang="it">ROM Nintendo 3DS</comment>
+ <comment xml:lang="is">Nintendo 3DS ROM</comment>
+ <comment xml:lang="id">ROM Nintendo 3DS</comment>
+ <comment xml:lang="hu">Nintendo 3DS ROM</comment>
+ <comment xml:lang="hr">Nintendo 3DS ROM</comment>
+ <comment xml:lang="he">ROM של Nintendo 3DS</comment>
+ <comment xml:lang="gl">ROM de Nintendo 3DS</comment>
+ <comment xml:lang="fr">ROM Nintendo 3DS</comment>
+ <comment xml:lang="fi">Nintendo 3DS ROM</comment>
+ <comment xml:lang="eu">Nintendo 3DS ROMa</comment>
+ <comment xml:lang="es">ROM de Nintendo 3DS</comment>
+ <comment xml:lang="en_GB">Nintendo 3DS ROM</comment>
+ <comment xml:lang="de">Nintendo-3DS-ROM</comment>
+ <comment xml:lang="da">Nintendo 3DS-ROM</comment>
+ <comment xml:lang="ca">ROM de Nintendo 3DS</comment>
+ <comment xml:lang="be">Nintendo 3DS ROM</comment>
+ <comment xml:lang="ar">روم نينتندو 3دي</comment>
<generic-icon name="application-x-executable"/>
<glob pattern="*.3ds"/>
<glob pattern="*.cci"/>
@@ -9972,11 +10200,36 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-nintendo-3ds-executable">
<comment>Nintendo 3DS Executable</comment>
- <comment xml:lang="ca">executable de Nintendo 3DS</comment>
- <comment xml:lang="fi">Nintendo 3DS suoritettava</comment>
- <comment xml:lang="it">Eseguibile Nintendo 3DS</comment>
- <comment xml:lang="pl">Plik wykonywalny konsoli Nintendo 3DS</comment>
<comment xml:lang="uk">виконуваний файл Nintendo 3DS</comment>
+ <comment xml:lang="tr">Nintendo 3DS Executable</comment>
+ <comment xml:lang="sv">Körbar Nintendo 3DS-fil</comment>
+ <comment xml:lang="si">Nintendo 3DS Executable</comment>
+ <comment xml:lang="ru">Nintendo 3DS Executable</comment>
+ <comment xml:lang="pt_BR">Executável do Nintendo 3DS</comment>
+ <comment xml:lang="pt">Executável da Nintendo 3DS</comment>
+ <comment xml:lang="pl">Plik wykonywalny konsoli Nintendo 3DS</comment>
+ <comment xml:lang="oc">Executable Nintendo 3DS</comment>
+ <comment xml:lang="nl">Nintendo 3DS-programmabestand</comment>
+ <comment xml:lang="ko">닌텐도 3DS 실행 파일</comment>
+ <comment xml:lang="kk">Nintendo 3DS орындалатын файлы</comment>
+ <comment xml:lang="ja">Nintendo 3DS 実行ファイル</comment>
+ <comment xml:lang="it">Eseguibile Nintendo 3DS</comment>
+ <comment xml:lang="is">Nintendo 3DS keyrsluskrá</comment>
+ <comment xml:lang="id">Executable Nintendo 3DS</comment>
+ <comment xml:lang="hu">Nintendo 3DS végrehajtható fájl</comment>
+ <comment xml:lang="hr">Nintendo 3DS izvršna datoteka</comment>
+ <comment xml:lang="he">קובץ הפעלה של Nintendo 3DS</comment>
+ <comment xml:lang="gl">Executábel de Nintendo 3DS</comment>
+ <comment xml:lang="fr">Exécutable Nintendo 3DS</comment>
+ <comment xml:lang="fi">Nintendo 3DS -ohjelma</comment>
+ <comment xml:lang="eu">Nintendo 3DS exekutagarria</comment>
+ <comment xml:lang="es">ejecutable de Nintendo 3DS</comment>
+ <comment xml:lang="en_GB">Nintendo 3DS Executable</comment>
+ <comment xml:lang="de">Nintendo-3DS-Programmdatei</comment>
+ <comment xml:lang="da">Nintendo 3DS-kørbar</comment>
+ <comment xml:lang="ca">executable de Nintendo 3DS</comment>
+ <comment xml:lang="be">выконвальны файл Nintendo 3DS</comment>
+ <comment xml:lang="ar">تنفيذي نينتندو 3دي إس</comment>
<generic-icon name="application-x-executable"/>
<glob pattern="*.3dsx"/>
<magic priority="40">
@@ -9985,90 +10238,103 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-pc-engine-rom">
<comment>PC Engine ROM</comment>
- <comment xml:lang="ast">ROM de PC Engine</comment>
- <comment xml:lang="bg">ROM — PC Engine</comment>
- <comment xml:lang="ca">ROM de PC Engine</comment>
- <comment xml:lang="cs">ROM pro PC Engine</comment>
- <comment xml:lang="da">PC Engine-ROM</comment>
- <comment xml:lang="de">PC Engine ROM</comment>
- <comment xml:lang="el">PC Engine ROM</comment>
- <comment xml:lang="en-GB">PC Engine ROM</comment>
- <comment xml:lang="es">ROM de PC Engine</comment>
- <comment xml:lang="eu">PC Engine ROM</comment>
- <comment xml:lang="fi">PC Engine ROM</comment>
- <comment xml:lang="fr">ROM PC Engine</comment>
- <comment xml:lang="fur">ROM PC Engine</comment>
- <comment xml:lang="ga">ROM PC Engine</comment>
- <comment xml:lang="gl">ROM de máquina de PC</comment>
- <comment xml:lang="he">ROM של PC Engine</comment>
- <comment xml:lang="hr">PC Engine ROM</comment>
- <comment xml:lang="hu">PC Engine ROM</comment>
- <comment xml:lang="ia">ROM PC Engine</comment>
- <comment xml:lang="id">ROM PC Engine</comment>
- <comment xml:lang="it">ROM PC Engine</comment>
- <comment xml:lang="kk">PC Engine ROM</comment>
- <comment xml:lang="ko">PC 엔진 롬</comment>
- <comment xml:lang="oc">ROM PC Engine</comment>
- <comment xml:lang="pl">Plik ROM konsoli PC Engine</comment>
- <comment xml:lang="pt">ROM PC Engine</comment>
- <comment xml:lang="pt-BR">ROM de PC Engine</comment>
- <comment xml:lang="ru">PC Engine ROM</comment>
- <comment xml:lang="sk">PC Engine ROM</comment>
- <comment xml:lang="sl">Pomnilnik PC Engine ROM</comment>
- <comment xml:lang="sr">ПЦ Енџин РОМ</comment>
- <comment xml:lang="sv">PC Engine-rom</comment>
- <comment xml:lang="tr">PC Engine ROM</comment>
+ <comment xml:lang="zh_TW">PC Engine ROM</comment>
+ <comment xml:lang="zh_CN">PC Engine ROM</comment>
<comment xml:lang="uk">ROM для рушія на ПК</comment>
- <comment xml:lang="zh-CN">PC Engine ROM</comment>
- <comment xml:lang="zh-TW">PC Engine ROM</comment>
+ <comment xml:lang="tr">PC Engine ROM</comment>
+ <comment xml:lang="sv">PC Engine-rom</comment>
+ <comment xml:lang="sr">ПЦ Енџин РОМ</comment>
+ <comment xml:lang="sl">Pomnilnik PC Engine ROM</comment>
+ <comment xml:lang="si">PC Engine ROM</comment>
+ <comment xml:lang="sk">PC Engine ROM</comment>
+ <comment xml:lang="ru">PC Engine ROM</comment>
+ <comment xml:lang="pt_BR">ROM de PC Engine</comment>
+ <comment xml:lang="pt">ROM PC Engine</comment>
+ <comment xml:lang="pl">Plik ROM konsoli PC Engine</comment>
+ <comment xml:lang="oc">ROM PC Engine</comment>
+ <comment xml:lang="nl">PC Engine-ROM</comment>
+ <comment xml:lang="ko">PC 엔진 롬</comment>
+ <comment xml:lang="kk">PC Engine ROM</comment>
+ <comment xml:lang="ja">PCエンジン ROM</comment>
+ <comment xml:lang="it">ROM PC Engine</comment>
+ <comment xml:lang="is">PC Engine ROM</comment>
+ <comment xml:lang="id">ROM PC Engine</comment>
+ <comment xml:lang="ia">ROM PC Engine</comment>
+ <comment xml:lang="hu">PC Engine ROM</comment>
+ <comment xml:lang="hr">PC Engine ROM</comment>
+ <comment xml:lang="he">ROM של PC Engine</comment>
+ <comment xml:lang="gl">ROM de máquina de PC</comment>
+ <comment xml:lang="ga">ROM PC Engine</comment>
+ <comment xml:lang="fur">ROM PC Engine</comment>
+ <comment xml:lang="fr">ROM PC Engine</comment>
+ <comment xml:lang="fi">PC Engine -ROM</comment>
+ <comment xml:lang="eu">PC Engine ROM</comment>
+ <comment xml:lang="es">ROM de PC Engine</comment>
+ <comment xml:lang="en_GB">PC Engine ROM</comment>
+ <comment xml:lang="el">PC Engine ROM</comment>
+ <comment xml:lang="de">PC-Engine ROM</comment>
+ <comment xml:lang="da">PC Engine-ROM</comment>
+ <comment xml:lang="cs">ROM pro PC Engine</comment>
+ <comment xml:lang="ca">ROM de PC Engine</comment>
+ <comment xml:lang="bg">ROM — PC Engine</comment>
+ <comment xml:lang="be">PC Engine ROM</comment>
+ <comment xml:lang="ast">ROM de PC Engine</comment>
+ <comment xml:lang="ar">روم محرك PC</comment>
<generic-icon name="application-x-executable"/>
<glob pattern="*.pce"/>
</mime-type>
<mime-type type="application/x-wii-rom">
<comment>Wii disc image</comment>
- <comment xml:lang="af">Wii-skyfbeeldlêer</comment>
- <comment xml:lang="ast">Imaxe de discu de Wii</comment>
- <comment xml:lang="bg">Диск — Wii</comment>
- <comment xml:lang="ca">imatge de disc de Wii</comment>
- <comment xml:lang="cs">obraz disku pro Wii</comment>
- <comment xml:lang="da">Wii-diskaftryk</comment>
- <comment xml:lang="de">Wii-Datenträgerabbild</comment>
- <comment xml:lang="el">Εικόνα δίσκου Wii</comment>
- <comment xml:lang="en-GB">Wii disc image</comment>
- <comment xml:lang="es">imagen de disco de Wii</comment>
- <comment xml:lang="eu">Wii disko irudia</comment>
- <comment xml:lang="fi">Wii-levykuva</comment>
- <comment xml:lang="fr">image disque Wii</comment>
- <comment xml:lang="fur">imagjin disc Wii</comment>
- <comment xml:lang="ga">íomhá diosca Wii</comment>
- <comment xml:lang="gl">Imaxe de disco de Wii</comment>
- <comment xml:lang="he">דמות כונן Wii</comment>
- <comment xml:lang="hr">Wii slika diska</comment>
- <comment xml:lang="hu">Wii lemezkép</comment>
- <comment xml:lang="ia">Imagine de disco Wii</comment>
- <comment xml:lang="id">Image disk Wii</comment>
- <comment xml:lang="it">Immagine disco Wii</comment>
- <comment xml:lang="kk">Wii диск бейнесі</comment>
- <comment xml:lang="ko">Wii 디스크 이미지</comment>
- <comment xml:lang="oc">imatge disc Wii</comment>
- <comment xml:lang="pl">Obraz płyty konsoli Wii</comment>
- <comment xml:lang="pt">imagem de disco Wii</comment>
- <comment xml:lang="pt-BR">Imagem de disco Wii</comment>
- <comment xml:lang="ru">Образ диска Wii</comment>
- <comment xml:lang="sk">Obraz disku Wii</comment>
- <comment xml:lang="sl">Odtis diska Wii</comment>
- <comment xml:lang="sr">одраз диска Вии-ја</comment>
- <comment xml:lang="sv">Wii-skivavbild</comment>
- <comment xml:lang="tr">Wii disk görüntüsü</comment>
+ <comment xml:lang="zh_TW">Wii 光碟映像檔</comment>
+ <comment xml:lang="zh_CN">Wii 光盘映像</comment>
<comment xml:lang="uk">образ диска Wii</comment>
- <comment xml:lang="zh-CN">Wii 光盘映像</comment>
- <comment xml:lang="zh-TW">Wii 光碟映像檔</comment>
+ <comment xml:lang="tr">Wii disk görüntüsü</comment>
+ <comment xml:lang="sv">Wii-skivavbild</comment>
+ <comment xml:lang="sr">одраз диска Вии-ја</comment>
+ <comment xml:lang="sq">pamje disku Wii</comment>
+ <comment xml:lang="sl">Odtis diska Wii</comment>
+ <comment xml:lang="si">Wii තැටි රූපය</comment>
+ <comment xml:lang="sk">Obraz disku Wii</comment>
+ <comment xml:lang="ru">Образ диска Wii</comment>
+ <comment xml:lang="pt_BR">Imagem de disco Wii</comment>
+ <comment xml:lang="pt">imagem de disco Wii</comment>
+ <comment xml:lang="pl">Obraz płyty konsoli Wii</comment>
+ <comment xml:lang="oc">imatge disc Wii</comment>
+ <comment xml:lang="nl">Wii-schijfkopiebestand</comment>
+ <comment xml:lang="ko">Wii 디스크 이미지</comment>
+ <comment xml:lang="kk">Wii диск бейнесі</comment>
+ <comment xml:lang="ja">Wii ディスクイメージ</comment>
+ <comment xml:lang="it">Immagine disco Wii</comment>
+ <comment xml:lang="is">Wii diskmynd</comment>
+ <comment xml:lang="id">Image disk Wii</comment>
+ <comment xml:lang="ia">Imagine de disco Wii</comment>
+ <comment xml:lang="hu">Wii lemezkép</comment>
+ <comment xml:lang="hr">Wii slika diska</comment>
+ <comment xml:lang="he">דמות כונן Wii</comment>
+ <comment xml:lang="gl">Imaxe de disco de Wii</comment>
+ <comment xml:lang="ga">íomhá diosca Wii</comment>
+ <comment xml:lang="fur">imagjin disc Wii</comment>
+ <comment xml:lang="fr">image disque Wii</comment>
+ <comment xml:lang="fi">Wii-levykuva</comment>
+ <comment xml:lang="eu">Wii disko irudia</comment>
+ <comment xml:lang="es">imagen de disco de Wii</comment>
+ <comment xml:lang="en_GB">Wii disc image</comment>
+ <comment xml:lang="el">Εικόνα δίσκου Wii</comment>
+ <comment xml:lang="de">Wii-Datenträgerabbild</comment>
+ <comment xml:lang="da">Wii-diskaftryk</comment>
+ <comment xml:lang="cs">obraz disku pro Wii</comment>
+ <comment xml:lang="ca">imatge de disc de Wii</comment>
+ <comment xml:lang="bg">Диск — Wii</comment>
+ <comment xml:lang="be">вобраз дыска Wii</comment>
+ <comment xml:lang="ast">Imaxe de discu de Wii</comment>
+ <comment xml:lang="ar">صورة قرص وي</comment>
+ <comment xml:lang="af">Wii-skyfbeeldlêer</comment>
<alias type="application/x-wii-iso-image"/>
<alias type="application/x-wbfs"/>
<alias type="application/x-wia"/>
<generic-icon name="application-x-executable"/>
<glob pattern="*.iso"/>
- <magic priority="50">
+ <magic>
<match offset="24" type="big32" value="0x5d1c9ea3"/>
<match offset="0" type="string" value="WBFS"/>
<match offset="0" type="string" value="WII\001DISC"/>
@@ -10076,41 +10342,49 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-wii-wad">
<comment>WiiWare bundle</comment>
- <comment xml:lang="af">WiiWare-bundel</comment>
- <comment xml:lang="bg">Програмен пакет — WiiWare</comment>
- <comment xml:lang="ca">paquet de WiiWare</comment>
- <comment xml:lang="cs">balíček pro WiiWare</comment>
- <comment xml:lang="da">WiiWare-samling</comment>
- <comment xml:lang="de">WiiWare-Paket</comment>
- <comment xml:lang="en-GB">WiiWare bundle</comment>
- <comment xml:lang="es">conjunto de WiiWare</comment>
- <comment xml:lang="eu">WiiWare bilduma</comment>
- <comment xml:lang="fi">WiiWare-lisäpaketti</comment>
- <comment xml:lang="fr">lot WiiWare</comment>
- <comment xml:lang="fur">côl WiiWare</comment>
- <comment xml:lang="ga">burla WiiWare</comment>
- <comment xml:lang="he">מאגד WiiWare</comment>
- <comment xml:lang="hr">WiiWare paket</comment>
- <comment xml:lang="hu">WiiWare csomag</comment>
- <comment xml:lang="ia">Pacchetto WiiWare</comment>
- <comment xml:lang="id">Bundel WiiWare</comment>
- <comment xml:lang="it">Bundle WiiWare</comment>
- <comment xml:lang="kk">WiiWare дестесі</comment>
- <comment xml:lang="ko">WiiWare 번들</comment>
- <comment xml:lang="oc">lòt WiiWare</comment>
- <comment xml:lang="pl">Pakiet WiiWare</comment>
- <comment xml:lang="pt">pacote WiiWare</comment>
- <comment xml:lang="pt-BR">Pacote WiiWare</comment>
- <comment xml:lang="ru">Пакет WiiWare</comment>
- <comment xml:lang="sk">Balík WiiWare</comment>
- <comment xml:lang="sr">ВииВер комплет</comment>
- <comment xml:lang="sv">WiiWare-paket</comment>
- <comment xml:lang="tr">WiiWare paketi</comment>
+ <comment xml:lang="zh_TW">WiiWare 綁包</comment>
+ <comment xml:lang="zh_CN">WiiWare 捆绑包</comment>
<comment xml:lang="uk">пакет WiiWare</comment>
- <comment xml:lang="zh-CN">WiiWare 捆绑包</comment>
- <comment xml:lang="zh-TW">WiiWare 綁包</comment>
+ <comment xml:lang="tr">WiiWare paketi</comment>
+ <comment xml:lang="sv">WiiWare-paket</comment>
+ <comment xml:lang="sr">ВииВер комплет</comment>
+ <comment xml:lang="sq">paketë WiiWare</comment>
+ <comment xml:lang="si">WiiWare බණ්ඩලය</comment>
+ <comment xml:lang="sk">Balík WiiWare</comment>
+ <comment xml:lang="ru">Пакет WiiWare</comment>
+ <comment xml:lang="pt_BR">Pacote WiiWare</comment>
+ <comment xml:lang="pt">pacote WiiWare</comment>
+ <comment xml:lang="pl">Pakiet WiiWare</comment>
+ <comment xml:lang="oc">lòt WiiWare</comment>
+ <comment xml:lang="nl">WiiWare-bundel</comment>
+ <comment xml:lang="ko">WiiWare 번들</comment>
+ <comment xml:lang="kk">WiiWare дестесі</comment>
+ <comment xml:lang="ja">WiiWare バンドル</comment>
+ <comment xml:lang="it">Bundle WiiWare</comment>
+ <comment xml:lang="is">WiiWare vöndull</comment>
+ <comment xml:lang="id">Bundel WiiWare</comment>
+ <comment xml:lang="ia">Pacchetto WiiWare</comment>
+ <comment xml:lang="hu">WiiWare csomag</comment>
+ <comment xml:lang="hr">WiiWare paket</comment>
+ <comment xml:lang="he">מאגד WiiWare</comment>
+ <comment xml:lang="gl">Empaquetado WiiWare</comment>
+ <comment xml:lang="ga">burla WiiWare</comment>
+ <comment xml:lang="fur">côl WiiWare</comment>
+ <comment xml:lang="fr">lot WiiWare</comment>
+ <comment xml:lang="fi">WiiWare-lisäpaketti</comment>
+ <comment xml:lang="eu">WiiWare bilduma</comment>
+ <comment xml:lang="es">conjunto de WiiWare</comment>
+ <comment xml:lang="en_GB">WiiWare bundle</comment>
+ <comment xml:lang="de">WiiWare-Paket</comment>
+ <comment xml:lang="da">WiiWare-samling</comment>
+ <comment xml:lang="cs">balíček pro WiiWare</comment>
+ <comment xml:lang="ca">paquet de WiiWare</comment>
+ <comment xml:lang="bg">Програмен пакет — WiiWare</comment>
+ <comment xml:lang="be">пакет WiiWare</comment>
+ <comment xml:lang="ar">حزمة وي واير</comment>
+ <comment xml:lang="af">WiiWare-bundel</comment>
<generic-icon name="application-x-executable"/>
- <magic priority="50">
+ <magic>
<match type="string" value="Is\0\0" offset="4"/>
<match type="string" value="ib\0\0" offset="4"/>
<match type="string" value="Bk\0\0" offset="4"/>
@@ -10119,148 +10393,183 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-gamecube-rom">
<comment>GameCube disc image</comment>
- <comment xml:lang="af">GameCube-skyfbeeldlêer</comment>
- <comment xml:lang="bg">Диск — GameCube</comment>
- <comment xml:lang="ca">imatge de disc de GameCube</comment>
- <comment xml:lang="cs">obraz disku pro GameCube</comment>
- <comment xml:lang="da">GameCube-diskaftryk</comment>
- <comment xml:lang="de">GameCube-Datenträgerabbild</comment>
- <comment xml:lang="el">Εικόνα δίσκου GameCube</comment>
- <comment xml:lang="en-GB">GameCube disc image</comment>
- <comment xml:lang="es">imagen de disco de GameCube</comment>
- <comment xml:lang="eu">GameCube disko irudia</comment>
- <comment xml:lang="fi">GameCube-levykuva</comment>
- <comment xml:lang="fr">image disque GameCube</comment>
- <comment xml:lang="fur">imagjin disc GameCube</comment>
- <comment xml:lang="ga">íomhá diosca GameCube</comment>
- <comment xml:lang="gl">Imae de disco de GameCube</comment>
- <comment xml:lang="he">דמות כונן GameCube</comment>
- <comment xml:lang="hr">GameCube slika diska</comment>
- <comment xml:lang="hu">GameCube lemezkép</comment>
- <comment xml:lang="ia">Imagine de disco GameCube</comment>
- <comment xml:lang="id">Image disk GameCube</comment>
- <comment xml:lang="it">Immagine disco GameCube</comment>
- <comment xml:lang="kk">GameCube диск бейнесі</comment>
- <comment xml:lang="ko">게임큐브 디스크 이미지</comment>
- <comment xml:lang="oc">imatge disc GameCube</comment>
- <comment xml:lang="pl">Obraz płyty konsoli GameCube</comment>
- <comment xml:lang="pt">imagem de disco GameCube</comment>
- <comment xml:lang="pt-BR">Imagem de disco GameCube</comment>
- <comment xml:lang="ru">Образ диска GameCube</comment>
- <comment xml:lang="sk">Obraz disku GameCube</comment>
- <comment xml:lang="sl">Odtis diska GameCube</comment>
- <comment xml:lang="sr">одраз диска Гејм Коцке</comment>
- <comment xml:lang="sv">GameCube-skivavbild</comment>
- <comment xml:lang="tr">GameCube disk görüntüsü</comment>
+ <comment xml:lang="zh_TW">GameCube 光碟映像檔</comment>
+ <comment xml:lang="zh_CN">GameCube 光盘映像</comment>
<comment xml:lang="uk">образ диска GameCube</comment>
- <comment xml:lang="zh-CN">GameCube 光盘映像</comment>
- <comment xml:lang="zh-TW">GameCube 光碟映像檔</comment>
+ <comment xml:lang="tr">GameCube disk görüntüsü</comment>
+ <comment xml:lang="sv">GameCube-skivavbild</comment>
+ <comment xml:lang="sr">одраз диска Гејм Коцке</comment>
+ <comment xml:lang="sq">pamje disku GameCube</comment>
+ <comment xml:lang="sl">Odtis diska GameCube</comment>
+ <comment xml:lang="si">GameCube තැටි රූපය</comment>
+ <comment xml:lang="sk">Obraz disku GameCube</comment>
+ <comment xml:lang="ru">Образ диска GameCube</comment>
+ <comment xml:lang="pt_BR">Imagem de disco GameCube</comment>
+ <comment xml:lang="pt">imagem de disco GameCube</comment>
+ <comment xml:lang="pl">Obraz płyty konsoli GameCube</comment>
+ <comment xml:lang="oc">imatge disc GameCube</comment>
+ <comment xml:lang="nl">GameCube-schijfkopiebestand</comment>
+ <comment xml:lang="ko">게임큐브 디스크 이미지</comment>
+ <comment xml:lang="kk">GameCube диск бейнесі</comment>
+ <comment xml:lang="ja">GameCube ディスクイメージ</comment>
+ <comment xml:lang="it">Immagine disco GameCube</comment>
+ <comment xml:lang="is">GameCube diskmynd</comment>
+ <comment xml:lang="id">Image disk GameCube</comment>
+ <comment xml:lang="ia">Imagine de disco GameCube</comment>
+ <comment xml:lang="hu">GameCube lemezkép</comment>
+ <comment xml:lang="hr">GameCube slika diska</comment>
+ <comment xml:lang="he">דמות כונן GameCube</comment>
+ <comment xml:lang="gl">Imae de disco de GameCube</comment>
+ <comment xml:lang="ga">íomhá diosca GameCube</comment>
+ <comment xml:lang="fur">imagjin disc GameCube</comment>
+ <comment xml:lang="fr">image disque GameCube</comment>
+ <comment xml:lang="fi">GameCube-levykuva</comment>
+ <comment xml:lang="eu">GameCube disko irudia</comment>
+ <comment xml:lang="es">imagen de disco de GameCube</comment>
+ <comment xml:lang="en_GB">GameCube disc image</comment>
+ <comment xml:lang="el">Εικόνα δίσκου GameCube</comment>
+ <comment xml:lang="de">GameCube-Datenträgerabbild</comment>
+ <comment xml:lang="da">GameCube-diskaftryk</comment>
+ <comment xml:lang="cs">obraz disku pro GameCube</comment>
+ <comment xml:lang="ca">imatge de disc de GameCube</comment>
+ <comment xml:lang="bg">Диск — GameCube</comment>
+ <comment xml:lang="be">вобраз дыска GameCube</comment>
+ <comment xml:lang="ar">صورة قرص GameCube</comment>
+ <comment xml:lang="af">GameCube-skyfbeeldlêer</comment>
<generic-icon name="application-x-executable"/>
<alias type="application/x-gamecube-iso-image"/>
<glob pattern="*.iso"/>
- <magic priority="50">
+ <magic>
<match offset="28" type="big32" value="0xc2339f3d"/>
</magic>
</mime-type>
<mime-type type="application/x-thomson-cartridge-memo7">
<comment>Thomson Mémo7 cartridge</comment>
- <comment xml:lang="bg">Касета — Thomson Mémo7</comment>
- <comment xml:lang="ca">cartutx Thomson Mémo7</comment>
- <comment xml:lang="cs">Kazeta Thomson Mémo7</comment>
- <comment xml:lang="da">Thomson Mémo7-kassette</comment>
- <comment xml:lang="de">Thomson-Mémo7-Steckmodul</comment>
- <comment xml:lang="en-GB">Thomson Mémo7 cartridge</comment>
- <comment xml:lang="es">cartucho Mémo7 de Thomson</comment>
- <comment xml:lang="eu">Thomson Mémo7 kartutxoa</comment>
- <comment xml:lang="fi">Thomson Mémo7 -patruuna</comment>
- <comment xml:lang="fr">cartouche Thomson Mémo7</comment>
- <comment xml:lang="fur">cartucje Mémo7 Thomson</comment>
- <comment xml:lang="ga">cartús Thomson Mémo7</comment>
- <comment xml:lang="hr">Thomson Mémo7 uložak</comment>
- <comment xml:lang="hu">Thomson Mémo7 kazetta</comment>
- <comment xml:lang="id">Cartridge Thomson Mémo7</comment>
- <comment xml:lang="it">Cartuccia Thomson Mémo7</comment>
- <comment xml:lang="kk">Thomson Mémo7 картриджі</comment>
- <comment xml:lang="ko">톰슨 Mémo7 카트리지</comment>
- <comment xml:lang="pl">Kartridż Thomson Mémo7</comment>
- <comment xml:lang="pt">cartucho Thomson Mémo7</comment>
- <comment xml:lang="pt-BR">Cartucho Thomson Mémo7</comment>
- <comment xml:lang="ru">Картридж Thomson Mémo7</comment>
- <comment xml:lang="sk">Kazeta Thomson Mémo7</comment>
- <comment xml:lang="sr">Томсон Мемо7 кертриџ</comment>
- <comment xml:lang="sv">Thomson Mémo7-spelkassett</comment>
- <comment xml:lang="tr">Thomson Mémo7 kartuşu</comment>
+ <comment xml:lang="zh_TW">Thomson Mémo7 卡匣</comment>
+ <comment xml:lang="zh_CN">Thomson Mémo7 卡带</comment>
<comment xml:lang="uk">картридж Thomson Mémo7</comment>
- <comment xml:lang="zh-CN">Thomson Mémo7 卡带</comment>
- <comment xml:lang="zh-TW">Thomson Mémo7 卡匣</comment>
+ <comment xml:lang="tr">Thomson Mémo7 kartuşu</comment>
+ <comment xml:lang="sv">Thomson Mémo7-spelkassett</comment>
+ <comment xml:lang="sr">Томсон Мемо7 кертриџ</comment>
+ <comment xml:lang="sq">bobinë Thomson Mémo7</comment>
+ <comment xml:lang="si">Thomson Mémo7 කාට්රිජ්</comment>
+ <comment xml:lang="sk">Kazeta Thomson Mémo7</comment>
+ <comment xml:lang="ru">Картридж Thomson Mémo7</comment>
+ <comment xml:lang="pt_BR">Cartucho Thomson Mémo7</comment>
+ <comment xml:lang="pt">cartucho Thomson Mémo7</comment>
+ <comment xml:lang="pl">Kartridż Thomson Mémo7</comment>
+ <comment xml:lang="nl">Thomson Mémo7-casette</comment>
+ <comment xml:lang="ko">톰슨 Mémo7 카트리지</comment>
+ <comment xml:lang="kk">Thomson Mémo7 картриджі</comment>
+ <comment xml:lang="ja">Thomson Mémo7 カートリッジ</comment>
+ <comment xml:lang="it">Cartuccia Thomson Mémo7</comment>
+ <comment xml:lang="is">Thomson Mémo7 hylki</comment>
+ <comment xml:lang="id">Cartridge Thomson Mémo7</comment>
+ <comment xml:lang="hu">Thomson Mémo7 kazetta</comment>
+ <comment xml:lang="hr">Thomson Mémo7 uložak</comment>
+ <comment xml:lang="he">קלטת Thomson Mémo7</comment>
+ <comment xml:lang="gl">Cartucho de Thomson Mémo7</comment>
+ <comment xml:lang="ga">cartús Thomson Mémo7</comment>
+ <comment xml:lang="fur">cartucje Mémo7 Thomson</comment>
+ <comment xml:lang="fr">cartouche Thomson Mémo7</comment>
+ <comment xml:lang="fi">Thomson Mémo7 -patruuna</comment>
+ <comment xml:lang="eu">Thomson Mémo7 kartutxoa</comment>
+ <comment xml:lang="es">cartucho Mémo7 de Thomson</comment>
+ <comment xml:lang="en_GB">Thomson Mémo7 cartridge</comment>
+ <comment xml:lang="de">Thomson-Mémo7-Steckmodul</comment>
+ <comment xml:lang="da">Thomson Mémo7-kassette</comment>
+ <comment xml:lang="cs">Kazeta Thomson Mémo7</comment>
+ <comment xml:lang="ca">cartutx Thomson Mémo7</comment>
+ <comment xml:lang="bg">Касета — Thomson Mémo7</comment>
+ <comment xml:lang="be">картрыдж Thomson Mémo7</comment>
+ <comment xml:lang="ar">خرطوشة Thomson Mémo7</comment>
<generic-icon name="application-x-executable"/>
<glob pattern="*.m7"/>
</mime-type>
<mime-type type="application/x-thomson-cassette">
<comment>Thomson cassette</comment>
- <comment xml:lang="bg">Касета — Thomson</comment>
- <comment xml:lang="ca">cinta de casset Thomson</comment>
- <comment xml:lang="cs">Kazeta Thomson</comment>
- <comment xml:lang="da">Thomson-kassette</comment>
- <comment xml:lang="de">Thomson-Kassette</comment>
- <comment xml:lang="en-GB">Thomson cassette</comment>
- <comment xml:lang="es">casete de Thomson</comment>
- <comment xml:lang="eu">Thomson kasetea</comment>
- <comment xml:lang="fi">Thomson-kasetti</comment>
- <comment xml:lang="fr">cassette Thomson</comment>
- <comment xml:lang="fur">cassete Thomson</comment>
- <comment xml:lang="ga">caiséad Thomson</comment>
- <comment xml:lang="hr">Thomson kaseta</comment>
- <comment xml:lang="hu">Thomson kazetta</comment>
- <comment xml:lang="id">Kaset Thomson</comment>
- <comment xml:lang="it">Cassetta Thomson</comment>
- <comment xml:lang="kk">Thomson кассетасы</comment>
- <comment xml:lang="ko">톰슨 카세트</comment>
- <comment xml:lang="pl">Kaseta Thomson</comment>
- <comment xml:lang="pt">cassete Thomson</comment>
- <comment xml:lang="pt-BR">Cassete Thomson</comment>
- <comment xml:lang="ru">Кассета Thomson</comment>
- <comment xml:lang="sk">Kazeta Thomson</comment>
- <comment xml:lang="sr">Томсон касете</comment>
- <comment xml:lang="sv">Thomson-kassett</comment>
- <comment xml:lang="tr">Thomson kaset</comment>
+ <comment xml:lang="zh_TW">Thomson 卡匣</comment>
+ <comment xml:lang="zh_CN">Thomson 磁带</comment>
<comment xml:lang="uk">касета Thomson</comment>
- <comment xml:lang="zh-CN">Thomson 磁带</comment>
- <comment xml:lang="zh-TW">Thomson 卡匣</comment>
+ <comment xml:lang="tr">Thomson kaset</comment>
+ <comment xml:lang="sv">Thomson-kassett</comment>
+ <comment xml:lang="sr">Томсон касете</comment>
+ <comment xml:lang="sq">kasetë Thomson</comment>
+ <comment xml:lang="sl">Kaseta Thomson</comment>
+ <comment xml:lang="si">තොම්සන් කැසට් පටය</comment>
+ <comment xml:lang="sk">Kazeta Thomson</comment>
+ <comment xml:lang="ru">Кассета Thomson</comment>
+ <comment xml:lang="pt_BR">Cassete Thomson</comment>
+ <comment xml:lang="pt">cassete Thomson</comment>
+ <comment xml:lang="pl">Kaseta Thomson</comment>
+ <comment xml:lang="nl">Thomson-cassette</comment>
+ <comment xml:lang="ko">톰슨 카세트</comment>
+ <comment xml:lang="kk">Thomson кассетасы</comment>
+ <comment xml:lang="ja">Thomson カセット</comment>
+ <comment xml:lang="it">Cassetta Thomson</comment>
+ <comment xml:lang="is">Thomson snælda</comment>
+ <comment xml:lang="id">Kaset Thomson</comment>
+ <comment xml:lang="hu">Thomson kazetta</comment>
+ <comment xml:lang="hr">Thomson kaseta</comment>
+ <comment xml:lang="he">קלטת Thomson</comment>
+ <comment xml:lang="ga">caiséad Thomson</comment>
+ <comment xml:lang="fur">cassete Thomson</comment>
+ <comment xml:lang="fr">cassette Thomson</comment>
+ <comment xml:lang="fi">Thomson-kasetti</comment>
+ <comment xml:lang="eu">Thomson kasetea</comment>
+ <comment xml:lang="es">casete de Thomson</comment>
+ <comment xml:lang="en_GB">Thomson cassette</comment>
+ <comment xml:lang="de">Thomson-Kassette</comment>
+ <comment xml:lang="da">Thomson-kassette</comment>
+ <comment xml:lang="cs">Kazeta Thomson</comment>
+ <comment xml:lang="ca">cinta de casset Thomson</comment>
+ <comment xml:lang="bg">Касета — Thomson</comment>
+ <comment xml:lang="be">касета Thomson</comment>
+ <comment xml:lang="ar">شريط Thomson</comment>
<generic-icon name="application-x-executable"/>
<glob pattern="*.k7"/>
</mime-type>
<mime-type type="application/x-hfe-floppy-image">
<comment>HFE floppy disk image</comment>
- <comment xml:lang="bg">Диск — флопи, HFE</comment>
- <comment xml:lang="ca">imatge de disquet HFE</comment>
- <comment xml:lang="cs">Obraz diskety HFE</comment>
- <comment xml:lang="da">HFE-floppydiskaftryk</comment>
- <comment xml:lang="de">HFE-Diskettenabbild</comment>
- <comment xml:lang="en-GB">HFE floppy disk image</comment>
- <comment xml:lang="es">imagen de disquete HFE</comment>
- <comment xml:lang="eu">HFE diskete disko irudia</comment>
- <comment xml:lang="fi">HFE disketti-levykuva</comment>
- <comment xml:lang="fr">image disquette HFE</comment>
- <comment xml:lang="fur">imagjin disc floppy HFE</comment>
- <comment xml:lang="ga">íomhá diosca fhlapaigh HFE</comment>
- <comment xml:lang="hr">HFE slika diskete</comment>
- <comment xml:lang="hu">HFE flopi lemezkép</comment>
- <comment xml:lang="id">Image disk floppy HFE</comment>
- <comment xml:lang="it">Immagine disco floppy HFE</comment>
- <comment xml:lang="kk">HFE иілгіш диск бейнесі</comment>
- <comment xml:lang="ko">HFE 플로피 디스크 이미지</comment>
- <comment xml:lang="pl">Obraz dyskietki HFE</comment>
- <comment xml:lang="pt">imagem de disquete HFE</comment>
- <comment xml:lang="pt-BR">Imagem de disco flexível HFE</comment>
- <comment xml:lang="ru">Образ гибкого диска HFE</comment>
- <comment xml:lang="sk">Obraz pružného disku HFE</comment>
- <comment xml:lang="sr">ХФЕ слика флопи диска</comment>
- <comment xml:lang="sv">HFE-diskavbild</comment>
- <comment xml:lang="tr">HFE disket görüntüsü</comment>
+ <comment xml:lang="zh_TW">HFE 軟碟映像檔</comment>
+ <comment xml:lang="zh_CN">HFE 软盘映像</comment>
<comment xml:lang="uk">образ дискети HFE</comment>
- <comment xml:lang="zh-CN">HFE 软盘映像</comment>
- <comment xml:lang="zh-TW">HFE 軟碟映像檔</comment>
+ <comment xml:lang="tr">HFE disket görüntüsü</comment>
+ <comment xml:lang="sv">HFE-diskavbild</comment>
+ <comment xml:lang="sr">ХФЕ слика флопи диска</comment>
+ <comment xml:lang="sq">pamje diskete HFE</comment>
+ <comment xml:lang="sl">Slika diskete HFE</comment>
+ <comment xml:lang="si">HFE නම්ය තැටි රූපය</comment>
+ <comment xml:lang="sk">Obraz pružného disku HFE</comment>
+ <comment xml:lang="ru">Образ гибкого диска HFE</comment>
+ <comment xml:lang="pt_BR">Imagem de disco flexível HFE</comment>
+ <comment xml:lang="pt">imagem de disquete HFE</comment>
+ <comment xml:lang="pl">Obraz dyskietki HFE</comment>
+ <comment xml:lang="nl">HFE-diskette-schijfkopiebestand</comment>
+ <comment xml:lang="ko">HFE 플로피 디스크 이미지</comment>
+ <comment xml:lang="kk">HFE иілгіш диск бейнесі</comment>
+ <comment xml:lang="ja">HFE フロッピーディスクイメージ</comment>
+ <comment xml:lang="it">Immagine disco floppy HFE</comment>
+ <comment xml:lang="is">HFE disklingsmynd</comment>
+ <comment xml:lang="id">Image disk floppy HFE</comment>
+ <comment xml:lang="hu">HFE flopi lemezkép</comment>
+ <comment xml:lang="hr">HFE slika diskete</comment>
+ <comment xml:lang="he">דמות כונן תקליטון מסוג HPE</comment>
+ <comment xml:lang="gl">Imaxe de disquete HHFE</comment>
+ <comment xml:lang="ga">íomhá diosca fhlapaigh HFE</comment>
+ <comment xml:lang="fur">imagjin disc floppy HFE</comment>
+ <comment xml:lang="fr">image disquette HFE</comment>
+ <comment xml:lang="fi">HFE-levykekuva</comment>
+ <comment xml:lang="eu">HFE diskete disko irudia</comment>
+ <comment xml:lang="es">imagen de disquete HFE</comment>
+ <comment xml:lang="en_GB">HFE floppy disk image</comment>
+ <comment xml:lang="de">HFE-Diskettenabbild</comment>
+ <comment xml:lang="da">HFE-floppydiskaftryk</comment>
+ <comment xml:lang="cs">Obraz diskety HFE</comment>
+ <comment xml:lang="ca">imatge de disquet HFE</comment>
+ <comment xml:lang="bg">Диск — флопи, HFE</comment>
+ <comment xml:lang="be">вобраз гнуткага дыска HFE</comment>
+ <comment xml:lang="ar">صورة قرص مرن HFE</comment>
<acronym>HFE</acronym>
<expanded-acronym>HxC Floppy Emulator</expanded-acronym>
<generic-icon name="application-x-executable"/>
@@ -10272,35 +10581,45 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-thomson-sap-image">
<comment>SAP Thomson floppy disk image</comment>
- <comment xml:lang="bg">Диск — флопи, SAP Thomson</comment>
- <comment xml:lang="ca">imatge de disquet SAP Thomson</comment>
- <comment xml:lang="cs">Obraz diskety SAP Thomson</comment>
- <comment xml:lang="da">SAP Thomson-floppydiskaftryk</comment>
- <comment xml:lang="de">SAP-Thomson-Diskettenabbild</comment>
- <comment xml:lang="en-GB">SAP Thomson floppy disk image</comment>
- <comment xml:lang="es">imagen de disquete SAP de Thomson</comment>
- <comment xml:lang="eu">SAP Thomson diskete disko irudia</comment>
- <comment xml:lang="fi">SAP Thomson disketti-levykuva</comment>
- <comment xml:lang="fr">image disquette SAP Thomson</comment>
- <comment xml:lang="fur">imagjin disc floppy SAP Thomson</comment>
- <comment xml:lang="ga">íomhá diosca fhlapaigh SAP Thomson</comment>
- <comment xml:lang="hr">SAP Thomson slika diskete</comment>
- <comment xml:lang="hu">SAP Thomson flopi lemezkép</comment>
- <comment xml:lang="id">Image disk floppy SAP Thomson</comment>
- <comment xml:lang="it">Immagine disco floppy Thomson SAP</comment>
- <comment xml:lang="kk">SAP Thomson иілгіш диск бейнесі</comment>
- <comment xml:lang="ko">SAP 톰슨 플로피 디스크 이미지</comment>
- <comment xml:lang="pl">Obraz dyskietki SAP Thomson</comment>
- <comment xml:lang="pt">imagem de disquete SAP Thomson</comment>
- <comment xml:lang="pt-BR">Imagem de disco flexível SAP Thomson</comment>
- <comment xml:lang="ru">Образ гибкого диска SAP Thomson</comment>
- <comment xml:lang="sk">Obraz pružného disku SAP Thomson</comment>
- <comment xml:lang="sr">САП Томсон слика флопи диска</comment>
- <comment xml:lang="sv">SAP Thomson-diskavbild</comment>
- <comment xml:lang="tr">SAP Thomson disket görüntüsü</comment>
+ <comment xml:lang="zh_TW">SAP Thomson 軟碟映像檔</comment>
+ <comment xml:lang="zh_CN">SAP Thomson 软盘映像</comment>
<comment xml:lang="uk">образ дискети Thomson SAP</comment>
- <comment xml:lang="zh-CN">SAP Thomson 软盘映像</comment>
- <comment xml:lang="zh-TW">SAP Thomson 軟碟映像檔</comment>
+ <comment xml:lang="tr">SAP Thomson disket görüntüsü</comment>
+ <comment xml:lang="sv">SAP Thomson-diskavbild</comment>
+ <comment xml:lang="sr">САП Томсон слика флопи диска</comment>
+ <comment xml:lang="sq">pamje diskete SAP Thomson</comment>
+ <comment xml:lang="sl">Slika diskete SAP Thomson</comment>
+ <comment xml:lang="si">SAP තොම්සන් නම්ය තැටි රූපය</comment>
+ <comment xml:lang="sk">Obraz pružného disku SAP Thomson</comment>
+ <comment xml:lang="ru">Образ гибкого диска SAP Thomson</comment>
+ <comment xml:lang="pt_BR">Imagem de disco flexível SAP Thomson</comment>
+ <comment xml:lang="pt">imagem de disquete SAP Thomson</comment>
+ <comment xml:lang="pl">Obraz dyskietki SAP Thomson</comment>
+ <comment xml:lang="nl">SAP Thomson diskette-schijfkopiebestand</comment>
+ <comment xml:lang="ko">SAP 톰슨 플로피 디스크 이미지</comment>
+ <comment xml:lang="kk">SAP Thomson иілгіш диск бейнесі</comment>
+ <comment xml:lang="ja">SAP Thomson フロッピーディスクイメージ</comment>
+ <comment xml:lang="it">Immagine disco floppy Thomson SAP</comment>
+ <comment xml:lang="is">SAP Thomson disklingsmynd</comment>
+ <comment xml:lang="id">Image disk floppy SAP Thomson</comment>
+ <comment xml:lang="hu">SAP Thomson flopi lemezkép</comment>
+ <comment xml:lang="hr">SAP Thomson slika diskete</comment>
+ <comment xml:lang="he">דמות כונן תקליטון מסוג SAP Thomson</comment>
+ <comment xml:lang="gl">Imaxe de disquete SAP Thomson</comment>
+ <comment xml:lang="ga">íomhá diosca fhlapaigh SAP Thomson</comment>
+ <comment xml:lang="fur">imagjin disc floppy SAP Thomson</comment>
+ <comment xml:lang="fr">image disquette SAP Thomson</comment>
+ <comment xml:lang="fi">SAP Thomson -levykekuva</comment>
+ <comment xml:lang="eu">SAP Thomson diskete disko irudia</comment>
+ <comment xml:lang="es">imagen de disquete SAP de Thomson</comment>
+ <comment xml:lang="en_GB">SAP Thomson floppy disk image</comment>
+ <comment xml:lang="de">SAP-Thomson-Diskettenabbild</comment>
+ <comment xml:lang="da">SAP Thomson-floppydiskaftryk</comment>
+ <comment xml:lang="cs">Obraz diskety SAP Thomson</comment>
+ <comment xml:lang="ca">imatge de disquet SAP Thomson</comment>
+ <comment xml:lang="bg">Диск — флопи, SAP Thomson</comment>
+ <comment xml:lang="be">вобраз гнуткага дыска SAP Thomson</comment>
+ <comment xml:lang="ar">صورة قرص مرن SAP Thomson</comment>
<acronym>SAP</acronym>
<expanded-acronym>Système d'Archivage Pukall</expanded-acronym>
<generic-icon name="application-x-executable"/>
@@ -10312,63 +10631,66 @@ command to generate the output files.
</mime-type>
<mime-type type="application/vnd.debian.binary-package">
<comment>Debian package</comment>
- <comment xml:lang="af">Debian-pakket</comment>
- <comment xml:lang="ar">حزمة ديبيان</comment>
- <comment xml:lang="az">Debian paketi</comment>
- <comment xml:lang="be-Latn">Pakunak Debian</comment>
- <comment xml:lang="bg">Пакет — Debian</comment>
- <comment xml:lang="ca">paquet Debian</comment>
- <comment xml:lang="cs">balíček Debianu</comment>
- <comment xml:lang="cy">Pecyn Debian</comment>
- <comment xml:lang="da">Debianpakke</comment>
- <comment xml:lang="de">Debian-Paket</comment>
- <comment xml:lang="el">Πακέτο Debian</comment>
- <comment xml:lang="en-GB">Debian package</comment>
- <comment xml:lang="eo">Debian-pakaĵo</comment>
- <comment xml:lang="es">paquete de Debian</comment>
- <comment xml:lang="eu">Debian paketea</comment>
- <comment xml:lang="fi">Debian-paketti</comment>
- <comment xml:lang="fo">Debian pakki</comment>
- <comment xml:lang="fr">paquet Debian</comment>
- <comment xml:lang="fur">pachet Debian</comment>
- <comment xml:lang="ga">pacáiste Debian</comment>
- <comment xml:lang="gl">paquete de Debian</comment>
- <comment xml:lang="he">חבילת דביאן</comment>
- <comment xml:lang="hr">Debian paket</comment>
- <comment xml:lang="hu">Debian-csomag</comment>
- <comment xml:lang="ia">Pacchetto Debian</comment>
- <comment xml:lang="id">Paket Debian</comment>
- <comment xml:lang="it">Pacchetto Debian</comment>
- <comment xml:lang="ja">Debian パッケージ</comment>
- <comment xml:lang="ka">Debian-ის პაკეტი</comment>
- <comment xml:lang="kk">Debian дестесі</comment>
- <comment xml:lang="ko">데비안 패키지</comment>
- <comment xml:lang="lt">Debian paketas</comment>
- <comment xml:lang="lv">Debian pakotne</comment>
- <comment xml:lang="ms">Pakej Debian</comment>
- <comment xml:lang="nb">Debian pakke</comment>
- <comment xml:lang="nl">Debian-pakket</comment>
- <comment xml:lang="nn">Debian pakke</comment>
- <comment xml:lang="oc">paquet Debian</comment>
- <comment xml:lang="pl">Pakiet Debiana</comment>
- <comment xml:lang="pt">pacote Debian</comment>
- <comment xml:lang="pt-BR">Pacote Debian</comment>
- <comment xml:lang="ro">Pachet Debian</comment>
- <comment xml:lang="ru">Пакет Debian</comment>
- <comment xml:lang="sk">Balíček Debianu</comment>
- <comment xml:lang="sl">Datoteka paketa Debian</comment>
- <comment xml:lang="sq">Paketë Debian</comment>
- <comment xml:lang="sr">Дебијанов пакет</comment>
- <comment xml:lang="sv">Debianpaket</comment>
- <comment xml:lang="tr">Debian paketi</comment>
- <comment xml:lang="uk">пакунок Debian</comment>
+ <comment xml:lang="zh_TW">Debian 軟體包</comment>
+ <comment xml:lang="zh_CN">Debian 软件包</comment>
<comment xml:lang="vi">Gói Debian</comment>
- <comment xml:lang="zh-CN">Debian 软件包</comment>
- <comment xml:lang="zh-TW">Debian 軟體包</comment>
+ <comment xml:lang="uk">пакунок Debian</comment>
+ <comment xml:lang="tr">Debian paketi</comment>
+ <comment xml:lang="sv">Debianpaket</comment>
+ <comment xml:lang="sr">Дебијанов пакет</comment>
+ <comment xml:lang="sq">Paketë Debian</comment>
+ <comment xml:lang="sl">Datoteka paketa Debian</comment>
+ <comment xml:lang="si">ඩේබියන් පැකේජය</comment>
+ <comment xml:lang="sk">Balíček Debianu</comment>
+ <comment xml:lang="ru">Пакет Debian</comment>
+ <comment xml:lang="ro">Pachet Debian</comment>
+ <comment xml:lang="pt_BR">Pacote Debian</comment>
+ <comment xml:lang="pt">pacote Debian</comment>
+ <comment xml:lang="pl">Pakiet Debiana</comment>
+ <comment xml:lang="oc">paquet Debian</comment>
+ <comment xml:lang="nn">Debian pakke</comment>
+ <comment xml:lang="nl">Debian-pakket</comment>
+ <comment xml:lang="nb">Debian pakke</comment>
+ <comment xml:lang="ms">Pakej Debian</comment>
+ <comment xml:lang="lv">Debian pakotne</comment>
+ <comment xml:lang="lt">Debian paketas</comment>
+ <comment xml:lang="ko">데비안 패키지</comment>
+ <comment xml:lang="kk">Debian дестесі</comment>
+ <comment xml:lang="ka">Debian-ის პაკეტი</comment>
+ <comment xml:lang="ja">Debian パッケージ</comment>
+ <comment xml:lang="it">Pacchetto Debian</comment>
+ <comment xml:lang="is">Debian pakki</comment>
+ <comment xml:lang="id">Paket Debian</comment>
+ <comment xml:lang="ia">Pacchetto Debian</comment>
+ <comment xml:lang="hu">Debian-csomag</comment>
+ <comment xml:lang="hr">Debian paket</comment>
+ <comment xml:lang="he">חבילת Debian</comment>
+ <comment xml:lang="gl">paquete de Debian</comment>
+ <comment xml:lang="ga">pacáiste Debian</comment>
+ <comment xml:lang="fur">pachet Debian</comment>
+ <comment xml:lang="fr">paquet Debian</comment>
+ <comment xml:lang="fo">Debian pakki</comment>
+ <comment xml:lang="fi">Debian-paketti</comment>
+ <comment xml:lang="eu">Debian paketea</comment>
+ <comment xml:lang="es">paquete de Debian</comment>
+ <comment xml:lang="eo">Debian-pakaĵo</comment>
+ <comment xml:lang="en_GB">Debian package</comment>
+ <comment xml:lang="el">Πακέτο Debian</comment>
+ <comment xml:lang="de">Debian-Paket</comment>
+ <comment xml:lang="da">Debianpakke</comment>
+ <comment xml:lang="cy">Pecyn Debian</comment>
+ <comment xml:lang="cs">balíček Debianu</comment>
+ <comment xml:lang="ca">paquet Debian</comment>
+ <comment xml:lang="bg">Пакет — Debian</comment>
+ <comment xml:lang="be@latin">Pakunak Debian</comment>
+ <comment xml:lang="be">пакет Debian</comment>
+ <comment xml:lang="az">Debian paketi</comment>
+ <comment xml:lang="ar">حزمة ديبيان</comment>
+ <comment xml:lang="af">Debian-pakket</comment>
<alias type="application/x-deb"/>
<alias type="application/x-debian-package"/>
<generic-icon name="package-x-generic"/>
- <magic priority="50">
+ <magic>
<match type="string" value="!&lt;arch&gt;" offset="0">
<match type="string" value="debian" offset="8"/>
</match>
@@ -10378,30 +10700,39 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-designer">
<comment>Qt Designer interface document</comment>
- <comment xml:lang="bg">Документ — интерфейс, Qt Designer</comment>
- <comment xml:lang="ca">document d'interfície Qt Designer</comment>
- <comment xml:lang="da">Qt Designer-brugerflade-dokument</comment>
- <comment xml:lang="de">Qt-Designer-Oberflächendokument</comment>
- <comment xml:lang="en-GB">Qt Designer interface document</comment>
- <comment xml:lang="es">documento de interfaz de Qt Designer</comment>
- <comment xml:lang="eu">Qt Designer interfaze dokumentua</comment>
- <comment xml:lang="fi">Qt Designer -käyttöliittymän asiakirja</comment>
- <comment xml:lang="fr">document d'interface Qt Designer</comment>
- <comment xml:lang="hr">Qt Designer dokument sučelja</comment>
- <comment xml:lang="hu">Qt Designer felületleíró dokumentum</comment>
- <comment xml:lang="id">Dokumen antarmuka Qt Designer</comment>
- <comment xml:lang="it">Documento interfaccia Qt Designer</comment>
- <comment xml:lang="kk">Qt Designer интерфейс құжаты</comment>
- <comment xml:lang="ko">Qt 디자이너 인터페이스 문서</comment>
- <comment xml:lang="pl">Dokument interfejsu Qt Designer</comment>
- <comment xml:lang="pt">documento de interface Qt Designer</comment>
- <comment xml:lang="pt-BR">Documento de interface do Qt Designer</comment>
- <comment xml:lang="ru">Документ интерфейса Qt Designer</comment>
- <comment xml:lang="sv">Qt Designer-gränssnittsdokument</comment>
- <comment xml:lang="tr">Qt Designer arayüz belgesi</comment>
+ <comment xml:lang="zh_TW">Qt Designer 介面文件</comment>
+ <comment xml:lang="zh_CN">Qt Designer 界面文档</comment>
<comment xml:lang="uk">документ інтерфейсу Qt Designer</comment>
- <comment xml:lang="zh-CN">Qt Designer 界面文档</comment>
- <comment xml:lang="zh-TW">Qt Designer 介面文件</comment>
+ <comment xml:lang="tr">Qt Designer arayüz belgesi</comment>
+ <comment xml:lang="sv">Qt Designer-gränssnittsdokument</comment>
+ <comment xml:lang="sq">dokument ndërfaqesh Qt Designer</comment>
+ <comment xml:lang="sl">Dokument vmesnika Qt Designer</comment>
+ <comment xml:lang="si">Qt Designer අතුරුමුහුණත් ලේඛනය</comment>
+ <comment xml:lang="ru">Документ интерфейса Qt Designer</comment>
+ <comment xml:lang="pt_BR">Documento de interface do Qt Designer</comment>
+ <comment xml:lang="pt">documento de interface Qt Designer</comment>
+ <comment xml:lang="pl">Dokument interfejsu Qt Designer</comment>
+ <comment xml:lang="nl">Qt Designer-interfacedocument</comment>
+ <comment xml:lang="ko">Qt 디자이너 인터페이스 문서</comment>
+ <comment xml:lang="kk">Qt Designer интерфейс құжаты</comment>
+ <comment xml:lang="ja">Qt Designer インターフェイスドキュメント</comment>
+ <comment xml:lang="it">Documento interfaccia Qt Designer</comment>
+ <comment xml:lang="is">Qt Designer viðmótsskjal</comment>
+ <comment xml:lang="id">Dokumen antarmuka Qt Designer</comment>
+ <comment xml:lang="hu">Qt Designer felületleíró dokumentum</comment>
+ <comment xml:lang="hr">Qt Designer dokument sučelja</comment>
+ <comment xml:lang="he">מסמך מנשק של Qt Designer</comment>
+ <comment xml:lang="fr">document d'interface Qt Designer</comment>
+ <comment xml:lang="fi">Qt Designer -käyttöliittymän asiakirja</comment>
+ <comment xml:lang="eu">Qt Designer interfaze dokumentua</comment>
+ <comment xml:lang="es">documento de interfaz de Qt Designer</comment>
+ <comment xml:lang="en_GB">Qt Designer interface document</comment>
+ <comment xml:lang="de">Qt-Designer-Oberflächendokument</comment>
+ <comment xml:lang="da">Qt Designer-brugerflade-dokument</comment>
+ <comment xml:lang="ca">document d'interfície Qt Designer</comment>
+ <comment xml:lang="bg">Документ — интерфейс, Qt Designer</comment>
+ <comment xml:lang="be">дакумент інтэрфейсу Qt Designer</comment>
+ <comment xml:lang="ar">مستند واجهة مصمم كيوت</comment>
<generic-icon name="x-office-document"/>
<sub-class-of type="application/xml"/>
<magic>
@@ -10412,56 +10743,83 @@ command to generate the output files.
</mime-type>
<mime-type type="text/x-kaitai-struct">
<comment>Kaitai Struct definition file</comment>
- <comment xml:lang="ca">fitxer de definicions Kaitai Struct</comment>
- <comment xml:lang="fi">Kaitai Struct määritystiedosto</comment>
- <comment xml:lang="it">File definizione Kaitai Struct</comment>
- <comment xml:lang="pl">Plik definicji Kaitai Struct</comment>
<comment xml:lang="uk">файл визначень Kaitai Struct</comment>
- <sub-class-of type="application/x-yaml"/>
+ <comment xml:lang="tr">Kaitai Struct tanım dosyası</comment>
+ <comment xml:lang="sv">Kaitai Struct-definitionsfil</comment>
+ <comment xml:lang="si">Kaitai Struct නිර්වචන ගොනුව</comment>
+ <comment xml:lang="ru">Файл Kaitai Struct definition</comment>
+ <comment xml:lang="pt_BR">Arquivo de definição da Kaitai Struct</comment>
+ <comment xml:lang="pl">Plik definicji Kaitai Struct</comment>
+ <comment xml:lang="nl">Kaitai Struct-definitiebestand</comment>
+ <comment xml:lang="ko">Kaitai 구조체 정의 파일</comment>
+ <comment xml:lang="kk">Kaitai Struct сипаттама файлы</comment>
+ <comment xml:lang="ja">Kaitai Struct 定義ファイル</comment>
+ <comment xml:lang="it">File definizione Kaitai Struct</comment>
+ <comment xml:lang="is">Kaitai Struct skilgreiningarskrá</comment>
+ <comment xml:lang="id">berkas definisi Kaitai Struct</comment>
+ <comment xml:lang="hu">Kaitai szerkezetdefiníciós fájl</comment>
+ <comment xml:lang="hr">Kaitai Struct datoteka definicije</comment>
+ <comment xml:lang="he">קובץ הגדרת Kaitai Struct</comment>
+ <comment xml:lang="fr">Fichier de définition Kaitai Struct</comment>
+ <comment xml:lang="fi">Kaitai Struct -määritystiedosto</comment>
+ <comment xml:lang="es">archivo de definición de Kaitai Struct</comment>
+ <comment xml:lang="en_GB">Kaitai Struct definition file</comment>
+ <comment xml:lang="de">Kaitai Struct-Definitionsdatei</comment>
+ <comment xml:lang="da">Kaitai Struct-definitionsfil</comment>
+ <comment xml:lang="ca">fitxer de definicions Kaitai Struct</comment>
+ <comment xml:lang="be">файл азначэння Kaitai Struct</comment>
+ <comment xml:lang="ar">ملف تعريف Kaitai Struct</comment>
+ <sub-class-of type="application/yaml"/>
<glob pattern="*.ksy"/>
</mime-type>
<mime-type type="text/x-qml">
<comment>Qt Markup Language file</comment>
- <comment xml:lang="af">Qt Markup Language-lêer</comment>
- <comment xml:lang="bg">Интерфейс — Qt Markup</comment>
- <comment xml:lang="ca">fitxer de llenguatge de marcadors Qt</comment>
- <comment xml:lang="cs">soubor Qt Markup Language</comment>
- <comment xml:lang="da">Qt Markup Language-fil</comment>
- <comment xml:lang="de">Qt-Auszeichnungssprachendatei</comment>
- <comment xml:lang="el">Αρχείο Qt Markup Language</comment>
- <comment xml:lang="en-GB">Qt Markup Language file</comment>
- <comment xml:lang="es">archivo de lenguaje de marcado Qt</comment>
- <comment xml:lang="eu">Qt Markup lengoai fitxategia</comment>
- <comment xml:lang="fi">QML-tiedosto</comment>
- <comment xml:lang="fr">fichier Qt Markup Language</comment>
- <comment xml:lang="fur">file Qt Markup Language</comment>
- <comment xml:lang="ga">comhad teanga mharcála Qt</comment>
- <comment xml:lang="gl">ficheiro de linguaxe de marcado Qt</comment>
- <comment xml:lang="he">קובץ שפת סימון של Qt</comment>
- <comment xml:lang="hr">Qt Markup Language datoteka</comment>
- <comment xml:lang="hu">Qt jelölőnyelvű fájl</comment>
- <comment xml:lang="ia">File de linguage de marcation Qt</comment>
- <comment xml:lang="id">Berkas Bahasa Markup Qt</comment>
- <comment xml:lang="it">File Qt Markup Language</comment>
- <comment xml:lang="ja">Qt マークアップ言語ファイル</comment>
- <comment xml:lang="kk">Qt Markup Language файлы</comment>
- <comment xml:lang="ko">Qt 마크업 언어 파일</comment>
- <comment xml:lang="lv">Qt marķēšanas valodas datne</comment>
- <comment xml:lang="nl">Qt Markup Tallbestand</comment>
- <comment xml:lang="oc">fichièr Qt Markup Language</comment>
- <comment xml:lang="pl">Plik języka znaczników Qt</comment>
- <comment xml:lang="pt">ficheiro de linguagem Qt Markup</comment>
- <comment xml:lang="pt-BR">Arquivo de Qt Markup Language</comment>
- <comment xml:lang="ru">Файл Qt Markup Language</comment>
- <comment xml:lang="sk">Súbor značkovacieho jazyka Qt</comment>
- <comment xml:lang="sl">Datoteka označevalnega jezika Qt</comment>
- <comment xml:lang="sr">датотека КуТ-овог језика означавања</comment>
- <comment xml:lang="sv">Qt-märkspråksfil</comment>
- <comment xml:lang="tr">Qt İşaretleme Dili dosyası</comment>
+ <comment xml:lang="zh_TW">Qt 標記語言檔</comment>
+ <comment xml:lang="zh_CN">Qt Markup Language 文件</comment>
<comment xml:lang="uk">файл мови розмітки Qt</comment>
- <comment xml:lang="zh-CN">Qt Markup Language 文件</comment>
- <comment xml:lang="zh-TW">Qt 標記語言檔</comment>
- <magic priority="80">
+ <comment xml:lang="tr">Qt İşaretleme Dili dosyası</comment>
+ <comment xml:lang="sv">Qt-märkspråksfil</comment>
+ <comment xml:lang="sr">датотека КуТ-овог језика означавања</comment>
+ <comment xml:lang="sq">kartelë Qt Markup Language</comment>
+ <comment xml:lang="sl">Datoteka označevalnega jezika Qt</comment>
+ <comment xml:lang="si">Qt Markup භාෂා ගොනුව</comment>
+ <comment xml:lang="sk">Súbor značkovacieho jazyka Qt</comment>
+ <comment xml:lang="ru">Файл Qt Markup Language</comment>
+ <comment xml:lang="pt_BR">Arquivo de Qt Markup Language</comment>
+ <comment xml:lang="pt">ficheiro de linguagem Qt Markup</comment>
+ <comment xml:lang="pl">Plik języka znaczników Qt</comment>
+ <comment xml:lang="oc">fichièr Qt Markup Language</comment>
+ <comment xml:lang="nl">Qt Markup Tallbestand</comment>
+ <comment xml:lang="lv">Qt marķēšanas valodas datne</comment>
+ <comment xml:lang="ko">Qt 마크업 언어 파일</comment>
+ <comment xml:lang="kk">Qt Markup Language файлы</comment>
+ <comment xml:lang="ja">Qt マークアップ言語ファイル</comment>
+ <comment xml:lang="it">File Qt Markup Language</comment>
+ <comment xml:lang="is">Qt Markup Language skrá</comment>
+ <comment xml:lang="id">Berkas Bahasa Markup Qt</comment>
+ <comment xml:lang="ia">File de linguage de marcation Qt</comment>
+ <comment xml:lang="hu">Qt jelölőnyelvű fájl</comment>
+ <comment xml:lang="hr">Qt Markup Language datoteka</comment>
+ <comment xml:lang="he">קובץ שפת סימון של Qt</comment>
+ <comment xml:lang="gl">ficheiro de linguaxe de marcado Qt</comment>
+ <comment xml:lang="ga">comhad teanga mharcála Qt</comment>
+ <comment xml:lang="fur">file Qt Markup Language</comment>
+ <comment xml:lang="fr">fichier Qt Markup Language</comment>
+ <comment xml:lang="fi">QML-tiedosto</comment>
+ <comment xml:lang="eu">Qt Markup lengoai fitxategia</comment>
+ <comment xml:lang="es">archivo de lenguaje de marcado Qt</comment>
+ <comment xml:lang="en_GB">Qt Markup Language file</comment>
+ <comment xml:lang="el">Αρχείο Qt Markup Language</comment>
+ <comment xml:lang="de">Qt-Auszeichnungssprachendatei</comment>
+ <comment xml:lang="da">Qt Markup Language-fil</comment>
+ <comment xml:lang="cs">soubor Qt Markup Language</comment>
+ <comment xml:lang="ca">fitxer de llenguatge de marcadors Qt</comment>
+ <comment xml:lang="bg">Интерфейс — Qt Markup</comment>
+ <comment xml:lang="be">файл Qt Markup Language</comment>
+ <comment xml:lang="ar">ملف لغة وصف Qt</comment>
+ <comment xml:lang="af">Qt Markup Language-lêer</comment>
+ <sub-class-of type="text/plain"/>
+ <magic>
<match type="string" value="/bin/env qml" offset="2:16"/>
<match type="string" value="import Qt" offset="0:3000">
<match type="string" value="{" offset="9:3009"/>
@@ -10475,59 +10833,20 @@ command to generate the output files.
<glob pattern="*.qmlproject"/>
</mime-type>
<mime-type type="application/x-desktop">
- <comment>desktop configuration file</comment>
- <comment xml:lang="ar">ملف تضبيط سطح المكتب</comment>
- <comment xml:lang="be-Latn">kanfihuracyjny fajł asiarodździa</comment>
- <comment xml:lang="bg">Информация за работния плот</comment>
- <comment xml:lang="ca">fitxer de configuració d'escriptori</comment>
- <comment xml:lang="cs">soubor nastavení pracovní plochy</comment>
- <comment xml:lang="da">skrivebordskonfigurationsfil</comment>
- <comment xml:lang="de">Desktop-Konfigurationsdatei</comment>
- <comment xml:lang="el">Αρχείο ρυθμίσεων επιφάνειας εργασίας</comment>
- <comment xml:lang="en-GB">desktop configuration file</comment>
- <comment xml:lang="eo">dosiero de agordoj de labortablo</comment>
- <comment xml:lang="es">archivo de configuración del escritorio</comment>
- <comment xml:lang="eu">Mahaigainaren konfigurazio-fitxategia</comment>
- <comment xml:lang="fi">työpöydän asetustiedosto</comment>
- <comment xml:lang="fo">skriviborðssamansetingarfíla</comment>
- <comment xml:lang="fr">fichier de configuration desktop</comment>
- <comment xml:lang="fur">file di configurazion scritori</comment>
- <comment xml:lang="ga">comhad cumraíochta deisce</comment>
- <comment xml:lang="gl">ficheiro de configuración de escritorio</comment>
- <comment xml:lang="he">קובץ הגדרות שולחן עבודה</comment>
- <comment xml:lang="hr">datoteka podešavanja radne površine</comment>
- <comment xml:lang="hu">asztalbeállító fájl</comment>
- <comment xml:lang="ia">File de configuration de scriptorio</comment>
- <comment xml:lang="id">berkas konfigurasi destop</comment>
- <comment xml:lang="it">File configurazione desktop</comment>
- <comment xml:lang="ja">デスクトップ設定ファイル</comment>
- <comment xml:lang="kk">жұмыс үстел баптаулар файлы</comment>
- <comment xml:lang="ko">데스크톱 설정 파일</comment>
- <comment xml:lang="lt">darbastalio konfigūracijos failas</comment>
- <comment xml:lang="lv">darbvirsmas konfigurācijas datne</comment>
- <comment xml:lang="ms">Fail konfigurasi desktop</comment>
- <comment xml:lang="nb">konfigurasjonsfil for skrivebordet</comment>
- <comment xml:lang="nl">bureaublad-configuratiebestand</comment>
- <comment xml:lang="nn">skrivebordsoppsettfil</comment>
- <comment xml:lang="oc">fichièr de configuracion desktop</comment>
- <comment xml:lang="pl">Plik konfiguracji środowiska</comment>
- <comment xml:lang="pt">ficheiro de configuração de área de trabalho</comment>
- <comment xml:lang="pt-BR">Arquivo de configuração desktop</comment>
- <comment xml:lang="ro">fișier de configurare al desktopului</comment>
- <comment xml:lang="ru">Файл настроек рабочего стола</comment>
- <comment xml:lang="sk">Súbor nastavení pracovnej plochy</comment>
- <comment xml:lang="sl">nastavitvena datoteka namizja</comment>
- <comment xml:lang="sq">File konfigurimi desktop</comment>
- <comment xml:lang="sr">датотека подешавања радне површи</comment>
- <comment xml:lang="sv">skrivbordskonfigurationsfil</comment>
- <comment xml:lang="tr">masaüstü yapılandırma dosyası</comment>
- <comment xml:lang="uk">файл конфігурації стільниці</comment>
- <comment xml:lang="vi">tập tin cấu hình môi trường</comment>
- <comment xml:lang="zh-CN">桌面配置文件</comment>
- <comment xml:lang="zh-TW">桌面組態檔</comment>
+ <comment>Desktop entry</comment>
+ <comment xml:lang="uk">стільничний запис</comment>
+ <comment xml:lang="sv">Skrivbordspost</comment>
+ <comment xml:lang="ru">Запись рабочего стола</comment>
+ <comment xml:lang="pl">Wpis środowiska</comment>
+ <comment xml:lang="it">Elemento desktop</comment>
+ <comment xml:lang="gl">Entrada de escritorio</comment>
+ <comment xml:lang="eu">Mahaigaineko sarrera</comment>
+ <comment xml:lang="es">entrada de escritorio</comment>
+ <comment xml:lang="de">Desktop-Eintrag</comment>
+ <comment xml:lang="be">запіс desktop</comment>
<sub-class-of type="text/plain"/>
<generic-icon name="text-x-generic"/>
- <magic priority="50">
+ <magic>
<match type="string" value="[Desktop Entry]" offset="0:32"/>
<match type="string" value="[Desktop Action" offset="0"/>
<match type="string" value="[KDE Desktop Entry]" offset="0"/>
@@ -10540,53 +10859,57 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-fictionbook+xml">
<comment>FictionBook document</comment>
- <comment xml:lang="af">FictionBook-dokument</comment>
- <comment xml:lang="ar">مستند FictionBook</comment>
- <comment xml:lang="ast">Documentu de FictionBook</comment>
- <comment xml:lang="bg">Документ — FictionBook</comment>
- <comment xml:lang="ca">document FictionBook</comment>
- <comment xml:lang="cs">dokument FictionBook</comment>
- <comment xml:lang="da">FictionBook-dokument</comment>
- <comment xml:lang="de">FictionBook-Dokument</comment>
- <comment xml:lang="el">Έγγραφο FictionBook</comment>
- <comment xml:lang="en-GB">FictionBook document</comment>
- <comment xml:lang="eo">FictionBook-dokumento</comment>
- <comment xml:lang="es">documento FictionBook</comment>
- <comment xml:lang="eu">FictionBook dokumentua</comment>
- <comment xml:lang="fi">FictionBook-asiakirja</comment>
- <comment xml:lang="fo">FictionBook skjal</comment>
- <comment xml:lang="fr">document FictionBook</comment>
- <comment xml:lang="fur">document FictionBook</comment>
- <comment xml:lang="ga">cáipéis FictionBook</comment>
- <comment xml:lang="gl">documento de FictionBook</comment>
- <comment xml:lang="he">מסמך FictionBook</comment>
- <comment xml:lang="hr">FictionBook dokument</comment>
- <comment xml:lang="hu">FictionBook-dokumentum</comment>
- <comment xml:lang="ia">Documento FictionBook</comment>
- <comment xml:lang="id">Dokumen FictionBook</comment>
- <comment xml:lang="it">Documento FictionBook</comment>
- <comment xml:lang="ja">FictionBook ドキュメント</comment>
- <comment xml:lang="ka">FictionBook-ის დოკუმენტი</comment>
- <comment xml:lang="kk">FictionBook құжаты</comment>
- <comment xml:lang="ko">FictionBook 문서</comment>
- <comment xml:lang="lt">FictionBook dokumentas</comment>
- <comment xml:lang="lv">FictionBook dokuments</comment>
- <comment xml:lang="nl">FictionBook-document</comment>
- <comment xml:lang="oc">document FictionBook</comment>
- <comment xml:lang="pl">Dokument FictionBook</comment>
- <comment xml:lang="pt">documento FictionBook</comment>
- <comment xml:lang="pt-BR">Documento FictionBook</comment>
- <comment xml:lang="ro">Document FictionBook</comment>
- <comment xml:lang="ru">Документ FictionBook</comment>
- <comment xml:lang="sk">Dokument FictionBook</comment>
- <comment xml:lang="sl">Dokument FictionBook</comment>
- <comment xml:lang="sr">документ Фикшон Књиге</comment>
- <comment xml:lang="sv">FictionBook-dokument</comment>
- <comment xml:lang="tr">FictionBook belgesi</comment>
- <comment xml:lang="uk">документ FictionBook</comment>
+ <comment xml:lang="zh_TW">FictionBook 文件</comment>
+ <comment xml:lang="zh_CN">FictionBook 文档</comment>
<comment xml:lang="vi">Tài liệu FictionBook</comment>
- <comment xml:lang="zh-CN">FictionBook 文档</comment>
- <comment xml:lang="zh-TW">FictionBook 文件</comment>
+ <comment xml:lang="uk">документ FictionBook</comment>
+ <comment xml:lang="tr">FictionBook belgesi</comment>
+ <comment xml:lang="sv">FictionBook-dokument</comment>
+ <comment xml:lang="sr">документ Фикшон Књиге</comment>
+ <comment xml:lang="sq">dokument FictionBook</comment>
+ <comment xml:lang="sl">Dokument FictionBook</comment>
+ <comment xml:lang="si">ප්‍රබන්ධ පොත් ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument FictionBook</comment>
+ <comment xml:lang="ru">Документ FictionBook</comment>
+ <comment xml:lang="ro">Document FictionBook</comment>
+ <comment xml:lang="pt_BR">Documento FictionBook</comment>
+ <comment xml:lang="pt">documento FictionBook</comment>
+ <comment xml:lang="pl">Dokument FictionBook</comment>
+ <comment xml:lang="oc">document FictionBook</comment>
+ <comment xml:lang="nl">FictionBook-document</comment>
+ <comment xml:lang="lv">FictionBook dokuments</comment>
+ <comment xml:lang="lt">FictionBook dokumentas</comment>
+ <comment xml:lang="ko">FictionBook 문서</comment>
+ <comment xml:lang="kk">FictionBook құжаты</comment>
+ <comment xml:lang="ka">FictionBook-ის დოკუმენტი</comment>
+ <comment xml:lang="ja">FictionBook ドキュメント</comment>
+ <comment xml:lang="it">Documento FictionBook</comment>
+ <comment xml:lang="is">FictionBook skjal</comment>
+ <comment xml:lang="id">Dokumen FictionBook</comment>
+ <comment xml:lang="ia">Documento FictionBook</comment>
+ <comment xml:lang="hu">FictionBook-dokumentum</comment>
+ <comment xml:lang="hr">FictionBook dokument</comment>
+ <comment xml:lang="he">מסמך FictionBook</comment>
+ <comment xml:lang="gl">documento de FictionBook</comment>
+ <comment xml:lang="ga">cáipéis FictionBook</comment>
+ <comment xml:lang="fur">document FictionBook</comment>
+ <comment xml:lang="fr">document FictionBook</comment>
+ <comment xml:lang="fo">FictionBook skjal</comment>
+ <comment xml:lang="fi">FictionBook-asiakirja</comment>
+ <comment xml:lang="eu">FictionBook dokumentua</comment>
+ <comment xml:lang="es">documento FictionBook</comment>
+ <comment xml:lang="eo">FictionBook-dokumento</comment>
+ <comment xml:lang="en_GB">FictionBook document</comment>
+ <comment xml:lang="el">Έγγραφο FictionBook</comment>
+ <comment xml:lang="de">FictionBook-Dokument</comment>
+ <comment xml:lang="da">FictionBook-dokument</comment>
+ <comment xml:lang="cs">dokument FictionBook</comment>
+ <comment xml:lang="ca">document FictionBook</comment>
+ <comment xml:lang="bg">Документ — FictionBook</comment>
+ <comment xml:lang="be">дакумент FictionBook</comment>
+ <comment xml:lang="ast">Documentu de FictionBook</comment>
+ <comment xml:lang="ar">مستند FictionBook</comment>
+ <comment xml:lang="af">FictionBook-dokument</comment>
<sub-class-of type="application/xml"/>
<glob pattern="*.fb2"/>
<magic priority="80">
@@ -10597,43 +10920,50 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-zip-compressed-fb2">
<comment>Compressed FictionBook document</comment>
- <comment xml:lang="af">Saamgepersde FictionBook-dokument</comment>
- <comment xml:lang="ast">Documentu comprimíu de FictionBook</comment>
- <comment xml:lang="bg">Документ — FictionBook, компресиран</comment>
- <comment xml:lang="ca">document FictionBook amb compressió</comment>
- <comment xml:lang="cs">komprimovaný dokument FictionBook</comment>
- <comment xml:lang="da">Komprimeret FictionBook-dokument</comment>
- <comment xml:lang="de">Komprimiertes FictionBook-Dokument</comment>
- <comment xml:lang="el">Συμπιεσμένο έγγραφο FictionBook</comment>
- <comment xml:lang="en-GB">Compressed FictionBook document</comment>
- <comment xml:lang="es">documento comprimido de FictionBook</comment>
- <comment xml:lang="eu">Konprimitutako FictionBook dokumentua</comment>
- <comment xml:lang="fi">Pakattu FictionBook-asiakirja</comment>
- <comment xml:lang="fr">document FictionBook compressé</comment>
- <comment xml:lang="fur">document FictionBook comprimût</comment>
- <comment xml:lang="ga">cáipéis chomhbhrúite FictionBook</comment>
- <comment xml:lang="gl">Documento de FictionBook comprimida</comment>
- <comment xml:lang="he">מסמך FictionBook מכווץ</comment>
- <comment xml:lang="hr">Sažet FictionBook dokument</comment>
- <comment xml:lang="hu">Tömörített FictionBook dokumentum</comment>
- <comment xml:lang="ia">Documento FictionBook comprimite</comment>
- <comment xml:lang="id">Dokumen FictionBook terkompresi</comment>
- <comment xml:lang="it">Documento FictionBook compresso</comment>
- <comment xml:lang="kk">Сығылған FictionBook құжаты</comment>
- <comment xml:lang="ko">압축한 FictionBook 문서</comment>
- <comment xml:lang="oc">document FictionBook compressat</comment>
- <comment xml:lang="pl">Skompresowany dokument FictionBook</comment>
- <comment xml:lang="pt">documento comprimido FictionBook</comment>
- <comment xml:lang="pt-BR">Documento FictionBook comprimido</comment>
- <comment xml:lang="ru">Сжатый документ FictionBook</comment>
- <comment xml:lang="sk">Komprimovaný dokument FictionBook</comment>
- <comment xml:lang="sl">Stisnjeni dokument FictionBook</comment>
- <comment xml:lang="sr">запаковани документ Фикшон Књиге</comment>
- <comment xml:lang="sv">Komprimerat FictionBook-dokument</comment>
- <comment xml:lang="tr">Sıkıştırılmış FictionBook belgesi</comment>
+ <comment xml:lang="zh_TW">壓縮版 FictionBook 文件</comment>
+ <comment xml:lang="zh_CN">压缩的 FictionBook 文档</comment>
<comment xml:lang="uk">стиснений документ FictionBook</comment>
- <comment xml:lang="zh-CN">压缩的 FictionBook 文档</comment>
- <comment xml:lang="zh-TW">壓縮版 FictionBook 文件</comment>
+ <comment xml:lang="tr">Sıkıştırılmış FictionBook belgesi</comment>
+ <comment xml:lang="sv">Komprimerat FictionBook-dokument</comment>
+ <comment xml:lang="sr">запаковани документ Фикшон Књиге</comment>
+ <comment xml:lang="sq">dokument FictionBook i ngjeshur</comment>
+ <comment xml:lang="sl">Stisnjeni dokument FictionBook</comment>
+ <comment xml:lang="si">සම්පීඩිත FictionBook ලේඛනය</comment>
+ <comment xml:lang="sk">Komprimovaný dokument FictionBook</comment>
+ <comment xml:lang="ru">Сжатый документ FictionBook</comment>
+ <comment xml:lang="pt_BR">Documento FictionBook comprimido</comment>
+ <comment xml:lang="pt">documento comprimido FictionBook</comment>
+ <comment xml:lang="pl">Skompresowany dokument FictionBook</comment>
+ <comment xml:lang="oc">document FictionBook compressat</comment>
+ <comment xml:lang="nl">Gecomprimeerd FictionBook-document</comment>
+ <comment xml:lang="ko">압축한 FictionBook 문서</comment>
+ <comment xml:lang="kk">Сығылған FictionBook құжаты</comment>
+ <comment xml:lang="ja">圧縮 FictionBook ドキュメント</comment>
+ <comment xml:lang="it">Documento FictionBook compresso</comment>
+ <comment xml:lang="is">Þjappað FictionBook skjal</comment>
+ <comment xml:lang="id">Dokumen FictionBook terkompresi</comment>
+ <comment xml:lang="ia">Documento FictionBook comprimite</comment>
+ <comment xml:lang="hu">Tömörített FictionBook dokumentum</comment>
+ <comment xml:lang="hr">Sažet FictionBook dokument</comment>
+ <comment xml:lang="he">מסמך FictionBook מכווץ</comment>
+ <comment xml:lang="gl">Documento de FictionBook comprimida</comment>
+ <comment xml:lang="ga">cáipéis chomhbhrúite FictionBook</comment>
+ <comment xml:lang="fur">document FictionBook comprimût</comment>
+ <comment xml:lang="fr">document FictionBook compressé</comment>
+ <comment xml:lang="fi">Pakattu FictionBook-asiakirja</comment>
+ <comment xml:lang="eu">Konprimitutako FictionBook dokumentua</comment>
+ <comment xml:lang="es">documento comprimido de FictionBook</comment>
+ <comment xml:lang="en_GB">Compressed FictionBook document</comment>
+ <comment xml:lang="el">Συμπιεσμένο έγγραφο FictionBook</comment>
+ <comment xml:lang="de">Komprimiertes FictionBook-Dokument</comment>
+ <comment xml:lang="da">Komprimeret FictionBook-dokument</comment>
+ <comment xml:lang="cs">komprimovaný dokument FictionBook</comment>
+ <comment xml:lang="ca">document FictionBook amb compressió</comment>
+ <comment xml:lang="bg">Документ — FictionBook, компресиран</comment>
+ <comment xml:lang="be">сціснуты дакумент FictionBook</comment>
+ <comment xml:lang="ast">Documentu comprimíu de FictionBook</comment>
+ <comment xml:lang="ar">مستند FictionBook مضغوط</comment>
+ <comment xml:lang="af">Saamgepersde FictionBook-dokument</comment>
<sub-class-of type="application/zip"/>
<glob pattern="*.fb2.zip"/>
<magic priority="70">
@@ -10645,345 +10975,322 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-dia-diagram">
<comment>Dia diagram</comment>
- <comment xml:lang="af">Dia-diagram</comment>
- <comment xml:lang="ar">خطاطة Dia</comment>
- <comment xml:lang="az">Dia diaqramı</comment>
- <comment xml:lang="be-Latn">Dyjahrama Dia</comment>
- <comment xml:lang="bg">Диаграма — Dia</comment>
- <comment xml:lang="ca">diagrama de Dia</comment>
- <comment xml:lang="cs">diagram Dia</comment>
- <comment xml:lang="cy">Diagram Dia</comment>
- <comment xml:lang="da">Dia-diagram</comment>
- <comment xml:lang="de">Dia-Diagramm</comment>
- <comment xml:lang="el">Διάγραμμα Dia</comment>
- <comment xml:lang="en-GB">Dia diagram</comment>
- <comment xml:lang="eo">Dia-diagramo</comment>
- <comment xml:lang="es">diagrama de Dia</comment>
- <comment xml:lang="eu">Dia diagrama</comment>
- <comment xml:lang="fi">Dia-kaavio</comment>
- <comment xml:lang="fo">Dia ritmynd</comment>
- <comment xml:lang="fr">diagramme Dia</comment>
- <comment xml:lang="fur">diagram Dia</comment>
- <comment xml:lang="ga">léaráid Dia</comment>
- <comment xml:lang="gl">diagrama de Dia</comment>
- <comment xml:lang="he">גרף של Dia</comment>
- <comment xml:lang="hr">Dia dijagram</comment>
- <comment xml:lang="hu">Dia-diagram</comment>
- <comment xml:lang="ia">Diagramma Dia</comment>
- <comment xml:lang="id">Diagram Dia</comment>
- <comment xml:lang="it">Diagramma Dia</comment>
- <comment xml:lang="ja">Dia ダイアグラム</comment>
- <comment xml:lang="ka">Dia-ის დიაგრამა</comment>
- <comment xml:lang="kk">Dia диаграммасы</comment>
- <comment xml:lang="ko">Dia 다이어그램</comment>
- <comment xml:lang="lt">Dia diagrama</comment>
- <comment xml:lang="lv">Dia diagramma</comment>
- <comment xml:lang="ms">Diagram Dia</comment>
- <comment xml:lang="nb">Dia-diagram</comment>
- <comment xml:lang="nl">Dia-diagram</comment>
- <comment xml:lang="nn">Dia diagram</comment>
- <comment xml:lang="oc">diagrama Dia</comment>
- <comment xml:lang="pl">Diagram Dia</comment>
- <comment xml:lang="pt">diagrama Dia</comment>
- <comment xml:lang="pt-BR">Diagrama do Dia</comment>
- <comment xml:lang="ro">Diagramă Dia</comment>
- <comment xml:lang="ru">Диаграмма Dia</comment>
- <comment xml:lang="sk">Diagram Dia</comment>
- <comment xml:lang="sl">Datoteka diagrama Dia</comment>
- <comment xml:lang="sq">Diagramë Dia</comment>
- <comment xml:lang="sr">дијаграм Дие</comment>
- <comment xml:lang="sv">Dia-diagram</comment>
- <comment xml:lang="tr">Dia çizimi</comment>
- <comment xml:lang="uk">діаграма Dia</comment>
+ <comment xml:lang="zh_TW">Dia 圖表</comment>
+ <comment xml:lang="zh_CN">Dia 图表</comment>
<comment xml:lang="vi">Biểu đồ Dia</comment>
- <comment xml:lang="zh-CN">Dia 图表</comment>
- <comment xml:lang="zh-TW">Dia 圖表</comment>
+ <comment xml:lang="uk">діаграма Dia</comment>
+ <comment xml:lang="tr">Dia çizimi</comment>
+ <comment xml:lang="sv">Dia-diagram</comment>
+ <comment xml:lang="sr">дијаграм Дие</comment>
+ <comment xml:lang="sq">diagram Dia</comment>
+ <comment xml:lang="sl">Datoteka diagrama Dia</comment>
+ <comment xml:lang="si">Dia රූප සටහන</comment>
+ <comment xml:lang="sk">Diagram Dia</comment>
+ <comment xml:lang="ru">Диаграмма Dia</comment>
+ <comment xml:lang="ro">Diagramă Dia</comment>
+ <comment xml:lang="pt_BR">Diagrama do Dia</comment>
+ <comment xml:lang="pt">diagrama Dia</comment>
+ <comment xml:lang="pl">Diagram Dia</comment>
+ <comment xml:lang="oc">diagrama Dia</comment>
+ <comment xml:lang="nn">Dia diagram</comment>
+ <comment xml:lang="nl">Dia-diagram</comment>
+ <comment xml:lang="nb">Dia-diagram</comment>
+ <comment xml:lang="ms">Diagram Dia</comment>
+ <comment xml:lang="lv">Dia diagramma</comment>
+ <comment xml:lang="lt">Dia diagrama</comment>
+ <comment xml:lang="ko">Dia 다이어그램</comment>
+ <comment xml:lang="kk">Dia диаграммасы</comment>
+ <comment xml:lang="ka">Dia-ის დიაგრამა</comment>
+ <comment xml:lang="ja">Dia ダイアグラム</comment>
+ <comment xml:lang="it">Diagramma Dia</comment>
+ <comment xml:lang="is">Dia teikning</comment>
+ <comment xml:lang="id">Diagram Dia</comment>
+ <comment xml:lang="ia">Diagramma Dia</comment>
+ <comment xml:lang="hu">Dia-diagram</comment>
+ <comment xml:lang="hr">Dia dijagram</comment>
+ <comment xml:lang="he">גרף של Dia</comment>
+ <comment xml:lang="gl">diagrama de Dia</comment>
+ <comment xml:lang="ga">léaráid Dia</comment>
+ <comment xml:lang="fur">diagram Dia</comment>
+ <comment xml:lang="fr">diagramme Dia</comment>
+ <comment xml:lang="fo">Dia ritmynd</comment>
+ <comment xml:lang="fi">Dia-kaavio</comment>
+ <comment xml:lang="eu">Dia diagrama</comment>
+ <comment xml:lang="es">diagrama de Dia</comment>
+ <comment xml:lang="eo">Dia-diagramo</comment>
+ <comment xml:lang="en_GB">Dia diagram</comment>
+ <comment xml:lang="el">Διάγραμμα Dia</comment>
+ <comment xml:lang="de">Dia-Diagramm</comment>
+ <comment xml:lang="da">Dia-diagram</comment>
+ <comment xml:lang="cy">Diagram Dia</comment>
+ <comment xml:lang="cs">diagram Dia</comment>
+ <comment xml:lang="ca">diagrama de Dia</comment>
+ <comment xml:lang="bg">Диаграма — Dia</comment>
+ <comment xml:lang="be@latin">Dyjahrama Dia</comment>
+ <comment xml:lang="be">дыяграма Dia</comment>
+ <comment xml:lang="az">Dia diaqramı</comment>
+ <comment xml:lang="ar">خطاطة Dia</comment>
+ <comment xml:lang="af">Dia-diagram</comment>
<generic-icon name="image-x-generic"/>
<sub-class-of type="application/xml"/>
<glob pattern="*.dia"/>
- <magic priority="50">
+ <magic>
<match offset="5:100" type="string" value="&lt;dia:"/>
</magic>
<root-XML namespaceURI="http://www.lysator.liu.se/~alla/dia/" localName="diagram"/>
</mime-type>
<mime-type type="application/x-dia-shape">
<comment>Dia shape</comment>
- <comment xml:lang="af">Dia-vorm</comment>
- <comment xml:lang="ar">شكل Dia</comment>
- <comment xml:lang="bg">Фигура — Dia</comment>
- <comment xml:lang="ca">forma de Dia</comment>
- <comment xml:lang="cs">symboly Dia</comment>
- <comment xml:lang="da">Dia-figur</comment>
- <comment xml:lang="de">Dia-Form</comment>
- <comment xml:lang="el">Σχήμα Dia</comment>
- <comment xml:lang="en-GB">Dia shape</comment>
- <comment xml:lang="es">forma de Dia</comment>
- <comment xml:lang="eu">Dia-ren forma</comment>
- <comment xml:lang="fi">Dia-muoto</comment>
- <comment xml:lang="fo">Dia skapur</comment>
- <comment xml:lang="fr">forme Dia</comment>
- <comment xml:lang="fur">sagome Dia</comment>
- <comment xml:lang="ga">cruth Dia</comment>
- <comment xml:lang="gl">forma de Dia</comment>
- <comment xml:lang="he">צורה של Dia</comment>
- <comment xml:lang="hr">Dia oblik</comment>
- <comment xml:lang="hu">Dia alakzat</comment>
- <comment xml:lang="ia">Forma Dia</comment>
- <comment xml:lang="id">Shape Dia</comment>
- <comment xml:lang="it">Sagoma Dia</comment>
- <comment xml:lang="ja">Dia 図形</comment>
- <comment xml:lang="kk">Dia сызбасы</comment>
- <comment xml:lang="ko">Dia 그림</comment>
- <comment xml:lang="lt">Dia forma</comment>
- <comment xml:lang="lv">Dia forma</comment>
- <comment xml:lang="nl">Diavorm</comment>
- <comment xml:lang="oc">forma Dia</comment>
- <comment xml:lang="pl">Kształt Dia</comment>
- <comment xml:lang="pt">forma Dia</comment>
- <comment xml:lang="pt-BR">Formato Dia</comment>
- <comment xml:lang="ro">Figură Dia</comment>
- <comment xml:lang="ru">Фигура Dia</comment>
- <comment xml:lang="sk">Tvar Dia</comment>
- <comment xml:lang="sl">Datoteka oblik Dia</comment>
- <comment xml:lang="sr">облик Дие</comment>
- <comment xml:lang="sv">Dia-figur</comment>
- <comment xml:lang="tr">Dia şekli</comment>
+ <comment xml:lang="zh_TW">Dia 形狀</comment>
+ <comment xml:lang="zh_CN">Dia 形状</comment>
<comment xml:lang="uk">форма Dia</comment>
- <comment xml:lang="zh-CN">Dia 形状</comment>
- <comment xml:lang="zh-TW">Dia 形狀</comment>
+ <comment xml:lang="tr">Dia şekli</comment>
+ <comment xml:lang="sv">Dia-figur</comment>
+ <comment xml:lang="sr">облик Дие</comment>
+ <comment xml:lang="sq">formë Dia</comment>
+ <comment xml:lang="sl">Datoteka oblik Dia</comment>
+ <comment xml:lang="si">Dia හැඩය</comment>
+ <comment xml:lang="sk">Tvar Dia</comment>
+ <comment xml:lang="ru">Фигура Dia</comment>
+ <comment xml:lang="ro">Figură Dia</comment>
+ <comment xml:lang="pt_BR">Formato Dia</comment>
+ <comment xml:lang="pt">forma Dia</comment>
+ <comment xml:lang="pl">Kształt Dia</comment>
+ <comment xml:lang="oc">forma Dia</comment>
+ <comment xml:lang="nl">Diavorm</comment>
+ <comment xml:lang="lv">Dia forma</comment>
+ <comment xml:lang="lt">Dia forma</comment>
+ <comment xml:lang="ko">Dia 그림</comment>
+ <comment xml:lang="kk">Dia сызбасы</comment>
+ <comment xml:lang="ja">Dia 図形</comment>
+ <comment xml:lang="it">Sagoma Dia</comment>
+ <comment xml:lang="is">Dia lögun</comment>
+ <comment xml:lang="id">Shape Dia</comment>
+ <comment xml:lang="ia">Forma Dia</comment>
+ <comment xml:lang="hu">Dia alakzat</comment>
+ <comment xml:lang="hr">Dia oblik</comment>
+ <comment xml:lang="he">צורה של Dia</comment>
+ <comment xml:lang="gl">forma de Dia</comment>
+ <comment xml:lang="ga">cruth Dia</comment>
+ <comment xml:lang="fur">sagome Dia</comment>
+ <comment xml:lang="fr">forme Dia</comment>
+ <comment xml:lang="fo">Dia skapur</comment>
+ <comment xml:lang="fi">Dia-muoto</comment>
+ <comment xml:lang="eu">Dia-ren forma</comment>
+ <comment xml:lang="es">forma de Dia</comment>
+ <comment xml:lang="en_GB">Dia shape</comment>
+ <comment xml:lang="el">Σχήμα Dia</comment>
+ <comment xml:lang="de">Dia-Form</comment>
+ <comment xml:lang="da">Dia-figur</comment>
+ <comment xml:lang="cs">symboly Dia</comment>
+ <comment xml:lang="ca">forma de Dia</comment>
+ <comment xml:lang="bg">Фигура — Dia</comment>
+ <comment xml:lang="be">фігура Dia</comment>
+ <comment xml:lang="ar">شكل Dia</comment>
+ <comment xml:lang="af">Dia-vorm</comment>
<generic-icon name="image-x-generic"/>
<sub-class-of type="application/xml"/>
<glob pattern="*.shape"/>
- <magic priority="50">
+ <magic>
<match offset="5:100" type="string" value="&lt;shape"/>
</magic>
<root-XML namespaceURI="http://www.daa.com.au/~james/dia-shape-ns" localName="shape"/>
</mime-type>
<mime-type type="application/x-dvi">
<comment>TeX DVI document</comment>
- <comment xml:lang="af">TeX DVI-dokument</comment>
- <comment xml:lang="ar">مستند TeX DVI</comment>
- <comment xml:lang="ast">Documentu Tex DVI</comment>
- <comment xml:lang="be-Latn">Dakument TeX DVI</comment>
- <comment xml:lang="bg">Документ — TeX DVI</comment>
- <comment xml:lang="ca">document DVI de TeX</comment>
- <comment xml:lang="cs">dokument TeX DVI</comment>
- <comment xml:lang="da">TeX DVI-dokument</comment>
- <comment xml:lang="de">TeX-DVI-Dokument</comment>
- <comment xml:lang="el">Έγγραφο TeX DVI</comment>
- <comment xml:lang="en-GB">TeX DVI document</comment>
- <comment xml:lang="eo">DVI-dokumento de TeX</comment>
- <comment xml:lang="es">documento TeX DVI</comment>
- <comment xml:lang="eu">TeX DVI dokumentua</comment>
- <comment xml:lang="fi">TeX DVI -asiakirja</comment>
- <comment xml:lang="fo">TeX DVI skjal</comment>
- <comment xml:lang="fr">document TeX DVI</comment>
- <comment xml:lang="fur">document DVI TeX</comment>
- <comment xml:lang="ga">cáipéis DVI TeX</comment>
- <comment xml:lang="gl">documento TeX DVI</comment>
- <comment xml:lang="he">מסמך מסוג TeX DVI</comment>
- <comment xml:lang="hr">TeX DVI dokument</comment>
- <comment xml:lang="hu">TeX DVI-dokumentum</comment>
- <comment xml:lang="ia">Documento TeX DVI</comment>
- <comment xml:lang="id">Dokumen TeX DVI</comment>
- <comment xml:lang="it">Documento TeX DVI</comment>
- <comment xml:lang="ja">TeX DVI ドキュメント</comment>
- <comment xml:lang="kk">TeX DVI құжаты</comment>
- <comment xml:lang="ko">TeX DVI 문서</comment>
- <comment xml:lang="lt">TeX DVI dokumentas</comment>
- <comment xml:lang="lv">TeX DVI dokuments</comment>
- <comment xml:lang="ms">Dokumen TeX DVI</comment>
- <comment xml:lang="nb">TeX DVI-dokument</comment>
- <comment xml:lang="nl">TeX DVI-document</comment>
- <comment xml:lang="nn">TeX DVI-dokument</comment>
- <comment xml:lang="oc">document TeX DVI</comment>
- <comment xml:lang="pl">Dokument TeX DVI</comment>
- <comment xml:lang="pt">documento TeX DVI</comment>
- <comment xml:lang="pt-BR">Documento DVI TeX</comment>
- <comment xml:lang="ro">Document Tex DVI</comment>
- <comment xml:lang="ru">Документ TeX DVI</comment>
- <comment xml:lang="sk">Dokument TeX DVI</comment>
- <comment xml:lang="sl">Dokument TeX DVI</comment>
- <comment xml:lang="sq">Dokument TeX DVI</comment>
- <comment xml:lang="sr">ТеКс ДВИ документ</comment>
- <comment xml:lang="sv">TeX DVI-dokument</comment>
- <comment xml:lang="tr">TeX DVI belgesi</comment>
- <comment xml:lang="uk">документ TeX DVI</comment>
+ <comment xml:lang="zh_TW">TeX DVI 文件</comment>
+ <comment xml:lang="zh_CN">TeX DVI 文档</comment>
<comment xml:lang="vi">Tài liệu DVI Tex</comment>
- <comment xml:lang="zh-CN">TeX DVI 文档</comment>
- <comment xml:lang="zh-TW">TeX DVI 文件</comment>
+ <comment xml:lang="uk">документ TeX DVI</comment>
+ <comment xml:lang="tr">TeX DVI belgesi</comment>
+ <comment xml:lang="sv">TeX DVI-dokument</comment>
+ <comment xml:lang="sr">ТеКс ДВИ документ</comment>
+ <comment xml:lang="sq">dokument TeX DVI</comment>
+ <comment xml:lang="sl">Dokument TeX DVI</comment>
+ <comment xml:lang="si">TeX DVI ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument TeX DVI</comment>
+ <comment xml:lang="ru">Документ DVI издательской системы TeX</comment>
+ <comment xml:lang="ro">Document Tex DVI</comment>
+ <comment xml:lang="pt_BR">Documento DVI TeX</comment>
+ <comment xml:lang="pt">documento TeX DVI</comment>
+ <comment xml:lang="pl">Dokument TeX DVI</comment>
+ <comment xml:lang="oc">document TeX DVI</comment>
+ <comment xml:lang="nn">TeX DVI-dokument</comment>
+ <comment xml:lang="nl">TeX DVI-document</comment>
+ <comment xml:lang="nb">TeX DVI-dokument</comment>
+ <comment xml:lang="ms">Dokumen TeX DVI</comment>
+ <comment xml:lang="lv">TeX DVI dokuments</comment>
+ <comment xml:lang="lt">TeX DVI dokumentas</comment>
+ <comment xml:lang="ko">TeX DVI 문서</comment>
+ <comment xml:lang="kk">TeX DVI құжаты</comment>
+ <comment xml:lang="ja">TeX DVI ドキュメント</comment>
+ <comment xml:lang="it">Documento TeX DVI</comment>
+ <comment xml:lang="is">TeX DVI skjal</comment>
+ <comment xml:lang="id">Dokumen TeX DVI</comment>
+ <comment xml:lang="ia">Documento TeX DVI</comment>
+ <comment xml:lang="hu">TeX DVI-dokumentum</comment>
+ <comment xml:lang="hr">TeX DVI dokument</comment>
+ <comment xml:lang="he">מסמך מסוג TeX DVI</comment>
+ <comment xml:lang="gl">documento TeX DVI</comment>
+ <comment xml:lang="ga">cáipéis DVI TeX</comment>
+ <comment xml:lang="fur">document DVI TeX</comment>
+ <comment xml:lang="fr">document TeX DVI</comment>
+ <comment xml:lang="fo">TeX DVI skjal</comment>
+ <comment xml:lang="fi">TeX DVI -asiakirja</comment>
+ <comment xml:lang="eu">TeX DVI dokumentua</comment>
+ <comment xml:lang="es">documento TeX DVI</comment>
+ <comment xml:lang="eo">DVI-dokumento de TeX</comment>
+ <comment xml:lang="en_GB">TeX DVI document</comment>
+ <comment xml:lang="el">Έγγραφο TeX DVI</comment>
+ <comment xml:lang="de">TeX-DVI-Dokument</comment>
+ <comment xml:lang="da">TeX DVI-dokument</comment>
+ <comment xml:lang="cs">dokument TeX DVI</comment>
+ <comment xml:lang="ca">document DVI de TeX</comment>
+ <comment xml:lang="bg">Документ — TeX DVI</comment>
+ <comment xml:lang="be@latin">Dakument TeX DVI</comment>
+ <comment xml:lang="be">дакумент TeX DVI</comment>
+ <comment xml:lang="ast">Documentu Tex DVI</comment>
+ <comment xml:lang="ar">مستند TeX DVI</comment>
+ <comment xml:lang="af">TeX DVI-dokument</comment>
<acronym>DVI</acronym>
<expanded-acronym>Device independent file format</expanded-acronym>
<generic-icon name="x-office-document"/>
- <magic priority="50">
+ <magic>
<match type="little16" value="0x02f7" offset="0"/>
</magic>
<glob pattern="*.dvi"/>
</mime-type>
<mime-type type="application/x-e-theme">
<comment>Enlightenment theme</comment>
- <comment xml:lang="af">Enlightenment-tema</comment>
- <comment xml:lang="ar">سمة Enlightenment</comment>
- <comment xml:lang="az">Enlightenment örtüyü</comment>
- <comment xml:lang="be-Latn">Matyŭ Enlightenment</comment>
- <comment xml:lang="bg">Тема — Enlightenment</comment>
- <comment xml:lang="ca">tema d'Enlightenment</comment>
- <comment xml:lang="cs">motiv Enlightenment</comment>
- <comment xml:lang="cy">Thema Enlightenment</comment>
- <comment xml:lang="da">Enlightenmenttema</comment>
- <comment xml:lang="de">Enlightenment-Thema</comment>
- <comment xml:lang="el">Θέμα Enlightenment</comment>
- <comment xml:lang="en-GB">Enlightenment theme</comment>
- <comment xml:lang="eo">etoso de Enlightenment</comment>
- <comment xml:lang="es">tema de Enlightenment</comment>
- <comment xml:lang="eu">Enlightenment gaia</comment>
- <comment xml:lang="fi">Enlightenment-teema</comment>
- <comment xml:lang="fo">Enlightenment tema</comment>
- <comment xml:lang="fr">thème Enlightenment</comment>
- <comment xml:lang="fur">teme di Enlightenment</comment>
- <comment xml:lang="ga">téama Enlightenment</comment>
- <comment xml:lang="gl">tema de Enlightenment</comment>
- <comment xml:lang="he">ערכת נושא של Enlightenment</comment>
- <comment xml:lang="hr">Enlightenment tema</comment>
- <comment xml:lang="hu">Enlightenment-téma</comment>
- <comment xml:lang="ia">Thema de Enlightenment</comment>
- <comment xml:lang="id">Tema Enlightenment</comment>
- <comment xml:lang="it">Tema Enlightenment</comment>
- <comment xml:lang="ja">Enlightenment テーマ</comment>
- <comment xml:lang="ka">Enlightenment-ის თემა</comment>
- <comment xml:lang="kk">Enlightenment темасы</comment>
- <comment xml:lang="ko">인라이튼먼트 테마</comment>
- <comment xml:lang="lt">Enlightenment tema</comment>
- <comment xml:lang="lv">Enlightenment motīvs</comment>
- <comment xml:lang="ms">Tema Enlightenment</comment>
- <comment xml:lang="nb">Enlightenment tema</comment>
- <comment xml:lang="nl">Enlightenment-thema</comment>
- <comment xml:lang="nn">Enlightenment-tema</comment>
- <comment xml:lang="oc">tèma Enlightenment</comment>
- <comment xml:lang="pl">Motyw Enlightenment</comment>
- <comment xml:lang="pt">tema Enlightenment</comment>
- <comment xml:lang="pt-BR">Tema do Enlightenment</comment>
- <comment xml:lang="ro">Temă Enlightenment</comment>
- <comment xml:lang="ru">Тема Enlightenment</comment>
- <comment xml:lang="sk">Motív Enlightenment</comment>
- <comment xml:lang="sl">Datoteka teme Enlightenment</comment>
- <comment xml:lang="sq">Tema Enlightenment</comment>
- <comment xml:lang="sr">тема за Енлајтмент</comment>
- <comment xml:lang="sv">Enlightenment-tema</comment>
- <comment xml:lang="tr">Enlightenment teması</comment>
- <comment xml:lang="uk">тема Enlightenment</comment>
+ <comment xml:lang="zh_TW">Enlightenment 佈景主題</comment>
+ <comment xml:lang="zh_CN">Enlightenment 主题</comment>
<comment xml:lang="vi">Sắc thái Enlightenment</comment>
- <comment xml:lang="zh-CN">Enlightenment 主题</comment>
- <comment xml:lang="zh-TW">Enlightenment 佈景主題</comment>
+ <comment xml:lang="uk">тема Enlightenment</comment>
+ <comment xml:lang="tr">Enlightenment teması</comment>
+ <comment xml:lang="sv">Enlightenment-tema</comment>
+ <comment xml:lang="sr">тема за Енлајтмент</comment>
+ <comment xml:lang="sq">temë Enlightenment</comment>
+ <comment xml:lang="sl">Datoteka teme Enlightenment</comment>
+ <comment xml:lang="si">බුද්ධත්වයේ තේමාව</comment>
+ <comment xml:lang="sk">Motív Enlightenment</comment>
+ <comment xml:lang="ru">Тема Enlightenment</comment>
+ <comment xml:lang="ro">Temă Enlightenment</comment>
+ <comment xml:lang="pt_BR">Tema do Enlightenment</comment>
+ <comment xml:lang="pt">tema Enlightenment</comment>
+ <comment xml:lang="pl">Motyw Enlightenment</comment>
+ <comment xml:lang="oc">tèma Enlightenment</comment>
+ <comment xml:lang="nn">Enlightenment-tema</comment>
+ <comment xml:lang="nl">Enlightenment-thema</comment>
+ <comment xml:lang="nb">Enlightenment tema</comment>
+ <comment xml:lang="ms">Tema Enlightenment</comment>
+ <comment xml:lang="lv">Enlightenment motīvs</comment>
+ <comment xml:lang="lt">Enlightenment tema</comment>
+ <comment xml:lang="ko">인라이튼먼트 테마</comment>
+ <comment xml:lang="kk">Enlightenment темасы</comment>
+ <comment xml:lang="ka">Enlightenment-ის თემა</comment>
+ <comment xml:lang="ja">Enlightenment テーマ</comment>
+ <comment xml:lang="it">Tema Enlightenment</comment>
+ <comment xml:lang="is">Enlightenment þema</comment>
+ <comment xml:lang="id">Tema Enlightenment</comment>
+ <comment xml:lang="ia">Thema de Enlightenment</comment>
+ <comment xml:lang="hu">Enlightenment-téma</comment>
+ <comment xml:lang="hr">Enlightenment tema</comment>
+ <comment xml:lang="he">ערכת נושא של Enlightenment</comment>
+ <comment xml:lang="gl">tema de Enlightenment</comment>
+ <comment xml:lang="ga">téama Enlightenment</comment>
+ <comment xml:lang="fur">teme di Enlightenment</comment>
+ <comment xml:lang="fr">thème Enlightenment</comment>
+ <comment xml:lang="fo">Enlightenment tema</comment>
+ <comment xml:lang="fi">Enlightenment-teema</comment>
+ <comment xml:lang="eu">Enlightenment gaia</comment>
+ <comment xml:lang="es">tema de Enlightenment</comment>
+ <comment xml:lang="eo">etoso de Enlightenment</comment>
+ <comment xml:lang="en_GB">Enlightenment theme</comment>
+ <comment xml:lang="el">Θέμα Enlightenment</comment>
+ <comment xml:lang="de">Enlightenment-Thema</comment>
+ <comment xml:lang="da">Enlightenmenttema</comment>
+ <comment xml:lang="cy">Thema Enlightenment</comment>
+ <comment xml:lang="cs">motiv Enlightenment</comment>
+ <comment xml:lang="ca">tema d'Enlightenment</comment>
+ <comment xml:lang="bg">Тема — Enlightenment</comment>
+ <comment xml:lang="be@latin">Matyŭ Enlightenment</comment>
+ <comment xml:lang="be">тэма Enlightenment</comment>
+ <comment xml:lang="az">Enlightenment örtüyü</comment>
+ <comment xml:lang="ar">سمة Enlightenment</comment>
+ <comment xml:lang="af">Enlightenment-tema</comment>
<glob pattern="*.etheme"/>
</mime-type>
<mime-type type="application/x-egon">
<comment>Egon Animator animation</comment>
- <comment xml:lang="ar">تحريكة محرك Egon</comment>
- <comment xml:lang="be-Latn">Animacyja Egon Animator</comment>
- <comment xml:lang="bg">Анимация — Egon Animator</comment>
- <comment xml:lang="ca">animació d'Egon Animator</comment>
- <comment xml:lang="cs">animace Egon Animator</comment>
- <comment xml:lang="da">Egon Animator-animation</comment>
- <comment xml:lang="de">Egon-Animator-Animation</comment>
- <comment xml:lang="el">Κινούμενο σχέδιο Egon Animator</comment>
- <comment xml:lang="en-GB">Egon Animator animation</comment>
- <comment xml:lang="eo">animacio de Egon Animator</comment>
- <comment xml:lang="es">animación de Egon Animator</comment>
- <comment xml:lang="eu">Egon Animator-eko animazioa</comment>
- <comment xml:lang="fi">Egon Animator -animaatio</comment>
- <comment xml:lang="fo">Egon Animator teknimyndagerð</comment>
- <comment xml:lang="fr">animation Egon Animator</comment>
- <comment xml:lang="fur">animazion Egon Animator</comment>
- <comment xml:lang="ga">beochan Egon Animator</comment>
- <comment xml:lang="gl">animación de Egon Animator</comment>
- <comment xml:lang="he">אנימצייה של Egon Animator</comment>
- <comment xml:lang="hr">Egon Animator animacija</comment>
- <comment xml:lang="hu">Egon Animator-animáció</comment>
- <comment xml:lang="ia">Imagine Egon Animator</comment>
- <comment xml:lang="id">Animasi Egon Animator</comment>
- <comment xml:lang="it">Animazione Egon Animator</comment>
- <comment xml:lang="ja">Egon Animator アニメーション</comment>
- <comment xml:lang="ka">Egon Animator-ის ანიმაცია</comment>
- <comment xml:lang="kk">Egon Animator анимациясы</comment>
- <comment xml:lang="ko">Egon 애니메이터 애니메이션</comment>
- <comment xml:lang="lt">Egon Animator animacija</comment>
- <comment xml:lang="lv">Egon Animator animācija</comment>
- <comment xml:lang="ms">Animasi Egon Animator</comment>
- <comment xml:lang="nb">Egon animator-animasjon</comment>
- <comment xml:lang="nl">Egon Animator-animatie</comment>
- <comment xml:lang="nn">Egon Animator-animasjon</comment>
- <comment xml:lang="oc">animacion Egon Animator</comment>
- <comment xml:lang="pl">Animacja Egon Animator</comment>
- <comment xml:lang="pt">animação Egon Animator</comment>
- <comment xml:lang="pt-BR">Animação do Egon Animator</comment>
- <comment xml:lang="ro">Animație Egon Animator</comment>
- <comment xml:lang="ru">Анимация Egon Animator</comment>
- <comment xml:lang="sk">Animácia Egon Animator</comment>
- <comment xml:lang="sl">Datoteka animacije Egon Animator</comment>
- <comment xml:lang="sq">Animim Egon Animator</comment>
- <comment xml:lang="sr">анимација Егон аниматора</comment>
- <comment xml:lang="sv">Egon Animator-animering</comment>
- <comment xml:lang="tr">Egon Animator canlandırması</comment>
- <comment xml:lang="uk">анімація Egon Animator</comment>
+ <comment xml:lang="zh_TW">Egon Animator 動畫</comment>
+ <comment xml:lang="zh_CN">Egon Animator 动画</comment>
<comment xml:lang="vi">Hoạt ảnh Egon Animator</comment>
- <comment xml:lang="zh-CN">Egon Animator 动画</comment>
- <comment xml:lang="zh-TW">Egon Animator 動畫</comment>
+ <comment xml:lang="uk">анімація Egon Animator</comment>
+ <comment xml:lang="tr">Egon Animator canlandırması</comment>
+ <comment xml:lang="sv">Egon Animator-animering</comment>
+ <comment xml:lang="sr">анимација Егон аниматора</comment>
+ <comment xml:lang="sq">animacion Egon Animator</comment>
+ <comment xml:lang="sl">Datoteka animacije Egon Animator</comment>
+ <comment xml:lang="si">Egon Animator සජීවිකරණය</comment>
+ <comment xml:lang="sk">Animácia Egon Animator</comment>
+ <comment xml:lang="ru">Анимация Egon Animator</comment>
+ <comment xml:lang="ro">Animație Egon Animator</comment>
+ <comment xml:lang="pt_BR">Animação do Egon Animator</comment>
+ <comment xml:lang="pt">animação Egon Animator</comment>
+ <comment xml:lang="pl">Animacja Egon Animator</comment>
+ <comment xml:lang="oc">animacion Egon Animator</comment>
+ <comment xml:lang="nn">Egon Animator-animasjon</comment>
+ <comment xml:lang="nl">Egon Animator-animatie</comment>
+ <comment xml:lang="nb">Egon animator-animasjon</comment>
+ <comment xml:lang="ms">Animasi Egon Animator</comment>
+ <comment xml:lang="lv">Egon Animator animācija</comment>
+ <comment xml:lang="lt">Egon Animator animacija</comment>
+ <comment xml:lang="ko">Egon 애니메이터 애니메이션</comment>
+ <comment xml:lang="kk">Egon Animator анимациясы</comment>
+ <comment xml:lang="ka">Egon Animator-ის ანიმაცია</comment>
+ <comment xml:lang="ja">Egon Animator アニメーション</comment>
+ <comment xml:lang="it">Animazione Egon Animator</comment>
+ <comment xml:lang="is">Egon Animator hreyfimynd</comment>
+ <comment xml:lang="id">Animasi Egon Animator</comment>
+ <comment xml:lang="ia">Imagine Egon Animator</comment>
+ <comment xml:lang="hu">Egon Animator-animáció</comment>
+ <comment xml:lang="hr">Egon Animator animacija</comment>
+ <comment xml:lang="he">אנימצייה של Egon Animator</comment>
+ <comment xml:lang="gl">animación de Egon Animator</comment>
+ <comment xml:lang="ga">beochan Egon Animator</comment>
+ <comment xml:lang="fur">animazion Egon Animator</comment>
+ <comment xml:lang="fr">animation Egon Animator</comment>
+ <comment xml:lang="fo">Egon Animator teknimyndagerð</comment>
+ <comment xml:lang="fi">Egon Animator -animaatio</comment>
+ <comment xml:lang="eu">Egon Animator-eko animazioa</comment>
+ <comment xml:lang="es">animación de Egon Animator</comment>
+ <comment xml:lang="eo">animacio de Egon Animator</comment>
+ <comment xml:lang="en_GB">Egon Animator animation</comment>
+ <comment xml:lang="el">Κινούμενο σχέδιο Egon Animator</comment>
+ <comment xml:lang="de">Egon-Animator-Animation</comment>
+ <comment xml:lang="da">Egon Animator-animation</comment>
+ <comment xml:lang="cs">animace Egon Animator</comment>
+ <comment xml:lang="ca">animació d'Egon Animator</comment>
+ <comment xml:lang="bg">Анимация — Egon Animator</comment>
+ <comment xml:lang="be@latin">Animacyja Egon Animator</comment>
+ <comment xml:lang="be">анімацыя Egon Animator</comment>
+ <comment xml:lang="ar">تحريكة محرك Egon</comment>
<generic-icon name="image-x-generic"/>
<glob pattern="*.egon"/>
</mime-type>
<mime-type type="application/x-executable">
- <comment>executable</comment>
- <comment xml:lang="af">uitvoerbaar</comment>
- <comment xml:lang="ar">تنفيذي</comment>
- <comment xml:lang="be-Latn">vykonvalny fajł</comment>
- <comment xml:lang="bg">Изпълним файл</comment>
- <comment xml:lang="ca">executable</comment>
- <comment xml:lang="cs">spustitelný soubor</comment>
- <comment xml:lang="da">kørbar</comment>
- <comment xml:lang="de">Programm</comment>
- <comment xml:lang="el">Εκτελέσιμο</comment>
- <comment xml:lang="en-GB">executable</comment>
- <comment xml:lang="eo">plenumebla</comment>
- <comment xml:lang="es">ejecutable</comment>
- <comment xml:lang="eu">exekutagarria</comment>
- <comment xml:lang="fi">suoritettava ohjelma</comment>
- <comment xml:lang="fo">inningarfør</comment>
- <comment xml:lang="fr">exécutable</comment>
- <comment xml:lang="fur">eseguibil</comment>
- <comment xml:lang="ga">comhad inrite</comment>
- <comment xml:lang="gl">executábel</comment>
- <comment xml:lang="he">קובץ הרצה</comment>
- <comment xml:lang="hr">Izvršna datoteka</comment>
- <comment xml:lang="hu">futtatható</comment>
- <comment xml:lang="ia">Executabile</comment>
- <comment xml:lang="id">dapat dieksekusi</comment>
- <comment xml:lang="it">Eseguibile</comment>
- <comment xml:lang="ja">実行ファイル</comment>
- <comment xml:lang="kk">орындалатын</comment>
- <comment xml:lang="ko">실행 파일</comment>
- <comment xml:lang="lt">vykdomasis failas</comment>
- <comment xml:lang="lv">izpildāmais</comment>
- <comment xml:lang="ms">Bolehlaksana</comment>
- <comment xml:lang="nb">kjørbar</comment>
- <comment xml:lang="nl">uitvoerbaar bestand</comment>
- <comment xml:lang="nn">køyrbar</comment>
- <comment xml:lang="oc">executable</comment>
- <comment xml:lang="pl">Program</comment>
- <comment xml:lang="pt">executável</comment>
- <comment xml:lang="pt-BR">Executável</comment>
- <comment xml:lang="ro">executabil</comment>
- <comment xml:lang="ru">Исполняемый</comment>
- <comment xml:lang="sk">Spustiteľný súbor</comment>
- <comment xml:lang="sl">izvedljiva datoteka</comment>
- <comment xml:lang="sq">I ekzekutueshëm</comment>
- <comment xml:lang="sr">извршна</comment>
- <comment xml:lang="sv">körbar fil</comment>
- <comment xml:lang="tr">çalıştırılabilir</comment>
+ <comment>Executable</comment>
<comment xml:lang="uk">виконуваний файл</comment>
- <comment xml:lang="vi">thực hiện được</comment>
- <comment xml:lang="zh-CN">可执行文件</comment>
- <comment xml:lang="zh-TW">可執行檔</comment>
+ <comment xml:lang="sv">Körbar fil</comment>
+ <comment xml:lang="ru">Исполняемый</comment>
+ <comment xml:lang="pt_BR">Executável</comment>
+ <comment xml:lang="pl">Program</comment>
+ <comment xml:lang="it">Eseguibile</comment>
+ <comment xml:lang="gl">Executábel</comment>
+ <comment xml:lang="eu">Exekutagarria</comment>
+ <comment xml:lang="es">ejecutable</comment>
+ <comment xml:lang="de">Ausführbare Datei</comment>
+ <comment xml:lang="be">выконвальны файл</comment>
<generic-icon name="application-x-executable"/>
<magic priority="40">
<match type="string" value="\177ELF" offset="0">
@@ -11001,110 +11308,119 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-fluid">
<comment>FLTK Fluid file</comment>
- <comment xml:lang="af">FLTK Fluit-lêer</comment>
- <comment xml:lang="ar">ملف FLTK Fluid</comment>
- <comment xml:lang="be-Latn">Fajł FLTK Fluid</comment>
- <comment xml:lang="bg">Интерфейс — FLTK Fluid</comment>
- <comment xml:lang="ca">fitxer FLTK Fluid</comment>
- <comment xml:lang="cs">soubor FLTK Fluid</comment>
- <comment xml:lang="da">FLTK Fluid-fil</comment>
- <comment xml:lang="de">FLTK-Fluid-Datei</comment>
- <comment xml:lang="el">Αρχείο FLTK Fluid</comment>
- <comment xml:lang="en-GB">FLTK Fluid file</comment>
- <comment xml:lang="es">archivo FLTK Fluid</comment>
- <comment xml:lang="eu">FLTK Fluid fitxategia</comment>
- <comment xml:lang="fi">FLTK Fluid -tiedosto</comment>
- <comment xml:lang="fo">FLTK Fluid fíla</comment>
- <comment xml:lang="fr">fichier Fluid FLTK</comment>
- <comment xml:lang="fur">file FLTK Fluid</comment>
- <comment xml:lang="ga">comhad FLTK Fluid</comment>
- <comment xml:lang="gl">ficheiro FLTK Fluid</comment>
- <comment xml:lang="he">קובץ FLTK Fluid</comment>
- <comment xml:lang="hr">FLTK Fluid datoteka</comment>
- <comment xml:lang="hu">FLTK Fluid fájl</comment>
- <comment xml:lang="ia">File Fluid de FLTK</comment>
- <comment xml:lang="id">Berkas FLTK Fluid</comment>
- <comment xml:lang="it">File FLTK Fluid</comment>
- <comment xml:lang="ja">FLTK Fluid ファイル</comment>
- <comment xml:lang="ka">FLTK Fluid-ის ფაილი</comment>
- <comment xml:lang="kk">FLTK Fluid файлы</comment>
- <comment xml:lang="ko">FLTK Fluid 파일</comment>
- <comment xml:lang="lt">FLTK Fluid failas</comment>
- <comment xml:lang="lv">FLTK Fluid datne</comment>
- <comment xml:lang="nb">FLTK Fluid-fil</comment>
- <comment xml:lang="nl">FLTK FLUID-bestand</comment>
- <comment xml:lang="nn">FLTK Fluid-fil</comment>
- <comment xml:lang="oc">fichièr Fluid FLTK</comment>
- <comment xml:lang="pl">Plik Fluid FLTK</comment>
- <comment xml:lang="pt">ficheiro FLTK Fluid</comment>
- <comment xml:lang="pt-BR">Arquivo Fluid do FLTK</comment>
- <comment xml:lang="ro">Fișier FLTK Fluid</comment>
- <comment xml:lang="ru">Файл FLTK Fluid</comment>
- <comment xml:lang="sk">Súbor FLTK Fluid</comment>
- <comment xml:lang="sl">Datoteka FLTK Fluid</comment>
- <comment xml:lang="sq">File FLTK Fluid</comment>
- <comment xml:lang="sr">датотека ФЛТК Флуида</comment>
- <comment xml:lang="sv">FLTK Fluid-fil</comment>
- <comment xml:lang="tr">FLTK Fluid dosyası</comment>
- <comment xml:lang="uk">файл FLTK Fluid</comment>
+ <comment xml:lang="zh_TW">FLTK Fluid 檔</comment>
+ <comment xml:lang="zh_CN">FLTK 流体文档</comment>
<comment xml:lang="vi">Tập tin Fluid FLTK</comment>
- <comment xml:lang="zh-CN">FLTK 流体文档</comment>
- <comment xml:lang="zh-TW">FLTK Fluid 檔</comment>
+ <comment xml:lang="uk">файл FLTK Fluid</comment>
+ <comment xml:lang="tr">FLTK Fluid dosyası</comment>
+ <comment xml:lang="sv">FLTK Fluid-fil</comment>
+ <comment xml:lang="sr">датотека ФЛТК Флуида</comment>
+ <comment xml:lang="sq">kartelë FLTK Fluid</comment>
+ <comment xml:lang="sl">Datoteka FLTK Fluid</comment>
+ <comment xml:lang="si">FLTK තරල ගොනුව</comment>
+ <comment xml:lang="sk">Súbor FLTK Fluid</comment>
+ <comment xml:lang="ru">Файл FLTK Fluid</comment>
+ <comment xml:lang="ro">Fișier FLTK Fluid</comment>
+ <comment xml:lang="pt_BR">Arquivo Fluid do FLTK</comment>
+ <comment xml:lang="pt">ficheiro FLTK Fluid</comment>
+ <comment xml:lang="pl">Plik Fluid FLTK</comment>
+ <comment xml:lang="oc">fichièr Fluid FLTK</comment>
+ <comment xml:lang="nn">FLTK Fluid-fil</comment>
+ <comment xml:lang="nl">FLTK FLUID-bestand</comment>
+ <comment xml:lang="nb">FLTK Fluid-fil</comment>
+ <comment xml:lang="lv">FLTK Fluid datne</comment>
+ <comment xml:lang="lt">FLTK Fluid failas</comment>
+ <comment xml:lang="ko">FLTK Fluid 파일</comment>
+ <comment xml:lang="kk">FLTK Fluid файлы</comment>
+ <comment xml:lang="ka">FLTK Fluid-ის ფაილი</comment>
+ <comment xml:lang="ja">FLTK Fluid ファイル</comment>
+ <comment xml:lang="it">File FLTK Fluid</comment>
+ <comment xml:lang="is">FLTK Fluid skrá</comment>
+ <comment xml:lang="id">Berkas FLTK Fluid</comment>
+ <comment xml:lang="ia">File Fluid de FLTK</comment>
+ <comment xml:lang="hu">FLTK Fluid fájl</comment>
+ <comment xml:lang="hr">FLTK Fluid datoteka</comment>
+ <comment xml:lang="he">קובץ FLTK Fluid</comment>
+ <comment xml:lang="gl">ficheiro FLTK Fluid</comment>
+ <comment xml:lang="ga">comhad FLTK Fluid</comment>
+ <comment xml:lang="fur">file FLTK Fluid</comment>
+ <comment xml:lang="fr">fichier Fluid FLTK</comment>
+ <comment xml:lang="fo">FLTK Fluid fíla</comment>
+ <comment xml:lang="fi">FLTK Fluid -tiedosto</comment>
+ <comment xml:lang="eu">FLTK Fluid fitxategia</comment>
+ <comment xml:lang="es">archivo FLTK Fluid</comment>
+ <comment xml:lang="en_GB">FLTK Fluid file</comment>
+ <comment xml:lang="el">Αρχείο FLTK Fluid</comment>
+ <comment xml:lang="de">FLTK-Fluid-Datei</comment>
+ <comment xml:lang="da">FLTK Fluid-fil</comment>
+ <comment xml:lang="cs">soubor FLTK Fluid</comment>
+ <comment xml:lang="ca">fitxer FLTK Fluid</comment>
+ <comment xml:lang="bg">Интерфейс — FLTK Fluid</comment>
+ <comment xml:lang="be@latin">Fajł FLTK Fluid</comment>
+ <comment xml:lang="be">файл FLTK Fluid</comment>
+ <comment xml:lang="ar">ملف FLTK Fluid</comment>
+ <comment xml:lang="af">FLTK Fluit-lêer</comment>
<acronym>FLTK</acronym>
<expanded-acronym>Fast Light Toolkit</expanded-acronym>
<sub-class-of type="text/plain"/>
<generic-icon name="x-office-document"/>
- <magic priority="50">
+ <magic>
<match type="string" value="# data file for the Fltk" offset="0"/>
</magic>
<glob pattern="*.fl"/>
</mime-type>
<mime-type type="font/woff">
<comment>WOFF font</comment>
- <comment xml:lang="af">WOFF-skriftipe</comment>
- <comment xml:lang="ast">Fonte WOFF</comment>
- <comment xml:lang="bg">Шрифт — WOFF</comment>
- <comment xml:lang="ca">lletra WOFF</comment>
- <comment xml:lang="cs">font WOFF</comment>
- <comment xml:lang="da">WOFF-skrifttype</comment>
- <comment xml:lang="de">WOFF-Schrift</comment>
- <comment xml:lang="el">Γραμματοσειρά WOFF</comment>
- <comment xml:lang="en-GB">WOFF font</comment>
- <comment xml:lang="es">tipo de letra WOFF</comment>
- <comment xml:lang="eu">WOFF letra-tipoa</comment>
- <comment xml:lang="fi">WOFF-fontti</comment>
- <comment xml:lang="fr">police WOFF</comment>
- <comment xml:lang="fur">caratar WOFF</comment>
- <comment xml:lang="ga">cló WOFF</comment>
- <comment xml:lang="gl">Tipo de letra WOFF</comment>
- <comment xml:lang="he">גופן WOFF</comment>
- <comment xml:lang="hr">WOFF font</comment>
- <comment xml:lang="hu">WOFF-betűkészlet</comment>
- <comment xml:lang="ia">Typo de litteras WOFF</comment>
- <comment xml:lang="id">Fonta WOFF</comment>
- <comment xml:lang="it">Carattere WOFF</comment>
- <comment xml:lang="ja">WOFF フォント</comment>
- <comment xml:lang="kk">WOFF қарібі</comment>
- <comment xml:lang="ko">WOFF 글꼴</comment>
- <comment xml:lang="lt">WOFF šriftas</comment>
- <comment xml:lang="lv">WOFF fonts</comment>
- <comment xml:lang="oc">poliça WOFF</comment>
- <comment xml:lang="pl">Czcionka WOFF</comment>
- <comment xml:lang="pt">letra WOFF</comment>
- <comment xml:lang="pt-BR">Fonte WOFF</comment>
- <comment xml:lang="ru">Шрифт WOFF</comment>
- <comment xml:lang="sk">Písmo WOFF</comment>
- <comment xml:lang="sl">Pisava WOFF</comment>
- <comment xml:lang="sr">ВОФФ слова</comment>
- <comment xml:lang="sv">WOFF-typsnitt</comment>
- <comment xml:lang="tr">WOFF yazı tipi</comment>
+ <comment xml:lang="zh_TW">WOFF 字型</comment>
+ <comment xml:lang="zh_CN">WOFF 字体</comment>
<comment xml:lang="uk">шрифт WOFF</comment>
- <comment xml:lang="zh-CN">WOFF 字体</comment>
- <comment xml:lang="zh-TW">WOFF 字型</comment>
+ <comment xml:lang="tr">WOFF yazı tipi</comment>
+ <comment xml:lang="sv">WOFF-typsnitt</comment>
+ <comment xml:lang="sr">ВОФФ слова</comment>
+ <comment xml:lang="sq">shkronja WOFF</comment>
+ <comment xml:lang="sl">Pisava WOFF</comment>
+ <comment xml:lang="si">WOFF අකුරු</comment>
+ <comment xml:lang="sk">Písmo WOFF</comment>
+ <comment xml:lang="ru">Шрифт WOFF</comment>
+ <comment xml:lang="pt_BR">Fonte WOFF</comment>
+ <comment xml:lang="pt">letra WOFF</comment>
+ <comment xml:lang="pl">Czcionka WOFF</comment>
+ <comment xml:lang="oc">poliça WOFF</comment>
+ <comment xml:lang="nl">WOFF-lettertype</comment>
+ <comment xml:lang="lv">WOFF fonts</comment>
+ <comment xml:lang="lt">WOFF šriftas</comment>
+ <comment xml:lang="ko">WOFF 글꼴</comment>
+ <comment xml:lang="kk">WOFF қарібі</comment>
+ <comment xml:lang="ja">WOFF フォント</comment>
+ <comment xml:lang="it">Carattere WOFF</comment>
+ <comment xml:lang="is">WOFF letur</comment>
+ <comment xml:lang="id">Fonta WOFF</comment>
+ <comment xml:lang="ia">Typo de litteras WOFF</comment>
+ <comment xml:lang="hu">WOFF-betűkészlet</comment>
+ <comment xml:lang="hr">WOFF font</comment>
+ <comment xml:lang="he">גופן WOFF</comment>
+ <comment xml:lang="gl">Tipo de letra WOFF</comment>
+ <comment xml:lang="ga">cló WOFF</comment>
+ <comment xml:lang="fur">caratar WOFF</comment>
+ <comment xml:lang="fr">police WOFF</comment>
+ <comment xml:lang="fi">WOFF-fontti</comment>
+ <comment xml:lang="eu">WOFF letra-tipoa</comment>
+ <comment xml:lang="es">tipo de letra WOFF</comment>
+ <comment xml:lang="en_GB">WOFF font</comment>
+ <comment xml:lang="el">Γραμματοσειρά WOFF</comment>
+ <comment xml:lang="de">WOFF-Schrift</comment>
+ <comment xml:lang="da">WOFF-skrifttype</comment>
+ <comment xml:lang="cs">font WOFF</comment>
+ <comment xml:lang="ca">lletra WOFF</comment>
+ <comment xml:lang="bg">Шрифт — WOFF</comment>
+ <comment xml:lang="be">шрыфт WOFF</comment>
+ <comment xml:lang="ast">Fonte WOFF</comment>
+ <comment xml:lang="ar">خط WOFF</comment>
+ <comment xml:lang="af">WOFF-skriftipe</comment>
<acronym>WOFF</acronym>
<expanded-acronym>Web Open Font Format</expanded-acronym>
<generic-icon name="font-x-generic"/>
- <magic priority="50">
+ <magic>
<match type="big32" value="0x774f4646" offset="0"/>
</magic>
<glob pattern="*.woff"/>
@@ -11112,78 +11428,98 @@ command to generate the output files.
</mime-type>
<mime-type type="font/woff2">
<comment>WOFF2 font</comment>
- <comment xml:lang="af">WOFF2-skriftipe</comment>
- <comment xml:lang="ast">Fonte WOFF2</comment>
- <comment xml:lang="bg">Шрифт — WOFF2</comment>
- <comment xml:lang="ca">lletra WOFF2</comment>
- <comment xml:lang="cs">font WOFF2</comment>
- <comment xml:lang="da">WOFF2-skrifttype</comment>
- <comment xml:lang="de">WOFF2-Schrift</comment>
- <comment xml:lang="en-GB">WOFF2 font</comment>
- <comment xml:lang="es">tipo de letra WOFF2</comment>
- <comment xml:lang="eu">WOFF2 letra-tipoa</comment>
- <comment xml:lang="fi">WOFF2-fontti</comment>
- <comment xml:lang="fr">police WOFF2</comment>
- <comment xml:lang="fur">caratar WOFF2</comment>
- <comment xml:lang="ga">cló WOFF2</comment>
- <comment xml:lang="hr">WOFF2 font</comment>
- <comment xml:lang="hu">WOFF2 betűkészlet</comment>
- <comment xml:lang="id">Fonta WOFF2</comment>
- <comment xml:lang="it">Carattere WOFF2</comment>
- <comment xml:lang="kk">WOFF2 қарібі</comment>
- <comment xml:lang="ko">WOFF2 글꼴</comment>
- <comment xml:lang="lt">WOFF2 šriftas</comment>
- <comment xml:lang="pl">Czcionka WOFF2</comment>
- <comment xml:lang="pt">letra WOFF2</comment>
- <comment xml:lang="pt-BR">Fonte WOFF2</comment>
- <comment xml:lang="ru">Шрифт WOFF2</comment>
- <comment xml:lang="sk">Písmo WOFF2</comment>
- <comment xml:lang="sl">Pisava WOFF2</comment>
- <comment xml:lang="sv">WOFF2-typsnitt</comment>
- <comment xml:lang="tr">WOFF2 yazı tipi</comment>
+ <comment xml:lang="zh_TW">WOFF2 字型</comment>
+ <comment xml:lang="zh_CN">WOFF2 字体</comment>
<comment xml:lang="uk">шрифт WOFF2</comment>
- <comment xml:lang="zh-CN">WOFF2 字体</comment>
- <comment xml:lang="zh-TW">WOFF2 字型</comment>
+ <comment xml:lang="tr">WOFF2 yazı tipi</comment>
+ <comment xml:lang="sv">WOFF2-typsnitt</comment>
+ <comment xml:lang="sq">shkronja WOFF2</comment>
+ <comment xml:lang="sl">Pisava WOFF2</comment>
+ <comment xml:lang="si">WOFF2 අකුරු</comment>
+ <comment xml:lang="sk">Písmo WOFF2</comment>
+ <comment xml:lang="ru">Шрифт WOFF2</comment>
+ <comment xml:lang="pt_BR">Fonte WOFF2</comment>
+ <comment xml:lang="pt">letra WOFF2</comment>
+ <comment xml:lang="pl">Czcionka WOFF2</comment>
+ <comment xml:lang="oc">poliça WOFF2</comment>
+ <comment xml:lang="nl">WOFF2-lettertype</comment>
+ <comment xml:lang="lt">WOFF2 šriftas</comment>
+ <comment xml:lang="ko">WOFF2 글꼴</comment>
+ <comment xml:lang="kk">WOFF2 қарібі</comment>
+ <comment xml:lang="ja">WOFF2 フォント</comment>
+ <comment xml:lang="it">Carattere WOFF2</comment>
+ <comment xml:lang="is">WOFF2 letur</comment>
+ <comment xml:lang="id">Fonta WOFF2</comment>
+ <comment xml:lang="hu">WOFF2 betűkészlet</comment>
+ <comment xml:lang="hr">WOFF2 font</comment>
+ <comment xml:lang="he">גופן WOFF2</comment>
+ <comment xml:lang="gl">Tipo de letra WOFF2</comment>
+ <comment xml:lang="ga">cló WOFF2</comment>
+ <comment xml:lang="fur">caratar WOFF2</comment>
+ <comment xml:lang="fr">police WOFF2</comment>
+ <comment xml:lang="fi">WOFF2-fontti</comment>
+ <comment xml:lang="eu">WOFF2 letra-tipoa</comment>
+ <comment xml:lang="es">tipo de letra WOFF2</comment>
+ <comment xml:lang="en_GB">WOFF2 font</comment>
+ <comment xml:lang="de">WOFF2-Schrift</comment>
+ <comment xml:lang="da">WOFF2-skrifttype</comment>
+ <comment xml:lang="cs">font WOFF2</comment>
+ <comment xml:lang="ca">lletra WOFF2</comment>
+ <comment xml:lang="bg">Шрифт — WOFF2</comment>
+ <comment xml:lang="be">шрыфт WOFF 2</comment>
+ <comment xml:lang="ast">Fonte WOFF2</comment>
+ <comment xml:lang="ar">خط WOFF2</comment>
+ <comment xml:lang="af">WOFF2-skriftipe</comment>
<acronym>WOFF2</acronym>
<expanded-acronym>Web Open Font Format 2.0</expanded-acronym>
<generic-icon name="font-x-generic"/>
- <magic priority="50">
+ <magic>
<match type="big32" value="0x774f4632" offset="0"/>
</magic>
<glob pattern="*.woff2"/>
</mime-type>
<mime-type type="application/x-font-type1">
<comment>PostScript type-1 font</comment>
- <comment xml:lang="af">PostScript tipe 1-skriftipe</comment>
- <comment xml:lang="bg">Шрифт — PostScript type-1</comment>
- <comment xml:lang="ca">lletra type-1 de PostScript</comment>
- <comment xml:lang="cs">font PostScript type-1</comment>
- <comment xml:lang="da">PostScript type-1-skrifttype</comment>
- <comment xml:lang="de">PostScript-Typ-1-Schrift</comment>
- <comment xml:lang="en-GB">PostScript type-1 font</comment>
- <comment xml:lang="es">tipo de letra PostScript Type-1</comment>
- <comment xml:lang="eu">PostScript type-1 letra-tipoa</comment>
- <comment xml:lang="fi">PostScript type-1 -fontti</comment>
- <comment xml:lang="fr">police PostScript Type 1</comment>
- <comment xml:lang="fur">caratar PostScript type-1</comment>
- <comment xml:lang="ga">cló PostScript type-1</comment>
- <comment xml:lang="hr">PostScript type-1 font</comment>
- <comment xml:lang="hu">PostScript type-1 betűkészlet</comment>
- <comment xml:lang="id">Fonta PostScript type-1</comment>
- <comment xml:lang="it">Carattere PostScript type-1</comment>
- <comment xml:lang="kk">PostScript type-1 қарібі</comment>
- <comment xml:lang="ko">PostScript Type-1 글꼴</comment>
- <comment xml:lang="pl">Czcionka PostScript Type-1</comment>
- <comment xml:lang="pt">letra PostScript Tipo 1</comment>
- <comment xml:lang="pt-BR">Fonte PostScript tipo-1</comment>
- <comment xml:lang="ru">Шрифт PostScript Type-1</comment>
- <comment xml:lang="sk">Písmo PostScript typu 1</comment>
- <comment xml:lang="sr">слова Постскрипта врсте-1</comment>
- <comment xml:lang="sv">PostScript type-1-typsnitt</comment>
- <comment xml:lang="tr">PostScript tip-1 yazı tipi</comment>
+ <comment xml:lang="zh_TW">PostScript type-1 字型</comment>
+ <comment xml:lang="zh_CN">PostScript type-1 字体</comment>
<comment xml:lang="uk">шрифт type-1 PostScript</comment>
- <comment xml:lang="zh-CN">PostScript type-1 字体</comment>
- <comment xml:lang="zh-TW">PostScript type-1 字型</comment>
+ <comment xml:lang="tr">PostScript tip-1 yazı tipi</comment>
+ <comment xml:lang="sv">PostScript type-1-typsnitt</comment>
+ <comment xml:lang="sr">слова Постскрипта врсте-1</comment>
+ <comment xml:lang="sq">shkronja PostScript type-1</comment>
+ <comment xml:lang="sl">Datoteka pisave PostScript vrsta-1</comment>
+ <comment xml:lang="si">PostScript වර්ගය-1 අකුරු</comment>
+ <comment xml:lang="sk">Písmo PostScript typu 1</comment>
+ <comment xml:lang="ru">Шрифт PostScript Type-1</comment>
+ <comment xml:lang="pt_BR">Fonte PostScript tipo-1</comment>
+ <comment xml:lang="pt">letra PostScript Tipo 1</comment>
+ <comment xml:lang="pl">Czcionka PostScript Type-1</comment>
+ <comment xml:lang="nl">PostScript type-1-lettertype</comment>
+ <comment xml:lang="ko">PostScript Type-1 글꼴</comment>
+ <comment xml:lang="kk">PostScript type-1 қарібі</comment>
+ <comment xml:lang="ja">PostScript type-1 フォント</comment>
+ <comment xml:lang="it">Carattere PostScript type-1</comment>
+ <comment xml:lang="is">PostScript type-1 letur</comment>
+ <comment xml:lang="id">Fonta PostScript type-1</comment>
+ <comment xml:lang="hu">PostScript type-1 betűkészlet</comment>
+ <comment xml:lang="hr">PostScript type-1 font</comment>
+ <comment xml:lang="he">גופן PostScript type-1</comment>
+ <comment xml:lang="gl">Tipo de letra PostScript tipo 1</comment>
+ <comment xml:lang="ga">cló PostScript type-1</comment>
+ <comment xml:lang="fur">caratar PostScript type-1</comment>
+ <comment xml:lang="fr">police PostScript Type 1</comment>
+ <comment xml:lang="fi">PostScript type-1 -fontti</comment>
+ <comment xml:lang="eu">PostScript type-1 letra-tipoa</comment>
+ <comment xml:lang="es">tipo de letra PostScript Type-1</comment>
+ <comment xml:lang="en_GB">PostScript type-1 font</comment>
+ <comment xml:lang="de">PostScript-Typ-1-Schrift</comment>
+ <comment xml:lang="da">PostScript type-1-skrifttype</comment>
+ <comment xml:lang="cs">font PostScript type-1</comment>
+ <comment xml:lang="ca">lletra type-1 de PostScript</comment>
+ <comment xml:lang="bg">Шрифт — PostScript type-1</comment>
+ <comment xml:lang="be">шрыфт PostScript type-1</comment>
+ <comment xml:lang="ar">خط بوستسكربت النوع ١</comment>
+ <comment xml:lang="af">PostScript tipe 1-skriftipe</comment>
<sub-class-of type="application/postscript"/>
<generic-icon name="font-x-generic"/>
<magic priority="60">
@@ -11200,176 +11536,185 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-font-afm">
<comment>Adobe font metrics</comment>
- <comment xml:lang="af">Adobe skriftipe-afmetings</comment>
- <comment xml:lang="ar">مقاييس خط أدوبي</comment>
- <comment xml:lang="az">Adobe yazı növü metrikləri</comment>
- <comment xml:lang="be-Latn">Metryka šryftu Adobe</comment>
- <comment xml:lang="bg">Шрифтова метрика — Adobe</comment>
- <comment xml:lang="ca">mètrica de lletra d'Adobe</comment>
- <comment xml:lang="cs">metrika fontu Adobe</comment>
- <comment xml:lang="cy">Metrigau Ffont Adobe</comment>
- <comment xml:lang="da">Adobe skrifttypefil</comment>
- <comment xml:lang="de">Adobe-Schriftmetriken</comment>
- <comment xml:lang="el">Μετρικά γραμματοσειράς Adobe</comment>
- <comment xml:lang="en-GB">Adobe font metrics</comment>
- <comment xml:lang="eo">metrikoj de Adobe-tiparo</comment>
- <comment xml:lang="es">métricas tipográficas de Adobe</comment>
- <comment xml:lang="eu">Adobe letra-tipoen neurriak</comment>
- <comment xml:lang="fi">Adobe-fonttimitat</comment>
- <comment xml:lang="fr">métriques de police Adobe</comment>
- <comment xml:lang="fur">metrichis caratar Adobe</comment>
- <comment xml:lang="ga">meadarachtaí cló Adobe</comment>
- <comment xml:lang="gl">métricas de fonte de Adobe</comment>
- <comment xml:lang="he">מדדי גופן של Adobe</comment>
- <comment xml:lang="hr">Metrika Adobe fonta</comment>
- <comment xml:lang="hu">Adobe-betűmetrika</comment>
- <comment xml:lang="ia">Metricas de typo de litteras Adobe</comment>
- <comment xml:lang="id">Metrik fonta Adobe</comment>
- <comment xml:lang="it">Metriche tipo carattere Adobe</comment>
- <comment xml:lang="ja">Adobe フォントメトリック</comment>
- <comment xml:lang="kk">Adobe қаріп метрикалары</comment>
- <comment xml:lang="ko">Adobe 글꼴 메트릭</comment>
- <comment xml:lang="lt">Adobe šriftų metrika</comment>
- <comment xml:lang="lv">Adobe fonta metrika</comment>
- <comment xml:lang="ms">Metrik font Adobe</comment>
- <comment xml:lang="nb">Adobe skrifttypefil</comment>
- <comment xml:lang="nl">Adobe-lettertype-metrieken</comment>
- <comment xml:lang="nn">Adobe skrifttypemetrikk</comment>
- <comment xml:lang="oc">metricas de poliça Adobe</comment>
- <comment xml:lang="pl">Metryka czcionki Adobe</comment>
- <comment xml:lang="pt">métrica de letras Adobe</comment>
- <comment xml:lang="pt-BR">Métricas de fonte Adobe</comment>
- <comment xml:lang="ro">Dimensiuni font Adobe</comment>
- <comment xml:lang="ru">Метрика шрифта Adobe</comment>
- <comment xml:lang="sk">Metrika písma Adobe</comment>
- <comment xml:lang="sl">Matrika pisave Adobe</comment>
- <comment xml:lang="sq">Metrik lloj gërmash Adobe</comment>
- <comment xml:lang="sr">метрика Адобе слова</comment>
- <comment xml:lang="sv">Adobe-typsnittsmetrik</comment>
- <comment xml:lang="tr">Adobe yazı tipi ölçüleri</comment>
- <comment xml:lang="uk">метрики шрифту Adobe</comment>
+ <comment xml:lang="zh_TW">Adobe 字型描述檔</comment>
+ <comment xml:lang="zh_CN">Adobe 字体规格</comment>
<comment xml:lang="vi">Cách đo phông chữ Adobe</comment>
- <comment xml:lang="zh-CN">Adobe 字体规格</comment>
- <comment xml:lang="zh-TW">Adobe 字型描述檔</comment>
+ <comment xml:lang="uk">метрики шрифту Adobe</comment>
+ <comment xml:lang="tr">Adobe yazı tipi ölçüleri</comment>
+ <comment xml:lang="sv">Adobe-typsnittsmetrik</comment>
+ <comment xml:lang="sr">метрика Адобе слова</comment>
+ <comment xml:lang="sq">vlera shkronjash Adobe</comment>
+ <comment xml:lang="sl">Matrika pisave Adobe</comment>
+ <comment xml:lang="si">Adobe අකුරු මිතික</comment>
+ <comment xml:lang="sk">Metrika písma Adobe</comment>
+ <comment xml:lang="ru">Метрика шрифта Adobe</comment>
+ <comment xml:lang="ro">Dimensiuni font Adobe</comment>
+ <comment xml:lang="pt_BR">Métricas de fonte Adobe</comment>
+ <comment xml:lang="pt">métrica de letras Adobe</comment>
+ <comment xml:lang="pl">Metryka czcionki Adobe</comment>
+ <comment xml:lang="oc">metricas de poliça Adobe</comment>
+ <comment xml:lang="nn">Adobe skrifttypemetrikk</comment>
+ <comment xml:lang="nl">Adobe lettertype-metrieken</comment>
+ <comment xml:lang="nb">Adobe skrifttypefil</comment>
+ <comment xml:lang="ms">Metrik font Adobe</comment>
+ <comment xml:lang="lv">Adobe fonta metrika</comment>
+ <comment xml:lang="lt">Adobe šriftų metrika</comment>
+ <comment xml:lang="ko">Adobe 글꼴 메트릭</comment>
+ <comment xml:lang="kk">Adobe қаріп метрикалары</comment>
+ <comment xml:lang="ja">Adobe フォントメトリック</comment>
+ <comment xml:lang="it">Metriche tipo carattere Adobe</comment>
+ <comment xml:lang="is">Adobe leturupplýsingar</comment>
+ <comment xml:lang="id">Metrik fonta Adobe</comment>
+ <comment xml:lang="ia">Metricas de typo de litteras Adobe</comment>
+ <comment xml:lang="hu">Adobe-betűmetrika</comment>
+ <comment xml:lang="hr">Metrika Adobe fonta</comment>
+ <comment xml:lang="he">מדדי גופן של Adobe</comment>
+ <comment xml:lang="gl">métricas de fonte de Adobe</comment>
+ <comment xml:lang="ga">meadarachtaí cló Adobe</comment>
+ <comment xml:lang="fur">metrichis caratar Adobe</comment>
+ <comment xml:lang="fr">métriques de police Adobe</comment>
+ <comment xml:lang="fi">Adobe-fonttimitat</comment>
+ <comment xml:lang="eu">Adobe letra-tipoen neurriak</comment>
+ <comment xml:lang="es">métricas tipográficas de Adobe</comment>
+ <comment xml:lang="eo">metrikoj de Adobe-tiparo</comment>
+ <comment xml:lang="en_GB">Adobe font metrics</comment>
+ <comment xml:lang="el">Μετρικά γραμματοσειράς Adobe</comment>
+ <comment xml:lang="de">Adobe-Schriftmetriken</comment>
+ <comment xml:lang="da">Adobe skrifttypefil</comment>
+ <comment xml:lang="cy">Metrigau Ffont Adobe</comment>
+ <comment xml:lang="cs">metrika fontu Adobe</comment>
+ <comment xml:lang="ca">mètrica de lletra d'Adobe</comment>
+ <comment xml:lang="bg">Шрифтова метрика — Adobe</comment>
+ <comment xml:lang="be@latin">Metryka šryftu Adobe</comment>
+ <comment xml:lang="be">метрыкі шрыфту Adobe</comment>
+ <comment xml:lang="az">Adobe yazı növü metrikləri</comment>
+ <comment xml:lang="ar">مقاييس خط أدوبي</comment>
+ <comment xml:lang="af">Adobe skriftipe-afmetings</comment>
<generic-icon name="font-x-generic"/>
<glob pattern="*.afm"/>
</mime-type>
<mime-type type="application/x-font-bdf">
<comment>BDF font</comment>
- <comment xml:lang="af">BDF-skriftipe</comment>
- <comment xml:lang="ar">خط BDF</comment>
- <comment xml:lang="az">BDF yazı növü</comment>
- <comment xml:lang="be-Latn">Šryft BDF</comment>
- <comment xml:lang="bg">Шрифт — BDF</comment>
- <comment xml:lang="ca">lletra BDF</comment>
- <comment xml:lang="cs">font BDF</comment>
- <comment xml:lang="cy">Ffont BDF</comment>
- <comment xml:lang="da">BDF-skrifttype</comment>
- <comment xml:lang="de">BDF-Schrift</comment>
- <comment xml:lang="el">Γραμματοσειρά BDF</comment>
- <comment xml:lang="en-GB">BDF font</comment>
- <comment xml:lang="eo">BDF-tiparo</comment>
- <comment xml:lang="es">tipo de letra BDF</comment>
- <comment xml:lang="eu">BDF letra-tipoa</comment>
- <comment xml:lang="fi">BDF-fontti</comment>
- <comment xml:lang="fo">BDF stavasnið</comment>
- <comment xml:lang="fr">police BDF</comment>
- <comment xml:lang="fur">caratar BDF</comment>
- <comment xml:lang="ga">cló BDF</comment>
- <comment xml:lang="gl">tipo de fonte BDF</comment>
- <comment xml:lang="he">גופן BDF</comment>
- <comment xml:lang="hr">BDF font</comment>
- <comment xml:lang="hu">BDF-betűkészlet</comment>
- <comment xml:lang="ia">Typo de litteras BDF</comment>
- <comment xml:lang="id">Fonta BDF</comment>
- <comment xml:lang="it">Carattere BDF</comment>
- <comment xml:lang="ja">BDF フォント</comment>
- <comment xml:lang="kk">BDF қарібі</comment>
- <comment xml:lang="ko">BDF 글꼴</comment>
- <comment xml:lang="lt">BDF šriftas</comment>
- <comment xml:lang="lv">BDF fonts</comment>
- <comment xml:lang="ms">Font BDF</comment>
- <comment xml:lang="nb">BDF-skrifttype</comment>
- <comment xml:lang="nl">BDF-lettertype</comment>
- <comment xml:lang="nn">BDF-skrifttype</comment>
- <comment xml:lang="oc">poliça BDF</comment>
- <comment xml:lang="pl">Czcionka BDF</comment>
- <comment xml:lang="pt">letra BDF</comment>
- <comment xml:lang="pt-BR">Fonte BDF</comment>
- <comment xml:lang="ro">Font BDF</comment>
- <comment xml:lang="ru">Шрифт BDF</comment>
- <comment xml:lang="sk">Písmo BDF</comment>
- <comment xml:lang="sl">Datoteka pisave BDF</comment>
- <comment xml:lang="sq">Lloj gërme BDF</comment>
- <comment xml:lang="sr">БДФ слова</comment>
- <comment xml:lang="sv">BDF-typsnitt</comment>
- <comment xml:lang="tr">BDF yazı tipi</comment>
- <comment xml:lang="uk">шрифт BDF</comment>
+ <comment xml:lang="zh_TW">BDF 字型</comment>
+ <comment xml:lang="zh_CN">BDF 字体</comment>
<comment xml:lang="vi">Phông chữ BDF</comment>
- <comment xml:lang="zh-CN">BDF 字体</comment>
- <comment xml:lang="zh-TW">BDF 字型</comment>
+ <comment xml:lang="uk">шрифт BDF</comment>
+ <comment xml:lang="tr">BDF yazı tipi</comment>
+ <comment xml:lang="sv">BDF-typsnitt</comment>
+ <comment xml:lang="sr">БДФ слова</comment>
+ <comment xml:lang="sq">shkronja BDF</comment>
+ <comment xml:lang="sl">Datoteka pisave BDF</comment>
+ <comment xml:lang="si">BDF අකුරු</comment>
+ <comment xml:lang="sk">Písmo BDF</comment>
+ <comment xml:lang="ru">Шрифт BDF</comment>
+ <comment xml:lang="ro">Font BDF</comment>
+ <comment xml:lang="pt_BR">Fonte BDF</comment>
+ <comment xml:lang="pt">letra BDF</comment>
+ <comment xml:lang="pl">Czcionka BDF</comment>
+ <comment xml:lang="oc">poliça BDF</comment>
+ <comment xml:lang="nn">BDF-skrifttype</comment>
+ <comment xml:lang="nl">BDF-lettertype</comment>
+ <comment xml:lang="nb">BDF-skrifttype</comment>
+ <comment xml:lang="ms">Font BDF</comment>
+ <comment xml:lang="lv">BDF fonts</comment>
+ <comment xml:lang="lt">BDF šriftas</comment>
+ <comment xml:lang="ko">BDF 글꼴</comment>
+ <comment xml:lang="kk">BDF қарібі</comment>
+ <comment xml:lang="ja">BDF フォント</comment>
+ <comment xml:lang="it">Carattere BDF</comment>
+ <comment xml:lang="is">BDF letur</comment>
+ <comment xml:lang="id">Fonta BDF</comment>
+ <comment xml:lang="ia">Typo de litteras BDF</comment>
+ <comment xml:lang="hu">BDF-betűkészlet</comment>
+ <comment xml:lang="hr">BDF font</comment>
+ <comment xml:lang="he">גופן BDF</comment>
+ <comment xml:lang="gl">tipo de fonte BDF</comment>
+ <comment xml:lang="ga">cló BDF</comment>
+ <comment xml:lang="fur">caratar BDF</comment>
+ <comment xml:lang="fr">police BDF</comment>
+ <comment xml:lang="fo">BDF stavasnið</comment>
+ <comment xml:lang="fi">BDF-fontti</comment>
+ <comment xml:lang="eu">BDF letra-tipoa</comment>
+ <comment xml:lang="es">tipo de letra BDF</comment>
+ <comment xml:lang="eo">BDF-tiparo</comment>
+ <comment xml:lang="en_GB">BDF font</comment>
+ <comment xml:lang="el">Γραμματοσειρά BDF</comment>
+ <comment xml:lang="de">BDF-Schrift</comment>
+ <comment xml:lang="da">BDF-skrifttype</comment>
+ <comment xml:lang="cy">Ffont BDF</comment>
+ <comment xml:lang="cs">font BDF</comment>
+ <comment xml:lang="ca">lletra BDF</comment>
+ <comment xml:lang="bg">Шрифт — BDF</comment>
+ <comment xml:lang="be@latin">Šryft BDF</comment>
+ <comment xml:lang="be">шрыфт BDF</comment>
+ <comment xml:lang="az">BDF yazı növü</comment>
+ <comment xml:lang="ar">خط BDF</comment>
+ <comment xml:lang="af">BDF-skriftipe</comment>
<generic-icon name="font-x-generic"/>
- <magic priority="50">
+ <magic>
<match type="string" value="STARTFONT\040" offset="0"/>
</magic>
<glob pattern="*.bdf"/>
</mime-type>
<mime-type type="application/x-font-dos">
<comment>DOS font</comment>
- <comment xml:lang="af">DOS-skriftipe</comment>
- <comment xml:lang="ar">خط DOS</comment>
- <comment xml:lang="az">DOS yazı növü</comment>
- <comment xml:lang="be-Latn">Šryft DOS</comment>
- <comment xml:lang="bg">Шрифт — DOS</comment>
- <comment xml:lang="ca">lletra DOS</comment>
- <comment xml:lang="cs">font pro DOS</comment>
- <comment xml:lang="cy">Ffont DOS</comment>
- <comment xml:lang="da">DOS-skrifttype</comment>
- <comment xml:lang="de">DOS-Schrift</comment>
- <comment xml:lang="el">Γραμματοσειρά DOS</comment>
- <comment xml:lang="en-GB">DOS font</comment>
- <comment xml:lang="eo">DOS-tiparo</comment>
- <comment xml:lang="es">tipo de letra de DOS</comment>
- <comment xml:lang="eu">DOS letra-tipoa</comment>
- <comment xml:lang="fi">DOS-fontti</comment>
- <comment xml:lang="fo">DOS stavasnið</comment>
- <comment xml:lang="fr">police DOS</comment>
- <comment xml:lang="fur">caratar DOS</comment>
- <comment xml:lang="ga">cló DOS</comment>
- <comment xml:lang="gl">tipo de fonte de DOS</comment>
- <comment xml:lang="he">גופן DOS</comment>
- <comment xml:lang="hr">DOS font</comment>
- <comment xml:lang="hu">DOS-betűkészlet</comment>
- <comment xml:lang="ia">Typo de litteras DOS</comment>
- <comment xml:lang="id">Fonta DOS</comment>
- <comment xml:lang="it">Carattere DOS</comment>
- <comment xml:lang="ja">DOS フォント</comment>
- <comment xml:lang="kk">DOS қарібі</comment>
- <comment xml:lang="ko">DOS 글꼴</comment>
- <comment xml:lang="lt">DOS šriftas</comment>
- <comment xml:lang="lv">DOS fonts</comment>
- <comment xml:lang="ms">Font DOS</comment>
- <comment xml:lang="nb">DOS-skrifttype</comment>
- <comment xml:lang="nl">DOS-lettertype</comment>
- <comment xml:lang="nn">DOS-skrifttype</comment>
- <comment xml:lang="oc">poliça DOS</comment>
- <comment xml:lang="pl">Czcionka DOS</comment>
- <comment xml:lang="pt">letra DOS</comment>
- <comment xml:lang="pt-BR">Fonte do DOS</comment>
- <comment xml:lang="ro">Font DOS</comment>
- <comment xml:lang="ru">Шрифт DOS</comment>
- <comment xml:lang="sk">Písmo pre DOS</comment>
- <comment xml:lang="sl">Datoteka pisave DOS</comment>
- <comment xml:lang="sq">Gërmë DOS</comment>
- <comment xml:lang="sr">ДОС слова</comment>
- <comment xml:lang="sv">DOS-typsnitt</comment>
- <comment xml:lang="tr">DOS yazı tipi</comment>
- <comment xml:lang="uk">шрифт DOS</comment>
+ <comment xml:lang="zh_TW">DOS 字型</comment>
+ <comment xml:lang="zh_CN">DOS 字体</comment>
<comment xml:lang="vi">Phông chữ DOS</comment>
- <comment xml:lang="zh-CN">DOS 字体</comment>
- <comment xml:lang="zh-TW">DOS 字型</comment>
+ <comment xml:lang="uk">шрифт DOS</comment>
+ <comment xml:lang="tr">DOS yazı tipi</comment>
+ <comment xml:lang="sv">DOS-typsnitt</comment>
+ <comment xml:lang="sr">ДОС слова</comment>
+ <comment xml:lang="sq">shkronja DOS</comment>
+ <comment xml:lang="sl">Datoteka pisave DOS</comment>
+ <comment xml:lang="si">DOS අකුරු</comment>
+ <comment xml:lang="sk">Písmo pre DOS</comment>
+ <comment xml:lang="ru">Шрифт DOS</comment>
+ <comment xml:lang="ro">Font DOS</comment>
+ <comment xml:lang="pt_BR">Fonte do DOS</comment>
+ <comment xml:lang="pt">letra DOS</comment>
+ <comment xml:lang="pl">Czcionka DOS</comment>
+ <comment xml:lang="oc">poliça DOS</comment>
+ <comment xml:lang="nn">DOS-skrifttype</comment>
+ <comment xml:lang="nl">DOS-lettertype</comment>
+ <comment xml:lang="nb">DOS-skrifttype</comment>
+ <comment xml:lang="ms">Font DOS</comment>
+ <comment xml:lang="lv">DOS fonts</comment>
+ <comment xml:lang="lt">DOS šriftas</comment>
+ <comment xml:lang="ko">DOS 글꼴</comment>
+ <comment xml:lang="kk">DOS қарібі</comment>
+ <comment xml:lang="ja">DOS フォント</comment>
+ <comment xml:lang="it">Carattere DOS</comment>
+ <comment xml:lang="is">DOS letur</comment>
+ <comment xml:lang="id">Fonta DOS</comment>
+ <comment xml:lang="ia">Typo de litteras DOS</comment>
+ <comment xml:lang="hu">DOS-betűkészlet</comment>
+ <comment xml:lang="hr">DOS font</comment>
+ <comment xml:lang="he">גופן DOS</comment>
+ <comment xml:lang="gl">tipo de fonte de DOS</comment>
+ <comment xml:lang="ga">cló DOS</comment>
+ <comment xml:lang="fur">caratar DOS</comment>
+ <comment xml:lang="fr">police DOS</comment>
+ <comment xml:lang="fo">DOS stavasnið</comment>
+ <comment xml:lang="fi">DOS-fontti</comment>
+ <comment xml:lang="eu">DOS letra-tipoa</comment>
+ <comment xml:lang="es">tipo de letra de DOS</comment>
+ <comment xml:lang="eo">DOS-tiparo</comment>
+ <comment xml:lang="en_GB">DOS font</comment>
+ <comment xml:lang="el">Γραμματοσειρά DOS</comment>
+ <comment xml:lang="de">DOS-Schrift</comment>
+ <comment xml:lang="da">DOS-skrifttype</comment>
+ <comment xml:lang="cy">Ffont DOS</comment>
+ <comment xml:lang="cs">font pro DOS</comment>
+ <comment xml:lang="ca">lletra DOS</comment>
+ <comment xml:lang="bg">Шрифт — DOS</comment>
+ <comment xml:lang="be@latin">Šryft DOS</comment>
+ <comment xml:lang="be">шрыфт DOS</comment>
+ <comment xml:lang="az">DOS yazı növü</comment>
+ <comment xml:lang="ar">خط DOS</comment>
+ <comment xml:lang="af">DOS-skriftipe</comment>
<generic-icon name="font-x-generic"/>
- <magic priority="50">
+ <magic>
<match type="string" value="\xff\x46\x4f\x4e" offset="0"/>
<match type="string" value="\x00\x45\x47\x41" offset="7"/>
<match type="string" value="\x00\x56\x49\x44" offset="7"/>
@@ -11377,292 +11722,313 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-font-framemaker">
<comment>Adobe FrameMaker font</comment>
- <comment xml:lang="af">Adobe FrameMaker-skriftipe</comment>
- <comment xml:lang="ar">خط أدوبي الصانع للإطارات</comment>
- <comment xml:lang="az">Adobe FrameMaker yazı növü</comment>
- <comment xml:lang="be-Latn">Šryft Adobe FrameMaker</comment>
- <comment xml:lang="bg">Шрифт — Adobe FrameMaker</comment>
- <comment xml:lang="ca">lletra d'Adobe FrameMaker</comment>
- <comment xml:lang="cs">font Adobe FrameMaker</comment>
- <comment xml:lang="cy">Ffont Adobe FrameMaker</comment>
- <comment xml:lang="da">Adobe FrameMaker-skrifttype</comment>
- <comment xml:lang="de">Adobe-FrameMaker-Schrift</comment>
- <comment xml:lang="el">Γραμματοσειρά Adobe FrameMaker</comment>
- <comment xml:lang="en-GB">Adobe FrameMaker font</comment>
- <comment xml:lang="eo">Tiparo de Adobe FrameMaker</comment>
- <comment xml:lang="es">tipo de letra de Adobe FrameMaker</comment>
- <comment xml:lang="eu">Adobe FrameMaker-en letra-tipoa</comment>
- <comment xml:lang="fi">Adobe FrameMaker -fontti</comment>
- <comment xml:lang="fo">Adobe FrameMaker stavasnið</comment>
- <comment xml:lang="fr">police Adobe FrameMaker</comment>
- <comment xml:lang="fur">caratar Adobe FrameMaker</comment>
- <comment xml:lang="ga">cló Adobe FrameMaker</comment>
- <comment xml:lang="gl">tipo de fonte de Adobe FrameMaker</comment>
- <comment xml:lang="he">גופן של Adobe FrameMaker</comment>
- <comment xml:lang="hr">Adobe FrameMaker font</comment>
- <comment xml:lang="hu">Adobe FrameMaker-betűkészlet</comment>
- <comment xml:lang="ia">Typo de litteras pro Adobe FrameMaker</comment>
- <comment xml:lang="id">Fonta Adobe FrameMaker</comment>
- <comment xml:lang="it">Carattere Adobe FrameMaker</comment>
- <comment xml:lang="ja">Adobe FrameMaker フォント</comment>
- <comment xml:lang="kk">Adobe FrameMaker қарібі</comment>
- <comment xml:lang="ko">Adobe 프레임메이커 글꼴</comment>
- <comment xml:lang="lt">Adobe FrameMaker šriftas</comment>
- <comment xml:lang="lv">Adobe FrameMaker fonts</comment>
- <comment xml:lang="ms">Font Adobe FrameMaker</comment>
- <comment xml:lang="nb">Adobe FrameMaker skrifttype</comment>
- <comment xml:lang="nl">Adobe FrameMaker-lettertype</comment>
- <comment xml:lang="nn">Adobe FrameMaker-skrifttype</comment>
- <comment xml:lang="oc">poliça Adobe FrameMaker</comment>
- <comment xml:lang="pl">Czcionka Adobe FrameMaker</comment>
- <comment xml:lang="pt">letra Adobe FrameMaker</comment>
- <comment xml:lang="pt-BR">Fonte do Adobe FrameMaker</comment>
- <comment xml:lang="ro">Font Adobe FrameMaker</comment>
- <comment xml:lang="ru">Шрифт Adobe FrameMaker</comment>
- <comment xml:lang="sk">Písmo Adobe FrameMaker</comment>
- <comment xml:lang="sl">Datoteka pisave Adobe FrameMaker</comment>
- <comment xml:lang="sq">Gërma Adobe FrameMaker</comment>
- <comment xml:lang="sr">слова Адобе Фрејм Мејкера</comment>
- <comment xml:lang="sv">Adobe FrameMaker-typsnitt</comment>
- <comment xml:lang="tr">Adobe FrameMaker yazı tipi</comment>
- <comment xml:lang="uk">шрифт Adobe FrameMaker</comment>
+ <comment xml:lang="zh_TW">Adobe FrameMaker 字型</comment>
+ <comment xml:lang="zh_CN">Adobe FrameMaker 字体</comment>
<comment xml:lang="vi">Phông chữ Adobe FrameMaker</comment>
- <comment xml:lang="zh-CN">Adobe FrameMaker 字体</comment>
- <comment xml:lang="zh-TW">Adobe FrameMaker 字型</comment>
+ <comment xml:lang="uk">шрифт Adobe FrameMaker</comment>
+ <comment xml:lang="tr">Adobe FrameMaker yazı tipi</comment>
+ <comment xml:lang="sv">Adobe FrameMaker-typsnitt</comment>
+ <comment xml:lang="sr">слова Адобе Фрејм Мејкера</comment>
+ <comment xml:lang="sq">shkronja Adobe FrameMaker</comment>
+ <comment xml:lang="sl">Datoteka pisave Adobe FrameMaker</comment>
+ <comment xml:lang="si">Adobe FrameMaker අකුරු</comment>
+ <comment xml:lang="sk">Písmo Adobe FrameMaker</comment>
+ <comment xml:lang="ru">Шрифт Adobe FrameMaker</comment>
+ <comment xml:lang="ro">Font Adobe FrameMaker</comment>
+ <comment xml:lang="pt_BR">Fonte do Adobe FrameMaker</comment>
+ <comment xml:lang="pt">letra Adobe FrameMaker</comment>
+ <comment xml:lang="pl">Czcionka Adobe FrameMaker</comment>
+ <comment xml:lang="oc">poliça Adobe FrameMaker</comment>
+ <comment xml:lang="nn">Adobe FrameMaker-skrifttype</comment>
+ <comment xml:lang="nl">Adobe FrameMaker-lettertype</comment>
+ <comment xml:lang="nb">Adobe FrameMaker skrifttype</comment>
+ <comment xml:lang="ms">Font Adobe FrameMaker</comment>
+ <comment xml:lang="lv">Adobe FrameMaker fonts</comment>
+ <comment xml:lang="lt">Adobe FrameMaker šriftas</comment>
+ <comment xml:lang="ko">Adobe 프레임메이커 글꼴</comment>
+ <comment xml:lang="kk">Adobe FrameMaker қарібі</comment>
+ <comment xml:lang="ja">Adobe FrameMaker フォント</comment>
+ <comment xml:lang="it">Carattere Adobe FrameMaker</comment>
+ <comment xml:lang="is">Adobe FrameMaker letur</comment>
+ <comment xml:lang="id">Fonta Adobe FrameMaker</comment>
+ <comment xml:lang="ia">Typo de litteras pro Adobe FrameMaker</comment>
+ <comment xml:lang="hu">Adobe FrameMaker-betűkészlet</comment>
+ <comment xml:lang="hr">Adobe FrameMaker font</comment>
+ <comment xml:lang="he">גופן של Adobe FrameMaker</comment>
+ <comment xml:lang="gl">tipo de fonte de Adobe FrameMaker</comment>
+ <comment xml:lang="ga">cló Adobe FrameMaker</comment>
+ <comment xml:lang="fur">caratar Adobe FrameMaker</comment>
+ <comment xml:lang="fr">police Adobe FrameMaker</comment>
+ <comment xml:lang="fo">Adobe FrameMaker stavasnið</comment>
+ <comment xml:lang="fi">Adobe FrameMaker -fontti</comment>
+ <comment xml:lang="eu">Adobe FrameMaker-en letra-tipoa</comment>
+ <comment xml:lang="es">tipo de letra de Adobe FrameMaker</comment>
+ <comment xml:lang="eo">Tiparo de Adobe FrameMaker</comment>
+ <comment xml:lang="en_GB">Adobe FrameMaker font</comment>
+ <comment xml:lang="el">Γραμματοσειρά Adobe FrameMaker</comment>
+ <comment xml:lang="de">Adobe-FrameMaker-Schrift</comment>
+ <comment xml:lang="da">Adobe FrameMaker-skrifttype</comment>
+ <comment xml:lang="cy">Ffont Adobe FrameMaker</comment>
+ <comment xml:lang="cs">font Adobe FrameMaker</comment>
+ <comment xml:lang="ca">lletra d'Adobe FrameMaker</comment>
+ <comment xml:lang="bg">Шрифт — Adobe FrameMaker</comment>
+ <comment xml:lang="be@latin">Šryft Adobe FrameMaker</comment>
+ <comment xml:lang="be">шрыфт Adobe FrameMaker</comment>
+ <comment xml:lang="az">Adobe FrameMaker yazı növü</comment>
+ <comment xml:lang="ar">خط أدوبي FrameMaker</comment>
+ <comment xml:lang="af">Adobe FrameMaker-skriftipe</comment>
<generic-icon name="font-x-generic"/>
- <magic priority="50">
+ <magic>
<match type="string" value="&lt;MakerScreenFont" offset="0"/>
</magic>
</mime-type>
<mime-type type="application/x-font-libgrx">
<comment>LIBGRX font</comment>
- <comment xml:lang="af">LIBGRX-skriftipe</comment>
- <comment xml:lang="ar">خط LIBGRX</comment>
- <comment xml:lang="az">LIBGRX yazı növü</comment>
- <comment xml:lang="be-Latn">Šryft LIBGRX</comment>
- <comment xml:lang="bg">Шрифт — LIBGRX</comment>
- <comment xml:lang="ca">lletra LIBGRX</comment>
- <comment xml:lang="cs">font LIBGRX</comment>
- <comment xml:lang="cy">Ffont LIBGRX</comment>
- <comment xml:lang="da">LIBGRX-skrifttype</comment>
- <comment xml:lang="de">LIBGRX-Schrift</comment>
- <comment xml:lang="el">Γραμματοσειρά LIBGRX</comment>
- <comment xml:lang="en-GB">LIBGRX font</comment>
- <comment xml:lang="eo">LIBGRX-tiparo</comment>
- <comment xml:lang="es">tipo de letra LIBGRX</comment>
- <comment xml:lang="eu">LIBGRX letra-tipoa</comment>
- <comment xml:lang="fi">LIBGRX-fontti</comment>
- <comment xml:lang="fo">LIBGRX stavasnið</comment>
- <comment xml:lang="fr">police LIBGRX</comment>
- <comment xml:lang="fur">caratar LIBGRX</comment>
- <comment xml:lang="ga">cló LIBGRX</comment>
- <comment xml:lang="gl">tipo de fonte en LIBGRX</comment>
- <comment xml:lang="he">גופן LIBGRX</comment>
- <comment xml:lang="hr">LIBGRX font</comment>
- <comment xml:lang="hu">LIBGRX-betűkészlet</comment>
- <comment xml:lang="ia">Typo de litteras LIBGRX</comment>
- <comment xml:lang="id">Fonta LIBGRX</comment>
- <comment xml:lang="it">Carattere LIBGRX</comment>
- <comment xml:lang="ja">LIBGRX フォーマット</comment>
- <comment xml:lang="kk">LIBGRX қарібі</comment>
- <comment xml:lang="ko">LIBGRX 글꼴</comment>
- <comment xml:lang="lt">LIBGRX šriftas</comment>
- <comment xml:lang="lv">LIBGRX fonts</comment>
- <comment xml:lang="ms">Font LIBGRX</comment>
- <comment xml:lang="nb">LIBGRX-skrifttype</comment>
- <comment xml:lang="nl">LIBGRX-lettertype</comment>
- <comment xml:lang="nn">LIBGRX skrifttype</comment>
- <comment xml:lang="oc">poliça LIBGRX</comment>
- <comment xml:lang="pl">Czcionka LIBGRX</comment>
- <comment xml:lang="pt">letra LIBGRX</comment>
- <comment xml:lang="pt-BR">Fonte LIBGRX</comment>
- <comment xml:lang="ro">Font LIBGRX</comment>
- <comment xml:lang="ru">Шрифт LIBGRX</comment>
- <comment xml:lang="sk">Písmo LIBGRX</comment>
- <comment xml:lang="sl">Datoteka pisave LIBGRX</comment>
- <comment xml:lang="sq">Lloj gërme LIBGRX</comment>
- <comment xml:lang="sr">ЛИБГРИкс слова</comment>
- <comment xml:lang="sv">LIBGRX-typsnitt</comment>
- <comment xml:lang="tr">LIBGRX yazı tipi</comment>
- <comment xml:lang="uk">шрифт LIBGRX</comment>
+ <comment xml:lang="zh_TW">LIBGRX 字型</comment>
+ <comment xml:lang="zh_CN">LIBGRX 字体</comment>
<comment xml:lang="vi">Phông chữ LIBGRX</comment>
- <comment xml:lang="zh-CN">LIBGRX 字体</comment>
- <comment xml:lang="zh-TW">LIBGRX 字型</comment>
+ <comment xml:lang="uk">шрифт LIBGRX</comment>
+ <comment xml:lang="tr">LIBGRX yazı tipi</comment>
+ <comment xml:lang="sv">LIBGRX-typsnitt</comment>
+ <comment xml:lang="sr">ЛИБГРИкс слова</comment>
+ <comment xml:lang="sq">shkronja LIBGRX</comment>
+ <comment xml:lang="sl">Datoteka pisave LIBGRX</comment>
+ <comment xml:lang="si">LIBGRX අකුරු</comment>
+ <comment xml:lang="sk">Písmo LIBGRX</comment>
+ <comment xml:lang="ru">Шрифт LIBGRX</comment>
+ <comment xml:lang="ro">Font LIBGRX</comment>
+ <comment xml:lang="pt_BR">Fonte LIBGRX</comment>
+ <comment xml:lang="pt">letra LIBGRX</comment>
+ <comment xml:lang="pl">Czcionka LIBGRX</comment>
+ <comment xml:lang="oc">poliça LIBGRX</comment>
+ <comment xml:lang="nn">LIBGRX skrifttype</comment>
+ <comment xml:lang="nl">LIBGRX-lettertype</comment>
+ <comment xml:lang="nb">LIBGRX-skrifttype</comment>
+ <comment xml:lang="ms">Font LIBGRX</comment>
+ <comment xml:lang="lv">LIBGRX fonts</comment>
+ <comment xml:lang="lt">LIBGRX šriftas</comment>
+ <comment xml:lang="ko">LIBGRX 글꼴</comment>
+ <comment xml:lang="kk">LIBGRX қарібі</comment>
+ <comment xml:lang="ja">LIBGRX フォーマット</comment>
+ <comment xml:lang="it">Carattere LIBGRX</comment>
+ <comment xml:lang="is">LIBGRX letur</comment>
+ <comment xml:lang="id">Fonta LIBGRX</comment>
+ <comment xml:lang="ia">Typo de litteras LIBGRX</comment>
+ <comment xml:lang="hu">LIBGRX-betűkészlet</comment>
+ <comment xml:lang="hr">LIBGRX font</comment>
+ <comment xml:lang="he">גופן LIBGRX</comment>
+ <comment xml:lang="gl">tipo de fonte en LIBGRX</comment>
+ <comment xml:lang="ga">cló LIBGRX</comment>
+ <comment xml:lang="fur">caratar LIBGRX</comment>
+ <comment xml:lang="fr">police LIBGRX</comment>
+ <comment xml:lang="fo">LIBGRX stavasnið</comment>
+ <comment xml:lang="fi">LIBGRX-fontti</comment>
+ <comment xml:lang="eu">LIBGRX letra-tipoa</comment>
+ <comment xml:lang="es">tipo de letra LIBGRX</comment>
+ <comment xml:lang="eo">LIBGRX-tiparo</comment>
+ <comment xml:lang="en_GB">LIBGRX font</comment>
+ <comment xml:lang="el">Γραμματοσειρά LIBGRX</comment>
+ <comment xml:lang="de">LIBGRX-Schrift</comment>
+ <comment xml:lang="da">LIBGRX-skrifttype</comment>
+ <comment xml:lang="cy">Ffont LIBGRX</comment>
+ <comment xml:lang="cs">font LIBGRX</comment>
+ <comment xml:lang="ca">lletra LIBGRX</comment>
+ <comment xml:lang="bg">Шрифт — LIBGRX</comment>
+ <comment xml:lang="be@latin">Šryft LIBGRX</comment>
+ <comment xml:lang="be">шрыфт LIBGRX</comment>
+ <comment xml:lang="az">LIBGRX yazı növü</comment>
+ <comment xml:lang="ar">خط LIBGRX</comment>
+ <comment xml:lang="af">LIBGRX-skriftipe</comment>
<generic-icon name="font-x-generic"/>
- <magic priority="50">
+ <magic>
<match type="string" value="\x14\x02\x59\x19" offset="0"/>
</magic>
</mime-type>
<mime-type type="application/x-font-linux-psf">
<comment>Linux PSF console font</comment>
- <comment xml:lang="af">Linux PSF-konsoleskriftipe</comment>
- <comment xml:lang="ar">خط كونسول PSF لينكس</comment>
- <comment xml:lang="az">Linux PSF konsol yazı növü</comment>
- <comment xml:lang="be-Latn">Kansolny šryft PSF dla Linuksa</comment>
- <comment xml:lang="bg">Шрифт — PSF, за конзолата на Линукс</comment>
- <comment xml:lang="ca">lletra de consola PSF de Linux</comment>
- <comment xml:lang="cs">font PSF pro konzolu Linuxu</comment>
- <comment xml:lang="cy">Ffont Linux PSF</comment>
- <comment xml:lang="da">Linux PSF-konsolskrifttype</comment>
- <comment xml:lang="de">Linux-PSF-Konsolenschrift</comment>
- <comment xml:lang="el">Γραμματοσειρά κονσόλας PSF Linux</comment>
- <comment xml:lang="en-GB">Linux PSF console font</comment>
- <comment xml:lang="eo">PSF-tiparo de Linux-konzolo</comment>
- <comment xml:lang="es">tipo de letra de consola Linux PSF</comment>
- <comment xml:lang="eu">Linux PSF kontsolako letra-tipoa</comment>
- <comment xml:lang="fi">Linux PSF -konsolifontti</comment>
- <comment xml:lang="fo">Linux PSF stýristøðs stavasnið</comment>
- <comment xml:lang="fr">police console Linux PSF</comment>
- <comment xml:lang="fur">caratar console Linux PSF</comment>
- <comment xml:lang="ga">cló consóil Linux PSF</comment>
- <comment xml:lang="gl">tipo de fonte de consola Linux PSF</comment>
- <comment xml:lang="he">גופן לקונסול מסוג Linux PSF</comment>
- <comment xml:lang="hr">Linux PSF font konzole</comment>
- <comment xml:lang="hu">Linux PSF konzolos betűkészlet</comment>
- <comment xml:lang="ia">Typo de litteras console Linux PSF</comment>
- <comment xml:lang="id">Fonta konsol Linux PSF</comment>
- <comment xml:lang="it">Carattere console Linux PSF</comment>
- <comment xml:lang="ja">Linux PSF コンソールフォント</comment>
- <comment xml:lang="kk">Linux PSF консольдік қарібі</comment>
- <comment xml:lang="ko">리눅스 PSF 콘솔 글꼴</comment>
- <comment xml:lang="lt">Linux PSF konsolės šriftas</comment>
- <comment xml:lang="lv">Linux PSF konsoles fonts</comment>
- <comment xml:lang="ms">Font konsol PSF Linux</comment>
- <comment xml:lang="nb">Linux PSF konsollskrifttype</comment>
- <comment xml:lang="nl">Linux PSF-console-lettertype</comment>
- <comment xml:lang="nn">Linux PSF konsoll-skrifttype</comment>
- <comment xml:lang="oc">poliça consòla Linux PSF</comment>
- <comment xml:lang="pl">Czcionka konsoli PSF Linux</comment>
- <comment xml:lang="pt">letra de consola Linux PSF</comment>
- <comment xml:lang="pt-BR">Fonte de console Linux PSF</comment>
- <comment xml:lang="ro">Font consolă Linux PSF</comment>
- <comment xml:lang="ru">Консольный шрифт Linux PSF</comment>
- <comment xml:lang="sk">Písmo PSF pre konzolu Linuxu</comment>
- <comment xml:lang="sl">Datoteka pisave konzole Linux PSF</comment>
- <comment xml:lang="sq">Lloj gërme për konsolë Linux PSF</comment>
- <comment xml:lang="sr">слова Линуксове ПСФ конзоле</comment>
- <comment xml:lang="sv">Linux PSF-konsoltypsnitt</comment>
- <comment xml:lang="tr">Linux PSF konsol yazı tipi</comment>
- <comment xml:lang="uk">консольний шрифт Linux PSF</comment>
+ <comment xml:lang="zh_TW">Linux PSF console 字型</comment>
+ <comment xml:lang="zh_CN">Linux PSF 控制台字体</comment>
<comment xml:lang="vi">Phông chữ bàn giao tiếp PSF Linux</comment>
- <comment xml:lang="zh-CN">Linux PSF 控制台字体</comment>
- <comment xml:lang="zh-TW">Linux PSF console 字型</comment>
+ <comment xml:lang="uk">консольний шрифт Linux PSF</comment>
+ <comment xml:lang="tr">Linux PSF konsol yazı tipi</comment>
+ <comment xml:lang="sv">Linux PSF-konsoltypsnitt</comment>
+ <comment xml:lang="sr">слова Линуксове ПСФ конзоле</comment>
+ <comment xml:lang="sq">shkronja konsole Linux PSF</comment>
+ <comment xml:lang="sl">Datoteka pisave konzole Linux PSF</comment>
+ <comment xml:lang="si">Linux PSF කොන්සෝල අකුරු</comment>
+ <comment xml:lang="sk">Písmo PSF pre konzolu Linuxu</comment>
+ <comment xml:lang="ru">Консольный шрифт Linux PSF</comment>
+ <comment xml:lang="ro">Font consolă Linux PSF</comment>
+ <comment xml:lang="pt_BR">Fonte de console Linux PSF</comment>
+ <comment xml:lang="pt">letra de consola Linux PSF</comment>
+ <comment xml:lang="pl">Czcionka konsoli PSF Linux</comment>
+ <comment xml:lang="oc">poliça consòla Linux PSF</comment>
+ <comment xml:lang="nn">Linux PSF konsoll-skrifttype</comment>
+ <comment xml:lang="nl">Linux PSF-console-lettertype</comment>
+ <comment xml:lang="nb">Linux PSF konsollskrifttype</comment>
+ <comment xml:lang="ms">Font konsol PSF Linux</comment>
+ <comment xml:lang="lv">Linux PSF konsoles fonts</comment>
+ <comment xml:lang="lt">Linux PSF konsolės šriftas</comment>
+ <comment xml:lang="ko">리눅스 PSF 콘솔 글꼴</comment>
+ <comment xml:lang="kk">Linux PSF консольдік қарібі</comment>
+ <comment xml:lang="ja">Linux PSF コンソールフォント</comment>
+ <comment xml:lang="it">Carattere console Linux PSF</comment>
+ <comment xml:lang="is">Linux PSF stjórnskjáaletur</comment>
+ <comment xml:lang="id">Fonta konsol Linux PSF</comment>
+ <comment xml:lang="ia">Typo de litteras console Linux PSF</comment>
+ <comment xml:lang="hu">Linux PSF konzolos betűkészlet</comment>
+ <comment xml:lang="hr">Linux PSF font konzole</comment>
+ <comment xml:lang="he">גופן לקונסול מסוג Linux PSF</comment>
+ <comment xml:lang="gl">tipo de fonte de consola Linux PSF</comment>
+ <comment xml:lang="ga">cló consóil Linux PSF</comment>
+ <comment xml:lang="fur">caratar console Linux PSF</comment>
+ <comment xml:lang="fr">police console Linux PSF</comment>
+ <comment xml:lang="fo">Linux PSF stýristøðs stavasnið</comment>
+ <comment xml:lang="fi">Linux PSF -konsolifontti</comment>
+ <comment xml:lang="eu">Linux PSF kontsolako letra-tipoa</comment>
+ <comment xml:lang="es">tipo de letra de consola Linux PSF</comment>
+ <comment xml:lang="eo">PSF-tiparo de Linux-konzolo</comment>
+ <comment xml:lang="en_GB">Linux PSF console font</comment>
+ <comment xml:lang="el">Γραμματοσειρά κονσόλας PSF Linux</comment>
+ <comment xml:lang="de">Linux-PSF-Konsolenschrift</comment>
+ <comment xml:lang="da">Linux PSF-konsolskrifttype</comment>
+ <comment xml:lang="cy">Ffont Linux PSF</comment>
+ <comment xml:lang="cs">font PSF pro konzolu Linuxu</comment>
+ <comment xml:lang="ca">lletra de consola PSF de Linux</comment>
+ <comment xml:lang="bg">Шрифт — PSF, за конзолата на Линукс</comment>
+ <comment xml:lang="be@latin">Kansolny šryft PSF dla Linuksa</comment>
+ <comment xml:lang="be">шрыфт кансолі PSF для Linux</comment>
+ <comment xml:lang="az">Linux PSF konsol yazı növü</comment>
+ <comment xml:lang="ar">خط كونسول PSF لينكس</comment>
+ <comment xml:lang="af">Linux PSF-konsoleskriftipe</comment>
+ <acronym>PSF</acronym>
+ <expanded-acronym>PC Screen Font</expanded-acronym>
<generic-icon name="font-x-generic"/>
- <magic priority="50">
+ <magic>
<match type="string" value="\x36\x04" offset="0"/>
</magic>
<glob pattern="*.psf"/>
</mime-type>
<mime-type type="application/x-gz-font-linux-psf">
<comment>Linux PSF console font (gzip-compressed)</comment>
- <comment xml:lang="af">Linux PSF-konsoleskriftipe (gzip-saamgepers)</comment>
- <comment xml:lang="ar">خط كونسول PSF لينكس (مضغوط-gzip)</comment>
- <comment xml:lang="be-Latn">Kansolny šryft PSF dla Linuksa (gzip-skampresavany)</comment>
- <comment xml:lang="bg">Шрифт — Linux PSF, компресиран с gzip</comment>
- <comment xml:lang="ca">lletra de consola PSF de Linux (amb compressió gzip)</comment>
- <comment xml:lang="cs">font PSF pro konzolu Linuxu (komprimace gzip)</comment>
- <comment xml:lang="da">Linux PSF-konsolskrifttype (gzip-komprimeret)</comment>
- <comment xml:lang="de">Linux-PSF-Konsolenschrift (gzip-komprimiert)</comment>
- <comment xml:lang="el">Γραμματοσειρά κονσόλας PSF Linux (συμπιεσμένη με gzip)</comment>
- <comment xml:lang="en-GB">Linux PSF console font (gzip-compressed)</comment>
- <comment xml:lang="es">tipo de letra de consola Linux PSF (comprimido con gzip)</comment>
- <comment xml:lang="eu">Linux PSF kontsolako letra-tipoa (gzip-ekin konprimitua)</comment>
- <comment xml:lang="fi">Linux PSF -konsolifontti (gzip-pakattu)</comment>
- <comment xml:lang="fo">Linux PSF stýristøðs stavasnið (gzip-stappað)</comment>
- <comment xml:lang="fr">police console Linux PSF (compressée gzip)</comment>
- <comment xml:lang="fur">caratar console Linux PSF (comprimût cun gzip)</comment>
- <comment xml:lang="ga">cló consóil Linux PSF (comhbhrúite le gzip)</comment>
- <comment xml:lang="gl">tipo de fonte de consola Linux PSF (comprimida con gzip)</comment>
- <comment xml:lang="he">גופן למסוף מסוג Linux PSF (מכווץ ע״י gzip)</comment>
- <comment xml:lang="hr">Linux PSF font konzolne (gzip komprimirano)</comment>
- <comment xml:lang="hu">Linux PSF konzolos betűkészlet (gzip tömörítésű)</comment>
- <comment xml:lang="ia">Typo de litteras console Linux PSF (comprimite con gzip)</comment>
- <comment xml:lang="id">Fonta konsol Linux PSF (terkompresi gzip)</comment>
- <comment xml:lang="it">Carattere console Linux PSF (compresso con gzip)</comment>
- <comment xml:lang="ja">Linux PSF コンソールフォント (gzip 圧縮)</comment>
- <comment xml:lang="kk">Linux PSF консольдік қарібі (gzip-пен сығылған)</comment>
- <comment xml:lang="ko">리눅스 PSF 콘솔 글꼴(GZIP 압축)</comment>
- <comment xml:lang="lt">Linux PSF konsolės šriftas (suglaudintas su gzip)</comment>
- <comment xml:lang="lv">Linux PSF konsoles fonts (saspiests ar gzip)</comment>
- <comment xml:lang="nb">Linux PSF konsollskrifttype (gzip-komprimert)</comment>
- <comment xml:lang="nl">Linux PSF-console-lettertype (ingepakt met gzip)</comment>
- <comment xml:lang="nn">Linux PSF konsoll-skrifttype (gzip-pakka)</comment>
- <comment xml:lang="oc">poliça consòla Linux PSF (compressat gzip)</comment>
- <comment xml:lang="pl">Czcionka konsoli PSF Linux (kompresja gzip)</comment>
- <comment xml:lang="pt">letra de consola Linux PSF (compressão gzip)</comment>
- <comment xml:lang="pt-BR">Fonte de console Linux PSF (compactada com gzip)</comment>
- <comment xml:lang="ro">Font consolă Linux PSF (compresie gzip)</comment>
- <comment xml:lang="ru">Консольный шрифт Linux PSF (сжатый gzip)</comment>
- <comment xml:lang="sk">Písmo PSF pre konzolu Linuxu (komprimované pomocou gzip)</comment>
- <comment xml:lang="sl">Datoteka pisave konzole Linux PSF (skrčena z gzip)</comment>
- <comment xml:lang="sq">Lloj gërme për konsolë Linux PSF (komresuar me gzip)</comment>
- <comment xml:lang="sr">слова Линуксове ПСФ конзоле (запакована гзип-ом)</comment>
- <comment xml:lang="sv">Linux PSF-konsoltypsnitt (gzip-komprimerat)</comment>
- <comment xml:lang="tr">Linux PSF konsol yazı tipi (gzip ile sıkıştırılmış)</comment>
- <comment xml:lang="uk">консольний шрифт Linux PSF (стиснений gzip)</comment>
+ <comment xml:lang="zh_TW">Linux PSF console 字型 (gzip 壓縮)</comment>
+ <comment xml:lang="zh_CN">Linux PSF 控制台字体(gzip 压缩)</comment>
<comment xml:lang="vi">Phông chữ bàn giao tiếp PSF Linux (đã nén gzip)</comment>
- <comment xml:lang="zh-CN">Linux PSF 控制台字体(gzip 压缩)</comment>
- <comment xml:lang="zh-TW">Linux PSF console 字型 (gzip 壓縮)</comment>
+ <comment xml:lang="uk">консольний шрифт Linux PSF (стиснений gzip)</comment>
+ <comment xml:lang="tr">Linux PSF konsol yazı tipi (gzip ile sıkıştırılmış)</comment>
+ <comment xml:lang="sv">Linux PSF-konsoltypsnitt (gzip-komprimerat)</comment>
+ <comment xml:lang="sr">слова Линуксове ПСФ конзоле (запакована гзип-ом)</comment>
+ <comment xml:lang="sq">shkronja konsole Linux PSF (ngjeshur me gzip)</comment>
+ <comment xml:lang="sl">Datoteka pisave konzole Linux PSF (skrčena z gzip)</comment>
+ <comment xml:lang="si">Linux PSF කොන්සෝල අකුරු (gzip-compressed)</comment>
+ <comment xml:lang="sk">Písmo PSF pre konzolu Linuxu (komprimované pomocou gzip)</comment>
+ <comment xml:lang="ru">Консольный шрифт Linux PSF (сжатый gzip)</comment>
+ <comment xml:lang="ro">Font consolă Linux PSF (compresie gzip)</comment>
+ <comment xml:lang="pt_BR">Fonte de console Linux PSF (compactada com gzip)</comment>
+ <comment xml:lang="pt">letra de consola Linux PSF (compressão gzip)</comment>
+ <comment xml:lang="pl">Czcionka konsoli PSF Linux (kompresja gzip)</comment>
+ <comment xml:lang="oc">poliça consòla Linux PSF (compressat gzip)</comment>
+ <comment xml:lang="nn">Linux PSF konsoll-skrifttype (gzip-pakka)</comment>
+ <comment xml:lang="nl">Linux PSF-console-lettertype (ingepakt met gzip)</comment>
+ <comment xml:lang="nb">Linux PSF konsollskrifttype (gzip-komprimert)</comment>
+ <comment xml:lang="lv">Linux PSF konsoles fonts (saspiests ar gzip)</comment>
+ <comment xml:lang="lt">Linux PSF konsolės šriftas (suglaudintas su gzip)</comment>
+ <comment xml:lang="ko">리눅스 PSF 콘솔 글꼴(GZIP 압축)</comment>
+ <comment xml:lang="kk">Linux PSF консольдік қарібі (gzip-пен сығылған)</comment>
+ <comment xml:lang="ja">Linux PSF コンソールフォント (gzip 圧縮)</comment>
+ <comment xml:lang="it">Carattere console Linux PSF (compresso con gzip)</comment>
+ <comment xml:lang="is">Linux PSF stjórnskjáaletur (gzip-þjöppað)</comment>
+ <comment xml:lang="id">Fonta konsol Linux PSF (terkompresi gzip)</comment>
+ <comment xml:lang="ia">Typo de litteras console Linux PSF (comprimite con gzip)</comment>
+ <comment xml:lang="hu">Linux PSF konzolos betűkészlet (gzip tömörítésű)</comment>
+ <comment xml:lang="hr">Linux PSF font konzolne (gzip komprimirano)</comment>
+ <comment xml:lang="he">גופן למסוף מסוג Linux PSF (מכווץ ע״י gzip)</comment>
+ <comment xml:lang="gl">tipo de fonte de consola Linux PSF (comprimida con gzip)</comment>
+ <comment xml:lang="ga">cló consóil Linux PSF (comhbhrúite le gzip)</comment>
+ <comment xml:lang="fur">caratar console Linux PSF (comprimût cun gzip)</comment>
+ <comment xml:lang="fr">police console Linux PSF (compressée gzip)</comment>
+ <comment xml:lang="fo">Linux PSF stýristøðs stavasnið (gzip-stappað)</comment>
+ <comment xml:lang="fi">Linux PSF -konsolifontti (gzip-pakattu)</comment>
+ <comment xml:lang="eu">Linux PSF kontsolako letra-tipoa (gzip-ekin konprimitua)</comment>
+ <comment xml:lang="es">tipo de letra de consola Linux PSF (comprimido con GZIP)</comment>
+ <comment xml:lang="en_GB">Linux PSF console font (gzip-compressed)</comment>
+ <comment xml:lang="el">Γραμματοσειρά κονσόλας PSF Linux (συμπιεσμένη με gzip)</comment>
+ <comment xml:lang="de">Linux-PSF-Konsolenschrift (gzip-komprimiert)</comment>
+ <comment xml:lang="da">Linux PSF-konsolskrifttype (gzip-komprimeret)</comment>
+ <comment xml:lang="cs">font PSF pro konzolu Linuxu (komprimace gzip)</comment>
+ <comment xml:lang="ca">lletra de consola PSF de Linux (amb compressió gzip)</comment>
+ <comment xml:lang="bg">Шрифт — Linux PSF, компресиран с gzip</comment>
+ <comment xml:lang="be@latin">Kansolny šryft PSF dla Linuksa (gzip-skampresavany)</comment>
+ <comment xml:lang="be">шрыфт кансолі PSF для Linux (сцісканне gzip)</comment>
+ <comment xml:lang="ar">خط كونسول PSF لينكس (مضغوط-gzip)</comment>
+ <comment xml:lang="af">Linux PSF-konsoleskriftipe (gzip-saamgepers)</comment>
+ <acronym>PSF</acronym>
+ <expanded-acronym>PC Screen Font</expanded-acronym>
<sub-class-of type="application/gzip"/>
<generic-icon name="font-x-generic"/>
<glob pattern="*.psf.gz"/>
</mime-type>
<mime-type type="application/x-font-pcf">
<comment>PCF font</comment>
- <comment xml:lang="af">PCF-skriftipe</comment>
- <comment xml:lang="ar">خط PCF</comment>
- <comment xml:lang="az">PCF yazı növü</comment>
- <comment xml:lang="be-Latn">Šryft PCF</comment>
- <comment xml:lang="bg">Шрифт — PCF</comment>
- <comment xml:lang="ca">lletra PCF</comment>
- <comment xml:lang="cs">font PCF</comment>
- <comment xml:lang="cy">Ffont PCF</comment>
- <comment xml:lang="da">PCF-skrifttype</comment>
- <comment xml:lang="de">PCF-Schrift</comment>
- <comment xml:lang="el">Γραμματοσειρά PCF</comment>
- <comment xml:lang="en-GB">PCF font</comment>
- <comment xml:lang="eo">PCF-tiparo</comment>
- <comment xml:lang="es">tipo de letra PCF</comment>
- <comment xml:lang="eu">PCF letra-tipoa</comment>
- <comment xml:lang="fi">PCF-fontti</comment>
- <comment xml:lang="fo">PCF stavasnið</comment>
- <comment xml:lang="fr">police PCF</comment>
- <comment xml:lang="fur">caratar PCF</comment>
- <comment xml:lang="ga">cló PCF</comment>
- <comment xml:lang="gl">tipo de letra PCF</comment>
- <comment xml:lang="he">גופן PCF</comment>
- <comment xml:lang="hr">PCF font</comment>
- <comment xml:lang="hu">PCF-betűkészlet</comment>
- <comment xml:lang="ia">Typo de litteras PCF</comment>
- <comment xml:lang="id">Fonta PCF</comment>
- <comment xml:lang="it">Carattere PCF</comment>
- <comment xml:lang="ja">PCF フォント</comment>
- <comment xml:lang="kk">PCF қарібі</comment>
- <comment xml:lang="ko">PCF 글꼴</comment>
- <comment xml:lang="lt">PCF šriftas</comment>
- <comment xml:lang="lv">PCF fonts</comment>
- <comment xml:lang="ms">Font PCF</comment>
- <comment xml:lang="nb">PCF-skrifttype</comment>
- <comment xml:lang="nl">PCF-lettertype</comment>
- <comment xml:lang="nn">PCF-skrifttype</comment>
- <comment xml:lang="oc">poliça PCF</comment>
- <comment xml:lang="pl">Czcionka PCF</comment>
- <comment xml:lang="pt">letra PCF</comment>
- <comment xml:lang="pt-BR">Fonte PCF</comment>
- <comment xml:lang="ro">Font PCF</comment>
- <comment xml:lang="ru">Шрифт PCF</comment>
- <comment xml:lang="sk">Písmo PCF</comment>
- <comment xml:lang="sl">Datoteka pisave PCF</comment>
- <comment xml:lang="sq">Gërma PCF</comment>
- <comment xml:lang="sr">ПЦФ слова</comment>
- <comment xml:lang="sv">PCF-typsnitt</comment>
- <comment xml:lang="tr">PCF yazı tipi</comment>
- <comment xml:lang="uk">шрифт PCF</comment>
+ <comment xml:lang="zh_TW">PCF 字型</comment>
+ <comment xml:lang="zh_CN">PCF 字体</comment>
<comment xml:lang="vi">Phông chữ PCF</comment>
- <comment xml:lang="zh-CN">PCF 字体</comment>
- <comment xml:lang="zh-TW">PCF 字型</comment>
+ <comment xml:lang="uk">шрифт PCF</comment>
+ <comment xml:lang="tr">PCF yazı tipi</comment>
+ <comment xml:lang="sv">PCF-typsnitt</comment>
+ <comment xml:lang="sr">ПЦФ слова</comment>
+ <comment xml:lang="sq">shkronja PCF</comment>
+ <comment xml:lang="sl">Datoteka pisave PCF</comment>
+ <comment xml:lang="si">PCF අකුරු</comment>
+ <comment xml:lang="sk">Písmo PCF</comment>
+ <comment xml:lang="ru">Шрифт PCF</comment>
+ <comment xml:lang="ro">Font PCF</comment>
+ <comment xml:lang="pt_BR">Fonte PCF</comment>
+ <comment xml:lang="pt">letra PCF</comment>
+ <comment xml:lang="pl">Czcionka PCF</comment>
+ <comment xml:lang="oc">poliça PCF</comment>
+ <comment xml:lang="nn">PCF-skrifttype</comment>
+ <comment xml:lang="nl">PCF-lettertype</comment>
+ <comment xml:lang="nb">PCF-skrifttype</comment>
+ <comment xml:lang="ms">Font PCF</comment>
+ <comment xml:lang="lv">PCF fonts</comment>
+ <comment xml:lang="lt">PCF šriftas</comment>
+ <comment xml:lang="ko">PCF 글꼴</comment>
+ <comment xml:lang="kk">PCF қарібі</comment>
+ <comment xml:lang="ja">PCF フォント</comment>
+ <comment xml:lang="it">Carattere PCF</comment>
+ <comment xml:lang="is">PCF letur</comment>
+ <comment xml:lang="id">Fonta PCF</comment>
+ <comment xml:lang="ia">Typo de litteras PCF</comment>
+ <comment xml:lang="hu">PCF-betűkészlet</comment>
+ <comment xml:lang="hr">PCF font</comment>
+ <comment xml:lang="he">גופן PCF</comment>
+ <comment xml:lang="gl">tipo de letra PCF</comment>
+ <comment xml:lang="ga">cló PCF</comment>
+ <comment xml:lang="fur">caratar PCF</comment>
+ <comment xml:lang="fr">police PCF</comment>
+ <comment xml:lang="fo">PCF stavasnið</comment>
+ <comment xml:lang="fi">PCF-fontti</comment>
+ <comment xml:lang="eu">PCF letra-tipoa</comment>
+ <comment xml:lang="es">tipo de letra PCF</comment>
+ <comment xml:lang="eo">PCF-tiparo</comment>
+ <comment xml:lang="en_GB">PCF font</comment>
+ <comment xml:lang="el">Γραμματοσειρά PCF</comment>
+ <comment xml:lang="de">PCF-Schrift</comment>
+ <comment xml:lang="da">PCF-skrifttype</comment>
+ <comment xml:lang="cy">Ffont PCF</comment>
+ <comment xml:lang="cs">font PCF</comment>
+ <comment xml:lang="ca">lletra PCF</comment>
+ <comment xml:lang="bg">Шрифт — PCF</comment>
+ <comment xml:lang="be@latin">Šryft PCF</comment>
+ <comment xml:lang="be">шрыфт PCF</comment>
+ <comment xml:lang="az">PCF yazı növü</comment>
+ <comment xml:lang="ar">خط PCF</comment>
+ <comment xml:lang="af">PCF-skriftipe</comment>
+ <acronym>PCF</acronym>
+ <expanded-acronym>Portable Compiled Format</expanded-acronym>
<generic-icon name="font-x-generic"/>
- <magic priority="50">
+ <magic>
<match type="string" value="\001fcp" offset="0"/>
</magic>
<glob pattern="*.pcf"/>
@@ -11671,61 +12037,64 @@ command to generate the output files.
</mime-type>
<mime-type type="font/otf">
<comment>OpenType font</comment>
- <comment xml:lang="af">OpenType-skriftipe</comment>
- <comment xml:lang="ar">خط OpenType</comment>
- <comment xml:lang="az">OpenType yazı növü</comment>
- <comment xml:lang="be-Latn">Šryft OpenType</comment>
- <comment xml:lang="bg">Шрифт — OpenType</comment>
- <comment xml:lang="ca">lletra OpenType</comment>
- <comment xml:lang="cs">font OpenType</comment>
- <comment xml:lang="cy">Ffont OpenType</comment>
- <comment xml:lang="da">OpenType-skrifttype</comment>
- <comment xml:lang="de">OpenType-Schrift</comment>
- <comment xml:lang="el">Γραμματοσειρά OpenType </comment>
- <comment xml:lang="en-GB">OpenType font</comment>
- <comment xml:lang="eo">OpenType-tiparo</comment>
- <comment xml:lang="es">tipo de letra OpenType</comment>
- <comment xml:lang="eu">OpenType letra-tipoa</comment>
- <comment xml:lang="fi">OpenType-fontti</comment>
- <comment xml:lang="fo">OpenType stavasnið</comment>
- <comment xml:lang="fr">police OpenType</comment>
- <comment xml:lang="fur">caratar OpenType</comment>
- <comment xml:lang="ga">cló OpenType</comment>
- <comment xml:lang="gl">tipo de fonte OpenType</comment>
- <comment xml:lang="he">גופן של OpenType</comment>
- <comment xml:lang="hr">OpenType font</comment>
- <comment xml:lang="hu">OpenType-betűkészlet</comment>
- <comment xml:lang="ia">Typo de litteras OpenType</comment>
- <comment xml:lang="id">Fonta OpenType</comment>
- <comment xml:lang="it">Carattere OpenType</comment>
- <comment xml:lang="ja">OpenType フォント</comment>
- <comment xml:lang="kk">OpenType қарібі</comment>
- <comment xml:lang="ko">오픈타입 글꼴</comment>
- <comment xml:lang="lt">OpenType šriftas</comment>
- <comment xml:lang="lv">OpenType fonts</comment>
- <comment xml:lang="ms">Font OpenType</comment>
- <comment xml:lang="nb">OpenType-skrifttype</comment>
- <comment xml:lang="nl">OpenType-lettertype</comment>
- <comment xml:lang="nn">OpenType-skrifttype</comment>
- <comment xml:lang="oc">poliça OpenType</comment>
- <comment xml:lang="pl">Czcionka OpenType</comment>
- <comment xml:lang="pt">letra OpenType</comment>
- <comment xml:lang="pt-BR">Fonte OpenType</comment>
- <comment xml:lang="ro">Font OpenType</comment>
- <comment xml:lang="ru">Шрифт OpenType</comment>
- <comment xml:lang="sk">Písmo OpenType</comment>
- <comment xml:lang="sl">Datoteka pisave OpenType</comment>
- <comment xml:lang="sq">Gërma OpenType</comment>
- <comment xml:lang="sr">слова Отворене Врсте</comment>
- <comment xml:lang="sv">OpenType-typsnitt</comment>
- <comment xml:lang="tr">OpenType yazı tipi</comment>
- <comment xml:lang="uk">шрифт OpenType</comment>
+ <comment xml:lang="zh_TW">OpenType 字型</comment>
+ <comment xml:lang="zh_CN">OpenType 字体</comment>
<comment xml:lang="vi">Phông chữ OpenType</comment>
- <comment xml:lang="zh-CN">OpenType 字体</comment>
- <comment xml:lang="zh-TW">OpenType 字型</comment>
+ <comment xml:lang="uk">шрифт OpenType</comment>
+ <comment xml:lang="tr">OpenType yazı tipi</comment>
+ <comment xml:lang="sv">OpenType-typsnitt</comment>
+ <comment xml:lang="sr">слова Отворене Врсте</comment>
+ <comment xml:lang="sq">shkronja OpenType</comment>
+ <comment xml:lang="sl">Datoteka pisave OpenType</comment>
+ <comment xml:lang="si">OpenType අකුරු</comment>
+ <comment xml:lang="sk">Písmo OpenType</comment>
+ <comment xml:lang="ru">Шрифт OpenType</comment>
+ <comment xml:lang="ro">Font OpenType</comment>
+ <comment xml:lang="pt_BR">Fonte OpenType</comment>
+ <comment xml:lang="pt">letra OpenType</comment>
+ <comment xml:lang="pl">Czcionka OpenType</comment>
+ <comment xml:lang="oc">poliça OpenType</comment>
+ <comment xml:lang="nn">OpenType-skrifttype</comment>
+ <comment xml:lang="nl">OpenType-lettertype</comment>
+ <comment xml:lang="nb">OpenType-skrifttype</comment>
+ <comment xml:lang="ms">Font OpenType</comment>
+ <comment xml:lang="lv">OpenType fonts</comment>
+ <comment xml:lang="lt">OpenType šriftas</comment>
+ <comment xml:lang="ko">오픈타입 글꼴</comment>
+ <comment xml:lang="kk">OpenType қарібі</comment>
+ <comment xml:lang="ja">OpenType フォント</comment>
+ <comment xml:lang="it">Carattere OpenType</comment>
+ <comment xml:lang="is">Open Type letur</comment>
+ <comment xml:lang="id">Fonta OpenType</comment>
+ <comment xml:lang="ia">Typo de litteras OpenType</comment>
+ <comment xml:lang="hu">OpenType-betűkészlet</comment>
+ <comment xml:lang="hr">OpenType font</comment>
+ <comment xml:lang="he">גופן של OpenType</comment>
+ <comment xml:lang="gl">tipo de fonte OpenType</comment>
+ <comment xml:lang="ga">cló OpenType</comment>
+ <comment xml:lang="fur">caratar OpenType</comment>
+ <comment xml:lang="fr">police OpenType</comment>
+ <comment xml:lang="fo">OpenType stavasnið</comment>
+ <comment xml:lang="fi">OpenType-fontti</comment>
+ <comment xml:lang="eu">OpenType letra-tipoa</comment>
+ <comment xml:lang="es">tipo de letra OpenType</comment>
+ <comment xml:lang="eo">OpenType-tiparo</comment>
+ <comment xml:lang="en_GB">OpenType font</comment>
+ <comment xml:lang="el">Γραμματοσειρά OpenType </comment>
+ <comment xml:lang="de">OpenType-Schrift</comment>
+ <comment xml:lang="da">OpenType-skrifttype</comment>
+ <comment xml:lang="cy">Ffont OpenType</comment>
+ <comment xml:lang="cs">font OpenType</comment>
+ <comment xml:lang="ca">lletra OpenType</comment>
+ <comment xml:lang="bg">Шрифт — OpenType</comment>
+ <comment xml:lang="be@latin">Šryft OpenType</comment>
+ <comment xml:lang="be">шрыфт OpenType</comment>
+ <comment xml:lang="az">OpenType yazı növü</comment>
+ <comment xml:lang="ar">خط OpenType</comment>
+ <comment xml:lang="af">OpenType-skriftipe</comment>
<sub-class-of type="font/ttf"/>
<generic-icon name="font-x-generic"/>
- <magic priority="50">
+ <magic>
<match type="string" value="OTTO" offset="0"/>
</magic>
<glob pattern="*.otf"/>
@@ -11733,181 +12102,213 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-font-speedo">
<comment>Speedo font</comment>
- <comment xml:lang="af">Speedo-skriftipe</comment>
- <comment xml:lang="ar">خط Speedo</comment>
- <comment xml:lang="az">Speedo yazı növü</comment>
- <comment xml:lang="be-Latn">Šryft Speedo</comment>
- <comment xml:lang="bg">Шрифт — Speedo</comment>
- <comment xml:lang="ca">lletra Speedo</comment>
- <comment xml:lang="cs">font Speedo</comment>
- <comment xml:lang="cy">Ffont Speedo</comment>
- <comment xml:lang="da">Speedoskrifttype</comment>
- <comment xml:lang="de">Speedo-Schrift</comment>
- <comment xml:lang="el">Γραμματοσειρά Speedo</comment>
- <comment xml:lang="en-GB">Speedo font</comment>
- <comment xml:lang="eo">Speedo-tiparo</comment>
- <comment xml:lang="es">tipo de letra de Speedo</comment>
- <comment xml:lang="eu">Speedo letra-tipoa</comment>
- <comment xml:lang="fi">Speedo-fontti</comment>
- <comment xml:lang="fo">Speedo stavasnið</comment>
- <comment xml:lang="fr">police Speedo</comment>
- <comment xml:lang="fur">caratar Speedo</comment>
- <comment xml:lang="ga">cló Speedo</comment>
- <comment xml:lang="gl">tipo de letra Speedo</comment>
- <comment xml:lang="he">גופן של Speedo</comment>
- <comment xml:lang="hr">Speedo font</comment>
- <comment xml:lang="hu">Speedo-betűkészlet</comment>
- <comment xml:lang="ia">Typo de litteras Speedo</comment>
- <comment xml:lang="id">Fonta Speedo</comment>
- <comment xml:lang="it">Carattere Speedo</comment>
- <comment xml:lang="ja">Speedo フォント</comment>
- <comment xml:lang="kk">Speedo қарібі</comment>
- <comment xml:lang="ko">Speedo 글꼴</comment>
- <comment xml:lang="lt">Speedo šriftas</comment>
- <comment xml:lang="lv">Speedo fonts</comment>
- <comment xml:lang="ms">Font Speedo</comment>
- <comment xml:lang="nb">Speedo-skrifttype</comment>
- <comment xml:lang="nl">Speedo-lettertype</comment>
- <comment xml:lang="nn">Speedo-skrifttype</comment>
- <comment xml:lang="oc">poliça Speedo</comment>
- <comment xml:lang="pl">Czcionka Speedo</comment>
- <comment xml:lang="pt">letra Speedo</comment>
- <comment xml:lang="pt-BR">Fonte Speedo</comment>
- <comment xml:lang="ro">Font Speedo</comment>
- <comment xml:lang="ru">Шрифт Speedo</comment>
- <comment xml:lang="sk">Písmo Speedo</comment>
- <comment xml:lang="sl">Datoteka pisave Speedo</comment>
- <comment xml:lang="sq">Gërma Speedo</comment>
- <comment xml:lang="sr">Спидо слова</comment>
- <comment xml:lang="sv">Speedo-typsnitt</comment>
- <comment xml:lang="tr">Speedo yazı tipi</comment>
- <comment xml:lang="uk">шрифт Speedo</comment>
+ <comment xml:lang="zh_TW">Speedo 字型</comment>
+ <comment xml:lang="zh_CN">Speedo 字体</comment>
<comment xml:lang="vi">Phông chữ Speedo</comment>
- <comment xml:lang="zh-CN">Speedo 字体</comment>
- <comment xml:lang="zh-TW">Speedo 字型</comment>
+ <comment xml:lang="uk">шрифт Speedo</comment>
+ <comment xml:lang="tr">Speedo yazı tipi</comment>
+ <comment xml:lang="sv">Speedo-typsnitt</comment>
+ <comment xml:lang="sr">Спидо слова</comment>
+ <comment xml:lang="sq">shkronja Speedo</comment>
+ <comment xml:lang="sl">Datoteka pisave Speedo</comment>
+ <comment xml:lang="si">ස්පීඩෝ අකුරු</comment>
+ <comment xml:lang="sk">Písmo Speedo</comment>
+ <comment xml:lang="ru">Шрифт Speedo</comment>
+ <comment xml:lang="ro">Font Speedo</comment>
+ <comment xml:lang="pt_BR">Fonte Speedo</comment>
+ <comment xml:lang="pt">letra Speedo</comment>
+ <comment xml:lang="pl">Czcionka Speedo</comment>
+ <comment xml:lang="oc">poliça Speedo</comment>
+ <comment xml:lang="nn">Speedo-skrifttype</comment>
+ <comment xml:lang="nl">Speedo-lettertype</comment>
+ <comment xml:lang="nb">Speedo-skrifttype</comment>
+ <comment xml:lang="ms">Font Speedo</comment>
+ <comment xml:lang="lv">Speedo fonts</comment>
+ <comment xml:lang="lt">Speedo šriftas</comment>
+ <comment xml:lang="ko">Speedo 글꼴</comment>
+ <comment xml:lang="kk">Speedo қарібі</comment>
+ <comment xml:lang="ja">Speedo フォント</comment>
+ <comment xml:lang="it">Carattere Speedo</comment>
+ <comment xml:lang="is">Speedo letur</comment>
+ <comment xml:lang="id">Fonta Speedo</comment>
+ <comment xml:lang="ia">Typo de litteras Speedo</comment>
+ <comment xml:lang="hu">Speedo-betűkészlet</comment>
+ <comment xml:lang="hr">Speedo font</comment>
+ <comment xml:lang="he">גופן של Speedo</comment>
+ <comment xml:lang="gl">tipo de letra Speedo</comment>
+ <comment xml:lang="ga">cló Speedo</comment>
+ <comment xml:lang="fur">caratar Speedo</comment>
+ <comment xml:lang="fr">police Speedo</comment>
+ <comment xml:lang="fo">Speedo stavasnið</comment>
+ <comment xml:lang="fi">Speedo-fontti</comment>
+ <comment xml:lang="eu">Speedo letra-tipoa</comment>
+ <comment xml:lang="es">tipo de letra de Speedo</comment>
+ <comment xml:lang="eo">Speedo-tiparo</comment>
+ <comment xml:lang="en_GB">Speedo font</comment>
+ <comment xml:lang="el">Γραμματοσειρά Speedo</comment>
+ <comment xml:lang="de">Speedo-Schrift</comment>
+ <comment xml:lang="da">Speedoskrifttype</comment>
+ <comment xml:lang="cy">Ffont Speedo</comment>
+ <comment xml:lang="cs">font Speedo</comment>
+ <comment xml:lang="ca">lletra Speedo</comment>
+ <comment xml:lang="bg">Шрифт — Speedo</comment>
+ <comment xml:lang="be@latin">Šryft Speedo</comment>
+ <comment xml:lang="be">шрыфт Speedo</comment>
+ <comment xml:lang="az">Speedo yazı növü</comment>
+ <comment xml:lang="ar">خط Speedo</comment>
+ <comment xml:lang="af">Speedo-skriftipe</comment>
<generic-icon name="font-x-generic"/>
- <magic priority="50">
+ <magic>
<match type="string" value="D1.0\015" offset="0"/>
</magic>
<glob pattern="*.spd"/>
</mime-type>
<mime-type type="application/x-font-sunos-news">
<comment>SunOS News font</comment>
- <comment xml:lang="af">SunOS News-skriftipe</comment>
- <comment xml:lang="ar">خط SunOS News</comment>
- <comment xml:lang="az">SunOS News yazı növü</comment>
- <comment xml:lang="be-Latn">Šryft SunOS News</comment>
- <comment xml:lang="bg">Шрифт — SunOS News</comment>
- <comment xml:lang="ca">lletra News de SunOS</comment>
- <comment xml:lang="cs">font SunOS News</comment>
- <comment xml:lang="cy">Ffont SunOS News</comment>
- <comment xml:lang="da">SunOS News-skrifttype</comment>
- <comment xml:lang="de">SunOS-News-Schrift</comment>
- <comment xml:lang="el">Γραμματοσειρά SunOS News</comment>
- <comment xml:lang="en-GB">SunOS News font</comment>
- <comment xml:lang="eo">tiparo de SunOS News</comment>
- <comment xml:lang="es">tipo de letra para NeWS de SunOS</comment>
- <comment xml:lang="eu">SunOs News letra-tipoa</comment>
- <comment xml:lang="fi">SunOS News -fontti</comment>
- <comment xml:lang="fo">SunOS News stavasnið</comment>
- <comment xml:lang="fr">police SunOS News</comment>
- <comment xml:lang="fur">caratar SunOS News</comment>
- <comment xml:lang="ga">cló SunOS News</comment>
- <comment xml:lang="gl">tipo de letra SunOS News</comment>
- <comment xml:lang="he">גופן של SunOS News</comment>
- <comment xml:lang="hr">SunOS News font</comment>
- <comment xml:lang="hu">SunOS News-betűkészlet</comment>
- <comment xml:lang="ia">Typo de litteras SunOS News</comment>
- <comment xml:lang="id">Fonta SunOS News</comment>
- <comment xml:lang="it">Carattere SunOS News</comment>
- <comment xml:lang="ja">SunOS News フォント</comment>
- <comment xml:lang="kk">SunOS News қарібі</comment>
- <comment xml:lang="ko">SunOS News 글꼴</comment>
- <comment xml:lang="lt">SunOS News šriftas</comment>
- <comment xml:lang="lv">SunOS News fonts</comment>
- <comment xml:lang="ms">Font News SunOS</comment>
- <comment xml:lang="nb">SunOS News-skrifttype</comment>
- <comment xml:lang="nl">SunOS News-lettertype</comment>
- <comment xml:lang="nn">SunOS NEWS-skrifttype</comment>
- <comment xml:lang="oc">poliça SunOS News</comment>
- <comment xml:lang="pl">Czcionka SunOS News</comment>
- <comment xml:lang="pt">letra SunOS News</comment>
- <comment xml:lang="pt-BR">Fonte SunOS News</comment>
- <comment xml:lang="ro">Font SunOS News</comment>
- <comment xml:lang="ru">Шрифт SunOS News</comment>
- <comment xml:lang="sk">Písmo SunOS News</comment>
- <comment xml:lang="sl">Datoteka pisave SunOS News</comment>
- <comment xml:lang="sq">Gërma SunOS News</comment>
- <comment xml:lang="sr">слова СанОС Њуза</comment>
- <comment xml:lang="sv">SunOS News-typsnitt</comment>
- <comment xml:lang="tr">SunOS News yazı tipi</comment>
- <comment xml:lang="uk">шрифт SunOS News</comment>
+ <comment xml:lang="zh_TW">SunOS News 字型</comment>
+ <comment xml:lang="zh_CN">SunOS News 字体</comment>
<comment xml:lang="vi">Phông chữ SunOS News</comment>
- <comment xml:lang="zh-CN">SunOS News 字体</comment>
- <comment xml:lang="zh-TW">SunOS News 字型</comment>
+ <comment xml:lang="uk">шрифт SunOS News</comment>
+ <comment xml:lang="tr">SunOS News yazı tipi</comment>
+ <comment xml:lang="sv">SunOS News-typsnitt</comment>
+ <comment xml:lang="sr">слова СанОС Њуза</comment>
+ <comment xml:lang="sq">shkronja SunOS News</comment>
+ <comment xml:lang="sl">Datoteka pisave SunOS News</comment>
+ <comment xml:lang="si">SunOS News අකුරු</comment>
+ <comment xml:lang="sk">Písmo SunOS News</comment>
+ <comment xml:lang="ru">Шрифт SunOS News</comment>
+ <comment xml:lang="ro">Font SunOS News</comment>
+ <comment xml:lang="pt_BR">Fonte SunOS News</comment>
+ <comment xml:lang="pt">letra SunOS News</comment>
+ <comment xml:lang="pl">Czcionka SunOS News</comment>
+ <comment xml:lang="oc">poliça SunOS News</comment>
+ <comment xml:lang="nn">SunOS NEWS-skrifttype</comment>
+ <comment xml:lang="nl">SunOS News-lettertype</comment>
+ <comment xml:lang="nb">SunOS News-skrifttype</comment>
+ <comment xml:lang="ms">Font News SunOS</comment>
+ <comment xml:lang="lv">SunOS News fonts</comment>
+ <comment xml:lang="lt">SunOS News šriftas</comment>
+ <comment xml:lang="ko">SunOS News 글꼴</comment>
+ <comment xml:lang="kk">SunOS News қарібі</comment>
+ <comment xml:lang="ja">SunOS News フォント</comment>
+ <comment xml:lang="it">Carattere SunOS News</comment>
+ <comment xml:lang="is">SunOS News letur</comment>
+ <comment xml:lang="id">Fonta SunOS News</comment>
+ <comment xml:lang="ia">Typo de litteras SunOS News</comment>
+ <comment xml:lang="hu">SunOS News-betűkészlet</comment>
+ <comment xml:lang="hr">SunOS News font</comment>
+ <comment xml:lang="he">גופן של SunOS News</comment>
+ <comment xml:lang="gl">tipo de letra SunOS News</comment>
+ <comment xml:lang="ga">cló SunOS News</comment>
+ <comment xml:lang="fur">caratar SunOS News</comment>
+ <comment xml:lang="fr">police SunOS News</comment>
+ <comment xml:lang="fo">SunOS News stavasnið</comment>
+ <comment xml:lang="fi">SunOS News -fontti</comment>
+ <comment xml:lang="eu">SunOs News letra-tipoa</comment>
+ <comment xml:lang="es">tipo de letra para NeWS de SunOS</comment>
+ <comment xml:lang="eo">tiparo de SunOS News</comment>
+ <comment xml:lang="en_GB">SunOS News font</comment>
+ <comment xml:lang="el">Γραμματοσειρά SunOS News</comment>
+ <comment xml:lang="de">SunOS-NeWS-Schrift</comment>
+ <comment xml:lang="da">SunOS News-skrifttype</comment>
+ <comment xml:lang="cy">Ffont SunOS News</comment>
+ <comment xml:lang="cs">font SunOS News</comment>
+ <comment xml:lang="ca">lletra News de SunOS</comment>
+ <comment xml:lang="bg">Шрифт — SunOS News</comment>
+ <comment xml:lang="be@latin">Šryft SunOS News</comment>
+ <comment xml:lang="be">шрыфт SunOS News</comment>
+ <comment xml:lang="az">SunOS News yazı növü</comment>
+ <comment xml:lang="ar">خط SunOS News</comment>
+ <comment xml:lang="af">SunOS News-skriftipe</comment>
<generic-icon name="font-x-generic"/>
- <magic priority="50">
+ <magic>
<match type="string" value="StartFont" offset="0"/>
<match type="string" value="\x13\x7A\x29" offset="0"/>
<match type="string" value="\x13\x7A\x2B" offset="8"/>
</magic>
</mime-type>
+ <mime-type type="application/font-tdpfr">
+ <comment>TDPFR font</comment>
+ <comment xml:lang="uk">шрифт TDPFR</comment>
+ <comment xml:lang="sv">TDPFR-typsnitt</comment>
+ <comment xml:lang="ru">Шрифт TDPFR</comment>
+ <comment xml:lang="pt_BR">Fonte TDPFR</comment>
+ <comment xml:lang="pl">Czcionka TDPFR</comment>
+ <comment xml:lang="it">Carattere TDPFR</comment>
+ <comment xml:lang="gl">Tipo de letra TDPFR</comment>
+ <comment xml:lang="eu">TDPFR letra-tipoa</comment>
+ <comment xml:lang="es">tipo de letra TDPFR</comment>
+ <comment xml:lang="de">TDPFR-Schrift</comment>
+ <comment xml:lang="be">шрыфт TDPFR</comment>
+ <acronym>TDPFR</acronym>
+ <expanded-acronym>TrueDoc Portable Font Resource</expanded-acronym>
+ <generic-icon name="font-x-generic"/>
+ <magic>
+ <match type="big32" value="0x50465230" offset="0"/>
+ <match type="big32" value="0x50465231" offset="0"/>
+ </magic>
+ <glob pattern="*.pfr"/>
+ <alias type="application/vnd.truedoc"/>
+ </mime-type>
<mime-type type="application/x-font-tex">
<comment>TeX font</comment>
- <comment xml:lang="af">TeX-skriftipe</comment>
- <comment xml:lang="ar">خط TeX</comment>
- <comment xml:lang="az">TeX yazı növü</comment>
- <comment xml:lang="be-Latn">Šryft TeX</comment>
- <comment xml:lang="bg">Шрифт — TeX</comment>
- <comment xml:lang="ca">lletra TeX</comment>
- <comment xml:lang="cs">font TeX</comment>
- <comment xml:lang="cy">Ffont TeX</comment>
- <comment xml:lang="da">TeX-skrifttype</comment>
- <comment xml:lang="de">TeX-Schrift</comment>
- <comment xml:lang="el">Γραμματοσειρά TeX</comment>
- <comment xml:lang="en-GB">TeX font</comment>
- <comment xml:lang="eo">TeX-tiparo</comment>
- <comment xml:lang="es">tipo de letra de TeX</comment>
- <comment xml:lang="eu">TeX letra-tipoa</comment>
- <comment xml:lang="fi">TeX-fontti</comment>
- <comment xml:lang="fo">TeX stavasnið</comment>
- <comment xml:lang="fr">police TeX</comment>
- <comment xml:lang="fur">caratar TeX</comment>
- <comment xml:lang="ga">cló TeX</comment>
- <comment xml:lang="gl">tipo de letra de TeX</comment>
- <comment xml:lang="he">גופן TeX</comment>
- <comment xml:lang="hr">TeX font</comment>
- <comment xml:lang="hu">TeX-betűkészlet</comment>
- <comment xml:lang="ia">Typo de litteras TeX</comment>
- <comment xml:lang="id">Fonta TeX</comment>
- <comment xml:lang="it">Carattere TeX</comment>
- <comment xml:lang="ja">TeX フォント</comment>
- <comment xml:lang="kk">TeX қарібі</comment>
- <comment xml:lang="ko">TeX 글꼴</comment>
- <comment xml:lang="lt">TeX šriftas</comment>
- <comment xml:lang="lv">TeX fonts</comment>
- <comment xml:lang="ms">Font TeX</comment>
- <comment xml:lang="nb">TeX-skrift</comment>
- <comment xml:lang="nl">TeX-lettertype</comment>
- <comment xml:lang="nn">TeX-skrifttype</comment>
- <comment xml:lang="oc">poliça TeX</comment>
- <comment xml:lang="pl">Czcionka TeX</comment>
- <comment xml:lang="pt">letra TeX</comment>
- <comment xml:lang="pt-BR">Fonte TeX</comment>
- <comment xml:lang="ro">Font TeX</comment>
- <comment xml:lang="ru">Шрифт TeX</comment>
- <comment xml:lang="sk">Písmo TeX</comment>
- <comment xml:lang="sl">Datoteka pisave TeX</comment>
- <comment xml:lang="sq">Gërma TeX</comment>
- <comment xml:lang="sr">ТеКс слова</comment>
- <comment xml:lang="sv">TeX-typsnitt</comment>
- <comment xml:lang="tr">TeX yazı tipi</comment>
- <comment xml:lang="uk">шрифт TeX</comment>
+ <comment xml:lang="zh_TW">TeX 字型</comment>
+ <comment xml:lang="zh_CN">TeX 字体</comment>
<comment xml:lang="vi">Phông chữ TeX</comment>
- <comment xml:lang="zh-CN">TeX 字体</comment>
- <comment xml:lang="zh-TW">TeX 字型</comment>
+ <comment xml:lang="uk">шрифт TeX</comment>
+ <comment xml:lang="tr">TeX yazı tipi</comment>
+ <comment xml:lang="sv">TeX-typsnitt</comment>
+ <comment xml:lang="sr">ТеКс слова</comment>
+ <comment xml:lang="sq">shkronja TeX</comment>
+ <comment xml:lang="sl">Datoteka pisave TeX</comment>
+ <comment xml:lang="si">TeX අකුරු</comment>
+ <comment xml:lang="sk">Písmo TeX</comment>
+ <comment xml:lang="ru">Шрифт TeX</comment>
+ <comment xml:lang="ro">Font TeX</comment>
+ <comment xml:lang="pt_BR">Fonte TeX</comment>
+ <comment xml:lang="pt">letra TeX</comment>
+ <comment xml:lang="pl">Czcionka TeX</comment>
+ <comment xml:lang="oc">poliça TeX</comment>
+ <comment xml:lang="nn">TeX-skrifttype</comment>
+ <comment xml:lang="nl">TeX-lettertype</comment>
+ <comment xml:lang="nb">TeX-skrift</comment>
+ <comment xml:lang="ms">Font TeX</comment>
+ <comment xml:lang="lv">TeX fonts</comment>
+ <comment xml:lang="lt">TeX šriftas</comment>
+ <comment xml:lang="ko">TeX 글꼴</comment>
+ <comment xml:lang="kk">TeX қарібі</comment>
+ <comment xml:lang="ja">TeX フォント</comment>
+ <comment xml:lang="it">Carattere TeX</comment>
+ <comment xml:lang="is">TeX letur</comment>
+ <comment xml:lang="id">Fonta TeX</comment>
+ <comment xml:lang="ia">Typo de litteras TeX</comment>
+ <comment xml:lang="hu">TeX-betűkészlet</comment>
+ <comment xml:lang="hr">TeX font</comment>
+ <comment xml:lang="he">גופן TeX</comment>
+ <comment xml:lang="gl">tipo de letra de TeX</comment>
+ <comment xml:lang="ga">cló TeX</comment>
+ <comment xml:lang="fur">caratar TeX</comment>
+ <comment xml:lang="fr">police TeX</comment>
+ <comment xml:lang="fo">TeX stavasnið</comment>
+ <comment xml:lang="fi">TeX-fontti</comment>
+ <comment xml:lang="eu">TeX letra-tipoa</comment>
+ <comment xml:lang="es">tipo de letra de TeX</comment>
+ <comment xml:lang="eo">TeX-tiparo</comment>
+ <comment xml:lang="en_GB">TeX font</comment>
+ <comment xml:lang="el">Γραμματοσειρά TeX</comment>
+ <comment xml:lang="de">TeX-Schrift</comment>
+ <comment xml:lang="da">TeX-skrifttype</comment>
+ <comment xml:lang="cy">Ffont TeX</comment>
+ <comment xml:lang="cs">font TeX</comment>
+ <comment xml:lang="ca">lletra TeX</comment>
+ <comment xml:lang="bg">Шрифт — TeX</comment>
+ <comment xml:lang="be@latin">Šryft TeX</comment>
+ <comment xml:lang="be">шрыфт TeX</comment>
+ <comment xml:lang="az">TeX yazı növü</comment>
+ <comment xml:lang="ar">خط TeX</comment>
+ <comment xml:lang="af">TeX-skriftipe</comment>
<generic-icon name="font-x-generic"/>
- <magic priority="50">
+ <magic>
<match type="string" value="\367\203" offset="0"/>
<match type="string" value="\367\131" offset="0"/>
<match type="string" value="\367\312" offset="0"/>
@@ -11915,117 +12316,123 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-font-tex-tfm">
<comment>TeX font metrics</comment>
- <comment xml:lang="af">TeX-skriftipeafmetings</comment>
- <comment xml:lang="ar">مقاييس خط TeX</comment>
- <comment xml:lang="az">TeX yazı növü metrikləri</comment>
- <comment xml:lang="be-Latn">Metryka šryftu TeX</comment>
- <comment xml:lang="bg">Шрифтова метрика — TeX</comment>
- <comment xml:lang="ca">mètrica de lletra de TeX</comment>
- <comment xml:lang="cs">metrika fontu TeX</comment>
- <comment xml:lang="cy">Metrigau Ffont TeX</comment>
- <comment xml:lang="da">TeX-skrifttypeinformation</comment>
- <comment xml:lang="de">TeX-Schriftmetriken</comment>
- <comment xml:lang="el">Μετρικά γραμματοσειράς TeX</comment>
- <comment xml:lang="en-GB">TeX font metrics</comment>
- <comment xml:lang="eo">metrikoj de TeX-tiparo</comment>
- <comment xml:lang="es">métricas tipográficas de TeX</comment>
- <comment xml:lang="eu">TeX letra-tipoen neurriak</comment>
- <comment xml:lang="fi">TeX-fonttimitat</comment>
- <comment xml:lang="fr">métriques de police TeX</comment>
- <comment xml:lang="fur">metrichis caratar TeX</comment>
- <comment xml:lang="ga">meadarachtaí cló TeX</comment>
- <comment xml:lang="gl">Métricas de tipo de letra de TeX</comment>
- <comment xml:lang="he">ממדי גופן של TeX</comment>
- <comment xml:lang="hr">Metrika TeX fonta</comment>
- <comment xml:lang="hu">TeX-betűmetrika</comment>
- <comment xml:lang="ia">Metricas de typo de litteras TeX</comment>
- <comment xml:lang="id">Fonta metrik TeX</comment>
- <comment xml:lang="it">Metriche tipo carattere TeX</comment>
- <comment xml:lang="ja">TeX フォントメトリック</comment>
- <comment xml:lang="kk">TeX қаріп метрикалары</comment>
- <comment xml:lang="ko">TeX 글꼴 메트릭</comment>
- <comment xml:lang="lt">TeX šriftų metrika</comment>
- <comment xml:lang="lv">TeX fonta metrikas</comment>
- <comment xml:lang="ms">Metrik font TeX</comment>
- <comment xml:lang="nb">TeX skrifttypemetrikk</comment>
- <comment xml:lang="nl">TeX-lettertype-metrieken</comment>
- <comment xml:lang="nn">TeX skrifttypemetrikk</comment>
- <comment xml:lang="oc">metricas de poliça TeX</comment>
- <comment xml:lang="pl">Metryki czcionki TeX</comment>
- <comment xml:lang="pt">métricas de letra TeX</comment>
- <comment xml:lang="pt-BR">Métrica de fonte TeX</comment>
- <comment xml:lang="ro">Dimensiuni font TeX</comment>
- <comment xml:lang="ru">Метрика шрифта TeX</comment>
- <comment xml:lang="sk">Metrika písma TeX</comment>
- <comment xml:lang="sl">Matrika pisave Tex</comment>
- <comment xml:lang="sq">Gërma TeX metrics</comment>
- <comment xml:lang="sr">метрика слова ТеКс-а</comment>
- <comment xml:lang="sv">TeX-typsnittsmetrik</comment>
- <comment xml:lang="tr">TeX yazı tipi ölçüleri</comment>
- <comment xml:lang="uk">метрики шрифту TeX</comment>
+ <comment xml:lang="zh_TW">TeX 字型描述檔</comment>
+ <comment xml:lang="zh_CN">TeX 字体规格</comment>
<comment xml:lang="vi">Cách đo phông chữ TeX</comment>
- <comment xml:lang="zh-CN">TeX 字体规格</comment>
- <comment xml:lang="zh-TW">TeX 字型描述檔</comment>
+ <comment xml:lang="uk">метрики шрифту TeX</comment>
+ <comment xml:lang="tr">TeX yazı tipi ölçüleri</comment>
+ <comment xml:lang="sv">TeX-typsnittsmetrik</comment>
+ <comment xml:lang="sr">метрика слова ТеКс-а</comment>
+ <comment xml:lang="sq">vlera shkronjash TeX</comment>
+ <comment xml:lang="sl">Matrika pisave Tex</comment>
+ <comment xml:lang="si">TeX අකුරු ප්‍රමිතික</comment>
+ <comment xml:lang="sk">Metrika písma TeX</comment>
+ <comment xml:lang="ru">Метрика шрифта TeX</comment>
+ <comment xml:lang="ro">Dimensiuni font TeX</comment>
+ <comment xml:lang="pt_BR">Métrica de fonte TeX</comment>
+ <comment xml:lang="pt">métricas de letra TeX</comment>
+ <comment xml:lang="pl">Metryki czcionki TeX</comment>
+ <comment xml:lang="oc">metricas de poliça TeX</comment>
+ <comment xml:lang="nn">TeX skrifttypemetrikk</comment>
+ <comment xml:lang="nl">TeX-lettertype-metrieken</comment>
+ <comment xml:lang="nb">TeX skrifttypemetrikk</comment>
+ <comment xml:lang="ms">Metrik font TeX</comment>
+ <comment xml:lang="lv">TeX fonta metrikas</comment>
+ <comment xml:lang="lt">TeX šriftų metrika</comment>
+ <comment xml:lang="ko">TeX 글꼴 메트릭</comment>
+ <comment xml:lang="kk">TeX қаріп метрикалары</comment>
+ <comment xml:lang="ja">TeX フォントメトリック</comment>
+ <comment xml:lang="it">Metriche tipo carattere TeX</comment>
+ <comment xml:lang="is">TeX leturupplýsingar</comment>
+ <comment xml:lang="id">Fonta metrik TeX</comment>
+ <comment xml:lang="ia">Metricas de typo de litteras TeX</comment>
+ <comment xml:lang="hu">TeX-betűmetrika</comment>
+ <comment xml:lang="hr">Metrika TeX fonta</comment>
+ <comment xml:lang="he">ממדי גופן של TeX</comment>
+ <comment xml:lang="gl">Métricas de tipo de letra de TeX</comment>
+ <comment xml:lang="ga">meadarachtaí cló TeX</comment>
+ <comment xml:lang="fur">metrichis caratar TeX</comment>
+ <comment xml:lang="fr">métriques de police TeX</comment>
+ <comment xml:lang="fi">TeX-fonttimitat</comment>
+ <comment xml:lang="eu">TeX letra-tipoen neurriak</comment>
+ <comment xml:lang="es">métricas tipográficas de TeX</comment>
+ <comment xml:lang="eo">metrikoj de TeX-tiparo</comment>
+ <comment xml:lang="en_GB">TeX font metrics</comment>
+ <comment xml:lang="el">Μετρικά γραμματοσειράς TeX</comment>
+ <comment xml:lang="de">TeX-Schriftmetriken</comment>
+ <comment xml:lang="da">TeX-skrifttypeinformation</comment>
+ <comment xml:lang="cy">Metrigau Ffont TeX</comment>
+ <comment xml:lang="cs">metrika fontu TeX</comment>
+ <comment xml:lang="ca">mètrica de lletra de TeX</comment>
+ <comment xml:lang="bg">Шрифтова метрика — TeX</comment>
+ <comment xml:lang="be@latin">Metryka šryftu TeX</comment>
+ <comment xml:lang="be">метрыкі шрыфту TeX</comment>
+ <comment xml:lang="az">TeX yazı növü metrikləri</comment>
+ <comment xml:lang="ar">مقاييس خط TeX</comment>
+ <comment xml:lang="af">TeX-skriftipeafmetings</comment>
<generic-icon name="font-x-generic"/>
- <magic priority="50">
+ <magic>
<match type="string" value="\000\021" offset="2"/>
<match type="string" value="\000\022" offset="2"/>
</magic>
</mime-type>
<mime-type type="font/ttf">
<comment>TrueType font</comment>
- <comment xml:lang="af">TrueType-skriftipe</comment>
- <comment xml:lang="ar">خط TrueType</comment>
- <comment xml:lang="be-Latn">Šryft TrueType</comment>
- <comment xml:lang="bg">Шрифт — TrueType</comment>
- <comment xml:lang="ca">lletra TrueType</comment>
- <comment xml:lang="cs">font TrueType</comment>
- <comment xml:lang="da">TrueType-skrifttype</comment>
- <comment xml:lang="de">TrueType-Schrift</comment>
- <comment xml:lang="el">Γραμματοσειρά TrueType</comment>
- <comment xml:lang="en-GB">TrueType font</comment>
- <comment xml:lang="eo">TrueType-tiparo</comment>
- <comment xml:lang="es">tipo de letra TrueType</comment>
- <comment xml:lang="eu">TrueType letra-tipoa</comment>
- <comment xml:lang="fi">TrueType-fontti</comment>
- <comment xml:lang="fo">TrueType stavasnið</comment>
- <comment xml:lang="fr">police Truetype</comment>
- <comment xml:lang="fur">caratar TrueType</comment>
- <comment xml:lang="ga">cló TrueType</comment>
- <comment xml:lang="gl">tipo de letra TrueType</comment>
- <comment xml:lang="he">גופן מסוג TrueType</comment>
- <comment xml:lang="hr">TrueType font</comment>
- <comment xml:lang="hu">TrueType-betűkészlet</comment>
- <comment xml:lang="ia">Typo de litteras TrueType</comment>
- <comment xml:lang="id">Fonta TrueType</comment>
- <comment xml:lang="it">Carattere TrueType</comment>
- <comment xml:lang="ja">TrueType フォント</comment>
- <comment xml:lang="kk">TrueType қарібі</comment>
- <comment xml:lang="ko">트루타입 글꼴</comment>
- <comment xml:lang="lt">TrueType šriftas</comment>
- <comment xml:lang="lv">TrueType fonts</comment>
- <comment xml:lang="ms">Font TrueType</comment>
- <comment xml:lang="nb">TrueType-skrift</comment>
- <comment xml:lang="nl">TrueType-lettertype</comment>
- <comment xml:lang="nn">TrueType-skrifttype</comment>
- <comment xml:lang="oc">poliça Truetype</comment>
- <comment xml:lang="pl">Czcionka TrueType</comment>
- <comment xml:lang="pt">letra TrueType</comment>
- <comment xml:lang="pt-BR">Fonte TrueType</comment>
- <comment xml:lang="ro">Font TrueType</comment>
- <comment xml:lang="ru">Шрифт TrueType</comment>
- <comment xml:lang="sk">Písmo TrueType</comment>
- <comment xml:lang="sl">Datoteka pisave TrueType</comment>
- <comment xml:lang="sq">Lloj gërme TrueType</comment>
- <comment xml:lang="sr">Трутајп слова</comment>
- <comment xml:lang="sv">Truetype-typsnitt</comment>
- <comment xml:lang="tr">TrueType yazı tipi</comment>
- <comment xml:lang="uk">шрифт TrueType</comment>
+ <comment xml:lang="zh_TW">TrueType 字型</comment>
+ <comment xml:lang="zh_CN">TrueType 字体</comment>
<comment xml:lang="vi">Phông chữ TrueType</comment>
- <comment xml:lang="zh-CN">TrueType 字体</comment>
- <comment xml:lang="zh-TW">TrueType 字型</comment>
+ <comment xml:lang="uk">шрифт TrueType</comment>
+ <comment xml:lang="tr">TrueType yazı tipi</comment>
+ <comment xml:lang="sv">Truetype-typsnitt</comment>
+ <comment xml:lang="sr">Трутајп слова</comment>
+ <comment xml:lang="sq">shkronja TrueType</comment>
+ <comment xml:lang="sl">Datoteka pisave TrueType</comment>
+ <comment xml:lang="si">TrueType අකුරු</comment>
+ <comment xml:lang="sk">Písmo TrueType</comment>
+ <comment xml:lang="ru">Шрифт TrueType</comment>
+ <comment xml:lang="ro">Font TrueType</comment>
+ <comment xml:lang="pt_BR">Fonte TrueType</comment>
+ <comment xml:lang="pt">letra TrueType</comment>
+ <comment xml:lang="pl">Czcionka TrueType</comment>
+ <comment xml:lang="oc">poliça Truetype</comment>
+ <comment xml:lang="nn">TrueType-skrifttype</comment>
+ <comment xml:lang="nl">TrueType-lettertype</comment>
+ <comment xml:lang="nb">TrueType-skrift</comment>
+ <comment xml:lang="ms">Font TrueType</comment>
+ <comment xml:lang="lv">TrueType fonts</comment>
+ <comment xml:lang="lt">TrueType šriftas</comment>
+ <comment xml:lang="ko">트루타입 글꼴</comment>
+ <comment xml:lang="kk">TrueType қарібі</comment>
+ <comment xml:lang="ja">TrueType フォント</comment>
+ <comment xml:lang="it">Carattere TrueType</comment>
+ <comment xml:lang="is">TrueType letur</comment>
+ <comment xml:lang="id">Fonta TrueType</comment>
+ <comment xml:lang="ia">Typo de litteras TrueType</comment>
+ <comment xml:lang="hu">TrueType-betűkészlet</comment>
+ <comment xml:lang="hr">TrueType font</comment>
+ <comment xml:lang="he">גופן מסוג TrueType</comment>
+ <comment xml:lang="gl">tipo de letra TrueType</comment>
+ <comment xml:lang="ga">cló TrueType</comment>
+ <comment xml:lang="fur">caratar TrueType</comment>
+ <comment xml:lang="fr">police Truetype</comment>
+ <comment xml:lang="fo">TrueType stavasnið</comment>
+ <comment xml:lang="fi">TrueType-fontti</comment>
+ <comment xml:lang="eu">TrueType letra-tipoa</comment>
+ <comment xml:lang="es">tipo de letra TrueType</comment>
+ <comment xml:lang="eo">TrueType-tiparo</comment>
+ <comment xml:lang="en_GB">TrueType font</comment>
+ <comment xml:lang="el">Γραμματοσειρά TrueType</comment>
+ <comment xml:lang="de">TrueType-Schrift</comment>
+ <comment xml:lang="da">TrueType-skrifttype</comment>
+ <comment xml:lang="cs">font TrueType</comment>
+ <comment xml:lang="ca">lletra TrueType</comment>
+ <comment xml:lang="bg">Шрифт — TrueType</comment>
+ <comment xml:lang="be@latin">Šryft TrueType</comment>
+ <comment xml:lang="be">шрыфт TrueType</comment>
+ <comment xml:lang="ar">خط TrueType</comment>
+ <comment xml:lang="af">TrueType-skriftipe</comment>
<generic-icon name="font-x-generic"/>
- <magic priority="50">
+ <magic>
<match type="string" value="FFIL" offset="0"/>
<match type="string" value="FFIL" offset="65"/>
<match type="string" value="\000\001\000\000\000" offset="0"/>
@@ -12035,210 +12442,228 @@ command to generate the output files.
</mime-type>
<mime-type type="font/collection">
<comment>Font collection</comment>
- <comment xml:lang="af">Skriftipeversameling</comment>
- <comment xml:lang="bg">Шрифтова колекция</comment>
- <comment xml:lang="ca">ccol·lecció de lletres</comment>
- <comment xml:lang="cs">kolekce fontů</comment>
- <comment xml:lang="da">Skrifttypesamling</comment>
- <comment xml:lang="de">Schriftsammlung</comment>
- <comment xml:lang="en-GB">Font collection</comment>
- <comment xml:lang="es">colección tipográfica</comment>
- <comment xml:lang="eu">Letra-tipo bilduma</comment>
- <comment xml:lang="fi">Fonttikokoelma</comment>
- <comment xml:lang="fr">Collection de polices</comment>
- <comment xml:lang="fur">colezion di caratars</comment>
- <comment xml:lang="ga">bailiúchán clónna</comment>
- <comment xml:lang="hr">Zbirka fontova</comment>
- <comment xml:lang="hu">Betűkészlet-gyűjtemény</comment>
- <comment xml:lang="id">Koleksi fonta</comment>
- <comment xml:lang="it">Raccolta di caratteri</comment>
- <comment xml:lang="kk">Қаріптер жинағы</comment>
- <comment xml:lang="ko">글꼴 모음</comment>
- <comment xml:lang="pl">Kolekcja czcionek</comment>
- <comment xml:lang="pt">coleção de letras</comment>
- <comment xml:lang="pt-BR">coleção de fontes</comment>
- <comment xml:lang="ru">Коллекция шрифтов</comment>
- <comment xml:lang="sk">Zbierka písiem</comment>
- <comment xml:lang="sl">Zbirka pisav</comment>
- <comment xml:lang="sv">Typsnittssamling</comment>
- <comment xml:lang="tr">Yazı tipi derlemi</comment>
+ <comment xml:lang="zh_TW">字型集</comment>
+ <comment xml:lang="zh_CN">字体集</comment>
<comment xml:lang="uk">збірка шрифтів</comment>
- <comment xml:lang="zh-CN">字体集</comment>
- <comment xml:lang="zh-TW">字型集</comment>
+ <comment xml:lang="tr">Yazı tipi derlemi</comment>
+ <comment xml:lang="sv">Typsnittssamling</comment>
+ <comment xml:lang="sq">koleksion shkronjash</comment>
+ <comment xml:lang="sl">Zbirka pisav</comment>
+ <comment xml:lang="si">අකුරු එකතුව</comment>
+ <comment xml:lang="sk">Zbierka písiem</comment>
+ <comment xml:lang="ru">Коллекция шрифтов</comment>
+ <comment xml:lang="pt_BR">Coleção de fontes</comment>
+ <comment xml:lang="pt">coleção de letras</comment>
+ <comment xml:lang="pl">Kolekcja czcionek</comment>
+ <comment xml:lang="nl">Lettertypeverzameling</comment>
+ <comment xml:lang="ko">글꼴 모음</comment>
+ <comment xml:lang="kk">Қаріптер жинағы</comment>
+ <comment xml:lang="ja">フォントコレクション</comment>
+ <comment xml:lang="it">Raccolta di caratteri</comment>
+ <comment xml:lang="is">Letursafn</comment>
+ <comment xml:lang="id">Koleksi fonta</comment>
+ <comment xml:lang="hu">Betűkészlet-gyűjtemény</comment>
+ <comment xml:lang="hr">Zbirka fontova</comment>
+ <comment xml:lang="he">אוסף גופנים</comment>
+ <comment xml:lang="gl">Colección de tipo de letra</comment>
+ <comment xml:lang="ga">bailiúchán clónna</comment>
+ <comment xml:lang="fur">colezion di caratars</comment>
+ <comment xml:lang="fr">Collection de polices</comment>
+ <comment xml:lang="fi">Fonttikokoelma</comment>
+ <comment xml:lang="eu">Letra-tipo bilduma</comment>
+ <comment xml:lang="es">colección tipográfica</comment>
+ <comment xml:lang="en_GB">Font collection</comment>
+ <comment xml:lang="de">Schriftsammlung</comment>
+ <comment xml:lang="da">Skrifttypesamling</comment>
+ <comment xml:lang="cs">kolekce fontů</comment>
+ <comment xml:lang="ca">ccol·lecció de lletres</comment>
+ <comment xml:lang="bg">Шрифтова колекция</comment>
+ <comment xml:lang="be">калекцыя шрыфтоў</comment>
+ <comment xml:lang="ar">تجميعة خط</comment>
+ <comment xml:lang="af">Skriftipeversameling</comment>
<generic-icon name="font-x-generic"/>
<glob pattern="*.ttc"/>
</mime-type>
<mime-type type="application/x-font-ttx">
<comment>TrueType XML font</comment>
- <comment xml:lang="af">TrueType XML-skriftipe</comment>
- <comment xml:lang="ar">خط TrueType XML</comment>
- <comment xml:lang="be-Latn">Šryft TrueType XML</comment>
- <comment xml:lang="bg">Шрифт — TrueType XML</comment>
- <comment xml:lang="ca">lletra XML de TrueType</comment>
- <comment xml:lang="cs">font TrueType XML</comment>
- <comment xml:lang="da">TrueType XML-skrifttype</comment>
- <comment xml:lang="de">TrueType-XML-Schrift</comment>
- <comment xml:lang="el">Γραμματοσειρά XML TrueType</comment>
- <comment xml:lang="en-GB">TrueType XML font</comment>
- <comment xml:lang="es">tipo de letra TrueType XML</comment>
- <comment xml:lang="eu">TrueType XML letra-tipoa</comment>
- <comment xml:lang="fi">TrueType-XML-fontti</comment>
- <comment xml:lang="fo">TrueType XML stavasnið</comment>
- <comment xml:lang="fr">police Truetype XML</comment>
- <comment xml:lang="fur">caratar TrueType XML</comment>
- <comment xml:lang="ga">cló XML TrueType</comment>
- <comment xml:lang="gl">tipo de letra TrueType XML</comment>
- <comment xml:lang="he">גופן XML מסוג TrueType</comment>
- <comment xml:lang="hr">TrueType XML font</comment>
- <comment xml:lang="hu">TrueType XML betűkészlet</comment>
- <comment xml:lang="ia">Typo de litteras TrueType XML</comment>
- <comment xml:lang="id">Fonta TrueType XML</comment>
- <comment xml:lang="it">Carattere TrueType XML</comment>
- <comment xml:lang="ja">TrueType XML フォント</comment>
- <comment xml:lang="kk">TrueType XML қарібі</comment>
- <comment xml:lang="ko">트루타입 XML 글꼴</comment>
- <comment xml:lang="lt">TrueType XML šriftas</comment>
- <comment xml:lang="lv">TrueType XML fonts</comment>
- <comment xml:lang="nb">TrueType XML-skrift</comment>
- <comment xml:lang="nl">TrueType XML-lettertype</comment>
- <comment xml:lang="nn">TrueType XML-skrifttype</comment>
- <comment xml:lang="oc">poliça Truetype XML</comment>
- <comment xml:lang="pl">Czcionka TrueType XML</comment>
- <comment xml:lang="pt">letra TrueType XML</comment>
- <comment xml:lang="pt-BR">Fonte TrueType XML</comment>
- <comment xml:lang="ro">Font XML TrueType</comment>
- <comment xml:lang="ru">Шрифт TrueType XML</comment>
- <comment xml:lang="sk">Písmo TrueType XML</comment>
- <comment xml:lang="sl">Datoteka pisave TrueType XML</comment>
- <comment xml:lang="sq">Lloj gërme TrueType XML</comment>
- <comment xml:lang="sr">Трутајп ИксМЛ слова</comment>
- <comment xml:lang="sv">Truetype XML-typsnitt</comment>
- <comment xml:lang="tr">TrueType XML yazı tipi</comment>
- <comment xml:lang="uk">шрифт TrueType XML</comment>
+ <comment xml:lang="zh_TW">TrueType XML 字型</comment>
+ <comment xml:lang="zh_CN">TrueType XML 字体</comment>
<comment xml:lang="vi">Phông chữ XML TrueType</comment>
- <comment xml:lang="zh-CN">TrueType XML 字体</comment>
- <comment xml:lang="zh-TW">TrueType XML 字型</comment>
+ <comment xml:lang="uk">шрифт TrueType XML</comment>
+ <comment xml:lang="tr">TrueType XML yazı tipi</comment>
+ <comment xml:lang="sv">Truetype XML-typsnitt</comment>
+ <comment xml:lang="sr">Трутајп ИксМЛ слова</comment>
+ <comment xml:lang="sq">shkronja TrueType XML</comment>
+ <comment xml:lang="sl">Datoteka pisave TrueType XML</comment>
+ <comment xml:lang="si">TrueType XML අකුරු</comment>
+ <comment xml:lang="sk">Písmo TrueType XML</comment>
+ <comment xml:lang="ru">Шрифт TrueType XML</comment>
+ <comment xml:lang="ro">Font XML TrueType</comment>
+ <comment xml:lang="pt_BR">Fonte TrueType XML</comment>
+ <comment xml:lang="pt">letra TrueType XML</comment>
+ <comment xml:lang="pl">Czcionka TrueType XML</comment>
+ <comment xml:lang="oc">poliça Truetype XML</comment>
+ <comment xml:lang="nn">TrueType XML-skrifttype</comment>
+ <comment xml:lang="nl">TrueType XML-lettertype</comment>
+ <comment xml:lang="nb">TrueType XML-skrift</comment>
+ <comment xml:lang="lv">TrueType XML fonts</comment>
+ <comment xml:lang="lt">TrueType XML šriftas</comment>
+ <comment xml:lang="ko">트루타입 XML 글꼴</comment>
+ <comment xml:lang="kk">TrueType XML қарібі</comment>
+ <comment xml:lang="ja">TrueType XML フォント</comment>
+ <comment xml:lang="it">Carattere TrueType XML</comment>
+ <comment xml:lang="is">TrueType XML letur</comment>
+ <comment xml:lang="id">Fonta TrueType XML</comment>
+ <comment xml:lang="ia">Typo de litteras TrueType XML</comment>
+ <comment xml:lang="hu">TrueType XML betűkészlet</comment>
+ <comment xml:lang="hr">TrueType XML font</comment>
+ <comment xml:lang="he">גופן XML מסוג TrueType</comment>
+ <comment xml:lang="gl">tipo de letra TrueType XML</comment>
+ <comment xml:lang="ga">cló XML TrueType</comment>
+ <comment xml:lang="fur">caratar TrueType XML</comment>
+ <comment xml:lang="fr">police Truetype XML</comment>
+ <comment xml:lang="fo">TrueType XML stavasnið</comment>
+ <comment xml:lang="fi">TrueType-XML-fontti</comment>
+ <comment xml:lang="eu">TrueType XML letra-tipoa</comment>
+ <comment xml:lang="es">tipo de letra TrueType XML</comment>
+ <comment xml:lang="en_GB">TrueType XML font</comment>
+ <comment xml:lang="el">Γραμματοσειρά XML TrueType</comment>
+ <comment xml:lang="de">TrueType-XML-Schrift</comment>
+ <comment xml:lang="da">TrueType XML-skrifttype</comment>
+ <comment xml:lang="cs">font TrueType XML</comment>
+ <comment xml:lang="ca">lletra XML de TrueType</comment>
+ <comment xml:lang="bg">Шрифт — TrueType XML</comment>
+ <comment xml:lang="be@latin">Šryft TrueType XML</comment>
+ <comment xml:lang="be">шрыфт TrueType XML</comment>
+ <comment xml:lang="ar">خط TrueType XML</comment>
+ <comment xml:lang="af">TrueType XML-skriftipe</comment>
<sub-class-of type="application/xml"/>
<generic-icon name="font-x-generic"/>
- <magic priority="50">
+ <magic>
<match type="string" value="&lt;ttFont sfntVersion=&quot;\\x00\\x01\\x00\\x00&quot; ttLibVersion=&quot;" offset="0:256"/>
</magic>
<glob pattern="*.ttx"/>
</mime-type>
<mime-type type="application/x-font-vfont">
<comment>V font</comment>
- <comment xml:lang="af">V-skriftipe</comment>
- <comment xml:lang="ar">خط V</comment>
- <comment xml:lang="az">V yazı növü</comment>
- <comment xml:lang="be-Latn">Šryft V</comment>
- <comment xml:lang="bg">Шрифт — V</comment>
- <comment xml:lang="ca">lletra V</comment>
- <comment xml:lang="cs">font V</comment>
- <comment xml:lang="cy">Ffont V</comment>
- <comment xml:lang="da">V-skrifttype</comment>
- <comment xml:lang="de">V-Schrift</comment>
- <comment xml:lang="el">Γραμματοσειρά V</comment>
- <comment xml:lang="en-GB">V font</comment>
- <comment xml:lang="eo">V-tiparo</comment>
- <comment xml:lang="es">tipo de letra V</comment>
- <comment xml:lang="eu">V letra-tipoa</comment>
- <comment xml:lang="fi">V-fontti</comment>
- <comment xml:lang="fo">V stavasnið</comment>
- <comment xml:lang="fr">police V</comment>
- <comment xml:lang="fur">caratar V</comment>
- <comment xml:lang="ga">cló V</comment>
- <comment xml:lang="gl">tipo de letra V</comment>
- <comment xml:lang="he">גופן של V</comment>
- <comment xml:lang="hr">V font</comment>
- <comment xml:lang="hu">V-betűkészlet</comment>
- <comment xml:lang="ia">Typo de litteras V</comment>
- <comment xml:lang="id">Fonta V</comment>
- <comment xml:lang="it">Carattere V</comment>
- <comment xml:lang="ja">V フォント</comment>
- <comment xml:lang="kk">V font қарібі</comment>
- <comment xml:lang="ko">V 글꼴</comment>
- <comment xml:lang="lt">V šriftas</comment>
- <comment xml:lang="lv">V fonts</comment>
- <comment xml:lang="ms">Font V</comment>
- <comment xml:lang="nb">V-skrift</comment>
- <comment xml:lang="nl">V-lettertype</comment>
- <comment xml:lang="nn">V-skrifttype</comment>
- <comment xml:lang="oc">poliça V</comment>
- <comment xml:lang="pl">Czcionka V</comment>
- <comment xml:lang="pt">letra V</comment>
- <comment xml:lang="pt-BR">Fonte V</comment>
- <comment xml:lang="ro">Font V</comment>
- <comment xml:lang="ru">Шрифт V font</comment>
- <comment xml:lang="sk">Písmo V</comment>
- <comment xml:lang="sl">Datoteka pisave V</comment>
- <comment xml:lang="sq">Gërmë V</comment>
- <comment xml:lang="sr">В слова</comment>
- <comment xml:lang="sv">V-typsnitt</comment>
- <comment xml:lang="tr">V yazı tipi</comment>
- <comment xml:lang="uk">V-шрифт</comment>
+ <comment xml:lang="zh_TW">V 字型</comment>
+ <comment xml:lang="zh_CN">V 字体</comment>
<comment xml:lang="vi">Phông chữ V</comment>
- <comment xml:lang="zh-CN">V 字体</comment>
- <comment xml:lang="zh-TW">V 字型</comment>
+ <comment xml:lang="uk">V-шрифт</comment>
+ <comment xml:lang="tr">V yazı tipi</comment>
+ <comment xml:lang="sv">V-typsnitt</comment>
+ <comment xml:lang="sr">В слова</comment>
+ <comment xml:lang="sq">shkronja V</comment>
+ <comment xml:lang="sl">Datoteka pisave V</comment>
+ <comment xml:lang="si">V අකුරු</comment>
+ <comment xml:lang="sk">Písmo V</comment>
+ <comment xml:lang="ru">V-шрифт</comment>
+ <comment xml:lang="ro">Font V</comment>
+ <comment xml:lang="pt_BR">Fonte V</comment>
+ <comment xml:lang="pt">letra V</comment>
+ <comment xml:lang="pl">Czcionka V</comment>
+ <comment xml:lang="oc">poliça V</comment>
+ <comment xml:lang="nn">V-skrifttype</comment>
+ <comment xml:lang="nl">V-lettertype</comment>
+ <comment xml:lang="nb">V-skrift</comment>
+ <comment xml:lang="ms">Font V</comment>
+ <comment xml:lang="lv">V fonts</comment>
+ <comment xml:lang="lt">V šriftas</comment>
+ <comment xml:lang="ko">V 글꼴</comment>
+ <comment xml:lang="kk">V font қарібі</comment>
+ <comment xml:lang="ja">V フォント</comment>
+ <comment xml:lang="it">Carattere V</comment>
+ <comment xml:lang="is">V letur</comment>
+ <comment xml:lang="id">Fonta V</comment>
+ <comment xml:lang="ia">Typo de litteras V</comment>
+ <comment xml:lang="hu">V-betűkészlet</comment>
+ <comment xml:lang="hr">V font</comment>
+ <comment xml:lang="he">גופן של V</comment>
+ <comment xml:lang="gl">tipo de letra V</comment>
+ <comment xml:lang="ga">cló V</comment>
+ <comment xml:lang="fur">caratar V</comment>
+ <comment xml:lang="fr">police V</comment>
+ <comment xml:lang="fo">V stavasnið</comment>
+ <comment xml:lang="fi">V-fontti</comment>
+ <comment xml:lang="eu">V letra-tipoa</comment>
+ <comment xml:lang="es">tipo de letra V</comment>
+ <comment xml:lang="eo">V-tiparo</comment>
+ <comment xml:lang="en_GB">V font</comment>
+ <comment xml:lang="el">Γραμματοσειρά V</comment>
+ <comment xml:lang="de">V-Schrift</comment>
+ <comment xml:lang="da">V-skrifttype</comment>
+ <comment xml:lang="cy">Ffont V</comment>
+ <comment xml:lang="cs">font V</comment>
+ <comment xml:lang="ca">lletra V</comment>
+ <comment xml:lang="bg">Шрифт — V</comment>
+ <comment xml:lang="be@latin">Šryft V</comment>
+ <comment xml:lang="be">шрыфт V</comment>
+ <comment xml:lang="az">V yazı növü</comment>
+ <comment xml:lang="ar">خط V</comment>
+ <comment xml:lang="af">V-skriftipe</comment>
<generic-icon name="font-x-generic"/>
- <magic priority="50">
+ <magic>
<match type="string" value="FONT" offset="0"/>
</magic>
</mime-type>
<mime-type type="application/vnd.framemaker">
<comment>Adobe FrameMaker document</comment>
- <comment xml:lang="af">Adobe FrameMaker-dokument</comment>
- <comment xml:lang="ar">مستند أدوبي الصانع للإطارات</comment>
- <comment xml:lang="ast">Documentu d'Adobe FrameMaker</comment>
- <comment xml:lang="be-Latn">Dakument Adobe FrameMaker</comment>
- <comment xml:lang="bg">Документ — Adobe FrameMaker</comment>
- <comment xml:lang="ca">document d'Adobe FrameMaker</comment>
- <comment xml:lang="cs">dokument Adobe FrameMaker</comment>
- <comment xml:lang="da">Adobe FrameMaker-dokument</comment>
- <comment xml:lang="de">Adobe-FrameMaker-Dokument</comment>
- <comment xml:lang="el">Έγγραφο Adobe FrameMaker</comment>
- <comment xml:lang="en-GB">Adobe FrameMaker document</comment>
- <comment xml:lang="eo">Dokumento de Adobe FrameMaker</comment>
- <comment xml:lang="es">documento de Adobe FrameMaker</comment>
- <comment xml:lang="eu">Adobe FrameMaker-en dokumentua</comment>
- <comment xml:lang="fi">Adobe FrameMaker -asiakirja</comment>
- <comment xml:lang="fo">Adobe FrameMaker skjal</comment>
- <comment xml:lang="fr">document Adobe FrameMaker</comment>
- <comment xml:lang="fur">document Adobe FrameMaker</comment>
- <comment xml:lang="ga">cáipéis Adobe FrameMaker</comment>
- <comment xml:lang="gl">documento de Adobe FrameMaker</comment>
- <comment xml:lang="he">מסמך Adobe FrameMaker</comment>
- <comment xml:lang="hr">Adobe FrameMaker dokument</comment>
- <comment xml:lang="hu">Adobe FrameMaker-dokumentum</comment>
- <comment xml:lang="ia">Documento Adobe FrameMaker</comment>
- <comment xml:lang="id">Dokumen Adobe FrameMaker</comment>
- <comment xml:lang="it">Documento Adobe FrameMaker</comment>
- <comment xml:lang="ja">Adobe FrameMaker ドキュメント</comment>
- <comment xml:lang="ka">Adobe FrameMaker-ის დოკუმენტი</comment>
- <comment xml:lang="kk">Adobe FrameMaker құжаты</comment>
- <comment xml:lang="ko">Adobe 프레임메이커 문서</comment>
- <comment xml:lang="lt">Adobe FrameMaker dokumentas</comment>
- <comment xml:lang="lv">Adobe FrameMaker dokuments</comment>
- <comment xml:lang="nb">Adobe FrameMaker-dokument</comment>
- <comment xml:lang="nl">Adobe FrameMaker-document</comment>
- <comment xml:lang="nn">Adobe FrameMaker-dokument</comment>
- <comment xml:lang="oc">document Adobe FrameMaker</comment>
- <comment xml:lang="pl">Dokument Adobe FrameMaker</comment>
- <comment xml:lang="pt">documento Adobe FrameMaker</comment>
- <comment xml:lang="pt-BR">Documento do Adobe FrameMaker</comment>
- <comment xml:lang="ro">Document Adobe FrameMaker</comment>
- <comment xml:lang="ru">Документ Adobe FrameMaker</comment>
- <comment xml:lang="sk">Dokument Adobe FrameMaker</comment>
- <comment xml:lang="sl">Dokument Adobe FrameMaker</comment>
- <comment xml:lang="sq">Dokument Adobe FrameMaker</comment>
- <comment xml:lang="sr">документ Адобе Фреј Мејкера</comment>
- <comment xml:lang="sv">Adobe FrameMaker-dokument</comment>
- <comment xml:lang="tr">Adobe FrameMaker belgesi</comment>
- <comment xml:lang="uk">документ Adobe FrameMaker</comment>
+ <comment xml:lang="zh_TW">Adobe FrameMaker 文件</comment>
+ <comment xml:lang="zh_CN">Adobe FrameMaker 文档</comment>
<comment xml:lang="vi">Tài liệu Adobe FrameMaker</comment>
- <comment xml:lang="zh-CN">Adobe FrameMaker 文档</comment>
- <comment xml:lang="zh-TW">Adobe FrameMaker 文件</comment>
+ <comment xml:lang="uk">документ Adobe FrameMaker</comment>
+ <comment xml:lang="tr">Adobe FrameMaker belgesi</comment>
+ <comment xml:lang="sv">Adobe FrameMaker-dokument</comment>
+ <comment xml:lang="sr">документ Адобе Фреј Мејкера</comment>
+ <comment xml:lang="sq">dokument Adobe FrameMaker</comment>
+ <comment xml:lang="sl">Dokument Adobe FrameMaker</comment>
+ <comment xml:lang="si">Adobe FrameMaker ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument Adobe FrameMaker</comment>
+ <comment xml:lang="ru">Документ Adobe FrameMaker</comment>
+ <comment xml:lang="ro">Document Adobe FrameMaker</comment>
+ <comment xml:lang="pt_BR">Documento do Adobe FrameMaker</comment>
+ <comment xml:lang="pt">documento Adobe FrameMaker</comment>
+ <comment xml:lang="pl">Dokument Adobe FrameMaker</comment>
+ <comment xml:lang="oc">document Adobe FrameMaker</comment>
+ <comment xml:lang="nn">Adobe FrameMaker-dokument</comment>
+ <comment xml:lang="nl">Adobe FrameMaker-document</comment>
+ <comment xml:lang="nb">Adobe FrameMaker-dokument</comment>
+ <comment xml:lang="lv">Adobe FrameMaker dokuments</comment>
+ <comment xml:lang="lt">Adobe FrameMaker dokumentas</comment>
+ <comment xml:lang="ko">Adobe 프레임메이커 문서</comment>
+ <comment xml:lang="kk">Adobe FrameMaker құжаты</comment>
+ <comment xml:lang="ka">Adobe FrameMaker-ის დოკუმენტი</comment>
+ <comment xml:lang="ja">Adobe FrameMaker ドキュメント</comment>
+ <comment xml:lang="it">Documento Adobe FrameMaker</comment>
+ <comment xml:lang="is">Adobe FrameMaker skjal</comment>
+ <comment xml:lang="id">Dokumen Adobe FrameMaker</comment>
+ <comment xml:lang="ia">Documento Adobe FrameMaker</comment>
+ <comment xml:lang="hu">Adobe FrameMaker-dokumentum</comment>
+ <comment xml:lang="hr">Adobe FrameMaker dokument</comment>
+ <comment xml:lang="he">מסמך Adobe FrameMaker</comment>
+ <comment xml:lang="gl">documento de Adobe FrameMaker</comment>
+ <comment xml:lang="ga">cáipéis Adobe FrameMaker</comment>
+ <comment xml:lang="fur">document Adobe FrameMaker</comment>
+ <comment xml:lang="fr">document Adobe FrameMaker</comment>
+ <comment xml:lang="fo">Adobe FrameMaker skjal</comment>
+ <comment xml:lang="fi">Adobe FrameMaker -asiakirja</comment>
+ <comment xml:lang="eu">Adobe FrameMaker-en dokumentua</comment>
+ <comment xml:lang="es">documento de Adobe FrameMaker</comment>
+ <comment xml:lang="eo">Dokumento de Adobe FrameMaker</comment>
+ <comment xml:lang="en_GB">Adobe FrameMaker document</comment>
+ <comment xml:lang="el">Έγγραφο Adobe FrameMaker</comment>
+ <comment xml:lang="de">Adobe-FrameMaker-Dokument</comment>
+ <comment xml:lang="da">Adobe FrameMaker-dokument</comment>
+ <comment xml:lang="cs">dokument Adobe FrameMaker</comment>
+ <comment xml:lang="ca">document d'Adobe FrameMaker</comment>
+ <comment xml:lang="bg">Документ — Adobe FrameMaker</comment>
+ <comment xml:lang="be@latin">Dakument Adobe FrameMaker</comment>
+ <comment xml:lang="be">дакумент Adobe FrameMaker</comment>
+ <comment xml:lang="ast">Documentu d'Adobe FrameMaker</comment>
+ <comment xml:lang="ar">مستند أدوبي FrameMaker</comment>
+ <comment xml:lang="af">Adobe FrameMaker-dokument</comment>
<generic-icon name="x-office-document"/>
- <magic priority="50">
+ <magic>
<match type="string" value="&lt;MakerFile" offset="0"/>
<match type="string" value="&lt;MIFFile" offset="0"/>
<match type="string" value="&lt;MakerDictionary" offset="0"/>
@@ -12252,58 +12677,61 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-gameboy-rom">
<comment>Game Boy ROM</comment>
- <comment xml:lang="ar">Game Boy ROM</comment>
- <comment xml:lang="be-Latn">Game Boy ROM</comment>
- <comment xml:lang="bg">ROM — Game Boy</comment>
- <comment xml:lang="ca">ROM de Game Boy</comment>
- <comment xml:lang="cs">ROM pro Game Boy</comment>
- <comment xml:lang="da">Game Boy-ROM</comment>
- <comment xml:lang="de">Game Boy ROM</comment>
- <comment xml:lang="el">Game Boy ROM</comment>
- <comment xml:lang="en-GB">Game Boy ROM</comment>
- <comment xml:lang="eo">NLM de Game Boy</comment>
- <comment xml:lang="es">ROM de Game Boy</comment>
- <comment xml:lang="eu">Game Boy-eko ROMa</comment>
- <comment xml:lang="fi">Game Boy -ROM</comment>
- <comment xml:lang="fo">Game Boy ROM</comment>
- <comment xml:lang="fr">ROM Game Boy</comment>
- <comment xml:lang="fur">ROM Game Boy</comment>
- <comment xml:lang="ga">ROM Game Boy</comment>
- <comment xml:lang="gl">ROM de Game Boy</comment>
- <comment xml:lang="he">ROM של Game Boy</comment>
- <comment xml:lang="hr">Game Boy ROM</comment>
- <comment xml:lang="hu">Game Boy ROM</comment>
- <comment xml:lang="ia">ROM de Game Boy</comment>
- <comment xml:lang="id">Memori baca-saja Game Boy</comment>
- <comment xml:lang="it">ROM Game Boy</comment>
- <comment xml:lang="ja">ゲームボーイ ROM</comment>
- <comment xml:lang="ka">Game Boy-ის ROM</comment>
- <comment xml:lang="kk">Game Boy ROM</comment>
- <comment xml:lang="ko">게임보이 롬</comment>
- <comment xml:lang="lt">Game Boy ROM</comment>
- <comment xml:lang="lv">Game Boy ROM</comment>
- <comment xml:lang="ms">ROM Game Boy</comment>
- <comment xml:lang="nb">Game Boy-ROM</comment>
- <comment xml:lang="nl">Game Boy-ROM</comment>
- <comment xml:lang="nn">Game Boy-ROM</comment>
- <comment xml:lang="oc">ROM Game Boy</comment>
- <comment xml:lang="pl">Plik ROM konsoli Game Boy</comment>
- <comment xml:lang="pt">ROM Game Boy</comment>
- <comment xml:lang="pt-BR">ROM de Game Boy</comment>
- <comment xml:lang="ro">ROM Game Boy</comment>
- <comment xml:lang="ru">Game Boy ROM</comment>
- <comment xml:lang="sk">ROM pre Game Boy</comment>
- <comment xml:lang="sl">Bralni pomnilnik Game Boy</comment>
- <comment xml:lang="sq">ROM Game Boy</comment>
- <comment xml:lang="sr">Гејм Бој РОМ</comment>
- <comment xml:lang="sv">Game Boy-rom</comment>
- <comment xml:lang="tr">Game Boy ROM</comment>
- <comment xml:lang="uk">ППП Game Boy</comment>
+ <comment xml:lang="zh_TW">Game Boy ROM</comment>
+ <comment xml:lang="zh_CN">Game Boy ROM</comment>
<comment xml:lang="vi">ROM Game Boy</comment>
- <comment xml:lang="zh-CN">Game Boy ROM</comment>
- <comment xml:lang="zh-TW">Game Boy ROM</comment>
+ <comment xml:lang="uk">ППП Game Boy</comment>
+ <comment xml:lang="tr">Game Boy ROM</comment>
+ <comment xml:lang="sv">Game Boy-rom</comment>
+ <comment xml:lang="sr">Гејм Бој РОМ</comment>
+ <comment xml:lang="sq">ROM Game Boy</comment>
+ <comment xml:lang="sl">Bralni pomnilnik Game Boy</comment>
+ <comment xml:lang="si">Game Boy ROM</comment>
+ <comment xml:lang="sk">ROM pre Game Boy</comment>
+ <comment xml:lang="ru">Game Boy ROM</comment>
+ <comment xml:lang="ro">ROM Game Boy</comment>
+ <comment xml:lang="pt_BR">ROM de Game Boy</comment>
+ <comment xml:lang="pt">ROM Game Boy</comment>
+ <comment xml:lang="pl">Plik ROM konsoli Game Boy</comment>
+ <comment xml:lang="oc">ROM Game Boy</comment>
+ <comment xml:lang="nn">Game Boy-ROM</comment>
+ <comment xml:lang="nl">Game Boy-ROM</comment>
+ <comment xml:lang="nb">Game Boy-ROM</comment>
+ <comment xml:lang="ms">ROM Game Boy</comment>
+ <comment xml:lang="lv">Game Boy ROM</comment>
+ <comment xml:lang="lt">Game Boy ROM</comment>
+ <comment xml:lang="ko">게임보이 롬</comment>
+ <comment xml:lang="kk">Game Boy ROM</comment>
+ <comment xml:lang="ka">Game Boy-ის ROM</comment>
+ <comment xml:lang="ja">ゲームボーイ ROM</comment>
+ <comment xml:lang="it">ROM Game Boy</comment>
+ <comment xml:lang="is">Game Boy ROM</comment>
+ <comment xml:lang="id">Memori baca-saja Game Boy</comment>
+ <comment xml:lang="ia">ROM de Game Boy</comment>
+ <comment xml:lang="hu">Game Boy ROM</comment>
+ <comment xml:lang="hr">Game Boy ROM</comment>
+ <comment xml:lang="he">ROM של Game Boy</comment>
+ <comment xml:lang="gl">ROM de Game Boy</comment>
+ <comment xml:lang="ga">ROM Game Boy</comment>
+ <comment xml:lang="fur">ROM Game Boy</comment>
+ <comment xml:lang="fr">ROM Game Boy</comment>
+ <comment xml:lang="fo">Game Boy ROM</comment>
+ <comment xml:lang="fi">Game Boy -ROM</comment>
+ <comment xml:lang="eu">Game Boy-eko ROMa</comment>
+ <comment xml:lang="es">ROM de Game Boy</comment>
+ <comment xml:lang="eo">NLM de Game Boy</comment>
+ <comment xml:lang="en_GB">Game Boy ROM</comment>
+ <comment xml:lang="el">Game Boy ROM</comment>
+ <comment xml:lang="de">Game-Boy-ROM</comment>
+ <comment xml:lang="da">Game Boy-ROM</comment>
+ <comment xml:lang="cs">ROM pro Game Boy</comment>
+ <comment xml:lang="ca">ROM de Game Boy</comment>
+ <comment xml:lang="bg">ROM — Game Boy</comment>
+ <comment xml:lang="be@latin">Game Boy ROM</comment>
+ <comment xml:lang="be">Game Boy ROM</comment>
+ <comment xml:lang="ar">Game Boy ROM</comment>
<generic-icon name="application-x-executable"/>
- <magic priority="50">
+ <magic>
<match type="string" value="\xce\xed\x66\x66\xcc\x0d\x00\x0b\x03\x73\x00\x83\x00\x0c\x00\x0d\x00\x08\x11\x1f\x88\x89\x00\x0e" offset="260">
<match type="byte" value="0x0" mask="0x80" offset="323"/>
</match>
@@ -12313,37 +12741,47 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-gameboy-color-rom">
<comment>Game Boy Color ROM</comment>
- <comment xml:lang="bg">ROM — Game Boy Color</comment>
- <comment xml:lang="ca">ROM de Game Boy Color</comment>
- <comment xml:lang="cs">ROM pro Game Boy Color</comment>
- <comment xml:lang="da">Game Boy Color-ROM</comment>
- <comment xml:lang="de">Game Boy Color ROM</comment>
- <comment xml:lang="en-GB">Game Boy Colour ROM</comment>
- <comment xml:lang="es">ROM de Game Boy Color</comment>
- <comment xml:lang="eu">Game Boy Color ROM</comment>
- <comment xml:lang="fi">Game Boy Color -ROM</comment>
- <comment xml:lang="fr">ROM Game Boy Color</comment>
- <comment xml:lang="fur">ROM Game Boy Color</comment>
- <comment xml:lang="ga">ROM Game Boy Color</comment>
- <comment xml:lang="he">ROM של Game Boy Color</comment>
- <comment xml:lang="hr">Game Boy Color ROM</comment>
- <comment xml:lang="hu">Game Boy Color ROM</comment>
- <comment xml:lang="id">ROM Game Boy Color</comment>
- <comment xml:lang="it">ROM Game Boy Color</comment>
- <comment xml:lang="kk">Game Boy Color ROM</comment>
- <comment xml:lang="ko">게임보이 컬러 롬</comment>
- <comment xml:lang="pl">Plik ROM konsoli Game Boy Color</comment>
- <comment xml:lang="pt-BR">ROM de Game Boy Color</comment>
- <comment xml:lang="ru">Game Boy Color ROM</comment>
- <comment xml:lang="sk">ROM pre Game Boy Color</comment>
- <comment xml:lang="sr">Гејм Бој РОМ боје</comment>
- <comment xml:lang="sv">Game Boy Color-rom</comment>
- <comment xml:lang="tr">Game Boy Color ROM</comment>
+ <comment xml:lang="zh_TW">Game Boy Color ROM</comment>
+ <comment xml:lang="zh_CN">Game Boy Color ROM</comment>
<comment xml:lang="uk">ППП Game Boy Color</comment>
- <comment xml:lang="zh-CN">Game Boy Color ROM</comment>
- <comment xml:lang="zh-TW">Game Boy Color ROM</comment>
+ <comment xml:lang="tr">Game Boy Color ROM</comment>
+ <comment xml:lang="sv">Game Boy Color-rom</comment>
+ <comment xml:lang="sr">Гејм Бој РОМ боје</comment>
+ <comment xml:lang="sq">ROM Game Boy Color</comment>
+ <comment xml:lang="sl">Game Boy Color ROM</comment>
+ <comment xml:lang="si">Game Boy Color ROM</comment>
+ <comment xml:lang="sk">ROM pre Game Boy Color</comment>
+ <comment xml:lang="ru">Game Boy Color ROM</comment>
+ <comment xml:lang="pt_BR">ROM de Game Boy Color</comment>
+ <comment xml:lang="pl">Plik ROM konsoli Game Boy Color</comment>
+ <comment xml:lang="oc">ROM Game Boy Color</comment>
+ <comment xml:lang="nl">Game Boy Color-ROM</comment>
+ <comment xml:lang="ko">게임보이 컬러 롬</comment>
+ <comment xml:lang="kk">Game Boy Color ROM</comment>
+ <comment xml:lang="ja">ゲームボーイカラー ROM</comment>
+ <comment xml:lang="it">ROM Game Boy Color</comment>
+ <comment xml:lang="is">Game Boy Color ROM</comment>
+ <comment xml:lang="id">ROM Game Boy Color</comment>
+ <comment xml:lang="hu">Game Boy Color ROM</comment>
+ <comment xml:lang="hr">Game Boy Color ROM</comment>
+ <comment xml:lang="he">ROM של Game Boy Color</comment>
+ <comment xml:lang="gl">ROM de Game Boy Color</comment>
+ <comment xml:lang="ga">ROM Game Boy Color</comment>
+ <comment xml:lang="fur">ROM Game Boy Color</comment>
+ <comment xml:lang="fr">ROM Game Boy Color</comment>
+ <comment xml:lang="fi">Game Boy Color -ROM</comment>
+ <comment xml:lang="eu">Game Boy Color ROM</comment>
+ <comment xml:lang="es">ROM de Game Boy Color</comment>
+ <comment xml:lang="en_GB">Game Boy Colour ROM</comment>
+ <comment xml:lang="de">Game-Boy-Color-ROM</comment>
+ <comment xml:lang="da">Game Boy Color-ROM</comment>
+ <comment xml:lang="cs">ROM pro Game Boy Color</comment>
+ <comment xml:lang="ca">ROM de Game Boy Color</comment>
+ <comment xml:lang="bg">ROM — Game Boy Color</comment>
+ <comment xml:lang="be">Game Boy Color ROM</comment>
+ <comment xml:lang="ar">روم جيم بوي كولر</comment>
<generic-icon name="application-x-executable"/>
- <magic priority="50">
+ <magic>
<match type="string" value="\xce\xed\x66\x66\xcc\x0d\x00\x0b\x03\x73\x00\x83\x00\x0c\x00\x0d\x00\x08" offset="260">
<match type="byte" value="0x80" mask="0x80" offset="323"/>
</match>
@@ -12353,145 +12791,162 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-gba-rom">
<comment>Game Boy Advance ROM</comment>
- <comment xml:lang="ar">Game Boy Advance ROM</comment>
- <comment xml:lang="be-Latn">Game Boy Advance ROM</comment>
- <comment xml:lang="bg">ROM — Game Boy Advance</comment>
- <comment xml:lang="ca">ROM de Game Boy Advance</comment>
- <comment xml:lang="cs">ROM pro Game Boy Advance</comment>
- <comment xml:lang="da">Game Boy Advance-ROM</comment>
- <comment xml:lang="de">Game Boy Advance ROM</comment>
- <comment xml:lang="el">Game Boy Advance ROM</comment>
- <comment xml:lang="en-GB">Game Boy Advance ROM</comment>
- <comment xml:lang="es">ROM de Game Boy Advance</comment>
- <comment xml:lang="eu">Game Boy Advance-ko ROMa</comment>
- <comment xml:lang="fi">Game Boy Advance -ROM</comment>
- <comment xml:lang="fo">Game Boy Advance ROM</comment>
- <comment xml:lang="fr">ROM Game Boy Advance</comment>
- <comment xml:lang="fur">ROM Game Boy Advance</comment>
- <comment xml:lang="ga">ROM Game Boy Advance</comment>
- <comment xml:lang="gl">ROM de Game Boy Advance</comment>
- <comment xml:lang="he">ROM של Game Boy Advance</comment>
- <comment xml:lang="hr">Game Boy Advance ROM</comment>
- <comment xml:lang="hu">Game Boy Advance ROM</comment>
- <comment xml:lang="ia">ROM de Game Boy Advance</comment>
- <comment xml:lang="id">Memori baca-saja Game Boy Advance</comment>
- <comment xml:lang="it">ROM Game Boy Advance</comment>
- <comment xml:lang="ja">ゲームボーイアドバンス ROM</comment>
- <comment xml:lang="ka">Game Boy Advance-ის ROM</comment>
- <comment xml:lang="kk">Game Boy Advance ROM</comment>
- <comment xml:lang="ko">게임보이 어드밴스 롬</comment>
- <comment xml:lang="lt">Game Boy Advance ROM</comment>
- <comment xml:lang="lv">Game Boy Advance ROM</comment>
- <comment xml:lang="nb">Game Boy Advance-ROM</comment>
- <comment xml:lang="nl">Game Boy Advance-ROM</comment>
- <comment xml:lang="nn">Game Boy Advance-ROM</comment>
- <comment xml:lang="oc">ROM Game Boy Advance</comment>
- <comment xml:lang="pl">Plik ROM konsoli Game Boy Advance</comment>
- <comment xml:lang="pt">ROM Game Boy Advance</comment>
- <comment xml:lang="pt-BR">ROM de Game Boy Advance</comment>
- <comment xml:lang="ro">ROM Game Boy Advance</comment>
- <comment xml:lang="ru">Game Boy Advance ROM</comment>
- <comment xml:lang="sk">ROM pre Game Boy Advance</comment>
- <comment xml:lang="sl">Bralni pomnilnik Game Boy Advance</comment>
- <comment xml:lang="sq">ROM Game Boy Advance</comment>
- <comment xml:lang="sr">Гејм Бој Адванс РОМ</comment>
- <comment xml:lang="sv">Game Boy Advance-rom</comment>
- <comment xml:lang="tr">Game Boy Gelişmiş ROM</comment>
- <comment xml:lang="uk">розширений ППП Game Boy</comment>
+ <comment xml:lang="zh_TW">Game Boy Advance ROM</comment>
+ <comment xml:lang="zh_CN">Game Boy Advance ROM</comment>
<comment xml:lang="vi">ROM Game Boy Advance</comment>
- <comment xml:lang="zh-CN">Game Boy Advance ROM</comment>
- <comment xml:lang="zh-TW">Game Boy Advance ROM</comment>
+ <comment xml:lang="uk">розширений ППП Game Boy</comment>
+ <comment xml:lang="tr">Game Boy Gelişmiş ROM</comment>
+ <comment xml:lang="sv">Game Boy Advance-rom</comment>
+ <comment xml:lang="sr">Гејм Бој Адванс РОМ</comment>
+ <comment xml:lang="sq">ROM Game Boy Advance</comment>
+ <comment xml:lang="sl">Bralni pomnilnik Game Boy Advance</comment>
+ <comment xml:lang="si">Game Boy Advance ROM</comment>
+ <comment xml:lang="sk">ROM pre Game Boy Advance</comment>
+ <comment xml:lang="ru">Game Boy Advance ROM</comment>
+ <comment xml:lang="ro">ROM Game Boy Advance</comment>
+ <comment xml:lang="pt_BR">ROM de Game Boy Advance</comment>
+ <comment xml:lang="pt">ROM Game Boy Advance</comment>
+ <comment xml:lang="pl">Plik ROM konsoli Game Boy Advance</comment>
+ <comment xml:lang="oc">ROM Game Boy Advance</comment>
+ <comment xml:lang="nn">Game Boy Advance-ROM</comment>
+ <comment xml:lang="nl">Game Boy Advance-ROM</comment>
+ <comment xml:lang="nb">Game Boy Advance-ROM</comment>
+ <comment xml:lang="lv">Game Boy Advance ROM</comment>
+ <comment xml:lang="lt">Game Boy Advance ROM</comment>
+ <comment xml:lang="ko">게임보이 어드밴스 롬</comment>
+ <comment xml:lang="kk">Game Boy Advance ROM</comment>
+ <comment xml:lang="ka">Game Boy Advance-ის ROM</comment>
+ <comment xml:lang="ja">ゲームボーイアドバンス ROM</comment>
+ <comment xml:lang="it">ROM Game Boy Advance</comment>
+ <comment xml:lang="is">Game Boy Advance ROM</comment>
+ <comment xml:lang="id">Memori baca-saja Game Boy Advance</comment>
+ <comment xml:lang="ia">ROM de Game Boy Advance</comment>
+ <comment xml:lang="hu">Game Boy Advance ROM</comment>
+ <comment xml:lang="hr">Game Boy Advance ROM</comment>
+ <comment xml:lang="he">ROM של Game Boy Advance</comment>
+ <comment xml:lang="gl">ROM de Game Boy Advance</comment>
+ <comment xml:lang="ga">ROM Game Boy Advance</comment>
+ <comment xml:lang="fur">ROM Game Boy Advance</comment>
+ <comment xml:lang="fr">ROM Game Boy Advance</comment>
+ <comment xml:lang="fo">Game Boy Advance ROM</comment>
+ <comment xml:lang="fi">Game Boy Advance -ROM</comment>
+ <comment xml:lang="eu">Game Boy Advance-ko ROMa</comment>
+ <comment xml:lang="es">ROM de Game Boy Advance</comment>
+ <comment xml:lang="en_GB">Game Boy Advance ROM</comment>
+ <comment xml:lang="el">Game Boy Advance ROM</comment>
+ <comment xml:lang="de">Game-Boy-Advance-ROM</comment>
+ <comment xml:lang="da">Game Boy Advance-ROM</comment>
+ <comment xml:lang="cs">ROM pro Game Boy Advance</comment>
+ <comment xml:lang="ca">ROM de Game Boy Advance</comment>
+ <comment xml:lang="bg">ROM — Game Boy Advance</comment>
+ <comment xml:lang="be@latin">Game Boy Advance ROM</comment>
+ <comment xml:lang="be">Game Boy Advance ROM</comment>
+ <comment xml:lang="ar">Game Boy Advance ROM</comment>
<generic-icon name="application-x-executable"/>
<glob pattern="*.gba"/>
<glob pattern="*.agb"/>
</mime-type>
<mime-type type="application/x-virtual-boy-rom">
<comment>Virtual Boy ROM</comment>
- <comment xml:lang="bg">ROM — Virtual Boy</comment>
- <comment xml:lang="ca">ROM de Virtual Boy</comment>
- <comment xml:lang="cs">ROM pro Virtual Boy</comment>
- <comment xml:lang="da">Virtual Boy-ROM</comment>
- <comment xml:lang="de">Virtual Boy ROM</comment>
- <comment xml:lang="en-GB">Virtual Boy ROM</comment>
- <comment xml:lang="es">ROM de Virtual Boy</comment>
- <comment xml:lang="eu">Virtual Boy ROM</comment>
- <comment xml:lang="fi">Virtual Boy ROM</comment>
- <comment xml:lang="fr">ROM Virtual Boy</comment>
- <comment xml:lang="fur">ROM Virtual Boy</comment>
- <comment xml:lang="ga">ROM Virtual Boy</comment>
- <comment xml:lang="hr">Virtual Boy ROM</comment>
- <comment xml:lang="hu">Virtual Boy ROM</comment>
- <comment xml:lang="id">ROM Virtual Boy</comment>
- <comment xml:lang="it">ROM Virtual Boy</comment>
- <comment xml:lang="kk">Virtual Boy ROM</comment>
- <comment xml:lang="ko">버추얼보이 롬</comment>
- <comment xml:lang="pl">Plik ROM konsoli Virtual Boy</comment>
- <comment xml:lang="pt-BR">ROM de Virtual Boy</comment>
- <comment xml:lang="ru">Virtual Boy ROM</comment>
- <comment xml:lang="sk">ROM pre Virtual Boy</comment>
- <comment xml:lang="sv">Virtual Boy-rom</comment>
- <comment xml:lang="tr">Virtual Boy ROM</comment>
+ <comment xml:lang="zh_TW">Virtual Boy ROM</comment>
+ <comment xml:lang="zh_CN">Virtual Boy ROM</comment>
<comment xml:lang="uk">ROM Virtual Boy</comment>
- <comment xml:lang="zh-CN">Virtual Boy ROM</comment>
- <comment xml:lang="zh-TW">Virtual Boy ROM</comment>
+ <comment xml:lang="tr">Virtual Boy ROM</comment>
+ <comment xml:lang="sv">Virtual Boy-rom</comment>
+ <comment xml:lang="sq">ROM Virtual Boy</comment>
+ <comment xml:lang="sl">Virtual Boy ROM</comment>
+ <comment xml:lang="si">Virtual Boy ROM</comment>
+ <comment xml:lang="sk">ROM pre Virtual Boy</comment>
+ <comment xml:lang="ru">Virtual Boy ROM</comment>
+ <comment xml:lang="pt_BR">ROM de Virtual Boy</comment>
+ <comment xml:lang="pt">ROM Virtua Boy</comment>
+ <comment xml:lang="pl">Plik ROM konsoli Virtual Boy</comment>
+ <comment xml:lang="nl">Virtual Boy-ROM</comment>
+ <comment xml:lang="ko">버추얼 보이 롬</comment>
+ <comment xml:lang="kk">Virtual Boy ROM</comment>
+ <comment xml:lang="ja">バーチャルボーイ ROM</comment>
+ <comment xml:lang="it">ROM Virtual Boy</comment>
+ <comment xml:lang="is">Virtual Boy ROM</comment>
+ <comment xml:lang="id">ROM Virtual Boy</comment>
+ <comment xml:lang="hu">Virtual Boy ROM</comment>
+ <comment xml:lang="hr">Virtual Boy ROM</comment>
+ <comment xml:lang="he">ROM של Virtual Boy</comment>
+ <comment xml:lang="gl">ROM de Virtual Boy</comment>
+ <comment xml:lang="ga">ROM Virtual Boy</comment>
+ <comment xml:lang="fur">ROM Virtual Boy</comment>
+ <comment xml:lang="fr">ROM Virtual Boy</comment>
+ <comment xml:lang="fi">Virtual Boy -ROM</comment>
+ <comment xml:lang="eu">Virtual Boy ROM</comment>
+ <comment xml:lang="es">ROM de Virtual Boy</comment>
+ <comment xml:lang="en_GB">Virtual Boy ROM</comment>
+ <comment xml:lang="de">Virtual-Boy-ROM</comment>
+ <comment xml:lang="da">Virtual Boy-ROM</comment>
+ <comment xml:lang="cs">ROM pro Virtual Boy</comment>
+ <comment xml:lang="ca">ROM de Virtual Boy</comment>
+ <comment xml:lang="bg">ROM — Virtual Boy</comment>
+ <comment xml:lang="be">Virtual Boy ROM</comment>
+ <comment xml:lang="ar">روم بوي الافتراضي</comment>
<generic-icon name="application-x-executable"/>
<glob pattern="*.vb"/>
</mime-type>
<mime-type type="application/x-gdbm">
<comment>GDBM database</comment>
- <comment xml:lang="af">GDBM-databasis</comment>
- <comment xml:lang="ar">قاعدة بيانات GDBM</comment>
- <comment xml:lang="be-Latn">Baza źviestak GDBM</comment>
- <comment xml:lang="bg">База от данни — GDBM</comment>
- <comment xml:lang="ca">base de dades GDBM</comment>
- <comment xml:lang="cs">databáze GDBM</comment>
- <comment xml:lang="da">GDBM-database</comment>
- <comment xml:lang="de">GDBM-Datenbank</comment>
- <comment xml:lang="el">Βάση δεδομένων GDBM</comment>
- <comment xml:lang="en-GB">GDBM database</comment>
- <comment xml:lang="eo">GDBM-datumbazo</comment>
- <comment xml:lang="es">base de datos GDBM</comment>
- <comment xml:lang="eu">GDBM datu-basea</comment>
- <comment xml:lang="fi">GDBM-tietokanta</comment>
- <comment xml:lang="fo">GDBM dátustovnur</comment>
- <comment xml:lang="fr">base de données GDBM</comment>
- <comment xml:lang="fur">base di dâts GDBM</comment>
- <comment xml:lang="ga">bunachar sonraí GDBM</comment>
- <comment xml:lang="gl">base de datos GDBM</comment>
- <comment xml:lang="he">מסד נתונים GDBM</comment>
- <comment xml:lang="hr">GDBM baza podataka</comment>
- <comment xml:lang="hu">GDBM adatbázis</comment>
- <comment xml:lang="ia">Base de datos GDBM</comment>
- <comment xml:lang="id">Basis data GDBM</comment>
- <comment xml:lang="it">Database GDBM</comment>
- <comment xml:lang="ja">GDBM データベース</comment>
- <comment xml:lang="ka">GDBM მონაცემთა ბაზა</comment>
- <comment xml:lang="kk">GDBM дерекқоры</comment>
- <comment xml:lang="ko">GDBM 데이터베이스</comment>
- <comment xml:lang="lt">GDBM duomenų bazė</comment>
- <comment xml:lang="lv">GDBM datubāze</comment>
- <comment xml:lang="nb">GDBM-database</comment>
- <comment xml:lang="nl">GDBM-gegevensbank</comment>
- <comment xml:lang="nn">GDBM-database</comment>
- <comment xml:lang="oc">banca de donadas GDBM</comment>
- <comment xml:lang="pl">Baza danych GDBM</comment>
- <comment xml:lang="pt">base de dados GDMB</comment>
- <comment xml:lang="pt-BR">Banco de dados GDBM</comment>
- <comment xml:lang="ro">Bază de date GDBM</comment>
- <comment xml:lang="ru">База данных GDBM</comment>
- <comment xml:lang="sk">Databáza GDBM</comment>
- <comment xml:lang="sl">Podatkovna zbirka GDBM</comment>
- <comment xml:lang="sq">Bazë me të dhëna GDBM</comment>
- <comment xml:lang="sr">ГДБМ база података</comment>
- <comment xml:lang="sv">GDBM-databas</comment>
- <comment xml:lang="tr">GDBM veri tabanı</comment>
- <comment xml:lang="uk">база даних GDBM</comment>
+ <comment xml:lang="zh_TW">GDBM 資料庫</comment>
+ <comment xml:lang="zh_CN">GDBM 数据库</comment>
<comment xml:lang="vi">Cơ sở dữ liệu GDBM</comment>
- <comment xml:lang="zh-CN">GDBM 数据库</comment>
- <comment xml:lang="zh-TW">GDBM 資料庫</comment>
+ <comment xml:lang="uk">база даних GDBM</comment>
+ <comment xml:lang="tr">GDBM veri tabanı</comment>
+ <comment xml:lang="sv">GDBM-databas</comment>
+ <comment xml:lang="sr">ГДБМ база података</comment>
+ <comment xml:lang="sq">bazë të dhënash GDBM</comment>
+ <comment xml:lang="sl">Podatkovna zbirka GDBM</comment>
+ <comment xml:lang="si">GDBM දත්ත සමුදාය</comment>
+ <comment xml:lang="sk">Databáza GDBM</comment>
+ <comment xml:lang="ru">База данных GDBM</comment>
+ <comment xml:lang="ro">Bază de date GDBM</comment>
+ <comment xml:lang="pt_BR">Banco de dados GDBM</comment>
+ <comment xml:lang="pt">base de dados GDMB</comment>
+ <comment xml:lang="pl">Baza danych GDBM</comment>
+ <comment xml:lang="oc">banca de donadas GDBM</comment>
+ <comment xml:lang="nn">GDBM-database</comment>
+ <comment xml:lang="nl">GDBM-database</comment>
+ <comment xml:lang="nb">GDBM-database</comment>
+ <comment xml:lang="lv">GDBM datubāze</comment>
+ <comment xml:lang="lt">GDBM duomenų bazė</comment>
+ <comment xml:lang="ko">GDBM 데이터베이스</comment>
+ <comment xml:lang="kk">GDBM дерекқоры</comment>
+ <comment xml:lang="ka">GDBM მონაცემთა ბაზა</comment>
+ <comment xml:lang="ja">GDBM データベース</comment>
+ <comment xml:lang="it">Database GDBM</comment>
+ <comment xml:lang="is">GDBM gagnagrunnur</comment>
+ <comment xml:lang="id">Basis data GDBM</comment>
+ <comment xml:lang="ia">Base de datos GDBM</comment>
+ <comment xml:lang="hu">GDBM adatbázis</comment>
+ <comment xml:lang="hr">GDBM baza podataka</comment>
+ <comment xml:lang="he">מסד נתונים GDBM</comment>
+ <comment xml:lang="gl">base de datos GDBM</comment>
+ <comment xml:lang="ga">bunachar sonraí GDBM</comment>
+ <comment xml:lang="fur">base di dâts GDBM</comment>
+ <comment xml:lang="fr">base de données GDBM</comment>
+ <comment xml:lang="fo">GDBM dátustovnur</comment>
+ <comment xml:lang="fi">GDBM-tietokanta</comment>
+ <comment xml:lang="eu">GDBM datu-basea</comment>
+ <comment xml:lang="es">base de datos GDBM</comment>
+ <comment xml:lang="eo">GDBM-datumbazo</comment>
+ <comment xml:lang="en_GB">GDBM database</comment>
+ <comment xml:lang="el">Βάση δεδομένων GDBM</comment>
+ <comment xml:lang="de">GDBM-Datenbank</comment>
+ <comment xml:lang="da">GDBM-database</comment>
+ <comment xml:lang="cs">databáze GDBM</comment>
+ <comment xml:lang="ca">base de dades GDBM</comment>
+ <comment xml:lang="bg">База от данни — GDBM</comment>
+ <comment xml:lang="be@latin">Baza źviestak GDBM</comment>
+ <comment xml:lang="be">база даных GDBM</comment>
+ <comment xml:lang="ar">قاعدة بيانات GDBM</comment>
+ <comment xml:lang="af">GDBM-databasis</comment>
<acronym>GDBM</acronym>
<expanded-acronym>GNU Database Manager</expanded-acronym>
- <magic priority="50">
+ <magic>
<match type="big32" value="0x13579ace" offset="0"/>
<match type="little32" value="0x13579ace" offset="0"/>
<match type="string" value="GDBM" offset="0"/>
@@ -12501,57 +12956,60 @@ command to generate the output files.
<!-- Translate this to Mega Drive if the console was known as such in your locale
Should be Mega Drive in all but en_US, Mexico and Canada: https://en.wikipedia.org/wiki/Sega_Genesis#History -->
<comment>Genesis ROM</comment>
- <comment xml:lang="ar">Genesis ROM</comment>
- <comment xml:lang="be-Latn">Genesis ROM</comment>
- <comment xml:lang="bg">ROM — Genesis</comment>
- <comment xml:lang="ca">ROM de Genesis</comment>
- <comment xml:lang="cs">ROM pro Genesis</comment>
- <comment xml:lang="da">Genesis-ROM</comment>
- <comment xml:lang="de">Genesis ROM</comment>
- <comment xml:lang="el">Genesis ROM</comment>
- <comment xml:lang="en-GB">Genesis ROM</comment>
- <comment xml:lang="eo">Genesis-NLM</comment>
- <comment xml:lang="es">ROM de Genesis (Mega Drive)</comment>
- <comment xml:lang="eu">Genesis-eko ROMa</comment>
- <comment xml:lang="fi">Genesis-ROM</comment>
- <comment xml:lang="fo">Genesis ROM</comment>
- <comment xml:lang="fr">ROM Mega Drive/Genesis</comment>
- <comment xml:lang="fur">ROM Sega Mega Drive</comment>
- <comment xml:lang="ga">ROM Genesis</comment>
- <comment xml:lang="gl">ROM xenérica</comment>
- <comment xml:lang="he">ROM מסוג Genesis</comment>
- <comment xml:lang="hr">Genesis ROM</comment>
- <comment xml:lang="hu">Genesis ROM</comment>
- <comment xml:lang="ia">ROM de Mega Drive/Genesis</comment>
- <comment xml:lang="id">Memori baca-saja Genesis</comment>
- <comment xml:lang="it">ROM Megadrive</comment>
- <comment xml:lang="ja">メガドライブ ROM</comment>
- <comment xml:lang="kk">Genesis ROM</comment>
- <comment xml:lang="ko">제네시스 롬</comment>
- <comment xml:lang="lt">Genesis ROM</comment>
- <comment xml:lang="lv">Genesis ROM</comment>
- <comment xml:lang="ms">ROM Genesis</comment>
- <comment xml:lang="nb">Genesis-ROM</comment>
- <comment xml:lang="nl">Mega Drive</comment>
- <comment xml:lang="nn">Genesis-ROM</comment>
- <comment xml:lang="oc">ROM Mega Drive/Genesis</comment>
- <comment xml:lang="pl">Plik ROM konsoli Mega Drive</comment>
- <comment xml:lang="pt">ROM Mega Drive</comment>
- <comment xml:lang="pt-BR">ROM de Genesis (Mega Drive)</comment>
- <comment xml:lang="ro">ROM Genesis</comment>
- <comment xml:lang="ru">Genesis ROM</comment>
- <comment xml:lang="sk">ROM pre Megadrive</comment>
- <comment xml:lang="sl">Bralni pomnilnik Genesis</comment>
- <comment xml:lang="sq">ROM Genesis</comment>
- <comment xml:lang="sr">Мегадрајв РОМ</comment>
- <comment xml:lang="sv">Mega Drive-rom</comment>
- <comment xml:lang="tr">Genesis ROM</comment>
- <comment xml:lang="uk">ППП Genesis</comment>
+ <comment xml:lang="zh_TW">Genesis ROM</comment>
+ <comment xml:lang="zh_CN">Genesis ROM</comment>
<comment xml:lang="vi">ROM Genesis</comment>
- <comment xml:lang="zh-CN">Genesis ROM</comment>
- <comment xml:lang="zh-TW">Genesis ROM</comment>
+ <comment xml:lang="uk">ППП Genesis</comment>
+ <comment xml:lang="tr">Genesis ROM</comment>
+ <comment xml:lang="sv">Mega Drive-rom</comment>
+ <comment xml:lang="sr">Мегадрајв РОМ</comment>
+ <comment xml:lang="sq">ROM Genesis</comment>
+ <comment xml:lang="sl">Bralni pomnilnik Genesis</comment>
+ <comment xml:lang="si">උත්පත්ති ROM</comment>
+ <comment xml:lang="sk">ROM pre Megadrive</comment>
+ <comment xml:lang="ru">Genesis ROM</comment>
+ <comment xml:lang="ro">ROM Genesis</comment>
+ <comment xml:lang="pt_BR">ROM de Genesis (Mega Drive)</comment>
+ <comment xml:lang="pt">ROM Mega Drive</comment>
+ <comment xml:lang="pl">Plik ROM konsoli Mega Drive</comment>
+ <comment xml:lang="oc">ROM Mega Drive/Genesis</comment>
+ <comment xml:lang="nn">Genesis-ROM</comment>
+ <comment xml:lang="nl">Mega Drive-ROM</comment>
+ <comment xml:lang="nb">Genesis-ROM</comment>
+ <comment xml:lang="ms">ROM Genesis</comment>
+ <comment xml:lang="lv">Genesis ROM</comment>
+ <comment xml:lang="lt">Genesis ROM</comment>
+ <comment xml:lang="ko">제네시스 롬</comment>
+ <comment xml:lang="kk">Genesis ROM</comment>
+ <comment xml:lang="ja">メガドライブ ROM</comment>
+ <comment xml:lang="it">ROM Megadrive</comment>
+ <comment xml:lang="is">Genesis ROM</comment>
+ <comment xml:lang="id">Memori baca-saja Genesis</comment>
+ <comment xml:lang="ia">ROM de Mega Drive/Genesis</comment>
+ <comment xml:lang="hu">Genesis ROM</comment>
+ <comment xml:lang="hr">Genesis ROM</comment>
+ <comment xml:lang="he">ROM מסוג Genesis</comment>
+ <comment xml:lang="gl">ROM xenérica</comment>
+ <comment xml:lang="ga">ROM Genesis</comment>
+ <comment xml:lang="fur">ROM Sega Mega Drive</comment>
+ <comment xml:lang="fr">ROM Mega Drive/Genesis</comment>
+ <comment xml:lang="fo">Genesis ROM</comment>
+ <comment xml:lang="fi">Genesis-ROM</comment>
+ <comment xml:lang="eu">Genesis-eko ROMa</comment>
+ <comment xml:lang="es">ROM de Genesis (Mega Drive)</comment>
+ <comment xml:lang="eo">Genesis-NLM</comment>
+ <comment xml:lang="en_GB">Genesis ROM</comment>
+ <comment xml:lang="el">Genesis ROM</comment>
+ <comment xml:lang="de">Mega-Drive-ROM</comment>
+ <comment xml:lang="da">Genesis-ROM</comment>
+ <comment xml:lang="cs">ROM pro Genesis</comment>
+ <comment xml:lang="ca">ROM de Genesis</comment>
+ <comment xml:lang="bg">ROM — Genesis</comment>
+ <comment xml:lang="be@latin">Genesis ROM</comment>
+ <comment xml:lang="be">Genesis ROM</comment>
+ <comment xml:lang="ar">روم Genesis</comment>
<generic-icon name="application-x-executable"/>
- <magic priority="50">
+ <magic>
<match type="string" value="SEGA GENESIS" offset="256"/>
<match type="string" value="SEGA MEGA DRIVE" offset="256"/>
<match type="string" value="SEGA_MEGA_DRIVE" offset="256"/>
@@ -12566,96 +13024,65 @@ command to generate the output files.
<!-- Translate this to Super 32X, Mega Drive 32X or Mega 32X if the system was known as such in your locale
Should be Super 32X in Japan, Mega Drive 32X in PAL region and Mega 32X in Brazil: https://en.wikipedia.org/wiki/32X -->
<comment>Genesis 32X ROM</comment>
- <comment xml:lang="bg">ROM — Genesis 32X</comment>
- <comment xml:lang="ca">ROM de Genesis 32X</comment>
- <comment xml:lang="cs">ROM pro Genesis 32X</comment>
- <comment xml:lang="da">Genesis 32X-ROM</comment>
- <comment xml:lang="de">Genesis 32X ROM</comment>
- <comment xml:lang="en-GB">Genesis 32X ROM</comment>
- <comment xml:lang="es">ROM de Genesis 32X</comment>
- <comment xml:lang="eu">Genesis 32X ROM</comment>
- <comment xml:lang="fi">Genesis 32X -ROM</comment>
- <comment xml:lang="fr">ROM Genesis 32X</comment>
- <comment xml:lang="fur">ROM Sega Mega Drive 32X</comment>
- <comment xml:lang="ga">ROM Genesis 32X</comment>
- <comment xml:lang="he">ROM מסוג Genesis 32X</comment>
- <comment xml:lang="hr">Genesis 32X ROM</comment>
- <comment xml:lang="hu">Genesis 32X ROM</comment>
- <comment xml:lang="id">ROM Genesis 32X</comment>
- <comment xml:lang="it">ROM Sega Mega Drive 32X</comment>
- <comment xml:lang="kk">Genesis 32X ROM</comment>
- <comment xml:lang="ko">제네시스 32X 롬</comment>
- <comment xml:lang="pl">Plik ROM konsoli Mega Drive 32X</comment>
- <comment xml:lang="pt-BR">ROM de Genesis 32X</comment>
- <comment xml:lang="ru">Genesis 32X ROM</comment>
- <comment xml:lang="sk">ROM pre Genesis 32X</comment>
- <comment xml:lang="sr">Џенезис 32X РОМ</comment>
- <comment xml:lang="sv">Mega Drive 32X-rom</comment>
- <comment xml:lang="tr">Genesis 32X ROM</comment>
+ <comment xml:lang="zh_TW">Genesis 32X ROM</comment>
+ <comment xml:lang="zh_CN">Genesis 32X ROM</comment>
<comment xml:lang="uk">ППП Genesis 32X</comment>
- <comment xml:lang="zh-CN">Genesis 32X ROM</comment>
- <comment xml:lang="zh-TW">Genesis 32X ROM</comment>
+ <comment xml:lang="tr">Genesis 32X ROM</comment>
+ <comment xml:lang="sv">Mega Drive 32X-rom</comment>
+ <comment xml:lang="sr">Џенезис 32X РОМ</comment>
+ <comment xml:lang="sq">ROM Genesis 32X</comment>
+ <comment xml:lang="sl">Genesis 32X ROM</comment>
+ <comment xml:lang="si">උත්පත්ති 32X ROM</comment>
+ <comment xml:lang="sk">ROM pre Genesis 32X</comment>
+ <comment xml:lang="ru">Genesis 32X ROM</comment>
+ <comment xml:lang="pt_BR">ROM de Genesis 32X</comment>
+ <comment xml:lang="pt">ROM Genesis 32X</comment>
+ <comment xml:lang="pl">Plik ROM konsoli Mega Drive 32X</comment>
+ <comment xml:lang="nl">Mega Drive 32X-ROM</comment>
+ <comment xml:lang="ko">제네시스 32X 롬</comment>
+ <comment xml:lang="kk">Genesis 32X ROM</comment>
+ <comment xml:lang="ja">メガドライブ 32X ROM</comment>
+ <comment xml:lang="it">ROM Sega Mega Drive 32X</comment>
+ <comment xml:lang="is">Genesis 32X ROM</comment>
+ <comment xml:lang="id">ROM Genesis 32X</comment>
+ <comment xml:lang="hu">Genesis 32X ROM</comment>
+ <comment xml:lang="hr">Genesis 32X ROM</comment>
+ <comment xml:lang="he">ROM מסוג Genesis 32X</comment>
+ <comment xml:lang="gl">ROM Genesis 32X</comment>
+ <comment xml:lang="ga">ROM Genesis 32X</comment>
+ <comment xml:lang="fur">ROM Sega Mega Drive 32X</comment>
+ <comment xml:lang="fr">ROM Genesis 32X</comment>
+ <comment xml:lang="fi">Genesis 32X -ROM</comment>
+ <comment xml:lang="eu">Genesis 32X ROM</comment>
+ <comment xml:lang="es">ROM de Genesis 32X</comment>
+ <comment xml:lang="en_GB">Genesis 32X ROM</comment>
+ <comment xml:lang="de">Mega-32X-ROM</comment>
+ <comment xml:lang="da">Genesis 32X-ROM</comment>
+ <comment xml:lang="cs">ROM pro Genesis 32X</comment>
+ <comment xml:lang="ca">ROM de Genesis 32X</comment>
+ <comment xml:lang="bg">ROM — Genesis 32X</comment>
+ <comment xml:lang="be">Genesis 32X ROM</comment>
+ <comment xml:lang="ar">روم Genesis 32X</comment>
<generic-icon name="application-x-executable"/>
- <magic priority="50">
+ <magic>
<match type="string" value="SEGA 32X" offset="256"/>
</magic>
<glob pattern="*.32x"/>
<glob pattern="*.mdx"/>
</mime-type>
<mime-type type="application/x-gettext-translation">
- <comment>translated messages (machine-readable)</comment>
- <comment xml:lang="af">vertaalde boodskappe (masjienleesbaar)</comment>
- <comment xml:lang="ar">رسائل مترجمة (مقروءة آليا)</comment>
- <comment xml:lang="be-Latn">pierakładzienyja paviedamleńni (dla čytańnia kamputaram)</comment>
- <comment xml:lang="bg">Преведени съобщения — машинен формат</comment>
- <comment xml:lang="ca">missatges traduïts (llegible per màquina)</comment>
- <comment xml:lang="cs">přeložené zprávy (strojově čitelné)</comment>
- <comment xml:lang="da">oversatte meddelelser (maskinlæsbare)</comment>
- <comment xml:lang="de">Übersetzte Meldungen (maschinenlesbar)</comment>
- <comment xml:lang="el">Μεταφρασμένα μηνύματα (για μηχανική ανάγνωση)</comment>
- <comment xml:lang="en-GB">translated messages (machine-readable)</comment>
- <comment xml:lang="eo">tradukitaj mesaĝoj (maŝinlegebla)</comment>
- <comment xml:lang="es">mensajes traducidos (legibles por máquinas)</comment>
- <comment xml:lang="eu">itzulitako mezuak (ordenagailuek irakurtzeko)</comment>
- <comment xml:lang="fi">käännetyt viestit (koneluettava)</comment>
- <comment xml:lang="fo">týdd boð (maskin-lesifør)</comment>
- <comment xml:lang="fr">messages traduits (lisibles par machine)</comment>
- <comment xml:lang="fur">messaçs tradots (leibii de machine)</comment>
- <comment xml:lang="ga">teachtaireachtaí aistrithe (inléite ag meaisín)</comment>
- <comment xml:lang="gl">mensaxes traducidos (lexíbeis por máquinas)</comment>
- <comment xml:lang="he">הודעות מתורגמות (מובן ע״י מכונה)</comment>
- <comment xml:lang="hr">Prevedene poruke (strojno čitljive)</comment>
- <comment xml:lang="hu">lefordított üzenetek (gépi kód)</comment>
- <comment xml:lang="ia">messages traducite (legibile pro machinas)</comment>
- <comment xml:lang="id">pesan diterjemahkan (dapat dibaca mesin)</comment>
- <comment xml:lang="it">Messaggi tradotti (leggibili da macchina)</comment>
- <comment xml:lang="ja">翻訳メッセージ (マシン用)</comment>
- <comment xml:lang="ka">ნათარგმნი შეტყობინებები (მანქანისთვის განკუთვნილი)</comment>
- <comment xml:lang="kk">аударылған хабарламалар (машиналық түрде)</comment>
- <comment xml:lang="ko">번역 메시지(컴퓨터 사용 형식)</comment>
- <comment xml:lang="lt">išversti užrašai (kompiuteriniu formatu)</comment>
- <comment xml:lang="lv">pārtulkotie ziņojumi (mašīnlasāms)</comment>
- <comment xml:lang="ms">Mesej diterjemah (bolehdibaca-mesin)</comment>
- <comment xml:lang="nb">oversatte meldinger (maskinlesbar)</comment>
- <comment xml:lang="nl">vertaalde berichten (machine-leesbaar)</comment>
- <comment xml:lang="nn">oversette meldingar (maskinlesbare)</comment>
- <comment xml:lang="oc">messatges tradusits (legibles per maquina)</comment>
- <comment xml:lang="pl">Przetłumaczone komunikaty (czytelne dla komputera)</comment>
- <comment xml:lang="pt">mensagens traduzidas (leitura pelo computador)</comment>
- <comment xml:lang="pt-BR">Mensagens traduzidas (legível pelo computador)</comment>
- <comment xml:lang="ro">mesaje traduse (citite de calculator)</comment>
- <comment xml:lang="ru">Переводы сообщений (откомпилированые)</comment>
- <comment xml:lang="sk">Preložené správy (strojovo čitateľné)</comment>
- <comment xml:lang="sl">prevedena sporočila (strojni zapis)</comment>
- <comment xml:lang="sq">Mesazhe të përkthyer (të lexueshëm nga makina)</comment>
- <comment xml:lang="sr">преведене поруке (машинама читљиве)</comment>
- <comment xml:lang="sv">översatta meddelanden (maskinläsbara)</comment>
- <comment xml:lang="tr">çevrilmiş iletiler (makine tarafından okunabilir)</comment>
+ <comment>Translated messages (machine-readable)</comment>
<comment xml:lang="uk">перекладені повідомлення (у машинній формі)</comment>
- <comment xml:lang="vi">thông điệp đã dịch (máy đọc được)</comment>
- <comment xml:lang="zh-CN">已翻译消息(机读)</comment>
- <comment xml:lang="zh-TW">翻譯訊息 (程式讀取格式)</comment>
- <magic priority="50">
+ <comment xml:lang="sv">Översatta meddelanden (maskinläsbara)</comment>
+ <comment xml:lang="ru">Переводы сообщений (откомпилированые)</comment>
+ <comment xml:lang="pl">Przetłumaczone komunikaty (czytelne dla komputera)</comment>
+ <comment xml:lang="it">Messaggi tradotti (leggibili da macchina)</comment>
+ <comment xml:lang="gl">Mensaxes traducidos (lexíbel pola máquina)</comment>
+ <comment xml:lang="eu">Itzulitako mezuak (makinak irakurtzeko modukoak)</comment>
+ <comment xml:lang="es">mensajes traducidos (legibles por máquinas)</comment>
+ <comment xml:lang="de">Übersetzte Meldungen (maschinenlesbar)</comment>
+ <comment xml:lang="be">перакладзеныя паведамленні (для чытання камп'ютарам)</comment>
+ <magic>
<match type="string" value="\336\22\4\225" offset="0"/>
<match type="string" value="\225\4\22\336" offset="0"/>
</magic>
@@ -12664,143 +13091,160 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-gtk-builder">
<comment>GTK+ Builder interface document</comment>
- <comment xml:lang="bg">Интерфейс — GTK+ Builder</comment>
- <comment xml:lang="ca">document d'interfície GTK+ Builder</comment>
- <comment xml:lang="da">GTK+ Builder-brugerflade-dokument</comment>
- <comment xml:lang="de">GTK+-Builder-Oberflächendokument</comment>
- <comment xml:lang="en-GB">GTK+ Builder interface document</comment>
- <comment xml:lang="es">documento de interfaz de GTK Builder</comment>
- <comment xml:lang="eu">GTK+ Builder interfaze dokumentua</comment>
- <comment xml:lang="fi">GTK+ Builder -käyttöliittymän asiakirja</comment>
- <comment xml:lang="fr">document d'interface GTK+ Builder</comment>
- <comment xml:lang="hr">GTK+ Graditelj dokument sučelja</comment>
- <comment xml:lang="hu">GTK+ Builder felületleíró dokumentum</comment>
- <comment xml:lang="id">Dokumen antarmuka GTK+ Builder</comment>
- <comment xml:lang="it">Documento interfaccia GTK+ Builder</comment>
- <comment xml:lang="kk">GTK+ Builder интерфейс құжаты</comment>
- <comment xml:lang="ko">GTK+ 빌더 인터페이스 문서</comment>
- <comment xml:lang="pl">Dokument interfejsu GTK Builder</comment>
- <comment xml:lang="pt-BR">Documento de interface do GTK+ Builder</comment>
- <comment xml:lang="ru">Документ интерфейса GTK+ Builder</comment>
- <comment xml:lang="sv">GTK+-Builder-gränssnittsdokument</comment>
- <comment xml:lang="tr">GTK+ Builder arayüz belgesi</comment>
+ <comment xml:lang="zh_TW">GTK+ Builder 介面文件</comment>
+ <comment xml:lang="zh_CN">GTK+ Builder 界面文档</comment>
<comment xml:lang="uk">документ інтерфейсу GTK+ Builder</comment>
- <comment xml:lang="zh-CN">GTK+ Builder 界面文档</comment>
- <comment xml:lang="zh-TW">GTK+ Builder 介面文件</comment>
+ <comment xml:lang="tr">GTK+ Builder arayüz belgesi</comment>
+ <comment xml:lang="sv">GTK+-Builder-gränssnittsdokument</comment>
+ <comment xml:lang="sq">dokument ndërfaqesh GTK+ Builder</comment>
+ <comment xml:lang="sl">Dokument vmesnika GTK+ Builder</comment>
+ <comment xml:lang="si">GTK+ Builder අතුරුමුහුණත් ලේඛනය</comment>
+ <comment xml:lang="ru">Документ интерфейса GTK+ Builder</comment>
+ <comment xml:lang="pt_BR">Documento de interface do GTK+ Builder</comment>
+ <comment xml:lang="pl">Dokument interfejsu GTK Builder</comment>
+ <comment xml:lang="nl">GTK-Builder-interfacedocument</comment>
+ <comment xml:lang="ko">GTK+ 빌더 인터페이스 문서</comment>
+ <comment xml:lang="kk">GTK+ Builder интерфейс құжаты</comment>
+ <comment xml:lang="ja">GTK+ Builder インターフェイスドキュメント</comment>
+ <comment xml:lang="it">Documento interfaccia GTK+ Builder</comment>
+ <comment xml:lang="is">GTK+ Builder viðmótsskjal</comment>
+ <comment xml:lang="id">Dokumen antarmuka GTK+ Builder</comment>
+ <comment xml:lang="hu">GTK+ Builder felületleíró dokumentum</comment>
+ <comment xml:lang="hr">GTK+ Graditelj dokument sučelja</comment>
+ <comment xml:lang="he">מסמך מנשק של GTK+ Builder</comment>
+ <comment xml:lang="gl">Documento de interface do Construtor de GTK+ </comment>
+ <comment xml:lang="fr">document d'interface GTK+ Builder</comment>
+ <comment xml:lang="fi">GTK+ Builder -käyttöliittymän asiakirja</comment>
+ <comment xml:lang="eu">GTK+ Builder interfaze dokumentua</comment>
+ <comment xml:lang="es">documento de interfaz de GTK Builder</comment>
+ <comment xml:lang="en_GB">GTK+ Builder interface document</comment>
+ <comment xml:lang="de">GTK+-Builder-Oberflächendokument</comment>
+ <comment xml:lang="da">GTK+ Builder-brugerflade-dokument</comment>
+ <comment xml:lang="ca">document d'interfície GTK+ Builder</comment>
+ <comment xml:lang="bg">Интерфейс — GTK+ Builder</comment>
+ <comment xml:lang="be">дакумент інтэрфейсу GTK+ Builder</comment>
+ <comment xml:lang="ar">مستند واجهة باني جي تي كي بلس</comment>
<sub-class-of type="application/xml"/>
<generic-icon name="x-office-document"/>
<glob pattern="*.ui"/>
- <magic priority="50">
+ <magic>
<match type="string" value="&lt;interface" offset="0:256"/>
</magic>
</mime-type>
<mime-type type="application/x-glade">
<comment>Glade project</comment>
- <comment xml:lang="af">Glade-projek</comment>
- <comment xml:lang="ar">مشروع Glade</comment>
- <comment xml:lang="az">Glade layihəsi</comment>
- <comment xml:lang="be-Latn">Prajekt Glade</comment>
- <comment xml:lang="bg">Проект — Glade</comment>
- <comment xml:lang="ca">projecte de Glade</comment>
- <comment xml:lang="cs">projekt Glade</comment>
- <comment xml:lang="cy">Prosiect Glade</comment>
- <comment xml:lang="da">Gladeprojekt</comment>
- <comment xml:lang="de">Glade-Projekt</comment>
- <comment xml:lang="el">Έργο Glade</comment>
- <comment xml:lang="en-GB">Glade project</comment>
- <comment xml:lang="eo">Glade-projekto</comment>
- <comment xml:lang="es">proyecto de Glade</comment>
- <comment xml:lang="eu">Glade proiektua</comment>
- <comment xml:lang="fi">Glade-projekti</comment>
- <comment xml:lang="fo">Glade verkætlan</comment>
- <comment xml:lang="fr">projet Glade</comment>
- <comment xml:lang="fur">progjet Glade</comment>
- <comment xml:lang="ga">tionscadal Glade</comment>
- <comment xml:lang="gl">proxecto de Glade</comment>
- <comment xml:lang="he">מיזם Glade</comment>
- <comment xml:lang="hr">Glade projekt</comment>
- <comment xml:lang="hu">Glade-projekt</comment>
- <comment xml:lang="ia">Projecto Glade</comment>
- <comment xml:lang="id">Proyek Glade</comment>
- <comment xml:lang="it">Progetto Glade</comment>
- <comment xml:lang="ja">Glade プロジェクト</comment>
- <comment xml:lang="kk">Glade жобасы</comment>
- <comment xml:lang="ko">Glade 프로젝트</comment>
- <comment xml:lang="lt">Glade projektas</comment>
- <comment xml:lang="lv">Glade projekts</comment>
- <comment xml:lang="ms">Projek Glade</comment>
- <comment xml:lang="nb">Glade prosjekt</comment>
- <comment xml:lang="nl">Glade-project</comment>
- <comment xml:lang="nn">Glade prosjekt</comment>
- <comment xml:lang="oc">projècte Glade</comment>
- <comment xml:lang="pl">Projekt Glade</comment>
- <comment xml:lang="pt">projecto Glade</comment>
- <comment xml:lang="pt-BR">Projeto do Glade</comment>
- <comment xml:lang="ro">Proiect Glade</comment>
- <comment xml:lang="ru">Проект Glade</comment>
- <comment xml:lang="sk">Projekt Glade</comment>
- <comment xml:lang="sl">Datoteka projekta Glade</comment>
- <comment xml:lang="sq">Projekt Glade</comment>
- <comment xml:lang="sr">Глејдов пројекат</comment>
- <comment xml:lang="sv">Glade-projekt</comment>
- <comment xml:lang="tr">Glade projesi</comment>
- <comment xml:lang="uk">проєкт Glade</comment>
+ <comment xml:lang="zh_TW">Glade 專案</comment>
+ <comment xml:lang="zh_CN">Glade 工程</comment>
<comment xml:lang="vi">Dự án Glade</comment>
- <comment xml:lang="zh-CN">Glade 工程</comment>
- <comment xml:lang="zh-TW">Glade 專案</comment>
+ <comment xml:lang="uk">проєкт Glade</comment>
+ <comment xml:lang="tr">Glade projesi</comment>
+ <comment xml:lang="sv">Glade-projekt</comment>
+ <comment xml:lang="sr">Глејдов пројекат</comment>
+ <comment xml:lang="sq">projekt Glade</comment>
+ <comment xml:lang="sl">Datoteka projekta Glade</comment>
+ <comment xml:lang="si">ග්ලේඩ් ව්යාපෘතිය</comment>
+ <comment xml:lang="sk">Projekt Glade</comment>
+ <comment xml:lang="ru">Проект Glade</comment>
+ <comment xml:lang="ro">Proiect Glade</comment>
+ <comment xml:lang="pt_BR">Projeto do Glade</comment>
+ <comment xml:lang="pt">projecto Glade</comment>
+ <comment xml:lang="pl">Projekt Glade</comment>
+ <comment xml:lang="oc">projècte Glade</comment>
+ <comment xml:lang="nn">Glade prosjekt</comment>
+ <comment xml:lang="nl">Glade-project</comment>
+ <comment xml:lang="nb">Glade prosjekt</comment>
+ <comment xml:lang="ms">Projek Glade</comment>
+ <comment xml:lang="lv">Glade projekts</comment>
+ <comment xml:lang="lt">Glade projektas</comment>
+ <comment xml:lang="ko">Glade 프로젝트</comment>
+ <comment xml:lang="kk">Glade жобасы</comment>
+ <comment xml:lang="ja">Glade プロジェクト</comment>
+ <comment xml:lang="it">Progetto Glade</comment>
+ <comment xml:lang="is">Glade verkefni</comment>
+ <comment xml:lang="id">Proyek Glade</comment>
+ <comment xml:lang="ia">Projecto Glade</comment>
+ <comment xml:lang="hu">Glade-projekt</comment>
+ <comment xml:lang="hr">Glade projekt</comment>
+ <comment xml:lang="he">מיזם Glade</comment>
+ <comment xml:lang="gl">proxecto de Glade</comment>
+ <comment xml:lang="ga">tionscadal Glade</comment>
+ <comment xml:lang="fur">progjet Glade</comment>
+ <comment xml:lang="fr">projet Glade</comment>
+ <comment xml:lang="fo">Glade verkætlan</comment>
+ <comment xml:lang="fi">Glade-projekti</comment>
+ <comment xml:lang="eu">Glade proiektua</comment>
+ <comment xml:lang="es">proyecto de Glade</comment>
+ <comment xml:lang="eo">Glade-projekto</comment>
+ <comment xml:lang="en_GB">Glade project</comment>
+ <comment xml:lang="el">Έργο Glade</comment>
+ <comment xml:lang="de">Glade-Projekt</comment>
+ <comment xml:lang="da">Gladeprojekt</comment>
+ <comment xml:lang="cy">Prosiect Glade</comment>
+ <comment xml:lang="cs">projekt Glade</comment>
+ <comment xml:lang="ca">projecte de Glade</comment>
+ <comment xml:lang="bg">Проект — Glade</comment>
+ <comment xml:lang="be@latin">Prajekt Glade</comment>
+ <comment xml:lang="be">праект Glade</comment>
+ <comment xml:lang="az">Glade layihəsi</comment>
+ <comment xml:lang="ar">مشروع Glade</comment>
+ <comment xml:lang="af">Glade-projek</comment>
<sub-class-of type="application/xml"/>
<generic-icon name="x-office-document"/>
<glob pattern="*.glade"/>
- <magic priority="50">
+ <magic>
<match type="string" value="&lt;glade-interface" offset="0:256"/>
</magic>
</mime-type>
<mime-type type="application/x-gnucash">
<comment>GnuCash financial data</comment>
- <comment xml:lang="af">GnuCash finansiële data</comment>
- <comment xml:lang="ar">معلومات GnuCash المالية</comment>
- <comment xml:lang="bg">Финансови данни — GnuCash</comment>
- <comment xml:lang="ca">dades financeres de GnuCash</comment>
- <comment xml:lang="cs">finanční data GnuCash</comment>
- <comment xml:lang="da">Finansielle data til GnuCash</comment>
- <comment xml:lang="de">GnuCash-Finanzdaten</comment>
- <comment xml:lang="el">Οικονομικά στοιχεία GnuCash</comment>
- <comment xml:lang="en-GB">GnuCash financial data</comment>
- <comment xml:lang="es">datos financieros de GnuCash</comment>
- <comment xml:lang="eu">GnuCash finantzako datuak</comment>
- <comment xml:lang="fi">GnuCash-taloustiedot</comment>
- <comment xml:lang="fo">GnuCash fíggjarligar dátur</comment>
- <comment xml:lang="fr">données financières GnuCash</comment>
- <comment xml:lang="fur">dâts finanziaris GnuCash</comment>
- <comment xml:lang="ga">sonraí airgeadúla GnuCash</comment>
- <comment xml:lang="gl">datos financeiros de GNUCash</comment>
- <comment xml:lang="he">מידע כלכלי של GnuCash</comment>
- <comment xml:lang="hr">GnuCash financijski podaci</comment>
- <comment xml:lang="hu">GnuCash pénzügyi adatok</comment>
- <comment xml:lang="ia">Datos financiari GnuCash</comment>
- <comment xml:lang="id">Data keuangan GnuCash</comment>
- <comment xml:lang="it">Dati finanziari GnuCash</comment>
- <comment xml:lang="ja">GnuCash 会計データ</comment>
- <comment xml:lang="kk">GnuCash қаржы ақпараты</comment>
- <comment xml:lang="ko">GnuCash 재정 자료</comment>
- <comment xml:lang="lt">GnuCash finansiniai duomenys</comment>
- <comment xml:lang="lv">GnuCash finanšu dati</comment>
- <comment xml:lang="nl">GnuCash financiële gegevens</comment>
- <comment xml:lang="oc">donadas financières GnuCash</comment>
- <comment xml:lang="pl">Dane finansowe GnuCash</comment>
- <comment xml:lang="pt">dados financeiros GnuCash</comment>
- <comment xml:lang="pt-BR">Dados financeiros do GnuCash</comment>
- <comment xml:lang="ro">Date financiare GnuCash</comment>
- <comment xml:lang="ru">Финансовые данные GnuCash</comment>
- <comment xml:lang="sk">Finančné údaje GnuCash</comment>
- <comment xml:lang="sl">Datoteka finančnih podatkov GnuCash</comment>
- <comment xml:lang="sr">финансијски подаци Гнуовог новца</comment>
- <comment xml:lang="sv">GnuCash-finansdata</comment>
- <comment xml:lang="tr">GnuCash mali verisi</comment>
- <comment xml:lang="uk">фінансові дані GnuCash</comment>
+ <comment xml:lang="zh_TW">GnuCash 財務資料</comment>
+ <comment xml:lang="zh_CN">GnuCash 财务数据</comment>
<comment xml:lang="vi">Dữ liệu tài chính GnuCash</comment>
- <comment xml:lang="zh-CN">GnuCash 财务数据</comment>
- <comment xml:lang="zh-TW">GnuCash 財務資料</comment>
+ <comment xml:lang="uk">фінансові дані GnuCash</comment>
+ <comment xml:lang="tr">GnuCash mali verisi</comment>
+ <comment xml:lang="sv">GnuCash-finansdata</comment>
+ <comment xml:lang="sr">финансијски подаци Гнуовог новца</comment>
+ <comment xml:lang="sq">të dhëna financiare GnuCash</comment>
+ <comment xml:lang="sl">Datoteka finančnih podatkov GnuCash</comment>
+ <comment xml:lang="si">GnuCash මූල්ය දත්ත</comment>
+ <comment xml:lang="sk">Finančné údaje GnuCash</comment>
+ <comment xml:lang="ru">Финансовые данные GnuCash</comment>
+ <comment xml:lang="ro">Date financiare GnuCash</comment>
+ <comment xml:lang="pt_BR">Dados financeiros do GnuCash</comment>
+ <comment xml:lang="pt">dados financeiros GnuCash</comment>
+ <comment xml:lang="pl">Dane finansowe GnuCash</comment>
+ <comment xml:lang="oc">donadas financières GnuCash</comment>
+ <comment xml:lang="nl">GnuCash financiële gegevens</comment>
+ <comment xml:lang="lv">GnuCash finanšu dati</comment>
+ <comment xml:lang="lt">GnuCash finansiniai duomenys</comment>
+ <comment xml:lang="ko">GnuCash 재정 자료</comment>
+ <comment xml:lang="kk">GnuCash қаржы ақпараты</comment>
+ <comment xml:lang="ja">GnuCash 会計データ</comment>
+ <comment xml:lang="it">Dati finanziari GnuCash</comment>
+ <comment xml:lang="is">GnuCash fjárhagsgögn</comment>
+ <comment xml:lang="id">Data keuangan GnuCash</comment>
+ <comment xml:lang="ia">Datos financiari GnuCash</comment>
+ <comment xml:lang="hu">GnuCash pénzügyi adatok</comment>
+ <comment xml:lang="hr">GnuCash financijski podaci</comment>
+ <comment xml:lang="he">מידע כלכלי של GnuCash</comment>
+ <comment xml:lang="gl">datos financeiros de GNUCash</comment>
+ <comment xml:lang="ga">sonraí airgeadúla GnuCash</comment>
+ <comment xml:lang="fur">dâts finanziaris GnuCash</comment>
+ <comment xml:lang="fr">données financières GnuCash</comment>
+ <comment xml:lang="fo">GnuCash fíggjarligar dátur</comment>
+ <comment xml:lang="fi">GnuCash-taloustiedot</comment>
+ <comment xml:lang="eu">GnuCash finantzako datuak</comment>
+ <comment xml:lang="es">datos financieros de GnuCash</comment>
+ <comment xml:lang="en_GB">GnuCash financial data</comment>
+ <comment xml:lang="el">Οικονομικά στοιχεία GnuCash</comment>
+ <comment xml:lang="de">GnuCash-Finanzdaten</comment>
+ <comment xml:lang="da">Finansielle data til GnuCash</comment>
+ <comment xml:lang="cs">finanční data GnuCash</comment>
+ <comment xml:lang="ca">dades financeres de GnuCash</comment>
+ <comment xml:lang="bg">Финансови данни — GnuCash</comment>
+ <comment xml:lang="be">фінансавыя даныя GnuCash</comment>
+ <comment xml:lang="ar">بيانات مالية GnuCash</comment>
+ <comment xml:lang="af">GnuCash finansiële data</comment>
<generic-icon name="x-office-spreadsheet"/>
<glob pattern="*.gnucash"/>
<glob pattern="*.gnc"/>
@@ -12808,58 +13252,61 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-gnumeric">
<comment>Gnumeric spreadsheet</comment>
- <comment xml:lang="af">Gnumeric-sigblad</comment>
- <comment xml:lang="ar">جدول Gnumeric</comment>
- <comment xml:lang="be-Latn">Raźlikovy arkuš Gnumeric</comment>
- <comment xml:lang="bg">Таблица — Gnumeric</comment>
- <comment xml:lang="ca">full de càlcul de Gnumeric</comment>
- <comment xml:lang="cs">sešit Gnumeric</comment>
- <comment xml:lang="da">Gnumeric-regneark</comment>
- <comment xml:lang="de">Gnumeric-Tabelle</comment>
- <comment xml:lang="el">Λογιστικό φύλλο Gnumeric</comment>
- <comment xml:lang="en-GB">Gnumeric spreadsheet</comment>
- <comment xml:lang="eo">Gnumeric-kalkultabelo</comment>
- <comment xml:lang="es">hoja de cálculo de Gnumeric</comment>
- <comment xml:lang="eu">Gnumeric kalkulu-orria</comment>
- <comment xml:lang="fi">Gnumeric-taulukko</comment>
- <comment xml:lang="fo">Gnumeric rokniark</comment>
- <comment xml:lang="fr">feuille de calcul Gnumeric</comment>
- <comment xml:lang="fur">sfuei di calcul Gnumeric</comment>
- <comment xml:lang="ga">scarbhileog Gnumeric</comment>
- <comment xml:lang="gl">folla de cálculo de Gnumeric</comment>
- <comment xml:lang="he">גליון עבודה Gnumeric</comment>
- <comment xml:lang="hr">Gnumeric proračunska tablica</comment>
- <comment xml:lang="hu">Gnumeric-munkafüzet</comment>
- <comment xml:lang="ia">Folio de calculo Gnumeric</comment>
- <comment xml:lang="id">Lembar sebar Gnumeric</comment>
- <comment xml:lang="it">Foglio di calcolo Gnumeric</comment>
- <comment xml:lang="ja">Gnumeric スプレッドシート</comment>
- <comment xml:lang="kk">Gnumeric электрондық кестесі</comment>
- <comment xml:lang="ko">Gnumeric 스프레드시트</comment>
- <comment xml:lang="lt">Gnumeric skaičialentė</comment>
- <comment xml:lang="lv">Gnumeric izklājlapa</comment>
- <comment xml:lang="ms">Hamparan Gnumeric</comment>
- <comment xml:lang="nb">Gnumeric-regneark</comment>
- <comment xml:lang="nl">Gnumeric-rekenblad</comment>
- <comment xml:lang="nn">Gnumeric-rekneark</comment>
- <comment xml:lang="oc">fuèlh de calcul Gnumeric</comment>
- <comment xml:lang="pl">Arkusz Gnumeric</comment>
- <comment xml:lang="pt">folha de cálculo Gnumeric</comment>
- <comment xml:lang="pt-BR">Planilha do Gnumeric</comment>
- <comment xml:lang="ro">Foaie de calcul Gnumeric</comment>
- <comment xml:lang="ru">Электронная таблица Gnumeric</comment>
- <comment xml:lang="sk">Zošit Gnumeric</comment>
- <comment xml:lang="sl">Razpredelnica Gnumeric</comment>
- <comment xml:lang="sq">Fletë llogaritjesh Gnumeric</comment>
- <comment xml:lang="sr">табела Гномовог бројевника</comment>
- <comment xml:lang="sv">Gnumeric-kalkylblad</comment>
- <comment xml:lang="tr">Gnumeric hesap çizelgesi</comment>
- <comment xml:lang="uk">ел. таблиця Gnumeric</comment>
+ <comment xml:lang="zh_TW">Gnumeric 試算表</comment>
+ <comment xml:lang="zh_CN">Gnumeric 电子表格</comment>
<comment xml:lang="vi">Bảng tính Gnumeric.</comment>
- <comment xml:lang="zh-CN">Gnumeric 电子表格</comment>
- <comment xml:lang="zh-TW">Gnumeric 試算表</comment>
+ <comment xml:lang="uk">електронна таблиця Gnumeric</comment>
+ <comment xml:lang="tr">Gnumeric hesap çizelgesi</comment>
+ <comment xml:lang="sv">Gnumeric-kalkylblad</comment>
+ <comment xml:lang="sr">табела Гномовог бројевника</comment>
+ <comment xml:lang="sq">fletëllogaritjesh Gnumeric</comment>
+ <comment xml:lang="sl">Razpredelnica Gnumeric</comment>
+ <comment xml:lang="si">Gnumeric පැතුරුම්පත</comment>
+ <comment xml:lang="sk">Zošit Gnumeric</comment>
+ <comment xml:lang="ru">Электронная таблица Gnumeric</comment>
+ <comment xml:lang="ro">Foaie de calcul Gnumeric</comment>
+ <comment xml:lang="pt_BR">Planilha do Gnumeric</comment>
+ <comment xml:lang="pt">folha de cálculo Gnumeric</comment>
+ <comment xml:lang="pl">Arkusz Gnumeric</comment>
+ <comment xml:lang="oc">fuèlh de calcul Gnumeric</comment>
+ <comment xml:lang="nn">Gnumeric-rekneark</comment>
+ <comment xml:lang="nl">Gnumeric-rekenblad</comment>
+ <comment xml:lang="nb">Gnumeric-regneark</comment>
+ <comment xml:lang="ms">Hamparan Gnumeric</comment>
+ <comment xml:lang="lv">Gnumeric izklājlapa</comment>
+ <comment xml:lang="lt">Gnumeric skaičialentė</comment>
+ <comment xml:lang="ko">Gnumeric 스프레드시트</comment>
+ <comment xml:lang="kk">Gnumeric электрондық кестесі</comment>
+ <comment xml:lang="ja">Gnumeric スプレッドシート</comment>
+ <comment xml:lang="it">Foglio di calcolo Gnumeric</comment>
+ <comment xml:lang="is">Gnumeric töflureikniskjal</comment>
+ <comment xml:lang="id">Lembar sebar Gnumeric</comment>
+ <comment xml:lang="ia">Folio de calculo Gnumeric</comment>
+ <comment xml:lang="hu">Gnumeric-munkafüzet</comment>
+ <comment xml:lang="hr">Gnumeric proračunska tablica</comment>
+ <comment xml:lang="he">גיליון עבודה של Gnumeric</comment>
+ <comment xml:lang="gl">folla de cálculo de Gnumeric</comment>
+ <comment xml:lang="ga">scarbhileog Gnumeric</comment>
+ <comment xml:lang="fur">sfuei di calcul Gnumeric</comment>
+ <comment xml:lang="fr">feuille de calcul Gnumeric</comment>
+ <comment xml:lang="fo">Gnumeric rokniark</comment>
+ <comment xml:lang="fi">Gnumeric-taulukko</comment>
+ <comment xml:lang="eu">Gnumeric kalkulu-orria</comment>
+ <comment xml:lang="es">hoja de cálculo de Gnumeric</comment>
+ <comment xml:lang="eo">Gnumeric-kalkultabelo</comment>
+ <comment xml:lang="en_GB">Gnumeric spreadsheet</comment>
+ <comment xml:lang="el">Λογιστικό φύλλο Gnumeric</comment>
+ <comment xml:lang="de">Gnumeric-Tabelle</comment>
+ <comment xml:lang="da">Gnumeric-regneark</comment>
+ <comment xml:lang="cs">sešit Gnumeric</comment>
+ <comment xml:lang="ca">full de càlcul de Gnumeric</comment>
+ <comment xml:lang="bg">Таблица — Gnumeric</comment>
+ <comment xml:lang="be@latin">Raźlikovy arkuš Gnumeric</comment>
+ <comment xml:lang="be">электронная табліца Gnumeric</comment>
+ <comment xml:lang="ar">جدول Gnumeric</comment>
+ <comment xml:lang="af">Gnumeric-sigblad</comment>
<generic-icon name="x-office-spreadsheet"/>
- <magic priority="50">
+ <magic>
<match type="string" value="gmr:Workbook" offset="0:64"/>
<match type="string" value="gnm:Workbook" offset="0:64"/>
</magic>
@@ -12867,56 +13314,59 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-gnuplot">
<comment>Gnuplot document</comment>
- <comment xml:lang="af">Gnuplot-dokument</comment>
- <comment xml:lang="ar">مستند Gnuplot</comment>
- <comment xml:lang="ast">Documentu de Gnuplot</comment>
- <comment xml:lang="be-Latn">Dakument Gnuplot</comment>
- <comment xml:lang="bg">Документ — Gnuplot</comment>
- <comment xml:lang="ca">document gnuplot</comment>
- <comment xml:lang="cs">dokument Gnuplot</comment>
- <comment xml:lang="da">Gnuplot-dokument</comment>
- <comment xml:lang="de">Gnuplot-Dokument</comment>
- <comment xml:lang="el">Έγγραφο Gnuplot</comment>
- <comment xml:lang="en-GB">Gnuplot document</comment>
- <comment xml:lang="eo">Gnuplot-dokumento</comment>
- <comment xml:lang="es">documento de Gnuplot</comment>
- <comment xml:lang="eu">Gnuplot dokumentua</comment>
- <comment xml:lang="fi">Gnuplot-asiakirja</comment>
- <comment xml:lang="fo">Gnuplot skjal</comment>
- <comment xml:lang="fr">document Gnuplot</comment>
- <comment xml:lang="fur">document Gnuplot</comment>
- <comment xml:lang="ga">cáipéis Gnuplot</comment>
- <comment xml:lang="gl">documento de Gnuplot</comment>
- <comment xml:lang="he">מסמך Gnuplot</comment>
- <comment xml:lang="hr">Gnuplot dokument</comment>
- <comment xml:lang="hu">Gnuplot dokumentum</comment>
- <comment xml:lang="ia">Documento Gnuplot</comment>
- <comment xml:lang="id">Dokumen Gnuplot</comment>
- <comment xml:lang="it">Documento Gnuplot</comment>
- <comment xml:lang="ja">Gnuplot ドキュメント</comment>
- <comment xml:lang="kk">Gnuplot құжаты</comment>
- <comment xml:lang="ko">Gnuplot 문서</comment>
- <comment xml:lang="lt">Gnuplot dokumentas</comment>
- <comment xml:lang="lv">Gnuplot dokuments</comment>
- <comment xml:lang="nb">Gnuplot-dokument</comment>
- <comment xml:lang="nl">Gnuplot-document</comment>
- <comment xml:lang="nn">Gnuplot-dokument</comment>
- <comment xml:lang="oc">document Gnuplot</comment>
- <comment xml:lang="pl">Dokument Gnuplot</comment>
- <comment xml:lang="pt">documento Gnuplot</comment>
- <comment xml:lang="pt-BR">Documento do Gnuplot</comment>
- <comment xml:lang="ro">Document Gnuplot</comment>
- <comment xml:lang="ru">Документ Gnuplot</comment>
- <comment xml:lang="sk">Dokument Gnuplot</comment>
- <comment xml:lang="sl">Dokument Gnuplot</comment>
- <comment xml:lang="sq">Dokument Gnuplot</comment>
- <comment xml:lang="sr">документ Гнуплота</comment>
- <comment xml:lang="sv">Gnuplot-dokument</comment>
- <comment xml:lang="tr">Gnuplot belgesi</comment>
- <comment xml:lang="uk">документ Gnuplot</comment>
+ <comment xml:lang="zh_TW">Gnuplot 文件</comment>
+ <comment xml:lang="zh_CN">Gnuplot 文档</comment>
<comment xml:lang="vi">Tài liệu Gnuplot</comment>
- <comment xml:lang="zh-CN">Gnuplot 文档</comment>
- <comment xml:lang="zh-TW">Gnuplot 文件</comment>
+ <comment xml:lang="uk">документ Gnuplot</comment>
+ <comment xml:lang="tr">Gnuplot belgesi</comment>
+ <comment xml:lang="sv">Gnuplot-dokument</comment>
+ <comment xml:lang="sr">документ Гнуплота</comment>
+ <comment xml:lang="sq">dokument Gnuplot</comment>
+ <comment xml:lang="sl">Dokument Gnuplot</comment>
+ <comment xml:lang="si">Gnuplot ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument Gnuplot</comment>
+ <comment xml:lang="ru">Документ Gnuplot</comment>
+ <comment xml:lang="ro">Document Gnuplot</comment>
+ <comment xml:lang="pt_BR">Documento do Gnuplot</comment>
+ <comment xml:lang="pt">documento Gnuplot</comment>
+ <comment xml:lang="pl">Dokument Gnuplot</comment>
+ <comment xml:lang="oc">document Gnuplot</comment>
+ <comment xml:lang="nn">Gnuplot-dokument</comment>
+ <comment xml:lang="nl">Gnuplot-document</comment>
+ <comment xml:lang="nb">Gnuplot-dokument</comment>
+ <comment xml:lang="lv">Gnuplot dokuments</comment>
+ <comment xml:lang="lt">Gnuplot dokumentas</comment>
+ <comment xml:lang="ko">Gnuplot 문서</comment>
+ <comment xml:lang="kk">Gnuplot құжаты</comment>
+ <comment xml:lang="ja">Gnuplot ドキュメント</comment>
+ <comment xml:lang="it">Documento Gnuplot</comment>
+ <comment xml:lang="is">Gnuplot skjal</comment>
+ <comment xml:lang="id">Dokumen Gnuplot</comment>
+ <comment xml:lang="ia">Documento Gnuplot</comment>
+ <comment xml:lang="hu">Gnuplot dokumentum</comment>
+ <comment xml:lang="hr">Gnuplot dokument</comment>
+ <comment xml:lang="he">מסמך Gnuplot</comment>
+ <comment xml:lang="gl">documento de Gnuplot</comment>
+ <comment xml:lang="ga">cáipéis Gnuplot</comment>
+ <comment xml:lang="fur">document Gnuplot</comment>
+ <comment xml:lang="fr">document Gnuplot</comment>
+ <comment xml:lang="fo">Gnuplot skjal</comment>
+ <comment xml:lang="fi">Gnuplot-asiakirja</comment>
+ <comment xml:lang="eu">Gnuplot dokumentua</comment>
+ <comment xml:lang="es">documento de Gnuplot</comment>
+ <comment xml:lang="eo">Gnuplot-dokumento</comment>
+ <comment xml:lang="en_GB">Gnuplot document</comment>
+ <comment xml:lang="el">Έγγραφο Gnuplot</comment>
+ <comment xml:lang="de">Gnuplot-Dokument</comment>
+ <comment xml:lang="da">Gnuplot-dokument</comment>
+ <comment xml:lang="cs">dokument Gnuplot</comment>
+ <comment xml:lang="ca">document gnuplot</comment>
+ <comment xml:lang="bg">Документ — Gnuplot</comment>
+ <comment xml:lang="be@latin">Dakument Gnuplot</comment>
+ <comment xml:lang="be">дакумент Gnuplot</comment>
+ <comment xml:lang="ast">Documentu de Gnuplot</comment>
+ <comment xml:lang="ar">مستند Gnuplot</comment>
+ <comment xml:lang="af">Gnuplot-dokument</comment>
<sub-class-of type="text/plain"/>
<generic-icon name="x-office-document"/>
<glob pattern="*.gp"/>
@@ -12925,223 +13375,235 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-graphite">
<comment>Graphite scientific graph</comment>
- <comment xml:lang="ar">مبيان الجرافيت العلمي</comment>
- <comment xml:lang="be-Latn">Navukovy hrafik Graphite</comment>
- <comment xml:lang="bg">Графика — Graphite</comment>
- <comment xml:lang="ca">gràfic científic Graphite</comment>
- <comment xml:lang="cs">vědecký graf Graphite</comment>
- <comment xml:lang="da">Graphite videnskabelig graf</comment>
- <comment xml:lang="de">Wissenschaftlicher Graphite-Graph</comment>
- <comment xml:lang="el">Επιστημονικό γράφημα Graphite</comment>
- <comment xml:lang="en-GB">Graphite scientific graph</comment>
- <comment xml:lang="eo">scienca grafikaĵo de Graphite</comment>
- <comment xml:lang="es">gráfico científico de Graphite</comment>
- <comment xml:lang="eu">Graphite - grafiko zientifikoak</comment>
- <comment xml:lang="fi">Graphite- tieteellinen graafi</comment>
- <comment xml:lang="fo">Grapite vísindarlig ritmynd</comment>
- <comment xml:lang="fr">graphe Graphite scientific</comment>
- <comment xml:lang="fur">grafic sientific Graphite</comment>
- <comment xml:lang="ga">graf eolaíochta Graphite</comment>
- <comment xml:lang="gl">gráfica científica de Graphite</comment>
- <comment xml:lang="he">תרשים מדעי של Graphite</comment>
- <comment xml:lang="hr">Graphite znanstveni grafikon</comment>
- <comment xml:lang="hu">Graphite tudományos grafikon</comment>
- <comment xml:lang="ia">Graphico scientific Graphite</comment>
- <comment xml:lang="id">Grafik sains Graphite</comment>
- <comment xml:lang="it">Grafico scientifico Graphite</comment>
- <comment xml:lang="ja">Graphite scientific グラフ</comment>
- <comment xml:lang="kk">Graphite ғылыми кескіні</comment>
- <comment xml:lang="ko">Graphite 과학 그래프</comment>
- <comment xml:lang="lt">Graphite mokslinė diagrama</comment>
- <comment xml:lang="lv">Graphite zinātniskais grafiks</comment>
- <comment xml:lang="ms">Graf saintifik Graphite</comment>
- <comment xml:lang="nb">Vitenskapelig graf fra Graphite</comment>
- <comment xml:lang="nl">Graphite wetenschappelijke grafiek</comment>
- <comment xml:lang="nn">Graphite vitskaplege graf</comment>
- <comment xml:lang="oc">graphe Graphite scientific</comment>
- <comment xml:lang="pl">Wykres naukowy Graphite</comment>
- <comment xml:lang="pt">gráfico científico Graphite</comment>
- <comment xml:lang="pt-BR">Gráfico científico do Graphite</comment>
- <comment xml:lang="ro">Grafic științific Graphite</comment>
- <comment xml:lang="ru">Научная диаграмма Graphite</comment>
- <comment xml:lang="sk">Vedecký graf Graphite</comment>
- <comment xml:lang="sl">Datoteka znanstvenega grafa Graphite</comment>
- <comment xml:lang="sq">Grafik shkencor Graphite </comment>
- <comment xml:lang="sr">Графитов научни графикони</comment>
- <comment xml:lang="sv">Vetenskaplig Graphite-grafer</comment>
- <comment xml:lang="tr">Graphite bilimsel grafiği</comment>
- <comment xml:lang="uk">наукова графіка Graphite</comment>
+ <comment xml:lang="zh_TW">Graphite 科學圖表</comment>
+ <comment xml:lang="zh_CN">Graphite 科学图形</comment>
<comment xml:lang="vi">Biểu đồ khoa học Graphite</comment>
- <comment xml:lang="zh-CN">Graphite 科学图形</comment>
- <comment xml:lang="zh-TW">Graphite 科學圖表</comment>
+ <comment xml:lang="uk">наукова графіка Graphite</comment>
+ <comment xml:lang="tr">Graphite bilimsel grafiği</comment>
+ <comment xml:lang="sv">Vetenskaplig Graphite-grafer</comment>
+ <comment xml:lang="sr">Графитов научни графикони</comment>
+ <comment xml:lang="sq">grafik shkencor Graphite</comment>
+ <comment xml:lang="sl">Datoteka znanstvenega grafa Graphite</comment>
+ <comment xml:lang="si">ග්රැෆයිට් විද්යාත්මක ප්රස්ථාරය</comment>
+ <comment xml:lang="sk">Vedecký graf Graphite</comment>
+ <comment xml:lang="ru">Научная диаграмма Graphite</comment>
+ <comment xml:lang="ro">Grafic științific Graphite</comment>
+ <comment xml:lang="pt_BR">Gráfico científico do Graphite</comment>
+ <comment xml:lang="pt">gráfico científico Graphite</comment>
+ <comment xml:lang="pl">Wykres naukowy Graphite</comment>
+ <comment xml:lang="oc">graphe Graphite scientific</comment>
+ <comment xml:lang="nn">Graphite vitskaplege graf</comment>
+ <comment xml:lang="nl">Graphite wetenschappelijke grafiek</comment>
+ <comment xml:lang="nb">Vitenskapelig graf fra Graphite</comment>
+ <comment xml:lang="ms">Graf saintifik Graphite</comment>
+ <comment xml:lang="lv">Graphite zinātniskais grafiks</comment>
+ <comment xml:lang="lt">Graphite mokslinė diagrama</comment>
+ <comment xml:lang="ko">Graphite 과학 그래프</comment>
+ <comment xml:lang="kk">Graphite ғылыми кескіні</comment>
+ <comment xml:lang="ja">Graphite scientific グラフ</comment>
+ <comment xml:lang="it">Grafico scientifico Graphite</comment>
+ <comment xml:lang="is">Graphite vísindalegt graf</comment>
+ <comment xml:lang="id">Grafik sains Graphite</comment>
+ <comment xml:lang="ia">Graphico scientific Graphite</comment>
+ <comment xml:lang="hu">Graphite tudományos grafikon</comment>
+ <comment xml:lang="hr">Graphite znanstveni grafikon</comment>
+ <comment xml:lang="he">תרשים מדעי של Graphite</comment>
+ <comment xml:lang="gl">gráfica científica de Graphite</comment>
+ <comment xml:lang="ga">graf eolaíochta Graphite</comment>
+ <comment xml:lang="fur">grafic sientific Graphite</comment>
+ <comment xml:lang="fr">graphe Graphite scientific</comment>
+ <comment xml:lang="fo">Grapite vísindarlig ritmynd</comment>
+ <comment xml:lang="fi">Graphite- tieteellinen graafi</comment>
+ <comment xml:lang="eu">Graphite - grafiko zientifikoak</comment>
+ <comment xml:lang="es">gráfico científico de Graphite</comment>
+ <comment xml:lang="eo">scienca grafikaĵo de Graphite</comment>
+ <comment xml:lang="en_GB">Graphite scientific graph</comment>
+ <comment xml:lang="el">Επιστημονικό γράφημα Graphite</comment>
+ <comment xml:lang="de">Wissenschaftlicher Graphite-Graph</comment>
+ <comment xml:lang="da">Graphite videnskabelig graf</comment>
+ <comment xml:lang="cs">vědecký graf Graphite</comment>
+ <comment xml:lang="ca">gràfic científic Graphite</comment>
+ <comment xml:lang="bg">Графика — Graphite</comment>
+ <comment xml:lang="be@latin">Navukovy hrafik Graphite</comment>
+ <comment xml:lang="be">навуковы граф Graphite</comment>
+ <comment xml:lang="ar">مبيان جرافيت علمي</comment>
<generic-icon name="x-office-document"/>
<glob pattern="*.gra"/>
</mime-type>
<mime-type type="application/x-gtktalog">
<comment>GTKtalog catalog</comment>
- <comment xml:lang="ar">كتالوج GTKtalog</comment>
- <comment xml:lang="be-Latn">Kataloh GTKtalog</comment>
- <comment xml:lang="bg">Каталог — Gtktalog</comment>
- <comment xml:lang="ca">catàleg de GTKtalog</comment>
- <comment xml:lang="cs">katalog GTKtalog</comment>
- <comment xml:lang="da">GTKtalog-katalog</comment>
- <comment xml:lang="de">GTKtalog-Katalog</comment>
- <comment xml:lang="el">Κατάλογος GTKtalog</comment>
- <comment xml:lang="en-GB">GTKtalog catalogue</comment>
- <comment xml:lang="eo">katalogo de GTKtalog</comment>
- <comment xml:lang="es">catálogo de GTKtalog</comment>
- <comment xml:lang="eu">Gtktalog katalogoa</comment>
- <comment xml:lang="fi">GTKtalog-luettelo</comment>
- <comment xml:lang="fo">GTKtalog skrá</comment>
- <comment xml:lang="fr">catalogue Gtktalog</comment>
- <comment xml:lang="fur">catalic GTKtalog</comment>
- <comment xml:lang="ga">catalóg GTKtalog</comment>
- <comment xml:lang="gl">catálogo de GTKtalog</comment>
- <comment xml:lang="he">קטלוג GTKtalog</comment>
- <comment xml:lang="hr">GTKtalog katalog</comment>
- <comment xml:lang="hu">GTKtalog-katalógus</comment>
- <comment xml:lang="ia">Catalogo GTKtalog</comment>
- <comment xml:lang="id">Katalog GTKtalog</comment>
- <comment xml:lang="it">Catalogo GTKtalog</comment>
- <comment xml:lang="ja">GTKtalog カタログ</comment>
- <comment xml:lang="ka">GTKtalog-ის კატალოგი</comment>
- <comment xml:lang="kk">GTKtalog каталогы</comment>
- <comment xml:lang="ko">GTKtalog 카탈로그</comment>
- <comment xml:lang="lt">GTKtalog katalogas</comment>
- <comment xml:lang="lv">GTKtalog katalogs</comment>
- <comment xml:lang="ms">Katalog GTKtalog</comment>
- <comment xml:lang="nb">GTKtalog-katalog</comment>
- <comment xml:lang="nl">GTKtalog-catalogus</comment>
- <comment xml:lang="nn">GTKtalog-katalog</comment>
- <comment xml:lang="oc">catalòg Gtktalog</comment>
- <comment xml:lang="pl">Katalog programu GTKtalog</comment>
- <comment xml:lang="pt">catálogo GTKtalog</comment>
- <comment xml:lang="pt-BR">Catálogo GTKtalog</comment>
- <comment xml:lang="ro">Catalog GTKalog</comment>
- <comment xml:lang="ru">Каталог GTKtalog</comment>
- <comment xml:lang="sk">Katalóg GTKtalog</comment>
- <comment xml:lang="sl">Datoteka kataloga GTKtalog</comment>
- <comment xml:lang="sq">Katallog GTKtalog</comment>
- <comment xml:lang="sr">каталог ГТКталога</comment>
- <comment xml:lang="sv">GTKtalog-katalog</comment>
- <comment xml:lang="tr">GTKtalog kataloğu</comment>
- <comment xml:lang="uk">каталог GTKtalog</comment>
+ <comment xml:lang="zh_TW">GTKtalog 光碟目錄</comment>
+ <comment xml:lang="zh_CN">GTKtalog 目录</comment>
<comment xml:lang="vi">Phân loại GTKtalog</comment>
- <comment xml:lang="zh-CN">GTKtalog 目录</comment>
- <comment xml:lang="zh-TW">GTKtalog 光碟目錄</comment>
+ <comment xml:lang="uk">каталог GTKtalog</comment>
+ <comment xml:lang="tr">GTKtalog kataloğu</comment>
+ <comment xml:lang="sv">GTKtalog-katalog</comment>
+ <comment xml:lang="sr">каталог ГТКталога</comment>
+ <comment xml:lang="sq">katalog GTKtalog</comment>
+ <comment xml:lang="sl">Datoteka kataloga GTKtalog</comment>
+ <comment xml:lang="si">GTKtalog නාමාවලිය</comment>
+ <comment xml:lang="sk">Katalóg GTKtalog</comment>
+ <comment xml:lang="ru">Каталог GTKtalog</comment>
+ <comment xml:lang="ro">Catalog GTKalog</comment>
+ <comment xml:lang="pt_BR">Catálogo GTKtalog</comment>
+ <comment xml:lang="pt">catálogo GTKtalog</comment>
+ <comment xml:lang="pl">Katalog programu GTKtalog</comment>
+ <comment xml:lang="oc">catalòg Gtktalog</comment>
+ <comment xml:lang="nn">GTKtalog-katalog</comment>
+ <comment xml:lang="nl">GTKtalog-catalogus</comment>
+ <comment xml:lang="nb">GTKtalog-katalog</comment>
+ <comment xml:lang="ms">Katalog GTKtalog</comment>
+ <comment xml:lang="lv">GTKtalog katalogs</comment>
+ <comment xml:lang="lt">GTKtalog katalogas</comment>
+ <comment xml:lang="ko">GTKtalog 카탈로그</comment>
+ <comment xml:lang="kk">GTKtalog каталогы</comment>
+ <comment xml:lang="ka">GTKtalog-ის კატალოგი</comment>
+ <comment xml:lang="ja">GTKtalog カタログ</comment>
+ <comment xml:lang="it">Catalogo GTKtalog</comment>
+ <comment xml:lang="is">GTKtalog efnisskrá</comment>
+ <comment xml:lang="id">Katalog GTKtalog</comment>
+ <comment xml:lang="ia">Catalogo GTKtalog</comment>
+ <comment xml:lang="hu">GTKtalog-katalógus</comment>
+ <comment xml:lang="hr">GTKtalog katalog</comment>
+ <comment xml:lang="he">קטלוג GTKtalog</comment>
+ <comment xml:lang="gl">catálogo de GTKtalog</comment>
+ <comment xml:lang="ga">catalóg GTKtalog</comment>
+ <comment xml:lang="fur">catalic GTKtalog</comment>
+ <comment xml:lang="fr">catalogue Gtktalog</comment>
+ <comment xml:lang="fo">GTKtalog skrá</comment>
+ <comment xml:lang="fi">GTKtalog-luettelo</comment>
+ <comment xml:lang="eu">Gtktalog katalogoa</comment>
+ <comment xml:lang="es">catálogo de GTKtalog</comment>
+ <comment xml:lang="eo">katalogo de GTKtalog</comment>
+ <comment xml:lang="en_GB">GTKtalog catalogue</comment>
+ <comment xml:lang="el">Κατάλογος GTKtalog</comment>
+ <comment xml:lang="de">GTKtalog-Katalog</comment>
+ <comment xml:lang="da">GTKtalog-katalog</comment>
+ <comment xml:lang="cs">katalog GTKtalog</comment>
+ <comment xml:lang="ca">catàleg de GTKtalog</comment>
+ <comment xml:lang="bg">Каталог — Gtktalog</comment>
+ <comment xml:lang="be@latin">Kataloh GTKtalog</comment>
+ <comment xml:lang="be">каталог GTKtalog</comment>
+ <comment xml:lang="ar">كتالوج GTKtalog</comment>
<generic-icon name="x-office-document"/>
- <magic priority="50">
+ <magic>
<match type="string" value="gtktalog " offset="4"/>
</magic>
</mime-type>
<mime-type type="application/x-gzdvi">
<comment>TeX DVI document (gzip-compressed)</comment>
- <comment xml:lang="af">TeX DVI-dokument (gzip-saamgepers)</comment>
- <comment xml:lang="ar">مستند TeX DVI (مضغوط-gzip)</comment>
- <comment xml:lang="ast">Documentu Tex DVI (comprimíu en gzip)</comment>
- <comment xml:lang="be-Latn">Dakument TeX DVI (gzip-skampresavany)</comment>
- <comment xml:lang="bg">Документ — TeX DVI, компресиран с gzip</comment>
- <comment xml:lang="ca">document DVI de TeX (amb compressió gzip)</comment>
- <comment xml:lang="cs">dokument TeX DVI (komprimovaný pomocí gzip)</comment>
- <comment xml:lang="da">TeX DVI-dokument (gzip-komprimeret)</comment>
- <comment xml:lang="de">TeX-DVI-Dokument (gzip-komprimiert)</comment>
- <comment xml:lang="el">Έγγραφο TeX DVI (συμπιεσμένο με gzip)</comment>
- <comment xml:lang="en-GB">TeX DVI document (gzip-compressed)</comment>
- <comment xml:lang="es">documento DVI de TeX (comprimido con gzip)</comment>
- <comment xml:lang="eu">TeX DVI dokumentua (gzip-ekin konprimitua)</comment>
- <comment xml:lang="fi">TeX DVI -asiakirja (gzip-pakattu)</comment>
- <comment xml:lang="fo">TeX DVI skjal (gzip-stappað)</comment>
- <comment xml:lang="fr">document DVI TeX (compressé gzip)</comment>
- <comment xml:lang="fur">document DVI TeX (comprimût cun gzip)</comment>
- <comment xml:lang="ga">cáipéis DVI TeX (comhbhrúite le gzip)</comment>
- <comment xml:lang="gl">documento DVI de TeX (comprimido con gzip)</comment>
- <comment xml:lang="he">מסמך מסוג TeX DVI (מכווץ ע״י gzip)</comment>
- <comment xml:lang="hr">TeX DVI dokument (gzip sažet)</comment>
- <comment xml:lang="hu">TeX DVI dokumentum (gzip tömörítésű)</comment>
- <comment xml:lang="ia">Documento TeX DVI (comprimite con gzip)</comment>
- <comment xml:lang="id">Dokumen TeX DVI (terkompresi gzip)</comment>
- <comment xml:lang="it">Documento Tex DVI (compresso con gzip)</comment>
- <comment xml:lang="ja">Tex DVI ドキュメント (gzip 圧縮)</comment>
- <comment xml:lang="kk">TeX DVI құжаты (gzip-пен сығылған)</comment>
- <comment xml:lang="ko">TeX DVI 문서(GZIP 압축)</comment>
- <comment xml:lang="lt">TeX DVI dokumentas (suglaudintas su gzip)</comment>
- <comment xml:lang="lv">TeX DVI dokuments (saspiests ar gzip)</comment>
- <comment xml:lang="nb">TeX DVI-dokument (gzip-komprimert)</comment>
- <comment xml:lang="nl">TeX DVI-document (ingepakt met gzip)</comment>
- <comment xml:lang="nn">TeX DVI-dokument (pakka med gzip)</comment>
- <comment xml:lang="oc">document DVI TeX (compressat gzip)</comment>
- <comment xml:lang="pl">Dokument TeX DVI (kompresja gzip)</comment>
- <comment xml:lang="pt">documento TeX DVI (compressão gzip)</comment>
- <comment xml:lang="pt-BR">Documento DVI TeX (compactado com gzip)</comment>
- <comment xml:lang="ro">Document TeX DVI (comprimat gzip)</comment>
- <comment xml:lang="ru">Документ TeX DVI (сжатый gzip)</comment>
- <comment xml:lang="sk">Dokument TeX DVI (komprimovaný pomocou gzip)</comment>
- <comment xml:lang="sl">Dokument TeX DVI (stisnjen z gzip)</comment>
- <comment xml:lang="sq">Dokument TeX DVI (i kompresuar me gzip)</comment>
- <comment xml:lang="sr">ТеКс ДВИ документ (запакован гзип-ом)</comment>
- <comment xml:lang="sv">TeX DVI-dokument (gzip-komprimerat)</comment>
- <comment xml:lang="tr">TeX DVI belgesi (gzip ile sıkıştırılmış)</comment>
- <comment xml:lang="uk">документ TeX DVI (стиснений gzip)</comment>
+ <comment xml:lang="zh_TW">TeX DVI 文件 (gzip 壓縮)</comment>
+ <comment xml:lang="zh_CN">TeX DVI 文档(gzip 压缩)</comment>
<comment xml:lang="vi">Tài liệu DVI TeX (đã nén gzip)</comment>
- <comment xml:lang="zh-CN">TeX DVI 文档(gzip 压缩)</comment>
- <comment xml:lang="zh-TW">TeX DVI 文件 (gzip 壓縮)</comment>
+ <comment xml:lang="uk">документ TeX DVI (стиснений gzip)</comment>
+ <comment xml:lang="tr">TeX DVI belgesi (gzip ile sıkıştırılmış)</comment>
+ <comment xml:lang="sv">TeX DVI-dokument (gzip-komprimerat)</comment>
+ <comment xml:lang="sr">ТеКс ДВИ документ (запакован гзип-ом)</comment>
+ <comment xml:lang="sq">dokument TeX DVI (ngjeshur me gzip)</comment>
+ <comment xml:lang="sl">Dokument TeX DVI (stisnjen z gzip)</comment>
+ <comment xml:lang="si">TeX DVI ලේඛනය (gzip-සම්පීඩිත)</comment>
+ <comment xml:lang="sk">Dokument TeX DVI (komprimovaný pomocou gzip)</comment>
+ <comment xml:lang="ru">Документ DVI издательской системы TeX (сжатый gzip)</comment>
+ <comment xml:lang="ro">Document TeX DVI (comprimat gzip)</comment>
+ <comment xml:lang="pt_BR">Documento DVI TeX (compactado com gzip)</comment>
+ <comment xml:lang="pt">documento TeX DVI (compressão gzip)</comment>
+ <comment xml:lang="pl">Dokument TeX DVI (kompresja gzip)</comment>
+ <comment xml:lang="oc">document DVI TeX (compressat gzip)</comment>
+ <comment xml:lang="nn">TeX DVI-dokument (pakka med gzip)</comment>
+ <comment xml:lang="nl">TeX DVI-document (ingepakt met gzip)</comment>
+ <comment xml:lang="nb">TeX DVI-dokument (gzip-komprimert)</comment>
+ <comment xml:lang="lv">TeX DVI dokuments (saspiests ar gzip)</comment>
+ <comment xml:lang="lt">TeX DVI dokumentas (suglaudintas su gzip)</comment>
+ <comment xml:lang="ko">TeX DVI 문서(GZIP 압축)</comment>
+ <comment xml:lang="kk">TeX DVI құжаты (gzip-пен сығылған)</comment>
+ <comment xml:lang="ja">Tex DVI ドキュメント (gzip 圧縮)</comment>
+ <comment xml:lang="it">Documento Tex DVI (compresso con gzip)</comment>
+ <comment xml:lang="is">TeX DVI skjal (gzip-þjappað)</comment>
+ <comment xml:lang="id">Dokumen TeX DVI (terkompresi gzip)</comment>
+ <comment xml:lang="ia">Documento TeX DVI (comprimite con gzip)</comment>
+ <comment xml:lang="hu">TeX DVI dokumentum (gzip tömörítésű)</comment>
+ <comment xml:lang="hr">TeX DVI dokument (gzip sažet)</comment>
+ <comment xml:lang="he">מסמך מסוג TeX DVI (מכווץ ע״י gzip)</comment>
+ <comment xml:lang="gl">documento DVI de TeX (comprimido con gzip)</comment>
+ <comment xml:lang="ga">cáipéis DVI TeX (comhbhrúite le gzip)</comment>
+ <comment xml:lang="fur">document DVI TeX (comprimût cun gzip)</comment>
+ <comment xml:lang="fr">document DVI TeX (compressé gzip)</comment>
+ <comment xml:lang="fo">TeX DVI skjal (gzip-stappað)</comment>
+ <comment xml:lang="fi">TeX DVI -asiakirja (gzip-pakattu)</comment>
+ <comment xml:lang="eu">TeX DVI dokumentua (gzip-ekin konprimitua)</comment>
+ <comment xml:lang="es">documento DVI de TeX (comprimido con GZIP)</comment>
+ <comment xml:lang="en_GB">TeX DVI document (gzip-compressed)</comment>
+ <comment xml:lang="el">Έγγραφο TeX DVI (συμπιεσμένο με gzip)</comment>
+ <comment xml:lang="de">TeX-DVI-Dokument (gzip-komprimiert)</comment>
+ <comment xml:lang="da">TeX DVI-dokument (gzip-komprimeret)</comment>
+ <comment xml:lang="cs">dokument TeX DVI (komprimovaný pomocí gzip)</comment>
+ <comment xml:lang="ca">document DVI de TeX (amb compressió gzip)</comment>
+ <comment xml:lang="bg">Документ — TeX DVI, компресиран с gzip</comment>
+ <comment xml:lang="be@latin">Dakument TeX DVI (gzip-skampresavany)</comment>
+ <comment xml:lang="be">дакумент TeX DVI (сцісканне gzip)</comment>
+ <comment xml:lang="ast">Documentu Tex DVI (comprimíu en gzip)</comment>
+ <comment xml:lang="ar">مستند TeX DVI (مضغوط-gzip)</comment>
+ <comment xml:lang="af">TeX DVI-dokument (gzip-saamgepers)</comment>
<sub-class-of type="application/gzip"/>
<generic-icon name="x-office-document"/>
<glob pattern="*.dvi.gz"/>
</mime-type>
<mime-type type="application/gzip">
<comment>Gzip archive</comment>
- <comment xml:lang="af">Gzip-argief</comment>
- <comment xml:lang="ar">أرشيف Gzip</comment>
- <comment xml:lang="be-Latn">Archiŭ gzip</comment>
- <comment xml:lang="bg">Архив — gzip</comment>
- <comment xml:lang="ca">arxiu gzip</comment>
- <comment xml:lang="cs">archiv gzip</comment>
- <comment xml:lang="da">Gzip-arkiv</comment>
- <comment xml:lang="de">Gzip-Archiv</comment>
- <comment xml:lang="el">Συμπιεσμένο αρχείο Gzip</comment>
- <comment xml:lang="en-GB">Gzip archive</comment>
- <comment xml:lang="eo">Gzip-arkivo</comment>
- <comment xml:lang="es">archivador Gzip</comment>
- <comment xml:lang="eu">Gzip artxiboa</comment>
- <comment xml:lang="fi">Gzip-arkisto</comment>
- <comment xml:lang="fo">Gzip skjalasavn</comment>
- <comment xml:lang="fr">archive gzip</comment>
- <comment xml:lang="fur">archivi Gzip</comment>
- <comment xml:lang="ga">cartlann Gzip</comment>
- <comment xml:lang="gl">arquivo Gzip</comment>
- <comment xml:lang="he">ארכיון Gzip</comment>
- <comment xml:lang="hr">Gzip arhiva</comment>
- <comment xml:lang="hu">Gzip archívum</comment>
- <comment xml:lang="ia">Archivo Gzip</comment>
- <comment xml:lang="id">Arsip Gzip</comment>
- <comment xml:lang="it">Archivio gzip</comment>
- <comment xml:lang="ja">Gzip アーカイブ</comment>
- <comment xml:lang="kk">Gzip архиві</comment>
- <comment xml:lang="ko">GZIP 압축 파일</comment>
- <comment xml:lang="lt">Gzip archyvas</comment>
- <comment xml:lang="lv">Gzip arhīvs</comment>
- <comment xml:lang="nb">Gzip-arkiv</comment>
- <comment xml:lang="nl">Gzip-archief</comment>
- <comment xml:lang="nn">Gzip-arkiv</comment>
- <comment xml:lang="oc">archiu gzip</comment>
- <comment xml:lang="pl">Archiwum gzip</comment>
- <comment xml:lang="pt">arquivo Gzip</comment>
- <comment xml:lang="pt-BR">Pacote Gzip</comment>
- <comment xml:lang="ro">Arhivă Gzip</comment>
- <comment xml:lang="ru">Архив GZIP</comment>
- <comment xml:lang="sk">Archív Gzip</comment>
- <comment xml:lang="sl">Datoteka arhiva Gzip</comment>
- <comment xml:lang="sq">Arkiv gzip</comment>
- <comment xml:lang="sr">Гзип архива</comment>
- <comment xml:lang="sv">Gzip-arkiv</comment>
- <comment xml:lang="tr">Gzip arşivi</comment>
- <comment xml:lang="uk">архів gzip</comment>
+ <comment xml:lang="zh_TW">Gzip 封存檔</comment>
+ <comment xml:lang="zh_CN">Gzip 归档文件</comment>
<comment xml:lang="vi">Kho nén gzip</comment>
- <comment xml:lang="zh-CN">Gzip 归档文件</comment>
- <comment xml:lang="zh-TW">Gzip 封存檔</comment>
+ <comment xml:lang="uk">архів gzip</comment>
+ <comment xml:lang="tr">Gzip arşivi</comment>
+ <comment xml:lang="sv">Gzip-arkiv</comment>
+ <comment xml:lang="sr">Гзип архива</comment>
+ <comment xml:lang="sq">arkiv gzip</comment>
+ <comment xml:lang="sl">Datoteka arhiva Gzip</comment>
+ <comment xml:lang="si">Gzip සංරක්ෂිතය</comment>
+ <comment xml:lang="sk">Archív Gzip</comment>
+ <comment xml:lang="ru">Архив GZIP</comment>
+ <comment xml:lang="ro">Arhivă Gzip</comment>
+ <comment xml:lang="pt_BR">Pacote Gzip</comment>
+ <comment xml:lang="pt">arquivo Gzip</comment>
+ <comment xml:lang="pl">Archiwum gzip</comment>
+ <comment xml:lang="oc">archiu gzip</comment>
+ <comment xml:lang="nn">Gzip-arkiv</comment>
+ <comment xml:lang="nl">Gzip-archief</comment>
+ <comment xml:lang="nb">Gzip-arkiv</comment>
+ <comment xml:lang="lv">Gzip arhīvs</comment>
+ <comment xml:lang="lt">Gzip archyvas</comment>
+ <comment xml:lang="ko">GZIP 압축 파일</comment>
+ <comment xml:lang="kk">Gzip архиві</comment>
+ <comment xml:lang="ja">Gzip アーカイブ</comment>
+ <comment xml:lang="it">Archivio gzip</comment>
+ <comment xml:lang="is">gzip safnskrá</comment>
+ <comment xml:lang="id">Arsip Gzip</comment>
+ <comment xml:lang="ia">Archivo Gzip</comment>
+ <comment xml:lang="hu">Gzip archívum</comment>
+ <comment xml:lang="hr">Gzip arhiva</comment>
+ <comment xml:lang="he">ארכיון Gzip</comment>
+ <comment xml:lang="gl">arquivo Gzip</comment>
+ <comment xml:lang="ga">cartlann Gzip</comment>
+ <comment xml:lang="fur">archivi Gzip</comment>
+ <comment xml:lang="fr">archive gzip</comment>
+ <comment xml:lang="fo">Gzip skjalasavn</comment>
+ <comment xml:lang="fi">Gzip-arkisto</comment>
+ <comment xml:lang="eu">Gzip artxiboa</comment>
+ <comment xml:lang="es">archivador GZIP</comment>
+ <comment xml:lang="eo">Gzip-arkivo</comment>
+ <comment xml:lang="en_GB">Gzip archive</comment>
+ <comment xml:lang="el">Συμπιεσμένο αρχείο Gzip</comment>
+ <comment xml:lang="de">Gzip-Archiv</comment>
+ <comment xml:lang="da">Gzip-arkiv</comment>
+ <comment xml:lang="cs">archiv gzip</comment>
+ <comment xml:lang="ca">arxiu gzip</comment>
+ <comment xml:lang="bg">Архив — gzip</comment>
+ <comment xml:lang="be@latin">Archiŭ gzip</comment>
+ <comment xml:lang="be">архіў gzip</comment>
+ <comment xml:lang="ar">أرشيف Gzip</comment>
+ <comment xml:lang="af">Gzip-argief</comment>
<generic-icon name="package-x-generic"/>
- <magic priority="50">
+ <magic>
<match type="string" value="\037\213" offset="0"/>
</magic>
<glob pattern="*.gz"/>
@@ -13149,175 +13611,184 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-gzpdf">
<comment>PDF document (gzip-compressed)</comment>
- <comment xml:lang="af">PDF-dokument (gzip-saamgepers)</comment>
- <comment xml:lang="ar">مستند PDF (مضغوط-gzip)</comment>
- <comment xml:lang="ast">Documentu PDF (comprimíu en gzip)</comment>
- <comment xml:lang="be-Latn">Dakument PDF (gzip-skampresavany)</comment>
- <comment xml:lang="bg">Документ — PDF, компресиран с gzip</comment>
- <comment xml:lang="ca">document PDF (amb compressió gzip)</comment>
- <comment xml:lang="cs">dokument PDF (komprimovaný pomocí gzip)</comment>
- <comment xml:lang="da">PDF-dokument (gzip-komprimeret)</comment>
- <comment xml:lang="de">PDF-Dokument (gzip-komprimiert)</comment>
- <comment xml:lang="el">Έγγραφο PDF (συμπιεσμένο με gzip)</comment>
- <comment xml:lang="en-GB">PDF document (gzip-compressed)</comment>
- <comment xml:lang="es">documento PDF (comprimido con gzip)</comment>
- <comment xml:lang="eu">PDF dokumentua (gzip-ekin konprimitua)</comment>
- <comment xml:lang="fi">PDF-asiakirja (gzip-pakattu)</comment>
- <comment xml:lang="fo">PDF skjal (gzip-stappað)</comment>
- <comment xml:lang="fr">document PDF (compressé gzip)</comment>
- <comment xml:lang="fur">document PDF (comprimût cun gzip)</comment>
- <comment xml:lang="ga">cáipéis PDF (comhbhrúite le gzip)</comment>
- <comment xml:lang="gl">documento PDF (comprimido en gzip)</comment>
- <comment xml:lang="he">מסמך PDF (מכווץ ע״י gzip)</comment>
- <comment xml:lang="hr">PDF dokument (gzip sažet)</comment>
- <comment xml:lang="hu">PDF dokumentum (gzip tömörítésű)</comment>
- <comment xml:lang="ia">Documento PDF (comprimite con gzip)</comment>
- <comment xml:lang="id">Dokumen PDF (terkompresi gzip)</comment>
- <comment xml:lang="it">Documento PDF (compresso con gzip)</comment>
- <comment xml:lang="ja">PDF ドキュメント (gzip 圧縮)</comment>
- <comment xml:lang="kk">PDF құжаты (gzip-пен сығылған)</comment>
- <comment xml:lang="ko">PDF 문서(GZIP 압축)</comment>
- <comment xml:lang="lt">PDF dokumentas (suglaudintas su gzip)</comment>
- <comment xml:lang="lv">PDF dokuments (saspiests ar gzip)</comment>
- <comment xml:lang="nb">PDF-dokument (gzip-komprimert)</comment>
- <comment xml:lang="nl">PDF-document (ingepakt met gzip)</comment>
- <comment xml:lang="nn">PDF-dokument (pakka med gzip)</comment>
- <comment xml:lang="oc">document PDF (compressat gzip)</comment>
- <comment xml:lang="pl">Dokument PDF (kompresja gzip)</comment>
- <comment xml:lang="pt">documento PDF (compressão gzip)</comment>
- <comment xml:lang="pt-BR">Documento PDF (compactado com gzip)</comment>
- <comment xml:lang="ro">Document PDF (comprimat gzip)</comment>
- <comment xml:lang="ru">Документ PDF (сжатый gzip)</comment>
- <comment xml:lang="sk">Dokument PDF (komprimovaný pomocou gzip)</comment>
- <comment xml:lang="sl">Dokument PDF (stisnjen z gzip)</comment>
- <comment xml:lang="sq">Dokument PDF (i kompresuar me gzip)</comment>
- <comment xml:lang="sr">ПДФ документ (запакован гзип-ом)</comment>
- <comment xml:lang="sv">PDF-dokument (gzip-komprimerat)</comment>
- <comment xml:lang="tr">PDF belgesi (gzip ile sıkıştırılmış)</comment>
- <comment xml:lang="uk">документ PDF (стиснений gzip)</comment>
+ <comment xml:lang="zh_TW">PDF 文件 (gzip 壓縮)</comment>
+ <comment xml:lang="zh_CN">PDF 文档(gzip 压缩)</comment>
<comment xml:lang="vi">Tài liệu PDF (đã nén gzip)</comment>
- <comment xml:lang="zh-CN">PDF 文档(gzip 压缩)</comment>
- <comment xml:lang="zh-TW">PDF 文件 (gzip 壓縮)</comment>
+ <comment xml:lang="uk">документ PDF (стиснений gzip)</comment>
+ <comment xml:lang="tr">PDF belgesi (gzip ile sıkıştırılmış)</comment>
+ <comment xml:lang="sv">PDF-dokument (gzip-komprimerat)</comment>
+ <comment xml:lang="sr">ПДФ документ (запакован гзип-ом)</comment>
+ <comment xml:lang="sq">dokument PDF (ngjeshur me gzip)</comment>
+ <comment xml:lang="sl">Dokument PDF (stisnjen z gzip)</comment>
+ <comment xml:lang="si">PDF ලේඛනය (gzip-compressed)</comment>
+ <comment xml:lang="sk">Dokument PDF (komprimovaný pomocou gzip)</comment>
+ <comment xml:lang="ru">Документ PDF (сжатый gzip)</comment>
+ <comment xml:lang="ro">Document PDF (comprimat gzip)</comment>
+ <comment xml:lang="pt_BR">Documento PDF (compactado com gzip)</comment>
+ <comment xml:lang="pt">documento PDF (compressão gzip)</comment>
+ <comment xml:lang="pl">Dokument PDF (kompresja gzip)</comment>
+ <comment xml:lang="oc">document PDF (compressat gzip)</comment>
+ <comment xml:lang="nn">PDF-dokument (pakka med gzip)</comment>
+ <comment xml:lang="nl">PDF-document (ingepakt met gzip)</comment>
+ <comment xml:lang="nb">PDF-dokument (gzip-komprimert)</comment>
+ <comment xml:lang="lv">PDF dokuments (saspiests ar gzip)</comment>
+ <comment xml:lang="lt">PDF dokumentas (suglaudintas su gzip)</comment>
+ <comment xml:lang="ko">PDF 문서(GZIP 압축)</comment>
+ <comment xml:lang="kk">PDF құжаты (gzip-пен сығылған)</comment>
+ <comment xml:lang="ja">PDF ドキュメント (gzip 圧縮)</comment>
+ <comment xml:lang="it">Documento PDF (compresso con gzip)</comment>
+ <comment xml:lang="is">PDF skjal (gzip-þjappað)</comment>
+ <comment xml:lang="id">Dokumen PDF (terkompresi gzip)</comment>
+ <comment xml:lang="ia">Documento PDF (comprimite con gzip)</comment>
+ <comment xml:lang="hu">PDF dokumentum (gzip tömörítésű)</comment>
+ <comment xml:lang="hr">PDF dokument (gzip sažet)</comment>
+ <comment xml:lang="he">מסמך PDF (מכווץ ע״י gzip)</comment>
+ <comment xml:lang="gl">documento PDF (comprimido en gzip)</comment>
+ <comment xml:lang="ga">cáipéis PDF (comhbhrúite le gzip)</comment>
+ <comment xml:lang="fur">document PDF (comprimût cun gzip)</comment>
+ <comment xml:lang="fr">document PDF (compressé gzip)</comment>
+ <comment xml:lang="fo">PDF skjal (gzip-stappað)</comment>
+ <comment xml:lang="fi">PDF-asiakirja (gzip-pakattu)</comment>
+ <comment xml:lang="eu">PDF dokumentua (gzip-ekin konprimitua)</comment>
+ <comment xml:lang="es">documento PDF (comprimido con GZIP)</comment>
+ <comment xml:lang="en_GB">PDF document (gzip-compressed)</comment>
+ <comment xml:lang="el">Έγγραφο PDF (συμπιεσμένο με gzip)</comment>
+ <comment xml:lang="de">PDF-Dokument (gzip-komprimiert)</comment>
+ <comment xml:lang="da">PDF-dokument (gzip-komprimeret)</comment>
+ <comment xml:lang="cs">dokument PDF (komprimovaný pomocí gzip)</comment>
+ <comment xml:lang="ca">document PDF (amb compressió gzip)</comment>
+ <comment xml:lang="bg">Документ — PDF, компресиран с gzip</comment>
+ <comment xml:lang="be@latin">Dakument PDF (gzip-skampresavany)</comment>
+ <comment xml:lang="be">дакумент PDF (сцісканне gzip)</comment>
+ <comment xml:lang="ast">Documentu PDF (comprimíu en gzip)</comment>
+ <comment xml:lang="ar">مستند PDF (مضغوط-gzip)</comment>
+ <comment xml:lang="af">PDF-dokument (gzip-saamgepers)</comment>
<sub-class-of type="application/gzip"/>
<generic-icon name="x-office-document"/>
<glob pattern="*.pdf.gz"/>
</mime-type>
<mime-type type="application/x-gzpostscript">
<comment>PostScript document (gzip-compressed)</comment>
- <comment xml:lang="af">PostScript-dokument (gzip-saamgepers)</comment>
- <comment xml:lang="ar">مستند PostScript (مضغوط-gzip)</comment>
- <comment xml:lang="ast">Documentu PostScript (comprimíu en gzip)</comment>
- <comment xml:lang="be-Latn">Dakument PostScript (gzip-skampresavany)</comment>
- <comment xml:lang="bg">Документ — PostScript, компресиран с gzip</comment>
- <comment xml:lang="ca">document PostScript (amb compressió gzip)</comment>
- <comment xml:lang="cs">dokument PostScript (komprimovaný pomocí gzip)</comment>
- <comment xml:lang="da">PostScript-dokument (gzip-komprimeret)</comment>
- <comment xml:lang="de">PostScript-Dokument (gzip-komprimiert)</comment>
- <comment xml:lang="el">Έγγραφο PostScript (συμπιεσμένο με gzip)</comment>
- <comment xml:lang="en-GB">PostScript document (gzip-compressed)</comment>
- <comment xml:lang="eo">PostScript-dokumento (kunpremita per gzip)</comment>
- <comment xml:lang="es">documento PostScript (comprimido con gzip)</comment>
- <comment xml:lang="eu">PostScript dokumentua (gzip-konprimitua)</comment>
- <comment xml:lang="fi">PostScript-asiakirja (gzip-pakattu)</comment>
- <comment xml:lang="fo">PostScript skjal (gzip-stappað)</comment>
- <comment xml:lang="fr">document PostScript (compressé gzip)</comment>
- <comment xml:lang="fur">document PostScript (comprimût cun gzip)</comment>
- <comment xml:lang="ga">cáipéis PostScript (comhbhrúite le gzip)</comment>
- <comment xml:lang="gl">documento PostScript (comprimido con gzip)</comment>
- <comment xml:lang="he">מסמך PostScript (מכוות ע״י gzip)</comment>
- <comment xml:lang="hr">PostScript dokument (gzip sažet)</comment>
- <comment xml:lang="hu">PostScript-dokumentum (gzip tömörítésű)</comment>
- <comment xml:lang="ia">Documento PostScript (comprimite con gzip)</comment>
- <comment xml:lang="id">Dokumen PostScript (terkompresi gzip)</comment>
- <comment xml:lang="it">Documento PostScript (compresso con gzip)</comment>
- <comment xml:lang="ja">PostScript ドキュメント (gzip 圧縮)</comment>
- <comment xml:lang="kk">PostScript құжаты (gzip-пен сығылған)</comment>
- <comment xml:lang="ko">PostScript 문서(GZIP 압축)</comment>
- <comment xml:lang="lt">PostScript dokumentas (suglaudintas su gzip)</comment>
- <comment xml:lang="lv">PostScript dokuments (saspiests ar gzip)</comment>
- <comment xml:lang="ms">Dokumen PostScript (dimampatkan-gzip)</comment>
- <comment xml:lang="nb">PostScript-dokument (gzip-komprimert)</comment>
- <comment xml:lang="nl">PostScript-document (ingepakt met gzip)</comment>
- <comment xml:lang="nn">PostScript-dokument (pakka med gzip)</comment>
- <comment xml:lang="oc">document PostEscript (compressat gzip)</comment>
- <comment xml:lang="pl">Dokument PostScript (kompresja gzip)</comment>
- <comment xml:lang="pt">documento PostScript (compressão gzip)</comment>
- <comment xml:lang="pt-BR">Documento PostScript (compactado com gzip)</comment>
- <comment xml:lang="ro">Document PostScript (comprimat gzip)</comment>
- <comment xml:lang="ru">Документ PostScript (сжатый gzip)</comment>
- <comment xml:lang="sk">Dokument PostScript (komprimovaný pomocou gzip)</comment>
- <comment xml:lang="sl">Dokument PostScript (stisnjen z gzip)</comment>
- <comment xml:lang="sq">Dokument PostScript (i kompresuar me gzip)</comment>
- <comment xml:lang="sr">Постскрипт документ (запакован гзип-ом)</comment>
- <comment xml:lang="sv">Postscript-dokument (gzip-komprimerat)</comment>
- <comment xml:lang="tr">PostScript belgesi (gzip ile sıkıştırılmış)</comment>
- <comment xml:lang="uk">документ PostScript (стиснене gzip)</comment>
+ <comment xml:lang="zh_TW">PostScript 文件 (gzip 壓縮)</comment>
+ <comment xml:lang="zh_CN">PostScript 文档(gzip 压缩)</comment>
<comment xml:lang="vi">Tài liệu PostScript (đã nén gzip)</comment>
- <comment xml:lang="zh-CN">PostScript 文档(gzip 压缩)</comment>
- <comment xml:lang="zh-TW">PostScript 文件 (gzip 壓縮)</comment>
+ <comment xml:lang="uk">документ PostScript (стиснене gzip)</comment>
+ <comment xml:lang="tr">PostScript belgesi (gzip ile sıkıştırılmış)</comment>
+ <comment xml:lang="sv">Postscript-dokument (gzip-komprimerat)</comment>
+ <comment xml:lang="sr">Постскрипт документ (запакован гзип-ом)</comment>
+ <comment xml:lang="sq">dokument PostScript (ngjeshur me gzip)</comment>
+ <comment xml:lang="sl">Dokument PostScript (stisnjen z gzip)</comment>
+ <comment xml:lang="si">PostScript ලේඛනය (gzip-compressed)</comment>
+ <comment xml:lang="sk">Dokument PostScript (komprimovaný pomocou gzip)</comment>
+ <comment xml:lang="ru">Документ PostScript (сжатый gzip)</comment>
+ <comment xml:lang="ro">Document PostScript (comprimat gzip)</comment>
+ <comment xml:lang="pt_BR">Documento PostScript (compactado com gzip)</comment>
+ <comment xml:lang="pt">documento PostScript (compressão gzip)</comment>
+ <comment xml:lang="pl">Dokument PostScript (kompresja gzip)</comment>
+ <comment xml:lang="oc">document PostEscript (compressat gzip)</comment>
+ <comment xml:lang="nn">PostScript-dokument (pakka med gzip)</comment>
+ <comment xml:lang="nl">PostScript-document (ingepakt met gzip)</comment>
+ <comment xml:lang="nb">PostScript-dokument (gzip-komprimert)</comment>
+ <comment xml:lang="ms">Dokumen PostScript (dimampatkan-gzip)</comment>
+ <comment xml:lang="lv">PostScript dokuments (saspiests ar gzip)</comment>
+ <comment xml:lang="lt">PostScript dokumentas (suglaudintas su gzip)</comment>
+ <comment xml:lang="ko">PostScript 문서(GZIP 압축)</comment>
+ <comment xml:lang="kk">PostScript құжаты (gzip-пен сығылған)</comment>
+ <comment xml:lang="ja">PostScript ドキュメント (gzip 圧縮)</comment>
+ <comment xml:lang="it">Documento PostScript (compresso con gzip)</comment>
+ <comment xml:lang="is">PostScript skjal (gzip-þjappað)</comment>
+ <comment xml:lang="id">Dokumen PostScript (terkompresi gzip)</comment>
+ <comment xml:lang="ia">Documento PostScript (comprimite con gzip)</comment>
+ <comment xml:lang="hu">PostScript-dokumentum (gzip tömörítésű)</comment>
+ <comment xml:lang="hr">PostScript dokument (gzip sažet)</comment>
+ <comment xml:lang="he">מסמך PostScript (מכוות ע״י gzip)</comment>
+ <comment xml:lang="gl">documento PostScript (comprimido con gzip)</comment>
+ <comment xml:lang="ga">cáipéis PostScript (comhbhrúite le gzip)</comment>
+ <comment xml:lang="fur">document PostScript (comprimût cun gzip)</comment>
+ <comment xml:lang="fr">document PostScript (compressé gzip)</comment>
+ <comment xml:lang="fo">PostScript skjal (gzip-stappað)</comment>
+ <comment xml:lang="fi">PostScript-asiakirja (gzip-pakattu)</comment>
+ <comment xml:lang="eu">PostScript dokumentua (gzip-konprimitua)</comment>
+ <comment xml:lang="es">documento PostScript (comprimido con GZIP)</comment>
+ <comment xml:lang="eo">PostScript-dokumento (kunpremita per gzip)</comment>
+ <comment xml:lang="en_GB">PostScript document (gzip-compressed)</comment>
+ <comment xml:lang="el">Έγγραφο PostScript (συμπιεσμένο με gzip)</comment>
+ <comment xml:lang="de">PostScript-Dokument (gzip-komprimiert)</comment>
+ <comment xml:lang="da">PostScript-dokument (gzip-komprimeret)</comment>
+ <comment xml:lang="cs">dokument PostScript (komprimovaný pomocí gzip)</comment>
+ <comment xml:lang="ca">document PostScript (amb compressió gzip)</comment>
+ <comment xml:lang="bg">Документ — PostScript, компресиран с gzip</comment>
+ <comment xml:lang="be@latin">Dakument PostScript (gzip-skampresavany)</comment>
+ <comment xml:lang="be">дакумент PostScript (сцісканне gzip)</comment>
+ <comment xml:lang="ast">Documentu PostScript (comprimíu en gzip)</comment>
+ <comment xml:lang="ar">مستند PostScript (مضغوط-gzip)</comment>
+ <comment xml:lang="af">PostScript-dokument (gzip-saamgepers)</comment>
<sub-class-of type="application/gzip"/>
<generic-icon name="x-office-document"/>
<glob pattern="*.ps.gz"/>
</mime-type>
<mime-type type="application/x-hdf">
<comment>HDF document</comment>
- <comment xml:lang="af">HDF-dokument</comment>
- <comment xml:lang="ar">مستند HDF</comment>
- <comment xml:lang="ast">Documentu HDF</comment>
- <comment xml:lang="az">HDF sənədi</comment>
- <comment xml:lang="be-Latn">Dakument HDF</comment>
- <comment xml:lang="bg">Документ — HDF</comment>
- <comment xml:lang="ca">document HDF</comment>
- <comment xml:lang="cs">dokument HDF</comment>
- <comment xml:lang="cy">Dogfen HDF</comment>
- <comment xml:lang="da">HDF-dokument</comment>
- <comment xml:lang="de">HDF-Dokument</comment>
- <comment xml:lang="el">Έγγραφο HDF</comment>
- <comment xml:lang="en-GB">HDF document</comment>
- <comment xml:lang="eo">HDF-dokumento</comment>
- <comment xml:lang="es">documento HDF</comment>
- <comment xml:lang="eu">HDF dokumentua</comment>
- <comment xml:lang="fi">HDF-asiakirja</comment>
- <comment xml:lang="fo">HDF skjal</comment>
- <comment xml:lang="fr">document HDF</comment>
- <comment xml:lang="fur">document HDF</comment>
- <comment xml:lang="ga">cáipéis HDF</comment>
- <comment xml:lang="gl">documento HDF</comment>
- <comment xml:lang="he">מסמך HDF</comment>
- <comment xml:lang="hr">HDF dokument</comment>
- <comment xml:lang="hu">HDF-dokumentum</comment>
- <comment xml:lang="ia">Documento HDF</comment>
- <comment xml:lang="id">Dokumen HDF</comment>
- <comment xml:lang="it">Documento HDF</comment>
- <comment xml:lang="ja">HDF ドキュメント</comment>
- <comment xml:lang="kk">HDF құжаты</comment>
- <comment xml:lang="ko">HDF 문서</comment>
- <comment xml:lang="lt">HDF dokumentas</comment>
- <comment xml:lang="lv">HDF dokuments</comment>
- <comment xml:lang="ms">Dokumen HDF</comment>
- <comment xml:lang="nb">HDF-dokument</comment>
- <comment xml:lang="nl">HDF-document</comment>
- <comment xml:lang="nn">HDF-dokument</comment>
- <comment xml:lang="oc">document HDF</comment>
- <comment xml:lang="pl">Dokument HDF</comment>
- <comment xml:lang="pt">documento HDF</comment>
- <comment xml:lang="pt-BR">Documento HDF</comment>
- <comment xml:lang="ro">Document HDF</comment>
- <comment xml:lang="ru">Документ HDF</comment>
- <comment xml:lang="sk">Dokument HDF</comment>
- <comment xml:lang="sl">Dokument HDF</comment>
- <comment xml:lang="sq">Dokument HDF</comment>
- <comment xml:lang="sr">ХДФ документ</comment>
- <comment xml:lang="sv">HDF-dokument</comment>
- <comment xml:lang="tr">HDF belgesi</comment>
- <comment xml:lang="uk">документ HDF</comment>
+ <comment xml:lang="zh_TW">HDF 文件</comment>
+ <comment xml:lang="zh_CN">HDF 文档</comment>
<comment xml:lang="vi">Tài liệu HDF</comment>
- <comment xml:lang="zh-CN">HDF 文档</comment>
- <comment xml:lang="zh-TW">HDF 文件</comment>
+ <comment xml:lang="uk">документ HDF</comment>
+ <comment xml:lang="tr">HDF belgesi</comment>
+ <comment xml:lang="sv">HDF-dokument</comment>
+ <comment xml:lang="sr">ХДФ документ</comment>
+ <comment xml:lang="sq">dokument HDF</comment>
+ <comment xml:lang="sl">Dokument HDF</comment>
+ <comment xml:lang="si">HDF ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument HDF</comment>
+ <comment xml:lang="ru">Документ HDF</comment>
+ <comment xml:lang="ro">Document HDF</comment>
+ <comment xml:lang="pt_BR">Documento HDF</comment>
+ <comment xml:lang="pt">documento HDF</comment>
+ <comment xml:lang="pl">Dokument HDF</comment>
+ <comment xml:lang="oc">document HDF</comment>
+ <comment xml:lang="nn">HDF-dokument</comment>
+ <comment xml:lang="nl">HDF-document</comment>
+ <comment xml:lang="nb">HDF-dokument</comment>
+ <comment xml:lang="ms">Dokumen HDF</comment>
+ <comment xml:lang="lv">HDF dokuments</comment>
+ <comment xml:lang="lt">HDF dokumentas</comment>
+ <comment xml:lang="ko">HDF 문서</comment>
+ <comment xml:lang="kk">HDF құжаты</comment>
+ <comment xml:lang="ja">HDF ドキュメント</comment>
+ <comment xml:lang="it">Documento HDF</comment>
+ <comment xml:lang="is">HDF skjal</comment>
+ <comment xml:lang="id">Dokumen HDF</comment>
+ <comment xml:lang="ia">Documento HDF</comment>
+ <comment xml:lang="hu">HDF-dokumentum</comment>
+ <comment xml:lang="hr">HDF dokument</comment>
+ <comment xml:lang="he">מסמך HDF</comment>
+ <comment xml:lang="gl">documento HDF</comment>
+ <comment xml:lang="ga">cáipéis HDF</comment>
+ <comment xml:lang="fur">document HDF</comment>
+ <comment xml:lang="fr">document HDF</comment>
+ <comment xml:lang="fo">HDF skjal</comment>
+ <comment xml:lang="fi">HDF-asiakirja</comment>
+ <comment xml:lang="eu">HDF dokumentua</comment>
+ <comment xml:lang="es">documento HDF</comment>
+ <comment xml:lang="eo">HDF-dokumento</comment>
+ <comment xml:lang="en_GB">HDF document</comment>
+ <comment xml:lang="el">Έγγραφο HDF</comment>
+ <comment xml:lang="de">HDF-Dokument</comment>
+ <comment xml:lang="da">HDF-dokument</comment>
+ <comment xml:lang="cy">Dogfen HDF</comment>
+ <comment xml:lang="cs">dokument HDF</comment>
+ <comment xml:lang="ca">document HDF</comment>
+ <comment xml:lang="bg">Документ — HDF</comment>
+ <comment xml:lang="be@latin">Dakument HDF</comment>
+ <comment xml:lang="be">дакумент HDF</comment>
+ <comment xml:lang="az">HDF sənədi</comment>
+ <comment xml:lang="ast">Documentu HDF</comment>
+ <comment xml:lang="ar">مستند HDF</comment>
+ <comment xml:lang="af">HDF-dokument</comment>
<acronym>HDF</acronym>
<expanded-acronym>Hierarchical Data Format</expanded-acronym>
<generic-icon name="x-office-document"/>
- <magic priority="50">
+ <magic>
<match type="string" offset="0" value="\211HDF\r\n\032\n"/>
<match type="string" offset="0" value="\016\003\023\001"/>
</magic>
@@ -13329,44 +13800,50 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-iff">
<comment>IFF file</comment>
- <comment xml:lang="af">IFF-lêer</comment>
- <comment xml:lang="bg">Пакет — IFF</comment>
- <comment xml:lang="ca">fitxer IFF</comment>
- <comment xml:lang="cs">soubor IFF</comment>
- <comment xml:lang="da">IFF-fil</comment>
- <comment xml:lang="de">IFF-Datei</comment>
- <comment xml:lang="el">Αρχείο IFF</comment>
- <comment xml:lang="en-GB">IFF file</comment>
- <comment xml:lang="es">archivo IFF</comment>
- <comment xml:lang="eu">IFF fitxtegia</comment>
- <comment xml:lang="fi">IFF-tiedosto</comment>
- <comment xml:lang="fr">fichier IFF</comment>
- <comment xml:lang="fur">file IFF</comment>
- <comment xml:lang="ga">comhad IFF</comment>
- <comment xml:lang="gl">Ficheiro IFF</comment>
- <comment xml:lang="he">קובץ IFF</comment>
- <comment xml:lang="hr">IFF datoteka</comment>
- <comment xml:lang="hu">IFF fájl</comment>
- <comment xml:lang="ia">File IFF</comment>
- <comment xml:lang="id">Berkas IFF</comment>
- <comment xml:lang="it">File IFF</comment>
- <comment xml:lang="ja">IFF ファイル</comment>
- <comment xml:lang="kk">IFF файлы</comment>
- <comment xml:lang="ko">IFF 파일</comment>
- <comment xml:lang="lv">IFF datne</comment>
- <comment xml:lang="oc">fichièr IFF</comment>
- <comment xml:lang="pl">Plik IFF</comment>
- <comment xml:lang="pt">ficheiro IFF</comment>
- <comment xml:lang="pt-BR">Arquivo IFF</comment>
- <comment xml:lang="ru">Файл IFF</comment>
- <comment xml:lang="sk">Súbor IFF</comment>
- <comment xml:lang="sl">Datoteka IFF</comment>
- <comment xml:lang="sr">ИФФ датотека</comment>
- <comment xml:lang="sv">IFF-fil</comment>
- <comment xml:lang="tr">IFF dosyası</comment>
+ <comment xml:lang="zh_TW">IFF 檔案</comment>
+ <comment xml:lang="zh_CN">IFF 文件</comment>
<comment xml:lang="uk">файл IFF</comment>
- <comment xml:lang="zh-CN">IFF 文件</comment>
- <comment xml:lang="zh-TW">IFF 檔案</comment>
+ <comment xml:lang="tr">IFF dosyası</comment>
+ <comment xml:lang="sv">IFF-fil</comment>
+ <comment xml:lang="sr">ИФФ датотека</comment>
+ <comment xml:lang="sq">kartelë IFF</comment>
+ <comment xml:lang="sl">Datoteka IFF</comment>
+ <comment xml:lang="si">IFF ගොනුව</comment>
+ <comment xml:lang="sk">Súbor IFF</comment>
+ <comment xml:lang="ru">Файл IFF</comment>
+ <comment xml:lang="pt_BR">Arquivo IFF</comment>
+ <comment xml:lang="pt">ficheiro IFF</comment>
+ <comment xml:lang="pl">Plik IFF</comment>
+ <comment xml:lang="oc">fichièr IFF</comment>
+ <comment xml:lang="nl">IFF-bestand</comment>
+ <comment xml:lang="lv">IFF datne</comment>
+ <comment xml:lang="ko">IFF 파일</comment>
+ <comment xml:lang="kk">IFF файлы</comment>
+ <comment xml:lang="ja">IFF ファイル</comment>
+ <comment xml:lang="it">File IFF</comment>
+ <comment xml:lang="is">IFF skrá</comment>
+ <comment xml:lang="id">Berkas IFF</comment>
+ <comment xml:lang="ia">File IFF</comment>
+ <comment xml:lang="hu">IFF fájl</comment>
+ <comment xml:lang="hr">IFF datoteka</comment>
+ <comment xml:lang="he">קובץ IFF</comment>
+ <comment xml:lang="gl">Ficheiro IFF</comment>
+ <comment xml:lang="ga">comhad IFF</comment>
+ <comment xml:lang="fur">file IFF</comment>
+ <comment xml:lang="fr">fichier IFF</comment>
+ <comment xml:lang="fi">IFF-tiedosto</comment>
+ <comment xml:lang="eu">IFF fitxtegia</comment>
+ <comment xml:lang="es">archivo IFF</comment>
+ <comment xml:lang="en_GB">IFF file</comment>
+ <comment xml:lang="el">Αρχείο IFF</comment>
+ <comment xml:lang="de">IFF-Datei</comment>
+ <comment xml:lang="da">IFF-fil</comment>
+ <comment xml:lang="cs">soubor IFF</comment>
+ <comment xml:lang="ca">fitxer IFF</comment>
+ <comment xml:lang="bg">Пакет — IFF</comment>
+ <comment xml:lang="be">файл IFF</comment>
+ <comment xml:lang="ar">ملف IFF</comment>
+ <comment xml:lang="af">IFF-lêer</comment>
<acronym>IFF</acronym>
<expanded-acronym>Interchange File Format</expanded-acronym>
<magic priority="40">
@@ -13375,170 +13852,179 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-ipod-firmware">
<comment>iPod firmware</comment>
- <comment xml:lang="ar">برنامج عتاد الـiPod</comment>
- <comment xml:lang="be-Latn">Firmware iPod</comment>
- <comment xml:lang="bg">Фърмуер — iPod</comment>
- <comment xml:lang="ca">microprogramari d'iPod</comment>
- <comment xml:lang="cs">firmware iPod</comment>
- <comment xml:lang="da">iPod-styreprogram</comment>
- <comment xml:lang="de">iPod-Firmware</comment>
- <comment xml:lang="el">Υλικολογισμικό iPod</comment>
- <comment xml:lang="en-GB">iPod firmware</comment>
- <comment xml:lang="eo">iPod-mikroprogramaro</comment>
- <comment xml:lang="es">firmware de iPod</comment>
- <comment xml:lang="eu">iPod firmwarea</comment>
- <comment xml:lang="fi">iPod-laiteohjelmisto</comment>
- <comment xml:lang="fo">iPod fastbúnaður</comment>
- <comment xml:lang="fr">firmware iPod</comment>
- <comment xml:lang="fur">firmware iPod</comment>
- <comment xml:lang="ga">dochtearraí iPod</comment>
- <comment xml:lang="gl">firmware de iPod</comment>
- <comment xml:lang="he">קושחת ipod</comment>
- <comment xml:lang="hr">iPod firmver</comment>
- <comment xml:lang="hu">iPod-firmware</comment>
- <comment xml:lang="ia">Firmware iPod</comment>
- <comment xml:lang="id">peranti tegar iPod</comment>
- <comment xml:lang="it">Firmware iPod</comment>
- <comment xml:lang="ja">iPod ファームウェア</comment>
- <comment xml:lang="kk">iPod микробағдарламасы</comment>
- <comment xml:lang="ko">iPod 펌웨어</comment>
- <comment xml:lang="lt">iPod programinė įranga</comment>
- <comment xml:lang="lv">iPod aparātprogrammatūra</comment>
- <comment xml:lang="ms">Firmware iPod</comment>
- <comment xml:lang="nb">iPod-firmware</comment>
- <comment xml:lang="nl">iPod-firmware</comment>
- <comment xml:lang="nn">iPod-firmvare</comment>
- <comment xml:lang="oc">firmware iPod</comment>
- <comment xml:lang="pl">Oprogramowanie wewnętrzne iPod</comment>
- <comment xml:lang="pt">firmware iPod</comment>
- <comment xml:lang="pt-BR">Firmware do iPod</comment>
- <comment xml:lang="ro">Firmware iPod</comment>
- <comment xml:lang="ru">Микропрограмма iPod</comment>
- <comment xml:lang="sk">Firmware iPod</comment>
- <comment xml:lang="sl">Programska strojna oprema iPod</comment>
- <comment xml:lang="sq">Firmware iPod</comment>
- <comment xml:lang="sr">ајПод-ов уграђени</comment>
- <comment xml:lang="sv">fast iPod-program</comment>
- <comment xml:lang="tr">iPod donanım yazılımı</comment>
- <comment xml:lang="uk">мікропрограма iPod</comment>
+ <comment xml:lang="zh_TW">iPod 韌體</comment>
+ <comment xml:lang="zh_CN">iPod 固件</comment>
<comment xml:lang="vi">phần vững iPod</comment>
- <comment xml:lang="zh-CN">iPod 固件</comment>
- <comment xml:lang="zh-TW">iPod 韌體</comment>
- <magic priority="50">
+ <comment xml:lang="uk">мікропрограма iPod</comment>
+ <comment xml:lang="tr">iPod donanım yazılımı</comment>
+ <comment xml:lang="sv">fast iPod-program</comment>
+ <comment xml:lang="sr">ајПод-ов уграђени</comment>
+ <comment xml:lang="sq">firmware iPod</comment>
+ <comment xml:lang="sl">Programska strojna oprema iPod</comment>
+ <comment xml:lang="si">iPod ස්ථිරාංග</comment>
+ <comment xml:lang="sk">Firmware iPod</comment>
+ <comment xml:lang="ru">Микропрограмма iPod</comment>
+ <comment xml:lang="ro">Firmware iPod</comment>
+ <comment xml:lang="pt_BR">Firmware do iPod</comment>
+ <comment xml:lang="pt">firmware iPod</comment>
+ <comment xml:lang="pl">Oprogramowanie wewnętrzne iPod</comment>
+ <comment xml:lang="oc">firmware iPod</comment>
+ <comment xml:lang="nn">iPod-firmvare</comment>
+ <comment xml:lang="nl">iPod-firmware</comment>
+ <comment xml:lang="nb">iPod-firmware</comment>
+ <comment xml:lang="ms">Firmware iPod</comment>
+ <comment xml:lang="lv">iPod aparātprogrammatūra</comment>
+ <comment xml:lang="lt">iPod programinė įranga</comment>
+ <comment xml:lang="ko">iPod 펌웨어</comment>
+ <comment xml:lang="kk">iPod микробағдарламасы</comment>
+ <comment xml:lang="ja">iPod ファームウェア</comment>
+ <comment xml:lang="it">Firmware iPod</comment>
+ <comment xml:lang="is">iPod grunnhugbúnaður</comment>
+ <comment xml:lang="id">peranti tegar iPod</comment>
+ <comment xml:lang="ia">Firmware iPod</comment>
+ <comment xml:lang="hu">iPod-firmware</comment>
+ <comment xml:lang="hr">iPod firmver</comment>
+ <comment xml:lang="he">קושחת ipod</comment>
+ <comment xml:lang="gl">firmware de iPod</comment>
+ <comment xml:lang="ga">dochtearraí iPod</comment>
+ <comment xml:lang="fur">firmware iPod</comment>
+ <comment xml:lang="fr">firmware iPod</comment>
+ <comment xml:lang="fo">iPod fastbúnaður</comment>
+ <comment xml:lang="fi">iPod-laiteohjelmisto</comment>
+ <comment xml:lang="eu">iPod firmwarea</comment>
+ <comment xml:lang="es">firmware de iPod</comment>
+ <comment xml:lang="eo">iPod-mikroprogramaro</comment>
+ <comment xml:lang="en_GB">iPod firmware</comment>
+ <comment xml:lang="el">Υλικολογισμικό iPod</comment>
+ <comment xml:lang="de">iPod-Firmware</comment>
+ <comment xml:lang="da">iPod-styreprogram</comment>
+ <comment xml:lang="cs">firmware iPod</comment>
+ <comment xml:lang="ca">microprogramari d'iPod</comment>
+ <comment xml:lang="bg">Фърмуер — iPod</comment>
+ <comment xml:lang="be@latin">Firmware iPod</comment>
+ <comment xml:lang="be">убудаванае ПЗ iPod</comment>
+ <comment xml:lang="ar">برنامج عتاد الـiPod</comment>
+ <magic>
<match type="string" value="S T O P" offset="0"/>
</magic>
</mime-type>
- <mime-type type="application/x-java-archive">
+ <mime-type type="application/java-archive">
<comment>Java archive</comment>
- <comment xml:lang="af">Java-argief</comment>
- <comment xml:lang="ar">أرشيف Java</comment>
- <comment xml:lang="be-Latn">Archiŭ Java</comment>
- <comment xml:lang="bg">Архив — Java</comment>
- <comment xml:lang="ca">arxiu de Java</comment>
- <comment xml:lang="cs">archiv Java</comment>
- <comment xml:lang="da">Java-arkiv</comment>
- <comment xml:lang="de">Java-Archiv</comment>
- <comment xml:lang="el">Συμπιεσμένο αρχείο Java</comment>
- <comment xml:lang="en-GB">Java archive</comment>
- <comment xml:lang="eo">Java-arkivo</comment>
- <comment xml:lang="es">archivador Java</comment>
- <comment xml:lang="eu">Java artxiboa</comment>
- <comment xml:lang="fi">Java-arkisto</comment>
- <comment xml:lang="fo">Java skjalasavn</comment>
- <comment xml:lang="fr">archive Java</comment>
- <comment xml:lang="fur">archivi Java</comment>
- <comment xml:lang="ga">cartlann Java</comment>
- <comment xml:lang="gl">arquivo Java</comment>
- <comment xml:lang="he">ארכיון Java</comment>
- <comment xml:lang="hr">Java arhiva</comment>
- <comment xml:lang="hu">Java-archívum</comment>
- <comment xml:lang="ia">Archivo Java</comment>
- <comment xml:lang="id">Arsip Java</comment>
- <comment xml:lang="it">Archivio Java</comment>
- <comment xml:lang="ja">Java アーカイブ</comment>
- <comment xml:lang="kk">Java архиві</comment>
- <comment xml:lang="ko">Java 묶음 파일</comment>
- <comment xml:lang="lt">Java archyvas</comment>
- <comment xml:lang="lv">Java arhīvs</comment>
- <comment xml:lang="ms">Arkib Java</comment>
- <comment xml:lang="nb">Java-arkiv</comment>
- <comment xml:lang="nl">Java-archief</comment>
- <comment xml:lang="nn">Java-arkiv</comment>
- <comment xml:lang="oc">archiu Java</comment>
- <comment xml:lang="pl">Archiwum Java</comment>
- <comment xml:lang="pt">arquivo Java</comment>
- <comment xml:lang="pt-BR">Pacote Java</comment>
- <comment xml:lang="ro">Arhivă Java</comment>
- <comment xml:lang="ru">Архив Java</comment>
- <comment xml:lang="sk">Archív Java</comment>
- <comment xml:lang="sl">Datoteka arhiva Java</comment>
- <comment xml:lang="sq">Arkiv Java</comment>
- <comment xml:lang="sr">архива Јаве</comment>
- <comment xml:lang="sv">Java-arkiv</comment>
- <comment xml:lang="tr">Java arşivi</comment>
- <comment xml:lang="uk">архів Java</comment>
+ <comment xml:lang="zh_TW">Java 封存檔</comment>
+ <comment xml:lang="zh_CN">Java 归档文件</comment>
<comment xml:lang="vi">Kho nén Java</comment>
- <comment xml:lang="zh-CN">Java 归档文件</comment>
- <comment xml:lang="zh-TW">Java 封存檔</comment>
+ <comment xml:lang="uk">архів Java</comment>
+ <comment xml:lang="tr">Java arşivi</comment>
+ <comment xml:lang="sv">Java-arkiv</comment>
+ <comment xml:lang="sr">архива Јаве</comment>
+ <comment xml:lang="sq">arkiv Java</comment>
+ <comment xml:lang="sl">Datoteka arhiva Java</comment>
+ <comment xml:lang="si">ජාවා ලේඛනාගාරය</comment>
+ <comment xml:lang="sk">Archív Java</comment>
+ <comment xml:lang="ru">Архив Java</comment>
+ <comment xml:lang="ro">Arhivă Java</comment>
+ <comment xml:lang="pt_BR">Pacote Java</comment>
+ <comment xml:lang="pt">arquivo Java</comment>
+ <comment xml:lang="pl">Archiwum Java</comment>
+ <comment xml:lang="oc">archiu Java</comment>
+ <comment xml:lang="nn">Java-arkiv</comment>
+ <comment xml:lang="nl">Java-archief</comment>
+ <comment xml:lang="nb">Java-arkiv</comment>
+ <comment xml:lang="ms">Arkib Java</comment>
+ <comment xml:lang="lv">Java arhīvs</comment>
+ <comment xml:lang="lt">Java archyvas</comment>
+ <comment xml:lang="ko">Java 묶음 파일</comment>
+ <comment xml:lang="kk">Java архиві</comment>
+ <comment xml:lang="ja">Java アーカイブ</comment>
+ <comment xml:lang="it">Archivio Java</comment>
+ <comment xml:lang="is">Java safnskrá</comment>
+ <comment xml:lang="id">Arsip Java</comment>
+ <comment xml:lang="ia">Archivo Java</comment>
+ <comment xml:lang="hu">Java-archívum</comment>
+ <comment xml:lang="hr">Java arhiva</comment>
+ <comment xml:lang="he">ארכיון Java</comment>
+ <comment xml:lang="gl">arquivo Java</comment>
+ <comment xml:lang="ga">cartlann Java</comment>
+ <comment xml:lang="fur">archivi Java</comment>
+ <comment xml:lang="fr">archive Java</comment>
+ <comment xml:lang="fo">Java skjalasavn</comment>
+ <comment xml:lang="fi">Java-arkisto</comment>
+ <comment xml:lang="eu">Java artxiboa</comment>
+ <comment xml:lang="es">archivador de Java</comment>
+ <comment xml:lang="eo">Java-arkivo</comment>
+ <comment xml:lang="en_GB">Java archive</comment>
+ <comment xml:lang="el">Συμπιεσμένο αρχείο Java</comment>
+ <comment xml:lang="de">Java-Archiv</comment>
+ <comment xml:lang="da">Java-arkiv</comment>
+ <comment xml:lang="cs">archiv Java</comment>
+ <comment xml:lang="ca">arxiu de Java</comment>
+ <comment xml:lang="bg">Архив — Java</comment>
+ <comment xml:lang="be@latin">Archiŭ Java</comment>
+ <comment xml:lang="be">архіў Java</comment>
+ <comment xml:lang="ar">أرشيف Java</comment>
+ <comment xml:lang="af">Java-argief</comment>
<sub-class-of type="application/zip"/>
<generic-icon name="package-x-generic"/>
<alias type="application/x-jar"/>
- <alias type="application/java-archive"/>
+ <alias type="application/x-java-archive"/>
<glob pattern="*.jar"/>
</mime-type>
<mime-type type="application/x-java">
<comment>Java class</comment>
- <comment xml:lang="af">Java-klas</comment>
- <comment xml:lang="ar">صنف java</comment>
- <comment xml:lang="be-Latn">Klasa Java</comment>
- <comment xml:lang="bg">Клас — Java</comment>
- <comment xml:lang="ca">classe de Java</comment>
- <comment xml:lang="cs">třída Java</comment>
- <comment xml:lang="da">Java-klasse</comment>
- <comment xml:lang="de">Java-Klasse</comment>
- <comment xml:lang="el">Κλάση Java</comment>
- <comment xml:lang="en-GB">Java class</comment>
- <comment xml:lang="eo">Java-klaso</comment>
- <comment xml:lang="es">clase de Java</comment>
- <comment xml:lang="eu">Java-ko klasea</comment>
- <comment xml:lang="fi">Java-luokka</comment>
- <comment xml:lang="fo">Java flokkur</comment>
- <comment xml:lang="fr">classe Java</comment>
- <comment xml:lang="fur">classe Java</comment>
- <comment xml:lang="ga">aicme Java</comment>
- <comment xml:lang="gl">clase de Java</comment>
- <comment xml:lang="he">מחלקת Java</comment>
- <comment xml:lang="hr">Java klasa</comment>
- <comment xml:lang="hu">Java-osztály</comment>
- <comment xml:lang="ia">Classe Java</comment>
- <comment xml:lang="id">Kelas Java</comment>
- <comment xml:lang="it">Classe Java</comment>
- <comment xml:lang="ja">Java クラス</comment>
- <comment xml:lang="kk">Java класы</comment>
- <comment xml:lang="ko">Java 클래스</comment>
- <comment xml:lang="lt">Java klasė</comment>
- <comment xml:lang="lv">Java klase</comment>
- <comment xml:lang="ms">Kelas Java</comment>
- <comment xml:lang="nb">Java-klasse</comment>
- <comment xml:lang="nl">Java-klasse</comment>
- <comment xml:lang="nn">Java-klasse</comment>
- <comment xml:lang="oc">classa Java</comment>
- <comment xml:lang="pl">Klasa Java</comment>
- <comment xml:lang="pt">classe Java</comment>
- <comment xml:lang="pt-BR">Classe Java</comment>
- <comment xml:lang="ro">Clasă Java</comment>
- <comment xml:lang="ru">Класс Java</comment>
- <comment xml:lang="sk">Trieda Java</comment>
- <comment xml:lang="sl">Datoteka razreda Java</comment>
- <comment xml:lang="sq">Klasë Java</comment>
- <comment xml:lang="sr">разред Јаве</comment>
- <comment xml:lang="sv">Java-klass</comment>
- <comment xml:lang="tr">Java sınıfı</comment>
- <comment xml:lang="uk">клас Java</comment>
+ <comment xml:lang="zh_TW">Java class</comment>
+ <comment xml:lang="zh_CN">Java 类</comment>
<comment xml:lang="vi">Hạng Java</comment>
- <comment xml:lang="zh-CN">Java 类</comment>
- <comment xml:lang="zh-TW">Java class</comment>
- <magic priority="50">
+ <comment xml:lang="uk">клас Java</comment>
+ <comment xml:lang="tr">Java sınıfı</comment>
+ <comment xml:lang="sv">Java-klass</comment>
+ <comment xml:lang="sr">разред Јаве</comment>
+ <comment xml:lang="sq">klasë Java</comment>
+ <comment xml:lang="sl">Datoteka razreda Java</comment>
+ <comment xml:lang="si">ජාවා පන්තිය</comment>
+ <comment xml:lang="sk">Trieda Java</comment>
+ <comment xml:lang="ru">Класс Java</comment>
+ <comment xml:lang="ro">Clasă Java</comment>
+ <comment xml:lang="pt_BR">Classe Java</comment>
+ <comment xml:lang="pt">classe Java</comment>
+ <comment xml:lang="pl">Klasa Java</comment>
+ <comment xml:lang="oc">classa Java</comment>
+ <comment xml:lang="nn">Java-klasse</comment>
+ <comment xml:lang="nl">Java-klasse</comment>
+ <comment xml:lang="nb">Java-klasse</comment>
+ <comment xml:lang="ms">Kelas Java</comment>
+ <comment xml:lang="lv">Java klase</comment>
+ <comment xml:lang="lt">Java klasė</comment>
+ <comment xml:lang="ko">Java 클래스</comment>
+ <comment xml:lang="kk">Java класы</comment>
+ <comment xml:lang="ja">Java クラス</comment>
+ <comment xml:lang="it">Classe Java</comment>
+ <comment xml:lang="is">Java klassi</comment>
+ <comment xml:lang="id">Kelas Java</comment>
+ <comment xml:lang="ia">Classe Java</comment>
+ <comment xml:lang="hu">Java-osztály</comment>
+ <comment xml:lang="hr">Java klasa</comment>
+ <comment xml:lang="he">מחלקת Java</comment>
+ <comment xml:lang="gl">clase de Java</comment>
+ <comment xml:lang="ga">aicme Java</comment>
+ <comment xml:lang="fur">classe Java</comment>
+ <comment xml:lang="fr">classe Java</comment>
+ <comment xml:lang="fo">Java flokkur</comment>
+ <comment xml:lang="fi">Java-luokka</comment>
+ <comment xml:lang="eu">Java-ko klasea</comment>
+ <comment xml:lang="es">clase de Java</comment>
+ <comment xml:lang="eo">Java-klaso</comment>
+ <comment xml:lang="en_GB">Java class</comment>
+ <comment xml:lang="el">Κλάση Java</comment>
+ <comment xml:lang="de">Java-Klasse</comment>
+ <comment xml:lang="da">Java-klasse</comment>
+ <comment xml:lang="cs">třída Java</comment>
+ <comment xml:lang="ca">classe de Java</comment>
+ <comment xml:lang="bg">Клас — Java</comment>
+ <comment xml:lang="be@latin">Klasa Java</comment>
+ <comment xml:lang="be">клас Java</comment>
+ <comment xml:lang="ar">صنف java</comment>
+ <comment xml:lang="af">Java-klas</comment>
+ <magic>
<match type="big32" value="0xcafebabe" offset="0"/>
</magic>
<alias type="application/java"/>
@@ -13550,29 +14036,40 @@ command to generate the output files.
</mime-type>
<mime-type type="text/x-groovy">
<comment>Groovy source code</comment>
- <comment xml:lang="bg">Изходен код — Groovy</comment>
- <comment xml:lang="ca">codi font en Groovy</comment>
- <comment xml:lang="da">Groovy-kildekode</comment>
- <comment xml:lang="de">Groovy-Quelltext</comment>
- <comment xml:lang="en-GB">Groovy source code</comment>
- <comment xml:lang="es">código fuente en Groovy</comment>
- <comment xml:lang="eu">Groovy iturburu-kodea</comment>
- <comment xml:lang="fi">Groovy-lähdekoodi</comment>
- <comment xml:lang="fr">code source Groovy</comment>
- <comment xml:lang="hr">Groovy izvorni kôd</comment>
- <comment xml:lang="hu">Groovy forráskód</comment>
- <comment xml:lang="id">Kode sumber Groovy</comment>
- <comment xml:lang="it">Codice sorgente Groovy</comment>
- <comment xml:lang="kk">Groovy бастапқы коды</comment>
- <comment xml:lang="ko">그루비 소스 코드</comment>
- <comment xml:lang="pl">Kod źródłowy Groovy</comment>
- <comment xml:lang="pt-BR">Código-fonte Groovy</comment>
- <comment xml:lang="ru">Исходный код Groovy</comment>
- <comment xml:lang="sv">Groovy-källkod</comment>
+ <comment xml:lang="zh_TW">Groovy 原始碼</comment>
+ <comment xml:lang="zh_CN">Groovy 源代码</comment>
+ <comment xml:lang="uk">початковий код мовою Groovy</comment>
<comment xml:lang="tr">Groovy kaynak kodu</comment>
- <comment xml:lang="uk">вихідний код мовою Groovy</comment>
- <comment xml:lang="zh-CN">Groovy 源代码</comment>
- <comment xml:lang="zh-TW">Groovy 原始碼</comment>
+ <comment xml:lang="sv">Groovy-källkod</comment>
+ <comment xml:lang="sq">kod burim Groovy</comment>
+ <comment xml:lang="sl">Izvorna koda Groovy</comment>
+ <comment xml:lang="si">Groovy මූල කේතය</comment>
+ <comment xml:lang="ru">Исходный код Groovy</comment>
+ <comment xml:lang="pt_BR">Código-fonte Groovy</comment>
+ <comment xml:lang="pl">Kod źródłowy Groovy</comment>
+ <comment xml:lang="oc">còdi font Groovy</comment>
+ <comment xml:lang="nl">Groovy-broncode</comment>
+ <comment xml:lang="ko">그루비 소스 코드</comment>
+ <comment xml:lang="kk">Groovy бастапқы коды</comment>
+ <comment xml:lang="ja">Groovy ソースコード</comment>
+ <comment xml:lang="it">Codice sorgente Groovy</comment>
+ <comment xml:lang="is">Groovy frumkóði</comment>
+ <comment xml:lang="id">Kode sumber Groovy</comment>
+ <comment xml:lang="hu">Groovy forráskód</comment>
+ <comment xml:lang="hr">Groovy izvorni kôd</comment>
+ <comment xml:lang="he">קוד מקור ב־Groovy</comment>
+ <comment xml:lang="gl">Código fonte en Groovy</comment>
+ <comment xml:lang="fr">code source Groovy</comment>
+ <comment xml:lang="fi">Groovy-lähdekoodi</comment>
+ <comment xml:lang="eu">Groovy iturburu-kodea</comment>
+ <comment xml:lang="es">código fuente en Groovy</comment>
+ <comment xml:lang="en_GB">Groovy source code</comment>
+ <comment xml:lang="de">Groovy-Quelltext</comment>
+ <comment xml:lang="da">Groovy-kildekode</comment>
+ <comment xml:lang="ca">codi font en Groovy</comment>
+ <comment xml:lang="bg">Изходен код — Groovy</comment>
+ <comment xml:lang="be">зыходны код Groovy</comment>
+ <comment xml:lang="ar">شفرة مصدر Groovy</comment>
<sub-class-of type="text/x-csrc"/>
<generic-icon name="text-x-script"/>
<glob pattern="*.groovy"/>
@@ -13581,143 +14078,145 @@ command to generate the output files.
<glob pattern="*.gsh"/>
</mime-type>
<mime-type type="text/x-gradle">
- <comment>Gradle scripts</comment>
- <comment xml:lang="af">Gradle-skrippe</comment>
- <comment xml:lang="bg">Скрипт — Gradle</comment>
- <comment xml:lang="ca">scripts Gradle</comment>
- <comment xml:lang="cs">skript Gradle</comment>
- <comment xml:lang="da">Gradle-programmer</comment>
- <comment xml:lang="de">Gradle-Skripte</comment>
- <comment xml:lang="en-GB">Gradle scripts</comment>
- <comment xml:lang="es">secuencias de órdenes de Gradle</comment>
- <comment xml:lang="eu">Gradle script-ak</comment>
- <comment xml:lang="fi">Gradle scriptit</comment>
- <comment xml:lang="fr">scripts Gradle</comment>
- <comment xml:lang="fur">script Gradle</comment>
- <comment xml:lang="ga">scripteanna Gradle</comment>
- <comment xml:lang="hr">Gradle skripta</comment>
- <comment xml:lang="hu">Gradle-parancsfájl</comment>
- <comment xml:lang="id">Skrip Gradle</comment>
- <comment xml:lang="it">Script Gradle</comment>
- <comment xml:lang="kk">Gradle сценарийлері</comment>
- <comment xml:lang="ko">Gradle 스크립트</comment>
- <comment xml:lang="pl">Skrypty Gradle</comment>
- <comment xml:lang="pt-BR">Scripts Gradle</comment>
- <comment xml:lang="ru">Скрипты Gradle</comment>
- <comment xml:lang="sk">Skripty Gradle</comment>
+ <comment>Gradle script</comment>
+ <comment xml:lang="zh_TW">Gradle 指令稿</comment>
+ <comment xml:lang="zh_CN">Gradle 脚本</comment>
+ <comment xml:lang="uk">скрипт Gradle</comment>
+ <comment xml:lang="tr">Gradle betiği</comment>
<comment xml:lang="sv">Gradle-skript</comment>
- <comment xml:lang="tr">Gradle betikleri</comment>
- <comment xml:lang="uk">скрипти Gradle</comment>
- <comment xml:lang="zh-CN">Gradle 脚本</comment>
- <comment xml:lang="zh-TW">Gradle 指令稿</comment>
+ <comment xml:lang="sl">Skript Gradle</comment>
+ <comment xml:lang="si">Gradle පිටපත</comment>
+ <comment xml:lang="ru">Сценарий Gradle</comment>
+ <comment xml:lang="pt_BR">Script Gradle</comment>
+ <comment xml:lang="pl">Skrypt Gradle</comment>
+ <comment xml:lang="nl">Gradle-script</comment>
+ <comment xml:lang="ko">Gradle 스크립트</comment>
+ <comment xml:lang="kk">Gradle сценарийі</comment>
+ <comment xml:lang="ja">Gradle スクリプト</comment>
+ <comment xml:lang="it">Script Gradle</comment>
+ <comment xml:lang="hr">Gradle skripta</comment>
+ <comment xml:lang="gl">Script de Gradle</comment>
+ <comment xml:lang="fi">Gradle-skripti</comment>
+ <comment xml:lang="eu">Gradle script-a</comment>
+ <comment xml:lang="es">secuencia de órdenes de Gradle</comment>
+ <comment xml:lang="en_GB">Gradle script</comment>
+ <comment xml:lang="de">Gradle-Skript</comment>
+ <comment xml:lang="be">скрыпт Gradle</comment>
+ <comment xml:lang="ar">سكربت Gradle</comment>
<sub-class-of type="text/x-groovy"/>
<glob pattern="*.gradle"/>
</mime-type>
<mime-type type="application/x-java-jnlp-file">
<comment>JNLP file</comment>
- <comment xml:lang="af">JNLP-lêer</comment>
- <comment xml:lang="ar">ملف JNLP</comment>
- <comment xml:lang="be-Latn">Fajł JNLP</comment>
- <comment xml:lang="bg">Стартер — JNLP</comment>
- <comment xml:lang="ca">fitxer JNLP</comment>
- <comment xml:lang="cs">soubor JNLP</comment>
- <comment xml:lang="da">JNPL-fil</comment>
- <comment xml:lang="de">JNLP-Datei</comment>
- <comment xml:lang="el">Αρχείο JNLP</comment>
- <comment xml:lang="en-GB">JNLP file</comment>
- <comment xml:lang="eo">JNLP-dosiero</comment>
- <comment xml:lang="es">archivo JNPL</comment>
- <comment xml:lang="eu">JNLP fitxategia</comment>
- <comment xml:lang="fi">JNLP-tiedosto</comment>
- <comment xml:lang="fo">JNLP fíla</comment>
- <comment xml:lang="fr">fichier JNLP</comment>
- <comment xml:lang="fur">file JNLP</comment>
- <comment xml:lang="ga">comhad JNLP</comment>
- <comment xml:lang="gl">ficheiro JNLP</comment>
- <comment xml:lang="he">קובץ JNLP</comment>
- <comment xml:lang="hr">JNLP datoteka</comment>
- <comment xml:lang="hu">JNLP fájl</comment>
- <comment xml:lang="ia">File JNLP</comment>
- <comment xml:lang="id">Berkas JNLP</comment>
- <comment xml:lang="it">File JNPL</comment>
- <comment xml:lang="ja">JNLP ファイル</comment>
- <comment xml:lang="kk">JNLP файлы</comment>
- <comment xml:lang="ko">JNLP 파일</comment>
- <comment xml:lang="lt">JNLP failas</comment>
- <comment xml:lang="lv">JNLP datne</comment>
- <comment xml:lang="nb">JNLP-fil</comment>
- <comment xml:lang="nl">JNLP-bestand</comment>
- <comment xml:lang="nn">JNLP-fil</comment>
- <comment xml:lang="oc">fichièr JNLP</comment>
- <comment xml:lang="pl">Plik JNLP</comment>
- <comment xml:lang="pt">ficheiro JNLP</comment>
- <comment xml:lang="pt-BR">Arquivo JNLP</comment>
- <comment xml:lang="ro">Fișier JNLP</comment>
- <comment xml:lang="ru">Файл JNLP</comment>
- <comment xml:lang="sk">Súbor JNLP</comment>
- <comment xml:lang="sl">Datoteka JNLP</comment>
- <comment xml:lang="sq">File JNLP</comment>
- <comment xml:lang="sr">ЈНЛП датотека</comment>
- <comment xml:lang="sv">JNLP-fil</comment>
- <comment xml:lang="tr">JNLP dosyası</comment>
- <comment xml:lang="uk">файл JNLP</comment>
+ <comment xml:lang="zh_TW">JNLP 檔案</comment>
+ <comment xml:lang="zh_CN">JNLP 文件</comment>
<comment xml:lang="vi">Tập tin JNLP</comment>
- <comment xml:lang="zh-CN">JNLP 文件</comment>
- <comment xml:lang="zh-TW">JNLP 檔案</comment>
+ <comment xml:lang="uk">файл JNLP</comment>
+ <comment xml:lang="tr">JNLP dosyası</comment>
+ <comment xml:lang="sv">JNLP-fil</comment>
+ <comment xml:lang="sr">ЈНЛП датотека</comment>
+ <comment xml:lang="sq">kartelë JNLP</comment>
+ <comment xml:lang="sl">Datoteka JNLP</comment>
+ <comment xml:lang="si">JNLP ගොනුව</comment>
+ <comment xml:lang="sk">Súbor JNLP</comment>
+ <comment xml:lang="ru">Файл JNLP</comment>
+ <comment xml:lang="ro">Fișier JNLP</comment>
+ <comment xml:lang="pt_BR">Arquivo JNLP</comment>
+ <comment xml:lang="pt">ficheiro JNLP</comment>
+ <comment xml:lang="pl">Plik JNLP</comment>
+ <comment xml:lang="oc">fichièr JNLP</comment>
+ <comment xml:lang="nn">JNLP-fil</comment>
+ <comment xml:lang="nl">JNLP-bestand</comment>
+ <comment xml:lang="nb">JNLP-fil</comment>
+ <comment xml:lang="lv">JNLP datne</comment>
+ <comment xml:lang="lt">JNLP failas</comment>
+ <comment xml:lang="ko">JNLP 파일</comment>
+ <comment xml:lang="kk">JNLP файлы</comment>
+ <comment xml:lang="ja">JNLP ファイル</comment>
+ <comment xml:lang="it">File JNPL</comment>
+ <comment xml:lang="is">JNLP skrá</comment>
+ <comment xml:lang="id">Berkas JNLP</comment>
+ <comment xml:lang="ia">File JNLP</comment>
+ <comment xml:lang="hu">JNLP fájl</comment>
+ <comment xml:lang="hr">JNLP datoteka</comment>
+ <comment xml:lang="he">קובץ JNLP</comment>
+ <comment xml:lang="gl">ficheiro JNLP</comment>
+ <comment xml:lang="ga">comhad JNLP</comment>
+ <comment xml:lang="fur">file JNLP</comment>
+ <comment xml:lang="fr">fichier JNLP</comment>
+ <comment xml:lang="fo">JNLP fíla</comment>
+ <comment xml:lang="fi">JNLP-tiedosto</comment>
+ <comment xml:lang="eu">JNLP fitxategia</comment>
+ <comment xml:lang="es">archivo JNPL</comment>
+ <comment xml:lang="eo">JNLP-dosiero</comment>
+ <comment xml:lang="en_GB">JNLP file</comment>
+ <comment xml:lang="el">Αρχείο JNLP</comment>
+ <comment xml:lang="de">JNLP-Datei</comment>
+ <comment xml:lang="da">JNPL-fil</comment>
+ <comment xml:lang="cs">soubor JNLP</comment>
+ <comment xml:lang="ca">fitxer JNLP</comment>
+ <comment xml:lang="bg">Стартер — JNLP</comment>
+ <comment xml:lang="be@latin">Fajł JNLP</comment>
+ <comment xml:lang="be">файл JNLP</comment>
+ <comment xml:lang="ar">ملف JNLP</comment>
+ <comment xml:lang="af">JNLP-lêer</comment>
<acronym>JNLP</acronym>
<expanded-acronym>Java Network Launching Protocol</expanded-acronym>
<sub-class-of type="application/xml"/>
<generic-icon name="text-x-script"/>
<glob pattern="*.jnlp"/>
- <magic priority="50">
+ <magic>
<match type="string" value="&lt;jnlp" offset="0:256"/>
</magic>
</mime-type>
<mime-type type="application/x-java-keystore">
<comment>Java keystore</comment>
- <comment xml:lang="ar">مخزن مفاتيح جافا</comment>
- <comment xml:lang="bg">Ключодържател — Java</comment>
- <comment xml:lang="ca">magatzem de claus de Java</comment>
- <comment xml:lang="cs">úložiště klíčů Java</comment>
- <comment xml:lang="da">Java-nøglelager</comment>
- <comment xml:lang="de">Java-Schlüsselbund</comment>
- <comment xml:lang="el">Χώρος αποθήκευσης κλειδιών Java</comment>
- <comment xml:lang="en-GB">Java keystore</comment>
- <comment xml:lang="es">almacén de claves de Java</comment>
- <comment xml:lang="eu">Java-ren gako-biltegia</comment>
- <comment xml:lang="fi">Java-avainvarasto</comment>
- <comment xml:lang="fo">Java lyklagoymsla</comment>
- <comment xml:lang="fr">stockage de clés Java</comment>
- <comment xml:lang="fur">archivi di clâfs Java</comment>
- <comment xml:lang="ga">eochairstór Java</comment>
- <comment xml:lang="gl">almacén de chaves de Java</comment>
- <comment xml:lang="he">אחסון מפתחות של Java</comment>
- <comment xml:lang="hr">Java baza ključeva</comment>
- <comment xml:lang="hu">Java kulcstároló</comment>
- <comment xml:lang="ia">Magazin de claves Java</comment>
- <comment xml:lang="id">Penyimpanan kunci Java</comment>
- <comment xml:lang="it">Keystore Java</comment>
- <comment xml:lang="ja">Java キーストア</comment>
- <comment xml:lang="kk">Java сақталымы</comment>
- <comment xml:lang="ko">Java 키 저장소</comment>
- <comment xml:lang="lt">Java raktų saugykla</comment>
- <comment xml:lang="lv">Java keystore</comment>
- <comment xml:lang="nl">Java keystore</comment>
- <comment xml:lang="oc">emmagazinatge de claus Java</comment>
- <comment xml:lang="pl">Baza kluczy Java</comment>
- <comment xml:lang="pt">armazém de chaves Java</comment>
- <comment xml:lang="pt-BR">Keystore de Java</comment>
- <comment xml:lang="ro">Stocare chei Java</comment>
- <comment xml:lang="ru">Хранилище ключей Java</comment>
- <comment xml:lang="sk">Úložisko kľúčov Java</comment>
- <comment xml:lang="sl">Datoteka tipkovne razporeditve Java</comment>
- <comment xml:lang="sr">смештај кључа Јаве</comment>
- <comment xml:lang="sv">Java-nyckellager</comment>
- <comment xml:lang="tr">Java anahtar deposu</comment>
+ <comment xml:lang="zh_TW">Java 金鑰儲存</comment>
+ <comment xml:lang="zh_CN">Java 密钥库</comment>
<comment xml:lang="uk">сховище ключів Java</comment>
- <comment xml:lang="zh-CN">Java 密钥库</comment>
- <comment xml:lang="zh-TW">Java 金鑰儲存</comment>
- <magic priority="50">
+ <comment xml:lang="tr">Java anahtar deposu</comment>
+ <comment xml:lang="sv">Java-nyckellager</comment>
+ <comment xml:lang="sr">смештај кључа Јаве</comment>
+ <comment xml:lang="sl">Datoteka tipkovne razporeditve Java</comment>
+ <comment xml:lang="si">ජාවා යතුරු ගබඩාව</comment>
+ <comment xml:lang="sk">Úložisko kľúčov Java</comment>
+ <comment xml:lang="ru">Хранилище ключей Java</comment>
+ <comment xml:lang="ro">Stocare chei Java</comment>
+ <comment xml:lang="pt_BR">Keystore de Java</comment>
+ <comment xml:lang="pt">armazém de chaves Java</comment>
+ <comment xml:lang="pl">Baza kluczy Java</comment>
+ <comment xml:lang="oc">emmagazinatge de claus Java</comment>
+ <comment xml:lang="nl">Java-keystore</comment>
+ <comment xml:lang="lv">Java keystore</comment>
+ <comment xml:lang="lt">Java raktų saugykla</comment>
+ <comment xml:lang="ko">Java 키 저장소</comment>
+ <comment xml:lang="kk">Java сақталымы</comment>
+ <comment xml:lang="ja">Java キーストア</comment>
+ <comment xml:lang="it">Keystore Java</comment>
+ <comment xml:lang="is">Java lyklageymsla</comment>
+ <comment xml:lang="id">Penyimpanan kunci Java</comment>
+ <comment xml:lang="ia">Magazin de claves Java</comment>
+ <comment xml:lang="hu">Java kulcstároló</comment>
+ <comment xml:lang="hr">Java baza ključeva</comment>
+ <comment xml:lang="he">אחסון מפתחות של Java</comment>
+ <comment xml:lang="gl">almacén de chaves de Java</comment>
+ <comment xml:lang="ga">eochairstór Java</comment>
+ <comment xml:lang="fur">archivi di clâfs Java</comment>
+ <comment xml:lang="fr">stockage de clés Java</comment>
+ <comment xml:lang="fo">Java lyklagoymsla</comment>
+ <comment xml:lang="fi">Java-avainvarasto</comment>
+ <comment xml:lang="eu">Java-ren gako-biltegia</comment>
+ <comment xml:lang="es">almacén de claves de Java</comment>
+ <comment xml:lang="en_GB">Java keystore</comment>
+ <comment xml:lang="el">Χώρος αποθήκευσης κλειδιών Java</comment>
+ <comment xml:lang="de">Java-Schlüsselbund</comment>
+ <comment xml:lang="da">Java-nøglelager</comment>
+ <comment xml:lang="cs">úložiště klíčů Java</comment>
+ <comment xml:lang="ca">magatzem de claus de Java</comment>
+ <comment xml:lang="bg">Ключодържател — Java</comment>
+ <comment xml:lang="be">сховішча ключоў Java</comment>
+ <comment xml:lang="ar">مخزن مفاتيح جافا</comment>
+ <magic>
<match type="big32" value="0xfeedfeed" offset="0"/>
</magic>
<glob pattern="*.jks"/>
@@ -13726,167 +14225,178 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-java-jce-keystore">
<comment>Java JCE keystore</comment>
- <comment xml:lang="ar">مخزن مفاتيح Java JCE</comment>
- <comment xml:lang="bg">Ключодържател — Java JCE</comment>
- <comment xml:lang="ca">magatzem de claus JCE de Java</comment>
- <comment xml:lang="cs">úložiště klíčů Java JCE</comment>
- <comment xml:lang="da">Java JCE-nøglelager</comment>
- <comment xml:lang="de">Java JCE-Schlüsselbund</comment>
- <comment xml:lang="el">Αποθήκη κλειδιών Java JCE</comment>
- <comment xml:lang="en-GB">Java JCE keystore</comment>
- <comment xml:lang="es">almacén de claves JCE de Java</comment>
- <comment xml:lang="eu">Java JCE-ren gako-biltegia</comment>
- <comment xml:lang="fi">Java JCE -avainvarasto</comment>
- <comment xml:lang="fo">Java JCE lyklagoymsla</comment>
- <comment xml:lang="fr">stockage de clés Java JCE</comment>
- <comment xml:lang="fur">archivi di clâfs JCE Java</comment>
- <comment xml:lang="ga">eochairstór Java JCE</comment>
- <comment xml:lang="gl">almacén de chves JCE de Java</comment>
- <comment xml:lang="he">אחסון מפתחות של Java JCE</comment>
- <comment xml:lang="hr">Java JCE baza ključeva</comment>
- <comment xml:lang="hu">Java JCE kulcstároló</comment>
- <comment xml:lang="ia">Magazin de claves Java JCE</comment>
- <comment xml:lang="id">Penyimpanan kunci Java JCE</comment>
- <comment xml:lang="it">Keystore Java JCE</comment>
- <comment xml:lang="ja">Java JCE キーストア</comment>
- <comment xml:lang="kk">Java JCE сақталымы</comment>
- <comment xml:lang="ko">Java JCE 키 저장소</comment>
- <comment xml:lang="lt">Java JCE raktų saugykla</comment>
- <comment xml:lang="lv">Java JCE keystore</comment>
- <comment xml:lang="nl">Java JCE keystore</comment>
- <comment xml:lang="oc">emmagazinatge de claus Java JCE</comment>
- <comment xml:lang="pl">Baza kluczy Java JCE</comment>
- <comment xml:lang="pt">armazém de chaves JavaJCE</comment>
- <comment xml:lang="pt-BR">Keystore JCE do Java</comment>
- <comment xml:lang="ro">Stocare chei Java JCE</comment>
- <comment xml:lang="ru">Хранилище ключей Java JCE</comment>
- <comment xml:lang="sk">Úložisko kľúčov Java JCE</comment>
- <comment xml:lang="sl">Datoteka tipkovne razporeditve Java JCE</comment>
- <comment xml:lang="sr">смештај ЈЦЕ кључа Јаве</comment>
- <comment xml:lang="sv">Java JCE-nyckellager</comment>
- <comment xml:lang="tr">Java JCE anahtar deposu</comment>
+ <comment xml:lang="zh_TW">Java JCE 金鑰儲存</comment>
+ <comment xml:lang="zh_CN">Java JCE 密钥库</comment>
<comment xml:lang="uk">сховище ключів JCE Java</comment>
- <comment xml:lang="zh-CN">Java JCE 密钥库</comment>
- <comment xml:lang="zh-TW">Java JCE 金鑰儲存</comment>
+ <comment xml:lang="tr">Java JCE anahtar deposu</comment>
+ <comment xml:lang="sv">Java JCE-nyckellager</comment>
+ <comment xml:lang="sr">смештај ЈЦЕ кључа Јаве</comment>
+ <comment xml:lang="sl">Datoteka tipkovne razporeditve Java JCE</comment>
+ <comment xml:lang="si">ජාවා JCE යතුරු ගබඩාව</comment>
+ <comment xml:lang="sk">Úložisko kľúčov Java JCE</comment>
+ <comment xml:lang="ru">Хранилище ключей Java JCE</comment>
+ <comment xml:lang="ro">Stocare chei Java JCE</comment>
+ <comment xml:lang="pt_BR">Keystore JCE do Java</comment>
+ <comment xml:lang="pt">armazém de chaves JavaJCE</comment>
+ <comment xml:lang="pl">Baza kluczy Java JCE</comment>
+ <comment xml:lang="oc">emmagazinatge de claus Java JCE</comment>
+ <comment xml:lang="nl">Java JCE-keystore</comment>
+ <comment xml:lang="lv">Java JCE keystore</comment>
+ <comment xml:lang="lt">Java JCE raktų saugykla</comment>
+ <comment xml:lang="ko">Java JCE 키 저장소</comment>
+ <comment xml:lang="kk">Java JCE сақталымы</comment>
+ <comment xml:lang="ja">Java JCE キーストア</comment>
+ <comment xml:lang="it">Keystore Java JCE</comment>
+ <comment xml:lang="is">Java JCE lyklageymsla</comment>
+ <comment xml:lang="id">Penyimpanan kunci Java JCE</comment>
+ <comment xml:lang="ia">Magazin de claves Java JCE</comment>
+ <comment xml:lang="hu">Java JCE kulcstároló</comment>
+ <comment xml:lang="hr">Java JCE baza ključeva</comment>
+ <comment xml:lang="he">אחסון מפתחות של Java JCE</comment>
+ <comment xml:lang="gl">almacén de chves JCE de Java</comment>
+ <comment xml:lang="ga">eochairstór Java JCE</comment>
+ <comment xml:lang="fur">archivi di clâfs JCE Java</comment>
+ <comment xml:lang="fr">stockage de clés Java JCE</comment>
+ <comment xml:lang="fo">Java JCE lyklagoymsla</comment>
+ <comment xml:lang="fi">Java JCE -avainvarasto</comment>
+ <comment xml:lang="eu">Java JCE-ren gako-biltegia</comment>
+ <comment xml:lang="es">almacén de claves JCE de Java</comment>
+ <comment xml:lang="en_GB">Java JCE keystore</comment>
+ <comment xml:lang="el">Αποθήκη κλειδιών Java JCE</comment>
+ <comment xml:lang="de">Java JCE-Schlüsselbund</comment>
+ <comment xml:lang="da">Java JCE-nøglelager</comment>
+ <comment xml:lang="cs">úložiště klíčů Java JCE</comment>
+ <comment xml:lang="ca">magatzem de claus JCE de Java</comment>
+ <comment xml:lang="bg">Ключодържател — Java JCE</comment>
+ <comment xml:lang="be">сховішча ключоў Java JCE</comment>
+ <comment xml:lang="ar">مخزن مفاتيح Java JCE</comment>
<acronym>JCE</acronym>
<expanded-acronym>Java Cryptography Extension</expanded-acronym>
- <magic priority="50">
+ <magic>
<match type="host32" value="0xcececece" offset="0"/>
</magic>
<glob pattern="*.jceks"/>
</mime-type>
<mime-type type="application/x-java-pack200">
<comment>Pack200 Java archive</comment>
- <comment xml:lang="ar">أرشيف Pack200 Java</comment>
- <comment xml:lang="be-Latn">Archiŭ Pack200 Java</comment>
- <comment xml:lang="bg">Архив — Java Pack200</comment>
- <comment xml:lang="ca">arxiu de Java en Pack200</comment>
- <comment xml:lang="cs">archiv Java Pack200</comment>
- <comment xml:lang="da">Pack200 Java-arkiv</comment>
- <comment xml:lang="de">Pack200-Java-Archiv</comment>
- <comment xml:lang="el">Συμπιεσμένο αρχείο Java Pack200</comment>
- <comment xml:lang="en-GB">Pack200 Java archive</comment>
- <comment xml:lang="es">archivador Pack200 Java</comment>
- <comment xml:lang="eu">Pack2000 Java artxiboa</comment>
- <comment xml:lang="fi">Pack200-Java-arkisto</comment>
- <comment xml:lang="fo">Pack200 Java skjalasavn</comment>
- <comment xml:lang="fr">archive Java Pack200</comment>
- <comment xml:lang="fur">archivi Java Pack200</comment>
- <comment xml:lang="ga">cartlann Java Pack200</comment>
- <comment xml:lang="gl">arquivo Pack200 Java</comment>
- <comment xml:lang="he">ארכיון מסוג Pack200 Java</comment>
- <comment xml:lang="hr">Pack200 Java arhiva</comment>
- <comment xml:lang="hu">Pack200 Java-archívum</comment>
- <comment xml:lang="ia">Archivo Java Pack200</comment>
- <comment xml:lang="id">Arsip Pack200 Java</comment>
- <comment xml:lang="it">Archivio Pack200 Java</comment>
- <comment xml:lang="ja">Pack200 Java アーカイブ</comment>
- <comment xml:lang="kk">Pack200 Java архиві</comment>
- <comment xml:lang="ko">Pack200 Java 압축 파일</comment>
- <comment xml:lang="lt">Pack200 Java archyvas</comment>
- <comment xml:lang="lv">Pack200 Java arhīvs</comment>
- <comment xml:lang="nb">Pack200 Java-arkiv</comment>
- <comment xml:lang="nl">Pack200 Java-archief</comment>
- <comment xml:lang="nn">Pack200 Java-arkiv</comment>
- <comment xml:lang="oc">archiu Java Pack200</comment>
- <comment xml:lang="pl">Archiwum Java Pack200</comment>
- <comment xml:lang="pt">arquivo Java Pack200</comment>
- <comment xml:lang="pt-BR">Pacote Java Pack200</comment>
- <comment xml:lang="ro">Arhivă Java Pack2000</comment>
- <comment xml:lang="ru">Архив Java Pack200</comment>
- <comment xml:lang="sk">Archív Java Pack200</comment>
- <comment xml:lang="sl">Datoteka arhiva Pack200 Java</comment>
- <comment xml:lang="sq">Arkiv Java Pack200</comment>
- <comment xml:lang="sr">архива Јаве Пак200</comment>
- <comment xml:lang="sv">Pack200 Java-arkiv</comment>
- <comment xml:lang="tr">Pack200 Java arşivi</comment>
- <comment xml:lang="uk">архів Java Pack200</comment>
+ <comment xml:lang="zh_TW">Pack200 Java 封存檔</comment>
+ <comment xml:lang="zh_CN">Pack200 Java 归档文件</comment>
<comment xml:lang="vi">Kho nén Java Pack200</comment>
- <comment xml:lang="zh-CN">Pack200 Java 归档文件</comment>
- <comment xml:lang="zh-TW">Pack200 Java 封存檔</comment>
+ <comment xml:lang="uk">архів Java Pack200</comment>
+ <comment xml:lang="tr">Pack200 Java arşivi</comment>
+ <comment xml:lang="sv">Pack200 Java-arkiv</comment>
+ <comment xml:lang="sr">архива Јаве Пак200</comment>
+ <comment xml:lang="sq">arkiv Java Pack200</comment>
+ <comment xml:lang="sl">Datoteka arhiva Pack200 Java</comment>
+ <comment xml:lang="si">Pack200 Java සංරක්ෂිතය</comment>
+ <comment xml:lang="sk">Archív Java Pack200</comment>
+ <comment xml:lang="ru">Архив Java Pack200</comment>
+ <comment xml:lang="ro">Arhivă Java Pack2000</comment>
+ <comment xml:lang="pt_BR">Pacote Java Pack200</comment>
+ <comment xml:lang="pt">arquivo Java Pack200</comment>
+ <comment xml:lang="pl">Archiwum Java Pack200</comment>
+ <comment xml:lang="oc">archiu Java Pack200</comment>
+ <comment xml:lang="nn">Pack200 Java-arkiv</comment>
+ <comment xml:lang="nl">Pack200 Java-archief</comment>
+ <comment xml:lang="nb">Pack200 Java-arkiv</comment>
+ <comment xml:lang="lv">Pack200 Java arhīvs</comment>
+ <comment xml:lang="lt">Pack200 Java archyvas</comment>
+ <comment xml:lang="ko">Pack200 Java 압축 파일</comment>
+ <comment xml:lang="kk">Pack200 Java архиві</comment>
+ <comment xml:lang="ja">Pack200 Java アーカイブ</comment>
+ <comment xml:lang="it">Archivio Pack200 Java</comment>
+ <comment xml:lang="is">Pack200 Java safnskrá</comment>
+ <comment xml:lang="id">Arsip Pack200 Java</comment>
+ <comment xml:lang="ia">Archivo Java Pack200</comment>
+ <comment xml:lang="hu">Pack200 Java-archívum</comment>
+ <comment xml:lang="hr">Pack200 Java arhiva</comment>
+ <comment xml:lang="he">ארכיון מסוג Pack200 Java</comment>
+ <comment xml:lang="gl">arquivo Pack200 Java</comment>
+ <comment xml:lang="ga">cartlann Java Pack200</comment>
+ <comment xml:lang="fur">archivi Java Pack200</comment>
+ <comment xml:lang="fr">archive Java Pack200</comment>
+ <comment xml:lang="fo">Pack200 Java skjalasavn</comment>
+ <comment xml:lang="fi">Pack200-Java-arkisto</comment>
+ <comment xml:lang="eu">Pack2000 Java artxiboa</comment>
+ <comment xml:lang="es">archivador Pack200 Java</comment>
+ <comment xml:lang="en_GB">Pack200 Java archive</comment>
+ <comment xml:lang="el">Συμπιεσμένο αρχείο Java Pack200</comment>
+ <comment xml:lang="de">Pack200-Java-Archiv</comment>
+ <comment xml:lang="da">Pack200 Java-arkiv</comment>
+ <comment xml:lang="cs">archiv Java Pack200</comment>
+ <comment xml:lang="ca">arxiu de Java en Pack200</comment>
+ <comment xml:lang="bg">Архив — Java Pack200</comment>
+ <comment xml:lang="be@latin">Archiŭ Pack200 Java</comment>
+ <comment xml:lang="be">архіў Pack200 Java</comment>
+ <comment xml:lang="ar">أرشيف Pack200 Java</comment>
<generic-icon name="package-x-generic"/>
<magic priority="60">
<match type="big32" value="0xcafed00d" offset="0"/>
</magic>
<glob pattern="*.pack"/>
</mime-type>
- <mime-type type="application/javascript">
+ <mime-type type="text/javascript">
<comment>JavaScript program</comment>
- <comment xml:lang="af">JavaScript-program</comment>
- <comment xml:lang="ar">برنامج جافاسكربت</comment>
- <comment xml:lang="be-Latn">Prahrama JavaScript</comment>
- <comment xml:lang="bg">Програма на JavaScript</comment>
- <comment xml:lang="ca">programa JavaScript</comment>
- <comment xml:lang="cs">program v JavaScriptu</comment>
- <comment xml:lang="da">JavaScript-program</comment>
- <comment xml:lang="de">JavaScript-Programm</comment>
- <comment xml:lang="el">Πρόγραμμα JavaScript</comment>
- <comment xml:lang="en-GB">JavaScript program</comment>
- <comment xml:lang="eo">JavaScript-programo</comment>
- <comment xml:lang="es">programa en JavaScript</comment>
- <comment xml:lang="eu">JavaScript programa</comment>
- <comment xml:lang="fi">JavaScript-ohjelma</comment>
- <comment xml:lang="fo">JavaScript forrit</comment>
- <comment xml:lang="fr">programme JavaScript</comment>
- <comment xml:lang="fur">program JavaScript</comment>
- <comment xml:lang="ga">ríomhchlár JavaScript</comment>
- <comment xml:lang="gl">programa JavaScript</comment>
- <comment xml:lang="he">תכנית JavaScript</comment>
- <comment xml:lang="hr">JavaScript program</comment>
- <comment xml:lang="hu">JavaScript-program</comment>
- <comment xml:lang="ia">Programma JavaScript</comment>
- <comment xml:lang="id">Program JavaScript</comment>
- <comment xml:lang="it">Programma JavaScript</comment>
- <comment xml:lang="ja">JavaScript プログラム</comment>
- <comment xml:lang="kk">JavaScript бағдарламасы</comment>
- <comment xml:lang="ko">JavaScript 프로그램</comment>
- <comment xml:lang="lt">JavaScript programa</comment>
- <comment xml:lang="lv">JavaScript programma</comment>
- <comment xml:lang="ms">Program JavaScript</comment>
- <comment xml:lang="nb">JavaScript-program</comment>
- <comment xml:lang="nl">JavaScript-programma</comment>
- <comment xml:lang="nn">JavaScript-program</comment>
- <comment xml:lang="oc">programa JavaEscript</comment>
- <comment xml:lang="pl">Pogram JavaScript</comment>
- <comment xml:lang="pt">programa JavaScript</comment>
- <comment xml:lang="pt-BR">Programa JavaScript</comment>
- <comment xml:lang="ro">Program JavaScript</comment>
- <comment xml:lang="ru">Программа JavaScript</comment>
- <comment xml:lang="sk">Program jazyka JavaScript</comment>
- <comment xml:lang="sl">Programska datoteka JavaScript</comment>
- <comment xml:lang="sq">Program JavaScript</comment>
- <comment xml:lang="sr">програм Јава скрипте</comment>
- <comment xml:lang="sv">JavaScript-program</comment>
- <comment xml:lang="tr">JavaScript programı</comment>
- <comment xml:lang="uk">програма мовою JavaScript</comment>
+ <comment xml:lang="zh_TW">JavaScript 程式</comment>
+ <comment xml:lang="zh_CN">JavaScript 程序</comment>
<comment xml:lang="vi">Chương trình JavaScript</comment>
- <comment xml:lang="zh-CN">JavaScript 程序</comment>
- <comment xml:lang="zh-TW">JavaScript 程式</comment>
+ <comment xml:lang="uk">програма мовою JavaScript</comment>
+ <comment xml:lang="tr">JavaScript programı</comment>
+ <comment xml:lang="sv">JavaScript-program</comment>
+ <comment xml:lang="sr">програм Јава скрипте</comment>
+ <comment xml:lang="sq">program JavaScript</comment>
+ <comment xml:lang="sl">Programska datoteka JavaScript</comment>
+ <comment xml:lang="si">JavaScript වැඩසටහන</comment>
+ <comment xml:lang="sk">Program jazyka JavaScript</comment>
+ <comment xml:lang="ru">Программа JavaScript</comment>
+ <comment xml:lang="ro">Program JavaScript</comment>
+ <comment xml:lang="pt_BR">Programa JavaScript</comment>
+ <comment xml:lang="pt">programa JavaScript</comment>
+ <comment xml:lang="pl">Pogram JavaScript</comment>
+ <comment xml:lang="oc">programa JavaEscript</comment>
+ <comment xml:lang="nn">JavaScript-program</comment>
+ <comment xml:lang="nl">JavaScript-programma</comment>
+ <comment xml:lang="nb">JavaScript-program</comment>
+ <comment xml:lang="ms">Program JavaScript</comment>
+ <comment xml:lang="lv">JavaScript programma</comment>
+ <comment xml:lang="lt">JavaScript programa</comment>
+ <comment xml:lang="ko">JavaScript 프로그램</comment>
+ <comment xml:lang="kk">JavaScript бағдарламасы</comment>
+ <comment xml:lang="ja">JavaScript プログラム</comment>
+ <comment xml:lang="it">Programma JavaScript</comment>
+ <comment xml:lang="is">JavaScript forrit</comment>
+ <comment xml:lang="id">Program JavaScript</comment>
+ <comment xml:lang="ia">Programma JavaScript</comment>
+ <comment xml:lang="hu">JavaScript-program</comment>
+ <comment xml:lang="hr">JavaScript program</comment>
+ <comment xml:lang="he">תכנית JavaScript</comment>
+ <comment xml:lang="gl">programa JavaScript</comment>
+ <comment xml:lang="ga">ríomhchlár JavaScript</comment>
+ <comment xml:lang="fur">program JavaScript</comment>
+ <comment xml:lang="fr">programme JavaScript</comment>
+ <comment xml:lang="fo">JavaScript forrit</comment>
+ <comment xml:lang="fi">JavaScript-ohjelma</comment>
+ <comment xml:lang="eu">JavaScript programa</comment>
+ <comment xml:lang="es">programa en JavaScript</comment>
+ <comment xml:lang="eo">JavaScript-programo</comment>
+ <comment xml:lang="en_GB">JavaScript program</comment>
+ <comment xml:lang="el">Πρόγραμμα JavaScript</comment>
+ <comment xml:lang="de">JavaScript-Programm</comment>
+ <comment xml:lang="da">JavaScript-program</comment>
+ <comment xml:lang="cs">program v JavaScriptu</comment>
+ <comment xml:lang="ca">programa JavaScript</comment>
+ <comment xml:lang="bg">Програма на JavaScript</comment>
+ <comment xml:lang="be@latin">Prahrama JavaScript</comment>
+ <comment xml:lang="be">праграма JavaScript</comment>
+ <comment xml:lang="ar">برنامج جافاسكربت</comment>
+ <comment xml:lang="af">JavaScript-program</comment>
<alias type="application/x-javascript"/>
- <alias type="text/javascript"/>
- <sub-class-of type="application/ecmascript"/>
+ <alias type="application/javascript"/>
+ <alias type="text/jscript"/>
+ <sub-class-of type="application/x-executable"/>
+ <sub-class-of type="text/plain"/>
<generic-icon name="text-x-script"/>
- <magic priority="50">
+ <magic>
<match type="string" value="#!/bin/gjs" offset="0"/>
<match type="string" value="#! /bin/gjs" offset="0"/>
<match type="string" value="eval \&quot;exec /bin/gjs" offset="0"/>
@@ -13902,89 +14412,133 @@ command to generate the output files.
<glob pattern="*.jsm"/>
<glob pattern="*.mjs"/>
</mime-type>
+ <mime-type type="text/jscript.encode">
+ <comment>Encoded JScript program</comment>
+ <comment xml:lang="uk">кодована програма JScript</comment>
+ <comment xml:lang="sv">Kodat JScript-program</comment>
+ <comment xml:lang="ru">Зашифрованная программа на JScript</comment>
+ <comment xml:lang="pl">Zakodowany program JScript</comment>
+ <comment xml:lang="es">programa en JScript codificado</comment>
+ <comment xml:lang="de">Verschlüsseltes JScript-Programm</comment>
+ <sub-class-of type="application/x-executable"/>
+ <generic-icon name="text-x-script"/>
+ <magic>
+ <match type="string" value="#@~^" offset="0"/>
+ </magic>
+ <glob pattern="*.jse"/>
+ </mime-type>
<mime-type type="application/json">
<comment>JSON document</comment>
- <comment xml:lang="af">JSON-dokument</comment>
- <comment xml:lang="ast">Documentu JSON</comment>
- <comment xml:lang="bg">Документ — JSON</comment>
- <comment xml:lang="ca">document JSON</comment>
- <comment xml:lang="cs">dokument JSON</comment>
- <comment xml:lang="da">JSON-dokument</comment>
- <comment xml:lang="de">JSON-Dokument</comment>
- <comment xml:lang="el">Έγγραφο JSON</comment>
- <comment xml:lang="en-GB">JSON document</comment>
- <comment xml:lang="es">documento JSON</comment>
- <comment xml:lang="eu">JSON dokumentua</comment>
- <comment xml:lang="fi">JSON-asiakirja</comment>
- <comment xml:lang="fr">document JSON</comment>
- <comment xml:lang="fur">document JSON</comment>
- <comment xml:lang="ga">cáipéis JSON</comment>
- <comment xml:lang="gl">Documento JSON</comment>
- <comment xml:lang="he">מסמך JSON</comment>
- <comment xml:lang="hr">JSON dokument</comment>
- <comment xml:lang="hu">JSON dokumentum</comment>
- <comment xml:lang="ia">Documento JSON</comment>
- <comment xml:lang="id">Dokumen JSON</comment>
- <comment xml:lang="it">Documento JSON</comment>
- <comment xml:lang="kk">JSON құжаты</comment>
- <comment xml:lang="ko">JSON 문서</comment>
- <comment xml:lang="oc">document JSON</comment>
- <comment xml:lang="pl">Dokument JSON</comment>
- <comment xml:lang="pt">documento JSON</comment>
- <comment xml:lang="pt-BR">Documento JSON</comment>
- <comment xml:lang="ru">Документ JSON</comment>
- <comment xml:lang="sk">Dokument JSON</comment>
- <comment xml:lang="sl">Dokument JSON</comment>
- <comment xml:lang="sr">ЈСОН документ</comment>
- <comment xml:lang="sv">JSON-dokument</comment>
- <comment xml:lang="tr">JSON belgesi</comment>
+ <comment xml:lang="zh_TW">JSON 文件</comment>
+ <comment xml:lang="zh_CN">JSON 文档</comment>
<comment xml:lang="uk">документ JSON</comment>
- <comment xml:lang="zh-CN">JSON 文档</comment>
- <comment xml:lang="zh-TW">JSON 文件</comment>
+ <comment xml:lang="tr">JSON belgesi</comment>
+ <comment xml:lang="sv">JSON-dokument</comment>
+ <comment xml:lang="sr">ЈСОН документ</comment>
+ <comment xml:lang="sq">dokument JSON</comment>
+ <comment xml:lang="sl">Dokument JSON</comment>
+ <comment xml:lang="si">JSON ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument JSON</comment>
+ <comment xml:lang="ru">Документ JSON</comment>
+ <comment xml:lang="pt_BR">Documento JSON</comment>
+ <comment xml:lang="pt">documento JSON</comment>
+ <comment xml:lang="pl">Dokument JSON</comment>
+ <comment xml:lang="oc">document JSON</comment>
+ <comment xml:lang="nl">JSON-document</comment>
+ <comment xml:lang="ko">JSON 문서</comment>
+ <comment xml:lang="kk">JSON құжаты</comment>
+ <comment xml:lang="ja">JSON ドキュメント</comment>
+ <comment xml:lang="it">Documento JSON</comment>
+ <comment xml:lang="is">JSON skjal</comment>
+ <comment xml:lang="id">Dokumen JSON</comment>
+ <comment xml:lang="ia">Documento JSON</comment>
+ <comment xml:lang="hu">JSON dokumentum</comment>
+ <comment xml:lang="hr">JSON dokument</comment>
+ <comment xml:lang="he">מסמך JSON</comment>
+ <comment xml:lang="gl">Documento JSON</comment>
+ <comment xml:lang="ga">cáipéis JSON</comment>
+ <comment xml:lang="fur">document JSON</comment>
+ <comment xml:lang="fr">document JSON</comment>
+ <comment xml:lang="fi">JSON-asiakirja</comment>
+ <comment xml:lang="eu">JSON dokumentua</comment>
+ <comment xml:lang="es">documento JSON</comment>
+ <comment xml:lang="en_GB">JSON document</comment>
+ <comment xml:lang="el">Έγγραφο JSON</comment>
+ <comment xml:lang="de">JSON-Dokument</comment>
+ <comment xml:lang="da">JSON-dokument</comment>
+ <comment xml:lang="cs">dokument JSON</comment>
+ <comment xml:lang="ca">document JSON</comment>
+ <comment xml:lang="bg">Документ — JSON</comment>
+ <comment xml:lang="be">дакумент JSON</comment>
+ <comment xml:lang="ast">Documentu JSON</comment>
+ <comment xml:lang="ar">مستند JSON</comment>
+ <comment xml:lang="af">JSON-dokument</comment>
<acronym>JSON</acronym>
<expanded-acronym>JavaScript Object Notation</expanded-acronym>
- <sub-class-of type="application/javascript"/>
+ <sub-class-of type="application/json5"/>
<generic-icon name="text-x-script"/>
<glob pattern="*.json"/>
</mime-type>
+ <mime-type type="application/json5">
+ <comment>JSON5 document</comment>
+ <comment xml:lang="uk">документ JSON5</comment>
+ <comment xml:lang="sv">JSON5-dokument</comment>
+ <comment xml:lang="ru">Документ JSON5</comment>
+ <comment xml:lang="pl">Dokument JSON5</comment>
+ <comment xml:lang="es">documento JSON5</comment>
+ <comment xml:lang="de">JSON5-Dokument</comment>
+ <acronym>JSON5</acronym>
+ <expanded-acronym>JavaScript Object Notation 5</expanded-acronym>
+ <sub-class-of type="text/javascript"/>
+ <generic-icon name="text-x-script"/>
+ <glob pattern="*.json5"/>
+ </mime-type>
<mime-type type="application/jrd+json">
<comment>JRD document</comment>
- <comment xml:lang="af">JRD-dokument</comment>
- <comment xml:lang="ast">Documentu JRD</comment>
- <comment xml:lang="bg">Документ — JRD</comment>
- <comment xml:lang="ca">document JRD</comment>
- <comment xml:lang="cs">dokument JRD</comment>
- <comment xml:lang="da">JRD-dokument</comment>
- <comment xml:lang="de">JRD-Dokument</comment>
- <comment xml:lang="el">Έγγραφο JRD</comment>
- <comment xml:lang="en-GB">JRD document</comment>
- <comment xml:lang="es">documento JRD</comment>
- <comment xml:lang="eu">JRD dokumentua</comment>
- <comment xml:lang="fi">JRD-asiakirja</comment>
- <comment xml:lang="fr">document JRD</comment>
- <comment xml:lang="fur">document JRD</comment>
- <comment xml:lang="ga">cáipéis JRD</comment>
- <comment xml:lang="he">מסמך JRD</comment>
- <comment xml:lang="hr">JRD dokument</comment>
- <comment xml:lang="hu">JRD dokumentum</comment>
- <comment xml:lang="ia">Documento JRD</comment>
- <comment xml:lang="id">Dokumen JRD</comment>
- <comment xml:lang="it">Documento JRD</comment>
- <comment xml:lang="kk">JRD құжаты</comment>
- <comment xml:lang="ko">JRD 문서</comment>
- <comment xml:lang="oc">document JRD</comment>
- <comment xml:lang="pl">Dokument JRD</comment>
- <comment xml:lang="pt">doxumento JRD</comment>
- <comment xml:lang="pt-BR">Documento JRD</comment>
- <comment xml:lang="ru">Документ JRD</comment>
- <comment xml:lang="sk">Dokument JRD</comment>
- <comment xml:lang="sl">Dokument JRD</comment>
- <comment xml:lang="sr">ЈРД документ</comment>
- <comment xml:lang="sv">JRD-dokument</comment>
- <comment xml:lang="tr">JRD belgesi</comment>
+ <comment xml:lang="zh_TW">JRD 文件</comment>
+ <comment xml:lang="zh_CN">JRD 文档</comment>
<comment xml:lang="uk">документ JRD</comment>
- <comment xml:lang="zh-CN">JRD 文档</comment>
- <comment xml:lang="zh-TW">JRD 文件</comment>
+ <comment xml:lang="tr">JRD belgesi</comment>
+ <comment xml:lang="sv">JRD-dokument</comment>
+ <comment xml:lang="sr">ЈРД документ</comment>
+ <comment xml:lang="sq">dokument JRD</comment>
+ <comment xml:lang="sl">Dokument JRD</comment>
+ <comment xml:lang="si">JRD ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument JRD</comment>
+ <comment xml:lang="ru">Документ JRD</comment>
+ <comment xml:lang="pt_BR">Documento JRD</comment>
+ <comment xml:lang="pt">doxumento JRD</comment>
+ <comment xml:lang="pl">Dokument JRD</comment>
+ <comment xml:lang="oc">document JRD</comment>
+ <comment xml:lang="nl">JRD-document</comment>
+ <comment xml:lang="ko">JRD 문서</comment>
+ <comment xml:lang="kk">JRD құжаты</comment>
+ <comment xml:lang="ja">JRD ドキュメント</comment>
+ <comment xml:lang="it">Documento JRD</comment>
+ <comment xml:lang="is">JRD skjal</comment>
+ <comment xml:lang="id">Dokumen JRD</comment>
+ <comment xml:lang="ia">Documento JRD</comment>
+ <comment xml:lang="hu">JRD dokumentum</comment>
+ <comment xml:lang="hr">JRD dokument</comment>
+ <comment xml:lang="he">מסמך JRD</comment>
+ <comment xml:lang="gl">Documento JRD</comment>
+ <comment xml:lang="ga">cáipéis JRD</comment>
+ <comment xml:lang="fur">document JRD</comment>
+ <comment xml:lang="fr">document JRD</comment>
+ <comment xml:lang="fi">JRD-asiakirja</comment>
+ <comment xml:lang="eu">JRD dokumentua</comment>
+ <comment xml:lang="es">documento JRD</comment>
+ <comment xml:lang="en_GB">JRD document</comment>
+ <comment xml:lang="el">Έγγραφο JRD</comment>
+ <comment xml:lang="de">JRD-Dokument</comment>
+ <comment xml:lang="da">JRD-dokument</comment>
+ <comment xml:lang="cs">dokument JRD</comment>
+ <comment xml:lang="ca">document JRD</comment>
+ <comment xml:lang="bg">Документ — JRD</comment>
+ <comment xml:lang="be">дакумент JRD</comment>
+ <comment xml:lang="ast">Documentu JRD</comment>
+ <comment xml:lang="ar">مستند JRD</comment>
+ <comment xml:lang="af">JRD-dokument</comment>
<acronym>JRD</acronym>
<expanded-acronym>JSON Resource Descriptor</expanded-acronym>
<sub-class-of type="application/json"/>
@@ -13993,38 +14547,47 @@ command to generate the output files.
</mime-type>
<mime-type type="application/json-patch+json">
<comment>JSON patch</comment>
- <comment xml:lang="bg">Кръпка — JSON</comment>
- <comment xml:lang="ca">pedaç de JSON</comment>
- <comment xml:lang="cs">cesta JSON</comment>
- <comment xml:lang="da">JSON-rettelse</comment>
- <comment xml:lang="de">JSON-Patch</comment>
- <comment xml:lang="en-GB">JSON patch</comment>
- <comment xml:lang="es">parche en JSON</comment>
- <comment xml:lang="eu">JSON adabakia</comment>
- <comment xml:lang="fi">JSON-paikkatiedosto</comment>
- <comment xml:lang="fr">correctif JSON</comment>
- <comment xml:lang="fur">blec JSON</comment>
- <comment xml:lang="ga">paiste JSON</comment>
- <comment xml:lang="he">טלאי JSON</comment>
- <comment xml:lang="hr">JSON zakrpa</comment>
- <comment xml:lang="hu">JSON javítócsomag</comment>
- <comment xml:lang="ia">Patch JSON</comment>
- <comment xml:lang="id">Patch JSON</comment>
- <comment xml:lang="it">Patch JSON</comment>
- <comment xml:lang="kk">JSON өзгерісі</comment>
- <comment xml:lang="ko">JSON 패치</comment>
- <comment xml:lang="oc">correctiu JSON</comment>
- <comment xml:lang="pl">Łata JSON</comment>
- <comment xml:lang="pt">patch JSON</comment>
- <comment xml:lang="pt-BR">Patch JSON</comment>
- <comment xml:lang="ru">Патч JSON</comment>
- <comment xml:lang="sk">Záplata JSON</comment>
- <comment xml:lang="sr">ЈСОН закрпа</comment>
- <comment xml:lang="sv">JSON patch</comment>
- <comment xml:lang="tr">JSON yaması</comment>
+ <comment xml:lang="zh_TW">JSON 修補檔</comment>
+ <comment xml:lang="zh_CN">JSON 补丁</comment>
<comment xml:lang="uk">латка JSON</comment>
- <comment xml:lang="zh-CN">JSON 补丁</comment>
- <comment xml:lang="zh-TW">JSON 修補檔</comment>
+ <comment xml:lang="tr">JSON yaması</comment>
+ <comment xml:lang="sv">JSON patch</comment>
+ <comment xml:lang="sr">ЈСОН закрпа</comment>
+ <comment xml:lang="sq">arnë JSON</comment>
+ <comment xml:lang="sl">Popravek JSON</comment>
+ <comment xml:lang="si">JSON පැච්</comment>
+ <comment xml:lang="sk">Záplata JSON</comment>
+ <comment xml:lang="ru">Патч JSON</comment>
+ <comment xml:lang="pt_BR">Patch JSON</comment>
+ <comment xml:lang="pt">patch JSON</comment>
+ <comment xml:lang="pl">Łata JSON</comment>
+ <comment xml:lang="oc">correctiu JSON</comment>
+ <comment xml:lang="nl">JSON-patch</comment>
+ <comment xml:lang="ko">JSON 패치</comment>
+ <comment xml:lang="kk">JSON өзгерісі</comment>
+ <comment xml:lang="ja">JSON パッチ</comment>
+ <comment xml:lang="it">Patch JSON</comment>
+ <comment xml:lang="is">JSON kóðabót</comment>
+ <comment xml:lang="id">Patch JSON</comment>
+ <comment xml:lang="ia">Patch JSON</comment>
+ <comment xml:lang="hu">JSON javítócsomag</comment>
+ <comment xml:lang="hr">JSON zakrpa</comment>
+ <comment xml:lang="he">טלאי JSON</comment>
+ <comment xml:lang="gl">Parche JSON</comment>
+ <comment xml:lang="ga">paiste JSON</comment>
+ <comment xml:lang="fur">blec JSON</comment>
+ <comment xml:lang="fr">correctif JSON</comment>
+ <comment xml:lang="fi">JSON-paikkatiedosto</comment>
+ <comment xml:lang="eu">JSON adabakia</comment>
+ <comment xml:lang="es">parche en JSON</comment>
+ <comment xml:lang="en_GB">JSON patch</comment>
+ <comment xml:lang="de">JSON-Patch</comment>
+ <comment xml:lang="da">JSON-rettelse</comment>
+ <comment xml:lang="cs">cesta JSON</comment>
+ <comment xml:lang="ca">pedaç de JSON</comment>
+ <comment xml:lang="bg">Кръпка — JSON</comment>
+ <comment xml:lang="be">патч JSON</comment>
+ <comment xml:lang="ar">رقعة JSON</comment>
<acronym>JSON</acronym>
<expanded-acronym>JavaScript Object Notation</expanded-acronym>
<sub-class-of type="application/json"/>
@@ -14033,75 +14596,126 @@ command to generate the output files.
</mime-type>
<mime-type type="application/ld+json">
<comment>JSON-LD document</comment>
- <comment xml:lang="ast">Documentu JSON-LD</comment>
- <comment xml:lang="bg">Документ — JSON-LD</comment>
- <comment xml:lang="ca">document JSON-LD</comment>
- <comment xml:lang="cs">dokument JSON-LD</comment>
- <comment xml:lang="da">JSON-LD-dokument</comment>
- <comment xml:lang="de">JSON-LD-Dokument</comment>
- <comment xml:lang="el">Έγγραφο JSON-LD</comment>
- <comment xml:lang="en-GB">JSON-LD document</comment>
- <comment xml:lang="es">documento JSON-LD</comment>
- <comment xml:lang="eu">JSON-LD dokumentua</comment>
- <comment xml:lang="fi">JSON-LD-asiakirja</comment>
- <comment xml:lang="fr">document JSON-LD</comment>
- <comment xml:lang="fur">document JSON-LD</comment>
- <comment xml:lang="ga">cáipéis JSON-LD</comment>
- <comment xml:lang="he">מסמך JSON-LD</comment>
- <comment xml:lang="hr">JSON-LD dokument</comment>
- <comment xml:lang="hu">JSON-LD dokumentum</comment>
- <comment xml:lang="ia">Documento JSON-LD</comment>
- <comment xml:lang="id">Dokumen JSON-LD</comment>
- <comment xml:lang="it">Documento JSON-LD</comment>
- <comment xml:lang="kk">JSON-LD құжаты</comment>
- <comment xml:lang="ko">JSON-LD 문서</comment>
- <comment xml:lang="oc">Document JSON-LD</comment>
- <comment xml:lang="pl">Dokument JSON-LD</comment>
- <comment xml:lang="pt">documento JSON-LD</comment>
- <comment xml:lang="pt-BR">Documento JSON-LD</comment>
- <comment xml:lang="ru">Документ JSON-LD</comment>
- <comment xml:lang="sk">Dokument JSON-LD</comment>
- <comment xml:lang="sl">Dokument JSON-LD</comment>
- <comment xml:lang="sr">ЈСОН-ЛД документ</comment>
- <comment xml:lang="sv">JSON-LD-dokument</comment>
- <comment xml:lang="tr">JSON-LD belgesi</comment>
+ <comment xml:lang="zh_TW">JSON-LD 文件</comment>
+ <comment xml:lang="zh_CN">JSON-LD 文档</comment>
<comment xml:lang="uk">документ JSON-LD</comment>
- <comment xml:lang="zh-CN">JSON-LD 文档</comment>
- <comment xml:lang="zh-TW">JSON-LD 文件</comment>
+ <comment xml:lang="tr">JSON-LD belgesi</comment>
+ <comment xml:lang="sv">JSON-LD-dokument</comment>
+ <comment xml:lang="sr">ЈСОН-ЛД документ</comment>
+ <comment xml:lang="sq">dokument JSON-LD</comment>
+ <comment xml:lang="sl">Dokument JSON-LD</comment>
+ <comment xml:lang="si">JSON-LD ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument JSON-LD</comment>
+ <comment xml:lang="ru">Документ JSON-LD</comment>
+ <comment xml:lang="pt_BR">Documento JSON-LD</comment>
+ <comment xml:lang="pt">documento JSON-LD</comment>
+ <comment xml:lang="pl">Dokument JSON-LD</comment>
+ <comment xml:lang="oc">Document JSON-LD</comment>
+ <comment xml:lang="nl">JSON-LD-document</comment>
+ <comment xml:lang="ko">JSON-LD 문서</comment>
+ <comment xml:lang="kk">JSON-LD құжаты</comment>
+ <comment xml:lang="ja">JSON-LD ドキュメント</comment>
+ <comment xml:lang="it">Documento JSON-LD</comment>
+ <comment xml:lang="is">JSON-LD skjal</comment>
+ <comment xml:lang="id">Dokumen JSON-LD</comment>
+ <comment xml:lang="ia">Documento JSON-LD</comment>
+ <comment xml:lang="hu">JSON-LD dokumentum</comment>
+ <comment xml:lang="hr">JSON-LD dokument</comment>
+ <comment xml:lang="he">מסמך JSON-LD</comment>
+ <comment xml:lang="gl">Documento de JSON-LD</comment>
+ <comment xml:lang="ga">cáipéis JSON-LD</comment>
+ <comment xml:lang="fur">document JSON-LD</comment>
+ <comment xml:lang="fr">document JSON-LD</comment>
+ <comment xml:lang="fi">JSON-LD-asiakirja</comment>
+ <comment xml:lang="eu">JSON-LD dokumentua</comment>
+ <comment xml:lang="es">documento JSON-LD</comment>
+ <comment xml:lang="en_GB">JSON-LD document</comment>
+ <comment xml:lang="el">Έγγραφο JSON-LD</comment>
+ <comment xml:lang="de">JSON-LD-Dokument</comment>
+ <comment xml:lang="da">JSON-LD-dokument</comment>
+ <comment xml:lang="cs">dokument JSON-LD</comment>
+ <comment xml:lang="ca">document JSON-LD</comment>
+ <comment xml:lang="bg">Документ — JSON-LD</comment>
+ <comment xml:lang="be">дакумент JSON-LD</comment>
+ <comment xml:lang="ast">Documentu JSON-LD</comment>
+ <comment xml:lang="ar">مستند JSON-LD</comment>
<acronym>JSON-LD</acronym>
<expanded-acronym>JavaScript Object Notation for Linked Data</expanded-acronym>
<sub-class-of type="application/json"/>
<generic-icon name="text-x-script"/>
<glob pattern="*.jsonld"/>
</mime-type>
+ <mime-type type="application/schema+json">
+ <comment>JSON schema</comment>
+ <comment xml:lang="uk">схема JSON</comment>
+ <comment xml:lang="tr">JSON şeması</comment>
+ <comment xml:lang="sv">JSON-schema</comment>
+ <comment xml:lang="sl">Shema JSON</comment>
+ <comment xml:lang="si">JSON යෝජනා ක්රමය</comment>
+ <comment xml:lang="ru">Схема JSON</comment>
+ <comment xml:lang="pl">Schemat JSON</comment>
+ <comment xml:lang="oc">esquèma JSON</comment>
+ <comment xml:lang="nl">JSON-schema</comment>
+ <comment xml:lang="ko">JSON 스키마</comment>
+ <comment xml:lang="kk">JSON сұлбасы</comment>
+ <comment xml:lang="ja">JSON スキーマ</comment>
+ <comment xml:lang="it">Schema JSON</comment>
+ <comment xml:lang="hr">JSON shema</comment>
+ <comment xml:lang="he">סכמת JSON</comment>
+ <comment xml:lang="gl">Esquema de JSON</comment>
+ <comment xml:lang="fi">JSON-skeema</comment>
+ <comment xml:lang="eu">JSON eskema</comment>
+ <comment xml:lang="es">esquema JSON</comment>
+ <comment xml:lang="en_GB">JSON schema</comment>
+ <comment xml:lang="de">JSON-Schema</comment>
+ <comment xml:lang="be">схема JSON</comment>
+ <comment xml:lang="ar">مخطط JSON</comment>
+ <sub-class-of type="application/json"/>
+ <generic-icon name="text-x-script"/>
+ <magic priority="80">
+ <match type="string" value="{" offset="0">
+ <match type="string" value="&quot;$schema&quot;:" offset="1:256"/>
+ </match>
+ </magic>
+ <glob pattern="*.json"/>
+ </mime-type>
<mime-type type="application/x-ipynb+json">
<comment>Jupyter notebook document</comment>
- <comment xml:lang="bg">Скицник — Jupyter</comment>
- <comment xml:lang="ca">document de llibreta de notes de Jupyter</comment>
- <comment xml:lang="da">Jupyter notebook-dokument</comment>
- <comment xml:lang="de">Jupyter-Notebook-Dokument</comment>
- <comment xml:lang="en-GB">Jupyter notebook document</comment>
- <comment xml:lang="es">documento de cuaderno de Jupyter</comment>
- <comment xml:lang="eu">Jupyter notebook dokumentua</comment>
- <comment xml:lang="fi">Jupyter notebook -asiakirja</comment>
- <comment xml:lang="fr">carnet de notes Jupyter</comment>
- <comment xml:lang="hr">Jupyter notebook dokument</comment>
- <comment xml:lang="hu">Jupyter munkafüzet dokumentum</comment>
- <comment xml:lang="id">Dokumen Jupyter notebook</comment>
- <comment xml:lang="it">Documento notebook Jupyter</comment>
- <comment xml:lang="kk">Jupyter блокнот құжаты</comment>
- <comment xml:lang="ko">주피터 노트북 문서</comment>
- <comment xml:lang="pl">Dokument notatnika Jupyter</comment>
- <comment xml:lang="pt-BR">Documento Jupyter Notebook</comment>
- <comment xml:lang="ru">Документ Jupyter notebook</comment>
- <comment xml:lang="sv">Jupyter-anteckningsboksdokument</comment>
- <comment xml:lang="tr">Jupyter notebook belgesi</comment>
+ <comment xml:lang="zh_TW">Jupyter 記事本文件</comment>
+ <comment xml:lang="zh_CN">Jupyter 笔记本文档</comment>
<comment xml:lang="uk">документ нотатника Jupyter</comment>
- <comment xml:lang="zh-CN">Jupyter 笔记本文档</comment>
- <comment xml:lang="zh-TW">Jupyter 記事本文件</comment>
+ <comment xml:lang="tr">Jupyter notebook belgesi</comment>
+ <comment xml:lang="sv">Jupyter-anteckningsboksdokument</comment>
+ <comment xml:lang="sq">dokument ditari Jupyter</comment>
+ <comment xml:lang="si">Jupyter සටහන් පොත් ලේඛනය</comment>
+ <comment xml:lang="ru">Документ Jupyter notebook</comment>
+ <comment xml:lang="pt_BR">Documento Jupyter Notebook</comment>
+ <comment xml:lang="pl">Dokument notatnika Jupyter</comment>
+ <comment xml:lang="nl">Jupyter notebook-document</comment>
+ <comment xml:lang="ko">주피터 노트북 문서</comment>
+ <comment xml:lang="kk">Jupyter блокнот құжаты</comment>
+ <comment xml:lang="ja">Jupyter notebook ドキュメント</comment>
+ <comment xml:lang="it">Documento notebook Jupyter</comment>
+ <comment xml:lang="is">Jupyter skrifblokkarskjal</comment>
+ <comment xml:lang="id">Dokumen Jupyter notebook</comment>
+ <comment xml:lang="hu">Jupyter munkafüzet dokumentum</comment>
+ <comment xml:lang="hr">Jupyter notebook dokument</comment>
+ <comment xml:lang="he">מסמך מחברת של Jupyter</comment>
+ <comment xml:lang="gl">Documento de caderno de Jupyter</comment>
+ <comment xml:lang="fr">carnet de notes Jupyter</comment>
+ <comment xml:lang="fi">Jupyter notebook -asiakirja</comment>
+ <comment xml:lang="eu">Jupyter notebook dokumentua</comment>
+ <comment xml:lang="es">documento de cuaderno de Jupyter</comment>
+ <comment xml:lang="en_GB">Jupyter notebook document</comment>
+ <comment xml:lang="de">Jupyter-Notebook-Dokument</comment>
+ <comment xml:lang="da">Jupyter notebook-dokument</comment>
+ <comment xml:lang="ca">document de llibreta de notes de Jupyter</comment>
+ <comment xml:lang="bg">Скицник — Jupyter</comment>
+ <comment xml:lang="be">дакумент Jupyter notebook</comment>
+ <comment xml:lang="ar">مستند دفتر Jupyter</comment>
<sub-class-of type="application/json"/>
<generic-icon name="x-office-document"/>
- <magic priority="50">
+ <magic>
<match type="string" value="{" offset="0">
<match type="string" value="&quot;cells&quot;:" offset="1:256"/>
</match>
@@ -14110,154 +14724,168 @@ command to generate the output files.
</mime-type>
<mime-type type="application/vnd.coffeescript">
<comment>CoffeeScript document</comment>
- <comment xml:lang="af">CoffeeScript-dokument</comment>
- <comment xml:lang="ast">Documentu de CoffeScript</comment>
- <comment xml:lang="bg">Документ — CoffeeScript</comment>
- <comment xml:lang="ca">document CoffeeScript</comment>
- <comment xml:lang="cs">dokument CoffeeScript</comment>
- <comment xml:lang="da">CoffeeScript-dokument</comment>
- <comment xml:lang="de">CoffeeScript-Dokument</comment>
- <comment xml:lang="el">Έγγραφο CoffeeScript</comment>
- <comment xml:lang="en-GB">CoffeeScript document</comment>
- <comment xml:lang="es">documento en CoffeeScript</comment>
- <comment xml:lang="eu">CoffeeScript dokumentua</comment>
- <comment xml:lang="fi">CoffeeScript-asiakirja</comment>
- <comment xml:lang="fr">document CoffeeScript</comment>
- <comment xml:lang="fur">document CoffeeScript</comment>
- <comment xml:lang="ga">cáipéis CoffeeScript</comment>
- <comment xml:lang="he">מסמך CoffeeScript</comment>
- <comment xml:lang="hr">CoffeeScript dokument</comment>
- <comment xml:lang="hu">CoffeeScript dokumentum</comment>
- <comment xml:lang="ia">Documento CoffeeScript</comment>
- <comment xml:lang="id">Dokumen CoffeeScript</comment>
- <comment xml:lang="it">Documento CoffeeScript</comment>
- <comment xml:lang="kk">CoffeeScript құжаты</comment>
- <comment xml:lang="ko">CoffeeScript 문서</comment>
- <comment xml:lang="oc">Document CoffeScript</comment>
- <comment xml:lang="pl">Dokument CoffeeScript</comment>
- <comment xml:lang="pt">documento CoffeeScript</comment>
- <comment xml:lang="pt-BR">Documento CoffeeScript</comment>
- <comment xml:lang="ru">Документ CoffeeScript</comment>
- <comment xml:lang="sk">Dokument CoffeeScript</comment>
- <comment xml:lang="sl">Dokument CoffeeScript</comment>
- <comment xml:lang="sr">Кофи скрипт документ</comment>
- <comment xml:lang="sv">CoffeeScript-dokument</comment>
- <comment xml:lang="tr">CoffeeScript belgesi</comment>
+ <comment xml:lang="zh_TW">CoffeeScript 文件</comment>
+ <comment xml:lang="zh_CN">CoffeeScript 文档</comment>
<comment xml:lang="uk">документ CoffeeScript</comment>
- <comment xml:lang="zh-CN">CoffeeScript 文档</comment>
- <comment xml:lang="zh-TW">CoffeeScript 文件</comment>
+ <comment xml:lang="tr">CoffeeScript belgesi</comment>
+ <comment xml:lang="sv">CoffeeScript-dokument</comment>
+ <comment xml:lang="sr">Кофи скрипт документ</comment>
+ <comment xml:lang="sq">dokument CoffeeScript</comment>
+ <comment xml:lang="sl">Dokument CoffeeScript</comment>
+ <comment xml:lang="si">CoffeeScript ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument CoffeeScript</comment>
+ <comment xml:lang="ru">Документ CoffeeScript</comment>
+ <comment xml:lang="pt_BR">Documento CoffeeScript</comment>
+ <comment xml:lang="pt">documento CoffeeScript</comment>
+ <comment xml:lang="pl">Dokument CoffeeScript</comment>
+ <comment xml:lang="oc">Document CoffeScript</comment>
+ <comment xml:lang="nl">CoffeeScript-document</comment>
+ <comment xml:lang="ko">CoffeeScript 문서</comment>
+ <comment xml:lang="kk">CoffeeScript құжаты</comment>
+ <comment xml:lang="ja">CoffeeScript ドキュメント</comment>
+ <comment xml:lang="it">Documento CoffeeScript</comment>
+ <comment xml:lang="is">CoffeeScript skjal</comment>
+ <comment xml:lang="id">Dokumen CoffeeScript</comment>
+ <comment xml:lang="ia">Documento CoffeeScript</comment>
+ <comment xml:lang="hu">CoffeeScript dokumentum</comment>
+ <comment xml:lang="hr">CoffeeScript dokument</comment>
+ <comment xml:lang="he">מסמך CoffeeScript</comment>
+ <comment xml:lang="gl">Documento CoffeeScript</comment>
+ <comment xml:lang="ga">cáipéis CoffeeScript</comment>
+ <comment xml:lang="fur">document CoffeeScript</comment>
+ <comment xml:lang="fr">document CoffeeScript</comment>
+ <comment xml:lang="fi">CoffeeScript-asiakirja</comment>
+ <comment xml:lang="eu">CoffeeScript dokumentua</comment>
+ <comment xml:lang="es">documento en CoffeeScript</comment>
+ <comment xml:lang="en_GB">CoffeeScript document</comment>
+ <comment xml:lang="el">Έγγραφο CoffeeScript</comment>
+ <comment xml:lang="de">CoffeeScript-Dokument</comment>
+ <comment xml:lang="da">CoffeeScript-dokument</comment>
+ <comment xml:lang="cs">dokument CoffeeScript</comment>
+ <comment xml:lang="ca">document CoffeeScript</comment>
+ <comment xml:lang="bg">Документ — CoffeeScript</comment>
+ <comment xml:lang="be">дакумент CoffeeScript</comment>
+ <comment xml:lang="ast">Documentu de CoffeScript</comment>
+ <comment xml:lang="ar">مستند CoffeeScript</comment>
+ <comment xml:lang="af">CoffeeScript-dokument</comment>
<sub-class-of type="text/plain"/>
<generic-icon name="text-x-script"/>
<glob pattern="*.coffee"/>
</mime-type>
<mime-type type="application/x-jbuilder-project">
<comment>JBuilder project</comment>
- <comment xml:lang="af">JBuilder-projek</comment>
- <comment xml:lang="ar">مشروع JBuilder</comment>
- <comment xml:lang="be-Latn">Prajekt JBuilder</comment>
- <comment xml:lang="bg">Проект — JBuilder</comment>
- <comment xml:lang="ca">projecte de JBuilder</comment>
- <comment xml:lang="cs">projekt JBuilder</comment>
- <comment xml:lang="da">JBuilder-projekt</comment>
- <comment xml:lang="de">JBuilder-Projekt</comment>
- <comment xml:lang="el">Εργο JBuilder</comment>
- <comment xml:lang="en-GB">JBuilder project</comment>
- <comment xml:lang="eo">JBuilder-projekto</comment>
- <comment xml:lang="es">proyecto de JBuilder</comment>
- <comment xml:lang="eu">JBuilder proiektua</comment>
- <comment xml:lang="fi">JBuilder-projekti</comment>
- <comment xml:lang="fo">JBuilder verkætlan</comment>
- <comment xml:lang="fr">projet JBuilder</comment>
- <comment xml:lang="fur">progjet JBuilder</comment>
- <comment xml:lang="ga">tionscadal JBuilder</comment>
- <comment xml:lang="gl">proxecto de JBuilder</comment>
- <comment xml:lang="he">מיזם JBuilder</comment>
- <comment xml:lang="hr">JBuilder projekt</comment>
- <comment xml:lang="hu">JBuilder-projekt</comment>
- <comment xml:lang="ia">Projecto JBuilder</comment>
- <comment xml:lang="id">Proyek JBuilder</comment>
- <comment xml:lang="it">Progetto JBuilder</comment>
- <comment xml:lang="ja">JBuilder プロジェクト</comment>
- <comment xml:lang="kk">JBuilder жобасы</comment>
- <comment xml:lang="ko">JBuilder 프로젝트</comment>
- <comment xml:lang="lt">JBuilder projektas</comment>
- <comment xml:lang="lv">JBuilder projekts</comment>
- <comment xml:lang="ms">Projek JBuilder</comment>
- <comment xml:lang="nb">JBuilder-prosjekt</comment>
- <comment xml:lang="nl">JBuilder-project</comment>
- <comment xml:lang="nn">JBuilder-prosjekt</comment>
- <comment xml:lang="oc">projècte JBuilder</comment>
- <comment xml:lang="pl">Projekt JBuilder</comment>
- <comment xml:lang="pt">projecto JBuilder</comment>
- <comment xml:lang="pt-BR">Projeto do JBuilder</comment>
- <comment xml:lang="ro">Proiect JBuilder</comment>
- <comment xml:lang="ru">Проект JBuilder</comment>
- <comment xml:lang="sk">Projekt JBuilder</comment>
- <comment xml:lang="sl">Datoteka projekta JBuilder</comment>
- <comment xml:lang="sq">Projekt JBuilder</comment>
- <comment xml:lang="sr">пројекат ЈГрадитеља</comment>
- <comment xml:lang="sv">JBuilder-projekt</comment>
- <comment xml:lang="tr">JBuilder projesi</comment>
- <comment xml:lang="uk">проєкт JBuilder</comment>
+ <comment xml:lang="zh_TW">JBuilder 專案</comment>
+ <comment xml:lang="zh_CN">JBuilder 工程</comment>
<comment xml:lang="vi">Dự án JBuilder</comment>
- <comment xml:lang="zh-CN">JBuilder 工程</comment>
- <comment xml:lang="zh-TW">JBuilder 專案</comment>
+ <comment xml:lang="uk">проєкт JBuilder</comment>
+ <comment xml:lang="tr">JBuilder projesi</comment>
+ <comment xml:lang="sv">JBuilder-projekt</comment>
+ <comment xml:lang="sr">пројекат ЈГрадитеља</comment>
+ <comment xml:lang="sq">projekt JBuilder</comment>
+ <comment xml:lang="sl">Datoteka projekta JBuilder</comment>
+ <comment xml:lang="si">JBuilder ව්යාපෘතිය</comment>
+ <comment xml:lang="sk">Projekt JBuilder</comment>
+ <comment xml:lang="ru">Проект JBuilder</comment>
+ <comment xml:lang="ro">Proiect JBuilder</comment>
+ <comment xml:lang="pt_BR">Projeto do JBuilder</comment>
+ <comment xml:lang="pt">projecto JBuilder</comment>
+ <comment xml:lang="pl">Projekt JBuilder</comment>
+ <comment xml:lang="oc">projècte JBuilder</comment>
+ <comment xml:lang="nn">JBuilder-prosjekt</comment>
+ <comment xml:lang="nl">JBuilder-project</comment>
+ <comment xml:lang="nb">JBuilder-prosjekt</comment>
+ <comment xml:lang="ms">Projek JBuilder</comment>
+ <comment xml:lang="lv">JBuilder projekts</comment>
+ <comment xml:lang="lt">JBuilder projektas</comment>
+ <comment xml:lang="ko">JBuilder 프로젝트</comment>
+ <comment xml:lang="kk">JBuilder жобасы</comment>
+ <comment xml:lang="ja">JBuilder プロジェクト</comment>
+ <comment xml:lang="it">Progetto JBuilder</comment>
+ <comment xml:lang="is">JBuilder verkefni</comment>
+ <comment xml:lang="id">Proyek JBuilder</comment>
+ <comment xml:lang="ia">Projecto JBuilder</comment>
+ <comment xml:lang="hu">JBuilder-projekt</comment>
+ <comment xml:lang="hr">JBuilder projekt</comment>
+ <comment xml:lang="he">מיזם JBuilder</comment>
+ <comment xml:lang="gl">proxecto de JBuilder</comment>
+ <comment xml:lang="ga">tionscadal JBuilder</comment>
+ <comment xml:lang="fur">progjet JBuilder</comment>
+ <comment xml:lang="fr">projet JBuilder</comment>
+ <comment xml:lang="fo">JBuilder verkætlan</comment>
+ <comment xml:lang="fi">JBuilder-projekti</comment>
+ <comment xml:lang="eu">JBuilder proiektua</comment>
+ <comment xml:lang="es">proyecto de JBuilder</comment>
+ <comment xml:lang="eo">JBuilder-projekto</comment>
+ <comment xml:lang="en_GB">JBuilder project</comment>
+ <comment xml:lang="el">Εργο JBuilder</comment>
+ <comment xml:lang="de">JBuilder-Projekt</comment>
+ <comment xml:lang="da">JBuilder-projekt</comment>
+ <comment xml:lang="cs">projekt JBuilder</comment>
+ <comment xml:lang="ca">projecte de JBuilder</comment>
+ <comment xml:lang="bg">Проект — JBuilder</comment>
+ <comment xml:lang="be@latin">Prajekt JBuilder</comment>
+ <comment xml:lang="be">праект JBuilder</comment>
+ <comment xml:lang="ar">مشروع JBuilder</comment>
+ <comment xml:lang="af">JBuilder-projek</comment>
<generic-icon name="x-office-document"/>
<glob pattern="*.jpr"/>
<glob pattern="*.jpx"/>
</mime-type>
<mime-type type="application/x-karbon">
<comment>Karbon14 drawing</comment>
- <comment xml:lang="af">Karbon14-tekening</comment>
- <comment xml:lang="ar">تصميم Karbon14</comment>
- <comment xml:lang="be-Latn">Rysunak Karbon14</comment>
- <comment xml:lang="bg">Чертеж — Karbon14</comment>
- <comment xml:lang="ca">dibuix de Karbon14</comment>
- <comment xml:lang="cs">kresba Karbon14</comment>
- <comment xml:lang="da">Karbon14-tegning</comment>
- <comment xml:lang="de">Karbon14-Zeichnung</comment>
- <comment xml:lang="el">Σχέδιο Karbon14</comment>
- <comment xml:lang="en-GB">Karbon14 drawing</comment>
- <comment xml:lang="eo">Karbon14-grafikaĵo</comment>
- <comment xml:lang="es">dibujo de Karbon14</comment>
- <comment xml:lang="eu">Karbon14 marrazkia</comment>
- <comment xml:lang="fi">Karbon14-piirros</comment>
- <comment xml:lang="fo">Karbon14 tekning</comment>
- <comment xml:lang="fr">dessin Karbon14</comment>
- <comment xml:lang="fur">dissen Karbon14</comment>
- <comment xml:lang="ga">líníocht Karbon14</comment>
- <comment xml:lang="gl">debuxo de Karbon14</comment>
- <comment xml:lang="he">ציור Karbon14</comment>
- <comment xml:lang="hr">Karbon14 crtež</comment>
- <comment xml:lang="hu">Karbon14-rajz</comment>
- <comment xml:lang="ia">Designo Karbon14</comment>
- <comment xml:lang="id">Gambar Karbon14</comment>
- <comment xml:lang="it">Disegno Karbon14</comment>
- <comment xml:lang="ja">Karbon14 ドロー</comment>
- <comment xml:lang="kk">Karbon14 суреті</comment>
- <comment xml:lang="ko">Karbon14 그림</comment>
- <comment xml:lang="lt">Karbon14 piešinys</comment>
- <comment xml:lang="lv">Karbon14 zīmējums</comment>
- <comment xml:lang="ms">Lukisan Karbon14</comment>
- <comment xml:lang="nb">Karbon14-tegning</comment>
- <comment xml:lang="nl">Karbon14-tekening</comment>
- <comment xml:lang="nn">Karbon14-teikning</comment>
- <comment xml:lang="oc">dessenh Karbon14</comment>
- <comment xml:lang="pl">Rysunek Karbon14</comment>
- <comment xml:lang="pt">desenho Karbon14</comment>
- <comment xml:lang="pt-BR">Desenho do Karbon14</comment>
- <comment xml:lang="ro">Desen Karbon14</comment>
- <comment xml:lang="ru">Рисунок Karbon14</comment>
- <comment xml:lang="sk">Kresba Karbon14</comment>
- <comment xml:lang="sl">Datoteka risbe Karbon14</comment>
- <comment xml:lang="sq">Vizatim Karbon14</comment>
- <comment xml:lang="sr">цртеж Карбона14</comment>
- <comment xml:lang="sv">Karbon14-teckning</comment>
- <comment xml:lang="tr">Karbon14 çizimi</comment>
- <comment xml:lang="uk">малюнок Karbon14</comment>
+ <comment xml:lang="zh_TW">Karbon14 繪圖</comment>
+ <comment xml:lang="zh_CN">Karbon14 绘图</comment>
<comment xml:lang="vi">Bản vẽ Karbon14</comment>
- <comment xml:lang="zh-CN">Karbon14 绘图</comment>
- <comment xml:lang="zh-TW">Karbon14 繪圖</comment>
+ <comment xml:lang="uk">малюнок Karbon14</comment>
+ <comment xml:lang="tr">Karbon14 çizimi</comment>
+ <comment xml:lang="sv">Karbon14-teckning</comment>
+ <comment xml:lang="sr">цртеж Карбона14</comment>
+ <comment xml:lang="sq">vizatim Karbon14</comment>
+ <comment xml:lang="sl">Datoteka risbe Karbon14</comment>
+ <comment xml:lang="si">Karbon14 ඇඳීම</comment>
+ <comment xml:lang="sk">Kresba Karbon14</comment>
+ <comment xml:lang="ru">Рисунок Karbon14</comment>
+ <comment xml:lang="ro">Desen Karbon14</comment>
+ <comment xml:lang="pt_BR">Desenho do Karbon14</comment>
+ <comment xml:lang="pt">desenho Karbon14</comment>
+ <comment xml:lang="pl">Rysunek Karbon14</comment>
+ <comment xml:lang="oc">dessenh Karbon14</comment>
+ <comment xml:lang="nn">Karbon14-teikning</comment>
+ <comment xml:lang="nl">Karbon14-tekening</comment>
+ <comment xml:lang="nb">Karbon14-tegning</comment>
+ <comment xml:lang="ms">Lukisan Karbon14</comment>
+ <comment xml:lang="lv">Karbon14 zīmējums</comment>
+ <comment xml:lang="lt">Karbon14 piešinys</comment>
+ <comment xml:lang="ko">Karbon14 그림</comment>
+ <comment xml:lang="kk">Karbon14 суреті</comment>
+ <comment xml:lang="ja">Karbon14 ドロー</comment>
+ <comment xml:lang="it">Disegno Karbon14</comment>
+ <comment xml:lang="is">Karbon14 Tteikning</comment>
+ <comment xml:lang="id">Gambar Karbon14</comment>
+ <comment xml:lang="ia">Designo Karbon14</comment>
+ <comment xml:lang="hu">Karbon14-rajz</comment>
+ <comment xml:lang="hr">Karbon14 crtež</comment>
+ <comment xml:lang="he">ציור Karbon14</comment>
+ <comment xml:lang="gl">debuxo de Karbon14</comment>
+ <comment xml:lang="ga">líníocht Karbon14</comment>
+ <comment xml:lang="fur">dissen Karbon14</comment>
+ <comment xml:lang="fr">dessin Karbon14</comment>
+ <comment xml:lang="fo">Karbon14 tekning</comment>
+ <comment xml:lang="fi">Karbon14-piirros</comment>
+ <comment xml:lang="eu">Karbon14 marrazkia</comment>
+ <comment xml:lang="es">dibujo de Karbon14</comment>
+ <comment xml:lang="eo">Karbon14-grafikaĵo</comment>
+ <comment xml:lang="en_GB">Karbon14 drawing</comment>
+ <comment xml:lang="el">Σχέδιο Karbon14</comment>
+ <comment xml:lang="de">Karbon14-Zeichnung</comment>
+ <comment xml:lang="da">Karbon14-tegning</comment>
+ <comment xml:lang="cs">kresba Karbon14</comment>
+ <comment xml:lang="ca">dibuix de Karbon14</comment>
+ <comment xml:lang="bg">Чертеж — Karbon14</comment>
+ <comment xml:lang="be@latin">Rysunak Karbon14</comment>
+ <comment xml:lang="be">рысунак Karbon14</comment>
+ <comment xml:lang="ar">تصميم Karbon14</comment>
+ <comment xml:lang="af">Karbon14-tekening</comment>
<generic-icon name="image-x-generic"/>
<magic priority="60">
<match type="string" value="\037\213" offset="0">
@@ -14275,56 +14903,59 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-kchart">
<comment>KChart chart</comment>
- <comment xml:lang="af">KChart-grafiek</comment>
- <comment xml:lang="ar">رسم بياني KChart</comment>
- <comment xml:lang="be-Latn">Hrafik KChart</comment>
- <comment xml:lang="bg">Диаграма — KChart</comment>
- <comment xml:lang="ca">diagrama de KChart</comment>
- <comment xml:lang="cs">graf Chart</comment>
- <comment xml:lang="da">KChart-diagram</comment>
- <comment xml:lang="de">KChart-Diagramm</comment>
- <comment xml:lang="el">Γράφημα KChart</comment>
- <comment xml:lang="en-GB">KChart chart</comment>
- <comment xml:lang="eo">KChart-diagramo</comment>
- <comment xml:lang="es">gráfico de KChart</comment>
- <comment xml:lang="eu">KChart diagrama</comment>
- <comment xml:lang="fi">KChart-kaavio</comment>
- <comment xml:lang="fo">KChart strikumynd</comment>
- <comment xml:lang="fr">graphique KChart</comment>
- <comment xml:lang="fur">grafic KChart</comment>
- <comment xml:lang="ga">cairt KChart</comment>
- <comment xml:lang="gl">gráfica de KChart</comment>
- <comment xml:lang="he">תרשים KChart</comment>
- <comment xml:lang="hr">KChart grafikon</comment>
- <comment xml:lang="hu">KChart-grafikon</comment>
- <comment xml:lang="ia">Graphico KChart</comment>
- <comment xml:lang="id">Bagan KChart</comment>
- <comment xml:lang="it">Grafico KChart</comment>
- <comment xml:lang="ja">KChart チャート</comment>
- <comment xml:lang="kk">KChart диаграммасы</comment>
- <comment xml:lang="ko">KChart 차트</comment>
- <comment xml:lang="lt">KChart diagrama</comment>
- <comment xml:lang="lv">KChart diagramma</comment>
- <comment xml:lang="ms">Carta KChart</comment>
- <comment xml:lang="nb">KChart-graf</comment>
- <comment xml:lang="nl">KChart-grafiek</comment>
- <comment xml:lang="nn">KChart-diagram</comment>
- <comment xml:lang="oc">grafic KChart</comment>
- <comment xml:lang="pl">Wykres KChart</comment>
- <comment xml:lang="pt">gráfico KChart</comment>
- <comment xml:lang="pt-BR">Gráfico do KChart</comment>
- <comment xml:lang="ro">Diagramă KChart</comment>
- <comment xml:lang="ru">Диаграмма KChart</comment>
- <comment xml:lang="sk">Graf KChart</comment>
- <comment xml:lang="sl">Datoteka grafikona KChart</comment>
- <comment xml:lang="sq">Grafik KChart</comment>
- <comment xml:lang="sr">графикон К-графика</comment>
- <comment xml:lang="sv">KChart-diagram</comment>
- <comment xml:lang="tr">KChart çizgesi</comment>
- <comment xml:lang="uk">діаграма KChart</comment>
+ <comment xml:lang="zh_TW">KChart 圖表</comment>
+ <comment xml:lang="zh_CN">KChart 图表</comment>
<comment xml:lang="vi">Sơ đồ KChart</comment>
- <comment xml:lang="zh-CN">KChart 图表</comment>
- <comment xml:lang="zh-TW">KChart 圖表</comment>
+ <comment xml:lang="uk">діаграма KChart</comment>
+ <comment xml:lang="tr">KChart çizgesi</comment>
+ <comment xml:lang="sv">KChart-diagram</comment>
+ <comment xml:lang="sr">графикон К-графика</comment>
+ <comment xml:lang="sq">grafik KChart</comment>
+ <comment xml:lang="sl">Datoteka grafikona KChart</comment>
+ <comment xml:lang="si">KChart ප්‍රස්ථාරය</comment>
+ <comment xml:lang="sk">Graf KChart</comment>
+ <comment xml:lang="ru">Диаграмма KChart</comment>
+ <comment xml:lang="ro">Diagramă KChart</comment>
+ <comment xml:lang="pt_BR">Gráfico do KChart</comment>
+ <comment xml:lang="pt">gráfico KChart</comment>
+ <comment xml:lang="pl">Wykres KChart</comment>
+ <comment xml:lang="oc">grafic KChart</comment>
+ <comment xml:lang="nn">KChart-diagram</comment>
+ <comment xml:lang="nl">KChart-grafiek</comment>
+ <comment xml:lang="nb">KChart-graf</comment>
+ <comment xml:lang="ms">Carta KChart</comment>
+ <comment xml:lang="lv">KChart diagramma</comment>
+ <comment xml:lang="lt">KChart diagrama</comment>
+ <comment xml:lang="ko">KChart 차트</comment>
+ <comment xml:lang="kk">KChart диаграммасы</comment>
+ <comment xml:lang="ja">KChart チャート</comment>
+ <comment xml:lang="it">Grafico KChart</comment>
+ <comment xml:lang="is">KChart línurit</comment>
+ <comment xml:lang="id">Bagan KChart</comment>
+ <comment xml:lang="ia">Graphico KChart</comment>
+ <comment xml:lang="hu">KChart-grafikon</comment>
+ <comment xml:lang="hr">KChart grafikon</comment>
+ <comment xml:lang="he">תרשים KChart</comment>
+ <comment xml:lang="gl">gráfica de KChart</comment>
+ <comment xml:lang="ga">cairt KChart</comment>
+ <comment xml:lang="fur">grafic KChart</comment>
+ <comment xml:lang="fr">graphique KChart</comment>
+ <comment xml:lang="fo">KChart strikumynd</comment>
+ <comment xml:lang="fi">KChart-kaavio</comment>
+ <comment xml:lang="eu">KChart diagrama</comment>
+ <comment xml:lang="es">gráfico de KChart</comment>
+ <comment xml:lang="eo">KChart-diagramo</comment>
+ <comment xml:lang="en_GB">KChart chart</comment>
+ <comment xml:lang="el">Γράφημα KChart</comment>
+ <comment xml:lang="de">KChart-Diagramm</comment>
+ <comment xml:lang="da">KChart-diagram</comment>
+ <comment xml:lang="cs">graf Chart</comment>
+ <comment xml:lang="ca">diagrama de KChart</comment>
+ <comment xml:lang="bg">Диаграма — KChart</comment>
+ <comment xml:lang="be@latin">Hrafik KChart</comment>
+ <comment xml:lang="be">графік KChart</comment>
+ <comment xml:lang="ar">رسم بياني KChart</comment>
+ <comment xml:lang="af">KChart-grafiek</comment>
<generic-icon name="x-office-spreadsheet"/>
<magic priority="60">
<match type="string" value="\037\213" offset="0">
@@ -14342,116 +14973,156 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-kexi-connectiondata">
<comment>Kexi settings</comment>
- <comment xml:lang="bg">Настройки — Kexi</comment>
- <comment xml:lang="ca">ajusts de Kexi</comment>
- <comment xml:lang="da">Kexi-indstillinger</comment>
- <comment xml:lang="de">Kexi-Einstellungen</comment>
- <comment xml:lang="en-GB">Kexi settings</comment>
- <comment xml:lang="es">configuración de Kexi</comment>
- <comment xml:lang="eu">Kexi ezarpenak</comment>
- <comment xml:lang="fi">Kexi-asetukset</comment>
- <comment xml:lang="fr">réglages Kexi</comment>
- <comment xml:lang="hr">Kexi postavke</comment>
- <comment xml:lang="hu">Kexi beállítások</comment>
- <comment xml:lang="id">Pengaturan Kexi</comment>
- <comment xml:lang="it">Impostazioni Kexi</comment>
- <comment xml:lang="kk">Kexi баптаулары</comment>
- <comment xml:lang="ko">Kexi 설정</comment>
- <comment xml:lang="pl">Ustawienia Kexi</comment>
- <comment xml:lang="pt-BR">Configurações do Kexi</comment>
- <comment xml:lang="ru">Файл настроек Kexi</comment>
- <comment xml:lang="sk">Nastavenia Kexi</comment>
- <comment xml:lang="sl">Nastavitve Kexi</comment>
- <comment xml:lang="sv">Kexi-inställningar</comment>
- <comment xml:lang="tr">Kexi ayarları</comment>
+ <comment xml:lang="zh_TW">Kexi 設定</comment>
+ <comment xml:lang="zh_CN">Kexi 设置</comment>
<comment xml:lang="uk">параметри Kexi</comment>
- <comment xml:lang="zh-CN">Kexi 设置</comment>
- <comment xml:lang="zh-TW">Kexi 設定</comment>
+ <comment xml:lang="tr">Kexi ayarları</comment>
+ <comment xml:lang="sv">Kexi-inställningar</comment>
+ <comment xml:lang="sq">rregullime Kexi</comment>
+ <comment xml:lang="sl">Nastavitve Kexi</comment>
+ <comment xml:lang="si">Kexi සැකසුම්</comment>
+ <comment xml:lang="sk">Nastavenia Kexi</comment>
+ <comment xml:lang="ru">Файл настроек Kexi</comment>
+ <comment xml:lang="pt_BR">Configurações do Kexi</comment>
+ <comment xml:lang="pl">Ustawienia Kexi</comment>
+ <comment xml:lang="oc">paramètres Kexi</comment>
+ <comment xml:lang="nl">Kexi-instellingen</comment>
+ <comment xml:lang="ko">Kexi 설정</comment>
+ <comment xml:lang="kk">Kexi баптаулары</comment>
+ <comment xml:lang="ja">Kexi 設定</comment>
+ <comment xml:lang="it">Impostazioni Kexi</comment>
+ <comment xml:lang="is">Kexi stillingar</comment>
+ <comment xml:lang="id">Pengaturan Kexi</comment>
+ <comment xml:lang="hu">Kexi beállítások</comment>
+ <comment xml:lang="hr">Kexi postavke</comment>
+ <comment xml:lang="he">הגדרות Kexi</comment>
+ <comment xml:lang="gl">Preferencias de Kexi</comment>
+ <comment xml:lang="fr">réglages Kexi</comment>
+ <comment xml:lang="fi">Kexi-asetukset</comment>
+ <comment xml:lang="eu">Kexi ezarpenak</comment>
+ <comment xml:lang="es">configuración de Kexi</comment>
+ <comment xml:lang="en_GB">Kexi settings</comment>
+ <comment xml:lang="de">Kexi-Einstellungen</comment>
+ <comment xml:lang="da">Kexi-indstillinger</comment>
+ <comment xml:lang="ca">ajusts de Kexi</comment>
+ <comment xml:lang="bg">Настройки — Kexi</comment>
+ <comment xml:lang="be">налады Kexi</comment>
+ <comment xml:lang="ar">إعدادات Kexi</comment>
<glob pattern="*.kexic"/>
</mime-type>
<mime-type type="application/x-kexiproject-shortcut">
<comment>Kexi shortcut</comment>
- <comment xml:lang="bg">Ускорител — Kexi</comment>
- <comment xml:lang="ca">drecera de Kexi</comment>
- <comment xml:lang="da">Kexi-genvej</comment>
- <comment xml:lang="de">Kexi-Verweis</comment>
- <comment xml:lang="en-GB">Kexi shortcut</comment>
- <comment xml:lang="es">atajo de Kexi</comment>
- <comment xml:lang="eu">Kexi lasterbidea</comment>
- <comment xml:lang="fi">KEXI-pikakuvake</comment>
- <comment xml:lang="fr">raccourci Kexi</comment>
- <comment xml:lang="hr">Kexi prečac</comment>
- <comment xml:lang="hu">Kexi parancsiko</comment>
- <comment xml:lang="id">Pintasan Kexi</comment>
- <comment xml:lang="it">Scorciatoia Kexi</comment>
- <comment xml:lang="kk">Kexi жарлығы</comment>
- <comment xml:lang="ko">Kexi 바로 가기</comment>
- <comment xml:lang="pl">Skrót Kexi</comment>
- <comment xml:lang="pt-BR">Atalho do Kexi</comment>
- <comment xml:lang="ru">Ссылка Kexi</comment>
- <comment xml:lang="sk">Odkaz Kexi</comment>
- <comment xml:lang="sv">Kexi-genväg</comment>
- <comment xml:lang="tr">Kexi kısayolu</comment>
+ <comment xml:lang="zh_TW">Kexi 捷徑</comment>
+ <comment xml:lang="zh_CN">Kexi 快捷方式</comment>
<comment xml:lang="uk">скорочення Kexi</comment>
- <comment xml:lang="zh-CN">Kexi 快捷方式</comment>
- <comment xml:lang="zh-TW">Kexi 捷徑</comment>
+ <comment xml:lang="tr">Kexi kısayolu</comment>
+ <comment xml:lang="sv">Kexi-genväg</comment>
+ <comment xml:lang="sq">shkurtore Kexi</comment>
+ <comment xml:lang="sl">Bližnjica Kexi</comment>
+ <comment xml:lang="si">Kexi කෙටිමඟ</comment>
+ <comment xml:lang="sk">Odkaz Kexi</comment>
+ <comment xml:lang="ru">Ссылка Kexi</comment>
+ <comment xml:lang="pt_BR">Atalho do Kexi</comment>
+ <comment xml:lang="pl">Skrót Kexi</comment>
+ <comment xml:lang="nl">Kexi-snelkoppeling</comment>
+ <comment xml:lang="ko">Kexi 바로 가기</comment>
+ <comment xml:lang="kk">Kexi жарлығы</comment>
+ <comment xml:lang="ja">Kexi ショートカット</comment>
+ <comment xml:lang="it">Scorciatoia Kexi</comment>
+ <comment xml:lang="is">Kexi fýtileið</comment>
+ <comment xml:lang="id">Pintasan Kexi</comment>
+ <comment xml:lang="hu">Kexi parancsiko</comment>
+ <comment xml:lang="hr">Kexi prečac</comment>
+ <comment xml:lang="he">קיצור דרך של Kexi</comment>
+ <comment xml:lang="gl">Atallo de Kexi</comment>
+ <comment xml:lang="fr">raccourci Kexi</comment>
+ <comment xml:lang="fi">Kexi-pikakuvake</comment>
+ <comment xml:lang="eu">Kexi lasterbidea</comment>
+ <comment xml:lang="es">atajo de Kexi</comment>
+ <comment xml:lang="en_GB">Kexi shortcut</comment>
+ <comment xml:lang="de">Kexi-Verweis</comment>
+ <comment xml:lang="da">Kexi-genvej</comment>
+ <comment xml:lang="ca">drecera de Kexi</comment>
+ <comment xml:lang="bg">Ускорител — Kexi</comment>
+ <comment xml:lang="be">ярлык Kexi</comment>
+ <comment xml:lang="ar">اختصار Kexi</comment>
<glob pattern="*.kexis"/>
</mime-type>
<mime-type type="application/x-kexiproject-sqlite2">
<comment>Kexi database file</comment>
- <comment xml:lang="bg">База от данни — Kexi</comment>
- <comment xml:lang="ca">fitxer de base de dades de Kexi</comment>
- <comment xml:lang="da">Kexi database-fil</comment>
- <comment xml:lang="de">Kexi-Datenbankdatei</comment>
- <comment xml:lang="en-GB">Kexi database file</comment>
- <comment xml:lang="es">archivo de base de datos de Kexi</comment>
- <comment xml:lang="eu">Kexi datu-base fitxategia</comment>
- <comment xml:lang="fi">KEXI-tietokanta</comment>
- <comment xml:lang="fr">fichier de base de données Kexi</comment>
- <comment xml:lang="hr">Kexi datoteka baze podataka</comment>
- <comment xml:lang="hu">Kexi adatbázisfájl</comment>
- <comment xml:lang="id">Berkas basis data Kexi</comment>
- <comment xml:lang="it">File database Kexi</comment>
- <comment xml:lang="kk">Kexi дерекқор файлы</comment>
- <comment xml:lang="ko">Kexi 데이터베이스 파일</comment>
- <comment xml:lang="pl">Plik bazy danych Kexi</comment>
- <comment xml:lang="pt-BR">Arquivo de banco de dados do Kexi</comment>
- <comment xml:lang="ru">Файл базы данных Kexi</comment>
- <comment xml:lang="sk">Súbor databázy Kexi</comment>
- <comment xml:lang="sv">Kexi-databasfil</comment>
- <comment xml:lang="tr">Kexi veri tabanı dosyası</comment>
+ <comment xml:lang="zh_TW">Kexi 資料庫檔案</comment>
+ <comment xml:lang="zh_CN">Kexi 数据库文件</comment>
<comment xml:lang="uk">файл бази даних Kexi</comment>
- <comment xml:lang="zh-CN">Kexi 数据库文件</comment>
- <comment xml:lang="zh-TW">Kexi 資料庫檔案</comment>
+ <comment xml:lang="tr">Kexi veri tabanı dosyası</comment>
+ <comment xml:lang="sv">Kexi-databasfil</comment>
+ <comment xml:lang="sq">kartelë baze të dhënash Kexi</comment>
+ <comment xml:lang="sl">Datoteka zbirke podatkov Kexi</comment>
+ <comment xml:lang="si">Kexi දත්ත සමුදා ගොනුව</comment>
+ <comment xml:lang="sk">Súbor databázy Kexi</comment>
+ <comment xml:lang="ru">Файл базы данных Kexi</comment>
+ <comment xml:lang="pt_BR">Arquivo de banco de dados do Kexi</comment>
+ <comment xml:lang="pl">Plik bazy danych Kexi</comment>
+ <comment xml:lang="nl">Kexi-databasebestand</comment>
+ <comment xml:lang="ko">Kexi 데이터베이스 파일</comment>
+ <comment xml:lang="kk">Kexi дерекқор файлы</comment>
+ <comment xml:lang="ja">Kexi データベースファイル</comment>
+ <comment xml:lang="it">File database Kexi</comment>
+ <comment xml:lang="is">Kexi gagnagrunnsskrá</comment>
+ <comment xml:lang="id">Berkas basis data Kexi</comment>
+ <comment xml:lang="hu">Kexi adatbázisfájl</comment>
+ <comment xml:lang="hr">Kexi datoteka baze podataka</comment>
+ <comment xml:lang="he">קובץ מסד נתונים של Kexi</comment>
+ <comment xml:lang="gl">Ficheiro de base de datos Kexi</comment>
+ <comment xml:lang="fr">fichier de base de données Kexi</comment>
+ <comment xml:lang="fi">Kexi-tietokanta</comment>
+ <comment xml:lang="eu">Kexi datu-base fitxategia</comment>
+ <comment xml:lang="es">archivo de base de datos de Kexi</comment>
+ <comment xml:lang="en_GB">Kexi database file</comment>
+ <comment xml:lang="de">Kexi-Datenbankdatei</comment>
+ <comment xml:lang="da">Kexi database-fil</comment>
+ <comment xml:lang="ca">fitxer de base de dades de Kexi</comment>
+ <comment xml:lang="bg">База от данни — Kexi</comment>
+ <comment xml:lang="be">база даных Kexi</comment>
+ <comment xml:lang="ar">ملف قاعدة Kexi</comment>
<sub-class-of type="application/x-sqlite2"/>
<glob pattern="*.kexi"/>
</mime-type>
<mime-type type="application/x-kexiproject-sqlite3">
<comment>Kexi database file</comment>
- <comment xml:lang="bg">База от данни — Kexi</comment>
- <comment xml:lang="ca">fitxer de base de dades de Kexi</comment>
- <comment xml:lang="da">Kexi database-fil</comment>
- <comment xml:lang="de">Kexi-Datenbankdatei</comment>
- <comment xml:lang="en-GB">Kexi database file</comment>
- <comment xml:lang="es">archivo de base de datos de Kexi</comment>
- <comment xml:lang="eu">Kexi datu-base fitxategia</comment>
- <comment xml:lang="fi">KEXI-tietokanta</comment>
- <comment xml:lang="fr">fichier de base de données Kexi</comment>
- <comment xml:lang="hr">Kexi datoteka baze podataka</comment>
- <comment xml:lang="hu">Kexi adatbázisfájl</comment>
- <comment xml:lang="id">Berkas basis data Kexi</comment>
- <comment xml:lang="it">File database Kexi</comment>
- <comment xml:lang="kk">Kexi дерекқор файлы</comment>
- <comment xml:lang="ko">Kexi 데이터베이스 파일</comment>
- <comment xml:lang="pl">Plik bazy danych Kexi</comment>
- <comment xml:lang="pt-BR">Arquivo de banco de dados do Kexi</comment>
- <comment xml:lang="ru">Файл базы данных Kexi</comment>
- <comment xml:lang="sk">Súbor databázy Kexi</comment>
- <comment xml:lang="sv">Kexi-databasfil</comment>
- <comment xml:lang="tr">Kexi veri tabanı dosyası</comment>
+ <comment xml:lang="zh_TW">Kexi 資料庫檔案</comment>
+ <comment xml:lang="zh_CN">Kexi 数据库文件</comment>
<comment xml:lang="uk">файл бази даних Kexi</comment>
- <comment xml:lang="zh-CN">Kexi 数据库文件</comment>
- <comment xml:lang="zh-TW">Kexi 資料庫檔案</comment>
+ <comment xml:lang="tr">Kexi veri tabanı dosyası</comment>
+ <comment xml:lang="sv">Kexi-databasfil</comment>
+ <comment xml:lang="sq">kartelë baze të dhënash Kexi</comment>
+ <comment xml:lang="sl">Datoteka zbirke podatkov Kexi</comment>
+ <comment xml:lang="si">Kexi දත්ත සමුදා ගොනුව</comment>
+ <comment xml:lang="sk">Súbor databázy Kexi</comment>
+ <comment xml:lang="ru">Файл базы данных Kexi</comment>
+ <comment xml:lang="pt_BR">Arquivo de banco de dados do Kexi</comment>
+ <comment xml:lang="pl">Plik bazy danych Kexi</comment>
+ <comment xml:lang="nl">Kexi-databasebestand</comment>
+ <comment xml:lang="ko">Kexi 데이터베이스 파일</comment>
+ <comment xml:lang="kk">Kexi дерекқор файлы</comment>
+ <comment xml:lang="ja">Kexi データベースファイル</comment>
+ <comment xml:lang="it">File database Kexi</comment>
+ <comment xml:lang="is">Kexi gagnagrunnsskrá</comment>
+ <comment xml:lang="id">Berkas basis data Kexi</comment>
+ <comment xml:lang="hu">Kexi adatbázisfájl</comment>
+ <comment xml:lang="hr">Kexi datoteka baze podataka</comment>
+ <comment xml:lang="he">קובץ מסד נתונים של Kexi</comment>
+ <comment xml:lang="gl">Ficheiro de base de datos Kexi</comment>
+ <comment xml:lang="fr">fichier de base de données Kexi</comment>
+ <comment xml:lang="fi">Kexi-tietokanta</comment>
+ <comment xml:lang="eu">Kexi datu-base fitxategia</comment>
+ <comment xml:lang="es">archivo de base de datos de Kexi</comment>
+ <comment xml:lang="en_GB">Kexi database file</comment>
+ <comment xml:lang="de">Kexi-Datenbankdatei</comment>
+ <comment xml:lang="da">Kexi database-fil</comment>
+ <comment xml:lang="ca">fitxer de base de dades de Kexi</comment>
+ <comment xml:lang="bg">База от данни — Kexi</comment>
+ <comment xml:lang="be">база даных Kexi</comment>
+ <comment xml:lang="ar">ملف قاعدة Kexi</comment>
<sub-class-of type="application/vnd.sqlite3"/>
<glob pattern="*.kexi"/>
<alias type="application/x-vnd.kde.kexi"/>
@@ -14459,56 +15130,59 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-kformula">
<comment>KFormula formula</comment>
- <comment xml:lang="af">KFormula-formule</comment>
- <comment xml:lang="ar">صيغة KFormula</comment>
- <comment xml:lang="be-Latn">Formuła KFormula</comment>
- <comment xml:lang="bg">Формула — KFormula</comment>
- <comment xml:lang="ca">fórmula de KFormula</comment>
- <comment xml:lang="cs">vzorec KFormula</comment>
- <comment xml:lang="da">KFormula-formel</comment>
- <comment xml:lang="de">KFormula-Formel</comment>
- <comment xml:lang="el">Μαθηματικός τύπος KFormula</comment>
- <comment xml:lang="en-GB">KFormula formula</comment>
- <comment xml:lang="eo">KFormula-formulo</comment>
- <comment xml:lang="es">fórmula de KFormula</comment>
- <comment xml:lang="eu">KFormula formula</comment>
- <comment xml:lang="fi">KFormula-kaava</comment>
- <comment xml:lang="fo">KFormula frymil</comment>
- <comment xml:lang="fr">formule KFormula</comment>
- <comment xml:lang="fur">formule KFormula</comment>
- <comment xml:lang="ga">foirmle KFormula</comment>
- <comment xml:lang="gl">fórmula de KFormula</comment>
- <comment xml:lang="he">נוסחת KFormula</comment>
- <comment xml:lang="hr">KFormula formula</comment>
- <comment xml:lang="hu">KFormula-képlet</comment>
- <comment xml:lang="ia">Formula KFormula</comment>
- <comment xml:lang="id">Formula KFormula</comment>
- <comment xml:lang="it">Formula KFormula</comment>
- <comment xml:lang="ja">KFormula 計算式</comment>
- <comment xml:lang="kk">KFormula формуласы</comment>
- <comment xml:lang="ko">KFormula 수식</comment>
- <comment xml:lang="lt">KFormula formulė</comment>
- <comment xml:lang="lv">KFormula formula</comment>
- <comment xml:lang="ms">Formula KFormula</comment>
- <comment xml:lang="nb">KFormula-formel</comment>
- <comment xml:lang="nl">KFormula-formule</comment>
- <comment xml:lang="nn">KFormula-formel</comment>
- <comment xml:lang="oc">formula KFormula</comment>
- <comment xml:lang="pl">Formuła KFormula</comment>
- <comment xml:lang="pt">fórmula KFormula</comment>
- <comment xml:lang="pt-BR">Fórmula do KFormula</comment>
- <comment xml:lang="ro">Formulă KFormula</comment>
- <comment xml:lang="ru">Формула KFormula</comment>
- <comment xml:lang="sk">Vzorec KFormula</comment>
- <comment xml:lang="sl">Datoteka formule KFormula</comment>
- <comment xml:lang="sq">Formulë KFormula</comment>
- <comment xml:lang="sr">формула К-формуле</comment>
- <comment xml:lang="sv">KFormula-formel</comment>
- <comment xml:lang="tr">KFormula formülü</comment>
- <comment xml:lang="uk">формула KFormula</comment>
+ <comment xml:lang="zh_TW">KFormula 公式</comment>
+ <comment xml:lang="zh_CN">KFormula 公式</comment>
<comment xml:lang="vi">Công thức KFormula</comment>
- <comment xml:lang="zh-CN">KFormula 公式</comment>
- <comment xml:lang="zh-TW">KFormula 公式</comment>
+ <comment xml:lang="uk">формула KFormula</comment>
+ <comment xml:lang="tr">KFormula formülü</comment>
+ <comment xml:lang="sv">KFormula-formel</comment>
+ <comment xml:lang="sr">формула К-формуле</comment>
+ <comment xml:lang="sq">formulë KFormula</comment>
+ <comment xml:lang="sl">Datoteka formule KFormula</comment>
+ <comment xml:lang="si">KFormula සූත්‍රය</comment>
+ <comment xml:lang="sk">Vzorec KFormula</comment>
+ <comment xml:lang="ru">Формула KFormula</comment>
+ <comment xml:lang="ro">Formulă KFormula</comment>
+ <comment xml:lang="pt_BR">Fórmula do KFormula</comment>
+ <comment xml:lang="pt">fórmula KFormula</comment>
+ <comment xml:lang="pl">Formuła KFormula</comment>
+ <comment xml:lang="oc">formula KFormula</comment>
+ <comment xml:lang="nn">KFormula-formel</comment>
+ <comment xml:lang="nl">KFormula-formule</comment>
+ <comment xml:lang="nb">KFormula-formel</comment>
+ <comment xml:lang="ms">Formula KFormula</comment>
+ <comment xml:lang="lv">KFormula formula</comment>
+ <comment xml:lang="lt">KFormula formulė</comment>
+ <comment xml:lang="ko">KFormula 수식</comment>
+ <comment xml:lang="kk">KFormula формуласы</comment>
+ <comment xml:lang="ja">KFormula 計算式</comment>
+ <comment xml:lang="it">Formula KFormula</comment>
+ <comment xml:lang="is">KFormula formúla</comment>
+ <comment xml:lang="id">Formula KFormula</comment>
+ <comment xml:lang="ia">Formula KFormula</comment>
+ <comment xml:lang="hu">KFormula-képlet</comment>
+ <comment xml:lang="hr">KFormula formula</comment>
+ <comment xml:lang="he">נוסחת KFormula</comment>
+ <comment xml:lang="gl">fórmula de KFormula</comment>
+ <comment xml:lang="ga">foirmle KFormula</comment>
+ <comment xml:lang="fur">formule KFormula</comment>
+ <comment xml:lang="fr">formule KFormula</comment>
+ <comment xml:lang="fo">KFormula frymil</comment>
+ <comment xml:lang="fi">KFormula-kaava</comment>
+ <comment xml:lang="eu">KFormula formula</comment>
+ <comment xml:lang="es">fórmula de KFormula</comment>
+ <comment xml:lang="eo">KFormula-formulo</comment>
+ <comment xml:lang="en_GB">KFormula formula</comment>
+ <comment xml:lang="el">Μαθηματικός τύπος KFormula</comment>
+ <comment xml:lang="de">KFormula-Formel</comment>
+ <comment xml:lang="da">KFormula-formel</comment>
+ <comment xml:lang="cs">vzorec KFormula</comment>
+ <comment xml:lang="ca">fórmula de KFormula</comment>
+ <comment xml:lang="bg">Формула — KFormula</comment>
+ <comment xml:lang="be@latin">Formuła KFormula</comment>
+ <comment xml:lang="be">формула KFormula</comment>
+ <comment xml:lang="ar">صيغة KFormula</comment>
+ <comment xml:lang="af">KFormula-formule</comment>
<generic-icon name="x-office-document"/>
<magic priority="60">
<match type="string" value="\037\213" offset="0">
@@ -14526,56 +15200,59 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-killustrator">
<comment>KIllustrator drawing</comment>
- <comment xml:lang="af">KIllustrator-tekening</comment>
- <comment xml:lang="ar">تصميم KIllustrator</comment>
- <comment xml:lang="be-Latn">Rysunak KIllustrator</comment>
- <comment xml:lang="bg">Чертеж — KIllustrator</comment>
- <comment xml:lang="ca">dibuix de KIllustrator</comment>
- <comment xml:lang="cs">kresba KIllustrator</comment>
- <comment xml:lang="da">KIllustrator-tegning</comment>
- <comment xml:lang="de">KIllustrator-Zeichnung</comment>
- <comment xml:lang="el">Σχέδιο KIllustrator</comment>
- <comment xml:lang="en-GB">KIllustrator drawing</comment>
- <comment xml:lang="eo">KIllustrator-grafikaĵo</comment>
- <comment xml:lang="es">dibujo de KIllustrator</comment>
- <comment xml:lang="eu">KIllustrator marrazkia</comment>
- <comment xml:lang="fi">KIllustrator-piirros</comment>
- <comment xml:lang="fo">KIllustrator tekning</comment>
- <comment xml:lang="fr">dessin KIllustrator</comment>
- <comment xml:lang="fur">dissen KIllustrator</comment>
- <comment xml:lang="ga">líníocht KIllustrator</comment>
- <comment xml:lang="gl">debuxo de KIllustrator</comment>
- <comment xml:lang="he">ציור KIllustrator</comment>
- <comment xml:lang="hr">KIllustrator crtež</comment>
- <comment xml:lang="hu">KIllustrator-rajz</comment>
- <comment xml:lang="ia">Designo KIllustrator</comment>
- <comment xml:lang="id">Gambar KIllustrator</comment>
- <comment xml:lang="it">Disegno KIllustrator</comment>
- <comment xml:lang="ja">KIllustrator ドロー</comment>
- <comment xml:lang="kk">KIllustrator суреті</comment>
- <comment xml:lang="ko">KIllustrator 그림</comment>
- <comment xml:lang="lt">KIllustrator piešinys</comment>
- <comment xml:lang="lv">KIllustrator zīmējums</comment>
- <comment xml:lang="ms">Lukisan KIllustrator</comment>
- <comment xml:lang="nb">KIllustrator-tegning</comment>
- <comment xml:lang="nl">KIllustrator-tekening</comment>
- <comment xml:lang="nn">KIllustrator-teikning</comment>
- <comment xml:lang="oc">dessenh KIllustrator</comment>
- <comment xml:lang="pl">Rysunek KIllustrator</comment>
- <comment xml:lang="pt">desenho KIllustrator</comment>
- <comment xml:lang="pt-BR">Desenho do KIllustrator</comment>
- <comment xml:lang="ro">Desen KIllustrator</comment>
- <comment xml:lang="ru">Рисунок KIllustrator</comment>
- <comment xml:lang="sk">Kresba KIllustrator</comment>
- <comment xml:lang="sl">Datoteka risbe KIllustrator</comment>
- <comment xml:lang="sq">Vizatim KIllustrator</comment>
- <comment xml:lang="sr">цртеж К-илустратора</comment>
- <comment xml:lang="sv">KIllustrator-teckning</comment>
- <comment xml:lang="tr">KIllustrator çizimi</comment>
- <comment xml:lang="uk">малюнок KIllustrator</comment>
+ <comment xml:lang="zh_TW">KIllustrator 繪圖</comment>
+ <comment xml:lang="zh_CN">KIllustrator 绘图</comment>
<comment xml:lang="vi">Bản vẽ KIllustrator</comment>
- <comment xml:lang="zh-CN">KIllustrator 绘图</comment>
- <comment xml:lang="zh-TW">KIllustrator 繪圖</comment>
+ <comment xml:lang="uk">малюнок KIllustrator</comment>
+ <comment xml:lang="tr">KIllustrator çizimi</comment>
+ <comment xml:lang="sv">KIllustrator-teckning</comment>
+ <comment xml:lang="sr">цртеж К-илустратора</comment>
+ <comment xml:lang="sq">vizatim KIllustrator</comment>
+ <comment xml:lang="sl">Datoteka risbe KIllustrator</comment>
+ <comment xml:lang="si">කිලිස්ට්රේටර් ඇඳීම</comment>
+ <comment xml:lang="sk">Kresba KIllustrator</comment>
+ <comment xml:lang="ru">Рисунок KIllustrator</comment>
+ <comment xml:lang="ro">Desen KIllustrator</comment>
+ <comment xml:lang="pt_BR">Desenho do KIllustrator</comment>
+ <comment xml:lang="pt">desenho KIllustrator</comment>
+ <comment xml:lang="pl">Rysunek KIllustrator</comment>
+ <comment xml:lang="oc">dessenh KIllustrator</comment>
+ <comment xml:lang="nn">KIllustrator-teikning</comment>
+ <comment xml:lang="nl">KIllustrator-tekening</comment>
+ <comment xml:lang="nb">KIllustrator-tegning</comment>
+ <comment xml:lang="ms">Lukisan KIllustrator</comment>
+ <comment xml:lang="lv">KIllustrator zīmējums</comment>
+ <comment xml:lang="lt">KIllustrator piešinys</comment>
+ <comment xml:lang="ko">KIllustrator 그림</comment>
+ <comment xml:lang="kk">KIllustrator суреті</comment>
+ <comment xml:lang="ja">KIllustrator ドロー</comment>
+ <comment xml:lang="it">Disegno KIllustrator</comment>
+ <comment xml:lang="is">KIllustrator teikning</comment>
+ <comment xml:lang="id">Gambar KIllustrator</comment>
+ <comment xml:lang="ia">Designo KIllustrator</comment>
+ <comment xml:lang="hu">KIllustrator-rajz</comment>
+ <comment xml:lang="hr">KIllustrator crtež</comment>
+ <comment xml:lang="he">ציור KIllustrator</comment>
+ <comment xml:lang="gl">debuxo de KIllustrator</comment>
+ <comment xml:lang="ga">líníocht KIllustrator</comment>
+ <comment xml:lang="fur">dissen KIllustrator</comment>
+ <comment xml:lang="fr">dessin KIllustrator</comment>
+ <comment xml:lang="fo">KIllustrator tekning</comment>
+ <comment xml:lang="fi">KIllustrator-piirros</comment>
+ <comment xml:lang="eu">KIllustrator marrazkia</comment>
+ <comment xml:lang="es">dibujo de KIllustrator</comment>
+ <comment xml:lang="eo">KIllustrator-grafikaĵo</comment>
+ <comment xml:lang="en_GB">KIllustrator drawing</comment>
+ <comment xml:lang="el">Σχέδιο KIllustrator</comment>
+ <comment xml:lang="de">KIllustrator-Zeichnung</comment>
+ <comment xml:lang="da">KIllustrator-tegning</comment>
+ <comment xml:lang="cs">kresba KIllustrator</comment>
+ <comment xml:lang="ca">dibuix de KIllustrator</comment>
+ <comment xml:lang="bg">Чертеж — KIllustrator</comment>
+ <comment xml:lang="be@latin">Rysunak KIllustrator</comment>
+ <comment xml:lang="be">рысунак KIllustrator</comment>
+ <comment xml:lang="ar">تصميم KIllustrator</comment>
+ <comment xml:lang="af">KIllustrator-tekening</comment>
<generic-icon name="image-x-generic"/>
<magic priority="60">
<match type="string" value="\037\213" offset="0">
@@ -14588,56 +15265,59 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-kivio">
<comment>Kivio flowchart</comment>
- <comment xml:lang="af">Kivio-vloeidiagram</comment>
- <comment xml:lang="ar">قائمة تدفق Kivio</comment>
- <comment xml:lang="be-Latn">Blok-schiema Kivio</comment>
- <comment xml:lang="bg">Диаграма — Kivio</comment>
- <comment xml:lang="ca">diagrama de flux de Kivio</comment>
- <comment xml:lang="cs">vývojový diagram Kivio</comment>
- <comment xml:lang="da">Kiviorutediagram</comment>
- <comment xml:lang="de">Kivio-Flussdiagramm</comment>
- <comment xml:lang="el">Διάγραμμα ροής Kivio</comment>
- <comment xml:lang="en-GB">Kivio flowchart</comment>
- <comment xml:lang="eo">Kivo-fluskemo</comment>
- <comment xml:lang="es">diagrama de flujo de Kivio</comment>
- <comment xml:lang="eu">Kivio diagrama</comment>
- <comment xml:lang="fi">Kivio-vuokaavio</comment>
- <comment xml:lang="fo">Kivio leiðarit</comment>
- <comment xml:lang="fr">diagramme de flux Kivio</comment>
- <comment xml:lang="fur">diagram di flus Kivio</comment>
- <comment xml:lang="ga">sreabhchairt Kivio</comment>
- <comment xml:lang="gl">gráfica de fluxo de Kivio</comment>
- <comment xml:lang="he">תרשים זרימה של Kivio</comment>
- <comment xml:lang="hr">Kivio dijagram toka</comment>
- <comment xml:lang="hu">Kivio-folyamatábra</comment>
- <comment xml:lang="ia">Diagramma de fluxo Kivio</comment>
- <comment xml:lang="id">Bagan Kivio</comment>
- <comment xml:lang="it">Diagramma di flusso Kivio</comment>
- <comment xml:lang="ja">Kivio フローチャート</comment>
- <comment xml:lang="kk">Kivio диаграммасы</comment>
- <comment xml:lang="ko">Kivio 순서도</comment>
- <comment xml:lang="lt">Kivio eigos diagrama</comment>
- <comment xml:lang="lv">Kivio blokshēma</comment>
- <comment xml:lang="ms">Cartalir Kivio</comment>
- <comment xml:lang="nb">Kivio-flytdiagram</comment>
- <comment xml:lang="nl">Kivio-stroomschema</comment>
- <comment xml:lang="nn">Kivio-flytdiagram</comment>
- <comment xml:lang="oc">diagrama de flux Kivio</comment>
- <comment xml:lang="pl">Diagram przepływów Kivio</comment>
- <comment xml:lang="pt">gráfico de fluxo Kivio</comment>
- <comment xml:lang="pt-BR">Fluxograma do Kivio</comment>
- <comment xml:lang="ro">Diagramă Kivio</comment>
- <comment xml:lang="ru">Диаграмма Kivio</comment>
- <comment xml:lang="sk">Vývojový diagram Kivio</comment>
- <comment xml:lang="sl">Datoteka grafikona Kivio</comment>
- <comment xml:lang="sq">Diagramë fluksi Kivio</comment>
- <comment xml:lang="sr">Кивиов дијаграм тока</comment>
- <comment xml:lang="sv">Kivio-flödesschema</comment>
- <comment xml:lang="tr">Kivio akış çizgesi</comment>
- <comment xml:lang="uk">блок-схема Kivio</comment>
+ <comment xml:lang="zh_TW">Kivio 流程圖</comment>
+ <comment xml:lang="zh_CN">Kivio 流程图</comment>
<comment xml:lang="vi">Lược đồ Kivio</comment>
- <comment xml:lang="zh-CN">Kivio 流程图</comment>
- <comment xml:lang="zh-TW">Kivio 流程圖</comment>
+ <comment xml:lang="uk">блок-схема Kivio</comment>
+ <comment xml:lang="tr">Kivio akış çizgesi</comment>
+ <comment xml:lang="sv">Kivio-flödesschema</comment>
+ <comment xml:lang="sr">Кивиов дијаграм тока</comment>
+ <comment xml:lang="sq">diagram hapash Kivio</comment>
+ <comment xml:lang="sl">Datoteka grafikona Kivio</comment>
+ <comment xml:lang="si">කිවියෝ ගැලීම් සටහන</comment>
+ <comment xml:lang="sk">Vývojový diagram Kivio</comment>
+ <comment xml:lang="ru">Диаграмма Kivio</comment>
+ <comment xml:lang="ro">Diagramă Kivio</comment>
+ <comment xml:lang="pt_BR">Fluxograma do Kivio</comment>
+ <comment xml:lang="pt">gráfico de fluxo Kivio</comment>
+ <comment xml:lang="pl">Diagram przepływów Kivio</comment>
+ <comment xml:lang="oc">diagrama de flux Kivio</comment>
+ <comment xml:lang="nn">Kivio-flytdiagram</comment>
+ <comment xml:lang="nl">Kivio-stroomschema</comment>
+ <comment xml:lang="nb">Kivio-flytdiagram</comment>
+ <comment xml:lang="ms">Cartalir Kivio</comment>
+ <comment xml:lang="lv">Kivio blokshēma</comment>
+ <comment xml:lang="lt">Kivio eigos diagrama</comment>
+ <comment xml:lang="ko">Kivio 순서도</comment>
+ <comment xml:lang="kk">Kivio диаграммасы</comment>
+ <comment xml:lang="ja">Kivio フローチャート</comment>
+ <comment xml:lang="it">Diagramma di flusso Kivio</comment>
+ <comment xml:lang="is">Kivio flæðirit</comment>
+ <comment xml:lang="id">Bagan Kivio</comment>
+ <comment xml:lang="ia">Diagramma de fluxo Kivio</comment>
+ <comment xml:lang="hu">Kivio-folyamatábra</comment>
+ <comment xml:lang="hr">Kivio dijagram toka</comment>
+ <comment xml:lang="he">תרשים זרימה של Kivio</comment>
+ <comment xml:lang="gl">gráfica de fluxo de Kivio</comment>
+ <comment xml:lang="ga">sreabhchairt Kivio</comment>
+ <comment xml:lang="fur">diagram di flus Kivio</comment>
+ <comment xml:lang="fr">diagramme de flux Kivio</comment>
+ <comment xml:lang="fo">Kivio leiðarit</comment>
+ <comment xml:lang="fi">Kivio-vuokaavio</comment>
+ <comment xml:lang="eu">Kivio diagrama</comment>
+ <comment xml:lang="es">diagrama de flujo de Kivio</comment>
+ <comment xml:lang="eo">Kivo-fluskemo</comment>
+ <comment xml:lang="en_GB">Kivio flowchart</comment>
+ <comment xml:lang="el">Διάγραμμα ροής Kivio</comment>
+ <comment xml:lang="de">Kivio-Flussdiagramm</comment>
+ <comment xml:lang="da">Kiviorutediagram</comment>
+ <comment xml:lang="cs">vývojový diagram Kivio</comment>
+ <comment xml:lang="ca">diagrama de flux de Kivio</comment>
+ <comment xml:lang="bg">Диаграма — Kivio</comment>
+ <comment xml:lang="be@latin">Blok-schiema Kivio</comment>
+ <comment xml:lang="be">блок-схема Kivio</comment>
+ <comment xml:lang="ar">قائمة تدفق Kivio</comment>
+ <comment xml:lang="af">Kivio-vloeidiagram</comment>
<generic-icon name="x-office-document"/>
<magic priority="60">
<match type="string" value="\037\213" offset="0">
@@ -14655,56 +15335,59 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-kontour">
<comment>Kontour drawing</comment>
- <comment xml:lang="af">Kontour-tekening</comment>
- <comment xml:lang="ar">تصميم Kontour</comment>
- <comment xml:lang="be-Latn">Rysunak Kontour</comment>
- <comment xml:lang="bg">Чертеж — Kontour</comment>
- <comment xml:lang="ca">dibuix de Kontour</comment>
- <comment xml:lang="cs">kresba Kontour</comment>
- <comment xml:lang="da">Kontourtegning</comment>
- <comment xml:lang="de">Kontour-Zeichnung</comment>
- <comment xml:lang="el">Σχέδιο Kontour</comment>
- <comment xml:lang="en-GB">Kontour drawing</comment>
- <comment xml:lang="eo">Kontour-grafikaĵo</comment>
- <comment xml:lang="es">dibujo de Kontour</comment>
- <comment xml:lang="eu">Kontour marrazkia</comment>
- <comment xml:lang="fi">Kontour-piirros</comment>
- <comment xml:lang="fo">Kontour tekning</comment>
- <comment xml:lang="fr">dessin Kontour</comment>
- <comment xml:lang="fur">dissen Kontour</comment>
- <comment xml:lang="ga">líníocht Kontour</comment>
- <comment xml:lang="gl">debuxo de Kontour</comment>
- <comment xml:lang="he">ציור Kontour</comment>
- <comment xml:lang="hr">Kontour crtež</comment>
- <comment xml:lang="hu">Kontour-rajz</comment>
- <comment xml:lang="ia">Designo Kontour</comment>
- <comment xml:lang="id">Gambar Kontour</comment>
- <comment xml:lang="it">Disegno Kontour</comment>
- <comment xml:lang="ja">Kontour ドロー</comment>
- <comment xml:lang="kk">Kontour суреті</comment>
- <comment xml:lang="ko">Kontour 그림</comment>
- <comment xml:lang="lt">Kontour piešinys</comment>
- <comment xml:lang="lv">Kontour zīmējums</comment>
- <comment xml:lang="ms">Lukisan Kontour</comment>
- <comment xml:lang="nb">Kontour-tegning</comment>
- <comment xml:lang="nl">Kontour-tekening</comment>
- <comment xml:lang="nn">Kontour-teikning</comment>
- <comment xml:lang="oc">dessenh Kontour</comment>
- <comment xml:lang="pl">Rysunek Kontour</comment>
- <comment xml:lang="pt">desenho Kontour</comment>
- <comment xml:lang="pt-BR">Desenho do Kontour</comment>
- <comment xml:lang="ro">Desen Kontour</comment>
- <comment xml:lang="ru">Рисунок Kontour</comment>
- <comment xml:lang="sk">Kresba Kontour</comment>
- <comment xml:lang="sl">Datoteka risbe Kontour</comment>
- <comment xml:lang="sq">Vizatim Kontour</comment>
- <comment xml:lang="sr">Контуров цртеж</comment>
- <comment xml:lang="sv">Kontour-teckning</comment>
- <comment xml:lang="tr">Kontour çizimi</comment>
- <comment xml:lang="uk">малюнок Kontour</comment>
+ <comment xml:lang="zh_TW">Kontour 繪圖</comment>
+ <comment xml:lang="zh_CN">Kontour 绘图</comment>
<comment xml:lang="vi">Bản vẽ Kontour</comment>
- <comment xml:lang="zh-CN">Kontour 绘图</comment>
- <comment xml:lang="zh-TW">Kontour 繪圖</comment>
+ <comment xml:lang="uk">малюнок Kontour</comment>
+ <comment xml:lang="tr">Kontour çizimi</comment>
+ <comment xml:lang="sv">Kontour-teckning</comment>
+ <comment xml:lang="sr">Контуров цртеж</comment>
+ <comment xml:lang="sq">vizatim Kontour</comment>
+ <comment xml:lang="sl">Datoteka risbe Kontour</comment>
+ <comment xml:lang="si">කොන්ටූර් ඇඳීම</comment>
+ <comment xml:lang="sk">Kresba Kontour</comment>
+ <comment xml:lang="ru">Рисунок Kontour</comment>
+ <comment xml:lang="ro">Desen Kontour</comment>
+ <comment xml:lang="pt_BR">Desenho do Kontour</comment>
+ <comment xml:lang="pt">desenho Kontour</comment>
+ <comment xml:lang="pl">Rysunek Kontour</comment>
+ <comment xml:lang="oc">dessenh Kontour</comment>
+ <comment xml:lang="nn">Kontour-teikning</comment>
+ <comment xml:lang="nl">Kontour-tekening</comment>
+ <comment xml:lang="nb">Kontour-tegning</comment>
+ <comment xml:lang="ms">Lukisan Kontour</comment>
+ <comment xml:lang="lv">Kontour zīmējums</comment>
+ <comment xml:lang="lt">Kontour piešinys</comment>
+ <comment xml:lang="ko">Kontour 그림</comment>
+ <comment xml:lang="kk">Kontour суреті</comment>
+ <comment xml:lang="ja">Kontour ドロー</comment>
+ <comment xml:lang="it">Disegno Kontour</comment>
+ <comment xml:lang="is">Kontour teikning</comment>
+ <comment xml:lang="id">Gambar Kontour</comment>
+ <comment xml:lang="ia">Designo Kontour</comment>
+ <comment xml:lang="hu">Kontour-rajz</comment>
+ <comment xml:lang="hr">Kontour crtež</comment>
+ <comment xml:lang="he">ציור Kontour</comment>
+ <comment xml:lang="gl">debuxo de Kontour</comment>
+ <comment xml:lang="ga">líníocht Kontour</comment>
+ <comment xml:lang="fur">dissen Kontour</comment>
+ <comment xml:lang="fr">dessin Kontour</comment>
+ <comment xml:lang="fo">Kontour tekning</comment>
+ <comment xml:lang="fi">Kontour-piirros</comment>
+ <comment xml:lang="eu">Kontour marrazkia</comment>
+ <comment xml:lang="es">dibujo de Kontour</comment>
+ <comment xml:lang="eo">Kontour-grafikaĵo</comment>
+ <comment xml:lang="en_GB">Kontour drawing</comment>
+ <comment xml:lang="el">Σχέδιο Kontour</comment>
+ <comment xml:lang="de">Kontour-Zeichnung</comment>
+ <comment xml:lang="da">Kontourtegning</comment>
+ <comment xml:lang="cs">kresba Kontour</comment>
+ <comment xml:lang="ca">dibuix de Kontour</comment>
+ <comment xml:lang="bg">Чертеж — Kontour</comment>
+ <comment xml:lang="be@latin">Rysunak Kontour</comment>
+ <comment xml:lang="be">рысунак Kontour</comment>
+ <comment xml:lang="ar">تصميم Kontour</comment>
+ <comment xml:lang="af">Kontour-tekening</comment>
<generic-icon name="image-x-generic"/>
<magic priority="60">
<match type="string" value="\037\213" offset="0">
@@ -14722,111 +15405,117 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-kpovmodeler">
<comment>KPovModeler scene</comment>
- <comment xml:lang="af">KPovModeler-toneel</comment>
- <comment xml:lang="ar">مشهد KPovModeler</comment>
- <comment xml:lang="be-Latn">Scena KPovModeler</comment>
- <comment xml:lang="bg">Сцена — KPovModeler</comment>
- <comment xml:lang="ca">escena de KPovModeler</comment>
- <comment xml:lang="cs">scéna KPovModeler</comment>
- <comment xml:lang="da">KPovModeler-scene</comment>
- <comment xml:lang="de">KPovModeler-Szene</comment>
- <comment xml:lang="el">Σκηνή KPovModeler</comment>
- <comment xml:lang="en-GB">KPovModeler scene</comment>
- <comment xml:lang="eo">KPovModeler-sceno</comment>
- <comment xml:lang="es">escena de KPovModeler</comment>
- <comment xml:lang="eu">KPovModeler eszena</comment>
- <comment xml:lang="fi">KPovModeler-näkymä</comment>
- <comment xml:lang="fo">KPovModeler leikmynd</comment>
- <comment xml:lang="fr">scène KPovModeler</comment>
- <comment xml:lang="fur">sene KPovModeler</comment>
- <comment xml:lang="ga">radharc KPovModeler</comment>
- <comment xml:lang="gl">escena de KPovModeler</comment>
- <comment xml:lang="he">סצנת KPovModeler</comment>
- <comment xml:lang="hr">KPovModeler scena</comment>
- <comment xml:lang="hu">KPovModeler-jelenet</comment>
- <comment xml:lang="ia">Scena KPovModeler</comment>
- <comment xml:lang="id">Scene KPovModeler</comment>
- <comment xml:lang="it">Scena KPovModeler</comment>
- <comment xml:lang="ja">KPovModeler シーン</comment>
- <comment xml:lang="kk">KPovModeler сахнасы</comment>
- <comment xml:lang="ko">KPovModeler 장면</comment>
- <comment xml:lang="lt">KPovModeler scena</comment>
- <comment xml:lang="lv">KPovModeler aina</comment>
- <comment xml:lang="ms">Babak KPovModeler</comment>
- <comment xml:lang="nb">KPovModeler-scene</comment>
- <comment xml:lang="nl">KPovModeler-scène</comment>
- <comment xml:lang="nn">KPovModeler-scene</comment>
- <comment xml:lang="oc">scène KPovModeler</comment>
- <comment xml:lang="pl">Scena KPovModeler</comment>
- <comment xml:lang="pt">cenário KPovModeler</comment>
- <comment xml:lang="pt-BR">Cena do KPovModeler</comment>
- <comment xml:lang="ro">Scenă KPovModeler</comment>
- <comment xml:lang="ru">Сцена KPovModeler</comment>
- <comment xml:lang="sk">Scéna KPovModeler</comment>
- <comment xml:lang="sl">Datoteka scene KPovModeler</comment>
- <comment xml:lang="sq">Skenë KPovModeler</comment>
- <comment xml:lang="sr">сцена КПов Моделера</comment>
- <comment xml:lang="sv">KPovModeler-scen</comment>
- <comment xml:lang="tr">KPovModeler sahnesi</comment>
- <comment xml:lang="uk">сцена KPovModeler</comment>
+ <comment xml:lang="zh_TW">KPovModeler 場景</comment>
+ <comment xml:lang="zh_CN">KPovModeler 场景</comment>
<comment xml:lang="vi">Cảnh KPovModeler</comment>
- <comment xml:lang="zh-CN">KPovModeler 场景</comment>
- <comment xml:lang="zh-TW">KPovModeler 場景</comment>
+ <comment xml:lang="uk">сцена KPovModeler</comment>
+ <comment xml:lang="tr">KPovModeler sahnesi</comment>
+ <comment xml:lang="sv">KPovModeler-scen</comment>
+ <comment xml:lang="sr">сцена КПов Моделера</comment>
+ <comment xml:lang="sq">skenë KPovModeler</comment>
+ <comment xml:lang="sl">Datoteka scene KPovModeler</comment>
+ <comment xml:lang="si">KPovModeler දර්ශනය</comment>
+ <comment xml:lang="sk">Scéna KPovModeler</comment>
+ <comment xml:lang="ru">Сцена KPovModeler</comment>
+ <comment xml:lang="ro">Scenă KPovModeler</comment>
+ <comment xml:lang="pt_BR">Cena do KPovModeler</comment>
+ <comment xml:lang="pt">cenário KPovModeler</comment>
+ <comment xml:lang="pl">Scena KPovModeler</comment>
+ <comment xml:lang="oc">scène KPovModeler</comment>
+ <comment xml:lang="nn">KPovModeler-scene</comment>
+ <comment xml:lang="nl">KPovModeler-scène</comment>
+ <comment xml:lang="nb">KPovModeler-scene</comment>
+ <comment xml:lang="ms">Babak KPovModeler</comment>
+ <comment xml:lang="lv">KPovModeler aina</comment>
+ <comment xml:lang="lt">KPovModeler scena</comment>
+ <comment xml:lang="ko">KPovModeler 장면</comment>
+ <comment xml:lang="kk">KPovModeler сахнасы</comment>
+ <comment xml:lang="ja">KPovModeler シーン</comment>
+ <comment xml:lang="it">Scena KPovModeler</comment>
+ <comment xml:lang="is">KPovModeler sviðsmynd</comment>
+ <comment xml:lang="id">Scene KPovModeler</comment>
+ <comment xml:lang="ia">Scena KPovModeler</comment>
+ <comment xml:lang="hu">KPovModeler-jelenet</comment>
+ <comment xml:lang="hr">KPovModeler scena</comment>
+ <comment xml:lang="he">סצנת KPovModeler</comment>
+ <comment xml:lang="gl">escena de KPovModeler</comment>
+ <comment xml:lang="ga">radharc KPovModeler</comment>
+ <comment xml:lang="fur">sene KPovModeler</comment>
+ <comment xml:lang="fr">scène KPovModeler</comment>
+ <comment xml:lang="fo">KPovModeler leikmynd</comment>
+ <comment xml:lang="fi">KPovModeler-näkymä</comment>
+ <comment xml:lang="eu">KPovModeler eszena</comment>
+ <comment xml:lang="es">escena de KPovModeler</comment>
+ <comment xml:lang="eo">KPovModeler-sceno</comment>
+ <comment xml:lang="en_GB">KPovModeler scene</comment>
+ <comment xml:lang="el">Σκηνή KPovModeler</comment>
+ <comment xml:lang="de">KPovModeler-Szene</comment>
+ <comment xml:lang="da">KPovModeler-scene</comment>
+ <comment xml:lang="cs">scéna KPovModeler</comment>
+ <comment xml:lang="ca">escena de KPovModeler</comment>
+ <comment xml:lang="bg">Сцена — KPovModeler</comment>
+ <comment xml:lang="be@latin">Scena KPovModeler</comment>
+ <comment xml:lang="be">сцэна KPovModeler</comment>
+ <comment xml:lang="ar">مشهد KPovModeler</comment>
+ <comment xml:lang="af">KPovModeler-toneel</comment>
<generic-icon name="image-x-generic"/>
<glob pattern="*.kpm"/>
</mime-type>
<mime-type type="application/x-kpresenter">
<comment>KPresenter presentation</comment>
- <comment xml:lang="af">KPresenter-voorlegging</comment>
- <comment xml:lang="ar">عرض تقديمي KPresenter</comment>
- <comment xml:lang="be-Latn">Prezentacyja KPresenter</comment>
- <comment xml:lang="bg">Презентация — KPresenter</comment>
- <comment xml:lang="ca">presentació de KPresenter</comment>
- <comment xml:lang="cs">prezentace KPresenter</comment>
- <comment xml:lang="da">KPresenter-præsentation</comment>
- <comment xml:lang="de">KPresenter-Präsentation</comment>
- <comment xml:lang="el">Παρουσίαση KPresenter</comment>
- <comment xml:lang="en-GB">KPresenter presentation</comment>
- <comment xml:lang="eo">KPresenter-prezentaĵo</comment>
- <comment xml:lang="es">presentación de KPresenter</comment>
- <comment xml:lang="eu">Kpresenter aurkezpena</comment>
- <comment xml:lang="fi">KPresenter-esitys</comment>
- <comment xml:lang="fo">KPresenter framløga</comment>
- <comment xml:lang="fr">présentation KPresenter</comment>
- <comment xml:lang="fur">presentazion KPresenter</comment>
- <comment xml:lang="ga">láithreoireacht KPresenter</comment>
- <comment xml:lang="gl">presentación de KPresenter</comment>
- <comment xml:lang="he">מצגת KPresenter</comment>
- <comment xml:lang="hr">KPresenter prezentacija</comment>
- <comment xml:lang="hu">KPresenter-bemutató</comment>
- <comment xml:lang="ia">Presentation KPresenter</comment>
- <comment xml:lang="id">Presentasi KPresenter</comment>
- <comment xml:lang="it">Presentazione KPresenter</comment>
- <comment xml:lang="ja">KPresenter プレゼンテーション</comment>
- <comment xml:lang="kk">KPresenter презентациясы</comment>
- <comment xml:lang="ko">KPresenter 프레젠테이션</comment>
- <comment xml:lang="lt">KPresenter pateiktis</comment>
- <comment xml:lang="lv">KPresenter prezentācija</comment>
- <comment xml:lang="ms">Persembahan Kpresenter</comment>
- <comment xml:lang="nb">KPresenter-presentasjon</comment>
- <comment xml:lang="nl">KPresenter-presentatie</comment>
- <comment xml:lang="nn">KPresenter-presentasjon</comment>
- <comment xml:lang="oc">presentacion KPresenter</comment>
- <comment xml:lang="pl">Prezentacja KPresenter</comment>
- <comment xml:lang="pt">apresentação KPresenter</comment>
- <comment xml:lang="pt-BR">Apresentação do KPresenter</comment>
- <comment xml:lang="ro">Prezentare KPresenter</comment>
- <comment xml:lang="ru">Презентация KPresenter</comment>
- <comment xml:lang="sk">Prezentácia KPresenter</comment>
- <comment xml:lang="sl">Predstavitev KPresenter</comment>
- <comment xml:lang="sq">Prezantim i KPresenter</comment>
- <comment xml:lang="sr">презентација К-представљача</comment>
- <comment xml:lang="sv">KPresenter-presentation</comment>
- <comment xml:lang="tr">KPresenter sunum dosyası</comment>
- <comment xml:lang="uk">презентація KPresenter</comment>
+ <comment xml:lang="zh_TW">KPresenter 簡報</comment>
+ <comment xml:lang="zh_CN">KPresenter 演示文稿</comment>
<comment xml:lang="vi">Trình diễn KPresenter</comment>
- <comment xml:lang="zh-CN">KPresenter 演示文稿</comment>
- <comment xml:lang="zh-TW">KPresenter 簡報</comment>
+ <comment xml:lang="uk">презентація KPresenter</comment>
+ <comment xml:lang="tr">KPresenter sunum dosyası</comment>
+ <comment xml:lang="sv">KPresenter-presentation</comment>
+ <comment xml:lang="sr">презентација К-представљача</comment>
+ <comment xml:lang="sq">paraqitje KPresenter</comment>
+ <comment xml:lang="sl">Predstavitev KPresenter</comment>
+ <comment xml:lang="si">KPresenter ඉදිරිපත් කිරීම</comment>
+ <comment xml:lang="sk">Prezentácia KPresenter</comment>
+ <comment xml:lang="ru">Презентация KPresenter</comment>
+ <comment xml:lang="ro">Prezentare KPresenter</comment>
+ <comment xml:lang="pt_BR">Apresentação do KPresenter</comment>
+ <comment xml:lang="pt">apresentação KPresenter</comment>
+ <comment xml:lang="pl">Prezentacja KPresenter</comment>
+ <comment xml:lang="oc">presentacion KPresenter</comment>
+ <comment xml:lang="nn">KPresenter-presentasjon</comment>
+ <comment xml:lang="nl">KPresenter-presentatie</comment>
+ <comment xml:lang="nb">KPresenter-presentasjon</comment>
+ <comment xml:lang="ms">Persembahan Kpresenter</comment>
+ <comment xml:lang="lv">KPresenter prezentācija</comment>
+ <comment xml:lang="lt">KPresenter pateiktis</comment>
+ <comment xml:lang="ko">KPresenter 프레젠테이션</comment>
+ <comment xml:lang="kk">KPresenter презентациясы</comment>
+ <comment xml:lang="ja">KPresenter プレゼンテーション</comment>
+ <comment xml:lang="it">Presentazione KPresenter</comment>
+ <comment xml:lang="is">KPresenter framsetning</comment>
+ <comment xml:lang="id">Presentasi KPresenter</comment>
+ <comment xml:lang="ia">Presentation KPresenter</comment>
+ <comment xml:lang="hu">KPresenter-bemutató</comment>
+ <comment xml:lang="hr">KPresenter prezentacija</comment>
+ <comment xml:lang="he">מצגת KPresenter</comment>
+ <comment xml:lang="gl">presentación de KPresenter</comment>
+ <comment xml:lang="ga">láithreoireacht KPresenter</comment>
+ <comment xml:lang="fur">presentazion KPresenter</comment>
+ <comment xml:lang="fr">présentation KPresenter</comment>
+ <comment xml:lang="fo">KPresenter framløga</comment>
+ <comment xml:lang="fi">KPresenter-esitys</comment>
+ <comment xml:lang="eu">Kpresenter aurkezpena</comment>
+ <comment xml:lang="es">presentación de KPresenter</comment>
+ <comment xml:lang="eo">KPresenter-prezentaĵo</comment>
+ <comment xml:lang="en_GB">KPresenter presentation</comment>
+ <comment xml:lang="el">Παρουσίαση KPresenter</comment>
+ <comment xml:lang="de">KPresenter-Präsentation</comment>
+ <comment xml:lang="da">KPresenter-præsentation</comment>
+ <comment xml:lang="cs">prezentace KPresenter</comment>
+ <comment xml:lang="ca">presentació de KPresenter</comment>
+ <comment xml:lang="bg">Презентация — KPresenter</comment>
+ <comment xml:lang="be@latin">Prezentacyja KPresenter</comment>
+ <comment xml:lang="be">прэзентацыя KPresenter</comment>
+ <comment xml:lang="ar">عرض تقديمي KPresenter</comment>
+ <comment xml:lang="af">KPresenter-voorlegging</comment>
<generic-icon name="x-office-presentation"/>
<magic priority="60">
<match type="string" value="\037\213" offset="0">
@@ -14845,57 +15534,60 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-krita">
<comment>Krita document</comment>
- <comment xml:lang="af">Krita-dokument</comment>
- <comment xml:lang="ar">مستند Krita</comment>
- <comment xml:lang="ast">Documentu de Krita</comment>
- <comment xml:lang="be-Latn">Dakument Krita</comment>
- <comment xml:lang="bg">Документ — Krita</comment>
- <comment xml:lang="ca">document de Krita</comment>
- <comment xml:lang="cs">dokument Krita</comment>
- <comment xml:lang="da">Kritadokument</comment>
- <comment xml:lang="de">Krita-Dokument</comment>
- <comment xml:lang="el">Έγγραφο Krita</comment>
- <comment xml:lang="en-GB">Krita document</comment>
- <comment xml:lang="eo">Krita-dokumento</comment>
- <comment xml:lang="es">documento de Krita</comment>
- <comment xml:lang="eu">Krita dokumentua</comment>
- <comment xml:lang="fi">Krita-asiakirja</comment>
- <comment xml:lang="fo">Krita skjal</comment>
- <comment xml:lang="fr">document Krita</comment>
- <comment xml:lang="fur">document Krita</comment>
- <comment xml:lang="ga">cáipéis Krita</comment>
- <comment xml:lang="gl">documento de Krita</comment>
- <comment xml:lang="he">מסמך Krita</comment>
- <comment xml:lang="hr">Krita dokument</comment>
- <comment xml:lang="hu">Krita-dokumentum</comment>
- <comment xml:lang="ia">Documento Krita</comment>
- <comment xml:lang="id">Dokumen Krita</comment>
- <comment xml:lang="it">Documento Krita</comment>
- <comment xml:lang="ja">Krita ドキュメント</comment>
- <comment xml:lang="kk">Krita құжаты</comment>
- <comment xml:lang="ko">Krita 문서</comment>
- <comment xml:lang="lt">Krita dokumentas</comment>
- <comment xml:lang="lv">Krita dokuments</comment>
- <comment xml:lang="ms">Dokumen Krita</comment>
- <comment xml:lang="nb">Krita-dokument</comment>
- <comment xml:lang="nl">Krita-document</comment>
- <comment xml:lang="nn">Krita-dokument</comment>
- <comment xml:lang="oc">document Krita</comment>
- <comment xml:lang="pl">Dokument Krita</comment>
- <comment xml:lang="pt">documento Krita</comment>
- <comment xml:lang="pt-BR">Documento do Krita</comment>
- <comment xml:lang="ro">Document Krita</comment>
- <comment xml:lang="ru">Документ Krita</comment>
- <comment xml:lang="sk">Dokument Krita</comment>
- <comment xml:lang="sl">Dokument Krita</comment>
- <comment xml:lang="sq">Dokument Krita</comment>
- <comment xml:lang="sr">документ Крите</comment>
- <comment xml:lang="sv">Krita-dokument</comment>
- <comment xml:lang="tr">Krita belgesi</comment>
- <comment xml:lang="uk">документ Krita</comment>
+ <comment xml:lang="zh_TW">Krita 文件</comment>
+ <comment xml:lang="zh_CN">Krita 文档</comment>
<comment xml:lang="vi">Tài liệu Krita</comment>
- <comment xml:lang="zh-CN">Krita 文档</comment>
- <comment xml:lang="zh-TW">Krita 文件</comment>
+ <comment xml:lang="uk">документ Krita</comment>
+ <comment xml:lang="tr">Krita belgesi</comment>
+ <comment xml:lang="sv">Krita-dokument</comment>
+ <comment xml:lang="sr">документ Крите</comment>
+ <comment xml:lang="sq">dokument Krita</comment>
+ <comment xml:lang="sl">Dokument Krita</comment>
+ <comment xml:lang="si">ක්‍රිටා ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument Krita</comment>
+ <comment xml:lang="ru">Документ Krita</comment>
+ <comment xml:lang="ro">Document Krita</comment>
+ <comment xml:lang="pt_BR">Documento do Krita</comment>
+ <comment xml:lang="pt">documento Krita</comment>
+ <comment xml:lang="pl">Dokument Krita</comment>
+ <comment xml:lang="oc">document Krita</comment>
+ <comment xml:lang="nn">Krita-dokument</comment>
+ <comment xml:lang="nl">Krita-document</comment>
+ <comment xml:lang="nb">Krita-dokument</comment>
+ <comment xml:lang="ms">Dokumen Krita</comment>
+ <comment xml:lang="lv">Krita dokuments</comment>
+ <comment xml:lang="lt">Krita dokumentas</comment>
+ <comment xml:lang="ko">Krita 문서</comment>
+ <comment xml:lang="kk">Krita құжаты</comment>
+ <comment xml:lang="ja">Krita ドキュメント</comment>
+ <comment xml:lang="it">Documento Krita</comment>
+ <comment xml:lang="is">Krita skjal</comment>
+ <comment xml:lang="id">Dokumen Krita</comment>
+ <comment xml:lang="ia">Documento Krita</comment>
+ <comment xml:lang="hu">Krita-dokumentum</comment>
+ <comment xml:lang="hr">Krita dokument</comment>
+ <comment xml:lang="he">מסמך Krita</comment>
+ <comment xml:lang="gl">documento de Krita</comment>
+ <comment xml:lang="ga">cáipéis Krita</comment>
+ <comment xml:lang="fur">document Krita</comment>
+ <comment xml:lang="fr">document Krita</comment>
+ <comment xml:lang="fo">Krita skjal</comment>
+ <comment xml:lang="fi">Krita-asiakirja</comment>
+ <comment xml:lang="eu">Krita dokumentua</comment>
+ <comment xml:lang="es">documento de Krita</comment>
+ <comment xml:lang="eo">Krita-dokumento</comment>
+ <comment xml:lang="en_GB">Krita document</comment>
+ <comment xml:lang="el">Έγγραφο Krita</comment>
+ <comment xml:lang="de">Krita-Dokument</comment>
+ <comment xml:lang="da">Kritadokument</comment>
+ <comment xml:lang="cs">dokument Krita</comment>
+ <comment xml:lang="ca">document de Krita</comment>
+ <comment xml:lang="bg">Документ — Krita</comment>
+ <comment xml:lang="be@latin">Dakument Krita</comment>
+ <comment xml:lang="be">дакумент Krita</comment>
+ <comment xml:lang="ast">Documentu de Krita</comment>
+ <comment xml:lang="ar">مستند Krita</comment>
+ <comment xml:lang="af">Krita-dokument</comment>
<generic-icon name="x-office-document"/>
<magic priority="60">
<match type="string" value="\037\213" offset="0">
@@ -14905,64 +15597,71 @@ command to generate the output files.
</match>
<match type="string" value="PK\003\004" offset="0">
<match type="string" value="mimetype" offset="30">
+ <!-- Depending on the zip library and whether a 32 or 64 bits zip file is used, the offset is different. -->
<match type="string" value="application/x-krita" offset="38"/>
+ <match type="string" value="application/x-krita" offset="42"/>
+ <match type="string" value="application/x-krita" offset="63"/>
</match>
</match>
</magic>
<glob pattern="*.kra"/>
+ <glob pattern="*.krz"/>
</mime-type>
<mime-type type="application/x-kspread">
<comment>KSpread spreadsheet</comment>
- <comment xml:lang="af">KSpread-sigblad</comment>
- <comment xml:lang="ar">جدول KSpread</comment>
- <comment xml:lang="be-Latn">Raźlikovy arkuš KSpread</comment>
- <comment xml:lang="bg">Таблица — KSpread</comment>
- <comment xml:lang="ca">full de càlcul de KSpread</comment>
- <comment xml:lang="cs">sešit KSpread</comment>
- <comment xml:lang="da">KSpread-regneark</comment>
- <comment xml:lang="de">KSpread-Tabelle</comment>
- <comment xml:lang="el">Λογιστικό φύλλο KSpread</comment>
- <comment xml:lang="en-GB">KSpread spreadsheet</comment>
- <comment xml:lang="eo">KSpread-kalkultabelo</comment>
- <comment xml:lang="es">hoja de cálculo de KSpread</comment>
- <comment xml:lang="eu">KSpread kalkulu-orria</comment>
- <comment xml:lang="fi">KSpread-taulukko</comment>
- <comment xml:lang="fo">KSpread rokniark</comment>
- <comment xml:lang="fr">feuille de calcul KSpread</comment>
- <comment xml:lang="fur">sfuei di calcul KSpread</comment>
- <comment xml:lang="ga">scarbhileog KSpread</comment>
- <comment xml:lang="gl">folla de cálculo de KSpread</comment>
- <comment xml:lang="he">גליון נתונים של Kspread</comment>
- <comment xml:lang="hr">KSpread proračunska tablica</comment>
- <comment xml:lang="hu">KSpread-munkafüzet</comment>
- <comment xml:lang="ia">Folio de calculo KSpread</comment>
- <comment xml:lang="id">Lembar sebar KSpread</comment>
- <comment xml:lang="it">Foglio di calcolo KSpread</comment>
- <comment xml:lang="ja">KSpread スプレッドシート</comment>
- <comment xml:lang="kk">KSpread электрондық кестесі</comment>
- <comment xml:lang="ko">KSpread 스프레드시트</comment>
- <comment xml:lang="lt">KSpread skaičialentė</comment>
- <comment xml:lang="lv">KSpread izklājlapa</comment>
- <comment xml:lang="ms">Hamparan KSpread</comment>
- <comment xml:lang="nb">KSpread-regneark</comment>
- <comment xml:lang="nl">KSpread-rekenblad</comment>
- <comment xml:lang="nn">KSpread-rekneark</comment>
- <comment xml:lang="oc">fuèlh de calcul KSpread</comment>
- <comment xml:lang="pl">Arkusz KSpread</comment>
- <comment xml:lang="pt">folha de cálculo KSpread</comment>
- <comment xml:lang="pt-BR">Planilha do KSpread</comment>
- <comment xml:lang="ro">Foaie de calcul KSpread</comment>
- <comment xml:lang="ru">Электронная таблица KSpread</comment>
- <comment xml:lang="sk">Zošit KSpread</comment>
- <comment xml:lang="sl">Preglednica KSpread</comment>
- <comment xml:lang="sq">Fletë llogaritjesh KSpread</comment>
- <comment xml:lang="sr">табела К-табеле</comment>
- <comment xml:lang="sv">KSpread-kalkylblad</comment>
- <comment xml:lang="tr">KSpread hesap çizelgesi</comment>
- <comment xml:lang="uk">ел. таблиця KSpread</comment>
+ <comment xml:lang="zh_TW">KSpread 試算表</comment>
+ <comment xml:lang="zh_CN">KSpread 电子表格</comment>
<comment xml:lang="vi">Bảng tính KSpread</comment>
- <comment xml:lang="zh-CN">KSpread 电子表格</comment>
- <comment xml:lang="zh-TW">KSpread 試算表</comment>
+ <comment xml:lang="uk">електронна таблиця KSpread</comment>
+ <comment xml:lang="tr">KSpread hesap çizelgesi</comment>
+ <comment xml:lang="sv">KSpread-kalkylblad</comment>
+ <comment xml:lang="sr">табела К-табеле</comment>
+ <comment xml:lang="sq">fletëllogaritje KSpread</comment>
+ <comment xml:lang="sl">Preglednica KSpread</comment>
+ <comment xml:lang="si">KSpread පැතුරුම්පත</comment>
+ <comment xml:lang="sk">Zošit KSpread</comment>
+ <comment xml:lang="ru">Электронная таблица KSpread</comment>
+ <comment xml:lang="ro">Foaie de calcul KSpread</comment>
+ <comment xml:lang="pt_BR">Planilha do KSpread</comment>
+ <comment xml:lang="pt">folha de cálculo KSpread</comment>
+ <comment xml:lang="pl">Arkusz KSpread</comment>
+ <comment xml:lang="oc">fuèlh de calcul KSpread</comment>
+ <comment xml:lang="nn">KSpread-rekneark</comment>
+ <comment xml:lang="nl">KSpread-rekenblad</comment>
+ <comment xml:lang="nb">KSpread-regneark</comment>
+ <comment xml:lang="ms">Hamparan KSpread</comment>
+ <comment xml:lang="lv">KSpread izklājlapa</comment>
+ <comment xml:lang="lt">KSpread skaičialentė</comment>
+ <comment xml:lang="ko">KSpread 스프레드시트</comment>
+ <comment xml:lang="kk">KSpread электрондық кестесі</comment>
+ <comment xml:lang="ja">KSpread スプレッドシート</comment>
+ <comment xml:lang="it">Foglio di calcolo KSpread</comment>
+ <comment xml:lang="is">KSpread töflureikniskjal</comment>
+ <comment xml:lang="id">Lembar sebar KSpread</comment>
+ <comment xml:lang="ia">Folio de calculo KSpread</comment>
+ <comment xml:lang="hu">KSpread-munkafüzet</comment>
+ <comment xml:lang="hr">KSpread proračunska tablica</comment>
+ <comment xml:lang="he">גיליון נתונים של Kspread</comment>
+ <comment xml:lang="gl">folla de cálculo de KSpread</comment>
+ <comment xml:lang="ga">scarbhileog KSpread</comment>
+ <comment xml:lang="fur">sfuei di calcul KSpread</comment>
+ <comment xml:lang="fr">feuille de calcul KSpread</comment>
+ <comment xml:lang="fo">KSpread rokniark</comment>
+ <comment xml:lang="fi">KSpread-taulukko</comment>
+ <comment xml:lang="eu">KSpread kalkulu-orria</comment>
+ <comment xml:lang="es">hoja de cálculo de KSpread</comment>
+ <comment xml:lang="eo">KSpread-kalkultabelo</comment>
+ <comment xml:lang="en_GB">KSpread spreadsheet</comment>
+ <comment xml:lang="el">Λογιστικό φύλλο KSpread</comment>
+ <comment xml:lang="de">KSpread-Tabelle</comment>
+ <comment xml:lang="da">KSpread-regneark</comment>
+ <comment xml:lang="cs">sešit KSpread</comment>
+ <comment xml:lang="ca">full de càlcul de KSpread</comment>
+ <comment xml:lang="bg">Таблица — KSpread</comment>
+ <comment xml:lang="be@latin">Raźlikovy arkuš KSpread</comment>
+ <comment xml:lang="be">электронная табліца KSpread</comment>
+ <comment xml:lang="ar">جدول KSpread</comment>
+ <comment xml:lang="af">KSpread-sigblad</comment>
<generic-icon name="x-office-spreadsheet"/>
<magic priority="60">
<match type="string" value="\037\213" offset="0">
@@ -14980,112 +15679,118 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-kspread-crypt">
<comment>KSpread spreadsheet (encrypted)</comment>
- <comment xml:lang="af">KSpread-sigblad (geënkripteer)</comment>
- <comment xml:lang="ar">جدول KSpread (مشفر)</comment>
- <comment xml:lang="be-Latn">Raźlikovy arkuš KSpread (zašyfravany)</comment>
- <comment xml:lang="bg">Таблица — KSpread, шифрирана</comment>
- <comment xml:lang="ca">full de càlcul de KSpread (xifrat)</comment>
- <comment xml:lang="cs">sešit KSpread (šifrovaný)</comment>
- <comment xml:lang="da">KSpread-regneark (krypteret)</comment>
- <comment xml:lang="de">KSpread-Tabelle (verschlüsselt)</comment>
- <comment xml:lang="el">Λογιστικό φύλλο KSpread (κρυπτογραφημένο)</comment>
- <comment xml:lang="en-GB">KSpread spreadsheet (encrypted)</comment>
- <comment xml:lang="eo">KSpread-kalkultabelo (ĉifrita)</comment>
- <comment xml:lang="es">hoja de cálculo de KSpread (cifrada)</comment>
- <comment xml:lang="eu">KSpread kalkulu-orria (zifratuta)</comment>
- <comment xml:lang="fi">KSpread-taulukko (salattu)</comment>
- <comment xml:lang="fo">KSpread rokniark (bronglað)</comment>
- <comment xml:lang="fr">feuille de calcul KSpread (chiffrée)</comment>
- <comment xml:lang="fur">sfuei di calcul KSpread (cifrât)</comment>
- <comment xml:lang="ga">scarbhileog KSpread (criptithe)</comment>
- <comment xml:lang="gl">folla de cálculo de KSpread (cifrada)</comment>
- <comment xml:lang="he">גליון נתונים של KSpread (מוצפן)</comment>
- <comment xml:lang="hr">KSpread proračunska tablica (šifrirana)</comment>
- <comment xml:lang="hu">KSpread-munkafüzet (titkosított)</comment>
- <comment xml:lang="ia">Folio de calculo KSpread (cryptate)</comment>
- <comment xml:lang="id">Lembar sebar KSpread (terenkripsi)</comment>
- <comment xml:lang="it">Foglio di calcolo KSpread (cifrato)</comment>
- <comment xml:lang="ja">KSpread (暗号化) スプレッドシート</comment>
- <comment xml:lang="kk">KSpread электрондық кестесі (шифрленген)</comment>
- <comment xml:lang="ko">암호화된 KSpread 스프레드시트</comment>
- <comment xml:lang="lt">KSpread skaičialentė (užšifruota)</comment>
- <comment xml:lang="lv">KSpread izklājlapa (šifrēta)</comment>
- <comment xml:lang="ms">Hampatan KSpread (terenkripsi)</comment>
- <comment xml:lang="nb">KSpread-regneark (kryptert)</comment>
- <comment xml:lang="nl">KSpread-rekenblad (versleuteld)</comment>
- <comment xml:lang="nn">Kryptert KSpread-rekneark</comment>
- <comment xml:lang="oc">fuèlh de calcul KSpread (chifrada)</comment>
- <comment xml:lang="pl">Arkusz KSpread (zaszyfrowany)</comment>
- <comment xml:lang="pt">folha de cálculo KSpread (encriptada)</comment>
- <comment xml:lang="pt-BR">Planilha do KSpread (criptografada)</comment>
- <comment xml:lang="ro">Foaie de calcul KSpread (criptat)</comment>
- <comment xml:lang="ru">Электронная таблица KSpread (зашифрованная)</comment>
- <comment xml:lang="sk">Zošit KSpread (šifrovaný)</comment>
- <comment xml:lang="sl">Preglednica KSpread (šifrirana)</comment>
- <comment xml:lang="sq">Fletë llogaritjesh KSpread (e kriptuar)</comment>
- <comment xml:lang="sr">табела К-табеле (шифрована)</comment>
- <comment xml:lang="sv">KSpread-kalkylblad (krypterat)</comment>
- <comment xml:lang="tr">KSpread hesap çizelgesi (şifreli)</comment>
- <comment xml:lang="uk">ел. таблиця KSpread (зашифрована)</comment>
+ <comment xml:lang="zh_TW">KSpread 試算表 (加密)</comment>
+ <comment xml:lang="zh_CN">KSpread 电子表格(加密)</comment>
<comment xml:lang="vi">Bảng tính KSpread (đã mật mã)</comment>
- <comment xml:lang="zh-CN">KSpread 电子表格(加密)</comment>
- <comment xml:lang="zh-TW">KSpread 試算表 (加密)</comment>
+ <comment xml:lang="uk">електронна таблиця KSpread (зашифрована)</comment>
+ <comment xml:lang="tr">KSpread hesap çizelgesi (şifreli)</comment>
+ <comment xml:lang="sv">KSpread-kalkylblad (krypterat)</comment>
+ <comment xml:lang="sr">табела К-табеле (шифрована)</comment>
+ <comment xml:lang="sq">fletëllogaritje KSpread (e fshehtëzuar)</comment>
+ <comment xml:lang="sl">Preglednica KSpread (šifrirana)</comment>
+ <comment xml:lang="si">KSpread පැතුරුම්පත (සංකේතනය කළ)</comment>
+ <comment xml:lang="sk">Zošit KSpread (šifrovaný)</comment>
+ <comment xml:lang="ru">Электронная таблица KSpread (зашифрованная)</comment>
+ <comment xml:lang="ro">Foaie de calcul KSpread (criptat)</comment>
+ <comment xml:lang="pt_BR">Planilha do KSpread (criptografada)</comment>
+ <comment xml:lang="pt">folha de cálculo KSpread (encriptada)</comment>
+ <comment xml:lang="pl">Arkusz KSpread (zaszyfrowany)</comment>
+ <comment xml:lang="oc">fuèlh de calcul KSpread (chifrada)</comment>
+ <comment xml:lang="nn">Kryptert KSpread-rekneark</comment>
+ <comment xml:lang="nl">KSpread-rekenblad (versleuteld)</comment>
+ <comment xml:lang="nb">KSpread-regneark (kryptert)</comment>
+ <comment xml:lang="ms">Hampatan KSpread (terenkripsi)</comment>
+ <comment xml:lang="lv">KSpread izklājlapa (šifrēta)</comment>
+ <comment xml:lang="lt">KSpread skaičialentė (užšifruota)</comment>
+ <comment xml:lang="ko">암호화된 KSpread 스프레드시트</comment>
+ <comment xml:lang="kk">KSpread электрондық кестесі (шифрленген)</comment>
+ <comment xml:lang="ja">KSpread (暗号化) スプレッドシート</comment>
+ <comment xml:lang="it">Foglio di calcolo KSpread (cifrato)</comment>
+ <comment xml:lang="is">KSpread töflureikniskjal (dulritað)</comment>
+ <comment xml:lang="id">Lembar sebar KSpread (terenkripsi)</comment>
+ <comment xml:lang="ia">Folio de calculo KSpread (cryptate)</comment>
+ <comment xml:lang="hu">KSpread-munkafüzet (titkosított)</comment>
+ <comment xml:lang="hr">KSpread proračunska tablica (šifrirana)</comment>
+ <comment xml:lang="he">גיליון נתונים של KSpread (מוצפן)</comment>
+ <comment xml:lang="gl">folla de cálculo de KSpread (cifrada)</comment>
+ <comment xml:lang="ga">scarbhileog KSpread (criptithe)</comment>
+ <comment xml:lang="fur">sfuei di calcul KSpread (cifrât)</comment>
+ <comment xml:lang="fr">feuille de calcul KSpread (chiffrée)</comment>
+ <comment xml:lang="fo">KSpread rokniark (bronglað)</comment>
+ <comment xml:lang="fi">KSpread-taulukko (salattu)</comment>
+ <comment xml:lang="eu">KSpread kalkulu-orria (zifratuta)</comment>
+ <comment xml:lang="es">hoja de cálculo de KSpread (cifrada)</comment>
+ <comment xml:lang="eo">KSpread-kalkultabelo (ĉifrita)</comment>
+ <comment xml:lang="en_GB">KSpread spreadsheet (encrypted)</comment>
+ <comment xml:lang="el">Λογιστικό φύλλο KSpread (κρυπτογραφημένο)</comment>
+ <comment xml:lang="de">KSpread-Tabelle (verschlüsselt)</comment>
+ <comment xml:lang="da">KSpread-regneark (krypteret)</comment>
+ <comment xml:lang="cs">sešit KSpread (šifrovaný)</comment>
+ <comment xml:lang="ca">full de càlcul de KSpread (xifrat)</comment>
+ <comment xml:lang="bg">Таблица — KSpread, шифрирана</comment>
+ <comment xml:lang="be@latin">Raźlikovy arkuš KSpread (zašyfravany)</comment>
+ <comment xml:lang="be">электронная табліца KSpread (зашыфравана)</comment>
+ <comment xml:lang="ar">جدول KSpread (مشفر)</comment>
+ <comment xml:lang="af">KSpread-sigblad (geënkripteer)</comment>
<generic-icon name="x-office-spreadsheet"/>
- <magic priority="50">
+ <magic>
<match type="big32" value="0x0d1a2702" offset="0"/>
</magic>
</mime-type>
<mime-type type="application/x-ksysv-package">
<comment>KSysV init package</comment>
- <comment xml:lang="ar">حزمة KSysV init</comment>
- <comment xml:lang="be-Latn">Inicyjalny pakunak KSysV</comment>
- <comment xml:lang="bg">Пакет — KSysV init</comment>
- <comment xml:lang="ca">paquet de KSysV init</comment>
- <comment xml:lang="cs">balíček init KSysV</comment>
- <comment xml:lang="da">KSsV init-pakke</comment>
- <comment xml:lang="de">KSysV-Init-Paket</comment>
- <comment xml:lang="el">Αρχικό πακέτο KSysV</comment>
- <comment xml:lang="en-GB">KSysV init package</comment>
- <comment xml:lang="es">paquete de configuración de init para KSysV</comment>
- <comment xml:lang="eu">KSysV hasieratzeko paketea</comment>
- <comment xml:lang="fi">KSysV init -paketti</comment>
- <comment xml:lang="fo">KSysV init pakki</comment>
- <comment xml:lang="fr">paquet d'initialisation KSysV</comment>
- <comment xml:lang="fur">pachet init KSysV</comment>
- <comment xml:lang="ga">pacáiste túsaithe KSysV</comment>
- <comment xml:lang="gl">paquete de KsysV init</comment>
- <comment xml:lang="he">חבילת KSysV init</comment>
- <comment xml:lang="hr">KSysV init paket</comment>
- <comment xml:lang="hu">KSysV init csomag</comment>
- <comment xml:lang="ia">Pacchetto de initialisation KSysV</comment>
- <comment xml:lang="id">Paket init KSysV</comment>
- <comment xml:lang="it">Pacchetto init KSysV</comment>
- <comment xml:lang="ja">KSysV init パッケージ</comment>
- <comment xml:lang="kk">KSysV инициализация дестесі</comment>
- <comment xml:lang="ko">KSysV init 패키지</comment>
- <comment xml:lang="lt">KSysV init paketas</comment>
- <comment xml:lang="lv">KSysV inicializācijas pakotne</comment>
- <comment xml:lang="nb">KSysV init-pakke</comment>
- <comment xml:lang="nl">KSysV-init-pakket</comment>
- <comment xml:lang="nn">KSysV init-pakke</comment>
- <comment xml:lang="oc">paquet d'initializacion KSysV</comment>
- <comment xml:lang="pl">Pakiet KSysV init</comment>
- <comment xml:lang="pt">pacote inicial KSysV</comment>
- <comment xml:lang="pt-BR">Pacote init do KSysV</comment>
- <comment xml:lang="ro">Pachet KSysV init</comment>
- <comment xml:lang="ru">Пакет инициализации KSysV</comment>
- <comment xml:lang="sk">Balíček KSysV init</comment>
- <comment xml:lang="sl">Datoteka paketa KSysV init</comment>
- <comment xml:lang="sq">Paketë init KSysV</comment>
- <comment xml:lang="sr">КСисВ побудни пакет</comment>
- <comment xml:lang="sv">KSysV init-paket</comment>
- <comment xml:lang="tr">KSysV init paketi</comment>
- <comment xml:lang="uk">пакунок KSysV init</comment>
+ <comment xml:lang="zh_TW">KSysV init 軟體包</comment>
+ <comment xml:lang="zh_CN">KSysV init 软件包</comment>
<comment xml:lang="vi">Gói sở khởi KSysV</comment>
- <comment xml:lang="zh-CN">KSysV init 软件包</comment>
- <comment xml:lang="zh-TW">KSysV init 軟體包</comment>
+ <comment xml:lang="uk">пакунок KSysV init</comment>
+ <comment xml:lang="tr">KSysV init paketi</comment>
+ <comment xml:lang="sv">KSysV init-paket</comment>
+ <comment xml:lang="sr">КСисВ побудни пакет</comment>
+ <comment xml:lang="sq">paketë init KSysV</comment>
+ <comment xml:lang="sl">Datoteka paketa KSysV init</comment>
+ <comment xml:lang="si">KSysV init පැකේජය</comment>
+ <comment xml:lang="sk">Balíček KSysV init</comment>
+ <comment xml:lang="ru">Пакет инициализации KSysV</comment>
+ <comment xml:lang="ro">Pachet KSysV init</comment>
+ <comment xml:lang="pt_BR">Pacote init do KSysV</comment>
+ <comment xml:lang="pt">pacote inicial KSysV</comment>
+ <comment xml:lang="pl">Pakiet KSysV init</comment>
+ <comment xml:lang="oc">paquet d'initializacion KSysV</comment>
+ <comment xml:lang="nn">KSysV init-pakke</comment>
+ <comment xml:lang="nl">KSysV-init-pakket</comment>
+ <comment xml:lang="nb">KSysV init-pakke</comment>
+ <comment xml:lang="lv">KSysV inicializācijas pakotne</comment>
+ <comment xml:lang="lt">KSysV init paketas</comment>
+ <comment xml:lang="ko">KSysV init 패키지</comment>
+ <comment xml:lang="kk">KSysV инициализация дестесі</comment>
+ <comment xml:lang="ja">KSysV init パッケージ</comment>
+ <comment xml:lang="it">Pacchetto init KSysV</comment>
+ <comment xml:lang="is">KSysV init-pakki</comment>
+ <comment xml:lang="id">Paket init KSysV</comment>
+ <comment xml:lang="ia">Pacchetto de initialisation KSysV</comment>
+ <comment xml:lang="hu">KSysV init csomag</comment>
+ <comment xml:lang="hr">KSysV init paket</comment>
+ <comment xml:lang="he">חבילת KSysV init</comment>
+ <comment xml:lang="gl">paquete de KsysV init</comment>
+ <comment xml:lang="ga">pacáiste túsaithe KSysV</comment>
+ <comment xml:lang="fur">pachet init KSysV</comment>
+ <comment xml:lang="fr">paquet d'initialisation KSysV</comment>
+ <comment xml:lang="fo">KSysV init pakki</comment>
+ <comment xml:lang="fi">KSysV init -paketti</comment>
+ <comment xml:lang="eu">KSysV hasieratzeko paketea</comment>
+ <comment xml:lang="es">paquete de configuración de init para KSysV</comment>
+ <comment xml:lang="en_GB">KSysV init package</comment>
+ <comment xml:lang="el">Αρχικό πακέτο KSysV</comment>
+ <comment xml:lang="de">KSysV-Init-Paket</comment>
+ <comment xml:lang="da">KSsV init-pakke</comment>
+ <comment xml:lang="cs">balíček init KSysV</comment>
+ <comment xml:lang="ca">paquet de KSysV init</comment>
+ <comment xml:lang="bg">Пакет — KSysV init</comment>
+ <comment xml:lang="be@latin">Inicyjalny pakunak KSysV</comment>
+ <comment xml:lang="be">пакет ініцыялізацыі KSysV</comment>
+ <comment xml:lang="ar">حزمة KSysV init</comment>
<generic-icon name="package-x-generic"/>
- <magic priority="50">
+ <magic>
<match type="string" value="KSysV" offset="4">
<match type="byte" value="1" offset="15"/>
</match>
@@ -15093,114 +15798,120 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-kugar">
<comment>Kugar document</comment>
- <comment xml:lang="af">Kugar-dokument</comment>
- <comment xml:lang="ar">مستند Kugar</comment>
- <comment xml:lang="ast">Documentu de Kugar</comment>
- <comment xml:lang="be-Latn">Dakument Kugar</comment>
- <comment xml:lang="bg">Документ — Kugar</comment>
- <comment xml:lang="ca">document Kugar</comment>
- <comment xml:lang="cs">dokument Kugar</comment>
- <comment xml:lang="da">Kugardokument</comment>
- <comment xml:lang="de">Kugar-Dokument</comment>
- <comment xml:lang="el">Έγγραφο Kugar</comment>
- <comment xml:lang="en-GB">Kugar document</comment>
- <comment xml:lang="eo">Kugar-dokumento</comment>
- <comment xml:lang="es">documento de Kugar</comment>
- <comment xml:lang="eu">Kugar dokumentua</comment>
- <comment xml:lang="fi">Kugar-asiakirja</comment>
- <comment xml:lang="fo">Kugar skjal</comment>
- <comment xml:lang="fr">document Kugar</comment>
- <comment xml:lang="fur">document Kugar</comment>
- <comment xml:lang="ga">cáipéis Kugar</comment>
- <comment xml:lang="gl">documento de Kugar</comment>
- <comment xml:lang="he">מסמך Kugar</comment>
- <comment xml:lang="hr">Kugar dokument</comment>
- <comment xml:lang="hu">Kugar-dokumentum</comment>
- <comment xml:lang="ia">Documento Kugar</comment>
- <comment xml:lang="id">Dokumen Kugar</comment>
- <comment xml:lang="it">Documento Kugar</comment>
- <comment xml:lang="ja">Kugar ドキュメント</comment>
- <comment xml:lang="kk">Kugar құжаты</comment>
- <comment xml:lang="ko">Kugar 문서</comment>
- <comment xml:lang="lt">Kugar dokumentas</comment>
- <comment xml:lang="lv">Kugar dokuments</comment>
- <comment xml:lang="ms">Dokumen Kugar</comment>
- <comment xml:lang="nb">Kugar-dokument</comment>
- <comment xml:lang="nl">Kugar-document</comment>
- <comment xml:lang="nn">Kugar-dokument</comment>
- <comment xml:lang="oc">document Kugar</comment>
- <comment xml:lang="pl">Dokument Kuguar</comment>
- <comment xml:lang="pt">documento Kugar</comment>
- <comment xml:lang="pt-BR">Documento do Kugar</comment>
- <comment xml:lang="ro">Document Kugar</comment>
- <comment xml:lang="ru">Документ Kugar</comment>
- <comment xml:lang="sk">Dokument Kugar</comment>
- <comment xml:lang="sl">Dokument Kugar</comment>
- <comment xml:lang="sq">Dokument Kugar</comment>
- <comment xml:lang="sr">документ Кугара</comment>
- <comment xml:lang="sv">Kugar-dokument</comment>
- <comment xml:lang="tr">Kugar belgesi</comment>
- <comment xml:lang="uk">документ Kugar</comment>
+ <comment xml:lang="zh_TW">Kugar 文件</comment>
+ <comment xml:lang="zh_CN">Kugar 文档</comment>
<comment xml:lang="vi">Tài liệu Kugar</comment>
- <comment xml:lang="zh-CN">Kugar 文档</comment>
- <comment xml:lang="zh-TW">Kugar 文件</comment>
+ <comment xml:lang="uk">документ Kugar</comment>
+ <comment xml:lang="tr">Kugar belgesi</comment>
+ <comment xml:lang="sv">Kugar-dokument</comment>
+ <comment xml:lang="sr">документ Кугара</comment>
+ <comment xml:lang="sq">dokument Kugar</comment>
+ <comment xml:lang="sl">Dokument Kugar</comment>
+ <comment xml:lang="si">කුගර් ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument Kugar</comment>
+ <comment xml:lang="ru">Документ Kugar</comment>
+ <comment xml:lang="ro">Document Kugar</comment>
+ <comment xml:lang="pt_BR">Documento do Kugar</comment>
+ <comment xml:lang="pt">documento Kugar</comment>
+ <comment xml:lang="pl">Dokument Kuguar</comment>
+ <comment xml:lang="oc">document Kugar</comment>
+ <comment xml:lang="nn">Kugar-dokument</comment>
+ <comment xml:lang="nl">Kugar-document</comment>
+ <comment xml:lang="nb">Kugar-dokument</comment>
+ <comment xml:lang="ms">Dokumen Kugar</comment>
+ <comment xml:lang="lv">Kugar dokuments</comment>
+ <comment xml:lang="lt">Kugar dokumentas</comment>
+ <comment xml:lang="ko">Kugar 문서</comment>
+ <comment xml:lang="kk">Kugar құжаты</comment>
+ <comment xml:lang="ja">Kugar ドキュメント</comment>
+ <comment xml:lang="it">Documento Kugar</comment>
+ <comment xml:lang="is">Kugar skjal</comment>
+ <comment xml:lang="id">Dokumen Kugar</comment>
+ <comment xml:lang="ia">Documento Kugar</comment>
+ <comment xml:lang="hu">Kugar-dokumentum</comment>
+ <comment xml:lang="hr">Kugar dokument</comment>
+ <comment xml:lang="he">מסמך Kugar</comment>
+ <comment xml:lang="gl">documento de Kugar</comment>
+ <comment xml:lang="ga">cáipéis Kugar</comment>
+ <comment xml:lang="fur">document Kugar</comment>
+ <comment xml:lang="fr">document Kugar</comment>
+ <comment xml:lang="fo">Kugar skjal</comment>
+ <comment xml:lang="fi">Kugar-asiakirja</comment>
+ <comment xml:lang="eu">Kugar dokumentua</comment>
+ <comment xml:lang="es">documento de Kugar</comment>
+ <comment xml:lang="eo">Kugar-dokumento</comment>
+ <comment xml:lang="en_GB">Kugar document</comment>
+ <comment xml:lang="el">Έγγραφο Kugar</comment>
+ <comment xml:lang="de">Kugar-Dokument</comment>
+ <comment xml:lang="da">Kugardokument</comment>
+ <comment xml:lang="cs">dokument Kugar</comment>
+ <comment xml:lang="ca">document Kugar</comment>
+ <comment xml:lang="bg">Документ — Kugar</comment>
+ <comment xml:lang="be@latin">Dakument Kugar</comment>
+ <comment xml:lang="be">дакумент Kugar</comment>
+ <comment xml:lang="ast">Documentu de Kugar</comment>
+ <comment xml:lang="ar">مستند Kugar</comment>
+ <comment xml:lang="af">Kugar-dokument</comment>
<generic-icon name="x-office-document"/>
<glob pattern="*.kud"/>
</mime-type>
<mime-type type="application/x-kword">
<comment>KWord document</comment>
- <comment xml:lang="af">KWord-dokument</comment>
- <comment xml:lang="ar">مستند KWord</comment>
- <comment xml:lang="ast">Documentu de Kword</comment>
- <comment xml:lang="be-Latn">Dakument KWord</comment>
- <comment xml:lang="bg">Документ — KWord</comment>
- <comment xml:lang="ca">document KWord</comment>
- <comment xml:lang="cs">dokument KWord</comment>
- <comment xml:lang="cy">Dogfen KWord</comment>
- <comment xml:lang="da">KWord-dokument</comment>
- <comment xml:lang="de">KWord-Dokument</comment>
- <comment xml:lang="el">Έγγραφο KWord</comment>
- <comment xml:lang="en-GB">KWord document</comment>
- <comment xml:lang="eo">KWord-dokumento</comment>
- <comment xml:lang="es">documento de KWord</comment>
- <comment xml:lang="eu">KWord dokumentua</comment>
- <comment xml:lang="fi">KWord-asiakirja</comment>
- <comment xml:lang="fo">KWord skjal</comment>
- <comment xml:lang="fr">document KWord</comment>
- <comment xml:lang="fur">document KWord</comment>
- <comment xml:lang="ga">cáipéis KWord</comment>
- <comment xml:lang="gl">documento de KWord</comment>
- <comment xml:lang="he">מסמך KWord</comment>
- <comment xml:lang="hr">KWord dokument</comment>
- <comment xml:lang="hu">KWord-dokumentum</comment>
- <comment xml:lang="ia">Documento KWord</comment>
- <comment xml:lang="id">Dokumen KWord</comment>
- <comment xml:lang="it">Documento KWord</comment>
- <comment xml:lang="ja">KWord ドキュメント</comment>
- <comment xml:lang="kk">KWord құжаты</comment>
- <comment xml:lang="ko">KWord 문서</comment>
- <comment xml:lang="lt">KWord dokumentas</comment>
- <comment xml:lang="lv">KWord dokuments</comment>
- <comment xml:lang="ms">Dokumen KWord</comment>
- <comment xml:lang="nb">KWord-dokument</comment>
- <comment xml:lang="nl">KWord-document</comment>
- <comment xml:lang="nn">KWord-dokument</comment>
- <comment xml:lang="oc">document KWord</comment>
- <comment xml:lang="pl">Dokument KWord</comment>
- <comment xml:lang="pt">documento KWord</comment>
- <comment xml:lang="pt-BR">Documento do KWord</comment>
- <comment xml:lang="ro">Document KWord</comment>
- <comment xml:lang="ru">Документ KWord</comment>
- <comment xml:lang="sk">Dokument KWord</comment>
- <comment xml:lang="sl">Dokument KWord</comment>
- <comment xml:lang="sq">Dokument KWord</comment>
- <comment xml:lang="sr">документ К-речи</comment>
- <comment xml:lang="sv">KWord-dokument</comment>
- <comment xml:lang="tr">KWord belgesi</comment>
- <comment xml:lang="uk">документ KWord</comment>
+ <comment xml:lang="zh_TW">KWord 文件</comment>
+ <comment xml:lang="zh_CN">KWord 文档</comment>
<comment xml:lang="vi">Tài liệu KWord</comment>
- <comment xml:lang="zh-CN">KWord 文档</comment>
- <comment xml:lang="zh-TW">KWord 文件</comment>
+ <comment xml:lang="uk">документ KWord</comment>
+ <comment xml:lang="tr">KWord belgesi</comment>
+ <comment xml:lang="sv">KWord-dokument</comment>
+ <comment xml:lang="sr">документ К-речи</comment>
+ <comment xml:lang="sq">dokument KWord</comment>
+ <comment xml:lang="sl">Dokument KWord</comment>
+ <comment xml:lang="si">KWord ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument KWord</comment>
+ <comment xml:lang="ru">Документ KWord</comment>
+ <comment xml:lang="ro">Document KWord</comment>
+ <comment xml:lang="pt_BR">Documento do KWord</comment>
+ <comment xml:lang="pt">documento KWord</comment>
+ <comment xml:lang="pl">Dokument KWord</comment>
+ <comment xml:lang="oc">document KWord</comment>
+ <comment xml:lang="nn">KWord-dokument</comment>
+ <comment xml:lang="nl">KWord-document</comment>
+ <comment xml:lang="nb">KWord-dokument</comment>
+ <comment xml:lang="ms">Dokumen KWord</comment>
+ <comment xml:lang="lv">KWord dokuments</comment>
+ <comment xml:lang="lt">KWord dokumentas</comment>
+ <comment xml:lang="ko">KWord 문서</comment>
+ <comment xml:lang="kk">KWord құжаты</comment>
+ <comment xml:lang="ja">KWord ドキュメント</comment>
+ <comment xml:lang="it">Documento KWord</comment>
+ <comment xml:lang="is">KWord skjal</comment>
+ <comment xml:lang="id">Dokumen KWord</comment>
+ <comment xml:lang="ia">Documento KWord</comment>
+ <comment xml:lang="hu">KWord-dokumentum</comment>
+ <comment xml:lang="hr">KWord dokument</comment>
+ <comment xml:lang="he">מסמך KWord</comment>
+ <comment xml:lang="gl">documento de KWord</comment>
+ <comment xml:lang="ga">cáipéis KWord</comment>
+ <comment xml:lang="fur">document KWord</comment>
+ <comment xml:lang="fr">document KWord</comment>
+ <comment xml:lang="fo">KWord skjal</comment>
+ <comment xml:lang="fi">KWord-asiakirja</comment>
+ <comment xml:lang="eu">KWord dokumentua</comment>
+ <comment xml:lang="es">documento de KWord</comment>
+ <comment xml:lang="eo">KWord-dokumento</comment>
+ <comment xml:lang="en_GB">KWord document</comment>
+ <comment xml:lang="el">Έγγραφο KWord</comment>
+ <comment xml:lang="de">KWord-Dokument</comment>
+ <comment xml:lang="da">KWord-dokument</comment>
+ <comment xml:lang="cy">Dogfen KWord</comment>
+ <comment xml:lang="cs">dokument KWord</comment>
+ <comment xml:lang="ca">document KWord</comment>
+ <comment xml:lang="bg">Документ — KWord</comment>
+ <comment xml:lang="be@latin">Dakument KWord</comment>
+ <comment xml:lang="be">дакумент KWord</comment>
+ <comment xml:lang="ast">Documentu de Kword</comment>
+ <comment xml:lang="ar">مستند KWord</comment>
+ <comment xml:lang="af">KWord-dokument</comment>
<generic-icon name="x-office-document"/>
<magic priority="60">
<match type="string" value="\037\213" offset="0">
@@ -15219,116 +15930,122 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-kword-crypt">
<comment>KWord document (encrypted)</comment>
- <comment xml:lang="af">KWord-dokument (geënkripteer)</comment>
- <comment xml:lang="ar">مستند KWord (مشفر)</comment>
- <comment xml:lang="ast">Documentu de Kword (cifráu)</comment>
- <comment xml:lang="be-Latn">Dakument KWord (zašyfravany)</comment>
- <comment xml:lang="bg">Документ — KWord, шифриран</comment>
- <comment xml:lang="ca">document KWord (xifrat)</comment>
- <comment xml:lang="cs">dokument KWord (šifrovaný)</comment>
- <comment xml:lang="da">KWord-dokument (krypteret)</comment>
- <comment xml:lang="de">KWord-Dokument (verschlüsselt)</comment>
- <comment xml:lang="el">Έγγραφο KWord (κρυπτογραφημένο)</comment>
- <comment xml:lang="en-GB">KWord document (encrypted)</comment>
- <comment xml:lang="eo">KWord-dokumento (ĉifrita)</comment>
- <comment xml:lang="es">documento de KWord (cifrado)</comment>
- <comment xml:lang="eu">KWord dokumentua (zifratuta)</comment>
- <comment xml:lang="fi">KWord-asiakirja (salattu)</comment>
- <comment xml:lang="fo">KWord skjal (bronglað)</comment>
- <comment xml:lang="fr">document KWord (chiffré)</comment>
- <comment xml:lang="fur">document KWord (cifrât)</comment>
- <comment xml:lang="ga">cáipéis KWord (criptithe)</comment>
- <comment xml:lang="gl">documento de KWord (cifrado)</comment>
- <comment xml:lang="he">מסמך KWord (מוצפן)</comment>
- <comment xml:lang="hr">KWord dokument (šifriran)</comment>
- <comment xml:lang="hu">KWord-dokumentum (titkosított)</comment>
- <comment xml:lang="ia">Documento KWord (cryptate)</comment>
- <comment xml:lang="id">Dokumen KWord (terenkripsi)</comment>
- <comment xml:lang="it">Documento KWord (cifrato)</comment>
- <comment xml:lang="ja">KWord (暗号化) ドキュメント</comment>
- <comment xml:lang="kk">KWord құжаты (шифрленген)</comment>
- <comment xml:lang="ko">암호화된 KWord 문서</comment>
- <comment xml:lang="lt">KWord dokumentas (užšifruotas)</comment>
- <comment xml:lang="lv">KWord dokuments (šifrēts)</comment>
- <comment xml:lang="ms">Dokumen Kword (terenkripsi)</comment>
- <comment xml:lang="nb">KWord-dokument (kryptert)</comment>
- <comment xml:lang="nl">KWord-document (versleuteld)</comment>
- <comment xml:lang="nn">Kryptert KWord-dokument</comment>
- <comment xml:lang="oc">document KWord (chifrat)</comment>
- <comment xml:lang="pl">Dokument KWord (zaszyfrowany)</comment>
- <comment xml:lang="pt">documento KWord (encriptado)</comment>
- <comment xml:lang="pt-BR">Documento do KWord (criptografado)</comment>
- <comment xml:lang="ro">Document KWord (criptat)</comment>
- <comment xml:lang="ru">Документ KWord (зашифрованный)</comment>
- <comment xml:lang="sk">Dokument KWord (šifrovaný)</comment>
- <comment xml:lang="sl">Dokument KWord (šifriran)</comment>
- <comment xml:lang="sq">Dokument KWord (i kriptuar)</comment>
- <comment xml:lang="sr">документ К-речи (шифровани)</comment>
- <comment xml:lang="sv">KWord-dokument (krypterat)</comment>
- <comment xml:lang="tr">KWord belgesi (şifreli)</comment>
- <comment xml:lang="uk">документ KWord (зашифрований)</comment>
+ <comment xml:lang="zh_TW">KWord 文件 (加密)</comment>
+ <comment xml:lang="zh_CN">KWord 文档(加密)</comment>
<comment xml:lang="vi">Tài liệu KWord (đã mật mã)</comment>
- <comment xml:lang="zh-CN">KWord 文档(加密)</comment>
- <comment xml:lang="zh-TW">KWord 文件 (加密)</comment>
+ <comment xml:lang="uk">документ KWord (зашифрований)</comment>
+ <comment xml:lang="tr">KWord belgesi (şifreli)</comment>
+ <comment xml:lang="sv">KWord-dokument (krypterat)</comment>
+ <comment xml:lang="sr">документ К-речи (шифровани)</comment>
+ <comment xml:lang="sq">dokument KWord (i fshehtëzuar)</comment>
+ <comment xml:lang="sl">Dokument KWord (šifriran)</comment>
+ <comment xml:lang="si">KWord ලේඛනය (සංකේතනය කළ)</comment>
+ <comment xml:lang="sk">Dokument KWord (šifrovaný)</comment>
+ <comment xml:lang="ru">Документ KWord (зашифрованный)</comment>
+ <comment xml:lang="ro">Document KWord (criptat)</comment>
+ <comment xml:lang="pt_BR">Documento do KWord (criptografado)</comment>
+ <comment xml:lang="pt">documento KWord (encriptado)</comment>
+ <comment xml:lang="pl">Dokument KWord (zaszyfrowany)</comment>
+ <comment xml:lang="oc">document KWord (chifrat)</comment>
+ <comment xml:lang="nn">Kryptert KWord-dokument</comment>
+ <comment xml:lang="nl">KWord-document (versleuteld)</comment>
+ <comment xml:lang="nb">KWord-dokument (kryptert)</comment>
+ <comment xml:lang="ms">Dokumen Kword (terenkripsi)</comment>
+ <comment xml:lang="lv">KWord dokuments (šifrēts)</comment>
+ <comment xml:lang="lt">KWord dokumentas (užšifruotas)</comment>
+ <comment xml:lang="ko">암호화된 KWord 문서</comment>
+ <comment xml:lang="kk">KWord құжаты (шифрленген)</comment>
+ <comment xml:lang="ja">KWord (暗号化) ドキュメント</comment>
+ <comment xml:lang="it">Documento KWord (cifrato)</comment>
+ <comment xml:lang="is">KWord skjal (dulritað)</comment>
+ <comment xml:lang="id">Dokumen KWord (terenkripsi)</comment>
+ <comment xml:lang="ia">Documento KWord (cryptate)</comment>
+ <comment xml:lang="hu">KWord-dokumentum (titkosított)</comment>
+ <comment xml:lang="hr">KWord dokument (šifriran)</comment>
+ <comment xml:lang="he">מסמך KWord (מוצפן)</comment>
+ <comment xml:lang="gl">documento de KWord (cifrado)</comment>
+ <comment xml:lang="ga">cáipéis KWord (criptithe)</comment>
+ <comment xml:lang="fur">document KWord (cifrât)</comment>
+ <comment xml:lang="fr">document KWord (chiffré)</comment>
+ <comment xml:lang="fo">KWord skjal (bronglað)</comment>
+ <comment xml:lang="fi">KWord-asiakirja (salattu)</comment>
+ <comment xml:lang="eu">KWord dokumentua (zifratuta)</comment>
+ <comment xml:lang="es">documento de KWord (cifrado)</comment>
+ <comment xml:lang="eo">KWord-dokumento (ĉifrita)</comment>
+ <comment xml:lang="en_GB">KWord document (encrypted)</comment>
+ <comment xml:lang="el">Έγγραφο KWord (κρυπτογραφημένο)</comment>
+ <comment xml:lang="de">KWord-Dokument (verschlüsselt)</comment>
+ <comment xml:lang="da">KWord-dokument (krypteret)</comment>
+ <comment xml:lang="cs">dokument KWord (šifrovaný)</comment>
+ <comment xml:lang="ca">document KWord (xifrat)</comment>
+ <comment xml:lang="bg">Документ — KWord, шифриран</comment>
+ <comment xml:lang="be@latin">Dakument KWord (zašyfravany)</comment>
+ <comment xml:lang="be">дакумент KWord (зашыфраваны)</comment>
+ <comment xml:lang="ast">Documentu de Kword (cifráu)</comment>
+ <comment xml:lang="ar">مستند KWord (مشفر)</comment>
+ <comment xml:lang="af">KWord-dokument (geënkripteer)</comment>
<generic-icon name="x-office-document"/>
- <magic priority="50">
+ <magic>
<match type="big32" value="0x0d1a2701" offset="0"/>
</magic>
</mime-type>
<mime-type type="application/x-lha">
<comment>LHA archive</comment>
- <comment xml:lang="af">LHA-argief</comment>
- <comment xml:lang="ar">أرشيف LHA</comment>
- <comment xml:lang="az">LHA arxivi</comment>
- <comment xml:lang="be-Latn">Archiŭ LHA</comment>
- <comment xml:lang="bg">Архив — LHA</comment>
- <comment xml:lang="ca">arxiu LHA</comment>
- <comment xml:lang="cs">archiv LHA</comment>
- <comment xml:lang="cy">Archif LHA</comment>
- <comment xml:lang="da">LHA-arkiv</comment>
- <comment xml:lang="de">LHA-Archiv</comment>
- <comment xml:lang="el">Συμπιεσμένο αρχείο LHA</comment>
- <comment xml:lang="en-GB">LHA archive</comment>
- <comment xml:lang="eo">LHA-arkivo</comment>
- <comment xml:lang="es">archivador LHA</comment>
- <comment xml:lang="eu">LHA artxiboa</comment>
- <comment xml:lang="fi">LHA-arkisto</comment>
- <comment xml:lang="fo">LHA skjalasavn</comment>
- <comment xml:lang="fr">archive LHA</comment>
- <comment xml:lang="fur">archivi LHA</comment>
- <comment xml:lang="ga">cartlann LHA</comment>
- <comment xml:lang="gl">arquivo LHA</comment>
- <comment xml:lang="he">ארכיון LHA</comment>
- <comment xml:lang="hr">LHA arhiva</comment>
- <comment xml:lang="hu">LHA-archívum</comment>
- <comment xml:lang="ia">Archivo LHA</comment>
- <comment xml:lang="id">Arsip LHA</comment>
- <comment xml:lang="it">Archivio LHA</comment>
- <comment xml:lang="ja">LHA アーカイブ</comment>
- <comment xml:lang="kk">LHA архиві</comment>
- <comment xml:lang="ko">LHA 압축 파일</comment>
- <comment xml:lang="lt">LHA archyvas</comment>
- <comment xml:lang="lv">LHA arhīvs</comment>
- <comment xml:lang="ms">Arkib LHA</comment>
- <comment xml:lang="nb">LHA-arkiv</comment>
- <comment xml:lang="nl">LHA-archief</comment>
- <comment xml:lang="nn">LHA-arkiv</comment>
- <comment xml:lang="oc">archiu LHA</comment>
- <comment xml:lang="pl">Archiwum LHA</comment>
- <comment xml:lang="pt">arquivo LHA</comment>
- <comment xml:lang="pt-BR">Pacote LHA</comment>
- <comment xml:lang="ro">Arhivă LHA</comment>
- <comment xml:lang="ru">Архив LHA</comment>
- <comment xml:lang="sk">Archív LHA</comment>
- <comment xml:lang="sl">Datoteka arhiva LHA</comment>
- <comment xml:lang="sq">Arkiv LHA</comment>
- <comment xml:lang="sr">ЛХА архива</comment>
- <comment xml:lang="sv">LHA-arkiv</comment>
- <comment xml:lang="tr">LHA arşivi</comment>
- <comment xml:lang="uk">архів LHA</comment>
+ <comment xml:lang="zh_TW">LHA 封存檔</comment>
+ <comment xml:lang="zh_CN">LHA 归档文件</comment>
<comment xml:lang="vi">Kho nén LHA</comment>
- <comment xml:lang="zh-CN">LHA 归档文件</comment>
- <comment xml:lang="zh-TW">LHA 封存檔</comment>
+ <comment xml:lang="uk">архів LHA</comment>
+ <comment xml:lang="tr">LHA arşivi</comment>
+ <comment xml:lang="sv">LHA-arkiv</comment>
+ <comment xml:lang="sr">ЛХА архива</comment>
+ <comment xml:lang="sq">arkiv LHA</comment>
+ <comment xml:lang="sl">Datoteka arhiva LHA</comment>
+ <comment xml:lang="si">LHA ලේඛනාගාරය</comment>
+ <comment xml:lang="sk">Archív LHA</comment>
+ <comment xml:lang="ru">Архив LHA</comment>
+ <comment xml:lang="ro">Arhivă LHA</comment>
+ <comment xml:lang="pt_BR">Pacote LHA</comment>
+ <comment xml:lang="pt">arquivo LHA</comment>
+ <comment xml:lang="pl">Archiwum LHA</comment>
+ <comment xml:lang="oc">archiu LHA</comment>
+ <comment xml:lang="nn">LHA-arkiv</comment>
+ <comment xml:lang="nl">LHA-archief</comment>
+ <comment xml:lang="nb">LHA-arkiv</comment>
+ <comment xml:lang="ms">Arkib LHA</comment>
+ <comment xml:lang="lv">LHA arhīvs</comment>
+ <comment xml:lang="lt">LHA archyvas</comment>
+ <comment xml:lang="ko">LHA 압축 파일</comment>
+ <comment xml:lang="kk">LHA архиві</comment>
+ <comment xml:lang="ja">LHA アーカイブ</comment>
+ <comment xml:lang="it">Archivio LHA</comment>
+ <comment xml:lang="is">LHA safnskrá</comment>
+ <comment xml:lang="id">Arsip LHA</comment>
+ <comment xml:lang="ia">Archivo LHA</comment>
+ <comment xml:lang="hu">LHA-archívum</comment>
+ <comment xml:lang="hr">LHA arhiva</comment>
+ <comment xml:lang="he">ארכיון LHA</comment>
+ <comment xml:lang="gl">arquivo LHA</comment>
+ <comment xml:lang="ga">cartlann LHA</comment>
+ <comment xml:lang="fur">archivi LHA</comment>
+ <comment xml:lang="fr">archive LHA</comment>
+ <comment xml:lang="fo">LHA skjalasavn</comment>
+ <comment xml:lang="fi">LHA-arkisto</comment>
+ <comment xml:lang="eu">LHA artxiboa</comment>
+ <comment xml:lang="es">archivador LHA</comment>
+ <comment xml:lang="eo">LHA-arkivo</comment>
+ <comment xml:lang="en_GB">LHA archive</comment>
+ <comment xml:lang="el">Συμπιεσμένο αρχείο LHA</comment>
+ <comment xml:lang="de">LHA-Archiv</comment>
+ <comment xml:lang="da">LHA-arkiv</comment>
+ <comment xml:lang="cy">Archif LHA</comment>
+ <comment xml:lang="cs">archiv LHA</comment>
+ <comment xml:lang="ca">arxiu LHA</comment>
+ <comment xml:lang="bg">Архив — LHA</comment>
+ <comment xml:lang="be@latin">Archiŭ LHA</comment>
+ <comment xml:lang="be">архіў LHA</comment>
+ <comment xml:lang="az">LHA arxivi</comment>
+ <comment xml:lang="ar">أرشيف LHA</comment>
+ <comment xml:lang="af">LHA-argief</comment>
<generic-icon name="package-x-generic"/>
<magic priority="60">
<match type="string" value="-lh -" offset="2"/>
@@ -15350,111 +16067,74 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-lhz">
<comment>LHZ archive</comment>
- <comment xml:lang="af">LHZ-argief</comment>
- <comment xml:lang="ar">أرشيف LHZ</comment>
- <comment xml:lang="be-Latn">Archiŭ LHZ</comment>
- <comment xml:lang="bg">Архив — LHZ</comment>
- <comment xml:lang="ca">arxiu LHZ</comment>
- <comment xml:lang="cs">archiv LHZ</comment>
- <comment xml:lang="da">LHZ-arkiv</comment>
- <comment xml:lang="de">LHZ-Archiv</comment>
- <comment xml:lang="el">Συμπιεσμένο αρχείο LHZ</comment>
- <comment xml:lang="en-GB">LHZ archive</comment>
- <comment xml:lang="eo">LHZ-arkivo</comment>
- <comment xml:lang="es">archivador LHZ</comment>
- <comment xml:lang="eu">LHZ artxiboa</comment>
- <comment xml:lang="fi">LHZ-arkisto</comment>
- <comment xml:lang="fo">LHZ skjalasavn</comment>
- <comment xml:lang="fr">archive LHZ</comment>
- <comment xml:lang="fur">archivi LHZ</comment>
- <comment xml:lang="ga">cartlann LHZ</comment>
- <comment xml:lang="gl">arquivo LHZ</comment>
- <comment xml:lang="he">ארכיון LHZ</comment>
- <comment xml:lang="hr">LHZ arhiva</comment>
- <comment xml:lang="hu">LHZ-archívum</comment>
- <comment xml:lang="ia">Archivo LHZ</comment>
- <comment xml:lang="id">Arsip LHZ</comment>
- <comment xml:lang="it">Archivio LHZ</comment>
- <comment xml:lang="ja">LHZ アーカイブ</comment>
- <comment xml:lang="kk">LHZ архиві</comment>
- <comment xml:lang="ko">LHZ 압축 파일</comment>
- <comment xml:lang="lt">LHZ archyvas</comment>
- <comment xml:lang="lv">LHZ arhīvs</comment>
- <comment xml:lang="ms">Arkib LHZ</comment>
- <comment xml:lang="nb">LHZ-arkiv</comment>
- <comment xml:lang="nl">LHZ-archief</comment>
- <comment xml:lang="nn">LHZ-arkiv</comment>
- <comment xml:lang="oc">archiu LHZ</comment>
- <comment xml:lang="pl">Archiwum LHZ</comment>
- <comment xml:lang="pt">arquivo LHZ</comment>
- <comment xml:lang="pt-BR">Pacote LHZ</comment>
- <comment xml:lang="ro">Arhivă LHZ</comment>
- <comment xml:lang="ru">Архив LHZ</comment>
- <comment xml:lang="sk">Archív LHZ</comment>
- <comment xml:lang="sl">Datoteka arhiva LHZ</comment>
- <comment xml:lang="sq">Arkiv LHZ</comment>
- <comment xml:lang="sr">ЛХЗ архива</comment>
- <comment xml:lang="sv">LHZ-arkiv</comment>
- <comment xml:lang="tr">LHZ arşivi</comment>
- <comment xml:lang="uk">архів LHZ</comment>
+ <comment xml:lang="zh_TW">LHZ 封存檔</comment>
+ <comment xml:lang="zh_CN">LHZ 归档文件</comment>
<comment xml:lang="vi">Kho nén LHZ (LHA đã nén)</comment>
- <comment xml:lang="zh-CN">LHZ 归档文件</comment>
- <comment xml:lang="zh-TW">LHZ 封存檔</comment>
+ <comment xml:lang="uk">архів LHZ</comment>
+ <comment xml:lang="tr">LHZ arşivi</comment>
+ <comment xml:lang="sv">LHZ-arkiv</comment>
+ <comment xml:lang="sr">ЛХЗ архива</comment>
+ <comment xml:lang="sq">arkiv LHZ</comment>
+ <comment xml:lang="sl">Datoteka arhiva LHZ</comment>
+ <comment xml:lang="si">LHZ ලේඛනාගාරය</comment>
+ <comment xml:lang="sk">Archív LHZ</comment>
+ <comment xml:lang="ru">Архив LHZ</comment>
+ <comment xml:lang="ro">Arhivă LHZ</comment>
+ <comment xml:lang="pt_BR">Pacote LHZ</comment>
+ <comment xml:lang="pt">arquivo LHZ</comment>
+ <comment xml:lang="pl">Archiwum LHZ</comment>
+ <comment xml:lang="oc">archiu LHZ</comment>
+ <comment xml:lang="nn">LHZ-arkiv</comment>
+ <comment xml:lang="nl">LHZ-archief</comment>
+ <comment xml:lang="nb">LHZ-arkiv</comment>
+ <comment xml:lang="ms">Arkib LHZ</comment>
+ <comment xml:lang="lv">LHZ arhīvs</comment>
+ <comment xml:lang="lt">LHZ archyvas</comment>
+ <comment xml:lang="ko">LHZ 압축 파일</comment>
+ <comment xml:lang="kk">LHZ архиві</comment>
+ <comment xml:lang="ja">LHZ アーカイブ</comment>
+ <comment xml:lang="it">Archivio LHZ</comment>
+ <comment xml:lang="is">LHZ safnskrá</comment>
+ <comment xml:lang="id">Arsip LHZ</comment>
+ <comment xml:lang="ia">Archivo LHZ</comment>
+ <comment xml:lang="hu">LHZ-archívum</comment>
+ <comment xml:lang="hr">LHZ arhiva</comment>
+ <comment xml:lang="he">ארכיון LHZ</comment>
+ <comment xml:lang="gl">arquivo LHZ</comment>
+ <comment xml:lang="ga">cartlann LHZ</comment>
+ <comment xml:lang="fur">archivi LHZ</comment>
+ <comment xml:lang="fr">archive LHZ</comment>
+ <comment xml:lang="fo">LHZ skjalasavn</comment>
+ <comment xml:lang="fi">LHZ-arkisto</comment>
+ <comment xml:lang="eu">LHZ artxiboa</comment>
+ <comment xml:lang="es">archivador LHZ</comment>
+ <comment xml:lang="eo">LHZ-arkivo</comment>
+ <comment xml:lang="en_GB">LHZ archive</comment>
+ <comment xml:lang="el">Συμπιεσμένο αρχείο LHZ</comment>
+ <comment xml:lang="de">LHZ-Archiv</comment>
+ <comment xml:lang="da">LHZ-arkiv</comment>
+ <comment xml:lang="cs">archiv LHZ</comment>
+ <comment xml:lang="ca">arxiu LHZ</comment>
+ <comment xml:lang="bg">Архив — LHZ</comment>
+ <comment xml:lang="be@latin">Archiŭ LHZ</comment>
+ <comment xml:lang="be">архіў LHZ</comment>
+ <comment xml:lang="ar">أرشيف LHZ</comment>
+ <comment xml:lang="af">LHZ-argief</comment>
<generic-icon name="package-x-generic"/>
<glob pattern="*.lhz"/>
</mime-type>
<mime-type type="text/vnd.trolltech.linguist">
- <comment>message catalog</comment>
- <comment xml:lang="af">boodskaplêer</comment>
- <comment xml:lang="ar">كتالوج الرسالة</comment>
- <comment xml:lang="be-Latn">kataloh paviedamleńniaŭ</comment>
- <comment xml:lang="bg">Каталог със съобщения</comment>
- <comment xml:lang="ca">catàleg de missatges</comment>
- <comment xml:lang="cs">katalog zpráv</comment>
- <comment xml:lang="da">meddelelseskatalog</comment>
- <comment xml:lang="de">Nachrichtenkatalog</comment>
- <comment xml:lang="el">Κατάλογος μηνυμάτων</comment>
- <comment xml:lang="en-GB">message catalogue</comment>
- <comment xml:lang="eo">katalogo de mesaĝoj</comment>
- <comment xml:lang="es">catálogo de mensajes</comment>
- <comment xml:lang="eu">mezuen katalogoa</comment>
- <comment xml:lang="fi">viestiluettelo</comment>
- <comment xml:lang="fo">boðskrá</comment>
- <comment xml:lang="fr">catalogue de messages</comment>
- <comment xml:lang="fur">catalic di messaçs</comment>
- <comment xml:lang="ga">catalóg theachtaireachtaí</comment>
- <comment xml:lang="gl">catálogo de mensaxes</comment>
- <comment xml:lang="he">קטלוג הודעות</comment>
- <comment xml:lang="hr">Katalog poruka</comment>
- <comment xml:lang="hu">üzenetkatalógus</comment>
- <comment xml:lang="ia">Catalogo de messages</comment>
- <comment xml:lang="id">katalog pesan</comment>
- <comment xml:lang="it">Catalogo di messaggi</comment>
- <comment xml:lang="ja">メッセージカタログ</comment>
- <comment xml:lang="kk">мәлімдемелер каталогы</comment>
- <comment xml:lang="ko">메시지 카탈로그</comment>
- <comment xml:lang="lt">laiškų katalogas</comment>
- <comment xml:lang="lv">ziņojumu katalogs</comment>
- <comment xml:lang="ms">Katalog mesej</comment>
- <comment xml:lang="nb">meldingskatalog</comment>
- <comment xml:lang="nl">berichtencatalogus</comment>
- <comment xml:lang="nn">meldingskatalog</comment>
- <comment xml:lang="oc">catalòg de messatges</comment>
- <comment xml:lang="pl">Katalog wiadomości</comment>
- <comment xml:lang="pt">catálogo de mensagens</comment>
- <comment xml:lang="pt-BR">Catálogo de mensagens</comment>
- <comment xml:lang="ro">catalog de mesaje</comment>
- <comment xml:lang="ru">Каталог сообщений</comment>
- <comment xml:lang="sk">Katalóg správ</comment>
- <comment xml:lang="sl">katalogov sporočil</comment>
- <comment xml:lang="sq">Katallog mesazhesh</comment>
- <comment xml:lang="sr">каталог порука</comment>
- <comment xml:lang="sv">meddelandekatalog</comment>
- <comment xml:lang="tr">ileti kataloğu</comment>
+ <comment>Message catalog</comment>
<comment xml:lang="uk">каталог повідомлень</comment>
- <comment xml:lang="vi">phân loại thông điệp</comment>
- <comment xml:lang="zh-CN">消息库</comment>
- <comment xml:lang="zh-TW">訊息目錄</comment>
+ <comment xml:lang="sv">Meddelandekatalog</comment>
+ <comment xml:lang="ru">Каталог сообщений</comment>
+ <comment xml:lang="pl">Katalog wiadomości</comment>
+ <comment xml:lang="it">Catalogo di messaggi</comment>
+ <comment xml:lang="gl">Catálogo de mensaxes</comment>
+ <comment xml:lang="eu">Mezu-katalogoa</comment>
+ <comment xml:lang="es">catálogo de mensajes</comment>
+ <comment xml:lang="de">Nachrichtenkatalog</comment>
+ <comment xml:lang="be">каталог паведамленняў</comment>
<sub-class-of type="application/xml"/>
<magic>
<match type="string" value="&lt;TS " offset="0:256"/>
@@ -15466,60 +16146,63 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-lyx">
<comment>LyX document</comment>
- <comment xml:lang="af">LyX-dokument</comment>
- <comment xml:lang="ar">مستند LyX</comment>
- <comment xml:lang="ast">Documentu de Lyx</comment>
- <comment xml:lang="be-Latn">Dakument LyX</comment>
- <comment xml:lang="bg">Документ — LyX</comment>
- <comment xml:lang="ca">document LyX</comment>
- <comment xml:lang="cs">dokument LyX</comment>
- <comment xml:lang="da">LyX-dokument</comment>
- <comment xml:lang="de">LyX-Dokument</comment>
- <comment xml:lang="el">Έγγραφο LyX</comment>
- <comment xml:lang="en-GB">LyX document</comment>
- <comment xml:lang="eo">LyX-dokumento</comment>
- <comment xml:lang="es">documento de LyX</comment>
- <comment xml:lang="eu">LyX dokumentua</comment>
- <comment xml:lang="fi">LyX-asiakirja</comment>
- <comment xml:lang="fo">LyX skjal</comment>
- <comment xml:lang="fr">document LyX</comment>
- <comment xml:lang="fur">document LyX</comment>
- <comment xml:lang="ga">cáipéis LyX</comment>
- <comment xml:lang="gl">documento LyX</comment>
- <comment xml:lang="he">מסמך Lyx</comment>
- <comment xml:lang="hr">LyX dokument</comment>
- <comment xml:lang="hu">LyX-dokumentum</comment>
- <comment xml:lang="ia">Documento LyX</comment>
- <comment xml:lang="id">Dokumen LyX</comment>
- <comment xml:lang="it">Documento LyX</comment>
- <comment xml:lang="ja">LyX ドキュメント</comment>
- <comment xml:lang="kk">LyX құжаты</comment>
- <comment xml:lang="ko">LyX 문서</comment>
- <comment xml:lang="lt">LyX dokumentas</comment>
- <comment xml:lang="lv">LyX dokuments</comment>
- <comment xml:lang="ms">Dokumen LyX</comment>
- <comment xml:lang="nb">LyX-dokument</comment>
- <comment xml:lang="nl">LyX-document</comment>
- <comment xml:lang="nn">LyX-dokument</comment>
- <comment xml:lang="oc">document LyX</comment>
- <comment xml:lang="pl">Dokument LyX</comment>
- <comment xml:lang="pt">documento LyX</comment>
- <comment xml:lang="pt-BR">Documento LyX</comment>
- <comment xml:lang="ro">Document LyX</comment>
- <comment xml:lang="ru">Документ LyX</comment>
- <comment xml:lang="sk">Dokument LyX</comment>
- <comment xml:lang="sl">Dokument LyX</comment>
- <comment xml:lang="sq">Dokument LyX</comment>
- <comment xml:lang="sr">ЛиКс документ</comment>
- <comment xml:lang="sv">LyX-dokument</comment>
- <comment xml:lang="tr">LyX belgesi</comment>
- <comment xml:lang="uk">документ LyX</comment>
+ <comment xml:lang="zh_TW">LyX 文件</comment>
+ <comment xml:lang="zh_CN">LyX 文档</comment>
<comment xml:lang="vi">Tài liệu LyX</comment>
- <comment xml:lang="zh-CN">LyX 文档</comment>
- <comment xml:lang="zh-TW">LyX 文件</comment>
+ <comment xml:lang="uk">документ LyX</comment>
+ <comment xml:lang="tr">LyX belgesi</comment>
+ <comment xml:lang="sv">LyX-dokument</comment>
+ <comment xml:lang="sr">ЛиКс документ</comment>
+ <comment xml:lang="sq">dokument LyX</comment>
+ <comment xml:lang="sl">Dokument LyX</comment>
+ <comment xml:lang="si">LyX ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument LyX</comment>
+ <comment xml:lang="ru">Документ LyX</comment>
+ <comment xml:lang="ro">Document LyX</comment>
+ <comment xml:lang="pt_BR">Documento LyX</comment>
+ <comment xml:lang="pt">documento LyX</comment>
+ <comment xml:lang="pl">Dokument LyX</comment>
+ <comment xml:lang="oc">document LyX</comment>
+ <comment xml:lang="nn">LyX-dokument</comment>
+ <comment xml:lang="nl">LyX-document</comment>
+ <comment xml:lang="nb">LyX-dokument</comment>
+ <comment xml:lang="ms">Dokumen LyX</comment>
+ <comment xml:lang="lv">LyX dokuments</comment>
+ <comment xml:lang="lt">LyX dokumentas</comment>
+ <comment xml:lang="ko">LyX 문서</comment>
+ <comment xml:lang="kk">LyX құжаты</comment>
+ <comment xml:lang="ja">LyX ドキュメント</comment>
+ <comment xml:lang="it">Documento LyX</comment>
+ <comment xml:lang="is">LyX skjal</comment>
+ <comment xml:lang="id">Dokumen LyX</comment>
+ <comment xml:lang="ia">Documento LyX</comment>
+ <comment xml:lang="hu">LyX-dokumentum</comment>
+ <comment xml:lang="hr">LyX dokument</comment>
+ <comment xml:lang="he">מסמך Lyx</comment>
+ <comment xml:lang="gl">documento LyX</comment>
+ <comment xml:lang="ga">cáipéis LyX</comment>
+ <comment xml:lang="fur">document LyX</comment>
+ <comment xml:lang="fr">document LyX</comment>
+ <comment xml:lang="fo">LyX skjal</comment>
+ <comment xml:lang="fi">LyX-asiakirja</comment>
+ <comment xml:lang="eu">LyX dokumentua</comment>
+ <comment xml:lang="es">documento de LyX</comment>
+ <comment xml:lang="eo">LyX-dokumento</comment>
+ <comment xml:lang="en_GB">LyX document</comment>
+ <comment xml:lang="el">Έγγραφο LyX</comment>
+ <comment xml:lang="de">LyX-Dokument</comment>
+ <comment xml:lang="da">LyX-dokument</comment>
+ <comment xml:lang="cs">dokument LyX</comment>
+ <comment xml:lang="ca">document LyX</comment>
+ <comment xml:lang="bg">Документ — LyX</comment>
+ <comment xml:lang="be@latin">Dakument LyX</comment>
+ <comment xml:lang="be">дакумент LyX</comment>
+ <comment xml:lang="ast">Documentu de Lyx</comment>
+ <comment xml:lang="ar">مستند LyX</comment>
+ <comment xml:lang="af">LyX-dokument</comment>
<sub-class-of type="text/plain"/>
<generic-icon name="x-office-document"/>
- <magic priority="50">
+ <magic>
<match type="string" value="#LyX" offset="0"/>
</magic>
<glob pattern="*.lyx"/>
@@ -15527,42 +16210,49 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-lz4">
<comment>LZ4 archive</comment>
- <comment xml:lang="af">LZ4-argief</comment>
- <comment xml:lang="bg">Архив — LZ4</comment>
- <comment xml:lang="ca">arxiu LZ4</comment>
- <comment xml:lang="cs">archiv LZ4</comment>
- <comment xml:lang="da">LZ4-arkiv</comment>
- <comment xml:lang="de">LZ4-Archiv</comment>
- <comment xml:lang="el">Συμπιεσμένο αρχείο LZ4</comment>
- <comment xml:lang="en-GB">LZ4 archive</comment>
- <comment xml:lang="es">archivador LZ4</comment>
- <comment xml:lang="eu">LZ4 artxiboa</comment>
- <comment xml:lang="fi">LZ4-arkisto</comment>
- <comment xml:lang="fr">archive LZ4</comment>
- <comment xml:lang="fur">archivi LZ4</comment>
- <comment xml:lang="ga">Cartlann LZ4</comment>
- <comment xml:lang="gl">Arquivo LZ4</comment>
- <comment xml:lang="he">ארכיון LZ4</comment>
- <comment xml:lang="hr">LZ4 arhiva</comment>
- <comment xml:lang="hu">LZ4 archívum</comment>
- <comment xml:lang="ia">Archivo LZ4</comment>
- <comment xml:lang="id">Arsip LZ4</comment>
- <comment xml:lang="it">Archivio LZ4</comment>
- <comment xml:lang="kk">LZ4 архиві</comment>
- <comment xml:lang="ko">LZ4 압축 파일</comment>
- <comment xml:lang="oc">archiu LZ4</comment>
- <comment xml:lang="pl">Archiwum LZ4</comment>
- <comment xml:lang="pt">arquivo LZ4</comment>
- <comment xml:lang="pt-BR">Pacote LZ4</comment>
- <comment xml:lang="ru">Архив LZ4</comment>
- <comment xml:lang="sk">Archív LZ4</comment>
- <comment xml:lang="sl">Datoteka arhiva LZ4</comment>
- <comment xml:lang="sr">ЛЗ4 архива</comment>
- <comment xml:lang="sv">LZ4-arkiv</comment>
- <comment xml:lang="tr">LZ4 arşivi</comment>
+ <comment xml:lang="zh_TW">LZ4 封存檔</comment>
+ <comment xml:lang="zh_CN">LZ4 归档文件</comment>
<comment xml:lang="uk">архів LZ4</comment>
- <comment xml:lang="zh-CN">LZ4 归档文件</comment>
- <comment xml:lang="zh-TW">LZ4 封存檔</comment>
+ <comment xml:lang="tr">LZ4 arşivi</comment>
+ <comment xml:lang="sv">LZ4-arkiv</comment>
+ <comment xml:lang="sr">ЛЗ4 архива</comment>
+ <comment xml:lang="sq">arkiv LZ4</comment>
+ <comment xml:lang="sl">Datoteka arhiva LZ4</comment>
+ <comment xml:lang="si">LZ4 ලේඛනාගාරය</comment>
+ <comment xml:lang="sk">Archív LZ4</comment>
+ <comment xml:lang="ru">Архив LZ4</comment>
+ <comment xml:lang="pt_BR">Pacote LZ4</comment>
+ <comment xml:lang="pt">arquivo LZ4</comment>
+ <comment xml:lang="pl">Archiwum LZ4</comment>
+ <comment xml:lang="oc">archiu LZ4</comment>
+ <comment xml:lang="nl">LZ4-archief</comment>
+ <comment xml:lang="ko">LZ4 압축 파일</comment>
+ <comment xml:lang="kk">LZ4 архиві</comment>
+ <comment xml:lang="ja">LZ4 アーカイヴ</comment>
+ <comment xml:lang="it">Archivio LZ4</comment>
+ <comment xml:lang="is">LZ4 safnskrá</comment>
+ <comment xml:lang="id">Arsip LZ4</comment>
+ <comment xml:lang="ia">Archivo LZ4</comment>
+ <comment xml:lang="hu">LZ4 archívum</comment>
+ <comment xml:lang="hr">LZ4 arhiva</comment>
+ <comment xml:lang="he">ארכיון LZ4</comment>
+ <comment xml:lang="gl">Arquivo LZ4</comment>
+ <comment xml:lang="ga">Cartlann LZ4</comment>
+ <comment xml:lang="fur">archivi LZ4</comment>
+ <comment xml:lang="fr">archive LZ4</comment>
+ <comment xml:lang="fi">LZ4-arkisto</comment>
+ <comment xml:lang="eu">LZ4 artxiboa</comment>
+ <comment xml:lang="es">archivador LZ4</comment>
+ <comment xml:lang="en_GB">LZ4 archive</comment>
+ <comment xml:lang="el">Συμπιεσμένο αρχείο LZ4</comment>
+ <comment xml:lang="de">LZ4-Archiv</comment>
+ <comment xml:lang="da">LZ4-arkiv</comment>
+ <comment xml:lang="cs">archiv LZ4</comment>
+ <comment xml:lang="ca">arxiu LZ4</comment>
+ <comment xml:lang="bg">Архив — LZ4</comment>
+ <comment xml:lang="be">архіў LZ4</comment>
+ <comment xml:lang="ar">أرشيف LZ4</comment>
+ <comment xml:lang="af">LZ4-argief</comment>
<generic-icon name="package-x-generic"/>
<magic priority="60">
<match type="little32" value="0x184d2204" offset="0"/>
@@ -15572,86 +16262,99 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-lz4-compressed-tar">
<comment>Tar archive (LZ4-compressed)</comment>
- <comment xml:lang="af">Tar-argief (LZ4-saamgepers)</comment>
- <comment xml:lang="bg">Архив — tar, компресиран с LZ4</comment>
- <comment xml:lang="ca">arxiu tar (amb compressió LZ4)</comment>
- <comment xml:lang="cs">archiv Tar (komprimace LZ4)</comment>
- <comment xml:lang="da">Tar-arkiv (LZ4-komprimeret)</comment>
- <comment xml:lang="de">Tar-Archiv (LZ4-komprimiert)</comment>
- <comment xml:lang="en-GB">Tar archive (LZ4-compressed)</comment>
- <comment xml:lang="es">archivador Tar (comprimido con LZ4)</comment>
- <comment xml:lang="eu">Tar artxiboa (LZ4-rekin konprimatua)</comment>
- <comment xml:lang="fi">Tar-arkisto (LZ4-pakattu)</comment>
- <comment xml:lang="fr">archive tar (compression LZ4)</comment>
- <comment xml:lang="fur">archivi Tar (comprimût cun LZ4)</comment>
- <comment xml:lang="ga">cartlann Tar (comhbhrúite le LZ4)</comment>
- <comment xml:lang="he">ארכיון Tar (מכווץ ע״י LZ4)</comment>
- <comment xml:lang="hr">Tar arhiva (LZ4 sažeto)</comment>
- <comment xml:lang="hu">Tar archívum (LZ4 tömörítésű)</comment>
- <comment xml:lang="id">Arsip tar (terkompresi LZ4)</comment>
- <comment xml:lang="it">Archivio tar (compresso con LZ4)</comment>
- <comment xml:lang="kk">Tar архиві (LZ4-пен сығылған)</comment>
- <comment xml:lang="ko">Tar 묶음 파일(LZ4 압축)</comment>
- <comment xml:lang="pl">Archiwum tar (kompresja LZ4)</comment>
- <comment xml:lang="pt-BR">Arquivo Tar (compactado com LZ4)</comment>
- <comment xml:lang="ru">Архив TAR (сжатый lz4)</comment>
- <comment xml:lang="sk">Archív Tar (komprimovaný pomocou LZ4)</comment>
- <comment xml:lang="sr">Тар архива (запакована ЛЗ4-ом)</comment>
- <comment xml:lang="sv">Tar-arkiv (LZ4-komprimerat)</comment>
- <comment xml:lang="tr">Tar arşivi (LZ4 ile sıkıştırılmış)</comment>
+ <comment xml:lang="zh_TW">Tar 封存檔 (LZ4 壓縮)</comment>
+ <comment xml:lang="zh_CN">Tar 归档文件(LZ4 压缩)</comment>
<comment xml:lang="uk">архів tar (стиснений LZ4)</comment>
- <comment xml:lang="zh-CN">Tar 归档文件(LZ4 压缩)</comment>
- <comment xml:lang="zh-TW">Tar 封存檔 (LZ4 壓縮)</comment>
+ <comment xml:lang="tr">Tar arşivi (LZ4 ile sıkıştırılmış)</comment>
+ <comment xml:lang="sv">Tar-arkiv (LZ4-komprimerat)</comment>
+ <comment xml:lang="sr">Тар архива (запакована ЛЗ4-ом)</comment>
+ <comment xml:lang="sq">arkiv tar (ngjeshur me LZ4)</comment>
+ <comment xml:lang="sl">Arhiv tar (stisnjen, LZ4)</comment>
+ <comment xml:lang="si">තාර සංරක්ෂිතය (LZ4-සම්පීඩිත)</comment>
+ <comment xml:lang="sk">Archív Tar (komprimovaný pomocou LZ4)</comment>
+ <comment xml:lang="ru">Архив TAR (сжатый lz4)</comment>
+ <comment xml:lang="pt_BR">Arquivo Tar (compactado com LZ4)</comment>
+ <comment xml:lang="pl">Archiwum tar (kompresja LZ4)</comment>
+ <comment xml:lang="oc">archiu Tar (compression LZ4)</comment>
+ <comment xml:lang="nl">Tar-archief (gecomprimeerd met LZ4)</comment>
+ <comment xml:lang="ko">Tar 묶음 파일(LZ4 압축)</comment>
+ <comment xml:lang="kk">Tar архиві (LZ4-пен сығылған)</comment>
+ <comment xml:lang="ja">Tar アーカイブ (LZ4 圧縮)</comment>
+ <comment xml:lang="it">Archivio tar (compresso con LZ4)</comment>
+ <comment xml:lang="is">Tar safnskrá (LZ4-þjappað)</comment>
+ <comment xml:lang="id">Arsip tar (terkompresi LZ4)</comment>
+ <comment xml:lang="hu">Tar archívum (LZ4 tömörítésű)</comment>
+ <comment xml:lang="hr">Tar arhiva (LZ4 sažeto)</comment>
+ <comment xml:lang="he">ארכיון Tar (מכווץ ע״י LZ4)</comment>
+ <comment xml:lang="ga">cartlann Tar (comhbhrúite le LZ4)</comment>
+ <comment xml:lang="fur">archivi Tar (comprimût cun LZ4)</comment>
+ <comment xml:lang="fr">archive tar (compression LZ4)</comment>
+ <comment xml:lang="fi">Tar-arkisto (LZ4-pakattu)</comment>
+ <comment xml:lang="eu">Tar artxiboa (LZ4-rekin konprimatua)</comment>
+ <comment xml:lang="es">archivador TAR (comprimido con LZ4)</comment>
+ <comment xml:lang="en_GB">Tar archive (LZ4-compressed)</comment>
+ <comment xml:lang="de">Tar-Archiv (LZ4-komprimiert)</comment>
+ <comment xml:lang="da">Tar-arkiv (LZ4-komprimeret)</comment>
+ <comment xml:lang="cs">archiv Tar (komprimace LZ4)</comment>
+ <comment xml:lang="ca">arxiu tar (amb compressió LZ4)</comment>
+ <comment xml:lang="bg">Архив — tar, компресиран с LZ4</comment>
+ <comment xml:lang="be">архіў tar (сцісканне LZ4)</comment>
+ <comment xml:lang="ar">أرشيف Tar (مضغوط-LZ4)</comment>
+ <comment xml:lang="af">Tar-argief (LZ4-saamgepers)</comment>
<generic-icon name="package-x-generic"/>
<sub-class-of type="application/x-lz4"/>
<glob pattern="*.tar.lz4"/>
</mime-type>
<mime-type type="application/x-lzip">
<comment>Lzip archive</comment>
- <comment xml:lang="af">Lzip-argief</comment>
- <comment xml:lang="ar">أرشيف Lzip</comment>
- <comment xml:lang="bg">Архив — Lzip</comment>
- <comment xml:lang="ca">arxiu lzip</comment>
- <comment xml:lang="cs">archiv Lzip</comment>
- <comment xml:lang="da">Lzip-arkiv</comment>
- <comment xml:lang="de">Lzip-Archiv</comment>
- <comment xml:lang="el">Συμπιεσμένο αρχείο Lzip</comment>
- <comment xml:lang="en-GB">Lzip archive</comment>
- <comment xml:lang="eo">Lzip-arkivo</comment>
- <comment xml:lang="es">archivador Lzip</comment>
- <comment xml:lang="eu">Lzip artxiboa</comment>
- <comment xml:lang="fi">Lzip-arkisto</comment>
- <comment xml:lang="fo">Lzip skjalasavn</comment>
- <comment xml:lang="fr">archive lzip</comment>
- <comment xml:lang="fur">archivi Lzip</comment>
- <comment xml:lang="ga">cartlann Lzip</comment>
- <comment xml:lang="gl">arquivo Lzip</comment>
- <comment xml:lang="he">ארכיון Lzip</comment>
- <comment xml:lang="hr">Lzip arhiva</comment>
- <comment xml:lang="hu">Lzip archívum</comment>
- <comment xml:lang="ia">Archivo Lzip</comment>
- <comment xml:lang="id">Arsip Lzip</comment>
- <comment xml:lang="it">Archivio Lzip</comment>
- <comment xml:lang="ja">Lzip アーカイブ</comment>
- <comment xml:lang="kk">Lzip архиві</comment>
- <comment xml:lang="ko">LZIP 압축 파일</comment>
- <comment xml:lang="lt">Lzip archyvas</comment>
- <comment xml:lang="lv">Lzip arhīvs</comment>
- <comment xml:lang="nl">Lzip archief</comment>
- <comment xml:lang="oc">archiu lzip</comment>
- <comment xml:lang="pl">Archiwum lzip</comment>
- <comment xml:lang="pt">arquivo LZip</comment>
- <comment xml:lang="pt-BR">Pacote Lzip</comment>
- <comment xml:lang="ro">Arhivă Lzip</comment>
- <comment xml:lang="ru">Архив LZIP</comment>
- <comment xml:lang="sk">Archív Lzip</comment>
- <comment xml:lang="sl">Datoteka arhiva Lzip</comment>
- <comment xml:lang="sr">Лзип архива</comment>
- <comment xml:lang="sv">Lzip-arkiv</comment>
- <comment xml:lang="tr">Lzip arşivi</comment>
+ <comment xml:lang="zh_TW">Lzip 封存檔</comment>
+ <comment xml:lang="zh_CN">Lzip 归档文件</comment>
<comment xml:lang="uk">архів lzip</comment>
- <comment xml:lang="zh-CN">Lzip 归档文件</comment>
- <comment xml:lang="zh-TW">Lzip 封存檔</comment>
+ <comment xml:lang="tr">Lzip arşivi</comment>
+ <comment xml:lang="sv">Lzip-arkiv</comment>
+ <comment xml:lang="sr">Лзип архива</comment>
+ <comment xml:lang="sq">arkiv Lzip</comment>
+ <comment xml:lang="sl">Datoteka arhiva Lzip</comment>
+ <comment xml:lang="si">Lzip සංරක්ෂිතය</comment>
+ <comment xml:lang="sk">Archív Lzip</comment>
+ <comment xml:lang="ru">Архив LZIP</comment>
+ <comment xml:lang="ro">Arhivă Lzip</comment>
+ <comment xml:lang="pt_BR">Pacote Lzip</comment>
+ <comment xml:lang="pt">arquivo LZip</comment>
+ <comment xml:lang="pl">Archiwum lzip</comment>
+ <comment xml:lang="oc">archiu lzip</comment>
+ <comment xml:lang="nl">Lzip-archief</comment>
+ <comment xml:lang="lv">Lzip arhīvs</comment>
+ <comment xml:lang="lt">Lzip archyvas</comment>
+ <comment xml:lang="ko">LZIP 압축 파일</comment>
+ <comment xml:lang="kk">Lzip архиві</comment>
+ <comment xml:lang="ja">Lzip アーカイブ</comment>
+ <comment xml:lang="it">Archivio Lzip</comment>
+ <comment xml:lang="is">Lzip safnskrá</comment>
+ <comment xml:lang="id">Arsip Lzip</comment>
+ <comment xml:lang="ia">Archivo Lzip</comment>
+ <comment xml:lang="hu">Lzip archívum</comment>
+ <comment xml:lang="hr">Lzip arhiva</comment>
+ <comment xml:lang="he">ארכיון Lzip</comment>
+ <comment xml:lang="gl">arquivo Lzip</comment>
+ <comment xml:lang="ga">cartlann Lzip</comment>
+ <comment xml:lang="fur">archivi Lzip</comment>
+ <comment xml:lang="fr">archive lzip</comment>
+ <comment xml:lang="fo">Lzip skjalasavn</comment>
+ <comment xml:lang="fi">Lzip-arkisto</comment>
+ <comment xml:lang="eu">Lzip artxiboa</comment>
+ <comment xml:lang="es">archivador Lzip</comment>
+ <comment xml:lang="eo">Lzip-arkivo</comment>
+ <comment xml:lang="en_GB">Lzip archive</comment>
+ <comment xml:lang="el">Συμπιεσμένο αρχείο Lzip</comment>
+ <comment xml:lang="de">Lzip-Archiv</comment>
+ <comment xml:lang="da">Lzip-arkiv</comment>
+ <comment xml:lang="cs">archiv Lzip</comment>
+ <comment xml:lang="ca">arxiu lzip</comment>
+ <comment xml:lang="bg">Архив — Lzip</comment>
+ <comment xml:lang="be">архіў Lzip</comment>
+ <comment xml:lang="ar">أرشيف Lzip</comment>
+ <comment xml:lang="af">Lzip-argief</comment>
<generic-icon name="package-x-generic"/>
<magic priority="60">
<match type="string" value="LZIP" offset="0"/>
@@ -15660,127 +16363,149 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-lzip-compressed-tar">
<comment>Tar archive (lzip-compressed)</comment>
- <comment xml:lang="af">Tar-argief (lzip-saamgepers)</comment>
- <comment xml:lang="bg">Архив — tar, компресиран с Lzip</comment>
- <comment xml:lang="ca">arxiu tar (amb compressió lzip)</comment>
- <comment xml:lang="cs">archiv Tar (komprimace lzip)</comment>
- <comment xml:lang="da">Tar-arkiv (lzip-komprimeret)</comment>
- <comment xml:lang="de">Tar-Archiv (lzip-komprimiert)</comment>
- <comment xml:lang="en-GB">Tar archive (lzip-compressed)</comment>
- <comment xml:lang="es">archivador Tar (comprimido con lzip)</comment>
- <comment xml:lang="eu">Tar artxiboa (lzip-rekin konprimatua)</comment>
- <comment xml:lang="fi">Tar-arkisto (lzip-pakattu)</comment>
- <comment xml:lang="fr">archive tar (compressée lzip)</comment>
- <comment xml:lang="fur">archivi Tar (comprimût cun lzip)</comment>
- <comment xml:lang="ga">cartlann Tar (comhbhrúite le lzip)</comment>
- <comment xml:lang="he">ארכיון Tar (מכווץ ע״י lzip)</comment>
- <comment xml:lang="hr">Tar arhiva (lzip sažeto)</comment>
- <comment xml:lang="hu">Tar archívum (lzip tömörítésű)</comment>
- <comment xml:lang="id">Arsip tar (terkompresi lzip)</comment>
- <comment xml:lang="it">Archivio tar (compresso con lzip)</comment>
- <comment xml:lang="kk">Tar архиві (lzip-пен сығылған)</comment>
- <comment xml:lang="ko">TAR 묶음 파일(LZIP 압축)</comment>
- <comment xml:lang="pl">Archiwum tar (kompresja lzip)</comment>
- <comment xml:lang="pt-BR">Arquivo Tar (compactado com lzip)</comment>
- <comment xml:lang="ru">Архив TAR (сжатый lzip)</comment>
- <comment xml:lang="sk">Archív Tar (komprimovaný pomocou lzip)</comment>
- <comment xml:lang="sr">Тар архива (запакована лзипом)</comment>
- <comment xml:lang="sv">Tar-arkiv (lzip-komprimerat)</comment>
- <comment xml:lang="tr">Tar arşivi (lzip ile sıkıştırılmış)</comment>
+ <comment xml:lang="zh_TW">Tar 封存檔 (lzip 壓縮)</comment>
+ <comment xml:lang="zh_CN">Tar 归档文件(lzip 压缩)</comment>
<comment xml:lang="uk">архів tar (стиснений lzip)</comment>
- <comment xml:lang="zh-CN">Tar 归档文件(lzip 压缩)</comment>
- <comment xml:lang="zh-TW">Tar 封存檔 (lzip 壓縮)</comment>
+ <comment xml:lang="tr">Tar arşivi (lzip ile sıkıştırılmış)</comment>
+ <comment xml:lang="sv">Tar-arkiv (lzip-komprimerat)</comment>
+ <comment xml:lang="sr">Тар архива (запакована лзипом)</comment>
+ <comment xml:lang="sq">arkiv tar (ngjeshur me lzip)</comment>
+ <comment xml:lang="sl">Arhiv tar (stisnjen, lzip)</comment>
+ <comment xml:lang="si">තාර සංරක්ෂිතය (lzip-සම්පීඩිත)</comment>
+ <comment xml:lang="sk">Archív Tar (komprimovaný pomocou lzip)</comment>
+ <comment xml:lang="ru">Архив TAR (сжатый lzip)</comment>
+ <comment xml:lang="pt_BR">Arquivo Tar (compactado com lzip)</comment>
+ <comment xml:lang="pl">Archiwum tar (kompresja lzip)</comment>
+ <comment xml:lang="oc">archiu Tar (compression lzip)</comment>
+ <comment xml:lang="nl">Tar-archief (gecomprimeerd met lzip)</comment>
+ <comment xml:lang="ko">TAR 묶음 파일(LZIP 압축)</comment>
+ <comment xml:lang="kk">Tar архиві (lzip-пен сығылған)</comment>
+ <comment xml:lang="ja">Tar アーカイブ (lzip 圧縮)</comment>
+ <comment xml:lang="it">Archivio tar (compresso con lzip)</comment>
+ <comment xml:lang="is">Tar safnskrá (lzip-þjappað)</comment>
+ <comment xml:lang="id">Arsip tar (terkompresi lzip)</comment>
+ <comment xml:lang="hu">Tar archívum (lzip tömörítésű)</comment>
+ <comment xml:lang="hr">Tar arhiva (lzip sažeto)</comment>
+ <comment xml:lang="he">ארכיון Tar (מכווץ ע״י lzip)</comment>
+ <comment xml:lang="ga">cartlann Tar (comhbhrúite le lzip)</comment>
+ <comment xml:lang="fur">archivi Tar (comprimût cun lzip)</comment>
+ <comment xml:lang="fr">archive tar (compressée lzip)</comment>
+ <comment xml:lang="fi">Tar-arkisto (lzip-pakattu)</comment>
+ <comment xml:lang="eu">Tar artxiboa (lzip-rekin konprimatua)</comment>
+ <comment xml:lang="es">archivador TAR (comprimido con LZIP)</comment>
+ <comment xml:lang="en_GB">Tar archive (lzip-compressed)</comment>
+ <comment xml:lang="de">Tar-Archiv (lzip-komprimiert)</comment>
+ <comment xml:lang="da">Tar-arkiv (lzip-komprimeret)</comment>
+ <comment xml:lang="cs">archiv Tar (komprimace lzip)</comment>
+ <comment xml:lang="ca">arxiu tar (amb compressió lzip)</comment>
+ <comment xml:lang="bg">Архив — tar, компресиран с Lzip</comment>
+ <comment xml:lang="be">архіў tar (сцісканне lzip)</comment>
+ <comment xml:lang="ar">أرشيف Tar (مضغوط-lzip)</comment>
+ <comment xml:lang="af">Tar-argief (lzip-saamgepers)</comment>
<generic-icon name="package-x-generic"/>
<sub-class-of type="application/x-lzip"/>
<glob pattern="*.tar.lz"/>
</mime-type>
<mime-type type="application/x-lzpdf">
<comment>PDF document (lzip-compressed)</comment>
- <comment xml:lang="af">PDF-dokument (lzip-saamgepers)</comment>
- <comment xml:lang="ast">Documentu PDF (comprimíu en lzip)</comment>
- <comment xml:lang="bg">Документ — PDF, компресиран с Lzip</comment>
- <comment xml:lang="ca">document PDF (amb compressió lzip)</comment>
- <comment xml:lang="cs">dokument PDF (komprimace lzip)</comment>
- <comment xml:lang="da">PDF-dokument (lzip-komprimeret)</comment>
- <comment xml:lang="de">PDF-Dokument (lzip-komprimiert)</comment>
- <comment xml:lang="en-GB">PDF document (lzip-compressed)</comment>
- <comment xml:lang="es">documento PDF (comprimido con lzip)</comment>
- <comment xml:lang="eu">PDF dokumentua (lzip-rekin konprimitua)</comment>
- <comment xml:lang="fi">PDF-asiakirja (lzip-pakattu)</comment>
- <comment xml:lang="fr">document PDF (compressé lzip)</comment>
- <comment xml:lang="fur">document PDF (comprimût cun lzip)</comment>
- <comment xml:lang="ga">cáipéis PDF (comhbhrúite le lzip)</comment>
- <comment xml:lang="hr">PDF dokument (lzip sažeto)</comment>
- <comment xml:lang="hu">PDF dokumentum (lzip tömörítésű)</comment>
- <comment xml:lang="id">Dokumen PDF (termkompresi lzip)</comment>
- <comment xml:lang="it">Documento PDF (compresso con lzip)</comment>
- <comment xml:lang="kk">PDF құжаты (lzip-пен сығылған)</comment>
- <comment xml:lang="ko">PDF 문서(LZIP 압축)</comment>
- <comment xml:lang="pl">Dokument PDF (kompresja lzip)</comment>
- <comment xml:lang="pt-BR">Documento PDF (compactado com lzip)</comment>
- <comment xml:lang="ru">Документ PDF (сжатый lzip)</comment>
- <comment xml:lang="sk">Dokument PDF (komprimovaný pomocou lzip)</comment>
- <comment xml:lang="sr">ПДФ документ (запакован лзип-ом)</comment>
- <comment xml:lang="sv">PDF-dokument (lzip-komprimerat)</comment>
- <comment xml:lang="tr">PDF belgesi (lzip ile sıkıştırılmış)</comment>
+ <comment xml:lang="zh_TW">PDF 文件 (lzip 壓縮)</comment>
+ <comment xml:lang="zh_CN">PDF 文档(lzip 压缩)</comment>
<comment xml:lang="uk">документ PDF (стиснений lzip)</comment>
- <comment xml:lang="zh-CN">PDF 文档(lzip 压缩)</comment>
- <comment xml:lang="zh-TW">PDF 文件 (lzip 壓縮)</comment>
+ <comment xml:lang="tr">PDF belgesi (lzip ile sıkıştırılmış)</comment>
+ <comment xml:lang="sv">PDF-dokument (lzip-komprimerat)</comment>
+ <comment xml:lang="sr">ПДФ документ (запакован лзип-ом)</comment>
+ <comment xml:lang="sq">dokument PDF (ngjeshur me lzip)</comment>
+ <comment xml:lang="sl">Dokument PDF (stisnjen, lzip)</comment>
+ <comment xml:lang="si">PDF ලේඛනය (lzip-compressed)</comment>
+ <comment xml:lang="sk">Dokument PDF (komprimovaný pomocou lzip)</comment>
+ <comment xml:lang="ru">Документ PDF (сжатый lzip)</comment>
+ <comment xml:lang="pt_BR">Documento PDF (compactado com lzip)</comment>
+ <comment xml:lang="pl">Dokument PDF (kompresja lzip)</comment>
+ <comment xml:lang="oc">document PDF (compressat amb lzip)</comment>
+ <comment xml:lang="nl">PDF-document (gecomprimeerd met lzip)</comment>
+ <comment xml:lang="ko">PDF 문서(LZIP 압축)</comment>
+ <comment xml:lang="kk">PDF құжаты (lzip-пен сығылған)</comment>
+ <comment xml:lang="ja">PDF ドキュメント (lzip 圧縮)</comment>
+ <comment xml:lang="it">Documento PDF (compresso con lzip)</comment>
+ <comment xml:lang="is">PDF skjal (lzip-þjappað)</comment>
+ <comment xml:lang="id">Dokumen PDF (termkompresi lzip)</comment>
+ <comment xml:lang="hu">PDF dokumentum (lzip tömörítésű)</comment>
+ <comment xml:lang="hr">PDF dokument (lzip sažeto)</comment>
+ <comment xml:lang="he">מסמך PDF (דחוס ב־lzip)</comment>
+ <comment xml:lang="ga">cáipéis PDF (comhbhrúite le lzip)</comment>
+ <comment xml:lang="fur">document PDF (comprimût cun lzip)</comment>
+ <comment xml:lang="fr">document PDF (compressé lzip)</comment>
+ <comment xml:lang="fi">PDF-asiakirja (lzip-pakattu)</comment>
+ <comment xml:lang="eu">PDF dokumentua (lzip-rekin konprimitua)</comment>
+ <comment xml:lang="es">documento PDF (comprimido con LZIP)</comment>
+ <comment xml:lang="en_GB">PDF document (lzip-compressed)</comment>
+ <comment xml:lang="de">PDF-Dokument (lzip-komprimiert)</comment>
+ <comment xml:lang="da">PDF-dokument (lzip-komprimeret)</comment>
+ <comment xml:lang="cs">dokument PDF (komprimace lzip)</comment>
+ <comment xml:lang="ca">document PDF (amb compressió lzip)</comment>
+ <comment xml:lang="bg">Документ — PDF, компресиран с Lzip</comment>
+ <comment xml:lang="be">дакумент PDF (сцісканне lzip)</comment>
+ <comment xml:lang="ast">Documentu PDF (comprimíu en lzip)</comment>
+ <comment xml:lang="ar">مستند PDF (مضغوط-lzip)</comment>
+ <comment xml:lang="af">PDF-dokument (lzip-saamgepers)</comment>
<sub-class-of type="application/x-lzip"/>
<generic-icon name="x-office-document"/>
<glob pattern="*.pdf.lz"/>
</mime-type>
<mime-type type="application/x-lzma">
<comment>LZMA archive</comment>
- <comment xml:lang="af">LZMA-argief</comment>
- <comment xml:lang="ar">أرشيف LZMA</comment>
- <comment xml:lang="be-Latn">Archiŭ LZMA</comment>
- <comment xml:lang="bg">Архив — LZMA</comment>
- <comment xml:lang="ca">arxiu LZMA</comment>
- <comment xml:lang="cs">archiv LZMA</comment>
- <comment xml:lang="da">LZHA-arkiv</comment>
- <comment xml:lang="de">LZMA-Archiv</comment>
- <comment xml:lang="el">Συμπιεσμένο αρχείο LZMA</comment>
- <comment xml:lang="en-GB">LZMA archive</comment>
- <comment xml:lang="eo">LZMA-arkivo</comment>
- <comment xml:lang="es">archivador LZMA</comment>
- <comment xml:lang="eu">LZMA artxiboa</comment>
- <comment xml:lang="fi">LZMA-arkisto</comment>
- <comment xml:lang="fo">LZMA skjalasavn</comment>
- <comment xml:lang="fr">archive LZMA</comment>
- <comment xml:lang="fur">archivi LZMA</comment>
- <comment xml:lang="ga">cartlann LZMA</comment>
- <comment xml:lang="gl">arquivo LZMA</comment>
- <comment xml:lang="he">ארכיון LZMA</comment>
- <comment xml:lang="hr">LZMA arhiva</comment>
- <comment xml:lang="hu">LZMA-archívum</comment>
- <comment xml:lang="ia">Archivo LZMA</comment>
- <comment xml:lang="id">Arsip LZMA</comment>
- <comment xml:lang="it">Archivio LZMA</comment>
- <comment xml:lang="ja">LZMA アーカイブ</comment>
- <comment xml:lang="kk">LZMA архиві</comment>
- <comment xml:lang="ko">LZMA 압축 파일</comment>
- <comment xml:lang="lt">LZMA archyvas</comment>
- <comment xml:lang="lv">LZMA arhīvs</comment>
- <comment xml:lang="nb">LZMA-arkiv</comment>
- <comment xml:lang="nl">LZMA-archief</comment>
- <comment xml:lang="nn">LZMA-arkiv</comment>
- <comment xml:lang="oc">archiu LZMA</comment>
- <comment xml:lang="pl">Archiwum LZMA</comment>
- <comment xml:lang="pt">arquivo LZMA</comment>
- <comment xml:lang="pt-BR">Pacote LZMA</comment>
- <comment xml:lang="ro">Arhivă LZMA</comment>
- <comment xml:lang="ru">Архив LZMA</comment>
- <comment xml:lang="sk">Archív LZMA</comment>
- <comment xml:lang="sl">Datoteka arhiva LZMA</comment>
- <comment xml:lang="sq">Arkiv LZMA</comment>
- <comment xml:lang="sr">ЛЗМА архива</comment>
- <comment xml:lang="sv">LZMA-arkiv</comment>
- <comment xml:lang="tr">LZMA arşivi</comment>
- <comment xml:lang="uk">архів LZMA</comment>
+ <comment xml:lang="zh_TW">LZMA 封存檔</comment>
+ <comment xml:lang="zh_CN">LZMA 归档文件</comment>
<comment xml:lang="vi">Kho nén LZMA</comment>
- <comment xml:lang="zh-CN">LZMA 归档文件</comment>
- <comment xml:lang="zh-TW">LZMA 封存檔</comment>
+ <comment xml:lang="uk">архів LZMA</comment>
+ <comment xml:lang="tr">LZMA arşivi</comment>
+ <comment xml:lang="sv">LZMA-arkiv</comment>
+ <comment xml:lang="sr">ЛЗМА архива</comment>
+ <comment xml:lang="sq">arkiv LZMA</comment>
+ <comment xml:lang="sl">Datoteka arhiva LZMA</comment>
+ <comment xml:lang="si">LZMA ලේඛනාගාරය</comment>
+ <comment xml:lang="sk">Archív LZMA</comment>
+ <comment xml:lang="ru">Архив LZMA</comment>
+ <comment xml:lang="ro">Arhivă LZMA</comment>
+ <comment xml:lang="pt_BR">Pacote LZMA</comment>
+ <comment xml:lang="pt">arquivo LZMA</comment>
+ <comment xml:lang="pl">Archiwum LZMA</comment>
+ <comment xml:lang="oc">archiu LZMA</comment>
+ <comment xml:lang="nn">LZMA-arkiv</comment>
+ <comment xml:lang="nl">LZMA-archief</comment>
+ <comment xml:lang="nb">LZMA-arkiv</comment>
+ <comment xml:lang="lv">LZMA arhīvs</comment>
+ <comment xml:lang="lt">LZMA archyvas</comment>
+ <comment xml:lang="ko">LZMA 압축 파일</comment>
+ <comment xml:lang="kk">LZMA архиві</comment>
+ <comment xml:lang="ja">LZMA アーカイブ</comment>
+ <comment xml:lang="it">Archivio LZMA</comment>
+ <comment xml:lang="is">LZMA safnskrá</comment>
+ <comment xml:lang="id">Arsip LZMA</comment>
+ <comment xml:lang="ia">Archivo LZMA</comment>
+ <comment xml:lang="hu">LZMA-archívum</comment>
+ <comment xml:lang="hr">LZMA arhiva</comment>
+ <comment xml:lang="he">ארכיון LZMA</comment>
+ <comment xml:lang="gl">arquivo LZMA</comment>
+ <comment xml:lang="ga">cartlann LZMA</comment>
+ <comment xml:lang="fur">archivi LZMA</comment>
+ <comment xml:lang="fr">archive LZMA</comment>
+ <comment xml:lang="fo">LZMA skjalasavn</comment>
+ <comment xml:lang="fi">LZMA-arkisto</comment>
+ <comment xml:lang="eu">LZMA artxiboa</comment>
+ <comment xml:lang="es">archivador LZMA</comment>
+ <comment xml:lang="eo">LZMA-arkivo</comment>
+ <comment xml:lang="en_GB">LZMA archive</comment>
+ <comment xml:lang="el">Συμπιεσμένο αρχείο LZMA</comment>
+ <comment xml:lang="de">LZMA-Archiv</comment>
+ <comment xml:lang="da">LZHA-arkiv</comment>
+ <comment xml:lang="cs">archiv LZMA</comment>
+ <comment xml:lang="ca">arxiu LZMA</comment>
+ <comment xml:lang="bg">Архив — LZMA</comment>
+ <comment xml:lang="be@latin">Archiŭ LZMA</comment>
+ <comment xml:lang="be">архіў LZMA</comment>
+ <comment xml:lang="ar">أرشيف LZMA</comment>
+ <comment xml:lang="af">LZMA-argief</comment>
<acronym>LZMA</acronym>
<expanded-acronym>Lempel-Ziv-Markov chain-Algorithm</expanded-acronym>
<generic-icon name="package-x-generic"/>
@@ -15788,54 +16513,57 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-lzma-compressed-tar">
<comment>Tar archive (LZMA-compressed)</comment>
- <comment xml:lang="af">Tar-argief (LZMA-saamgepers)</comment>
- <comment xml:lang="ar">أرشيف Tar (مضغوط-LZMA)</comment>
- <comment xml:lang="be-Latn">Archiŭ tar (LZMA-skampresavany)</comment>
- <comment xml:lang="bg">Архив — tar, компресиран с LZMA</comment>
- <comment xml:lang="ca">arxiu tar (amb compressió LZMA)</comment>
- <comment xml:lang="cs">archiv Tar (komprimace LZMA)</comment>
- <comment xml:lang="da">Tar-arkiv (LZMA-komprimeret)</comment>
- <comment xml:lang="de">Tar-Archiv (LZMA-komprimiert)</comment>
- <comment xml:lang="el">Αρχείο Tar (συμπιεσμένο με LZMA)</comment>
- <comment xml:lang="en-GB">Tar archive (LZMA-compressed)</comment>
- <comment xml:lang="es">archivador Tar (comprimido con LZMA)</comment>
- <comment xml:lang="eu">Tar artxiboa (LZMA-rekin konprimitua)</comment>
- <comment xml:lang="fi">Tar-arkisto (LZMA-pakattu)</comment>
- <comment xml:lang="fo">Tar skjalasavn (LZMA-stappað)</comment>
- <comment xml:lang="fr">archive tar (compression LZMA)</comment>
- <comment xml:lang="fur">archivi Tar (comprimût cun LZMA)</comment>
- <comment xml:lang="ga">cartlann Tar (comhbhrúite le LZMA)</comment>
- <comment xml:lang="gl">arquivo Tar (comprimido con LZMA)</comment>
- <comment xml:lang="he">ארכיון Tar (מכווץ ע״י LZMA)</comment>
- <comment xml:lang="hr">Tar arhiva (LZMA sažeta)</comment>
- <comment xml:lang="hu">Tar archívum (LZMA tömörítésű)</comment>
- <comment xml:lang="ia">Archivo Tar (comprimite con LZMA)</comment>
- <comment xml:lang="id">Arsip Tar (terkompresi LZMA)</comment>
- <comment xml:lang="it">Archivio tar (compresso con LZMA)</comment>
- <comment xml:lang="ja">Tar アーカイブ (LZMA 圧縮)</comment>
- <comment xml:lang="kk">Tar архиві (LZMA-мен сығылған)</comment>
- <comment xml:lang="ko">TAR 묶음 파일(LZMA 압축)</comment>
- <comment xml:lang="lt">Tar archyvas (suglaudintas su LZMA)</comment>
- <comment xml:lang="lv">Tar arhīvs (saspiests ar LZMA)</comment>
- <comment xml:lang="nb">Tar-arkiv (LZMA-komprimert)</comment>
- <comment xml:lang="nl">Tar-archief (ingepakt met LZMA)</comment>
- <comment xml:lang="nn">Tar-arkiv (pakka med LZMA)</comment>
- <comment xml:lang="oc">archiu tar (compression LZMA)</comment>
- <comment xml:lang="pl">Archiwum tar (kompresja LZMA)</comment>
- <comment xml:lang="pt">arquivo Tar (compressão LZMA)</comment>
- <comment xml:lang="pt-BR">Pacote Tar (compactado com LZMA)</comment>
- <comment xml:lang="ro">Arhivă Tar (comprimată LZMA)</comment>
- <comment xml:lang="ru">Архив TAR (сжатый lzma)</comment>
- <comment xml:lang="sk">Archív Tar (komprimovaný pomocou LZMA)</comment>
- <comment xml:lang="sl">Datoteka arhiva Tar (stisnjen z LZMA)</comment>
- <comment xml:lang="sq">Arkiv tar (i kompresuar me LZMA)</comment>
- <comment xml:lang="sr">Тар архива (запакована ЛЗМА-ом)</comment>
- <comment xml:lang="sv">Tar-arkiv (LZMA-komprimerat)</comment>
- <comment xml:lang="tr">Tar arşivi (LZMA ile sıkıştırılmış)</comment>
- <comment xml:lang="uk">архів tar (стиснений LZMA)</comment>
+ <comment xml:lang="zh_TW">Tar 封存檔 (LZMA 壓縮)</comment>
+ <comment xml:lang="zh_CN">Tar 归档文件(LZMA 压缩)</comment>
<comment xml:lang="vi">Kho nén tar (đã nén LZMA)</comment>
- <comment xml:lang="zh-CN">Tar 归档文件(LZMA 压缩)</comment>
- <comment xml:lang="zh-TW">Tar 封存檔 (LZMA 壓縮)</comment>
+ <comment xml:lang="uk">архів tar (стиснений LZMA)</comment>
+ <comment xml:lang="tr">Tar arşivi (LZMA ile sıkıştırılmış)</comment>
+ <comment xml:lang="sv">Tar-arkiv (LZMA-komprimerat)</comment>
+ <comment xml:lang="sr">Тар архива (запакована ЛЗМА-ом)</comment>
+ <comment xml:lang="sq">arkiv Tar (ngjeshur me LZMA)</comment>
+ <comment xml:lang="sl">Datoteka arhiva Tar (stisnjen z LZMA)</comment>
+ <comment xml:lang="si">තාර සංරක්ෂිතය (LZMA-සම්පීඩිත)</comment>
+ <comment xml:lang="sk">Archív Tar (komprimovaný pomocou LZMA)</comment>
+ <comment xml:lang="ru">Архив TAR (сжатый lzma)</comment>
+ <comment xml:lang="ro">Arhivă Tar (comprimată LZMA)</comment>
+ <comment xml:lang="pt_BR">Pacote Tar (compactado com LZMA)</comment>
+ <comment xml:lang="pt">arquivo Tar (compressão LZMA)</comment>
+ <comment xml:lang="pl">Archiwum tar (kompresja LZMA)</comment>
+ <comment xml:lang="oc">archiu tar (compression LZMA)</comment>
+ <comment xml:lang="nn">Tar-arkiv (pakka med LZMA)</comment>
+ <comment xml:lang="nl">Tar-archief (gecomprimeerd met LZMA)</comment>
+ <comment xml:lang="nb">Tar-arkiv (LZMA-komprimert)</comment>
+ <comment xml:lang="lv">Tar arhīvs (saspiests ar LZMA)</comment>
+ <comment xml:lang="lt">Tar archyvas (suglaudintas su LZMA)</comment>
+ <comment xml:lang="ko">TAR 묶음 파일(LZMA 압축)</comment>
+ <comment xml:lang="kk">Tar архиві (LZMA-мен сығылған)</comment>
+ <comment xml:lang="ja">Tar アーカイブ (LZMA 圧縮)</comment>
+ <comment xml:lang="it">Archivio tar (compresso con LZMA)</comment>
+ <comment xml:lang="is">Tar safnskrá (LZMA-þjappað)</comment>
+ <comment xml:lang="id">Arsip Tar (terkompresi LZMA)</comment>
+ <comment xml:lang="ia">Archivo Tar (comprimite con LZMA)</comment>
+ <comment xml:lang="hu">Tar archívum (LZMA tömörítésű)</comment>
+ <comment xml:lang="hr">Tar arhiva (LZMA sažeta)</comment>
+ <comment xml:lang="he">ארכיון Tar (מכווץ ע״י LZMA)</comment>
+ <comment xml:lang="gl">arquivo Tar (comprimido con LZMA)</comment>
+ <comment xml:lang="ga">cartlann Tar (comhbhrúite le LZMA)</comment>
+ <comment xml:lang="fur">archivi Tar (comprimût cun LZMA)</comment>
+ <comment xml:lang="fr">archive tar (compression LZMA)</comment>
+ <comment xml:lang="fo">Tar skjalasavn (LZMA-stappað)</comment>
+ <comment xml:lang="fi">Tar-arkisto (LZMA-pakattu)</comment>
+ <comment xml:lang="eu">Tar artxiboa (LZMA-rekin konprimitua)</comment>
+ <comment xml:lang="es">archivador TAR (comprimido con LZMA)</comment>
+ <comment xml:lang="en_GB">Tar archive (LZMA-compressed)</comment>
+ <comment xml:lang="el">Αρχείο Tar (συμπιεσμένο με LZMA)</comment>
+ <comment xml:lang="de">Tar-Archiv (LZMA-komprimiert)</comment>
+ <comment xml:lang="da">Tar-arkiv (LZMA-komprimeret)</comment>
+ <comment xml:lang="cs">archiv Tar (komprimace LZMA)</comment>
+ <comment xml:lang="ca">arxiu tar (amb compressió LZMA)</comment>
+ <comment xml:lang="bg">Архив — tar, компресиран с LZMA</comment>
+ <comment xml:lang="be@latin">Archiŭ tar (LZMA-skampresavany)</comment>
+ <comment xml:lang="be">архіў tar (сцісканне LZMA)</comment>
+ <comment xml:lang="ar">أرشيف Tar (مضغوط-LZMA)</comment>
+ <comment xml:lang="af">Tar-argief (LZMA-saamgepers)</comment>
<sub-class-of type="application/x-lzma"/>
<generic-icon name="package-x-generic"/>
<glob pattern="*.tar.lzma"/>
@@ -15843,56 +16571,59 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-lzop">
<comment>LZO archive</comment>
- <comment xml:lang="af">LZO-argief</comment>
- <comment xml:lang="ar">أرشيف LZO</comment>
- <comment xml:lang="be-Latn">Archiŭ LZO</comment>
- <comment xml:lang="bg">Архив — LZO</comment>
- <comment xml:lang="ca">arxiu LZO</comment>
- <comment xml:lang="cs">archiv LZO</comment>
- <comment xml:lang="da">LZO-arkiv</comment>
- <comment xml:lang="de">LZO-Archiv</comment>
- <comment xml:lang="el">Συμπιεσμένο αρχείο LZO</comment>
- <comment xml:lang="en-GB">LZO archive</comment>
- <comment xml:lang="eo">LZO-arkivo</comment>
- <comment xml:lang="es">archivador LZO</comment>
- <comment xml:lang="eu">LZO artxiboa</comment>
- <comment xml:lang="fi">LZO-arkisto</comment>
- <comment xml:lang="fo">LZO skjalasavn</comment>
- <comment xml:lang="fr">archive LZO</comment>
- <comment xml:lang="fur">archivi LZO</comment>
- <comment xml:lang="ga">cartlann LZO</comment>
- <comment xml:lang="gl">arquivo LZO</comment>
- <comment xml:lang="he">ארכיון LZO</comment>
- <comment xml:lang="hr">LZO arhiva</comment>
- <comment xml:lang="hu">LZO-archívum</comment>
- <comment xml:lang="ia">Archivo LZO</comment>
- <comment xml:lang="id">Arsip LZO</comment>
- <comment xml:lang="it">Archivio LZO</comment>
- <comment xml:lang="ja">LZO アーカイブ</comment>
- <comment xml:lang="kk">LZO архиві</comment>
- <comment xml:lang="ko">LZO 압축 파일</comment>
- <comment xml:lang="lt">LZO archyvas</comment>
- <comment xml:lang="lv">LZO arhīvs</comment>
- <comment xml:lang="ms">Arkib LZO</comment>
- <comment xml:lang="nb">LZO-arkiv</comment>
- <comment xml:lang="nl">LZO-archief</comment>
- <comment xml:lang="nn">LZO-arkiv</comment>
- <comment xml:lang="oc">archiu LZO</comment>
- <comment xml:lang="pl">Archiwum LZO</comment>
- <comment xml:lang="pt">arquivo LZO</comment>
- <comment xml:lang="pt-BR">Pacote LZO</comment>
- <comment xml:lang="ro">Arhivă LZO</comment>
- <comment xml:lang="ru">Архив LZO</comment>
- <comment xml:lang="sk">Archív LZO</comment>
- <comment xml:lang="sl">Datoteka arhiva LZO</comment>
- <comment xml:lang="sq">Arkiv LZO</comment>
- <comment xml:lang="sr">ЛЗО архива</comment>
- <comment xml:lang="sv">LZO-arkiv</comment>
- <comment xml:lang="tr">LZO arşivi</comment>
- <comment xml:lang="uk">архів LZO</comment>
+ <comment xml:lang="zh_TW">LZO 封存檔</comment>
+ <comment xml:lang="zh_CN">LZO 归档文件</comment>
<comment xml:lang="vi">Kho nén LZO</comment>
- <comment xml:lang="zh-CN">LZO 归档文件</comment>
- <comment xml:lang="zh-TW">LZO 封存檔</comment>
+ <comment xml:lang="uk">архів LZO</comment>
+ <comment xml:lang="tr">LZO arşivi</comment>
+ <comment xml:lang="sv">LZO-arkiv</comment>
+ <comment xml:lang="sr">ЛЗО архива</comment>
+ <comment xml:lang="sq">arkiv LZO</comment>
+ <comment xml:lang="sl">Datoteka arhiva LZO</comment>
+ <comment xml:lang="si">LZO ලේඛනාගාරය</comment>
+ <comment xml:lang="sk">Archív LZO</comment>
+ <comment xml:lang="ru">Архив LZO</comment>
+ <comment xml:lang="ro">Arhivă LZO</comment>
+ <comment xml:lang="pt_BR">Pacote LZO</comment>
+ <comment xml:lang="pt">arquivo LZO</comment>
+ <comment xml:lang="pl">Archiwum LZO</comment>
+ <comment xml:lang="oc">archiu LZO</comment>
+ <comment xml:lang="nn">LZO-arkiv</comment>
+ <comment xml:lang="nl">LZO-archief</comment>
+ <comment xml:lang="nb">LZO-arkiv</comment>
+ <comment xml:lang="ms">Arkib LZO</comment>
+ <comment xml:lang="lv">LZO arhīvs</comment>
+ <comment xml:lang="lt">LZO archyvas</comment>
+ <comment xml:lang="ko">LZO 압축 파일</comment>
+ <comment xml:lang="kk">LZO архиві</comment>
+ <comment xml:lang="ja">LZO アーカイブ</comment>
+ <comment xml:lang="it">Archivio LZO</comment>
+ <comment xml:lang="is">LZO safnskrá</comment>
+ <comment xml:lang="id">Arsip LZO</comment>
+ <comment xml:lang="ia">Archivo LZO</comment>
+ <comment xml:lang="hu">LZO-archívum</comment>
+ <comment xml:lang="hr">LZO arhiva</comment>
+ <comment xml:lang="he">ארכיון LZO</comment>
+ <comment xml:lang="gl">arquivo LZO</comment>
+ <comment xml:lang="ga">cartlann LZO</comment>
+ <comment xml:lang="fur">archivi LZO</comment>
+ <comment xml:lang="fr">archive LZO</comment>
+ <comment xml:lang="fo">LZO skjalasavn</comment>
+ <comment xml:lang="fi">LZO-arkisto</comment>
+ <comment xml:lang="eu">LZO artxiboa</comment>
+ <comment xml:lang="es">archivador LZO</comment>
+ <comment xml:lang="eo">LZO-arkivo</comment>
+ <comment xml:lang="en_GB">LZO archive</comment>
+ <comment xml:lang="el">Συμπιεσμένο αρχείο LZO</comment>
+ <comment xml:lang="de">LZO-Archiv</comment>
+ <comment xml:lang="da">LZO-arkiv</comment>
+ <comment xml:lang="cs">archiv LZO</comment>
+ <comment xml:lang="ca">arxiu LZO</comment>
+ <comment xml:lang="bg">Архив — LZO</comment>
+ <comment xml:lang="be@latin">Archiŭ LZO</comment>
+ <comment xml:lang="be">архіў LZO</comment>
+ <comment xml:lang="ar">أرشيف LZO</comment>
+ <comment xml:lang="af">LZO-argief</comment>
<acronym>LZO</acronym>
<expanded-acronym>Lempel-Ziv-Oberhumer</expanded-acronym>
<generic-icon name="package-x-generic"/>
@@ -15903,42 +16634,49 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-qpress">
<comment>Qpress archive</comment>
- <comment xml:lang="af">Qpress-argief</comment>
- <comment xml:lang="bg">Архив — Qpress</comment>
- <comment xml:lang="ca">arxiu Qpress</comment>
- <comment xml:lang="cs">archiv Qpress</comment>
- <comment xml:lang="da">Qpress-arkiv</comment>
- <comment xml:lang="de">Qpress-Archiv</comment>
- <comment xml:lang="el">Συμπιεσμένο αρχείο Qpress</comment>
- <comment xml:lang="en-GB">Qpress archive</comment>
- <comment xml:lang="es">archivador de Qpress</comment>
- <comment xml:lang="eu">Qpress artxiboa</comment>
- <comment xml:lang="fi">Qpress-arkisto</comment>
- <comment xml:lang="fr">Archive Qpress</comment>
- <comment xml:lang="fur">archivi Qpress</comment>
- <comment xml:lang="ga">cartlann Qpress</comment>
- <comment xml:lang="gl">Arquivo Qpress</comment>
- <comment xml:lang="he">ארכיון Qpress</comment>
- <comment xml:lang="hr">Qpress arhiva</comment>
- <comment xml:lang="hu">Qpress archívum</comment>
- <comment xml:lang="ia">Archivo Qpress</comment>
- <comment xml:lang="id">Arsip Qpress</comment>
- <comment xml:lang="it">Archivio Qpress</comment>
- <comment xml:lang="kk">Qpress архиві</comment>
- <comment xml:lang="ko">Qpress 압축 파일</comment>
- <comment xml:lang="oc">Archiu Qpress</comment>
- <comment xml:lang="pl">Archiwum Qpress</comment>
- <comment xml:lang="pt">arquivo Qpress</comment>
- <comment xml:lang="pt-BR">Pacote Qpress</comment>
- <comment xml:lang="ru">Архив Qpress</comment>
- <comment xml:lang="sk">Archív Qpress</comment>
- <comment xml:lang="sl">Datoteka arhiva Qpress</comment>
- <comment xml:lang="sr">Купрес архива</comment>
- <comment xml:lang="sv">Qpress-arkiv</comment>
- <comment xml:lang="tr">Qpress arşivi</comment>
+ <comment xml:lang="zh_TW">Qpress 封存檔</comment>
+ <comment xml:lang="zh_CN">Qpress 归档文件</comment>
<comment xml:lang="uk">архів Qpress</comment>
- <comment xml:lang="zh-CN">Qpress 归档文件</comment>
- <comment xml:lang="zh-TW">Qpress 封存檔</comment>
+ <comment xml:lang="tr">Qpress arşivi</comment>
+ <comment xml:lang="sv">Qpress-arkiv</comment>
+ <comment xml:lang="sr">Купрес архива</comment>
+ <comment xml:lang="sq">arkiv Qpress</comment>
+ <comment xml:lang="sl">Datoteka arhiva Qpress</comment>
+ <comment xml:lang="si">Qpress සංරක්ෂිතය</comment>
+ <comment xml:lang="sk">Archív Qpress</comment>
+ <comment xml:lang="ru">Архив Qpress</comment>
+ <comment xml:lang="pt_BR">Pacote Qpress</comment>
+ <comment xml:lang="pt">arquivo Qpress</comment>
+ <comment xml:lang="pl">Archiwum Qpress</comment>
+ <comment xml:lang="oc">Archiu Qpress</comment>
+ <comment xml:lang="nl">Qpress-archief</comment>
+ <comment xml:lang="ko">Qpress 압축 파일</comment>
+ <comment xml:lang="kk">Qpress архиві</comment>
+ <comment xml:lang="ja">Qpress アーカイブ</comment>
+ <comment xml:lang="it">Archivio Qpress</comment>
+ <comment xml:lang="is">Qpress safnskrá</comment>
+ <comment xml:lang="id">Arsip Qpress</comment>
+ <comment xml:lang="ia">Archivo Qpress</comment>
+ <comment xml:lang="hu">Qpress archívum</comment>
+ <comment xml:lang="hr">Qpress arhiva</comment>
+ <comment xml:lang="he">ארכיון Qpress</comment>
+ <comment xml:lang="gl">Arquivo Qpress</comment>
+ <comment xml:lang="ga">cartlann Qpress</comment>
+ <comment xml:lang="fur">archivi Qpress</comment>
+ <comment xml:lang="fr">Archive Qpress</comment>
+ <comment xml:lang="fi">Qpress-arkisto</comment>
+ <comment xml:lang="eu">Qpress artxiboa</comment>
+ <comment xml:lang="es">archivador de Qpress</comment>
+ <comment xml:lang="en_GB">Qpress archive</comment>
+ <comment xml:lang="el">Συμπιεσμένο αρχείο Qpress</comment>
+ <comment xml:lang="de">Qpress-Archiv</comment>
+ <comment xml:lang="da">Qpress-arkiv</comment>
+ <comment xml:lang="cs">archiv Qpress</comment>
+ <comment xml:lang="ca">arxiu Qpress</comment>
+ <comment xml:lang="bg">Архив — Qpress</comment>
+ <comment xml:lang="be">архіў Qpress</comment>
+ <comment xml:lang="ar">أرشيف Qpress</comment>
+ <comment xml:lang="af">Qpress-argief</comment>
<generic-icon name="package-x-generic"/>
<magic priority="60">
<match type="string" value="qpress10" offset="0"/>
@@ -15947,37 +16685,46 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-xar">
<comment>XAR archive</comment>
- <comment xml:lang="af">XAR-argief</comment>
- <comment xml:lang="bg">Архив — XAR</comment>
- <comment xml:lang="ca">arxiu XAR</comment>
- <comment xml:lang="cs">archiv XAR</comment>
- <comment xml:lang="da">XAR-arkiv</comment>
- <comment xml:lang="de">XAR-Archiv</comment>
- <comment xml:lang="en-GB">XAR archive</comment>
- <comment xml:lang="es">archivador XAR</comment>
- <comment xml:lang="eu">XAR artxiboa</comment>
- <comment xml:lang="fi">XAR-arkisto</comment>
- <comment xml:lang="fr">archive XAR</comment>
- <comment xml:lang="fur">archivi XAR</comment>
- <comment xml:lang="ga">cartlann XAR</comment>
- <comment xml:lang="he">ארכיון XAR</comment>
- <comment xml:lang="hr">XAR arhiva</comment>
- <comment xml:lang="hu">XAR archívum</comment>
- <comment xml:lang="id">Arsip XAR</comment>
- <comment xml:lang="it">Archivio XAR</comment>
- <comment xml:lang="kk">XAR архиві</comment>
- <comment xml:lang="ko">XAR 아카이브</comment>
- <comment xml:lang="oc">Archiu XAR</comment>
- <comment xml:lang="pl">Archiwum XAR</comment>
- <comment xml:lang="pt-BR">Arquivo XAR</comment>
- <comment xml:lang="ru">Архив XAR</comment>
- <comment xml:lang="sk">Archív XAR</comment>
- <comment xml:lang="sr">ИксАР архива</comment>
- <comment xml:lang="sv">XAR-arkiv</comment>
- <comment xml:lang="tr">XAR arşivi</comment>
+ <comment xml:lang="zh_TW">XAR 封存檔</comment>
+ <comment xml:lang="zh_CN">XAR 归档文件</comment>
<comment xml:lang="uk">архів XAR</comment>
- <comment xml:lang="zh-CN">XAR 归档文件</comment>
- <comment xml:lang="zh-TW">XAR 封存檔</comment>
+ <comment xml:lang="tr">XAR arşivi</comment>
+ <comment xml:lang="sv">XAR-arkiv</comment>
+ <comment xml:lang="sr">ИксАР архива</comment>
+ <comment xml:lang="sq">arkvi XAR</comment>
+ <comment xml:lang="sl">Arhiv XAR</comment>
+ <comment xml:lang="si">XAR ලේඛනාගාරය</comment>
+ <comment xml:lang="sk">Archív XAR</comment>
+ <comment xml:lang="ru">Архив XAR</comment>
+ <comment xml:lang="pt_BR">Arquivo XAR</comment>
+ <comment xml:lang="pl">Archiwum XAR</comment>
+ <comment xml:lang="oc">Archiu XAR</comment>
+ <comment xml:lang="nl">XAR-archief</comment>
+ <comment xml:lang="ko">XAR 압축 파일</comment>
+ <comment xml:lang="kk">XAR архиві</comment>
+ <comment xml:lang="ja">XAR アーカイブ</comment>
+ <comment xml:lang="it">Archivio XAR</comment>
+ <comment xml:lang="is">XAR safnskrá</comment>
+ <comment xml:lang="id">Arsip XAR</comment>
+ <comment xml:lang="hu">XAR archívum</comment>
+ <comment xml:lang="hr">XAR arhiva</comment>
+ <comment xml:lang="he">ארכיון XAR</comment>
+ <comment xml:lang="gl">Arquivo XAR</comment>
+ <comment xml:lang="ga">cartlann XAR</comment>
+ <comment xml:lang="fur">archivi XAR</comment>
+ <comment xml:lang="fr">archive XAR</comment>
+ <comment xml:lang="fi">XAR-arkisto</comment>
+ <comment xml:lang="eu">XAR artxiboa</comment>
+ <comment xml:lang="es">archivador XAR</comment>
+ <comment xml:lang="en_GB">XAR archive</comment>
+ <comment xml:lang="de">XAR-Archiv</comment>
+ <comment xml:lang="da">XAR-arkiv</comment>
+ <comment xml:lang="cs">archiv XAR</comment>
+ <comment xml:lang="ca">arxiu XAR</comment>
+ <comment xml:lang="bg">Архив — XAR</comment>
+ <comment xml:lang="be">архіў XAR</comment>
+ <comment xml:lang="ar">أرشيف XAR</comment>
+ <comment xml:lang="af">XAR-argief</comment>
<acronym>XAR</acronym>
<expanded-acronym>eXtensible ARchive</expanded-acronym>
<generic-icon name="package-x-generic"/>
@@ -15990,212 +16737,228 @@ command to generate the output files.
</mime-type>
<mime-type type="application/zlib">
<comment>Zlib archive</comment>
- <comment xml:lang="af">Zlib-argief</comment>
- <comment xml:lang="bg">Архив — Zlib</comment>
- <comment xml:lang="ca">arxiu Zlib</comment>
- <comment xml:lang="cs">archiv Zlib</comment>
- <comment xml:lang="da">Zlib-arkiv</comment>
- <comment xml:lang="de">Zlib-Archiv</comment>
- <comment xml:lang="el">Συμπιεσμένο αρχείο Zlib</comment>
- <comment xml:lang="en-GB">Zlib archive</comment>
- <comment xml:lang="es">archivador Zlib</comment>
- <comment xml:lang="eu">Zlib artxiboa</comment>
- <comment xml:lang="fi">Zlib-arkisto</comment>
- <comment xml:lang="fr">Archive Zlib</comment>
- <comment xml:lang="fur">archivi Zlib</comment>
- <comment xml:lang="ga">cartlann Zlib</comment>
- <comment xml:lang="gl">Arquivo Zlib</comment>
- <comment xml:lang="he">ארכיון Zlib</comment>
- <comment xml:lang="hr">Zlib arhiva</comment>
- <comment xml:lang="hu">Zlib archívum</comment>
- <comment xml:lang="ia">Archivo Zlib</comment>
- <comment xml:lang="id">Arsip Zlib</comment>
- <comment xml:lang="it">Archivio zlib</comment>
- <comment xml:lang="kk">Zlib архиві</comment>
- <comment xml:lang="ko">Zlib 압축 파일</comment>
- <comment xml:lang="oc">Archiu Zlib</comment>
- <comment xml:lang="pl">Archiwum Zlib</comment>
- <comment xml:lang="pt">arquivo Zlib</comment>
- <comment xml:lang="pt-BR">Pacote Zlib</comment>
- <comment xml:lang="ru">Архив Zlib</comment>
- <comment xml:lang="sk">Archív Zlib</comment>
- <comment xml:lang="sl">Datoteka arhiva Zlib</comment>
- <comment xml:lang="sr">Злиб архива</comment>
- <comment xml:lang="sv">Zlib-arkiv</comment>
- <comment xml:lang="tr">Zlib arşivi</comment>
+ <comment xml:lang="zh_TW">Zlib 封存檔</comment>
+ <comment xml:lang="zh_CN">Alzip 归档文件</comment>
<comment xml:lang="uk">архів zlib</comment>
- <comment xml:lang="zh-CN">Alzip 归档文件</comment>
- <comment xml:lang="zh-TW">Zlib 封存檔</comment>
+ <comment xml:lang="tr">Zlib arşivi</comment>
+ <comment xml:lang="sv">Zlib-arkiv</comment>
+ <comment xml:lang="sr">Злиб архива</comment>
+ <comment xml:lang="sq">arkiv Zlib</comment>
+ <comment xml:lang="sl">Datoteka arhiva Zlib</comment>
+ <comment xml:lang="si">Zlib ලේඛනාගාරය</comment>
+ <comment xml:lang="sk">Archív Zlib</comment>
+ <comment xml:lang="ru">Архив Zlib</comment>
+ <comment xml:lang="pt_BR">Pacote Zlib</comment>
+ <comment xml:lang="pt">arquivo Zlib</comment>
+ <comment xml:lang="pl">Archiwum Zlib</comment>
+ <comment xml:lang="oc">Archiu Zlib</comment>
+ <comment xml:lang="nl">Zlib-archief</comment>
+ <comment xml:lang="ko">Zlib 압축 파일</comment>
+ <comment xml:lang="kk">Zlib архиві</comment>
+ <comment xml:lang="ja">Zlib アーカイブ</comment>
+ <comment xml:lang="it">Archivio zlib</comment>
+ <comment xml:lang="is">Zlib safnskrá</comment>
+ <comment xml:lang="id">Arsip Zlib</comment>
+ <comment xml:lang="ia">Archivo Zlib</comment>
+ <comment xml:lang="hu">Zlib archívum</comment>
+ <comment xml:lang="hr">Zlib arhiva</comment>
+ <comment xml:lang="he">ארכיון Zlib</comment>
+ <comment xml:lang="gl">Arquivo Zlib</comment>
+ <comment xml:lang="ga">cartlann Zlib</comment>
+ <comment xml:lang="fur">archivi Zlib</comment>
+ <comment xml:lang="fr">Archive Zlib</comment>
+ <comment xml:lang="fi">Zlib-arkisto</comment>
+ <comment xml:lang="eu">Zlib artxiboa</comment>
+ <comment xml:lang="es">archivador Zlib</comment>
+ <comment xml:lang="en_GB">Zlib archive</comment>
+ <comment xml:lang="el">Συμπιεσμένο αρχείο Zlib</comment>
+ <comment xml:lang="de">Zlib-Archiv</comment>
+ <comment xml:lang="da">Zlib-arkiv</comment>
+ <comment xml:lang="cs">archiv Zlib</comment>
+ <comment xml:lang="ca">arxiu Zlib</comment>
+ <comment xml:lang="bg">Архив — Zlib</comment>
+ <comment xml:lang="be">архіў Zlib</comment>
+ <comment xml:lang="ar">أرشيف Zlib</comment>
+ <comment xml:lang="af">Zlib-argief</comment>
<generic-icon name="package-x-generic"/>
<glob pattern="*.zz"/>
</mime-type>
<mime-type type="application/x-magicpoint">
<comment>MagicPoint presentation</comment>
- <comment xml:lang="af">MagicPoint-voorlegging</comment>
- <comment xml:lang="ar">عرض تقديمي MagicPoint</comment>
- <comment xml:lang="be-Latn">Prezentacyja MagicPoint</comment>
- <comment xml:lang="bg">Презентация — MagicPoint</comment>
- <comment xml:lang="ca">presentació de MagicPoint</comment>
- <comment xml:lang="cs">prezentace MagicPoint</comment>
- <comment xml:lang="cy">Cyflwyniad MagicPoint</comment>
- <comment xml:lang="da">MagicPoint-præsentation</comment>
- <comment xml:lang="de">MagicPoint-Präsentation</comment>
- <comment xml:lang="el">Παρουσίαση MagicPoint</comment>
- <comment xml:lang="en-GB">MagicPoint presentation</comment>
- <comment xml:lang="eo">MagicPoint-prezentaĵo</comment>
- <comment xml:lang="es">presentación de MagicPoint</comment>
- <comment xml:lang="eu">MagicPoint aurkezpena</comment>
- <comment xml:lang="fi">MagicPoint-esitys</comment>
- <comment xml:lang="fo">MagicPoint framløga</comment>
- <comment xml:lang="fr">présentation MagicPoint</comment>
- <comment xml:lang="fur">presentazion MagicPoint</comment>
- <comment xml:lang="ga">láithreoireacht MagicPoint</comment>
- <comment xml:lang="gl">presentación de MagicPoint</comment>
- <comment xml:lang="he">מצגת MagicPoint</comment>
- <comment xml:lang="hr">MagicPoint prezentacija</comment>
- <comment xml:lang="hu">MagicPoint-bemutató</comment>
- <comment xml:lang="ia">Presentation MagicPoint</comment>
- <comment xml:lang="id">Presentasi MagicPoint</comment>
- <comment xml:lang="it">Presentazione MagicPoint</comment>
- <comment xml:lang="ja">MagicPoint プレゼンテーション</comment>
- <comment xml:lang="ka">MagicPoint-ის პრეზენტაცია</comment>
- <comment xml:lang="kk">MagicPoint презентациясы</comment>
- <comment xml:lang="ko">MagicPoint 프레젠테이션</comment>
- <comment xml:lang="lt">MagicPoint pateiktis</comment>
- <comment xml:lang="lv">MagicPoint prezentācija</comment>
- <comment xml:lang="ms">Persembahan MagicPoint</comment>
- <comment xml:lang="nb">MagicPoint-presentasjon</comment>
- <comment xml:lang="nl">MagicPoint-presentatie</comment>
- <comment xml:lang="nn">MagicPoint-presentasjon</comment>
- <comment xml:lang="oc">presentacion MagicPoint</comment>
- <comment xml:lang="pl">Prezentacja programu MagicPoint</comment>
- <comment xml:lang="pt">apresentação MagicPoint</comment>
- <comment xml:lang="pt-BR">Apresentação do MagicPoint</comment>
- <comment xml:lang="ro">Prezentare MagicPoint</comment>
- <comment xml:lang="ru">Презентация MagicPoint</comment>
- <comment xml:lang="sk">Prezentácia MagicPoint</comment>
- <comment xml:lang="sl">Predstavitev MagicPoint</comment>
- <comment xml:lang="sq">Prezantim MagicPoint</comment>
- <comment xml:lang="sr">презентација Меџик Поинта</comment>
- <comment xml:lang="sv">MagicPoint-presentation</comment>
- <comment xml:lang="tr">MagicPoint sunumu</comment>
- <comment xml:lang="uk">презентація MagicPoint</comment>
+ <comment xml:lang="zh_TW">MagicPoint 簡報</comment>
+ <comment xml:lang="zh_CN">MagicPoint 演示文稿</comment>
<comment xml:lang="vi">Trình diễn MagicPoint</comment>
- <comment xml:lang="zh-CN">MagicPoint 演示文稿</comment>
- <comment xml:lang="zh-TW">MagicPoint 簡報</comment>
+ <comment xml:lang="uk">презентація MagicPoint</comment>
+ <comment xml:lang="tr">MagicPoint sunumu</comment>
+ <comment xml:lang="sv">MagicPoint-presentation</comment>
+ <comment xml:lang="sr">презентација Меџик Поинта</comment>
+ <comment xml:lang="sq">paraqitje MagicPoint</comment>
+ <comment xml:lang="sl">Predstavitev MagicPoint</comment>
+ <comment xml:lang="si">MagicPoint ඉදිරිපත් කිරීම</comment>
+ <comment xml:lang="sk">Prezentácia MagicPoint</comment>
+ <comment xml:lang="ru">Презентация MagicPoint</comment>
+ <comment xml:lang="ro">Prezentare MagicPoint</comment>
+ <comment xml:lang="pt_BR">Apresentação do MagicPoint</comment>
+ <comment xml:lang="pt">apresentação MagicPoint</comment>
+ <comment xml:lang="pl">Prezentacja programu MagicPoint</comment>
+ <comment xml:lang="oc">presentacion MagicPoint</comment>
+ <comment xml:lang="nn">MagicPoint-presentasjon</comment>
+ <comment xml:lang="nl">MagicPoint-presentatie</comment>
+ <comment xml:lang="nb">MagicPoint-presentasjon</comment>
+ <comment xml:lang="ms">Persembahan MagicPoint</comment>
+ <comment xml:lang="lv">MagicPoint prezentācija</comment>
+ <comment xml:lang="lt">MagicPoint pateiktis</comment>
+ <comment xml:lang="ko">MagicPoint 프레젠테이션</comment>
+ <comment xml:lang="kk">MagicPoint презентациясы</comment>
+ <comment xml:lang="ka">MagicPoint-ის პრეზენტაცია</comment>
+ <comment xml:lang="ja">MagicPoint プレゼンテーション</comment>
+ <comment xml:lang="it">Presentazione MagicPoint</comment>
+ <comment xml:lang="is">MagicPoint framsetning</comment>
+ <comment xml:lang="id">Presentasi MagicPoint</comment>
+ <comment xml:lang="ia">Presentation MagicPoint</comment>
+ <comment xml:lang="hu">MagicPoint-bemutató</comment>
+ <comment xml:lang="hr">MagicPoint prezentacija</comment>
+ <comment xml:lang="he">מצגת MagicPoint</comment>
+ <comment xml:lang="gl">presentación de MagicPoint</comment>
+ <comment xml:lang="ga">láithreoireacht MagicPoint</comment>
+ <comment xml:lang="fur">presentazion MagicPoint</comment>
+ <comment xml:lang="fr">présentation MagicPoint</comment>
+ <comment xml:lang="fo">MagicPoint framløga</comment>
+ <comment xml:lang="fi">MagicPoint-esitys</comment>
+ <comment xml:lang="eu">MagicPoint aurkezpena</comment>
+ <comment xml:lang="es">presentación de MagicPoint</comment>
+ <comment xml:lang="eo">MagicPoint-prezentaĵo</comment>
+ <comment xml:lang="en_GB">MagicPoint presentation</comment>
+ <comment xml:lang="el">Παρουσίαση MagicPoint</comment>
+ <comment xml:lang="de">MagicPoint-Präsentation</comment>
+ <comment xml:lang="da">MagicPoint-præsentation</comment>
+ <comment xml:lang="cy">Cyflwyniad MagicPoint</comment>
+ <comment xml:lang="cs">prezentace MagicPoint</comment>
+ <comment xml:lang="ca">presentació de MagicPoint</comment>
+ <comment xml:lang="bg">Презентация — MagicPoint</comment>
+ <comment xml:lang="be@latin">Prezentacyja MagicPoint</comment>
+ <comment xml:lang="be">прэзентацыя MagicPoint</comment>
+ <comment xml:lang="ar">عرض تقديمي MagicPoint</comment>
+ <comment xml:lang="af">MagicPoint-voorlegging</comment>
<sub-class-of type="text/plain"/>
<generic-icon name="x-office-presentation"/>
<glob pattern="*.mgp"/>
</mime-type>
<mime-type type="application/x-macbinary">
<comment>Macintosh MacBinary file</comment>
- <comment xml:lang="af">Macintosh MacBinary-lêer</comment>
- <comment xml:lang="ar">ملف Macintosh MacBinary</comment>
- <comment xml:lang="be-Latn">Fajł Macintosh MacBinary</comment>
- <comment xml:lang="bg">Файл — MacBinary</comment>
- <comment xml:lang="ca">fitxer MacBinary de Macintosh</comment>
- <comment xml:lang="cs">soubor MacBinary pro Macintosh </comment>
- <comment xml:lang="da">Macintosh MacBinary-fil</comment>
- <comment xml:lang="de">Macintosh-MacBinary-Datei</comment>
- <comment xml:lang="el">Εκτελέσιμο Macintosh MacBinary</comment>
- <comment xml:lang="en-GB">Macintosh MacBinary file</comment>
- <comment xml:lang="eo">MacBinary-dosiero de Macintosh</comment>
- <comment xml:lang="es">archivo de Macintosh MacBinary</comment>
- <comment xml:lang="eu">Macintosh MacBinary fitxategia</comment>
- <comment xml:lang="fi">Macintosh MacBinary -tiedosto</comment>
- <comment xml:lang="fo">Macintosh MacBinary fíla</comment>
- <comment xml:lang="fr">fichier Macintosh MacBinary</comment>
- <comment xml:lang="fur">file MacBinary di Macintosh</comment>
- <comment xml:lang="ga">comhad Macintosh MacBinary</comment>
- <comment xml:lang="gl">ficheiro MacBinary de Macintosh</comment>
- <comment xml:lang="he">קובץ בינרי של מקינטוש</comment>
- <comment xml:lang="hr">Macintosh MacBinary datoteka</comment>
- <comment xml:lang="hu">Macintosh MacBinary-fájl</comment>
- <comment xml:lang="ia">File MacBinary de Macintosh</comment>
- <comment xml:lang="id">Berkas Macintosh MacBinary</comment>
- <comment xml:lang="it">File Macintosh MacBinary</comment>
- <comment xml:lang="ja">Macintosh MacBinary ファイル</comment>
- <comment xml:lang="kk">Macintosh MacBinary файлы</comment>
- <comment xml:lang="ko">MacBinary 파일</comment>
- <comment xml:lang="lt">Macintosh MacBinary failas</comment>
- <comment xml:lang="lv">Macintosh MacBinary datne</comment>
- <comment xml:lang="ms">Fail MacBinary Macintosh</comment>
- <comment xml:lang="nb">Macintosh MacBinary-fil</comment>
- <comment xml:lang="nl">Macintosh MacBinary-bestand</comment>
- <comment xml:lang="nn">Macintosh MacBinary-fil</comment>
- <comment xml:lang="oc">fichièr Macintosh MacBinary</comment>
- <comment xml:lang="pl">Plik MacBinary Macintosh</comment>
- <comment xml:lang="pt">ficheiro MacBinary de Macintosh</comment>
- <comment xml:lang="pt-BR">Arquivo do Macintosh MacBinary</comment>
- <comment xml:lang="ro">Fișier Macintosh MacBinary</comment>
- <comment xml:lang="ru">Файл Macintosh MacBinary</comment>
- <comment xml:lang="sk">Súbor pre Macintosh MacBinary</comment>
- <comment xml:lang="sl">Izvedljiva dvojiška datoteka Macintosh MacBinary</comment>
- <comment xml:lang="sq">File MacBinary Macintosh</comment>
- <comment xml:lang="sr">Мекинтош Мек Бинари датотека</comment>
- <comment xml:lang="sv">Macintosh MacBinary-fil</comment>
- <comment xml:lang="tr">Macintosh MacBinary dosyası</comment>
- <comment xml:lang="uk">файл Macintosh MacBinary</comment>
+ <comment xml:lang="zh_TW">Macintosh MacBinary 檔</comment>
+ <comment xml:lang="zh_CN">Macintosh MacBinary 文件</comment>
<comment xml:lang="vi">Tập tin nhị phân MacBinary của Macintosh</comment>
- <comment xml:lang="zh-CN">Macintosh MacBinary 文件</comment>
- <comment xml:lang="zh-TW">Macintosh MacBinary 檔</comment>
+ <comment xml:lang="uk">файл Macintosh MacBinary</comment>
+ <comment xml:lang="tr">Macintosh MacBinary dosyası</comment>
+ <comment xml:lang="sv">Macintosh MacBinary-fil</comment>
+ <comment xml:lang="sr">Мекинтош Мек Бинари датотека</comment>
+ <comment xml:lang="sq">kartelë MacBinary Macintosh</comment>
+ <comment xml:lang="sl">Izvedljiva dvojiška datoteka Macintosh MacBinary</comment>
+ <comment xml:lang="si">Macintosh MacBinary ගොනුව</comment>
+ <comment xml:lang="sk">Súbor pre Macintosh MacBinary</comment>
+ <comment xml:lang="ru">Файл Macintosh MacBinary</comment>
+ <comment xml:lang="ro">Fișier Macintosh MacBinary</comment>
+ <comment xml:lang="pt_BR">Arquivo do Macintosh MacBinary</comment>
+ <comment xml:lang="pt">ficheiro MacBinary de Macintosh</comment>
+ <comment xml:lang="pl">Plik MacBinary Macintosh</comment>
+ <comment xml:lang="oc">fichièr Macintosh MacBinary</comment>
+ <comment xml:lang="nn">Macintosh MacBinary-fil</comment>
+ <comment xml:lang="nl">Macintosh MacBinary-bestand</comment>
+ <comment xml:lang="nb">Macintosh MacBinary-fil</comment>
+ <comment xml:lang="ms">Fail MacBinary Macintosh</comment>
+ <comment xml:lang="lv">Macintosh MacBinary datne</comment>
+ <comment xml:lang="lt">Macintosh MacBinary failas</comment>
+ <comment xml:lang="ko">MacBinary 파일</comment>
+ <comment xml:lang="kk">Macintosh MacBinary файлы</comment>
+ <comment xml:lang="ja">Macintosh MacBinary ファイル</comment>
+ <comment xml:lang="it">File Macintosh MacBinary</comment>
+ <comment xml:lang="is">Macintosh MacBinary skrá</comment>
+ <comment xml:lang="id">Berkas Macintosh MacBinary</comment>
+ <comment xml:lang="ia">File MacBinary de Macintosh</comment>
+ <comment xml:lang="hu">Macintosh MacBinary-fájl</comment>
+ <comment xml:lang="hr">Macintosh MacBinary datoteka</comment>
+ <comment xml:lang="he">קובץ בינרי של מקינטוש</comment>
+ <comment xml:lang="gl">ficheiro MacBinary de Macintosh</comment>
+ <comment xml:lang="ga">comhad Macintosh MacBinary</comment>
+ <comment xml:lang="fur">file MacBinary di Macintosh</comment>
+ <comment xml:lang="fr">fichier Macintosh MacBinary</comment>
+ <comment xml:lang="fo">Macintosh MacBinary fíla</comment>
+ <comment xml:lang="fi">Macintosh MacBinary -tiedosto</comment>
+ <comment xml:lang="eu">Macintosh MacBinary fitxategia</comment>
+ <comment xml:lang="es">archivo de Macintosh MacBinary</comment>
+ <comment xml:lang="eo">MacBinary-dosiero de Macintosh</comment>
+ <comment xml:lang="en_GB">Macintosh MacBinary file</comment>
+ <comment xml:lang="el">Εκτελέσιμο Macintosh MacBinary</comment>
+ <comment xml:lang="de">Macintosh-MacBinary-Datei</comment>
+ <comment xml:lang="da">Macintosh MacBinary-fil</comment>
+ <comment xml:lang="cs">soubor MacBinary pro Macintosh </comment>
+ <comment xml:lang="ca">fitxer MacBinary de Macintosh</comment>
+ <comment xml:lang="bg">Файл — MacBinary</comment>
+ <comment xml:lang="be@latin">Fajł Macintosh MacBinary</comment>
+ <comment xml:lang="be">файл Macintosh MacBinary</comment>
+ <comment xml:lang="ar">ملف Macintosh MacBinary</comment>
+ <comment xml:lang="af">Macintosh MacBinary-lêer</comment>
<generic-icon name="package-x-generic"/>
- <magic priority="50">
+ <magic>
<match type="string" value="mBIN" offset="102"/>
</magic>
</mime-type>
<mime-type type="application/x-matroska">
<comment>Matroska stream</comment>
- <comment xml:lang="af">Matroska-stroom</comment>
- <comment xml:lang="ar">دفق Matroska</comment>
- <comment xml:lang="be-Latn">Płyń Matroska</comment>
- <comment xml:lang="bg">Поток — Matroska</comment>
- <comment xml:lang="ca">flux Matroska</comment>
- <comment xml:lang="cs">proud Matroska</comment>
- <comment xml:lang="da">Matroska-strøm</comment>
- <comment xml:lang="de">Matroska-Datenstrom</comment>
- <comment xml:lang="el">Ροή Matroska</comment>
- <comment xml:lang="en-GB">Matroska stream</comment>
- <comment xml:lang="es">flujo Matroska</comment>
- <comment xml:lang="eu">Matroska korrontea</comment>
- <comment xml:lang="fi">Matroska-virta</comment>
- <comment xml:lang="fo">Matroska streymur</comment>
- <comment xml:lang="fr">flux Matroska</comment>
- <comment xml:lang="fur">flus Matroska</comment>
- <comment xml:lang="ga">sruth Matroska</comment>
- <comment xml:lang="gl">fluxo de Matroska</comment>
- <comment xml:lang="he">זרימת Matroska</comment>
- <comment xml:lang="hr">Matroška zapis</comment>
- <comment xml:lang="hu">Matroska adatfolyam</comment>
- <comment xml:lang="ia">Fluxo Matroska</comment>
- <comment xml:lang="id">Stream Matroska</comment>
- <comment xml:lang="it">Stream Matroska</comment>
- <comment xml:lang="ja">Matroska ストリーム</comment>
- <comment xml:lang="ka">Matroska-ის ნაკადი</comment>
- <comment xml:lang="kk">Matroska ағымы</comment>
- <comment xml:lang="ko">Matroska 스트림</comment>
- <comment xml:lang="lt">Matroska srautas</comment>
- <comment xml:lang="lv">Matroska straume</comment>
- <comment xml:lang="nl">Matroska-stream</comment>
- <comment xml:lang="nn">Matroska-straum</comment>
- <comment xml:lang="oc">flux Matroska</comment>
- <comment xml:lang="pl">Strumień Matroska</comment>
- <comment xml:lang="pt">fluxo Matroska</comment>
- <comment xml:lang="pt-BR">Transmissão do Matroska</comment>
- <comment xml:lang="ro">Flux Matroska</comment>
- <comment xml:lang="ru">Поток Matroska</comment>
- <comment xml:lang="sk">Stream Matroska</comment>
- <comment xml:lang="sl">Pretočni vir Matroska</comment>
- <comment xml:lang="sq">Stream Matroska</comment>
- <comment xml:lang="sr">Матрошкин ток</comment>
- <comment xml:lang="sv">Matroska-ström</comment>
- <comment xml:lang="tr">Matroska akışı</comment>
- <comment xml:lang="uk">потік даних Matroska</comment>
+ <comment xml:lang="zh_TW">Matroska 串流</comment>
+ <comment xml:lang="zh_CN">Matroska 流</comment>
<comment xml:lang="vi">Luồng Matroska</comment>
- <comment xml:lang="zh-CN">Matroska 流</comment>
- <comment xml:lang="zh-TW">Matroska 串流</comment>
+ <comment xml:lang="uk">потік даних Matroska</comment>
+ <comment xml:lang="tr">Matroska akışı</comment>
+ <comment xml:lang="sv">Matroska-ström</comment>
+ <comment xml:lang="sr">Матрошкин ток</comment>
+ <comment xml:lang="sq">rrjedhë Matroska</comment>
+ <comment xml:lang="sl">Pretočni vir Matroska</comment>
+ <comment xml:lang="si">Matroska ධාරාව</comment>
+ <comment xml:lang="sk">Stream Matroska</comment>
+ <comment xml:lang="ru">Поток Matroska</comment>
+ <comment xml:lang="ro">Flux Matroska</comment>
+ <comment xml:lang="pt_BR">Transmissão do Matroska</comment>
+ <comment xml:lang="pt">fluxo Matroska</comment>
+ <comment xml:lang="pl">Strumień Matroska</comment>
+ <comment xml:lang="oc">flux Matroska</comment>
+ <comment xml:lang="nn">Matroska-straum</comment>
+ <comment xml:lang="nl">Matroska-stream</comment>
+ <comment xml:lang="lv">Matroska straume</comment>
+ <comment xml:lang="lt">Matroska srautas</comment>
+ <comment xml:lang="ko">Matroska 스트림</comment>
+ <comment xml:lang="kk">Matroska ағымы</comment>
+ <comment xml:lang="ka">Matroska-ის ნაკადი</comment>
+ <comment xml:lang="ja">Matroska ストリーム</comment>
+ <comment xml:lang="it">Stream Matroska</comment>
+ <comment xml:lang="is">Matroska streymi</comment>
+ <comment xml:lang="id">Stream Matroska</comment>
+ <comment xml:lang="ia">Fluxo Matroska</comment>
+ <comment xml:lang="hu">Matroska adatfolyam</comment>
+ <comment xml:lang="hr">Matroška zapis</comment>
+ <comment xml:lang="he">זרימת Matroska</comment>
+ <comment xml:lang="gl">fluxo de Matroska</comment>
+ <comment xml:lang="ga">sruth Matroska</comment>
+ <comment xml:lang="fur">flus Matroska</comment>
+ <comment xml:lang="fr">flux Matroska</comment>
+ <comment xml:lang="fo">Matroska streymur</comment>
+ <comment xml:lang="fi">Matroska-virta</comment>
+ <comment xml:lang="eu">Matroska korrontea</comment>
+ <comment xml:lang="es">flujo Matroska</comment>
+ <comment xml:lang="en_GB">Matroska stream</comment>
+ <comment xml:lang="el">Ροή Matroska</comment>
+ <comment xml:lang="de">Matroska-Datenstrom</comment>
+ <comment xml:lang="da">Matroska-strøm</comment>
+ <comment xml:lang="cs">proud Matroska</comment>
+ <comment xml:lang="ca">flux Matroska</comment>
+ <comment xml:lang="bg">Поток — Matroska</comment>
+ <comment xml:lang="be@latin">Płyń Matroska</comment>
+ <comment xml:lang="be">плынь Matroska</comment>
+ <comment xml:lang="ar">دفق Matroska</comment>
+ <comment xml:lang="af">Matroska-stroom</comment>
<generic-icon name="video-x-generic"/>
- <magic priority="50">
+ <magic>
<!-- EBML ID -->
<match type="big32" value="0x1a45dfa3" offset="0">
<!-- DocumentType ID -->
@@ -16208,207 +16971,224 @@ command to generate the output files.
</mime-type>
<mime-type type="video/x-matroska">
<comment>Matroska video</comment>
- <comment xml:lang="af">Matroska-video</comment>
- <comment xml:lang="ar">Matroska مرئي</comment>
- <comment xml:lang="ast">Videu en Matroska</comment>
- <comment xml:lang="be-Latn">Videa Matroska</comment>
- <comment xml:lang="bg">Видео — Matroska</comment>
- <comment xml:lang="ca">vídeo Matroska</comment>
- <comment xml:lang="cs">video Matroska</comment>
- <comment xml:lang="da">Matroska-video</comment>
- <comment xml:lang="de">Matroska-Video</comment>
- <comment xml:lang="el">Βίντεο Matroska</comment>
- <comment xml:lang="en-GB">Matroska video</comment>
- <comment xml:lang="eo">Matroska-video</comment>
- <comment xml:lang="es">vídeo Matroska</comment>
- <comment xml:lang="eu">Matroska bideoa</comment>
- <comment xml:lang="fi">Matroska-video</comment>
- <comment xml:lang="fo">Matroska video</comment>
- <comment xml:lang="fr">vidéo Matroska</comment>
- <comment xml:lang="fur">video Matroska</comment>
- <comment xml:lang="ga">físeán Matroska</comment>
- <comment xml:lang="gl">vídeo de Matroska</comment>
- <comment xml:lang="he">וידאו Matroska</comment>
- <comment xml:lang="hr">Matroška video snimka</comment>
- <comment xml:lang="hu">Matroska-videó</comment>
- <comment xml:lang="ia">Video Matroska</comment>
- <comment xml:lang="id">Video Matroska</comment>
- <comment xml:lang="it">Video Matroska</comment>
- <comment xml:lang="ja">Matroska 動画</comment>
- <comment xml:lang="ka">Matroska-ის ვიდეო</comment>
- <comment xml:lang="kk">Matroska видеосы</comment>
- <comment xml:lang="ko">Matroska 동영상</comment>
- <comment xml:lang="lt">Matroska vaizdo įrašas</comment>
- <comment xml:lang="lv">Matroska video</comment>
- <comment xml:lang="ms">Video Matroska</comment>
- <comment xml:lang="nb">Matroska-film</comment>
- <comment xml:lang="nl">Matroska-video</comment>
- <comment xml:lang="nn">Matroska-video</comment>
- <comment xml:lang="oc">vidèo Matroska</comment>
- <comment xml:lang="pl">Plik wideo Matroska</comment>
- <comment xml:lang="pt">vídeo Matroska</comment>
- <comment xml:lang="pt-BR">Vídeo Matroska</comment>
- <comment xml:lang="ro">Video Matroska</comment>
- <comment xml:lang="ru">Видео Matroska</comment>
- <comment xml:lang="sk">Video Matroska</comment>
- <comment xml:lang="sl">Video datoteka Matroska</comment>
- <comment xml:lang="sq">Video Matroska</comment>
- <comment xml:lang="sr">Матрошкин видео</comment>
- <comment xml:lang="sv">Matroska-video</comment>
- <comment xml:lang="tr">Matroska video</comment>
- <comment xml:lang="uk">відеокліп Matroska</comment>
+ <comment xml:lang="zh_TW">Matroska 視訊</comment>
+ <comment xml:lang="zh_CN">Matroska 视频</comment>
<comment xml:lang="vi">Ảnh động Matroska</comment>
- <comment xml:lang="zh-CN">Matroska 视频</comment>
- <comment xml:lang="zh-TW">Matroska 視訊</comment>
+ <comment xml:lang="uk">відеокліп Matroska</comment>
+ <comment xml:lang="tr">Matroska video</comment>
+ <comment xml:lang="sv">Matroska-video</comment>
+ <comment xml:lang="sr">Матрошкин видео</comment>
+ <comment xml:lang="sq">video Matroska</comment>
+ <comment xml:lang="sl">Video datoteka Matroska</comment>
+ <comment xml:lang="si">Matroska වීඩියෝව</comment>
+ <comment xml:lang="sk">Video Matroska</comment>
+ <comment xml:lang="ru">Видео Matroska</comment>
+ <comment xml:lang="ro">Video Matroska</comment>
+ <comment xml:lang="pt_BR">Vídeo Matroska</comment>
+ <comment xml:lang="pt">vídeo Matroska</comment>
+ <comment xml:lang="pl">Plik wideo Matroska</comment>
+ <comment xml:lang="oc">vidèo Matroska</comment>
+ <comment xml:lang="nn">Matroska-video</comment>
+ <comment xml:lang="nl">Matroska-video</comment>
+ <comment xml:lang="nb">Matroska-film</comment>
+ <comment xml:lang="ms">Video Matroska</comment>
+ <comment xml:lang="lv">Matroska video</comment>
+ <comment xml:lang="lt">Matroska vaizdo įrašas</comment>
+ <comment xml:lang="ko">Matroska 동영상</comment>
+ <comment xml:lang="kk">Matroska видеосы</comment>
+ <comment xml:lang="ka">Matroska-ის ვიდეო</comment>
+ <comment xml:lang="ja">Matroska 動画</comment>
+ <comment xml:lang="it">Video Matroska</comment>
+ <comment xml:lang="is">Matroska myndskeið</comment>
+ <comment xml:lang="id">Video Matroska</comment>
+ <comment xml:lang="ia">Video Matroska</comment>
+ <comment xml:lang="hu">Matroska-videó</comment>
+ <comment xml:lang="hr">Matroška video snimka</comment>
+ <comment xml:lang="he">וידאו Matroska</comment>
+ <comment xml:lang="gl">vídeo de Matroska</comment>
+ <comment xml:lang="ga">físeán Matroska</comment>
+ <comment xml:lang="fur">video Matroska</comment>
+ <comment xml:lang="fr">vidéo Matroska</comment>
+ <comment xml:lang="fo">Matroska video</comment>
+ <comment xml:lang="fi">Matroska-video</comment>
+ <comment xml:lang="eu">Matroska bideoa</comment>
+ <comment xml:lang="es">vídeo Matroska</comment>
+ <comment xml:lang="eo">Matroska-video</comment>
+ <comment xml:lang="en_GB">Matroska video</comment>
+ <comment xml:lang="el">Βίντεο Matroska</comment>
+ <comment xml:lang="de">Matroska-Video</comment>
+ <comment xml:lang="da">Matroska-video</comment>
+ <comment xml:lang="cs">video Matroska</comment>
+ <comment xml:lang="ca">vídeo Matroska</comment>
+ <comment xml:lang="bg">Видео — Matroska</comment>
+ <comment xml:lang="be@latin">Videa Matroska</comment>
+ <comment xml:lang="be">відэа Matroska</comment>
+ <comment xml:lang="ast">Videu en Matroska</comment>
+ <comment xml:lang="ar">فيديو Matroska</comment>
+ <comment xml:lang="af">Matroska-video</comment>
<glob pattern="*.mkv"/>
<sub-class-of type="application/x-matroska"/>
</mime-type>
<mime-type type="video/x-matroska-3d">
<comment>Matroska 3D video</comment>
- <comment xml:lang="af">Matroska 3D video</comment>
- <comment xml:lang="ast">Videu en Matroska 3D</comment>
- <comment xml:lang="bg">Видео — Matroska 3D</comment>
- <comment xml:lang="ca">vídeo Matroska 3D</comment>
- <comment xml:lang="cs">3D video Matroska</comment>
- <comment xml:lang="da">Matroska 3D-video</comment>
- <comment xml:lang="de">Matroska 3D-Video</comment>
- <comment xml:lang="el">Βίντεο 3Δ Matroska</comment>
- <comment xml:lang="en-GB">Matroska 3D video</comment>
- <comment xml:lang="es">vídeo Matroska en 3D</comment>
- <comment xml:lang="eu">Matroska 3D bideoa</comment>
- <comment xml:lang="fi">Matroska 3D-video</comment>
- <comment xml:lang="fr">vidéo Matroska 3D</comment>
- <comment xml:lang="fur">video 3D Matroska</comment>
- <comment xml:lang="ga">físeán Matroska 3D</comment>
- <comment xml:lang="gl">Video Matroska 3D</comment>
- <comment xml:lang="he">סרטון תלת ממדי מסוג Matroska</comment>
- <comment xml:lang="hr">Matroška 3D video snimka</comment>
- <comment xml:lang="hu">Matroska 3D videó</comment>
- <comment xml:lang="ia">Video 3D Matroska</comment>
- <comment xml:lang="id">Video 3D Matroska</comment>
- <comment xml:lang="it">Video Matroska 3D</comment>
- <comment xml:lang="kk">Matroska 3D видеосы</comment>
- <comment xml:lang="ko">Matroska 3D 동영상</comment>
- <comment xml:lang="oc">vidèo Matroska 3D</comment>
- <comment xml:lang="pl">Plik wideo Matroska 3D</comment>
- <comment xml:lang="pt">vídeo 3D Matroska</comment>
- <comment xml:lang="pt-BR">Vídeo 3D Matroska</comment>
- <comment xml:lang="ru">Видео Matroska 3D</comment>
- <comment xml:lang="sk">3D video Matroska</comment>
- <comment xml:lang="sl">Video datoteka Matroska 3D</comment>
- <comment xml:lang="sr">Матрошкин 3Д видео</comment>
- <comment xml:lang="sv">Matroska 3D-video</comment>
- <comment xml:lang="tr">Matroska 3B video</comment>
+ <comment xml:lang="zh_TW">Matroska 3D 視訊</comment>
+ <comment xml:lang="zh_CN">Matroska 3D 视频</comment>
<comment xml:lang="uk">відеокліп Matroska 3D</comment>
- <comment xml:lang="zh-CN">Matroska 3D 视频</comment>
- <comment xml:lang="zh-TW">Matroska 3D 視訊</comment>
+ <comment xml:lang="tr">Matroska 3B video</comment>
+ <comment xml:lang="sv">Matroska 3D-video</comment>
+ <comment xml:lang="sr">Матрошкин 3Д видео</comment>
+ <comment xml:lang="sq">video Matroska 3D</comment>
+ <comment xml:lang="sl">Video datoteka Matroska 3D</comment>
+ <comment xml:lang="si">Matroska 3D වීඩියෝ</comment>
+ <comment xml:lang="sk">3D video Matroska</comment>
+ <comment xml:lang="ru">Видео Matroska 3D</comment>
+ <comment xml:lang="pt_BR">Vídeo 3D Matroska</comment>
+ <comment xml:lang="pt">vídeo 3D Matroska</comment>
+ <comment xml:lang="pl">Plik wideo Matroska 3D</comment>
+ <comment xml:lang="oc">vidèo Matroska 3D</comment>
+ <comment xml:lang="nl">Matroska-3D-video</comment>
+ <comment xml:lang="ko">Matroska 3D 동영상</comment>
+ <comment xml:lang="kk">Matroska 3D видеосы</comment>
+ <comment xml:lang="ja">Matroska 3D ビデオ</comment>
+ <comment xml:lang="it">Video Matroska 3D</comment>
+ <comment xml:lang="is">Matroska 3D myndskeið</comment>
+ <comment xml:lang="id">Video 3D Matroska</comment>
+ <comment xml:lang="ia">Video 3D Matroska</comment>
+ <comment xml:lang="hu">Matroska 3D videó</comment>
+ <comment xml:lang="hr">Matroška 3D video snimka</comment>
+ <comment xml:lang="he">סרטון תלת ממדי מסוג Matroska</comment>
+ <comment xml:lang="gl">Video Matroska 3D</comment>
+ <comment xml:lang="ga">físeán Matroska 3D</comment>
+ <comment xml:lang="fur">video 3D Matroska</comment>
+ <comment xml:lang="fr">vidéo Matroska 3D</comment>
+ <comment xml:lang="fi">Matroska 3D-video</comment>
+ <comment xml:lang="eu">Matroska 3D bideoa</comment>
+ <comment xml:lang="es">vídeo Matroska en 3D</comment>
+ <comment xml:lang="en_GB">Matroska 3D video</comment>
+ <comment xml:lang="el">Βίντεο 3Δ Matroska</comment>
+ <comment xml:lang="de">Matroska-3D-Video</comment>
+ <comment xml:lang="da">Matroska 3D-video</comment>
+ <comment xml:lang="cs">3D video Matroska</comment>
+ <comment xml:lang="ca">vídeo Matroska 3D</comment>
+ <comment xml:lang="bg">Видео — Matroska 3D</comment>
+ <comment xml:lang="be">відэа Matroska 3D</comment>
+ <comment xml:lang="ast">Videu en Matroska 3D</comment>
+ <comment xml:lang="ar">فيديو Matroska 3D</comment>
+ <comment xml:lang="af">Matroska 3D video</comment>
<glob pattern="*.mk3d"/>
<sub-class-of type="application/x-matroska"/>
</mime-type>
<mime-type type="audio/x-matroska">
<comment>Matroska audio</comment>
- <comment xml:lang="af">Matroska-oudio</comment>
- <comment xml:lang="ar">سمعي Matroska</comment>
- <comment xml:lang="be-Latn">Aŭdyjo Matroska</comment>
- <comment xml:lang="bg">Аудио — Matroska</comment>
- <comment xml:lang="ca">àudio Matroska</comment>
- <comment xml:lang="cs">zvuk Matroska</comment>
- <comment xml:lang="da">Matroska-lyd</comment>
- <comment xml:lang="de">Matroska-Audio</comment>
- <comment xml:lang="el">Ήχος Matroska</comment>
- <comment xml:lang="en-GB">Matroska audio</comment>
- <comment xml:lang="eo">Matroska-sondosiero</comment>
- <comment xml:lang="es">audio Matroska</comment>
- <comment xml:lang="eu">Matroska audioa</comment>
- <comment xml:lang="fi">Matroska-ääni</comment>
- <comment xml:lang="fo">Matroska ljóður</comment>
- <comment xml:lang="fr">audio Matroska</comment>
- <comment xml:lang="fur">audio Matroska</comment>
- <comment xml:lang="ga">fuaim Matroska</comment>
- <comment xml:lang="gl">son de Matroska</comment>
- <comment xml:lang="he">שמע Matroska</comment>
- <comment xml:lang="hr">Matroška zvučni zapis</comment>
- <comment xml:lang="hu">Matroska hang</comment>
- <comment xml:lang="ia">Audio Matroska</comment>
- <comment xml:lang="id">Audio Matroska</comment>
- <comment xml:lang="it">Audio Matroska</comment>
- <comment xml:lang="ja">Matroska オーディオ</comment>
- <comment xml:lang="ka">Matroska-ის აუდიო</comment>
- <comment xml:lang="kk">Matroska аудиосы</comment>
- <comment xml:lang="ko">Matroska 오디오</comment>
- <comment xml:lang="lt">Matroska garso įrašas</comment>
- <comment xml:lang="lv">Matroska audio</comment>
- <comment xml:lang="nb">Matroska-lyd</comment>
- <comment xml:lang="nl">Matroska-audio</comment>
- <comment xml:lang="nn">Matroska-lyd</comment>
- <comment xml:lang="oc">àudio Matroska</comment>
- <comment xml:lang="pl">Plik dźwiękowy Matroska</comment>
- <comment xml:lang="pt">áudio Matroska</comment>
- <comment xml:lang="pt-BR">Áudio Matroska</comment>
- <comment xml:lang="ro">Audio Matroska</comment>
- <comment xml:lang="ru">Аудио Matroska</comment>
- <comment xml:lang="sk">Zvuk Matroska</comment>
- <comment xml:lang="sl">Zvočna datoteka Matroska</comment>
- <comment xml:lang="sq">Audio Matroska</comment>
- <comment xml:lang="sr">Матрошкин звук</comment>
- <comment xml:lang="sv">Matroska-ljud</comment>
- <comment xml:lang="tr">Matroska ses</comment>
- <comment xml:lang="uk">звук Matroska</comment>
+ <comment xml:lang="zh_TW">Matroska 音訊</comment>
+ <comment xml:lang="zh_CN">Matroska 音频</comment>
<comment xml:lang="vi">Âm thanh Matroska</comment>
- <comment xml:lang="zh-CN">Matroska 音频</comment>
- <comment xml:lang="zh-TW">Matroska 音訊</comment>
+ <comment xml:lang="uk">звук Matroska</comment>
+ <comment xml:lang="tr">Matroska ses</comment>
+ <comment xml:lang="sv">Matroska-ljud</comment>
+ <comment xml:lang="sr">Матрошкин звук</comment>
+ <comment xml:lang="sq">audio Matroska</comment>
+ <comment xml:lang="sl">Zvočna datoteka Matroska</comment>
+ <comment xml:lang="si">Matroska ශ්රව්ය</comment>
+ <comment xml:lang="sk">Zvuk Matroska</comment>
+ <comment xml:lang="ru">Аудио Matroska</comment>
+ <comment xml:lang="ro">Audio Matroska</comment>
+ <comment xml:lang="pt_BR">Áudio Matroska</comment>
+ <comment xml:lang="pt">áudio Matroska</comment>
+ <comment xml:lang="pl">Plik dźwiękowy Matroska</comment>
+ <comment xml:lang="oc">àudio Matroska</comment>
+ <comment xml:lang="nn">Matroska-lyd</comment>
+ <comment xml:lang="nl">Matroska-audio</comment>
+ <comment xml:lang="nb">Matroska-lyd</comment>
+ <comment xml:lang="lv">Matroska audio</comment>
+ <comment xml:lang="lt">Matroska garso įrašas</comment>
+ <comment xml:lang="ko">Matroska 오디오</comment>
+ <comment xml:lang="kk">Matroska аудиосы</comment>
+ <comment xml:lang="ka">Matroska-ის აუდიო</comment>
+ <comment xml:lang="ja">Matroska オーディオ</comment>
+ <comment xml:lang="it">Audio Matroska</comment>
+ <comment xml:lang="is">Matroska hljóðskrá</comment>
+ <comment xml:lang="id">Audio Matroska</comment>
+ <comment xml:lang="ia">Audio Matroska</comment>
+ <comment xml:lang="hu">Matroska hang</comment>
+ <comment xml:lang="hr">Matroška zvučni zapis</comment>
+ <comment xml:lang="he">שמע Matroska</comment>
+ <comment xml:lang="gl">son de Matroska</comment>
+ <comment xml:lang="ga">fuaim Matroska</comment>
+ <comment xml:lang="fur">audio Matroska</comment>
+ <comment xml:lang="fr">audio Matroska</comment>
+ <comment xml:lang="fo">Matroska ljóður</comment>
+ <comment xml:lang="fi">Matroska-ääni</comment>
+ <comment xml:lang="eu">Matroska audioa</comment>
+ <comment xml:lang="es">sonido Matroska</comment>
+ <comment xml:lang="eo">Matroska-sondosiero</comment>
+ <comment xml:lang="en_GB">Matroska audio</comment>
+ <comment xml:lang="el">Ήχος Matroska</comment>
+ <comment xml:lang="de">Matroska-Audio</comment>
+ <comment xml:lang="da">Matroska-lyd</comment>
+ <comment xml:lang="cs">zvuk Matroska</comment>
+ <comment xml:lang="ca">àudio Matroska</comment>
+ <comment xml:lang="bg">Аудио — Matroska</comment>
+ <comment xml:lang="be@latin">Aŭdyjo Matroska</comment>
+ <comment xml:lang="be">аўдыя Matroska</comment>
+ <comment xml:lang="ar">صوت Matroska</comment>
+ <comment xml:lang="af">Matroska-oudio</comment>
<glob pattern="*.mka"/>
<sub-class-of type="application/x-matroska"/>
</mime-type>
<mime-type type="video/webm">
<comment>WebM video</comment>
- <comment xml:lang="af">WebM-video</comment>
- <comment xml:lang="ar">WebM مرئي</comment>
- <comment xml:lang="ast">Videu en WebM</comment>
- <comment xml:lang="bg">Видео — WebM</comment>
- <comment xml:lang="ca">vídeo WebM</comment>
- <comment xml:lang="cs">video WebM</comment>
- <comment xml:lang="da">WebM-video</comment>
- <comment xml:lang="de">WebM-Video</comment>
- <comment xml:lang="el">Βίντεο WebM</comment>
- <comment xml:lang="en-GB">WebM video</comment>
- <comment xml:lang="eo">WebM-video</comment>
- <comment xml:lang="es">vídeo WebM</comment>
- <comment xml:lang="eu">WebM bideoa</comment>
- <comment xml:lang="fi">WebM-video</comment>
- <comment xml:lang="fo">WebM video</comment>
- <comment xml:lang="fr">vidéo WebM</comment>
- <comment xml:lang="fur">video WebM</comment>
- <comment xml:lang="ga">físeán WebM</comment>
- <comment xml:lang="gl">vídeo WebM</comment>
- <comment xml:lang="he">וידאו WebM</comment>
- <comment xml:lang="hr">WebM video snimka</comment>
- <comment xml:lang="hu">WebM videó</comment>
- <comment xml:lang="ia">Video WebM</comment>
- <comment xml:lang="id">Video WebM</comment>
- <comment xml:lang="it">Video WebM</comment>
- <comment xml:lang="ja">WebM 動画</comment>
- <comment xml:lang="kk">WebM видеосы</comment>
- <comment xml:lang="ko">WebM 동영상</comment>
- <comment xml:lang="lt">WebM vaizdo įrašas</comment>
- <comment xml:lang="lv">WebM video</comment>
- <comment xml:lang="nl">WebM video</comment>
- <comment xml:lang="oc">vidèo WebM</comment>
- <comment xml:lang="pl">Plik wideo WebM</comment>
- <comment xml:lang="pt">vídeo WebM</comment>
- <comment xml:lang="pt-BR">Vídeo WebM</comment>
- <comment xml:lang="ro">Video WebM</comment>
- <comment xml:lang="ru">Видео WebM</comment>
- <comment xml:lang="sk">Video WebM</comment>
- <comment xml:lang="sl">Video datoteka WebM</comment>
- <comment xml:lang="sr">ВебМ видео</comment>
- <comment xml:lang="sv">WebM-video</comment>
- <comment xml:lang="tr">WebM video</comment>
+ <comment xml:lang="zh_TW">WebM 視訊</comment>
+ <comment xml:lang="zh_CN">WebM 视频</comment>
<comment xml:lang="uk">відео WebM</comment>
- <comment xml:lang="zh-CN">WebM 视频</comment>
- <comment xml:lang="zh-TW">WebM 視訊</comment>
+ <comment xml:lang="tr">WebM video</comment>
+ <comment xml:lang="sv">WebM-video</comment>
+ <comment xml:lang="sr">ВебМ видео</comment>
+ <comment xml:lang="sq">audio WebM</comment>
+ <comment xml:lang="sl">Video datoteka WebM</comment>
+ <comment xml:lang="si">WebM වීඩියෝව</comment>
+ <comment xml:lang="sk">Video WebM</comment>
+ <comment xml:lang="ru">Видео WebM</comment>
+ <comment xml:lang="ro">Video WebM</comment>
+ <comment xml:lang="pt_BR">Vídeo WebM</comment>
+ <comment xml:lang="pt">vídeo WebM</comment>
+ <comment xml:lang="pl">Plik wideo WebM</comment>
+ <comment xml:lang="oc">vidèo WebM</comment>
+ <comment xml:lang="nl">WebM-video</comment>
+ <comment xml:lang="lv">WebM video</comment>
+ <comment xml:lang="lt">WebM vaizdo įrašas</comment>
+ <comment xml:lang="ko">WebM 동영상</comment>
+ <comment xml:lang="kk">WebM видеосы</comment>
+ <comment xml:lang="ja">WebM 動画</comment>
+ <comment xml:lang="it">Video WebM</comment>
+ <comment xml:lang="is">WebM myndskeið</comment>
+ <comment xml:lang="id">Video WebM</comment>
+ <comment xml:lang="ia">Video WebM</comment>
+ <comment xml:lang="hu">WebM videó</comment>
+ <comment xml:lang="hr">WebM video snimka</comment>
+ <comment xml:lang="he">וידאו WebM</comment>
+ <comment xml:lang="gl">vídeo WebM</comment>
+ <comment xml:lang="ga">físeán WebM</comment>
+ <comment xml:lang="fur">video WebM</comment>
+ <comment xml:lang="fr">vidéo WebM</comment>
+ <comment xml:lang="fo">WebM video</comment>
+ <comment xml:lang="fi">WebM-video</comment>
+ <comment xml:lang="eu">WebM bideoa</comment>
+ <comment xml:lang="es">vídeo WebM</comment>
+ <comment xml:lang="eo">WebM-video</comment>
+ <comment xml:lang="en_GB">WebM video</comment>
+ <comment xml:lang="el">Βίντεο WebM</comment>
+ <comment xml:lang="de">WebM-Video</comment>
+ <comment xml:lang="da">WebM-video</comment>
+ <comment xml:lang="cs">video WebM</comment>
+ <comment xml:lang="ca">vídeo WebM</comment>
+ <comment xml:lang="bg">Видео — WebM</comment>
+ <comment xml:lang="be">відэа WebM</comment>
+ <comment xml:lang="ast">Videu en WebM</comment>
+ <comment xml:lang="ar">فيديو WebM</comment>
+ <comment xml:lang="af">WebM-video</comment>
<glob pattern="*.webm"/>
- <magic priority="50">
+ <magic>
<!-- EBML ID -->
<match type="big32" value="0x1a45dfa3" offset="0">
<!-- DocumentType ID -->
@@ -16421,92 +17201,102 @@ command to generate the output files.
</mime-type>
<mime-type type="audio/webm">
<comment>WebM audio</comment>
- <comment xml:lang="af">WebM-oudio</comment>
- <comment xml:lang="ar">WebM سمعي</comment>
- <comment xml:lang="bg">Аудио — WebM</comment>
- <comment xml:lang="ca">àudio WebM</comment>
- <comment xml:lang="cs">zvuk WebM</comment>
- <comment xml:lang="da">WebM-lyd</comment>
- <comment xml:lang="de">WebM-Audio</comment>
- <comment xml:lang="el">Ήχος WebM</comment>
- <comment xml:lang="en-GB">WebM audio</comment>
- <comment xml:lang="eo">WebM-sondosiero</comment>
- <comment xml:lang="es">audio WebM</comment>
- <comment xml:lang="eu">WebM audioa</comment>
- <comment xml:lang="fi">WebM-ääni</comment>
- <comment xml:lang="fo">WebM ljóður</comment>
- <comment xml:lang="fr">audio WebM</comment>
- <comment xml:lang="fur">audio WebM</comment>
- <comment xml:lang="ga">fuaim WebM</comment>
- <comment xml:lang="gl">son WebM</comment>
- <comment xml:lang="he">שמע WebM</comment>
- <comment xml:lang="hr">WebM zvučni zapis</comment>
- <comment xml:lang="hu">WebM hang</comment>
- <comment xml:lang="ia">Audio WebM</comment>
- <comment xml:lang="id">Audio WebM</comment>
- <comment xml:lang="it">Audio WebM</comment>
- <comment xml:lang="ja">WebM オーディオ</comment>
- <comment xml:lang="kk">WebM аудиосы</comment>
- <comment xml:lang="ko">WebM 오디오</comment>
- <comment xml:lang="lt">WebM garso įrašas</comment>
- <comment xml:lang="lv">WebM audio</comment>
- <comment xml:lang="nl">WebM audio</comment>
- <comment xml:lang="oc">àudio WebM</comment>
- <comment xml:lang="pl">Plik dźwiękowy WebM</comment>
- <comment xml:lang="pt">áudio WebM</comment>
- <comment xml:lang="pt-BR">Áudio WebM</comment>
- <comment xml:lang="ro">Audio WebM</comment>
- <comment xml:lang="ru">Аудио WebM</comment>
- <comment xml:lang="sk">Zvuk WebM</comment>
- <comment xml:lang="sl">Zvočna datoteka WebM</comment>
- <comment xml:lang="sr">ВебМ звук</comment>
- <comment xml:lang="sv">WebM-ljud</comment>
- <comment xml:lang="tr">WebM sesi</comment>
+ <comment xml:lang="zh_TW">WebM 音訊</comment>
+ <comment xml:lang="zh_CN">WebM 音频</comment>
<comment xml:lang="uk">звук WebM</comment>
- <comment xml:lang="zh-CN">WebM 音频</comment>
- <comment xml:lang="zh-TW">WebM 音訊</comment>
+ <comment xml:lang="tr">WebM sesi</comment>
+ <comment xml:lang="sv">WebM-ljud</comment>
+ <comment xml:lang="sr">ВебМ звук</comment>
+ <comment xml:lang="sq">audio WebM</comment>
+ <comment xml:lang="sl">Zvočna datoteka WebM</comment>
+ <comment xml:lang="si">WebM ශ්‍රව්‍ය</comment>
+ <comment xml:lang="sk">Zvuk WebM</comment>
+ <comment xml:lang="ru">Аудио WebM</comment>
+ <comment xml:lang="ro">Audio WebM</comment>
+ <comment xml:lang="pt_BR">Áudio WebM</comment>
+ <comment xml:lang="pt">áudio WebM</comment>
+ <comment xml:lang="pl">Plik dźwiękowy WebM</comment>
+ <comment xml:lang="oc">àudio WebM</comment>
+ <comment xml:lang="nl">WebM-audio</comment>
+ <comment xml:lang="lv">WebM audio</comment>
+ <comment xml:lang="lt">WebM garso įrašas</comment>
+ <comment xml:lang="ko">WebM 오디오</comment>
+ <comment xml:lang="kk">WebM аудиосы</comment>
+ <comment xml:lang="ja">WebM オーディオ</comment>
+ <comment xml:lang="it">Audio WebM</comment>
+ <comment xml:lang="is">WebM hljóðskrá</comment>
+ <comment xml:lang="id">Audio WebM</comment>
+ <comment xml:lang="ia">Audio WebM</comment>
+ <comment xml:lang="hu">WebM hang</comment>
+ <comment xml:lang="hr">WebM zvučni zapis</comment>
+ <comment xml:lang="he">שמע WebM</comment>
+ <comment xml:lang="gl">son WebM</comment>
+ <comment xml:lang="ga">fuaim WebM</comment>
+ <comment xml:lang="fur">audio WebM</comment>
+ <comment xml:lang="fr">audio WebM</comment>
+ <comment xml:lang="fo">WebM ljóður</comment>
+ <comment xml:lang="fi">WebM-ääni</comment>
+ <comment xml:lang="eu">WebM audioa</comment>
+ <comment xml:lang="es">sonido WebM</comment>
+ <comment xml:lang="eo">WebM-sondosiero</comment>
+ <comment xml:lang="en_GB">WebM audio</comment>
+ <comment xml:lang="el">Ήχος WebM</comment>
+ <comment xml:lang="de">WebM-Audio</comment>
+ <comment xml:lang="da">WebM-lyd</comment>
+ <comment xml:lang="cs">zvuk WebM</comment>
+ <comment xml:lang="ca">àudio WebM</comment>
+ <comment xml:lang="bg">Аудио — WebM</comment>
+ <comment xml:lang="be">аўдыя WebM</comment>
+ <comment xml:lang="ar">صوت WebM</comment>
+ <comment xml:lang="af">WebM-oudio</comment>
<sub-class-of type="video/webm"/>
</mime-type>
<mime-type type="application/x-mimearchive">
<comment>MHTML web archive</comment>
- <comment xml:lang="af">MHTML-webargief</comment>
- <comment xml:lang="bg">Архив — MHTML</comment>
- <comment xml:lang="ca">arxiu web MHTML</comment>
- <comment xml:lang="cs">webový archiv MHTML</comment>
- <comment xml:lang="da">MHTML-webarkiv</comment>
- <comment xml:lang="de">MHTML-Webarchiv</comment>
- <comment xml:lang="el">Συμπιεσμένο αρχείο ιστού MHTML</comment>
- <comment xml:lang="en-GB">MHTML web archive</comment>
- <comment xml:lang="es">archivador web MHTML</comment>
- <comment xml:lang="eu">MHTML web artxiboa</comment>
- <comment xml:lang="fi">MHTML-kooste</comment>
- <comment xml:lang="fr">archive web MHTML</comment>
- <comment xml:lang="fur">archivi web MHTML</comment>
- <comment xml:lang="ga">cartlann ghréasáin MHTML</comment>
- <comment xml:lang="gl">Arquivo web MHTML</comment>
- <comment xml:lang="he">ארכיון רשת MHTML</comment>
- <comment xml:lang="hr">MHTML web arhiva</comment>
- <comment xml:lang="hu">MHTML webarchívum</comment>
- <comment xml:lang="ia">Archivo web MHTML</comment>
- <comment xml:lang="id">Arsip web MHTML</comment>
- <comment xml:lang="it">Archivio web MHTML</comment>
- <comment xml:lang="ja">MHTML Web アーカイブ</comment>
- <comment xml:lang="kk">MHTML веб архиві</comment>
- <comment xml:lang="ko">MHTML 웹 보관 파일</comment>
- <comment xml:lang="lv">MHTML tīmekļa arhīvs</comment>
- <comment xml:lang="oc">archiu web MHTML</comment>
- <comment xml:lang="pl">Archiwum witryny MHTML</comment>
- <comment xml:lang="pt">arquivo web MHTML</comment>
- <comment xml:lang="pt-BR">Pacote web MHTML</comment>
- <comment xml:lang="ru">Веб-архив MHTML</comment>
- <comment xml:lang="sk">Webový archív MHTML</comment>
- <comment xml:lang="sl">Spletni arhiv MHTML</comment>
- <comment xml:lang="sr">МХТМЛ веб архива</comment>
- <comment xml:lang="sv">MHTML-webbarkiv</comment>
- <comment xml:lang="tr">MHTML web arşivi</comment>
+ <comment xml:lang="zh_TW">MHTML 網頁封存檔</comment>
+ <comment xml:lang="zh_CN">MHTML 网络归档</comment>
<comment xml:lang="uk">вебархів MHTML</comment>
- <comment xml:lang="zh-CN">MHTML 网络归档</comment>
- <comment xml:lang="zh-TW">MHTML 網頁封存檔</comment>
+ <comment xml:lang="tr">MHTML web arşivi</comment>
+ <comment xml:lang="sv">MHTML-webbarkiv</comment>
+ <comment xml:lang="sr">МХТМЛ веб архива</comment>
+ <comment xml:lang="sq">arkiv web MHTML</comment>
+ <comment xml:lang="sl">Spletni arhiv MHTML</comment>
+ <comment xml:lang="si">MHTML වෙබ් සංරක්ෂිතය</comment>
+ <comment xml:lang="sk">Webový archív MHTML</comment>
+ <comment xml:lang="ru">Веб-архив MHTML</comment>
+ <comment xml:lang="pt_BR">Pacote web MHTML</comment>
+ <comment xml:lang="pt">arquivo web MHTML</comment>
+ <comment xml:lang="pl">Archiwum witryny MHTML</comment>
+ <comment xml:lang="oc">archiu web MHTML</comment>
+ <comment xml:lang="nl">MHTML-webarchief</comment>
+ <comment xml:lang="lv">MHTML tīmekļa arhīvs</comment>
+ <comment xml:lang="ko">MHTML 웹 보관 파일</comment>
+ <comment xml:lang="kk">MHTML веб архиві</comment>
+ <comment xml:lang="ja">MHTML Web アーカイブ</comment>
+ <comment xml:lang="it">Archivio web MHTML</comment>
+ <comment xml:lang="is">MHTML vefsafnskrá</comment>
+ <comment xml:lang="id">Arsip web MHTML</comment>
+ <comment xml:lang="ia">Archivo web MHTML</comment>
+ <comment xml:lang="hu">MHTML webarchívum</comment>
+ <comment xml:lang="hr">MHTML web arhiva</comment>
+ <comment xml:lang="he">ארכיון רשת MHTML</comment>
+ <comment xml:lang="gl">Arquivo web MHTML</comment>
+ <comment xml:lang="ga">cartlann ghréasáin MHTML</comment>
+ <comment xml:lang="fur">archivi web MHTML</comment>
+ <comment xml:lang="fr">archive web MHTML</comment>
+ <comment xml:lang="fi">MHTML-kooste</comment>
+ <comment xml:lang="eu">MHTML web artxiboa</comment>
+ <comment xml:lang="es">archivador web MHTML</comment>
+ <comment xml:lang="en_GB">MHTML web archive</comment>
+ <comment xml:lang="el">Συμπιεσμένο αρχείο ιστού MHTML</comment>
+ <comment xml:lang="de">MHTML-Webarchiv</comment>
+ <comment xml:lang="da">MHTML-webarkiv</comment>
+ <comment xml:lang="cs">webový archiv MHTML</comment>
+ <comment xml:lang="ca">arxiu web MHTML</comment>
+ <comment xml:lang="bg">Архив — MHTML</comment>
+ <comment xml:lang="be">вэб-архіў MHTML</comment>
+ <comment xml:lang="ar">أرشيف ويب MHTML</comment>
+ <comment xml:lang="af">MHTML-webargief</comment>
<acronym>MHTML</acronym>
<expanded-acronym>MIME HTML</expanded-acronym>
<glob pattern="*.mhtml"/>
@@ -16515,111 +17305,118 @@ command to generate the output files.
</mime-type>
<mime-type type="application/mxf">
<comment>MXF video</comment>
- <comment xml:lang="af">MXF-video</comment>
- <comment xml:lang="ar">MXF مرئي</comment>
- <comment xml:lang="ast">Videu en MXF</comment>
- <comment xml:lang="bg">Видео — MXF</comment>
- <comment xml:lang="ca">vídeo MXF</comment>
- <comment xml:lang="cs">video MXF</comment>
- <comment xml:lang="da">MXF-video</comment>
- <comment xml:lang="de">MXF-Video</comment>
- <comment xml:lang="el">Βίντεο MXF</comment>
- <comment xml:lang="en-GB">MXF video</comment>
- <comment xml:lang="eo">MXF-video</comment>
- <comment xml:lang="es">vídeo MXF</comment>
- <comment xml:lang="eu">MXF bideoa</comment>
- <comment xml:lang="fi">MXF-video</comment>
- <comment xml:lang="fo">MXF video</comment>
- <comment xml:lang="fr">vidéo MXF</comment>
- <comment xml:lang="fur">video MXF</comment>
- <comment xml:lang="ga">físeán MXF</comment>
- <comment xml:lang="gl">vídeo MXF</comment>
- <comment xml:lang="he">וידאו MXF</comment>
- <comment xml:lang="hr">MXF video snimka</comment>
- <comment xml:lang="hu">MXF videó</comment>
- <comment xml:lang="ia">Video MXF</comment>
- <comment xml:lang="id">Video MXF</comment>
- <comment xml:lang="it">Video MXF</comment>
- <comment xml:lang="ja">MXF 動画</comment>
- <comment xml:lang="ka">MXF ვიდეო</comment>
- <comment xml:lang="kk">MXF видеосы</comment>
- <comment xml:lang="ko">MXF 동영상</comment>
- <comment xml:lang="lt">MXF vaizdo įrašas</comment>
- <comment xml:lang="lv">MXF video</comment>
- <comment xml:lang="nl">MXF video</comment>
- <comment xml:lang="oc">vidèo MXF</comment>
- <comment xml:lang="pl">Plik wideo MXF</comment>
- <comment xml:lang="pt">vídeo MXF</comment>
- <comment xml:lang="pt-BR">Vídeo MXF</comment>
- <comment xml:lang="ro">Video MXF</comment>
- <comment xml:lang="ru">Видео MXF</comment>
- <comment xml:lang="sk">Video MXF</comment>
- <comment xml:lang="sl">Video datoteka MXF</comment>
- <comment xml:lang="sr">МИксФ видео</comment>
- <comment xml:lang="sv">MXF-video</comment>
- <comment xml:lang="tr">MXF video</comment>
+ <comment xml:lang="zh_TW">MXF 視訊</comment>
+ <comment xml:lang="zh_CN">MXF 视频</comment>
<comment xml:lang="uk">відеокліп MXF</comment>
- <comment xml:lang="zh-CN">MXF 视频</comment>
- <comment xml:lang="zh-TW">MXF 視訊</comment>
+ <comment xml:lang="tr">MXF video</comment>
+ <comment xml:lang="sv">MXF-video</comment>
+ <comment xml:lang="sr">МИксФ видео</comment>
+ <comment xml:lang="sq">video MXF</comment>
+ <comment xml:lang="sl">Video datoteka MXF</comment>
+ <comment xml:lang="si">MXF වීඩියෝව</comment>
+ <comment xml:lang="sk">Video MXF</comment>
+ <comment xml:lang="ru">Видео MXF</comment>
+ <comment xml:lang="ro">Video MXF</comment>
+ <comment xml:lang="pt_BR">Vídeo MXF</comment>
+ <comment xml:lang="pt">vídeo MXF</comment>
+ <comment xml:lang="pl">Plik wideo MXF</comment>
+ <comment xml:lang="oc">vidèo MXF</comment>
+ <comment xml:lang="nl">MXF-video</comment>
+ <comment xml:lang="lv">MXF video</comment>
+ <comment xml:lang="lt">MXF vaizdo įrašas</comment>
+ <comment xml:lang="ko">MXF 동영상</comment>
+ <comment xml:lang="kk">MXF видеосы</comment>
+ <comment xml:lang="ka">MXF ვიდეო</comment>
+ <comment xml:lang="ja">MXF 動画</comment>
+ <comment xml:lang="it">Video MXF</comment>
+ <comment xml:lang="is">MXF myndskeið</comment>
+ <comment xml:lang="id">Video MXF</comment>
+ <comment xml:lang="ia">Video MXF</comment>
+ <comment xml:lang="hu">MXF videó</comment>
+ <comment xml:lang="hr">MXF video snimka</comment>
+ <comment xml:lang="he">וידאו MXF</comment>
+ <comment xml:lang="gl">vídeo MXF</comment>
+ <comment xml:lang="ga">físeán MXF</comment>
+ <comment xml:lang="fur">video MXF</comment>
+ <comment xml:lang="fr">vidéo MXF</comment>
+ <comment xml:lang="fo">MXF video</comment>
+ <comment xml:lang="fi">MXF-video</comment>
+ <comment xml:lang="eu">MXF bideoa</comment>
+ <comment xml:lang="es">vídeo MXF</comment>
+ <comment xml:lang="eo">MXF-video</comment>
+ <comment xml:lang="en_GB">MXF video</comment>
+ <comment xml:lang="el">Βίντεο MXF</comment>
+ <comment xml:lang="de">MXF-Video</comment>
+ <comment xml:lang="da">MXF-video</comment>
+ <comment xml:lang="cs">video MXF</comment>
+ <comment xml:lang="ca">vídeo MXF</comment>
+ <comment xml:lang="bg">Видео — MXF</comment>
+ <comment xml:lang="be">відэа MXF</comment>
+ <comment xml:lang="ast">Videu en MXF</comment>
+ <comment xml:lang="ar">فيديو MXF</comment>
+ <comment xml:lang="af">MXF-video</comment>
<acronym>MXF</acronym>
<expanded-acronym>Material Exchange Format</expanded-acronym>
<generic-icon name="video-x-generic"/>
- <magic priority="50">
+ <magic>
<match type="string" value="\x06\x0e\x2b\x34\x02\x05\x01\x01\x0d\x01\x02\x01\x01\x02" offset="0:256"/>
</magic>
<glob pattern="*.mxf"/>
</mime-type>
<mime-type type="text/x-ocl">
<comment>OCL file</comment>
- <comment xml:lang="af">OCL-lêer</comment>
- <comment xml:lang="ar">ملف OCL</comment>
- <comment xml:lang="be-Latn">Fajł OCL</comment>
- <comment xml:lang="bg">Файл — OCL</comment>
- <comment xml:lang="ca">fitxer OCL</comment>
- <comment xml:lang="cs">soubor OCL</comment>
- <comment xml:lang="da">OCL-fil</comment>
- <comment xml:lang="de">OCL-Datei</comment>
- <comment xml:lang="el">Αρχείο OCL</comment>
- <comment xml:lang="en-GB">OCL file</comment>
- <comment xml:lang="eo">OCL-dosiero</comment>
- <comment xml:lang="es">archivo OCL</comment>
- <comment xml:lang="eu">OCL fitxategia</comment>
- <comment xml:lang="fi">OCL-tiedosto</comment>
- <comment xml:lang="fo">OCL fíla</comment>
- <comment xml:lang="fr">fichier OCL</comment>
- <comment xml:lang="fur">file OCL</comment>
- <comment xml:lang="ga">comhad OCL</comment>
- <comment xml:lang="gl">ficheiro OCL</comment>
- <comment xml:lang="he">קובץ OCL</comment>
- <comment xml:lang="hr">OCL datoteka</comment>
- <comment xml:lang="hu">OCL fájl</comment>
- <comment xml:lang="ia">File OCL</comment>
- <comment xml:lang="id">Berkas OCL</comment>
- <comment xml:lang="it">File OCL</comment>
- <comment xml:lang="ja">OCL ファイル</comment>
- <comment xml:lang="kk">OCL файлы</comment>
- <comment xml:lang="ko">OCL 파일</comment>
- <comment xml:lang="lt">OCL failas</comment>
- <comment xml:lang="lv">OCL datne</comment>
- <comment xml:lang="nb">OCL-fil</comment>
- <comment xml:lang="nl">OCL-bestand</comment>
- <comment xml:lang="nn">OCL-fil</comment>
- <comment xml:lang="oc">fichièr OCL</comment>
- <comment xml:lang="pl">Plik OCL</comment>
- <comment xml:lang="pt">ficheiro OCL</comment>
- <comment xml:lang="pt-BR">Arquivo OCL</comment>
- <comment xml:lang="ro">Fișier OCL</comment>
- <comment xml:lang="ru">Файл OCL</comment>
- <comment xml:lang="sk">Súbor OCL</comment>
- <comment xml:lang="sl">Datoteka OCL</comment>
- <comment xml:lang="sq">File OCL</comment>
- <comment xml:lang="sr">ОЦЛ датотека</comment>
- <comment xml:lang="sv">OCL-fil</comment>
- <comment xml:lang="tr">OCL dosyası</comment>
- <comment xml:lang="uk">файл OCL</comment>
+ <comment xml:lang="zh_TW">OCL 檔</comment>
+ <comment xml:lang="zh_CN">OCL 文件</comment>
<comment xml:lang="vi">Tập tin OCL</comment>
- <comment xml:lang="zh-CN">OCL 文件</comment>
- <comment xml:lang="zh-TW">OCL 檔</comment>
+ <comment xml:lang="uk">файл OCL</comment>
+ <comment xml:lang="tr">OCL dosyası</comment>
+ <comment xml:lang="sv">OCL-fil</comment>
+ <comment xml:lang="sr">ОЦЛ датотека</comment>
+ <comment xml:lang="sq">kartelë OCL</comment>
+ <comment xml:lang="sl">Datoteka OCL</comment>
+ <comment xml:lang="si">OCL ගොනුව</comment>
+ <comment xml:lang="sk">Súbor OCL</comment>
+ <comment xml:lang="ru">Файл OCL</comment>
+ <comment xml:lang="ro">Fișier OCL</comment>
+ <comment xml:lang="pt_BR">Arquivo OCL</comment>
+ <comment xml:lang="pt">ficheiro OCL</comment>
+ <comment xml:lang="pl">Plik OCL</comment>
+ <comment xml:lang="oc">fichièr OCL</comment>
+ <comment xml:lang="nn">OCL-fil</comment>
+ <comment xml:lang="nl">OCL-bestand</comment>
+ <comment xml:lang="nb">OCL-fil</comment>
+ <comment xml:lang="lv">OCL datne</comment>
+ <comment xml:lang="lt">OCL failas</comment>
+ <comment xml:lang="ko">OCL 파일</comment>
+ <comment xml:lang="kk">OCL файлы</comment>
+ <comment xml:lang="ja">OCL ファイル</comment>
+ <comment xml:lang="it">File OCL</comment>
+ <comment xml:lang="is">OCL skrá</comment>
+ <comment xml:lang="id">Berkas OCL</comment>
+ <comment xml:lang="ia">File OCL</comment>
+ <comment xml:lang="hu">OCL fájl</comment>
+ <comment xml:lang="hr">OCL datoteka</comment>
+ <comment xml:lang="he">קובץ OCL</comment>
+ <comment xml:lang="gl">ficheiro OCL</comment>
+ <comment xml:lang="ga">comhad OCL</comment>
+ <comment xml:lang="fur">file OCL</comment>
+ <comment xml:lang="fr">fichier OCL</comment>
+ <comment xml:lang="fo">OCL fíla</comment>
+ <comment xml:lang="fi">OCL-tiedosto</comment>
+ <comment xml:lang="eu">OCL fitxategia</comment>
+ <comment xml:lang="es">archivo OCL</comment>
+ <comment xml:lang="eo">OCL-dosiero</comment>
+ <comment xml:lang="en_GB">OCL file</comment>
+ <comment xml:lang="el">Αρχείο OCL</comment>
+ <comment xml:lang="de">OCL-Datei</comment>
+ <comment xml:lang="da">OCL-fil</comment>
+ <comment xml:lang="cs">soubor OCL</comment>
+ <comment xml:lang="ca">fitxer OCL</comment>
+ <comment xml:lang="bg">Файл — OCL</comment>
+ <comment xml:lang="be@latin">Fajł OCL</comment>
+ <comment xml:lang="be">файл OCL</comment>
+ <comment xml:lang="ar">ملف OCL</comment>
+ <comment xml:lang="af">OCL-lêer</comment>
<acronym>OCL</acronym>
<expanded-acronym>Object Constraint Language</expanded-acronym>
<sub-class-of type="text/plain"/>
@@ -16627,30 +17424,41 @@ command to generate the output files.
</mime-type>
<mime-type type="text/x-cobol">
<comment>COBOL source code</comment>
- <comment xml:lang="bg">Изходен код — COBOL</comment>
- <comment xml:lang="ca">codi font en COBOL</comment>
- <comment xml:lang="da">COBOL-kildekode</comment>
- <comment xml:lang="de">COBOL-Quelltext</comment>
- <comment xml:lang="en-GB">COBOL source code</comment>
- <comment xml:lang="es">código fuente en COBOL</comment>
- <comment xml:lang="eu">COBOL iturburu-kodea</comment>
- <comment xml:lang="fi">COBOL-lähdekoodi</comment>
- <comment xml:lang="fr">code source COBOL</comment>
- <comment xml:lang="hr">COBOL izvorni kôd</comment>
- <comment xml:lang="hu">COBOL forráskód</comment>
- <comment xml:lang="id">Kode sumber COBOL</comment>
- <comment xml:lang="it">Codice sorgente COBOL</comment>
- <comment xml:lang="kk">COBOL бастапқы коды</comment>
- <comment xml:lang="ko">코볼 소스 코드</comment>
- <comment xml:lang="pl">Kod źródłowy COBOL</comment>
- <comment xml:lang="pt-BR">Código-fonte COBOL</comment>
- <comment xml:lang="ru">Исходный код COBOL</comment>
- <comment xml:lang="sk">Zdrojový kód COBOL</comment>
- <comment xml:lang="sv">COBOL-källkod</comment>
+ <comment xml:lang="zh_TW">COBOL 原始碼</comment>
+ <comment xml:lang="zh_CN">COBOL 源代码</comment>
+ <comment xml:lang="uk">початковий код мовою COBOL</comment>
<comment xml:lang="tr">COBOL kaynak kodu</comment>
- <comment xml:lang="uk">вихідний код мовою COBOL</comment>
- <comment xml:lang="zh-CN">COBOL 源代码</comment>
- <comment xml:lang="zh-TW">COBOL 原始碼</comment>
+ <comment xml:lang="sv">COBOL-källkod</comment>
+ <comment xml:lang="sq">kod burim COBOL</comment>
+ <comment xml:lang="sl">Izvorna koda COBOL</comment>
+ <comment xml:lang="si">COBOL මූල කේතය</comment>
+ <comment xml:lang="sk">Zdrojový kód COBOL</comment>
+ <comment xml:lang="ru">Исходный код COBOL</comment>
+ <comment xml:lang="pt_BR">Código-fonte COBOL</comment>
+ <comment xml:lang="pl">Kod źródłowy COBOL</comment>
+ <comment xml:lang="oc">còdi font COBOL</comment>
+ <comment xml:lang="nl">COBOL-broncode</comment>
+ <comment xml:lang="ko">코볼 소스 코드</comment>
+ <comment xml:lang="kk">COBOL бастапқы коды</comment>
+ <comment xml:lang="ja">COBOL ソースコード</comment>
+ <comment xml:lang="it">Codice sorgente COBOL</comment>
+ <comment xml:lang="is">COBOL frumkóði</comment>
+ <comment xml:lang="id">Kode sumber COBOL</comment>
+ <comment xml:lang="hu">COBOL forráskód</comment>
+ <comment xml:lang="hr">COBOL izvorni kôd</comment>
+ <comment xml:lang="he">קוד מקור COBOL</comment>
+ <comment xml:lang="gl">Código fonte en COBOL</comment>
+ <comment xml:lang="fr">code source COBOL</comment>
+ <comment xml:lang="fi">COBOL-lähdekoodi</comment>
+ <comment xml:lang="eu">COBOL iturburu-kodea</comment>
+ <comment xml:lang="es">código fuente en COBOL</comment>
+ <comment xml:lang="en_GB">COBOL source code</comment>
+ <comment xml:lang="de">COBOL-Quelltext</comment>
+ <comment xml:lang="da">COBOL-kildekode</comment>
+ <comment xml:lang="ca">codi font en COBOL</comment>
+ <comment xml:lang="bg">Изходен код — COBOL</comment>
+ <comment xml:lang="be">зыходны код COBOL</comment>
+ <comment xml:lang="ar">شيفرة مصدر كوبول</comment>
<acronym>COBOL</acronym>
<expanded-acronym>COmmon Business Oriented Language</expanded-acronym>
<sub-class-of type="text/plain"/>
@@ -16659,46 +17467,51 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-mobipocket-ebook">
<comment>Mobipocket e-book</comment>
- <comment xml:lang="af">Mobipocket e-boek</comment>
- <comment xml:lang="bg">Е-книга — Mobipocket</comment>
- <comment xml:lang="ca">llibre electrònic Mobipocket </comment>
- <comment xml:lang="cs">elektronická kniha Mobipocket</comment>
- <comment xml:lang="da">Mobipocket e-bog</comment>
- <comment xml:lang="de">Mobipocket E-Book</comment>
- <comment xml:lang="el">Ηλεκτρονικό βιβλίο Mobipocket</comment>
- <comment xml:lang="en-GB">Mobipocket e-book</comment>
- <comment xml:lang="es">libro electrónico de Mobipocket</comment>
- <comment xml:lang="eu">Mobipocket liburua</comment>
- <comment xml:lang="fi">Mobipocket e-kirja</comment>
- <comment xml:lang="fr">livre numérique Mobipocket</comment>
- <comment xml:lang="fur">e-book Mobipocket</comment>
- <comment xml:lang="ga">r-leabhar Mobipocket</comment>
- <comment xml:lang="gl">E-book Mobipocket</comment>
- <comment xml:lang="he">ספר אלקטרוני של Mobipocket</comment>
- <comment xml:lang="hr">Mobipocket e-knjiga</comment>
- <comment xml:lang="hu">Mobipocket e-könyv</comment>
- <comment xml:lang="ia">E-libro Mobipocket</comment>
- <comment xml:lang="id">E-book Mobipocket</comment>
- <comment xml:lang="it">E-book Mobipocket</comment>
- <comment xml:lang="ja">Mobipocket 電子書籍</comment>
- <comment xml:lang="ka">Mobipocket-ის ელწიგნი</comment>
- <comment xml:lang="kk">Mobipocket эл. кітабы</comment>
- <comment xml:lang="ko">Mobipocket 전자책</comment>
- <comment xml:lang="lv">Mobipocket e-grāmata</comment>
- <comment xml:lang="nl">Mobipocket e-book</comment>
- <comment xml:lang="oc">libre numeric Mobipocket</comment>
- <comment xml:lang="pl">E-book Mobipocket</comment>
- <comment xml:lang="pt">ebook Mobipocket</comment>
- <comment xml:lang="pt-BR">E-book Mobipocket</comment>
- <comment xml:lang="ru">Электронная книга Mobipocket</comment>
- <comment xml:lang="sk">E-kniha Mobipocket</comment>
- <comment xml:lang="sl">e-knjiga Mobipocket</comment>
- <comment xml:lang="sr">Мобипокет ел. књига</comment>
- <comment xml:lang="sv">Mobipocket-e-bok</comment>
- <comment xml:lang="tr">Mobipocket e-kitap</comment>
+ <comment xml:lang="zh_TW">Mobipocket e-book</comment>
+ <comment xml:lang="zh_CN">Mobipocket 电子书</comment>
<comment xml:lang="uk">електронна книга Mobipocket</comment>
- <comment xml:lang="zh-CN">Mobipocket 电子书</comment>
- <comment xml:lang="zh-TW">Mobipocket e-book</comment>
+ <comment xml:lang="tr">Mobipocket e-kitap</comment>
+ <comment xml:lang="sv">Mobipocket-e-bok</comment>
+ <comment xml:lang="sr">Мобипокет ел. књига</comment>
+ <comment xml:lang="sq">e-libër Mobipocket</comment>
+ <comment xml:lang="sl">e-knjiga Mobipocket</comment>
+ <comment xml:lang="si">මොබිපොකට් ඊ-පොත</comment>
+ <comment xml:lang="sk">E-kniha Mobipocket</comment>
+ <comment xml:lang="ru">Электронная книга Mobipocket</comment>
+ <comment xml:lang="pt_BR">E-book Mobipocket</comment>
+ <comment xml:lang="pt">ebook Mobipocket</comment>
+ <comment xml:lang="pl">E-book Mobipocket</comment>
+ <comment xml:lang="oc">libre numeric Mobipocket</comment>
+ <comment xml:lang="nl">Mobipocket e-book</comment>
+ <comment xml:lang="lv">Mobipocket e-grāmata</comment>
+ <comment xml:lang="ko">Mobipocket 전자책</comment>
+ <comment xml:lang="kk">Mobipocket эл. кітабы</comment>
+ <comment xml:lang="ka">Mobipocket-ის ელწიგნი</comment>
+ <comment xml:lang="ja">Mobipocket 電子書籍</comment>
+ <comment xml:lang="it">E-book Mobipocket</comment>
+ <comment xml:lang="is">Mobipocket rafbók</comment>
+ <comment xml:lang="id">E-book Mobipocket</comment>
+ <comment xml:lang="ia">E-libro Mobipocket</comment>
+ <comment xml:lang="hu">Mobipocket e-könyv</comment>
+ <comment xml:lang="hr">Mobipocket e-knjiga</comment>
+ <comment xml:lang="he">ספר אלקטרוני של Mobipocket</comment>
+ <comment xml:lang="gl">E-book Mobipocket</comment>
+ <comment xml:lang="ga">r-leabhar Mobipocket</comment>
+ <comment xml:lang="fur">e-book Mobipocket</comment>
+ <comment xml:lang="fr">livre numérique Mobipocket</comment>
+ <comment xml:lang="fi">Mobipocket-e-kirja</comment>
+ <comment xml:lang="eu">Mobipocket liburua</comment>
+ <comment xml:lang="es">libro electrónico de Mobipocket</comment>
+ <comment xml:lang="en_GB">Mobipocket e-book</comment>
+ <comment xml:lang="el">Ηλεκτρονικό βιβλίο Mobipocket</comment>
+ <comment xml:lang="de">Mobipocket E-Book</comment>
+ <comment xml:lang="da">Mobipocket e-bog</comment>
+ <comment xml:lang="cs">elektronická kniha Mobipocket</comment>
+ <comment xml:lang="ca">llibre electrònic Mobipocket </comment>
+ <comment xml:lang="bg">Е-книга — Mobipocket</comment>
+ <comment xml:lang="be">электронная кніга Mobipocket</comment>
+ <comment xml:lang="ar">كتاب إلكتروني Mobipocket</comment>
+ <comment xml:lang="af">Mobipocket e-boek</comment>
<sub-class-of type="application/vnd.palm"/>
<generic-icon name="x-office-document"/>
<glob pattern="*.mobi"/>
@@ -16713,111 +17526,117 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-mif">
<comment>Adobe FrameMaker MIF document</comment>
- <comment xml:lang="af">Adobe FrameMaker MIF-dokument</comment>
- <comment xml:lang="ar">مستند أدوبي الصانع للإطارات MIF</comment>
- <comment xml:lang="ast">Documentu MIF d'Adobe FrameMaker</comment>
- <comment xml:lang="be-Latn">Dakument Adobe FrameMaker MIF</comment>
- <comment xml:lang="bg">Документ — Adobe FrameMaker MIF</comment>
- <comment xml:lang="ca">document MIF d'Adobe FrameMaker</comment>
- <comment xml:lang="cs">dokument Adobe FrameMaker MIF</comment>
- <comment xml:lang="da">Adobe FrameMaker MIF-dokument</comment>
- <comment xml:lang="de">Adobe-FrameMaker-MIF-Dokument</comment>
- <comment xml:lang="el">Έγγραφο MIF του Adobe FrameMaker </comment>
- <comment xml:lang="en-GB">Adobe FrameMaker MIF document</comment>
- <comment xml:lang="eo">MIF-dokumento de Adobe FrameMaker</comment>
- <comment xml:lang="es">documento MIF de Adobe FrameMaker</comment>
- <comment xml:lang="eu">Adobe FrameMaker-en MIF dokumentua</comment>
- <comment xml:lang="fi">Adobe FrameMaker MIF -asiakirja</comment>
- <comment xml:lang="fo">Adobe FrameMaker MIF skjal</comment>
- <comment xml:lang="fr">document MIF Adobe FrameMaker</comment>
- <comment xml:lang="fur">document MIF di Adobe FrameMaker</comment>
- <comment xml:lang="ga">cáipéis MIF Adobe FrameMaker</comment>
- <comment xml:lang="gl">documento MIF de Adobe FrameMaker</comment>
- <comment xml:lang="he">מסמך MIF של Adobe FrameMaker</comment>
- <comment xml:lang="hr">Adobe FrameMaker MIF dokument</comment>
- <comment xml:lang="hu">Adobe FrameMaker MIF-dokumentum</comment>
- <comment xml:lang="ia">Documento MIF de Adobe FrameMaker</comment>
- <comment xml:lang="id">Dokumen Adobe FrameMaker MIF</comment>
- <comment xml:lang="it">Documento MIF Adobe FrameMaker</comment>
- <comment xml:lang="ja">Adobe FrameMaker MIF ドキュメント</comment>
- <comment xml:lang="ka">Adobe FrameMaker-ის MIF დოკუმენტი</comment>
- <comment xml:lang="kk">Adobe FrameMaker MIF құжаты</comment>
- <comment xml:lang="ko">Adobe 프레임메이커 MIF 문서</comment>
- <comment xml:lang="lt">Adobe FrameMaker MIF dokumentas</comment>
- <comment xml:lang="lv">Adobe FrameMaker MIF dokuments</comment>
- <comment xml:lang="nb">Adobe FrameMaker MIF-dokument</comment>
- <comment xml:lang="nl">Adobe FrameMaker MIF-document</comment>
- <comment xml:lang="nn">Adobe FrameMaker MIF-dokument</comment>
- <comment xml:lang="oc">document MIF Adobe FrameMaker</comment>
- <comment xml:lang="pl">Dokument MIF Adobe FrameMaker</comment>
- <comment xml:lang="pt">documento Adobe FrameMaker MIF</comment>
- <comment xml:lang="pt-BR">Documento MIF do Adobe FrameMaker</comment>
- <comment xml:lang="ro">Document Adobe FrameMaker MIF</comment>
- <comment xml:lang="ru">Документ Adobe FrameMaker MIF</comment>
- <comment xml:lang="sk">Dokument Adobe FrameMaker MIF</comment>
- <comment xml:lang="sl">Dokument Adobe FrameMaker MIF</comment>
- <comment xml:lang="sq">Dokument MIF Adobe FrameMaker</comment>
- <comment xml:lang="sr">Адобе Фрејм Мејкер МИФ документ</comment>
- <comment xml:lang="sv">Adobe FrameMaker MIF-dokument</comment>
- <comment xml:lang="tr">Adobe FrameMaker MIF belgesi</comment>
- <comment xml:lang="uk">документ Adobe FrameMaker MIF</comment>
+ <comment xml:lang="zh_TW">Adobe FrameMaker MIF 文件</comment>
+ <comment xml:lang="zh_CN">Adobe FrameMaker MIF 文档</comment>
<comment xml:lang="vi">Tài liệu Adobe FrameMaker MIF</comment>
- <comment xml:lang="zh-CN">Adobe FrameMaker MIF 文档</comment>
- <comment xml:lang="zh-TW">Adobe FrameMaker MIF 文件</comment>
+ <comment xml:lang="uk">документ Adobe FrameMaker MIF</comment>
+ <comment xml:lang="tr">Adobe FrameMaker MIF belgesi</comment>
+ <comment xml:lang="sv">Adobe FrameMaker MIF-dokument</comment>
+ <comment xml:lang="sr">Адобе Фрејм Мејкер МИФ документ</comment>
+ <comment xml:lang="sq">dokument MIF Adobe FrameMaker</comment>
+ <comment xml:lang="sl">Dokument Adobe FrameMaker MIF</comment>
+ <comment xml:lang="si">Adobe FrameMaker MIF ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument Adobe FrameMaker MIF</comment>
+ <comment xml:lang="ru">Документ Adobe FrameMaker MIF</comment>
+ <comment xml:lang="ro">Document Adobe FrameMaker MIF</comment>
+ <comment xml:lang="pt_BR">Documento MIF do Adobe FrameMaker</comment>
+ <comment xml:lang="pt">documento Adobe FrameMaker MIF</comment>
+ <comment xml:lang="pl">Dokument MIF Adobe FrameMaker</comment>
+ <comment xml:lang="oc">document MIF Adobe FrameMaker</comment>
+ <comment xml:lang="nn">Adobe FrameMaker MIF-dokument</comment>
+ <comment xml:lang="nl">Adobe FrameMaker MIF-document</comment>
+ <comment xml:lang="nb">Adobe FrameMaker MIF-dokument</comment>
+ <comment xml:lang="lv">Adobe FrameMaker MIF dokuments</comment>
+ <comment xml:lang="lt">Adobe FrameMaker MIF dokumentas</comment>
+ <comment xml:lang="ko">Adobe 프레임메이커 MIF 문서</comment>
+ <comment xml:lang="kk">Adobe FrameMaker MIF құжаты</comment>
+ <comment xml:lang="ka">Adobe FrameMaker-ის MIF დოკუმენტი</comment>
+ <comment xml:lang="ja">Adobe FrameMaker MIF ドキュメント</comment>
+ <comment xml:lang="it">Documento MIF Adobe FrameMaker</comment>
+ <comment xml:lang="is">Adobe FrameMaker MIF skjal</comment>
+ <comment xml:lang="id">Dokumen Adobe FrameMaker MIF</comment>
+ <comment xml:lang="ia">Documento MIF de Adobe FrameMaker</comment>
+ <comment xml:lang="hu">Adobe FrameMaker MIF-dokumentum</comment>
+ <comment xml:lang="hr">Adobe FrameMaker MIF dokument</comment>
+ <comment xml:lang="he">מסמך MIF של Adobe FrameMaker</comment>
+ <comment xml:lang="gl">documento MIF de Adobe FrameMaker</comment>
+ <comment xml:lang="ga">cáipéis MIF Adobe FrameMaker</comment>
+ <comment xml:lang="fur">document MIF di Adobe FrameMaker</comment>
+ <comment xml:lang="fr">document MIF Adobe FrameMaker</comment>
+ <comment xml:lang="fo">Adobe FrameMaker MIF skjal</comment>
+ <comment xml:lang="fi">Adobe FrameMaker MIF -asiakirja</comment>
+ <comment xml:lang="eu">Adobe FrameMaker-en MIF dokumentua</comment>
+ <comment xml:lang="es">documento MIF de Adobe FrameMaker</comment>
+ <comment xml:lang="eo">MIF-dokumento de Adobe FrameMaker</comment>
+ <comment xml:lang="en_GB">Adobe FrameMaker MIF document</comment>
+ <comment xml:lang="el">Έγγραφο MIF του Adobe FrameMaker </comment>
+ <comment xml:lang="de">Adobe-FrameMaker-MIF-Dokument</comment>
+ <comment xml:lang="da">Adobe FrameMaker MIF-dokument</comment>
+ <comment xml:lang="cs">dokument Adobe FrameMaker MIF</comment>
+ <comment xml:lang="ca">document MIF d'Adobe FrameMaker</comment>
+ <comment xml:lang="bg">Документ — Adobe FrameMaker MIF</comment>
+ <comment xml:lang="be@latin">Dakument Adobe FrameMaker MIF</comment>
+ <comment xml:lang="be">дакумент Adobe FrameMaker MIF</comment>
+ <comment xml:lang="ast">Documentu MIF d'Adobe FrameMaker</comment>
+ <comment xml:lang="ar">مستند أدوبي FrameMaker MIF</comment>
+ <comment xml:lang="af">Adobe FrameMaker MIF-dokument</comment>
<glob pattern="*.mif"/>
</mime-type>
<mime-type type="application/x-mozilla-bookmarks">
<comment>Mozilla bookmarks</comment>
- <comment xml:lang="af">Mozilla-boekmerke</comment>
- <comment xml:lang="ar">علامات موزيلا</comment>
- <comment xml:lang="be-Latn">Zakładki Mozilla</comment>
- <comment xml:lang="bg">Отметки — Mozilla</comment>
- <comment xml:lang="ca">llista d'adreces d'interès de Mozilla</comment>
- <comment xml:lang="cs">záložky Mozilla</comment>
- <comment xml:lang="da">Mozillabogmærker</comment>
- <comment xml:lang="de">Mozilla-Lesezeichen</comment>
- <comment xml:lang="el">Σελιδοδείκτες Mozilla</comment>
- <comment xml:lang="en-GB">Mozilla bookmarks</comment>
- <comment xml:lang="eo">Mozilla-legosignoj</comment>
- <comment xml:lang="es">marcadores de Mozilla</comment>
- <comment xml:lang="eu">Mozillako laster-markak</comment>
- <comment xml:lang="fi">Mozilla-kirjanmerkit</comment>
- <comment xml:lang="fo">Mozilla bókamerki</comment>
- <comment xml:lang="fr">marque-pages Mozilla</comment>
- <comment xml:lang="fur">segnelibris Mozilla</comment>
- <comment xml:lang="ga">leabharmharcanna Mozilla</comment>
- <comment xml:lang="gl">Marcadores de Mozilla</comment>
- <comment xml:lang="he">סימניה של Mozilla</comment>
- <comment xml:lang="hr">Mozilla zabilješke</comment>
- <comment xml:lang="hu">Mozilla-könyvjelzők</comment>
- <comment xml:lang="ia">Marcapaginas Mozilla</comment>
- <comment xml:lang="id">Bookmark Mozilla</comment>
- <comment xml:lang="it">Segnalibri Mozilla</comment>
- <comment xml:lang="ja">Mozilla ブックマーク</comment>
- <comment xml:lang="kk">Mozilla бетбелгілері</comment>
- <comment xml:lang="ko">모질라 책갈피</comment>
- <comment xml:lang="lt">Mozilla žymelės</comment>
- <comment xml:lang="lv">Mozilla grāmatzīmes</comment>
- <comment xml:lang="ms">Tandabuku Mozilla</comment>
- <comment xml:lang="nb">Mozilla-bokmerker</comment>
- <comment xml:lang="nl">Mozilla-bladwijzers</comment>
- <comment xml:lang="nn">Mozilla-bokmerker</comment>
- <comment xml:lang="oc">marcapaginas Mozilla</comment>
- <comment xml:lang="pl">Zakładki Mozilla</comment>
- <comment xml:lang="pt">marcadores do Mozilla</comment>
- <comment xml:lang="pt-BR">Favoritos do Mozilla</comment>
- <comment xml:lang="ro">Semne de carte Mozilla</comment>
- <comment xml:lang="ru">Закладки Mozilla</comment>
- <comment xml:lang="sk">Záložky Mozilla</comment>
- <comment xml:lang="sl">Datoteka zaznamkov Mozilla</comment>
- <comment xml:lang="sq">Libërshënues Mozilla</comment>
- <comment xml:lang="sr">Мозилини обележивачи</comment>
- <comment xml:lang="sv">Mozilla-bokmärken</comment>
- <comment xml:lang="tr">Mozilla yer imleri</comment>
- <comment xml:lang="uk">закладки Mozilla</comment>
+ <comment xml:lang="zh_TW">Mozilla 書籤</comment>
+ <comment xml:lang="zh_CN">Mozilla 书签</comment>
<comment xml:lang="vi">Liên kết đã lưu Mozilla</comment>
- <comment xml:lang="zh-CN">Mozilla 书签</comment>
- <comment xml:lang="zh-TW">Mozilla 書籤</comment>
+ <comment xml:lang="uk">закладки Mozilla</comment>
+ <comment xml:lang="tr">Mozilla yer imleri</comment>
+ <comment xml:lang="sv">Mozilla-bokmärken</comment>
+ <comment xml:lang="sr">Мозилини обележивачи</comment>
+ <comment xml:lang="sq">faqerojtës Mozilla</comment>
+ <comment xml:lang="sl">Datoteka zaznamkov Mozilla</comment>
+ <comment xml:lang="si">මොසිල්ලා පිටු සලකුණු</comment>
+ <comment xml:lang="sk">Záložky Mozilla</comment>
+ <comment xml:lang="ru">Закладки Mozilla</comment>
+ <comment xml:lang="ro">Semne de carte Mozilla</comment>
+ <comment xml:lang="pt_BR">Favoritos do Mozilla</comment>
+ <comment xml:lang="pt">marcadores do Mozilla</comment>
+ <comment xml:lang="pl">Zakładki Mozilla</comment>
+ <comment xml:lang="oc">marcapaginas Mozilla</comment>
+ <comment xml:lang="nn">Mozilla-bokmerker</comment>
+ <comment xml:lang="nl">Mozilla-bladwijzers</comment>
+ <comment xml:lang="nb">Mozilla-bokmerker</comment>
+ <comment xml:lang="ms">Tandabuku Mozilla</comment>
+ <comment xml:lang="lv">Mozilla grāmatzīmes</comment>
+ <comment xml:lang="lt">Mozilla žymelės</comment>
+ <comment xml:lang="ko">모질라 책갈피</comment>
+ <comment xml:lang="kk">Mozilla бетбелгілері</comment>
+ <comment xml:lang="ja">Mozilla ブックマーク</comment>
+ <comment xml:lang="it">Segnalibri Mozilla</comment>
+ <comment xml:lang="is">Mozilla bókamerki</comment>
+ <comment xml:lang="id">Bookmark Mozilla</comment>
+ <comment xml:lang="ia">Marcapaginas Mozilla</comment>
+ <comment xml:lang="hu">Mozilla-könyvjelzők</comment>
+ <comment xml:lang="hr">Mozilla zabilješke</comment>
+ <comment xml:lang="he">סימניה של Mozilla</comment>
+ <comment xml:lang="gl">Marcadores de Mozilla</comment>
+ <comment xml:lang="ga">leabharmharcanna Mozilla</comment>
+ <comment xml:lang="fur">segnelibris Mozilla</comment>
+ <comment xml:lang="fr">marque-pages Mozilla</comment>
+ <comment xml:lang="fo">Mozilla bókamerki</comment>
+ <comment xml:lang="fi">Mozilla-kirjanmerkit</comment>
+ <comment xml:lang="eu">Mozillako laster-markak</comment>
+ <comment xml:lang="es">marcadores de Mozilla</comment>
+ <comment xml:lang="eo">Mozilla-legosignoj</comment>
+ <comment xml:lang="en_GB">Mozilla bookmarks</comment>
+ <comment xml:lang="el">Σελιδοδείκτες Mozilla</comment>
+ <comment xml:lang="de">Mozilla-Lesezeichen</comment>
+ <comment xml:lang="da">Mozillabogmærker</comment>
+ <comment xml:lang="cs">záložky Mozilla</comment>
+ <comment xml:lang="ca">llista d'adreces d'interès de Mozilla</comment>
+ <comment xml:lang="bg">Отметки — Mozilla</comment>
+ <comment xml:lang="be@latin">Zakładki Mozilla</comment>
+ <comment xml:lang="be">закладкі Mozilla</comment>
+ <comment xml:lang="ar">علامات موزيلا</comment>
+ <comment xml:lang="af">Mozilla-boekmerke</comment>
<sub-class-of type="text/html"/>
<generic-icon name="text-html"/>
<magic priority="80">
@@ -16825,116 +17644,191 @@ command to generate the output files.
</magic>
<alias type="application/x-netscape-bookmarks"/>
</mime-type>
- <mime-type type="application/x-ms-dos-executable">
- <comment>DOS/Windows executable</comment>
- <comment xml:lang="af">DOS/Windows-uitvoerbaar</comment>
- <comment xml:lang="ar">تنفيذي DOS/Windows</comment>
- <comment xml:lang="be-Latn">Vykonvalny fajł DOS/Windows</comment>
- <comment xml:lang="bg">Изпълним файл — DOS/Windows</comment>
- <comment xml:lang="ca">executable de DOS o de Windows</comment>
- <comment xml:lang="cs">spustitelný soubor pro DOS/Windows</comment>
- <comment xml:lang="da">DOS-/Windowskørbar</comment>
- <comment xml:lang="de">DOS/Windows-Programmdatei</comment>
- <comment xml:lang="el">Εκτελέσιμο DOS/Windows</comment>
- <comment xml:lang="en-GB">DOS/Windows executable</comment>
- <comment xml:lang="eo">DOS/Windows-plenumebla</comment>
- <comment xml:lang="es">ejecutable de DOS/Windows</comment>
- <comment xml:lang="eu">DOS/Windows-eko exekutagarria</comment>
- <comment xml:lang="fi">DOS/Windows-ohjelma</comment>
- <comment xml:lang="fo">DOS/Windows inningarfør</comment>
- <comment xml:lang="fr">exécutable DOS/Windows</comment>
- <comment xml:lang="fur">eseguibil DOS/Windows</comment>
- <comment xml:lang="ga">comhad inrite DOS/Windows</comment>
- <comment xml:lang="gl">executábel de DOS/Windows</comment>
- <comment xml:lang="he">קובץ בר־הרצה של DOS/חלונות</comment>
- <comment xml:lang="hr">DOS/Windows izvršna datoteka</comment>
- <comment xml:lang="hu">DOS/Windows futtatható</comment>
- <comment xml:lang="ia">Executabile DOS/Windows</comment>
- <comment xml:lang="id">DOS/Windows dapat dieksekusi</comment>
- <comment xml:lang="it">Eseguibile DOS/Windows</comment>
- <comment xml:lang="ja">DOS/Windows 実行ファイル</comment>
- <comment xml:lang="ka">DOS/Windows გაშვებადი ფაილი</comment>
- <comment xml:lang="kk">DOS/Windows орындалатын файлы</comment>
- <comment xml:lang="ko">DOS/Windows 실행 파일</comment>
- <comment xml:lang="lt">DOS/Windows vykdomasis failas</comment>
- <comment xml:lang="lv">DOS/Windows izpildāmais</comment>
- <comment xml:lang="ms">Bolehlaksana DOS/Windows</comment>
- <comment xml:lang="nb">Kjørbar fil for DOS/Windows</comment>
- <comment xml:lang="nl">DOS/Windows-uitvoerbaar bestand</comment>
- <comment xml:lang="nn">DOS/Windows køyrbar fil</comment>
- <comment xml:lang="oc">executable DOS/Windows</comment>
- <comment xml:lang="pl">Program DOS/Windows</comment>
- <comment xml:lang="pt">executável DOS/Windows</comment>
- <comment xml:lang="pt-BR">Executável do DOS/Windows</comment>
- <comment xml:lang="ro">Executabil DOS/Windows</comment>
- <comment xml:lang="ru">Исполняемый файл DOS/Windows</comment>
- <comment xml:lang="sk">Spustiteľný súbor pre DOS/Windows</comment>
- <comment xml:lang="sl">Izvedljiva datoteka DOS/Windows</comment>
- <comment xml:lang="sq">I ekzekutueshëm DOS/Windows</comment>
- <comment xml:lang="sr">ДОС/Виндоуз извршна</comment>
- <comment xml:lang="sv">Körbar DOS/Windows-fil</comment>
- <comment xml:lang="tr">DOS/Windows çalıştırılabiliri</comment>
- <comment xml:lang="uk">виконуваний файл DOS/Windows</comment>
- <comment xml:lang="vi">Tập tin có thực hiện được DOS/Windows</comment>
- <comment xml:lang="zh-CN">DOS/Windows 可执行文件</comment>
- <comment xml:lang="zh-TW">DOS/Windows 可執行檔</comment>
+ <mime-type type="application/x-msdownload">
+ <comment>Windows or DOS program</comment>
+ <acronym>DOS</acronym>
+ <expanded-acronym>Disk Operating System</expanded-acronym>
+ <sub-class-of type="application/x-executable"/>
<generic-icon name="application-x-executable"/>
- <magic priority="50">
+ <magic>
<match type="string" value="MZ" offset="0"/>
</magic>
<glob pattern="*.exe"/>
+ <glob pattern="*.dll"/>
+ <glob pattern="*.cpl"/>
+ <glob pattern="*.drv"/>
+ <glob pattern="*.scr"/>
+ <alias type="application/x-ms-dos-executable"/>
+ </mime-type>
+ <mime-type type="application/x-dosexec">
+ <comment>DOS executable</comment>
+ <acronym>DOS</acronym>
+ <expanded-acronym>Disk Operating System</expanded-acronym>
+ <sub-class-of type="application/x-msdownload"/>
+ <generic-icon name="application-x-executable"/>
+ <magic priority="60">
+ <match type="string" value="MZ" offset="0">
+ <match type="little16" mask="0xffc0" value="0" offset="24"/>
+ </match>
+ </magic>
+ <glob pattern="*.exe" weight="30"/>
+ </mime-type>
+ <mime-type type="application/x-ms-ne-executable">
+ <comment>16-bit Windows program</comment>
+ <sub-class-of type="application/x-msdownload"/>
+ <generic-icon name="application-x-executable"/>
+ <magic priority="70">
+ <match type="string" value="MZ" offset="0">
+ <match type="string" value="NE" offset="64:256"/>
+ </match>
+ </magic>
+ <glob pattern="*.exe" weight="20"/>
+ <glob pattern="*.dll" weight="20"/>
+ <glob pattern="*.cpl" weight="20"/>
+ <glob pattern="*.drv" weight="20"/>
+ <glob pattern="*.scr" weight="20"/>
+ </mime-type>
+ <mime-type type="application/vnd.microsoft.portable-executable">
+ <comment>Windows or EFI program</comment>
+ <acronym>EFI</acronym>
+ <expanded-acronym>Extensible Firmware Interface</expanded-acronym>
+ <sub-class-of type="application/x-msdownload"/>
+ <generic-icon name="application-x-executable"/>
+ <magic priority="80">
+ <match type="string" value="MZ" offset="0">
+ <match type="string" value="PE\0\0" offset="64:256"/>
+ </match>
+ </magic>
+ <glob pattern="*.exe" weight="40"/>
+ <glob pattern="*.dll" weight="40"/>
+ <glob pattern="*.cpl" weight="40"/>
+ <glob pattern="*.drv" weight="40"/>
+ <glob pattern="*.scr" weight="40"/>
+ <glob pattern="*.efi"/>
+ <glob pattern="*.ocx"/>
+ <glob pattern="*.sys"/>
+ <glob pattern="*.lib"/>
+ </mime-type>
+ <mime-type type="application/x-ms-pdb">
+ <comment>Windows program database</comment>
+ <comment xml:lang="uk">база даних програм Windows</comment>
+ <comment xml:lang="sv">Windows-programdatabas</comment>
+ <comment xml:lang="ru">База данных программ Windows</comment>
+ <comment xml:lang="pl">Baza danych programów Windows</comment>
+ <comment xml:lang="eu">Windows programen datu-basea</comment>
+ <comment xml:lang="es">base de datos de programa de Windows</comment>
+ <comment xml:lang="de">Windows-Programmdatenbank</comment>
+ <magic>
+ <match type="string" value="Microsoft C/C++ MSF 7.00\r\n\x1aDS" offset="0"/>
+ <match type="string" value="Microsoft C/C++ program database 2.00\r\n\x1aJG" offset="0"/>
+ </magic>
+ <glob pattern="*.pdb"/>
+ </mime-type>
+ <mime-type type="application/x-bat">
+ <comment>DOS/Windows batch file</comment>
+ <comment xml:lang="uk">пакетний файл DOS/Windows</comment>
+ <comment xml:lang="sv">DOS/Windows-batchfil</comment>
+ <comment xml:lang="ru">Пакетный файл DOS/Windows</comment>
+ <comment xml:lang="pl">Plik wsadowy DOS/Windows</comment>
+ <comment xml:lang="ja">DOS/Windowsバッチファイル</comment>
+ <comment xml:lang="it">File batch DOS/Windows</comment>
+ <comment xml:lang="gl">Ficheiro en lote DOS/Windows</comment>
+ <comment xml:lang="eu">DOS/Windows sortakako fitxategia</comment>
+ <comment xml:lang="es">archivo por lotes de DOS/Windows</comment>
+ <comment xml:lang="de">DOS/Windows Stapelverarbeitungsdatei</comment>
+ <comment xml:lang="be">выконвальны файл DOS/Windows</comment>
+ <sub-class-of type="text/plain"/>
+ <alias type="application/bat"/>
+ <generic-icon name="text-x-script"/>
+ <glob pattern="*.bat"/>
+ </mime-type>
+ <mime-type type="application/x-powershell">
+ <comment>PowerShell script</comment>
+ <comment xml:lang="uk">скрипт PowerShell</comment>
+ <comment xml:lang="sv">PowerShell-skript</comment>
+ <comment xml:lang="ru">Сценарий PowerShell</comment>
+ <comment xml:lang="pl">Skrypt PowerShell</comment>
+ <comment xml:lang="es">secuencia de órdenes de PowerShell</comment>
+ <comment xml:lang="de">PowerShell-Skript</comment>
+ <sub-class-of type="text/plain"/>
+ <generic-icon name="text-x-script"/>
+ <magic>
+ <match type="string" value="#Requires -PSEdition Core" offset="0"/>
+ <match type="string" value="#Requires -PSEdition Desktop" offset="0"/>
+ </magic>
+ <glob pattern="*.ps1"/>
+ </mime-type>
+ <mime-type type="application/x-ms-shortcut">
+ <comment>Windows shortcut</comment>
+ <comment xml:lang="uk">ярлик Windows</comment>
+ <comment xml:lang="sv">Windows-genväg</comment>
+ <comment xml:lang="ru">Ярлык Windows</comment>
+ <comment xml:lang="pl">Skrót Windows</comment>
+ <comment xml:lang="es">acceso directo de Windows</comment>
+ <comment xml:lang="de">Windows-Verweis</comment>
+ <generic-icon name="emblem-symbolic-link"/>
+ <magic>
+ <match type="string" value="\x4c\x00\x00\x00\x01\x14\x02\x00\x00\x00\x00\x00\xc0\x00\x00\x00\x00\x00\x00\x46" offset="0"/>
+ </magic>
+ <glob pattern="*.lnk"/>
+ <alias type="application/x-win-lnk"/>
</mime-type>
<mime-type type="application/x-mswinurl">
<comment>Internet shortcut</comment>
- <comment xml:lang="af">Internet-kortpad</comment>
- <comment xml:lang="ar">اختصار الإنترنت</comment>
- <comment xml:lang="be-Latn">Sieciŭnaja spasyłka</comment>
- <comment xml:lang="bg">Адрес в Интернет</comment>
- <comment xml:lang="ca">drecera d'Internet</comment>
- <comment xml:lang="cs">odkaz do Internetu</comment>
- <comment xml:lang="da">Internetgenvej</comment>
- <comment xml:lang="de">Internet-Verweis</comment>
- <comment xml:lang="el">Συντόμευση διαδικτύου</comment>
- <comment xml:lang="en-GB">Internet shortcut</comment>
- <comment xml:lang="es">acceso directo a Internet</comment>
- <comment xml:lang="eu">Interneteko lasterbidea</comment>
- <comment xml:lang="fi">Internet-pikakuvake</comment>
- <comment xml:lang="fo">Alnetssnarvegur</comment>
- <comment xml:lang="fr">raccourci Internet</comment>
- <comment xml:lang="fur">scurte di internet</comment>
- <comment xml:lang="ga">aicearra Idirlín</comment>
- <comment xml:lang="gl">atallo de Internet</comment>
- <comment xml:lang="he">קיצור דרך של האינטרנט</comment>
- <comment xml:lang="hr">Internetski prečac</comment>
- <comment xml:lang="hu">Internetes indítóikon</comment>
- <comment xml:lang="ia">Ligamine Internet</comment>
- <comment xml:lang="id">Jalan pintas Internet</comment>
- <comment xml:lang="it">Scorciatoia Internet</comment>
- <comment xml:lang="ja">インターネットショートカット</comment>
- <comment xml:lang="kk">Интернет сілтемесі</comment>
- <comment xml:lang="ko">인터넷 바로 가기</comment>
- <comment xml:lang="lt">Interneto nuoroda</comment>
- <comment xml:lang="lv">Interneta īsceļš</comment>
- <comment xml:lang="nb">Internettsnarvei</comment>
- <comment xml:lang="nl">internetkoppeling</comment>
- <comment xml:lang="nn">Internett-snarveg</comment>
- <comment xml:lang="oc">acorchi Internet</comment>
- <comment xml:lang="pl">Skrót internetowy</comment>
- <comment xml:lang="pt">atalho da Internet</comment>
- <comment xml:lang="pt-BR">Atalho da Internet</comment>
- <comment xml:lang="ro">Scurtătură Internet</comment>
- <comment xml:lang="ru">Интернет-ссылка</comment>
- <comment xml:lang="sk">Internetový odkaz</comment>
- <comment xml:lang="sl">Internetna bližnjica</comment>
- <comment xml:lang="sq">Shkurtim internet</comment>
- <comment xml:lang="sr">интернет пречица</comment>
- <comment xml:lang="sv">Internetgenväg</comment>
- <comment xml:lang="tr">İnternet kısayolu</comment>
- <comment xml:lang="uk">інтернет-посилання</comment>
+ <comment xml:lang="zh_TW">網際網路捷徑</comment>
+ <comment xml:lang="zh_CN">Internet 快捷方式</comment>
<comment xml:lang="vi">Lối tắt Internet</comment>
- <comment xml:lang="zh-CN">Internet 快捷方式</comment>
- <comment xml:lang="zh-TW">網際網路捷徑</comment>
- <magic priority="50">
+ <comment xml:lang="uk">інтернет-посилання</comment>
+ <comment xml:lang="tr">İnternet kısayolu</comment>
+ <comment xml:lang="sv">Internetgenväg</comment>
+ <comment xml:lang="sr">интернет пречица</comment>
+ <comment xml:lang="sq">shkurtore Internet</comment>
+ <comment xml:lang="sl">Internetna bližnjica</comment>
+ <comment xml:lang="si">අන්තර්ජාල කෙටි මග</comment>
+ <comment xml:lang="sk">Internetový odkaz</comment>
+ <comment xml:lang="ru">Интернет-ссылка</comment>
+ <comment xml:lang="ro">Scurtătură Internet</comment>
+ <comment xml:lang="pt_BR">Atalho da Internet</comment>
+ <comment xml:lang="pt">atalho da Internet</comment>
+ <comment xml:lang="pl">Skrót internetowy</comment>
+ <comment xml:lang="oc">acorchi Internet</comment>
+ <comment xml:lang="nn">Internett-snarveg</comment>
+ <comment xml:lang="nl">internetkoppeling</comment>
+ <comment xml:lang="nb">Internettsnarvei</comment>
+ <comment xml:lang="lv">Interneta īsceļš</comment>
+ <comment xml:lang="lt">Interneto nuoroda</comment>
+ <comment xml:lang="ko">인터넷 바로 가기</comment>
+ <comment xml:lang="kk">Интернет сілтемесі</comment>
+ <comment xml:lang="ja">インターネットショートカット</comment>
+ <comment xml:lang="it">Scorciatoia Internet</comment>
+ <comment xml:lang="is">Internet-flýtileið</comment>
+ <comment xml:lang="id">Jalan pintas Internet</comment>
+ <comment xml:lang="ia">Ligamine Internet</comment>
+ <comment xml:lang="hu">Internetes indítóikon</comment>
+ <comment xml:lang="hr">Internetski prečac</comment>
+ <comment xml:lang="he">קיצור דרך של האינטרנט</comment>
+ <comment xml:lang="gl">atallo de Internet</comment>
+ <comment xml:lang="ga">aicearra Idirlín</comment>
+ <comment xml:lang="fur">scurte di internet</comment>
+ <comment xml:lang="fr">raccourci Internet</comment>
+ <comment xml:lang="fo">Alnetssnarvegur</comment>
+ <comment xml:lang="fi">Internet-pikakuvake</comment>
+ <comment xml:lang="eu">Interneteko lasterbidea</comment>
+ <comment xml:lang="es">acceso directo a Internet</comment>
+ <comment xml:lang="en_GB">Internet shortcut</comment>
+ <comment xml:lang="el">Συντόμευση διαδικτύου</comment>
+ <comment xml:lang="de">Internet-Verweis</comment>
+ <comment xml:lang="da">Internetgenvej</comment>
+ <comment xml:lang="cs">odkaz do Internetu</comment>
+ <comment xml:lang="ca">drecera d'Internet</comment>
+ <comment xml:lang="bg">Адрес в Интернет</comment>
+ <comment xml:lang="be@latin">Sieciŭnaja spasyłka</comment>
+ <comment xml:lang="be">ярлык інтэрнэту</comment>
+ <comment xml:lang="ar">اختصار إنترنت</comment>
+ <comment xml:lang="af">Internet-kortpad</comment>
+ <sub-class-of type="text/plain"/>
+ <generic-icon name="emblem-symbolic-link"/>
+ <magic>
<match type="string" value="InternetShortcut" offset="1"/>
<match type="string" value="DEFAULT" offset="1">
<match type="string" value="BASEURL=" offset="11"/>
@@ -16944,220 +17838,232 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-mswrite">
<comment>WRI document</comment>
- <comment xml:lang="af">WRI-dokument</comment>
- <comment xml:lang="ar">مستند WRI</comment>
- <comment xml:lang="ast">Documentu WRI</comment>
- <comment xml:lang="be-Latn">Dakument WRI</comment>
- <comment xml:lang="bg">Документ — WRI</comment>
- <comment xml:lang="ca">document WRI</comment>
- <comment xml:lang="cs">dokument WRI</comment>
- <comment xml:lang="da">WRI-dokument</comment>
- <comment xml:lang="de">WRI-Dokument</comment>
- <comment xml:lang="el">Έγγραφο WRI</comment>
- <comment xml:lang="en-GB">WRI document</comment>
- <comment xml:lang="eo">WRI-dokumento</comment>
- <comment xml:lang="es">documento WRI</comment>
- <comment xml:lang="eu">WRI dokumentua</comment>
- <comment xml:lang="fi">WRI-asiakirja</comment>
- <comment xml:lang="fo">WRI skjal</comment>
- <comment xml:lang="fr">document WRI</comment>
- <comment xml:lang="fur">document WRI</comment>
- <comment xml:lang="ga">cáipéis WRI</comment>
- <comment xml:lang="gl">documento WRI</comment>
- <comment xml:lang="he">מסמך WRI</comment>
- <comment xml:lang="hr">WRI dokument</comment>
- <comment xml:lang="hu">WRI dokumentum</comment>
- <comment xml:lang="ia">Documento WRI</comment>
- <comment xml:lang="id">Dokumen WRI</comment>
- <comment xml:lang="it">Documento WRI</comment>
- <comment xml:lang="ja">WRI ドキュメント</comment>
- <comment xml:lang="kk">WRI құжаты</comment>
- <comment xml:lang="ko">WRI 문서</comment>
- <comment xml:lang="lt">WRI dokumentas</comment>
- <comment xml:lang="lv">WRI dokuments</comment>
- <comment xml:lang="nb">WRI-dokument</comment>
- <comment xml:lang="nl">WRI-document</comment>
- <comment xml:lang="nn">WRI-dokument</comment>
- <comment xml:lang="oc">document WRI</comment>
- <comment xml:lang="pl">Dokument WRI</comment>
- <comment xml:lang="pt">documento WRI</comment>
- <comment xml:lang="pt-BR">Documento WRI</comment>
- <comment xml:lang="ro">Document WRI</comment>
- <comment xml:lang="ru">Документ WRI</comment>
- <comment xml:lang="sk">Dokument WRI</comment>
- <comment xml:lang="sl">Dokument WRI</comment>
- <comment xml:lang="sq">Dokument WRI</comment>
- <comment xml:lang="sr">ВРИ документ</comment>
- <comment xml:lang="sv">WRI-dokument</comment>
- <comment xml:lang="tr">WRI belgesi</comment>
- <comment xml:lang="uk">документ WRI</comment>
+ <comment xml:lang="zh_TW">WRI 文件</comment>
+ <comment xml:lang="zh_CN">WRI 文档</comment>
<comment xml:lang="vi">Tài liệu WRI</comment>
- <comment xml:lang="zh-CN">WRI 文档</comment>
- <comment xml:lang="zh-TW">WRI 文件</comment>
+ <comment xml:lang="uk">документ WRI</comment>
+ <comment xml:lang="tr">WRI belgesi</comment>
+ <comment xml:lang="sv">WRI-dokument</comment>
+ <comment xml:lang="sr">ВРИ документ</comment>
+ <comment xml:lang="sq">dokument WRI</comment>
+ <comment xml:lang="sl">Dokument WRI</comment>
+ <comment xml:lang="si">WRI ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument WRI</comment>
+ <comment xml:lang="ru">Документ WRI</comment>
+ <comment xml:lang="ro">Document WRI</comment>
+ <comment xml:lang="pt_BR">Documento WRI</comment>
+ <comment xml:lang="pt">documento WRI</comment>
+ <comment xml:lang="pl">Dokument WRI</comment>
+ <comment xml:lang="oc">document WRI</comment>
+ <comment xml:lang="nn">WRI-dokument</comment>
+ <comment xml:lang="nl">WRI-document</comment>
+ <comment xml:lang="nb">WRI-dokument</comment>
+ <comment xml:lang="lv">WRI dokuments</comment>
+ <comment xml:lang="lt">WRI dokumentas</comment>
+ <comment xml:lang="ko">WRI 문서</comment>
+ <comment xml:lang="kk">WRI құжаты</comment>
+ <comment xml:lang="ja">WRI ドキュメント</comment>
+ <comment xml:lang="it">Documento WRI</comment>
+ <comment xml:lang="is">WRI skjal</comment>
+ <comment xml:lang="id">Dokumen WRI</comment>
+ <comment xml:lang="ia">Documento WRI</comment>
+ <comment xml:lang="hu">WRI dokumentum</comment>
+ <comment xml:lang="hr">WRI dokument</comment>
+ <comment xml:lang="he">מסמך WRI</comment>
+ <comment xml:lang="gl">documento WRI</comment>
+ <comment xml:lang="ga">cáipéis WRI</comment>
+ <comment xml:lang="fur">document WRI</comment>
+ <comment xml:lang="fr">document WRI</comment>
+ <comment xml:lang="fo">WRI skjal</comment>
+ <comment xml:lang="fi">WRI-asiakirja</comment>
+ <comment xml:lang="eu">WRI dokumentua</comment>
+ <comment xml:lang="es">documento WRI</comment>
+ <comment xml:lang="eo">WRI-dokumento</comment>
+ <comment xml:lang="en_GB">WRI document</comment>
+ <comment xml:lang="el">Έγγραφο WRI</comment>
+ <comment xml:lang="de">WRI-Dokument</comment>
+ <comment xml:lang="da">WRI-dokument</comment>
+ <comment xml:lang="cs">dokument WRI</comment>
+ <comment xml:lang="ca">document WRI</comment>
+ <comment xml:lang="bg">Документ — WRI</comment>
+ <comment xml:lang="be@latin">Dakument WRI</comment>
+ <comment xml:lang="be">дакумент WRI</comment>
+ <comment xml:lang="ast">Documentu WRI</comment>
+ <comment xml:lang="ar">مستند WRI</comment>
+ <comment xml:lang="af">WRI-dokument</comment>
<generic-icon name="x-office-document"/>
<glob pattern="*.wri"/>
</mime-type>
<mime-type type="application/x-msx-rom">
<comment>MSX ROM</comment>
- <comment xml:lang="ar">MSX ROM</comment>
- <comment xml:lang="be-Latn">MSX ROM</comment>
- <comment xml:lang="bg">ROM — MSX</comment>
- <comment xml:lang="ca">ROM de MSX</comment>
- <comment xml:lang="cs">ROM pro MSX</comment>
- <comment xml:lang="cy">ROM MSX</comment>
- <comment xml:lang="da">MSX-ROM</comment>
- <comment xml:lang="de">MSX ROM</comment>
- <comment xml:lang="el">MSX ROM</comment>
- <comment xml:lang="en-GB">MSX ROM</comment>
- <comment xml:lang="eo">MSX-NLM</comment>
- <comment xml:lang="es">ROM de MSX</comment>
- <comment xml:lang="eu">MSX-ko ROMa</comment>
- <comment xml:lang="fi">MSX-ROM</comment>
- <comment xml:lang="fo">MSX ROM</comment>
- <comment xml:lang="fr">ROM MSX</comment>
- <comment xml:lang="fur">ROM MSX</comment>
- <comment xml:lang="ga">ROM MSX</comment>
- <comment xml:lang="gl">ROM de MSX</comment>
- <comment xml:lang="he">MSX ROM</comment>
- <comment xml:lang="hr">MSX ROM</comment>
- <comment xml:lang="hu">MSX ROM</comment>
- <comment xml:lang="ia">ROM pro MSX</comment>
- <comment xml:lang="id">Memori baca-saja MSX</comment>
- <comment xml:lang="it">ROM MSX</comment>
- <comment xml:lang="ja">MSX ROM</comment>
- <comment xml:lang="ka">MSX-ის ROM</comment>
- <comment xml:lang="kk">MSX ROM</comment>
- <comment xml:lang="ko">MSX 롬</comment>
- <comment xml:lang="lt">MSX ROM</comment>
- <comment xml:lang="lv">MSX ROM</comment>
- <comment xml:lang="ms">ROM MSX</comment>
- <comment xml:lang="nb">MSX-ROM</comment>
- <comment xml:lang="nl">MSX-ROM</comment>
- <comment xml:lang="nn">MSX-ROM</comment>
- <comment xml:lang="oc">ROM MSX</comment>
- <comment xml:lang="pl">Plik ROM konsoli MSX</comment>
- <comment xml:lang="pt">ROM MSX</comment>
- <comment xml:lang="pt-BR">ROM de MSX</comment>
- <comment xml:lang="ro">ROM MSX</comment>
- <comment xml:lang="ru">MSX ROM</comment>
- <comment xml:lang="sk">ROM pre MSX</comment>
- <comment xml:lang="sl">Bralni pomnilnik MSX</comment>
- <comment xml:lang="sq">ROM MSX</comment>
- <comment xml:lang="sr">МСИкс РОМ</comment>
- <comment xml:lang="sv">MSX-rom</comment>
- <comment xml:lang="tr">MSX ROM</comment>
- <comment xml:lang="uk">ППП MSX</comment>
+ <comment xml:lang="zh_TW">MSX ROM</comment>
+ <comment xml:lang="zh_CN">MSX ROM</comment>
<comment xml:lang="vi">ROM MSX</comment>
- <comment xml:lang="zh-CN">MSX ROM</comment>
- <comment xml:lang="zh-TW">MSX ROM</comment>
+ <comment xml:lang="uk">ППП MSX</comment>
+ <comment xml:lang="tr">MSX ROM</comment>
+ <comment xml:lang="sv">MSX-rom</comment>
+ <comment xml:lang="sr">МСИкс РОМ</comment>
+ <comment xml:lang="sq">ROM MSX</comment>
+ <comment xml:lang="sl">Bralni pomnilnik MSX</comment>
+ <comment xml:lang="si">MSX ROM</comment>
+ <comment xml:lang="sk">ROM pre MSX</comment>
+ <comment xml:lang="ru">MSX ROM</comment>
+ <comment xml:lang="ro">ROM MSX</comment>
+ <comment xml:lang="pt_BR">ROM de MSX</comment>
+ <comment xml:lang="pt">ROM MSX</comment>
+ <comment xml:lang="pl">Plik ROM konsoli MSX</comment>
+ <comment xml:lang="oc">ROM MSX</comment>
+ <comment xml:lang="nn">MSX-ROM</comment>
+ <comment xml:lang="nl">MSX-ROM</comment>
+ <comment xml:lang="nb">MSX-ROM</comment>
+ <comment xml:lang="ms">ROM MSX</comment>
+ <comment xml:lang="lv">MSX ROM</comment>
+ <comment xml:lang="lt">MSX ROM</comment>
+ <comment xml:lang="ko">MSX 롬</comment>
+ <comment xml:lang="kk">MSX ROM</comment>
+ <comment xml:lang="ka">MSX-ის ROM</comment>
+ <comment xml:lang="ja">MSX ROM</comment>
+ <comment xml:lang="it">ROM MSX</comment>
+ <comment xml:lang="is">MSX ROM</comment>
+ <comment xml:lang="id">Memori baca-saja MSX</comment>
+ <comment xml:lang="ia">ROM pro MSX</comment>
+ <comment xml:lang="hu">MSX ROM</comment>
+ <comment xml:lang="hr">MSX ROM</comment>
+ <comment xml:lang="he">MSX ROM</comment>
+ <comment xml:lang="gl">ROM de MSX</comment>
+ <comment xml:lang="ga">ROM MSX</comment>
+ <comment xml:lang="fur">ROM MSX</comment>
+ <comment xml:lang="fr">ROM MSX</comment>
+ <comment xml:lang="fo">MSX ROM</comment>
+ <comment xml:lang="fi">MSX-ROM</comment>
+ <comment xml:lang="eu">MSX-ko ROMa</comment>
+ <comment xml:lang="es">ROM de MSX</comment>
+ <comment xml:lang="eo">MSX-NLM</comment>
+ <comment xml:lang="en_GB">MSX ROM</comment>
+ <comment xml:lang="el">MSX ROM</comment>
+ <comment xml:lang="de">MSX-ROM</comment>
+ <comment xml:lang="da">MSX-ROM</comment>
+ <comment xml:lang="cy">ROM MSX</comment>
+ <comment xml:lang="cs">ROM pro MSX</comment>
+ <comment xml:lang="ca">ROM de MSX</comment>
+ <comment xml:lang="bg">ROM — MSX</comment>
+ <comment xml:lang="be@latin">MSX ROM</comment>
+ <comment xml:lang="be">MSX ROM</comment>
+ <comment xml:lang="ar">روم MSX</comment>
<generic-icon name="application-x-executable"/>
<glob pattern="*.msx"/>
</mime-type>
<mime-type type="application/x-m4">
<comment>M4 macro</comment>
- <comment xml:lang="af">M4-makro</comment>
- <comment xml:lang="ar">M4 macro</comment>
- <comment xml:lang="be-Latn">Makras M4</comment>
- <comment xml:lang="bg">Макроси — M4</comment>
- <comment xml:lang="ca">macro M4</comment>
- <comment xml:lang="cs">makro M4</comment>
- <comment xml:lang="da">M4-makro</comment>
- <comment xml:lang="de">M4-Makro</comment>
- <comment xml:lang="el">Μακροεντολή m4</comment>
- <comment xml:lang="en-GB">M4 macro</comment>
- <comment xml:lang="es">macro M4</comment>
- <comment xml:lang="eu">M4 makroa</comment>
- <comment xml:lang="fi">M4-makro</comment>
- <comment xml:lang="fo">M4 fjølvi</comment>
- <comment xml:lang="fr">macro M4</comment>
- <comment xml:lang="fur">macro M4</comment>
- <comment xml:lang="ga">macra M4</comment>
- <comment xml:lang="gl">macro M4</comment>
- <comment xml:lang="he">מאקרו M4</comment>
- <comment xml:lang="hr">M4 makro</comment>
- <comment xml:lang="hu">M4 makró</comment>
- <comment xml:lang="ia">Macro M4</comment>
- <comment xml:lang="id">Makro M4</comment>
- <comment xml:lang="it">Macro M4</comment>
- <comment xml:lang="ja">M4 マクロ</comment>
- <comment xml:lang="kk">M4 макросы</comment>
- <comment xml:lang="ko">M4 매크로</comment>
- <comment xml:lang="lt">M4 macro</comment>
- <comment xml:lang="lv">M4 makross</comment>
- <comment xml:lang="nb">M4-makro</comment>
- <comment xml:lang="nl">M4-macro</comment>
- <comment xml:lang="nn">M4-makro</comment>
- <comment xml:lang="oc">macro M4</comment>
- <comment xml:lang="pl">Makro M4</comment>
- <comment xml:lang="pt">macro M4</comment>
- <comment xml:lang="pt-BR">Macro M4</comment>
- <comment xml:lang="ro">Macro M4</comment>
- <comment xml:lang="ru">Макрос M4</comment>
- <comment xml:lang="sk">Makro M4</comment>
- <comment xml:lang="sl">Makro datoteka M4</comment>
- <comment xml:lang="sq">Macro M4</comment>
- <comment xml:lang="sr">М4 макро</comment>
- <comment xml:lang="sv">M4-makro</comment>
- <comment xml:lang="tr">M4 makrosu</comment>
- <comment xml:lang="uk">макрос M4</comment>
+ <comment xml:lang="zh_TW">M4 巨集</comment>
+ <comment xml:lang="zh_CN">M4 宏</comment>
<comment xml:lang="vi">Vĩ lệnh M4</comment>
- <comment xml:lang="zh-CN">M4 宏</comment>
- <comment xml:lang="zh-TW">M4 巨集</comment>
+ <comment xml:lang="uk">макрос M4</comment>
+ <comment xml:lang="tr">M4 makrosu</comment>
+ <comment xml:lang="sv">M4-makro</comment>
+ <comment xml:lang="sr">М4 макро</comment>
+ <comment xml:lang="sq">Macro M4</comment>
+ <comment xml:lang="sl">Makro datoteka M4</comment>
+ <comment xml:lang="si">M4 මැක්රෝ</comment>
+ <comment xml:lang="sk">Makro M4</comment>
+ <comment xml:lang="ru">Макрос M4</comment>
+ <comment xml:lang="ro">Macro M4</comment>
+ <comment xml:lang="pt_BR">Macro M4</comment>
+ <comment xml:lang="pt">macro M4</comment>
+ <comment xml:lang="pl">Makro M4</comment>
+ <comment xml:lang="oc">macro M4</comment>
+ <comment xml:lang="nn">M4-makro</comment>
+ <comment xml:lang="nl">M4-macro</comment>
+ <comment xml:lang="nb">M4-makro</comment>
+ <comment xml:lang="lv">M4 makross</comment>
+ <comment xml:lang="lt">M4 macro</comment>
+ <comment xml:lang="ko">M4 매크로</comment>
+ <comment xml:lang="kk">M4 макросы</comment>
+ <comment xml:lang="ja">M4 マクロ</comment>
+ <comment xml:lang="it">Macro M4</comment>
+ <comment xml:lang="is">M4 fjölvi</comment>
+ <comment xml:lang="id">Makro M4</comment>
+ <comment xml:lang="ia">Macro M4</comment>
+ <comment xml:lang="hu">M4 makró</comment>
+ <comment xml:lang="hr">M4 makro</comment>
+ <comment xml:lang="he">מאקרו M4</comment>
+ <comment xml:lang="gl">macro M4</comment>
+ <comment xml:lang="ga">macra M4</comment>
+ <comment xml:lang="fur">macro M4</comment>
+ <comment xml:lang="fr">macro M4</comment>
+ <comment xml:lang="fo">M4 fjølvi</comment>
+ <comment xml:lang="fi">M4-makro</comment>
+ <comment xml:lang="eu">M4 makroa</comment>
+ <comment xml:lang="es">macro M4</comment>
+ <comment xml:lang="en_GB">M4 macro</comment>
+ <comment xml:lang="el">Μακροεντολή m4</comment>
+ <comment xml:lang="de">M4-Makro</comment>
+ <comment xml:lang="da">M4-makro</comment>
+ <comment xml:lang="cs">makro M4</comment>
+ <comment xml:lang="ca">macro M4</comment>
+ <comment xml:lang="bg">Макроси — M4</comment>
+ <comment xml:lang="be@latin">Makras M4</comment>
+ <comment xml:lang="be">макрас M4</comment>
+ <comment xml:lang="ar">ماكرو M4</comment>
+ <comment xml:lang="af">M4-makro</comment>
<sub-class-of type="text/plain"/>
<generic-icon name="text-x-script"/>
<glob pattern="*.m4"/>
</mime-type>
<mime-type type="application/x-n64-rom">
<comment>Nintendo64 ROM</comment>
- <comment xml:lang="ar">Nintendo64 ROM</comment>
- <comment xml:lang="be-Latn">Nintendo64 ROM</comment>
- <comment xml:lang="bg">ROM — Nintendo64</comment>
- <comment xml:lang="ca">ROM de Nintendo64</comment>
- <comment xml:lang="cs">ROM pro Nintendo64</comment>
- <comment xml:lang="da">Nintendo64-ROM</comment>
- <comment xml:lang="de">Nintendo64 ROM</comment>
- <comment xml:lang="el">Nintendo64 ROM</comment>
- <comment xml:lang="en-GB">Nintendo64 ROM</comment>
- <comment xml:lang="eo">Nintendo64-NLM</comment>
- <comment xml:lang="es">ROM de Nintendo64</comment>
- <comment xml:lang="eu">Nintendo64-ko ROMa</comment>
- <comment xml:lang="fi">Nintendo64-ROM</comment>
- <comment xml:lang="fo">Nintendo64 ROM</comment>
- <comment xml:lang="fr">ROM Nintendo64</comment>
- <comment xml:lang="fur">ROM Nintendo64</comment>
- <comment xml:lang="ga">ROM Nintendo64</comment>
- <comment xml:lang="gl">ROM de Nintendo64</comment>
- <comment xml:lang="he">ROM של Nintendo64</comment>
- <comment xml:lang="hr">Nintendo64 ROM</comment>
- <comment xml:lang="hu">Nintendo64 ROM</comment>
- <comment xml:lang="ia">ROM pro Nintendo64</comment>
- <comment xml:lang="id">Memori baca-saja Nintendo64</comment>
- <comment xml:lang="it">ROM Nintendo64</comment>
- <comment xml:lang="ja">Nintendo64 ROM</comment>
- <comment xml:lang="kk">Nintendo64 ROM</comment>
- <comment xml:lang="ko">닌텐도 64 롬</comment>
- <comment xml:lang="lt">Nintendo64 ROM</comment>
- <comment xml:lang="lv">Nintendo64 ROM</comment>
- <comment xml:lang="ms">ROM Nintendo64</comment>
- <comment xml:lang="nb">Nintendo64-ROM</comment>
- <comment xml:lang="nl">Nintendo64-ROM</comment>
- <comment xml:lang="nn">Nintendo64-ROM</comment>
- <comment xml:lang="oc">ROM Nintendo64</comment>
- <comment xml:lang="pl">Plik ROM konsoli Nintendo64</comment>
- <comment xml:lang="pt">ROM Nintendo64</comment>
- <comment xml:lang="pt-BR">ROM de Nintendo64</comment>
- <comment xml:lang="ro">ROM Nintendo64</comment>
- <comment xml:lang="ru">Nintendo64 ROM</comment>
- <comment xml:lang="sk">ROM pre Nintendo64</comment>
- <comment xml:lang="sl">Bralni pomnilnik Nintendo64</comment>
- <comment xml:lang="sq">ROM Nintendo64</comment>
- <comment xml:lang="sr">Нинтендо64 РОМ</comment>
- <comment xml:lang="sv">Nintendo64-rom</comment>
- <comment xml:lang="tr">Nintendo64 ROM</comment>
- <comment xml:lang="uk">ППП Nintendo64</comment>
+ <comment xml:lang="zh_TW">Nintendo64 ROM</comment>
+ <comment xml:lang="zh_CN">任天堂 64 ROM</comment>
<comment xml:lang="vi">ROM Nintendo64</comment>
- <comment xml:lang="zh-CN">任天堂 64 ROM</comment>
- <comment xml:lang="zh-TW">Nintendo64 ROM</comment>
+ <comment xml:lang="uk">ППП Nintendo64</comment>
+ <comment xml:lang="tr">Nintendo64 ROM</comment>
+ <comment xml:lang="sv">Nintendo64-rom</comment>
+ <comment xml:lang="sr">Нинтендо64 РОМ</comment>
+ <comment xml:lang="sq">ROM Nintendo64</comment>
+ <comment xml:lang="sl">Bralni pomnilnik Nintendo64</comment>
+ <comment xml:lang="si">Nintendo64 ROM</comment>
+ <comment xml:lang="sk">ROM pre Nintendo64</comment>
+ <comment xml:lang="ru">Nintendo64 ROM</comment>
+ <comment xml:lang="ro">ROM Nintendo64</comment>
+ <comment xml:lang="pt_BR">ROM de Nintendo64</comment>
+ <comment xml:lang="pt">ROM Nintendo64</comment>
+ <comment xml:lang="pl">Plik ROM konsoli Nintendo64</comment>
+ <comment xml:lang="oc">ROM Nintendo64</comment>
+ <comment xml:lang="nn">Nintendo64-ROM</comment>
+ <comment xml:lang="nl">Nintendo64-ROM</comment>
+ <comment xml:lang="nb">Nintendo64-ROM</comment>
+ <comment xml:lang="ms">ROM Nintendo64</comment>
+ <comment xml:lang="lv">Nintendo64 ROM</comment>
+ <comment xml:lang="lt">Nintendo64 ROM</comment>
+ <comment xml:lang="ko">닌텐도 64 롬</comment>
+ <comment xml:lang="kk">Nintendo64 ROM</comment>
+ <comment xml:lang="ja">Nintendo64 ROM</comment>
+ <comment xml:lang="it">ROM Nintendo64</comment>
+ <comment xml:lang="is">Nintendo64 ROM</comment>
+ <comment xml:lang="id">Memori baca-saja Nintendo64</comment>
+ <comment xml:lang="ia">ROM pro Nintendo64</comment>
+ <comment xml:lang="hu">Nintendo64 ROM</comment>
+ <comment xml:lang="hr">Nintendo64 ROM</comment>
+ <comment xml:lang="he">ROM של Nintendo64</comment>
+ <comment xml:lang="gl">ROM de Nintendo64</comment>
+ <comment xml:lang="ga">ROM Nintendo64</comment>
+ <comment xml:lang="fur">ROM Nintendo64</comment>
+ <comment xml:lang="fr">ROM Nintendo64</comment>
+ <comment xml:lang="fo">Nintendo64 ROM</comment>
+ <comment xml:lang="fi">Nintendo64-ROM</comment>
+ <comment xml:lang="eu">Nintendo64-ko ROMa</comment>
+ <comment xml:lang="es">ROM de Nintendo64</comment>
+ <comment xml:lang="eo">Nintendo64-NLM</comment>
+ <comment xml:lang="en_GB">Nintendo64 ROM</comment>
+ <comment xml:lang="el">Nintendo64 ROM</comment>
+ <comment xml:lang="de">Nintendo64-ROM</comment>
+ <comment xml:lang="da">Nintendo64-ROM</comment>
+ <comment xml:lang="cs">ROM pro Nintendo64</comment>
+ <comment xml:lang="ca">ROM de Nintendo64</comment>
+ <comment xml:lang="bg">ROM — Nintendo64</comment>
+ <comment xml:lang="be@latin">Nintendo64 ROM</comment>
+ <comment xml:lang="be">Nintendo64 ROM</comment>
+ <comment xml:lang="ar">روم Nintendo64</comment>
<generic-icon name="application-x-executable"/>
<glob pattern="*.n64"/>
<glob pattern="*.z64"/>
@@ -17173,94 +18079,107 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-nautilus-link">
<comment>Nautilus link</comment>
- <comment xml:lang="af">Nautilus-skakel</comment>
- <comment xml:lang="ar">وصلة Nautilus</comment>
- <comment xml:lang="az">Nautilus körpüsü</comment>
- <comment xml:lang="be-Latn">Spasyłka Nautilus</comment>
- <comment xml:lang="bg">Връзка — Nautilus</comment>
- <comment xml:lang="ca">enllaç de Nautilus</comment>
- <comment xml:lang="cs">odkaz Nautilus</comment>
- <comment xml:lang="cy">Cyswllt Nautilus</comment>
- <comment xml:lang="da">Nautilus-henvisning</comment>
- <comment xml:lang="de">Nautilus-Verknüpfung</comment>
- <comment xml:lang="el">Σύνδεσμος Nautilus</comment>
- <comment xml:lang="en-GB">Nautilus link</comment>
- <comment xml:lang="eo">Nautilus-ligilo</comment>
- <comment xml:lang="es">enlace de Nautilus</comment>
- <comment xml:lang="eu">Nautilus esteka</comment>
- <comment xml:lang="fi">Nautilus-linkki</comment>
- <comment xml:lang="fo">Nautilus leinkja</comment>
- <comment xml:lang="fr">lien Nautilus</comment>
- <comment xml:lang="fur">colegament Nautilus</comment>
- <comment xml:lang="ga">nasc Nautilus</comment>
- <comment xml:lang="gl">ligazón de nautilus</comment>
- <comment xml:lang="he">קישור של Nautilus</comment>
- <comment xml:lang="hr">Nautilusova poveznica</comment>
- <comment xml:lang="hu">Nautilus-link</comment>
- <comment xml:lang="ia">Ligamine Nautilus</comment>
- <comment xml:lang="id">Taut Nautilus</comment>
- <comment xml:lang="it">Collegamento Nautilus</comment>
- <comment xml:lang="ja">Nautilus リンク</comment>
- <comment xml:lang="kk">Nautilus сілтемесі</comment>
- <comment xml:lang="ko">노틸러스 바로 가기</comment>
- <comment xml:lang="lt">Nautilus nuoroda</comment>
- <comment xml:lang="lv">Nautilus saite</comment>
- <comment xml:lang="ms">Pautan Nautilus</comment>
- <comment xml:lang="nb">Nautilus-lenke</comment>
- <comment xml:lang="nl">Nautilus-verwijzing</comment>
- <comment xml:lang="nn">Nautilus-lenke</comment>
- <comment xml:lang="oc">ligam Nautilus</comment>
- <comment xml:lang="pl">Odnośnik Nautilus</comment>
- <comment xml:lang="pt">atalho Nautilus</comment>
- <comment xml:lang="pt-BR">Link do Nautilus</comment>
- <comment xml:lang="ro">Legătură Nautilus</comment>
- <comment xml:lang="ru">Ссылка Nautilus</comment>
- <comment xml:lang="sk">Odkaz Nautilus</comment>
- <comment xml:lang="sl">Datoteka povezave Nautilus</comment>
- <comment xml:lang="sq">Lidhje Nautilus</comment>
- <comment xml:lang="sr">Наутилусова веза</comment>
- <comment xml:lang="sv">Nautiluslänk</comment>
- <comment xml:lang="tr">Nautilus bağlantısı</comment>
- <comment xml:lang="uk">посилання Nautilus</comment>
+ <comment xml:lang="zh_TW">Nautilus 連結</comment>
+ <comment xml:lang="zh_CN">Nautilus 链接</comment>
<comment xml:lang="vi">Liên kết Nautilus</comment>
- <comment xml:lang="zh-CN">Nautilus 链接</comment>
- <comment xml:lang="zh-TW">Nautilus 連結</comment>
+ <comment xml:lang="uk">посилання Nautilus</comment>
+ <comment xml:lang="tr">Nautilus bağlantısı</comment>
+ <comment xml:lang="sv">Nautiluslänk</comment>
+ <comment xml:lang="sr">Наутилусова веза</comment>
+ <comment xml:lang="sq">lidhje Nautilus</comment>
+ <comment xml:lang="sl">Datoteka povezave Nautilus</comment>
+ <comment xml:lang="si">Nautilus සබැඳිය</comment>
+ <comment xml:lang="sk">Odkaz Nautilus</comment>
+ <comment xml:lang="ru">Ссылка Nautilus</comment>
+ <comment xml:lang="ro">Legătură Nautilus</comment>
+ <comment xml:lang="pt_BR">Link do Nautilus</comment>
+ <comment xml:lang="pt">atalho Nautilus</comment>
+ <comment xml:lang="pl">Odnośnik Nautilus</comment>
+ <comment xml:lang="oc">ligam Nautilus</comment>
+ <comment xml:lang="nn">Nautilus-lenke</comment>
+ <comment xml:lang="nl">Nautilus-verwijzing</comment>
+ <comment xml:lang="nb">Nautilus-lenke</comment>
+ <comment xml:lang="ms">Pautan Nautilus</comment>
+ <comment xml:lang="lv">Nautilus saite</comment>
+ <comment xml:lang="lt">Nautilus nuoroda</comment>
+ <comment xml:lang="ko">노틸러스 바로 가기</comment>
+ <comment xml:lang="kk">Nautilus сілтемесі</comment>
+ <comment xml:lang="ja">Nautilus リンク</comment>
+ <comment xml:lang="it">Collegamento Nautilus</comment>
+ <comment xml:lang="is">Nautilus tengill</comment>
+ <comment xml:lang="id">Taut Nautilus</comment>
+ <comment xml:lang="ia">Ligamine Nautilus</comment>
+ <comment xml:lang="hu">Nautilus-link</comment>
+ <comment xml:lang="hr">Nautilusova poveznica</comment>
+ <comment xml:lang="he">קישור של Nautilus</comment>
+ <comment xml:lang="gl">ligazón de nautilus</comment>
+ <comment xml:lang="ga">nasc Nautilus</comment>
+ <comment xml:lang="fur">colegament Nautilus</comment>
+ <comment xml:lang="fr">lien Nautilus</comment>
+ <comment xml:lang="fo">Nautilus leinkja</comment>
+ <comment xml:lang="fi">Nautilus-linkki</comment>
+ <comment xml:lang="eu">Nautilus esteka</comment>
+ <comment xml:lang="es">enlace de Nautilus</comment>
+ <comment xml:lang="eo">Nautilus-ligilo</comment>
+ <comment xml:lang="en_GB">Nautilus link</comment>
+ <comment xml:lang="el">Σύνδεσμος Nautilus</comment>
+ <comment xml:lang="de">Nautilus-Verknüpfung</comment>
+ <comment xml:lang="da">Nautilus-henvisning</comment>
+ <comment xml:lang="cy">Cyswllt Nautilus</comment>
+ <comment xml:lang="cs">odkaz Nautilus</comment>
+ <comment xml:lang="ca">enllaç de Nautilus</comment>
+ <comment xml:lang="bg">Връзка — Nautilus</comment>
+ <comment xml:lang="be@latin">Spasyłka Nautilus</comment>
+ <comment xml:lang="be">спасылка Nautilus</comment>
+ <comment xml:lang="az">Nautilus körpüsü</comment>
+ <comment xml:lang="ar">وصلة Nautilus</comment>
+ <comment xml:lang="af">Nautilus-skakel</comment>
<sub-class-of type="text/plain"/>
<generic-icon name="text-x-generic"/>
- <magic priority="50">
+ <magic>
<match type="string" value="&lt;nautilus_object nautilus_link" offset="0:32"/>
</magic>
</mime-type>
<mime-type type="application/x-neo-geo-pocket-rom">
<comment>Neo-Geo Pocket ROM</comment>
- <comment xml:lang="bg">ROM — Neo-Geo Pocket</comment>
- <comment xml:lang="ca">ROM de Neo-Geo Pocket</comment>
- <comment xml:lang="cs">ROM pro Neo-Geo Pocket</comment>
- <comment xml:lang="da">Neo-Geo Pocket-ROM</comment>
- <comment xml:lang="de">Neo-Geo Pocket ROM</comment>
- <comment xml:lang="en-GB">Neo-Geo Pocket ROM</comment>
- <comment xml:lang="es">ROM de Neo-Geo Pocket</comment>
- <comment xml:lang="eu">Neo-Geo Pocket ROM</comment>
- <comment xml:lang="fi">Neo-Geo Pocket -ROM</comment>
- <comment xml:lang="fr">ROM Neo-Geo Pocket</comment>
- <comment xml:lang="fur">ROM Neo-Geo Pocket</comment>
- <comment xml:lang="ga">ROM Neo-Geo Pocket</comment>
- <comment xml:lang="hr">Neo-Geo Pocket ROM</comment>
- <comment xml:lang="hu">Neo-Geo Pocket ROM</comment>
- <comment xml:lang="id">ROM Neo-Geo Pocket</comment>
- <comment xml:lang="it">ROM Neo-Geo Pocket</comment>
- <comment xml:lang="kk">Neo-Geo Pocket ROM</comment>
- <comment xml:lang="ko">네오지오 포켓 롬</comment>
- <comment xml:lang="pl">Plik ROM konsoli Neo-Geo Pocket</comment>
- <comment xml:lang="pt-BR">ROM de Neo-Geo Pocket</comment>
- <comment xml:lang="ru">Neo-Geo Pocket ROM</comment>
- <comment xml:lang="sk">ROM pre Neo-Geo Pocket</comment>
- <comment xml:lang="sr">Нео-Гео Покет РОМ</comment>
- <comment xml:lang="sv">Neo-Geo Pocket-rom</comment>
- <comment xml:lang="tr">Neo-Geo Pocket ROM</comment>
+ <comment xml:lang="zh_TW">Neo-Geo Pocket ROM</comment>
+ <comment xml:lang="zh_CN">Neo-Geo Pocket ROM</comment>
<comment xml:lang="uk">ППП Neo-Geo Pocket</comment>
- <comment xml:lang="zh-CN">Neo-Geo Pocket ROM</comment>
- <comment xml:lang="zh-TW">Neo-Geo Pocket ROM</comment>
+ <comment xml:lang="tr">Neo-Geo Pocket ROM</comment>
+ <comment xml:lang="sv">Neo-Geo Pocket-rom</comment>
+ <comment xml:lang="sr">Нео-Гео Покет РОМ</comment>
+ <comment xml:lang="sq">ROM Neo-Geo Pocket</comment>
+ <comment xml:lang="sl">Neo-Geo Pocket ROM</comment>
+ <comment xml:lang="si">Neo-Geo Pocket ROM</comment>
+ <comment xml:lang="sk">ROM pre Neo-Geo Pocket</comment>
+ <comment xml:lang="ru">Neo-Geo Pocket ROM</comment>
+ <comment xml:lang="pt_BR">ROM de Neo-Geo Pocket</comment>
+ <comment xml:lang="pl">Plik ROM konsoli Neo-Geo Pocket</comment>
+ <comment xml:lang="nl">Neo-Geo Pocket-ROM</comment>
+ <comment xml:lang="ko">네오지오 포켓 롬</comment>
+ <comment xml:lang="kk">Neo-Geo Pocket ROM</comment>
+ <comment xml:lang="ja">ネオジオポケット ROM</comment>
+ <comment xml:lang="it">ROM Neo-Geo Pocket</comment>
+ <comment xml:lang="is">Neo-Geo Pocket ROM</comment>
+ <comment xml:lang="id">ROM Neo-Geo Pocket</comment>
+ <comment xml:lang="hu">Neo-Geo Pocket ROM</comment>
+ <comment xml:lang="hr">Neo-Geo Pocket ROM</comment>
+ <comment xml:lang="he">ROM מסוג Neo-Geo Pocket</comment>
+ <comment xml:lang="gl">ROM de Neo-Geo Pocket</comment>
+ <comment xml:lang="ga">ROM Neo-Geo Pocket</comment>
+ <comment xml:lang="fur">ROM Neo-Geo Pocket</comment>
+ <comment xml:lang="fr">ROM Neo-Geo Pocket</comment>
+ <comment xml:lang="fi">Neo-Geo Pocket -ROM</comment>
+ <comment xml:lang="eu">Neo-Geo Pocket ROM</comment>
+ <comment xml:lang="es">ROM de Neo-Geo Pocket</comment>
+ <comment xml:lang="en_GB">Neo-Geo Pocket ROM</comment>
+ <comment xml:lang="de">Neo-Geo-Pocket-ROM</comment>
+ <comment xml:lang="da">Neo-Geo Pocket-ROM</comment>
+ <comment xml:lang="cs">ROM pro Neo-Geo Pocket</comment>
+ <comment xml:lang="ca">ROM de Neo-Geo Pocket</comment>
+ <comment xml:lang="bg">ROM — Neo-Geo Pocket</comment>
+ <comment xml:lang="be">Neo-Geo Pocket ROM</comment>
+ <comment xml:lang="ar">روم Neo-Geo Pocket</comment>
<generic-icon name="application-x-executable"/>
<glob pattern="*.ngp"/>
<magic>
@@ -17272,33 +18191,43 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-neo-geo-pocket-color-rom">
<comment>Neo-Geo Pocket Color ROM</comment>
- <comment xml:lang="bg">ROM — Neo-Geo Pocket Color</comment>
- <comment xml:lang="ca">ROM de Neo-Geo Pocket Color</comment>
- <comment xml:lang="cs">ROM pro Neo-Geo Pocket Color</comment>
- <comment xml:lang="da">Neo-Geo Pocket Color-ROM</comment>
- <comment xml:lang="de">Neo-Geo Pocket Color ROM</comment>
- <comment xml:lang="en-GB">Neo-Geo Pocket Colour ROM</comment>
- <comment xml:lang="es">ROM de Neo-Geo Pocket Color</comment>
- <comment xml:lang="eu">Neo-Geo Pocket Color ROM</comment>
- <comment xml:lang="fi">Neo-Geo Pocket Color ROM</comment>
- <comment xml:lang="fr">ROM Neo-Geo Pocket Color</comment>
- <comment xml:lang="fur">ROM Neo-Geo Pocket Color</comment>
- <comment xml:lang="ga">ROM datha Neo-Geo Pocket</comment>
- <comment xml:lang="hr">Neo-Geo Pocket Color ROM</comment>
- <comment xml:lang="hu">Neo-Geo Pocket Color ROM</comment>
- <comment xml:lang="id">ROM Neo-Geo Pocket Color</comment>
- <comment xml:lang="it">ROM Neo-Geo Pocket Color</comment>
- <comment xml:lang="kk">Neo-Geo Pocket Color ROM</comment>
- <comment xml:lang="ko">네오지오 포켓 컬러 롬</comment>
- <comment xml:lang="pl">Plik ROM konsoli Neo-Geo Pocket Color</comment>
- <comment xml:lang="pt-BR">ROM de Neo-Geo Pocket Color</comment>
- <comment xml:lang="ru">Neo-Geo Pocket Color ROM</comment>
- <comment xml:lang="sk">ROM pre Neo-Geo Pocket Color</comment>
- <comment xml:lang="sv">Neo-Geo Pocket Color ROM</comment>
- <comment xml:lang="tr">Neo-Geo Pocket Color ROM</comment>
+ <comment xml:lang="zh_TW">Neo-Geo Pocket Color ROM</comment>
+ <comment xml:lang="zh_CN">Neo-Geo Pocket Color ROM</comment>
<comment xml:lang="uk">ППП Neo-Geo Pocket Color</comment>
- <comment xml:lang="zh-CN">Neo-Geo Pocket Color ROM</comment>
- <comment xml:lang="zh-TW">Neo-Geo Pocket Color ROM</comment>
+ <comment xml:lang="tr">Neo-Geo Pocket Color ROM</comment>
+ <comment xml:lang="sv">Neo-Geo Pocket Color ROM</comment>
+ <comment xml:lang="sq">ROM Neo-Geo Pocket Color</comment>
+ <comment xml:lang="sl">Neo-Geo Pocket Color ROM</comment>
+ <comment xml:lang="si">Neo-Geo Pocket Color ROM</comment>
+ <comment xml:lang="sk">ROM pre Neo-Geo Pocket Color</comment>
+ <comment xml:lang="ru">Neo-Geo Pocket Color ROM</comment>
+ <comment xml:lang="pt_BR">ROM de Neo-Geo Pocket Color</comment>
+ <comment xml:lang="pl">Plik ROM konsoli Neo-Geo Pocket Color</comment>
+ <comment xml:lang="nl">Neo-Geo Pocket Color-ROM</comment>
+ <comment xml:lang="ko">네오지오 포켓 컬러 롬</comment>
+ <comment xml:lang="kk">Neo-Geo Pocket Color ROM</comment>
+ <comment xml:lang="ja">ネオジオポケットカラー ROM</comment>
+ <comment xml:lang="it">ROM Neo-Geo Pocket Color</comment>
+ <comment xml:lang="is">Neo-Geo Pocket Color ROM</comment>
+ <comment xml:lang="id">ROM Neo-Geo Pocket Color</comment>
+ <comment xml:lang="hu">Neo-Geo Pocket Color ROM</comment>
+ <comment xml:lang="hr">Neo-Geo Pocket Color ROM</comment>
+ <comment xml:lang="he">ROM של Neo-Geo Pocket</comment>
+ <comment xml:lang="gl">ROM de Neo-Geo Pocket Color</comment>
+ <comment xml:lang="ga">ROM datha Neo-Geo Pocket</comment>
+ <comment xml:lang="fur">ROM Neo-Geo Pocket Color</comment>
+ <comment xml:lang="fr">ROM Neo-Geo Pocket Color</comment>
+ <comment xml:lang="fi">Neo-Geo Pocket Color -ROM</comment>
+ <comment xml:lang="eu">Neo-Geo Pocket Color ROM</comment>
+ <comment xml:lang="es">ROM de Neo-Geo Pocket Color</comment>
+ <comment xml:lang="en_GB">Neo-Geo Pocket Colour ROM</comment>
+ <comment xml:lang="de">Neo-Geo-Pocket-Color-ROM</comment>
+ <comment xml:lang="da">Neo-Geo Pocket Color-ROM</comment>
+ <comment xml:lang="cs">ROM pro Neo-Geo Pocket Color</comment>
+ <comment xml:lang="ca">ROM de Neo-Geo Pocket Color</comment>
+ <comment xml:lang="bg">ROM — Neo-Geo Pocket Color</comment>
+ <comment xml:lang="be">Neo-Geo Pocket Color ROM</comment>
+ <comment xml:lang="ar">روم Neo-Geo Pocket Color</comment>
<generic-icon name="application-x-executable"/>
<glob pattern="*.ngc"/>
<magic>
@@ -17311,56 +18240,59 @@ command to generate the output files.
<mime-type type="application/x-nes-rom">
<!-- Translate this to Famicom if the console was known as such in your locale -->
<comment>NES ROM</comment>
- <comment xml:lang="ar">NES ROM</comment>
- <comment xml:lang="be-Latn">NES ROM</comment>
- <comment xml:lang="bg">ROM — NES</comment>
- <comment xml:lang="ca">ROM de NES</comment>
- <comment xml:lang="cs">ROM pro NES</comment>
- <comment xml:lang="cy">ROM NES</comment>
- <comment xml:lang="da">NES-ROM</comment>
- <comment xml:lang="de">NES ROM</comment>
- <comment xml:lang="el">NES ROM</comment>
- <comment xml:lang="en-GB">NES ROM</comment>
- <comment xml:lang="eo">NES-NLM</comment>
- <comment xml:lang="es">ROM de NES</comment>
- <comment xml:lang="eu">NES-eko ROMa</comment>
- <comment xml:lang="fi">NES-ROM</comment>
- <comment xml:lang="fo">NES ROM</comment>
- <comment xml:lang="fr">ROM NES</comment>
- <comment xml:lang="fur">ROM NES</comment>
- <comment xml:lang="ga">ROM NES</comment>
- <comment xml:lang="gl">ROM de NES</comment>
- <comment xml:lang="he">ROM של NES</comment>
- <comment xml:lang="hr">NES ROM</comment>
- <comment xml:lang="hu">NES ROM</comment>
- <comment xml:lang="ia">ROM pro NES</comment>
- <comment xml:lang="id">Memori baca-saja NES</comment>
- <comment xml:lang="it">ROM NES</comment>
- <comment xml:lang="ja">ファミコン ROM</comment>
- <comment xml:lang="kk">NES ROM</comment>
- <comment xml:lang="ko">NES 롬</comment>
- <comment xml:lang="lt">NES ROM</comment>
- <comment xml:lang="lv">NES ROM</comment>
- <comment xml:lang="ms">ROM NES</comment>
- <comment xml:lang="nb">NES ROM</comment>
- <comment xml:lang="nl">Nintendo</comment>
- <comment xml:lang="nn">NES-ROM</comment>
- <comment xml:lang="oc">ROM NES</comment>
- <comment xml:lang="pl">Plik ROM konsoli NES</comment>
- <comment xml:lang="pt">ROM NES</comment>
- <comment xml:lang="pt-BR">ROM de NES</comment>
- <comment xml:lang="ro">ROM NES</comment>
- <comment xml:lang="ru">NES ROM</comment>
- <comment xml:lang="sk">ROM pre NES</comment>
- <comment xml:lang="sl">Bralni pomnilnik NES</comment>
- <comment xml:lang="sq">ROM NES</comment>
- <comment xml:lang="sr">НЕС РОМ</comment>
- <comment xml:lang="sv">NES-rom</comment>
- <comment xml:lang="tr">NES ROM</comment>
- <comment xml:lang="uk">ППП NES</comment>
+ <comment xml:lang="zh_TW">任天堂紅白機 ROM</comment>
+ <comment xml:lang="zh_CN">NES ROM</comment>
<comment xml:lang="vi">ROM NES</comment>
- <comment xml:lang="zh-CN">NES ROM</comment>
- <comment xml:lang="zh-TW">任天堂紅白機 ROM</comment>
+ <comment xml:lang="uk">ППП NES</comment>
+ <comment xml:lang="tr">NES ROM</comment>
+ <comment xml:lang="sv">NES-rom</comment>
+ <comment xml:lang="sr">НЕС РОМ</comment>
+ <comment xml:lang="sq">ROM NES</comment>
+ <comment xml:lang="sl">Bralni pomnilnik NES</comment>
+ <comment xml:lang="si">NES ROM</comment>
+ <comment xml:lang="sk">ROM pre NES</comment>
+ <comment xml:lang="ru">NES ROM</comment>
+ <comment xml:lang="ro">ROM NES</comment>
+ <comment xml:lang="pt_BR">ROM de NES</comment>
+ <comment xml:lang="pt">ROM NES</comment>
+ <comment xml:lang="pl">Plik ROM konsoli NES</comment>
+ <comment xml:lang="oc">ROM NES</comment>
+ <comment xml:lang="nn">NES-ROM</comment>
+ <comment xml:lang="nl">Super Nintendo-ROM</comment>
+ <comment xml:lang="nb">NES ROM</comment>
+ <comment xml:lang="ms">ROM NES</comment>
+ <comment xml:lang="lv">NES ROM</comment>
+ <comment xml:lang="lt">NES ROM</comment>
+ <comment xml:lang="ko">NES 롬</comment>
+ <comment xml:lang="kk">NES ROM</comment>
+ <comment xml:lang="ja">ファミコン ROM</comment>
+ <comment xml:lang="it">ROM NES</comment>
+ <comment xml:lang="is">NES ROM</comment>
+ <comment xml:lang="id">Memori baca-saja NES</comment>
+ <comment xml:lang="ia">ROM pro NES</comment>
+ <comment xml:lang="hu">NES ROM</comment>
+ <comment xml:lang="hr">NES ROM</comment>
+ <comment xml:lang="he">ROM של NES</comment>
+ <comment xml:lang="gl">ROM de NES</comment>
+ <comment xml:lang="ga">ROM NES</comment>
+ <comment xml:lang="fur">ROM NES</comment>
+ <comment xml:lang="fr">ROM NES</comment>
+ <comment xml:lang="fo">NES ROM</comment>
+ <comment xml:lang="fi">NES-ROM</comment>
+ <comment xml:lang="eu">NES-eko ROMa</comment>
+ <comment xml:lang="es">ROM de NES</comment>
+ <comment xml:lang="eo">NES-NLM</comment>
+ <comment xml:lang="en_GB">NES ROM</comment>
+ <comment xml:lang="el">NES ROM</comment>
+ <comment xml:lang="de">NES-ROM</comment>
+ <comment xml:lang="da">NES-ROM</comment>
+ <comment xml:lang="cy">ROM NES</comment>
+ <comment xml:lang="cs">ROM pro NES</comment>
+ <comment xml:lang="ca">ROM de NES</comment>
+ <comment xml:lang="bg">ROM — NES</comment>
+ <comment xml:lang="be@latin">NES ROM</comment>
+ <comment xml:lang="be">NES ROM</comment>
+ <comment xml:lang="ar">روم NES</comment>
<generic-icon name="application-x-executable"/>
<glob pattern="*.nes"/>
<glob pattern="*.nez"/>
@@ -17369,56 +18301,59 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-netcdf">
<comment>Unidata NetCDF document</comment>
- <comment xml:lang="ar">مستند Unidata NetCDF</comment>
- <comment xml:lang="ast">Documentu NetCDF d'Unidata</comment>
- <comment xml:lang="be-Latn">Dakument Unidata NetCDF</comment>
- <comment xml:lang="bg">Документ — Unidata NetCDF</comment>
- <comment xml:lang="ca">document d'Unidata NetCDF</comment>
- <comment xml:lang="cs">dokument Unidata NetCDF</comment>
- <comment xml:lang="da">Unidata NetCDF-dokument</comment>
- <comment xml:lang="de">Unidata-NetCDF-Dokument</comment>
- <comment xml:lang="el">Έγγραφο Unidata NetCDF</comment>
- <comment xml:lang="en-GB">Unidata NetCDF document</comment>
- <comment xml:lang="eo">dokumento en NetCDF-formato de Unidata</comment>
- <comment xml:lang="es">documento de Unidata NetCDF</comment>
- <comment xml:lang="eu">Unidata NetCDF dokumentua</comment>
- <comment xml:lang="fi">Unidata NetCDF -asiakirja</comment>
- <comment xml:lang="fo">Unidata NetCDF skjal</comment>
- <comment xml:lang="fr">document Unidata NetCDF</comment>
- <comment xml:lang="fur">document Unidata NetCDF</comment>
- <comment xml:lang="ga">cáipéis Unidata NetCDF</comment>
- <comment xml:lang="gl">Documentno de Unixdata NetCDF</comment>
- <comment xml:lang="he">מסמך של Unidata NetCDF</comment>
- <comment xml:lang="hr">Unidata NetCDF dokument</comment>
- <comment xml:lang="hu">Unidata NetCDF-dokumentum</comment>
- <comment xml:lang="ia">Documento Unidata NetCDF</comment>
- <comment xml:lang="id">Dokumen Unidata NetCDF</comment>
- <comment xml:lang="it">Documento Unidata NetCDF</comment>
- <comment xml:lang="ja">Unidata NetCDF ドキュメント</comment>
- <comment xml:lang="kk">Unidata NetCDF құжаты</comment>
- <comment xml:lang="ko">Unidata NetCDF 문서</comment>
- <comment xml:lang="lt">Unidata NetCDF dokumentas</comment>
- <comment xml:lang="lv">Unidata NetCDF dokuments</comment>
- <comment xml:lang="ms">Dokumen Unidata NetCDF</comment>
- <comment xml:lang="nb">Unidata NetCDF-dokument</comment>
- <comment xml:lang="nl">Unidata NetCDF-document</comment>
- <comment xml:lang="nn">Unidata netCDF-dokument</comment>
- <comment xml:lang="oc">document Unidata NetCDF</comment>
- <comment xml:lang="pl">Dokument Unidata NetCDF</comment>
- <comment xml:lang="pt">documento Unidata NetCDF</comment>
- <comment xml:lang="pt-BR">Documento do Unidata NetCDF</comment>
- <comment xml:lang="ro">Document Unidata NetCDF</comment>
- <comment xml:lang="ru">Документ Unidata NetCDF</comment>
- <comment xml:lang="sk">Dokument Unidata NetCDF</comment>
- <comment xml:lang="sl">Dokument Unidata NetCDF</comment>
- <comment xml:lang="sq">Dokument Unidata NetCDF</comment>
- <comment xml:lang="sr">документ Унидата НетЦДФ-а</comment>
- <comment xml:lang="sv">Unidata NetCDF-dokument</comment>
- <comment xml:lang="tr">Unidata NetCDF belgesi</comment>
- <comment xml:lang="uk">документ Unidata NetCDF</comment>
+ <comment xml:lang="zh_TW">Unidata NetCDF 文件</comment>
+ <comment xml:lang="zh_CN">Unidata NetCDF 文档</comment>
<comment xml:lang="vi">Tài liệu NetCDF Unidata</comment>
- <comment xml:lang="zh-CN">Unidata NetCDF 文档</comment>
- <comment xml:lang="zh-TW">Unidata NetCDF 文件</comment>
+ <comment xml:lang="uk">документ Unidata NetCDF</comment>
+ <comment xml:lang="tr">Unidata NetCDF belgesi</comment>
+ <comment xml:lang="sv">Unidata NetCDF-dokument</comment>
+ <comment xml:lang="sr">документ Унидата НетЦДФ-а</comment>
+ <comment xml:lang="sq">dokument Unidata NetCDF</comment>
+ <comment xml:lang="sl">Dokument Unidata NetCDF</comment>
+ <comment xml:lang="si">Unidata NetCDF ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument Unidata NetCDF</comment>
+ <comment xml:lang="ru">Документ Unidata NetCDF</comment>
+ <comment xml:lang="ro">Document Unidata NetCDF</comment>
+ <comment xml:lang="pt_BR">Documento do Unidata NetCDF</comment>
+ <comment xml:lang="pt">documento Unidata NetCDF</comment>
+ <comment xml:lang="pl">Dokument Unidata NetCDF</comment>
+ <comment xml:lang="oc">document Unidata NetCDF</comment>
+ <comment xml:lang="nn">Unidata netCDF-dokument</comment>
+ <comment xml:lang="nl">Unidata NetCDF-document</comment>
+ <comment xml:lang="nb">Unidata NetCDF-dokument</comment>
+ <comment xml:lang="ms">Dokumen Unidata NetCDF</comment>
+ <comment xml:lang="lv">Unidata NetCDF dokuments</comment>
+ <comment xml:lang="lt">Unidata NetCDF dokumentas</comment>
+ <comment xml:lang="ko">Unidata NetCDF 문서</comment>
+ <comment xml:lang="kk">Unidata NetCDF құжаты</comment>
+ <comment xml:lang="ja">Unidata NetCDF ドキュメント</comment>
+ <comment xml:lang="it">Documento Unidata NetCDF</comment>
+ <comment xml:lang="is">Unidata NetCDF skjal</comment>
+ <comment xml:lang="id">Dokumen Unidata NetCDF</comment>
+ <comment xml:lang="ia">Documento Unidata NetCDF</comment>
+ <comment xml:lang="hu">Unidata NetCDF-dokumentum</comment>
+ <comment xml:lang="hr">Unidata NetCDF dokument</comment>
+ <comment xml:lang="he">מסמך של Unidata NetCDF</comment>
+ <comment xml:lang="gl">Documentno de Unixdata NetCDF</comment>
+ <comment xml:lang="ga">cáipéis Unidata NetCDF</comment>
+ <comment xml:lang="fur">document Unidata NetCDF</comment>
+ <comment xml:lang="fr">document Unidata NetCDF</comment>
+ <comment xml:lang="fo">Unidata NetCDF skjal</comment>
+ <comment xml:lang="fi">Unidata NetCDF -asiakirja</comment>
+ <comment xml:lang="eu">Unidata NetCDF dokumentua</comment>
+ <comment xml:lang="es">documento de Unidata NetCDF</comment>
+ <comment xml:lang="eo">dokumento en NetCDF-formato de Unidata</comment>
+ <comment xml:lang="en_GB">Unidata NetCDF document</comment>
+ <comment xml:lang="el">Έγγραφο Unidata NetCDF</comment>
+ <comment xml:lang="de">Unidata-NetCDF-Dokument</comment>
+ <comment xml:lang="da">Unidata NetCDF-dokument</comment>
+ <comment xml:lang="cs">dokument Unidata NetCDF</comment>
+ <comment xml:lang="ca">document d'Unidata NetCDF</comment>
+ <comment xml:lang="bg">Документ — Unidata NetCDF</comment>
+ <comment xml:lang="be@latin">Dakument Unidata NetCDF</comment>
+ <comment xml:lang="be">дакумент Unidata NetCDF</comment>
+ <comment xml:lang="ast">Documentu NetCDF d'Unidata</comment>
+ <comment xml:lang="ar">مستند Unidata NetCDF</comment>
<acronym>NetCDF</acronym>
<expanded-acronym>Network Common Data Form</expanded-acronym>
<generic-icon name="x-office-document"/>
@@ -17427,44 +18362,49 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-nzb">
<comment>NewzBin usenet index</comment>
- <comment xml:lang="bg">Индекс — Usenet, NewzBin</comment>
- <comment xml:lang="ca">índex d'Usenet NewzBin</comment>
- <comment xml:lang="cs">index NewzBin diskuzních skupin Usenet</comment>
- <comment xml:lang="da">NewzBin usenet-indeks</comment>
- <comment xml:lang="de">NewzBin-Usenet-Index</comment>
- <comment xml:lang="el">Ευρετήριο usenet NewzBin</comment>
- <comment xml:lang="en-GB">NewzBin usenet index</comment>
- <comment xml:lang="es">índice NewzBin de usenet</comment>
- <comment xml:lang="eu">NewzBin usenet indizea</comment>
- <comment xml:lang="fi">NewzBin usenet indeksi</comment>
- <comment xml:lang="fr">index usenet </comment>
- <comment xml:lang="fur">tabele usenet NewzBin</comment>
- <comment xml:lang="ga">innéacs usenet NewzBin</comment>
- <comment xml:lang="gl">Índice de usenet NEwzBin</comment>
- <comment xml:lang="he">אינדקס שרתי חדשות NewzBin</comment>
- <comment xml:lang="hr">NewzBin usenet indeks</comment>
- <comment xml:lang="hu">NewzBin usenet index</comment>
- <comment xml:lang="ia">Indice de usenet NewzBin</comment>
- <comment xml:lang="id">Indeks usenet NewzBin</comment>
- <comment xml:lang="it">Indice Usenet NewzBiz</comment>
- <comment xml:lang="ja">NewzBin Usenet インデックス</comment>
- <comment xml:lang="kk">NewzBin usenet индексі</comment>
- <comment xml:lang="ko">NewzBin 유즈넷 인덱스</comment>
- <comment xml:lang="lv">NewzBin usenet rādītājs</comment>
- <comment xml:lang="nl">NewzBin usenet index</comment>
- <comment xml:lang="oc">indèx usenet NewzBin</comment>
- <comment xml:lang="pl">Indeks grup dyskusyjnych NewzBin</comment>
- <comment xml:lang="pt">índice usenet NewzBin</comment>
- <comment xml:lang="pt-BR">Índice de usenet NewzBin</comment>
- <comment xml:lang="ru">Индекс usenet NewzBin</comment>
- <comment xml:lang="sk">Index Usenetu NewzBin</comment>
- <comment xml:lang="sl">Kazalo usenet NewzBin</comment>
- <comment xml:lang="sr">Њузбин попис јузнета</comment>
- <comment xml:lang="sv">NewzBin-usenetindex</comment>
- <comment xml:lang="tr">NewzBin usenet dizini</comment>
+ <comment xml:lang="zh_TW">NewzBin usenet 索引</comment>
+ <comment xml:lang="zh_CN">NewzBin Usenet 索引</comment>
<comment xml:lang="uk">покажчик usenet NewzBin</comment>
- <comment xml:lang="zh-CN">NewzBin Usenet 索引</comment>
- <comment xml:lang="zh-TW">NewzBin usenet 索引</comment>
+ <comment xml:lang="tr">NewzBin usenet dizini</comment>
+ <comment xml:lang="sv">NewzBin-usenetindex</comment>
+ <comment xml:lang="sr">Њузбин попис јузнета</comment>
+ <comment xml:lang="sq">tregues usenet NewzBin</comment>
+ <comment xml:lang="sl">Kazalo usenet NewzBin</comment>
+ <comment xml:lang="si">NewzBin Usenet index</comment>
+ <comment xml:lang="sk">Index Usenetu NewzBin</comment>
+ <comment xml:lang="ru">Индекс usenet NewzBin</comment>
+ <comment xml:lang="pt_BR">Índice de usenet NewzBin</comment>
+ <comment xml:lang="pt">índice usenet NewzBin</comment>
+ <comment xml:lang="pl">Indeks grup dyskusyjnych NewzBin</comment>
+ <comment xml:lang="oc">indèx usenet NewzBin</comment>
+ <comment xml:lang="nl">NewzBin usenet-index</comment>
+ <comment xml:lang="lv">NewzBin usenet rādītājs</comment>
+ <comment xml:lang="ko">NewzBin 유즈넷 인덱스</comment>
+ <comment xml:lang="kk">NewzBin usenet индексі</comment>
+ <comment xml:lang="ja">NewzBin Usenet インデックス</comment>
+ <comment xml:lang="it">Indice Usenet NewzBiz</comment>
+ <comment xml:lang="is">NewzBin usenet yfirlit</comment>
+ <comment xml:lang="id">Indeks usenet NewzBin</comment>
+ <comment xml:lang="ia">Indice de usenet NewzBin</comment>
+ <comment xml:lang="hu">NewzBin usenet index</comment>
+ <comment xml:lang="hr">NewzBin usenet indeks</comment>
+ <comment xml:lang="he">אינדקס שרתי חדשות NewzBin</comment>
+ <comment xml:lang="gl">Índice de usenet NEwzBin</comment>
+ <comment xml:lang="ga">innéacs usenet NewzBin</comment>
+ <comment xml:lang="fur">tabele usenet NewzBin</comment>
+ <comment xml:lang="fr">index usenet </comment>
+ <comment xml:lang="fi">NewzBin usenet -indeksi</comment>
+ <comment xml:lang="eu">NewzBin usenet indizea</comment>
+ <comment xml:lang="es">índice NewzBin de usenet</comment>
+ <comment xml:lang="en_GB">NewzBin usenet index</comment>
+ <comment xml:lang="el">Ευρετήριο usenet NewzBin</comment>
+ <comment xml:lang="de">NewzBin Usenet-Index</comment>
+ <comment xml:lang="da">NewzBin usenet-indeks</comment>
+ <comment xml:lang="cs">index NewzBin diskuzních skupin Usenet</comment>
+ <comment xml:lang="ca">índex d'Usenet NewzBin</comment>
+ <comment xml:lang="bg">Индекс — Usenet, NewzBin</comment>
+ <comment xml:lang="be">індэкс usenet NewzBin</comment>
+ <comment xml:lang="ar">فهرس يوزنت NewzBin</comment>
<sub-class-of type="application/xml"/>
<magic priority="80">
<match type="string" value="&lt;nzb" offset="0:256"/>
@@ -17472,58 +18412,20 @@ command to generate the output files.
<glob pattern="*.nzb"/>
</mime-type>
<mime-type type="application/x-object">
- <comment>object code</comment>
- <comment xml:lang="af">objekkode</comment>
- <comment xml:lang="ar">رمز الكائن</comment>
- <comment xml:lang="be-Latn">abjektny kod</comment>
- <comment xml:lang="bg">Обектен код</comment>
- <comment xml:lang="ca">codi objecte</comment>
- <comment xml:lang="cs">objektový kód</comment>
- <comment xml:lang="da">objektkode</comment>
- <comment xml:lang="de">Objektcode</comment>
- <comment xml:lang="el">Μεταφρασμένος κώδικας</comment>
- <comment xml:lang="en-GB">object code</comment>
- <comment xml:lang="eo">celkodo</comment>
- <comment xml:lang="es">código objeto</comment>
- <comment xml:lang="eu">objektu kodea</comment>
- <comment xml:lang="fi">objektikoodi</comment>
- <comment xml:lang="fr">code objet</comment>
- <comment xml:lang="fur">codiç ogjet</comment>
- <comment xml:lang="ga">cód réada</comment>
- <comment xml:lang="gl">código obxecto</comment>
- <comment xml:lang="he">קוד אובייקט</comment>
- <comment xml:lang="hr">Object kôd</comment>
- <comment xml:lang="hu">tárgykód</comment>
- <comment xml:lang="ia">Codice objecto</comment>
- <comment xml:lang="id">kode objek</comment>
- <comment xml:lang="it">Codice oggetto</comment>
- <comment xml:lang="ja">オブジェクトコード</comment>
- <comment xml:lang="kk">объектті коды</comment>
- <comment xml:lang="ko">개체 코드</comment>
- <comment xml:lang="lt">objektinis kodas</comment>
- <comment xml:lang="lv">objekta kods</comment>
- <comment xml:lang="ms">Kod objek</comment>
- <comment xml:lang="nb">objektkode</comment>
- <comment xml:lang="nl">objectcode</comment>
- <comment xml:lang="nn">objektkode</comment>
- <comment xml:lang="oc">còde objet</comment>
- <comment xml:lang="pl">Kod obiektowy</comment>
- <comment xml:lang="pt">código de objeto</comment>
- <comment xml:lang="pt-BR">Código-objeto</comment>
- <comment xml:lang="ro">cod sursă obiect</comment>
- <comment xml:lang="ru">Объектный код</comment>
- <comment xml:lang="sk">Objektový kód</comment>
- <comment xml:lang="sl">predmetna koda</comment>
- <comment xml:lang="sq">Kod objekti</comment>
- <comment xml:lang="sr">објектни ко̂д</comment>
- <comment xml:lang="sv">objektkod</comment>
- <comment xml:lang="tr">nesne kodu</comment>
+ <comment>Object code</comment>
<comment xml:lang="uk">об'єктний код</comment>
- <comment xml:lang="vi">mã đối tượng</comment>
- <comment xml:lang="zh-CN">目标代码</comment>
- <comment xml:lang="zh-TW">目的碼</comment>
+ <comment xml:lang="sv">Objektkod</comment>
+ <comment xml:lang="ru">Объектный код</comment>
+ <comment xml:lang="pl">Kod obiektowy</comment>
+ <comment xml:lang="ja">目的符号文書</comment>
+ <comment xml:lang="it">Codice oggetto</comment>
+ <comment xml:lang="gl">Código obxecto</comment>
+ <comment xml:lang="eu">Objektu-kodea</comment>
+ <comment xml:lang="es">código de objeto</comment>
+ <comment xml:lang="de">Objektcode</comment>
+ <comment xml:lang="be">аб'ектны код</comment>
<generic-icon name="x-office-document"/>
- <magic priority="50">
+ <magic>
<match type="string" value="\177ELF" offset="0">
<match type="byte" value="1" offset="5">
<match type="little16" value="1" offset="16"/>
@@ -17536,55 +18438,59 @@ command to generate the output files.
</match>
</magic>
<glob pattern="*.o"/>
+ <glob pattern="*.mod" weight="40"/>
</mime-type>
<mime-type type="application/annodex">
<comment>Annodex exchange format</comment>
- <comment xml:lang="ar">صيغة Annodex البديلة</comment>
- <comment xml:lang="bg">Формат за обмяна — Annodex</comment>
- <comment xml:lang="ca">format d'intercanvi Annodex</comment>
- <comment xml:lang="cs">výměnný formát Annodex</comment>
- <comment xml:lang="da">Udvekslingsformat for Annodex</comment>
- <comment xml:lang="de">Annodex-Wechselformat</comment>
- <comment xml:lang="el">Μορφή ανταλλαγής Annodex</comment>
- <comment xml:lang="en-GB">Annodex exchange format</comment>
- <comment xml:lang="es">formato de intercambio de Annodex</comment>
- <comment xml:lang="eu">Annodex trukatze-formatua</comment>
- <comment xml:lang="fi">Annodex-siirtomuoto</comment>
- <comment xml:lang="fo">Annodex umbýtingarsnið</comment>
- <comment xml:lang="fr">format d'échange Annodex</comment>
- <comment xml:lang="fur">formât di scambi Annodex</comment>
- <comment xml:lang="ga">formáid mhalairte Annodex</comment>
- <comment xml:lang="gl">formato intercambiábel de Annodex</comment>
- <comment xml:lang="he">תבנית החלפת Annodex</comment>
- <comment xml:lang="hr">Annodex format razmjene</comment>
- <comment xml:lang="hu">Annodex csereformátum</comment>
- <comment xml:lang="ia">Formato de excambio Annodex</comment>
- <comment xml:lang="id">Format pertukaran Annodex</comment>
- <comment xml:lang="it">Formato di scambio Annodex</comment>
- <comment xml:lang="ja">Annodex 交換フォーマット</comment>
- <comment xml:lang="ka">Annodex-ის გაცვლითი ფორმატი</comment>
- <comment xml:lang="kk">Annodex алмасу пішімі</comment>
- <comment xml:lang="ko">Annodex 교환 형식</comment>
- <comment xml:lang="lt">Annodex mainų formatas</comment>
- <comment xml:lang="lv">Annodex apmaiņas formāts</comment>
- <comment xml:lang="nl">Annodex-exchange</comment>
- <comment xml:lang="oc">format d'escambi Annodex</comment>
- <comment xml:lang="pl">Format wymiany Annodex</comment>
- <comment xml:lang="pt">formato de troca Annodex</comment>
- <comment xml:lang="pt-BR">Formato de troca Annodex</comment>
- <comment xml:lang="ro">Format schimb Annodex</comment>
- <comment xml:lang="ru">Формат обмена Annodex</comment>
- <comment xml:lang="sk">Formát pre výmenu Annodex</comment>
- <comment xml:lang="sl">Izmenjalna datoteka Annodex</comment>
- <comment xml:lang="sr">Анодексов запис размене</comment>
- <comment xml:lang="sv">Annodex-utväxlingsformat</comment>
- <comment xml:lang="tr">Annodex değişim biçimi</comment>
- <comment xml:lang="uk">формат обміну даними Annodex</comment>
+ <comment xml:lang="zh_TW">Annodex 交換格式</comment>
+ <comment xml:lang="zh_CN">Annodex 交换格式</comment>
<comment xml:lang="vi">Định dạng trao đổi Annodex</comment>
- <comment xml:lang="zh-CN">Annodex 交换格式</comment>
- <comment xml:lang="zh-TW">Annodex 交換格式</comment>
+ <comment xml:lang="uk">формат обміну даними Annodex</comment>
+ <comment xml:lang="tr">Annodex değişim biçimi</comment>
+ <comment xml:lang="sv">Annodex-utväxlingsformat</comment>
+ <comment xml:lang="sr">Анодексов запис размене</comment>
+ <comment xml:lang="sl">Izmenjalna datoteka Annodex</comment>
+ <comment xml:lang="si">Annodex හුවමාරු ආකෘතිය</comment>
+ <comment xml:lang="sk">Formát pre výmenu Annodex</comment>
+ <comment xml:lang="ru">Формат обмена Annodex</comment>
+ <comment xml:lang="ro">Format schimb Annodex</comment>
+ <comment xml:lang="pt_BR">Formato de troca Annodex</comment>
+ <comment xml:lang="pt">formato de troca Annodex</comment>
+ <comment xml:lang="pl">Format wymiany Annodex</comment>
+ <comment xml:lang="oc">format d'escambi Annodex</comment>
+ <comment xml:lang="nl">Annodex-exchange</comment>
+ <comment xml:lang="lv">Annodex apmaiņas formāts</comment>
+ <comment xml:lang="lt">Annodex mainų formatas</comment>
+ <comment xml:lang="ko">Annodex 교환 형식</comment>
+ <comment xml:lang="kk">Annodex алмасу пішімі</comment>
+ <comment xml:lang="ka">Annodex-ის გაცვლითი ფორმატი</comment>
+ <comment xml:lang="ja">Annodex 交換フォーマット</comment>
+ <comment xml:lang="it">Formato di scambio Annodex</comment>
+ <comment xml:lang="is">Annodex skiptiskráasnið</comment>
+ <comment xml:lang="id">Format pertukaran Annodex</comment>
+ <comment xml:lang="ia">Formato de excambio Annodex</comment>
+ <comment xml:lang="hu">Annodex csereformátum</comment>
+ <comment xml:lang="hr">Annodex format razmjene</comment>
+ <comment xml:lang="he">תבנית החלפת Annodex</comment>
+ <comment xml:lang="gl">formato intercambiábel de Annodex</comment>
+ <comment xml:lang="ga">formáid mhalairte Annodex</comment>
+ <comment xml:lang="fur">formât di scambi Annodex</comment>
+ <comment xml:lang="fr">format d'échange Annodex</comment>
+ <comment xml:lang="fo">Annodex umbýtingarsnið</comment>
+ <comment xml:lang="fi">Annodex-siirtomuoto</comment>
+ <comment xml:lang="eu">Annodex trukatze-formatua</comment>
+ <comment xml:lang="es">formato de intercambio de Annodex</comment>
+ <comment xml:lang="en_GB">Annodex exchange format</comment>
+ <comment xml:lang="el">Μορφή ανταλλαγής Annodex</comment>
+ <comment xml:lang="de">Annodex-Austauschformat</comment>
+ <comment xml:lang="da">Udvekslingsformat for Annodex</comment>
+ <comment xml:lang="cs">výměnný formát Annodex</comment>
+ <comment xml:lang="ca">format d'intercanvi Annodex</comment>
+ <comment xml:lang="bg">Формат за обмяна — Annodex</comment>
+ <comment xml:lang="be">фармат абмену Annodex</comment>
+ <comment xml:lang="ar">صيغة تبادل Annodex</comment>
<generic-icon name="video-x-generic"/>
- <magic priority="50">
+ <magic>
<match type="string" value="OggS" offset="0">
<match type="string" value="fishead\0" offset="28">
<match type="string" value="CMML\0\0\0\0" offset="56:512"/>
@@ -17596,31 +18502,42 @@ command to generate the output files.
</mime-type>
<mime-type type="video/annodex">
<comment>Annodex video</comment>
- <comment xml:lang="bg">Видео — Annodex</comment>
- <comment xml:lang="ca">vídeo Annodex</comment>
- <comment xml:lang="da">Annodex-video</comment>
- <comment xml:lang="de">Annodex-Video</comment>
- <comment xml:lang="en-GB">Annodex video</comment>
- <comment xml:lang="es">vídeo Annodex</comment>
- <comment xml:lang="eu">Annodex bideoa</comment>
- <comment xml:lang="fi">Annodex video</comment>
- <comment xml:lang="fr">vidéo Annodex</comment>
- <comment xml:lang="hr">Annodex video snimka</comment>
- <comment xml:lang="hu">Annodex videó</comment>
- <comment xml:lang="id">Video Annodex</comment>
- <comment xml:lang="it">Video Annodex</comment>
- <comment xml:lang="kk">Annodex видеосы</comment>
- <comment xml:lang="ko">Annodex 동영상</comment>
- <comment xml:lang="pl">Plik wideo Annodex</comment>
- <comment xml:lang="pt-BR">Vídeo Annodex</comment>
- <comment xml:lang="ru">Видео Annodex</comment>
- <comment xml:lang="sv">Annodex-video</comment>
- <comment xml:lang="tr">Annodex video</comment>
+ <comment xml:lang="zh_TW">Annodex 視訊</comment>
+ <comment xml:lang="zh_CN">Annodex 视频</comment>
<comment xml:lang="uk">відео Annodex</comment>
- <comment xml:lang="zh-CN">Annodex 视频</comment>
- <comment xml:lang="zh-TW">Annodex 視訊</comment>
+ <comment xml:lang="tr">Annodex video</comment>
+ <comment xml:lang="sv">Annodex-video</comment>
+ <comment xml:lang="sq">video Annodex</comment>
+ <comment xml:lang="sl">Video Annodex</comment>
+ <comment xml:lang="si">Annodex වීඩියෝව</comment>
+ <comment xml:lang="ru">Видео Annodex</comment>
+ <comment xml:lang="pt_BR">Vídeo Annodex</comment>
+ <comment xml:lang="pl">Plik wideo Annodex</comment>
+ <comment xml:lang="oc">vidèo Annodex</comment>
+ <comment xml:lang="nl">Annodex-video</comment>
+ <comment xml:lang="ko">Annodex 동영상</comment>
+ <comment xml:lang="kk">Annodex видеосы</comment>
+ <comment xml:lang="ja">Annodex 動画</comment>
+ <comment xml:lang="it">Video Annodex</comment>
+ <comment xml:lang="is">Annodex myndskeið</comment>
+ <comment xml:lang="id">Video Annodex</comment>
+ <comment xml:lang="hu">Annodex videó</comment>
+ <comment xml:lang="hr">Annodex video snimka</comment>
+ <comment xml:lang="he">סרטון Annodex</comment>
+ <comment xml:lang="gl">Vídeo de Annodex</comment>
+ <comment xml:lang="fr">vidéo Annodex</comment>
+ <comment xml:lang="fi">Annodex-video</comment>
+ <comment xml:lang="eu">Annodex bideoa</comment>
+ <comment xml:lang="es">vídeo Annodex</comment>
+ <comment xml:lang="en_GB">Annodex video</comment>
+ <comment xml:lang="de">Annodex-Video</comment>
+ <comment xml:lang="da">Annodex-video</comment>
+ <comment xml:lang="ca">vídeo Annodex</comment>
+ <comment xml:lang="bg">Видео — Annodex</comment>
+ <comment xml:lang="be">відэа Annodex</comment>
+ <comment xml:lang="ar">فيديو Annodex</comment>
<sub-class-of type="application/annodex"/>
- <magic priority="50">
+ <magic>
<match type="string" value="OggS" offset="0">
<match type="string" value="fishead\0" offset="28">
<match type="string" value="CMML\0\0\0\0" offset="56:512"/>
@@ -17632,31 +18549,42 @@ command to generate the output files.
</mime-type>
<mime-type type="audio/annodex">
<comment>Annodex audio</comment>
- <comment xml:lang="bg">Аудио — Annodex</comment>
- <comment xml:lang="ca">àudio Annodex</comment>
- <comment xml:lang="da">Annodex-lyd</comment>
- <comment xml:lang="de">Annodex-Audio</comment>
- <comment xml:lang="en-GB">Annodex audio</comment>
- <comment xml:lang="es">audio Annodex</comment>
- <comment xml:lang="eu">Annodex audioa</comment>
- <comment xml:lang="fi">Annodex ääni</comment>
- <comment xml:lang="fr">audio Annodex</comment>
- <comment xml:lang="hr">Annodex zvučni zapis</comment>
- <comment xml:lang="hu">Annodex hang</comment>
- <comment xml:lang="id">Audio Annodex</comment>
- <comment xml:lang="it">Audio Annodex</comment>
- <comment xml:lang="kk">Annodex аудиосы</comment>
- <comment xml:lang="ko">Annodex 오디오</comment>
- <comment xml:lang="pl">Plik dźwiękowy Annodex</comment>
- <comment xml:lang="pt-BR">Áudio Annodex</comment>
- <comment xml:lang="ru">Аудио Annodex</comment>
- <comment xml:lang="sv">Annodex-ljud</comment>
- <comment xml:lang="tr">Annodex sesi</comment>
+ <comment xml:lang="zh_TW">Annodex 音訊</comment>
+ <comment xml:lang="zh_CN">Annodex 音频</comment>
<comment xml:lang="uk">звук Annodex</comment>
- <comment xml:lang="zh-CN">Annodex 音频</comment>
- <comment xml:lang="zh-TW">Annodex 音訊</comment>
+ <comment xml:lang="tr">Annodex sesi</comment>
+ <comment xml:lang="sv">Annodex-ljud</comment>
+ <comment xml:lang="sq">audio Annodex</comment>
+ <comment xml:lang="sl">Zvok Annodex</comment>
+ <comment xml:lang="si">ඇනෝඩෙක්ස් ඕඩියෝ</comment>
+ <comment xml:lang="ru">Аудио Annodex</comment>
+ <comment xml:lang="pt_BR">Áudio Annodex</comment>
+ <comment xml:lang="pl">Plik dźwiękowy Annodex</comment>
+ <comment xml:lang="oc">àudio Annodex</comment>
+ <comment xml:lang="nl">Annodex-audio</comment>
+ <comment xml:lang="ko">Annodex 오디오</comment>
+ <comment xml:lang="kk">Annodex аудиосы</comment>
+ <comment xml:lang="ja">Annodex オーディオ</comment>
+ <comment xml:lang="it">Audio Annodex</comment>
+ <comment xml:lang="is">Annodex hljóðskrá</comment>
+ <comment xml:lang="id">Audio Annodex</comment>
+ <comment xml:lang="hu">Annodex hang</comment>
+ <comment xml:lang="hr">Annodex zvučni zapis</comment>
+ <comment xml:lang="he">שמע Annodex</comment>
+ <comment xml:lang="gl">Son de Annodex</comment>
+ <comment xml:lang="fr">audio Annodex</comment>
+ <comment xml:lang="fi">Annodex-ääni</comment>
+ <comment xml:lang="eu">Annodex audioa</comment>
+ <comment xml:lang="es">sonido Annodex</comment>
+ <comment xml:lang="en_GB">Annodex audio</comment>
+ <comment xml:lang="de">Annodex-Audio</comment>
+ <comment xml:lang="da">Annodex-lyd</comment>
+ <comment xml:lang="ca">àudio Annodex</comment>
+ <comment xml:lang="bg">Аудио — Annodex</comment>
+ <comment xml:lang="be">аўдыя Annodex</comment>
+ <comment xml:lang="ar">صوت Annodex</comment>
<sub-class-of type="application/annodex"/>
- <magic priority="50">
+ <magic>
<match type="string" value="OggS" offset="0">
<match type="string" value="fishead\0" offset="28">
<match type="string" value="CMML\0\0\0\0" offset="56:512"/>
@@ -17668,90 +18596,105 @@ command to generate the output files.
</mime-type>
<mime-type type="application/ogg">
<comment>Ogg multimedia file</comment>
- <comment xml:lang="af">Ogg-multimedialêer</comment>
- <comment xml:lang="ar">ملف وسائط متعددة Ogg</comment>
- <comment xml:lang="be-Latn">Multymedyjny fajł Ogg</comment>
- <comment xml:lang="bg">Мултимедия — Ogg</comment>
- <comment xml:lang="ca">fitxer multimèdia Ogg</comment>
- <comment xml:lang="cs">multimediální soubor Ogg</comment>
- <comment xml:lang="da">Ogg multimedie-fil</comment>
- <comment xml:lang="de">Ogg-Multimediadatei</comment>
- <comment xml:lang="el">Αρχείο πολυμέσων Ogg</comment>
- <comment xml:lang="en-GB">Ogg multimedia file</comment>
- <comment xml:lang="es">archivo multimedia Ogg</comment>
- <comment xml:lang="eu">Ogg multimediako fitxategia</comment>
- <comment xml:lang="fi">Ogg-multimediatiedosto</comment>
- <comment xml:lang="fo">Ogg margmiðlafíla</comment>
- <comment xml:lang="fr">fichier multimédia Ogg</comment>
- <comment xml:lang="fur">file multimediâl Ogg</comment>
- <comment xml:lang="ga">comhad ilmheán Ogg</comment>
- <comment xml:lang="gl">ficheiro multimedia Ogg</comment>
- <comment xml:lang="he">קובץ מולטימדיה Ogg</comment>
- <comment xml:lang="hr">Ogg multimedijalna datoteka</comment>
- <comment xml:lang="hu">Ogg multimédiafájl</comment>
- <comment xml:lang="ia">File multimedial Ogg</comment>
- <comment xml:lang="id">Berkas multimedia Ogg</comment>
- <comment xml:lang="it">File multimediale Ogg</comment>
- <comment xml:lang="ja">Ogg マルチメディアファイル</comment>
- <comment xml:lang="ka">Ogg-ის მულტიმედია ფაილი</comment>
- <comment xml:lang="kk">Ogg мультимедиа файлы</comment>
- <comment xml:lang="ko">Ogg 멀티미디어 파일</comment>
- <comment xml:lang="lt">Ogg multimedijos failas</comment>
- <comment xml:lang="lv">Ogg multimediju datne</comment>
- <comment xml:lang="nb">Ogg-multimediafil</comment>
- <comment xml:lang="nl">Ogg-multimediabestand</comment>
- <comment xml:lang="nn">Ogg multimediafil</comment>
- <comment xml:lang="oc">fichièr multimèdia Ogg</comment>
- <comment xml:lang="pl">Plik multimedialny Ogg</comment>
- <comment xml:lang="pt">ficheiro multimédia Ogg</comment>
- <comment xml:lang="pt-BR">Arquivo multimídia Ogg</comment>
- <comment xml:lang="ro">Fișier multimedia Ogg</comment>
- <comment xml:lang="ru">Мультимедийный файл Ogg</comment>
- <comment xml:lang="sk">Súbor multimédií Ogg</comment>
- <comment xml:lang="sl">Večpredstavnostna datoteka Ogg</comment>
- <comment xml:lang="sq">File multimedial Ogg</comment>
- <comment xml:lang="sr">Огг мултимедијална датотека</comment>
- <comment xml:lang="sv">Ogg-multimediafil</comment>
- <comment xml:lang="tr">Ogg çoklu ortam dosyası</comment>
- <comment xml:lang="uk">мультимедійний файл Ogg</comment>
+ <comment xml:lang="zh_TW">Ogg 多媒體檔案</comment>
+ <comment xml:lang="zh_CN">Ogg 多媒体文件</comment>
<comment xml:lang="vi">Tập tin đa phương tiện Ogg</comment>
- <comment xml:lang="zh-CN">Ogg 多媒体文件</comment>
- <comment xml:lang="zh-TW">Ogg 多媒體檔案</comment>
+ <comment xml:lang="uk">мультимедійний файл Ogg</comment>
+ <comment xml:lang="tr">Ogg çoklu ortam dosyası</comment>
+ <comment xml:lang="sv">Ogg-multimediafil</comment>
+ <comment xml:lang="sr">Огг мултимедијална датотека</comment>
+ <comment xml:lang="sq">kartelë multimediale Ogg</comment>
+ <comment xml:lang="sl">Večpredstavnostna datoteka Ogg</comment>
+ <comment xml:lang="si">Ogg බහුමාධ්‍ය ගොනුව</comment>
+ <comment xml:lang="sk">Súbor multimédií Ogg</comment>
+ <comment xml:lang="ru">Мультимедийный файл Ogg</comment>
+ <comment xml:lang="ro">Fișier multimedia Ogg</comment>
+ <comment xml:lang="pt_BR">Arquivo multimídia Ogg</comment>
+ <comment xml:lang="pt">ficheiro multimédia Ogg</comment>
+ <comment xml:lang="pl">Plik multimedialny Ogg</comment>
+ <comment xml:lang="oc">fichièr multimèdia Ogg</comment>
+ <comment xml:lang="nn">Ogg multimediafil</comment>
+ <comment xml:lang="nl">Ogg-multimediabestand</comment>
+ <comment xml:lang="nb">Ogg-multimediafil</comment>
+ <comment xml:lang="lv">Ogg multimediju datne</comment>
+ <comment xml:lang="lt">Ogg multimedijos failas</comment>
+ <comment xml:lang="ko">Ogg 멀티미디어 파일</comment>
+ <comment xml:lang="kk">Ogg мультимедиа файлы</comment>
+ <comment xml:lang="ka">Ogg-ის მულტიმედია ფაილი</comment>
+ <comment xml:lang="ja">Ogg マルチメディアファイル</comment>
+ <comment xml:lang="it">File multimediale Ogg</comment>
+ <comment xml:lang="is">OGG margmiðlunarskrá</comment>
+ <comment xml:lang="id">Berkas multimedia Ogg</comment>
+ <comment xml:lang="ia">File multimedial Ogg</comment>
+ <comment xml:lang="hu">Ogg multimédiafájl</comment>
+ <comment xml:lang="hr">Ogg multimedijalna datoteka</comment>
+ <comment xml:lang="he">קובץ מולטימדיה Ogg</comment>
+ <comment xml:lang="gl">ficheiro multimedia Ogg</comment>
+ <comment xml:lang="ga">comhad ilmheán Ogg</comment>
+ <comment xml:lang="fur">file multimediâl Ogg</comment>
+ <comment xml:lang="fr">fichier multimédia Ogg</comment>
+ <comment xml:lang="fo">Ogg margmiðlafíla</comment>
+ <comment xml:lang="fi">Ogg-multimediatiedosto</comment>
+ <comment xml:lang="eu">Ogg multimediako fitxategia</comment>
+ <comment xml:lang="es">archivo multimedia Ogg</comment>
+ <comment xml:lang="en_GB">Ogg multimedia file</comment>
+ <comment xml:lang="el">Αρχείο πολυμέσων Ogg</comment>
+ <comment xml:lang="de">Ogg-Multimediadatei</comment>
+ <comment xml:lang="da">Ogg multimedie-fil</comment>
+ <comment xml:lang="cs">multimediální soubor Ogg</comment>
+ <comment xml:lang="ca">fitxer multimèdia Ogg</comment>
+ <comment xml:lang="bg">Мултимедия — Ogg</comment>
+ <comment xml:lang="be@latin">Multymedyjny fajł Ogg</comment>
+ <comment xml:lang="be">мультымедыйны файл Ogg</comment>
+ <comment xml:lang="ar">ملف وسائط متعددة Ogg</comment>
+ <comment xml:lang="af">Ogg-multimedialêer</comment>
<generic-icon name="video-x-generic"/>
<alias type="application/x-ogg"/>
- <magic priority="50">
+ <magic>
<match type="string" value="OggS" offset="0"/>
</magic>
<glob pattern="*.ogx"/>
</mime-type>
<mime-type type="audio/ogg">
<comment>Ogg audio</comment>
- <comment xml:lang="bg">Аудио — Ogg</comment>
- <comment xml:lang="ca">àudio Ogg</comment>
- <comment xml:lang="da">Ogg-lyd</comment>
- <comment xml:lang="de">Ogg-Audio</comment>
- <comment xml:lang="en-GB">Ogg audio</comment>
- <comment xml:lang="es">audio Ogg</comment>
- <comment xml:lang="eu">Ogg audioa</comment>
- <comment xml:lang="fi">Ogg-ääni</comment>
- <comment xml:lang="fr">audio Ogg</comment>
- <comment xml:lang="hr">Ogg zvučni zapis</comment>
- <comment xml:lang="hu">Ogg hang</comment>
- <comment xml:lang="id">Audio Ogg</comment>
- <comment xml:lang="it">Audio Ogg</comment>
- <comment xml:lang="kk">Ogg аулиосы</comment>
- <comment xml:lang="ko">Ogg 오디오</comment>
- <comment xml:lang="pl">Plik dźwiękowy Ogg</comment>
- <comment xml:lang="pt-BR">Áudio Ogg</comment>
- <comment xml:lang="ru">Аудио Ogg</comment>
- <comment xml:lang="sk">Zvuk Ogg</comment>
- <comment xml:lang="sv">Ogg-ljud</comment>
- <comment xml:lang="tr">Ogg sesi</comment>
+ <comment xml:lang="zh_TW">Ogg 音訊</comment>
+ <comment xml:lang="zh_CN">Ogg 音频</comment>
<comment xml:lang="uk">звук ogg</comment>
- <comment xml:lang="zh-CN">Ogg 音频</comment>
- <comment xml:lang="zh-TW">Ogg 音訊</comment>
+ <comment xml:lang="tr">Ogg sesi</comment>
+ <comment xml:lang="sv">Ogg-ljud</comment>
+ <comment xml:lang="sr">ОГГ аудио</comment>
+ <comment xml:lang="sq">audio Ogg</comment>
+ <comment xml:lang="sl">Zvok Ogg</comment>
+ <comment xml:lang="si">ඕග් ඕඩියෝ</comment>
+ <comment xml:lang="sk">Zvuk Ogg</comment>
+ <comment xml:lang="ru">Аудио Ogg</comment>
+ <comment xml:lang="pt_BR">Áudio Ogg</comment>
+ <comment xml:lang="pl">Plik dźwiękowy Ogg</comment>
+ <comment xml:lang="oc">àudio Ogg</comment>
+ <comment xml:lang="nl">Ogg-audio</comment>
+ <comment xml:lang="ko">Ogg 오디오</comment>
+ <comment xml:lang="kk">Ogg аулиосы</comment>
+ <comment xml:lang="ja">Ogg オーディオ</comment>
+ <comment xml:lang="it">Audio Ogg</comment>
+ <comment xml:lang="is">Ogg hljóðskrá</comment>
+ <comment xml:lang="id">Audio Ogg</comment>
+ <comment xml:lang="hu">Ogg hang</comment>
+ <comment xml:lang="hr">Ogg zvučni zapis</comment>
+ <comment xml:lang="he">שמע Ogg</comment>
+ <comment xml:lang="gl">Son Ogg</comment>
+ <comment xml:lang="fr">audio Ogg</comment>
+ <comment xml:lang="fi">Ogg-ääni</comment>
+ <comment xml:lang="eu">Ogg audioa</comment>
+ <comment xml:lang="es">sonido Ogg</comment>
+ <comment xml:lang="en_GB">Ogg audio</comment>
+ <comment xml:lang="de">Ogg-Audio</comment>
+ <comment xml:lang="da">Ogg-lyd</comment>
+ <comment xml:lang="ca">àudio Ogg</comment>
+ <comment xml:lang="bg">Аудио — Ogg</comment>
+ <comment xml:lang="be">аўдыя Ogg</comment>
+ <comment xml:lang="ar">صوت Ogg</comment>
<sub-class-of type="application/ogg"/>
- <magic priority="50">
+ <magic>
<match type="string" value="OggS" offset="0"/>
</magic>
<glob pattern="*.oga"/>
@@ -17761,32 +18704,44 @@ command to generate the output files.
</mime-type>
<mime-type type="video/ogg">
<comment>Ogg video</comment>
- <comment xml:lang="bg">Видео — Ogg</comment>
- <comment xml:lang="ca">vídeo Ogg</comment>
- <comment xml:lang="da">Ogg-video</comment>
- <comment xml:lang="de">Ogg-Video</comment>
- <comment xml:lang="en-GB">Ogg video</comment>
- <comment xml:lang="es">vídeo Ogg</comment>
- <comment xml:lang="eu">Ogg bideoa</comment>
- <comment xml:lang="fi">Ogg-video</comment>
- <comment xml:lang="fr">vidéo Ogg</comment>
- <comment xml:lang="hr">Ogg video snimka</comment>
- <comment xml:lang="hu">Ogg videó</comment>
- <comment xml:lang="id">Video Ogg</comment>
- <comment xml:lang="it">Video Ogg</comment>
- <comment xml:lang="kk">Ogg видеосы</comment>
- <comment xml:lang="ko">Ogg 동영상</comment>
- <comment xml:lang="pl">Plik wideo Ogg</comment>
- <comment xml:lang="pt-BR">Vídeo Ogg</comment>
- <comment xml:lang="ru">Видео Ogg</comment>
- <comment xml:lang="sk">Video Ogg</comment>
- <comment xml:lang="sv">Ogg-video</comment>
- <comment xml:lang="tr">Ogg video</comment>
+ <comment xml:lang="zh_TW">Ogg 視訊</comment>
+ <comment xml:lang="zh_CN">Ogg 视频</comment>
<comment xml:lang="uk">відео ogg</comment>
- <comment xml:lang="zh-CN">Ogg 视频</comment>
- <comment xml:lang="zh-TW">Ogg 視訊</comment>
+ <comment xml:lang="tr">Ogg video</comment>
+ <comment xml:lang="sv">Ogg-video</comment>
+ <comment xml:lang="sr">ОГГ видео</comment>
+ <comment xml:lang="sq">video Ogg</comment>
+ <comment xml:lang="sl">Video Ogg</comment>
+ <comment xml:lang="si">ඔග් වීඩියෝව</comment>
+ <comment xml:lang="sk">Video Ogg</comment>
+ <comment xml:lang="ru">Видео Ogg</comment>
+ <comment xml:lang="pt_BR">Vídeo Ogg</comment>
+ <comment xml:lang="pl">Plik wideo Ogg</comment>
+ <comment xml:lang="oc">vidèo Ogg</comment>
+ <comment xml:lang="nl">Ogg-video</comment>
+ <comment xml:lang="ko">Ogg 동영상</comment>
+ <comment xml:lang="kk">Ogg видеосы</comment>
+ <comment xml:lang="ja">Ogg 動画</comment>
+ <comment xml:lang="it">Video Ogg</comment>
+ <comment xml:lang="is">Ogg myndskeið</comment>
+ <comment xml:lang="id">Video Ogg</comment>
+ <comment xml:lang="hu">Ogg videó</comment>
+ <comment xml:lang="hr">Ogg video snimka</comment>
+ <comment xml:lang="he">וידאו Ogg</comment>
+ <comment xml:lang="gl">Vídeo Ogg</comment>
+ <comment xml:lang="fr">vidéo Ogg</comment>
+ <comment xml:lang="fi">Ogg-video</comment>
+ <comment xml:lang="eu">Ogg bideoa</comment>
+ <comment xml:lang="es">vídeo Ogg</comment>
+ <comment xml:lang="en_GB">Ogg video</comment>
+ <comment xml:lang="de">Ogg-Video</comment>
+ <comment xml:lang="da">Ogg-video</comment>
+ <comment xml:lang="ca">vídeo Ogg</comment>
+ <comment xml:lang="bg">Видео — Ogg</comment>
+ <comment xml:lang="be">відэа Ogg</comment>
+ <comment xml:lang="ar">فيديو Ogg</comment>
<sub-class-of type="application/ogg"/>
- <magic priority="50">
+ <magic>
<match type="string" value="OggS" offset="0"/>
</magic>
<glob pattern="*.ogv"/>
@@ -17795,59 +18750,62 @@ command to generate the output files.
</mime-type>
<mime-type type="audio/x-vorbis+ogg">
<comment>Ogg Vorbis audio</comment>
- <comment xml:lang="af">Ogg Vorbis-oudio</comment>
- <comment xml:lang="ar">Ogg Vorbis سمعي</comment>
- <comment xml:lang="az">Ogg Vorbis audio faylı</comment>
- <comment xml:lang="be-Latn">Aŭdyjo Ogg Vorbis</comment>
- <comment xml:lang="bg">Аудио — Ogg Vorbis</comment>
- <comment xml:lang="ca">àudio Ogg Vorbis</comment>
- <comment xml:lang="cs">zvuk Ogg Vorbis</comment>
- <comment xml:lang="cy">Sain Ogg Vorbis</comment>
- <comment xml:lang="da">Ogg Vorbis-lyd</comment>
- <comment xml:lang="de">Ogg-Vorbis-Audio</comment>
- <comment xml:lang="el">Ήχος Ogg Vobris</comment>
- <comment xml:lang="en-GB">Ogg Vorbis audio</comment>
- <comment xml:lang="eo">Ogg-Vorbis-sondosiero</comment>
- <comment xml:lang="es">audio Ogg Vorbis</comment>
- <comment xml:lang="eu">Ogg Vorbis audioa</comment>
- <comment xml:lang="fi">Ogg Vorbis -ääni</comment>
- <comment xml:lang="fo">Ogg Vorbis ljóður</comment>
- <comment xml:lang="fr">audio Ogg Vorbis</comment>
- <comment xml:lang="fur">audio Ogg Vorbis</comment>
- <comment xml:lang="ga">fuaim Ogg Vorbis</comment>
- <comment xml:lang="gl">son Ogg Vorbis</comment>
- <comment xml:lang="he">שמע Ogg Vorbis</comment>
- <comment xml:lang="hr">Ogg Vorbis zvučni zapis</comment>
- <comment xml:lang="hu">Ogg Vorbis hang</comment>
- <comment xml:lang="ia">Audio Ogg Vorbis</comment>
- <comment xml:lang="id">Audio Ogg Vorbis</comment>
- <comment xml:lang="it">Audio Ogg Vorbis</comment>
- <comment xml:lang="ja">Ogg Vorbis オーディオ</comment>
- <comment xml:lang="ka">Ogg Vorbis აუდიო</comment>
- <comment xml:lang="kk">Ogg Vorbis аудиосы</comment>
- <comment xml:lang="ko">Ogg Vorbis 오디오</comment>
- <comment xml:lang="lt">Ogg Vorbis garso įrašas</comment>
- <comment xml:lang="lv">Ogg Vorbis audio</comment>
- <comment xml:lang="ms">Audio Ogg Vorbis</comment>
- <comment xml:lang="nb">Ogg Vorbis lyd</comment>
- <comment xml:lang="nl">Ogg Vorbis-audio</comment>
- <comment xml:lang="nn">Ogg Vorbis-lyd</comment>
- <comment xml:lang="oc">àudio Ogg Vorbis</comment>
- <comment xml:lang="pl">Plik dźwiękowy Ogg Vorbis</comment>
- <comment xml:lang="pt">áudio Ogg Vorbis</comment>
- <comment xml:lang="pt-BR">Áudio Ogg Vorbis</comment>
- <comment xml:lang="ro">Audio Ogg Vorbis</comment>
- <comment xml:lang="ru">Аудио Ogg Vorbis</comment>
- <comment xml:lang="sk">Zvuk Ogg Vorbis</comment>
- <comment xml:lang="sl">Zvočna datoteka Ogg Vorbis</comment>
- <comment xml:lang="sq">Audio Ogg Vorbis</comment>
- <comment xml:lang="sr">Огг Ворбис звук</comment>
- <comment xml:lang="sv">Ogg Vorbis-ljud</comment>
- <comment xml:lang="tr">Ogg Vorbis sesi</comment>
- <comment xml:lang="uk">звук ogg Vorbis</comment>
+ <comment xml:lang="zh_TW">Ogg Vorbis 音訊</comment>
+ <comment xml:lang="zh_CN">Ogg Vorbis 音频</comment>
<comment xml:lang="vi">Âm thanh Vorbis Ogg</comment>
- <comment xml:lang="zh-CN">Ogg Vorbis 音频</comment>
- <comment xml:lang="zh-TW">Ogg Vorbis 音訊</comment>
+ <comment xml:lang="uk">звук ogg Vorbis</comment>
+ <comment xml:lang="tr">Ogg Vorbis sesi</comment>
+ <comment xml:lang="sv">Ogg Vorbis-ljud</comment>
+ <comment xml:lang="sr">Огг Ворбис звук</comment>
+ <comment xml:lang="sq">audio Ogg Vorbis</comment>
+ <comment xml:lang="sl">Zvočna datoteka Ogg Vorbis</comment>
+ <comment xml:lang="si">Ogg Vorbis ශ්රව්ය</comment>
+ <comment xml:lang="sk">Zvuk Ogg Vorbis</comment>
+ <comment xml:lang="ru">Аудио Ogg Vorbis</comment>
+ <comment xml:lang="ro">Audio Ogg Vorbis</comment>
+ <comment xml:lang="pt_BR">Áudio Ogg Vorbis</comment>
+ <comment xml:lang="pt">áudio Ogg Vorbis</comment>
+ <comment xml:lang="pl">Plik dźwiękowy Ogg Vorbis</comment>
+ <comment xml:lang="oc">àudio Ogg Vorbis</comment>
+ <comment xml:lang="nn">Ogg Vorbis-lyd</comment>
+ <comment xml:lang="nl">Ogg Vorbis-audio</comment>
+ <comment xml:lang="nb">Ogg Vorbis lyd</comment>
+ <comment xml:lang="ms">Audio Ogg Vorbis</comment>
+ <comment xml:lang="lv">Ogg Vorbis audio</comment>
+ <comment xml:lang="lt">Ogg Vorbis garso įrašas</comment>
+ <comment xml:lang="ko">Ogg Vorbis 오디오</comment>
+ <comment xml:lang="kk">Ogg Vorbis аудиосы</comment>
+ <comment xml:lang="ka">Ogg Vorbis აუდიო</comment>
+ <comment xml:lang="ja">Ogg Vorbis オーディオ</comment>
+ <comment xml:lang="it">Audio Ogg Vorbis</comment>
+ <comment xml:lang="is">Ogg Vorbis hljóðskrá</comment>
+ <comment xml:lang="id">Audio Ogg Vorbis</comment>
+ <comment xml:lang="ia">Audio Ogg Vorbis</comment>
+ <comment xml:lang="hu">Ogg Vorbis hang</comment>
+ <comment xml:lang="hr">Ogg Vorbis zvučni zapis</comment>
+ <comment xml:lang="he">שמע Ogg Vorbis</comment>
+ <comment xml:lang="gl">son Ogg Vorbis</comment>
+ <comment xml:lang="ga">fuaim Ogg Vorbis</comment>
+ <comment xml:lang="fur">audio Ogg Vorbis</comment>
+ <comment xml:lang="fr">audio Ogg Vorbis</comment>
+ <comment xml:lang="fo">Ogg Vorbis ljóður</comment>
+ <comment xml:lang="fi">Ogg Vorbis -ääni</comment>
+ <comment xml:lang="eu">Ogg Vorbis audioa</comment>
+ <comment xml:lang="es">sonido Ogg Vorbis</comment>
+ <comment xml:lang="eo">Ogg-Vorbis-sondosiero</comment>
+ <comment xml:lang="en_GB">Ogg Vorbis audio</comment>
+ <comment xml:lang="el">Ήχος Ogg Vobris</comment>
+ <comment xml:lang="de">Ogg-Vorbis-Audio</comment>
+ <comment xml:lang="da">Ogg Vorbis-lyd</comment>
+ <comment xml:lang="cy">Sain Ogg Vorbis</comment>
+ <comment xml:lang="cs">zvuk Ogg Vorbis</comment>
+ <comment xml:lang="ca">àudio Ogg Vorbis</comment>
+ <comment xml:lang="bg">Аудио — Ogg Vorbis</comment>
+ <comment xml:lang="be@latin">Aŭdyjo Ogg Vorbis</comment>
+ <comment xml:lang="be">аўдыя Ogg Vorbis</comment>
+ <comment xml:lang="az">Ogg Vorbis audio faylı</comment>
+ <comment xml:lang="ar">صوت Ogg Vorbis</comment>
+ <comment xml:lang="af">Ogg Vorbis-oudio</comment>
<sub-class-of type="audio/ogg"/>
<alias type="audio/vorbis"/>
<alias type="audio/x-vorbis"/>
@@ -17861,55 +18819,58 @@ command to generate the output files.
</mime-type>
<mime-type type="audio/x-flac+ogg">
<comment>Ogg FLAC audio</comment>
- <comment xml:lang="af">Ogg FLAC-oudio</comment>
- <comment xml:lang="ar">Ogg FLAC سمعي</comment>
- <comment xml:lang="be-Latn">Aŭdyjo Ogg FLAC</comment>
- <comment xml:lang="bg">Аудио — Ogg FLAC</comment>
- <comment xml:lang="ca">àudio Ogg FLAC</comment>
- <comment xml:lang="cs">zvuk Ogg FLAC</comment>
- <comment xml:lang="da">Ogg FLAC-lyd</comment>
- <comment xml:lang="de">Ogg-FLAC-Audio</comment>
- <comment xml:lang="el">Ήχος Ogg FLAC</comment>
- <comment xml:lang="en-GB">Ogg FLAC audio</comment>
- <comment xml:lang="es">audio Ogg FLAC</comment>
- <comment xml:lang="eu">Ogg FLAC audioa</comment>
- <comment xml:lang="fi">Ogg FLAC -ääni</comment>
- <comment xml:lang="fo">Ogg FLAC ljóður</comment>
- <comment xml:lang="fr">audio Ogg FLAC</comment>
- <comment xml:lang="fur">audio Ogg FLAC</comment>
- <comment xml:lang="ga">fuaim Ogg FLAC</comment>
- <comment xml:lang="gl">son Ogg FLAC</comment>
- <comment xml:lang="he">שמע Ogg FLAC</comment>
- <comment xml:lang="hr">Ogg FLAC zvučni zapis</comment>
- <comment xml:lang="hu">Ogg FLAC hang</comment>
- <comment xml:lang="ia">Audio Ogg FLAC</comment>
- <comment xml:lang="id">Audio Ogg FLAC</comment>
- <comment xml:lang="it">Audio Ogg FLAC</comment>
- <comment xml:lang="ja">Ogg FLAC オーディオ</comment>
- <comment xml:lang="ka">Ogg FLAC აუდიო</comment>
- <comment xml:lang="kk">Ogg FLAC аудиосы</comment>
- <comment xml:lang="ko">Ogg FLAC 오디오</comment>
- <comment xml:lang="lt">Ogg FLAC garso įrašas</comment>
- <comment xml:lang="lv">Ogg FLAC audio</comment>
- <comment xml:lang="nb">Ogg FLAC-lyd</comment>
- <comment xml:lang="nl">Ogg FLAC-audio</comment>
- <comment xml:lang="nn">Ogg FLAC-lyd</comment>
- <comment xml:lang="oc">àudio Ogg FLAC</comment>
- <comment xml:lang="pl">Plik dźwiękowy Ogg FLAC</comment>
- <comment xml:lang="pt">áudio Ogg FLAC</comment>
- <comment xml:lang="pt-BR">Áudio Ogg FLAC</comment>
- <comment xml:lang="ro">Audio Ogg FLAC</comment>
- <comment xml:lang="ru">Аудио Ogg FLAC</comment>
- <comment xml:lang="sk">Zvuk Ogg FLAC</comment>
- <comment xml:lang="sl">Zvočna datoteka Ogg FLAC</comment>
- <comment xml:lang="sq">Audio Ogg FLAC</comment>
- <comment xml:lang="sr">Огг ФЛАЦ звук</comment>
- <comment xml:lang="sv">Ogg FLAC-ljud</comment>
- <comment xml:lang="tr">Ogg FLAC sesi</comment>
- <comment xml:lang="uk">звук ogg FLAC</comment>
+ <comment xml:lang="zh_TW">Ogg FLAC 音訊</comment>
+ <comment xml:lang="zh_CN">Ogg FLAC 音频</comment>
<comment xml:lang="vi">Âm thanh FLAC Ogg</comment>
- <comment xml:lang="zh-CN">Ogg FLAC 音频</comment>
- <comment xml:lang="zh-TW">Ogg FLAC 音訊</comment>
+ <comment xml:lang="uk">звук ogg FLAC</comment>
+ <comment xml:lang="tr">Ogg FLAC sesi</comment>
+ <comment xml:lang="sv">Ogg FLAC-ljud</comment>
+ <comment xml:lang="sr">Огг ФЛАЦ звук</comment>
+ <comment xml:lang="sq">audio Ogg FLAC</comment>
+ <comment xml:lang="sl">Zvočna datoteka Ogg FLAC</comment>
+ <comment xml:lang="si">Ogg FLAC ශ්රව්ය</comment>
+ <comment xml:lang="sk">Zvuk Ogg FLAC</comment>
+ <comment xml:lang="ru">Аудио Ogg FLAC</comment>
+ <comment xml:lang="ro">Audio Ogg FLAC</comment>
+ <comment xml:lang="pt_BR">Áudio Ogg FLAC</comment>
+ <comment xml:lang="pt">áudio Ogg FLAC</comment>
+ <comment xml:lang="pl">Plik dźwiękowy Ogg FLAC</comment>
+ <comment xml:lang="oc">àudio Ogg FLAC</comment>
+ <comment xml:lang="nn">Ogg FLAC-lyd</comment>
+ <comment xml:lang="nl">Ogg FLAC-audio</comment>
+ <comment xml:lang="nb">Ogg FLAC-lyd</comment>
+ <comment xml:lang="lv">Ogg FLAC audio</comment>
+ <comment xml:lang="lt">Ogg FLAC garso įrašas</comment>
+ <comment xml:lang="ko">Ogg FLAC 오디오</comment>
+ <comment xml:lang="kk">Ogg FLAC аудиосы</comment>
+ <comment xml:lang="ka">Ogg FLAC აუდიო</comment>
+ <comment xml:lang="ja">Ogg FLAC オーディオ</comment>
+ <comment xml:lang="it">Audio Ogg FLAC</comment>
+ <comment xml:lang="is">Ogg FLAC hljóðskrá</comment>
+ <comment xml:lang="id">Audio Ogg FLAC</comment>
+ <comment xml:lang="ia">Audio Ogg FLAC</comment>
+ <comment xml:lang="hu">Ogg FLAC hang</comment>
+ <comment xml:lang="hr">Ogg FLAC zvučni zapis</comment>
+ <comment xml:lang="he">שמע Ogg FLAC</comment>
+ <comment xml:lang="gl">son Ogg FLAC</comment>
+ <comment xml:lang="ga">fuaim Ogg FLAC</comment>
+ <comment xml:lang="fur">audio Ogg FLAC</comment>
+ <comment xml:lang="fr">audio Ogg FLAC</comment>
+ <comment xml:lang="fo">Ogg FLAC ljóður</comment>
+ <comment xml:lang="fi">Ogg FLAC -ääni</comment>
+ <comment xml:lang="eu">Ogg FLAC audioa</comment>
+ <comment xml:lang="es">sonido Ogg FLAC</comment>
+ <comment xml:lang="en_GB">Ogg FLAC audio</comment>
+ <comment xml:lang="el">Ήχος Ogg FLAC</comment>
+ <comment xml:lang="de">Ogg-FLAC-Audio</comment>
+ <comment xml:lang="da">Ogg FLAC-lyd</comment>
+ <comment xml:lang="cs">zvuk Ogg FLAC</comment>
+ <comment xml:lang="ca">àudio Ogg FLAC</comment>
+ <comment xml:lang="bg">Аудио — Ogg FLAC</comment>
+ <comment xml:lang="be@latin">Aŭdyjo Ogg FLAC</comment>
+ <comment xml:lang="be">аўдыя Ogg FLAC</comment>
+ <comment xml:lang="ar">صوت Ogg FLAC</comment>
+ <comment xml:lang="af">Ogg FLAC-oudio</comment>
<sub-class-of type="audio/ogg"/>
<alias type="audio/x-oggflac"/>
<magic priority="80">
@@ -17925,42 +18886,49 @@ command to generate the output files.
</mime-type>
<mime-type type="audio/x-opus+ogg">
<comment>Opus audio</comment>
- <comment xml:lang="af">Opus-oudio</comment>
- <comment xml:lang="bg">Аудио — Opus</comment>
- <comment xml:lang="ca">àudio Opus</comment>
- <comment xml:lang="cs">zvuk Opus</comment>
- <comment xml:lang="da">Opus-lyd</comment>
- <comment xml:lang="de">Opus-Audio</comment>
- <comment xml:lang="el">Ήχος Opus </comment>
- <comment xml:lang="en-GB">Opus audio</comment>
- <comment xml:lang="es">audio Opus</comment>
- <comment xml:lang="eu">Opus audioa</comment>
- <comment xml:lang="fi">Opus-ääni</comment>
- <comment xml:lang="fr">audio Opus</comment>
- <comment xml:lang="fur">audio Opus</comment>
- <comment xml:lang="ga">fuaim Opus</comment>
- <comment xml:lang="gl">Son Opus</comment>
- <comment xml:lang="he">שמע Opus</comment>
- <comment xml:lang="hr">Opus zvučni zapis</comment>
- <comment xml:lang="hu">Opus hang</comment>
- <comment xml:lang="ia">Audio Opus</comment>
- <comment xml:lang="id">Audio Opus</comment>
- <comment xml:lang="it">Audio Opus</comment>
- <comment xml:lang="kk">Opus аудиосы</comment>
- <comment xml:lang="ko">Opus 오디오</comment>
- <comment xml:lang="oc">àudio Opus</comment>
- <comment xml:lang="pl">Plik dźwiękowy Opus</comment>
- <comment xml:lang="pt">áudio Opus</comment>
- <comment xml:lang="pt-BR">Áudio Opus</comment>
- <comment xml:lang="ru">Аудио Opus</comment>
- <comment xml:lang="sk">Zvuk Opu</comment>
- <comment xml:lang="sl">Zvočna datoteka Opus</comment>
- <comment xml:lang="sr">Опус звук</comment>
- <comment xml:lang="sv">Opus-ljud</comment>
- <comment xml:lang="tr">Opus sesi</comment>
+ <comment xml:lang="zh_TW">Opus 音訊</comment>
+ <comment xml:lang="zh_CN">Opus 音频</comment>
<comment xml:lang="uk">звук Opus</comment>
- <comment xml:lang="zh-CN">Opus 音频</comment>
- <comment xml:lang="zh-TW">Opus 音訊</comment>
+ <comment xml:lang="tr">Opus sesi</comment>
+ <comment xml:lang="sv">Opus-ljud</comment>
+ <comment xml:lang="sr">Опус звук</comment>
+ <comment xml:lang="sq">audio Opus</comment>
+ <comment xml:lang="sl">Zvočna datoteka Opus</comment>
+ <comment xml:lang="si">ඕපස් ඕඩියෝ</comment>
+ <comment xml:lang="sk">Zvuk Opu</comment>
+ <comment xml:lang="ru">Аудио Opus</comment>
+ <comment xml:lang="pt_BR">Áudio Opus</comment>
+ <comment xml:lang="pt">áudio Opus</comment>
+ <comment xml:lang="pl">Plik dźwiękowy Opus</comment>
+ <comment xml:lang="oc">àudio Opus</comment>
+ <comment xml:lang="nl">Opus-audio</comment>
+ <comment xml:lang="ko">Opus 오디오</comment>
+ <comment xml:lang="kk">Opus аудиосы</comment>
+ <comment xml:lang="ja">Opus オーディオ</comment>
+ <comment xml:lang="it">Audio Opus</comment>
+ <comment xml:lang="is">Opus hljóðskrá</comment>
+ <comment xml:lang="id">Audio Opus</comment>
+ <comment xml:lang="ia">Audio Opus</comment>
+ <comment xml:lang="hu">Opus hang</comment>
+ <comment xml:lang="hr">Opus zvučni zapis</comment>
+ <comment xml:lang="he">שמע Opus</comment>
+ <comment xml:lang="gl">Son Opus</comment>
+ <comment xml:lang="ga">fuaim Opus</comment>
+ <comment xml:lang="fur">audio Opus</comment>
+ <comment xml:lang="fr">audio Opus</comment>
+ <comment xml:lang="fi">Opus-ääni</comment>
+ <comment xml:lang="eu">Opus audioa</comment>
+ <comment xml:lang="es">sonido Opus</comment>
+ <comment xml:lang="en_GB">Opus audio</comment>
+ <comment xml:lang="el">Ήχος Opus </comment>
+ <comment xml:lang="de">Opus-Audio</comment>
+ <comment xml:lang="da">Opus-lyd</comment>
+ <comment xml:lang="cs">zvuk Opus</comment>
+ <comment xml:lang="ca">àudio Opus</comment>
+ <comment xml:lang="bg">Аудио — Opus</comment>
+ <comment xml:lang="be">аўдыя Opus</comment>
+ <comment xml:lang="ar">صوت Opus</comment>
+ <comment xml:lang="af">Opus-oudio</comment>
<sub-class-of type="audio/ogg"/>
<magic priority="80">
<match type="string" value="OggS" offset="0">
@@ -17971,55 +18939,58 @@ command to generate the output files.
</mime-type>
<mime-type type="audio/x-speex+ogg">
<comment>Ogg Speex audio</comment>
- <comment xml:lang="af">Ogg Speex-oudio</comment>
- <comment xml:lang="ar">Ogg Speex سمعي</comment>
- <comment xml:lang="be-Latn">Aŭdyjo Ogg Speex</comment>
- <comment xml:lang="bg">Аудио — Ogg Speex</comment>
- <comment xml:lang="ca">àudio Ogg Speex</comment>
- <comment xml:lang="cs">zvuk Ogg Speex</comment>
- <comment xml:lang="da">Ogg Speex-lyd</comment>
- <comment xml:lang="de">Ogg-Speex-Audio</comment>
- <comment xml:lang="el">Ήχος Ogg Speex</comment>
- <comment xml:lang="en-GB">Ogg Speex audio</comment>
- <comment xml:lang="es">audio Ogg Speex</comment>
- <comment xml:lang="eu">Ogg Speex audioa</comment>
- <comment xml:lang="fi">Ogg Speex -ääni</comment>
- <comment xml:lang="fo">Ogg Speex ljóður</comment>
- <comment xml:lang="fr">audio Ogg Speex</comment>
- <comment xml:lang="fur">audio Ogg Speex</comment>
- <comment xml:lang="ga">fuaim Ogg Speex</comment>
- <comment xml:lang="gl">son Ogg Speex</comment>
- <comment xml:lang="he">שמע Ogg Speex</comment>
- <comment xml:lang="hr">Ogg Speex zvučni zapis</comment>
- <comment xml:lang="hu">Ogg Speex hang</comment>
- <comment xml:lang="ia">Audio Ogg Speex</comment>
- <comment xml:lang="id">Audio Ogg Speex</comment>
- <comment xml:lang="it">Audio Ogg Speex</comment>
- <comment xml:lang="ja">Ogg Speex オーディオ</comment>
- <comment xml:lang="ka">Ogg Speex აუდიო</comment>
- <comment xml:lang="kk">Ogg Speex аудиосы</comment>
- <comment xml:lang="ko">Ogg Speex 오디오</comment>
- <comment xml:lang="lt">Ogg Speex garso įrašas</comment>
- <comment xml:lang="lv">Ogg Speex audio</comment>
- <comment xml:lang="nb">Ogg Speex lyd</comment>
- <comment xml:lang="nl">Ogg Speex-audio</comment>
- <comment xml:lang="nn">Ogg Speex-lyd</comment>
- <comment xml:lang="oc">àudio Ogg Speex</comment>
- <comment xml:lang="pl">Plik dźwiękowy Ogg Speex</comment>
- <comment xml:lang="pt">áudio Ogg Speex</comment>
- <comment xml:lang="pt-BR">Áudio Ogg Speex</comment>
- <comment xml:lang="ro">Audio Ogg Speex</comment>
- <comment xml:lang="ru">Аудио Ogg Speex</comment>
- <comment xml:lang="sk">Zvuk Ogg Speex</comment>
- <comment xml:lang="sl">Zvočna datoteka Ogg Speex</comment>
- <comment xml:lang="sq">Audio Ogg Speex</comment>
- <comment xml:lang="sr">Огг Спикс звук</comment>
- <comment xml:lang="sv">Ogg Speex-ljud</comment>
- <comment xml:lang="tr">Ogg Speex sesi</comment>
- <comment xml:lang="uk">звук ogg Speex</comment>
+ <comment xml:lang="zh_TW">Ogg Speex 音訊</comment>
+ <comment xml:lang="zh_CN">Ogg Speex 音频</comment>
<comment xml:lang="vi">Âm thanh Speex Ogg</comment>
- <comment xml:lang="zh-CN">Ogg Speex 音频</comment>
- <comment xml:lang="zh-TW">Ogg Speex 音訊</comment>
+ <comment xml:lang="uk">звук ogg Speex</comment>
+ <comment xml:lang="tr">Ogg Speex sesi</comment>
+ <comment xml:lang="sv">Ogg Speex-ljud</comment>
+ <comment xml:lang="sr">Огг Спикс звук</comment>
+ <comment xml:lang="sq">audio Ogg Speex</comment>
+ <comment xml:lang="sl">Zvočna datoteka Ogg Speex</comment>
+ <comment xml:lang="si">Ogg Speex ශ්‍රව්‍ය</comment>
+ <comment xml:lang="sk">Zvuk Ogg Speex</comment>
+ <comment xml:lang="ru">Аудио Ogg Speex</comment>
+ <comment xml:lang="ro">Audio Ogg Speex</comment>
+ <comment xml:lang="pt_BR">Áudio Ogg Speex</comment>
+ <comment xml:lang="pt">áudio Ogg Speex</comment>
+ <comment xml:lang="pl">Plik dźwiękowy Ogg Speex</comment>
+ <comment xml:lang="oc">àudio Ogg Speex</comment>
+ <comment xml:lang="nn">Ogg Speex-lyd</comment>
+ <comment xml:lang="nl">Ogg Speex-audio</comment>
+ <comment xml:lang="nb">Ogg Speex lyd</comment>
+ <comment xml:lang="lv">Ogg Speex audio</comment>
+ <comment xml:lang="lt">Ogg Speex garso įrašas</comment>
+ <comment xml:lang="ko">Ogg Speex 오디오</comment>
+ <comment xml:lang="kk">Ogg Speex аудиосы</comment>
+ <comment xml:lang="ka">Ogg Speex აუდიო</comment>
+ <comment xml:lang="ja">Ogg Speex オーディオ</comment>
+ <comment xml:lang="it">Audio Ogg Speex</comment>
+ <comment xml:lang="is">Ogg Speex hljóðskrá</comment>
+ <comment xml:lang="id">Audio Ogg Speex</comment>
+ <comment xml:lang="ia">Audio Ogg Speex</comment>
+ <comment xml:lang="hu">Ogg Speex hang</comment>
+ <comment xml:lang="hr">Ogg Speex zvučni zapis</comment>
+ <comment xml:lang="he">שמע Ogg Speex</comment>
+ <comment xml:lang="gl">son Ogg Speex</comment>
+ <comment xml:lang="ga">fuaim Ogg Speex</comment>
+ <comment xml:lang="fur">audio Ogg Speex</comment>
+ <comment xml:lang="fr">audio Ogg Speex</comment>
+ <comment xml:lang="fo">Ogg Speex ljóður</comment>
+ <comment xml:lang="fi">Ogg Speex -ääni</comment>
+ <comment xml:lang="eu">Ogg Speex audioa</comment>
+ <comment xml:lang="es">sonido Ogg Speex</comment>
+ <comment xml:lang="en_GB">Ogg Speex audio</comment>
+ <comment xml:lang="el">Ήχος Ogg Speex</comment>
+ <comment xml:lang="de">Ogg-Speex-Audio</comment>
+ <comment xml:lang="da">Ogg Speex-lyd</comment>
+ <comment xml:lang="cs">zvuk Ogg Speex</comment>
+ <comment xml:lang="ca">àudio Ogg Speex</comment>
+ <comment xml:lang="bg">Аудио — Ogg Speex</comment>
+ <comment xml:lang="be@latin">Aŭdyjo Ogg Speex</comment>
+ <comment xml:lang="be">аўдыя Ogg Speex</comment>
+ <comment xml:lang="ar">صوت Ogg Speex</comment>
+ <comment xml:lang="af">Ogg Speex-oudio</comment>
<sub-class-of type="audio/ogg"/>
<magic priority="80">
<match type="string" value="OggS" offset="0">
@@ -18032,111 +19003,117 @@ command to generate the output files.
</mime-type>
<mime-type type="audio/x-speex">
<comment>Speex audio</comment>
- <comment xml:lang="af">Speex-oudio</comment>
- <comment xml:lang="ar">Speex سمعي</comment>
- <comment xml:lang="be-Latn">Aŭdyjo Speex</comment>
- <comment xml:lang="bg">Аудио — Speex</comment>
- <comment xml:lang="ca">àudio Speex</comment>
- <comment xml:lang="cs">zvuk Speex</comment>
- <comment xml:lang="da">Speex-lyd</comment>
- <comment xml:lang="de">Speex-Audio</comment>
- <comment xml:lang="el">Ήχος Speex</comment>
- <comment xml:lang="en-GB">Speex audio</comment>
- <comment xml:lang="es">audio Speex</comment>
- <comment xml:lang="eu">Speex audioa</comment>
- <comment xml:lang="fi">Speex-ääni</comment>
- <comment xml:lang="fo">Speex ljóður</comment>
- <comment xml:lang="fr">audio Speex</comment>
- <comment xml:lang="fur">audio Speex</comment>
- <comment xml:lang="ga">fuaim Speex</comment>
- <comment xml:lang="gl">son Speex</comment>
- <comment xml:lang="he">שמע של Speex</comment>
- <comment xml:lang="hr">Speex zvučni zapis</comment>
- <comment xml:lang="hu">Speex hang</comment>
- <comment xml:lang="ia">Audio Speex</comment>
- <comment xml:lang="id">Audio Speex</comment>
- <comment xml:lang="it">Audio Speex</comment>
- <comment xml:lang="ja">Speex オーディオ</comment>
- <comment xml:lang="kk">Speex аудиосы</comment>
- <comment xml:lang="ko">Speex 오디오</comment>
- <comment xml:lang="lt">Speex garso įrašas</comment>
- <comment xml:lang="lv">Speex audio</comment>
- <comment xml:lang="nb">Speex lyd</comment>
- <comment xml:lang="nl">Speex-audio</comment>
- <comment xml:lang="nn">Speex-lyd</comment>
- <comment xml:lang="oc">àudio Speex</comment>
- <comment xml:lang="pl">Plik dźwiękowy Speex</comment>
- <comment xml:lang="pt">áudio Speex</comment>
- <comment xml:lang="pt-BR">Áudio Speex</comment>
- <comment xml:lang="ro">Audio Speex</comment>
- <comment xml:lang="ru">Аудио Speex</comment>
- <comment xml:lang="sk">Zvuk Speex</comment>
- <comment xml:lang="sl">Zvočna datoteka Speex</comment>
- <comment xml:lang="sq">Audio Speex</comment>
- <comment xml:lang="sr">Спикс звук</comment>
- <comment xml:lang="sv">Speex-ljud</comment>
- <comment xml:lang="tr">Speex sesi</comment>
- <comment xml:lang="uk">звук Speex</comment>
+ <comment xml:lang="zh_TW">Speex 音訊</comment>
+ <comment xml:lang="zh_CN">Speex 音频</comment>
<comment xml:lang="vi">Âm thanh Speex</comment>
- <comment xml:lang="zh-CN">Speex 音频</comment>
- <comment xml:lang="zh-TW">Speex 音訊</comment>
- <magic priority="50">
+ <comment xml:lang="uk">звук Speex</comment>
+ <comment xml:lang="tr">Speex sesi</comment>
+ <comment xml:lang="sv">Speex-ljud</comment>
+ <comment xml:lang="sr">Спикс звук</comment>
+ <comment xml:lang="sq">audio Speex</comment>
+ <comment xml:lang="sl">Zvočna datoteka Speex</comment>
+ <comment xml:lang="si">ස්පීක්ස් ඕඩියෝ</comment>
+ <comment xml:lang="sk">Zvuk Speex</comment>
+ <comment xml:lang="ru">Аудио Speex</comment>
+ <comment xml:lang="ro">Audio Speex</comment>
+ <comment xml:lang="pt_BR">Áudio Speex</comment>
+ <comment xml:lang="pt">áudio Speex</comment>
+ <comment xml:lang="pl">Plik dźwiękowy Speex</comment>
+ <comment xml:lang="oc">àudio Speex</comment>
+ <comment xml:lang="nn">Speex-lyd</comment>
+ <comment xml:lang="nl">Speex-audio</comment>
+ <comment xml:lang="nb">Speex lyd</comment>
+ <comment xml:lang="lv">Speex audio</comment>
+ <comment xml:lang="lt">Speex garso įrašas</comment>
+ <comment xml:lang="ko">Speex 오디오</comment>
+ <comment xml:lang="kk">Speex аудиосы</comment>
+ <comment xml:lang="ja">Speex オーディオ</comment>
+ <comment xml:lang="it">Audio Speex</comment>
+ <comment xml:lang="is">Speex hljóðskrá</comment>
+ <comment xml:lang="id">Audio Speex</comment>
+ <comment xml:lang="ia">Audio Speex</comment>
+ <comment xml:lang="hu">Speex hang</comment>
+ <comment xml:lang="hr">Speex zvučni zapis</comment>
+ <comment xml:lang="he">שמע של Speex</comment>
+ <comment xml:lang="gl">son Speex</comment>
+ <comment xml:lang="ga">fuaim Speex</comment>
+ <comment xml:lang="fur">audio Speex</comment>
+ <comment xml:lang="fr">audio Speex</comment>
+ <comment xml:lang="fo">Speex ljóður</comment>
+ <comment xml:lang="fi">Speex-ääni</comment>
+ <comment xml:lang="eu">Speex audioa</comment>
+ <comment xml:lang="es">sonido Speex</comment>
+ <comment xml:lang="en_GB">Speex audio</comment>
+ <comment xml:lang="el">Ήχος Speex</comment>
+ <comment xml:lang="de">Speex-Audio</comment>
+ <comment xml:lang="da">Speex-lyd</comment>
+ <comment xml:lang="cs">zvuk Speex</comment>
+ <comment xml:lang="ca">àudio Speex</comment>
+ <comment xml:lang="bg">Аудио — Speex</comment>
+ <comment xml:lang="be@latin">Aŭdyjo Speex</comment>
+ <comment xml:lang="be">аўдыя Speex</comment>
+ <comment xml:lang="ar">صوت Speex</comment>
+ <comment xml:lang="af">Speex-oudio</comment>
+ <magic>
<match type="string" value="Speex" offset="0"/>
</magic>
<glob pattern="*.spx"/>
</mime-type>
<mime-type type="video/x-theora+ogg">
<comment>Ogg Theora video</comment>
- <comment xml:lang="af">Ogg Theora-video</comment>
- <comment xml:lang="ar">Ogg Theora مرئي</comment>
- <comment xml:lang="ast">Videu n'Ogg Theora</comment>
- <comment xml:lang="be-Latn">Videa Ogg Theora</comment>
- <comment xml:lang="bg">Видео — Ogg Theora</comment>
- <comment xml:lang="ca">vídeo Ogg Theora</comment>
- <comment xml:lang="cs">video Ogg Theora</comment>
- <comment xml:lang="da">Ogg Theora-video</comment>
- <comment xml:lang="de">Ogg-Theora-Video</comment>
- <comment xml:lang="el">Βίντεο Ogg Theora</comment>
- <comment xml:lang="en-GB">Ogg Theora video</comment>
- <comment xml:lang="es">vídeo Ogg Theora</comment>
- <comment xml:lang="eu">Ogg Theora bideoa</comment>
- <comment xml:lang="fi">Ogg Theora -video</comment>
- <comment xml:lang="fo">Ogg Theora video</comment>
- <comment xml:lang="fr">vidéo Ogg Theora</comment>
- <comment xml:lang="fur">video Ogg Theora</comment>
- <comment xml:lang="ga">físeán Ogg Theora</comment>
- <comment xml:lang="gl">vídeo Ogg Theora</comment>
- <comment xml:lang="he">שמע Ogg Theora</comment>
- <comment xml:lang="hr">Ogg Theora video snimka</comment>
- <comment xml:lang="hu">Ogg Theora videó</comment>
- <comment xml:lang="ia">Video Ogg Theora</comment>
- <comment xml:lang="id">Video Ogg Theora</comment>
- <comment xml:lang="it">Video Ogg Theora</comment>
- <comment xml:lang="ja">Ogg Theora 動画</comment>
- <comment xml:lang="ka">Ogg Theora ვიდეო</comment>
- <comment xml:lang="kk">Ogg Theora видеосы</comment>
- <comment xml:lang="ko">Ogg Theora 동영상</comment>
- <comment xml:lang="lt">Ogg Theora vaizdo įrašas</comment>
- <comment xml:lang="lv">Ogg Theora video</comment>
- <comment xml:lang="nb">Ogg Theora video</comment>
- <comment xml:lang="nl">Ogg Theora-video</comment>
- <comment xml:lang="nn">Ogg Theora-video</comment>
- <comment xml:lang="oc">vidèo Ogg Theora</comment>
- <comment xml:lang="pl">Plik wideo Ogg Theora</comment>
- <comment xml:lang="pt">vídeo Ogg Theora</comment>
- <comment xml:lang="pt-BR">Vídeo Ogg Theora</comment>
- <comment xml:lang="ro">Video Ogg Theora</comment>
- <comment xml:lang="ru">Видео Ogg Theora</comment>
- <comment xml:lang="sk">Video Ogg Theora</comment>
- <comment xml:lang="sl">Video datoteka Ogg Theora</comment>
- <comment xml:lang="sq">Video Ogg Theora</comment>
- <comment xml:lang="sr">Огг Теора видео</comment>
- <comment xml:lang="sv">Ogg Theora-video</comment>
- <comment xml:lang="tr">Ogg Theora video</comment>
- <comment xml:lang="uk">відеокліп ogg Theora</comment>
+ <comment xml:lang="zh_TW">Ogg Theora 視訊</comment>
+ <comment xml:lang="zh_CN">Ogg Theora 视频</comment>
<comment xml:lang="vi">Ảnh động Theora Ogg</comment>
- <comment xml:lang="zh-CN">Ogg Theora 视频</comment>
- <comment xml:lang="zh-TW">Ogg Theora 視訊</comment>
+ <comment xml:lang="uk">відеокліп ogg Theora</comment>
+ <comment xml:lang="tr">Ogg Theora video</comment>
+ <comment xml:lang="sv">Ogg Theora-video</comment>
+ <comment xml:lang="sr">Огг Теора видео</comment>
+ <comment xml:lang="sq">video Ogg Theora</comment>
+ <comment xml:lang="sl">Video datoteka Ogg Theora</comment>
+ <comment xml:lang="si">Ogg Theora වීඩියෝව</comment>
+ <comment xml:lang="sk">Video Ogg Theora</comment>
+ <comment xml:lang="ru">Видео Ogg Theora</comment>
+ <comment xml:lang="ro">Video Ogg Theora</comment>
+ <comment xml:lang="pt_BR">Vídeo Ogg Theora</comment>
+ <comment xml:lang="pt">vídeo Ogg Theora</comment>
+ <comment xml:lang="pl">Plik wideo Ogg Theora</comment>
+ <comment xml:lang="oc">vidèo Ogg Theora</comment>
+ <comment xml:lang="nn">Ogg Theora-video</comment>
+ <comment xml:lang="nl">Ogg Theora-video</comment>
+ <comment xml:lang="nb">Ogg Theora video</comment>
+ <comment xml:lang="lv">Ogg Theora video</comment>
+ <comment xml:lang="lt">Ogg Theora vaizdo įrašas</comment>
+ <comment xml:lang="ko">Ogg Theora 동영상</comment>
+ <comment xml:lang="kk">Ogg Theora видеосы</comment>
+ <comment xml:lang="ka">Ogg Theora ვიდეო</comment>
+ <comment xml:lang="ja">Ogg Theora 動画</comment>
+ <comment xml:lang="it">Video Ogg Theora</comment>
+ <comment xml:lang="is">Ogg Theora myndskeið</comment>
+ <comment xml:lang="id">Video Ogg Theora</comment>
+ <comment xml:lang="ia">Video Ogg Theora</comment>
+ <comment xml:lang="hu">Ogg Theora videó</comment>
+ <comment xml:lang="hr">Ogg Theora video snimka</comment>
+ <comment xml:lang="he">שמע Ogg Theora</comment>
+ <comment xml:lang="gl">vídeo Ogg Theora</comment>
+ <comment xml:lang="ga">físeán Ogg Theora</comment>
+ <comment xml:lang="fur">video Ogg Theora</comment>
+ <comment xml:lang="fr">vidéo Ogg Theora</comment>
+ <comment xml:lang="fo">Ogg Theora video</comment>
+ <comment xml:lang="fi">Ogg Theora -video</comment>
+ <comment xml:lang="eu">Ogg Theora bideoa</comment>
+ <comment xml:lang="es">vídeo Ogg Theora</comment>
+ <comment xml:lang="en_GB">Ogg Theora video</comment>
+ <comment xml:lang="el">Βίντεο Ogg Theora</comment>
+ <comment xml:lang="de">Ogg-Theora-Video</comment>
+ <comment xml:lang="da">Ogg Theora-video</comment>
+ <comment xml:lang="cs">video Ogg Theora</comment>
+ <comment xml:lang="ca">vídeo Ogg Theora</comment>
+ <comment xml:lang="bg">Видео — Ogg Theora</comment>
+ <comment xml:lang="be@latin">Videa Ogg Theora</comment>
+ <comment xml:lang="be">відэа Ogg Theora</comment>
+ <comment xml:lang="ast">Videu n'Ogg Theora</comment>
+ <comment xml:lang="ar">فيديو Ogg Theora</comment>
+ <comment xml:lang="af">Ogg Theora-video</comment>
<sub-class-of type="video/ogg"/>
<alias type="video/x-theora"/>
<magic priority="80">
@@ -18148,57 +19125,60 @@ command to generate the output files.
</mime-type>
<mime-type type="video/x-ogm+ogg">
<comment>OGM video</comment>
- <comment xml:lang="af">OGM-video</comment>
- <comment xml:lang="ar">OGM مرئي</comment>
- <comment xml:lang="ast">Videu n'OGM</comment>
- <comment xml:lang="be-Latn">Videa OGM</comment>
- <comment xml:lang="bg">Видео — OGM</comment>
- <comment xml:lang="ca">vídeo OGM</comment>
- <comment xml:lang="cs">video OGM</comment>
- <comment xml:lang="da">OGM-video</comment>
- <comment xml:lang="de">OGM-Video</comment>
- <comment xml:lang="el">Βίντεο OGM</comment>
- <comment xml:lang="en-GB">OGM video</comment>
- <comment xml:lang="eo">OGM-video</comment>
- <comment xml:lang="es">vídeo OGM</comment>
- <comment xml:lang="eu">OGM bideoa</comment>
- <comment xml:lang="fi">OGM-video</comment>
- <comment xml:lang="fo">OGM video</comment>
- <comment xml:lang="fr">vidéo OGM</comment>
- <comment xml:lang="fur">video OGM</comment>
- <comment xml:lang="ga">físeán OGM</comment>
- <comment xml:lang="gl">vídeo OGM</comment>
- <comment xml:lang="he">וידאו OGM</comment>
- <comment xml:lang="hr">OGM video snimka</comment>
- <comment xml:lang="hu">OGM-videó</comment>
- <comment xml:lang="ia">Video OGM</comment>
- <comment xml:lang="id">Video OGM</comment>
- <comment xml:lang="it">Video OGM</comment>
- <comment xml:lang="ja">OGM 動画</comment>
- <comment xml:lang="ka">OGM ვიდეო</comment>
- <comment xml:lang="kk">OGM видеосы</comment>
- <comment xml:lang="ko">OGM 동영상</comment>
- <comment xml:lang="lt">OGM vaizdo įrašas</comment>
- <comment xml:lang="lv">OGM video</comment>
- <comment xml:lang="nb">OGM-film</comment>
- <comment xml:lang="nl">OGM-video</comment>
- <comment xml:lang="nn">OGM-video</comment>
- <comment xml:lang="oc">vidèo OGM</comment>
- <comment xml:lang="pl">Plik wideo OGM</comment>
- <comment xml:lang="pt">vídeo OGM</comment>
- <comment xml:lang="pt-BR">Vídeo OGM</comment>
- <comment xml:lang="ro">Video OGM</comment>
- <comment xml:lang="ru">Видео OGM</comment>
- <comment xml:lang="sk">Video OGM</comment>
- <comment xml:lang="sl">Video datoteka OGM</comment>
- <comment xml:lang="sq">Video OGM</comment>
- <comment xml:lang="sr">ОГМ видео</comment>
- <comment xml:lang="sv">OGM-video</comment>
- <comment xml:lang="tr">OGM video</comment>
- <comment xml:lang="uk">відеокліп OGM</comment>
+ <comment xml:lang="zh_TW">OGM 視訊</comment>
+ <comment xml:lang="zh_CN">OGM 视频</comment>
<comment xml:lang="vi">Ảnh động OGM</comment>
- <comment xml:lang="zh-CN">OGM 视频</comment>
- <comment xml:lang="zh-TW">OGM 視訊</comment>
+ <comment xml:lang="uk">відеокліп OGM</comment>
+ <comment xml:lang="tr">OGM video</comment>
+ <comment xml:lang="sv">OGM-video</comment>
+ <comment xml:lang="sr">ОГМ видео</comment>
+ <comment xml:lang="sq">video OGM</comment>
+ <comment xml:lang="sl">Video datoteka OGM</comment>
+ <comment xml:lang="si">OGM වීඩියෝව</comment>
+ <comment xml:lang="sk">Video OGM</comment>
+ <comment xml:lang="ru">Видео OGM</comment>
+ <comment xml:lang="ro">Video OGM</comment>
+ <comment xml:lang="pt_BR">Vídeo OGM</comment>
+ <comment xml:lang="pt">vídeo OGM</comment>
+ <comment xml:lang="pl">Plik wideo OGM</comment>
+ <comment xml:lang="oc">vidèo OGM</comment>
+ <comment xml:lang="nn">OGM-video</comment>
+ <comment xml:lang="nl">OGM-video</comment>
+ <comment xml:lang="nb">OGM-film</comment>
+ <comment xml:lang="lv">OGM video</comment>
+ <comment xml:lang="lt">OGM vaizdo įrašas</comment>
+ <comment xml:lang="ko">OGM 동영상</comment>
+ <comment xml:lang="kk">OGM видеосы</comment>
+ <comment xml:lang="ka">OGM ვიდეო</comment>
+ <comment xml:lang="ja">OGM 動画</comment>
+ <comment xml:lang="it">Video OGM</comment>
+ <comment xml:lang="is">OGM myndskeið</comment>
+ <comment xml:lang="id">Video OGM</comment>
+ <comment xml:lang="ia">Video OGM</comment>
+ <comment xml:lang="hu">OGM-videó</comment>
+ <comment xml:lang="hr">OGM video snimka</comment>
+ <comment xml:lang="he">וידאו OGM</comment>
+ <comment xml:lang="gl">vídeo OGM</comment>
+ <comment xml:lang="ga">físeán OGM</comment>
+ <comment xml:lang="fur">video OGM</comment>
+ <comment xml:lang="fr">vidéo OGM</comment>
+ <comment xml:lang="fo">OGM video</comment>
+ <comment xml:lang="fi">OGM-video</comment>
+ <comment xml:lang="eu">OGM bideoa</comment>
+ <comment xml:lang="es">vídeo OGM</comment>
+ <comment xml:lang="eo">OGM-video</comment>
+ <comment xml:lang="en_GB">OGM video</comment>
+ <comment xml:lang="el">Βίντεο OGM</comment>
+ <comment xml:lang="de">OGM-Video</comment>
+ <comment xml:lang="da">OGM-video</comment>
+ <comment xml:lang="cs">video OGM</comment>
+ <comment xml:lang="ca">vídeo OGM</comment>
+ <comment xml:lang="bg">Видео — OGM</comment>
+ <comment xml:lang="be@latin">Videa OGM</comment>
+ <comment xml:lang="be">відэа OGM</comment>
+ <comment xml:lang="ast">Videu n'OGM</comment>
+ <comment xml:lang="ar">فيديو OGM</comment>
+ <comment xml:lang="af">OGM-video</comment>
<sub-class-of type="video/ogg"/>
<alias type="video/x-ogm"/>
<magic priority="80">
@@ -18212,383 +19192,488 @@ command to generate the output files.
extensions for these -->
<mime-type type="application/x-ole-storage">
<comment>OLE2 compound document storage</comment>
- <comment xml:lang="ar">تخزين مجمع مستند OLE2</comment>
- <comment xml:lang="ast">Almacenamientu de documentos compuestu por OLE2</comment>
- <comment xml:lang="be-Latn">Schovišča dla kampanentaŭ dakumentu OLE2</comment>
- <comment xml:lang="bg">Съставен документ-хранилище — OLE2</comment>
- <comment xml:lang="ca">emmagatzematge de documents compostos OLE2</comment>
- <comment xml:lang="cs">úložiště složeného dokumentu OLE2</comment>
- <comment xml:lang="da">OLE2-sammensat dokumentlager</comment>
- <comment xml:lang="de">OLE2-Verbunddokumentenspeicher</comment>
- <comment xml:lang="el">Αρχείο συμπαγούς αποθήκευσης εγγράφων OLE2</comment>
- <comment xml:lang="en-GB">OLE2 compound document storage</comment>
- <comment xml:lang="eo">OLE2-deponejo de parentezaj dokumentoj</comment>
- <comment xml:lang="es">almacenamiento de documentos compuestos OLE2</comment>
- <comment xml:lang="eu">OLE2 konposatutako dokumentu-bilduma</comment>
- <comment xml:lang="fi">OLE2-yhdisteasiakirjatallenne</comment>
- <comment xml:lang="fo">OLE2 samansett skjalagoymsla</comment>
- <comment xml:lang="fr">document de stockage composé OLE2</comment>
- <comment xml:lang="fur">memorizazion document compost OLE2</comment>
- <comment xml:lang="ga">stóras cáipéisí comhshuite OLE2</comment>
- <comment xml:lang="gl">almacenamento de documento composto OLE2</comment>
- <comment xml:lang="he">אחסון מסמך משותף OLE2</comment>
- <comment xml:lang="hr">OLE2 pohrana složenog dokumenta</comment>
- <comment xml:lang="hu">OLE2 összetett dokumentumtároló</comment>
- <comment xml:lang="ia">Magazin de documentos composite OLE2</comment>
- <comment xml:lang="id">Penyimpan dokumen kompon OLE2</comment>
- <comment xml:lang="it">Memorizzazione documento composto OLE2</comment>
- <comment xml:lang="ja">OLE2 複合ドキュメントストレージ</comment>
- <comment xml:lang="kk">OLE2 құрама құжаттар қоймасы</comment>
- <comment xml:lang="ko">OLE2 복합 문서</comment>
- <comment xml:lang="lt">OLE2 sudėtinių dokumentų laikmena</comment>
- <comment xml:lang="lv">OLE2 savienoto dokumentu glabātuve</comment>
- <comment xml:lang="ms">Storan dokumen halaman OLE2</comment>
- <comment xml:lang="nb">OLE-lager for sammensatte dokumenter</comment>
- <comment xml:lang="nl">OLE2-samengestelde documentopslag</comment>
- <comment xml:lang="nn">OLE2 lager for samansett dokument</comment>
- <comment xml:lang="oc">document d'emmagazinatge compausat OLE2</comment>
- <comment xml:lang="pl">Magazyn dokumentu złożonego OLE2</comment>
- <comment xml:lang="pt">armazenamento de documento composto OLE2</comment>
- <comment xml:lang="pt-BR">Armazenamento de documento composto OLE2</comment>
- <comment xml:lang="ro">Document de stocare compus OLE2</comment>
- <comment xml:lang="ru">Хранилище составных документов OLE2</comment>
- <comment xml:lang="sk">Úložisko zloženého dokumentu OLE2</comment>
- <comment xml:lang="sl">Združeni dokument OLE2</comment>
- <comment xml:lang="sq">Arkiv dokumenti i përbërë OLE2</comment>
- <comment xml:lang="sr">смештај ОЛЕ2 сједињеног документа</comment>
- <comment xml:lang="sv">Sammansatt OLE2-dokumentlager</comment>
- <comment xml:lang="tr">OLE2 bileşik belge depolama</comment>
- <comment xml:lang="uk">сховище складних документів OLE2</comment>
+ <comment xml:lang="zh_TW">OLE2 複合文件儲存</comment>
+ <comment xml:lang="zh_CN">OLE2 组合文档存储</comment>
<comment xml:lang="vi">Kho lưu tài liệu ghép OLE2</comment>
- <comment xml:lang="zh-CN">OLE2 组合文档存储</comment>
- <comment xml:lang="zh-TW">OLE2 複合文件儲存</comment>
+ <comment xml:lang="uk">сховище складних документів OLE2</comment>
+ <comment xml:lang="tr">OLE2 bileşik belge depolama</comment>
+ <comment xml:lang="sv">Sammansatt OLE2-dokumentlager</comment>
+ <comment xml:lang="sr">смештај ОЛЕ2 сједињеног документа</comment>
+ <comment xml:lang="sq">depozitë dokumenti të përbërë OLE2</comment>
+ <comment xml:lang="sl">Združeni dokument OLE2</comment>
+ <comment xml:lang="si">OLE2 සංයුක්ත ලේඛන ගබඩා කිරීම</comment>
+ <comment xml:lang="sk">Úložisko zloženého dokumentu OLE2</comment>
+ <comment xml:lang="ru">Хранилище составных документов OLE2</comment>
+ <comment xml:lang="ro">Document de stocare compus OLE2</comment>
+ <comment xml:lang="pt_BR">Armazenamento de documento composto OLE2</comment>
+ <comment xml:lang="pt">armazenamento de documento composto OLE2</comment>
+ <comment xml:lang="pl">Magazyn dokumentu złożonego OLE2</comment>
+ <comment xml:lang="oc">document d'emmagazinatge compausat OLE2</comment>
+ <comment xml:lang="nn">OLE2 lager for samansett dokument</comment>
+ <comment xml:lang="nl">OLE2-samengestelde documentopslag</comment>
+ <comment xml:lang="nb">OLE-lager for sammensatte dokumenter</comment>
+ <comment xml:lang="ms">Storan dokumen halaman OLE2</comment>
+ <comment xml:lang="lv">OLE2 savienoto dokumentu glabātuve</comment>
+ <comment xml:lang="lt">OLE2 sudėtinių dokumentų laikmena</comment>
+ <comment xml:lang="ko">OLE2 복합 문서</comment>
+ <comment xml:lang="kk">OLE2 құрама құжаттар қоймасы</comment>
+ <comment xml:lang="ja">OLE2 複合ドキュメントストレージ</comment>
+ <comment xml:lang="it">Memorizzazione documento composto OLE2</comment>
+ <comment xml:lang="is">OLE2 samsett skjalageymsla</comment>
+ <comment xml:lang="id">Penyimpan dokumen kompon OLE2</comment>
+ <comment xml:lang="ia">Magazin de documentos composite OLE2</comment>
+ <comment xml:lang="hu">OLE2 összetett dokumentumtároló</comment>
+ <comment xml:lang="hr">OLE2 pohrana složenog dokumenta</comment>
+ <comment xml:lang="he">אחסון מסמך משותף OLE2</comment>
+ <comment xml:lang="gl">almacenamento de documento composto OLE2</comment>
+ <comment xml:lang="ga">stóras cáipéisí comhshuite OLE2</comment>
+ <comment xml:lang="fur">memorizazion document compost OLE2</comment>
+ <comment xml:lang="fr">document de stockage composé OLE2</comment>
+ <comment xml:lang="fo">OLE2 samansett skjalagoymsla</comment>
+ <comment xml:lang="fi">OLE2-yhdisteasiakirjatallenne</comment>
+ <comment xml:lang="eu">OLE2 konposatutako dokumentu-bilduma</comment>
+ <comment xml:lang="es">almacenamiento de documentos compuestos OLE2</comment>
+ <comment xml:lang="eo">OLE2-deponejo de parentezaj dokumentoj</comment>
+ <comment xml:lang="en_GB">OLE2 compound document storage</comment>
+ <comment xml:lang="el">Αρχείο συμπαγούς αποθήκευσης εγγράφων OLE2</comment>
+ <comment xml:lang="de">OLE2-Verbunddokumentspeicher</comment>
+ <comment xml:lang="da">OLE2-sammensat dokumentlager</comment>
+ <comment xml:lang="cs">úložiště složeného dokumentu OLE2</comment>
+ <comment xml:lang="ca">emmagatzematge de documents compostos OLE2</comment>
+ <comment xml:lang="bg">Съставен документ-хранилище — OLE2</comment>
+ <comment xml:lang="be@latin">Schovišča dla kampanentaŭ dakumentu OLE2</comment>
+ <comment xml:lang="be">сховішча складаных дакументаў OLE2</comment>
+ <comment xml:lang="ast">Almacenamientu de documentos compuestu por OLE2</comment>
+ <comment xml:lang="ar">تخزين مجمع مستند OLE2</comment>
<generic-icon name="x-office-document"/>
- <magic priority="50">
+ <magic>
<match type="string" value="\320\317\021\340\241\261\032\341" offset="0"/>
<match type="little32" value="0xe011cfd0" offset="0"/>
</magic>
</mime-type>
+ <mime-type type="application/vnd.microsoft.windows.thumbnail-cache">
+ <comment>Microsoft Windows Thumbnail Cache</comment>
+ <comment xml:lang="uk">кеш мініатюр Microsoft Windows</comment>
+ <comment xml:lang="sv">Microsoft Windows-miniatyrbildscache</comment>
+ <comment xml:lang="ru">Кэш миниатюр Microsoft Windows</comment>
+ <comment xml:lang="pl">Pamięć podręczna miniatur Microsoft Windows</comment>
+ <comment xml:lang="it">Cache miniuature Microsoft Windows</comment>
+ <comment xml:lang="eu">Microsoft Windows miniatura-cachea</comment>
+ <comment xml:lang="es">antememoria de miniaturas de Microsoft Windows</comment>
+ <comment xml:lang="de">Microsoft Windows-Vorschaubilderzwischenspeicher</comment>
+ <comment xml:lang="be">пакет тэмы Microsoft Windows</comment>
+ <sub-class-of type="application/x-ole-storage"/>
+ <generic-icon name="image-x-generic"/>
+ <glob pattern="ehthumbs.db"/>
+ <glob pattern="ehthumbs_vista.db"/>
+ <glob pattern="image.db"/>
+ <glob pattern="musicthumbs.db"/>
+ <glob pattern="thumbs.db"/>
+ <glob pattern="tvthumb.db"/>
+ <glob pattern="video.db"/>
+ </mime-type>
<mime-type type="application/vnd.ms-publisher">
<comment>Microsoft Publisher document</comment>
- <comment xml:lang="af">Microsoft Publisher-dokument</comment>
- <comment xml:lang="ast">Documentu de Microsoft Publisher</comment>
- <comment xml:lang="bg">Документ — Microsoft Publisher</comment>
- <comment xml:lang="ca">document de Microsoft Publisher</comment>
- <comment xml:lang="cs">dokument Microsoft Publisher</comment>
- <comment xml:lang="da">Microsoft Publisher-dokument</comment>
- <comment xml:lang="de">Microsoft-Publisher-Dokument</comment>
- <comment xml:lang="el">Έγγραφο Microsoft Publisher</comment>
- <comment xml:lang="en-GB">Microsoft Publisher document</comment>
- <comment xml:lang="es">documento de Microsoft Publisher</comment>
- <comment xml:lang="eu">Microsoft Publisher dokumentua</comment>
- <comment xml:lang="fi">Microsoft Publisher -asiakirja</comment>
- <comment xml:lang="fr">document Microsoft Publisher</comment>
- <comment xml:lang="fur">document Microsoft Publisher</comment>
- <comment xml:lang="ga">cáipéis Microsoft Publisher</comment>
- <comment xml:lang="gl">Documento de Microsoft Publisher</comment>
- <comment xml:lang="he">מסמך Microsoft Publisher</comment>
- <comment xml:lang="hr">Microsoft Publisher dokument</comment>
- <comment xml:lang="hu">Microsoft Publisher dokumentum</comment>
- <comment xml:lang="ia">Documento Microsoft Publisher</comment>
- <comment xml:lang="id">Dokumen Microsoft Publisher</comment>
- <comment xml:lang="it">Documento Microsoft Publisher</comment>
- <comment xml:lang="kk">Microsoft Publisher құжаты</comment>
- <comment xml:lang="ko">Microsoft Publisher 문서</comment>
- <comment xml:lang="oc">document Microsoft Publisher</comment>
- <comment xml:lang="pl">Dokument Microsoft Publisher</comment>
- <comment xml:lang="pt">documento Microsoft Publisher</comment>
- <comment xml:lang="pt-BR">Documento do Microsoft Publisher</comment>
- <comment xml:lang="ru">Документ Microsoft Publisher</comment>
- <comment xml:lang="sk">Dokument Microsoft Publisher</comment>
- <comment xml:lang="sl">Dokument Microsoft Publisher</comment>
- <comment xml:lang="sr">документ Мајкрософтовог Издавача</comment>
- <comment xml:lang="sv">Microsoft Publisher-dokument</comment>
- <comment xml:lang="tr">Microsoft Publisher belgesi</comment>
+ <comment xml:lang="zh_TW">微軟 Publisher 文件</comment>
+ <comment xml:lang="zh_CN">Microsoft Publisher 文档</comment>
<comment xml:lang="uk">документ Microsoft Publisher</comment>
- <comment xml:lang="zh-CN">Microsoft Publisher 文档</comment>
- <comment xml:lang="zh-TW">微軟 Publisher 文件</comment>
+ <comment xml:lang="tr">Microsoft Publisher belgesi</comment>
+ <comment xml:lang="sv">Microsoft Publisher-dokument</comment>
+ <comment xml:lang="sr">документ Мајкрософтовог Издавача</comment>
+ <comment xml:lang="sq">dokument Microsoft Publisher</comment>
+ <comment xml:lang="sl">Dokument Microsoft Publisher</comment>
+ <comment xml:lang="si">Microsoft Publisher ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument Microsoft Publisher</comment>
+ <comment xml:lang="ru">Документ Microsoft Publisher</comment>
+ <comment xml:lang="pt_BR">Documento do Microsoft Publisher</comment>
+ <comment xml:lang="pt">documento Microsoft Publisher</comment>
+ <comment xml:lang="pl">Dokument Microsoft Publisher</comment>
+ <comment xml:lang="oc">document Microsoft Publisher</comment>
+ <comment xml:lang="nl">Microsoft Publisher-document</comment>
+ <comment xml:lang="ko">Microsoft Publisher 문서</comment>
+ <comment xml:lang="kk">Microsoft Publisher құжаты</comment>
+ <comment xml:lang="ja">Microsoft Publisher ドキュメント</comment>
+ <comment xml:lang="it">Documento Microsoft Publisher</comment>
+ <comment xml:lang="is">Microsoft Publisher skjal</comment>
+ <comment xml:lang="id">Dokumen Microsoft Publisher</comment>
+ <comment xml:lang="ia">Documento Microsoft Publisher</comment>
+ <comment xml:lang="hu">Microsoft Publisher dokumentum</comment>
+ <comment xml:lang="hr">Microsoft Publisher dokument</comment>
+ <comment xml:lang="he">מסמך Microsoft Publisher</comment>
+ <comment xml:lang="gl">Documento de Microsoft Publisher</comment>
+ <comment xml:lang="ga">cáipéis Microsoft Publisher</comment>
+ <comment xml:lang="fur">document Microsoft Publisher</comment>
+ <comment xml:lang="fr">document Microsoft Publisher</comment>
+ <comment xml:lang="fi">Microsoft Publisher -asiakirja</comment>
+ <comment xml:lang="eu">Microsoft Publisher dokumentua</comment>
+ <comment xml:lang="es">documento de Microsoft Publisher</comment>
+ <comment xml:lang="en_GB">Microsoft Publisher document</comment>
+ <comment xml:lang="el">Έγγραφο Microsoft Publisher</comment>
+ <comment xml:lang="de">Microsoft-Publisher-Dokument</comment>
+ <comment xml:lang="da">Microsoft Publisher-dokument</comment>
+ <comment xml:lang="cs">dokument Microsoft Publisher</comment>
+ <comment xml:lang="ca">document de Microsoft Publisher</comment>
+ <comment xml:lang="bg">Документ — Microsoft Publisher</comment>
+ <comment xml:lang="be">дакумент Microsoft Publisher</comment>
+ <comment xml:lang="ast">Documentu de Microsoft Publisher</comment>
+ <comment xml:lang="ar">مستند ناشر مايكروسوفت</comment>
+ <comment xml:lang="af">Microsoft Publisher-dokument</comment>
<sub-class-of type="application/x-ole-storage"/>
<glob pattern="*.pub"/>
</mime-type>
<mime-type type="application/x-msi">
<comment>Windows Installer package</comment>
- <comment xml:lang="af">Windows-installeerpakket</comment>
- <comment xml:lang="ar">حزمة مثبّت ويندوز</comment>
- <comment xml:lang="be-Latn">Pakunak Windows Installer</comment>
- <comment xml:lang="bg">Пакет — инсталация за Windows</comment>
- <comment xml:lang="ca">paquet de Windows Installer</comment>
- <comment xml:lang="cs">balíček Windows Installer</comment>
- <comment xml:lang="da">Windows installationsprogram-pakke</comment>
- <comment xml:lang="de">Windows-Installationspaket</comment>
- <comment xml:lang="el">Πακέτο Windows Installer</comment>
- <comment xml:lang="en-GB">Windows Installer package</comment>
- <comment xml:lang="es">paquete de instalación de Windows</comment>
- <comment xml:lang="eu">Windows-eko pakete instalatzailea</comment>
- <comment xml:lang="fi">Windows-asennuspaketti</comment>
- <comment xml:lang="fo">Windows innleggingarpakki</comment>
- <comment xml:lang="fr">paquet d'installation Windows</comment>
- <comment xml:lang="fur">pachet Windows Installer</comment>
- <comment xml:lang="ga">pacáiste Windows Installer</comment>
- <comment xml:lang="gl">paquete de instalación de Windows</comment>
- <comment xml:lang="he">חבילה של Windows Installer</comment>
- <comment xml:lang="hr">Windows Instalacijski paket</comment>
- <comment xml:lang="hu">Windows Installer csomag</comment>
- <comment xml:lang="ia">Pacchetto Windows Installer</comment>
- <comment xml:lang="id">Paket Windows Installer</comment>
- <comment xml:lang="it">Pacchetto Windows Installer</comment>
- <comment xml:lang="ja">Windows インストーラパッケージ</comment>
- <comment xml:lang="kk">Windows Installer дестесі</comment>
- <comment xml:lang="ko">Windows 설치 패키지</comment>
- <comment xml:lang="lt">Windows Installer paketas</comment>
- <comment xml:lang="lv">Windows Installer pakotne</comment>
- <comment xml:lang="nl">Windows-installatiepakket</comment>
- <comment xml:lang="nn">Windows Installer-pakke</comment>
- <comment xml:lang="oc">paquet d'installacion Windows</comment>
- <comment xml:lang="pl">Pakiet instalatora Windows</comment>
- <comment xml:lang="pt">pacote de instalação Windows</comment>
- <comment xml:lang="pt-BR">Pacote do Windows Installer</comment>
- <comment xml:lang="ro">Pachet instalator Windows</comment>
- <comment xml:lang="ru">Пакет Windows Installer</comment>
- <comment xml:lang="sk">Balík Windows Installer</comment>
- <comment xml:lang="sl">Datoteka paketa Windows namestilnika</comment>
- <comment xml:lang="sq">Paketë Windows Installer</comment>
- <comment xml:lang="sr">пакет Виндоузовог инсталатера</comment>
- <comment xml:lang="sv">Windows Installer-paket</comment>
- <comment xml:lang="tr">Windows Installer paketi</comment>
- <comment xml:lang="uk">пакунок Windows Installer</comment>
+ <comment xml:lang="zh_TW">Windows Installer 軟體包</comment>
+ <comment xml:lang="zh_CN">Windows 程序安装包</comment>
<comment xml:lang="vi">Gói cài đặt Windows</comment>
- <comment xml:lang="zh-CN">Windows 程序安装包</comment>
- <comment xml:lang="zh-TW">Windows Installer 軟體包</comment>
+ <comment xml:lang="uk">пакунок Windows Installer</comment>
+ <comment xml:lang="tr">Windows Installer paketi</comment>
+ <comment xml:lang="sv">Windows Installer-paket</comment>
+ <comment xml:lang="sr">пакет Виндоузовог инсталатера</comment>
+ <comment xml:lang="sq">paketë Windows Installer</comment>
+ <comment xml:lang="sl">Datoteka paketa Windows namestilnika</comment>
+ <comment xml:lang="si">වින්ඩෝස් ස්ථාපක පැකේජය</comment>
+ <comment xml:lang="sk">Balík Windows Installer</comment>
+ <comment xml:lang="ru">Пакет Windows Installer</comment>
+ <comment xml:lang="ro">Pachet instalator Windows</comment>
+ <comment xml:lang="pt_BR">Pacote do Windows Installer</comment>
+ <comment xml:lang="pt">pacote de instalação Windows</comment>
+ <comment xml:lang="pl">Pakiet instalatora Windows</comment>
+ <comment xml:lang="oc">paquet d'installacion Windows</comment>
+ <comment xml:lang="nn">Windows Installer-pakke</comment>
+ <comment xml:lang="nl">Windows-installatiepakket</comment>
+ <comment xml:lang="lv">Windows Installer pakotne</comment>
+ <comment xml:lang="lt">Windows Installer paketas</comment>
+ <comment xml:lang="ko">Windows 설치 패키지</comment>
+ <comment xml:lang="kk">Windows Installer дестесі</comment>
+ <comment xml:lang="ja">Windows インストーラパッケージ</comment>
+ <comment xml:lang="it">Pacchetto Windows Installer</comment>
+ <comment xml:lang="is">Windows uppsetningarpakki</comment>
+ <comment xml:lang="id">Paket Windows Installer</comment>
+ <comment xml:lang="ia">Pacchetto Windows Installer</comment>
+ <comment xml:lang="hu">Windows Installer csomag</comment>
+ <comment xml:lang="hr">Windows Instalacijski paket</comment>
+ <comment xml:lang="he">חבילה של Windows Installer</comment>
+ <comment xml:lang="gl">paquete de instalación de Windows</comment>
+ <comment xml:lang="ga">pacáiste Windows Installer</comment>
+ <comment xml:lang="fur">pachet Windows Installer</comment>
+ <comment xml:lang="fr">paquet d'installation Windows</comment>
+ <comment xml:lang="fo">Windows innleggingarpakki</comment>
+ <comment xml:lang="fi">Windows-asennuspaketti</comment>
+ <comment xml:lang="eu">Windows-eko pakete instalatzailea</comment>
+ <comment xml:lang="es">paquete de instalación de Windows</comment>
+ <comment xml:lang="en_GB">Windows Installer package</comment>
+ <comment xml:lang="el">Πακέτο Windows Installer</comment>
+ <comment xml:lang="de">Windows-Installationspaket</comment>
+ <comment xml:lang="da">Windows installationsprogram-pakke</comment>
+ <comment xml:lang="cs">balíček Windows Installer</comment>
+ <comment xml:lang="ca">paquet de Windows Installer</comment>
+ <comment xml:lang="bg">Пакет — инсталация за Windows</comment>
+ <comment xml:lang="be@latin">Pakunak Windows Installer</comment>
+ <comment xml:lang="be">пакет Windows Installer</comment>
+ <comment xml:lang="ar">حزمة مثبّت ويندوز</comment>
+ <comment xml:lang="af">Windows-installeerpakket</comment>
<sub-class-of type="application/x-ole-storage"/>
+ <generic-icon name="package-x-generic"/>
<glob pattern="*.msi"/>
</mime-type>
+ <mime-type type="application/appx">
+ <comment>Windows app store package</comment>
+ <comment xml:lang="uk">пакунок крамниці програм Windows</comment>
+ <comment xml:lang="sv">Windows app store-paket</comment>
+ <comment xml:lang="ru">Пакет магазина приложений Windows</comment>
+ <comment xml:lang="pl">Pakiet sklepu z aplikacjami Windows</comment>
+ <comment xml:lang="es">paquete de la tienda de aplicaciones de Windows</comment>
+ <comment xml:lang="de">Windows-Appstore-Paket</comment>
+ <sub-class-of type="application/zip"/>
+ <generic-icon name="package-x-generic"/>
+ <glob pattern="*.appx"/>
+ </mime-type>
+ <mime-type type="application/msix">
+ <comment>Windows app store package</comment>
+ <comment xml:lang="uk">пакунок крамниці програм Windows</comment>
+ <comment xml:lang="sv">Windows app store-paket</comment>
+ <comment xml:lang="ru">Пакет магазина приложений Windows</comment>
+ <comment xml:lang="pl">Pakiet sklepu z aplikacjami Windows</comment>
+ <comment xml:lang="es">paquete de la tienda de aplicaciones de Windows</comment>
+ <comment xml:lang="de">Windows-Appstore-Paket</comment>
+ <sub-class-of type="application/zip"/>
+ <generic-icon name="package-x-generic"/>
+ <glob pattern="*.msix"/>
+ </mime-type>
+ <mime-type type="application/appxbundle">
+ <comment>Windows app store bundle</comment>
+ <comment xml:lang="uk">комплект крамниці програм Windows</comment>
+ <comment xml:lang="sv">Windows app store-bunt</comment>
+ <comment xml:lang="ru">Объединённый пакет магазина приложений Windows</comment>
+ <comment xml:lang="pl">Paczka sklepu z aplikacjami Windows</comment>
+ <comment xml:lang="de">Zusammengefasste Windows-Appstore-Pakete</comment>
+ <sub-class-of type="application/zip"/>
+ <generic-icon name="package-x-generic"/>
+ <glob pattern="*.appxbundle"/>
+ </mime-type>
+ <mime-type type="application/msixbundle">
+ <comment>Windows app store bundle</comment>
+ <comment xml:lang="uk">комплект крамниці програм Windows</comment>
+ <comment xml:lang="sv">Windows app store-bunt</comment>
+ <comment xml:lang="ru">Объединённый пакет магазина приложений Windows</comment>
+ <comment xml:lang="pl">Paczka sklepu z aplikacjami Windows</comment>
+ <comment xml:lang="de">Zusammengefasste Windows-Appstore-Pakete</comment>
+ <sub-class-of type="application/zip"/>
+ <generic-icon name="package-x-generic"/>
+ <glob pattern="*.msixbundle"/>
+ </mime-type>
+ <mime-type type="application/appinstaller">
+ <comment>Windows app store installer</comment>
+ <comment xml:lang="uk">встановлювач крамниці програм Windows</comment>
+ <comment xml:lang="sv">Windows app store-installerare</comment>
+ <comment xml:lang="ru">Программа установки магазина приложений Windows</comment>
+ <comment xml:lang="pl">Instalator sklepu z aplikacjami Windows</comment>
+ <comment xml:lang="es">instalador de la tienda de aplicaciones de Windows</comment>
+ <comment xml:lang="de">Windows-Appstore-Installationsprogramm</comment>
+ <sub-class-of type="application/xml"/>
+ <generic-icon name="package-x-generic"/>
+ <magic>
+ <match type="string" value="&lt;AppInstaller" offset="0:256"/>
+ </magic>
+ <glob pattern="*.appinstaller"/>
+ </mime-type>
<mime-type type="application/x-oleo">
<comment>GNU Oleo spreadsheet</comment>
- <comment xml:lang="af">GNU Oleo-sigblad</comment>
- <comment xml:lang="ar">جدول جنو Oleo</comment>
- <comment xml:lang="be-Latn">Raźlikovy arkuš GNU Oleo</comment>
- <comment xml:lang="bg">Таблица — GNU Oleo</comment>
- <comment xml:lang="ca">full de càlcul de GNU Oleo</comment>
- <comment xml:lang="cs">sešit GNU Oleo</comment>
- <comment xml:lang="da">GNU Oleo-regneark</comment>
- <comment xml:lang="de">GNU-Oleo-Tabelle</comment>
- <comment xml:lang="el">Λογιστικό φύλλο GNU Oleo</comment>
- <comment xml:lang="en-GB">GNU Oleo spreadsheet</comment>
- <comment xml:lang="eo">Kalkultabelo de GNU Oleo</comment>
- <comment xml:lang="es">hoja de cálculo de GNU Oleo</comment>
- <comment xml:lang="eu">GNU Oleo kalkulu-orria</comment>
- <comment xml:lang="fi">GNU Oleo -taulukko</comment>
- <comment xml:lang="fo">GNU Oleo rokniark</comment>
- <comment xml:lang="fr">feuille de calcul GNU Oleo</comment>
- <comment xml:lang="fur">sfuei di calcul GNU Oleo</comment>
- <comment xml:lang="ga">scarbhileog GNU Oleo</comment>
- <comment xml:lang="gl">folla de cálculo de Oleo GNU</comment>
- <comment xml:lang="he">גליון נתונים של GNU Oleo</comment>
- <comment xml:lang="hr">GNU Oleo proračunska tablica</comment>
- <comment xml:lang="hu">GNU Oleo-munkafüzet</comment>
- <comment xml:lang="ia">Folio de calculo GNU Oleo</comment>
- <comment xml:lang="id">Lembar sebar GNU Oleo</comment>
- <comment xml:lang="it">Foglio di calcolo GNU Oleo</comment>
- <comment xml:lang="ja">GNU Oleo スプレッドシート</comment>
- <comment xml:lang="ka">GNU Oleo ცხრილი</comment>
- <comment xml:lang="kk">GNU Oleo электрондық кестесі</comment>
- <comment xml:lang="ko">GNU Oleo 스프레드시트</comment>
- <comment xml:lang="lt">GNU Oleo skaičialentė</comment>
- <comment xml:lang="lv">GNU Oleo izklājlapa</comment>
- <comment xml:lang="ms">Hamparan GNU Oleo</comment>
- <comment xml:lang="nb">GNU Oleo regneark</comment>
- <comment xml:lang="nl">GNU Oleo-rekenblad</comment>
- <comment xml:lang="nn">GNU Oleo-rekneark</comment>
- <comment xml:lang="oc">fuèlh de calcul GNU Oleo</comment>
- <comment xml:lang="pl">Arkusz GNU Oleo</comment>
- <comment xml:lang="pt">folha de cálculo GNU Oleo</comment>
- <comment xml:lang="pt-BR">Planilha do GNU Oleo</comment>
- <comment xml:lang="ro">Foaie de calcul GNU Oleo</comment>
- <comment xml:lang="ru">Электронная таблица GNU Oleo</comment>
- <comment xml:lang="sk">Zošit GNU Oleo</comment>
- <comment xml:lang="sl">Preglednica GNU Oleo</comment>
- <comment xml:lang="sq">Fletë llogaritje GNU Oleo</comment>
- <comment xml:lang="sr">ГНУ Олео табела</comment>
- <comment xml:lang="sv">GNU Oleo-kalkylblad</comment>
- <comment xml:lang="tr">GNU Oleo hesap çizelgesi</comment>
- <comment xml:lang="uk">ел. таблиця GNU Oleo</comment>
+ <comment xml:lang="zh_TW">GNU Oleo 試算表</comment>
+ <comment xml:lang="zh_CN">GNU Oleo 电子表格</comment>
<comment xml:lang="vi">Bảng tính Oleo của GNU</comment>
- <comment xml:lang="zh-CN">GNU Oleo 电子表格</comment>
- <comment xml:lang="zh-TW">GNU Oleo 試算表</comment>
+ <comment xml:lang="uk">електронна таблиця GNU Oleo</comment>
+ <comment xml:lang="tr">GNU Oleo hesap çizelgesi</comment>
+ <comment xml:lang="sv">GNU Oleo-kalkylblad</comment>
+ <comment xml:lang="sr">ГНУ Олео табела</comment>
+ <comment xml:lang="sq">fletëllogaritje GNU Oleo</comment>
+ <comment xml:lang="sl">Preglednica GNU Oleo</comment>
+ <comment xml:lang="si">GNU Oleo පැතුරුම්පත</comment>
+ <comment xml:lang="sk">Zošit GNU Oleo</comment>
+ <comment xml:lang="ru">Электронная таблица GNU Oleo</comment>
+ <comment xml:lang="ro">Foaie de calcul GNU Oleo</comment>
+ <comment xml:lang="pt_BR">Planilha do GNU Oleo</comment>
+ <comment xml:lang="pt">folha de cálculo GNU Oleo</comment>
+ <comment xml:lang="pl">Arkusz GNU Oleo</comment>
+ <comment xml:lang="oc">fuèlh de calcul GNU Oleo</comment>
+ <comment xml:lang="nn">GNU Oleo-rekneark</comment>
+ <comment xml:lang="nl">GNU Oleo-rekenblad</comment>
+ <comment xml:lang="nb">GNU Oleo regneark</comment>
+ <comment xml:lang="ms">Hamparan GNU Oleo</comment>
+ <comment xml:lang="lv">GNU Oleo izklājlapa</comment>
+ <comment xml:lang="lt">GNU Oleo skaičialentė</comment>
+ <comment xml:lang="ko">GNU Oleo 스프레드시트</comment>
+ <comment xml:lang="kk">GNU Oleo электрондық кестесі</comment>
+ <comment xml:lang="ka">GNU Oleo ცხრილი</comment>
+ <comment xml:lang="ja">GNU Oleo スプレッドシート</comment>
+ <comment xml:lang="it">Foglio di calcolo GNU Oleo</comment>
+ <comment xml:lang="is">GNU Oleo töflureikniskjal</comment>
+ <comment xml:lang="id">Lembar sebar GNU Oleo</comment>
+ <comment xml:lang="ia">Folio de calculo GNU Oleo</comment>
+ <comment xml:lang="hu">GNU Oleo-munkafüzet</comment>
+ <comment xml:lang="hr">GNU Oleo proračunska tablica</comment>
+ <comment xml:lang="he">גיליון נתונים של GNU Oleo</comment>
+ <comment xml:lang="gl">folla de cálculo de Oleo GNU</comment>
+ <comment xml:lang="ga">scarbhileog GNU Oleo</comment>
+ <comment xml:lang="fur">sfuei di calcul GNU Oleo</comment>
+ <comment xml:lang="fr">feuille de calcul GNU Oleo</comment>
+ <comment xml:lang="fo">GNU Oleo rokniark</comment>
+ <comment xml:lang="fi">GNU Oleo -taulukko</comment>
+ <comment xml:lang="eu">GNU Oleo kalkulu-orria</comment>
+ <comment xml:lang="es">hoja de cálculo de GNU Oleo</comment>
+ <comment xml:lang="eo">Kalkultabelo de GNU Oleo</comment>
+ <comment xml:lang="en_GB">GNU Oleo spreadsheet</comment>
+ <comment xml:lang="el">Λογιστικό φύλλο GNU Oleo</comment>
+ <comment xml:lang="de">GNU-Oleo-Tabelle</comment>
+ <comment xml:lang="da">GNU Oleo-regneark</comment>
+ <comment xml:lang="cs">sešit GNU Oleo</comment>
+ <comment xml:lang="ca">full de càlcul de GNU Oleo</comment>
+ <comment xml:lang="bg">Таблица — GNU Oleo</comment>
+ <comment xml:lang="be@latin">Raźlikovy arkuš GNU Oleo</comment>
+ <comment xml:lang="be">электронная табліца GNU Oleo</comment>
+ <comment xml:lang="ar">جدول جنو Oleo</comment>
+ <comment xml:lang="af">GNU Oleo-sigblad</comment>
<generic-icon name="x-office-spreadsheet"/>
- <magic priority="50">
+ <magic>
<match type="string" value="Oleo" offset="31"/>
</magic>
<glob pattern="*.oleo"/>
</mime-type>
<mime-type type="application/x-pak">
<comment>PAK archive</comment>
- <comment xml:lang="af">PAK-argief</comment>
- <comment xml:lang="ar">أرشيف PAK</comment>
- <comment xml:lang="be-Latn">Archiŭ PAK</comment>
- <comment xml:lang="bg">Архив — PAK</comment>
- <comment xml:lang="ca">arxiu PAK</comment>
- <comment xml:lang="cs">archiv PAK</comment>
- <comment xml:lang="da">PAK-arkiv</comment>
- <comment xml:lang="de">PAK-Archiv</comment>
- <comment xml:lang="el">Συμπιεσμένο αρχείο PAK</comment>
- <comment xml:lang="en-GB">PAK archive</comment>
- <comment xml:lang="eo">PAK-arkivo</comment>
- <comment xml:lang="es">archivador PAK</comment>
- <comment xml:lang="eu">PAK artxiboa</comment>
- <comment xml:lang="fi">PAK-arkisto</comment>
- <comment xml:lang="fo">PAK skjalasavn</comment>
- <comment xml:lang="fr">archive PAK</comment>
- <comment xml:lang="fur">archivi PAK</comment>
- <comment xml:lang="ga">cartlann PAK</comment>
- <comment xml:lang="gl">arquivo PAK</comment>
- <comment xml:lang="he">ארכיון PAK</comment>
- <comment xml:lang="hr">PAK arhiva</comment>
- <comment xml:lang="hu">PAK-archívum</comment>
- <comment xml:lang="ia">Archivo PAK</comment>
- <comment xml:lang="id">Arsip PAK</comment>
- <comment xml:lang="it">Archivio PAK</comment>
- <comment xml:lang="ja">PAK アーカイブ</comment>
- <comment xml:lang="ka">PAK არქივი</comment>
- <comment xml:lang="kk">PAK архиві</comment>
- <comment xml:lang="ko">PAK 압축 파일</comment>
- <comment xml:lang="lt">PAK archyvas</comment>
- <comment xml:lang="lv">PAK arhīvs</comment>
- <comment xml:lang="nb">PAK-arkiv</comment>
- <comment xml:lang="nl">PAK-archief</comment>
- <comment xml:lang="nn">PAK-arkiv</comment>
- <comment xml:lang="oc">archiu PAK</comment>
- <comment xml:lang="pl">Archiwum PAK</comment>
- <comment xml:lang="pt">arquivo PAK</comment>
- <comment xml:lang="pt-BR">Pacote PAK</comment>
- <comment xml:lang="ro">Arhivă PAK</comment>
- <comment xml:lang="ru">Архив PAK</comment>
- <comment xml:lang="sk">Archív PAK</comment>
- <comment xml:lang="sl">Datoteka arhiva PAK</comment>
- <comment xml:lang="sq">Arkiv PAK</comment>
- <comment xml:lang="sr">ПАК архива</comment>
- <comment xml:lang="sv">PAK-arkiv</comment>
- <comment xml:lang="tr">PAK arşivi</comment>
- <comment xml:lang="uk">архів PAK</comment>
+ <comment xml:lang="zh_TW">PAK 封存檔</comment>
+ <comment xml:lang="zh_CN">PAK 归档文件</comment>
<comment xml:lang="vi">Kho nén PAK</comment>
- <comment xml:lang="zh-CN">PAK 归档文件</comment>
- <comment xml:lang="zh-TW">PAK 封存檔</comment>
+ <comment xml:lang="uk">архів PAK</comment>
+ <comment xml:lang="tr">PAK arşivi</comment>
+ <comment xml:lang="sv">PAK-arkiv</comment>
+ <comment xml:lang="sr">ПАК архива</comment>
+ <comment xml:lang="sq">arkiv PAK</comment>
+ <comment xml:lang="sl">Datoteka arhiva PAK</comment>
+ <comment xml:lang="si">PAK ලේඛනාගාරය</comment>
+ <comment xml:lang="sk">Archív PAK</comment>
+ <comment xml:lang="ru">Архив PAK</comment>
+ <comment xml:lang="ro">Arhivă PAK</comment>
+ <comment xml:lang="pt_BR">Pacote PAK</comment>
+ <comment xml:lang="pt">arquivo PAK</comment>
+ <comment xml:lang="pl">Archiwum PAK</comment>
+ <comment xml:lang="oc">archiu PAK</comment>
+ <comment xml:lang="nn">PAK-arkiv</comment>
+ <comment xml:lang="nl">PAK-archief</comment>
+ <comment xml:lang="nb">PAK-arkiv</comment>
+ <comment xml:lang="lv">PAK arhīvs</comment>
+ <comment xml:lang="lt">PAK archyvas</comment>
+ <comment xml:lang="ko">PAK 압축 파일</comment>
+ <comment xml:lang="kk">PAK архиві</comment>
+ <comment xml:lang="ka">PAK არქივი</comment>
+ <comment xml:lang="ja">PAK アーカイブ</comment>
+ <comment xml:lang="it">Archivio PAK</comment>
+ <comment xml:lang="is">PAK safnskrá</comment>
+ <comment xml:lang="id">Arsip PAK</comment>
+ <comment xml:lang="ia">Archivo PAK</comment>
+ <comment xml:lang="hu">PAK-archívum</comment>
+ <comment xml:lang="hr">PAK arhiva</comment>
+ <comment xml:lang="he">ארכיון PAK</comment>
+ <comment xml:lang="gl">arquivo PAK</comment>
+ <comment xml:lang="ga">cartlann PAK</comment>
+ <comment xml:lang="fur">archivi PAK</comment>
+ <comment xml:lang="fr">archive PAK</comment>
+ <comment xml:lang="fo">PAK skjalasavn</comment>
+ <comment xml:lang="fi">PAK-arkisto</comment>
+ <comment xml:lang="eu">PAK artxiboa</comment>
+ <comment xml:lang="es">archivador PAK</comment>
+ <comment xml:lang="eo">PAK-arkivo</comment>
+ <comment xml:lang="en_GB">PAK archive</comment>
+ <comment xml:lang="el">Συμπιεσμένο αρχείο PAK</comment>
+ <comment xml:lang="de">PAK-Archiv</comment>
+ <comment xml:lang="da">PAK-arkiv</comment>
+ <comment xml:lang="cs">archiv PAK</comment>
+ <comment xml:lang="ca">arxiu PAK</comment>
+ <comment xml:lang="bg">Архив — PAK</comment>
+ <comment xml:lang="be@latin">Archiŭ PAK</comment>
+ <comment xml:lang="be">архіў PAK</comment>
+ <comment xml:lang="ar">أرشيف PAK</comment>
+ <comment xml:lang="af">PAK-argief</comment>
<generic-icon name="package-x-generic"/>
- <magic priority="80">
- <match offset="0" type="string" value="PACK"/>
- </magic>
<glob pattern="*.pak"/>
</mime-type>
<mime-type type="application/vnd.palm">
<comment>Palm OS database</comment>
- <comment xml:lang="af">Palm OS-databasis</comment>
- <comment xml:lang="ar">قاعدة بيانات Palm OS</comment>
- <comment xml:lang="az">Palm OS mə'lumat bazası</comment>
- <comment xml:lang="be-Latn">Baza źviestak Palm OS</comment>
- <comment xml:lang="bg">База от данни — Palm OS</comment>
- <comment xml:lang="ca">base de dades Palm OS</comment>
- <comment xml:lang="cs">databáze Palm OS</comment>
- <comment xml:lang="cy">Cronfa Ddata Palm OS</comment>
- <comment xml:lang="da">Palm OS-database</comment>
- <comment xml:lang="de">Palm-OS-Datenbank</comment>
- <comment xml:lang="el">Βάση δεδομένων Palm OS</comment>
- <comment xml:lang="en-GB">Palm OS database</comment>
- <comment xml:lang="eo">datumbazo de Palm OS</comment>
- <comment xml:lang="es">base de datos de Palm OS</comment>
- <comment xml:lang="eu">Palm OS datu-basea</comment>
- <comment xml:lang="fi">Palm OS -tietokanta</comment>
- <comment xml:lang="fo">Palm OS dátustovnur</comment>
- <comment xml:lang="fr">base de données Palm OS</comment>
- <comment xml:lang="fur">base di dâts Palm OS</comment>
- <comment xml:lang="ga">bunachar sonraí Palm OS</comment>
- <comment xml:lang="gl">base de datos de Palm OS</comment>
- <comment xml:lang="he">מסד נתונים של Palm OS</comment>
- <comment xml:lang="hr">Palm OS baza podataka</comment>
- <comment xml:lang="hu">Palm OS-adatbázis</comment>
- <comment xml:lang="ia">Base de datos Palm OS</comment>
- <comment xml:lang="id">Basis data Palm OS</comment>
- <comment xml:lang="it">Database Palm OS</comment>
- <comment xml:lang="ja">Palm OS データベース</comment>
- <comment xml:lang="kk">Palm OS дерекқоры</comment>
- <comment xml:lang="ko">Palm OS 데이터베이스</comment>
- <comment xml:lang="lt">Palm OS duomenų bazė</comment>
- <comment xml:lang="lv">Palm OS datubāze</comment>
- <comment xml:lang="ms">Pangkalandata PalmOS</comment>
- <comment xml:lang="nb">Palm OS-database</comment>
- <comment xml:lang="nl">Palm OS-gegevensbank</comment>
- <comment xml:lang="nn">Palm OS-database</comment>
- <comment xml:lang="oc">banca de donadas Palm OS</comment>
- <comment xml:lang="pl">Baza danych Palm OS</comment>
- <comment xml:lang="pt">base de dados Palm OS</comment>
- <comment xml:lang="pt-BR">Banco de dados do Palm OS</comment>
- <comment xml:lang="ro">Bază de date Palm OS</comment>
- <comment xml:lang="ru">База данных Palm OS</comment>
- <comment xml:lang="sk">Databáza Palm OS</comment>
- <comment xml:lang="sl">Podatkovna zbirka Palm OS</comment>
- <comment xml:lang="sq">Bankë me të dhëna Palm OS</comment>
- <comment xml:lang="sr">база података Палм ОС-а</comment>
- <comment xml:lang="sv">Palm OS-databas</comment>
- <comment xml:lang="tr">Palm OS veri tabanı</comment>
- <comment xml:lang="uk">база даних Palm OS</comment>
+ <comment xml:lang="zh_TW">Palm OS 資料庫</comment>
+ <comment xml:lang="zh_CN">Palm OS 数据库</comment>
<comment xml:lang="vi">Cơ sở dữ liệu PalmOS</comment>
- <comment xml:lang="zh-CN">Palm OS 数据库</comment>
- <comment xml:lang="zh-TW">Palm OS 資料庫</comment>
+ <comment xml:lang="uk">база даних Palm OS</comment>
+ <comment xml:lang="tr">Palm OS veri tabanı</comment>
+ <comment xml:lang="sv">Palm OS-databas</comment>
+ <comment xml:lang="sr">база података Палм ОС-а</comment>
+ <comment xml:lang="sq">bazë të dhënash Palm OS</comment>
+ <comment xml:lang="sl">Podatkovna zbirka Palm OS</comment>
+ <comment xml:lang="si">Palm OS දත්ත ගබඩාව</comment>
+ <comment xml:lang="sk">Databáza Palm OS</comment>
+ <comment xml:lang="ru">База данных Palm OS</comment>
+ <comment xml:lang="ro">Bază de date Palm OS</comment>
+ <comment xml:lang="pt_BR">Banco de dados do Palm OS</comment>
+ <comment xml:lang="pt">base de dados Palm OS</comment>
+ <comment xml:lang="pl">Baza danych Palm OS</comment>
+ <comment xml:lang="oc">banca de donadas Palm OS</comment>
+ <comment xml:lang="nn">Palm OS-database</comment>
+ <comment xml:lang="nl">Palm OS-database</comment>
+ <comment xml:lang="nb">Palm OS-database</comment>
+ <comment xml:lang="ms">Pangkalandata PalmOS</comment>
+ <comment xml:lang="lv">Palm OS datubāze</comment>
+ <comment xml:lang="lt">Palm OS duomenų bazė</comment>
+ <comment xml:lang="ko">Palm OS 데이터베이스</comment>
+ <comment xml:lang="kk">Palm OS дерекқоры</comment>
+ <comment xml:lang="ja">Palm OS データベース</comment>
+ <comment xml:lang="it">Database Palm OS</comment>
+ <comment xml:lang="is">Palm OS gagnagrunnur</comment>
+ <comment xml:lang="id">Basis data Palm OS</comment>
+ <comment xml:lang="ia">Base de datos Palm OS</comment>
+ <comment xml:lang="hu">Palm OS-adatbázis</comment>
+ <comment xml:lang="hr">Palm OS baza podataka</comment>
+ <comment xml:lang="he">מסד נתונים של Palm OS</comment>
+ <comment xml:lang="gl">base de datos de Palm OS</comment>
+ <comment xml:lang="ga">bunachar sonraí Palm OS</comment>
+ <comment xml:lang="fur">base di dâts Palm OS</comment>
+ <comment xml:lang="fr">base de données Palm OS</comment>
+ <comment xml:lang="fo">Palm OS dátustovnur</comment>
+ <comment xml:lang="fi">Palm OS -tietokanta</comment>
+ <comment xml:lang="eu">Palm OS datu-basea</comment>
+ <comment xml:lang="es">base de datos de Palm OS</comment>
+ <comment xml:lang="eo">datumbazo de Palm OS</comment>
+ <comment xml:lang="en_GB">Palm OS database</comment>
+ <comment xml:lang="el">Βάση δεδομένων Palm OS</comment>
+ <comment xml:lang="de">Palm-OS-Datenbank</comment>
+ <comment xml:lang="da">Palm OS-database</comment>
+ <comment xml:lang="cy">Cronfa Ddata Palm OS</comment>
+ <comment xml:lang="cs">databáze Palm OS</comment>
+ <comment xml:lang="ca">base de dades Palm OS</comment>
+ <comment xml:lang="bg">База от данни — Palm OS</comment>
+ <comment xml:lang="be@latin">Baza źviestak Palm OS</comment>
+ <comment xml:lang="be">база даных Palm OS</comment>
+ <comment xml:lang="az">Palm OS mə'lumat bazası</comment>
+ <comment xml:lang="ar">قاعدة بيانات Palm OS</comment>
+ <comment xml:lang="af">Palm OS-databasis</comment>
<glob pattern="*.prc"/>
- <glob pattern="*.pdb"/>
+ <glob pattern="*.pdb" weight="40"/>
<glob pattern="*.pqa"/>
<glob pattern="*.oprc"/>
<alias type="application/x-palm-database"/>
</mime-type>
<mime-type type="application/x-par2">
<comment>Parchive archive</comment>
- <comment xml:lang="af">Parchive-argief</comment>
- <comment xml:lang="ar">أرشيف Parchive</comment>
- <comment xml:lang="be-Latn">Archiŭ Parchive</comment>
- <comment xml:lang="bg">Архив — parchive</comment>
- <comment xml:lang="ca">arxiu Parchive</comment>
- <comment xml:lang="cs">archiv Parchive</comment>
- <comment xml:lang="da">Parchive-arkiv</comment>
- <comment xml:lang="de">Parchive-Archiv</comment>
- <comment xml:lang="el">Συμπιεσμένο αρχείο Parchive</comment>
- <comment xml:lang="en-GB">Parchive archive</comment>
- <comment xml:lang="es">archivador Parchive</comment>
- <comment xml:lang="eu">Parchive artxiboa</comment>
- <comment xml:lang="fi">Parchive-arkisto</comment>
- <comment xml:lang="fo">Parchive skjalasavn</comment>
- <comment xml:lang="fr">archive Parchive</comment>
- <comment xml:lang="fur">archivi Parchive</comment>
- <comment xml:lang="ga">cartlann Parchive</comment>
- <comment xml:lang="gl">arquivo Parchive</comment>
- <comment xml:lang="he">ארכיון של Parchive</comment>
- <comment xml:lang="hr">Parchive arhiva</comment>
- <comment xml:lang="hu">Parchive archívum</comment>
- <comment xml:lang="ia">Archivo Parchive</comment>
- <comment xml:lang="id">Arsip Parchive</comment>
- <comment xml:lang="it">Archivio Parchive</comment>
- <comment xml:lang="ja">Parchive アーカイブ</comment>
- <comment xml:lang="kk">Parchive архиві</comment>
- <comment xml:lang="ko">Parchive 압축 파일</comment>
- <comment xml:lang="lt">Parchive archyvas</comment>
- <comment xml:lang="lv">Parchive arhīvs</comment>
- <comment xml:lang="nb">Parchive-arkiv</comment>
- <comment xml:lang="nl">Parchive-archief</comment>
- <comment xml:lang="nn">Parchive-arkiv</comment>
- <comment xml:lang="oc">archiu Parchive</comment>
- <comment xml:lang="pl">Archiwum parchive</comment>
- <comment xml:lang="pt">arquivo Parchive</comment>
- <comment xml:lang="pt-BR">Pacote Parchive</comment>
- <comment xml:lang="ro">Arhivă Parchive</comment>
- <comment xml:lang="ru">Архив Parchive</comment>
- <comment xml:lang="sk">Archív Parchive</comment>
- <comment xml:lang="sl">Datoteka arhiva Parchive</comment>
- <comment xml:lang="sq">Arkiv Parchive</comment>
- <comment xml:lang="sr">архива Пархива</comment>
- <comment xml:lang="sv">Parchive-arkiv</comment>
- <comment xml:lang="tr">Parchive arşivi</comment>
- <comment xml:lang="uk">архів Parchive</comment>
+ <comment xml:lang="zh_TW">Parchive 封存檔</comment>
+ <comment xml:lang="zh_CN">Parchive 归档文件</comment>
<comment xml:lang="vi">Kho nén Parchive</comment>
- <comment xml:lang="zh-CN">Parchive 归档文件</comment>
- <comment xml:lang="zh-TW">Parchive 封存檔</comment>
+ <comment xml:lang="uk">архів Parchive</comment>
+ <comment xml:lang="tr">Parchive arşivi</comment>
+ <comment xml:lang="sv">Parchive-arkiv</comment>
+ <comment xml:lang="sr">архива Пархива</comment>
+ <comment xml:lang="sq">arkiv Parchive</comment>
+ <comment xml:lang="sl">Datoteka arhiva Parchive</comment>
+ <comment xml:lang="si">Parchive ලේඛනාගාරය</comment>
+ <comment xml:lang="sk">Archív Parchive</comment>
+ <comment xml:lang="ru">Архив Parchive</comment>
+ <comment xml:lang="ro">Arhivă Parchive</comment>
+ <comment xml:lang="pt_BR">Pacote Parchive</comment>
+ <comment xml:lang="pt">arquivo Parchive</comment>
+ <comment xml:lang="pl">Archiwum parchive</comment>
+ <comment xml:lang="oc">archiu Parchive</comment>
+ <comment xml:lang="nn">Parchive-arkiv</comment>
+ <comment xml:lang="nl">Parchive-archief</comment>
+ <comment xml:lang="nb">Parchive-arkiv</comment>
+ <comment xml:lang="lv">Parchive arhīvs</comment>
+ <comment xml:lang="lt">Parchive archyvas</comment>
+ <comment xml:lang="ko">Parchive 압축 파일</comment>
+ <comment xml:lang="kk">Parchive архиві</comment>
+ <comment xml:lang="ja">Parchive アーカイブ</comment>
+ <comment xml:lang="it">Archivio Parchive</comment>
+ <comment xml:lang="is">Parchive safnskrá</comment>
+ <comment xml:lang="id">Arsip Parchive</comment>
+ <comment xml:lang="ia">Archivo Parchive</comment>
+ <comment xml:lang="hu">Parchive archívum</comment>
+ <comment xml:lang="hr">Parchive arhiva</comment>
+ <comment xml:lang="he">ארכיון של Parchive</comment>
+ <comment xml:lang="gl">arquivo Parchive</comment>
+ <comment xml:lang="ga">cartlann Parchive</comment>
+ <comment xml:lang="fur">archivi Parchive</comment>
+ <comment xml:lang="fr">archive Parchive</comment>
+ <comment xml:lang="fo">Parchive skjalasavn</comment>
+ <comment xml:lang="fi">Parchive-arkisto</comment>
+ <comment xml:lang="eu">Parchive artxiboa</comment>
+ <comment xml:lang="es">archivador Parchive</comment>
+ <comment xml:lang="en_GB">Parchive archive</comment>
+ <comment xml:lang="el">Συμπιεσμένο αρχείο Parchive</comment>
+ <comment xml:lang="de">Parchive-Archiv</comment>
+ <comment xml:lang="da">Parchive-arkiv</comment>
+ <comment xml:lang="cs">archiv Parchive</comment>
+ <comment xml:lang="ca">arxiu Parchive</comment>
+ <comment xml:lang="bg">Архив — parchive</comment>
+ <comment xml:lang="be@latin">Archiŭ Parchive</comment>
+ <comment xml:lang="be">архіў Parchive</comment>
+ <comment xml:lang="ar">أرشيف Parchive</comment>
+ <comment xml:lang="af">Parchive-argief</comment>
<acronym>Parchive</acronym>
<expanded-acronym>Parity Volume Set Archive</expanded-acronym>
<generic-icon name="package-x-generic"/>
@@ -18600,124 +19685,131 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-pef-executable">
<comment>PEF executable</comment>
- <comment xml:lang="af">PEF-uitvoerbaar</comment>
- <comment xml:lang="ar">PEF تنفيذي</comment>
- <comment xml:lang="be-Latn">Vykonvalny fajł PEF</comment>
- <comment xml:lang="bg">Изпълним файл — PEF</comment>
- <comment xml:lang="ca">executable PEF</comment>
- <comment xml:lang="cs">spustitelný soubor PEF</comment>
- <comment xml:lang="da">PEF-kørbar</comment>
- <comment xml:lang="de">PEF-Programm</comment>
- <comment xml:lang="el">Εκτελέσιμο PEF</comment>
- <comment xml:lang="en-GB">PEF executable</comment>
- <comment xml:lang="eo">PEF-plenumebla</comment>
- <comment xml:lang="es">ejecutable PEF</comment>
- <comment xml:lang="eu">PEF exekutagarria</comment>
- <comment xml:lang="fi">PEF-ohjelma</comment>
- <comment xml:lang="fo">PEF inningarfør</comment>
- <comment xml:lang="fr">exécutable PEF</comment>
- <comment xml:lang="fur">eseguibil PEF</comment>
- <comment xml:lang="ga">comhad inrite PEF</comment>
- <comment xml:lang="gl">Executábel PEF</comment>
- <comment xml:lang="he">קובץ הרצה PEF</comment>
- <comment xml:lang="hr">PEF izvršna datoteka</comment>
- <comment xml:lang="hu">PEF futtatható</comment>
- <comment xml:lang="ia">Executabile PEF</comment>
- <comment xml:lang="id">PEF dapat dieksekusi</comment>
- <comment xml:lang="it">Eseguibile PEF</comment>
- <comment xml:lang="ja">PEF 実行ファイル</comment>
- <comment xml:lang="kk">PEF орындалатын файлы</comment>
- <comment xml:lang="ko">PEF 실행 파일</comment>
- <comment xml:lang="lt">PEF vykdomasis failas</comment>
- <comment xml:lang="lv">PEF izpildāmais</comment>
- <comment xml:lang="ms">Bolehlaksana PEF</comment>
- <comment xml:lang="nb">PEF-kjørbar</comment>
- <comment xml:lang="nl">PEF-uitvoerbaar bestand</comment>
- <comment xml:lang="nn">Køyrbar PEF-fil</comment>
- <comment xml:lang="oc">executable PEF</comment>
- <comment xml:lang="pl">Program PEF</comment>
- <comment xml:lang="pt">executável PEF</comment>
- <comment xml:lang="pt-BR">Executável PEF</comment>
- <comment xml:lang="ro">Executabil PEF</comment>
- <comment xml:lang="ru">Исполняемый файл PEF</comment>
- <comment xml:lang="sk">Spustiteľný súbor PEF</comment>
- <comment xml:lang="sl">Izvedljiva datoteka PEF</comment>
- <comment xml:lang="sq">E ekzekutueshme PEF</comment>
- <comment xml:lang="sr">ПЕФ извршна</comment>
- <comment xml:lang="sv">Körbar PEF-fil</comment>
- <comment xml:lang="tr">PEF çalıştırılabilir</comment>
- <comment xml:lang="uk">виконуваний файл PEF</comment>
+ <comment xml:lang="zh_TW">PEF 可執行檔</comment>
+ <comment xml:lang="zh_CN">PEF 可执行文件</comment>
<comment xml:lang="vi">Tập tin thực hiện được PEF</comment>
- <comment xml:lang="zh-CN">PEF 可执行文件</comment>
- <comment xml:lang="zh-TW">PEF 可執行檔</comment>
+ <comment xml:lang="uk">виконуваний файл PEF</comment>
+ <comment xml:lang="tr">PEF çalıştırılabilir</comment>
+ <comment xml:lang="sv">Körbar PEF-fil</comment>
+ <comment xml:lang="sr">ПЕФ извршна</comment>
+ <comment xml:lang="sq">e ekzekutueshme PEF</comment>
+ <comment xml:lang="sl">Izvedljiva datoteka PEF</comment>
+ <comment xml:lang="si">PEF ක්‍රියාත්මක කළ හැකිය</comment>
+ <comment xml:lang="sk">Spustiteľný súbor PEF</comment>
+ <comment xml:lang="ru">Исполняемый файл PEF</comment>
+ <comment xml:lang="ro">Executabil PEF</comment>
+ <comment xml:lang="pt_BR">Executável PEF</comment>
+ <comment xml:lang="pt">executável PEF</comment>
+ <comment xml:lang="pl">Program PEF</comment>
+ <comment xml:lang="oc">executable PEF</comment>
+ <comment xml:lang="nn">Køyrbar PEF-fil</comment>
+ <comment xml:lang="nl">PEF-programmabestand</comment>
+ <comment xml:lang="nb">PEF-kjørbar</comment>
+ <comment xml:lang="ms">Bolehlaksana PEF</comment>
+ <comment xml:lang="lv">PEF izpildāmais</comment>
+ <comment xml:lang="lt">PEF vykdomasis failas</comment>
+ <comment xml:lang="ko">PEF 실행 파일</comment>
+ <comment xml:lang="kk">PEF орындалатын файлы</comment>
+ <comment xml:lang="ja">PEF 実行ファイル</comment>
+ <comment xml:lang="it">Eseguibile PEF</comment>
+ <comment xml:lang="is">PEF keyrsluskrá</comment>
+ <comment xml:lang="id">PEF dapat dieksekusi</comment>
+ <comment xml:lang="ia">Executabile PEF</comment>
+ <comment xml:lang="hu">PEF futtatható</comment>
+ <comment xml:lang="hr">PEF izvršna datoteka</comment>
+ <comment xml:lang="he">קובץ הרצה PEF</comment>
+ <comment xml:lang="gl">Executábel PEF</comment>
+ <comment xml:lang="ga">comhad inrite PEF</comment>
+ <comment xml:lang="fur">eseguibil PEF</comment>
+ <comment xml:lang="fr">exécutable PEF</comment>
+ <comment xml:lang="fo">PEF inningarfør</comment>
+ <comment xml:lang="fi">PEF-ohjelma</comment>
+ <comment xml:lang="eu">PEF exekutagarria</comment>
+ <comment xml:lang="es">ejecutable PEF</comment>
+ <comment xml:lang="eo">PEF-plenumebla</comment>
+ <comment xml:lang="en_GB">PEF executable</comment>
+ <comment xml:lang="el">Εκτελέσιμο PEF</comment>
+ <comment xml:lang="de">PEF-Programm</comment>
+ <comment xml:lang="da">PEF-kørbar</comment>
+ <comment xml:lang="cs">spustitelný soubor PEF</comment>
+ <comment xml:lang="ca">executable PEF</comment>
+ <comment xml:lang="bg">Изпълним файл — PEF</comment>
+ <comment xml:lang="be@latin">Vykonvalny fajł PEF</comment>
+ <comment xml:lang="be">выконвальны файл PEF</comment>
+ <comment xml:lang="ar">PEF تنفيذي</comment>
+ <comment xml:lang="af">PEF-uitvoerbaar</comment>
+ <acronym>PEF</acronym>
+ <expanded-acronym>Preferred Executable Format</expanded-acronym>
<generic-icon name="application-x-executable"/>
- <magic priority="50">
+ <magic>
<match type="string" value="Joy!" offset="0"/>
</magic>
</mime-type>
<mime-type type="application/x-perl">
<comment>Perl script</comment>
- <comment xml:lang="af">Perl-skrip</comment>
- <comment xml:lang="ar">سكربت بيرل</comment>
- <comment xml:lang="be-Latn">Skrypt Perl</comment>
- <comment xml:lang="bg">Скрипт — Perl</comment>
- <comment xml:lang="ca">script Perl</comment>
- <comment xml:lang="cs">skript v Perlu</comment>
- <comment xml:lang="cy">Sgript Perl</comment>
- <comment xml:lang="da">Perl-program</comment>
- <comment xml:lang="de">Perl-Skript</comment>
- <comment xml:lang="el">Δέσμη ενεργειών Perl</comment>
- <comment xml:lang="en-GB">Perl script</comment>
- <comment xml:lang="eo">Perl-skripto</comment>
- <comment xml:lang="es">secuencia de órdenes en Perl</comment>
- <comment xml:lang="eu">Perl script-a</comment>
- <comment xml:lang="fi">Perl-komentotiedosto</comment>
- <comment xml:lang="fo">Perl boðrøð</comment>
- <comment xml:lang="fr">script Perl</comment>
- <comment xml:lang="fur">script Perl</comment>
- <comment xml:lang="ga">script Perl</comment>
- <comment xml:lang="gl">Script de Perl</comment>
- <comment xml:lang="he">תסריט מעטפת של Perl</comment>
- <comment xml:lang="hr">Perl skripta</comment>
- <comment xml:lang="hu">Perl-parancsfájl</comment>
- <comment xml:lang="ia">Script Perl</comment>
- <comment xml:lang="id">Skrip Perl</comment>
- <comment xml:lang="it">Script Perl</comment>
- <comment xml:lang="ja">Perl スクリプト</comment>
- <comment xml:lang="kk">Perl сценарийі</comment>
- <comment xml:lang="ko">펄 스크립트</comment>
- <comment xml:lang="lt">Perl scenarijus</comment>
- <comment xml:lang="lv">Perl skripts</comment>
- <comment xml:lang="ms">Skrip Perl</comment>
- <comment xml:lang="nb">Perl skript</comment>
- <comment xml:lang="nl">Perl-script</comment>
- <comment xml:lang="nn">Perl-skript</comment>
- <comment xml:lang="oc">escript Perl</comment>
- <comment xml:lang="pl">Skrypt Perl</comment>
- <comment xml:lang="pt">script Perl</comment>
- <comment xml:lang="pt-BR">Script Perl</comment>
- <comment xml:lang="ro">Script Perl</comment>
- <comment xml:lang="ru">Сценарий Perl</comment>
- <comment xml:lang="sk">Skript jazyka Perl</comment>
- <comment xml:lang="sl">Skriptna datoteka Perl</comment>
- <comment xml:lang="sq">Script Perl</comment>
- <comment xml:lang="sr">Перл скрипта</comment>
- <comment xml:lang="sv">Perlskript</comment>
- <comment xml:lang="tr">Perl betiği</comment>
- <comment xml:lang="uk">скрипт на Perl</comment>
+ <comment xml:lang="zh_TW">Perl 指令稿</comment>
+ <comment xml:lang="zh_CN">Perl 脚本</comment>
<comment xml:lang="vi">Văn lệnh Perl</comment>
- <comment xml:lang="zh-CN">Perl 脚本</comment>
- <comment xml:lang="zh-TW">Perl 指令稿</comment>
+ <comment xml:lang="uk">скрипт на Perl</comment>
+ <comment xml:lang="tr">Perl betiği</comment>
+ <comment xml:lang="sv">Perlskript</comment>
+ <comment xml:lang="sr">Перл скрипта</comment>
+ <comment xml:lang="sq">programth Perl</comment>
+ <comment xml:lang="sl">Skriptna datoteka Perl</comment>
+ <comment xml:lang="si">පර්ල් පිටපත</comment>
+ <comment xml:lang="sk">Skript jazyka Perl</comment>
+ <comment xml:lang="ru">Сценарий Perl</comment>
+ <comment xml:lang="ro">Script Perl</comment>
+ <comment xml:lang="pt_BR">Script Perl</comment>
+ <comment xml:lang="pt">script Perl</comment>
+ <comment xml:lang="pl">Skrypt Perl</comment>
+ <comment xml:lang="oc">escript Perl</comment>
+ <comment xml:lang="nn">Perl-skript</comment>
+ <comment xml:lang="nl">Perl-script</comment>
+ <comment xml:lang="nb">Perl skript</comment>
+ <comment xml:lang="ms">Skrip Perl</comment>
+ <comment xml:lang="lv">Perl skripts</comment>
+ <comment xml:lang="lt">Perl scenarijus</comment>
+ <comment xml:lang="ko">펄 스크립트</comment>
+ <comment xml:lang="kk">Perl сценарийі</comment>
+ <comment xml:lang="ja">Perl スクリプト</comment>
+ <comment xml:lang="it">Script Perl</comment>
+ <comment xml:lang="is">Perl skrifta</comment>
+ <comment xml:lang="id">Skrip Perl</comment>
+ <comment xml:lang="ia">Script Perl</comment>
+ <comment xml:lang="hu">Perl-parancsfájl</comment>
+ <comment xml:lang="hr">Perl skripta</comment>
+ <comment xml:lang="he">תסריט מעטפת של Perl</comment>
+ <comment xml:lang="gl">Script de Perl</comment>
+ <comment xml:lang="ga">script Perl</comment>
+ <comment xml:lang="fur">script Perl</comment>
+ <comment xml:lang="fr">script Perl</comment>
+ <comment xml:lang="fo">Perl boðrøð</comment>
+ <comment xml:lang="fi">Perl-komentotiedosto</comment>
+ <comment xml:lang="eu">Perl script-a</comment>
+ <comment xml:lang="es">secuencia de órdenes en Perl</comment>
+ <comment xml:lang="eo">Perl-skripto</comment>
+ <comment xml:lang="en_GB">Perl script</comment>
+ <comment xml:lang="el">Δέσμη ενεργειών Perl</comment>
+ <comment xml:lang="de">Perl-Skript</comment>
+ <comment xml:lang="da">Perl-program</comment>
+ <comment xml:lang="cy">Sgript Perl</comment>
+ <comment xml:lang="cs">skript v Perlu</comment>
+ <comment xml:lang="ca">script Perl</comment>
+ <comment xml:lang="bg">Скрипт — Perl</comment>
+ <comment xml:lang="be@latin">Skrypt Perl</comment>
+ <comment xml:lang="be">скрыпт Perl</comment>
+ <comment xml:lang="ar">سكربت بيرل</comment>
+ <comment xml:lang="af">Perl-skrip</comment>
<sub-class-of type="application/x-executable"/>
<sub-class-of type="text/plain"/>
<generic-icon name="text-x-script"/>
<alias type="text/x-perl"/>
- <magic priority="50">
+ <magic>
<match type="string" value="eval \&quot;exec /usr/local/bin/perl" offset="0"/>
<match type="string" value="/bin/perl" offset="2:16"/>
<match type="string" value="/bin/env perl" offset="2:16"/>
<match type="string" value="use Test::" offset="0:256"/>
- <match type="string" value="BEGIN {" offset="0:256"/>
</magic>
<magic priority="40">
<match type="string" value="use strict" offset="0:256"/>
@@ -18726,69 +19818,78 @@ command to generate the output files.
<match type="string" value="\n=pod" offset="0:256"/>
<match type="string" value="\n=head1 NAME" offset="0:256"/>
<match type="string" value="\n=head1 DESCRIPTION" offset="0:256"/>
+ <match type="string" value="BEGIN {" offset="0:256"/>
</magic>
<glob pattern="*.pl"/>
- <glob pattern="*.PL"/><!-- CPAN-style Perl build script -->
- <glob pattern="*.pm"/><!-- module -->
- <glob pattern="*.al"/><!-- autoloader -->
+ <glob pattern="*.PL"/>
+ <!-- CPAN-style Perl build script -->
+ <glob pattern="*.pm"/>
+ <!-- module -->
+ <glob pattern="*.al"/>
+ <!-- autoloader -->
<glob pattern="*.perl"/>
- <glob pattern="*.pod"/><!-- documentation -->
- <glob pattern="*.t" weight="10"/><!-- CPAN-style Perl test script -->
+ <glob pattern="*.pod"/>
+ <!-- documentation -->
+ <glob pattern="*.t" weight="10"/>
+ <!-- CPAN-style Perl test script -->
</mime-type>
<mime-type type="application/x-php">
<comment>PHP script</comment>
- <comment xml:lang="af">PHP-skrip</comment>
- <comment xml:lang="ar">سكربت PHP</comment>
- <comment xml:lang="az">PHP skripti</comment>
- <comment xml:lang="be-Latn">Skrypt PHP</comment>
- <comment xml:lang="bg">Скрипт — PHP</comment>
- <comment xml:lang="ca">script PHP</comment>
- <comment xml:lang="cs">skript PHP</comment>
- <comment xml:lang="cy">Sgript PHP</comment>
- <comment xml:lang="da">PHP-program</comment>
- <comment xml:lang="de">PHP-Skript</comment>
- <comment xml:lang="el">Δέσμη ενεργειών PHP</comment>
- <comment xml:lang="en-GB">PHP script</comment>
- <comment xml:lang="eo">PHP-skripto</comment>
- <comment xml:lang="es">secuencia de órdenes en PHP</comment>
- <comment xml:lang="eu">PHP script-a</comment>
- <comment xml:lang="fi">PHP-komentotiedosto</comment>
- <comment xml:lang="fo">PHP boðrøð</comment>
- <comment xml:lang="fr">script PHP</comment>
- <comment xml:lang="fur">script PHP</comment>
- <comment xml:lang="ga">script PHP</comment>
- <comment xml:lang="gl">Script de PHP</comment>
- <comment xml:lang="he">תסריט מעטפת של PHP</comment>
- <comment xml:lang="hr">PHP skripta</comment>
- <comment xml:lang="hu">PHP-parancsfájl</comment>
- <comment xml:lang="ia">Script PHP</comment>
- <comment xml:lang="id">Skrip PHP</comment>
- <comment xml:lang="it">Script PHP</comment>
- <comment xml:lang="ja">PHP スクリプト</comment>
- <comment xml:lang="kk">PHP сценарийі</comment>
- <comment xml:lang="ko">PHP 스크립트</comment>
- <comment xml:lang="lt">PHP scenarijus</comment>
- <comment xml:lang="lv">PHP skripts</comment>
- <comment xml:lang="ms">Skrip PHP</comment>
- <comment xml:lang="nb">PHP-skript</comment>
- <comment xml:lang="nl">PHP-script</comment>
- <comment xml:lang="nn">PHP-skript</comment>
- <comment xml:lang="oc">escript PHP</comment>
- <comment xml:lang="pl">Skrypt PHP</comment>
- <comment xml:lang="pt">script PHP</comment>
- <comment xml:lang="pt-BR">Script PHP</comment>
- <comment xml:lang="ro">Script PHP</comment>
- <comment xml:lang="ru">Сценарий PHP</comment>
- <comment xml:lang="sk">Skript PHP</comment>
- <comment xml:lang="sl">Skriptna datoteka PHP</comment>
- <comment xml:lang="sq">Script PHP</comment>
- <comment xml:lang="sr">ПХП скрипта</comment>
- <comment xml:lang="sv">PHP-skript</comment>
- <comment xml:lang="tr">PHP betiği</comment>
- <comment xml:lang="uk">скрипт PHP</comment>
+ <comment xml:lang="zh_TW">PHP 指令稿</comment>
+ <comment xml:lang="zh_CN">PHP 脚本</comment>
<comment xml:lang="vi">Văn lệnh PHP</comment>
- <comment xml:lang="zh-CN">PHP 脚本</comment>
- <comment xml:lang="zh-TW">PHP 指令稿</comment>
+ <comment xml:lang="uk">скрипт PHP</comment>
+ <comment xml:lang="tr">PHP betiği</comment>
+ <comment xml:lang="sv">PHP-skript</comment>
+ <comment xml:lang="sr">ПХП скрипта</comment>
+ <comment xml:lang="sq">programth PHP</comment>
+ <comment xml:lang="sl">Skriptna datoteka PHP</comment>
+ <comment xml:lang="si">PHP ස්ක්‍රිප්ට්</comment>
+ <comment xml:lang="sk">Skript PHP</comment>
+ <comment xml:lang="ru">Сценарий PHP</comment>
+ <comment xml:lang="ro">Script PHP</comment>
+ <comment xml:lang="pt_BR">Script PHP</comment>
+ <comment xml:lang="pt">script PHP</comment>
+ <comment xml:lang="pl">Skrypt PHP</comment>
+ <comment xml:lang="oc">escript PHP</comment>
+ <comment xml:lang="nn">PHP-skript</comment>
+ <comment xml:lang="nl">PHP-script</comment>
+ <comment xml:lang="nb">PHP-skript</comment>
+ <comment xml:lang="ms">Skrip PHP</comment>
+ <comment xml:lang="lv">PHP skripts</comment>
+ <comment xml:lang="lt">PHP scenarijus</comment>
+ <comment xml:lang="ko">PHP 스크립트</comment>
+ <comment xml:lang="kk">PHP сценарийі</comment>
+ <comment xml:lang="ja">PHP スクリプト</comment>
+ <comment xml:lang="it">Script PHP</comment>
+ <comment xml:lang="is">PHP skrifta</comment>
+ <comment xml:lang="id">Skrip PHP</comment>
+ <comment xml:lang="ia">Script PHP</comment>
+ <comment xml:lang="hu">PHP-parancsfájl</comment>
+ <comment xml:lang="hr">PHP skripta</comment>
+ <comment xml:lang="he">תסריט מעטפת של PHP</comment>
+ <comment xml:lang="gl">Script de PHP</comment>
+ <comment xml:lang="ga">script PHP</comment>
+ <comment xml:lang="fur">script PHP</comment>
+ <comment xml:lang="fr">script PHP</comment>
+ <comment xml:lang="fo">PHP boðrøð</comment>
+ <comment xml:lang="fi">PHP-komentotiedosto</comment>
+ <comment xml:lang="eu">PHP script-a</comment>
+ <comment xml:lang="es">secuencia de órdenes en PHP</comment>
+ <comment xml:lang="eo">PHP-skripto</comment>
+ <comment xml:lang="en_GB">PHP script</comment>
+ <comment xml:lang="el">Δέσμη ενεργειών PHP</comment>
+ <comment xml:lang="de">PHP-Skript</comment>
+ <comment xml:lang="da">PHP-program</comment>
+ <comment xml:lang="cy">Sgript PHP</comment>
+ <comment xml:lang="cs">skript PHP</comment>
+ <comment xml:lang="ca">script PHP</comment>
+ <comment xml:lang="bg">Скрипт — PHP</comment>
+ <comment xml:lang="be@latin">Skrypt PHP</comment>
+ <comment xml:lang="be">скрыпт PHP</comment>
+ <comment xml:lang="az">PHP skripti</comment>
+ <comment xml:lang="ar">سكربت PHP</comment>
+ <comment xml:lang="af">PHP-skrip</comment>
<sub-class-of type="text/plain"/>
<generic-icon name="text-x-script"/>
<magic priority="80">
@@ -18802,50 +19903,54 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-pkcs7-certificates">
<comment>PKCS#7 certificate bundle</comment>
- <comment xml:lang="af">PKCS#7-sertifikaatbundel</comment>
- <comment xml:lang="ar">رزمة الشهادة PKCS#7</comment>
- <comment xml:lang="bg">Пакет със сертификати — PKCS#7</comment>
- <comment xml:lang="ca">conjunt de certificats PKCS#7</comment>
- <comment xml:lang="cs">svazek certifikátů PKCS#7</comment>
- <comment xml:lang="da">PKCS#7-certifikatbundt</comment>
- <comment xml:lang="de">PKCS#7-Zertifikatspaket</comment>
- <comment xml:lang="el">Πακέτο ψηφιακών πιστοποιητικών PKCS#7</comment>
- <comment xml:lang="en-GB">PKCS#7 certificate bundle</comment>
- <comment xml:lang="es">lote de certificados PCKS#7</comment>
- <comment xml:lang="eu">PKCS#7 zertifikazio sorta</comment>
- <comment xml:lang="fi">PKCS#7-varmennenippu</comment>
- <comment xml:lang="fo">PKCS#7 váttanar bundi</comment>
- <comment xml:lang="fr">lot de certificats PKCS#7</comment>
- <comment xml:lang="fur">côl di certificâts PKCS#7</comment>
- <comment xml:lang="ga">burla teastas PKCS#7</comment>
- <comment xml:lang="gl">paquete de certificado PKCS#7</comment>
- <comment xml:lang="he">בקשה מוסמכת PKCS#7</comment>
- <comment xml:lang="hr">PKCS#7 paket vjerodajnica</comment>
- <comment xml:lang="hu">PKCS#7-tanúsítványcsomag</comment>
- <comment xml:lang="ia">Pacchetto de certificatos PKCS#7</comment>
- <comment xml:lang="id">Bundel sertifikat PKCS#7</comment>
- <comment xml:lang="it">Bundle certificato PKCS#7</comment>
- <comment xml:lang="ja">PKCS#7 証明書</comment>
- <comment xml:lang="kk">PKCS#7 сертификаттар дестесі</comment>
- <comment xml:lang="ko">PKCS#7 인증서 묶음</comment>
- <comment xml:lang="lt">PKCS#7 liudijimų ryšulys</comment>
- <comment xml:lang="lv">PKCS#7 sertifikātu saišķis</comment>
- <comment xml:lang="nl">PKCS#7-certificaatbundel</comment>
- <comment xml:lang="oc">lòt de certificats PKCS#7</comment>
- <comment xml:lang="pl">Pakiet certyfikatu PKCS#7</comment>
- <comment xml:lang="pt">pacote de certificação PKCS#7</comment>
- <comment xml:lang="pt-BR">Pacote de certificados PKCS#7</comment>
- <comment xml:lang="ro">Pachet certificat PKCS#7</comment>
- <comment xml:lang="ru">Пакет сертификата PKCS#7</comment>
- <comment xml:lang="sk">Zväzok certifikátov PKCS#7</comment>
- <comment xml:lang="sl">Datoteka potrdila PKCS#7</comment>
- <comment xml:lang="sr">ПКЦС#7 пакет уверења</comment>
- <comment xml:lang="sv">PKCS#7-certifikatsamling</comment>
- <comment xml:lang="tr">PKCS#7 sertifika paketi</comment>
- <comment xml:lang="uk">комплект сертифікатів PKCS#7</comment>
+ <comment xml:lang="zh_TW">PKCS#7 憑證綁包</comment>
+ <comment xml:lang="zh_CN">PKCS#7 证书束</comment>
<comment xml:lang="vi">Bó chứng nhận PKCS#7</comment>
- <comment xml:lang="zh-CN">PKCS#7 证书束</comment>
- <comment xml:lang="zh-TW">PKCS#7 憑證綁包</comment>
+ <comment xml:lang="uk">комплект сертифікатів PKCS#7</comment>
+ <comment xml:lang="tr">PKCS#7 sertifika paketi</comment>
+ <comment xml:lang="sv">PKCS#7-certifikatsamling</comment>
+ <comment xml:lang="sr">ПКЦС#7 пакет уверења</comment>
+ <comment xml:lang="sq">paketë dëshmish PKCS#7</comment>
+ <comment xml:lang="sl">Datoteka potrdila PKCS#7</comment>
+ <comment xml:lang="si">PKCS#7 සහතික මිටියක්</comment>
+ <comment xml:lang="sk">Zväzok certifikátov PKCS#7</comment>
+ <comment xml:lang="ru">Пакет сертификата PKCS#7</comment>
+ <comment xml:lang="ro">Pachet certificat PKCS#7</comment>
+ <comment xml:lang="pt_BR">Pacote de certificados PKCS#7</comment>
+ <comment xml:lang="pt">pacote de certificação PKCS#7</comment>
+ <comment xml:lang="pl">Pakiet certyfikatu PKCS#7</comment>
+ <comment xml:lang="oc">lòt de certificats PKCS#7</comment>
+ <comment xml:lang="nl">PKCS#7-certificaatbundel</comment>
+ <comment xml:lang="lv">PKCS#7 sertifikātu saišķis</comment>
+ <comment xml:lang="lt">PKCS#7 liudijimų ryšulys</comment>
+ <comment xml:lang="ko">PKCS#7 인증서 묶음</comment>
+ <comment xml:lang="kk">PKCS#7 сертификаттар дестесі</comment>
+ <comment xml:lang="ja">PKCS#7 証明書バンドル</comment>
+ <comment xml:lang="it">Bundle certificato PKCS#7</comment>
+ <comment xml:lang="is">PKCS#7 skilríkjavöndull</comment>
+ <comment xml:lang="id">Bundel sertifikat PKCS#7</comment>
+ <comment xml:lang="ia">Pacchetto de certificatos PKCS#7</comment>
+ <comment xml:lang="hu">PKCS#7-tanúsítványcsomag</comment>
+ <comment xml:lang="hr">PKCS#7 paket vjerodajnica</comment>
+ <comment xml:lang="he">בקשה מוסמכת PKCS#7</comment>
+ <comment xml:lang="gl">paquete de certificado PKCS#7</comment>
+ <comment xml:lang="ga">burla teastas PKCS#7</comment>
+ <comment xml:lang="fur">côl di certificâts PKCS#7</comment>
+ <comment xml:lang="fr">lot de certificats PKCS#7</comment>
+ <comment xml:lang="fo">PKCS#7 váttanar bundi</comment>
+ <comment xml:lang="fi">PKCS#7-varmennepaketti</comment>
+ <comment xml:lang="eu">PKCS#7 zertifikazio sorta</comment>
+ <comment xml:lang="es">lote de certificados PCKS#7</comment>
+ <comment xml:lang="en_GB">PKCS#7 certificate bundle</comment>
+ <comment xml:lang="el">Πακέτο ψηφιακών πιστοποιητικών PKCS#7</comment>
+ <comment xml:lang="de">PKCS#7-Zertifikatpaket</comment>
+ <comment xml:lang="da">PKCS#7-certifikatbundt</comment>
+ <comment xml:lang="cs">svazek certifikátů PKCS#7</comment>
+ <comment xml:lang="ca">conjunt de certificats PKCS#7</comment>
+ <comment xml:lang="bg">Пакет със сертификати — PKCS#7</comment>
+ <comment xml:lang="be">пакет сертыфікатаў PKCS#7</comment>
+ <comment xml:lang="ar">رزمة شهادة PKCS#7</comment>
+ <comment xml:lang="af">PKCS#7-sertifikaatbundel</comment>
<acronym>PKCS</acronym>
<expanded-acronym>Public-Key Cryptography Standards</expanded-acronym>
<glob pattern="*.p7b"/>
@@ -18853,56 +19958,59 @@ command to generate the output files.
</mime-type>
<mime-type type="application/pkcs12">
<comment>PKCS#12 certificate bundle</comment>
- <comment xml:lang="af">PKCS#12-sertifikaatbundel</comment>
- <comment xml:lang="ar">رزمة الشهادة PKCS#12</comment>
- <comment xml:lang="be-Latn">Viazka sertyfikataŭ PKCS#12</comment>
- <comment xml:lang="bg">Пакет със сертификати — PKCS#12</comment>
- <comment xml:lang="ca">conjunt de certificats PKCS#12</comment>
- <comment xml:lang="cs">svazek certifikátů PKCS#12</comment>
- <comment xml:lang="da">PKCS#12-certifikatbundt</comment>
- <comment xml:lang="de">PKCS#12-Zertifikatspaket</comment>
- <comment xml:lang="el">Πακέτο ψηφιακών πιστοποιητικών PKCS#12</comment>
- <comment xml:lang="en-GB">PKCS#12 certificate bundle</comment>
- <comment xml:lang="eo">ligaĵo de PKCS#12-atestiloj</comment>
- <comment xml:lang="es">lote de certificados PCKS#12</comment>
- <comment xml:lang="eu">PKCS#12 zertifikazio sorta</comment>
- <comment xml:lang="fi">PKCS#12-varmennenippu</comment>
- <comment xml:lang="fo">PKCS#12 váttanar bundi</comment>
- <comment xml:lang="fr">lot de certificats PKCS#12</comment>
- <comment xml:lang="fur">côl di certificâts PKCS#12</comment>
- <comment xml:lang="ga">burla teastas PKCS#12</comment>
- <comment xml:lang="gl">paquete de certificado PKCS#12</comment>
- <comment xml:lang="he">בקשה מוסמכת PKCS#12</comment>
- <comment xml:lang="hr">PKCS#12 paket vjerodajnica</comment>
- <comment xml:lang="hu">PKCS#12-tanúsítványcsomag</comment>
- <comment xml:lang="ia">Pacchetto de certificatos PKCS#12</comment>
- <comment xml:lang="id">Bundel sertifikat PKCS#12</comment>
- <comment xml:lang="it">Bundle certificato PKCS#12</comment>
- <comment xml:lang="ja">PKCS#12 証明書</comment>
- <comment xml:lang="kk">PKCS#12 сертификаттар дестесі</comment>
- <comment xml:lang="ko">PKCS#12 인증서 묶음</comment>
- <comment xml:lang="lt">PKCS#12 liudijimų ryšulys</comment>
- <comment xml:lang="lv">PKCS#12 sertifikātu saišķis</comment>
- <comment xml:lang="ms">Sijil PKCS#12</comment>
- <comment xml:lang="nb">PKCS#12 sertifikathaug</comment>
- <comment xml:lang="nl">PKCS#12-certificaatbundel</comment>
- <comment xml:lang="nn">PKCS#12-sertifikatbunt</comment>
- <comment xml:lang="oc">lòt de certificats PKCS#12</comment>
- <comment xml:lang="pl">Pakiet certyfikatu PKCS#12</comment>
- <comment xml:lang="pt">pacote de certificação PKCS#12</comment>
- <comment xml:lang="pt-BR">Pacote de certificados PKCS#12</comment>
- <comment xml:lang="ro">Certificat împachetat PKCS#12</comment>
- <comment xml:lang="ru">Пакет сертификата PKCS#12</comment>
- <comment xml:lang="sk">Zväzok certifikátov PKCS#12</comment>
- <comment xml:lang="sl">Datoteka potrdila PKCS#12</comment>
- <comment xml:lang="sq">Bundle çertifikate PKCS#12</comment>
- <comment xml:lang="sr">ПКЦС#12 пакет уверења</comment>
- <comment xml:lang="sv">PKCS#12-certifikatsamling</comment>
- <comment xml:lang="tr">PKCS#12 sertifika paketi</comment>
- <comment xml:lang="uk">комплект сертифікатів PKCS#12</comment>
+ <comment xml:lang="zh_TW">PKCS#12 憑證綁包</comment>
+ <comment xml:lang="zh_CN">PKCS#12 证书束</comment>
<comment xml:lang="vi">Bó chứng nhận PKCS#12</comment>
- <comment xml:lang="zh-CN">PKCS#12 证书束</comment>
- <comment xml:lang="zh-TW">PKCS#12 憑證綁包</comment>
+ <comment xml:lang="uk">комплект сертифікатів PKCS#12</comment>
+ <comment xml:lang="tr">PKCS#12 sertifika paketi</comment>
+ <comment xml:lang="sv">PKCS#12-certifikatsamling</comment>
+ <comment xml:lang="sr">ПКЦС#12 пакет уверења</comment>
+ <comment xml:lang="sq">paketë dëshmish PKCS#12</comment>
+ <comment xml:lang="sl">Datoteka potrdila PKCS#12</comment>
+ <comment xml:lang="si">PKCS#12 සහතික මිටියක්</comment>
+ <comment xml:lang="sk">Zväzok certifikátov PKCS#12</comment>
+ <comment xml:lang="ru">Пакет сертификата PKCS#12</comment>
+ <comment xml:lang="ro">Certificat împachetat PKCS#12</comment>
+ <comment xml:lang="pt_BR">Pacote de certificados PKCS#12</comment>
+ <comment xml:lang="pt">pacote de certificação PKCS#12</comment>
+ <comment xml:lang="pl">Pakiet certyfikatu PKCS#12</comment>
+ <comment xml:lang="oc">lòt de certificats PKCS#12</comment>
+ <comment xml:lang="nn">PKCS#12-sertifikatbunt</comment>
+ <comment xml:lang="nl">PKCS#12-certificaatbundel</comment>
+ <comment xml:lang="nb">PKCS#12 sertifikathaug</comment>
+ <comment xml:lang="ms">Sijil PKCS#12</comment>
+ <comment xml:lang="lv">PKCS#12 sertifikātu saišķis</comment>
+ <comment xml:lang="lt">PKCS#12 liudijimų ryšulys</comment>
+ <comment xml:lang="ko">PKCS#12 인증서 묶음</comment>
+ <comment xml:lang="kk">PKCS#12 сертификаттар дестесі</comment>
+ <comment xml:lang="ja">PKCS#12 証明書バンドル</comment>
+ <comment xml:lang="it">Bundle certificato PKCS#12</comment>
+ <comment xml:lang="is">PKCS#12 skilríkjavöndull</comment>
+ <comment xml:lang="id">Bundel sertifikat PKCS#12</comment>
+ <comment xml:lang="ia">Pacchetto de certificatos PKCS#12</comment>
+ <comment xml:lang="hu">PKCS#12-tanúsítványcsomag</comment>
+ <comment xml:lang="hr">PKCS#12 paket vjerodajnica</comment>
+ <comment xml:lang="he">בקשה מוסמכת PKCS#12</comment>
+ <comment xml:lang="gl">paquete de certificado PKCS#12</comment>
+ <comment xml:lang="ga">burla teastas PKCS#12</comment>
+ <comment xml:lang="fur">côl di certificâts PKCS#12</comment>
+ <comment xml:lang="fr">lot de certificats PKCS#12</comment>
+ <comment xml:lang="fo">PKCS#12 váttanar bundi</comment>
+ <comment xml:lang="fi">PKCS#12-varmennepaketti</comment>
+ <comment xml:lang="eu">PKCS#12 zertifikazio sorta</comment>
+ <comment xml:lang="es">lote de certificados PCKS#12</comment>
+ <comment xml:lang="eo">ligaĵo de PKCS#12-atestiloj</comment>
+ <comment xml:lang="en_GB">PKCS#12 certificate bundle</comment>
+ <comment xml:lang="el">Πακέτο ψηφιακών πιστοποιητικών PKCS#12</comment>
+ <comment xml:lang="de">PKCS#12-Zertifikatpaket</comment>
+ <comment xml:lang="da">PKCS#12-certifikatbundt</comment>
+ <comment xml:lang="cs">svazek certifikátů PKCS#12</comment>
+ <comment xml:lang="ca">conjunt de certificats PKCS#12</comment>
+ <comment xml:lang="bg">Пакет със сертификати — PKCS#12</comment>
+ <comment xml:lang="be@latin">Viazka sertyfikataŭ PKCS#12</comment>
+ <comment xml:lang="be">пакет сертыфікатаў PKCS#12</comment>
+ <comment xml:lang="ar">رزمة شهادة PKCS#12</comment>
+ <comment xml:lang="af">PKCS#12-sertifikaatbundel</comment>
<acronym>PKCS</acronym>
<expanded-acronym>Public-Key Cryptography Standards</expanded-acronym>
<glob pattern="*.p12"/>
@@ -18911,278 +20019,249 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-planperfect">
<comment>PlanPerfect spreadsheet</comment>
- <comment xml:lang="af">PlanPerfect-sigblad</comment>
- <comment xml:lang="ar">جدول PlanPerfect</comment>
- <comment xml:lang="be-Latn">Raźlikovy arkuš PlanPerfect</comment>
- <comment xml:lang="bg">Таблица — PlanPerfect</comment>
- <comment xml:lang="ca">full de càlcul de PlanPerfect</comment>
- <comment xml:lang="cs">sešit PlanPerfect</comment>
- <comment xml:lang="da">PlanPerfect-regneark</comment>
- <comment xml:lang="de">PlanPerfect-Tabelle</comment>
- <comment xml:lang="el">Φύλλο εργασίας PlanPerfect</comment>
- <comment xml:lang="en-GB">PlanPerfect spreadsheet</comment>
- <comment xml:lang="es">hoja de cálculo de PlanPerfect</comment>
- <comment xml:lang="eu">PlanPerfect kalkulu-orria</comment>
- <comment xml:lang="fi">PlanPerfect-taulukko</comment>
- <comment xml:lang="fo">PlanPerfect rokniark</comment>
- <comment xml:lang="fr">feuille de calcul PlanPerfect</comment>
- <comment xml:lang="fur">sfuei di calcul PlanPerfect</comment>
- <comment xml:lang="ga">scarbhileog PlanPerfect</comment>
- <comment xml:lang="gl">folla de cálculo de PlanPerfect</comment>
- <comment xml:lang="he">גליון נתונים של PlanPerfect</comment>
- <comment xml:lang="hr">PlanPerfect proračunska tablica</comment>
- <comment xml:lang="hu">PlanPerfect táblázat</comment>
- <comment xml:lang="ia">Folio de calculo PlanPerfect</comment>
- <comment xml:lang="id">Lembar sebar PlanPerfect</comment>
- <comment xml:lang="it">Foglio di calcolo PlanPerfect</comment>
- <comment xml:lang="ja">PlanPerfect スプレッドシート</comment>
- <comment xml:lang="kk">PlanPerfect электрондық кестесі</comment>
- <comment xml:lang="ko">PlanPerfect 스프레드시트</comment>
- <comment xml:lang="lt">PlanPerfect skaičialentė</comment>
- <comment xml:lang="lv">PlanPerfect izklājlapa</comment>
- <comment xml:lang="nb">PlanPerfect-regneark</comment>
- <comment xml:lang="nl">PlanPerfect-rekenblad</comment>
- <comment xml:lang="nn">PlanPerfect-rekneark</comment>
- <comment xml:lang="oc">fuèlh de calcul PlanPerfect</comment>
- <comment xml:lang="pl">Arkusz PlanPerfect</comment>
- <comment xml:lang="pt">folha de cálculo PlanPerfect</comment>
- <comment xml:lang="pt-BR">Planilha do PlanPerfect</comment>
- <comment xml:lang="ro">Foaie de calcul PlanPerfect</comment>
- <comment xml:lang="ru">Электронная таблица PlanPerfect</comment>
- <comment xml:lang="sk">Zošit PlanPerfect</comment>
- <comment xml:lang="sl">Preglednica PlanPerfect</comment>
- <comment xml:lang="sq">Fletë llogaritjesh PlanPerfect</comment>
- <comment xml:lang="sr">табела План Перфекта</comment>
- <comment xml:lang="sv">PlanPerfect-kalkylblad</comment>
- <comment xml:lang="tr">PlanPerfect hesap çizelgesi</comment>
- <comment xml:lang="uk">ел. таблиця PlanPerfect</comment>
+ <comment xml:lang="zh_TW">PlanPerfect 試算表</comment>
+ <comment xml:lang="zh_CN">PlanPerfect 电子表格</comment>
<comment xml:lang="vi">Bảng tính PlanPerfect</comment>
- <comment xml:lang="zh-CN">PlanPerfect 电子表格</comment>
- <comment xml:lang="zh-TW">PlanPerfect 試算表</comment>
+ <comment xml:lang="uk">електронна таблиця PlanPerfect</comment>
+ <comment xml:lang="tr">PlanPerfect hesap çizelgesi</comment>
+ <comment xml:lang="sv">PlanPerfect-kalkylblad</comment>
+ <comment xml:lang="sr">табела План Перфекта</comment>
+ <comment xml:lang="sq">fletëllogaritje PlanPerfect</comment>
+ <comment xml:lang="sl">Preglednica PlanPerfect</comment>
+ <comment xml:lang="si">PlanPerfect පැතුරුම්පත</comment>
+ <comment xml:lang="sk">Zošit PlanPerfect</comment>
+ <comment xml:lang="ru">Электронная таблица PlanPerfect</comment>
+ <comment xml:lang="ro">Foaie de calcul PlanPerfect</comment>
+ <comment xml:lang="pt_BR">Planilha do PlanPerfect</comment>
+ <comment xml:lang="pt">folha de cálculo PlanPerfect</comment>
+ <comment xml:lang="pl">Arkusz PlanPerfect</comment>
+ <comment xml:lang="oc">fuèlh de calcul PlanPerfect</comment>
+ <comment xml:lang="nn">PlanPerfect-rekneark</comment>
+ <comment xml:lang="nl">PlanPerfect-rekenblad</comment>
+ <comment xml:lang="nb">PlanPerfect-regneark</comment>
+ <comment xml:lang="lv">PlanPerfect izklājlapa</comment>
+ <comment xml:lang="lt">PlanPerfect skaičialentė</comment>
+ <comment xml:lang="ko">PlanPerfect 스프레드시트</comment>
+ <comment xml:lang="kk">PlanPerfect электрондық кестесі</comment>
+ <comment xml:lang="ja">PlanPerfect スプレッドシート</comment>
+ <comment xml:lang="it">Foglio di calcolo PlanPerfect</comment>
+ <comment xml:lang="is">PlanPerfect töflureikniskjal</comment>
+ <comment xml:lang="id">Lembar sebar PlanPerfect</comment>
+ <comment xml:lang="ia">Folio de calculo PlanPerfect</comment>
+ <comment xml:lang="hu">PlanPerfect táblázat</comment>
+ <comment xml:lang="hr">PlanPerfect proračunska tablica</comment>
+ <comment xml:lang="he">גיליון נתונים של PlanPerfect</comment>
+ <comment xml:lang="gl">folla de cálculo de PlanPerfect</comment>
+ <comment xml:lang="ga">scarbhileog PlanPerfect</comment>
+ <comment xml:lang="fur">sfuei di calcul PlanPerfect</comment>
+ <comment xml:lang="fr">feuille de calcul PlanPerfect</comment>
+ <comment xml:lang="fo">PlanPerfect rokniark</comment>
+ <comment xml:lang="fi">PlanPerfect-taulukko</comment>
+ <comment xml:lang="eu">PlanPerfect kalkulu-orria</comment>
+ <comment xml:lang="es">hoja de cálculo de PlanPerfect</comment>
+ <comment xml:lang="en_GB">PlanPerfect spreadsheet</comment>
+ <comment xml:lang="el">Φύλλο εργασίας PlanPerfect</comment>
+ <comment xml:lang="de">PlanPerfect-Tabelle</comment>
+ <comment xml:lang="da">PlanPerfect-regneark</comment>
+ <comment xml:lang="cs">sešit PlanPerfect</comment>
+ <comment xml:lang="ca">full de càlcul de PlanPerfect</comment>
+ <comment xml:lang="bg">Таблица — PlanPerfect</comment>
+ <comment xml:lang="be@latin">Raźlikovy arkuš PlanPerfect</comment>
+ <comment xml:lang="be">электронная табліца PlanPerfect</comment>
+ <comment xml:lang="ar">جدول PlanPerfect</comment>
+ <comment xml:lang="af">PlanPerfect-sigblad</comment>
<generic-icon name="x-office-spreadsheet"/>
<glob pattern="*.pln"/>
</mime-type>
<mime-type type="application/x-pocket-word">
<comment>Pocket Word document</comment>
- <comment xml:lang="af">Pocket Word-dokument</comment>
- <comment xml:lang="ar">مستند Pocket Word</comment>
- <comment xml:lang="ast">Documentu de PocketWord</comment>
- <comment xml:lang="bg">Документ — Pocket Word</comment>
- <comment xml:lang="ca">document de Pocket Word</comment>
- <comment xml:lang="cs">dokument Pocket Word</comment>
- <comment xml:lang="da">Pocket Word-dokument</comment>
- <comment xml:lang="de">Pocket-Word-Dokument</comment>
- <comment xml:lang="el">Έγγραφο Pocket Word</comment>
- <comment xml:lang="en-GB">Pocket Word document</comment>
- <comment xml:lang="es">documento de Pocket Word</comment>
- <comment xml:lang="eu">Pocket Word dokumentua</comment>
- <comment xml:lang="fi">Pocket Word -asiakirja</comment>
- <comment xml:lang="fo">Pocket Word skjal</comment>
- <comment xml:lang="fr">document Pocket Word</comment>
- <comment xml:lang="fur">document Pocket Word</comment>
- <comment xml:lang="ga">cáipéis Pocket Word</comment>
- <comment xml:lang="gl">documento de Pocket Word</comment>
- <comment xml:lang="he">מסמך של Pocket Word</comment>
- <comment xml:lang="hr">Pocket Word dokument</comment>
- <comment xml:lang="hu">Pocket Word dokumentum</comment>
- <comment xml:lang="ia">Documento Pocket Word</comment>
- <comment xml:lang="id">Dokumen Pocket Word</comment>
- <comment xml:lang="it">Documento Pocket Word</comment>
- <comment xml:lang="ja">Pocket Word ドキュメント</comment>
- <comment xml:lang="kk">Pocket Word құжаты</comment>
- <comment xml:lang="ko">Pocket Word 문서</comment>
- <comment xml:lang="lt">Pocket Word dokumentas</comment>
- <comment xml:lang="lv">Pocket Word dokuments</comment>
- <comment xml:lang="nl">Pocket Word-document</comment>
- <comment xml:lang="oc">document Pocket Word</comment>
- <comment xml:lang="pl">Dokument Pocket Word</comment>
- <comment xml:lang="pt">documento Pocket Word</comment>
- <comment xml:lang="pt-BR">Documento do Pocket Word</comment>
- <comment xml:lang="ro">Document Pocket Word</comment>
- <comment xml:lang="ru">Документ Pocket Word</comment>
- <comment xml:lang="sk">Dokument Pocket Word</comment>
- <comment xml:lang="sl">Dokument Pocket Word</comment>
- <comment xml:lang="sr">документ Покет Ворда</comment>
- <comment xml:lang="sv">Pocket Word-dokument</comment>
- <comment xml:lang="tr">Pocket Word belgesi</comment>
- <comment xml:lang="uk">документ Pocket Word</comment>
+ <comment xml:lang="zh_TW">Pocket Word 文件</comment>
+ <comment xml:lang="zh_CN">Pocket Word 文档</comment>
<comment xml:lang="vi">Tài liệu Pocket Word</comment>
- <comment xml:lang="zh-CN">Pocket Word 文档</comment>
- <comment xml:lang="zh-TW">Pocket Word 文件</comment>
+ <comment xml:lang="uk">документ Pocket Word</comment>
+ <comment xml:lang="tr">Pocket Word belgesi</comment>
+ <comment xml:lang="sv">Pocket Word-dokument</comment>
+ <comment xml:lang="sr">документ Покет Ворда</comment>
+ <comment xml:lang="sq">dokument Pocket Word</comment>
+ <comment xml:lang="sl">Dokument Pocket Word</comment>
+ <comment xml:lang="si">Pocket Word ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument Pocket Word</comment>
+ <comment xml:lang="ru">Документ Pocket Word</comment>
+ <comment xml:lang="ro">Document Pocket Word</comment>
+ <comment xml:lang="pt_BR">Documento do Pocket Word</comment>
+ <comment xml:lang="pt">documento Pocket Word</comment>
+ <comment xml:lang="pl">Dokument Pocket Word</comment>
+ <comment xml:lang="oc">document Pocket Word</comment>
+ <comment xml:lang="nl">Pocket Word-document</comment>
+ <comment xml:lang="lv">Pocket Word dokuments</comment>
+ <comment xml:lang="lt">Pocket Word dokumentas</comment>
+ <comment xml:lang="ko">Pocket Word 문서</comment>
+ <comment xml:lang="kk">Pocket Word құжаты</comment>
+ <comment xml:lang="ja">Pocket Word ドキュメント</comment>
+ <comment xml:lang="it">Documento Pocket Word</comment>
+ <comment xml:lang="is">Pocket Word skjal</comment>
+ <comment xml:lang="id">Dokumen Pocket Word</comment>
+ <comment xml:lang="ia">Documento Pocket Word</comment>
+ <comment xml:lang="hu">Pocket Word dokumentum</comment>
+ <comment xml:lang="hr">Pocket Word dokument</comment>
+ <comment xml:lang="he">מסמך של Pocket Word</comment>
+ <comment xml:lang="gl">documento de Pocket Word</comment>
+ <comment xml:lang="ga">cáipéis Pocket Word</comment>
+ <comment xml:lang="fur">document Pocket Word</comment>
+ <comment xml:lang="fr">document Pocket Word</comment>
+ <comment xml:lang="fo">Pocket Word skjal</comment>
+ <comment xml:lang="fi">Pocket Word -asiakirja</comment>
+ <comment xml:lang="eu">Pocket Word dokumentua</comment>
+ <comment xml:lang="es">documento de Pocket Word</comment>
+ <comment xml:lang="en_GB">Pocket Word document</comment>
+ <comment xml:lang="el">Έγγραφο Pocket Word</comment>
+ <comment xml:lang="de">Pocket-Word-Dokument</comment>
+ <comment xml:lang="da">Pocket Word-dokument</comment>
+ <comment xml:lang="cs">dokument Pocket Word</comment>
+ <comment xml:lang="ca">document de Pocket Word</comment>
+ <comment xml:lang="bg">Документ — Pocket Word</comment>
+ <comment xml:lang="be">дакумент Pocket Word</comment>
+ <comment xml:lang="ast">Documentu de PocketWord</comment>
+ <comment xml:lang="ar">مستند Pocket Word</comment>
+ <comment xml:lang="af">Pocket Word-dokument</comment>
<generic-icon name="x-office-document"/>
- <magic priority="50">
+ <magic>
<match type="string" value="{\\pwi" offset="0"/>
</magic>
<glob pattern="*.psw"/>
</mime-type>
<mime-type type="application/x-profile">
- <comment>profiler results</comment>
- <comment xml:lang="af">profieldata</comment>
- <comment xml:lang="ar">نتائج المحلل</comment>
- <comment xml:lang="az">profiler nəticələri</comment>
- <comment xml:lang="be-Latn">vyniki profilera</comment>
- <comment xml:lang="bg">Резултати от анализатора</comment>
- <comment xml:lang="ca">resultats del perfilador</comment>
- <comment xml:lang="cs">výsledky profileru</comment>
- <comment xml:lang="cy">canlyniadau proffeilio</comment>
- <comment xml:lang="da">profileringsresultater</comment>
- <comment xml:lang="de">Profiler-Ergebnisse</comment>
- <comment xml:lang="el">Αποτελέσματα μετρήσεων για την εκτέλεση προγράμματος</comment>
- <comment xml:lang="en-GB">profiler results</comment>
- <comment xml:lang="eo">resultoj de profililo</comment>
- <comment xml:lang="es">resultados del perfilador</comment>
- <comment xml:lang="eu">profiler-aren emaitzak</comment>
- <comment xml:lang="fi">profilointitulokset</comment>
- <comment xml:lang="fr">résultats de profileur</comment>
- <comment xml:lang="fur">risultâts profiladôr</comment>
- <comment xml:lang="ga">torthaí próifíleora</comment>
- <comment xml:lang="gl">resultados do perfilador</comment>
- <comment xml:lang="he">תוצאות מאבחן</comment>
- <comment xml:lang="hr">Rezultati profila</comment>
- <comment xml:lang="hu">profilírozó-eredmények</comment>
- <comment xml:lang="ia">Resultatos de profilator</comment>
- <comment xml:lang="id">hasil profiler</comment>
- <comment xml:lang="it">Risultati profiler</comment>
- <comment xml:lang="ja">プロファイラー結果</comment>
- <comment xml:lang="kk">прифильдеу нәтижелері</comment>
- <comment xml:lang="ko">프로파일러 결과</comment>
- <comment xml:lang="lt">profiliklio rezultatai</comment>
- <comment xml:lang="lv">profilētāja rezultāti</comment>
- <comment xml:lang="ms">Hasil pemprofil</comment>
- <comment xml:lang="nb">profileingsresultat</comment>
- <comment xml:lang="nl">profiler-resultaten</comment>
- <comment xml:lang="nn">profileringsresultat</comment>
- <comment xml:lang="oc">resultats de perfilador</comment>
- <comment xml:lang="pl">Wyniki profilowania</comment>
- <comment xml:lang="pt">resultados de análise de perfil</comment>
- <comment xml:lang="pt-BR">Resultados do profiler</comment>
- <comment xml:lang="ro">rezultate profiler</comment>
- <comment xml:lang="ru">Результаты профилирования</comment>
- <comment xml:lang="sk">Výsledky profilera</comment>
- <comment xml:lang="sl">rezultati profilirnika</comment>
- <comment xml:lang="sq">Rezultate të profiluesit</comment>
- <comment xml:lang="sr">резултати профилатора</comment>
- <comment xml:lang="sv">profilerarresultat</comment>
- <comment xml:lang="tr">profiler sonuçları</comment>
+ <comment>Profiler results</comment>
<comment xml:lang="uk">результати профілювання</comment>
- <comment xml:lang="vi">kết quả nét hiện trạng</comment>
- <comment xml:lang="zh-CN">探查器结果</comment>
- <comment xml:lang="zh-TW">硬體資訊產生器成果</comment>
+ <comment xml:lang="sv">Profilerarresultat</comment>
+ <comment xml:lang="ru">Результаты профилирования</comment>
+ <comment xml:lang="pl">Wyniki profilowania</comment>
+ <comment xml:lang="it">Risultati profiler</comment>
+ <comment xml:lang="gl">Resultados dos perfiladores</comment>
+ <comment xml:lang="eu">Profilatzaile-emaitzak</comment>
+ <comment xml:lang="es">resultados de generador de perfiles</comment>
+ <comment xml:lang="de">Profiler-Ergebnisse</comment>
+ <comment xml:lang="be">вынікі прафіліроўшчыка</comment>
<sub-class-of type="text/plain"/>
<generic-icon name="text-x-generic"/>
<glob pattern="gmon.out"/>
</mime-type>
<mime-type type="application/x-pw">
<comment>Pathetic Writer document</comment>
- <comment xml:lang="af">Pathetic Writer-dokument</comment>
- <comment xml:lang="ar">مستند Pathetic Writer</comment>
- <comment xml:lang="ast">Documentu de Pathetic Writer</comment>
- <comment xml:lang="be-Latn">Dakument Pathetic Writer</comment>
- <comment xml:lang="bg">Документ — Pathetic Writer</comment>
- <comment xml:lang="ca">document de Pathetic Writer</comment>
- <comment xml:lang="cs">dokument Pathetic Writer</comment>
- <comment xml:lang="da">Pathetic Writer-dokument</comment>
- <comment xml:lang="de">Pathetic-Writer-Dokument</comment>
- <comment xml:lang="el">Έγγραφο Pathetic Writer</comment>
- <comment xml:lang="en-GB">Pathetic Writer document</comment>
- <comment xml:lang="eo">dokumento de Pathetic Writer</comment>
- <comment xml:lang="es">documento de Pathetic Writer</comment>
- <comment xml:lang="eu">Pathetic Writer dokumentua</comment>
- <comment xml:lang="fi">Pathetic Writer -asiakirja</comment>
- <comment xml:lang="fo">Pathetic Writer skjal</comment>
- <comment xml:lang="fr">document Pathetic Writer</comment>
- <comment xml:lang="fur">document Pathetic Writer</comment>
- <comment xml:lang="ga">cáipéis Pathetic Writer</comment>
- <comment xml:lang="gl">documento de Pathetic Writer</comment>
- <comment xml:lang="he">מסמך של Pathetic Writer</comment>
- <comment xml:lang="hr">Pathetic Writer dokument</comment>
- <comment xml:lang="hu">Pathetic Writer-dokumentum</comment>
- <comment xml:lang="ia">Documento Pathetic Writer</comment>
- <comment xml:lang="id">Dokumen Pathetic Writer</comment>
- <comment xml:lang="it">Documento Pathetic Writer</comment>
- <comment xml:lang="ja">Pathetic Writer ドキュメント</comment>
- <comment xml:lang="kk">Pathetic Writer құжаты</comment>
- <comment xml:lang="ko">Pathetic Writer 문서</comment>
- <comment xml:lang="lt">Pathetic Writer dokumentas</comment>
- <comment xml:lang="lv">Pathetic Writer dokuments</comment>
- <comment xml:lang="ms">Dokumen Pathetic Writer</comment>
- <comment xml:lang="nb">Pathetic Writer-dokument</comment>
- <comment xml:lang="nl">Pathetic Writer-document</comment>
- <comment xml:lang="nn">Pathetic Writer-dokument</comment>
- <comment xml:lang="oc">document Pathetic Writer</comment>
- <comment xml:lang="pl">Dokument Pathetic Writer</comment>
- <comment xml:lang="pt">documento do Pathetic Writer</comment>
- <comment xml:lang="pt-BR">Documento do Pathetic Writer</comment>
- <comment xml:lang="ro">Document Pathetic Writer</comment>
- <comment xml:lang="ru">Документ Pathetic Writer</comment>
- <comment xml:lang="sk">Dokument Pathetic Writer</comment>
- <comment xml:lang="sl">Dokument Pathetic Writer</comment>
- <comment xml:lang="sq">Dokument Pathetic Writer</comment>
- <comment xml:lang="sr">документ Патетичног Писца</comment>
- <comment xml:lang="sv">Pathetic Writer-dokument</comment>
- <comment xml:lang="tr">Pathetic Writer belgesi</comment>
- <comment xml:lang="uk">документ Pathetic Writer</comment>
+ <comment xml:lang="zh_TW">Pathetic Writer 文件</comment>
+ <comment xml:lang="zh_CN">Pathetic Writer 文档</comment>
<comment xml:lang="vi">Tài liệu Pathetic Writer</comment>
- <comment xml:lang="zh-CN">Pathetic Writer 文档</comment>
- <comment xml:lang="zh-TW">Pathetic Writer 文件</comment>
+ <comment xml:lang="uk">документ Pathetic Writer</comment>
+ <comment xml:lang="tr">Pathetic Writer belgesi</comment>
+ <comment xml:lang="sv">Pathetic Writer-dokument</comment>
+ <comment xml:lang="sr">документ Патетичног Писца</comment>
+ <comment xml:lang="sq">dokument Pathetic Writer</comment>
+ <comment xml:lang="sl">Dokument Pathetic Writer</comment>
+ <comment xml:lang="si">දුක්ඛිත ලේඛක ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument Pathetic Writer</comment>
+ <comment xml:lang="ru">Документ Pathetic Writer</comment>
+ <comment xml:lang="ro">Document Pathetic Writer</comment>
+ <comment xml:lang="pt_BR">Documento do Pathetic Writer</comment>
+ <comment xml:lang="pt">documento do Pathetic Writer</comment>
+ <comment xml:lang="pl">Dokument Pathetic Writer</comment>
+ <comment xml:lang="oc">document Pathetic Writer</comment>
+ <comment xml:lang="nn">Pathetic Writer-dokument</comment>
+ <comment xml:lang="nl">Pathetic Writer-document</comment>
+ <comment xml:lang="nb">Pathetic Writer-dokument</comment>
+ <comment xml:lang="ms">Dokumen Pathetic Writer</comment>
+ <comment xml:lang="lv">Pathetic Writer dokuments</comment>
+ <comment xml:lang="lt">Pathetic Writer dokumentas</comment>
+ <comment xml:lang="ko">Pathetic Writer 문서</comment>
+ <comment xml:lang="kk">Pathetic Writer құжаты</comment>
+ <comment xml:lang="ja">Pathetic Writer ドキュメント</comment>
+ <comment xml:lang="it">Documento Pathetic Writer</comment>
+ <comment xml:lang="is">Pathetic Writer skjal</comment>
+ <comment xml:lang="id">Dokumen Pathetic Writer</comment>
+ <comment xml:lang="ia">Documento Pathetic Writer</comment>
+ <comment xml:lang="hu">Pathetic Writer-dokumentum</comment>
+ <comment xml:lang="hr">Pathetic Writer dokument</comment>
+ <comment xml:lang="he">מסמך של Pathetic Writer</comment>
+ <comment xml:lang="gl">documento de Pathetic Writer</comment>
+ <comment xml:lang="ga">cáipéis Pathetic Writer</comment>
+ <comment xml:lang="fur">document Pathetic Writer</comment>
+ <comment xml:lang="fr">document Pathetic Writer</comment>
+ <comment xml:lang="fo">Pathetic Writer skjal</comment>
+ <comment xml:lang="fi">Pathetic Writer -asiakirja</comment>
+ <comment xml:lang="eu">Pathetic Writer dokumentua</comment>
+ <comment xml:lang="es">documento de Pathetic Writer</comment>
+ <comment xml:lang="eo">dokumento de Pathetic Writer</comment>
+ <comment xml:lang="en_GB">Pathetic Writer document</comment>
+ <comment xml:lang="el">Έγγραφο Pathetic Writer</comment>
+ <comment xml:lang="de">Pathetic-Writer-Dokument</comment>
+ <comment xml:lang="da">Pathetic Writer-dokument</comment>
+ <comment xml:lang="cs">dokument Pathetic Writer</comment>
+ <comment xml:lang="ca">document de Pathetic Writer</comment>
+ <comment xml:lang="bg">Документ — Pathetic Writer</comment>
+ <comment xml:lang="be@latin">Dakument Pathetic Writer</comment>
+ <comment xml:lang="be">дакумент Pathetic Writer</comment>
+ <comment xml:lang="ast">Documentu de Pathetic Writer</comment>
+ <comment xml:lang="ar">مستند Pathetic Writer</comment>
+ <comment xml:lang="af">Pathetic Writer-dokument</comment>
<generic-icon name="x-office-document"/>
<glob pattern="*.pw"/>
</mime-type>
<mime-type type="application/x-python-bytecode">
<comment>Python bytecode</comment>
- <comment xml:lang="af">Python binêre kode</comment>
- <comment xml:lang="ar">Python bytecode</comment>
- <comment xml:lang="az">Python bayt kodu</comment>
- <comment xml:lang="be-Latn">Bajtavy kod Python</comment>
- <comment xml:lang="bg">Байт код — Python</comment>
- <comment xml:lang="ca">bytecode de Python</comment>
- <comment xml:lang="cs">bajtový kód Python</comment>
- <comment xml:lang="cy">Côd beit Python</comment>
- <comment xml:lang="da">Python-bytekode</comment>
- <comment xml:lang="de">Python-Bytecode</comment>
- <comment xml:lang="el">Συμβολοκώδικας Python</comment>
- <comment xml:lang="en-GB">Python bytecode</comment>
- <comment xml:lang="eo">Python-bajtkodo</comment>
- <comment xml:lang="es">bytecode de Python</comment>
- <comment xml:lang="eu">Python byte-kodea</comment>
- <comment xml:lang="fi">Python-tavukoodi</comment>
- <comment xml:lang="fo">Python býtkota</comment>
- <comment xml:lang="fr">bytecode Python</comment>
- <comment xml:lang="fur">bytecode di Python</comment>
- <comment xml:lang="ga">beartchód Python</comment>
- <comment xml:lang="gl">bytecode de Python</comment>
- <comment xml:lang="he">Bytecode של Python</comment>
- <comment xml:lang="hr">Python bajt kôd</comment>
- <comment xml:lang="hu">Python-bájtkód</comment>
- <comment xml:lang="ia">Codice intermediari Python</comment>
- <comment xml:lang="id">Kode bita Python</comment>
- <comment xml:lang="it">Bytecode Python</comment>
- <comment xml:lang="ja">Python バイトコード</comment>
- <comment xml:lang="kk">Python байткоды</comment>
- <comment xml:lang="ko">파이썬 바이트코드</comment>
- <comment xml:lang="lt">Python baitinis kodas</comment>
- <comment xml:lang="lv">Python bitkods</comment>
- <comment xml:lang="ms">Kodbait Python</comment>
- <comment xml:lang="nb">Python-bytekode</comment>
- <comment xml:lang="nl">Python-bytecode</comment>
- <comment xml:lang="nn">Python-bytekode</comment>
- <comment xml:lang="oc">bytecode Python</comment>
- <comment xml:lang="pl">Kod bajtowy Python</comment>
- <comment xml:lang="pt">código binário Python</comment>
- <comment xml:lang="pt-BR">Código compilado Python</comment>
- <comment xml:lang="ro">Bytecode Python</comment>
- <comment xml:lang="ru">Байт-код Python</comment>
- <comment xml:lang="sk">Bajtový kód Python</comment>
- <comment xml:lang="sl">Datoteka bitne kode Python</comment>
- <comment xml:lang="sq">Bytecode Python</comment>
- <comment xml:lang="sr">Питонов бајтни ко̂д</comment>
- <comment xml:lang="sv">Python-bytekod</comment>
- <comment xml:lang="tr">Python bayt kodu</comment>
- <comment xml:lang="uk">байт-код Python</comment>
+ <comment xml:lang="zh_TW">Python 位元組碼</comment>
+ <comment xml:lang="zh_CN">Python 字节码</comment>
<comment xml:lang="vi">Mã byte Python</comment>
- <comment xml:lang="zh-CN">Python 字节码</comment>
- <comment xml:lang="zh-TW">Python 位元組碼</comment>
- <magic priority="50">
+ <comment xml:lang="uk">байт-код Python</comment>
+ <comment xml:lang="tr">Python bayt kodu</comment>
+ <comment xml:lang="sv">Python-bytekod</comment>
+ <comment xml:lang="sr">Питонов бајтни ко̂д</comment>
+ <comment xml:lang="sl">Datoteka bitne kode Python</comment>
+ <comment xml:lang="si">පයිතන් බයිට්කෝඩ්</comment>
+ <comment xml:lang="sk">Bajtový kód Python</comment>
+ <comment xml:lang="ru">Байт-код Python</comment>
+ <comment xml:lang="ro">Bytecode Python</comment>
+ <comment xml:lang="pt_BR">Código compilado Python</comment>
+ <comment xml:lang="pt">código binário Python</comment>
+ <comment xml:lang="pl">Kod bajtowy Python</comment>
+ <comment xml:lang="oc">bytecode Python</comment>
+ <comment xml:lang="nn">Python-bytekode</comment>
+ <comment xml:lang="nl">Python-bytecode</comment>
+ <comment xml:lang="nb">Python-bytekode</comment>
+ <comment xml:lang="ms">Kodbait Python</comment>
+ <comment xml:lang="lv">Python bitkods</comment>
+ <comment xml:lang="lt">Python baitinis kodas</comment>
+ <comment xml:lang="ko">파이썬 바이트코드</comment>
+ <comment xml:lang="kk">Python байткоды</comment>
+ <comment xml:lang="ja">Python バイトコード</comment>
+ <comment xml:lang="it">Bytecode Python</comment>
+ <comment xml:lang="is">Python bætakóði</comment>
+ <comment xml:lang="id">Kode bita Python</comment>
+ <comment xml:lang="ia">Codice intermediari Python</comment>
+ <comment xml:lang="hu">Python-bájtkód</comment>
+ <comment xml:lang="hr">Python bajt kôd</comment>
+ <comment xml:lang="he">Bytecode של Python</comment>
+ <comment xml:lang="gl">bytecode de Python</comment>
+ <comment xml:lang="ga">beartchód Python</comment>
+ <comment xml:lang="fur">bytecode di Python</comment>
+ <comment xml:lang="fr">bytecode Python</comment>
+ <comment xml:lang="fo">Python býtkota</comment>
+ <comment xml:lang="fi">Python-tavukoodi</comment>
+ <comment xml:lang="eu">Python byte-kodea</comment>
+ <comment xml:lang="es">código intermedio de Python</comment>
+ <comment xml:lang="eo">Python-bajtkodo</comment>
+ <comment xml:lang="en_GB">Python bytecode</comment>
+ <comment xml:lang="el">Συμβολοκώδικας Python</comment>
+ <comment xml:lang="de">Python-Bytecode</comment>
+ <comment xml:lang="da">Python-bytekode</comment>
+ <comment xml:lang="cy">Côd beit Python</comment>
+ <comment xml:lang="cs">bajtový kód Python</comment>
+ <comment xml:lang="ca">bytecode de Python</comment>
+ <comment xml:lang="bg">Байт код — Python</comment>
+ <comment xml:lang="be@latin">Bajtavy kod Python</comment>
+ <comment xml:lang="be">байт-код Python</comment>
+ <comment xml:lang="az">Python bayt kodu</comment>
+ <comment xml:lang="ar">Python bytecode</comment>
+ <comment xml:lang="af">Python binêre kode</comment>
+ <magic>
<match type="big32" value="0x994e0d0a" offset="0"/>
</magic>
<glob pattern="*.pyc"/>
@@ -19190,48 +20269,54 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-qtiplot">
<comment>QtiPlot document</comment>
- <comment xml:lang="af">QtiPlot-dokument</comment>
- <comment xml:lang="ast">Documentu de QtiPlot</comment>
- <comment xml:lang="bg">Документ — QtiPlot</comment>
- <comment xml:lang="ca">document QtiPlot</comment>
- <comment xml:lang="cs">dokument GtiPlot</comment>
- <comment xml:lang="da">QtiPlot-dokument</comment>
- <comment xml:lang="de">QtiPlot-Dokument</comment>
- <comment xml:lang="el">Έγγραφο QtiPlot</comment>
- <comment xml:lang="en-GB">QtiPlot document</comment>
- <comment xml:lang="es">documento de QtiPlot</comment>
- <comment xml:lang="eu">QtiPlot dokumentua</comment>
- <comment xml:lang="fi">QtiPlot-asiakirja</comment>
- <comment xml:lang="fr">document QtiPlot</comment>
- <comment xml:lang="fur">document QtiPlot</comment>
- <comment xml:lang="ga">cáipéis QtiPlot</comment>
- <comment xml:lang="gl">Documento de QtiPilot</comment>
- <comment xml:lang="he">מסמך QtiPlot</comment>
- <comment xml:lang="hr">QtiPlot dokument</comment>
- <comment xml:lang="hu">QtiPlot dokumentum</comment>
- <comment xml:lang="ia">Documento QtiPlot</comment>
- <comment xml:lang="id">Dokumen QtiPlot</comment>
- <comment xml:lang="it">Documento QtiPlot</comment>
- <comment xml:lang="ja">QtiPlot ドキュメント</comment>
- <comment xml:lang="kk">QtiPlot құжаты</comment>
- <comment xml:lang="ko">QtiPlot 문서</comment>
- <comment xml:lang="lv">QtiPlot dokuments</comment>
- <comment xml:lang="oc">document QtiPlot</comment>
- <comment xml:lang="pl">Dokument QtiPlot</comment>
- <comment xml:lang="pt">documento QtiPlot</comment>
- <comment xml:lang="pt-BR">Documento do QtiPlot</comment>
- <comment xml:lang="ru">Документ QtiPlot</comment>
- <comment xml:lang="sk">Dokument QtiPlot</comment>
- <comment xml:lang="sl">Dokument QtiPlot</comment>
- <comment xml:lang="sr">КутиПлот документ</comment>
- <comment xml:lang="sv">QtiPlot-dokument</comment>
- <comment xml:lang="tr">QtiPlot belgesi</comment>
+ <comment xml:lang="zh_TW">QtiPlot 文件</comment>
+ <comment xml:lang="zh_CN">QtiPlot 文档</comment>
<comment xml:lang="uk">документ QtiPlot</comment>
- <comment xml:lang="zh-CN">QtiPlot 文档</comment>
- <comment xml:lang="zh-TW">QtiPlot 文件</comment>
+ <comment xml:lang="tr">QtiPlot belgesi</comment>
+ <comment xml:lang="sv">QtiPlot-dokument</comment>
+ <comment xml:lang="sr">КутиПлот документ</comment>
+ <comment xml:lang="sq">dokument QtiPlot</comment>
+ <comment xml:lang="sl">Dokument QtiPlot</comment>
+ <comment xml:lang="si">QtiPlot ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument QtiPlot</comment>
+ <comment xml:lang="ru">Документ QtiPlot</comment>
+ <comment xml:lang="pt_BR">Documento do QtiPlot</comment>
+ <comment xml:lang="pt">documento QtiPlot</comment>
+ <comment xml:lang="pl">Dokument QtiPlot</comment>
+ <comment xml:lang="oc">document QtiPlot</comment>
+ <comment xml:lang="nl">QtiPlot-document</comment>
+ <comment xml:lang="lv">QtiPlot dokuments</comment>
+ <comment xml:lang="ko">QtiPlot 문서</comment>
+ <comment xml:lang="kk">QtiPlot құжаты</comment>
+ <comment xml:lang="ja">QtiPlot ドキュメント</comment>
+ <comment xml:lang="it">Documento QtiPlot</comment>
+ <comment xml:lang="is">QtiPlot skjal</comment>
+ <comment xml:lang="id">Dokumen QtiPlot</comment>
+ <comment xml:lang="ia">Documento QtiPlot</comment>
+ <comment xml:lang="hu">QtiPlot dokumentum</comment>
+ <comment xml:lang="hr">QtiPlot dokument</comment>
+ <comment xml:lang="he">מסמך QtiPlot</comment>
+ <comment xml:lang="gl">Documento de QtiPilot</comment>
+ <comment xml:lang="ga">cáipéis QtiPlot</comment>
+ <comment xml:lang="fur">document QtiPlot</comment>
+ <comment xml:lang="fr">document QtiPlot</comment>
+ <comment xml:lang="fi">QtiPlot-asiakirja</comment>
+ <comment xml:lang="eu">QtiPlot dokumentua</comment>
+ <comment xml:lang="es">documento de QtiPlot</comment>
+ <comment xml:lang="en_GB">QtiPlot document</comment>
+ <comment xml:lang="el">Έγγραφο QtiPlot</comment>
+ <comment xml:lang="de">QtiPlot-Dokument</comment>
+ <comment xml:lang="da">QtiPlot-dokument</comment>
+ <comment xml:lang="cs">dokument GtiPlot</comment>
+ <comment xml:lang="ca">document QtiPlot</comment>
+ <comment xml:lang="bg">Документ — QtiPlot</comment>
+ <comment xml:lang="be">дакумент QtiPlot</comment>
+ <comment xml:lang="ast">Documentu de QtiPlot</comment>
+ <comment xml:lang="ar">مستند QtiPlot</comment>
+ <comment xml:lang="af">QtiPlot-dokument</comment>
<sub-class-of type="text/plain"/>
<generic-icon name="x-office-document"/>
- <magic priority="50">
+ <magic>
<match value="QtiPlot" type="string" offset="0"/>
</magic>
<glob pattern="*.qti"/>
@@ -19239,56 +20324,59 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-quattropro">
<comment>Quattro Pro spreadsheet</comment>
- <comment xml:lang="af">Quattro Pro-sigblad</comment>
- <comment xml:lang="ar">جدول Quattro Pro</comment>
- <comment xml:lang="be-Latn">Raźlikovy arkuš Quattro Pro</comment>
- <comment xml:lang="bg">Таблица — Quattro Pro</comment>
- <comment xml:lang="ca">full de càlcul de Quattro Pro</comment>
- <comment xml:lang="cs">sešit Quattro Pro</comment>
- <comment xml:lang="da">Quattro Pro-regneark</comment>
- <comment xml:lang="de">Quattro-Pro-Tabelle</comment>
- <comment xml:lang="el">Λογιστικό φύλλο Quattro Pro</comment>
- <comment xml:lang="en-GB">Quattro Pro spreadsheet</comment>
- <comment xml:lang="eo">sterntabelo de Quattro Pro</comment>
- <comment xml:lang="es">hoja de cálculo de Quattro Pro</comment>
- <comment xml:lang="eu">Quattro Pro kalkulu-orria</comment>
- <comment xml:lang="fi">Quattro Pro -taulukko</comment>
- <comment xml:lang="fo">Quattro Pro rokniark</comment>
- <comment xml:lang="fr">feuille de calcul Quattro Pro</comment>
- <comment xml:lang="fur">sfuei di calcul Quattro Pro</comment>
- <comment xml:lang="ga">scarbhileog Quattro Pro</comment>
- <comment xml:lang="gl">folla de cálculo Quattro Pro</comment>
- <comment xml:lang="he">גליון נתונים של Quattro Pro</comment>
- <comment xml:lang="hr">Quattro Pro proračunska tablica</comment>
- <comment xml:lang="hu">Quattro Pro-munkafüzet</comment>
- <comment xml:lang="ia">Folio de calculo Quattro Pro</comment>
- <comment xml:lang="id">Lembar sebar Quattro Pro</comment>
- <comment xml:lang="it">Foglio di calcolo Quattro Pro</comment>
- <comment xml:lang="ja">Quattro Pro スプレッドシート</comment>
- <comment xml:lang="kk">Quattro Pro электрондық кестесі</comment>
- <comment xml:lang="ko">Quattro Pro 스프레드시트</comment>
- <comment xml:lang="lt">Quattro Pro skaičialentė</comment>
- <comment xml:lang="lv">Quattro Pro izklājlapa</comment>
- <comment xml:lang="ms">Hamparan Quatro Pro</comment>
- <comment xml:lang="nb">Quattro Pro-regneark</comment>
- <comment xml:lang="nl">Quattro Pro-rekenblad</comment>
- <comment xml:lang="nn">Quattro Pro-rekneark</comment>
- <comment xml:lang="oc">fuèlh de calcul Quattro Pro</comment>
- <comment xml:lang="pl">Arkusz Quattro Pro</comment>
- <comment xml:lang="pt">folha de cálculo Quattro Pro</comment>
- <comment xml:lang="pt-BR">Planilha do Quattro Pro</comment>
- <comment xml:lang="ro">Foaie de calcul Quattro Pro</comment>
- <comment xml:lang="ru">Электронная таблица Quattro Pro</comment>
- <comment xml:lang="sk">Zošit Quattro Pro</comment>
- <comment xml:lang="sl">Preglednica Quattro Pro</comment>
- <comment xml:lang="sq">Fletë llogaritjesh Quattro Pro</comment>
- <comment xml:lang="sr">Кватро Про табела</comment>
- <comment xml:lang="sv">Quattro Pro-kalkylblad</comment>
- <comment xml:lang="tr">Quattro Pro hesap çizelgesi</comment>
- <comment xml:lang="uk">ел. таблиця Quattro Pro</comment>
+ <comment xml:lang="zh_TW">Quattro Pro 試算表</comment>
+ <comment xml:lang="zh_CN">Quattro Pro 电子表格</comment>
<comment xml:lang="vi">Bảng tính Quattro Pro</comment>
- <comment xml:lang="zh-CN">Quattro Pro 电子表格</comment>
- <comment xml:lang="zh-TW">Quattro Pro 試算表</comment>
+ <comment xml:lang="uk">електронна таблиця Quattro Pro</comment>
+ <comment xml:lang="tr">Quattro Pro hesap çizelgesi</comment>
+ <comment xml:lang="sv">Quattro Pro-kalkylblad</comment>
+ <comment xml:lang="sr">Кватро Про табела</comment>
+ <comment xml:lang="sq">fletëllogaritje Quattro Pro</comment>
+ <comment xml:lang="sl">Preglednica Quattro Pro</comment>
+ <comment xml:lang="si">Quattro Pro පැතුරුම්පත</comment>
+ <comment xml:lang="sk">Zošit Quattro Pro</comment>
+ <comment xml:lang="ru">Электронная таблица Quattro Pro</comment>
+ <comment xml:lang="ro">Foaie de calcul Quattro Pro</comment>
+ <comment xml:lang="pt_BR">Planilha do Quattro Pro</comment>
+ <comment xml:lang="pt">folha de cálculo Quattro Pro</comment>
+ <comment xml:lang="pl">Arkusz Quattro Pro</comment>
+ <comment xml:lang="oc">fuèlh de calcul Quattro Pro</comment>
+ <comment xml:lang="nn">Quattro Pro-rekneark</comment>
+ <comment xml:lang="nl">Quattro Pro-rekenblad</comment>
+ <comment xml:lang="nb">Quattro Pro-regneark</comment>
+ <comment xml:lang="ms">Hamparan Quatro Pro</comment>
+ <comment xml:lang="lv">Quattro Pro izklājlapa</comment>
+ <comment xml:lang="lt">Quattro Pro skaičialentė</comment>
+ <comment xml:lang="ko">Quattro Pro 스프레드시트</comment>
+ <comment xml:lang="kk">Quattro Pro электрондық кестесі</comment>
+ <comment xml:lang="ja">Quattro Pro スプレッドシート</comment>
+ <comment xml:lang="it">Foglio di calcolo Quattro Pro</comment>
+ <comment xml:lang="is">Quattro Pro töflureikniskjal</comment>
+ <comment xml:lang="id">Lembar sebar Quattro Pro</comment>
+ <comment xml:lang="ia">Folio de calculo Quattro Pro</comment>
+ <comment xml:lang="hu">Quattro Pro-munkafüzet</comment>
+ <comment xml:lang="hr">Quattro Pro proračunska tablica</comment>
+ <comment xml:lang="he">גיליון נתונים של Quattro Pro</comment>
+ <comment xml:lang="gl">folla de cálculo Quattro Pro</comment>
+ <comment xml:lang="ga">scarbhileog Quattro Pro</comment>
+ <comment xml:lang="fur">sfuei di calcul Quattro Pro</comment>
+ <comment xml:lang="fr">feuille de calcul Quattro Pro</comment>
+ <comment xml:lang="fo">Quattro Pro rokniark</comment>
+ <comment xml:lang="fi">Quattro Pro -taulukko</comment>
+ <comment xml:lang="eu">Quattro Pro kalkulu-orria</comment>
+ <comment xml:lang="es">hoja de cálculo de Quattro Pro</comment>
+ <comment xml:lang="eo">sterntabelo de Quattro Pro</comment>
+ <comment xml:lang="en_GB">Quattro Pro spreadsheet</comment>
+ <comment xml:lang="el">Λογιστικό φύλλο Quattro Pro</comment>
+ <comment xml:lang="de">Quattro-Pro-Tabelle</comment>
+ <comment xml:lang="da">Quattro Pro-regneark</comment>
+ <comment xml:lang="cs">sešit Quattro Pro</comment>
+ <comment xml:lang="ca">full de càlcul de Quattro Pro</comment>
+ <comment xml:lang="bg">Таблица — Quattro Pro</comment>
+ <comment xml:lang="be@latin">Raźlikovy arkuš Quattro Pro</comment>
+ <comment xml:lang="be">электронная табліца Quattro Pro</comment>
+ <comment xml:lang="ar">جدول Quattro Pro</comment>
+ <comment xml:lang="af">Quattro Pro-sigblad</comment>
<generic-icon name="x-office-spreadsheet"/>
<glob pattern="*.wb1"/>
<glob pattern="*.wb2"/>
@@ -19296,30 +20384,41 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-quicktime-media-link">
<comment>QuickTime playlist</comment>
- <comment xml:lang="bg">Списък за изпълнение — QuickTime</comment>
- <comment xml:lang="ca">llista de reproducció QuickTime</comment>
- <comment xml:lang="da">QuickTime-afspilningsliste</comment>
- <comment xml:lang="de">QuickTime-Wiedergabeliste</comment>
- <comment xml:lang="en-GB">QuickTime playlist</comment>
- <comment xml:lang="es">lista de reproducción de QuickTime</comment>
- <comment xml:lang="eu">QuickTime erreprodukzio-zerrenda</comment>
- <comment xml:lang="fi">QuickTime-soittolista</comment>
- <comment xml:lang="fr">liste de lecture QuickTime</comment>
- <comment xml:lang="hr">QuickTime popis izvođenja</comment>
- <comment xml:lang="hu">QuickTime lejátszólista</comment>
- <comment xml:lang="id">Daftar putar QuickTime</comment>
- <comment xml:lang="it">Playlist QuickTime</comment>
- <comment xml:lang="kk">QuickTime ойнау тізімі</comment>
- <comment xml:lang="ko">퀵타임 재생 목록</comment>
- <comment xml:lang="pl">Lista odtwarzania QuickTime</comment>
- <comment xml:lang="pt-BR">Lista de reprodução do QuickTime</comment>
- <comment xml:lang="ru">Список воспроизведения QuickTime</comment>
- <comment xml:lang="sk">Zoznam skladieb QuickTime</comment>
- <comment xml:lang="sv">QuickTime-spellista</comment>
- <comment xml:lang="tr">QuickTime çalma listesi</comment>
+ <comment xml:lang="zh_TW">QuickTime 播放清單</comment>
+ <comment xml:lang="zh_CN">QuickTime 播放列表</comment>
<comment xml:lang="uk">список відтворення QuickTime</comment>
- <comment xml:lang="zh-CN">QuickTime 播放列表</comment>
- <comment xml:lang="zh-TW">QuickTime 播放清單</comment>
+ <comment xml:lang="tr">QuickTime çalma listesi</comment>
+ <comment xml:lang="sv">QuickTime-spellista</comment>
+ <comment xml:lang="sq">luajlistë QuickTime</comment>
+ <comment xml:lang="sl">Seznam predvajanja QuickTime</comment>
+ <comment xml:lang="si">QuickTime ධාවන ලැයිස්තුව</comment>
+ <comment xml:lang="sk">Zoznam skladieb QuickTime</comment>
+ <comment xml:lang="ru">Список воспроизведения QuickTime</comment>
+ <comment xml:lang="pt_BR">Lista de reprodução do QuickTime</comment>
+ <comment xml:lang="pl">Lista odtwarzania QuickTime</comment>
+ <comment xml:lang="oc">lista de lectura QuickTime</comment>
+ <comment xml:lang="nl">QuickTime-afspeellijst</comment>
+ <comment xml:lang="ko">퀵타임 재생 목록</comment>
+ <comment xml:lang="kk">QuickTime ойнау тізімі</comment>
+ <comment xml:lang="ka">QuickTime დასაკრავი სია</comment>
+ <comment xml:lang="ja">QuickTime プレイリスト</comment>
+ <comment xml:lang="it">Playlist QuickTime</comment>
+ <comment xml:lang="is">QuickTime spilunarlisti</comment>
+ <comment xml:lang="id">Daftar putar QuickTime</comment>
+ <comment xml:lang="hu">QuickTime lejátszólista</comment>
+ <comment xml:lang="hr">QuickTime popis izvođenja</comment>
+ <comment xml:lang="he">רשימת השמעה של QuickTime</comment>
+ <comment xml:lang="fr">liste de lecture QuickTime</comment>
+ <comment xml:lang="fi">QuickTime-soittolista</comment>
+ <comment xml:lang="eu">QuickTime erreprodukzio-zerrenda</comment>
+ <comment xml:lang="es">lista de reproducción de QuickTime</comment>
+ <comment xml:lang="en_GB">QuickTime playlist</comment>
+ <comment xml:lang="de">QuickTime-Wiedergabeliste</comment>
+ <comment xml:lang="da">QuickTime-afspilningsliste</comment>
+ <comment xml:lang="ca">llista de reproducció QuickTime</comment>
+ <comment xml:lang="bg">Списък за изпълнение — QuickTime</comment>
+ <comment xml:lang="be">плэй-ліст QuickTime</comment>
+ <comment xml:lang="ar">قائمة تشغيل كويك تايم</comment>
<generic-icon name="video-x-generic"/>
<sub-class-of type="video/quicktime"/>
<alias type="application/x-quicktimeplayer"/>
@@ -19335,115 +20434,121 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-qw">
<comment>Quicken document</comment>
- <comment xml:lang="af">Quicken-dokument</comment>
- <comment xml:lang="ar">مستند Quicken</comment>
- <comment xml:lang="ast">Documentu de Quicken</comment>
- <comment xml:lang="az">Quicken sənədi</comment>
- <comment xml:lang="be-Latn">Dakument Quicken</comment>
- <comment xml:lang="bg">Документ — Quicken</comment>
- <comment xml:lang="ca">document Quicken</comment>
- <comment xml:lang="cs">dokument Quicken</comment>
- <comment xml:lang="cy">Dogfen Quicken</comment>
- <comment xml:lang="da">Quickendokument</comment>
- <comment xml:lang="de">Quicken-Dokument</comment>
- <comment xml:lang="el">Έγγραφο Quicken</comment>
- <comment xml:lang="en-GB">Quicken document</comment>
- <comment xml:lang="eo">Quicken-dokumento</comment>
- <comment xml:lang="es">documento de Quicken</comment>
- <comment xml:lang="eu">Quicken dokumentua</comment>
- <comment xml:lang="fi">Quicken-asiakirja</comment>
- <comment xml:lang="fo">Quicken skjal</comment>
- <comment xml:lang="fr">document Quicken</comment>
- <comment xml:lang="fur">document Quicken</comment>
- <comment xml:lang="ga">cáipéis Quicken</comment>
- <comment xml:lang="gl">documento de Quicken</comment>
- <comment xml:lang="he">מסמך של Quicken</comment>
- <comment xml:lang="hr">Quicken dokument</comment>
- <comment xml:lang="hu">Quicken-dokumentum</comment>
- <comment xml:lang="ia">Documento Quicken</comment>
- <comment xml:lang="id">Dokumen Quicken</comment>
- <comment xml:lang="it">Documento Quicken</comment>
- <comment xml:lang="ja">Quicken ドキュメント</comment>
- <comment xml:lang="kk">Quicken құжаты</comment>
- <comment xml:lang="ko">Quicken 문서</comment>
- <comment xml:lang="lt">Quicken dokumentas</comment>
- <comment xml:lang="lv">Quicken dokuments</comment>
- <comment xml:lang="ms">Dokumen Quicken</comment>
- <comment xml:lang="nb">Quicken-dokument</comment>
- <comment xml:lang="nl">Quicken-document</comment>
- <comment xml:lang="nn">Quicken-dokument</comment>
- <comment xml:lang="oc">document Quicken</comment>
- <comment xml:lang="pl">Dokument Quicken</comment>
- <comment xml:lang="pt">documento Quicken</comment>
- <comment xml:lang="pt-BR">Documento do Quicken</comment>
- <comment xml:lang="ro">Document Quicken</comment>
- <comment xml:lang="ru">Документ Quicken</comment>
- <comment xml:lang="sk">Dokument Quicken</comment>
- <comment xml:lang="sl">Dokument Quicken</comment>
- <comment xml:lang="sq">Dokument Quicken</comment>
- <comment xml:lang="sr">Квикен документ</comment>
- <comment xml:lang="sv">Quicken-dokument</comment>
- <comment xml:lang="tr">Quicken belgesi</comment>
- <comment xml:lang="uk">документ Quicken</comment>
+ <comment xml:lang="zh_TW">Quicken 文件</comment>
+ <comment xml:lang="zh_CN">Quicken 文档</comment>
<comment xml:lang="vi">Tài liệu Quicken</comment>
- <comment xml:lang="zh-CN">Quicken 文档</comment>
- <comment xml:lang="zh-TW">Quicken 文件</comment>
+ <comment xml:lang="uk">документ Quicken</comment>
+ <comment xml:lang="tr">Quicken belgesi</comment>
+ <comment xml:lang="sv">Quicken-dokument</comment>
+ <comment xml:lang="sr">Квикен документ</comment>
+ <comment xml:lang="sq">dokument Quicken</comment>
+ <comment xml:lang="sl">Dokument Quicken</comment>
+ <comment xml:lang="si">ඉක්මන් ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument Quicken</comment>
+ <comment xml:lang="ru">Документ Quicken</comment>
+ <comment xml:lang="ro">Document Quicken</comment>
+ <comment xml:lang="pt_BR">Documento do Quicken</comment>
+ <comment xml:lang="pt">documento Quicken</comment>
+ <comment xml:lang="pl">Dokument Quicken</comment>
+ <comment xml:lang="oc">document Quicken</comment>
+ <comment xml:lang="nn">Quicken-dokument</comment>
+ <comment xml:lang="nl">Quicken-document</comment>
+ <comment xml:lang="nb">Quicken-dokument</comment>
+ <comment xml:lang="ms">Dokumen Quicken</comment>
+ <comment xml:lang="lv">Quicken dokuments</comment>
+ <comment xml:lang="lt">Quicken dokumentas</comment>
+ <comment xml:lang="ko">Quicken 문서</comment>
+ <comment xml:lang="kk">Quicken құжаты</comment>
+ <comment xml:lang="ja">Quicken ドキュメント</comment>
+ <comment xml:lang="it">Documento Quicken</comment>
+ <comment xml:lang="is">Quicken skjal</comment>
+ <comment xml:lang="id">Dokumen Quicken</comment>
+ <comment xml:lang="ia">Documento Quicken</comment>
+ <comment xml:lang="hu">Quicken-dokumentum</comment>
+ <comment xml:lang="hr">Quicken dokument</comment>
+ <comment xml:lang="he">מסמך של Quicken</comment>
+ <comment xml:lang="gl">documento de Quicken</comment>
+ <comment xml:lang="ga">cáipéis Quicken</comment>
+ <comment xml:lang="fur">document Quicken</comment>
+ <comment xml:lang="fr">document Quicken</comment>
+ <comment xml:lang="fo">Quicken skjal</comment>
+ <comment xml:lang="fi">Quicken-asiakirja</comment>
+ <comment xml:lang="eu">Quicken dokumentua</comment>
+ <comment xml:lang="es">documento de Quicken</comment>
+ <comment xml:lang="eo">Quicken-dokumento</comment>
+ <comment xml:lang="en_GB">Quicken document</comment>
+ <comment xml:lang="el">Έγγραφο Quicken</comment>
+ <comment xml:lang="de">Quicken-Dokument</comment>
+ <comment xml:lang="da">Quickendokument</comment>
+ <comment xml:lang="cy">Dogfen Quicken</comment>
+ <comment xml:lang="cs">dokument Quicken</comment>
+ <comment xml:lang="ca">document Quicken</comment>
+ <comment xml:lang="bg">Документ — Quicken</comment>
+ <comment xml:lang="be@latin">Dakument Quicken</comment>
+ <comment xml:lang="be">дакумент Quicken</comment>
+ <comment xml:lang="az">Quicken sənədi</comment>
+ <comment xml:lang="ast">Documentu de Quicken</comment>
+ <comment xml:lang="ar">مستند Quicken</comment>
+ <comment xml:lang="af">Quicken-dokument</comment>
<generic-icon name="x-office-spreadsheet"/>
<glob pattern="*.qif"/>
</mime-type>
<mime-type type="application/vnd.rar">
<comment>RAR archive</comment>
- <comment xml:lang="af">RAR-argief</comment>
- <comment xml:lang="ar">أرشيف RAR</comment>
- <comment xml:lang="be-Latn">Archiŭ RAR</comment>
- <comment xml:lang="bg">Архив — RAR</comment>
- <comment xml:lang="ca">arxiu RAR</comment>
- <comment xml:lang="cs">archiv RAR</comment>
- <comment xml:lang="cy">Archif RAR</comment>
- <comment xml:lang="da">RAR-arkiv</comment>
- <comment xml:lang="de">RAR-Archiv</comment>
- <comment xml:lang="el">Συμπιεσμένο αρχείο RAR</comment>
- <comment xml:lang="en-GB">RAR archive</comment>
- <comment xml:lang="eo">RAR-arkivo</comment>
- <comment xml:lang="es">archivador RAR</comment>
- <comment xml:lang="eu">RAR artxiboa</comment>
- <comment xml:lang="fi">RAR-arkisto</comment>
- <comment xml:lang="fo">RAR skjalasavn</comment>
- <comment xml:lang="fr">archive RAR</comment>
- <comment xml:lang="fur">archivi RAR</comment>
- <comment xml:lang="ga">cartlann RAR</comment>
- <comment xml:lang="gl">ficheiro RAR</comment>
- <comment xml:lang="he">ארכיון RAR</comment>
- <comment xml:lang="hr">RAR arhiva</comment>
- <comment xml:lang="hu">RAR-archívum</comment>
- <comment xml:lang="ia">Archivo RAR</comment>
- <comment xml:lang="id">Arsip RAR</comment>
- <comment xml:lang="it">Archivio RAR</comment>
- <comment xml:lang="ja">RAR アーカイブ</comment>
- <comment xml:lang="kk">RAR архиві</comment>
- <comment xml:lang="ko">RAR 압축 파일</comment>
- <comment xml:lang="lt">RAR archyvas</comment>
- <comment xml:lang="lv">RAR arhīvs</comment>
- <comment xml:lang="ms">Arkib RAR</comment>
- <comment xml:lang="nb">RAR-arkiv</comment>
- <comment xml:lang="nl">RAR-archief</comment>
- <comment xml:lang="nn">RAR-arkiv</comment>
- <comment xml:lang="oc">archiu RAR</comment>
- <comment xml:lang="pl">Archiwum RAR</comment>
- <comment xml:lang="pt">arquivo RAR</comment>
- <comment xml:lang="pt-BR">Pacote RAR</comment>
- <comment xml:lang="ro">Arhivă RAR</comment>
- <comment xml:lang="ru">Архив RAR</comment>
- <comment xml:lang="sk">Archív RAR</comment>
- <comment xml:lang="sl">Datoteka arhiva RAR</comment>
- <comment xml:lang="sq">Arkiv RAR</comment>
- <comment xml:lang="sr">РАР архива</comment>
- <comment xml:lang="sv">RAR-arkiv</comment>
- <comment xml:lang="tr">RAR arşivi</comment>
- <comment xml:lang="uk">архів RAR</comment>
+ <comment xml:lang="zh_TW">RAR 封存檔</comment>
+ <comment xml:lang="zh_CN">RAR 归档文件</comment>
<comment xml:lang="vi">Kho nén RAR</comment>
- <comment xml:lang="zh-CN">RAR 归档文件</comment>
- <comment xml:lang="zh-TW">RAR 封存檔</comment>
+ <comment xml:lang="uk">архів RAR</comment>
+ <comment xml:lang="tr">RAR arşivi</comment>
+ <comment xml:lang="sv">RAR-arkiv</comment>
+ <comment xml:lang="sr">РАР архива</comment>
+ <comment xml:lang="sq">arkiv RAR</comment>
+ <comment xml:lang="sl">Datoteka arhiva RAR</comment>
+ <comment xml:lang="si">RAR ලේඛනාගාරය</comment>
+ <comment xml:lang="sk">Archív RAR</comment>
+ <comment xml:lang="ru">Архив RAR</comment>
+ <comment xml:lang="ro">Arhivă RAR</comment>
+ <comment xml:lang="pt_BR">Pacote RAR</comment>
+ <comment xml:lang="pt">arquivo RAR</comment>
+ <comment xml:lang="pl">Archiwum RAR</comment>
+ <comment xml:lang="oc">archiu RAR</comment>
+ <comment xml:lang="nn">RAR-arkiv</comment>
+ <comment xml:lang="nl">RAR-archief</comment>
+ <comment xml:lang="nb">RAR-arkiv</comment>
+ <comment xml:lang="ms">Arkib RAR</comment>
+ <comment xml:lang="lv">RAR arhīvs</comment>
+ <comment xml:lang="lt">RAR archyvas</comment>
+ <comment xml:lang="ko">RAR 압축 파일</comment>
+ <comment xml:lang="kk">RAR архиві</comment>
+ <comment xml:lang="ja">RAR アーカイブ</comment>
+ <comment xml:lang="it">Archivio RAR</comment>
+ <comment xml:lang="is">RAR safnskrá</comment>
+ <comment xml:lang="id">Arsip RAR</comment>
+ <comment xml:lang="ia">Archivo RAR</comment>
+ <comment xml:lang="hu">RAR-archívum</comment>
+ <comment xml:lang="hr">RAR arhiva</comment>
+ <comment xml:lang="he">ארכיון RAR</comment>
+ <comment xml:lang="gl">ficheiro RAR</comment>
+ <comment xml:lang="ga">cartlann RAR</comment>
+ <comment xml:lang="fur">archivi RAR</comment>
+ <comment xml:lang="fr">archive RAR</comment>
+ <comment xml:lang="fo">RAR skjalasavn</comment>
+ <comment xml:lang="fi">RAR-arkisto</comment>
+ <comment xml:lang="eu">RAR artxiboa</comment>
+ <comment xml:lang="es">archivador RAR</comment>
+ <comment xml:lang="eo">RAR-arkivo</comment>
+ <comment xml:lang="en_GB">RAR archive</comment>
+ <comment xml:lang="el">Συμπιεσμένο αρχείο RAR</comment>
+ <comment xml:lang="de">RAR-Archiv</comment>
+ <comment xml:lang="da">RAR-arkiv</comment>
+ <comment xml:lang="cy">Archif RAR</comment>
+ <comment xml:lang="cs">archiv RAR</comment>
+ <comment xml:lang="ca">arxiu RAR</comment>
+ <comment xml:lang="bg">Архив — RAR</comment>
+ <comment xml:lang="be@latin">Archiŭ RAR</comment>
+ <comment xml:lang="be">архіў RAR</comment>
+ <comment xml:lang="ar">أرشيف RAR</comment>
+ <comment xml:lang="af">RAR-argief</comment>
<acronym>RAR</acronym>
<expanded-acronym>Roshal ARchive</expanded-acronym>
<alias type="application/x-rar"/>
@@ -19456,56 +20561,61 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-dar">
<comment>DAR archive</comment>
- <comment xml:lang="af">DAR-argief</comment>
- <comment xml:lang="ar">أرشيف DAR</comment>
- <comment xml:lang="be-Latn">Archiŭ DAR</comment>
- <comment xml:lang="bg">Архив — DAR</comment>
- <comment xml:lang="ca">arxiu DAR</comment>
- <comment xml:lang="cs">archiv DAR</comment>
- <comment xml:lang="da">DAR-arkiv</comment>
- <comment xml:lang="de">DAR-Archiv</comment>
- <comment xml:lang="el">Συμπιεσμένο αρχείο DAR</comment>
- <comment xml:lang="en-GB">DAR archive</comment>
- <comment xml:lang="eo">DAR-arkivo</comment>
- <comment xml:lang="es">archivador DAR</comment>
- <comment xml:lang="eu">DAR artxiboa</comment>
- <comment xml:lang="fi">DAR-arkisto</comment>
- <comment xml:lang="fo">DAR skjalasavn</comment>
- <comment xml:lang="fr">archive DAR</comment>
- <comment xml:lang="fur">archivi DAR</comment>
- <comment xml:lang="ga">cartlann DAR</comment>
- <comment xml:lang="gl">arquivo DAR</comment>
- <comment xml:lang="he">ארכיון DAR</comment>
- <comment xml:lang="hr">DAR arhiva</comment>
- <comment xml:lang="hu">DAR archívum</comment>
- <comment xml:lang="ia">Archivo DAR</comment>
- <comment xml:lang="id">Arsip DAR</comment>
- <comment xml:lang="it">Archivio DAR</comment>
- <comment xml:lang="ja">DAR アーカイブ</comment>
- <comment xml:lang="ka">DAR არქივი</comment>
- <comment xml:lang="kk">DAR архиві</comment>
- <comment xml:lang="ko">DAR 묶음 파일</comment>
- <comment xml:lang="lt">DAR archyvas</comment>
- <comment xml:lang="lv">DAR arhīvs</comment>
- <comment xml:lang="nb">DAR-arkiv</comment>
- <comment xml:lang="nl">DAR-archief</comment>
- <comment xml:lang="nn">DAR-arkiv</comment>
- <comment xml:lang="oc">archiu DAR</comment>
- <comment xml:lang="pl">Archiwum DAR</comment>
- <comment xml:lang="pt">arquivo DAR</comment>
- <comment xml:lang="pt-BR">Pacote DAR</comment>
- <comment xml:lang="ro">Arhivă DAR</comment>
- <comment xml:lang="ru">Архив DAR</comment>
- <comment xml:lang="sk">Archív DAR</comment>
- <comment xml:lang="sl">Datoteka arhiva DAR</comment>
- <comment xml:lang="sq">Arkiv DAR</comment>
- <comment xml:lang="sr">ДАР архива</comment>
- <comment xml:lang="sv">DAR-arkiv</comment>
- <comment xml:lang="tr">DAR arşivi</comment>
- <comment xml:lang="uk">архів DAR</comment>
+ <comment xml:lang="zh_TW">DAR 封存檔</comment>
+ <comment xml:lang="zh_CN">DAR 归档文件</comment>
<comment xml:lang="vi">Kho nén DAR</comment>
- <comment xml:lang="zh-CN">DAR 归档文件</comment>
- <comment xml:lang="zh-TW">DAR 封存檔</comment>
+ <comment xml:lang="uk">архів DAR</comment>
+ <comment xml:lang="tr">DAR arşivi</comment>
+ <comment xml:lang="sv">DAR-arkiv</comment>
+ <comment xml:lang="sr">ДАР архива</comment>
+ <comment xml:lang="sq">arkiv DAR</comment>
+ <comment xml:lang="sl">Datoteka arhiva DAR</comment>
+ <comment xml:lang="si">DAR ලේඛනාගාරය</comment>
+ <comment xml:lang="sk">Archív DAR</comment>
+ <comment xml:lang="ru">Архив DAR</comment>
+ <comment xml:lang="ro">Arhivă DAR</comment>
+ <comment xml:lang="pt_BR">Pacote DAR</comment>
+ <comment xml:lang="pt">arquivo DAR</comment>
+ <comment xml:lang="pl">Archiwum DAR</comment>
+ <comment xml:lang="oc">archiu DAR</comment>
+ <comment xml:lang="nn">DAR-arkiv</comment>
+ <comment xml:lang="nl">DAR-archief</comment>
+ <comment xml:lang="nb">DAR-arkiv</comment>
+ <comment xml:lang="lv">DAR arhīvs</comment>
+ <comment xml:lang="lt">DAR archyvas</comment>
+ <comment xml:lang="ko">DAR 묶음 파일</comment>
+ <comment xml:lang="kk">DAR архиві</comment>
+ <comment xml:lang="ka">DAR არქივი</comment>
+ <comment xml:lang="ja">DAR アーカイブ</comment>
+ <comment xml:lang="it">Archivio DAR</comment>
+ <comment xml:lang="is">DAR safnskrá</comment>
+ <comment xml:lang="id">Arsip DAR</comment>
+ <comment xml:lang="ia">Archivo DAR</comment>
+ <comment xml:lang="hu">DAR archívum</comment>
+ <comment xml:lang="hr">DAR arhiva</comment>
+ <comment xml:lang="he">ארכיון DAR</comment>
+ <comment xml:lang="gl">arquivo DAR</comment>
+ <comment xml:lang="ga">cartlann DAR</comment>
+ <comment xml:lang="fur">archivi DAR</comment>
+ <comment xml:lang="fr">archive DAR</comment>
+ <comment xml:lang="fo">DAR skjalasavn</comment>
+ <comment xml:lang="fi">DAR-arkisto</comment>
+ <comment xml:lang="eu">DAR artxiboa</comment>
+ <comment xml:lang="es">archivador DAR</comment>
+ <comment xml:lang="eo">DAR-arkivo</comment>
+ <comment xml:lang="en_GB">DAR archive</comment>
+ <comment xml:lang="el">Συμπιεσμένο αρχείο DAR</comment>
+ <comment xml:lang="de">DAR-Archiv</comment>
+ <comment xml:lang="da">DAR-arkiv</comment>
+ <comment xml:lang="cs">archiv DAR</comment>
+ <comment xml:lang="ca">arxiu DAR</comment>
+ <comment xml:lang="bg">Архив — DAR</comment>
+ <comment xml:lang="be@latin">Archiŭ DAR</comment>
+ <comment xml:lang="be">архіў DAR</comment>
+ <comment xml:lang="ar">أرشيف DAR</comment>
+ <comment xml:lang="af">DAR-argief</comment>
+ <acronym>DAR</acronym>
+ <expanded-acronym>Disk ARchive</expanded-acronym>
<generic-icon name="package-x-generic"/>
<magic>
<match type="big32" value="123" offset="0"/>
@@ -19514,113 +20624,77 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-alz">
<comment>Alzip archive</comment>
- <comment xml:lang="af">Alzip-argief</comment>
- <comment xml:lang="ar">أرشيف Alzip</comment>
- <comment xml:lang="be-Latn">Archiŭ Alzip</comment>
- <comment xml:lang="bg">Архив — alzip</comment>
- <comment xml:lang="ca">arxiu Alzip</comment>
- <comment xml:lang="cs">archiv Alzip</comment>
- <comment xml:lang="da">Alzip-arkiv</comment>
- <comment xml:lang="de">Alzip-Archiv</comment>
- <comment xml:lang="el">Συμπιεσμένο αρχείο Alzip</comment>
- <comment xml:lang="en-GB">Alzip archive</comment>
- <comment xml:lang="eo">Alzip-arkivo</comment>
- <comment xml:lang="es">archivador Alzip</comment>
- <comment xml:lang="eu">Alzip artxiboa</comment>
- <comment xml:lang="fi">Alzip-arkisto</comment>
- <comment xml:lang="fo">Alsip skjalasavn</comment>
- <comment xml:lang="fr">archive alzip</comment>
- <comment xml:lang="fur">archivi Alzip</comment>
- <comment xml:lang="ga">cartlann Alzip</comment>
- <comment xml:lang="gl">arquivo Alzip</comment>
- <comment xml:lang="he">ארכיון Alzip</comment>
- <comment xml:lang="hr">Alzip arhiva</comment>
- <comment xml:lang="hu">Alzip archívum</comment>
- <comment xml:lang="ia">Archivo Alzip</comment>
- <comment xml:lang="id">Arsip Alzip</comment>
- <comment xml:lang="it">Archivio Alzip</comment>
- <comment xml:lang="ja">Alzip アーカイブ</comment>
- <comment xml:lang="ka">Alzip არქივი</comment>
- <comment xml:lang="kk">Alzip архиві</comment>
- <comment xml:lang="ko">알집 압축 파일</comment>
- <comment xml:lang="lt">Alzip archyvas</comment>
- <comment xml:lang="lv">Alzip arhīvs</comment>
- <comment xml:lang="nb">Alzip-arkiv</comment>
- <comment xml:lang="nl">Alzip-archief</comment>
- <comment xml:lang="nn">Alzip-arkiv</comment>
- <comment xml:lang="oc">archiu alzip</comment>
- <comment xml:lang="pl">Archiwum alzip</comment>
- <comment xml:lang="pt">arquivo Alzip</comment>
- <comment xml:lang="pt-BR">Pacote Alzip</comment>
- <comment xml:lang="ro">Arhivă Alzip</comment>
- <comment xml:lang="ru">Архив ALZIP</comment>
- <comment xml:lang="sk">Archív Alzip</comment>
- <comment xml:lang="sl">Datoteka arhiva Alzip</comment>
- <comment xml:lang="sq">Arkiv Alzip</comment>
- <comment xml:lang="sr">Алзип архива</comment>
- <comment xml:lang="sv">Alzip-arkiv</comment>
- <comment xml:lang="tr">Alzip arşivi</comment>
- <comment xml:lang="uk">архів Alzip</comment>
+ <comment xml:lang="zh_TW">Alzip 封存檔</comment>
+ <comment xml:lang="zh_CN">Alzip 归档文件</comment>
<comment xml:lang="vi">Kho nén Alzip</comment>
- <comment xml:lang="zh-CN">Alzip 归档文件</comment>
- <comment xml:lang="zh-TW">Alzip 封存檔</comment>
+ <comment xml:lang="uk">архів Alzip</comment>
+ <comment xml:lang="tr">Alzip arşivi</comment>
+ <comment xml:lang="sv">Alzip-arkiv</comment>
+ <comment xml:lang="sr">Алзип архива</comment>
+ <comment xml:lang="sq">arkiv Alzip</comment>
+ <comment xml:lang="sl">Datoteka arhiva Alzip</comment>
+ <comment xml:lang="si">Alzip සංරක්ෂිතය</comment>
+ <comment xml:lang="sk">Archív Alzip</comment>
+ <comment xml:lang="ru">Архив ALZIP</comment>
+ <comment xml:lang="ro">Arhivă Alzip</comment>
+ <comment xml:lang="pt_BR">Pacote Alzip</comment>
+ <comment xml:lang="pt">arquivo Alzip</comment>
+ <comment xml:lang="pl">Archiwum alzip</comment>
+ <comment xml:lang="oc">archiu alzip</comment>
+ <comment xml:lang="nn">Alzip-arkiv</comment>
+ <comment xml:lang="nl">Alzip-archief</comment>
+ <comment xml:lang="nb">Alzip-arkiv</comment>
+ <comment xml:lang="lv">Alzip arhīvs</comment>
+ <comment xml:lang="lt">Alzip archyvas</comment>
+ <comment xml:lang="ko">알집 압축 파일</comment>
+ <comment xml:lang="kk">Alzip архиві</comment>
+ <comment xml:lang="ka">Alzip არქივი</comment>
+ <comment xml:lang="ja">Alzip アーカイブ</comment>
+ <comment xml:lang="it">Archivio Alzip</comment>
+ <comment xml:lang="is">Alzip safnskrá</comment>
+ <comment xml:lang="id">Arsip Alzip</comment>
+ <comment xml:lang="ia">Archivo Alzip</comment>
+ <comment xml:lang="hu">Alzip archívum</comment>
+ <comment xml:lang="hr">Alzip arhiva</comment>
+ <comment xml:lang="he">ארכיון Alzip</comment>
+ <comment xml:lang="gl">arquivo Alzip</comment>
+ <comment xml:lang="ga">cartlann Alzip</comment>
+ <comment xml:lang="fur">archivi Alzip</comment>
+ <comment xml:lang="fr">archive alzip</comment>
+ <comment xml:lang="fo">Alsip skjalasavn</comment>
+ <comment xml:lang="fi">Alzip-arkisto</comment>
+ <comment xml:lang="eu">Alzip artxiboa</comment>
+ <comment xml:lang="es">archivador Alzip</comment>
+ <comment xml:lang="eo">Alzip-arkivo</comment>
+ <comment xml:lang="en_GB">Alzip archive</comment>
+ <comment xml:lang="el">Συμπιεσμένο αρχείο Alzip</comment>
+ <comment xml:lang="de">ALZip-Archiv</comment>
+ <comment xml:lang="da">Alzip-arkiv</comment>
+ <comment xml:lang="cs">archiv Alzip</comment>
+ <comment xml:lang="ca">arxiu Alzip</comment>
+ <comment xml:lang="bg">Архив — alzip</comment>
+ <comment xml:lang="be@latin">Archiŭ Alzip</comment>
+ <comment xml:lang="be">архіў Alzip</comment>
+ <comment xml:lang="ar">أرشيف Alzip</comment>
+ <comment xml:lang="af">Alzip-argief</comment>
<generic-icon name="package-x-generic"/>
- <magic priority="50">
+ <magic>
<match type="string" value="ALZ" offset="0"/>
</magic>
<glob pattern="*.alz"/>
</mime-type>
<mime-type type="text/x-reject">
- <comment>rejected patch</comment>
- <comment xml:lang="ar">رقعة مرفوضة</comment>
- <comment xml:lang="be-Latn">niepryniaty patch</comment>
- <comment xml:lang="bg">Отхвърлен файл с кръпка</comment>
- <comment xml:lang="ca">pedaç rebutjat</comment>
- <comment xml:lang="cs">odmítnutá záplata</comment>
- <comment xml:lang="da">afvist rettelse</comment>
- <comment xml:lang="de">Abgelehnter Patch</comment>
- <comment xml:lang="el">Διόρθωση που απορρίφθηκε</comment>
- <comment xml:lang="en-GB">rejected patch</comment>
- <comment xml:lang="eo">reĵeta flikaĵo</comment>
- <comment xml:lang="es">parche rechazado</comment>
- <comment xml:lang="eu">baztertutako adabakia</comment>
- <comment xml:lang="fi">hylättyjen muutosten tiedosto</comment>
- <comment xml:lang="fo">vrakað rætting</comment>
- <comment xml:lang="fr">correctif rejeté</comment>
- <comment xml:lang="fur">blec refudât</comment>
- <comment xml:lang="ga">paiste diúltaithe</comment>
- <comment xml:lang="gl">parche rexeitado</comment>
- <comment xml:lang="he">טלאי שנדחה</comment>
- <comment xml:lang="hr">Odbijena zakrpa</comment>
- <comment xml:lang="hu">visszautasított folt</comment>
- <comment xml:lang="ia">Patch rejectate</comment>
- <comment xml:lang="id">patch ditolak</comment>
- <comment xml:lang="it">Patch rifiutata</comment>
- <comment xml:lang="ja">拒否されたパッチ</comment>
- <comment xml:lang="kk">алынбаған патч</comment>
- <comment xml:lang="ko">거부된 패치 파일</comment>
- <comment xml:lang="lt">atmestas lopas</comment>
- <comment xml:lang="lv">noraidītais ceļš</comment>
- <comment xml:lang="ms">Tampungan ditolak</comment>
- <comment xml:lang="nb">avvist patchfil</comment>
- <comment xml:lang="nl">verworpen patch</comment>
- <comment xml:lang="nn">avvist programfiks</comment>
- <comment xml:lang="oc">correctiu regetat</comment>
- <comment xml:lang="pl">Odrzucona łata</comment>
- <comment xml:lang="pt">patch rejeitado</comment>
- <comment xml:lang="pt-BR">Arquivo de patch rejeitado</comment>
- <comment xml:lang="ro">petec respsins</comment>
+ <comment>Rejected patch</comment>
+ <comment xml:lang="uk">відкинута латка</comment>
+ <comment xml:lang="sv">Avvisad programfix</comment>
<comment xml:lang="ru">Отклонённый патч</comment>
- <comment xml:lang="sk">Odmietnutá záplata</comment>
- <comment xml:lang="sl">zavrnjen popravek</comment>
- <comment xml:lang="sq">Patch i kthyer mbrapsht</comment>
- <comment xml:lang="sr">одбијена закрпа</comment>
- <comment xml:lang="sv">avvisad programfix</comment>
- <comment xml:lang="tr">reddedilmiş yama</comment>
- <comment xml:lang="uk">відхилена латка</comment>
- <comment xml:lang="vi">đắp vá bị từ chối</comment>
- <comment xml:lang="zh-CN">拒绝的补丁</comment>
- <comment xml:lang="zh-TW">回絕的修補</comment>
+ <comment xml:lang="pl">Odrzucona łata</comment>
+ <comment xml:lang="it">Patch rifiutata</comment>
+ <comment xml:lang="gl">Parche rexeitado</comment>
+ <comment xml:lang="eu">Baztertutako adabakia</comment>
+ <comment xml:lang="es">parche rechazado</comment>
+ <comment xml:lang="de">Abgelehnter Patch</comment>
+ <comment xml:lang="be">адхілены патч</comment>
<sub-class-of type="text/plain"/>
<generic-icon name="text-x-generic"/>
<alias type="application/x-reject"/>
@@ -19628,103 +20702,112 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-rpm">
<comment>RPM package</comment>
- <comment xml:lang="af">RPM-pakket</comment>
- <comment xml:lang="ar">حزمة RPM</comment>
- <comment xml:lang="be-Latn">Pakunak RPM</comment>
- <comment xml:lang="bg">Пакет — RPM</comment>
- <comment xml:lang="ca">paquet RPM</comment>
- <comment xml:lang="cs">balíček RPM</comment>
- <comment xml:lang="da">RPM-pakke</comment>
- <comment xml:lang="de">RPM-Paket</comment>
- <comment xml:lang="el">Πακέτο RPM</comment>
- <comment xml:lang="en-GB">RPM package</comment>
- <comment xml:lang="eo">RPM-pakaĵo</comment>
- <comment xml:lang="es">paquete RPM</comment>
- <comment xml:lang="eu">RPM paketea</comment>
- <comment xml:lang="fi">RPM-paketti</comment>
- <comment xml:lang="fo">RPM pakki</comment>
- <comment xml:lang="fr">paquet RPM</comment>
- <comment xml:lang="fur">pachet RPM</comment>
- <comment xml:lang="ga">pacáiste RPM</comment>
- <comment xml:lang="gl">paquete RFM</comment>
- <comment xml:lang="he">חבילת RPM</comment>
- <comment xml:lang="hr">RPM paket</comment>
- <comment xml:lang="hu">RPM-csomag</comment>
- <comment xml:lang="ia">Pacchetto RPM</comment>
- <comment xml:lang="id">Paket RPM</comment>
- <comment xml:lang="it">Pacchetto RPM</comment>
- <comment xml:lang="ja">RPM パッケージ</comment>
- <comment xml:lang="kk">RPM дестесі</comment>
- <comment xml:lang="ko">RPM 패키지</comment>
- <comment xml:lang="lt">RPM paketas</comment>
- <comment xml:lang="lv">RPM pakotne</comment>
- <comment xml:lang="ms">Pakej RPM</comment>
- <comment xml:lang="nb">RPM-pakke</comment>
- <comment xml:lang="nl">RPM-pakket</comment>
- <comment xml:lang="nn">RPM-pakke</comment>
- <comment xml:lang="oc">paquet RPM</comment>
- <comment xml:lang="pl">Pakiet RPM</comment>
- <comment xml:lang="pt">pacote RPM</comment>
- <comment xml:lang="pt-BR">Pacote RPM</comment>
- <comment xml:lang="ro">Pachet RPM</comment>
- <comment xml:lang="ru">Пакет RPM</comment>
- <comment xml:lang="sk">Balík RPM</comment>
- <comment xml:lang="sl">Datoteka paketa RPM</comment>
- <comment xml:lang="sq">Paketë RPM</comment>
- <comment xml:lang="sr">РПМ пакет</comment>
- <comment xml:lang="sv">RPM-paket</comment>
- <comment xml:lang="tr">RPM paketi</comment>
- <comment xml:lang="uk">пакунок RPM</comment>
+ <comment xml:lang="zh_TW">RPM 軟體包</comment>
+ <comment xml:lang="zh_CN">RPM 软件包</comment>
<comment xml:lang="vi">Gói RPM</comment>
- <comment xml:lang="zh-CN">RPM 软件包</comment>
- <comment xml:lang="zh-TW">RPM 軟體包</comment>
+ <comment xml:lang="uk">пакунок RPM</comment>
+ <comment xml:lang="tr">RPM paketi</comment>
+ <comment xml:lang="sv">RPM-paket</comment>
+ <comment xml:lang="sr">РПМ пакет</comment>
+ <comment xml:lang="sq">paketë RPM</comment>
+ <comment xml:lang="sl">Datoteka paketa RPM</comment>
+ <comment xml:lang="si">RPM පැකේජය</comment>
+ <comment xml:lang="sk">Balík RPM</comment>
+ <comment xml:lang="ru">Пакет RPM</comment>
+ <comment xml:lang="ro">Pachet RPM</comment>
+ <comment xml:lang="pt_BR">Pacote RPM</comment>
+ <comment xml:lang="pt">pacote RPM</comment>
+ <comment xml:lang="pl">Pakiet RPM</comment>
+ <comment xml:lang="oc">paquet RPM</comment>
+ <comment xml:lang="nn">RPM-pakke</comment>
+ <comment xml:lang="nl">RPM-pakket</comment>
+ <comment xml:lang="nb">RPM-pakke</comment>
+ <comment xml:lang="ms">Pakej RPM</comment>
+ <comment xml:lang="lv">RPM pakotne</comment>
+ <comment xml:lang="lt">RPM paketas</comment>
+ <comment xml:lang="ko">RPM 패키지</comment>
+ <comment xml:lang="kk">RPM дестесі</comment>
+ <comment xml:lang="ja">RPM パッケージ</comment>
+ <comment xml:lang="it">Pacchetto RPM</comment>
+ <comment xml:lang="is">RPM pakki</comment>
+ <comment xml:lang="id">Paket RPM</comment>
+ <comment xml:lang="ia">Pacchetto RPM</comment>
+ <comment xml:lang="hu">RPM-csomag</comment>
+ <comment xml:lang="hr">RPM paket</comment>
+ <comment xml:lang="he">חבילת RPM</comment>
+ <comment xml:lang="gl">paquete RFM</comment>
+ <comment xml:lang="ga">pacáiste RPM</comment>
+ <comment xml:lang="fur">pachet RPM</comment>
+ <comment xml:lang="fr">paquet RPM</comment>
+ <comment xml:lang="fo">RPM pakki</comment>
+ <comment xml:lang="fi">RPM-paketti</comment>
+ <comment xml:lang="eu">RPM paketea</comment>
+ <comment xml:lang="es">paquete RPM</comment>
+ <comment xml:lang="eo">RPM-pakaĵo</comment>
+ <comment xml:lang="en_GB">RPM package</comment>
+ <comment xml:lang="el">Πακέτο RPM</comment>
+ <comment xml:lang="de">RPM-Paket</comment>
+ <comment xml:lang="da">RPM-pakke</comment>
+ <comment xml:lang="cs">balíček RPM</comment>
+ <comment xml:lang="ca">paquet RPM</comment>
+ <comment xml:lang="bg">Пакет — RPM</comment>
+ <comment xml:lang="be@latin">Pakunak RPM</comment>
+ <comment xml:lang="be">пакет RPM</comment>
+ <comment xml:lang="ar">حزمة RPM</comment>
+ <comment xml:lang="af">RPM-pakket</comment>
<generic-icon name="package-x-generic"/>
<alias type="application/x-redhat-package-manager"/>
- <magic priority="50">
+ <magic>
<match type="string" value="\xed\xab\xee\xdb" offset="0"/>
</magic>
<glob pattern="*.rpm"/>
</mime-type>
<mime-type type="application/x-source-rpm">
<comment>Source RPM package</comment>
- <comment xml:lang="af">Bron-RPM-pakket</comment>
- <comment xml:lang="bg">Пакет — RPM с изходен код</comment>
- <comment xml:lang="ca">paquet RPM de codi font</comment>
- <comment xml:lang="cs">zdrojový balíček RPM</comment>
- <comment xml:lang="da">Kilde RPM-pakke</comment>
- <comment xml:lang="de">Quell-RPM-Paket</comment>
- <comment xml:lang="el">Πακέτο πηγής RPM</comment>
- <comment xml:lang="en-GB">Source RPM package</comment>
- <comment xml:lang="es">paquete de fuente RPM</comment>
- <comment xml:lang="eu">Iturburu RPM paketea</comment>
- <comment xml:lang="fi">RPM-lähdepaketti</comment>
- <comment xml:lang="fr">paquet source RPM</comment>
- <comment xml:lang="fur">pachet sorzint RPM</comment>
- <comment xml:lang="ga">pacáiste foinse RPM</comment>
- <comment xml:lang="gl">Paquete RPM de fontes</comment>
- <comment xml:lang="he">חבילת מקור RPM</comment>
- <comment xml:lang="hr">RPM paket izvora</comment>
- <comment xml:lang="hu">Forrás RPM-csomag</comment>
- <comment xml:lang="ia">Pacchetto de fonte RPM</comment>
- <comment xml:lang="id">Paket RPM sumber</comment>
- <comment xml:lang="it">Pacchetto sorgente RPM</comment>
- <comment xml:lang="ja">ソース RPM パッケージ</comment>
- <comment xml:lang="kk">RPM бастапқы код дестесі</comment>
- <comment xml:lang="ko">소스 RPM 패키지</comment>
- <comment xml:lang="lv">Avota RPM pakotne</comment>
- <comment xml:lang="oc">paquet font RPM</comment>
- <comment xml:lang="pl">Źródłowy pakiet RPM</comment>
- <comment xml:lang="pt">pacote origem RPM</comment>
- <comment xml:lang="pt-BR">Pacote fonte RPM</comment>
- <comment xml:lang="ru">Пакет RPM с исходным кодом</comment>
- <comment xml:lang="sk">Zdrojový balík RPM</comment>
- <comment xml:lang="sl">Paket izvorne kode RPM</comment>
- <comment xml:lang="sr">изворни РПМ пакет</comment>
- <comment xml:lang="sv">Käll-RPM-paket</comment>
- <comment xml:lang="tr">Kaynak RPM paketi</comment>
+ <comment xml:lang="zh_TW">來源 RPM 軟體包</comment>
+ <comment xml:lang="zh_CN">源码 RPM 软件包</comment>
<comment xml:lang="uk">пакунок RPM з початковим кодом</comment>
- <comment xml:lang="zh-CN">源码 RPM 软件包</comment>
- <comment xml:lang="zh-TW">來源 RPM 軟體包</comment>
+ <comment xml:lang="tr">Kaynak RPM paketi</comment>
+ <comment xml:lang="sv">Käll-RPM-paket</comment>
+ <comment xml:lang="sr">изворни РПМ пакет</comment>
+ <comment xml:lang="sq">paketë RPM burimi</comment>
+ <comment xml:lang="sl">Paket izvorne kode RPM</comment>
+ <comment xml:lang="si">මූලාශ්‍ර RPM පැකේජය</comment>
+ <comment xml:lang="sk">Zdrojový balík RPM</comment>
+ <comment xml:lang="ru">Пакет RPM с исходным кодом</comment>
+ <comment xml:lang="pt_BR">Pacote fonte RPM</comment>
+ <comment xml:lang="pt">pacote origem RPM</comment>
+ <comment xml:lang="pl">Źródłowy pakiet RPM</comment>
+ <comment xml:lang="oc">paquet font RPM</comment>
+ <comment xml:lang="nl">Source RPM-pakket</comment>
+ <comment xml:lang="lv">Avota RPM pakotne</comment>
+ <comment xml:lang="ko">소스 RPM 패키지</comment>
+ <comment xml:lang="kk">RPM бастапқы код дестесі</comment>
+ <comment xml:lang="ja">ソース RPM パッケージ</comment>
+ <comment xml:lang="it">Pacchetto sorgente RPM</comment>
+ <comment xml:lang="is">RPM grunnkóðapakki</comment>
+ <comment xml:lang="id">Paket RPM sumber</comment>
+ <comment xml:lang="ia">Pacchetto de fonte RPM</comment>
+ <comment xml:lang="hu">Forrás RPM-csomag</comment>
+ <comment xml:lang="hr">RPM paket izvora</comment>
+ <comment xml:lang="he">חבילת מקור RPM</comment>
+ <comment xml:lang="gl">Paquete RPM de fontes</comment>
+ <comment xml:lang="ga">pacáiste foinse RPM</comment>
+ <comment xml:lang="fur">pachet sorzint RPM</comment>
+ <comment xml:lang="fr">paquet source RPM</comment>
+ <comment xml:lang="fi">RPM-lähdepaketti</comment>
+ <comment xml:lang="eu">Iturburu RPM paketea</comment>
+ <comment xml:lang="es">paquete de fuente RPM</comment>
+ <comment xml:lang="en_GB">Source RPM package</comment>
+ <comment xml:lang="el">Πακέτο πηγής RPM</comment>
+ <comment xml:lang="de">RPM-Quellpaket</comment>
+ <comment xml:lang="da">Kilde RPM-pakke</comment>
+ <comment xml:lang="cs">zdrojový balíček RPM</comment>
+ <comment xml:lang="ca">paquet RPM de codi font</comment>
+ <comment xml:lang="bg">Пакет — RPM с изходен код</comment>
+ <comment xml:lang="be">пакет RPM з зыходным кодам</comment>
+ <comment xml:lang="ar">حزمة RPM مصدرية</comment>
+ <comment xml:lang="af">Bron-RPM-pakket</comment>
<generic-icon name="package-x-generic"/>
<sub-class-of type="application/x-rpm"/>
<glob pattern="*.src.rpm"/>
@@ -19732,56 +20815,59 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-ruby">
<comment>Ruby script</comment>
- <comment xml:lang="af">Ruby-skrip</comment>
- <comment xml:lang="ar">سكربت روبي</comment>
- <comment xml:lang="be-Latn">Skrypt Ruby</comment>
- <comment xml:lang="bg">Скрипт — Ruby</comment>
- <comment xml:lang="ca">script Ruby</comment>
- <comment xml:lang="cs">skript Ruby</comment>
- <comment xml:lang="da">Ruby-program</comment>
- <comment xml:lang="de">Ruby-Skript</comment>
- <comment xml:lang="el">Δέσμη ενεργειών Ruby</comment>
- <comment xml:lang="en-GB">Ruby script</comment>
- <comment xml:lang="eo">Ruby-skripto</comment>
- <comment xml:lang="es">secuencia de órdenes en Ruby</comment>
- <comment xml:lang="eu">Ruby script-a</comment>
- <comment xml:lang="fi">Ruby-komentotiedosto</comment>
- <comment xml:lang="fo">Ruby boðrøð</comment>
- <comment xml:lang="fr">script Ruby</comment>
- <comment xml:lang="fur">script Ruby</comment>
- <comment xml:lang="ga">script Ruby</comment>
- <comment xml:lang="gl">Script de Ruby</comment>
- <comment xml:lang="he">תסריט Ruby</comment>
- <comment xml:lang="hr">Ruby skripta</comment>
- <comment xml:lang="hu">Ruby-parancsfájl</comment>
- <comment xml:lang="ia">Script Ruby</comment>
- <comment xml:lang="id">Skrip Ruby</comment>
- <comment xml:lang="it">Script Ruby</comment>
- <comment xml:lang="ja">Ruby スクリプト</comment>
- <comment xml:lang="kk">Ruby сценарийі</comment>
- <comment xml:lang="ko">루비 스크립트</comment>
- <comment xml:lang="lt">Ruby scenarijus</comment>
- <comment xml:lang="lv">Ruby skripts</comment>
- <comment xml:lang="ms">Skrip Ruby</comment>
- <comment xml:lang="nb">Ruby-skript</comment>
- <comment xml:lang="nl">Ruby-script</comment>
- <comment xml:lang="nn">Ruby-skript</comment>
- <comment xml:lang="oc">escript Ruby</comment>
- <comment xml:lang="pl">Skrypt Ruby</comment>
- <comment xml:lang="pt">script Ruby</comment>
- <comment xml:lang="pt-BR">Script Ruby</comment>
- <comment xml:lang="ro">Script Ruby</comment>
- <comment xml:lang="ru">Сценарий Ruby</comment>
- <comment xml:lang="sk">Skript Ruby</comment>
- <comment xml:lang="sl">Skriptna datoteka Ruby</comment>
- <comment xml:lang="sq">Script Ruby</comment>
- <comment xml:lang="sr">Руби скрипта</comment>
- <comment xml:lang="sv">Ruby-skript</comment>
- <comment xml:lang="tr">Ruby betiği</comment>
- <comment xml:lang="uk">скрипт Ruby</comment>
+ <comment xml:lang="zh_TW">Ruby 指令稿</comment>
+ <comment xml:lang="zh_CN">Ruby 脚本</comment>
<comment xml:lang="vi">Văn lệnh Ruby</comment>
- <comment xml:lang="zh-CN">Ruby 脚本</comment>
- <comment xml:lang="zh-TW">Ruby 指令稿</comment>
+ <comment xml:lang="uk">скрипт Ruby</comment>
+ <comment xml:lang="tr">Ruby betiği</comment>
+ <comment xml:lang="sv">Ruby-skript</comment>
+ <comment xml:lang="sr">Руби скрипта</comment>
+ <comment xml:lang="sq">programth Ruby</comment>
+ <comment xml:lang="sl">Skriptna datoteka Ruby</comment>
+ <comment xml:lang="si">Ruby පිටපත</comment>
+ <comment xml:lang="sk">Skript Ruby</comment>
+ <comment xml:lang="ru">Сценарий Ruby</comment>
+ <comment xml:lang="ro">Script Ruby</comment>
+ <comment xml:lang="pt_BR">Script Ruby</comment>
+ <comment xml:lang="pt">script Ruby</comment>
+ <comment xml:lang="pl">Skrypt Ruby</comment>
+ <comment xml:lang="oc">escript Ruby</comment>
+ <comment xml:lang="nn">Ruby-skript</comment>
+ <comment xml:lang="nl">Ruby-script</comment>
+ <comment xml:lang="nb">Ruby-skript</comment>
+ <comment xml:lang="ms">Skrip Ruby</comment>
+ <comment xml:lang="lv">Ruby skripts</comment>
+ <comment xml:lang="lt">Ruby scenarijus</comment>
+ <comment xml:lang="ko">루비 스크립트</comment>
+ <comment xml:lang="kk">Ruby сценарийі</comment>
+ <comment xml:lang="ja">Ruby スクリプト</comment>
+ <comment xml:lang="it">Script Ruby</comment>
+ <comment xml:lang="is">Ruby skrifta</comment>
+ <comment xml:lang="id">Skrip Ruby</comment>
+ <comment xml:lang="ia">Script Ruby</comment>
+ <comment xml:lang="hu">Ruby-parancsfájl</comment>
+ <comment xml:lang="hr">Ruby skripta</comment>
+ <comment xml:lang="he">תסריט Ruby</comment>
+ <comment xml:lang="gl">Script de Ruby</comment>
+ <comment xml:lang="ga">script Ruby</comment>
+ <comment xml:lang="fur">script Ruby</comment>
+ <comment xml:lang="fr">script Ruby</comment>
+ <comment xml:lang="fo">Ruby boðrøð</comment>
+ <comment xml:lang="fi">Ruby-komentotiedosto</comment>
+ <comment xml:lang="eu">Ruby script-a</comment>
+ <comment xml:lang="es">secuencia de órdenes en Ruby</comment>
+ <comment xml:lang="eo">Ruby-skripto</comment>
+ <comment xml:lang="en_GB">Ruby script</comment>
+ <comment xml:lang="el">Δέσμη ενεργειών Ruby</comment>
+ <comment xml:lang="de">Ruby-Skript</comment>
+ <comment xml:lang="da">Ruby-program</comment>
+ <comment xml:lang="cs">skript Ruby</comment>
+ <comment xml:lang="ca">script Ruby</comment>
+ <comment xml:lang="bg">Скрипт — Ruby</comment>
+ <comment xml:lang="be@latin">Skrypt Ruby</comment>
+ <comment xml:lang="be">скрыпт Ruby</comment>
+ <comment xml:lang="ar">سكربت روبي</comment>
+ <comment xml:lang="af">Ruby-skrip</comment>
<sub-class-of type="application/x-executable"/>
<sub-class-of type="text/plain"/>
<generic-icon name="text-x-script"/>
@@ -19793,387 +20879,284 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-markaby">
<comment>Markaby script</comment>
- <comment xml:lang="af">Markaby-skrip</comment>
- <comment xml:lang="ar">سكربت Markaby</comment>
- <comment xml:lang="be-Latn">Skrypt Markaby</comment>
- <comment xml:lang="bg">Скрипт — Markaby</comment>
- <comment xml:lang="ca">script Markaby</comment>
- <comment xml:lang="cs">skript Markaby</comment>
- <comment xml:lang="da">Markaby-program</comment>
- <comment xml:lang="de">Markaby-Skript</comment>
- <comment xml:lang="el">Δέσμη ενεργειών Markaby</comment>
- <comment xml:lang="en-GB">Markaby script</comment>
- <comment xml:lang="eo">Markaby-skripto</comment>
- <comment xml:lang="es">secuencia de órdenes en Markaby</comment>
- <comment xml:lang="eu">Markaby script-a</comment>
- <comment xml:lang="fi">Markaby-komentotiedosto</comment>
- <comment xml:lang="fo">Markaby boðrøð</comment>
- <comment xml:lang="fr">script Markaby</comment>
- <comment xml:lang="fur">script Markaby</comment>
- <comment xml:lang="ga">script Markaby</comment>
- <comment xml:lang="gl">Script de Markaby</comment>
- <comment xml:lang="he">תסריט Markby</comment>
- <comment xml:lang="hr">Markaby skripta</comment>
- <comment xml:lang="hu">Markaby parancsfájl</comment>
- <comment xml:lang="ia">Script Markaby</comment>
- <comment xml:lang="id">Skrip Markaby</comment>
- <comment xml:lang="it">Script Markaby</comment>
- <comment xml:lang="ja">Markaby スクリプト</comment>
- <comment xml:lang="ka">Markaby-ის სცენარი</comment>
- <comment xml:lang="kk">Markaby сценарийі</comment>
- <comment xml:lang="ko">Markaby 스크립트</comment>
- <comment xml:lang="lt">Markaby scenarijus</comment>
- <comment xml:lang="lv">Markaby skripts</comment>
- <comment xml:lang="nb">Markaby-skript</comment>
- <comment xml:lang="nl">Markaby-script</comment>
- <comment xml:lang="nn">Markaby-skript</comment>
- <comment xml:lang="oc">escript Markaby</comment>
- <comment xml:lang="pl">Skrypt Markaby</comment>
- <comment xml:lang="pt">script Markaby</comment>
- <comment xml:lang="pt-BR">Script Markaby</comment>
- <comment xml:lang="ro">Script Markaby</comment>
- <comment xml:lang="ru">Сценарий Markaby</comment>
- <comment xml:lang="sk">Skript Markaby</comment>
- <comment xml:lang="sl">Skriptna datoteka Markaby</comment>
- <comment xml:lang="sq">Script Markaby</comment>
- <comment xml:lang="sr">Маркаби скрипта</comment>
- <comment xml:lang="sv">Markaby-skript</comment>
- <comment xml:lang="tr">Markaby betiği</comment>
- <comment xml:lang="uk">скрипт Markaby</comment>
+ <comment xml:lang="zh_TW">Markaby 指令稿</comment>
+ <comment xml:lang="zh_CN">RMarkaby 脚本</comment>
<comment xml:lang="vi">Văn lệnh Markaby</comment>
- <comment xml:lang="zh-CN">RMarkaby 脚本</comment>
- <comment xml:lang="zh-TW">Markaby 指令稿</comment>
+ <comment xml:lang="uk">скрипт Markaby</comment>
+ <comment xml:lang="tr">Markaby betiği</comment>
+ <comment xml:lang="sv">Markaby-skript</comment>
+ <comment xml:lang="sr">Маркаби скрипта</comment>
+ <comment xml:lang="sq">programth Markaby</comment>
+ <comment xml:lang="sl">Skriptna datoteka Markaby</comment>
+ <comment xml:lang="si">Markaby පිටපත</comment>
+ <comment xml:lang="sk">Skript Markaby</comment>
+ <comment xml:lang="ru">Сценарий Markaby</comment>
+ <comment xml:lang="ro">Script Markaby</comment>
+ <comment xml:lang="pt_BR">Script Markaby</comment>
+ <comment xml:lang="pt">script Markaby</comment>
+ <comment xml:lang="pl">Skrypt Markaby</comment>
+ <comment xml:lang="oc">escript Markaby</comment>
+ <comment xml:lang="nn">Markaby-skript</comment>
+ <comment xml:lang="nl">Markaby-script</comment>
+ <comment xml:lang="nb">Markaby-skript</comment>
+ <comment xml:lang="lv">Markaby skripts</comment>
+ <comment xml:lang="lt">Markaby scenarijus</comment>
+ <comment xml:lang="ko">Markaby 스크립트</comment>
+ <comment xml:lang="kk">Markaby сценарийі</comment>
+ <comment xml:lang="ka">Markaby-ის სცენარი</comment>
+ <comment xml:lang="ja">Markaby スクリプト</comment>
+ <comment xml:lang="it">Script Markaby</comment>
+ <comment xml:lang="is">Markaby skrifta</comment>
+ <comment xml:lang="id">Skrip Markaby</comment>
+ <comment xml:lang="ia">Script Markaby</comment>
+ <comment xml:lang="hu">Markaby parancsfájl</comment>
+ <comment xml:lang="hr">Markaby skripta</comment>
+ <comment xml:lang="he">תסריט Markby</comment>
+ <comment xml:lang="gl">Script de Markaby</comment>
+ <comment xml:lang="ga">script Markaby</comment>
+ <comment xml:lang="fur">script Markaby</comment>
+ <comment xml:lang="fr">script Markaby</comment>
+ <comment xml:lang="fo">Markaby boðrøð</comment>
+ <comment xml:lang="fi">Markaby-komentotiedosto</comment>
+ <comment xml:lang="eu">Markaby script-a</comment>
+ <comment xml:lang="es">secuencia de órdenes en Markaby</comment>
+ <comment xml:lang="eo">Markaby-skripto</comment>
+ <comment xml:lang="en_GB">Markaby script</comment>
+ <comment xml:lang="el">Δέσμη ενεργειών Markaby</comment>
+ <comment xml:lang="de">Markaby-Skript</comment>
+ <comment xml:lang="da">Markaby-program</comment>
+ <comment xml:lang="cs">skript Markaby</comment>
+ <comment xml:lang="ca">script Markaby</comment>
+ <comment xml:lang="bg">Скрипт — Markaby</comment>
+ <comment xml:lang="be@latin">Skrypt Markaby</comment>
+ <comment xml:lang="be">скрыпт Markaby</comment>
+ <comment xml:lang="ar">سكربت Markaby</comment>
+ <comment xml:lang="af">Markaby-skrip</comment>
<sub-class-of type="application/x-ruby"/>
<generic-icon name="text-x-script"/>
<glob pattern="*.mab"/>
</mime-type>
+ <mime-type type="text/x-crystal">
+ <comment>Crystal source code</comment>
+ <comment xml:lang="zh_TW">Crystal 原始碼</comment>
+ <comment xml:lang="zh_CN">Crystal 源代码</comment>
+ <comment xml:lang="uk">початковий код мовою Crystal</comment>
+ <comment xml:lang="tr">Crystal kaynak kodu</comment>
+ <comment xml:lang="sv">Crystal-källkod</comment>
+ <comment xml:lang="sl">Izvorna koda Crystal</comment>
+ <comment xml:lang="si">Crystal source code</comment>
+ <comment xml:lang="ru">Исходный код Crystal</comment>
+ <comment xml:lang="pl">Kod źródłowy Crystal</comment>
+ <comment xml:lang="oc">còdi font Crystal</comment>
+ <comment xml:lang="nl">Crystal-broncode</comment>
+ <comment xml:lang="ko">Crystal 소스 코드</comment>
+ <comment xml:lang="kk">Crystal бастапқы коды</comment>
+ <comment xml:lang="ja">Crystal ソースコード</comment>
+ <comment xml:lang="it">Codice sorgente Crystal</comment>
+ <comment xml:lang="hr">Crystal izvorni kôd</comment>
+ <comment xml:lang="gl">Código fonte en Crystal</comment>
+ <comment xml:lang="fi">Crystal-lähdekoodi</comment>
+ <comment xml:lang="eu">Crystal iturburu-kodea</comment>
+ <comment xml:lang="es">código fuente en Crystal</comment>
+ <comment xml:lang="en_GB">Crystal source code</comment>
+ <comment xml:lang="de">Crystal-Quelltext</comment>
+ <comment xml:lang="be">зыходны код Crystal</comment>
+ <comment xml:lang="ar">شفرة مصدر Crystal</comment>
+ <sub-class-of type="text/plain"/>
+ <glob pattern="*.cr"/>
+ <alias type="text/crystal"/>
+ </mime-type>
+ <mime-type type="text/julia">
+ <comment>Julia source code</comment>
+ <comment xml:lang="uk">початковий код Julia</comment>
+ <comment xml:lang="sv">Julia-källkod</comment>
+ <comment xml:lang="ru">Исходный код Julia</comment>
+ <comment xml:lang="pl">Kod źródłowy Julia</comment>
+ <comment xml:lang="ja">Julia算譜</comment>
+ <comment xml:lang="it">Codice sorgente Julia</comment>
+ <comment xml:lang="gl">Código fonte en Julia</comment>
+ <comment xml:lang="eu">Julia iturburu-kodea</comment>
+ <comment xml:lang="es">código fuente en Julia</comment>
+ <comment xml:lang="de">Julia-Quelltext</comment>
+ <comment xml:lang="be">зыходны код Julia</comment>
+ <sub-class-of type="text/plain"/>
+ <glob pattern="*.jl"/>
+ </mime-type>
<mime-type type="text/rust">
<comment>Rust source code</comment>
- <comment xml:lang="af">Rust-bronkode</comment>
- <comment xml:lang="bg">Изходен код — Rust</comment>
- <comment xml:lang="ca">codi font en Rust</comment>
- <comment xml:lang="cs">zdrojový kód v jazyce Rust</comment>
- <comment xml:lang="da">Rust-kildekode</comment>
- <comment xml:lang="de">Rust-Quelltext</comment>
- <comment xml:lang="el">Πηγαίος κώδικας Rust</comment>
- <comment xml:lang="en-GB">Rust source code</comment>
- <comment xml:lang="es">código fuente en Rust</comment>
- <comment xml:lang="eu">Rust iturburu-kodea</comment>
- <comment xml:lang="fi">Rust-lähdekoodi</comment>
- <comment xml:lang="fr">code source Rust</comment>
- <comment xml:lang="fur">codiç sorzint Rust</comment>
- <comment xml:lang="ga">cód foinseach Rust</comment>
- <comment xml:lang="he">קוד מקור של Rust</comment>
- <comment xml:lang="hr">Rust izvorni kôd</comment>
- <comment xml:lang="hu">Rust forrásfájl</comment>
- <comment xml:lang="ia">Codice-fonte Rust</comment>
- <comment xml:lang="id">Kode program Rust</comment>
- <comment xml:lang="it">Codice sorgente Rust</comment>
- <comment xml:lang="kk">Rust бастапқы коды</comment>
- <comment xml:lang="ko">Rust 소스 코드</comment>
- <comment xml:lang="oc">còde font Rust</comment>
- <comment xml:lang="pl">Kod źródłowy Rust</comment>
- <comment xml:lang="pt">código origem Rust</comment>
- <comment xml:lang="pt-BR">Código-fonte Rust</comment>
- <comment xml:lang="ru">Исходный код Rust</comment>
- <comment xml:lang="sk">Zdrojový kód Rust</comment>
- <comment xml:lang="sl">Izvorna koda Rust</comment>
- <comment xml:lang="sr">Раст изворни ко̂д</comment>
- <comment xml:lang="sv">Rust-källkod</comment>
+ <comment xml:lang="zh_TW">Rust 源碼</comment>
+ <comment xml:lang="zh_CN">Rust 源代码</comment>
+ <comment xml:lang="uk">початковий код мовою Rust</comment>
<comment xml:lang="tr">Rust kaynak kodu</comment>
- <comment xml:lang="uk">вихідний код мовою Rust</comment>
- <comment xml:lang="zh-CN">Rust 源代码</comment>
- <comment xml:lang="zh-TW">Rust 源碼</comment>
+ <comment xml:lang="sv">Rust-källkod</comment>
+ <comment xml:lang="sr">Раст изворни ко̂д</comment>
+ <comment xml:lang="sq">kod burim Rust</comment>
+ <comment xml:lang="sl">Izvorna koda Rust</comment>
+ <comment xml:lang="si">මලකඩ මූලාශ්ර කේතය</comment>
+ <comment xml:lang="sk">Zdrojový kód Rust</comment>
+ <comment xml:lang="ru">Исходный код Rust</comment>
+ <comment xml:lang="pt_BR">Código-fonte Rust</comment>
+ <comment xml:lang="pt">código origem Rust</comment>
+ <comment xml:lang="pl">Kod źródłowy Rust</comment>
+ <comment xml:lang="oc">còde font Rust</comment>
+ <comment xml:lang="nl">Rust-broncode</comment>
+ <comment xml:lang="ko">Rust 소스 코드</comment>
+ <comment xml:lang="kk">Rust бастапқы коды</comment>
+ <comment xml:lang="ja">Rust ソースコード</comment>
+ <comment xml:lang="it">Codice sorgente Rust</comment>
+ <comment xml:lang="is">Rust frumkóði</comment>
+ <comment xml:lang="id">Kode program Rust</comment>
+ <comment xml:lang="ia">Codice-fonte Rust</comment>
+ <comment xml:lang="hu">Rust forrásfájl</comment>
+ <comment xml:lang="hr">Rust izvorni kôd</comment>
+ <comment xml:lang="he">קוד מקור של Rust</comment>
+ <comment xml:lang="gl">Código fonte en Rust</comment>
+ <comment xml:lang="ga">cód foinseach Rust</comment>
+ <comment xml:lang="fur">codiç sorzint Rust</comment>
+ <comment xml:lang="fr">code source Rust</comment>
+ <comment xml:lang="fi">Rust-lähdekoodi</comment>
+ <comment xml:lang="eu">Rust iturburu-kodea</comment>
+ <comment xml:lang="es">código fuente en Rust</comment>
+ <comment xml:lang="en_GB">Rust source code</comment>
+ <comment xml:lang="el">Πηγαίος κώδικας Rust</comment>
+ <comment xml:lang="de">Rust-Quelltext</comment>
+ <comment xml:lang="da">Rust-kildekode</comment>
+ <comment xml:lang="cs">zdrojový kód v jazyce Rust</comment>
+ <comment xml:lang="ca">codi font en Rust</comment>
+ <comment xml:lang="bg">Изходен код — Rust</comment>
+ <comment xml:lang="be">зыходны код Rust</comment>
+ <comment xml:lang="ar">شفرة مصدر رست</comment>
+ <comment xml:lang="af">Rust-bronkode</comment>
<sub-class-of type="text/plain"/>
<glob pattern="*.rs"/>
</mime-type>
<mime-type type="application/x-sc">
<comment>SC/Xspread spreadsheet</comment>
- <comment xml:lang="af">SC/Xspread-sigblad</comment>
- <comment xml:lang="ar">جدول SC/Xspread</comment>
- <comment xml:lang="be-Latn">Raźlikovy arkuš SC/Xspread</comment>
- <comment xml:lang="bg">Таблица — SC/Xspread</comment>
- <comment xml:lang="ca">full de càlcul de SC/Xspread</comment>
- <comment xml:lang="cs">sešit SC/Xspread</comment>
- <comment xml:lang="da">SC/Xspread-regneark</comment>
- <comment xml:lang="de">SX/Xspread-Tabelle</comment>
- <comment xml:lang="el">Λογιστικό φύλλο SC/Xspread</comment>
- <comment xml:lang="en-GB">SC/Xspread spreadsheet</comment>
- <comment xml:lang="eo">SC/Xspread-kalkultabelo</comment>
- <comment xml:lang="es">hoja de cálculo SC/Xspread</comment>
- <comment xml:lang="eu">SC/Xspread kalkulu-orria</comment>
- <comment xml:lang="fi">SC/Xspread-taulukko</comment>
- <comment xml:lang="fo">SC/Xspread rokniark</comment>
- <comment xml:lang="fr">feuille de calcul SC/Xspread</comment>
- <comment xml:lang="fur">sfuei di calcul SC/Xspread</comment>
- <comment xml:lang="ga">scarbhileog SC/Xspread</comment>
- <comment xml:lang="gl">folla de cálculo SC/Xspread</comment>
- <comment xml:lang="he">גליון נתונים של SC/Xspread</comment>
- <comment xml:lang="hr">SC/Xspread proračunska tablica</comment>
- <comment xml:lang="hu">SC/Xspread táblázat</comment>
- <comment xml:lang="ia">Folio de calculo SC/Xspread</comment>
- <comment xml:lang="id">Lembar sebar SC/Xspread</comment>
- <comment xml:lang="it">Foglio di calcolo SC/Xspread</comment>
- <comment xml:lang="ja">SC/Xspread スプレッドシート</comment>
- <comment xml:lang="kk">SC/Xspread электрондық кестесі</comment>
- <comment xml:lang="ko">SC/Xspread 스프레드시트</comment>
- <comment xml:lang="lt">SC/Xspread skaičialentė</comment>
- <comment xml:lang="lv">SC/Xspread izklājlapa</comment>
- <comment xml:lang="nb">SC/Xspread-regneark</comment>
- <comment xml:lang="nl">SC/Xspread-rekenblad</comment>
- <comment xml:lang="nn">SC/Xspread-rekneark</comment>
- <comment xml:lang="oc">fuèlh de calcul SC/Xspread</comment>
- <comment xml:lang="pl">Arkusz SC/Xspread</comment>
- <comment xml:lang="pt">folha de cálculo SC/Xspread</comment>
- <comment xml:lang="pt-BR">Planilha do SC/Xspread</comment>
- <comment xml:lang="ro">Foaie de calcul SC/Xspread</comment>
- <comment xml:lang="ru">Электронная таблица SC/Xspread</comment>
- <comment xml:lang="sk">Zošit SC/Xspread</comment>
- <comment xml:lang="sl">Preglednica SC/Xspread</comment>
- <comment xml:lang="sq">Fletë llogaritjesh SC/Xspread</comment>
- <comment xml:lang="sr">табела СЦ/Икс-табеле</comment>
- <comment xml:lang="sv">SC/Xspread-kalkylblad</comment>
- <comment xml:lang="tr">SC/Xspread hesap çizelgesi</comment>
- <comment xml:lang="uk">ел. таблиця SC/Xspread</comment>
+ <comment xml:lang="zh_TW">SC/Xspread 試算表</comment>
+ <comment xml:lang="zh_CN">SC/Xspread 电子表格</comment>
<comment xml:lang="vi">Bảng tính SC/Xspread</comment>
- <comment xml:lang="zh-CN">SC/Xspread 电子表格</comment>
- <comment xml:lang="zh-TW">SC/Xspread 試算表</comment>
+ <comment xml:lang="uk">електронна таблиця SC/Xspread</comment>
+ <comment xml:lang="tr">SC/Xspread hesap çizelgesi</comment>
+ <comment xml:lang="sv">SC/Xspread-kalkylblad</comment>
+ <comment xml:lang="sr">табела СЦ/Икс-табеле</comment>
+ <comment xml:lang="sq">fletëllogaritje SC/Xspread</comment>
+ <comment xml:lang="sl">Preglednica SC/Xspread</comment>
+ <comment xml:lang="si">SC/Xspread පැතුරුම්පත</comment>
+ <comment xml:lang="sk">Zošit SC/Xspread</comment>
+ <comment xml:lang="ru">Электронная таблица SC/Xspread</comment>
+ <comment xml:lang="ro">Foaie de calcul SC/Xspread</comment>
+ <comment xml:lang="pt_BR">Planilha do SC/Xspread</comment>
+ <comment xml:lang="pt">folha de cálculo SC/Xspread</comment>
+ <comment xml:lang="pl">Arkusz SC/Xspread</comment>
+ <comment xml:lang="oc">fuèlh de calcul SC/Xspread</comment>
+ <comment xml:lang="nn">SC/Xspread-rekneark</comment>
+ <comment xml:lang="nl">SC/Xspread-rekenblad</comment>
+ <comment xml:lang="nb">SC/Xspread-regneark</comment>
+ <comment xml:lang="lv">SC/Xspread izklājlapa</comment>
+ <comment xml:lang="lt">SC/Xspread skaičialentė</comment>
+ <comment xml:lang="ko">SC/Xspread 스프레드시트</comment>
+ <comment xml:lang="kk">SC/Xspread электрондық кестесі</comment>
+ <comment xml:lang="ja">SC/Xspread スプレッドシート</comment>
+ <comment xml:lang="it">Foglio di calcolo SC/Xspread</comment>
+ <comment xml:lang="is">SC/Xspread töflureikniskjal</comment>
+ <comment xml:lang="id">Lembar sebar SC/Xspread</comment>
+ <comment xml:lang="ia">Folio de calculo SC/Xspread</comment>
+ <comment xml:lang="hu">SC/Xspread táblázat</comment>
+ <comment xml:lang="hr">SC/Xspread proračunska tablica</comment>
+ <comment xml:lang="he">גיליון נתונים של SC/Xspread</comment>
+ <comment xml:lang="gl">folla de cálculo SC/Xspread</comment>
+ <comment xml:lang="ga">scarbhileog SC/Xspread</comment>
+ <comment xml:lang="fur">sfuei di calcul SC/Xspread</comment>
+ <comment xml:lang="fr">feuille de calcul SC/Xspread</comment>
+ <comment xml:lang="fo">SC/Xspread rokniark</comment>
+ <comment xml:lang="fi">SC/Xspread-taulukko</comment>
+ <comment xml:lang="eu">SC/Xspread kalkulu-orria</comment>
+ <comment xml:lang="es">hoja de cálculo SC/Xspread</comment>
+ <comment xml:lang="eo">SC/Xspread-kalkultabelo</comment>
+ <comment xml:lang="en_GB">SC/Xspread spreadsheet</comment>
+ <comment xml:lang="el">Λογιστικό φύλλο SC/Xspread</comment>
+ <comment xml:lang="de">SC/Xspread-Tabelle</comment>
+ <comment xml:lang="da">SC/Xspread-regneark</comment>
+ <comment xml:lang="cs">sešit SC/Xspread</comment>
+ <comment xml:lang="ca">full de càlcul de SC/Xspread</comment>
+ <comment xml:lang="bg">Таблица — SC/Xspread</comment>
+ <comment xml:lang="be@latin">Raźlikovy arkuš SC/Xspread</comment>
+ <comment xml:lang="be">электронная табліца SC/Xspread</comment>
+ <comment xml:lang="ar">جدول SC/Xspread</comment>
+ <comment xml:lang="af">SC/Xspread-sigblad</comment>
<generic-icon name="x-office-spreadsheet"/>
- <magic priority="50">
+ <magic>
<match type="string" value="Spreadsheet" offset="38"/>
</magic>
</mime-type>
<mime-type type="application/x-shar">
- <comment>shell archive</comment>
- <comment xml:lang="af">shell-argief</comment>
- <comment xml:lang="ar">أرشيف شِل</comment>
- <comment xml:lang="az">qabıq arxivi</comment>
- <comment xml:lang="be-Latn">archiŭ abałonki</comment>
- <comment xml:lang="bg">Архив на обвивката</comment>
- <comment xml:lang="ca">arxiu de shell</comment>
- <comment xml:lang="cs">archiv shellu</comment>
- <comment xml:lang="cy">archif plisgyn</comment>
- <comment xml:lang="da">skal-arkiv</comment>
- <comment xml:lang="de">Shell-Archiv</comment>
- <comment xml:lang="el">Αρχείο κέλυφους</comment>
- <comment xml:lang="en-GB">shell archive</comment>
- <comment xml:lang="eo">ŝel-arkivo</comment>
- <comment xml:lang="es">archivador shell</comment>
- <comment xml:lang="eu">shell artxiboa</comment>
- <comment xml:lang="fi">komentotulkkiarkisto</comment>
- <comment xml:lang="fo">skel savn</comment>
- <comment xml:lang="fr">archive shell</comment>
- <comment xml:lang="fur">archivi shell</comment>
- <comment xml:lang="ga">cartlann bhlaoisce</comment>
- <comment xml:lang="gl">ficheiro shell</comment>
- <comment xml:lang="he">ארכיון מעטפת</comment>
- <comment xml:lang="hr">Arhiva ljuske</comment>
- <comment xml:lang="hu">héjarchívum</comment>
- <comment xml:lang="ia">Archivo de shell</comment>
- <comment xml:lang="id">arsip shell</comment>
- <comment xml:lang="it">Archivio shell</comment>
- <comment xml:lang="ja">シェルアーカイブ</comment>
- <comment xml:lang="kk">қоршам архиві</comment>
- <comment xml:lang="ko">셸 압축 파일</comment>
- <comment xml:lang="lt">shell archyvas</comment>
- <comment xml:lang="lv">čaulas arhīvs</comment>
- <comment xml:lang="ms">Arkib shell</comment>
- <comment xml:lang="nb">skallarkiv</comment>
- <comment xml:lang="nl">shell-archief</comment>
- <comment xml:lang="nn">skal-arkiv</comment>
- <comment xml:lang="oc">archiu shell</comment>
- <comment xml:lang="pl">Archiwum powłoki</comment>
- <comment xml:lang="pt">arquivo de terminal</comment>
- <comment xml:lang="pt-BR">Pacote shell</comment>
- <comment xml:lang="ro">arhivă shell</comment>
- <comment xml:lang="ru">Архив shell</comment>
- <comment xml:lang="sk">Archív shellu</comment>
- <comment xml:lang="sl">lupinski arhiv</comment>
- <comment xml:lang="sq">Arkiv shell</comment>
- <comment xml:lang="sr">архива љуске</comment>
- <comment xml:lang="sv">skalarkiv</comment>
- <comment xml:lang="tr">kabuk arşivi</comment>
+ <comment>Shell archive</comment>
<comment xml:lang="uk">архів оболонки</comment>
- <comment xml:lang="vi">kho trình bao</comment>
- <comment xml:lang="zh-CN">shell 归档文件</comment>
- <comment xml:lang="zh-TW">shell 封存檔</comment>
+ <comment xml:lang="sv">Skalarkiv</comment>
+ <comment xml:lang="ru">Архив shell</comment>
+ <comment xml:lang="pl">Archiwum powłoki</comment>
+ <comment xml:lang="ja">シェル自己解凍ファイル</comment>
+ <comment xml:lang="it">Archivio shell</comment>
+ <comment xml:lang="gl">Arquivo de Shell</comment>
+ <comment xml:lang="eu">Shell artxiboa</comment>
+ <comment xml:lang="es">archivador Shell</comment>
+ <comment xml:lang="de">Shell-Archiv</comment>
+ <comment xml:lang="be">архіў абалонкі</comment>
<generic-icon name="package-x-generic"/>
<glob pattern="*.shar"/>
</mime-type>
<mime-type type="application/x-shared-library-la">
- <comment>libtool shared library</comment>
- <comment xml:lang="af">libtool- gedeelde biblioteek</comment>
- <comment xml:lang="ar">مكتبة libtool المشتركة</comment>
- <comment xml:lang="be-Latn">supolnaja biblijateka libtool</comment>
- <comment xml:lang="bg">Споделена библиотека — libtool</comment>
- <comment xml:lang="ca">biblioteca compartida libtool</comment>
- <comment xml:lang="cs">sdílená knihovna libtool</comment>
- <comment xml:lang="da">libtool delt bibliotek</comment>
- <comment xml:lang="de">Gemeinsame libtool-Bibliothek</comment>
- <comment xml:lang="el">Κοινόχρηστη βιβλιοθήκη libtool</comment>
- <comment xml:lang="en-GB">libtool shared library</comment>
- <comment xml:lang="es">biblioteca compartida de libtool</comment>
- <comment xml:lang="eu">libtool partekatutako liburutegia</comment>
- <comment xml:lang="fi">jaettu libtool-kirjasto</comment>
- <comment xml:lang="fo">libtool felagssavn</comment>
- <comment xml:lang="fr">bibliothèque partagée libtool</comment>
- <comment xml:lang="fur">librarie condividude libtool</comment>
- <comment xml:lang="ga">comhleabharlann libtool</comment>
- <comment xml:lang="gl">biblioteca compartida de libtool</comment>
- <comment xml:lang="he">ספרייה משותפת של libtool</comment>
- <comment xml:lang="hr">libtool dijeljena biblioteka</comment>
- <comment xml:lang="hu">libtool osztott programkönyvtár</comment>
- <comment xml:lang="ia">Bibliotheca commun Libtool</comment>
- <comment xml:lang="id">pustaka bersama libtool</comment>
- <comment xml:lang="it">Libreria condivisa libtool</comment>
- <comment xml:lang="ja">libtool 共有ライブラリ</comment>
- <comment xml:lang="kk">libtool ортақ жинағы</comment>
- <comment xml:lang="ko">libtool 공유 라이브러리</comment>
- <comment xml:lang="lt">libtool bendroji biblioteka</comment>
- <comment xml:lang="lv">libtool koplietotā bibliotēka</comment>
- <comment xml:lang="nb">libtool delt bibliotek</comment>
- <comment xml:lang="nl">gedeelde libtool-bibliotheek</comment>
- <comment xml:lang="nn">libtool delt bibliotek</comment>
- <comment xml:lang="oc">bibliotèca partejada libtool</comment>
- <comment xml:lang="pl">Biblioteka współdzielona libtool</comment>
- <comment xml:lang="pt">biblioteca partilhada libtool</comment>
- <comment xml:lang="pt-BR">Biblioteca compartilhada libtool</comment>
- <comment xml:lang="ro">bibliotecă partajată libtool</comment>
- <comment xml:lang="ru">Разделяемая библиотека libtool</comment>
- <comment xml:lang="sk">Zdieľaná knižnica libtool</comment>
- <comment xml:lang="sl">Souporabna knjižnica libtool</comment>
- <comment xml:lang="sq">Librari e përbashkët libtool</comment>
- <comment xml:lang="sr">дељена библиотека библ-алата</comment>
- <comment xml:lang="sv">delat libtool-bibliotek</comment>
- <comment xml:lang="tr">libtool paylaşımlı kitaplığı</comment>
+ <comment>Libtool shared library</comment>
<comment xml:lang="uk">спільна бібліотека libtool</comment>
- <comment xml:lang="vi">thư viện dùng chung libtool</comment>
- <comment xml:lang="zh-CN">libtool 共享库</comment>
- <comment xml:lang="zh-TW">libtool 共享函式庫</comment>
+ <comment xml:lang="sv">Delat libtool-bibliotek</comment>
+ <comment xml:lang="ru">Разделяемая библиотека libtool</comment>
+ <comment xml:lang="pl">Biblioteka współdzielona libtool</comment>
+ <comment xml:lang="it">Libreria condivisa libtool</comment>
+ <comment xml:lang="eu">Libtool liburutegi partekatua</comment>
+ <comment xml:lang="es">biblioteca compartida de Libtool</comment>
+ <comment xml:lang="de">Gemeinsame libtool-Bibliothek</comment>
+ <comment xml:lang="be">агульная бібліятэка libtool</comment>
<sub-class-of type="text/plain"/>
<generic-icon name="text-x-script"/>
<glob pattern="*.la"/>
</mime-type>
<mime-type type="application/x-sharedlib">
- <comment>shared library</comment>
- <comment xml:lang="af">gedeelde biblioteek</comment>
- <comment xml:lang="ar">مكتبة مشتركة</comment>
- <comment xml:lang="az">bölüşülmüş kitabxana</comment>
- <comment xml:lang="be-Latn">supolnaja biblijateka</comment>
- <comment xml:lang="bg">Споделена библиотека</comment>
- <comment xml:lang="ca">biblioteca compartida</comment>
- <comment xml:lang="cs">sdílená knihovna</comment>
- <comment xml:lang="cy">llyfrgell wedi ei rhannu</comment>
- <comment xml:lang="da">delt bibliotek</comment>
- <comment xml:lang="de">Gemeinsame Bibliothek</comment>
- <comment xml:lang="el">Αρχείο κοινόχρηστης βιβλιοθήκης</comment>
- <comment xml:lang="en-GB">shared library</comment>
- <comment xml:lang="eo">dinamike bindebla biblioteko</comment>
- <comment xml:lang="es">biblioteca compartida</comment>
- <comment xml:lang="eu">partekatutako liburutegia</comment>
- <comment xml:lang="fi">jaettu kirjasto</comment>
- <comment xml:lang="fo">felagssavn</comment>
- <comment xml:lang="fr">bibliothèque partagée</comment>
- <comment xml:lang="fur">librarie condividude</comment>
- <comment xml:lang="ga">comhleabharlann</comment>
- <comment xml:lang="gl">biblioteca compartida</comment>
- <comment xml:lang="he">ספרייה משותפת</comment>
- <comment xml:lang="hr">dijeljena biblioteka</comment>
- <comment xml:lang="hu">osztott programkönyvtár</comment>
- <comment xml:lang="ia">Bibliotheca commun</comment>
- <comment xml:lang="id">pustaka bersama</comment>
- <comment xml:lang="it">Libreria condivisa</comment>
- <comment xml:lang="ja">共有ライブラリ</comment>
- <comment xml:lang="kk">бөлісетін библиотека</comment>
- <comment xml:lang="ko">공유 라이브러리</comment>
- <comment xml:lang="lt">bendroji biblioteka</comment>
- <comment xml:lang="lv">koplietotā bibliotēka</comment>
- <comment xml:lang="ms">Pustaka terkongsi</comment>
- <comment xml:lang="nb">delt bibliotek</comment>
- <comment xml:lang="nl">gedeelde bibliotheek</comment>
- <comment xml:lang="nn">delt bibliotek</comment>
- <comment xml:lang="oc">bibliotèca partejada</comment>
- <comment xml:lang="pl">Biblioteka współdzielona</comment>
- <comment xml:lang="pt">biblioteca partilhada</comment>
- <comment xml:lang="pt-BR">Biblioteca compartilhada</comment>
- <comment xml:lang="ro">bibliotecă partajată</comment>
- <comment xml:lang="ru">Разделяемая библиотека</comment>
- <comment xml:lang="sk">Zdieľaná knižnica</comment>
- <comment xml:lang="sl">souporabljena knjižnica</comment>
- <comment xml:lang="sq">Librari e përbashkët</comment>
- <comment xml:lang="sr">дељена библиотека</comment>
- <comment xml:lang="sv">delat bibliotek</comment>
- <comment xml:lang="tr">paylaşımlı kitaplık</comment>
+ <comment>Shared library</comment>
<comment xml:lang="uk">спільна бібліотека</comment>
- <comment xml:lang="vi">thư viện dùng chung</comment>
- <comment xml:lang="zh-CN">共享库</comment>
- <comment xml:lang="zh-TW">共享函式庫</comment>
- <magic priority="50">
+ <comment xml:lang="sv">Delat bibliotek</comment>
+ <comment xml:lang="ru">Разделяемая библиотека</comment>
+ <comment xml:lang="pl">Biblioteka współdzielona</comment>
+ <comment xml:lang="ja">共有ライブラリ</comment>
+ <comment xml:lang="it">Libreria condivisa</comment>
+ <comment xml:lang="gl">Biblioteca compartida</comment>
+ <comment xml:lang="eu">Liburutegi partekatua</comment>
+ <comment xml:lang="es">biblioteca compartida</comment>
+ <comment xml:lang="de">Gemeinsam genutzte Bibliothek</comment>
+ <comment xml:lang="be">агульная бібліятэка</comment>
+ <magic>
<match type="little16" value="0603" offset="0">
<match type="little16" mask="030000" value="020000" offset="22"/>
</match>
</magic>
<glob pattern="*.so"/>
+ <glob weight="60" pattern="*.so.[0-9]*"/>
</mime-type>
<mime-type type="application/x-shellscript">
- <comment>shell script</comment>
- <comment xml:lang="af">shell-skrip</comment>
- <comment xml:lang="ar">سكربت شِل</comment>
- <comment xml:lang="az">qabıq skripti</comment>
- <comment xml:lang="be-Latn">skrypt abałonki</comment>
- <comment xml:lang="bg">Скрипт на обвивката</comment>
- <comment xml:lang="ca">script shell</comment>
- <comment xml:lang="cs">skript shellu</comment>
- <comment xml:lang="cy">sgript plisgyn</comment>
- <comment xml:lang="da">skal-program</comment>
- <comment xml:lang="de">Shell-Skript</comment>
- <comment xml:lang="el">Δέσμη ενεργειών κελύφους</comment>
- <comment xml:lang="en-GB">shell script</comment>
- <comment xml:lang="eo">ŝelskripto</comment>
- <comment xml:lang="es">secuencia de órdenes en shell</comment>
- <comment xml:lang="eu">shell script-a</comment>
- <comment xml:lang="fi">komentotulkin komentotiedosto</comment>
- <comment xml:lang="fo">skel boðrøð</comment>
- <comment xml:lang="fr">script shell</comment>
- <comment xml:lang="fur">script shell</comment>
- <comment xml:lang="ga">script bhlaoisce</comment>
- <comment xml:lang="gl">script de shell</comment>
- <comment xml:lang="he">תסריט מעטפת</comment>
- <comment xml:lang="hr">Skripta ljuske</comment>
- <comment xml:lang="hu">héj-parancsfájl</comment>
- <comment xml:lang="ia">Script de shell</comment>
- <comment xml:lang="id">skrip shell</comment>
- <comment xml:lang="it">Script shell</comment>
- <comment xml:lang="ja">シェルスクリプト</comment>
- <comment xml:lang="kk">қоршам сценарийі</comment>
- <comment xml:lang="ko">셸 스크립트</comment>
- <comment xml:lang="lt">shell scenarijus</comment>
- <comment xml:lang="lv">čaulas skripts</comment>
- <comment xml:lang="ms">Skrip shell</comment>
- <comment xml:lang="nb">skallskript</comment>
- <comment xml:lang="nl">shellscript</comment>
- <comment xml:lang="nn">skalskript</comment>
- <comment xml:lang="oc">escript shell</comment>
- <comment xml:lang="pl">Skrypt powłoki</comment>
- <comment xml:lang="pt">script de terminal</comment>
- <comment xml:lang="pt-BR">Script shell</comment>
- <comment xml:lang="ro">script shell</comment>
- <comment xml:lang="ru">Сценарий shell</comment>
- <comment xml:lang="sk">Skript shellu</comment>
- <comment xml:lang="sl">lupinski skript</comment>
- <comment xml:lang="sq">Script shell</comment>
- <comment xml:lang="sr">скрипта љуске</comment>
- <comment xml:lang="sv">skalskript</comment>
- <comment xml:lang="tr">kabuk betiği</comment>
+ <comment>Shell script</comment>
<comment xml:lang="uk">скрипт оболонки</comment>
- <comment xml:lang="vi">văn lệnh trình bao</comment>
- <comment xml:lang="zh-CN">shell 脚本</comment>
- <comment xml:lang="zh-TW">shell 指令稿</comment>
+ <comment xml:lang="sv">Skalskript</comment>
+ <comment xml:lang="ru">Сценарий shell</comment>
+ <comment xml:lang="pl">Skrypt powłoki</comment>
+ <comment xml:lang="it">Script shell</comment>
+ <comment xml:lang="eu">Shell scripta</comment>
+ <comment xml:lang="es">secuencia de órdenes de consola</comment>
+ <comment xml:lang="de">Shell-Skript</comment>
+ <comment xml:lang="be">скрыпт абалонкі</comment>
<sub-class-of type="application/x-executable"/>
<sub-class-of type="text/plain"/>
<alias type="text/x-sh"/>
<generic-icon name="text-x-script"/>
- <magic priority="50">
+ <magic>
<match type="string" value="# This is a shell archive" offset="10"/>
<match type="string" value="/bin/bash" offset="2:16"/>
<match type="string" value="/bin/nawk" offset="2:16"/>
@@ -20188,62 +21171,105 @@ command to generate the output files.
</magic>
<glob pattern="*.sh"/>
</mime-type>
+ <mime-type type="application/x-fishscript">
+ <comment>Fish shell script</comment>
+ <comment xml:lang="uk">скрипт оболонки fish</comment>
+ <comment xml:lang="sv">Fish-skalskript</comment>
+ <comment xml:lang="ru">Сценарий fish shell</comment>
+ <comment xml:lang="pl">Skrypt powłoki Fish</comment>
+ <comment xml:lang="it">Script shell Fish</comment>
+ <comment xml:lang="eu">Fish shell scripta</comment>
+ <comment xml:lang="es">secuencia de órdenes de consola Fish</comment>
+ <comment xml:lang="de">Fish-Shell-Skript</comment>
+ <comment xml:lang="be">скрыпт Fish shell</comment>
+ <sub-class-of type="application/x-executable"/>
+ <sub-class-of type="text/plain"/>
+ <alias type="text/x-fish"/>
+ <generic-icon name="text-x-script"/>
+ <magic>
+ <match type="string" value="/bin/env fish" offset="2:16"/>
+ </magic>
+ <glob pattern="*.fish"/>
+ </mime-type>
+ <mime-type type="application/x-nuscript">
+ <comment>Nu shell script</comment>
+ <comment xml:lang="uk">скрипт оболонки nu</comment>
+ <comment xml:lang="sv">Nu-skalskript</comment>
+ <comment xml:lang="ru">Сценарий nu shell</comment>
+ <comment xml:lang="pl">Skrypt powłoki Nu</comment>
+ <comment xml:lang="it">Script shell Nu</comment>
+ <comment xml:lang="eu">Nu shell scripta</comment>
+ <comment xml:lang="es">secuencia de órdenes de consola Nu</comment>
+ <comment xml:lang="de">Nu-Shell-Skript</comment>
+ <comment xml:lang="be">скрыпт Nu shell</comment>
+ <sub-class-of type="application/x-executable"/>
+ <sub-class-of type="text/plain"/>
+ <alias type="text/x-nu"/>
+ <generic-icon name="text-x-script"/>
+ <magic>
+ <match type="string" value="/bin/env nu" offset="2:16"/>
+ </magic>
+ <glob pattern="*.nu"/>
+ </mime-type>
<mime-type type="application/vnd.adobe.flash.movie">
<comment>Shockwave Flash file</comment>
- <comment xml:lang="af">Shockwave Flash-lêer</comment>
- <comment xml:lang="ar">ملف Shockwave Flash</comment>
- <comment xml:lang="be-Latn">Fajł Shockwave Flash</comment>
- <comment xml:lang="bg">Файл — Shockwave Flash</comment>
- <comment xml:lang="ca">fitxer Shockwave Flash</comment>
- <comment xml:lang="cs">soubor Shockwave Flash</comment>
- <comment xml:lang="da">Shockwave Flash-fil</comment>
- <comment xml:lang="de">Shockwave-Flash-Datei</comment>
- <comment xml:lang="el">Αρχείο Shockwave Flash</comment>
- <comment xml:lang="en-GB">Shockwave Flash file</comment>
- <comment xml:lang="eo">dosiero de Shockwave Flash</comment>
- <comment xml:lang="es">archivo Shockwave Flash</comment>
- <comment xml:lang="eu">Shockwave Flash fitxategia</comment>
- <comment xml:lang="fi">Shockwave Flash -tiedosto</comment>
- <comment xml:lang="fo">Shockwave Flash fíla</comment>
- <comment xml:lang="fr">fichier Shockwave Flash</comment>
- <comment xml:lang="fur">file Shockwave Flash</comment>
- <comment xml:lang="ga">comhad Shockwave Flash</comment>
- <comment xml:lang="gl">ficheiro sockwave Flash</comment>
- <comment xml:lang="he">קובץ של Shockwave Flash</comment>
- <comment xml:lang="hr">Shockwave Flash datoteka</comment>
- <comment xml:lang="hu">Shockwave Flash-fájl</comment>
- <comment xml:lang="ia">File Shockwave Flash</comment>
- <comment xml:lang="id">Berkas Shockwave Flash</comment>
- <comment xml:lang="it">File Shockwave Flash</comment>
- <comment xml:lang="ja">Shockwave Flash ファイル</comment>
- <comment xml:lang="kk">Shockwave Flash файлы</comment>
- <comment xml:lang="ko">Shockwave 플래시 파일</comment>
- <comment xml:lang="lt">Shockwave Flash failas</comment>
- <comment xml:lang="lv">Shockwave Flash datne</comment>
- <comment xml:lang="ms">Fail Shockwave Flash</comment>
- <comment xml:lang="nb">Shockwave Flash-fil</comment>
- <comment xml:lang="nl">Shockwave Flash-bestand</comment>
- <comment xml:lang="nn">Shockwave Flash-fil</comment>
- <comment xml:lang="oc">fichièr Shockwave Flash</comment>
- <comment xml:lang="pl">Plik Shockwave Flash</comment>
- <comment xml:lang="pt">ficheiro Shockwave Flash</comment>
- <comment xml:lang="pt-BR">Arquivo Shockwave Flash</comment>
- <comment xml:lang="ro">Fișier Shockwave Flash</comment>
- <comment xml:lang="ru">Файл Shockwave Flash</comment>
- <comment xml:lang="sk">Súbor Shockwave Flash</comment>
- <comment xml:lang="sl">Datoteka Shockwave Flash</comment>
- <comment xml:lang="sq">File Flash Shockwave</comment>
- <comment xml:lang="sr">Шоквејв Флеш датотека</comment>
- <comment xml:lang="sv">Shockwave Flash-fil</comment>
- <comment xml:lang="tr">Shockwave Flash dosyası</comment>
- <comment xml:lang="uk">файл Shockwave Flash</comment>
+ <comment xml:lang="zh_TW">Shockwave Flash 檔案</comment>
+ <comment xml:lang="zh_CN">Shockwave Flash 文件</comment>
<comment xml:lang="vi">Tập tin Flash Shockwave</comment>
- <comment xml:lang="zh-CN">Shockwave Flash 文件</comment>
- <comment xml:lang="zh-TW">Shockwave Flash 檔案</comment>
+ <comment xml:lang="uk">файл Shockwave Flash</comment>
+ <comment xml:lang="tr">Shockwave Flash dosyası</comment>
+ <comment xml:lang="sv">Shockwave Flash-fil</comment>
+ <comment xml:lang="sr">Шоквејв Флеш датотека</comment>
+ <comment xml:lang="sq">kartelë Shockwave Flash</comment>
+ <comment xml:lang="sl">Datoteka Shockwave Flash</comment>
+ <comment xml:lang="si">කම්පන තරංග ෆ්ලෑෂ් ගොනුව</comment>
+ <comment xml:lang="sk">Súbor Shockwave Flash</comment>
+ <comment xml:lang="ru">Файл Shockwave Flash</comment>
+ <comment xml:lang="ro">Fișier Shockwave Flash</comment>
+ <comment xml:lang="pt_BR">Arquivo Shockwave Flash</comment>
+ <comment xml:lang="pt">ficheiro Shockwave Flash</comment>
+ <comment xml:lang="pl">Plik Shockwave Flash</comment>
+ <comment xml:lang="oc">fichièr Shockwave Flash</comment>
+ <comment xml:lang="nn">Shockwave Flash-fil</comment>
+ <comment xml:lang="nl">Shockwave Flash-bestand</comment>
+ <comment xml:lang="nb">Shockwave Flash-fil</comment>
+ <comment xml:lang="ms">Fail Shockwave Flash</comment>
+ <comment xml:lang="lv">Shockwave Flash datne</comment>
+ <comment xml:lang="lt">Shockwave Flash failas</comment>
+ <comment xml:lang="ko">Shockwave 플래시 파일</comment>
+ <comment xml:lang="kk">Shockwave Flash файлы</comment>
+ <comment xml:lang="ja">Shockwave Flash ファイル</comment>
+ <comment xml:lang="it">File Shockwave Flash</comment>
+ <comment xml:lang="is">Shockwave Flash skrá</comment>
+ <comment xml:lang="id">Berkas Shockwave Flash</comment>
+ <comment xml:lang="ia">File Shockwave Flash</comment>
+ <comment xml:lang="hu">Shockwave Flash-fájl</comment>
+ <comment xml:lang="hr">Shockwave Flash datoteka</comment>
+ <comment xml:lang="he">קובץ של Shockwave Flash</comment>
+ <comment xml:lang="gl">ficheiro sockwave Flash</comment>
+ <comment xml:lang="ga">comhad Shockwave Flash</comment>
+ <comment xml:lang="fur">file Shockwave Flash</comment>
+ <comment xml:lang="fr">fichier Shockwave Flash</comment>
+ <comment xml:lang="fo">Shockwave Flash fíla</comment>
+ <comment xml:lang="fi">Shockwave Flash -tiedosto</comment>
+ <comment xml:lang="eu">Shockwave Flash fitxategia</comment>
+ <comment xml:lang="es">archivo Shockwave Flash</comment>
+ <comment xml:lang="eo">dosiero de Shockwave Flash</comment>
+ <comment xml:lang="en_GB">Shockwave Flash file</comment>
+ <comment xml:lang="el">Αρχείο Shockwave Flash</comment>
+ <comment xml:lang="de">Shockwave-Flash-Datei</comment>
+ <comment xml:lang="da">Shockwave Flash-fil</comment>
+ <comment xml:lang="cs">soubor Shockwave Flash</comment>
+ <comment xml:lang="ca">fitxer Shockwave Flash</comment>
+ <comment xml:lang="bg">Файл — Shockwave Flash</comment>
+ <comment xml:lang="be@latin">Fajł Shockwave Flash</comment>
+ <comment xml:lang="be">файл Shockwave Flash</comment>
+ <comment xml:lang="ar">ملف Shockwave Flash</comment>
+ <comment xml:lang="af">Shockwave Flash-lêer</comment>
<alias type="application/x-shockwave-flash"/>
<alias type="application/futuresplash"/>
<generic-icon name="video-x-generic"/>
- <magic priority="50">
+ <magic>
<match type="string" value="FWS" offset="0"/>
<match type="string" value="CWS" offset="0"/>
</magic>
@@ -20253,57 +21279,60 @@ command to generate the output files.
<mime-type type="application/x-shorten">
<!-- translators: "Shorten" is the name of an audio codec -->
<comment>Shorten audio</comment>
- <comment xml:lang="af">Shorten-oudio</comment>
- <comment xml:lang="ar">Shorten سمعي</comment>
- <comment xml:lang="be-Latn">Aŭdyjo Shorten</comment>
- <comment xml:lang="bg">Аудио — Shorten</comment>
- <comment xml:lang="ca">àudio de Shorten</comment>
- <comment xml:lang="cs">zvuk Shorten</comment>
- <comment xml:lang="da">Shorten-lyd</comment>
- <comment xml:lang="de">Shorten-Audio</comment>
- <comment xml:lang="el">Ήχος Shorten</comment>
- <comment xml:lang="en-GB">Shorten audio</comment>
- <comment xml:lang="eo">Shorten-sondosiero</comment>
- <comment xml:lang="es">audio Shorten</comment>
- <comment xml:lang="eu">Shorten audioa</comment>
- <comment xml:lang="fi">Shorten-ääni</comment>
- <comment xml:lang="fo">Shorten ljóður</comment>
- <comment xml:lang="fr">audio Shorten</comment>
- <comment xml:lang="fur">audio Shorten</comment>
- <comment xml:lang="ga">fuaim Shorten</comment>
- <comment xml:lang="gl">son Shorten</comment>
- <comment xml:lang="he">שמע של Shorten</comment>
- <comment xml:lang="hr">Shorten zvučni zapis</comment>
- <comment xml:lang="hu">Shorten hang</comment>
- <comment xml:lang="ia">Audio Shorten</comment>
- <comment xml:lang="id">Audio Shorten</comment>
- <comment xml:lang="it">Audio Shorten</comment>
- <comment xml:lang="ja">Shorten オーディオ</comment>
- <comment xml:lang="kk">Shorten аудиосы</comment>
- <comment xml:lang="ko">Shorten 오디오</comment>
- <comment xml:lang="lt">Shorten garso įrašas</comment>
- <comment xml:lang="lv">Shorten audio</comment>
- <comment xml:lang="nb">Shorten lyd</comment>
- <comment xml:lang="nl">Shorten-audio</comment>
- <comment xml:lang="nn">Shorten-lyd</comment>
- <comment xml:lang="oc">àudio Shorten</comment>
- <comment xml:lang="pl">Plik dźwiękowy Shorten</comment>
- <comment xml:lang="pt">áudio Shorten</comment>
- <comment xml:lang="pt-BR">Áudio Shorten</comment>
- <comment xml:lang="ro">Audio Shorten</comment>
- <comment xml:lang="ru">Аудио Shorten</comment>
- <comment xml:lang="sk">Zvuk Shorten</comment>
- <comment xml:lang="sl">Zvočna datoteka Shorten</comment>
- <comment xml:lang="sq">Audio Shorten</comment>
- <comment xml:lang="sr">Шортен звук</comment>
- <comment xml:lang="sv">Shorten-ljud</comment>
- <comment xml:lang="tr">Shorten sesi</comment>
- <comment xml:lang="uk">звук Shorten</comment>
+ <comment xml:lang="zh_TW">Shorten 音訊</comment>
+ <comment xml:lang="zh_CN">Shorten 音频</comment>
<comment xml:lang="vi">Âm thanh Shorten</comment>
- <comment xml:lang="zh-CN">Shorten 音频</comment>
- <comment xml:lang="zh-TW">Shorten 音訊</comment>
+ <comment xml:lang="uk">звук Shorten</comment>
+ <comment xml:lang="tr">Shorten sesi</comment>
+ <comment xml:lang="sv">Shorten-ljud</comment>
+ <comment xml:lang="sr">Шортен звук</comment>
+ <comment xml:lang="sq">audio Shorten</comment>
+ <comment xml:lang="sl">Zvočna datoteka Shorten</comment>
+ <comment xml:lang="si">ශ්රව්ය උපකරණ කෙටි කරන්න</comment>
+ <comment xml:lang="sk">Zvuk Shorten</comment>
+ <comment xml:lang="ru">Аудио Shorten</comment>
+ <comment xml:lang="ro">Audio Shorten</comment>
+ <comment xml:lang="pt_BR">Áudio Shorten</comment>
+ <comment xml:lang="pt">áudio Shorten</comment>
+ <comment xml:lang="pl">Plik dźwiękowy Shorten</comment>
+ <comment xml:lang="oc">àudio Shorten</comment>
+ <comment xml:lang="nn">Shorten-lyd</comment>
+ <comment xml:lang="nl">Shorten-audio</comment>
+ <comment xml:lang="nb">Shorten lyd</comment>
+ <comment xml:lang="lv">Shorten audio</comment>
+ <comment xml:lang="lt">Shorten garso įrašas</comment>
+ <comment xml:lang="ko">Shorten 오디오</comment>
+ <comment xml:lang="kk">Shorten аудиосы</comment>
+ <comment xml:lang="ja">Shorten オーディオ</comment>
+ <comment xml:lang="it">Audio Shorten</comment>
+ <comment xml:lang="is">Shorten hljóðskrá</comment>
+ <comment xml:lang="id">Audio Shorten</comment>
+ <comment xml:lang="ia">Audio Shorten</comment>
+ <comment xml:lang="hu">Shorten hang</comment>
+ <comment xml:lang="hr">Shorten zvučni zapis</comment>
+ <comment xml:lang="he">שמע של Shorten</comment>
+ <comment xml:lang="gl">son Shorten</comment>
+ <comment xml:lang="ga">fuaim Shorten</comment>
+ <comment xml:lang="fur">audio Shorten</comment>
+ <comment xml:lang="fr">audio Shorten</comment>
+ <comment xml:lang="fo">Shorten ljóður</comment>
+ <comment xml:lang="fi">Shorten-ääni</comment>
+ <comment xml:lang="eu">Shorten audioa</comment>
+ <comment xml:lang="es">audio Shorten</comment>
+ <comment xml:lang="eo">Shorten-sondosiero</comment>
+ <comment xml:lang="en_GB">Shorten audio</comment>
+ <comment xml:lang="el">Ήχος Shorten</comment>
+ <comment xml:lang="de">Shorten-Audio</comment>
+ <comment xml:lang="da">Shorten-lyd</comment>
+ <comment xml:lang="cs">zvuk Shorten</comment>
+ <comment xml:lang="ca">àudio de Shorten</comment>
+ <comment xml:lang="bg">Аудио — Shorten</comment>
+ <comment xml:lang="be@latin">Aŭdyjo Shorten</comment>
+ <comment xml:lang="be">аўдыя Shorten</comment>
+ <comment xml:lang="ar">صوت Shorten</comment>
+ <comment xml:lang="af">Shorten-oudio</comment>
<generic-icon name="audio-x-generic"/>
- <magic priority="50">
+ <magic>
<match type="string" value="ajkg" offset="0"/>
</magic>
<glob pattern="*.shn"/>
@@ -20311,237 +21340,262 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-siag">
<comment>Siag spreadsheet</comment>
- <comment xml:lang="af">Siag-sigblad</comment>
- <comment xml:lang="ar">جدول Siag</comment>
- <comment xml:lang="be-Latn">Raźlikovy arkuš Siag</comment>
- <comment xml:lang="bg">Таблица — Siag</comment>
- <comment xml:lang="ca">full de càlcul Siag</comment>
- <comment xml:lang="cs">sešit Siag</comment>
- <comment xml:lang="da">Siagregneark</comment>
- <comment xml:lang="de">Siag-Tabelle</comment>
- <comment xml:lang="el">Λογιστικό φύλλο Siag</comment>
- <comment xml:lang="en-GB">Siag spreadsheet</comment>
- <comment xml:lang="eo">Siag-kalkultabelo</comment>
- <comment xml:lang="es">hoja de cálculo de Siag</comment>
- <comment xml:lang="eu">Siag kalkulu-orria</comment>
- <comment xml:lang="fi">Siag-taulukko</comment>
- <comment xml:lang="fo">Siag rokniark</comment>
- <comment xml:lang="fr">feuille de calcul Siag</comment>
- <comment xml:lang="fur">sfuei di calcul Siag</comment>
- <comment xml:lang="ga">scarbhileog Siag</comment>
- <comment xml:lang="gl">folla de cálculo de Siag</comment>
- <comment xml:lang="he">גליון נתונים של Siag</comment>
- <comment xml:lang="hr">Siag proračunska tablica</comment>
- <comment xml:lang="hu">Siag-munkafüzet</comment>
- <comment xml:lang="ia">Folio de calculo Siag</comment>
- <comment xml:lang="id">Lembar sebar Siag</comment>
- <comment xml:lang="it">Foglio di calcolo Siag</comment>
- <comment xml:lang="ja">Siag スプレッドシート</comment>
- <comment xml:lang="kk">Siag электрондық кестесі</comment>
- <comment xml:lang="ko">Siag 스프레드시트</comment>
- <comment xml:lang="lt">Siag skaičialentė</comment>
- <comment xml:lang="lv">Siag izklājlapa</comment>
- <comment xml:lang="ms">Hamparan Siag</comment>
- <comment xml:lang="nb">Siag-regneark</comment>
- <comment xml:lang="nl">Siag-rekenblad</comment>
- <comment xml:lang="nn">Siag-rekneark</comment>
- <comment xml:lang="oc">fuèlh de calcul Siag</comment>
- <comment xml:lang="pl">Arkusz Siag</comment>
- <comment xml:lang="pt">folha de cálculo Siag</comment>
- <comment xml:lang="pt-BR">Planilha do Siag</comment>
- <comment xml:lang="ro">Foaie de calcul Siag</comment>
- <comment xml:lang="ru">Электронная таблица Siag</comment>
- <comment xml:lang="sk">Zošit Siag</comment>
- <comment xml:lang="sl">Preglednica Siag</comment>
- <comment xml:lang="sq">Fletë llogaritjesh Siag</comment>
- <comment xml:lang="sr">Сјаг табела</comment>
- <comment xml:lang="sv">Siag-kalkylblad</comment>
- <comment xml:lang="tr">Siag hesap çizelgesi</comment>
- <comment xml:lang="uk">ел. таблиця Siag</comment>
+ <comment xml:lang="zh_TW">Siag 試算表</comment>
+ <comment xml:lang="zh_CN">Siag 电子表格</comment>
<comment xml:lang="vi">Bảng tính Slag</comment>
- <comment xml:lang="zh-CN">Siag 电子表格</comment>
- <comment xml:lang="zh-TW">Siag 試算表</comment>
+ <comment xml:lang="uk">електронна таблиця Siag</comment>
+ <comment xml:lang="tr">Siag hesap çizelgesi</comment>
+ <comment xml:lang="sv">Siag-kalkylblad</comment>
+ <comment xml:lang="sr">Сјаг табела</comment>
+ <comment xml:lang="sq">fletëllogaritje Siag</comment>
+ <comment xml:lang="sl">Preglednica Siag</comment>
+ <comment xml:lang="si">Siag පැතුරුම්පත</comment>
+ <comment xml:lang="sk">Zošit Siag</comment>
+ <comment xml:lang="ru">Электронная таблица Siag</comment>
+ <comment xml:lang="ro">Foaie de calcul Siag</comment>
+ <comment xml:lang="pt_BR">Planilha do Siag</comment>
+ <comment xml:lang="pt">folha de cálculo Siag</comment>
+ <comment xml:lang="pl">Arkusz Siag</comment>
+ <comment xml:lang="oc">fuèlh de calcul Siag</comment>
+ <comment xml:lang="nn">Siag-rekneark</comment>
+ <comment xml:lang="nl">Siag-rekenblad</comment>
+ <comment xml:lang="nb">Siag-regneark</comment>
+ <comment xml:lang="ms">Hamparan Siag</comment>
+ <comment xml:lang="lv">Siag izklājlapa</comment>
+ <comment xml:lang="lt">Siag skaičialentė</comment>
+ <comment xml:lang="ko">Siag 스프레드시트</comment>
+ <comment xml:lang="kk">Siag электрондық кестесі</comment>
+ <comment xml:lang="ja">Siag スプレッドシート</comment>
+ <comment xml:lang="it">Foglio di calcolo Siag</comment>
+ <comment xml:lang="is">Siag töflureikniskjal</comment>
+ <comment xml:lang="id">Lembar sebar Siag</comment>
+ <comment xml:lang="ia">Folio de calculo Siag</comment>
+ <comment xml:lang="hu">Siag-munkafüzet</comment>
+ <comment xml:lang="hr">Siag proračunska tablica</comment>
+ <comment xml:lang="he">גיליון נתונים של Siag</comment>
+ <comment xml:lang="gl">folla de cálculo de Siag</comment>
+ <comment xml:lang="ga">scarbhileog Siag</comment>
+ <comment xml:lang="fur">sfuei di calcul Siag</comment>
+ <comment xml:lang="fr">feuille de calcul Siag</comment>
+ <comment xml:lang="fo">Siag rokniark</comment>
+ <comment xml:lang="fi">Siag-taulukko</comment>
+ <comment xml:lang="eu">Siag kalkulu-orria</comment>
+ <comment xml:lang="es">hoja de cálculo de Siag</comment>
+ <comment xml:lang="eo">Siag-kalkultabelo</comment>
+ <comment xml:lang="en_GB">Siag spreadsheet</comment>
+ <comment xml:lang="el">Λογιστικό φύλλο Siag</comment>
+ <comment xml:lang="de">Siag-Tabelle</comment>
+ <comment xml:lang="da">Siagregneark</comment>
+ <comment xml:lang="cs">sešit Siag</comment>
+ <comment xml:lang="ca">full de càlcul Siag</comment>
+ <comment xml:lang="bg">Таблица — Siag</comment>
+ <comment xml:lang="be@latin">Raźlikovy arkuš Siag</comment>
+ <comment xml:lang="be">электронная табліца Siag</comment>
+ <comment xml:lang="ar">جدول Siag</comment>
+ <comment xml:lang="af">Siag-sigblad</comment>
<generic-icon name="x-office-spreadsheet"/>
<glob pattern="*.siag"/>
</mime-type>
<mime-type type="image/x-skencil">
<comment>Skencil document</comment>
- <comment xml:lang="af">Skencil-dokument</comment>
- <comment xml:lang="ar">مستند Skencil</comment>
- <comment xml:lang="ast">Documentu de Skencil</comment>
- <comment xml:lang="be-Latn">Dakument Skencil</comment>
- <comment xml:lang="bg">Документ — Skencil</comment>
- <comment xml:lang="ca">document Skencil</comment>
- <comment xml:lang="cs">dokument Skencil</comment>
- <comment xml:lang="da">Skencildokument</comment>
- <comment xml:lang="de">Skencil-Dokument</comment>
- <comment xml:lang="el">Έγγραφο Skencil</comment>
- <comment xml:lang="en-GB">Skencil document</comment>
- <comment xml:lang="eo">Skencil-dokumento</comment>
- <comment xml:lang="es">documento de Skencil</comment>
- <comment xml:lang="eu">Skencil dokumentua</comment>
- <comment xml:lang="fi">Skencil-asiakirja</comment>
- <comment xml:lang="fo">Skencil skjal</comment>
- <comment xml:lang="fr">document Skencil</comment>
- <comment xml:lang="fur">document Skencil</comment>
- <comment xml:lang="ga">cáipéis Skencil</comment>
- <comment xml:lang="gl">documento Skencil</comment>
- <comment xml:lang="he">מסמך Skencil</comment>
- <comment xml:lang="hr">Skencil dokument</comment>
- <comment xml:lang="hu">Skencil-dokumentum</comment>
- <comment xml:lang="ia">Documento Skencil</comment>
- <comment xml:lang="id">Dokumen Skencil</comment>
- <comment xml:lang="it">Documento Skencil</comment>
- <comment xml:lang="ja">Skencil ドキュメント</comment>
- <comment xml:lang="kk">Skencil құжаты</comment>
- <comment xml:lang="ko">Skencil 문서</comment>
- <comment xml:lang="lt">Skencil dokumentas</comment>
- <comment xml:lang="lv">Skencil dokuments</comment>
- <comment xml:lang="nl">Skencil-document</comment>
- <comment xml:lang="nn">Skencil-dokument</comment>
- <comment xml:lang="oc">document Skencil</comment>
- <comment xml:lang="pl">Dokument Skencil</comment>
- <comment xml:lang="pt">documento Skencil</comment>
- <comment xml:lang="pt-BR">Documento do Skencil</comment>
- <comment xml:lang="ro">Document Skencil</comment>
- <comment xml:lang="ru">Документ Skencil</comment>
- <comment xml:lang="sk">Dokument Skencil</comment>
- <comment xml:lang="sl">Dokument Skencil</comment>
- <comment xml:lang="sq">Dokument Skencil</comment>
- <comment xml:lang="sr">Скенцил документ</comment>
- <comment xml:lang="sv">Skencil-dokument</comment>
- <comment xml:lang="tr">Skencil belgesi</comment>
- <comment xml:lang="uk">документ Skencil</comment>
+ <comment xml:lang="zh_TW">Skencil 文件</comment>
+ <comment xml:lang="zh_CN">Skencil 文档</comment>
<comment xml:lang="vi">Tài liệu Skencil</comment>
- <comment xml:lang="zh-CN">Skencil 文档</comment>
- <comment xml:lang="zh-TW">Skencil 文件</comment>
+ <comment xml:lang="uk">документ Skencil</comment>
+ <comment xml:lang="tr">Skencil belgesi</comment>
+ <comment xml:lang="sv">Skencil-dokument</comment>
+ <comment xml:lang="sr">Скенцил документ</comment>
+ <comment xml:lang="sq">dokument Skencil</comment>
+ <comment xml:lang="sl">Dokument Skencil</comment>
+ <comment xml:lang="si">ස්කෙන්සිල් ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument Skencil</comment>
+ <comment xml:lang="ru">Документ Skencil</comment>
+ <comment xml:lang="ro">Document Skencil</comment>
+ <comment xml:lang="pt_BR">Documento do Skencil</comment>
+ <comment xml:lang="pt">documento Skencil</comment>
+ <comment xml:lang="pl">Dokument Skencil</comment>
+ <comment xml:lang="oc">document Skencil</comment>
+ <comment xml:lang="nn">Skencil-dokument</comment>
+ <comment xml:lang="nl">Skencil-document</comment>
+ <comment xml:lang="lv">Skencil dokuments</comment>
+ <comment xml:lang="lt">Skencil dokumentas</comment>
+ <comment xml:lang="ko">Skencil 문서</comment>
+ <comment xml:lang="kk">Skencil құжаты</comment>
+ <comment xml:lang="ja">Skencil ドキュメント</comment>
+ <comment xml:lang="it">Documento Skencil</comment>
+ <comment xml:lang="is">Skencil skjal</comment>
+ <comment xml:lang="id">Dokumen Skencil</comment>
+ <comment xml:lang="ia">Documento Skencil</comment>
+ <comment xml:lang="hu">Skencil-dokumentum</comment>
+ <comment xml:lang="hr">Skencil dokument</comment>
+ <comment xml:lang="he">מסמך Skencil</comment>
+ <comment xml:lang="gl">documento Skencil</comment>
+ <comment xml:lang="ga">cáipéis Skencil</comment>
+ <comment xml:lang="fur">document Skencil</comment>
+ <comment xml:lang="fr">document Skencil</comment>
+ <comment xml:lang="fo">Skencil skjal</comment>
+ <comment xml:lang="fi">Skencil-asiakirja</comment>
+ <comment xml:lang="eu">Skencil dokumentua</comment>
+ <comment xml:lang="es">documento de Skencil</comment>
+ <comment xml:lang="eo">Skencil-dokumento</comment>
+ <comment xml:lang="en_GB">Skencil document</comment>
+ <comment xml:lang="el">Έγγραφο Skencil</comment>
+ <comment xml:lang="de">Skencil-Dokument</comment>
+ <comment xml:lang="da">Skencildokument</comment>
+ <comment xml:lang="cs">dokument Skencil</comment>
+ <comment xml:lang="ca">document Skencil</comment>
+ <comment xml:lang="bg">Документ — Skencil</comment>
+ <comment xml:lang="be@latin">Dakument Skencil</comment>
+ <comment xml:lang="be">дакумент Skencil</comment>
+ <comment xml:lang="ast">Documentu de Skencil</comment>
+ <comment xml:lang="ar">مستند Skencil</comment>
+ <comment xml:lang="af">Skencil-dokument</comment>
<glob pattern="*.sk"/>
<glob pattern="*.sk1"/>
- <magic priority="50">
+ <magic>
<match type="string" value="##Sketch" offset="0"/>
</magic>
</mime-type>
<mime-type type="application/x-slp">
<comment>Stampede package</comment>
- <comment xml:lang="af">Stampede-pakket</comment>
- <comment xml:lang="ar">حزمة Stampede</comment>
- <comment xml:lang="az">Stampede paketi</comment>
- <comment xml:lang="be-Latn">Pakunak Stampede</comment>
- <comment xml:lang="bg">Пакет — Stampede</comment>
- <comment xml:lang="ca">paquet Stampede</comment>
- <comment xml:lang="cs">balíček Stampede</comment>
- <comment xml:lang="cy">Pecyn Stampede</comment>
- <comment xml:lang="da">Stampedepakke</comment>
- <comment xml:lang="de">Stampede-Paket</comment>
- <comment xml:lang="el">Πακέτο Stampede</comment>
- <comment xml:lang="en-GB">Stampede package</comment>
- <comment xml:lang="eo">Stampede-pakaĵo</comment>
- <comment xml:lang="es">paquete Stampede</comment>
- <comment xml:lang="eu">Stampede paketea</comment>
- <comment xml:lang="fi">Stampede-paketti</comment>
- <comment xml:lang="fo">Stampede pakki</comment>
- <comment xml:lang="fr">paquet Stampede</comment>
- <comment xml:lang="fur">pachet Stampede</comment>
- <comment xml:lang="ga">pacáiste Stampede</comment>
- <comment xml:lang="gl">paquete Stampede</comment>
- <comment xml:lang="he">חבילה של Stampede</comment>
- <comment xml:lang="hr">Stampede paket</comment>
- <comment xml:lang="hu">Stampede-csomag</comment>
- <comment xml:lang="ia">Pacchetto Stampede</comment>
- <comment xml:lang="id">Paket Stampede</comment>
- <comment xml:lang="it">Pacchetto Stampede</comment>
- <comment xml:lang="ja">Stampede パッケージ</comment>
- <comment xml:lang="kk">Stampede дестесі</comment>
- <comment xml:lang="ko">Stampete 패키지</comment>
- <comment xml:lang="lt">Stampede paketas</comment>
- <comment xml:lang="lv">Stampede pakotne</comment>
- <comment xml:lang="ms">Pakej Stampede</comment>
- <comment xml:lang="nb">Stampede-pakke</comment>
- <comment xml:lang="nl">Stampede-pakket</comment>
- <comment xml:lang="nn">Stampede-pakke</comment>
- <comment xml:lang="oc">paquet Stampede</comment>
- <comment xml:lang="pl">Pakiet Stampede</comment>
- <comment xml:lang="pt">pacote Stampede</comment>
- <comment xml:lang="pt-BR">Pacote Stampede</comment>
- <comment xml:lang="ro">Pachet Stampede</comment>
- <comment xml:lang="ru">Пакет Stampede</comment>
- <comment xml:lang="sk">Balíček Stampede</comment>
- <comment xml:lang="sl">Datoteka paketa Stampede</comment>
- <comment xml:lang="sq">Paketë Stampede</comment>
- <comment xml:lang="sr">Стампеде пакет</comment>
- <comment xml:lang="sv">Stampede-paket</comment>
- <comment xml:lang="tr">Stampede paketi</comment>
- <comment xml:lang="uk">пакунок Stampede</comment>
+ <comment xml:lang="zh_TW">Stampede 軟體包</comment>
+ <comment xml:lang="zh_CN">Stampede 软件包</comment>
<comment xml:lang="vi">Gói Stampede</comment>
- <comment xml:lang="zh-CN">Stampede 软件包</comment>
- <comment xml:lang="zh-TW">Stampede 軟體包</comment>
+ <comment xml:lang="uk">пакунок Stampede</comment>
+ <comment xml:lang="tr">Stampede paketi</comment>
+ <comment xml:lang="sv">Stampede-paket</comment>
+ <comment xml:lang="sr">Стампеде пакет</comment>
+ <comment xml:lang="sq">paketë Stampede</comment>
+ <comment xml:lang="sl">Datoteka paketa Stampede</comment>
+ <comment xml:lang="si">මුද්දර පැකේජය</comment>
+ <comment xml:lang="sk">Balíček Stampede</comment>
+ <comment xml:lang="ru">Пакет Stampede</comment>
+ <comment xml:lang="ro">Pachet Stampede</comment>
+ <comment xml:lang="pt_BR">Pacote Stampede</comment>
+ <comment xml:lang="pt">pacote Stampede</comment>
+ <comment xml:lang="pl">Pakiet Stampede</comment>
+ <comment xml:lang="oc">paquet Stampede</comment>
+ <comment xml:lang="nn">Stampede-pakke</comment>
+ <comment xml:lang="nl">Stampede-pakket</comment>
+ <comment xml:lang="nb">Stampede-pakke</comment>
+ <comment xml:lang="ms">Pakej Stampede</comment>
+ <comment xml:lang="lv">Stampede pakotne</comment>
+ <comment xml:lang="lt">Stampede paketas</comment>
+ <comment xml:lang="ko">Stampete 패키지</comment>
+ <comment xml:lang="kk">Stampede дестесі</comment>
+ <comment xml:lang="ja">Stampede パッケージ</comment>
+ <comment xml:lang="it">Pacchetto Stampede</comment>
+ <comment xml:lang="is">Stampede pakki</comment>
+ <comment xml:lang="id">Paket Stampede</comment>
+ <comment xml:lang="ia">Pacchetto Stampede</comment>
+ <comment xml:lang="hu">Stampede-csomag</comment>
+ <comment xml:lang="hr">Stampede paket</comment>
+ <comment xml:lang="he">חבילה של Stampede</comment>
+ <comment xml:lang="gl">paquete Stampede</comment>
+ <comment xml:lang="ga">pacáiste Stampede</comment>
+ <comment xml:lang="fur">pachet Stampede</comment>
+ <comment xml:lang="fr">paquet Stampede</comment>
+ <comment xml:lang="fo">Stampede pakki</comment>
+ <comment xml:lang="fi">Stampede-paketti</comment>
+ <comment xml:lang="eu">Stampede paketea</comment>
+ <comment xml:lang="es">paquete Stampede</comment>
+ <comment xml:lang="eo">Stampede-pakaĵo</comment>
+ <comment xml:lang="en_GB">Stampede package</comment>
+ <comment xml:lang="el">Πακέτο Stampede</comment>
+ <comment xml:lang="de">Stampede-Paket</comment>
+ <comment xml:lang="da">Stampedepakke</comment>
+ <comment xml:lang="cy">Pecyn Stampede</comment>
+ <comment xml:lang="cs">balíček Stampede</comment>
+ <comment xml:lang="ca">paquet Stampede</comment>
+ <comment xml:lang="bg">Пакет — Stampede</comment>
+ <comment xml:lang="be@latin">Pakunak Stampede</comment>
+ <comment xml:lang="be">пакет Stampede</comment>
+ <comment xml:lang="az">Stampede paketi</comment>
+ <comment xml:lang="ar">حزمة Stampede</comment>
+ <comment xml:lang="af">Stampede-pakket</comment>
<generic-icon name="package-x-generic"/>
</mime-type>
<mime-type type="application/x-sg1000-rom">
<comment>SG-1000 ROM</comment>
- <comment xml:lang="bg">ROM — SG-1000</comment>
- <comment xml:lang="ca">ROM de SG-1000</comment>
- <comment xml:lang="cs">ROM pro SG-1000</comment>
- <comment xml:lang="da">SG-1000-ROM</comment>
- <comment xml:lang="de">SG-1000 ROM</comment>
- <comment xml:lang="en-GB">SG-1000 ROM</comment>
- <comment xml:lang="es">ROM de SG-1000</comment>
- <comment xml:lang="eu">SG-1000 ROM</comment>
- <comment xml:lang="fi">SG-1000 -ROM</comment>
- <comment xml:lang="fr">ROM SG-1000</comment>
- <comment xml:lang="fur">ROM SG-1000</comment>
- <comment xml:lang="ga">ROM SG-1000</comment>
- <comment xml:lang="hr">SG-1000 ROM</comment>
- <comment xml:lang="hu">SG-1000 ROM</comment>
- <comment xml:lang="id">ROM SG-1000</comment>
- <comment xml:lang="it">ROM SG-1000</comment>
- <comment xml:lang="kk">SG-1000 ROM</comment>
- <comment xml:lang="ko">SG-1000 롬</comment>
- <comment xml:lang="pl">Plik ROM konsoli SG-1000</comment>
- <comment xml:lang="pt-BR">ROM de SG-1000</comment>
- <comment xml:lang="ru">SG-1000 ROM</comment>
- <comment xml:lang="sk">ROM pre SG-1000</comment>
- <comment xml:lang="sl">SG-1000 ROM</comment>
- <comment xml:lang="sr">СГ-1000 РОМ</comment>
- <comment xml:lang="sv">SG-1000-rom</comment>
- <comment xml:lang="tr">SG-1000 ROM</comment>
+ <comment xml:lang="zh_TW">SG-1000 ROM</comment>
+ <comment xml:lang="zh_CN">SG-1000 ROM</comment>
<comment xml:lang="uk">ППП SG-1000</comment>
- <comment xml:lang="zh-CN">SG-1000 ROM</comment>
- <comment xml:lang="zh-TW">SG-1000 ROM</comment>
+ <comment xml:lang="tr">SG-1000 ROM</comment>
+ <comment xml:lang="sv">SG-1000-rom</comment>
+ <comment xml:lang="sr">СГ-1000 РОМ</comment>
+ <comment xml:lang="sq">ROM SG-1000</comment>
+ <comment xml:lang="sl">SG-1000 ROM</comment>
+ <comment xml:lang="si">SG-1000 ROM</comment>
+ <comment xml:lang="sk">ROM pre SG-1000</comment>
+ <comment xml:lang="ru">SG-1000 ROM</comment>
+ <comment xml:lang="pt_BR">ROM de SG-1000</comment>
+ <comment xml:lang="pl">Plik ROM konsoli SG-1000</comment>
+ <comment xml:lang="nl">SG-1000-ROM</comment>
+ <comment xml:lang="ko">SG-1000 롬</comment>
+ <comment xml:lang="kk">SG-1000 ROM</comment>
+ <comment xml:lang="ja">SG-1000 ROM</comment>
+ <comment xml:lang="it">ROM SG-1000</comment>
+ <comment xml:lang="is">SG-1000 ROM</comment>
+ <comment xml:lang="id">ROM SG-1000</comment>
+ <comment xml:lang="hu">SG-1000 ROM</comment>
+ <comment xml:lang="hr">SG-1000 ROM</comment>
+ <comment xml:lang="he">ROM של SG-1000</comment>
+ <comment xml:lang="ga">ROM SG-1000</comment>
+ <comment xml:lang="fur">ROM SG-1000</comment>
+ <comment xml:lang="fr">ROM SG-1000</comment>
+ <comment xml:lang="fi">SG-1000 -ROM</comment>
+ <comment xml:lang="eu">SG-1000 ROM</comment>
+ <comment xml:lang="es">ROM de SG-1000</comment>
+ <comment xml:lang="en_GB">SG-1000 ROM</comment>
+ <comment xml:lang="de">SG-1000-ROM</comment>
+ <comment xml:lang="da">SG-1000-ROM</comment>
+ <comment xml:lang="cs">ROM pro SG-1000</comment>
+ <comment xml:lang="ca">ROM de SG-1000</comment>
+ <comment xml:lang="bg">ROM — SG-1000</comment>
+ <comment xml:lang="be">SG-1000 ROM</comment>
+ <comment xml:lang="ar">روم SG-1000</comment>
<generic-icon name="application-x-executable"/>
<glob pattern="*.sg"/>
</mime-type>
<mime-type type="application/x-sms-rom">
<!-- Translate this to "Master System/Mark III" if the console was known as such in your locale (probably only in Japan) -->
<comment>Master System ROM</comment>
- <comment xml:lang="bg">ROM — Master System</comment>
- <comment xml:lang="ca">ROM de Master System</comment>
- <comment xml:lang="cs">ROM pro Master System</comment>
- <comment xml:lang="da">Master System-ROM</comment>
- <comment xml:lang="de">Master System ROM</comment>
- <comment xml:lang="en-GB">Master System ROM</comment>
- <comment xml:lang="es">ROM de Master System</comment>
- <comment xml:lang="eu">Master System ROM</comment>
- <comment xml:lang="fi">Master System -ROM</comment>
- <comment xml:lang="fr">ROM Master System</comment>
- <comment xml:lang="fur">ROM Master System</comment>
- <comment xml:lang="ga">ROM Master System</comment>
- <comment xml:lang="hr">Master System ROM</comment>
- <comment xml:lang="hu">Master System ROM</comment>
- <comment xml:lang="id">ROM Master System</comment>
- <comment xml:lang="it">ROM Master System</comment>
- <comment xml:lang="kk">Master System ROM</comment>
- <comment xml:lang="ko">마스터 시스템 롬</comment>
- <comment xml:lang="pl">Plik ROM konsoli SMS</comment>
- <comment xml:lang="pt-BR">ROM de Master System</comment>
- <comment xml:lang="ru">Master System ROM</comment>
- <comment xml:lang="sk">ROM pre Master System</comment>
- <comment xml:lang="sr">Мастер Систем РОМ</comment>
- <comment xml:lang="sv">Master System-rom</comment>
- <comment xml:lang="tr">Master System ROM</comment>
+ <comment xml:lang="zh_TW">Master System ROM</comment>
+ <comment xml:lang="zh_CN">Master System ROM</comment>
<comment xml:lang="uk">ППП Master System</comment>
- <comment xml:lang="zh-CN">Master System ROM</comment>
- <comment xml:lang="zh-TW">Master System ROM</comment>
+ <comment xml:lang="tr">Master System ROM</comment>
+ <comment xml:lang="sv">Master System-rom</comment>
+ <comment xml:lang="sr">Мастер Систем РОМ</comment>
+ <comment xml:lang="sq">ROM Master System</comment>
+ <comment xml:lang="si">Master System ROM</comment>
+ <comment xml:lang="sk">ROM pre Master System</comment>
+ <comment xml:lang="ru">Master System ROM</comment>
+ <comment xml:lang="pt_BR">ROM de Master System</comment>
+ <comment xml:lang="pl">Plik ROM konsoli SMS</comment>
+ <comment xml:lang="nl">Master System-ROM</comment>
+ <comment xml:lang="ko">마스터 시스템 롬</comment>
+ <comment xml:lang="kk">Master System ROM</comment>
+ <comment xml:lang="ja">マスターシステム ROM</comment>
+ <comment xml:lang="it">ROM Master System</comment>
+ <comment xml:lang="is">Master System ROM</comment>
+ <comment xml:lang="id">ROM Master System</comment>
+ <comment xml:lang="hu">Master System ROM</comment>
+ <comment xml:lang="hr">Master System ROM</comment>
+ <comment xml:lang="he">ROM של Master System</comment>
+ <comment xml:lang="ga">ROM Master System</comment>
+ <comment xml:lang="fur">ROM Master System</comment>
+ <comment xml:lang="fr">ROM Master System</comment>
+ <comment xml:lang="fi">Master System -ROM</comment>
+ <comment xml:lang="eu">Master System ROM</comment>
+ <comment xml:lang="es">ROM de Master System</comment>
+ <comment xml:lang="en_GB">Master System ROM</comment>
+ <comment xml:lang="de">Master-System-ROM</comment>
+ <comment xml:lang="da">Master System-ROM</comment>
+ <comment xml:lang="cs">ROM pro Master System</comment>
+ <comment xml:lang="ca">ROM de Master System</comment>
+ <comment xml:lang="bg">ROM — Master System</comment>
+ <comment xml:lang="be">Master System ROM</comment>
+ <comment xml:lang="ar">روم Master System</comment>
<generic-icon name="application-x-executable"/>
<!-- Disabled, the magic would be too far into the file
<magic>
@@ -20554,34 +21608,43 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-gamegear-rom">
<comment>Game Gear ROM</comment>
- <comment xml:lang="bg">ROM — Game Gear</comment>
- <comment xml:lang="ca">ROM de Game Gear</comment>
- <comment xml:lang="cs">ROM pro Game Gear</comment>
- <comment xml:lang="da">Game Gear-ROM</comment>
- <comment xml:lang="de">Game Gear ROM</comment>
- <comment xml:lang="en-GB">Game Gear ROM</comment>
- <comment xml:lang="es">ROM de Game Gear</comment>
- <comment xml:lang="eu">Game Gear ROM</comment>
- <comment xml:lang="fi">Game Gear -ROM</comment>
- <comment xml:lang="fr">ROM Game Gear</comment>
- <comment xml:lang="fur">ROM Game Gear</comment>
- <comment xml:lang="ga">ROM Game Gear</comment>
- <comment xml:lang="hr">Game Gear ROM</comment>
- <comment xml:lang="hu">Game Gear ROM</comment>
- <comment xml:lang="id">ROM Game Gear</comment>
- <comment xml:lang="it">ROM Game Gear</comment>
- <comment xml:lang="kk">Game Gear ROM</comment>
- <comment xml:lang="ko">게임 기어 롬</comment>
- <comment xml:lang="pl">Plik ROM konsoli Game Gear</comment>
- <comment xml:lang="pt-BR">ROM de Game Gear</comment>
- <comment xml:lang="ru">Game Gear ROM</comment>
- <comment xml:lang="sk">ROM pre Game Gear</comment>
- <comment xml:lang="sr">Гејм Гир РОМ</comment>
- <comment xml:lang="sv">Game Gear-rom</comment>
- <comment xml:lang="tr">Game Gear ROM</comment>
+ <comment xml:lang="zh_TW">Game Gear ROM</comment>
+ <comment xml:lang="zh_CN">Game Gear ROM</comment>
<comment xml:lang="uk">ППП Game Gear</comment>
- <comment xml:lang="zh-CN">Game Gear ROM</comment>
- <comment xml:lang="zh-TW">Game Gear ROM</comment>
+ <comment xml:lang="tr">Game Gear ROM</comment>
+ <comment xml:lang="sv">Game Gear-rom</comment>
+ <comment xml:lang="sr">Гејм Гир РОМ</comment>
+ <comment xml:lang="sq">ROM Game Gear</comment>
+ <comment xml:lang="sl">Game Gear ROM</comment>
+ <comment xml:lang="si">Game Gear ROM</comment>
+ <comment xml:lang="sk">ROM pre Game Gear</comment>
+ <comment xml:lang="ru">Game Gear ROM</comment>
+ <comment xml:lang="pt_BR">ROM de Game Gear</comment>
+ <comment xml:lang="pl">Plik ROM konsoli Game Gear</comment>
+ <comment xml:lang="nl">Game Gear-ROM</comment>
+ <comment xml:lang="ko">게임 기어 롬</comment>
+ <comment xml:lang="kk">Game Gear ROM</comment>
+ <comment xml:lang="ja">ゲームギア ROM</comment>
+ <comment xml:lang="it">ROM Game Gear</comment>
+ <comment xml:lang="is">Game Gear ROM</comment>
+ <comment xml:lang="id">ROM Game Gear</comment>
+ <comment xml:lang="hu">Game Gear ROM</comment>
+ <comment xml:lang="hr">Game Gear ROM</comment>
+ <comment xml:lang="he">ROM של Game Gear</comment>
+ <comment xml:lang="ga">ROM Game Gear</comment>
+ <comment xml:lang="fur">ROM Game Gear</comment>
+ <comment xml:lang="fr">ROM Game Gear</comment>
+ <comment xml:lang="fi">Game Gear -ROM</comment>
+ <comment xml:lang="eu">Game Gear ROM</comment>
+ <comment xml:lang="es">ROM de Game Gear</comment>
+ <comment xml:lang="en_GB">Game Gear ROM</comment>
+ <comment xml:lang="de">Game-Gear-ROM</comment>
+ <comment xml:lang="da">Game Gear-ROM</comment>
+ <comment xml:lang="cs">ROM pro Game Gear</comment>
+ <comment xml:lang="ca">ROM de Game Gear</comment>
+ <comment xml:lang="bg">ROM — Game Gear</comment>
+ <comment xml:lang="be">Game Gear ROM</comment>
+ <comment xml:lang="ar">روم جيم جير</comment>
<generic-icon name="application-x-executable"/>
<!-- Disabled, the magic would be too far into the file
<magic>
@@ -20596,53 +21659,56 @@ command to generate the output files.
<mime-type type="application/vnd.nintendo.snes.rom">
<!-- Translate this as Super Famicom (in Far East Asia) or Super Nintendo (in Europe) if the console was known as such in your locale -->
<comment>Super NES ROM</comment>
- <comment xml:lang="ar">Super NES ROM</comment>
- <comment xml:lang="be-Latn">Super Nintendo ROM</comment>
- <comment xml:lang="bg">ROM — Super NES</comment>
- <comment xml:lang="ca">ROM de Super NES</comment>
- <comment xml:lang="cs">ROM pro Super Nintendo</comment>
- <comment xml:lang="da">Super NES-ROM</comment>
- <comment xml:lang="de">Super NES ROM</comment>
- <comment xml:lang="el">Super NES ROM</comment>
- <comment xml:lang="en-GB">Super NES ROM</comment>
- <comment xml:lang="es">ROM de Super NES</comment>
- <comment xml:lang="eu">Super Nintendo-ko ROMa</comment>
- <comment xml:lang="fi">Super Nintendo -ROM</comment>
- <comment xml:lang="fo">Super NES ROM</comment>
- <comment xml:lang="fr">ROM Super Nintendo</comment>
- <comment xml:lang="fur">ROM Super Nintendo</comment>
- <comment xml:lang="ga">ROM Super NES</comment>
- <comment xml:lang="gl">ROM de Super NES</comment>
- <comment xml:lang="he">ROM של Super NES</comment>
- <comment xml:lang="hr">Super NES ROM</comment>
- <comment xml:lang="hu">Super NES ROM</comment>
- <comment xml:lang="ia">ROM pro Super Nintendo</comment>
- <comment xml:lang="id">Memori baca-saja Super Nintendo</comment>
- <comment xml:lang="it">ROM Super Nintendo</comment>
- <comment xml:lang="ja">スーパーファミコン ROM</comment>
- <comment xml:lang="kk">Super NES ROM</comment>
- <comment xml:lang="ko">수퍼 NES 롬</comment>
- <comment xml:lang="lt">Super NES ROM</comment>
- <comment xml:lang="lv">Super NES ROM</comment>
- <comment xml:lang="nb">Super Nintendo ROM</comment>
- <comment xml:lang="nl">Super Nintendo</comment>
- <comment xml:lang="nn">Super NES-ROM</comment>
- <comment xml:lang="oc">ROM Super Nintendo</comment>
- <comment xml:lang="pl">Plik ROM konsoli SNES</comment>
- <comment xml:lang="pt">ROM Super Nintendo</comment>
- <comment xml:lang="pt-BR">ROM de Super Nintendo</comment>
- <comment xml:lang="ro">ROM Super Nintendo</comment>
- <comment xml:lang="ru">Super NES ROM</comment>
- <comment xml:lang="sk">ROM pre Super Nintendo</comment>
- <comment xml:lang="sl">Bralni pomnilnik Super NES</comment>
- <comment xml:lang="sq">ROM Super NES</comment>
- <comment xml:lang="sr">Супер НЕС РОМ</comment>
- <comment xml:lang="sv">Super NES-rom</comment>
- <comment xml:lang="tr">Super NES ROM</comment>
- <comment xml:lang="uk">ППП Super NES</comment>
+ <comment xml:lang="zh_TW">超級任天堂 ROM</comment>
+ <comment xml:lang="zh_CN">Super NES ROM</comment>
<comment xml:lang="vi">ROM Super Nintendo</comment>
- <comment xml:lang="zh-CN">Super NES ROM</comment>
- <comment xml:lang="zh-TW">超級任天堂 ROM</comment>
+ <comment xml:lang="uk">ППП Super NES</comment>
+ <comment xml:lang="tr">Super NES ROM</comment>
+ <comment xml:lang="sv">Super NES-rom</comment>
+ <comment xml:lang="sr">Супер НЕС РОМ</comment>
+ <comment xml:lang="sq">ROM Super NES</comment>
+ <comment xml:lang="sl">Bralni pomnilnik Super NES</comment>
+ <comment xml:lang="si">සුපිරි NES ROM</comment>
+ <comment xml:lang="sk">ROM pre Super Nintendo</comment>
+ <comment xml:lang="ru">Super NES ROM</comment>
+ <comment xml:lang="ro">ROM Super Nintendo</comment>
+ <comment xml:lang="pt_BR">ROM de Super Nintendo</comment>
+ <comment xml:lang="pt">ROM Super Nintendo</comment>
+ <comment xml:lang="pl">Plik ROM konsoli SNES</comment>
+ <comment xml:lang="oc">ROM Super Nintendo</comment>
+ <comment xml:lang="nn">Super NES-ROM</comment>
+ <comment xml:lang="nl">Super Nintendo-ROM</comment>
+ <comment xml:lang="nb">Super Nintendo ROM</comment>
+ <comment xml:lang="lv">Super NES ROM</comment>
+ <comment xml:lang="lt">Super NES ROM</comment>
+ <comment xml:lang="ko">수퍼 NES 롬</comment>
+ <comment xml:lang="kk">Super NES ROM</comment>
+ <comment xml:lang="ja">スーパーファミコン ROM</comment>
+ <comment xml:lang="it">ROM Super Nintendo</comment>
+ <comment xml:lang="is">Super NES ROM</comment>
+ <comment xml:lang="id">Memori baca-saja Super Nintendo</comment>
+ <comment xml:lang="ia">ROM pro Super Nintendo</comment>
+ <comment xml:lang="hu">Super NES ROM</comment>
+ <comment xml:lang="hr">Super NES ROM</comment>
+ <comment xml:lang="he">ROM של Super NES</comment>
+ <comment xml:lang="gl">ROM de Super NES</comment>
+ <comment xml:lang="ga">ROM Super NES</comment>
+ <comment xml:lang="fur">ROM Super Nintendo</comment>
+ <comment xml:lang="fr">ROM Super Nintendo</comment>
+ <comment xml:lang="fo">Super NES ROM</comment>
+ <comment xml:lang="fi">Super Nintendo -ROM</comment>
+ <comment xml:lang="eu">Super Nintendo-ko ROMa</comment>
+ <comment xml:lang="es">ROM de Super NES</comment>
+ <comment xml:lang="en_GB">Super NES ROM</comment>
+ <comment xml:lang="el">Super NES ROM</comment>
+ <comment xml:lang="de">Super-Nintendo-ROM</comment>
+ <comment xml:lang="da">Super NES-ROM</comment>
+ <comment xml:lang="cs">ROM pro Super Nintendo</comment>
+ <comment xml:lang="ca">ROM de Super NES</comment>
+ <comment xml:lang="bg">ROM — Super NES</comment>
+ <comment xml:lang="be@latin">Super Nintendo ROM</comment>
+ <comment xml:lang="be">Super Nintendo ROM</comment>
+ <comment xml:lang="ar">روم Super NES</comment>
<generic-icon name="application-x-executable"/>
<alias type="application/x-snes-rom"/>
<glob pattern="*.sfc"/>
@@ -20650,55 +21716,58 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-stuffit">
<comment>StuffIt archive</comment>
- <comment xml:lang="af">StuffIt-argief</comment>
- <comment xml:lang="ar">أرشيف StuffIt</comment>
- <comment xml:lang="be-Latn">Archiŭ StuffIt</comment>
- <comment xml:lang="bg">Архив — StuffIt</comment>
- <comment xml:lang="ca">arxiu StuffIt</comment>
- <comment xml:lang="cs">archiv StuffIt</comment>
- <comment xml:lang="da">StuffIt-arkiv</comment>
- <comment xml:lang="de">StuffIt-Archiv</comment>
- <comment xml:lang="el">Συμπιεσμένο αρχείο StuffIt</comment>
- <comment xml:lang="en-GB">StuffIt archive</comment>
- <comment xml:lang="eo">StuffIt-arkivo</comment>
- <comment xml:lang="es">archivador de StuffIt</comment>
- <comment xml:lang="eu">StuffIt artxiboa</comment>
- <comment xml:lang="fi">StuffIt-arkisto</comment>
- <comment xml:lang="fo">StuffIt skjalasavn</comment>
- <comment xml:lang="fr">archive StuffIt</comment>
- <comment xml:lang="fur">archivi StuffIt</comment>
- <comment xml:lang="ga">cartlann StuffIt</comment>
- <comment xml:lang="gl">arquivo StuffIt</comment>
- <comment xml:lang="he">ארכיון של StuffIt</comment>
- <comment xml:lang="hr">StuffIt arhiva</comment>
- <comment xml:lang="hu">StuffIt-archívum</comment>
- <comment xml:lang="ia">Archivo StuffIt</comment>
- <comment xml:lang="id">Arsip StuffIt</comment>
- <comment xml:lang="it">Archivio StuffIt</comment>
- <comment xml:lang="ja">StuffIt アーカイブ</comment>
- <comment xml:lang="kk">StuffIt архиві</comment>
- <comment xml:lang="ko">StuffIt 압축 파일</comment>
- <comment xml:lang="lt">StuffIt archyvas</comment>
- <comment xml:lang="lv">StuffIt arhīvs</comment>
- <comment xml:lang="nb">StuffIt arkiv</comment>
- <comment xml:lang="nl">StuffIt-archief</comment>
- <comment xml:lang="nn">StuffIt-arkiv</comment>
- <comment xml:lang="oc">archiu StuffIt</comment>
- <comment xml:lang="pl">Archiwum StuffIt</comment>
- <comment xml:lang="pt">arquivo StuffIt</comment>
- <comment xml:lang="pt-BR">Pacote StuffIt</comment>
- <comment xml:lang="ro">Arhivă StuffIt</comment>
- <comment xml:lang="ru">Архив StuffIt</comment>
- <comment xml:lang="sk">Archív StuffIt</comment>
- <comment xml:lang="sl">Datoteka arhiva StuffIt</comment>
- <comment xml:lang="sq">Arkiv StuffIt</comment>
- <comment xml:lang="sr">Стаф Ит архива</comment>
- <comment xml:lang="sv">StuffIt-arkiv </comment>
- <comment xml:lang="tr">StuffIt arşivi</comment>
- <comment xml:lang="uk">архів StuffIt</comment>
+ <comment xml:lang="zh_TW">StuffIt 封存檔</comment>
+ <comment xml:lang="zh_CN">Macintosh StuffIt 归档文件</comment>
<comment xml:lang="vi">Kho nén Stuffit</comment>
- <comment xml:lang="zh-CN">Macintosh StuffIt 归档文件</comment>
- <comment xml:lang="zh-TW">StuffIt 封存檔</comment>
+ <comment xml:lang="uk">архів StuffIt</comment>
+ <comment xml:lang="tr">StuffIt arşivi</comment>
+ <comment xml:lang="sv">StuffIt-arkiv </comment>
+ <comment xml:lang="sr">Стаф Ит архива</comment>
+ <comment xml:lang="sq">arkiv StuffIt</comment>
+ <comment xml:lang="sl">Datoteka arhiva StuffIt</comment>
+ <comment xml:lang="si">StuffIt ලේඛනාගාරය</comment>
+ <comment xml:lang="sk">Archív StuffIt</comment>
+ <comment xml:lang="ru">Архив StuffIt</comment>
+ <comment xml:lang="ro">Arhivă StuffIt</comment>
+ <comment xml:lang="pt_BR">Pacote StuffIt</comment>
+ <comment xml:lang="pt">arquivo StuffIt</comment>
+ <comment xml:lang="pl">Archiwum StuffIt</comment>
+ <comment xml:lang="oc">archiu StuffIt</comment>
+ <comment xml:lang="nn">StuffIt-arkiv</comment>
+ <comment xml:lang="nl">StuffIt-archief</comment>
+ <comment xml:lang="nb">StuffIt arkiv</comment>
+ <comment xml:lang="lv">StuffIt arhīvs</comment>
+ <comment xml:lang="lt">StuffIt archyvas</comment>
+ <comment xml:lang="ko">StuffIt 압축 파일</comment>
+ <comment xml:lang="kk">StuffIt архиві</comment>
+ <comment xml:lang="ja">StuffIt アーカイブ</comment>
+ <comment xml:lang="it">Archivio StuffIt</comment>
+ <comment xml:lang="is">StuffIt safnskrá</comment>
+ <comment xml:lang="id">Arsip StuffIt</comment>
+ <comment xml:lang="ia">Archivo StuffIt</comment>
+ <comment xml:lang="hu">StuffIt-archívum</comment>
+ <comment xml:lang="hr">StuffIt arhiva</comment>
+ <comment xml:lang="he">ארכיון של StuffIt</comment>
+ <comment xml:lang="gl">arquivo StuffIt</comment>
+ <comment xml:lang="ga">cartlann StuffIt</comment>
+ <comment xml:lang="fur">archivi StuffIt</comment>
+ <comment xml:lang="fr">archive StuffIt</comment>
+ <comment xml:lang="fo">StuffIt skjalasavn</comment>
+ <comment xml:lang="fi">StuffIt-arkisto</comment>
+ <comment xml:lang="eu">StuffIt artxiboa</comment>
+ <comment xml:lang="es">archivador de StuffIt</comment>
+ <comment xml:lang="eo">StuffIt-arkivo</comment>
+ <comment xml:lang="en_GB">StuffIt archive</comment>
+ <comment xml:lang="el">Συμπιεσμένο αρχείο StuffIt</comment>
+ <comment xml:lang="de">StuffIt-Archiv</comment>
+ <comment xml:lang="da">StuffIt-arkiv</comment>
+ <comment xml:lang="cs">archiv StuffIt</comment>
+ <comment xml:lang="ca">arxiu StuffIt</comment>
+ <comment xml:lang="bg">Архив — StuffIt</comment>
+ <comment xml:lang="be@latin">Archiŭ StuffIt</comment>
+ <comment xml:lang="be">архіў StuffIt</comment>
+ <comment xml:lang="ar">أرشيف StuffIt</comment>
+ <comment xml:lang="af">StuffIt-argief</comment>
<generic-icon name="package-x-generic"/>
<alias type="application/stuffit"/>
<alias type="application/x-sit"/>
@@ -20708,61 +21777,82 @@ command to generate the output files.
</magic>
<glob pattern="*.sit"/>
</mime-type>
+ <mime-type type="application/x-stuffitx">
+ <comment>StuffIt X archive</comment>
+ <comment xml:lang="uk">архів StuffIt X</comment>
+ <comment xml:lang="sv">StuffIt X-arkiv </comment>
+ <comment xml:lang="ru">Архив StuffIt X</comment>
+ <comment xml:lang="pl">Archiwum StuffIt X</comment>
+ <comment xml:lang="it">Archivio StuffIt X</comment>
+ <comment xml:lang="eu">StuffIt X artxiboa</comment>
+ <comment xml:lang="es">archivador de StuffIt X</comment>
+ <comment xml:lang="de">StuffIt-X-Archiv</comment>
+ <comment xml:lang="be">архіў StuffIt X</comment>
+ <generic-icon name="package-x-generic"/>
+ <alias type="application/x-sitx"/>
+ <magic priority="60">
+ <match type="string" value="StuffIt!" offset="0"/>
+ </magic>
+ <glob pattern="*.sitx"/>
+ </mime-type>
<mime-type type="application/x-subrip">
<comment>SubRip subtitles</comment>
- <comment xml:lang="af">SubRip-onderskrifte</comment>
- <comment xml:lang="ar">ترجمات SubRip</comment>
- <comment xml:lang="be-Latn">Subtytry SubRip</comment>
- <comment xml:lang="bg">Субтитри — SubRip</comment>
- <comment xml:lang="ca">subtítols SubRip</comment>
- <comment xml:lang="cs">titulky SubRip</comment>
- <comment xml:lang="da">SubRip-undertekster</comment>
- <comment xml:lang="de">SubRip-Untertitel</comment>
- <comment xml:lang="el">Υπότιτλοι SubRip</comment>
- <comment xml:lang="en-GB">SubRip subtitles</comment>
- <comment xml:lang="eo">SubRip-subtekstoj</comment>
- <comment xml:lang="es">subtítulos SubRip</comment>
- <comment xml:lang="eu">SubRip azpitituluak</comment>
- <comment xml:lang="fi">SubRip-tekstitykset</comment>
- <comment xml:lang="fo">SubRip undirtekstir</comment>
- <comment xml:lang="fr">sous-titres SubRip</comment>
- <comment xml:lang="fur">sottitui SubRip</comment>
- <comment xml:lang="ga">fotheidil SubRip</comment>
- <comment xml:lang="gl">subtítulos SubRip</comment>
- <comment xml:lang="he">כתוביות של SubRip</comment>
- <comment xml:lang="hr">SubRip podnaslovi</comment>
- <comment xml:lang="hu">SubRip feliratok</comment>
- <comment xml:lang="ia">Subtitulos SubRip</comment>
- <comment xml:lang="id">Subjudul SubRip</comment>
- <comment xml:lang="it">Sottotitoli SubRip</comment>
- <comment xml:lang="ja">SubRip 字幕</comment>
- <comment xml:lang="kk">SubRip субтитрлары</comment>
- <comment xml:lang="ko">SubRip 자막 파일</comment>
- <comment xml:lang="lt">SubRip subtitrai</comment>
- <comment xml:lang="lv">SubRip subtitri</comment>
- <comment xml:lang="nb">SubRip undertekst</comment>
- <comment xml:lang="nl">SubRip-ondertitels</comment>
- <comment xml:lang="nn">SubRip-teksting</comment>
- <comment xml:lang="oc">sostítols SubRip</comment>
- <comment xml:lang="pl">Napisy SubRip</comment>
- <comment xml:lang="pt">legendas SubRip</comment>
- <comment xml:lang="pt-BR">Legendas SubRip</comment>
- <comment xml:lang="ro">Subtitrare SubRip</comment>
- <comment xml:lang="ru">Субтитры SubRip</comment>
- <comment xml:lang="sk">Titulky SubRip</comment>
- <comment xml:lang="sl">Datoteka podnapisov SubRip</comment>
- <comment xml:lang="sq">Nëntituj SubRip</comment>
- <comment xml:lang="sr">Суб Рип преводи</comment>
- <comment xml:lang="sv">SubRip-undertexter</comment>
- <comment xml:lang="tr">SubRip alt yazıları</comment>
- <comment xml:lang="uk">субтитри SubRip</comment>
+ <comment xml:lang="zh_TW">SubRip 字幕</comment>
+ <comment xml:lang="zh_CN">SubRip 字幕</comment>
<comment xml:lang="vi">Phụ đề SubRip</comment>
- <comment xml:lang="zh-CN">SubRip 字幕</comment>
- <comment xml:lang="zh-TW">SubRip 字幕</comment>
+ <comment xml:lang="uk">субтитри SubRip</comment>
+ <comment xml:lang="tr">SubRip alt yazıları</comment>
+ <comment xml:lang="sv">SubRip-undertexter</comment>
+ <comment xml:lang="sr">Суб Рип преводи</comment>
+ <comment xml:lang="sq">titra SubRip</comment>
+ <comment xml:lang="sl">Datoteka podnapisov SubRip</comment>
+ <comment xml:lang="si">SubRip උපසිරැසි</comment>
+ <comment xml:lang="sk">Titulky SubRip</comment>
+ <comment xml:lang="ru">Субтитры SubRip</comment>
+ <comment xml:lang="ro">Subtitrare SubRip</comment>
+ <comment xml:lang="pt_BR">Legendas SubRip</comment>
+ <comment xml:lang="pt">legendas SubRip</comment>
+ <comment xml:lang="pl">Napisy SubRip</comment>
+ <comment xml:lang="oc">sostítols SubRip</comment>
+ <comment xml:lang="nn">SubRip-teksting</comment>
+ <comment xml:lang="nl">SubRip-ondertitels</comment>
+ <comment xml:lang="nb">SubRip undertekst</comment>
+ <comment xml:lang="lv">SubRip subtitri</comment>
+ <comment xml:lang="lt">SubRip subtitrai</comment>
+ <comment xml:lang="ko">SubRip 자막 파일</comment>
+ <comment xml:lang="kk">SubRip субтитрлары</comment>
+ <comment xml:lang="ja">SubRip 字幕</comment>
+ <comment xml:lang="it">Sottotitoli SubRip</comment>
+ <comment xml:lang="is">SubRip skjátextar</comment>
+ <comment xml:lang="id">Subjudul SubRip</comment>
+ <comment xml:lang="ia">Subtitulos SubRip</comment>
+ <comment xml:lang="hu">SubRip feliratok</comment>
+ <comment xml:lang="hr">SubRip podnaslovi</comment>
+ <comment xml:lang="he">כתוביות של SubRip</comment>
+ <comment xml:lang="gl">subtítulos SubRip</comment>
+ <comment xml:lang="ga">fotheidil SubRip</comment>
+ <comment xml:lang="fur">sottitui SubRip</comment>
+ <comment xml:lang="fr">sous-titres SubRip</comment>
+ <comment xml:lang="fo">SubRip undirtekstir</comment>
+ <comment xml:lang="fi">SubRip-tekstitykset</comment>
+ <comment xml:lang="eu">SubRip azpitituluak</comment>
+ <comment xml:lang="es">subtítulos SubRip</comment>
+ <comment xml:lang="eo">SubRip-subtekstoj</comment>
+ <comment xml:lang="en_GB">SubRip subtitles</comment>
+ <comment xml:lang="el">Υπότιτλοι SubRip</comment>
+ <comment xml:lang="de">SubRip-Untertitel</comment>
+ <comment xml:lang="da">SubRip-undertekster</comment>
+ <comment xml:lang="cs">titulky SubRip</comment>
+ <comment xml:lang="ca">subtítols SubRip</comment>
+ <comment xml:lang="bg">Субтитри — SubRip</comment>
+ <comment xml:lang="be@latin">Subtytry SubRip</comment>
+ <comment xml:lang="be">субцітры SubRip</comment>
+ <comment xml:lang="ar">ترجمات SubRip</comment>
+ <comment xml:lang="af">SubRip-onderskrifte</comment>
<alias type="application/x-srt"/>
<sub-class-of type="text/plain"/>
<generic-icon name="text-x-generic"/>
- <magic priority="50">
+ <magic>
<match type="string" value="1" offset="0">
<match type="string" value=" --&gt; " offset="0:256"/>
</match>
@@ -20771,111 +21861,119 @@ command to generate the output files.
</mime-type>
<mime-type type="text/vtt">
<comment>WebVTT subtitles</comment>
- <comment xml:lang="af">WebVTT-onderskrifte</comment>
- <comment xml:lang="bg">Субтитри — WebVTT</comment>
- <comment xml:lang="ca">subtítols WebVTT</comment>
- <comment xml:lang="cs">titulky WebVTT</comment>
- <comment xml:lang="da">WebVTT-undertekster</comment>
- <comment xml:lang="de">WebVTT-Untertitel</comment>
- <comment xml:lang="el">Υπότιτλοι WebVTT</comment>
- <comment xml:lang="en-GB">WebVTT subtitles</comment>
- <comment xml:lang="es">subtítulos WebVTT</comment>
- <comment xml:lang="eu">WebVTT azpitituluak</comment>
- <comment xml:lang="fi">WebVTT-tekstitykset</comment>
- <comment xml:lang="fr">sous-titres WebVTT</comment>
- <comment xml:lang="fur">sottitui WebVTT</comment>
- <comment xml:lang="ga">fotheidil WebVTT</comment>
- <comment xml:lang="gl">subtítulos WebVTT</comment>
- <comment xml:lang="he">כתוביות WebVTT</comment>
- <comment xml:lang="hr">WebVTT podnaslovi</comment>
- <comment xml:lang="hu">WebVTT feliratok</comment>
- <comment xml:lang="ia">Subtitulos WebVTT</comment>
- <comment xml:lang="id">Subjudul WebVTT</comment>
- <comment xml:lang="it">Sottotitoli WebVTT</comment>
- <comment xml:lang="ja">WebVTT サブタイトル</comment>
- <comment xml:lang="ka">WebVTT ქვეტიტრები</comment>
- <comment xml:lang="kk">WebVTT субтитрлары</comment>
- <comment xml:lang="ko">WebVTT 자막</comment>
- <comment xml:lang="lv">WebVTT subtitri</comment>
- <comment xml:lang="nl">WebVTT ondertitels</comment>
- <comment xml:lang="oc">sostítols WebVTT</comment>
- <comment xml:lang="pl">Napisy WebVTT</comment>
- <comment xml:lang="pt">legendas WebVTT</comment>
- <comment xml:lang="pt-BR">Legendas WebVTT</comment>
- <comment xml:lang="ru">Субтитры WebVTT</comment>
- <comment xml:lang="sk">Titulky WebVTT</comment>
- <comment xml:lang="sl">Podnapisi WebVTT</comment>
- <comment xml:lang="sr">Веб ВТТ преводи</comment>
- <comment xml:lang="sv">WebVTT-undertexter</comment>
- <comment xml:lang="tr">WebVTT alt yazıları</comment>
+ <comment xml:lang="zh_TW">WebVTT 字幕</comment>
+ <comment xml:lang="zh_CN">WebVTT 字幕</comment>
<comment xml:lang="uk">субтитри WebVTT</comment>
- <comment xml:lang="zh-CN">WebVTT 字幕</comment>
- <comment xml:lang="zh-TW">WebVTT 字幕</comment>
+ <comment xml:lang="tr">WebVTT alt yazıları</comment>
+ <comment xml:lang="sv">WebVTT-undertexter</comment>
+ <comment xml:lang="sr">Веб ВТТ преводи</comment>
+ <comment xml:lang="sq">titra WebVTT</comment>
+ <comment xml:lang="sl">Podnapisi WebVTT</comment>
+ <comment xml:lang="si">WebVTT උපසිරැසි</comment>
+ <comment xml:lang="sk">Titulky WebVTT</comment>
+ <comment xml:lang="ru">Субтитры WebVTT</comment>
+ <comment xml:lang="pt_BR">Legendas WebVTT</comment>
+ <comment xml:lang="pt">legendas WebVTT</comment>
+ <comment xml:lang="pl">Napisy WebVTT</comment>
+ <comment xml:lang="oc">sostítols WebVTT</comment>
+ <comment xml:lang="nl">WebVTT ondertitels</comment>
+ <comment xml:lang="lv">WebVTT subtitri</comment>
+ <comment xml:lang="ko">WebVTT 자막 파일</comment>
+ <comment xml:lang="kk">WebVTT субтитрлары</comment>
+ <comment xml:lang="ka">WebVTT ქვეტიტრები</comment>
+ <comment xml:lang="ja">WebVTT 字幕</comment>
+ <comment xml:lang="it">Sottotitoli WebVTT</comment>
+ <comment xml:lang="is">WebVTT skjátextar</comment>
+ <comment xml:lang="id">Subjudul WebVTT</comment>
+ <comment xml:lang="ia">Subtitulos WebVTT</comment>
+ <comment xml:lang="hu">WebVTT feliratok</comment>
+ <comment xml:lang="hr">WebVTT podnaslovi</comment>
+ <comment xml:lang="he">כתוביות WebVTT</comment>
+ <comment xml:lang="gl">subtítulos WebVTT</comment>
+ <comment xml:lang="ga">fotheidil WebVTT</comment>
+ <comment xml:lang="fur">sottitui WebVTT</comment>
+ <comment xml:lang="fr">sous-titres WebVTT</comment>
+ <comment xml:lang="fi">WebVTT-tekstitykset</comment>
+ <comment xml:lang="eu">WebVTT azpitituluak</comment>
+ <comment xml:lang="es">subtítulos WebVTT</comment>
+ <comment xml:lang="en_GB">WebVTT subtitles</comment>
+ <comment xml:lang="el">Υπότιτλοι WebVTT</comment>
+ <comment xml:lang="de">WebVTT-Untertitel</comment>
+ <comment xml:lang="da">WebVTT-undertekster</comment>
+ <comment xml:lang="cs">titulky WebVTT</comment>
+ <comment xml:lang="ca">subtítols WebVTT</comment>
+ <comment xml:lang="bg">Субтитри — WebVTT</comment>
+ <comment xml:lang="be">субцітры WebVTT</comment>
+ <comment xml:lang="ar">ترجمات WebVTT</comment>
+ <comment xml:lang="af">WebVTT-onderskrifte</comment>
<acronym>VTT</acronym>
<expanded-acronym>Video Text Tracks</expanded-acronym>
<sub-class-of type="text/plain"/>
<generic-icon name="text-x-generic"/>
- <magic priority="50">
+ <magic>
<match type="string" value="WEBVTT" offset="0"/>
</magic>
<glob pattern="*.vtt"/>
</mime-type>
<mime-type type="application/x-sami">
<comment>SAMI subtitles</comment>
- <comment xml:lang="af">SAMI-onderskrifte</comment>
- <comment xml:lang="ar">ترجمات SAMI</comment>
- <comment xml:lang="be-Latn">Subtytry SAMI</comment>
- <comment xml:lang="bg">Субтитри — SAMI</comment>
- <comment xml:lang="ca">subtítols SAMI</comment>
- <comment xml:lang="cs">titulky SAMI</comment>
- <comment xml:lang="da">SAMI-undertekster</comment>
- <comment xml:lang="de">SAMI-Untertitel</comment>
- <comment xml:lang="el">Υπότιτλοι SAMI</comment>
- <comment xml:lang="en-GB">SAMI subtitles</comment>
- <comment xml:lang="eo">SAMI-subtekstoj</comment>
- <comment xml:lang="es">subtítulos SAMI</comment>
- <comment xml:lang="eu">SAMI azpitituluak</comment>
- <comment xml:lang="fi">SAMI-tekstitykset</comment>
- <comment xml:lang="fo">SAMI undirtekstir</comment>
- <comment xml:lang="fr">sous-titres SAMI</comment>
- <comment xml:lang="fur">sottitui SAMI</comment>
- <comment xml:lang="ga">fotheidil SAMI</comment>
- <comment xml:lang="gl">subtítulos SAMI</comment>
- <comment xml:lang="he">כתוביות SAMI</comment>
- <comment xml:lang="hr">SAMI podnaslovi</comment>
- <comment xml:lang="hu">SAMI feliratok</comment>
- <comment xml:lang="ia">Subtitulos SAMI</comment>
- <comment xml:lang="id">Subjudul SAMI</comment>
- <comment xml:lang="it">Sottotitoli SAMI</comment>
- <comment xml:lang="ja">SAMI 字幕</comment>
- <comment xml:lang="kk">SAMI субтитрлары</comment>
- <comment xml:lang="ko">SAMI 자막 파일</comment>
- <comment xml:lang="lt">SAMI subtitrai</comment>
- <comment xml:lang="lv">SAMI subtitri</comment>
- <comment xml:lang="nb">SAMI undertekst</comment>
- <comment xml:lang="nl">SAMI-ondertitels</comment>
- <comment xml:lang="nn">SAMI teksting</comment>
- <comment xml:lang="oc">sostítols SAMI</comment>
- <comment xml:lang="pl">Napisy SAMI</comment>
- <comment xml:lang="pt">legendas SAMI</comment>
- <comment xml:lang="pt-BR">Legendas SAMI</comment>
- <comment xml:lang="ro">Subtitrări SAMI</comment>
- <comment xml:lang="ru">Субтитры SAMI</comment>
- <comment xml:lang="sk">Titulky SAMI</comment>
- <comment xml:lang="sl">Datoteka podnapisov SAMI</comment>
- <comment xml:lang="sq">Nëntituj SAMI</comment>
- <comment xml:lang="sr">САМИ преводи</comment>
- <comment xml:lang="sv">SAMI-undertexter</comment>
- <comment xml:lang="tr">SAMI alt yazıları</comment>
- <comment xml:lang="uk">субтитри SAMI</comment>
+ <comment xml:lang="zh_TW">SAMI 字幕</comment>
+ <comment xml:lang="zh_CN">SAMI 字幕</comment>
<comment xml:lang="vi">Phụ đề SAMI</comment>
- <comment xml:lang="zh-CN">SAMI 字幕</comment>
- <comment xml:lang="zh-TW">SAMI 字幕</comment>
+ <comment xml:lang="uk">субтитри SAMI</comment>
+ <comment xml:lang="tr">SAMI alt yazıları</comment>
+ <comment xml:lang="sv">SAMI-undertexter</comment>
+ <comment xml:lang="sr">САМИ преводи</comment>
+ <comment xml:lang="sq">titra SAMI</comment>
+ <comment xml:lang="sl">Datoteka podnapisov SAMI</comment>
+ <comment xml:lang="si">SAMI උපසිරැසි</comment>
+ <comment xml:lang="sk">Titulky SAMI</comment>
+ <comment xml:lang="ru">Субтитры SAMI</comment>
+ <comment xml:lang="ro">Subtitrări SAMI</comment>
+ <comment xml:lang="pt_BR">Legendas SAMI</comment>
+ <comment xml:lang="pt">legendas SAMI</comment>
+ <comment xml:lang="pl">Napisy SAMI</comment>
+ <comment xml:lang="oc">sostítols SAMI</comment>
+ <comment xml:lang="nn">SAMI teksting</comment>
+ <comment xml:lang="nl">SAMI-ondertitels</comment>
+ <comment xml:lang="nb">SAMI undertekst</comment>
+ <comment xml:lang="lv">SAMI subtitri</comment>
+ <comment xml:lang="lt">SAMI subtitrai</comment>
+ <comment xml:lang="ko">SAMI 자막 파일</comment>
+ <comment xml:lang="kk">SAMI субтитрлары</comment>
+ <comment xml:lang="ja">SAMI 字幕</comment>
+ <comment xml:lang="it">Sottotitoli SAMI</comment>
+ <comment xml:lang="is">SAMI skjátextar</comment>
+ <comment xml:lang="id">Subjudul SAMI</comment>
+ <comment xml:lang="ia">Subtitulos SAMI</comment>
+ <comment xml:lang="hu">SAMI feliratok</comment>
+ <comment xml:lang="hr">SAMI podnaslovi</comment>
+ <comment xml:lang="he">כתוביות SAMI</comment>
+ <comment xml:lang="gl">subtítulos SAMI</comment>
+ <comment xml:lang="ga">fotheidil SAMI</comment>
+ <comment xml:lang="fur">sottitui SAMI</comment>
+ <comment xml:lang="fr">sous-titres SAMI</comment>
+ <comment xml:lang="fo">SAMI undirtekstir</comment>
+ <comment xml:lang="fi">SAMI-tekstitykset</comment>
+ <comment xml:lang="eu">SAMI azpitituluak</comment>
+ <comment xml:lang="es">subtítulos SAMI</comment>
+ <comment xml:lang="eo">SAMI-subtekstoj</comment>
+ <comment xml:lang="en_GB">SAMI subtitles</comment>
+ <comment xml:lang="el">Υπότιτλοι SAMI</comment>
+ <comment xml:lang="de">SAMI-Untertitel</comment>
+ <comment xml:lang="da">SAMI-undertekster</comment>
+ <comment xml:lang="cs">titulky SAMI</comment>
+ <comment xml:lang="ca">subtítols SAMI</comment>
+ <comment xml:lang="bg">Субтитри — SAMI</comment>
+ <comment xml:lang="be@latin">Subtytry SAMI</comment>
+ <comment xml:lang="be">субцітры SAMI</comment>
+ <comment xml:lang="ar">ترجمات SAMI</comment>
+ <comment xml:lang="af">SAMI-onderskrifte</comment>
<acronym>SAMI</acronym>
<expanded-acronym>Synchronized Accessible Media Interchange</expanded-acronym>
<sub-class-of type="text/plain"/>
<generic-icon name="text-x-generic"/>
- <magic priority="50">
+ <magic>
<match type="string" value="&lt;SAMI&gt;" offset="0:256"/>
</magic>
<glob pattern="*.smi"/>
@@ -20883,179 +21981,155 @@ command to generate the output files.
</mime-type>
<mime-type type="text/x-microdvd">
<comment>MicroDVD subtitles</comment>
- <comment xml:lang="af">MicroDVD-onderskrifte</comment>
- <comment xml:lang="ar">ترجمات MicroDVD</comment>
- <comment xml:lang="be-Latn">Subtytry MicroDVD</comment>
- <comment xml:lang="bg">Субтитри — MicroDVD</comment>
- <comment xml:lang="ca">subtítols MicroDVD</comment>
- <comment xml:lang="cs">titulky MicroDVD</comment>
- <comment xml:lang="da">MicroDVD-undertekster</comment>
- <comment xml:lang="de">MicroDVD-Untertitel</comment>
- <comment xml:lang="el">Υπότιτλοι MicroDVD</comment>
- <comment xml:lang="en-GB">MicroDVD subtitles</comment>
- <comment xml:lang="eo">MicroDVD-subtekstoj</comment>
- <comment xml:lang="es">subtítulos de MicroDVD</comment>
- <comment xml:lang="eu">MicroDVD azpitituluak</comment>
- <comment xml:lang="fi">MicroDVD-tekstitykset</comment>
- <comment xml:lang="fo">MicroDVD undirtekstir</comment>
- <comment xml:lang="fr">sous-titres MicroDVD</comment>
- <comment xml:lang="fur">sottitui MicroDVD</comment>
- <comment xml:lang="ga">fotheidil MicroDVD</comment>
- <comment xml:lang="gl">subtítulos de MicroDVD</comment>
- <comment xml:lang="he">כתוביות של MicroDVD</comment>
- <comment xml:lang="hr">MicroDVD podnaslovi</comment>
- <comment xml:lang="hu">MicroDVD feliratok</comment>
- <comment xml:lang="ia">Subtitulos MicroDVD</comment>
- <comment xml:lang="id">Subjudul MicroDVD</comment>
- <comment xml:lang="it">Sottotitoli MicroDVD</comment>
- <comment xml:lang="ja">MicroDVD 字幕</comment>
- <comment xml:lang="ka">MicroDVD-ის ქვეტიტრები</comment>
- <comment xml:lang="kk">MicroDVD субтитрлары</comment>
- <comment xml:lang="ko">MicroDVD 자막 파일</comment>
- <comment xml:lang="lt">MicroDVD subtitrai</comment>
- <comment xml:lang="lv">MicroDVD subtitri</comment>
- <comment xml:lang="nb">MicroDVD undertekst</comment>
- <comment xml:lang="nl">MicroDVD-ondertitels</comment>
- <comment xml:lang="nn">MicroDVD-teksting</comment>
- <comment xml:lang="oc">sostítols MicroDVD</comment>
- <comment xml:lang="pl">Napisy MicroDVD</comment>
- <comment xml:lang="pt">legendas MicroDVD</comment>
- <comment xml:lang="pt-BR">Legendas MicroDVD</comment>
- <comment xml:lang="ro">Subtitrări MicroDVD</comment>
- <comment xml:lang="ru">Субтитры MicroDVD</comment>
- <comment xml:lang="sk">Titulky MicroDVD</comment>
- <comment xml:lang="sl">Datoteka podnapisov MicroDVD</comment>
- <comment xml:lang="sq">Nëntituj MicroDVD</comment>
- <comment xml:lang="sr">Микро ДВД преводи</comment>
- <comment xml:lang="sv">MicroDVD-undertexter</comment>
- <comment xml:lang="tr">MicroDVD alt yazısı</comment>
- <comment xml:lang="uk">субтитри MicroDVD</comment>
+ <comment xml:lang="zh_TW">MicroDVD 字幕</comment>
+ <comment xml:lang="zh_CN">MicroDVD 字幕</comment>
<comment xml:lang="vi">Phụ đề MicroDVD</comment>
- <comment xml:lang="zh-CN">MicroDVD 字幕</comment>
- <comment xml:lang="zh-TW">MicroDVD 字幕</comment>
+ <comment xml:lang="uk">субтитри MicroDVD</comment>
+ <comment xml:lang="tr">MicroDVD alt yazısı</comment>
+ <comment xml:lang="sv">MicroDVD-undertexter</comment>
+ <comment xml:lang="sr">Микро ДВД преводи</comment>
+ <comment xml:lang="sq">titra MicroDVD</comment>
+ <comment xml:lang="sl">Datoteka podnapisov MicroDVD</comment>
+ <comment xml:lang="si">MicroDVD උපසිරැසි</comment>
+ <comment xml:lang="sk">Titulky MicroDVD</comment>
+ <comment xml:lang="ru">Субтитры MicroDVD</comment>
+ <comment xml:lang="ro">Subtitrări MicroDVD</comment>
+ <comment xml:lang="pt_BR">Legendas MicroDVD</comment>
+ <comment xml:lang="pt">legendas MicroDVD</comment>
+ <comment xml:lang="pl">Napisy MicroDVD</comment>
+ <comment xml:lang="oc">sostítols MicroDVD</comment>
+ <comment xml:lang="nn">MicroDVD-teksting</comment>
+ <comment xml:lang="nl">MicroDVD-ondertitels</comment>
+ <comment xml:lang="nb">MicroDVD undertekst</comment>
+ <comment xml:lang="lv">MicroDVD subtitri</comment>
+ <comment xml:lang="lt">MicroDVD subtitrai</comment>
+ <comment xml:lang="ko">MicroDVD 자막 파일</comment>
+ <comment xml:lang="kk">MicroDVD субтитрлары</comment>
+ <comment xml:lang="ka">MicroDVD-ის ქვეტიტრები</comment>
+ <comment xml:lang="ja">MicroDVD 字幕</comment>
+ <comment xml:lang="it">Sottotitoli MicroDVD</comment>
+ <comment xml:lang="is">MicroDVD skjátextar</comment>
+ <comment xml:lang="id">Subjudul MicroDVD</comment>
+ <comment xml:lang="ia">Subtitulos MicroDVD</comment>
+ <comment xml:lang="hu">MicroDVD feliratok</comment>
+ <comment xml:lang="hr">MicroDVD podnaslovi</comment>
+ <comment xml:lang="he">כתוביות של MicroDVD</comment>
+ <comment xml:lang="gl">subtítulos de MicroDVD</comment>
+ <comment xml:lang="ga">fotheidil MicroDVD</comment>
+ <comment xml:lang="fur">sottitui MicroDVD</comment>
+ <comment xml:lang="fr">sous-titres MicroDVD</comment>
+ <comment xml:lang="fo">MicroDVD undirtekstir</comment>
+ <comment xml:lang="fi">MicroDVD-tekstitykset</comment>
+ <comment xml:lang="eu">MicroDVD azpitituluak</comment>
+ <comment xml:lang="es">subtítulos de MicroDVD</comment>
+ <comment xml:lang="eo">MicroDVD-subtekstoj</comment>
+ <comment xml:lang="en_GB">MicroDVD subtitles</comment>
+ <comment xml:lang="el">Υπότιτλοι MicroDVD</comment>
+ <comment xml:lang="de">MicroDVD-Untertitel</comment>
+ <comment xml:lang="da">MicroDVD-undertekster</comment>
+ <comment xml:lang="cs">titulky MicroDVD</comment>
+ <comment xml:lang="ca">subtítols MicroDVD</comment>
+ <comment xml:lang="bg">Субтитри — MicroDVD</comment>
+ <comment xml:lang="be@latin">Subtytry MicroDVD</comment>
+ <comment xml:lang="be">субцітры MicroDVD</comment>
+ <comment xml:lang="ar">ترجمات MicroDVD</comment>
+ <comment xml:lang="af">MicroDVD-onderskrifte</comment>
<sub-class-of type="text/plain"/>
- <magic priority="50">
+ <magic>
<match type="string" value="{1}" offset="0"/>
<match type="string" value="{0}" offset="0"/>
<match type="string" value="}{" offset="0:6"/>
</magic>
<glob pattern="*.sub"/>
</mime-type>
+ <mime-type type="text/x-mpl2">
+ <comment>MPL2 subtitles</comment>
+ <comment xml:lang="uk">субтитри MPL2</comment>
+ <comment xml:lang="sv">MPL2-undertexter</comment>
+ <comment xml:lang="ru">Субтитры MPL2</comment>
+ <comment xml:lang="pl">Napisy MPL2</comment>
+ <comment xml:lang="es">subtítulos MPL2</comment>
+ <comment xml:lang="de">MPL2-Untertitel</comment>
+ <sub-class-of type="text/plain"/>
+ <magic>
+ <match type="string" value="[1]" offset="0"/>
+ <match type="string" value="[0]" offset="0"/>
+ <match type="string" value="][" offset="0:6"/>
+ </magic>
+ <glob pattern="*.mpl"/>
+ </mime-type>
<mime-type type="text/x-mpsub">
- <comment>MPSub subtitles</comment>
- <comment xml:lang="af">MPSub-onderskrifte</comment>
- <comment xml:lang="ar">ترجمات MPSub</comment>
- <comment xml:lang="be-Latn">Subtytry MPSub</comment>
- <comment xml:lang="bg">Субтитри — MPSub</comment>
- <comment xml:lang="ca">subtítols MPSub</comment>
- <comment xml:lang="cs">titulky MPSub</comment>
- <comment xml:lang="da">MPSub-undertekster</comment>
- <comment xml:lang="de">MPSub-Untertitel</comment>
- <comment xml:lang="el">Υπότιτλοι MPSub</comment>
- <comment xml:lang="en-GB">MPSub subtitles</comment>
- <comment xml:lang="eo">MPSub-subtekstoj</comment>
- <comment xml:lang="es">subtítulos MPSub</comment>
- <comment xml:lang="eu">MPSub azpitituluak</comment>
- <comment xml:lang="fi">MPSub-tekstitykset</comment>
- <comment xml:lang="fo">MPSub undirtekstir</comment>
- <comment xml:lang="fr">sous-titres MPSub</comment>
- <comment xml:lang="fur">sottitui MPSub</comment>
- <comment xml:lang="ga">fotheidil MPSub</comment>
- <comment xml:lang="gl">subtítulos MPSub</comment>
- <comment xml:lang="he">כתוביות MPSub</comment>
- <comment xml:lang="hr">MPSub podnaslovi</comment>
- <comment xml:lang="hu">MPSub feliratok</comment>
- <comment xml:lang="ia">Subtitulos MPSub</comment>
- <comment xml:lang="id">Subjudul MPSub</comment>
- <comment xml:lang="it">Sottotitoli MPSub</comment>
- <comment xml:lang="ja">MPSub サブタイトル</comment>
- <comment xml:lang="ka">MPSub ქვეტიტრები</comment>
- <comment xml:lang="kk">MPSub субтитрлары</comment>
- <comment xml:lang="ko">MPSub 자막 파일</comment>
- <comment xml:lang="lt">MPSub subtitrai</comment>
- <comment xml:lang="lv">MPSub subtitri</comment>
- <comment xml:lang="nb">MPSub undertekst</comment>
- <comment xml:lang="nl">MPSub-ondertitels</comment>
- <comment xml:lang="nn">MPSub-undertekstar</comment>
- <comment xml:lang="oc">sostítols MPSub</comment>
- <comment xml:lang="pl">Napisy MPSub</comment>
- <comment xml:lang="pt">legendas MPSub</comment>
- <comment xml:lang="pt-BR">Legendas MPSub</comment>
- <comment xml:lang="ro">Subtitrări MPSub</comment>
- <comment xml:lang="ru">Субтитры MPSub</comment>
- <comment xml:lang="sk">Titulky MPSub</comment>
- <comment xml:lang="sl">Datoteka podnapisov MPSub</comment>
- <comment xml:lang="sq">Nëntituj MPSub</comment>
- <comment xml:lang="sr">МПСуб преводи</comment>
- <comment xml:lang="sv">MPSub-undertexter</comment>
- <comment xml:lang="tr">MPSub alt yazıları</comment>
- <comment xml:lang="uk">субтитри MPSub</comment>
- <comment xml:lang="vi">Phụ đề MPSub</comment>
- <comment xml:lang="zh-CN">MPSub 字幕</comment>
- <comment xml:lang="zh-TW">MPSub 字幕</comment>
- <acronym>MPSub</acronym>
- <expanded-acronym>MPlayer Subtitle</expanded-acronym>
+ <comment>MPlayer subtitles</comment>
+ <comment xml:lang="uk">субтитри MPlayer</comment>
+ <comment xml:lang="sv">MPlayer-undertexter</comment>
+ <comment xml:lang="ru">Субтитры MPlayer</comment>
+ <comment xml:lang="pl">Napisy MPlayer</comment>
+ <comment xml:lang="es">subtítulos de MPlayer</comment>
+ <comment xml:lang="de">MPlayer-Untertitel</comment>
<sub-class-of type="text/plain"/>
- <magic priority="50">
+ <magic priority="40">
<match type="string" value="FORMAT=" offset="0:256"/>
</magic>
<glob pattern="*.sub"/>
</mime-type>
<mime-type type="text/x-ssa">
<comment>SSA subtitles</comment>
- <comment xml:lang="af">SSA-onderskrifte</comment>
- <comment xml:lang="ar">ترجمات SSA</comment>
- <comment xml:lang="be-Latn">Subtytry SSA</comment>
- <comment xml:lang="bg">Субтитри — SSA</comment>
- <comment xml:lang="ca">subtítols SSA</comment>
- <comment xml:lang="cs">titulky SSA</comment>
- <comment xml:lang="da">SSA-undertekster</comment>
- <comment xml:lang="de">SSA-Untertitel</comment>
- <comment xml:lang="el">Υπότιτλοι SSA</comment>
- <comment xml:lang="en-GB">SSA subtitles</comment>
- <comment xml:lang="eo">SSA-subtekstoj</comment>
- <comment xml:lang="es">subtítulos SSA</comment>
- <comment xml:lang="eu">SSA azpitituluak</comment>
- <comment xml:lang="fi">SSA-tekstitykset</comment>
- <comment xml:lang="fo">SSA undirtekstir</comment>
- <comment xml:lang="fr">sous-titres SSA</comment>
- <comment xml:lang="fur">sottitui SSA</comment>
- <comment xml:lang="ga">fotheidil SSA</comment>
- <comment xml:lang="gl">Subtitulos SSA</comment>
- <comment xml:lang="he">כתובית SSA</comment>
- <comment xml:lang="hr">SSA podnaslovi</comment>
- <comment xml:lang="hu">SSA feliratok</comment>
- <comment xml:lang="ia">Subtitulos SSA</comment>
- <comment xml:lang="id">Subjudul SSA</comment>
- <comment xml:lang="it">Sottotitoli SSA</comment>
- <comment xml:lang="ja">SSA 字幕</comment>
- <comment xml:lang="kk">SSA субтитрлары</comment>
- <comment xml:lang="ko">SSA 자막 파일</comment>
- <comment xml:lang="lt">SSA subtitrai</comment>
- <comment xml:lang="lv">SSA subtitri</comment>
- <comment xml:lang="nb">SSA undertekst</comment>
- <comment xml:lang="nl">SSA-ondertitels</comment>
- <comment xml:lang="nn">SSA-teksting</comment>
- <comment xml:lang="oc">sostítols SSA</comment>
- <comment xml:lang="pl">Napisy SSA</comment>
- <comment xml:lang="pt">legendas SSA</comment>
- <comment xml:lang="pt-BR">Legendas SSA</comment>
- <comment xml:lang="ro">Subtitrări SSA</comment>
- <comment xml:lang="ru">Субтитры SSA</comment>
- <comment xml:lang="sk">Titulky SSA</comment>
- <comment xml:lang="sl">Datoteka podnapisov SSA</comment>
- <comment xml:lang="sq">Nëntituj SSA</comment>
- <comment xml:lang="sr">ССА преводи</comment>
- <comment xml:lang="sv">SSA-undertexter</comment>
- <comment xml:lang="tr">SSA alt yazıları</comment>
- <comment xml:lang="uk">субтитри SSA</comment>
+ <comment xml:lang="zh_TW">SSA 字幕</comment>
+ <comment xml:lang="zh_CN">SSA 字幕</comment>
<comment xml:lang="vi">Phụ đề SSA</comment>
- <comment xml:lang="zh-CN">SSA 字幕</comment>
- <comment xml:lang="zh-TW">SSA 字幕</comment>
+ <comment xml:lang="uk">субтитри SSA</comment>
+ <comment xml:lang="tr">SSA alt yazıları</comment>
+ <comment xml:lang="sv">SSA-undertexter</comment>
+ <comment xml:lang="sr">ССА преводи</comment>
+ <comment xml:lang="sq">titra SSA</comment>
+ <comment xml:lang="sl">Datoteka podnapisov SSA</comment>
+ <comment xml:lang="si">SSA උපසිරැසි</comment>
+ <comment xml:lang="sk">Titulky SSA</comment>
+ <comment xml:lang="ru">Субтитры SSA</comment>
+ <comment xml:lang="ro">Subtitrări SSA</comment>
+ <comment xml:lang="pt_BR">Legendas SSA</comment>
+ <comment xml:lang="pt">legendas SSA</comment>
+ <comment xml:lang="pl">Napisy SSA</comment>
+ <comment xml:lang="oc">sostítols SSA</comment>
+ <comment xml:lang="nn">SSA-teksting</comment>
+ <comment xml:lang="nl">SSA-ondertitels</comment>
+ <comment xml:lang="nb">SSA undertekst</comment>
+ <comment xml:lang="lv">SSA subtitri</comment>
+ <comment xml:lang="lt">SSA subtitrai</comment>
+ <comment xml:lang="ko">SSA 자막 파일</comment>
+ <comment xml:lang="kk">SSA субтитрлары</comment>
+ <comment xml:lang="ja">SSA 字幕</comment>
+ <comment xml:lang="it">Sottotitoli SSA</comment>
+ <comment xml:lang="is">SSA skjátextar</comment>
+ <comment xml:lang="id">Subjudul SSA</comment>
+ <comment xml:lang="ia">Subtitulos SSA</comment>
+ <comment xml:lang="hu">SSA feliratok</comment>
+ <comment xml:lang="hr">SSA podnaslovi</comment>
+ <comment xml:lang="he">כתובית SSA</comment>
+ <comment xml:lang="gl">Subtitulos SSA</comment>
+ <comment xml:lang="ga">fotheidil SSA</comment>
+ <comment xml:lang="fur">sottitui SSA</comment>
+ <comment xml:lang="fr">sous-titres SSA</comment>
+ <comment xml:lang="fo">SSA undirtekstir</comment>
+ <comment xml:lang="fi">SSA-tekstitykset</comment>
+ <comment xml:lang="eu">SSA azpitituluak</comment>
+ <comment xml:lang="es">subtítulos SSA</comment>
+ <comment xml:lang="eo">SSA-subtekstoj</comment>
+ <comment xml:lang="en_GB">SSA subtitles</comment>
+ <comment xml:lang="el">Υπότιτλοι SSA</comment>
+ <comment xml:lang="de">SSA-Untertitel</comment>
+ <comment xml:lang="da">SSA-undertekster</comment>
+ <comment xml:lang="cs">titulky SSA</comment>
+ <comment xml:lang="ca">subtítols SSA</comment>
+ <comment xml:lang="bg">Субтитри — SSA</comment>
+ <comment xml:lang="be@latin">Subtytry SSA</comment>
+ <comment xml:lang="be">субцітры SSA</comment>
+ <comment xml:lang="ar">ترجمات SSA</comment>
+ <comment xml:lang="af">SSA-onderskrifte</comment>
<acronym>SSA</acronym>
<expanded-acronym>SubStation Alpha</expanded-acronym>
<sub-class-of type="text/plain"/>
- <magic priority="50">
+ <magic>
<match type="string" value="[Script Info]" offset="0:256"/>
<match type="string" value="Dialogue: " offset="0:256"/>
</magic>
@@ -21064,112 +22138,119 @@ command to generate the output files.
</mime-type>
<mime-type type="text/x-subviewer">
<comment>SubViewer subtitles</comment>
- <comment xml:lang="af">SubViewer-onderskrifte</comment>
- <comment xml:lang="ar">ترجمات SubViewer</comment>
- <comment xml:lang="be-Latn">Subtytry SubViewer</comment>
- <comment xml:lang="bg">Субтитри — SubViewer</comment>
- <comment xml:lang="ca">subtítols SubViewer</comment>
- <comment xml:lang="cs">titulky SubViewer</comment>
- <comment xml:lang="da">SubViewer-undertekster</comment>
- <comment xml:lang="de">SubViewer-Untertitel</comment>
- <comment xml:lang="el">Υπότιτλοι SubViewer</comment>
- <comment xml:lang="en-GB">SubViewer subtitles</comment>
- <comment xml:lang="eo">SubViewer-subtekstoj</comment>
- <comment xml:lang="es">subtítulos SubViewer</comment>
- <comment xml:lang="eu">SubViewer azpitituluak</comment>
- <comment xml:lang="fi">SubViewer-tekstitykset</comment>
- <comment xml:lang="fo">SubViewer undirtekstir</comment>
- <comment xml:lang="fr">sous-titres SubViewer</comment>
- <comment xml:lang="fur">sottitui SubViewer</comment>
- <comment xml:lang="ga">fotheidil SubViewer</comment>
- <comment xml:lang="gl">subtítulos SubViewer</comment>
- <comment xml:lang="he">כתוביות של SubViewer</comment>
- <comment xml:lang="hr">SubViewer podnaslovi</comment>
- <comment xml:lang="hu">SubViewer feliratok</comment>
- <comment xml:lang="ia">Subtitulos SubViewer</comment>
- <comment xml:lang="id">Subjudul SubViewer</comment>
- <comment xml:lang="it">Sottotitoli SubViewer</comment>
- <comment xml:lang="ja">SubViewer 字幕</comment>
- <comment xml:lang="kk">SubViewer субтитрлары</comment>
- <comment xml:lang="ko">SubViewer 자막 파일</comment>
- <comment xml:lang="lt">SubViewer subtitrai</comment>
- <comment xml:lang="lv">SubViewer subtitri</comment>
- <comment xml:lang="nb">SubViewer undertekst</comment>
- <comment xml:lang="nl">SubViewer-ondertitels</comment>
- <comment xml:lang="nn">SubViewer-teksting</comment>
- <comment xml:lang="oc">sostítols SubViewer</comment>
- <comment xml:lang="pl">Napisy SubViewer</comment>
- <comment xml:lang="pt">legendas SubViewer</comment>
- <comment xml:lang="pt-BR">Legendas SubViewer</comment>
- <comment xml:lang="ro">Subtitrare SubViewer</comment>
- <comment xml:lang="ru">Субтитры SubViewer</comment>
- <comment xml:lang="sk">Titulky SubViewer</comment>
- <comment xml:lang="sl">Datoteka podnapisov SubViewer</comment>
- <comment xml:lang="sq">Nëntituj SubViewer</comment>
- <comment xml:lang="sr">Суб Вјивер преводи</comment>
- <comment xml:lang="sv">SubViewer-undertexter</comment>
- <comment xml:lang="tr">SubViewer alt yazıları</comment>
- <comment xml:lang="uk">субтитри SubViewer</comment>
+ <comment xml:lang="zh_TW">SubViewer 字幕</comment>
+ <comment xml:lang="zh_CN">SubViewer 字幕</comment>
<comment xml:lang="vi">Phụ đề SubViewer</comment>
- <comment xml:lang="zh-CN">SubViewer 字幕</comment>
- <comment xml:lang="zh-TW">SubViewer 字幕</comment>
+ <comment xml:lang="uk">субтитри SubViewer</comment>
+ <comment xml:lang="tr">SubViewer alt yazıları</comment>
+ <comment xml:lang="sv">SubViewer-undertexter</comment>
+ <comment xml:lang="sr">Суб Вјивер преводи</comment>
+ <comment xml:lang="sq">titra SubViewer</comment>
+ <comment xml:lang="sl">Datoteka podnapisov SubViewer</comment>
+ <comment xml:lang="si">SubViewer උපසිරැසි</comment>
+ <comment xml:lang="sk">Titulky SubViewer</comment>
+ <comment xml:lang="ru">Субтитры SubViewer</comment>
+ <comment xml:lang="ro">Subtitrare SubViewer</comment>
+ <comment xml:lang="pt_BR">Legendas SubViewer</comment>
+ <comment xml:lang="pt">legendas SubViewer</comment>
+ <comment xml:lang="pl">Napisy SubViewer</comment>
+ <comment xml:lang="oc">sostítols SubViewer</comment>
+ <comment xml:lang="nn">SubViewer-teksting</comment>
+ <comment xml:lang="nl">SubViewer-ondertitels</comment>
+ <comment xml:lang="nb">SubViewer undertekst</comment>
+ <comment xml:lang="lv">SubViewer subtitri</comment>
+ <comment xml:lang="lt">SubViewer subtitrai</comment>
+ <comment xml:lang="ko">SubViewer 자막 파일</comment>
+ <comment xml:lang="kk">SubViewer субтитрлары</comment>
+ <comment xml:lang="ja">SubViewer 字幕</comment>
+ <comment xml:lang="it">Sottotitoli SubViewer</comment>
+ <comment xml:lang="is">SubViewer skjátextar</comment>
+ <comment xml:lang="id">Subjudul SubViewer</comment>
+ <comment xml:lang="ia">Subtitulos SubViewer</comment>
+ <comment xml:lang="hu">SubViewer feliratok</comment>
+ <comment xml:lang="hr">SubViewer podnaslovi</comment>
+ <comment xml:lang="he">כתוביות של SubViewer</comment>
+ <comment xml:lang="gl">subtítulos SubViewer</comment>
+ <comment xml:lang="ga">fotheidil SubViewer</comment>
+ <comment xml:lang="fur">sottitui SubViewer</comment>
+ <comment xml:lang="fr">sous-titres SubViewer</comment>
+ <comment xml:lang="fo">SubViewer undirtekstir</comment>
+ <comment xml:lang="fi">SubViewer-tekstitykset</comment>
+ <comment xml:lang="eu">SubViewer azpitituluak</comment>
+ <comment xml:lang="es">subtítulos SubViewer</comment>
+ <comment xml:lang="eo">SubViewer-subtekstoj</comment>
+ <comment xml:lang="en_GB">SubViewer subtitles</comment>
+ <comment xml:lang="el">Υπότιτλοι SubViewer</comment>
+ <comment xml:lang="de">SubViewer-Untertitel</comment>
+ <comment xml:lang="da">SubViewer-undertekster</comment>
+ <comment xml:lang="cs">titulky SubViewer</comment>
+ <comment xml:lang="ca">subtítols SubViewer</comment>
+ <comment xml:lang="bg">Субтитри — SubViewer</comment>
+ <comment xml:lang="be@latin">Subtytry SubViewer</comment>
+ <comment xml:lang="be">субцітры SubViewer</comment>
+ <comment xml:lang="ar">ترجمات SubViewer</comment>
+ <comment xml:lang="af">SubViewer-onderskrifte</comment>
<sub-class-of type="text/plain"/>
- <magic priority="50">
+ <magic>
<match type="string" value="[INFORMATION]" offset="0"/>
</magic>
<glob pattern="*.sub"/>
</mime-type>
<mime-type type="text/x-iMelody">
<comment>iMelody ringtone</comment>
- <comment xml:lang="af">iMelody-luitoon</comment>
- <comment xml:lang="ar">نغمة iMelody</comment>
- <comment xml:lang="be-Latn">Rington iMelody</comment>
- <comment xml:lang="bg">Аудио — iMelody</comment>
- <comment xml:lang="ca">to de trucada iMelody</comment>
- <comment xml:lang="cs">vyzváněcí melodie iMelody</comment>
- <comment xml:lang="da">iMelody-ringetone</comment>
- <comment xml:lang="de">iMelody-Klingelton</comment>
- <comment xml:lang="el">ringtone iMelody</comment>
- <comment xml:lang="en-GB">iMelody ringtone</comment>
- <comment xml:lang="es">tono de llamada iMelody</comment>
- <comment xml:lang="eu">iMelody doinua</comment>
- <comment xml:lang="fi">iMelody-soittoääni</comment>
- <comment xml:lang="fo">iMelody ringitóni</comment>
- <comment xml:lang="fr">sonnerie iMelody</comment>
- <comment xml:lang="fur">sunarie iMelody</comment>
- <comment xml:lang="ga">ton buailte iMelody</comment>
- <comment xml:lang="gl">Melodía de iMelody</comment>
- <comment xml:lang="he">צלצול של iMelody</comment>
- <comment xml:lang="hr">iMelody melodija zvona</comment>
- <comment xml:lang="hu">iMelody csengőhang</comment>
- <comment xml:lang="ia">Tono de appello iMelody</comment>
- <comment xml:lang="id">nada dering iMelody</comment>
- <comment xml:lang="it">Suoneria iMelody</comment>
- <comment xml:lang="ja">iMelody リングトーン</comment>
- <comment xml:lang="kk">iMelody әуені</comment>
- <comment xml:lang="ko">iMelody 벨소리</comment>
- <comment xml:lang="lt">iMelody skambučio melodija</comment>
- <comment xml:lang="lv">iMelody melodija</comment>
- <comment xml:lang="nb">iMelody ringetone</comment>
- <comment xml:lang="nl">iMelody-beltoon</comment>
- <comment xml:lang="nn">iMelody-ringetone</comment>
- <comment xml:lang="oc">sonariá iMelody</comment>
- <comment xml:lang="pl">Dzwonek iMelody</comment>
- <comment xml:lang="pt">toque iMelody</comment>
- <comment xml:lang="pt-BR">Toque de celular do iMelody</comment>
- <comment xml:lang="ro">Sonerie iMelody</comment>
- <comment xml:lang="ru">Мелодия iMelody</comment>
- <comment xml:lang="sk">Vyzváňacie melódie iMelody</comment>
- <comment xml:lang="sl">Zvonjenje iMelody</comment>
- <comment xml:lang="sq">Zile iMelody</comment>
- <comment xml:lang="sr">звоно ајМелодије</comment>
- <comment xml:lang="sv">iMelody-ringsignal</comment>
- <comment xml:lang="tr">iMelody melodisi</comment>
- <comment xml:lang="uk">рінгтон iMelody</comment>
+ <comment xml:lang="zh_TW">iMelody 鈴聲</comment>
+ <comment xml:lang="zh_CN">iMelody 铃声</comment>
<comment xml:lang="vi">tiếng réo iMelody</comment>
- <comment xml:lang="zh-CN">iMelody 铃声</comment>
- <comment xml:lang="zh-TW">iMelody 鈴聲</comment>
- <magic priority="50">
+ <comment xml:lang="uk">рінгтон iMelody</comment>
+ <comment xml:lang="tr">iMelody melodisi</comment>
+ <comment xml:lang="sv">iMelody-ringsignal</comment>
+ <comment xml:lang="sr">звоно ајМелодије</comment>
+ <comment xml:lang="sq">zile iMelody</comment>
+ <comment xml:lang="sl">Zvonjenje iMelody</comment>
+ <comment xml:lang="si">iMelody නාද රටා</comment>
+ <comment xml:lang="sk">Vyzváňacie melódie iMelody</comment>
+ <comment xml:lang="ru">Мелодия iMelody</comment>
+ <comment xml:lang="ro">Sonerie iMelody</comment>
+ <comment xml:lang="pt_BR">Toque de celular do iMelody</comment>
+ <comment xml:lang="pt">toque iMelody</comment>
+ <comment xml:lang="pl">Dzwonek iMelody</comment>
+ <comment xml:lang="oc">sonariá iMelody</comment>
+ <comment xml:lang="nn">iMelody-ringetone</comment>
+ <comment xml:lang="nl">iMelody-beltoon</comment>
+ <comment xml:lang="nb">iMelody ringetone</comment>
+ <comment xml:lang="lv">iMelody melodija</comment>
+ <comment xml:lang="lt">iMelody skambučio melodija</comment>
+ <comment xml:lang="ko">iMelody 벨소리</comment>
+ <comment xml:lang="kk">iMelody әуені</comment>
+ <comment xml:lang="ja">iMelody リングトーン</comment>
+ <comment xml:lang="it">Suoneria iMelody</comment>
+ <comment xml:lang="is">iMelody hringitónn</comment>
+ <comment xml:lang="id">nada dering iMelody</comment>
+ <comment xml:lang="ia">Tono de appello iMelody</comment>
+ <comment xml:lang="hu">iMelody csengőhang</comment>
+ <comment xml:lang="hr">iMelody melodija zvona</comment>
+ <comment xml:lang="he">צלצול של iMelody</comment>
+ <comment xml:lang="gl">Melodía de iMelody</comment>
+ <comment xml:lang="ga">ton buailte iMelody</comment>
+ <comment xml:lang="fur">sunarie iMelody</comment>
+ <comment xml:lang="fr">sonnerie iMelody</comment>
+ <comment xml:lang="fo">iMelody ringitóni</comment>
+ <comment xml:lang="fi">iMelody-soittoääni</comment>
+ <comment xml:lang="eu">iMelody doinua</comment>
+ <comment xml:lang="es">tono de llamada iMelody</comment>
+ <comment xml:lang="en_GB">iMelody ringtone</comment>
+ <comment xml:lang="el">ringtone iMelody</comment>
+ <comment xml:lang="de">iMelody-Klingelton</comment>
+ <comment xml:lang="da">iMelody-ringetone</comment>
+ <comment xml:lang="cs">vyzváněcí melodie iMelody</comment>
+ <comment xml:lang="ca">to de trucada iMelody</comment>
+ <comment xml:lang="bg">Аудио — iMelody</comment>
+ <comment xml:lang="be@latin">Rington iMelody</comment>
+ <comment xml:lang="be">мелодыя выкліку iMelody</comment>
+ <comment xml:lang="ar">نغمة iMelody</comment>
+ <comment xml:lang="af">iMelody-luitoon</comment>
+ <sub-class-of type="text/plain"/>
+ <magic>
<match type="string" value="BEGIN:IMELODY" offset="0"/>
</magic>
<glob pattern="*.imy"/>
@@ -21179,59 +22260,62 @@ command to generate the output files.
</mime-type>
<mime-type type="application/vnd.smaf">
<comment>SMAF audio</comment>
- <comment xml:lang="af">SMAF-oudio</comment>
- <comment xml:lang="ar">SMAF سمعي</comment>
- <comment xml:lang="be-Latn">Aŭdyjo SMAF</comment>
- <comment xml:lang="bg">Аудио — SMAF</comment>
- <comment xml:lang="ca">àudio SMAF</comment>
- <comment xml:lang="cs">zvuk SMAF</comment>
- <comment xml:lang="da">SMAF-lyd</comment>
- <comment xml:lang="de">SMAF-Audio</comment>
- <comment xml:lang="el">Ήχος SMAF</comment>
- <comment xml:lang="en-GB">SMAF audio</comment>
- <comment xml:lang="eo">SMAF-sondosiero</comment>
- <comment xml:lang="es">audio SMAF</comment>
- <comment xml:lang="eu">SMAF audioa</comment>
- <comment xml:lang="fi">SMAF-ääni</comment>
- <comment xml:lang="fo">SMAF ljóður</comment>
- <comment xml:lang="fr">audio SMAF</comment>
- <comment xml:lang="fur">audio SMAF</comment>
- <comment xml:lang="ga">fuaim SMAF</comment>
- <comment xml:lang="gl">son SMAF</comment>
- <comment xml:lang="he">שמע SMAF</comment>
- <comment xml:lang="hr">SMAF zvučni zapis</comment>
- <comment xml:lang="hu">SMAF hang</comment>
- <comment xml:lang="ia">Audio SMAF</comment>
- <comment xml:lang="id">Audio SMAF</comment>
- <comment xml:lang="it">Audio SMAF</comment>
- <comment xml:lang="ja">SMAF オーディオ</comment>
- <comment xml:lang="kk">SMAF аудиосы</comment>
- <comment xml:lang="ko">SMAF 오디오</comment>
- <comment xml:lang="lt">SMAF garso įrašas</comment>
- <comment xml:lang="lv">SMAF audio</comment>
- <comment xml:lang="nb">SMAF-lyd</comment>
- <comment xml:lang="nl">SMAF-audio</comment>
- <comment xml:lang="nn">SMAF-lyd</comment>
- <comment xml:lang="oc">àudio SMAF</comment>
- <comment xml:lang="pl">Plik dźwiękowy SMAF</comment>
- <comment xml:lang="pt">áudio SMAF</comment>
- <comment xml:lang="pt-BR">Áudio SMAF</comment>
- <comment xml:lang="ro">Audio SMAF</comment>
- <comment xml:lang="ru">Аудио SMAF</comment>
- <comment xml:lang="sk">Zvuk SMAF</comment>
- <comment xml:lang="sl">Zvočna datoteka SMAF</comment>
- <comment xml:lang="sq">Audio SMAF</comment>
- <comment xml:lang="sr">СМАФ звук</comment>
- <comment xml:lang="sv">SMAF-ljud</comment>
- <comment xml:lang="tr">SMAF sesi</comment>
- <comment xml:lang="uk">звук SMAF</comment>
+ <comment xml:lang="zh_TW">SMAF 音訊</comment>
+ <comment xml:lang="zh_CN">SMAF 音频</comment>
<comment xml:lang="vi">Âm thanh SMAF</comment>
- <comment xml:lang="zh-CN">SMAF 音频</comment>
- <comment xml:lang="zh-TW">SMAF 音訊</comment>
+ <comment xml:lang="uk">звук SMAF</comment>
+ <comment xml:lang="tr">SMAF sesi</comment>
+ <comment xml:lang="sv">SMAF-ljud</comment>
+ <comment xml:lang="sr">СМАФ звук</comment>
+ <comment xml:lang="sq">audio SMAF</comment>
+ <comment xml:lang="sl">Zvočna datoteka SMAF</comment>
+ <comment xml:lang="si">SMAF ශ්රව්ය</comment>
+ <comment xml:lang="sk">Zvuk SMAF</comment>
+ <comment xml:lang="ru">Аудио SMAF</comment>
+ <comment xml:lang="ro">Audio SMAF</comment>
+ <comment xml:lang="pt_BR">Áudio SMAF</comment>
+ <comment xml:lang="pt">áudio SMAF</comment>
+ <comment xml:lang="pl">Plik dźwiękowy SMAF</comment>
+ <comment xml:lang="oc">àudio SMAF</comment>
+ <comment xml:lang="nn">SMAF-lyd</comment>
+ <comment xml:lang="nl">SMAF-audio</comment>
+ <comment xml:lang="nb">SMAF-lyd</comment>
+ <comment xml:lang="lv">SMAF audio</comment>
+ <comment xml:lang="lt">SMAF garso įrašas</comment>
+ <comment xml:lang="ko">SMAF 오디오</comment>
+ <comment xml:lang="kk">SMAF аудиосы</comment>
+ <comment xml:lang="ja">SMAF オーディオ</comment>
+ <comment xml:lang="it">Audio SMAF</comment>
+ <comment xml:lang="is">SMAF hljóðskrá</comment>
+ <comment xml:lang="id">Audio SMAF</comment>
+ <comment xml:lang="ia">Audio SMAF</comment>
+ <comment xml:lang="hu">SMAF hang</comment>
+ <comment xml:lang="hr">SMAF zvučni zapis</comment>
+ <comment xml:lang="he">שמע SMAF</comment>
+ <comment xml:lang="gl">son SMAF</comment>
+ <comment xml:lang="ga">fuaim SMAF</comment>
+ <comment xml:lang="fur">audio SMAF</comment>
+ <comment xml:lang="fr">audio SMAF</comment>
+ <comment xml:lang="fo">SMAF ljóður</comment>
+ <comment xml:lang="fi">SMAF-ääni</comment>
+ <comment xml:lang="eu">SMAF audioa</comment>
+ <comment xml:lang="es">audio SMAF</comment>
+ <comment xml:lang="eo">SMAF-sondosiero</comment>
+ <comment xml:lang="en_GB">SMAF audio</comment>
+ <comment xml:lang="el">Ήχος SMAF</comment>
+ <comment xml:lang="de">SMAF-Audio</comment>
+ <comment xml:lang="da">SMAF-lyd</comment>
+ <comment xml:lang="cs">zvuk SMAF</comment>
+ <comment xml:lang="ca">àudio SMAF</comment>
+ <comment xml:lang="bg">Аудио — SMAF</comment>
+ <comment xml:lang="be@latin">Aŭdyjo SMAF</comment>
+ <comment xml:lang="be">аўдыя SMAF</comment>
+ <comment xml:lang="ar">صوت SMAF</comment>
+ <comment xml:lang="af">SMAF-oudio</comment>
<acronym>SMAF</acronym>
<expanded-acronym>Synthetic music Mobile Application Format</expanded-acronym>
<generic-icon name="audio-x-generic"/>
- <magic priority="50">
+ <magic>
<match type="string" value="MMMD" offset="0"/>
</magic>
<glob pattern="*.mmf"/>
@@ -21240,59 +22324,63 @@ command to generate the output files.
</mime-type>
<mime-type type="text/x-mrml">
<comment>MRML playlist</comment>
- <comment xml:lang="af">MRML-speellys</comment>
- <comment xml:lang="ar">قائمة تشغيل MRML</comment>
- <comment xml:lang="be-Latn">Śpis piesień MRML</comment>
- <comment xml:lang="bg">Списък за изпълнение — MRML</comment>
- <comment xml:lang="ca">llista de reproducció MRML</comment>
- <comment xml:lang="cs">seznam k přehrání MRML</comment>
- <comment xml:lang="da">MRML-afspilningsliste</comment>
- <comment xml:lang="de">MRML-Wiedergabeliste</comment>
- <comment xml:lang="el">Λίστα αναπαραγωγής MRML</comment>
- <comment xml:lang="en-GB">MRML playlist</comment>
- <comment xml:lang="eo">MRML-ludlisto</comment>
- <comment xml:lang="es">lista de reproducción MRML</comment>
- <comment xml:lang="eu">MRML erreprodukzio-zerrenda</comment>
- <comment xml:lang="fi">MRML-soittolista</comment>
- <comment xml:lang="fo">MRML avspælingarlisti</comment>
- <comment xml:lang="fr">liste de lecture MRML</comment>
- <comment xml:lang="fur">liste di riproduzion MRML</comment>
- <comment xml:lang="ga">seinmliosta MRML</comment>
- <comment xml:lang="gl">lista de reprodución MRML</comment>
- <comment xml:lang="he">רשימת השמעה MRML</comment>
- <comment xml:lang="hr">MRML popis izvođenja</comment>
- <comment xml:lang="hu">MRML-lejátszólista</comment>
- <comment xml:lang="ia">Lista de selection MRML</comment>
- <comment xml:lang="id">Senarai putar MRML</comment>
- <comment xml:lang="it">Playlist MRML</comment>
- <comment xml:lang="ja">MRML 再生リスト</comment>
- <comment xml:lang="ka">MRML რეპერტუარი</comment>
- <comment xml:lang="kk">MRML ойнау тізімі</comment>
- <comment xml:lang="ko">MRML 재생 목록</comment>
- <comment xml:lang="lt">MRML grojaraštis</comment>
- <comment xml:lang="lv">MRML repertuārs</comment>
- <comment xml:lang="nb">MRML-spilleliste</comment>
- <comment xml:lang="nl">MRML-afspeellijst</comment>
- <comment xml:lang="nn">MRML-speleliste</comment>
- <comment xml:lang="oc">lista de lectura MRML</comment>
- <comment xml:lang="pl">Lista odtwarzania MRML</comment>
- <comment xml:lang="pt">lista de reprodução MRML</comment>
- <comment xml:lang="pt-BR">Lista de reprodução do MRML</comment>
- <comment xml:lang="ro">Listă redare MRML</comment>
- <comment xml:lang="ru">Список воспроизведения MRML</comment>
- <comment xml:lang="sk">Zoznam skladieb MRML</comment>
- <comment xml:lang="sl">Seznam predvajanja MRML</comment>
- <comment xml:lang="sq">Listë titujsh MRML</comment>
- <comment xml:lang="sr">МРМЛ списак нумера</comment>
- <comment xml:lang="sv">MRML-spellista</comment>
- <comment xml:lang="tr">MRML çalma listesi</comment>
- <comment xml:lang="uk">список відтворення MRML</comment>
+ <comment xml:lang="zh_TW">MRML 播放清單</comment>
+ <comment xml:lang="zh_CN">MRML 播放列表</comment>
<comment xml:lang="vi">Danh mục nhạc MRML</comment>
- <comment xml:lang="zh-CN">MRML 播放列表</comment>
- <comment xml:lang="zh-TW">MRML 播放清單</comment>
+ <comment xml:lang="uk">список відтворення MRML</comment>
+ <comment xml:lang="tr">MRML çalma listesi</comment>
+ <comment xml:lang="sv">MRML-spellista</comment>
+ <comment xml:lang="sr">МРМЛ списак нумера</comment>
+ <comment xml:lang="sq">luajlistë MRML</comment>
+ <comment xml:lang="sl">Seznam predvajanja MRML</comment>
+ <comment xml:lang="si">MRML ධාවන ලැයිස්තුව</comment>
+ <comment xml:lang="sk">Zoznam skladieb MRML</comment>
+ <comment xml:lang="ru">Список воспроизведения MRML</comment>
+ <comment xml:lang="ro">Listă redare MRML</comment>
+ <comment xml:lang="pt_BR">Lista de reprodução do MRML</comment>
+ <comment xml:lang="pt">lista de reprodução MRML</comment>
+ <comment xml:lang="pl">Lista odtwarzania MRML</comment>
+ <comment xml:lang="oc">lista de lectura MRML</comment>
+ <comment xml:lang="nn">MRML-speleliste</comment>
+ <comment xml:lang="nl">MRML-afspeellijst</comment>
+ <comment xml:lang="nb">MRML-spilleliste</comment>
+ <comment xml:lang="lv">MRML repertuārs</comment>
+ <comment xml:lang="lt">MRML grojaraštis</comment>
+ <comment xml:lang="ko">MRML 재생 목록</comment>
+ <comment xml:lang="kk">MRML ойнау тізімі</comment>
+ <comment xml:lang="ka">MRML რეპერტუარი</comment>
+ <comment xml:lang="ja">MRML プレイリスト</comment>
+ <comment xml:lang="it">Playlist MRML</comment>
+ <comment xml:lang="is">MRML spilunarlisti</comment>
+ <comment xml:lang="id">Senarai putar MRML</comment>
+ <comment xml:lang="ia">Lista de selection MRML</comment>
+ <comment xml:lang="hu">MRML-lejátszólista</comment>
+ <comment xml:lang="hr">MRML popis izvođenja</comment>
+ <comment xml:lang="he">רשימת השמעה MRML</comment>
+ <comment xml:lang="gl">lista de reprodución MRML</comment>
+ <comment xml:lang="ga">seinmliosta MRML</comment>
+ <comment xml:lang="fur">liste di riproduzion MRML</comment>
+ <comment xml:lang="fr">liste de lecture MRML</comment>
+ <comment xml:lang="fo">MRML avspælingarlisti</comment>
+ <comment xml:lang="fi">MRML-soittolista</comment>
+ <comment xml:lang="eu">MRML erreprodukzio-zerrenda</comment>
+ <comment xml:lang="es">lista de reproducción MRML</comment>
+ <comment xml:lang="eo">MRML-ludlisto</comment>
+ <comment xml:lang="en_GB">MRML playlist</comment>
+ <comment xml:lang="el">Λίστα αναπαραγωγής MRML</comment>
+ <comment xml:lang="de">MRML-Wiedergabeliste</comment>
+ <comment xml:lang="da">MRML-afspilningsliste</comment>
+ <comment xml:lang="cs">seznam k přehrání MRML</comment>
+ <comment xml:lang="ca">llista de reproducció MRML</comment>
+ <comment xml:lang="bg">Списък за изпълнение — MRML</comment>
+ <comment xml:lang="be@latin">Śpis piesień MRML</comment>
+ <comment xml:lang="be">плэй-ліст MRML</comment>
+ <comment xml:lang="ar">قائمة تشغيل MRML</comment>
+ <comment xml:lang="af">MRML-speellys</comment>
<acronym>MRML</acronym>
<expanded-acronym>Multimedia Retrieval Markup Language</expanded-acronym>
- <magic priority="50">
+ <sub-class-of type="application/xml"/>
+ <magic>
<match type="string" value="&lt;mrml " offset="0"/>
</magic>
<glob pattern="*.mrml"/>
@@ -21300,230 +22388,270 @@ command to generate the output files.
</mime-type>
<mime-type type="audio/x-xmf">
<comment>XMF audio</comment>
- <comment xml:lang="af">XMF-oudio</comment>
- <comment xml:lang="ar">XMF سمعي</comment>
- <comment xml:lang="be-Latn">Aŭdyjo XMF</comment>
- <comment xml:lang="bg">Аудио — XMF</comment>
- <comment xml:lang="ca">àudio XMF</comment>
- <comment xml:lang="cs">zvuk XMF</comment>
- <comment xml:lang="da">XMF-lyd</comment>
- <comment xml:lang="de">XMF-Audio</comment>
- <comment xml:lang="el">Ήχος XMF</comment>
- <comment xml:lang="en-GB">XMF audio</comment>
- <comment xml:lang="eo">XMF-sondosiero</comment>
- <comment xml:lang="es">audio XMF</comment>
- <comment xml:lang="eu">XMF audioa</comment>
- <comment xml:lang="fi">XMF-ääni</comment>
- <comment xml:lang="fo">XMF ljóður</comment>
- <comment xml:lang="fr">audio XMF</comment>
- <comment xml:lang="fur">audio XMF</comment>
- <comment xml:lang="ga">fuaim XMF</comment>
- <comment xml:lang="gl">son XMF</comment>
- <comment xml:lang="he">שמע XMF</comment>
- <comment xml:lang="hr">XMF zvučni zapis</comment>
- <comment xml:lang="hu">XMF hang</comment>
- <comment xml:lang="ia">Audio XMF</comment>
- <comment xml:lang="id">Audio XMF</comment>
- <comment xml:lang="it">Audio XMF</comment>
- <comment xml:lang="ja">XMF オーディオ</comment>
- <comment xml:lang="kk">XMF аудиосы</comment>
- <comment xml:lang="ko">XMF 오디오</comment>
- <comment xml:lang="lt">XMF garso įrašas</comment>
- <comment xml:lang="lv">XMF audio</comment>
- <comment xml:lang="nb">XMF-lyd</comment>
- <comment xml:lang="nl">XMF-audio</comment>
- <comment xml:lang="nn">XMF-lyd</comment>
- <comment xml:lang="oc">àudio XMF</comment>
- <comment xml:lang="pl">Plik dźwiękowy XMF</comment>
- <comment xml:lang="pt">aúdio XMF</comment>
- <comment xml:lang="pt-BR">Áudio XMF</comment>
- <comment xml:lang="ro">Audio XMF</comment>
- <comment xml:lang="ru">Аудио XMF</comment>
- <comment xml:lang="sk">Zvuk XMF</comment>
- <comment xml:lang="sl">Zvočna datoteka XMF</comment>
- <comment xml:lang="sq">Audio XMF</comment>
- <comment xml:lang="sr">ИксМФ звук</comment>
- <comment xml:lang="sv">XMF-ljud</comment>
- <comment xml:lang="tr">XMF sesi</comment>
- <comment xml:lang="uk">звук XMF</comment>
+ <comment xml:lang="zh_TW">XMF 音訊</comment>
+ <comment xml:lang="zh_CN">XMF 音频</comment>
<comment xml:lang="vi">Âm thanh XMF</comment>
- <comment xml:lang="zh-CN">XMF 音频</comment>
- <comment xml:lang="zh-TW">XMF 音訊</comment>
+ <comment xml:lang="uk">звук XMF</comment>
+ <comment xml:lang="tr">XMF sesi</comment>
+ <comment xml:lang="sv">XMF-ljud</comment>
+ <comment xml:lang="sr">ИксМФ звук</comment>
+ <comment xml:lang="sq">audio XMF</comment>
+ <comment xml:lang="sl">Zvočna datoteka XMF</comment>
+ <comment xml:lang="si">XMF ශ්රව්ය</comment>
+ <comment xml:lang="sk">Zvuk XMF</comment>
+ <comment xml:lang="ru">Аудио XMF</comment>
+ <comment xml:lang="ro">Audio XMF</comment>
+ <comment xml:lang="pt_BR">Áudio XMF</comment>
+ <comment xml:lang="pt">aúdio XMF</comment>
+ <comment xml:lang="pl">Plik dźwiękowy XMF</comment>
+ <comment xml:lang="oc">àudio XMF</comment>
+ <comment xml:lang="nn">XMF-lyd</comment>
+ <comment xml:lang="nl">XMF-audio</comment>
+ <comment xml:lang="nb">XMF-lyd</comment>
+ <comment xml:lang="lv">XMF audio</comment>
+ <comment xml:lang="lt">XMF garso įrašas</comment>
+ <comment xml:lang="ko">XMF 오디오</comment>
+ <comment xml:lang="kk">XMF аудиосы</comment>
+ <comment xml:lang="ja">XMF オーディオ</comment>
+ <comment xml:lang="it">Audio XMF</comment>
+ <comment xml:lang="is">XMF hljóðskrá</comment>
+ <comment xml:lang="id">Audio XMF</comment>
+ <comment xml:lang="ia">Audio XMF</comment>
+ <comment xml:lang="hu">XMF hang</comment>
+ <comment xml:lang="hr">XMF zvučni zapis</comment>
+ <comment xml:lang="he">שמע XMF</comment>
+ <comment xml:lang="gl">son XMF</comment>
+ <comment xml:lang="ga">fuaim XMF</comment>
+ <comment xml:lang="fur">audio XMF</comment>
+ <comment xml:lang="fr">audio XMF</comment>
+ <comment xml:lang="fo">XMF ljóður</comment>
+ <comment xml:lang="fi">XMF-ääni</comment>
+ <comment xml:lang="eu">XMF audioa</comment>
+ <comment xml:lang="es">sonido XMF</comment>
+ <comment xml:lang="eo">XMF-sondosiero</comment>
+ <comment xml:lang="en_GB">XMF audio</comment>
+ <comment xml:lang="el">Ήχος XMF</comment>
+ <comment xml:lang="de">XMF-Audio</comment>
+ <comment xml:lang="da">XMF-lyd</comment>
+ <comment xml:lang="cs">zvuk XMF</comment>
+ <comment xml:lang="ca">àudio XMF</comment>
+ <comment xml:lang="bg">Аудио — XMF</comment>
+ <comment xml:lang="be@latin">Aŭdyjo XMF</comment>
+ <comment xml:lang="be">аўдыя XMF</comment>
+ <comment xml:lang="ar">صوت XMF</comment>
+ <comment xml:lang="af">XMF-oudio</comment>
<acronym>XMF</acronym>
<expanded-acronym>eXtensible Music Format</expanded-acronym>
- <magic priority="50">
+ <magic>
<match type="string" value="XMF_" offset="0"/>
- <match type="string" value="\130\115\106\137\062\056\060\060\000\000\000\002" offset="0"/>
</magic>
<glob pattern="*.xmf"/>
<alias type="audio/xmf"/>
- <alias type="audio/mobile-xmf"/>
+ </mime-type>
+ <mime-type type="audio/mobile-xmf">
+ <comment>Mobile XMF audio</comment>
+ <comment xml:lang="uk">звукові дані Mobile XMF</comment>
+ <comment xml:lang="tr">Mobile XMF sesi</comment>
+ <comment xml:lang="sv">Mobile XMF-ljud</comment>
+ <comment xml:lang="sl">Zvok Mobile XMF</comment>
+ <comment xml:lang="si">ජංගම XMF ශ්රව්ය</comment>
+ <comment xml:lang="ru">Аудио Mobile XMF</comment>
+ <comment xml:lang="pl">Plik dźwiękowy Mobile XMF</comment>
+ <comment xml:lang="nl">Mobile XMF-audio</comment>
+ <comment xml:lang="ko">모바일 XMF 오디오</comment>
+ <comment xml:lang="kk">Mobile XMF аудиосы</comment>
+ <comment xml:lang="ja">Mobile XMF オーディオ</comment>
+ <comment xml:lang="it">Audio XMF mobile</comment>
+ <comment xml:lang="hr">Mobilni XMF zvuk</comment>
+ <comment xml:lang="fi">Mobiili XMF-ääni</comment>
+ <comment xml:lang="eu">Mobile XMF audioa</comment>
+ <comment xml:lang="es">audio Mobile XMF</comment>
+ <comment xml:lang="en_GB">Mobile XMF audio</comment>
+ <comment xml:lang="de">Mobile-XMF-Audio</comment>
+ <comment xml:lang="be">аўдыя MXMF</comment>
+ <comment xml:lang="ar">صوت Mobile XMF</comment>
+ <acronym>XMF</acronym>
+ <expanded-acronym>eXtensible Music Format</expanded-acronym>
+ <magic>
+ <match type="string" value="\130\115\106\137\062\056\060\060\000\000\000\002" offset="0"/>
+ </magic>
+ <glob pattern="*.mxmf"/>
+ <alias type="audio/vnd.nokia.mobile-xmf"/>
</mime-type>
<mime-type type="application/x-sv4cpio">
<comment>SV4 CPIO archive</comment>
- <comment xml:lang="af">SV4 CPIO-argief</comment>
- <comment xml:lang="ar">أرشيف SV4 CPIO</comment>
- <comment xml:lang="az">SV4 CPIO arxivi</comment>
- <comment xml:lang="be-Latn">Archiŭ SV4 CPIO</comment>
- <comment xml:lang="bg">Архив — SV4 CPIO</comment>
- <comment xml:lang="ca">arxiu SV4 CPIO</comment>
- <comment xml:lang="cs">archiv SV4 CPIO</comment>
- <comment xml:lang="cy">Archif CPIO SV4</comment>
- <comment xml:lang="da">SV4 CPIO-arkiv</comment>
- <comment xml:lang="de">SV4-CPIO-Archiv</comment>
- <comment xml:lang="el">Συμπιεσμένο αρχείο SV4 CPIO</comment>
- <comment xml:lang="en-GB">SV4 CPIO archive</comment>
- <comment xml:lang="eo">SV4-CPIO-arkivo</comment>
- <comment xml:lang="es">archivador SV4 CPIO</comment>
- <comment xml:lang="eu">SV4 CPIO artxiboa</comment>
- <comment xml:lang="fi">SV4 CPIO -arkisto</comment>
- <comment xml:lang="fo">SV4 CPIO skjalasavn</comment>
- <comment xml:lang="fr">archive SV4 CPIO</comment>
- <comment xml:lang="fur">archivi SV4 CPIO</comment>
- <comment xml:lang="ga">cartlann SV4 CPIO</comment>
- <comment xml:lang="gl">arquivo SV4 CPIO</comment>
- <comment xml:lang="he">ארכיון של SV4 SPIO</comment>
- <comment xml:lang="hr">SV4 CPIO arhiva</comment>
- <comment xml:lang="hu">SV4 CPIO-archívum</comment>
- <comment xml:lang="ia">Archivo CPIO SV4</comment>
- <comment xml:lang="id">Arsip SV4 CPIO</comment>
- <comment xml:lang="it">Archivio SV4 CPIO</comment>
- <comment xml:lang="ja">SV4 CPIO アーカイブ</comment>
- <comment xml:lang="kk">SV4 CPIO архиві</comment>
- <comment xml:lang="ko">SV4 CPIO 묶음 파일</comment>
- <comment xml:lang="lt">SV4 CPIO archyvas</comment>
- <comment xml:lang="lv">SV4 CPIO arhīvs</comment>
- <comment xml:lang="ms">Arkib CPIO SV4</comment>
- <comment xml:lang="nb">SV4 CPIO-arkiv</comment>
- <comment xml:lang="nl">SV4 CPIO-archief</comment>
- <comment xml:lang="nn">SV4 CPIO-arkiv</comment>
- <comment xml:lang="oc">archiu SV4 CPIO</comment>
- <comment xml:lang="pl">Archiwum SV4 CPIO</comment>
- <comment xml:lang="pt">arquivo SV4 CPIO</comment>
- <comment xml:lang="pt-BR">Pacote SV4 CPIO</comment>
- <comment xml:lang="ro">Arhivă SV4 CPIO</comment>
- <comment xml:lang="ru">Архив SV4 CPIO</comment>
- <comment xml:lang="sk">Archív SV4 CPIO</comment>
- <comment xml:lang="sl">Datoteka arhiva SV4 CPIO</comment>
- <comment xml:lang="sq">Arkiv SV4 CPIO</comment>
- <comment xml:lang="sr">СВ4 ЦПИО архива</comment>
- <comment xml:lang="sv">SV4 CPIO-arkiv</comment>
- <comment xml:lang="tr">SV4 CPIO arşivi</comment>
- <comment xml:lang="uk">архів SV4 CPIO</comment>
+ <comment xml:lang="zh_TW">SV4 CPIO 封存檔</comment>
+ <comment xml:lang="zh_CN">SV4 CPIO 归档文件</comment>
<comment xml:lang="vi">Kho nén CPIO SV4</comment>
- <comment xml:lang="zh-CN">SV4 CPIO 归档文件</comment>
- <comment xml:lang="zh-TW">SV4 CPIO 封存檔</comment>
+ <comment xml:lang="uk">архів SV4 CPIO</comment>
+ <comment xml:lang="tr">SV4 CPIO arşivi</comment>
+ <comment xml:lang="sv">SV4 CPIO-arkiv</comment>
+ <comment xml:lang="sr">СВ4 ЦПИО архива</comment>
+ <comment xml:lang="sq">arkiv SV4 CPIO</comment>
+ <comment xml:lang="sl">Datoteka arhiva SV4 CPIO</comment>
+ <comment xml:lang="si">SV4 CPIO සංරක්ෂිතය</comment>
+ <comment xml:lang="sk">Archív SV4 CPIO</comment>
+ <comment xml:lang="ru">Архив SV4 CPIO</comment>
+ <comment xml:lang="ro">Arhivă SV4 CPIO</comment>
+ <comment xml:lang="pt_BR">Pacote SV4 CPIO</comment>
+ <comment xml:lang="pt">arquivo SV4 CPIO</comment>
+ <comment xml:lang="pl">Archiwum SV4 CPIO</comment>
+ <comment xml:lang="oc">archiu SV4 CPIO</comment>
+ <comment xml:lang="nn">SV4 CPIO-arkiv</comment>
+ <comment xml:lang="nl">SV4 CPIO-archief</comment>
+ <comment xml:lang="nb">SV4 CPIO-arkiv</comment>
+ <comment xml:lang="ms">Arkib CPIO SV4</comment>
+ <comment xml:lang="lv">SV4 CPIO arhīvs</comment>
+ <comment xml:lang="lt">SV4 CPIO archyvas</comment>
+ <comment xml:lang="ko">SV4 CPIO 묶음 파일</comment>
+ <comment xml:lang="kk">SV4 CPIO архиві</comment>
+ <comment xml:lang="ja">SV4 CPIO アーカイブ</comment>
+ <comment xml:lang="it">Archivio SV4 CPIO</comment>
+ <comment xml:lang="is">SV4 CPIO safnskrá</comment>
+ <comment xml:lang="id">Arsip SV4 CPIO</comment>
+ <comment xml:lang="ia">Archivo CPIO SV4</comment>
+ <comment xml:lang="hu">SV4 CPIO-archívum</comment>
+ <comment xml:lang="hr">SV4 CPIO arhiva</comment>
+ <comment xml:lang="he">ארכיון של SV4 SPIO</comment>
+ <comment xml:lang="gl">arquivo SV4 CPIO</comment>
+ <comment xml:lang="ga">cartlann SV4 CPIO</comment>
+ <comment xml:lang="fur">archivi SV4 CPIO</comment>
+ <comment xml:lang="fr">archive SV4 CPIO</comment>
+ <comment xml:lang="fo">SV4 CPIO skjalasavn</comment>
+ <comment xml:lang="fi">SV4 CPIO -arkisto</comment>
+ <comment xml:lang="eu">SV4 CPIO artxiboa</comment>
+ <comment xml:lang="es">archivador SV4 CPIO</comment>
+ <comment xml:lang="eo">SV4-CPIO-arkivo</comment>
+ <comment xml:lang="en_GB">SV4 CPIO archive</comment>
+ <comment xml:lang="el">Συμπιεσμένο αρχείο SV4 CPIO</comment>
+ <comment xml:lang="de">SV4-CPIO-Archiv</comment>
+ <comment xml:lang="da">SV4 CPIO-arkiv</comment>
+ <comment xml:lang="cy">Archif CPIO SV4</comment>
+ <comment xml:lang="cs">archiv SV4 CPIO</comment>
+ <comment xml:lang="ca">arxiu SV4 CPIO</comment>
+ <comment xml:lang="bg">Архив — SV4 CPIO</comment>
+ <comment xml:lang="be@latin">Archiŭ SV4 CPIO</comment>
+ <comment xml:lang="be">архіў SV4 CPIO</comment>
+ <comment xml:lang="az">SV4 CPIO arxivi</comment>
+ <comment xml:lang="ar">أرشيف SV4 CPIO</comment>
+ <comment xml:lang="af">SV4 CPIO-argief</comment>
<generic-icon name="package-x-generic"/>
<glob pattern="*.sv4cpio"/>
</mime-type>
<mime-type type="application/x-sv4crc">
<comment>SV4 CPIO archive (with CRC)</comment>
- <comment xml:lang="af">SV4 CPIO-argief (met CRC)</comment>
- <comment xml:lang="ar">أرشيف SV4 CPIO (مع CRC)</comment>
- <comment xml:lang="be-Latn">Archiŭ SV4 CPIO (z CRC)</comment>
- <comment xml:lang="bg">Архив — SV4 CPIO, проверка за грешки CRC</comment>
- <comment xml:lang="ca">arxiu SV4 CPIO (amb CRC)</comment>
- <comment xml:lang="cs">archiv SV4 CPIO (s CRC)</comment>
- <comment xml:lang="da">SV4 CPIO-arkiv (med CRC)</comment>
- <comment xml:lang="de">SV4-CPIO-Archiv (mit CRC)</comment>
- <comment xml:lang="el">Συμπιεσμένο αρχείο SV4 CPIO (με CRC)</comment>
- <comment xml:lang="en-GB">SV4 CPIO archive (with CRC)</comment>
- <comment xml:lang="eo">SV4-CPIO-arkivo (kun CRC)</comment>
- <comment xml:lang="es">archivador SV4 CPIO (con CRC)</comment>
- <comment xml:lang="eu">SV4 CPIO artxiboa (CRC-rekin)</comment>
- <comment xml:lang="fi">SV4 CPIO -arkisto (CRC:llä)</comment>
- <comment xml:lang="fo">SV4 CPIO skjalasavn (við CRC)</comment>
- <comment xml:lang="fr">archive SV4 CPIO (avec CRC)</comment>
- <comment xml:lang="fur">archivi SV4 CPIO (cun CRC)</comment>
- <comment xml:lang="ga">cartlann SV4 CPIO (le CRC)</comment>
- <comment xml:lang="gl">Arquivador SV4 CPIO (con CRC)</comment>
- <comment xml:lang="he">ארכיון של SV4 SPIO (עם CRC)</comment>
- <comment xml:lang="hr">SV4 CPIO arhiva (s CRC-om)</comment>
- <comment xml:lang="hu">SV4 CPIO-archívum (CRC-vel)</comment>
- <comment xml:lang="ia">Archivo CPIO SV4 (con CRC)</comment>
- <comment xml:lang="id">Arsip SV4 CPIO (dengan CRC)</comment>
- <comment xml:lang="it">Archivio SV4 CPIO (con CRC)</comment>
- <comment xml:lang="ja">SV4 CPIO アーカイブ (CRC 有り)</comment>
- <comment xml:lang="kk">SV4 CPIO архиві (CRC бар)</comment>
- <comment xml:lang="ko">SV4 CPIO 묶음 파일(CRC 포함)</comment>
- <comment xml:lang="lt">SV4 CPII archyvas (su CRC)</comment>
- <comment xml:lang="lv">SV4 CPIO arhīvs (ar CRC)</comment>
- <comment xml:lang="ms">Arkib CPIO SV4 (dengan CRC)</comment>
- <comment xml:lang="nb">SV4 CPIO-arkiv (med CRC)</comment>
- <comment xml:lang="nl">SV4 CPIO-archief (met CRC)</comment>
- <comment xml:lang="nn">SV4 CPIO arkiv (med CRC)</comment>
- <comment xml:lang="oc">archiu SV4 CPIO (avec CRC)</comment>
- <comment xml:lang="pl">Archiwum SV4 CPIO (z sumą kontrolną)</comment>
- <comment xml:lang="pt">arquivo SV4 CPIO (com CRC)</comment>
- <comment xml:lang="pt-BR">Pacote SV4 CPIO (com CRC)</comment>
- <comment xml:lang="ro">Arhivă SV4 CPIO (cu CRC)</comment>
- <comment xml:lang="ru">Архив SV4 CPIO (с CRC)</comment>
- <comment xml:lang="sk">Archív SV4 CPIO (s CRC)</comment>
- <comment xml:lang="sl">Datoteka arhiva SV4 CPIO (z razpršilom CRC)</comment>
- <comment xml:lang="sq">Arkiv SV4 CPIO (me CRC)</comment>
- <comment xml:lang="sr">СВ4 ЦПИО архива (са ЦРЦ-ом)</comment>
- <comment xml:lang="sv">SV4 CPIO-arkiv (med CRC)</comment>
- <comment xml:lang="tr">SV4 CPIO arşivi (CRC ile)</comment>
- <comment xml:lang="uk">архів SV4 CPIO (з CRC)</comment>
+ <comment xml:lang="zh_TW">SV4 CPIO 封存檔 (具有 CRC)</comment>
+ <comment xml:lang="zh_CN">SV4 CPIP 归档文件(带 CRC)</comment>
<comment xml:lang="vi">Kho nén CPIO SV4 (với CRC)</comment>
- <comment xml:lang="zh-CN">SV4 CPIP 归档文件(带 CRC)</comment>
- <comment xml:lang="zh-TW">SV4 CPIO 封存檔 (具有 CRC)</comment>
+ <comment xml:lang="uk">архів SV4 CPIO (з CRC)</comment>
+ <comment xml:lang="tr">SV4 CPIO arşivi (CRC ile)</comment>
+ <comment xml:lang="sv">SV4 CPIO-arkiv (med CRC)</comment>
+ <comment xml:lang="sr">СВ4 ЦПИО архива (са ЦРЦ-ом)</comment>
+ <comment xml:lang="sq">arkiv SV4 CPIO (me CRC)</comment>
+ <comment xml:lang="sl">Datoteka arhiva SV4 CPIO (z razpršilom CRC)</comment>
+ <comment xml:lang="si">SV4 CPIO සංරක්ෂිතය (CRC සමඟ)</comment>
+ <comment xml:lang="sk">Archív SV4 CPIO (s CRC)</comment>
+ <comment xml:lang="ru">Архив SV4 CPIO (с CRC)</comment>
+ <comment xml:lang="ro">Arhivă SV4 CPIO (cu CRC)</comment>
+ <comment xml:lang="pt_BR">Pacote SV4 CPIO (com CRC)</comment>
+ <comment xml:lang="pt">arquivo SV4 CPIO (com CRC)</comment>
+ <comment xml:lang="pl">Archiwum SV4 CPIO (z sumą kontrolną)</comment>
+ <comment xml:lang="oc">archiu SV4 CPIO (avec CRC)</comment>
+ <comment xml:lang="nn">SV4 CPIO arkiv (med CRC)</comment>
+ <comment xml:lang="nl">SV4 CPIO-archief (met CRC)</comment>
+ <comment xml:lang="nb">SV4 CPIO-arkiv (med CRC)</comment>
+ <comment xml:lang="ms">Arkib CPIO SV4 (dengan CRC)</comment>
+ <comment xml:lang="lv">SV4 CPIO arhīvs (ar CRC)</comment>
+ <comment xml:lang="lt">SV4 CPII archyvas (su CRC)</comment>
+ <comment xml:lang="ko">SV4 CPIO 묶음 파일(CRC 포함)</comment>
+ <comment xml:lang="kk">SV4 CPIO архиві (CRC бар)</comment>
+ <comment xml:lang="ja">SV4 CPIO アーカイブ (CRC 有り)</comment>
+ <comment xml:lang="it">Archivio SV4 CPIO (con CRC)</comment>
+ <comment xml:lang="is">SV4 CPIO safnskrá (með CRC)</comment>
+ <comment xml:lang="id">Arsip SV4 CPIO (dengan CRC)</comment>
+ <comment xml:lang="ia">Archivo CPIO SV4 (con CRC)</comment>
+ <comment xml:lang="hu">SV4 CPIO-archívum (CRC-vel)</comment>
+ <comment xml:lang="hr">SV4 CPIO arhiva (s CRC-om)</comment>
+ <comment xml:lang="he">ארכיון של SV4 SPIO (עם CRC)</comment>
+ <comment xml:lang="gl">Arquivador SV4 CPIO (con CRC)</comment>
+ <comment xml:lang="ga">cartlann SV4 CPIO (le CRC)</comment>
+ <comment xml:lang="fur">archivi SV4 CPIO (cun CRC)</comment>
+ <comment xml:lang="fr">archive SV4 CPIO (avec CRC)</comment>
+ <comment xml:lang="fo">SV4 CPIO skjalasavn (við CRC)</comment>
+ <comment xml:lang="fi">SV4 CPIO -arkisto (CRC:llä)</comment>
+ <comment xml:lang="eu">SV4 CPIO artxiboa (CRC-rekin)</comment>
+ <comment xml:lang="es">archivador SV4 CPIO (con CRC)</comment>
+ <comment xml:lang="eo">SV4-CPIO-arkivo (kun CRC)</comment>
+ <comment xml:lang="en_GB">SV4 CPIO archive (with CRC)</comment>
+ <comment xml:lang="el">Συμπιεσμένο αρχείο SV4 CPIO (με CRC)</comment>
+ <comment xml:lang="de">SV4-CPIO-Archiv (mit CRC)</comment>
+ <comment xml:lang="da">SV4 CPIO-arkiv (med CRC)</comment>
+ <comment xml:lang="cs">archiv SV4 CPIO (s CRC)</comment>
+ <comment xml:lang="ca">arxiu SV4 CPIO (amb CRC)</comment>
+ <comment xml:lang="bg">Архив — SV4 CPIO, проверка за грешки CRC</comment>
+ <comment xml:lang="be@latin">Archiŭ SV4 CPIO (z CRC)</comment>
+ <comment xml:lang="be">архіў SV4 CPIO (z CRC)</comment>
+ <comment xml:lang="ar">أرشيف SV4 CPIO (مع CRC)</comment>
+ <comment xml:lang="af">SV4 CPIO-argief (met CRC)</comment>
<generic-icon name="package-x-generic"/>
<glob pattern="*.sv4crc"/>
</mime-type>
<mime-type type="application/x-tar">
<comment>Tar archive</comment>
- <comment xml:lang="af">Tar-argief</comment>
- <comment xml:lang="ar">أرشيف Tar</comment>
- <comment xml:lang="az">Tar arxivi</comment>
- <comment xml:lang="be-Latn">Archiŭ tar</comment>
- <comment xml:lang="bg">Архив — tar</comment>
- <comment xml:lang="ca">arxiu tar</comment>
- <comment xml:lang="cs">archiv Tar</comment>
- <comment xml:lang="cy">Archif tar</comment>
- <comment xml:lang="da">Tar-arkiv</comment>
- <comment xml:lang="de">Tar-Archiv</comment>
- <comment xml:lang="el">Συμπιεσμένο αρχείο Tar</comment>
- <comment xml:lang="en-GB">Tar archive</comment>
- <comment xml:lang="es">archivador Tar</comment>
- <comment xml:lang="eu">Tar artxiboa</comment>
- <comment xml:lang="fi">Tar-arkisto</comment>
- <comment xml:lang="fo">Tar skjalasavn</comment>
- <comment xml:lang="fr">archive tar</comment>
- <comment xml:lang="fur">archivi Tar</comment>
- <comment xml:lang="ga">cartlann Tar</comment>
- <comment xml:lang="gl">arquivo Tar</comment>
- <comment xml:lang="he">ארכיון Tar</comment>
- <comment xml:lang="hr">Tar arhiva</comment>
- <comment xml:lang="hu">Tar archívum</comment>
- <comment xml:lang="ia">Archivo Tar</comment>
- <comment xml:lang="id">Arsip Tar</comment>
- <comment xml:lang="it">Archivio tar</comment>
- <comment xml:lang="ja">Tar アーカイブ</comment>
- <comment xml:lang="kk">Tar архиві</comment>
- <comment xml:lang="ko">TAR 묶음 파일</comment>
- <comment xml:lang="lt">Tar archyvas</comment>
- <comment xml:lang="lv">Tar arhīvs</comment>
- <comment xml:lang="ms">Arkib Tar</comment>
- <comment xml:lang="nb">Tar-arkiv</comment>
- <comment xml:lang="nl">Tar-archief</comment>
- <comment xml:lang="nn">Tar-arkiv</comment>
- <comment xml:lang="oc">archiu tar</comment>
- <comment xml:lang="pl">Archiwum tar</comment>
- <comment xml:lang="pt">arquivo Tar</comment>
- <comment xml:lang="pt-BR">Pacote Tar</comment>
- <comment xml:lang="ro">Arhivă Tar</comment>
- <comment xml:lang="ru">Архив TAR</comment>
- <comment xml:lang="sk">Archív Tar</comment>
- <comment xml:lang="sl">Datoteka arhiva Tar</comment>
- <comment xml:lang="sq">Arkiv tar</comment>
- <comment xml:lang="sr">Тар архива</comment>
- <comment xml:lang="sv">Tar-arkiv</comment>
- <comment xml:lang="tr">Tar arşivi</comment>
- <comment xml:lang="uk">архів tar</comment>
+ <comment xml:lang="zh_TW">Tar 封存檔</comment>
+ <comment xml:lang="zh_CN">Tar 归档文件</comment>
<comment xml:lang="vi">Kho nén tar</comment>
- <comment xml:lang="zh-CN">Tar 归档文件</comment>
- <comment xml:lang="zh-TW">Tar 封存檔</comment>
+ <comment xml:lang="uk">архів tar</comment>
+ <comment xml:lang="tr">Tar arşivi</comment>
+ <comment xml:lang="sv">Tar-arkiv</comment>
+ <comment xml:lang="sr">Тар архива</comment>
+ <comment xml:lang="sq">arkiv tar</comment>
+ <comment xml:lang="sl">Datoteka arhiva Tar</comment>
+ <comment xml:lang="si">තාර ලේඛනාගාරය</comment>
+ <comment xml:lang="sk">Archív Tar</comment>
+ <comment xml:lang="ru">Архив TAR</comment>
+ <comment xml:lang="ro">Arhivă Tar</comment>
+ <comment xml:lang="pt_BR">Pacote Tar</comment>
+ <comment xml:lang="pt">arquivo Tar</comment>
+ <comment xml:lang="pl">Archiwum tar</comment>
+ <comment xml:lang="oc">archiu tar</comment>
+ <comment xml:lang="nn">Tar-arkiv</comment>
+ <comment xml:lang="nl">Tar-archief</comment>
+ <comment xml:lang="nb">Tar-arkiv</comment>
+ <comment xml:lang="ms">Arkib Tar</comment>
+ <comment xml:lang="lv">Tar arhīvs</comment>
+ <comment xml:lang="lt">Tar archyvas</comment>
+ <comment xml:lang="ko">TAR 묶음 파일</comment>
+ <comment xml:lang="kk">Tar архиві</comment>
+ <comment xml:lang="ja">Tar アーカイブ</comment>
+ <comment xml:lang="it">Archivio tar</comment>
+ <comment xml:lang="is">Tar safnskrá</comment>
+ <comment xml:lang="id">Arsip Tar</comment>
+ <comment xml:lang="ia">Archivo Tar</comment>
+ <comment xml:lang="hu">Tar archívum</comment>
+ <comment xml:lang="hr">Tar arhiva</comment>
+ <comment xml:lang="he">ארכיון Tar</comment>
+ <comment xml:lang="gl">arquivo Tar</comment>
+ <comment xml:lang="ga">cartlann Tar</comment>
+ <comment xml:lang="fur">archivi Tar</comment>
+ <comment xml:lang="fr">archive tar</comment>
+ <comment xml:lang="fo">Tar skjalasavn</comment>
+ <comment xml:lang="fi">Tar-arkisto</comment>
+ <comment xml:lang="eu">Tar artxiboa</comment>
+ <comment xml:lang="es">archivador Tar</comment>
+ <comment xml:lang="en_GB">Tar archive</comment>
+ <comment xml:lang="el">Συμπιεσμένο αρχείο Tar</comment>
+ <comment xml:lang="de">Tar-Archiv</comment>
+ <comment xml:lang="da">Tar-arkiv</comment>
+ <comment xml:lang="cy">Archif tar</comment>
+ <comment xml:lang="cs">archiv Tar</comment>
+ <comment xml:lang="ca">arxiu tar</comment>
+ <comment xml:lang="bg">Архив — tar</comment>
+ <comment xml:lang="be@latin">Archiŭ tar</comment>
+ <comment xml:lang="be">архіў tar</comment>
+ <comment xml:lang="az">Tar arxivi</comment>
+ <comment xml:lang="ar">أرشيف Tar</comment>
+ <comment xml:lang="af">Tar-argief</comment>
<generic-icon name="package-x-generic"/>
<alias type="application/x-gtar"/>
<magic priority="60">
@@ -21536,396 +22664,243 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-tarz">
<comment>Tar archive (compressed)</comment>
- <comment xml:lang="af">Tar-argief (saamgepers)</comment>
- <comment xml:lang="ar">أرشيف Tar (مضغوط)</comment>
- <comment xml:lang="be-Latn">Archiŭ tar (skampresavany)</comment>
- <comment xml:lang="bg">Архив — tar, компресиран</comment>
- <comment xml:lang="ca">arxiu tar (amb compressió)</comment>
- <comment xml:lang="cs">archiv Tar (komprimovaný)</comment>
- <comment xml:lang="da">Tar-arkiv (komprimeret)</comment>
- <comment xml:lang="de">Tar-Archiv (komprimiert)</comment>
- <comment xml:lang="el">Αρχείο Tar (συμπιεσμένο)</comment>
- <comment xml:lang="en-GB">Tar archive (compressed)</comment>
- <comment xml:lang="es">archivador Tar (comprimido)</comment>
- <comment xml:lang="eu">Tar artxiboa (konprimitua)</comment>
- <comment xml:lang="fi">Tar-arkisto (pakattu)</comment>
- <comment xml:lang="fo">Tar skjalasavn (stappað)</comment>
- <comment xml:lang="fr">archive tar (compressée)</comment>
- <comment xml:lang="fur">archivi Tar (comprimût)</comment>
- <comment xml:lang="ga">cartlann Tar (comhbhrúite)</comment>
- <comment xml:lang="gl">arquivo Tar (comprimido)</comment>
- <comment xml:lang="he">ארכיון Tar (מכווץ)</comment>
- <comment xml:lang="hr">Tar arhiva (sažeta)</comment>
- <comment xml:lang="hu">Tar archívum (tömörített)</comment>
- <comment xml:lang="ia">Archivo Tar (comprimite)</comment>
- <comment xml:lang="id">Arsip Tar (terkompresi)</comment>
- <comment xml:lang="it">Archivio tar (compresso)</comment>
- <comment xml:lang="ja">Tar アーカイブ (compress 圧縮)</comment>
- <comment xml:lang="kk">Tar архиві (сығылған)</comment>
- <comment xml:lang="ko">TAR 묶음 파일(압축) </comment>
- <comment xml:lang="lt">Tar archyvas (suglaudintas)</comment>
- <comment xml:lang="lv">Tar arhīvs (saspiests)</comment>
- <comment xml:lang="nb">Tar-arkiv (komprimert)</comment>
- <comment xml:lang="nl">Tar-archief (ingepakt)</comment>
- <comment xml:lang="nn">Tar-arkiv (pakka)</comment>
- <comment xml:lang="oc">archiu tar (compressat)</comment>
- <comment xml:lang="pl">Archiwum tar (skompresowane)</comment>
- <comment xml:lang="pt">arquivo Tar (comprimido)</comment>
- <comment xml:lang="pt-BR">Pacote Tar (compactado)</comment>
- <comment xml:lang="ro">Arhivă Tar (comprimată)</comment>
- <comment xml:lang="ru">Архив TAR (сжатый)</comment>
- <comment xml:lang="sk">Archív Tar (komprimovaný)</comment>
- <comment xml:lang="sl">Datoteka arhiva Tar (stisnjen)</comment>
- <comment xml:lang="sq">Arkiv tar (i kompresuar)</comment>
- <comment xml:lang="sr">Тар архива (запакована)</comment>
- <comment xml:lang="sv">Tar-arkiv (komprimerat)</comment>
- <comment xml:lang="tr">Tar arşivi (sıkıştırılmış)</comment>
- <comment xml:lang="uk">архів tar (стиснений)</comment>
+ <comment xml:lang="zh_TW">Tar 封存檔 (壓縮)</comment>
+ <comment xml:lang="zh_CN">Tar 归档文件(压缩)</comment>
<comment xml:lang="vi">Kho nén tar (đã nén)</comment>
- <comment xml:lang="zh-CN">Tar 归档文件(压缩)</comment>
- <comment xml:lang="zh-TW">Tar 封存檔 (壓縮)</comment>
+ <comment xml:lang="uk">архів tar (стиснений)</comment>
+ <comment xml:lang="tr">Tar arşivi (sıkıştırılmış)</comment>
+ <comment xml:lang="sv">Tar-arkiv (komprimerat)</comment>
+ <comment xml:lang="sr">Тар архива (запакована)</comment>
+ <comment xml:lang="sq">arkiv tar (i kompresuar)</comment>
+ <comment xml:lang="sl">Datoteka arhiva Tar (stisnjen)</comment>
+ <comment xml:lang="si">තාර සංරක්ෂිතය (සම්පීඩිත)</comment>
+ <comment xml:lang="sk">Archív Tar (komprimovaný)</comment>
+ <comment xml:lang="ru">Архив TAR (сжатый)</comment>
+ <comment xml:lang="ro">Arhivă Tar (comprimată)</comment>
+ <comment xml:lang="pt_BR">Pacote Tar (compactado)</comment>
+ <comment xml:lang="pt">arquivo Tar (comprimido)</comment>
+ <comment xml:lang="pl">Archiwum tar (skompresowane)</comment>
+ <comment xml:lang="oc">archiu tar (compressat)</comment>
+ <comment xml:lang="nn">Tar-arkiv (pakka)</comment>
+ <comment xml:lang="nl">Tar-archief (ingepakt)</comment>
+ <comment xml:lang="nb">Tar-arkiv (komprimert)</comment>
+ <comment xml:lang="lv">Tar arhīvs (saspiests)</comment>
+ <comment xml:lang="lt">Tar archyvas (suglaudintas)</comment>
+ <comment xml:lang="ko">TAR 묶음 파일(압축) </comment>
+ <comment xml:lang="kk">Tar архиві (сығылған)</comment>
+ <comment xml:lang="ja">Tar アーカイブ (圧縮)</comment>
+ <comment xml:lang="it">Archivio tar (compresso)</comment>
+ <comment xml:lang="is">Tar safnskrá (þjappað)</comment>
+ <comment xml:lang="id">Arsip Tar (terkompresi)</comment>
+ <comment xml:lang="ia">Archivo Tar (comprimite)</comment>
+ <comment xml:lang="hu">Tar archívum (tömörített)</comment>
+ <comment xml:lang="hr">Tar arhiva (sažeta)</comment>
+ <comment xml:lang="he">ארכיון Tar (מכווץ)</comment>
+ <comment xml:lang="gl">arquivo Tar (comprimido)</comment>
+ <comment xml:lang="ga">cartlann Tar (comhbhrúite)</comment>
+ <comment xml:lang="fur">archivi Tar (comprimût)</comment>
+ <comment xml:lang="fr">archive tar (compressée)</comment>
+ <comment xml:lang="fo">Tar skjalasavn (stappað)</comment>
+ <comment xml:lang="fi">Tar-arkisto (pakattu)</comment>
+ <comment xml:lang="eu">Tar artxiboa (konprimitua)</comment>
+ <comment xml:lang="es">archivador Tar (comprimido)</comment>
+ <comment xml:lang="en_GB">Tar archive (compressed)</comment>
+ <comment xml:lang="el">Αρχείο Tar (συμπιεσμένο)</comment>
+ <comment xml:lang="de">Tar-Archiv (komprimiert)</comment>
+ <comment xml:lang="da">Tar-arkiv (komprimeret)</comment>
+ <comment xml:lang="cs">archiv Tar (komprimovaný)</comment>
+ <comment xml:lang="ca">arxiu tar (amb compressió)</comment>
+ <comment xml:lang="bg">Архив — tar, компресиран</comment>
+ <comment xml:lang="be@latin">Archiŭ tar (skampresavany)</comment>
+ <comment xml:lang="be">архіў tar (сціснуты)</comment>
+ <comment xml:lang="ar">أرشيف Tar (مضغوط)</comment>
+ <comment xml:lang="af">Tar-argief (saamgepers)</comment>
<sub-class-of type="application/x-compress"/>
<generic-icon name="package-x-generic"/>
<glob pattern="*.tar.Z"/>
<glob pattern="*.taz"/>
</mime-type>
<mime-type type="application/x-tex-gf">
- <comment>generic font file</comment>
- <comment xml:lang="af">generiese skriftipelêer</comment>
- <comment xml:lang="ar">ملف الخط العام</comment>
- <comment xml:lang="be-Latn">zvyčajny fajł šryftu</comment>
- <comment xml:lang="bg">Шрифт</comment>
- <comment xml:lang="ca">fitxer de lletra genèrica</comment>
- <comment xml:lang="cs">obecný soubor s fontem</comment>
- <comment xml:lang="da">general skrifttypefil</comment>
- <comment xml:lang="de">Allgemeine Schriftdatei</comment>
- <comment xml:lang="el">Γενικό αρχείο γραμματοσειράς</comment>
- <comment xml:lang="en-GB">generic font file</comment>
- <comment xml:lang="eo">genera tipara dosiero</comment>
- <comment xml:lang="es">tipo de letra genérico</comment>
- <comment xml:lang="eu">letra-tipo orokorra</comment>
- <comment xml:lang="fi">yleinen fonttitiedosto</comment>
- <comment xml:lang="fo">felagsstavasniðsfíla</comment>
- <comment xml:lang="fr">fichier de polices générique</comment>
- <comment xml:lang="fur">file di caratar gjeneric</comment>
- <comment xml:lang="ga">comhad cló ginearálta</comment>
- <comment xml:lang="gl">ficheiro de tipo de fonte xenérica</comment>
- <comment xml:lang="he">קובץ גופן גנרי</comment>
- <comment xml:lang="hr">generička datoteka fonta</comment>
- <comment xml:lang="hu">általános betűkészletfájl</comment>
- <comment xml:lang="ia">File de typo de litteras generic</comment>
- <comment xml:lang="id">berkas fonta generik</comment>
- <comment xml:lang="it">File tipo carattere generico</comment>
- <comment xml:lang="ja">一般フォントファイル</comment>
- <comment xml:lang="kk">қаріп файлы</comment>
- <comment xml:lang="ko">일반 글꼴 파일</comment>
- <comment xml:lang="lt">bendras šrifto failas</comment>
- <comment xml:lang="lv">vispārēja fonta datne</comment>
- <comment xml:lang="ms">Fail font generik</comment>
- <comment xml:lang="nb">vanlig skriftfil</comment>
- <comment xml:lang="nl">algemeen lettertypebestand</comment>
- <comment xml:lang="nn">vanleg skrifttypefil</comment>
- <comment xml:lang="oc">fichièr de poliças generic</comment>
- <comment xml:lang="pl">Zwykły plik czcionki</comment>
- <comment xml:lang="pt">ficheiro genérico de letra</comment>
- <comment xml:lang="pt-BR">Arquivo de fonte genérico</comment>
- <comment xml:lang="ro">fișier de font generic</comment>
+ <comment>Generic font file</comment>
+ <comment xml:lang="uk">типовий файл шрифту</comment>
+ <comment xml:lang="sv">Allmän typsnittsfil</comment>
<comment xml:lang="ru">Обычный файл шрифта</comment>
- <comment xml:lang="sk">Obyčajný súbor písma</comment>
- <comment xml:lang="sl">izvorna datoteka pisave</comment>
- <comment xml:lang="sq">File lloj gërme i përgjithshëm</comment>
- <comment xml:lang="sr">општа датотека слова</comment>
- <comment xml:lang="sv">allmän typsnittsfil</comment>
- <comment xml:lang="tr">genel yazı tipi dosyası</comment>
- <comment xml:lang="uk">загальний файл шрифту</comment>
- <comment xml:lang="vi">tập tin phông giống loài</comment>
- <comment xml:lang="zh-CN">通用字体文件</comment>
- <comment xml:lang="zh-TW">通用字型檔</comment>
+ <comment xml:lang="pl">Zwykły plik czcionki</comment>
+ <comment xml:lang="ja">汎用フォント</comment>
+ <comment xml:lang="it">File tipo di carattere generico</comment>
+ <comment xml:lang="eu">Letra-tipoen fitxategi orokorra</comment>
+ <comment xml:lang="es">archivo de tipo de letra genérico</comment>
+ <comment xml:lang="de">Allgemeine Schriftdatei</comment>
+ <comment xml:lang="be">файл тыповага шрыфту</comment>
<generic-icon name="font-x-generic"/>
<glob pattern="*.gf"/>
</mime-type>
<mime-type type="application/x-tex-pk">
- <comment>packed font file</comment>
- <comment xml:lang="af">verpakte skriftipelêer</comment>
- <comment xml:lang="ar">ملف الخط المرزم</comment>
- <comment xml:lang="be-Latn">zapakavany fajł šryftu</comment>
- <comment xml:lang="bg">Шрифт — компресиран</comment>
- <comment xml:lang="ca">fitxer de lletra empaquetada</comment>
- <comment xml:lang="cs">komprimovaný soubor s fontem</comment>
- <comment xml:lang="da">pakket skrifttypefil</comment>
- <comment xml:lang="de">Gepackte Schriftdatei</comment>
- <comment xml:lang="el">Αρχείο συμπιεσμένης γραμματοσειράς</comment>
- <comment xml:lang="en-GB">packed font file</comment>
- <comment xml:lang="eo">pakigita tipara dosiero</comment>
- <comment xml:lang="es">tipo de letra empaquetado</comment>
- <comment xml:lang="eu">Letra-tipo fitxategi paketatua</comment>
- <comment xml:lang="fi">pakattu fonttitiedosto</comment>
- <comment xml:lang="fo">pakkað stavasniðsfíla</comment>
- <comment xml:lang="fr">fichier de polices empaquetées</comment>
- <comment xml:lang="fur">file di caratar impachetât</comment>
- <comment xml:lang="ga">comhad cló pacáilte</comment>
- <comment xml:lang="gl">ficheiro de fonte empaquetada</comment>
- <comment xml:lang="he">קובץ גופן ארוז</comment>
- <comment xml:lang="hr">zapakirana datoteka fonta</comment>
- <comment xml:lang="hu">packed font-fájl</comment>
- <comment xml:lang="ia">File de typos de litteras impacchettate</comment>
- <comment xml:lang="id">berkas fonta terkemas</comment>
- <comment xml:lang="it">File tipo carattere condensato</comment>
- <comment xml:lang="ja">パックされたフォントファイル</comment>
- <comment xml:lang="kk">қаріп файлы (дестеленген)</comment>
- <comment xml:lang="ko">글꼴 묶음 파일</comment>
- <comment xml:lang="lt">supakuotas šrifto failas</comment>
- <comment xml:lang="lv">sapakota fonta datne</comment>
- <comment xml:lang="ms">Fail font dipek</comment>
- <comment xml:lang="nb">pakket skriftfil</comment>
- <comment xml:lang="nl">ingepakt lettertypebestand</comment>
- <comment xml:lang="nn">pakka skrifttypefil</comment>
- <comment xml:lang="oc">fichièr de poliças empaquetadas</comment>
- <comment xml:lang="pl">Plik ze spakowaną czcionką</comment>
- <comment xml:lang="pt">ficheiro de letras empacotadas</comment>
- <comment xml:lang="pt-BR">Arquivo de fonte empacotado</comment>
- <comment xml:lang="ro">fișier font împachetat</comment>
- <comment xml:lang="ru">Сжатый файл шрифта</comment>
- <comment xml:lang="sk">Komprimovaný súbor písma</comment>
- <comment xml:lang="sl">pakirana datoteka pisave</comment>
- <comment xml:lang="sq">File lloj gërmash i kondensuar</comment>
- <comment xml:lang="sr">пакована датотека слова</comment>
- <comment xml:lang="sv">packad typsnittsfil</comment>
- <comment xml:lang="tr">paketlenmiş yazı tipi dosyası</comment>
+ <comment>Packed font file</comment>
<comment xml:lang="uk">запакований файл шрифту</comment>
- <comment xml:lang="vi">tập tin phông chữ đã đóng gói</comment>
- <comment xml:lang="zh-CN">打包的字体文件</comment>
- <comment xml:lang="zh-TW">包裝字型檔</comment>
+ <comment xml:lang="sv">Packad typsnittsfil</comment>
+ <comment xml:lang="ru">Сжатый файл шрифта</comment>
+ <comment xml:lang="pl">Plik ze spakowaną czcionką</comment>
+ <comment xml:lang="it">File tipo di carattere condensato</comment>
+ <comment xml:lang="eu">Letra-tipoen fitxategi paketatua</comment>
+ <comment xml:lang="es">archivo de tipo de letra empaquetado</comment>
+ <comment xml:lang="de">Gepackte Schriftdatei</comment>
+ <comment xml:lang="be">запакаваны файл шрыфту</comment>
<generic-icon name="font-x-generic"/>
<glob pattern="*.pk"/>
</mime-type>
<mime-type type="application/x-tgif">
<comment>TGIF document</comment>
- <comment xml:lang="af">TGIF-dokument</comment>
- <comment xml:lang="ar">مستند TGIF</comment>
- <comment xml:lang="ast">Documentu de TGIF</comment>
- <comment xml:lang="be-Latn">Dakument TGIF</comment>
- <comment xml:lang="bg">Документ — TGIF</comment>
- <comment xml:lang="ca">document TGIF</comment>
- <comment xml:lang="cs">dokument TGIF</comment>
- <comment xml:lang="da">TGIF-dokument</comment>
- <comment xml:lang="de">TGIF-Dokument</comment>
- <comment xml:lang="el">Έγγραφο TGIF</comment>
- <comment xml:lang="en-GB">TGIF document</comment>
- <comment xml:lang="eo">TGIF-dokumento</comment>
- <comment xml:lang="es">documento TGIF</comment>
- <comment xml:lang="eu">TGIF dokumentua</comment>
- <comment xml:lang="fi">TGIF-asiakirja</comment>
- <comment xml:lang="fo">TGIF skjal</comment>
- <comment xml:lang="fr">document TGIF</comment>
- <comment xml:lang="fur">document TGIF</comment>
- <comment xml:lang="ga">cáipéis TGIF</comment>
- <comment xml:lang="gl">documento TGIF</comment>
- <comment xml:lang="he">מסמך TGIF</comment>
- <comment xml:lang="hr">TGIF dokument</comment>
- <comment xml:lang="hu">TGIF-dokumentum</comment>
- <comment xml:lang="ia">Documento TGIF</comment>
- <comment xml:lang="id">Dokumen TGIF</comment>
- <comment xml:lang="it">Documento TGIF</comment>
- <comment xml:lang="ja">TGIF ドキュメント</comment>
- <comment xml:lang="kk">TGIF құжаты</comment>
- <comment xml:lang="ko">TGIF 문서</comment>
- <comment xml:lang="lt">TGIF dokumentas</comment>
- <comment xml:lang="lv">TGIF dokuments</comment>
- <comment xml:lang="ms">Dokumen TGIF</comment>
- <comment xml:lang="nb">TGIF-dokument</comment>
- <comment xml:lang="nl">TGIF-document</comment>
- <comment xml:lang="nn">TGIF-dokument</comment>
- <comment xml:lang="oc">document TGIF</comment>
- <comment xml:lang="pl">Dokument TGIF</comment>
- <comment xml:lang="pt">documento TGIF</comment>
- <comment xml:lang="pt-BR">Documento TGIF</comment>
- <comment xml:lang="ro">Document TGIF</comment>
- <comment xml:lang="ru">Документ TGIF</comment>
- <comment xml:lang="sk">Dokument TGIF</comment>
- <comment xml:lang="sl">Dokument TGIF</comment>
- <comment xml:lang="sq">Dokument TGIF</comment>
- <comment xml:lang="sr">ТГИФ документ</comment>
- <comment xml:lang="sv">TGIF-dokument</comment>
- <comment xml:lang="tr">TGIF belgesi</comment>
- <comment xml:lang="uk">документ TGIF</comment>
+ <comment xml:lang="zh_TW">TGIF 文件</comment>
+ <comment xml:lang="zh_CN">TGIF 文档</comment>
<comment xml:lang="vi">Tài liệu TGIF</comment>
- <comment xml:lang="zh-CN">TGIF 文档</comment>
- <comment xml:lang="zh-TW">TGIF 文件</comment>
+ <comment xml:lang="uk">документ TGIF</comment>
+ <comment xml:lang="tr">TGIF belgesi</comment>
+ <comment xml:lang="sv">TGIF-dokument</comment>
+ <comment xml:lang="sr">ТГИФ документ</comment>
+ <comment xml:lang="sq">dokument TGIF</comment>
+ <comment xml:lang="sl">Dokument TGIF</comment>
+ <comment xml:lang="si">TGIF ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument TGIF</comment>
+ <comment xml:lang="ru">Документ TGIF</comment>
+ <comment xml:lang="ro">Document TGIF</comment>
+ <comment xml:lang="pt_BR">Documento TGIF</comment>
+ <comment xml:lang="pt">documento TGIF</comment>
+ <comment xml:lang="pl">Dokument TGIF</comment>
+ <comment xml:lang="oc">document TGIF</comment>
+ <comment xml:lang="nn">TGIF-dokument</comment>
+ <comment xml:lang="nl">TGIF-document</comment>
+ <comment xml:lang="nb">TGIF-dokument</comment>
+ <comment xml:lang="ms">Dokumen TGIF</comment>
+ <comment xml:lang="lv">TGIF dokuments</comment>
+ <comment xml:lang="lt">TGIF dokumentas</comment>
+ <comment xml:lang="ko">TGIF 문서</comment>
+ <comment xml:lang="kk">TGIF құжаты</comment>
+ <comment xml:lang="ja">TGIF ドキュメント</comment>
+ <comment xml:lang="it">Documento TGIF</comment>
+ <comment xml:lang="is">TGIF skjal</comment>
+ <comment xml:lang="id">Dokumen TGIF</comment>
+ <comment xml:lang="ia">Documento TGIF</comment>
+ <comment xml:lang="hu">TGIF-dokumentum</comment>
+ <comment xml:lang="hr">TGIF dokument</comment>
+ <comment xml:lang="he">מסמך TGIF</comment>
+ <comment xml:lang="gl">documento TGIF</comment>
+ <comment xml:lang="ga">cáipéis TGIF</comment>
+ <comment xml:lang="fur">document TGIF</comment>
+ <comment xml:lang="fr">document TGIF</comment>
+ <comment xml:lang="fo">TGIF skjal</comment>
+ <comment xml:lang="fi">TGIF-asiakirja</comment>
+ <comment xml:lang="eu">TGIF dokumentua</comment>
+ <comment xml:lang="es">documento TGIF</comment>
+ <comment xml:lang="eo">TGIF-dokumento</comment>
+ <comment xml:lang="en_GB">TGIF document</comment>
+ <comment xml:lang="el">Έγγραφο TGIF</comment>
+ <comment xml:lang="de">TGIF-Dokument</comment>
+ <comment xml:lang="da">TGIF-dokument</comment>
+ <comment xml:lang="cs">dokument TGIF</comment>
+ <comment xml:lang="ca">document TGIF</comment>
+ <comment xml:lang="bg">Документ — TGIF</comment>
+ <comment xml:lang="be@latin">Dakument TGIF</comment>
+ <comment xml:lang="be">дакумент TGIF</comment>
+ <comment xml:lang="ast">Documentu de TGIF</comment>
+ <comment xml:lang="ar">مستند TGIF</comment>
+ <comment xml:lang="af">TGIF-dokument</comment>
<generic-icon name="x-office-document"/>
- <magic priority="50">
+ <magic>
<match type="string" value="%TGIF" offset="0"/>
</magic>
<glob pattern="*.obj"/>
</mime-type>
<mime-type type="application/x-theme">
- <comment>theme</comment>
- <comment xml:lang="af">tema</comment>
- <comment xml:lang="ar">سمة</comment>
- <comment xml:lang="az">örtük</comment>
- <comment xml:lang="be-Latn">matyŭ</comment>
- <comment xml:lang="bg">Тема</comment>
- <comment xml:lang="ca">tema</comment>
- <comment xml:lang="cs">motiv</comment>
- <comment xml:lang="cy">thema</comment>
- <comment xml:lang="da">tema</comment>
- <comment xml:lang="de">Thema</comment>
- <comment xml:lang="el">Θέμα</comment>
- <comment xml:lang="en-GB">theme</comment>
- <comment xml:lang="eo">etoso</comment>
- <comment xml:lang="es">tema</comment>
- <comment xml:lang="eu">gaia</comment>
- <comment xml:lang="fi">teema</comment>
- <comment xml:lang="fo">tema</comment>
- <comment xml:lang="fr">thème</comment>
- <comment xml:lang="fur">teme</comment>
- <comment xml:lang="ga">téama</comment>
- <comment xml:lang="gl">tema</comment>
- <comment xml:lang="he">ערכת נושא</comment>
- <comment xml:lang="hr">Tema</comment>
- <comment xml:lang="hu">téma</comment>
- <comment xml:lang="ia">Thema</comment>
- <comment xml:lang="id">tema</comment>
- <comment xml:lang="it">Tema</comment>
- <comment xml:lang="ja">テーマ</comment>
- <comment xml:lang="ka">თემა</comment>
- <comment xml:lang="kk">тема</comment>
- <comment xml:lang="ko">테마</comment>
- <comment xml:lang="lt">tema</comment>
- <comment xml:lang="lv">motīvs</comment>
- <comment xml:lang="ms">Tema</comment>
- <comment xml:lang="nb">tema</comment>
- <comment xml:lang="nl">thema</comment>
- <comment xml:lang="nn">drakt</comment>
- <comment xml:lang="oc">tèma</comment>
- <comment xml:lang="pl">Motyw</comment>
- <comment xml:lang="pt">tema</comment>
- <comment xml:lang="pt-BR">Tema</comment>
- <comment xml:lang="ro">temă</comment>
- <comment xml:lang="ru">Тема</comment>
- <comment xml:lang="sk">Motív</comment>
- <comment xml:lang="sl">tema</comment>
- <comment xml:lang="sq">Temë</comment>
- <comment xml:lang="sr">тема</comment>
- <comment xml:lang="sv">tema</comment>
- <comment xml:lang="tr">tema</comment>
+ <comment>Theme</comment>
<comment xml:lang="uk">тема</comment>
- <comment xml:lang="vi">sắc thái</comment>
- <comment xml:lang="zh-CN">主题</comment>
- <comment xml:lang="zh-TW">佈景主題</comment>
+ <comment xml:lang="sv">Tema</comment>
+ <comment xml:lang="ru">Тема</comment>
+ <comment xml:lang="pl">Motyw</comment>
+ <comment xml:lang="it">Tema</comment>
+ <comment xml:lang="gl">Tema</comment>
+ <comment xml:lang="eu">Gaia</comment>
+ <comment xml:lang="es">tema</comment>
+ <comment xml:lang="de">Thema</comment>
+ <comment xml:lang="be">тэма</comment>
<sub-class-of type="application/x-desktop"/>
<generic-icon name="package-x-generic"/>
<glob pattern="*.theme"/>
</mime-type>
<mime-type type="application/x-toutdoux">
<comment>ToutDoux document</comment>
- <comment xml:lang="af">ToutDoux-dokument</comment>
- <comment xml:lang="ar">مستند ToutDoux</comment>
- <comment xml:lang="ast">Documentu de ToutDoux</comment>
- <comment xml:lang="az">ToutDoux sənədi</comment>
- <comment xml:lang="be-Latn">Dakument ToutDoux</comment>
- <comment xml:lang="bg">Документ — ToutDoux</comment>
- <comment xml:lang="ca">document ToutDoux</comment>
- <comment xml:lang="cs">dokument ToutDoux</comment>
- <comment xml:lang="cy">Dogfen ToutDoux</comment>
- <comment xml:lang="da">ToutDoux-dokument</comment>
- <comment xml:lang="de">ToutDoux-Dokument</comment>
- <comment xml:lang="el">Έγγραφο ToutDoux</comment>
- <comment xml:lang="en-GB">ToutDoux document</comment>
- <comment xml:lang="eo">ToutDoux-dokumento</comment>
- <comment xml:lang="es">documento de ToutDoux</comment>
- <comment xml:lang="eu">ToutDoux dokumentua</comment>
- <comment xml:lang="fi">ToutDoux-asiakirja</comment>
- <comment xml:lang="fo">ToutDoux skjal</comment>
- <comment xml:lang="fr">document ToutDoux</comment>
- <comment xml:lang="fur">document ToutDoux</comment>
- <comment xml:lang="ga">cáipéis ToutDoux</comment>
- <comment xml:lang="gl">documento de ToutDoux</comment>
- <comment xml:lang="he">מסמך של ToutDoux</comment>
- <comment xml:lang="hr">ToutDoux dokument</comment>
- <comment xml:lang="hu">ToutDoux-dokumentum</comment>
- <comment xml:lang="ia">Documento ToutDoux</comment>
- <comment xml:lang="id">Dokumen ToutDoux</comment>
- <comment xml:lang="it">Documento ToutDoux</comment>
- <comment xml:lang="ja">ToutDoux ドキュメント</comment>
- <comment xml:lang="kk">ToutDoux құжаты</comment>
- <comment xml:lang="ko">ToutDoux 문서</comment>
- <comment xml:lang="lt">ToutDoux dokumentas</comment>
- <comment xml:lang="lv">ToutDoux dokuments</comment>
- <comment xml:lang="ms">Dokumen ToutDoux</comment>
- <comment xml:lang="nb">ToutDoux-dokument</comment>
- <comment xml:lang="nl">ToutDoux-document</comment>
- <comment xml:lang="nn">ToutDoux-dokument</comment>
- <comment xml:lang="oc">document ToutDoux</comment>
- <comment xml:lang="pl">Dokument ToutDoux</comment>
- <comment xml:lang="pt">documento ToutDoux</comment>
- <comment xml:lang="pt-BR">Documento do ToutDoux</comment>
- <comment xml:lang="ro">Document ToutDoux</comment>
- <comment xml:lang="ru">Документ ToutDoux</comment>
- <comment xml:lang="sk">Dokument ToutDoux</comment>
- <comment xml:lang="sl">Dokument ToutDoux</comment>
- <comment xml:lang="sq">Dokument ToutDoux</comment>
- <comment xml:lang="sr">Туду документ</comment>
- <comment xml:lang="sv">ToutDoux-dokument</comment>
- <comment xml:lang="tr">ToutDoux belgesi</comment>
- <comment xml:lang="uk">документ ToutDoux</comment>
+ <comment xml:lang="zh_TW">ToutDoux 文件</comment>
+ <comment xml:lang="zh_CN">ToutDoux 文档</comment>
<comment xml:lang="vi">Tài liệu ToutDoux</comment>
- <comment xml:lang="zh-CN">ToutDoux 文档</comment>
- <comment xml:lang="zh-TW">ToutDoux 文件</comment>
+ <comment xml:lang="uk">документ ToutDoux</comment>
+ <comment xml:lang="tr">ToutDoux belgesi</comment>
+ <comment xml:lang="sv">ToutDoux-dokument</comment>
+ <comment xml:lang="sr">Туду документ</comment>
+ <comment xml:lang="sq">dokument ToutDoux</comment>
+ <comment xml:lang="sl">Dokument ToutDoux</comment>
+ <comment xml:lang="si">ToutDoux ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument ToutDoux</comment>
+ <comment xml:lang="ru">Документ ToutDoux</comment>
+ <comment xml:lang="ro">Document ToutDoux</comment>
+ <comment xml:lang="pt_BR">Documento do ToutDoux</comment>
+ <comment xml:lang="pt">documento ToutDoux</comment>
+ <comment xml:lang="pl">Dokument ToutDoux</comment>
+ <comment xml:lang="oc">document ToutDoux</comment>
+ <comment xml:lang="nn">ToutDoux-dokument</comment>
+ <comment xml:lang="nl">ToutDoux-document</comment>
+ <comment xml:lang="nb">ToutDoux-dokument</comment>
+ <comment xml:lang="ms">Dokumen ToutDoux</comment>
+ <comment xml:lang="lv">ToutDoux dokuments</comment>
+ <comment xml:lang="lt">ToutDoux dokumentas</comment>
+ <comment xml:lang="ko">ToutDoux 문서</comment>
+ <comment xml:lang="kk">ToutDoux құжаты</comment>
+ <comment xml:lang="ja">ToutDoux ドキュメント</comment>
+ <comment xml:lang="it">Documento ToutDoux</comment>
+ <comment xml:lang="is">ToutDoux skjal</comment>
+ <comment xml:lang="id">Dokumen ToutDoux</comment>
+ <comment xml:lang="ia">Documento ToutDoux</comment>
+ <comment xml:lang="hu">ToutDoux-dokumentum</comment>
+ <comment xml:lang="hr">ToutDoux dokument</comment>
+ <comment xml:lang="he">מסמך של ToutDoux</comment>
+ <comment xml:lang="gl">documento de ToutDoux</comment>
+ <comment xml:lang="ga">cáipéis ToutDoux</comment>
+ <comment xml:lang="fur">document ToutDoux</comment>
+ <comment xml:lang="fr">document ToutDoux</comment>
+ <comment xml:lang="fo">ToutDoux skjal</comment>
+ <comment xml:lang="fi">ToutDoux-asiakirja</comment>
+ <comment xml:lang="eu">ToutDoux dokumentua</comment>
+ <comment xml:lang="es">documento de ToutDoux</comment>
+ <comment xml:lang="eo">ToutDoux-dokumento</comment>
+ <comment xml:lang="en_GB">ToutDoux document</comment>
+ <comment xml:lang="el">Έγγραφο ToutDoux</comment>
+ <comment xml:lang="de">ToutDoux-Dokument</comment>
+ <comment xml:lang="da">ToutDoux-dokument</comment>
+ <comment xml:lang="cy">Dogfen ToutDoux</comment>
+ <comment xml:lang="cs">dokument ToutDoux</comment>
+ <comment xml:lang="ca">document ToutDoux</comment>
+ <comment xml:lang="bg">Документ — ToutDoux</comment>
+ <comment xml:lang="be@latin">Dakument ToutDoux</comment>
+ <comment xml:lang="be">дакумент ToutDoux</comment>
+ <comment xml:lang="az">ToutDoux sənədi</comment>
+ <comment xml:lang="ast">Documentu de ToutDoux</comment>
+ <comment xml:lang="ar">مستند ToutDoux</comment>
+ <comment xml:lang="af">ToutDoux-dokument</comment>
<generic-icon name="x-office-document"/>
</mime-type>
<mime-type type="application/x-trash">
- <comment>backup file</comment>
- <comment xml:lang="af">rugsteunlêer</comment>
- <comment xml:lang="ar">ملف النسخ الاحتياطي</comment>
- <comment xml:lang="be-Latn">zapasny fajł</comment>
- <comment xml:lang="bg">Резервно копие</comment>
- <comment xml:lang="ca">fitxer de còpia de seguretat</comment>
- <comment xml:lang="cs">záložní soubor</comment>
- <comment xml:lang="da">sikkerhedskopi</comment>
- <comment xml:lang="de">Sicherungsdatei</comment>
- <comment xml:lang="el">Αντίγραφο ασφαλείας</comment>
- <comment xml:lang="en-GB">backup file</comment>
- <comment xml:lang="eo">restaŭrkopio</comment>
- <comment xml:lang="es">archivo de respaldo</comment>
- <comment xml:lang="eu">babes-kopiako fitxategia</comment>
- <comment xml:lang="fi">varmuuskopio</comment>
- <comment xml:lang="fo">trygdarritsfíla</comment>
- <comment xml:lang="fr">fichier de sauvegarde</comment>
- <comment xml:lang="fur">file di backup</comment>
- <comment xml:lang="ga">comhad cúltaca</comment>
- <comment xml:lang="gl">ficheiro de copia de seguridade</comment>
- <comment xml:lang="he">קובץ גיבוי</comment>
- <comment xml:lang="hr">Datoteka sigurnosne kopije</comment>
- <comment xml:lang="hu">biztonsági mentés</comment>
- <comment xml:lang="ia">Copia de reserva</comment>
- <comment xml:lang="id">berkas cadangan</comment>
- <comment xml:lang="it">File di backup</comment>
- <comment xml:lang="ja">バックアップファイル</comment>
- <comment xml:lang="kk">резервті көшірмесі</comment>
- <comment xml:lang="ko">백업 파일</comment>
- <comment xml:lang="lt">atsarginis failas</comment>
- <comment xml:lang="lv">dublējuma datne</comment>
- <comment xml:lang="ms">Fail backup</comment>
- <comment xml:lang="nb">sikkerhetskopi</comment>
- <comment xml:lang="nl">reservekopiebestand</comment>
- <comment xml:lang="nn">tryggleikskopi</comment>
- <comment xml:lang="oc">fichièr de salvament</comment>
- <comment xml:lang="pl">Plik zapasowy</comment>
- <comment xml:lang="pt">cópia de segurança</comment>
- <comment xml:lang="pt-BR">Arquivo de backup</comment>
- <comment xml:lang="ro">fișier de backup</comment>
+ <comment>Backup file</comment>
+ <comment xml:lang="uk">Файл резервної копії</comment>
+ <comment xml:lang="sv">Säkerhetskopia</comment>
<comment xml:lang="ru">Резервная копия</comment>
- <comment xml:lang="sk">Záložný súbor</comment>
- <comment xml:lang="sl">varnostna kopija datoteke</comment>
- <comment xml:lang="sq">File backup</comment>
- <comment xml:lang="sr">датотека резерве</comment>
- <comment xml:lang="sv">säkerhetskopia</comment>
- <comment xml:lang="tr">yedek dosyası</comment>
- <comment xml:lang="uk">резервна копія</comment>
- <comment xml:lang="vi">tập tin sao lưu</comment>
- <comment xml:lang="zh-CN">备份文件</comment>
- <comment xml:lang="zh-TW">備份檔</comment>
+ <comment xml:lang="pt_BR">Arquivo de backup</comment>
+ <comment xml:lang="pl">Plik zapasowy</comment>
+ <comment xml:lang="ja">控え</comment>
+ <comment xml:lang="it">File di backup</comment>
+ <comment xml:lang="gl">Ficheiro de respaldo</comment>
+ <comment xml:lang="eu">Babeskopia-fitxategia</comment>
+ <comment xml:lang="es">archivo de copia de respaldo</comment>
+ <comment xml:lang="de">Sicherungsdatei</comment>
+ <comment xml:lang="be">рэзервовая копія файла</comment>
<glob pattern="*~"/>
<glob pattern="*%"/>
<glob pattern="*.bak"/>
@@ -21934,63 +22909,66 @@ command to generate the output files.
</mime-type>
<mime-type type="text/troff">
<comment>Troff document</comment>
- <comment xml:lang="af">Troff-dokument</comment>
- <comment xml:lang="ar">مستند Troff</comment>
- <comment xml:lang="ast">Documentu de Troff</comment>
- <comment xml:lang="az">Troff sənədi</comment>
- <comment xml:lang="be-Latn">Dakument Troff</comment>
- <comment xml:lang="bg">Документ — Troff</comment>
- <comment xml:lang="ca">document Troff</comment>
- <comment xml:lang="cs">dokument Troff</comment>
- <comment xml:lang="cy">Dogfen troff</comment>
- <comment xml:lang="da">Troffdokument</comment>
- <comment xml:lang="de">Troff-Dokument</comment>
- <comment xml:lang="el">Έγγραφο troff</comment>
- <comment xml:lang="en-GB">Troff document</comment>
- <comment xml:lang="eo">Troff-dokumento</comment>
- <comment xml:lang="es">documento de Troff</comment>
- <comment xml:lang="eu">Troff dokumentua</comment>
- <comment xml:lang="fi">Troff-asiakirja</comment>
- <comment xml:lang="fo">Troff skjal</comment>
- <comment xml:lang="fr">document Troff</comment>
- <comment xml:lang="fur">document Troff</comment>
- <comment xml:lang="ga">cáipéis Troff</comment>
- <comment xml:lang="gl">documento Troff</comment>
- <comment xml:lang="he">מסמך Troff</comment>
- <comment xml:lang="hr">Troff dokument</comment>
- <comment xml:lang="hu">Troff-dokumentum</comment>
- <comment xml:lang="ia">Documento Troff</comment>
- <comment xml:lang="id">Dokumen Troff</comment>
- <comment xml:lang="it">Documento Troff</comment>
- <comment xml:lang="ja">Troff 入力ドキュメント</comment>
- <comment xml:lang="kk">Troff құжаты</comment>
- <comment xml:lang="ko">Troff 문서</comment>
- <comment xml:lang="lt">Troff dokumentas</comment>
- <comment xml:lang="lv">Troff dokuments</comment>
- <comment xml:lang="ms">Dokumen Troff</comment>
- <comment xml:lang="nb">Troff-dokument</comment>
- <comment xml:lang="nl">Troff-document</comment>
- <comment xml:lang="nn">Troff-dokument</comment>
- <comment xml:lang="oc">document Troff</comment>
- <comment xml:lang="pl">Dokument Troff</comment>
- <comment xml:lang="pt">documento Troff</comment>
- <comment xml:lang="pt-BR">Documento Troff</comment>
- <comment xml:lang="ro">Document Troff</comment>
- <comment xml:lang="ru">Документ Troff</comment>
- <comment xml:lang="sk">Dokument troff</comment>
- <comment xml:lang="sl">Dokument Troff</comment>
- <comment xml:lang="sq">Dokument Troff</comment>
- <comment xml:lang="sr">Трофф документ</comment>
- <comment xml:lang="sv">Troff-dokument</comment>
- <comment xml:lang="tr">Troff belgesi</comment>
- <comment xml:lang="uk">документ Troff</comment>
+ <comment xml:lang="zh_TW">Troff 文件</comment>
+ <comment xml:lang="zh_CN">Troff 文档</comment>
<comment xml:lang="vi">Tài liệu Troff</comment>
- <comment xml:lang="zh-CN">Troff 文档</comment>
- <comment xml:lang="zh-TW">Troff 文件</comment>
+ <comment xml:lang="uk">документ Troff</comment>
+ <comment xml:lang="tr">Troff belgesi</comment>
+ <comment xml:lang="sv">Troff-dokument</comment>
+ <comment xml:lang="sr">Трофф документ</comment>
+ <comment xml:lang="sq">dokument Troff</comment>
+ <comment xml:lang="sl">Dokument Troff</comment>
+ <comment xml:lang="si">ට්රොෆ් ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument troff</comment>
+ <comment xml:lang="ru">Документ Troff</comment>
+ <comment xml:lang="ro">Document Troff</comment>
+ <comment xml:lang="pt_BR">Documento Troff</comment>
+ <comment xml:lang="pt">documento Troff</comment>
+ <comment xml:lang="pl">Dokument Troff</comment>
+ <comment xml:lang="oc">document Troff</comment>
+ <comment xml:lang="nn">Troff-dokument</comment>
+ <comment xml:lang="nl">Troff-document</comment>
+ <comment xml:lang="nb">Troff-dokument</comment>
+ <comment xml:lang="ms">Dokumen Troff</comment>
+ <comment xml:lang="lv">Troff dokuments</comment>
+ <comment xml:lang="lt">Troff dokumentas</comment>
+ <comment xml:lang="ko">Troff 문서</comment>
+ <comment xml:lang="kk">Troff құжаты</comment>
+ <comment xml:lang="ja">Troff 入力ドキュメント</comment>
+ <comment xml:lang="it">Documento Troff</comment>
+ <comment xml:lang="is">Troff skjal</comment>
+ <comment xml:lang="id">Dokumen Troff</comment>
+ <comment xml:lang="ia">Documento Troff</comment>
+ <comment xml:lang="hu">Troff-dokumentum</comment>
+ <comment xml:lang="hr">Troff dokument</comment>
+ <comment xml:lang="he">מסמך Troff</comment>
+ <comment xml:lang="gl">documento Troff</comment>
+ <comment xml:lang="ga">cáipéis Troff</comment>
+ <comment xml:lang="fur">document Troff</comment>
+ <comment xml:lang="fr">document Troff</comment>
+ <comment xml:lang="fo">Troff skjal</comment>
+ <comment xml:lang="fi">Troff-asiakirja</comment>
+ <comment xml:lang="eu">Troff dokumentua</comment>
+ <comment xml:lang="es">documento de Troff</comment>
+ <comment xml:lang="eo">Troff-dokumento</comment>
+ <comment xml:lang="en_GB">Troff document</comment>
+ <comment xml:lang="el">Έγγραφο troff</comment>
+ <comment xml:lang="de">Troff-Dokument</comment>
+ <comment xml:lang="da">Troffdokument</comment>
+ <comment xml:lang="cy">Dogfen troff</comment>
+ <comment xml:lang="cs">dokument Troff</comment>
+ <comment xml:lang="ca">document Troff</comment>
+ <comment xml:lang="bg">Документ — Troff</comment>
+ <comment xml:lang="be@latin">Dakument Troff</comment>
+ <comment xml:lang="be">дакумент Troff</comment>
+ <comment xml:lang="az">Troff sənədi</comment>
+ <comment xml:lang="ast">Documentu de Troff</comment>
+ <comment xml:lang="ar">مستند Troff</comment>
+ <comment xml:lang="af">Troff-dokument</comment>
<sub-class-of type="text/plain"/>
<alias type="application/x-troff"/>
<alias type="text/x-troff"/>
- <magic priority="50">
+ <magic>
<match type="string" value=".\\\&quot;" offset="0"/>
<match type="string" value="'\\\&quot;" offset="0"/>
<match type="string" value="'.\\\&quot;" offset="0"/>
@@ -22001,151 +22979,113 @@ command to generate the output files.
<glob weight="10" pattern="*.t"/>
</mime-type>
<mime-type type="application/x-troff-man">
- <comment>Manpage manual document</comment>
- <comment xml:lang="af">Manpage-handleiding</comment>
- <comment xml:lang="bg">Страница от ръководството</comment>
- <comment xml:lang="ca">document de pàgina man</comment>
- <comment xml:lang="cs">manuálová stránka</comment>
- <comment xml:lang="da">Manpage-manualdokument</comment>
- <comment xml:lang="de">Manpage-Handbuchdokument</comment>
- <comment xml:lang="el">Έγγραφο βοήθειας manpage</comment>
- <comment xml:lang="en-GB">Manpage manual document</comment>
- <comment xml:lang="es">documento de manual de Manpage</comment>
- <comment xml:lang="eu">Manpage eskuliburu dokumentua</comment>
- <comment xml:lang="fi">Manpage manuaali dokumentit</comment>
- <comment xml:lang="fr">document manuel Manpage</comment>
- <comment xml:lang="fur">document manuâl Manpage</comment>
- <comment xml:lang="ga">cáipéis lámhleabhair Man</comment>
- <comment xml:lang="he">מסמך תיעוד man</comment>
- <comment xml:lang="hr">Manpage dokument priručnika</comment>
- <comment xml:lang="hu">Manpage kézikönyv-dokumentum</comment>
- <comment xml:lang="ia">Pagina de manual "man"</comment>
- <comment xml:lang="id">Dokumen manual manpage</comment>
- <comment xml:lang="it">Documento di manuale manpage</comment>
- <comment xml:lang="kk">Manpage нұсқаулық құжаты</comment>
- <comment xml:lang="ko">man 페이지 설명서 문서</comment>
- <comment xml:lang="oc">document de manual Manpage</comment>
- <comment xml:lang="pl">Dokument podręcznika stron pomocy</comment>
- <comment xml:lang="pt">documento de ajuda Manpage</comment>
- <comment xml:lang="pt-BR">Documento Manpage</comment>
- <comment xml:lang="ru">Документ справочной системы Manpage</comment>
- <comment xml:lang="sk">Dokument manuálu Manpage</comment>
- <comment xml:lang="sr">документ упутства странице упутства</comment>
- <comment xml:lang="sv">Manpage-manualdokument</comment>
- <comment xml:lang="tr">Man sayfası el kitabı belgesi</comment>
- <comment xml:lang="uk">документ підручника man</comment>
- <comment xml:lang="zh-CN">Manpage 手册文档</comment>
- <comment xml:lang="zh-TW">Manpage 手冊說明文件</comment>
+ <comment>Manual page</comment>
+ <comment xml:lang="zh_CN">手册页</comment>
+ <comment xml:lang="uk">сторінка підручника</comment>
+ <comment xml:lang="tr">Kılavuz sayfası</comment>
+ <comment xml:lang="sv">Manualsida</comment>
+ <comment xml:lang="si">අත්පොත පිටුව</comment>
+ <comment xml:lang="ru">Страница руководства</comment>
+ <comment xml:lang="pt_BR">Página de manual</comment>
+ <comment xml:lang="pl">Strona podręcznika</comment>
+ <comment xml:lang="nl">Handleidingpagina</comment>
+ <comment xml:lang="ko">man 페이지</comment>
+ <comment xml:lang="kk">Нұсқаулық парағы</comment>
+ <comment xml:lang="ja">マニュアルページ</comment>
+ <comment xml:lang="it">Pagina di manuale</comment>
+ <comment xml:lang="hr">Stranica priručnika</comment>
+ <comment xml:lang="gl">Páxina de manual</comment>
+ <comment xml:lang="fi">Manuaalisivu</comment>
+ <comment xml:lang="eu">Eskuliburu-orria</comment>
+ <comment xml:lang="es">página de manual</comment>
+ <comment xml:lang="en_GB">Manual page</comment>
+ <comment xml:lang="de">Handbuchseite</comment>
+ <comment xml:lang="be">старонка даведкі</comment>
+ <comment xml:lang="ar">صفحة دليل</comment>
<sub-class-of type="text/plain"/>
<generic-icon name="text-x-generic"/>
<glob pattern="*.man"/>
+ <glob pattern="*.[1-9]"/>
</mime-type>
<mime-type type="application/x-troff-man-compressed">
- <comment>manual page (compressed)</comment>
- <comment xml:lang="af">handleiding (saamgepers)</comment>
- <comment xml:lang="ar">صفحة المساعدة (مضغوطة)</comment>
- <comment xml:lang="az">man səhifəsi (sıxışdırılmış)</comment>
- <comment xml:lang="be-Latn">staronka dapamohi (skampresavanaja)</comment>
- <comment xml:lang="bg">Страница от ръководството — компресирана</comment>
- <comment xml:lang="ca">pàgina de manual (amb compressió)</comment>
- <comment xml:lang="cs">manuálová stránka (komprimovaná)</comment>
- <comment xml:lang="cy">tudalen llawlyfr (wedi ei gywasgu)</comment>
- <comment xml:lang="da">manualside (komprimeret)</comment>
- <comment xml:lang="de">Handbuchseite (komprimiert)</comment>
- <comment xml:lang="el">Σελίδα οδηγιών (συμπιεσμένη)</comment>
- <comment xml:lang="en-GB">manual page (compressed)</comment>
- <comment xml:lang="eo">manpaĝo (kunpremita)</comment>
- <comment xml:lang="es">página de manual (comprimida)</comment>
- <comment xml:lang="eu">eskuliburu orria (konprimitua)</comment>
- <comment xml:lang="fi">manuaalisivu (pakattu)</comment>
- <comment xml:lang="fo">handbókasíða (stappað)</comment>
- <comment xml:lang="fr">page de manuel (compressée)</comment>
- <comment xml:lang="fur">pagjine di manuâl (comprimude)</comment>
- <comment xml:lang="ga">leathanach lámhleabhair (comhbhrúite)</comment>
- <comment xml:lang="gl">páxina de manual (comprimida)</comment>
- <comment xml:lang="he">דף עזר (מכווץ)</comment>
- <comment xml:lang="hr">Stranica priručnika (sažeta)</comment>
- <comment xml:lang="hu">kézikönyvoldal (tömörített)</comment>
- <comment xml:lang="ia">Pagina de manual (comprimite)</comment>
- <comment xml:lang="id">halaman manual (terkompresi)</comment>
- <comment xml:lang="it">Pagina di manuale (compressa)</comment>
- <comment xml:lang="ja">(圧縮) man ページ</comment>
- <comment xml:lang="kk">әдістемелік парағы (сығылған)</comment>
- <comment xml:lang="ko">man 페이지(압축)</comment>
- <comment xml:lang="lt">žinyno puslapis (suglaudintas)</comment>
- <comment xml:lang="lv">rokasgrāmatas lapa (saspiesta)</comment>
- <comment xml:lang="ms">Halaman manual (termampat)</comment>
- <comment xml:lang="nb">manualside (komprimert)</comment>
- <comment xml:lang="nl">handleidingspagina (ingepakt)</comment>
- <comment xml:lang="nn">manualside (pakka)</comment>
- <comment xml:lang="oc">pagina de manual (compressat)</comment>
- <comment xml:lang="pl">Strona podręcznika (skompresowana)</comment>
- <comment xml:lang="pt">página de manual (comprimida)</comment>
- <comment xml:lang="pt-BR">Página de manual (compactada)</comment>
- <comment xml:lang="ro">pagină de manual (comprimată)</comment>
+ <comment>Manual page (compressed)</comment>
+ <comment xml:lang="zh_CN">手册页(压缩)</comment>
+ <comment xml:lang="uk">сторінка підручника (стиснена)</comment>
+ <comment xml:lang="tr">Kılavuz sayfası (sıkıştırılmış)</comment>
+ <comment xml:lang="sv">Manualsida (komprimerad)</comment>
+ <comment xml:lang="si">අතින් පිටුව (සම්පීඩිත)</comment>
<comment xml:lang="ru">Страница руководства (сжатая)</comment>
- <comment xml:lang="sk">Manuálová stránka (komprimovaná)</comment>
- <comment xml:lang="sl">stran priročnika (stisnjena)</comment>
- <comment xml:lang="sq">Faqe manuali (e kompresuar)</comment>
- <comment xml:lang="sr">страница упутства (запакована)</comment>
- <comment xml:lang="sv">manualsida (komprimerad)</comment>
- <comment xml:lang="tr">kılavuz dosyası (sıkıştırılmış)</comment>
- <comment xml:lang="uk">сторінка посібника (стиснена)</comment>
- <comment xml:lang="vi">trang hướng dẫn (đã nén)</comment>
- <comment xml:lang="zh-CN">手册页(压缩)</comment>
- <comment xml:lang="zh-TW">手冊頁面 (壓縮版)</comment>
+ <comment xml:lang="pt_BR">Página de manual (compactada)</comment>
+ <comment xml:lang="pl">Strona podręcznika (skompresowana)</comment>
+ <comment xml:lang="nl">Handleidingpagina (gecomprimeerd)</comment>
+ <comment xml:lang="ko">man 페이지 (압축)</comment>
+ <comment xml:lang="kk">Нұсқаулық парағы (сығылған)</comment>
+ <comment xml:lang="ja">マニュアルページ (圧縮)</comment>
+ <comment xml:lang="it">Pagina di manuale (compressa)</comment>
+ <comment xml:lang="hr">Stranica priručnika (sažeta)</comment>
+ <comment xml:lang="gl">Páxina de manual (comprimida)</comment>
+ <comment xml:lang="fi">Manuaalisivu (pakattu)</comment>
+ <comment xml:lang="eu">Eskuliburu-orria (konprimatua)</comment>
+ <comment xml:lang="es">página de manual (comprimida)</comment>
+ <comment xml:lang="en_GB">Manual page (compressed)</comment>
+ <comment xml:lang="de">Handbuchseite (komprimiert)</comment>
+ <comment xml:lang="be">старонка даведкі (сціснутая)</comment>
+ <comment xml:lang="ar">صفحة دليل (مضغوطة)</comment>
<generic-icon name="text-x-generic"/>
</mime-type>
<mime-type type="application/x-tzo">
<comment>Tar archive (LZO-compressed)</comment>
- <comment xml:lang="af">Tar-argief (LZO-saamgepers)</comment>
- <comment xml:lang="ar">أرشيف Tar (مضغوط-LZO)</comment>
- <comment xml:lang="be-Latn">Archiŭ tar (LZO-skampresavany)</comment>
- <comment xml:lang="bg">Архив — tar, компресиран с LZO</comment>
- <comment xml:lang="ca">arxiu tar (amb compressió LZO)</comment>
- <comment xml:lang="cs">archiv Tar (komprimovaný pomocí LZO)</comment>
- <comment xml:lang="da">Tar-arkiv (LZO-komprimeret)</comment>
- <comment xml:lang="de">Tar-Archiv (LZO-komprimiert)</comment>
- <comment xml:lang="el">Αρχείο Tar (συμπιεσμένο με LZO)</comment>
- <comment xml:lang="en-GB">Tar archive (LZO-compressed)</comment>
- <comment xml:lang="es">archivador Tar (comprimido con LZO)</comment>
- <comment xml:lang="eu">Tar artxiboa (LZO-rekin konprimitua)</comment>
- <comment xml:lang="fi">Tar-arkisto (LZO-pakattu)</comment>
- <comment xml:lang="fo">Tar skjalasavn (LZO-stappað)</comment>
- <comment xml:lang="fr">archive tar (compression LZO)</comment>
- <comment xml:lang="fur">archivi Tar (comprimût cun LZO)</comment>
- <comment xml:lang="ga">cartlann Tar (comhbhrúite le LZO)</comment>
- <comment xml:lang="gl">arquivo Tar (comprimido con LZO)</comment>
- <comment xml:lang="he">ארכיון Tar (מכווץ ע״י LZO)</comment>
- <comment xml:lang="hr">Tar arhiva (LZO sažeta)</comment>
- <comment xml:lang="hu">Tar archívum (LZO tömörítésű)</comment>
- <comment xml:lang="ia">Archivo Tar (comprimite con LZO)</comment>
- <comment xml:lang="id">Arsip Tar (terkompresi LZO)</comment>
- <comment xml:lang="it">Archivio tar (compresso con LZO)</comment>
- <comment xml:lang="ja">Tar アーカイブ (LZO 圧縮)</comment>
- <comment xml:lang="kk">Tar архиві (LZO-мен сығылған)</comment>
- <comment xml:lang="ko">TAR 묶음 파일(LZO 압축)</comment>
- <comment xml:lang="lt">Tar archyvas (suglaudintas su LZO)</comment>
- <comment xml:lang="lv">Tar arhīvs (saspiests ar LZO)</comment>
- <comment xml:lang="nb">Tar-arkiv (LZO-komprimert)</comment>
- <comment xml:lang="nl">Tar-archief (ingepakt met LZO)</comment>
- <comment xml:lang="nn">Tar-arkiv (pakka med LZO)</comment>
- <comment xml:lang="oc">archiu tar (compression LZO)</comment>
- <comment xml:lang="pl">Archiwum tar (kompresja LZO)</comment>
- <comment xml:lang="pt">arquivo Tar (compressão LZO)</comment>
- <comment xml:lang="pt-BR">Pacote Tar (compactado com LZO)</comment>
- <comment xml:lang="ro">Arhivă Tar (comprimată LZO)</comment>
- <comment xml:lang="ru">Архив TAR (сжатый lzo)</comment>
- <comment xml:lang="sk">Archív Tar (komprimovaný pomocou LZO)</comment>
- <comment xml:lang="sl">Datoteka arhiva Tar (stisnjen z LZO)</comment>
- <comment xml:lang="sq">Arkiv tar (i kompresuar me LZO)</comment>
- <comment xml:lang="sr">Тар архива (запакована ЛЗО-ом)</comment>
- <comment xml:lang="sv">Tar-arkiv (LZO-komprimerat)</comment>
- <comment xml:lang="tr">Tar arşivi (LZO ile sıkıştırılmış)</comment>
- <comment xml:lang="uk">архів tar (стиснений LZO)</comment>
+ <comment xml:lang="zh_TW">Tar 封存檔 (LZO 壓縮)</comment>
+ <comment xml:lang="zh_CN">Tar 归档文件(LZO 压缩)</comment>
<comment xml:lang="vi">Kho nén tar (đã nén LZO)</comment>
- <comment xml:lang="zh-CN">Tar 归档文件(LZO 压缩)</comment>
- <comment xml:lang="zh-TW">Tar 封存檔 (LZO 壓縮)</comment>
+ <comment xml:lang="uk">архів tar (стиснений LZO)</comment>
+ <comment xml:lang="tr">Tar arşivi (LZO ile sıkıştırılmış)</comment>
+ <comment xml:lang="sv">Tar-arkiv (LZO-komprimerat)</comment>
+ <comment xml:lang="sr">Тар архива (запакована ЛЗО-ом)</comment>
+ <comment xml:lang="sq">arkiv tar (ngjeshur me LZO)</comment>
+ <comment xml:lang="sl">Datoteka arhiva Tar (stisnjen z LZO)</comment>
+ <comment xml:lang="si">තාර සංරක්ෂිතය (LZO-සම්පීඩිත)</comment>
+ <comment xml:lang="sk">Archív Tar (komprimovaný pomocou LZO)</comment>
+ <comment xml:lang="ru">Архив TAR (сжатый lzo)</comment>
+ <comment xml:lang="ro">Arhivă Tar (comprimată LZO)</comment>
+ <comment xml:lang="pt_BR">Pacote Tar (compactado com LZO)</comment>
+ <comment xml:lang="pt">arquivo Tar (compressão LZO)</comment>
+ <comment xml:lang="pl">Archiwum tar (kompresja LZO)</comment>
+ <comment xml:lang="oc">archiu tar (compression LZO)</comment>
+ <comment xml:lang="nn">Tar-arkiv (pakka med LZO)</comment>
+ <comment xml:lang="nl">Tar-archief (ingepakt met LZO)</comment>
+ <comment xml:lang="nb">Tar-arkiv (LZO-komprimert)</comment>
+ <comment xml:lang="lv">Tar arhīvs (saspiests ar LZO)</comment>
+ <comment xml:lang="lt">Tar archyvas (suglaudintas su LZO)</comment>
+ <comment xml:lang="ko">TAR 묶음 파일(LZO 압축)</comment>
+ <comment xml:lang="kk">Tar архиві (LZO-мен сығылған)</comment>
+ <comment xml:lang="ja">Tar アーカイブ (LZO 圧縮)</comment>
+ <comment xml:lang="it">Archivio tar (compresso con LZO)</comment>
+ <comment xml:lang="is">Tar safnskrá (LZO-þjappað)</comment>
+ <comment xml:lang="id">Arsip Tar (terkompresi LZO)</comment>
+ <comment xml:lang="ia">Archivo Tar (comprimite con LZO)</comment>
+ <comment xml:lang="hu">Tar archívum (LZO tömörítésű)</comment>
+ <comment xml:lang="hr">Tar arhiva (LZO sažeta)</comment>
+ <comment xml:lang="he">ארכיון Tar (מכווץ ע״י LZO)</comment>
+ <comment xml:lang="gl">arquivo Tar (comprimido con LZO)</comment>
+ <comment xml:lang="ga">cartlann Tar (comhbhrúite le LZO)</comment>
+ <comment xml:lang="fur">archivi Tar (comprimût cun LZO)</comment>
+ <comment xml:lang="fr">archive tar (compression LZO)</comment>
+ <comment xml:lang="fo">Tar skjalasavn (LZO-stappað)</comment>
+ <comment xml:lang="fi">Tar-arkisto (LZO-pakattu)</comment>
+ <comment xml:lang="eu">Tar artxiboa (LZO-rekin konprimitua)</comment>
+ <comment xml:lang="es">archivador TAR (comprimido con LZO)</comment>
+ <comment xml:lang="en_GB">Tar archive (LZO-compressed)</comment>
+ <comment xml:lang="el">Αρχείο Tar (συμπιεσμένο με LZO)</comment>
+ <comment xml:lang="de">Tar-Archiv (LZO-komprimiert)</comment>
+ <comment xml:lang="da">Tar-arkiv (LZO-komprimeret)</comment>
+ <comment xml:lang="cs">archiv Tar (komprimovaný pomocí LZO)</comment>
+ <comment xml:lang="ca">arxiu tar (amb compressió LZO)</comment>
+ <comment xml:lang="bg">Архив — tar, компресиран с LZO</comment>
+ <comment xml:lang="be@latin">Archiŭ tar (LZO-skampresavany)</comment>
+ <comment xml:lang="be">архіў tar (сцісканне LZO)</comment>
+ <comment xml:lang="ar">أرشيف Tar (مضغوط-LZO)</comment>
+ <comment xml:lang="af">Tar-argief (LZO-saamgepers)</comment>
<sub-class-of type="application/x-lzop"/>
<generic-icon name="package-x-generic"/>
<glob pattern="*.tar.lzo"/>
@@ -22153,50 +23093,54 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-xz">
<comment>XZ archive</comment>
- <comment xml:lang="af">XZ-argief</comment>
- <comment xml:lang="ar">أرشيف XZ</comment>
- <comment xml:lang="bg">Архив — XZ</comment>
- <comment xml:lang="ca">arxiu XZ</comment>
- <comment xml:lang="cs">archiv XZ</comment>
- <comment xml:lang="da">XZ-arkiv</comment>
- <comment xml:lang="de">XZ-Archiv</comment>
- <comment xml:lang="el">Συμπιεσμένο αρχείο XZ</comment>
- <comment xml:lang="en-GB">XZ archive</comment>
- <comment xml:lang="eo">XZ-arkivo</comment>
- <comment xml:lang="es">archivador XZ</comment>
- <comment xml:lang="eu">XZ artxiboa</comment>
- <comment xml:lang="fi">XZ-arkisto</comment>
- <comment xml:lang="fo">XZ skjalasavn</comment>
- <comment xml:lang="fr">archive XZ</comment>
- <comment xml:lang="fur">archivi XZ</comment>
- <comment xml:lang="ga">cartlann XZ</comment>
- <comment xml:lang="gl">ficheiro XZ</comment>
- <comment xml:lang="he">ארכיון XZ</comment>
- <comment xml:lang="hr">XZ arhiva</comment>
- <comment xml:lang="hu">XZ-archívum</comment>
- <comment xml:lang="ia">Archivo XZ</comment>
- <comment xml:lang="id">Arsip XZ</comment>
- <comment xml:lang="it">Archivio xz</comment>
- <comment xml:lang="ja">XZ アーカイブ</comment>
- <comment xml:lang="kk">XZ архиві</comment>
- <comment xml:lang="ko">XZ 압축 파일</comment>
- <comment xml:lang="lt">XZ archyvas</comment>
- <comment xml:lang="lv">XZ arhīvs</comment>
- <comment xml:lang="nl">XZ archief</comment>
- <comment xml:lang="oc">archiu XZ</comment>
- <comment xml:lang="pl">Archiwum XZ</comment>
- <comment xml:lang="pt">arquivo XZ</comment>
- <comment xml:lang="pt-BR">Pacote XZ</comment>
- <comment xml:lang="ro">Arhivă XZ</comment>
- <comment xml:lang="ru">Архив XZ</comment>
- <comment xml:lang="sk">Archív XZ</comment>
- <comment xml:lang="sl">Datoteka arhiva XZ</comment>
- <comment xml:lang="sr">ИксЗ архива</comment>
- <comment xml:lang="sv">XZ-arkiv</comment>
- <comment xml:lang="tr">XZ arşivi</comment>
+ <comment xml:lang="zh_TW">XZ 封存檔</comment>
+ <comment xml:lang="zh_CN">XZ 归档文件</comment>
<comment xml:lang="uk">архів XZ</comment>
- <comment xml:lang="zh-CN">XZ 归档文件</comment>
- <comment xml:lang="zh-TW">XZ 封存檔</comment>
+ <comment xml:lang="tr">XZ arşivi</comment>
+ <comment xml:lang="sv">XZ-arkiv</comment>
+ <comment xml:lang="sr">ИксЗ архива</comment>
+ <comment xml:lang="sq">arkiv XZ</comment>
+ <comment xml:lang="sl">Datoteka arhiva XZ</comment>
+ <comment xml:lang="si">XZ ලේඛනාගාරය</comment>
+ <comment xml:lang="sk">Archív XZ</comment>
+ <comment xml:lang="ru">Архив XZ</comment>
+ <comment xml:lang="ro">Arhivă XZ</comment>
+ <comment xml:lang="pt_BR">Pacote XZ</comment>
+ <comment xml:lang="pt">arquivo XZ</comment>
+ <comment xml:lang="pl">Archiwum XZ</comment>
+ <comment xml:lang="oc">archiu XZ</comment>
+ <comment xml:lang="nl">XZ archief</comment>
+ <comment xml:lang="lv">XZ arhīvs</comment>
+ <comment xml:lang="lt">XZ archyvas</comment>
+ <comment xml:lang="ko">XZ 압축 파일</comment>
+ <comment xml:lang="kk">XZ архиві</comment>
+ <comment xml:lang="ja">XZ アーカイブ</comment>
+ <comment xml:lang="it">Archivio xz</comment>
+ <comment xml:lang="is">XZ safnskrá</comment>
+ <comment xml:lang="id">Arsip XZ</comment>
+ <comment xml:lang="ia">Archivo XZ</comment>
+ <comment xml:lang="hu">XZ-archívum</comment>
+ <comment xml:lang="hr">XZ arhiva</comment>
+ <comment xml:lang="he">ארכיון XZ</comment>
+ <comment xml:lang="gl">ficheiro XZ</comment>
+ <comment xml:lang="ga">cartlann XZ</comment>
+ <comment xml:lang="fur">archivi XZ</comment>
+ <comment xml:lang="fr">archive XZ</comment>
+ <comment xml:lang="fo">XZ skjalasavn</comment>
+ <comment xml:lang="fi">XZ-arkisto</comment>
+ <comment xml:lang="eu">XZ artxiboa</comment>
+ <comment xml:lang="es">archivador XZ</comment>
+ <comment xml:lang="eo">XZ-arkivo</comment>
+ <comment xml:lang="en_GB">XZ archive</comment>
+ <comment xml:lang="el">Συμπιεσμένο αρχείο XZ</comment>
+ <comment xml:lang="de">XZ-Archiv</comment>
+ <comment xml:lang="da">XZ-arkiv</comment>
+ <comment xml:lang="cs">archiv XZ</comment>
+ <comment xml:lang="ca">arxiu XZ</comment>
+ <comment xml:lang="bg">Архив — XZ</comment>
+ <comment xml:lang="be">архіў XZ</comment>
+ <comment xml:lang="ar">أرشيف XZ</comment>
+ <comment xml:lang="af">XZ-argief</comment>
<generic-icon name="package-x-generic"/>
<magic priority="60">
<match type="string" value="\xfd\x37\x7a\x58\x5a\x00" offset="0"/>
@@ -22205,82 +23149,115 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-xz-compressed-tar">
<comment>Tar archive (XZ-compressed)</comment>
- <comment xml:lang="af">Tar-argief (XZ-saamgepers)</comment>
- <comment xml:lang="ar">أرشيف Tar (مضغوط-XZ)</comment>
- <comment xml:lang="bg">Архив — tar, компресиран с XZ</comment>
- <comment xml:lang="ca">arxiu tar (amb compressió XZ)</comment>
- <comment xml:lang="cs">archiv Tar (komprimovaný pomocí XZ)</comment>
- <comment xml:lang="da">Tar-arkiv (XZ-komprimeret)</comment>
- <comment xml:lang="de">Tar-Archiv (XZ-komprimiert)</comment>
- <comment xml:lang="el">Αρχείο Tar (συμπιεσμένο με XZ)</comment>
- <comment xml:lang="en-GB">Tar archive (XZ-compressed)</comment>
- <comment xml:lang="es">archivador Tar (comprimido con XZ)</comment>
- <comment xml:lang="eu">Tar artxiboa (XZ-rekin konprimitua)</comment>
- <comment xml:lang="fi">Tar-arkisto (XZ-pakattu)</comment>
- <comment xml:lang="fo">Tar skjalasavn(XZ-stappað)</comment>
- <comment xml:lang="fr">archive tar (compression XZ)</comment>
- <comment xml:lang="fur">archivi Tar (comprimût cun XZ)</comment>
- <comment xml:lang="ga">cartlann Tar (comhbhrúite le XZ)</comment>
- <comment xml:lang="gl">arquivo Tar (comprimido con XZ)</comment>
- <comment xml:lang="he">ארכיון Tar (מכווץ ע״י XZ)</comment>
- <comment xml:lang="hr">Tar arhiva ( XZ sažeta)</comment>
- <comment xml:lang="hu">Tar archívum (XZ tömörítésű)</comment>
- <comment xml:lang="ia">Archivo Tar (comprimite con XZ)</comment>
- <comment xml:lang="id">Arsip Tar (terkompresi XZ)</comment>
- <comment xml:lang="it">Archivio tar (compresso con XZ)</comment>
- <comment xml:lang="ja">Tar アーカイブ (XZ 圧縮)</comment>
- <comment xml:lang="kk">Tar архиві (XZ-мен сығылған)</comment>
- <comment xml:lang="ko">TAR 묶음 파일(XZ 압축)</comment>
- <comment xml:lang="lt">Tar archyvas (suglaudintas su XZ)</comment>
- <comment xml:lang="lv">Tar arhīvs (saspiests ar XZ)</comment>
- <comment xml:lang="nl">Tar archief (XZ-compressed)</comment>
- <comment xml:lang="oc">archiu tar (compression XZ)</comment>
- <comment xml:lang="pl">Archiwum tar (kompresja XZ)</comment>
- <comment xml:lang="pt">arquivo Tar (compressão XZ)</comment>
- <comment xml:lang="pt-BR">Pacote Tar (compactado com XZ)</comment>
- <comment xml:lang="ro">Arhivă Tar (comprimată XZ)</comment>
- <comment xml:lang="ru">Архив TAR (сжатый xz)</comment>
- <comment xml:lang="sk">Archív Tar (komprimovaný pomocou XZ)</comment>
- <comment xml:lang="sl">Datoteka arhiva Tar (stisnjen z XZ)</comment>
- <comment xml:lang="sr">Тар архива (запакована ИксЗ-ом)</comment>
- <comment xml:lang="sv">Tar-arkiv (XZ-komprimerat)</comment>
- <comment xml:lang="tr">Tar arşivi (XZ ile sıkıştırılmış)</comment>
+ <comment xml:lang="zh_TW">Tar 封存檔 (XZ 壓縮)</comment>
+ <comment xml:lang="zh_CN">Tar 归档文件(XZ 压缩)</comment>
<comment xml:lang="uk">архів tar (стиснений XZ)</comment>
- <comment xml:lang="zh-CN">Tar 归档文件(XZ 压缩)</comment>
- <comment xml:lang="zh-TW">Tar 封存檔 (XZ 壓縮)</comment>
+ <comment xml:lang="tr">Tar arşivi (XZ ile sıkıştırılmış)</comment>
+ <comment xml:lang="sv">Tar-arkiv (XZ-komprimerat)</comment>
+ <comment xml:lang="sr">Тар архива (запакована ИксЗ-ом)</comment>
+ <comment xml:lang="sq">arkiv tar (ngjeshur me XZ)</comment>
+ <comment xml:lang="sl">Datoteka arhiva Tar (stisnjen z XZ)</comment>
+ <comment xml:lang="si">තාර සංරක්ෂිතය (XZ-සම්පීඩිත)</comment>
+ <comment xml:lang="sk">Archív Tar (komprimovaný pomocou XZ)</comment>
+ <comment xml:lang="ru">Архив TAR (сжатый xz)</comment>
+ <comment xml:lang="ro">Arhivă Tar (comprimată XZ)</comment>
+ <comment xml:lang="pt_BR">Pacote Tar (compactado com XZ)</comment>
+ <comment xml:lang="pt">arquivo Tar (compressão XZ)</comment>
+ <comment xml:lang="pl">Archiwum tar (kompresja XZ)</comment>
+ <comment xml:lang="oc">archiu tar (compression XZ)</comment>
+ <comment xml:lang="nl">Tar archief (XZ-compressed)</comment>
+ <comment xml:lang="lv">Tar arhīvs (saspiests ar XZ)</comment>
+ <comment xml:lang="lt">Tar archyvas (suglaudintas su XZ)</comment>
+ <comment xml:lang="ko">TAR 묶음 파일(XZ 압축)</comment>
+ <comment xml:lang="kk">Tar архиві (XZ-мен сығылған)</comment>
+ <comment xml:lang="ja">Tar アーカイブ (XZ 圧縮)</comment>
+ <comment xml:lang="it">Archivio tar (compresso con XZ)</comment>
+ <comment xml:lang="is">Tar safnskrá (XZ-þjappað)</comment>
+ <comment xml:lang="id">Arsip Tar (terkompresi XZ)</comment>
+ <comment xml:lang="ia">Archivo Tar (comprimite con XZ)</comment>
+ <comment xml:lang="hu">Tar archívum (XZ tömörítésű)</comment>
+ <comment xml:lang="hr">Tar arhiva ( XZ sažeta)</comment>
+ <comment xml:lang="he">ארכיון Tar (מכווץ ע״י XZ)</comment>
+ <comment xml:lang="gl">arquivo Tar (comprimido con XZ)</comment>
+ <comment xml:lang="ga">cartlann Tar (comhbhrúite le XZ)</comment>
+ <comment xml:lang="fur">archivi Tar (comprimût cun XZ)</comment>
+ <comment xml:lang="fr">archive tar (compression XZ)</comment>
+ <comment xml:lang="fo">Tar skjalasavn(XZ-stappað)</comment>
+ <comment xml:lang="fi">Tar-arkisto (XZ-pakattu)</comment>
+ <comment xml:lang="eu">Tar artxiboa (XZ-rekin konprimitua)</comment>
+ <comment xml:lang="es">archivador TAR (comprimido con XZ)</comment>
+ <comment xml:lang="en_GB">Tar archive (XZ-compressed)</comment>
+ <comment xml:lang="el">Αρχείο Tar (συμπιεσμένο με XZ)</comment>
+ <comment xml:lang="de">Tar-Archiv (XZ-komprimiert)</comment>
+ <comment xml:lang="da">Tar-arkiv (XZ-komprimeret)</comment>
+ <comment xml:lang="cs">archiv Tar (komprimovaný pomocí XZ)</comment>
+ <comment xml:lang="ca">arxiu tar (amb compressió XZ)</comment>
+ <comment xml:lang="bg">Архив — tar, компресиран с XZ</comment>
+ <comment xml:lang="be">архіў tar (сцісканне XZ)</comment>
+ <comment xml:lang="ar">أرشيف Tar (مضغوط-XZ)</comment>
+ <comment xml:lang="af">Tar-argief (XZ-saamgepers)</comment>
<sub-class-of type="application/x-xz"/>
<generic-icon name="package-x-generic"/>
<glob pattern="*.tar.xz"/>
<glob pattern="*.txz"/>
</mime-type>
+ <mime-type type="application/x-zpaq">
+ <comment>Zpaq Archive</comment>
+ <comment xml:lang="uk">архів zpaq</comment>
+ <comment xml:lang="sv">Zpaq-arkiv</comment>
+ <comment xml:lang="ru">Архив zpaq</comment>
+ <comment xml:lang="pl">Archiwum ZPAQ</comment>
+ <comment xml:lang="it">Archivio zpaq</comment>
+ <comment xml:lang="gl">Arquivo Zpaq</comment>
+ <comment xml:lang="eu">Zpaq artxiboa</comment>
+ <comment xml:lang="es">archivador Zpaq</comment>
+ <comment xml:lang="de">Zpaq-Archiv</comment>
+ <comment xml:lang="be">архіў Zpaq</comment>
+ <generic-icon name="package-x-generic"/>
+ <magic>
+ <match type="string" value="7kSt" offset="0"/>
+ </magic>
+ <glob pattern="*.zpaq"/>
+ </mime-type>
<mime-type type="application/zstd">
<comment>Zstandard archive</comment>
- <comment xml:lang="bg">Архив — Zstandard</comment>
- <comment xml:lang="ca">arxiu Zstandard</comment>
- <comment xml:lang="cs">archiv Zstandard</comment>
- <comment xml:lang="da">Zstandard-arkiv</comment>
- <comment xml:lang="de">Zstandard-Archiv</comment>
- <comment xml:lang="en-GB">Zstandard archive</comment>
- <comment xml:lang="es">archivador Zstandard</comment>
- <comment xml:lang="eu">Zstandard archive</comment>
- <comment xml:lang="fi">Zstandard-arkisto</comment>
- <comment xml:lang="fr">archive Zstandard</comment>
- <comment xml:lang="fur">archivi Zstandard</comment>
- <comment xml:lang="hr">Zstandard arhiva</comment>
- <comment xml:lang="hu">Zstandard archívum</comment>
- <comment xml:lang="id">Arsip Zstandard</comment>
- <comment xml:lang="it">Archivio Zstandard</comment>
- <comment xml:lang="kk">Zstandard архиві</comment>
- <comment xml:lang="ko">Zstandard 압축 파일</comment>
- <comment xml:lang="pl">Archiwum Zstandard</comment>
- <comment xml:lang="pt-BR">Pacote Zstandard</comment>
- <comment xml:lang="ru">Архив Zstandard</comment>
- <comment xml:lang="sk">Archív Zstandard</comment>
- <comment xml:lang="sv">Zstandard-arkiv</comment>
- <comment xml:lang="tr">Zstandard arşivi</comment>
+ <comment xml:lang="zh_TW">Zstandard 封存檔</comment>
+ <comment xml:lang="zh_CN">Zstandard 归档文件</comment>
<comment xml:lang="uk">архів Zstandard</comment>
- <comment xml:lang="zh-CN">Zstandard 归档文件</comment>
- <comment xml:lang="zh-TW">Zstandard 封存檔</comment>
+ <comment xml:lang="tr">Zstandard arşivi</comment>
+ <comment xml:lang="sv">Zstandard-arkiv</comment>
+ <comment xml:lang="sq">arkiv Zstandard</comment>
+ <comment xml:lang="sl">Arhiv Zstandard</comment>
+ <comment xml:lang="si">Zstandard ලේඛනාගාරය</comment>
+ <comment xml:lang="sk">Archív Zstandard</comment>
+ <comment xml:lang="ru">Архив Zstandard</comment>
+ <comment xml:lang="pt_BR">Pacote Zstandard</comment>
+ <comment xml:lang="pl">Archiwum Zstandard</comment>
+ <comment xml:lang="oc">archiu Zstandard</comment>
+ <comment xml:lang="nl">Zstandard-archief</comment>
+ <comment xml:lang="ko">Zstandard 압축 파일</comment>
+ <comment xml:lang="kk">Zstandard архиві</comment>
+ <comment xml:lang="ja">Zstandard アーカイブ</comment>
+ <comment xml:lang="it">Archivio Zstandard</comment>
+ <comment xml:lang="is">Zstandard safnskrá</comment>
+ <comment xml:lang="id">Arsip Zstandard</comment>
+ <comment xml:lang="hu">Zstandard archívum</comment>
+ <comment xml:lang="hr">Zstandard arhiva</comment>
+ <comment xml:lang="he">ארכיון Zstandard</comment>
+ <comment xml:lang="gl">Arquivo de Zstandard</comment>
+ <comment xml:lang="fur">archivi Zstandard</comment>
+ <comment xml:lang="fr">archive Zstandard</comment>
+ <comment xml:lang="fi">Zstandard-arkisto</comment>
+ <comment xml:lang="eu">Zstandard archive</comment>
+ <comment xml:lang="es">archivador Zstandard</comment>
+ <comment xml:lang="en_GB">Zstandard archive</comment>
+ <comment xml:lang="de">Zstandard-Archiv</comment>
+ <comment xml:lang="da">Zstandard-arkiv</comment>
+ <comment xml:lang="cs">archiv Zstandard</comment>
+ <comment xml:lang="ca">arxiu Zstandard</comment>
+ <comment xml:lang="bg">Архив — Zstandard</comment>
+ <comment xml:lang="be">архіў Zstandard</comment>
+ <comment xml:lang="ar">أرشيف Zstandard</comment>
<generic-icon name="package-x-generic"/>
<magic priority="60">
<match type="little32" value="0xFD2FB528" offset="0"/>
@@ -22289,31 +23266,42 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-zstd-compressed-tar">
<comment>Tar archive (Zstandard-compressed)</comment>
- <comment xml:lang="bg">Архив — tar, компресиран със Zstandard</comment>
- <comment xml:lang="ca">arxiu tar (amb compressió Zstandard)</comment>
- <comment xml:lang="cs">archiv Tar (komprimovaný pomocí Zstandard)</comment>
- <comment xml:lang="da">Tar-arkiv (Zstandard-komprimeret)</comment>
- <comment xml:lang="de">Tar-Archiv (Zstandard-komprimiert)</comment>
- <comment xml:lang="en-GB">Tar archive (Zstandard-compressed)</comment>
- <comment xml:lang="es">archivador Tar (comprimido con Zstandard)</comment>
- <comment xml:lang="eu">Tar artxiboa (Zstandard-rekin konprimitua)</comment>
- <comment xml:lang="fi">Tar-arkisto (Zstandard-pakattu)</comment>
- <comment xml:lang="fr">archive tar (compression Zstandard)</comment>
- <comment xml:lang="fur">archivi Tar (comprimût cun Zstandard)</comment>
- <comment xml:lang="hr">Tar arhiva (Zstandard-sažeta)</comment>
- <comment xml:lang="hu">Tar archívum (Zstandard tömörítésű)</comment>
- <comment xml:lang="id">Arsip Tar (terkompresi Zstandard)</comment>
- <comment xml:lang="it">Archivio tar (compresso con Zstandard)</comment>
- <comment xml:lang="kk">Tar архиві (Zstandard-пен сығылған)</comment>
- <comment xml:lang="ko">TAR 묶음 파일(Zstandard 압축)</comment>
- <comment xml:lang="pl">Archiwum tar (kompresja Zstandard)</comment>
- <comment xml:lang="pt-BR">Pacote Tar (compactado com Zstandard)</comment>
- <comment xml:lang="ru">Архив TAR (сжатый zstandard)</comment>
- <comment xml:lang="sv">Tar-arkiv (Zstandard-komprimerat)</comment>
- <comment xml:lang="tr">Tar arşivi (Zstandard ile sıkıştırılmış)</comment>
+ <comment xml:lang="zh_TW">Tar 封存檔 (Zstandard 壓縮)</comment>
+ <comment xml:lang="zh_CN">Tar 归档文件(Zstandard 压缩)</comment>
<comment xml:lang="uk">архів tar archive (стиснений Zstandard)</comment>
- <comment xml:lang="zh-CN">Tar 归档文件(Zstandard 压缩)</comment>
- <comment xml:lang="zh-TW">Tar 封存檔 (Zstandard 壓縮)</comment>
+ <comment xml:lang="tr">Tar arşivi (Zstandard ile sıkıştırılmış)</comment>
+ <comment xml:lang="sv">Tar-arkiv (Zstandard-komprimerat)</comment>
+ <comment xml:lang="sq">arkiv tar (ngjeshur me Zstandard)</comment>
+ <comment xml:lang="sl">Arhiv tar (stisnjen, Zstandard)</comment>
+ <comment xml:lang="si">තාර සංරක්ෂිතය (Zstandard-compressed)</comment>
+ <comment xml:lang="ru">Архив TAR (сжатый zstandard)</comment>
+ <comment xml:lang="pt_BR">Pacote Tar (compactado com Zstandard)</comment>
+ <comment xml:lang="pl">Archiwum tar (kompresja Zstandard)</comment>
+ <comment xml:lang="oc">archiu Tar (compressat amb Zstandard)</comment>
+ <comment xml:lang="nl">Tar-archief (gecomprimeerd met Zstandard)</comment>
+ <comment xml:lang="ko">TAR 묶음 파일(Zstandard 압축)</comment>
+ <comment xml:lang="kk">Tar архиві (Zstandard-пен сығылған)</comment>
+ <comment xml:lang="ja">Tar アーカイブ (ZStandard 圧縮)</comment>
+ <comment xml:lang="it">Archivio tar (compresso con Zstandard)</comment>
+ <comment xml:lang="is">Tar safnskrá (Zstandard þjappað)</comment>
+ <comment xml:lang="id">Arsip Tar (terkompresi Zstandard)</comment>
+ <comment xml:lang="hu">Tar archívum (Zstandard tömörítésű)</comment>
+ <comment xml:lang="hr">Tar arhiva (Zstandard-sažeta)</comment>
+ <comment xml:lang="he">ארכיון Tar (מכווץ ע״י Zstandard)</comment>
+ <comment xml:lang="gl">Arquivo Tar (comprimido Zstandard)</comment>
+ <comment xml:lang="fur">archivi Tar (comprimût cun Zstandard)</comment>
+ <comment xml:lang="fr">archive tar (compression Zstandard)</comment>
+ <comment xml:lang="fi">Tar-arkisto (Zstandard-pakattu)</comment>
+ <comment xml:lang="eu">Tar artxiboa (Zstandard-rekin konprimitua)</comment>
+ <comment xml:lang="es">archivador TAR (comprimido con Zstandard)</comment>
+ <comment xml:lang="en_GB">Tar archive (Zstandard-compressed)</comment>
+ <comment xml:lang="de">Tar-Archiv (Zstandard-komprimiert)</comment>
+ <comment xml:lang="da">Tar-arkiv (Zstandard-komprimeret)</comment>
+ <comment xml:lang="cs">archiv Tar (komprimovaný pomocí Zstandard)</comment>
+ <comment xml:lang="ca">arxiu tar (amb compressió Zstandard)</comment>
+ <comment xml:lang="bg">Архив — tar, компресиран със Zstandard</comment>
+ <comment xml:lang="be">архіў tar (сцісканне Zstandard)</comment>
+ <comment xml:lang="ar">أرشيف Tar (مضغوط-Zstandard)</comment>
<generic-icon name="package-x-generic"/>
<sub-class-of type="application/zstd"/>
<glob pattern="*.tar.zst"/>
@@ -22321,448 +23309,448 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-xzpdf">
<comment>PDF document (XZ-compressed)</comment>
- <comment xml:lang="af">PDF-dokument (XZ-saamgepers)</comment>
- <comment xml:lang="ast">Documentu PDF (comprimíu en XZ)</comment>
- <comment xml:lang="bg">Документ — PDF, компресиран с XZ</comment>
- <comment xml:lang="ca">document PDF (amb compressió XZ)</comment>
- <comment xml:lang="cs">dokument PDF (komprimovaný pomocí XZ)</comment>
- <comment xml:lang="da">PDF-dokument (XZ-komprimeret)</comment>
- <comment xml:lang="de">PDF-Dokument (XZ-komprimiert)</comment>
- <comment xml:lang="el">Έγγραφο PDF (συμπιεσμένο με XZ)</comment>
- <comment xml:lang="en-GB">PDF document (XZ-compressed)</comment>
- <comment xml:lang="es">documento PDF (comprimido con XZ)</comment>
- <comment xml:lang="eu">PDF dokumentua (XZ-rekin konprimitua)</comment>
- <comment xml:lang="fi">PDF-asiakirja (XZ-pakattu)</comment>
- <comment xml:lang="fr">document PDF (compressé XZ)</comment>
- <comment xml:lang="fur">document PDF (comprimût cun XZ)</comment>
- <comment xml:lang="ga">cáipéis PDF (comhbhrúite le XZ)</comment>
- <comment xml:lang="gl">documento PDF (comprimido en XZ)</comment>
- <comment xml:lang="he">מסמך PDF (מכווץ ע״י XZ)</comment>
- <comment xml:lang="hr">PDF dokument ( XZ sažet)</comment>
- <comment xml:lang="hu">PDF dokumentum (XZ tömörítésű)</comment>
- <comment xml:lang="ia">Documento PDF (comprimite con XZ)</comment>
- <comment xml:lang="id">Dokumen PDF (terkompresi XZ)</comment>
- <comment xml:lang="it">Documento PDF (compresso con XZ)</comment>
- <comment xml:lang="ja">PDF 文書(XZ 圧縮)</comment>
- <comment xml:lang="ka">PDF დოკუმენტი (XZ-ით შეკუმშული)</comment>
- <comment xml:lang="kk">PDF құжаты (XZ-мен сығылған)</comment>
- <comment xml:lang="ko">PDF 문서(XZ 압축)</comment>
- <comment xml:lang="lv">PDF dokuments (saspiests ar XZ)</comment>
- <comment xml:lang="nl">PDF document (XZ-compressed)</comment>
- <comment xml:lang="oc">document PDF (compressat XZ)</comment>
- <comment xml:lang="pl">Dokument PDF (kompresja XZ)</comment>
- <comment xml:lang="pt">documento PDF (compressão XZ)</comment>
- <comment xml:lang="pt-BR">Documento PDF (compactado com XZ)</comment>
- <comment xml:lang="ru">Документ PDF (сжатый xz)</comment>
- <comment xml:lang="sk">Dokument PDF (komprimovaný pomocou XZ)</comment>
- <comment xml:lang="sl">Dokument PDF (XZ-stisnjen)</comment>
- <comment xml:lang="sr">ПДФ документ (запакован ИксЗ-ом)</comment>
- <comment xml:lang="sv">PDF-dokument (XZ-komprimerat)</comment>
- <comment xml:lang="tr">PDF belgesi (XZ ile sıkıştırılmış)</comment>
+ <comment xml:lang="zh_TW">PDF 文件 (XZ 壓縮)</comment>
+ <comment xml:lang="zh_CN">PDF 文档(XZ)</comment>
<comment xml:lang="uk">документ PDF (стиснений xz)</comment>
- <comment xml:lang="zh-CN">PDF 文档(XZ)</comment>
- <comment xml:lang="zh-TW">PDF 文件 (XZ 壓縮)</comment>
+ <comment xml:lang="tr">PDF belgesi (XZ ile sıkıştırılmış)</comment>
+ <comment xml:lang="sv">PDF-dokument (XZ-komprimerat)</comment>
+ <comment xml:lang="sr">ПДФ документ (запакован ИксЗ-ом)</comment>
+ <comment xml:lang="sq">dokument PDF (ngjeshur me XZ)</comment>
+ <comment xml:lang="sl">Dokument PDF (XZ-stisnjen)</comment>
+ <comment xml:lang="si">PDF ලේඛනය (XZ-සම්පීඩිත)</comment>
+ <comment xml:lang="sk">Dokument PDF (komprimovaný pomocou XZ)</comment>
+ <comment xml:lang="ru">Документ PDF (сжатый xz)</comment>
+ <comment xml:lang="pt_BR">Documento PDF (compactado com XZ)</comment>
+ <comment xml:lang="pt">documento PDF (compressão XZ)</comment>
+ <comment xml:lang="pl">Dokument PDF (kompresja XZ)</comment>
+ <comment xml:lang="oc">document PDF (compressat XZ)</comment>
+ <comment xml:lang="nl">PDF document (XZ-compressed)</comment>
+ <comment xml:lang="lv">PDF dokuments (saspiests ar XZ)</comment>
+ <comment xml:lang="ko">PDF 문서(XZ 압축)</comment>
+ <comment xml:lang="kk">PDF құжаты (XZ-мен сығылған)</comment>
+ <comment xml:lang="ka">PDF დოკუმენტი (XZ-ით შეკუმშული)</comment>
+ <comment xml:lang="ja">PDF 文書(XZ 圧縮)</comment>
+ <comment xml:lang="it">Documento PDF (compresso con XZ)</comment>
+ <comment xml:lang="is">PDF skjal (XZ-þjappað)</comment>
+ <comment xml:lang="id">Dokumen PDF (terkompresi XZ)</comment>
+ <comment xml:lang="ia">Documento PDF (comprimite con XZ)</comment>
+ <comment xml:lang="hu">PDF dokumentum (XZ tömörítésű)</comment>
+ <comment xml:lang="hr">PDF dokument ( XZ sažet)</comment>
+ <comment xml:lang="he">מסמך PDF (מכווץ ע״י XZ)</comment>
+ <comment xml:lang="gl">documento PDF (comprimido en XZ)</comment>
+ <comment xml:lang="ga">cáipéis PDF (comhbhrúite le XZ)</comment>
+ <comment xml:lang="fur">document PDF (comprimût cun XZ)</comment>
+ <comment xml:lang="fr">document PDF (compressé XZ)</comment>
+ <comment xml:lang="fi">PDF-asiakirja (XZ-pakattu)</comment>
+ <comment xml:lang="eu">PDF dokumentua (XZ-rekin konprimitua)</comment>
+ <comment xml:lang="es">documento PDF (comprimido con XZ)</comment>
+ <comment xml:lang="en_GB">PDF document (XZ-compressed)</comment>
+ <comment xml:lang="el">Έγγραφο PDF (συμπιεσμένο με XZ)</comment>
+ <comment xml:lang="de">PDF-Dokument (XZ-komprimiert)</comment>
+ <comment xml:lang="da">PDF-dokument (XZ-komprimeret)</comment>
+ <comment xml:lang="cs">dokument PDF (komprimovaný pomocí XZ)</comment>
+ <comment xml:lang="ca">document PDF (amb compressió XZ)</comment>
+ <comment xml:lang="bg">Документ — PDF, компресиран с XZ</comment>
+ <comment xml:lang="be">дакумент PDF (сцісканне XZ)</comment>
+ <comment xml:lang="ast">Documentu PDF (comprimíu en XZ)</comment>
+ <comment xml:lang="ar">مستند PDF (مضغوط-XZ)</comment>
+ <comment xml:lang="af">PDF-dokument (XZ-saamgepers)</comment>
<sub-class-of type="application/x-xz"/>
<generic-icon name="x-office-document"/>
<glob pattern="*.pdf.xz"/>
</mime-type>
<mime-type type="application/x-ustar">
<comment>Ustar archive</comment>
- <comment xml:lang="af">Ustar-argief</comment>
- <comment xml:lang="ar">أرشيف Ustar</comment>
- <comment xml:lang="be-Latn">Archiŭ ustar</comment>
- <comment xml:lang="bg">Архив — ustar</comment>
- <comment xml:lang="ca">arxiu ustar</comment>
- <comment xml:lang="cs">archiv Ustar</comment>
- <comment xml:lang="da">Ustar-arkiv</comment>
- <comment xml:lang="de">Ustar-Archiv</comment>
- <comment xml:lang="el">Συμπιεσμένο αρχείο Ustar</comment>
- <comment xml:lang="en-GB">Ustar archive</comment>
- <comment xml:lang="eo">Ustar-arkivo</comment>
- <comment xml:lang="es">archivador de Ustar</comment>
- <comment xml:lang="eu">Ustar artxiboa</comment>
- <comment xml:lang="fi">Ustar-arkisto</comment>
- <comment xml:lang="fo">Ustar skjalasavn</comment>
- <comment xml:lang="fr">archive Ustar</comment>
- <comment xml:lang="fur">archivi Ustar</comment>
- <comment xml:lang="ga">cartlann Ustar</comment>
- <comment xml:lang="gl">arquivo Ustar</comment>
- <comment xml:lang="he">ארכיון Ustar</comment>
- <comment xml:lang="hr">Ustar arhiva</comment>
- <comment xml:lang="hu">Ustar archívum</comment>
- <comment xml:lang="ia">Archivo Ustar</comment>
- <comment xml:lang="id">Arsip Ustar</comment>
- <comment xml:lang="it">Archivio ustar</comment>
- <comment xml:lang="ja">Ustar アーカイブ</comment>
- <comment xml:lang="kk">Ustar архиві</comment>
- <comment xml:lang="ko">Ustar 압축 파일</comment>
- <comment xml:lang="lt">Ustar archyvas</comment>
- <comment xml:lang="lv">Ustar arhīvs</comment>
- <comment xml:lang="nb">Ustar-arkiv</comment>
- <comment xml:lang="nl">Ustar-archief</comment>
- <comment xml:lang="nn">Ustar-arkiv</comment>
- <comment xml:lang="oc">archiu Ustar</comment>
- <comment xml:lang="pl">Archiwum ustar</comment>
- <comment xml:lang="pt">arquivo Ustar</comment>
- <comment xml:lang="pt-BR">Pacote Ustar</comment>
- <comment xml:lang="ro">Arhivă Ustar</comment>
- <comment xml:lang="ru">Архив Ustar</comment>
- <comment xml:lang="sk">Archív Ustar</comment>
- <comment xml:lang="sl">Datoteka arhiva Ustar</comment>
- <comment xml:lang="sq">Arkiv Ustar</comment>
- <comment xml:lang="sr">Устар архива</comment>
- <comment xml:lang="sv">Ustar-arkiv</comment>
- <comment xml:lang="tr">Ustar arşivi</comment>
- <comment xml:lang="uk">архів ustar</comment>
+ <comment xml:lang="zh_TW">Ustar 封存檔</comment>
+ <comment xml:lang="zh_CN">Ustar 归档文件</comment>
<comment xml:lang="vi">Kho nén ustar</comment>
- <comment xml:lang="zh-CN">Ustar 归档文件</comment>
- <comment xml:lang="zh-TW">Ustar 封存檔</comment>
+ <comment xml:lang="uk">архів ustar</comment>
+ <comment xml:lang="tr">Ustar arşivi</comment>
+ <comment xml:lang="sv">Ustar-arkiv</comment>
+ <comment xml:lang="sr">Устар архива</comment>
+ <comment xml:lang="sq">arkiv Ustar</comment>
+ <comment xml:lang="sl">Datoteka arhiva Ustar</comment>
+ <comment xml:lang="si">Ustar ලේඛනාගාරය</comment>
+ <comment xml:lang="sk">Archív Ustar</comment>
+ <comment xml:lang="ru">Архив Ustar</comment>
+ <comment xml:lang="ro">Arhivă Ustar</comment>
+ <comment xml:lang="pt_BR">Pacote Ustar</comment>
+ <comment xml:lang="pt">arquivo Ustar</comment>
+ <comment xml:lang="pl">Archiwum ustar</comment>
+ <comment xml:lang="oc">archiu Ustar</comment>
+ <comment xml:lang="nn">Ustar-arkiv</comment>
+ <comment xml:lang="nl">Ustar-archief</comment>
+ <comment xml:lang="nb">Ustar-arkiv</comment>
+ <comment xml:lang="lv">Ustar arhīvs</comment>
+ <comment xml:lang="lt">Ustar archyvas</comment>
+ <comment xml:lang="ko">Ustar 압축 파일</comment>
+ <comment xml:lang="kk">Ustar архиві</comment>
+ <comment xml:lang="ja">Ustar アーカイブ</comment>
+ <comment xml:lang="it">Archivio ustar</comment>
+ <comment xml:lang="is">Ustar safnskrá</comment>
+ <comment xml:lang="id">Arsip Ustar</comment>
+ <comment xml:lang="ia">Archivo Ustar</comment>
+ <comment xml:lang="hu">Ustar archívum</comment>
+ <comment xml:lang="hr">Ustar arhiva</comment>
+ <comment xml:lang="he">ארכיון Ustar</comment>
+ <comment xml:lang="gl">arquivo Ustar</comment>
+ <comment xml:lang="ga">cartlann Ustar</comment>
+ <comment xml:lang="fur">archivi Ustar</comment>
+ <comment xml:lang="fr">archive Ustar</comment>
+ <comment xml:lang="fo">Ustar skjalasavn</comment>
+ <comment xml:lang="fi">Ustar-arkisto</comment>
+ <comment xml:lang="eu">Ustar artxiboa</comment>
+ <comment xml:lang="es">archivador de Ustar</comment>
+ <comment xml:lang="eo">Ustar-arkivo</comment>
+ <comment xml:lang="en_GB">Ustar archive</comment>
+ <comment xml:lang="el">Συμπιεσμένο αρχείο Ustar</comment>
+ <comment xml:lang="de">Ustar-Archiv</comment>
+ <comment xml:lang="da">Ustar-arkiv</comment>
+ <comment xml:lang="cs">archiv Ustar</comment>
+ <comment xml:lang="ca">arxiu ustar</comment>
+ <comment xml:lang="bg">Архив — ustar</comment>
+ <comment xml:lang="be@latin">Archiŭ ustar</comment>
+ <comment xml:lang="be">архіў ustar</comment>
+ <comment xml:lang="ar">أرشيف Ustar</comment>
+ <comment xml:lang="af">Ustar-argief</comment>
<generic-icon name="package-x-generic"/>
<glob pattern="*.ustar"/>
</mime-type>
<mime-type type="application/x-wais-source">
<comment>WAIS source code</comment>
- <comment xml:lang="af">WAIS-bronkode</comment>
- <comment xml:lang="ar">شفرة مصدر WAIS</comment>
- <comment xml:lang="az">WAIS mənbə faylı</comment>
- <comment xml:lang="be-Latn">Kryničny kod WAIS</comment>
- <comment xml:lang="bg">Изходен код — WAIS</comment>
- <comment xml:lang="ca">codi font en WAIS</comment>
- <comment xml:lang="cs">zdrojový kód WAIS</comment>
- <comment xml:lang="cy">Ffynhonnell Rhaglen WAIS</comment>
- <comment xml:lang="da">WAIS-kildekode</comment>
- <comment xml:lang="de">WAIS-Quelltext</comment>
- <comment xml:lang="el">Πηγαίος κώδικας WAIS</comment>
- <comment xml:lang="en-GB">WAIS source code</comment>
- <comment xml:lang="eo">WAIS-fontkodo</comment>
- <comment xml:lang="es">código fuente en WAIS</comment>
- <comment xml:lang="eu">WAIS iturburu-kodea</comment>
- <comment xml:lang="fi">WAIS-lähdekoodi</comment>
- <comment xml:lang="fo">WAIS keldukota</comment>
- <comment xml:lang="fr">code source WAIS</comment>
- <comment xml:lang="fur">codiç sorzint WAIS</comment>
- <comment xml:lang="ga">cód foinseach WAIS</comment>
- <comment xml:lang="gl">código fonte WAIS</comment>
- <comment xml:lang="he">קוד מקור של WAIS</comment>
- <comment xml:lang="hr">WAIS izvorni kôd</comment>
- <comment xml:lang="hu">WAIS-forráskód</comment>
- <comment xml:lang="ia">Codice-fonte WAIS</comment>
- <comment xml:lang="id">Kode program WAIS</comment>
- <comment xml:lang="it">Codice sorgente WAIS</comment>
- <comment xml:lang="ja">WAIS ソースコード</comment>
- <comment xml:lang="kk">WAIS бастапқы коды</comment>
- <comment xml:lang="ko">WAIS 소스 코드</comment>
- <comment xml:lang="lt">WAIS pradinis kodas</comment>
- <comment xml:lang="lv">WAIS pirmkods</comment>
- <comment xml:lang="ms">Kod sumber WAIS</comment>
- <comment xml:lang="nb">WAIS-kildekode</comment>
- <comment xml:lang="nl">WAIS-broncode</comment>
- <comment xml:lang="nn">WAIS-kjeldekode</comment>
- <comment xml:lang="oc">còde font WAIS</comment>
- <comment xml:lang="pl">Kod źródłowy WAIS</comment>
- <comment xml:lang="pt">código origem WAIS</comment>
- <comment xml:lang="pt-BR">Código-fonte WAIS</comment>
- <comment xml:lang="ro">Cod sursă WAIS</comment>
- <comment xml:lang="ru">Исходный код WAIS</comment>
- <comment xml:lang="sk">Zdrojový kód WAIS</comment>
- <comment xml:lang="sl">Datoteka izvorne kode WAIS</comment>
- <comment xml:lang="sq">Kod burues WAIS</comment>
- <comment xml:lang="sr">ВАИС изворни ко̂д</comment>
- <comment xml:lang="sv">WAIS-källkod</comment>
- <comment xml:lang="tr">WAIS kaynak kodu</comment>
- <comment xml:lang="uk">вихідний код мовою WAIS</comment>
+ <comment xml:lang="zh_TW">WAIS 源碼</comment>
+ <comment xml:lang="zh_CN">WAIS 源代码</comment>
<comment xml:lang="vi">Mã nguồn WAIS</comment>
- <comment xml:lang="zh-CN">WAIS 源代码</comment>
- <comment xml:lang="zh-TW">WAIS 源碼</comment>
+ <comment xml:lang="uk">початковий код мовою WAIS</comment>
+ <comment xml:lang="tr">WAIS kaynak kodu</comment>
+ <comment xml:lang="sv">WAIS-källkod</comment>
+ <comment xml:lang="sr">ВАИС изворни ко̂д</comment>
+ <comment xml:lang="sq">kod burim WAIS</comment>
+ <comment xml:lang="sl">Datoteka izvorne kode WAIS</comment>
+ <comment xml:lang="si">WAIS මූල කේතය</comment>
+ <comment xml:lang="sk">Zdrojový kód WAIS</comment>
+ <comment xml:lang="ru">Исходный код WAIS</comment>
+ <comment xml:lang="ro">Cod sursă WAIS</comment>
+ <comment xml:lang="pt_BR">Código-fonte WAIS</comment>
+ <comment xml:lang="pt">código origem WAIS</comment>
+ <comment xml:lang="pl">Kod źródłowy WAIS</comment>
+ <comment xml:lang="oc">còde font WAIS</comment>
+ <comment xml:lang="nn">WAIS-kjeldekode</comment>
+ <comment xml:lang="nl">WAIS-broncode</comment>
+ <comment xml:lang="nb">WAIS-kildekode</comment>
+ <comment xml:lang="ms">Kod sumber WAIS</comment>
+ <comment xml:lang="lv">WAIS pirmkods</comment>
+ <comment xml:lang="lt">WAIS pradinis kodas</comment>
+ <comment xml:lang="ko">WAIS 소스 코드</comment>
+ <comment xml:lang="kk">WAIS бастапқы коды</comment>
+ <comment xml:lang="ja">WAIS ソースコード</comment>
+ <comment xml:lang="it">Codice sorgente WAIS</comment>
+ <comment xml:lang="is">WAIS frumkóði</comment>
+ <comment xml:lang="id">Kode program WAIS</comment>
+ <comment xml:lang="ia">Codice-fonte WAIS</comment>
+ <comment xml:lang="hu">WAIS-forráskód</comment>
+ <comment xml:lang="hr">WAIS izvorni kôd</comment>
+ <comment xml:lang="he">קוד מקור של WAIS</comment>
+ <comment xml:lang="gl">código fonte WAIS</comment>
+ <comment xml:lang="ga">cód foinseach WAIS</comment>
+ <comment xml:lang="fur">codiç sorzint WAIS</comment>
+ <comment xml:lang="fr">code source WAIS</comment>
+ <comment xml:lang="fo">WAIS keldukota</comment>
+ <comment xml:lang="fi">WAIS-lähdekoodi</comment>
+ <comment xml:lang="eu">WAIS iturburu-kodea</comment>
+ <comment xml:lang="es">código fuente en WAIS</comment>
+ <comment xml:lang="eo">WAIS-fontkodo</comment>
+ <comment xml:lang="en_GB">WAIS source code</comment>
+ <comment xml:lang="el">Πηγαίος κώδικας WAIS</comment>
+ <comment xml:lang="de">WAIS-Quelltext</comment>
+ <comment xml:lang="da">WAIS-kildekode</comment>
+ <comment xml:lang="cy">Ffynhonnell Rhaglen WAIS</comment>
+ <comment xml:lang="cs">zdrojový kód WAIS</comment>
+ <comment xml:lang="ca">codi font en WAIS</comment>
+ <comment xml:lang="bg">Изходен код — WAIS</comment>
+ <comment xml:lang="be@latin">Kryničny kod WAIS</comment>
+ <comment xml:lang="be">зыходны код WAIS</comment>
+ <comment xml:lang="az">WAIS mənbə faylı</comment>
+ <comment xml:lang="ar">شفرة مصدر WAIS</comment>
+ <comment xml:lang="af">WAIS-bronkode</comment>
<sub-class-of type="text/plain"/>
<generic-icon name="text-x-generic"/>
<glob pattern="*.src"/>
</mime-type>
<mime-type type="application/x-wpg">
<comment>WordPerfect/Drawperfect image</comment>
- <comment xml:lang="af">WordPerfect/Drawperfect-beeld</comment>
- <comment xml:lang="ar">صورة WordPerfect/Drawperfect</comment>
- <comment xml:lang="be-Latn">Vyjava WordPerfect/Drawperfect</comment>
- <comment xml:lang="bg">Изображение — WordPerfect/Drawperfect</comment>
- <comment xml:lang="ca">imatge de WordPerfect/Drawperfect</comment>
- <comment xml:lang="cs">obrázek WordPerfect/Drawperfect</comment>
- <comment xml:lang="da">WordPerfect/Drawperfect-billede</comment>
- <comment xml:lang="de">WordPerfect/DrawPerfect-Bild</comment>
- <comment xml:lang="el">Εικόνα WordPerfect/Drawperfect</comment>
- <comment xml:lang="en-GB">WordPerfect/Drawperfect image</comment>
- <comment xml:lang="eo">WordPerfect/Drawperfect-bildo</comment>
- <comment xml:lang="es">imagen de WordPerfect/Drawperfect</comment>
- <comment xml:lang="eu">WordPerfect/Drawperfect irudia</comment>
- <comment xml:lang="fi">WordPerfect/Drawperfect-kuva</comment>
- <comment xml:lang="fo">WordPerfect/Drawperfect mynd</comment>
- <comment xml:lang="fr">image WordPerfect/DrawPerfect</comment>
- <comment xml:lang="fur">imagjin WordPerfect/Drawperfect</comment>
- <comment xml:lang="ga">íomhá WordPerfect/Drawperfect</comment>
- <comment xml:lang="gl">imaxe de WordPerfect/DrawPerfect</comment>
- <comment xml:lang="he">תמונה של WordPerfect/Drawperfect</comment>
- <comment xml:lang="hr">WordPerfect/Drawperfect slika</comment>
- <comment xml:lang="hu">WordPerfect/Drawperfect-kép</comment>
- <comment xml:lang="ia">Imagine WordPerfect/DrawPerfect</comment>
- <comment xml:lang="id">Gambar WordPerfect/Drawperfect</comment>
- <comment xml:lang="it">Immagine WordPerfect/Drawperfect</comment>
- <comment xml:lang="ja">WordPerfect/Drawperfect 画像</comment>
- <comment xml:lang="kk">WordPerfect/Drawperfect суреті</comment>
- <comment xml:lang="ko">WordPerfect/Drawperfect 그림</comment>
- <comment xml:lang="lt">WordPerfect/Drawperfect paveikslėlis</comment>
- <comment xml:lang="lv">WordPerfect/Drawperfect attēls</comment>
- <comment xml:lang="ms">Imej WordPerfect/Drawperfect</comment>
- <comment xml:lang="nb">WordPerfect-/Drawperfect-bilde</comment>
- <comment xml:lang="nl">WordPerfect/Drawperfect-afbeelding</comment>
- <comment xml:lang="nn">WordPerfect/DrawPerfect-bilete</comment>
- <comment xml:lang="oc">imatge WordPerfect/DrawPerfect</comment>
- <comment xml:lang="pl">Obraz WordPerfect/DrawPerfect</comment>
- <comment xml:lang="pt">imagem do WordPerfect/Drawperfect</comment>
- <comment xml:lang="pt-BR">Imagem do WordPerfect/Drawperfect</comment>
- <comment xml:lang="ro">Imagine WordPerfect/Drawperfect</comment>
- <comment xml:lang="ru">Изображение WordPerfect/Drawperfect</comment>
- <comment xml:lang="sk">Obrázok WordPerfect/Drawperfect</comment>
- <comment xml:lang="sl">Slikovna datoteka Drawperfect</comment>
- <comment xml:lang="sq">Figurë WordPerfect/Drawperfect</comment>
- <comment xml:lang="sr">Ворд Перфект/Дров Перфект слика</comment>
- <comment xml:lang="sv">WordPerfect/Drawperfect-bild</comment>
- <comment xml:lang="tr">WordPerfect/DrawPerfect görüntüsü</comment>
- <comment xml:lang="uk">зображення WordPerfect/Drawperfect</comment>
+ <comment xml:lang="zh_TW">WordPerfect/Drawperfect 影像</comment>
+ <comment xml:lang="zh_CN">WordPerfect/Drawperfect 图像</comment>
<comment xml:lang="vi">Ảnh WordPerfect/Drawperfect</comment>
- <comment xml:lang="zh-CN">WordPerfect/Drawperfect 图像</comment>
- <comment xml:lang="zh-TW">WordPerfect/Drawperfect 影像</comment>
+ <comment xml:lang="uk">зображення WordPerfect/Drawperfect</comment>
+ <comment xml:lang="tr">WordPerfect/DrawPerfect görüntüsü</comment>
+ <comment xml:lang="sv">WordPerfect/Drawperfect-bild</comment>
+ <comment xml:lang="sr">Ворд Перфект/Дров Перфект слика</comment>
+ <comment xml:lang="sq">figurë WordPerfect/Drawperfect</comment>
+ <comment xml:lang="sl">Slikovna datoteka Drawperfect</comment>
+ <comment xml:lang="si">WordPerfect/Drawperfect රූපය</comment>
+ <comment xml:lang="sk">Obrázok WordPerfect/Drawperfect</comment>
+ <comment xml:lang="ru">Изображение WordPerfect/Drawperfect</comment>
+ <comment xml:lang="ro">Imagine WordPerfect/Drawperfect</comment>
+ <comment xml:lang="pt_BR">Imagem do WordPerfect/Drawperfect</comment>
+ <comment xml:lang="pt">imagem do WordPerfect/Drawperfect</comment>
+ <comment xml:lang="pl">Obraz WordPerfect/DrawPerfect</comment>
+ <comment xml:lang="oc">imatge WordPerfect/DrawPerfect</comment>
+ <comment xml:lang="nn">WordPerfect/DrawPerfect-bilete</comment>
+ <comment xml:lang="nl">WordPerfect/Drawperfect-afbeelding</comment>
+ <comment xml:lang="nb">WordPerfect-/Drawperfect-bilde</comment>
+ <comment xml:lang="ms">Imej WordPerfect/Drawperfect</comment>
+ <comment xml:lang="lv">WordPerfect/Drawperfect attēls</comment>
+ <comment xml:lang="lt">WordPerfect/Drawperfect paveikslėlis</comment>
+ <comment xml:lang="ko">WordPerfect/Drawperfect 그림</comment>
+ <comment xml:lang="kk">WordPerfect/Drawperfect суреті</comment>
+ <comment xml:lang="ja">WordPerfect/Drawperfect 画像</comment>
+ <comment xml:lang="it">Immagine WordPerfect/Drawperfect</comment>
+ <comment xml:lang="is">WordPerfect/Drawperfect mynd</comment>
+ <comment xml:lang="id">Gambar WordPerfect/Drawperfect</comment>
+ <comment xml:lang="ia">Imagine WordPerfect/DrawPerfect</comment>
+ <comment xml:lang="hu">WordPerfect/Drawperfect-kép</comment>
+ <comment xml:lang="hr">WordPerfect/Drawperfect slika</comment>
+ <comment xml:lang="he">תמונה של WordPerfect/Drawperfect</comment>
+ <comment xml:lang="gl">imaxe de WordPerfect/DrawPerfect</comment>
+ <comment xml:lang="ga">íomhá WordPerfect/Drawperfect</comment>
+ <comment xml:lang="fur">imagjin WordPerfect/Drawperfect</comment>
+ <comment xml:lang="fr">image WordPerfect/DrawPerfect</comment>
+ <comment xml:lang="fo">WordPerfect/Drawperfect mynd</comment>
+ <comment xml:lang="fi">WordPerfect/Drawperfect-kuva</comment>
+ <comment xml:lang="eu">WordPerfect/Drawperfect irudia</comment>
+ <comment xml:lang="es">imagen de WordPerfect/Drawperfect</comment>
+ <comment xml:lang="eo">WordPerfect/Drawperfect-bildo</comment>
+ <comment xml:lang="en_GB">WordPerfect/Drawperfect image</comment>
+ <comment xml:lang="el">Εικόνα WordPerfect/Drawperfect</comment>
+ <comment xml:lang="de">WordPerfect/DrawPerfect-Bild</comment>
+ <comment xml:lang="da">WordPerfect/Drawperfect-billede</comment>
+ <comment xml:lang="cs">obrázek WordPerfect/Drawperfect</comment>
+ <comment xml:lang="ca">imatge de WordPerfect/Drawperfect</comment>
+ <comment xml:lang="bg">Изображение — WordPerfect/Drawperfect</comment>
+ <comment xml:lang="be@latin">Vyjava WordPerfect/Drawperfect</comment>
+ <comment xml:lang="be">выява WordPerfect/Drawperfect</comment>
+ <comment xml:lang="ar">صورة WordPerfect/Drawperfect</comment>
+ <comment xml:lang="af">WordPerfect/Drawperfect-beeld</comment>
<generic-icon name="image-x-generic"/>
<glob pattern="*.wpg"/>
</mime-type>
<mime-type type="application/x-wonderswan-rom">
<comment>Bandai WonderSwan ROM</comment>
- <comment xml:lang="bg">ROM — Bandai WonderSwan</comment>
- <comment xml:lang="ca">ROM de Bandai WonderSwan</comment>
- <comment xml:lang="cs">ROM pro Bandai WonderSwan</comment>
- <comment xml:lang="da">Bandai WonderSwan-ROM</comment>
- <comment xml:lang="de">Bandai WonderSwan ROM</comment>
- <comment xml:lang="en-GB">Bandai WonderSwan ROM</comment>
- <comment xml:lang="es">ROM de Bandai WonderSwan</comment>
- <comment xml:lang="eu">Bandai WonderSwan ROM</comment>
- <comment xml:lang="fi">Bandai WonderSwan ROM</comment>
- <comment xml:lang="fr">ROM Bandai WonderSwan</comment>
- <comment xml:lang="fur">ROM Bandai WonderSwan</comment>
- <comment xml:lang="ga">ROM Bandai WonderSwan</comment>
- <comment xml:lang="hr">Bandai WonderSwan ROM</comment>
- <comment xml:lang="hu">Bandai WonderSwan ROM</comment>
- <comment xml:lang="id">ROM Bandai WonderSwan</comment>
- <comment xml:lang="it">ROM Bandai WonderSwan</comment>
- <comment xml:lang="kk">Bandai WonderSwan ROM</comment>
- <comment xml:lang="ko">반다이 원더스완 롬</comment>
- <comment xml:lang="pl">Plik ROM konsoli Bandai WonderSwan</comment>
- <comment xml:lang="pt-BR">ROM de WonderSwan da Bandai</comment>
- <comment xml:lang="ru">Bandai WonderSwan ROM</comment>
- <comment xml:lang="sk">ROM pre Bandai WonderSwan</comment>
- <comment xml:lang="sv">Bandai WonderSwan-rom</comment>
- <comment xml:lang="tr">Bandai WonderSwan ROM</comment>
+ <comment xml:lang="zh_TW">萬代 WonderSwan ROM</comment>
+ <comment xml:lang="zh_CN">万代 WonderSwan ROM</comment>
<comment xml:lang="uk">ROM Bandai WonderSwan</comment>
- <comment xml:lang="zh-CN">万代 WonderSwan ROM</comment>
- <comment xml:lang="zh-TW">萬代 WonderSwan ROM</comment>
+ <comment xml:lang="tr">Bandai WonderSwan ROM</comment>
+ <comment xml:lang="sv">Bandai WonderSwan-rom</comment>
+ <comment xml:lang="sq">ROM Bandai WonderSwan</comment>
+ <comment xml:lang="si">බන්ඩායි WonderSwan ROM</comment>
+ <comment xml:lang="sk">ROM pre Bandai WonderSwan</comment>
+ <comment xml:lang="ru">Bandai WonderSwan ROM</comment>
+ <comment xml:lang="pt_BR">ROM de WonderSwan da Bandai</comment>
+ <comment xml:lang="pl">Plik ROM konsoli Bandai WonderSwan</comment>
+ <comment xml:lang="nl">Bandai WonderSwan-ROM</comment>
+ <comment xml:lang="ko">반다이 원더스완 롬</comment>
+ <comment xml:lang="kk">Bandai WonderSwan ROM</comment>
+ <comment xml:lang="ja">バンダイワンダースワン ROM</comment>
+ <comment xml:lang="it">ROM Bandai WonderSwan</comment>
+ <comment xml:lang="is">Bandai WonderSwan ROM</comment>
+ <comment xml:lang="id">ROM Bandai WonderSwan</comment>
+ <comment xml:lang="hu">Bandai WonderSwan ROM</comment>
+ <comment xml:lang="hr">Bandai WonderSwan ROM</comment>
+ <comment xml:lang="he">ROM של Bandai WonderSwan</comment>
+ <comment xml:lang="ga">ROM Bandai WonderSwan</comment>
+ <comment xml:lang="fur">ROM Bandai WonderSwan</comment>
+ <comment xml:lang="fr">ROM Bandai WonderSwan</comment>
+ <comment xml:lang="fi">Bandai WonderSwan -ROM</comment>
+ <comment xml:lang="eu">Bandai WonderSwan ROM</comment>
+ <comment xml:lang="es">ROM de Bandai WonderSwan</comment>
+ <comment xml:lang="en_GB">Bandai WonderSwan ROM</comment>
+ <comment xml:lang="de">Bandai-WonderSwan-ROM</comment>
+ <comment xml:lang="da">Bandai WonderSwan-ROM</comment>
+ <comment xml:lang="cs">ROM pro Bandai WonderSwan</comment>
+ <comment xml:lang="ca">ROM de Bandai WonderSwan</comment>
+ <comment xml:lang="bg">ROM — Bandai WonderSwan</comment>
+ <comment xml:lang="be">Bandai WonderSwan ROM</comment>
+ <comment xml:lang="ar">روم Bandai WonderSwan</comment>
<generic-icon name="application-x-executable"/>
<glob pattern="*.ws"/>
</mime-type>
<mime-type type="application/x-wonderswan-color-rom">
<comment>Bandai WonderSwan Color ROM</comment>
- <comment xml:lang="bg">ROM — Bandai WonderSwan Color</comment>
- <comment xml:lang="ca">ROM de Bandai WonderSwan Color</comment>
- <comment xml:lang="cs">ROM pro Bandai WonderSwan Color</comment>
- <comment xml:lang="da">Bandai WonderSwan Color-ROM</comment>
- <comment xml:lang="de">Bandai WonderSwan Color ROM</comment>
- <comment xml:lang="en-GB">Bandai WonderSwan Color ROM</comment>
- <comment xml:lang="es">ROM de Bandai WonderSwan Color</comment>
- <comment xml:lang="eu">Bandai WonderSwan Color ROM</comment>
- <comment xml:lang="fi">Bandai WonderSwan Color ROM</comment>
- <comment xml:lang="fr">ROM Bandai WonderSwan Color</comment>
- <comment xml:lang="fur">ROM Bandai WonderSwan Color</comment>
- <comment xml:lang="ga">ROM datha Bandai WonderSwan</comment>
- <comment xml:lang="hr">Bandai WonderSwan Color ROM</comment>
- <comment xml:lang="hu">Bandai WonderSwan Color ROM</comment>
- <comment xml:lang="id">ROM Bandai WonderSwan Color</comment>
- <comment xml:lang="it">ROM Bandai WonderSwan Color</comment>
- <comment xml:lang="kk">Bandai WonderSwan Color ROM</comment>
- <comment xml:lang="ko">반다이 원더스완 컬러 롬</comment>
- <comment xml:lang="pl">Plik ROM konsoli Bandai WonderSwan Color</comment>
- <comment xml:lang="pt-BR">ROM de WonderSwan Color da Bandai</comment>
- <comment xml:lang="ru">Bandai WonderSwan Color ROM</comment>
- <comment xml:lang="sk">ROM pre Bandai WonderSwan Color</comment>
- <comment xml:lang="sv">Bandai WonderSwan Color-rom</comment>
- <comment xml:lang="tr">Bandai WonderSwan Color ROM</comment>
+ <comment xml:lang="zh_TW">萬代 WonderSwan Color ROM</comment>
+ <comment xml:lang="zh_CN">万代 WonderSwan Color ROM</comment>
<comment xml:lang="uk">ROM Bandai WonderSwan Color</comment>
- <comment xml:lang="zh-CN">万代 WonderSwan Color ROM</comment>
- <comment xml:lang="zh-TW">萬代 WonderSwan Color ROM</comment>
+ <comment xml:lang="tr">Bandai WonderSwan Color ROM</comment>
+ <comment xml:lang="sv">Bandai WonderSwan Color-rom</comment>
+ <comment xml:lang="sq">ROM Bandai WonderSwan Color</comment>
+ <comment xml:lang="si">Bandai WonderSwan වර්ණ ROM</comment>
+ <comment xml:lang="sk">ROM pre Bandai WonderSwan Color</comment>
+ <comment xml:lang="ru">Bandai WonderSwan Color ROM</comment>
+ <comment xml:lang="pt_BR">ROM de WonderSwan Color da Bandai</comment>
+ <comment xml:lang="pl">Plik ROM konsoli Bandai WonderSwan Color</comment>
+ <comment xml:lang="nl">Bandai WonderSwan Color-ROM</comment>
+ <comment xml:lang="ko">반다이 원더스완 컬러 롬</comment>
+ <comment xml:lang="kk">Bandai WonderSwan Color ROM</comment>
+ <comment xml:lang="ja">バンダイワンダースワンカラー ROM</comment>
+ <comment xml:lang="it">ROM Bandai WonderSwan Color</comment>
+ <comment xml:lang="is">Bandai WonderSwan Color ROM</comment>
+ <comment xml:lang="id">ROM Bandai WonderSwan Color</comment>
+ <comment xml:lang="hu">Bandai WonderSwan Color ROM</comment>
+ <comment xml:lang="hr">Bandai WonderSwan Color ROM</comment>
+ <comment xml:lang="he">ROM של Bandai WonderSwan Color</comment>
+ <comment xml:lang="ga">ROM datha Bandai WonderSwan</comment>
+ <comment xml:lang="fur">ROM Bandai WonderSwan Color</comment>
+ <comment xml:lang="fr">ROM Bandai WonderSwan Color</comment>
+ <comment xml:lang="fi">Bandai WonderSwan Color -ROM</comment>
+ <comment xml:lang="eu">Bandai WonderSwan Color ROM</comment>
+ <comment xml:lang="es">ROM de Bandai WonderSwan Color</comment>
+ <comment xml:lang="en_GB">Bandai WonderSwan Color ROM</comment>
+ <comment xml:lang="de">Bandai-WonderSwan-Color-ROM</comment>
+ <comment xml:lang="da">Bandai WonderSwan Color-ROM</comment>
+ <comment xml:lang="cs">ROM pro Bandai WonderSwan Color</comment>
+ <comment xml:lang="ca">ROM de Bandai WonderSwan Color</comment>
+ <comment xml:lang="bg">ROM — Bandai WonderSwan Color</comment>
+ <comment xml:lang="be">Bandai WonderSwan Color ROM</comment>
+ <comment xml:lang="ar">روم لون Bandai WonderSwan</comment>
<generic-icon name="application-x-executable"/>
<glob pattern="*.wsc"/>
</mime-type>
<mime-type type="application/x-x509-ca-cert">
<comment>DER/PEM/Netscape-encoded X.509 certificate</comment>
- <comment xml:lang="af">DER/PEM/Netscape-geënkodeerde X.509-sertifikaat</comment>
- <comment xml:lang="ar">شهادة DER/PEM/Netscape-encoded X.509</comment>
- <comment xml:lang="be-Latn">Sertyfikat X.509, zakadavany ŭ DER/PEM/Netscape</comment>
- <comment xml:lang="bg">Сертификат — DER/PEM/Netscape X.509</comment>
- <comment xml:lang="ca">certificat X.509 codificat com DER/PEM/Netscape</comment>
- <comment xml:lang="cs">certifikát X.509 kódovaný jako DER/PEM/Netscape</comment>
- <comment xml:lang="da">DER-/PEM-/Netscape-kodet X.509-certifikat</comment>
- <comment xml:lang="de">DER/PEM/Netscape-kodiertes X.509-Zertifikat</comment>
- <comment xml:lang="el">Ψηφιακό πιστοποιητικό X.509 κωδικοποιημένο κατά DER/PEM/Netscape</comment>
- <comment xml:lang="en-GB">DER/PEM/Netscape-encoded X.509 certificate</comment>
- <comment xml:lang="eo">DER/PEM/Netscape-kodigita X.509-atestilo</comment>
- <comment xml:lang="es">certificado X.509 codificado con DER/PEM/Netscape</comment>
- <comment xml:lang="eu">X.509rekin kodetutako DER, PEM edo Netscape zertifikatua</comment>
- <comment xml:lang="fi">DER/PEM/Netscape-koodattu X.509-varmenne</comment>
- <comment xml:lang="fo">DER/PEM/Netscape-encoded X.509 váttan</comment>
- <comment xml:lang="fr">certificat X.509 codé DER/PEM/Netscape</comment>
- <comment xml:lang="fur">certificât X.509 codificât cun DER/PEM/Netscape</comment>
- <comment xml:lang="ga">teastas X.509 ionchódaithe le DER/PEM/Netscape</comment>
- <comment xml:lang="gl">certificado X.509 codificado con DER/PEM/Netscape</comment>
- <comment xml:lang="he">אישור מסוג X.509 של DER/PEM/Netscape-encoded</comment>
- <comment xml:lang="hr">DER/PEM/Netscape-kodiran X.509 vjerodajnica</comment>
- <comment xml:lang="hu">DER/PEM/Netscape formátumú X.509-tanúsítvány</comment>
- <comment xml:lang="ia">Certificato X.509 codificate in DER/PEM/Netscape</comment>
- <comment xml:lang="id">Sertifikat DER/PEM/Netscape-tersandi X.509</comment>
- <comment xml:lang="it">Certificato X.509 DER/PEM/Netscape</comment>
- <comment xml:lang="ja">DER/PEM/Netscape エンコード X.509 証明書</comment>
- <comment xml:lang="ka">DER/PEM/Netscape კოდირებული X.509 სერტიფიკატი</comment>
- <comment xml:lang="kk">X.509 сертификаты (DER/PEM/Netscape кодталған)</comment>
- <comment xml:lang="ko">DER/PEM/넷스케이프로 인코딩된 X.509 인증서</comment>
- <comment xml:lang="lt">DER/PEM/Netscape-encoded X.509 liudijimas</comment>
- <comment xml:lang="lv">DER/PEM/Netscape-encoded X.509 sertifikāts</comment>
- <comment xml:lang="ms">Sijil X.509 dienkod /DER/PEM/Netscape</comment>
- <comment xml:lang="nb">DER/PEM/Netscape-kodet X.509-sertifikat</comment>
- <comment xml:lang="nl">DER/PEM/Netscape-gecodeerd X.509-certificaat</comment>
- <comment xml:lang="nn">DER/PEM/Netscape-koda X.509-sertifikat</comment>
- <comment xml:lang="oc">certificat X.509 encodat DER/PEM/Netscape</comment>
- <comment xml:lang="pl">Zakodowany w DER/PEM/Netscape certyfikat X.509</comment>
- <comment xml:lang="pt">certificado X.509 codificado com DER/PEM/Netscape</comment>
- <comment xml:lang="pt-BR">Certificado X.509 codificado com DER/PEM/Netscape</comment>
- <comment xml:lang="ro">Certificat DER/PEM/Netscape-codat X.509</comment>
- <comment xml:lang="ru">Сертификат X.509 (DER/PEM/Netscape-закодированный)</comment>
- <comment xml:lang="sk">Certifikát X.509 kódovaný ako DER/PEM/Netscape</comment>
- <comment xml:lang="sl">Datoteka potrdila DER/PEM/Netscape X.509</comment>
- <comment xml:lang="sq">Çertifikatë DER/PEM/Netscape-encoded X.509</comment>
- <comment xml:lang="sr">ДЕР/ПЕМ/Нетскејп кодирано уверење Икс.509</comment>
- <comment xml:lang="sv">DER/PEM/Netscape-kodat X.509-certifikat</comment>
- <comment xml:lang="tr">DER/PEM/Netscape-kodlanmış X.509 sertfikası</comment>
- <comment xml:lang="uk">сертифікат X.509 у форматі DER/PEM/Netscape</comment>
+ <comment xml:lang="zh_TW">DER/PEM/Netscape 編碼的 X.509 憑證</comment>
+ <comment xml:lang="zh_CN">DER/PEM/Netscape-encoded X.509 证书</comment>
<comment xml:lang="vi">Chứng nhận X.509 mã hoá bằng Netscape/PEM/DER</comment>
- <comment xml:lang="zh-CN">DER/PEM/Netscape-encoded X.509 证书</comment>
- <comment xml:lang="zh-TW">DER/PEM/Netscape 編碼的 X.509 憑證</comment>
+ <comment xml:lang="uk">сертифікат X.509 у форматі DER/PEM/Netscape</comment>
+ <comment xml:lang="tr">DER/PEM/Netscape-kodlanmış X.509 sertfikası</comment>
+ <comment xml:lang="sv">DER/PEM/Netscape-kodat X.509-certifikat</comment>
+ <comment xml:lang="sr">ДЕР/ПЕМ/Нетскејп кодирано уверење Икс.509</comment>
+ <comment xml:lang="sq">dëshmi X.509 koduar për DER/PEM/Netscape</comment>
+ <comment xml:lang="sl">Datoteka potrdila DER/PEM/Netscape X.509</comment>
+ <comment xml:lang="si">DER/PEM/Netscape-කේතනය කළ X.509 සහතිකය</comment>
+ <comment xml:lang="sk">Certifikát X.509 kódovaný ako DER/PEM/Netscape</comment>
+ <comment xml:lang="ru">Сертификат X.509 в формате DER/PEM/Netscape</comment>
+ <comment xml:lang="ro">Certificat DER/PEM/Netscape-codat X.509</comment>
+ <comment xml:lang="pt_BR">Certificado X.509 codificado com DER/PEM/Netscape</comment>
+ <comment xml:lang="pt">certificado X.509 codificado com DER/PEM/Netscape</comment>
+ <comment xml:lang="pl">Zakodowany w DER/PEM/Netscape certyfikat X.509</comment>
+ <comment xml:lang="oc">certificat X.509 encodat DER/PEM/Netscape</comment>
+ <comment xml:lang="nn">DER/PEM/Netscape-koda X.509-sertifikat</comment>
+ <comment xml:lang="nl">DER/PEM/Netscape-gecodeerd X.509-certificaat</comment>
+ <comment xml:lang="nb">DER/PEM/Netscape-kodet X.509-sertifikat</comment>
+ <comment xml:lang="ms">Sijil X.509 dienkod /DER/PEM/Netscape</comment>
+ <comment xml:lang="lv">DER/PEM/Netscape-encoded X.509 sertifikāts</comment>
+ <comment xml:lang="lt">DER/PEM/Netscape-encoded X.509 liudijimas</comment>
+ <comment xml:lang="ko">DER/PEM/넷스케이프로 인코딩된 X.509 인증서</comment>
+ <comment xml:lang="kk">X.509 сертификаты (DER/PEM/Netscape кодталған)</comment>
+ <comment xml:lang="ka">DER/PEM/Netscape კოდირებული X.509 სერტიფიკატი</comment>
+ <comment xml:lang="ja">DER/PEM/Netscape エンコード X.509 証明書</comment>
+ <comment xml:lang="it">Certificato X.509 DER/PEM/Netscape</comment>
+ <comment xml:lang="is">DER/PEM/Netscape-kóðað X.509 skilríki</comment>
+ <comment xml:lang="id">Sertifikat DER/PEM/Netscape-tersandi X.509</comment>
+ <comment xml:lang="ia">Certificato X.509 codificate in DER/PEM/Netscape</comment>
+ <comment xml:lang="hu">DER/PEM/Netscape formátumú X.509-tanúsítvány</comment>
+ <comment xml:lang="hr">DER/PEM/Netscape-kodiran X.509 vjerodajnica</comment>
+ <comment xml:lang="he">אישור מסוג X.509 של DER/PEM/Netscape-encoded</comment>
+ <comment xml:lang="gl">certificado X.509 codificado con DER/PEM/Netscape</comment>
+ <comment xml:lang="ga">teastas X.509 ionchódaithe le DER/PEM/Netscape</comment>
+ <comment xml:lang="fur">certificât X.509 codificât cun DER/PEM/Netscape</comment>
+ <comment xml:lang="fr">certificat X.509 codé DER/PEM/Netscape</comment>
+ <comment xml:lang="fo">DER/PEM/Netscape-encoded X.509 váttan</comment>
+ <comment xml:lang="fi">DER/PEM/Netscape-koodattu X.509-varmenne</comment>
+ <comment xml:lang="eu">X.509rekin kodetutako DER, PEM edo Netscape zertifikatua</comment>
+ <comment xml:lang="es">certificado X.509 codificado con DER/PEM/Netscape</comment>
+ <comment xml:lang="eo">DER/PEM/Netscape-kodigita X.509-atestilo</comment>
+ <comment xml:lang="en_GB">DER/PEM/Netscape-encoded X.509 certificate</comment>
+ <comment xml:lang="el">Ψηφιακό πιστοποιητικό X.509 κωδικοποιημένο κατά DER/PEM/Netscape</comment>
+ <comment xml:lang="de">DER/PEM/Netscape-verschlüsseltes X.509-Zertifikat</comment>
+ <comment xml:lang="da">DER-/PEM-/Netscape-kodet X.509-certifikat</comment>
+ <comment xml:lang="cs">certifikát X.509 kódovaný jako DER/PEM/Netscape</comment>
+ <comment xml:lang="ca">certificat X.509 codificat com DER/PEM/Netscape</comment>
+ <comment xml:lang="bg">Сертификат — DER/PEM/Netscape X.509</comment>
+ <comment xml:lang="be@latin">Sertyfikat X.509, zakadavany ŭ DER/PEM/Netscape</comment>
+ <comment xml:lang="be">сертыфікат X.509, закадаваны праз DER/PEM/Netscape</comment>
+ <comment xml:lang="ar">شهادة DER/PEM/Netscape-encoded X.509</comment>
+ <comment xml:lang="af">DER/PEM/Netscape-geënkodeerde X.509-sertifikaat</comment>
<generic-icon name="text-x-generic"/>
+ <magic>
+ <match type="string" value="-----BEGIN CA CERTIFICATE-----" offset="0"/>
+ <match type="string" value="-----BEGIN TRUSTED CERTIFICATE-----" offset="0"/>
+ </magic>
<glob pattern="*.der"/>
<glob pattern="*.crt"/>
<glob pattern="*.cert"/>
<glob pattern="*.pem"/>
</mime-type>
<mime-type type="application/x-zerosize">
- <comment>empty document</comment>
- <comment xml:lang="af">leë dokument</comment>
- <comment xml:lang="ar">مستند فارغ</comment>
- <comment xml:lang="ast">documentu baleru</comment>
- <comment xml:lang="be-Latn">pusty dakument</comment>
- <comment xml:lang="bg">Празен документ</comment>
- <comment xml:lang="ca">document buit</comment>
- <comment xml:lang="cs">prázdný dokument</comment>
- <comment xml:lang="da">tomt dokument</comment>
- <comment xml:lang="de">Leeres Dokument</comment>
- <comment xml:lang="el">Κενό έγγραφο</comment>
- <comment xml:lang="en-GB">empty document</comment>
- <comment xml:lang="eo">malplena dokumento</comment>
- <comment xml:lang="es">documento vacío</comment>
- <comment xml:lang="eu">dokumentu hutsa</comment>
- <comment xml:lang="fi">tyhjä asiakirja</comment>
- <comment xml:lang="fo">tómt skjal</comment>
- <comment xml:lang="fr">document vide</comment>
- <comment xml:lang="fur">document vueit</comment>
- <comment xml:lang="ga">cáipéis fholamh</comment>
- <comment xml:lang="gl">documeto baleiro</comment>
- <comment xml:lang="he">מסמך ריק</comment>
- <comment xml:lang="hr">Prazan dokument</comment>
- <comment xml:lang="hu">üres dokumentum</comment>
- <comment xml:lang="ia">Documento vacue</comment>
- <comment xml:lang="id">dokumen kosong</comment>
- <comment xml:lang="it">Documento vuoto</comment>
- <comment xml:lang="ja">空のドキュメント</comment>
- <comment xml:lang="kk">бос құжат</comment>
- <comment xml:lang="ko">빈 문서</comment>
- <comment xml:lang="lt">tuščias dokumentas</comment>
- <comment xml:lang="lv">tukšs dokuments</comment>
- <comment xml:lang="ms">Dokumen kosong</comment>
- <comment xml:lang="nb">tomt dokument</comment>
- <comment xml:lang="nl">leeg document</comment>
- <comment xml:lang="nn">tomt dokument</comment>
- <comment xml:lang="oc">document void</comment>
- <comment xml:lang="pl">Pusty dokument</comment>
- <comment xml:lang="pt">documento vazio</comment>
- <comment xml:lang="pt-BR">Documento vazio</comment>
- <comment xml:lang="ro">document gol</comment>
- <comment xml:lang="ru">Пустой документ</comment>
- <comment xml:lang="sk">Prázdny dokument</comment>
- <comment xml:lang="sl">prazen dokument</comment>
- <comment xml:lang="sq">Dokument bosh</comment>
- <comment xml:lang="sr">празан документ</comment>
- <comment xml:lang="sv">tomt dokument</comment>
- <comment xml:lang="tr">boş belge</comment>
+ <comment>Empty document</comment>
<comment xml:lang="uk">порожній документ</comment>
- <comment xml:lang="vi">tài liệu rỗng</comment>
- <comment xml:lang="zh-CN">空文档</comment>
- <comment xml:lang="zh-TW">空白文件</comment>
+ <comment xml:lang="sv">Tomt dokument</comment>
+ <comment xml:lang="ru">Пустой документ</comment>
+ <comment xml:lang="pt_BR">Documento em branco</comment>
+ <comment xml:lang="pl">Pusty dokument</comment>
+ <comment xml:lang="ja">空の文書</comment>
+ <comment xml:lang="it">Documento vuoto</comment>
+ <comment xml:lang="eu">Dokumentu hutsa</comment>
+ <comment xml:lang="es">documento vacío</comment>
+ <comment xml:lang="de">Leeres Dokument</comment>
+ <comment xml:lang="be">пусты дакумент</comment>
</mime-type>
<mime-type type="application/x-zoo">
<comment>Zoo archive</comment>
- <comment xml:lang="af">Zoo-argief</comment>
- <comment xml:lang="ar">أرشيف Zoo</comment>
- <comment xml:lang="az">Zoo arxivi</comment>
- <comment xml:lang="be-Latn">Archiŭ zoo</comment>
- <comment xml:lang="bg">Архив — zoo</comment>
- <comment xml:lang="ca">arxiu zoo</comment>
- <comment xml:lang="cs">archiv Zoo</comment>
- <comment xml:lang="cy">Archif zoo</comment>
- <comment xml:lang="da">Zoo-arkiv</comment>
- <comment xml:lang="de">Zoo-Archiv</comment>
- <comment xml:lang="el">Συμπιεσμένο αρχείο Zoo</comment>
- <comment xml:lang="en-GB">Zoo archive</comment>
- <comment xml:lang="eo">Zoo-arkivo</comment>
- <comment xml:lang="es">archivador Zoo</comment>
- <comment xml:lang="eu">Zoo artxiboa</comment>
- <comment xml:lang="fi">Zoo-arkisto</comment>
- <comment xml:lang="fo">Zoo skjalasavn</comment>
- <comment xml:lang="fr">archive zoo</comment>
- <comment xml:lang="fur">archivi Zoo</comment>
- <comment xml:lang="ga">cartlann Zoo</comment>
- <comment xml:lang="gl">ficheiro Zoo</comment>
- <comment xml:lang="he">ארכיון Zoo</comment>
- <comment xml:lang="hr">Zoo arhiva</comment>
- <comment xml:lang="hu">Zoo archívum</comment>
- <comment xml:lang="ia">Archivo Zoo</comment>
- <comment xml:lang="id">Arsip Zoo</comment>
- <comment xml:lang="it">Archivio zoo</comment>
- <comment xml:lang="ja">Zoo アーカイブ</comment>
- <comment xml:lang="kk">Zoo архиві</comment>
- <comment xml:lang="ko">ZOO 압축 파일</comment>
- <comment xml:lang="lt">Zoo archyvas</comment>
- <comment xml:lang="lv">Zoo arhīvs</comment>
- <comment xml:lang="nb">Zoo-arkiv</comment>
- <comment xml:lang="nl">Zoo-archief</comment>
- <comment xml:lang="nn">Zoo-arkiv</comment>
- <comment xml:lang="oc">archiu zoo</comment>
- <comment xml:lang="pl">Archiwum zoo</comment>
- <comment xml:lang="pt">arquivo Zoo</comment>
- <comment xml:lang="pt-BR">Pacote Zoo</comment>
- <comment xml:lang="ro">Arhivă Zoo</comment>
- <comment xml:lang="ru">Архив ZOO</comment>
- <comment xml:lang="sk">Archív Zoo</comment>
- <comment xml:lang="sl">Datoteka arhiva ZOO</comment>
- <comment xml:lang="sq">Arkiv zoo</comment>
- <comment xml:lang="sr">Зoo архива</comment>
- <comment xml:lang="sv">Zoo-arkiv</comment>
- <comment xml:lang="tr">Zoo arşivi</comment>
- <comment xml:lang="uk">архів zoo</comment>
+ <comment xml:lang="zh_TW">Zoo 封存檔</comment>
+ <comment xml:lang="zh_CN">Zoo 归档文件</comment>
<comment xml:lang="vi">Kho nén zoo</comment>
- <comment xml:lang="zh-CN">Zoo 归档文件</comment>
- <comment xml:lang="zh-TW">Zoo 封存檔</comment>
+ <comment xml:lang="uk">архів zoo</comment>
+ <comment xml:lang="tr">Zoo arşivi</comment>
+ <comment xml:lang="sv">Zoo-arkiv</comment>
+ <comment xml:lang="sr">Зoo архива</comment>
+ <comment xml:lang="sq">arkiv zoo</comment>
+ <comment xml:lang="sl">Datoteka arhiva ZOO</comment>
+ <comment xml:lang="si">සත්වෝද්යාන ලේඛනාගාරය</comment>
+ <comment xml:lang="sk">Archív Zoo</comment>
+ <comment xml:lang="ru">Архив ZOO</comment>
+ <comment xml:lang="ro">Arhivă Zoo</comment>
+ <comment xml:lang="pt_BR">Pacote Zoo</comment>
+ <comment xml:lang="pt">arquivo Zoo</comment>
+ <comment xml:lang="pl">Archiwum zoo</comment>
+ <comment xml:lang="oc">archiu zoo</comment>
+ <comment xml:lang="nn">Zoo-arkiv</comment>
+ <comment xml:lang="nl">Zoo-archief</comment>
+ <comment xml:lang="nb">Zoo-arkiv</comment>
+ <comment xml:lang="lv">Zoo arhīvs</comment>
+ <comment xml:lang="lt">Zoo archyvas</comment>
+ <comment xml:lang="ko">ZOO 압축 파일</comment>
+ <comment xml:lang="kk">Zoo архиві</comment>
+ <comment xml:lang="ja">Zoo アーカイブ</comment>
+ <comment xml:lang="it">Archivio zoo</comment>
+ <comment xml:lang="is">Zoo safnskrá</comment>
+ <comment xml:lang="id">Arsip Zoo</comment>
+ <comment xml:lang="ia">Archivo Zoo</comment>
+ <comment xml:lang="hu">Zoo archívum</comment>
+ <comment xml:lang="hr">Zoo arhiva</comment>
+ <comment xml:lang="he">ארכיון Zoo</comment>
+ <comment xml:lang="gl">ficheiro Zoo</comment>
+ <comment xml:lang="ga">cartlann Zoo</comment>
+ <comment xml:lang="fur">archivi Zoo</comment>
+ <comment xml:lang="fr">archive zoo</comment>
+ <comment xml:lang="fo">Zoo skjalasavn</comment>
+ <comment xml:lang="fi">Zoo-arkisto</comment>
+ <comment xml:lang="eu">Zoo artxiboa</comment>
+ <comment xml:lang="es">archivador Zoo</comment>
+ <comment xml:lang="eo">Zoo-arkivo</comment>
+ <comment xml:lang="en_GB">Zoo archive</comment>
+ <comment xml:lang="el">Συμπιεσμένο αρχείο Zoo</comment>
+ <comment xml:lang="de">Zoo-Archiv</comment>
+ <comment xml:lang="da">Zoo-arkiv</comment>
+ <comment xml:lang="cy">Archif zoo</comment>
+ <comment xml:lang="cs">archiv Zoo</comment>
+ <comment xml:lang="ca">arxiu zoo</comment>
+ <comment xml:lang="bg">Архив — zoo</comment>
+ <comment xml:lang="be@latin">Archiŭ zoo</comment>
+ <comment xml:lang="be">архіў zoo</comment>
+ <comment xml:lang="az">Zoo arxivi</comment>
+ <comment xml:lang="ar">أرشيف Zoo</comment>
+ <comment xml:lang="af">Zoo-argief</comment>
<generic-icon name="package-x-generic"/>
<magic priority="60">
<match type="little32" value="0xfdc4a7dc" offset="20"/>
@@ -22771,56 +23759,59 @@ command to generate the output files.
</mime-type>
<mime-type type="application/xhtml+xml">
<comment>XHTML page</comment>
- <comment xml:lang="af">XHTML-bladsy</comment>
- <comment xml:lang="ar">صفحة XHTML</comment>
- <comment xml:lang="be-Latn">Staronka XHTML</comment>
- <comment xml:lang="bg">Страница — XHTML</comment>
- <comment xml:lang="ca">pàgina XHTML</comment>
- <comment xml:lang="cs">stránka XHTML</comment>
- <comment xml:lang="da">XHTML-side</comment>
- <comment xml:lang="de">XHTML-Seite</comment>
- <comment xml:lang="el">Σελίδα XHTML</comment>
- <comment xml:lang="en-GB">XHTML page</comment>
- <comment xml:lang="eo">XHTML-paĝo</comment>
- <comment xml:lang="es">página XHTML</comment>
- <comment xml:lang="eu">XHTML orria</comment>
- <comment xml:lang="fi">XHTML-sivu</comment>
- <comment xml:lang="fo">XHTML síða</comment>
- <comment xml:lang="fr">page XHTML</comment>
- <comment xml:lang="fur">pagjine XHTML</comment>
- <comment xml:lang="ga">leathanach XHTML</comment>
- <comment xml:lang="gl">Páxina XHTML</comment>
- <comment xml:lang="he">דף XHTML</comment>
- <comment xml:lang="hr">XHTML stranica</comment>
- <comment xml:lang="hu">XHTML-oldal</comment>
- <comment xml:lang="ia">Pagina XHTML</comment>
- <comment xml:lang="id">Halaman XHTML</comment>
- <comment xml:lang="it">Pagina XHTML</comment>
- <comment xml:lang="ja">XHTML ページ</comment>
- <comment xml:lang="kk">XHTML парағы</comment>
- <comment xml:lang="ko">XHTML 페이지</comment>
- <comment xml:lang="lt">XHTML puslapis</comment>
- <comment xml:lang="lv">XHTML lapa</comment>
- <comment xml:lang="ms">Laman XHTML</comment>
- <comment xml:lang="nb">XHTML-side</comment>
- <comment xml:lang="nl">XHTML-pagina</comment>
- <comment xml:lang="nn">XHTML-side</comment>
- <comment xml:lang="oc">pagina XHTML</comment>
- <comment xml:lang="pl">Strona XHTML</comment>
- <comment xml:lang="pt">página XHTML</comment>
- <comment xml:lang="pt-BR">Página XHTML</comment>
- <comment xml:lang="ro">Pagină XHTML</comment>
- <comment xml:lang="ru">Страница XHTML</comment>
- <comment xml:lang="sk">Stránka XHTML</comment>
- <comment xml:lang="sl">Datoteka spletne strani XHTML</comment>
- <comment xml:lang="sq">Faqe XHTML</comment>
- <comment xml:lang="sr">ИксХТМЛ страница</comment>
- <comment xml:lang="sv">XHTML-sida</comment>
- <comment xml:lang="tr">XHTML sayfası</comment>
- <comment xml:lang="uk">сторінка XHTML</comment>
+ <comment xml:lang="zh_TW">XHTML 網頁</comment>
+ <comment xml:lang="zh_CN">XHTML 页面</comment>
<comment xml:lang="vi">Trang XHTML</comment>
- <comment xml:lang="zh-CN">XHTML 页面</comment>
- <comment xml:lang="zh-TW">XHTML 網頁</comment>
+ <comment xml:lang="uk">сторінка XHTML</comment>
+ <comment xml:lang="tr">XHTML sayfası</comment>
+ <comment xml:lang="sv">XHTML-sida</comment>
+ <comment xml:lang="sr">ИксХТМЛ страница</comment>
+ <comment xml:lang="sq">faqe XHTML</comment>
+ <comment xml:lang="sl">Datoteka spletne strani XHTML</comment>
+ <comment xml:lang="si">XHTML පිටුව</comment>
+ <comment xml:lang="sk">Stránka XHTML</comment>
+ <comment xml:lang="ru">Страница XHTML</comment>
+ <comment xml:lang="ro">Pagină XHTML</comment>
+ <comment xml:lang="pt_BR">Página XHTML</comment>
+ <comment xml:lang="pt">página XHTML</comment>
+ <comment xml:lang="pl">Strona XHTML</comment>
+ <comment xml:lang="oc">pagina XHTML</comment>
+ <comment xml:lang="nn">XHTML-side</comment>
+ <comment xml:lang="nl">XHTML-pagina</comment>
+ <comment xml:lang="nb">XHTML-side</comment>
+ <comment xml:lang="ms">Laman XHTML</comment>
+ <comment xml:lang="lv">XHTML lapa</comment>
+ <comment xml:lang="lt">XHTML puslapis</comment>
+ <comment xml:lang="ko">XHTML 페이지</comment>
+ <comment xml:lang="kk">XHTML парағы</comment>
+ <comment xml:lang="ja">XHTML ページ</comment>
+ <comment xml:lang="it">Pagina XHTML</comment>
+ <comment xml:lang="is">XHTML síða</comment>
+ <comment xml:lang="id">Halaman XHTML</comment>
+ <comment xml:lang="ia">Pagina XHTML</comment>
+ <comment xml:lang="hu">XHTML-oldal</comment>
+ <comment xml:lang="hr">XHTML stranica</comment>
+ <comment xml:lang="he">דף XHTML</comment>
+ <comment xml:lang="gl">Páxina XHTML</comment>
+ <comment xml:lang="ga">leathanach XHTML</comment>
+ <comment xml:lang="fur">pagjine XHTML</comment>
+ <comment xml:lang="fr">page XHTML</comment>
+ <comment xml:lang="fo">XHTML síða</comment>
+ <comment xml:lang="fi">XHTML-sivu</comment>
+ <comment xml:lang="eu">XHTML orria</comment>
+ <comment xml:lang="es">página XHTML</comment>
+ <comment xml:lang="eo">XHTML-paĝo</comment>
+ <comment xml:lang="en_GB">XHTML page</comment>
+ <comment xml:lang="el">Σελίδα XHTML</comment>
+ <comment xml:lang="de">XHTML-Seite</comment>
+ <comment xml:lang="da">XHTML-side</comment>
+ <comment xml:lang="cs">stránka XHTML</comment>
+ <comment xml:lang="ca">pàgina XHTML</comment>
+ <comment xml:lang="bg">Страница — XHTML</comment>
+ <comment xml:lang="be@latin">Staronka XHTML</comment>
+ <comment xml:lang="be">старонка XHTML</comment>
+ <comment xml:lang="ar">صفحة XHTML</comment>
+ <comment xml:lang="af">XHTML-bladsy</comment>
<acronym>XHTML</acronym>
<expanded-acronym>Extensible HyperText Markup Language</expanded-acronym>
<sub-class-of type="application/xml"/>
@@ -22839,57 +23830,60 @@ command to generate the output files.
</mime-type>
<mime-type type="application/zip">
<comment>Zip archive</comment>
- <comment xml:lang="af">Zip-argief</comment>
- <comment xml:lang="ar">أرشيف Zip</comment>
- <comment xml:lang="az">Zip arxivi</comment>
- <comment xml:lang="be-Latn">Archiŭ zip</comment>
- <comment xml:lang="bg">Архив — zip</comment>
- <comment xml:lang="ca">arxiu zip</comment>
- <comment xml:lang="cs">archiv ZIP</comment>
- <comment xml:lang="cy">Archif ZIP</comment>
- <comment xml:lang="da">Zip-arkiv</comment>
- <comment xml:lang="de">Zip-Archiv</comment>
- <comment xml:lang="el">Συμπιεσμένο αρχείο Zip</comment>
- <comment xml:lang="en-GB">Zip archive</comment>
- <comment xml:lang="eo">Zip-arkivo</comment>
- <comment xml:lang="es">archivador Zip</comment>
- <comment xml:lang="eu">Zip artxiboa</comment>
- <comment xml:lang="fi">Zip-arkisto</comment>
- <comment xml:lang="fo">Zip skjalasavn</comment>
- <comment xml:lang="fr">archive zip</comment>
- <comment xml:lang="fur">archivi Zip</comment>
- <comment xml:lang="ga">cartlann Zip</comment>
- <comment xml:lang="gl">ficheiro Zip</comment>
- <comment xml:lang="he">ארכיון Zip</comment>
- <comment xml:lang="hr">Zip arhiva</comment>
- <comment xml:lang="hu">Zip archívum</comment>
- <comment xml:lang="ia">Archivo Zip</comment>
- <comment xml:lang="id">Arsip Zip</comment>
- <comment xml:lang="it">Archivio zip</comment>
- <comment xml:lang="ja">Zip アーカイブ</comment>
- <comment xml:lang="kk">Zip архиві</comment>
- <comment xml:lang="ko">ZIP 압축 파일</comment>
- <comment xml:lang="lt">Zip archyvas</comment>
- <comment xml:lang="lv">Zip arhīvs</comment>
- <comment xml:lang="nb">Zip-arkiv</comment>
- <comment xml:lang="nl">Zip-archief</comment>
- <comment xml:lang="nn">Zip-arkiv</comment>
- <comment xml:lang="oc">archiu zip</comment>
- <comment xml:lang="pl">Archiwum ZIP</comment>
- <comment xml:lang="pt">arquivo Zip</comment>
- <comment xml:lang="pt-BR">Pacote Zip</comment>
- <comment xml:lang="ro">Arhivă zip</comment>
- <comment xml:lang="ru">Архив ZIP</comment>
- <comment xml:lang="sk">Archív ZIP</comment>
- <comment xml:lang="sl">Datoteka arhiva ZIP</comment>
- <comment xml:lang="sq">Arkiv zip</comment>
- <comment xml:lang="sr">Зип архива</comment>
- <comment xml:lang="sv">Zip-arkiv</comment>
- <comment xml:lang="tr">Zip arşivi</comment>
- <comment xml:lang="uk">архів zip</comment>
+ <comment xml:lang="zh_TW">Zip 封存檔</comment>
+ <comment xml:lang="zh_CN">Zip 归档文件</comment>
<comment xml:lang="vi">Kho nén zip</comment>
- <comment xml:lang="zh-CN">Zip 归档文件</comment>
- <comment xml:lang="zh-TW">Zip 封存檔</comment>
+ <comment xml:lang="uk">архів zip</comment>
+ <comment xml:lang="tr">Zip arşivi</comment>
+ <comment xml:lang="sv">Zip-arkiv</comment>
+ <comment xml:lang="sr">Зип архива</comment>
+ <comment xml:lang="sq">arkiv zip</comment>
+ <comment xml:lang="sl">Datoteka arhiva ZIP</comment>
+ <comment xml:lang="si">Zip සංරක්ෂිතය</comment>
+ <comment xml:lang="sk">Archív ZIP</comment>
+ <comment xml:lang="ru">Архив ZIP</comment>
+ <comment xml:lang="ro">Arhivă zip</comment>
+ <comment xml:lang="pt_BR">Pacote Zip</comment>
+ <comment xml:lang="pt">arquivo Zip</comment>
+ <comment xml:lang="pl">Archiwum ZIP</comment>
+ <comment xml:lang="oc">archiu zip</comment>
+ <comment xml:lang="nn">Zip-arkiv</comment>
+ <comment xml:lang="nl">Zip-archief</comment>
+ <comment xml:lang="nb">Zip-arkiv</comment>
+ <comment xml:lang="lv">Zip arhīvs</comment>
+ <comment xml:lang="lt">Zip archyvas</comment>
+ <comment xml:lang="ko">ZIP 압축 파일</comment>
+ <comment xml:lang="kk">Zip архиві</comment>
+ <comment xml:lang="ja">Zip アーカイブ</comment>
+ <comment xml:lang="it">Archivio zip</comment>
+ <comment xml:lang="is">Zip safnskrá</comment>
+ <comment xml:lang="id">Arsip Zip</comment>
+ <comment xml:lang="ia">Archivo Zip</comment>
+ <comment xml:lang="hu">Zip archívum</comment>
+ <comment xml:lang="hr">Zip arhiva</comment>
+ <comment xml:lang="he">ארכיון Zip</comment>
+ <comment xml:lang="gl">ficheiro Zip</comment>
+ <comment xml:lang="ga">cartlann Zip</comment>
+ <comment xml:lang="fur">archivi Zip</comment>
+ <comment xml:lang="fr">archive zip</comment>
+ <comment xml:lang="fo">Zip skjalasavn</comment>
+ <comment xml:lang="fi">Zip-arkisto</comment>
+ <comment xml:lang="eu">Zip artxiboa</comment>
+ <comment xml:lang="es">archivador Zip</comment>
+ <comment xml:lang="eo">Zip-arkivo</comment>
+ <comment xml:lang="en_GB">Zip archive</comment>
+ <comment xml:lang="el">Συμπιεσμένο αρχείο Zip</comment>
+ <comment xml:lang="de">Zip-Archiv</comment>
+ <comment xml:lang="da">Zip-arkiv</comment>
+ <comment xml:lang="cy">Archif ZIP</comment>
+ <comment xml:lang="cs">archiv ZIP</comment>
+ <comment xml:lang="ca">arxiu zip</comment>
+ <comment xml:lang="bg">Архив — zip</comment>
+ <comment xml:lang="be@latin">Archiŭ zip</comment>
+ <comment xml:lang="be">архіў zip</comment>
+ <comment xml:lang="az">Zip arxivi</comment>
+ <comment xml:lang="ar">أرشيف Zip</comment>
+ <comment xml:lang="af">Zip-argief</comment>
<alias type="application/x-zip-compressed"/>
<alias type="application/x-zip"/>
<generic-icon name="package-x-generic"/>
@@ -22897,33 +23891,43 @@ command to generate the output files.
<match type="string" value="PK\003\004" offset="0"/>
</magic>
<glob pattern="*.zip"/>
+ <glob pattern="*.zipx"/>
</mime-type>
<mime-type type="application/x-ms-wim">
<comment>WIM disk image</comment>
- <comment xml:lang="bg">Диск — WIM</comment>
- <comment xml:lang="ca">imatge de disc WIM</comment>
- <comment xml:lang="da">WIM-diskaftryk</comment>
- <comment xml:lang="de">WIM-Datenträgerabbild</comment>
- <comment xml:lang="en-GB">WIM disk image</comment>
- <comment xml:lang="es">imagen de disco WIM</comment>
- <comment xml:lang="eu">WIM disko irudia</comment>
- <comment xml:lang="fi">WIM-levykuva</comment>
- <comment xml:lang="fr">image disque WIM</comment>
- <comment xml:lang="hr">WIM slika diska</comment>
- <comment xml:lang="hu">WIM lemezkép</comment>
- <comment xml:lang="id">Image disk WIM</comment>
- <comment xml:lang="it">Immagine disco WIM</comment>
- <comment xml:lang="kk">WIM диск бейнесі</comment>
- <comment xml:lang="ko">WIM 디스크 이미지</comment>
- <comment xml:lang="pl">Obraz dysku WIM</comment>
- <comment xml:lang="pt-BR">Imagem de disco WIM</comment>
- <comment xml:lang="ru">Образ диска WIM</comment>
- <comment xml:lang="sk">Obraz disku WIM</comment>
- <comment xml:lang="sv">WIM-diskavbildning</comment>
- <comment xml:lang="tr">WIM disk görüntüsü</comment>
+ <comment xml:lang="zh_TW">WIM 磁碟映像檔</comment>
+ <comment xml:lang="zh_CN">WIM 磁盘映像</comment>
<comment xml:lang="uk">образ диска WIM</comment>
- <comment xml:lang="zh-CN">WIM 磁盘映像</comment>
- <comment xml:lang="zh-TW">WIM 磁碟映像檔</comment>
+ <comment xml:lang="tr">WIM disk görüntüsü</comment>
+ <comment xml:lang="sv">WIM-diskavbildning</comment>
+ <comment xml:lang="sq">pamje disku WIM</comment>
+ <comment xml:lang="sl">Slika diska WIM</comment>
+ <comment xml:lang="si">WIM තැටි රූපය</comment>
+ <comment xml:lang="sk">Obraz disku WIM</comment>
+ <comment xml:lang="ru">Образ диска WIM</comment>
+ <comment xml:lang="pt_BR">Imagem de disco WIM</comment>
+ <comment xml:lang="pl">Obraz dysku WIM</comment>
+ <comment xml:lang="nl">WIM-schijfkopiebestand</comment>
+ <comment xml:lang="ko">WIM 디스크 이미지</comment>
+ <comment xml:lang="kk">WIM диск бейнесі</comment>
+ <comment xml:lang="ja">WIM ディスクイメージ</comment>
+ <comment xml:lang="it">Immagine disco WIM</comment>
+ <comment xml:lang="is">WIM diskmynd</comment>
+ <comment xml:lang="id">Image disk WIM</comment>
+ <comment xml:lang="hu">WIM lemezkép</comment>
+ <comment xml:lang="hr">WIM slika diska</comment>
+ <comment xml:lang="he">דמות כונן WIM</comment>
+ <comment xml:lang="fr">image disque WIM</comment>
+ <comment xml:lang="fi">WIM-levykuva</comment>
+ <comment xml:lang="eu">WIM disko irudia</comment>
+ <comment xml:lang="es">imagen de disco WIM</comment>
+ <comment xml:lang="en_GB">WIM disk image</comment>
+ <comment xml:lang="de">WIM-Datenträgerabbild</comment>
+ <comment xml:lang="da">WIM-diskaftryk</comment>
+ <comment xml:lang="ca">imatge de disc WIM</comment>
+ <comment xml:lang="bg">Диск — WIM</comment>
+ <comment xml:lang="be">вобраз дыска WIM</comment>
+ <comment xml:lang="ar">صورة قرص WIM</comment>
<acronym>WIM</acronym>
<expanded-acronym>Windows Imaging Format</expanded-acronym>
<magic>
@@ -22934,215 +23938,224 @@ command to generate the output files.
</mime-type>
<mime-type type="audio/ac3">
<comment>Dolby Digital audio</comment>
- <comment xml:lang="af">Dolby Digital-oudio</comment>
- <comment xml:lang="ar">Dolby Digital سمعي</comment>
- <comment xml:lang="az">Dolby Digital audio</comment>
- <comment xml:lang="be-Latn">Aŭdyjo Dolby Digital</comment>
- <comment xml:lang="bg">Аудио — Dolby Digital</comment>
- <comment xml:lang="ca">àudio Dolby Digital</comment>
- <comment xml:lang="cs">zvuk Dolby Digital</comment>
- <comment xml:lang="cy">Sain Dolby Digital</comment>
- <comment xml:lang="da">Dolby Ditital-lyd</comment>
- <comment xml:lang="de">Dolby-Digital-Audio</comment>
- <comment xml:lang="el">Ψηφιακός Ήχος Dolby</comment>
- <comment xml:lang="en-GB">Dolby Digital audio</comment>
- <comment xml:lang="eo">Sondosiero en Dolby Digital</comment>
- <comment xml:lang="es">audio Dolby Digital</comment>
- <comment xml:lang="eu">Dolby audio digitala</comment>
- <comment xml:lang="fi">Dolby Digital -ääni</comment>
- <comment xml:lang="fo">Dolby Digital ljóður</comment>
- <comment xml:lang="fr">audio Dolby Digital</comment>
- <comment xml:lang="fur">audio Dolby Digital</comment>
- <comment xml:lang="ga">fuaim Dolby Digital</comment>
- <comment xml:lang="gl">son Dolby Digital</comment>
- <comment xml:lang="he">שמע Dolby Digital</comment>
- <comment xml:lang="hr">Dolby Digital zvučni zapis</comment>
- <comment xml:lang="hu">Dolby Digital hang</comment>
- <comment xml:lang="ia">Audio Dolby Digital</comment>
- <comment xml:lang="id">Audio Dolby Digital</comment>
- <comment xml:lang="it">Audio Dolby Digital</comment>
- <comment xml:lang="ja">ドルビーデジタルオーディオ</comment>
- <comment xml:lang="ka">Dolby Digital-ის აუდიო</comment>
- <comment xml:lang="kk">Dolby Digital аудиосы</comment>
- <comment xml:lang="ko">돌비 디지털 오디오</comment>
- <comment xml:lang="lt">Dolby Digital garso įrašas</comment>
- <comment xml:lang="lv">Dolby Digital audio</comment>
- <comment xml:lang="ms">Audio Digital Dolby</comment>
- <comment xml:lang="nb">Dolby digital lyd</comment>
- <comment xml:lang="nl">Dolby Digital-audio</comment>
- <comment xml:lang="nn">Dolby Digital lyd</comment>
- <comment xml:lang="oc">àudio Dolby Digital</comment>
- <comment xml:lang="pl">Plik dźwiękowy Dolby Digital</comment>
- <comment xml:lang="pt">áudio Dolby Digital</comment>
- <comment xml:lang="pt-BR">Áudio Dolby Digital</comment>
- <comment xml:lang="ro">Audio Dolby Digital</comment>
- <comment xml:lang="ru">Аудио Dolby Digital</comment>
- <comment xml:lang="sk">Zvuk Dolby Digital</comment>
- <comment xml:lang="sl">Zvočna datoteka Dolby Digital</comment>
- <comment xml:lang="sq">Audio Dolby Digital</comment>
- <comment xml:lang="sr">Дигитални Долби звук</comment>
- <comment xml:lang="sv">Dolby Digital-ljud</comment>
- <comment xml:lang="tr">Dolby Digital sesi</comment>
- <comment xml:lang="uk">звук Dolby Digital</comment>
+ <comment xml:lang="zh_TW">杜比數位音訊</comment>
+ <comment xml:lang="zh_CN">杜比数字音频</comment>
<comment xml:lang="vi">Âm thanh Dolby Digital</comment>
- <comment xml:lang="zh-CN">杜比数字音频</comment>
- <comment xml:lang="zh-TW">杜比數位音訊</comment>
- <magic priority="50">
+ <comment xml:lang="uk">звук Dolby Digital</comment>
+ <comment xml:lang="tr">Dolby Digital sesi</comment>
+ <comment xml:lang="sv">Dolby Digital-ljud</comment>
+ <comment xml:lang="sr">Дигитални Долби звук</comment>
+ <comment xml:lang="sq">audio Dolby Digital</comment>
+ <comment xml:lang="sl">Zvočna datoteka Dolby Digital</comment>
+ <comment xml:lang="si">ඩොල්බි ඩිජිටල් ඕඩියෝ</comment>
+ <comment xml:lang="sk">Zvuk Dolby Digital</comment>
+ <comment xml:lang="ru">Аудио Dolby Digital</comment>
+ <comment xml:lang="ro">Audio Dolby Digital</comment>
+ <comment xml:lang="pt_BR">Áudio Dolby Digital</comment>
+ <comment xml:lang="pt">áudio Dolby Digital</comment>
+ <comment xml:lang="pl">Plik dźwiękowy Dolby Digital</comment>
+ <comment xml:lang="oc">àudio Dolby Digital</comment>
+ <comment xml:lang="nn">Dolby Digital lyd</comment>
+ <comment xml:lang="nl">Dolby Digital-audio</comment>
+ <comment xml:lang="nb">Dolby digital lyd</comment>
+ <comment xml:lang="ms">Audio Digital Dolby</comment>
+ <comment xml:lang="lv">Dolby Digital audio</comment>
+ <comment xml:lang="lt">Dolby Digital garso įrašas</comment>
+ <comment xml:lang="ko">돌비 디지털 오디오</comment>
+ <comment xml:lang="kk">Dolby Digital аудиосы</comment>
+ <comment xml:lang="ka">Dolby Digital-ის აუდიო</comment>
+ <comment xml:lang="ja">ドルビーデジタルオーディオ</comment>
+ <comment xml:lang="it">Audio Dolby Digital</comment>
+ <comment xml:lang="is">Dolby Digital hljóðskrá</comment>
+ <comment xml:lang="id">Audio Dolby Digital</comment>
+ <comment xml:lang="ia">Audio Dolby Digital</comment>
+ <comment xml:lang="hu">Dolby Digital hang</comment>
+ <comment xml:lang="hr">Dolby Digital zvučni zapis</comment>
+ <comment xml:lang="he">שמע Dolby Digital</comment>
+ <comment xml:lang="gl">son Dolby Digital</comment>
+ <comment xml:lang="ga">fuaim Dolby Digital</comment>
+ <comment xml:lang="fur">audio Dolby Digital</comment>
+ <comment xml:lang="fr">audio Dolby Digital</comment>
+ <comment xml:lang="fo">Dolby Digital ljóður</comment>
+ <comment xml:lang="fi">Dolby Digital -ääni</comment>
+ <comment xml:lang="eu">Dolby audio digitala</comment>
+ <comment xml:lang="es">sonido Dolby Digital</comment>
+ <comment xml:lang="eo">Sondosiero en Dolby Digital</comment>
+ <comment xml:lang="en_GB">Dolby Digital audio</comment>
+ <comment xml:lang="el">Ψηφιακός Ήχος Dolby</comment>
+ <comment xml:lang="de">Dolby-Digital-Audio</comment>
+ <comment xml:lang="da">Dolby Ditital-lyd</comment>
+ <comment xml:lang="cy">Sain Dolby Digital</comment>
+ <comment xml:lang="cs">zvuk Dolby Digital</comment>
+ <comment xml:lang="ca">àudio Dolby Digital</comment>
+ <comment xml:lang="bg">Аудио — Dolby Digital</comment>
+ <comment xml:lang="be@latin">Aŭdyjo Dolby Digital</comment>
+ <comment xml:lang="be">аўдыя Dolby Digital</comment>
+ <comment xml:lang="az">Dolby Digital audio</comment>
+ <comment xml:lang="ar">صوت Dolby Digital</comment>
+ <comment xml:lang="af">Dolby Digital-oudio</comment>
+ <magic>
<match type="big16" value="0x0b77" offset="0"/>
</magic>
<glob pattern="*.ac3"/>
</mime-type>
<mime-type type="audio/vnd.dts">
<comment>DTS audio</comment>
- <comment xml:lang="af">DTS-oudio</comment>
- <comment xml:lang="bg">Аудио — DTS</comment>
- <comment xml:lang="ca">àudio DTS</comment>
- <comment xml:lang="cs">zvuk DTS</comment>
- <comment xml:lang="da">DTS-lyd</comment>
- <comment xml:lang="de">DTS-Audio</comment>
- <comment xml:lang="el">Ήχος DTS</comment>
- <comment xml:lang="en-GB">DTS audio</comment>
- <comment xml:lang="es">audio DTS</comment>
- <comment xml:lang="eu">DTS audioa</comment>
- <comment xml:lang="fi">DTS-ääni</comment>
- <comment xml:lang="fr">audio DTS</comment>
- <comment xml:lang="fur">audio DTS</comment>
- <comment xml:lang="ga">fuaim DTS</comment>
- <comment xml:lang="gl">Son DTS</comment>
- <comment xml:lang="he">שמע DTS</comment>
- <comment xml:lang="hr">DTS zvučni zapis</comment>
- <comment xml:lang="hu">DTS hang</comment>
- <comment xml:lang="ia">Audio DTS</comment>
- <comment xml:lang="id">Audio DTS</comment>
- <comment xml:lang="it">Audio DTS</comment>
- <comment xml:lang="ja">DTS オーディオ</comment>
- <comment xml:lang="kk">DTS аудиосы</comment>
- <comment xml:lang="ko">DTS 오디오</comment>
- <comment xml:lang="lv">DTS audio</comment>
- <comment xml:lang="oc">àudio DTS</comment>
- <comment xml:lang="pl">Plik dźwiękowy DTS</comment>
- <comment xml:lang="pt">aúdio DTS</comment>
- <comment xml:lang="pt-BR">Áudio DTS</comment>
- <comment xml:lang="ru">Аудио DTS</comment>
- <comment xml:lang="sk">Zvuk DTS</comment>
- <comment xml:lang="sl">Zvok DTS</comment>
- <comment xml:lang="sr">ДТС звук</comment>
- <comment xml:lang="sv">DTS-ljud</comment>
- <comment xml:lang="tr">DTS sesi</comment>
+ <comment xml:lang="zh_TW">DTS 音訊</comment>
+ <comment xml:lang="zh_CN">DTS 音频</comment>
<comment xml:lang="uk">звукові дані DTS</comment>
- <comment xml:lang="zh-CN">DTS 音频</comment>
- <comment xml:lang="zh-TW">DTS 音訊</comment>
- <magic priority="50">
- <match type="big32" value="0x7FFE8001" offset="0"/> <!-- 16bits core be -->
- <match type="little32" value="0xFE7F0180" offset="0"/> <!-- 16bits core le -->
- <match type="big32" value="0x1FFFE800" offset="0"/> <!-- 14bits core be -->
- <match type="little32" value="0xFF1F00E8" offset="0"/> <!-- 14bits core le -->
+ <comment xml:lang="tr">DTS sesi</comment>
+ <comment xml:lang="sv">DTS-ljud</comment>
+ <comment xml:lang="sr">ДТС звук</comment>
+ <comment xml:lang="sq">audio DTS</comment>
+ <comment xml:lang="sl">Zvok DTS</comment>
+ <comment xml:lang="si">DTS ශ්රව්ය</comment>
+ <comment xml:lang="sk">Zvuk DTS</comment>
+ <comment xml:lang="ru">Аудио DTS</comment>
+ <comment xml:lang="pt_BR">Áudio DTS</comment>
+ <comment xml:lang="pt">aúdio DTS</comment>
+ <comment xml:lang="pl">Plik dźwiękowy DTS</comment>
+ <comment xml:lang="oc">àudio DTS</comment>
+ <comment xml:lang="nl">DTS-audio</comment>
+ <comment xml:lang="lv">DTS audio</comment>
+ <comment xml:lang="ko">DTS 오디오</comment>
+ <comment xml:lang="kk">DTS аудиосы</comment>
+ <comment xml:lang="ja">DTS オーディオ</comment>
+ <comment xml:lang="it">Audio DTS</comment>
+ <comment xml:lang="is">DTS hljóðskrá</comment>
+ <comment xml:lang="id">Audio DTS</comment>
+ <comment xml:lang="ia">Audio DTS</comment>
+ <comment xml:lang="hu">DTS hang</comment>
+ <comment xml:lang="hr">DTS zvučni zapis</comment>
+ <comment xml:lang="he">שמע DTS</comment>
+ <comment xml:lang="gl">Son DTS</comment>
+ <comment xml:lang="ga">fuaim DTS</comment>
+ <comment xml:lang="fur">audio DTS</comment>
+ <comment xml:lang="fr">audio DTS</comment>
+ <comment xml:lang="fi">DTS-ääni</comment>
+ <comment xml:lang="eu">DTS audioa</comment>
+ <comment xml:lang="es">sonido DTS</comment>
+ <comment xml:lang="en_GB">DTS audio</comment>
+ <comment xml:lang="el">Ήχος DTS</comment>
+ <comment xml:lang="de">DTS-Audio</comment>
+ <comment xml:lang="da">DTS-lyd</comment>
+ <comment xml:lang="cs">zvuk DTS</comment>
+ <comment xml:lang="ca">àudio DTS</comment>
+ <comment xml:lang="bg">Аудио — DTS</comment>
+ <comment xml:lang="be">аўдыя DTS</comment>
+ <comment xml:lang="ar">صوت DTS</comment>
+ <comment xml:lang="af">DTS-oudio</comment>
+ <acronym>DTS</acronym>
+ <expanded-acronym>Digital Theater Systems</expanded-acronym>
+ <magic>
+ <match type="big32" value="0x7FFE8001" offset="0"/>
+ <!-- 16bits core be -->
+ <match type="little32" value="0xFE7F0180" offset="0"/>
+ <!-- 16bits core le -->
+ <match type="big32" value="0x1FFFE800" offset="0"/>
+ <!-- 14bits core be -->
+ <match type="little32" value="0xFF1F00E8" offset="0"/>
+ <!-- 14bits core le -->
</magic>
<alias type="audio/x-dts"/>
<glob pattern="*.dts"/>
</mime-type>
<mime-type type="audio/vnd.dts.hd">
- <comment>DTSHD audio</comment>
- <comment xml:lang="af">DTSHD-oudio</comment>
- <comment xml:lang="bg">Аудио — DTSHD</comment>
- <comment xml:lang="ca">àudio DTSHD</comment>
- <comment xml:lang="cs">zvuk DTSHD</comment>
- <comment xml:lang="da">DTSDH-lyd</comment>
- <comment xml:lang="de">DTSHD-Audio</comment>
- <comment xml:lang="el">Ήχος DTSHD</comment>
- <comment xml:lang="en-GB">DTSHD audio</comment>
- <comment xml:lang="es">audio DTSHD</comment>
- <comment xml:lang="eu">DTSHD audioa</comment>
+ <comment>DTS-HD audio</comment>
+ <comment xml:lang="zh_TW">DTS-HD 音訊</comment>
+ <comment xml:lang="zh_CN">DTS-HD 音频</comment>
+ <comment xml:lang="uk">звукові дані DTS-HD</comment>
+ <comment xml:lang="tr">DTS-HD sesi</comment>
+ <comment xml:lang="sv">DTS-HD-ljud</comment>
+ <comment xml:lang="sl">Zvok DTS-HD</comment>
+ <comment xml:lang="si">DTS-HD ශ්රව්ය</comment>
+ <comment xml:lang="ru">Аудио DTS-HD</comment>
+ <comment xml:lang="pt_BR">Áudio DTS-HD</comment>
+ <comment xml:lang="pl">Plik dźwiękowy DTS-HD</comment>
+ <comment xml:lang="nl">DTS-HD-audio</comment>
+ <comment xml:lang="ko">DTS-HD 오디오</comment>
+ <comment xml:lang="kk">DTS-HD аудиосы</comment>
+ <comment xml:lang="ja">DTS-HD オーディオ</comment>
+ <comment xml:lang="it">Audio DTS-HD</comment>
+ <comment xml:lang="hr">DTS-HD zvučni zapis</comment>
<comment xml:lang="fi">DTS-HD-ääni</comment>
- <comment xml:lang="fr">audio DTSHD</comment>
- <comment xml:lang="fur">audio DTSHD</comment>
- <comment xml:lang="ga">fuaim DTSHD</comment>
- <comment xml:lang="gl">Son DTSHD</comment>
- <comment xml:lang="he">שמע DTSHD</comment>
- <comment xml:lang="hr">DTSHD zvučni zapis</comment>
- <comment xml:lang="hu">DTSHD hang</comment>
- <comment xml:lang="ia">Audio DTSHD</comment>
- <comment xml:lang="id">Audio DTSHD</comment>
- <comment xml:lang="it">Audio DTSHD</comment>
- <comment xml:lang="ja">DTSHD オーディオ</comment>
- <comment xml:lang="kk">DTSHD аудиосы</comment>
- <comment xml:lang="ko">DTSHD 오디오</comment>
- <comment xml:lang="lv">DTSHD audio</comment>
- <comment xml:lang="oc">àudio DTSHD</comment>
- <comment xml:lang="pl">Plik dźwiękowy DTSHD</comment>
- <comment xml:lang="pt">áudio DTSHD</comment>
- <comment xml:lang="pt-BR">Áudio DTSHD</comment>
- <comment xml:lang="ru">Аудио DTSHD</comment>
- <comment xml:lang="sk">Zvuk DTSHD</comment>
- <comment xml:lang="sl">Zvok DTSHD</comment>
- <comment xml:lang="sr">ДТСХД звук</comment>
- <comment xml:lang="sv">DTSHD-ljud</comment>
- <comment xml:lang="tr">DTSHD sesi</comment>
- <comment xml:lang="uk">звукові дані DTSHD</comment>
- <comment xml:lang="zh-CN">DTSHD 音频</comment>
- <comment xml:lang="zh-TW">DTSHD 音訊</comment>
+ <comment xml:lang="eu">DTS-HD audioa</comment>
+ <comment xml:lang="es">sonido DTS-HD</comment>
+ <comment xml:lang="en_GB">DTS-HD audio</comment>
+ <comment xml:lang="de">DTS-HD-Audio</comment>
+ <comment xml:lang="be">аўдыя DTS-HD</comment>
+ <comment xml:lang="ar">صوت DTS-HD</comment>
+ <acronym>DTS-HD</acronym>
+ <expanded-acronym>Digital Theater Systems High Definition</expanded-acronym>
<sub-class-of type="audio/vnd.dts"/>
<magic priority="60">
- <match type="big32" value="0x64582025" offset="0:18725"/> <!-- 16bits HD be -->
+ <match type="big32" value="0x7FFE8001" offset="0">
+ <!-- 16bits core be -->
+ <match type="big32" value="0x64582025" offset="4:18725"/>
+ <!-- 16bits HD be -->
+ </match>
</magic>
<alias type="audio/x-dtshd"/>
<glob pattern="*.dtshd"/>
</mime-type>
<mime-type type="audio/AMR">
<comment>AMR audio</comment>
- <comment xml:lang="af">AMR-oudio</comment>
- <comment xml:lang="ar">AMR سمعي</comment>
- <comment xml:lang="be-Latn">Aŭdyjo AMR</comment>
- <comment xml:lang="bg">Аудио — AMR</comment>
- <comment xml:lang="ca">àudio AMR</comment>
- <comment xml:lang="cs">zvuk AMR</comment>
- <comment xml:lang="da">AMR-lyd</comment>
- <comment xml:lang="de">AMR-Audio</comment>
- <comment xml:lang="el">Ήχος AMR</comment>
- <comment xml:lang="en-GB">AMR audio</comment>
- <comment xml:lang="eo">AMR-sondosiero</comment>
- <comment xml:lang="es">audio AMR</comment>
- <comment xml:lang="eu">AMR audioa</comment>
- <comment xml:lang="fi">AMR-ääni</comment>
- <comment xml:lang="fo">AMR ljóður</comment>
- <comment xml:lang="fr">audio AMR</comment>
- <comment xml:lang="fur">audio AMR</comment>
- <comment xml:lang="ga">fuaim AMR</comment>
- <comment xml:lang="gl">son AMR</comment>
- <comment xml:lang="he">שמע AMR</comment>
- <comment xml:lang="hr">AMR zvučni zapis</comment>
- <comment xml:lang="hu">AMR hang</comment>
- <comment xml:lang="ia">Audio AMR</comment>
- <comment xml:lang="id">Audio AMR</comment>
- <comment xml:lang="it">Audio AMR</comment>
- <comment xml:lang="ja">AMR オーディオ</comment>
- <comment xml:lang="ka">AMR აუდიო</comment>
- <comment xml:lang="kk">AMR аудиосы</comment>
- <comment xml:lang="ko">AMR 오디오</comment>
- <comment xml:lang="lt">AMR garso įrašas</comment>
- <comment xml:lang="lv">AMR audio</comment>
- <comment xml:lang="nb">AMR-lyd</comment>
- <comment xml:lang="nl">AMR-audio</comment>
- <comment xml:lang="nn">AMR-lyd</comment>
- <comment xml:lang="oc">àudio AMR</comment>
- <comment xml:lang="pl">Plik dźwiękowy AMR</comment>
- <comment xml:lang="pt">áudio AMR</comment>
- <comment xml:lang="pt-BR">Áudio AMR</comment>
- <comment xml:lang="ro">Audio AMR</comment>
- <comment xml:lang="ru">Аудио AMR</comment>
- <comment xml:lang="sk">Zvuk AMR</comment>
- <comment xml:lang="sl">Zvočna datoteka AMR</comment>
- <comment xml:lang="sq">Audio AMR</comment>
- <comment xml:lang="sr">АМР звук</comment>
- <comment xml:lang="sv">AMR-ljud</comment>
- <comment xml:lang="tr">AMR sesi</comment>
- <comment xml:lang="uk">звук AMR</comment>
+ <comment xml:lang="zh_TW">AMR 音訊</comment>
+ <comment xml:lang="zh_CN">AMR 音频</comment>
<comment xml:lang="vi">Âm thanh AMR</comment>
- <comment xml:lang="zh-CN">AMR 音频</comment>
- <comment xml:lang="zh-TW">AMR 音訊</comment>
+ <comment xml:lang="uk">звук AMR</comment>
+ <comment xml:lang="tr">AMR sesi</comment>
+ <comment xml:lang="sv">AMR-ljud</comment>
+ <comment xml:lang="sr">АМР звук</comment>
+ <comment xml:lang="sq">audio AMR</comment>
+ <comment xml:lang="sl">Zvočna datoteka AMR</comment>
+ <comment xml:lang="si">AMR ශ්‍රව්‍ය</comment>
+ <comment xml:lang="sk">Zvuk AMR</comment>
+ <comment xml:lang="ru">Аудио AMR</comment>
+ <comment xml:lang="ro">Audio AMR</comment>
+ <comment xml:lang="pt_BR">Áudio AMR</comment>
+ <comment xml:lang="pt">áudio AMR</comment>
+ <comment xml:lang="pl">Plik dźwiękowy AMR</comment>
+ <comment xml:lang="oc">àudio AMR</comment>
+ <comment xml:lang="nn">AMR-lyd</comment>
+ <comment xml:lang="nl">AMR-audio</comment>
+ <comment xml:lang="nb">AMR-lyd</comment>
+ <comment xml:lang="lv">AMR audio</comment>
+ <comment xml:lang="lt">AMR garso įrašas</comment>
+ <comment xml:lang="ko">AMR 오디오</comment>
+ <comment xml:lang="kk">AMR аудиосы</comment>
+ <comment xml:lang="ka">AMR აუდიო</comment>
+ <comment xml:lang="ja">AMR オーディオ</comment>
+ <comment xml:lang="it">Audio AMR</comment>
+ <comment xml:lang="is">AMR hljóðskrá</comment>
+ <comment xml:lang="id">Audio AMR</comment>
+ <comment xml:lang="ia">Audio AMR</comment>
+ <comment xml:lang="hu">AMR hang</comment>
+ <comment xml:lang="hr">AMR zvučni zapis</comment>
+ <comment xml:lang="he">שמע AMR</comment>
+ <comment xml:lang="gl">son AMR</comment>
+ <comment xml:lang="ga">fuaim AMR</comment>
+ <comment xml:lang="fur">audio AMR</comment>
+ <comment xml:lang="fr">audio AMR</comment>
+ <comment xml:lang="fo">AMR ljóður</comment>
+ <comment xml:lang="fi">AMR-ääni</comment>
+ <comment xml:lang="eu">AMR audioa</comment>
+ <comment xml:lang="es">sonido AMR</comment>
+ <comment xml:lang="eo">AMR-sondosiero</comment>
+ <comment xml:lang="en_GB">AMR audio</comment>
+ <comment xml:lang="el">Ήχος AMR</comment>
+ <comment xml:lang="de">AMR-Audio</comment>
+ <comment xml:lang="da">AMR-lyd</comment>
+ <comment xml:lang="cs">zvuk AMR</comment>
+ <comment xml:lang="ca">àudio AMR</comment>
+ <comment xml:lang="bg">Аудио — AMR</comment>
+ <comment xml:lang="be@latin">Aŭdyjo AMR</comment>
+ <comment xml:lang="be">аўдыя AMR</comment>
+ <comment xml:lang="ar">صوت AMR</comment>
+ <comment xml:lang="af">AMR-oudio</comment>
<acronym>AMR</acronym>
<expanded-acronym>Adaptive Multi-Rate</expanded-acronym>
- <magic priority="50">
+ <magic>
<match type="string" value="#!AMR\n" offset="0"/>
<match type="string" value="#!AMR_MC1.0\n" offset="0"/>
</magic>
@@ -23151,59 +24164,62 @@ command to generate the output files.
</mime-type>
<mime-type type="audio/AMR-WB">
<comment>AMR-WB audio</comment>
- <comment xml:lang="af">AMR-WB-oudio</comment>
- <comment xml:lang="ar">AMR-WB سمعي</comment>
- <comment xml:lang="be-Latn">Aŭdyjo AMR-WB</comment>
- <comment xml:lang="bg">Аудио — AMR-WB</comment>
- <comment xml:lang="ca">àudio AMR-WB</comment>
- <comment xml:lang="cs">zvuk AMR-WB</comment>
- <comment xml:lang="da">AMR-WB-lyd</comment>
- <comment xml:lang="de">AMR-WB-Audio</comment>
- <comment xml:lang="el">Ήχος AMR-WB</comment>
- <comment xml:lang="en-GB">AMR-WB audio</comment>
- <comment xml:lang="eo">AMR-WB-sondosiero</comment>
- <comment xml:lang="es">audio AMR-WB</comment>
- <comment xml:lang="eu">AMR-WB audioa</comment>
- <comment xml:lang="fi">AMR-WB-ääni</comment>
- <comment xml:lang="fo">AMR-WB ljóður</comment>
- <comment xml:lang="fr">audio AMR-WB</comment>
- <comment xml:lang="fur">audio AMR-WB</comment>
- <comment xml:lang="ga">fuaim AMR-WB</comment>
- <comment xml:lang="gl">son AMR-WB</comment>
- <comment xml:lang="he">שמע AMR-WN</comment>
- <comment xml:lang="hr">AMR-WB zvučni zapis</comment>
- <comment xml:lang="hu">AMR-WB hang</comment>
- <comment xml:lang="ia">Audio AMR-WB</comment>
- <comment xml:lang="id">Audio AMR-WB</comment>
- <comment xml:lang="it">Audio AMR-WB</comment>
- <comment xml:lang="ja">AMR-WB オーディオ</comment>
- <comment xml:lang="ka">AMR-WB აუდიო</comment>
- <comment xml:lang="kk">AMR-WB аудиосы</comment>
- <comment xml:lang="ko">AMR-WB 오디오</comment>
- <comment xml:lang="lt">AMR-WB garso įrašas</comment>
- <comment xml:lang="lv">AMR-WB audio</comment>
- <comment xml:lang="nb">AMR-WB-lyd</comment>
- <comment xml:lang="nl">AMR-WB-audio</comment>
- <comment xml:lang="nn">AMR-WB-lyd</comment>
- <comment xml:lang="oc">àudio AMR-WB</comment>
- <comment xml:lang="pl">Plik dźwiękowy AMR-WB</comment>
- <comment xml:lang="pt">áudio AMR-WB</comment>
- <comment xml:lang="pt-BR">Áudio AMR-WB</comment>
- <comment xml:lang="ro">Audio AMR-WB</comment>
- <comment xml:lang="ru">Аудио AMR-WB</comment>
- <comment xml:lang="sk">Zvuk AMR-WB</comment>
- <comment xml:lang="sl">Zvočna datoteka AMR-WB</comment>
- <comment xml:lang="sq">Audio AMR-WB</comment>
- <comment xml:lang="sr">АМР-ВБ звук</comment>
- <comment xml:lang="sv">AMR-WB-ljud</comment>
- <comment xml:lang="tr">AMR-WB sesi</comment>
- <comment xml:lang="uk">звук AMR-WB</comment>
+ <comment xml:lang="zh_TW">AMR-WB 音訊</comment>
+ <comment xml:lang="zh_CN">AMR-WB 音频</comment>
<comment xml:lang="vi">Âm thanh AMR-WB</comment>
- <comment xml:lang="zh-CN">AMR-WB 音频</comment>
- <comment xml:lang="zh-TW">AMR-WB 音訊</comment>
+ <comment xml:lang="uk">звук AMR-WB</comment>
+ <comment xml:lang="tr">AMR-WB sesi</comment>
+ <comment xml:lang="sv">AMR-WB-ljud</comment>
+ <comment xml:lang="sr">АМР-ВБ звук</comment>
+ <comment xml:lang="sq">audio AMR-WB</comment>
+ <comment xml:lang="sl">Zvočna datoteka AMR-WB</comment>
+ <comment xml:lang="si">AMR-WB ශ්‍රව්‍ය</comment>
+ <comment xml:lang="sk">Zvuk AMR-WB</comment>
+ <comment xml:lang="ru">Аудио AMR-WB</comment>
+ <comment xml:lang="ro">Audio AMR-WB</comment>
+ <comment xml:lang="pt_BR">Áudio AMR-WB</comment>
+ <comment xml:lang="pt">áudio AMR-WB</comment>
+ <comment xml:lang="pl">Plik dźwiękowy AMR-WB</comment>
+ <comment xml:lang="oc">àudio AMR-WB</comment>
+ <comment xml:lang="nn">AMR-WB-lyd</comment>
+ <comment xml:lang="nl">AMR-WB-audio</comment>
+ <comment xml:lang="nb">AMR-WB-lyd</comment>
+ <comment xml:lang="lv">AMR-WB audio</comment>
+ <comment xml:lang="lt">AMR-WB garso įrašas</comment>
+ <comment xml:lang="ko">AMR-WB 오디오</comment>
+ <comment xml:lang="kk">AMR-WB аудиосы</comment>
+ <comment xml:lang="ka">AMR-WB აუდიო</comment>
+ <comment xml:lang="ja">AMR-WB オーディオ</comment>
+ <comment xml:lang="it">Audio AMR-WB</comment>
+ <comment xml:lang="is">AMR-WB hljóðskrá</comment>
+ <comment xml:lang="id">Audio AMR-WB</comment>
+ <comment xml:lang="ia">Audio AMR-WB</comment>
+ <comment xml:lang="hu">AMR-WB hang</comment>
+ <comment xml:lang="hr">AMR-WB zvučni zapis</comment>
+ <comment xml:lang="he">שמע AMR-WN</comment>
+ <comment xml:lang="gl">son AMR-WB</comment>
+ <comment xml:lang="ga">fuaim AMR-WB</comment>
+ <comment xml:lang="fur">audio AMR-WB</comment>
+ <comment xml:lang="fr">audio AMR-WB</comment>
+ <comment xml:lang="fo">AMR-WB ljóður</comment>
+ <comment xml:lang="fi">AMR-WB-ääni</comment>
+ <comment xml:lang="eu">AMR-WB audioa</comment>
+ <comment xml:lang="es">sonido AMR-WB</comment>
+ <comment xml:lang="eo">AMR-WB-sondosiero</comment>
+ <comment xml:lang="en_GB">AMR-WB audio</comment>
+ <comment xml:lang="el">Ήχος AMR-WB</comment>
+ <comment xml:lang="de">AMR-WB-Audio</comment>
+ <comment xml:lang="da">AMR-WB-lyd</comment>
+ <comment xml:lang="cs">zvuk AMR-WB</comment>
+ <comment xml:lang="ca">àudio AMR-WB</comment>
+ <comment xml:lang="bg">Аудио — AMR-WB</comment>
+ <comment xml:lang="be@latin">Aŭdyjo AMR-WB</comment>
+ <comment xml:lang="be">аўдыя AMR-WB</comment>
+ <comment xml:lang="ar">صوت AMR-WB</comment>
+ <comment xml:lang="af">AMR-WB-oudio</comment>
<acronym>AMR-WB</acronym>
<expanded-acronym>Adaptive Multi-Rate Wideband</expanded-acronym>
- <magic priority="50">
+ <magic>
<match type="string" value="#!AMR-WB\n" offset="0"/>
<match type="string" value="#!AMR-WB_MC1.0\n" offset="0"/>
</magic>
@@ -23212,58 +24228,61 @@ command to generate the output files.
</mime-type>
<mime-type type="audio/basic">
<comment>ULAW (Sun) audio</comment>
- <comment xml:lang="af">ULAW- (Sun) oudio</comment>
- <comment xml:lang="ar">ULAW (صن) سمعي</comment>
- <comment xml:lang="az">ULAW (Sun) audio faylı</comment>
- <comment xml:lang="be-Latn">Aŭdyjo ULAW (Sun)</comment>
- <comment xml:lang="bg">Аудио — ULAW, Sun</comment>
- <comment xml:lang="ca">àudio ULAW (Sun)</comment>
- <comment xml:lang="cs">zvuk ULAW (Sun)</comment>
- <comment xml:lang="cy">Sain ULAW (Sun)</comment>
- <comment xml:lang="da">ULAW-lyd (Sun)</comment>
- <comment xml:lang="de">ULAW-Audio (Sun)</comment>
- <comment xml:lang="el">Ήχος ULAW (Sun)</comment>
- <comment xml:lang="en-GB">ULAW (Sun) audio</comment>
- <comment xml:lang="eo">ULAW-sondosiero (Sun)</comment>
- <comment xml:lang="es">audio ULAW (Sun)</comment>
- <comment xml:lang="eu">ULAW (sun) audioa</comment>
- <comment xml:lang="fi">ULAW (Sun) -ääni</comment>
- <comment xml:lang="fo">ULAW (Sun) ljóður</comment>
- <comment xml:lang="fr">audio ULAW (Sun)</comment>
- <comment xml:lang="fur">audio ULAW (Sun)</comment>
- <comment xml:lang="ga">fuaim ULAW (Sun)</comment>
- <comment xml:lang="gl">son ULAW (Sun)</comment>
- <comment xml:lang="he">שמע ULAW (של Sun)</comment>
- <comment xml:lang="hr">ULAW (Sun) zvučni zapis</comment>
- <comment xml:lang="hu">ULAW (Sun) hang</comment>
- <comment xml:lang="ia">Audio ULAW (sun)</comment>
- <comment xml:lang="id">Audio ULAW (Sun)</comment>
- <comment xml:lang="it">Audio ULAW (Sun)</comment>
- <comment xml:lang="ja">ULAW (Sun) オーディオ</comment>
- <comment xml:lang="kk">ULAW (Sun) аудиосы</comment>
- <comment xml:lang="ko">ULAW(Sun) 오디오</comment>
- <comment xml:lang="lt">ULAW (Sun) garso įrašas</comment>
- <comment xml:lang="lv">ULAW (Sun) audio</comment>
- <comment xml:lang="ms">Audio ULAW (Sun)</comment>
- <comment xml:lang="nb">ULAW-lyd (Sun)</comment>
- <comment xml:lang="nl">(Sun) ULAW-audio</comment>
- <comment xml:lang="nn">ULAW (Sun)-lyd</comment>
- <comment xml:lang="oc">àudio ULAW (Sun)</comment>
- <comment xml:lang="pl">Plik dźwiękowy ULAW (Sun)</comment>
- <comment xml:lang="pt">áudio ULAW (Sun)</comment>
- <comment xml:lang="pt-BR">Áudio ULAW (Sun)</comment>
- <comment xml:lang="ro">Fișier audio ULAW (Sun)</comment>
- <comment xml:lang="ru">Аудио ULAW (Sun)</comment>
- <comment xml:lang="sk">Zvuk ULAW (Sun)</comment>
- <comment xml:lang="sl">Zvočna datoteka ULAW (Sun)</comment>
- <comment xml:lang="sq">Audio ULAW (Sun)</comment>
- <comment xml:lang="sr">УЛАВ (Сан) звук</comment>
- <comment xml:lang="sv">ULAW-ljud (Sun)</comment>
- <comment xml:lang="tr">ULAW (Sun) sesi</comment>
- <comment xml:lang="uk">звук ULAW (Sun)</comment>
+ <comment xml:lang="zh_TW">ULAW (Sun) 音訊</comment>
+ <comment xml:lang="zh_CN">ULAW (Sun) 音频</comment>
<comment xml:lang="vi">Âm thanh ULAW (Sun)</comment>
- <comment xml:lang="zh-CN">ULAW (Sun) 音频</comment>
- <comment xml:lang="zh-TW">ULAW (Sun) 音訊</comment>
+ <comment xml:lang="uk">звук ULAW (Sun)</comment>
+ <comment xml:lang="tr">ULAW (Sun) sesi</comment>
+ <comment xml:lang="sv">ULAW-ljud (Sun)</comment>
+ <comment xml:lang="sr">УЛАВ (Сан) звук</comment>
+ <comment xml:lang="sq">audio ULAW (Sun)</comment>
+ <comment xml:lang="sl">Zvočna datoteka ULAW (Sun)</comment>
+ <comment xml:lang="si">ULAW (හිරු) ශ්‍රව්‍ය</comment>
+ <comment xml:lang="sk">Zvuk ULAW (Sun)</comment>
+ <comment xml:lang="ru">Аудио ULAW (Sun)</comment>
+ <comment xml:lang="ro">Fișier audio ULAW (Sun)</comment>
+ <comment xml:lang="pt_BR">Áudio ULAW (Sun)</comment>
+ <comment xml:lang="pt">áudio ULAW (Sun)</comment>
+ <comment xml:lang="pl">Plik dźwiękowy ULAW (Sun)</comment>
+ <comment xml:lang="oc">àudio ULAW (Sun)</comment>
+ <comment xml:lang="nn">ULAW (Sun)-lyd</comment>
+ <comment xml:lang="nl">(Sun) ULAW-audio</comment>
+ <comment xml:lang="nb">ULAW-lyd (Sun)</comment>
+ <comment xml:lang="ms">Audio ULAW (Sun)</comment>
+ <comment xml:lang="lv">ULAW (Sun) audio</comment>
+ <comment xml:lang="lt">ULAW (Sun) garso įrašas</comment>
+ <comment xml:lang="ko">ULAW(Sun) 오디오</comment>
+ <comment xml:lang="kk">ULAW (Sun) аудиосы</comment>
+ <comment xml:lang="ja">ULAW (Sun) オーディオ</comment>
+ <comment xml:lang="it">Audio ULAW (Sun)</comment>
+ <comment xml:lang="is">ULAW (Sun) hljóðskrá</comment>
+ <comment xml:lang="id">Audio ULAW (Sun)</comment>
+ <comment xml:lang="ia">Audio ULAW (sun)</comment>
+ <comment xml:lang="hu">ULAW (Sun) hang</comment>
+ <comment xml:lang="hr">ULAW (Sun) zvučni zapis</comment>
+ <comment xml:lang="he">שמע ULAW (של Sun)</comment>
+ <comment xml:lang="gl">son ULAW (Sun)</comment>
+ <comment xml:lang="ga">fuaim ULAW (Sun)</comment>
+ <comment xml:lang="fur">audio ULAW (Sun)</comment>
+ <comment xml:lang="fr">audio ULAW (Sun)</comment>
+ <comment xml:lang="fo">ULAW (Sun) ljóður</comment>
+ <comment xml:lang="fi">ULAW (Sun) -ääni</comment>
+ <comment xml:lang="eu">ULAW (sun) audioa</comment>
+ <comment xml:lang="es">sonido ULAW (Sun)</comment>
+ <comment xml:lang="eo">ULAW-sondosiero (Sun)</comment>
+ <comment xml:lang="en_GB">ULAW (Sun) audio</comment>
+ <comment xml:lang="el">Ήχος ULAW (Sun)</comment>
+ <comment xml:lang="de">ULAW-Audio (Sun)</comment>
+ <comment xml:lang="da">ULAW-lyd (Sun)</comment>
+ <comment xml:lang="cy">Sain ULAW (Sun)</comment>
+ <comment xml:lang="cs">zvuk ULAW (Sun)</comment>
+ <comment xml:lang="ca">àudio ULAW (Sun)</comment>
+ <comment xml:lang="bg">Аудио — ULAW, Sun</comment>
+ <comment xml:lang="be@latin">Aŭdyjo ULAW (Sun)</comment>
+ <comment xml:lang="be">аўдыя ULAW (Sun)</comment>
+ <comment xml:lang="az">ULAW (Sun) audio faylı</comment>
+ <comment xml:lang="ar">صوت ULAW (صن)</comment>
+ <comment xml:lang="af">ULAW- (Sun) oudio</comment>
<magic priority="40">
<match type="string" value=".snd" offset="0"/>
</magic>
@@ -23272,58 +24291,61 @@ command to generate the output files.
</mime-type>
<mime-type type="audio/prs.sid">
<comment>Commodore 64 audio</comment>
- <comment xml:lang="af">Commodore 64-oudio</comment>
- <comment xml:lang="ar">Commodore 64 سمعي</comment>
- <comment xml:lang="be-Latn">Aŭdyjo Commodore 64</comment>
- <comment xml:lang="bg">Аудио — Commodore 64</comment>
- <comment xml:lang="ca">àudio de Commodore 64</comment>
- <comment xml:lang="cs">zvuk Commodore 64</comment>
- <comment xml:lang="da">Commodore 64-lyd</comment>
- <comment xml:lang="de">Commodore-64-Audio</comment>
- <comment xml:lang="el">Ήχος Commodore 64</comment>
- <comment xml:lang="en-GB">Commodore 64 audio</comment>
- <comment xml:lang="eo">Sondosiero de Commodore 64</comment>
- <comment xml:lang="es">audio de Commodore 64</comment>
- <comment xml:lang="eu">Commodore 64 Audioa</comment>
- <comment xml:lang="fi">Commodore 64 -ääni</comment>
- <comment xml:lang="fo">Commodore 64 ljóð</comment>
- <comment xml:lang="fr">audio Commodore 64</comment>
- <comment xml:lang="fur">audio Commodore 64</comment>
- <comment xml:lang="ga">fuaim Commodore 64</comment>
- <comment xml:lang="gl">son de Commodore 64</comment>
- <comment xml:lang="he">שמע של Commodore 64</comment>
- <comment xml:lang="hr">Commodore 64 zvučni zapis</comment>
- <comment xml:lang="hu">Commodore 64 hang</comment>
- <comment xml:lang="ia">Audio Commodore 64</comment>
- <comment xml:lang="id">Audio Commodore 64</comment>
- <comment xml:lang="it">Audio Commodore 64</comment>
- <comment xml:lang="ja">Commodore 64 オーディオ</comment>
- <comment xml:lang="ka">Commodore 64-ის აუდიო</comment>
- <comment xml:lang="kk">Commodore 64 аудиосы</comment>
- <comment xml:lang="ko">Commodore 64 오디오</comment>
- <comment xml:lang="lt">Commodore 64 garso įrašas</comment>
- <comment xml:lang="lv">Commodore 64 audio</comment>
- <comment xml:lang="ms">Audio Commodore 64</comment>
- <comment xml:lang="nb">Commodore 64-lyd</comment>
- <comment xml:lang="nl">Commodore 64-audio</comment>
- <comment xml:lang="nn">Commodore 64-lyd</comment>
- <comment xml:lang="oc">àudio Commodore 64</comment>
- <comment xml:lang="pl">Plik dźwiękowy Commodore 64</comment>
- <comment xml:lang="pt">áudio Commodore 64</comment>
- <comment xml:lang="pt-BR">Áudio Commodore 64</comment>
- <comment xml:lang="ro">Audio Commodore 64</comment>
- <comment xml:lang="ru">Аудио Commodore 64</comment>
- <comment xml:lang="sk">Zvuk Commodore 64</comment>
- <comment xml:lang="sl">Zvočna datoteka Commodore 64</comment>
- <comment xml:lang="sq">Audio Commodore 64</comment>
- <comment xml:lang="sr">звук Комодора 64</comment>
- <comment xml:lang="sv">Commodore 64-ljud</comment>
- <comment xml:lang="tr">Commodore 64 sesi</comment>
- <comment xml:lang="uk">звук Commodore 64</comment>
+ <comment xml:lang="zh_TW">Commodore 64 音訊</comment>
+ <comment xml:lang="zh_CN">Commodore 64 音频</comment>
<comment xml:lang="vi">Âm thanh Commodore 64</comment>
- <comment xml:lang="zh-CN">Commodore 64 音频</comment>
- <comment xml:lang="zh-TW">Commodore 64 音訊</comment>
- <magic priority="50">
+ <comment xml:lang="uk">звук Commodore 64</comment>
+ <comment xml:lang="tr">Commodore 64 sesi</comment>
+ <comment xml:lang="sv">Commodore 64-ljud</comment>
+ <comment xml:lang="sr">звук Комодора 64</comment>
+ <comment xml:lang="sq">audio Commodore 64</comment>
+ <comment xml:lang="sl">Zvočna datoteka Commodore 64</comment>
+ <comment xml:lang="si">කොමදෝරු 64 ශ්‍රව්‍ය</comment>
+ <comment xml:lang="sk">Zvuk Commodore 64</comment>
+ <comment xml:lang="ru">Аудио Commodore 64</comment>
+ <comment xml:lang="ro">Audio Commodore 64</comment>
+ <comment xml:lang="pt_BR">Áudio Commodore 64</comment>
+ <comment xml:lang="pt">áudio Commodore 64</comment>
+ <comment xml:lang="pl">Plik dźwiękowy Commodore 64</comment>
+ <comment xml:lang="oc">àudio Commodore 64</comment>
+ <comment xml:lang="nn">Commodore 64-lyd</comment>
+ <comment xml:lang="nl">Commodore 64-audio</comment>
+ <comment xml:lang="nb">Commodore 64-lyd</comment>
+ <comment xml:lang="ms">Audio Commodore 64</comment>
+ <comment xml:lang="lv">Commodore 64 audio</comment>
+ <comment xml:lang="lt">Commodore 64 garso įrašas</comment>
+ <comment xml:lang="ko">Commodore 64 오디오</comment>
+ <comment xml:lang="kk">Commodore 64 аудиосы</comment>
+ <comment xml:lang="ka">Commodore 64-ის აუდიო</comment>
+ <comment xml:lang="ja">Commodore 64 オーディオ</comment>
+ <comment xml:lang="it">Audio Commodore 64</comment>
+ <comment xml:lang="is">Commodore 64 hljóðskrá</comment>
+ <comment xml:lang="id">Audio Commodore 64</comment>
+ <comment xml:lang="ia">Audio Commodore 64</comment>
+ <comment xml:lang="hu">Commodore 64 hang</comment>
+ <comment xml:lang="hr">Commodore 64 zvučni zapis</comment>
+ <comment xml:lang="he">שמע של Commodore 64</comment>
+ <comment xml:lang="gl">son de Commodore 64</comment>
+ <comment xml:lang="ga">fuaim Commodore 64</comment>
+ <comment xml:lang="fur">audio Commodore 64</comment>
+ <comment xml:lang="fr">audio Commodore 64</comment>
+ <comment xml:lang="fo">Commodore 64 ljóð</comment>
+ <comment xml:lang="fi">Commodore 64 -ääni</comment>
+ <comment xml:lang="eu">Commodore 64 Audioa</comment>
+ <comment xml:lang="es">sonido de Commodore 64</comment>
+ <comment xml:lang="eo">Sondosiero de Commodore 64</comment>
+ <comment xml:lang="en_GB">Commodore 64 audio</comment>
+ <comment xml:lang="el">Ήχος Commodore 64</comment>
+ <comment xml:lang="de">Commodore-64-Audio</comment>
+ <comment xml:lang="da">Commodore 64-lyd</comment>
+ <comment xml:lang="cs">zvuk Commodore 64</comment>
+ <comment xml:lang="ca">àudio de Commodore 64</comment>
+ <comment xml:lang="bg">Аудио — Commodore 64</comment>
+ <comment xml:lang="be@latin">Aŭdyjo Commodore 64</comment>
+ <comment xml:lang="be">аўдыя Commodore 64</comment>
+ <comment xml:lang="ar">صوت Commodore 64</comment>
+ <comment xml:lang="af">Commodore 64-oudio</comment>
+ <magic>
<match type="string" value="PSID" offset="0"/>
</magic>
<glob pattern="*.sid"/>
@@ -23331,59 +24353,64 @@ command to generate the output files.
</mime-type>
<mime-type type="audio/x-adpcm">
<comment>PCM audio</comment>
- <comment xml:lang="af">PCM-oudio</comment>
- <comment xml:lang="ar">سمعي PCM</comment>
- <comment xml:lang="az">PCM audio faylı</comment>
- <comment xml:lang="be-Latn">Aŭdyjo PCM</comment>
- <comment xml:lang="bg">Аудио — PCM</comment>
- <comment xml:lang="ca">àudio PCM</comment>
- <comment xml:lang="cs">zvuk PCM</comment>
- <comment xml:lang="cy">Sain PCM</comment>
- <comment xml:lang="da">PCM-lyd</comment>
- <comment xml:lang="de">PCM-Audio</comment>
- <comment xml:lang="el">Ήχος PCM</comment>
- <comment xml:lang="en-GB">PCM audio</comment>
- <comment xml:lang="eo">PCM-sondosiero</comment>
- <comment xml:lang="es">audio PCM</comment>
- <comment xml:lang="eu">PCM audioa</comment>
- <comment xml:lang="fi">PCM-ääni</comment>
- <comment xml:lang="fo">PCM ljóður</comment>
- <comment xml:lang="fr">audio PCM</comment>
- <comment xml:lang="fur">audio PCM</comment>
- <comment xml:lang="ga">fuaim PCM</comment>
- <comment xml:lang="gl">son PCM</comment>
- <comment xml:lang="he">שמע PCM</comment>
- <comment xml:lang="hr">PCM zvučni zapis</comment>
- <comment xml:lang="hu">PCM hang</comment>
- <comment xml:lang="ia">Audio PCM</comment>
- <comment xml:lang="id">Audio PCM</comment>
- <comment xml:lang="it">Audio PCM</comment>
- <comment xml:lang="ja">PCM オーディオ</comment>
- <comment xml:lang="kk">PCM аудиосы</comment>
- <comment xml:lang="ko">PCM 오디오</comment>
- <comment xml:lang="lt">PCM garso įrašas</comment>
- <comment xml:lang="lv">PCM audio</comment>
- <comment xml:lang="ms">Audio PCM</comment>
- <comment xml:lang="nb">PCM-lyd</comment>
- <comment xml:lang="nl">PCM-audio</comment>
- <comment xml:lang="nn">PCM-lyd</comment>
- <comment xml:lang="oc">àudio PCM</comment>
- <comment xml:lang="pl">Plik dźwiękowy PCM</comment>
- <comment xml:lang="pt">áudio PCM</comment>
- <comment xml:lang="pt-BR">Áudio PCM</comment>
- <comment xml:lang="ro">Audio PCM</comment>
- <comment xml:lang="ru">Аудио PCM</comment>
- <comment xml:lang="sk">Zvuk PCM</comment>
- <comment xml:lang="sl">Zvočna datoteka PCM</comment>
- <comment xml:lang="sq">Audio PCM</comment>
- <comment xml:lang="sr">ПЦМ звук</comment>
- <comment xml:lang="sv">PCM-ljud</comment>
- <comment xml:lang="tr">PCM sesi</comment>
- <comment xml:lang="uk">звук PCM</comment>
+ <comment xml:lang="zh_TW">PCM 音訊</comment>
+ <comment xml:lang="zh_CN">PCM 音频</comment>
<comment xml:lang="vi">Âm thanh PCM</comment>
- <comment xml:lang="zh-CN">PCM 音频</comment>
- <comment xml:lang="zh-TW">PCM 音訊</comment>
- <magic priority="50">
+ <comment xml:lang="uk">звук PCM</comment>
+ <comment xml:lang="tr">PCM sesi</comment>
+ <comment xml:lang="sv">PCM-ljud</comment>
+ <comment xml:lang="sr">ПЦМ звук</comment>
+ <comment xml:lang="sq">audio PCM</comment>
+ <comment xml:lang="sl">Zvočna datoteka PCM</comment>
+ <comment xml:lang="si">PCM ශ්රව්ය</comment>
+ <comment xml:lang="sk">Zvuk PCM</comment>
+ <comment xml:lang="ru">Аудио PCM</comment>
+ <comment xml:lang="ro">Audio PCM</comment>
+ <comment xml:lang="pt_BR">Áudio PCM</comment>
+ <comment xml:lang="pt">áudio PCM</comment>
+ <comment xml:lang="pl">Plik dźwiękowy PCM</comment>
+ <comment xml:lang="oc">àudio PCM</comment>
+ <comment xml:lang="nn">PCM-lyd</comment>
+ <comment xml:lang="nl">PCM-audio</comment>
+ <comment xml:lang="nb">PCM-lyd</comment>
+ <comment xml:lang="ms">Audio PCM</comment>
+ <comment xml:lang="lv">PCM audio</comment>
+ <comment xml:lang="lt">PCM garso įrašas</comment>
+ <comment xml:lang="ko">PCM 오디오</comment>
+ <comment xml:lang="kk">PCM аудиосы</comment>
+ <comment xml:lang="ja">PCM オーディオ</comment>
+ <comment xml:lang="it">Audio PCM</comment>
+ <comment xml:lang="is">PCM hljóðskrá</comment>
+ <comment xml:lang="id">Audio PCM</comment>
+ <comment xml:lang="ia">Audio PCM</comment>
+ <comment xml:lang="hu">PCM hang</comment>
+ <comment xml:lang="hr">PCM zvučni zapis</comment>
+ <comment xml:lang="he">שמע PCM</comment>
+ <comment xml:lang="gl">son PCM</comment>
+ <comment xml:lang="ga">fuaim PCM</comment>
+ <comment xml:lang="fur">audio PCM</comment>
+ <comment xml:lang="fr">audio PCM</comment>
+ <comment xml:lang="fo">PCM ljóður</comment>
+ <comment xml:lang="fi">PCM-ääni</comment>
+ <comment xml:lang="eu">PCM audioa</comment>
+ <comment xml:lang="es">sonido PCM</comment>
+ <comment xml:lang="eo">PCM-sondosiero</comment>
+ <comment xml:lang="en_GB">PCM audio</comment>
+ <comment xml:lang="el">Ήχος PCM</comment>
+ <comment xml:lang="de">PCM-Audio</comment>
+ <comment xml:lang="da">PCM-lyd</comment>
+ <comment xml:lang="cy">Sain PCM</comment>
+ <comment xml:lang="cs">zvuk PCM</comment>
+ <comment xml:lang="ca">àudio PCM</comment>
+ <comment xml:lang="bg">Аудио — PCM</comment>
+ <comment xml:lang="be@latin">Aŭdyjo PCM</comment>
+ <comment xml:lang="be">аўдыя PCM</comment>
+ <comment xml:lang="az">PCM audio faylı</comment>
+ <comment xml:lang="ar">صوت PCM</comment>
+ <comment xml:lang="af">PCM-oudio</comment>
+ <acronym>PCM</acronym>
+ <expanded-acronym>Pulse-code Modulation</expanded-acronym>
+ <magic>
<match type="string" value=".snd" offset="0">
<match type="big32" value="23" offset="12"/>
</match>
@@ -23401,63 +24428,66 @@ command to generate the output files.
</mime-type>
<mime-type type="audio/x-aifc">
<comment>AIFC audio</comment>
- <comment xml:lang="af">AIFC-oudio</comment>
- <comment xml:lang="ar">AIFC سمعي</comment>
- <comment xml:lang="az">AIFC audio faylı</comment>
- <comment xml:lang="be-Latn">Aŭdyjo AIFC</comment>
- <comment xml:lang="bg">Аудио — AIFC</comment>
- <comment xml:lang="ca">àudio AIFC</comment>
- <comment xml:lang="cs">zvuk AIFC</comment>
- <comment xml:lang="cy">Sain AIFC</comment>
- <comment xml:lang="da">AIFC-lyd</comment>
- <comment xml:lang="de">AIFC-Audio</comment>
- <comment xml:lang="el">Ήχος AIFC</comment>
- <comment xml:lang="en-GB">AIFC audio</comment>
- <comment xml:lang="eo">AIFC-sondosiero</comment>
- <comment xml:lang="es">audio AIFC</comment>
- <comment xml:lang="eu">AIFC audioa</comment>
- <comment xml:lang="fi">AIFC-ääni</comment>
- <comment xml:lang="fo">AIFC ljóður</comment>
- <comment xml:lang="fr">audio AIFC</comment>
- <comment xml:lang="fur">audio AIFC</comment>
- <comment xml:lang="ga">fuaim AIFC</comment>
- <comment xml:lang="gl">son AIFC</comment>
- <comment xml:lang="he">שמע AIFC</comment>
- <comment xml:lang="hr">AIFC zvučni zapis</comment>
- <comment xml:lang="hu">AIFC hang</comment>
- <comment xml:lang="ia">Audio AIFC</comment>
- <comment xml:lang="id">Audio AIFC</comment>
- <comment xml:lang="it">Audio AIFC</comment>
- <comment xml:lang="ja">AIFC オーディオ</comment>
- <comment xml:lang="ka">AIFC აუდიო</comment>
- <comment xml:lang="kk">AIFC аудиосы</comment>
- <comment xml:lang="ko">AIFC 오디오</comment>
- <comment xml:lang="lt">AIFC garso įrašas</comment>
- <comment xml:lang="lv">AIFC audio</comment>
- <comment xml:lang="ms">Audio AIFC</comment>
- <comment xml:lang="nb">AIFC-lyd</comment>
- <comment xml:lang="nl">AIFC-audio</comment>
- <comment xml:lang="nn">AIFC-lyd</comment>
- <comment xml:lang="oc">àudio AIFC</comment>
- <comment xml:lang="pl">Plik dźwiękowy AIFC</comment>
- <comment xml:lang="pt">áudio AIFC</comment>
- <comment xml:lang="pt-BR">Áudio AIFC</comment>
- <comment xml:lang="ro">Fișier audio AIFC</comment>
- <comment xml:lang="ru">Аудио AIFC</comment>
- <comment xml:lang="sk">Zvuk AIFC</comment>
- <comment xml:lang="sl">Zvočna datoteka AIFC</comment>
- <comment xml:lang="sq">Audio AIFC</comment>
- <comment xml:lang="sr">АИФЦ звук</comment>
- <comment xml:lang="sv">AIFC-ljud</comment>
- <comment xml:lang="tr">AIFC sesi</comment>
- <comment xml:lang="uk">звук AIFC</comment>
+ <comment xml:lang="zh_TW">AIFC 音訊</comment>
+ <comment xml:lang="zh_CN">AIFC 音频</comment>
<comment xml:lang="vi">Âm thanh AIFC</comment>
- <comment xml:lang="zh-CN">AIFC 音频</comment>
- <comment xml:lang="zh-TW">AIFC 音訊</comment>
+ <comment xml:lang="uk">звук AIFC</comment>
+ <comment xml:lang="tr">AIFC sesi</comment>
+ <comment xml:lang="sv">AIFC-ljud</comment>
+ <comment xml:lang="sr">АИФЦ звук</comment>
+ <comment xml:lang="sq">audio AIFC</comment>
+ <comment xml:lang="sl">Zvočna datoteka AIFC</comment>
+ <comment xml:lang="si">AIFC ශ්‍රව්‍ය</comment>
+ <comment xml:lang="sk">Zvuk AIFC</comment>
+ <comment xml:lang="ru">Аудио AIFC</comment>
+ <comment xml:lang="ro">Fișier audio AIFC</comment>
+ <comment xml:lang="pt_BR">Áudio AIFC</comment>
+ <comment xml:lang="pt">áudio AIFC</comment>
+ <comment xml:lang="pl">Plik dźwiękowy AIFC</comment>
+ <comment xml:lang="oc">àudio AIFC</comment>
+ <comment xml:lang="nn">AIFC-lyd</comment>
+ <comment xml:lang="nl">AIFC-audio</comment>
+ <comment xml:lang="nb">AIFC-lyd</comment>
+ <comment xml:lang="ms">Audio AIFC</comment>
+ <comment xml:lang="lv">AIFC audio</comment>
+ <comment xml:lang="lt">AIFC garso įrašas</comment>
+ <comment xml:lang="ko">AIFC 오디오</comment>
+ <comment xml:lang="kk">AIFC аудиосы</comment>
+ <comment xml:lang="ka">AIFC აუდიო</comment>
+ <comment xml:lang="ja">AIFC オーディオ</comment>
+ <comment xml:lang="it">Audio AIFC</comment>
+ <comment xml:lang="is">AIFC hljóðskrá</comment>
+ <comment xml:lang="id">Audio AIFC</comment>
+ <comment xml:lang="ia">Audio AIFC</comment>
+ <comment xml:lang="hu">AIFC hang</comment>
+ <comment xml:lang="hr">AIFC zvučni zapis</comment>
+ <comment xml:lang="he">שמע AIFC</comment>
+ <comment xml:lang="gl">son AIFC</comment>
+ <comment xml:lang="ga">fuaim AIFC</comment>
+ <comment xml:lang="fur">audio AIFC</comment>
+ <comment xml:lang="fr">audio AIFC</comment>
+ <comment xml:lang="fo">AIFC ljóður</comment>
+ <comment xml:lang="fi">AIFC-ääni</comment>
+ <comment xml:lang="eu">AIFC audioa</comment>
+ <comment xml:lang="es">sonido AIFC</comment>
+ <comment xml:lang="eo">AIFC-sondosiero</comment>
+ <comment xml:lang="en_GB">AIFC audio</comment>
+ <comment xml:lang="el">Ήχος AIFC</comment>
+ <comment xml:lang="de">AIFC-Audio</comment>
+ <comment xml:lang="da">AIFC-lyd</comment>
+ <comment xml:lang="cy">Sain AIFC</comment>
+ <comment xml:lang="cs">zvuk AIFC</comment>
+ <comment xml:lang="ca">àudio AIFC</comment>
+ <comment xml:lang="bg">Аудио — AIFC</comment>
+ <comment xml:lang="be@latin">Aŭdyjo AIFC</comment>
+ <comment xml:lang="be">аўдыя AIFC</comment>
+ <comment xml:lang="az">AIFC audio faylı</comment>
+ <comment xml:lang="ar">صوت AIFC</comment>
+ <comment xml:lang="af">AIFC-oudio</comment>
<acronym>AIFC</acronym>
<expanded-acronym>Audio Interchange File format Compressed</expanded-acronym>
<sub-class-of type="application/x-iff"/>
- <magic priority="50">
+ <magic>
<match type="string" value="AIFC" offset="8"/>
</magic>
<glob pattern="*.aifc"/>
@@ -23466,63 +24496,66 @@ command to generate the output files.
</mime-type>
<mime-type type="audio/x-aiff">
<comment>AIFF/Amiga/Mac audio</comment>
- <comment xml:lang="af">AIFF/Amiga/Mac-oudio</comment>
- <comment xml:lang="ar">AIFF/Amiga/Mac سمعي</comment>
- <comment xml:lang="az">AIFF/Amiga/Mac audio faylı</comment>
- <comment xml:lang="be-Latn">Aŭdyjo AIFF/Amiga/Mac</comment>
- <comment xml:lang="bg">Аудио — AIFF/Amiga/Mac</comment>
- <comment xml:lang="ca">àudio AIFF/Amiga/Mac</comment>
- <comment xml:lang="cs">zvuk AIFF/Amiga/Mac</comment>
- <comment xml:lang="cy">Sain AIFF/Amiga/Mac</comment>
- <comment xml:lang="da">AIFF-/Amiga-/Mac-lyd</comment>
- <comment xml:lang="de">AIFF/Amiga/Mac-Audio</comment>
- <comment xml:lang="el">Ήχος AIFF/Amiga/Mac</comment>
- <comment xml:lang="en-GB">AIFF/Amiga/Mac audio</comment>
- <comment xml:lang="eo">AIFF/Amiga/Mac-sondosiero</comment>
- <comment xml:lang="es">audio AIFF/Amiga/Mac</comment>
- <comment xml:lang="eu">AIFF/Amiga/Mac audioa</comment>
- <comment xml:lang="fi">AIFF/Amiga/Mac-ääni</comment>
- <comment xml:lang="fo">AIFF/Amiga/Mac ljóður</comment>
- <comment xml:lang="fr">audio AIFF/Amiga/Mac</comment>
- <comment xml:lang="fur">audio AIFF/Amiga/Mac</comment>
- <comment xml:lang="ga">fuaim AIFF/Amiga/Mac</comment>
- <comment xml:lang="gl">son AIFF/Amiga/Mac</comment>
- <comment xml:lang="he">שמע AIFF/Amiga/Mac</comment>
- <comment xml:lang="hr">AIFF/Amiga/Mac zvučni zapis</comment>
- <comment xml:lang="hu">AIFF/Amiga/Mac hang</comment>
- <comment xml:lang="ia">Audio AIFF/Amiga/Mac</comment>
- <comment xml:lang="id">Audio AIFF/Amiga/Mac</comment>
- <comment xml:lang="it">Audio AIFF/Amiga/Mac</comment>
- <comment xml:lang="ja">AIFF/Amiga/Mac オーディオ</comment>
- <comment xml:lang="ka">AIFF/Amiga/Mac აუდიო</comment>
- <comment xml:lang="kk">AIFF/Amiga/Mac аудиосы</comment>
- <comment xml:lang="ko">AIFF/Amiga/Mac 오디오</comment>
- <comment xml:lang="lt">AIFF/Amiga/Mac garso įrašas</comment>
- <comment xml:lang="lv">AIFF/Amiga/Mac audio</comment>
- <comment xml:lang="ms">Audio AIFF/Amiga/Mac</comment>
- <comment xml:lang="nb">AIFF/Amiga/Mac-lyd</comment>
- <comment xml:lang="nl">AIFF/Amiga/Mac-audio</comment>
- <comment xml:lang="nn">AIFF/Amiga/Mac-lyd</comment>
- <comment xml:lang="oc">àudio AIFF/Amiga/Mac</comment>
- <comment xml:lang="pl">Plik dźwiękowy AIFF/Amiga/Mac</comment>
- <comment xml:lang="pt">áudio AIFF/Amiga/Mac</comment>
- <comment xml:lang="pt-BR">Áudio AIFF/Amiga/Mac</comment>
- <comment xml:lang="ro">Audio AIFF/Amiga/Mac</comment>
- <comment xml:lang="ru">Аудио AIFF/Amiga/Mac</comment>
- <comment xml:lang="sk">Zvuk AIFF/Amiga/Mac</comment>
- <comment xml:lang="sl">Zvočna datoteka AIFF/Amiga/Mac</comment>
- <comment xml:lang="sq">Audio AIFF/Amiga/Mac</comment>
- <comment xml:lang="sr">АИФФ/Амига/Мекинтош звук</comment>
- <comment xml:lang="sv">AIFF/Amiga/Mac-ljud</comment>
- <comment xml:lang="tr">AIFF/Amiga/Mac sesi</comment>
- <comment xml:lang="uk">звук AIFF/Amiga/Mac</comment>
+ <comment xml:lang="zh_TW">AIFF/Amiga/Mac 音訊</comment>
+ <comment xml:lang="zh_CN">AIFF/Amiga/Mac 音频</comment>
<comment xml:lang="vi">Âm thanh AIFF/Amiga/Mac</comment>
- <comment xml:lang="zh-CN">AIFF/Amiga/Mac 音频</comment>
- <comment xml:lang="zh-TW">AIFF/Amiga/Mac 音訊</comment>
+ <comment xml:lang="uk">звук AIFF/Amiga/Mac</comment>
+ <comment xml:lang="tr">AIFF/Amiga/Mac sesi</comment>
+ <comment xml:lang="sv">AIFF/Amiga/Mac-ljud</comment>
+ <comment xml:lang="sr">АИФФ/Амига/Мекинтош звук</comment>
+ <comment xml:lang="sq">audio AIFF/Amiga/Mac</comment>
+ <comment xml:lang="sl">Zvočna datoteka AIFF/Amiga/Mac</comment>
+ <comment xml:lang="si">AIFF/Amiga/Mac ශ්‍රව්‍ය</comment>
+ <comment xml:lang="sk">Zvuk AIFF/Amiga/Mac</comment>
+ <comment xml:lang="ru">Аудио AIFF/Amiga/Mac</comment>
+ <comment xml:lang="ro">Audio AIFF/Amiga/Mac</comment>
+ <comment xml:lang="pt_BR">Áudio AIFF/Amiga/Mac</comment>
+ <comment xml:lang="pt">áudio AIFF/Amiga/Mac</comment>
+ <comment xml:lang="pl">Plik dźwiękowy AIFF/Amiga/Mac</comment>
+ <comment xml:lang="oc">àudio AIFF/Amiga/Mac</comment>
+ <comment xml:lang="nn">AIFF/Amiga/Mac-lyd</comment>
+ <comment xml:lang="nl">AIFF/Amiga/Mac-audio</comment>
+ <comment xml:lang="nb">AIFF/Amiga/Mac-lyd</comment>
+ <comment xml:lang="ms">Audio AIFF/Amiga/Mac</comment>
+ <comment xml:lang="lv">AIFF/Amiga/Mac audio</comment>
+ <comment xml:lang="lt">AIFF/Amiga/Mac garso įrašas</comment>
+ <comment xml:lang="ko">AIFF/Amiga/Mac 오디오</comment>
+ <comment xml:lang="kk">AIFF/Amiga/Mac аудиосы</comment>
+ <comment xml:lang="ka">AIFF/Amiga/Mac აუდიო</comment>
+ <comment xml:lang="ja">AIFF/Amiga/Mac オーディオ</comment>
+ <comment xml:lang="it">Audio AIFF/Amiga/Mac</comment>
+ <comment xml:lang="is">AIFF/Amiga/Mac hljóðskrá</comment>
+ <comment xml:lang="id">Audio AIFF/Amiga/Mac</comment>
+ <comment xml:lang="ia">Audio AIFF/Amiga/Mac</comment>
+ <comment xml:lang="hu">AIFF/Amiga/Mac hang</comment>
+ <comment xml:lang="hr">AIFF/Amiga/Mac zvučni zapis</comment>
+ <comment xml:lang="he">שמע AIFF/Amiga/Mac</comment>
+ <comment xml:lang="gl">son AIFF/Amiga/Mac</comment>
+ <comment xml:lang="ga">fuaim AIFF/Amiga/Mac</comment>
+ <comment xml:lang="fur">audio AIFF/Amiga/Mac</comment>
+ <comment xml:lang="fr">audio AIFF/Amiga/Mac</comment>
+ <comment xml:lang="fo">AIFF/Amiga/Mac ljóður</comment>
+ <comment xml:lang="fi">AIFF/Amiga/Mac-ääni</comment>
+ <comment xml:lang="eu">AIFF/Amiga/Mac audioa</comment>
+ <comment xml:lang="es">sonido AIFF/Amiga/Mac</comment>
+ <comment xml:lang="eo">AIFF/Amiga/Mac-sondosiero</comment>
+ <comment xml:lang="en_GB">AIFF/Amiga/Mac audio</comment>
+ <comment xml:lang="el">Ήχος AIFF/Amiga/Mac</comment>
+ <comment xml:lang="de">AIFF/Amiga/Mac-Audio</comment>
+ <comment xml:lang="da">AIFF-/Amiga-/Mac-lyd</comment>
+ <comment xml:lang="cy">Sain AIFF/Amiga/Mac</comment>
+ <comment xml:lang="cs">zvuk AIFF/Amiga/Mac</comment>
+ <comment xml:lang="ca">àudio AIFF/Amiga/Mac</comment>
+ <comment xml:lang="bg">Аудио — AIFF/Amiga/Mac</comment>
+ <comment xml:lang="be@latin">Aŭdyjo AIFF/Amiga/Mac</comment>
+ <comment xml:lang="be">аўдыя AIFF/Amiga/Mac</comment>
+ <comment xml:lang="az">AIFF/Amiga/Mac audio faylı</comment>
+ <comment xml:lang="ar">صوت AIFF/Amiga/Mac</comment>
+ <comment xml:lang="af">AIFF/Amiga/Mac-oudio</comment>
<acronym>AIFF</acronym>
<expanded-acronym>Audio Interchange File Format</expanded-acronym>
<sub-class-of type="application/x-iff"/>
- <magic priority="50">
+ <magic>
<match type="string" value="AIFF" offset="8"/>
<match type="string" value="8SVX" offset="8"/>
</magic>
@@ -23531,88 +24564,100 @@ command to generate the output files.
</mime-type>
<mime-type type="audio/x-ape">
<comment>Monkey's audio</comment>
- <comment xml:lang="ar">Monkey سمعي</comment>
- <comment xml:lang="be-Latn">Aŭdyjo Monkey's</comment>
- <comment xml:lang="bg">Аудио — Monkey</comment>
- <comment xml:lang="ca">àudio de Monkey</comment>
- <comment xml:lang="cs">zvuk Monkey's</comment>
- <comment xml:lang="da">Monkey's-lyd</comment>
- <comment xml:lang="de">Monkey's-Audio</comment>
- <comment xml:lang="el">Ήχος Monkey's</comment>
- <comment xml:lang="en-GB">Monkey's audio</comment>
- <comment xml:lang="es">audio de Monkey</comment>
- <comment xml:lang="eu">Monkey audioa</comment>
- <comment xml:lang="fi">Monkey's Audio -ääni</comment>
- <comment xml:lang="fo">Monkey's ljóður</comment>
- <comment xml:lang="fr">audio Monkey</comment>
- <comment xml:lang="fur">audio Monkey's</comment>
- <comment xml:lang="ga">fuaim Monkey's</comment>
- <comment xml:lang="gl">son de Monkey</comment>
- <comment xml:lang="he">שמע של Monkey's</comment>
- <comment xml:lang="hr">Monkey zvučni zapis</comment>
- <comment xml:lang="hu">Monkey hang</comment>
- <comment xml:lang="ia">Audio Monkey's</comment>
- <comment xml:lang="id">Audio Monkey</comment>
- <comment xml:lang="it">Audio Monkey's</comment>
- <comment xml:lang="ja">Monkey's オーディオ</comment>
- <comment xml:lang="kk">Monkey аудиосы</comment>
- <comment xml:lang="ko">Monkey's 오디오</comment>
- <comment xml:lang="lt">Monkey garso įrašas</comment>
- <comment xml:lang="lv">Monkey's audio</comment>
- <comment xml:lang="nb">Monkey's-lyd</comment>
- <comment xml:lang="nl">Monkey's-audio</comment>
- <comment xml:lang="nn">Monkey's Audio-lyd</comment>
- <comment xml:lang="oc">àudio Monkey</comment>
- <comment xml:lang="pl">Plik dźwiękowy Monkey's Audio</comment>
- <comment xml:lang="pt">áudio Monkey</comment>
- <comment xml:lang="pt-BR">Áudio Monkey's</comment>
- <comment xml:lang="ro">Audio Monkey's</comment>
- <comment xml:lang="ru">Аудио Monkey's</comment>
- <comment xml:lang="sk">Zvuk Monkey's</comment>
- <comment xml:lang="sl">Zvočna datoteka Monkey</comment>
- <comment xml:lang="sq">Audio Monkey's</comment>
- <comment xml:lang="sr">Монкијев звук</comment>
- <comment xml:lang="sv">Monkey's audio</comment>
- <comment xml:lang="tr">Monkey's sesi</comment>
- <comment xml:lang="uk">звук Monkey's</comment>
+ <comment xml:lang="zh_TW">Monkey's 音訊</comment>
+ <comment xml:lang="zh_CN">Monkey's Audio 音频</comment>
<comment xml:lang="vi">Âm thanh cua Monkey</comment>
- <comment xml:lang="zh-CN">Monkey's Audio 音频</comment>
- <comment xml:lang="zh-TW">Monkey's 音訊</comment>
- <magic priority="50">
+ <comment xml:lang="uk">звук Monkey's</comment>
+ <comment xml:lang="tr">Monkey's sesi</comment>
+ <comment xml:lang="sv">Monkey's audio</comment>
+ <comment xml:lang="sr">Монкијев звук</comment>
+ <comment xml:lang="sq">audio Monkey's</comment>
+ <comment xml:lang="sl">Zvočna datoteka Monkey</comment>
+ <comment xml:lang="si">වඳුරාගේ හඬ පටය</comment>
+ <comment xml:lang="sk">Zvuk Monkey's</comment>
+ <comment xml:lang="ru">Аудио Monkey's</comment>
+ <comment xml:lang="ro">Audio Monkey's</comment>
+ <comment xml:lang="pt_BR">Áudio Monkey's</comment>
+ <comment xml:lang="pt">áudio Monkey</comment>
+ <comment xml:lang="pl">Plik dźwiękowy Monkey's Audio</comment>
+ <comment xml:lang="oc">àudio Monkey</comment>
+ <comment xml:lang="nn">Monkey's Audio-lyd</comment>
+ <comment xml:lang="nl">Monkey's-audio</comment>
+ <comment xml:lang="nb">Monkey's-lyd</comment>
+ <comment xml:lang="lv">Monkey's audio</comment>
+ <comment xml:lang="lt">Monkey garso įrašas</comment>
+ <comment xml:lang="ko">Monkey's 오디오</comment>
+ <comment xml:lang="kk">Monkey аудиосы</comment>
+ <comment xml:lang="ja">Monkey's オーディオ</comment>
+ <comment xml:lang="it">Audio Monkey's</comment>
+ <comment xml:lang="is">Monkey's hljóðskrá</comment>
+ <comment xml:lang="id">Audio Monkey</comment>
+ <comment xml:lang="ia">Audio Monkey's</comment>
+ <comment xml:lang="hu">Monkey hang</comment>
+ <comment xml:lang="hr">Monkey zvučni zapis</comment>
+ <comment xml:lang="he">שמע של Monkey's</comment>
+ <comment xml:lang="gl">son de Monkey</comment>
+ <comment xml:lang="ga">fuaim Monkey's</comment>
+ <comment xml:lang="fur">audio Monkey's</comment>
+ <comment xml:lang="fr">audio Monkey</comment>
+ <comment xml:lang="fo">Monkey's ljóður</comment>
+ <comment xml:lang="fi">Monkey's Audio -ääni</comment>
+ <comment xml:lang="eu">Monkey audioa</comment>
+ <comment xml:lang="es">sonido de Monkey</comment>
+ <comment xml:lang="en_GB">Monkey's audio</comment>
+ <comment xml:lang="el">Ήχος Monkey's</comment>
+ <comment xml:lang="de">Monkey's-Audio</comment>
+ <comment xml:lang="da">Monkey's-lyd</comment>
+ <comment xml:lang="cs">zvuk Monkey's</comment>
+ <comment xml:lang="ca">àudio de Monkey</comment>
+ <comment xml:lang="bg">Аудио — Monkey</comment>
+ <comment xml:lang="be@latin">Aŭdyjo Monkey's</comment>
+ <comment xml:lang="be">аўдыя Monkey's</comment>
+ <comment xml:lang="ar">صوت Monkey</comment>
+ <magic>
<match type="string" value="MAC " offset="0"/>
</magic>
<glob pattern="*.ape"/>
</mime-type>
<mime-type type="audio/x-pn-audibleaudio">
<comment>Audible.Com audio</comment>
- <comment xml:lang="bg">Аудио — Audible.Com</comment>
- <comment xml:lang="ca">àudio d'Audible.Com</comment>
- <comment xml:lang="cs">zvuk Audible.Com</comment>
- <comment xml:lang="da">Audible.Com-lyd</comment>
- <comment xml:lang="de">Audible.Com-Audio</comment>
- <comment xml:lang="en-GB">Audible.Com audio</comment>
- <comment xml:lang="es">audio de Audible.com</comment>
- <comment xml:lang="eu">Audible.Com audioa</comment>
- <comment xml:lang="fi">Audible.Com-ääni</comment>
- <comment xml:lang="fr">audio Audible.Com</comment>
- <comment xml:lang="fur">audio Audible.Com</comment>
- <comment xml:lang="ga">fuaim Audible.Com</comment>
- <comment xml:lang="hr">Audible.Com zvučni zapis</comment>
- <comment xml:lang="hu">Audible.Com hang</comment>
- <comment xml:lang="id">Audio Audible.Com</comment>
- <comment xml:lang="it">Audio Audible.Com</comment>
- <comment xml:lang="kk">Audible.Com аудиосы</comment>
- <comment xml:lang="ko">Audible.Com 오디오</comment>
- <comment xml:lang="pl">Plik dźwiękowy Audible.com</comment>
- <comment xml:lang="pt-BR">Áudio de audible.com</comment>
- <comment xml:lang="ru">Аудио Audible.Com</comment>
- <comment xml:lang="sk">Audio Audible.Com</comment>
- <comment xml:lang="sv">Audible.Com-ljud</comment>
- <comment xml:lang="tr">Audible.Com sesi</comment>
+ <comment xml:lang="zh_TW">Audible.Com 音訊</comment>
+ <comment xml:lang="zh_CN">Audible.Com 音频</comment>
<comment xml:lang="uk">звук Audible.Com</comment>
- <comment xml:lang="zh-CN">Audible.Com 音频</comment>
- <comment xml:lang="zh-TW">Audible.Com 音訊</comment>
- <magic priority="50">
+ <comment xml:lang="tr">Audible.Com sesi</comment>
+ <comment xml:lang="sv">Audible.Com-ljud</comment>
+ <comment xml:lang="sq">audio Audible.Com</comment>
+ <comment xml:lang="sl">Zvok Audible.Com</comment>
+ <comment xml:lang="si">Audible.Com ශ්‍රව්‍ය</comment>
+ <comment xml:lang="sk">Audio Audible.Com</comment>
+ <comment xml:lang="ru">Аудио Audible.Com</comment>
+ <comment xml:lang="pt_BR">Áudio de audible.com</comment>
+ <comment xml:lang="pl">Plik dźwiękowy Audible.com</comment>
+ <comment xml:lang="nl">Audible.com-audio</comment>
+ <comment xml:lang="ko">Audible.Com 오디오</comment>
+ <comment xml:lang="kk">Audible.Com аудиосы</comment>
+ <comment xml:lang="ja">Audible.Com オーディオ</comment>
+ <comment xml:lang="it">Audio Audible.Com</comment>
+ <comment xml:lang="is">Audible.Com hljóðskrá</comment>
+ <comment xml:lang="id">Audio Audible.Com</comment>
+ <comment xml:lang="hu">Audible.Com hang</comment>
+ <comment xml:lang="hr">Audible.Com zvučni zapis</comment>
+ <comment xml:lang="he">שמע של Audible.Com</comment>
+ <comment xml:lang="ga">fuaim Audible.Com</comment>
+ <comment xml:lang="fur">audio Audible.Com</comment>
+ <comment xml:lang="fr">audio Audible.Com</comment>
+ <comment xml:lang="fi">Audible.Com-ääni</comment>
+ <comment xml:lang="eu">Audible.Com audioa</comment>
+ <comment xml:lang="es">sonido de Audible.com</comment>
+ <comment xml:lang="en_GB">Audible.Com audio</comment>
+ <comment xml:lang="de">Audible.com-Audio</comment>
+ <comment xml:lang="da">Audible.Com-lyd</comment>
+ <comment xml:lang="cs">zvuk Audible.Com</comment>
+ <comment xml:lang="ca">àudio d'Audible.Com</comment>
+ <comment xml:lang="bg">Аудио — Audible.Com</comment>
+ <comment xml:lang="be">аўдыя Audible.Com</comment>
+ <comment xml:lang="ar">صوت Audible.Com</comment>
+ <magic>
<!-- https://github.com/FFmpeg/FFmpeg/blob/master/libavformat/aadec.c#L33 -->
<match type="big32" value="1469084982" offset="4"/>
</magic>
@@ -23621,193 +24666,350 @@ command to generate the output files.
</mime-type>
<mime-type type="audio/vnd.audible.aax">
<comment>Audible Enhanced audio</comment>
- <comment xml:lang="ca">àudio d'Audible Enhanced</comment>
- <comment xml:lang="da">Audible Enhanced-lyd</comment>
- <comment xml:lang="de">Audible Erweitertes Audio</comment>
- <comment xml:lang="en-GB">Audible Enhanced audio</comment>
- <comment xml:lang="es">audio mejorado de Audible</comment>
- <comment xml:lang="fi">Selvä parannettu ääni</comment>
- <comment xml:lang="hr">Audible poboljšani zvučni zapis</comment>
- <comment xml:lang="it">Audio Audible Enhanced</comment>
- <comment xml:lang="pl">Plik dźwiękowy Audible Enhanced</comment>
- <comment xml:lang="pt-BR">Áudio Audible Enhanced</comment>
- <comment xml:lang="sv">Audible förbättrat ljud</comment>
+ <comment xml:lang="zh_CN">Audible 增强音频</comment>
<comment xml:lang="uk">звук Audible Enhanced</comment>
- <comment xml:lang="zh-CN">Audible 增强音频</comment>
- <magic priority="50">
+ <comment xml:lang="tr">Audible Enhanced sesi</comment>
+ <comment xml:lang="sv">Audible förbättrat ljud</comment>
+ <comment xml:lang="si">ශ්‍රවණය කළ හැකි වැඩිදියුණු කළ ශ්‍රව්‍ය</comment>
+ <comment xml:lang="ru">Аудио Audible Enhanced</comment>
+ <comment xml:lang="pt_BR">Áudio Audible Enhanced</comment>
+ <comment xml:lang="pl">Plik dźwiękowy Audible Enhanced</comment>
+ <comment xml:lang="nl">Audible verbeterde-audio</comment>
+ <comment xml:lang="ko">Audible 확장된 오디오</comment>
+ <comment xml:lang="kk">Audible Enhanced аудиосы</comment>
+ <comment xml:lang="ja">Audible エンハンスオーディオ</comment>
+ <comment xml:lang="it">Audio Audible Enhanced</comment>
+ <comment xml:lang="is">Audible Enhanced hljóðskrá</comment>
+ <comment xml:lang="id">audio Audible Enhanced</comment>
+ <comment xml:lang="hu">Audible Enhanced hang</comment>
+ <comment xml:lang="hr">Audible poboljšani zvučni zapis</comment>
+ <comment xml:lang="he">שמע Audible Enhanced</comment>
+ <comment xml:lang="fr">Audio amélioré Audible</comment>
+ <comment xml:lang="fi">Audible Enhanced -ääni</comment>
+ <comment xml:lang="es">sonido mejorado de Audible</comment>
+ <comment xml:lang="en_GB">Audible Enhanced audio</comment>
+ <comment xml:lang="de">Audible verbessertes Audio</comment>
+ <comment xml:lang="da">Audible Enhanced-lyd</comment>
+ <comment xml:lang="ca">àudio d'Audible Enhanced</comment>
+ <comment xml:lang="be">аўдыя Audible Enhanced</comment>
+ <comment xml:lang="ar">صوت محسن مسموع</comment>
+ <magic>
<match type="string" value="ftypaax " offset="4"/>
</magic>
<glob pattern="*.aax"/>
</mime-type>
+ <mime-type type="audio/vnd.audible.aaxc">
+ <comment>Audible Enhanced audio</comment>
+ <comment xml:lang="zh_CN">Audible 增强音频</comment>
+ <comment xml:lang="uk">звук Audible Enhanced</comment>
+ <comment xml:lang="tr">Audible Enhanced sesi</comment>
+ <comment xml:lang="sv">Audible förbättrat ljud</comment>
+ <comment xml:lang="si">ශ්‍රවණය කළ හැකි වැඩිදියුණු කළ ශ්‍රව්‍ය</comment>
+ <comment xml:lang="ru">Аудио Audible Enhanced</comment>
+ <comment xml:lang="pt_BR">Áudio Audible Enhanced</comment>
+ <comment xml:lang="pl">Plik dźwiękowy Audible Enhanced</comment>
+ <comment xml:lang="nl">Audible verbeterde-audio</comment>
+ <comment xml:lang="ko">Audible 확장된 오디오</comment>
+ <comment xml:lang="kk">Audible Enhanced аудиосы</comment>
+ <comment xml:lang="ja">Audible エンハンスオーディオ</comment>
+ <comment xml:lang="it">Audio Audible Enhanced</comment>
+ <comment xml:lang="is">Audible Enhanced hljóðskrá</comment>
+ <comment xml:lang="id">audio Audible Enhanced</comment>
+ <comment xml:lang="hu">Audible Enhanced hang</comment>
+ <comment xml:lang="hr">Audible poboljšani zvučni zapis</comment>
+ <comment xml:lang="he">שמע Audible Enhanced</comment>
+ <comment xml:lang="fr">Audio amélioré Audible</comment>
+ <comment xml:lang="fi">Audible Enhanced -ääni</comment>
+ <comment xml:lang="es">sonido mejorado de Audible</comment>
+ <comment xml:lang="en_GB">Audible Enhanced audio</comment>
+ <comment xml:lang="de">Audible verbessertes Audio</comment>
+ <comment xml:lang="da">Audible Enhanced-lyd</comment>
+ <comment xml:lang="ca">àudio d'Audible Enhanced</comment>
+ <comment xml:lang="be">аўдыя Audible Enhanced</comment>
+ <comment xml:lang="ar">صوت محسن مسموع</comment>
+ <magic priority="50">
+ <match type="string" value="ftypaaxc" offset="4"/>
+ </magic>
+ <glob pattern="*.aaxc"/>
+ </mime-type>
+ <mime-type type="audio/x-dff">
+ <comment>DSDIFF audio</comment>
+ <comment xml:lang="zh_TW">DSDIFF 音訊</comment>
+ <comment xml:lang="zh_CN">DSDIFF 音频</comment>
+ <comment xml:lang="uk">звукові дані DSDIFF</comment>
+ <comment xml:lang="tr">DSDIFF sesi</comment>
+ <comment xml:lang="sv">DSDIFF-ljud</comment>
+ <comment xml:lang="sl">Zvok DSDIFF</comment>
+ <comment xml:lang="si">DSDIFF ශ්රව්ය</comment>
+ <comment xml:lang="ru">Аудио DSDIFF</comment>
+ <comment xml:lang="pt_BR">Áudio DSDIFF</comment>
+ <comment xml:lang="pl">Plik dźwiękowy DSDIFF</comment>
+ <comment xml:lang="nl">DSDIFF-audio</comment>
+ <comment xml:lang="ko">DSDIFF 오디오</comment>
+ <comment xml:lang="kk">DSDIFF аудиосы</comment>
+ <comment xml:lang="ja">DSDIFF オーディオ</comment>
+ <comment xml:lang="it">Audio DSDIFF</comment>
+ <comment xml:lang="hr">DSDIFF zvučni zapis</comment>
+ <comment xml:lang="fi">DSDIFF-ääni</comment>
+ <comment xml:lang="eu">DSDIFF audioa</comment>
+ <comment xml:lang="es">sonido DSDIFF</comment>
+ <comment xml:lang="en_GB">DSDIFF audio</comment>
+ <comment xml:lang="de">DSDIFF-Audio</comment>
+ <comment xml:lang="be">аўдыя DSDIFF</comment>
+ <comment xml:lang="ar">صوت DSDIFF</comment>
+ <acronym>DSDIFF</acronym>
+ <expanded-acronym>Direct Stream Digital Interchange File Format</expanded-acronym>
+ <magic>
+ <!-- from https://www.sonicstudio.com/pdf/dsd/DSDIFF_1.5_Spec.pdf -->
+ <match value="FRM8" type="string" offset="0">
+ <match value="DSD " type="string" offset="12"/>
+ </match>
+ </magic>
+ <glob pattern="*.dff"/>
+ <alias type="audio/dff"/>
+ </mime-type>
+ <mime-type type="audio/x-dsf">
+ <comment>DSF audio</comment>
+ <comment xml:lang="zh_TW">DSF 音訊</comment>
+ <comment xml:lang="zh_CN">DSF 音频</comment>
+ <comment xml:lang="uk">звукові дані DSF</comment>
+ <comment xml:lang="tr">DSF sesi</comment>
+ <comment xml:lang="sv">DSF-ljud</comment>
+ <comment xml:lang="sl">Zvok DSF</comment>
+ <comment xml:lang="si">DSF ශ්‍රව්‍ය</comment>
+ <comment xml:lang="ru">Аудио DSF</comment>
+ <comment xml:lang="pt_BR">Áudio DSF</comment>
+ <comment xml:lang="pl">Plik dźwiękowy DSF</comment>
+ <comment xml:lang="nl">DSF-audio</comment>
+ <comment xml:lang="ko">DSF 오디오</comment>
+ <comment xml:lang="kk">DSF аудиосы</comment>
+ <comment xml:lang="ja">DSF オーディオ</comment>
+ <comment xml:lang="it">Audio DSF</comment>
+ <comment xml:lang="hr">DSF zvučni zapis</comment>
+ <comment xml:lang="gl">Son DSF</comment>
+ <comment xml:lang="fi">DSF-ääni</comment>
+ <comment xml:lang="eu">DSF audioa</comment>
+ <comment xml:lang="es">sonido DSF</comment>
+ <comment xml:lang="en_GB">DSF audio</comment>
+ <comment xml:lang="de">DSF-Audio</comment>
+ <comment xml:lang="be">аўдыя DSF</comment>
+ <comment xml:lang="ar">صوت DSF</comment>
+ <acronym>DSF</acronym>
+ <expanded-acronym>Direct stream digital Stream File</expanded-acronym>
+ <magic>
+ <!-- from https://dsd-guide.com/sites/default/files/white-papers/DSFFileFormatSpec_E.pdf -->
+ <match value="DSD " type="string" offset="0">
+ <match value="fmt " type="string" offset="28">
+ <match value="data" type="string" offset="80"/>
+ </match>
+ </match>
+ </magic>
+ <glob pattern="*.dsf"/>
+ <alias type="audio/dsf"/>
+ <!-- Problematic because some clients expect these mime types to be DSDIFF files -->
+ <alias type="audio/x-dsd"/>
+ <alias type="audio/dsd"/>
+ </mime-type>
<mime-type type="audio/x-it">
<comment>Impulse Tracker audio</comment>
- <comment xml:lang="ar">Impulse Tracker سمعي</comment>
- <comment xml:lang="az">Impulse Tracker audio faylı</comment>
- <comment xml:lang="be-Latn">Aŭdyjo Impulse Tracker</comment>
- <comment xml:lang="bg">Аудио — Impulse Tracker</comment>
- <comment xml:lang="ca">àudio d'Impulse Tracker</comment>
- <comment xml:lang="cs">zvuk Impulse Tracker</comment>
- <comment xml:lang="cy">Sain Impulse Tracker</comment>
- <comment xml:lang="da">Impulse Tracker-lyd</comment>
- <comment xml:lang="de">Impulse-Tracker-Audio</comment>
- <comment xml:lang="el">Ήχος Impulse Tracker</comment>
- <comment xml:lang="en-GB">Impulse Tracker audio</comment>
- <comment xml:lang="eo">Sondosiero de Impulse Tracker</comment>
- <comment xml:lang="es">audio de Impulse Tracker</comment>
- <comment xml:lang="eu">Impulse Tracker audioa</comment>
- <comment xml:lang="fi">Impulse Tracker -ääni</comment>
- <comment xml:lang="fo">Impulse Tracker ljóður</comment>
- <comment xml:lang="fr">audio Impulse Tracker</comment>
- <comment xml:lang="fur">audio Impulse Tracker</comment>
- <comment xml:lang="ga">fuaim Impulse Tracker</comment>
- <comment xml:lang="gl">son de Impulse Tracker</comment>
- <comment xml:lang="he">שמע של Impulse Tracker</comment>
- <comment xml:lang="hr">Impulse Tracker zvučni zapis</comment>
- <comment xml:lang="hu">Impulse Tracker hang</comment>
- <comment xml:lang="ia">Audio Impulse Tracker</comment>
- <comment xml:lang="id">Audio Impulse Tracker</comment>
- <comment xml:lang="it">Audio Impulse Tracker</comment>
- <comment xml:lang="ja">Impulse Tracker オーディオ</comment>
- <comment xml:lang="kk">Impulse Tracker аудиосы</comment>
- <comment xml:lang="ko">Impulse Tracker 오디오</comment>
- <comment xml:lang="lt">Impulse Tracker garso įrašas</comment>
- <comment xml:lang="lv">Impulse Tracker audio</comment>
- <comment xml:lang="ms">Audio Impulse Tracker</comment>
- <comment xml:lang="nb">Impulse Tracker-lyd</comment>
- <comment xml:lang="nl">Impulse Tracker-audio</comment>
- <comment xml:lang="nn">Impulse Tracker lyd</comment>
- <comment xml:lang="oc">àudio Impulse Tracker</comment>
- <comment xml:lang="pl">Plik dźwiękowy Impulse Tracker</comment>
- <comment xml:lang="pt">áudio Impulse Tracker</comment>
- <comment xml:lang="pt-BR">Áudio Impulse Tracker</comment>
- <comment xml:lang="ro">Audio Impulse Tracker</comment>
- <comment xml:lang="ru">Аудио Impulse Tracker</comment>
- <comment xml:lang="sk">Zvuk Impulse Tracker</comment>
- <comment xml:lang="sl">Zvočna datoteka Impulse Tracker</comment>
- <comment xml:lang="sq">Audio Impulse Tracker</comment>
- <comment xml:lang="sr">звук Пратиоца Импулса</comment>
- <comment xml:lang="sv">Impulse Tracker-ljud</comment>
- <comment xml:lang="tr">Impulse Tracker sesi</comment>
- <comment xml:lang="uk">звук Impulse Tracker</comment>
+ <comment xml:lang="zh_TW">Impulse Tracker 音訊</comment>
+ <comment xml:lang="zh_CN">Impulse Tracker 音频</comment>
<comment xml:lang="vi">Âm thanh Impulse Tracker</comment>
- <comment xml:lang="zh-CN">Impulse Tracker 音频</comment>
- <comment xml:lang="zh-TW">Impulse Tracker 音訊</comment>
- <magic priority="50">
+ <comment xml:lang="uk">звук Impulse Tracker</comment>
+ <comment xml:lang="tr">Impulse Tracker sesi</comment>
+ <comment xml:lang="sv">Impulse Tracker-ljud</comment>
+ <comment xml:lang="sr">звук Пратиоца Импулса</comment>
+ <comment xml:lang="sq">audio Impulse Tracker</comment>
+ <comment xml:lang="sl">Zvočna datoteka Impulse Tracker</comment>
+ <comment xml:lang="si">Impulse Tracker ශ්‍රව්‍ය</comment>
+ <comment xml:lang="sk">Zvuk Impulse Tracker</comment>
+ <comment xml:lang="ru">Аудио Impulse Tracker</comment>
+ <comment xml:lang="ro">Audio Impulse Tracker</comment>
+ <comment xml:lang="pt_BR">Áudio Impulse Tracker</comment>
+ <comment xml:lang="pt">áudio Impulse Tracker</comment>
+ <comment xml:lang="pl">Plik dźwiękowy Impulse Tracker</comment>
+ <comment xml:lang="oc">àudio Impulse Tracker</comment>
+ <comment xml:lang="nn">Impulse Tracker lyd</comment>
+ <comment xml:lang="nl">Impulse Tracker-audio</comment>
+ <comment xml:lang="nb">Impulse Tracker-lyd</comment>
+ <comment xml:lang="ms">Audio Impulse Tracker</comment>
+ <comment xml:lang="lv">Impulse Tracker audio</comment>
+ <comment xml:lang="lt">Impulse Tracker garso įrašas</comment>
+ <comment xml:lang="ko">Impulse Tracker 오디오</comment>
+ <comment xml:lang="kk">Impulse Tracker аудиосы</comment>
+ <comment xml:lang="ja">Impulse Tracker オーディオ</comment>
+ <comment xml:lang="it">Audio Impulse Tracker</comment>
+ <comment xml:lang="is">Impulse Tracker hljóðskrá</comment>
+ <comment xml:lang="id">Audio Impulse Tracker</comment>
+ <comment xml:lang="ia">Audio Impulse Tracker</comment>
+ <comment xml:lang="hu">Impulse Tracker hang</comment>
+ <comment xml:lang="hr">Impulse Tracker zvučni zapis</comment>
+ <comment xml:lang="he">שמע של Impulse Tracker</comment>
+ <comment xml:lang="gl">son de Impulse Tracker</comment>
+ <comment xml:lang="ga">fuaim Impulse Tracker</comment>
+ <comment xml:lang="fur">audio Impulse Tracker</comment>
+ <comment xml:lang="fr">audio Impulse Tracker</comment>
+ <comment xml:lang="fo">Impulse Tracker ljóður</comment>
+ <comment xml:lang="fi">Impulse Tracker -ääni</comment>
+ <comment xml:lang="eu">Impulse Tracker audioa</comment>
+ <comment xml:lang="es">sonido de Impulse Tracker</comment>
+ <comment xml:lang="eo">Sondosiero de Impulse Tracker</comment>
+ <comment xml:lang="en_GB">Impulse Tracker audio</comment>
+ <comment xml:lang="el">Ήχος Impulse Tracker</comment>
+ <comment xml:lang="de">Impulse-Tracker-Audio</comment>
+ <comment xml:lang="da">Impulse Tracker-lyd</comment>
+ <comment xml:lang="cy">Sain Impulse Tracker</comment>
+ <comment xml:lang="cs">zvuk Impulse Tracker</comment>
+ <comment xml:lang="ca">àudio d'Impulse Tracker</comment>
+ <comment xml:lang="bg">Аудио — Impulse Tracker</comment>
+ <comment xml:lang="be@latin">Aŭdyjo Impulse Tracker</comment>
+ <comment xml:lang="be">аўдыя Impulse Tracker</comment>
+ <comment xml:lang="az">Impulse Tracker audio faylı</comment>
+ <comment xml:lang="ar">صوت Impulse Tracker</comment>
+ <magic>
<match type="string" value="IMPM" offset="0"/>
</magic>
<glob pattern="*.it"/>
</mime-type>
<mime-type type="audio/flac">
<comment>FLAC audio</comment>
- <comment xml:lang="af">FLAC-oudio</comment>
- <comment xml:lang="ar">FLAC سمعي</comment>
- <comment xml:lang="be-Latn">Aŭdyjo FLAC</comment>
- <comment xml:lang="bg">Аудио — FLAC</comment>
- <comment xml:lang="ca">àudio FLAC</comment>
- <comment xml:lang="cs">zvuk FLAC</comment>
- <comment xml:lang="da">FLAC-lyd</comment>
- <comment xml:lang="de">FLAC-Audio</comment>
- <comment xml:lang="el">Ήχος FLAC</comment>
- <comment xml:lang="en-GB">FLAC audio</comment>
- <comment xml:lang="eo">FLAC-sondosiero</comment>
- <comment xml:lang="es">audio FLAC</comment>
- <comment xml:lang="eu">FLAC audioa</comment>
- <comment xml:lang="fi">FLAC-ääni</comment>
- <comment xml:lang="fo">FLAC ljóður</comment>
- <comment xml:lang="fr">audio FLAC</comment>
- <comment xml:lang="fur">audio FLAC</comment>
- <comment xml:lang="ga">fuaim FLAC</comment>
- <comment xml:lang="gl">son FLAC</comment>
- <comment xml:lang="he">קובץ שמע מסוג FLAC</comment>
- <comment xml:lang="hr">FLAC zvučni zapis</comment>
- <comment xml:lang="hu">FLAC hang</comment>
- <comment xml:lang="ia">Audio FLAC</comment>
- <comment xml:lang="id">Audio FLAC</comment>
- <comment xml:lang="it">Audio FLAC</comment>
- <comment xml:lang="ja">FLAC オーディオ</comment>
- <comment xml:lang="ka">FLAC აუდიო</comment>
- <comment xml:lang="kk">FLAC аудиосы</comment>
- <comment xml:lang="ko">FLAC 오디오</comment>
- <comment xml:lang="lt">FLAC garso įrašas</comment>
- <comment xml:lang="lv">FLAC audio</comment>
- <comment xml:lang="ms">Audio FLAC</comment>
- <comment xml:lang="nb">FLAC-lyd</comment>
- <comment xml:lang="nl">FLAC-audio</comment>
- <comment xml:lang="nn">FLAC-lyd</comment>
- <comment xml:lang="oc">àudio FLAC</comment>
- <comment xml:lang="pl">Plik dźwiękowy FLAC</comment>
- <comment xml:lang="pt">áudio FLAC</comment>
- <comment xml:lang="pt-BR">Áudio FLAC</comment>
- <comment xml:lang="ro">Audio FLAC</comment>
- <comment xml:lang="ru">Аудио FLAC</comment>
- <comment xml:lang="sk">Zvuk FLAC</comment>
- <comment xml:lang="sl">Zvočna datoteka Flac</comment>
- <comment xml:lang="sq">Audio FLAC</comment>
- <comment xml:lang="sr">ФЛАЦ звук</comment>
- <comment xml:lang="sv">FLAC-ljud</comment>
- <comment xml:lang="tr">FLAC sesi</comment>
- <comment xml:lang="uk">звук FLAC</comment>
+ <comment xml:lang="zh_TW">FLAC 音訊</comment>
+ <comment xml:lang="zh_CN">FLAC 音频</comment>
<comment xml:lang="vi">Âm thanh FLAC</comment>
- <comment xml:lang="zh-CN">FLAC 音频</comment>
- <comment xml:lang="zh-TW">FLAC 音訊</comment>
- <magic priority="50">
+ <comment xml:lang="uk">звук FLAC</comment>
+ <comment xml:lang="tr">FLAC sesi</comment>
+ <comment xml:lang="sv">FLAC-ljud</comment>
+ <comment xml:lang="sr">ФЛАЦ звук</comment>
+ <comment xml:lang="sq">audio FLAC</comment>
+ <comment xml:lang="sl">Zvočna datoteka Flac</comment>
+ <comment xml:lang="si">FLAC ශ්රව්ය</comment>
+ <comment xml:lang="sk">Zvuk FLAC</comment>
+ <comment xml:lang="ru">Аудио FLAC</comment>
+ <comment xml:lang="ro">Audio FLAC</comment>
+ <comment xml:lang="pt_BR">Áudio FLAC</comment>
+ <comment xml:lang="pt">áudio FLAC</comment>
+ <comment xml:lang="pl">Plik dźwiękowy FLAC</comment>
+ <comment xml:lang="oc">àudio FLAC</comment>
+ <comment xml:lang="nn">FLAC-lyd</comment>
+ <comment xml:lang="nl">FLAC-audio</comment>
+ <comment xml:lang="nb">FLAC-lyd</comment>
+ <comment xml:lang="ms">Audio FLAC</comment>
+ <comment xml:lang="lv">FLAC audio</comment>
+ <comment xml:lang="lt">FLAC garso įrašas</comment>
+ <comment xml:lang="ko">FLAC 오디오</comment>
+ <comment xml:lang="kk">FLAC аудиосы</comment>
+ <comment xml:lang="ka">FLAC აუდიო</comment>
+ <comment xml:lang="ja">FLAC オーディオ</comment>
+ <comment xml:lang="it">Audio FLAC</comment>
+ <comment xml:lang="is">FLAC hljóðskrá</comment>
+ <comment xml:lang="id">Audio FLAC</comment>
+ <comment xml:lang="ia">Audio FLAC</comment>
+ <comment xml:lang="hu">FLAC hang</comment>
+ <comment xml:lang="hr">FLAC zvučni zapis</comment>
+ <comment xml:lang="he">קובץ שמע מסוג FLAC</comment>
+ <comment xml:lang="gl">son FLAC</comment>
+ <comment xml:lang="ga">fuaim FLAC</comment>
+ <comment xml:lang="fur">audio FLAC</comment>
+ <comment xml:lang="fr">audio FLAC</comment>
+ <comment xml:lang="fo">FLAC ljóður</comment>
+ <comment xml:lang="fi">FLAC-ääni</comment>
+ <comment xml:lang="eu">FLAC audioa</comment>
+ <comment xml:lang="es">sonido FLAC</comment>
+ <comment xml:lang="eo">FLAC-sondosiero</comment>
+ <comment xml:lang="en_GB">FLAC audio</comment>
+ <comment xml:lang="el">Ήχος FLAC</comment>
+ <comment xml:lang="de">FLAC-Audio</comment>
+ <comment xml:lang="da">FLAC-lyd</comment>
+ <comment xml:lang="cs">zvuk FLAC</comment>
+ <comment xml:lang="ca">àudio FLAC</comment>
+ <comment xml:lang="bg">Аудио — FLAC</comment>
+ <comment xml:lang="be@latin">Aŭdyjo FLAC</comment>
+ <comment xml:lang="be">аўдыя FLAC</comment>
+ <comment xml:lang="ar">صوت FLAC</comment>
+ <comment xml:lang="af">FLAC-oudio</comment>
+ <acronym>FLAC</acronym>
+ <expanded-acronym>Free Lossless Audio Codec</expanded-acronym>
+ <magic>
<match value="fLaC" type="string" offset="0"/>
</magic>
<glob pattern="*.flac"/>
<alias type="audio/x-flac"/>
</mime-type>
+ <mime-type type="audio/x-tak">
+ <comment>TAK audio</comment>
+ <comment xml:lang="uk">звук TAK</comment>
+ <comment xml:lang="sv">TAK-ljud</comment>
+ <comment xml:lang="ru">Аудио TAK</comment>
+ <comment xml:lang="pt_BR">Áudio TAK</comment>
+ <comment xml:lang="pl">Plik dźwiękowy TAK</comment>
+ <comment xml:lang="it">Audio Tak</comment>
+ <comment xml:lang="gl">Son TAK</comment>
+ <comment xml:lang="eu">TAK audioa</comment>
+ <comment xml:lang="es">audio TAK</comment>
+ <comment xml:lang="de">TAK-Audio</comment>
+ <comment xml:lang="be">аўдыя TAK</comment>
+ <acronym>TAK</acronym>
+ <expanded-acronym>Tom's lossless Audio Kompressor</expanded-acronym>
+ <magic>
+ <match type="string" value="tBaK" offset="0"/>
+ </magic>
+ <glob pattern="*.tak"/>
+ </mime-type>
<mime-type type="audio/x-wavpack">
<comment>WavPack audio</comment>
- <comment xml:lang="af">WavPack-oudio</comment>
- <comment xml:lang="ar">WavPack سمعي</comment>
- <comment xml:lang="be-Latn">Aŭdyjo WavPack</comment>
- <comment xml:lang="bg">Аудио — WavPack</comment>
- <comment xml:lang="ca">àudio de WavPack</comment>
- <comment xml:lang="cs">zvuk WavPack</comment>
- <comment xml:lang="da">WavPack-lyd</comment>
- <comment xml:lang="de">WavPack-Audio</comment>
- <comment xml:lang="el">Ήχος WavePack</comment>
- <comment xml:lang="en-GB">WavPack audio</comment>
- <comment xml:lang="eo">WavPack-sondosiero</comment>
- <comment xml:lang="es">audio WavPack</comment>
- <comment xml:lang="eu">WavPack audioa</comment>
- <comment xml:lang="fi">WavPack-ääni</comment>
- <comment xml:lang="fo">WavPack ljóður</comment>
- <comment xml:lang="fr">audio WavPack</comment>
- <comment xml:lang="fur">audio WavPack</comment>
- <comment xml:lang="ga">fuaim WavPack</comment>
- <comment xml:lang="gl">son WavPack</comment>
- <comment xml:lang="he">שמע WavPack</comment>
- <comment xml:lang="hr">WavPack zvučni zapis</comment>
- <comment xml:lang="hu">WavPack hang</comment>
- <comment xml:lang="ia">Audio WavPack</comment>
- <comment xml:lang="id">Audio WavPack</comment>
- <comment xml:lang="it">Audio WavPack</comment>
- <comment xml:lang="ja">WavPack オーディオ</comment>
- <comment xml:lang="kk">WavPack аудиосы</comment>
- <comment xml:lang="ko">WavPack 오디오</comment>
- <comment xml:lang="lt">WavPack garso įrašas</comment>
- <comment xml:lang="lv">WavPack audio</comment>
- <comment xml:lang="nb">WavPack-lyd</comment>
- <comment xml:lang="nl">WavPack-audio</comment>
- <comment xml:lang="nn">WavPack-lyd</comment>
- <comment xml:lang="oc">àudio WavPack</comment>
- <comment xml:lang="pl">Plik dźwiękowy WavPack</comment>
- <comment xml:lang="pt">áudio WavPack</comment>
- <comment xml:lang="pt-BR">Áudio WavPack</comment>
- <comment xml:lang="ro">Audio WavPack</comment>
- <comment xml:lang="ru">Аудио WavPack</comment>
- <comment xml:lang="sk">Zvuk WavPack</comment>
- <comment xml:lang="sl">Zvočna datoteka WavPack</comment>
- <comment xml:lang="sq">Audio WavPack</comment>
- <comment xml:lang="sr">Вејвпак звук</comment>
- <comment xml:lang="sv">WavPack-ljud</comment>
- <comment xml:lang="tr">WavPack sesi</comment>
- <comment xml:lang="uk">звук WavPack</comment>
+ <comment xml:lang="zh_TW">WavPack 音訊</comment>
+ <comment xml:lang="zh_CN">WavPack 音频</comment>
<comment xml:lang="vi">Âm thanh WavPack</comment>
- <comment xml:lang="zh-CN">WavPack 音频</comment>
- <comment xml:lang="zh-TW">WavPack 音訊</comment>
- <magic priority="50">
+ <comment xml:lang="uk">звук WavPack</comment>
+ <comment xml:lang="tr">WavPack sesi</comment>
+ <comment xml:lang="sv">WavPack-ljud</comment>
+ <comment xml:lang="sr">Вејвпак звук</comment>
+ <comment xml:lang="sq">audio WavPack</comment>
+ <comment xml:lang="sl">Zvočna datoteka WavPack</comment>
+ <comment xml:lang="si">WavPack ශ්රව්ය</comment>
+ <comment xml:lang="sk">Zvuk WavPack</comment>
+ <comment xml:lang="ru">Аудио WavPack</comment>
+ <comment xml:lang="ro">Audio WavPack</comment>
+ <comment xml:lang="pt_BR">Áudio WavPack</comment>
+ <comment xml:lang="pt">áudio WavPack</comment>
+ <comment xml:lang="pl">Plik dźwiękowy WavPack</comment>
+ <comment xml:lang="oc">àudio WavPack</comment>
+ <comment xml:lang="nn">WavPack-lyd</comment>
+ <comment xml:lang="nl">WavPack-audio</comment>
+ <comment xml:lang="nb">WavPack-lyd</comment>
+ <comment xml:lang="lv">WavPack audio</comment>
+ <comment xml:lang="lt">WavPack garso įrašas</comment>
+ <comment xml:lang="ko">WavPack 오디오</comment>
+ <comment xml:lang="kk">WavPack аудиосы</comment>
+ <comment xml:lang="ja">WavPack オーディオ</comment>
+ <comment xml:lang="it">Audio WavPack</comment>
+ <comment xml:lang="is">WavPack hljóðskrá</comment>
+ <comment xml:lang="id">Audio WavPack</comment>
+ <comment xml:lang="ia">Audio WavPack</comment>
+ <comment xml:lang="hu">WavPack hang</comment>
+ <comment xml:lang="hr">WavPack zvučni zapis</comment>
+ <comment xml:lang="he">שמע WavPack</comment>
+ <comment xml:lang="gl">son WavPack</comment>
+ <comment xml:lang="ga">fuaim WavPack</comment>
+ <comment xml:lang="fur">audio WavPack</comment>
+ <comment xml:lang="fr">audio WavPack</comment>
+ <comment xml:lang="fo">WavPack ljóður</comment>
+ <comment xml:lang="fi">WavPack-ääni</comment>
+ <comment xml:lang="eu">WavPack audioa</comment>
+ <comment xml:lang="es">sonido WavPack</comment>
+ <comment xml:lang="eo">WavPack-sondosiero</comment>
+ <comment xml:lang="en_GB">WavPack audio</comment>
+ <comment xml:lang="el">Ήχος WavePack</comment>
+ <comment xml:lang="de">WavPack-Audio</comment>
+ <comment xml:lang="da">WavPack-lyd</comment>
+ <comment xml:lang="cs">zvuk WavPack</comment>
+ <comment xml:lang="ca">àudio de WavPack</comment>
+ <comment xml:lang="bg">Аудио — WavPack</comment>
+ <comment xml:lang="be@latin">Aŭdyjo WavPack</comment>
+ <comment xml:lang="be">аўдыя WavPack</comment>
+ <comment xml:lang="ar">صوت WavPack</comment>
+ <comment xml:lang="af">WavPack-oudio</comment>
+ <magic>
<match type="string" value="wvpk" offset="0"/>
</magic>
<glob pattern="*.wv"/>
@@ -23815,114 +25017,122 @@ command to generate the output files.
</mime-type>
<mime-type type="audio/x-wavpack-correction">
<comment>WavPack audio correction file</comment>
- <comment xml:lang="ar">ملف تصحيح WavPack السمعي</comment>
- <comment xml:lang="be-Latn">Fajł aŭdyjokarekcyi WavPack</comment>
- <comment xml:lang="bg">Файл за корекции на аудио — WavPack</comment>
- <comment xml:lang="ca">fitxer de correcció d'àudio de WavPack</comment>
- <comment xml:lang="cs">opravný zvukový soubor WavPack</comment>
- <comment xml:lang="da">WavPack-lydkorrektionsfil</comment>
- <comment xml:lang="de">WavPack-Audiokorrekturdatei</comment>
- <comment xml:lang="el">Αρχείο διόρθωσης ήχου WavePack</comment>
- <comment xml:lang="en-GB">WavPack audio correction file</comment>
- <comment xml:lang="es">archivo de corrección de audio WavPack</comment>
- <comment xml:lang="eu">WavPack audio-zuzenketaren fitxategia</comment>
- <comment xml:lang="fi">WavPack-äänikorjaustiedosto</comment>
- <comment xml:lang="fo">WavPack ljóðrættingarfíla</comment>
- <comment xml:lang="fr">fichier de correction audio WavPack</comment>
- <comment xml:lang="fur">file di corezion audio WavPack</comment>
- <comment xml:lang="ga">comhad ceartúchán fuaime WavPack</comment>
- <comment xml:lang="gl">ficheiro de corrección de son WavPack</comment>
- <comment xml:lang="he">קובץ תיקון שמע של WavPack</comment>
- <comment xml:lang="hr">WavPack datoteka ispravke zvuka</comment>
- <comment xml:lang="hu">WavPack hangjavítási fájl</comment>
- <comment xml:lang="ia">File de correction audio WavPack</comment>
- <comment xml:lang="id">Berkas koreksi audio WavPack</comment>
- <comment xml:lang="it">File correzione audio WavPack</comment>
- <comment xml:lang="ja">WavPack オーディオコレクションファイル</comment>
- <comment xml:lang="kk">WavPack аудио түзету файлы</comment>
- <comment xml:lang="ko">WavPack 오디오 교정 파일</comment>
- <comment xml:lang="lt">WavPack garso korekcijos failas</comment>
- <comment xml:lang="lv">WavPack audio korekciju datne</comment>
- <comment xml:lang="nb">WavPack lydkorrigeringsfil</comment>
- <comment xml:lang="nl">WavPack-audio-correctiebestand</comment>
- <comment xml:lang="nn">WawPack lydopprettingsfil</comment>
- <comment xml:lang="oc">fichièr de correccion àudio WavPack</comment>
- <comment xml:lang="pl">Plik korekcji dźwięku WavPack</comment>
- <comment xml:lang="pt">ficheiro de correção áudio WavPack</comment>
- <comment xml:lang="pt-BR">Arquivo de correção de áudio WavPack</comment>
- <comment xml:lang="ro">Fișier audio de corecție WavPack</comment>
- <comment xml:lang="ru">Файл коррекции аудио WavPack</comment>
- <comment xml:lang="sk">Opravný zvukový súbor WavPack</comment>
- <comment xml:lang="sl">popravljalna zvočna datoteka WavPack</comment>
- <comment xml:lang="sq">File korrigjgimi audio WavPack</comment>
- <comment xml:lang="sr">датотека поправке Вејвпак звука</comment>
- <comment xml:lang="sv">WavPack-ljudkorrigeringsfil</comment>
- <comment xml:lang="tr">WavPack ses düzeltme dosyası</comment>
- <comment xml:lang="uk">файл корекції звуку WavPack</comment>
+ <comment xml:lang="zh_TW">WavPack 音訊校正檔</comment>
+ <comment xml:lang="zh_CN">WavPack 音频校正文件</comment>
<comment xml:lang="vi">Tập tin sửa chữa âm thanh WavPack</comment>
- <comment xml:lang="zh-CN">WavPack 音频校正文件</comment>
- <comment xml:lang="zh-TW">WavPack 音訊校正檔</comment>
- <magic priority="50">
+ <comment xml:lang="uk">файл корекції звуку WavPack</comment>
+ <comment xml:lang="tr">WavPack ses düzeltme dosyası</comment>
+ <comment xml:lang="sv">WavPack-ljudkorrigeringsfil</comment>
+ <comment xml:lang="sr">датотека поправке Вејвпак звука</comment>
+ <comment xml:lang="sq">kartelë saktësimi audio WavPack</comment>
+ <comment xml:lang="sl">popravljalna zvočna datoteka WavPack</comment>
+ <comment xml:lang="si">WavPack ශ්‍රව්‍ය නිවැරදි කිරීමේ ගොනුව</comment>
+ <comment xml:lang="sk">Opravný zvukový súbor WavPack</comment>
+ <comment xml:lang="ru">Файл коррекции аудио WavPack</comment>
+ <comment xml:lang="ro">Fișier audio de corecție WavPack</comment>
+ <comment xml:lang="pt_BR">Arquivo de correção de áudio WavPack</comment>
+ <comment xml:lang="pt">ficheiro de correção áudio WavPack</comment>
+ <comment xml:lang="pl">Plik korekcji dźwięku WavPack</comment>
+ <comment xml:lang="oc">fichièr de correccion àudio WavPack</comment>
+ <comment xml:lang="nn">WawPack lydopprettingsfil</comment>
+ <comment xml:lang="nl">WavPack-audio-correctiebestand</comment>
+ <comment xml:lang="nb">WavPack lydkorrigeringsfil</comment>
+ <comment xml:lang="lv">WavPack audio korekciju datne</comment>
+ <comment xml:lang="lt">WavPack garso korekcijos failas</comment>
+ <comment xml:lang="ko">WavPack 오디오 교정 파일</comment>
+ <comment xml:lang="kk">WavPack аудио түзету файлы</comment>
+ <comment xml:lang="ja">WavPack オーディオコレクションファイル</comment>
+ <comment xml:lang="it">File correzione audio WavPack</comment>
+ <comment xml:lang="is">WavPack hljóðleiðréttingaskrá</comment>
+ <comment xml:lang="id">Berkas koreksi audio WavPack</comment>
+ <comment xml:lang="ia">File de correction audio WavPack</comment>
+ <comment xml:lang="hu">WavPack hangjavítási fájl</comment>
+ <comment xml:lang="hr">WavPack datoteka ispravke zvuka</comment>
+ <comment xml:lang="he">קובץ תיקון שמע של WavPack</comment>
+ <comment xml:lang="gl">ficheiro de corrección de son WavPack</comment>
+ <comment xml:lang="ga">comhad ceartúchán fuaime WavPack</comment>
+ <comment xml:lang="fur">file di corezion audio WavPack</comment>
+ <comment xml:lang="fr">fichier de correction audio WavPack</comment>
+ <comment xml:lang="fo">WavPack ljóðrættingarfíla</comment>
+ <comment xml:lang="fi">WavPack-äänikorjaustiedosto</comment>
+ <comment xml:lang="eu">WavPack audio-zuzenketaren fitxategia</comment>
+ <comment xml:lang="es">archivo de corrección de sonido WavPack</comment>
+ <comment xml:lang="en_GB">WavPack audio correction file</comment>
+ <comment xml:lang="el">Αρχείο διόρθωσης ήχου WavePack</comment>
+ <comment xml:lang="de">WavPack-Audiokorrekturdatei</comment>
+ <comment xml:lang="da">WavPack-lydkorrektionsfil</comment>
+ <comment xml:lang="cs">opravný zvukový soubor WavPack</comment>
+ <comment xml:lang="ca">fitxer de correcció d'àudio de WavPack</comment>
+ <comment xml:lang="bg">Файл за корекции на аудио — WavPack</comment>
+ <comment xml:lang="be@latin">Fajł aŭdyjokarekcyi WavPack</comment>
+ <comment xml:lang="be">файл аўдыякарэкцыі WavPack</comment>
+ <comment xml:lang="ar">ملف تصحيح صوت WavPack</comment>
+ <magic>
<match type="string" value="wvpk" offset="0"/>
</magic>
<glob pattern="*.wvc"/>
</mime-type>
<mime-type type="audio/midi">
<comment>MIDI audio</comment>
- <comment xml:lang="af">MIDI-oudio</comment>
- <comment xml:lang="ar">MIDI سمعي</comment>
- <comment xml:lang="az">MIDI audio faylı</comment>
- <comment xml:lang="be-Latn">Aŭdyjo MIDI</comment>
- <comment xml:lang="bg">Аудио — MIDI</comment>
- <comment xml:lang="ca">àudio MIDI</comment>
- <comment xml:lang="cs">zvuk MIDI</comment>
- <comment xml:lang="cy">Sain MIDI</comment>
- <comment xml:lang="da">MIDI-lyd</comment>
- <comment xml:lang="de">MIDI-Audio</comment>
- <comment xml:lang="el">Ήχος MIDI</comment>
- <comment xml:lang="en-GB">MIDI audio</comment>
- <comment xml:lang="eo">MIDI-sondosiero</comment>
- <comment xml:lang="es">audio MIDI</comment>
- <comment xml:lang="eu">MIDI audioa</comment>
- <comment xml:lang="fi">MIDI-ääni</comment>
- <comment xml:lang="fo">MIDI ljóður</comment>
- <comment xml:lang="fr">audio MIDI</comment>
- <comment xml:lang="fur">audio MIDI</comment>
- <comment xml:lang="ga">fuaim MIDI</comment>
- <comment xml:lang="gl">son MIDI</comment>
- <comment xml:lang="he">שמע MIDI</comment>
- <comment xml:lang="hr">MIDI zvučni zapis</comment>
- <comment xml:lang="hu">MIDI hang</comment>
- <comment xml:lang="ia">Audio MIDI</comment>
- <comment xml:lang="id">Audio MIDI</comment>
- <comment xml:lang="it">Audio MIDI</comment>
- <comment xml:lang="ja">MIDI オーディオ</comment>
- <comment xml:lang="kk">MIDI аудиосы</comment>
- <comment xml:lang="ko">미디 오디오</comment>
- <comment xml:lang="lt">MIDI garso įrašas</comment>
- <comment xml:lang="lv">MIDI audio</comment>
- <comment xml:lang="ms">Audio MIDI</comment>
- <comment xml:lang="nb">MIDI-lyd</comment>
- <comment xml:lang="nl">MIDI-audio</comment>
- <comment xml:lang="nn">MIDI-lyd</comment>
- <comment xml:lang="oc">àudio MIDI</comment>
- <comment xml:lang="pl">Plik dźwiękowy MIDI</comment>
- <comment xml:lang="pt">áudio MIDI</comment>
- <comment xml:lang="pt-BR">Áudio MIDI</comment>
- <comment xml:lang="ro">Audio MIDI</comment>
- <comment xml:lang="ru">Аудио MIDI</comment>
- <comment xml:lang="sk">Zvuk MIDI</comment>
- <comment xml:lang="sl">Zvočna datoteka MIDI</comment>
- <comment xml:lang="sq">Audio MIDI</comment>
- <comment xml:lang="sr">МИДИ звук</comment>
- <comment xml:lang="sv">MIDI-ljud</comment>
- <comment xml:lang="tr">MIDI sesi</comment>
- <comment xml:lang="uk">звук MIDI</comment>
+ <comment xml:lang="zh_TW">MIDI 音訊</comment>
+ <comment xml:lang="zh_CN">MIDI 音频</comment>
<comment xml:lang="vi">Âm thanh MIDI</comment>
- <comment xml:lang="zh-CN">MIDI 音频</comment>
- <comment xml:lang="zh-TW">MIDI 音訊</comment>
+ <comment xml:lang="uk">звук MIDI</comment>
+ <comment xml:lang="tr">MIDI sesi</comment>
+ <comment xml:lang="sv">MIDI-ljud</comment>
+ <comment xml:lang="sr">МИДИ звук</comment>
+ <comment xml:lang="sq">audio MIDI</comment>
+ <comment xml:lang="sl">Zvočna datoteka MIDI</comment>
+ <comment xml:lang="si">MIDI ශ්‍රව්‍ය</comment>
+ <comment xml:lang="sk">Zvuk MIDI</comment>
+ <comment xml:lang="ru">Аудио MIDI</comment>
+ <comment xml:lang="ro">Audio MIDI</comment>
+ <comment xml:lang="pt_BR">Áudio MIDI</comment>
+ <comment xml:lang="pt">áudio MIDI</comment>
+ <comment xml:lang="pl">Plik dźwiękowy MIDI</comment>
+ <comment xml:lang="oc">àudio MIDI</comment>
+ <comment xml:lang="nn">MIDI-lyd</comment>
+ <comment xml:lang="nl">MIDI-audio</comment>
+ <comment xml:lang="nb">MIDI-lyd</comment>
+ <comment xml:lang="ms">Audio MIDI</comment>
+ <comment xml:lang="lv">MIDI audio</comment>
+ <comment xml:lang="lt">MIDI garso įrašas</comment>
+ <comment xml:lang="ko">미디 오디오</comment>
+ <comment xml:lang="kk">MIDI аудиосы</comment>
+ <comment xml:lang="ja">MIDI オーディオ</comment>
+ <comment xml:lang="it">Audio MIDI</comment>
+ <comment xml:lang="is">MIDI hljóðskrá</comment>
+ <comment xml:lang="id">Audio MIDI</comment>
+ <comment xml:lang="ia">Audio MIDI</comment>
+ <comment xml:lang="hu">MIDI hang</comment>
+ <comment xml:lang="hr">MIDI zvučni zapis</comment>
+ <comment xml:lang="he">שמע MIDI</comment>
+ <comment xml:lang="gl">son MIDI</comment>
+ <comment xml:lang="ga">fuaim MIDI</comment>
+ <comment xml:lang="fur">audio MIDI</comment>
+ <comment xml:lang="fr">audio MIDI</comment>
+ <comment xml:lang="fo">MIDI ljóður</comment>
+ <comment xml:lang="fi">MIDI-ääni</comment>
+ <comment xml:lang="eu">MIDI audioa</comment>
+ <comment xml:lang="es">sonido MIDI</comment>
+ <comment xml:lang="eo">MIDI-sondosiero</comment>
+ <comment xml:lang="en_GB">MIDI audio</comment>
+ <comment xml:lang="el">Ήχος MIDI</comment>
+ <comment xml:lang="de">MIDI-Audio</comment>
+ <comment xml:lang="da">MIDI-lyd</comment>
+ <comment xml:lang="cy">Sain MIDI</comment>
+ <comment xml:lang="cs">zvuk MIDI</comment>
+ <comment xml:lang="ca">àudio MIDI</comment>
+ <comment xml:lang="bg">Аудио — MIDI</comment>
+ <comment xml:lang="be@latin">Aŭdyjo MIDI</comment>
+ <comment xml:lang="be">аўдыя MIDI</comment>
+ <comment xml:lang="az">MIDI audio faylı</comment>
+ <comment xml:lang="ar">صوت MIDI</comment>
+ <comment xml:lang="af">MIDI-oudio</comment>
+ <acronym>MIDI</acronym>
+ <expanded-acronym>Musical Instrument Digital Interface</expanded-acronym>
<alias type="audio/x-midi"/>
- <magic priority="50">
+ <magic>
<match type="string" value="MThd" offset="0"/>
</magic>
<glob pattern="*.mid"/>
@@ -23930,101 +25140,70 @@ command to generate the output files.
<glob pattern="*.kar"/>
</mime-type>
<mime-type type="audio/x-mo3">
- <comment>compressed Tracker audio</comment>
- <comment xml:lang="ar">Tracker سمعي مضغوط</comment>
- <comment xml:lang="be-Latn">aŭdyjo skampresavanaha Trackera</comment>
- <comment xml:lang="bg">Аудио — Tracker, компресирано</comment>
- <comment xml:lang="ca">àudio Tracker amb compressió</comment>
- <comment xml:lang="cs">komprimovaný zvuk Tracker</comment>
- <comment xml:lang="da">komprimeret trackerlyd</comment>
- <comment xml:lang="de">Komprimiertes Tracker-Audio</comment>
- <comment xml:lang="el">Συμπιεσμένος ήχος Tracker</comment>
- <comment xml:lang="en-GB">compressed Tracker audio</comment>
- <comment xml:lang="es">audio de Tracker comprimido</comment>
- <comment xml:lang="eu">konprimitutako Tracker audioa</comment>
- <comment xml:lang="fi">pakattu Tracker-ääni</comment>
- <comment xml:lang="fo">stappað Tracker ljóður</comment>
- <comment xml:lang="fr">audio Tracker compressé</comment>
- <comment xml:lang="fur">audio Tracker comprimût</comment>
- <comment xml:lang="ga">fuaim chomhbhrúite Tracker</comment>
- <comment xml:lang="gl">son comprimido de Tracker</comment>
- <comment xml:lang="he">שמע גשש מכווץ</comment>
- <comment xml:lang="hr">Sažeti Tracker zvučni zapis</comment>
- <comment xml:lang="hu">tömörített Tracker hang</comment>
- <comment xml:lang="ia">Audio Tracker comprimite</comment>
- <comment xml:lang="id">audio Tracker terkompresi</comment>
- <comment xml:lang="it">Audio compresso Tracker</comment>
- <comment xml:lang="ja">圧縮 Tracker オーディオ</comment>
- <comment xml:lang="kk">сығылған Tracker аудиосы</comment>
- <comment xml:lang="ko">압축된 Tracker 오디오</comment>
- <comment xml:lang="lt">suglaudintas Tracker garso įrašas</comment>
- <comment xml:lang="lv">saspiests Tracker audio</comment>
- <comment xml:lang="nl">ingepakte Tracker-audio</comment>
- <comment xml:lang="nn">komprimert Tracker-lyd</comment>
- <comment xml:lang="oc">àudio Tracker compressat</comment>
- <comment xml:lang="pl">Skompresowany plik dźwiękowy Tracker</comment>
- <comment xml:lang="pt">áudio comprimido Tracker</comment>
- <comment xml:lang="pt-BR">Áudio Tracker compactado</comment>
- <comment xml:lang="ro">Tracker audio comprimat</comment>
+ <comment>Compressed Tracker audio</comment>
+ <comment xml:lang="uk">стиснутий звук tracker</comment>
+ <comment xml:lang="sv">Komprimerat Tracker-ljud</comment>
<comment xml:lang="ru">Сжатое аудио Tracker</comment>
- <comment xml:lang="sk">Komprimovaný zvuk Tracker</comment>
- <comment xml:lang="sl">Skrčena zvočna datoteka Tracker</comment>
- <comment xml:lang="sq">Audio Tracker e kompresuar</comment>
- <comment xml:lang="sr">запаковани звук Пратиоца</comment>
- <comment xml:lang="sv">komprimerat Tracker-ljud</comment>
- <comment xml:lang="tr">sıkıştırılmış Tracker sesi</comment>
- <comment xml:lang="uk">стиснутий звук Tracker</comment>
- <comment xml:lang="vi">âm thanh Tracker đã nén</comment>
- <comment xml:lang="zh-CN">压缩的 Tracker 音频</comment>
- <comment xml:lang="zh-TW">壓縮版 Tracker 音訊</comment>
- <magic priority="50">
+ <comment xml:lang="pl">Skompresowany plik dźwiękowy Tracker</comment>
+ <comment xml:lang="it">Audio compresso Tracker</comment>
+ <comment xml:lang="gl">Son de Tracker comprimido</comment>
+ <comment xml:lang="es">audio de Tracker comprimido</comment>
+ <comment xml:lang="de">Komprimiertes Tracker-Audio</comment>
+ <comment xml:lang="be">сціснутае аўдыя Tracker</comment>
+ <magic>
<match type="string" value="MO3" offset="0"/>
</magic>
<glob pattern="*.mo3"/>
</mime-type>
<mime-type type="audio/aac">
<comment>AAC audio</comment>
- <comment xml:lang="af">AAC-oudio</comment>
- <comment xml:lang="bg">Аудио — AAC</comment>
- <comment xml:lang="ca">àudio AAC</comment>
- <comment xml:lang="cs">zvuk AAC</comment>
- <comment xml:lang="da">AAC-lyd</comment>
- <comment xml:lang="de">AAC-Audio</comment>
- <comment xml:lang="el">Ήχος AAC</comment>
- <comment xml:lang="en-GB">AAC audio</comment>
- <comment xml:lang="es">audio AAC</comment>
- <comment xml:lang="eu">AAC audioa</comment>
- <comment xml:lang="fi">AAC-ääni</comment>
- <comment xml:lang="fr">audio AAC</comment>
- <comment xml:lang="fur">audio AAC</comment>
- <comment xml:lang="ga">fuaim AAC</comment>
- <comment xml:lang="gl">Son AAC</comment>
- <comment xml:lang="he">שמע AAC</comment>
- <comment xml:lang="hr">AAC zvučni zapis</comment>
- <comment xml:lang="hu">AAC hang</comment>
- <comment xml:lang="ia">Audio ACC</comment>
- <comment xml:lang="id">Audio AAC</comment>
- <comment xml:lang="it">Audio AAC</comment>
- <comment xml:lang="ja">AAC オーディオ</comment>
- <comment xml:lang="kk">AAC аудиосы</comment>
- <comment xml:lang="ko">AAC 오디오</comment>
- <comment xml:lang="lv">AAC audio</comment>
- <comment xml:lang="oc">àudio AAC</comment>
- <comment xml:lang="pl">Plik dźwiękowy AAC</comment>
- <comment xml:lang="pt">áudio AAC</comment>
- <comment xml:lang="pt-BR">Áudio AAC</comment>
- <comment xml:lang="ru">Аудио AAC</comment>
- <comment xml:lang="sk">Zvuk AAC</comment>
- <comment xml:lang="sl">Zvok AAC</comment>
- <comment xml:lang="sr">ААЦ звук</comment>
- <comment xml:lang="sv">AAC-ljud</comment>
- <comment xml:lang="tr">AAC sesi</comment>
+ <comment xml:lang="zh_TW">AAC 音訊</comment>
+ <comment xml:lang="zh_CN">AAC 音频</comment>
<comment xml:lang="uk">звукові дані AAC</comment>
- <comment xml:lang="zh-CN">AAC 音频</comment>
- <comment xml:lang="zh-TW">AAC 音訊</comment>
+ <comment xml:lang="tr">AAC sesi</comment>
+ <comment xml:lang="sv">AAC-ljud</comment>
+ <comment xml:lang="sr">ААЦ звук</comment>
+ <comment xml:lang="sq">audio AAC</comment>
+ <comment xml:lang="sl">Zvok AAC</comment>
+ <comment xml:lang="si">AAC ශ්රව්ය</comment>
+ <comment xml:lang="sk">Zvuk AAC</comment>
+ <comment xml:lang="ru">Аудио AAC</comment>
+ <comment xml:lang="pt_BR">Áudio AAC</comment>
+ <comment xml:lang="pt">áudio AAC</comment>
+ <comment xml:lang="pl">Plik dźwiękowy AAC</comment>
+ <comment xml:lang="oc">àudio AAC</comment>
+ <comment xml:lang="nl">AAC-audio</comment>
+ <comment xml:lang="lv">AAC audio</comment>
+ <comment xml:lang="ko">AAC 오디오</comment>
+ <comment xml:lang="kk">AAC аудиосы</comment>
+ <comment xml:lang="ja">AAC オーディオ</comment>
+ <comment xml:lang="it">Audio AAC</comment>
+ <comment xml:lang="is">AAC hljóðskrá</comment>
+ <comment xml:lang="id">Audio AAC</comment>
+ <comment xml:lang="ia">Audio ACC</comment>
+ <comment xml:lang="hu">AAC hang</comment>
+ <comment xml:lang="hr">AAC zvučni zapis</comment>
+ <comment xml:lang="he">שמע AAC</comment>
+ <comment xml:lang="gl">Son AAC</comment>
+ <comment xml:lang="ga">fuaim AAC</comment>
+ <comment xml:lang="fur">audio AAC</comment>
+ <comment xml:lang="fr">audio AAC</comment>
+ <comment xml:lang="fi">AAC-ääni</comment>
+ <comment xml:lang="eu">AAC audioa</comment>
+ <comment xml:lang="es">sonido AAC</comment>
+ <comment xml:lang="en_GB">AAC audio</comment>
+ <comment xml:lang="el">Ήχος AAC</comment>
+ <comment xml:lang="de">AAC-Audio</comment>
+ <comment xml:lang="da">AAC-lyd</comment>
+ <comment xml:lang="cs">zvuk AAC</comment>
+ <comment xml:lang="ca">àudio AAC</comment>
+ <comment xml:lang="bg">Аудио — AAC</comment>
+ <comment xml:lang="be">аўдыя AAC</comment>
+ <comment xml:lang="ar">صوت AAC</comment>
+ <comment xml:lang="af">AAC-oudio</comment>
<acronym>AAC</acronym>
<expanded-acronym>Advanced Audio Coding</expanded-acronym>
- <magic priority="50">
+ <magic>
<match type="string" value="ADIF" offset="0"/>
<match type="big16" value="0xFFF0" mask="0xFFF6" offset="0"/>
</magic>
@@ -24035,34 +25214,44 @@ command to generate the output files.
</mime-type>
<mime-type type="audio/usac">
<comment>USAC audio</comment>
- <comment xml:lang="af">USAC-oudio</comment>
- <comment xml:lang="bg">Аудио — USAC</comment>
- <comment xml:lang="ca">àudio USAC</comment>
- <comment xml:lang="cs">zvuk USAC</comment>
- <comment xml:lang="da">USAC-lyd</comment>
- <comment xml:lang="de">USAC-Audio</comment>
- <comment xml:lang="en-GB">USAC audio</comment>
- <comment xml:lang="es">audio USAC</comment>
- <comment xml:lang="eu">USAC audioa</comment>
- <comment xml:lang="fi">USAC-ääni</comment>
- <comment xml:lang="fr">audio USAC</comment>
- <comment xml:lang="fur">audio USAC</comment>
- <comment xml:lang="ga">fuaim USAC</comment>
- <comment xml:lang="hr">USAC zvučni zapis</comment>
- <comment xml:lang="hu">USAC hang</comment>
- <comment xml:lang="id">Audio USAC</comment>
- <comment xml:lang="it">Audio USAC</comment>
- <comment xml:lang="kk">USAC аудиосы</comment>
- <comment xml:lang="ko">USAC 오디오</comment>
- <comment xml:lang="pl">Plik dźwiękowy USAC</comment>
- <comment xml:lang="pt-BR">Áudio USAC</comment>
- <comment xml:lang="ru">Аудио USAC</comment>
- <comment xml:lang="sk">Zvuk USAC</comment>
- <comment xml:lang="sv">USAC-ljud</comment>
- <comment xml:lang="tr">USAC sesi</comment>
+ <comment xml:lang="zh_TW">USAC 音訊</comment>
+ <comment xml:lang="zh_CN">USAC 音频</comment>
<comment xml:lang="uk">звукові дані USAC</comment>
- <comment xml:lang="zh-CN">USAC 音频</comment>
- <comment xml:lang="zh-TW">USAC 音訊</comment>
+ <comment xml:lang="tr">USAC sesi</comment>
+ <comment xml:lang="sv">USAC-ljud</comment>
+ <comment xml:lang="sq">audio USAC</comment>
+ <comment xml:lang="sl">Zvok USAC</comment>
+ <comment xml:lang="si">USAC ශ්රව්ය</comment>
+ <comment xml:lang="sk">Zvuk USAC</comment>
+ <comment xml:lang="ru">Аудио USAC</comment>
+ <comment xml:lang="pt_BR">Áudio USAC</comment>
+ <comment xml:lang="pl">Plik dźwiękowy USAC</comment>
+ <comment xml:lang="nl">USAC-audio</comment>
+ <comment xml:lang="ko">USAC 오디오</comment>
+ <comment xml:lang="kk">USAC аудиосы</comment>
+ <comment xml:lang="ja">USAC オーディオ</comment>
+ <comment xml:lang="it">Audio USAC</comment>
+ <comment xml:lang="is">USAC hljóðskrá</comment>
+ <comment xml:lang="id">Audio USAC</comment>
+ <comment xml:lang="hu">USAC hang</comment>
+ <comment xml:lang="hr">USAC zvučni zapis</comment>
+ <comment xml:lang="he">שמע USAC</comment>
+ <comment xml:lang="gl">Son USAC</comment>
+ <comment xml:lang="ga">fuaim USAC</comment>
+ <comment xml:lang="fur">audio USAC</comment>
+ <comment xml:lang="fr">audio USAC</comment>
+ <comment xml:lang="fi">USAC-ääni</comment>
+ <comment xml:lang="eu">USAC audioa</comment>
+ <comment xml:lang="es">sonido USAC</comment>
+ <comment xml:lang="en_GB">USAC audio</comment>
+ <comment xml:lang="de">USAC-Audio</comment>
+ <comment xml:lang="da">USAC-lyd</comment>
+ <comment xml:lang="cs">zvuk USAC</comment>
+ <comment xml:lang="ca">àudio USAC</comment>
+ <comment xml:lang="bg">Аудио — USAC</comment>
+ <comment xml:lang="be">аўдыя USAC</comment>
+ <comment xml:lang="ar">صوت USAC</comment>
+ <comment xml:lang="af">USAC-oudio</comment>
<acronym>USAC</acronym>
<expanded-acronym>Unified Speech and Audio Coding</expanded-acronym>
<glob pattern="*.loas"/>
@@ -24070,59 +25259,62 @@ command to generate the output files.
</mime-type>
<mime-type type="audio/mp4">
<comment>MPEG-4 audio</comment>
- <comment xml:lang="af">MPEG-4-oudio</comment>
- <comment xml:lang="ar">MPEG-4 سمعي</comment>
- <comment xml:lang="be-Latn">Aŭdyjo MPEG-4</comment>
- <comment xml:lang="bg">Аудио — MPEG-4</comment>
- <comment xml:lang="ca">àudio MPEG-4</comment>
- <comment xml:lang="cs">zvuk MPEG-4</comment>
- <comment xml:lang="da">MPEG4-lyd</comment>
- <comment xml:lang="de">MPEG-4-Audio</comment>
- <comment xml:lang="el">Ήχος MPEG-4</comment>
- <comment xml:lang="en-GB">MPEG-4 audio</comment>
- <comment xml:lang="eo">MPEG4-sondosiero</comment>
- <comment xml:lang="es">audio MPEG-4</comment>
- <comment xml:lang="eu">MPEG-4 audioa</comment>
- <comment xml:lang="fi">MPEG-4-ääni</comment>
- <comment xml:lang="fo">MPEG-4 ljóður</comment>
- <comment xml:lang="fr">audio MPEG-4</comment>
- <comment xml:lang="fur">audio MPEG-4</comment>
- <comment xml:lang="ga">fuaim MPEG-4</comment>
- <comment xml:lang="gl">son MPEG-4</comment>
- <comment xml:lang="he">שמע MPEG-4</comment>
- <comment xml:lang="hr">MPEG-4 zvučni zapis</comment>
- <comment xml:lang="hu">MPEG-4 hang</comment>
- <comment xml:lang="ia">Audio MPEG-4</comment>
- <comment xml:lang="id">Audio MPEG-4</comment>
- <comment xml:lang="it">Audio MPEG-4</comment>
- <comment xml:lang="ja">MPEG-4 オーディオ</comment>
- <comment xml:lang="ka">MPEG-4 აუდიო</comment>
- <comment xml:lang="kk">MPEG-4 аудиосы</comment>
- <comment xml:lang="ko">MPEG-4 오디오</comment>
- <comment xml:lang="lt">MPEG-4 garso įrašas</comment>
- <comment xml:lang="lv">MPEG-4 audio</comment>
- <comment xml:lang="nb">MPEG-4-lyd</comment>
- <comment xml:lang="nl">MPEG4-audio</comment>
- <comment xml:lang="nn">MPEG-4-lyd</comment>
- <comment xml:lang="oc">àudio MPEG-4</comment>
- <comment xml:lang="pl">Plik dźwiękowy MPEG-4</comment>
- <comment xml:lang="pt">áudio MPEG-4</comment>
- <comment xml:lang="pt-BR">Áudio MPEG-4</comment>
- <comment xml:lang="ro">Audio MPEG-4</comment>
- <comment xml:lang="ru">Аудио MPEG-4</comment>
- <comment xml:lang="sk">Zvuk MPEG-4</comment>
- <comment xml:lang="sl">Zvočna datoteka MPEG-4</comment>
- <comment xml:lang="sq">Audio MPEG-4</comment>
- <comment xml:lang="sr">МПЕГ-4 звук</comment>
- <comment xml:lang="sv">MPEG-4-ljud</comment>
- <comment xml:lang="tr">MPEG-4 sesi</comment>
- <comment xml:lang="uk">звук MPEG-4</comment>
+ <comment xml:lang="zh_TW">MPEG-4 音訊</comment>
+ <comment xml:lang="zh_CN">MPEG-4 音频</comment>
<comment xml:lang="vi">Âm thanh MPEG-4</comment>
- <comment xml:lang="zh-CN">MPEG-4 音频</comment>
- <comment xml:lang="zh-TW">MPEG-4 音訊</comment>
+ <comment xml:lang="uk">звук MPEG-4</comment>
+ <comment xml:lang="tr">MPEG-4 sesi</comment>
+ <comment xml:lang="sv">MPEG-4-ljud</comment>
+ <comment xml:lang="sr">МПЕГ-4 звук</comment>
+ <comment xml:lang="sq">audio MPEG-4</comment>
+ <comment xml:lang="sl">Zvočna datoteka MPEG-4</comment>
+ <comment xml:lang="si">MPEG-4 ශ්රව්ය</comment>
+ <comment xml:lang="sk">Zvuk MPEG-4</comment>
+ <comment xml:lang="ru">Аудио MPEG-4</comment>
+ <comment xml:lang="ro">Audio MPEG-4</comment>
+ <comment xml:lang="pt_BR">Áudio MPEG-4</comment>
+ <comment xml:lang="pt">áudio MPEG-4</comment>
+ <comment xml:lang="pl">Plik dźwiękowy MPEG-4</comment>
+ <comment xml:lang="oc">àudio MPEG-4</comment>
+ <comment xml:lang="nn">MPEG-4-lyd</comment>
+ <comment xml:lang="nl">MPEG4-audio</comment>
+ <comment xml:lang="nb">MPEG-4-lyd</comment>
+ <comment xml:lang="lv">MPEG-4 audio</comment>
+ <comment xml:lang="lt">MPEG-4 garso įrašas</comment>
+ <comment xml:lang="ko">MPEG-4 오디오</comment>
+ <comment xml:lang="kk">MPEG-4 аудиосы</comment>
+ <comment xml:lang="ka">MPEG-4 აუდიო</comment>
+ <comment xml:lang="ja">MPEG-4 オーディオ</comment>
+ <comment xml:lang="it">Audio MPEG-4</comment>
+ <comment xml:lang="is">MPEG-4 hljóð</comment>
+ <comment xml:lang="id">Audio MPEG-4</comment>
+ <comment xml:lang="ia">Audio MPEG-4</comment>
+ <comment xml:lang="hu">MPEG-4 hang</comment>
+ <comment xml:lang="hr">MPEG-4 zvučni zapis</comment>
+ <comment xml:lang="he">שמע MPEG-4</comment>
+ <comment xml:lang="gl">son MPEG-4</comment>
+ <comment xml:lang="ga">fuaim MPEG-4</comment>
+ <comment xml:lang="fur">audio MPEG-4</comment>
+ <comment xml:lang="fr">audio MPEG-4</comment>
+ <comment xml:lang="fo">MPEG-4 ljóður</comment>
+ <comment xml:lang="fi">MPEG-4-ääni</comment>
+ <comment xml:lang="eu">MPEG-4 audioa</comment>
+ <comment xml:lang="es">sonido MPEG-4</comment>
+ <comment xml:lang="eo">MPEG4-sondosiero</comment>
+ <comment xml:lang="en_GB">MPEG-4 audio</comment>
+ <comment xml:lang="el">Ήχος MPEG-4</comment>
+ <comment xml:lang="de">MPEG-4-Audio</comment>
+ <comment xml:lang="da">MPEG4-lyd</comment>
+ <comment xml:lang="cs">zvuk MPEG-4</comment>
+ <comment xml:lang="ca">àudio MPEG-4</comment>
+ <comment xml:lang="bg">Аудио — MPEG-4</comment>
+ <comment xml:lang="be@latin">Aŭdyjo MPEG-4</comment>
+ <comment xml:lang="be">аўдыя MPEG-4</comment>
+ <comment xml:lang="ar">صوت MPEG-4</comment>
+ <comment xml:lang="af">MPEG-4-oudio</comment>
<alias type="audio/x-m4a"/>
<alias type="audio/m4a"/>
- <magic priority="50">
+ <magic>
<match type="string" value="ftypM4A" offset="4"/>
</magic>
<glob pattern="*.m4a"/>
@@ -24130,88 +25322,101 @@ command to generate the output files.
</mime-type>
<mime-type type="audio/x-m4r">
<comment>MPEG-4 ringtone</comment>
- <comment xml:lang="bg">Аудио — MPEG-4, звънене</comment>
- <comment xml:lang="ca">to de trucada MPEG-4</comment>
- <comment xml:lang="da">MPEG-4-ringetone</comment>
- <comment xml:lang="de">MPEG-4-Klingelton</comment>
- <comment xml:lang="en-GB">MPEG-4 ringtone</comment>
- <comment xml:lang="es">tono de llamada MPEG-4</comment>
- <comment xml:lang="eu">MPEG-4 dei-tonua</comment>
- <comment xml:lang="fi">MPEG-4-soittoääni</comment>
- <comment xml:lang="fr">sonnerie MPEG-4</comment>
- <comment xml:lang="hr">MPEG-4 melodija zvona</comment>
- <comment xml:lang="hu">MPEG-4 csengőhang</comment>
- <comment xml:lang="id">Nada panggil MPEG-4</comment>
- <comment xml:lang="it">Suoneria MPEG-4</comment>
- <comment xml:lang="kk">MPEG-4 рингтоны</comment>
- <comment xml:lang="ko">MPEG-4 벨소리</comment>
- <comment xml:lang="pl">Dzwonek MPEG-4</comment>
- <comment xml:lang="pt-BR">Toque MPEG-4</comment>
- <comment xml:lang="ru">Мелодия MPEG-4</comment>
- <comment xml:lang="sk">Zvonenie MPEG-4</comment>
- <comment xml:lang="sv">MPEG-4-ringsignal</comment>
- <comment xml:lang="tr">MPEG-4 zil sesi</comment>
+ <comment xml:lang="zh_TW">MPEG-4 鈴聲</comment>
+ <comment xml:lang="zh_CN">MPEG-4 铃声</comment>
<comment xml:lang="uk">рингтон MPEG-4</comment>
- <comment xml:lang="zh-CN">MPEG-4 铃声</comment>
- <comment xml:lang="zh-TW">MPEG-4 鈴聲</comment>
+ <comment xml:lang="tr">MPEG-4 zil sesi</comment>
+ <comment xml:lang="sv">MPEG-4-ringsignal</comment>
+ <comment xml:lang="sq">zile MPEG-4</comment>
+ <comment xml:lang="sl">Zvonjenje MPEG-4</comment>
+ <comment xml:lang="si">MPEG-4 නාද රටාව</comment>
+ <comment xml:lang="sk">Zvonenie MPEG-4</comment>
+ <comment xml:lang="ru">Мелодия MPEG-4</comment>
+ <comment xml:lang="pt_BR">Toque MPEG-4</comment>
+ <comment xml:lang="pl">Dzwonek MPEG-4</comment>
+ <comment xml:lang="nl">MPEG-4-ringtone</comment>
+ <comment xml:lang="ko">MPEG-4 벨소리</comment>
+ <comment xml:lang="kk">MPEG-4 рингтоны</comment>
+ <comment xml:lang="ja">MPEG-4 着信音</comment>
+ <comment xml:lang="it">Suoneria MPEG-4</comment>
+ <comment xml:lang="is">MPEG-4 hringitónn</comment>
+ <comment xml:lang="id">Nada panggil MPEG-4</comment>
+ <comment xml:lang="hu">MPEG-4 csengőhang</comment>
+ <comment xml:lang="hr">MPEG-4 melodija zvona</comment>
+ <comment xml:lang="he">נעימון MPEG-4</comment>
+ <comment xml:lang="gl">Ton de chamada MPEG-4</comment>
+ <comment xml:lang="fr">sonnerie MPEG-4</comment>
+ <comment xml:lang="fi">MPEG-4-soittoääni</comment>
+ <comment xml:lang="eu">MPEG-4 dei-tonua</comment>
+ <comment xml:lang="es">tono de llamada MPEG-4</comment>
+ <comment xml:lang="en_GB">MPEG-4 ringtone</comment>
+ <comment xml:lang="de">MPEG-4-Klingelton</comment>
+ <comment xml:lang="da">MPEG-4-ringetone</comment>
+ <comment xml:lang="ca">to de trucada MPEG-4</comment>
+ <comment xml:lang="bg">Аудио — MPEG-4, звънене</comment>
+ <comment xml:lang="be">мелодыя выкліку MPEG-4</comment>
+ <comment xml:lang="ar">نغمة MPEG-4</comment>
<glob pattern="*.m4r"/>
<sub-class-of type="video/mp4"/>
</mime-type>
<mime-type type="video/mp4">
<comment>MPEG-4 video</comment>
- <comment xml:lang="af">MPEG-4-video</comment>
- <comment xml:lang="ar">MPEG-4 مرئي</comment>
- <comment xml:lang="ast">Videu en MPEG-4</comment>
- <comment xml:lang="be-Latn">Videa MPEG-4</comment>
- <comment xml:lang="bg">Видео — MPEG-4</comment>
- <comment xml:lang="ca">vídeo MPEG-4</comment>
- <comment xml:lang="cs">video MPEG-4</comment>
- <comment xml:lang="da">MPEG4-video</comment>
- <comment xml:lang="de">MPEG-4-Video</comment>
- <comment xml:lang="el">Βίντεο MPEG-4</comment>
- <comment xml:lang="en-GB">MPEG-4 video</comment>
- <comment xml:lang="eo">MPEG-4-video</comment>
- <comment xml:lang="es">vídeo MPEG-4</comment>
- <comment xml:lang="eu">MPEG-4 bideoa</comment>
- <comment xml:lang="fi">MPEG-4-video</comment>
- <comment xml:lang="fo">MPEG-4 video</comment>
- <comment xml:lang="fr">vidéo MPEG-4</comment>
- <comment xml:lang="fur">video MPEG-4</comment>
- <comment xml:lang="ga">físeán MPEG-4</comment>
- <comment xml:lang="gl">vídeo MPEG-4</comment>
- <comment xml:lang="he">וידאו MPEG-4</comment>
- <comment xml:lang="hr">MPEG-4 video snimka</comment>
- <comment xml:lang="hu">MPEG-4 videó</comment>
- <comment xml:lang="ia">Video MPEG-4</comment>
- <comment xml:lang="id">Video MPEG-4</comment>
- <comment xml:lang="it">Video MPEG-4</comment>
- <comment xml:lang="ja">MPEG-4 動画</comment>
- <comment xml:lang="ka">MPEG-4 ვიდეო</comment>
- <comment xml:lang="kk">MPEG-4 видеосы</comment>
- <comment xml:lang="ko">MPEG-4 동영상</comment>
- <comment xml:lang="lt">MPEG-4 vaizdo įrašas</comment>
- <comment xml:lang="lv">MPEG-4 video</comment>
- <comment xml:lang="nb">MPEG-4-film</comment>
- <comment xml:lang="nl">MPEG4-video</comment>
- <comment xml:lang="nn">MPEG-4-video</comment>
- <comment xml:lang="oc">vidèo MPEG-4</comment>
- <comment xml:lang="pl">Plik wideo MPEG-4</comment>
- <comment xml:lang="pt">vídeo MPEG-4</comment>
- <comment xml:lang="pt-BR">Vídeo MPEG-4</comment>
- <comment xml:lang="ro">Video MPEG-4</comment>
- <comment xml:lang="ru">Видео MPEG-4</comment>
- <comment xml:lang="sk">Video MPEG-4</comment>
- <comment xml:lang="sl">Video datoteka MPEG-4</comment>
- <comment xml:lang="sq">Video MPEG-4</comment>
- <comment xml:lang="sr">МПЕГ-4 видео</comment>
- <comment xml:lang="sv">MPEG-4-video</comment>
- <comment xml:lang="tr">MPEG-4 video</comment>
- <comment xml:lang="uk">відеокліп MPEG-4</comment>
+ <comment xml:lang="zh_TW">MPEG-4 視訊</comment>
+ <comment xml:lang="zh_CN">MPEG-4 视频</comment>
<comment xml:lang="vi">Ảnh động MPEG-4</comment>
- <comment xml:lang="zh-CN">MPEG-4 视频</comment>
- <comment xml:lang="zh-TW">MPEG-4 視訊</comment>
+ <comment xml:lang="uk">відеокліп MPEG-4</comment>
+ <comment xml:lang="tr">MPEG-4 video</comment>
+ <comment xml:lang="sv">MPEG-4-video</comment>
+ <comment xml:lang="sr">МПЕГ-4 видео</comment>
+ <comment xml:lang="sq">video MPEG-4</comment>
+ <comment xml:lang="sl">Video datoteka MPEG-4</comment>
+ <comment xml:lang="si">MPEG-4 වීඩියෝව</comment>
+ <comment xml:lang="sk">Video MPEG-4</comment>
+ <comment xml:lang="ru">Видео MPEG-4</comment>
+ <comment xml:lang="ro">Video MPEG-4</comment>
+ <comment xml:lang="pt_BR">Vídeo MPEG-4</comment>
+ <comment xml:lang="pt">vídeo MPEG-4</comment>
+ <comment xml:lang="pl">Plik wideo MPEG-4</comment>
+ <comment xml:lang="oc">vidèo MPEG-4</comment>
+ <comment xml:lang="nn">MPEG-4-video</comment>
+ <comment xml:lang="nl">MPEG4-video</comment>
+ <comment xml:lang="nb">MPEG-4-film</comment>
+ <comment xml:lang="lv">MPEG-4 video</comment>
+ <comment xml:lang="lt">MPEG-4 vaizdo įrašas</comment>
+ <comment xml:lang="ko">MPEG-4 동영상</comment>
+ <comment xml:lang="kk">MPEG-4 видеосы</comment>
+ <comment xml:lang="ka">MPEG-4 ვიდეო</comment>
+ <comment xml:lang="ja">MPEG-4 動画</comment>
+ <comment xml:lang="it">Video MPEG-4</comment>
+ <comment xml:lang="is">MPEG-4 myndskeið</comment>
+ <comment xml:lang="id">Video MPEG-4</comment>
+ <comment xml:lang="ia">Video MPEG-4</comment>
+ <comment xml:lang="hu">MPEG-4 videó</comment>
+ <comment xml:lang="hr">MPEG-4 video snimka</comment>
+ <comment xml:lang="he">וידאו MPEG-4</comment>
+ <comment xml:lang="gl">vídeo MPEG-4</comment>
+ <comment xml:lang="ga">físeán MPEG-4</comment>
+ <comment xml:lang="fur">video MPEG-4</comment>
+ <comment xml:lang="fr">vidéo MPEG-4</comment>
+ <comment xml:lang="fo">MPEG-4 video</comment>
+ <comment xml:lang="fi">MPEG-4-video</comment>
+ <comment xml:lang="eu">MPEG-4 bideoa</comment>
+ <comment xml:lang="es">vídeo MPEG-4</comment>
+ <comment xml:lang="eo">MPEG-4-video</comment>
+ <comment xml:lang="en_GB">MPEG-4 video</comment>
+ <comment xml:lang="el">Βίντεο MPEG-4</comment>
+ <comment xml:lang="de">MPEG-4-Video</comment>
+ <comment xml:lang="da">MPEG4-video</comment>
+ <comment xml:lang="cs">video MPEG-4</comment>
+ <comment xml:lang="ca">vídeo MPEG-4</comment>
+ <comment xml:lang="bg">Видео — MPEG-4</comment>
+ <comment xml:lang="be@latin">Videa MPEG-4</comment>
+ <comment xml:lang="be">відэа MPEG-4</comment>
+ <comment xml:lang="ast">Videu en MPEG-4</comment>
+ <comment xml:lang="ar">فيديو MPEG-4</comment>
+ <comment xml:lang="af">MPEG-4-video</comment>
<alias type="video/mp4v-es"/>
- <magic priority="50">
+ <magic>
<match type="string" value="ftypisom" offset="4"/>
<match type="string" value="ftypmp41" offset="4"/>
<match type="string" value="ftypmp42" offset="4"/>
@@ -24227,58 +25432,61 @@ command to generate the output files.
</mime-type>
<mime-type type="audio/x-m4b">
<comment>MPEG-4 audio book</comment>
- <comment xml:lang="af">MPEG-4-oudioboek</comment>
- <comment xml:lang="ar">كتاب MPEG-4 السمعي</comment>
- <comment xml:lang="be-Latn">Aŭdyjokniha MPEG-4</comment>
- <comment xml:lang="bg">Аудио книга — MPEG-4</comment>
- <comment xml:lang="ca">llibre d'àudio MPEG-4</comment>
- <comment xml:lang="cs">zvuková kniha MPEG-4</comment>
- <comment xml:lang="da">MPEG4-lydbog</comment>
- <comment xml:lang="de">MPEG-4-Hörbuch</comment>
- <comment xml:lang="el">Ηχητικό βιβλίο MPEG-4</comment>
- <comment xml:lang="en-GB">MPEG-4 audio book</comment>
- <comment xml:lang="eo">MPEG-4-sonlibro</comment>
- <comment xml:lang="es">audiolibro MPEG-4</comment>
- <comment xml:lang="eu">MPEG-4 audio-liburua</comment>
- <comment xml:lang="fi">MPEG-4-äänikirja</comment>
- <comment xml:lang="fo">MPEG-4 ljóðbók</comment>
- <comment xml:lang="fr">livre audio MPEG-4</comment>
- <comment xml:lang="fur">audio-libri MPEG-4</comment>
- <comment xml:lang="ga">closleabhar MPEG-4</comment>
- <comment xml:lang="gl">sonlibro de MPEG-4</comment>
- <comment xml:lang="he">ספר דיגיטלי MPEG-4</comment>
- <comment xml:lang="hr">MPEG-4 zvučna knjiga</comment>
- <comment xml:lang="hu">MPEG-4 hangoskönyv</comment>
- <comment xml:lang="ia">Libro audio MPEG-4</comment>
- <comment xml:lang="id">Buku audio MPEG-4</comment>
- <comment xml:lang="it">Audiolibro MPEG-4</comment>
- <comment xml:lang="ja">MPEG-4 オーディオブック</comment>
- <comment xml:lang="ka">MPEG-4 აუდიოწიგნი</comment>
- <comment xml:lang="kk">MPEG-4 аудио кітабы</comment>
- <comment xml:lang="ko">MPEG-4 오디오북</comment>
- <comment xml:lang="lt">MPEG-4 garso knyga</comment>
- <comment xml:lang="lv">MPEG-4 audio grāmata</comment>
- <comment xml:lang="nb">MPEG-4-lydbok</comment>
- <comment xml:lang="nl">MPEG4-audioboek</comment>
- <comment xml:lang="nn">MPEG-4-lydbok</comment>
- <comment xml:lang="oc">libre àudio MPEG-4</comment>
- <comment xml:lang="pl">Książka dźwiękowa MPEG-4</comment>
- <comment xml:lang="pt">livro áudio MPEG-4</comment>
- <comment xml:lang="pt-BR">Áudio livro MPEG-4</comment>
- <comment xml:lang="ro">Carte audio MPEG-4</comment>
- <comment xml:lang="ru">Аудиокнига MPEG-4</comment>
- <comment xml:lang="sk">Zvuková kniha MPEG-4</comment>
- <comment xml:lang="sl">Zvočna knjiga MPEG-4</comment>
- <comment xml:lang="sq">Audiolibër MPEG-4</comment>
- <comment xml:lang="sr">МПЕГ-4 звукотека</comment>
- <comment xml:lang="sv">MPEG-4-ljudbok</comment>
- <comment xml:lang="tr">MPEG-4 sesli kitabı</comment>
- <comment xml:lang="uk">аудіокнига MPEG-4</comment>
+ <comment xml:lang="zh_TW">MPEG-4 音訊書</comment>
+ <comment xml:lang="zh_CN">MPEG-4 有声书</comment>
<comment xml:lang="vi">Sách âm thanh MPEG-4</comment>
- <comment xml:lang="zh-CN">MPEG-4 有声书</comment>
- <comment xml:lang="zh-TW">MPEG-4 音訊書</comment>
+ <comment xml:lang="uk">аудіокнига MPEG-4</comment>
+ <comment xml:lang="tr">MPEG-4 sesli kitabı</comment>
+ <comment xml:lang="sv">MPEG-4-ljudbok</comment>
+ <comment xml:lang="sr">МПЕГ-4 звукотека</comment>
+ <comment xml:lang="sq">audiolibër MPEG-4</comment>
+ <comment xml:lang="sl">Zvočna knjiga MPEG-4</comment>
+ <comment xml:lang="si">MPEG-4 ශ්රව්ය පොත</comment>
+ <comment xml:lang="sk">Zvuková kniha MPEG-4</comment>
+ <comment xml:lang="ru">Аудиокнига MPEG-4</comment>
+ <comment xml:lang="ro">Carte audio MPEG-4</comment>
+ <comment xml:lang="pt_BR">Áudio livro MPEG-4</comment>
+ <comment xml:lang="pt">livro áudio MPEG-4</comment>
+ <comment xml:lang="pl">Książka dźwiękowa MPEG-4</comment>
+ <comment xml:lang="oc">libre àudio MPEG-4</comment>
+ <comment xml:lang="nn">MPEG-4-lydbok</comment>
+ <comment xml:lang="nl">MPEG4-audioboek</comment>
+ <comment xml:lang="nb">MPEG-4-lydbok</comment>
+ <comment xml:lang="lv">MPEG-4 audio grāmata</comment>
+ <comment xml:lang="lt">MPEG-4 garso knyga</comment>
+ <comment xml:lang="ko">MPEG-4 오디오북</comment>
+ <comment xml:lang="kk">MPEG-4 аудио кітабы</comment>
+ <comment xml:lang="ka">MPEG-4 აუდიოწიგნი</comment>
+ <comment xml:lang="ja">MPEG-4 オーディオブック</comment>
+ <comment xml:lang="it">Audiolibro MPEG-4</comment>
+ <comment xml:lang="is">MPEG-4 hljóðbók</comment>
+ <comment xml:lang="id">Buku audio MPEG-4</comment>
+ <comment xml:lang="ia">Libro audio MPEG-4</comment>
+ <comment xml:lang="hu">MPEG-4 hangoskönyv</comment>
+ <comment xml:lang="hr">MPEG-4 zvučna knjiga</comment>
+ <comment xml:lang="he">ספר דיגיטלי MPEG-4</comment>
+ <comment xml:lang="gl">sonlibro de MPEG-4</comment>
+ <comment xml:lang="ga">closleabhar MPEG-4</comment>
+ <comment xml:lang="fur">audio-libri MPEG-4</comment>
+ <comment xml:lang="fr">livre audio MPEG-4</comment>
+ <comment xml:lang="fo">MPEG-4 ljóðbók</comment>
+ <comment xml:lang="fi">MPEG-4-äänikirja</comment>
+ <comment xml:lang="eu">MPEG-4 audio-liburua</comment>
+ <comment xml:lang="es">audiolibro MPEG-4</comment>
+ <comment xml:lang="eo">MPEG-4-sonlibro</comment>
+ <comment xml:lang="en_GB">MPEG-4 audio book</comment>
+ <comment xml:lang="el">Ηχητικό βιβλίο MPEG-4</comment>
+ <comment xml:lang="de">MPEG-4-Hörbuch</comment>
+ <comment xml:lang="da">MPEG4-lydbog</comment>
+ <comment xml:lang="cs">zvuková kniha MPEG-4</comment>
+ <comment xml:lang="ca">llibre d'àudio MPEG-4</comment>
+ <comment xml:lang="bg">Аудио книга — MPEG-4</comment>
+ <comment xml:lang="be@latin">Aŭdyjokniha MPEG-4</comment>
+ <comment xml:lang="be">аўдыякніга MPEG-4</comment>
+ <comment xml:lang="ar">كتاب MPEG-4 صوتي</comment>
+ <comment xml:lang="af">MPEG-4-oudioboek</comment>
<sub-class-of type="audio/mp4"/>
- <magic priority="50">
+ <magic>
<match type="string" value="ftypM4B" offset="4"/>
</magic>
<glob pattern="*.m4b"/>
@@ -24286,59 +25494,62 @@ command to generate the output files.
</mime-type>
<mime-type type="video/3gpp">
<comment>3GPP multimedia file</comment>
- <comment xml:lang="af">3GPP-multimedialêer</comment>
- <comment xml:lang="ar">ملف وسائط متعددة 3GPP</comment>
- <comment xml:lang="be-Latn">Multymedyjny fajł 3GPP</comment>
- <comment xml:lang="bg">Мултимедия — 3GPP</comment>
- <comment xml:lang="ca">fitxer multimèdia 3GPP</comment>
- <comment xml:lang="cs">multimediální soubor 3GPP</comment>
- <comment xml:lang="da">3GPP multimedie-fil</comment>
- <comment xml:lang="de">3GPP-Multimediadatei</comment>
- <comment xml:lang="el">Αρχείο πολυμέσων 3GPP</comment>
- <comment xml:lang="en-GB">3GPP multimedia file</comment>
- <comment xml:lang="es">archivo multimedia 3GPP</comment>
- <comment xml:lang="eu">3GPP multimediako fitxategia</comment>
- <comment xml:lang="fi">3GPP-multimediatiedosto</comment>
- <comment xml:lang="fo">3GGP margmiðlafíla</comment>
- <comment xml:lang="fr">fichier multimédia 3GPP</comment>
- <comment xml:lang="fur">file multimediâl 3GPP</comment>
- <comment xml:lang="ga">comhad ilmheán 3GPP</comment>
- <comment xml:lang="gl">ficheiro multimedia 3GPP</comment>
- <comment xml:lang="he">קובץ מולטימדיה מסוג 3GPP</comment>
- <comment xml:lang="hr">3GPP multimedijska datoteka</comment>
- <comment xml:lang="hu">3GPP multimédiafájl</comment>
- <comment xml:lang="ia">File multimedial 3GPP</comment>
- <comment xml:lang="id">Berkas multimedia 3GPP</comment>
- <comment xml:lang="it">File multimediale 3GPP</comment>
- <comment xml:lang="ja">3GPP マルチメディアファイル</comment>
- <comment xml:lang="ka">3GPP მულტიმედიური ფაილი</comment>
- <comment xml:lang="kk">3GPP мультимедиялық файлы</comment>
- <comment xml:lang="ko">3GPP 멀티미디어 파일</comment>
- <comment xml:lang="lt">3GPP multimedijos failas</comment>
- <comment xml:lang="lv">3GPP multimediju datne</comment>
- <comment xml:lang="nb">3GPP-multimediafil</comment>
- <comment xml:lang="nl">3GPP-multimediabestand</comment>
- <comment xml:lang="nn">3GPP-multimediafil</comment>
- <comment xml:lang="oc">fichièr multimèdia 3GPP</comment>
- <comment xml:lang="pl">Plik multimedialny 3GPP</comment>
- <comment xml:lang="pt">ficheiro multimédia 3GPP</comment>
- <comment xml:lang="pt-BR">Arquivo multimídia 3GPP</comment>
- <comment xml:lang="ro">Fișier multimedia 3GPP</comment>
- <comment xml:lang="ru">Мультимедийный файл 3GPP</comment>
- <comment xml:lang="sk">Súbor multimédií 3GPP</comment>
- <comment xml:lang="sl">Večpredstavnostna datoteka 3GPP</comment>
- <comment xml:lang="sq">File multimedial 3GPP</comment>
- <comment xml:lang="sr">3ГПП мултимедијална датотека</comment>
- <comment xml:lang="sv">3GPP-multimediafil</comment>
- <comment xml:lang="tr">3GPP çoklu ortam dosyası</comment>
- <comment xml:lang="uk">файл мультимедійних даних 3GPP</comment>
+ <comment xml:lang="zh_TW">3GPP 多媒體檔案</comment>
+ <comment xml:lang="zh_CN">3GPP 多媒体文件</comment>
<comment xml:lang="vi">Tập tin đa phương tiện 3GPP</comment>
- <comment xml:lang="zh-CN">3GPP 多媒体文件</comment>
- <comment xml:lang="zh-TW">3GPP 多媒體檔案</comment>
+ <comment xml:lang="uk">файл мультимедійних даних 3GPP</comment>
+ <comment xml:lang="tr">3GPP çoklu ortam dosyası</comment>
+ <comment xml:lang="sv">3GPP-multimediafil</comment>
+ <comment xml:lang="sr">3ГПП мултимедијална датотека</comment>
+ <comment xml:lang="sq">kartelë multimedia 3GPP</comment>
+ <comment xml:lang="sl">Večpredstavnostna datoteka 3GPP</comment>
+ <comment xml:lang="si">3GPP බහුමාධ්‍ය ගොනුව</comment>
+ <comment xml:lang="sk">Súbor multimédií 3GPP</comment>
+ <comment xml:lang="ru">Мультимедийный файл 3GPP</comment>
+ <comment xml:lang="ro">Fișier multimedia 3GPP</comment>
+ <comment xml:lang="pt_BR">Arquivo multimídia 3GPP</comment>
+ <comment xml:lang="pt">ficheiro multimédia 3GPP</comment>
+ <comment xml:lang="pl">Plik multimedialny 3GPP</comment>
+ <comment xml:lang="oc">fichièr multimèdia 3GPP</comment>
+ <comment xml:lang="nn">3GPP-multimediafil</comment>
+ <comment xml:lang="nl">3GPP-multimediabestand</comment>
+ <comment xml:lang="nb">3GPP-multimediafil</comment>
+ <comment xml:lang="lv">3GPP multimediju datne</comment>
+ <comment xml:lang="lt">3GPP multimedijos failas</comment>
+ <comment xml:lang="ko">3GPP 멀티미디어 파일</comment>
+ <comment xml:lang="kk">3GPP мультимедиялық файлы</comment>
+ <comment xml:lang="ka">3GPP მულტიმედიური ფაილი</comment>
+ <comment xml:lang="ja">3GPP マルチメディアファイル</comment>
+ <comment xml:lang="it">File multimediale 3GPP</comment>
+ <comment xml:lang="is">3GPP margmiðlunarskrá</comment>
+ <comment xml:lang="id">Berkas multimedia 3GPP</comment>
+ <comment xml:lang="ia">File multimedial 3GPP</comment>
+ <comment xml:lang="hu">3GPP multimédiafájl</comment>
+ <comment xml:lang="hr">3GPP multimedijska datoteka</comment>
+ <comment xml:lang="he">קובץ מולטימדיה מסוג 3GPP</comment>
+ <comment xml:lang="gl">ficheiro multimedia 3GPP</comment>
+ <comment xml:lang="ga">comhad ilmheán 3GPP</comment>
+ <comment xml:lang="fur">file multimediâl 3GPP</comment>
+ <comment xml:lang="fr">fichier multimédia 3GPP</comment>
+ <comment xml:lang="fo">3GGP margmiðlafíla</comment>
+ <comment xml:lang="fi">3GPP-multimediatiedosto</comment>
+ <comment xml:lang="eu">3GPP multimediako fitxategia</comment>
+ <comment xml:lang="es">archivo multimedia 3GPP</comment>
+ <comment xml:lang="en_GB">3GPP multimedia file</comment>
+ <comment xml:lang="el">Αρχείο πολυμέσων 3GPP</comment>
+ <comment xml:lang="de">3GPP-Multimediadatei</comment>
+ <comment xml:lang="da">3GPP multimedie-fil</comment>
+ <comment xml:lang="cs">multimediální soubor 3GPP</comment>
+ <comment xml:lang="ca">fitxer multimèdia 3GPP</comment>
+ <comment xml:lang="bg">Мултимедия — 3GPP</comment>
+ <comment xml:lang="be@latin">Multymedyjny fajł 3GPP</comment>
+ <comment xml:lang="be">мультымедыйны файл 3GPP</comment>
+ <comment xml:lang="ar">ملف وسائط متعددة 3GPP</comment>
+ <comment xml:lang="af">3GPP-multimedialêer</comment>
<acronym>3GPP</acronym>
<expanded-acronym>3rd Generation Partnership Project</expanded-acronym>
<sub-class-of type="video/mp4"/>
- <magic priority="50">
+ <magic>
<match type="string" value="ftyp3ge" offset="4"/>
<match type="string" value="ftyp3gg" offset="4"/>
<match type="string" value="ftyp3gp" offset="4"/>
@@ -24358,52 +25569,57 @@ command to generate the output files.
</mime-type>
<mime-type type="video/3gpp2">
<comment>3GPP2 multimedia file</comment>
- <comment xml:lang="af">3GPP2-multimedialêer</comment>
- <comment xml:lang="ar">ملف وسائط متعددة 3GPP2</comment>
- <comment xml:lang="bg">Мултимедия — 3GPP2</comment>
- <comment xml:lang="ca">fitxer multimèdia 3GPP2</comment>
- <comment xml:lang="cs">multimediální soubor 3GPP2</comment>
- <comment xml:lang="da">3GPP2 multimedie-fil</comment>
- <comment xml:lang="de">3GPP2-Multimediadatei</comment>
- <comment xml:lang="el">Αρχείο πολυμέσων 3GPP2</comment>
- <comment xml:lang="en-GB">3GPP2 multimedia file</comment>
- <comment xml:lang="es">archivo multimedia 3GPP2</comment>
- <comment xml:lang="eu">3GPP2 multimediako fitxategia</comment>
- <comment xml:lang="fi">3GPP2-multimediatiedosto</comment>
- <comment xml:lang="fo">3GGP2 margmiðlafíla</comment>
- <comment xml:lang="fr">fichier multimédia 3GPP2</comment>
- <comment xml:lang="fur">file multimediâl 3GPP2</comment>
- <comment xml:lang="ga">comhad ilmheán 3GPP2</comment>
- <comment xml:lang="gl">ficheiro multimedia 3GPP2</comment>
- <comment xml:lang="he">קובץ מולטימדיה 3GPP2</comment>
- <comment xml:lang="hr">3GPP2 multimedijska datoteka</comment>
- <comment xml:lang="hu">3GPP2 multimédiafájl</comment>
- <comment xml:lang="ia">File multimedial 3GPP2</comment>
- <comment xml:lang="id">Berkas multimedia 3GPP2</comment>
- <comment xml:lang="it">File multimediale 3GPP2</comment>
- <comment xml:lang="ja">3GPP2 マルチメディアファイル</comment>
- <comment xml:lang="ka">3GPP2 მულტიმედიური ფაილი</comment>
- <comment xml:lang="kk">3GPP2 мультимедиялық файлы</comment>
- <comment xml:lang="ko">3GPP2 멀티미디어 파일</comment>
- <comment xml:lang="lv">3GPP2 multimediju datne</comment>
- <comment xml:lang="nl">3GPP2 multimedia bestand</comment>
- <comment xml:lang="oc">fichièr multimèdia 3GPP2</comment>
- <comment xml:lang="pl">Plik multimedialny 3GPP2</comment>
- <comment xml:lang="pt">ficheiro multimédia 3GPP2</comment>
- <comment xml:lang="pt-BR">Arquivo multimídia 3GPP2</comment>
- <comment xml:lang="ro">Fișier multimedia 3GPP2</comment>
- <comment xml:lang="ru">Мультимедийный файл 3GPP2</comment>
- <comment xml:lang="sk">Súbor multimédií 3GPP2</comment>
- <comment xml:lang="sl">Večpredstavnostna datoteka 3GPP2</comment>
- <comment xml:lang="sr">3ГПП2 мултимедијална датотека</comment>
- <comment xml:lang="sv">3GPP2-multimediafil</comment>
- <comment xml:lang="tr">3GPP2 çoklu ortam dosyası</comment>
+ <comment xml:lang="zh_TW">3GPP2 多媒體檔案</comment>
+ <comment xml:lang="zh_CN">3GPP2 多媒体文件</comment>
<comment xml:lang="uk">файл мультимедійних даних 3GPP2</comment>
- <comment xml:lang="zh-CN">3GPP2 多媒体文件</comment>
- <comment xml:lang="zh-TW">3GPP2 多媒體檔案</comment>
+ <comment xml:lang="tr">3GPP2 çoklu ortam dosyası</comment>
+ <comment xml:lang="sv">3GPP2-multimediafil</comment>
+ <comment xml:lang="sr">3ГПП2 мултимедијална датотека</comment>
+ <comment xml:lang="sq">kartelë multimedia 3GPP2</comment>
+ <comment xml:lang="sl">Večpredstavnostna datoteka 3GPP2</comment>
+ <comment xml:lang="si">3GPP2 බහුමාධ්‍ය ගොනුව</comment>
+ <comment xml:lang="sk">Súbor multimédií 3GPP2</comment>
+ <comment xml:lang="ru">Мультимедийный файл 3GPP2</comment>
+ <comment xml:lang="ro">Fișier multimedia 3GPP2</comment>
+ <comment xml:lang="pt_BR">Arquivo multimídia 3GPP2</comment>
+ <comment xml:lang="pt">ficheiro multimédia 3GPP2</comment>
+ <comment xml:lang="pl">Plik multimedialny 3GPP2</comment>
+ <comment xml:lang="oc">fichièr multimèdia 3GPP2</comment>
+ <comment xml:lang="nl">3GPP2-multimediabestand</comment>
+ <comment xml:lang="lv">3GPP2 multimediju datne</comment>
+ <comment xml:lang="lt">3GPP2 multimedijos failas</comment>
+ <comment xml:lang="ko">3GPP2 멀티미디어 파일</comment>
+ <comment xml:lang="kk">3GPP2 мультимедиялық файлы</comment>
+ <comment xml:lang="ka">3GPP2 მულტიმედიური ფაილი</comment>
+ <comment xml:lang="ja">3GPP2 マルチメディアファイル</comment>
+ <comment xml:lang="it">File multimediale 3GPP2</comment>
+ <comment xml:lang="is">3GPP2 margmiðlunarskrá</comment>
+ <comment xml:lang="id">Berkas multimedia 3GPP2</comment>
+ <comment xml:lang="ia">File multimedial 3GPP2</comment>
+ <comment xml:lang="hu">3GPP2 multimédiafájl</comment>
+ <comment xml:lang="hr">3GPP2 multimedijska datoteka</comment>
+ <comment xml:lang="he">קובץ מולטימדיה 3GPP2</comment>
+ <comment xml:lang="gl">ficheiro multimedia 3GPP2</comment>
+ <comment xml:lang="ga">comhad ilmheán 3GPP2</comment>
+ <comment xml:lang="fur">file multimediâl 3GPP2</comment>
+ <comment xml:lang="fr">fichier multimédia 3GPP2</comment>
+ <comment xml:lang="fo">3GGP2 margmiðlafíla</comment>
+ <comment xml:lang="fi">3GPP2-multimediatiedosto</comment>
+ <comment xml:lang="eu">3GPP2 multimediako fitxategia</comment>
+ <comment xml:lang="es">archivo multimedia 3GPP2</comment>
+ <comment xml:lang="en_GB">3GPP2 multimedia file</comment>
+ <comment xml:lang="el">Αρχείο πολυμέσων 3GPP2</comment>
+ <comment xml:lang="de">3GPP2-Multimediadatei</comment>
+ <comment xml:lang="da">3GPP2 multimedie-fil</comment>
+ <comment xml:lang="cs">multimediální soubor 3GPP2</comment>
+ <comment xml:lang="ca">fitxer multimèdia 3GPP2</comment>
+ <comment xml:lang="bg">Мултимедия — 3GPP2</comment>
+ <comment xml:lang="be">мультымедыйны файл 3GPP2</comment>
+ <comment xml:lang="ar">ملف وسائط متعددة 3GPP2</comment>
+ <comment xml:lang="af">3GPP2-multimedialêer</comment>
<acronym>3GPP2</acronym>
<expanded-acronym>3rd Generation Partnership Project 2</expanded-acronym>
- <magic priority="50">
+ <magic>
<match type="string" value="ftyp3g2" offset="4"/>
</magic>
<glob pattern="*.3g2"/>
@@ -24413,56 +25629,59 @@ command to generate the output files.
</mime-type>
<mime-type type="audio/x-mod">
<comment>Amiga SoundTracker audio</comment>
- <comment xml:lang="ar">مقتفي صوت Amiga السمعي</comment>
- <comment xml:lang="be-Latn">Aŭdyjo Amiga SoundTracker</comment>
- <comment xml:lang="bg">Аудио — Amiga SoundTracker</comment>
- <comment xml:lang="ca">àudio SoundTracker d'Amiga</comment>
- <comment xml:lang="cs">zvuk Amiga SoundTracker</comment>
- <comment xml:lang="da">Amiga SoundTracker-lyd</comment>
- <comment xml:lang="de">Amiga-SoundTracker-Audio</comment>
- <comment xml:lang="el">Ήχος Amiga SoundTracker</comment>
- <comment xml:lang="en-GB">Amiga SoundTracker audio</comment>
- <comment xml:lang="eo">Sondosiero de Amiga SoundTracker</comment>
- <comment xml:lang="es">audio de Amiga SoundTracker</comment>
- <comment xml:lang="eu">Amiga soundtracker audioa</comment>
- <comment xml:lang="fi">Amiga SoundTracker -ääni</comment>
- <comment xml:lang="fo">Amiga SoundTracker ljóður</comment>
- <comment xml:lang="fr">audio SoundTracker Amiga</comment>
- <comment xml:lang="fur">audio Amiga SoundTracker</comment>
- <comment xml:lang="ga">fuaim Amiga SoundTracker</comment>
- <comment xml:lang="gl">son de Amiga SoundTracker</comment>
- <comment xml:lang="he">קובץ שמע של Amiga SoundTracker</comment>
- <comment xml:lang="hr">Amiga SoundTracker zvučni zapis</comment>
- <comment xml:lang="hu">Amiga SoundTracker hang</comment>
- <comment xml:lang="ia">Audio Amiga SoundTracker</comment>
- <comment xml:lang="id">Audio Amida SoundTracker</comment>
- <comment xml:lang="it">Audio Amiga SoundTracker</comment>
- <comment xml:lang="ja">Amiga SoundTracker オーディオ</comment>
- <comment xml:lang="ka">Amiga SoundTracker-ის აუდიო</comment>
- <comment xml:lang="kk">Amiga SoundTracker аудиосы</comment>
- <comment xml:lang="ko">Amiga SoundTracker 오디오</comment>
- <comment xml:lang="lt">Amiga SoundTracker garso įrašas</comment>
- <comment xml:lang="lv">Amiga SoundTracker audio</comment>
- <comment xml:lang="ms">Audio Amiga Soundtracker</comment>
- <comment xml:lang="nb">Amiga SoundTracker-lyd</comment>
- <comment xml:lang="nl">Amiga SoundTracker-audio</comment>
- <comment xml:lang="nn">Amiga soundtracker-lyd</comment>
- <comment xml:lang="oc">àudio SoundTracker Amiga</comment>
- <comment xml:lang="pl">Plik dźwiękowy Amiga SoundTracker</comment>
- <comment xml:lang="pt">áudio SoundTracker do Amiga</comment>
- <comment xml:lang="pt-BR">Áudio Amiga SoundTracker</comment>
- <comment xml:lang="ro">Audio Amiga SoundTracker</comment>
- <comment xml:lang="ru">Аудио Amiga SoundTracker</comment>
- <comment xml:lang="sk">Zvuk Amiga SoundTracker</comment>
- <comment xml:lang="sl">Zvočna datoteka Amiga SoundTracker</comment>
- <comment xml:lang="sq">Audio Amiga SoundTracker</comment>
- <comment xml:lang="sr">звук Амигиног Пратиоца Звука</comment>
- <comment xml:lang="sv">Amiga SoundTracker-ljud</comment>
- <comment xml:lang="tr">Amiga SoundTracker sesi</comment>
- <comment xml:lang="uk">звук Amiga SoundTracker</comment>
+ <comment xml:lang="zh_TW">Amiga SoundTracker 音訊</comment>
+ <comment xml:lang="zh_CN">Amiga SoundTracker 音频</comment>
<comment xml:lang="vi">Âm thanh Amiga SoundTracker</comment>
- <comment xml:lang="zh-CN">Amiga SoundTracker 音频</comment>
- <comment xml:lang="zh-TW">Amiga SoundTracker 音訊</comment>
+ <comment xml:lang="uk">звук Amiga SoundTracker</comment>
+ <comment xml:lang="tr">Amiga SoundTracker sesi</comment>
+ <comment xml:lang="sv">Amiga SoundTracker-ljud</comment>
+ <comment xml:lang="sr">звук Амигиног Пратиоца Звука</comment>
+ <comment xml:lang="sq">audio Amiga SoundTracker</comment>
+ <comment xml:lang="sl">Zvočna datoteka Amiga SoundTracker</comment>
+ <comment xml:lang="si">Amiga SoundTracker ශ්‍රව්‍ය</comment>
+ <comment xml:lang="sk">Zvuk Amiga SoundTracker</comment>
+ <comment xml:lang="ru">Аудио Amiga SoundTracker</comment>
+ <comment xml:lang="ro">Audio Amiga SoundTracker</comment>
+ <comment xml:lang="pt_BR">Áudio Amiga SoundTracker</comment>
+ <comment xml:lang="pt">áudio SoundTracker do Amiga</comment>
+ <comment xml:lang="pl">Plik dźwiękowy Amiga SoundTracker</comment>
+ <comment xml:lang="oc">àudio SoundTracker Amiga</comment>
+ <comment xml:lang="nn">Amiga soundtracker-lyd</comment>
+ <comment xml:lang="nl">Amiga SoundTracker-audio</comment>
+ <comment xml:lang="nb">Amiga SoundTracker-lyd</comment>
+ <comment xml:lang="ms">Audio Amiga Soundtracker</comment>
+ <comment xml:lang="lv">Amiga SoundTracker audio</comment>
+ <comment xml:lang="lt">Amiga SoundTracker garso įrašas</comment>
+ <comment xml:lang="ko">Amiga SoundTracker 오디오</comment>
+ <comment xml:lang="kk">Amiga SoundTracker аудиосы</comment>
+ <comment xml:lang="ka">Amiga SoundTracker-ის აუდიო</comment>
+ <comment xml:lang="ja">Amiga SoundTracker オーディオ</comment>
+ <comment xml:lang="it">Audio Amiga SoundTracker</comment>
+ <comment xml:lang="is">Amiga SoundTracker hljóðskrá</comment>
+ <comment xml:lang="id">Audio Amida SoundTracker</comment>
+ <comment xml:lang="ia">Audio Amiga SoundTracker</comment>
+ <comment xml:lang="hu">Amiga SoundTracker hang</comment>
+ <comment xml:lang="hr">Amiga SoundTracker zvučni zapis</comment>
+ <comment xml:lang="he">קובץ שמע של Amiga SoundTracker</comment>
+ <comment xml:lang="gl">son de Amiga SoundTracker</comment>
+ <comment xml:lang="ga">fuaim Amiga SoundTracker</comment>
+ <comment xml:lang="fur">audio Amiga SoundTracker</comment>
+ <comment xml:lang="fr">audio SoundTracker Amiga</comment>
+ <comment xml:lang="fo">Amiga SoundTracker ljóður</comment>
+ <comment xml:lang="fi">Amiga SoundTracker -ääni</comment>
+ <comment xml:lang="eu">Amiga soundtracker audioa</comment>
+ <comment xml:lang="es">sonido de Amiga SoundTracker</comment>
+ <comment xml:lang="eo">Sondosiero de Amiga SoundTracker</comment>
+ <comment xml:lang="en_GB">Amiga SoundTracker audio</comment>
+ <comment xml:lang="el">Ήχος Amiga SoundTracker</comment>
+ <comment xml:lang="de">Amiga-SoundTracker-Audio</comment>
+ <comment xml:lang="da">Amiga SoundTracker-lyd</comment>
+ <comment xml:lang="cs">zvuk Amiga SoundTracker</comment>
+ <comment xml:lang="ca">àudio SoundTracker d'Amiga</comment>
+ <comment xml:lang="bg">Аудио — Amiga SoundTracker</comment>
+ <comment xml:lang="be@latin">Aŭdyjo Amiga SoundTracker</comment>
+ <comment xml:lang="be">аўдыя Amiga SoundTracker</comment>
+ <comment xml:lang="ar">مقتفي صوت Amiga السمعي</comment>
<magic priority="40">
<match type="string" value="MTM" offset="0"/>
<match type="string" value="MMD0" offset="0"/>
@@ -24515,6 +25734,8 @@ command to generate the output files.
</match>
</match>
<match type="string" value="MAS_UTrack_V00" offset="0"/>
+ <match type="string" value="M.K." offset="1080"/>
+ <match type="string" value="M!K!" offset="1080"/>
</magic>
<glob pattern="*.mod"/>
<glob pattern="*.ult"/>
@@ -24526,118 +25747,124 @@ command to generate the output files.
</mime-type>
<mime-type type="audio/mp2">
<comment>MP2 audio</comment>
- <comment xml:lang="af">MP2-oudio</comment>
- <comment xml:lang="ar">MP2 سمعي</comment>
- <comment xml:lang="be-Latn">Aŭdyjo MP2</comment>
- <comment xml:lang="bg">Аудио — MP2</comment>
- <comment xml:lang="ca">àudio MP2</comment>
- <comment xml:lang="cs">zvuk MP2</comment>
- <comment xml:lang="da">MP2-lyd</comment>
- <comment xml:lang="de">MP2-Audio</comment>
- <comment xml:lang="el">Ήχος MP2</comment>
- <comment xml:lang="en-GB">MP2 audio</comment>
- <comment xml:lang="eo">MP2-sondosiero</comment>
- <comment xml:lang="es">audio MP2</comment>
- <comment xml:lang="eu">MP2 audioa</comment>
- <comment xml:lang="fi">MP2-ääni</comment>
- <comment xml:lang="fo">MP2 ljóður</comment>
- <comment xml:lang="fr">audio MP2</comment>
- <comment xml:lang="fur">audio MP2</comment>
- <comment xml:lang="ga">fuaim MP2</comment>
- <comment xml:lang="gl">son MP2</comment>
- <comment xml:lang="he">שמע MP2</comment>
- <comment xml:lang="hr">MP2 zvučni zapis</comment>
- <comment xml:lang="hu">MP2 hang</comment>
- <comment xml:lang="ia">Audio MP2</comment>
- <comment xml:lang="id">Audio MP2</comment>
- <comment xml:lang="it">Audio MP2</comment>
- <comment xml:lang="ja">MP2 オーディオ</comment>
- <comment xml:lang="kk">MP2 аудиосы</comment>
- <comment xml:lang="ko">MP2 오디오</comment>
- <comment xml:lang="lt">MP2 garso įrašas</comment>
- <comment xml:lang="lv">MP2 audio</comment>
- <comment xml:lang="nb">MP2-lyd</comment>
- <comment xml:lang="nl">MP2-audio</comment>
- <comment xml:lang="nn">MP2-lyd</comment>
- <comment xml:lang="oc">àudio MP2</comment>
- <comment xml:lang="pl">Plik dźwiękowy MP2</comment>
- <comment xml:lang="pt">áudio MP2</comment>
- <comment xml:lang="pt-BR">Áudio MP2</comment>
- <comment xml:lang="ro">Audio MP2</comment>
- <comment xml:lang="ru">Аудио MP2</comment>
- <comment xml:lang="sk">Zvuk MP2</comment>
- <comment xml:lang="sl">Zvočna datoteka MP2</comment>
- <comment xml:lang="sq">Audio MP2</comment>
- <comment xml:lang="sr">МП2 звук</comment>
- <comment xml:lang="sv">MP2-ljud</comment>
- <comment xml:lang="tr">MP2 sesi</comment>
- <comment xml:lang="uk">звук MP2</comment>
+ <comment xml:lang="zh_TW">MP2 音訊</comment>
+ <comment xml:lang="zh_CN">MP2 音频</comment>
<comment xml:lang="vi">Âm thanh MP2</comment>
- <comment xml:lang="zh-CN">MP2 音频</comment>
- <comment xml:lang="zh-TW">MP2 音訊</comment>
+ <comment xml:lang="uk">звук MP2</comment>
+ <comment xml:lang="tr">MP2 sesi</comment>
+ <comment xml:lang="sv">MP2-ljud</comment>
+ <comment xml:lang="sr">МП2 звук</comment>
+ <comment xml:lang="sq">audio MP2</comment>
+ <comment xml:lang="sl">Zvočna datoteka MP2</comment>
+ <comment xml:lang="si">MP2 ශ්රව්ය</comment>
+ <comment xml:lang="sk">Zvuk MP2</comment>
+ <comment xml:lang="ru">Аудио MP2</comment>
+ <comment xml:lang="ro">Audio MP2</comment>
+ <comment xml:lang="pt_BR">Áudio MP2</comment>
+ <comment xml:lang="pt">áudio MP2</comment>
+ <comment xml:lang="pl">Plik dźwiękowy MP2</comment>
+ <comment xml:lang="oc">àudio MP2</comment>
+ <comment xml:lang="nn">MP2-lyd</comment>
+ <comment xml:lang="nl">MP2-audio</comment>
+ <comment xml:lang="nb">MP2-lyd</comment>
+ <comment xml:lang="lv">MP2 audio</comment>
+ <comment xml:lang="lt">MP2 garso įrašas</comment>
+ <comment xml:lang="ko">MP2 오디오</comment>
+ <comment xml:lang="kk">MP2 аудиосы</comment>
+ <comment xml:lang="ja">MP2 オーディオ</comment>
+ <comment xml:lang="it">Audio MP2</comment>
+ <comment xml:lang="is">MP2 hljóðskrá</comment>
+ <comment xml:lang="id">Audio MP2</comment>
+ <comment xml:lang="ia">Audio MP2</comment>
+ <comment xml:lang="hu">MP2 hang</comment>
+ <comment xml:lang="hr">MP2 zvučni zapis</comment>
+ <comment xml:lang="he">שמע MP2</comment>
+ <comment xml:lang="gl">son MP2</comment>
+ <comment xml:lang="ga">fuaim MP2</comment>
+ <comment xml:lang="fur">audio MP2</comment>
+ <comment xml:lang="fr">audio MP2</comment>
+ <comment xml:lang="fo">MP2 ljóður</comment>
+ <comment xml:lang="fi">MP2-ääni</comment>
+ <comment xml:lang="eu">MP2 audioa</comment>
+ <comment xml:lang="es">sonido MP2</comment>
+ <comment xml:lang="eo">MP2-sondosiero</comment>
+ <comment xml:lang="en_GB">MP2 audio</comment>
+ <comment xml:lang="el">Ήχος MP2</comment>
+ <comment xml:lang="de">MP2-Audio</comment>
+ <comment xml:lang="da">MP2-lyd</comment>
+ <comment xml:lang="cs">zvuk MP2</comment>
+ <comment xml:lang="ca">àudio MP2</comment>
+ <comment xml:lang="bg">Аудио — MP2</comment>
+ <comment xml:lang="be@latin">Aŭdyjo MP2</comment>
+ <comment xml:lang="be">аўдыя MP2</comment>
+ <comment xml:lang="ar">صوت MP2</comment>
+ <comment xml:lang="af">MP2-oudio</comment>
<alias type="audio/x-mp2"/>
<glob pattern="*.mp2"/>
</mime-type>
<mime-type type="audio/mpeg">
<comment>MP3 audio</comment>
- <comment xml:lang="af">MP3-oudio</comment>
- <comment xml:lang="ar">MP3 سمعي</comment>
- <comment xml:lang="az">MP3 audio faylı</comment>
- <comment xml:lang="be-Latn">Aŭdyjo MP3</comment>
- <comment xml:lang="bg">Аудио — MP3</comment>
- <comment xml:lang="ca">àudio MP3</comment>
- <comment xml:lang="cs">zvuk MP3</comment>
- <comment xml:lang="cy">Sain MP3</comment>
- <comment xml:lang="da">MP3-lyd</comment>
- <comment xml:lang="de">MP3-Audio</comment>
- <comment xml:lang="el">Ήχος MP3</comment>
- <comment xml:lang="en-GB">MP3 audio</comment>
- <comment xml:lang="eo">MP3-sondosiero</comment>
- <comment xml:lang="es">audio MP3</comment>
- <comment xml:lang="eu">MP3 audioa</comment>
- <comment xml:lang="fi">MP3-ääni</comment>
- <comment xml:lang="fo">MP3 ljóður</comment>
- <comment xml:lang="fr">audio MP3</comment>
- <comment xml:lang="fur">audio MP3</comment>
- <comment xml:lang="ga">fuaim MP3</comment>
- <comment xml:lang="gl">son MP3</comment>
- <comment xml:lang="he">שמע MP3</comment>
- <comment xml:lang="hr">MP3 zvučni zapis</comment>
- <comment xml:lang="hu">MP3 hang</comment>
- <comment xml:lang="ia">Audio MP3</comment>
- <comment xml:lang="id">Audio MP3</comment>
- <comment xml:lang="it">Audio MP3</comment>
- <comment xml:lang="ja">MP3 オーディオ</comment>
- <comment xml:lang="ka">MP3 აუდიო</comment>
- <comment xml:lang="kk">MP3 аудиосы</comment>
- <comment xml:lang="ko">MP3 오디오</comment>
- <comment xml:lang="lt">MP3 garso įrašas</comment>
- <comment xml:lang="lv">MP3 audio</comment>
- <comment xml:lang="ms">Audio MP3</comment>
- <comment xml:lang="nb">MP3-lyd</comment>
- <comment xml:lang="nl">MP3-audio</comment>
- <comment xml:lang="nn">MP3-lyd</comment>
- <comment xml:lang="oc">àudio MP3</comment>
- <comment xml:lang="pl">Plik dźwiękowy MP3</comment>
- <comment xml:lang="pt">áudio MP3</comment>
- <comment xml:lang="pt-BR">Áudio MP3</comment>
- <comment xml:lang="ro">Audio MP3</comment>
- <comment xml:lang="ru">Аудио MP3</comment>
- <comment xml:lang="sk">Zvuk MP3</comment>
- <comment xml:lang="sl">Zvočna datoteka MP3</comment>
- <comment xml:lang="sq">Audio MP3</comment>
- <comment xml:lang="sr">МП3 звук</comment>
- <comment xml:lang="sv">MP3-ljud</comment>
- <comment xml:lang="tr">MP3 sesi</comment>
- <comment xml:lang="uk">звук MP3</comment>
+ <comment xml:lang="zh_TW">MP3 音訊</comment>
+ <comment xml:lang="zh_CN">MP3 音频</comment>
<comment xml:lang="vi">Âm thanh MP3</comment>
- <comment xml:lang="zh-CN">MP3 音频</comment>
- <comment xml:lang="zh-TW">MP3 音訊</comment>
+ <comment xml:lang="uk">звук MP3</comment>
+ <comment xml:lang="tr">MP3 sesi</comment>
+ <comment xml:lang="sv">MP3-ljud</comment>
+ <comment xml:lang="sr">МП3 звук</comment>
+ <comment xml:lang="sq">audio MP3</comment>
+ <comment xml:lang="sl">Zvočna datoteka MP3</comment>
+ <comment xml:lang="si">MP3 ශ්රව්ය</comment>
+ <comment xml:lang="sk">Zvuk MP3</comment>
+ <comment xml:lang="ru">Аудио MP3</comment>
+ <comment xml:lang="ro">Audio MP3</comment>
+ <comment xml:lang="pt_BR">Áudio MP3</comment>
+ <comment xml:lang="pt">áudio MP3</comment>
+ <comment xml:lang="pl">Plik dźwiękowy MP3</comment>
+ <comment xml:lang="oc">àudio MP3</comment>
+ <comment xml:lang="nn">MP3-lyd</comment>
+ <comment xml:lang="nl">MP3-audio</comment>
+ <comment xml:lang="nb">MP3-lyd</comment>
+ <comment xml:lang="ms">Audio MP3</comment>
+ <comment xml:lang="lv">MP3 audio</comment>
+ <comment xml:lang="lt">MP3 garso įrašas</comment>
+ <comment xml:lang="ko">MP3 오디오</comment>
+ <comment xml:lang="kk">MP3 аудиосы</comment>
+ <comment xml:lang="ka">MP3 აუდიო</comment>
+ <comment xml:lang="ja">MP3 オーディオ</comment>
+ <comment xml:lang="it">Audio MP3</comment>
+ <comment xml:lang="is">MP3 hljóðskrá</comment>
+ <comment xml:lang="id">Audio MP3</comment>
+ <comment xml:lang="ia">Audio MP3</comment>
+ <comment xml:lang="hu">MP3 hang</comment>
+ <comment xml:lang="hr">MP3 zvučni zapis</comment>
+ <comment xml:lang="he">שמע MP3</comment>
+ <comment xml:lang="gl">son MP3</comment>
+ <comment xml:lang="ga">fuaim MP3</comment>
+ <comment xml:lang="fur">audio MP3</comment>
+ <comment xml:lang="fr">audio MP3</comment>
+ <comment xml:lang="fo">MP3 ljóður</comment>
+ <comment xml:lang="fi">MP3-ääni</comment>
+ <comment xml:lang="eu">MP3 audioa</comment>
+ <comment xml:lang="es">sonido MP3</comment>
+ <comment xml:lang="eo">MP3-sondosiero</comment>
+ <comment xml:lang="en_GB">MP3 audio</comment>
+ <comment xml:lang="el">Ήχος MP3</comment>
+ <comment xml:lang="de">MP3-Audio</comment>
+ <comment xml:lang="da">MP3-lyd</comment>
+ <comment xml:lang="cy">Sain MP3</comment>
+ <comment xml:lang="cs">zvuk MP3</comment>
+ <comment xml:lang="ca">àudio MP3</comment>
+ <comment xml:lang="bg">Аудио — MP3</comment>
+ <comment xml:lang="be@latin">Aŭdyjo MP3</comment>
+ <comment xml:lang="be">аўдыя MP3</comment>
+ <comment xml:lang="az">MP3 audio faylı</comment>
+ <comment xml:lang="ar">صوت MP3</comment>
+ <comment xml:lang="af">MP3-oudio</comment>
<alias type="audio/x-mp3"/>
<alias type="audio/x-mpg"/>
<alias type="audio/x-mpeg"/>
<alias type="audio/mp3"/>
- <magic priority="50">
+ <magic>
<match type="big16" value="0xfffa" offset="0"/>
<match type="big16" value="0xfffb" offset="0"/>
<match type="big16" value="0xfff3" offset="0"/>
@@ -24651,6 +25878,28 @@ command to generate the output files.
</mime-type>
<mime-type type="audio/x-mpegurl">
<comment>Media playlist</comment>
+ <comment xml:lang="zh_CN">媒体播放列表</comment>
+ <comment xml:lang="uk">мультимедійний список відтворення</comment>
+ <comment xml:lang="tr">Ortam çalma listesi</comment>
+ <comment xml:lang="sv">Mediaspellista</comment>
+ <comment xml:lang="si">මාධ්‍ය ධාවන ලැයිස්තුව</comment>
+ <comment xml:lang="ru">Список воспроизведения медиа-данных</comment>
+ <comment xml:lang="pl">Lista odtwarzania multimediów</comment>
+ <comment xml:lang="nl">Media-afspeellijst</comment>
+ <comment xml:lang="ko">Media 재생 목록</comment>
+ <comment xml:lang="kk">Медиа ойнату тізімі</comment>
+ <comment xml:lang="ka">მედიის დასაკრავი სია</comment>
+ <comment xml:lang="ja">メディアプレイリスト</comment>
+ <comment xml:lang="it">Playlist multimediale</comment>
+ <comment xml:lang="hr">Media popis izvođenja</comment>
+ <comment xml:lang="gl">Lista de reprodución multimedia</comment>
+ <comment xml:lang="fi">Media-soittolista</comment>
+ <comment xml:lang="eu">Multimediako erreprodukzio-zerrenda</comment>
+ <comment xml:lang="es">lista de reproducción de medios</comment>
+ <comment xml:lang="en_GB">Media playlist</comment>
+ <comment xml:lang="de">Medien-Wiedergabeliste</comment>
+ <comment xml:lang="be">плэй-ліст мультымедыя</comment>
+ <comment xml:lang="ar">قائمة تشغيل وسائط</comment>
<sub-class-of type="text/plain"/>
<alias type="audio/mpegurl"/>
<alias type="application/m3u"/>
@@ -24660,12 +25909,34 @@ command to generate the output files.
<glob pattern="*.m3u"/>
<glob pattern="*.m3u8"/>
<glob pattern="*.vlc"/>
- <magic priority="50">
+ <magic>
<match type="string" value="#EXTM3U" offset="0"/>
</magic>
</mime-type>
<mime-type type="application/vnd.apple.mpegurl">
<comment>Media playlist</comment>
+ <comment xml:lang="zh_CN">媒体播放列表</comment>
+ <comment xml:lang="uk">мультимедійний список відтворення</comment>
+ <comment xml:lang="tr">Ortam çalma listesi</comment>
+ <comment xml:lang="sv">Mediaspellista</comment>
+ <comment xml:lang="si">මාධ්‍ය ධාවන ලැයිස්තුව</comment>
+ <comment xml:lang="ru">Список воспроизведения медиа-данных</comment>
+ <comment xml:lang="pl">Lista odtwarzania multimediów</comment>
+ <comment xml:lang="nl">Media-afspeellijst</comment>
+ <comment xml:lang="ko">Media 재생 목록</comment>
+ <comment xml:lang="kk">Медиа ойнату тізімі</comment>
+ <comment xml:lang="ka">მედიის დასაკრავი სია</comment>
+ <comment xml:lang="ja">メディアプレイリスト</comment>
+ <comment xml:lang="it">Playlist multimediale</comment>
+ <comment xml:lang="hr">Media popis izvođenja</comment>
+ <comment xml:lang="gl">Lista de reprodución multimedia</comment>
+ <comment xml:lang="fi">Media-soittolista</comment>
+ <comment xml:lang="eu">Multimediako erreprodukzio-zerrenda</comment>
+ <comment xml:lang="es">lista de reproducción de medios</comment>
+ <comment xml:lang="en_GB">Media playlist</comment>
+ <comment xml:lang="de">Medien-Wiedergabeliste</comment>
+ <comment xml:lang="be">плэй-ліст мультымедыя</comment>
+ <comment xml:lang="ar">قائمة تشغيل وسائط</comment>
<sub-class-of type="text/plain"/>
<glob pattern="*.m3u"/>
<glob pattern="*.m3u8"/>
@@ -24678,54 +25949,57 @@ command to generate the output files.
</mime-type>
<mime-type type="audio/x-ms-asx">
<comment>Microsoft ASX playlist</comment>
- <comment xml:lang="ar">قائمة تشغيل مايكروسوفت ASX</comment>
- <comment xml:lang="be-Latn">Śpis Microsoft ASX</comment>
- <comment xml:lang="bg">Списък за изпълнение — Microsoft ASX</comment>
- <comment xml:lang="ca">llista de reproducció de Microsoft ASX</comment>
- <comment xml:lang="cs">seznam k přehrání Microsoft ASX</comment>
- <comment xml:lang="da">Microsoft ASX-afspilningsliste</comment>
- <comment xml:lang="de">Microsoft-ASX-Wiedergabeliste</comment>
- <comment xml:lang="el">Λίστα αναπαραγωγής Microsoft ASX</comment>
- <comment xml:lang="en-GB">Microsoft ASX playlist</comment>
- <comment xml:lang="es">lista de reproducción ASX de Microsoft</comment>
- <comment xml:lang="eu">Microsoft ASX erreprodukzio-zerrenda</comment>
- <comment xml:lang="fi">Microsoft ASX -soittolista</comment>
- <comment xml:lang="fo">Microsoft ASX avspælingarlisti</comment>
- <comment xml:lang="fr">liste de lecture Microsoft ASX</comment>
- <comment xml:lang="fur">liste di riproduzion Microsoft ASX</comment>
- <comment xml:lang="ga">seinmliosta Microsoft ASX</comment>
- <comment xml:lang="gl">lista de reprodución Microsoft ASX</comment>
- <comment xml:lang="he">רשימת השמעה ASX (מיקרוסופט)</comment>
- <comment xml:lang="hr">Microsoft ASX popis izvođenja</comment>
- <comment xml:lang="hu">Microsoft ASX lejátszólista</comment>
- <comment xml:lang="ia">Lista de selection Microsoft ASX</comment>
- <comment xml:lang="id">Senarai putar Microsoft ASX</comment>
- <comment xml:lang="it">Playlist Microsoft ASX</comment>
- <comment xml:lang="ja">Microsoft ASX 再生リスト</comment>
- <comment xml:lang="ka">Microsoft-ის ASX რეპერტუარი</comment>
- <comment xml:lang="kk">Microsoft ASX ойнау тізімі</comment>
- <comment xml:lang="ko">Microsoft ASX 재생 목록</comment>
- <comment xml:lang="lt">Microsoft ASX grojaraštis</comment>
- <comment xml:lang="lv">Microsoft ASX repertuārs</comment>
- <comment xml:lang="nb">Microsoft ASX-spilleliste</comment>
- <comment xml:lang="nl">Microsoft ASX-afspeellijst</comment>
- <comment xml:lang="nn">Microsoft ASX-speleliste</comment>
- <comment xml:lang="oc">lista de lectura Microsoft ASX</comment>
- <comment xml:lang="pl">Lista odtwarzania Microsoft ASX</comment>
- <comment xml:lang="pt">lista de reprodução Microsoft ASX</comment>
- <comment xml:lang="pt-BR">Lista de reprodução do Microsoft ASX</comment>
- <comment xml:lang="ro">Listă redare Microsoft ASX</comment>
- <comment xml:lang="ru">Список воспроизведения Microsoft ASX</comment>
- <comment xml:lang="sk">Zoznam skladieb Microsoft ASX</comment>
- <comment xml:lang="sl">Seznam predvajanja Microsoft ASX</comment>
- <comment xml:lang="sq">Listë titujsh Microsoft ASF</comment>
- <comment xml:lang="sr">Мајкрософтов АСИкс списак нумера</comment>
- <comment xml:lang="sv">Microsoft ASX-spellista</comment>
- <comment xml:lang="tr">Microsoft ASX çalma listesi</comment>
- <comment xml:lang="uk">список відтворення ASX Microsoft</comment>
+ <comment xml:lang="zh_TW">微軟 ASX 播放清單</comment>
+ <comment xml:lang="zh_CN">Microsoft ASX 播放列表</comment>
<comment xml:lang="vi">Danh mục nhạc Microsoft ASX</comment>
- <comment xml:lang="zh-CN">Microsoft ASX 播放列表</comment>
- <comment xml:lang="zh-TW">微軟 ASX 播放清單</comment>
+ <comment xml:lang="uk">список відтворення ASX Microsoft</comment>
+ <comment xml:lang="tr">Microsoft ASX çalma listesi</comment>
+ <comment xml:lang="sv">Microsoft ASX-spellista</comment>
+ <comment xml:lang="sr">Мајкрософтов АСИкс списак нумера</comment>
+ <comment xml:lang="sq">luajlistë Microsoft ASF</comment>
+ <comment xml:lang="sl">Seznam predvajanja Microsoft ASX</comment>
+ <comment xml:lang="si">Microsoft ASX ධාවන ලැයිස්තුව</comment>
+ <comment xml:lang="sk">Zoznam skladieb Microsoft ASX</comment>
+ <comment xml:lang="ru">Список воспроизведения Microsoft ASX</comment>
+ <comment xml:lang="ro">Listă redare Microsoft ASX</comment>
+ <comment xml:lang="pt_BR">Lista de reprodução do Microsoft ASX</comment>
+ <comment xml:lang="pt">lista de reprodução Microsoft ASX</comment>
+ <comment xml:lang="pl">Lista odtwarzania Microsoft ASX</comment>
+ <comment xml:lang="oc">lista de lectura Microsoft ASX</comment>
+ <comment xml:lang="nn">Microsoft ASX-speleliste</comment>
+ <comment xml:lang="nl">Microsoft ASX-afspeellijst</comment>
+ <comment xml:lang="nb">Microsoft ASX-spilleliste</comment>
+ <comment xml:lang="lv">Microsoft ASX repertuārs</comment>
+ <comment xml:lang="lt">Microsoft ASX grojaraštis</comment>
+ <comment xml:lang="ko">Microsoft ASX 재생 목록</comment>
+ <comment xml:lang="kk">Microsoft ASX ойнау тізімі</comment>
+ <comment xml:lang="ka">Microsoft-ის ASX რეპერტუარი</comment>
+ <comment xml:lang="ja">Microsoft ASX プレイリスト</comment>
+ <comment xml:lang="it">Playlist Microsoft ASX</comment>
+ <comment xml:lang="is">Microsoft ASX spilunarlisti</comment>
+ <comment xml:lang="id">Senarai putar Microsoft ASX</comment>
+ <comment xml:lang="ia">Lista de selection Microsoft ASX</comment>
+ <comment xml:lang="hu">Microsoft ASX lejátszólista</comment>
+ <comment xml:lang="hr">Microsoft ASX popis izvođenja</comment>
+ <comment xml:lang="he">רשימת השמעה ASX (מיקרוסופט)</comment>
+ <comment xml:lang="gl">lista de reprodución Microsoft ASX</comment>
+ <comment xml:lang="ga">seinmliosta Microsoft ASX</comment>
+ <comment xml:lang="fur">liste di riproduzion Microsoft ASX</comment>
+ <comment xml:lang="fr">liste de lecture Microsoft ASX</comment>
+ <comment xml:lang="fo">Microsoft ASX avspælingarlisti</comment>
+ <comment xml:lang="fi">Microsoft ASX -soittolista</comment>
+ <comment xml:lang="eu">Microsoft ASX erreprodukzio-zerrenda</comment>
+ <comment xml:lang="es">lista de reproducción ASX de Microsoft</comment>
+ <comment xml:lang="en_GB">Microsoft ASX playlist</comment>
+ <comment xml:lang="el">Λίστα αναπαραγωγής Microsoft ASX</comment>
+ <comment xml:lang="de">Microsoft-ASX-Wiedergabeliste</comment>
+ <comment xml:lang="da">Microsoft ASX-afspilningsliste</comment>
+ <comment xml:lang="cs">seznam k přehrání Microsoft ASX</comment>
+ <comment xml:lang="ca">llista de reproducció de Microsoft ASX</comment>
+ <comment xml:lang="bg">Списък за изпълнение — Microsoft ASX</comment>
+ <comment xml:lang="be@latin">Śpis Microsoft ASX</comment>
+ <comment xml:lang="be">плэй-ліст Microsoft ASX</comment>
+ <comment xml:lang="ar">قائمة تشغيل مايكروسوفت ASX</comment>
<alias type="video/x-ms-wvx"/>
<alias type="video/x-ms-wax"/>
<alias type="video/x-ms-wmx"/>
@@ -24743,114 +26017,120 @@ command to generate the output files.
</mime-type>
<mime-type type="audio/x-psf">
<comment>PSF audio</comment>
- <comment xml:lang="af">PSF-oudio</comment>
- <comment xml:lang="ar">PSF سمعي</comment>
- <comment xml:lang="be-Latn">Aŭdyjo PSF</comment>
- <comment xml:lang="bg">Аудио — PSF</comment>
- <comment xml:lang="ca">àudio PSF</comment>
- <comment xml:lang="cs">zvuk PSF</comment>
- <comment xml:lang="da">PSF-lyd</comment>
- <comment xml:lang="de">PSF-Audio</comment>
- <comment xml:lang="el">Ήχος PSF</comment>
- <comment xml:lang="en-GB">PSF audio</comment>
- <comment xml:lang="eo">PSF-sondosiero</comment>
- <comment xml:lang="es">audio PSF</comment>
- <comment xml:lang="eu">PSF audioa</comment>
- <comment xml:lang="fi">PSF-ääni</comment>
- <comment xml:lang="fo">PSF ljóður</comment>
- <comment xml:lang="fr">audio PSF</comment>
- <comment xml:lang="fur">audio PSF</comment>
- <comment xml:lang="ga">fuaim PSF</comment>
- <comment xml:lang="gl">son PSF</comment>
- <comment xml:lang="he">שמע PSF</comment>
- <comment xml:lang="hr">PSF zvučni zapis</comment>
- <comment xml:lang="hu">PSF hang</comment>
- <comment xml:lang="ia">Audio PSF</comment>
- <comment xml:lang="id">Audio PSF</comment>
- <comment xml:lang="it">Audio PSF</comment>
- <comment xml:lang="ja">PSF オーディオ</comment>
- <comment xml:lang="kk">PSF аудиосы</comment>
- <comment xml:lang="ko">PSF 오디오</comment>
- <comment xml:lang="lt">PSF garso įrašas</comment>
- <comment xml:lang="lv">PSF audio</comment>
- <comment xml:lang="nb">PSF-lyd</comment>
- <comment xml:lang="nl">PSF-audio</comment>
- <comment xml:lang="nn">PSF-lyd</comment>
- <comment xml:lang="oc">àudio PSF</comment>
- <comment xml:lang="pl">Plik dźwiękowy PSF</comment>
- <comment xml:lang="pt">áudio PSF</comment>
- <comment xml:lang="pt-BR">Áudio PSF</comment>
- <comment xml:lang="ro">Audio PSF</comment>
- <comment xml:lang="ru">Аудио PSF</comment>
- <comment xml:lang="sk">Zvuk PSF</comment>
- <comment xml:lang="sl">Zvočna datoteka PSF</comment>
- <comment xml:lang="sq">Audio PSF</comment>
- <comment xml:lang="sr">ПСФ звук</comment>
- <comment xml:lang="sv">PSF-ljud</comment>
- <comment xml:lang="tr">PSF sesi</comment>
- <comment xml:lang="uk">звук PSF</comment>
+ <comment xml:lang="zh_TW">PSF 音訊</comment>
+ <comment xml:lang="zh_CN">PSF 音频</comment>
<comment xml:lang="vi">Âm thanh PSF</comment>
- <comment xml:lang="zh-CN">PSF 音频</comment>
- <comment xml:lang="zh-TW">PSF 音訊</comment>
+ <comment xml:lang="uk">звук PSF</comment>
+ <comment xml:lang="tr">PSF sesi</comment>
+ <comment xml:lang="sv">PSF-ljud</comment>
+ <comment xml:lang="sr">ПСФ звук</comment>
+ <comment xml:lang="sq">audio PSF</comment>
+ <comment xml:lang="sl">Zvočna datoteka PSF</comment>
+ <comment xml:lang="si">PSF ශ්රව්ය උපකරණ</comment>
+ <comment xml:lang="sk">Zvuk PSF</comment>
+ <comment xml:lang="ru">Аудио PSF</comment>
+ <comment xml:lang="ro">Audio PSF</comment>
+ <comment xml:lang="pt_BR">Áudio PSF</comment>
+ <comment xml:lang="pt">áudio PSF</comment>
+ <comment xml:lang="pl">Plik dźwiękowy PSF</comment>
+ <comment xml:lang="oc">àudio PSF</comment>
+ <comment xml:lang="nn">PSF-lyd</comment>
+ <comment xml:lang="nl">PSF-audio</comment>
+ <comment xml:lang="nb">PSF-lyd</comment>
+ <comment xml:lang="lv">PSF audio</comment>
+ <comment xml:lang="lt">PSF garso įrašas</comment>
+ <comment xml:lang="ko">PSF 오디오</comment>
+ <comment xml:lang="kk">PSF аудиосы</comment>
+ <comment xml:lang="ja">PSF オーディオ</comment>
+ <comment xml:lang="it">Audio PSF</comment>
+ <comment xml:lang="is">PSF hljóðskrá</comment>
+ <comment xml:lang="id">Audio PSF</comment>
+ <comment xml:lang="ia">Audio PSF</comment>
+ <comment xml:lang="hu">PSF hang</comment>
+ <comment xml:lang="hr">PSF zvučni zapis</comment>
+ <comment xml:lang="he">שמע PSF</comment>
+ <comment xml:lang="gl">son PSF</comment>
+ <comment xml:lang="ga">fuaim PSF</comment>
+ <comment xml:lang="fur">audio PSF</comment>
+ <comment xml:lang="fr">audio PSF</comment>
+ <comment xml:lang="fo">PSF ljóður</comment>
+ <comment xml:lang="fi">PSF-ääni</comment>
+ <comment xml:lang="eu">PSF audioa</comment>
+ <comment xml:lang="es">sonido PSF</comment>
+ <comment xml:lang="eo">PSF-sondosiero</comment>
+ <comment xml:lang="en_GB">PSF audio</comment>
+ <comment xml:lang="el">Ήχος PSF</comment>
+ <comment xml:lang="de">PSF-Audio</comment>
+ <comment xml:lang="da">PSF-lyd</comment>
+ <comment xml:lang="cs">zvuk PSF</comment>
+ <comment xml:lang="ca">àudio PSF</comment>
+ <comment xml:lang="bg">Аудио — PSF</comment>
+ <comment xml:lang="be@latin">Aŭdyjo PSF</comment>
+ <comment xml:lang="be">аўдыя PSF</comment>
+ <comment xml:lang="ar">صوت PSF</comment>
+ <comment xml:lang="af">PSF-oudio</comment>
<acronym>PSF</acronym>
<expanded-acronym>Portable Sound Format</expanded-acronym>
- <magic priority="50">
+ <magic>
<match type="string" value="PSF" offset="0"/>
</magic>
<glob pattern="*.psf"/>
</mime-type>
<mime-type type="audio/x-minipsf">
<comment>MiniPSF audio</comment>
- <comment xml:lang="af">MiniPSF-oudio</comment>
- <comment xml:lang="ar">MiniPSF سمعي</comment>
- <comment xml:lang="be-Latn">Aŭdyjo MiniPSF</comment>
- <comment xml:lang="bg">Аудио — MiniPSF</comment>
- <comment xml:lang="ca">àudio MiniPSF</comment>
- <comment xml:lang="cs">zvuk MiniPSF</comment>
- <comment xml:lang="da">MiniPSF-lyd</comment>
- <comment xml:lang="de">MiniPSF-Audio</comment>
- <comment xml:lang="el">Ήχος MiniPSF</comment>
- <comment xml:lang="en-GB">MiniPSF audio</comment>
- <comment xml:lang="eo">MiniPSF-sondosiero</comment>
- <comment xml:lang="es">audio MiniPSF</comment>
- <comment xml:lang="eu">MiniPSF audioa</comment>
- <comment xml:lang="fi">MiniPSF-ääni</comment>
- <comment xml:lang="fo">MiniPSF ljóður</comment>
- <comment xml:lang="fr">audio MiniPSF</comment>
- <comment xml:lang="fur">audio MiniPSF</comment>
- <comment xml:lang="ga">fuaim MiniPSF</comment>
- <comment xml:lang="gl">son MiniPSF</comment>
- <comment xml:lang="he">שמע של MiniPSP</comment>
- <comment xml:lang="hr">MiniPSF zvučni zapis</comment>
- <comment xml:lang="hu">MiniPSF hang</comment>
- <comment xml:lang="ia">Audio MiniPSF</comment>
- <comment xml:lang="id">Audio MiniPSF</comment>
- <comment xml:lang="it">Audio MiniPSF</comment>
- <comment xml:lang="ja">MiniPSF オーディオ</comment>
- <comment xml:lang="ka">MiniPSF-ის აუდიო</comment>
- <comment xml:lang="kk">MiniPSF аудиосы</comment>
- <comment xml:lang="ko">MiniPSF 오디오</comment>
- <comment xml:lang="lt">MiniPSF garso įrašas</comment>
- <comment xml:lang="lv">MiniPSF audio</comment>
- <comment xml:lang="nb">MiniPSF-lyd</comment>
- <comment xml:lang="nl">MiniPSF-audio</comment>
- <comment xml:lang="nn">MiniPSF-lyd</comment>
- <comment xml:lang="oc">àudio MiniPSF</comment>
- <comment xml:lang="pl">Plik dźwiękowy MiniPSF</comment>
- <comment xml:lang="pt">áudio MiniPSF</comment>
- <comment xml:lang="pt-BR">Áudio MiniPSF</comment>
- <comment xml:lang="ro">Audio MiniPSF</comment>
- <comment xml:lang="ru">Аудио MiniPSF</comment>
- <comment xml:lang="sk">Zvuk MiniPSF</comment>
- <comment xml:lang="sl">Zvočna datoteka MiniPSF</comment>
- <comment xml:lang="sq">Audio MiniPSF</comment>
- <comment xml:lang="sr">Мини ПСФ звук</comment>
- <comment xml:lang="sv">MiniPSF-ljud</comment>
- <comment xml:lang="tr">MiniPSF sesi</comment>
- <comment xml:lang="uk">звук MiniPSF</comment>
+ <comment xml:lang="zh_TW">MiniPSF 音訊</comment>
+ <comment xml:lang="zh_CN">MiniPSF 音频</comment>
<comment xml:lang="vi">Âm thanh MiniPSF</comment>
- <comment xml:lang="zh-CN">MiniPSF 音频</comment>
- <comment xml:lang="zh-TW">MiniPSF 音訊</comment>
+ <comment xml:lang="uk">звук MiniPSF</comment>
+ <comment xml:lang="tr">MiniPSF sesi</comment>
+ <comment xml:lang="sv">MiniPSF-ljud</comment>
+ <comment xml:lang="sr">Мини ПСФ звук</comment>
+ <comment xml:lang="sq">audio MiniPSF</comment>
+ <comment xml:lang="sl">Zvočna datoteka MiniPSF</comment>
+ <comment xml:lang="si">MiniPSF ශ්රව්ය</comment>
+ <comment xml:lang="sk">Zvuk MiniPSF</comment>
+ <comment xml:lang="ru">Аудио MiniPSF</comment>
+ <comment xml:lang="ro">Audio MiniPSF</comment>
+ <comment xml:lang="pt_BR">Áudio MiniPSF</comment>
+ <comment xml:lang="pt">áudio MiniPSF</comment>
+ <comment xml:lang="pl">Plik dźwiękowy MiniPSF</comment>
+ <comment xml:lang="oc">àudio MiniPSF</comment>
+ <comment xml:lang="nn">MiniPSF-lyd</comment>
+ <comment xml:lang="nl">MiniPSF-audio</comment>
+ <comment xml:lang="nb">MiniPSF-lyd</comment>
+ <comment xml:lang="lv">MiniPSF audio</comment>
+ <comment xml:lang="lt">MiniPSF garso įrašas</comment>
+ <comment xml:lang="ko">MiniPSF 오디오</comment>
+ <comment xml:lang="kk">MiniPSF аудиосы</comment>
+ <comment xml:lang="ka">MiniPSF-ის აუდიო</comment>
+ <comment xml:lang="ja">MiniPSF オーディオ</comment>
+ <comment xml:lang="it">Audio MiniPSF</comment>
+ <comment xml:lang="is">MiniPSF hljóðskrá</comment>
+ <comment xml:lang="id">Audio MiniPSF</comment>
+ <comment xml:lang="ia">Audio MiniPSF</comment>
+ <comment xml:lang="hu">MiniPSF hang</comment>
+ <comment xml:lang="hr">MiniPSF zvučni zapis</comment>
+ <comment xml:lang="he">שמע של MiniPSP</comment>
+ <comment xml:lang="gl">son MiniPSF</comment>
+ <comment xml:lang="ga">fuaim MiniPSF</comment>
+ <comment xml:lang="fur">audio MiniPSF</comment>
+ <comment xml:lang="fr">audio MiniPSF</comment>
+ <comment xml:lang="fo">MiniPSF ljóður</comment>
+ <comment xml:lang="fi">MiniPSF-ääni</comment>
+ <comment xml:lang="eu">MiniPSF audioa</comment>
+ <comment xml:lang="es">sonido MiniPSF</comment>
+ <comment xml:lang="eo">MiniPSF-sondosiero</comment>
+ <comment xml:lang="en_GB">MiniPSF audio</comment>
+ <comment xml:lang="el">Ήχος MiniPSF</comment>
+ <comment xml:lang="de">MiniPSF-Audio</comment>
+ <comment xml:lang="da">MiniPSF-lyd</comment>
+ <comment xml:lang="cs">zvuk MiniPSF</comment>
+ <comment xml:lang="ca">àudio MiniPSF</comment>
+ <comment xml:lang="bg">Аудио — MiniPSF</comment>
+ <comment xml:lang="be@latin">Aŭdyjo MiniPSF</comment>
+ <comment xml:lang="be">аўдыя MiniPSF</comment>
+ <comment xml:lang="ar">صوت MiniPSF</comment>
+ <comment xml:lang="af">MiniPSF-oudio</comment>
<acronym>MiniPSF</acronym>
<expanded-acronym>Miniature Portable Sound Format</expanded-acronym>
<sub-class-of type="audio/x-psf"/>
@@ -24858,54 +26138,57 @@ command to generate the output files.
</mime-type>
<mime-type type="audio/x-psflib">
<comment>PSFlib audio library</comment>
- <comment xml:lang="af">PSFlib-oudiobiblioteek</comment>
- <comment xml:lang="ar">مكتبة PSFlib السمعية</comment>
- <comment xml:lang="be-Latn">Aŭdyjobiblijateka PSFlib</comment>
- <comment xml:lang="bg">Аудио библиотека — PSFlib</comment>
- <comment xml:lang="ca">biblioteca d'àudio PSFlib</comment>
- <comment xml:lang="cs">zvuková knihovna PSFlib</comment>
- <comment xml:lang="da">PSFlib-lydbibliotek</comment>
- <comment xml:lang="de">PSFlib-Audiobibliothek</comment>
- <comment xml:lang="el">Βιβλιοθήκη ήχου PSFlib</comment>
- <comment xml:lang="en-GB">PSFlib audio library</comment>
- <comment xml:lang="es">biblioteca de audio PSFlib</comment>
- <comment xml:lang="eu">PSFlib audioaren liburutegia</comment>
- <comment xml:lang="fi">PSFlib-äänikirjasto</comment>
- <comment xml:lang="fo">PSFlib ljóðsavn</comment>
- <comment xml:lang="fr">bibliothèque audio PSFlib</comment>
- <comment xml:lang="fur">librarie audio PSFlib</comment>
- <comment xml:lang="ga">leabharlann fhuaime PSFlib</comment>
- <comment xml:lang="gl">Biblioteca de son PSFlib</comment>
- <comment xml:lang="he">ספריית שמע PSFlib</comment>
- <comment xml:lang="hr">PSFlib zvučna biblioteka</comment>
- <comment xml:lang="hu">PSFlib hanggyűjtemény</comment>
- <comment xml:lang="ia">Bibliotheca audio PSFlib</comment>
- <comment xml:lang="id">Pustaka audio PSFlib</comment>
- <comment xml:lang="it">Libreria audio PSFlib</comment>
- <comment xml:lang="ja">PSFlib オーディオライブラリ</comment>
- <comment xml:lang="kk">PSFlib аудио жинағы</comment>
- <comment xml:lang="ko">PSFlib 오디오 라이브러리</comment>
- <comment xml:lang="lt">PSFlib garso biblioteka</comment>
- <comment xml:lang="lv">PSFlib fonotēka</comment>
- <comment xml:lang="nb">PSFlib-lydbibliotek</comment>
- <comment xml:lang="nl">PSFlib-audiobibliotheek</comment>
- <comment xml:lang="nn">PSFlib lydbibliotek</comment>
- <comment xml:lang="oc">bibliotèca àudio PSFlib</comment>
- <comment xml:lang="pl">Biblioteka dźwiękowa PSFlib</comment>
- <comment xml:lang="pt">biblioteca áudio PSFlib</comment>
- <comment xml:lang="pt-BR">Biblioteca de áudio PSFlib</comment>
- <comment xml:lang="ro">Bibliotecă audio PSFlib</comment>
- <comment xml:lang="ru">Фонотека PSFlib</comment>
- <comment xml:lang="sk">Zvuková knižnica PSFlib</comment>
- <comment xml:lang="sl">Zvočna knjižnica PSFlib</comment>
- <comment xml:lang="sq">Librari audio PSFlib</comment>
- <comment xml:lang="sr">библиотека звука ПСФ библиотеке</comment>
- <comment xml:lang="sv">PSFlib-ljudbibliotek</comment>
- <comment xml:lang="tr">PSFlib ses kitaplığı</comment>
- <comment xml:lang="uk">аудіобібліотека PSFlib</comment>
+ <comment xml:lang="zh_TW">PSFlib 音訊庫</comment>
+ <comment xml:lang="zh_CN">PSFlib 音频库</comment>
<comment xml:lang="vi">Thư viện âm thanh PSFlib</comment>
- <comment xml:lang="zh-CN">PSFlib 音频库</comment>
- <comment xml:lang="zh-TW">PSFlib 音訊庫</comment>
+ <comment xml:lang="uk">аудіобібліотека PSFlib</comment>
+ <comment xml:lang="tr">PSFlib ses kitaplığı</comment>
+ <comment xml:lang="sv">PSFlib-ljudbibliotek</comment>
+ <comment xml:lang="sr">библиотека звука ПСФ библиотеке</comment>
+ <comment xml:lang="sq">bibliotekë audio PSFlib</comment>
+ <comment xml:lang="sl">Zvočna knjižnica PSFlib</comment>
+ <comment xml:lang="si">PSFlib ශ්‍රව්‍ය පුස්තකාලය</comment>
+ <comment xml:lang="sk">Zvuková knižnica PSFlib</comment>
+ <comment xml:lang="ru">Фонотека PSFlib</comment>
+ <comment xml:lang="ro">Bibliotecă audio PSFlib</comment>
+ <comment xml:lang="pt_BR">Biblioteca de áudio PSFlib</comment>
+ <comment xml:lang="pt">biblioteca áudio PSFlib</comment>
+ <comment xml:lang="pl">Biblioteka dźwiękowa PSFlib</comment>
+ <comment xml:lang="oc">bibliotèca àudio PSFlib</comment>
+ <comment xml:lang="nn">PSFlib lydbibliotek</comment>
+ <comment xml:lang="nl">PSFlib-audiobibliotheek</comment>
+ <comment xml:lang="nb">PSFlib-lydbibliotek</comment>
+ <comment xml:lang="lv">PSFlib fonotēka</comment>
+ <comment xml:lang="lt">PSFlib garso biblioteka</comment>
+ <comment xml:lang="ko">PSFlib 오디오 라이브러리</comment>
+ <comment xml:lang="kk">PSFlib аудио жинағы</comment>
+ <comment xml:lang="ja">PSFlib オーディオライブラリ</comment>
+ <comment xml:lang="it">Libreria audio PSFlib</comment>
+ <comment xml:lang="is">PSFlib hljóðaðgerðasafn</comment>
+ <comment xml:lang="id">Pustaka audio PSFlib</comment>
+ <comment xml:lang="ia">Bibliotheca audio PSFlib</comment>
+ <comment xml:lang="hu">PSFlib hanggyűjtemény</comment>
+ <comment xml:lang="hr">PSFlib zvučna biblioteka</comment>
+ <comment xml:lang="he">ספריית שמע PSFlib</comment>
+ <comment xml:lang="gl">Biblioteca de son PSFlib</comment>
+ <comment xml:lang="ga">leabharlann fhuaime PSFlib</comment>
+ <comment xml:lang="fur">librarie audio PSFlib</comment>
+ <comment xml:lang="fr">bibliothèque audio PSFlib</comment>
+ <comment xml:lang="fo">PSFlib ljóðsavn</comment>
+ <comment xml:lang="fi">PSFlib-äänikirjasto</comment>
+ <comment xml:lang="eu">PSFlib audioaren liburutegia</comment>
+ <comment xml:lang="es">biblioteca de sonido PSFlib</comment>
+ <comment xml:lang="en_GB">PSFlib audio library</comment>
+ <comment xml:lang="el">Βιβλιοθήκη ήχου PSFlib</comment>
+ <comment xml:lang="de">PSFlib-Audiobibliothek</comment>
+ <comment xml:lang="da">PSFlib-lydbibliotek</comment>
+ <comment xml:lang="cs">zvuková knihovna PSFlib</comment>
+ <comment xml:lang="ca">biblioteca d'àudio PSFlib</comment>
+ <comment xml:lang="bg">Аудио библиотека — PSFlib</comment>
+ <comment xml:lang="be@latin">Aŭdyjobiblijateka PSFlib</comment>
+ <comment xml:lang="be">аўдыябібліятэка PSFlib</comment>
+ <comment xml:lang="ar">مكتبة صوت PSFlib</comment>
+ <comment xml:lang="af">PSFlib-oudiobiblioteek</comment>
<acronym>PSFlib</acronym>
<expanded-acronym>Portable Sound Format Library</expanded-acronym>
<sub-class-of type="audio/x-psf"/>
@@ -24913,109 +26196,115 @@ command to generate the output files.
</mime-type>
<mime-type type="audio/x-ms-wma">
<comment>Windows Media audio</comment>
- <comment xml:lang="af">Windows Media-oudio</comment>
- <comment xml:lang="ar">Windows Media سمعي</comment>
- <comment xml:lang="be-Latn">Aŭdyjo Windows Media</comment>
- <comment xml:lang="bg">Аудио — Windows Media</comment>
- <comment xml:lang="ca">àudio de Windows Media</comment>
- <comment xml:lang="cs">zvuk Windows Media</comment>
- <comment xml:lang="da">Windows Media-lyd</comment>
- <comment xml:lang="de">Windows-Media-Audio</comment>
- <comment xml:lang="el">Ήχος Windows Media</comment>
- <comment xml:lang="en-GB">Windows Media audio</comment>
- <comment xml:lang="es">audio de Windows Media</comment>
- <comment xml:lang="eu">Windows Media audioa</comment>
- <comment xml:lang="fi">Windows Media -ääni</comment>
- <comment xml:lang="fo">Windows Media ljóður</comment>
- <comment xml:lang="fr">audio Windows Media</comment>
- <comment xml:lang="fur">audio Windows Media</comment>
- <comment xml:lang="ga">fuaim Windows Media</comment>
- <comment xml:lang="gl">son de Windows Media</comment>
- <comment xml:lang="he">שמע של Windows Media</comment>
- <comment xml:lang="hr">Windows Media zvučni zapis</comment>
- <comment xml:lang="hu">Windows Media hang</comment>
- <comment xml:lang="ia">Audio Windows Media</comment>
- <comment xml:lang="id">Audio Windows Media</comment>
- <comment xml:lang="it">Audio Windows Media</comment>
- <comment xml:lang="ja">Windows Media オーディオ</comment>
- <comment xml:lang="kk">Windows Media аудиосы</comment>
- <comment xml:lang="ko">Windows 미디어 오디오</comment>
- <comment xml:lang="lt">Windows Media garso įrašas</comment>
- <comment xml:lang="lv">Windows Media audio</comment>
- <comment xml:lang="nb">Windows Media lyd</comment>
- <comment xml:lang="nl">Windows Media-audio</comment>
- <comment xml:lang="nn">Windows Media-lyd</comment>
- <comment xml:lang="oc">àudio Windows Media</comment>
- <comment xml:lang="pl">Plik dźwiękowy Windows Media</comment>
- <comment xml:lang="pt">áudio Windows Media</comment>
- <comment xml:lang="pt-BR">Áudio do Windows Media</comment>
- <comment xml:lang="ro">Audio Windows Media</comment>
- <comment xml:lang="ru">Аудио Windows Media</comment>
- <comment xml:lang="sk">Zvuk Windows Media</comment>
- <comment xml:lang="sl">Zvočna datoteka Windows Media</comment>
- <comment xml:lang="sq">Audio Windows Media</comment>
- <comment xml:lang="sr">Виндоуз Медија звук</comment>
- <comment xml:lang="sv">Windows Media-ljud</comment>
- <comment xml:lang="tr">Windows Media sesi</comment>
- <comment xml:lang="uk">звук Windows Media</comment>
+ <comment xml:lang="zh_TW">Windows Media 音訊</comment>
+ <comment xml:lang="zh_CN">Windows Media 音频</comment>
<comment xml:lang="vi">Âm thanh Windows Media</comment>
- <comment xml:lang="zh-CN">Windows Media 音频</comment>
- <comment xml:lang="zh-TW">Windows Media 音訊</comment>
+ <comment xml:lang="uk">звук Windows Media</comment>
+ <comment xml:lang="tr">Windows Media sesi</comment>
+ <comment xml:lang="sv">Windows Media-ljud</comment>
+ <comment xml:lang="sr">Виндоуз Медија звук</comment>
+ <comment xml:lang="sq">audio Windows Media</comment>
+ <comment xml:lang="sl">Zvočna datoteka Windows Media</comment>
+ <comment xml:lang="si">වින්ඩෝස් මීඩියා ඕඩියෝ</comment>
+ <comment xml:lang="sk">Zvuk Windows Media</comment>
+ <comment xml:lang="ru">Аудио Windows Media</comment>
+ <comment xml:lang="ro">Audio Windows Media</comment>
+ <comment xml:lang="pt_BR">Áudio do Windows Media</comment>
+ <comment xml:lang="pt">áudio Windows Media</comment>
+ <comment xml:lang="pl">Plik dźwiękowy Windows Media</comment>
+ <comment xml:lang="oc">àudio Windows Media</comment>
+ <comment xml:lang="nn">Windows Media-lyd</comment>
+ <comment xml:lang="nl">Windows Media-audio</comment>
+ <comment xml:lang="nb">Windows Media lyd</comment>
+ <comment xml:lang="lv">Windows Media audio</comment>
+ <comment xml:lang="lt">Windows Media garso įrašas</comment>
+ <comment xml:lang="ko">Windows 미디어 오디오</comment>
+ <comment xml:lang="kk">Windows Media аудиосы</comment>
+ <comment xml:lang="ja">Windows Media オーディオ</comment>
+ <comment xml:lang="it">Audio Windows Media</comment>
+ <comment xml:lang="is">Windows Media hljóðskrá</comment>
+ <comment xml:lang="id">Audio Windows Media</comment>
+ <comment xml:lang="ia">Audio Windows Media</comment>
+ <comment xml:lang="hu">Windows Media hang</comment>
+ <comment xml:lang="hr">Windows Media zvučni zapis</comment>
+ <comment xml:lang="he">שמע של Windows Media</comment>
+ <comment xml:lang="gl">son de Windows Media</comment>
+ <comment xml:lang="ga">fuaim Windows Media</comment>
+ <comment xml:lang="fur">audio Windows Media</comment>
+ <comment xml:lang="fr">audio Windows Media</comment>
+ <comment xml:lang="fo">Windows Media ljóður</comment>
+ <comment xml:lang="fi">Windows Media -ääni</comment>
+ <comment xml:lang="eu">Windows Media audioa</comment>
+ <comment xml:lang="es">sonido de Windows Media</comment>
+ <comment xml:lang="en_GB">Windows Media audio</comment>
+ <comment xml:lang="el">Ήχος Windows Media</comment>
+ <comment xml:lang="de">Windows-Media-Audio</comment>
+ <comment xml:lang="da">Windows Media-lyd</comment>
+ <comment xml:lang="cs">zvuk Windows Media</comment>
+ <comment xml:lang="ca">àudio de Windows Media</comment>
+ <comment xml:lang="bg">Аудио — Windows Media</comment>
+ <comment xml:lang="be@latin">Aŭdyjo Windows Media</comment>
+ <comment xml:lang="be">аўдыя Windows Media</comment>
+ <comment xml:lang="ar">فيديو ويندوز ميديا</comment>
+ <comment xml:lang="af">Windows Media-oudio</comment>
<sub-class-of type="application/vnd.ms-asf"/>
<glob pattern="*.wma"/>
<alias type="audio/wma"/>
</mime-type>
<mime-type type="audio/x-musepack">
<comment>Musepack audio</comment>
- <comment xml:lang="af">Musepack-oudio</comment>
- <comment xml:lang="ar">Musepack سمعي</comment>
- <comment xml:lang="be-Latn">Aŭdyjo Musepack</comment>
- <comment xml:lang="bg">Аудио — Musepack</comment>
- <comment xml:lang="ca">àudio de Musepack</comment>
- <comment xml:lang="cs">zvuk Musepack</comment>
- <comment xml:lang="da">Musepack-lyd</comment>
- <comment xml:lang="de">Musepack-Audio</comment>
- <comment xml:lang="el">Ήχος Musepack</comment>
- <comment xml:lang="en-GB">Musepack audio</comment>
- <comment xml:lang="es">audio Musepack</comment>
- <comment xml:lang="eu">Musepack audioa</comment>
- <comment xml:lang="fi">Musepack-ääni</comment>
- <comment xml:lang="fo">Musepack ljóður</comment>
- <comment xml:lang="fr">audio Musepack</comment>
- <comment xml:lang="fur">audio Musepack</comment>
- <comment xml:lang="ga">fuaim Musepack</comment>
- <comment xml:lang="gl">son de Musepack</comment>
- <comment xml:lang="he">שמע של Musepack</comment>
- <comment xml:lang="hr">Musepack zvučni zapis</comment>
- <comment xml:lang="hu">Musepack hang</comment>
- <comment xml:lang="ia">Audio Musepack</comment>
- <comment xml:lang="id">Audio Musepack</comment>
- <comment xml:lang="it">Audio Musepack</comment>
- <comment xml:lang="ja">Musepack オーディオ</comment>
- <comment xml:lang="kk">Musepack аудиосы</comment>
- <comment xml:lang="ko">Musepack 오디오</comment>
- <comment xml:lang="lt">Musepack garso įrašas</comment>
- <comment xml:lang="lv">Musepack audio</comment>
- <comment xml:lang="nb">Musepack-lyd</comment>
- <comment xml:lang="nl">Musepack-audio</comment>
- <comment xml:lang="nn">Musepack-lyd</comment>
- <comment xml:lang="oc">àudio Musepack</comment>
- <comment xml:lang="pl">Plik dźwiękowy Musepack</comment>
- <comment xml:lang="pt">áudio Musepack</comment>
- <comment xml:lang="pt-BR">Áudio Musepack</comment>
- <comment xml:lang="ro">Audio Musepack</comment>
- <comment xml:lang="ru">Аудио Musepack</comment>
- <comment xml:lang="sk">Zvuk Musepack</comment>
- <comment xml:lang="sl">Zvočna datoteka Musepack</comment>
- <comment xml:lang="sq">Audio Musepack</comment>
- <comment xml:lang="sr">звук Мјузпака</comment>
- <comment xml:lang="sv">Musepack-ljud</comment>
- <comment xml:lang="tr">Musepack sesi</comment>
- <comment xml:lang="uk">звук Musepack</comment>
+ <comment xml:lang="zh_TW">Musepack 音訊</comment>
+ <comment xml:lang="zh_CN">Musepack 音频</comment>
<comment xml:lang="vi">Âm thanh Musepack</comment>
- <comment xml:lang="zh-CN">Musepack 音频</comment>
- <comment xml:lang="zh-TW">Musepack 音訊</comment>
- <magic priority="50">
+ <comment xml:lang="uk">звук Musepack</comment>
+ <comment xml:lang="tr">Musepack sesi</comment>
+ <comment xml:lang="sv">Musepack-ljud</comment>
+ <comment xml:lang="sr">звук Мјузпака</comment>
+ <comment xml:lang="sq">audio Musepack</comment>
+ <comment xml:lang="sl">Zvočna datoteka Musepack</comment>
+ <comment xml:lang="si">Musepack ශ්‍රව්‍ය</comment>
+ <comment xml:lang="sk">Zvuk Musepack</comment>
+ <comment xml:lang="ru">Аудио Musepack</comment>
+ <comment xml:lang="ro">Audio Musepack</comment>
+ <comment xml:lang="pt_BR">Áudio Musepack</comment>
+ <comment xml:lang="pt">áudio Musepack</comment>
+ <comment xml:lang="pl">Plik dźwiękowy Musepack</comment>
+ <comment xml:lang="oc">àudio Musepack</comment>
+ <comment xml:lang="nn">Musepack-lyd</comment>
+ <comment xml:lang="nl">Musepack-audio</comment>
+ <comment xml:lang="nb">Musepack-lyd</comment>
+ <comment xml:lang="lv">Musepack audio</comment>
+ <comment xml:lang="lt">Musepack garso įrašas</comment>
+ <comment xml:lang="ko">Musepack 오디오</comment>
+ <comment xml:lang="kk">Musepack аудиосы</comment>
+ <comment xml:lang="ja">Musepack オーディオ</comment>
+ <comment xml:lang="it">Audio Musepack</comment>
+ <comment xml:lang="is">Musepack hljóðskrá</comment>
+ <comment xml:lang="id">Audio Musepack</comment>
+ <comment xml:lang="ia">Audio Musepack</comment>
+ <comment xml:lang="hu">Musepack hang</comment>
+ <comment xml:lang="hr">Musepack zvučni zapis</comment>
+ <comment xml:lang="he">שמע של Musepack</comment>
+ <comment xml:lang="gl">son de Musepack</comment>
+ <comment xml:lang="ga">fuaim Musepack</comment>
+ <comment xml:lang="fur">audio Musepack</comment>
+ <comment xml:lang="fr">audio Musepack</comment>
+ <comment xml:lang="fo">Musepack ljóður</comment>
+ <comment xml:lang="fi">Musepack-ääni</comment>
+ <comment xml:lang="eu">Musepack audioa</comment>
+ <comment xml:lang="es">sonido Musepack</comment>
+ <comment xml:lang="en_GB">Musepack audio</comment>
+ <comment xml:lang="el">Ήχος Musepack</comment>
+ <comment xml:lang="de">Musepack-Audio</comment>
+ <comment xml:lang="da">Musepack-lyd</comment>
+ <comment xml:lang="cs">zvuk Musepack</comment>
+ <comment xml:lang="ca">àudio de Musepack</comment>
+ <comment xml:lang="bg">Аудио — Musepack</comment>
+ <comment xml:lang="be@latin">Aŭdyjo Musepack</comment>
+ <comment xml:lang="be">аўдыя Musepack</comment>
+ <comment xml:lang="ar">صوت Musepack</comment>
+ <comment xml:lang="af">Musepack-oudio</comment>
+ <magic>
<match type="string" value="MP+" offset="0"/>
<match type="string" value="MPCK" offset="0"/>
</magic>
@@ -25025,56 +26314,59 @@ command to generate the output files.
</mime-type>
<mime-type type="audio/vnd.rn-realaudio">
<comment>RealAudio document</comment>
- <comment xml:lang="af">RealAudio-dokument</comment>
- <comment xml:lang="ar">مستند RealAudio</comment>
- <comment xml:lang="ast">Documentu RealAudio</comment>
- <comment xml:lang="be-Latn">Dakument RealAudio</comment>
- <comment xml:lang="bg">Документ — RealAudio</comment>
- <comment xml:lang="ca">document RealAudio</comment>
- <comment xml:lang="cs">dokument RealAudio</comment>
- <comment xml:lang="da">RealAudio-dokument</comment>
- <comment xml:lang="de">RealAudio-Dokument</comment>
- <comment xml:lang="el">Έγγραφο RealAudio</comment>
- <comment xml:lang="en-GB">RealAudio document</comment>
- <comment xml:lang="eo">RealAudio-dokumento</comment>
- <comment xml:lang="es">documento RealAudio</comment>
- <comment xml:lang="eu">RealAudio dokumentua</comment>
- <comment xml:lang="fi">RealAudio-asiakirja</comment>
- <comment xml:lang="fo">RealAudio skjal</comment>
- <comment xml:lang="fr">document RealAudio</comment>
- <comment xml:lang="fur">document RealAudio</comment>
- <comment xml:lang="ga">cáipéis RealAudio</comment>
- <comment xml:lang="gl">documento Realson</comment>
- <comment xml:lang="he">מסמך של RealAudio</comment>
- <comment xml:lang="hr">RealAudio dokument</comment>
- <comment xml:lang="hu">RealAudio dokumentum</comment>
- <comment xml:lang="ia">Documento RealAudio</comment>
- <comment xml:lang="id">Dokumen RealAudio</comment>
- <comment xml:lang="it">Documento RealAudio</comment>
- <comment xml:lang="ja">RealAudio ドキュメント</comment>
- <comment xml:lang="kk">RealAudio құжаты</comment>
- <comment xml:lang="ko">RealAudio 문서</comment>
- <comment xml:lang="lt">RealAudio dokumentas</comment>
- <comment xml:lang="lv">RealAudio dokuments</comment>
- <comment xml:lang="nb">RealAudio-dokument</comment>
- <comment xml:lang="nl">RealAudio-document</comment>
- <comment xml:lang="nn">RealAudio-dokument</comment>
- <comment xml:lang="oc">document RealAudio</comment>
- <comment xml:lang="pl">Dokument RealAudio</comment>
- <comment xml:lang="pt">documento RealAudio</comment>
- <comment xml:lang="pt-BR">Documento RealAudio</comment>
- <comment xml:lang="ro">Document RealAudio</comment>
- <comment xml:lang="ru">Документ RealAudio</comment>
- <comment xml:lang="sk">Dokument RealAudio</comment>
- <comment xml:lang="sl">Dokument RealAudio</comment>
- <comment xml:lang="sq">Dokument RealAudio</comment>
- <comment xml:lang="sr">документ Рил Аудиа</comment>
- <comment xml:lang="sv">RealAudio-dokument</comment>
- <comment xml:lang="tr">RealAudio belgesi</comment>
- <comment xml:lang="uk">документ RealAudio</comment>
+ <comment xml:lang="zh_TW">RealAudio 文件</comment>
+ <comment xml:lang="zh_CN">RealAudio 文档</comment>
<comment xml:lang="vi">Tài liệu âm thanh RealAudio</comment>
- <comment xml:lang="zh-CN">RealAudio 文档</comment>
- <comment xml:lang="zh-TW">RealAudio 文件</comment>
+ <comment xml:lang="uk">документ RealAudio</comment>
+ <comment xml:lang="tr">RealAudio belgesi</comment>
+ <comment xml:lang="sv">RealAudio-dokument</comment>
+ <comment xml:lang="sr">документ Рил Аудиа</comment>
+ <comment xml:lang="sq">dokument RealAudio</comment>
+ <comment xml:lang="sl">Dokument RealAudio</comment>
+ <comment xml:lang="si">රියල් ඕඩියෝ ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument RealAudio</comment>
+ <comment xml:lang="ru">Документ RealAudio</comment>
+ <comment xml:lang="ro">Document RealAudio</comment>
+ <comment xml:lang="pt_BR">Documento RealAudio</comment>
+ <comment xml:lang="pt">documento RealAudio</comment>
+ <comment xml:lang="pl">Dokument RealAudio</comment>
+ <comment xml:lang="oc">document RealAudio</comment>
+ <comment xml:lang="nn">RealAudio-dokument</comment>
+ <comment xml:lang="nl">RealAudio-document</comment>
+ <comment xml:lang="nb">RealAudio-dokument</comment>
+ <comment xml:lang="lv">RealAudio dokuments</comment>
+ <comment xml:lang="lt">RealAudio dokumentas</comment>
+ <comment xml:lang="ko">RealAudio 문서</comment>
+ <comment xml:lang="kk">RealAudio құжаты</comment>
+ <comment xml:lang="ja">RealAudio ドキュメント</comment>
+ <comment xml:lang="it">Documento RealAudio</comment>
+ <comment xml:lang="is">RealAudio skjal</comment>
+ <comment xml:lang="id">Dokumen RealAudio</comment>
+ <comment xml:lang="ia">Documento RealAudio</comment>
+ <comment xml:lang="hu">RealAudio dokumentum</comment>
+ <comment xml:lang="hr">RealAudio dokument</comment>
+ <comment xml:lang="he">מסמך של RealAudio</comment>
+ <comment xml:lang="gl">documento Realson</comment>
+ <comment xml:lang="ga">cáipéis RealAudio</comment>
+ <comment xml:lang="fur">document RealAudio</comment>
+ <comment xml:lang="fr">document RealAudio</comment>
+ <comment xml:lang="fo">RealAudio skjal</comment>
+ <comment xml:lang="fi">RealAudio-asiakirja</comment>
+ <comment xml:lang="eu">RealAudio dokumentua</comment>
+ <comment xml:lang="es">documento RealAudio</comment>
+ <comment xml:lang="eo">RealAudio-dokumento</comment>
+ <comment xml:lang="en_GB">RealAudio document</comment>
+ <comment xml:lang="el">Έγγραφο RealAudio</comment>
+ <comment xml:lang="de">RealAudio-Dokument</comment>
+ <comment xml:lang="da">RealAudio-dokument</comment>
+ <comment xml:lang="cs">dokument RealAudio</comment>
+ <comment xml:lang="ca">document RealAudio</comment>
+ <comment xml:lang="bg">Документ — RealAudio</comment>
+ <comment xml:lang="be@latin">Dakument RealAudio</comment>
+ <comment xml:lang="be">дакумент RealAudio</comment>
+ <comment xml:lang="ast">Documentu RealAudio</comment>
+ <comment xml:lang="ar">مستند RealAudio</comment>
+ <comment xml:lang="af">RealAudio-dokument</comment>
<glob pattern="*.ra"/>
<glob pattern="*.rax"/>
<alias type="audio/x-pn-realaudio"/>
@@ -25082,142 +26374,161 @@ command to generate the output files.
</mime-type>
<mime-type type="application/ram">
<comment>RealMedia playlist</comment>
- <comment xml:lang="bg">Списък за изпълнение — RealMedia</comment>
- <comment xml:lang="ca">llista de reproducció RealMedia</comment>
- <comment xml:lang="da">RealMedia-afspilningsliste</comment>
- <comment xml:lang="de">RealMedia-Wiedergabeliste</comment>
- <comment xml:lang="en-GB">RealMedia playlist</comment>
- <comment xml:lang="es">lista de reproducción de RealMedia</comment>
- <comment xml:lang="eu">RealMedia erreprodukzio-zerrenda</comment>
- <comment xml:lang="fi">RealMedia-soittolista</comment>
- <comment xml:lang="fr">liste de lecture RealMedia</comment>
- <comment xml:lang="hr">RealMedia popis izvođenja</comment>
- <comment xml:lang="hu">RealMedia lejátszólista</comment>
- <comment xml:lang="id">Daftar putar RealMedia</comment>
- <comment xml:lang="it">Playlist RealMedia</comment>
- <comment xml:lang="kk">RealMedia ойнау тізімі</comment>
- <comment xml:lang="ko">RealMedia 재생 목록</comment>
- <comment xml:lang="pl">Lista odtwarzania RealMedia</comment>
- <comment xml:lang="pt-BR">Lista de reprodução do RealMedia</comment>
- <comment xml:lang="ru">Список воспроизведения RealMedia</comment>
- <comment xml:lang="sk">Zoznam skladieb RealMedia</comment>
- <comment xml:lang="sv">RealMedia-spellista</comment>
- <comment xml:lang="tr">RealMedia çalma listesi</comment>
+ <comment xml:lang="zh_TW">RealMedia 播放清單</comment>
+ <comment xml:lang="zh_CN">RealMedia 播放列表</comment>
<comment xml:lang="uk">список відтворення RealMedia</comment>
- <comment xml:lang="zh-CN">RealMedia 播放列表</comment>
- <comment xml:lang="zh-TW">RealMedia 播放清單</comment>
+ <comment xml:lang="tr">RealMedia çalma listesi</comment>
+ <comment xml:lang="sv">RealMedia-spellista</comment>
+ <comment xml:lang="sq">luajlistë RealMedia</comment>
+ <comment xml:lang="sl">Seznam predvajanja RealMedia</comment>
+ <comment xml:lang="si">RealMedia ධාවන ලැයිස්තුව</comment>
+ <comment xml:lang="sk">Zoznam skladieb RealMedia</comment>
+ <comment xml:lang="ru">Список воспроизведения RealMedia</comment>
+ <comment xml:lang="pt_BR">Lista de reprodução do RealMedia</comment>
+ <comment xml:lang="pl">Lista odtwarzania RealMedia</comment>
+ <comment xml:lang="oc">lista de lectura RealMedia</comment>
+ <comment xml:lang="nl">RealMedia-afspeellijst</comment>
+ <comment xml:lang="lt">RealMedia grojaraštis</comment>
+ <comment xml:lang="ko">RealMedia 재생 목록</comment>
+ <comment xml:lang="kk">RealMedia ойнау тізімі</comment>
+ <comment xml:lang="ka">RealMedia დასაკრავი სია</comment>
+ <comment xml:lang="ja">RealMedia プレイリスト</comment>
+ <comment xml:lang="it">Playlist RealMedia</comment>
+ <comment xml:lang="is">RealMedia spilunarlisti</comment>
+ <comment xml:lang="id">Daftar putar RealMedia</comment>
+ <comment xml:lang="hu">RealMedia lejátszólista</comment>
+ <comment xml:lang="hr">RealMedia popis izvođenja</comment>
+ <comment xml:lang="he">רשימת השמעה של RealMedia</comment>
+ <comment xml:lang="gl">Lista de reprodución RealMedia</comment>
+ <comment xml:lang="fr">liste de lecture RealMedia</comment>
+ <comment xml:lang="fi">RealMedia-soittolista</comment>
+ <comment xml:lang="eu">RealMedia erreprodukzio-zerrenda</comment>
+ <comment xml:lang="es">lista de reproducción de RealMedia</comment>
+ <comment xml:lang="en_GB">RealMedia playlist</comment>
+ <comment xml:lang="de">RealMedia-Wiedergabeliste</comment>
+ <comment xml:lang="da">RealMedia-afspilningsliste</comment>
+ <comment xml:lang="ca">llista de reproducció RealMedia</comment>
+ <comment xml:lang="bg">Списък за изпълнение — RealMedia</comment>
+ <comment xml:lang="be">плэй-ліст RealMedia</comment>
+ <comment xml:lang="ar">قائمة تشغيل RealMedia</comment>
<glob pattern="*.ram"/>
</mime-type>
<mime-type type="video/vnd.rn-realvideo">
<comment>RealVideo document</comment>
- <comment xml:lang="af">RealVideo-dokument</comment>
- <comment xml:lang="ar">مستند RealVideo</comment>
- <comment xml:lang="ast">Documentu RealVideo</comment>
- <comment xml:lang="be-Latn">Dakument RealVideo</comment>
- <comment xml:lang="bg">Документ — RealVideo</comment>
- <comment xml:lang="ca">document RealVideo</comment>
- <comment xml:lang="cs">dokument RealVideo</comment>
- <comment xml:lang="da">RealAudio-dokument</comment>
- <comment xml:lang="de">RealVideo-Dokument</comment>
- <comment xml:lang="el">Έγγραφο RealVideo</comment>
- <comment xml:lang="en-GB">RealVideo document</comment>
- <comment xml:lang="eo">RealVideo-dokumento</comment>
- <comment xml:lang="es">documento RealVideo</comment>
- <comment xml:lang="eu">RealVideo dokumentua</comment>
- <comment xml:lang="fi">RealVideo-asiakirja</comment>
- <comment xml:lang="fo">RealVideo skjal</comment>
- <comment xml:lang="fr">document RealVideo</comment>
- <comment xml:lang="fur">document RealVideo</comment>
- <comment xml:lang="ga">cáipéis RealVideo</comment>
- <comment xml:lang="gl">documento RealVideo</comment>
- <comment xml:lang="he">מסמך של RealVideo</comment>
- <comment xml:lang="hr">RealVideo dokument</comment>
- <comment xml:lang="hu">RealVideo dokumentum</comment>
- <comment xml:lang="ia">Documento RealVideo</comment>
- <comment xml:lang="id">Dokumen RealVideo</comment>
- <comment xml:lang="it">Documento RealVideo</comment>
- <comment xml:lang="ja">RealVideo ドキュメント</comment>
- <comment xml:lang="kk">RealVideo құжаты</comment>
- <comment xml:lang="ko">RealVideo 문서</comment>
- <comment xml:lang="lt">RealVideo dokumentas</comment>
- <comment xml:lang="lv">RealVideo dokuments</comment>
- <comment xml:lang="nb">RealAudio-dokument</comment>
- <comment xml:lang="nl">RealVideo-document</comment>
- <comment xml:lang="nn">RealVideo-dokument</comment>
- <comment xml:lang="oc">document RealVideo</comment>
- <comment xml:lang="pl">Dokument RealVideo</comment>
- <comment xml:lang="pt">documento RealVideo</comment>
- <comment xml:lang="pt-BR">Documento RealVideo</comment>
- <comment xml:lang="ro">Document RealVideo</comment>
- <comment xml:lang="ru">Документ RealVideo</comment>
- <comment xml:lang="sk">Dokument RealVideo</comment>
- <comment xml:lang="sl">Video datoteka RealVideo</comment>
- <comment xml:lang="sq">Dokument RealVideo</comment>
- <comment xml:lang="sr">документ Рил Видеа</comment>
- <comment xml:lang="sv">RealVideo-dokument</comment>
- <comment xml:lang="tr">RealVideo belgesi</comment>
- <comment xml:lang="uk">документ RealVideo</comment>
+ <comment xml:lang="zh_TW">RealVideo 文件</comment>
+ <comment xml:lang="zh_CN">RealAudio 文档</comment>
<comment xml:lang="vi">Tài liệu ảnh động RealVideo</comment>
- <comment xml:lang="zh-CN">RealAudio 文档</comment>
- <comment xml:lang="zh-TW">RealVideo 文件</comment>
+ <comment xml:lang="uk">документ RealVideo</comment>
+ <comment xml:lang="tr">RealVideo belgesi</comment>
+ <comment xml:lang="sv">RealVideo-dokument</comment>
+ <comment xml:lang="sr">документ Рил Видеа</comment>
+ <comment xml:lang="sq">dokument RealVideo</comment>
+ <comment xml:lang="sl">Video datoteka RealVideo</comment>
+ <comment xml:lang="si">RealVideo ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument RealVideo</comment>
+ <comment xml:lang="ru">Документ RealVideo</comment>
+ <comment xml:lang="ro">Document RealVideo</comment>
+ <comment xml:lang="pt_BR">Documento RealVideo</comment>
+ <comment xml:lang="pt">documento RealVideo</comment>
+ <comment xml:lang="pl">Dokument RealVideo</comment>
+ <comment xml:lang="oc">document RealVideo</comment>
+ <comment xml:lang="nn">RealVideo-dokument</comment>
+ <comment xml:lang="nl">RealVideo-document</comment>
+ <comment xml:lang="nb">RealAudio-dokument</comment>
+ <comment xml:lang="lv">RealVideo dokuments</comment>
+ <comment xml:lang="lt">RealVideo dokumentas</comment>
+ <comment xml:lang="ko">RealVideo 문서</comment>
+ <comment xml:lang="kk">RealVideo құжаты</comment>
+ <comment xml:lang="ja">RealVideo ドキュメント</comment>
+ <comment xml:lang="it">Documento RealVideo</comment>
+ <comment xml:lang="is">RealVideo skjal</comment>
+ <comment xml:lang="id">Dokumen RealVideo</comment>
+ <comment xml:lang="ia">Documento RealVideo</comment>
+ <comment xml:lang="hu">RealVideo dokumentum</comment>
+ <comment xml:lang="hr">RealVideo dokument</comment>
+ <comment xml:lang="he">מסמך של RealVideo</comment>
+ <comment xml:lang="gl">documento RealVideo</comment>
+ <comment xml:lang="ga">cáipéis RealVideo</comment>
+ <comment xml:lang="fur">document RealVideo</comment>
+ <comment xml:lang="fr">document RealVideo</comment>
+ <comment xml:lang="fo">RealVideo skjal</comment>
+ <comment xml:lang="fi">RealVideo-asiakirja</comment>
+ <comment xml:lang="eu">RealVideo dokumentua</comment>
+ <comment xml:lang="es">documento RealVideo</comment>
+ <comment xml:lang="eo">RealVideo-dokumento</comment>
+ <comment xml:lang="en_GB">RealVideo document</comment>
+ <comment xml:lang="el">Έγγραφο RealVideo</comment>
+ <comment xml:lang="de">RealVideo-Dokument</comment>
+ <comment xml:lang="da">RealAudio-dokument</comment>
+ <comment xml:lang="cs">dokument RealVideo</comment>
+ <comment xml:lang="ca">document RealVideo</comment>
+ <comment xml:lang="bg">Документ — RealVideo</comment>
+ <comment xml:lang="be@latin">Dakument RealVideo</comment>
+ <comment xml:lang="be">дакумент RealVideo</comment>
+ <comment xml:lang="ast">Documentu RealVideo</comment>
+ <comment xml:lang="ar">مستند RealVideo</comment>
+ <comment xml:lang="af">RealVideo-dokument</comment>
<glob pattern="*.rv"/>
<glob pattern="*.rvx"/>
<alias type="video/x-real-video"/>
</mime-type>
<mime-type type="application/vnd.rn-realmedia">
<comment>RealMedia document</comment>
- <comment xml:lang="af">RealMedia-dokument</comment>
- <comment xml:lang="ar">مستند RealMedia</comment>
- <comment xml:lang="ast">Documentu RealMedia</comment>
- <comment xml:lang="be-Latn">Dakument RealMedia</comment>
- <comment xml:lang="bg">Документ — RealMedia</comment>
- <comment xml:lang="ca">document RealMedia</comment>
- <comment xml:lang="cs">dokument RealMedia</comment>
- <comment xml:lang="da">RealMedia-dokument</comment>
- <comment xml:lang="de">RealMedia-Dokument</comment>
- <comment xml:lang="el">Έγγραφο RealMedia</comment>
- <comment xml:lang="en-GB">RealMedia document</comment>
- <comment xml:lang="eo">RealMedia-dokumento</comment>
- <comment xml:lang="es">documento RealMedia</comment>
- <comment xml:lang="eu">RealMedia dokumentua</comment>
- <comment xml:lang="fi">RealMedia-asiakirja</comment>
- <comment xml:lang="fo">RealMedia skjal</comment>
- <comment xml:lang="fr">document RealMedia</comment>
- <comment xml:lang="fur">document RealMedia</comment>
- <comment xml:lang="ga">cáipéis RealMedia</comment>
- <comment xml:lang="gl">documento RealMedia</comment>
- <comment xml:lang="he">מסמך של RealMedia</comment>
- <comment xml:lang="hr">RealMedia dokument</comment>
- <comment xml:lang="hu">RealMedia dokumentum</comment>
- <comment xml:lang="ia">Documento RealMedia</comment>
- <comment xml:lang="id">Dokumen RealMedia</comment>
- <comment xml:lang="it">Documento RealMedia</comment>
- <comment xml:lang="ja">RealMedia ドキュメント</comment>
- <comment xml:lang="kk">RealMedia құжаты</comment>
- <comment xml:lang="ko">RealMedia 문서</comment>
- <comment xml:lang="lt">RealMedia dokumentas</comment>
- <comment xml:lang="lv">RealMedia dokuments</comment>
- <comment xml:lang="nb">RealMedia-dokument</comment>
- <comment xml:lang="nl">RealMedia-document</comment>
- <comment xml:lang="nn">RealMedia-dokument</comment>
- <comment xml:lang="oc">document RealMedia</comment>
- <comment xml:lang="pl">Dokument RealMedia</comment>
- <comment xml:lang="pt">documento RealMedia</comment>
- <comment xml:lang="pt-BR">Documento RealMedia</comment>
- <comment xml:lang="ro">Document RealMedia</comment>
- <comment xml:lang="ru">Документ RealMedia</comment>
- <comment xml:lang="sk">Dokument RealMedia</comment>
- <comment xml:lang="sl">Dokument RealMedia</comment>
- <comment xml:lang="sq">Dokument RealMedia</comment>
- <comment xml:lang="sr">документ Рил Медија</comment>
- <comment xml:lang="sv">RealMedia-dokument</comment>
- <comment xml:lang="tr">RealMedia belgesi</comment>
- <comment xml:lang="uk">документ RealMedia</comment>
+ <comment xml:lang="zh_TW">RealMedia 文件</comment>
+ <comment xml:lang="zh_CN">RealMedia 文档</comment>
<comment xml:lang="vi">Tài liệu RealMedia</comment>
- <comment xml:lang="zh-CN">RealMedia 文档</comment>
- <comment xml:lang="zh-TW">RealMedia 文件</comment>
+ <comment xml:lang="uk">документ RealMedia</comment>
+ <comment xml:lang="tr">RealMedia belgesi</comment>
+ <comment xml:lang="sv">RealMedia-dokument</comment>
+ <comment xml:lang="sr">документ Рил Медија</comment>
+ <comment xml:lang="sq">dokument RealMedia</comment>
+ <comment xml:lang="sl">Dokument RealMedia</comment>
+ <comment xml:lang="si">රියල් මීඩියා ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument RealMedia</comment>
+ <comment xml:lang="ru">Документ RealMedia</comment>
+ <comment xml:lang="ro">Document RealMedia</comment>
+ <comment xml:lang="pt_BR">Documento RealMedia</comment>
+ <comment xml:lang="pt">documento RealMedia</comment>
+ <comment xml:lang="pl">Dokument RealMedia</comment>
+ <comment xml:lang="oc">document RealMedia</comment>
+ <comment xml:lang="nn">RealMedia-dokument</comment>
+ <comment xml:lang="nl">RealMedia-document</comment>
+ <comment xml:lang="nb">RealMedia-dokument</comment>
+ <comment xml:lang="lv">RealMedia dokuments</comment>
+ <comment xml:lang="lt">RealMedia dokumentas</comment>
+ <comment xml:lang="ko">RealMedia 문서</comment>
+ <comment xml:lang="kk">RealMedia құжаты</comment>
+ <comment xml:lang="ja">RealMedia ドキュメント</comment>
+ <comment xml:lang="it">Documento RealMedia</comment>
+ <comment xml:lang="is">RealMedia skjal</comment>
+ <comment xml:lang="id">Dokumen RealMedia</comment>
+ <comment xml:lang="ia">Documento RealMedia</comment>
+ <comment xml:lang="hu">RealMedia dokumentum</comment>
+ <comment xml:lang="hr">RealMedia dokument</comment>
+ <comment xml:lang="he">מסמך של RealMedia</comment>
+ <comment xml:lang="gl">documento RealMedia</comment>
+ <comment xml:lang="ga">cáipéis RealMedia</comment>
+ <comment xml:lang="fur">document RealMedia</comment>
+ <comment xml:lang="fr">document RealMedia</comment>
+ <comment xml:lang="fo">RealMedia skjal</comment>
+ <comment xml:lang="fi">RealMedia-asiakirja</comment>
+ <comment xml:lang="eu">RealMedia dokumentua</comment>
+ <comment xml:lang="es">documento RealMedia</comment>
+ <comment xml:lang="eo">RealMedia-dokumento</comment>
+ <comment xml:lang="en_GB">RealMedia document</comment>
+ <comment xml:lang="el">Έγγραφο RealMedia</comment>
+ <comment xml:lang="de">RealMedia-Dokument</comment>
+ <comment xml:lang="da">RealMedia-dokument</comment>
+ <comment xml:lang="cs">dokument RealMedia</comment>
+ <comment xml:lang="ca">document RealMedia</comment>
+ <comment xml:lang="bg">Документ — RealMedia</comment>
+ <comment xml:lang="be@latin">Dakument RealMedia</comment>
+ <comment xml:lang="be">дакумент RealMedia</comment>
+ <comment xml:lang="ast">Documentu RealMedia</comment>
+ <comment xml:lang="ar">مستند RealMedia</comment>
+ <comment xml:lang="af">RealMedia-dokument</comment>
<generic-icon name="video-x-generic"/>
- <magic priority="50">
+ <magic>
<match type="string" value=".RMF" offset="0"/>
</magic>
<glob pattern="*.rm"/>
@@ -25230,205 +26541,223 @@ command to generate the output files.
</mime-type>
<mime-type type="image/vnd.rn-realpix">
<comment>RealPix document</comment>
- <comment xml:lang="af">RealPix-dokument</comment>
- <comment xml:lang="ar">مستند RealPix</comment>
- <comment xml:lang="ast">Documentu RealPix</comment>
- <comment xml:lang="be-Latn">Dakument RealPix</comment>
- <comment xml:lang="bg">Документ — RealPix</comment>
- <comment xml:lang="ca">document RealPix</comment>
- <comment xml:lang="cs">dokument RealPix</comment>
- <comment xml:lang="da">RealPix-dokument</comment>
- <comment xml:lang="de">RealPix-Dokument</comment>
- <comment xml:lang="el">Έγγραφο RealPix</comment>
- <comment xml:lang="en-GB">RealPix document</comment>
- <comment xml:lang="eo">RealPix-dokumento</comment>
- <comment xml:lang="es">documento RealPix</comment>
- <comment xml:lang="eu">RealPix dokumentua</comment>
- <comment xml:lang="fi">RealPix-asiakirja</comment>
- <comment xml:lang="fo">RealPix skjal</comment>
- <comment xml:lang="fr">document RealPix</comment>
- <comment xml:lang="fur">document RealPix</comment>
- <comment xml:lang="ga">cáipéis RealPix</comment>
- <comment xml:lang="gl">documento RealPix</comment>
- <comment xml:lang="he">מסמך של RealPix</comment>
- <comment xml:lang="hr">RealPix dokument</comment>
- <comment xml:lang="hu">RealPix dokumentum</comment>
- <comment xml:lang="ia">Documento RealPix</comment>
- <comment xml:lang="id">Dokumen RealPix</comment>
- <comment xml:lang="it">Documento RealPix</comment>
- <comment xml:lang="ja">RealPix ドキュメント</comment>
- <comment xml:lang="kk">RealPix құжаты</comment>
- <comment xml:lang="ko">RealPix 문서</comment>
- <comment xml:lang="lt">RealPix dokumentas</comment>
- <comment xml:lang="lv">RealPix dokuments</comment>
- <comment xml:lang="nb">RealPix-dokument</comment>
- <comment xml:lang="nl">RealPix-document</comment>
- <comment xml:lang="nn">RealPix-dokument</comment>
- <comment xml:lang="oc">document RealPix</comment>
- <comment xml:lang="pl">Dokument RealPix</comment>
- <comment xml:lang="pt">documento RealPix</comment>
- <comment xml:lang="pt-BR">Documento RealPix</comment>
- <comment xml:lang="ro">Document RealPix</comment>
- <comment xml:lang="ru">Документ RealPix</comment>
- <comment xml:lang="sk">Dokument RealPix</comment>
- <comment xml:lang="sl">Dokument RealPix</comment>
- <comment xml:lang="sq">Dokument RealPix</comment>
- <comment xml:lang="sr">документ Рил Пикса</comment>
- <comment xml:lang="sv">RealPix-dokument</comment>
- <comment xml:lang="tr">RealPix belgesi</comment>
- <comment xml:lang="uk">документ RealPix</comment>
+ <comment xml:lang="zh_TW">RealPix 文件</comment>
+ <comment xml:lang="zh_CN">RealPix 文档</comment>
<comment xml:lang="vi">Tài liệu ảnh RealPix</comment>
- <comment xml:lang="zh-CN">RealPix 文档</comment>
- <comment xml:lang="zh-TW">RealPix 文件</comment>
+ <comment xml:lang="uk">документ RealPix</comment>
+ <comment xml:lang="tr">RealPix belgesi</comment>
+ <comment xml:lang="sv">RealPix-dokument</comment>
+ <comment xml:lang="sr">документ Рил Пикса</comment>
+ <comment xml:lang="sq">dokument RealPix</comment>
+ <comment xml:lang="sl">Dokument RealPix</comment>
+ <comment xml:lang="si">RealPix ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument RealPix</comment>
+ <comment xml:lang="ru">Документ RealPix</comment>
+ <comment xml:lang="ro">Document RealPix</comment>
+ <comment xml:lang="pt_BR">Documento RealPix</comment>
+ <comment xml:lang="pt">documento RealPix</comment>
+ <comment xml:lang="pl">Dokument RealPix</comment>
+ <comment xml:lang="oc">document RealPix</comment>
+ <comment xml:lang="nn">RealPix-dokument</comment>
+ <comment xml:lang="nl">RealPix-document</comment>
+ <comment xml:lang="nb">RealPix-dokument</comment>
+ <comment xml:lang="lv">RealPix dokuments</comment>
+ <comment xml:lang="lt">RealPix dokumentas</comment>
+ <comment xml:lang="ko">RealPix 문서</comment>
+ <comment xml:lang="kk">RealPix құжаты</comment>
+ <comment xml:lang="ja">RealPix ドキュメント</comment>
+ <comment xml:lang="it">Documento RealPix</comment>
+ <comment xml:lang="is">RealPix skjal</comment>
+ <comment xml:lang="id">Dokumen RealPix</comment>
+ <comment xml:lang="ia">Documento RealPix</comment>
+ <comment xml:lang="hu">RealPix dokumentum</comment>
+ <comment xml:lang="hr">RealPix dokument</comment>
+ <comment xml:lang="he">מסמך של RealPix</comment>
+ <comment xml:lang="gl">documento RealPix</comment>
+ <comment xml:lang="ga">cáipéis RealPix</comment>
+ <comment xml:lang="fur">document RealPix</comment>
+ <comment xml:lang="fr">document RealPix</comment>
+ <comment xml:lang="fo">RealPix skjal</comment>
+ <comment xml:lang="fi">RealPix-asiakirja</comment>
+ <comment xml:lang="eu">RealPix dokumentua</comment>
+ <comment xml:lang="es">documento RealPix</comment>
+ <comment xml:lang="eo">RealPix-dokumento</comment>
+ <comment xml:lang="en_GB">RealPix document</comment>
+ <comment xml:lang="el">Έγγραφο RealPix</comment>
+ <comment xml:lang="de">RealPix-Dokument</comment>
+ <comment xml:lang="da">RealPix-dokument</comment>
+ <comment xml:lang="cs">dokument RealPix</comment>
+ <comment xml:lang="ca">document RealPix</comment>
+ <comment xml:lang="bg">Документ — RealPix</comment>
+ <comment xml:lang="be@latin">Dakument RealPix</comment>
+ <comment xml:lang="be">дакумент RealPix</comment>
+ <comment xml:lang="ast">Documentu RealPix</comment>
+ <comment xml:lang="ar">مستند RealPix</comment>
+ <comment xml:lang="af">RealPix-dokument</comment>
<glob pattern="*.rp"/>
</mime-type>
<mime-type type="text/vnd.rn-realtext">
<comment>RealText document</comment>
- <comment xml:lang="af">RealText-dokument</comment>
- <comment xml:lang="ar">مستند RealText</comment>
- <comment xml:lang="ast">Documentu RealText</comment>
- <comment xml:lang="be-Latn">Dakument RealText</comment>
- <comment xml:lang="bg">Документ — RealText</comment>
- <comment xml:lang="ca">document RealText</comment>
- <comment xml:lang="cs">dokument RealText</comment>
- <comment xml:lang="da">RealText-dokument</comment>
- <comment xml:lang="de">RealText-Dokument</comment>
- <comment xml:lang="el">Έγγραφο RealText</comment>
- <comment xml:lang="en-GB">RealText document</comment>
- <comment xml:lang="eo">RealText-dokumento</comment>
- <comment xml:lang="es">documento RealText</comment>
- <comment xml:lang="eu">RealText dokumentua</comment>
- <comment xml:lang="fi">RealText-asiakirja</comment>
- <comment xml:lang="fo">RealText skjal</comment>
- <comment xml:lang="fr">document RealText</comment>
- <comment xml:lang="fur">document RealText</comment>
- <comment xml:lang="ga">cáipéis RealText</comment>
- <comment xml:lang="gl">documento RealText</comment>
- <comment xml:lang="he">מסמך של RealText</comment>
- <comment xml:lang="hr">RealText dokument</comment>
- <comment xml:lang="hu">RealText dokumentum</comment>
- <comment xml:lang="ia">Documento RealText</comment>
- <comment xml:lang="id">Dokumen RealText</comment>
- <comment xml:lang="it">Documento RealText</comment>
- <comment xml:lang="ja">RealText ドキュメント</comment>
- <comment xml:lang="kk">RealText құжаты</comment>
- <comment xml:lang="ko">RealText 문서</comment>
- <comment xml:lang="lt">RealText dokumentas</comment>
- <comment xml:lang="lv">RealText dokuments</comment>
- <comment xml:lang="nb">RealText-dokument</comment>
- <comment xml:lang="nl">RealText-document</comment>
- <comment xml:lang="nn">RealText-dokument</comment>
- <comment xml:lang="oc">document RealText</comment>
- <comment xml:lang="pl">Dokument RealText</comment>
- <comment xml:lang="pt">documento RealText</comment>
- <comment xml:lang="pt-BR">Documento RealText</comment>
- <comment xml:lang="ro">Document RealText</comment>
- <comment xml:lang="ru">Документ RealText</comment>
- <comment xml:lang="sk">Dokument RealText</comment>
- <comment xml:lang="sl">Dokument RealText</comment>
- <comment xml:lang="sq">Dokument RealText</comment>
- <comment xml:lang="sr">документ Рил Текста</comment>
- <comment xml:lang="sv">RealText-dokument</comment>
- <comment xml:lang="tr">RealText belgesi</comment>
- <comment xml:lang="uk">документ RealText</comment>
+ <comment xml:lang="zh_TW">RealText 文件</comment>
+ <comment xml:lang="zh_CN">RealText 文档</comment>
<comment xml:lang="vi">Tài liệu văn bản RealText</comment>
- <comment xml:lang="zh-CN">RealText 文档</comment>
- <comment xml:lang="zh-TW">RealText 文件</comment>
+ <comment xml:lang="uk">документ RealText</comment>
+ <comment xml:lang="tr">RealText belgesi</comment>
+ <comment xml:lang="sv">RealText-dokument</comment>
+ <comment xml:lang="sr">документ Рил Текста</comment>
+ <comment xml:lang="sq">dokument RealText</comment>
+ <comment xml:lang="sl">Dokument RealText</comment>
+ <comment xml:lang="si">RealText ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument RealText</comment>
+ <comment xml:lang="ru">Документ RealText</comment>
+ <comment xml:lang="ro">Document RealText</comment>
+ <comment xml:lang="pt_BR">Documento RealText</comment>
+ <comment xml:lang="pt">documento RealText</comment>
+ <comment xml:lang="pl">Dokument RealText</comment>
+ <comment xml:lang="oc">document RealText</comment>
+ <comment xml:lang="nn">RealText-dokument</comment>
+ <comment xml:lang="nl">RealText-document</comment>
+ <comment xml:lang="nb">RealText-dokument</comment>
+ <comment xml:lang="lv">RealText dokuments</comment>
+ <comment xml:lang="lt">RealText dokumentas</comment>
+ <comment xml:lang="ko">RealText 문서</comment>
+ <comment xml:lang="kk">RealText құжаты</comment>
+ <comment xml:lang="ja">RealText ドキュメント</comment>
+ <comment xml:lang="it">Documento RealText</comment>
+ <comment xml:lang="is">RealText skjal</comment>
+ <comment xml:lang="id">Dokumen RealText</comment>
+ <comment xml:lang="ia">Documento RealText</comment>
+ <comment xml:lang="hu">RealText dokumentum</comment>
+ <comment xml:lang="hr">RealText dokument</comment>
+ <comment xml:lang="he">מסמך של RealText</comment>
+ <comment xml:lang="gl">documento RealText</comment>
+ <comment xml:lang="ga">cáipéis RealText</comment>
+ <comment xml:lang="fur">document RealText</comment>
+ <comment xml:lang="fr">document RealText</comment>
+ <comment xml:lang="fo">RealText skjal</comment>
+ <comment xml:lang="fi">RealText-asiakirja</comment>
+ <comment xml:lang="eu">RealText dokumentua</comment>
+ <comment xml:lang="es">documento RealText</comment>
+ <comment xml:lang="eo">RealText-dokumento</comment>
+ <comment xml:lang="en_GB">RealText document</comment>
+ <comment xml:lang="el">Έγγραφο RealText</comment>
+ <comment xml:lang="de">RealText-Dokument</comment>
+ <comment xml:lang="da">RealText-dokument</comment>
+ <comment xml:lang="cs">dokument RealText</comment>
+ <comment xml:lang="ca">document RealText</comment>
+ <comment xml:lang="bg">Документ — RealText</comment>
+ <comment xml:lang="be@latin">Dakument RealText</comment>
+ <comment xml:lang="be">дакумент RealText</comment>
+ <comment xml:lang="ast">Documentu RealText</comment>
+ <comment xml:lang="ar">مستند RealText</comment>
+ <comment xml:lang="af">RealText-dokument</comment>
+ <sub-class-of type="text/plain"/>
<glob pattern="*.rt"/>
</mime-type>
<mime-type type="audio/x-riff">
<comment>RIFF audio</comment>
- <comment xml:lang="af">RIFF-oudio</comment>
- <comment xml:lang="ar">RIFF سمعي</comment>
- <comment xml:lang="az">RIFF audio faylı</comment>
- <comment xml:lang="be-Latn">Aŭdyjo RIFF</comment>
- <comment xml:lang="bg">Аудио — RIFF</comment>
- <comment xml:lang="ca">àudio RIFF</comment>
- <comment xml:lang="cs">zvuk RIFF</comment>
- <comment xml:lang="cy">Sain RIFF</comment>
- <comment xml:lang="da">RIFF-lyd</comment>
- <comment xml:lang="de">RIFF-Audio</comment>
- <comment xml:lang="el">Ήχος RIFF</comment>
- <comment xml:lang="en-GB">RIFF audio</comment>
- <comment xml:lang="eo">RIFF-sondosiero</comment>
- <comment xml:lang="es">audio RIFF</comment>
- <comment xml:lang="eu">RIFF audioa</comment>
- <comment xml:lang="fi">RIFF-ääni</comment>
- <comment xml:lang="fo">RIFF ljóð</comment>
- <comment xml:lang="fr">audio RIFF</comment>
- <comment xml:lang="fur">audio RIFF</comment>
- <comment xml:lang="ga">fuaim RIFF</comment>
- <comment xml:lang="gl">son RIFF</comment>
- <comment xml:lang="he">שמע RIFF</comment>
- <comment xml:lang="hr">RIFF zvučni zapis</comment>
- <comment xml:lang="hu">RIFF-kép</comment>
- <comment xml:lang="ia">Audio RIFF</comment>
- <comment xml:lang="id">Audio RIFF</comment>
- <comment xml:lang="it">Audio RIFF</comment>
- <comment xml:lang="ja">RIFF オーディオ</comment>
- <comment xml:lang="kk">RIFF аудиосы</comment>
- <comment xml:lang="ko">RIFF 오디오</comment>
- <comment xml:lang="lt">RIFF garso įrašas</comment>
- <comment xml:lang="lv">RIFF audio</comment>
- <comment xml:lang="ms">Audio RIFF</comment>
- <comment xml:lang="nb">RIFF-lyd</comment>
- <comment xml:lang="nl">RIFF-audio</comment>
- <comment xml:lang="nn">RIFF-lyd</comment>
- <comment xml:lang="oc">àudio RIFF</comment>
- <comment xml:lang="pl">Plik dźwiękowy RIFF</comment>
- <comment xml:lang="pt">áudio RIFF</comment>
- <comment xml:lang="pt-BR">Áudio RIFF</comment>
- <comment xml:lang="ro">Audio RIFF</comment>
- <comment xml:lang="ru">Аудио RIFF</comment>
- <comment xml:lang="sk">Zvuk RIFF</comment>
- <comment xml:lang="sl">Zvočna datoteka RIFF</comment>
- <comment xml:lang="sq">Audio RIFF</comment>
- <comment xml:lang="sr">РИФФ звук</comment>
- <comment xml:lang="sv">RIFF-ljud</comment>
- <comment xml:lang="tr">RIFF sesi</comment>
- <comment xml:lang="uk">звук RIFF</comment>
+ <comment xml:lang="zh_TW">RIFF 音訊</comment>
+ <comment xml:lang="zh_CN">RIFF 音频</comment>
<comment xml:lang="vi">Âm thanh RIFF</comment>
- <comment xml:lang="zh-CN">RIFF 音频</comment>
- <comment xml:lang="zh-TW">RIFF 音訊</comment>
+ <comment xml:lang="uk">звук RIFF</comment>
+ <comment xml:lang="tr">RIFF sesi</comment>
+ <comment xml:lang="sv">RIFF-ljud</comment>
+ <comment xml:lang="sr">РИФФ звук</comment>
+ <comment xml:lang="sq">audio RIFF</comment>
+ <comment xml:lang="sl">Zvočna datoteka RIFF</comment>
+ <comment xml:lang="si">RIFF ශ්‍රව්‍ය</comment>
+ <comment xml:lang="sk">Zvuk RIFF</comment>
+ <comment xml:lang="ru">Аудио RIFF</comment>
+ <comment xml:lang="ro">Audio RIFF</comment>
+ <comment xml:lang="pt_BR">Áudio RIFF</comment>
+ <comment xml:lang="pt">áudio RIFF</comment>
+ <comment xml:lang="pl">Plik dźwiękowy RIFF</comment>
+ <comment xml:lang="oc">àudio RIFF</comment>
+ <comment xml:lang="nn">RIFF-lyd</comment>
+ <comment xml:lang="nl">RIFF-audio</comment>
+ <comment xml:lang="nb">RIFF-lyd</comment>
+ <comment xml:lang="ms">Audio RIFF</comment>
+ <comment xml:lang="lv">RIFF audio</comment>
+ <comment xml:lang="lt">RIFF garso įrašas</comment>
+ <comment xml:lang="ko">RIFF 오디오</comment>
+ <comment xml:lang="kk">RIFF аудиосы</comment>
+ <comment xml:lang="ja">RIFF オーディオ</comment>
+ <comment xml:lang="it">Audio RIFF</comment>
+ <comment xml:lang="is">RIFF hljóðskrá</comment>
+ <comment xml:lang="id">Audio RIFF</comment>
+ <comment xml:lang="ia">Audio RIFF</comment>
+ <comment xml:lang="hu">RIFF-kép</comment>
+ <comment xml:lang="hr">RIFF zvučni zapis</comment>
+ <comment xml:lang="he">שמע RIFF</comment>
+ <comment xml:lang="gl">son RIFF</comment>
+ <comment xml:lang="ga">fuaim RIFF</comment>
+ <comment xml:lang="fur">audio RIFF</comment>
+ <comment xml:lang="fr">audio RIFF</comment>
+ <comment xml:lang="fo">RIFF ljóð</comment>
+ <comment xml:lang="fi">RIFF-ääni</comment>
+ <comment xml:lang="eu">RIFF audioa</comment>
+ <comment xml:lang="es">sonido RIFF</comment>
+ <comment xml:lang="eo">RIFF-sondosiero</comment>
+ <comment xml:lang="en_GB">RIFF audio</comment>
+ <comment xml:lang="el">Ήχος RIFF</comment>
+ <comment xml:lang="de">RIFF-Audio</comment>
+ <comment xml:lang="da">RIFF-lyd</comment>
+ <comment xml:lang="cy">Sain RIFF</comment>
+ <comment xml:lang="cs">zvuk RIFF</comment>
+ <comment xml:lang="ca">àudio RIFF</comment>
+ <comment xml:lang="bg">Аудио — RIFF</comment>
+ <comment xml:lang="be@latin">Aŭdyjo RIFF</comment>
+ <comment xml:lang="be">аўдыя RIFF</comment>
+ <comment xml:lang="az">RIFF audio faylı</comment>
+ <comment xml:lang="ar">صوت RIFF</comment>
+ <comment xml:lang="af">RIFF-oudio</comment>
</mime-type>
<mime-type type="application/x-riff">
<comment>RIFF container</comment>
- <comment xml:lang="af">RIFF-houer</comment>
- <comment xml:lang="bg">Контейнер — RIFF</comment>
- <comment xml:lang="ca">contenidor RIFF</comment>
- <comment xml:lang="cs">kontejner RIFF</comment>
- <comment xml:lang="da">RIFF-container</comment>
- <comment xml:lang="de">RIFF-Container</comment>
- <comment xml:lang="el">Περιέκτης RIFF</comment>
- <comment xml:lang="en-GB">RIFF container</comment>
- <comment xml:lang="es">contenedor RIFF</comment>
- <comment xml:lang="eu">RIFF edukitzailea</comment>
- <comment xml:lang="fi">RIFF-kontti</comment>
- <comment xml:lang="fr">conteneur RIFF</comment>
- <comment xml:lang="fur">contignidôr RIFF</comment>
- <comment xml:lang="ga">coimeádán RIFF</comment>
- <comment xml:lang="gl">Contenedor RIFF</comment>
- <comment xml:lang="he">מכולת RIFF</comment>
- <comment xml:lang="hr">RIFF spremnik</comment>
- <comment xml:lang="hu">RIFF konténer</comment>
- <comment xml:lang="ia">Receptaculo RIFF</comment>
- <comment xml:lang="id">Wadah RIFF</comment>
- <comment xml:lang="it">Container RIFF</comment>
- <comment xml:lang="kk">RIFF контейнері</comment>
- <comment xml:lang="ko">RIFF 컨테이너</comment>
- <comment xml:lang="oc">contenidor RIFF</comment>
- <comment xml:lang="pl">Kontener RIFF</comment>
- <comment xml:lang="pt">contentor RIFF</comment>
- <comment xml:lang="pt-BR">Contêiner RIFF</comment>
- <comment xml:lang="ru">Контейнер RIFF</comment>
- <comment xml:lang="sk">Kontajner RIFF</comment>
- <comment xml:lang="sl">Vsebnik RIFF</comment>
- <comment xml:lang="sr">РИФФ садржалац</comment>
- <comment xml:lang="sv">RIFF-behållare</comment>
- <comment xml:lang="tr">RIFF deposu</comment>
+ <comment xml:lang="zh_TW">RIFF 容器</comment>
+ <comment xml:lang="zh_CN">RIFF 容器</comment>
<comment xml:lang="uk">контейнер RIFF</comment>
- <comment xml:lang="zh-CN">RIFF 容器</comment>
- <comment xml:lang="zh-TW">RIFF 容器</comment>
+ <comment xml:lang="tr">RIFF deposu</comment>
+ <comment xml:lang="sv">RIFF-behållare</comment>
+ <comment xml:lang="sr">РИФФ садржалац</comment>
+ <comment xml:lang="sq">kontejner RIFF</comment>
+ <comment xml:lang="sl">Vsebnik RIFF</comment>
+ <comment xml:lang="si">RIFF කන්ටේනරය</comment>
+ <comment xml:lang="sk">Kontajner RIFF</comment>
+ <comment xml:lang="ru">Контейнер RIFF</comment>
+ <comment xml:lang="pt_BR">Contêiner RIFF</comment>
+ <comment xml:lang="pt">contentor RIFF</comment>
+ <comment xml:lang="pl">Kontener RIFF</comment>
+ <comment xml:lang="oc">contenidor RIFF</comment>
+ <comment xml:lang="nl">RIFF-container</comment>
+ <comment xml:lang="lt">RIFF konteineris</comment>
+ <comment xml:lang="ko">RIFF 컨테이너</comment>
+ <comment xml:lang="kk">RIFF контейнері</comment>
+ <comment xml:lang="ja">RIFF コンテナ</comment>
+ <comment xml:lang="it">Container RIFF</comment>
+ <comment xml:lang="is">RIFF gagnagámur</comment>
+ <comment xml:lang="id">Wadah RIFF</comment>
+ <comment xml:lang="ia">Receptaculo RIFF</comment>
+ <comment xml:lang="hu">RIFF konténer</comment>
+ <comment xml:lang="hr">RIFF spremnik</comment>
+ <comment xml:lang="he">מכולת RIFF</comment>
+ <comment xml:lang="gl">Contenedor RIFF</comment>
+ <comment xml:lang="ga">coimeádán RIFF</comment>
+ <comment xml:lang="fur">contignidôr RIFF</comment>
+ <comment xml:lang="fr">conteneur RIFF</comment>
+ <comment xml:lang="fi">RIFF-kontti</comment>
+ <comment xml:lang="eu">RIFF edukitzailea</comment>
+ <comment xml:lang="es">contenedor RIFF</comment>
+ <comment xml:lang="en_GB">RIFF container</comment>
+ <comment xml:lang="el">Περιέκτης RIFF</comment>
+ <comment xml:lang="de">RIFF-Container</comment>
+ <comment xml:lang="da">RIFF-container</comment>
+ <comment xml:lang="cs">kontejner RIFF</comment>
+ <comment xml:lang="ca">contenidor RIFF</comment>
+ <comment xml:lang="bg">Контейнер — RIFF</comment>
+ <comment xml:lang="be">кантэйнер RIFF</comment>
+ <comment xml:lang="ar">حاوية RIFF</comment>
+ <comment xml:lang="af">RIFF-houer</comment>
<!-- need to be lower prio than avi -->
<magic priority="45">
<match type="string" value="RIFF" offset="0"/>
@@ -25436,116 +26765,123 @@ command to generate the output files.
</mime-type>
<mime-type type="audio/x-s3m">
<comment>Scream Tracker 3 audio</comment>
- <comment xml:lang="ar">Scream Tracker 3 سمعي</comment>
- <comment xml:lang="az">Scream Tracker 3 audio faylı</comment>
- <comment xml:lang="be-Latn">Aŭdyjo Scream Tracker 3</comment>
- <comment xml:lang="bg">Аудио — Scream Tracker 3</comment>
- <comment xml:lang="ca">àudio de Scream Tracker 3</comment>
- <comment xml:lang="cs">skladba Scream Tracker 3</comment>
- <comment xml:lang="cy">Sain Scream Tracker 3</comment>
- <comment xml:lang="da">Scream Tracker 3-lyd</comment>
- <comment xml:lang="de">Scream-Tracker-3-Audio</comment>
- <comment xml:lang="el">Ήχος Scream Tracker 3</comment>
- <comment xml:lang="en-GB">Scream Tracker 3 audio</comment>
- <comment xml:lang="eo">Sondosiero de Scream Tracker 3</comment>
- <comment xml:lang="es">audio Scream Tracker 3</comment>
- <comment xml:lang="eu">Scream Tracker 3 audioa</comment>
- <comment xml:lang="fi">Scream Tracker 3 -ääni</comment>
- <comment xml:lang="fo">Scream Tracker 3 ljóður</comment>
- <comment xml:lang="fr">audio Scream Tracker 3</comment>
- <comment xml:lang="fur">audio Scream Tracker 3</comment>
- <comment xml:lang="ga">fuaim Scream Tracker 3</comment>
- <comment xml:lang="gl">son Scream Tracker 3</comment>
- <comment xml:lang="he">שמע של Scream Tracker 3</comment>
- <comment xml:lang="hr">Scream Tracker 3 zvučni zapis</comment>
- <comment xml:lang="hu">Scream Tracker 3 hang</comment>
- <comment xml:lang="ia">Audio Scream Tracker 3</comment>
- <comment xml:lang="id">Audio Scream Tracker 3</comment>
- <comment xml:lang="it">Audio Scream Tracker 3</comment>
- <comment xml:lang="ja">Scream Tracker 3 オーディオ</comment>
- <comment xml:lang="kk">Scream Tracker 3 аудиосы</comment>
- <comment xml:lang="ko">Scream Tracker 3 오디오</comment>
- <comment xml:lang="lt">Scream Tracker 3 garso įrašas</comment>
- <comment xml:lang="lv">Scream Tracker 3 audio</comment>
- <comment xml:lang="ms">Audio Scream Tracker 3</comment>
- <comment xml:lang="nb">Scream Tracker 3-lyd</comment>
- <comment xml:lang="nl">Scream Tracker 3-audio</comment>
- <comment xml:lang="nn">Sream Tracker 3 lyd</comment>
- <comment xml:lang="oc">àudio Scream Tracker 3</comment>
- <comment xml:lang="pl">Plik dźwiękowy Scream Tracker 3</comment>
- <comment xml:lang="pt">áudio Scream Tracker 3</comment>
- <comment xml:lang="pt-BR">Áudio Scream Tracker 3</comment>
- <comment xml:lang="ro">Audio Scream Tracker 3</comment>
- <comment xml:lang="ru">Аудио Scream Tracker 3</comment>
- <comment xml:lang="sk">Skladba Scream Tracker 3</comment>
- <comment xml:lang="sl">Zvočna datoteka Scream Tracker 3</comment>
- <comment xml:lang="sq">Audio Scream Tracker 3</comment>
- <comment xml:lang="sr">звук Скрим Тракера 3</comment>
- <comment xml:lang="sv">Scream Tracker 3-ljud</comment>
- <comment xml:lang="tr">Scream Tracker 3 sesi</comment>
- <comment xml:lang="uk">звук Scream Tracker 3</comment>
+ <comment xml:lang="zh_TW">Scream Tracker 3 音訊</comment>
+ <comment xml:lang="zh_CN">Scheme Tracker 3 音频</comment>
<comment xml:lang="vi">Âm thanh Scream Tracker 3</comment>
- <comment xml:lang="zh-CN">Scheme Tracker 3 音频</comment>
- <comment xml:lang="zh-TW">Scream Tracker 3 音訊</comment>
- <magic priority="50">
+ <comment xml:lang="uk">звук Scream Tracker 3</comment>
+ <comment xml:lang="tr">Scream Tracker 3 sesi</comment>
+ <comment xml:lang="sv">Scream Tracker 3-ljud</comment>
+ <comment xml:lang="sr">звук Скрим Тракера 3</comment>
+ <comment xml:lang="sq">audio Scream Tracker 3</comment>
+ <comment xml:lang="sl">Zvočna datoteka Scream Tracker 3</comment>
+ <comment xml:lang="si">Scream Tracker 3 ශ්‍රව්‍ය</comment>
+ <comment xml:lang="sk">Skladba Scream Tracker 3</comment>
+ <comment xml:lang="ru">Аудио Scream Tracker 3</comment>
+ <comment xml:lang="ro">Audio Scream Tracker 3</comment>
+ <comment xml:lang="pt_BR">Áudio Scream Tracker 3</comment>
+ <comment xml:lang="pt">áudio Scream Tracker 3</comment>
+ <comment xml:lang="pl">Plik dźwiękowy Scream Tracker 3</comment>
+ <comment xml:lang="oc">àudio Scream Tracker 3</comment>
+ <comment xml:lang="nn">Sream Tracker 3 lyd</comment>
+ <comment xml:lang="nl">Scream Tracker 3-audio</comment>
+ <comment xml:lang="nb">Scream Tracker 3-lyd</comment>
+ <comment xml:lang="ms">Audio Scream Tracker 3</comment>
+ <comment xml:lang="lv">Scream Tracker 3 audio</comment>
+ <comment xml:lang="lt">Scream Tracker 3 garso įrašas</comment>
+ <comment xml:lang="ko">Scream Tracker 3 오디오</comment>
+ <comment xml:lang="kk">Scream Tracker 3 аудиосы</comment>
+ <comment xml:lang="ja">Scream Tracker 3 オーディオ</comment>
+ <comment xml:lang="it">Audio Scream Tracker 3</comment>
+ <comment xml:lang="is">Scream Tracker 3 hljóðskrá</comment>
+ <comment xml:lang="id">Audio Scream Tracker 3</comment>
+ <comment xml:lang="ia">Audio Scream Tracker 3</comment>
+ <comment xml:lang="hu">Scream Tracker 3 hang</comment>
+ <comment xml:lang="hr">Scream Tracker 3 zvučni zapis</comment>
+ <comment xml:lang="he">שמע של Scream Tracker 3</comment>
+ <comment xml:lang="gl">son Scream Tracker 3</comment>
+ <comment xml:lang="ga">fuaim Scream Tracker 3</comment>
+ <comment xml:lang="fur">audio Scream Tracker 3</comment>
+ <comment xml:lang="fr">audio Scream Tracker 3</comment>
+ <comment xml:lang="fo">Scream Tracker 3 ljóður</comment>
+ <comment xml:lang="fi">Scream Tracker 3 -ääni</comment>
+ <comment xml:lang="eu">Scream Tracker 3 audioa</comment>
+ <comment xml:lang="es">sonido Scream Tracker 3</comment>
+ <comment xml:lang="eo">Sondosiero de Scream Tracker 3</comment>
+ <comment xml:lang="en_GB">Scream Tracker 3 audio</comment>
+ <comment xml:lang="el">Ήχος Scream Tracker 3</comment>
+ <comment xml:lang="de">Scream-Tracker-3-Audio</comment>
+ <comment xml:lang="da">Scream Tracker 3-lyd</comment>
+ <comment xml:lang="cy">Sain Scream Tracker 3</comment>
+ <comment xml:lang="cs">skladba Scream Tracker 3</comment>
+ <comment xml:lang="ca">àudio de Scream Tracker 3</comment>
+ <comment xml:lang="bg">Аудио — Scream Tracker 3</comment>
+ <comment xml:lang="be@latin">Aŭdyjo Scream Tracker 3</comment>
+ <comment xml:lang="be">аўдыя Scream Tracker 3</comment>
+ <comment xml:lang="az">Scream Tracker 3 audio faylı</comment>
+ <comment xml:lang="ar">صوت Scream Tracker 3</comment>
+ <magic>
<match value="SCRM" type="string" offset="44"/>
</magic>
<glob pattern="*.s3m"/>
</mime-type>
<mime-type type="audio/x-scpls">
<comment>MP3 ShoutCast playlist</comment>
- <comment xml:lang="ar">قائمة تشغيل MP3 ShoutCast</comment>
- <comment xml:lang="be-Latn">Śpis piesień dla tranślacyi MP3</comment>
- <comment xml:lang="bg">Списък за изпълнение — MP3 ShoutCast</comment>
- <comment xml:lang="ca">llista de reproducció MP3 ShoutCast</comment>
- <comment xml:lang="cs">seznam k přehrání MP3 ShoutCast</comment>
- <comment xml:lang="da">MP3 ShoutCast-afspilningsliste</comment>
- <comment xml:lang="de">MP3-ShoutCast-Wiedergabeliste</comment>
- <comment xml:lang="el">Λίστα αναπαραγωγής MP3 ShoutCast</comment>
- <comment xml:lang="en-GB">MP3 ShoutCast playlist</comment>
- <comment xml:lang="eo">MP3-ludlisto de ShoutCast</comment>
- <comment xml:lang="es">lista de reproducción MP3 ShoutCast</comment>
- <comment xml:lang="eu">MP3 ShoutCast erreprodukzio-zerrenda</comment>
- <comment xml:lang="fi">MP3 ShoutCast -soittolista</comment>
- <comment xml:lang="fo">MP3 ShoutCast avspælingarlisti</comment>
- <comment xml:lang="fr">liste de lecture MP3 ShoutCast</comment>
- <comment xml:lang="fur">liste di riproduzion MP3 ShoutCast</comment>
- <comment xml:lang="ga">seinmliosta MP3 ShoutCast</comment>
- <comment xml:lang="gl">lista de reprodución MP3 de ShoutCast</comment>
- <comment xml:lang="he">רשימת השמעה MP3 של ShoutCast</comment>
- <comment xml:lang="hr">MP3 ShoutCast popis izvođenja</comment>
- <comment xml:lang="hu">MP3 ShoutCast-lejátszólista</comment>
- <comment xml:lang="ia">Lista de selection MP3 ShoutCast</comment>
- <comment xml:lang="id">Senarai putar MP3 ShoutCast</comment>
- <comment xml:lang="it">Playlist MP3 ShoutCast</comment>
- <comment xml:lang="ja">MP3 ShoutCast 再生リスト</comment>
- <comment xml:lang="kk">MP3 ShoutCast ойнау тізімі</comment>
- <comment xml:lang="ko">MP3 ShoutCast 재생 목록</comment>
- <comment xml:lang="lt">MP3 ShoutCast grojaraštis</comment>
- <comment xml:lang="lv">MP3 ShoutCast repertuārs</comment>
- <comment xml:lang="ms">Senaraimain ShoutCast MP3</comment>
- <comment xml:lang="nb">MP3 ShoutCast-spilleliste</comment>
- <comment xml:lang="nl">MP3 ShoutCast-afspeellijst</comment>
- <comment xml:lang="nn">MP3 ShoutCast-speleliste</comment>
- <comment xml:lang="oc">lista de lectura MP3 ShoutCast</comment>
- <comment xml:lang="pl">Lista odtwarzania MP3 ShoutCast</comment>
- <comment xml:lang="pt">lista de reprodução MP3 ShoutCast</comment>
- <comment xml:lang="pt-BR">Lista de reprodução MP3 ShoutCast</comment>
- <comment xml:lang="ro">Listă MP3 ShoutCast</comment>
- <comment xml:lang="ru">Список воспроизведения MP3 ShoutCast</comment>
- <comment xml:lang="sk">Zoznam skladieb MP3 ShoutCast</comment>
- <comment xml:lang="sl">Seznam predvajanja MP3 ShoutCast</comment>
- <comment xml:lang="sq">Listë titujsh MP3 ShoutCast</comment>
- <comment xml:lang="sr">списак МП3 песама Шаут Каста</comment>
- <comment xml:lang="sv">MP3 ShoutCast-spellista</comment>
- <comment xml:lang="tr">MP3 ShoutCast çalma listesi</comment>
- <comment xml:lang="uk">список програвання MP3 ShoutCast</comment>
+ <comment xml:lang="zh_TW">MP3 ShoutCast 播放清單</comment>
+ <comment xml:lang="zh_CN">MP3 ShoutCast 播放列表</comment>
<comment xml:lang="vi">Danh mục nhạc MP3 ShoutCast</comment>
- <comment xml:lang="zh-CN">MP3 ShoutCast 播放列表</comment>
- <comment xml:lang="zh-TW">MP3 ShoutCast 播放清單</comment>
+ <comment xml:lang="uk">список програвання MP3 ShoutCast</comment>
+ <comment xml:lang="tr">MP3 ShoutCast çalma listesi</comment>
+ <comment xml:lang="sv">MP3 ShoutCast-spellista</comment>
+ <comment xml:lang="sr">списак МП3 песама Шаут Каста</comment>
+ <comment xml:lang="sq">luajlistë MP3 ShoutCast</comment>
+ <comment xml:lang="sl">Seznam predvajanja MP3 ShoutCast</comment>
+ <comment xml:lang="si">MP3 ShoutCast ධාවන ලැයිස්තුව</comment>
+ <comment xml:lang="sk">Zoznam skladieb MP3 ShoutCast</comment>
+ <comment xml:lang="ru">Список воспроизведения MP3 ShoutCast</comment>
+ <comment xml:lang="ro">Listă MP3 ShoutCast</comment>
+ <comment xml:lang="pt_BR">Lista de reprodução MP3 ShoutCast</comment>
+ <comment xml:lang="pt">lista de reprodução MP3 ShoutCast</comment>
+ <comment xml:lang="pl">Lista odtwarzania MP3 ShoutCast</comment>
+ <comment xml:lang="oc">lista de lectura MP3 ShoutCast</comment>
+ <comment xml:lang="nn">MP3 ShoutCast-speleliste</comment>
+ <comment xml:lang="nl">MP3 ShoutCast-afspeellijst</comment>
+ <comment xml:lang="nb">MP3 ShoutCast-spilleliste</comment>
+ <comment xml:lang="ms">Senaraimain ShoutCast MP3</comment>
+ <comment xml:lang="lv">MP3 ShoutCast repertuārs</comment>
+ <comment xml:lang="lt">MP3 ShoutCast grojaraštis</comment>
+ <comment xml:lang="ko">MP3 ShoutCast 재생 목록</comment>
+ <comment xml:lang="kk">MP3 ShoutCast ойнау тізімі</comment>
+ <comment xml:lang="ka">MP3 ShoutCast დასაკრავი სია</comment>
+ <comment xml:lang="ja">MP3 ShoutCast プレイリスト</comment>
+ <comment xml:lang="it">Playlist MP3 ShoutCast</comment>
+ <comment xml:lang="is">MP3 ShoutCast spilunarlisti</comment>
+ <comment xml:lang="id">Senarai putar MP3 ShoutCast</comment>
+ <comment xml:lang="ia">Lista de selection MP3 ShoutCast</comment>
+ <comment xml:lang="hu">MP3 ShoutCast-lejátszólista</comment>
+ <comment xml:lang="hr">MP3 ShoutCast popis izvođenja</comment>
+ <comment xml:lang="he">רשימת השמעה MP3 של ShoutCast</comment>
+ <comment xml:lang="gl">lista de reprodución MP3 de ShoutCast</comment>
+ <comment xml:lang="ga">seinmliosta MP3 ShoutCast</comment>
+ <comment xml:lang="fur">liste di riproduzion MP3 ShoutCast</comment>
+ <comment xml:lang="fr">liste de lecture MP3 ShoutCast</comment>
+ <comment xml:lang="fo">MP3 ShoutCast avspælingarlisti</comment>
+ <comment xml:lang="fi">MP3 ShoutCast -soittolista</comment>
+ <comment xml:lang="eu">MP3 ShoutCast erreprodukzio-zerrenda</comment>
+ <comment xml:lang="es">lista de reproducción MP3 ShoutCast</comment>
+ <comment xml:lang="eo">MP3-ludlisto de ShoutCast</comment>
+ <comment xml:lang="en_GB">MP3 ShoutCast playlist</comment>
+ <comment xml:lang="el">Λίστα αναπαραγωγής MP3 ShoutCast</comment>
+ <comment xml:lang="de">MP3-ShoutCast-Wiedergabeliste</comment>
+ <comment xml:lang="da">MP3 ShoutCast-afspilningsliste</comment>
+ <comment xml:lang="cs">seznam k přehrání MP3 ShoutCast</comment>
+ <comment xml:lang="ca">llista de reproducció MP3 ShoutCast</comment>
+ <comment xml:lang="bg">Списък за изпълнение — MP3 ShoutCast</comment>
+ <comment xml:lang="be@latin">Śpis piesień dla tranślacyi MP3</comment>
+ <comment xml:lang="be">плэй-ліст MP3 ShoutCast</comment>
+ <comment xml:lang="ar">قائمة تشغيل MP3 ShoutCast</comment>
<alias type="application/pls"/>
<alias type="audio/scpls"/>
- <magic priority="50">
+ <magic>
<match type="string" value="[playlist]" offset="0"/>
<match type="string" value="[Playlist]" offset="0"/>
<match type="string" value="[PLAYLIST]" offset="0"/>
@@ -25554,57 +26890,60 @@ command to generate the output files.
</mime-type>
<mime-type type="audio/x-stm">
<comment>Scream Tracker audio</comment>
- <comment xml:lang="ar">Scream Tracker سمعي</comment>
- <comment xml:lang="az">Scream Tracker audio faylı</comment>
- <comment xml:lang="be-Latn">Aŭdyjo Scream Tracker</comment>
- <comment xml:lang="bg">Аудио — Scream Tracker</comment>
- <comment xml:lang="ca">àudio de Scream Tracker</comment>
- <comment xml:lang="cs">skladba Scream Tracker</comment>
- <comment xml:lang="cy">Sain Scream Tracker</comment>
- <comment xml:lang="da">Scream Tracker-lyd</comment>
- <comment xml:lang="de">Scream-Tracker-Audio</comment>
- <comment xml:lang="el">Ήχος Scream Tracker</comment>
- <comment xml:lang="en-GB">Scream Tracker audio</comment>
- <comment xml:lang="eo">Sondosiero de Scream Tracker</comment>
- <comment xml:lang="es">audio Scream Tracker</comment>
- <comment xml:lang="eu">Scream Tracker audioa</comment>
- <comment xml:lang="fi">Scream Tracker -ääni</comment>
- <comment xml:lang="fo">Scream Tracker ljóður</comment>
- <comment xml:lang="fr">audio Scream Tracker</comment>
- <comment xml:lang="fur">audio Scream Tracker</comment>
- <comment xml:lang="ga">fuaim Scream Tracker</comment>
- <comment xml:lang="gl">son Scream Tracker</comment>
- <comment xml:lang="he">שמע של Scream Tracker</comment>
- <comment xml:lang="hr">Scream Tracker zvučni zapis</comment>
- <comment xml:lang="hu">Scream Tracker hang</comment>
- <comment xml:lang="ia">Audio Scream Tracker</comment>
- <comment xml:lang="id">Audio Scream Tracker</comment>
- <comment xml:lang="it">Audio Scream Tracker</comment>
- <comment xml:lang="ja">Scream Tracker オーディオ</comment>
- <comment xml:lang="kk">Scream Tracker аудиосы</comment>
- <comment xml:lang="ko">Scream Tracker 오디오</comment>
- <comment xml:lang="lt">Scream Tracker garso įrašas</comment>
- <comment xml:lang="lv">Scream Tracker audio</comment>
- <comment xml:lang="ms">Audio Scream Tracker</comment>
- <comment xml:lang="nb">Scream Tracker-lyd</comment>
- <comment xml:lang="nl">Scream Tracker-audio</comment>
- <comment xml:lang="nn">Scream Tracker lyd</comment>
- <comment xml:lang="oc">àudio Scream Tracker</comment>
- <comment xml:lang="pl">Plik dźwiękowy Scream Tracker</comment>
- <comment xml:lang="pt">áudio Scream Tracker</comment>
- <comment xml:lang="pt-BR">Áudio Scream Tracker</comment>
- <comment xml:lang="ro">Audio Scream Tracker</comment>
- <comment xml:lang="ru">Аудио Scream Tracker</comment>
- <comment xml:lang="sk">Skladba Scream Tracker</comment>
- <comment xml:lang="sl">Zvočna datoteka Scream Tracker</comment>
- <comment xml:lang="sq">Audio Scream Tracker</comment>
- <comment xml:lang="sr">звук Скрим Тракера</comment>
- <comment xml:lang="sv">Scream Tracker-ljud</comment>
- <comment xml:lang="tr">Scream Tracker sesi</comment>
- <comment xml:lang="uk">звук Scream Tracker</comment>
+ <comment xml:lang="zh_TW">Scream Tracker 音訊</comment>
+ <comment xml:lang="zh_CN">Scream Tracker 音频</comment>
<comment xml:lang="vi">Âm thanh Scream Tracker</comment>
- <comment xml:lang="zh-CN">Scream Tracker 音频</comment>
- <comment xml:lang="zh-TW">Scream Tracker 音訊</comment>
+ <comment xml:lang="uk">звук Scream Tracker</comment>
+ <comment xml:lang="tr">Scream Tracker sesi</comment>
+ <comment xml:lang="sv">Scream Tracker-ljud</comment>
+ <comment xml:lang="sr">звук Скрим Тракера</comment>
+ <comment xml:lang="sq">audio Scream Tracker</comment>
+ <comment xml:lang="sl">Zvočna datoteka Scream Tracker</comment>
+ <comment xml:lang="si">Scream Tracker ශ්‍රව්‍ය</comment>
+ <comment xml:lang="sk">Skladba Scream Tracker</comment>
+ <comment xml:lang="ru">Аудио Scream Tracker</comment>
+ <comment xml:lang="ro">Audio Scream Tracker</comment>
+ <comment xml:lang="pt_BR">Áudio Scream Tracker</comment>
+ <comment xml:lang="pt">áudio Scream Tracker</comment>
+ <comment xml:lang="pl">Plik dźwiękowy Scream Tracker</comment>
+ <comment xml:lang="oc">àudio Scream Tracker</comment>
+ <comment xml:lang="nn">Scream Tracker lyd</comment>
+ <comment xml:lang="nl">Scream Tracker-audio</comment>
+ <comment xml:lang="nb">Scream Tracker-lyd</comment>
+ <comment xml:lang="ms">Audio Scream Tracker</comment>
+ <comment xml:lang="lv">Scream Tracker audio</comment>
+ <comment xml:lang="lt">Scream Tracker garso įrašas</comment>
+ <comment xml:lang="ko">Scream Tracker 오디오</comment>
+ <comment xml:lang="kk">Scream Tracker аудиосы</comment>
+ <comment xml:lang="ja">Scream Tracker オーディオ</comment>
+ <comment xml:lang="it">Audio Scream Tracker</comment>
+ <comment xml:lang="is">Scream Tracker hljóðskrá</comment>
+ <comment xml:lang="id">Audio Scream Tracker</comment>
+ <comment xml:lang="ia">Audio Scream Tracker</comment>
+ <comment xml:lang="hu">Scream Tracker hang</comment>
+ <comment xml:lang="hr">Scream Tracker zvučni zapis</comment>
+ <comment xml:lang="he">שמע של Scream Tracker</comment>
+ <comment xml:lang="gl">son Scream Tracker</comment>
+ <comment xml:lang="ga">fuaim Scream Tracker</comment>
+ <comment xml:lang="fur">audio Scream Tracker</comment>
+ <comment xml:lang="fr">audio Scream Tracker</comment>
+ <comment xml:lang="fo">Scream Tracker ljóður</comment>
+ <comment xml:lang="fi">Scream Tracker -ääni</comment>
+ <comment xml:lang="eu">Scream Tracker audioa</comment>
+ <comment xml:lang="es">sonido Scream Tracker</comment>
+ <comment xml:lang="eo">Sondosiero de Scream Tracker</comment>
+ <comment xml:lang="en_GB">Scream Tracker audio</comment>
+ <comment xml:lang="el">Ήχος Scream Tracker</comment>
+ <comment xml:lang="de">Scream-Tracker-Audio</comment>
+ <comment xml:lang="da">Scream Tracker-lyd</comment>
+ <comment xml:lang="cy">Sain Scream Tracker</comment>
+ <comment xml:lang="cs">skladba Scream Tracker</comment>
+ <comment xml:lang="ca">àudio de Scream Tracker</comment>
+ <comment xml:lang="bg">Аудио — Scream Tracker</comment>
+ <comment xml:lang="be@latin">Aŭdyjo Scream Tracker</comment>
+ <comment xml:lang="be">аўдыя Scream Tracker</comment>
+ <comment xml:lang="az">Scream Tracker audio faylı</comment>
+ <comment xml:lang="ar">صوت Scream Tracker</comment>
<magic>
<match type="string" value="!Scream!\x1A" offset="20"/>
<match type="string" value="!SCREAM!\x1A" offset="20"/>
@@ -25614,351 +26953,325 @@ command to generate the output files.
</mime-type>
<mime-type type="audio/x-voc">
<comment>VOC audio</comment>
- <comment xml:lang="af">VOC-oudio</comment>
- <comment xml:lang="ar">VOC سمعي</comment>
- <comment xml:lang="az">VOC audio faylı</comment>
- <comment xml:lang="be-Latn">Aŭdyjo VOC</comment>
- <comment xml:lang="bg">Аудио — VOC</comment>
- <comment xml:lang="ca">àudio VOC</comment>
- <comment xml:lang="cs">zvuk VOC</comment>
- <comment xml:lang="cy">Sain VOC</comment>
- <comment xml:lang="da">VOC-lyd</comment>
- <comment xml:lang="de">VOC-Audio</comment>
- <comment xml:lang="el">Ήχος VOC</comment>
- <comment xml:lang="en-GB">VOC audio</comment>
- <comment xml:lang="eo">VOC-sondosiero</comment>
- <comment xml:lang="es">audio VOC</comment>
- <comment xml:lang="eu">VOC audioa</comment>
- <comment xml:lang="fi">VOC-ääni</comment>
- <comment xml:lang="fo">VOC ljóður</comment>
- <comment xml:lang="fr">audio VOC</comment>
- <comment xml:lang="fur">audio VOC</comment>
- <comment xml:lang="ga">fuaim VOC</comment>
- <comment xml:lang="gl">son VOC</comment>
- <comment xml:lang="he">שמע VOC</comment>
- <comment xml:lang="hr">VOC zvučni zapis</comment>
- <comment xml:lang="hu">VOC hang</comment>
- <comment xml:lang="ia">Audio VOC</comment>
- <comment xml:lang="id">Audio VOC</comment>
- <comment xml:lang="it">Audio VOC</comment>
- <comment xml:lang="ja">VOC オーディオ</comment>
- <comment xml:lang="kk">VOC аудиосы</comment>
- <comment xml:lang="ko">VOC 오디오</comment>
- <comment xml:lang="lt">VOC garso įrašas</comment>
- <comment xml:lang="lv">VOC audio</comment>
- <comment xml:lang="ms">Audio VOC</comment>
- <comment xml:lang="nb">VOC-lyd</comment>
- <comment xml:lang="nl">VOC-audio</comment>
- <comment xml:lang="nn">VOC-lyd</comment>
- <comment xml:lang="oc">àudio VOC</comment>
- <comment xml:lang="pl">Plik dźwiękowy VOC</comment>
- <comment xml:lang="pt">áudio VOC</comment>
- <comment xml:lang="pt-BR">Áudio VOC</comment>
- <comment xml:lang="ro">Audio VOC</comment>
- <comment xml:lang="ru">Аудио VOC</comment>
- <comment xml:lang="sk">Zvuk VOC</comment>
- <comment xml:lang="sl">Zvočna datoteka VOC</comment>
- <comment xml:lang="sq">Audio VOC</comment>
- <comment xml:lang="sr">ВОЦ звук</comment>
- <comment xml:lang="sv">VOC-ljud</comment>
- <comment xml:lang="tr">VOC sesi</comment>
- <comment xml:lang="uk">звук VOC</comment>
+ <comment xml:lang="zh_TW">VOC 音訊</comment>
+ <comment xml:lang="zh_CN">VOC 音频</comment>
<comment xml:lang="vi">Âm thanh VOC</comment>
- <comment xml:lang="zh-CN">VOC 音频</comment>
- <comment xml:lang="zh-TW">VOC 音訊</comment>
+ <comment xml:lang="uk">звук VOC</comment>
+ <comment xml:lang="tr">VOC sesi</comment>
+ <comment xml:lang="sv">VOC-ljud</comment>
+ <comment xml:lang="sr">ВОЦ звук</comment>
+ <comment xml:lang="sq">audio VOC</comment>
+ <comment xml:lang="sl">Zvočna datoteka VOC</comment>
+ <comment xml:lang="si">VOC ශ්‍රව්‍ය</comment>
+ <comment xml:lang="sk">Zvuk VOC</comment>
+ <comment xml:lang="ru">Аудио VOC</comment>
+ <comment xml:lang="ro">Audio VOC</comment>
+ <comment xml:lang="pt_BR">Áudio VOC</comment>
+ <comment xml:lang="pt">áudio VOC</comment>
+ <comment xml:lang="pl">Plik dźwiękowy VOC</comment>
+ <comment xml:lang="oc">àudio VOC</comment>
+ <comment xml:lang="nn">VOC-lyd</comment>
+ <comment xml:lang="nl">VOC-audio</comment>
+ <comment xml:lang="nb">VOC-lyd</comment>
+ <comment xml:lang="ms">Audio VOC</comment>
+ <comment xml:lang="lv">VOC audio</comment>
+ <comment xml:lang="lt">VOC garso įrašas</comment>
+ <comment xml:lang="ko">VOC 오디오</comment>
+ <comment xml:lang="kk">VOC аудиосы</comment>
+ <comment xml:lang="ja">VOC オーディオ</comment>
+ <comment xml:lang="it">Audio VOC</comment>
+ <comment xml:lang="is">VOC hljóðskrá</comment>
+ <comment xml:lang="id">Audio VOC</comment>
+ <comment xml:lang="ia">Audio VOC</comment>
+ <comment xml:lang="hu">VOC hang</comment>
+ <comment xml:lang="hr">VOC zvučni zapis</comment>
+ <comment xml:lang="he">שמע VOC</comment>
+ <comment xml:lang="gl">son VOC</comment>
+ <comment xml:lang="ga">fuaim VOC</comment>
+ <comment xml:lang="fur">audio VOC</comment>
+ <comment xml:lang="fr">audio VOC</comment>
+ <comment xml:lang="fo">VOC ljóður</comment>
+ <comment xml:lang="fi">VOC-ääni</comment>
+ <comment xml:lang="eu">VOC audioa</comment>
+ <comment xml:lang="es">sonido VOC</comment>
+ <comment xml:lang="eo">VOC-sondosiero</comment>
+ <comment xml:lang="en_GB">VOC audio</comment>
+ <comment xml:lang="el">Ήχος VOC</comment>
+ <comment xml:lang="de">VOC-Audio</comment>
+ <comment xml:lang="da">VOC-lyd</comment>
+ <comment xml:lang="cy">Sain VOC</comment>
+ <comment xml:lang="cs">zvuk VOC</comment>
+ <comment xml:lang="ca">àudio VOC</comment>
+ <comment xml:lang="bg">Аудио — VOC</comment>
+ <comment xml:lang="be@latin">Aŭdyjo VOC</comment>
+ <comment xml:lang="be">аўдыя VOC</comment>
+ <comment xml:lang="az">VOC audio faylı</comment>
+ <comment xml:lang="ar">صوت VOC</comment>
+ <comment xml:lang="af">VOC-oudio</comment>
<glob pattern="*.voc"/>
</mime-type>
- <mime-type type="audio/x-wav">
+ <mime-type type="audio/vnd.wave">
<comment>WAV audio</comment>
- <comment xml:lang="af">WAV-oudio</comment>
- <comment xml:lang="ar">WAV سمعي</comment>
- <comment xml:lang="az">WAV audio faylı</comment>
- <comment xml:lang="be-Latn">Aŭdyjo WAV</comment>
- <comment xml:lang="bg">Аудио — WAV</comment>
- <comment xml:lang="ca">àudio WAV</comment>
- <comment xml:lang="cs">zvuk WAV</comment>
- <comment xml:lang="cy">Sain WAV</comment>
- <comment xml:lang="da">WAV-lyd</comment>
- <comment xml:lang="de">WAV-Audio</comment>
- <comment xml:lang="el">Ήχος WAV</comment>
- <comment xml:lang="en-GB">WAV audio</comment>
- <comment xml:lang="eo">WAV-sonkodo</comment>
- <comment xml:lang="es">audio WAV</comment>
- <comment xml:lang="eu">WAV audioa</comment>
- <comment xml:lang="fi">WAV-ääni</comment>
- <comment xml:lang="fo">WAV ljóður</comment>
- <comment xml:lang="fr">audio WAV</comment>
- <comment xml:lang="fur">audio WAV</comment>
- <comment xml:lang="ga">fuaim WAV</comment>
- <comment xml:lang="gl">son WAV</comment>
- <comment xml:lang="he">שמע WAV</comment>
- <comment xml:lang="hr">WAV zvučni zapis</comment>
- <comment xml:lang="hu">WAV hang</comment>
- <comment xml:lang="ia">Audio WAV</comment>
- <comment xml:lang="id">Audio WAV</comment>
- <comment xml:lang="it">Audio WAV</comment>
- <comment xml:lang="ja">WAV オーディオ</comment>
- <comment xml:lang="kk">WAV аудиосы</comment>
- <comment xml:lang="ko">WAV 오디오</comment>
- <comment xml:lang="lt">WAV garso įrašas</comment>
- <comment xml:lang="lv">WAV audio</comment>
- <comment xml:lang="ms">Audio VOC</comment>
- <comment xml:lang="nb">WAV-lyd</comment>
- <comment xml:lang="nl">WAV-audio</comment>
- <comment xml:lang="nn">WAV-lyd</comment>
- <comment xml:lang="oc">àudio WAV</comment>
- <comment xml:lang="pl">Plik dźwiękowy WAV</comment>
- <comment xml:lang="pt">áudio WAV</comment>
- <comment xml:lang="pt-BR">Áudio WAV</comment>
- <comment xml:lang="ro">Audio WAV</comment>
- <comment xml:lang="ru">Аудио WAV</comment>
- <comment xml:lang="sk">Zvuk WAV</comment>
- <comment xml:lang="sl">Zvočna datoteka WAV</comment>
- <comment xml:lang="sq">Audio WAV</comment>
- <comment xml:lang="sr">ВАВ звук</comment>
- <comment xml:lang="sv">WAV-ljud</comment>
- <comment xml:lang="tr">WAV sesi</comment>
- <comment xml:lang="uk">звук WAV</comment>
+ <comment xml:lang="zh_TW">WAV 音訊</comment>
+ <comment xml:lang="zh_CN">WAV 音频</comment>
<comment xml:lang="vi">Âm thanh WAV</comment>
- <comment xml:lang="zh-CN">WAV 音频</comment>
- <comment xml:lang="zh-TW">WAV 音訊</comment>
+ <comment xml:lang="uk">звук WAV</comment>
+ <comment xml:lang="tr">WAV sesi</comment>
+ <comment xml:lang="sv">WAV-ljud</comment>
+ <comment xml:lang="sr">ВАВ звук</comment>
+ <comment xml:lang="sq">audio WAV</comment>
+ <comment xml:lang="sl">Zvočna datoteka WAV</comment>
+ <comment xml:lang="si">WAV ශ්රව්ය</comment>
+ <comment xml:lang="sk">Zvuk WAV</comment>
+ <comment xml:lang="ru">Аудио WAV</comment>
+ <comment xml:lang="ro">Audio WAV</comment>
+ <comment xml:lang="pt_BR">Áudio WAV</comment>
+ <comment xml:lang="pt">áudio WAV</comment>
+ <comment xml:lang="pl">Plik dźwiękowy WAV</comment>
+ <comment xml:lang="oc">àudio WAV</comment>
+ <comment xml:lang="nn">WAV-lyd</comment>
+ <comment xml:lang="nl">WAV-audio</comment>
+ <comment xml:lang="nb">WAV-lyd</comment>
+ <comment xml:lang="ms">Audio VOC</comment>
+ <comment xml:lang="lv">WAV audio</comment>
+ <comment xml:lang="lt">WAV garso įrašas</comment>
+ <comment xml:lang="ko">WAV 오디오</comment>
+ <comment xml:lang="kk">WAV аудиосы</comment>
+ <comment xml:lang="ja">WAV オーディオ</comment>
+ <comment xml:lang="it">Audio WAV</comment>
+ <comment xml:lang="is">WAV hljóðskrá</comment>
+ <comment xml:lang="id">Audio WAV</comment>
+ <comment xml:lang="ia">Audio WAV</comment>
+ <comment xml:lang="hu">WAV hang</comment>
+ <comment xml:lang="hr">WAV zvučni zapis</comment>
+ <comment xml:lang="he">שמע WAV</comment>
+ <comment xml:lang="gl">son WAV</comment>
+ <comment xml:lang="ga">fuaim WAV</comment>
+ <comment xml:lang="fur">audio WAV</comment>
+ <comment xml:lang="fr">audio WAV</comment>
+ <comment xml:lang="fo">WAV ljóður</comment>
+ <comment xml:lang="fi">WAV-ääni</comment>
+ <comment xml:lang="eu">WAV audioa</comment>
+ <comment xml:lang="es">sonido WAV</comment>
+ <comment xml:lang="eo">WAV-sonkodo</comment>
+ <comment xml:lang="en_GB">WAV audio</comment>
+ <comment xml:lang="el">Ήχος WAV</comment>
+ <comment xml:lang="de">WAV-Audio</comment>
+ <comment xml:lang="da">WAV-lyd</comment>
+ <comment xml:lang="cy">Sain WAV</comment>
+ <comment xml:lang="cs">zvuk WAV</comment>
+ <comment xml:lang="ca">àudio WAV</comment>
+ <comment xml:lang="bg">Аудио — WAV</comment>
+ <comment xml:lang="be@latin">Aŭdyjo WAV</comment>
+ <comment xml:lang="be">аўдыя WAV</comment>
+ <comment xml:lang="az">WAV audio faylı</comment>
+ <comment xml:lang="ar">صوت WAV</comment>
+ <comment xml:lang="af">WAV-oudio</comment>
<alias type="audio/wav"/>
- <alias type="audio/vnd.wave"/>
- <magic priority="50">
+ <alias type="audio/x-wav"/>
+ <sub-class-of type="application/x-riff"/>
+ <magic>
<match type="string" value="WAVE" offset="8"/>
<match type="string" value="WAV " offset="8"/>
</magic>
<glob pattern="*.wav"/>
</mime-type>
<mime-type type="audio/x-xi">
- <comment>Scream Tracker instrument</comment>
- <comment xml:lang="ar">آلة Scream Tracker</comment>
- <comment xml:lang="az">Scream Tracker instrumenti</comment>
- <comment xml:lang="be-Latn">Instrument Scream Tracker</comment>
- <comment xml:lang="bg">Инструмент — Scream Tracker</comment>
- <comment xml:lang="ca">instrument de Scream Tracker</comment>
- <comment xml:lang="cs">nástroj pro Scream Tracker</comment>
- <comment xml:lang="cy">Offeryn Scream Tracker</comment>
- <comment xml:lang="da">Scream Tracker-instrument</comment>
- <comment xml:lang="de">Scream-Tracker-Instrument</comment>
- <comment xml:lang="el">Μουσικό όργανο Scream Tracker</comment>
- <comment xml:lang="en-GB">Scream Tracker instrument</comment>
- <comment xml:lang="eo">instrumento de Scream Tracker</comment>
- <comment xml:lang="es">instrumento Scream Tracker</comment>
- <comment xml:lang="eu">Scream Tracker instrumentua</comment>
- <comment xml:lang="fi">Scream Tracker -soitin</comment>
- <comment xml:lang="fo">Scream Tracker ljóðføri</comment>
- <comment xml:lang="fr">instrument Scream Tracker</comment>
- <comment xml:lang="fur">strument Scream Tracker</comment>
- <comment xml:lang="ga">ionstraim Scream Tracker</comment>
- <comment xml:lang="gl">Instrumento Scream Tracker</comment>
- <comment xml:lang="he">כלי של Scream Tracker</comment>
- <comment xml:lang="hr">Scream Tracker instrument</comment>
- <comment xml:lang="hu">Scream Tracker hangszer</comment>
- <comment xml:lang="ia">Instrumento Scream Tracker</comment>
- <comment xml:lang="id">Instrumen Scream Tracker</comment>
- <comment xml:lang="it">Strumento Scream Tracker</comment>
- <comment xml:lang="ja">Scream Tracker インストゥルメント</comment>
- <comment xml:lang="kk">Scream Tracker сайманы</comment>
- <comment xml:lang="ko">Scream Tracker 악기</comment>
- <comment xml:lang="lt">Scream Tracker instrumentas</comment>
- <comment xml:lang="lv">Scream Tracker instrumenti</comment>
- <comment xml:lang="ms">Instrumen Scream Tracker</comment>
- <comment xml:lang="nb">Scream Tracker-instrument</comment>
- <comment xml:lang="nl">Scream Tracker-instrument</comment>
- <comment xml:lang="nn">Scream Tracker instrument</comment>
- <comment xml:lang="oc">instrument Scream Tracker</comment>
- <comment xml:lang="pl">Instrument Scream Tracker</comment>
- <comment xml:lang="pt">instrumento Scream Tracker</comment>
- <comment xml:lang="pt-BR">Instrumento Scream Tracker</comment>
- <comment xml:lang="ro">Instrument Scream Tracker</comment>
- <comment xml:lang="ru">Инструмент Scream Tracker</comment>
- <comment xml:lang="sk">Nástroj pre Scream Tracker</comment>
- <comment xml:lang="sl">Datoteka zvoka glasbila Scream Tracker</comment>
- <comment xml:lang="sq">Instrument Scream Tracker</comment>
- <comment xml:lang="sr">инструмент Скрим Тракера</comment>
- <comment xml:lang="sv">Scream Tracker-instrument</comment>
- <comment xml:lang="tr">Scream Tracker çalgısı</comment>
- <comment xml:lang="uk">інструмент Scream Tracker</comment>
- <comment xml:lang="vi">Nhạc khí Scream Tracker</comment>
- <comment xml:lang="zh-CN">Scream Tracker 乐器</comment>
- <comment xml:lang="zh-TW">Scream Tracker 樂器檔</comment>
- <magic priority="50">
+ <comment>FastTracker II instrument</comment>
+ <comment xml:lang="uk">інструмент FastTracker II</comment>
+ <comment xml:lang="sv">FastTracker II-instrument</comment>
+ <comment xml:lang="ru">Инструмент FastTracker II</comment>
+ <comment xml:lang="pl">Instrument FastTracker II</comment>
+ <comment xml:lang="it">Strumento FastTracker II</comment>
+ <comment xml:lang="eu">FastTracker II tresna</comment>
+ <comment xml:lang="es">instrumento de FastTracker II</comment>
+ <comment xml:lang="de">FastTracker-II-Instrument</comment>
+ <comment xml:lang="be">інструмент FastTracker II</comment>
+ <magic>
<match value="Extended Instrument:" type="string" offset="0"/>
</magic>
<glob pattern="*.xi"/>
</mime-type>
<mime-type type="audio/x-xm">
<comment>FastTracker II audio</comment>
- <comment xml:lang="ar">FastTracker II سمعي</comment>
- <comment xml:lang="az">FastTracker II audio faylı</comment>
- <comment xml:lang="be-Latn">Aŭdyjo FastTracker II</comment>
- <comment xml:lang="bg">Аудио — FastTracker II</comment>
- <comment xml:lang="ca">àudio de FastTracker II</comment>
- <comment xml:lang="cs">zvuk FastTracker II</comment>
- <comment xml:lang="cy">Sain FastTracker II</comment>
- <comment xml:lang="da">FastTracker II-lyd</comment>
- <comment xml:lang="de">FastTracker-II-Audio</comment>
- <comment xml:lang="el">Ήχος FastTracker II</comment>
- <comment xml:lang="en-GB">FastTracker II audio</comment>
- <comment xml:lang="eo">Sondosiero de FastTracker II</comment>
- <comment xml:lang="es">audio FastTracker II</comment>
- <comment xml:lang="eu">FastTracker II.ren audioa</comment>
- <comment xml:lang="fi">FastTracker II -ääni</comment>
- <comment xml:lang="fo">FastTracker II ljóður</comment>
- <comment xml:lang="fr">audio FastTracker II</comment>
- <comment xml:lang="fur">audio FastTracker II</comment>
- <comment xml:lang="ga">fuaim FastTracker II</comment>
- <comment xml:lang="gl">son de FastTracker II</comment>
- <comment xml:lang="he">שמע FastTracker II</comment>
- <comment xml:lang="hr">FastTracker II zvučni zapis</comment>
- <comment xml:lang="hu">FastTracker II hang</comment>
- <comment xml:lang="ia">Audio FastTracker II</comment>
- <comment xml:lang="id">Audio FastTracker II</comment>
- <comment xml:lang="it">Audio FastTracker II</comment>
- <comment xml:lang="ja">FastTracker II オーディオ</comment>
- <comment xml:lang="ka">FastTracker II-ის აუდიო</comment>
- <comment xml:lang="kk">FastTracker II аудиосы</comment>
- <comment xml:lang="ko">FastTracker II 오디오</comment>
- <comment xml:lang="lt">FastTracker II garso įrašas</comment>
- <comment xml:lang="lv">FastTracker II audio</comment>
- <comment xml:lang="ms">Audio FastTracker II</comment>
- <comment xml:lang="nb">FastTracker II-lyd</comment>
- <comment xml:lang="nl">FastTracker II-audio</comment>
- <comment xml:lang="nn">FastTracker II lyd</comment>
- <comment xml:lang="oc">àudio FastTracker II</comment>
- <comment xml:lang="pl">Plik dźwiękowy FastTracker II</comment>
- <comment xml:lang="pt">áudio FastTracker II</comment>
- <comment xml:lang="pt-BR">Áudio FastTracker II</comment>
- <comment xml:lang="ro">Audio FastTracker II</comment>
- <comment xml:lang="ru">Аудио FastTracker II</comment>
- <comment xml:lang="sk">Zvuk FastTracker II</comment>
- <comment xml:lang="sl">Zvočna datoteka FastTracker II</comment>
- <comment xml:lang="sq">Audio FastTracker II</comment>
- <comment xml:lang="sr">звук Фаст Тракера ИИ</comment>
- <comment xml:lang="sv">FastTracker II-ljud</comment>
- <comment xml:lang="tr">FastTracker II sesi</comment>
- <comment xml:lang="uk">звук FastTracker II</comment>
+ <comment xml:lang="zh_TW">FastTracker II 音訊</comment>
+ <comment xml:lang="zh_CN">FastTracker II 音频</comment>
<comment xml:lang="vi">Âm thanh FastTracker II</comment>
- <comment xml:lang="zh-CN">FastTracker II 音频</comment>
- <comment xml:lang="zh-TW">FastTracker II 音訊</comment>
- <magic priority="50">
+ <comment xml:lang="uk">звук FastTracker II</comment>
+ <comment xml:lang="tr">FastTracker II sesi</comment>
+ <comment xml:lang="sv">FastTracker II-ljud</comment>
+ <comment xml:lang="sr">звук Фаст Тракера ИИ</comment>
+ <comment xml:lang="sq">audio FastTracker II</comment>
+ <comment xml:lang="sl">Zvočna datoteka FastTracker II</comment>
+ <comment xml:lang="si">FastTracker II ශ්‍රව්‍ය</comment>
+ <comment xml:lang="sk">Zvuk FastTracker II</comment>
+ <comment xml:lang="ru">Аудио FastTracker II</comment>
+ <comment xml:lang="ro">Audio FastTracker II</comment>
+ <comment xml:lang="pt_BR">Áudio FastTracker II</comment>
+ <comment xml:lang="pt">áudio FastTracker II</comment>
+ <comment xml:lang="pl">Plik dźwiękowy FastTracker II</comment>
+ <comment xml:lang="oc">àudio FastTracker II</comment>
+ <comment xml:lang="nn">FastTracker II lyd</comment>
+ <comment xml:lang="nl">FastTracker II-audio</comment>
+ <comment xml:lang="nb">FastTracker II-lyd</comment>
+ <comment xml:lang="ms">Audio FastTracker II</comment>
+ <comment xml:lang="lv">FastTracker II audio</comment>
+ <comment xml:lang="lt">FastTracker II garso įrašas</comment>
+ <comment xml:lang="ko">FastTracker II 오디오</comment>
+ <comment xml:lang="kk">FastTracker II аудиосы</comment>
+ <comment xml:lang="ka">FastTracker II-ის აუდიო</comment>
+ <comment xml:lang="ja">FastTracker II オーディオ</comment>
+ <comment xml:lang="it">Audio FastTracker II</comment>
+ <comment xml:lang="is">FastTracker II hljóðskrá</comment>
+ <comment xml:lang="id">Audio FastTracker II</comment>
+ <comment xml:lang="ia">Audio FastTracker II</comment>
+ <comment xml:lang="hu">FastTracker II hang</comment>
+ <comment xml:lang="hr">FastTracker II zvučni zapis</comment>
+ <comment xml:lang="he">שמע FastTracker II</comment>
+ <comment xml:lang="gl">son de FastTracker II</comment>
+ <comment xml:lang="ga">fuaim FastTracker II</comment>
+ <comment xml:lang="fur">audio FastTracker II</comment>
+ <comment xml:lang="fr">audio FastTracker II</comment>
+ <comment xml:lang="fo">FastTracker II ljóður</comment>
+ <comment xml:lang="fi">FastTracker II -ääni</comment>
+ <comment xml:lang="eu">FastTracker II.ren audioa</comment>
+ <comment xml:lang="es">sonido FastTracker II</comment>
+ <comment xml:lang="eo">Sondosiero de FastTracker II</comment>
+ <comment xml:lang="en_GB">FastTracker II audio</comment>
+ <comment xml:lang="el">Ήχος FastTracker II</comment>
+ <comment xml:lang="de">FastTracker-II-Audio</comment>
+ <comment xml:lang="da">FastTracker II-lyd</comment>
+ <comment xml:lang="cy">Sain FastTracker II</comment>
+ <comment xml:lang="cs">zvuk FastTracker II</comment>
+ <comment xml:lang="ca">àudio de FastTracker II</comment>
+ <comment xml:lang="bg">Аудио — FastTracker II</comment>
+ <comment xml:lang="be@latin">Aŭdyjo FastTracker II</comment>
+ <comment xml:lang="be">аўдыя FastTracker II</comment>
+ <comment xml:lang="az">FastTracker II audio faylı</comment>
+ <comment xml:lang="ar">صوت FastTracker II</comment>
+ <magic>
<match value="Extended Module:" type="string" offset="0"/>
</magic>
<glob pattern="*.xm"/>
</mime-type>
<mime-type type="audio/x-tta">
<comment>TrueAudio audio</comment>
- <comment xml:lang="af">TrueAudio-oudio</comment>
- <comment xml:lang="ar">TrueAudio سمعي</comment>
- <comment xml:lang="be-Latn">Aŭdyjo TrueAudio</comment>
- <comment xml:lang="bg">Аудио — TrueAudio</comment>
- <comment xml:lang="ca">àudio TrueAudio</comment>
- <comment xml:lang="cs">zvuk TrueAudio</comment>
- <comment xml:lang="da">TrueAudio-lyd</comment>
- <comment xml:lang="de">TrueAudio-Audio</comment>
- <comment xml:lang="el">Ήχος TrueAudio</comment>
- <comment xml:lang="en-GB">TrueAudio audio</comment>
- <comment xml:lang="eo">TrueAudio-sondosiero</comment>
- <comment xml:lang="es">audio TrueAudio</comment>
- <comment xml:lang="eu">TrueAudio audioa</comment>
- <comment xml:lang="fi">TrueAudio-ääni</comment>
- <comment xml:lang="fo">TrueAudio ljóður</comment>
- <comment xml:lang="fr">audio TrueAudio</comment>
- <comment xml:lang="fur">audio TrueAudio</comment>
- <comment xml:lang="ga">fuaim TrueAudio</comment>
- <comment xml:lang="gl">son Trueson</comment>
- <comment xml:lang="he">שמע TrueAudio</comment>
- <comment xml:lang="hr">TrueAudio zvučni zapis</comment>
- <comment xml:lang="hu">TrueAudio hang</comment>
- <comment xml:lang="ia">Audio TrueAudio</comment>
- <comment xml:lang="id">Audio TrueAudio</comment>
- <comment xml:lang="it">Audio TrueAudio</comment>
- <comment xml:lang="ja">TrueAudio オーディオ</comment>
- <comment xml:lang="kk">TrueAudio аудиосы</comment>
- <comment xml:lang="ko">TrueAudio 오디오</comment>
- <comment xml:lang="lt">TrueAudio garso įrašas</comment>
- <comment xml:lang="lv">TrueAudio audio</comment>
- <comment xml:lang="nb">TrueAudio-lyd</comment>
- <comment xml:lang="nl">TrueAudio-audio</comment>
- <comment xml:lang="nn">TrueAudio-lyd</comment>
- <comment xml:lang="oc">àudio TrueAudio</comment>
- <comment xml:lang="pl">Plik dźwiękowy TrueAudio</comment>
- <comment xml:lang="pt">áudio TrueAudio</comment>
- <comment xml:lang="pt-BR">Áudio TrueAudio</comment>
- <comment xml:lang="ro">Audio TrueAudio</comment>
- <comment xml:lang="ru">Аудио TrueAudio</comment>
- <comment xml:lang="sk">Zvuk TrueAudio</comment>
- <comment xml:lang="sl">Zvočna datoteka TrueAudio</comment>
- <comment xml:lang="sq">Audio TrueAudio</comment>
- <comment xml:lang="sr">Тру Аудио звук</comment>
- <comment xml:lang="sv">TrueAudio-ljud</comment>
- <comment xml:lang="tr">TrueAudio sesi</comment>
- <comment xml:lang="uk">звук TrueAudio</comment>
+ <comment xml:lang="zh_TW">TrueAudio 音訊</comment>
+ <comment xml:lang="zh_CN">TrueAudio 音频</comment>
<comment xml:lang="vi">Âm thanh TrueAudio</comment>
- <comment xml:lang="zh-CN">TrueAudio 音频</comment>
- <comment xml:lang="zh-TW">TrueAudio 音訊</comment>
+ <comment xml:lang="uk">звук TrueAudio</comment>
+ <comment xml:lang="tr">TrueAudio sesi</comment>
+ <comment xml:lang="sv">TrueAudio-ljud</comment>
+ <comment xml:lang="sr">Тру Аудио звук</comment>
+ <comment xml:lang="sq">audio TrueAudio</comment>
+ <comment xml:lang="sl">Zvočna datoteka TrueAudio</comment>
+ <comment xml:lang="si">TrueAudio ශ්රව්ය</comment>
+ <comment xml:lang="sk">Zvuk TrueAudio</comment>
+ <comment xml:lang="ru">Аудио TrueAudio</comment>
+ <comment xml:lang="ro">Audio TrueAudio</comment>
+ <comment xml:lang="pt_BR">Áudio TrueAudio</comment>
+ <comment xml:lang="pt">áudio TrueAudio</comment>
+ <comment xml:lang="pl">Plik dźwiękowy TrueAudio</comment>
+ <comment xml:lang="oc">àudio TrueAudio</comment>
+ <comment xml:lang="nn">TrueAudio-lyd</comment>
+ <comment xml:lang="nl">TrueAudio-audio</comment>
+ <comment xml:lang="nb">TrueAudio-lyd</comment>
+ <comment xml:lang="lv">TrueAudio audio</comment>
+ <comment xml:lang="lt">TrueAudio garso įrašas</comment>
+ <comment xml:lang="ko">TrueAudio 오디오</comment>
+ <comment xml:lang="kk">TrueAudio аудиосы</comment>
+ <comment xml:lang="ja">TrueAudio オーディオ</comment>
+ <comment xml:lang="it">Audio TrueAudio</comment>
+ <comment xml:lang="is">TrueAudio hljóðskrá</comment>
+ <comment xml:lang="id">Audio TrueAudio</comment>
+ <comment xml:lang="ia">Audio TrueAudio</comment>
+ <comment xml:lang="hu">TrueAudio hang</comment>
+ <comment xml:lang="hr">TrueAudio zvučni zapis</comment>
+ <comment xml:lang="he">שמע TrueAudio</comment>
+ <comment xml:lang="gl">son Trueson</comment>
+ <comment xml:lang="ga">fuaim TrueAudio</comment>
+ <comment xml:lang="fur">audio TrueAudio</comment>
+ <comment xml:lang="fr">audio TrueAudio</comment>
+ <comment xml:lang="fo">TrueAudio ljóður</comment>
+ <comment xml:lang="fi">TrueAudio-ääni</comment>
+ <comment xml:lang="eu">TrueAudio audioa</comment>
+ <comment xml:lang="es">sonido TrueAudio</comment>
+ <comment xml:lang="eo">TrueAudio-sondosiero</comment>
+ <comment xml:lang="en_GB">TrueAudio audio</comment>
+ <comment xml:lang="el">Ήχος TrueAudio</comment>
+ <comment xml:lang="de">TrueAudio-Audio</comment>
+ <comment xml:lang="da">TrueAudio-lyd</comment>
+ <comment xml:lang="cs">zvuk TrueAudio</comment>
+ <comment xml:lang="ca">àudio TrueAudio</comment>
+ <comment xml:lang="bg">Аудио — TrueAudio</comment>
+ <comment xml:lang="be@latin">Aŭdyjo TrueAudio</comment>
+ <comment xml:lang="be">аўдыя TrueAudio</comment>
+ <comment xml:lang="ar">صوت TrueAudio</comment>
+ <comment xml:lang="af">TrueAudio-oudio</comment>
<alias type="audio/tta"/>
- <magic priority="50">
+ <magic>
<match value="TTA1" type="string" offset="0"/>
</magic>
<glob pattern="*.tta"/>
</mime-type>
<mime-type type="image/bmp">
<comment>Windows BMP image</comment>
- <comment xml:lang="af">Windows BMP-beeld</comment>
- <comment xml:lang="ar">صورة Windows BMP</comment>
- <comment xml:lang="az">Windows BMP rəsmi</comment>
- <comment xml:lang="be-Latn">Vyjava Windows BMP</comment>
- <comment xml:lang="bg">Изображение — Windows BMP</comment>
- <comment xml:lang="ca">imatge BMP de Windows</comment>
- <comment xml:lang="cs">obrázek Windows BMP</comment>
- <comment xml:lang="cy">Delwedd BMP Windows</comment>
- <comment xml:lang="da">Windows BMP-billede</comment>
- <comment xml:lang="de">Windows-BMP-Bild</comment>
- <comment xml:lang="el">Εικόνα Windows BMP</comment>
- <comment xml:lang="en-GB">Windows BMP image</comment>
- <comment xml:lang="eo">BMP-bildo de Vindozo</comment>
- <comment xml:lang="es">imagen BMP de Windows</comment>
- <comment xml:lang="eu">Windows BMP irudia</comment>
- <comment xml:lang="fi">Windows BMP -kuva</comment>
- <comment xml:lang="fo">Windows BMP mynd</comment>
- <comment xml:lang="fr">image Windows BMP</comment>
- <comment xml:lang="fur">imagjin Windows BMP</comment>
- <comment xml:lang="ga">íomhá BMP Windows</comment>
- <comment xml:lang="gl">imaxe BMP de Windows</comment>
- <comment xml:lang="he">תמונת BMP של Windows</comment>
- <comment xml:lang="hr">Windows BMP slika</comment>
- <comment xml:lang="hu">Windows BMP-kép</comment>
- <comment xml:lang="ia">Imagine BMP de Windows</comment>
- <comment xml:lang="id">Citra Windows BMP</comment>
- <comment xml:lang="it">Immagine Windows BMP</comment>
- <comment xml:lang="ja">Windows BMP 画像</comment>
- <comment xml:lang="kk">Windows BMP суреті</comment>
- <comment xml:lang="ko">Windows BMP 그림</comment>
- <comment xml:lang="lt">Windows BMP paveikslėlis</comment>
- <comment xml:lang="lv">Windows BMP attēls</comment>
- <comment xml:lang="ms">Imej BMP Windows</comment>
- <comment xml:lang="nb">Windows BMP-bilde</comment>
- <comment xml:lang="nl">Windows BMP-afbeelding</comment>
- <comment xml:lang="nn">Windows BMP-bilete</comment>
- <comment xml:lang="oc">imatge Windows BMP</comment>
- <comment xml:lang="pl">Obraz BMP Windows</comment>
- <comment xml:lang="pt">imagem BMP Windows</comment>
- <comment xml:lang="pt-BR">Imagem BMP do Windows</comment>
- <comment xml:lang="ro">Imagine Windows BMP</comment>
- <comment xml:lang="ru">Изображение Windows BMP</comment>
- <comment xml:lang="sk">Obrázok Windows BMP</comment>
- <comment xml:lang="sl">Slikovna datoteka Windows BMP</comment>
- <comment xml:lang="sq">Figurë Windows BMP</comment>
- <comment xml:lang="sr">Виндоузова БМП слика</comment>
- <comment xml:lang="sv">Windows BMP-bild</comment>
- <comment xml:lang="tr">Windows BMP görüntüsü</comment>
- <comment xml:lang="uk">зображення Windows BMP</comment>
+ <comment xml:lang="zh_TW">Windows BMP 影像</comment>
+ <comment xml:lang="zh_CN">Windows BMP 图像</comment>
<comment xml:lang="vi">Ảnh BMP Windows</comment>
- <comment xml:lang="zh-CN">Windows BMP 图像</comment>
- <comment xml:lang="zh-TW">Windows BMP 影像</comment>
- <magic priority="50">
+ <comment xml:lang="uk">зображення Windows BMP</comment>
+ <comment xml:lang="tr">Windows BMP görüntüsü</comment>
+ <comment xml:lang="sv">Windows BMP-bild</comment>
+ <comment xml:lang="sr">Виндоузова БМП слика</comment>
+ <comment xml:lang="sq">figurë Windows BMP</comment>
+ <comment xml:lang="sl">Slikovna datoteka Windows BMP</comment>
+ <comment xml:lang="si">වින්ඩෝස් BMP රූපය</comment>
+ <comment xml:lang="sk">Obrázok Windows BMP</comment>
+ <comment xml:lang="ru">Изображение Windows BMP</comment>
+ <comment xml:lang="ro">Imagine Windows BMP</comment>
+ <comment xml:lang="pt_BR">Imagem BMP do Windows</comment>
+ <comment xml:lang="pt">imagem BMP Windows</comment>
+ <comment xml:lang="pl">Obraz BMP Windows</comment>
+ <comment xml:lang="oc">imatge Windows BMP</comment>
+ <comment xml:lang="nn">Windows BMP-bilete</comment>
+ <comment xml:lang="nl">Windows BMP-afbeelding</comment>
+ <comment xml:lang="nb">Windows BMP-bilde</comment>
+ <comment xml:lang="ms">Imej BMP Windows</comment>
+ <comment xml:lang="lv">Windows BMP attēls</comment>
+ <comment xml:lang="lt">Windows BMP paveikslėlis</comment>
+ <comment xml:lang="ko">Windows BMP 그림</comment>
+ <comment xml:lang="kk">Windows BMP суреті</comment>
+ <comment xml:lang="ja">Windows BMP 画像</comment>
+ <comment xml:lang="it">Immagine Windows BMP</comment>
+ <comment xml:lang="is">Windows BMP mynd</comment>
+ <comment xml:lang="id">Citra Windows BMP</comment>
+ <comment xml:lang="ia">Imagine BMP de Windows</comment>
+ <comment xml:lang="hu">Windows BMP-kép</comment>
+ <comment xml:lang="hr">Windows BMP slika</comment>
+ <comment xml:lang="he">תמונת BMP של Windows</comment>
+ <comment xml:lang="gl">imaxe BMP de Windows</comment>
+ <comment xml:lang="ga">íomhá BMP Windows</comment>
+ <comment xml:lang="fur">imagjin Windows BMP</comment>
+ <comment xml:lang="fr">image Windows BMP</comment>
+ <comment xml:lang="fo">Windows BMP mynd</comment>
+ <comment xml:lang="fi">Windows BMP -kuva</comment>
+ <comment xml:lang="eu">Windows BMP irudia</comment>
+ <comment xml:lang="es">imagen BMP de Windows</comment>
+ <comment xml:lang="eo">BMP-bildo de Vindozo</comment>
+ <comment xml:lang="en_GB">Windows BMP image</comment>
+ <comment xml:lang="el">Εικόνα Windows BMP</comment>
+ <comment xml:lang="de">Windows BMP-Bild</comment>
+ <comment xml:lang="da">Windows BMP-billede</comment>
+ <comment xml:lang="cy">Delwedd BMP Windows</comment>
+ <comment xml:lang="cs">obrázek Windows BMP</comment>
+ <comment xml:lang="ca">imatge BMP de Windows</comment>
+ <comment xml:lang="bg">Изображение — Windows BMP</comment>
+ <comment xml:lang="be@latin">Vyjava Windows BMP</comment>
+ <comment xml:lang="be">выява Windows BMP</comment>
+ <comment xml:lang="az">Windows BMP rəsmi</comment>
+ <comment xml:lang="ar">صورة Windows BMP</comment>
+ <comment xml:lang="af">Windows BMP-beeld</comment>
+ <magic>
<match type="string" mask="0xffff00000000ffff" value="BMxxxx\000\000" offset="0"/>
<match type="string" value="BM" offset="0">
<match type="byte" value="12" offset="14"/>
@@ -25973,366 +27286,431 @@ command to generate the output files.
</mime-type>
<mime-type type="image/vnd.wap.wbmp">
<comment>WBMP image</comment>
- <comment xml:lang="af">WBMP-beeld</comment>
- <comment xml:lang="ar">صورة WBMP</comment>
- <comment xml:lang="be-Latn">Vyjava WBMP</comment>
- <comment xml:lang="bg">Изображение — WBMP</comment>
- <comment xml:lang="ca">imatge WBMP</comment>
- <comment xml:lang="cs">obrázek WBMP</comment>
- <comment xml:lang="da">WBMP-billede</comment>
- <comment xml:lang="de">WBMP-Bild</comment>
- <comment xml:lang="el">Εικόνα WBMP</comment>
- <comment xml:lang="en-GB">WBMP image</comment>
- <comment xml:lang="eo">WBMP-bildo</comment>
- <comment xml:lang="es">imagen WBMP</comment>
- <comment xml:lang="eu">WBMP irudia</comment>
- <comment xml:lang="fi">WBMP-kuva</comment>
- <comment xml:lang="fo">WBMP mynd</comment>
- <comment xml:lang="fr">image WBMP</comment>
- <comment xml:lang="fur">imagjin WBMP</comment>
- <comment xml:lang="ga">íomhá WBMP</comment>
- <comment xml:lang="gl">imaxe WBMP</comment>
- <comment xml:lang="he">תמונת WBMP</comment>
- <comment xml:lang="hr">WBMP slika</comment>
- <comment xml:lang="hu">WBMP kép</comment>
- <comment xml:lang="ia">Imagine WBMP</comment>
- <comment xml:lang="id">Citra WBMP</comment>
- <comment xml:lang="it">Immagine WBMP</comment>
- <comment xml:lang="ja">WBMP 画像</comment>
- <comment xml:lang="kk">WBMP суреті</comment>
- <comment xml:lang="ko">WBMP 그림</comment>
- <comment xml:lang="lt">WBMP paveikslėlis</comment>
- <comment xml:lang="lv">WBMP attēls</comment>
- <comment xml:lang="nb">WBMP-bilde</comment>
- <comment xml:lang="nl">WBMP-afbeelding</comment>
- <comment xml:lang="nn">WBMP-bilete</comment>
- <comment xml:lang="oc">imatge WBMP</comment>
- <comment xml:lang="pl">Obraz WBMP</comment>
- <comment xml:lang="pt">imagem WBMP</comment>
- <comment xml:lang="pt-BR">Imagem WBMP</comment>
- <comment xml:lang="ro">Imagine WBMP</comment>
- <comment xml:lang="ru">Изображение WBMP</comment>
- <comment xml:lang="sk">Obrázok WBMP</comment>
- <comment xml:lang="sl">Slikovna datoteka WBMP</comment>
- <comment xml:lang="sq">Figurë WBMP</comment>
- <comment xml:lang="sr">ВБМП слика</comment>
- <comment xml:lang="sv">WBMP-bild</comment>
- <comment xml:lang="tr">WBMP görüntüsü</comment>
- <comment xml:lang="uk">зображення WBMP</comment>
+ <comment xml:lang="zh_TW">WBMP 影像</comment>
+ <comment xml:lang="zh_CN">WBMP 图像</comment>
<comment xml:lang="vi">Ảnh WBMP</comment>
- <comment xml:lang="zh-CN">WBMP 图像</comment>
- <comment xml:lang="zh-TW">WBMP 影像</comment>
+ <comment xml:lang="uk">зображення WBMP</comment>
+ <comment xml:lang="tr">WBMP görüntüsü</comment>
+ <comment xml:lang="sv">WBMP-bild</comment>
+ <comment xml:lang="sr">ВБМП слика</comment>
+ <comment xml:lang="sq">figurë WBMP</comment>
+ <comment xml:lang="sl">Slikovna datoteka WBMP</comment>
+ <comment xml:lang="si">WBMP රූපය</comment>
+ <comment xml:lang="sk">Obrázok WBMP</comment>
+ <comment xml:lang="ru">Изображение WBMP</comment>
+ <comment xml:lang="ro">Imagine WBMP</comment>
+ <comment xml:lang="pt_BR">Imagem WBMP</comment>
+ <comment xml:lang="pt">imagem WBMP</comment>
+ <comment xml:lang="pl">Obraz WBMP</comment>
+ <comment xml:lang="oc">imatge WBMP</comment>
+ <comment xml:lang="nn">WBMP-bilete</comment>
+ <comment xml:lang="nl">WBMP-afbeelding</comment>
+ <comment xml:lang="nb">WBMP-bilde</comment>
+ <comment xml:lang="lv">WBMP attēls</comment>
+ <comment xml:lang="lt">WBMP paveikslėlis</comment>
+ <comment xml:lang="ko">WBMP 그림</comment>
+ <comment xml:lang="kk">WBMP суреті</comment>
+ <comment xml:lang="ja">WBMP 画像</comment>
+ <comment xml:lang="it">Immagine WBMP</comment>
+ <comment xml:lang="is">WBMP mynd</comment>
+ <comment xml:lang="id">Citra WBMP</comment>
+ <comment xml:lang="ia">Imagine WBMP</comment>
+ <comment xml:lang="hu">WBMP kép</comment>
+ <comment xml:lang="hr">WBMP slika</comment>
+ <comment xml:lang="he">תמונת WBMP</comment>
+ <comment xml:lang="gl">imaxe WBMP</comment>
+ <comment xml:lang="ga">íomhá WBMP</comment>
+ <comment xml:lang="fur">imagjin WBMP</comment>
+ <comment xml:lang="fr">image WBMP</comment>
+ <comment xml:lang="fo">WBMP mynd</comment>
+ <comment xml:lang="fi">WBMP-kuva</comment>
+ <comment xml:lang="eu">WBMP irudia</comment>
+ <comment xml:lang="es">imagen WBMP</comment>
+ <comment xml:lang="eo">WBMP-bildo</comment>
+ <comment xml:lang="en_GB">WBMP image</comment>
+ <comment xml:lang="el">Εικόνα WBMP</comment>
+ <comment xml:lang="de">WBMP-Bild</comment>
+ <comment xml:lang="da">WBMP-billede</comment>
+ <comment xml:lang="cs">obrázek WBMP</comment>
+ <comment xml:lang="ca">imatge WBMP</comment>
+ <comment xml:lang="bg">Изображение — WBMP</comment>
+ <comment xml:lang="be@latin">Vyjava WBMP</comment>
+ <comment xml:lang="be">выява WBMP</comment>
+ <comment xml:lang="ar">صورة WBMP</comment>
+ <comment xml:lang="af">WBMP-beeld</comment>
<acronym>WBMP</acronym>
<expanded-acronym>WAP bitmap</expanded-acronym>
<glob pattern="*.wbmp"/>
</mime-type>
<mime-type type="image/cgm">
<comment>CGM image</comment>
- <comment xml:lang="bg">Изображение — CGM</comment>
- <comment xml:lang="ca">imatge CGM</comment>
- <comment xml:lang="da">CGM-billede</comment>
- <comment xml:lang="de">CGM-Bild</comment>
- <comment xml:lang="en-GB">CGM image</comment>
- <comment xml:lang="es">imagen CGM</comment>
- <comment xml:lang="eu">CGM irudia</comment>
- <comment xml:lang="fi">CGM-kuva</comment>
- <comment xml:lang="fr">image CGM</comment>
- <comment xml:lang="hr">CGM slika</comment>
- <comment xml:lang="hu">CGM-kép</comment>
- <comment xml:lang="id">Citra CGM</comment>
- <comment xml:lang="it">Immagine CGM</comment>
- <comment xml:lang="kk">CGM суреті</comment>
- <comment xml:lang="ko">CGM 이미지</comment>
- <comment xml:lang="pl">Obraz CGM</comment>
- <comment xml:lang="pt-BR">Imagem CGM</comment>
- <comment xml:lang="ru">Изображение CGM</comment>
- <comment xml:lang="sk">Obrázok CGM</comment>
- <comment xml:lang="sl">Slika CGM</comment>
- <comment xml:lang="sv">CGM-bild</comment>
- <comment xml:lang="tr">CGM görüntüsü</comment>
+ <comment xml:lang="zh_TW">CGM 影像</comment>
+ <comment xml:lang="zh_CN">CGM 图像</comment>
<comment xml:lang="uk">зображення CGM</comment>
- <comment xml:lang="zh-CN">CGM 图像</comment>
- <comment xml:lang="zh-TW">CGM 影像</comment>
+ <comment xml:lang="tr">CGM görüntüsü</comment>
+ <comment xml:lang="sv">CGM-bild</comment>
+ <comment xml:lang="sq">figurë CGM</comment>
+ <comment xml:lang="sl">Slika CGM</comment>
+ <comment xml:lang="si">CGM රූපය</comment>
+ <comment xml:lang="sk">Obrázok CGM</comment>
+ <comment xml:lang="ru">Изображение CGM</comment>
+ <comment xml:lang="pt_BR">Imagem CGM</comment>
+ <comment xml:lang="pl">Obraz CGM</comment>
+ <comment xml:lang="oc">imatge CGM</comment>
+ <comment xml:lang="nl">CGM-afbeelding</comment>
+ <comment xml:lang="ko">CGM 이미지</comment>
+ <comment xml:lang="kk">CGM суреті</comment>
+ <comment xml:lang="ja">CGM 画像</comment>
+ <comment xml:lang="it">Immagine CGM</comment>
+ <comment xml:lang="is">CGM mynd</comment>
+ <comment xml:lang="id">Citra CGM</comment>
+ <comment xml:lang="hu">CGM-kép</comment>
+ <comment xml:lang="hr">CGM slika</comment>
+ <comment xml:lang="he">תמונת CGM</comment>
+ <comment xml:lang="fr">image CGM</comment>
+ <comment xml:lang="fi">CGM-kuva</comment>
+ <comment xml:lang="eu">CGM irudia</comment>
+ <comment xml:lang="es">imagen CGM</comment>
+ <comment xml:lang="en_GB">CGM image</comment>
+ <comment xml:lang="de">CGM-Bild</comment>
+ <comment xml:lang="da">CGM-billede</comment>
+ <comment xml:lang="ca">imatge CGM</comment>
+ <comment xml:lang="bg">Изображение — CGM</comment>
+ <comment xml:lang="be">выява CGM</comment>
+ <comment xml:lang="ar">صورة CGM</comment>
<acronym>CGM</acronym>
<expanded-acronym>Computer Graphics Metafile</expanded-acronym>
<glob pattern="*.cgm"/>
</mime-type>
<mime-type type="image/g3fax">
<comment>CCITT G3 fax image</comment>
- <comment xml:lang="bg">Изображение — CCITT G3, факс</comment>
- <comment xml:lang="ca">imatge de fax CCITT G3</comment>
- <comment xml:lang="da">CCITT G3-faxbillede</comment>
- <comment xml:lang="de">CCITT-G3-Faxbild</comment>
- <comment xml:lang="en-GB">CCITT G3 fax image</comment>
- <comment xml:lang="es">imagen de fax CCITT G3</comment>
- <comment xml:lang="eu">CCITT G3 fax irudia</comment>
- <comment xml:lang="fi">CCITT G3 -faksikuva</comment>
- <comment xml:lang="fr">image de télécopie CCITT G3</comment>
- <comment xml:lang="hr">CCITT G3 slika faksa</comment>
- <comment xml:lang="hu">CCITT G3-faxkép</comment>
- <comment xml:lang="id">Citra faks CCITT G3</comment>
- <comment xml:lang="it">Immagine fax CCIT G3</comment>
- <comment xml:lang="kk">CCITT G3 факс суреті</comment>
- <comment xml:lang="ko">CCITT G3 팩스 이미지</comment>
- <comment xml:lang="pl">Obraz faksowy G3 CCITT</comment>
- <comment xml:lang="pt-BR">Imagem de fax CCITT G3</comment>
- <comment xml:lang="ru">Факсовое изображение CCITT G3</comment>
- <comment xml:lang="sv">CCITT G3 faxbild</comment>
- <comment xml:lang="tr">CCITT G3 faks görüntüsü</comment>
+ <comment xml:lang="zh_TW">CCITT G3 傳真影像</comment>
+ <comment xml:lang="zh_CN">CCITT G3 传真图像</comment>
<comment xml:lang="uk">зображення факсу G3 CCITT</comment>
- <comment xml:lang="zh-CN">CCITT G3 传真图像</comment>
- <comment xml:lang="zh-TW">CCITT G3 傳真影像</comment>
+ <comment xml:lang="tr">CCITT G3 faks görüntüsü</comment>
+ <comment xml:lang="sv">CCITT G3 faxbild</comment>
+ <comment xml:lang="sq">figurë faks CCITT G3</comment>
+ <comment xml:lang="sl">Slikovna datoteka faksimila CCITT G3</comment>
+ <comment xml:lang="si">CCITT G3 ෆැක්ස් රූපය</comment>
+ <comment xml:lang="ru">Факсовое изображение CCITT G3</comment>
+ <comment xml:lang="pt_BR">Imagem de fax CCITT G3</comment>
+ <comment xml:lang="pl">Obraz faksowy G3 CCITT</comment>
+ <comment xml:lang="nl">CCITT G3-faxafbeelding</comment>
+ <comment xml:lang="ko">CCITT G3 팩스 이미지</comment>
+ <comment xml:lang="kk">CCITT G3 факс суреті</comment>
+ <comment xml:lang="ja">CCITT G3 ファックス画像</comment>
+ <comment xml:lang="it">Immagine fax CCIT G3</comment>
+ <comment xml:lang="is">CCITT G3 faxmynd</comment>
+ <comment xml:lang="id">Citra faks CCITT G3</comment>
+ <comment xml:lang="hu">CCITT G3-faxkép</comment>
+ <comment xml:lang="hr">CCITT G3 slika faksa</comment>
+ <comment xml:lang="he">תמונת פקס של CCITT G3</comment>
+ <comment xml:lang="fr">image de télécopie CCITT G3</comment>
+ <comment xml:lang="fi">CCITT G3 -faksikuva</comment>
+ <comment xml:lang="eu">CCITT G3 fax irudia</comment>
+ <comment xml:lang="es">imagen de fax CCITT G3</comment>
+ <comment xml:lang="en_GB">CCITT G3 fax image</comment>
+ <comment xml:lang="de">CCITT-G3-Fax</comment>
+ <comment xml:lang="da">CCITT G3-faxbillede</comment>
+ <comment xml:lang="ca">imatge de fax CCITT G3</comment>
+ <comment xml:lang="bg">Изображение — CCITT G3, факс</comment>
+ <comment xml:lang="be">выява факса CCITT G3</comment>
+ <comment xml:lang="ar">صورة فاكس CCITT G3</comment>
+ <acronym>CCITT</acronym>
+ <expanded-acronym>Comité Consultatif International Téléphonique et Télégraphique</expanded-acronym>
<glob pattern="*.g3"/>
<alias type="image/fax-g3"/>
</mime-type>
<mime-type type="image/gif">
<comment>GIF image</comment>
- <comment xml:lang="af">GIF-beeld</comment>
- <comment xml:lang="ar">صورة GIF</comment>
- <comment xml:lang="az">GIF rəsmi</comment>
- <comment xml:lang="be-Latn">Vyjava GIF</comment>
- <comment xml:lang="bg">Изображение — GIF</comment>
- <comment xml:lang="ca">imatge GIF</comment>
- <comment xml:lang="cs">obrázek GIF</comment>
- <comment xml:lang="cy">Delwedd GIF</comment>
- <comment xml:lang="da">GIF-billede</comment>
- <comment xml:lang="de">GIF-Bild</comment>
- <comment xml:lang="el">Εικόνα GIF</comment>
- <comment xml:lang="en-GB">GIF image</comment>
- <comment xml:lang="eo">GIF-bildo</comment>
- <comment xml:lang="es">imagen GIF</comment>
- <comment xml:lang="eu">GIF irudia</comment>
- <comment xml:lang="fi">GIF-kuva</comment>
- <comment xml:lang="fo">GIF mynd</comment>
- <comment xml:lang="fr">image GIF</comment>
- <comment xml:lang="fur">imagjin GIF</comment>
- <comment xml:lang="ga">íomhá GIF</comment>
- <comment xml:lang="gl">imaxe GIF</comment>
- <comment xml:lang="he">תמונת GIF</comment>
- <comment xml:lang="hr">GIF slika</comment>
- <comment xml:lang="hu">GIF-kép</comment>
- <comment xml:lang="ia">Imagine GIF</comment>
- <comment xml:lang="id">Citra GIF</comment>
- <comment xml:lang="it">Immagine GIF</comment>
- <comment xml:lang="ja">GIF 画像</comment>
- <comment xml:lang="ka">GIF გამოსახულება</comment>
- <comment xml:lang="kk">GIF суреті</comment>
- <comment xml:lang="ko">GIF 그림</comment>
- <comment xml:lang="lt">GIF paveikslėlis</comment>
- <comment xml:lang="lv">GIF attēls</comment>
- <comment xml:lang="ms">Imej GIF</comment>
- <comment xml:lang="nb">GIF-bilde</comment>
- <comment xml:lang="nl">GIF-afbeelding</comment>
- <comment xml:lang="nn">GIF-bilete</comment>
- <comment xml:lang="oc">imatge GIF</comment>
- <comment xml:lang="pl">Obraz GIF</comment>
- <comment xml:lang="pt">imagem GIF</comment>
- <comment xml:lang="pt-BR">Imagem GIF</comment>
- <comment xml:lang="ro">Imagine GIF</comment>
- <comment xml:lang="ru">Изображение GIF</comment>
- <comment xml:lang="sk">Obrázok GIF</comment>
- <comment xml:lang="sl">Slikovna datoteka GIF</comment>
- <comment xml:lang="sq">Figurë GIF</comment>
- <comment xml:lang="sr">ГИФ слика</comment>
- <comment xml:lang="sv">GIF-bild</comment>
- <comment xml:lang="tr">GIF görüntüsü</comment>
- <comment xml:lang="uk">зображення GIF</comment>
+ <comment xml:lang="zh_TW">GIF 影像</comment>
+ <comment xml:lang="zh_CN">GIF 图像</comment>
<comment xml:lang="vi">Ảnh GIF</comment>
- <comment xml:lang="zh-CN">GIF 图像</comment>
- <comment xml:lang="zh-TW">GIF 影像</comment>
- <magic priority="50">
+ <comment xml:lang="uk">зображення GIF</comment>
+ <comment xml:lang="tr">GIF görüntüsü</comment>
+ <comment xml:lang="sv">GIF-bild</comment>
+ <comment xml:lang="sr">ГИФ слика</comment>
+ <comment xml:lang="sq">figurë GIF</comment>
+ <comment xml:lang="sl">Slikovna datoteka GIF</comment>
+ <comment xml:lang="si">GIF රූපය</comment>
+ <comment xml:lang="sk">Obrázok GIF</comment>
+ <comment xml:lang="ru">Изображение GIF</comment>
+ <comment xml:lang="ro">Imagine GIF</comment>
+ <comment xml:lang="pt_BR">Imagem GIF</comment>
+ <comment xml:lang="pt">imagem GIF</comment>
+ <comment xml:lang="pl">Obraz GIF</comment>
+ <comment xml:lang="oc">imatge GIF</comment>
+ <comment xml:lang="nn">GIF-bilete</comment>
+ <comment xml:lang="nl">GIF-afbeelding</comment>
+ <comment xml:lang="nb">GIF-bilde</comment>
+ <comment xml:lang="ms">Imej GIF</comment>
+ <comment xml:lang="lv">GIF attēls</comment>
+ <comment xml:lang="lt">GIF paveikslėlis</comment>
+ <comment xml:lang="ko">GIF 그림</comment>
+ <comment xml:lang="kk">GIF суреті</comment>
+ <comment xml:lang="ka">GIF გამოსახულება</comment>
+ <comment xml:lang="ja">GIF 画像</comment>
+ <comment xml:lang="it">Immagine GIF</comment>
+ <comment xml:lang="is">GIF mynd</comment>
+ <comment xml:lang="id">Citra GIF</comment>
+ <comment xml:lang="ia">Imagine GIF</comment>
+ <comment xml:lang="hu">GIF-kép</comment>
+ <comment xml:lang="hr">GIF slika</comment>
+ <comment xml:lang="he">תמונת GIF</comment>
+ <comment xml:lang="gl">imaxe GIF</comment>
+ <comment xml:lang="ga">íomhá GIF</comment>
+ <comment xml:lang="fur">imagjin GIF</comment>
+ <comment xml:lang="fr">image GIF</comment>
+ <comment xml:lang="fo">GIF mynd</comment>
+ <comment xml:lang="fi">GIF-kuva</comment>
+ <comment xml:lang="eu">GIF irudia</comment>
+ <comment xml:lang="es">imagen GIF</comment>
+ <comment xml:lang="eo">GIF-bildo</comment>
+ <comment xml:lang="en_GB">GIF image</comment>
+ <comment xml:lang="el">Εικόνα GIF</comment>
+ <comment xml:lang="de">GIF-Bild</comment>
+ <comment xml:lang="da">GIF-billede</comment>
+ <comment xml:lang="cy">Delwedd GIF</comment>
+ <comment xml:lang="cs">obrázek GIF</comment>
+ <comment xml:lang="ca">imatge GIF</comment>
+ <comment xml:lang="bg">Изображение — GIF</comment>
+ <comment xml:lang="be@latin">Vyjava GIF</comment>
+ <comment xml:lang="be">выява GIF</comment>
+ <comment xml:lang="az">GIF rəsmi</comment>
+ <comment xml:lang="ar">صورة GIF</comment>
+ <comment xml:lang="af">GIF-beeld</comment>
+ <acronym>GIF</acronym>
+ <expanded-acronym>Graphics Interchange Format</expanded-acronym>
+ <magic>
<match type="string" value="GIF8" offset="0"/>
</magic>
<glob pattern="*.gif"/>
</mime-type>
<mime-type type="image/heif">
<comment>HEIF image</comment>
- <comment xml:lang="af">HEIF-beeld</comment>
- <comment xml:lang="bg">Изображение — HEIF</comment>
- <comment xml:lang="ca">imatge HEIF</comment>
- <comment xml:lang="cs">obrázek HEIF</comment>
- <comment xml:lang="da">HEIF-billede</comment>
- <comment xml:lang="de">HEIF-Bild</comment>
- <comment xml:lang="en-GB">HEIF image</comment>
- <comment xml:lang="es">imagen HEIF</comment>
- <comment xml:lang="eu">HEIF irudia</comment>
- <comment xml:lang="fi">HEIF-kuva</comment>
- <comment xml:lang="fr">image HEIF</comment>
- <comment xml:lang="fur">imagjin HEIF</comment>
- <comment xml:lang="ga">íomhá HEIF</comment>
- <comment xml:lang="hr">HEIF slika</comment>
- <comment xml:lang="hu">HEIF kép</comment>
- <comment xml:lang="id">Citra HEIF</comment>
- <comment xml:lang="it">Immagine HEIF</comment>
- <comment xml:lang="kk">HEIF суреті</comment>
- <comment xml:lang="ko">HEIF 그림</comment>
- <comment xml:lang="pl">Obraz HEIF</comment>
- <comment xml:lang="pt-BR">Imagem HEIF</comment>
- <comment xml:lang="ru">Изображение HEIF</comment>
- <comment xml:lang="sk">Obrázok HEIF</comment>
- <comment xml:lang="sl">Slika HEIF</comment>
- <comment xml:lang="sv">HEIF-bild</comment>
- <comment xml:lang="tr">HEIF görüntüsü</comment>
+ <comment xml:lang="zh_TW">HEIF 影像</comment>
+ <comment xml:lang="zh_CN">HEIF 图像</comment>
<comment xml:lang="uk">зображення HEIF</comment>
- <comment xml:lang="zh-CN">HEIF 图像</comment>
- <comment xml:lang="zh-TW">HEIF 影像</comment>
+ <comment xml:lang="tr">HEIF görüntüsü</comment>
+ <comment xml:lang="sv">HEIF-bild</comment>
+ <comment xml:lang="sq">figurë HEIF</comment>
+ <comment xml:lang="sl">Slika HEIF</comment>
+ <comment xml:lang="si">HEIF රූපය</comment>
+ <comment xml:lang="sk">Obrázok HEIF</comment>
+ <comment xml:lang="ru">Изображение HEIF</comment>
+ <comment xml:lang="pt_BR">Imagem HEIF</comment>
+ <comment xml:lang="pl">Obraz HEIF</comment>
+ <comment xml:lang="nl">HEIF-afbeelding</comment>
+ <comment xml:lang="ko">HEIF 그림</comment>
+ <comment xml:lang="kk">HEIF суреті</comment>
+ <comment xml:lang="ja">HEIF 画像</comment>
+ <comment xml:lang="it">Immagine HEIF</comment>
+ <comment xml:lang="is">HEIF mynd</comment>
+ <comment xml:lang="id">Citra HEIF</comment>
+ <comment xml:lang="hu">HEIF kép</comment>
+ <comment xml:lang="hr">HEIF slika</comment>
+ <comment xml:lang="he">תמונת HEIF</comment>
+ <comment xml:lang="ga">íomhá HEIF</comment>
+ <comment xml:lang="fur">imagjin HEIF</comment>
+ <comment xml:lang="fr">image HEIF</comment>
+ <comment xml:lang="fi">HEIF-kuva</comment>
+ <comment xml:lang="eu">HEIF irudia</comment>
+ <comment xml:lang="es">imagen HEIF</comment>
+ <comment xml:lang="en_GB">HEIF image</comment>
+ <comment xml:lang="de">HEIF-Bild</comment>
+ <comment xml:lang="da">HEIF-billede</comment>
+ <comment xml:lang="cs">obrázek HEIF</comment>
+ <comment xml:lang="ca">imatge HEIF</comment>
+ <comment xml:lang="bg">Изображение — HEIF</comment>
+ <comment xml:lang="be">выява HEIF</comment>
+ <comment xml:lang="ar">صورة HEIF</comment>
+ <comment xml:lang="af">HEIF-beeld</comment>
<acronym>HEIF</acronym>
<expanded-acronym>High Efficiency Image File</expanded-acronym>
+ <magic priority="40">
+ <!-- less than AVIF due to ftypmif1 -->
+ <match type="string" value="ftypmif1" offset="4"/>
+ <match type="string" value="ftypmsf1" offset="4"/>
+ <match type="string" value="ftypheic" offset="4"/>
+ <match type="string" value="ftypheix" offset="4"/>
+ <match type="string" value="ftyphevc" offset="4"/>
+ <match type="string" value="ftyphevx" offset="4"/>
+ </magic>
<glob pattern="*.heic"/>
<glob pattern="*.heif"/>
+ <glob pattern="*.hif"/>
<alias type="image/heic"/>
<alias type="image/heic-sequence"/>
<alias type="image/heif-sequence"/>
</mime-type>
<mime-type type="image/ief">
<comment>IEF image</comment>
- <comment xml:lang="af">IEF-beeld</comment>
- <comment xml:lang="ar">صورة IEF</comment>
- <comment xml:lang="az">IEF rəsmi</comment>
- <comment xml:lang="be-Latn">Vyjava IEF</comment>
- <comment xml:lang="bg">Изображение — IEF</comment>
- <comment xml:lang="ca">imatge IEF</comment>
- <comment xml:lang="cs">obrázek IEF</comment>
- <comment xml:lang="cy">Delwedd IEF</comment>
- <comment xml:lang="da">IEF-billede</comment>
- <comment xml:lang="de">IEF-Bild</comment>
- <comment xml:lang="el">Εικόνα IEF</comment>
- <comment xml:lang="en-GB">IEF image</comment>
- <comment xml:lang="eo">IEF-bildo</comment>
- <comment xml:lang="es">imagen IEF</comment>
- <comment xml:lang="eu">IEF irudia</comment>
- <comment xml:lang="fi">IEF-kuva</comment>
- <comment xml:lang="fo">IEF mynd</comment>
- <comment xml:lang="fr">image IEF</comment>
- <comment xml:lang="fur">imagjin IEF</comment>
- <comment xml:lang="ga">íomhá IEF</comment>
- <comment xml:lang="gl">imaxe IEF</comment>
- <comment xml:lang="he">תמונת IEF</comment>
- <comment xml:lang="hr">IEF slika</comment>
- <comment xml:lang="hu">IEF-kép</comment>
- <comment xml:lang="ia">Imagine IEF</comment>
- <comment xml:lang="id">Citra IEF</comment>
- <comment xml:lang="it">Immagine IEF</comment>
- <comment xml:lang="ja">IEF 画像</comment>
- <comment xml:lang="kk">IEF суреті</comment>
- <comment xml:lang="ko">IEF 그림</comment>
- <comment xml:lang="lt">IEF paveikslėlis</comment>
- <comment xml:lang="lv">IEF attēls</comment>
- <comment xml:lang="ms">Imej IEF</comment>
- <comment xml:lang="nb">IEF-bilde</comment>
- <comment xml:lang="nl">IEF-afbeelding</comment>
- <comment xml:lang="nn">IEF-bilete</comment>
- <comment xml:lang="oc">imatge IEF</comment>
- <comment xml:lang="pl">Obraz IEF</comment>
- <comment xml:lang="pt">imagem IEF</comment>
- <comment xml:lang="pt-BR">Imagem IEF</comment>
- <comment xml:lang="ro">Imagine IEF</comment>
- <comment xml:lang="ru">Изображение IEF</comment>
- <comment xml:lang="sk">Obrázok IEF</comment>
- <comment xml:lang="sl">Slikovna datoteka IEF</comment>
- <comment xml:lang="sq">Figurë IEF</comment>
- <comment xml:lang="sr">ИЕФ слика</comment>
- <comment xml:lang="sv">IEF-bild</comment>
- <comment xml:lang="tr">IEF görüntüsü</comment>
- <comment xml:lang="uk">зображення IEF</comment>
+ <comment xml:lang="zh_TW">IEF 影像</comment>
+ <comment xml:lang="zh_CN">IEF 图像</comment>
<comment xml:lang="vi">Ảnh IEF</comment>
- <comment xml:lang="zh-CN">IEF 图像</comment>
- <comment xml:lang="zh-TW">IEF 影像</comment>
+ <comment xml:lang="uk">зображення IEF</comment>
+ <comment xml:lang="tr">IEF görüntüsü</comment>
+ <comment xml:lang="sv">IEF-bild</comment>
+ <comment xml:lang="sr">ИЕФ слика</comment>
+ <comment xml:lang="sq">figurë IEF</comment>
+ <comment xml:lang="sl">Slikovna datoteka IEF</comment>
+ <comment xml:lang="si">IEF රූපය</comment>
+ <comment xml:lang="sk">Obrázok IEF</comment>
+ <comment xml:lang="ru">Изображение IEF</comment>
+ <comment xml:lang="ro">Imagine IEF</comment>
+ <comment xml:lang="pt_BR">Imagem IEF</comment>
+ <comment xml:lang="pt">imagem IEF</comment>
+ <comment xml:lang="pl">Obraz IEF</comment>
+ <comment xml:lang="oc">imatge IEF</comment>
+ <comment xml:lang="nn">IEF-bilete</comment>
+ <comment xml:lang="nl">IEF-afbeelding</comment>
+ <comment xml:lang="nb">IEF-bilde</comment>
+ <comment xml:lang="ms">Imej IEF</comment>
+ <comment xml:lang="lv">IEF attēls</comment>
+ <comment xml:lang="lt">IEF paveikslėlis</comment>
+ <comment xml:lang="ko">IEF 그림</comment>
+ <comment xml:lang="kk">IEF суреті</comment>
+ <comment xml:lang="ja">IEF 画像</comment>
+ <comment xml:lang="it">Immagine IEF</comment>
+ <comment xml:lang="is">IEF mynd</comment>
+ <comment xml:lang="id">Citra IEF</comment>
+ <comment xml:lang="ia">Imagine IEF</comment>
+ <comment xml:lang="hu">IEF-kép</comment>
+ <comment xml:lang="hr">IEF slika</comment>
+ <comment xml:lang="he">תמונת IEF</comment>
+ <comment xml:lang="gl">imaxe IEF</comment>
+ <comment xml:lang="ga">íomhá IEF</comment>
+ <comment xml:lang="fur">imagjin IEF</comment>
+ <comment xml:lang="fr">image IEF</comment>
+ <comment xml:lang="fo">IEF mynd</comment>
+ <comment xml:lang="fi">IEF-kuva</comment>
+ <comment xml:lang="eu">IEF irudia</comment>
+ <comment xml:lang="es">imagen IEF</comment>
+ <comment xml:lang="eo">IEF-bildo</comment>
+ <comment xml:lang="en_GB">IEF image</comment>
+ <comment xml:lang="el">Εικόνα IEF</comment>
+ <comment xml:lang="de">IEF-Bild</comment>
+ <comment xml:lang="da">IEF-billede</comment>
+ <comment xml:lang="cy">Delwedd IEF</comment>
+ <comment xml:lang="cs">obrázek IEF</comment>
+ <comment xml:lang="ca">imatge IEF</comment>
+ <comment xml:lang="bg">Изображение — IEF</comment>
+ <comment xml:lang="be@latin">Vyjava IEF</comment>
+ <comment xml:lang="be">выява IEF</comment>
+ <comment xml:lang="az">IEF rəsmi</comment>
+ <comment xml:lang="ar">صورة IEF</comment>
+ <comment xml:lang="af">IEF-beeld</comment>
<glob pattern="*.ief"/>
</mime-type>
<mime-type type="image/jpeg">
<comment>JPEG image</comment>
- <comment xml:lang="af">JPEG-beeld</comment>
- <comment xml:lang="ar">صورة JPEG</comment>
- <comment xml:lang="az">JPEG rəsmi</comment>
- <comment xml:lang="be-Latn">Vyjava JPEG</comment>
- <comment xml:lang="bg">Изображение — JPEG</comment>
- <comment xml:lang="ca">imatge JPEG</comment>
- <comment xml:lang="cs">obrázek JPEG</comment>
- <comment xml:lang="cy">Delwedd JPEG</comment>
- <comment xml:lang="da">JPEG-billede</comment>
- <comment xml:lang="de">JPEG-Bild</comment>
- <comment xml:lang="el">Εικόνα JPEG</comment>
- <comment xml:lang="en-GB">JPEG image</comment>
- <comment xml:lang="eo">JPEG-bildo</comment>
- <comment xml:lang="es">imagen JPEG</comment>
- <comment xml:lang="eu">JPEG irudia</comment>
- <comment xml:lang="fi">JPEG-kuva</comment>
- <comment xml:lang="fo">JPEG mynd</comment>
- <comment xml:lang="fr">image JPEG</comment>
- <comment xml:lang="fur">imagjin JPEG</comment>
- <comment xml:lang="ga">íomhá JPEG</comment>
- <comment xml:lang="gl">imaxe JPEG</comment>
- <comment xml:lang="he">תמונת JPEG</comment>
- <comment xml:lang="hr">JPEG slika</comment>
- <comment xml:lang="hu">JPEG-kép</comment>
- <comment xml:lang="ia">Imagine JPEG</comment>
- <comment xml:lang="id">Citra JPEG</comment>
- <comment xml:lang="it">Immagine JPEG</comment>
- <comment xml:lang="ja">JPEG 画像 </comment>
- <comment xml:lang="kk">JPEG суреті</comment>
- <comment xml:lang="ko">JPEG 그림</comment>
- <comment xml:lang="lt">JPEG paveikslėlis</comment>
- <comment xml:lang="lv">JPEG attēls</comment>
- <comment xml:lang="ms">Imej JPEG</comment>
- <comment xml:lang="nb">JPEG-bilde</comment>
- <comment xml:lang="nl">JPEG-afbeelding</comment>
- <comment xml:lang="nn">JPEG-bilete</comment>
- <comment xml:lang="oc">imatge JPEG</comment>
- <comment xml:lang="pl">Obraz JPEG</comment>
- <comment xml:lang="pt">imagem JPEG</comment>
- <comment xml:lang="pt-BR">Imagem JPEG</comment>
- <comment xml:lang="ro">Imagine JPEG</comment>
- <comment xml:lang="ru">Изображение JPEG</comment>
- <comment xml:lang="sk">Obrázok JPEG</comment>
- <comment xml:lang="sl">Slikovna datoteka JPEG</comment>
- <comment xml:lang="sq">Figurë JPEG</comment>
- <comment xml:lang="sr">ЈПЕГ слика</comment>
- <comment xml:lang="sv">JPEG-bild</comment>
- <comment xml:lang="tr">JPEG görüntüsü</comment>
- <comment xml:lang="uk">зображення JPEG</comment>
+ <comment xml:lang="zh_TW">JPEG 影像</comment>
+ <comment xml:lang="zh_CN">JPEG 图像</comment>
<comment xml:lang="vi">Ảnh JPEG</comment>
- <comment xml:lang="zh-CN">JPEG 图像</comment>
- <comment xml:lang="zh-TW">JPEG 影像</comment>
- <magic priority="50">
+ <comment xml:lang="uk">зображення JPEG</comment>
+ <comment xml:lang="tr">JPEG görüntüsü</comment>
+ <comment xml:lang="sv">JPEG-bild</comment>
+ <comment xml:lang="sr">ЈПЕГ слика</comment>
+ <comment xml:lang="sq">figurë JPEG</comment>
+ <comment xml:lang="sl">Slikovna datoteka JPEG</comment>
+ <comment xml:lang="si">JPEG රූපය</comment>
+ <comment xml:lang="sk">Obrázok JPEG</comment>
+ <comment xml:lang="ru">Изображение JPEG</comment>
+ <comment xml:lang="ro">Imagine JPEG</comment>
+ <comment xml:lang="pt_BR">Imagem JPEG</comment>
+ <comment xml:lang="pt">imagem JPEG</comment>
+ <comment xml:lang="pl">Obraz JPEG</comment>
+ <comment xml:lang="oc">imatge JPEG</comment>
+ <comment xml:lang="nn">JPEG-bilete</comment>
+ <comment xml:lang="nl">JPEG-afbeelding</comment>
+ <comment xml:lang="nb">JPEG-bilde</comment>
+ <comment xml:lang="ms">Imej JPEG</comment>
+ <comment xml:lang="lv">JPEG attēls</comment>
+ <comment xml:lang="lt">JPEG paveikslėlis</comment>
+ <comment xml:lang="ko">JPEG 그림</comment>
+ <comment xml:lang="kk">JPEG суреті</comment>
+ <comment xml:lang="ka">JPEG გამოსახულება</comment>
+ <comment xml:lang="ja">JPEG 画像 </comment>
+ <comment xml:lang="it">Immagine JPEG</comment>
+ <comment xml:lang="is">JPEG mynd</comment>
+ <comment xml:lang="id">Citra JPEG</comment>
+ <comment xml:lang="ia">Imagine JPEG</comment>
+ <comment xml:lang="hu">JPEG-kép</comment>
+ <comment xml:lang="hr">JPEG slika</comment>
+ <comment xml:lang="he">תמונת JPEG</comment>
+ <comment xml:lang="gl">imaxe JPEG</comment>
+ <comment xml:lang="ga">íomhá JPEG</comment>
+ <comment xml:lang="fur">imagjin JPEG</comment>
+ <comment xml:lang="fr">image JPEG</comment>
+ <comment xml:lang="fo">JPEG mynd</comment>
+ <comment xml:lang="fi">JPEG-kuva</comment>
+ <comment xml:lang="eu">JPEG irudia</comment>
+ <comment xml:lang="es">imagen JPEG</comment>
+ <comment xml:lang="eo">JPEG-bildo</comment>
+ <comment xml:lang="en_GB">JPEG image</comment>
+ <comment xml:lang="el">Εικόνα JPEG</comment>
+ <comment xml:lang="de">JPEG-Bild</comment>
+ <comment xml:lang="da">JPEG-billede</comment>
+ <comment xml:lang="cy">Delwedd JPEG</comment>
+ <comment xml:lang="cs">obrázek JPEG</comment>
+ <comment xml:lang="ca">imatge JPEG</comment>
+ <comment xml:lang="bg">Изображение — JPEG</comment>
+ <comment xml:lang="be@latin">Vyjava JPEG</comment>
+ <comment xml:lang="be">выява JPEG</comment>
+ <comment xml:lang="az">JPEG rəsmi</comment>
+ <comment xml:lang="ar">صورة JPEG</comment>
+ <comment xml:lang="af">JPEG-beeld</comment>
+ <acronym>JPEG</acronym>
+ <expanded-acronym>Joint Photographic Experts Group</expanded-acronym>
+ <magic>
<match type="string" value="\377\330\377" offset="0"/>
<match type="big16" value="0xffd8" offset="0"/>
</magic>
<glob pattern="*.jpg"/>
<glob pattern="*.jpeg"/>
<glob pattern="*.jpe"/>
+ <glob pattern="*.jfif"/>
<alias type="image/pjpeg"/>
</mime-type>
<mime-type type="video/x-mjpeg">
<comment>MJPEG video stream</comment>
- <comment xml:lang="af">MJPEG-videostroom</comment>
- <comment xml:lang="bg">Поток — MJPEG, видео</comment>
- <comment xml:lang="ca">flux de vídeo MJPEG</comment>
- <comment xml:lang="cs">datový tok videa MJPEG</comment>
- <comment xml:lang="da">MJPEG-videostrøm</comment>
- <comment xml:lang="de">MJPEG-Videodatenstrom</comment>
- <comment xml:lang="en-GB">MJPEG video stream</comment>
- <comment xml:lang="es">videotransmisión MJPEG</comment>
- <comment xml:lang="eu">MJPEG bideo korrontea</comment>
- <comment xml:lang="fi">MJPEG-videon suoratoisto</comment>
- <comment xml:lang="fr">flux vidéo MJPEG</comment>
- <comment xml:lang="fur">trasmission video MJPEG</comment>
- <comment xml:lang="ga">sruth físe MJPEG</comment>
- <comment xml:lang="hr">Prijenos MJPEG videa</comment>
- <comment xml:lang="hu">MJPEG videofolyam</comment>
- <comment xml:lang="id">Stream video MJPEG</comment>
- <comment xml:lang="it">Stream video MJPEG</comment>
- <comment xml:lang="kk">MJPEG видео ағыны</comment>
- <comment xml:lang="ko">MJPEG 비디오 스트림</comment>
- <comment xml:lang="pl">Strumień wideo MJPEG</comment>
- <comment xml:lang="pt-BR">Fluxo de vídeo MPEG</comment>
- <comment xml:lang="ru">Видеопоток MJPEG</comment>
- <comment xml:lang="sk">Stream videa MJPEG</comment>
- <comment xml:lang="sv">MJPEG-videoström</comment>
- <comment xml:lang="tr">MJPEG video akışı</comment>
+ <comment xml:lang="zh_TW">MJPEG 視訊串流</comment>
+ <comment xml:lang="zh_CN">MJPEG 视频流</comment>
<comment xml:lang="uk">відеопотік MJPEG</comment>
- <comment xml:lang="zh-CN">MJPEG 视频流</comment>
- <comment xml:lang="zh-TW">MJPEG 視訊串流</comment>
+ <comment xml:lang="tr">MJPEG video akışı</comment>
+ <comment xml:lang="sv">MJPEG-videoström</comment>
+ <comment xml:lang="sq">transmetim video MJEPG</comment>
+ <comment xml:lang="si">MJPEG වීඩියෝ ප්‍රවාහය</comment>
+ <comment xml:lang="sk">Stream videa MJPEG</comment>
+ <comment xml:lang="ru">Видеопоток MJPEG</comment>
+ <comment xml:lang="pt_BR">Fluxo de vídeo MPEG</comment>
+ <comment xml:lang="pl">Strumień wideo MJPEG</comment>
+ <comment xml:lang="nl">MJPEG-video-stream</comment>
+ <comment xml:lang="lt">MJPEG vaizdo srautas</comment>
+ <comment xml:lang="ko">MJPEG 동영상 스트림</comment>
+ <comment xml:lang="kk">MJPEG видео ағыны</comment>
+ <comment xml:lang="ja">MJPEG 動画ストリーム</comment>
+ <comment xml:lang="it">Stream video MJPEG</comment>
+ <comment xml:lang="is">MJPEG myndmerkisstreymi</comment>
+ <comment xml:lang="id">Stream video MJPEG</comment>
+ <comment xml:lang="hu">MJPEG videofolyam</comment>
+ <comment xml:lang="hr">Prijenos MJPEG videa</comment>
+ <comment xml:lang="he">תזרים וידאו MJPEG</comment>
+ <comment xml:lang="ga">sruth físe MJPEG</comment>
+ <comment xml:lang="fur">trasmission video MJPEG</comment>
+ <comment xml:lang="fr">flux vidéo MJPEG</comment>
+ <comment xml:lang="fi">MJPEG-videon suoratoisto</comment>
+ <comment xml:lang="eu">MJPEG bideo korrontea</comment>
+ <comment xml:lang="es">videotransmisión MJPEG</comment>
+ <comment xml:lang="en_GB">MJPEG video stream</comment>
+ <comment xml:lang="de">MJPEG-Videodatenstrom</comment>
+ <comment xml:lang="da">MJPEG-videostrøm</comment>
+ <comment xml:lang="cs">datový tok videa MJPEG</comment>
+ <comment xml:lang="ca">flux de vídeo MJPEG</comment>
+ <comment xml:lang="bg">Поток — MJPEG, видео</comment>
+ <comment xml:lang="be">плынь відэа MJPEG</comment>
+ <comment xml:lang="ar">دفق فيديو MJPEG</comment>
+ <comment xml:lang="af">MJPEG-videostroom</comment>
<acronym>MJPEG</acronym>
<expanded-acronym>Motion JPEG</expanded-acronym>
<sub-class-of type="image/jpeg"/>
@@ -26341,34 +27719,41 @@ command to generate the output files.
</mime-type>
<mime-type type="image/x-jp2-codestream">
<comment>JPEG-2000 codestream</comment>
- <comment xml:lang="bg">Поток — JPEG-2000, кодирано</comment>
- <comment xml:lang="ca">flux de codis JPEG-2000</comment>
- <comment xml:lang="cs">datový tok JPEG-2000</comment>
- <comment xml:lang="da">JPEG-2000-kodestrøm</comment>
- <comment xml:lang="de">JPEG-2000 Codestream</comment>
- <comment xml:lang="en-GB">JPEG-2000 codestream</comment>
- <comment xml:lang="es">secuencia de código JPEG-2000</comment>
- <comment xml:lang="eu">JPEG-2000 kodekorrontea</comment>
- <comment xml:lang="fi">JPEG-2000-koodivirta</comment>
- <comment xml:lang="fr">flux de code JPEG-2000</comment>
- <comment xml:lang="fur">trasmission codiç JPEG-2000</comment>
- <comment xml:lang="ga">códsruth JPEG-2000</comment>
- <comment xml:lang="hr">JPEG-2000 kôd strujanja</comment>
- <comment xml:lang="hu">JPEG-2000 kódfolyam</comment>
- <comment xml:lang="id">Codestream JPEG-2000</comment>
- <comment xml:lang="it">Codestream JPEG-2000</comment>
- <comment xml:lang="kk">JPEG-2000 код ағыны</comment>
- <comment xml:lang="ko">JPEG-2000 코드스트림</comment>
- <comment xml:lang="pl">Strumień kodu JPEG-2000</comment>
- <comment xml:lang="pt-BR">Imagem JPEG-2000</comment>
- <comment xml:lang="ru">Кодовый поток JPEG-2000</comment>
- <comment xml:lang="sk">JPEG-2000 codestream</comment>
- <comment xml:lang="sv">JPEG-2000-kodström</comment>
- <comment xml:lang="tr">JPEG-2000 codestream</comment>
+ <comment xml:lang="zh_TW">JPEG-2000 代碼串流</comment>
+ <comment xml:lang="zh_CN">JPEG-2000 码流</comment>
<comment xml:lang="uk">потік коду JPEG-2000</comment>
- <comment xml:lang="zh-CN">JPEG-2000 码流</comment>
- <comment xml:lang="zh-TW">JPEG-2000 代碼串流</comment>
- <magic priority="50">
+ <comment xml:lang="tr">JPEG-2000 codestream</comment>
+ <comment xml:lang="sv">JPEG-2000-kodström</comment>
+ <comment xml:lang="si">JPEG-2000 කේත ප්‍රවාහය</comment>
+ <comment xml:lang="sk">JPEG-2000 codestream</comment>
+ <comment xml:lang="ru">Кодовый поток JPEG-2000</comment>
+ <comment xml:lang="pt_BR">Imagem JPEG-2000</comment>
+ <comment xml:lang="pl">Strumień kodu JPEG-2000</comment>
+ <comment xml:lang="nl">JPEG-2000-codestream</comment>
+ <comment xml:lang="ko">JPEG-2000 코드스트림</comment>
+ <comment xml:lang="kk">JPEG-2000 код ағыны</comment>
+ <comment xml:lang="ja">JPEG-2000 コードストリーム</comment>
+ <comment xml:lang="it">Codestream JPEG-2000</comment>
+ <comment xml:lang="is">JPEG-2000 kóðastreymi</comment>
+ <comment xml:lang="id">Codestream JPEG-2000</comment>
+ <comment xml:lang="hu">JPEG-2000 kódfolyam</comment>
+ <comment xml:lang="hr">JPEG-2000 kôd strujanja</comment>
+ <comment xml:lang="he">תזרים קוד JPEG-2000</comment>
+ <comment xml:lang="ga">códsruth JPEG-2000</comment>
+ <comment xml:lang="fur">trasmission codiç JPEG-2000</comment>
+ <comment xml:lang="fr">flux de code JPEG-2000</comment>
+ <comment xml:lang="fi">JPEG-2000-koodivirta</comment>
+ <comment xml:lang="eu">JPEG-2000 kodekorrontea</comment>
+ <comment xml:lang="es">secuencia de código JPEG-2000</comment>
+ <comment xml:lang="en_GB">JPEG-2000 codestream</comment>
+ <comment xml:lang="de">JPEG-2000 Codestream</comment>
+ <comment xml:lang="da">JPEG-2000-kodestrøm</comment>
+ <comment xml:lang="cs">datový tok JPEG-2000</comment>
+ <comment xml:lang="ca">flux de codis JPEG-2000</comment>
+ <comment xml:lang="bg">Поток — JPEG-2000, кодирано</comment>
+ <comment xml:lang="be">плынь кода JPEG-2000</comment>
+ <comment xml:lang="ar">تيار شفرة JPEG-2000</comment>
+ <magic>
<match type="big32" value="0xff4fff51" offset="0"/>
</magic>
<glob pattern="*.j2c"/>
@@ -26377,41 +27762,50 @@ command to generate the output files.
</mime-type>
<mime-type type="image/jp2">
<comment>JPEG-2000 JP2 image</comment>
- <comment xml:lang="af">JPEG-2000 JP2-beeld</comment>
- <comment xml:lang="bg">Изображение — JPEG-2000 JP2</comment>
- <comment xml:lang="ca">imatge JPEG-2000 JP2</comment>
- <comment xml:lang="cs">obrázek JPEG-2000 JP2</comment>
- <comment xml:lang="da">JPEG-2000 JP2-billede</comment>
- <comment xml:lang="de">JPEG-2000 JP2-Bild</comment>
- <comment xml:lang="en-GB">JPEG-2000 JP2 image</comment>
- <comment xml:lang="es">imagen JPEG-2000 JP2</comment>
- <comment xml:lang="eu">JPEG-2000 JP2 irudia</comment>
- <comment xml:lang="fi">JPEG-2000 JP2 -kuva</comment>
- <comment xml:lang="fr">image JPEG-2000 JP2</comment>
- <comment xml:lang="fur">imagjin JPEG-2000 JP2</comment>
- <comment xml:lang="ga">íomhá JPEG-2000 JP2</comment>
- <comment xml:lang="hr">JPEG-2000 JP2 slika</comment>
- <comment xml:lang="hu">JPEG-2000 JP2 kép</comment>
- <comment xml:lang="id">Citra JPEG-2000 JP2</comment>
- <comment xml:lang="it">Immagine JPEG-2000 JP2</comment>
- <comment xml:lang="kk">JPEG-2000 JP2 суреті</comment>
- <comment xml:lang="ko">JPEG-2000 JP2 그림</comment>
- <comment xml:lang="pl">Obraz JP2 JPEG-2000</comment>
- <comment xml:lang="pt-BR">Imagem JP2 de JPEG-2000</comment>
- <comment xml:lang="ru">Изоражение JPEG-2000 JP2</comment>
- <comment xml:lang="sk">Obrázok JPEG-2000 JP2</comment>
- <comment xml:lang="sl">Slika JPEG-2000 JP2</comment>
- <comment xml:lang="sv">JPEG-2000 JP2-bild</comment>
- <comment xml:lang="tr">JPEG-2000 JP2 görüntüsü</comment>
+ <comment xml:lang="zh_TW">JPEG-2000 JP2 影像</comment>
+ <comment xml:lang="zh_CN">JPEG-2000 JP2 图像</comment>
<comment xml:lang="uk">зображення JP2 JPEG-2000</comment>
- <comment xml:lang="zh-CN">JPEG-2000 JP2 图像</comment>
- <comment xml:lang="zh-TW">JPEG-2000 JP2 影像</comment>
+ <comment xml:lang="tr">JPEG-2000 JP2 görüntüsü</comment>
+ <comment xml:lang="sv">JPEG-2000 JP2-bild</comment>
+ <comment xml:lang="sq">figurë JPEG-2000 JP2</comment>
+ <comment xml:lang="sl">Slika JPEG-2000 JP2</comment>
+ <comment xml:lang="si">JPEG-2000 JP2 රූපය</comment>
+ <comment xml:lang="sk">Obrázok JPEG-2000 JP2</comment>
+ <comment xml:lang="ru">Изображение JPEG-2000 JP2</comment>
+ <comment xml:lang="pt_BR">Imagem JP2 de JPEG-2000</comment>
+ <comment xml:lang="pl">Obraz JP2 JPEG-2000</comment>
+ <comment xml:lang="oc">imatge JPEG-2000 JP2</comment>
+ <comment xml:lang="nl">JPEG-2000 JP2-afbeelding</comment>
+ <comment xml:lang="ko">JPEG-2000 JP2 그림</comment>
+ <comment xml:lang="kk">JPEG-2000 JP2 суреті</comment>
+ <comment xml:lang="ja">JPEG-2000 JP2 画像</comment>
+ <comment xml:lang="it">Immagine JPEG-2000 JP2</comment>
+ <comment xml:lang="is">JPEG-2000 JP2 mynd</comment>
+ <comment xml:lang="id">Citra JPEG-2000 JP2</comment>
+ <comment xml:lang="hu">JPEG-2000 JP2 kép</comment>
+ <comment xml:lang="hr">JPEG-2000 JP2 slika</comment>
+ <comment xml:lang="he">תמונת JP2 של JPEG-2000</comment>
+ <comment xml:lang="ga">íomhá JPEG-2000 JP2</comment>
+ <comment xml:lang="fur">imagjin JPEG-2000 JP2</comment>
+ <comment xml:lang="fr">image JPEG-2000 JP2</comment>
+ <comment xml:lang="fi">JPEG-2000 JP2 -kuva</comment>
+ <comment xml:lang="eu">JPEG-2000 JP2 irudia</comment>
+ <comment xml:lang="es">imagen JPEG-2000 JP2</comment>
+ <comment xml:lang="en_GB">JPEG-2000 JP2 image</comment>
+ <comment xml:lang="de">JPEG-2000 JP2-Bild</comment>
+ <comment xml:lang="da">JPEG-2000 JP2-billede</comment>
+ <comment xml:lang="cs">obrázek JPEG-2000 JP2</comment>
+ <comment xml:lang="ca">imatge JPEG-2000 JP2</comment>
+ <comment xml:lang="bg">Изображение — JPEG-2000 JP2</comment>
+ <comment xml:lang="be">выява JPEG-2000 JP2</comment>
+ <comment xml:lang="ar">صورة JPEG-2000 JP2</comment>
+ <comment xml:lang="af">JPEG-2000 JP2-beeld</comment>
<acronym>JP2</acronym>
<expanded-acronym>JPEG-2000</expanded-acronym>
<alias type="image/jpeg2000"/>
<alias type="image/jpeg2000-image"/>
<alias type="image/x-jpeg2000-image"/>
- <magic priority="50">
+ <magic>
<match type="string" mask="0xffffffffffffffffffffffff0000000000000000ffffffff" value="\x00\x00\x00\x0c\x6a\x50\x20\x20\x0d\x0a\x87\x0a jp2\x20" offset="0"/>
</magic>
<glob pattern="*.jp2"/>
@@ -26419,38 +27813,47 @@ command to generate the output files.
</mime-type>
<mime-type type="image/jpx">
<comment>JPEG-2000 JPX image</comment>
- <comment xml:lang="af">JPEG-2000 JPX-beeld</comment>
- <comment xml:lang="bg">Изображение — JPEG-2000 JPX</comment>
- <comment xml:lang="ca">imatge JPEG-2000 JPX</comment>
- <comment xml:lang="cs">obrázek JPEG-2000 JPX</comment>
- <comment xml:lang="da">JPEG-2000 JPX-billede</comment>
- <comment xml:lang="de">JPEG-2000 JPX-Bild</comment>
- <comment xml:lang="en-GB">JPEG-2000 JPX image</comment>
- <comment xml:lang="es">imagen JPEG-2000 JPX</comment>
- <comment xml:lang="eu">JPEG-2000 JPX irudia</comment>
- <comment xml:lang="fi">JPEG-2000 JPX -kuva</comment>
- <comment xml:lang="fr">image JPEG-2000 JPX</comment>
- <comment xml:lang="fur">imagjinJPEG-2000 JPX</comment>
- <comment xml:lang="ga">íomhá JPEG-2000 JPX</comment>
- <comment xml:lang="hr">JPEG-2000 JPX slika</comment>
- <comment xml:lang="hu">JPEG-2000 JPX kép</comment>
- <comment xml:lang="id">Citra JPEG-2000 JPX</comment>
- <comment xml:lang="it">Immagine JPEG-2000 JPX</comment>
- <comment xml:lang="kk">JPEG-2000 JPX суреті</comment>
- <comment xml:lang="ko">JPEG-2000 JPX 그림</comment>
- <comment xml:lang="pl">Obraz JPX JPEG-2000</comment>
- <comment xml:lang="pt-BR">Imagem JPX de JPEG-2000</comment>
- <comment xml:lang="ru">Изображение JPEG-2000 JPX</comment>
- <comment xml:lang="sk">Obrázok JPEG-2000 JPX</comment>
- <comment xml:lang="sl">Slika JPEG-2000 JPX</comment>
- <comment xml:lang="sv">JPEG-2000 JPX-bild</comment>
- <comment xml:lang="tr">JPEG-2000 JPX görüntüsü</comment>
+ <comment xml:lang="zh_TW">JPEG-2000 JPX 影像</comment>
+ <comment xml:lang="zh_CN">JPEG-2000 JPX 图像</comment>
<comment xml:lang="uk">зображення JPX JPEG-2000</comment>
- <comment xml:lang="zh-CN">JPEG-2000 JPX 图像</comment>
- <comment xml:lang="zh-TW">JPEG-2000 JPX 影像</comment>
+ <comment xml:lang="tr">JPEG-2000 JPX görüntüsü</comment>
+ <comment xml:lang="sv">JPEG-2000 JPX-bild</comment>
+ <comment xml:lang="sq"> image JPEG-2000 JPX</comment>
+ <comment xml:lang="sl">Slika JPEG-2000 JPX</comment>
+ <comment xml:lang="si">JPEG-2000 JPX රූපය</comment>
+ <comment xml:lang="sk">Obrázok JPEG-2000 JPX</comment>
+ <comment xml:lang="ru">Изображение JPEG-2000 JPX</comment>
+ <comment xml:lang="pt_BR">Imagem JPX de JPEG-2000</comment>
+ <comment xml:lang="pl">Obraz JPX JPEG-2000</comment>
+ <comment xml:lang="oc">imatge JPEG-2000 JPX</comment>
+ <comment xml:lang="nl">JPEG-2000 JPX-afbeelding</comment>
+ <comment xml:lang="ko">JPEG-2000 JPX 그림</comment>
+ <comment xml:lang="kk">JPEG-2000 JPX суреті</comment>
+ <comment xml:lang="ja">JPEG-2000 JPX 画像</comment>
+ <comment xml:lang="it">Immagine JPEG-2000 JPX</comment>
+ <comment xml:lang="is">JPEG-2000 JPX mynd</comment>
+ <comment xml:lang="id">Citra JPEG-2000 JPX</comment>
+ <comment xml:lang="hu">JPEG-2000 JPX kép</comment>
+ <comment xml:lang="hr">JPEG-2000 JPX slika</comment>
+ <comment xml:lang="he">תמונת JPX של JPEG-2000</comment>
+ <comment xml:lang="ga">íomhá JPEG-2000 JPX</comment>
+ <comment xml:lang="fur">imagjinJPEG-2000 JPX</comment>
+ <comment xml:lang="fr">image JPEG-2000 JPX</comment>
+ <comment xml:lang="fi">JPEG-2000 JPX -kuva</comment>
+ <comment xml:lang="eu">JPEG-2000 JPX irudia</comment>
+ <comment xml:lang="es">imagen JPEG-2000 JPX</comment>
+ <comment xml:lang="en_GB">JPEG-2000 JPX image</comment>
+ <comment xml:lang="de">JPEG-2000 JPX-Bild</comment>
+ <comment xml:lang="da">JPEG-2000 JPX-billede</comment>
+ <comment xml:lang="cs">obrázek JPEG-2000 JPX</comment>
+ <comment xml:lang="ca">imatge JPEG-2000 JPX</comment>
+ <comment xml:lang="bg">Изображение — JPEG-2000 JPX</comment>
+ <comment xml:lang="be">выява JPEG-2000 JPX</comment>
+ <comment xml:lang="ar">صورة JPEG-2000 JPX</comment>
+ <comment xml:lang="af">JPEG-2000 JPX-beeld</comment>
<acronym>JPX</acronym>
<expanded-acronym>JPEG-2000 eXtended</expanded-acronym>
- <magic priority="50">
+ <magic>
<match type="string" mask="0xffffffffffffffffffffffff0000000000000000ffffffff" value="\x00\x00\x00\x0c\x6a\x50\x20\x20\x0d\x0a\x87\x0a jpx\x20" offset="0"/>
</magic>
<glob pattern="*.jpf"/>
@@ -26458,38 +27861,47 @@ command to generate the output files.
</mime-type>
<mime-type type="image/jpm">
<comment>JPEG-2000 JPM image</comment>
- <comment xml:lang="af">JPEG-2000 JPM-beeld</comment>
- <comment xml:lang="bg">Изображение — JPEG-2000 JPM</comment>
- <comment xml:lang="ca">imatge JPEG-2000 JPM</comment>
- <comment xml:lang="cs">obrázek JPEG-2000 JPM</comment>
- <comment xml:lang="da">JPEG-2000 JPM-billede</comment>
- <comment xml:lang="de">JPEG-2000 JPM-Bild</comment>
- <comment xml:lang="en-GB">JPEG-2000 JPM image</comment>
- <comment xml:lang="es">imagen JPEG-2000 JPM</comment>
- <comment xml:lang="eu">JPEG-2000 JPM irudia</comment>
- <comment xml:lang="fi">JPEG-2000 JPM -kuva</comment>
- <comment xml:lang="fr">image JPEG-2000 JPM</comment>
- <comment xml:lang="fur">imagjin JPEG-2000 JPM</comment>
- <comment xml:lang="ga">íomhá JPEG-2000 JPM</comment>
- <comment xml:lang="hr">JPEG-2000 JPM slika</comment>
- <comment xml:lang="hu">JPEG-2000 JPM kép</comment>
- <comment xml:lang="id">Citra JPEG-2000 JPM</comment>
- <comment xml:lang="it">Immagine JPEG-2000 JPM</comment>
- <comment xml:lang="kk">JPEG-2000 JPM суреті</comment>
- <comment xml:lang="ko">JPEG-2000 JPM 그림</comment>
- <comment xml:lang="pl">Obraz JPM JPEG-2000</comment>
- <comment xml:lang="pt-BR">Imagem JPM de JPEG-2000</comment>
- <comment xml:lang="ru">Изображение JPEG-2000 JPM</comment>
- <comment xml:lang="sk">Obrázok JPEG-2000 JPM</comment>
- <comment xml:lang="sl">Slika JPEG-2000 JPM</comment>
- <comment xml:lang="sv">JPEG-2000 JPM-bild</comment>
- <comment xml:lang="tr">JPEG-2000 JPM görüntüsü</comment>
+ <comment xml:lang="zh_TW">JPEG-2000 JPM 影像</comment>
+ <comment xml:lang="zh_CN">JPEG-2000 JPM 图像</comment>
<comment xml:lang="uk">зображення JPM JPEG-2000</comment>
- <comment xml:lang="zh-CN">JPEG-2000 JPM 图像</comment>
- <comment xml:lang="zh-TW">JPEG-2000 JPM 影像</comment>
+ <comment xml:lang="tr">JPEG-2000 JPM görüntüsü</comment>
+ <comment xml:lang="sv">JPEG-2000 JPM-bild</comment>
+ <comment xml:lang="sq">figurë JPEG-2000 JPM</comment>
+ <comment xml:lang="sl">Slika JPEG-2000 JPM</comment>
+ <comment xml:lang="si">JPEG-2000 JPM රූපය</comment>
+ <comment xml:lang="sk">Obrázok JPEG-2000 JPM</comment>
+ <comment xml:lang="ru">Изображение JPEG-2000 JPM</comment>
+ <comment xml:lang="pt_BR">Imagem JPM de JPEG-2000</comment>
+ <comment xml:lang="pl">Obraz JPM JPEG-2000</comment>
+ <comment xml:lang="oc">imatge JPEG-2000 JPM</comment>
+ <comment xml:lang="nl">JPEG-2000 JPM-afbeelding</comment>
+ <comment xml:lang="ko">JPEG-2000 JPM 그림</comment>
+ <comment xml:lang="kk">JPEG-2000 JPM суреті</comment>
+ <comment xml:lang="ja">JPEG-2000 JPM 画像</comment>
+ <comment xml:lang="it">Immagine JPEG-2000 JPM</comment>
+ <comment xml:lang="is">JPEG-2000 JPM mynd</comment>
+ <comment xml:lang="id">Citra JPEG-2000 JPM</comment>
+ <comment xml:lang="hu">JPEG-2000 JPM kép</comment>
+ <comment xml:lang="hr">JPEG-2000 JPM slika</comment>
+ <comment xml:lang="he">תמונת JPM של JPEG-2000</comment>
+ <comment xml:lang="ga">íomhá JPEG-2000 JPM</comment>
+ <comment xml:lang="fur">imagjin JPEG-2000 JPM</comment>
+ <comment xml:lang="fr">image JPEG-2000 JPM</comment>
+ <comment xml:lang="fi">JPEG-2000 JPM -kuva</comment>
+ <comment xml:lang="eu">JPEG-2000 JPM irudia</comment>
+ <comment xml:lang="es">imagen JPEG-2000 JPM</comment>
+ <comment xml:lang="en_GB">JPEG-2000 JPM image</comment>
+ <comment xml:lang="de">JPEG-2000 JPM-Bild</comment>
+ <comment xml:lang="da">JPEG-2000 JPM-billede</comment>
+ <comment xml:lang="cs">obrázek JPEG-2000 JPM</comment>
+ <comment xml:lang="ca">imatge JPEG-2000 JPM</comment>
+ <comment xml:lang="bg">Изображение — JPEG-2000 JPM</comment>
+ <comment xml:lang="be">выява JPEG-2000 JPM</comment>
+ <comment xml:lang="ar">صورة JPEG-2000 JPM</comment>
+ <comment xml:lang="af">JPEG-2000 JPM-beeld</comment>
<acronym>JPM</acronym>
<expanded-acronym>JPEG-2000 Mixed</expanded-acronym>
- <magic priority="50">
+ <magic>
<match type="string" mask="0xffffffffffffffffffffffff0000000000000000ffffffff" value="\x00\x00\x00\x0c\x6a\x50\x20\x20\x0d\x0a\x87\x0a jpm\x20" offset="0"/>
</magic>
<glob pattern="*.jpm"/>
@@ -26497,70 +27909,122 @@ command to generate the output files.
</mime-type>
<mime-type type="video/mj2">
<comment>JPEG-2000 MJ2 video</comment>
- <comment xml:lang="af">JPEG-2000 MJ2-video</comment>
- <comment xml:lang="bg">Видео — JPEG-2000 MJ2</comment>
- <comment xml:lang="ca">vídeo JPEG-2000 MJ2</comment>
- <comment xml:lang="cs">video JPEG-2000 MJ2</comment>
- <comment xml:lang="da">JPEG-2000 MJ2-video</comment>
- <comment xml:lang="de">JPEG-2000 MJ2-Video</comment>
- <comment xml:lang="en-GB">JPEG-2000 MJ2 video</comment>
- <comment xml:lang="es">vídeo JPEG-2000 MJ2</comment>
- <comment xml:lang="eu">JPEG-2000 MJ2 bideoa</comment>
- <comment xml:lang="fi">JPEG-2000 MJ2 -video</comment>
- <comment xml:lang="fr">vidéo JPEG-2000 MJ2</comment>
- <comment xml:lang="fur">video JPEG-2000 MJ2</comment>
- <comment xml:lang="ga">íomhá JPEG-2000 MJ2</comment>
- <comment xml:lang="hr">JPEG-2000 MJ2 video snimka</comment>
- <comment xml:lang="hu">JPEG-2000 MJ2 videó</comment>
- <comment xml:lang="id">Video JPEG-2000 MJ2</comment>
- <comment xml:lang="it">Video JPEG-2000 MJ2</comment>
- <comment xml:lang="kk">JPEG-2000 MJ2 видеосы</comment>
- <comment xml:lang="ko">JPEG-2000 MJ2 동영상</comment>
- <comment xml:lang="pl">Plik wideo MJ2 JPEG-2000</comment>
- <comment xml:lang="pt-BR">Imagem MJ2 de JPEG-2000</comment>
- <comment xml:lang="ru">Видео JPEG-2000 MJ2</comment>
- <comment xml:lang="sk">Video JPEG-2000 MJ2</comment>
- <comment xml:lang="sl">Video JPEG-2000 MJ2</comment>
- <comment xml:lang="sv">JPEG-2000 MJ2-bild</comment>
- <comment xml:lang="tr">JPEG-2000 MJ2 videosu</comment>
+ <comment xml:lang="zh_TW">JPEG-2000 MJ2 視訊</comment>
+ <comment xml:lang="zh_CN">JPEG-2000 MJ2 视频</comment>
<comment xml:lang="uk">зображення MJ2 JPEG-2000</comment>
- <comment xml:lang="zh-CN">JPEG-2000 MJ2 视频</comment>
- <comment xml:lang="zh-TW">JPEG-2000 MJ2 視訊</comment>
+ <comment xml:lang="tr">JPEG-2000 MJ2 videosu</comment>
+ <comment xml:lang="sv">JPEG-2000 MJ2-bild</comment>
+ <comment xml:lang="sq">video JPEG-2000 MJ2</comment>
+ <comment xml:lang="sl">Video JPEG-2000 MJ2</comment>
+ <comment xml:lang="si">JPEG-2000 MJ2 වීඩියෝව</comment>
+ <comment xml:lang="sk">Video JPEG-2000 MJ2</comment>
+ <comment xml:lang="ru">Видео JPEG-2000 MJ2</comment>
+ <comment xml:lang="pt_BR">Imagem MJ2 de JPEG-2000</comment>
+ <comment xml:lang="pl">Plik wideo MJ2 JPEG-2000</comment>
+ <comment xml:lang="oc">vidèo JPEG-2000 MJ2</comment>
+ <comment xml:lang="nl">JPEG-2000 MJ2-video</comment>
+ <comment xml:lang="ko">JPEG-2000 MJ2 동영상</comment>
+ <comment xml:lang="kk">JPEG-2000 MJ2 видеосы</comment>
+ <comment xml:lang="ja">JPEG-2000 MJ2 動画</comment>
+ <comment xml:lang="it">Video JPEG-2000 MJ2</comment>
+ <comment xml:lang="is">JPEG-2000 MJ2 myndskeið</comment>
+ <comment xml:lang="id">Video JPEG-2000 MJ2</comment>
+ <comment xml:lang="hu">JPEG-2000 MJ2 videó</comment>
+ <comment xml:lang="hr">JPEG-2000 MJ2 video snimka</comment>
+ <comment xml:lang="he">סרטון MJ2 של JPEG-2000</comment>
+ <comment xml:lang="ga">íomhá JPEG-2000 MJ2</comment>
+ <comment xml:lang="fur">video JPEG-2000 MJ2</comment>
+ <comment xml:lang="fr">vidéo JPEG-2000 MJ2</comment>
+ <comment xml:lang="fi">JPEG-2000 MJ2 -video</comment>
+ <comment xml:lang="eu">JPEG-2000 MJ2 bideoa</comment>
+ <comment xml:lang="es">vídeo JPEG-2000 MJ2</comment>
+ <comment xml:lang="en_GB">JPEG-2000 MJ2 video</comment>
+ <comment xml:lang="de">JPEG-2000 MJ2-Video</comment>
+ <comment xml:lang="da">JPEG-2000 MJ2-video</comment>
+ <comment xml:lang="cs">video JPEG-2000 MJ2</comment>
+ <comment xml:lang="ca">vídeo JPEG-2000 MJ2</comment>
+ <comment xml:lang="bg">Видео — JPEG-2000 MJ2</comment>
+ <comment xml:lang="be">відэа JPEG-2000 MJ2</comment>
+ <comment xml:lang="ar">فيديو JPEG-2000 MJ2</comment>
+ <comment xml:lang="af">JPEG-2000 MJ2-video</comment>
<acronym>MJ2</acronym>
<expanded-acronym>Motion JPEG-2000</expanded-acronym>
- <magic priority="50">
+ <magic>
<match type="string" mask="0xffffffffffffffffffffffff0000000000000000ffffffff" value="\x00\x00\x00\x0c\x6a\x50\x20\x20\x0d\x0a\x87\x0a mjp2" offset="0"/>
</magic>
<glob pattern="*.mj2"/>
<glob pattern="*.mjp2"/>
</mime-type>
+ <mime-type type="image/jxl">
+ <comment>JPEG XL image</comment>
+ <comment xml:lang="zh_TW">JPEG XL 影像</comment>
+ <comment xml:lang="zh_CN">JPEG XL 图像</comment>
+ <comment xml:lang="uk">зображення JPEG XL</comment>
+ <comment xml:lang="tr">JPEG XL görüntüsü</comment>
+ <comment xml:lang="sv">JPEG XL-bild</comment>
+ <comment xml:lang="sl">Slika JPEG XL</comment>
+ <comment xml:lang="si">JPEG XL රූපය</comment>
+ <comment xml:lang="ru">Изображение JPEG XL</comment>
+ <comment xml:lang="pt_BR">Imagem JPEG XL</comment>
+ <comment xml:lang="pl">Obraz JPEG XL</comment>
+ <comment xml:lang="oc">imatge JPEG XL</comment>
+ <comment xml:lang="nl">JPEG XL-afbeelding</comment>
+ <comment xml:lang="ko">JPEG XL 그림</comment>
+ <comment xml:lang="kk">JPEG XL суреті</comment>
+ <comment xml:lang="ja">JPEG XL 画像 </comment>
+ <comment xml:lang="it">Immagine JPEG XL</comment>
+ <comment xml:lang="hr">JPEG XL slika</comment>
+ <comment xml:lang="gl">Imaxe JPEG XL</comment>
+ <comment xml:lang="fi">JPEG XL-kuva</comment>
+ <comment xml:lang="eu">JPEG XL irudia</comment>
+ <comment xml:lang="es">imagen JPEG XL</comment>
+ <comment xml:lang="en_GB">JPEG XL image</comment>
+ <comment xml:lang="de">JPEG-XL-Bild</comment>
+ <comment xml:lang="be">выява JPEG XL</comment>
+ <comment xml:lang="ar">صورة JPEG XL</comment>
+ <magic>
+ <match type="string" offset="0" value="\xFF\x0A"/>
+ <match type="string" offset="0" value="\0\0\0\x0CJXL \x0D\x0A\x87\x0A"/>
+ </magic>
+ <glob pattern="*.jxl"/>
+ </mime-type>
<mime-type type="image/openraster">
<comment>OpenRaster image</comment>
- <comment xml:lang="bg">Изображение — OpenRaster</comment>
- <comment xml:lang="ca">imatge OpenRaster</comment>
- <comment xml:lang="da">OpenRaster-billede</comment>
- <comment xml:lang="de">OpenRaster-Bild</comment>
- <comment xml:lang="en-GB">OpenRaster image</comment>
- <comment xml:lang="es">imagen OpenRaster</comment>
- <comment xml:lang="eu">OpenRaster irudia</comment>
- <comment xml:lang="fi">OpenRaster-kuva</comment>
- <comment xml:lang="fr">image OpenRaster</comment>
- <comment xml:lang="hr">OpenRaster slika</comment>
- <comment xml:lang="hu">OpenRaster kép</comment>
- <comment xml:lang="id">Citra OpenRaster</comment>
- <comment xml:lang="it">Immagine OpenRaster</comment>
- <comment xml:lang="kk">OpenRaster суреті</comment>
- <comment xml:lang="ko">OpenRaster 그림</comment>
- <comment xml:lang="pl">Obraz OpenRaster</comment>
- <comment xml:lang="pt-BR">Imagem OpenRaster</comment>
- <comment xml:lang="ru">Изображение OpenRaster</comment>
- <comment xml:lang="sk">Obrázok OpenRaster</comment>
- <comment xml:lang="sl">Slika OpenRaster</comment>
- <comment xml:lang="sv">OpenRaster-bild</comment>
- <comment xml:lang="tr">OpenRaster görüntüsü</comment>
+ <comment xml:lang="zh_TW">OpenRaster 影像</comment>
+ <comment xml:lang="zh_CN">OpenRaster 图像</comment>
<comment xml:lang="uk">зображення OpenRaster</comment>
- <comment xml:lang="zh-CN">OpenRaster 图像</comment>
- <comment xml:lang="zh-TW">OpenRaster 影像</comment>
+ <comment xml:lang="tr">OpenRaster görüntüsü</comment>
+ <comment xml:lang="sv">OpenRaster-bild</comment>
+ <comment xml:lang="sq">figurë OpenRaster</comment>
+ <comment xml:lang="sl">Slika OpenRaster</comment>
+ <comment xml:lang="si">OpenRaster රූපය</comment>
+ <comment xml:lang="sk">Obrázok OpenRaster</comment>
+ <comment xml:lang="ru">Изображение OpenRaster</comment>
+ <comment xml:lang="pt_BR">Imagem OpenRaster</comment>
+ <comment xml:lang="pl">Obraz OpenRaster</comment>
+ <comment xml:lang="oc">imatge OpenRaster</comment>
+ <comment xml:lang="nl">OpenRaster-afbeelding</comment>
+ <comment xml:lang="ko">OpenRaster 그림</comment>
+ <comment xml:lang="kk">OpenRaster суреті</comment>
+ <comment xml:lang="ja">OpenRaster 画像</comment>
+ <comment xml:lang="it">Immagine OpenRaster</comment>
+ <comment xml:lang="is">OpenRaster-mynd</comment>
+ <comment xml:lang="id">Citra OpenRaster</comment>
+ <comment xml:lang="hu">OpenRaster kép</comment>
+ <comment xml:lang="hr">OpenRaster slika</comment>
+ <comment xml:lang="he">תמונת OpenRaster</comment>
+ <comment xml:lang="gl">Imaxe OpenRaster</comment>
+ <comment xml:lang="fr">image OpenRaster</comment>
+ <comment xml:lang="fi">OpenRaster-kuva</comment>
+ <comment xml:lang="eu">OpenRaster irudia</comment>
+ <comment xml:lang="es">imagen OpenRaster</comment>
+ <comment xml:lang="en_GB">OpenRaster image</comment>
+ <comment xml:lang="de">OpenRaster-Bild</comment>
+ <comment xml:lang="da">OpenRaster-billede</comment>
+ <comment xml:lang="ca">imatge OpenRaster</comment>
+ <comment xml:lang="bg">Изображение — OpenRaster</comment>
+ <comment xml:lang="be">выява OpenRaster</comment>
+ <comment xml:lang="ar">صورة OpenRaster</comment>
<sub-class-of type="application/zip"/>
<magic priority="70">
<match type="string" value="PK\003\004" offset="0">
@@ -26573,223 +28037,235 @@ command to generate the output files.
</mime-type>
<mime-type type="image/x-dds">
<comment>DirectDraw surface</comment>
- <comment xml:lang="ar">مساحة DirectDraw</comment>
- <comment xml:lang="be-Latn">Pavierchnia DirectDraw</comment>
- <comment xml:lang="bg">Изображение — повърхност на DirectDraw</comment>
- <comment xml:lang="ca">superfície DirectDraw</comment>
- <comment xml:lang="cs">povrch DirectDraw</comment>
- <comment xml:lang="da">DirectDraw-overflade</comment>
- <comment xml:lang="de">DirectDraw-Oberfläche</comment>
- <comment xml:lang="el">Επιφάνεια DirectDraw</comment>
- <comment xml:lang="en-GB">DirectDraw surface</comment>
- <comment xml:lang="es">superficie de DirectDraw</comment>
- <comment xml:lang="eu">DirectDraw gainazala</comment>
- <comment xml:lang="fi">DirectDraw-piirtoalue</comment>
- <comment xml:lang="fo">DirectDraw yvirflata</comment>
- <comment xml:lang="fr">surface DirectDraw</comment>
- <comment xml:lang="fur">superficie DirectDraw</comment>
- <comment xml:lang="ga">dromchla DirectDraw</comment>
- <comment xml:lang="gl">superficie de DirectDraw</comment>
- <comment xml:lang="he">משטח של DirectDraw</comment>
- <comment xml:lang="hr">DirectDraw ploha</comment>
- <comment xml:lang="hu">DirectDraw felület</comment>
- <comment xml:lang="ia">Superficie DirectDraw</comment>
- <comment xml:lang="id">Permukaan DirectDraw</comment>
- <comment xml:lang="it">Superficie DirectDraw</comment>
- <comment xml:lang="ja">DirectDraw サーフェイス</comment>
- <comment xml:lang="ka">DirectDraw-ის ზედაპირი</comment>
- <comment xml:lang="kk">DirectDraw жазықтығы</comment>
- <comment xml:lang="ko">DirectDraw 서피스</comment>
- <comment xml:lang="lt">DirectDraw paviršius</comment>
- <comment xml:lang="lv">DirectDraw virsma</comment>
- <comment xml:lang="nb">DirectDraw-overflate</comment>
- <comment xml:lang="nl">DirectDraw-oppervlak</comment>
- <comment xml:lang="nn">DirectDraw-overflate</comment>
- <comment xml:lang="oc">surfàcia DirectDraw</comment>
- <comment xml:lang="pl">Powierzchnia DirectDraw</comment>
- <comment xml:lang="pt">superfície DirectDraw</comment>
- <comment xml:lang="pt-BR">Superfície do DirectDraw</comment>
- <comment xml:lang="ro">Suprafață DirectDraw</comment>
- <comment xml:lang="ru">Плоскость DirectDraw</comment>
- <comment xml:lang="sk">Plocha DirectDraw</comment>
- <comment xml:lang="sl">Datoteka predmeta DirectDraw</comment>
- <comment xml:lang="sq">Superfaqe DirectDraw</comment>
- <comment xml:lang="sr">Директ Дров површина</comment>
- <comment xml:lang="sv">DirectDraw-yta</comment>
- <comment xml:lang="tr">DirectDraw yüzeyi</comment>
- <comment xml:lang="uk">поверхня DirectDraw</comment>
+ <comment xml:lang="zh_TW">DirectDraw 表面</comment>
+ <comment xml:lang="zh_CN">DirectDraw 表面</comment>
<comment xml:lang="vi">Mặt DirectDraw</comment>
- <comment xml:lang="zh-CN">DirectDraw 表面</comment>
- <comment xml:lang="zh-TW">DirectDraw 表面</comment>
- <magic priority="50">
+ <comment xml:lang="uk">поверхня DirectDraw</comment>
+ <comment xml:lang="tr">DirectDraw yüzeyi</comment>
+ <comment xml:lang="sv">DirectDraw-yta</comment>
+ <comment xml:lang="sr">Директ Дров површина</comment>
+ <comment xml:lang="sq">sipërfaqe DirectDraw</comment>
+ <comment xml:lang="sl">Datoteka predmeta DirectDraw</comment>
+ <comment xml:lang="si">DirectDraw මතුපිට</comment>
+ <comment xml:lang="sk">Plocha DirectDraw</comment>
+ <comment xml:lang="ru">Плоскость DirectDraw</comment>
+ <comment xml:lang="ro">Suprafață DirectDraw</comment>
+ <comment xml:lang="pt_BR">Superfície do DirectDraw</comment>
+ <comment xml:lang="pt">superfície DirectDraw</comment>
+ <comment xml:lang="pl">Powierzchnia DirectDraw</comment>
+ <comment xml:lang="oc">surfàcia DirectDraw</comment>
+ <comment xml:lang="nn">DirectDraw-overflate</comment>
+ <comment xml:lang="nl">DirectDraw-oppervlak</comment>
+ <comment xml:lang="nb">DirectDraw-overflate</comment>
+ <comment xml:lang="lv">DirectDraw virsma</comment>
+ <comment xml:lang="lt">DirectDraw paviršius</comment>
+ <comment xml:lang="ko">DirectDraw 서피스</comment>
+ <comment xml:lang="kk">DirectDraw жазықтығы</comment>
+ <comment xml:lang="ka">DirectDraw-ის ზედაპირი</comment>
+ <comment xml:lang="ja">DirectDraw サーフェイス</comment>
+ <comment xml:lang="it">Superficie DirectDraw</comment>
+ <comment xml:lang="is">DirectDraw yfirborðsupplýsingar</comment>
+ <comment xml:lang="id">Permukaan DirectDraw</comment>
+ <comment xml:lang="ia">Superficie DirectDraw</comment>
+ <comment xml:lang="hu">DirectDraw felület</comment>
+ <comment xml:lang="hr">DirectDraw ploha</comment>
+ <comment xml:lang="he">משטח של DirectDraw</comment>
+ <comment xml:lang="gl">superficie de DirectDraw</comment>
+ <comment xml:lang="ga">dromchla DirectDraw</comment>
+ <comment xml:lang="fur">superficie DirectDraw</comment>
+ <comment xml:lang="fr">surface DirectDraw</comment>
+ <comment xml:lang="fo">DirectDraw yvirflata</comment>
+ <comment xml:lang="fi">DirectDraw-piirtoalue</comment>
+ <comment xml:lang="eu">DirectDraw gainazala</comment>
+ <comment xml:lang="es">superficie de DirectDraw</comment>
+ <comment xml:lang="en_GB">DirectDraw surface</comment>
+ <comment xml:lang="el">Επιφάνεια DirectDraw</comment>
+ <comment xml:lang="de">DirectDraw-Oberfläche</comment>
+ <comment xml:lang="da">DirectDraw-overflade</comment>
+ <comment xml:lang="cs">povrch DirectDraw</comment>
+ <comment xml:lang="ca">superfície DirectDraw</comment>
+ <comment xml:lang="bg">Изображение — повърхност на DirectDraw</comment>
+ <comment xml:lang="be@latin">Pavierchnia DirectDraw</comment>
+ <comment xml:lang="be">паверхня DirectDraw</comment>
+ <comment xml:lang="ar">سطح DirectDraw</comment>
+ <magic>
<match value="DDS" type="string" offset="0"/>
</magic>
<glob pattern="*.dds"/>
</mime-type>
<mime-type type="image/x-xcursor">
<comment>X11 cursor</comment>
- <comment xml:lang="af">X11-wyser</comment>
- <comment xml:lang="ar">مؤشر X11</comment>
- <comment xml:lang="be-Latn">Kursor X11</comment>
- <comment xml:lang="bg">Курсор — X11</comment>
- <comment xml:lang="ca">cursor de X11</comment>
- <comment xml:lang="cs">kurzor X11</comment>
- <comment xml:lang="da">X11-markør</comment>
- <comment xml:lang="de">X11-Zeiger</comment>
- <comment xml:lang="el">Δρομέας X11</comment>
- <comment xml:lang="en-GB">X11 cursor</comment>
- <comment xml:lang="es">cursor de X11</comment>
- <comment xml:lang="eu">X11 kurtsorea</comment>
- <comment xml:lang="fi">X11-osoitin</comment>
- <comment xml:lang="fo">X11 vísi</comment>
- <comment xml:lang="fr">curseur X11</comment>
- <comment xml:lang="fur">cursôr X11</comment>
- <comment xml:lang="ga">cúrsóir X11</comment>
- <comment xml:lang="gl">Cursor X11</comment>
- <comment xml:lang="he">סמן של X11</comment>
- <comment xml:lang="hr">X11 pokazivač</comment>
- <comment xml:lang="hu">X11 kurzor</comment>
- <comment xml:lang="ia">Cursor X11</comment>
- <comment xml:lang="id">Kursor X11</comment>
- <comment xml:lang="it">Cursore X11</comment>
- <comment xml:lang="ja">X11 カーソル</comment>
- <comment xml:lang="kk">X11 курсоры</comment>
- <comment xml:lang="ko">X11 커서</comment>
- <comment xml:lang="lt">X11 žymiklis</comment>
- <comment xml:lang="lv">X11 kursors</comment>
- <comment xml:lang="nb">X11-markør</comment>
- <comment xml:lang="nl">X11-muisaanwijzer</comment>
- <comment xml:lang="nn">X11-peikar</comment>
- <comment xml:lang="oc">cursor X11</comment>
- <comment xml:lang="pl">Kursor X11</comment>
- <comment xml:lang="pt">cursor X11</comment>
- <comment xml:lang="pt-BR">Cursor do X11</comment>
- <comment xml:lang="ro">Cursor X11</comment>
- <comment xml:lang="ru">Курсор X11</comment>
- <comment xml:lang="sk">Kurzor X11</comment>
- <comment xml:lang="sl">Datoteka kazalke X11</comment>
- <comment xml:lang="sq">Kursor X11</comment>
- <comment xml:lang="sr">Икс11 курсор</comment>
- <comment xml:lang="sv">X11-muspekare</comment>
- <comment xml:lang="tr">X11 imleci</comment>
- <comment xml:lang="uk">курсор X11</comment>
+ <comment xml:lang="zh_TW">X11 滑鼠游標</comment>
+ <comment xml:lang="zh_CN">X11 指针</comment>
<comment xml:lang="vi">Con chạy X11</comment>
- <comment xml:lang="zh-CN">X11 指针</comment>
- <comment xml:lang="zh-TW">X11 滑鼠游標</comment>
- <magic priority="50">
+ <comment xml:lang="uk">курсор X11</comment>
+ <comment xml:lang="tr">X11 imleci</comment>
+ <comment xml:lang="sv">X11-muspekare</comment>
+ <comment xml:lang="sr">Икс11 курсор</comment>
+ <comment xml:lang="sq">kursor X11</comment>
+ <comment xml:lang="sl">Datoteka kazalke X11</comment>
+ <comment xml:lang="si">X11 කර්සරය</comment>
+ <comment xml:lang="sk">Kurzor X11</comment>
+ <comment xml:lang="ru">Курсор X11</comment>
+ <comment xml:lang="ro">Cursor X11</comment>
+ <comment xml:lang="pt_BR">Cursor do X11</comment>
+ <comment xml:lang="pt">cursor X11</comment>
+ <comment xml:lang="pl">Kursor X11</comment>
+ <comment xml:lang="oc">cursor X11</comment>
+ <comment xml:lang="nn">X11-peikar</comment>
+ <comment xml:lang="nl">X11-muisaanwijzer</comment>
+ <comment xml:lang="nb">X11-markør</comment>
+ <comment xml:lang="lv">X11 kursors</comment>
+ <comment xml:lang="lt">X11 žymeklis</comment>
+ <comment xml:lang="ko">X11 커서</comment>
+ <comment xml:lang="kk">X11 курсоры</comment>
+ <comment xml:lang="ja">X11 カーソル</comment>
+ <comment xml:lang="it">Cursore X11</comment>
+ <comment xml:lang="is">X11 bendill</comment>
+ <comment xml:lang="id">Kursor X11</comment>
+ <comment xml:lang="ia">Cursor X11</comment>
+ <comment xml:lang="hu">X11 kurzor</comment>
+ <comment xml:lang="hr">X11 pokazivač</comment>
+ <comment xml:lang="he">סמן של X11</comment>
+ <comment xml:lang="gl">Cursor X11</comment>
+ <comment xml:lang="ga">cúrsóir X11</comment>
+ <comment xml:lang="fur">cursôr X11</comment>
+ <comment xml:lang="fr">curseur X11</comment>
+ <comment xml:lang="fo">X11 vísi</comment>
+ <comment xml:lang="fi">X11-osoitin</comment>
+ <comment xml:lang="eu">X11 kurtsorea</comment>
+ <comment xml:lang="es">cursor de X11</comment>
+ <comment xml:lang="en_GB">X11 cursor</comment>
+ <comment xml:lang="el">Δρομέας X11</comment>
+ <comment xml:lang="de">X11-Mauszeiger</comment>
+ <comment xml:lang="da">X11-markør</comment>
+ <comment xml:lang="cs">kurzor X11</comment>
+ <comment xml:lang="ca">cursor de X11</comment>
+ <comment xml:lang="bg">Курсор — X11</comment>
+ <comment xml:lang="be@latin">Kursor X11</comment>
+ <comment xml:lang="be">курсор X11</comment>
+ <comment xml:lang="ar">مؤشر X11</comment>
+ <comment xml:lang="af">X11-wyser</comment>
+ <magic>
<match type="string" value="Xcur" offset="0"/>
</magic>
</mime-type>
<mime-type type="image/x-exr">
<comment>EXR image</comment>
- <comment xml:lang="af">EXR-beeld</comment>
- <comment xml:lang="ar">صورة EXR</comment>
- <comment xml:lang="be-Latn">Vyjava EXR</comment>
- <comment xml:lang="bg">Изображение — EXR</comment>
- <comment xml:lang="ca">imatge EXR</comment>
- <comment xml:lang="cs">obrázek EXR</comment>
- <comment xml:lang="da">EXR-billede</comment>
- <comment xml:lang="de">EXR-Bild</comment>
- <comment xml:lang="el">Εικόνα EXR</comment>
- <comment xml:lang="en-GB">EXR image</comment>
- <comment xml:lang="eo">EXR-bildo</comment>
- <comment xml:lang="es">imagen EXR</comment>
- <comment xml:lang="eu">EXR irudia</comment>
- <comment xml:lang="fi">EXR-kuva</comment>
- <comment xml:lang="fo">EXR mynd</comment>
- <comment xml:lang="fr">image EXR</comment>
- <comment xml:lang="fur">imagjin EXR</comment>
- <comment xml:lang="ga">íomhá EXR</comment>
- <comment xml:lang="gl">imaxe EXR</comment>
- <comment xml:lang="he">תמונת EXR</comment>
- <comment xml:lang="hr">EXR slika</comment>
- <comment xml:lang="hu">EXR kép</comment>
- <comment xml:lang="ia">Imagine EXR</comment>
- <comment xml:lang="id">Citra EXR</comment>
- <comment xml:lang="it">Immagine EXR</comment>
- <comment xml:lang="ja">EXR 画像</comment>
- <comment xml:lang="ka">EXR გამოსახულება</comment>
- <comment xml:lang="kk">EXR суреті</comment>
- <comment xml:lang="ko">EXR 그림</comment>
- <comment xml:lang="lt">EXR paveikslėlis</comment>
- <comment xml:lang="lv">EXR attēls</comment>
- <comment xml:lang="nb">EXR-bilde</comment>
- <comment xml:lang="nl">EXR-afbeelding</comment>
- <comment xml:lang="nn">EXR-bilete</comment>
- <comment xml:lang="oc">imatge EXR</comment>
- <comment xml:lang="pl">Obraz EXR</comment>
- <comment xml:lang="pt">imagem EXR</comment>
- <comment xml:lang="pt-BR">Imagem EXR</comment>
- <comment xml:lang="ro">Imagine EXR</comment>
- <comment xml:lang="ru">Изображение EXR</comment>
- <comment xml:lang="sk">Obrázok EXR</comment>
- <comment xml:lang="sl">Slikovna datoteka EXR</comment>
- <comment xml:lang="sq">Figurë EXR</comment>
- <comment xml:lang="sr">ЕИксР слика</comment>
- <comment xml:lang="sv">EXR-bild</comment>
- <comment xml:lang="tr">EXR görüntüsü</comment>
- <comment xml:lang="uk">зображення EXR</comment>
+ <comment xml:lang="zh_TW">EXR 影像</comment>
+ <comment xml:lang="zh_CN">EXR 图像</comment>
<comment xml:lang="vi">Ảnh EXR</comment>
- <comment xml:lang="zh-CN">EXR 图像</comment>
- <comment xml:lang="zh-TW">EXR 影像</comment>
- <magic priority="50">
+ <comment xml:lang="uk">зображення EXR</comment>
+ <comment xml:lang="tr">EXR görüntüsü</comment>
+ <comment xml:lang="sv">EXR-bild</comment>
+ <comment xml:lang="sr">ЕИксР слика</comment>
+ <comment xml:lang="sq">figurë EXR</comment>
+ <comment xml:lang="sl">Slikovna datoteka EXR</comment>
+ <comment xml:lang="si">EXR රූපය</comment>
+ <comment xml:lang="sk">Obrázok EXR</comment>
+ <comment xml:lang="ru">Изображение EXR</comment>
+ <comment xml:lang="ro">Imagine EXR</comment>
+ <comment xml:lang="pt_BR">Imagem EXR</comment>
+ <comment xml:lang="pt">imagem EXR</comment>
+ <comment xml:lang="pl">Obraz EXR</comment>
+ <comment xml:lang="oc">imatge EXR</comment>
+ <comment xml:lang="nn">EXR-bilete</comment>
+ <comment xml:lang="nl">EXR-afbeelding</comment>
+ <comment xml:lang="nb">EXR-bilde</comment>
+ <comment xml:lang="lv">EXR attēls</comment>
+ <comment xml:lang="lt">EXR paveikslėlis</comment>
+ <comment xml:lang="ko">EXR 그림</comment>
+ <comment xml:lang="kk">EXR суреті</comment>
+ <comment xml:lang="ka">EXR გამოსახულება</comment>
+ <comment xml:lang="ja">EXR 画像</comment>
+ <comment xml:lang="it">Immagine EXR</comment>
+ <comment xml:lang="is">EXR mynd</comment>
+ <comment xml:lang="id">Citra EXR</comment>
+ <comment xml:lang="ia">Imagine EXR</comment>
+ <comment xml:lang="hu">EXR kép</comment>
+ <comment xml:lang="hr">EXR slika</comment>
+ <comment xml:lang="he">תמונת EXR</comment>
+ <comment xml:lang="gl">imaxe EXR</comment>
+ <comment xml:lang="ga">íomhá EXR</comment>
+ <comment xml:lang="fur">imagjin EXR</comment>
+ <comment xml:lang="fr">image EXR</comment>
+ <comment xml:lang="fo">EXR mynd</comment>
+ <comment xml:lang="fi">EXR-kuva</comment>
+ <comment xml:lang="eu">EXR irudia</comment>
+ <comment xml:lang="es">imagen EXR</comment>
+ <comment xml:lang="eo">EXR-bildo</comment>
+ <comment xml:lang="en_GB">EXR image</comment>
+ <comment xml:lang="el">Εικόνα EXR</comment>
+ <comment xml:lang="de">EXR-Bild</comment>
+ <comment xml:lang="da">EXR-billede</comment>
+ <comment xml:lang="cs">obrázek EXR</comment>
+ <comment xml:lang="ca">imatge EXR</comment>
+ <comment xml:lang="bg">Изображение — EXR</comment>
+ <comment xml:lang="be@latin">Vyjava EXR</comment>
+ <comment xml:lang="be">выява EXR</comment>
+ <comment xml:lang="ar">صورة EXR</comment>
+ <comment xml:lang="af">EXR-beeld</comment>
+ <magic>
<match type="little32" value="20000630" offset="0"/>
</magic>
<glob pattern="*.exr"/>
</mime-type>
<mime-type type="image/x-pict">
<comment>Macintosh Quickdraw/PICT drawing</comment>
- <comment xml:lang="af">Macintosh Quickdraw/PICT-tekening</comment>
- <comment xml:lang="ar">رسمة ماكنتوش Quickdraw/PICT</comment>
- <comment xml:lang="be-Latn">Rysunak Macintosh Quickdraw/PICT</comment>
- <comment xml:lang="bg">Чертеж — Macintosh Quickdraw/PICT</comment>
- <comment xml:lang="ca">dibuix Quickdraw/PICT de Macintosh</comment>
- <comment xml:lang="cs">kresba Macintosh Quickdraw/PICT</comment>
- <comment xml:lang="da">Macintosh Quickdraw/PICT-tegning</comment>
- <comment xml:lang="de">Macintosh-Quickdraw/PICT-Zeichnung</comment>
- <comment xml:lang="el">Σχέδιο Macintosh Quickdraw/PICT</comment>
- <comment xml:lang="en-GB">Macintosh Quickdraw/PICT drawing</comment>
- <comment xml:lang="eo">Quickdraw/PICT-grafikaĵo de Macintosh</comment>
- <comment xml:lang="es">dibujo de Macintosh Quickdraw/PICT</comment>
- <comment xml:lang="eu">Macintosh Quickdraw/PICT marrazkia</comment>
- <comment xml:lang="fi">Macintosh Quickdraw/PICT -piirros</comment>
- <comment xml:lang="fo">Macintosh Quickdraw/PICT tekning</comment>
- <comment xml:lang="fr">dessin Macintosh Quickdraw/PICT</comment>
- <comment xml:lang="fur">dissen Macintosh Quickdraw/PICT</comment>
- <comment xml:lang="ga">líníocht Macintosh Quickdraw/PICT</comment>
- <comment xml:lang="gl">debuxo de Macintosh Quickdraw/PICT</comment>
- <comment xml:lang="he">ציור של Macintosh Quickdraw/PICT</comment>
- <comment xml:lang="hr">Macintosh Quickdraw/PICT crtež</comment>
- <comment xml:lang="hu">Macintosh Quickdraw/PICT-rajz</comment>
- <comment xml:lang="ia">Designo QuickDraw/PICT de Macintosh</comment>
- <comment xml:lang="id">Gambar Macintosh Quickdraw/PICT</comment>
- <comment xml:lang="it">Disegno Macintosh Quickdraw/PICT</comment>
- <comment xml:lang="ja">Macintosh Quickdraw/PICT ドロー</comment>
- <comment xml:lang="kk">Macintosh Quickdraw/PICT суреті</comment>
- <comment xml:lang="ko">매킨토시 Quickdraw/PICT 그림</comment>
- <comment xml:lang="lt">Macintosh Quickdraw/PICT piešinys</comment>
- <comment xml:lang="lv">Macintosh Quickdraw/PICT zīmējums</comment>
- <comment xml:lang="ms">Lukisan Macintosh Quickdraw/PICT</comment>
- <comment xml:lang="nb">Macintosh Quickdraw/PICT-tegning</comment>
- <comment xml:lang="nl">Macintosh Quickdraw/PICT-tekening</comment>
- <comment xml:lang="nn">Macintosh Quickdraw/PICT-teikning</comment>
- <comment xml:lang="oc">dessenh Macintosh Quickdraw/PICT</comment>
- <comment xml:lang="pl">Rysunek QuickDraw/PICT Macintosh</comment>
- <comment xml:lang="pt">desenho Quickdraw/PICT de Macintosh</comment>
- <comment xml:lang="pt-BR">Desenho do Macintosh Quickdraw/PICT</comment>
- <comment xml:lang="ro">Desen Macintosh Quickdraw/PICT</comment>
- <comment xml:lang="ru">Рисунок Macintosh Quickdraw/PICT</comment>
- <comment xml:lang="sk">Kresba Macintosh QuickDraw/PICT</comment>
- <comment xml:lang="sl">Datoteka risbe Macintosh Quickdraw/PICT</comment>
- <comment xml:lang="sq">Vizatim Macintosh Quickdraw/PICT</comment>
- <comment xml:lang="sr">Мекинтошов Квикдров/ПИЦТ цртеж</comment>
- <comment xml:lang="sv">Macintosh Quickdraw/PICT-teckning</comment>
- <comment xml:lang="tr">Macintosh Quickdraw/PICT çizimi</comment>
- <comment xml:lang="uk">малюнок Macintosh Quickdraw/PICT</comment>
+ <comment xml:lang="zh_TW">Macintosh Quickdraw/PICT 繪圖</comment>
+ <comment xml:lang="zh_CN">Macintosh Quickdraw/PICT 绘图</comment>
<comment xml:lang="vi">Bản vẽ Quickdraw/PICT của Macintosh</comment>
- <comment xml:lang="zh-CN">Macintosh Quickdraw/PICT 绘图</comment>
- <comment xml:lang="zh-TW">Macintosh Quickdraw/PICT 繪圖</comment>
- <magic priority="50">
+ <comment xml:lang="uk">малюнок Macintosh Quickdraw/PICT</comment>
+ <comment xml:lang="tr">Macintosh Quickdraw/PICT çizimi</comment>
+ <comment xml:lang="sv">Macintosh Quickdraw/PICT-teckning</comment>
+ <comment xml:lang="sr">Мекинтошов Квикдров/ПИЦТ цртеж</comment>
+ <comment xml:lang="sq">vizatim Macintosh Quickdraw/PICT</comment>
+ <comment xml:lang="sl">Datoteka risbe Macintosh Quickdraw/PICT</comment>
+ <comment xml:lang="si">Macintosh Quickdraw/PICT ඇඳීම</comment>
+ <comment xml:lang="sk">Kresba Macintosh QuickDraw/PICT</comment>
+ <comment xml:lang="ru">Рисунок Macintosh Quickdraw/PICT</comment>
+ <comment xml:lang="ro">Desen Macintosh Quickdraw/PICT</comment>
+ <comment xml:lang="pt_BR">Desenho do Macintosh Quickdraw/PICT</comment>
+ <comment xml:lang="pt">desenho Quickdraw/PICT de Macintosh</comment>
+ <comment xml:lang="pl">Rysunek QuickDraw/PICT Macintosh</comment>
+ <comment xml:lang="oc">dessenh Macintosh Quickdraw/PICT</comment>
+ <comment xml:lang="nn">Macintosh Quickdraw/PICT-teikning</comment>
+ <comment xml:lang="nl">Macintosh Quickdraw/PICT-tekening</comment>
+ <comment xml:lang="nb">Macintosh Quickdraw/PICT-tegning</comment>
+ <comment xml:lang="ms">Lukisan Macintosh Quickdraw/PICT</comment>
+ <comment xml:lang="lv">Macintosh Quickdraw/PICT zīmējums</comment>
+ <comment xml:lang="lt">Macintosh Quickdraw/PICT piešinys</comment>
+ <comment xml:lang="ko">매킨토시 Quickdraw/PICT 그림</comment>
+ <comment xml:lang="kk">Macintosh Quickdraw/PICT суреті</comment>
+ <comment xml:lang="ja">Macintosh Quickdraw/PICT ドロー</comment>
+ <comment xml:lang="it">Disegno Macintosh Quickdraw/PICT</comment>
+ <comment xml:lang="is">Macintosh Quickdraw/PICT teikning</comment>
+ <comment xml:lang="id">Gambar Macintosh Quickdraw/PICT</comment>
+ <comment xml:lang="ia">Designo QuickDraw/PICT de Macintosh</comment>
+ <comment xml:lang="hu">Macintosh Quickdraw/PICT-rajz</comment>
+ <comment xml:lang="hr">Macintosh Quickdraw/PICT crtež</comment>
+ <comment xml:lang="he">ציור של Macintosh Quickdraw/PICT</comment>
+ <comment xml:lang="gl">debuxo de Macintosh Quickdraw/PICT</comment>
+ <comment xml:lang="ga">líníocht Macintosh Quickdraw/PICT</comment>
+ <comment xml:lang="fur">dissen Macintosh Quickdraw/PICT</comment>
+ <comment xml:lang="fr">dessin Macintosh Quickdraw/PICT</comment>
+ <comment xml:lang="fo">Macintosh Quickdraw/PICT tekning</comment>
+ <comment xml:lang="fi">Macintosh Quickdraw/PICT -piirros</comment>
+ <comment xml:lang="eu">Macintosh Quickdraw/PICT marrazkia</comment>
+ <comment xml:lang="es">dibujo de Macintosh Quickdraw/PICT</comment>
+ <comment xml:lang="eo">Quickdraw/PICT-grafikaĵo de Macintosh</comment>
+ <comment xml:lang="en_GB">Macintosh Quickdraw/PICT drawing</comment>
+ <comment xml:lang="el">Σχέδιο Macintosh Quickdraw/PICT</comment>
+ <comment xml:lang="de">Macintosh-Quickdraw/PICT-Zeichnung</comment>
+ <comment xml:lang="da">Macintosh Quickdraw/PICT-tegning</comment>
+ <comment xml:lang="cs">kresba Macintosh Quickdraw/PICT</comment>
+ <comment xml:lang="ca">dibuix Quickdraw/PICT de Macintosh</comment>
+ <comment xml:lang="bg">Чертеж — Macintosh Quickdraw/PICT</comment>
+ <comment xml:lang="be@latin">Rysunak Macintosh Quickdraw/PICT</comment>
+ <comment xml:lang="be">рысунак Macintosh Quickdraw/PICT</comment>
+ <comment xml:lang="ar">رسمة ماكنتوش Quickdraw/PICT</comment>
+ <comment xml:lang="af">Macintosh Quickdraw/PICT-tekening</comment>
+ <magic>
<match type="big16" value="0x0011" offset="10">
<match type="big16" value="0x02FF" offset="12">
<match type="big16" value="0x0C00" offset="14">
@@ -26798,7 +28274,7 @@ command to generate the output files.
</match>
</match>
</magic>
- <magic priority="50">
+ <magic>
<match type="big16" value="0x0011" offset="522">
<match type="big16" value="0x02FF" offset="524">
<match type="big16" value="0x0C00" offset="526">
@@ -26814,54 +28290,57 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-ufraw">
<comment>UFRaw ID image</comment>
- <comment xml:lang="af">UFRaw ID-beeld</comment>
- <comment xml:lang="ar">صورة UFRaw ID</comment>
- <comment xml:lang="be-Latn">Vyjava UFRaw ID</comment>
- <comment xml:lang="bg">Изображение — UFRaw ID</comment>
- <comment xml:lang="ca">imatge ID UFRaw</comment>
- <comment xml:lang="cs">obrázek ID UFRaw</comment>
- <comment xml:lang="da">UFRaw ID-billede</comment>
- <comment xml:lang="de">UFRaw-Bildbeschreibungsdatei</comment>
- <comment xml:lang="el">Εικόνα UFRaw</comment>
- <comment xml:lang="en-GB">UFRaw ID image</comment>
- <comment xml:lang="es">imagen de identificación UFRaw</comment>
- <comment xml:lang="eu">UFRaw ID irudia</comment>
- <comment xml:lang="fi">UFRaw ID -kuva</comment>
- <comment xml:lang="fo">UFRaw ID mynd</comment>
- <comment xml:lang="fr">image ID UFRaw</comment>
- <comment xml:lang="fur">imagjin UFRaw ID</comment>
- <comment xml:lang="ga">íomhá aitheantais UFRaw</comment>
- <comment xml:lang="gl">imaxe de identificación UFRaw</comment>
- <comment xml:lang="he">תמונה של UFRaw ID</comment>
- <comment xml:lang="hr">UFRaw ID slika</comment>
- <comment xml:lang="hu">UFRaw azonosítófájl</comment>
- <comment xml:lang="ia">Imagine UFRaw ID</comment>
- <comment xml:lang="id">Citra UFRaw ID</comment>
- <comment xml:lang="it">Immagine UFRaw ID</comment>
- <comment xml:lang="ja">UFRaw ID イメージ</comment>
- <comment xml:lang="kk">UFRaw ID суреті</comment>
- <comment xml:lang="ko">UFRaw ID 그림</comment>
- <comment xml:lang="lt">UFRaw ID paveikslėlis</comment>
- <comment xml:lang="lv">UFRaw ID attēls</comment>
- <comment xml:lang="nb">UFRaw ID-bilde</comment>
- <comment xml:lang="nl">UFRaw ID-afbeelding</comment>
- <comment xml:lang="nn">UFRaw ID-bilete</comment>
- <comment xml:lang="oc">imatge ID UFRaw</comment>
- <comment xml:lang="pl">Obraz UFRaw ID</comment>
- <comment xml:lang="pt">imagem UFRaw ID</comment>
- <comment xml:lang="pt-BR">Imagem ID do UFRaw</comment>
- <comment xml:lang="ro">ID imagine UFRaw</comment>
- <comment xml:lang="ru">Изображение UFRaw ID</comment>
- <comment xml:lang="sk">Obrázok ID UFRaw</comment>
- <comment xml:lang="sl">Slikovna datoteka UFRaw ID</comment>
- <comment xml:lang="sq">Figurë UFRaw ID</comment>
- <comment xml:lang="sr">УФ сирова ИД слика</comment>
- <comment xml:lang="sv">UFRaw ID-bild</comment>
- <comment xml:lang="tr">UFRaw ID görüntüsü</comment>
- <comment xml:lang="uk">зображення UFRaw ID</comment>
+ <comment xml:lang="zh_TW">UFRaw ID 影像</comment>
+ <comment xml:lang="zh_CN">UFRaw ID 图像</comment>
<comment xml:lang="vi">Ảnh ID UFRaw</comment>
- <comment xml:lang="zh-CN">UFRaw ID 图像</comment>
- <comment xml:lang="zh-TW">UFRaw ID 影像</comment>
+ <comment xml:lang="uk">зображення UFRaw ID</comment>
+ <comment xml:lang="tr">UFRaw ID görüntüsü</comment>
+ <comment xml:lang="sv">UFRaw ID-bild</comment>
+ <comment xml:lang="sr">УФ сирова ИД слика</comment>
+ <comment xml:lang="sq">figurë UFRaw ID</comment>
+ <comment xml:lang="sl">Slikovna datoteka UFRaw ID</comment>
+ <comment xml:lang="si">UFRaw ID රූපය</comment>
+ <comment xml:lang="sk">Obrázok ID UFRaw</comment>
+ <comment xml:lang="ru">Изображение UFRaw ID</comment>
+ <comment xml:lang="ro">ID imagine UFRaw</comment>
+ <comment xml:lang="pt_BR">Imagem ID do UFRaw</comment>
+ <comment xml:lang="pt">imagem UFRaw ID</comment>
+ <comment xml:lang="pl">Obraz UFRaw ID</comment>
+ <comment xml:lang="oc">imatge ID UFRaw</comment>
+ <comment xml:lang="nn">UFRaw ID-bilete</comment>
+ <comment xml:lang="nl">UFRaw ID-afbeelding</comment>
+ <comment xml:lang="nb">UFRaw ID-bilde</comment>
+ <comment xml:lang="lv">UFRaw ID attēls</comment>
+ <comment xml:lang="lt">UFRaw ID paveikslėlis</comment>
+ <comment xml:lang="ko">UFRaw ID 그림</comment>
+ <comment xml:lang="kk">UFRaw ID суреті</comment>
+ <comment xml:lang="ja">UFRaw ID イメージ</comment>
+ <comment xml:lang="it">Immagine UFRaw ID</comment>
+ <comment xml:lang="is">UFRaw ID mynd</comment>
+ <comment xml:lang="id">Citra UFRaw ID</comment>
+ <comment xml:lang="ia">Imagine UFRaw ID</comment>
+ <comment xml:lang="hu">UFRaw azonosítófájl</comment>
+ <comment xml:lang="hr">UFRaw ID slika</comment>
+ <comment xml:lang="he">תמונה של UFRaw ID</comment>
+ <comment xml:lang="gl">imaxe de identificación UFRaw</comment>
+ <comment xml:lang="ga">íomhá aitheantais UFRaw</comment>
+ <comment xml:lang="fur">imagjin UFRaw ID</comment>
+ <comment xml:lang="fr">image ID UFRaw</comment>
+ <comment xml:lang="fo">UFRaw ID mynd</comment>
+ <comment xml:lang="fi">UFRaw ID -kuva</comment>
+ <comment xml:lang="eu">UFRaw ID irudia</comment>
+ <comment xml:lang="es">imagen de identificación UFRaw</comment>
+ <comment xml:lang="en_GB">UFRaw ID image</comment>
+ <comment xml:lang="el">Εικόνα UFRaw</comment>
+ <comment xml:lang="de">UFRaw-Bildbeschreibungsdatei</comment>
+ <comment xml:lang="da">UFRaw ID-billede</comment>
+ <comment xml:lang="cs">obrázek ID UFRaw</comment>
+ <comment xml:lang="ca">imatge ID UFRaw</comment>
+ <comment xml:lang="bg">Изображение — UFRaw ID</comment>
+ <comment xml:lang="be@latin">Vyjava UFRaw ID</comment>
+ <comment xml:lang="be">выява UFRaw ID</comment>
+ <comment xml:lang="ar">صورة UFRaw ID</comment>
+ <comment xml:lang="af">UFRaw ID-beeld</comment>
<acronym>UFRaw</acronym>
<expanded-acronym>Unidentified Flying Raw</expanded-acronym>
<sub-class-of type="application/xml"/>
@@ -26869,170 +28348,139 @@ command to generate the output files.
<glob pattern="*.ufraw"/>
</mime-type>
<mime-type type="image/x-dcraw">
- <comment>digital raw image</comment>
- <comment xml:lang="af">digitale rou beeld</comment>
- <comment xml:lang="ar">صورة رقمية خامة</comment>
- <comment xml:lang="be-Latn">suvoraja ličbavaja vyjava</comment>
- <comment xml:lang="bg">Изображение — digital raw</comment>
- <comment xml:lang="ca">imatge digital en cru</comment>
- <comment xml:lang="cs">digitální surový obrázek</comment>
- <comment xml:lang="da">digitalt raw-billede</comment>
- <comment xml:lang="de">Digitales Rohbild</comment>
- <comment xml:lang="el">Ανεπεξέργαστη ψηφιακή εικόνα</comment>
- <comment xml:lang="en-GB">digital raw image</comment>
- <comment xml:lang="es">imagen digital en bruto</comment>
- <comment xml:lang="eu">irudi gordin digitala</comment>
- <comment xml:lang="fi">digitaalinen raakakuva</comment>
- <comment xml:lang="fo">talgild rámynd</comment>
- <comment xml:lang="fr">image brute numérique</comment>
- <comment xml:lang="fur">imagjin grese digjitâl</comment>
- <comment xml:lang="ga">amhíomhá dhigiteach</comment>
- <comment xml:lang="gl">imaxe en bruto dixital</comment>
- <comment xml:lang="he">תמונה דיגטלית גולמית</comment>
- <comment xml:lang="hr">Digitalna osnovna slika</comment>
- <comment xml:lang="hu">digitális nyers kép</comment>
- <comment xml:lang="ia">Imagine brute digital</comment>
- <comment xml:lang="id">citra mentah digital</comment>
- <comment xml:lang="it">Immagine raw digitale</comment>
- <comment xml:lang="ja">デジタル raw 画像</comment>
- <comment xml:lang="kk">өңделмеген сандық суреттер</comment>
- <comment xml:lang="ko">디지털 원본 사진</comment>
- <comment xml:lang="lt">skaitmeninis neapdorotas paveikslėlis</comment>
- <comment xml:lang="lv">digitāls jēlattēls</comment>
- <comment xml:lang="nb">digitalt raw-bilde</comment>
- <comment xml:lang="nl">onbewerkt digitaal beeld</comment>
- <comment xml:lang="nn">digitalt råbilete</comment>
- <comment xml:lang="oc">imatge brut numeric</comment>
- <comment xml:lang="pl">Surowy obraz cyfrowy</comment>
- <comment xml:lang="pt">imagem digital em bruto</comment>
- <comment xml:lang="pt-BR">Imagem digital bruta</comment>
- <comment xml:lang="ro">imagine digitală brută</comment>
+ <comment>Digital raw image</comment>
+ <comment xml:lang="uk">простий цифровий негатив</comment>
+ <comment xml:lang="sv">Digital råbild</comment>
<comment xml:lang="ru">Необработанное цифровое изображение</comment>
- <comment xml:lang="sk">Digitálny surový obrázok</comment>
- <comment xml:lang="sl">surova digitalna slika</comment>
- <comment xml:lang="sq">Figurë raw dixhitale</comment>
- <comment xml:lang="sr">дигитална сирова слика</comment>
- <comment xml:lang="sv">digital råbild</comment>
- <comment xml:lang="tr">sayısal ham görüntü</comment>
- <comment xml:lang="uk">зображення цифрового негатива</comment>
- <comment xml:lang="vi">ảnh thô số</comment>
- <comment xml:lang="zh-CN">数字化原始图像</comment>
- <comment xml:lang="zh-TW">數位原始影像</comment>
+ <comment xml:lang="pl">Surowy obraz cyfrowy</comment>
+ <comment xml:lang="ja">生写真</comment>
+ <comment xml:lang="it">Immagine raw digitale</comment>
+ <comment xml:lang="gl">Imaxe RAW dixital</comment>
+ <comment xml:lang="eu">Irudi digital gordina</comment>
+ <comment xml:lang="es">imagen digital en bruto</comment>
+ <comment xml:lang="de">Digitales Rohbild</comment>
+ <comment xml:lang="be">неапрацаваная лічбавая выява</comment>
</mime-type>
<mime-type type="image/x-adobe-dng">
<comment>Adobe DNG negative</comment>
- <comment xml:lang="af">Adobe DNG-negatief</comment>
- <comment xml:lang="ar">Adobe DNG negative</comment>
- <comment xml:lang="be-Latn">Adobe DNG Negative</comment>
- <comment xml:lang="bg">Изображение — Adobe DNG negative</comment>
- <comment xml:lang="ca">negatiu DNG d'Adobe</comment>
- <comment xml:lang="cs">negativ Adobe (DNG)</comment>
- <comment xml:lang="da">Adobe DNG-negativ</comment>
- <comment xml:lang="de">Adobe Digitales Negativ</comment>
- <comment xml:lang="el">Αρνητικό Adobe DNG</comment>
- <comment xml:lang="en-GB">Adobe DNG negative</comment>
- <comment xml:lang="es">negativo DNG de Adobe</comment>
- <comment xml:lang="eu">Adobe DNG negatiboa</comment>
- <comment xml:lang="fi">Adobe-DNG-negatiivi</comment>
- <comment xml:lang="fo">Adobe DNG negativ</comment>
- <comment xml:lang="fr">négatif DNG Adobe</comment>
- <comment xml:lang="fur">negatîf Adobe DNG</comment>
- <comment xml:lang="ga">claonchló DNG Adobe</comment>
- <comment xml:lang="gl">negativo DNG de Adobe</comment>
- <comment xml:lang="he">תשליל Adobe DNG</comment>
- <comment xml:lang="hr">Adobe DNG negativ</comment>
- <comment xml:lang="hu">Adobe DNG negatív</comment>
- <comment xml:lang="ia">Negativo Adobe DNG</comment>
- <comment xml:lang="id">Negatif Adobe DNG</comment>
- <comment xml:lang="it">Negativo Adobe DNG</comment>
- <comment xml:lang="ja">Adobe DNG ネガ</comment>
- <comment xml:lang="ka">Adobe DNG-ის ნეგატივი</comment>
- <comment xml:lang="kk">Adobe DNG негативі</comment>
- <comment xml:lang="ko">Adobe DNG 네거티브</comment>
- <comment xml:lang="lt">Adobe DNG negatyvas</comment>
- <comment xml:lang="lv">Adobe DNG negatīvs</comment>
- <comment xml:lang="nb">Adobe DNG-negativ</comment>
- <comment xml:lang="nl">Adobe DNG-negatief</comment>
- <comment xml:lang="nn">Adobe DNG-negativ</comment>
- <comment xml:lang="oc">négatif DNG Adobe</comment>
- <comment xml:lang="pl">Negatyw DNG Adobe</comment>
- <comment xml:lang="pt">negativo Adobe DNG</comment>
- <comment xml:lang="pt-BR">Negativo DNG da Adobe</comment>
- <comment xml:lang="ro">Negativ Adobe DNG</comment>
- <comment xml:lang="ru">Негатив Adobe DNG</comment>
- <comment xml:lang="sk">Adobe Digital Negative (DNG)</comment>
- <comment xml:lang="sl">Datoteka negativa Adobe DNG</comment>
- <comment xml:lang="sq">Negativ Adobe DNG</comment>
- <comment xml:lang="sr">Адобов ДНГ негатив</comment>
- <comment xml:lang="sv">Adobe DNG-negativ</comment>
- <comment xml:lang="tr">Adobe DNG negatifi</comment>
- <comment xml:lang="uk">цифровий негатив DNG Adobe</comment>
+ <comment xml:lang="zh_TW">Adobe DNG 負片</comment>
+ <comment xml:lang="zh_CN">Adobe DNG 负片</comment>
<comment xml:lang="vi">Âm bản Adobe DNG</comment>
- <comment xml:lang="zh-CN">Adobe DNG 负片</comment>
- <comment xml:lang="zh-TW">Adobe DNG 負片</comment>
+ <comment xml:lang="uk">цифровий негатив DNG Adobe</comment>
+ <comment xml:lang="tr">Adobe DNG negatifi</comment>
+ <comment xml:lang="sv">Adobe DNG-negativ</comment>
+ <comment xml:lang="sr">Адобов ДНГ негатив</comment>
+ <comment xml:lang="sq">negativ Adobe DNG</comment>
+ <comment xml:lang="sl">Datoteka negativa Adobe DNG</comment>
+ <comment xml:lang="si">Adobe DNG සෘණ</comment>
+ <comment xml:lang="sk">Adobe Digital Negative (DNG)</comment>
+ <comment xml:lang="ru">Негатив Adobe DNG</comment>
+ <comment xml:lang="ro">Negativ Adobe DNG</comment>
+ <comment xml:lang="pt_BR">Negativo DNG da Adobe</comment>
+ <comment xml:lang="pt">negativo Adobe DNG</comment>
+ <comment xml:lang="pl">Negatyw DNG Adobe</comment>
+ <comment xml:lang="oc">négatif DNG Adobe</comment>
+ <comment xml:lang="nn">Adobe DNG-negativ</comment>
+ <comment xml:lang="nl">Adobe DNG-negatief</comment>
+ <comment xml:lang="nb">Adobe DNG-negativ</comment>
+ <comment xml:lang="lv">Adobe DNG negatīvs</comment>
+ <comment xml:lang="lt">Adobe DNG negatyvas</comment>
+ <comment xml:lang="ko">Adobe DNG 네거티브</comment>
+ <comment xml:lang="kk">Adobe DNG негативі</comment>
+ <comment xml:lang="ka">Adobe DNG-ის ნეგატივი</comment>
+ <comment xml:lang="ja">Adobe DNG ネガ</comment>
+ <comment xml:lang="it">Negativo Adobe DNG</comment>
+ <comment xml:lang="is">Adobe DNG negatíva</comment>
+ <comment xml:lang="id">Negatif Adobe DNG</comment>
+ <comment xml:lang="ia">Negativo Adobe DNG</comment>
+ <comment xml:lang="hu">Adobe DNG negatív</comment>
+ <comment xml:lang="hr">Adobe DNG negativ</comment>
+ <comment xml:lang="he">תשליל Adobe DNG</comment>
+ <comment xml:lang="gl">negativo DNG de Adobe</comment>
+ <comment xml:lang="ga">claonchló DNG Adobe</comment>
+ <comment xml:lang="fur">negatîf Adobe DNG</comment>
+ <comment xml:lang="fr">négatif DNG Adobe</comment>
+ <comment xml:lang="fo">Adobe DNG negativ</comment>
+ <comment xml:lang="fi">Adobe-DNG-negatiivi</comment>
+ <comment xml:lang="eu">Adobe DNG negatiboa</comment>
+ <comment xml:lang="es">negativo DNG de Adobe</comment>
+ <comment xml:lang="en_GB">Adobe DNG negative</comment>
+ <comment xml:lang="el">Αρνητικό Adobe DNG</comment>
+ <comment xml:lang="de">Adobe Digitales Negativ</comment>
+ <comment xml:lang="da">Adobe DNG-negativ</comment>
+ <comment xml:lang="cs">negativ Adobe (DNG)</comment>
+ <comment xml:lang="ca">negatiu DNG d'Adobe</comment>
+ <comment xml:lang="bg">Изображение — Adobe DNG negative</comment>
+ <comment xml:lang="be@latin">Adobe DNG Negative</comment>
+ <comment xml:lang="be">Adobe DNG Negative</comment>
+ <comment xml:lang="ar">سالبة Adobe DNG</comment>
+ <comment xml:lang="af">Adobe DNG-negatief</comment>
<acronym>DNG</acronym>
<expanded-acronym>Digital Negative</expanded-acronym>
<sub-class-of type="image/x-dcraw"/>
<sub-class-of type="image/tiff"/>
<glob pattern="*.dng"/>
</mime-type>
- <!-- Canon has 2 format: CRW and CR2 !-->
+ <!-- Canon has 3 formats: CRW, CR2 and CR3 !-->
<!-- CRW is easy !-->
<mime-type type="image/x-canon-crw">
<comment>Canon CRW raw image</comment>
- <comment xml:lang="af">Canon CRW rou beeld</comment>
- <comment xml:lang="ar">صورة Canon CRW خامة</comment>
- <comment xml:lang="be-Latn">Suvoraja vyjava Canon CRW</comment>
- <comment xml:lang="bg">Изображение — Canon CRW raw</comment>
- <comment xml:lang="ca">imatge en cru de Canon CRW</comment>
- <comment xml:lang="cs">surový obrázek Canon CRW</comment>
- <comment xml:lang="da">Canon CRW raw-billede</comment>
- <comment xml:lang="de">Canon-CRW-Rohbild</comment>
- <comment xml:lang="el">Ανεπεξέργαστη εικόνα Canon CRW</comment>
- <comment xml:lang="en-GB">Canon CRW raw image</comment>
- <comment xml:lang="es">imagen en bruto CRW de Canon</comment>
- <comment xml:lang="eu">Canon CRW irudi gordina</comment>
- <comment xml:lang="fi">Canon-CRW-raakakuva</comment>
- <comment xml:lang="fo">Canon CRW rámynd</comment>
- <comment xml:lang="fr">image brute CRW Canon</comment>
- <comment xml:lang="fur">imagjin grese Canon CRW</comment>
- <comment xml:lang="ga">amhíomhá Canon CRW</comment>
- <comment xml:lang="gl">imaxe en bruto de Canon CRW</comment>
- <comment xml:lang="he">תמונה גולמית של Canon CRW</comment>
- <comment xml:lang="hr">Canon CRW osnovna slika</comment>
- <comment xml:lang="hu">Canon CRW nyers kép</comment>
- <comment xml:lang="ia">Imagine brute CRW Canon</comment>
- <comment xml:lang="id">Citra mentah Canon CRW</comment>
- <comment xml:lang="it">Immagine raw Canon CRW</comment>
- <comment xml:lang="ja">Canon CRW raw 画像</comment>
- <comment xml:lang="ka">Canon CRW raw გამოსახულება</comment>
- <comment xml:lang="kk">Canon CRW өңделмеген суреті</comment>
- <comment xml:lang="ko">캐논 CRW RAW 사진</comment>
- <comment xml:lang="lt">Canon CRW neapdorotas paveikslėlis</comment>
- <comment xml:lang="lv">Canon CRW jēlattēls</comment>
- <comment xml:lang="nb">Canon CRW raw-bilde</comment>
- <comment xml:lang="nl">onbewerkt Canon CRW-beeld</comment>
- <comment xml:lang="nn">Canon CRW råbilete</comment>
- <comment xml:lang="oc">imatge brut CRW Canon</comment>
- <comment xml:lang="pl">Surowy obraz CRW Canon</comment>
- <comment xml:lang="pt">imagem em bruto Canon CRW</comment>
- <comment xml:lang="pt-BR">Imagem bruta CRW da Canon</comment>
- <comment xml:lang="ro">Imagine brută Canon CRW</comment>
- <comment xml:lang="ru">Необработанное изображение Canon CRW</comment>
- <comment xml:lang="sk">Surový obrázok Canon CRW</comment>
- <comment xml:lang="sl">Surova slikovna datoteka Canon CRW</comment>
- <comment xml:lang="sq">Figurë raw Canon CRW</comment>
- <comment xml:lang="sr">Кенон ЦРВ сирова слика</comment>
- <comment xml:lang="sv">Canon CRW-råbild</comment>
- <comment xml:lang="tr">Canon CRW ham görüntüsü</comment>
- <comment xml:lang="uk">цифровий негатив CRW Canon</comment>
+ <comment xml:lang="zh_TW">Canon CRW 原始影像</comment>
+ <comment xml:lang="zh_CN">佳能 CRW 原始图像</comment>
<comment xml:lang="vi">Ảnh thô Canon CRW</comment>
- <comment xml:lang="zh-CN">佳能 CRW 原始图像</comment>
- <comment xml:lang="zh-TW">Canon CRW 原始影像</comment>
+ <comment xml:lang="uk">цифровий негатив CRW Canon</comment>
+ <comment xml:lang="tr">Canon CRW ham görüntüsü</comment>
+ <comment xml:lang="sv">Canon CRW-råbild</comment>
+ <comment xml:lang="sr">Кенон ЦРВ сирова слика</comment>
+ <comment xml:lang="sq">figurë Canon CRW e papërpunuar</comment>
+ <comment xml:lang="sl">Surova slikovna datoteka Canon CRW</comment>
+ <comment xml:lang="si">Canon CRW අමු රූපය</comment>
+ <comment xml:lang="sk">Surový obrázok Canon CRW</comment>
+ <comment xml:lang="ru">Необработанное изображение Canon CRW</comment>
+ <comment xml:lang="ro">Imagine brută Canon CRW</comment>
+ <comment xml:lang="pt_BR">Imagem bruta CRW da Canon</comment>
+ <comment xml:lang="pt">imagem em bruto Canon CRW</comment>
+ <comment xml:lang="pl">Surowy obraz CRW Canon</comment>
+ <comment xml:lang="oc">imatge brut CRW Canon</comment>
+ <comment xml:lang="nn">Canon CRW råbilete</comment>
+ <comment xml:lang="nl">onbewerkt Canon CRW-beeld</comment>
+ <comment xml:lang="nb">Canon CRW raw-bilde</comment>
+ <comment xml:lang="lv">Canon CRW jēlattēls</comment>
+ <comment xml:lang="lt">Canon CRW neapdorotas paveikslėlis</comment>
+ <comment xml:lang="ko">캐논 CRW RAW 사진</comment>
+ <comment xml:lang="kk">Canon CRW өңделмеген суреті</comment>
+ <comment xml:lang="ka">Canon CRW raw გამოსახულება</comment>
+ <comment xml:lang="ja">Canon CRW raw 画像</comment>
+ <comment xml:lang="it">Immagine raw Canon CRW</comment>
+ <comment xml:lang="is">Canon CRW hrámynd</comment>
+ <comment xml:lang="id">Citra mentah Canon CRW</comment>
+ <comment xml:lang="ia">Imagine brute CRW Canon</comment>
+ <comment xml:lang="hu">Canon CRW nyers kép</comment>
+ <comment xml:lang="hr">Canon CRW osnovna slika</comment>
+ <comment xml:lang="he">תמונה גולמית של Canon CRW</comment>
+ <comment xml:lang="gl">imaxe en bruto de Canon CRW</comment>
+ <comment xml:lang="ga">amhíomhá Canon CRW</comment>
+ <comment xml:lang="fur">imagjin grese Canon CRW</comment>
+ <comment xml:lang="fr">image brute CRW Canon</comment>
+ <comment xml:lang="fo">Canon CRW rámynd</comment>
+ <comment xml:lang="fi">Canon-CRW-raakakuva</comment>
+ <comment xml:lang="eu">Canon CRW irudi gordina</comment>
+ <comment xml:lang="es">imagen en bruto CRW de Canon</comment>
+ <comment xml:lang="en_GB">Canon CRW raw image</comment>
+ <comment xml:lang="el">Ανεπεξέργαστη εικόνα Canon CRW</comment>
+ <comment xml:lang="de">Canon-CRW-Rohbild</comment>
+ <comment xml:lang="da">Canon CRW raw-billede</comment>
+ <comment xml:lang="cs">surový obrázek Canon CRW</comment>
+ <comment xml:lang="ca">imatge en cru de Canon CRW</comment>
+ <comment xml:lang="bg">Изображение — Canon CRW raw</comment>
+ <comment xml:lang="be@latin">Suvoraja vyjava Canon CRW</comment>
+ <comment xml:lang="be">неапрацаваная выява Canon CRW</comment>
+ <comment xml:lang="ar">صورة Canon CRW خامة</comment>
+ <comment xml:lang="af">Canon CRW rou beeld</comment>
<acronym>CRW</acronym>
<expanded-acronym>Canon RaW</expanded-acronym>
<sub-class-of type="image/x-dcraw"/>
- <magic priority="50">
+ <magic>
<match value="II\x1a\x00\x00\x00HEAPCCDR" type="string" offset="0"/>
</magic>
<glob pattern="*.crw"/>
@@ -27040,170 +28488,211 @@ command to generate the output files.
<!-- CR2 is a TIFF !-->
<mime-type type="image/x-canon-cr2">
<comment>Canon CR2 raw image</comment>
- <comment xml:lang="af">Canon CR2 rou beeld</comment>
- <comment xml:lang="ar">صورة Canon CR2 خامة</comment>
- <comment xml:lang="be-Latn">Suvoraja vyjava Canon CR2</comment>
- <comment xml:lang="bg">Изображение — Canon CR2 raw</comment>
- <comment xml:lang="ca">imatge en cru de Canon CR2</comment>
- <comment xml:lang="cs">surový obrázek Canon CR2</comment>
- <comment xml:lang="da">Canon CR2 raw-billede</comment>
- <comment xml:lang="de">Canon-CR2-Rohbild</comment>
- <comment xml:lang="el">Ανεπεξέργαστη εικόνα Canon CR2</comment>
- <comment xml:lang="en-GB">Canon CR2 raw image</comment>
- <comment xml:lang="es">imagen en bruto CR2 de Canon</comment>
- <comment xml:lang="eu">Canon CR2 irudi gordina</comment>
- <comment xml:lang="fi">Canon-CR2-raakakuva</comment>
- <comment xml:lang="fo">Canon CR2 rámynd</comment>
- <comment xml:lang="fr">image brute CR2 Canon</comment>
- <comment xml:lang="fur">imagjin grese Canon CR2</comment>
- <comment xml:lang="ga">amhíomhá Canon CR2</comment>
- <comment xml:lang="gl">imaxe en bruto de Canon CR2</comment>
- <comment xml:lang="he">תמונה גולמית של Canon CR2</comment>
- <comment xml:lang="hr">Canon CR2 osnovna slika</comment>
- <comment xml:lang="hu">Canon CR2 nyers kép</comment>
- <comment xml:lang="ia">Imagine brute CR2 Canon</comment>
- <comment xml:lang="id">Citra mentah Canon CR2</comment>
- <comment xml:lang="it">Immagine raw Canon CR2</comment>
- <comment xml:lang="ja">Canon CR2 raw 画像</comment>
- <comment xml:lang="ka">Canon CR2 raw გამოსახულება</comment>
- <comment xml:lang="kk">Canon CR2 өңделмеген суреті</comment>
- <comment xml:lang="ko">캐논 CR2 RAW 사진</comment>
- <comment xml:lang="lt">Canon CR2 neapdorotas paveikslėlis</comment>
- <comment xml:lang="lv">Canon CR2 jēlattēls</comment>
- <comment xml:lang="nb">Canon CR2 raw-bilde</comment>
- <comment xml:lang="nl">onbewerkt Canon CR2-beeld</comment>
- <comment xml:lang="nn">Canon CR2 råbilete</comment>
- <comment xml:lang="oc">imatge brut CR2 Canon</comment>
- <comment xml:lang="pl">Surowy obraz CR2 Canon</comment>
- <comment xml:lang="pt">imagem em bruto Canon CR2</comment>
- <comment xml:lang="pt-BR">Imagem bruta CR2 da Canon</comment>
- <comment xml:lang="ro">Imagine brută Canon CR2</comment>
- <comment xml:lang="ru">Необработанное изображение Canon CR2</comment>
- <comment xml:lang="sk">Surový obrázok Canon CR2</comment>
- <comment xml:lang="sl">Surova slikovna datoteka Canon CR2</comment>
- <comment xml:lang="sq">Figurë raw Canon CR2</comment>
- <comment xml:lang="sr">Кенон ЦР2 сирова слика</comment>
- <comment xml:lang="sv">Canon CR2-råbild</comment>
- <comment xml:lang="tr">Canon CR2 ham görüntüsü</comment>
- <comment xml:lang="uk">цифровий негатив CR2 Canon</comment>
+ <comment xml:lang="zh_TW">Canon CR2 原始影像</comment>
+ <comment xml:lang="zh_CN">佳能 CR2 原始图像</comment>
<comment xml:lang="vi">Ảnh thô Canon CR2</comment>
- <comment xml:lang="zh-CN">佳能 CR2 原始图像</comment>
- <comment xml:lang="zh-TW">Canon CR2 原始影像</comment>
+ <comment xml:lang="uk">цифровий негатив CR2 Canon</comment>
+ <comment xml:lang="tr">Canon CR2 ham görüntüsü</comment>
+ <comment xml:lang="sv">Canon CR2-råbild</comment>
+ <comment xml:lang="sr">Кенон ЦР2 сирова слика</comment>
+ <comment xml:lang="sq">figurë Canon CR2 e papërpunuar</comment>
+ <comment xml:lang="sl">Surova slikovna datoteka Canon CR2</comment>
+ <comment xml:lang="si">Canon CR2 අමු රූපය</comment>
+ <comment xml:lang="sk">Surový obrázok Canon CR2</comment>
+ <comment xml:lang="ru">Необработанное изображение Canon CR2</comment>
+ <comment xml:lang="ro">Imagine brută Canon CR2</comment>
+ <comment xml:lang="pt_BR">Imagem bruta CR2 da Canon</comment>
+ <comment xml:lang="pt">imagem em bruto Canon CR2</comment>
+ <comment xml:lang="pl">Surowy obraz CR2 Canon</comment>
+ <comment xml:lang="oc">imatge brut CR2 Canon</comment>
+ <comment xml:lang="nn">Canon CR2 råbilete</comment>
+ <comment xml:lang="nl">onbewerkt Canon CR2-beeld</comment>
+ <comment xml:lang="nb">Canon CR2 raw-bilde</comment>
+ <comment xml:lang="lv">Canon CR2 jēlattēls</comment>
+ <comment xml:lang="lt">Canon CR2 neapdorotas paveikslėlis</comment>
+ <comment xml:lang="ko">캐논 CR2 RAW 사진</comment>
+ <comment xml:lang="kk">Canon CR2 өңделмеген суреті</comment>
+ <comment xml:lang="ka">Canon CR2 raw გამოსახულება</comment>
+ <comment xml:lang="ja">Canon CR2 raw 画像</comment>
+ <comment xml:lang="it">Immagine raw Canon CR2</comment>
+ <comment xml:lang="is">Canon CR2 hrámynd</comment>
+ <comment xml:lang="id">Citra mentah Canon CR2</comment>
+ <comment xml:lang="ia">Imagine brute CR2 Canon</comment>
+ <comment xml:lang="hu">Canon CR2 nyers kép</comment>
+ <comment xml:lang="hr">Canon CR2 osnovna slika</comment>
+ <comment xml:lang="he">תמונה גולמית של Canon CR2</comment>
+ <comment xml:lang="gl">imaxe en bruto de Canon CR2</comment>
+ <comment xml:lang="ga">amhíomhá Canon CR2</comment>
+ <comment xml:lang="fur">imagjin grese Canon CR2</comment>
+ <comment xml:lang="fr">image brute CR2 Canon</comment>
+ <comment xml:lang="fo">Canon CR2 rámynd</comment>
+ <comment xml:lang="fi">Canon-CR2-raakakuva</comment>
+ <comment xml:lang="eu">Canon CR2 irudi gordina</comment>
+ <comment xml:lang="es">imagen en bruto CR2 de Canon</comment>
+ <comment xml:lang="en_GB">Canon CR2 raw image</comment>
+ <comment xml:lang="el">Ανεπεξέργαστη εικόνα Canon CR2</comment>
+ <comment xml:lang="de">Canon-CR2-Rohbild</comment>
+ <comment xml:lang="da">Canon CR2 raw-billede</comment>
+ <comment xml:lang="cs">surový obrázek Canon CR2</comment>
+ <comment xml:lang="ca">imatge en cru de Canon CR2</comment>
+ <comment xml:lang="bg">Изображение — Canon CR2 raw</comment>
+ <comment xml:lang="be@latin">Suvoraja vyjava Canon CR2</comment>
+ <comment xml:lang="be">неапрацаваная выява Canon CR2</comment>
+ <comment xml:lang="ar">صورة Canon CR2 خامة</comment>
+ <comment xml:lang="af">Canon CR2 rou beeld</comment>
<acronym>CR2</acronym>
<expanded-acronym>Canon Raw 2</expanded-acronym>
<sub-class-of type="image/x-dcraw"/>
<sub-class-of type="image/tiff"/>
<glob pattern="*.cr2"/>
</mime-type>
+ <mime-type type="image/x-canon-cr3">
+ <comment>Canon CR3 raw image</comment>
+ <comment xml:lang="zh_TW">Canon CR3 原始影像</comment>
+ <comment xml:lang="zh_CN">佳能 CR3 原始图像</comment>
+ <comment xml:lang="uk">цифровий негатив CR3 Canon</comment>
+ <comment xml:lang="tr">Canon CR3 ham görüntüsü</comment>
+ <comment xml:lang="sv">Canon CR3-råbild</comment>
+ <comment xml:lang="sl">Neobdelana slika Canon CR3</comment>
+ <comment xml:lang="si">Canon CR3 අමු රූපය</comment>
+ <comment xml:lang="ru">Необработанное изображение Canon CR3</comment>
+ <comment xml:lang="pt_BR">Imagem bruta CR3 da Canon</comment>
+ <comment xml:lang="pl">Surowy obraz CR3 Canon</comment>
+ <comment xml:lang="oc">imatge brut Canon CR3</comment>
+ <comment xml:lang="nl">onbewerkt Canon CR3 beeld</comment>
+ <comment xml:lang="ko">캐논 CR3 RAW 사진</comment>
+ <comment xml:lang="kk">Canon CR3 өңделмеген суреті</comment>
+ <comment xml:lang="ja">Canon CR3 raw 画像ファイル</comment>
+ <comment xml:lang="it">Immagine raw Canon CR3</comment>
+ <comment xml:lang="hr">Canon CR3 osnovna slika</comment>
+ <comment xml:lang="gl">Imaxe RAW de Canon CR3</comment>
+ <comment xml:lang="fi">Canon CR3-raakakuva</comment>
+ <comment xml:lang="eu">Canon CR3 irudi gordina</comment>
+ <comment xml:lang="es">imagen en bruto CR3 de Canon</comment>
+ <comment xml:lang="en_GB">Canon CR3 raw image</comment>
+ <comment xml:lang="de">Canon-CR3-Rohbild</comment>
+ <comment xml:lang="be">неапрацаваная выява Canon CR3</comment>
+ <comment xml:lang="ar">صورة Canon CR3 خامة</comment>
+ <acronym>CR3</acronym>
+ <expanded-acronym>Canon Raw 3</expanded-acronym>
+ <sub-class-of type="image/x-dcraw"/>
+ <glob pattern="*.cr3"/>
+ </mime-type>
<mime-type type="image/x-fuji-raf">
<comment>Fuji RAF raw image</comment>
- <comment xml:lang="af">Fuji RAF rou beeld</comment>
- <comment xml:lang="ar">صورة Fuji RAF خامة</comment>
- <comment xml:lang="be-Latn">Suvoraja vyjava Fuji RAF</comment>
- <comment xml:lang="bg">Изображение — Fuji RAF raw</comment>
- <comment xml:lang="ca">imatge en cru de Fuji RAF</comment>
- <comment xml:lang="cs">surový obrázek Fuji RAF</comment>
- <comment xml:lang="da">Fuji RAF raw-billede</comment>
- <comment xml:lang="de">Fuji-RAF-Rohbild</comment>
- <comment xml:lang="el">Ανεπεξέργαστη εικόνα Fuji RAF</comment>
- <comment xml:lang="en-GB">Fuji RAF raw image</comment>
- <comment xml:lang="es">imagen en bruto RAF de Fuji</comment>
- <comment xml:lang="eu">Fuji RAF irudi gordina</comment>
- <comment xml:lang="fi">Fuji-RAF-raakakuva</comment>
- <comment xml:lang="fo">Fuji RAF raw mynd</comment>
- <comment xml:lang="fr">image brute RAF Fuji</comment>
- <comment xml:lang="fur">imagjin grese Fuji RAF</comment>
- <comment xml:lang="ga">amhíomhá Fuji RAF</comment>
- <comment xml:lang="gl">imaxe en bruto de Fuji RAF</comment>
- <comment xml:lang="he">תמונה גולמית של Fuji RAF</comment>
- <comment xml:lang="hr">Fuji RAF osnovna slika</comment>
- <comment xml:lang="hu">Fuji RAF nyers kép</comment>
- <comment xml:lang="ia">Imagine brute RAF de Fuji</comment>
- <comment xml:lang="id">Citra mentah Fuji RAF</comment>
- <comment xml:lang="it">Immagine raw Fuji RAF</comment>
- <comment xml:lang="ja">Fuji RAF raw 画像</comment>
- <comment xml:lang="ka">Fuji RAF-ის raw გამოსახულება</comment>
- <comment xml:lang="kk">Fuji RAF өңделмеген суреті</comment>
- <comment xml:lang="ko">후지 RAF RAW 사진</comment>
- <comment xml:lang="lt">Fuji RAF neapdorotas paveikslėlis</comment>
- <comment xml:lang="lv">Fuji RAF jēlattēls</comment>
- <comment xml:lang="nb">Fuji RAF raw-bilde</comment>
- <comment xml:lang="nl">onbewerkt Fuji RAF-beeld</comment>
- <comment xml:lang="nn">Fuji RAF rått bilete</comment>
- <comment xml:lang="oc">imatge brut RAF Fuji</comment>
- <comment xml:lang="pl">Surowy obraz RAF Fuji</comment>
- <comment xml:lang="pt">imagem em bruto Fuji RAF</comment>
- <comment xml:lang="pt-BR">Imagem bruta RAF da Fuji</comment>
- <comment xml:lang="ro">Imagine brută Fuji RAF</comment>
- <comment xml:lang="ru">Необработанное изображение Fuji RAF</comment>
- <comment xml:lang="sk">Surový obrázok Fuji RAF</comment>
- <comment xml:lang="sl">Surova slikovna datoteka Fuji RAF</comment>
- <comment xml:lang="sq">Figurë raw Fuji RAF</comment>
- <comment xml:lang="sr">Фуџи РАФ сирова слика</comment>
- <comment xml:lang="sv">Fuji RAF-råbild</comment>
- <comment xml:lang="tr">Fuji RAF ham görüntüsü</comment>
- <comment xml:lang="uk">Цифровий негатив RAF Fuji</comment>
+ <comment xml:lang="zh_TW">Fuji RAF 原始影像</comment>
+ <comment xml:lang="zh_CN">富士 RAF 原始图像</comment>
<comment xml:lang="vi">Ảnh thô Fuji RAF</comment>
- <comment xml:lang="zh-CN">富士 RAF 原始图像</comment>
- <comment xml:lang="zh-TW">Fuji RAF 原始影像</comment>
+ <comment xml:lang="uk">Цифровий негатив RAF Fuji</comment>
+ <comment xml:lang="tr">Fuji RAF ham görüntüsü</comment>
+ <comment xml:lang="sv">Fuji RAF-råbild</comment>
+ <comment xml:lang="sr">Фуџи РАФ сирова слика</comment>
+ <comment xml:lang="sq">figurë Fuji RAF e papërpunuar</comment>
+ <comment xml:lang="sl">Surova slikovna datoteka Fuji RAF</comment>
+ <comment xml:lang="si">Fuji RAF අමු රූපය</comment>
+ <comment xml:lang="sk">Surový obrázok Fuji RAF</comment>
+ <comment xml:lang="ru">Необработанное изображение Fuji RAF</comment>
+ <comment xml:lang="ro">Imagine brută Fuji RAF</comment>
+ <comment xml:lang="pt_BR">Imagem bruta RAF da Fuji</comment>
+ <comment xml:lang="pt">imagem em bruto Fuji RAF</comment>
+ <comment xml:lang="pl">Surowy obraz RAF Fuji</comment>
+ <comment xml:lang="oc">imatge brut RAF Fuji</comment>
+ <comment xml:lang="nn">Fuji RAF rått bilete</comment>
+ <comment xml:lang="nl">onbewerkt Fuji RAF-beeld</comment>
+ <comment xml:lang="nb">Fuji RAF raw-bilde</comment>
+ <comment xml:lang="lv">Fuji RAF jēlattēls</comment>
+ <comment xml:lang="lt">Fuji RAF neapdorotas paveikslėlis</comment>
+ <comment xml:lang="ko">후지 RAF RAW 사진</comment>
+ <comment xml:lang="kk">Fuji RAF өңделмеген суреті</comment>
+ <comment xml:lang="ka">Fuji RAF-ის raw გამოსახულება</comment>
+ <comment xml:lang="ja">Fuji RAF raw 画像</comment>
+ <comment xml:lang="it">Immagine raw Fuji RAF</comment>
+ <comment xml:lang="is">Fuji RAF hrámynd</comment>
+ <comment xml:lang="id">Citra mentah Fuji RAF</comment>
+ <comment xml:lang="ia">Imagine brute RAF de Fuji</comment>
+ <comment xml:lang="hu">Fuji RAF nyers kép</comment>
+ <comment xml:lang="hr">Fuji RAF osnovna slika</comment>
+ <comment xml:lang="he">תמונה גולמית של Fuji RAF</comment>
+ <comment xml:lang="gl">imaxe en bruto de Fuji RAF</comment>
+ <comment xml:lang="ga">amhíomhá Fuji RAF</comment>
+ <comment xml:lang="fur">imagjin grese Fuji RAF</comment>
+ <comment xml:lang="fr">image brute RAF Fuji</comment>
+ <comment xml:lang="fo">Fuji RAF raw mynd</comment>
+ <comment xml:lang="fi">Fuji-RAF-raakakuva</comment>
+ <comment xml:lang="eu">Fuji RAF irudi gordina</comment>
+ <comment xml:lang="es">imagen en bruto RAF de Fuji</comment>
+ <comment xml:lang="en_GB">Fuji RAF raw image</comment>
+ <comment xml:lang="el">Ανεπεξέργαστη εικόνα Fuji RAF</comment>
+ <comment xml:lang="de">Fuji-RAF-Rohbild</comment>
+ <comment xml:lang="da">Fuji RAF raw-billede</comment>
+ <comment xml:lang="cs">surový obrázek Fuji RAF</comment>
+ <comment xml:lang="ca">imatge en cru de Fuji RAF</comment>
+ <comment xml:lang="bg">Изображение — Fuji RAF raw</comment>
+ <comment xml:lang="be@latin">Suvoraja vyjava Fuji RAF</comment>
+ <comment xml:lang="be">неапрацаваная выява Fuji RAF</comment>
+ <comment xml:lang="ar">صورة Fuji RAF خامة</comment>
+ <comment xml:lang="af">Fuji RAF rou beeld</comment>
<acronym>RAF</acronym>
<expanded-acronym>RAw Format</expanded-acronym>
<sub-class-of type="image/x-dcraw"/>
- <magic priority="50">
+ <magic>
<match value="FUJIFILMCCD-RAW " type="string" offset="0"/>
</magic>
<glob pattern="*.raf"/>
</mime-type>
<mime-type type="image/x-kodak-dcr">
<comment>Kodak DCR raw image</comment>
- <comment xml:lang="af">Kodak DCR rou beeld</comment>
- <comment xml:lang="ar">صورة Kodak DCR خامة</comment>
- <comment xml:lang="be-Latn">Suvoraja vyjava Kodak DCR</comment>
- <comment xml:lang="bg">Изображение — Kodak DCR raw</comment>
- <comment xml:lang="ca">imatge en cru de Kodak DCR</comment>
- <comment xml:lang="cs">surový obrázek Kodak DCR</comment>
- <comment xml:lang="da">Kodak DCR raw-billede</comment>
- <comment xml:lang="de">Kodak-DCR-Rohbild</comment>
- <comment xml:lang="el">Ανεπεξέργαστη εικόνα Kodak DCR</comment>
- <comment xml:lang="en-GB">Kodak DCR raw image</comment>
- <comment xml:lang="es">imagen en bruto DCR de Kodak</comment>
- <comment xml:lang="eu">Kodak DCR irudi gordina</comment>
- <comment xml:lang="fi">Kodak-DCR-raakakuva</comment>
- <comment xml:lang="fo">Kodak DCR rámynd</comment>
- <comment xml:lang="fr">image brute DCR Kodak</comment>
- <comment xml:lang="fur">imagjin grese Kodak DCR</comment>
- <comment xml:lang="ga">amhíomhá Kodak DCR</comment>
- <comment xml:lang="gl">imaxe en bruto de Kodad DCR</comment>
- <comment xml:lang="he">תמונה גולמית של Kodak DCR</comment>
- <comment xml:lang="hr">Kodak DCR osnovna slika</comment>
- <comment xml:lang="hu">Kodak DCR nyers kép</comment>
- <comment xml:lang="ia">Imagine brute DCR de Kodak</comment>
- <comment xml:lang="id">Citra mentah Kodak DCR</comment>
- <comment xml:lang="it">Immagine raw Kodak DCR</comment>
- <comment xml:lang="ja">Kodak DCR raw 画像</comment>
- <comment xml:lang="kk">Kodak DCR өңделмеген суреті</comment>
- <comment xml:lang="ko">코닥 DCR RAW 사진</comment>
- <comment xml:lang="lt">Kodak DCR neapdorotas paveikslėlis</comment>
- <comment xml:lang="lv">Kodak DCR jēlattēls</comment>
- <comment xml:lang="nb">Kodak DCR raw-bilde</comment>
- <comment xml:lang="nl">onbewerkt Kodak DCR-beeld</comment>
- <comment xml:lang="nn">Kodak DCR råbilete</comment>
- <comment xml:lang="oc">imatge brut DCR Kodak</comment>
- <comment xml:lang="pl">Surowy obraz DCR Kodak</comment>
- <comment xml:lang="pt">imagem em bruto Kodak DCR</comment>
- <comment xml:lang="pt-BR">Imagem bruta DCR da Kodak</comment>
- <comment xml:lang="ro">Imagine brută Kodak DCR</comment>
- <comment xml:lang="ru">Необработанное изображение Kodak DCR</comment>
- <comment xml:lang="sk">Surový obrázok Kodak DCR</comment>
- <comment xml:lang="sl">Surova slikovna datoteka Kodak DCR</comment>
- <comment xml:lang="sq">Figurë raw Kodak DCR</comment>
- <comment xml:lang="sr">Кодак ДЦР сирова слика</comment>
- <comment xml:lang="sv">Kodak DCR-råbild</comment>
- <comment xml:lang="tr">Kodak DCR ham görüntüsü</comment>
- <comment xml:lang="uk">цифровий негатив DCR Kodak</comment>
+ <comment xml:lang="zh_TW">Kodak DCR 原始影像</comment>
+ <comment xml:lang="zh_CN">柯达 DCR 原始图像</comment>
<comment xml:lang="vi">Ảnh thô Kodak DCR</comment>
- <comment xml:lang="zh-CN">柯达 DCR 原始图像</comment>
- <comment xml:lang="zh-TW">Kodak DCR 原始影像</comment>
+ <comment xml:lang="uk">цифровий негатив DCR Kodak</comment>
+ <comment xml:lang="tr">Kodak DCR ham görüntüsü</comment>
+ <comment xml:lang="sv">Kodak DCR-råbild</comment>
+ <comment xml:lang="sr">Кодак ДЦР сирова слика</comment>
+ <comment xml:lang="sq">figurë Kodak DCR e papërpunuar</comment>
+ <comment xml:lang="sl">Surova slikovna datoteka Kodak DCR</comment>
+ <comment xml:lang="si">Kodak DCR අමු රූපය</comment>
+ <comment xml:lang="sk">Surový obrázok Kodak DCR</comment>
+ <comment xml:lang="ru">Необработанное изображение Kodak DCR</comment>
+ <comment xml:lang="ro">Imagine brută Kodak DCR</comment>
+ <comment xml:lang="pt_BR">Imagem bruta DCR da Kodak</comment>
+ <comment xml:lang="pt">imagem em bruto Kodak DCR</comment>
+ <comment xml:lang="pl">Surowy obraz DCR Kodak</comment>
+ <comment xml:lang="oc">imatge brut DCR Kodak</comment>
+ <comment xml:lang="nn">Kodak DCR råbilete</comment>
+ <comment xml:lang="nl">onbewerkt Kodak DCR-beeld</comment>
+ <comment xml:lang="nb">Kodak DCR raw-bilde</comment>
+ <comment xml:lang="lv">Kodak DCR jēlattēls</comment>
+ <comment xml:lang="lt">Kodak DCR neapdorotas paveikslėlis</comment>
+ <comment xml:lang="ko">코닥 DCR RAW 사진</comment>
+ <comment xml:lang="kk">Kodak DCR өңделмеген суреті</comment>
+ <comment xml:lang="ja">Kodak DCR raw 画像</comment>
+ <comment xml:lang="it">Immagine raw Kodak DCR</comment>
+ <comment xml:lang="is">Kodak DCR hrámynd</comment>
+ <comment xml:lang="id">Citra mentah Kodak DCR</comment>
+ <comment xml:lang="ia">Imagine brute DCR de Kodak</comment>
+ <comment xml:lang="hu">Kodak DCR nyers kép</comment>
+ <comment xml:lang="hr">Kodak DCR osnovna slika</comment>
+ <comment xml:lang="he">תמונה גולמית של Kodak DCR</comment>
+ <comment xml:lang="gl">imaxe en bruto de Kodad DCR</comment>
+ <comment xml:lang="ga">amhíomhá Kodak DCR</comment>
+ <comment xml:lang="fur">imagjin grese Kodak DCR</comment>
+ <comment xml:lang="fr">image brute DCR Kodak</comment>
+ <comment xml:lang="fo">Kodak DCR rámynd</comment>
+ <comment xml:lang="fi">Kodak-DCR-raakakuva</comment>
+ <comment xml:lang="eu">Kodak DCR irudi gordina</comment>
+ <comment xml:lang="es">imagen en bruto DCR de Kodak</comment>
+ <comment xml:lang="en_GB">Kodak DCR raw image</comment>
+ <comment xml:lang="el">Ανεπεξέργαστη εικόνα Kodak DCR</comment>
+ <comment xml:lang="de">Kodak-DCR-Rohbild</comment>
+ <comment xml:lang="da">Kodak DCR raw-billede</comment>
+ <comment xml:lang="cs">surový obrázek Kodak DCR</comment>
+ <comment xml:lang="ca">imatge en cru de Kodak DCR</comment>
+ <comment xml:lang="bg">Изображение — Kodak DCR raw</comment>
+ <comment xml:lang="be@latin">Suvoraja vyjava Kodak DCR</comment>
+ <comment xml:lang="be">неапрацаваная выява Kodak DCR</comment>
+ <comment xml:lang="ar">صورة Kodak DCR خامة</comment>
+ <comment xml:lang="af">Kodak DCR rou beeld</comment>
<acronym>DCR</acronym>
<expanded-acronym>Digital Camera Raw</expanded-acronym>
<sub-class-of type="image/x-dcraw"/>
@@ -27212,54 +28701,57 @@ command to generate the output files.
</mime-type>
<mime-type type="image/x-kodak-k25">
<comment>Kodak K25 raw image</comment>
- <comment xml:lang="af">Kodak K25 rou beeld</comment>
- <comment xml:lang="ar">صورة Kodak K25 خامة</comment>
- <comment xml:lang="be-Latn">Suvoraja vyjava Kodak K25</comment>
- <comment xml:lang="bg">Изображение — Kodak K25 raw</comment>
- <comment xml:lang="ca">imatge en cru de Kodak K25</comment>
- <comment xml:lang="cs">surový obrázek Kodak K25</comment>
- <comment xml:lang="da">Kodak K25 raw-billede</comment>
- <comment xml:lang="de">Kodak-K25-Rohbild</comment>
- <comment xml:lang="el">Ανεπεξέργαστη εικόνα Kodak K25</comment>
- <comment xml:lang="en-GB">Kodak K25 raw image</comment>
- <comment xml:lang="es">imagen en bruto K25 de Kodak</comment>
- <comment xml:lang="eu">Kodak K25 raw image</comment>
- <comment xml:lang="fi">Kodak-K25-raakakuva</comment>
- <comment xml:lang="fo">Kodak K25 rámynd</comment>
- <comment xml:lang="fr">image brute K25 Kodak</comment>
- <comment xml:lang="fur">imagjin grese Kodak K25</comment>
- <comment xml:lang="ga">amhíomhá Kodak K25</comment>
- <comment xml:lang="gl">imaxe en bruto de Kodad K25</comment>
- <comment xml:lang="he">תמונה גולמית של Kodak K25</comment>
- <comment xml:lang="hr">Kodak K25 osnovna slika</comment>
- <comment xml:lang="hu">Kodak K25 nyers kép</comment>
- <comment xml:lang="ia">Imagine brute K25 de Kodak</comment>
- <comment xml:lang="id">Citra mentah Kodak K25</comment>
- <comment xml:lang="it">Immagine raw Kodak K25</comment>
- <comment xml:lang="ja">Kodak K25 raw 画像</comment>
- <comment xml:lang="kk">Kodak K25 өңделмеген суреті</comment>
- <comment xml:lang="ko">코닥 K25 RAW 사진</comment>
- <comment xml:lang="lt">Kodak K25 neapdorotas paveikslėlis</comment>
- <comment xml:lang="lv">Kodak K25 jēlattēls</comment>
- <comment xml:lang="nb">Kodak K25 raw-bilde</comment>
- <comment xml:lang="nl">onbewerkt Kodak K25-beeld</comment>
- <comment xml:lang="nn">Kodak K25 råbilete</comment>
- <comment xml:lang="oc">imatge brut K25 Kodak</comment>
- <comment xml:lang="pl">Surowy obraz K25 Kodak</comment>
- <comment xml:lang="pt">imagem em bruto Kodak K25</comment>
- <comment xml:lang="pt-BR">Imagem bruta K25 da Kodak</comment>
- <comment xml:lang="ro">Imagine brută Kodak K25</comment>
- <comment xml:lang="ru">Необработанное изображение Kodak K25</comment>
- <comment xml:lang="sk">Surový obrázok Kodak K25</comment>
- <comment xml:lang="sl">Surova slikovna datoteka Kodak K25</comment>
- <comment xml:lang="sq">Figurë raw Kodak K25</comment>
- <comment xml:lang="sr">Кодак К25 сирова слика</comment>
- <comment xml:lang="sv">Kodak K25-råbild</comment>
- <comment xml:lang="tr">Kodak K25 ham görüntüsü</comment>
- <comment xml:lang="uk">цифровий негатив K25 Kodak</comment>
+ <comment xml:lang="zh_TW">Kodak K25 原始影像</comment>
+ <comment xml:lang="zh_CN">柯达 K25 原始图像</comment>
<comment xml:lang="vi">Ảnh thô Kodak K25</comment>
- <comment xml:lang="zh-CN">柯达 K25 原始图像</comment>
- <comment xml:lang="zh-TW">Kodak K25 原始影像</comment>
+ <comment xml:lang="uk">цифровий негатив K25 Kodak</comment>
+ <comment xml:lang="tr">Kodak K25 ham görüntüsü</comment>
+ <comment xml:lang="sv">Kodak K25-råbild</comment>
+ <comment xml:lang="sr">Кодак К25 сирова слика</comment>
+ <comment xml:lang="sq">figurë Kodak K25 e papërpunuar</comment>
+ <comment xml:lang="sl">Surova slikovna datoteka Kodak K25</comment>
+ <comment xml:lang="si">Kodak K25 අමු රූපය</comment>
+ <comment xml:lang="sk">Surový obrázok Kodak K25</comment>
+ <comment xml:lang="ru">Необработанное изображение Kodak K25</comment>
+ <comment xml:lang="ro">Imagine brută Kodak K25</comment>
+ <comment xml:lang="pt_BR">Imagem bruta K25 da Kodak</comment>
+ <comment xml:lang="pt">imagem em bruto Kodak K25</comment>
+ <comment xml:lang="pl">Surowy obraz K25 Kodak</comment>
+ <comment xml:lang="oc">imatge brut K25 Kodak</comment>
+ <comment xml:lang="nn">Kodak K25 råbilete</comment>
+ <comment xml:lang="nl">onbewerkt Kodak K25-beeld</comment>
+ <comment xml:lang="nb">Kodak K25 raw-bilde</comment>
+ <comment xml:lang="lv">Kodak K25 jēlattēls</comment>
+ <comment xml:lang="lt">Kodak K25 neapdorotas paveikslėlis</comment>
+ <comment xml:lang="ko">코닥 K25 RAW 사진</comment>
+ <comment xml:lang="kk">Kodak K25 өңделмеген суреті</comment>
+ <comment xml:lang="ja">Kodak K25 raw 画像</comment>
+ <comment xml:lang="it">Immagine raw Kodak K25</comment>
+ <comment xml:lang="is">Kodak K25 hrámynd</comment>
+ <comment xml:lang="id">Citra mentah Kodak K25</comment>
+ <comment xml:lang="ia">Imagine brute K25 de Kodak</comment>
+ <comment xml:lang="hu">Kodak K25 nyers kép</comment>
+ <comment xml:lang="hr">Kodak K25 osnovna slika</comment>
+ <comment xml:lang="he">תמונה גולמית של Kodak K25</comment>
+ <comment xml:lang="gl">imaxe en bruto de Kodad K25</comment>
+ <comment xml:lang="ga">amhíomhá Kodak K25</comment>
+ <comment xml:lang="fur">imagjin grese Kodak K25</comment>
+ <comment xml:lang="fr">image brute K25 Kodak</comment>
+ <comment xml:lang="fo">Kodak K25 rámynd</comment>
+ <comment xml:lang="fi">Kodak-K25-raakakuva</comment>
+ <comment xml:lang="eu">Kodak K25 raw image</comment>
+ <comment xml:lang="es">imagen en bruto K25 de Kodak</comment>
+ <comment xml:lang="en_GB">Kodak K25 raw image</comment>
+ <comment xml:lang="el">Ανεπεξέργαστη εικόνα Kodak K25</comment>
+ <comment xml:lang="de">Kodak-K25-Rohbild</comment>
+ <comment xml:lang="da">Kodak K25 raw-billede</comment>
+ <comment xml:lang="cs">surový obrázek Kodak K25</comment>
+ <comment xml:lang="ca">imatge en cru de Kodak K25</comment>
+ <comment xml:lang="bg">Изображение — Kodak K25 raw</comment>
+ <comment xml:lang="be@latin">Suvoraja vyjava Kodak K25</comment>
+ <comment xml:lang="be">неапрацаваная выява Kodak K25</comment>
+ <comment xml:lang="ar">صورة Kodak K25 خامة</comment>
+ <comment xml:lang="af">Kodak K25 rou beeld</comment>
<acronym>K25</acronym>
<expanded-acronym>Kodak DC25</expanded-acronym>
<sub-class-of type="image/x-dcraw"/>
@@ -27268,54 +28760,57 @@ command to generate the output files.
</mime-type>
<mime-type type="image/x-kodak-kdc">
<comment>Kodak KDC raw image</comment>
- <comment xml:lang="af">Kodak KDC rou beeld</comment>
- <comment xml:lang="ar">صورة Kodak KDC خامة</comment>
- <comment xml:lang="be-Latn">Suvoraja vyjava Kodak KDC</comment>
- <comment xml:lang="bg">Изображение — Kodak KDC raw</comment>
- <comment xml:lang="ca">imatge en cru de Kodak KDC</comment>
- <comment xml:lang="cs">surový obrázek Kodak KDC</comment>
- <comment xml:lang="da">Kodak KDC raw-billede</comment>
- <comment xml:lang="de">Kodak-KDC-Rohbild</comment>
- <comment xml:lang="el">Ανεπεξέργαστη εικόνα Kodak KDC</comment>
- <comment xml:lang="en-GB">Kodak KDC raw image</comment>
- <comment xml:lang="es">imagen en bruto KDC de Kodak</comment>
- <comment xml:lang="eu">Kodak KDC irudi gordina</comment>
- <comment xml:lang="fi">Kodak-KDC-raakakuva</comment>
- <comment xml:lang="fo">Kodak KDC rámynd</comment>
- <comment xml:lang="fr">image brute KDC Kodak</comment>
- <comment xml:lang="fur">imagjin grese Kodak KDC</comment>
- <comment xml:lang="ga">amhíomhá Kodak KDC</comment>
- <comment xml:lang="gl">imaxe en bruto de Kodad KDC</comment>
- <comment xml:lang="he">תמונה גולמית של Kodak KDC</comment>
- <comment xml:lang="hr">Kodak KDC osnovna slika</comment>
- <comment xml:lang="hu">Kodak KDC nyers kép</comment>
- <comment xml:lang="ia">Imagine brute KDC de Kodak</comment>
- <comment xml:lang="id">Citra mentah Kodak KDC</comment>
- <comment xml:lang="it">Immagine raw Kodak KDC</comment>
- <comment xml:lang="ja">Kodak KDC raw 画像</comment>
- <comment xml:lang="kk">Kodak KDC өңделмеген суреті</comment>
- <comment xml:lang="ko">코닥 KDC RAW 사진</comment>
- <comment xml:lang="lt">Kodak KDC neapdorotas paveikslėlis</comment>
- <comment xml:lang="lv">Kodak KDC jēlattēls</comment>
- <comment xml:lang="nb">Kodak KDC raw-bilde</comment>
- <comment xml:lang="nl">onbewerkt Kodak KDC-beeld</comment>
- <comment xml:lang="nn">Kodak KDC råbilete</comment>
- <comment xml:lang="oc">imatge brut KDC Kodak</comment>
- <comment xml:lang="pl">Surowy obraz KDC Kodak</comment>
- <comment xml:lang="pt">imagem em bruto Kodak KDC</comment>
- <comment xml:lang="pt-BR">Imagem bruta KDC da Kodak</comment>
- <comment xml:lang="ro">Imagine brută Kodak KDC</comment>
- <comment xml:lang="ru">Необработанное изображение Kodak KDC</comment>
- <comment xml:lang="sk">Surový obrázok Kodak KDC</comment>
- <comment xml:lang="sl">Surova slikovna datoteka Kodak KDC</comment>
- <comment xml:lang="sq">Figurë raw Kodak KDC</comment>
- <comment xml:lang="sr">Кодак КДЦ сирова слика</comment>
- <comment xml:lang="sv">Kodak KDC-råbild</comment>
- <comment xml:lang="tr">Kodak KDC ham görüntüsü</comment>
- <comment xml:lang="uk">цифровий негатив KDC Kodak</comment>
+ <comment xml:lang="zh_TW">Kodak KDC 原始影像</comment>
+ <comment xml:lang="zh_CN">柯达 KDC 原始图像</comment>
<comment xml:lang="vi">Ảnh thô Kodak KDC</comment>
- <comment xml:lang="zh-CN">柯达 KDC 原始图像</comment>
- <comment xml:lang="zh-TW">Kodak KDC 原始影像</comment>
+ <comment xml:lang="uk">цифровий негатив KDC Kodak</comment>
+ <comment xml:lang="tr">Kodak KDC ham görüntüsü</comment>
+ <comment xml:lang="sv">Kodak KDC-råbild</comment>
+ <comment xml:lang="sr">Кодак КДЦ сирова слика</comment>
+ <comment xml:lang="sq">figurë Kodak KDC e papërpunuar</comment>
+ <comment xml:lang="sl">Surova slikovna datoteka Kodak KDC</comment>
+ <comment xml:lang="si">Kodak KDC අමු රූපය</comment>
+ <comment xml:lang="sk">Surový obrázok Kodak KDC</comment>
+ <comment xml:lang="ru">Необработанное изображение Kodak KDC</comment>
+ <comment xml:lang="ro">Imagine brută Kodak KDC</comment>
+ <comment xml:lang="pt_BR">Imagem bruta KDC da Kodak</comment>
+ <comment xml:lang="pt">imagem em bruto Kodak KDC</comment>
+ <comment xml:lang="pl">Surowy obraz KDC Kodak</comment>
+ <comment xml:lang="oc">imatge brut KDC Kodak</comment>
+ <comment xml:lang="nn">Kodak KDC råbilete</comment>
+ <comment xml:lang="nl">onbewerkt Kodak KDC-beeld</comment>
+ <comment xml:lang="nb">Kodak KDC raw-bilde</comment>
+ <comment xml:lang="lv">Kodak KDC jēlattēls</comment>
+ <comment xml:lang="lt">Kodak KDC neapdorotas paveikslėlis</comment>
+ <comment xml:lang="ko">코닥 KDC RAW 사진</comment>
+ <comment xml:lang="kk">Kodak KDC өңделмеген суреті</comment>
+ <comment xml:lang="ja">Kodak KDC raw 画像</comment>
+ <comment xml:lang="it">Immagine raw Kodak KDC</comment>
+ <comment xml:lang="is">Kodak KDC hrámynd</comment>
+ <comment xml:lang="id">Citra mentah Kodak KDC</comment>
+ <comment xml:lang="ia">Imagine brute KDC de Kodak</comment>
+ <comment xml:lang="hu">Kodak KDC nyers kép</comment>
+ <comment xml:lang="hr">Kodak KDC osnovna slika</comment>
+ <comment xml:lang="he">תמונה גולמית של Kodak KDC</comment>
+ <comment xml:lang="gl">imaxe en bruto de Kodad KDC</comment>
+ <comment xml:lang="ga">amhíomhá Kodak KDC</comment>
+ <comment xml:lang="fur">imagjin grese Kodak KDC</comment>
+ <comment xml:lang="fr">image brute KDC Kodak</comment>
+ <comment xml:lang="fo">Kodak KDC rámynd</comment>
+ <comment xml:lang="fi">Kodak-KDC-raakakuva</comment>
+ <comment xml:lang="eu">Kodak KDC irudi gordina</comment>
+ <comment xml:lang="es">imagen en bruto KDC de Kodak</comment>
+ <comment xml:lang="en_GB">Kodak KDC raw image</comment>
+ <comment xml:lang="el">Ανεπεξέργαστη εικόνα Kodak KDC</comment>
+ <comment xml:lang="de">Kodak-KDC-Rohbild</comment>
+ <comment xml:lang="da">Kodak KDC raw-billede</comment>
+ <comment xml:lang="cs">surový obrázek Kodak KDC</comment>
+ <comment xml:lang="ca">imatge en cru de Kodak KDC</comment>
+ <comment xml:lang="bg">Изображение — Kodak KDC raw</comment>
+ <comment xml:lang="be@latin">Suvoraja vyjava Kodak KDC</comment>
+ <comment xml:lang="be">неапрацаваная выява Kodak KDC</comment>
+ <comment xml:lang="ar">صورة Kodak KDC خامة</comment>
+ <comment xml:lang="af">Kodak KDC rou beeld</comment>
<acronym>KDC</acronym>
<expanded-acronym>Kodak Digital Camera</expanded-acronym>
<sub-class-of type="image/x-dcraw"/>
@@ -27327,173 +28822,213 @@ command to generate the output files.
</mime-type>
<mime-type type="image/x-minolta-mrw">
<comment>Minolta MRW raw image</comment>
- <comment xml:lang="af">Minolta MRW rou beeld</comment>
- <comment xml:lang="ar">صورة Minolta MRW خامة</comment>
- <comment xml:lang="be-Latn">Suvoraja vyjava Minolta MRW</comment>
- <comment xml:lang="bg">Изображение — Minolta MRW raw</comment>
- <comment xml:lang="ca">imatge en cru de Minolta MRW</comment>
- <comment xml:lang="cs">surový obrázek Minolta MRW</comment>
- <comment xml:lang="da">Minolta MRW raw-billede</comment>
- <comment xml:lang="de">Minolta-MRW-Rohbild</comment>
- <comment xml:lang="el">Ανεπεξέργαστη εικόνα Minolta MRW</comment>
- <comment xml:lang="en-GB">Minolta MRW raw image</comment>
- <comment xml:lang="es">imagen en bruto MRW de Minolta</comment>
- <comment xml:lang="eu">Minolta MRW irudi gordina</comment>
- <comment xml:lang="fi">Minolta-MRW-raakakuva</comment>
- <comment xml:lang="fo">Minolta MRW rámynd</comment>
- <comment xml:lang="fr">image brute MRW Minolta</comment>
- <comment xml:lang="fur">imagjin grese Minolta MRW</comment>
- <comment xml:lang="ga">amhíomhá Minolta MRW</comment>
- <comment xml:lang="gl">imaxe RAW de Minolta MRW</comment>
- <comment xml:lang="he">תמונה גולמית של Minolta MRW</comment>
- <comment xml:lang="hr">Minolta MRW osnovna slika</comment>
- <comment xml:lang="hu">Minolta MRW nyers kép</comment>
- <comment xml:lang="ia">Imagine brute Minolta MRW</comment>
- <comment xml:lang="id">Citra mentah Minolta MRW</comment>
- <comment xml:lang="it">Immagine raw Minolta MRW</comment>
- <comment xml:lang="ja">Minolta MRW raw 画像</comment>
- <comment xml:lang="kk">Minolta MRW өңделмеген суреті</comment>
- <comment xml:lang="ko">미놀타 MRW RAW 사진</comment>
- <comment xml:lang="lt">Minolta MRW neapdorotas paveikslėlis</comment>
- <comment xml:lang="lv">Minolta MRW jēlattēls</comment>
- <comment xml:lang="nb">Minolta MRW raw-bilde</comment>
- <comment xml:lang="nl">onbewerkt Minolta MRW-beeld</comment>
- <comment xml:lang="nn">Minolta MRW råbilete</comment>
- <comment xml:lang="oc">imatge brut MRW Minolta</comment>
- <comment xml:lang="pl">Surowy obraz MRW Minolta</comment>
- <comment xml:lang="pt">imagem em bruto Minolta MRW</comment>
- <comment xml:lang="pt-BR">Imagem bruta MRW do Minolta</comment>
- <comment xml:lang="ro">Imagine brută Minolta MRW</comment>
- <comment xml:lang="ru">Необработанное изображение Minolta MRW</comment>
- <comment xml:lang="sk">Surový obrázok Minolta MRW</comment>
- <comment xml:lang="sl">Surova slikovna datoteka Minolta MRW</comment>
- <comment xml:lang="sq">Figurë raw Minolta MRW</comment>
- <comment xml:lang="sr">Минолта МРВ сирова слика</comment>
- <comment xml:lang="sv">Minolta MRW-råbild</comment>
- <comment xml:lang="tr">Minolta MRW ham görüntüsü</comment>
- <comment xml:lang="uk">цифровий негатив MRW Minolta</comment>
+ <comment xml:lang="zh_TW">Minolta MRW 原始影像</comment>
+ <comment xml:lang="zh_CN">美能达 MRW 原始图像</comment>
<comment xml:lang="vi">Ảnh thô Minolta MRW</comment>
- <comment xml:lang="zh-CN">美能达 MRW 原始图像</comment>
- <comment xml:lang="zh-TW">Minolta MRW 原始影像</comment>
+ <comment xml:lang="uk">цифровий негатив MRW Minolta</comment>
+ <comment xml:lang="tr">Minolta MRW ham görüntüsü</comment>
+ <comment xml:lang="sv">Minolta MRW-råbild</comment>
+ <comment xml:lang="sr">Минолта МРВ сирова слика</comment>
+ <comment xml:lang="sq">figurë Minolta MRW e papërpunuar</comment>
+ <comment xml:lang="sl">Surova slikovna datoteka Minolta MRW</comment>
+ <comment xml:lang="si">Minolta MRW අමු රූපය</comment>
+ <comment xml:lang="sk">Surový obrázok Minolta MRW</comment>
+ <comment xml:lang="ru">Необработанное изображение Minolta MRW</comment>
+ <comment xml:lang="ro">Imagine brută Minolta MRW</comment>
+ <comment xml:lang="pt_BR">Imagem bruta MRW do Minolta</comment>
+ <comment xml:lang="pt">imagem em bruto Minolta MRW</comment>
+ <comment xml:lang="pl">Surowy obraz MRW Minolta</comment>
+ <comment xml:lang="oc">imatge brut MRW Minolta</comment>
+ <comment xml:lang="nn">Minolta MRW råbilete</comment>
+ <comment xml:lang="nl">onbewerkt Minolta MRW-beeld</comment>
+ <comment xml:lang="nb">Minolta MRW raw-bilde</comment>
+ <comment xml:lang="lv">Minolta MRW jēlattēls</comment>
+ <comment xml:lang="lt">Minolta MRW neapdorotas paveikslėlis</comment>
+ <comment xml:lang="ko">미놀타 MRW RAW 사진</comment>
+ <comment xml:lang="kk">Minolta MRW өңделмеген суреті</comment>
+ <comment xml:lang="ja">Minolta MRW raw 画像</comment>
+ <comment xml:lang="it">Immagine raw Minolta MRW</comment>
+ <comment xml:lang="is">Minolta MRW hrámynd</comment>
+ <comment xml:lang="id">Citra mentah Minolta MRW</comment>
+ <comment xml:lang="ia">Imagine brute Minolta MRW</comment>
+ <comment xml:lang="hu">Minolta MRW nyers kép</comment>
+ <comment xml:lang="hr">Minolta MRW osnovna slika</comment>
+ <comment xml:lang="he">תמונה גולמית של Minolta MRW</comment>
+ <comment xml:lang="gl">imaxe RAW de Minolta MRW</comment>
+ <comment xml:lang="ga">amhíomhá Minolta MRW</comment>
+ <comment xml:lang="fur">imagjin grese Minolta MRW</comment>
+ <comment xml:lang="fr">image brute MRW Minolta</comment>
+ <comment xml:lang="fo">Minolta MRW rámynd</comment>
+ <comment xml:lang="fi">Minolta-MRW-raakakuva</comment>
+ <comment xml:lang="eu">Minolta MRW irudi gordina</comment>
+ <comment xml:lang="es">imagen en bruto MRW de Minolta</comment>
+ <comment xml:lang="en_GB">Minolta MRW raw image</comment>
+ <comment xml:lang="el">Ανεπεξέργαστη εικόνα Minolta MRW</comment>
+ <comment xml:lang="de">Minolta-MRW-Rohbild</comment>
+ <comment xml:lang="da">Minolta MRW raw-billede</comment>
+ <comment xml:lang="cs">surový obrázek Minolta MRW</comment>
+ <comment xml:lang="ca">imatge en cru de Minolta MRW</comment>
+ <comment xml:lang="bg">Изображение — Minolta MRW raw</comment>
+ <comment xml:lang="be@latin">Suvoraja vyjava Minolta MRW</comment>
+ <comment xml:lang="be">неапрацаваная выява Minolta MRW</comment>
+ <comment xml:lang="ar">صورة Minolta MRW خامة</comment>
+ <comment xml:lang="af">Minolta MRW rou beeld</comment>
<acronym>MRW</acronym>
<expanded-acronym>Minolta RaW</expanded-acronym>
<sub-class-of type="image/x-dcraw"/>
- <magic priority="50">
+ <magic>
<match value="\x00MRM" type="string" offset="0"/>
</magic>
<glob pattern="*.mrw"/>
</mime-type>
<mime-type type="image/x-nikon-nef">
<comment>Nikon NEF raw image</comment>
- <comment xml:lang="af">Nikon NEF rou beeld</comment>
- <comment xml:lang="ar">صورة Nikon NEF خامة</comment>
- <comment xml:lang="be-Latn">Suvoraja vyjava Nikon NEF</comment>
- <comment xml:lang="bg">Изображение — Nikon NEF raw</comment>
- <comment xml:lang="ca">imatge en cru de Nikon NEF</comment>
- <comment xml:lang="cs">surový obrázek Nikon NEF</comment>
- <comment xml:lang="da">Nikon NEF raw-billede</comment>
- <comment xml:lang="de">Nikon-NEF-Rohbild</comment>
- <comment xml:lang="el">Ανεπεξέργαστη εικόνα Nikon NEF</comment>
- <comment xml:lang="en-GB">Nikon NEF raw image</comment>
- <comment xml:lang="es">imagen en bruto NEF de Nikon</comment>
- <comment xml:lang="eu">Nikon NEF irudi gordina</comment>
- <comment xml:lang="fi">Nikon-NEF-raakakuva</comment>
- <comment xml:lang="fo">Nikon NEF rámynd</comment>
- <comment xml:lang="fr">image brute NEF Nikon</comment>
- <comment xml:lang="fur">imagjin grese Nikon NEF</comment>
- <comment xml:lang="ga">amhíomhá Nikon NEF</comment>
- <comment xml:lang="gl">imaxe RAW NEF Nikon</comment>
- <comment xml:lang="he">תמונה גולמית של Nikon NEF</comment>
- <comment xml:lang="hr">Nikon NEF osnovna slika</comment>
- <comment xml:lang="hu">Nikon NEF nyers kép</comment>
- <comment xml:lang="ia">Imagine brute Nikon NEF</comment>
- <comment xml:lang="id">Citra mentah Nikon NEF</comment>
- <comment xml:lang="it">Immagine raw Nikon NEF</comment>
- <comment xml:lang="ja">Nikon NEF raw イメージ</comment>
- <comment xml:lang="kk">Nikon NEF өңделмеген суреті</comment>
- <comment xml:lang="ko">니콘 NEF RAW 사진</comment>
- <comment xml:lang="lt">Nikon NEF neapdorotas paveikslėlis</comment>
- <comment xml:lang="lv">Nikon NEF jēlattēls</comment>
- <comment xml:lang="nb">Nikon NEF raw-bilde</comment>
- <comment xml:lang="nl">onbewerkt Nikon NEF-beeld</comment>
- <comment xml:lang="nn">Nikon NEF råbilete</comment>
- <comment xml:lang="oc">imatge brut NEF Nikon</comment>
- <comment xml:lang="pl">Surowy obraz NEF Nikon</comment>
- <comment xml:lang="pt">imagem em bruto Nikon NEF</comment>
- <comment xml:lang="pt-BR">Imagem bruta NEF da Nikon</comment>
- <comment xml:lang="ro">Imagine brută Nikon NEF</comment>
- <comment xml:lang="ru">Необработанное изображение Nikon NEF</comment>
- <comment xml:lang="sk">Surový obrázok Nikon NEF</comment>
- <comment xml:lang="sl">Surova slikovna datoteka Nikon NEF</comment>
- <comment xml:lang="sq">Figurë raw Nikon NEF</comment>
- <comment xml:lang="sr">Никон НЕФ сирова слика</comment>
- <comment xml:lang="sv">Nikon NEF-råbild</comment>
- <comment xml:lang="tr">Nikon NEF ham görüntüsü</comment>
- <comment xml:lang="uk">цифровий негатив NEF Nikon</comment>
+ <comment xml:lang="zh_TW">Nikon NEF 原始影像</comment>
+ <comment xml:lang="zh_CN">尼康 NEF 原始图像</comment>
<comment xml:lang="vi">Ảnh thô Nikon NEF</comment>
- <comment xml:lang="zh-CN">尼康 NEF 原始图像</comment>
- <comment xml:lang="zh-TW">Nikon NEF 原始影像</comment>
+ <comment xml:lang="uk">цифровий негатив NEF Nikon</comment>
+ <comment xml:lang="tr">Nikon NEF ham görüntüsü</comment>
+ <comment xml:lang="sv">Nikon NEF-råbild</comment>
+ <comment xml:lang="sr">Никон НЕФ сирова слика</comment>
+ <comment xml:lang="sq">figurë Nikon NEF e papërpunuar</comment>
+ <comment xml:lang="sl">Surova slikovna datoteka Nikon NEF</comment>
+ <comment xml:lang="si">Nikon NEF අමු රූපය</comment>
+ <comment xml:lang="sk">Surový obrázok Nikon NEF</comment>
+ <comment xml:lang="ru">Необработанное изображение Nikon NEF</comment>
+ <comment xml:lang="ro">Imagine brută Nikon NEF</comment>
+ <comment xml:lang="pt_BR">Imagem bruta NEF da Nikon</comment>
+ <comment xml:lang="pt">imagem em bruto Nikon NEF</comment>
+ <comment xml:lang="pl">Surowy obraz NEF Nikon</comment>
+ <comment xml:lang="oc">imatge brut NEF Nikon</comment>
+ <comment xml:lang="nn">Nikon NEF råbilete</comment>
+ <comment xml:lang="nl">onbewerkt Nikon NEF-beeld</comment>
+ <comment xml:lang="nb">Nikon NEF raw-bilde</comment>
+ <comment xml:lang="lv">Nikon NEF jēlattēls</comment>
+ <comment xml:lang="lt">Nikon NEF neapdorotas paveikslėlis</comment>
+ <comment xml:lang="ko">니콘 NEF RAW 사진</comment>
+ <comment xml:lang="kk">Nikon NEF өңделмеген суреті</comment>
+ <comment xml:lang="ja">Nikon NEF raw イメージ</comment>
+ <comment xml:lang="it">Immagine raw Nikon NEF</comment>
+ <comment xml:lang="is">Nikon NEF hrámynd</comment>
+ <comment xml:lang="id">Citra mentah Nikon NEF</comment>
+ <comment xml:lang="ia">Imagine brute Nikon NEF</comment>
+ <comment xml:lang="hu">Nikon NEF nyers kép</comment>
+ <comment xml:lang="hr">Nikon NEF osnovna slika</comment>
+ <comment xml:lang="he">תמונה גולמית של Nikon NEF</comment>
+ <comment xml:lang="gl">imaxe RAW NEF Nikon</comment>
+ <comment xml:lang="ga">amhíomhá Nikon NEF</comment>
+ <comment xml:lang="fur">imagjin grese Nikon NEF</comment>
+ <comment xml:lang="fr">image brute NEF Nikon</comment>
+ <comment xml:lang="fo">Nikon NEF rámynd</comment>
+ <comment xml:lang="fi">Nikon-NEF-raakakuva</comment>
+ <comment xml:lang="eu">Nikon NEF irudi gordina</comment>
+ <comment xml:lang="es">imagen en bruto NEF de Nikon</comment>
+ <comment xml:lang="en_GB">Nikon NEF raw image</comment>
+ <comment xml:lang="el">Ανεπεξέργαστη εικόνα Nikon NEF</comment>
+ <comment xml:lang="de">Nikon-NEF-Rohbild</comment>
+ <comment xml:lang="da">Nikon NEF raw-billede</comment>
+ <comment xml:lang="cs">surový obrázek Nikon NEF</comment>
+ <comment xml:lang="ca">imatge en cru de Nikon NEF</comment>
+ <comment xml:lang="bg">Изображение — Nikon NEF raw</comment>
+ <comment xml:lang="be@latin">Suvoraja vyjava Nikon NEF</comment>
+ <comment xml:lang="be">неапрацаваная выява Nikon NEF</comment>
+ <comment xml:lang="ar">صورة Nikon NEF خامة</comment>
+ <comment xml:lang="af">Nikon NEF rou beeld</comment>
<acronym>NEF</acronym>
<expanded-acronym>Nikon Electronic Format</expanded-acronym>
<sub-class-of type="image/x-dcraw"/>
<sub-class-of type="image/tiff"/>
<glob pattern="*.nef"/>
</mime-type>
+ <mime-type type="image/x-nikon-nrw">
+ <comment>Nikon NRW raw image</comment>
+ <comment xml:lang="zh_TW">Nikon NRW 原始影像</comment>
+ <comment xml:lang="zh_CN">尼康 NRW 原始图像</comment>
+ <comment xml:lang="uk">цифровий негатив NRW Nikon</comment>
+ <comment xml:lang="tr">Nikon NRW ham görüntüsü</comment>
+ <comment xml:lang="sv">Nikon NRW-råbild</comment>
+ <comment xml:lang="sl">Neobdelana slika NRW</comment>
+ <comment xml:lang="si">Nikon NRW අමු රූපය</comment>
+ <comment xml:lang="ru">Необработанное изображение Nikon NRW</comment>
+ <comment xml:lang="pt_BR">Imagem bruta NRW da Nikon</comment>
+ <comment xml:lang="pl">Surowy obraz NRW Nikon</comment>
+ <comment xml:lang="oc">imatge brut Nikon NRW</comment>
+ <comment xml:lang="nl">onbewerkt Nikon NRW beeld</comment>
+ <comment xml:lang="ko">니콘 NRW RAW 사진</comment>
+ <comment xml:lang="kk">Nikon NRW өңделмеген суреті</comment>
+ <comment xml:lang="ja">Nikon NRW raw 画像ファイル</comment>
+ <comment xml:lang="it">Immagine raw Nikon NRW</comment>
+ <comment xml:lang="hr">Nikon NRW osnovna slika</comment>
+ <comment xml:lang="gl">Imaxe RAW de Nikon NRW</comment>
+ <comment xml:lang="fi">Nikon-NRW-raakakuva</comment>
+ <comment xml:lang="eu">Nikon NRW irudi gordina</comment>
+ <comment xml:lang="es">imagen en bruto NRW de Nikon</comment>
+ <comment xml:lang="en_GB">Nikon NRW raw image</comment>
+ <comment xml:lang="de">Nikon-NRW-Rohbild</comment>
+ <comment xml:lang="be">неапрацаваная выява Nikon NRW</comment>
+ <comment xml:lang="ar">صورة Nikon NRW خامة</comment>
+ <sub-class-of type="image/x-dcraw"/>
+ <sub-class-of type="image/tiff"/>
+ <glob pattern="*.nrw"/>
+ </mime-type>
<mime-type type="image/x-olympus-orf">
<comment>Olympus ORF raw image</comment>
- <comment xml:lang="af">Olympus ORF rou beeld</comment>
- <comment xml:lang="ar">صورة Olympus ORF خامة</comment>
- <comment xml:lang="be-Latn">Suvoraja vyjava Olympus ORF</comment>
- <comment xml:lang="bg">Изображение — Olympus ORF raw</comment>
- <comment xml:lang="ca">imatge en cru d'Olympus ORF</comment>
- <comment xml:lang="cs">surový obrázek Olympus ORF</comment>
- <comment xml:lang="da">Olympus ORF raw-billede</comment>
- <comment xml:lang="de">Olympus-ORF-Rohbild</comment>
- <comment xml:lang="el">Ανεπεξέργαστη εικόνα Olympus ORF</comment>
- <comment xml:lang="en-GB">Olympus ORF raw image</comment>
- <comment xml:lang="es">imagen en bruto ORF de Olympus</comment>
- <comment xml:lang="eu">Olympus ORF irudi gordina</comment>
- <comment xml:lang="fi">Olympus-ORF-raakakuva</comment>
- <comment xml:lang="fo">Olympus ORF rámynd</comment>
- <comment xml:lang="fr">image brute ORF Olympus</comment>
- <comment xml:lang="fur">imagjin grese Olympus ORF</comment>
- <comment xml:lang="ga">amhíomhá Olympus ORF</comment>
- <comment xml:lang="gl">imaxe en bruto de Olympus ORF</comment>
- <comment xml:lang="he">תמונה גולמית של Olympus ORF</comment>
- <comment xml:lang="hr">Olympus ORF osnovna slika</comment>
- <comment xml:lang="hu">Olympus ORF nyers kép</comment>
- <comment xml:lang="ia">Imagine brute Olympus ORF</comment>
- <comment xml:lang="id">Citra mentah Olympus ORF</comment>
- <comment xml:lang="it">Immagine raw Olympus ORF</comment>
- <comment xml:lang="ja">Olympus ORF raw 画像</comment>
- <comment xml:lang="ka">Olympus ORF-ის raw გამოსახულება</comment>
- <comment xml:lang="kk">Olympus ORF өңделмеген суреті</comment>
- <comment xml:lang="ko">올림푸스 ORF RAW 사진</comment>
- <comment xml:lang="lt">Olympus ORF neapdorotas paveikslėlis</comment>
- <comment xml:lang="lv">Olympus ORF jēlattēls</comment>
- <comment xml:lang="nb">Olympus ORF raw-bilde</comment>
- <comment xml:lang="nl">onbewerkt Olympus ORF-beeld</comment>
- <comment xml:lang="nn">Olympus ORF råbilete</comment>
- <comment xml:lang="oc">imatge brut ORF Olympus</comment>
- <comment xml:lang="pl">Surowy obraz Olympus ORF</comment>
- <comment xml:lang="pt">imagem em bruto Olympus ORF</comment>
- <comment xml:lang="pt-BR">Imagem bruta ORF da Olympus</comment>
- <comment xml:lang="ro">Imagine brută Olympus ORF</comment>
- <comment xml:lang="ru">Необработанное изображение Olympus ORF</comment>
- <comment xml:lang="sk">Surový obrázok Olympus ORF</comment>
- <comment xml:lang="sl">Surova slikovna datoteka Olympus ORF</comment>
- <comment xml:lang="sq">Figurë raw Olympus ORF</comment>
- <comment xml:lang="sr">Олимпус ОРФ сирова слика</comment>
- <comment xml:lang="sv">Olympus ORF-råbild</comment>
- <comment xml:lang="tr">Olympus ORF ham görüntüsü</comment>
- <comment xml:lang="uk">цифровий негатив ORF Olympus</comment>
+ <comment xml:lang="zh_TW">Olympus ORF 原始影像</comment>
+ <comment xml:lang="zh_CN">奥林巴斯 ORF 原始图像</comment>
<comment xml:lang="vi">Ảnh thô Olympus ORF</comment>
- <comment xml:lang="zh-CN">奥林巴斯 ORF 原始图像</comment>
- <comment xml:lang="zh-TW">Olympus ORF 原始影像</comment>
+ <comment xml:lang="uk">цифровий негатив ORF Olympus</comment>
+ <comment xml:lang="tr">Olympus ORF ham görüntüsü</comment>
+ <comment xml:lang="sv">Olympus ORF-råbild</comment>
+ <comment xml:lang="sr">Олимпус ОРФ сирова слика</comment>
+ <comment xml:lang="sq">figurë Olympus ORF e papërpunuar</comment>
+ <comment xml:lang="sl">Surova slikovna datoteka Olympus ORF</comment>
+ <comment xml:lang="si">Olympus ORF අමු රූපය</comment>
+ <comment xml:lang="sk">Surový obrázok Olympus ORF</comment>
+ <comment xml:lang="ru">Необработанное изображение Olympus ORF</comment>
+ <comment xml:lang="ro">Imagine brută Olympus ORF</comment>
+ <comment xml:lang="pt_BR">Imagem bruta ORF da Olympus</comment>
+ <comment xml:lang="pt">imagem em bruto Olympus ORF</comment>
+ <comment xml:lang="pl">Surowy obraz Olympus ORF</comment>
+ <comment xml:lang="oc">imatge brut ORF Olympus</comment>
+ <comment xml:lang="nn">Olympus ORF råbilete</comment>
+ <comment xml:lang="nl">onbewerkt Olympus ORF-beeld</comment>
+ <comment xml:lang="nb">Olympus ORF raw-bilde</comment>
+ <comment xml:lang="lv">Olympus ORF jēlattēls</comment>
+ <comment xml:lang="lt">Olympus ORF neapdorotas paveikslėlis</comment>
+ <comment xml:lang="ko">올림푸스 ORF RAW 사진</comment>
+ <comment xml:lang="kk">Olympus ORF өңделмеген суреті</comment>
+ <comment xml:lang="ka">Olympus ORF-ის raw გამოსახულება</comment>
+ <comment xml:lang="ja">Olympus ORF raw 画像</comment>
+ <comment xml:lang="it">Immagine raw Olympus ORF</comment>
+ <comment xml:lang="is">Olympus ORF hrámynd</comment>
+ <comment xml:lang="id">Citra mentah Olympus ORF</comment>
+ <comment xml:lang="ia">Imagine brute Olympus ORF</comment>
+ <comment xml:lang="hu">Olympus ORF nyers kép</comment>
+ <comment xml:lang="hr">Olympus ORF osnovna slika</comment>
+ <comment xml:lang="he">תמונה גולמית של Olympus ORF</comment>
+ <comment xml:lang="gl">imaxe en bruto de Olympus ORF</comment>
+ <comment xml:lang="ga">amhíomhá Olympus ORF</comment>
+ <comment xml:lang="fur">imagjin grese Olympus ORF</comment>
+ <comment xml:lang="fr">image brute ORF Olympus</comment>
+ <comment xml:lang="fo">Olympus ORF rámynd</comment>
+ <comment xml:lang="fi">Olympus-ORF-raakakuva</comment>
+ <comment xml:lang="eu">Olympus ORF irudi gordina</comment>
+ <comment xml:lang="es">imagen en bruto ORF de Olympus</comment>
+ <comment xml:lang="en_GB">Olympus ORF raw image</comment>
+ <comment xml:lang="el">Ανεπεξέργαστη εικόνα Olympus ORF</comment>
+ <comment xml:lang="de">Olympus-ORF-Rohbild</comment>
+ <comment xml:lang="da">Olympus ORF raw-billede</comment>
+ <comment xml:lang="cs">surový obrázek Olympus ORF</comment>
+ <comment xml:lang="ca">imatge en cru d'Olympus ORF</comment>
+ <comment xml:lang="bg">Изображение — Olympus ORF raw</comment>
+ <comment xml:lang="be@latin">Suvoraja vyjava Olympus ORF</comment>
+ <comment xml:lang="be">неапрацаваная выява Olympus ORF</comment>
+ <comment xml:lang="ar">صورة Olympus ORF خامة</comment>
+ <comment xml:lang="af">Olympus ORF rou beeld</comment>
<acronym>ORF</acronym>
<expanded-acronym>Olympus Raw Format</expanded-acronym>
<sub-class-of type="image/x-dcraw"/>
- <magic priority="50">
+ <magic>
<!-- an ORF file is basically a TIFF file with a non standard !-->
<!-- header IIRO which is not nice since it is only composed !-->
<!-- of ASCII codes. Fortunately, the TIFF header is followed !-->
@@ -27505,56 +29040,59 @@ command to generate the output files.
</mime-type>
<mime-type type="image/x-panasonic-rw">
<comment>Panasonic raw image</comment>
- <comment xml:lang="af">Panasonic rou beeld</comment>
- <comment xml:lang="ar">صورة Panasonic خامة</comment>
- <comment xml:lang="be-Latn">Suvoraja vyjava Panasonic</comment>
- <comment xml:lang="bg">Изображение — Panasonic raw</comment>
- <comment xml:lang="ca">imatge en cru de Panasonic</comment>
- <comment xml:lang="cs">surový obrázek Panasonic</comment>
- <comment xml:lang="da">Panasonic raw-billede</comment>
- <comment xml:lang="de">Panasonic-Rohbild</comment>
- <comment xml:lang="el">Ανεπεξέργαστη εικόνα Panasonic</comment>
- <comment xml:lang="en-GB">Panasonic raw image</comment>
- <comment xml:lang="es">imagen en bruto de Panasonic</comment>
- <comment xml:lang="eu">Panasonic irudi gordina</comment>
- <comment xml:lang="fi">Panasonic-raakakuva</comment>
- <comment xml:lang="fo">Panasonic rámynd</comment>
- <comment xml:lang="fr">image brute Panasonic</comment>
- <comment xml:lang="fur">imagjin grese Panasonic</comment>
- <comment xml:lang="ga">amhíomhá Panasonic</comment>
- <comment xml:lang="gl">imaxe en bruto de Panasonic</comment>
- <comment xml:lang="he">תמונה גולמית של Panasonic</comment>
- <comment xml:lang="hr">Panasonic osnovna slika</comment>
- <comment xml:lang="hu">Panasonic nyers kép</comment>
- <comment xml:lang="ia">Imagine brute Panasonic</comment>
- <comment xml:lang="id">Citra mentah Panasonic</comment>
- <comment xml:lang="it">Immagine raw Panasonic</comment>
- <comment xml:lang="ja">Panasonic raw 画像</comment>
- <comment xml:lang="kk">Panasonic өңделмеген суреті</comment>
- <comment xml:lang="ko">파나소닉 RAW 사진</comment>
- <comment xml:lang="lt">Panasonic neapdorotas paveikslėlis</comment>
- <comment xml:lang="lv">Panasonic jēlattēls</comment>
- <comment xml:lang="nb">Panasonic raw-bilde</comment>
- <comment xml:lang="nl">onbewerkt Panasonic-beeld</comment>
- <comment xml:lang="nn">Panasonic råbilete</comment>
- <comment xml:lang="oc">imatge brut Panasonic</comment>
- <comment xml:lang="pl">Obraz raw Panasonic</comment>
- <comment xml:lang="pt">imagem em bruto Panasonic</comment>
- <comment xml:lang="pt-BR">Imagem bruta da Panasonic</comment>
- <comment xml:lang="ro">Imagine brută Panasonic</comment>
- <comment xml:lang="ru">Необработанное изображение Panasonic</comment>
- <comment xml:lang="sk">Surový obrázok Panasonic</comment>
- <comment xml:lang="sl">Surova slikovna datoteka Panasonic</comment>
- <comment xml:lang="sq">Figurë raw Panasonic</comment>
- <comment xml:lang="sr">Панасоник сирова слика</comment>
- <comment xml:lang="sv">Panasonic-råbild</comment>
- <comment xml:lang="tr">Panasonic ham görüntüsü</comment>
- <comment xml:lang="uk">цифровий негатив Panasonic</comment>
+ <comment xml:lang="zh_TW">Panasonic 原始影像</comment>
+ <comment xml:lang="zh_CN">松下原始图像</comment>
<comment xml:lang="vi">Ảnh thô Panasonic</comment>
- <comment xml:lang="zh-CN">松下原始图像</comment>
- <comment xml:lang="zh-TW">Panasonic 原始影像</comment>
+ <comment xml:lang="uk">цифровий негатив Panasonic</comment>
+ <comment xml:lang="tr">Panasonic ham görüntüsü</comment>
+ <comment xml:lang="sv">Panasonic-råbild</comment>
+ <comment xml:lang="sr">Панасоник сирова слика</comment>
+ <comment xml:lang="sq">figurë Panasonic e papërpunuar</comment>
+ <comment xml:lang="sl">Surova slikovna datoteka Panasonic</comment>
+ <comment xml:lang="si">පැනසොනික් අමු රූපය</comment>
+ <comment xml:lang="sk">Surový obrázok Panasonic</comment>
+ <comment xml:lang="ru">Необработанное изображение Panasonic</comment>
+ <comment xml:lang="ro">Imagine brută Panasonic</comment>
+ <comment xml:lang="pt_BR">Imagem bruta da Panasonic</comment>
+ <comment xml:lang="pt">imagem em bruto Panasonic</comment>
+ <comment xml:lang="pl">Obraz raw Panasonic</comment>
+ <comment xml:lang="oc">imatge brut Panasonic</comment>
+ <comment xml:lang="nn">Panasonic råbilete</comment>
+ <comment xml:lang="nl">onbewerkt Panasonic-beeld</comment>
+ <comment xml:lang="nb">Panasonic raw-bilde</comment>
+ <comment xml:lang="lv">Panasonic jēlattēls</comment>
+ <comment xml:lang="lt">Panasonic neapdorotas paveikslėlis</comment>
+ <comment xml:lang="ko">파나소닉 RAW 사진</comment>
+ <comment xml:lang="kk">Panasonic өңделмеген суреті</comment>
+ <comment xml:lang="ja">Panasonic raw 画像</comment>
+ <comment xml:lang="it">Immagine raw Panasonic</comment>
+ <comment xml:lang="is">Panasonic hrámynd</comment>
+ <comment xml:lang="id">Citra mentah Panasonic</comment>
+ <comment xml:lang="ia">Imagine brute Panasonic</comment>
+ <comment xml:lang="hu">Panasonic nyers kép</comment>
+ <comment xml:lang="hr">Panasonic osnovna slika</comment>
+ <comment xml:lang="he">תמונה גולמית של Panasonic</comment>
+ <comment xml:lang="gl">imaxe en bruto de Panasonic</comment>
+ <comment xml:lang="ga">amhíomhá Panasonic</comment>
+ <comment xml:lang="fur">imagjin grese Panasonic</comment>
+ <comment xml:lang="fr">image brute Panasonic</comment>
+ <comment xml:lang="fo">Panasonic rámynd</comment>
+ <comment xml:lang="fi">Panasonic-raakakuva</comment>
+ <comment xml:lang="eu">Panasonic irudi gordina</comment>
+ <comment xml:lang="es">imagen en bruto de Panasonic</comment>
+ <comment xml:lang="en_GB">Panasonic raw image</comment>
+ <comment xml:lang="el">Ανεπεξέργαστη εικόνα Panasonic</comment>
+ <comment xml:lang="de">Panasonic-Rohbild</comment>
+ <comment xml:lang="da">Panasonic raw-billede</comment>
+ <comment xml:lang="cs">surový obrázek Panasonic</comment>
+ <comment xml:lang="ca">imatge en cru de Panasonic</comment>
+ <comment xml:lang="bg">Изображение — Panasonic raw</comment>
+ <comment xml:lang="be@latin">Suvoraja vyjava Panasonic</comment>
+ <comment xml:lang="be">неапрацаваная выява Panasonic</comment>
+ <comment xml:lang="ar">صورة Panasonic خامة</comment>
+ <comment xml:lang="af">Panasonic rou beeld</comment>
<sub-class-of type="image/x-dcraw"/>
- <magic priority="50">
+ <magic>
<!-- Some kind of TIFF file with a non-standard version in prefix !-->
<match value="IIU\x00\x08\x00\x00\x00" type="string" offset="0"/>
</magic>
@@ -27563,56 +29101,59 @@ command to generate the output files.
</mime-type>
<mime-type type="image/x-panasonic-rw2">
<comment>Panasonic raw image</comment>
- <comment xml:lang="af">Panasonic rou beeld</comment>
- <comment xml:lang="ar">صورة Panasonic خامة</comment>
- <comment xml:lang="be-Latn">Suvoraja vyjava Panasonic</comment>
- <comment xml:lang="bg">Изображение — Panasonic raw</comment>
- <comment xml:lang="ca">imatge en cru de Panasonic</comment>
- <comment xml:lang="cs">surový obrázek Panasonic</comment>
- <comment xml:lang="da">Panasonic raw-billede</comment>
- <comment xml:lang="de">Panasonic-Rohbild</comment>
- <comment xml:lang="el">Ανεπεξέργαστη εικόνα Panasonic</comment>
- <comment xml:lang="en-GB">Panasonic raw image</comment>
- <comment xml:lang="es">imagen en bruto de Panasonic</comment>
- <comment xml:lang="eu">Panasonic irudi gordina</comment>
- <comment xml:lang="fi">Panasonic-raakakuva</comment>
- <comment xml:lang="fo">Panasonic rámynd</comment>
- <comment xml:lang="fr">image brute Panasonic</comment>
- <comment xml:lang="fur">imagjin grese Panasonic</comment>
- <comment xml:lang="ga">amhíomhá Panasonic</comment>
- <comment xml:lang="gl">imaxe en bruto de Panasonic</comment>
- <comment xml:lang="he">תמונה גולמית של Panasonic</comment>
- <comment xml:lang="hr">Panasonic osnovna slika</comment>
- <comment xml:lang="hu">Panasonic nyers kép</comment>
- <comment xml:lang="ia">Imagine brute Panasonic</comment>
- <comment xml:lang="id">Citra mentah Panasonic</comment>
- <comment xml:lang="it">Immagine raw Panasonic</comment>
- <comment xml:lang="ja">Panasonic raw 画像</comment>
- <comment xml:lang="kk">Panasonic өңделмеген суреті</comment>
- <comment xml:lang="ko">파나소닉 RAW 사진</comment>
- <comment xml:lang="lt">Panasonic neapdorotas paveikslėlis</comment>
- <comment xml:lang="lv">Panasonic jēlattēls</comment>
- <comment xml:lang="nb">Panasonic raw-bilde</comment>
- <comment xml:lang="nl">onbewerkt Panasonic-beeld</comment>
- <comment xml:lang="nn">Panasonic råbilete</comment>
- <comment xml:lang="oc">imatge brut Panasonic</comment>
- <comment xml:lang="pl">Obraz raw Panasonic</comment>
- <comment xml:lang="pt">imagem em bruto Panasonic</comment>
- <comment xml:lang="pt-BR">Imagem bruta da Panasonic</comment>
- <comment xml:lang="ro">Imagine brută Panasonic</comment>
- <comment xml:lang="ru">Необработанное изображение Panasonic</comment>
- <comment xml:lang="sk">Surový obrázok Panasonic</comment>
- <comment xml:lang="sl">Surova slikovna datoteka Panasonic</comment>
- <comment xml:lang="sq">Figurë raw Panasonic</comment>
- <comment xml:lang="sr">Панасоник сирова слика</comment>
- <comment xml:lang="sv">Panasonic-råbild</comment>
- <comment xml:lang="tr">Panasonic ham görüntüsü</comment>
- <comment xml:lang="uk">цифровий негатив Panasonic</comment>
+ <comment xml:lang="zh_TW">Panasonic 原始影像</comment>
+ <comment xml:lang="zh_CN">松下原始图像</comment>
<comment xml:lang="vi">Ảnh thô Panasonic</comment>
- <comment xml:lang="zh-CN">松下原始图像</comment>
- <comment xml:lang="zh-TW">Panasonic 原始影像</comment>
+ <comment xml:lang="uk">цифровий негатив Panasonic</comment>
+ <comment xml:lang="tr">Panasonic ham görüntüsü</comment>
+ <comment xml:lang="sv">Panasonic-råbild</comment>
+ <comment xml:lang="sr">Панасоник сирова слика</comment>
+ <comment xml:lang="sq">figurë Panasonic e papërpunuar</comment>
+ <comment xml:lang="sl">Surova slikovna datoteka Panasonic</comment>
+ <comment xml:lang="si">පැනසොනික් අමු රූපය</comment>
+ <comment xml:lang="sk">Surový obrázok Panasonic</comment>
+ <comment xml:lang="ru">Необработанное изображение Panasonic</comment>
+ <comment xml:lang="ro">Imagine brută Panasonic</comment>
+ <comment xml:lang="pt_BR">Imagem bruta da Panasonic</comment>
+ <comment xml:lang="pt">imagem em bruto Panasonic</comment>
+ <comment xml:lang="pl">Obraz raw Panasonic</comment>
+ <comment xml:lang="oc">imatge brut Panasonic</comment>
+ <comment xml:lang="nn">Panasonic råbilete</comment>
+ <comment xml:lang="nl">onbewerkt Panasonic-beeld</comment>
+ <comment xml:lang="nb">Panasonic raw-bilde</comment>
+ <comment xml:lang="lv">Panasonic jēlattēls</comment>
+ <comment xml:lang="lt">Panasonic neapdorotas paveikslėlis</comment>
+ <comment xml:lang="ko">파나소닉 RAW 사진</comment>
+ <comment xml:lang="kk">Panasonic өңделмеген суреті</comment>
+ <comment xml:lang="ja">Panasonic raw 画像</comment>
+ <comment xml:lang="it">Immagine raw Panasonic</comment>
+ <comment xml:lang="is">Panasonic hrámynd</comment>
+ <comment xml:lang="id">Citra mentah Panasonic</comment>
+ <comment xml:lang="ia">Imagine brute Panasonic</comment>
+ <comment xml:lang="hu">Panasonic nyers kép</comment>
+ <comment xml:lang="hr">Panasonic osnovna slika</comment>
+ <comment xml:lang="he">תמונה גולמית של Panasonic</comment>
+ <comment xml:lang="gl">imaxe en bruto de Panasonic</comment>
+ <comment xml:lang="ga">amhíomhá Panasonic</comment>
+ <comment xml:lang="fur">imagjin grese Panasonic</comment>
+ <comment xml:lang="fr">image brute Panasonic</comment>
+ <comment xml:lang="fo">Panasonic rámynd</comment>
+ <comment xml:lang="fi">Panasonic-raakakuva</comment>
+ <comment xml:lang="eu">Panasonic irudi gordina</comment>
+ <comment xml:lang="es">imagen en bruto de Panasonic</comment>
+ <comment xml:lang="en_GB">Panasonic raw image</comment>
+ <comment xml:lang="el">Ανεπεξέργαστη εικόνα Panasonic</comment>
+ <comment xml:lang="de">Panasonic-Rohbild</comment>
+ <comment xml:lang="da">Panasonic raw-billede</comment>
+ <comment xml:lang="cs">surový obrázek Panasonic</comment>
+ <comment xml:lang="ca">imatge en cru de Panasonic</comment>
+ <comment xml:lang="bg">Изображение — Panasonic raw</comment>
+ <comment xml:lang="be@latin">Suvoraja vyjava Panasonic</comment>
+ <comment xml:lang="be">неапрацаваная выява Panasonic</comment>
+ <comment xml:lang="ar">صورة Panasonic خامة</comment>
+ <comment xml:lang="af">Panasonic rou beeld</comment>
<sub-class-of type="image/x-dcraw"/>
- <magic priority="50">
+ <magic>
<!-- Some kind of TIFF file with a non-standard version in prefix !-->
<match value="IIU\x00\x18\x00\x00\x00" type="string" offset="0"/>
</magic>
@@ -27621,54 +29162,57 @@ command to generate the output files.
</mime-type>
<mime-type type="image/x-pentax-pef">
<comment>Pentax PEF raw image</comment>
- <comment xml:lang="af">Pentax PEF rou beeld</comment>
- <comment xml:lang="ar">صورة Pentax PEF خامة</comment>
- <comment xml:lang="be-Latn">Suvoraja vyjava Pentax PEF</comment>
- <comment xml:lang="bg">Изображение — Pentax PEF raw</comment>
- <comment xml:lang="ca">imatge en cru de Pentax PEF</comment>
- <comment xml:lang="cs">surový obrázek Pentax PEF</comment>
- <comment xml:lang="da">Pentax PEF raw-billede</comment>
- <comment xml:lang="de">Pentax-PEF-Rohbild</comment>
- <comment xml:lang="el">Ανεπεξέργαστη εικόνα Pentax PEF</comment>
- <comment xml:lang="en-GB">Pentax PEF raw image</comment>
- <comment xml:lang="es">imagen en bruto PEF de Pentax</comment>
- <comment xml:lang="eu">Pentax PEF irudi gordina</comment>
- <comment xml:lang="fi">Pentax-PEF-raakakuva</comment>
- <comment xml:lang="fo">Pentax PEF rámynd</comment>
- <comment xml:lang="fr">image brute PEF Pentax</comment>
- <comment xml:lang="fur">imagjin grese Pentax PEF</comment>
- <comment xml:lang="ga">amhíomhá Pentax PEF</comment>
- <comment xml:lang="gl">imaxe en bruto PEF de Pentax</comment>
- <comment xml:lang="he">תמונה גולמית של Pentax PEF</comment>
- <comment xml:lang="hr">Pentax PEF osnovna slika</comment>
- <comment xml:lang="hu">Pentax PEF nyers kép</comment>
- <comment xml:lang="ia">Imagine brute Pentax PEF</comment>
- <comment xml:lang="id">Citra mentah Pentax PEF</comment>
- <comment xml:lang="it">Immagine raw Pentax PEF</comment>
- <comment xml:lang="ja">Pentax PEF raw 画像</comment>
- <comment xml:lang="kk">Pentax PEF өңделмеген суреті</comment>
- <comment xml:lang="ko">펜탁스 PEF RAW 사진</comment>
- <comment xml:lang="lt">Pentax PEF neapdorotas paveikslėlis</comment>
- <comment xml:lang="lv">Pentax PEF jēlattēls</comment>
- <comment xml:lang="nb">Pentax PEF raw-bilde</comment>
- <comment xml:lang="nl">onbewerkt Pentax PEF-beeld</comment>
- <comment xml:lang="nn">Pentax PEF råbilete</comment>
- <comment xml:lang="oc">imatge brut PEF Pentax</comment>
- <comment xml:lang="pl">Surowy obraz Pentax PEF</comment>
- <comment xml:lang="pt">imagem em bruto Pentax PEF</comment>
- <comment xml:lang="pt-BR">Imagem bruta PEF da Pentax</comment>
- <comment xml:lang="ro">Imagine brută Pentax PEF</comment>
- <comment xml:lang="ru">Необработанное изображение Pentax PEF</comment>
- <comment xml:lang="sk">Surový obrázok Pentax PEF</comment>
- <comment xml:lang="sl">Surova slikovna datoteka Pentax PEF</comment>
- <comment xml:lang="sq">Figurë raw Pentax PEF</comment>
- <comment xml:lang="sr">Пентакс ПЕФ сирова слика</comment>
- <comment xml:lang="sv">Pentax PEF-råbild</comment>
- <comment xml:lang="tr">Pentax PEF ham görüntüsü</comment>
- <comment xml:lang="uk">цифровий негатив PEF Pentax</comment>
+ <comment xml:lang="zh_TW">Pentax PEF 原始影像</comment>
+ <comment xml:lang="zh_CN">宾得 PEF 原始图像</comment>
<comment xml:lang="vi">Ảnh thô Pentax PEF</comment>
- <comment xml:lang="zh-CN">宾得 PEF 原始图像</comment>
- <comment xml:lang="zh-TW">Pentax PEF 原始影像</comment>
+ <comment xml:lang="uk">цифровий негатив PEF Pentax</comment>
+ <comment xml:lang="tr">Pentax PEF ham görüntüsü</comment>
+ <comment xml:lang="sv">Pentax PEF-råbild</comment>
+ <comment xml:lang="sr">Пентакс ПЕФ сирова слика</comment>
+ <comment xml:lang="sq">figurë Pentax PEF e papërpunuar</comment>
+ <comment xml:lang="sl">Surova slikovna datoteka Pentax PEF</comment>
+ <comment xml:lang="si">Pentax PEF අමු රූපය</comment>
+ <comment xml:lang="sk">Surový obrázok Pentax PEF</comment>
+ <comment xml:lang="ru">Необработанное изображение Pentax PEF</comment>
+ <comment xml:lang="ro">Imagine brută Pentax PEF</comment>
+ <comment xml:lang="pt_BR">Imagem bruta PEF da Pentax</comment>
+ <comment xml:lang="pt">imagem em bruto Pentax PEF</comment>
+ <comment xml:lang="pl">Surowy obraz Pentax PEF</comment>
+ <comment xml:lang="oc">imatge brut PEF Pentax</comment>
+ <comment xml:lang="nn">Pentax PEF råbilete</comment>
+ <comment xml:lang="nl">onbewerkt Pentax PEF-beeld</comment>
+ <comment xml:lang="nb">Pentax PEF raw-bilde</comment>
+ <comment xml:lang="lv">Pentax PEF jēlattēls</comment>
+ <comment xml:lang="lt">Pentax PEF neapdorotas paveikslėlis</comment>
+ <comment xml:lang="ko">펜탁스 PEF RAW 사진</comment>
+ <comment xml:lang="kk">Pentax PEF өңделмеген суреті</comment>
+ <comment xml:lang="ja">Pentax PEF raw 画像</comment>
+ <comment xml:lang="it">Immagine raw Pentax PEF</comment>
+ <comment xml:lang="is">Pentax PEF hrámynd</comment>
+ <comment xml:lang="id">Citra mentah Pentax PEF</comment>
+ <comment xml:lang="ia">Imagine brute Pentax PEF</comment>
+ <comment xml:lang="hu">Pentax PEF nyers kép</comment>
+ <comment xml:lang="hr">Pentax PEF osnovna slika</comment>
+ <comment xml:lang="he">תמונה גולמית של Pentax PEF</comment>
+ <comment xml:lang="gl">imaxe en bruto PEF de Pentax</comment>
+ <comment xml:lang="ga">amhíomhá Pentax PEF</comment>
+ <comment xml:lang="fur">imagjin grese Pentax PEF</comment>
+ <comment xml:lang="fr">image brute PEF Pentax</comment>
+ <comment xml:lang="fo">Pentax PEF rámynd</comment>
+ <comment xml:lang="fi">Pentax-PEF-raakakuva</comment>
+ <comment xml:lang="eu">Pentax PEF irudi gordina</comment>
+ <comment xml:lang="es">imagen en bruto PEF de Pentax</comment>
+ <comment xml:lang="en_GB">Pentax PEF raw image</comment>
+ <comment xml:lang="el">Ανεπεξέργαστη εικόνα Pentax PEF</comment>
+ <comment xml:lang="de">Pentax-PEF-Rohbild</comment>
+ <comment xml:lang="da">Pentax PEF raw-billede</comment>
+ <comment xml:lang="cs">surový obrázek Pentax PEF</comment>
+ <comment xml:lang="ca">imatge en cru de Pentax PEF</comment>
+ <comment xml:lang="bg">Изображение — Pentax PEF raw</comment>
+ <comment xml:lang="be@latin">Suvoraja vyjava Pentax PEF</comment>
+ <comment xml:lang="be">неапрацаваная выява Pentax PEF</comment>
+ <comment xml:lang="ar">صورة Pentax PEF خامة</comment>
+ <comment xml:lang="af">Pentax PEF rou beeld</comment>
<acronym>PEF</acronym>
<expanded-acronym>Pentax Electronic Format</expanded-acronym>
<sub-class-of type="image/x-dcraw"/>
@@ -27677,58 +29221,61 @@ command to generate the output files.
</mime-type>
<mime-type type="image/x-sigma-x3f">
<comment>Sigma X3F raw image</comment>
- <comment xml:lang="af">Sigma X3F rou beeld</comment>
- <comment xml:lang="ar">صورة Sigma X3F خامة</comment>
- <comment xml:lang="be-Latn">Suvoraja vyjava Sigma X3F</comment>
- <comment xml:lang="bg">Изображение — Sigma X3F raw</comment>
- <comment xml:lang="ca">imatge en cru de Sigma X3F</comment>
- <comment xml:lang="cs">surový obrázek Sigma X3F</comment>
- <comment xml:lang="da">Sigma X3F raw-billede</comment>
- <comment xml:lang="de">Sigma-X3F-Rohbild</comment>
- <comment xml:lang="el">Ανεπεξέργαστη εικόνα Sigma X3F</comment>
- <comment xml:lang="en-GB">Sigma X3F raw image</comment>
- <comment xml:lang="es">imagen en bruto X3F de Sigma</comment>
- <comment xml:lang="eu">Sigma X3F irudi gordina</comment>
- <comment xml:lang="fi">Sigma-X3F-raakakuva</comment>
- <comment xml:lang="fo">Sigma X3F rámynd</comment>
- <comment xml:lang="fr">image brute X3F Sigma</comment>
- <comment xml:lang="fur">imagjin grese Sigma X3F</comment>
- <comment xml:lang="ga">amhíomhá Sigma X3F</comment>
- <comment xml:lang="gl">imaxe en bruto X3F de Sigma</comment>
- <comment xml:lang="he">תמונה גולמית של Sigma X3F</comment>
- <comment xml:lang="hr">Sigma X3F osnovna slika</comment>
- <comment xml:lang="hu">Sigma XF3 nyers kép</comment>
- <comment xml:lang="ia">Imagine brute Sigma X3F</comment>
- <comment xml:lang="id">Citra mentah Sigma X3F</comment>
- <comment xml:lang="it">Immagine raw Sigma X3F</comment>
- <comment xml:lang="ja">Sigma X3F raw 画像</comment>
- <comment xml:lang="kk">Sigma X3F өңделмеген суреті</comment>
- <comment xml:lang="ko">시그마 X3F RAW 사진</comment>
- <comment xml:lang="lt">Sigma X3F neapdorotas paveikslėlis</comment>
- <comment xml:lang="lv">Sigma X3F jēlattēls</comment>
- <comment xml:lang="nb">Sigma X3F raw-bilde</comment>
- <comment xml:lang="nl">onbewerkt Sigma X3F-beeld</comment>
- <comment xml:lang="nn">Sigma X3F råbilete</comment>
- <comment xml:lang="oc">imatge brut X3F Sigma</comment>
- <comment xml:lang="pl">Surowy obraz X3F Sigma</comment>
- <comment xml:lang="pt">imagem em bruto Sigma X3F</comment>
- <comment xml:lang="pt-BR">Imagem bruta X3F da Sigma</comment>
- <comment xml:lang="ro">Imagine brută Sigma X3F</comment>
- <comment xml:lang="ru">Необработанное изображение Sigma X3F</comment>
- <comment xml:lang="sk">Surový obrázok Sigma X3F</comment>
- <comment xml:lang="sl">Surova slikovna datoteka Sigma X3F</comment>
- <comment xml:lang="sq">Fifurë raw Sigma X3F</comment>
- <comment xml:lang="sr">Сигма Икс3Ф сирова слика</comment>
- <comment xml:lang="sv">Sigma X3F-råbild</comment>
- <comment xml:lang="tr">Sigma X3F ham görüntüsü</comment>
- <comment xml:lang="uk">цифровий негатив X3F Sigma</comment>
+ <comment xml:lang="zh_TW">Sigma X3F 原始影像</comment>
+ <comment xml:lang="zh_CN">适马 X3F 原始图像</comment>
<comment xml:lang="vi">Ảnh thô Sigma X3F</comment>
- <comment xml:lang="zh-CN">适马 X3F 原始图像</comment>
- <comment xml:lang="zh-TW">Sigma X3F 原始影像</comment>
+ <comment xml:lang="uk">цифровий негатив X3F Sigma</comment>
+ <comment xml:lang="tr">Sigma X3F ham görüntüsü</comment>
+ <comment xml:lang="sv">Sigma X3F-råbild</comment>
+ <comment xml:lang="sr">Сигма Икс3Ф сирова слика</comment>
+ <comment xml:lang="sq">figurë Sigma X3F e papërpunuar</comment>
+ <comment xml:lang="sl">Surova slikovna datoteka Sigma X3F</comment>
+ <comment xml:lang="si">Sigma X3F අමු රූපය</comment>
+ <comment xml:lang="sk">Surový obrázok Sigma X3F</comment>
+ <comment xml:lang="ru">Необработанное изображение Sigma X3F</comment>
+ <comment xml:lang="ro">Imagine brută Sigma X3F</comment>
+ <comment xml:lang="pt_BR">Imagem bruta X3F da Sigma</comment>
+ <comment xml:lang="pt">imagem em bruto Sigma X3F</comment>
+ <comment xml:lang="pl">Surowy obraz X3F Sigma</comment>
+ <comment xml:lang="oc">imatge brut X3F Sigma</comment>
+ <comment xml:lang="nn">Sigma X3F råbilete</comment>
+ <comment xml:lang="nl">onbewerkt Sigma X3F-beeld</comment>
+ <comment xml:lang="nb">Sigma X3F raw-bilde</comment>
+ <comment xml:lang="lv">Sigma X3F jēlattēls</comment>
+ <comment xml:lang="lt">Sigma X3F neapdorotas paveikslėlis</comment>
+ <comment xml:lang="ko">시그마 X3F RAW 사진</comment>
+ <comment xml:lang="kk">Sigma X3F өңделмеген суреті</comment>
+ <comment xml:lang="ja">Sigma X3F raw 画像</comment>
+ <comment xml:lang="it">Immagine raw Sigma X3F</comment>
+ <comment xml:lang="is">Sigma X3F hrámynd</comment>
+ <comment xml:lang="id">Citra mentah Sigma X3F</comment>
+ <comment xml:lang="ia">Imagine brute Sigma X3F</comment>
+ <comment xml:lang="hu">Sigma XF3 nyers kép</comment>
+ <comment xml:lang="hr">Sigma X3F osnovna slika</comment>
+ <comment xml:lang="he">תמונה גולמית של Sigma X3F</comment>
+ <comment xml:lang="gl">imaxe en bruto X3F de Sigma</comment>
+ <comment xml:lang="ga">amhíomhá Sigma X3F</comment>
+ <comment xml:lang="fur">imagjin grese Sigma X3F</comment>
+ <comment xml:lang="fr">image brute X3F Sigma</comment>
+ <comment xml:lang="fo">Sigma X3F rámynd</comment>
+ <comment xml:lang="fi">Sigma-X3F-raakakuva</comment>
+ <comment xml:lang="eu">Sigma X3F irudi gordina</comment>
+ <comment xml:lang="es">imagen en bruto X3F de Sigma</comment>
+ <comment xml:lang="en_GB">Sigma X3F raw image</comment>
+ <comment xml:lang="el">Ανεπεξέργαστη εικόνα Sigma X3F</comment>
+ <comment xml:lang="de">Sigma-X3F-Rohbild</comment>
+ <comment xml:lang="da">Sigma X3F raw-billede</comment>
+ <comment xml:lang="cs">surový obrázek Sigma X3F</comment>
+ <comment xml:lang="ca">imatge en cru de Sigma X3F</comment>
+ <comment xml:lang="bg">Изображение — Sigma X3F raw</comment>
+ <comment xml:lang="be@latin">Suvoraja vyjava Sigma X3F</comment>
+ <comment xml:lang="be">неапрацаваная выява Sigma X3F</comment>
+ <comment xml:lang="ar">صورة Sigma X3F خامة</comment>
+ <comment xml:lang="af">Sigma X3F rou beeld</comment>
<acronym>X3F</acronym>
<expanded-acronym>X3 Foveon</expanded-acronym>
<sub-class-of type="image/x-dcraw"/>
- <magic priority="50">
+ <magic>
<!-- The header is "FOVb" (Foveon) !-->
<match value="FOVb" type="string" offset="0">
<!-- Followed by a 32bit LSB specifying the version number (major.minor) !-->
@@ -27739,54 +29286,57 @@ command to generate the output files.
</mime-type>
<mime-type type="image/x-sony-srf">
<comment>Sony SRF raw image</comment>
- <comment xml:lang="af">Sony SRF rou beeld</comment>
- <comment xml:lang="ar">صورة Sony SRF خامة</comment>
- <comment xml:lang="be-Latn">Suvoraja vyjava Sony SRF</comment>
- <comment xml:lang="bg">Изображение — Sony SRF raw</comment>
- <comment xml:lang="ca">imatge en cru de Sony SRF</comment>
- <comment xml:lang="cs">surový obrázek Sony SRF</comment>
- <comment xml:lang="da">Sony SRF raw-billede</comment>
- <comment xml:lang="de">Sony-SRF-Rohbild</comment>
- <comment xml:lang="el">Ανεπεξέργαστη εικόνα Sony SRF</comment>
- <comment xml:lang="en-GB">Sony SRF raw image</comment>
- <comment xml:lang="es">imagen en bruto SRF de Sony</comment>
- <comment xml:lang="eu">Sony SRF irudi gordina</comment>
- <comment xml:lang="fi">Sony-SRF-raakakuva</comment>
- <comment xml:lang="fo">Sony SRF rámynd</comment>
- <comment xml:lang="fr">image brute SRF Sony</comment>
- <comment xml:lang="fur">imagjin grese Sony SRF</comment>
- <comment xml:lang="ga">amhíomhá Sony SRF</comment>
- <comment xml:lang="gl">imaxe en bruto SRF de sony</comment>
- <comment xml:lang="he">תמונה גולמית של Sony SRF</comment>
- <comment xml:lang="hr">Sony SRF osnovna slika</comment>
- <comment xml:lang="hu">Sony SRF nyers kép</comment>
- <comment xml:lang="ia">Imagine brute Sony SRF</comment>
- <comment xml:lang="id">Citra mentah Sony SRF</comment>
- <comment xml:lang="it">Immagine raw Sony SRF</comment>
- <comment xml:lang="ja">Sony SRF raw 画像</comment>
- <comment xml:lang="kk">Sony SRF өңделмеген суреті</comment>
- <comment xml:lang="ko">소니 SRF RAW 사진</comment>
- <comment xml:lang="lt">Sony SRF neapdorotas paveikslėlis</comment>
- <comment xml:lang="lv">Sony SRF jēlattēls</comment>
- <comment xml:lang="nb">Sony SRF raw-bilde</comment>
- <comment xml:lang="nl">onbewerkt Sony SRF-beeld</comment>
- <comment xml:lang="nn">Sony SRF råbilete</comment>
- <comment xml:lang="oc">imatge brut SRF Sony</comment>
- <comment xml:lang="pl">Surowy obraz SRF Sony</comment>
- <comment xml:lang="pt">imagem em bruto Sony SRF</comment>
- <comment xml:lang="pt-BR">Imagem bruta SRF da Sony</comment>
- <comment xml:lang="ro">Imagine brută Sony SRF</comment>
- <comment xml:lang="ru">Необработанное изображение Sony SRF</comment>
- <comment xml:lang="sk">Surový obrázok Sony SRF</comment>
- <comment xml:lang="sl">Surova slikovna datoteka Sony SRF</comment>
- <comment xml:lang="sq">Figurë raw Sony SRF</comment>
- <comment xml:lang="sr">Сони СРФ сирова слика</comment>
- <comment xml:lang="sv">Sony SRF-råbild</comment>
- <comment xml:lang="tr">Sony SRF ham görüntüsü</comment>
- <comment xml:lang="uk">цифровий негатив SRF Sony</comment>
+ <comment xml:lang="zh_TW">Sony SRF 原始影像</comment>
+ <comment xml:lang="zh_CN">索尼 SRF 原始映像</comment>
<comment xml:lang="vi">Ảnh thô Sony SRF</comment>
- <comment xml:lang="zh-CN">索尼 SRF 原始映像</comment>
- <comment xml:lang="zh-TW">Sony SRF 原始影像</comment>
+ <comment xml:lang="uk">цифровий негатив SRF Sony</comment>
+ <comment xml:lang="tr">Sony SRF ham görüntüsü</comment>
+ <comment xml:lang="sv">Sony SRF-råbild</comment>
+ <comment xml:lang="sr">Сони СРФ сирова слика</comment>
+ <comment xml:lang="sq">figurë Sony SRF e papërpunuar</comment>
+ <comment xml:lang="sl">Surova slikovna datoteka Sony SRF</comment>
+ <comment xml:lang="si">Sony SRF අමු රූපය</comment>
+ <comment xml:lang="sk">Surový obrázok Sony SRF</comment>
+ <comment xml:lang="ru">Необработанное изображение Sony SRF</comment>
+ <comment xml:lang="ro">Imagine brută Sony SRF</comment>
+ <comment xml:lang="pt_BR">Imagem bruta SRF da Sony</comment>
+ <comment xml:lang="pt">imagem em bruto Sony SRF</comment>
+ <comment xml:lang="pl">Surowy obraz SRF Sony</comment>
+ <comment xml:lang="oc">imatge brut SRF Sony</comment>
+ <comment xml:lang="nn">Sony SRF råbilete</comment>
+ <comment xml:lang="nl">onbewerkt Sony SRF-beeld</comment>
+ <comment xml:lang="nb">Sony SRF raw-bilde</comment>
+ <comment xml:lang="lv">Sony SRF jēlattēls</comment>
+ <comment xml:lang="lt">Sony SRF neapdorotas paveikslėlis</comment>
+ <comment xml:lang="ko">소니 SRF RAW 사진</comment>
+ <comment xml:lang="kk">Sony SRF өңделмеген суреті</comment>
+ <comment xml:lang="ja">Sony SRF raw 画像</comment>
+ <comment xml:lang="it">Immagine raw Sony SRF</comment>
+ <comment xml:lang="is">Sony SRF hrámynd</comment>
+ <comment xml:lang="id">Citra mentah Sony SRF</comment>
+ <comment xml:lang="ia">Imagine brute Sony SRF</comment>
+ <comment xml:lang="hu">Sony SRF nyers kép</comment>
+ <comment xml:lang="hr">Sony SRF osnovna slika</comment>
+ <comment xml:lang="he">תמונה גולמית של Sony SRF</comment>
+ <comment xml:lang="gl">imaxe en bruto SRF de sony</comment>
+ <comment xml:lang="ga">amhíomhá Sony SRF</comment>
+ <comment xml:lang="fur">imagjin grese Sony SRF</comment>
+ <comment xml:lang="fr">image brute SRF Sony</comment>
+ <comment xml:lang="fo">Sony SRF rámynd</comment>
+ <comment xml:lang="fi">Sony-SRF-raakakuva</comment>
+ <comment xml:lang="eu">Sony SRF irudi gordina</comment>
+ <comment xml:lang="es">imagen en bruto SRF de Sony</comment>
+ <comment xml:lang="en_GB">Sony SRF raw image</comment>
+ <comment xml:lang="el">Ανεπεξέργαστη εικόνα Sony SRF</comment>
+ <comment xml:lang="de">Sony-SRF-Rohbild</comment>
+ <comment xml:lang="da">Sony SRF raw-billede</comment>
+ <comment xml:lang="cs">surový obrázek Sony SRF</comment>
+ <comment xml:lang="ca">imatge en cru de Sony SRF</comment>
+ <comment xml:lang="bg">Изображение — Sony SRF raw</comment>
+ <comment xml:lang="be@latin">Suvoraja vyjava Sony SRF</comment>
+ <comment xml:lang="be">неапрацаваная выява Sony SRF</comment>
+ <comment xml:lang="ar">صورة Sony SRF خامة</comment>
+ <comment xml:lang="af">Sony SRF rou beeld</comment>
<acronym>SRF</acronym>
<expanded-acronym>Sony Raw Format</expanded-acronym>
<sub-class-of type="image/x-dcraw"/>
@@ -27795,54 +29345,57 @@ command to generate the output files.
</mime-type>
<mime-type type="image/x-sony-sr2">
<comment>Sony SR2 raw image</comment>
- <comment xml:lang="af">Sony SR2 rou beeld</comment>
- <comment xml:lang="ar">صورة Sony SR2 خامة</comment>
- <comment xml:lang="be-Latn">Suvoraja vyjava Sony SR2</comment>
- <comment xml:lang="bg">Изображение — Sony SR2 raw</comment>
- <comment xml:lang="ca">imatge en cru de Sony SR2</comment>
- <comment xml:lang="cs">surový obrázek Sony SR2</comment>
- <comment xml:lang="da">Sony SR2 raw-billede</comment>
- <comment xml:lang="de">Sony-SR2-Rohbild</comment>
- <comment xml:lang="el">Ανεπεξέργαστη εικόνα Sony SR2</comment>
- <comment xml:lang="en-GB">Sony SR2 raw image</comment>
- <comment xml:lang="es">imagen en bruto SR2 de Sony</comment>
- <comment xml:lang="eu">Sony SR2 irudi gordina</comment>
- <comment xml:lang="fi">Sony-SR2-raakakuva</comment>
- <comment xml:lang="fo">Sony SR2 rámynd</comment>
- <comment xml:lang="fr">image brute SR2 Sony</comment>
- <comment xml:lang="fur">imagjin grese Sony SR2</comment>
- <comment xml:lang="ga">amhíomhá Sony SR2</comment>
- <comment xml:lang="gl">imaxe en bruto SR2 de sony</comment>
- <comment xml:lang="he">תמונה גולמית של Sony SR2</comment>
- <comment xml:lang="hr">Sony SR2 osnovna slika</comment>
- <comment xml:lang="hu">Sony SR2 nyers kép</comment>
- <comment xml:lang="ia">Imagine brute Sony SR2</comment>
- <comment xml:lang="id">Citra mentah Sony SR2</comment>
- <comment xml:lang="it">Immagine raw Sony SR2</comment>
- <comment xml:lang="ja">Sony SR2 raw 画像</comment>
- <comment xml:lang="kk">Sony SR2 өңделмеген суреті</comment>
- <comment xml:lang="ko">소니 SR2 RAW 사진</comment>
- <comment xml:lang="lt">Sony SR2 neapdorotas paveikslėlis</comment>
- <comment xml:lang="lv">Sony SR2 jēlattēls</comment>
- <comment xml:lang="nb">Sony SR2 raw-bilde</comment>
- <comment xml:lang="nl">onbewerkt Sony SR2-beeld</comment>
- <comment xml:lang="nn">Sony SR2 råbilete</comment>
- <comment xml:lang="oc">imatge brut SR2 Sony</comment>
- <comment xml:lang="pl">Surowy obraz SR2 Sony</comment>
- <comment xml:lang="pt">imagem em bruto Sony SR2</comment>
- <comment xml:lang="pt-BR">Imagem bruta SR2 da Sony</comment>
- <comment xml:lang="ro">Imagine brută Sony SR2</comment>
- <comment xml:lang="ru">Необработанное изображение Sony SR2</comment>
- <comment xml:lang="sk">Surový obrázok Sony SR2</comment>
- <comment xml:lang="sl">Surova slikovna datoteka Sony SR2</comment>
- <comment xml:lang="sq">Figurë raw Sony SR2</comment>
- <comment xml:lang="sr">Сони СР2 сирова слика</comment>
- <comment xml:lang="sv">Sony SR2-råbild</comment>
- <comment xml:lang="tr">Sony SR2 ham görüntüsü</comment>
- <comment xml:lang="uk">цифровий негатив SR2 Sony</comment>
+ <comment xml:lang="zh_TW">Sony SR2 原始影像</comment>
+ <comment xml:lang="zh_CN">索尼 SR2 原始映像</comment>
<comment xml:lang="vi">Ảnh thô Sony SR2</comment>
- <comment xml:lang="zh-CN">索尼 SR2 原始映像</comment>
- <comment xml:lang="zh-TW">Sony SR2 原始影像</comment>
+ <comment xml:lang="uk">цифровий негатив SR2 Sony</comment>
+ <comment xml:lang="tr">Sony SR2 ham görüntüsü</comment>
+ <comment xml:lang="sv">Sony SR2-råbild</comment>
+ <comment xml:lang="sr">Сони СР2 сирова слика</comment>
+ <comment xml:lang="sq">figurë Sony SR2 e papërpunuar</comment>
+ <comment xml:lang="sl">Surova slikovna datoteka Sony SR2</comment>
+ <comment xml:lang="si">Sony SR2 අමු රූපය</comment>
+ <comment xml:lang="sk">Surový obrázok Sony SR2</comment>
+ <comment xml:lang="ru">Необработанное изображение Sony SR2</comment>
+ <comment xml:lang="ro">Imagine brută Sony SR2</comment>
+ <comment xml:lang="pt_BR">Imagem bruta SR2 da Sony</comment>
+ <comment xml:lang="pt">imagem em bruto Sony SR2</comment>
+ <comment xml:lang="pl">Surowy obraz SR2 Sony</comment>
+ <comment xml:lang="oc">imatge brut SR2 Sony</comment>
+ <comment xml:lang="nn">Sony SR2 råbilete</comment>
+ <comment xml:lang="nl">onbewerkt Sony SR2-beeld</comment>
+ <comment xml:lang="nb">Sony SR2 raw-bilde</comment>
+ <comment xml:lang="lv">Sony SR2 jēlattēls</comment>
+ <comment xml:lang="lt">Sony SR2 neapdorotas paveikslėlis</comment>
+ <comment xml:lang="ko">소니 SR2 RAW 사진</comment>
+ <comment xml:lang="kk">Sony SR2 өңделмеген суреті</comment>
+ <comment xml:lang="ja">Sony SR2 raw 画像</comment>
+ <comment xml:lang="it">Immagine raw Sony SR2</comment>
+ <comment xml:lang="is">Sony SR2 hrámynd</comment>
+ <comment xml:lang="id">Citra mentah Sony SR2</comment>
+ <comment xml:lang="ia">Imagine brute Sony SR2</comment>
+ <comment xml:lang="hu">Sony SR2 nyers kép</comment>
+ <comment xml:lang="hr">Sony SR2 osnovna slika</comment>
+ <comment xml:lang="he">תמונה גולמית של Sony SR2</comment>
+ <comment xml:lang="gl">imaxe en bruto SR2 de sony</comment>
+ <comment xml:lang="ga">amhíomhá Sony SR2</comment>
+ <comment xml:lang="fur">imagjin grese Sony SR2</comment>
+ <comment xml:lang="fr">image brute SR2 Sony</comment>
+ <comment xml:lang="fo">Sony SR2 rámynd</comment>
+ <comment xml:lang="fi">Sony-SR2-raakakuva</comment>
+ <comment xml:lang="eu">Sony SR2 irudi gordina</comment>
+ <comment xml:lang="es">imagen en bruto SR2 de Sony</comment>
+ <comment xml:lang="en_GB">Sony SR2 raw image</comment>
+ <comment xml:lang="el">Ανεπεξέργαστη εικόνα Sony SR2</comment>
+ <comment xml:lang="de">Sony-SR2-Rohbild</comment>
+ <comment xml:lang="da">Sony SR2 raw-billede</comment>
+ <comment xml:lang="cs">surový obrázek Sony SR2</comment>
+ <comment xml:lang="ca">imatge en cru de Sony SR2</comment>
+ <comment xml:lang="bg">Изображение — Sony SR2 raw</comment>
+ <comment xml:lang="be@latin">Suvoraja vyjava Sony SR2</comment>
+ <comment xml:lang="be">неапрацаваная выява Sony SR2</comment>
+ <comment xml:lang="ar">صورة Sony SR2 خامة</comment>
+ <comment xml:lang="af">Sony SR2 rou beeld</comment>
<acronym>SR2</acronym>
<expanded-acronym>Sony Raw format 2</expanded-acronym>
<sub-class-of type="image/x-dcraw"/>
@@ -27851,54 +29404,57 @@ command to generate the output files.
</mime-type>
<mime-type type="image/x-sony-arw">
<comment>Sony ARW raw image</comment>
- <comment xml:lang="af">Sony ARW rou beeld</comment>
- <comment xml:lang="ar">صورة Sony ARW خامة</comment>
- <comment xml:lang="be-Latn">Suvoraja vyjava Sony ARW</comment>
- <comment xml:lang="bg">Изображение — Sony ARW raw</comment>
- <comment xml:lang="ca">imatge en cru de Sony ARW</comment>
- <comment xml:lang="cs">surový obrázek Sony ARW</comment>
- <comment xml:lang="da">Sony ARW raw-billede</comment>
- <comment xml:lang="de">Sony-ARW-Rohbild</comment>
- <comment xml:lang="el">Ανεπεξέργαστη εικόνα Sony ARW</comment>
- <comment xml:lang="en-GB">Sony ARW raw image</comment>
- <comment xml:lang="es">imagen en bruto ARW de Sony</comment>
- <comment xml:lang="eu">Sony ARW irudi gordina</comment>
- <comment xml:lang="fi">Sony-ARW-raakakuva</comment>
- <comment xml:lang="fo">Sony ARW rámynd</comment>
- <comment xml:lang="fr">image brute ARW Sony</comment>
- <comment xml:lang="fur">imagjin grese Sony ARW</comment>
- <comment xml:lang="ga">amhíomhá Sony ARW</comment>
- <comment xml:lang="gl">imaxe en bruto ARW de sony</comment>
- <comment xml:lang="he">תמונה גולמית של Sony ARW</comment>
- <comment xml:lang="hr">Sony ARW osnovna slika</comment>
- <comment xml:lang="hu">Sony ARW nyers kép</comment>
- <comment xml:lang="ia">Imagine brute Sony ARW</comment>
- <comment xml:lang="id">Citra mentah Sony ARW</comment>
- <comment xml:lang="it">Immagine raw Sony ARW</comment>
- <comment xml:lang="ja">Sony ARW raw 画像</comment>
- <comment xml:lang="kk">Sony ARW өңделмеген суреті</comment>
- <comment xml:lang="ko">소니 ARW RAW 사진</comment>
- <comment xml:lang="lt">Sony ARW neapdorotas paveikslėlis</comment>
- <comment xml:lang="lv">Sony ARW jēlattēls</comment>
- <comment xml:lang="nb">Sony ARW raw-bilde</comment>
- <comment xml:lang="nl">onbewerkt Sony ARW-beeld</comment>
- <comment xml:lang="nn">Sony ARW råbilete</comment>
- <comment xml:lang="oc">imatge brut ARW Sony</comment>
- <comment xml:lang="pl">Surowy obraz ARW Sony</comment>
- <comment xml:lang="pt">imagem em bruto Sony ARW</comment>
- <comment xml:lang="pt-BR">Imagem bruta ARW da Sony</comment>
- <comment xml:lang="ro">Imagine brută Sony ARW</comment>
- <comment xml:lang="ru">Необработанное изображение Sony ARW</comment>
- <comment xml:lang="sk">Surový obrázok Sony ARW</comment>
- <comment xml:lang="sl">Surova slikovna datoteka Sony ARW</comment>
- <comment xml:lang="sq">Figurë raw Sony ARW</comment>
- <comment xml:lang="sr">Сони АРВ сирова слика</comment>
- <comment xml:lang="sv">Sony ARW-råbild</comment>
- <comment xml:lang="tr">Sony ARW ham görüntüsü</comment>
- <comment xml:lang="uk">цифровий негатив ARW Sony</comment>
+ <comment xml:lang="zh_TW">Sony ARW 原始影像</comment>
+ <comment xml:lang="zh_CN">索尼 ARW 原始映像</comment>
<comment xml:lang="vi">Ảnh thô Sony ARW</comment>
- <comment xml:lang="zh-CN">索尼 ARW 原始映像</comment>
- <comment xml:lang="zh-TW">Sony ARW 原始影像</comment>
+ <comment xml:lang="uk">цифровий негатив ARW Sony</comment>
+ <comment xml:lang="tr">Sony ARW ham görüntüsü</comment>
+ <comment xml:lang="sv">Sony ARW-råbild</comment>
+ <comment xml:lang="sr">Сони АРВ сирова слика</comment>
+ <comment xml:lang="sq">figurë Sony ARW e papërpunuar</comment>
+ <comment xml:lang="sl">Surova slikovna datoteka Sony ARW</comment>
+ <comment xml:lang="si">Sony ARW අමු රූපය</comment>
+ <comment xml:lang="sk">Surový obrázok Sony ARW</comment>
+ <comment xml:lang="ru">Необработанное изображение Sony ARW</comment>
+ <comment xml:lang="ro">Imagine brută Sony ARW</comment>
+ <comment xml:lang="pt_BR">Imagem bruta ARW da Sony</comment>
+ <comment xml:lang="pt">imagem em bruto Sony ARW</comment>
+ <comment xml:lang="pl">Surowy obraz ARW Sony</comment>
+ <comment xml:lang="oc">imatge brut ARW Sony</comment>
+ <comment xml:lang="nn">Sony ARW råbilete</comment>
+ <comment xml:lang="nl">onbewerkt Sony ARW-beeld</comment>
+ <comment xml:lang="nb">Sony ARW raw-bilde</comment>
+ <comment xml:lang="lv">Sony ARW jēlattēls</comment>
+ <comment xml:lang="lt">Sony ARW neapdorotas paveikslėlis</comment>
+ <comment xml:lang="ko">소니 ARW RAW 사진</comment>
+ <comment xml:lang="kk">Sony ARW өңделмеген суреті</comment>
+ <comment xml:lang="ja">Sony ARW raw 画像</comment>
+ <comment xml:lang="it">Immagine raw Sony ARW</comment>
+ <comment xml:lang="is">Sony ARW hrámynd</comment>
+ <comment xml:lang="id">Citra mentah Sony ARW</comment>
+ <comment xml:lang="ia">Imagine brute Sony ARW</comment>
+ <comment xml:lang="hu">Sony ARW nyers kép</comment>
+ <comment xml:lang="hr">Sony ARW osnovna slika</comment>
+ <comment xml:lang="he">תמונה גולמית של Sony ARW</comment>
+ <comment xml:lang="gl">imaxe en bruto ARW de sony</comment>
+ <comment xml:lang="ga">amhíomhá Sony ARW</comment>
+ <comment xml:lang="fur">imagjin grese Sony ARW</comment>
+ <comment xml:lang="fr">image brute ARW Sony</comment>
+ <comment xml:lang="fo">Sony ARW rámynd</comment>
+ <comment xml:lang="fi">Sony-ARW-raakakuva</comment>
+ <comment xml:lang="eu">Sony ARW irudi gordina</comment>
+ <comment xml:lang="es">imagen en bruto ARW de Sony</comment>
+ <comment xml:lang="en_GB">Sony ARW raw image</comment>
+ <comment xml:lang="el">Ανεπεξέργαστη εικόνα Sony ARW</comment>
+ <comment xml:lang="de">Sony-ARW-Rohbild</comment>
+ <comment xml:lang="da">Sony ARW raw-billede</comment>
+ <comment xml:lang="cs">surový obrázek Sony ARW</comment>
+ <comment xml:lang="ca">imatge en cru de Sony ARW</comment>
+ <comment xml:lang="bg">Изображение — Sony ARW raw</comment>
+ <comment xml:lang="be@latin">Suvoraja vyjava Sony ARW</comment>
+ <comment xml:lang="be">неапрацаваная выява Sony ARW</comment>
+ <comment xml:lang="ar">صورة Sony ARW خامة</comment>
+ <comment xml:lang="af">Sony ARW rou beeld</comment>
<acronym>ARW</acronym>
<expanded-acronym>Alpha Raw format</expanded-acronym>
<sub-class-of type="image/x-dcraw"/>
@@ -27907,144 +29463,188 @@ command to generate the output files.
</mime-type>
<mime-type type="image/png">
<comment>PNG image</comment>
- <comment xml:lang="af">PNG-beeld</comment>
- <comment xml:lang="ar">صورة PNG</comment>
- <comment xml:lang="az">PNG rəsmi</comment>
- <comment xml:lang="be-Latn">Vyjava PNG</comment>
- <comment xml:lang="bg">Изображение — PNG</comment>
- <comment xml:lang="ca">imatge PNG</comment>
- <comment xml:lang="cs">obrázek PNG</comment>
- <comment xml:lang="cy">Delwedd PNG</comment>
- <comment xml:lang="da">PNG-billede</comment>
- <comment xml:lang="de">PNG-Bild</comment>
- <comment xml:lang="el">Εικόνα PNG</comment>
- <comment xml:lang="en-GB">PNG image</comment>
- <comment xml:lang="eo">PNG-bildo</comment>
- <comment xml:lang="es">imagen PNG</comment>
- <comment xml:lang="eu">PNG irudia</comment>
- <comment xml:lang="fi">PNG-kuva</comment>
- <comment xml:lang="fo">PNG mynd</comment>
- <comment xml:lang="fr">image PNG</comment>
- <comment xml:lang="fur">imagjin PNG</comment>
- <comment xml:lang="ga">íomhá PNG</comment>
- <comment xml:lang="gl">imaxe PNG</comment>
- <comment xml:lang="he">תמונת PNG</comment>
- <comment xml:lang="hr">PNG slika</comment>
- <comment xml:lang="hu">PNG-kép</comment>
- <comment xml:lang="ia">Imagine PNG</comment>
- <comment xml:lang="id">Citra PNG</comment>
- <comment xml:lang="it">Immagine PNG</comment>
- <comment xml:lang="ja">PNG 画像</comment>
- <comment xml:lang="kk">PNG суреті</comment>
- <comment xml:lang="ko">PNG 그림</comment>
- <comment xml:lang="lt">PNG paveikslėlis</comment>
- <comment xml:lang="lv">PNG attēls</comment>
- <comment xml:lang="ms">Imej PNG</comment>
- <comment xml:lang="nb">PNG-bilde</comment>
- <comment xml:lang="nl">PNG-afbeelding</comment>
- <comment xml:lang="nn">PNG-bilete</comment>
- <comment xml:lang="oc">imatge PNG</comment>
- <comment xml:lang="pl">Obraz PNG</comment>
- <comment xml:lang="pt">imagem PNG</comment>
- <comment xml:lang="pt-BR">Imagem PNG</comment>
- <comment xml:lang="ro">Imagine PNG</comment>
- <comment xml:lang="ru">Изображение PNG</comment>
- <comment xml:lang="sk">Obrázok PNG</comment>
- <comment xml:lang="sl">Slikovna datoteka PNG</comment>
- <comment xml:lang="sq">Figurë PNG</comment>
- <comment xml:lang="sr">ПНГ слика</comment>
- <comment xml:lang="sv">PNG-bild</comment>
- <comment xml:lang="tr">PNG görüntüsü</comment>
- <comment xml:lang="uk">зображення PNG</comment>
+ <comment xml:lang="zh_TW">PNG 影像</comment>
+ <comment xml:lang="zh_CN">PNG 图像</comment>
<comment xml:lang="vi">Ảnh PNG</comment>
- <comment xml:lang="zh-CN">PNG 图像</comment>
- <comment xml:lang="zh-TW">PNG 影像</comment>
- <magic priority="50">
- <match type="string" value="\x89PNG" offset="0"/>
+ <comment xml:lang="uk">зображення PNG</comment>
+ <comment xml:lang="tr">PNG görüntüsü</comment>
+ <comment xml:lang="sv">PNG-bild</comment>
+ <comment xml:lang="sr">ПНГ слика</comment>
+ <comment xml:lang="sq">figurë PNG</comment>
+ <comment xml:lang="sl">Slikovna datoteka PNG</comment>
+ <comment xml:lang="si">PNG රූපය</comment>
+ <comment xml:lang="sk">Obrázok PNG</comment>
+ <comment xml:lang="ru">Изображение PNG</comment>
+ <comment xml:lang="ro">Imagine PNG</comment>
+ <comment xml:lang="pt_BR">Imagem PNG</comment>
+ <comment xml:lang="pt">imagem PNG</comment>
+ <comment xml:lang="pl">Obraz PNG</comment>
+ <comment xml:lang="oc">imatge PNG</comment>
+ <comment xml:lang="nn">PNG-bilete</comment>
+ <comment xml:lang="nl">PNG-afbeelding</comment>
+ <comment xml:lang="nb">PNG-bilde</comment>
+ <comment xml:lang="ms">Imej PNG</comment>
+ <comment xml:lang="lv">PNG attēls</comment>
+ <comment xml:lang="lt">PNG paveikslėlis</comment>
+ <comment xml:lang="ko">PNG 그림</comment>
+ <comment xml:lang="kk">PNG суреті</comment>
+ <comment xml:lang="ka">PNG გამოსახულება</comment>
+ <comment xml:lang="ja">PNG 画像</comment>
+ <comment xml:lang="it">Immagine PNG</comment>
+ <comment xml:lang="is">PNG mynd</comment>
+ <comment xml:lang="id">Citra PNG</comment>
+ <comment xml:lang="ia">Imagine PNG</comment>
+ <comment xml:lang="hu">PNG-kép</comment>
+ <comment xml:lang="hr">PNG slika</comment>
+ <comment xml:lang="he">תמונת PNG</comment>
+ <comment xml:lang="gl">imaxe PNG</comment>
+ <comment xml:lang="ga">íomhá PNG</comment>
+ <comment xml:lang="fur">imagjin PNG</comment>
+ <comment xml:lang="fr">image PNG</comment>
+ <comment xml:lang="fo">PNG mynd</comment>
+ <comment xml:lang="fi">PNG-kuva</comment>
+ <comment xml:lang="eu">PNG irudia</comment>
+ <comment xml:lang="es">imagen PNG</comment>
+ <comment xml:lang="eo">PNG-bildo</comment>
+ <comment xml:lang="en_GB">PNG image</comment>
+ <comment xml:lang="el">Εικόνα PNG</comment>
+ <comment xml:lang="de">PNG-Bild</comment>
+ <comment xml:lang="da">PNG-billede</comment>
+ <comment xml:lang="cy">Delwedd PNG</comment>
+ <comment xml:lang="cs">obrázek PNG</comment>
+ <comment xml:lang="ca">imatge PNG</comment>
+ <comment xml:lang="bg">Изображение — PNG</comment>
+ <comment xml:lang="be@latin">Vyjava PNG</comment>
+ <comment xml:lang="be">выява PNG</comment>
+ <comment xml:lang="az">PNG rəsmi</comment>
+ <comment xml:lang="ar">صورة PNG</comment>
+ <comment xml:lang="af">PNG-beeld</comment>
+ <acronym>PNG</acronym>
+ <expanded-acronym>Portable Network Graphics</expanded-acronym>
+ <magic>
+ <match type="string" value="\x89PNG\r\n\x1A\n" offset="0"/>
</magic>
<glob pattern="*.png"/>
</mime-type>
+ <mime-type type="image/apng">
+ <comment>Animated PNG image</comment>
+ <comment xml:lang="uk">анімоване зображення PNG</comment>
+ <comment xml:lang="sv">Animerad PNG-bild</comment>
+ <comment xml:lang="ru">Анимированное изображение PNG</comment>
+ <comment xml:lang="pl">Animowany obraz PNG</comment>
+ <comment xml:lang="ja">PNG動画</comment>
+ <comment xml:lang="it">Immagine PNG animata</comment>
+ <comment xml:lang="gl">Imaxe de PNG animado</comment>
+ <comment xml:lang="eu">PNG irudi animatua</comment>
+ <comment xml:lang="es">imagen PNG animada</comment>
+ <comment xml:lang="de">Animiertes PNG-Bild</comment>
+ <comment xml:lang="be">анімаваная выява PNG</comment>
+ <acronym>PNG</acronym>
+ <expanded-acronym>Portable Network Graphics</expanded-acronym>
+ <sub-class-of type="image/png"/>
+ <magic priority="60">
+ <match type="string" value="\x89PNG\r\n\x1A\n" offset="0">
+ <match type="string" value="acTL" offset="37"/>
+ </match>
+ </magic>
+ <glob pattern="*.apng"/>
+ <glob pattern="*.png" weight="40"/>
+ <alias type="image/vnd.mozilla.apng"/>
+ </mime-type>
<mime-type type="image/rle">
<comment>RLE bitmap image</comment>
- <comment xml:lang="bg">Изображение — RLE bitmap</comment>
- <comment xml:lang="ca">imatge de mapa de bits RLE</comment>
- <comment xml:lang="da">RLE bitmap-billede</comment>
- <comment xml:lang="de">Lauflängenkodiertes Bitmap-Bild</comment>
- <comment xml:lang="en-GB">RLE bitmap image</comment>
- <comment xml:lang="es">imagen de mapa de bits RLE</comment>
- <comment xml:lang="eu">RLE bitmap irudia</comment>
- <comment xml:lang="fi">RLE-bittikarttakuva</comment>
- <comment xml:lang="fr">image matricielle RLE</comment>
- <comment xml:lang="hr">RLE bitmap slika</comment>
- <comment xml:lang="hu">RLE bitkép</comment>
- <comment xml:lang="id">Citra bitmap RLE</comment>
- <comment xml:lang="it">Immagine bitmap RLE</comment>
- <comment xml:lang="kk">RLE растрлық суреті</comment>
- <comment xml:lang="ko">RLE 비트맵 그림</comment>
- <comment xml:lang="pl">Obraz bitmapy RLE</comment>
- <comment xml:lang="pt-BR">Imagem bitmap RLE</comment>
- <comment xml:lang="ru">Растровое изображение RLE</comment>
- <comment xml:lang="sl">Bitna slika RLE</comment>
- <comment xml:lang="sv">RLE bitmappsbild</comment>
- <comment xml:lang="tr">RLE bit eşlem görüntüsü</comment>
+ <comment xml:lang="zh_TW">RLE 點陣影像</comment>
+ <comment xml:lang="zh_CN">RLE 位图图像</comment>
<comment xml:lang="uk">растрове зображення RLE</comment>
- <comment xml:lang="zh-CN">RLE 位图图像</comment>
- <comment xml:lang="zh-TW">RLE 點陣影像</comment>
+ <comment xml:lang="tr">RLE bit eşlem görüntüsü</comment>
+ <comment xml:lang="sv">RLE bitmappsbild</comment>
+ <comment xml:lang="sq">figurë bitmap RLE</comment>
+ <comment xml:lang="sl">Bitna slika RLE</comment>
+ <comment xml:lang="si">RLE බිට්මැප් රූපය</comment>
+ <comment xml:lang="ru">Растровое изображение RLE</comment>
+ <comment xml:lang="pt_BR">Imagem bitmap RLE</comment>
+ <comment xml:lang="pl">Obraz bitmapy RLE</comment>
+ <comment xml:lang="nl">RLE-bitmapafbeelding</comment>
+ <comment xml:lang="ko">RLE 비트맵 그림</comment>
+ <comment xml:lang="kk">RLE растрлық суреті</comment>
+ <comment xml:lang="ja">RLE ビットマップ画像</comment>
+ <comment xml:lang="it">Immagine bitmap RLE</comment>
+ <comment xml:lang="is">RLE bitamynd</comment>
+ <comment xml:lang="id">Citra bitmap RLE</comment>
+ <comment xml:lang="hu">RLE bitkép</comment>
+ <comment xml:lang="hr">RLE bitmap slika</comment>
+ <comment xml:lang="he">תמונת מפת סיביות RLE</comment>
+ <comment xml:lang="gl">Imaxe de mapa de bits RLE</comment>
+ <comment xml:lang="fr">image matricielle RLE</comment>
+ <comment xml:lang="fi">RLE-bittikarttakuva</comment>
+ <comment xml:lang="eu">RLE bitmap irudia</comment>
+ <comment xml:lang="es">imagen de mapa de los bit RLE</comment>
+ <comment xml:lang="en_GB">RLE bitmap image</comment>
+ <comment xml:lang="de">Lauflängenkodiertes Bitmap-Bild</comment>
+ <comment xml:lang="da">RLE bitmap-billede</comment>
+ <comment xml:lang="ca">imatge de mapa de bits RLE</comment>
+ <comment xml:lang="bg">Изображение — RLE bitmap</comment>
+ <comment xml:lang="be">растравая выява RLE</comment>
+ <comment xml:lang="ar">صورة نقطية RLE</comment>
<acronym>RLE</acronym>
<expanded-acronym>Run Length Encoded</expanded-acronym>
<glob pattern="*.rle"/>
</mime-type>
<mime-type type="image/svg+xml">
<comment>SVG image</comment>
- <comment xml:lang="af">SVG-beeld</comment>
- <comment xml:lang="ar">صورة SVG</comment>
- <comment xml:lang="be-Latn">Vyjava SVG</comment>
- <comment xml:lang="bg">Изображение — SVG</comment>
- <comment xml:lang="ca">imatge SVG</comment>
- <comment xml:lang="cs">obrázek SVG</comment>
- <comment xml:lang="da">SVG-billede</comment>
- <comment xml:lang="de">SVG-Bild</comment>
- <comment xml:lang="el">Εικόνα SVG</comment>
- <comment xml:lang="en-GB">SVG image</comment>
- <comment xml:lang="eo">SVG-bildo</comment>
- <comment xml:lang="es">imagen SVG</comment>
- <comment xml:lang="eu">SVG irudia</comment>
- <comment xml:lang="fi">SVG-kuva</comment>
- <comment xml:lang="fo">SVG mynd</comment>
- <comment xml:lang="fr">image SVG</comment>
- <comment xml:lang="fur">imagjin SVG</comment>
- <comment xml:lang="ga">íomhá SVG</comment>
- <comment xml:lang="gl">imaxe SVG</comment>
- <comment xml:lang="he">תמונת SVG</comment>
- <comment xml:lang="hr">SVG slika</comment>
- <comment xml:lang="hu">SVG kép</comment>
- <comment xml:lang="ia">Imagine SVG</comment>
- <comment xml:lang="id">Citra SVG</comment>
- <comment xml:lang="it">Immagine SVG</comment>
- <comment xml:lang="ja">SVG 画像</comment>
- <comment xml:lang="kk">SVG суреті</comment>
- <comment xml:lang="ko">SVG 그림</comment>
- <comment xml:lang="lt">SVG paveikslėlis</comment>
- <comment xml:lang="lv">SVG attēls</comment>
- <comment xml:lang="nb">SVG-bilde</comment>
- <comment xml:lang="nl">SVG-afbeelding</comment>
- <comment xml:lang="nn">SVG-bilete</comment>
- <comment xml:lang="oc">imatge SVG</comment>
- <comment xml:lang="pl">Obraz SVG</comment>
- <comment xml:lang="pt">imagem SVG</comment>
- <comment xml:lang="pt-BR">Imagem SVG</comment>
- <comment xml:lang="ro">Imagine SVG</comment>
- <comment xml:lang="ru">Изображение SVG</comment>
- <comment xml:lang="sk">Obrázok SVG</comment>
- <comment xml:lang="sl">Slikovna vektorska datoteka SVG</comment>
- <comment xml:lang="sq">Figurë SVG</comment>
- <comment xml:lang="sr">СВГ слика</comment>
- <comment xml:lang="sv">SVG-bild</comment>
- <comment xml:lang="tr">SVG görüntüsü</comment>
- <comment xml:lang="uk">зображення SVG</comment>
+ <comment xml:lang="zh_TW">SVG 影像</comment>
+ <comment xml:lang="zh_CN">SVG 图像</comment>
<comment xml:lang="vi">Ảnh SVG</comment>
- <comment xml:lang="zh-CN">SVG 图像</comment>
- <comment xml:lang="zh-TW">SVG 影像</comment>
+ <comment xml:lang="uk">зображення SVG</comment>
+ <comment xml:lang="tr">SVG görüntüsü</comment>
+ <comment xml:lang="sv">SVG-bild</comment>
+ <comment xml:lang="sr">СВГ слика</comment>
+ <comment xml:lang="sq">figurë SVG</comment>
+ <comment xml:lang="sl">Slikovna vektorska datoteka SVG</comment>
+ <comment xml:lang="si">SVG රූපය</comment>
+ <comment xml:lang="sk">Obrázok SVG</comment>
+ <comment xml:lang="ru">Изображение SVG</comment>
+ <comment xml:lang="ro">Imagine SVG</comment>
+ <comment xml:lang="pt_BR">Imagem SVG</comment>
+ <comment xml:lang="pt">imagem SVG</comment>
+ <comment xml:lang="pl">Obraz SVG</comment>
+ <comment xml:lang="oc">imatge SVG</comment>
+ <comment xml:lang="nn">SVG-bilete</comment>
+ <comment xml:lang="nl">SVG-afbeelding</comment>
+ <comment xml:lang="nb">SVG-bilde</comment>
+ <comment xml:lang="lv">SVG attēls</comment>
+ <comment xml:lang="lt">SVG paveikslėlis</comment>
+ <comment xml:lang="ko">SVG 그림</comment>
+ <comment xml:lang="kk">SVG суреті</comment>
+ <comment xml:lang="ka">SVG გამოსახულება</comment>
+ <comment xml:lang="ja">SVG 画像</comment>
+ <comment xml:lang="it">Immagine SVG</comment>
+ <comment xml:lang="is">SVG mynd</comment>
+ <comment xml:lang="id">Citra SVG</comment>
+ <comment xml:lang="ia">Imagine SVG</comment>
+ <comment xml:lang="hu">SVG kép</comment>
+ <comment xml:lang="hr">SVG slika</comment>
+ <comment xml:lang="he">תמונת SVG</comment>
+ <comment xml:lang="gl">imaxe SVG</comment>
+ <comment xml:lang="ga">íomhá SVG</comment>
+ <comment xml:lang="fur">imagjin SVG</comment>
+ <comment xml:lang="fr">image SVG</comment>
+ <comment xml:lang="fo">SVG mynd</comment>
+ <comment xml:lang="fi">SVG-kuva</comment>
+ <comment xml:lang="eu">SVG irudia</comment>
+ <comment xml:lang="es">imagen SVG</comment>
+ <comment xml:lang="eo">SVG-bildo</comment>
+ <comment xml:lang="en_GB">SVG image</comment>
+ <comment xml:lang="el">Εικόνα SVG</comment>
+ <comment xml:lang="de">SVG-Bild</comment>
+ <comment xml:lang="da">SVG-billede</comment>
+ <comment xml:lang="cs">obrázek SVG</comment>
+ <comment xml:lang="ca">imatge SVG</comment>
+ <comment xml:lang="bg">Изображение — SVG</comment>
+ <comment xml:lang="be@latin">Vyjava SVG</comment>
+ <comment xml:lang="be">выява SVG</comment>
+ <comment xml:lang="ar">صورة SVG</comment>
+ <comment xml:lang="af">SVG-beeld</comment>
<acronym>SVG</acronym>
<expanded-acronym>Scalable Vector Graphics</expanded-acronym>
<sub-class-of type="application/xml"/>
@@ -28062,115 +29662,82 @@ command to generate the output files.
<root-XML namespaceURI="http://www.w3.org/2000/svg" localName="svg"/>
</mime-type>
<mime-type type="image/svg+xml-compressed">
- <comment>compressed SVG image</comment>
- <comment xml:lang="af">saamgepersde SVG-beeld</comment>
- <comment xml:lang="ar">صورة SVG مضغوطة</comment>
- <comment xml:lang="be-Latn">skampresavanaja vyjava SVG</comment>
- <comment xml:lang="bg">Изображение — SVG, компресирано</comment>
- <comment xml:lang="ca">imatge SVG amb compressió</comment>
- <comment xml:lang="cs">komprimovaný obrázek SVG</comment>
- <comment xml:lang="da">SVG-komprimeret billede</comment>
- <comment xml:lang="de">Komprimiertes SVG-Bild</comment>
- <comment xml:lang="el">Συμπιεσμένη εικόνα SVG</comment>
- <comment xml:lang="en-GB">compressed SVG image</comment>
- <comment xml:lang="es">imagen SVG comprimida</comment>
- <comment xml:lang="eu">konprimitutako SVG irudia</comment>
- <comment xml:lang="fi">pakattu SVG-kuva</comment>
- <comment xml:lang="fo">stappað SVG mynd</comment>
- <comment xml:lang="fr">image SVG compressée</comment>
- <comment xml:lang="fur">imagjin SVG comprimude</comment>
- <comment xml:lang="ga">íomhá SVG comhbhrúite</comment>
- <comment xml:lang="gl">imaxe SVG comprimida</comment>
- <comment xml:lang="he">תמונת SVG מכווצת</comment>
- <comment xml:lang="hr">Sažeta SVG slika</comment>
- <comment xml:lang="hu">tömörített SVG kép</comment>
- <comment xml:lang="ia">Imagine SVG comprimite</comment>
- <comment xml:lang="id">citra SVG terkompresi</comment>
- <comment xml:lang="it">Immagine SVG compressa</comment>
- <comment xml:lang="ja">圧縮 SVG 画像</comment>
- <comment xml:lang="kk">сығылған SVG суреті</comment>
- <comment xml:lang="ko">압축된 SVG 그림</comment>
- <comment xml:lang="lt">suglaudintas SVG paveikslėlis</comment>
- <comment xml:lang="lv">saspiests SVG attēls</comment>
- <comment xml:lang="nb">komprimert SVG-bilde</comment>
- <comment xml:lang="nl">ingepakte SVG-afbeelding</comment>
- <comment xml:lang="nn">komprimert SVG-bilete</comment>
- <comment xml:lang="oc">imatge SVG compressat</comment>
- <comment xml:lang="pl">Skompresowany obraz SVG</comment>
- <comment xml:lang="pt">imagem SVG comprimida</comment>
- <comment xml:lang="pt-BR">Imagem SVG compactada</comment>
- <comment xml:lang="ro">imagine comprimată SVG</comment>
- <comment xml:lang="ru">Сжатое изображение SVG</comment>
- <comment xml:lang="sk">Komprimovaný obrázok SVG</comment>
- <comment xml:lang="sl">Slikovna datoteka SVG (stisnjena)</comment>
- <comment xml:lang="sq">Figurë SVG e kompresuar</comment>
- <comment xml:lang="sr">запакована СВГ слика</comment>
- <comment xml:lang="sv">komprimerad SVG-bild</comment>
- <comment xml:lang="tr">sıkıştırılmış SVG görüntüsü</comment>
+ <comment>Compressed SVG image</comment>
<comment xml:lang="uk">стиснене зображення SVG</comment>
- <comment xml:lang="vi">ảnh SVG đã nén</comment>
- <comment xml:lang="zh-CN">压缩的 SVG 图像</comment>
- <comment xml:lang="zh-TW">壓縮版 SVG 影像</comment>
+ <comment xml:lang="sv">Komprimerad SVG-bild</comment>
+ <comment xml:lang="ru">Сжатое изображение SVG</comment>
+ <comment xml:lang="pl">Skompresowany obraz SVG</comment>
+ <comment xml:lang="ja">SVG画像(圧縮)</comment>
+ <comment xml:lang="it">Immagine SVG compressa</comment>
+ <comment xml:lang="gl">Imaxe SVG comprimido</comment>
+ <comment xml:lang="eu">SVG irudi konprimatua</comment>
+ <comment xml:lang="es">imagen SVG comprimida</comment>
+ <comment xml:lang="de">Komprimiertes SVG-Bild</comment>
+ <comment xml:lang="be">сціснутая выява SVG</comment>
<acronym>SVG</acronym>
<expanded-acronym>Scalable Vector Graphics</expanded-acronym>
<sub-class-of type="application/gzip"/>
<glob pattern="*.svgz"/>
+ <glob pattern="*.svg.gz"/>
</mime-type>
<mime-type type="image/tiff">
<comment>TIFF image</comment>
- <comment xml:lang="af">TIFF-beeld</comment>
- <comment xml:lang="ar">صورة TIFF</comment>
- <comment xml:lang="be-Latn">Vyjava TIFF</comment>
- <comment xml:lang="bg">Изображение — TIFF</comment>
- <comment xml:lang="ca">imatge TIFF</comment>
- <comment xml:lang="cs">obrázek TIFF</comment>
- <comment xml:lang="da">TIFF-billede</comment>
- <comment xml:lang="de">TIFF-Bild</comment>
- <comment xml:lang="el">Εικόνα TIFF</comment>
- <comment xml:lang="en-GB">TIFF image</comment>
- <comment xml:lang="eo">TIFF-bildo</comment>
- <comment xml:lang="es">imagen TIFF</comment>
- <comment xml:lang="eu">TIFF irudia</comment>
- <comment xml:lang="fi">TIFF-kuva</comment>
- <comment xml:lang="fo">TIFF mynd</comment>
- <comment xml:lang="fr">image TIFF</comment>
- <comment xml:lang="fur">imagjin TIFF</comment>
- <comment xml:lang="ga">íomhá TIFF</comment>
- <comment xml:lang="gl">imaxe TIFF</comment>
- <comment xml:lang="he">תמונת TIFF</comment>
- <comment xml:lang="hr">TIFF slika</comment>
- <comment xml:lang="hu">TIFF-kép</comment>
- <comment xml:lang="ia">Imagine TIFF</comment>
- <comment xml:lang="id">Citra TIFF</comment>
- <comment xml:lang="it">Immagine TIFF</comment>
- <comment xml:lang="ja">TIFF 画像</comment>
- <comment xml:lang="kk">TIFF суреті</comment>
- <comment xml:lang="ko">TIFF 그림</comment>
- <comment xml:lang="lt">TIFF paveikslėlis</comment>
- <comment xml:lang="lv">TIFF attēls</comment>
- <comment xml:lang="ms">Imej TIFF</comment>
- <comment xml:lang="nb">TIFF-bilde</comment>
- <comment xml:lang="nl">TIFF-afbeelding</comment>
- <comment xml:lang="nn">TIFF-bilete</comment>
- <comment xml:lang="oc">imatge TIFF</comment>
- <comment xml:lang="pl">Obraz TIFF</comment>
- <comment xml:lang="pt">imagem TIFF</comment>
- <comment xml:lang="pt-BR">Imagem TIFF</comment>
- <comment xml:lang="ro">Imagine TIFF</comment>
- <comment xml:lang="ru">Изображение TIFF</comment>
- <comment xml:lang="sk">Obrázok TIFF</comment>
- <comment xml:lang="sl">Slikovna datoteka TIFF</comment>
- <comment xml:lang="sq">Figurë TIFF</comment>
- <comment xml:lang="sr">ТИФФ слика</comment>
- <comment xml:lang="sv">TIFF-bild</comment>
- <comment xml:lang="tr">TIFF görüntüsü</comment>
- <comment xml:lang="uk">зображення TIFF</comment>
+ <comment xml:lang="zh_TW">TIFF 影像</comment>
+ <comment xml:lang="zh_CN">TIFF 图像</comment>
<comment xml:lang="vi">Ảnh TIFF</comment>
- <comment xml:lang="zh-CN">TIFF 图像</comment>
- <comment xml:lang="zh-TW">TIFF 影像</comment>
+ <comment xml:lang="uk">зображення TIFF</comment>
+ <comment xml:lang="tr">TIFF görüntüsü</comment>
+ <comment xml:lang="sv">TIFF-bild</comment>
+ <comment xml:lang="sr">ТИФФ слика</comment>
+ <comment xml:lang="sq">figurë TIFF</comment>
+ <comment xml:lang="sl">Slikovna datoteka TIFF</comment>
+ <comment xml:lang="si">TIFF රූපය</comment>
+ <comment xml:lang="sk">Obrázok TIFF</comment>
+ <comment xml:lang="ru">Изображение TIFF</comment>
+ <comment xml:lang="ro">Imagine TIFF</comment>
+ <comment xml:lang="pt_BR">Imagem TIFF</comment>
+ <comment xml:lang="pt">imagem TIFF</comment>
+ <comment xml:lang="pl">Obraz TIFF</comment>
+ <comment xml:lang="oc">imatge TIFF</comment>
+ <comment xml:lang="nn">TIFF-bilete</comment>
+ <comment xml:lang="nl">TIFF-afbeelding</comment>
+ <comment xml:lang="nb">TIFF-bilde</comment>
+ <comment xml:lang="ms">Imej TIFF</comment>
+ <comment xml:lang="lv">TIFF attēls</comment>
+ <comment xml:lang="lt">TIFF paveikslėlis</comment>
+ <comment xml:lang="ko">TIFF 그림</comment>
+ <comment xml:lang="kk">TIFF суреті</comment>
+ <comment xml:lang="ja">TIFF 画像</comment>
+ <comment xml:lang="it">Immagine TIFF</comment>
+ <comment xml:lang="is">TIFF mynd</comment>
+ <comment xml:lang="id">Citra TIFF</comment>
+ <comment xml:lang="ia">Imagine TIFF</comment>
+ <comment xml:lang="hu">TIFF-kép</comment>
+ <comment xml:lang="hr">TIFF slika</comment>
+ <comment xml:lang="he">תמונת TIFF</comment>
+ <comment xml:lang="gl">imaxe TIFF</comment>
+ <comment xml:lang="ga">íomhá TIFF</comment>
+ <comment xml:lang="fur">imagjin TIFF</comment>
+ <comment xml:lang="fr">image TIFF</comment>
+ <comment xml:lang="fo">TIFF mynd</comment>
+ <comment xml:lang="fi">TIFF-kuva</comment>
+ <comment xml:lang="eu">TIFF irudia</comment>
+ <comment xml:lang="es">imagen TIFF</comment>
+ <comment xml:lang="eo">TIFF-bildo</comment>
+ <comment xml:lang="en_GB">TIFF image</comment>
+ <comment xml:lang="el">Εικόνα TIFF</comment>
+ <comment xml:lang="de">TIFF-Bild</comment>
+ <comment xml:lang="da">TIFF-billede</comment>
+ <comment xml:lang="cs">obrázek TIFF</comment>
+ <comment xml:lang="ca">imatge TIFF</comment>
+ <comment xml:lang="bg">Изображение — TIFF</comment>
+ <comment xml:lang="be@latin">Vyjava TIFF</comment>
+ <comment xml:lang="be">выява TIFF</comment>
+ <comment xml:lang="ar">صورة TIFF</comment>
+ <comment xml:lang="af">TIFF-beeld</comment>
<acronym>TIFF</acronym>
<expanded-acronym>Tagged Image File Format</expanded-acronym>
- <magic priority="50">
+ <magic>
<match type="string" value="MM\x00\x2a" offset="0"/>
<match type="string" value="II\x2a\x00" offset="0"/>
</magic>
@@ -28179,235 +29746,288 @@ command to generate the output files.
</mime-type>
<mime-type type="image/x-tiff-multipage">
<comment>Multi-page TIFF image</comment>
- <comment xml:lang="af">Multibladsy TIFF-beeld</comment>
- <comment xml:lang="bg">Изображение — TIFF, много страници</comment>
- <comment xml:lang="ca">imatge TIFF multipàgina</comment>
- <comment xml:lang="cs">vícestránkový obrázek TIFF</comment>
- <comment xml:lang="da">Flersidet TIFF-billede</comment>
- <comment xml:lang="de">Mehrseitiges TIFF-Bild</comment>
- <comment xml:lang="el">Πολυσέλιδη εικόνα TIFF</comment>
- <comment xml:lang="en-GB">Multi-page TIFF image</comment>
- <comment xml:lang="es">imagen TIFF de varias páginas</comment>
- <comment xml:lang="eu">Multi-page TIFF irudia</comment>
- <comment xml:lang="fi">Monisivuinen TIFF-kuva</comment>
- <comment xml:lang="fr">Image TIFF multi-page</comment>
- <comment xml:lang="fur">imagjin a plui pagjinis TIFF</comment>
- <comment xml:lang="ga">íomhá il-leathanach TIFF</comment>
- <comment xml:lang="gl">Imaxe TIFF multipáxina</comment>
- <comment xml:lang="he">תמונת TIFF עם ריבוי עמודים</comment>
- <comment xml:lang="hr">Višestrana TIFF slika</comment>
- <comment xml:lang="hu">Többoldalas TIFF kép</comment>
- <comment xml:lang="ia">Imagine TIFF multi-pagina</comment>
- <comment xml:lang="id">Citra TIFF multi halaman</comment>
- <comment xml:lang="it">Immagine TIFF multi-pagina</comment>
- <comment xml:lang="kk">Көпбеттік TIFF суреті</comment>
- <comment xml:lang="ko">다중 페이지 TIFF 그림</comment>
- <comment xml:lang="oc">Imatge TIFF multipagina</comment>
- <comment xml:lang="pl">Wielostronnicowy obraz TIFF</comment>
- <comment xml:lang="pt">imagem TIFF multipágina</comment>
- <comment xml:lang="pt-BR">Imagem TIFF multipágina</comment>
- <comment xml:lang="ru">Многостраничное изображение TIFF</comment>
- <comment xml:lang="sk">Viacstránkový obrázok TIFF</comment>
- <comment xml:lang="sl">Večstranska slika TIFF</comment>
- <comment xml:lang="sr">Вишестранична ТИФФ слика</comment>
- <comment xml:lang="sv">Flersidig TIFF-bild</comment>
- <comment xml:lang="tr">Çok sayfalı TIFF görüntüsü</comment>
+ <comment xml:lang="zh_TW">多頁 TIFF 影像</comment>
+ <comment xml:lang="zh_CN">多页 TIFF 图像</comment>
<comment xml:lang="uk">багатосторінкове зображення TIFF</comment>
- <comment xml:lang="zh-CN">多页 TIFF 图像</comment>
- <comment xml:lang="zh-TW">多頁 TIFF 影像</comment>
+ <comment xml:lang="tr">Çok sayfalı TIFF görüntüsü</comment>
+ <comment xml:lang="sv">Flersidig TIFF-bild</comment>
+ <comment xml:lang="sr">Вишестранична ТИФФ слика</comment>
+ <comment xml:lang="sq">figurë TIFF me shumë faqe</comment>
+ <comment xml:lang="sl">Večstranska slika TIFF</comment>
+ <comment xml:lang="si">බහු-පිටු TIFF රූපය</comment>
+ <comment xml:lang="sk">Viacstránkový obrázok TIFF</comment>
+ <comment xml:lang="ru">Многостраничное изображение TIFF</comment>
+ <comment xml:lang="pt_BR">Imagem TIFF multipágina</comment>
+ <comment xml:lang="pt">imagem TIFF multipágina</comment>
+ <comment xml:lang="pl">Wielostronnicowy obraz TIFF</comment>
+ <comment xml:lang="oc">Imatge TIFF multipagina</comment>
+ <comment xml:lang="nl">Multi-pagina TIFF-afbeelding</comment>
+ <comment xml:lang="ko">다중 페이지 TIFF 그림</comment>
+ <comment xml:lang="kk">Көпбеттік TIFF суреті</comment>
+ <comment xml:lang="ja">マルチページ TIFF 画像</comment>
+ <comment xml:lang="it">Immagine TIFF multi-pagina</comment>
+ <comment xml:lang="is">Margsíðna TIFF mynd</comment>
+ <comment xml:lang="id">Citra TIFF multi halaman</comment>
+ <comment xml:lang="ia">Imagine TIFF multi-pagina</comment>
+ <comment xml:lang="hu">Többoldalas TIFF kép</comment>
+ <comment xml:lang="hr">Višestrana TIFF slika</comment>
+ <comment xml:lang="he">תמונת TIFF עם ריבוי עמודים</comment>
+ <comment xml:lang="gl">Imaxe TIFF multipáxina</comment>
+ <comment xml:lang="ga">íomhá il-leathanach TIFF</comment>
+ <comment xml:lang="fur">imagjin a plui pagjinis TIFF</comment>
+ <comment xml:lang="fr">Image TIFF multi-page</comment>
+ <comment xml:lang="fi">Monisivuinen TIFF-kuva</comment>
+ <comment xml:lang="eu">Multi-page TIFF irudia</comment>
+ <comment xml:lang="es">imagen TIFF multipágina</comment>
+ <comment xml:lang="en_GB">Multi-page TIFF image</comment>
+ <comment xml:lang="el">Πολυσέλιδη εικόνα TIFF</comment>
+ <comment xml:lang="de">Mehrseitiges TIFF-Bild</comment>
+ <comment xml:lang="da">Flersidet TIFF-billede</comment>
+ <comment xml:lang="cs">vícestránkový obrázek TIFF</comment>
+ <comment xml:lang="ca">imatge TIFF multipàgina</comment>
+ <comment xml:lang="bg">Изображение — TIFF, много страници</comment>
+ <comment xml:lang="be">шматстаронкавая выява TIFF</comment>
+ <comment xml:lang="ar">صورة TIFF متعددة الصفحات</comment>
+ <comment xml:lang="af">Multibladsy TIFF-beeld</comment>
<acronym>TIFF</acronym>
<expanded-acronym>Tagged Image File Format</expanded-acronym>
<sub-class-of type="image/tiff"/>
</mime-type>
<mime-type type="image/vnd.dwg">
<comment>AutoCAD image</comment>
- <comment xml:lang="af">AutoCAD-beeld</comment>
- <comment xml:lang="ar">صورة AutoCAD</comment>
- <comment xml:lang="az">AutoCAD rəsmi</comment>
- <comment xml:lang="be-Latn">Vyjava AutoCAD</comment>
- <comment xml:lang="bg">Изображение — AutoCAD</comment>
- <comment xml:lang="ca">imatge d'AutoCAD</comment>
- <comment xml:lang="cs">výkres AutoCAD</comment>
- <comment xml:lang="cy">Delwedd AutoCAD</comment>
- <comment xml:lang="da">AutoCAD-billede</comment>
- <comment xml:lang="de">AutoCAD-Bild</comment>
- <comment xml:lang="el">Εικόνα AutoCAD</comment>
- <comment xml:lang="en-GB">AutoCAD image</comment>
- <comment xml:lang="eo">AutoCAD-bildo</comment>
- <comment xml:lang="es">imagen de AutoCAD</comment>
- <comment xml:lang="eu">AutoCAD-eko irudia</comment>
- <comment xml:lang="fi">AutoCAD-kuva</comment>
- <comment xml:lang="fo">AutoCAD mynd</comment>
- <comment xml:lang="fr">image AutoCAD</comment>
- <comment xml:lang="fur">imagjin AutoCAD</comment>
- <comment xml:lang="ga">íomhá AutoCAD</comment>
- <comment xml:lang="gl">imaxe de AutoCAD</comment>
- <comment xml:lang="he">תמונה של AutoCAD</comment>
- <comment xml:lang="hr">AutoCAD slika</comment>
- <comment xml:lang="hu">AutoCAD-kép</comment>
- <comment xml:lang="ia">Imagine AutoCAD</comment>
- <comment xml:lang="id">Citra AutoCAD</comment>
- <comment xml:lang="it">Immagine AutoCAD</comment>
- <comment xml:lang="ja">AutoCAD 画像</comment>
- <comment xml:lang="ka">AutoCAD-ის გამოსახულება</comment>
- <comment xml:lang="kk">AutoCAD суреті</comment>
- <comment xml:lang="ko">AutoCAD 그림</comment>
- <comment xml:lang="lt">AutoCAD paveikslėlis</comment>
- <comment xml:lang="lv">AutoCAD attēls</comment>
- <comment xml:lang="ms">Imej AutoCAD</comment>
- <comment xml:lang="nb">AutoCAD-bilde</comment>
- <comment xml:lang="nl">AutoCAD-afbeelding</comment>
- <comment xml:lang="nn">AutoCAD-bilete</comment>
- <comment xml:lang="oc">imatge AutoCAD</comment>
- <comment xml:lang="pl">Obraz AutoCAD</comment>
- <comment xml:lang="pt">imagem AutoCAD</comment>
- <comment xml:lang="pt-BR">Imagem do AutoCAD</comment>
- <comment xml:lang="ro">Imagine AutoCAD</comment>
- <comment xml:lang="ru">Изображение AutoCAD</comment>
- <comment xml:lang="sk">Obrázok AutoCAD</comment>
- <comment xml:lang="sl">Slikovna datoteka AutoCAD</comment>
- <comment xml:lang="sq">Figurë AutoCAD</comment>
- <comment xml:lang="sr">АутоКАД слика</comment>
- <comment xml:lang="sv">AutoCAD-bild</comment>
- <comment xml:lang="tr">AutoCAD görüntüsü</comment>
- <comment xml:lang="uk">зображення AutoCAD</comment>
+ <comment xml:lang="zh_TW">AutoCAD 影像</comment>
+ <comment xml:lang="zh_CN">AutoCAD 图像</comment>
<comment xml:lang="vi">Ảnh AutoCAD</comment>
- <comment xml:lang="zh-CN">AutoCAD 图像</comment>
- <comment xml:lang="zh-TW">AutoCAD 影像</comment>
+ <comment xml:lang="uk">зображення AutoCAD</comment>
+ <comment xml:lang="tr">AutoCAD görüntüsü</comment>
+ <comment xml:lang="sv">AutoCAD-bild</comment>
+ <comment xml:lang="sr">АутоКАД слика</comment>
+ <comment xml:lang="sq">figurë AutoCAD</comment>
+ <comment xml:lang="sl">Slikovna datoteka AutoCAD</comment>
+ <comment xml:lang="si">AutoCAD රූපය</comment>
+ <comment xml:lang="sk">Obrázok AutoCAD</comment>
+ <comment xml:lang="ru">Изображение AutoCAD</comment>
+ <comment xml:lang="ro">Imagine AutoCAD</comment>
+ <comment xml:lang="pt_BR">Imagem do AutoCAD</comment>
+ <comment xml:lang="pt">imagem AutoCAD</comment>
+ <comment xml:lang="pl">Obraz AutoCAD</comment>
+ <comment xml:lang="oc">imatge AutoCAD</comment>
+ <comment xml:lang="nn">AutoCAD-bilete</comment>
+ <comment xml:lang="nl">AutoCAD-afbeelding</comment>
+ <comment xml:lang="nb">AutoCAD-bilde</comment>
+ <comment xml:lang="ms">Imej AutoCAD</comment>
+ <comment xml:lang="lv">AutoCAD attēls</comment>
+ <comment xml:lang="lt">AutoCAD paveikslėlis</comment>
+ <comment xml:lang="ko">AutoCAD 그림</comment>
+ <comment xml:lang="kk">AutoCAD суреті</comment>
+ <comment xml:lang="ka">AutoCAD-ის გამოსახულება</comment>
+ <comment xml:lang="ja">AutoCAD 画像</comment>
+ <comment xml:lang="it">Immagine AutoCAD</comment>
+ <comment xml:lang="is">AutoCAD mynd</comment>
+ <comment xml:lang="id">Citra AutoCAD</comment>
+ <comment xml:lang="ia">Imagine AutoCAD</comment>
+ <comment xml:lang="hu">AutoCAD-kép</comment>
+ <comment xml:lang="hr">AutoCAD slika</comment>
+ <comment xml:lang="he">תמונה של AutoCAD</comment>
+ <comment xml:lang="gl">imaxe de AutoCAD</comment>
+ <comment xml:lang="ga">íomhá AutoCAD</comment>
+ <comment xml:lang="fur">imagjin AutoCAD</comment>
+ <comment xml:lang="fr">image AutoCAD</comment>
+ <comment xml:lang="fo">AutoCAD mynd</comment>
+ <comment xml:lang="fi">AutoCAD-kuva</comment>
+ <comment xml:lang="eu">AutoCAD-eko irudia</comment>
+ <comment xml:lang="es">imagen de AutoCAD</comment>
+ <comment xml:lang="eo">AutoCAD-bildo</comment>
+ <comment xml:lang="en_GB">AutoCAD image</comment>
+ <comment xml:lang="el">Εικόνα AutoCAD</comment>
+ <comment xml:lang="de">AutoCAD-Bild</comment>
+ <comment xml:lang="da">AutoCAD-billede</comment>
+ <comment xml:lang="cy">Delwedd AutoCAD</comment>
+ <comment xml:lang="cs">výkres AutoCAD</comment>
+ <comment xml:lang="ca">imatge d'AutoCAD</comment>
+ <comment xml:lang="bg">Изображение — AutoCAD</comment>
+ <comment xml:lang="be@latin">Vyjava AutoCAD</comment>
+ <comment xml:lang="be">выява AutoCAD</comment>
+ <comment xml:lang="az">AutoCAD rəsmi</comment>
+ <comment xml:lang="ar">صورة AutoCAD</comment>
+ <comment xml:lang="af">AutoCAD-beeld</comment>
<glob pattern="*.dwg"/>
</mime-type>
<mime-type type="image/vnd.dxf">
<comment>DXF vector image</comment>
- <comment xml:lang="af">DXF-vektorbeeld</comment>
- <comment xml:lang="ar">صورة DXF نقطية</comment>
- <comment xml:lang="be-Latn">Vektarnaja vyjava DXF</comment>
- <comment xml:lang="bg">Изображение — DXF</comment>
- <comment xml:lang="ca">imatge vectorial DXF</comment>
- <comment xml:lang="cs">vektorový obrázek DXF</comment>
- <comment xml:lang="da">DXF-vektorbillede</comment>
- <comment xml:lang="de">DXF-Vektorbild</comment>
- <comment xml:lang="el">Διανυσματική εικόνα DXF</comment>
- <comment xml:lang="en-GB">DXF vector image</comment>
- <comment xml:lang="eo">vektora DXF-bildo</comment>
- <comment xml:lang="es">imagen vectorial DXF</comment>
- <comment xml:lang="eu">DXF bektore-grafikoa</comment>
- <comment xml:lang="fi">DXF-vektorikuva</comment>
- <comment xml:lang="fo">DXF vektormynd</comment>
- <comment xml:lang="fr">image vectorielle DXF</comment>
- <comment xml:lang="fur">imagjin vetoriâl DXF</comment>
- <comment xml:lang="ga">íomhá veicteoireach DXF</comment>
- <comment xml:lang="gl">imaxe de vector DXF</comment>
- <comment xml:lang="he">תמונת DXF וקטורית</comment>
- <comment xml:lang="hr">DXF vektorska slika</comment>
- <comment xml:lang="hu">DXF-vektorkép</comment>
- <comment xml:lang="ia">Imagine vectorial DXF</comment>
- <comment xml:lang="id">Citra vektor DXF</comment>
- <comment xml:lang="it">Immagine vettoriale DXF</comment>
- <comment xml:lang="ja">DXF ベクター画像</comment>
- <comment xml:lang="ka">DXF ვექტორული გამოსახულება</comment>
- <comment xml:lang="kk">DXF векторлық суреті</comment>
- <comment xml:lang="ko">DXF 벡터 그림</comment>
- <comment xml:lang="lt">DXF vektorinis paveikslėlis</comment>
- <comment xml:lang="lv">DXF vektora attēls</comment>
- <comment xml:lang="ms">Imej vektor DXF</comment>
- <comment xml:lang="nb">DXF-vektorgrafikk</comment>
- <comment xml:lang="nl">DXF-vectorafbeelding</comment>
- <comment xml:lang="nn">DXF-vektorgrafikk</comment>
- <comment xml:lang="oc">imatge vectorial DXF</comment>
- <comment xml:lang="pl">Obraz wektorowy DXF</comment>
- <comment xml:lang="pt">imagem de vectores DXF</comment>
- <comment xml:lang="pt-BR">Imagem vetorial DXF</comment>
- <comment xml:lang="ro">Imagine vectorială DXF</comment>
- <comment xml:lang="ru">Векторное изображение DXF</comment>
- <comment xml:lang="sk">Vektorový obrázok DXF</comment>
- <comment xml:lang="sl">Slikovna vektorska datoteka DXF</comment>
- <comment xml:lang="sq">Figurë vektoriale DFX</comment>
- <comment xml:lang="sr">ДИксФ векторска графика</comment>
- <comment xml:lang="sv">DXF-vektorbild</comment>
- <comment xml:lang="tr">DXF vektör görüntüsü</comment>
- <comment xml:lang="uk">векторне зображення DXF</comment>
+ <comment xml:lang="zh_TW">DXF 向量圖</comment>
+ <comment xml:lang="zh_CN">DXF 矢量图像</comment>
<comment xml:lang="vi">Ảnh véc-tơ DXF</comment>
- <comment xml:lang="zh-CN">DXF 矢量图像</comment>
- <comment xml:lang="zh-TW">DXF 向量圖</comment>
+ <comment xml:lang="uk">векторне зображення DXF</comment>
+ <comment xml:lang="tr">DXF vektör görüntüsü</comment>
+ <comment xml:lang="sv">DXF-vektorbild</comment>
+ <comment xml:lang="sr">ДИксФ векторска графика</comment>
+ <comment xml:lang="sq">figurë vektoriale DFX</comment>
+ <comment xml:lang="sl">Slikovna vektorska datoteka DXF</comment>
+ <comment xml:lang="si">DXF දෛශික රූපය</comment>
+ <comment xml:lang="sk">Vektorový obrázok DXF</comment>
+ <comment xml:lang="ru">Векторное изображение DXF</comment>
+ <comment xml:lang="ro">Imagine vectorială DXF</comment>
+ <comment xml:lang="pt_BR">Imagem vetorial DXF</comment>
+ <comment xml:lang="pt">imagem de vectores DXF</comment>
+ <comment xml:lang="pl">Obraz wektorowy DXF</comment>
+ <comment xml:lang="oc">imatge vectorial DXF</comment>
+ <comment xml:lang="nn">DXF-vektorgrafikk</comment>
+ <comment xml:lang="nl">DXF-vectorafbeelding</comment>
+ <comment xml:lang="nb">DXF-vektorgrafikk</comment>
+ <comment xml:lang="ms">Imej vektor DXF</comment>
+ <comment xml:lang="lv">DXF vektora attēls</comment>
+ <comment xml:lang="lt">DXF vektorinis paveikslėlis</comment>
+ <comment xml:lang="ko">DXF 벡터 그림</comment>
+ <comment xml:lang="kk">DXF векторлық суреті</comment>
+ <comment xml:lang="ka">DXF ვექტორული გამოსახულება</comment>
+ <comment xml:lang="ja">DXF ベクター画像</comment>
+ <comment xml:lang="it">Immagine vettoriale DXF</comment>
+ <comment xml:lang="is">DXF vigurteikning</comment>
+ <comment xml:lang="id">Citra vektor DXF</comment>
+ <comment xml:lang="ia">Imagine vectorial DXF</comment>
+ <comment xml:lang="hu">DXF-vektorkép</comment>
+ <comment xml:lang="hr">DXF vektorska slika</comment>
+ <comment xml:lang="he">תמונת DXF וקטורית</comment>
+ <comment xml:lang="gl">imaxe de vector DXF</comment>
+ <comment xml:lang="ga">íomhá veicteoireach DXF</comment>
+ <comment xml:lang="fur">imagjin vetoriâl DXF</comment>
+ <comment xml:lang="fr">image vectorielle DXF</comment>
+ <comment xml:lang="fo">DXF vektormynd</comment>
+ <comment xml:lang="fi">DXF-vektorikuva</comment>
+ <comment xml:lang="eu">DXF bektore-grafikoa</comment>
+ <comment xml:lang="es">imagen vectorial DXF</comment>
+ <comment xml:lang="eo">vektora DXF-bildo</comment>
+ <comment xml:lang="en_GB">DXF vector image</comment>
+ <comment xml:lang="el">Διανυσματική εικόνα DXF</comment>
+ <comment xml:lang="de">DXF-Vektorbild</comment>
+ <comment xml:lang="da">DXF-vektorbillede</comment>
+ <comment xml:lang="cs">vektorový obrázek DXF</comment>
+ <comment xml:lang="ca">imatge vectorial DXF</comment>
+ <comment xml:lang="bg">Изображение — DXF</comment>
+ <comment xml:lang="be@latin">Vektarnaja vyjava DXF</comment>
+ <comment xml:lang="be">вектарная выява DXF</comment>
+ <comment xml:lang="ar">صورة DXF نقطية</comment>
+ <comment xml:lang="af">DXF-vektorbeeld</comment>
<glob pattern="*.dxf"/>
- <magic priority="50">
+ <magic>
<match type="string" value="\nHEADER\n" offset="0:64"/>
<match type="string" value="\x0d\nHEADER\x0d\n" offset="0:64"/>
</magic>
</mime-type>
<mime-type type="image/vnd.ms-modi">
<comment>MDI image</comment>
- <comment xml:lang="bg">Изображение — MDI</comment>
- <comment xml:lang="ca">imatge MDI</comment>
- <comment xml:lang="da">MDI-billede</comment>
- <comment xml:lang="de">MDI-Bild</comment>
- <comment xml:lang="en-GB">MDI image</comment>
- <comment xml:lang="es">imagen MDI</comment>
- <comment xml:lang="eu">MDI irudia</comment>
- <comment xml:lang="fi">MDI-kuva</comment>
- <comment xml:lang="fr">image MDI</comment>
- <comment xml:lang="hr">MDI slika</comment>
- <comment xml:lang="hu">MDI-kép</comment>
- <comment xml:lang="id">Citra MDI</comment>
- <comment xml:lang="it">Immagine MDI</comment>
- <comment xml:lang="kk">MDI суреті</comment>
- <comment xml:lang="ko">MDI 그림</comment>
- <comment xml:lang="pl">Obraz MDI</comment>
- <comment xml:lang="pt-BR">Imagem MDI</comment>
- <comment xml:lang="ru">Изображение MDI</comment>
- <comment xml:lang="sk">Obrázok MDI</comment>
- <comment xml:lang="sl">Slika MDI</comment>
- <comment xml:lang="sv">MDI-bild</comment>
- <comment xml:lang="tr">MDI görüntüsü</comment>
+ <comment xml:lang="zh_TW">MDI 影像</comment>
+ <comment xml:lang="zh_CN">MDI 图像</comment>
<comment xml:lang="uk">зображення MDI</comment>
- <comment xml:lang="zh-CN">MDI 图像</comment>
- <comment xml:lang="zh-TW">MDI 影像</comment>
+ <comment xml:lang="tr">MDI görüntüsü</comment>
+ <comment xml:lang="sv">MDI-bild</comment>
+ <comment xml:lang="sq">figurë MDI</comment>
+ <comment xml:lang="sl">Slika MDI</comment>
+ <comment xml:lang="si">MDI රූපය</comment>
+ <comment xml:lang="sk">Obrázok MDI</comment>
+ <comment xml:lang="ru">Изображение MDI</comment>
+ <comment xml:lang="pt_BR">Imagem MDI</comment>
+ <comment xml:lang="pl">Obraz MDI</comment>
+ <comment xml:lang="oc">imatge MDI</comment>
+ <comment xml:lang="nl">MDI-afbeelding</comment>
+ <comment xml:lang="ko">MDI 그림</comment>
+ <comment xml:lang="kk">MDI суреті</comment>
+ <comment xml:lang="ja">MDI 画像</comment>
+ <comment xml:lang="it">Immagine MDI</comment>
+ <comment xml:lang="is">MDI mynd</comment>
+ <comment xml:lang="id">Citra MDI</comment>
+ <comment xml:lang="hu">MDI-kép</comment>
+ <comment xml:lang="hr">MDI slika</comment>
+ <comment xml:lang="he">תמונת MDI</comment>
+ <comment xml:lang="gl">Imaxe MDI</comment>
+ <comment xml:lang="fr">image MDI</comment>
+ <comment xml:lang="fi">MDI-kuva</comment>
+ <comment xml:lang="eu">MDI irudia</comment>
+ <comment xml:lang="es">imagen MDI</comment>
+ <comment xml:lang="en_GB">MDI image</comment>
+ <comment xml:lang="de">MDI-Bild</comment>
+ <comment xml:lang="da">MDI-billede</comment>
+ <comment xml:lang="ca">imatge MDI</comment>
+ <comment xml:lang="bg">Изображение — MDI</comment>
+ <comment xml:lang="be">выява MDI</comment>
+ <comment xml:lang="ar">صورة MDI</comment>
<acronym>MDI</acronym>
<expanded-acronym>Microsoft Document Imaging</expanded-acronym>
<glob pattern="*.mdi"/>
- <magic priority="50">
+ <magic>
<match type="string" value="\x45\x50\x2A\x00" offset="0"/>
</magic>
</mime-type>
+ <mime-type type="image/jxr">
+ <comment>JPEG XR image</comment>
+ <comment xml:lang="uk">зображення JPEG XR</comment>
+ <comment xml:lang="sv">JPEG XR-bild</comment>
+ <comment xml:lang="ru">Изображение JPEG XR</comment>
+ <comment xml:lang="pt_BR">Imagem JPEG XR</comment>
+ <comment xml:lang="pl">Obraz JPEG XR</comment>
+ <comment xml:lang="it">Immagine JPEG XR</comment>
+ <comment xml:lang="gl">Imaxe JPEG XR</comment>
+ <comment xml:lang="eu">JPEG XR irudia</comment>
+ <comment xml:lang="es">imagen JPEG XR</comment>
+ <comment xml:lang="de">JPEG-XR-Bild</comment>
+ <comment xml:lang="be">выява JPEG XR</comment>
+ <acronym>XR</acronym>
+ <expanded-acronym>Extended Range</expanded-acronym>
+ <glob pattern="*.jxr"/>
+ <glob pattern="*.hdp"/>
+ <glob pattern="*.wdp"/>
+ <magic>
+ <match type="string" value="II\xBC\x01" offset="0"/>
+ </magic>
+ <alias type="image/vnd.ms-photo"/>
+ </mime-type>
<mime-type type="image/webp">
<comment>WebP image</comment>
- <comment xml:lang="af">WebP-beeld</comment>
- <comment xml:lang="bg">Изображение — WebP</comment>
- <comment xml:lang="ca">imatge WebP</comment>
- <comment xml:lang="cs">obrázek WebP</comment>
- <comment xml:lang="da">WebP-billede</comment>
- <comment xml:lang="de">WebP-Bild</comment>
- <comment xml:lang="el">Εικόνα WebP</comment>
- <comment xml:lang="en-GB">WebP image</comment>
- <comment xml:lang="es">imagen WebP</comment>
- <comment xml:lang="eu">WebP irudia</comment>
- <comment xml:lang="fi">WebP-kuva</comment>
- <comment xml:lang="fr">image WebP</comment>
- <comment xml:lang="fur">imagjin WebP</comment>
- <comment xml:lang="ga">íomhá WebP</comment>
- <comment xml:lang="gl">Imaxe WebP</comment>
- <comment xml:lang="he">תמונת WebP</comment>
- <comment xml:lang="hr">WebP slika</comment>
- <comment xml:lang="hu">WebP kép</comment>
- <comment xml:lang="ia">Imagine WebP</comment>
- <comment xml:lang="id">Citra WebP</comment>
- <comment xml:lang="it">Immagine WebP</comment>
- <comment xml:lang="kk">WebP суреті</comment>
- <comment xml:lang="ko">WebP 그림</comment>
- <comment xml:lang="oc">imatge WebP</comment>
- <comment xml:lang="pl">Obraz WebP</comment>
- <comment xml:lang="pt">imagem WebP</comment>
- <comment xml:lang="pt-BR">Imagem WebP</comment>
- <comment xml:lang="ru">Изображение WebP</comment>
- <comment xml:lang="sk">Obrázok WebP</comment>
- <comment xml:lang="sl">Slika WebP</comment>
- <comment xml:lang="sr">ВебП слика</comment>
- <comment xml:lang="sv">WebP-bild</comment>
- <comment xml:lang="tr">WebP görüntüsü</comment>
+ <comment xml:lang="zh_TW">WebP 影像</comment>
+ <comment xml:lang="zh_CN">WebP 图像</comment>
<comment xml:lang="uk">зображення WebP</comment>
- <comment xml:lang="zh-CN">WebP 图像</comment>
- <comment xml:lang="zh-TW">WebP 影像</comment>
- <magic priority="50">
+ <comment xml:lang="tr">WebP görüntüsü</comment>
+ <comment xml:lang="sv">WebP-bild</comment>
+ <comment xml:lang="sr">ВебП слика</comment>
+ <comment xml:lang="sq">figurë WebP</comment>
+ <comment xml:lang="sl">Slika WebP</comment>
+ <comment xml:lang="si">WebP රූපය</comment>
+ <comment xml:lang="sk">Obrázok WebP</comment>
+ <comment xml:lang="ru">Изображение WebP</comment>
+ <comment xml:lang="pt_BR">Imagem WebP</comment>
+ <comment xml:lang="pt">imagem WebP</comment>
+ <comment xml:lang="pl">Obraz WebP</comment>
+ <comment xml:lang="oc">imatge WebP</comment>
+ <comment xml:lang="nl">WebP-afbeelding</comment>
+ <comment xml:lang="ko">WebP 그림</comment>
+ <comment xml:lang="kk">WebP суреті</comment>
+ <comment xml:lang="ja">WebP 画像</comment>
+ <comment xml:lang="it">Immagine WebP</comment>
+ <comment xml:lang="is">WebP-mynd</comment>
+ <comment xml:lang="id">Citra WebP</comment>
+ <comment xml:lang="ia">Imagine WebP</comment>
+ <comment xml:lang="hu">WebP kép</comment>
+ <comment xml:lang="hr">WebP slika</comment>
+ <comment xml:lang="he">תמונת WebP</comment>
+ <comment xml:lang="gl">Imaxe WebP</comment>
+ <comment xml:lang="ga">íomhá WebP</comment>
+ <comment xml:lang="fur">imagjin WebP</comment>
+ <comment xml:lang="fr">image WebP</comment>
+ <comment xml:lang="fi">WebP-kuva</comment>
+ <comment xml:lang="eu">WebP irudia</comment>
+ <comment xml:lang="es">imagen WebP</comment>
+ <comment xml:lang="en_GB">WebP image</comment>
+ <comment xml:lang="el">Εικόνα WebP</comment>
+ <comment xml:lang="de">WebP-Bild</comment>
+ <comment xml:lang="da">WebP-billede</comment>
+ <comment xml:lang="cs">obrázek WebP</comment>
+ <comment xml:lang="ca">imatge WebP</comment>
+ <comment xml:lang="bg">Изображение — WebP</comment>
+ <comment xml:lang="be">выява WebP</comment>
+ <comment xml:lang="ar">صورة WebP</comment>
+ <comment xml:lang="af">WebP-beeld</comment>
+ <magic>
<match type="string" value="RIFF" offset="0">
<match type="string" value="WEBP" offset="8"/>
</match>
@@ -28416,59 +30036,62 @@ command to generate the output files.
</mime-type>
<mime-type type="image/x-3ds">
<comment>3D Studio image</comment>
- <comment xml:lang="af">3D Studio-beeld</comment>
- <comment xml:lang="ar">صورة استديو ثلاثية الأبعاد</comment>
- <comment xml:lang="az">3D Studio rəsmi</comment>
- <comment xml:lang="be-Latn">Vyjava 3D Studio</comment>
- <comment xml:lang="bg">Изображение — 3D Studio</comment>
- <comment xml:lang="ca">imatge de 3D Studio</comment>
- <comment xml:lang="cs">obrázek 3D Studio</comment>
- <comment xml:lang="cy">Delwedd "3D Studio"</comment>
- <comment xml:lang="da">3D Studio-billede</comment>
- <comment xml:lang="de">3D-Studio-Bild</comment>
- <comment xml:lang="el">Εικόνα 3D Studio</comment>
- <comment xml:lang="en-GB">3D Studio image</comment>
- <comment xml:lang="eo">bildo de 3D Studio</comment>
- <comment xml:lang="es">imagen de 3D Studio</comment>
- <comment xml:lang="eu">3D Studio-ko irudia</comment>
- <comment xml:lang="fi">3D Studio -kuva</comment>
- <comment xml:lang="fo">3D Studio mynd</comment>
- <comment xml:lang="fr">image 3D Studio</comment>
- <comment xml:lang="fur">imagjin 3D Studio</comment>
- <comment xml:lang="ga">íomhá 3D Studio</comment>
- <comment xml:lang="gl">Imaxe de 3D Studio</comment>
- <comment xml:lang="he">תמונת 3D Studio</comment>
- <comment xml:lang="hr">3D Studio slika</comment>
- <comment xml:lang="hu">3D Studio-kép</comment>
- <comment xml:lang="ia">Imagine 3D Studio</comment>
- <comment xml:lang="id">Citra 3D Studio</comment>
- <comment xml:lang="it">Immagine 3D Studio</comment>
- <comment xml:lang="ja">3D Studio 画像</comment>
- <comment xml:lang="ka">3D Studio-ის გამოსახულება</comment>
- <comment xml:lang="kk">3D Studio суреті</comment>
- <comment xml:lang="ko">3D Studio 그림</comment>
- <comment xml:lang="lt">3D Studio paveikslėlis</comment>
- <comment xml:lang="lv">3D Studio attēls</comment>
- <comment xml:lang="ms">Imej 3D Studio</comment>
- <comment xml:lang="nb">3D Studio-bilde</comment>
- <comment xml:lang="nl">3D-Studio-afbeelding</comment>
- <comment xml:lang="nn">3D Studio-bilete</comment>
- <comment xml:lang="oc">imatge 3D Studio</comment>
- <comment xml:lang="pl">Obraz 3D Studio</comment>
- <comment xml:lang="pt">imagem 3D Studio</comment>
- <comment xml:lang="pt-BR">Imagem do 3D Studio</comment>
- <comment xml:lang="ro">Imagine 3D Studio</comment>
- <comment xml:lang="ru">Сцена 3D Studio</comment>
- <comment xml:lang="sk">Obrázok 3D Studio</comment>
- <comment xml:lang="sl">Slikovna datoteka 3D Studio</comment>
- <comment xml:lang="sq">Figurë 3D Studio</comment>
- <comment xml:lang="sr">слика 3Д Студија</comment>
- <comment xml:lang="sv">3D Studio-bild</comment>
- <comment xml:lang="tr">3D Studio görüntüsü</comment>
- <comment xml:lang="uk">зображення 3D Studio</comment>
+ <comment xml:lang="zh_TW">3D Studio 影像</comment>
+ <comment xml:lang="zh_CN">3D Studio 图像</comment>
<comment xml:lang="vi">Ảnh xuởng vẽ 3D</comment>
- <comment xml:lang="zh-CN">3D Studio 图像</comment>
- <comment xml:lang="zh-TW">3D Studio 影像</comment>
+ <comment xml:lang="uk">зображення 3D Studio</comment>
+ <comment xml:lang="tr">3D Studio görüntüsü</comment>
+ <comment xml:lang="sv">3D Studio-bild</comment>
+ <comment xml:lang="sr">слика 3Д Студија</comment>
+ <comment xml:lang="sq">figurë 3D Studio</comment>
+ <comment xml:lang="sl">Slikovna datoteka 3D Studio</comment>
+ <comment xml:lang="si">3D ස්ටුඩියෝ රූපය</comment>
+ <comment xml:lang="sk">Obrázok 3D Studio</comment>
+ <comment xml:lang="ru">Сцена 3D Studio</comment>
+ <comment xml:lang="ro">Imagine 3D Studio</comment>
+ <comment xml:lang="pt_BR">Imagem do 3D Studio</comment>
+ <comment xml:lang="pt">imagem 3D Studio</comment>
+ <comment xml:lang="pl">Obraz 3D Studio</comment>
+ <comment xml:lang="oc">imatge 3D Studio</comment>
+ <comment xml:lang="nn">3D Studio-bilete</comment>
+ <comment xml:lang="nl">3D-Studio-afbeelding</comment>
+ <comment xml:lang="nb">3D Studio-bilde</comment>
+ <comment xml:lang="ms">Imej 3D Studio</comment>
+ <comment xml:lang="lv">3D Studio attēls</comment>
+ <comment xml:lang="lt">3D Studio paveikslėlis</comment>
+ <comment xml:lang="ko">3D Studio 그림</comment>
+ <comment xml:lang="kk">3D Studio суреті</comment>
+ <comment xml:lang="ka">3D Studio-ის გამოსახულება</comment>
+ <comment xml:lang="ja">3D Studio 画像</comment>
+ <comment xml:lang="it">Immagine 3D Studio</comment>
+ <comment xml:lang="is">3D Studio mynd</comment>
+ <comment xml:lang="id">Citra 3D Studio</comment>
+ <comment xml:lang="ia">Imagine 3D Studio</comment>
+ <comment xml:lang="hu">3D Studio-kép</comment>
+ <comment xml:lang="hr">3D Studio slika</comment>
+ <comment xml:lang="he">תמונת 3D Studio</comment>
+ <comment xml:lang="gl">Imaxe de 3D Studio</comment>
+ <comment xml:lang="ga">íomhá 3D Studio</comment>
+ <comment xml:lang="fur">imagjin 3D Studio</comment>
+ <comment xml:lang="fr">image 3D Studio</comment>
+ <comment xml:lang="fo">3D Studio mynd</comment>
+ <comment xml:lang="fi">3D Studio -kuva</comment>
+ <comment xml:lang="eu">3D Studio-ko irudia</comment>
+ <comment xml:lang="es">imagen de 3D Studio</comment>
+ <comment xml:lang="eo">bildo de 3D Studio</comment>
+ <comment xml:lang="en_GB">3D Studio image</comment>
+ <comment xml:lang="el">Εικόνα 3D Studio</comment>
+ <comment xml:lang="de">3D-Studio-Bild</comment>
+ <comment xml:lang="da">3D Studio-billede</comment>
+ <comment xml:lang="cy">Delwedd "3D Studio"</comment>
+ <comment xml:lang="cs">obrázek 3D Studio</comment>
+ <comment xml:lang="ca">imatge de 3D Studio</comment>
+ <comment xml:lang="bg">Изображение — 3D Studio</comment>
+ <comment xml:lang="be@latin">Vyjava 3D Studio</comment>
+ <comment xml:lang="be">выява 3D Studio</comment>
+ <comment xml:lang="az">3D Studio rəsmi</comment>
+ <comment xml:lang="ar">صورة 3دي استديو</comment>
+ <comment xml:lang="af">3D Studio-beeld</comment>
<glob pattern="*.3ds"/>
<magic priority="30">
<match offset="0" type="big16" value="0x4d4d"/>
@@ -28476,58 +30099,61 @@ command to generate the output files.
</mime-type>
<mime-type type="image/x-applix-graphics">
<comment>Applix Graphics image</comment>
- <comment xml:lang="af">Applix Graphics-beeld</comment>
- <comment xml:lang="ar">صورة رسوميات Applix</comment>
- <comment xml:lang="be-Latn">Vyjava Applix Graphics</comment>
- <comment xml:lang="bg">Изображение — Applix Graphics</comment>
- <comment xml:lang="ca">imatge d'Applix Graphics</comment>
- <comment xml:lang="cs">obrázek Applix Graphics</comment>
- <comment xml:lang="da">Applix Graphics-billede</comment>
- <comment xml:lang="de">Applix-Graphics-Bild</comment>
- <comment xml:lang="el">Εικόνα Applix Graphics</comment>
- <comment xml:lang="en-GB">Applix Graphics image</comment>
- <comment xml:lang="eo">bildo de Applix Graphics</comment>
- <comment xml:lang="es">imagen de Applix Graphics</comment>
- <comment xml:lang="eu">Applix Graphics irudia</comment>
- <comment xml:lang="fi">Applix Graphics -kuva</comment>
- <comment xml:lang="fo">Applix Graphics mynd</comment>
- <comment xml:lang="fr">image Applix Graphics</comment>
- <comment xml:lang="fur">imagjin Applix Graphics</comment>
- <comment xml:lang="ga">íomhá Applix Graphics</comment>
- <comment xml:lang="gl">imaxe de Applix Graphics</comment>
- <comment xml:lang="he">תמונה של Applix Graphics</comment>
- <comment xml:lang="hr">Applix Graphics slika</comment>
- <comment xml:lang="hu">Applix Graphics-kép</comment>
- <comment xml:lang="ia">Imagine Applix Graphics</comment>
- <comment xml:lang="id">Citra Applix Graphics</comment>
- <comment xml:lang="it">Immagine Applix Graphics</comment>
- <comment xml:lang="ja">Applix Graphics 画像</comment>
- <comment xml:lang="ka">Applix Graphics-ის გამოსახულება</comment>
- <comment xml:lang="kk">Applix Graphics суреті</comment>
- <comment xml:lang="ko">Applix Graphics 그림</comment>
- <comment xml:lang="lt">Applix Graphics paveikslėlis</comment>
- <comment xml:lang="lv">Applix Graphics attēls</comment>
- <comment xml:lang="ms">Imej Applix Graphics</comment>
- <comment xml:lang="nb">Applix Graphics-dokument</comment>
- <comment xml:lang="nl">Applix Graphics-afbeelding</comment>
- <comment xml:lang="nn">Applix Graphics-dokument</comment>
- <comment xml:lang="oc">imatge Applix Graphics</comment>
- <comment xml:lang="pl">Obraz Applix Graphics</comment>
- <comment xml:lang="pt">imagem Applix Graphics</comment>
- <comment xml:lang="pt-BR">Imagem do Applix Graphics</comment>
- <comment xml:lang="ro">Imagine Applix Graphics</comment>
- <comment xml:lang="ru">Изображение Applix Graphics</comment>
- <comment xml:lang="sk">Obrázok Applix Graphics</comment>
- <comment xml:lang="sl">Slikovna datoteka Applix Graphics</comment>
- <comment xml:lang="sq">Figurë Applix Graphics</comment>
- <comment xml:lang="sr">Апликсов графички документ</comment>
- <comment xml:lang="sv">Applix Graphics-bild</comment>
- <comment xml:lang="tr">Applix Graphics görüntüsü</comment>
- <comment xml:lang="uk">зображення Applix Graphics</comment>
+ <comment xml:lang="zh_TW">Applix Graphics 影像</comment>
+ <comment xml:lang="zh_CN">Applix Graphics 图像</comment>
<comment xml:lang="vi">Ảnh Applix Graphics</comment>
- <comment xml:lang="zh-CN">Applix Graphics 图像</comment>
- <comment xml:lang="zh-TW">Applix Graphics 影像</comment>
- <magic priority="50">
+ <comment xml:lang="uk">зображення Applix Graphics</comment>
+ <comment xml:lang="tr">Applix Graphics görüntüsü</comment>
+ <comment xml:lang="sv">Applix Graphics-bild</comment>
+ <comment xml:lang="sr">Апликсов графички документ</comment>
+ <comment xml:lang="sq">figurë Applix Graphics</comment>
+ <comment xml:lang="sl">Slikovna datoteka Applix Graphics</comment>
+ <comment xml:lang="si">Applix Graphics රූපය</comment>
+ <comment xml:lang="sk">Obrázok Applix Graphics</comment>
+ <comment xml:lang="ru">Изображение Applix Graphics</comment>
+ <comment xml:lang="ro">Imagine Applix Graphics</comment>
+ <comment xml:lang="pt_BR">Imagem do Applix Graphics</comment>
+ <comment xml:lang="pt">imagem Applix Graphics</comment>
+ <comment xml:lang="pl">Obraz Applix Graphics</comment>
+ <comment xml:lang="oc">imatge Applix Graphics</comment>
+ <comment xml:lang="nn">Applix Graphics-dokument</comment>
+ <comment xml:lang="nl">Applix Graphics-afbeelding</comment>
+ <comment xml:lang="nb">Applix Graphics-dokument</comment>
+ <comment xml:lang="ms">Imej Applix Graphics</comment>
+ <comment xml:lang="lv">Applix Graphics attēls</comment>
+ <comment xml:lang="lt">Applix Graphics paveikslėlis</comment>
+ <comment xml:lang="ko">Applix Graphics 그림</comment>
+ <comment xml:lang="kk">Applix Graphics суреті</comment>
+ <comment xml:lang="ka">Applix Graphics-ის გამოსახულება</comment>
+ <comment xml:lang="ja">Applix Graphics 画像</comment>
+ <comment xml:lang="it">Immagine Applix Graphics</comment>
+ <comment xml:lang="is">Applix Graphics mynd</comment>
+ <comment xml:lang="id">Citra Applix Graphics</comment>
+ <comment xml:lang="ia">Imagine Applix Graphics</comment>
+ <comment xml:lang="hu">Applix Graphics-kép</comment>
+ <comment xml:lang="hr">Applix Graphics slika</comment>
+ <comment xml:lang="he">תמונה של Applix Graphics</comment>
+ <comment xml:lang="gl">imaxe de Applix Graphics</comment>
+ <comment xml:lang="ga">íomhá Applix Graphics</comment>
+ <comment xml:lang="fur">imagjin Applix Graphics</comment>
+ <comment xml:lang="fr">image Applix Graphics</comment>
+ <comment xml:lang="fo">Applix Graphics mynd</comment>
+ <comment xml:lang="fi">Applix Graphics -kuva</comment>
+ <comment xml:lang="eu">Applix Graphics irudia</comment>
+ <comment xml:lang="es">imagen de Applix Graphics</comment>
+ <comment xml:lang="eo">bildo de Applix Graphics</comment>
+ <comment xml:lang="en_GB">Applix Graphics image</comment>
+ <comment xml:lang="el">Εικόνα Applix Graphics</comment>
+ <comment xml:lang="de">Applix-Graphics-Bild</comment>
+ <comment xml:lang="da">Applix Graphics-billede</comment>
+ <comment xml:lang="cs">obrázek Applix Graphics</comment>
+ <comment xml:lang="ca">imatge d'Applix Graphics</comment>
+ <comment xml:lang="bg">Изображение — Applix Graphics</comment>
+ <comment xml:lang="be@latin">Vyjava Applix Graphics</comment>
+ <comment xml:lang="be">выява Applix Graphics</comment>
+ <comment xml:lang="ar">صورة رسوميات Applix</comment>
+ <comment xml:lang="af">Applix Graphics-beeld</comment>
+ <magic>
<match type="string" value="*BEGIN" offset="0">
<match type="string" value="GRAPHICS" offset="7"/>
</match>
@@ -28535,285 +30161,214 @@ command to generate the output files.
<glob pattern="*.ag"/>
</mime-type>
<mime-type type="image/x-bzeps">
- <comment>EPS image (bzip-compressed)</comment>
- <comment xml:lang="af">EPS-beeld (bzip-saamgepers)</comment>
- <comment xml:lang="ar">صورة EPS (مضغوط-bzip)</comment>
- <comment xml:lang="be-Latn">Vyjava EPS (bzip-skampresavanaja)</comment>
- <comment xml:lang="bg">Изображение — EPS, компресирано с bzip</comment>
- <comment xml:lang="ca">imatge EPS (amb compressió bzip)</comment>
- <comment xml:lang="cs">obrázek EPS (komprimovaný pomocí bzip)</comment>
- <comment xml:lang="da">EPS-billede (bzip-komprimeret)</comment>
- <comment xml:lang="de">EPS-Bild (bzip-komprimiert)</comment>
- <comment xml:lang="el">Εικόνα EPS (συμπιεσμένη bzip)</comment>
- <comment xml:lang="en-GB">EPS image (bzip-compressed)</comment>
- <comment xml:lang="es">imagen EPS (comprimida con bzip)</comment>
- <comment xml:lang="eu">EPS irudia (bzip-ekin konprimitua)</comment>
- <comment xml:lang="fi">EPS-kuva (bzip-pakattu)</comment>
- <comment xml:lang="fo">EPS mynd (bzip-stappað)</comment>
- <comment xml:lang="fr">image EPS (compressée bzip)</comment>
- <comment xml:lang="fur">imagjin EPS (comprimude cun bzip)</comment>
- <comment xml:lang="ga">íomhá EPS (comhbhrúite le bzip)</comment>
- <comment xml:lang="gl">imaxe EPS (comprimida con bzip)</comment>
- <comment xml:lang="he">תמונת EPS (מכווץ בbzip)</comment>
- <comment xml:lang="hr">EPS slika (bzip sažeta)</comment>
- <comment xml:lang="hu">EPS kép (bzip tömörítésű)</comment>
- <comment xml:lang="ia">Imagine EPS (comprimite con bzip)</comment>
- <comment xml:lang="id">Citra EPS (terkompresi bzip)</comment>
- <comment xml:lang="it">Immagine EPS (compressa con bzip)</comment>
- <comment xml:lang="ja">EPS 画像 (bzip 圧縮)</comment>
- <comment xml:lang="ka">EPS გამოსახულება (bzip-ით შეკუმშული)</comment>
- <comment xml:lang="kk">EPS суреті (bzip-пен сығылған)</comment>
- <comment xml:lang="ko">EPS 그림(BZIP 압축)</comment>
- <comment xml:lang="lt">EPS paveikslėlis (suglaudintas su bzip)</comment>
- <comment xml:lang="lv">EPS attēls (saspiests ar bzip)</comment>
- <comment xml:lang="nb">EPS-bilde (bzip-komprimert)</comment>
- <comment xml:lang="nl">EPS-afbeelding (ingepakt met bzip)</comment>
- <comment xml:lang="nn">EPS-bilete (pakka med bzip)</comment>
- <comment xml:lang="oc">imatge EPS (compressat bzip)</comment>
- <comment xml:lang="pl">Obraz EPS (kompresja bzip)</comment>
- <comment xml:lang="pt">imagem EPS (compressão bzip)</comment>
- <comment xml:lang="pt-BR">Imagem EPS (compactada com bzip)</comment>
- <comment xml:lang="ro">Imagine EPS (compresie bzip)</comment>
- <comment xml:lang="ru">Изображение EPS (сжатое bzip)</comment>
- <comment xml:lang="sk">Obrázok EPS (komprimovaný pomocou bzip)</comment>
- <comment xml:lang="sl">Slikovna datoteka EPS (stisnjena z bzip)</comment>
- <comment xml:lang="sq">Figurë EPS (e kompresuar me bzip)</comment>
- <comment xml:lang="sr">ЕПС слика (запакована бзип-ом)</comment>
- <comment xml:lang="sv">EPS-bild (bzip-komprimerad)</comment>
- <comment xml:lang="tr">EPS görüntüsü (bzip ile sıkıştırılmış)</comment>
- <comment xml:lang="uk">зображення EPS (стиснене bzip)</comment>
- <comment xml:lang="vi">Ảnh EPS (đã nén bzip)</comment>
- <comment xml:lang="zh-CN">EPS 图像(bzip 压缩)</comment>
- <comment xml:lang="zh-TW">EPS 影像 (bzip 壓縮)</comment>
- <sub-class-of type="application/x-bzip"/>
+ <comment>EPS image (bzip2-compressed)</comment>
+ <comment xml:lang="uk">зображення EPS (стиснений bzip2)</comment>
+ <comment xml:lang="sv">EPS-bild (bzip2-komprimerad)</comment>
+ <comment xml:lang="ru">Изображение EPS (сжатое bzip2)</comment>
+ <comment xml:lang="pl">Obraz EPS (kompresja bzip2)</comment>
+ <comment xml:lang="es">imagen EPS (comprimida con BZIP2)</comment>
+ <comment xml:lang="de">EPS-Bild (bzip2-komprimiert)</comment>
+ <sub-class-of type="application/x-bzip2"/>
<glob pattern="*.eps.bz2"/>
<glob pattern="*.epsi.bz2"/>
<glob pattern="*.epsf.bz2"/>
</mime-type>
<mime-type type="image/x-cmu-raster">
<comment>CMU raster image</comment>
- <comment xml:lang="af">CMU-roosterbeeld</comment>
- <comment xml:lang="ar">صورة CMU نقطية</comment>
- <comment xml:lang="az">CMU raster rəsmi</comment>
- <comment xml:lang="be-Latn">Rastravaja vyjava CMU</comment>
- <comment xml:lang="bg">Изображение — CMU raster</comment>
- <comment xml:lang="ca">imatge ràster CMU</comment>
- <comment xml:lang="cs">rastrový obrázek CMU</comment>
- <comment xml:lang="cy">Delwedd raster CMU</comment>
- <comment xml:lang="da">CMU-rasterbillede</comment>
- <comment xml:lang="de">CMU-Rasterbild</comment>
- <comment xml:lang="el">Εικόνα ράστερ CMU</comment>
- <comment xml:lang="en-GB">CMU raster image</comment>
- <comment xml:lang="eo">rastruma bildo de CMU</comment>
- <comment xml:lang="es">imagen ráster CMU</comment>
- <comment xml:lang="eu">CMU bilbe-irudia</comment>
- <comment xml:lang="fi">CMU-rasterikuva</comment>
- <comment xml:lang="fo">CMU raster mynd</comment>
- <comment xml:lang="fr">image raster CMU</comment>
- <comment xml:lang="fur">imagjin raster CMU</comment>
- <comment xml:lang="ga">íomhá rastar CMU</comment>
- <comment xml:lang="gl">imaxe raster CMU</comment>
- <comment xml:lang="he">תמונת סריקה CMU</comment>
- <comment xml:lang="hr">CMU iscrtana slika</comment>
- <comment xml:lang="hu">CMU-raszterkép</comment>
- <comment xml:lang="ia">Imagine raster CMU</comment>
- <comment xml:lang="id">Citra raster CMU</comment>
- <comment xml:lang="it">Immagine raster CMU</comment>
- <comment xml:lang="ja">CMU ラスター画像</comment>
- <comment xml:lang="ka">CMU-ის რასტრული გამოსახულება</comment>
- <comment xml:lang="kk">CMU растрлық суреті</comment>
- <comment xml:lang="ko">CMU 래스터 그림</comment>
- <comment xml:lang="lt">CMU rastrinis paveikslėlis</comment>
- <comment xml:lang="lv">CMU rastra attēls</comment>
- <comment xml:lang="ms">Imej raster CMU</comment>
- <comment xml:lang="nb">CMU-rasterbilde</comment>
- <comment xml:lang="nl">CMU-rasterafbeelding</comment>
- <comment xml:lang="nn">CMU rasterbilete</comment>
- <comment xml:lang="oc">imatge raster CMU</comment>
- <comment xml:lang="pl">Obraz rastrowy CMU</comment>
- <comment xml:lang="pt">imagem raster CMU</comment>
- <comment xml:lang="pt-BR">Imagem raster CMU</comment>
- <comment xml:lang="ro">Imagine raster CMU</comment>
- <comment xml:lang="ru">Растровое изображение CMU</comment>
- <comment xml:lang="sk">Rastrový obrázok CMU</comment>
- <comment xml:lang="sl">Slikovna rastrska datoteka CMU</comment>
- <comment xml:lang="sq">Figurë raster CMU</comment>
- <comment xml:lang="sr">ЦМУ растерска слика</comment>
- <comment xml:lang="sv">CMU-rasterbild</comment>
- <comment xml:lang="tr">CMU tarama görüntüsü</comment>
- <comment xml:lang="uk">растрове зображення CMU</comment>
+ <comment xml:lang="zh_TW">CMU raster 影像</comment>
+ <comment xml:lang="zh_CN">CMU 光栅图像</comment>
<comment xml:lang="vi">Ảnh mành CMU</comment>
- <comment xml:lang="zh-CN">CMU 光栅图像</comment>
- <comment xml:lang="zh-TW">CMU raster 影像</comment>
+ <comment xml:lang="uk">растрове зображення CMU</comment>
+ <comment xml:lang="tr">CMU tarama görüntüsü</comment>
+ <comment xml:lang="sv">CMU-rasterbild</comment>
+ <comment xml:lang="sr">ЦМУ растерска слика</comment>
+ <comment xml:lang="sq">figurë raster CMU</comment>
+ <comment xml:lang="sl">Slikovna rastrska datoteka CMU</comment>
+ <comment xml:lang="si">CMU රාස්ටර් රූපය</comment>
+ <comment xml:lang="sk">Rastrový obrázok CMU</comment>
+ <comment xml:lang="ru">Растровое изображение CMU</comment>
+ <comment xml:lang="ro">Imagine raster CMU</comment>
+ <comment xml:lang="pt_BR">Imagem raster CMU</comment>
+ <comment xml:lang="pt">imagem raster CMU</comment>
+ <comment xml:lang="pl">Obraz rastrowy CMU</comment>
+ <comment xml:lang="oc">imatge raster CMU</comment>
+ <comment xml:lang="nn">CMU rasterbilete</comment>
+ <comment xml:lang="nl">CMU-rasterafbeelding</comment>
+ <comment xml:lang="nb">CMU-rasterbilde</comment>
+ <comment xml:lang="ms">Imej raster CMU</comment>
+ <comment xml:lang="lv">CMU rastra attēls</comment>
+ <comment xml:lang="lt">CMU rastrinis paveikslėlis</comment>
+ <comment xml:lang="ko">CMU 래스터 그림</comment>
+ <comment xml:lang="kk">CMU растрлық суреті</comment>
+ <comment xml:lang="ka">CMU-ის რასტრული გამოსახულება</comment>
+ <comment xml:lang="ja">CMU ラスター画像</comment>
+ <comment xml:lang="it">Immagine raster CMU</comment>
+ <comment xml:lang="is">CMU rastamynd</comment>
+ <comment xml:lang="id">Citra raster CMU</comment>
+ <comment xml:lang="ia">Imagine raster CMU</comment>
+ <comment xml:lang="hu">CMU-raszterkép</comment>
+ <comment xml:lang="hr">CMU iscrtana slika</comment>
+ <comment xml:lang="he">תמונת סריקה CMU</comment>
+ <comment xml:lang="gl">imaxe raster CMU</comment>
+ <comment xml:lang="ga">íomhá rastar CMU</comment>
+ <comment xml:lang="fur">imagjin raster CMU</comment>
+ <comment xml:lang="fr">image raster CMU</comment>
+ <comment xml:lang="fo">CMU raster mynd</comment>
+ <comment xml:lang="fi">CMU-rasterikuva</comment>
+ <comment xml:lang="eu">CMU bilbe-irudia</comment>
+ <comment xml:lang="es">imagen ráster CMU</comment>
+ <comment xml:lang="eo">rastruma bildo de CMU</comment>
+ <comment xml:lang="en_GB">CMU raster image</comment>
+ <comment xml:lang="el">Εικόνα ράστερ CMU</comment>
+ <comment xml:lang="de">CMU-Rasterbild</comment>
+ <comment xml:lang="da">CMU-rasterbillede</comment>
+ <comment xml:lang="cy">Delwedd raster CMU</comment>
+ <comment xml:lang="cs">rastrový obrázek CMU</comment>
+ <comment xml:lang="ca">imatge ràster CMU</comment>
+ <comment xml:lang="bg">Изображение — CMU raster</comment>
+ <comment xml:lang="be@latin">Rastravaja vyjava CMU</comment>
+ <comment xml:lang="be">растравая выява CMU</comment>
+ <comment xml:lang="az">CMU raster rəsmi</comment>
+ <comment xml:lang="ar">صورة CMU نقطية</comment>
+ <comment xml:lang="af">CMU-roosterbeeld</comment>
<glob pattern="*.ras"/>
</mime-type>
<mime-type type="image/x-compressed-xcf">
- <comment>compressed GIMP image</comment>
- <comment xml:lang="af">saamgepersde GIMP-beeld</comment>
- <comment xml:lang="ar">صورة GIMP مضغوطة</comment>
- <comment xml:lang="be-Latn">skampresavanaja vyjava GIMP</comment>
- <comment xml:lang="bg">Изображение — GIMP, компресирано</comment>
- <comment xml:lang="ca">imatge GIMP amb compressió</comment>
- <comment xml:lang="cs">komprimovaný obrázek GIMP</comment>
- <comment xml:lang="da">komprimeret GIMP-billede</comment>
- <comment xml:lang="de">Komprimiertes GIMP-Bild</comment>
- <comment xml:lang="el">Συμπιεσμένη εικόνα GIMP</comment>
- <comment xml:lang="en-GB">compressed GIMP image</comment>
- <comment xml:lang="es">imagen GIMP comprimida</comment>
- <comment xml:lang="eu">konprimitutako GIMP irudia</comment>
- <comment xml:lang="fi">pakattu GIMP-kuva</comment>
- <comment xml:lang="fo">stappað GIMP mynd</comment>
- <comment xml:lang="fr">image GIMP compressée</comment>
- <comment xml:lang="fur">imagjin GIMP comprimude</comment>
- <comment xml:lang="ga">íomhá GIMP comhbhrúite</comment>
- <comment xml:lang="gl">imaxe de GIMP comprimida</comment>
- <comment xml:lang="he">תמונת GIMP מכווצת</comment>
- <comment xml:lang="hr">Sažeta GIMP slika</comment>
- <comment xml:lang="hu">tömörített GIMP kép</comment>
- <comment xml:lang="ia">Imagine GIMP comprimite</comment>
- <comment xml:lang="id">citra GIMP terkompresi</comment>
- <comment xml:lang="it">Immagine GIMP compressa</comment>
- <comment xml:lang="ja">圧縮 GIMP 画像</comment>
- <comment xml:lang="kk">сығылған GIMP суреті</comment>
- <comment xml:lang="ko">압축된 GIMP 그림</comment>
- <comment xml:lang="lt">suglaudintas GIMP paveikslėlis</comment>
- <comment xml:lang="lv">saspiests GIMP attēls</comment>
- <comment xml:lang="nb">komprimert GIMP-bilde</comment>
- <comment xml:lang="nl">ingepakte GIMP-afbeelding</comment>
- <comment xml:lang="nn">komprimert GIMP-bilete</comment>
- <comment xml:lang="oc">imatge GIMP compressat</comment>
- <comment xml:lang="pl">Skompresowany obraz GIMP</comment>
- <comment xml:lang="pt">imagem GIMP comprimida</comment>
- <comment xml:lang="pt-BR">Imagem do GIMP compactada</comment>
- <comment xml:lang="ro">imagine comprimată GIMP</comment>
- <comment xml:lang="ru">Сжатое изображение GIMP</comment>
- <comment xml:lang="sk">Komprimovaný obrázok GIMP</comment>
- <comment xml:lang="sl">Slikovna datoteka GIMP (stisnjena)</comment>
- <comment xml:lang="sq">Figurë GIMP e kompresuar</comment>
- <comment xml:lang="sr">запакована ГИМП слика</comment>
- <comment xml:lang="sv">komprimerad GIMP-bild</comment>
- <comment xml:lang="tr">sıkıştırılmış GIMP görüntüsü</comment>
+ <comment>Compressed GIMP image</comment>
<comment xml:lang="uk">стиснене зображення GIMP</comment>
- <comment xml:lang="vi">ảnh GIMP đã nén</comment>
- <comment xml:lang="zh-CN">压缩的 GIMP 图像</comment>
- <comment xml:lang="zh-TW">壓縮版 GIMP 影像</comment>
+ <comment xml:lang="sv">Komprimerad GIMP-bild</comment>
+ <comment xml:lang="ru">Сжатое изображение GIMP</comment>
+ <comment xml:lang="pl">Skompresowany obraz GIMP</comment>
+ <comment xml:lang="ja">GIMP画像(圧縮)</comment>
+ <comment xml:lang="it">Immagine GIMP compressa</comment>
+ <comment xml:lang="gl">Imaxe GIMP comprimida</comment>
+ <comment xml:lang="eu">GIMP irudi konprimatua</comment>
+ <comment xml:lang="es">imagen de GIMP comprimida</comment>
+ <comment xml:lang="de">Komprimiertes GIMP-Bild</comment>
+ <comment xml:lang="be">сціснутая выява GIMP</comment>
<glob pattern="*.xcf.gz"/>
<glob pattern="*.xcf.bz2"/>
</mime-type>
<mime-type type="application/dicom">
<comment>DICOM image</comment>
- <comment xml:lang="af">DICOM-beeld</comment>
- <comment xml:lang="ar">صورة DICOM</comment>
- <comment xml:lang="be-Latn">Vyjava DICOM</comment>
- <comment xml:lang="bg">Изображение — DICOM</comment>
- <comment xml:lang="ca">imatge DICOM</comment>
- <comment xml:lang="cs">obrázek DICOM</comment>
- <comment xml:lang="da">DICOM-billede</comment>
- <comment xml:lang="de">DICOM-Bild</comment>
- <comment xml:lang="el">Εικόνα DICOM</comment>
- <comment xml:lang="en-GB">DICOM image</comment>
- <comment xml:lang="eo">DICOM-bildo</comment>
- <comment xml:lang="es">imagen DICOM</comment>
- <comment xml:lang="eu">DICOM irudia</comment>
- <comment xml:lang="fi">DICOM-kuva</comment>
- <comment xml:lang="fo">DICOM mynd</comment>
- <comment xml:lang="fr">image DICOM</comment>
- <comment xml:lang="fur">imagjin DICOM</comment>
- <comment xml:lang="ga">íomhá DICOM</comment>
- <comment xml:lang="gl">imaxe DICOM</comment>
- <comment xml:lang="he">תמונת DICOM</comment>
- <comment xml:lang="hr">DICOM slika</comment>
- <comment xml:lang="hu">DICOM kép</comment>
- <comment xml:lang="ia">Imagine DICOM</comment>
- <comment xml:lang="id">Citra DICOM</comment>
- <comment xml:lang="it">Immagine DICOM</comment>
- <comment xml:lang="ja">DICOM 画像</comment>
- <comment xml:lang="ka">DICOM გამოსახულება</comment>
- <comment xml:lang="kk">DICOM суреті</comment>
- <comment xml:lang="ko">DICOM 그림</comment>
- <comment xml:lang="lt">DICOM paveikslėlis</comment>
- <comment xml:lang="lv">DICOM attēls</comment>
- <comment xml:lang="nb">DICOM-bilde</comment>
- <comment xml:lang="nl">DICOM-afbeelding</comment>
- <comment xml:lang="nn">DICOM-bilete</comment>
- <comment xml:lang="oc">imatge DICOM</comment>
- <comment xml:lang="pl">Obraz DICOM</comment>
- <comment xml:lang="pt">imagem DICOM</comment>
- <comment xml:lang="pt-BR">Imagem DICOM</comment>
- <comment xml:lang="ro">Imagine DICOM</comment>
- <comment xml:lang="ru">Изображение DICOM</comment>
- <comment xml:lang="sk">Obrázok DICOM</comment>
- <comment xml:lang="sl">Slikovna datoteka DICOM</comment>
- <comment xml:lang="sq">Figurë DICOM</comment>
- <comment xml:lang="sr">ДИКОМ слика</comment>
- <comment xml:lang="sv">DICOM-bild</comment>
- <comment xml:lang="tr">DICOM görüntüsü</comment>
- <comment xml:lang="uk">зображення DICOM</comment>
+ <comment xml:lang="zh_TW">DICOM 影像</comment>
+ <comment xml:lang="zh_CN">DICOM 图像</comment>
<comment xml:lang="vi">Ảnh DICOM</comment>
- <comment xml:lang="zh-CN">DICOM 图像</comment>
- <comment xml:lang="zh-TW">DICOM 影像</comment>
+ <comment xml:lang="uk">зображення DICOM</comment>
+ <comment xml:lang="tr">DICOM görüntüsü</comment>
+ <comment xml:lang="sv">DICOM-bild</comment>
+ <comment xml:lang="sr">ДИКОМ слика</comment>
+ <comment xml:lang="sq">figurë DICOM</comment>
+ <comment xml:lang="sl">Slikovna datoteka DICOM</comment>
+ <comment xml:lang="si">DICOM රූපය</comment>
+ <comment xml:lang="sk">Obrázok DICOM</comment>
+ <comment xml:lang="ru">Изображение DICOM</comment>
+ <comment xml:lang="ro">Imagine DICOM</comment>
+ <comment xml:lang="pt_BR">Imagem DICOM</comment>
+ <comment xml:lang="pt">imagem DICOM</comment>
+ <comment xml:lang="pl">Obraz DICOM</comment>
+ <comment xml:lang="oc">imatge DICOM</comment>
+ <comment xml:lang="nn">DICOM-bilete</comment>
+ <comment xml:lang="nl">DICOM-afbeelding</comment>
+ <comment xml:lang="nb">DICOM-bilde</comment>
+ <comment xml:lang="lv">DICOM attēls</comment>
+ <comment xml:lang="lt">DICOM paveikslėlis</comment>
+ <comment xml:lang="ko">DICOM 그림</comment>
+ <comment xml:lang="kk">DICOM суреті</comment>
+ <comment xml:lang="ka">DICOM გამოსახულება</comment>
+ <comment xml:lang="ja">DICOM 画像</comment>
+ <comment xml:lang="it">Immagine DICOM</comment>
+ <comment xml:lang="is">DICOM mynd</comment>
+ <comment xml:lang="id">Citra DICOM</comment>
+ <comment xml:lang="ia">Imagine DICOM</comment>
+ <comment xml:lang="hu">DICOM kép</comment>
+ <comment xml:lang="hr">DICOM slika</comment>
+ <comment xml:lang="he">תמונת DICOM</comment>
+ <comment xml:lang="gl">imaxe DICOM</comment>
+ <comment xml:lang="ga">íomhá DICOM</comment>
+ <comment xml:lang="fur">imagjin DICOM</comment>
+ <comment xml:lang="fr">image DICOM</comment>
+ <comment xml:lang="fo">DICOM mynd</comment>
+ <comment xml:lang="fi">DICOM-kuva</comment>
+ <comment xml:lang="eu">DICOM irudia</comment>
+ <comment xml:lang="es">imagen DICOM</comment>
+ <comment xml:lang="eo">DICOM-bildo</comment>
+ <comment xml:lang="en_GB">DICOM image</comment>
+ <comment xml:lang="el">Εικόνα DICOM</comment>
+ <comment xml:lang="de">DICOM-Bild</comment>
+ <comment xml:lang="da">DICOM-billede</comment>
+ <comment xml:lang="cs">obrázek DICOM</comment>
+ <comment xml:lang="ca">imatge DICOM</comment>
+ <comment xml:lang="bg">Изображение — DICOM</comment>
+ <comment xml:lang="be@latin">Vyjava DICOM</comment>
+ <comment xml:lang="be">выява DICOM</comment>
+ <comment xml:lang="ar">صورة DICOM</comment>
+ <comment xml:lang="af">DICOM-beeld</comment>
<acronym>DICOM</acronym>
<expanded-acronym>Digital Imaging and Communications in Medicine</expanded-acronym>
<generic-icon name="image-x-generic"/>
<glob pattern="dicomdir"/>
<glob pattern="*.dcm"/>
- <magic priority="50">
+ <magic>
<match type="string" value="DICM" offset="128"/>
</magic>
</mime-type>
<mime-type type="application/x-docbook+xml">
<comment>DocBook document</comment>
- <comment xml:lang="af">DocBook-dokument</comment>
- <comment xml:lang="ar">مستند DocBook</comment>
- <comment xml:lang="ast">Documentu DocBook</comment>
- <comment xml:lang="be-Latn">Dakument DocBook</comment>
- <comment xml:lang="bg">Документ — DocBook</comment>
- <comment xml:lang="ca">document DocBook</comment>
- <comment xml:lang="cs">dokument DocBook</comment>
- <comment xml:lang="da">DocBook-dokument</comment>
- <comment xml:lang="de">DocBook-Dokument</comment>
- <comment xml:lang="el">Έγγραφο DocBook</comment>
- <comment xml:lang="en-GB">DocBook document</comment>
- <comment xml:lang="eo">DocBook-dokumento</comment>
- <comment xml:lang="es">documento DocBook</comment>
- <comment xml:lang="eu">DocBook dokumentua</comment>
- <comment xml:lang="fi">DocBook-asiakirja</comment>
- <comment xml:lang="fo">DocBook skjal</comment>
- <comment xml:lang="fr">document DocBook</comment>
- <comment xml:lang="fur">document DocBook</comment>
- <comment xml:lang="ga">cáipéis DocBook</comment>
- <comment xml:lang="gl">documento de DocBook</comment>
- <comment xml:lang="he">מסמך DocBook</comment>
- <comment xml:lang="hr">DocBook dokument</comment>
- <comment xml:lang="hu">DocBook dokumentum</comment>
- <comment xml:lang="ia">Documento DocBook</comment>
- <comment xml:lang="id">Dokumen DocBook</comment>
- <comment xml:lang="it">Documento DocBook</comment>
- <comment xml:lang="ja">DocBook ドキュメント</comment>
- <comment xml:lang="ka">DocBook-ის დოკუმენტი</comment>
- <comment xml:lang="kk">DocBook құжаты</comment>
- <comment xml:lang="ko">DocBook 문서</comment>
- <comment xml:lang="lt">DocBook dokumentas</comment>
- <comment xml:lang="lv">DocBook dokuments</comment>
- <comment xml:lang="nb">DocBook-dokument</comment>
- <comment xml:lang="nl">DocBook-document</comment>
- <comment xml:lang="nn">DocBook-dokument</comment>
- <comment xml:lang="oc">document DocBook</comment>
- <comment xml:lang="pl">Dokument DocBook</comment>
- <comment xml:lang="pt">documento DocBook</comment>
- <comment xml:lang="pt-BR">Documento DocBook</comment>
- <comment xml:lang="ro">Document DocBook</comment>
- <comment xml:lang="ru">Документ DocBook</comment>
- <comment xml:lang="sk">Dokument DocBook</comment>
- <comment xml:lang="sl">Dokument DocBook</comment>
- <comment xml:lang="sq">Dokument DocBook</comment>
- <comment xml:lang="sr">Док Бук документ</comment>
- <comment xml:lang="sv">DocBook-dokument</comment>
- <comment xml:lang="tr">DocBook belgesi</comment>
- <comment xml:lang="uk">документ DocBook</comment>
+ <comment xml:lang="zh_TW">DocBook 文件</comment>
+ <comment xml:lang="zh_CN">DocBook 文档</comment>
<comment xml:lang="vi">Tài liệu DocBook</comment>
- <comment xml:lang="zh-CN">DocBook 文档</comment>
- <comment xml:lang="zh-TW">DocBook 文件</comment>
+ <comment xml:lang="uk">документ DocBook</comment>
+ <comment xml:lang="tr">DocBook belgesi</comment>
+ <comment xml:lang="sv">DocBook-dokument</comment>
+ <comment xml:lang="sr">Док Бук документ</comment>
+ <comment xml:lang="sq">dokument DocBook</comment>
+ <comment xml:lang="sl">Dokument DocBook</comment>
+ <comment xml:lang="si">DocBook ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument DocBook</comment>
+ <comment xml:lang="ru">Документ DocBook</comment>
+ <comment xml:lang="ro">Document DocBook</comment>
+ <comment xml:lang="pt_BR">Documento DocBook</comment>
+ <comment xml:lang="pt">documento DocBook</comment>
+ <comment xml:lang="pl">Dokument DocBook</comment>
+ <comment xml:lang="oc">document DocBook</comment>
+ <comment xml:lang="nn">DocBook-dokument</comment>
+ <comment xml:lang="nl">DocBook-document</comment>
+ <comment xml:lang="nb">DocBook-dokument</comment>
+ <comment xml:lang="lv">DocBook dokuments</comment>
+ <comment xml:lang="lt">DocBook dokumentas</comment>
+ <comment xml:lang="ko">DocBook 문서</comment>
+ <comment xml:lang="kk">DocBook құжаты</comment>
+ <comment xml:lang="ka">DocBook-ის დოკუმენტი</comment>
+ <comment xml:lang="ja">DocBook ドキュメント</comment>
+ <comment xml:lang="it">Documento DocBook</comment>
+ <comment xml:lang="is">DocBook skjal</comment>
+ <comment xml:lang="id">Dokumen DocBook</comment>
+ <comment xml:lang="ia">Documento DocBook</comment>
+ <comment xml:lang="hu">DocBook dokumentum</comment>
+ <comment xml:lang="hr">DocBook dokument</comment>
+ <comment xml:lang="he">מסמך DocBook</comment>
+ <comment xml:lang="gl">documento de DocBook</comment>
+ <comment xml:lang="ga">cáipéis DocBook</comment>
+ <comment xml:lang="fur">document DocBook</comment>
+ <comment xml:lang="fr">document DocBook</comment>
+ <comment xml:lang="fo">DocBook skjal</comment>
+ <comment xml:lang="fi">DocBook-asiakirja</comment>
+ <comment xml:lang="eu">DocBook dokumentua</comment>
+ <comment xml:lang="es">documento DocBook</comment>
+ <comment xml:lang="eo">DocBook-dokumento</comment>
+ <comment xml:lang="en_GB">DocBook document</comment>
+ <comment xml:lang="el">Έγγραφο DocBook</comment>
+ <comment xml:lang="de">DocBook-Dokument</comment>
+ <comment xml:lang="da">DocBook-dokument</comment>
+ <comment xml:lang="cs">dokument DocBook</comment>
+ <comment xml:lang="ca">document DocBook</comment>
+ <comment xml:lang="bg">Документ — DocBook</comment>
+ <comment xml:lang="be@latin">Dakument DocBook</comment>
+ <comment xml:lang="be">дакумент DocBook</comment>
+ <comment xml:lang="ast">Documentu DocBook</comment>
+ <comment xml:lang="ar">مستند DocBook</comment>
+ <comment xml:lang="af">DocBook-dokument</comment>
<sub-class-of type="application/xml"/>
<generic-icon name="x-office-document"/>
<magic priority="90">
@@ -28829,115 +30384,121 @@ command to generate the output files.
</mime-type>
<mime-type type="image/x-dib">
<comment>DIB image</comment>
- <comment xml:lang="af">DIB-beeld</comment>
- <comment xml:lang="ar">صورة DIB</comment>
- <comment xml:lang="be-Latn">Vyjava DIB</comment>
- <comment xml:lang="bg">Изображение — DIB</comment>
- <comment xml:lang="ca">imatge DIB</comment>
- <comment xml:lang="cs">obrázek DIB</comment>
- <comment xml:lang="da">DIB-billede</comment>
- <comment xml:lang="de">DIB-Bild</comment>
- <comment xml:lang="el">Εικόνα DIB</comment>
- <comment xml:lang="en-GB">DIB image</comment>
- <comment xml:lang="eo">DIB-bildo</comment>
- <comment xml:lang="es">imagen DIB</comment>
- <comment xml:lang="eu">DIB irudia</comment>
- <comment xml:lang="fi">DIB-kuva</comment>
- <comment xml:lang="fo">DIB mynd</comment>
- <comment xml:lang="fr">image DIB</comment>
- <comment xml:lang="fur">imagjin DIB</comment>
- <comment xml:lang="ga">íomhá DIB</comment>
- <comment xml:lang="gl">imaxe DIB</comment>
- <comment xml:lang="he">תמונת DIB</comment>
- <comment xml:lang="hr">DIB slika</comment>
- <comment xml:lang="hu">DIB kép</comment>
- <comment xml:lang="ia">Imagine DIB</comment>
- <comment xml:lang="id">Citra DIB</comment>
- <comment xml:lang="it">Immagine DIB</comment>
- <comment xml:lang="ja">DIB 画像</comment>
- <comment xml:lang="ka">DIB გამოსახულება</comment>
- <comment xml:lang="kk">DIB суреті</comment>
- <comment xml:lang="ko">DIB 그림</comment>
- <comment xml:lang="lt">DIB paveikslėlis</comment>
- <comment xml:lang="lv">DIB attēls</comment>
- <comment xml:lang="nb">DIB-bilde</comment>
- <comment xml:lang="nl">DIB-afbeelding</comment>
- <comment xml:lang="nn">DIB-bilete</comment>
- <comment xml:lang="oc">imatge DIB</comment>
- <comment xml:lang="pl">Obraz DIB</comment>
- <comment xml:lang="pt">imagem DIB</comment>
- <comment xml:lang="pt-BR">Imagem DIB</comment>
- <comment xml:lang="ro">Imagine DIB</comment>
- <comment xml:lang="ru">Изображение DIB</comment>
- <comment xml:lang="sk">Obrázok DIB</comment>
- <comment xml:lang="sl">Slikovna datoteka DIB</comment>
- <comment xml:lang="sq">Figurë DIB</comment>
- <comment xml:lang="sr">ДИБ слика</comment>
- <comment xml:lang="sv">DIB-bild</comment>
- <comment xml:lang="tr">DIB görüntüsü</comment>
- <comment xml:lang="uk">зображення DIB</comment>
+ <comment xml:lang="zh_TW">DIB 影像</comment>
+ <comment xml:lang="zh_CN">DIB 图像</comment>
<comment xml:lang="vi">Ảnh DIB</comment>
- <comment xml:lang="zh-CN">DIB 图像</comment>
- <comment xml:lang="zh-TW">DIB 影像</comment>
+ <comment xml:lang="uk">зображення DIB</comment>
+ <comment xml:lang="tr">DIB görüntüsü</comment>
+ <comment xml:lang="sv">DIB-bild</comment>
+ <comment xml:lang="sr">ДИБ слика</comment>
+ <comment xml:lang="sq">figurë DIB</comment>
+ <comment xml:lang="sl">Slikovna datoteka DIB</comment>
+ <comment xml:lang="si">DIB රූපය</comment>
+ <comment xml:lang="sk">Obrázok DIB</comment>
+ <comment xml:lang="ru">Изображение DIB</comment>
+ <comment xml:lang="ro">Imagine DIB</comment>
+ <comment xml:lang="pt_BR">Imagem DIB</comment>
+ <comment xml:lang="pt">imagem DIB</comment>
+ <comment xml:lang="pl">Obraz DIB</comment>
+ <comment xml:lang="oc">imatge DIB</comment>
+ <comment xml:lang="nn">DIB-bilete</comment>
+ <comment xml:lang="nl">DIB-afbeelding</comment>
+ <comment xml:lang="nb">DIB-bilde</comment>
+ <comment xml:lang="lv">DIB attēls</comment>
+ <comment xml:lang="lt">DIB paveikslėlis</comment>
+ <comment xml:lang="ko">DIB 그림</comment>
+ <comment xml:lang="kk">DIB суреті</comment>
+ <comment xml:lang="ka">DIB გამოსახულება</comment>
+ <comment xml:lang="ja">DIB 画像</comment>
+ <comment xml:lang="it">Immagine DIB</comment>
+ <comment xml:lang="is">DIB mynd</comment>
+ <comment xml:lang="id">Citra DIB</comment>
+ <comment xml:lang="ia">Imagine DIB</comment>
+ <comment xml:lang="hu">DIB kép</comment>
+ <comment xml:lang="hr">DIB slika</comment>
+ <comment xml:lang="he">תמונת DIB</comment>
+ <comment xml:lang="gl">imaxe DIB</comment>
+ <comment xml:lang="ga">íomhá DIB</comment>
+ <comment xml:lang="fur">imagjin DIB</comment>
+ <comment xml:lang="fr">image DIB</comment>
+ <comment xml:lang="fo">DIB mynd</comment>
+ <comment xml:lang="fi">DIB-kuva</comment>
+ <comment xml:lang="eu">DIB irudia</comment>
+ <comment xml:lang="es">imagen DIB</comment>
+ <comment xml:lang="eo">DIB-bildo</comment>
+ <comment xml:lang="en_GB">DIB image</comment>
+ <comment xml:lang="el">Εικόνα DIB</comment>
+ <comment xml:lang="de">DIB-Bild</comment>
+ <comment xml:lang="da">DIB-billede</comment>
+ <comment xml:lang="cs">obrázek DIB</comment>
+ <comment xml:lang="ca">imatge DIB</comment>
+ <comment xml:lang="bg">Изображение — DIB</comment>
+ <comment xml:lang="be@latin">Vyjava DIB</comment>
+ <comment xml:lang="be">выява DIB</comment>
+ <comment xml:lang="ar">صورة DIB</comment>
+ <comment xml:lang="af">DIB-beeld</comment>
<acronym>DIB</acronym>
<expanded-acronym>Device Independent Bitmap</expanded-acronym>
- <magic priority="50">
+ <magic>
<match type="string" value="\x28\00\00\00" offset="0"/>
</magic>
</mime-type>
<mime-type type="image/vnd.djvu">
<comment>DjVu image</comment>
- <comment xml:lang="af">DjVu-beeld</comment>
- <comment xml:lang="ar">صورة DjVu</comment>
- <comment xml:lang="be-Latn">Vyjava DjVu</comment>
- <comment xml:lang="bg">Изображение — DjVu</comment>
- <comment xml:lang="ca">imatge DjVu</comment>
- <comment xml:lang="cs">obrázek DjVu</comment>
- <comment xml:lang="da">DjVu-billede</comment>
- <comment xml:lang="de">DjVu-Bild</comment>
- <comment xml:lang="el">Εικόνα DjVu</comment>
- <comment xml:lang="en-GB">DjVu image</comment>
- <comment xml:lang="eo">DjVu-bildo</comment>
- <comment xml:lang="es">imagen DjVu</comment>
- <comment xml:lang="eu">DjVU-ko irudia</comment>
- <comment xml:lang="fi">DjVu-kuva</comment>
- <comment xml:lang="fo">DjVu mynd</comment>
- <comment xml:lang="fr">image DjVu</comment>
- <comment xml:lang="fur">imagjin DjVu</comment>
- <comment xml:lang="ga">íomhá DjVu</comment>
- <comment xml:lang="gl">imaxe de DjVu</comment>
- <comment xml:lang="he">תמונת DjVu</comment>
- <comment xml:lang="hr">DjVu slika</comment>
- <comment xml:lang="hu">DjVu-kép</comment>
- <comment xml:lang="ia">Imagine DjVu</comment>
- <comment xml:lang="id">Citra DjVu</comment>
- <comment xml:lang="it">Immagine DjVu</comment>
- <comment xml:lang="ja">DjVu 画像</comment>
- <comment xml:lang="ka">DjVu გამოსახულება</comment>
- <comment xml:lang="kk">DjVu суреті</comment>
- <comment xml:lang="ko">DjVu 그림</comment>
- <comment xml:lang="lt">DjVu paveikslėlis</comment>
- <comment xml:lang="lv">DjVu attēls</comment>
- <comment xml:lang="ms">Imej DjVu</comment>
- <comment xml:lang="nb">DjVu-bilde</comment>
- <comment xml:lang="nl">DjVu-afbeelding</comment>
- <comment xml:lang="nn">DjVu-bilete</comment>
- <comment xml:lang="oc">imatge DjVu</comment>
- <comment xml:lang="pl">Obraz DjVu</comment>
- <comment xml:lang="pt">imagem DjVu</comment>
- <comment xml:lang="pt-BR">Imagem DjVu</comment>
- <comment xml:lang="ro">Imagine DjVu</comment>
- <comment xml:lang="ru">Изображение DjVu</comment>
- <comment xml:lang="sk">Obrázok DjVu</comment>
- <comment xml:lang="sl">Slikovna datoteka DjVu</comment>
- <comment xml:lang="sq">Figurë DjVu</comment>
- <comment xml:lang="sr">ДјВу слика</comment>
- <comment xml:lang="sv">DjVu-bild</comment>
- <comment xml:lang="tr">DjVu görüntüsü</comment>
- <comment xml:lang="uk">зображення DjVu</comment>
+ <comment xml:lang="zh_TW">DjVu 影像</comment>
+ <comment xml:lang="zh_CN">DjVu 图像</comment>
<comment xml:lang="vi">Ảnh DjVu</comment>
- <comment xml:lang="zh-CN">DjVu 图像</comment>
- <comment xml:lang="zh-TW">DjVu 影像</comment>
+ <comment xml:lang="uk">зображення DjVu</comment>
+ <comment xml:lang="tr">DjVu görüntüsü</comment>
+ <comment xml:lang="sv">DjVu-bild</comment>
+ <comment xml:lang="sr">ДјВу слика</comment>
+ <comment xml:lang="sq">figurë DjVu</comment>
+ <comment xml:lang="sl">Slikovna datoteka DjVu</comment>
+ <comment xml:lang="si">DjVu රූපය</comment>
+ <comment xml:lang="sk">Obrázok DjVu</comment>
+ <comment xml:lang="ru">Изображение DjVu</comment>
+ <comment xml:lang="ro">Imagine DjVu</comment>
+ <comment xml:lang="pt_BR">Imagem DjVu</comment>
+ <comment xml:lang="pt">imagem DjVu</comment>
+ <comment xml:lang="pl">Obraz DjVu</comment>
+ <comment xml:lang="oc">imatge DjVu</comment>
+ <comment xml:lang="nn">DjVu-bilete</comment>
+ <comment xml:lang="nl">DjVu-afbeelding</comment>
+ <comment xml:lang="nb">DjVu-bilde</comment>
+ <comment xml:lang="ms">Imej DjVu</comment>
+ <comment xml:lang="lv">DjVu attēls</comment>
+ <comment xml:lang="lt">DjVu paveikslėlis</comment>
+ <comment xml:lang="ko">DjVu 그림</comment>
+ <comment xml:lang="kk">DjVu суреті</comment>
+ <comment xml:lang="ka">DjVu გამოსახულება</comment>
+ <comment xml:lang="ja">DjVu 画像</comment>
+ <comment xml:lang="it">Immagine DjVu</comment>
+ <comment xml:lang="is">DjVu mynd</comment>
+ <comment xml:lang="id">Citra DjVu</comment>
+ <comment xml:lang="ia">Imagine DjVu</comment>
+ <comment xml:lang="hu">DjVu-kép</comment>
+ <comment xml:lang="hr">DjVu slika</comment>
+ <comment xml:lang="he">תמונת DjVu</comment>
+ <comment xml:lang="gl">imaxe de DjVu</comment>
+ <comment xml:lang="ga">íomhá DjVu</comment>
+ <comment xml:lang="fur">imagjin DjVu</comment>
+ <comment xml:lang="fr">image DjVu</comment>
+ <comment xml:lang="fo">DjVu mynd</comment>
+ <comment xml:lang="fi">DjVu-kuva</comment>
+ <comment xml:lang="eu">DjVU-ko irudia</comment>
+ <comment xml:lang="es">imagen DjVu</comment>
+ <comment xml:lang="eo">DjVu-bildo</comment>
+ <comment xml:lang="en_GB">DjVu image</comment>
+ <comment xml:lang="el">Εικόνα DjVu</comment>
+ <comment xml:lang="de">DjVu-Bild</comment>
+ <comment xml:lang="da">DjVu-billede</comment>
+ <comment xml:lang="cs">obrázek DjVu</comment>
+ <comment xml:lang="ca">imatge DjVu</comment>
+ <comment xml:lang="bg">Изображение — DjVu</comment>
+ <comment xml:lang="be@latin">Vyjava DjVu</comment>
+ <comment xml:lang="be">выява DjVu</comment>
+ <comment xml:lang="ar">صورة DjVu</comment>
+ <comment xml:lang="af">DjVu-beeld</comment>
<alias type="image/x-djvu"/>
<alias type="image/x.djvu"/>
<magic priority="80">
@@ -28953,42 +30514,51 @@ command to generate the output files.
</mime-type>
<mime-type type="image/vnd.djvu+multipage">
<comment>DjVu document</comment>
- <comment xml:lang="af">DjVu-dokument</comment>
- <comment xml:lang="ast">Documentu DjVu</comment>
- <comment xml:lang="bg">Документ — DjVu</comment>
- <comment xml:lang="ca">document DjVu</comment>
- <comment xml:lang="cs">dokument DjVu</comment>
- <comment xml:lang="da">DjVu-dokument</comment>
- <comment xml:lang="de">DjVu-Dokument</comment>
- <comment xml:lang="el">Έγγραφο DjVu</comment>
- <comment xml:lang="en-GB">DjVu document</comment>
- <comment xml:lang="es">documento DjVu</comment>
- <comment xml:lang="eu">DjVu dokumentua</comment>
- <comment xml:lang="fi">DjVu-asiakirja</comment>
- <comment xml:lang="fr">document DjVu</comment>
- <comment xml:lang="fur">document DjVu</comment>
- <comment xml:lang="ga">cáipéis DjVu</comment>
- <comment xml:lang="he">מסמך DjVu</comment>
- <comment xml:lang="hr">DjVu dokument</comment>
- <comment xml:lang="hu">DjVu dokumentum</comment>
- <comment xml:lang="ia">Documento DjVu</comment>
- <comment xml:lang="id">Dokumen DjVu</comment>
- <comment xml:lang="it">Documento DjVu</comment>
- <comment xml:lang="kk">DjVu құжаты</comment>
- <comment xml:lang="ko">DjVu 문서</comment>
- <comment xml:lang="oc">document DjVu</comment>
- <comment xml:lang="pl">Dokument DjVu</comment>
- <comment xml:lang="pt">documento DjVu</comment>
- <comment xml:lang="pt-BR">Documento DjVu</comment>
- <comment xml:lang="ru">Документ DjVu</comment>
- <comment xml:lang="sk">Dokument DjVu</comment>
- <comment xml:lang="sl">Dokument DjVu</comment>
- <comment xml:lang="sr">ДјВу документ</comment>
- <comment xml:lang="sv">DjVu-dokument</comment>
- <comment xml:lang="tr">DjVu belgesi</comment>
+ <comment xml:lang="zh_TW">DjVu 文件</comment>
+ <comment xml:lang="zh_CN">DjVu 文档</comment>
<comment xml:lang="uk">документ DjVu</comment>
- <comment xml:lang="zh-CN">DjVu 文档</comment>
- <comment xml:lang="zh-TW">DjVu 文件</comment>
+ <comment xml:lang="tr">DjVu belgesi</comment>
+ <comment xml:lang="sv">DjVu-dokument</comment>
+ <comment xml:lang="sr">ДјВу документ</comment>
+ <comment xml:lang="sq">dokument DjVu</comment>
+ <comment xml:lang="sl">Dokument DjVu</comment>
+ <comment xml:lang="si">DjVu ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument DjVu</comment>
+ <comment xml:lang="ru">Документ DjVu</comment>
+ <comment xml:lang="pt_BR">Documento DjVu</comment>
+ <comment xml:lang="pt">documento DjVu</comment>
+ <comment xml:lang="pl">Dokument DjVu</comment>
+ <comment xml:lang="oc">document DjVu</comment>
+ <comment xml:lang="nl">DjVu-document</comment>
+ <comment xml:lang="lt">DjVu dokumentas</comment>
+ <comment xml:lang="ko">DjVu 문서</comment>
+ <comment xml:lang="kk">DjVu құжаты</comment>
+ <comment xml:lang="ja">DjVu ドキュメント</comment>
+ <comment xml:lang="it">Documento DjVu</comment>
+ <comment xml:lang="is">DjVu skjal</comment>
+ <comment xml:lang="id">Dokumen DjVu</comment>
+ <comment xml:lang="ia">Documento DjVu</comment>
+ <comment xml:lang="hu">DjVu dokumentum</comment>
+ <comment xml:lang="hr">DjVu dokument</comment>
+ <comment xml:lang="he">מסמך DjVu</comment>
+ <comment xml:lang="gl">Documento DjVu</comment>
+ <comment xml:lang="ga">cáipéis DjVu</comment>
+ <comment xml:lang="fur">document DjVu</comment>
+ <comment xml:lang="fr">document DjVu</comment>
+ <comment xml:lang="fi">DjVu-asiakirja</comment>
+ <comment xml:lang="eu">DjVu dokumentua</comment>
+ <comment xml:lang="es">documento DjVu</comment>
+ <comment xml:lang="en_GB">DjVu document</comment>
+ <comment xml:lang="el">Έγγραφο DjVu</comment>
+ <comment xml:lang="de">DjVu-Dokument</comment>
+ <comment xml:lang="da">DjVu-dokument</comment>
+ <comment xml:lang="cs">dokument DjVu</comment>
+ <comment xml:lang="ca">document DjVu</comment>
+ <comment xml:lang="bg">Документ — DjVu</comment>
+ <comment xml:lang="be">дакумент DjVu</comment>
+ <comment xml:lang="ast">Documentu DjVu</comment>
+ <comment xml:lang="ar">مستند DjVu</comment>
+ <comment xml:lang="af">DjVu-dokument</comment>
<generic-icon name="x-office-document"/>
<magic priority="80">
<match type="string" offset="0" value="AT&amp;TFORM">
@@ -29004,114 +30574,120 @@ command to generate the output files.
</mime-type>
<mime-type type="image/dpx">
<comment>DPX image</comment>
- <comment xml:lang="af">DPX-beeld</comment>
- <comment xml:lang="ar">صورة DPX</comment>
- <comment xml:lang="be-Latn">Vyjava DPX</comment>
- <comment xml:lang="bg">Изображение — DPX</comment>
- <comment xml:lang="ca">imatge DPX</comment>
- <comment xml:lang="cs">obrázek DPX</comment>
- <comment xml:lang="da">DPX-billede</comment>
- <comment xml:lang="de">DPX-Bild</comment>
- <comment xml:lang="el">Εικόνα DPX</comment>
- <comment xml:lang="en-GB">DPX image</comment>
- <comment xml:lang="eo">DPX-bildo</comment>
- <comment xml:lang="es">imagen DPX</comment>
- <comment xml:lang="eu">DPX irudia</comment>
- <comment xml:lang="fi">DPX-kuva</comment>
- <comment xml:lang="fo">DPX mynd</comment>
- <comment xml:lang="fr">image DPX</comment>
- <comment xml:lang="fur">imagjin DPX</comment>
- <comment xml:lang="ga">íomhá DPX</comment>
- <comment xml:lang="gl">imaxe DPX</comment>
- <comment xml:lang="he">תמונת DPX</comment>
- <comment xml:lang="hr">DPX slika</comment>
- <comment xml:lang="hu">DPX kép</comment>
- <comment xml:lang="ia">Imagine DPX</comment>
- <comment xml:lang="id">Citra DPX</comment>
- <comment xml:lang="it">Immagine DPX</comment>
- <comment xml:lang="ja">DPX 画像</comment>
- <comment xml:lang="ka">DPX გამოსახულება</comment>
- <comment xml:lang="kk">DPX суреті</comment>
- <comment xml:lang="ko">DPX 그림</comment>
- <comment xml:lang="lt">DPX paveikslėlis</comment>
- <comment xml:lang="lv">DPX attēls</comment>
- <comment xml:lang="nb">DPX-bilde</comment>
- <comment xml:lang="nl">DPX-afbeelding</comment>
- <comment xml:lang="nn">DPX-bilete</comment>
- <comment xml:lang="oc">imatge DPX</comment>
- <comment xml:lang="pl">Obraz DPX</comment>
- <comment xml:lang="pt">imagem DPX</comment>
- <comment xml:lang="pt-BR">Imagem DPX</comment>
- <comment xml:lang="ro">Imagine DPX</comment>
- <comment xml:lang="ru">Изображение DPX</comment>
- <comment xml:lang="sk">Obrázok DPX</comment>
- <comment xml:lang="sl">Slikovna datoteka DPX</comment>
- <comment xml:lang="sq">Figurë DPX</comment>
- <comment xml:lang="sr">ДПИкс слика</comment>
- <comment xml:lang="sv">DPX-bild</comment>
- <comment xml:lang="tr">DPX görüntüsü</comment>
- <comment xml:lang="uk">зображення DPX</comment>
+ <comment xml:lang="zh_TW">DPX 影像</comment>
+ <comment xml:lang="zh_CN">DPX 图像</comment>
<comment xml:lang="vi">Ảnh DPX</comment>
- <comment xml:lang="zh-CN">DPX 图像</comment>
- <comment xml:lang="zh-TW">DPX 影像</comment>
+ <comment xml:lang="uk">зображення DPX</comment>
+ <comment xml:lang="tr">DPX görüntüsü</comment>
+ <comment xml:lang="sv">DPX-bild</comment>
+ <comment xml:lang="sr">ДПИкс слика</comment>
+ <comment xml:lang="sq">figurë DPX</comment>
+ <comment xml:lang="sl">Slikovna datoteka DPX</comment>
+ <comment xml:lang="si">DPX රූපය</comment>
+ <comment xml:lang="sk">Obrázok DPX</comment>
+ <comment xml:lang="ru">Изображение DPX</comment>
+ <comment xml:lang="ro">Imagine DPX</comment>
+ <comment xml:lang="pt_BR">Imagem DPX</comment>
+ <comment xml:lang="pt">imagem DPX</comment>
+ <comment xml:lang="pl">Obraz DPX</comment>
+ <comment xml:lang="oc">imatge DPX</comment>
+ <comment xml:lang="nn">DPX-bilete</comment>
+ <comment xml:lang="nl">DPX-afbeelding</comment>
+ <comment xml:lang="nb">DPX-bilde</comment>
+ <comment xml:lang="lv">DPX attēls</comment>
+ <comment xml:lang="lt">DPX paveikslėlis</comment>
+ <comment xml:lang="ko">DPX 그림</comment>
+ <comment xml:lang="kk">DPX суреті</comment>
+ <comment xml:lang="ka">DPX გამოსახულება</comment>
+ <comment xml:lang="ja">DPX 画像</comment>
+ <comment xml:lang="it">Immagine DPX</comment>
+ <comment xml:lang="is">DPX mynd</comment>
+ <comment xml:lang="id">Citra DPX</comment>
+ <comment xml:lang="ia">Imagine DPX</comment>
+ <comment xml:lang="hu">DPX kép</comment>
+ <comment xml:lang="hr">DPX slika</comment>
+ <comment xml:lang="he">תמונת DPX</comment>
+ <comment xml:lang="gl">imaxe DPX</comment>
+ <comment xml:lang="ga">íomhá DPX</comment>
+ <comment xml:lang="fur">imagjin DPX</comment>
+ <comment xml:lang="fr">image DPX</comment>
+ <comment xml:lang="fo">DPX mynd</comment>
+ <comment xml:lang="fi">DPX-kuva</comment>
+ <comment xml:lang="eu">DPX irudia</comment>
+ <comment xml:lang="es">imagen DPX</comment>
+ <comment xml:lang="eo">DPX-bildo</comment>
+ <comment xml:lang="en_GB">DPX image</comment>
+ <comment xml:lang="el">Εικόνα DPX</comment>
+ <comment xml:lang="de">DPX-Bild</comment>
+ <comment xml:lang="da">DPX-billede</comment>
+ <comment xml:lang="cs">obrázek DPX</comment>
+ <comment xml:lang="ca">imatge DPX</comment>
+ <comment xml:lang="bg">Изображение — DPX</comment>
+ <comment xml:lang="be@latin">Vyjava DPX</comment>
+ <comment xml:lang="be">выява DPX</comment>
+ <comment xml:lang="ar">صورة DPX</comment>
+ <comment xml:lang="af">DPX-beeld</comment>
<acronym>DPX</acronym>
<expanded-acronym>Digital Moving Picture Exchange</expanded-acronym>
- <magic priority="50">
+ <magic>
<match type="big32" value="0x53445058" offset="0"/>
</magic>
</mime-type>
<mime-type type="image/x-eps">
<comment>EPS image</comment>
- <comment xml:lang="af">EPS-beeld</comment>
- <comment xml:lang="ar">صورة EPS</comment>
- <comment xml:lang="be-Latn">Vyjava EPS</comment>
- <comment xml:lang="bg">Изображение — EPS</comment>
- <comment xml:lang="ca">imatge EPS</comment>
- <comment xml:lang="cs">obrázek EPS</comment>
- <comment xml:lang="da">EPS-billede</comment>
- <comment xml:lang="de">EPS-Bild</comment>
- <comment xml:lang="el">Εικόνα EPS</comment>
- <comment xml:lang="en-GB">EPS image</comment>
- <comment xml:lang="eo">EPS-bildo</comment>
- <comment xml:lang="es">imagen EPS</comment>
- <comment xml:lang="eu">EPS irudia</comment>
- <comment xml:lang="fi">EPS-kuva</comment>
- <comment xml:lang="fo">EPS mynd</comment>
- <comment xml:lang="fr">image EPS</comment>
- <comment xml:lang="fur">imagjin EPS</comment>
- <comment xml:lang="ga">íomhá EPS</comment>
- <comment xml:lang="gl">imaxe EPS</comment>
- <comment xml:lang="he">תמונת EPS</comment>
- <comment xml:lang="hr">EPS slika</comment>
- <comment xml:lang="hu">EPS kép</comment>
- <comment xml:lang="ia">Imagine EPS</comment>
- <comment xml:lang="id">Citra EPS</comment>
- <comment xml:lang="it">Immagine EPS</comment>
- <comment xml:lang="ja">EPS 画像</comment>
- <comment xml:lang="ka">EPS გამოსახულება</comment>
- <comment xml:lang="kk">EPS суреті</comment>
- <comment xml:lang="ko">EPS 그림</comment>
- <comment xml:lang="lt">EPS paveikslėlis</comment>
- <comment xml:lang="lv">EPS attēls</comment>
- <comment xml:lang="nb">EPS-bilde</comment>
- <comment xml:lang="nl">EPS-afbeelding</comment>
- <comment xml:lang="nn">EPS-bilete</comment>
- <comment xml:lang="oc">imatge EPS</comment>
- <comment xml:lang="pl">Obraz EPS</comment>
- <comment xml:lang="pt">imagem EPS</comment>
- <comment xml:lang="pt-BR">Imagem EPS</comment>
- <comment xml:lang="ro">Imagine EPS</comment>
- <comment xml:lang="ru">Изображение EPS</comment>
- <comment xml:lang="sk">Obrázok EPS</comment>
- <comment xml:lang="sl">Slikovna datoteka EPS</comment>
- <comment xml:lang="sq">Figurë EPS</comment>
- <comment xml:lang="sr">ЕПС слика</comment>
- <comment xml:lang="sv">EPS-bild</comment>
- <comment xml:lang="tr">EPS görüntüsü</comment>
- <comment xml:lang="uk">зображення EPS</comment>
+ <comment xml:lang="zh_TW">EPS 影像</comment>
+ <comment xml:lang="zh_CN">EPS 图像</comment>
<comment xml:lang="vi">Ảnh EPS</comment>
- <comment xml:lang="zh-CN">EPS 图像</comment>
- <comment xml:lang="zh-TW">EPS 影像</comment>
+ <comment xml:lang="uk">зображення EPS</comment>
+ <comment xml:lang="tr">EPS görüntüsü</comment>
+ <comment xml:lang="sv">EPS-bild</comment>
+ <comment xml:lang="sr">ЕПС слика</comment>
+ <comment xml:lang="sq">figurë EPS</comment>
+ <comment xml:lang="sl">Slikovna datoteka EPS</comment>
+ <comment xml:lang="si">EPS රූපය</comment>
+ <comment xml:lang="sk">Obrázok EPS</comment>
+ <comment xml:lang="ru">Изображение EPS</comment>
+ <comment xml:lang="ro">Imagine EPS</comment>
+ <comment xml:lang="pt_BR">Imagem EPS</comment>
+ <comment xml:lang="pt">imagem EPS</comment>
+ <comment xml:lang="pl">Obraz EPS</comment>
+ <comment xml:lang="oc">imatge EPS</comment>
+ <comment xml:lang="nn">EPS-bilete</comment>
+ <comment xml:lang="nl">EPS-afbeelding</comment>
+ <comment xml:lang="nb">EPS-bilde</comment>
+ <comment xml:lang="lv">EPS attēls</comment>
+ <comment xml:lang="lt">EPS paveikslėlis</comment>
+ <comment xml:lang="ko">EPS 그림</comment>
+ <comment xml:lang="kk">EPS суреті</comment>
+ <comment xml:lang="ka">EPS გამოსახულება</comment>
+ <comment xml:lang="ja">EPS 画像</comment>
+ <comment xml:lang="it">Immagine EPS</comment>
+ <comment xml:lang="is">EPS mynd</comment>
+ <comment xml:lang="id">Citra EPS</comment>
+ <comment xml:lang="ia">Imagine EPS</comment>
+ <comment xml:lang="hu">EPS kép</comment>
+ <comment xml:lang="hr">EPS slika</comment>
+ <comment xml:lang="he">תמונת EPS</comment>
+ <comment xml:lang="gl">imaxe EPS</comment>
+ <comment xml:lang="ga">íomhá EPS</comment>
+ <comment xml:lang="fur">imagjin EPS</comment>
+ <comment xml:lang="fr">image EPS</comment>
+ <comment xml:lang="fo">EPS mynd</comment>
+ <comment xml:lang="fi">EPS-kuva</comment>
+ <comment xml:lang="eu">EPS irudia</comment>
+ <comment xml:lang="es">imagen EPS</comment>
+ <comment xml:lang="eo">EPS-bildo</comment>
+ <comment xml:lang="en_GB">EPS image</comment>
+ <comment xml:lang="el">Εικόνα EPS</comment>
+ <comment xml:lang="de">EPS-Bild</comment>
+ <comment xml:lang="da">EPS-billede</comment>
+ <comment xml:lang="cs">obrázek EPS</comment>
+ <comment xml:lang="ca">imatge EPS</comment>
+ <comment xml:lang="bg">Изображение — EPS</comment>
+ <comment xml:lang="be@latin">Vyjava EPS</comment>
+ <comment xml:lang="be">выява EPS</comment>
+ <comment xml:lang="ar">صورة EPS</comment>
+ <comment xml:lang="af">EPS-beeld</comment>
<acronym>EPS</acronym>
<expanded-acronym>Encapsulated PostScript</expanded-acronym>
<sub-class-of type="application/postscript"/>
@@ -29128,176 +30704,188 @@ command to generate the output files.
<glob pattern="*.epsi"/>
<glob pattern="*.epsf"/>
</mime-type>
- <mime-type type="image/fits">
+ <mime-type type="application/fits">
<comment>FITS document</comment>
- <comment xml:lang="af">FITS-dokument</comment>
- <comment xml:lang="ar">مستند FITS</comment>
- <comment xml:lang="ast">Documentu FITS</comment>
- <comment xml:lang="be-Latn">Dakument FITS</comment>
- <comment xml:lang="bg">Документ — FITS</comment>
- <comment xml:lang="ca">document FITS</comment>
- <comment xml:lang="cs">dokument FITS</comment>
- <comment xml:lang="da">FITS-dokument</comment>
- <comment xml:lang="de">FITS-Dokument</comment>
- <comment xml:lang="el">Έγγραφο FITS</comment>
- <comment xml:lang="en-GB">FITS document</comment>
- <comment xml:lang="eo">FITS-dokumento</comment>
- <comment xml:lang="es">documento FITS</comment>
- <comment xml:lang="eu">FITS dokumentua</comment>
- <comment xml:lang="fi">FITS-asiakirja</comment>
- <comment xml:lang="fo">FITS skjal</comment>
- <comment xml:lang="fr">document FITS</comment>
- <comment xml:lang="fur">document FITS</comment>
- <comment xml:lang="ga">cáipéis FITS</comment>
- <comment xml:lang="gl">documento FICT</comment>
- <comment xml:lang="he">מסמך FITS</comment>
- <comment xml:lang="hr">FITS dokument</comment>
- <comment xml:lang="hu">FITS dokumentum</comment>
- <comment xml:lang="ia">Documento FITS</comment>
- <comment xml:lang="id">Dokumen FITS</comment>
- <comment xml:lang="it">Documento FITS</comment>
- <comment xml:lang="ja">FITS ドキュメント</comment>
- <comment xml:lang="ka">FITS დოკუმენტი</comment>
- <comment xml:lang="kk">FITS құжаты</comment>
- <comment xml:lang="ko">FITS 문서</comment>
- <comment xml:lang="lt">FITS dokumentas</comment>
- <comment xml:lang="lv">FITS dokuments</comment>
- <comment xml:lang="nb">FITS-dokument</comment>
- <comment xml:lang="nl">FITS-document</comment>
- <comment xml:lang="nn">FITS-dokument</comment>
- <comment xml:lang="oc">document FITS</comment>
- <comment xml:lang="pl">Dokument FITS</comment>
- <comment xml:lang="pt">documento FITS</comment>
- <comment xml:lang="pt-BR">Documento FITS</comment>
- <comment xml:lang="ro">Document FITS</comment>
- <comment xml:lang="ru">Документ FITS</comment>
- <comment xml:lang="sk">Dokument FITS</comment>
- <comment xml:lang="sl">Dokument FITS</comment>
- <comment xml:lang="sq">Dokument FITS</comment>
- <comment xml:lang="sr">ФИТС документ</comment>
- <comment xml:lang="sv">FITS-dokument</comment>
- <comment xml:lang="tr">FITS belgesi</comment>
- <comment xml:lang="uk">документ FITS</comment>
+ <comment xml:lang="zh_TW">FITS 文件</comment>
+ <comment xml:lang="zh_CN">FITS 文档</comment>
<comment xml:lang="vi">Tài liệu FITS</comment>
- <comment xml:lang="zh-CN">FITS 文档</comment>
- <comment xml:lang="zh-TW">FITS 文件</comment>
+ <comment xml:lang="uk">документ FITS</comment>
+ <comment xml:lang="tr">FITS belgesi</comment>
+ <comment xml:lang="sv">FITS-dokument</comment>
+ <comment xml:lang="sr">ФИТС документ</comment>
+ <comment xml:lang="sq">dokument FITS</comment>
+ <comment xml:lang="sl">Dokument FITS</comment>
+ <comment xml:lang="si">FITS ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument FITS</comment>
+ <comment xml:lang="ru">Документ FITS</comment>
+ <comment xml:lang="ro">Document FITS</comment>
+ <comment xml:lang="pt_BR">Documento FITS</comment>
+ <comment xml:lang="pt">documento FITS</comment>
+ <comment xml:lang="pl">Dokument FITS</comment>
+ <comment xml:lang="oc">document FITS</comment>
+ <comment xml:lang="nn">FITS-dokument</comment>
+ <comment xml:lang="nl">FITS-document</comment>
+ <comment xml:lang="nb">FITS-dokument</comment>
+ <comment xml:lang="lv">FITS dokuments</comment>
+ <comment xml:lang="lt">FITS dokumentas</comment>
+ <comment xml:lang="ko">FITS 문서</comment>
+ <comment xml:lang="kk">FITS құжаты</comment>
+ <comment xml:lang="ka">FITS დოკუმენტი</comment>
+ <comment xml:lang="ja">FITS ドキュメント</comment>
+ <comment xml:lang="it">Documento FITS</comment>
+ <comment xml:lang="is">FITS skjalskjal</comment>
+ <comment xml:lang="id">Dokumen FITS</comment>
+ <comment xml:lang="ia">Documento FITS</comment>
+ <comment xml:lang="hu">FITS dokumentum</comment>
+ <comment xml:lang="hr">FITS dokument</comment>
+ <comment xml:lang="he">מסמך FITS</comment>
+ <comment xml:lang="gl">documento FICT</comment>
+ <comment xml:lang="ga">cáipéis FITS</comment>
+ <comment xml:lang="fur">document FITS</comment>
+ <comment xml:lang="fr">document FITS</comment>
+ <comment xml:lang="fo">FITS skjal</comment>
+ <comment xml:lang="fi">FITS-asiakirja</comment>
+ <comment xml:lang="eu">FITS dokumentua</comment>
+ <comment xml:lang="es">documento FITS</comment>
+ <comment xml:lang="eo">FITS-dokumento</comment>
+ <comment xml:lang="en_GB">FITS document</comment>
+ <comment xml:lang="el">Έγγραφο FITS</comment>
+ <comment xml:lang="de">FITS-Dokument</comment>
+ <comment xml:lang="da">FITS-dokument</comment>
+ <comment xml:lang="cs">dokument FITS</comment>
+ <comment xml:lang="ca">document FITS</comment>
+ <comment xml:lang="bg">Документ — FITS</comment>
+ <comment xml:lang="be@latin">Dakument FITS</comment>
+ <comment xml:lang="be">дакумент FITS</comment>
+ <comment xml:lang="ast">Documentu FITS</comment>
+ <comment xml:lang="ar">مستند FITS</comment>
+ <comment xml:lang="af">FITS-dokument</comment>
<acronym>FITS</acronym>
<expanded-acronym>Flexible Image Transport System</expanded-acronym>
- <magic priority="50">
+ <magic>
<match type="string" value="SIMPLE =" offset="0"/>
</magic>
<glob pattern="*.fits"/>
+ <glob pattern="*.fit"/>
+ <glob pattern="*.fts"/>
<alias type="image/x-fits"/>
+ <alias type="image/fits"/>
</mime-type>
<mime-type type="image/x-fpx">
<comment>FPX image</comment>
- <comment xml:lang="af">FPX-beeld</comment>
- <comment xml:lang="ar">صورة FPX</comment>
- <comment xml:lang="be-Latn">Vyjava FPX</comment>
- <comment xml:lang="bg">Изображение — FPX</comment>
- <comment xml:lang="ca">imatge FPX</comment>
- <comment xml:lang="cs">obrázek FPX</comment>
- <comment xml:lang="da">FPX-billede</comment>
- <comment xml:lang="de">FPX-Bild</comment>
- <comment xml:lang="el">Εικόνα FPX</comment>
- <comment xml:lang="en-GB">FPX image</comment>
- <comment xml:lang="eo">FPX-bildo</comment>
- <comment xml:lang="es">imagen FPX</comment>
- <comment xml:lang="eu">FPX irudia</comment>
- <comment xml:lang="fi">FPX-kuva</comment>
- <comment xml:lang="fo">FPX mynd</comment>
- <comment xml:lang="fr">image FPX</comment>
- <comment xml:lang="fur">imagjin FPX</comment>
- <comment xml:lang="ga">íomhá FPX</comment>
- <comment xml:lang="gl">imaxe FPX</comment>
- <comment xml:lang="he">תמונת FPX</comment>
- <comment xml:lang="hr">FPX slika</comment>
- <comment xml:lang="hu">FPX kép</comment>
- <comment xml:lang="ia">Imagine FPX</comment>
- <comment xml:lang="id">Citra FPX</comment>
- <comment xml:lang="it">Immagine FPX</comment>
- <comment xml:lang="ja">FPX 画像</comment>
- <comment xml:lang="ka">FPX გამოსახულება</comment>
- <comment xml:lang="kk">FPX суреті</comment>
- <comment xml:lang="ko">FPX 그림</comment>
- <comment xml:lang="lt">FPX paveikslėlis</comment>
- <comment xml:lang="lv">FPX attēls</comment>
- <comment xml:lang="nb">FPX-bilde</comment>
- <comment xml:lang="nl">FPX-afbeelding</comment>
- <comment xml:lang="nn">FPX-bilete</comment>
- <comment xml:lang="oc">imatge FPX</comment>
- <comment xml:lang="pl">Obraz FPX</comment>
- <comment xml:lang="pt">imagem FPX</comment>
- <comment xml:lang="pt-BR">Imagem FPX</comment>
- <comment xml:lang="ro">Imagine FPX</comment>
- <comment xml:lang="ru">Изображение FPX</comment>
- <comment xml:lang="sk">Obrázok FPX</comment>
- <comment xml:lang="sl">Slikovna datoteka FPX</comment>
- <comment xml:lang="sq">Figurë FPX</comment>
- <comment xml:lang="sr">ФПИкс слика</comment>
- <comment xml:lang="sv">FPX-bild</comment>
- <comment xml:lang="tr">FPX görüntüsü</comment>
- <comment xml:lang="uk">зображення FPX</comment>
+ <comment xml:lang="zh_TW">FPX 影像</comment>
+ <comment xml:lang="zh_CN">FPX 图像</comment>
<comment xml:lang="vi">Ảnh FPX</comment>
- <comment xml:lang="zh-CN">FPX 图像</comment>
- <comment xml:lang="zh-TW">FPX 影像</comment>
+ <comment xml:lang="uk">зображення FPX</comment>
+ <comment xml:lang="tr">FPX görüntüsü</comment>
+ <comment xml:lang="sv">FPX-bild</comment>
+ <comment xml:lang="sr">ФПИкс слика</comment>
+ <comment xml:lang="sq">figurë FPX</comment>
+ <comment xml:lang="sl">Slikovna datoteka FPX</comment>
+ <comment xml:lang="si">FPX රූපය</comment>
+ <comment xml:lang="sk">Obrázok FPX</comment>
+ <comment xml:lang="ru">Изображение FPX</comment>
+ <comment xml:lang="ro">Imagine FPX</comment>
+ <comment xml:lang="pt_BR">Imagem FPX</comment>
+ <comment xml:lang="pt">imagem FPX</comment>
+ <comment xml:lang="pl">Obraz FPX</comment>
+ <comment xml:lang="oc">imatge FPX</comment>
+ <comment xml:lang="nn">FPX-bilete</comment>
+ <comment xml:lang="nl">FPX-afbeelding</comment>
+ <comment xml:lang="nb">FPX-bilde</comment>
+ <comment xml:lang="lv">FPX attēls</comment>
+ <comment xml:lang="lt">FPX paveikslėlis</comment>
+ <comment xml:lang="ko">FPX 그림</comment>
+ <comment xml:lang="kk">FPX суреті</comment>
+ <comment xml:lang="ka">FPX გამოსახულება</comment>
+ <comment xml:lang="ja">FPX 画像</comment>
+ <comment xml:lang="it">Immagine FPX</comment>
+ <comment xml:lang="is">FPX mynd</comment>
+ <comment xml:lang="id">Citra FPX</comment>
+ <comment xml:lang="ia">Imagine FPX</comment>
+ <comment xml:lang="hu">FPX kép</comment>
+ <comment xml:lang="hr">FPX slika</comment>
+ <comment xml:lang="he">תמונת FPX</comment>
+ <comment xml:lang="gl">imaxe FPX</comment>
+ <comment xml:lang="ga">íomhá FPX</comment>
+ <comment xml:lang="fur">imagjin FPX</comment>
+ <comment xml:lang="fr">image FPX</comment>
+ <comment xml:lang="fo">FPX mynd</comment>
+ <comment xml:lang="fi">FPX-kuva</comment>
+ <comment xml:lang="eu">FPX irudia</comment>
+ <comment xml:lang="es">imagen FPX</comment>
+ <comment xml:lang="eo">FPX-bildo</comment>
+ <comment xml:lang="en_GB">FPX image</comment>
+ <comment xml:lang="el">Εικόνα FPX</comment>
+ <comment xml:lang="de">FPX-Bild</comment>
+ <comment xml:lang="da">FPX-billede</comment>
+ <comment xml:lang="cs">obrázek FPX</comment>
+ <comment xml:lang="ca">imatge FPX</comment>
+ <comment xml:lang="bg">Изображение — FPX</comment>
+ <comment xml:lang="be@latin">Vyjava FPX</comment>
+ <comment xml:lang="be">выява FPX</comment>
+ <comment xml:lang="ar">صورة FPX</comment>
+ <comment xml:lang="af">FPX-beeld</comment>
<acronym>FPX</acronym>
<expanded-acronym>FlashPiX</expanded-acronym>
- <magic priority="50">
+ <magic>
<match type="big32" value="0x46506978" offset="0"/>
</magic>
</mime-type>
<mime-type type="image/x-gzeps">
<comment>EPS image (gzip-compressed)</comment>
- <comment xml:lang="af">EPS-beeld (gzip-saamgepers)</comment>
- <comment xml:lang="ar">صورة EPS (مضغوط-gzip)</comment>
- <comment xml:lang="be-Latn">Vyjava EPS (gzip-skampresavanaja)</comment>
- <comment xml:lang="bg">Изображение — EPS, компресирано с gzip</comment>
- <comment xml:lang="ca">imatge EPS (amb compressió gzip)</comment>
- <comment xml:lang="cs">obrázek EPS (komprimovaný pomocí gzip)</comment>
- <comment xml:lang="da">EPS-billede (gzip-komprimeret)</comment>
- <comment xml:lang="de">EPS-Bild (gzip-komprimiert)</comment>
- <comment xml:lang="el">Εικόνα EPS (συμπιεσμένη gzip)</comment>
- <comment xml:lang="en-GB">EPS image (gzip-compressed)</comment>
- <comment xml:lang="es">imagen EPS (comprimida con gzip)</comment>
- <comment xml:lang="eu">EPS irudia (gzip-ekin konprimitua)</comment>
- <comment xml:lang="fi">EPS-kuva (gzip-pakattu)</comment>
- <comment xml:lang="fo">EPS mynd (gzip-stappað)</comment>
- <comment xml:lang="fr">image EPS (compressée gzip)</comment>
- <comment xml:lang="fur">imagjin EPS (comprimude cun gzip)</comment>
- <comment xml:lang="ga">íomhá EPS (comhbhrúite le gzip)</comment>
- <comment xml:lang="gl">imaxe EPS (comprimida con gzip)</comment>
- <comment xml:lang="he">תמונת EPS (מכווץ ע״י gzip)</comment>
- <comment xml:lang="hr">EPS slika (gzip sažeta)</comment>
- <comment xml:lang="hu">EPS kép (gzip tömörítésű)</comment>
- <comment xml:lang="ia">Imagine EPS (comprimite con gzip)</comment>
- <comment xml:lang="id">Citra EPS (terkompresi gzip)</comment>
- <comment xml:lang="it">Immagine EPS (compressa con gzip)</comment>
- <comment xml:lang="ja">EPS 画像 (gzip 圧縮)</comment>
- <comment xml:lang="ka">EPS გამოსახულება (gzip-ით შეკუმშული)</comment>
- <comment xml:lang="kk">EPS суреті (gzip-пен сығылған)</comment>
- <comment xml:lang="ko">EPS 그림(GZIP 압축)</comment>
- <comment xml:lang="lt">EPS paveikslėlis (suglaudintas su gzip)</comment>
- <comment xml:lang="lv">EPS attēls (saspiests ar gzip)</comment>
- <comment xml:lang="nb">EPS-bilde (gzip-komprimert)</comment>
- <comment xml:lang="nl">EPS-afbeelding (ingepakt met gzip)</comment>
- <comment xml:lang="nn">EPS-bilete (pakka med gzip)</comment>
- <comment xml:lang="oc">imatge EPS (compressat gzip)</comment>
- <comment xml:lang="pl">Obraz EPS (kompresja gzip)</comment>
- <comment xml:lang="pt">imagem EPS (compressão gzip)</comment>
- <comment xml:lang="pt-BR">Imagem EPS (compactada com gzip)</comment>
- <comment xml:lang="ro">Imagine EPS (compresie gzip)</comment>
- <comment xml:lang="ru">Изображение EPS (сжатое gzip)</comment>
- <comment xml:lang="sk">Obrázok EPS (komprimovaný pomocou gzip)</comment>
- <comment xml:lang="sl">Slikovna datoteka EPS (stisnjena z gzip)</comment>
- <comment xml:lang="sq">Figurë EPS (e kompresuar me gzip)</comment>
- <comment xml:lang="sr">ЕПС слика (запакована гзип-ом)</comment>
- <comment xml:lang="sv">EPS-bild (gzip-komprimerad)</comment>
- <comment xml:lang="tr">EPS görüntüsü (gzip ile sıkıştırılmış)</comment>
- <comment xml:lang="uk">зображення EPS (стиснене gzip)</comment>
+ <comment xml:lang="zh_TW">EPS 影像 (gzip 壓縮)</comment>
+ <comment xml:lang="zh_CN">EPS 图像(gzip 压缩)</comment>
<comment xml:lang="vi">Ảnh EPS (đã nén gzip)</comment>
- <comment xml:lang="zh-CN">EPS 图像(gzip 压缩)</comment>
- <comment xml:lang="zh-TW">EPS 影像 (gzip 壓縮)</comment>
+ <comment xml:lang="uk">зображення EPS (стиснене gzip)</comment>
+ <comment xml:lang="tr">EPS görüntüsü (gzip ile sıkıştırılmış)</comment>
+ <comment xml:lang="sv">EPS-bild (gzip-komprimerad)</comment>
+ <comment xml:lang="sr">ЕПС слика (запакована гзип-ом)</comment>
+ <comment xml:lang="sq">figurë EPS (ngjeshur me gzip)</comment>
+ <comment xml:lang="sl">Slikovna datoteka EPS (stisnjena z gzip)</comment>
+ <comment xml:lang="si">EPS රූපය (gzip සම්පීඩිත)</comment>
+ <comment xml:lang="sk">Obrázok EPS (komprimovaný pomocou gzip)</comment>
+ <comment xml:lang="ru">Изображение EPS (сжатое gzip)</comment>
+ <comment xml:lang="ro">Imagine EPS (compresie gzip)</comment>
+ <comment xml:lang="pt_BR">Imagem EPS (compactada com gzip)</comment>
+ <comment xml:lang="pt">imagem EPS (compressão gzip)</comment>
+ <comment xml:lang="pl">Obraz EPS (kompresja gzip)</comment>
+ <comment xml:lang="oc">imatge EPS (compressat gzip)</comment>
+ <comment xml:lang="nn">EPS-bilete (pakka med gzip)</comment>
+ <comment xml:lang="nl">EPS-afbeelding (ingepakt met gzip)</comment>
+ <comment xml:lang="nb">EPS-bilde (gzip-komprimert)</comment>
+ <comment xml:lang="lv">EPS attēls (saspiests ar gzip)</comment>
+ <comment xml:lang="lt">EPS paveikslėlis (suglaudintas su gzip)</comment>
+ <comment xml:lang="ko">EPS 그림(GZIP 압축)</comment>
+ <comment xml:lang="kk">EPS суреті (gzip-пен сығылған)</comment>
+ <comment xml:lang="ka">EPS გამოსახულება (gzip-ით შეკუმშული)</comment>
+ <comment xml:lang="ja">EPS 画像 (gzip 圧縮)</comment>
+ <comment xml:lang="it">Immagine EPS (compressa con gzip)</comment>
+ <comment xml:lang="is">EPS mynd (gzip-þjöppuð)</comment>
+ <comment xml:lang="id">Citra EPS (terkompresi gzip)</comment>
+ <comment xml:lang="ia">Imagine EPS (comprimite con gzip)</comment>
+ <comment xml:lang="hu">EPS kép (gzip tömörítésű)</comment>
+ <comment xml:lang="hr">EPS slika (gzip sažeta)</comment>
+ <comment xml:lang="he">תמונת EPS (מכווץ ע״י gzip)</comment>
+ <comment xml:lang="gl">imaxe EPS (comprimida con gzip)</comment>
+ <comment xml:lang="ga">íomhá EPS (comhbhrúite le gzip)</comment>
+ <comment xml:lang="fur">imagjin EPS (comprimude cun gzip)</comment>
+ <comment xml:lang="fr">image EPS (compressée gzip)</comment>
+ <comment xml:lang="fo">EPS mynd (gzip-stappað)</comment>
+ <comment xml:lang="fi">EPS-kuva (gzip-pakattu)</comment>
+ <comment xml:lang="eu">EPS irudia (gzip-ekin konprimitua)</comment>
+ <comment xml:lang="es">imagen EPS (comprimida con GZIP)</comment>
+ <comment xml:lang="en_GB">EPS image (gzip-compressed)</comment>
+ <comment xml:lang="el">Εικόνα EPS (συμπιεσμένη gzip)</comment>
+ <comment xml:lang="de">EPS-Bild (gzip-komprimiert)</comment>
+ <comment xml:lang="da">EPS-billede (gzip-komprimeret)</comment>
+ <comment xml:lang="cs">obrázek EPS (komprimovaný pomocí gzip)</comment>
+ <comment xml:lang="ca">imatge EPS (amb compressió gzip)</comment>
+ <comment xml:lang="bg">Изображение — EPS, компресирано с gzip</comment>
+ <comment xml:lang="be@latin">Vyjava EPS (gzip-skampresavanaja)</comment>
+ <comment xml:lang="be">выява EPS (сцісканне gzip)</comment>
+ <comment xml:lang="ar">صورة EPS (مضغوط-gzip)</comment>
+ <comment xml:lang="af">EPS-beeld (gzip-saamgepers)</comment>
<sub-class-of type="application/gzip"/>
<glob pattern="*.eps.gz"/>
<glob pattern="*.epsi.gz"/>
@@ -29305,42 +30893,52 @@ command to generate the output files.
</mime-type>
<mime-type type="image/vnd.microsoft.icon">
<comment>Windows icon</comment>
- <comment xml:lang="af">Windows-ikoon</comment>
- <comment xml:lang="bg">Икона — Windows</comment>
- <comment xml:lang="ca">icona de Windows</comment>
- <comment xml:lang="cs">ikona Windows</comment>
- <comment xml:lang="da">Windows-ikon</comment>
- <comment xml:lang="de">Windows-Symbol</comment>
- <comment xml:lang="el">Εικονίδιο Windows</comment>
- <comment xml:lang="en-GB">Windows icon</comment>
- <comment xml:lang="es">icono de Windows</comment>
- <comment xml:lang="eu">Windows ikonoa</comment>
- <comment xml:lang="fi">Windows-kuvake</comment>
- <comment xml:lang="fr">icône Windows</comment>
- <comment xml:lang="fur">icone Windows</comment>
- <comment xml:lang="ga">deilbhín Windows</comment>
- <comment xml:lang="he">סמל של Windows</comment>
- <comment xml:lang="hr">Windows ikona</comment>
- <comment xml:lang="hu">Windows ikon</comment>
- <comment xml:lang="ia">Icone pro Windows</comment>
- <comment xml:lang="id">Ikon Windows</comment>
- <comment xml:lang="it">Icona Windows</comment>
- <comment xml:lang="kk">Windows таңбашасы</comment>
- <comment xml:lang="ko">Windows 아이콘</comment>
- <comment xml:lang="oc">icòna Windows</comment>
- <comment xml:lang="pl">Ikona Windows</comment>
- <comment xml:lang="pt">ícone Windows</comment>
- <comment xml:lang="pt-BR">Ícone do Windows</comment>
- <comment xml:lang="ru">Значок Windows</comment>
- <comment xml:lang="sk">Ikona Windows</comment>
- <comment xml:lang="sl">Ikona Windows</comment>
- <comment xml:lang="sr">Иконица Виндоуза</comment>
- <comment xml:lang="sv">Windows-ikon</comment>
- <comment xml:lang="tr">Windows simgesi</comment>
+ <comment xml:lang="zh_TW">Windows 圖示</comment>
+ <comment xml:lang="zh_CN">Windows 图标</comment>
<comment xml:lang="uk">піктограма Windows</comment>
- <comment xml:lang="zh-CN">Windows 图标</comment>
- <comment xml:lang="zh-TW">Windows 圖示</comment>
- <magic priority="50">
+ <comment xml:lang="tr">Windows simgesi</comment>
+ <comment xml:lang="sv">Windows-ikon</comment>
+ <comment xml:lang="sr">Иконица Виндоуза</comment>
+ <comment xml:lang="sq">ikonë Windows</comment>
+ <comment xml:lang="sl">Ikona Windows</comment>
+ <comment xml:lang="si">වින්ඩෝස් නිරූපකය</comment>
+ <comment xml:lang="sk">Ikona Windows</comment>
+ <comment xml:lang="ru">Значок Windows</comment>
+ <comment xml:lang="pt_BR">Ícone do Windows</comment>
+ <comment xml:lang="pt">ícone Windows</comment>
+ <comment xml:lang="pl">Ikona Windows</comment>
+ <comment xml:lang="oc">icòna Windows</comment>
+ <comment xml:lang="nl">Windows-pictogram</comment>
+ <comment xml:lang="lt">Windows piktograma</comment>
+ <comment xml:lang="ko">Windows 아이콘</comment>
+ <comment xml:lang="kk">Windows таңбашасы</comment>
+ <comment xml:lang="ka">Windows icon</comment>
+ <comment xml:lang="ja">Windows アイコン</comment>
+ <comment xml:lang="it">Icona Windows</comment>
+ <comment xml:lang="is">Windows táknmynd</comment>
+ <comment xml:lang="id">Ikon Windows</comment>
+ <comment xml:lang="ia">Icone pro Windows</comment>
+ <comment xml:lang="hu">Windows ikon</comment>
+ <comment xml:lang="hr">Windows ikona</comment>
+ <comment xml:lang="he">סמל של Windows</comment>
+ <comment xml:lang="gl">Icona de Windows</comment>
+ <comment xml:lang="ga">deilbhín Windows</comment>
+ <comment xml:lang="fur">icone Windows</comment>
+ <comment xml:lang="fr">icône Windows</comment>
+ <comment xml:lang="fi">Windows-kuvake</comment>
+ <comment xml:lang="eu">Windows ikonoa</comment>
+ <comment xml:lang="es">icono de Windows</comment>
+ <comment xml:lang="en_GB">Windows icon</comment>
+ <comment xml:lang="el">Εικονίδιο Windows</comment>
+ <comment xml:lang="de">Windows-Symbol</comment>
+ <comment xml:lang="da">Windows-ikon</comment>
+ <comment xml:lang="cs">ikona Windows</comment>
+ <comment xml:lang="ca">icona de Windows</comment>
+ <comment xml:lang="bg">Икона — Windows</comment>
+ <comment xml:lang="be">значок Windows</comment>
+ <comment xml:lang="ar">أيقونة ويندوز</comment>
+ <comment xml:lang="af">Windows-ikoon</comment>
+ <magic>
<match type="string" value="\0\0\1\0" offset="0">
<match type="string" value="\0" offset="5"/>
</match>
@@ -29355,119 +30953,125 @@ command to generate the output files.
</mime-type>
<mime-type type="image/x-icns">
<comment>MacOS X icon</comment>
- <comment xml:lang="af">MacOS X-ikoon</comment>
- <comment xml:lang="ar">أيقونة MacOS X</comment>
- <comment xml:lang="be-Latn">Ikona MacOS X</comment>
- <comment xml:lang="bg">Икона — MacOS X</comment>
- <comment xml:lang="ca">icona MacOS X</comment>
- <comment xml:lang="cs">ikona MacOS X</comment>
- <comment xml:lang="da">MacOS X-ikon</comment>
- <comment xml:lang="de">MacOS-X-Symbol</comment>
- <comment xml:lang="el">Εικονίδιο MacOS X</comment>
- <comment xml:lang="en-GB">MacOS X icon</comment>
- <comment xml:lang="eo">MacOS-X-piktogramo</comment>
- <comment xml:lang="es">icono de OS X</comment>
- <comment xml:lang="eu">MacOS X ikonoa</comment>
- <comment xml:lang="fi">MacOS X -kuvake</comment>
- <comment xml:lang="fo">MacOS X ímynd</comment>
- <comment xml:lang="fr">icône MacOS X</comment>
- <comment xml:lang="fur">icone MacOS X</comment>
- <comment xml:lang="ga">deilbhín MacOS X</comment>
- <comment xml:lang="gl">Icona de MacOS X</comment>
- <comment xml:lang="he">סמל בתקן MacOS X</comment>
- <comment xml:lang="hr">MacOS X ikona</comment>
- <comment xml:lang="hu">MacOS X ikon</comment>
- <comment xml:lang="ia">Icone de Mac OS X</comment>
- <comment xml:lang="id">Ikon MacOS X</comment>
- <comment xml:lang="it">Icona MacOS X</comment>
- <comment xml:lang="ja">MacOS X アイコン</comment>
- <comment xml:lang="ka">MacOS X-ის ხატულა</comment>
- <comment xml:lang="kk">MacOS X таңбашасы</comment>
- <comment xml:lang="ko">Mac OS X 아이콘</comment>
- <comment xml:lang="lt">MacOS X piktograma</comment>
- <comment xml:lang="lv">MacOS X ikona</comment>
- <comment xml:lang="nb">MacOS X-ikon</comment>
- <comment xml:lang="nl">MacOS-X-pictogram</comment>
- <comment xml:lang="nn">MacOS X-ikon</comment>
- <comment xml:lang="oc">icòna MacOS X</comment>
- <comment xml:lang="pl">Ikona Mac OS X</comment>
- <comment xml:lang="pt">ćone MacOS X</comment>
- <comment xml:lang="pt-BR">Ícone do MacOS X</comment>
- <comment xml:lang="ro">Iconiță MacOS X</comment>
- <comment xml:lang="ru">Значок MacOS X</comment>
- <comment xml:lang="sk">Ikona MacOS X</comment>
- <comment xml:lang="sl">Datoteka ikone MacOS X</comment>
- <comment xml:lang="sq">Ikonë MacOS X</comment>
- <comment xml:lang="sr">МекОС Икс иконица</comment>
- <comment xml:lang="sv">MacOS X-ikon</comment>
- <comment xml:lang="tr">MacOS X simgesi</comment>
- <comment xml:lang="uk">піктограма MacOS X</comment>
+ <comment xml:lang="zh_TW">MacOS X 圖示</comment>
+ <comment xml:lang="zh_CN">MacOS X 图标</comment>
<comment xml:lang="vi">Biểu tượng MacOS X</comment>
- <comment xml:lang="zh-CN">MacOS X 图标</comment>
- <comment xml:lang="zh-TW">MacOS X 圖示</comment>
+ <comment xml:lang="uk">піктограма MacOS X</comment>
+ <comment xml:lang="tr">MacOS X simgesi</comment>
+ <comment xml:lang="sv">MacOS X-ikon</comment>
+ <comment xml:lang="sr">МекОС Икс иконица</comment>
+ <comment xml:lang="sq">ikonë MacOS X</comment>
+ <comment xml:lang="sl">Datoteka ikone MacOS X</comment>
+ <comment xml:lang="si">MacOS X නිරූපකය</comment>
+ <comment xml:lang="sk">Ikona MacOS X</comment>
+ <comment xml:lang="ru">Значок MacOS X</comment>
+ <comment xml:lang="ro">Iconiță MacOS X</comment>
+ <comment xml:lang="pt_BR">Ícone do MacOS X</comment>
+ <comment xml:lang="pt">ícone MacOS X</comment>
+ <comment xml:lang="pl">Ikona Mac OS X</comment>
+ <comment xml:lang="oc">icòna MacOS X</comment>
+ <comment xml:lang="nn">MacOS X-ikon</comment>
+ <comment xml:lang="nl">MacOS-X-pictogram</comment>
+ <comment xml:lang="nb">MacOS X-ikon</comment>
+ <comment xml:lang="lv">MacOS X ikona</comment>
+ <comment xml:lang="lt">MacOS X piktograma</comment>
+ <comment xml:lang="ko">Mac OS X 아이콘</comment>
+ <comment xml:lang="kk">MacOS X таңбашасы</comment>
+ <comment xml:lang="ka">MacOS X-ის ხატულა</comment>
+ <comment xml:lang="ja">MacOS X アイコン</comment>
+ <comment xml:lang="it">Icona MacOS X</comment>
+ <comment xml:lang="is">MacOS X táknmynd</comment>
+ <comment xml:lang="id">Ikon MacOS X</comment>
+ <comment xml:lang="ia">Icone de Mac OS X</comment>
+ <comment xml:lang="hu">MacOS X ikon</comment>
+ <comment xml:lang="hr">MacOS X ikona</comment>
+ <comment xml:lang="he">סמל בתקן MacOS X</comment>
+ <comment xml:lang="gl">Icona de MacOS X</comment>
+ <comment xml:lang="ga">deilbhín MacOS X</comment>
+ <comment xml:lang="fur">icone MacOS X</comment>
+ <comment xml:lang="fr">icône MacOS X</comment>
+ <comment xml:lang="fo">MacOS X ímynd</comment>
+ <comment xml:lang="fi">MacOS X -kuvake</comment>
+ <comment xml:lang="eu">MacOS X ikonoa</comment>
+ <comment xml:lang="es">icono de OS X</comment>
+ <comment xml:lang="eo">MacOS-X-piktogramo</comment>
+ <comment xml:lang="en_GB">MacOS X icon</comment>
+ <comment xml:lang="el">Εικονίδιο MacOS X</comment>
+ <comment xml:lang="de">MacOS-X-Symbol</comment>
+ <comment xml:lang="da">MacOS X-ikon</comment>
+ <comment xml:lang="cs">ikona MacOS X</comment>
+ <comment xml:lang="ca">icona MacOS X</comment>
+ <comment xml:lang="bg">Икона — MacOS X</comment>
+ <comment xml:lang="be@latin">Ikona MacOS X</comment>
+ <comment xml:lang="be">значок MacOS X</comment>
+ <comment xml:lang="ar">أيقونة MacOS X</comment>
+ <comment xml:lang="af">MacOS X-ikoon</comment>
<glob pattern="*.icns"/>
- <magic priority="50">
+ <magic>
<match type="string" value="icns" offset="0"/>
</magic>
</mime-type>
<mime-type type="image/x-ilbm">
<comment>ILBM image</comment>
- <comment xml:lang="af">ILBM-beeld</comment>
- <comment xml:lang="ar">صورة ILBM</comment>
- <comment xml:lang="az">ILBM rəsmi</comment>
- <comment xml:lang="be-Latn">Vyjava ILBM</comment>
- <comment xml:lang="bg">Изображение — ILBM</comment>
- <comment xml:lang="ca">imatge ILBM</comment>
- <comment xml:lang="cs">obrázek ILMB</comment>
- <comment xml:lang="cy">Delwedd ILBM</comment>
- <comment xml:lang="da">ILBM-billede</comment>
- <comment xml:lang="de">ILBM-Bild</comment>
- <comment xml:lang="el">Εικόνα ILBM</comment>
- <comment xml:lang="en-GB">ILBM image</comment>
- <comment xml:lang="eo">ILBM-bildo</comment>
- <comment xml:lang="es">imagen ILBM</comment>
- <comment xml:lang="eu">ILBM irudia</comment>
- <comment xml:lang="fi">ILBM-kuva</comment>
- <comment xml:lang="fo">ILBM mynd</comment>
- <comment xml:lang="fr">image ILBM</comment>
- <comment xml:lang="fur">imagjin ILBM</comment>
- <comment xml:lang="ga">íomhá ILBM</comment>
- <comment xml:lang="gl">imaxe ILBM</comment>
- <comment xml:lang="he">תמונת ILBM</comment>
- <comment xml:lang="hr">ILBM slika</comment>
- <comment xml:lang="hu">ILBM-kép</comment>
- <comment xml:lang="ia">Imagine ILBM</comment>
- <comment xml:lang="id">Citra ILBM</comment>
- <comment xml:lang="it">Immagine ILBM</comment>
- <comment xml:lang="ja">ILBM 画像</comment>
- <comment xml:lang="kk">ILBM суреті</comment>
- <comment xml:lang="ko">ILBM 그림</comment>
- <comment xml:lang="lt">ILBM paveikslėlis</comment>
- <comment xml:lang="lv">ILBM attēls</comment>
- <comment xml:lang="ms">Imej ILBM</comment>
- <comment xml:lang="nb">ILBM-bilde</comment>
- <comment xml:lang="nl">ILBM-afbeelding</comment>
- <comment xml:lang="nn">ILMB-bilete</comment>
- <comment xml:lang="oc">imatge ILBM</comment>
- <comment xml:lang="pl">Obraz ILBM</comment>
- <comment xml:lang="pt">imagem ILBM</comment>
- <comment xml:lang="pt-BR">Imagem ILBM</comment>
- <comment xml:lang="ro">Imagine ILBM</comment>
- <comment xml:lang="ru">Изображение ILBM</comment>
- <comment xml:lang="sk">Obrázok ILMB</comment>
- <comment xml:lang="sl">Slikovna datoteka ILBM</comment>
- <comment xml:lang="sq">Figurë ILBM</comment>
- <comment xml:lang="sr">ИЛБМ слика</comment>
- <comment xml:lang="sv">ILBM-bild</comment>
- <comment xml:lang="tr">ILBM görüntüsü</comment>
- <comment xml:lang="uk">зображення ILBM</comment>
+ <comment xml:lang="zh_TW">ILBM 影像</comment>
+ <comment xml:lang="zh_CN">ILBM 图像</comment>
<comment xml:lang="vi">Ảnh ILBM</comment>
- <comment xml:lang="zh-CN">ILBM 图像</comment>
- <comment xml:lang="zh-TW">ILBM 影像</comment>
+ <comment xml:lang="uk">зображення ILBM</comment>
+ <comment xml:lang="tr">ILBM görüntüsü</comment>
+ <comment xml:lang="sv">ILBM-bild</comment>
+ <comment xml:lang="sr">ИЛБМ слика</comment>
+ <comment xml:lang="sq">figurë ILBM</comment>
+ <comment xml:lang="sl">Slikovna datoteka ILBM</comment>
+ <comment xml:lang="si">ILBM රූපය</comment>
+ <comment xml:lang="sk">Obrázok ILMB</comment>
+ <comment xml:lang="ru">Изображение ILBM</comment>
+ <comment xml:lang="ro">Imagine ILBM</comment>
+ <comment xml:lang="pt_BR">Imagem ILBM</comment>
+ <comment xml:lang="pt">imagem ILBM</comment>
+ <comment xml:lang="pl">Obraz ILBM</comment>
+ <comment xml:lang="oc">imatge ILBM</comment>
+ <comment xml:lang="nn">ILMB-bilete</comment>
+ <comment xml:lang="nl">ILBM-afbeelding</comment>
+ <comment xml:lang="nb">ILBM-bilde</comment>
+ <comment xml:lang="ms">Imej ILBM</comment>
+ <comment xml:lang="lv">ILBM attēls</comment>
+ <comment xml:lang="lt">ILBM paveikslėlis</comment>
+ <comment xml:lang="ko">ILBM 그림</comment>
+ <comment xml:lang="kk">ILBM суреті</comment>
+ <comment xml:lang="ja">ILBM 画像</comment>
+ <comment xml:lang="it">Immagine ILBM</comment>
+ <comment xml:lang="is">ILBM mynd</comment>
+ <comment xml:lang="id">Citra ILBM</comment>
+ <comment xml:lang="ia">Imagine ILBM</comment>
+ <comment xml:lang="hu">ILBM-kép</comment>
+ <comment xml:lang="hr">ILBM slika</comment>
+ <comment xml:lang="he">תמונת ILBM</comment>
+ <comment xml:lang="gl">imaxe ILBM</comment>
+ <comment xml:lang="ga">íomhá ILBM</comment>
+ <comment xml:lang="fur">imagjin ILBM</comment>
+ <comment xml:lang="fr">image ILBM</comment>
+ <comment xml:lang="fo">ILBM mynd</comment>
+ <comment xml:lang="fi">ILBM-kuva</comment>
+ <comment xml:lang="eu">ILBM irudia</comment>
+ <comment xml:lang="es">imagen ILBM</comment>
+ <comment xml:lang="eo">ILBM-bildo</comment>
+ <comment xml:lang="en_GB">ILBM image</comment>
+ <comment xml:lang="el">Εικόνα ILBM</comment>
+ <comment xml:lang="de">ILBM-Bild</comment>
+ <comment xml:lang="da">ILBM-billede</comment>
+ <comment xml:lang="cy">Delwedd ILBM</comment>
+ <comment xml:lang="cs">obrázek ILMB</comment>
+ <comment xml:lang="ca">imatge ILBM</comment>
+ <comment xml:lang="bg">Изображение — ILBM</comment>
+ <comment xml:lang="be@latin">Vyjava ILBM</comment>
+ <comment xml:lang="be">выява ILBM</comment>
+ <comment xml:lang="az">ILBM rəsmi</comment>
+ <comment xml:lang="ar">صورة ILBM</comment>
+ <comment xml:lang="af">ILBM-beeld</comment>
<acronym>ILBM</acronym>
<expanded-acronym>InterLeaved BitMap</expanded-acronym>
<sub-class-of type="application/x-iff"/>
- <magic priority="50">
+ <magic>
<match value="ILBM" type="string" offset="8"/>
<match value="PBM " type="string" offset="8"/>
</magic>
@@ -29478,388 +31082,411 @@ command to generate the output files.
</mime-type>
<mime-type type="image/x-jng">
<comment>JNG image</comment>
- <comment xml:lang="af">JNG-beeld</comment>
- <comment xml:lang="ar">صورة JNG</comment>
- <comment xml:lang="az">JNG rəsmi</comment>
- <comment xml:lang="be-Latn">Vyjava JNG</comment>
- <comment xml:lang="bg">Изображение — JNG</comment>
- <comment xml:lang="ca">imatge JNG</comment>
- <comment xml:lang="cs">obrázek JNG</comment>
- <comment xml:lang="cy">Delwedd JNG</comment>
- <comment xml:lang="da">JNG-billede</comment>
- <comment xml:lang="de">JNG-Bild</comment>
- <comment xml:lang="el">Εικόνα JNG</comment>
- <comment xml:lang="en-GB">JNG image</comment>
- <comment xml:lang="eo">JNG-bildo</comment>
- <comment xml:lang="es">imagen JNG</comment>
- <comment xml:lang="eu">JNG irudia</comment>
- <comment xml:lang="fi">JNG-kuva</comment>
- <comment xml:lang="fo">JNG mynd</comment>
- <comment xml:lang="fr">image JNG</comment>
- <comment xml:lang="fur">imagjin JNG</comment>
- <comment xml:lang="ga">íomhá JNG</comment>
- <comment xml:lang="gl">imaxe JNG</comment>
- <comment xml:lang="he">תמונת JNG</comment>
- <comment xml:lang="hr">JNG slika</comment>
- <comment xml:lang="hu">JNG-kép</comment>
- <comment xml:lang="ia">Imagine JNG</comment>
- <comment xml:lang="id">Citra JNG</comment>
- <comment xml:lang="it">Immagine JNG</comment>
- <comment xml:lang="ja">JNG 画像</comment>
- <comment xml:lang="kk">JNG суреті</comment>
- <comment xml:lang="ko">JNG 그림</comment>
- <comment xml:lang="lt">JNG paveikslėlis</comment>
- <comment xml:lang="lv">JNG attēls</comment>
- <comment xml:lang="ms">Imej PNG</comment>
- <comment xml:lang="nb">JNG-bilde</comment>
- <comment xml:lang="nl">JNG-afbeelding</comment>
- <comment xml:lang="nn">JNG-bilete</comment>
- <comment xml:lang="oc">imatge JNG</comment>
- <comment xml:lang="pl">Obraz JNG</comment>
- <comment xml:lang="pt">imagem JNG</comment>
- <comment xml:lang="pt-BR">Imagem JNG</comment>
- <comment xml:lang="ro">Imagine JNG</comment>
- <comment xml:lang="ru">Изображение JNG</comment>
- <comment xml:lang="sk">Obrázok JNG</comment>
- <comment xml:lang="sl">Slikovna datoteka JNG</comment>
- <comment xml:lang="sq">Figurë JNG</comment>
- <comment xml:lang="sr">ЈНГ слика</comment>
- <comment xml:lang="sv">JNG-bild</comment>
- <comment xml:lang="tr">JNG görüntüsü</comment>
- <comment xml:lang="uk">зображення JNG</comment>
+ <comment xml:lang="zh_TW">JNG 影像</comment>
+ <comment xml:lang="zh_CN">JNG 图像</comment>
<comment xml:lang="vi">Ảnh JNG</comment>
- <comment xml:lang="zh-CN">JNG 图像</comment>
- <comment xml:lang="zh-TW">JNG 影像</comment>
+ <comment xml:lang="uk">зображення JNG</comment>
+ <comment xml:lang="tr">JNG görüntüsü</comment>
+ <comment xml:lang="sv">JNG-bild</comment>
+ <comment xml:lang="sr">ЈНГ слика</comment>
+ <comment xml:lang="sq">figurë JNG</comment>
+ <comment xml:lang="sl">Slikovna datoteka JNG</comment>
+ <comment xml:lang="si">JNG රූපය</comment>
+ <comment xml:lang="sk">Obrázok JNG</comment>
+ <comment xml:lang="ru">Изображение JNG</comment>
+ <comment xml:lang="ro">Imagine JNG</comment>
+ <comment xml:lang="pt_BR">Imagem JNG</comment>
+ <comment xml:lang="pt">imagem JNG</comment>
+ <comment xml:lang="pl">Obraz JNG</comment>
+ <comment xml:lang="oc">imatge JNG</comment>
+ <comment xml:lang="nn">JNG-bilete</comment>
+ <comment xml:lang="nl">JNG-afbeelding</comment>
+ <comment xml:lang="nb">JNG-bilde</comment>
+ <comment xml:lang="ms">Imej PNG</comment>
+ <comment xml:lang="lv">JNG attēls</comment>
+ <comment xml:lang="lt">JNG paveikslėlis</comment>
+ <comment xml:lang="ko">JNG 그림</comment>
+ <comment xml:lang="kk">JNG суреті</comment>
+ <comment xml:lang="ja">JNG 画像</comment>
+ <comment xml:lang="it">Immagine JNG</comment>
+ <comment xml:lang="is">JNG mynd</comment>
+ <comment xml:lang="id">Citra JNG</comment>
+ <comment xml:lang="ia">Imagine JNG</comment>
+ <comment xml:lang="hu">JNG-kép</comment>
+ <comment xml:lang="hr">JNG slika</comment>
+ <comment xml:lang="he">תמונת JNG</comment>
+ <comment xml:lang="gl">imaxe JNG</comment>
+ <comment xml:lang="ga">íomhá JNG</comment>
+ <comment xml:lang="fur">imagjin JNG</comment>
+ <comment xml:lang="fr">image JNG</comment>
+ <comment xml:lang="fo">JNG mynd</comment>
+ <comment xml:lang="fi">JNG-kuva</comment>
+ <comment xml:lang="eu">JNG irudia</comment>
+ <comment xml:lang="es">imagen JNG</comment>
+ <comment xml:lang="eo">JNG-bildo</comment>
+ <comment xml:lang="en_GB">JNG image</comment>
+ <comment xml:lang="el">Εικόνα JNG</comment>
+ <comment xml:lang="de">JNG-Bild</comment>
+ <comment xml:lang="da">JNG-billede</comment>
+ <comment xml:lang="cy">Delwedd JNG</comment>
+ <comment xml:lang="cs">obrázek JNG</comment>
+ <comment xml:lang="ca">imatge JNG</comment>
+ <comment xml:lang="bg">Изображение — JNG</comment>
+ <comment xml:lang="be@latin">Vyjava JNG</comment>
+ <comment xml:lang="be">выява JNG</comment>
+ <comment xml:lang="az">JNG rəsmi</comment>
+ <comment xml:lang="ar">صورة JNG</comment>
+ <comment xml:lang="af">JNG-beeld</comment>
<acronym>JNG</acronym>
<expanded-acronym>JPEG Network Graphics</expanded-acronym>
<glob pattern="*.jng"/>
</mime-type>
<mime-type type="image/x-lwo">
<comment>LightWave object</comment>
- <comment xml:lang="af">LightWave-objek</comment>
- <comment xml:lang="ar">كائن LightWave</comment>
- <comment xml:lang="az">LightWave cismi</comment>
- <comment xml:lang="be-Latn">Abjekt LightWave</comment>
- <comment xml:lang="bg">Обект — LightWave</comment>
- <comment xml:lang="ca">objecte de LightWave</comment>
- <comment xml:lang="cs">objekt LightWave</comment>
- <comment xml:lang="cy">Gwrthrych LightWave</comment>
- <comment xml:lang="da">LightWave-objekt</comment>
- <comment xml:lang="de">LightWave-Objekt</comment>
- <comment xml:lang="el">Αντικείμενο LightWave</comment>
- <comment xml:lang="en-GB">LightWave object</comment>
- <comment xml:lang="eo">LightWave-objekto</comment>
- <comment xml:lang="es">objeto de LightWave</comment>
- <comment xml:lang="eu">LightWave objektua</comment>
- <comment xml:lang="fi">LightWave-esine</comment>
- <comment xml:lang="fo">LightWave lutur</comment>
- <comment xml:lang="fr">objet LightWave</comment>
- <comment xml:lang="fur">ogjet LightWave</comment>
- <comment xml:lang="ga">réad LightWave</comment>
- <comment xml:lang="gl">obxecto de LightWave</comment>
- <comment xml:lang="he">עצם LightWave</comment>
- <comment xml:lang="hr">LightWave objekt</comment>
- <comment xml:lang="hu">LightWave-objektum</comment>
- <comment xml:lang="ia">Objecto LightWave</comment>
- <comment xml:lang="id">Proyek LightWave</comment>
- <comment xml:lang="it">Oggetto LightWave</comment>
- <comment xml:lang="ja">LightWave オブジェクト</comment>
- <comment xml:lang="kk">LightWave объекті</comment>
- <comment xml:lang="ko">LightWave 개체</comment>
- <comment xml:lang="lt">LightWave objektas</comment>
- <comment xml:lang="lv">LightWave objekts</comment>
- <comment xml:lang="ms">Objek LightWave</comment>
- <comment xml:lang="nb">LightWave-objekt</comment>
- <comment xml:lang="nl">LightWave-object</comment>
- <comment xml:lang="nn">LightWave-objekt</comment>
- <comment xml:lang="oc">objècte LightWave</comment>
- <comment xml:lang="pl">Obiekt LightWave</comment>
- <comment xml:lang="pt">Objecto LightWave</comment>
- <comment xml:lang="pt-BR">Objeto LightWave</comment>
- <comment xml:lang="ro">Obiect LightWave</comment>
- <comment xml:lang="ru">Объект LightWave</comment>
- <comment xml:lang="sk">Objekt LightWave</comment>
- <comment xml:lang="sl">Datoteka predmeta LightWave</comment>
- <comment xml:lang="sq">Objekt LightWave</comment>
- <comment xml:lang="sr">Лајт Вејв објекат</comment>
- <comment xml:lang="sv">LightWave-objekt</comment>
- <comment xml:lang="tr">LightWave nesnesi</comment>
- <comment xml:lang="uk">об'єкт LightWave</comment>
+ <comment xml:lang="zh_TW">LightWave 物件</comment>
+ <comment xml:lang="zh_CN">LightWave 对象</comment>
<comment xml:lang="vi">Đối tượng LightWave</comment>
- <comment xml:lang="zh-CN">LightWave 对象</comment>
- <comment xml:lang="zh-TW">LightWave 物件</comment>
+ <comment xml:lang="uk">об'єкт LightWave</comment>
+ <comment xml:lang="tr">LightWave nesnesi</comment>
+ <comment xml:lang="sv">LightWave-objekt</comment>
+ <comment xml:lang="sr">Лајт Вејв објекат</comment>
+ <comment xml:lang="sq">objekt LightWave</comment>
+ <comment xml:lang="sl">Datoteka predmeta LightWave</comment>
+ <comment xml:lang="si">LightWave වස්තුව</comment>
+ <comment xml:lang="sk">Objekt LightWave</comment>
+ <comment xml:lang="ru">Объект LightWave</comment>
+ <comment xml:lang="ro">Obiect LightWave</comment>
+ <comment xml:lang="pt_BR">Objeto LightWave</comment>
+ <comment xml:lang="pt">Objecto LightWave</comment>
+ <comment xml:lang="pl">Obiekt LightWave</comment>
+ <comment xml:lang="oc">objècte LightWave</comment>
+ <comment xml:lang="nn">LightWave-objekt</comment>
+ <comment xml:lang="nl">LightWave-object</comment>
+ <comment xml:lang="nb">LightWave-objekt</comment>
+ <comment xml:lang="ms">Objek LightWave</comment>
+ <comment xml:lang="lv">LightWave objekts</comment>
+ <comment xml:lang="lt">LightWave objektas</comment>
+ <comment xml:lang="ko">LightWave 개체</comment>
+ <comment xml:lang="kk">LightWave объекті</comment>
+ <comment xml:lang="ja">LightWave オブジェクト</comment>
+ <comment xml:lang="it">Oggetto LightWave</comment>
+ <comment xml:lang="is">LightWave hlutur</comment>
+ <comment xml:lang="id">Proyek LightWave</comment>
+ <comment xml:lang="ia">Objecto LightWave</comment>
+ <comment xml:lang="hu">LightWave-objektum</comment>
+ <comment xml:lang="hr">LightWave objekt</comment>
+ <comment xml:lang="he">עצם LightWave</comment>
+ <comment xml:lang="gl">obxecto de LightWave</comment>
+ <comment xml:lang="ga">réad LightWave</comment>
+ <comment xml:lang="fur">ogjet LightWave</comment>
+ <comment xml:lang="fr">objet LightWave</comment>
+ <comment xml:lang="fo">LightWave lutur</comment>
+ <comment xml:lang="fi">LightWave-esine</comment>
+ <comment xml:lang="eu">LightWave objektua</comment>
+ <comment xml:lang="es">objeto de LightWave</comment>
+ <comment xml:lang="eo">LightWave-objekto</comment>
+ <comment xml:lang="en_GB">LightWave object</comment>
+ <comment xml:lang="el">Αντικείμενο LightWave</comment>
+ <comment xml:lang="de">LightWave-Objekt</comment>
+ <comment xml:lang="da">LightWave-objekt</comment>
+ <comment xml:lang="cy">Gwrthrych LightWave</comment>
+ <comment xml:lang="cs">objekt LightWave</comment>
+ <comment xml:lang="ca">objecte de LightWave</comment>
+ <comment xml:lang="bg">Обект — LightWave</comment>
+ <comment xml:lang="be@latin">Abjekt LightWave</comment>
+ <comment xml:lang="be">аб'ект LightWave</comment>
+ <comment xml:lang="az">LightWave cismi</comment>
+ <comment xml:lang="ar">كائن LightWave</comment>
+ <comment xml:lang="af">LightWave-objek</comment>
<glob pattern="*.lwo"/>
<glob pattern="*.lwob"/>
</mime-type>
<mime-type type="image/x-lws">
<comment>LightWave scene</comment>
- <comment xml:lang="af">LightWave-toneel</comment>
- <comment xml:lang="ar">مشهد LightWave</comment>
- <comment xml:lang="az">LightWave səhnəsi</comment>
- <comment xml:lang="be-Latn">Scena LightWave</comment>
- <comment xml:lang="bg">Сцена — LightWave</comment>
- <comment xml:lang="ca">escena de LightWave</comment>
- <comment xml:lang="cs">scéna LightWave</comment>
- <comment xml:lang="cy">Golygfa LightWave</comment>
- <comment xml:lang="da">LightWave-scene</comment>
- <comment xml:lang="de">LightWave-Szene</comment>
- <comment xml:lang="el">Σκηνή LightWave</comment>
- <comment xml:lang="en-GB">LightWave scene</comment>
- <comment xml:lang="eo">LightWave-sceno</comment>
- <comment xml:lang="es">escena de LightWave</comment>
- <comment xml:lang="eu">LightWave eszena</comment>
- <comment xml:lang="fi">LightWave-maisema</comment>
- <comment xml:lang="fo">LightWave leikmynd</comment>
- <comment xml:lang="fr">scène LightWave</comment>
- <comment xml:lang="fur">sene LightWave</comment>
- <comment xml:lang="ga">radharc LightWave</comment>
- <comment xml:lang="gl">escena de LightWave</comment>
- <comment xml:lang="he">סצנה של LightWave</comment>
- <comment xml:lang="hr">LightWave scena</comment>
- <comment xml:lang="hu">LightWave-jelenet</comment>
- <comment xml:lang="ia">Scena LightWave</comment>
- <comment xml:lang="id">Scene LightWave</comment>
- <comment xml:lang="it">Scena LightWave</comment>
- <comment xml:lang="ja">LightWave シーン</comment>
- <comment xml:lang="kk">LightWave сахнасы</comment>
- <comment xml:lang="ko">LightWave 장면</comment>
- <comment xml:lang="lt">LightWave scena</comment>
- <comment xml:lang="lv">LightWave aina</comment>
- <comment xml:lang="ms">Babak LightWave</comment>
- <comment xml:lang="nb">LightWave-scene</comment>
- <comment xml:lang="nl">LightWave-scène</comment>
- <comment xml:lang="nn">LightWave-scene</comment>
- <comment xml:lang="oc">scèna LightWave</comment>
- <comment xml:lang="pl">Scena Lightwave</comment>
- <comment xml:lang="pt">cenário LightWave</comment>
- <comment xml:lang="pt-BR">Cena LightWave</comment>
- <comment xml:lang="ro">Scenă LightWave</comment>
- <comment xml:lang="ru">Сцена LightWave</comment>
- <comment xml:lang="sk">Scéna LightWave</comment>
- <comment xml:lang="sl">Datoteka scene LightWave</comment>
- <comment xml:lang="sq">Skenë LightWave</comment>
- <comment xml:lang="sr">Лајт Вејв сцена</comment>
- <comment xml:lang="sv">LightWave-scen</comment>
- <comment xml:lang="tr">LightWave sahnesi</comment>
- <comment xml:lang="uk">сцена LightWave</comment>
+ <comment xml:lang="zh_TW">LightWave 場景</comment>
+ <comment xml:lang="zh_CN">LightWave 场景</comment>
<comment xml:lang="vi">Cảnh LightWave</comment>
- <comment xml:lang="zh-CN">LightWave 场景</comment>
- <comment xml:lang="zh-TW">LightWave 場景</comment>
+ <comment xml:lang="uk">сцена LightWave</comment>
+ <comment xml:lang="tr">LightWave sahnesi</comment>
+ <comment xml:lang="sv">LightWave-scen</comment>
+ <comment xml:lang="sr">Лајт Вејв сцена</comment>
+ <comment xml:lang="sq">skenë LightWave</comment>
+ <comment xml:lang="sl">Datoteka scene LightWave</comment>
+ <comment xml:lang="si">LightWave දර්ශනය</comment>
+ <comment xml:lang="sk">Scéna LightWave</comment>
+ <comment xml:lang="ru">Сцена LightWave</comment>
+ <comment xml:lang="ro">Scenă LightWave</comment>
+ <comment xml:lang="pt_BR">Cena LightWave</comment>
+ <comment xml:lang="pt">cenário LightWave</comment>
+ <comment xml:lang="pl">Scena Lightwave</comment>
+ <comment xml:lang="oc">scèna LightWave</comment>
+ <comment xml:lang="nn">LightWave-scene</comment>
+ <comment xml:lang="nl">LightWave-scène</comment>
+ <comment xml:lang="nb">LightWave-scene</comment>
+ <comment xml:lang="ms">Babak LightWave</comment>
+ <comment xml:lang="lv">LightWave aina</comment>
+ <comment xml:lang="lt">LightWave scena</comment>
+ <comment xml:lang="ko">LightWave 장면</comment>
+ <comment xml:lang="kk">LightWave сахнасы</comment>
+ <comment xml:lang="ja">LightWave シーン</comment>
+ <comment xml:lang="it">Scena LightWave</comment>
+ <comment xml:lang="is">LightWave sviðsmynd</comment>
+ <comment xml:lang="id">Scene LightWave</comment>
+ <comment xml:lang="ia">Scena LightWave</comment>
+ <comment xml:lang="hu">LightWave-jelenet</comment>
+ <comment xml:lang="hr">LightWave scena</comment>
+ <comment xml:lang="he">סצנה של LightWave</comment>
+ <comment xml:lang="gl">escena de LightWave</comment>
+ <comment xml:lang="ga">radharc LightWave</comment>
+ <comment xml:lang="fur">sene LightWave</comment>
+ <comment xml:lang="fr">scène LightWave</comment>
+ <comment xml:lang="fo">LightWave leikmynd</comment>
+ <comment xml:lang="fi">LightWave-maisema</comment>
+ <comment xml:lang="eu">LightWave eszena</comment>
+ <comment xml:lang="es">escena de LightWave</comment>
+ <comment xml:lang="eo">LightWave-sceno</comment>
+ <comment xml:lang="en_GB">LightWave scene</comment>
+ <comment xml:lang="el">Σκηνή LightWave</comment>
+ <comment xml:lang="de">LightWave-Szene</comment>
+ <comment xml:lang="da">LightWave-scene</comment>
+ <comment xml:lang="cy">Golygfa LightWave</comment>
+ <comment xml:lang="cs">scéna LightWave</comment>
+ <comment xml:lang="ca">escena de LightWave</comment>
+ <comment xml:lang="bg">Сцена — LightWave</comment>
+ <comment xml:lang="be@latin">Scena LightWave</comment>
+ <comment xml:lang="be">сцэна LightWave</comment>
+ <comment xml:lang="az">LightWave səhnəsi</comment>
+ <comment xml:lang="ar">مشهد LightWave</comment>
+ <comment xml:lang="af">LightWave-toneel</comment>
<glob pattern="*.lws"/>
</mime-type>
<mime-type type="image/x-macpaint">
<comment>MacPaint Bitmap image</comment>
- <comment xml:lang="af">MacPaint-roosterbeeld</comment>
- <comment xml:lang="ar">صورة MacPaint Bitmap</comment>
- <comment xml:lang="be-Latn">Bitmapnaja vyjava MacPaint</comment>
- <comment xml:lang="bg">Изображение — MacPaint Bitmap</comment>
- <comment xml:lang="ca">imatge de mapa de bits MacPaint</comment>
- <comment xml:lang="cs">obrázek MacPaint Bitmap</comment>
- <comment xml:lang="da">MacPaint BitMap-billede</comment>
- <comment xml:lang="de">MacPaint-Bitmap-Datei</comment>
- <comment xml:lang="el">Εικόνα Bitmap MacPaint</comment>
- <comment xml:lang="en-GB">MacPaint Bitmap image</comment>
- <comment xml:lang="es">imagen de mapa de bits de MacPaint</comment>
- <comment xml:lang="eu">MacPaint Bitmap irudia</comment>
- <comment xml:lang="fi">MacPaint-bittikartta</comment>
- <comment xml:lang="fo">MacPaint Bitmap mynd</comment>
- <comment xml:lang="fr">image matricielle MacPaint</comment>
- <comment xml:lang="fur">imagjin bitmap MacPaint</comment>
- <comment xml:lang="ga">íomhá ghiotánmhapach MacPaint</comment>
- <comment xml:lang="gl">imaxe de mapa de bits MacPaint</comment>
- <comment xml:lang="he">תמונת מפת-סיביות של MacPaint</comment>
- <comment xml:lang="hr">MacPaint Bitmap slika</comment>
- <comment xml:lang="hu">MacPaint bitkép</comment>
- <comment xml:lang="ia">Imagine bitmap de MacPaint</comment>
- <comment xml:lang="id">Citra MacPaint Bitmap</comment>
- <comment xml:lang="it">Immagine Bitmap MacPaint</comment>
- <comment xml:lang="ja">MacPaint ビットマップ画像</comment>
- <comment xml:lang="kk">MacPaint растрлық суреті</comment>
- <comment xml:lang="ko">MacPaint 비트맵 그림</comment>
- <comment xml:lang="lt">MacPaint rastrinis paveikslėlis</comment>
- <comment xml:lang="lv">MacPaint bitkartes attēls</comment>
- <comment xml:lang="nb">MacPaint Bitmap-bilde</comment>
- <comment xml:lang="nl">MacPaint-bitmap-afbeelding</comment>
- <comment xml:lang="nn">MacPaint punktbilete</comment>
- <comment xml:lang="oc">imatge matricial MacPaint</comment>
- <comment xml:lang="pl">Obraz bitmapowy MacPaint</comment>
- <comment xml:lang="pt">imagem MacPaint Bitmap</comment>
- <comment xml:lang="pt-BR">Imagem de bitmap do MacPaint</comment>
- <comment xml:lang="ro">Imagine MacPaint Bitmap</comment>
- <comment xml:lang="ru">Растровое изображение MacPaint</comment>
- <comment xml:lang="sk">Obrázok MacPaint Bitmap</comment>
- <comment xml:lang="sl">Slikovna bitna datoteka MacPaint</comment>
- <comment xml:lang="sq">Figurë BitMap MacPaint</comment>
- <comment xml:lang="sr">Мек Пеинт битмап слика</comment>
- <comment xml:lang="sv">MacPaint Bitmap-bild</comment>
- <comment xml:lang="tr">MacPaint bit eşlem görüntüsü</comment>
- <comment xml:lang="uk">растрове зображення MacPaint</comment>
+ <comment xml:lang="zh_TW">MacPaint 點陣影像</comment>
+ <comment xml:lang="zh_CN">MacPaint 位图</comment>
<comment xml:lang="vi">Ảnh mảng MacPaint</comment>
- <comment xml:lang="zh-CN">MacPaint 位图</comment>
- <comment xml:lang="zh-TW">MacPaint 點陣影像</comment>
+ <comment xml:lang="uk">растрове зображення MacPaint</comment>
+ <comment xml:lang="tr">MacPaint bit eşlem görüntüsü</comment>
+ <comment xml:lang="sv">MacPaint Bitmap-bild</comment>
+ <comment xml:lang="sr">Мек Пеинт битмап слика</comment>
+ <comment xml:lang="sq">figurë BitMap MacPaint</comment>
+ <comment xml:lang="sl">Slikovna bitna datoteka MacPaint</comment>
+ <comment xml:lang="si">MacPaint Bitmap රූපය</comment>
+ <comment xml:lang="sk">Obrázok MacPaint Bitmap</comment>
+ <comment xml:lang="ru">Растровое изображение MacPaint</comment>
+ <comment xml:lang="ro">Imagine MacPaint Bitmap</comment>
+ <comment xml:lang="pt_BR">Imagem de bitmap do MacPaint</comment>
+ <comment xml:lang="pt">imagem MacPaint Bitmap</comment>
+ <comment xml:lang="pl">Obraz bitmapowy MacPaint</comment>
+ <comment xml:lang="oc">imatge matricial MacPaint</comment>
+ <comment xml:lang="nn">MacPaint punktbilete</comment>
+ <comment xml:lang="nl">MacPaint-bitmap-afbeelding</comment>
+ <comment xml:lang="nb">MacPaint Bitmap-bilde</comment>
+ <comment xml:lang="lv">MacPaint bitkartes attēls</comment>
+ <comment xml:lang="lt">MacPaint rastrinis paveikslėlis</comment>
+ <comment xml:lang="ko">MacPaint 비트맵 그림</comment>
+ <comment xml:lang="kk">MacPaint растрлық суреті</comment>
+ <comment xml:lang="ja">MacPaint ビットマップ画像</comment>
+ <comment xml:lang="it">Immagine Bitmap MacPaint</comment>
+ <comment xml:lang="is">MacPaint bitamynd</comment>
+ <comment xml:lang="id">Citra MacPaint Bitmap</comment>
+ <comment xml:lang="ia">Imagine bitmap de MacPaint</comment>
+ <comment xml:lang="hu">MacPaint bitkép</comment>
+ <comment xml:lang="hr">MacPaint Bitmap slika</comment>
+ <comment xml:lang="he">תמונת מפת-סיביות של MacPaint</comment>
+ <comment xml:lang="gl">imaxe de mapa de bits MacPaint</comment>
+ <comment xml:lang="ga">íomhá ghiotánmhapach MacPaint</comment>
+ <comment xml:lang="fur">imagjin bitmap MacPaint</comment>
+ <comment xml:lang="fr">image matricielle MacPaint</comment>
+ <comment xml:lang="fo">MacPaint Bitmap mynd</comment>
+ <comment xml:lang="fi">MacPaint-bittikartta</comment>
+ <comment xml:lang="eu">MacPaint Bitmap irudia</comment>
+ <comment xml:lang="es">imagen de mapa de bits de MacPaint</comment>
+ <comment xml:lang="en_GB">MacPaint Bitmap image</comment>
+ <comment xml:lang="el">Εικόνα Bitmap MacPaint</comment>
+ <comment xml:lang="de">MacPaint-Bitmap-Datei</comment>
+ <comment xml:lang="da">MacPaint BitMap-billede</comment>
+ <comment xml:lang="cs">obrázek MacPaint Bitmap</comment>
+ <comment xml:lang="ca">imatge de mapa de bits MacPaint</comment>
+ <comment xml:lang="bg">Изображение — MacPaint Bitmap</comment>
+ <comment xml:lang="be@latin">Bitmapnaja vyjava MacPaint</comment>
+ <comment xml:lang="be">растравая выява MacPaint</comment>
+ <comment xml:lang="ar">صورة MacPaint Bitmap</comment>
+ <comment xml:lang="af">MacPaint-roosterbeeld</comment>
<glob pattern="*.pntg"/>
</mime-type>
<mime-type type="image/x-msod">
<comment>Office drawing</comment>
- <comment xml:lang="af">Office-tekening</comment>
- <comment xml:lang="ar">تصميم أوفيس</comment>
- <comment xml:lang="be-Latn">Ofisny rysunak</comment>
- <comment xml:lang="bg">Чертеж — Office</comment>
- <comment xml:lang="ca">dibuix d'Office</comment>
- <comment xml:lang="cs">kresba Office</comment>
- <comment xml:lang="da">Officetegning</comment>
- <comment xml:lang="de">Office-Zeichnung</comment>
- <comment xml:lang="el">Σχέδιο Office</comment>
- <comment xml:lang="en-GB">Office drawing</comment>
- <comment xml:lang="es">dibujo de Office</comment>
- <comment xml:lang="eu">Office marrazkia</comment>
- <comment xml:lang="fi">Office-piirros</comment>
- <comment xml:lang="fo">Office tekning</comment>
- <comment xml:lang="fr">dessin Office</comment>
- <comment xml:lang="fur">dissen di Office</comment>
- <comment xml:lang="ga">líníocht Office</comment>
- <comment xml:lang="gl">debuxo de Office</comment>
- <comment xml:lang="he">ציור של Office</comment>
- <comment xml:lang="hr">Office crtež</comment>
- <comment xml:lang="hu">Office rajz</comment>
- <comment xml:lang="ia">Designo Office</comment>
- <comment xml:lang="id">Gambar Office</comment>
- <comment xml:lang="it">Disegno Office</comment>
- <comment xml:lang="ja">Office ドロー</comment>
- <comment xml:lang="kk">Office суреті</comment>
- <comment xml:lang="ko">오피스 그리기</comment>
- <comment xml:lang="lt">Office piešinys</comment>
- <comment xml:lang="lv">Office zīmējums</comment>
- <comment xml:lang="nb">Office-tegning</comment>
- <comment xml:lang="nl">Office-tekening</comment>
- <comment xml:lang="nn">Office-teikning</comment>
- <comment xml:lang="oc">dessenh Office</comment>
- <comment xml:lang="pl">Rysunek Office</comment>
- <comment xml:lang="pt">desenho Office</comment>
- <comment xml:lang="pt-BR">Desenho do Office</comment>
- <comment xml:lang="ro">Desen Office</comment>
- <comment xml:lang="ru">Рисунок Office</comment>
- <comment xml:lang="sk">Kresba Office</comment>
- <comment xml:lang="sl">Datoteka risbe Office</comment>
- <comment xml:lang="sq">Vizatim Office</comment>
- <comment xml:lang="sr">Канцеларијски цртеж</comment>
- <comment xml:lang="sv">Office-teckning</comment>
- <comment xml:lang="tr">Ofis çizimi</comment>
- <comment xml:lang="uk">малюнок Office</comment>
+ <comment xml:lang="zh_TW">Office 繪圖</comment>
+ <comment xml:lang="zh_CN">Office 绘图</comment>
<comment xml:lang="vi">Bản vẽ Office</comment>
- <comment xml:lang="zh-CN">Office 绘图</comment>
- <comment xml:lang="zh-TW">Office 繪圖</comment>
+ <comment xml:lang="uk">малюнок Office</comment>
+ <comment xml:lang="tr">Ofis çizimi</comment>
+ <comment xml:lang="sv">Office-teckning</comment>
+ <comment xml:lang="sr">Канцеларијски цртеж</comment>
+ <comment xml:lang="sq">vizatim Office</comment>
+ <comment xml:lang="sl">Datoteka risbe Office</comment>
+ <comment xml:lang="si">කාර්යාල ඇඳීම</comment>
+ <comment xml:lang="sk">Kresba Office</comment>
+ <comment xml:lang="ru">Рисунок Office</comment>
+ <comment xml:lang="ro">Desen Office</comment>
+ <comment xml:lang="pt_BR">Desenho do Office</comment>
+ <comment xml:lang="pt">desenho Office</comment>
+ <comment xml:lang="pl">Rysunek Office</comment>
+ <comment xml:lang="oc">dessenh Office</comment>
+ <comment xml:lang="nn">Office-teikning</comment>
+ <comment xml:lang="nl">Office-tekening</comment>
+ <comment xml:lang="nb">Office-tegning</comment>
+ <comment xml:lang="lv">Office zīmējums</comment>
+ <comment xml:lang="lt">Office piešinys</comment>
+ <comment xml:lang="ko">오피스 그리기</comment>
+ <comment xml:lang="kk">Office суреті</comment>
+ <comment xml:lang="ja">Office ドロー</comment>
+ <comment xml:lang="it">Disegno Office</comment>
+ <comment xml:lang="is">Office teikning</comment>
+ <comment xml:lang="id">Gambar Office</comment>
+ <comment xml:lang="ia">Designo Office</comment>
+ <comment xml:lang="hu">Office rajz</comment>
+ <comment xml:lang="hr">Office crtež</comment>
+ <comment xml:lang="he">ציור של Office</comment>
+ <comment xml:lang="gl">debuxo de Office</comment>
+ <comment xml:lang="ga">líníocht Office</comment>
+ <comment xml:lang="fur">dissen di Office</comment>
+ <comment xml:lang="fr">dessin Office</comment>
+ <comment xml:lang="fo">Office tekning</comment>
+ <comment xml:lang="fi">Office-piirros</comment>
+ <comment xml:lang="eu">Office marrazkia</comment>
+ <comment xml:lang="es">dibujo de Office</comment>
+ <comment xml:lang="en_GB">Office drawing</comment>
+ <comment xml:lang="el">Σχέδιο Office</comment>
+ <comment xml:lang="de">Office-Zeichnung</comment>
+ <comment xml:lang="da">Officetegning</comment>
+ <comment xml:lang="cs">kresba Office</comment>
+ <comment xml:lang="ca">dibuix d'Office</comment>
+ <comment xml:lang="bg">Чертеж — Office</comment>
+ <comment xml:lang="be@latin">Ofisny rysunak</comment>
+ <comment xml:lang="be">рысунак Office</comment>
+ <comment xml:lang="ar">تصميم أوفيس</comment>
+ <comment xml:lang="af">Office-tekening</comment>
<glob pattern="*.msod"/>
</mime-type>
<mime-type type="image/x-niff">
<comment>NIFF image</comment>
- <comment xml:lang="af">NIFF-beeld</comment>
- <comment xml:lang="ar">صورة NIFF</comment>
- <comment xml:lang="be-Latn">Vyjava NIFF</comment>
- <comment xml:lang="bg">Изображение — NIFF</comment>
- <comment xml:lang="ca">imatge NIFF</comment>
- <comment xml:lang="cs">obrázek NIFF</comment>
- <comment xml:lang="da">NIFF-billede</comment>
- <comment xml:lang="de">NIFF-Bild</comment>
- <comment xml:lang="el">Εικόνα NIFF</comment>
- <comment xml:lang="en-GB">NIFF image</comment>
- <comment xml:lang="eo">NIFF-bildo</comment>
- <comment xml:lang="es">imagen NIFF</comment>
- <comment xml:lang="eu">NIFF irudia</comment>
- <comment xml:lang="fi">NIFF-kuva</comment>
- <comment xml:lang="fo">NIFF mynd</comment>
- <comment xml:lang="fr">image NIFF</comment>
- <comment xml:lang="fur">imagjin NIFF</comment>
- <comment xml:lang="ga">íomhá NIFF</comment>
- <comment xml:lang="gl">imaxe NIFF</comment>
- <comment xml:lang="he">תמונת NIFF</comment>
- <comment xml:lang="hr">NIFF slika</comment>
- <comment xml:lang="hu">NIFF kép</comment>
- <comment xml:lang="ia">Imagine NIFF</comment>
- <comment xml:lang="id">Citra NIFF</comment>
- <comment xml:lang="it">Immagine NIFF</comment>
- <comment xml:lang="ja">NIFF 画像</comment>
- <comment xml:lang="kk">NIFF суреті</comment>
- <comment xml:lang="ko">NIFF 그림</comment>
- <comment xml:lang="lt">NIFF paveikslėlis</comment>
- <comment xml:lang="lv">NIFF attēls</comment>
- <comment xml:lang="nb">NIFF-bilde</comment>
- <comment xml:lang="nl">NIFF-afbeelding</comment>
- <comment xml:lang="nn">NIFF-bilete</comment>
- <comment xml:lang="oc">imatge NIFF</comment>
- <comment xml:lang="pl">Obraz NIFF</comment>
- <comment xml:lang="pt">imagem NIFF</comment>
- <comment xml:lang="pt-BR">Imagem NIFF</comment>
- <comment xml:lang="ro">Imagine NIF</comment>
- <comment xml:lang="ru">Изображение NIFF</comment>
- <comment xml:lang="sk">Obrázok NIFF</comment>
- <comment xml:lang="sl">Slikovna datoteka NIFF</comment>
- <comment xml:lang="sq">Figurë NIFF</comment>
- <comment xml:lang="sr">НИФФ слика</comment>
- <comment xml:lang="sv">NIFF-bild</comment>
- <comment xml:lang="tr">NIFF görüntüsü</comment>
- <comment xml:lang="uk">зображення NIFF</comment>
+ <comment xml:lang="zh_TW">NIFF 影像</comment>
+ <comment xml:lang="zh_CN">NIFF 图像</comment>
<comment xml:lang="vi">Ảnh NIFF</comment>
- <comment xml:lang="zh-CN">NIFF 图像</comment>
- <comment xml:lang="zh-TW">NIFF 影像</comment>
+ <comment xml:lang="uk">зображення NIFF</comment>
+ <comment xml:lang="tr">NIFF görüntüsü</comment>
+ <comment xml:lang="sv">NIFF-bild</comment>
+ <comment xml:lang="sr">НИФФ слика</comment>
+ <comment xml:lang="sq">figurë NIFF</comment>
+ <comment xml:lang="sl">Slikovna datoteka NIFF</comment>
+ <comment xml:lang="si">NIFF රූපය</comment>
+ <comment xml:lang="sk">Obrázok NIFF</comment>
+ <comment xml:lang="ru">Изображение NIFF</comment>
+ <comment xml:lang="ro">Imagine NIF</comment>
+ <comment xml:lang="pt_BR">Imagem NIFF</comment>
+ <comment xml:lang="pt">imagem NIFF</comment>
+ <comment xml:lang="pl">Obraz NIFF</comment>
+ <comment xml:lang="oc">imatge NIFF</comment>
+ <comment xml:lang="nn">NIFF-bilete</comment>
+ <comment xml:lang="nl">NIFF-afbeelding</comment>
+ <comment xml:lang="nb">NIFF-bilde</comment>
+ <comment xml:lang="lv">NIFF attēls</comment>
+ <comment xml:lang="lt">NIFF paveikslėlis</comment>
+ <comment xml:lang="ko">NIFF 그림</comment>
+ <comment xml:lang="kk">NIFF суреті</comment>
+ <comment xml:lang="ja">NIFF 画像</comment>
+ <comment xml:lang="it">Immagine NIFF</comment>
+ <comment xml:lang="is">NIFF mynd</comment>
+ <comment xml:lang="id">Citra NIFF</comment>
+ <comment xml:lang="ia">Imagine NIFF</comment>
+ <comment xml:lang="hu">NIFF kép</comment>
+ <comment xml:lang="hr">NIFF slika</comment>
+ <comment xml:lang="he">תמונת NIFF</comment>
+ <comment xml:lang="gl">imaxe NIFF</comment>
+ <comment xml:lang="ga">íomhá NIFF</comment>
+ <comment xml:lang="fur">imagjin NIFF</comment>
+ <comment xml:lang="fr">image NIFF</comment>
+ <comment xml:lang="fo">NIFF mynd</comment>
+ <comment xml:lang="fi">NIFF-kuva</comment>
+ <comment xml:lang="eu">NIFF irudia</comment>
+ <comment xml:lang="es">imagen NIFF</comment>
+ <comment xml:lang="eo">NIFF-bildo</comment>
+ <comment xml:lang="en_GB">NIFF image</comment>
+ <comment xml:lang="el">Εικόνα NIFF</comment>
+ <comment xml:lang="de">NIFF-Bild</comment>
+ <comment xml:lang="da">NIFF-billede</comment>
+ <comment xml:lang="cs">obrázek NIFF</comment>
+ <comment xml:lang="ca">imatge NIFF</comment>
+ <comment xml:lang="bg">Изображение — NIFF</comment>
+ <comment xml:lang="be@latin">Vyjava NIFF</comment>
+ <comment xml:lang="be">выява NIFF</comment>
+ <comment xml:lang="ar">صورة NIFF</comment>
+ <comment xml:lang="af">NIFF-beeld</comment>
+ <acronym>NIFF</acronym>
+ <expanded-acronym>Navy Image File Format</expanded-acronym>
<magic priority="80">
<match type="string" value="IIN1" offset="0"/>
</magic>
</mime-type>
<mime-type type="image/vnd.zbrush.pcx">
<comment>PCX image</comment>
- <comment xml:lang="af">PCX-beeld</comment>
- <comment xml:lang="ar">صورة PCX</comment>
- <comment xml:lang="be-Latn">Vyjava PCX</comment>
- <comment xml:lang="bg">Изображение — PCX</comment>
- <comment xml:lang="ca">imatge PCX</comment>
- <comment xml:lang="cs">obrázek PCX</comment>
- <comment xml:lang="da">PCX-billede</comment>
- <comment xml:lang="de">PCX-Bild</comment>
- <comment xml:lang="el">Εικόνα PCX</comment>
- <comment xml:lang="en-GB">PCX image</comment>
- <comment xml:lang="eo">PCX-bildo</comment>
- <comment xml:lang="es">imagen PCX</comment>
- <comment xml:lang="eu">PCX irudia</comment>
- <comment xml:lang="fi">PCX-kuva</comment>
- <comment xml:lang="fo">PCX mynd</comment>
- <comment xml:lang="fr">image PCX</comment>
- <comment xml:lang="fur">imagjin PCX</comment>
- <comment xml:lang="ga">íomhá PCX</comment>
- <comment xml:lang="gl">imaxe PCX</comment>
- <comment xml:lang="he">תמונת PCX</comment>
- <comment xml:lang="hr">PCX slika</comment>
- <comment xml:lang="hu">PCX kép</comment>
- <comment xml:lang="ia">Imagine PCX</comment>
- <comment xml:lang="id">Citra PCX</comment>
- <comment xml:lang="it">Immagine PCX</comment>
- <comment xml:lang="ja">PCX 画像</comment>
- <comment xml:lang="kk">PCX суреті</comment>
- <comment xml:lang="ko">PCX 그림</comment>
- <comment xml:lang="lt">PCX paveikslėlis</comment>
- <comment xml:lang="lv">PCX attēls</comment>
- <comment xml:lang="nb">PCX-bilde</comment>
- <comment xml:lang="nl">PCX-afbeelding</comment>
- <comment xml:lang="nn">PCX-bilete</comment>
- <comment xml:lang="oc">imatge PCX</comment>
- <comment xml:lang="pl">Obraz PCX</comment>
- <comment xml:lang="pt">imagem PCX</comment>
- <comment xml:lang="pt-BR">Imagem PCX</comment>
- <comment xml:lang="ro">Imagine PCX</comment>
- <comment xml:lang="ru">Изображение PCX</comment>
- <comment xml:lang="sk">Obrázok PCX</comment>
- <comment xml:lang="sl">Slikovna datoteka PCX</comment>
- <comment xml:lang="sq">Figurë PCX</comment>
- <comment xml:lang="sr">ПЦИкс слика</comment>
- <comment xml:lang="sv">PCX-bild</comment>
- <comment xml:lang="tr">PCX görüntüsü</comment>
- <comment xml:lang="uk">зображення PCX</comment>
+ <comment xml:lang="zh_TW">PCX 影像</comment>
+ <comment xml:lang="zh_CN">PCX 图像</comment>
<comment xml:lang="vi">Ảnh PCX</comment>
- <comment xml:lang="zh-CN">PCX 图像</comment>
- <comment xml:lang="zh-TW">PCX 影像</comment>
+ <comment xml:lang="uk">зображення PCX</comment>
+ <comment xml:lang="tr">PCX görüntüsü</comment>
+ <comment xml:lang="sv">PCX-bild</comment>
+ <comment xml:lang="sr">ПЦИкс слика</comment>
+ <comment xml:lang="sq">figurë PCX</comment>
+ <comment xml:lang="sl">Slikovna datoteka PCX</comment>
+ <comment xml:lang="si">PCX රූපය</comment>
+ <comment xml:lang="sk">Obrázok PCX</comment>
+ <comment xml:lang="ru">Изображение PCX</comment>
+ <comment xml:lang="ro">Imagine PCX</comment>
+ <comment xml:lang="pt_BR">Imagem PCX</comment>
+ <comment xml:lang="pt">imagem PCX</comment>
+ <comment xml:lang="pl">Obraz PCX</comment>
+ <comment xml:lang="oc">imatge PCX</comment>
+ <comment xml:lang="nn">PCX-bilete</comment>
+ <comment xml:lang="nl">PCX-afbeelding</comment>
+ <comment xml:lang="nb">PCX-bilde</comment>
+ <comment xml:lang="lv">PCX attēls</comment>
+ <comment xml:lang="lt">PCX paveikslėlis</comment>
+ <comment xml:lang="ko">PCX 그림</comment>
+ <comment xml:lang="kk">PCX суреті</comment>
+ <comment xml:lang="ja">PCX 画像</comment>
+ <comment xml:lang="it">Immagine PCX</comment>
+ <comment xml:lang="is">PCX mynd</comment>
+ <comment xml:lang="id">Citra PCX</comment>
+ <comment xml:lang="ia">Imagine PCX</comment>
+ <comment xml:lang="hu">PCX kép</comment>
+ <comment xml:lang="hr">PCX slika</comment>
+ <comment xml:lang="he">תמונת PCX</comment>
+ <comment xml:lang="gl">imaxe PCX</comment>
+ <comment xml:lang="ga">íomhá PCX</comment>
+ <comment xml:lang="fur">imagjin PCX</comment>
+ <comment xml:lang="fr">image PCX</comment>
+ <comment xml:lang="fo">PCX mynd</comment>
+ <comment xml:lang="fi">PCX-kuva</comment>
+ <comment xml:lang="eu">PCX irudia</comment>
+ <comment xml:lang="es">imagen PCX</comment>
+ <comment xml:lang="eo">PCX-bildo</comment>
+ <comment xml:lang="en_GB">PCX image</comment>
+ <comment xml:lang="el">Εικόνα PCX</comment>
+ <comment xml:lang="de">PCX-Bild</comment>
+ <comment xml:lang="da">PCX-billede</comment>
+ <comment xml:lang="cs">obrázek PCX</comment>
+ <comment xml:lang="ca">imatge PCX</comment>
+ <comment xml:lang="bg">Изображение — PCX</comment>
+ <comment xml:lang="be@latin">Vyjava PCX</comment>
+ <comment xml:lang="be">выява PCX</comment>
+ <comment xml:lang="ar">صورة PCX</comment>
+ <comment xml:lang="af">PCX-beeld</comment>
<acronym>PCX</acronym>
<expanded-acronym>PiCture eXchange</expanded-acronym>
- <magic priority="50">
+ <magic>
<match type="byte" value="10" offset="0">
<match type="byte" value="0" offset="1"/>
<match type="byte" value="2" offset="1"/>
@@ -29872,173 +31499,186 @@ command to generate the output files.
</mime-type>
<mime-type type="image/x-photo-cd">
<comment>PCD image</comment>
- <comment xml:lang="af">PCD-beeld</comment>
- <comment xml:lang="ar">صورة PCD</comment>
- <comment xml:lang="be-Latn">Vyjava PCD</comment>
- <comment xml:lang="bg">Изображение — PCD</comment>
- <comment xml:lang="ca">imatge PCD</comment>
- <comment xml:lang="cs">obrázek PCD</comment>
- <comment xml:lang="da">PCD-billede</comment>
- <comment xml:lang="de">PCD-Bild</comment>
- <comment xml:lang="el">Εικόνα PCD</comment>
- <comment xml:lang="en-GB">PCD image</comment>
- <comment xml:lang="eo">PCD-bildo</comment>
- <comment xml:lang="es">imagen PCD</comment>
- <comment xml:lang="eu">PCD irudia</comment>
- <comment xml:lang="fi">PCD-kuva</comment>
- <comment xml:lang="fo">PCD mynd</comment>
- <comment xml:lang="fr">image PCD</comment>
- <comment xml:lang="fur">imagjin PCD</comment>
- <comment xml:lang="ga">íomhá PCD</comment>
- <comment xml:lang="gl">imaxe PCD</comment>
- <comment xml:lang="he">תמונת PCD</comment>
- <comment xml:lang="hr">PCD slika</comment>
- <comment xml:lang="hu">PCD kép</comment>
- <comment xml:lang="ia">Imagine PCD</comment>
- <comment xml:lang="id">Citra PCD</comment>
- <comment xml:lang="it">Immagine PCD</comment>
- <comment xml:lang="ja">PCD 画像</comment>
- <comment xml:lang="ka">PCD გამოსახულება</comment>
- <comment xml:lang="kk">PCD суреті</comment>
- <comment xml:lang="ko">PCD 그림</comment>
- <comment xml:lang="lt">PCD paveikslėlis</comment>
- <comment xml:lang="lv">PCD attēls</comment>
- <comment xml:lang="nb">PCD-bilde</comment>
- <comment xml:lang="nl">PCD-afbeelding</comment>
- <comment xml:lang="nn">PCD-bilete</comment>
- <comment xml:lang="oc">imatge PCD</comment>
- <comment xml:lang="pl">Obraz PCD</comment>
- <comment xml:lang="pt">imagem PCD</comment>
- <comment xml:lang="pt-BR">Imagem PCD</comment>
- <comment xml:lang="ro">Imagine PCD</comment>
- <comment xml:lang="ru">Изображение PCD</comment>
- <comment xml:lang="sk">Obrázok PCD</comment>
- <comment xml:lang="sl">Slikovna datoteka PCD</comment>
- <comment xml:lang="sq">Figurë PCD</comment>
- <comment xml:lang="sr">ПЦД слика</comment>
- <comment xml:lang="sv">PCD-bild</comment>
- <comment xml:lang="tr">PCD görüntüsü</comment>
- <comment xml:lang="uk">зображення PCD</comment>
+ <comment xml:lang="zh_TW">PCD 影像</comment>
+ <comment xml:lang="zh_CN">PCD 图像</comment>
<comment xml:lang="vi">Ảnh PCD</comment>
- <comment xml:lang="zh-CN">PCD 图像</comment>
- <comment xml:lang="zh-TW">PCD 影像</comment>
+ <comment xml:lang="uk">зображення PCD</comment>
+ <comment xml:lang="tr">PCD görüntüsü</comment>
+ <comment xml:lang="sv">PCD-bild</comment>
+ <comment xml:lang="sr">ПЦД слика</comment>
+ <comment xml:lang="sq">figurë PCD</comment>
+ <comment xml:lang="sl">Slikovna datoteka PCD</comment>
+ <comment xml:lang="si">PCD රූපය</comment>
+ <comment xml:lang="sk">Obrázok PCD</comment>
+ <comment xml:lang="ru">Изображение PCD</comment>
+ <comment xml:lang="ro">Imagine PCD</comment>
+ <comment xml:lang="pt_BR">Imagem PCD</comment>
+ <comment xml:lang="pt">imagem PCD</comment>
+ <comment xml:lang="pl">Obraz PCD</comment>
+ <comment xml:lang="oc">imatge PCD</comment>
+ <comment xml:lang="nn">PCD-bilete</comment>
+ <comment xml:lang="nl">PCD-afbeelding</comment>
+ <comment xml:lang="nb">PCD-bilde</comment>
+ <comment xml:lang="lv">PCD attēls</comment>
+ <comment xml:lang="lt">PCD paveikslėlis</comment>
+ <comment xml:lang="ko">PCD 그림</comment>
+ <comment xml:lang="kk">PCD суреті</comment>
+ <comment xml:lang="ka">PCD გამოსახულება</comment>
+ <comment xml:lang="ja">PCD 画像</comment>
+ <comment xml:lang="it">Immagine PCD</comment>
+ <comment xml:lang="is">PCD mynd</comment>
+ <comment xml:lang="id">Citra PCD</comment>
+ <comment xml:lang="ia">Imagine PCD</comment>
+ <comment xml:lang="hu">PCD kép</comment>
+ <comment xml:lang="hr">PCD slika</comment>
+ <comment xml:lang="he">תמונת PCD</comment>
+ <comment xml:lang="gl">imaxe PCD</comment>
+ <comment xml:lang="ga">íomhá PCD</comment>
+ <comment xml:lang="fur">imagjin PCD</comment>
+ <comment xml:lang="fr">image PCD</comment>
+ <comment xml:lang="fo">PCD mynd</comment>
+ <comment xml:lang="fi">PCD-kuva</comment>
+ <comment xml:lang="eu">PCD irudia</comment>
+ <comment xml:lang="es">imagen PCD</comment>
+ <comment xml:lang="eo">PCD-bildo</comment>
+ <comment xml:lang="en_GB">PCD image</comment>
+ <comment xml:lang="el">Εικόνα PCD</comment>
+ <comment xml:lang="de">PCD-Bild</comment>
+ <comment xml:lang="da">PCD-billede</comment>
+ <comment xml:lang="cs">obrázek PCD</comment>
+ <comment xml:lang="ca">imatge PCD</comment>
+ <comment xml:lang="bg">Изображение — PCD</comment>
+ <comment xml:lang="be@latin">Vyjava PCD</comment>
+ <comment xml:lang="be">выява PCD</comment>
+ <comment xml:lang="ar">صورة PCD</comment>
+ <comment xml:lang="af">PCD-beeld</comment>
<acronym>PCD</acronym>
<expanded-acronym>PhotoCD</expanded-acronym>
+ <generic-icon name="media-optical"/>
<glob pattern="*.pcd"/>
</mime-type>
<mime-type type="image/x-portable-anymap">
<comment>PNM image</comment>
- <comment xml:lang="af">PNM-beeld</comment>
- <comment xml:lang="ar">صورة PNM</comment>
- <comment xml:lang="az">PNM rəsmi</comment>
- <comment xml:lang="be-Latn">Vyjava PNM</comment>
- <comment xml:lang="bg">Изображение — PNM</comment>
- <comment xml:lang="ca">imatge PNM</comment>
- <comment xml:lang="cs">obrázek PNM</comment>
- <comment xml:lang="cy">Delwedd PNM</comment>
- <comment xml:lang="da">PNM-billede</comment>
- <comment xml:lang="de">PNM-Bild</comment>
- <comment xml:lang="el">Εικόνα PNM</comment>
- <comment xml:lang="en-GB">PNM image</comment>
- <comment xml:lang="eo">PNM-bildo</comment>
- <comment xml:lang="es">imagen PNM</comment>
- <comment xml:lang="eu">PNM irudia</comment>
- <comment xml:lang="fi">PNM-kuva</comment>
- <comment xml:lang="fo">PNM mynd</comment>
- <comment xml:lang="fr">image PNM</comment>
- <comment xml:lang="fur">imagjin PNM</comment>
- <comment xml:lang="ga">íomhá PNM</comment>
- <comment xml:lang="gl">imaxe PNM</comment>
- <comment xml:lang="he">תמונת PNM</comment>
- <comment xml:lang="hr">PNM slika</comment>
- <comment xml:lang="hu">PNM-kép</comment>
- <comment xml:lang="ia">Imagine PNM</comment>
- <comment xml:lang="id">Citra PNM</comment>
- <comment xml:lang="it">Immagine PNM</comment>
- <comment xml:lang="ja">PNM 画像</comment>
- <comment xml:lang="kk">PNM суреті</comment>
- <comment xml:lang="ko">PNM 그림</comment>
- <comment xml:lang="lt">PNM paveikslėlis</comment>
- <comment xml:lang="lv">PNM attēls</comment>
- <comment xml:lang="ms">Imej PNM</comment>
- <comment xml:lang="nb">PNM-bilde</comment>
- <comment xml:lang="nl">PNM-afbeelding</comment>
- <comment xml:lang="nn">PNM-bilete</comment>
- <comment xml:lang="oc">imatge PNM</comment>
- <comment xml:lang="pl">Obraz PNM</comment>
- <comment xml:lang="pt">imagem PNM</comment>
- <comment xml:lang="pt-BR">Imagem PNM</comment>
- <comment xml:lang="ro">Imagine PNM</comment>
- <comment xml:lang="ru">Изображение PNM</comment>
- <comment xml:lang="sk">Obrázok PNM</comment>
- <comment xml:lang="sl">Slikovna datoteka PNM</comment>
- <comment xml:lang="sq">Figurë PNM</comment>
- <comment xml:lang="sr">ПНМ слика</comment>
- <comment xml:lang="sv">PNM-bild</comment>
- <comment xml:lang="tr">PNM görüntüsü</comment>
- <comment xml:lang="uk">зображення PNM</comment>
+ <comment xml:lang="zh_TW">PNM 影像</comment>
+ <comment xml:lang="zh_CN">PNM 图像</comment>
<comment xml:lang="vi">Ảnh PNM</comment>
- <comment xml:lang="zh-CN">PNM 图像</comment>
- <comment xml:lang="zh-TW">PNM 影像</comment>
+ <comment xml:lang="uk">зображення PNM</comment>
+ <comment xml:lang="tr">PNM görüntüsü</comment>
+ <comment xml:lang="sv">PNM-bild</comment>
+ <comment xml:lang="sr">ПНМ слика</comment>
+ <comment xml:lang="sq">figurë PNM</comment>
+ <comment xml:lang="sl">Slikovna datoteka PNM</comment>
+ <comment xml:lang="si">PNM රූපය</comment>
+ <comment xml:lang="sk">Obrázok PNM</comment>
+ <comment xml:lang="ru">Изображение PNM</comment>
+ <comment xml:lang="ro">Imagine PNM</comment>
+ <comment xml:lang="pt_BR">Imagem PNM</comment>
+ <comment xml:lang="pt">imagem PNM</comment>
+ <comment xml:lang="pl">Obraz PNM</comment>
+ <comment xml:lang="oc">imatge PNM</comment>
+ <comment xml:lang="nn">PNM-bilete</comment>
+ <comment xml:lang="nl">PNM-afbeelding</comment>
+ <comment xml:lang="nb">PNM-bilde</comment>
+ <comment xml:lang="ms">Imej PNM</comment>
+ <comment xml:lang="lv">PNM attēls</comment>
+ <comment xml:lang="lt">PNM paveikslėlis</comment>
+ <comment xml:lang="ko">PNM 그림</comment>
+ <comment xml:lang="kk">PNM суреті</comment>
+ <comment xml:lang="ka">PNM გამოსახულება</comment>
+ <comment xml:lang="ja">PNM 画像</comment>
+ <comment xml:lang="it">Immagine PNM</comment>
+ <comment xml:lang="is">PNM mynd</comment>
+ <comment xml:lang="id">Citra PNM</comment>
+ <comment xml:lang="ia">Imagine PNM</comment>
+ <comment xml:lang="hu">PNM-kép</comment>
+ <comment xml:lang="hr">PNM slika</comment>
+ <comment xml:lang="he">תמונת PNM</comment>
+ <comment xml:lang="gl">imaxe PNM</comment>
+ <comment xml:lang="ga">íomhá PNM</comment>
+ <comment xml:lang="fur">imagjin PNM</comment>
+ <comment xml:lang="fr">image PNM</comment>
+ <comment xml:lang="fo">PNM mynd</comment>
+ <comment xml:lang="fi">PNM-kuva</comment>
+ <comment xml:lang="eu">PNM irudia</comment>
+ <comment xml:lang="es">imagen PNM</comment>
+ <comment xml:lang="eo">PNM-bildo</comment>
+ <comment xml:lang="en_GB">PNM image</comment>
+ <comment xml:lang="el">Εικόνα PNM</comment>
+ <comment xml:lang="de">PNM-Bild</comment>
+ <comment xml:lang="da">PNM-billede</comment>
+ <comment xml:lang="cy">Delwedd PNM</comment>
+ <comment xml:lang="cs">obrázek PNM</comment>
+ <comment xml:lang="ca">imatge PNM</comment>
+ <comment xml:lang="bg">Изображение — PNM</comment>
+ <comment xml:lang="be@latin">Vyjava PNM</comment>
+ <comment xml:lang="be">выява PNM</comment>
+ <comment xml:lang="az">PNM rəsmi</comment>
+ <comment xml:lang="ar">صورة PNM</comment>
+ <comment xml:lang="af">PNM-beeld</comment>
+ <acronym>PNM</acronym>
+ <expanded-acronym>Portable Anymap</expanded-acronym>
<glob pattern="*.pnm"/>
</mime-type>
<mime-type type="image/x-portable-bitmap">
<comment>PBM image</comment>
- <comment xml:lang="af">PBM-beeld</comment>
- <comment xml:lang="ar">صورة PBM</comment>
- <comment xml:lang="be-Latn">Vyjava PBM</comment>
- <comment xml:lang="bg">Изображение — PBM</comment>
- <comment xml:lang="ca">imatge PBM</comment>
- <comment xml:lang="cs">obrázek PBM</comment>
- <comment xml:lang="cy">Delwedd PBM</comment>
- <comment xml:lang="da">PBM-billede</comment>
- <comment xml:lang="de">PBM-Bild</comment>
- <comment xml:lang="el">Εικόνα PBM</comment>
- <comment xml:lang="en-GB">PBM image</comment>
- <comment xml:lang="eo">PBM-bildo</comment>
- <comment xml:lang="es">imagen PBM</comment>
- <comment xml:lang="eu">PBM irudia</comment>
- <comment xml:lang="fi">PBM-kuva</comment>
- <comment xml:lang="fo">PBM mynd</comment>
- <comment xml:lang="fr">image PBM</comment>
- <comment xml:lang="fur">imagjin PBM</comment>
- <comment xml:lang="ga">íomhá PBM</comment>
- <comment xml:lang="gl">imaxe PBM</comment>
- <comment xml:lang="he">תמונת PBM</comment>
- <comment xml:lang="hr">PBM slika</comment>
- <comment xml:lang="hu">PBM kép</comment>
- <comment xml:lang="ia">Imagine PBM</comment>
- <comment xml:lang="id">Citra PBM</comment>
- <comment xml:lang="it">Immagine PBM</comment>
- <comment xml:lang="ja">PBM 画像</comment>
- <comment xml:lang="ka">PBM გამოსახულება</comment>
- <comment xml:lang="kk">PBM суреті</comment>
- <comment xml:lang="ko">PBM 그림</comment>
- <comment xml:lang="lt">PBM paveikslėlis</comment>
- <comment xml:lang="lv">PBM attēls</comment>
- <comment xml:lang="nb">PBM-bilde</comment>
- <comment xml:lang="nl">PBM-afbeelding</comment>
- <comment xml:lang="nn">PBM-bilete</comment>
- <comment xml:lang="oc">imatge PBM</comment>
- <comment xml:lang="pl">Obraz PBM</comment>
- <comment xml:lang="pt">imagem PBM</comment>
- <comment xml:lang="pt-BR">Imagem PBM</comment>
- <comment xml:lang="ro">Imagine PBM</comment>
- <comment xml:lang="ru">Изображение PBM</comment>
- <comment xml:lang="sk">Obrázok PBM</comment>
- <comment xml:lang="sl">Slikovna datoteka PBM</comment>
- <comment xml:lang="sq">Figurë PBM</comment>
- <comment xml:lang="sr">ПБМ слика</comment>
- <comment xml:lang="sv">PBM-bild</comment>
- <comment xml:lang="tr">PBM görüntüsü</comment>
- <comment xml:lang="uk">зображення PBM</comment>
+ <comment xml:lang="zh_TW">PBM 影像</comment>
+ <comment xml:lang="zh_CN">PBM 图像</comment>
<comment xml:lang="vi">Ảnh PBM</comment>
- <comment xml:lang="zh-CN">PBM 图像</comment>
- <comment xml:lang="zh-TW">PBM 影像</comment>
+ <comment xml:lang="uk">зображення PBM</comment>
+ <comment xml:lang="tr">PBM görüntüsü</comment>
+ <comment xml:lang="sv">PBM-bild</comment>
+ <comment xml:lang="sr">ПБМ слика</comment>
+ <comment xml:lang="sq">figurë PBM</comment>
+ <comment xml:lang="sl">Slikovna datoteka PBM</comment>
+ <comment xml:lang="si">PBM රූපය</comment>
+ <comment xml:lang="sk">Obrázok PBM</comment>
+ <comment xml:lang="ru">Изображение PBM</comment>
+ <comment xml:lang="ro">Imagine PBM</comment>
+ <comment xml:lang="pt_BR">Imagem PBM</comment>
+ <comment xml:lang="pt">imagem PBM</comment>
+ <comment xml:lang="pl">Obraz PBM</comment>
+ <comment xml:lang="oc">imatge PBM</comment>
+ <comment xml:lang="nn">PBM-bilete</comment>
+ <comment xml:lang="nl">PBM-afbeelding</comment>
+ <comment xml:lang="nb">PBM-bilde</comment>
+ <comment xml:lang="lv">PBM attēls</comment>
+ <comment xml:lang="lt">PBM paveikslėlis</comment>
+ <comment xml:lang="ko">PBM 그림</comment>
+ <comment xml:lang="kk">PBM суреті</comment>
+ <comment xml:lang="ka">PBM გამოსახულება</comment>
+ <comment xml:lang="ja">PBM 画像</comment>
+ <comment xml:lang="it">Immagine PBM</comment>
+ <comment xml:lang="is">PBM mynd</comment>
+ <comment xml:lang="id">Citra PBM</comment>
+ <comment xml:lang="ia">Imagine PBM</comment>
+ <comment xml:lang="hu">PBM kép</comment>
+ <comment xml:lang="hr">PBM slika</comment>
+ <comment xml:lang="he">תמונת PBM</comment>
+ <comment xml:lang="gl">imaxe PBM</comment>
+ <comment xml:lang="ga">íomhá PBM</comment>
+ <comment xml:lang="fur">imagjin PBM</comment>
+ <comment xml:lang="fr">image PBM</comment>
+ <comment xml:lang="fo">PBM mynd</comment>
+ <comment xml:lang="fi">PBM-kuva</comment>
+ <comment xml:lang="eu">PBM irudia</comment>
+ <comment xml:lang="es">imagen PBM</comment>
+ <comment xml:lang="eo">PBM-bildo</comment>
+ <comment xml:lang="en_GB">PBM image</comment>
+ <comment xml:lang="el">Εικόνα PBM</comment>
+ <comment xml:lang="de">PBM-Bild</comment>
+ <comment xml:lang="da">PBM-billede</comment>
+ <comment xml:lang="cy">Delwedd PBM</comment>
+ <comment xml:lang="cs">obrázek PBM</comment>
+ <comment xml:lang="ca">imatge PBM</comment>
+ <comment xml:lang="bg">Изображение — PBM</comment>
+ <comment xml:lang="be@latin">Vyjava PBM</comment>
+ <comment xml:lang="be">выява PBM</comment>
+ <comment xml:lang="ar">صورة PBM</comment>
+ <comment xml:lang="af">PBM-beeld</comment>
<acronym>PBM</acronym>
<expanded-acronym>Portable BitMap</expanded-acronym>
<sub-class-of type="image/x-portable-anymap"/>
- <magic priority="50">
+ <magic>
<match type="string" value="P1" offset="0">
<match type="byte" value="0x0a" offset="2"/>
<match type="byte" value="0x20" offset="2"/>
@@ -30056,60 +31696,64 @@ command to generate the output files.
</mime-type>
<mime-type type="image/x-portable-graymap">
<comment>PGM image</comment>
- <comment xml:lang="af">PGM-beeld</comment>
- <comment xml:lang="ar">صورة PGM</comment>
- <comment xml:lang="be-Latn">Vyjava PGM</comment>
- <comment xml:lang="bg">Изображение — PGM</comment>
- <comment xml:lang="ca">imatge PGM</comment>
- <comment xml:lang="cs">obrázek PGM</comment>
- <comment xml:lang="cy">Delwedd PGM</comment>
- <comment xml:lang="da">PGM-billede</comment>
- <comment xml:lang="de">PGM-Bild</comment>
- <comment xml:lang="el">Εικόνα PGM</comment>
- <comment xml:lang="en-GB">PGM image</comment>
- <comment xml:lang="eo">PGM-bildo</comment>
- <comment xml:lang="es">imagen PGM</comment>
- <comment xml:lang="eu">PGM irudia</comment>
- <comment xml:lang="fi">PGM-kuva</comment>
- <comment xml:lang="fo">PGM mynd</comment>
- <comment xml:lang="fr">image PGM</comment>
- <comment xml:lang="fur">imagjin PGM</comment>
- <comment xml:lang="ga">íomhá PGM</comment>
- <comment xml:lang="gl">imaxe PGM</comment>
- <comment xml:lang="he">תמונת PGM</comment>
- <comment xml:lang="hr">PGM slika</comment>
- <comment xml:lang="hu">PGM kép</comment>
- <comment xml:lang="ia">Imagine PGM</comment>
- <comment xml:lang="id">Citra PGM</comment>
- <comment xml:lang="it">Immagine PGM</comment>
- <comment xml:lang="ja">PGM 画像</comment>
- <comment xml:lang="kk">PGM суреті</comment>
- <comment xml:lang="ko">PGM 그림</comment>
- <comment xml:lang="lt">PGM paveikslėlis</comment>
- <comment xml:lang="lv">PGM attēls</comment>
- <comment xml:lang="nb">PGM-bilde</comment>
- <comment xml:lang="nl">PGM-afbeelding</comment>
- <comment xml:lang="nn">PGM-bilete</comment>
- <comment xml:lang="oc">imatge PGM</comment>
- <comment xml:lang="pl">Obraz PGM</comment>
- <comment xml:lang="pt">imagem PGM</comment>
- <comment xml:lang="pt-BR">Imagem PGM</comment>
- <comment xml:lang="ro">Imagine PGM</comment>
- <comment xml:lang="ru">Изображение PGM</comment>
- <comment xml:lang="sk">Obrázok PGM</comment>
- <comment xml:lang="sl">Slikovna datoteka PGM</comment>
- <comment xml:lang="sq">Figurë PGM</comment>
- <comment xml:lang="sr">ПГМ слика</comment>
- <comment xml:lang="sv">PGM-bild</comment>
- <comment xml:lang="tr">PGM görüntüsü</comment>
- <comment xml:lang="uk">зображення PGM</comment>
+ <comment xml:lang="zh_TW">PGM 影像</comment>
+ <comment xml:lang="zh_CN">PGM 图像</comment>
<comment xml:lang="vi">Ảnh PGM</comment>
- <comment xml:lang="zh-CN">PGM 图像</comment>
- <comment xml:lang="zh-TW">PGM 影像</comment>
+ <comment xml:lang="uk">зображення PGM</comment>
+ <comment xml:lang="tr">PGM görüntüsü</comment>
+ <comment xml:lang="sv">PGM-bild</comment>
+ <comment xml:lang="sr">ПГМ слика</comment>
+ <comment xml:lang="sq">figurë PGM</comment>
+ <comment xml:lang="sl">Slikovna datoteka PGM</comment>
+ <comment xml:lang="si">PGM රූපය</comment>
+ <comment xml:lang="sk">Obrázok PGM</comment>
+ <comment xml:lang="ru">Изображение PGM</comment>
+ <comment xml:lang="ro">Imagine PGM</comment>
+ <comment xml:lang="pt_BR">Imagem PGM</comment>
+ <comment xml:lang="pt">imagem PGM</comment>
+ <comment xml:lang="pl">Obraz PGM</comment>
+ <comment xml:lang="oc">imatge PGM</comment>
+ <comment xml:lang="nn">PGM-bilete</comment>
+ <comment xml:lang="nl">PGM-afbeelding</comment>
+ <comment xml:lang="nb">PGM-bilde</comment>
+ <comment xml:lang="lv">PGM attēls</comment>
+ <comment xml:lang="lt">PGM paveikslėlis</comment>
+ <comment xml:lang="ko">PGM 그림</comment>
+ <comment xml:lang="kk">PGM суреті</comment>
+ <comment xml:lang="ka">PGM გამოსახულება</comment>
+ <comment xml:lang="ja">PGM 画像</comment>
+ <comment xml:lang="it">Immagine PGM</comment>
+ <comment xml:lang="is">PGM mynd</comment>
+ <comment xml:lang="id">Citra PGM</comment>
+ <comment xml:lang="ia">Imagine PGM</comment>
+ <comment xml:lang="hu">PGM kép</comment>
+ <comment xml:lang="hr">PGM slika</comment>
+ <comment xml:lang="he">תמונת PGM</comment>
+ <comment xml:lang="gl">imaxe PGM</comment>
+ <comment xml:lang="ga">íomhá PGM</comment>
+ <comment xml:lang="fur">imagjin PGM</comment>
+ <comment xml:lang="fr">image PGM</comment>
+ <comment xml:lang="fo">PGM mynd</comment>
+ <comment xml:lang="fi">PGM-kuva</comment>
+ <comment xml:lang="eu">PGM irudia</comment>
+ <comment xml:lang="es">imagen PGM</comment>
+ <comment xml:lang="eo">PGM-bildo</comment>
+ <comment xml:lang="en_GB">PGM image</comment>
+ <comment xml:lang="el">Εικόνα PGM</comment>
+ <comment xml:lang="de">PGM-Bild</comment>
+ <comment xml:lang="da">PGM-billede</comment>
+ <comment xml:lang="cy">Delwedd PGM</comment>
+ <comment xml:lang="cs">obrázek PGM</comment>
+ <comment xml:lang="ca">imatge PGM</comment>
+ <comment xml:lang="bg">Изображение — PGM</comment>
+ <comment xml:lang="be@latin">Vyjava PGM</comment>
+ <comment xml:lang="be">выява PGM</comment>
+ <comment xml:lang="ar">صورة PGM</comment>
+ <comment xml:lang="af">PGM-beeld</comment>
<acronym>PGM</acronym>
<expanded-acronym>Portable GrayMap</expanded-acronym>
<sub-class-of type="image/x-portable-anymap"/>
- <magic priority="50">
+ <magic>
<match type="string" value="P2" offset="0">
<match type="byte" value="0x0a" offset="2"/>
<match type="byte" value="0x20" offset="2"/>
@@ -30127,60 +31771,64 @@ command to generate the output files.
</mime-type>
<mime-type type="image/x-portable-pixmap">
<comment>PPM image</comment>
- <comment xml:lang="af">PPM-beeld</comment>
- <comment xml:lang="ar">صورة PPM</comment>
- <comment xml:lang="be-Latn">Vyjava PPM</comment>
- <comment xml:lang="bg">Изображение — PPM</comment>
- <comment xml:lang="ca">imatge PPM</comment>
- <comment xml:lang="cs">obrázek PPM</comment>
- <comment xml:lang="cy">Delwedd PPM</comment>
- <comment xml:lang="da">PPM-billede</comment>
- <comment xml:lang="de">PPM-Bild</comment>
- <comment xml:lang="el">Εικόνα PPM</comment>
- <comment xml:lang="en-GB">PPM image</comment>
- <comment xml:lang="eo">PPM-bildo</comment>
- <comment xml:lang="es">imagen PPM</comment>
- <comment xml:lang="eu">PPM irudia</comment>
- <comment xml:lang="fi">PPM-kuva</comment>
- <comment xml:lang="fo">PPM mynd</comment>
- <comment xml:lang="fr">image PPM</comment>
- <comment xml:lang="fur">imagjin PPM</comment>
- <comment xml:lang="ga">íomhá PPM</comment>
- <comment xml:lang="gl">imaxe PPM</comment>
- <comment xml:lang="he">תמונת PPM</comment>
- <comment xml:lang="hr">PPM slika</comment>
- <comment xml:lang="hu">PPM kép</comment>
- <comment xml:lang="ia">Imagine PPM</comment>
- <comment xml:lang="id">Citra PPM</comment>
- <comment xml:lang="it">Immagine PPM</comment>
- <comment xml:lang="ja">PPM 画像</comment>
- <comment xml:lang="kk">PPM суреті</comment>
- <comment xml:lang="ko">PPM 그림</comment>
- <comment xml:lang="lt">PPM paveikslėlis</comment>
- <comment xml:lang="lv">PPM attēls</comment>
- <comment xml:lang="nb">PPM-bilde</comment>
- <comment xml:lang="nl">PPM-afbeelding</comment>
- <comment xml:lang="nn">PPM-bilete</comment>
- <comment xml:lang="oc">imatge PPM</comment>
- <comment xml:lang="pl">Obraz PPM</comment>
- <comment xml:lang="pt">imagem PPM</comment>
- <comment xml:lang="pt-BR">Imagem PPM</comment>
- <comment xml:lang="ro">Imagine PPM</comment>
- <comment xml:lang="ru">Изображение PPM</comment>
- <comment xml:lang="sk">Obrázok PPM</comment>
- <comment xml:lang="sl">Slikovna datoteka PPM</comment>
- <comment xml:lang="sq">Figurë PPM</comment>
- <comment xml:lang="sr">ППМ слика</comment>
- <comment xml:lang="sv">PPM-bild</comment>
- <comment xml:lang="tr">PPM görüntüsü</comment>
- <comment xml:lang="uk">зображення PPM</comment>
+ <comment xml:lang="zh_TW">PPM 影像</comment>
+ <comment xml:lang="zh_CN">PPM 图像</comment>
<comment xml:lang="vi">Ảnh PPM</comment>
- <comment xml:lang="zh-CN">PPM 图像</comment>
- <comment xml:lang="zh-TW">PPM 影像</comment>
+ <comment xml:lang="uk">зображення PPM</comment>
+ <comment xml:lang="tr">PPM görüntüsü</comment>
+ <comment xml:lang="sv">PPM-bild</comment>
+ <comment xml:lang="sr">ППМ слика</comment>
+ <comment xml:lang="sq">figurë PPM</comment>
+ <comment xml:lang="sl">Slikovna datoteka PPM</comment>
+ <comment xml:lang="si">PPM රූපය</comment>
+ <comment xml:lang="sk">Obrázok PPM</comment>
+ <comment xml:lang="ru">Изображение PPM</comment>
+ <comment xml:lang="ro">Imagine PPM</comment>
+ <comment xml:lang="pt_BR">Imagem PPM</comment>
+ <comment xml:lang="pt">imagem PPM</comment>
+ <comment xml:lang="pl">Obraz PPM</comment>
+ <comment xml:lang="oc">imatge PPM</comment>
+ <comment xml:lang="nn">PPM-bilete</comment>
+ <comment xml:lang="nl">PPM-afbeelding</comment>
+ <comment xml:lang="nb">PPM-bilde</comment>
+ <comment xml:lang="lv">PPM attēls</comment>
+ <comment xml:lang="lt">PPM paveikslėlis</comment>
+ <comment xml:lang="ko">PPM 그림</comment>
+ <comment xml:lang="kk">PPM суреті</comment>
+ <comment xml:lang="ka">PPM გამოსახულება</comment>
+ <comment xml:lang="ja">PPM 画像</comment>
+ <comment xml:lang="it">Immagine PPM</comment>
+ <comment xml:lang="is">PPM mynd</comment>
+ <comment xml:lang="id">Citra PPM</comment>
+ <comment xml:lang="ia">Imagine PPM</comment>
+ <comment xml:lang="hu">PPM kép</comment>
+ <comment xml:lang="hr">PPM slika</comment>
+ <comment xml:lang="he">תמונת PPM</comment>
+ <comment xml:lang="gl">imaxe PPM</comment>
+ <comment xml:lang="ga">íomhá PPM</comment>
+ <comment xml:lang="fur">imagjin PPM</comment>
+ <comment xml:lang="fr">image PPM</comment>
+ <comment xml:lang="fo">PPM mynd</comment>
+ <comment xml:lang="fi">PPM-kuva</comment>
+ <comment xml:lang="eu">PPM irudia</comment>
+ <comment xml:lang="es">imagen PPM</comment>
+ <comment xml:lang="eo">PPM-bildo</comment>
+ <comment xml:lang="en_GB">PPM image</comment>
+ <comment xml:lang="el">Εικόνα PPM</comment>
+ <comment xml:lang="de">PPM-Bild</comment>
+ <comment xml:lang="da">PPM-billede</comment>
+ <comment xml:lang="cy">Delwedd PPM</comment>
+ <comment xml:lang="cs">obrázek PPM</comment>
+ <comment xml:lang="ca">imatge PPM</comment>
+ <comment xml:lang="bg">Изображение — PPM</comment>
+ <comment xml:lang="be@latin">Vyjava PPM</comment>
+ <comment xml:lang="be">выява PPM</comment>
+ <comment xml:lang="ar">صورة PPM</comment>
+ <comment xml:lang="af">PPM-beeld</comment>
<acronym>PPM</acronym>
<expanded-acronym>Portable PixMap</expanded-acronym>
<sub-class-of type="image/x-portable-anymap"/>
- <magic priority="50">
+ <magic>
<match type="string" value="P3" offset="0">
<match type="byte" value="0x0a" offset="2"/>
<match type="byte" value="0x20" offset="2"/>
@@ -30198,53 +31846,57 @@ command to generate the output files.
</mime-type>
<mime-type type="image/vnd.adobe.photoshop">
<comment>Photoshop image</comment>
- <comment xml:lang="af">Photoshop-beeld</comment>
- <comment xml:lang="ar">صورة فوتوشوب</comment>
- <comment xml:lang="bg">Изображение — Photoshop</comment>
- <comment xml:lang="ca">imatge de Photoshop</comment>
- <comment xml:lang="cs">obrázek Photoshop</comment>
- <comment xml:lang="da">Photoshop-billede</comment>
- <comment xml:lang="de">Photoshop-Bild</comment>
- <comment xml:lang="el">Εικόνα Photoshop</comment>
- <comment xml:lang="en-GB">Photoshop image</comment>
- <comment xml:lang="eo">Photoshop-bildo</comment>
- <comment xml:lang="es">imagen de Photoshop</comment>
- <comment xml:lang="eu">Photoshop irudia</comment>
- <comment xml:lang="fi">Photoshop-kuva</comment>
- <comment xml:lang="fo">Photoshop mynd</comment>
- <comment xml:lang="fr">image Photoshop</comment>
- <comment xml:lang="fur">imagjin Photoshop</comment>
- <comment xml:lang="ga">íomhá Photoshop</comment>
- <comment xml:lang="gl">imaxe de Photoshop</comment>
- <comment xml:lang="he">תמונת Photoshop</comment>
- <comment xml:lang="hr">Photoshop slika</comment>
- <comment xml:lang="hu">Photoshop-kép</comment>
- <comment xml:lang="ia">Imagine Photoshop</comment>
- <comment xml:lang="id">Citra Photoshop</comment>
- <comment xml:lang="it">Immagine Photoshop</comment>
- <comment xml:lang="ja">Photoshop 画像</comment>
- <comment xml:lang="kk">изображение Photoshop</comment>
- <comment xml:lang="ko">포토샵 이미지</comment>
- <comment xml:lang="lt">Photoshop paveikslėlis</comment>
- <comment xml:lang="lv">Photoshop attēls</comment>
- <comment xml:lang="ms">Imej Photoshop</comment>
- <comment xml:lang="nl">Photoshop-afbeelding</comment>
- <comment xml:lang="oc">imatge Photoshop</comment>
- <comment xml:lang="pl">Obraz Photoshop</comment>
- <comment xml:lang="pt">imagem Photoshop</comment>
- <comment xml:lang="pt-BR">Imagem do Photoshop</comment>
- <comment xml:lang="ro">Imagine Photoshop</comment>
- <comment xml:lang="ru">Изображение Photoshop</comment>
- <comment xml:lang="sk">Obrázok Photoshop</comment>
- <comment xml:lang="sl">Slikovna datoteka Photoshop</comment>
- <comment xml:lang="sr">Фотошоп слика</comment>
- <comment xml:lang="sv">Photoshop-bild</comment>
- <comment xml:lang="tr">Photoshop görüntüsü</comment>
- <comment xml:lang="uk">зображення Photoshop</comment>
+ <comment xml:lang="zh_TW">Photoshop 影像</comment>
+ <comment xml:lang="zh_CN">Photoshop 图像</comment>
<comment xml:lang="vi">Ảnh Photoshop</comment>
- <comment xml:lang="zh-CN">Photoshop 图像</comment>
- <comment xml:lang="zh-TW">Photoshop 影像</comment>
- <magic priority="50">
+ <comment xml:lang="uk">зображення Photoshop</comment>
+ <comment xml:lang="tr">Photoshop görüntüsü</comment>
+ <comment xml:lang="sv">Photoshop-bild</comment>
+ <comment xml:lang="sr">Фотошоп слика</comment>
+ <comment xml:lang="sq">figurë Photoshop</comment>
+ <comment xml:lang="sl">Slikovna datoteka Photoshop</comment>
+ <comment xml:lang="si">Photoshop රූපය</comment>
+ <comment xml:lang="sk">Obrázok Photoshop</comment>
+ <comment xml:lang="ru">Изображение Photoshop</comment>
+ <comment xml:lang="ro">Imagine Photoshop</comment>
+ <comment xml:lang="pt_BR">Imagem do Photoshop</comment>
+ <comment xml:lang="pt">imagem Photoshop</comment>
+ <comment xml:lang="pl">Obraz Photoshop</comment>
+ <comment xml:lang="oc">imatge Photoshop</comment>
+ <comment xml:lang="nl">Photoshop-afbeelding</comment>
+ <comment xml:lang="ms">Imej Photoshop</comment>
+ <comment xml:lang="lv">Photoshop attēls</comment>
+ <comment xml:lang="lt">Photoshop paveikslėlis</comment>
+ <comment xml:lang="ko">포토샵 이미지</comment>
+ <comment xml:lang="kk">изображение Photoshop</comment>
+ <comment xml:lang="ja">Photoshop 画像</comment>
+ <comment xml:lang="it">Immagine Photoshop</comment>
+ <comment xml:lang="is">Photoshop mynd</comment>
+ <comment xml:lang="id">Citra Photoshop</comment>
+ <comment xml:lang="ia">Imagine Photoshop</comment>
+ <comment xml:lang="hu">Photoshop-kép</comment>
+ <comment xml:lang="hr">Photoshop slika</comment>
+ <comment xml:lang="he">תמונת Photoshop</comment>
+ <comment xml:lang="gl">imaxe de Photoshop</comment>
+ <comment xml:lang="ga">íomhá Photoshop</comment>
+ <comment xml:lang="fur">imagjin Photoshop</comment>
+ <comment xml:lang="fr">image Photoshop</comment>
+ <comment xml:lang="fo">Photoshop mynd</comment>
+ <comment xml:lang="fi">Photoshop-kuva</comment>
+ <comment xml:lang="eu">Photoshop irudia</comment>
+ <comment xml:lang="es">imagen de Photoshop</comment>
+ <comment xml:lang="eo">Photoshop-bildo</comment>
+ <comment xml:lang="en_GB">Photoshop image</comment>
+ <comment xml:lang="el">Εικόνα Photoshop</comment>
+ <comment xml:lang="de">Photoshop-Bild</comment>
+ <comment xml:lang="da">Photoshop-billede</comment>
+ <comment xml:lang="cs">obrázek Photoshop</comment>
+ <comment xml:lang="ca">imatge de Photoshop</comment>
+ <comment xml:lang="bg">Изображение — Photoshop</comment>
+ <comment xml:lang="be">выява Photoshop</comment>
+ <comment xml:lang="ar">صورة فوتوشوب</comment>
+ <comment xml:lang="af">Photoshop-beeld</comment>
+ <magic>
<match type="string" mask="0xffffffff0000ffffffff" value="8BPS \000\000\000\000" offset="0"/>
</magic>
<glob pattern="*.psd"/>
@@ -30257,219 +31909,231 @@ command to generate the output files.
</mime-type>
<mime-type type="image/x-rgb">
<comment>RGB image</comment>
- <comment xml:lang="af">RGB-beeld</comment>
- <comment xml:lang="ar">صورة RGB</comment>
- <comment xml:lang="az">RGB rəsmi</comment>
- <comment xml:lang="be-Latn">Vyjava RGB</comment>
- <comment xml:lang="bg">Изображение — RGB</comment>
- <comment xml:lang="ca">imatge RGB</comment>
- <comment xml:lang="cs">obrázek RGB</comment>
- <comment xml:lang="cy">Delwedd RGB</comment>
- <comment xml:lang="da">RGB-billede</comment>
- <comment xml:lang="de">RGB-Bild</comment>
- <comment xml:lang="el">Εικόνα RGB</comment>
- <comment xml:lang="en-GB">RGB image</comment>
- <comment xml:lang="eo">RGB-bildo</comment>
- <comment xml:lang="es">imagen RGB</comment>
- <comment xml:lang="eu">RGB irudia</comment>
- <comment xml:lang="fi">RGB-kuva</comment>
- <comment xml:lang="fo">RGB mynd</comment>
- <comment xml:lang="fr">image RGB</comment>
- <comment xml:lang="fur">imagjin RGB</comment>
- <comment xml:lang="ga">íomhá RGB</comment>
- <comment xml:lang="gl">imaxe RGB</comment>
- <comment xml:lang="he">תמונת RGB</comment>
- <comment xml:lang="hr">RGB slika</comment>
- <comment xml:lang="hu">RGB-kép</comment>
- <comment xml:lang="ia">Imagine RGB</comment>
- <comment xml:lang="id">Citra RGB</comment>
- <comment xml:lang="it">Immagine RGB</comment>
- <comment xml:lang="ja">RGB 画像</comment>
- <comment xml:lang="kk">RGB суреті</comment>
- <comment xml:lang="ko">RGB 그림</comment>
- <comment xml:lang="lt">RGB paveikslėlis</comment>
- <comment xml:lang="lv">RGB attēls</comment>
- <comment xml:lang="ms">Imej RGB</comment>
- <comment xml:lang="nb">RGB-bilde</comment>
- <comment xml:lang="nl">RGB-afbeelding</comment>
- <comment xml:lang="nn">RGB-bilete</comment>
- <comment xml:lang="oc">imatge RGB</comment>
- <comment xml:lang="pl">Obraz RGB</comment>
- <comment xml:lang="pt">imagem RGB</comment>
- <comment xml:lang="pt-BR">Imagem RGB</comment>
- <comment xml:lang="ro">Imagine RGB</comment>
- <comment xml:lang="ru">Изображение RGB</comment>
- <comment xml:lang="sk">Obrázok RGB</comment>
- <comment xml:lang="sl">Slikovna datoteka RGB</comment>
- <comment xml:lang="sq">Figurë RGB</comment>
- <comment xml:lang="sr">РГБ слика</comment>
- <comment xml:lang="sv">RGB-bild</comment>
- <comment xml:lang="tr">RGB görüntüsü</comment>
- <comment xml:lang="uk">зображення RGB</comment>
+ <comment xml:lang="zh_TW">RGB 影像</comment>
+ <comment xml:lang="zh_CN">RGB 图像</comment>
<comment xml:lang="vi">Ảnh kiểu RGB</comment>
- <comment xml:lang="zh-CN">RGB 图像</comment>
- <comment xml:lang="zh-TW">RGB 影像</comment>
+ <comment xml:lang="uk">зображення RGB</comment>
+ <comment xml:lang="tr">RGB görüntüsü</comment>
+ <comment xml:lang="sv">RGB-bild</comment>
+ <comment xml:lang="sr">РГБ слика</comment>
+ <comment xml:lang="sq">figurë RGB</comment>
+ <comment xml:lang="sl">Slikovna datoteka RGB</comment>
+ <comment xml:lang="si">RGB රූපය</comment>
+ <comment xml:lang="sk">Obrázok RGB</comment>
+ <comment xml:lang="ru">Изображение RGB</comment>
+ <comment xml:lang="ro">Imagine RGB</comment>
+ <comment xml:lang="pt_BR">Imagem RGB</comment>
+ <comment xml:lang="pt">imagem RGB</comment>
+ <comment xml:lang="pl">Obraz RGB</comment>
+ <comment xml:lang="oc">imatge RGB</comment>
+ <comment xml:lang="nn">RGB-bilete</comment>
+ <comment xml:lang="nl">RGB-afbeelding</comment>
+ <comment xml:lang="nb">RGB-bilde</comment>
+ <comment xml:lang="ms">Imej RGB</comment>
+ <comment xml:lang="lv">RGB attēls</comment>
+ <comment xml:lang="lt">RGB paveikslėlis</comment>
+ <comment xml:lang="ko">RGB 그림</comment>
+ <comment xml:lang="kk">RGB суреті</comment>
+ <comment xml:lang="ja">RGB 画像</comment>
+ <comment xml:lang="it">Immagine RGB</comment>
+ <comment xml:lang="is">RGB mynd</comment>
+ <comment xml:lang="id">Citra RGB</comment>
+ <comment xml:lang="ia">Imagine RGB</comment>
+ <comment xml:lang="hu">RGB-kép</comment>
+ <comment xml:lang="hr">RGB slika</comment>
+ <comment xml:lang="he">תמונת RGB</comment>
+ <comment xml:lang="gl">imaxe RGB</comment>
+ <comment xml:lang="ga">íomhá RGB</comment>
+ <comment xml:lang="fur">imagjin RGB</comment>
+ <comment xml:lang="fr">image RGB</comment>
+ <comment xml:lang="fo">RGB mynd</comment>
+ <comment xml:lang="fi">RGB-kuva</comment>
+ <comment xml:lang="eu">RGB irudia</comment>
+ <comment xml:lang="es">imagen RGB</comment>
+ <comment xml:lang="eo">RGB-bildo</comment>
+ <comment xml:lang="en_GB">RGB image</comment>
+ <comment xml:lang="el">Εικόνα RGB</comment>
+ <comment xml:lang="de">RGB-Bild</comment>
+ <comment xml:lang="da">RGB-billede</comment>
+ <comment xml:lang="cy">Delwedd RGB</comment>
+ <comment xml:lang="cs">obrázek RGB</comment>
+ <comment xml:lang="ca">imatge RGB</comment>
+ <comment xml:lang="bg">Изображение — RGB</comment>
+ <comment xml:lang="be@latin">Vyjava RGB</comment>
+ <comment xml:lang="be">выява RGB</comment>
+ <comment xml:lang="az">RGB rəsmi</comment>
+ <comment xml:lang="ar">صورة RGB</comment>
+ <comment xml:lang="af">RGB-beeld</comment>
<glob pattern="*.rgb"/>
</mime-type>
<mime-type type="image/x-sgi">
<comment>SGI image</comment>
- <comment xml:lang="af">SGI-beeld</comment>
- <comment xml:lang="ar">صورة SGI</comment>
- <comment xml:lang="be-Latn">Vyjava SGI</comment>
- <comment xml:lang="bg">Изображение — SGI</comment>
- <comment xml:lang="ca">imatge SGI</comment>
- <comment xml:lang="cs">obrázek SGI</comment>
- <comment xml:lang="da">SGI-billede</comment>
- <comment xml:lang="de">SGI-Bild</comment>
- <comment xml:lang="el">Εικόνα SGI</comment>
- <comment xml:lang="en-GB">SGI image</comment>
- <comment xml:lang="eo">SGI-bildo</comment>
- <comment xml:lang="es">imagen SGI</comment>
- <comment xml:lang="eu">SGI irudia</comment>
- <comment xml:lang="fi">SGI-kuva</comment>
- <comment xml:lang="fo">SGI mynd</comment>
- <comment xml:lang="fr">image SGI</comment>
- <comment xml:lang="fur">imagjin SGI</comment>
- <comment xml:lang="ga">íomhá SGI</comment>
- <comment xml:lang="gl">imaxe SGI</comment>
- <comment xml:lang="he">תמונת SGI</comment>
- <comment xml:lang="hr">SGI slika</comment>
- <comment xml:lang="hu">SGI kép</comment>
- <comment xml:lang="ia">Imagine SGI</comment>
- <comment xml:lang="id">Citra SGI</comment>
- <comment xml:lang="it">Immagine SGI</comment>
- <comment xml:lang="ja">SGI 画像</comment>
- <comment xml:lang="kk">SGI суреті</comment>
- <comment xml:lang="ko">SGI 그림</comment>
- <comment xml:lang="lt">SGI paveikslėlis</comment>
- <comment xml:lang="lv">SGI attēls</comment>
- <comment xml:lang="nb">SGI-bilde</comment>
- <comment xml:lang="nl">SGI-afbeelding</comment>
- <comment xml:lang="nn">SGI-bilete</comment>
- <comment xml:lang="oc">imatge SGI</comment>
- <comment xml:lang="pl">Obraz SGI</comment>
- <comment xml:lang="pt">imagem SGI</comment>
- <comment xml:lang="pt-BR">Imagem SGI</comment>
- <comment xml:lang="ro">Imagine SGI</comment>
- <comment xml:lang="ru">Изображение SGI</comment>
- <comment xml:lang="sk">Obrázok SGI</comment>
- <comment xml:lang="sl">Slikovna datoteka SGI</comment>
- <comment xml:lang="sq">Figurë SGI</comment>
- <comment xml:lang="sr">СГИ слика</comment>
- <comment xml:lang="sv">SGI-bild</comment>
- <comment xml:lang="tr">SGI görüntüsü</comment>
- <comment xml:lang="uk">зображення SGI</comment>
+ <comment xml:lang="zh_TW">SGI 影像</comment>
+ <comment xml:lang="zh_CN">SGI 图像</comment>
<comment xml:lang="vi">Ảnh SGI</comment>
- <comment xml:lang="zh-CN">SGI 图像</comment>
- <comment xml:lang="zh-TW">SGI 影像</comment>
+ <comment xml:lang="uk">зображення SGI</comment>
+ <comment xml:lang="tr">SGI görüntüsü</comment>
+ <comment xml:lang="sv">SGI-bild</comment>
+ <comment xml:lang="sr">СГИ слика</comment>
+ <comment xml:lang="sq">figurë SGI</comment>
+ <comment xml:lang="sl">Slikovna datoteka SGI</comment>
+ <comment xml:lang="si">SGI රූපය</comment>
+ <comment xml:lang="sk">Obrázok SGI</comment>
+ <comment xml:lang="ru">Изображение SGI</comment>
+ <comment xml:lang="ro">Imagine SGI</comment>
+ <comment xml:lang="pt_BR">Imagem SGI</comment>
+ <comment xml:lang="pt">imagem SGI</comment>
+ <comment xml:lang="pl">Obraz SGI</comment>
+ <comment xml:lang="oc">imatge SGI</comment>
+ <comment xml:lang="nn">SGI-bilete</comment>
+ <comment xml:lang="nl">SGI-afbeelding</comment>
+ <comment xml:lang="nb">SGI-bilde</comment>
+ <comment xml:lang="lv">SGI attēls</comment>
+ <comment xml:lang="lt">SGI paveikslėlis</comment>
+ <comment xml:lang="ko">SGI 그림</comment>
+ <comment xml:lang="kk">SGI суреті</comment>
+ <comment xml:lang="ja">SGI 画像</comment>
+ <comment xml:lang="it">Immagine SGI</comment>
+ <comment xml:lang="is">SGI mynd</comment>
+ <comment xml:lang="id">Citra SGI</comment>
+ <comment xml:lang="ia">Imagine SGI</comment>
+ <comment xml:lang="hu">SGI kép</comment>
+ <comment xml:lang="hr">SGI slika</comment>
+ <comment xml:lang="he">תמונת SGI</comment>
+ <comment xml:lang="gl">imaxe SGI</comment>
+ <comment xml:lang="ga">íomhá SGI</comment>
+ <comment xml:lang="fur">imagjin SGI</comment>
+ <comment xml:lang="fr">image SGI</comment>
+ <comment xml:lang="fo">SGI mynd</comment>
+ <comment xml:lang="fi">SGI-kuva</comment>
+ <comment xml:lang="eu">SGI irudia</comment>
+ <comment xml:lang="es">imagen SGI</comment>
+ <comment xml:lang="eo">SGI-bildo</comment>
+ <comment xml:lang="en_GB">SGI image</comment>
+ <comment xml:lang="el">Εικόνα SGI</comment>
+ <comment xml:lang="de">SGI-Bild</comment>
+ <comment xml:lang="da">SGI-billede</comment>
+ <comment xml:lang="cs">obrázek SGI</comment>
+ <comment xml:lang="ca">imatge SGI</comment>
+ <comment xml:lang="bg">Изображение — SGI</comment>
+ <comment xml:lang="be@latin">Vyjava SGI</comment>
+ <comment xml:lang="be">выява SGI</comment>
+ <comment xml:lang="ar">صورة SGI</comment>
+ <comment xml:lang="af">SGI-beeld</comment>
<glob pattern="*.sgi"/>
</mime-type>
<mime-type type="image/x-sun-raster">
<comment>Sun raster image</comment>
- <comment xml:lang="af">Sun-roosterbeeld</comment>
- <comment xml:lang="ar">صورة Sun raster</comment>
- <comment xml:lang="be-Latn">Rastravaja vyjava Sun</comment>
- <comment xml:lang="bg">Изображение — Sun raster</comment>
- <comment xml:lang="ca">imatge ràster Sun</comment>
- <comment xml:lang="cs">rastrový obrázek Sun</comment>
- <comment xml:lang="da">Sun rasterbillede</comment>
- <comment xml:lang="de">Sun-Rasterbild</comment>
- <comment xml:lang="el">Εικόνα Sun raster</comment>
- <comment xml:lang="en-GB">Sun raster image</comment>
- <comment xml:lang="es">imagen rasterizada de Sun</comment>
- <comment xml:lang="eu">Sun raster irudia</comment>
- <comment xml:lang="fi">Sun-rasterikuva</comment>
- <comment xml:lang="fo">Sun raster mynd</comment>
- <comment xml:lang="fr">image raster Sun</comment>
- <comment xml:lang="fur">imagjin raster Sun</comment>
- <comment xml:lang="ga">íomhá rastar Sun</comment>
- <comment xml:lang="gl">imaxe ráster de Sun</comment>
- <comment xml:lang="he">תמונה סרוקה של Sun</comment>
- <comment xml:lang="hr">Sun iscrtana slika</comment>
- <comment xml:lang="hu">SUN raszterkép</comment>
- <comment xml:lang="ia">Imagine raster Sun</comment>
- <comment xml:lang="id">Citra raster Sun</comment>
- <comment xml:lang="it">Immagine raster Sun</comment>
- <comment xml:lang="ja">Sun ラスタ画像</comment>
- <comment xml:lang="kk">Sun растрлық суреті</comment>
- <comment xml:lang="ko">Sun 래스터 그림</comment>
- <comment xml:lang="lt">Sun rastrinis paveikslėlis</comment>
- <comment xml:lang="lv">Sun rastra attēls</comment>
- <comment xml:lang="nb">Sun rasterbilde</comment>
- <comment xml:lang="nl">Sun-rasterafbeelding</comment>
- <comment xml:lang="nn">Sun rasterbilete</comment>
- <comment xml:lang="oc">imatge raster Sun</comment>
- <comment xml:lang="pl">Obraz rastrowy Sun</comment>
- <comment xml:lang="pt">imagem raster Sun</comment>
- <comment xml:lang="pt-BR">Imagem raster da Sun</comment>
- <comment xml:lang="ro">Imagine rasterizată Sun</comment>
- <comment xml:lang="ru">Растровое изображение Sun</comment>
- <comment xml:lang="sk">Rastrový obrázok Sun</comment>
- <comment xml:lang="sl">Slikovna rastrska datoteka Sun</comment>
- <comment xml:lang="sq">Figurë raster Sun</comment>
- <comment xml:lang="sr">слика Сановог растера</comment>
- <comment xml:lang="sv">Sun-rasterbild</comment>
- <comment xml:lang="tr">Sun raster görüntüsü</comment>
- <comment xml:lang="uk">растрове зображення Sun</comment>
+ <comment xml:lang="zh_TW">Sun raster 影像</comment>
+ <comment xml:lang="zh_CN">Sun 光栅图像</comment>
<comment xml:lang="vi">Ảnh mành Sun</comment>
- <comment xml:lang="zh-CN">Sun 光栅图像</comment>
- <comment xml:lang="zh-TW">Sun raster 影像</comment>
- <magic priority="50">
+ <comment xml:lang="uk">растрове зображення Sun</comment>
+ <comment xml:lang="tr">Sun raster görüntüsü</comment>
+ <comment xml:lang="sv">Sun-rasterbild</comment>
+ <comment xml:lang="sr">слика Сановог растера</comment>
+ <comment xml:lang="sq">figurë raster Sun</comment>
+ <comment xml:lang="sl">Slikovna rastrska datoteka Sun</comment>
+ <comment xml:lang="si">හිරු රස්ටර් රූපය</comment>
+ <comment xml:lang="sk">Rastrový obrázok Sun</comment>
+ <comment xml:lang="ru">Растровое изображение Sun</comment>
+ <comment xml:lang="ro">Imagine rasterizată Sun</comment>
+ <comment xml:lang="pt_BR">Imagem raster da Sun</comment>
+ <comment xml:lang="pt">imagem raster Sun</comment>
+ <comment xml:lang="pl">Obraz rastrowy Sun</comment>
+ <comment xml:lang="oc">imatge raster Sun</comment>
+ <comment xml:lang="nn">Sun rasterbilete</comment>
+ <comment xml:lang="nl">Sun-rasterafbeelding</comment>
+ <comment xml:lang="nb">Sun rasterbilde</comment>
+ <comment xml:lang="lv">Sun rastra attēls</comment>
+ <comment xml:lang="lt">Sun rastrinis paveikslėlis</comment>
+ <comment xml:lang="ko">Sun 래스터 그림</comment>
+ <comment xml:lang="kk">Sun растрлық суреті</comment>
+ <comment xml:lang="ja">Sun ラスタ画像</comment>
+ <comment xml:lang="it">Immagine raster Sun</comment>
+ <comment xml:lang="is">Sun rastamynd</comment>
+ <comment xml:lang="id">Citra raster Sun</comment>
+ <comment xml:lang="ia">Imagine raster Sun</comment>
+ <comment xml:lang="hu">SUN raszterkép</comment>
+ <comment xml:lang="hr">Sun iscrtana slika</comment>
+ <comment xml:lang="he">תמונה סרוקה של Sun</comment>
+ <comment xml:lang="gl">imaxe ráster de Sun</comment>
+ <comment xml:lang="ga">íomhá rastar Sun</comment>
+ <comment xml:lang="fur">imagjin raster Sun</comment>
+ <comment xml:lang="fr">image raster Sun</comment>
+ <comment xml:lang="fo">Sun raster mynd</comment>
+ <comment xml:lang="fi">Sun-rasterikuva</comment>
+ <comment xml:lang="eu">Sun raster irudia</comment>
+ <comment xml:lang="es">imagen rasterizada de Sun</comment>
+ <comment xml:lang="en_GB">Sun raster image</comment>
+ <comment xml:lang="el">Εικόνα Sun raster</comment>
+ <comment xml:lang="de">Sun-Rasterbild</comment>
+ <comment xml:lang="da">Sun rasterbillede</comment>
+ <comment xml:lang="cs">rastrový obrázek Sun</comment>
+ <comment xml:lang="ca">imatge ràster Sun</comment>
+ <comment xml:lang="bg">Изображение — Sun raster</comment>
+ <comment xml:lang="be@latin">Rastravaja vyjava Sun</comment>
+ <comment xml:lang="be">выява Sun raster</comment>
+ <comment xml:lang="ar">صورة Sun raster</comment>
+ <comment xml:lang="af">Sun-roosterbeeld</comment>
+ <magic>
<match type="big32" value="0x59a66a95" offset="0"/>
</magic>
<glob pattern="*.sun"/>
</mime-type>
<mime-type type="image/x-tga">
<comment>TGA image</comment>
- <comment xml:lang="af">TGA-beeld</comment>
- <comment xml:lang="ar">صورة TGA</comment>
- <comment xml:lang="be-Latn">Vyjava TGA</comment>
- <comment xml:lang="bg">Изображение — TGA</comment>
- <comment xml:lang="ca">imatge TGA</comment>
- <comment xml:lang="cs">obrázek TGA</comment>
- <comment xml:lang="da">TGA-billede</comment>
- <comment xml:lang="de">TGA-Bild</comment>
- <comment xml:lang="el">Εικόνα TGA</comment>
- <comment xml:lang="en-GB">TGA image</comment>
- <comment xml:lang="eo">TGA-bildo</comment>
- <comment xml:lang="es">imagen TGA</comment>
- <comment xml:lang="eu">TGA irudia</comment>
- <comment xml:lang="fi">TGA-kuva</comment>
- <comment xml:lang="fo">TGA mynd</comment>
- <comment xml:lang="fr">image TGA</comment>
- <comment xml:lang="fur">imagjin TGA</comment>
- <comment xml:lang="ga">íomhá TGA</comment>
- <comment xml:lang="gl">imaxe TGA</comment>
- <comment xml:lang="he">תמונת TGA</comment>
- <comment xml:lang="hr">TGA slika</comment>
- <comment xml:lang="hu">TGA kép</comment>
- <comment xml:lang="ia">Imagine TGA</comment>
- <comment xml:lang="id">Citra TGA</comment>
- <comment xml:lang="it">Immagine TGA</comment>
- <comment xml:lang="ja">TGA 画像</comment>
- <comment xml:lang="kk">TGA суреті</comment>
- <comment xml:lang="ko">TGA 그림</comment>
- <comment xml:lang="lt">TGA paveikslėlis</comment>
- <comment xml:lang="lv">TGA attēls</comment>
- <comment xml:lang="nb">TGA-bilde</comment>
- <comment xml:lang="nl">TGA-afbeelding</comment>
- <comment xml:lang="nn">TGA-bilete</comment>
- <comment xml:lang="oc">imatge TGA</comment>
- <comment xml:lang="pl">Obraz TGA</comment>
- <comment xml:lang="pt">imagem TGA</comment>
- <comment xml:lang="pt-BR">Imagem TGA</comment>
- <comment xml:lang="ro">Imagine TGA</comment>
- <comment xml:lang="ru">Изображение TGA</comment>
- <comment xml:lang="sk">Obrázok TGA</comment>
- <comment xml:lang="sl">Slikovna datoteka TGA</comment>
- <comment xml:lang="sq">Figurë TGA</comment>
- <comment xml:lang="sr">ТГА слика</comment>
- <comment xml:lang="sv">TGA-bild</comment>
- <comment xml:lang="tr">TGA görüntüsü</comment>
- <comment xml:lang="uk">зображення TGA</comment>
+ <comment xml:lang="zh_TW">TGA 影像</comment>
+ <comment xml:lang="zh_CN">TGA 图像</comment>
<comment xml:lang="vi">Ảnh TGA</comment>
- <comment xml:lang="zh-CN">TGA 图像</comment>
- <comment xml:lang="zh-TW">TGA 影像</comment>
+ <comment xml:lang="uk">зображення TGA</comment>
+ <comment xml:lang="tr">TGA görüntüsü</comment>
+ <comment xml:lang="sv">TGA-bild</comment>
+ <comment xml:lang="sr">ТГА слика</comment>
+ <comment xml:lang="sq">figurë TGA</comment>
+ <comment xml:lang="sl">Slikovna datoteka TGA</comment>
+ <comment xml:lang="si">TGA රූපය</comment>
+ <comment xml:lang="sk">Obrázok TGA</comment>
+ <comment xml:lang="ru">Изображение TGA</comment>
+ <comment xml:lang="ro">Imagine TGA</comment>
+ <comment xml:lang="pt_BR">Imagem TGA</comment>
+ <comment xml:lang="pt">imagem TGA</comment>
+ <comment xml:lang="pl">Obraz TGA</comment>
+ <comment xml:lang="oc">imatge TGA</comment>
+ <comment xml:lang="nn">TGA-bilete</comment>
+ <comment xml:lang="nl">TGA-afbeelding</comment>
+ <comment xml:lang="nb">TGA-bilde</comment>
+ <comment xml:lang="lv">TGA attēls</comment>
+ <comment xml:lang="lt">TGA paveikslėlis</comment>
+ <comment xml:lang="ko">TGA 그림</comment>
+ <comment xml:lang="kk">TGA суреті</comment>
+ <comment xml:lang="ja">TGA 画像</comment>
+ <comment xml:lang="it">Immagine TGA</comment>
+ <comment xml:lang="is">TGA mynd</comment>
+ <comment xml:lang="id">Citra TGA</comment>
+ <comment xml:lang="ia">Imagine TGA</comment>
+ <comment xml:lang="hu">TGA kép</comment>
+ <comment xml:lang="hr">TGA slika</comment>
+ <comment xml:lang="he">תמונת TGA</comment>
+ <comment xml:lang="gl">imaxe TGA</comment>
+ <comment xml:lang="ga">íomhá TGA</comment>
+ <comment xml:lang="fur">imagjin TGA</comment>
+ <comment xml:lang="fr">image TGA</comment>
+ <comment xml:lang="fo">TGA mynd</comment>
+ <comment xml:lang="fi">TGA-kuva</comment>
+ <comment xml:lang="eu">TGA irudia</comment>
+ <comment xml:lang="es">imagen TGA</comment>
+ <comment xml:lang="eo">TGA-bildo</comment>
+ <comment xml:lang="en_GB">TGA image</comment>
+ <comment xml:lang="el">Εικόνα TGA</comment>
+ <comment xml:lang="de">TGA-Bild</comment>
+ <comment xml:lang="da">TGA-billede</comment>
+ <comment xml:lang="cs">obrázek TGA</comment>
+ <comment xml:lang="ca">imatge TGA</comment>
+ <comment xml:lang="bg">Изображение — TGA</comment>
+ <comment xml:lang="be@latin">Vyjava TGA</comment>
+ <comment xml:lang="be">выява TGA</comment>
+ <comment xml:lang="ar">صورة TGA</comment>
+ <comment xml:lang="af">TGA-beeld</comment>
<acronym>TGA</acronym>
<expanded-acronym>Truevision Graphics Adapter</expanded-acronym>
<magic priority="10">
@@ -30479,7 +32143,7 @@ command to generate the output files.
<match type="string" value="\0\xa" offset="1"/>
<match type="string" value="\0\xb" offset="1"/>
</magic>
- <magic priority="50">
+ <magic>
<match type="string" value="\0\2" offset="1">
<match type="byte" value="0x08" offset="16"/>
<match type="byte" value="0x10" offset="16"/>
@@ -30502,57 +32166,60 @@ command to generate the output files.
</mime-type>
<mime-type type="image/x-win-bitmap">
<comment>Windows cursor</comment>
- <comment xml:lang="af">Windows-wyser</comment>
- <comment xml:lang="ar">مؤشر ويندوز</comment>
- <comment xml:lang="be-Latn">Kursor Windows</comment>
- <comment xml:lang="bg">Курсор — Windows</comment>
- <comment xml:lang="ca">cursor de Windows</comment>
- <comment xml:lang="cs">kurzor Windows</comment>
- <comment xml:lang="da">Windowsmarkør</comment>
- <comment xml:lang="de">Windows-Cursor</comment>
- <comment xml:lang="el">Δρομέας Windows</comment>
- <comment xml:lang="en-GB">Windows cursor</comment>
- <comment xml:lang="eo">Windows-kursoro</comment>
- <comment xml:lang="es">cursor de Windows</comment>
- <comment xml:lang="eu">Windows kurtsorea</comment>
- <comment xml:lang="fi">Windows-osoitin</comment>
- <comment xml:lang="fo">Windows vísi</comment>
- <comment xml:lang="fr">curseur Windows</comment>
- <comment xml:lang="fur">cursôr di Windows</comment>
- <comment xml:lang="ga">cúrsóir Windows</comment>
- <comment xml:lang="gl">Cursor de Windows</comment>
- <comment xml:lang="he">סמן של Windows</comment>
- <comment xml:lang="hr">Windows pokazivač</comment>
- <comment xml:lang="hu">Windows-kurzor</comment>
- <comment xml:lang="ia">Cursor pro Windows</comment>
- <comment xml:lang="id">Kursor Windows</comment>
- <comment xml:lang="it">Cursore Windows</comment>
- <comment xml:lang="ja">Windows カーソル</comment>
- <comment xml:lang="kk">Windows курсоры</comment>
- <comment xml:lang="ko">Windows 커서</comment>
- <comment xml:lang="lt">Windows žymiklis</comment>
- <comment xml:lang="lv">Windows kursors</comment>
- <comment xml:lang="ms">Kursor Windows</comment>
- <comment xml:lang="nb">Windows-markør</comment>
- <comment xml:lang="nl">Windows-muisaanwijzer</comment>
- <comment xml:lang="nn">Windows-peikar</comment>
- <comment xml:lang="oc">cursor Windows</comment>
- <comment xml:lang="pl">Kursor Windows</comment>
- <comment xml:lang="pt">cursor Windows</comment>
- <comment xml:lang="pt-BR">Cursor do Windows</comment>
- <comment xml:lang="ro">Cursor Windows</comment>
- <comment xml:lang="ru">Курсор Windows</comment>
- <comment xml:lang="sk">Kurzor Windows</comment>
- <comment xml:lang="sl">Datoteka kazalke Windows</comment>
- <comment xml:lang="sq">Kursor Windows</comment>
- <comment xml:lang="sr">Виндоузов курсор</comment>
- <comment xml:lang="sv">Windows-muspekare</comment>
- <comment xml:lang="tr">Windows imleci</comment>
- <comment xml:lang="uk">курсор Windows</comment>
+ <comment xml:lang="zh_TW">Windows 滑鼠游標</comment>
+ <comment xml:lang="zh_CN">Windows 光标</comment>
<comment xml:lang="vi">Con chạy Windows</comment>
- <comment xml:lang="zh-CN">Windows 光标</comment>
- <comment xml:lang="zh-TW">Windows 滑鼠游標</comment>
- <magic priority="50">
+ <comment xml:lang="uk">курсор Windows</comment>
+ <comment xml:lang="tr">Windows imleci</comment>
+ <comment xml:lang="sv">Windows-muspekare</comment>
+ <comment xml:lang="sr">Виндоузов курсор</comment>
+ <comment xml:lang="sq">kursor Windows</comment>
+ <comment xml:lang="sl">Datoteka kazalke Windows</comment>
+ <comment xml:lang="si">වින්ඩෝස් කර්සරය</comment>
+ <comment xml:lang="sk">Kurzor Windows</comment>
+ <comment xml:lang="ru">Курсор Windows</comment>
+ <comment xml:lang="ro">Cursor Windows</comment>
+ <comment xml:lang="pt_BR">Cursor do Windows</comment>
+ <comment xml:lang="pt">cursor Windows</comment>
+ <comment xml:lang="pl">Kursor Windows</comment>
+ <comment xml:lang="oc">cursor Windows</comment>
+ <comment xml:lang="nn">Windows-peikar</comment>
+ <comment xml:lang="nl">Windows-muisaanwijzer</comment>
+ <comment xml:lang="nb">Windows-markør</comment>
+ <comment xml:lang="ms">Kursor Windows</comment>
+ <comment xml:lang="lv">Windows kursors</comment>
+ <comment xml:lang="lt">Windows žymeklis</comment>
+ <comment xml:lang="ko">Windows 커서</comment>
+ <comment xml:lang="kk">Windows курсоры</comment>
+ <comment xml:lang="ja">Windows カーソル</comment>
+ <comment xml:lang="it">Cursore Windows</comment>
+ <comment xml:lang="is">Windows bendill</comment>
+ <comment xml:lang="id">Kursor Windows</comment>
+ <comment xml:lang="ia">Cursor pro Windows</comment>
+ <comment xml:lang="hu">Windows-kurzor</comment>
+ <comment xml:lang="hr">Windows pokazivač</comment>
+ <comment xml:lang="he">סמן של Windows</comment>
+ <comment xml:lang="gl">Cursor de Windows</comment>
+ <comment xml:lang="ga">cúrsóir Windows</comment>
+ <comment xml:lang="fur">cursôr di Windows</comment>
+ <comment xml:lang="fr">curseur Windows</comment>
+ <comment xml:lang="fo">Windows vísi</comment>
+ <comment xml:lang="fi">Windows-osoitin</comment>
+ <comment xml:lang="eu">Windows kurtsorea</comment>
+ <comment xml:lang="es">cursor de Windows</comment>
+ <comment xml:lang="eo">Windows-kursoro</comment>
+ <comment xml:lang="en_GB">Windows cursor</comment>
+ <comment xml:lang="el">Δρομέας Windows</comment>
+ <comment xml:lang="de">Windows-Mauszeiger</comment>
+ <comment xml:lang="da">Windowsmarkør</comment>
+ <comment xml:lang="cs">kurzor Windows</comment>
+ <comment xml:lang="ca">cursor de Windows</comment>
+ <comment xml:lang="bg">Курсор — Windows</comment>
+ <comment xml:lang="be@latin">Kursor Windows</comment>
+ <comment xml:lang="be">курсор Windows</comment>
+ <comment xml:lang="ar">مؤشر ويندوز</comment>
+ <comment xml:lang="af">Windows-wyser</comment>
+ <magic>
<match type="string" value="\0\0\2\0" offset="0">
<match type="string" value="\0" offset="5"/>
</match>
@@ -30561,54 +32228,58 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-navi-animation">
<comment>Windows animated cursor</comment>
- <comment xml:lang="af">Windows geanimeerde wyser</comment>
- <comment xml:lang="ar">مؤشر ويندوز المتحرك</comment>
- <comment xml:lang="be-Latn">Animavany kursor Windows</comment>
- <comment xml:lang="bg">Курсор — Windows, анимиран</comment>
- <comment xml:lang="ca">cursor animat de Windows</comment>
- <comment xml:lang="cs">animovaný kurzor Windows</comment>
- <comment xml:lang="da">Windowsanimeret markør</comment>
- <comment xml:lang="de">Animierter Windows-Cursor</comment>
- <comment xml:lang="el">Κινούμενος δρομέας Windows</comment>
- <comment xml:lang="en-GB">Windows animated cursor</comment>
- <comment xml:lang="es">cursor animado de Windows</comment>
- <comment xml:lang="eu">Windows-eko kurtsore animatua</comment>
- <comment xml:lang="fi">animoitu Windows-osoitin</comment>
- <comment xml:lang="fo">Windows livindaigjørdur vísi</comment>
- <comment xml:lang="fr">curseur animé Windows</comment>
- <comment xml:lang="fur">cursôr animât di Windows</comment>
- <comment xml:lang="ga">cúrsóir beoite Windows</comment>
- <comment xml:lang="gl">Cursor animado de Windows</comment>
- <comment xml:lang="he">סמן מונפש של Windows</comment>
- <comment xml:lang="hr">Windows animirani pokazivač</comment>
- <comment xml:lang="hu">Windows animált kurzor</comment>
- <comment xml:lang="ia">Cursor animate pro Windows</comment>
- <comment xml:lang="id">Kursor animasi Windows</comment>
- <comment xml:lang="it">Cursore animato Windows</comment>
- <comment xml:lang="ja">Windows アニメーションカーソル</comment>
- <comment xml:lang="kk">Windows анимациясы бар курсор</comment>
- <comment xml:lang="ko">Windows 움직이는 커서</comment>
- <comment xml:lang="lt">Animuotas Windows žymiklis</comment>
- <comment xml:lang="lv">Windows animēts kursors</comment>
- <comment xml:lang="nl">geanimeerde Windows-muisaanwijzer</comment>
- <comment xml:lang="nn">Windows animert peikar</comment>
- <comment xml:lang="oc">cursor animat Windows</comment>
- <comment xml:lang="pl">Animowany kursor Windows</comment>
- <comment xml:lang="pt">cursor animado Windows</comment>
- <comment xml:lang="pt-BR">Cursor animado do Windows</comment>
- <comment xml:lang="ro">Cursor animat Windows</comment>
- <comment xml:lang="ru">Анимированный курсор Windows</comment>
- <comment xml:lang="sk">Animovaný kurzor Windows</comment>
- <comment xml:lang="sl">Datoteka animirane kazalke Windows</comment>
- <comment xml:lang="sq">Kursor i animuar Windows</comment>
- <comment xml:lang="sr">Виндоузов анимирани курсор</comment>
- <comment xml:lang="sv">Animerad Windows-muspekare</comment>
- <comment xml:lang="tr">Windows canlandırmalı imleci</comment>
- <comment xml:lang="uk">анімований курсор Windows</comment>
+ <comment xml:lang="zh_TW">Windows 滑鼠動畫游標</comment>
+ <comment xml:lang="zh_CN">Windows 动态光标</comment>
<comment xml:lang="vi">Con chạy hoạt họa Windows</comment>
- <comment xml:lang="zh-CN">Windows 动态光标</comment>
- <comment xml:lang="zh-TW">Windows 滑鼠動畫游標</comment>
- <magic priority="50">
+ <comment xml:lang="uk">анімований курсор Windows</comment>
+ <comment xml:lang="tr">Windows canlandırmalı imleci</comment>
+ <comment xml:lang="sv">Animerad Windows-muspekare</comment>
+ <comment xml:lang="sr">Виндоузов анимирани курсор</comment>
+ <comment xml:lang="sq">kursor i animuar Windows</comment>
+ <comment xml:lang="sl">Datoteka animirane kazalke Windows</comment>
+ <comment xml:lang="si">වින්ඩෝස් සජීවිකරණ කර්සරය</comment>
+ <comment xml:lang="sk">Animovaný kurzor Windows</comment>
+ <comment xml:lang="ru">Анимированный курсор Windows</comment>
+ <comment xml:lang="ro">Cursor animat Windows</comment>
+ <comment xml:lang="pt_BR">Cursor animado do Windows</comment>
+ <comment xml:lang="pt">cursor animado Windows</comment>
+ <comment xml:lang="pl">Animowany kursor Windows</comment>
+ <comment xml:lang="oc">cursor animat Windows</comment>
+ <comment xml:lang="nn">Windows animert peikar</comment>
+ <comment xml:lang="nl">geanimeerde Windows-muisaanwijzer</comment>
+ <comment xml:lang="lv">Windows animēts kursors</comment>
+ <comment xml:lang="lt">Animuotas Windows žymeklis</comment>
+ <comment xml:lang="ko">Windows 움직이는 커서</comment>
+ <comment xml:lang="kk">Windows анимациясы бар курсор</comment>
+ <comment xml:lang="ka">Windows -ის ანიმირებული კურსორი</comment>
+ <comment xml:lang="ja">Windows アニメーションカーソル</comment>
+ <comment xml:lang="it">Cursore animato Windows</comment>
+ <comment xml:lang="is">Windows hreyfibendill</comment>
+ <comment xml:lang="id">Kursor animasi Windows</comment>
+ <comment xml:lang="ia">Cursor animate pro Windows</comment>
+ <comment xml:lang="hu">Windows animált kurzor</comment>
+ <comment xml:lang="hr">Windows animirani pokazivač</comment>
+ <comment xml:lang="he">סמן מונפש של Windows</comment>
+ <comment xml:lang="gl">Cursor animado de Windows</comment>
+ <comment xml:lang="ga">cúrsóir beoite Windows</comment>
+ <comment xml:lang="fur">cursôr animât di Windows</comment>
+ <comment xml:lang="fr">curseur animé Windows</comment>
+ <comment xml:lang="fo">Windows livindaigjørdur vísi</comment>
+ <comment xml:lang="fi">animoitu Windows-osoitin</comment>
+ <comment xml:lang="eu">Windows-eko kurtsore animatua</comment>
+ <comment xml:lang="es">cursor animado de Windows</comment>
+ <comment xml:lang="en_GB">Windows animated cursor</comment>
+ <comment xml:lang="el">Κινούμενος δρομέας Windows</comment>
+ <comment xml:lang="de">Animierter Windows-Mauszeiger</comment>
+ <comment xml:lang="da">Windowsanimeret markør</comment>
+ <comment xml:lang="cs">animovaný kurzor Windows</comment>
+ <comment xml:lang="ca">cursor animat de Windows</comment>
+ <comment xml:lang="bg">Курсор — Windows, анимиран</comment>
+ <comment xml:lang="be@latin">Animavany kursor Windows</comment>
+ <comment xml:lang="be">анімаваны курсор Windows</comment>
+ <comment xml:lang="ar">مؤشر ويندوز متحرك</comment>
+ <comment xml:lang="af">Windows geanimeerde wyser</comment>
+ <magic>
<match type="string" value="RIFF" offset="0">
<match type="string" value="ACON" offset="8"/>
</match>
@@ -30617,63 +32288,66 @@ command to generate the output files.
</mime-type>
<mime-type type="image/emf">
<comment>EMF image</comment>
- <comment xml:lang="af">EMF-beeld</comment>
- <comment xml:lang="ar">صورة EMF</comment>
- <comment xml:lang="be-Latn">Vyjava EMF</comment>
- <comment xml:lang="bg">Изображение — EMF</comment>
- <comment xml:lang="ca">imatge EMF</comment>
- <comment xml:lang="cs">obrázek EMF</comment>
- <comment xml:lang="da">EMF-billede</comment>
- <comment xml:lang="de">EMF-Bild</comment>
- <comment xml:lang="el">Εικόνα EMF</comment>
- <comment xml:lang="en-GB">EMF image</comment>
- <comment xml:lang="eo">EMF-bildo</comment>
- <comment xml:lang="es">imagen EMF</comment>
- <comment xml:lang="eu">EMF irudia</comment>
- <comment xml:lang="fi">EMF-kuva</comment>
- <comment xml:lang="fo">EMF mynd</comment>
- <comment xml:lang="fr">image EMF</comment>
- <comment xml:lang="fur">imagjin EMF</comment>
- <comment xml:lang="ga">íomhá EMF</comment>
- <comment xml:lang="gl">imaxe EMF</comment>
- <comment xml:lang="he">תמונת EMF</comment>
- <comment xml:lang="hr">EMF slika</comment>
- <comment xml:lang="hu">EMF kép</comment>
- <comment xml:lang="ia">Imagine EMF</comment>
- <comment xml:lang="id">Citra EMF</comment>
- <comment xml:lang="it">Immagine EMF</comment>
- <comment xml:lang="ja">EMF 画像</comment>
- <comment xml:lang="ka">EMF გამოსახულება</comment>
- <comment xml:lang="kk">EMF суреті</comment>
- <comment xml:lang="ko">EMF 그림</comment>
- <comment xml:lang="lt">EMF paveikslėlis</comment>
- <comment xml:lang="lv">EMF attēls</comment>
- <comment xml:lang="nb">EMF-bilde</comment>
- <comment xml:lang="nl">EMF-afbeelding</comment>
- <comment xml:lang="nn">EMF-bilete</comment>
- <comment xml:lang="oc">imatge EMF</comment>
- <comment xml:lang="pl">Obraz EMF</comment>
- <comment xml:lang="pt">imagem EMF</comment>
- <comment xml:lang="pt-BR">Imagem EMF</comment>
- <comment xml:lang="ro">Imagine EMF</comment>
- <comment xml:lang="ru">Изображение EMF</comment>
- <comment xml:lang="sk">Obrázok EMF</comment>
- <comment xml:lang="sl">Slikovna datoteka EMF</comment>
- <comment xml:lang="sq">Figurë EMF</comment>
- <comment xml:lang="sr">ЕМФ слика</comment>
- <comment xml:lang="sv">EMF-bild</comment>
- <comment xml:lang="tr">EMF görüntüsü</comment>
- <comment xml:lang="uk">зображення EMF</comment>
+ <comment xml:lang="zh_TW">EMF 影像</comment>
+ <comment xml:lang="zh_CN">EMF 图像</comment>
<comment xml:lang="vi">Ảnh EMF</comment>
- <comment xml:lang="zh-CN">EMF 图像</comment>
- <comment xml:lang="zh-TW">EMF 影像</comment>
+ <comment xml:lang="uk">зображення EMF</comment>
+ <comment xml:lang="tr">EMF görüntüsü</comment>
+ <comment xml:lang="sv">EMF-bild</comment>
+ <comment xml:lang="sr">ЕМФ слика</comment>
+ <comment xml:lang="sq">figurë EMF</comment>
+ <comment xml:lang="sl">Slikovna datoteka EMF</comment>
+ <comment xml:lang="si">EMF රූපය</comment>
+ <comment xml:lang="sk">Obrázok EMF</comment>
+ <comment xml:lang="ru">Изображение EMF</comment>
+ <comment xml:lang="ro">Imagine EMF</comment>
+ <comment xml:lang="pt_BR">Imagem EMF</comment>
+ <comment xml:lang="pt">imagem EMF</comment>
+ <comment xml:lang="pl">Obraz EMF</comment>
+ <comment xml:lang="oc">imatge EMF</comment>
+ <comment xml:lang="nn">EMF-bilete</comment>
+ <comment xml:lang="nl">EMF-afbeelding</comment>
+ <comment xml:lang="nb">EMF-bilde</comment>
+ <comment xml:lang="lv">EMF attēls</comment>
+ <comment xml:lang="lt">EMF paveikslėlis</comment>
+ <comment xml:lang="ko">EMF 그림</comment>
+ <comment xml:lang="kk">EMF суреті</comment>
+ <comment xml:lang="ka">EMF გამოსახულება</comment>
+ <comment xml:lang="ja">EMF 画像</comment>
+ <comment xml:lang="it">Immagine EMF</comment>
+ <comment xml:lang="is">EMF mynd</comment>
+ <comment xml:lang="id">Citra EMF</comment>
+ <comment xml:lang="ia">Imagine EMF</comment>
+ <comment xml:lang="hu">EMF kép</comment>
+ <comment xml:lang="hr">EMF slika</comment>
+ <comment xml:lang="he">תמונת EMF</comment>
+ <comment xml:lang="gl">imaxe EMF</comment>
+ <comment xml:lang="ga">íomhá EMF</comment>
+ <comment xml:lang="fur">imagjin EMF</comment>
+ <comment xml:lang="fr">image EMF</comment>
+ <comment xml:lang="fo">EMF mynd</comment>
+ <comment xml:lang="fi">EMF-kuva</comment>
+ <comment xml:lang="eu">EMF irudia</comment>
+ <comment xml:lang="es">imagen EMF</comment>
+ <comment xml:lang="eo">EMF-bildo</comment>
+ <comment xml:lang="en_GB">EMF image</comment>
+ <comment xml:lang="el">Εικόνα EMF</comment>
+ <comment xml:lang="de">EMF-Bild</comment>
+ <comment xml:lang="da">EMF-billede</comment>
+ <comment xml:lang="cs">obrázek EMF</comment>
+ <comment xml:lang="ca">imatge EMF</comment>
+ <comment xml:lang="bg">Изображение — EMF</comment>
+ <comment xml:lang="be@latin">Vyjava EMF</comment>
+ <comment xml:lang="be">выява EMF</comment>
+ <comment xml:lang="ar">صورة EMF</comment>
+ <comment xml:lang="af">EMF-beeld</comment>
<acronym>EMF</acronym>
<expanded-acronym>Enhanced MetaFile</expanded-acronym>
<glob pattern="*.emf"/>
<alias type="image/x-emf"/>
<alias type="application/x-emf"/>
<alias type="application/emf"/>
- <magic priority="50">
+ <magic>
<match type="little32" offset="0" value="0x00000001">
<match type="little32" offset="40" value="0x464D4520">
<match type="little32" offset="44" value="0x00010000">
@@ -30685,58 +32359,61 @@ command to generate the output files.
</mime-type>
<mime-type type="image/wmf">
<comment>WMF image</comment>
- <comment xml:lang="af">WMF-beeld</comment>
- <comment xml:lang="ar">صورة WMF</comment>
- <comment xml:lang="be-Latn">Vyjava WMF</comment>
- <comment xml:lang="bg">Изображение — WMF</comment>
- <comment xml:lang="ca">imatge WMF</comment>
- <comment xml:lang="cs">obrázek WMF</comment>
- <comment xml:lang="da">WMF-billede</comment>
- <comment xml:lang="de">WMF-Bild</comment>
- <comment xml:lang="el">Εικόνα WML</comment>
- <comment xml:lang="en-GB">WMF image</comment>
- <comment xml:lang="eo">WMF-bildo</comment>
- <comment xml:lang="es">imagen WMF</comment>
- <comment xml:lang="eu">WMF irudia</comment>
- <comment xml:lang="fi">WMF-kuva</comment>
- <comment xml:lang="fo">WMF mynd</comment>
- <comment xml:lang="fr">image WMF</comment>
- <comment xml:lang="fur">imagjin WMF</comment>
- <comment xml:lang="ga">íomhá WMF</comment>
- <comment xml:lang="gl">imaxe WMF</comment>
- <comment xml:lang="he">תמונת WMF</comment>
- <comment xml:lang="hr">WMF slika</comment>
- <comment xml:lang="hu">WMF kép</comment>
- <comment xml:lang="ia">Imagine WMF</comment>
- <comment xml:lang="id">Citra WMF</comment>
- <comment xml:lang="it">Immagine WMF</comment>
- <comment xml:lang="ja">WMF 画像</comment>
- <comment xml:lang="kk">WMF суреті</comment>
- <comment xml:lang="ko">WMF 그림</comment>
- <comment xml:lang="lt">WMF paveikslėlis</comment>
- <comment xml:lang="lv">WMF attēls</comment>
- <comment xml:lang="nb">WMF-bilde</comment>
- <comment xml:lang="nl">WMF-afbeelding</comment>
- <comment xml:lang="nn">WMF-bilete</comment>
- <comment xml:lang="oc">imatge WMF</comment>
- <comment xml:lang="pl">Obraz WMF</comment>
- <comment xml:lang="pt">imagem WMF</comment>
- <comment xml:lang="pt-BR">Imagem WMF</comment>
- <comment xml:lang="ro">Imagine WMF</comment>
- <comment xml:lang="ru">Изображение WMF</comment>
- <comment xml:lang="sk">Obrázok WMF</comment>
- <comment xml:lang="sl">Slikovna datoteka WMF</comment>
- <comment xml:lang="sq">Figurë WMF</comment>
- <comment xml:lang="sr">ВМФ слика</comment>
- <comment xml:lang="sv">WMF-bild</comment>
- <comment xml:lang="tr">WMF görüntüsü</comment>
- <comment xml:lang="uk">зображення WMF</comment>
+ <comment xml:lang="zh_TW">WMF 影像</comment>
+ <comment xml:lang="zh_CN">WMF 图像</comment>
<comment xml:lang="vi">Ảnh WMF</comment>
- <comment xml:lang="zh-CN">WMF 图像</comment>
- <comment xml:lang="zh-TW">WMF 影像</comment>
+ <comment xml:lang="uk">зображення WMF</comment>
+ <comment xml:lang="tr">WMF görüntüsü</comment>
+ <comment xml:lang="sv">WMF-bild</comment>
+ <comment xml:lang="sr">ВМФ слика</comment>
+ <comment xml:lang="sq">figurë WMF</comment>
+ <comment xml:lang="sl">Slikovna datoteka WMF</comment>
+ <comment xml:lang="si">WMF රූපය</comment>
+ <comment xml:lang="sk">Obrázok WMF</comment>
+ <comment xml:lang="ru">Изображение WMF</comment>
+ <comment xml:lang="ro">Imagine WMF</comment>
+ <comment xml:lang="pt_BR">Imagem WMF</comment>
+ <comment xml:lang="pt">imagem WMF</comment>
+ <comment xml:lang="pl">Obraz WMF</comment>
+ <comment xml:lang="oc">imatge WMF</comment>
+ <comment xml:lang="nn">WMF-bilete</comment>
+ <comment xml:lang="nl">WMF-afbeelding</comment>
+ <comment xml:lang="nb">WMF-bilde</comment>
+ <comment xml:lang="lv">WMF attēls</comment>
+ <comment xml:lang="lt">WMF paveikslėlis</comment>
+ <comment xml:lang="ko">WMF 그림</comment>
+ <comment xml:lang="kk">WMF суреті</comment>
+ <comment xml:lang="ja">WMF 画像</comment>
+ <comment xml:lang="it">Immagine WMF</comment>
+ <comment xml:lang="is">WMF mynd</comment>
+ <comment xml:lang="id">Citra WMF</comment>
+ <comment xml:lang="ia">Imagine WMF</comment>
+ <comment xml:lang="hu">WMF kép</comment>
+ <comment xml:lang="hr">WMF slika</comment>
+ <comment xml:lang="he">תמונת WMF</comment>
+ <comment xml:lang="gl">imaxe WMF</comment>
+ <comment xml:lang="ga">íomhá WMF</comment>
+ <comment xml:lang="fur">imagjin WMF</comment>
+ <comment xml:lang="fr">image WMF</comment>
+ <comment xml:lang="fo">WMF mynd</comment>
+ <comment xml:lang="fi">WMF-kuva</comment>
+ <comment xml:lang="eu">WMF irudia</comment>
+ <comment xml:lang="es">imagen WMF</comment>
+ <comment xml:lang="eo">WMF-bildo</comment>
+ <comment xml:lang="en_GB">WMF image</comment>
+ <comment xml:lang="el">Εικόνα WML</comment>
+ <comment xml:lang="de">WMF-Bild</comment>
+ <comment xml:lang="da">WMF-billede</comment>
+ <comment xml:lang="cs">obrázek WMF</comment>
+ <comment xml:lang="ca">imatge WMF</comment>
+ <comment xml:lang="bg">Изображение — WMF</comment>
+ <comment xml:lang="be@latin">Vyjava WMF</comment>
+ <comment xml:lang="be">выява WMF</comment>
+ <comment xml:lang="ar">صورة WMF</comment>
+ <comment xml:lang="af">WMF-beeld</comment>
<acronym>WMF</acronym>
<expanded-acronym>Windows Metafile</expanded-acronym>
- <magic priority="50">
+ <magic>
<!-- Placeable Metafile Header !-->
<match type="little32" offset="0" value="0x9AC6CDD7">
<!-- Followed by the standard Windows Metafile Header !-->
@@ -30758,1118 +32435,673 @@ command to generate the output files.
</mime-type>
<mime-type type="image/x-xbitmap">
<comment>XBM image</comment>
- <comment xml:lang="af">XBM-beeld</comment>
- <comment xml:lang="ar">صورة XBM</comment>
- <comment xml:lang="be-Latn">Vyjava XBM</comment>
- <comment xml:lang="bg">Изображение — XBM</comment>
- <comment xml:lang="ca">imatge XBM</comment>
- <comment xml:lang="cs">obrázek XBM</comment>
- <comment xml:lang="da">XBM-billede</comment>
- <comment xml:lang="de">XBM-Bild</comment>
- <comment xml:lang="el">Εικόνα XBM</comment>
- <comment xml:lang="en-GB">XBM image</comment>
- <comment xml:lang="eo">XBM-bildo</comment>
- <comment xml:lang="es">imagen XBM</comment>
- <comment xml:lang="eu">XBM irudia</comment>
- <comment xml:lang="fi">XBM-kuva</comment>
- <comment xml:lang="fo">XBM mynd</comment>
- <comment xml:lang="fr">image XBM</comment>
- <comment xml:lang="fur">imagjin XBM</comment>
- <comment xml:lang="ga">íomhá XBM</comment>
- <comment xml:lang="gl">imaxe XBM</comment>
- <comment xml:lang="he">תמונת XBM</comment>
- <comment xml:lang="hr">XBM slika</comment>
- <comment xml:lang="hu">XBM-kép</comment>
- <comment xml:lang="ia">Imagine XBM</comment>
- <comment xml:lang="id">Citra XBM</comment>
- <comment xml:lang="it">Immagine XBM</comment>
- <comment xml:lang="ja">XBM 画像</comment>
- <comment xml:lang="kk">XBM суреті</comment>
- <comment xml:lang="ko">XBM 그림</comment>
- <comment xml:lang="lt">XBM paveikslėlis</comment>
- <comment xml:lang="lv">XBM attēls</comment>
- <comment xml:lang="nb">XBM-bilde</comment>
- <comment xml:lang="nl">XBM-afbeelding</comment>
- <comment xml:lang="nn">XBM-bilete</comment>
- <comment xml:lang="oc">imatge XBM</comment>
- <comment xml:lang="pl">Obraz XBM</comment>
- <comment xml:lang="pt">imagem XBM</comment>
- <comment xml:lang="pt-BR">Imagem XBM</comment>
- <comment xml:lang="ro">Imagine XBM</comment>
- <comment xml:lang="ru">Изображение XBM</comment>
- <comment xml:lang="sk">Obrázok XBM</comment>
- <comment xml:lang="sl">Slikovna datoteka XBM</comment>
- <comment xml:lang="sq">Figurë XBM</comment>
- <comment xml:lang="sr">ИксБМ слика</comment>
- <comment xml:lang="sv">XBM-bild</comment>
- <comment xml:lang="tr">XBM görüntüsü</comment>
- <comment xml:lang="uk">зображення XBM</comment>
+ <comment xml:lang="zh_TW">XBM 影像</comment>
+ <comment xml:lang="zh_CN">XBM 图像</comment>
<comment xml:lang="vi">Ảnh XBM</comment>
- <comment xml:lang="zh-CN">XBM 图像</comment>
- <comment xml:lang="zh-TW">XBM 影像</comment>
+ <comment xml:lang="uk">зображення XBM</comment>
+ <comment xml:lang="tr">XBM görüntüsü</comment>
+ <comment xml:lang="sv">XBM-bild</comment>
+ <comment xml:lang="sr">ИксБМ слика</comment>
+ <comment xml:lang="sq">figurë XBM</comment>
+ <comment xml:lang="sl">Slikovna datoteka XBM</comment>
+ <comment xml:lang="si">XBM රූපය</comment>
+ <comment xml:lang="sk">Obrázok XBM</comment>
+ <comment xml:lang="ru">Изображение XBM</comment>
+ <comment xml:lang="ro">Imagine XBM</comment>
+ <comment xml:lang="pt_BR">Imagem XBM</comment>
+ <comment xml:lang="pt">imagem XBM</comment>
+ <comment xml:lang="pl">Obraz XBM</comment>
+ <comment xml:lang="oc">imatge XBM</comment>
+ <comment xml:lang="nn">XBM-bilete</comment>
+ <comment xml:lang="nl">XBM-afbeelding</comment>
+ <comment xml:lang="nb">XBM-bilde</comment>
+ <comment xml:lang="lv">XBM attēls</comment>
+ <comment xml:lang="lt">XBM paveikslėlis</comment>
+ <comment xml:lang="ko">XBM 그림</comment>
+ <comment xml:lang="kk">XBM суреті</comment>
+ <comment xml:lang="ja">XBM 画像</comment>
+ <comment xml:lang="it">Immagine XBM</comment>
+ <comment xml:lang="is">XBM mynd</comment>
+ <comment xml:lang="id">Citra XBM</comment>
+ <comment xml:lang="ia">Imagine XBM</comment>
+ <comment xml:lang="hu">XBM-kép</comment>
+ <comment xml:lang="hr">XBM slika</comment>
+ <comment xml:lang="he">תמונת XBM</comment>
+ <comment xml:lang="gl">imaxe XBM</comment>
+ <comment xml:lang="ga">íomhá XBM</comment>
+ <comment xml:lang="fur">imagjin XBM</comment>
+ <comment xml:lang="fr">image XBM</comment>
+ <comment xml:lang="fo">XBM mynd</comment>
+ <comment xml:lang="fi">XBM-kuva</comment>
+ <comment xml:lang="eu">XBM irudia</comment>
+ <comment xml:lang="es">imagen XBM</comment>
+ <comment xml:lang="eo">XBM-bildo</comment>
+ <comment xml:lang="en_GB">XBM image</comment>
+ <comment xml:lang="el">Εικόνα XBM</comment>
+ <comment xml:lang="de">XBM-Bild</comment>
+ <comment xml:lang="da">XBM-billede</comment>
+ <comment xml:lang="cs">obrázek XBM</comment>
+ <comment xml:lang="ca">imatge XBM</comment>
+ <comment xml:lang="bg">Изображение — XBM</comment>
+ <comment xml:lang="be@latin">Vyjava XBM</comment>
+ <comment xml:lang="be">выява XBM</comment>
+ <comment xml:lang="ar">صورة XBM</comment>
+ <comment xml:lang="af">XBM-beeld</comment>
<acronym>XBM</acronym>
<expanded-acronym>X BitMap</expanded-acronym>
<glob pattern="*.xbm"/>
</mime-type>
<mime-type type="image/x-xcf">
<comment>GIMP image</comment>
- <comment xml:lang="af">GIMP-beeld</comment>
- <comment xml:lang="ar">صورة GIMP</comment>
- <comment xml:lang="be-Latn">Vyjava GIMP</comment>
- <comment xml:lang="bg">Изображение — GIMP</comment>
- <comment xml:lang="ca">imatge de GIMP</comment>
- <comment xml:lang="cs">obrázek GIMP</comment>
- <comment xml:lang="da">GIMP-billede</comment>
- <comment xml:lang="de">GIMP-Bild</comment>
- <comment xml:lang="el">Εικόνα GIMP</comment>
- <comment xml:lang="en-GB">GIMP image</comment>
- <comment xml:lang="eo">GIMP-bildo</comment>
- <comment xml:lang="es">imagen del GIMP</comment>
- <comment xml:lang="eu">GIMP irudia</comment>
- <comment xml:lang="fi">GIMP-kuva</comment>
- <comment xml:lang="fo">GIMP mynd</comment>
- <comment xml:lang="fr">image GIMP</comment>
- <comment xml:lang="fur">imagjin GIMP</comment>
- <comment xml:lang="ga">íomhá GIMP</comment>
- <comment xml:lang="gl">imaxe de GIMP</comment>
- <comment xml:lang="he">תמונת GIMP</comment>
- <comment xml:lang="hr">GIMP slika</comment>
- <comment xml:lang="hu">GIMP-kép</comment>
- <comment xml:lang="ia">Imagine GIMP</comment>
- <comment xml:lang="id">Citra GIMP</comment>
- <comment xml:lang="it">Immagine GIMP</comment>
- <comment xml:lang="ja">GIMP 画像</comment>
- <comment xml:lang="ka">GIMP გამოსახულება</comment>
- <comment xml:lang="kk">GIMP суреті</comment>
- <comment xml:lang="ko">GIMP 그림</comment>
- <comment xml:lang="lt">GIMP paveikslėlis</comment>
- <comment xml:lang="lv">GIMP attēls</comment>
- <comment xml:lang="ms">Imej GIMP</comment>
- <comment xml:lang="nb">GIMP-bilde</comment>
- <comment xml:lang="nl">GIMP-afbeelding</comment>
- <comment xml:lang="nn">GIMP-bilete</comment>
- <comment xml:lang="oc">imatge GIMP</comment>
- <comment xml:lang="pl">Obraz GIMP</comment>
- <comment xml:lang="pt">imagem GIMP</comment>
- <comment xml:lang="pt-BR">Imagem do GIMP</comment>
- <comment xml:lang="ro">Imagine GIMP</comment>
- <comment xml:lang="ru">Изображение GIMP</comment>
- <comment xml:lang="sk">Obrázok GIMP</comment>
- <comment xml:lang="sl">Slikovna datoteka GIMP</comment>
- <comment xml:lang="sq">Figurë GIMP</comment>
- <comment xml:lang="sr">Гимпова слика</comment>
- <comment xml:lang="sv">GIMP-bild</comment>
- <comment xml:lang="tr">GIMP görüntüsü</comment>
- <comment xml:lang="uk">зображення GIMP</comment>
+ <comment xml:lang="zh_TW">GIMP 影像</comment>
+ <comment xml:lang="zh_CN">GIMP 图像</comment>
<comment xml:lang="vi">Ảnh GIMP</comment>
- <comment xml:lang="zh-CN">GIMP 图像</comment>
- <comment xml:lang="zh-TW">GIMP 影像</comment>
+ <comment xml:lang="uk">зображення GIMP</comment>
+ <comment xml:lang="tr">GIMP görüntüsü</comment>
+ <comment xml:lang="sv">GIMP-bild</comment>
+ <comment xml:lang="sr">Гимпова слика</comment>
+ <comment xml:lang="sq">figurë GIMP</comment>
+ <comment xml:lang="sl">Slikovna datoteka GIMP</comment>
+ <comment xml:lang="si">GIMP රූපය</comment>
+ <comment xml:lang="sk">Obrázok GIMP</comment>
+ <comment xml:lang="ru">Изображение GIMP</comment>
+ <comment xml:lang="ro">Imagine GIMP</comment>
+ <comment xml:lang="pt_BR">Imagem do GIMP</comment>
+ <comment xml:lang="pt">imagem GIMP</comment>
+ <comment xml:lang="pl">Obraz GIMP</comment>
+ <comment xml:lang="oc">imatge GIMP</comment>
+ <comment xml:lang="nn">GIMP-bilete</comment>
+ <comment xml:lang="nl">GIMP-afbeelding</comment>
+ <comment xml:lang="nb">GIMP-bilde</comment>
+ <comment xml:lang="ms">Imej GIMP</comment>
+ <comment xml:lang="lv">GIMP attēls</comment>
+ <comment xml:lang="lt">GIMP paveikslėlis</comment>
+ <comment xml:lang="ko">GIMP 그림</comment>
+ <comment xml:lang="kk">GIMP суреті</comment>
+ <comment xml:lang="ka">GIMP გამოსახულება</comment>
+ <comment xml:lang="ja">GIMP 画像</comment>
+ <comment xml:lang="it">Immagine GIMP</comment>
+ <comment xml:lang="is">GIMP mynd</comment>
+ <comment xml:lang="id">Citra GIMP</comment>
+ <comment xml:lang="ia">Imagine GIMP</comment>
+ <comment xml:lang="hu">GIMP-kép</comment>
+ <comment xml:lang="hr">GIMP slika</comment>
+ <comment xml:lang="he">תמונת GIMP</comment>
+ <comment xml:lang="gl">imaxe de GIMP</comment>
+ <comment xml:lang="ga">íomhá GIMP</comment>
+ <comment xml:lang="fur">imagjin GIMP</comment>
+ <comment xml:lang="fr">image GIMP</comment>
+ <comment xml:lang="fo">GIMP mynd</comment>
+ <comment xml:lang="fi">GIMP-kuva</comment>
+ <comment xml:lang="eu">GIMP irudia</comment>
+ <comment xml:lang="es">imagen del GIMP</comment>
+ <comment xml:lang="eo">GIMP-bildo</comment>
+ <comment xml:lang="en_GB">GIMP image</comment>
+ <comment xml:lang="el">Εικόνα GIMP</comment>
+ <comment xml:lang="de">GIMP-Bild</comment>
+ <comment xml:lang="da">GIMP-billede</comment>
+ <comment xml:lang="cs">obrázek GIMP</comment>
+ <comment xml:lang="ca">imatge de GIMP</comment>
+ <comment xml:lang="bg">Изображение — GIMP</comment>
+ <comment xml:lang="be@latin">Vyjava GIMP</comment>
+ <comment xml:lang="be">выява GIMP</comment>
+ <comment xml:lang="ar">صورة GIMP</comment>
+ <comment xml:lang="af">GIMP-beeld</comment>
<glob pattern="*.xcf"/>
- <magic priority="50">
+ <magic>
<match type="string" value="gimp xcf file" offset="0"/>
<match type="string" value="gimp xcf v" offset="0"/>
</magic>
</mime-type>
<mime-type type="image/x-gimp-gbr">
<comment>GIMP brush</comment>
- <comment xml:lang="af">GIMP-kwas</comment>
- <comment xml:lang="bg">Четка — GIMP</comment>
- <comment xml:lang="ca">pinzell de GIMP</comment>
- <comment xml:lang="cs">štětec GIMP</comment>
- <comment xml:lang="da">GIMP-pensel</comment>
- <comment xml:lang="de">GIMP-Pinsel</comment>
- <comment xml:lang="en-GB">GIMP brush</comment>
- <comment xml:lang="es">pincel del GIMP</comment>
- <comment xml:lang="eu">GIMP pintzela</comment>
- <comment xml:lang="fi">GIMP-sivellin</comment>
- <comment xml:lang="fr">brosse GIMP</comment>
- <comment xml:lang="fur">pinel GIMP</comment>
- <comment xml:lang="ga">scuab GIMP</comment>
- <comment xml:lang="hr">GIMP kist</comment>
- <comment xml:lang="hu">GIMP ecset</comment>
- <comment xml:lang="id">Kuas GIMP</comment>
- <comment xml:lang="it">Pennello GIMP</comment>
- <comment xml:lang="kk">GIMP бояу жаққышы</comment>
- <comment xml:lang="ko">GIMP 붓</comment>
- <comment xml:lang="pl">Pędzel programu GIMP</comment>
- <comment xml:lang="pt-BR">Pincel do GIMP</comment>
- <comment xml:lang="ru">Кисть GIMP</comment>
- <comment xml:lang="sk">Štetec aplikácie GIMP</comment>
- <comment xml:lang="sl">Čopič GIMP</comment>
- <comment xml:lang="sv">GIMP-pensel</comment>
- <comment xml:lang="tr">GIMP fırçası</comment>
+ <comment xml:lang="zh_TW">GIMP 筆刷</comment>
+ <comment xml:lang="zh_CN">GIMP 笔刷</comment>
<comment xml:lang="uk">пензель GIMP</comment>
- <comment xml:lang="zh-CN">GIMP 笔刷</comment>
- <comment xml:lang="zh-TW">GIMP 筆刷</comment>
+ <comment xml:lang="tr">GIMP fırçası</comment>
+ <comment xml:lang="sv">GIMP-pensel</comment>
+ <comment xml:lang="sq">penel GIMP</comment>
+ <comment xml:lang="sl">Čopič GIMP</comment>
+ <comment xml:lang="si">GIMP බුරුසුව</comment>
+ <comment xml:lang="sk">Štetec aplikácie GIMP</comment>
+ <comment xml:lang="ru">Кисть GIMP</comment>
+ <comment xml:lang="pt_BR">Pincel do GIMP</comment>
+ <comment xml:lang="pl">Pędzel programu GIMP</comment>
+ <comment xml:lang="nl">GIMP-kwast</comment>
+ <comment xml:lang="ko">GIMP 붓</comment>
+ <comment xml:lang="kk">GIMP бояу жаққышы</comment>
+ <comment xml:lang="ka">GIMP-ის ფუნჯი</comment>
+ <comment xml:lang="ja">GIMP ブラシ</comment>
+ <comment xml:lang="it">Pennello GIMP</comment>
+ <comment xml:lang="is">GIMP-pensill</comment>
+ <comment xml:lang="id">Kuas GIMP</comment>
+ <comment xml:lang="hu">GIMP ecset</comment>
+ <comment xml:lang="hr">GIMP kist</comment>
+ <comment xml:lang="he">מברשת GIMP</comment>
+ <comment xml:lang="gl">Pincel de GIMP</comment>
+ <comment xml:lang="ga">scuab GIMP</comment>
+ <comment xml:lang="fur">pinel GIMP</comment>
+ <comment xml:lang="fr">brosse GIMP</comment>
+ <comment xml:lang="fi">GIMP-sivellin</comment>
+ <comment xml:lang="eu">GIMP pintzela</comment>
+ <comment xml:lang="es">pincel del GIMP</comment>
+ <comment xml:lang="en_GB">GIMP brush</comment>
+ <comment xml:lang="de">GIMP-Pinsel</comment>
+ <comment xml:lang="da">GIMP-pensel</comment>
+ <comment xml:lang="cs">štětec GIMP</comment>
+ <comment xml:lang="ca">pinzell de GIMP</comment>
+ <comment xml:lang="bg">Четка — GIMP</comment>
+ <comment xml:lang="be">пэндзаль GIMP</comment>
+ <comment xml:lang="ar">فرشاة جمب</comment>
+ <comment xml:lang="af">GIMP-kwas</comment>
<glob pattern="*.gbr"/>
- <magic priority="50">
+ <magic>
<match type="string" value="GIMP" offset="20"/>
</magic>
</mime-type>
<mime-type type="image/x-gimp-gih">
<comment>GIMP brush pipe</comment>
- <comment xml:lang="bg">Конвейер с четки — GIMP</comment>
- <comment xml:lang="ca">conducte del pinzell de GIMP</comment>
- <comment xml:lang="cs">zřetězení štětců GIMP</comment>
- <comment xml:lang="da">GIMP-penselrør</comment>
- <comment xml:lang="de">GIMP-Pinselanimation</comment>
- <comment xml:lang="en-GB">GIMP brush pipe</comment>
- <comment xml:lang="es">pincel animado del GIMP</comment>
- <comment xml:lang="eu">GIMP pintzel hodia pipe</comment>
- <comment xml:lang="fi">GIMP-sivellinputki</comment>
- <comment xml:lang="fr">brosse animée GIMP</comment>
- <comment xml:lang="fur">condot pinel GIMP</comment>
- <comment xml:lang="ga">píopa scuaba GIMP</comment>
- <comment xml:lang="hr">Proces GIMP kista</comment>
- <comment xml:lang="hu">GIMP ecsetcsatorna</comment>
- <comment xml:lang="id">Pipa kuas GIMP</comment>
- <comment xml:lang="it">Pipe pennello GIMP</comment>
- <comment xml:lang="kk">GIMP бояу жаққыш түтігі</comment>
- <comment xml:lang="ko">GIMP 붓 파이프</comment>
- <comment xml:lang="pl">Potok pędzla programu GIMP</comment>
- <comment xml:lang="pt-BR">Tubo de pincel do GIMP</comment>
- <comment xml:lang="ru">Анимированная кисть GIMP</comment>
- <comment xml:lang="sv">GIMP-penselrör</comment>
- <comment xml:lang="tr">GIMP fırça borusu</comment>
+ <comment xml:lang="zh_TW">GIMP 筆刷導管</comment>
+ <comment xml:lang="zh_CN">GIMP 管刷</comment>
<comment xml:lang="uk">канал пензлів GIMP</comment>
- <comment xml:lang="zh-CN">GIMP 管刷</comment>
- <comment xml:lang="zh-TW">GIMP 筆刷導管</comment>
+ <comment xml:lang="tr">GIMP fırça borusu</comment>
+ <comment xml:lang="sv">GIMP-penselrör</comment>
+ <comment xml:lang="si">GIMP බුරුසු පයිප්ප</comment>
+ <comment xml:lang="ru">Анимированная кисть GIMP</comment>
+ <comment xml:lang="pt_BR">Tubo de pincel do GIMP</comment>
+ <comment xml:lang="pl">Potok pędzla programu GIMP</comment>
+ <comment xml:lang="nl">GIMP-kwast-pijp</comment>
+ <comment xml:lang="ko">GIMP 붓 파이프</comment>
+ <comment xml:lang="kk">GIMP бояу жаққыш түтігі</comment>
+ <comment xml:lang="ja">GIMP パイプブラシ</comment>
+ <comment xml:lang="it">Pipe pennello GIMP</comment>
+ <comment xml:lang="is">GIMP-pensilpípa</comment>
+ <comment xml:lang="id">Pipa kuas GIMP</comment>
+ <comment xml:lang="hu">GIMP ecsetcsatorna</comment>
+ <comment xml:lang="hr">Proces GIMP kista</comment>
+ <comment xml:lang="he">צינורית מברשת GIMP</comment>
+ <comment xml:lang="ga">píopa scuaba GIMP</comment>
+ <comment xml:lang="fur">condot pinel GIMP</comment>
+ <comment xml:lang="fr">brosse animée GIMP</comment>
+ <comment xml:lang="fi">GIMP-sivellinputki</comment>
+ <comment xml:lang="eu">GIMP pintzel hodia pipe</comment>
+ <comment xml:lang="es">pincel animado del GIMP</comment>
+ <comment xml:lang="en_GB">GIMP brush pipe</comment>
+ <comment xml:lang="de">Animierter GIMP-Pinsel</comment>
+ <comment xml:lang="da">GIMP-penselrør</comment>
+ <comment xml:lang="cs">zřetězení štětců GIMP</comment>
+ <comment xml:lang="ca">conducte del pinzell de GIMP</comment>
+ <comment xml:lang="bg">Конвейер с четки — GIMP</comment>
+ <comment xml:lang="be">самаробны пэндзаль GIMP</comment>
+ <comment xml:lang="ar">أنبوب فرشاة GIMP</comment>
<glob pattern="*.gih"/>
</mime-type>
<mime-type type="image/x-gimp-pat">
<comment>GIMP pattern</comment>
- <comment xml:lang="af">GIMP-patroon</comment>
- <comment xml:lang="bg">Шарка — GIMP</comment>
- <comment xml:lang="ca">patró de GIMP</comment>
- <comment xml:lang="cs">vzorek GIMP</comment>
- <comment xml:lang="da">GIMP-mønster</comment>
- <comment xml:lang="de">GIMP-Muster</comment>
- <comment xml:lang="en-GB">GIMP pattern</comment>
- <comment xml:lang="es">patrón del GIMP</comment>
- <comment xml:lang="eu">GIMP eredua</comment>
- <comment xml:lang="fi">GIMP-kuvio</comment>
- <comment xml:lang="fr">motif GIMP</comment>
- <comment xml:lang="fur">motîf GIMP</comment>
- <comment xml:lang="ga">patrún GIMP</comment>
- <comment xml:lang="hr">GIMP uzorak</comment>
- <comment xml:lang="hu">GIMP minta</comment>
- <comment xml:lang="id">Pola GIMP</comment>
- <comment xml:lang="it">Motivo GIMP</comment>
- <comment xml:lang="kk">GIMP оюы</comment>
- <comment xml:lang="ko">GIMP 패턴</comment>
- <comment xml:lang="pl">Deseń programu GIMP</comment>
- <comment xml:lang="pt-BR">Textura do GIMP</comment>
- <comment xml:lang="ru">Шаблон GIMP</comment>
- <comment xml:lang="sk">Vzor aplikácie GIMP</comment>
- <comment xml:lang="sl">Vzorec GIMP</comment>
- <comment xml:lang="sv">GIMP-mönster</comment>
- <comment xml:lang="tr">GIMP deseni</comment>
+ <comment xml:lang="zh_TW">GIMP 樣式</comment>
+ <comment xml:lang="zh_CN">GIMP 图案</comment>
<comment xml:lang="uk">візерунок GIMP</comment>
- <comment xml:lang="zh-CN">GIMP 图案</comment>
- <comment xml:lang="zh-TW">GIMP 樣式</comment>
+ <comment xml:lang="tr">GIMP deseni</comment>
+ <comment xml:lang="sv">GIMP-mönster</comment>
+ <comment xml:lang="sl">Vzorec GIMP</comment>
+ <comment xml:lang="si">GIMP රටාව</comment>
+ <comment xml:lang="sk">Vzor aplikácie GIMP</comment>
+ <comment xml:lang="ru">Шаблон GIMP</comment>
+ <comment xml:lang="pt_BR">Textura do GIMP</comment>
+ <comment xml:lang="pl">Deseń programu GIMP</comment>
+ <comment xml:lang="nl">GIMP-patroon</comment>
+ <comment xml:lang="ko">GIMP 패턴</comment>
+ <comment xml:lang="kk">GIMP оюы</comment>
+ <comment xml:lang="ka">GIMP შაბლონი</comment>
+ <comment xml:lang="ja">GIMP パターン</comment>
+ <comment xml:lang="it">Motivo GIMP</comment>
+ <comment xml:lang="is">GIMP-mynstur</comment>
+ <comment xml:lang="id">Pola GIMP</comment>
+ <comment xml:lang="hu">GIMP minta</comment>
+ <comment xml:lang="hr">GIMP uzorak</comment>
+ <comment xml:lang="he">מרקם של GIMP</comment>
+ <comment xml:lang="gl">Patrón de GIMP</comment>
+ <comment xml:lang="ga">patrún GIMP</comment>
+ <comment xml:lang="fur">motîf GIMP</comment>
+ <comment xml:lang="fr">motif GIMP</comment>
+ <comment xml:lang="fi">GIMP-kuvio</comment>
+ <comment xml:lang="eu">GIMP eredua</comment>
+ <comment xml:lang="es">patrón del GIMP</comment>
+ <comment xml:lang="en_GB">GIMP pattern</comment>
+ <comment xml:lang="de">GIMP-Muster</comment>
+ <comment xml:lang="da">GIMP-mønster</comment>
+ <comment xml:lang="cs">vzorek GIMP</comment>
+ <comment xml:lang="ca">patró de GIMP</comment>
+ <comment xml:lang="bg">Шарка — GIMP</comment>
+ <comment xml:lang="be">узор GIMP</comment>
+ <comment xml:lang="ar">نقش GIMP</comment>
+ <comment xml:lang="af">GIMP-patroon</comment>
<glob pattern="*.pat"/>
- <magic priority="50">
+ <magic>
<match type="string" value="GPAT" offset="20"/>
</magic>
</mime-type>
<mime-type type="image/x-xfig">
<comment>XFig image</comment>
- <comment xml:lang="af">XFig-beeld</comment>
- <comment xml:lang="ar">صورة XFig</comment>
- <comment xml:lang="be-Latn">Vyjava XFig</comment>
- <comment xml:lang="bg">Изображение — XFig</comment>
- <comment xml:lang="ca">imatge de XFig</comment>
- <comment xml:lang="cs">obrázek XFig</comment>
- <comment xml:lang="da">XFig-billede</comment>
- <comment xml:lang="de">XFig-Bild</comment>
- <comment xml:lang="el">Εικόνα XFig</comment>
- <comment xml:lang="en-GB">XFig image</comment>
- <comment xml:lang="eo">XFig-bildo</comment>
- <comment xml:lang="es">imagen de XFig</comment>
- <comment xml:lang="eu">XFig irudia</comment>
- <comment xml:lang="fi">XFig-kuva</comment>
- <comment xml:lang="fo">XFig mynd</comment>
- <comment xml:lang="fr">image XFig</comment>
- <comment xml:lang="fur">imagjin XFig</comment>
- <comment xml:lang="ga">íomhá XFig</comment>
- <comment xml:lang="gl">imaxe de XFig</comment>
- <comment xml:lang="he">תמונת XFig</comment>
- <comment xml:lang="hr">XFig slika</comment>
- <comment xml:lang="hu">XFig-kép</comment>
- <comment xml:lang="ia">Imagine XFig</comment>
- <comment xml:lang="id">Citra XFig</comment>
- <comment xml:lang="it">Immagine XFig</comment>
- <comment xml:lang="ja">XFig 画像</comment>
- <comment xml:lang="kk">XFig суреті</comment>
- <comment xml:lang="ko">XFig 그림</comment>
- <comment xml:lang="lt">XFig paveikslėlis</comment>
- <comment xml:lang="lv">XFig attēls</comment>
- <comment xml:lang="ms">Imej XFig</comment>
- <comment xml:lang="nb">XFig-bilde</comment>
- <comment xml:lang="nl">XFig-afbeelding</comment>
- <comment xml:lang="nn">XFig-bilete</comment>
- <comment xml:lang="oc">imatge XFig</comment>
- <comment xml:lang="pl">Obraz XFig</comment>
- <comment xml:lang="pt">imagem XFig</comment>
- <comment xml:lang="pt-BR">Imagem do XFig</comment>
- <comment xml:lang="ro">Imagine XFig</comment>
- <comment xml:lang="ru">Изображение XFig</comment>
- <comment xml:lang="sk">Obrázok XFig</comment>
- <comment xml:lang="sl">Slikovna datoteka XFig</comment>
- <comment xml:lang="sq">Figurë XFig</comment>
- <comment xml:lang="sr">ИксФиг слика</comment>
- <comment xml:lang="sv">XFig-bild</comment>
- <comment xml:lang="tr">XFig görüntüsü</comment>
- <comment xml:lang="uk">зображення XFig</comment>
+ <comment xml:lang="zh_TW">XFig 影像</comment>
+ <comment xml:lang="zh_CN">XFig 图像</comment>
<comment xml:lang="vi">Ảnh XFig</comment>
- <comment xml:lang="zh-CN">XFig 图像</comment>
- <comment xml:lang="zh-TW">XFig 影像</comment>
+ <comment xml:lang="uk">зображення XFig</comment>
+ <comment xml:lang="tr">XFig görüntüsü</comment>
+ <comment xml:lang="sv">XFig-bild</comment>
+ <comment xml:lang="sr">ИксФиг слика</comment>
+ <comment xml:lang="sq">figurë XFig</comment>
+ <comment xml:lang="sl">Slikovna datoteka XFig</comment>
+ <comment xml:lang="si">XFig රූපය</comment>
+ <comment xml:lang="sk">Obrázok XFig</comment>
+ <comment xml:lang="ru">Изображение XFig</comment>
+ <comment xml:lang="ro">Imagine XFig</comment>
+ <comment xml:lang="pt_BR">Imagem do XFig</comment>
+ <comment xml:lang="pt">imagem XFig</comment>
+ <comment xml:lang="pl">Obraz XFig</comment>
+ <comment xml:lang="oc">imatge XFig</comment>
+ <comment xml:lang="nn">XFig-bilete</comment>
+ <comment xml:lang="nl">XFig-afbeelding</comment>
+ <comment xml:lang="nb">XFig-bilde</comment>
+ <comment xml:lang="ms">Imej XFig</comment>
+ <comment xml:lang="lv">XFig attēls</comment>
+ <comment xml:lang="lt">XFig paveikslėlis</comment>
+ <comment xml:lang="ko">XFig 그림</comment>
+ <comment xml:lang="kk">XFig суреті</comment>
+ <comment xml:lang="ja">XFig 画像</comment>
+ <comment xml:lang="it">Immagine XFig</comment>
+ <comment xml:lang="is">XFig mynd</comment>
+ <comment xml:lang="id">Citra XFig</comment>
+ <comment xml:lang="ia">Imagine XFig</comment>
+ <comment xml:lang="hu">XFig-kép</comment>
+ <comment xml:lang="hr">XFig slika</comment>
+ <comment xml:lang="he">תמונת XFig</comment>
+ <comment xml:lang="gl">imaxe de XFig</comment>
+ <comment xml:lang="ga">íomhá XFig</comment>
+ <comment xml:lang="fur">imagjin XFig</comment>
+ <comment xml:lang="fr">image XFig</comment>
+ <comment xml:lang="fo">XFig mynd</comment>
+ <comment xml:lang="fi">XFig-kuva</comment>
+ <comment xml:lang="eu">XFig irudia</comment>
+ <comment xml:lang="es">imagen de XFig</comment>
+ <comment xml:lang="eo">XFig-bildo</comment>
+ <comment xml:lang="en_GB">XFig image</comment>
+ <comment xml:lang="el">Εικόνα XFig</comment>
+ <comment xml:lang="de">XFig-Bild</comment>
+ <comment xml:lang="da">XFig-billede</comment>
+ <comment xml:lang="cs">obrázek XFig</comment>
+ <comment xml:lang="ca">imatge de XFig</comment>
+ <comment xml:lang="bg">Изображение — XFig</comment>
+ <comment xml:lang="be@latin">Vyjava XFig</comment>
+ <comment xml:lang="be">выява XFig</comment>
+ <comment xml:lang="ar">صورة XFig</comment>
+ <comment xml:lang="af">XFig-beeld</comment>
<glob pattern="*.fig"/>
- <magic priority="50">
+ <magic>
<match type="string" value="#FIG" offset="0"/>
</magic>
</mime-type>
<mime-type type="image/x-xpixmap">
<comment>XPM image</comment>
- <comment xml:lang="af">XPM-beeld</comment>
- <comment xml:lang="ar">صورة XPM</comment>
- <comment xml:lang="be-Latn">Vyjava XPM</comment>
- <comment xml:lang="bg">Изображение — XPM</comment>
- <comment xml:lang="ca">imatge XPM</comment>
- <comment xml:lang="cs">obrázek XPM</comment>
- <comment xml:lang="cy">Delwedd XPM</comment>
- <comment xml:lang="da">XPM-billede</comment>
- <comment xml:lang="de">XPM-Bild</comment>
- <comment xml:lang="el">Εικόνα XPM</comment>
- <comment xml:lang="en-GB">XPM image</comment>
- <comment xml:lang="eo">XPM-bildo</comment>
- <comment xml:lang="es">imagen XPM</comment>
- <comment xml:lang="eu">XPM irudia</comment>
- <comment xml:lang="fi">XPM-kuva</comment>
- <comment xml:lang="fo">XPM mynd</comment>
- <comment xml:lang="fr">image XPM</comment>
- <comment xml:lang="fur">imagjin XPM</comment>
- <comment xml:lang="ga">íomhá XPM</comment>
- <comment xml:lang="gl">imaxe XPM</comment>
- <comment xml:lang="he">תמונת XPM</comment>
- <comment xml:lang="hr">XPM slika</comment>
- <comment xml:lang="hu">XPM kép</comment>
- <comment xml:lang="ia">Imagine XPM</comment>
- <comment xml:lang="id">Citra XPM</comment>
- <comment xml:lang="it">Immagine XPM</comment>
- <comment xml:lang="ja">XPM 画像</comment>
- <comment xml:lang="kk">XPM суреті</comment>
- <comment xml:lang="ko">XPM 그림</comment>
- <comment xml:lang="lt">XPM paveikslėlis</comment>
- <comment xml:lang="lv">XPM attēls</comment>
- <comment xml:lang="nb">XPM-bilde</comment>
- <comment xml:lang="nl">XPM-afbeelding</comment>
- <comment xml:lang="nn">XPM-bilete</comment>
- <comment xml:lang="oc">imatge XPM</comment>
- <comment xml:lang="pl">Obraz XPM</comment>
- <comment xml:lang="pt">imagem XPM</comment>
- <comment xml:lang="pt-BR">Imagem XPM</comment>
- <comment xml:lang="ro">Imagine XPM</comment>
- <comment xml:lang="ru">Изображение XPM</comment>
- <comment xml:lang="sk">Obrázok XPM</comment>
- <comment xml:lang="sl">Slikovna datoteka XPM</comment>
- <comment xml:lang="sq">Figurë XPM</comment>
- <comment xml:lang="sr">ИксПМ слика</comment>
- <comment xml:lang="sv">XPM-bild</comment>
- <comment xml:lang="tr">XPM görüntüsü</comment>
- <comment xml:lang="uk">зображення XPM</comment>
+ <comment xml:lang="zh_TW">XPM 影像</comment>
+ <comment xml:lang="zh_CN">XPM 图像</comment>
<comment xml:lang="vi">Ảnh XPM</comment>
- <comment xml:lang="zh-CN">XPM 图像</comment>
- <comment xml:lang="zh-TW">XPM 影像</comment>
+ <comment xml:lang="uk">зображення XPM</comment>
+ <comment xml:lang="tr">XPM görüntüsü</comment>
+ <comment xml:lang="sv">XPM-bild</comment>
+ <comment xml:lang="sr">ИксПМ слика</comment>
+ <comment xml:lang="sq">figurë XPM</comment>
+ <comment xml:lang="sl">Slikovna datoteka XPM</comment>
+ <comment xml:lang="si">XPM රූපය</comment>
+ <comment xml:lang="sk">Obrázok XPM</comment>
+ <comment xml:lang="ru">Изображение XPM</comment>
+ <comment xml:lang="ro">Imagine XPM</comment>
+ <comment xml:lang="pt_BR">Imagem XPM</comment>
+ <comment xml:lang="pt">imagem XPM</comment>
+ <comment xml:lang="pl">Obraz XPM</comment>
+ <comment xml:lang="oc">imatge XPM</comment>
+ <comment xml:lang="nn">XPM-bilete</comment>
+ <comment xml:lang="nl">XPM-afbeelding</comment>
+ <comment xml:lang="nb">XPM-bilde</comment>
+ <comment xml:lang="lv">XPM attēls</comment>
+ <comment xml:lang="lt">XPM paveikslėlis</comment>
+ <comment xml:lang="ko">XPM 그림</comment>
+ <comment xml:lang="kk">XPM суреті</comment>
+ <comment xml:lang="ja">XPM 画像</comment>
+ <comment xml:lang="it">Immagine XPM</comment>
+ <comment xml:lang="is">XPM mynd</comment>
+ <comment xml:lang="id">Citra XPM</comment>
+ <comment xml:lang="ia">Imagine XPM</comment>
+ <comment xml:lang="hu">XPM kép</comment>
+ <comment xml:lang="hr">XPM slika</comment>
+ <comment xml:lang="he">תמונת XPM</comment>
+ <comment xml:lang="gl">imaxe XPM</comment>
+ <comment xml:lang="ga">íomhá XPM</comment>
+ <comment xml:lang="fur">imagjin XPM</comment>
+ <comment xml:lang="fr">image XPM</comment>
+ <comment xml:lang="fo">XPM mynd</comment>
+ <comment xml:lang="fi">XPM-kuva</comment>
+ <comment xml:lang="eu">XPM irudia</comment>
+ <comment xml:lang="es">imagen XPM</comment>
+ <comment xml:lang="eo">XPM-bildo</comment>
+ <comment xml:lang="en_GB">XPM image</comment>
+ <comment xml:lang="el">Εικόνα XPM</comment>
+ <comment xml:lang="de">XPM-Bild</comment>
+ <comment xml:lang="da">XPM-billede</comment>
+ <comment xml:lang="cy">Delwedd XPM</comment>
+ <comment xml:lang="cs">obrázek XPM</comment>
+ <comment xml:lang="ca">imatge XPM</comment>
+ <comment xml:lang="bg">Изображение — XPM</comment>
+ <comment xml:lang="be@latin">Vyjava XPM</comment>
+ <comment xml:lang="be">выява XPM</comment>
+ <comment xml:lang="ar">صورة XPM</comment>
+ <comment xml:lang="af">XPM-beeld</comment>
<acronym>XPM</acronym>
<expanded-acronym>X PixMap</expanded-acronym>
- <magic priority="50">
- <match type="string" value="/* XPM" offset="0"/>
+ <magic>
+ <match type="string" value="/* XPM */" offset="0"/>
+ <match type="string" value="! XPM2\n" offset="0"/>
</magic>
<glob pattern="*.xpm"/>
<alias type="image/x-xpm"/>
</mime-type>
<mime-type type="image/x-xwindowdump">
<comment>X window image</comment>
- <comment xml:lang="af">X window-beeld</comment>
- <comment xml:lang="ar">صورة X window</comment>
- <comment xml:lang="az">X window rəsmi</comment>
- <comment xml:lang="be-Latn">Vyjava vakna X</comment>
- <comment xml:lang="bg">Изображение — X Window</comment>
- <comment xml:lang="ca">imatge de X window</comment>
- <comment xml:lang="cs">obrázek X window</comment>
- <comment xml:lang="cy">Delwedd ffenest X</comment>
- <comment xml:lang="da">X-billede</comment>
- <comment xml:lang="de">X-Window-Bild</comment>
- <comment xml:lang="el">Εικόνα περιβάλλοντος X</comment>
- <comment xml:lang="en-GB">X window image</comment>
- <comment xml:lang="eo">bildo de X window</comment>
- <comment xml:lang="es">imagen de ventana de X</comment>
- <comment xml:lang="eu">X window irudia</comment>
- <comment xml:lang="fi">X-ikkunakuva</comment>
- <comment xml:lang="fo">X vindeyga mynd</comment>
- <comment xml:lang="fr">image X window</comment>
- <comment xml:lang="fur">imagjin X window</comment>
- <comment xml:lang="ga">íomhá X-windows</comment>
- <comment xml:lang="gl">imaxe de X Window</comment>
- <comment xml:lang="he">תמונת חלון של X</comment>
- <comment xml:lang="hr">X window slika</comment>
- <comment xml:lang="hu">X window-kép</comment>
- <comment xml:lang="ia">Imagine X Window</comment>
- <comment xml:lang="id">Citra X window</comment>
- <comment xml:lang="it">Immagine X window</comment>
- <comment xml:lang="ja">X window 画像</comment>
- <comment xml:lang="kk">X window суреті</comment>
- <comment xml:lang="ko">X 윈도 그림</comment>
- <comment xml:lang="lt">X window paveikslėlis</comment>
- <comment xml:lang="lv">X window attēls</comment>
- <comment xml:lang="ms">Imej tetingkap X</comment>
- <comment xml:lang="nb">X-Windows skjermbilde</comment>
- <comment xml:lang="nl">X-window-afbeelding</comment>
- <comment xml:lang="nn">X window bilete</comment>
- <comment xml:lang="oc">imatge X window</comment>
- <comment xml:lang="pl">Obraz X Window</comment>
- <comment xml:lang="pt">imagem de janela X</comment>
- <comment xml:lang="pt-BR">Imagem de janela do X</comment>
- <comment xml:lang="ro">Imagine X window</comment>
- <comment xml:lang="ru">Изображение X window</comment>
- <comment xml:lang="sk">Obrázok X window</comment>
- <comment xml:lang="sl">slika X oken</comment>
- <comment xml:lang="sq">Figurë X window</comment>
- <comment xml:lang="sr">слика Икс прозора</comment>
- <comment xml:lang="sv">X-fönsterbild</comment>
- <comment xml:lang="tr">X pencere görüntüsü</comment>
- <comment xml:lang="uk">зображення X window</comment>
+ <comment xml:lang="zh_TW">X window 影像</comment>
+ <comment xml:lang="zh_CN">X Window 图像</comment>
<comment xml:lang="vi">Ảnh cửa sổ X</comment>
- <comment xml:lang="zh-CN">X Window 图像</comment>
- <comment xml:lang="zh-TW">X window 影像</comment>
+ <comment xml:lang="uk">зображення X window</comment>
+ <comment xml:lang="tr">X pencere görüntüsü</comment>
+ <comment xml:lang="sv">X-fönsterbild</comment>
+ <comment xml:lang="sr">слика Икс прозора</comment>
+ <comment xml:lang="sq">figurë X window</comment>
+ <comment xml:lang="sl">slika X oken</comment>
+ <comment xml:lang="si">X කවුළු රූපය</comment>
+ <comment xml:lang="sk">Obrázok X window</comment>
+ <comment xml:lang="ru">Изображение X window</comment>
+ <comment xml:lang="ro">Imagine X window</comment>
+ <comment xml:lang="pt_BR">Imagem de janela do X</comment>
+ <comment xml:lang="pt">imagem de janela X</comment>
+ <comment xml:lang="pl">Obraz X Window</comment>
+ <comment xml:lang="oc">imatge X window</comment>
+ <comment xml:lang="nn">X window bilete</comment>
+ <comment xml:lang="nl">X-window-afbeelding</comment>
+ <comment xml:lang="nb">X-Windows skjermbilde</comment>
+ <comment xml:lang="ms">Imej tetingkap X</comment>
+ <comment xml:lang="lv">X window attēls</comment>
+ <comment xml:lang="lt">X window paveikslėlis</comment>
+ <comment xml:lang="ko">X 윈도 그림</comment>
+ <comment xml:lang="kk">X window суреті</comment>
+ <comment xml:lang="ja">X window 画像</comment>
+ <comment xml:lang="it">Immagine X window</comment>
+ <comment xml:lang="is">X window mynd</comment>
+ <comment xml:lang="id">Citra X window</comment>
+ <comment xml:lang="ia">Imagine X Window</comment>
+ <comment xml:lang="hu">X window-kép</comment>
+ <comment xml:lang="hr">X window slika</comment>
+ <comment xml:lang="he">תמונת חלון של X</comment>
+ <comment xml:lang="gl">imaxe de X Window</comment>
+ <comment xml:lang="ga">íomhá X-windows</comment>
+ <comment xml:lang="fur">imagjin X window</comment>
+ <comment xml:lang="fr">image X window</comment>
+ <comment xml:lang="fo">X vindeyga mynd</comment>
+ <comment xml:lang="fi">X-ikkunakuva</comment>
+ <comment xml:lang="eu">X window irudia</comment>
+ <comment xml:lang="es">imagen de ventana de X</comment>
+ <comment xml:lang="eo">bildo de X window</comment>
+ <comment xml:lang="en_GB">X window image</comment>
+ <comment xml:lang="el">Εικόνα περιβάλλοντος X</comment>
+ <comment xml:lang="de">X-Window-Bild</comment>
+ <comment xml:lang="da">X-billede</comment>
+ <comment xml:lang="cy">Delwedd ffenest X</comment>
+ <comment xml:lang="cs">obrázek X window</comment>
+ <comment xml:lang="ca">imatge de X window</comment>
+ <comment xml:lang="bg">Изображение — X Window</comment>
+ <comment xml:lang="be@latin">Vyjava vakna X</comment>
+ <comment xml:lang="be">выява X window</comment>
+ <comment xml:lang="az">X window rəsmi</comment>
+ <comment xml:lang="ar">صورة X window</comment>
+ <comment xml:lang="af">X window-beeld</comment>
<glob pattern="*.xwd"/>
</mime-type>
<mime-type type="inode/blockdevice">
- <comment>block device</comment>
- <comment xml:lang="af">bloktoestel</comment>
- <comment xml:lang="ar">جهاز كتلي</comment>
- <comment xml:lang="ast">preséu de bloques</comment>
- <comment xml:lang="be-Latn">blokavaja pryłada</comment>
- <comment xml:lang="bg">Блоково устройство</comment>
- <comment xml:lang="ca">dispositiu de blocs</comment>
- <comment xml:lang="cs">blokové zařízení</comment>
- <comment xml:lang="da">blokenhed</comment>
- <comment xml:lang="de">Blockorientiertes Gerät</comment>
- <comment xml:lang="el">Συσκευή block</comment>
- <comment xml:lang="en-GB">block device</comment>
- <comment xml:lang="eo">bloka disponaĵo</comment>
- <comment xml:lang="es">dispositivo de bloques</comment>
- <comment xml:lang="eu">bloke-gailua</comment>
- <comment xml:lang="fi">laitetiedosto</comment>
- <comment xml:lang="fo">blokka tóleind</comment>
- <comment xml:lang="fr">périphérique de blocs</comment>
- <comment xml:lang="fur">dispositîf a blocs</comment>
- <comment xml:lang="ga">gléas bloc</comment>
- <comment xml:lang="gl">dispositivo de bloque</comment>
- <comment xml:lang="he">התקן בלוק</comment>
- <comment xml:lang="hr">Blokovski uređaj</comment>
- <comment xml:lang="hu">blokkos eszköz</comment>
- <comment xml:lang="ia">Dispositivo de blocos</comment>
- <comment xml:lang="id">peranti blok</comment>
- <comment xml:lang="it">Device a blocchi</comment>
- <comment xml:lang="ja">ブロックデバイス</comment>
- <comment xml:lang="kk">блоктық құрылғысы</comment>
- <comment xml:lang="ko">블록 장치</comment>
- <comment xml:lang="lt">blokinis įrenginys</comment>
- <comment xml:lang="lv">bloka ierīce</comment>
- <comment xml:lang="ms">Peranti blok</comment>
- <comment xml:lang="nb">blokkenhet</comment>
- <comment xml:lang="nl">blok-apparaat</comment>
- <comment xml:lang="nn">blokk-eining</comment>
- <comment xml:lang="oc">periferic de blòts</comment>
- <comment xml:lang="pl">Urządzenie blokowe</comment>
- <comment xml:lang="pt">dispositivo de bloco</comment>
- <comment xml:lang="pt-BR">Dispositivo de bloco</comment>
- <comment xml:lang="ro">dispozitiv bloc</comment>
- <comment xml:lang="ru">Блочное устройство</comment>
- <comment xml:lang="sk">Blokové zariadenie</comment>
- <comment xml:lang="sl">bločna naprava</comment>
- <comment xml:lang="sq">device me blloqe</comment>
- <comment xml:lang="sr">блок уређај</comment>
- <comment xml:lang="sv">blockenhet</comment>
- <comment xml:lang="tr">blok aygıtı</comment>
+ <comment>Block device</comment>
<comment xml:lang="uk">блоковий пристрій</comment>
- <comment xml:lang="vi">thiết bị khối</comment>
- <comment xml:lang="zh-CN">块设备</comment>
- <comment xml:lang="zh-TW">區塊裝置</comment>
+ <comment xml:lang="sv">Blockenhet</comment>
+ <comment xml:lang="ru">Блочное устройство</comment>
+ <comment xml:lang="pl">Urządzenie blokowe</comment>
+ <comment xml:lang="ja">区画様機器</comment>
+ <comment xml:lang="it">Device a blocchi</comment>
+ <comment xml:lang="gl">Dispositivo de bloque</comment>
+ <comment xml:lang="eu">Bloke-gailua</comment>
+ <comment xml:lang="es">dispositivo de bloques</comment>
+ <comment xml:lang="de">Blockorientiertes Gerät</comment>
+ <comment xml:lang="be">блокавая прылада</comment>
</mime-type>
<mime-type type="inode/chardevice">
- <comment>character device</comment>
- <comment xml:lang="af">karaktertoestel</comment>
- <comment xml:lang="ar">جهاز حرفي</comment>
- <comment xml:lang="ast">preséu de caráuteres</comment>
- <comment xml:lang="be-Latn">znakavaja pryłada</comment>
- <comment xml:lang="bg">Символно устройство</comment>
- <comment xml:lang="ca">dispositiu de caràcters</comment>
- <comment xml:lang="cs">znakové zařízení</comment>
- <comment xml:lang="da">tegnenhed</comment>
- <comment xml:lang="de">Zeichenorientiertes Gerät</comment>
- <comment xml:lang="el">Συσκευή χαρακτήρων</comment>
- <comment xml:lang="en-GB">character device</comment>
- <comment xml:lang="eo">signa disponaĵo</comment>
- <comment xml:lang="es">dispositivo de caracteres</comment>
- <comment xml:lang="eu">karaktereen gailua</comment>
- <comment xml:lang="fi">merkkilaite</comment>
- <comment xml:lang="fo">stavatóleind</comment>
- <comment xml:lang="fr">périphérique de caractères</comment>
- <comment xml:lang="fur">dispositîf a caratars</comment>
- <comment xml:lang="ga">gléas carachtar</comment>
- <comment xml:lang="gl">dispositivo de caracter</comment>
- <comment xml:lang="he">התקן תכונה</comment>
- <comment xml:lang="hr">Znakovni uređaj</comment>
- <comment xml:lang="hu">karakteres eszköz</comment>
- <comment xml:lang="ia">Dispositivo de characteres</comment>
- <comment xml:lang="id">peranti karakter</comment>
- <comment xml:lang="it">Device a caratteri</comment>
- <comment xml:lang="ja">キャラクタデバイス</comment>
- <comment xml:lang="kk">символдық құрылғысы</comment>
- <comment xml:lang="ko">문자 장치</comment>
- <comment xml:lang="lt">simbolinis įrenginys</comment>
- <comment xml:lang="lv">rakstzīmju ierīce</comment>
- <comment xml:lang="ms">Peranti aksara</comment>
- <comment xml:lang="nb">tegnenhet</comment>
- <comment xml:lang="nl">byte-apparaat</comment>
- <comment xml:lang="nn">teikneining</comment>
- <comment xml:lang="oc">periferic de caractèrs</comment>
- <comment xml:lang="pl">Urządzenie znakowe</comment>
- <comment xml:lang="pt">dispositivo de caracteres</comment>
- <comment xml:lang="pt-BR">Dispositivo de caractere</comment>
- <comment xml:lang="ro">dispozitiv caracter</comment>
+ <comment>Character device</comment>
+ <comment xml:lang="uk">Символьний пристрій</comment>
+ <comment xml:lang="sv">Teckenenhet</comment>
<comment xml:lang="ru">Символьное устройство</comment>
- <comment xml:lang="sk">Znakové zariadenie</comment>
- <comment xml:lang="sl">znakovna naprava</comment>
- <comment xml:lang="sq">device me karaktere</comment>
- <comment xml:lang="sr">знаковни уређај</comment>
- <comment xml:lang="sv">teckenenhet</comment>
- <comment xml:lang="tr">karakter aygıtı</comment>
- <comment xml:lang="uk">символьний пристрій</comment>
- <comment xml:lang="vi">thiết bị ký tự</comment>
- <comment xml:lang="zh-CN">字符设备</comment>
- <comment xml:lang="zh-TW">字元裝置</comment>
+ <comment xml:lang="pl">Urządzenie znakowe</comment>
+ <comment xml:lang="ja">文字様機器</comment>
+ <comment xml:lang="it">Device a caratteri</comment>
+ <comment xml:lang="gl">Dispositivo de caracter</comment>
+ <comment xml:lang="eu">Karaktere-gailua</comment>
+ <comment xml:lang="es">dispositivo de caracteres</comment>
+ <comment xml:lang="de">Zeichenorientiertes Gerät</comment>
+ <comment xml:lang="be">сімвальная прылада</comment>
</mime-type>
<mime-type type="inode/directory">
- <comment>folder</comment>
- <comment xml:lang="af">gids</comment>
- <comment xml:lang="ar">مجلّد</comment>
- <comment xml:lang="ast">carpeta</comment>
- <comment xml:lang="be-Latn">kataloh</comment>
- <comment xml:lang="bg">Папка</comment>
- <comment xml:lang="ca">carpeta</comment>
- <comment xml:lang="cs">složka</comment>
- <comment xml:lang="da">mappe</comment>
- <comment xml:lang="de">Ordner</comment>
- <comment xml:lang="el">Φάκελος</comment>
- <comment xml:lang="en-GB">folder</comment>
- <comment xml:lang="eo">dosierujo</comment>
- <comment xml:lang="es">carpeta</comment>
- <comment xml:lang="eu">karpeta</comment>
- <comment xml:lang="fi">kansio</comment>
- <comment xml:lang="fo">mappa</comment>
- <comment xml:lang="fr">dossier</comment>
- <comment xml:lang="fur">cartele</comment>
- <comment xml:lang="ga">fillteán</comment>
- <comment xml:lang="gl">cartafol</comment>
- <comment xml:lang="he">תיקייה</comment>
- <comment xml:lang="hr">Mapa</comment>
- <comment xml:lang="hu">mappa</comment>
- <comment xml:lang="ia">Dossier</comment>
- <comment xml:lang="id">folder</comment>
- <comment xml:lang="it">Cartella</comment>
- <comment xml:lang="ja">フォルダー</comment>
- <comment xml:lang="kk">бума</comment>
- <comment xml:lang="ko">폴더</comment>
- <comment xml:lang="lt">aplankas</comment>
- <comment xml:lang="lv">mape</comment>
- <comment xml:lang="ms">Folder</comment>
- <comment xml:lang="nb">mappe</comment>
- <comment xml:lang="nl">map</comment>
- <comment xml:lang="nn">mappe</comment>
- <comment xml:lang="oc">dorsièr</comment>
- <comment xml:lang="pl">Katalog</comment>
- <comment xml:lang="pt">pasta</comment>
- <comment xml:lang="pt-BR">Pasta</comment>
- <comment xml:lang="ro">dosar</comment>
+ <comment>Folder</comment>
+ <comment xml:lang="uk">Тека</comment>
+ <comment xml:lang="sv">Mapp</comment>
<comment xml:lang="ru">Папка</comment>
- <comment xml:lang="sk">Priečinok</comment>
- <comment xml:lang="sl">mapa</comment>
- <comment xml:lang="sq">Kartelë</comment>
- <comment xml:lang="sr">фасцикла</comment>
- <comment xml:lang="sv">mapp</comment>
- <comment xml:lang="tr">dizin</comment>
- <comment xml:lang="uk">тека</comment>
- <comment xml:lang="vi">thư mục</comment>
- <comment xml:lang="zh-CN">文件夹</comment>
- <comment xml:lang="zh-TW">資料夾</comment>
+ <comment xml:lang="pt_BR">Pasta</comment>
+ <comment xml:lang="pl">Katalog</comment>
+ <comment xml:lang="ja">フォルダ</comment>
+ <comment xml:lang="it">Cartella</comment>
+ <comment xml:lang="gl">Cartafol</comment>
+ <comment xml:lang="eu">Karpeta</comment>
+ <comment xml:lang="es">carpeta</comment>
+ <comment xml:lang="de">Ordner</comment>
+ <comment xml:lang="be">папка</comment>
<generic-icon name="folder"/>
<alias type="x-directory/normal"/>
</mime-type>
<mime-type type="inode/fifo">
- <comment>pipe</comment>
- <comment xml:lang="af">pyp</comment>
- <comment xml:lang="ar">إنبوب</comment>
- <comment xml:lang="be-Latn">kanvejer</comment>
- <comment xml:lang="bg">Конвейер</comment>
- <comment xml:lang="ca">conducte</comment>
- <comment xml:lang="cs">roura</comment>
- <comment xml:lang="da">datakanal</comment>
- <comment xml:lang="de">Pipe</comment>
- <comment xml:lang="el">Διοχέτευση</comment>
- <comment xml:lang="en-GB">pipe</comment>
- <comment xml:lang="eo">dukto</comment>
- <comment xml:lang="es">canalización</comment>
- <comment xml:lang="eu">kanalizazioa</comment>
- <comment xml:lang="fi">putki</comment>
- <comment xml:lang="fo">rør</comment>
- <comment xml:lang="fr">tube</comment>
- <comment xml:lang="fur">condot</comment>
- <comment xml:lang="ga">píopa</comment>
- <comment xml:lang="gl">tubería</comment>
- <comment xml:lang="he">צינור</comment>
- <comment xml:lang="hr">Slivnik</comment>
- <comment xml:lang="hu">adatcsatorna</comment>
- <comment xml:lang="ia">Tubo</comment>
- <comment xml:lang="id">pipa</comment>
- <comment xml:lang="it">Pipe</comment>
- <comment xml:lang="ja">パイプ</comment>
- <comment xml:lang="kk">арна</comment>
- <comment xml:lang="ko">파이프</comment>
- <comment xml:lang="lt">konvejeris</comment>
- <comment xml:lang="lv">programmkanāls</comment>
- <comment xml:lang="ms">Paip</comment>
- <comment xml:lang="nb">rør</comment>
- <comment xml:lang="nl">pijp</comment>
- <comment xml:lang="nn">røyr</comment>
- <comment xml:lang="oc">tub</comment>
- <comment xml:lang="pl">Potok</comment>
- <comment xml:lang="pt">canal</comment>
- <comment xml:lang="pt-BR">Pipe</comment>
- <comment xml:lang="ro">canal pipe</comment>
+ <comment>Pipe</comment>
+ <comment xml:lang="uk">Канал</comment>
+ <comment xml:lang="sv">Rör</comment>
<comment xml:lang="ru">Канал</comment>
- <comment xml:lang="sk">Rúra</comment>
- <comment xml:lang="sl">cev</comment>
- <comment xml:lang="sq">Pipe</comment>
- <comment xml:lang="sr">спојка</comment>
- <comment xml:lang="sv">rör</comment>
- <comment xml:lang="tr">boru</comment>
- <comment xml:lang="uk">канал</comment>
- <comment xml:lang="vi">ống dẫn</comment>
- <comment xml:lang="zh-CN">管道</comment>
- <comment xml:lang="zh-TW">管線</comment>
+ <comment xml:lang="pl">Potok</comment>
+ <comment xml:lang="ja">パイプ</comment>
+ <comment xml:lang="it">Pipe</comment>
+ <comment xml:lang="gl">Tubería</comment>
+ <comment xml:lang="eu">Kanalizazioa</comment>
+ <comment xml:lang="es">canalización</comment>
+ <comment xml:lang="de">Weiterleitung</comment>
+ <comment xml:lang="be">канал</comment>
</mime-type>
<mime-type type="inode/mount-point">
- <comment>mount point</comment>
- <comment xml:lang="af">hegpunt</comment>
- <comment xml:lang="ar">نقطة الوصْل</comment>
- <comment xml:lang="ast">puntu de montaxe</comment>
- <comment xml:lang="be-Latn">punkt mantavańnia</comment>
- <comment xml:lang="bg">Точка на монтиране</comment>
- <comment xml:lang="ca">punt de muntatge</comment>
- <comment xml:lang="cs">přípojné místo</comment>
- <comment xml:lang="da">monteringspunkt</comment>
- <comment xml:lang="de">Einhängepunkt</comment>
- <comment xml:lang="el">Σημείο προσάρτησης</comment>
- <comment xml:lang="en-GB">mount point</comment>
- <comment xml:lang="eo">surmetingo</comment>
- <comment xml:lang="es">punto de montaje</comment>
- <comment xml:lang="eu">muntatze-puntua</comment>
- <comment xml:lang="fi">liitospiste</comment>
- <comment xml:lang="fo">ísetingarpunkt</comment>
- <comment xml:lang="fr">point d'accès</comment>
- <comment xml:lang="fur">pont di montaç</comment>
- <comment xml:lang="ga">pointe feistithe</comment>
- <comment xml:lang="gl">punto de montaxe</comment>
- <comment xml:lang="he">נקודת עיגון</comment>
- <comment xml:lang="hr">Točka montiranja</comment>
- <comment xml:lang="hu">csatolási pont</comment>
- <comment xml:lang="ia">Puncto de montage</comment>
- <comment xml:lang="id">titik mount</comment>
- <comment xml:lang="it">Punto di mount</comment>
- <comment xml:lang="ja">マウントポイント</comment>
- <comment xml:lang="kk">тіркеу нүктесі</comment>
- <comment xml:lang="ko">마운트 위치</comment>
- <comment xml:lang="lt">prijungimo taškas</comment>
- <comment xml:lang="lv">montēšanas punkts</comment>
- <comment xml:lang="ms">Titik lekapan</comment>
- <comment xml:lang="nb">monteringspunkt</comment>
- <comment xml:lang="nl">aankoppelingspunt</comment>
- <comment xml:lang="nn">monteringspunkt</comment>
- <comment xml:lang="oc">punt d'accès</comment>
- <comment xml:lang="pl">Punkt montowania</comment>
- <comment xml:lang="pt">ponto de montagem</comment>
- <comment xml:lang="pt-BR">Ponto de montagem</comment>
- <comment xml:lang="ro">loc montare</comment>
+ <comment>Mount point</comment>
+ <comment xml:lang="uk">Точка монтування</comment>
+ <comment xml:lang="sv">Monteringspunkt</comment>
<comment xml:lang="ru">Точка монтирования</comment>
- <comment xml:lang="sk">Miesto pripojenia</comment>
- <comment xml:lang="sl">priklopna točka</comment>
- <comment xml:lang="sq">Pikë montimi</comment>
- <comment xml:lang="sr">тачка прикључења</comment>
- <comment xml:lang="sv">monteringspunkt</comment>
- <comment xml:lang="tr">bağlama noktası</comment>
- <comment xml:lang="uk">точка монтування</comment>
- <comment xml:lang="vi">điểm lắp</comment>
- <comment xml:lang="zh-CN">挂载点</comment>
- <comment xml:lang="zh-TW">掛載點</comment>
+ <comment xml:lang="pt_BR">Ponto de montagem</comment>
+ <comment xml:lang="pl">Punkt montowania</comment>
+ <comment xml:lang="ja">マウント箇所</comment>
+ <comment xml:lang="it">Punto di mount</comment>
+ <comment xml:lang="gl">Punto de montaxe</comment>
+ <comment xml:lang="eu">Muntatze-puntua</comment>
+ <comment xml:lang="es">punto de montaje</comment>
+ <comment xml:lang="de">Einhängepunkt</comment>
+ <comment xml:lang="be">пункт мантавання</comment>
<sub-class-of type="inode/directory"/>
</mime-type>
<mime-type type="inode/socket">
- <comment>socket</comment>
- <comment xml:lang="af">sok</comment>
- <comment xml:lang="ar">مقبس</comment>
- <comment xml:lang="be-Latn">sokiet</comment>
- <comment xml:lang="bg">Гнездо</comment>
- <comment xml:lang="ca">sòcol</comment>
- <comment xml:lang="cs">socket</comment>
- <comment xml:lang="da">sokkel</comment>
- <comment xml:lang="de">Socket</comment>
- <comment xml:lang="el">Υποδοχή</comment>
- <comment xml:lang="en-GB">socket</comment>
- <comment xml:lang="eo">kontaktoskatolo</comment>
- <comment xml:lang="es">socket</comment>
- <comment xml:lang="eu">socketa</comment>
- <comment xml:lang="fi">pistoke</comment>
- <comment xml:lang="fo">sokkul</comment>
- <comment xml:lang="fr">connecteur réseau</comment>
- <comment xml:lang="fur">socket</comment>
- <comment xml:lang="ga">soicéad</comment>
- <comment xml:lang="gl">socket</comment>
- <comment xml:lang="he">נקודת חיבור</comment>
- <comment xml:lang="hr">Priključnica</comment>
- <comment xml:lang="hu">illesztőpont</comment>
- <comment xml:lang="ia">Socket</comment>
- <comment xml:lang="id">soket</comment>
- <comment xml:lang="it">Socket</comment>
- <comment xml:lang="ja">ソケット</comment>
- <comment xml:lang="kk">сокет</comment>
- <comment xml:lang="ko">소켓</comment>
- <comment xml:lang="lt">lizdas</comment>
- <comment xml:lang="lv">sokets</comment>
- <comment xml:lang="ms">Soket</comment>
- <comment xml:lang="nb">plugg</comment>
- <comment xml:lang="nl">socket</comment>
- <comment xml:lang="nn">sokkel</comment>
- <comment xml:lang="oc">connector ret</comment>
- <comment xml:lang="pl">Gniazdo</comment>
- <comment xml:lang="pt">tomada</comment>
- <comment xml:lang="pt-BR">Socket</comment>
- <comment xml:lang="ro">socket</comment>
- <comment xml:lang="ru">Сокет</comment>
- <comment xml:lang="sk">Soket</comment>
- <comment xml:lang="sl">vtič</comment>
- <comment xml:lang="sq">Socket</comment>
- <comment xml:lang="sr">прикључница</comment>
- <comment xml:lang="sv">uttag</comment>
- <comment xml:lang="tr">soket</comment>
+ <comment>Socket</comment>
<comment xml:lang="uk">сокет</comment>
- <comment xml:lang="vi">ổ cắm</comment>
- <comment xml:lang="zh-CN">套接字</comment>
- <comment xml:lang="zh-TW">socket</comment>
+ <comment xml:lang="sv">Uttag</comment>
+ <comment xml:lang="ru">Сокет</comment>
+ <comment xml:lang="pl">Gniazdo</comment>
+ <comment xml:lang="ja">ソケット</comment>
+ <comment xml:lang="it">Socket</comment>
+ <comment xml:lang="gl">Socket</comment>
+ <comment xml:lang="eu">Socket-a</comment>
+ <comment xml:lang="es">zócalo</comment>
+ <comment xml:lang="de">Socket</comment>
+ <comment xml:lang="be">сокет</comment>
</mime-type>
<mime-type type="inode/symlink">
- <comment>symbolic link</comment>
- <comment xml:lang="af">simboliese skakel</comment>
- <comment xml:lang="ar">وصلة رمزية</comment>
- <comment xml:lang="ast">enllaz simbólicu</comment>
- <comment xml:lang="az">simvolik körpü</comment>
- <comment xml:lang="be-Latn">symbalnaja spasyłka</comment>
- <comment xml:lang="bg">Символна връзка</comment>
- <comment xml:lang="ca">enllaç simbòlic</comment>
- <comment xml:lang="cs">symbolický odkaz</comment>
- <comment xml:lang="cy">cyswllt symbolaidd</comment>
- <comment xml:lang="da">symbolsk henvisning</comment>
- <comment xml:lang="de">Symbolische Verknüpfung</comment>
- <comment xml:lang="el">Συμβολικός σύνδεσμος</comment>
- <comment xml:lang="en-GB">symbolic link</comment>
- <comment xml:lang="eo">simbola ligilo</comment>
- <comment xml:lang="es">enlace simbólico</comment>
- <comment xml:lang="eu">esteka sinbolikoa</comment>
- <comment xml:lang="fi">symbolinen linkki</comment>
- <comment xml:lang="fo">tykislig leinkja</comment>
- <comment xml:lang="fr">lien symbolique</comment>
- <comment xml:lang="fur">colegament simbolic</comment>
- <comment xml:lang="ga">nasc siombalach</comment>
- <comment xml:lang="gl">ligazón simbólica</comment>
- <comment xml:lang="he">קישור סימבולי</comment>
- <comment xml:lang="hr">Simbolička poveznica</comment>
- <comment xml:lang="hu">szimbolikus link</comment>
- <comment xml:lang="ia">Ligamine symbolic</comment>
- <comment xml:lang="id">taut simbolik</comment>
- <comment xml:lang="it">Collegamento simbolico</comment>
- <comment xml:lang="ja">シンボリックリンク</comment>
- <comment xml:lang="ka">სიმბოლური ბმული</comment>
- <comment xml:lang="kk">символдық сілтеме</comment>
- <comment xml:lang="ko">심볼릭 링크</comment>
- <comment xml:lang="lt">simbolinė nuoroda</comment>
- <comment xml:lang="lv">simboliskā saite</comment>
- <comment xml:lang="ms">Pautan simbolik</comment>
- <comment xml:lang="nb">symbolsk lenke</comment>
- <comment xml:lang="nl">symbolische koppeling</comment>
- <comment xml:lang="nn">symbolsk lenkje</comment>
- <comment xml:lang="oc">ligam simbolic</comment>
- <comment xml:lang="pl">Dowiązanie symboliczne</comment>
- <comment xml:lang="pt">ligação simbólica</comment>
- <comment xml:lang="pt-BR">Ligação simbólica</comment>
- <comment xml:lang="ro">legătură simbolică</comment>
+ <comment>Symbolic link</comment>
+ <comment xml:lang="uk">Символічне посилання</comment>
+ <comment xml:lang="sv">Symbolisk länk</comment>
<comment xml:lang="ru">Символьная ссылка</comment>
- <comment xml:lang="sk">Symbolický odkaz</comment>
- <comment xml:lang="sl">simbolna povezava</comment>
- <comment xml:lang="sq">Lidhje simbolike</comment>
- <comment xml:lang="sr">симболичка веза</comment>
- <comment xml:lang="sv">symbolisk länk</comment>
- <comment xml:lang="tr">simgesel bağlantı</comment>
- <comment xml:lang="uk">символічне посилання</comment>
- <comment xml:lang="vi">liên kết tượng trưng</comment>
- <comment xml:lang="zh-CN">符号链接</comment>
- <comment xml:lang="zh-TW">符號連結</comment>
+ <comment xml:lang="pt_BR">Link simbólico</comment>
+ <comment xml:lang="pl">Dowiązanie symboliczne</comment>
+ <comment xml:lang="ja">シンボリックリンク</comment>
+ <comment xml:lang="it">Collegamento simbolico</comment>
+ <comment xml:lang="gl">Ligazón simbólica</comment>
+ <comment xml:lang="eu">Esteka sinbolikoa</comment>
+ <comment xml:lang="es">enlace simbólico</comment>
+ <comment xml:lang="de">Symbolische Verknüpfung</comment>
+ <comment xml:lang="be">сімвалічная спасылка</comment>
</mime-type>
<mime-type type="message/delivery-status">
- <comment>mail delivery report</comment>
- <comment xml:lang="af">posafleweringverslag</comment>
- <comment xml:lang="ar">تقرير تسليم البريد</comment>
- <comment xml:lang="az">poçt yollama raportu</comment>
- <comment xml:lang="be-Latn">rapart ab dastaŭcy pošty</comment>
- <comment xml:lang="bg">Отчет за пристигналата поща</comment>
- <comment xml:lang="ca">informe de lliurament de correu</comment>
- <comment xml:lang="cs">zpráva o doručení pošty</comment>
- <comment xml:lang="cy">Adroddiad trosgludo post</comment>
- <comment xml:lang="da">postleveringsrapport</comment>
- <comment xml:lang="de">E-Mail-Zustellungsbericht</comment>
- <comment xml:lang="el">Αναφορά παράδοσης μηνύματος</comment>
- <comment xml:lang="en-GB">mail delivery report</comment>
- <comment xml:lang="eo">raporto pri transdono de retpoŝto</comment>
- <comment xml:lang="es">informe de entrega de correo</comment>
- <comment xml:lang="eu">posta banaketako txostena</comment>
- <comment xml:lang="fi">viestin jakeluilmoitus</comment>
- <comment xml:lang="fo">post útberingarfrásøgn</comment>
- <comment xml:lang="fr">rapport de livraison de courriels</comment>
- <comment xml:lang="fur">rapuart di consegne pueste</comment>
- <comment xml:lang="ga">tuairisc sheachadta r-phoist</comment>
- <comment xml:lang="gl">informe de entrega de correo</comment>
- <comment xml:lang="he">דוח העברת דואר</comment>
- <comment xml:lang="hr">Izvještaj dostave pošte</comment>
- <comment xml:lang="hu">jelentés levélkézbesítésről</comment>
- <comment xml:lang="ia">Reporto de livration de e-mail</comment>
- <comment xml:lang="id">laporan pengantaran surat</comment>
- <comment xml:lang="it">Rapporto di consegna posta</comment>
- <comment xml:lang="ja">メール配送ポート</comment>
- <comment xml:lang="kk">пошта жеткізілгені туралы отчет</comment>
- <comment xml:lang="ko">메일 배달 보고서</comment>
- <comment xml:lang="lt">pašto pristatymo ataskaita</comment>
- <comment xml:lang="lv">pasta piegādes atskaite</comment>
- <comment xml:lang="ms">Laporan penghantaran mel</comment>
- <comment xml:lang="nb">e-postleveranserapport</comment>
- <comment xml:lang="nl">e-mail-bezorgingsbericht</comment>
- <comment xml:lang="nn">e-post-leveringsrapport</comment>
- <comment xml:lang="oc">rapòrt de liurason de corrièrs electronics</comment>
- <comment xml:lang="pl">Raport z dostarczenia poczty</comment>
- <comment xml:lang="pt">relatório de entrega de email</comment>
- <comment xml:lang="pt-BR">Relatório de entrega de correspondência</comment>
- <comment xml:lang="ro">raport de trimitere email</comment>
+ <comment>Mail delivery report</comment>
+ <comment xml:lang="uk">звіт щодо доставлення пошти</comment>
+ <comment xml:lang="sv">E-postleveransrapport</comment>
<comment xml:lang="ru">Отчёт о доставке сообщения</comment>
- <comment xml:lang="sk">Správa o doručení pošty</comment>
- <comment xml:lang="sl">poročilo dostave pošte</comment>
- <comment xml:lang="sq">Raport mbi dorëzimin e mesazhit</comment>
- <comment xml:lang="sr">извештај доставе поруке</comment>
- <comment xml:lang="sv">e-postleveransrapport</comment>
- <comment xml:lang="tr">posta iletim raporu</comment>
- <comment xml:lang="uk">звіт про доставку пошти</comment>
- <comment xml:lang="vi">thông báo phát thư</comment>
- <comment xml:lang="zh-CN">邮件投递报告</comment>
- <comment xml:lang="zh-TW">郵件寄送回報</comment>
+ <comment xml:lang="pl">Raport z dostarczenia poczty</comment>
+ <comment xml:lang="it">Rapporto di consegna posta</comment>
+ <comment xml:lang="gl">Informe de envío de coreo electrónico</comment>
+ <comment xml:lang="es">informe de entrega de correo</comment>
+ <comment xml:lang="de">E-Mail-Zustellungsbericht</comment>
+ <comment xml:lang="be">справаздача пра дастаўку пошты</comment>
<generic-icon name="text-x-generic"/>
<sub-class-of type="text/plain"/>
</mime-type>
<mime-type type="message/disposition-notification">
- <comment>mail disposition report</comment>
- <comment xml:lang="ar">تقرير ترتيب البريد</comment>
- <comment xml:lang="az">poçt qayıtma raportu</comment>
- <comment xml:lang="be-Latn">rapart ab raźmiaščeńni pošty</comment>
- <comment xml:lang="bg">Отчет за състоянието на пощата</comment>
- <comment xml:lang="ca">informe de disposició de correu</comment>
- <comment xml:lang="cs">zpráva o předání pošty</comment>
- <comment xml:lang="cy">adroddiad ffurf post</comment>
- <comment xml:lang="da">postdisponeringsrapport</comment>
- <comment xml:lang="de">E-Mail-Übertragungsbericht</comment>
- <comment xml:lang="el">Αναφορά διάθεσης μηνύματος</comment>
- <comment xml:lang="en-GB">mail disposition report</comment>
- <comment xml:lang="eo">raporto pri dispono de retpoŝto</comment>
- <comment xml:lang="es">informe de disposición de correo</comment>
- <comment xml:lang="eu">posta joerako txostena</comment>
- <comment xml:lang="fi">viestin kuittausilmoitus</comment>
- <comment xml:lang="fo">post avhendingarfrásøgn</comment>
- <comment xml:lang="fr">rapport de disposition de courriels</comment>
- <comment xml:lang="fur">rapuart di disposizion pueste</comment>
- <comment xml:lang="ga">tuairisc chóirithe r-phoist</comment>
- <comment xml:lang="gl">informe de disposición de correo</comment>
- <comment xml:lang="he">דוח אספקת דואר</comment>
- <comment xml:lang="hr">Izvještaj smještaja e-pošte</comment>
- <comment xml:lang="hu">jelentés levélkidobásról</comment>
- <comment xml:lang="ia">Reporto de disposition de e-mail</comment>
- <comment xml:lang="id">laporan disposisi surat</comment>
- <comment xml:lang="it">Rapporto di disposizione posta</comment>
- <comment xml:lang="ja">メール停止レポート</comment>
- <comment xml:lang="kk">пошта жылжытылғаны туралы отчет</comment>
- <comment xml:lang="ko">메일 처리 보고서</comment>
- <comment xml:lang="lt">pašto charakteristikos ataskaita</comment>
- <comment xml:lang="lv">pasta izvietojuma atskaite</comment>
- <comment xml:lang="ms">Laporan pelupusan mel</comment>
- <comment xml:lang="nb">e-postdispositionsrapport</comment>
- <comment xml:lang="nl">e-mail-plaatsingsbericht</comment>
- <comment xml:lang="nn">e-post-disposisjonsrapport</comment>
- <comment xml:lang="oc">rapòrt de disposicion de corrièrs electronics</comment>
- <comment xml:lang="pl">Raport z wysyłania poczty</comment>
- <comment xml:lang="pt">relatório de disposição de email</comment>
- <comment xml:lang="pt-BR">Relatório de disposição de correspondência</comment>
- <comment xml:lang="ro">confirmare primire email</comment>
+ <comment>Mail disposition report</comment>
+ <comment xml:lang="uk">звіт щодо розташування пошти</comment>
+ <comment xml:lang="sv">E-postdispositionsrapport</comment>
<comment xml:lang="ru">Отчёт о перемещении почты</comment>
- <comment xml:lang="sk">Správa o odovzdaní pošty</comment>
- <comment xml:lang="sl">poročilo razporeditve pošte</comment>
- <comment xml:lang="sq">Raport mbi njoftimin e mesazhit</comment>
- <comment xml:lang="sr">извештај слања поруке</comment>
- <comment xml:lang="sv">e-postdispositionsrapport</comment>
- <comment xml:lang="tr">posta silinme raporu</comment>
- <comment xml:lang="uk">звіт про розташування пошти</comment>
- <comment xml:lang="vi">thông báo chuyển nhượng thư</comment>
- <comment xml:lang="zh-CN">邮件接收报告</comment>
- <comment xml:lang="zh-TW">郵件處置回報</comment>
+ <comment xml:lang="pl">Raport z wysyłania poczty</comment>
+ <comment xml:lang="it">Rapporto di disposizione posta</comment>
+ <comment xml:lang="es">informe de disposición de correo</comment>
+ <comment xml:lang="de">E-Mail-Übertragungsbericht</comment>
+ <comment xml:lang="be">справаздача пра дзеянні з поштай</comment>
<generic-icon name="text-x-generic"/>
<sub-class-of type="text/plain"/>
</mime-type>
<mime-type type="message/external-body">
- <comment>reference to remote file</comment>
- <comment xml:lang="af">verwysing na afgeleë lêer</comment>
- <comment xml:lang="ar">مرجع إلى ملف بعيد</comment>
- <comment xml:lang="az">uzaq fayla göstəriş</comment>
- <comment xml:lang="be-Latn">spasyłka da addalenaha fajłu</comment>
- <comment xml:lang="bg">Препратка към отдалечен файл</comment>
- <comment xml:lang="ca">referència a fitxer remot</comment>
- <comment xml:lang="cs">odkaz na vzdálený soubor</comment>
- <comment xml:lang="cy">cyfeiriad at ffeil bell</comment>
- <comment xml:lang="da">reference til fjern fil</comment>
- <comment xml:lang="de">Verweis auf entfernte Datei</comment>
- <comment xml:lang="el">Αναφορά σε απομακρυσμένο αρχείο</comment>
- <comment xml:lang="en-GB">reference to remote file</comment>
- <comment xml:lang="eo">referenco al fora dosiero</comment>
- <comment xml:lang="es">referencia a un archivo remoto</comment>
- <comment xml:lang="eu">erreferentzia urruneko fitxategiari</comment>
- <comment xml:lang="fi">viittaus etätiedostoon</comment>
- <comment xml:lang="fo">tilvísing til fjarfílu</comment>
- <comment xml:lang="fr">référence au fichier distant</comment>
- <comment xml:lang="fur">riferiment a file rimot</comment>
- <comment xml:lang="ga">tagairt do chomhad cianda</comment>
- <comment xml:lang="gl">referencia a un ficheiro remoto</comment>
- <comment xml:lang="he">התיחסות לקובץ מרוחק</comment>
- <comment xml:lang="hr">Preporuka na udaljenu datoteku</comment>
- <comment xml:lang="hu">hivatkozás távoli fájlra</comment>
- <comment xml:lang="ia">Referentia a un file remote</comment>
- <comment xml:lang="id">referensi ke berkas jarak jauh</comment>
- <comment xml:lang="it">Riferimento a file remoto</comment>
- <comment xml:lang="ja">リモートファイルへの参照</comment>
- <comment xml:lang="kk">қашықтағы файлға сілтеме</comment>
- <comment xml:lang="ko">원격 파일 참조</comment>
- <comment xml:lang="lt">nuoroda į nutolusį failą</comment>
- <comment xml:lang="lv">norāde uz attālinātu datni</comment>
- <comment xml:lang="ms">Rujukan ke fail jauh</comment>
- <comment xml:lang="nb">referanse til ekstern fil</comment>
- <comment xml:lang="nl">verwijzing naar bestand op afstand</comment>
- <comment xml:lang="nn">referanse til fil over nettverk</comment>
- <comment xml:lang="oc">referéncia al fichièr distant</comment>
- <comment xml:lang="pl">Odwołanie do pliku zdalnego</comment>
- <comment xml:lang="pt">referência a um ficheiro remoto</comment>
- <comment xml:lang="pt-BR">Referência para arquivo remoto</comment>
- <comment xml:lang="ro">referință fișier la distanță</comment>
- <comment xml:lang="ru">Ссылка на удалённый файл</comment>
- <comment xml:lang="sk">Odkaz na vzdialený súbor</comment>
- <comment xml:lang="sl">sklic do oddaljene datoteke</comment>
- <comment xml:lang="sq">Referim për tek file në distancë</comment>
- <comment xml:lang="sr">упута на удаљену датотеку</comment>
- <comment xml:lang="sv">referens till fjärrfil</comment>
- <comment xml:lang="tr">uzaktaki dosyaya atıf</comment>
+ <comment>Reference to remote file</comment>
<comment xml:lang="uk">посилання на віддалений файл</comment>
- <comment xml:lang="vi">tham chiếu đến tập tin ở xa</comment>
- <comment xml:lang="zh-CN">到远程文件的引用</comment>
- <comment xml:lang="zh-TW">遠端檔案的參照</comment>
+ <comment xml:lang="sv">Referens till fjärrfil</comment>
+ <comment xml:lang="ru">Ссылка на удалённый файл</comment>
+ <comment xml:lang="pl">Odwołanie do pliku zdalnego</comment>
+ <comment xml:lang="it">Riferimento a file remoto</comment>
+ <comment xml:lang="es">referencia a archivo remoto</comment>
+ <comment xml:lang="de">Verweis auf entfernte Datei</comment>
+ <comment xml:lang="be">спасылка на выдалены файл</comment>
<generic-icon name="text-x-generic"/>
</mime-type>
<mime-type type="message/news">
<comment>Usenet news message</comment>
- <comment xml:lang="af">Usenet-nuusboodskap</comment>
- <comment xml:lang="ar">رسالة أخبار Usenet</comment>
- <comment xml:lang="az">Usenet xəbərlər ismarışı</comment>
- <comment xml:lang="be-Latn">Navina Usenet</comment>
- <comment xml:lang="bg">Съобщение — Usenet</comment>
- <comment xml:lang="ca">missatge de notícies Usenet</comment>
- <comment xml:lang="cs">příspěvek do diskusních skupin Usenet</comment>
- <comment xml:lang="cy">Neges newyddion Usenet</comment>
- <comment xml:lang="da">Usenet-nyhedsmeddelelse</comment>
- <comment xml:lang="de">Usenet-News-Nachricht</comment>
- <comment xml:lang="el">Μήνυμα ομάδων συζητήσεων Usenet</comment>
- <comment xml:lang="en-GB">Usenet news message</comment>
- <comment xml:lang="eo">novaĵmesaĝo de Usenet</comment>
- <comment xml:lang="es">mensaje de noticias de Usenet</comment>
- <comment xml:lang="eu">Usenet berrien mezua</comment>
- <comment xml:lang="fi">nyyssiviesti</comment>
- <comment xml:lang="fo">Usenet news boð</comment>
- <comment xml:lang="fr">message de groupe d'échange Usenet</comment>
- <comment xml:lang="fur">messaç gnovis Usenet</comment>
- <comment xml:lang="ga">teachtaireacht nuachta Usenet</comment>
- <comment xml:lang="gl">mensaxes de noticias de Usenet</comment>
- <comment xml:lang="he">הודעת חדשות של Usenet</comment>
- <comment xml:lang="hr">Usenet poruka novosti</comment>
- <comment xml:lang="hu">USENET-hírcsoportüzenet</comment>
- <comment xml:lang="ia">Message de gruppo Usenet</comment>
- <comment xml:lang="id">Pesan berita Usenet</comment>
- <comment xml:lang="it">Messaggio news Usenet</comment>
- <comment xml:lang="ja">Usenet news メッセージ</comment>
- <comment xml:lang="kk">Usenet жаңалық мәлімдемесі</comment>
- <comment xml:lang="ko">유즈넷 뉴스 메시지</comment>
- <comment xml:lang="lt">Usenet naujienų žinutė</comment>
- <comment xml:lang="lv">Usenet jaunumu ziņojums</comment>
- <comment xml:lang="ms">Mesej berita USENET</comment>
- <comment xml:lang="nb">Usenet nyhetsmelding</comment>
- <comment xml:lang="nl">Usenet-nieuwsbericht</comment>
- <comment xml:lang="nn">USENET diskusjonsmelding</comment>
- <comment xml:lang="oc">messatge de grop d'escambi Usenet</comment>
- <comment xml:lang="pl">Wiadomość grupy dyskusyjnej</comment>
- <comment xml:lang="pt">mensagem de notícias Usenet</comment>
- <comment xml:lang="pt-BR">Mensagem de notícias da Usenet</comment>
- <comment xml:lang="ro">Mesaj Usenet de știri </comment>
- <comment xml:lang="ru">Новостное сообщение Usenet</comment>
- <comment xml:lang="sk">Príspevok do diskusných skupín Usenet</comment>
- <comment xml:lang="sl">novičarsko sporočilo Usenet</comment>
- <comment xml:lang="sq">Mesazh lajmesh Usenet</comment>
- <comment xml:lang="sr">Порука новости Јузнета</comment>
- <comment xml:lang="sv">Usenet-diskussionsgruppsmeddelande</comment>
- <comment xml:lang="tr">Usenet haber iletisi</comment>
- <comment xml:lang="uk">повідомлення новин Usenet</comment>
+ <comment xml:lang="zh_TW">Usenet 新聞訊息</comment>
+ <comment xml:lang="zh_CN">Usenet 新闻信</comment>
<comment xml:lang="vi">Thông điệp tin tức USENET</comment>
- <comment xml:lang="zh-CN">Usenet 新闻信</comment>
- <comment xml:lang="zh-TW">Usenet 新聞訊息</comment>
+ <comment xml:lang="uk">повідомлення новин Usenet</comment>
+ <comment xml:lang="tr">Usenet haber iletisi</comment>
+ <comment xml:lang="sv">Usenet-diskussionsgruppsmeddelande</comment>
+ <comment xml:lang="sr">Порука новости Јузнета</comment>
+ <comment xml:lang="sq">mesazh lajmesh Usenet</comment>
+ <comment xml:lang="sl">novičarsko sporočilo Usenet</comment>
+ <comment xml:lang="si">යූස්නෙට් පුවත් පණිවිඩය</comment>
+ <comment xml:lang="sk">Príspevok do diskusných skupín Usenet</comment>
+ <comment xml:lang="ru">Новостное сообщение Usenet</comment>
+ <comment xml:lang="ro">Mesaj Usenet de știri </comment>
+ <comment xml:lang="pt_BR">Mensagem de notícias da Usenet</comment>
+ <comment xml:lang="pt">mensagem de notícias Usenet</comment>
+ <comment xml:lang="pl">Wiadomość grupy dyskusyjnej</comment>
+ <comment xml:lang="oc">messatge de grop d'escambi Usenet</comment>
+ <comment xml:lang="nn">USENET diskusjonsmelding</comment>
+ <comment xml:lang="nl">Usenet-nieuwsbericht</comment>
+ <comment xml:lang="nb">Usenet nyhetsmelding</comment>
+ <comment xml:lang="ms">Mesej berita USENET</comment>
+ <comment xml:lang="lv">Usenet jaunumu ziņojums</comment>
+ <comment xml:lang="lt">Usenet naujienų žinutė</comment>
+ <comment xml:lang="ko">유즈넷 뉴스 메시지</comment>
+ <comment xml:lang="kk">Usenet жаңалық мәлімдемесі</comment>
+ <comment xml:lang="ja">Usenet news メッセージ</comment>
+ <comment xml:lang="it">Messaggio news Usenet</comment>
+ <comment xml:lang="is">USENET fréttaskilaboð</comment>
+ <comment xml:lang="id">Pesan berita Usenet</comment>
+ <comment xml:lang="ia">Message de gruppo Usenet</comment>
+ <comment xml:lang="hu">USENET-hírcsoportüzenet</comment>
+ <comment xml:lang="hr">Usenet poruka novosti</comment>
+ <comment xml:lang="he">הודעת חדשות של Usenet</comment>
+ <comment xml:lang="gl">mensaxes de noticias de Usenet</comment>
+ <comment xml:lang="ga">teachtaireacht nuachta Usenet</comment>
+ <comment xml:lang="fur">messaç gnovis Usenet</comment>
+ <comment xml:lang="fr">message de groupe d'échange Usenet</comment>
+ <comment xml:lang="fo">Usenet news boð</comment>
+ <comment xml:lang="fi">nyyssiviesti</comment>
+ <comment xml:lang="eu">Usenet berrien mezua</comment>
+ <comment xml:lang="es">mensaje de noticias de Usenet</comment>
+ <comment xml:lang="eo">novaĵmesaĝo de Usenet</comment>
+ <comment xml:lang="en_GB">Usenet news message</comment>
+ <comment xml:lang="el">Μήνυμα ομάδων συζητήσεων Usenet</comment>
+ <comment xml:lang="de">Usenet-News-Nachricht</comment>
+ <comment xml:lang="da">Usenet-nyhedsmeddelelse</comment>
+ <comment xml:lang="cy">Neges newyddion Usenet</comment>
+ <comment xml:lang="cs">příspěvek do diskusních skupin Usenet</comment>
+ <comment xml:lang="ca">missatge de notícies Usenet</comment>
+ <comment xml:lang="bg">Съобщение — Usenet</comment>
+ <comment xml:lang="be@latin">Navina Usenet</comment>
+ <comment xml:lang="be">навіна Usenet</comment>
+ <comment xml:lang="az">Usenet xəbərlər ismarışı</comment>
+ <comment xml:lang="ar">رسالة أخبار Usenet</comment>
+ <comment xml:lang="af">Usenet-nuusboodskap</comment>
<generic-icon name="text-x-generic"/>
<sub-class-of type="text/plain"/>
- <magic priority="50">
+ <magic>
<match type="string" value="Article" offset="0"/>
<match type="string" value="Path:" offset="0"/>
<match type="string" value="Xref:" offset="0"/>
</magic>
</mime-type>
<mime-type type="message/partial">
- <comment>partial email message</comment>
- <comment xml:lang="af">gedeeltelike e-posboodskap</comment>
- <comment xml:lang="ar">رسالة البريد الإلكتروني الجزئية</comment>
- <comment xml:lang="az">qismi poçt ismarışı</comment>
- <comment xml:lang="be-Latn">niapoŭny list email</comment>
- <comment xml:lang="bg">Част от електронно писмо</comment>
- <comment xml:lang="ca">missatge de correu electrònic parcial</comment>
- <comment xml:lang="cs">částečná e-mailová zpráva</comment>
- <comment xml:lang="cy">darn o neges e-bost</comment>
- <comment xml:lang="da">delvis postmeddelelse</comment>
- <comment xml:lang="de">E-Mail-Nachrichtenfragment</comment>
- <comment xml:lang="el">Τμηματικό ηλ. μήνυμα</comment>
- <comment xml:lang="en-GB">partial email message</comment>
- <comment xml:lang="eo">parta retpoŝta mesaĝo</comment>
- <comment xml:lang="es">mensaje de correo electrónico parcial</comment>
- <comment xml:lang="eu">posta mezu partziala</comment>
- <comment xml:lang="fi">osittainen sähköpostiviesti</comment>
- <comment xml:lang="fr">message partiel de courriel</comment>
- <comment xml:lang="fur">messaç e-mail parziâl</comment>
- <comment xml:lang="ga">teachtaireacht ríomhphoist neamhiomlán</comment>
- <comment xml:lang="gl">mensaxe de correo electrónico parcial</comment>
- <comment xml:lang="he">מסר דוא״ל חלקי</comment>
- <comment xml:lang="hr">Nepotpuna poruka e-pošte</comment>
- <comment xml:lang="hu">részleges elektronikus levél</comment>
- <comment xml:lang="ia">Message de e-mail partial</comment>
- <comment xml:lang="id">pesan email sebagian</comment>
- <comment xml:lang="it">Messaggio email parziale</comment>
- <comment xml:lang="ja">部分メールメッセージ</comment>
- <comment xml:lang="kk">электронды поштаның үзінді мәлімдемесі</comment>
- <comment xml:lang="ko">전자 우편 메시지 일부</comment>
- <comment xml:lang="lt">nepilnas el. laiškas</comment>
- <comment xml:lang="lv">daļēja e-pasta vēstule</comment>
- <comment xml:lang="ms">Bahagian mesej emel</comment>
- <comment xml:lang="nb">del av e-postmelding</comment>
- <comment xml:lang="nl">gedeeltelijk e-mailbericht</comment>
- <comment xml:lang="nn">del av e-post-melding</comment>
- <comment xml:lang="oc">messatge parcial de corrièr electronic</comment>
- <comment xml:lang="pl">Częściowa wiadomość e-mail</comment>
- <comment xml:lang="pt">mensagem parcial de email</comment>
- <comment xml:lang="pt-BR">Mensagem de e-mail parcial</comment>
- <comment xml:lang="ro">mesaj de email parțial</comment>
- <comment xml:lang="ru">Фрагмент сообщения электронной почты</comment>
- <comment xml:lang="sk">Čiastočná e-mailová správa</comment>
- <comment xml:lang="sl">delno elektronsko sporočilo</comment>
- <comment xml:lang="sq">Mesazh poste i pjesëshëm</comment>
- <comment xml:lang="sr">делимична порука ел. поште</comment>
- <comment xml:lang="sv">del av e-postmeddelande</comment>
- <comment xml:lang="tr">kısmi eposta iletisi</comment>
+ <comment>Partial email message</comment>
<comment xml:lang="uk">часткове поштове повідомлення</comment>
- <comment xml:lang="vi">thư điện tử riêng phần</comment>
- <comment xml:lang="zh-CN">部分电子邮件</comment>
- <comment xml:lang="zh-TW">部份電子郵件訊息</comment>
+ <comment xml:lang="sv">Del av e-postmeddelande</comment>
+ <comment xml:lang="ru">Фрагмент сообщения электронной почты</comment>
+ <comment xml:lang="pl">Częściowa wiadomość e-mail</comment>
+ <comment xml:lang="it">Messaggio email parziale</comment>
+ <comment xml:lang="es">mensaje de correo electrónico parcial</comment>
+ <comment xml:lang="de">E-Mail-Nachrichtenfragment</comment>
+ <comment xml:lang="be">частка электроннага ліста</comment>
<generic-icon name="text-x-generic"/>
<sub-class-of type="text/plain"/>
</mime-type>
<mime-type type="message/rfc822">
- <comment>email message</comment>
- <comment xml:lang="af">e-posboodskap</comment>
- <comment xml:lang="ar">رسالة البريد الإلكتروني</comment>
- <comment xml:lang="be-Latn">list email</comment>
- <comment xml:lang="bg">Съобщение по електронната поща</comment>
- <comment xml:lang="ca">missatge de correu electrònic</comment>
- <comment xml:lang="cs">e-mailová zpráva</comment>
- <comment xml:lang="da">postmeddelelse</comment>
- <comment xml:lang="de">E-Mail-Nachricht</comment>
- <comment xml:lang="el">Ηλ. μήνυμα</comment>
- <comment xml:lang="en-GB">email message</comment>
- <comment xml:lang="eo">retpoŝta mesaĝo</comment>
- <comment xml:lang="es">mensaje de correo electrónico</comment>
- <comment xml:lang="eu">helbide elektronikoen mezua</comment>
- <comment xml:lang="fi">sähköpostiviesti</comment>
- <comment xml:lang="fo">t-post boð</comment>
- <comment xml:lang="fr">message de courriel</comment>
- <comment xml:lang="fur">messaç e-mail</comment>
- <comment xml:lang="ga">teachtaireacht ríomhphoist</comment>
- <comment xml:lang="gl">mensaxe de correo electrónico</comment>
- <comment xml:lang="he">הודעת דואר אלקטרוני</comment>
- <comment xml:lang="hr">Poruka e-pošte</comment>
- <comment xml:lang="hu">elektronikus levél</comment>
- <comment xml:lang="ia">Message de e-mail</comment>
- <comment xml:lang="id">pesan email</comment>
- <comment xml:lang="it">Messaggio email</comment>
- <comment xml:lang="ja">メール本文</comment>
- <comment xml:lang="kk">пошталық мәлімдеме</comment>
- <comment xml:lang="ko">전자 우편 본문</comment>
- <comment xml:lang="lt">el. laiškas</comment>
- <comment xml:lang="lv">e-pasta vēstule</comment>
- <comment xml:lang="ms">Mesej emel</comment>
- <comment xml:lang="nb">e-postmelding</comment>
- <comment xml:lang="nl">e-mailbericht</comment>
- <comment xml:lang="nn">e-postmelding</comment>
- <comment xml:lang="oc">messatge de corrièr electronic</comment>
- <comment xml:lang="pl">Wiadomość e-mail</comment>
- <comment xml:lang="pt">mensagem de email</comment>
- <comment xml:lang="pt-BR">Mensagem de e-mail</comment>
- <comment xml:lang="ro">mesaj email</comment>
+ <comment>Email message</comment>
+ <comment xml:lang="uk">поштове повідомлення</comment>
+ <comment xml:lang="sv">E-postmeddelande</comment>
<comment xml:lang="ru">Почтовое сообщение</comment>
- <comment xml:lang="sk">E-mailová správa</comment>
- <comment xml:lang="sl">sporočilo elektronske pošte</comment>
- <comment xml:lang="sq">Mesazh poste</comment>
- <comment xml:lang="sr">порука ел. поште</comment>
- <comment xml:lang="sv">e-postmeddelande</comment>
- <comment xml:lang="tr">eposta iletisi</comment>
- <comment xml:lang="uk">повідомлення email</comment>
- <comment xml:lang="vi">thư điện tử</comment>
- <comment xml:lang="zh-CN">电子邮件</comment>
- <comment xml:lang="zh-TW">電子郵件內容</comment>
+ <comment xml:lang="pt_BR">Mensagem de e-mail</comment>
+ <comment xml:lang="pl">Wiadomość e-mail</comment>
+ <comment xml:lang="it">Messaggio email</comment>
+ <comment xml:lang="gl">Mensaxe de correo electrónico</comment>
+ <comment xml:lang="es">mensaje de correo electrónico</comment>
+ <comment xml:lang="de">E-Mail-Nachricht</comment>
+ <comment xml:lang="be">электронны ліст</comment>
<generic-icon name="text-x-generic"/>
<sub-class-of type="text/plain"/>
- <magic priority="50">
+ <magic>
<match type="string" value="#! rnews" offset="0"/>
+ <match type="string" value="Content-Type:" offset="0"/>
<match type="string" value="Forward to" offset="0"/>
<match type="string" value="From:" offset="0"/>
<match type="string" value="N#! rnews" offset="0"/>
@@ -31879,725 +33111,527 @@ command to generate the output files.
<match type="string" value="Return-Path:" offset="0"/>
<match type="string" value="Return-path:" offset="0"/>
<match type="string" value="Subject: " offset="0"/>
+ <match type="string" value="To:" offset="0"/>
</magic>
<glob pattern="*.eml"/>
</mime-type>
<mime-type type="message/x-gnu-rmail">
<comment>GNU mail message</comment>
- <comment xml:lang="af">GNU-posboodskap</comment>
- <comment xml:lang="ar">رسالة بريد جنو</comment>
- <comment xml:lang="az">GNU poçt ismarışı</comment>
- <comment xml:lang="be-Latn">List GNU</comment>
- <comment xml:lang="bg">Съобщение — GNU mail</comment>
- <comment xml:lang="ca">missatge de GNU mail</comment>
- <comment xml:lang="cs">zpráva GNU mail</comment>
- <comment xml:lang="cy">Neges E-Bost GNU</comment>
- <comment xml:lang="da">GNU-postmeddelelse</comment>
- <comment xml:lang="de">GNU-Mail-Nachricht</comment>
- <comment xml:lang="el">Μήνυμα αλληλογραφίας GNU</comment>
- <comment xml:lang="en-GB">GNU mail message</comment>
- <comment xml:lang="eo">mesaĝo de GNU mail</comment>
- <comment xml:lang="es">mensaje de correo de GNU</comment>
- <comment xml:lang="eu">GNU posta mezua</comment>
- <comment xml:lang="fi">GNU-postiviesti</comment>
- <comment xml:lang="fo">GNU mail boð</comment>
- <comment xml:lang="fr">message de courriel GNU</comment>
- <comment xml:lang="fur">messaç di pueste GNU</comment>
- <comment xml:lang="ga">teachtaireacht r-phoist GNU</comment>
- <comment xml:lang="gl">mensaxe de correo electrónico de GNU</comment>
- <comment xml:lang="he">הודעת דואר של GNU</comment>
- <comment xml:lang="hr">GNU poruka pošte</comment>
- <comment xml:lang="hu">GNU elektronikus levél</comment>
- <comment xml:lang="ia">Message electronic de GNU</comment>
- <comment xml:lang="id">Pesan surat GNU</comment>
- <comment xml:lang="it">Messaggio GNU mail</comment>
- <comment xml:lang="ja">GNU メールメッセージ</comment>
- <comment xml:lang="ka">GNU mail შეტყობინება</comment>
- <comment xml:lang="kk">GNU пошта хабарламасы</comment>
- <comment xml:lang="ko">GNU 메일 메시지</comment>
- <comment xml:lang="lt">GNU pašto žinutė</comment>
- <comment xml:lang="lv">GNU pasta vēstule</comment>
- <comment xml:lang="ms">Mesej emel GNU</comment>
- <comment xml:lang="nb">GNU e-postmelding</comment>
- <comment xml:lang="nl">GNU-mailbericht</comment>
- <comment xml:lang="nn">GNU e-postmelding</comment>
- <comment xml:lang="oc">messatge de corrièr electronic GNU</comment>
- <comment xml:lang="pl">Wiadomość pocztowa GNU</comment>
- <comment xml:lang="pt">mensagem de email GNU</comment>
- <comment xml:lang="pt-BR">Mensagem de e-mail GNU</comment>
- <comment xml:lang="ro">Mesaj GNU mail</comment>
- <comment xml:lang="ru">Почтовое сообщение GNU</comment>
- <comment xml:lang="sk">Správa GNU mail</comment>
- <comment xml:lang="sl">Sporočilo pošte GNU</comment>
- <comment xml:lang="sq">Mesazh GNU mail</comment>
- <comment xml:lang="sr">порука Гнуове поште</comment>
- <comment xml:lang="sv">GNU-epostmeddelande</comment>
- <comment xml:lang="tr">GNU posta iletisi</comment>
- <comment xml:lang="uk">поштове повідомлення GNU</comment>
+ <comment xml:lang="zh_TW">GNU 郵件訊息</comment>
+ <comment xml:lang="zh_CN">GNU mail 信件</comment>
<comment xml:lang="vi">Thư điện tử của GNU</comment>
- <comment xml:lang="zh-CN">GNU mail 信件</comment>
- <comment xml:lang="zh-TW">GNU 郵件訊息</comment>
+ <comment xml:lang="uk">поштове повідомлення GNU</comment>
+ <comment xml:lang="tr">GNU posta iletisi</comment>
+ <comment xml:lang="sv">GNU-epostmeddelande</comment>
+ <comment xml:lang="sr">порука Гнуове поште</comment>
+ <comment xml:lang="sq">mesazh GNU mail</comment>
+ <comment xml:lang="sl">Sporočilo pošte GNU</comment>
+ <comment xml:lang="si">GNU තැපැල් පණිවිඩය</comment>
+ <comment xml:lang="sk">Správa GNU mail</comment>
+ <comment xml:lang="ru">Почтовое сообщение GNU</comment>
+ <comment xml:lang="ro">Mesaj GNU mail</comment>
+ <comment xml:lang="pt_BR">Mensagem de e-mail GNU</comment>
+ <comment xml:lang="pt">mensagem de email GNU</comment>
+ <comment xml:lang="pl">Wiadomość pocztowa GNU</comment>
+ <comment xml:lang="oc">messatge de corrièr electronic GNU</comment>
+ <comment xml:lang="nn">GNU e-postmelding</comment>
+ <comment xml:lang="nl">GNU-mailbericht</comment>
+ <comment xml:lang="nb">GNU e-postmelding</comment>
+ <comment xml:lang="ms">Mesej emel GNU</comment>
+ <comment xml:lang="lv">GNU pasta vēstule</comment>
+ <comment xml:lang="lt">GNU pašto žinutė</comment>
+ <comment xml:lang="ko">GNU 메일 메시지</comment>
+ <comment xml:lang="kk">GNU пошта хабарламасы</comment>
+ <comment xml:lang="ka">GNU mail შეტყობინება</comment>
+ <comment xml:lang="ja">GNU メールメッセージ</comment>
+ <comment xml:lang="it">Messaggio GNU mail</comment>
+ <comment xml:lang="is">GNU póst skilaboð</comment>
+ <comment xml:lang="id">Pesan surat GNU</comment>
+ <comment xml:lang="ia">Message electronic de GNU</comment>
+ <comment xml:lang="hu">GNU elektronikus levél</comment>
+ <comment xml:lang="hr">GNU poruka pošte</comment>
+ <comment xml:lang="he">הודעת דואר של GNU</comment>
+ <comment xml:lang="gl">mensaxe de correo electrónico de GNU</comment>
+ <comment xml:lang="ga">teachtaireacht r-phoist GNU</comment>
+ <comment xml:lang="fur">messaç di pueste GNU</comment>
+ <comment xml:lang="fr">message de courriel GNU</comment>
+ <comment xml:lang="fo">GNU mail boð</comment>
+ <comment xml:lang="fi">GNU-postiviesti</comment>
+ <comment xml:lang="eu">GNU posta mezua</comment>
+ <comment xml:lang="es">mensaje de correo de GNU</comment>
+ <comment xml:lang="eo">mesaĝo de GNU mail</comment>
+ <comment xml:lang="en_GB">GNU mail message</comment>
+ <comment xml:lang="el">Μήνυμα αλληλογραφίας GNU</comment>
+ <comment xml:lang="de">GNU-Mail-Nachricht</comment>
+ <comment xml:lang="da">GNU-postmeddelelse</comment>
+ <comment xml:lang="cy">Neges E-Bost GNU</comment>
+ <comment xml:lang="cs">zpráva GNU mail</comment>
+ <comment xml:lang="ca">missatge de GNU mail</comment>
+ <comment xml:lang="bg">Съобщение — GNU mail</comment>
+ <comment xml:lang="be@latin">List GNU</comment>
+ <comment xml:lang="be">электронны ліст GNU</comment>
+ <comment xml:lang="az">GNU poçt ismarışı</comment>
+ <comment xml:lang="ar">رسالة بريد جنو</comment>
+ <comment xml:lang="af">GNU-posboodskap</comment>
<generic-icon name="text-x-generic"/>
<glob pattern="RMAIL"/>
</mime-type>
<mime-type type="model/iges">
<comment>IGES document</comment>
- <comment xml:lang="af">IGES-dokument</comment>
- <comment xml:lang="ast">Documentu IGES</comment>
- <comment xml:lang="bg">Документ — IGES</comment>
- <comment xml:lang="ca">document IGES</comment>
- <comment xml:lang="cs">dokument IGES</comment>
- <comment xml:lang="da">IGES-dokument</comment>
- <comment xml:lang="de">IGES-Dokument</comment>
- <comment xml:lang="en-GB">IGES document</comment>
- <comment xml:lang="es">documento IGES</comment>
- <comment xml:lang="eu">IGES dokumentua</comment>
- <comment xml:lang="fi">IGES-asiakirja</comment>
- <comment xml:lang="fr">document IGES</comment>
- <comment xml:lang="fur">document IGES</comment>
- <comment xml:lang="ga">cáipéis IGES</comment>
- <comment xml:lang="he">מסמך IGES</comment>
- <comment xml:lang="hr">IGES dokument</comment>
- <comment xml:lang="hu">IGES dokumentum</comment>
- <comment xml:lang="id">Dokumen IGES</comment>
- <comment xml:lang="it">Documento IGES</comment>
- <comment xml:lang="kk">IGES құжаты</comment>
- <comment xml:lang="ko">IGES 문서</comment>
- <comment xml:lang="pl">Dokument IGES</comment>
- <comment xml:lang="pt-BR">Documento IGES</comment>
- <comment xml:lang="ru">Документ IGES</comment>
- <comment xml:lang="sk">Dokument IGES</comment>
- <comment xml:lang="sl">Dokument IGES</comment>
- <comment xml:lang="sr">ИГЕС документ</comment>
- <comment xml:lang="sv">IGES-dokument</comment>
- <comment xml:lang="tr">IGES belgesi</comment>
+ <comment xml:lang="zh_TW">IGES 文件</comment>
+ <comment xml:lang="zh_CN">IGES 文档</comment>
<comment xml:lang="uk">документ IGES</comment>
- <comment xml:lang="zh-CN">IGES 文档</comment>
- <comment xml:lang="zh-TW">IGES 文件</comment>
+ <comment xml:lang="tr">IGES belgesi</comment>
+ <comment xml:lang="sv">IGES-dokument</comment>
+ <comment xml:lang="sr">ИГЕС документ</comment>
+ <comment xml:lang="sq">dokument IGES</comment>
+ <comment xml:lang="sl">Dokument IGES</comment>
+ <comment xml:lang="si">IGES ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument IGES</comment>
+ <comment xml:lang="ru">Документ IGES</comment>
+ <comment xml:lang="pt_BR">Documento IGES</comment>
+ <comment xml:lang="pl">Dokument IGES</comment>
+ <comment xml:lang="oc">document IGES</comment>
+ <comment xml:lang="nl">IGES-document</comment>
+ <comment xml:lang="ko">IGES 문서</comment>
+ <comment xml:lang="kk">IGES құжаты</comment>
+ <comment xml:lang="ja">IGES ドキュメント</comment>
+ <comment xml:lang="it">Documento IGES</comment>
+ <comment xml:lang="is">IGES skjalskjal</comment>
+ <comment xml:lang="id">Dokumen IGES</comment>
+ <comment xml:lang="hu">IGES dokumentum</comment>
+ <comment xml:lang="hr">IGES dokument</comment>
+ <comment xml:lang="he">מסמך IGES</comment>
+ <comment xml:lang="gl">Documento IGES</comment>
+ <comment xml:lang="ga">cáipéis IGES</comment>
+ <comment xml:lang="fur">document IGES</comment>
+ <comment xml:lang="fr">document IGES</comment>
+ <comment xml:lang="fi">IGES-asiakirja</comment>
+ <comment xml:lang="eu">IGES dokumentua</comment>
+ <comment xml:lang="es">documento IGES</comment>
+ <comment xml:lang="en_GB">IGES document</comment>
+ <comment xml:lang="de">IGES-Dokument</comment>
+ <comment xml:lang="da">IGES-dokument</comment>
+ <comment xml:lang="cs">dokument IGES</comment>
+ <comment xml:lang="ca">document IGES</comment>
+ <comment xml:lang="bg">Документ — IGES</comment>
+ <comment xml:lang="be">дакумент IGES</comment>
+ <comment xml:lang="ast">Documentu IGES</comment>
+ <comment xml:lang="ar">مستند IGES</comment>
+ <comment xml:lang="af">IGES-dokument</comment>
<acronym>IGES</acronym>
<expanded-acronym>Initial Graphics Exchange Specification</expanded-acronym>
<generic-icon name="x-office-document"/>
<sub-class-of type="text/plain"/>
- <magic priority="50">
+ <magic>
<match type="string" value="S 1\x0a" offset="72"/>
<match type="string" value="S0000001\x0a" offset="72"/>
</magic>
<glob pattern="*.igs"/>
<glob pattern="*.iges"/>
</mime-type>
+ <mime-type type="model/gltf-binary">
+ <comment>glTF model</comment>
+ <comment xml:lang="zh_CN">glTF 模型</comment>
+ <comment xml:lang="uk">модель glTF</comment>
+ <comment xml:lang="tr">glTF modeli</comment>
+ <comment xml:lang="sv">glTF-modell</comment>
+ <comment xml:lang="sl">Model gITF</comment>
+ <comment xml:lang="si">glTF ආකෘතිය</comment>
+ <comment xml:lang="ru">glTF-модель</comment>
+ <comment xml:lang="pt_BR">Modelo gITF</comment>
+ <comment xml:lang="pl">Model glTF</comment>
+ <comment xml:lang="oc">modèl glTF</comment>
+ <comment xml:lang="nl">glTF-model</comment>
+ <comment xml:lang="ko">glTF 모델</comment>
+ <comment xml:lang="kk">glTF моделі</comment>
+ <comment xml:lang="ja">glTF モデル</comment>
+ <comment xml:lang="it">Modello glTF</comment>
+ <comment xml:lang="hr">glTF model</comment>
+ <comment xml:lang="he">דגם gITF</comment>
+ <comment xml:lang="gl">Modelo glTF</comment>
+ <comment xml:lang="fi">glTF malli</comment>
+ <comment xml:lang="eu">glTF eredua</comment>
+ <comment xml:lang="es">modelo gITF</comment>
+ <comment xml:lang="en_GB">glTF model</comment>
+ <comment xml:lang="de">glTF-Modell</comment>
+ <comment xml:lang="be">мадэль glTF</comment>
+ <comment xml:lang="ar">نموذج glTF</comment>
+ <acronym>glTF</acronym>
+ <expanded-acronym>GL Transmission Format</expanded-acronym>
+ <generic-icon name="image-x-generic"/>
+ <magic>
+ <match type="string" value="glTF" offset="0"/>
+ </magic>
+ <glob pattern="*.glb"/>
+ </mime-type>
+ <mime-type type="model/gltf+json">
+ <comment>glTF model</comment>
+ <comment xml:lang="zh_CN">glTF 模型</comment>
+ <comment xml:lang="uk">модель glTF</comment>
+ <comment xml:lang="tr">glTF modeli</comment>
+ <comment xml:lang="sv">glTF-modell</comment>
+ <comment xml:lang="sl">Model gITF</comment>
+ <comment xml:lang="si">glTF ආකෘතිය</comment>
+ <comment xml:lang="ru">glTF-модель</comment>
+ <comment xml:lang="pt_BR">Modelo gITF</comment>
+ <comment xml:lang="pl">Model glTF</comment>
+ <comment xml:lang="oc">modèl glTF</comment>
+ <comment xml:lang="nl">glTF-model</comment>
+ <comment xml:lang="ko">glTF 모델</comment>
+ <comment xml:lang="kk">glTF моделі</comment>
+ <comment xml:lang="ja">glTF モデル</comment>
+ <comment xml:lang="it">Modello glTF</comment>
+ <comment xml:lang="hr">glTF model</comment>
+ <comment xml:lang="he">דגם gITF</comment>
+ <comment xml:lang="gl">Modelo glTF</comment>
+ <comment xml:lang="fi">glTF malli</comment>
+ <comment xml:lang="eu">glTF eredua</comment>
+ <comment xml:lang="es">modelo gITF</comment>
+ <comment xml:lang="en_GB">glTF model</comment>
+ <comment xml:lang="de">glTF-Modell</comment>
+ <comment xml:lang="be">мадэль glTF</comment>
+ <comment xml:lang="ar">نموذج glTF</comment>
+ <acronym>glTF</acronym>
+ <expanded-acronym>GL Transmission Format</expanded-acronym>
+ <generic-icon name="image-x-generic"/>
+ <sub-class-of type="application/json"/>
+ <glob pattern="*.gltf"/>
+ </mime-type>
<mime-type type="model/vrml">
<comment>VRML document</comment>
- <comment xml:lang="af">VRML-dokument</comment>
- <comment xml:lang="ar">مستند VRML</comment>
- <comment xml:lang="ast">Documentu VRML</comment>
- <comment xml:lang="az">VRML sənədi</comment>
- <comment xml:lang="be-Latn">Dakument VRML</comment>
- <comment xml:lang="bg">Документ — VRML</comment>
- <comment xml:lang="ca">document VRML</comment>
- <comment xml:lang="cs">dokument VRML</comment>
- <comment xml:lang="cy">Dogfen VRML</comment>
- <comment xml:lang="da">VRML-dokument</comment>
- <comment xml:lang="de">VRML-Dokument</comment>
- <comment xml:lang="el">Έγγραφο VRML</comment>
- <comment xml:lang="en-GB">VRML document</comment>
- <comment xml:lang="eo">VRML-dokumento</comment>
- <comment xml:lang="es">documento VRML</comment>
- <comment xml:lang="eu">VRML dokumentua</comment>
- <comment xml:lang="fi">VRML-asiakirja</comment>
- <comment xml:lang="fo">VRML skjal</comment>
- <comment xml:lang="fr">document VRML</comment>
- <comment xml:lang="fur">document VRML</comment>
- <comment xml:lang="ga">cáipéis VRML</comment>
- <comment xml:lang="gl">documento VRML</comment>
- <comment xml:lang="he">מסמך VRML</comment>
- <comment xml:lang="hr">VRML dokument</comment>
- <comment xml:lang="hu">VRML-dokumentum</comment>
- <comment xml:lang="ia">Documento VRML</comment>
- <comment xml:lang="id">Dokumen VRML</comment>
- <comment xml:lang="it">Documento VRML</comment>
- <comment xml:lang="ja">VRML ドキュメント</comment>
- <comment xml:lang="kk">VRML құжаты</comment>
- <comment xml:lang="ko">VRML 문서</comment>
- <comment xml:lang="lt">VRML dokumentas</comment>
- <comment xml:lang="lv">VRML dokuments</comment>
- <comment xml:lang="ms">Dokumen VRML</comment>
- <comment xml:lang="nb">VRML-dokument</comment>
- <comment xml:lang="nl">VRML-document</comment>
- <comment xml:lang="nn">VRML-dokument</comment>
- <comment xml:lang="oc">document VRML</comment>
- <comment xml:lang="pl">Dokument VRML</comment>
- <comment xml:lang="pt">documento VRML</comment>
- <comment xml:lang="pt-BR">Documento VRML</comment>
- <comment xml:lang="ro">Document VRML</comment>
- <comment xml:lang="ru">Документ VRML</comment>
- <comment xml:lang="sk">Dokument VRML</comment>
- <comment xml:lang="sl">Dokument VRML</comment>
- <comment xml:lang="sq">Dokument VRML</comment>
- <comment xml:lang="sr">ВРМЛ документ</comment>
- <comment xml:lang="sv">VRML-dokument</comment>
- <comment xml:lang="tr">VRML belgesi</comment>
- <comment xml:lang="uk">документ VRML</comment>
+ <comment xml:lang="zh_TW">VRML 文件</comment>
+ <comment xml:lang="zh_CN">VRML 文档</comment>
<comment xml:lang="vi">Tài liệu VRML</comment>
- <comment xml:lang="zh-CN">VRML 文档</comment>
- <comment xml:lang="zh-TW">VRML 文件</comment>
+ <comment xml:lang="uk">документ VRML</comment>
+ <comment xml:lang="tr">VRML belgesi</comment>
+ <comment xml:lang="sv">VRML-dokument</comment>
+ <comment xml:lang="sr">ВРМЛ документ</comment>
+ <comment xml:lang="sq">dokument VRML</comment>
+ <comment xml:lang="sl">Dokument VRML</comment>
+ <comment xml:lang="si">VRML ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument VRML</comment>
+ <comment xml:lang="ru">Документ VRML</comment>
+ <comment xml:lang="ro">Document VRML</comment>
+ <comment xml:lang="pt_BR">Documento VRML</comment>
+ <comment xml:lang="pt">documento VRML</comment>
+ <comment xml:lang="pl">Dokument VRML</comment>
+ <comment xml:lang="oc">document VRML</comment>
+ <comment xml:lang="nn">VRML-dokument</comment>
+ <comment xml:lang="nl">VRML-document</comment>
+ <comment xml:lang="nb">VRML-dokument</comment>
+ <comment xml:lang="ms">Dokumen VRML</comment>
+ <comment xml:lang="lv">VRML dokuments</comment>
+ <comment xml:lang="lt">VRML dokumentas</comment>
+ <comment xml:lang="ko">VRML 문서</comment>
+ <comment xml:lang="kk">VRML құжаты</comment>
+ <comment xml:lang="ja">VRML ドキュメント</comment>
+ <comment xml:lang="it">Documento VRML</comment>
+ <comment xml:lang="is">VRML skjal</comment>
+ <comment xml:lang="id">Dokumen VRML</comment>
+ <comment xml:lang="ia">Documento VRML</comment>
+ <comment xml:lang="hu">VRML-dokumentum</comment>
+ <comment xml:lang="hr">VRML dokument</comment>
+ <comment xml:lang="he">מסמך VRML</comment>
+ <comment xml:lang="gl">documento VRML</comment>
+ <comment xml:lang="ga">cáipéis VRML</comment>
+ <comment xml:lang="fur">document VRML</comment>
+ <comment xml:lang="fr">document VRML</comment>
+ <comment xml:lang="fo">VRML skjal</comment>
+ <comment xml:lang="fi">VRML-asiakirja</comment>
+ <comment xml:lang="eu">VRML dokumentua</comment>
+ <comment xml:lang="es">documento VRML</comment>
+ <comment xml:lang="eo">VRML-dokumento</comment>
+ <comment xml:lang="en_GB">VRML document</comment>
+ <comment xml:lang="el">Έγγραφο VRML</comment>
+ <comment xml:lang="de">VRML-Dokument</comment>
+ <comment xml:lang="da">VRML-dokument</comment>
+ <comment xml:lang="cy">Dogfen VRML</comment>
+ <comment xml:lang="cs">dokument VRML</comment>
+ <comment xml:lang="ca">document VRML</comment>
+ <comment xml:lang="bg">Документ — VRML</comment>
+ <comment xml:lang="be@latin">Dakument VRML</comment>
+ <comment xml:lang="be">дакумент VRML</comment>
+ <comment xml:lang="az">VRML sənədi</comment>
+ <comment xml:lang="ast">Documentu VRML</comment>
+ <comment xml:lang="ar">مستند VRML</comment>
+ <comment xml:lang="af">VRML-dokument</comment>
<acronym>VRML</acronym>
<expanded-acronym>Virtual Reality Modeling Language</expanded-acronym>
<generic-icon name="x-office-document"/>
<sub-class-of type="text/plain"/>
- <magic priority="50">
+ <magic>
<match type="string" value="#VRML " offset="0"/>
</magic>
<glob pattern="*.vrm"/>
<glob pattern="*.vrml"/>
<glob pattern="*.wrl"/>
</mime-type>
+ <mime-type type="model/obj">
+ <comment>OBJ 3D model</comment>
+ <comment xml:lang="zh_CN">OBJ 3D 模型</comment>
+ <comment xml:lang="uk">просторова модель OBJ</comment>
+ <comment xml:lang="tr">OBJ 3B modeli</comment>
+ <comment xml:lang="sv">OBJ-3D-modell</comment>
+ <comment xml:lang="sl">3D-model OBJ</comment>
+ <comment xml:lang="si">OBJ 3D ආකෘතිය</comment>
+ <comment xml:lang="ru">OBJ 3D-модель</comment>
+ <comment xml:lang="pt_BR">Modelo OBJ 3D</comment>
+ <comment xml:lang="pl">Model 3D OBJ</comment>
+ <comment xml:lang="oc">modèl OBJ 3D</comment>
+ <comment xml:lang="nl">OBJ 3D-model</comment>
+ <comment xml:lang="ko">OBJ 3D 모델</comment>
+ <comment xml:lang="kk">OBJ 3D моделі</comment>
+ <comment xml:lang="ja">OBJ 3D モデル</comment>
+ <comment xml:lang="it">Modello OBJ 3D</comment>
+ <comment xml:lang="hr">OBJ 3D model</comment>
+ <comment xml:lang="gl">Modelo OBJ 3D</comment>
+ <comment xml:lang="fi">OBJ 3D-malli</comment>
+ <comment xml:lang="eu">OBJ 3D eredua</comment>
+ <comment xml:lang="es">modelo OBJ 3D</comment>
+ <comment xml:lang="en_GB">OBJ 3D model</comment>
+ <comment xml:lang="de">OBJ-3D-Modell</comment>
+ <comment xml:lang="be">мадэль OBJ 3D</comment>
+ <comment xml:lang="ar">نموذج OBJ 3D</comment>
+ <sub-class-of type="text/plain"/>
+ <generic-icon name="image-x-generic"/>
+ <magic>
+ <match type="string" value=" OBJ File: '" offset="0:64"/>
+ <match type="string" value="mtllib " offset="0:256"/>
+ </magic>
+ <glob pattern="*.obj"/>
+ </mime-type>
+ <mime-type type="model/mtl">
+ <comment>OBJ 3D model material library</comment>
+ <comment xml:lang="uk">бібліотека матеріалів просторової моделі OBJ</comment>
+ <comment xml:lang="tr">OBJ 3B modeli malzeme kitaplığı</comment>
+ <comment xml:lang="sv">Materialbibliotek för OBJ 3D-modell</comment>
+ <comment xml:lang="sl">Knjižnica materialov 3D-modelov OBJ</comment>
+ <comment xml:lang="si">OBJ 3D ආදර්ශ ද්රව්ය පුස්තකාලය</comment>
+ <comment xml:lang="ru">Библиотека материалов OBJ 3D-модели</comment>
+ <comment xml:lang="pl">Biblioteka materiałów modeli 3D OBJ</comment>
+ <comment xml:lang="nl">OBJ-3D-model-materiaal­bibliotheek</comment>
+ <comment xml:lang="ko">OBJ 3D 모델 실체 라이브러리</comment>
+ <comment xml:lang="kk">OBJ 3D-моделінің материалдар кітапханасы</comment>
+ <comment xml:lang="ja">OBJ 3D モデルマテリアルライブラリー</comment>
+ <comment xml:lang="it">Modello libreria materiale OBJ 3D</comment>
+ <comment xml:lang="hr">OBJ 3D model biblioteka materijala</comment>
+ <comment xml:lang="fi">OBJ 3D-mallin materiaalikirjasto</comment>
+ <comment xml:lang="es">biblioteca de modelo material OBJ 3D</comment>
+ <comment xml:lang="en_GB">OBJ 3D model material library</comment>
+ <comment xml:lang="de">OBJ-3D-Modell-Materialbibliothek</comment>
+ <comment xml:lang="be">бібліятэка матэрыялаў мадэлі OBJ 3D</comment>
+ <comment xml:lang="ar">مكتبة المواد النموذجية OBJ 3D</comment>
+ <generic-icon name="image-x-generic"/>
+ <sub-class-of type="text/plain"/>
+ <magic>
+ <match type="string" value="# Blender MTL File: '" offset="0"/>
+ <match type="string" value="newmtl " offset="0:256"/>
+ </magic>
+ <glob pattern="*.mtl"/>
+ </mime-type>
<mime-type type="multipart/alternative">
- <comment>message in several formats</comment>
- <comment xml:lang="af">boodskap in verskeie formate</comment>
- <comment xml:lang="ar">رسالة في عدة صيغ</comment>
- <comment xml:lang="az">verici formatlarında ismarış</comment>
- <comment xml:lang="be-Latn">paviedamleńnie ŭ niekalkich farmatach</comment>
- <comment xml:lang="bg">Съобщение в няколко формата</comment>
- <comment xml:lang="ca">missatge en diversos formats</comment>
- <comment xml:lang="cs">zpráva v několika formátech</comment>
- <comment xml:lang="cy">neges mewn sawl fformat</comment>
- <comment xml:lang="da">meddelelse i flere formater</comment>
- <comment xml:lang="de">Nachricht in mehreren Formaten</comment>
- <comment xml:lang="el">Μήνυμα σε διάφορες μορφές</comment>
- <comment xml:lang="en-GB">message in several formats</comment>
- <comment xml:lang="eo">mesaĝo en pluraj formatoj</comment>
- <comment xml:lang="es">mensaje en varios formatos</comment>
- <comment xml:lang="eu">hainbat formatuko mezua</comment>
- <comment xml:lang="fi">viesti useissa muodoissa</comment>
- <comment xml:lang="fo">boð í fleiri sniðum</comment>
- <comment xml:lang="fr">message en formats divers</comment>
- <comment xml:lang="fur">messaç in diviers formâts</comment>
- <comment xml:lang="ga">teachtaireacht i bhformáidí éagsúla</comment>
- <comment xml:lang="gl">mensaxe en varios formatos</comment>
- <comment xml:lang="he">הודעה במספר תבניות</comment>
- <comment xml:lang="hr">Poruka u nekoliko oblika</comment>
- <comment xml:lang="hu">többféle formátumú üzenet</comment>
- <comment xml:lang="ia">Message in plure formatos</comment>
- <comment xml:lang="id">pesan dalam beberapa format</comment>
- <comment xml:lang="it">Messaggio in diversi formati</comment>
- <comment xml:lang="ja">いくつかの形式でのメッセージ</comment>
- <comment xml:lang="kk">бірнеше пішімдегі мәлімдеме</comment>
- <comment xml:lang="ko">여러 가지 형식의 메시지</comment>
- <comment xml:lang="lt">laiškas keletu formatų</comment>
- <comment xml:lang="lv">ziņojums dažādos formātos</comment>
- <comment xml:lang="ms">Mesej dalam beberapa format</comment>
- <comment xml:lang="nb">melding i flere formater</comment>
- <comment xml:lang="nl">bericht in meerdere opmaken</comment>
- <comment xml:lang="nn">melding i fleire format</comment>
- <comment xml:lang="oc">messatge en formats divèrses</comment>
- <comment xml:lang="pl">Wiadomość w wielu formatach</comment>
- <comment xml:lang="pt">mensagem em vários formatos</comment>
- <comment xml:lang="pt-BR">Mensagem em vários formatos</comment>
- <comment xml:lang="ro">mesaj în diferite formate</comment>
- <comment xml:lang="ru">Сообщение в нескольких форматах</comment>
- <comment xml:lang="sk">Správa v niekoľkých formátoch</comment>
- <comment xml:lang="sl">sporočilo v več zapisih</comment>
- <comment xml:lang="sq">Mesazh në formate të ndryshëm</comment>
- <comment xml:lang="sr">порука у неколико записа</comment>
- <comment xml:lang="sv">meddelande i flera format</comment>
- <comment xml:lang="tr">farklı biçimlerde ileti</comment>
+ <comment>Message in several formats</comment>
<comment xml:lang="uk">повідомлення у кількох форматах</comment>
- <comment xml:lang="vi">thông điệp có vài định dạng</comment>
- <comment xml:lang="zh-CN">各种格式的信件</comment>
- <comment xml:lang="zh-TW">多種格式的訊息</comment>
+ <comment xml:lang="sv">Meddelande i flera format</comment>
+ <comment xml:lang="ru">Сообщение в нескольких форматах</comment>
+ <comment xml:lang="pl">Wiadomość w wielu formatach</comment>
+ <comment xml:lang="it">Messaggio in diversi formati</comment>
+ <comment xml:lang="es">mensaje en varios formatos</comment>
+ <comment xml:lang="de">Nachricht in verschiedenen Formaten</comment>
+ <comment xml:lang="be">паведамленне ў некалькіх фарматах</comment>
</mime-type>
<mime-type type="multipart/appledouble">
<comment>Macintosh AppleDouble-encoded file</comment>
- <comment xml:lang="af">Macintosh AppleDouble-geënkodeerde lêer</comment>
- <comment xml:lang="ar">ملف Macintosh AppleDouble مشفر</comment>
- <comment xml:lang="az">Macintosh AppleDouble-kodlanmış fayl</comment>
- <comment xml:lang="be-Latn">Fajł Macintosh, AppleDouble-zakadavany</comment>
- <comment xml:lang="bg">Файл — кодиран с Macintosh AppleDouble</comment>
- <comment xml:lang="ca">fitxer codificat AppleDouble de Macintosh</comment>
- <comment xml:lang="cs">soubor kódovaný pomocí Macintosh AppleDouble</comment>
- <comment xml:lang="cy">Ffeil AppleDouble-amgodedig Macintosh</comment>
- <comment xml:lang="da">Macintosh AppleDouble-kodet fil</comment>
- <comment xml:lang="de">Macintosh-Datei (AppleDouble-kodiert)</comment>
- <comment xml:lang="el">Αρχείο Macintosh κωδικοποίησης AppleDouble</comment>
- <comment xml:lang="en-GB">Macintosh AppleDouble-encoded file</comment>
- <comment xml:lang="eo">dosiero kodigita laŭ Macintosh AppleDouble</comment>
- <comment xml:lang="es">archivo Macintosh codificado con AppleDouble</comment>
- <comment xml:lang="eu">Macintosh AppleDouble-rekin kodetutako fitxategia</comment>
- <comment xml:lang="fi">Macintosh AppleDouble -koodattu tiedosto</comment>
- <comment xml:lang="fo">Macintosh AppleDouble-bronglað fíla</comment>
- <comment xml:lang="fr">fichier codé Macintosh AppleDouble</comment>
- <comment xml:lang="fur">file codificât in Macintosh AppleDouble</comment>
- <comment xml:lang="ga">comhad ionchódaithe le Macintosh AppleDouble</comment>
- <comment xml:lang="gl">ficheiro de Macintosh codificado con AppleDouble</comment>
- <comment xml:lang="he">קובץ מסוג Macintosh AppleDouble-encoded</comment>
- <comment xml:lang="hr">Macintosh AppleDouble-kôdirana datoteka</comment>
- <comment xml:lang="hu">Macintosh AppleDouble kódolású fájl</comment>
- <comment xml:lang="ia">File codificate in AppleDouble de Macintosh</comment>
- <comment xml:lang="id">Berkas tersandi Macintosh AppleDouble</comment>
- <comment xml:lang="it">File Macintosh codificato AppleDouble</comment>
- <comment xml:lang="ja">Macintosh AppleDouble エンコードファイル</comment>
- <comment xml:lang="kk">Macintosh AppleDouble кодталған файлы</comment>
- <comment xml:lang="ko">매킨토시 AppleDouble 인코딩된 파일</comment>
- <comment xml:lang="lt">Macintosh AppleDouble-encoded failas</comment>
- <comment xml:lang="lv">Macintosh AppleDouble-kodēts datne</comment>
- <comment xml:lang="ms">Fail terenkod-AppleDouble Macintosh</comment>
- <comment xml:lang="nb">dokument kodet med Macintosh AppleDouble</comment>
- <comment xml:lang="nl">Macintosh AppleDouble-gecodeerd bestand</comment>
- <comment xml:lang="nn">Macintosh AppleDouble-koda fil</comment>
- <comment xml:lang="oc">fichièr encodat Macintosh AppleDouble</comment>
- <comment xml:lang="pl">Zakodowany w AppleDouble plik Macintosh</comment>
- <comment xml:lang="pt">ficheiro codificado em AppleDouble de Macintosh</comment>
- <comment xml:lang="pt-BR">Arquivo do Macintosh codificado com AppleDouble</comment>
- <comment xml:lang="ro">Fișier codat Macintosh AppleDouble</comment>
- <comment xml:lang="ru">Файл, закодированный Macintosh AppleDouble</comment>
- <comment xml:lang="sk">Súbor kódovaný pomocou Macintosh AppleDouble</comment>
- <comment xml:lang="sl">Kodirana datoteka Macintosh (AppleDouble)</comment>
- <comment xml:lang="sq">File Macintosh i kodifikuar AppleDouble</comment>
- <comment xml:lang="sr">Мекинтошова датотека кодирана Епл Дуплим</comment>
- <comment xml:lang="sv">Macintosh AppleDouble-kodad fil</comment>
- <comment xml:lang="tr">Macintosh AppleDouble-şifreli dosyası</comment>
- <comment xml:lang="uk">файл закодований Macintosh AppleDouble</comment>
+ <comment xml:lang="zh_TW">Macintosh AppleDouble 編碼檔</comment>
+ <comment xml:lang="zh_CN">Macintosh AppleDouble 编码的文件</comment>
<comment xml:lang="vi">Tập tin đã mã hoá Apple-Double của Macintosh</comment>
- <comment xml:lang="zh-CN">Macintosh AppleDouble 编码的文件</comment>
- <comment xml:lang="zh-TW">Macintosh AppleDouble 編碼檔</comment>
+ <comment xml:lang="uk">файл закодований Macintosh AppleDouble</comment>
+ <comment xml:lang="tr">Macintosh AppleDouble-şifreli dosyası</comment>
+ <comment xml:lang="sv">Macintosh AppleDouble-kodad fil</comment>
+ <comment xml:lang="sr">Мекинтошова датотека кодирана Епл Дуплим</comment>
+ <comment xml:lang="sq">kartelë Macintosh koduar me AppleDouble</comment>
+ <comment xml:lang="sl">Kodirana datoteka Macintosh (AppleDouble)</comment>
+ <comment xml:lang="si">Macintosh AppleDouble-කේතනය කළ ගොනුව</comment>
+ <comment xml:lang="sk">Súbor kódovaný pomocou Macintosh AppleDouble</comment>
+ <comment xml:lang="ru">Файл, закодированный Macintosh AppleDouble</comment>
+ <comment xml:lang="ro">Fișier codat Macintosh AppleDouble</comment>
+ <comment xml:lang="pt_BR">Arquivo do Macintosh codificado com AppleDouble</comment>
+ <comment xml:lang="pt">ficheiro codificado em AppleDouble de Macintosh</comment>
+ <comment xml:lang="pl">Zakodowany w AppleDouble plik Macintosh</comment>
+ <comment xml:lang="oc">fichièr encodat Macintosh AppleDouble</comment>
+ <comment xml:lang="nn">Macintosh AppleDouble-koda fil</comment>
+ <comment xml:lang="nl">Macintosh AppleDouble-gecodeerd bestand</comment>
+ <comment xml:lang="nb">dokument kodet med Macintosh AppleDouble</comment>
+ <comment xml:lang="ms">Fail terenkod-AppleDouble Macintosh</comment>
+ <comment xml:lang="lv">Macintosh AppleDouble-kodēts datne</comment>
+ <comment xml:lang="lt">Macintosh AppleDouble-encoded failas</comment>
+ <comment xml:lang="ko">매킨토시 AppleDouble 인코딩된 파일</comment>
+ <comment xml:lang="kk">Macintosh AppleDouble кодталған файлы</comment>
+ <comment xml:lang="ja">Macintosh AppleDouble エンコードファイル</comment>
+ <comment xml:lang="it">File Macintosh codificato AppleDouble</comment>
+ <comment xml:lang="is">Macintosh AppleDouble-kóðuð skrá</comment>
+ <comment xml:lang="id">Berkas tersandi Macintosh AppleDouble</comment>
+ <comment xml:lang="ia">File codificate in AppleDouble de Macintosh</comment>
+ <comment xml:lang="hu">Macintosh AppleDouble kódolású fájl</comment>
+ <comment xml:lang="hr">Macintosh AppleDouble-kôdirana datoteka</comment>
+ <comment xml:lang="he">קובץ מסוג Macintosh AppleDouble-encoded</comment>
+ <comment xml:lang="gl">ficheiro de Macintosh codificado con AppleDouble</comment>
+ <comment xml:lang="ga">comhad ionchódaithe le Macintosh AppleDouble</comment>
+ <comment xml:lang="fur">file codificât in Macintosh AppleDouble</comment>
+ <comment xml:lang="fr">fichier codé Macintosh AppleDouble</comment>
+ <comment xml:lang="fo">Macintosh AppleDouble-bronglað fíla</comment>
+ <comment xml:lang="fi">Macintosh AppleDouble -koodattu tiedosto</comment>
+ <comment xml:lang="eu">Macintosh AppleDouble-rekin kodetutako fitxategia</comment>
+ <comment xml:lang="es">archivo Macintosh codificado con AppleDouble</comment>
+ <comment xml:lang="eo">dosiero kodigita laŭ Macintosh AppleDouble</comment>
+ <comment xml:lang="en_GB">Macintosh AppleDouble-encoded file</comment>
+ <comment xml:lang="el">Αρχείο Macintosh κωδικοποίησης AppleDouble</comment>
+ <comment xml:lang="de">Macintosh-Datei (AppleDouble-Format)</comment>
+ <comment xml:lang="da">Macintosh AppleDouble-kodet fil</comment>
+ <comment xml:lang="cy">Ffeil AppleDouble-amgodedig Macintosh</comment>
+ <comment xml:lang="cs">soubor kódovaný pomocí Macintosh AppleDouble</comment>
+ <comment xml:lang="ca">fitxer codificat AppleDouble de Macintosh</comment>
+ <comment xml:lang="bg">Файл — кодиран с Macintosh AppleDouble</comment>
+ <comment xml:lang="be@latin">Fajł Macintosh, AppleDouble-zakadavany</comment>
+ <comment xml:lang="be">файл з кадаваннем Macintosh AppleDouble</comment>
+ <comment xml:lang="az">Macintosh AppleDouble-kodlanmış fayl</comment>
+ <comment xml:lang="ar">ملف Macintosh AppleDouble مشفر</comment>
+ <comment xml:lang="af">Macintosh AppleDouble-geënkodeerde lêer</comment>
</mime-type>
<mime-type type="multipart/digest">
- <comment>message digest</comment>
- <comment xml:lang="ar">خلاصة الرسالة</comment>
- <comment xml:lang="az">ismarış daycesti</comment>
- <comment xml:lang="be-Latn">digest paviedamleńniaŭ</comment>
- <comment xml:lang="bg">Извадка от съобщение</comment>
- <comment xml:lang="ca">recopilació de missatges</comment>
- <comment xml:lang="cs">přehled zpráv</comment>
- <comment xml:lang="cy">crynodeb negeseuon</comment>
- <comment xml:lang="da">meddelelsessammendrag</comment>
- <comment xml:lang="de">Nachrichtensammlung</comment>
- <comment xml:lang="el">Περίληψη μηνύματος</comment>
- <comment xml:lang="en-GB">message digest</comment>
- <comment xml:lang="eo">mesaĝaro</comment>
- <comment xml:lang="es">recopilación de mensajes</comment>
- <comment xml:lang="eu">mezu laburra</comment>
- <comment xml:lang="fi">viestikokoelma</comment>
- <comment xml:lang="fo">boð samandráttur</comment>
- <comment xml:lang="fr">condensé de message</comment>
- <comment xml:lang="fur">sunt di messaç</comment>
- <comment xml:lang="ga">achoimre theachtaireachtaí</comment>
- <comment xml:lang="gl">recompilación de mensaxe</comment>
- <comment xml:lang="he">תקציר ההודעה</comment>
- <comment xml:lang="hr">Poruka kratkg sadržaja</comment>
- <comment xml:lang="hu">ömlesztett üzenet</comment>
- <comment xml:lang="ia">Digesto de messages</comment>
- <comment xml:lang="id">digest pesan</comment>
- <comment xml:lang="it">Digest di messaggi</comment>
- <comment xml:lang="ja">メッセージダイジェスト</comment>
- <comment xml:lang="kk">мәлімдеме профилі</comment>
- <comment xml:lang="ko">메시지 묶음</comment>
- <comment xml:lang="lt">laiškų santrauka</comment>
- <comment xml:lang="lv">ziņojumu apkopojums</comment>
- <comment xml:lang="ms">Jilid mesej</comment>
- <comment xml:lang="nb">medldingssamling</comment>
- <comment xml:lang="nl">berichtenbundel</comment>
- <comment xml:lang="nn">meldingsamandrag</comment>
- <comment xml:lang="oc">condensé de messatge</comment>
- <comment xml:lang="pl">Wiadomość przetwarzania</comment>
- <comment xml:lang="pt">grupo de mensagens</comment>
- <comment xml:lang="pt-BR">Resumo de mensagem</comment>
- <comment xml:lang="ro">colecție mesaje email</comment>
+ <comment>Message digest</comment>
+ <comment xml:lang="uk">контрольна сума повідомлення</comment>
+ <comment xml:lang="sv">Meddelandesamling</comment>
<comment xml:lang="ru">Дайджест сообщения</comment>
- <comment xml:lang="sk">Prehľad správ</comment>
- <comment xml:lang="sl">povzetek sporočila</comment>
- <comment xml:lang="sq">Shpërndarje mesazhesh</comment>
- <comment xml:lang="sr">гомила порука</comment>
- <comment xml:lang="sv">meddelandesamling</comment>
- <comment xml:lang="tr">ileti özeti</comment>
- <comment xml:lang="uk">збірка повідомлень</comment>
- <comment xml:lang="vi">bản tóm tắt thông điệp</comment>
- <comment xml:lang="zh-CN">信件摘要</comment>
- <comment xml:lang="zh-TW">訊息摘要</comment>
+ <comment xml:lang="pl">Wiadomość przetwarzania</comment>
+ <comment xml:lang="it">Digest di messaggi</comment>
+ <comment xml:lang="es">resumen de mensajes</comment>
+ <comment xml:lang="de">Nachrichtensammlung</comment>
+ <comment xml:lang="be">дайджэст паведамлення</comment>
</mime-type>
<mime-type type="multipart/encrypted">
- <comment>encrypted message</comment>
- <comment xml:lang="af">geënkripteerde boodskap</comment>
- <comment xml:lang="ar">رسالة مشفرة</comment>
- <comment xml:lang="az">şifrələnmiş ismarış</comment>
- <comment xml:lang="be-Latn">zašyfravanaje paviedamleńnie</comment>
- <comment xml:lang="bg">Шифрирано съобщение</comment>
- <comment xml:lang="ca">missatge xifrat</comment>
- <comment xml:lang="cs">zašifrovaná zpráva</comment>
- <comment xml:lang="cy">Neges wedi ei hamgryptio</comment>
- <comment xml:lang="da">krypteret meddelelse</comment>
- <comment xml:lang="de">Verschlüsselte Nachricht</comment>
- <comment xml:lang="el">Κρυπτογραφημένο μήνυμα</comment>
- <comment xml:lang="en-GB">encrypted message</comment>
- <comment xml:lang="eo">ĉifrita mesaĝo</comment>
- <comment xml:lang="es">mensaje cifrado</comment>
- <comment xml:lang="eu">zifratutako mezua</comment>
- <comment xml:lang="fi">salattu viesti</comment>
- <comment xml:lang="fo">bronglað boð</comment>
- <comment xml:lang="fr">message chiffré</comment>
- <comment xml:lang="fur">messaç cifrât</comment>
- <comment xml:lang="ga">teachtaireacht chriptithe</comment>
- <comment xml:lang="gl">mensaxe cifrado</comment>
- <comment xml:lang="he">הודעה מוצפנת</comment>
- <comment xml:lang="hr">Šifrirana poruka</comment>
- <comment xml:lang="hu">titkosított üzenet</comment>
- <comment xml:lang="ia">Message cryptate</comment>
- <comment xml:lang="id">pesan terenkripsi</comment>
- <comment xml:lang="it">Messaggio cifrato</comment>
- <comment xml:lang="ja">暗号化メッセージ</comment>
- <comment xml:lang="kk">шифрленген мәлімдеме</comment>
- <comment xml:lang="ko">암호화된 메시지</comment>
- <comment xml:lang="lt">užšifruotas laiškas</comment>
- <comment xml:lang="lv">šifrēta vēstule</comment>
- <comment xml:lang="ms">Mesej terenkripsi</comment>
- <comment xml:lang="nb">kryptert melding</comment>
- <comment xml:lang="nl">versleuteld bericht</comment>
- <comment xml:lang="nn">kryptert melding</comment>
- <comment xml:lang="oc">messatge chifrat</comment>
- <comment xml:lang="pl">Wiadomość zaszyfrowana</comment>
- <comment xml:lang="pt">mensagem encriptada</comment>
- <comment xml:lang="pt-BR">Mensagem criptografada</comment>
- <comment xml:lang="ro">mesaj criptat</comment>
+ <comment>Encrypted message</comment>
+ <comment xml:lang="uk">зашифроване повідомлення</comment>
+ <comment xml:lang="sv">Krypterat meddelande</comment>
<comment xml:lang="ru">Зашифрованное сообщение</comment>
- <comment xml:lang="sk">Zašifrovaná správa</comment>
- <comment xml:lang="sl">šifrirano sporočilo</comment>
- <comment xml:lang="sq">Mesazh i kriptuar</comment>
- <comment xml:lang="sr">шифрована порука</comment>
- <comment xml:lang="sv">krypterat meddelande</comment>
- <comment xml:lang="tr">şifrelenmiş ileti</comment>
- <comment xml:lang="uk">шифроване повідомлення</comment>
- <comment xml:lang="vi">thông điệp đã mật mã</comment>
- <comment xml:lang="zh-CN">加密信件</comment>
- <comment xml:lang="zh-TW">加密訊息</comment>
+ <comment xml:lang="pl">Wiadomość zaszyfrowana</comment>
+ <comment xml:lang="it">Messaggio cifrato</comment>
+ <comment xml:lang="es">mensaje cifrado</comment>
+ <comment xml:lang="de">Verschlüsselte Nachricht</comment>
+ <comment xml:lang="be">зашыфраванае паведамленне</comment>
</mime-type>
<mime-type type="multipart/mixed">
- <comment>compound documents</comment>
- <comment xml:lang="af">saamgestelde dokumente</comment>
- <comment xml:lang="ar">مستندات مركبة</comment>
- <comment xml:lang="ast">documentos compuestos</comment>
- <comment xml:lang="be-Latn">składanyja dakumenty</comment>
- <comment xml:lang="bg">Съставни документи</comment>
- <comment xml:lang="ca">documents compostos</comment>
- <comment xml:lang="cs">složené dokumenty</comment>
- <comment xml:lang="da">sammensatte dokumenter</comment>
- <comment xml:lang="de">Verbunddokumente</comment>
- <comment xml:lang="el">Σύνθετα έγγραφα</comment>
- <comment xml:lang="en-GB">compound documents</comment>
- <comment xml:lang="eo">parentezaj dokumentoj</comment>
- <comment xml:lang="es">documentos compuestos</comment>
- <comment xml:lang="eu">konposatutako dokumentuak</comment>
- <comment xml:lang="fi">yhdisteasiakirjat</comment>
- <comment xml:lang="fo">samansett skjøl</comment>
- <comment xml:lang="fr">documents composés</comment>
- <comment xml:lang="fur">documents composcj</comment>
- <comment xml:lang="ga">cáipéisí comhshuite</comment>
- <comment xml:lang="gl">documentos compostos</comment>
- <comment xml:lang="he">מסמכים מורכבים</comment>
- <comment xml:lang="hr">Složeni dokumenti</comment>
- <comment xml:lang="hu">összetett dokumentumok</comment>
- <comment xml:lang="ia">Documentos composite</comment>
- <comment xml:lang="id">dokumen kompon</comment>
- <comment xml:lang="it">Documenti composti</comment>
- <comment xml:lang="ja">複合ドキュメント</comment>
- <comment xml:lang="kk">құрама құжаттары</comment>
- <comment xml:lang="ko">복합 문서</comment>
- <comment xml:lang="lt">sudurtiniai dokumentai</comment>
- <comment xml:lang="lv">salikti dokumenti</comment>
- <comment xml:lang="ms">Dokumen halaman</comment>
- <comment xml:lang="nb">sammensatte dokumenter</comment>
- <comment xml:lang="nl">samengestelde documenten</comment>
- <comment xml:lang="nn">samansette dokument</comment>
- <comment xml:lang="oc">documents compausats</comment>
- <comment xml:lang="pl">Dokumenty złożone</comment>
- <comment xml:lang="pt">documentos compostos</comment>
- <comment xml:lang="pt-BR">Documentos compostos</comment>
- <comment xml:lang="ro">documente compuse</comment>
- <comment xml:lang="ru">Составные документы</comment>
- <comment xml:lang="sk">Zložené dokumenty</comment>
- <comment xml:lang="sl">združeni dokumenti</comment>
- <comment xml:lang="sq">dokumente të përbërë</comment>
- <comment xml:lang="sr">сједињени документи</comment>
- <comment xml:lang="sv">sammansatta dokument</comment>
- <comment xml:lang="tr">bileşik belgeler</comment>
+ <comment>Compound documents</comment>
<comment xml:lang="uk">складні документи</comment>
- <comment xml:lang="vi">tài liệu ghép</comment>
- <comment xml:lang="zh-CN">组合文档</comment>
- <comment xml:lang="zh-TW">複合文件</comment>
+ <comment xml:lang="sv">Sammansatta dokument</comment>
+ <comment xml:lang="ru">Составные документы</comment>
+ <comment xml:lang="pl">Dokumenty złożone</comment>
+ <comment xml:lang="it">Documenti composti</comment>
+ <comment xml:lang="de">Verbunddokumente</comment>
+ <comment xml:lang="be">складаныя дакументы</comment>
</mime-type>
<mime-type type="multipart/related">
- <comment>compound document</comment>
- <comment xml:lang="af">saamgestelde dokument</comment>
- <comment xml:lang="ar">مستند مركب</comment>
- <comment xml:lang="ast">documentu compuestu</comment>
- <comment xml:lang="az">birləşik sənəd</comment>
- <comment xml:lang="be-Latn">składany dakument</comment>
- <comment xml:lang="bg">Съставен документ</comment>
- <comment xml:lang="ca">document compost</comment>
- <comment xml:lang="cs">složený dokument</comment>
- <comment xml:lang="cy">dogfen gyfansawdd</comment>
- <comment xml:lang="da">sammensat dokument</comment>
- <comment xml:lang="de">Verbunddokument</comment>
- <comment xml:lang="el">Σύνθετο έγγραφο</comment>
- <comment xml:lang="en-GB">compound document</comment>
- <comment xml:lang="eo">parenteza dokumento</comment>
- <comment xml:lang="es">documento compuesto</comment>
- <comment xml:lang="eu">konposatutako dokumentua</comment>
- <comment xml:lang="fi">yhdisteasiakirja</comment>
- <comment xml:lang="fo">samansett skjal</comment>
- <comment xml:lang="fr">document composé</comment>
- <comment xml:lang="fur">document compost</comment>
- <comment xml:lang="ga">cáipéis comhshuite</comment>
- <comment xml:lang="gl">documento composto</comment>
- <comment xml:lang="he">מסמך מורכב</comment>
- <comment xml:lang="hr">Složeni dokument</comment>
- <comment xml:lang="hu">összetett dokumentum</comment>
- <comment xml:lang="ia">Documento composite</comment>
- <comment xml:lang="id">dokumen kompon</comment>
- <comment xml:lang="it">Documento composto</comment>
- <comment xml:lang="ja">複合ドキュメント</comment>
- <comment xml:lang="kk">құрама құжаты</comment>
- <comment xml:lang="ko">복합 문서</comment>
- <comment xml:lang="lt">sudurtinis dokumentas</comment>
- <comment xml:lang="lv">salikts dokuments</comment>
- <comment xml:lang="ms">Dokumen halaman</comment>
- <comment xml:lang="nb">sammensatt dokument</comment>
- <comment xml:lang="nl">samengesteld document</comment>
- <comment xml:lang="nn">samansett dokument</comment>
- <comment xml:lang="oc">document compausat</comment>
- <comment xml:lang="pl">Dokument złożony</comment>
- <comment xml:lang="pt">documento composto</comment>
- <comment xml:lang="pt-BR">Documento composto</comment>
- <comment xml:lang="ro">document compus</comment>
- <comment xml:lang="ru">Составной документ</comment>
- <comment xml:lang="sk">Zložený dokument</comment>
- <comment xml:lang="sl">združeni dokument</comment>
- <comment xml:lang="sq">dokumet i përbërë</comment>
- <comment xml:lang="sr">сједињени документ</comment>
- <comment xml:lang="sv">sammansatt dokument</comment>
- <comment xml:lang="tr">bileşik belge</comment>
+ <comment>Compound document</comment>
<comment xml:lang="uk">складний документ</comment>
- <comment xml:lang="vi">tài liệu ghép</comment>
- <comment xml:lang="zh-CN">组合文档</comment>
- <comment xml:lang="zh-TW">複合文件</comment>
+ <comment xml:lang="sv">Sammansatt dokument</comment>
+ <comment xml:lang="ru">Составной документ</comment>
+ <comment xml:lang="pl">Dokument złożony</comment>
+ <comment xml:lang="it">Documento composto</comment>
+ <comment xml:lang="de">Verbunddokument</comment>
+ <comment xml:lang="be">складаны дакумент</comment>
</mime-type>
<mime-type type="multipart/report">
- <comment>mail system report</comment>
- <comment xml:lang="ar">تقرير نظام البريد</comment>
- <comment xml:lang="az">poçt sistemi raportu</comment>
- <comment xml:lang="be-Latn">rapart paštovaj systemy</comment>
- <comment xml:lang="bg">Отчет за пощенската система</comment>
- <comment xml:lang="ca">informe de sistema de correu</comment>
- <comment xml:lang="cs">zpráva poštovního systému</comment>
- <comment xml:lang="cy">adroddiad system bost</comment>
- <comment xml:lang="da">postsystemrapport</comment>
- <comment xml:lang="de">E-Mail-Systembericht</comment>
- <comment xml:lang="el">Αναφορά συστήματος ηλ. ταχυδρομείου</comment>
- <comment xml:lang="en-GB">mail system report</comment>
- <comment xml:lang="eo">raporto de retpoŝta sistemo</comment>
- <comment xml:lang="es">informe del sistema de correo</comment>
- <comment xml:lang="eu">posta sistemako txostena</comment>
- <comment xml:lang="fi">viestijärjestelmän ilmoitus</comment>
- <comment xml:lang="fo">postkervisfrásøgn</comment>
- <comment xml:lang="fr">rapport système de courriels</comment>
- <comment xml:lang="fur">rapuart di sisteme de pueste</comment>
- <comment xml:lang="ga">tuairisc chórais r-phoist</comment>
- <comment xml:lang="gl">informe do sistema de correo</comment>
- <comment xml:lang="he">דו״ח של מערכת הדואר</comment>
- <comment xml:lang="hr">Izvještaj sustava pošte</comment>
- <comment xml:lang="hu">levelezőrendszer jelentése</comment>
- <comment xml:lang="ia">Reporto de systema de e-mail</comment>
- <comment xml:lang="id">laporan sistem surat</comment>
- <comment xml:lang="it">Rapporto di sistema posta</comment>
- <comment xml:lang="ja">メールシステムレポート</comment>
- <comment xml:lang="kk">пошта жүйесінің мәлімдемесі</comment>
- <comment xml:lang="ko">메일 시스템 보고서</comment>
- <comment xml:lang="lt">pašto sistemos ataskaita</comment>
- <comment xml:lang="lv">pasta sistēmas atskaite</comment>
- <comment xml:lang="ms">Laporan sistem mel</comment>
- <comment xml:lang="nb">e-postsystemrapport</comment>
- <comment xml:lang="nl">e-mail-systeembericht</comment>
- <comment xml:lang="nn">e-post-systemrapport</comment>
- <comment xml:lang="oc">rapòrt sistèma de corrièrs electronics</comment>
- <comment xml:lang="pl">Raport systemu pocztowego</comment>
- <comment xml:lang="pt">relatório de sistema de email</comment>
- <comment xml:lang="pt-BR">Relatório do sistema de correspondência</comment>
- <comment xml:lang="ro">raport sistem email</comment>
- <comment xml:lang="ru">Отчёт почтовой системы</comment>
- <comment xml:lang="sk">Správa poštového systému</comment>
- <comment xml:lang="sl">poročilo poštnega sistema</comment>
- <comment xml:lang="sq">Raport i sistemit të postës</comment>
- <comment xml:lang="sr">извештај поштанског система</comment>
- <comment xml:lang="sv">e-postsystemrapport</comment>
- <comment xml:lang="tr">posta sistem raporu</comment>
+ <comment>Mail system report</comment>
<comment xml:lang="uk">звіт поштової системи</comment>
- <comment xml:lang="vi">thông báo hệ thống thư</comment>
- <comment xml:lang="zh-CN">邮件系统报告</comment>
- <comment xml:lang="zh-TW">郵件系統回報</comment>
+ <comment xml:lang="sv">E-postsystemrapport</comment>
+ <comment xml:lang="ru">Отчёт почтовой системы</comment>
+ <comment xml:lang="pl">Raport systemu pocztowego</comment>
+ <comment xml:lang="it">Rapporto di sistema posta</comment>
+ <comment xml:lang="de">E-Mail-Systembericht</comment>
+ <comment xml:lang="be">справаздача паштовай сістэмы</comment>
</mime-type>
<mime-type type="multipart/signed">
- <comment>signed message</comment>
- <comment xml:lang="af">getekende boodskap</comment>
- <comment xml:lang="ar">رسالة موقّعة</comment>
- <comment xml:lang="az">imzalanmış ismarış</comment>
- <comment xml:lang="be-Latn">padpisanaje paviedamleńnie</comment>
- <comment xml:lang="bg">Подписано съобщение</comment>
- <comment xml:lang="ca">missatge signat</comment>
- <comment xml:lang="cs">podepsaná zpráva</comment>
- <comment xml:lang="cy">neges lofnodwyd</comment>
- <comment xml:lang="da">signeret meddelelse</comment>
- <comment xml:lang="de">Signierte Nachricht</comment>
- <comment xml:lang="el">Υπογεγραμμένο μήνυμα</comment>
- <comment xml:lang="en-GB">signed message</comment>
- <comment xml:lang="eo">pruvita mesaĝo</comment>
- <comment xml:lang="es">mensaje firmado</comment>
- <comment xml:lang="eu">sinatutako mezua</comment>
- <comment xml:lang="fi">allekirjoitettu viesti</comment>
- <comment xml:lang="fo">undirskrivað boð</comment>
- <comment xml:lang="fr">message signé</comment>
- <comment xml:lang="fur">messaç firmât</comment>
- <comment xml:lang="ga">teachtaireacht sínithe</comment>
- <comment xml:lang="gl">mensaxe firmado</comment>
- <comment xml:lang="he">הודעה חתומה</comment>
- <comment xml:lang="hr">Potpisana poruka</comment>
- <comment xml:lang="hu">aláírt üzenet</comment>
- <comment xml:lang="ia">Message signate</comment>
- <comment xml:lang="id">pesan ditandatangani</comment>
- <comment xml:lang="it">Messaggio firmato</comment>
- <comment xml:lang="ja">署名付きメッセージ</comment>
- <comment xml:lang="kk">қолтаңбасы бар мәлімдеме</comment>
- <comment xml:lang="ko">서명된 메시지</comment>
- <comment xml:lang="lt">pasirašytas laiškas</comment>
- <comment xml:lang="lv">parakstīta ziņa</comment>
- <comment xml:lang="ms">Mesej ditandatangani</comment>
- <comment xml:lang="nb">signert melding</comment>
- <comment xml:lang="nl">ondertekend bericht</comment>
- <comment xml:lang="nn">signert melding</comment>
- <comment xml:lang="oc">messatge signat</comment>
- <comment xml:lang="pl">Podpisana wiadomość</comment>
- <comment xml:lang="pt">mensagem assinada</comment>
- <comment xml:lang="pt-BR">Mensagem assinada</comment>
- <comment xml:lang="ro">mesaj semnat</comment>
- <comment xml:lang="ru">Подписанное сообщение</comment>
- <comment xml:lang="sk">Podpísaná správa</comment>
- <comment xml:lang="sl">podpisano sporočilo</comment>
- <comment xml:lang="sq">Mesazh i firmosur</comment>
- <comment xml:lang="sr">потписана порука</comment>
- <comment xml:lang="sv">signerat meddelande</comment>
- <comment xml:lang="tr">imzalı ileti</comment>
+ <comment>Signed message</comment>
<comment xml:lang="uk">підписане повідомлення</comment>
- <comment xml:lang="vi">thông điệp đã ký</comment>
- <comment xml:lang="zh-CN">签名信件</comment>
- <comment xml:lang="zh-TW">已簽署的訊息</comment>
+ <comment xml:lang="sv">Signerat meddelande</comment>
+ <comment xml:lang="ru">Подписанное сообщение</comment>
+ <comment xml:lang="pl">Podpisana wiadomość</comment>
+ <comment xml:lang="it">Messaggio firmato</comment>
+ <comment xml:lang="es">mensaje firmado</comment>
+ <comment xml:lang="de">Signierte Nachricht</comment>
+ <comment xml:lang="be">падпісанае паведамленне</comment>
</mime-type>
<mime-type type="multipart/x-mixed-replace">
- <comment>stream of data (server push)</comment>
- <comment xml:lang="ar">دفق بيانات (دفع خادم)</comment>
- <comment xml:lang="be-Latn">płyń źviestak (ad servera)</comment>
- <comment xml:lang="bg">Поток от данни — пратени от сървър</comment>
- <comment xml:lang="ca">flux de dades (enviat pel servidor)</comment>
- <comment xml:lang="cs">proud dat (posílaný serverem)</comment>
- <comment xml:lang="da">datastrøm (serverskubbet)</comment>
- <comment xml:lang="de">Datenstrom (Server-Push)</comment>
- <comment xml:lang="el">Ροή δεδομένων (στελλόμενα από διακομιστή)</comment>
- <comment xml:lang="en-GB">stream of data (server push)</comment>
- <comment xml:lang="eo">datumstrio (puŝata per servilo)</comment>
- <comment xml:lang="es">flujo de datos (por iniciativa del servidor)</comment>
- <comment xml:lang="eu">datu-korrontea (zerbitzari igortzailea)</comment>
- <comment xml:lang="fi">tietovirta (palvelin työntää)</comment>
- <comment xml:lang="fo">streymur av dáta (ambætara skump)</comment>
- <comment xml:lang="fr">flux de données (émis par le serveur)</comment>
- <comment xml:lang="fur">flus di dâts (pe iniziative dal servidôr)</comment>
- <comment xml:lang="ga">sruth sonraí (brú freastalaí)</comment>
- <comment xml:lang="gl">fluxo de datos (por iniciativa do servidor)</comment>
- <comment xml:lang="he">מידע בזרימה (דחיפה ע״י השרת)</comment>
- <comment xml:lang="hr">Strujanje podataka (poslužiteljem pogurano)</comment>
- <comment xml:lang="hu">sugárzott adatfolyam (kiszolgálóról)</comment>
- <comment xml:lang="ia">Fluxo de datos (pulsate per servitor)</comment>
- <comment xml:lang="id">arus data (dorongan server)</comment>
- <comment xml:lang="it">Flusso di dati (server push)</comment>
- <comment xml:lang="ja">データストリーム (サーバープッシュ型)</comment>
- <comment xml:lang="kk">мәліметтер ағымы (server push)</comment>
- <comment xml:lang="ko">데이터 스트림(서버 푸시)</comment>
- <comment xml:lang="lt">duomenų srautas (iš serverio)</comment>
- <comment xml:lang="lv">datu straume (servera grūsta)</comment>
- <comment xml:lang="ms">Aliran dara (paksaan pelayan)</comment>
- <comment xml:lang="nb">datastrøm (server push)</comment>
- <comment xml:lang="nl">gegevensstroom (server duwt)</comment>
- <comment xml:lang="nn">datastraum (dytta av tenaren)</comment>
- <comment xml:lang="oc">flux de donadas (emés pel servidor)</comment>
- <comment xml:lang="pl">Strumień danych (wymuszenie serwera)</comment>
- <comment xml:lang="pt">fluxo de dados (empurrados pelo servidor)</comment>
- <comment xml:lang="pt-BR">Fluxo de dados (por iniciativa do servidor)</comment>
- <comment xml:lang="ro">flux de date (de la server)</comment>
- <comment xml:lang="ru">Поток данных (server push)</comment>
- <comment xml:lang="sk">Prúd dát (posielaný serverom)</comment>
- <comment xml:lang="sl">pretok podatkov (strežniški)</comment>
- <comment xml:lang="sq">Fluks me të dhëna (server push)</comment>
- <comment xml:lang="sr">ток података (гурање са сервера)</comment>
- <comment xml:lang="sv">dataflöde (serverutsändning)</comment>
- <comment xml:lang="tr">veri akışı (sunucudan gönderilen)</comment>
+ <comment>Stream of data (server push)</comment>
<comment xml:lang="uk">потік даних (від сервера)</comment>
- <comment xml:lang="vi">luồng dữ liệu (trình phục vụ đẩy)</comment>
- <comment xml:lang="zh-CN">数据流(服务器推送)</comment>
- <comment xml:lang="zh-TW">資料串流 (server push)</comment>
+ <comment xml:lang="sv">Dataflöde (serverutsändning)</comment>
+ <comment xml:lang="ru">Поток данных (server push)</comment>
+ <comment xml:lang="pl">Strumień danych (wymuszenie serwera)</comment>
+ <comment xml:lang="it">Flusso di dati (server push)</comment>
+ <comment xml:lang="de">Datenstrom (Server-Push)</comment>
+ <comment xml:lang="be">плынь даных (ад сервера)</comment>
</mime-type>
<mime-type type="text/calendar">
<comment>VCS/ICS calendar</comment>
- <comment xml:lang="af">VCS/ICS-kalender</comment>
- <comment xml:lang="ar">سجل VCS/ICS</comment>
- <comment xml:lang="be-Latn">Kalandar VCS/ICS</comment>
- <comment xml:lang="bg">Календар — VCS/ICS</comment>
- <comment xml:lang="ca">calendari VCS/ICS</comment>
- <comment xml:lang="cs">kalendář VCS/ICS</comment>
- <comment xml:lang="da">VCS/ICS-kalender</comment>
- <comment xml:lang="de">VCS/ICS-Kalender</comment>
- <comment xml:lang="el">Ημερολόγιο VCS/ICS</comment>
- <comment xml:lang="en-GB">VCS/ICS calendar</comment>
- <comment xml:lang="eo">VCS/ICS-kalendaro</comment>
- <comment xml:lang="es">calendario VCS/ICS</comment>
- <comment xml:lang="eu">VCS/ICS egutegia</comment>
- <comment xml:lang="fi">VCS/ICS-kalenteri</comment>
- <comment xml:lang="fo">VCS/ICS kalendari</comment>
- <comment xml:lang="fr">calendrier VCS/ICS</comment>
- <comment xml:lang="fur">calendari VCS/ICS</comment>
- <comment xml:lang="ga">féilire VCS/ICS</comment>
- <comment xml:lang="gl">Calendario VCS/ICS</comment>
- <comment xml:lang="he">לוח שנה VCS/ICS</comment>
- <comment xml:lang="hr">VCS/ICS kalendar</comment>
- <comment xml:lang="hu">VCS/ICS naptár</comment>
- <comment xml:lang="ia">Calendario VCS/ICS</comment>
- <comment xml:lang="id">Kalender VCS/ICS</comment>
- <comment xml:lang="it">Calendario VCS/ICS</comment>
- <comment xml:lang="ja">VCS/ICS カレンダー</comment>
- <comment xml:lang="kk">VCS/ICS күнтізбесі</comment>
- <comment xml:lang="ko">VCS/ICS 달력</comment>
- <comment xml:lang="lt">VCS/ICS kalendorius</comment>
- <comment xml:lang="lv">VCS/ICS kalendārs</comment>
- <comment xml:lang="nb">VCS/ICS-kalender</comment>
- <comment xml:lang="nl">VCS/ICS-kalender</comment>
- <comment xml:lang="nn">VCS/ICS-kalender</comment>
- <comment xml:lang="oc">calendièr VCS/ICS</comment>
- <comment xml:lang="pl">Kalendarz VCS/ICS</comment>
- <comment xml:lang="pt">calendário VCS/ICS</comment>
- <comment xml:lang="pt-BR">Calendário VCS/ICS</comment>
- <comment xml:lang="ro">Calendar VCS/ICS</comment>
- <comment xml:lang="ru">Календарь VCS/ICS</comment>
- <comment xml:lang="sk">Kalendár VCS/ICS</comment>
- <comment xml:lang="sl">Datoteka koledarja VCS/ICS</comment>
- <comment xml:lang="sq">Kalendar VCS/ICS</comment>
- <comment xml:lang="sr">ВЦС/ИЦС календар</comment>
- <comment xml:lang="sv">VCS/ICS-kalender</comment>
- <comment xml:lang="tr">VCS/ICS takvimi</comment>
- <comment xml:lang="uk">календар VCS/ICS</comment>
+ <comment xml:lang="zh_TW">VCS/ICS 行事曆</comment>
+ <comment xml:lang="zh_CN">VCS/ICS 日历</comment>
<comment xml:lang="vi">Lịch VCS/ICS</comment>
- <comment xml:lang="zh-CN">VCS/ICS 日历</comment>
- <comment xml:lang="zh-TW">VCS/ICS 行事曆</comment>
+ <comment xml:lang="uk">календар VCS/ICS</comment>
+ <comment xml:lang="tr">VCS/ICS takvimi</comment>
+ <comment xml:lang="sv">VCS/ICS-kalender</comment>
+ <comment xml:lang="sr">ВЦС/ИЦС календар</comment>
+ <comment xml:lang="sq">kalendar VCS/ICS</comment>
+ <comment xml:lang="sl">Datoteka koledarja VCS/ICS</comment>
+ <comment xml:lang="si">VCS/ICS දින දර්ශනය</comment>
+ <comment xml:lang="sk">Kalendár VCS/ICS</comment>
+ <comment xml:lang="ru">Календарь VCS/ICS</comment>
+ <comment xml:lang="ro">Calendar VCS/ICS</comment>
+ <comment xml:lang="pt_BR">Calendário VCS/ICS</comment>
+ <comment xml:lang="pt">calendário VCS/ICS</comment>
+ <comment xml:lang="pl">Kalendarz VCS/ICS</comment>
+ <comment xml:lang="oc">calendièr VCS/ICS</comment>
+ <comment xml:lang="nn">VCS/ICS-kalender</comment>
+ <comment xml:lang="nl">VCS/ICS-kalender</comment>
+ <comment xml:lang="nb">VCS/ICS-kalender</comment>
+ <comment xml:lang="lv">VCS/ICS kalendārs</comment>
+ <comment xml:lang="lt">VCS/ICS kalendorius</comment>
+ <comment xml:lang="ko">VCS/ICS 달력</comment>
+ <comment xml:lang="kk">VCS/ICS күнтізбесі</comment>
+ <comment xml:lang="ja">VCS/ICS カレンダー</comment>
+ <comment xml:lang="it">Calendario VCS/ICS</comment>
+ <comment xml:lang="is">VCS/ICS-dagatal</comment>
+ <comment xml:lang="id">Kalender VCS/ICS</comment>
+ <comment xml:lang="ia">Calendario VCS/ICS</comment>
+ <comment xml:lang="hu">VCS/ICS naptár</comment>
+ <comment xml:lang="hr">VCS/ICS kalendar</comment>
+ <comment xml:lang="he">לוח שנה VCS/ICS</comment>
+ <comment xml:lang="gl">Calendario VCS/ICS</comment>
+ <comment xml:lang="ga">féilire VCS/ICS</comment>
+ <comment xml:lang="fur">calendari VCS/ICS</comment>
+ <comment xml:lang="fr">calendrier VCS/ICS</comment>
+ <comment xml:lang="fo">VCS/ICS kalendari</comment>
+ <comment xml:lang="fi">VCS/ICS-kalenteri</comment>
+ <comment xml:lang="eu">VCS/ICS egutegia</comment>
+ <comment xml:lang="es">calendario VCS/ICS</comment>
+ <comment xml:lang="eo">VCS/ICS-kalendaro</comment>
+ <comment xml:lang="en_GB">VCS/ICS calendar</comment>
+ <comment xml:lang="el">Ημερολόγιο VCS/ICS</comment>
+ <comment xml:lang="de">VCS/ICS-Kalender</comment>
+ <comment xml:lang="da">VCS/ICS-kalender</comment>
+ <comment xml:lang="cs">kalendář VCS/ICS</comment>
+ <comment xml:lang="ca">calendari VCS/ICS</comment>
+ <comment xml:lang="bg">Календар — VCS/ICS</comment>
+ <comment xml:lang="be@latin">Kalandar VCS/ICS</comment>
+ <comment xml:lang="be">каляндар VCS/ICS</comment>
+ <comment xml:lang="ar">سجل VCS/ICS</comment>
+ <comment xml:lang="af">VCS/ICS-kalender</comment>
<acronym>VCS/ICS</acronym>
<expanded-acronym>vCalendar/iCalendar</expanded-acronym>
<sub-class-of type="text/plain"/>
<alias type="text/x-vcalendar"/>
<alias type="application/ics"/>
- <magic priority="50">
+ <magic>
<match type="string" value="BEGIN:VCALENDAR" offset="0"/>
<match type="string" value="begin:vcalendar" offset="0"/>
</magic>
@@ -32606,115 +33640,79 @@ command to generate the output files.
</mime-type>
<mime-type type="text/css">
<comment>CSS stylesheet</comment>
- <comment xml:lang="af">CSS-stylblad</comment>
- <comment xml:lang="ar">نمط CSS</comment>
- <comment xml:lang="be-Latn">Arkuš stylaŭ CSS</comment>
- <comment xml:lang="bg">Стилове — CSS</comment>
- <comment xml:lang="ca">llista d'estil CSS</comment>
- <comment xml:lang="cs">stylopis CSS</comment>
- <comment xml:lang="da">CSS-stilark</comment>
- <comment xml:lang="de">CSS-Stilvorlage</comment>
- <comment xml:lang="el">Φύλλο στυλ CSS</comment>
- <comment xml:lang="en-GB">CSS stylesheet</comment>
- <comment xml:lang="eo">CSS-stilfolio</comment>
- <comment xml:lang="es">hoja de estilos CSS</comment>
- <comment xml:lang="eu">CSS estilo-orria</comment>
- <comment xml:lang="fi">CSS-tyylitiedosto</comment>
- <comment xml:lang="fo">CSS sniðark</comment>
- <comment xml:lang="fr">feuille de style CSS</comment>
- <comment xml:lang="fur">sfuei di stîl CSS</comment>
- <comment xml:lang="ga">stílbhileog CSS</comment>
- <comment xml:lang="gl">folla de estilos CSS</comment>
- <comment xml:lang="he">גליון עיצוב CSS</comment>
- <comment xml:lang="hr">CSS stilska tablica</comment>
- <comment xml:lang="hu">CSS stíluslap</comment>
- <comment xml:lang="ia">Folio de stilo CSS</comment>
- <comment xml:lang="id">Lembar gaya CSS</comment>
- <comment xml:lang="it">Foglio di stile CSS</comment>
- <comment xml:lang="ja">CSS スタイルシート</comment>
- <comment xml:lang="ka">CSS სტილი</comment>
- <comment xml:lang="kk">CSS стильдер кестесі</comment>
- <comment xml:lang="ko">CSS 스타일시트</comment>
- <comment xml:lang="lt">CSS stiliaus aprašas</comment>
- <comment xml:lang="lv">CSS stilu saraksts</comment>
- <comment xml:lang="nb">CSS-stilark</comment>
- <comment xml:lang="nl">CSS-stijlblad</comment>
- <comment xml:lang="nn">CSS-stilark</comment>
- <comment xml:lang="oc">fuèlh d'estil CSS</comment>
- <comment xml:lang="pl">Arkusz stylów CSS</comment>
- <comment xml:lang="pt">folha de estilos CSS</comment>
- <comment xml:lang="pt-BR">Folha de estilo CSS</comment>
- <comment xml:lang="ro">Pagină de stil CSS</comment>
- <comment xml:lang="ru">Таблица стилей CSS</comment>
- <comment xml:lang="sk">Štýly CSS</comment>
- <comment xml:lang="sl">Slogovna predloga CSS</comment>
- <comment xml:lang="sq">Fletë stili CSS</comment>
- <comment xml:lang="sr">ЦСС стилски лист</comment>
- <comment xml:lang="sv">CSS-stilmall</comment>
- <comment xml:lang="tr">CSS stil kağıdı</comment>
- <comment xml:lang="uk">таблиця стилів CSS</comment>
+ <comment xml:lang="zh_TW">CSS 樣式表</comment>
+ <comment xml:lang="zh_CN">CSS 样式表</comment>
<comment xml:lang="vi">Tờ kiểu dáng CSS</comment>
- <comment xml:lang="zh-CN">CSS 样式表</comment>
- <comment xml:lang="zh-TW">CSS 樣式表</comment>
+ <comment xml:lang="uk">таблиця стилів CSS</comment>
+ <comment xml:lang="tr">CSS stil kağıdı</comment>
+ <comment xml:lang="sv">CSS-stilmall</comment>
+ <comment xml:lang="sr">ЦСС стилски лист</comment>
+ <comment xml:lang="sq">fletëstil CSS</comment>
+ <comment xml:lang="sl">Slogovna predloga CSS</comment>
+ <comment xml:lang="si">CSS මෝස්තර පත්‍රිකාව</comment>
+ <comment xml:lang="sk">Štýly CSS</comment>
+ <comment xml:lang="ru">Таблица стилей CSS</comment>
+ <comment xml:lang="ro">Pagină de stil CSS</comment>
+ <comment xml:lang="pt_BR">Folha de estilo CSS</comment>
+ <comment xml:lang="pt">folha de estilos CSS</comment>
+ <comment xml:lang="pl">Arkusz stylów CSS</comment>
+ <comment xml:lang="oc">fuèlh d'estil CSS</comment>
+ <comment xml:lang="nn">CSS-stilark</comment>
+ <comment xml:lang="nl">CSS-stijlblad</comment>
+ <comment xml:lang="nb">CSS-stilark</comment>
+ <comment xml:lang="lv">CSS stilu saraksts</comment>
+ <comment xml:lang="lt">CSS stiliaus aprašas</comment>
+ <comment xml:lang="ko">CSS 스타일시트</comment>
+ <comment xml:lang="kk">CSS стильдер кестесі</comment>
+ <comment xml:lang="ka">CSS სტილი</comment>
+ <comment xml:lang="ja">CSS スタイルシート</comment>
+ <comment xml:lang="it">Foglio di stile CSS</comment>
+ <comment xml:lang="is">CSS-stílsnið</comment>
+ <comment xml:lang="id">Lembar gaya CSS</comment>
+ <comment xml:lang="ia">Folio de stilo CSS</comment>
+ <comment xml:lang="hu">CSS stíluslap</comment>
+ <comment xml:lang="hr">CSS stilska tablica</comment>
+ <comment xml:lang="he">גיליון עיצוב CSS</comment>
+ <comment xml:lang="gl">folla de estilos CSS</comment>
+ <comment xml:lang="ga">stílbhileog CSS</comment>
+ <comment xml:lang="fur">sfuei di stîl CSS</comment>
+ <comment xml:lang="fr">feuille de style CSS</comment>
+ <comment xml:lang="fo">CSS sniðark</comment>
+ <comment xml:lang="fi">CSS-tyylitiedosto</comment>
+ <comment xml:lang="eu">CSS estilo-orria</comment>
+ <comment xml:lang="es">hoja de estilos CSS</comment>
+ <comment xml:lang="eo">CSS-stilfolio</comment>
+ <comment xml:lang="en_GB">CSS stylesheet</comment>
+ <comment xml:lang="el">Φύλλο στυλ CSS</comment>
+ <comment xml:lang="de">CSS-Stilvorlage</comment>
+ <comment xml:lang="da">CSS-stilark</comment>
+ <comment xml:lang="cs">stylopis CSS</comment>
+ <comment xml:lang="ca">llista d'estil CSS</comment>
+ <comment xml:lang="bg">Стилове — CSS</comment>
+ <comment xml:lang="be@latin">Arkuš stylaŭ CSS</comment>
+ <comment xml:lang="be">табліца стыляў CSS</comment>
+ <comment xml:lang="ar">نمط CSS</comment>
+ <comment xml:lang="af">CSS-stylblad</comment>
<acronym>CSS</acronym>
<expanded-acronym>Cascading Style Sheets</expanded-acronym>
<sub-class-of type="text/plain"/>
<glob pattern="*.css"/>
</mime-type>
<mime-type type="text/vcard">
- <comment>electronic business card</comment>
- <comment xml:lang="af">elektroniese beskigheidskaartjie</comment>
- <comment xml:lang="ar">بطاقة أعمال إلكترونية</comment>
- <comment xml:lang="be-Latn">elektronnaja biznes-kartka</comment>
- <comment xml:lang="bg">Електронна визитна картичка</comment>
- <comment xml:lang="ca">targeta de visita electrònica</comment>
- <comment xml:lang="cs">elektronická navštívenka</comment>
- <comment xml:lang="da">elektronisk visitkort</comment>
- <comment xml:lang="de">Elektronische Visitenkarte</comment>
- <comment xml:lang="el">Ηλεκτρονική επαγγελματική κάρτα</comment>
- <comment xml:lang="en-GB">electronic business card</comment>
- <comment xml:lang="eo">elektronika vizitkarto</comment>
- <comment xml:lang="es">tarjeta de visita electrónica</comment>
- <comment xml:lang="eu">enpresako txartel elektronikoa</comment>
- <comment xml:lang="fi">sähköinen käyntikortti</comment>
- <comment xml:lang="fo">elektroniskt handilskort</comment>
- <comment xml:lang="fr">carte de visite électronique</comment>
- <comment xml:lang="fur">biliet di visite eletronic</comment>
- <comment xml:lang="ga">cárta gnó leictreonach</comment>
- <comment xml:lang="gl">tarxeta de negocio electrónica</comment>
- <comment xml:lang="he">כרטיס ביקור אלקטרוני</comment>
- <comment xml:lang="hr">Elektronička posjetnica</comment>
- <comment xml:lang="hu">elektronikus névjegykártya</comment>
- <comment xml:lang="ia">Carta de visita electronic</comment>
- <comment xml:lang="id">kartu bisnis elektronik</comment>
- <comment xml:lang="it">Biglietto da visita elettronico</comment>
- <comment xml:lang="ja">電子名刺</comment>
- <comment xml:lang="kk">электронды визит карточкасы</comment>
- <comment xml:lang="ko">전자 명함</comment>
- <comment xml:lang="lt">elektroninė vizitinė kortelė</comment>
- <comment xml:lang="lv">elektroniskā biznesa kartiņa</comment>
- <comment xml:lang="nl">elektronisch visitekaartje</comment>
- <comment xml:lang="nn">elektronisk visittkort</comment>
- <comment xml:lang="oc">carta de visita electronica</comment>
- <comment xml:lang="pl">Wizytówka elektroniczna</comment>
- <comment xml:lang="pt">cartão de visita eletrónico</comment>
- <comment xml:lang="pt-BR">Cartão de visitas eletrônico</comment>
- <comment xml:lang="ro">carte de vizită electronică</comment>
- <comment xml:lang="ru">Электронная визитная карточка</comment>
- <comment xml:lang="sk">Elektronická vizitka</comment>
- <comment xml:lang="sl">elektronska poslovna vizitka</comment>
- <comment xml:lang="sq">Skedë elektronike biznesi</comment>
- <comment xml:lang="sr">електронска пословна картица</comment>
- <comment xml:lang="sv">elektroniskt visitkort</comment>
- <comment xml:lang="tr">elektronik iş kartı</comment>
+ <comment>Electronic business card</comment>
<comment xml:lang="uk">електронна бізнес-картка</comment>
- <comment xml:lang="vi">danh thiếp điện tử</comment>
- <comment xml:lang="zh-CN">电子商务卡</comment>
- <comment xml:lang="zh-TW">電子商務名片</comment>
+ <comment xml:lang="sv">Elektroniskt visitkort</comment>
+ <comment xml:lang="ru">Электронная визитная карточка</comment>
+ <comment xml:lang="pl">Wizytówka elektroniczna</comment>
+ <comment xml:lang="ja">電子名刺</comment>
+ <comment xml:lang="it">Biglietto da visita elettronico</comment>
+ <comment xml:lang="es">tarjeta de visita electrónica</comment>
+ <comment xml:lang="de">Elektronische Visitenkarte</comment>
+ <comment xml:lang="be">электронная візітная картка</comment>
<alias type="text/directory"/>
<alias type="text/x-vcard"/>
<sub-class-of type="text/plain"/>
- <magic priority="50">
+ <magic>
<match type="string" value="BEGIN:VCARD" offset="0"/>
<match type="string" value="begin:vcard" offset="0"/>
</magic>
@@ -32725,98 +33723,108 @@ command to generate the output files.
</mime-type>
<mime-type type="text/turtle">
<comment>Turtle document</comment>
- <comment xml:lang="af">Turtle-dokument</comment>
- <comment xml:lang="ast">Documentu Turtle</comment>
- <comment xml:lang="bg">Документ — Turtle</comment>
- <comment xml:lang="ca">document Turtle</comment>
- <comment xml:lang="cs">dokument Turtle</comment>
- <comment xml:lang="da">Turtle-dokument</comment>
- <comment xml:lang="de">Turtle-Dokument</comment>
- <comment xml:lang="el">Έγγραφο Turtle</comment>
- <comment xml:lang="en-GB">Turtle document</comment>
- <comment xml:lang="es">documento de Turtle</comment>
- <comment xml:lang="eu">Turtle dokumentua</comment>
- <comment xml:lang="fi">Turtle-asiakirja</comment>
- <comment xml:lang="fr">document Turtle</comment>
- <comment xml:lang="fur">document Turtle</comment>
- <comment xml:lang="ga">cáipéis Turtle</comment>
- <comment xml:lang="he">מסמך Turtle</comment>
- <comment xml:lang="hr">Turtle dokument</comment>
- <comment xml:lang="hu">Turtle dokumentum</comment>
- <comment xml:lang="ia">Documento Turtle</comment>
- <comment xml:lang="id">Dokumen Turtle</comment>
- <comment xml:lang="it">Documento Turtle</comment>
- <comment xml:lang="kk">Turtle құжаты</comment>
- <comment xml:lang="ko">Turtle 문서</comment>
- <comment xml:lang="oc">document Turtle</comment>
- <comment xml:lang="pl">Dokument Turtle</comment>
- <comment xml:lang="pt">documento Turtle</comment>
- <comment xml:lang="pt-BR">Documento Turtle</comment>
- <comment xml:lang="ru">Документ Turtle</comment>
- <comment xml:lang="sk">Dokument Turtle</comment>
- <comment xml:lang="sl">Dokument Turtle</comment>
- <comment xml:lang="sr">Тартл документ</comment>
- <comment xml:lang="sv">Turtle-dokument</comment>
- <comment xml:lang="tr">Turtle belgesi</comment>
+ <comment xml:lang="zh_TW">Turtle 文件</comment>
+ <comment xml:lang="zh_CN">Turtle 文档</comment>
<comment xml:lang="uk">документ Turtle</comment>
- <comment xml:lang="zh-CN">Turtle 文档</comment>
- <comment xml:lang="zh-TW">Turtle 文件</comment>
+ <comment xml:lang="tr">Turtle belgesi</comment>
+ <comment xml:lang="sv">Turtle-dokument</comment>
+ <comment xml:lang="sr">Тартл документ</comment>
+ <comment xml:lang="sq">dokument Turtle</comment>
+ <comment xml:lang="sl">Dokument Turtle</comment>
+ <comment xml:lang="si">කැස්බෑ ලියවිල්ල</comment>
+ <comment xml:lang="sk">Dokument Turtle</comment>
+ <comment xml:lang="ru">Документ Turtle</comment>
+ <comment xml:lang="pt_BR">Documento Turtle</comment>
+ <comment xml:lang="pt">documento Turtle</comment>
+ <comment xml:lang="pl">Dokument Turtle</comment>
+ <comment xml:lang="oc">document Turtle</comment>
+ <comment xml:lang="nl">Turtle-document</comment>
+ <comment xml:lang="ko">Turtle 문서</comment>
+ <comment xml:lang="kk">Turtle құжаты</comment>
+ <comment xml:lang="ja">Turtle ドキュメント</comment>
+ <comment xml:lang="it">Documento Turtle</comment>
+ <comment xml:lang="is">Turtle skjal</comment>
+ <comment xml:lang="id">Dokumen Turtle</comment>
+ <comment xml:lang="ia">Documento Turtle</comment>
+ <comment xml:lang="hu">Turtle dokumentum</comment>
+ <comment xml:lang="hr">Turtle dokument</comment>
+ <comment xml:lang="he">מסמך Turtle</comment>
+ <comment xml:lang="ga">cáipéis Turtle</comment>
+ <comment xml:lang="fur">document Turtle</comment>
+ <comment xml:lang="fr">document Turtle</comment>
+ <comment xml:lang="fi">Turtle-asiakirja</comment>
+ <comment xml:lang="eu">Turtle dokumentua</comment>
+ <comment xml:lang="es">documento de Turtle</comment>
+ <comment xml:lang="en_GB">Turtle document</comment>
+ <comment xml:lang="el">Έγγραφο Turtle</comment>
+ <comment xml:lang="de">Turtle-Dokument</comment>
+ <comment xml:lang="da">Turtle-dokument</comment>
+ <comment xml:lang="cs">dokument Turtle</comment>
+ <comment xml:lang="ca">document Turtle</comment>
+ <comment xml:lang="bg">Документ — Turtle</comment>
+ <comment xml:lang="be">дакумент Turtle</comment>
+ <comment xml:lang="ast">Documentu Turtle</comment>
+ <comment xml:lang="ar">وثيقة Turtle</comment>
+ <comment xml:lang="af">Turtle-dokument</comment>
<glob pattern="*.ttl"/>
<sub-class-of type="text/plain"/>
</mime-type>
<mime-type type="text/x-txt2tags">
<comment>txt2tags document</comment>
- <comment xml:lang="af">txt2tags-dokument</comment>
- <comment xml:lang="ar">مستند txt2tags</comment>
- <comment xml:lang="ast">Documentu txt2tags</comment>
- <comment xml:lang="be-Latn">dakument txt2tags</comment>
- <comment xml:lang="bg">Документ — txt2tags</comment>
- <comment xml:lang="ca">document txt2tags</comment>
- <comment xml:lang="cs">dokument txt2tags</comment>
- <comment xml:lang="da">txt2tags-dokument</comment>
- <comment xml:lang="de">txt2tags-Dokument</comment>
- <comment xml:lang="el">Έγγραφο txt2tags</comment>
- <comment xml:lang="en-GB">txt2tags document</comment>
- <comment xml:lang="eo">txt2tags-dokumento</comment>
- <comment xml:lang="es">documento txt2tags</comment>
- <comment xml:lang="eu">txt2tags dokumentua</comment>
- <comment xml:lang="fi">txt2tags-asiakirja</comment>
- <comment xml:lang="fo">txt2tags skjal</comment>
- <comment xml:lang="fr">document txt2tags</comment>
- <comment xml:lang="fur">document txt2tags</comment>
- <comment xml:lang="ga">cáipéis txt2tags</comment>
- <comment xml:lang="gl">documento txt2tags</comment>
- <comment xml:lang="he">מסמך txt2tags</comment>
- <comment xml:lang="hr">txt2tags dokument</comment>
- <comment xml:lang="hu">txt2tags dokumentum</comment>
- <comment xml:lang="ia">Documento txt2tags</comment>
- <comment xml:lang="id">dokumen txt2tags</comment>
- <comment xml:lang="it">Documento txt2tags</comment>
- <comment xml:lang="ja">txt2tags ドキュメント</comment>
- <comment xml:lang="ka">txt2tags დოკუმენტი</comment>
- <comment xml:lang="kk">txt2tags құжаты</comment>
- <comment xml:lang="ko">txt2tags 문서</comment>
- <comment xml:lang="lt">txt2tags dokumentas</comment>
- <comment xml:lang="lv">txt2tags dokuments</comment>
- <comment xml:lang="nb">txt2tags-dokument</comment>
- <comment xml:lang="nl">txt2tags-document</comment>
- <comment xml:lang="nn">txt2tags-dokument</comment>
- <comment xml:lang="oc">document txt2tags</comment>
- <comment xml:lang="pl">Dokument txt2tags</comment>
- <comment xml:lang="pt">documento txt2tags</comment>
- <comment xml:lang="pt-BR">Documento do txt2tags</comment>
- <comment xml:lang="ro">document txt2tags</comment>
- <comment xml:lang="ru">Документ txt2tags</comment>
- <comment xml:lang="sk">Dokument txt2tags</comment>
- <comment xml:lang="sl">Dokument txt2tags</comment>
- <comment xml:lang="sq">Dokument txt2tags</comment>
- <comment xml:lang="sr">документ текста-у-ознаке</comment>
- <comment xml:lang="sv">txt2tags-dokument</comment>
- <comment xml:lang="tr">txt2tags belgesi</comment>
- <comment xml:lang="uk">документ txt2tags</comment>
+ <comment xml:lang="zh_TW">txt2tags 文件</comment>
+ <comment xml:lang="zh_CN">txt2tags 文档</comment>
<comment xml:lang="vi">tài liệu txt2tags</comment>
- <comment xml:lang="zh-CN">txt2tags 文档</comment>
- <comment xml:lang="zh-TW">txt2tags 文件</comment>
+ <comment xml:lang="uk">документ txt2tags</comment>
+ <comment xml:lang="tr">txt2tags belgesi</comment>
+ <comment xml:lang="sv">txt2tags-dokument</comment>
+ <comment xml:lang="sr">документ текста-у-ознаке</comment>
+ <comment xml:lang="sq">dokument txt2tags</comment>
+ <comment xml:lang="sl">Dokument txt2tags</comment>
+ <comment xml:lang="si">txt2tags ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument txt2tags</comment>
+ <comment xml:lang="ru">Документ txt2tags</comment>
+ <comment xml:lang="ro">document txt2tags</comment>
+ <comment xml:lang="pt_BR">Documento do txt2tags</comment>
+ <comment xml:lang="pt">documento txt2tags</comment>
+ <comment xml:lang="pl">Dokument txt2tags</comment>
+ <comment xml:lang="oc">document txt2tags</comment>
+ <comment xml:lang="nn">txt2tags-dokument</comment>
+ <comment xml:lang="nl">txt2tags-document</comment>
+ <comment xml:lang="nb">txt2tags-dokument</comment>
+ <comment xml:lang="lv">txt2tags dokuments</comment>
+ <comment xml:lang="lt">txt2tags dokumentas</comment>
+ <comment xml:lang="ko">txt2tags 문서</comment>
+ <comment xml:lang="kk">txt2tags құжаты</comment>
+ <comment xml:lang="ka">txt2tags დოკუმენტი</comment>
+ <comment xml:lang="ja">txt2tags ドキュメント</comment>
+ <comment xml:lang="it">Documento txt2tags</comment>
+ <comment xml:lang="is">txt2tags skjalskjal</comment>
+ <comment xml:lang="id">dokumen txt2tags</comment>
+ <comment xml:lang="ia">Documento txt2tags</comment>
+ <comment xml:lang="hu">txt2tags dokumentum</comment>
+ <comment xml:lang="hr">txt2tags dokument</comment>
+ <comment xml:lang="he">מסמך txt2tags</comment>
+ <comment xml:lang="gl">documento txt2tags</comment>
+ <comment xml:lang="ga">cáipéis txt2tags</comment>
+ <comment xml:lang="fur">document txt2tags</comment>
+ <comment xml:lang="fr">document txt2tags</comment>
+ <comment xml:lang="fo">txt2tags skjal</comment>
+ <comment xml:lang="fi">txt2tags-asiakirja</comment>
+ <comment xml:lang="eu">txt2tags dokumentua</comment>
+ <comment xml:lang="es">documento txt2tags</comment>
+ <comment xml:lang="eo">txt2tags-dokumento</comment>
+ <comment xml:lang="en_GB">txt2tags document</comment>
+ <comment xml:lang="el">Έγγραφο txt2tags</comment>
+ <comment xml:lang="de">txt2tags-Dokument</comment>
+ <comment xml:lang="da">txt2tags-dokument</comment>
+ <comment xml:lang="cs">dokument txt2tags</comment>
+ <comment xml:lang="ca">document txt2tags</comment>
+ <comment xml:lang="bg">Документ — txt2tags</comment>
+ <comment xml:lang="be@latin">dakument txt2tags</comment>
+ <comment xml:lang="be">дакумент txt2tags</comment>
+ <comment xml:lang="ast">Documentu txt2tags</comment>
+ <comment xml:lang="ar">مستند txt2tags</comment>
+ <comment xml:lang="af">txt2tags-dokument</comment>
<sub-class-of type="text/plain"/>
<magic priority="60">
<match type="string" value="%!postproc" offset="0"/>
@@ -32826,178 +33834,198 @@ command to generate the output files.
</mime-type>
<mime-type type="text/x-verilog">
<comment>Verilog source code</comment>
- <comment xml:lang="af">Verilog-bronkode</comment>
- <comment xml:lang="bg">Изходен код — Verilog</comment>
- <comment xml:lang="ca">codi font en Verilog</comment>
- <comment xml:lang="cs">zdrojový kód v jazyce Verilog</comment>
- <comment xml:lang="da">Verilog-kildekode</comment>
- <comment xml:lang="de">Verilog-Quelltext</comment>
- <comment xml:lang="el">Πηγαίος κώδικας Verilog</comment>
- <comment xml:lang="en-GB">Verilog source code</comment>
- <comment xml:lang="eo">Verilog-fontkodo</comment>
- <comment xml:lang="es">código fuente en Verilog</comment>
- <comment xml:lang="eu">Verilog iturburu-kodea</comment>
- <comment xml:lang="fi">Verilog-lähdekoodi</comment>
- <comment xml:lang="fr">code source Verilog</comment>
- <comment xml:lang="fur">codiç sorzint Verilog</comment>
- <comment xml:lang="ga">cód foinseach Verilog</comment>
- <comment xml:lang="gl">código fonte en Verilog</comment>
- <comment xml:lang="he">קוד מקור של </comment>
- <comment xml:lang="hr">Verilog izvorni kôd</comment>
- <comment xml:lang="hu">Verilog-forráskód</comment>
- <comment xml:lang="ia">Codice-fonte Verilog</comment>
- <comment xml:lang="id">Kode sumber Verilog</comment>
- <comment xml:lang="it">Codice sorgente Verilog</comment>
- <comment xml:lang="ja">Verilog ソースコード</comment>
- <comment xml:lang="kk">Verilog бастапқы коды</comment>
- <comment xml:lang="ko">Verilog 소스 코드</comment>
- <comment xml:lang="lv">Verilog pirmkods</comment>
- <comment xml:lang="nl">Verilog broncode</comment>
- <comment xml:lang="oc">còde font Verilog</comment>
- <comment xml:lang="pl">Kod źródłowy Verilog</comment>
- <comment xml:lang="pt">código origem Verilog</comment>
- <comment xml:lang="pt-BR">Código-fonte Verilog</comment>
- <comment xml:lang="ru">Исходный код Verilog</comment>
- <comment xml:lang="sk">Zdrojový kód Verilog</comment>
- <comment xml:lang="sl">Datoteka izvorne kode Verilog</comment>
- <comment xml:lang="sr">изворни код Верилога</comment>
- <comment xml:lang="sv">Verilog-källkod</comment>
+ <comment xml:lang="zh_TW">Verilog 源碼</comment>
+ <comment xml:lang="zh_CN">Verilog 源代码</comment>
+ <comment xml:lang="uk">початковий код мовою Verilog</comment>
<comment xml:lang="tr">Verilog kaynak kodu</comment>
- <comment xml:lang="uk">вихідний код мовою Verilog</comment>
- <comment xml:lang="zh-CN">Verilog 源代码</comment>
- <comment xml:lang="zh-TW">Verilog 源碼</comment>
+ <comment xml:lang="sv">Verilog-källkod</comment>
+ <comment xml:lang="sr">изворни код Верилога</comment>
+ <comment xml:lang="sq">kod burim Verilog</comment>
+ <comment xml:lang="sl">Datoteka izvorne kode Verilog</comment>
+ <comment xml:lang="si">Verilog මූලාශ්ර කේතය</comment>
+ <comment xml:lang="sk">Zdrojový kód Verilog</comment>
+ <comment xml:lang="ru">Исходный код Verilog</comment>
+ <comment xml:lang="pt_BR">Código-fonte Verilog</comment>
+ <comment xml:lang="pt">código origem Verilog</comment>
+ <comment xml:lang="pl">Kod źródłowy Verilog</comment>
+ <comment xml:lang="oc">còde font Verilog</comment>
+ <comment xml:lang="nl">Verilog-broncode</comment>
+ <comment xml:lang="lv">Verilog pirmkods</comment>
+ <comment xml:lang="ko">Verilog 소스 코드</comment>
+ <comment xml:lang="kk">Verilog бастапқы коды</comment>
+ <comment xml:lang="ja">Verilog ソースコード</comment>
+ <comment xml:lang="it">Codice sorgente Verilog</comment>
+ <comment xml:lang="is">Verilog frumkóði</comment>
+ <comment xml:lang="id">Kode sumber Verilog</comment>
+ <comment xml:lang="ia">Codice-fonte Verilog</comment>
+ <comment xml:lang="hu">Verilog-forráskód</comment>
+ <comment xml:lang="hr">Verilog izvorni kôd</comment>
+ <comment xml:lang="he">קוד מקור של </comment>
+ <comment xml:lang="gl">código fonte en Verilog</comment>
+ <comment xml:lang="ga">cód foinseach Verilog</comment>
+ <comment xml:lang="fur">codiç sorzint Verilog</comment>
+ <comment xml:lang="fr">code source Verilog</comment>
+ <comment xml:lang="fi">Verilog-lähdekoodi</comment>
+ <comment xml:lang="eu">Verilog iturburu-kodea</comment>
+ <comment xml:lang="es">código fuente en Verilog</comment>
+ <comment xml:lang="eo">Verilog-fontkodo</comment>
+ <comment xml:lang="en_GB">Verilog source code</comment>
+ <comment xml:lang="el">Πηγαίος κώδικας Verilog</comment>
+ <comment xml:lang="de">Verilog-Quelltext</comment>
+ <comment xml:lang="da">Verilog-kildekode</comment>
+ <comment xml:lang="cs">zdrojový kód v jazyce Verilog</comment>
+ <comment xml:lang="ca">codi font en Verilog</comment>
+ <comment xml:lang="bg">Изходен код — Verilog</comment>
+ <comment xml:lang="be">зыходны код Verilog</comment>
+ <comment xml:lang="ar">شفرة مصدر Verilog</comment>
+ <comment xml:lang="af">Verilog-bronkode</comment>
<sub-class-of type="text/plain"/>
<glob pattern="*.v"/>
</mime-type>
<mime-type type="text/x-svhdr">
<comment>SystemVerilog header</comment>
- <comment xml:lang="bg">Заглавен файл — SystemVerilog</comment>
- <comment xml:lang="ca">capçalera en SystemVerilog</comment>
- <comment xml:lang="cs">záhlaví SystemVerilog</comment>
- <comment xml:lang="da">SystemVerilog-teksthoved</comment>
- <comment xml:lang="de">SystemVerilog-Header</comment>
- <comment xml:lang="el">Κεφαλίδα SystemVerilog</comment>
- <comment xml:lang="en-GB">SystemVerilog header</comment>
- <comment xml:lang="es">cabeceras de SystemVerilog</comment>
- <comment xml:lang="eu">SystemVerilog goiburua</comment>
- <comment xml:lang="fi">SystemVerilog-otsake</comment>
- <comment xml:lang="fr">en-tête </comment>
- <comment xml:lang="fur">intestazion SystemVerilog</comment>
- <comment xml:lang="ga">ceanntásc SystemVerilog</comment>
- <comment xml:lang="gl">Cabeceiras de SystemVerilog</comment>
- <comment xml:lang="he">כותרת SystemVerilog</comment>
- <comment xml:lang="hr">SystemVerilog zaglavlje</comment>
- <comment xml:lang="hu">SystemVerilog fejléc</comment>
- <comment xml:lang="ia">Capite SystemVerilog</comment>
- <comment xml:lang="id">Header SystemVerilog</comment>
- <comment xml:lang="it">Header SystemVerilog</comment>
- <comment xml:lang="ja">SystemVerilog ヘッダー</comment>
- <comment xml:lang="kk">SystemVerilog тақырыптамасы</comment>
- <comment xml:lang="ko">SystemVerilog 헤더</comment>
- <comment xml:lang="lv">SystemVerilog galvene</comment>
- <comment xml:lang="nl">SystemVerilog header</comment>
- <comment xml:lang="oc">entèsta SystemVerilog</comment>
- <comment xml:lang="pl">Nagłówek SystemVerilog</comment>
- <comment xml:lang="pt">cabeçalho SystemVerilog</comment>
- <comment xml:lang="pt-BR">Cabeçalho de SystemVerilog</comment>
- <comment xml:lang="ru">Заголовочный файл SystemVerilog</comment>
- <comment xml:lang="sk">Hlavičky SystemVerilog</comment>
- <comment xml:lang="sl">Datoteka glave SystemVerilog</comment>
- <comment xml:lang="sr">заглавље Система Верилога</comment>
- <comment xml:lang="sv">SystemVerilog-headerfil</comment>
- <comment xml:lang="tr">SystemVerilog başlığı</comment>
+ <comment xml:lang="zh_TW">SystemVerilog 標頭</comment>
+ <comment xml:lang="zh_CN">SystemVerilog 头文件</comment>
<comment xml:lang="uk">заголовки SystemVerilog</comment>
- <comment xml:lang="zh-CN">SystemVerilog 头文件</comment>
- <comment xml:lang="zh-TW">SystemVerilog 標頭</comment>
+ <comment xml:lang="tr">SystemVerilog başlığı</comment>
+ <comment xml:lang="sv">SystemVerilog-headerfil</comment>
+ <comment xml:lang="sr">заглавље Система Верилога</comment>
+ <comment xml:lang="sq">krye SystemVerilog</comment>
+ <comment xml:lang="sl">Datoteka glave SystemVerilog</comment>
+ <comment xml:lang="si">SystemVerilog ශීර්ෂකය</comment>
+ <comment xml:lang="sk">Hlavičky SystemVerilog</comment>
+ <comment xml:lang="ru">Заголовочный файл SystemVerilog</comment>
+ <comment xml:lang="pt_BR">Cabeçalho de SystemVerilog</comment>
+ <comment xml:lang="pt">cabeçalho SystemVerilog</comment>
+ <comment xml:lang="pl">Nagłówek SystemVerilog</comment>
+ <comment xml:lang="oc">entèsta SystemVerilog</comment>
+ <comment xml:lang="nl">SystemVerilog-header</comment>
+ <comment xml:lang="lv">SystemVerilog galvene</comment>
+ <comment xml:lang="ko">SystemVerilog 헤더</comment>
+ <comment xml:lang="kk">SystemVerilog тақырыптамасы</comment>
+ <comment xml:lang="ja">SystemVerilog ヘッダー</comment>
+ <comment xml:lang="it">Header SystemVerilog</comment>
+ <comment xml:lang="is">SystemVerilog haus</comment>
+ <comment xml:lang="id">Header SystemVerilog</comment>
+ <comment xml:lang="ia">Capite SystemVerilog</comment>
+ <comment xml:lang="hu">SystemVerilog fejléc</comment>
+ <comment xml:lang="hr">SystemVerilog zaglavlje</comment>
+ <comment xml:lang="he">כותרת SystemVerilog</comment>
+ <comment xml:lang="gl">Cabeceiras de SystemVerilog</comment>
+ <comment xml:lang="ga">ceanntásc SystemVerilog</comment>
+ <comment xml:lang="fur">intestazion SystemVerilog</comment>
+ <comment xml:lang="fr">en-tête </comment>
+ <comment xml:lang="fi">SystemVerilog-otsake</comment>
+ <comment xml:lang="eu">SystemVerilog goiburua</comment>
+ <comment xml:lang="es">cabeceras de SystemVerilog</comment>
+ <comment xml:lang="en_GB">SystemVerilog header</comment>
+ <comment xml:lang="el">Κεφαλίδα SystemVerilog</comment>
+ <comment xml:lang="de">SystemVerilog-Header</comment>
+ <comment xml:lang="da">SystemVerilog-teksthoved</comment>
+ <comment xml:lang="cs">záhlaví SystemVerilog</comment>
+ <comment xml:lang="ca">capçalera en SystemVerilog</comment>
+ <comment xml:lang="bg">Заглавен файл — SystemVerilog</comment>
+ <comment xml:lang="be">загаловак SystemVerilog</comment>
+ <comment xml:lang="ar">ترويسة SystemVerilog</comment>
<sub-class-of type="text/x-verilog"/>
<glob pattern="*.svh"/>
</mime-type>
<mime-type type="text/x-svsrc">
<comment>SystemVerilog source code</comment>
- <comment xml:lang="af">SystemVerilog-bronkode</comment>
- <comment xml:lang="bg">Изходен код — SystemVerilog</comment>
- <comment xml:lang="ca">codi font en SystemVerilog</comment>
- <comment xml:lang="cs">zdrojový kód SystemVerilog</comment>
- <comment xml:lang="da">SystemVerilog-kildekode</comment>
- <comment xml:lang="de">SystemVerilog-Quelltext</comment>
- <comment xml:lang="el">Πηγαίος κώδικας SystemVerilog</comment>
- <comment xml:lang="en-GB">SystemVerilog source code</comment>
- <comment xml:lang="es">código fuente en SystemVerilog</comment>
- <comment xml:lang="eu">SystemVerilog iturburu-kodea</comment>
- <comment xml:lang="fi">SystemVerilog-lähdekoodi</comment>
- <comment xml:lang="fr">code source </comment>
- <comment xml:lang="fur">codiç sorzint SystemVerilog</comment>
- <comment xml:lang="ga">cód foinseach SystemVerilog</comment>
- <comment xml:lang="gl">código fonte en SystemVerilog</comment>
- <comment xml:lang="he">קוד מקור של SystemVerilog</comment>
- <comment xml:lang="hr">SystemVerilog izvorni kôd</comment>
- <comment xml:lang="hu">SystemVerilog-forráskód</comment>
- <comment xml:lang="ia">Codice-fonte SystemVerilog</comment>
- <comment xml:lang="id">Kode sumber SystemVerilog</comment>
- <comment xml:lang="it">Codice sorgente </comment>
- <comment xml:lang="ja">SystemVerilog ソースコード</comment>
- <comment xml:lang="kk">SystemVerilog бастапқы коды</comment>
- <comment xml:lang="ko">SystemVerilog 소스 코드</comment>
- <comment xml:lang="lv">SystemVerilog pirmkods</comment>
- <comment xml:lang="nl">SystemVerilog broncode</comment>
- <comment xml:lang="oc">còde font SystemVerilog</comment>
- <comment xml:lang="pl">Kod źródłowy SystemVerilog</comment>
- <comment xml:lang="pt">código origem SystemVerilog</comment>
- <comment xml:lang="pt-BR">Código-fonte de SystemVerilog</comment>
- <comment xml:lang="ru">Исходный код SystemVerilog</comment>
- <comment xml:lang="sk">Zdrojový kód SystemVerilog</comment>
- <comment xml:lang="sl">Datoteka izvorne kode SystemVerilog</comment>
- <comment xml:lang="sr">изворни код Система Верилога</comment>
- <comment xml:lang="sv">SystemVerilog-källkod</comment>
+ <comment xml:lang="zh_TW">SystemVerilog 源碼</comment>
+ <comment xml:lang="zh_CN">SystemVerilog 源代码</comment>
+ <comment xml:lang="uk">початковий код мовою SystemVerilog</comment>
<comment xml:lang="tr">SystemVerilog kaynak kodu</comment>
- <comment xml:lang="uk">вихідний файл мовою SystemVerilog</comment>
- <comment xml:lang="zh-CN">SystemVerilog 源代码</comment>
- <comment xml:lang="zh-TW">SystemVerilog 源碼</comment>
+ <comment xml:lang="sv">SystemVerilog-källkod</comment>
+ <comment xml:lang="sr">изворни код Система Верилога</comment>
+ <comment xml:lang="sq">kod burim SystemVerilog</comment>
+ <comment xml:lang="sl">Datoteka izvorne kode SystemVerilog</comment>
+ <comment xml:lang="si">SystemVerilog මූලාශ්‍ර කේතය</comment>
+ <comment xml:lang="sk">Zdrojový kód SystemVerilog</comment>
+ <comment xml:lang="ru">Исходный код SystemVerilog</comment>
+ <comment xml:lang="pt_BR">Código-fonte de SystemVerilog</comment>
+ <comment xml:lang="pt">código origem SystemVerilog</comment>
+ <comment xml:lang="pl">Kod źródłowy SystemVerilog</comment>
+ <comment xml:lang="oc">còde font SystemVerilog</comment>
+ <comment xml:lang="nl">SystemVerilog-broncode</comment>
+ <comment xml:lang="lv">SystemVerilog pirmkods</comment>
+ <comment xml:lang="ko">SystemVerilog 소스 코드</comment>
+ <comment xml:lang="kk">SystemVerilog бастапқы коды</comment>
+ <comment xml:lang="ja">SystemVerilog ソースコード</comment>
+ <comment xml:lang="it">Codice sorgente </comment>
+ <comment xml:lang="is">SystemVerilog frumkóði</comment>
+ <comment xml:lang="id">Kode sumber SystemVerilog</comment>
+ <comment xml:lang="ia">Codice-fonte SystemVerilog</comment>
+ <comment xml:lang="hu">SystemVerilog-forráskód</comment>
+ <comment xml:lang="hr">SystemVerilog izvorni kôd</comment>
+ <comment xml:lang="he">קוד מקור של SystemVerilog</comment>
+ <comment xml:lang="gl">código fonte en SystemVerilog</comment>
+ <comment xml:lang="ga">cód foinseach SystemVerilog</comment>
+ <comment xml:lang="fur">codiç sorzint SystemVerilog</comment>
+ <comment xml:lang="fr">code source </comment>
+ <comment xml:lang="fi">SystemVerilog-lähdekoodi</comment>
+ <comment xml:lang="eu">SystemVerilog iturburu-kodea</comment>
+ <comment xml:lang="es">código fuente en SystemVerilog</comment>
+ <comment xml:lang="en_GB">SystemVerilog source code</comment>
+ <comment xml:lang="el">Πηγαίος κώδικας SystemVerilog</comment>
+ <comment xml:lang="de">SystemVerilog-Quelltext</comment>
+ <comment xml:lang="da">SystemVerilog-kildekode</comment>
+ <comment xml:lang="cs">zdrojový kód SystemVerilog</comment>
+ <comment xml:lang="ca">codi font en SystemVerilog</comment>
+ <comment xml:lang="bg">Изходен код — SystemVerilog</comment>
+ <comment xml:lang="be">зыходны код SystemVerilog</comment>
+ <comment xml:lang="ar">شفرة مصدر SystemVerilog</comment>
+ <comment xml:lang="af">SystemVerilog-bronkode</comment>
<sub-class-of type="text/x-verilog"/>
<glob pattern="*.sv"/>
</mime-type>
<mime-type type="text/x-vhdl">
<comment>VHDL source code</comment>
- <comment xml:lang="af">VHDL-bronkode</comment>
- <comment xml:lang="bg">Изходен код — VHDL</comment>
- <comment xml:lang="ca">codi font en VHDL</comment>
- <comment xml:lang="cs">zdrojový kód v jazyce VHDL</comment>
- <comment xml:lang="da">VHDL-kildekode</comment>
- <comment xml:lang="de">VHDL-Quelltext</comment>
- <comment xml:lang="el">Πηγαίος κώδικας VHDL</comment>
- <comment xml:lang="en-GB">VHDL source code</comment>
- <comment xml:lang="eo">VHDL-fontkodo</comment>
- <comment xml:lang="es">código fuente en VHDL</comment>
- <comment xml:lang="eu">VHDL iturburu-kodea</comment>
- <comment xml:lang="fi">VHDL-lähdekoodi</comment>
- <comment xml:lang="fr">code source VHDL</comment>
- <comment xml:lang="fur">codiç sorzint VHDL</comment>
- <comment xml:lang="ga">cód foinseach VHDL</comment>
- <comment xml:lang="gl">código fonte en VHDL</comment>
- <comment xml:lang="he">קוד מקור של VHDL</comment>
- <comment xml:lang="hr">VHDL izvorni kôd</comment>
- <comment xml:lang="hu">VHDL-forráskód</comment>
- <comment xml:lang="ia">Codice-fonte VHDL</comment>
- <comment xml:lang="id">Kode sumber VHDL</comment>
- <comment xml:lang="it">Codice sorgente VHDL</comment>
- <comment xml:lang="ja">VHDL ソースコード</comment>
- <comment xml:lang="kk">VHDL бастапқы коды</comment>
- <comment xml:lang="ko">VHDL 소스 코드</comment>
- <comment xml:lang="lv">VHDL pirmkods</comment>
- <comment xml:lang="nl">VHDL broncode</comment>
- <comment xml:lang="oc">còde font VHDL</comment>
- <comment xml:lang="pl">Kod źródłowy VHDL</comment>
- <comment xml:lang="pt">código origem VHDL</comment>
- <comment xml:lang="pt-BR">Código-fonte VHDL</comment>
- <comment xml:lang="ru">Исходный код VHDL</comment>
- <comment xml:lang="sk">Zdrojový kód VHDL</comment>
- <comment xml:lang="sl">Datoteka izvorne kode VHDL</comment>
- <comment xml:lang="sr">ВХДЛ изворни код</comment>
- <comment xml:lang="sv">VHDL-källkod</comment>
+ <comment xml:lang="zh_TW">VHDL 源碼</comment>
+ <comment xml:lang="zh_CN">VHDL 源代码</comment>
+ <comment xml:lang="uk">початковий код мовою VHDL</comment>
<comment xml:lang="tr">VHDL kaynak kodu</comment>
- <comment xml:lang="uk">вихідний код мовою VHDL</comment>
- <comment xml:lang="zh-CN">VHDL 源代码</comment>
- <comment xml:lang="zh-TW">VHDL 源碼</comment>
+ <comment xml:lang="sv">VHDL-källkod</comment>
+ <comment xml:lang="sr">ВХДЛ изворни код</comment>
+ <comment xml:lang="sq">kod burim VHDL</comment>
+ <comment xml:lang="sl">Datoteka izvorne kode VHDL</comment>
+ <comment xml:lang="si">VHDL මූල කේතය</comment>
+ <comment xml:lang="sk">Zdrojový kód VHDL</comment>
+ <comment xml:lang="ru">Исходный код VHDL</comment>
+ <comment xml:lang="pt_BR">Código-fonte VHDL</comment>
+ <comment xml:lang="pt">código origem VHDL</comment>
+ <comment xml:lang="pl">Kod źródłowy VHDL</comment>
+ <comment xml:lang="oc">còde font VHDL</comment>
+ <comment xml:lang="nl">VHDL-broncode</comment>
+ <comment xml:lang="lv">VHDL pirmkods</comment>
+ <comment xml:lang="ko">VHDL 소스 코드</comment>
+ <comment xml:lang="kk">VHDL бастапқы коды</comment>
+ <comment xml:lang="ja">VHDL ソースコード</comment>
+ <comment xml:lang="it">Codice sorgente VHDL</comment>
+ <comment xml:lang="is">VHDL frumkóði</comment>
+ <comment xml:lang="id">Kode sumber VHDL</comment>
+ <comment xml:lang="ia">Codice-fonte VHDL</comment>
+ <comment xml:lang="hu">VHDL-forráskód</comment>
+ <comment xml:lang="hr">VHDL izvorni kôd</comment>
+ <comment xml:lang="he">קוד מקור של VHDL</comment>
+ <comment xml:lang="gl">código fonte en VHDL</comment>
+ <comment xml:lang="ga">cód foinseach VHDL</comment>
+ <comment xml:lang="fur">codiç sorzint VHDL</comment>
+ <comment xml:lang="fr">code source VHDL</comment>
+ <comment xml:lang="fi">VHDL-lähdekoodi</comment>
+ <comment xml:lang="eu">VHDL iturburu-kodea</comment>
+ <comment xml:lang="es">código fuente en VHDL</comment>
+ <comment xml:lang="eo">VHDL-fontkodo</comment>
+ <comment xml:lang="en_GB">VHDL source code</comment>
+ <comment xml:lang="el">Πηγαίος κώδικας VHDL</comment>
+ <comment xml:lang="de">VHDL-Quelltext</comment>
+ <comment xml:lang="da">VHDL-kildekode</comment>
+ <comment xml:lang="cs">zdrojový kód v jazyce VHDL</comment>
+ <comment xml:lang="ca">codi font en VHDL</comment>
+ <comment xml:lang="bg">Изходен код — VHDL</comment>
+ <comment xml:lang="be">зыходны код VHDL</comment>
+ <comment xml:lang="ar">شفرة مصدر VHDL</comment>
+ <comment xml:lang="af">VHDL-bronkode</comment>
<acronym>VHDL</acronym>
<expanded-acronym>Very-High-Speed Integrated Circuit Hardware Description Language</expanded-acronym>
<sub-class-of type="text/plain"/>
@@ -33005,171 +34033,47 @@ command to generate the output files.
<glob pattern="*.vhdl"/>
</mime-type>
<mime-type type="text/enriched">
- <comment>enriched text document</comment>
- <comment xml:lang="af">verrykte teksdokument</comment>
- <comment xml:lang="ar">مستند نصي مغنى</comment>
- <comment xml:lang="ast">documentu de testu arriquecíu</comment>
- <comment xml:lang="az">zəngin mətn sənədi</comment>
- <comment xml:lang="be-Latn">azdobleny tekstavy dakument</comment>
- <comment xml:lang="bg">Документ с обогатен текст</comment>
- <comment xml:lang="ca">document de text enriquit</comment>
- <comment xml:lang="cs">rozšířený textový dokument</comment>
- <comment xml:lang="cy">Dogfen testun wedi ei gyfoethogi</comment>
- <comment xml:lang="da">beriget tekstdokument</comment>
- <comment xml:lang="de">Angereichertes Textdokument</comment>
- <comment xml:lang="el">Έγγραφο εμπλουτισμένου κειμένου</comment>
- <comment xml:lang="en-GB">enriched text document</comment>
- <comment xml:lang="eo">riĉigita teksta dokumento</comment>
- <comment xml:lang="es">documento de texto enriquecido</comment>
- <comment xml:lang="eu">aberastutako testu dokumentua</comment>
- <comment xml:lang="fi">rikastettu tekstiasiakirja</comment>
- <comment xml:lang="fo">ríkað tekstskjal</comment>
- <comment xml:lang="fr">document texte enrichi</comment>
- <comment xml:lang="fur">document di test inricjît</comment>
- <comment xml:lang="ga">cáipéis téacs saibhrithe</comment>
- <comment xml:lang="gl">documento de texto enriquecido</comment>
- <comment xml:lang="he">מסמך טקסט מועשר</comment>
- <comment xml:lang="hr">Obogaćeni tekstovni dokument</comment>
- <comment xml:lang="hu">enriched text dokumentum</comment>
- <comment xml:lang="ia">Documento de texto inricchite</comment>
- <comment xml:lang="id">dokumen teks diperkaya</comment>
- <comment xml:lang="it">Documento testo arricchito</comment>
- <comment xml:lang="ja">リッチテキストドキュメント</comment>
- <comment xml:lang="kk">пішімделген мәтіндік құжаты</comment>
- <comment xml:lang="ko">확장된 텍스트 문서</comment>
- <comment xml:lang="lt">praturtinto teksto dokumentas</comment>
- <comment xml:lang="lv">bagātināta teksta formāts</comment>
- <comment xml:lang="ms">Dokumen teks diperkaya</comment>
- <comment xml:lang="nb">riktekst-dokument</comment>
- <comment xml:lang="nl">verrijkt tekstdocument</comment>
- <comment xml:lang="nn">rik tekst tekstdokument</comment>
- <comment xml:lang="oc">document tèxte enriquit</comment>
- <comment xml:lang="pl">Wzbogacony dokument tekstowy</comment>
- <comment xml:lang="pt">documento de texto rico</comment>
- <comment xml:lang="pt-BR">Documento de texto enriquecido</comment>
- <comment xml:lang="ro">document text îmbogățit</comment>
- <comment xml:lang="ru">Форматированный текстовый документ</comment>
- <comment xml:lang="sk">Rozšírený textový dokument</comment>
- <comment xml:lang="sl">dokument z obogatenim besedilom</comment>
- <comment xml:lang="sq">Dokument teksti i pasuruar</comment>
- <comment xml:lang="sr">обогаћени текстуални документ</comment>
- <comment xml:lang="sv">berikat textdokument</comment>
- <comment xml:lang="tr">zenginleştirilmiş metin belgesi</comment>
+ <comment>Enriched text document</comment>
<comment xml:lang="uk">форматований текстовий документ</comment>
- <comment xml:lang="vi">tài liệu văn bản có kiểu dáng</comment>
- <comment xml:lang="zh-CN">浓缩文本文档 (ETF)</comment>
- <comment xml:lang="zh-TW">豐富化文字文件</comment>
+ <comment xml:lang="sv">Enriched text-dokument</comment>
+ <comment xml:lang="ru">Форматированный текстовый документ</comment>
+ <comment xml:lang="pl">Wzbogacony dokument tekstowy</comment>
+ <comment xml:lang="ja">装飾された文書</comment>
+ <comment xml:lang="it">Documento testo arricchito</comment>
+ <comment xml:lang="es">documento de texto enriquecido</comment>
+ <comment xml:lang="de">Angereichertes Textdokument</comment>
+ <comment xml:lang="be">дакумент з фарматаваннем enriched text</comment>
<sub-class-of type="text/plain"/>
</mime-type>
<mime-type type="text/htmlh">
- <comment>help page</comment>
- <comment xml:lang="af">hulpbladsy</comment>
- <comment xml:lang="ar">صفحة المساعدة</comment>
- <comment xml:lang="az">yardım səhifəsi</comment>
- <comment xml:lang="be-Latn">staronka dapamohi</comment>
- <comment xml:lang="bg">Страница от помощта</comment>
- <comment xml:lang="ca">pàgina d'ajuda</comment>
- <comment xml:lang="cs">stránka nápovědy</comment>
- <comment xml:lang="cy">tudalen gymorth</comment>
- <comment xml:lang="da">hjælpeside</comment>
- <comment xml:lang="de">Hilfeseite</comment>
- <comment xml:lang="el">Σελίδα βοήθειας</comment>
- <comment xml:lang="en-GB">help page</comment>
- <comment xml:lang="eo">help-paĝo</comment>
- <comment xml:lang="es">página de ayuda</comment>
- <comment xml:lang="eu">laguntzako orria</comment>
- <comment xml:lang="fi">ohjesivu</comment>
- <comment xml:lang="fo">hjálparsíða</comment>
- <comment xml:lang="fr">page d'aide</comment>
- <comment xml:lang="fur">pagjine di jutori</comment>
- <comment xml:lang="ga">leathanach cabhrach</comment>
- <comment xml:lang="gl">páxina de axuda</comment>
- <comment xml:lang="he">דף עזרה</comment>
- <comment xml:lang="hr">Stranica pomoći</comment>
- <comment xml:lang="hu">súgóoldal</comment>
- <comment xml:lang="ia">Pagina de adjuta</comment>
- <comment xml:lang="id">halaman bantuan</comment>
- <comment xml:lang="it">Pagina di aiuto</comment>
- <comment xml:lang="ja">ヘルプページ</comment>
- <comment xml:lang="kk">анықтама парағы</comment>
- <comment xml:lang="ko">도움말 페이지</comment>
- <comment xml:lang="lt">žinyno puslapis</comment>
- <comment xml:lang="lv">palīdzības lapa</comment>
- <comment xml:lang="ms">Halaman bantuan</comment>
- <comment xml:lang="nb">hjelpside</comment>
- <comment xml:lang="nl">hulppagina</comment>
- <comment xml:lang="nn">hjelpeside</comment>
- <comment xml:lang="oc">pagina d'ajuda</comment>
- <comment xml:lang="pl">Strona pomocy</comment>
- <comment xml:lang="pt">página de ajuda</comment>
- <comment xml:lang="pt-BR">Página de ajuda</comment>
- <comment xml:lang="ro">pagină de ajutor</comment>
+ <comment>Help page</comment>
+ <comment xml:lang="uk">Довідкова сторінка</comment>
+ <comment xml:lang="sv">Hjälpsida</comment>
<comment xml:lang="ru">Страница справки</comment>
- <comment xml:lang="sk">Stránka Pomocníka</comment>
- <comment xml:lang="sl">stran pomoči</comment>
- <comment xml:lang="sq">Faqe ndihme</comment>
- <comment xml:lang="sr">страница помоћи</comment>
- <comment xml:lang="sv">hjälpsida</comment>
- <comment xml:lang="tr">yardım sayfası</comment>
- <comment xml:lang="uk">сторінка довідки</comment>
- <comment xml:lang="vi">trang trợ giúp</comment>
- <comment xml:lang="zh-CN">帮助页面</comment>
- <comment xml:lang="zh-TW">求助頁面</comment>
+ <comment xml:lang="pt_BR">Página de ajuda</comment>
+ <comment xml:lang="pl">Strona pomocy</comment>
+ <comment xml:lang="ja">取説文書</comment>
+ <comment xml:lang="it">Pagina di aiuto</comment>
+ <comment xml:lang="eu">Laguntza-orria</comment>
+ <comment xml:lang="es">página de ayuda</comment>
+ <comment xml:lang="de">Hilfeseite</comment>
+ <comment xml:lang="be">старонка даведкі</comment>
<sub-class-of type="text/plain"/>
</mime-type>
<mime-type type="text/plain">
- <comment>plain text document</comment>
- <comment xml:lang="af">skoonteksdokument</comment>
- <comment xml:lang="ar">مستند نصي مجرد</comment>
- <comment xml:lang="ast">documentu de testu planu</comment>
- <comment xml:lang="be-Latn">prosty tekstavy dakument</comment>
- <comment xml:lang="bg">Документ с неформатиран текст</comment>
- <comment xml:lang="ca">document de text pla</comment>
- <comment xml:lang="cs">prostý textový dokument</comment>
- <comment xml:lang="da">rent tekstdokument</comment>
- <comment xml:lang="de">Einfaches Textdokument</comment>
- <comment xml:lang="el">Έγγραφο απλού κειμένου</comment>
- <comment xml:lang="en-GB">plain text document</comment>
- <comment xml:lang="eo">plata teksta dokumento</comment>
- <comment xml:lang="es">documento de texto sencillo</comment>
- <comment xml:lang="eu">testu soileko dokumentua</comment>
- <comment xml:lang="fi">perustekstiasiakirja</comment>
- <comment xml:lang="fr">document texte brut</comment>
- <comment xml:lang="fur">document di test sempliç</comment>
- <comment xml:lang="ga">cáipéis ghnáth-théacs</comment>
- <comment xml:lang="gl">documento de texto sinxelo</comment>
- <comment xml:lang="he">מסמך טקסט פשוט</comment>
- <comment xml:lang="hr">Običan tekstovni dokument</comment>
- <comment xml:lang="hu">egyszerű szöveg</comment>
- <comment xml:lang="ia">Documento de texto simple</comment>
- <comment xml:lang="id">dokumen teks polos</comment>
- <comment xml:lang="it">Documento in testo semplice</comment>
- <comment xml:lang="ja">平文テキストドキュメント</comment>
- <comment xml:lang="kk">мәтіндік құжаты</comment>
- <comment xml:lang="ko">일반 텍스트 문서</comment>
- <comment xml:lang="lt">paprastas tekstinis dokumentas</comment>
- <comment xml:lang="lv">vienkāršs teksta dokuments</comment>
- <comment xml:lang="ms">Dokumen teks jernih</comment>
- <comment xml:lang="nb">vanlig tekstdokument</comment>
- <comment xml:lang="nl">plattetekst-document</comment>
- <comment xml:lang="nn">vanleg tekstdokument</comment>
- <comment xml:lang="oc">document tèxte brut</comment>
- <comment xml:lang="pl">Zwykły dokument tekstowy</comment>
- <comment xml:lang="pt">documento em texto simples</comment>
- <comment xml:lang="pt-BR">Documento de Texto</comment>
- <comment xml:lang="ro">document text simplu</comment>
+ <comment>Plain text document</comment>
+ <comment xml:lang="uk">простий текстовий документ</comment>
+ <comment xml:lang="sv">Vanligt textdokument</comment>
<comment xml:lang="ru">Текстовый документ</comment>
- <comment xml:lang="sk">Obyčajný textový dokument</comment>
- <comment xml:lang="sl">običajna besedilna datoteka</comment>
- <comment xml:lang="sq">Dokument në tekst të thjeshtë</comment>
- <comment xml:lang="sr">обичан текстуални документ</comment>
- <comment xml:lang="sv">vanligt textdokument</comment>
- <comment xml:lang="tr">düz metin belgesi</comment>
- <comment xml:lang="uk">звичайний текстовий документ</comment>
- <comment xml:lang="vi">tài liệu nhập thô</comment>
- <comment xml:lang="zh-CN">纯文本文档</comment>
- <comment xml:lang="zh-TW">純文字文件</comment>
- <magic priority="50">
+ <comment xml:lang="pt_BR">Documento de texto simples</comment>
+ <comment xml:lang="pl">Zwykły dokument tekstowy</comment>
+ <comment xml:lang="ja">平文文書</comment>
+ <comment xml:lang="it">Documento in testo semplice</comment>
+ <comment xml:lang="eu">Testu soileko dokumentua</comment>
+ <comment xml:lang="es">documento de texto sin formato</comment>
+ <comment xml:lang="de">Einfaches Textdokument</comment>
+ <comment xml:lang="be">звычайны тэкст</comment>
+ <magic>
<match type="string" value="This is TeX," offset="0"/>
<match type="string" value="This is METAFONT," offset="0"/>
</magic>
@@ -33179,55 +34083,58 @@ command to generate the output files.
</mime-type>
<mime-type type="application/rdf+xml">
<comment>RDF file</comment>
- <comment xml:lang="af">RDF-lêer</comment>
- <comment xml:lang="ar">ملف RDF</comment>
- <comment xml:lang="be-Latn">Fajł RDF</comment>
- <comment xml:lang="bg">Файл — RDF</comment>
- <comment xml:lang="ca">fitxer RDF</comment>
- <comment xml:lang="cs">soubor RDF</comment>
- <comment xml:lang="da">RDF-fil</comment>
- <comment xml:lang="de">RDF-Datei</comment>
- <comment xml:lang="el">Αρχείο RDF</comment>
- <comment xml:lang="en-GB">RDF file</comment>
- <comment xml:lang="eo">RDF-dosiero</comment>
- <comment xml:lang="es">archivo RDF</comment>
- <comment xml:lang="eu">RDF fitxategia</comment>
- <comment xml:lang="fi">RDF-tiedosto</comment>
- <comment xml:lang="fo">RDF fíla</comment>
- <comment xml:lang="fr">fichier RDF</comment>
- <comment xml:lang="fur">file RDF</comment>
- <comment xml:lang="ga">comhad RDF</comment>
- <comment xml:lang="gl">ficheiro RDF</comment>
- <comment xml:lang="he">קובץ RDF</comment>
- <comment xml:lang="hr">RDF datoteka</comment>
- <comment xml:lang="hu">RDF fájl</comment>
- <comment xml:lang="ia">File RDF</comment>
- <comment xml:lang="id">Arsip RDF</comment>
- <comment xml:lang="it">File RDF</comment>
- <comment xml:lang="ja">RDF ファイル</comment>
- <comment xml:lang="kk">RDF файлы</comment>
- <comment xml:lang="ko">RDF 파일</comment>
- <comment xml:lang="lt">RDF failas</comment>
- <comment xml:lang="lv">RDF datne</comment>
- <comment xml:lang="nb">RDF-fil</comment>
- <comment xml:lang="nl">RDF-bestand</comment>
- <comment xml:lang="nn">RDF-fil</comment>
- <comment xml:lang="oc">fichièr RDF</comment>
- <comment xml:lang="pl">Plik RDF</comment>
- <comment xml:lang="pt">ficheiro RDF</comment>
- <comment xml:lang="pt-BR">Arquivo RDF</comment>
- <comment xml:lang="ro">Fișier RDF</comment>
- <comment xml:lang="ru">Файл RDF</comment>
- <comment xml:lang="sk">Súbor RDF</comment>
- <comment xml:lang="sl">Datoteka RDF</comment>
- <comment xml:lang="sq">File RDF</comment>
- <comment xml:lang="sr">РДФ датотека</comment>
- <comment xml:lang="sv">RDF-fil</comment>
- <comment xml:lang="tr">RDF dosyası</comment>
- <comment xml:lang="uk">файл RDF</comment>
+ <comment xml:lang="zh_TW">RDF 檔</comment>
+ <comment xml:lang="zh_CN">RDF 文件</comment>
<comment xml:lang="vi">Tập tin RDF</comment>
- <comment xml:lang="zh-CN">RDF 文件</comment>
- <comment xml:lang="zh-TW">RDF 檔</comment>
+ <comment xml:lang="uk">файл RDF</comment>
+ <comment xml:lang="tr">RDF dosyası</comment>
+ <comment xml:lang="sv">RDF-fil</comment>
+ <comment xml:lang="sr">РДФ датотека</comment>
+ <comment xml:lang="sq">kartelë RDF</comment>
+ <comment xml:lang="sl">Datoteka RDF</comment>
+ <comment xml:lang="si">RDF ගොනුව</comment>
+ <comment xml:lang="sk">Súbor RDF</comment>
+ <comment xml:lang="ru">Файл RDF</comment>
+ <comment xml:lang="ro">Fișier RDF</comment>
+ <comment xml:lang="pt_BR">Arquivo RDF</comment>
+ <comment xml:lang="pt">ficheiro RDF</comment>
+ <comment xml:lang="pl">Plik RDF</comment>
+ <comment xml:lang="oc">fichièr RDF</comment>
+ <comment xml:lang="nn">RDF-fil</comment>
+ <comment xml:lang="nl">RDF-bestand</comment>
+ <comment xml:lang="nb">RDF-fil</comment>
+ <comment xml:lang="lv">RDF datne</comment>
+ <comment xml:lang="lt">RDF failas</comment>
+ <comment xml:lang="ko">RDF 파일</comment>
+ <comment xml:lang="kk">RDF файлы</comment>
+ <comment xml:lang="ja">RDF ファイル</comment>
+ <comment xml:lang="it">File RDF</comment>
+ <comment xml:lang="is">RDF skrá</comment>
+ <comment xml:lang="id">Arsip RDF</comment>
+ <comment xml:lang="ia">File RDF</comment>
+ <comment xml:lang="hu">RDF fájl</comment>
+ <comment xml:lang="hr">RDF datoteka</comment>
+ <comment xml:lang="he">קובץ RDF</comment>
+ <comment xml:lang="gl">ficheiro RDF</comment>
+ <comment xml:lang="ga">comhad RDF</comment>
+ <comment xml:lang="fur">file RDF</comment>
+ <comment xml:lang="fr">fichier RDF</comment>
+ <comment xml:lang="fo">RDF fíla</comment>
+ <comment xml:lang="fi">RDF-tiedosto</comment>
+ <comment xml:lang="eu">RDF fitxategia</comment>
+ <comment xml:lang="es">archivo RDF</comment>
+ <comment xml:lang="eo">RDF-dosiero</comment>
+ <comment xml:lang="en_GB">RDF file</comment>
+ <comment xml:lang="el">Αρχείο RDF</comment>
+ <comment xml:lang="de">RDF-Datei</comment>
+ <comment xml:lang="da">RDF-fil</comment>
+ <comment xml:lang="cs">soubor RDF</comment>
+ <comment xml:lang="ca">fitxer RDF</comment>
+ <comment xml:lang="bg">Файл — RDF</comment>
+ <comment xml:lang="be@latin">Fajł RDF</comment>
+ <comment xml:lang="be">файл RDF</comment>
+ <comment xml:lang="ar">ملف RDF</comment>
+ <comment xml:lang="af">RDF-lêer</comment>
<acronym>RDF</acronym>
<expanded-acronym>Resource Description Framework</expanded-acronym>
<alias type="text/rdf"/>
@@ -33238,75 +34145,63 @@ command to generate the output files.
<root-XML namespaceURI="http://www.w3.org/1999/02/22-rdf-syntax-ns#" localName="RDF"/>
</mime-type>
<mime-type type="text/x-rst">
- <comment>reStructuredText document</comment>
- <comment xml:lang="af">reStructuredText-dokument</comment>
- <comment xml:lang="bg">Документ — reStructuredText</comment>
- <comment xml:lang="ca">document reStructuredText</comment>
- <comment xml:lang="cs">dokument reStructuredText</comment>
- <comment xml:lang="da">reStructuredText-dokument</comment>
- <comment xml:lang="de">reStructuredText-Dokument</comment>
- <comment xml:lang="en-GB">reStructuredText document</comment>
- <comment xml:lang="es">documento en reStructuredText</comment>
- <comment xml:lang="eu">reStructuredText document</comment>
- <comment xml:lang="fi">reStructuredText-asiakirja</comment>
- <comment xml:lang="fr">document reStructuredText</comment>
- <comment xml:lang="fur">document reStructuredText</comment>
- <comment xml:lang="ga">cáipéis reStructuredText</comment>
- <comment xml:lang="hr">reStructuredText dokument</comment>
- <comment xml:lang="hu">reStructuredText dokumentum</comment>
- <comment xml:lang="id">dokumen reStructuredText</comment>
- <comment xml:lang="it">Documento reStructuredText</comment>
- <comment xml:lang="kk">reStructuredText құжаты</comment>
- <comment xml:lang="ko">reStructuredText 문서</comment>
+ <comment>ReStructuredText document</comment>
+ <comment xml:lang="uk">документ ReStructuredText</comment>
+ <comment xml:lang="sv">ReStructuredText-dokument</comment>
+ <comment xml:lang="ru">Документ ReStructuredText</comment>
<comment xml:lang="pl">Dokument reStructuredText</comment>
- <comment xml:lang="pt-BR">Documento reStructuredText</comment>
- <comment xml:lang="ru">Документ reStructuredText</comment>
- <comment xml:lang="sk">Dokument reStructuredText</comment>
- <comment xml:lang="sl">Dokument reStructuredText</comment>
- <comment xml:lang="sv">reStructuredText-dokument</comment>
- <comment xml:lang="tr">reStructuredText belgesi</comment>
- <comment xml:lang="uk">документ reStructuredText</comment>
- <comment xml:lang="zh-CN">reStructuredText 文档</comment>
- <comment xml:lang="zh-TW">reStructuredText 文件</comment>
+ <comment xml:lang="it">Documento reStructuredText</comment>
+ <comment xml:lang="eu">ReStructuredText dokumentua</comment>
+ <comment xml:lang="es">documento ReStructuredText</comment>
+ <comment xml:lang="de">reStructuredText-Dokument</comment>
+ <comment xml:lang="be">дакумент reStructuredText</comment>
<sub-class-of type="text/plain"/>
<glob pattern="*.rst"/>
</mime-type>
<mime-type type="application/owl+xml">
<comment>OWL XML file</comment>
- <comment xml:lang="af">OWL XML-lêer</comment>
- <comment xml:lang="bg">Файл — OWL XML</comment>
- <comment xml:lang="ca">fitxer XML OWL</comment>
- <comment xml:lang="cs">soubor OWL XML</comment>
- <comment xml:lang="da">OWL XML-fil</comment>
- <comment xml:lang="de">OWL-XML-Datei</comment>
- <comment xml:lang="el">Αρχείο OWL XML</comment>
- <comment xml:lang="en-GB">OWL XML file</comment>
- <comment xml:lang="es">archivo en XML OWL</comment>
- <comment xml:lang="eu">OWL XML fitxategia</comment>
- <comment xml:lang="fi">OWL XML -tiedosto</comment>
- <comment xml:lang="fr">fichier XML OWL</comment>
- <comment xml:lang="fur">file OWL XML</comment>
- <comment xml:lang="ga">comhad XML OWL</comment>
- <comment xml:lang="hr">OWL XML datoteka</comment>
- <comment xml:lang="hu">OWL XML-fájl</comment>
- <comment xml:lang="ia">File XML OWL</comment>
- <comment xml:lang="id">Berkas XML OWL</comment>
- <comment xml:lang="it">File XML OWL</comment>
- <comment xml:lang="kk">OWL XML файлы</comment>
- <comment xml:lang="ko">OWL XML 파일</comment>
- <comment xml:lang="oc">fichièr OWL XML</comment>
- <comment xml:lang="pl">Plik XML OWL</comment>
- <comment xml:lang="pt">ficheiro OWL XML</comment>
- <comment xml:lang="pt-BR">Arquivo OWL XML</comment>
- <comment xml:lang="ru">Файл XML OWL</comment>
- <comment xml:lang="sk">Súbor XML OWL</comment>
- <comment xml:lang="sl">Datoteka OWL XML</comment>
- <comment xml:lang="sr">ОВЛ ИксМЛ датотека</comment>
- <comment xml:lang="sv">OWL XML-fil</comment>
- <comment xml:lang="tr">OWL XML dosyası</comment>
+ <comment xml:lang="zh_TW">OWL XML 檔案</comment>
+ <comment xml:lang="zh_CN">OWL XML 文件</comment>
<comment xml:lang="uk">файл XML OWL</comment>
- <comment xml:lang="zh-CN">OWL XML 文件</comment>
- <comment xml:lang="zh-TW">OWL XML 檔案</comment>
+ <comment xml:lang="tr">OWL XML dosyası</comment>
+ <comment xml:lang="sv">OWL XML-fil</comment>
+ <comment xml:lang="sr">ОВЛ ИксМЛ датотека</comment>
+ <comment xml:lang="sq">kartelë OWL XML</comment>
+ <comment xml:lang="sl">Datoteka OWL XML</comment>
+ <comment xml:lang="si">OWL XML ගොනුව</comment>
+ <comment xml:lang="sk">Súbor XML OWL</comment>
+ <comment xml:lang="ru">Файл XML OWL</comment>
+ <comment xml:lang="pt_BR">Arquivo OWL XML</comment>
+ <comment xml:lang="pt">ficheiro OWL XML</comment>
+ <comment xml:lang="pl">Plik XML OWL</comment>
+ <comment xml:lang="oc">fichièr OWL XML</comment>
+ <comment xml:lang="nl">OWL XML-bestand</comment>
+ <comment xml:lang="ko">OWL XML 파일</comment>
+ <comment xml:lang="kk">OWL XML файлы</comment>
+ <comment xml:lang="ja">OWL XML ファイル</comment>
+ <comment xml:lang="it">File XML OWL</comment>
+ <comment xml:lang="is">OWL XML skrá</comment>
+ <comment xml:lang="id">Berkas XML OWL</comment>
+ <comment xml:lang="ia">File XML OWL</comment>
+ <comment xml:lang="hu">OWL XML-fájl</comment>
+ <comment xml:lang="hr">OWL XML datoteka</comment>
+ <comment xml:lang="he">קובץ XML מסוג OWL</comment>
+ <comment xml:lang="ga">comhad XML OWL</comment>
+ <comment xml:lang="fur">file OWL XML</comment>
+ <comment xml:lang="fr">fichier XML OWL</comment>
+ <comment xml:lang="fi">OWL XML -tiedosto</comment>
+ <comment xml:lang="eu">OWL XML fitxategia</comment>
+ <comment xml:lang="es">archivo en XML OWL</comment>
+ <comment xml:lang="en_GB">OWL XML file</comment>
+ <comment xml:lang="el">Αρχείο OWL XML</comment>
+ <comment xml:lang="de">OWL-XML-Datei</comment>
+ <comment xml:lang="da">OWL XML-fil</comment>
+ <comment xml:lang="cs">soubor OWL XML</comment>
+ <comment xml:lang="ca">fitxer XML OWL</comment>
+ <comment xml:lang="bg">Файл — OWL XML</comment>
+ <comment xml:lang="be">файл OWL XML</comment>
+ <comment xml:lang="ar">ملف OWL XML</comment>
+ <comment xml:lang="af">OWL XML-lêer</comment>
<acronym>OWL</acronym>
<expanded-acronym>Web Ontology Language</expanded-acronym>
<sub-class-of type="application/xml"/>
@@ -33317,167 +34212,85 @@ command to generate the output files.
<root-XML namespaceURI="http://www.w3.org/2002/07/owl#" localName="Ontology"/>
</mime-type>
<mime-type type="text/rfc822-headers">
- <comment>email headers</comment>
- <comment xml:lang="ar">ترويسة البريد الإلكتروني</comment>
- <comment xml:lang="az">epoçt başlıqları</comment>
- <comment xml:lang="be-Latn">paštovyja zahałoŭki</comment>
- <comment xml:lang="bg">Заглавни части на електронни писма</comment>
- <comment xml:lang="ca">capçaleres de correu electrònic</comment>
- <comment xml:lang="cs">záhlaví e-mailu</comment>
- <comment xml:lang="cy">penawdau e-bost</comment>
- <comment xml:lang="da">posthoveder</comment>
- <comment xml:lang="de">E-Mail-Kopfzeilen</comment>
- <comment xml:lang="el">Κεφαλίδες ηλ. μηνυμάτων</comment>
- <comment xml:lang="en-GB">email headers</comment>
- <comment xml:lang="eo">retpoŝtaj ĉapoj</comment>
- <comment xml:lang="es">cabeceras de correo electrónico</comment>
- <comment xml:lang="eu">helbide elektronikoen goiburuak</comment>
- <comment xml:lang="fi">sähköpostiotsakkeet</comment>
- <comment xml:lang="fo">t-post tekshøvd</comment>
- <comment xml:lang="fr">en-têtes de courriel</comment>
- <comment xml:lang="fur">intestazions e-mail</comment>
- <comment xml:lang="ga">ceanntásca ríomhphoist</comment>
- <comment xml:lang="gl">cabeceiras de correo electrónico</comment>
- <comment xml:lang="he">כותרת דוא״ל</comment>
- <comment xml:lang="hr">Zaglavlja e-pošte</comment>
- <comment xml:lang="hu">levélfejléc</comment>
- <comment xml:lang="ia">Capites de e-mail</comment>
- <comment xml:lang="id">header email</comment>
- <comment xml:lang="it">Intestazioni email</comment>
- <comment xml:lang="ja">メールヘッダー</comment>
- <comment xml:lang="kk">пошталық тақырыптамалары</comment>
- <comment xml:lang="ko">전자메일 헤더</comment>
- <comment xml:lang="lt">el. laiško antraštės</comment>
- <comment xml:lang="lv">e-pasta galvene</comment>
- <comment xml:lang="ms">Pengepala emel</comment>
- <comment xml:lang="nb">e-posthode</comment>
- <comment xml:lang="nl">e-mail-kopregels</comment>
- <comment xml:lang="nn">e-post-hovud</comment>
- <comment xml:lang="oc">entèstas de corrièr electronic</comment>
- <comment xml:lang="pl">Nagłówki wiadomości e-mail</comment>
- <comment xml:lang="pt">cabeçalhos de email</comment>
- <comment xml:lang="pt-BR">Cabeçalhos de e-mail</comment>
- <comment xml:lang="ro">antete email</comment>
+ <comment>Email headers</comment>
+ <comment xml:lang="uk">заголовки повідомлення ел. пошти</comment>
+ <comment xml:lang="sv">E-posthuvuden</comment>
<comment xml:lang="ru">Почтовые заголовки</comment>
- <comment xml:lang="sk">Hlavičky e-mailu</comment>
- <comment xml:lang="sl">glava elektronske pošte</comment>
- <comment xml:lang="sq">Header email</comment>
- <comment xml:lang="sr">заглавља ел. поште</comment>
- <comment xml:lang="sv">e-posthuvuden</comment>
- <comment xml:lang="tr">eposta başlığı</comment>
- <comment xml:lang="uk">заголовки email</comment>
- <comment xml:lang="vi">dòng đầu thư điện tử</comment>
- <comment xml:lang="zh-CN">电子邮件头</comment>
- <comment xml:lang="zh-TW">電子郵件標頭</comment>
+ <comment xml:lang="pl">Nagłówki wiadomości e-mail</comment>
+ <comment xml:lang="it">Intestazioni email</comment>
+ <comment xml:lang="eu">Posta-goiburuak</comment>
+ <comment xml:lang="es">cabeceras de correo electrónico</comment>
+ <comment xml:lang="de">E-Mail-Kopfzeilen</comment>
+ <comment xml:lang="be">паштовыя загалоўкі</comment>
<sub-class-of type="text/plain"/>
</mime-type>
<mime-type type="text/richtext">
- <comment>rich text document</comment>
- <comment xml:lang="af">rykteksdokument</comment>
- <comment xml:lang="ar">مستند نصي غني</comment>
- <comment xml:lang="ast">documentu de testu ricu</comment>
- <comment xml:lang="az">zəngin mətn sənədi</comment>
- <comment xml:lang="be-Latn">azdobleny tekstavy dakument</comment>
- <comment xml:lang="bg">Документ — rich text</comment>
- <comment xml:lang="ca">document de text enriquit</comment>
- <comment xml:lang="cs">textový dokument RTF</comment>
- <comment xml:lang="cy">dogfen testun gyfoethog (rtf)</comment>
- <comment xml:lang="da">richtekstdokument</comment>
- <comment xml:lang="de">RTF-Textdokument</comment>
- <comment xml:lang="el">Έγγραφο εμπλουτισμένου κειμένου (RTF)</comment>
- <comment xml:lang="en-GB">rich text document</comment>
- <comment xml:lang="eo">riĉteksta dokumento</comment>
- <comment xml:lang="es">documento de texto enriquecido</comment>
- <comment xml:lang="eu">aberastutako testu formatua</comment>
- <comment xml:lang="fi">RTF-asiakirja</comment>
- <comment xml:lang="fr">document « rich text »</comment>
- <comment xml:lang="fur">document rich text</comment>
- <comment xml:lang="ga">cáipéis mhéith-théacs</comment>
- <comment xml:lang="gl">documento do texto enriquecido</comment>
- <comment xml:lang="he">מסמך טקסט עשיר</comment>
- <comment xml:lang="hr">Obogaćeni tekstovni dokument</comment>
- <comment xml:lang="hu">rich text-dokumentum</comment>
- <comment xml:lang="ia">Documento de texto inricchite</comment>
- <comment xml:lang="id">dokumen teks kaya</comment>
- <comment xml:lang="it">Documento rich text</comment>
- <comment xml:lang="ja">リッチテキストドキュメント</comment>
- <comment xml:lang="kk">пішімделген мәтіні бар құжаты</comment>
- <comment xml:lang="ko">서식 있는 텍스트 문서</comment>
- <comment xml:lang="lt">praturtinto teksto dokumentas</comment>
- <comment xml:lang="lv">bagātā teksta dokuments</comment>
- <comment xml:lang="ms">Dokumen teks diperkaya</comment>
- <comment xml:lang="nb">rik tekst-dokument</comment>
- <comment xml:lang="nl">opgemaakt tekstdocument</comment>
- <comment xml:lang="nn">rik tekst-dokument</comment>
- <comment xml:lang="oc">document « rich text »</comment>
- <comment xml:lang="pl">Dokument Rich Text</comment>
- <comment xml:lang="pt">documento em texto rico</comment>
- <comment xml:lang="pt-BR">Documento rich text</comment>
- <comment xml:lang="ro">document text îmbogățit</comment>
- <comment xml:lang="ru">Документ с форматированным текстом</comment>
- <comment xml:lang="sk">Textový dokument RTF</comment>
- <comment xml:lang="sl">dokument z oblikovanim besedilom</comment>
- <comment xml:lang="sq">Dokument rich text</comment>
- <comment xml:lang="sr">богат текстуални документ</comment>
- <comment xml:lang="sv">RTF-textdokument</comment>
- <comment xml:lang="tr">zengin metin belgesi</comment>
+ <comment>Rich text document</comment>
<comment xml:lang="uk">форматований текстовий документ</comment>
- <comment xml:lang="vi">tài liệu văn bản có kiểu dáng (RTF)</comment>
- <comment xml:lang="zh-CN">富文本文档 (RTF)</comment>
- <comment xml:lang="zh-TW">豐富文字文件 (RTF)</comment>
+ <comment xml:lang="sv">Rich text-dokument</comment>
+ <comment xml:lang="ru">Форматированный текстовый документ</comment>
+ <comment xml:lang="pl">Dokument Rich Text</comment>
+ <comment xml:lang="it">Documento testo arricchito</comment>
+ <comment xml:lang="eu">Testu aberatseko dokumentua</comment>
+ <comment xml:lang="es">documento de texto enriquecido</comment>
+ <comment xml:lang="de">RTF-Textdokument</comment>
+ <comment xml:lang="be">дакумент у фармаце RTF</comment>
<sub-class-of type="text/plain"/>
<glob pattern="*.rtx"/>
</mime-type>
<mime-type type="application/rss+xml">
<comment>RSS summary</comment>
- <comment xml:lang="af">RSS-opsomming</comment>
- <comment xml:lang="ar">ملخص RSS</comment>
- <comment xml:lang="be-Latn">Karotki ahlad RSS</comment>
- <comment xml:lang="bg">Обобщение за сайтове — RSS</comment>
- <comment xml:lang="ca">resum RSS</comment>
- <comment xml:lang="cs">souhrn RSS</comment>
- <comment xml:lang="da">RSS-sammendrag</comment>
- <comment xml:lang="de">RSS-Zusammenfassung</comment>
- <comment xml:lang="el">Σύνοψη RSS</comment>
- <comment xml:lang="en-GB">RSS summary</comment>
- <comment xml:lang="es">suministro RSS</comment>
- <comment xml:lang="eu">RSS laburpena</comment>
- <comment xml:lang="fi">RSS-tiivistelmä</comment>
- <comment xml:lang="fo">RSS samandráttur</comment>
- <comment xml:lang="fr">résumé RSS</comment>
- <comment xml:lang="fur">somari RSS</comment>
- <comment xml:lang="ga">achoimre RSS</comment>
- <comment xml:lang="gl">Resumo RSS</comment>
- <comment xml:lang="he">תקציר RSS</comment>
- <comment xml:lang="hr">RSS sažetak</comment>
- <comment xml:lang="hu">RSS összefoglaló</comment>
- <comment xml:lang="ia">Summario RSS</comment>
- <comment xml:lang="id">Ringkasan RSS</comment>
- <comment xml:lang="it">Sommario RSS</comment>
- <comment xml:lang="ja">RSS サマリ</comment>
- <comment xml:lang="kk">RSS жинақталғаны</comment>
- <comment xml:lang="ko">RSS 요약</comment>
- <comment xml:lang="lt">RSS santrauka</comment>
- <comment xml:lang="lv">RSS kopsavilkums</comment>
- <comment xml:lang="nb">RSS-sammendrag</comment>
- <comment xml:lang="nl">RSS-samenvatting</comment>
- <comment xml:lang="nn">RSS-samandrag</comment>
- <comment xml:lang="oc">resumit RSS</comment>
- <comment xml:lang="pl">Podsumowanie RSS</comment>
- <comment xml:lang="pt">resumo RSS</comment>
- <comment xml:lang="pt-BR">Resumo RSS</comment>
- <comment xml:lang="ro">Rezumat RSS</comment>
- <comment xml:lang="ru">Сводка RSS</comment>
- <comment xml:lang="sk">Súhrn RSS</comment>
- <comment xml:lang="sl">Datoteka povzetek RSS</comment>
- <comment xml:lang="sq">Përmbledhje RSS</comment>
- <comment xml:lang="sr">РСС сажетак</comment>
- <comment xml:lang="sv">RSS-sammanfattning</comment>
- <comment xml:lang="tr">RSS özeti</comment>
- <comment xml:lang="uk">зведення сайту RSS</comment>
+ <comment xml:lang="zh_TW">RSS 摘要</comment>
+ <comment xml:lang="zh_CN">RSS 摘要</comment>
<comment xml:lang="vi">Bản tóm tắt RSS</comment>
- <comment xml:lang="zh-CN">RSS 摘要</comment>
- <comment xml:lang="zh-TW">RSS 摘要</comment>
+ <comment xml:lang="uk">зведення сайту RSS</comment>
+ <comment xml:lang="tr">RSS özeti</comment>
+ <comment xml:lang="sv">RSS-sammanfattning</comment>
+ <comment xml:lang="sr">РСС сажетак</comment>
+ <comment xml:lang="sq">përmbledhje RSS</comment>
+ <comment xml:lang="sl">Datoteka povzetek RSS</comment>
+ <comment xml:lang="si">RSS සාරාංශය</comment>
+ <comment xml:lang="sk">Súhrn RSS</comment>
+ <comment xml:lang="ru">Сводка RSS</comment>
+ <comment xml:lang="ro">Rezumat RSS</comment>
+ <comment xml:lang="pt_BR">Resumo RSS</comment>
+ <comment xml:lang="pt">resumo RSS</comment>
+ <comment xml:lang="pl">Podsumowanie RSS</comment>
+ <comment xml:lang="oc">resumit RSS</comment>
+ <comment xml:lang="nn">RSS-samandrag</comment>
+ <comment xml:lang="nl">RSS-samenvatting</comment>
+ <comment xml:lang="nb">RSS-sammendrag</comment>
+ <comment xml:lang="lv">RSS kopsavilkums</comment>
+ <comment xml:lang="lt">RSS santrauka</comment>
+ <comment xml:lang="ko">RSS 요약</comment>
+ <comment xml:lang="kk">RSS жинақталғаны</comment>
+ <comment xml:lang="ja">RSS サマリ</comment>
+ <comment xml:lang="it">Sommario RSS</comment>
+ <comment xml:lang="is">RSS samantekt</comment>
+ <comment xml:lang="id">Ringkasan RSS</comment>
+ <comment xml:lang="ia">Summario RSS</comment>
+ <comment xml:lang="hu">RSS összefoglaló</comment>
+ <comment xml:lang="hr">RSS sažetak</comment>
+ <comment xml:lang="he">תקציר RSS</comment>
+ <comment xml:lang="gl">Resumo RSS</comment>
+ <comment xml:lang="ga">achoimre RSS</comment>
+ <comment xml:lang="fur">somari RSS</comment>
+ <comment xml:lang="fr">résumé RSS</comment>
+ <comment xml:lang="fo">RSS samandráttur</comment>
+ <comment xml:lang="fi">RSS-tiivistelmä</comment>
+ <comment xml:lang="eu">RSS laburpena</comment>
+ <comment xml:lang="es">suministro RSS</comment>
+ <comment xml:lang="en_GB">RSS summary</comment>
+ <comment xml:lang="el">Σύνοψη RSS</comment>
+ <comment xml:lang="de">RSS-Zusammenfassung</comment>
+ <comment xml:lang="da">RSS-sammendrag</comment>
+ <comment xml:lang="cs">souhrn RSS</comment>
+ <comment xml:lang="ca">resum RSS</comment>
+ <comment xml:lang="bg">Обобщение за сайтове — RSS</comment>
+ <comment xml:lang="be@latin">Karotki ahlad RSS</comment>
+ <comment xml:lang="be">зводка RSS</comment>
+ <comment xml:lang="ar">ملخص RSS</comment>
+ <comment xml:lang="af">RSS-opsomming</comment>
<acronym>RSS</acronym>
<expanded-acronym>RDF Site Summary</expanded-acronym>
<alias type="text/rss"/>
@@ -33491,52 +34304,55 @@ command to generate the output files.
</mime-type>
<mime-type type="application/atom+xml">
<comment>Atom syndication feed</comment>
- <comment xml:lang="ar">مروج تغذية Atom</comment>
- <comment xml:lang="be-Latn">Syndykacyjny kanał navinaŭ Atom</comment>
- <comment xml:lang="bg">Емисия — Atom</comment>
- <comment xml:lang="ca">canal de sindicació Atom</comment>
- <comment xml:lang="cs">kanál Atom</comment>
- <comment xml:lang="da">Atom-syndikeringsfeed</comment>
- <comment xml:lang="de">Atom-Nachrichtenquelle</comment>
- <comment xml:lang="el">Τροφοδοσία διανομής Atom</comment>
- <comment xml:lang="en-GB">Atom syndication feed</comment>
- <comment xml:lang="es">suministro de sindicación Atom</comment>
- <comment xml:lang="eu">Atom harpidetze-iturria</comment>
- <comment xml:lang="fi">Atom-yhdistevirta</comment>
- <comment xml:lang="fr">fil de syndication Atom</comment>
- <comment xml:lang="fur">canâl di notiziis Atom</comment>
- <comment xml:lang="ga">fotha sindeacáitithe Atom</comment>
- <comment xml:lang="gl">fonte de sindicación Atom</comment>
- <comment xml:lang="he">הזנה דרך הרשת של Atom</comment>
- <comment xml:lang="hr">Atom kanal objavljivanja</comment>
- <comment xml:lang="hu">Atom egyesítőfolyam</comment>
- <comment xml:lang="ia">Fluxo de syndication Atom</comment>
- <comment xml:lang="id">Umpan sindikasi Atom</comment>
- <comment xml:lang="it">Feed di distribuzione Atom</comment>
- <comment xml:lang="ja">Atom 配信フィード</comment>
- <comment xml:lang="kk">Atom жаңалықтар таспасы</comment>
- <comment xml:lang="ko">Atom 묶음 피드</comment>
- <comment xml:lang="lt">Atom sindikacijos kanalas</comment>
- <comment xml:lang="lv">Atom sindikāta barotne</comment>
- <comment xml:lang="nb">Atom syndikeringsstrøm</comment>
- <comment xml:lang="nl">Atom-syndicatie-feed</comment>
- <comment xml:lang="nn">Atom-kjelde</comment>
- <comment xml:lang="oc">fial de sindicacion Atom</comment>
- <comment xml:lang="pl">Kanał Atom</comment>
- <comment xml:lang="pt">feed Atom</comment>
- <comment xml:lang="pt-BR">Fonte de notícias Atom</comment>
- <comment xml:lang="ro">Flux agregare Atom</comment>
- <comment xml:lang="ru">Лента новостей Atom</comment>
- <comment xml:lang="sk">Kanál Atom</comment>
- <comment xml:lang="sl">Sindikalni vir Atom</comment>
- <comment xml:lang="sq">Feed për përhapje Atom</comment>
- <comment xml:lang="sr">Атомов довод синдикализације</comment>
- <comment xml:lang="sv">Atom-syndikeringskanal</comment>
- <comment xml:lang="tr">Atom besleme kaynağı</comment>
- <comment xml:lang="uk">трансляція подач Atom</comment>
+ <comment xml:lang="zh_TW">Atom 聯合供稿饋流</comment>
+ <comment xml:lang="zh_CN">Atom 聚合种子</comment>
<comment xml:lang="vi">Nguồn tin tức Atom</comment>
- <comment xml:lang="zh-CN">Atom 聚合种子</comment>
- <comment xml:lang="zh-TW">Atom 聯合供稿饋流</comment>
+ <comment xml:lang="uk">трансляція подач Atom</comment>
+ <comment xml:lang="tr">Atom besleme kaynağı</comment>
+ <comment xml:lang="sv">Atom-syndikeringskanal</comment>
+ <comment xml:lang="sr">Атомов довод синдикализације</comment>
+ <comment xml:lang="sq">prurje RSS Atom</comment>
+ <comment xml:lang="sl">Sindikalni vir Atom</comment>
+ <comment xml:lang="si">පරමාණු සින්ඩිකේෂන් පෝෂණය</comment>
+ <comment xml:lang="sk">Kanál Atom</comment>
+ <comment xml:lang="ru">Лента новостей Atom</comment>
+ <comment xml:lang="ro">Flux agregare Atom</comment>
+ <comment xml:lang="pt_BR">Fonte de notícias Atom</comment>
+ <comment xml:lang="pt">feed Atom</comment>
+ <comment xml:lang="pl">Kanał Atom</comment>
+ <comment xml:lang="oc">fial de sindicacion Atom</comment>
+ <comment xml:lang="nn">Atom-kjelde</comment>
+ <comment xml:lang="nl">Atom-syndicatie-feed</comment>
+ <comment xml:lang="nb">Atom syndikeringsstrøm</comment>
+ <comment xml:lang="lv">Atom sindikāta barotne</comment>
+ <comment xml:lang="lt">Atom sindikacijos kanalas</comment>
+ <comment xml:lang="ko">Atom 묶음 피드</comment>
+ <comment xml:lang="kk">Atom жаңалықтар таспасы</comment>
+ <comment xml:lang="ja">Atom 配信フィード</comment>
+ <comment xml:lang="it">Feed di distribuzione Atom</comment>
+ <comment xml:lang="is">Atom fréttastreymi</comment>
+ <comment xml:lang="id">Umpan sindikasi Atom</comment>
+ <comment xml:lang="ia">Fluxo de syndication Atom</comment>
+ <comment xml:lang="hu">Atom egyesítőfolyam</comment>
+ <comment xml:lang="hr">Atom kanal objavljivanja</comment>
+ <comment xml:lang="he">הזנה דרך הרשת של Atom</comment>
+ <comment xml:lang="gl">fonte de sindicación Atom</comment>
+ <comment xml:lang="ga">fotha sindeacáitithe Atom</comment>
+ <comment xml:lang="fur">canâl di notiziis Atom</comment>
+ <comment xml:lang="fr">fil de syndication Atom</comment>
+ <comment xml:lang="fi">Atom-yhdistevirta</comment>
+ <comment xml:lang="eu">Atom harpidetze-iturria</comment>
+ <comment xml:lang="es">suministro de sindicación Atom</comment>
+ <comment xml:lang="en_GB">Atom syndication feed</comment>
+ <comment xml:lang="el">Τροφοδοσία διανομής Atom</comment>
+ <comment xml:lang="de">Atom-Nachrichtenquelle</comment>
+ <comment xml:lang="da">Atom-syndikeringsfeed</comment>
+ <comment xml:lang="cs">kanál Atom</comment>
+ <comment xml:lang="ca">canal de sindicació Atom</comment>
+ <comment xml:lang="bg">Емисия — Atom</comment>
+ <comment xml:lang="be@latin">Syndykacyjny kanał navinaŭ Atom</comment>
+ <comment xml:lang="be">канал сіндыкацыі Atom</comment>
+ <comment xml:lang="ar">مروج تغذية Atom</comment>
<sub-class-of type="application/xml"/>
<generic-icon name="text-html"/>
<glob pattern="*.atom"/>
@@ -33547,52 +34363,57 @@ command to generate the output files.
</mime-type>
<mime-type type="text/x-opml+xml">
<comment>OPML syndication feed</comment>
- <comment xml:lang="ar">مروج تغذية OPML</comment>
- <comment xml:lang="be-Latn">Syndykacyjny kanał OPML</comment>
- <comment xml:lang="bg">Емисия — OPML</comment>
- <comment xml:lang="ca">canal de sindicació OPML</comment>
- <comment xml:lang="cs">kanál OPML</comment>
- <comment xml:lang="da">OPML-syndikeringsfeed</comment>
- <comment xml:lang="de">OPML-Nachrichtenquelle</comment>
- <comment xml:lang="el">Τροφοδοσία OPML</comment>
- <comment xml:lang="en-GB">OPML syndication feed</comment>
- <comment xml:lang="es">suministro de sindicación OPML</comment>
- <comment xml:lang="eu">OPML harpidetze-iturria</comment>
- <comment xml:lang="fi">OPML-yhdistevirta</comment>
- <comment xml:lang="fr">fil de syndication OPML</comment>
- <comment xml:lang="fur">canâl di notiziis OPML</comment>
- <comment xml:lang="ga">fotha sindeacáitithe OPML</comment>
- <comment xml:lang="gl">fonte de sindicación OPML</comment>
- <comment xml:lang="he">הזנה דרך הרשת OPML</comment>
- <comment xml:lang="hr">OPML kanal objavljivanja</comment>
- <comment xml:lang="hu">OPML egyesítőfolyam</comment>
- <comment xml:lang="ia">Fluxo de syndication OPML</comment>
- <comment xml:lang="id">Umpan sindikasi OPML</comment>
- <comment xml:lang="it">Feed di distribuzione OPML</comment>
- <comment xml:lang="ja">OPML 配信フィード</comment>
- <comment xml:lang="kk">OPML жаңалықтар таспасы</comment>
- <comment xml:lang="ko">OPML 묶음 피드</comment>
- <comment xml:lang="lt">OPML sindikacijos kanalas</comment>
- <comment xml:lang="lv">OPML sindikāta barotne</comment>
- <comment xml:lang="nb">OPML syndikeringsstrøm</comment>
- <comment xml:lang="nl">OPML-syndicatie-feed</comment>
- <comment xml:lang="nn">OPML-kjelde</comment>
- <comment xml:lang="oc">fial de sindicacion OPML</comment>
- <comment xml:lang="pl">Kanał OPML</comment>
- <comment xml:lang="pt">feed OPML</comment>
- <comment xml:lang="pt-BR">Fonte de notícias OPML</comment>
- <comment xml:lang="ro">Flux OPML syndication</comment>
- <comment xml:lang="ru">Лента новостей OPML</comment>
- <comment xml:lang="sk">Kanál OPML</comment>
- <comment xml:lang="sl">Sindikalni vir OPML</comment>
- <comment xml:lang="sq">Feed për përhapje OPML</comment>
- <comment xml:lang="sr">ОМПЛ довод синдикализације</comment>
- <comment xml:lang="sv">OPML-syndikeringskanal</comment>
- <comment xml:lang="tr">OPML besleme kaynağı</comment>
- <comment xml:lang="uk">трансляція подач OPML</comment>
+ <comment xml:lang="zh_TW">OPML 聯合供稿饋流</comment>
+ <comment xml:lang="zh_CN">OPML 聚合种子</comment>
<comment xml:lang="vi">Nguồn tin tức OPML</comment>
- <comment xml:lang="zh-CN">OPML 聚合种子</comment>
- <comment xml:lang="zh-TW">OPML 聯合供稿饋流</comment>
+ <comment xml:lang="uk">трансляція подач OPML</comment>
+ <comment xml:lang="tr">OPML besleme kaynağı</comment>
+ <comment xml:lang="sv">OPML-syndikeringskanal</comment>
+ <comment xml:lang="sr">ОМПЛ довод синдикализације</comment>
+ <comment xml:lang="sq">Prurje RSS OPML</comment>
+ <comment xml:lang="sl">Sindikalni vir OPML</comment>
+ <comment xml:lang="si">OPML සින්ඩිකේෂන් සංග්‍රහය</comment>
+ <comment xml:lang="sk">Kanál OPML</comment>
+ <comment xml:lang="ru">Лента новостей OPML</comment>
+ <comment xml:lang="ro">Flux OPML syndication</comment>
+ <comment xml:lang="pt_BR">Fonte de notícias OPML</comment>
+ <comment xml:lang="pt">feed OPML</comment>
+ <comment xml:lang="pl">Kanał OPML</comment>
+ <comment xml:lang="oc">fial de sindicacion OPML</comment>
+ <comment xml:lang="nn">OPML-kjelde</comment>
+ <comment xml:lang="nl">OPML-syndicatie-feed</comment>
+ <comment xml:lang="nb">OPML syndikeringsstrøm</comment>
+ <comment xml:lang="lv">OPML sindikāta barotne</comment>
+ <comment xml:lang="lt">OPML sindikacijos kanalas</comment>
+ <comment xml:lang="ko">OPML 묶음 피드</comment>
+ <comment xml:lang="kk">OPML жаңалықтар таспасы</comment>
+ <comment xml:lang="ja">OPML 配信フィード</comment>
+ <comment xml:lang="it">Feed di distribuzione OPML</comment>
+ <comment xml:lang="is">OPML fréttastreymi</comment>
+ <comment xml:lang="id">Umpan sindikasi OPML</comment>
+ <comment xml:lang="ia">Fluxo de syndication OPML</comment>
+ <comment xml:lang="hu">OPML egyesítőfolyam</comment>
+ <comment xml:lang="hr">OPML kanal objavljivanja</comment>
+ <comment xml:lang="he">הזנה דרך הרשת OPML</comment>
+ <comment xml:lang="gl">fonte de sindicación OPML</comment>
+ <comment xml:lang="ga">fotha sindeacáitithe OPML</comment>
+ <comment xml:lang="fur">canâl di notiziis OPML</comment>
+ <comment xml:lang="fr">fil de syndication OPML</comment>
+ <comment xml:lang="fi">OPML-yhdistevirta</comment>
+ <comment xml:lang="eu">OPML harpidetze-iturria</comment>
+ <comment xml:lang="es">suministro de sindicación OPML</comment>
+ <comment xml:lang="en_GB">OPML syndication feed</comment>
+ <comment xml:lang="el">Τροφοδοσία OPML</comment>
+ <comment xml:lang="de">OPML-Nachrichtenquelle</comment>
+ <comment xml:lang="da">OPML-syndikeringsfeed</comment>
+ <comment xml:lang="cs">kanál OPML</comment>
+ <comment xml:lang="ca">canal de sindicació OPML</comment>
+ <comment xml:lang="bg">Емисия — OPML</comment>
+ <comment xml:lang="be@latin">Syndykacyjny kanał OPML</comment>
+ <comment xml:lang="be">канал сіндыкацыі OPML</comment>
+ <comment xml:lang="ar">مروج تغذية OPML</comment>
+ <acronym>OPML</acronym>
+ <expanded-acronym>Outline Processor Markup Language</expanded-acronym>
<sub-class-of type="application/xml"/>
<alias type="text/x-opml"/>
<generic-icon name="text-html"/>
@@ -33603,58 +34424,61 @@ command to generate the output files.
</mime-type>
<mime-type type="text/sgml">
<comment>SGML document</comment>
- <comment xml:lang="af">SGML-dokument</comment>
- <comment xml:lang="ar">مستند SGML</comment>
- <comment xml:lang="ast">Documentu SGML</comment>
- <comment xml:lang="be-Latn">Dakument SGML</comment>
- <comment xml:lang="bg">Документ — SGML</comment>
- <comment xml:lang="ca">document SGML</comment>
- <comment xml:lang="cs">dokument SGML</comment>
- <comment xml:lang="cy">Dogfen SGML</comment>
- <comment xml:lang="da">SGML-dokument</comment>
- <comment xml:lang="de">SGML-Dokument</comment>
- <comment xml:lang="el">Έγγραφο SGML</comment>
- <comment xml:lang="en-GB">SGML document</comment>
- <comment xml:lang="eo">SGML-dokumento</comment>
- <comment xml:lang="es">documento SGML</comment>
- <comment xml:lang="eu">SGML dokumentua</comment>
- <comment xml:lang="fi">SGML-asiakirja</comment>
- <comment xml:lang="fo">SGML skjal</comment>
- <comment xml:lang="fr">document SGML</comment>
- <comment xml:lang="fur">document SGML</comment>
- <comment xml:lang="ga">cáipéis SGML</comment>
- <comment xml:lang="gl">documento SGML</comment>
- <comment xml:lang="he">מסמך SGML</comment>
- <comment xml:lang="hr">SGML dokument</comment>
- <comment xml:lang="hu">SGML-dokumentum</comment>
- <comment xml:lang="ia">Documento SGML</comment>
- <comment xml:lang="id">Dokumen SGML</comment>
- <comment xml:lang="it">Documento SGML</comment>
- <comment xml:lang="ja">SGML ドキュメント</comment>
- <comment xml:lang="kk">SGML құжаты</comment>
- <comment xml:lang="ko">SGML 문서</comment>
- <comment xml:lang="lt">SGML dokumentas</comment>
- <comment xml:lang="lv">SGML dokuments</comment>
- <comment xml:lang="ms">Dokumen SGML</comment>
- <comment xml:lang="nb">SGML-dokument</comment>
- <comment xml:lang="nl">SGML-document</comment>
- <comment xml:lang="nn">SGML-dokument</comment>
- <comment xml:lang="oc">document SGML</comment>
- <comment xml:lang="pl">Dokument SGML</comment>
- <comment xml:lang="pt">documento SGML</comment>
- <comment xml:lang="pt-BR">Documento SGML</comment>
- <comment xml:lang="ro">Document SGML</comment>
- <comment xml:lang="ru">Документ SGML</comment>
- <comment xml:lang="sk">Dokument SGML</comment>
- <comment xml:lang="sl">Dokument SGML</comment>
- <comment xml:lang="sq">Dokument SGML</comment>
- <comment xml:lang="sr">СГМЛ документ</comment>
- <comment xml:lang="sv">SGML-dokument</comment>
- <comment xml:lang="tr">SGML belgesi</comment>
- <comment xml:lang="uk">документ SGML</comment>
+ <comment xml:lang="zh_TW">SGML 文件</comment>
+ <comment xml:lang="zh_CN">SGML 文档</comment>
<comment xml:lang="vi">Tài liệu SGML</comment>
- <comment xml:lang="zh-CN">SGML 文档</comment>
- <comment xml:lang="zh-TW">SGML 文件</comment>
+ <comment xml:lang="uk">документ SGML</comment>
+ <comment xml:lang="tr">SGML belgesi</comment>
+ <comment xml:lang="sv">SGML-dokument</comment>
+ <comment xml:lang="sr">СГМЛ документ</comment>
+ <comment xml:lang="sq">dokument SGML</comment>
+ <comment xml:lang="sl">Dokument SGML</comment>
+ <comment xml:lang="si">SGML ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument SGML</comment>
+ <comment xml:lang="ru">Документ SGML</comment>
+ <comment xml:lang="ro">Document SGML</comment>
+ <comment xml:lang="pt_BR">Documento SGML</comment>
+ <comment xml:lang="pt">documento SGML</comment>
+ <comment xml:lang="pl">Dokument SGML</comment>
+ <comment xml:lang="oc">document SGML</comment>
+ <comment xml:lang="nn">SGML-dokument</comment>
+ <comment xml:lang="nl">SGML-document</comment>
+ <comment xml:lang="nb">SGML-dokument</comment>
+ <comment xml:lang="ms">Dokumen SGML</comment>
+ <comment xml:lang="lv">SGML dokuments</comment>
+ <comment xml:lang="lt">SGML dokumentas</comment>
+ <comment xml:lang="ko">SGML 문서</comment>
+ <comment xml:lang="kk">SGML құжаты</comment>
+ <comment xml:lang="ja">SGML ドキュメント</comment>
+ <comment xml:lang="it">Documento SGML</comment>
+ <comment xml:lang="is">SGML skjal</comment>
+ <comment xml:lang="id">Dokumen SGML</comment>
+ <comment xml:lang="ia">Documento SGML</comment>
+ <comment xml:lang="hu">SGML-dokumentum</comment>
+ <comment xml:lang="hr">SGML dokument</comment>
+ <comment xml:lang="he">מסמך SGML</comment>
+ <comment xml:lang="gl">documento SGML</comment>
+ <comment xml:lang="ga">cáipéis SGML</comment>
+ <comment xml:lang="fur">document SGML</comment>
+ <comment xml:lang="fr">document SGML</comment>
+ <comment xml:lang="fo">SGML skjal</comment>
+ <comment xml:lang="fi">SGML-asiakirja</comment>
+ <comment xml:lang="eu">SGML dokumentua</comment>
+ <comment xml:lang="es">documento SGML</comment>
+ <comment xml:lang="eo">SGML-dokumento</comment>
+ <comment xml:lang="en_GB">SGML document</comment>
+ <comment xml:lang="el">Έγγραφο SGML</comment>
+ <comment xml:lang="de">SGML-Dokument</comment>
+ <comment xml:lang="da">SGML-dokument</comment>
+ <comment xml:lang="cy">Dogfen SGML</comment>
+ <comment xml:lang="cs">dokument SGML</comment>
+ <comment xml:lang="ca">document SGML</comment>
+ <comment xml:lang="bg">Документ — SGML</comment>
+ <comment xml:lang="be@latin">Dakument SGML</comment>
+ <comment xml:lang="be">дакумент SGML</comment>
+ <comment xml:lang="ast">Documentu SGML</comment>
+ <comment xml:lang="ar">مستند SGML</comment>
+ <comment xml:lang="af">SGML-dokument</comment>
<acronym>SGML</acronym>
<expanded-acronym>Standard Generalized Markup Language</expanded-acronym>
<sub-class-of type="text/plain"/>
@@ -33662,57 +34486,17 @@ command to generate the output files.
<glob pattern="*.sgm"/>
</mime-type>
<mime-type type="text/spreadsheet">
- <comment>spreadsheet interchange document</comment>
- <comment xml:lang="ar">مستند تبادل الجدول</comment>
- <comment xml:lang="ast">documentu d'intercambéu de fueyes de cálculu</comment>
- <comment xml:lang="be-Latn">dakument dla abmienu raźlikovymi arkušami</comment>
- <comment xml:lang="bg">Документ — обмяна между електронни таблици</comment>
- <comment xml:lang="ca">document d'intercanvi de full de càlcul</comment>
- <comment xml:lang="cs">sešitový výměnný dokument</comment>
- <comment xml:lang="da">regnearksudvekslingsdokument</comment>
- <comment xml:lang="de">Tabellenkalkulations-Austauschdokument</comment>
- <comment xml:lang="el">Έγγραφο ανταλλαγής λογιστικού φύλλου</comment>
- <comment xml:lang="en-GB">spreadsheet interchange document</comment>
- <comment xml:lang="es">documento de intercambio de hoja de cálculo</comment>
- <comment xml:lang="eu">kalkulu-orriak trukatzeko dokumentua</comment>
- <comment xml:lang="fi">taulukkovälitysasiakirja</comment>
- <comment xml:lang="fo">rokniarks umbýtisskjal</comment>
- <comment xml:lang="fr">document d'échange de feuilles de calcul</comment>
- <comment xml:lang="fur">document di interscambi par sfuei di calcul</comment>
- <comment xml:lang="ga">cáipéis idirmhalartaithe scarbhileog</comment>
- <comment xml:lang="gl">documento de intercambio de follas de cálculo</comment>
- <comment xml:lang="he">מסמך גליון נתונים מתחלף</comment>
- <comment xml:lang="hr">Dokument razmjene proračunske tablice</comment>
- <comment xml:lang="hu">spreadsheet-cserélhetődokumentum</comment>
- <comment xml:lang="ia">Documento de intercambio de folio de calculo</comment>
- <comment xml:lang="id">dokumen lembar sebar saling tukar</comment>
- <comment xml:lang="it">Documento di scambio per foglio di calcolo</comment>
- <comment xml:lang="ja">スプレッドシート交換ドキュメント</comment>
- <comment xml:lang="kk">spreadsheet interchange құжаты</comment>
- <comment xml:lang="ko">스프레드시트 교환 문서</comment>
- <comment xml:lang="lt">skaičialenčių apsikeitimo dokumentas</comment>
- <comment xml:lang="lv">izklājlapu apmaiņas dokuments</comment>
- <comment xml:lang="nb">dokument for regnearkutveksling</comment>
- <comment xml:lang="nl">rekenblad-uitwisselingsdocument</comment>
- <comment xml:lang="nn">Utvekslingsdokument for rekneark</comment>
- <comment xml:lang="oc">document d'escambi de fuèlhs de calcul</comment>
- <comment xml:lang="pl">Dokument wymiany arkuszy kalkulacyjnych</comment>
- <comment xml:lang="pt">documento de troca interna de folhas de cálculo</comment>
- <comment xml:lang="pt-BR">Documento de intercâmbio de planilhas</comment>
- <comment xml:lang="ro">document schimb filă de calcul</comment>
- <comment xml:lang="ru">Документ Spreadsheet Interchange</comment>
- <comment xml:lang="sk">Zošitový prenosový dokument</comment>
- <comment xml:lang="sl">dokument izmenjeve preglednic</comment>
- <comment xml:lang="sq">Dokument shkëmbimi për fletë llogaritje</comment>
- <comment xml:lang="sr">документ размене табеле</comment>
- <comment xml:lang="sv">spreadsheet interchange-dokument</comment>
- <comment xml:lang="tr">hesap çizelgesi değişim belgesi</comment>
+ <comment>Spreadsheet interchange document</comment>
<comment xml:lang="uk">документ обміну ел. таблицями</comment>
- <comment xml:lang="vi">tài liệu hoán đổi bảng tính</comment>
- <comment xml:lang="zh-CN">电子表格交换文档</comment>
- <comment xml:lang="zh-TW">試算表交換文件</comment>
+ <comment xml:lang="sv">Spreadsheet interchange-dokument</comment>
+ <comment xml:lang="ru">Документ Spreadsheet Interchange</comment>
+ <comment xml:lang="pl">Dokument wymiany arkuszy kalkulacyjnych</comment>
+ <comment xml:lang="it">Documento di scambio per foglio di calcolo</comment>
+ <comment xml:lang="es">documento de intercambio de hojas de cálculo</comment>
+ <comment xml:lang="de">Tabellenkalkulations-Austauschdokument</comment>
+ <comment xml:lang="be">дакумент для абмену электроннымі табліцамі</comment>
<sub-class-of type="text/plain"/>
- <magic priority="50">
+ <magic>
<match type="string" value="ID;" offset="0"/>
</magic>
<glob pattern="*.sylk"/>
@@ -33720,55 +34504,58 @@ command to generate the output files.
</mime-type>
<mime-type type="text/tab-separated-values">
<comment>TSV document</comment>
- <comment xml:lang="af">TSV-dokument</comment>
- <comment xml:lang="ar">مستند TSV</comment>
- <comment xml:lang="ast">Documentu TSV</comment>
- <comment xml:lang="be-Latn">Dakument TSV</comment>
- <comment xml:lang="bg">Документ — TSV</comment>
- <comment xml:lang="ca">document TSV</comment>
- <comment xml:lang="cs">dokument TSV</comment>
- <comment xml:lang="da">TSV-dokument</comment>
- <comment xml:lang="de">TSV-Dokument</comment>
- <comment xml:lang="el">Έγγραφο TSV</comment>
- <comment xml:lang="en-GB">TSV document</comment>
- <comment xml:lang="es">documento TSV</comment>
- <comment xml:lang="eu">TSV dokumentua</comment>
- <comment xml:lang="fi">TSV-asiakirja</comment>
- <comment xml:lang="fo">TSV skjal</comment>
- <comment xml:lang="fr">document TSV</comment>
- <comment xml:lang="fur">document TSV</comment>
- <comment xml:lang="ga">cáipéis TSV</comment>
- <comment xml:lang="gl">documento TSV</comment>
- <comment xml:lang="he">מסמך TSV</comment>
- <comment xml:lang="hr">TSV dokument</comment>
- <comment xml:lang="hu">TSV dokumentum</comment>
- <comment xml:lang="ia">Documento TSV</comment>
- <comment xml:lang="id">Dokumen TSV</comment>
- <comment xml:lang="it">Documento TSV</comment>
- <comment xml:lang="ja">TSV ドキュメント</comment>
- <comment xml:lang="kk">TSV құжаты</comment>
- <comment xml:lang="ko">TSV 문서</comment>
- <comment xml:lang="lt">TSV dokumentas</comment>
- <comment xml:lang="lv">TSV dokuments</comment>
- <comment xml:lang="nb">TSV-dokument</comment>
- <comment xml:lang="nl">TSV-document</comment>
- <comment xml:lang="nn">TSV-dokument</comment>
- <comment xml:lang="oc">document TSV</comment>
- <comment xml:lang="pl">Dokument TSV</comment>
- <comment xml:lang="pt">documento TSV</comment>
- <comment xml:lang="pt-BR">Documento TSV</comment>
- <comment xml:lang="ro">Document TSV</comment>
- <comment xml:lang="ru">Документ TSV</comment>
- <comment xml:lang="sk">Dokument TSV</comment>
- <comment xml:lang="sl">Dokument TSV</comment>
- <comment xml:lang="sq">Dokument TSV</comment>
- <comment xml:lang="sr">ТСВ документ</comment>
- <comment xml:lang="sv">TSV-dokument</comment>
- <comment xml:lang="tr">TSV belgesi</comment>
- <comment xml:lang="uk">документ TSV</comment>
+ <comment xml:lang="zh_TW">TSV 文件</comment>
+ <comment xml:lang="zh_CN">TSV 文档</comment>
<comment xml:lang="vi">Tài liệu TSV</comment>
- <comment xml:lang="zh-CN">TSV 文档</comment>
- <comment xml:lang="zh-TW">TSV 文件</comment>
+ <comment xml:lang="uk">документ TSV</comment>
+ <comment xml:lang="tr">TSV belgesi</comment>
+ <comment xml:lang="sv">TSV-dokument</comment>
+ <comment xml:lang="sr">ТСВ документ</comment>
+ <comment xml:lang="sq">dokument TSV</comment>
+ <comment xml:lang="sl">Dokument TSV</comment>
+ <comment xml:lang="si">TSV ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument TSV</comment>
+ <comment xml:lang="ru">Документ TSV</comment>
+ <comment xml:lang="ro">Document TSV</comment>
+ <comment xml:lang="pt_BR">Documento TSV</comment>
+ <comment xml:lang="pt">documento TSV</comment>
+ <comment xml:lang="pl">Dokument TSV</comment>
+ <comment xml:lang="oc">document TSV</comment>
+ <comment xml:lang="nn">TSV-dokument</comment>
+ <comment xml:lang="nl">TSV-document</comment>
+ <comment xml:lang="nb">TSV-dokument</comment>
+ <comment xml:lang="lv">TSV dokuments</comment>
+ <comment xml:lang="lt">TSV dokumentas</comment>
+ <comment xml:lang="ko">TSV 문서</comment>
+ <comment xml:lang="kk">TSV құжаты</comment>
+ <comment xml:lang="ja">TSV ドキュメント</comment>
+ <comment xml:lang="it">Documento TSV</comment>
+ <comment xml:lang="is">TSV skjal</comment>
+ <comment xml:lang="id">Dokumen TSV</comment>
+ <comment xml:lang="ia">Documento TSV</comment>
+ <comment xml:lang="hu">TSV dokumentum</comment>
+ <comment xml:lang="hr">TSV dokument</comment>
+ <comment xml:lang="he">מסמך TSV</comment>
+ <comment xml:lang="gl">documento TSV</comment>
+ <comment xml:lang="ga">cáipéis TSV</comment>
+ <comment xml:lang="fur">document TSV</comment>
+ <comment xml:lang="fr">document TSV</comment>
+ <comment xml:lang="fo">TSV skjal</comment>
+ <comment xml:lang="fi">TSV-asiakirja</comment>
+ <comment xml:lang="eu">TSV dokumentua</comment>
+ <comment xml:lang="es">documento TSV</comment>
+ <comment xml:lang="en_GB">TSV document</comment>
+ <comment xml:lang="el">Έγγραφο TSV</comment>
+ <comment xml:lang="de">TSV-Dokument</comment>
+ <comment xml:lang="da">TSV-dokument</comment>
+ <comment xml:lang="cs">dokument TSV</comment>
+ <comment xml:lang="ca">document TSV</comment>
+ <comment xml:lang="bg">Документ — TSV</comment>
+ <comment xml:lang="be@latin">Dakument TSV</comment>
+ <comment xml:lang="be">дакумент TSV</comment>
+ <comment xml:lang="ast">Documentu TSV</comment>
+ <comment xml:lang="ar">مستند TSV</comment>
+ <comment xml:lang="af">TSV-dokument</comment>
<acronym>TSV</acronym>
<expanded-acronym>Tab Separated Values</expanded-acronym>
<sub-class-of type="text/plain"/>
@@ -33776,52 +34563,57 @@ command to generate the output files.
</mime-type>
<mime-type type="text/vnd.graphviz">
<comment>Graphviz DOT graph</comment>
- <comment xml:lang="af">Graphviz DOT-grafiek</comment>
- <comment xml:lang="ar">مبيان Graphviz DOT</comment>
- <comment xml:lang="bg">Граф — Graphviz DOT</comment>
- <comment xml:lang="ca">gràfic Graphviz DOT</comment>
- <comment xml:lang="cs">graf Graphviz DOT</comment>
- <comment xml:lang="da">Graphviz DOT-graf</comment>
- <comment xml:lang="de">Graphviz-DOT-Graph</comment>
- <comment xml:lang="el">Γράφημα Graphviz DOT</comment>
- <comment xml:lang="en-GB">Graphviz DOT graph</comment>
- <comment xml:lang="es">gráfico de Graphviz DOT</comment>
- <comment xml:lang="eu">Graphviz DOT grafikoa</comment>
- <comment xml:lang="fi">Graphviz DOT -graafi</comment>
- <comment xml:lang="fo">Graphviz DOT ritmynd</comment>
- <comment xml:lang="fr">graphe Graphviz DOT</comment>
- <comment xml:lang="fur">grafic Graphviz DOT</comment>
- <comment xml:lang="ga">graf DOT Graphviz</comment>
- <comment xml:lang="gl">gráfica DOT de Graphviz</comment>
- <comment xml:lang="he">תרשים של Graphviz DOT</comment>
- <comment xml:lang="hr">Graphviz DOT grafikon</comment>
- <comment xml:lang="hu">Graphviz DOT-grafikon</comment>
- <comment xml:lang="ia">Graphico DOT de Graphviz</comment>
- <comment xml:lang="id">Grafik Graphviz DOT</comment>
- <comment xml:lang="it">Grafico Graphviz DOT</comment>
- <comment xml:lang="ja">Graphviz DOT グラフ</comment>
- <comment xml:lang="kk">Graphviz DOT сызбасы</comment>
- <comment xml:lang="ko">Graphviz DOT 그래프</comment>
- <comment xml:lang="lt">Graphviz DOT diagrama</comment>
- <comment xml:lang="lv">Graphviz DOT grafiks</comment>
- <comment xml:lang="nl">Graphviz wetenschappelijke grafiek</comment>
- <comment xml:lang="oc">graf Graphviz DOT</comment>
- <comment xml:lang="pl">Wykres DOT Graphviz</comment>
- <comment xml:lang="pt">gráfico Graphviz DOT</comment>
- <comment xml:lang="pt-BR">Gráfico do Graphviz DOT</comment>
- <comment xml:lang="ro">Grafic Graphviz DOT</comment>
- <comment xml:lang="ru">Диаграмма Graphviz DOT</comment>
- <comment xml:lang="sk">Graf Graphviz DOT</comment>
- <comment xml:lang="sl">Datoteka grafikona Graphviz DOT</comment>
- <comment xml:lang="sr">график Графвиз ДОТ-а</comment>
- <comment xml:lang="sv">Graphviz DOT-graf</comment>
- <comment xml:lang="tr">Graphviz DOT grafiği</comment>
- <comment xml:lang="uk">граф DOT Graphviz</comment>
+ <comment xml:lang="zh_TW">Graphviz DOT 圖表</comment>
+ <comment xml:lang="zh_CN">Graphviz DOT 图形</comment>
<comment xml:lang="vi">Biểu đồ DOT Graphviz</comment>
- <comment xml:lang="zh-CN">Graphviz DOT 图形</comment>
- <comment xml:lang="zh-TW">Graphviz DOT 圖表</comment>
+ <comment xml:lang="uk">граф DOT Graphviz</comment>
+ <comment xml:lang="tr">Graphviz DOT grafiği</comment>
+ <comment xml:lang="sv">Graphviz DOT-graf</comment>
+ <comment xml:lang="sr">график Графвиз ДОТ-а</comment>
+ <comment xml:lang="sq">grafik Graphviz DOT</comment>
+ <comment xml:lang="sl">Datoteka grafikona Graphviz DOT</comment>
+ <comment xml:lang="si">Graphviz DOT ප්‍රස්ථාරය</comment>
+ <comment xml:lang="sk">Graf Graphviz DOT</comment>
+ <comment xml:lang="ru">Диаграмма Graphviz DOT</comment>
+ <comment xml:lang="ro">Grafic Graphviz DOT</comment>
+ <comment xml:lang="pt_BR">Gráfico do Graphviz DOT</comment>
+ <comment xml:lang="pt">gráfico Graphviz DOT</comment>
+ <comment xml:lang="pl">Wykres DOT Graphviz</comment>
+ <comment xml:lang="oc">graf Graphviz DOT</comment>
+ <comment xml:lang="nl">Graphviz DOT-grafiek</comment>
+ <comment xml:lang="lv">Graphviz DOT grafiks</comment>
+ <comment xml:lang="lt">Graphviz DOT diagrama</comment>
+ <comment xml:lang="ko">Graphviz DOT 그래프</comment>
+ <comment xml:lang="kk">Graphviz DOT сызбасы</comment>
+ <comment xml:lang="ja">Graphviz DOT グラフ</comment>
+ <comment xml:lang="it">Grafico Graphviz DOT</comment>
+ <comment xml:lang="is">Graphviz DOT punktgraf</comment>
+ <comment xml:lang="id">Grafik Graphviz DOT</comment>
+ <comment xml:lang="ia">Graphico DOT de Graphviz</comment>
+ <comment xml:lang="hu">Graphviz DOT-grafikon</comment>
+ <comment xml:lang="hr">Graphviz DOT grafikon</comment>
+ <comment xml:lang="he">תרשים של Graphviz DOT</comment>
+ <comment xml:lang="gl">gráfica DOT de Graphviz</comment>
+ <comment xml:lang="ga">graf DOT Graphviz</comment>
+ <comment xml:lang="fur">grafic Graphviz DOT</comment>
+ <comment xml:lang="fr">graphe Graphviz DOT</comment>
+ <comment xml:lang="fo">Graphviz DOT ritmynd</comment>
+ <comment xml:lang="fi">Graphviz DOT -graafi</comment>
+ <comment xml:lang="eu">Graphviz DOT grafikoa</comment>
+ <comment xml:lang="es">gráfico de Graphviz DOT</comment>
+ <comment xml:lang="en_GB">Graphviz DOT graph</comment>
+ <comment xml:lang="el">Γράφημα Graphviz DOT</comment>
+ <comment xml:lang="de">Graphviz-DOT-Graph</comment>
+ <comment xml:lang="da">Graphviz DOT-graf</comment>
+ <comment xml:lang="cs">graf Graphviz DOT</comment>
+ <comment xml:lang="ca">gràfic Graphviz DOT</comment>
+ <comment xml:lang="bg">Граф — Graphviz DOT</comment>
+ <comment xml:lang="be">граф Graphviz DOT</comment>
+ <comment xml:lang="ar">مبيان Graphviz DOT</comment>
+ <comment xml:lang="af">Graphviz DOT-grafiek</comment>
+ <sub-class-of type="text/plain"/>
<generic-icon name="x-office-document"/>
- <magic priority="50">
+ <magic>
<match type="string" value="digraph " offset="0"/>
<match type="string" value="strict digraph " offset="0"/>
<match type="string" value="graph " offset="0"/>
@@ -33832,118 +34624,125 @@ command to generate the output files.
</mime-type>
<mime-type type="text/vnd.sun.j2me.app-descriptor">
<comment>JAD document</comment>
- <comment xml:lang="af">JAD-dokument</comment>
- <comment xml:lang="ar">مستند JAD</comment>
- <comment xml:lang="ast">Documentu JAD</comment>
- <comment xml:lang="be-Latn">Dakument JAD</comment>
- <comment xml:lang="bg">Документ — JAD</comment>
- <comment xml:lang="ca">document JAD</comment>
- <comment xml:lang="cs">dokument JAD</comment>
- <comment xml:lang="da">JAD-dokument</comment>
- <comment xml:lang="de">JAD-Dokument</comment>
- <comment xml:lang="el">Έγγραφο JAD</comment>
- <comment xml:lang="en-GB">JAD document</comment>
- <comment xml:lang="eo">JAD-dokumento</comment>
- <comment xml:lang="es">documento JAD</comment>
- <comment xml:lang="eu">JAD dokumentua</comment>
- <comment xml:lang="fi">JAD-asiakirja</comment>
- <comment xml:lang="fo">JAD skjal</comment>
- <comment xml:lang="fr">document JAD</comment>
- <comment xml:lang="fur">document JAD</comment>
- <comment xml:lang="ga">cáipéis JAD</comment>
- <comment xml:lang="gl">documento JAD</comment>
- <comment xml:lang="he">מסמך JAD</comment>
- <comment xml:lang="hr">JAD dokument</comment>
- <comment xml:lang="hu">JAD dokumentum</comment>
- <comment xml:lang="ia">Documento JAD</comment>
- <comment xml:lang="id">Dokumen JAD</comment>
- <comment xml:lang="it">Documento JAD</comment>
- <comment xml:lang="ja">JAD ドキュメント</comment>
- <comment xml:lang="kk">JAD құжаты</comment>
- <comment xml:lang="ko">JAD 문서</comment>
- <comment xml:lang="lt">JAD dokumentas</comment>
- <comment xml:lang="lv">JAD dokuments</comment>
- <comment xml:lang="nb">JAD-dokument</comment>
- <comment xml:lang="nl">JAD-document</comment>
- <comment xml:lang="nn">JAD-dokument</comment>
- <comment xml:lang="oc">document JAD</comment>
- <comment xml:lang="pl">Dokument JAD</comment>
- <comment xml:lang="pt">documento JAD</comment>
- <comment xml:lang="pt-BR">Documento JAD</comment>
- <comment xml:lang="ro">Document JAD</comment>
- <comment xml:lang="ru">Документ JAD</comment>
- <comment xml:lang="sk">Dokument JAD</comment>
- <comment xml:lang="sl">Dokument JAD</comment>
- <comment xml:lang="sq">Dokument JAD</comment>
- <comment xml:lang="sr">ЈАД документ</comment>
- <comment xml:lang="sv">JAD-dokument</comment>
- <comment xml:lang="tr">JAD belgesi</comment>
- <comment xml:lang="uk">документ JAD</comment>
+ <comment xml:lang="zh_TW">JAD 文件</comment>
+ <comment xml:lang="zh_CN">JAD 文档</comment>
<comment xml:lang="vi">Tài liệu JAD</comment>
- <comment xml:lang="zh-CN">JAD 文档</comment>
- <comment xml:lang="zh-TW">JAD 文件</comment>
+ <comment xml:lang="uk">документ JAD</comment>
+ <comment xml:lang="tr">JAD belgesi</comment>
+ <comment xml:lang="sv">JAD-dokument</comment>
+ <comment xml:lang="sr">ЈАД документ</comment>
+ <comment xml:lang="sq">dokument JAD</comment>
+ <comment xml:lang="sl">Dokument JAD</comment>
+ <comment xml:lang="si">JAD ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument JAD</comment>
+ <comment xml:lang="ru">Документ JAD</comment>
+ <comment xml:lang="ro">Document JAD</comment>
+ <comment xml:lang="pt_BR">Documento JAD</comment>
+ <comment xml:lang="pt">documento JAD</comment>
+ <comment xml:lang="pl">Dokument JAD</comment>
+ <comment xml:lang="oc">document JAD</comment>
+ <comment xml:lang="nn">JAD-dokument</comment>
+ <comment xml:lang="nl">JAD-document</comment>
+ <comment xml:lang="nb">JAD-dokument</comment>
+ <comment xml:lang="lv">JAD dokuments</comment>
+ <comment xml:lang="lt">JAD dokumentas</comment>
+ <comment xml:lang="ko">JAD 문서</comment>
+ <comment xml:lang="kk">JAD құжаты</comment>
+ <comment xml:lang="ja">JAD ドキュメント</comment>
+ <comment xml:lang="it">Documento JAD</comment>
+ <comment xml:lang="is">JAD skjal</comment>
+ <comment xml:lang="id">Dokumen JAD</comment>
+ <comment xml:lang="ia">Documento JAD</comment>
+ <comment xml:lang="hu">JAD dokumentum</comment>
+ <comment xml:lang="hr">JAD dokument</comment>
+ <comment xml:lang="he">מסמך JAD</comment>
+ <comment xml:lang="gl">documento JAD</comment>
+ <comment xml:lang="ga">cáipéis JAD</comment>
+ <comment xml:lang="fur">document JAD</comment>
+ <comment xml:lang="fr">document JAD</comment>
+ <comment xml:lang="fo">JAD skjal</comment>
+ <comment xml:lang="fi">JAD-asiakirja</comment>
+ <comment xml:lang="eu">JAD dokumentua</comment>
+ <comment xml:lang="es">documento JAD</comment>
+ <comment xml:lang="eo">JAD-dokumento</comment>
+ <comment xml:lang="en_GB">JAD document</comment>
+ <comment xml:lang="el">Έγγραφο JAD</comment>
+ <comment xml:lang="de">JAD-Dokument</comment>
+ <comment xml:lang="da">JAD-dokument</comment>
+ <comment xml:lang="cs">dokument JAD</comment>
+ <comment xml:lang="ca">document JAD</comment>
+ <comment xml:lang="bg">Документ — JAD</comment>
+ <comment xml:lang="be@latin">Dakument JAD</comment>
+ <comment xml:lang="be">дакумент JAD</comment>
+ <comment xml:lang="ast">Documentu JAD</comment>
+ <comment xml:lang="ar">مستند JAD</comment>
+ <comment xml:lang="af">JAD-dokument</comment>
<acronym>JAD</acronym>
<expanded-acronym>Java Application Descriptor</expanded-acronym>
- <magic priority="50">
+ <sub-class-of type="text/plain"/>
+ <magic>
<match type="string" value="MIDlet-" offset="0"/>
</magic>
<glob pattern="*.jad"/>
</mime-type>
<mime-type type="text/vnd.wap.wml">
<comment>WML document</comment>
- <comment xml:lang="af">WML-dokument</comment>
- <comment xml:lang="ar">مستند WML</comment>
- <comment xml:lang="ast">Documentu WML</comment>
- <comment xml:lang="az">WML sənədi</comment>
- <comment xml:lang="be-Latn">Dakument WML</comment>
- <comment xml:lang="bg">Документ — WML</comment>
- <comment xml:lang="ca">document WML</comment>
- <comment xml:lang="cs">dokument WML</comment>
- <comment xml:lang="cy">Dogfen WML</comment>
- <comment xml:lang="da">WML-dokument</comment>
- <comment xml:lang="de">WML-Dokument</comment>
- <comment xml:lang="el">Έγγραφο WML</comment>
- <comment xml:lang="en-GB">WML document</comment>
- <comment xml:lang="eo">WML-dokumento</comment>
- <comment xml:lang="es">documento WML</comment>
- <comment xml:lang="eu">WML dokumentua</comment>
- <comment xml:lang="fi">WML-asiakirja</comment>
- <comment xml:lang="fo">WML skjal</comment>
- <comment xml:lang="fr">document WML</comment>
- <comment xml:lang="fur">document WML</comment>
- <comment xml:lang="ga">cáipéis WML</comment>
- <comment xml:lang="gl">documento WML</comment>
- <comment xml:lang="he">מסמך WML</comment>
- <comment xml:lang="hr">WML dokument</comment>
- <comment xml:lang="hu">WML-dokumentum</comment>
- <comment xml:lang="ia">Documento WML</comment>
- <comment xml:lang="id">Dokumen WML</comment>
- <comment xml:lang="it">Documento WML</comment>
- <comment xml:lang="ja">WML ドキュメント</comment>
- <comment xml:lang="kk">WML құжаты</comment>
- <comment xml:lang="ko">WML 문서</comment>
- <comment xml:lang="lt">WML dokumentas</comment>
- <comment xml:lang="lv">WML dokuments</comment>
- <comment xml:lang="ms">Dokumen XML</comment>
- <comment xml:lang="nb">WML-dokument</comment>
- <comment xml:lang="nl">WML-document</comment>
- <comment xml:lang="nn">WML-dokument</comment>
- <comment xml:lang="oc">document WML</comment>
- <comment xml:lang="pl">Dokument WML</comment>
- <comment xml:lang="pt">documento WML</comment>
- <comment xml:lang="pt-BR">Documento WML</comment>
- <comment xml:lang="ro">Document WML</comment>
- <comment xml:lang="ru">Документ WML</comment>
- <comment xml:lang="sk">Dokument WML</comment>
- <comment xml:lang="sl">Dokument WML</comment>
- <comment xml:lang="sq">Dokument WML</comment>
- <comment xml:lang="sr">ВМЛ документ</comment>
- <comment xml:lang="sv">WML-dokument</comment>
- <comment xml:lang="tr">WML belgesi</comment>
- <comment xml:lang="uk">документ WML</comment>
+ <comment xml:lang="zh_TW">WML 文件</comment>
+ <comment xml:lang="zh_CN">WML 文档</comment>
<comment xml:lang="vi">Tài liệu WML</comment>
- <comment xml:lang="zh-CN">WML 文档</comment>
- <comment xml:lang="zh-TW">WML 文件</comment>
+ <comment xml:lang="uk">документ WML</comment>
+ <comment xml:lang="tr">WML belgesi</comment>
+ <comment xml:lang="sv">WML-dokument</comment>
+ <comment xml:lang="sr">ВМЛ документ</comment>
+ <comment xml:lang="sq">dokument WML</comment>
+ <comment xml:lang="sl">Dokument WML</comment>
+ <comment xml:lang="si">WML ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument WML</comment>
+ <comment xml:lang="ru">Документ WML</comment>
+ <comment xml:lang="ro">Document WML</comment>
+ <comment xml:lang="pt_BR">Documento WML</comment>
+ <comment xml:lang="pt">documento WML</comment>
+ <comment xml:lang="pl">Dokument WML</comment>
+ <comment xml:lang="oc">document WML</comment>
+ <comment xml:lang="nn">WML-dokument</comment>
+ <comment xml:lang="nl">WML-document</comment>
+ <comment xml:lang="nb">WML-dokument</comment>
+ <comment xml:lang="ms">Dokumen XML</comment>
+ <comment xml:lang="lv">WML dokuments</comment>
+ <comment xml:lang="lt">WML dokumentas</comment>
+ <comment xml:lang="ko">WML 문서</comment>
+ <comment xml:lang="kk">WML құжаты</comment>
+ <comment xml:lang="ja">WML ドキュメント</comment>
+ <comment xml:lang="it">Documento WML</comment>
+ <comment xml:lang="is">WML skjal</comment>
+ <comment xml:lang="id">Dokumen WML</comment>
+ <comment xml:lang="ia">Documento WML</comment>
+ <comment xml:lang="hu">WML-dokumentum</comment>
+ <comment xml:lang="hr">WML dokument</comment>
+ <comment xml:lang="he">מסמך WML</comment>
+ <comment xml:lang="gl">documento WML</comment>
+ <comment xml:lang="ga">cáipéis WML</comment>
+ <comment xml:lang="fur">document WML</comment>
+ <comment xml:lang="fr">document WML</comment>
+ <comment xml:lang="fo">WML skjal</comment>
+ <comment xml:lang="fi">WML-asiakirja</comment>
+ <comment xml:lang="eu">WML dokumentua</comment>
+ <comment xml:lang="es">documento WML</comment>
+ <comment xml:lang="eo">WML-dokumento</comment>
+ <comment xml:lang="en_GB">WML document</comment>
+ <comment xml:lang="el">Έγγραφο WML</comment>
+ <comment xml:lang="de">WML-Dokument</comment>
+ <comment xml:lang="da">WML-dokument</comment>
+ <comment xml:lang="cy">Dogfen WML</comment>
+ <comment xml:lang="cs">dokument WML</comment>
+ <comment xml:lang="ca">document WML</comment>
+ <comment xml:lang="bg">Документ — WML</comment>
+ <comment xml:lang="be@latin">Dakument WML</comment>
+ <comment xml:lang="be">дакумент WML</comment>
+ <comment xml:lang="az">WML sənədi</comment>
+ <comment xml:lang="ast">Documentu WML</comment>
+ <comment xml:lang="ar">مستند WML</comment>
+ <comment xml:lang="af">WML-dokument</comment>
<acronym>WML</acronym>
<expanded-acronym>Wireless Markup Language</expanded-acronym>
<sub-class-of type="application/xml"/>
@@ -33951,139 +34750,155 @@ command to generate the output files.
</mime-type>
<mime-type type="text/vnd.wap.wmlscript">
<comment>WMLScript program</comment>
- <comment xml:lang="af">WMLScript-program</comment>
- <comment xml:lang="ar">برنامج WMLScript</comment>
- <comment xml:lang="be-Latn">Prahrama WMLScript</comment>
- <comment xml:lang="bg">Програма — WMLScript</comment>
- <comment xml:lang="ca">programa WMLScript</comment>
- <comment xml:lang="cs">program WMLScript</comment>
- <comment xml:lang="da">WMLScript-program</comment>
- <comment xml:lang="de">WMLScript-Programm</comment>
- <comment xml:lang="el">Πρόγραμμα WMLScript</comment>
- <comment xml:lang="en-GB">WMLScript program</comment>
- <comment xml:lang="es">programa en WMLScript</comment>
- <comment xml:lang="eu">WMLScript programa</comment>
- <comment xml:lang="fi">WMLScript-ohjelma</comment>
- <comment xml:lang="fo">WMLScript forrit</comment>
- <comment xml:lang="fr">programme WMLScript</comment>
- <comment xml:lang="fur">program WMLScript</comment>
- <comment xml:lang="ga">ríomhchlár WMLScript</comment>
- <comment xml:lang="gl">programa en WMLScript</comment>
- <comment xml:lang="he">תכנית של WMLScript</comment>
- <comment xml:lang="hr">WMLScript program</comment>
- <comment xml:lang="hu">WMLScript program</comment>
- <comment xml:lang="ia">Programma WMLScript</comment>
- <comment xml:lang="id">Program WMLScript</comment>
- <comment xml:lang="it">Programma WMLScript</comment>
- <comment xml:lang="ja">WMLScript プログラム</comment>
- <comment xml:lang="kk">WMLScript бағдарламасы</comment>
- <comment xml:lang="ko">WMLScript 프로그램</comment>
- <comment xml:lang="lt">WMLScript programa</comment>
- <comment xml:lang="lv">WMLScript programma</comment>
- <comment xml:lang="nb">WMLScript-program</comment>
- <comment xml:lang="nl">WMLScript-programma</comment>
- <comment xml:lang="nn">WMLScript-program</comment>
- <comment xml:lang="oc">programa WMLEscript</comment>
- <comment xml:lang="pl">Pogram WMLScript</comment>
- <comment xml:lang="pt">programa WMLScript</comment>
- <comment xml:lang="pt-BR">Programa WMLScript</comment>
- <comment xml:lang="ro">Program WMLScript</comment>
- <comment xml:lang="ru">Программа WMLScript</comment>
- <comment xml:lang="sk">Program WMLScript</comment>
- <comment xml:lang="sl">Programska datoteka WMLScript</comment>
- <comment xml:lang="sq">Program WMLScript</comment>
- <comment xml:lang="sr">програм ВМЛ скрипте</comment>
- <comment xml:lang="sv">WMLScript-program</comment>
- <comment xml:lang="tr">WMLScript programı</comment>
- <comment xml:lang="uk">програма мовою WMLScript</comment>
+ <comment xml:lang="zh_TW">WMLScript 程式</comment>
+ <comment xml:lang="zh_CN">WMLScript 程序</comment>
<comment xml:lang="vi">Chương trình WMLScript</comment>
- <comment xml:lang="zh-CN">WMLScript 程序</comment>
- <comment xml:lang="zh-TW">WMLScript 程式</comment>
+ <comment xml:lang="uk">програма мовою WMLScript</comment>
+ <comment xml:lang="tr">WMLScript programı</comment>
+ <comment xml:lang="sv">WMLScript-program</comment>
+ <comment xml:lang="sr">програм ВМЛ скрипте</comment>
+ <comment xml:lang="sq">program WMLScript</comment>
+ <comment xml:lang="sl">Programska datoteka WMLScript</comment>
+ <comment xml:lang="si">WMLScript වැඩසටහන</comment>
+ <comment xml:lang="sk">Program WMLScript</comment>
+ <comment xml:lang="ru">Программа WMLScript</comment>
+ <comment xml:lang="ro">Program WMLScript</comment>
+ <comment xml:lang="pt_BR">Programa WMLScript</comment>
+ <comment xml:lang="pt">programa WMLScript</comment>
+ <comment xml:lang="pl">Pogram WMLScript</comment>
+ <comment xml:lang="oc">programa WMLEscript</comment>
+ <comment xml:lang="nn">WMLScript-program</comment>
+ <comment xml:lang="nl">WMLScript-toepassing</comment>
+ <comment xml:lang="nb">WMLScript-program</comment>
+ <comment xml:lang="lv">WMLScript programma</comment>
+ <comment xml:lang="lt">WMLScript programa</comment>
+ <comment xml:lang="ko">WMLScript 프로그램</comment>
+ <comment xml:lang="kk">WMLScript бағдарламасы</comment>
+ <comment xml:lang="ja">WMLScript プログラム</comment>
+ <comment xml:lang="it">Programma WMLScript</comment>
+ <comment xml:lang="is">WMLScript forrit</comment>
+ <comment xml:lang="id">Program WMLScript</comment>
+ <comment xml:lang="ia">Programma WMLScript</comment>
+ <comment xml:lang="hu">WMLScript program</comment>
+ <comment xml:lang="hr">WMLScript program</comment>
+ <comment xml:lang="he">תכנית של WMLScript</comment>
+ <comment xml:lang="gl">programa en WMLScript</comment>
+ <comment xml:lang="ga">ríomhchlár WMLScript</comment>
+ <comment xml:lang="fur">program WMLScript</comment>
+ <comment xml:lang="fr">programme WMLScript</comment>
+ <comment xml:lang="fo">WMLScript forrit</comment>
+ <comment xml:lang="fi">WMLScript-ohjelma</comment>
+ <comment xml:lang="eu">WMLScript programa</comment>
+ <comment xml:lang="es">programa en WMLScript</comment>
+ <comment xml:lang="en_GB">WMLScript program</comment>
+ <comment xml:lang="el">Πρόγραμμα WMLScript</comment>
+ <comment xml:lang="de">WMLScript-Programm</comment>
+ <comment xml:lang="da">WMLScript-program</comment>
+ <comment xml:lang="cs">program WMLScript</comment>
+ <comment xml:lang="ca">programa WMLScript</comment>
+ <comment xml:lang="bg">Програма — WMLScript</comment>
+ <comment xml:lang="be@latin">Prahrama WMLScript</comment>
+ <comment xml:lang="be">праграма WMLScript</comment>
+ <comment xml:lang="ar">برنامج WMLScript</comment>
+ <comment xml:lang="af">WMLScript-program</comment>
+ <sub-class-of type="text/plain"/>
<glob pattern="*.wmls"/>
</mime-type>
<mime-type type="text/vnd.senx.warpscript">
<comment>WarpScript source code</comment>
- <comment xml:lang="bg">Изходен код — WarpScript</comment>
- <comment xml:lang="ca">codi font en WarpScript</comment>
- <comment xml:lang="cs">zdrojový kód v jazyce WarpScript</comment>
- <comment xml:lang="da">WarpScript-kildekode</comment>
- <comment xml:lang="de">WarpScript-Quelltext</comment>
- <comment xml:lang="en-GB">WarpScript source code</comment>
- <comment xml:lang="es">código fuente en WarpScript</comment>
- <comment xml:lang="eu">WarpScript iturburu-kodea</comment>
- <comment xml:lang="fi">WarpScript-lähdekoodi</comment>
- <comment xml:lang="fr">code source WarpScript</comment>
- <comment xml:lang="fur">codiç sorzint WarpScript</comment>
- <comment xml:lang="hr">WarpScript izvorni kôd</comment>
- <comment xml:lang="hu">WarpScript forráskód</comment>
- <comment xml:lang="id">Kode sumber WarpScript</comment>
- <comment xml:lang="it">Codice sorgente WarpScript</comment>
- <comment xml:lang="kk">WarpScript бастапқы коды</comment>
- <comment xml:lang="ko">WarpScript 소스 코드</comment>
- <comment xml:lang="pl">Kod źródłowy WarpScript</comment>
- <comment xml:lang="pt-BR">Código-fonte WarpScript</comment>
- <comment xml:lang="ru">Исходный код WarpScript</comment>
- <comment xml:lang="sl">Izvorna koda WarpScript</comment>
- <comment xml:lang="sv">WarpScript-källkod</comment>
+ <comment xml:lang="zh_TW">WarpScript 原始碼</comment>
+ <comment xml:lang="zh_CN">WarpScript 源代码</comment>
+ <comment xml:lang="uk">початковий код мовою WarpScript</comment>
<comment xml:lang="tr">WarpScript kaynak kodu</comment>
- <comment xml:lang="uk">вихідний код мовою WarpScript</comment>
- <comment xml:lang="zh-CN">WarpScript 源代码</comment>
- <comment xml:lang="zh-TW">WarpScript 原始碼</comment>
+ <comment xml:lang="sv">WarpScript-källkod</comment>
+ <comment xml:lang="sq">kod burim WarpScript</comment>
+ <comment xml:lang="sl">Izvorna koda WarpScript</comment>
+ <comment xml:lang="si">WarpScript මූලාශ්‍ර කේතය</comment>
+ <comment xml:lang="ru">Исходный код WarpScript</comment>
+ <comment xml:lang="pt_BR">Código-fonte WarpScript</comment>
+ <comment xml:lang="pl">Kod źródłowy WarpScript</comment>
+ <comment xml:lang="nl">WarpScript-broncode</comment>
+ <comment xml:lang="ko">WarpScript 소스 코드</comment>
+ <comment xml:lang="kk">WarpScript бастапқы коды</comment>
+ <comment xml:lang="ja">WarpScript ソースコード</comment>
+ <comment xml:lang="it">Codice sorgente WarpScript</comment>
+ <comment xml:lang="is">WarpScript frumkóði</comment>
+ <comment xml:lang="id">Kode sumber WarpScript</comment>
+ <comment xml:lang="hu">WarpScript forráskód</comment>
+ <comment xml:lang="hr">WarpScript izvorni kôd</comment>
+ <comment xml:lang="he">קוד מקור ב־WarpScript</comment>
+ <comment xml:lang="gl">Código fonte en WarpScript</comment>
+ <comment xml:lang="fur">codiç sorzint WarpScript</comment>
+ <comment xml:lang="fr">code source WarpScript</comment>
+ <comment xml:lang="fi">WarpScript-lähdekoodi</comment>
+ <comment xml:lang="eu">WarpScript iturburu-kodea</comment>
+ <comment xml:lang="es">código fuente en WarpScript</comment>
+ <comment xml:lang="en_GB">WarpScript source code</comment>
+ <comment xml:lang="de">WarpScript-Quelltext</comment>
+ <comment xml:lang="da">WarpScript-kildekode</comment>
+ <comment xml:lang="cs">zdrojový kód v jazyce WarpScript</comment>
+ <comment xml:lang="ca">codi font en WarpScript</comment>
+ <comment xml:lang="bg">Изходен код — WarpScript</comment>
+ <comment xml:lang="be">зыходны код WarpScript</comment>
+ <comment xml:lang="ar">شفرة مصدر WarpScript</comment>
<sub-class-of type="text/plain"/>
<glob pattern="*.mc2"/>
- </mime-type>
+ </mime-type>
<mime-type type="application/x-ace">
<comment>ACE archive</comment>
- <comment xml:lang="af">ACE-argief</comment>
- <comment xml:lang="ar">أرشيف ACE</comment>
- <comment xml:lang="be-Latn">Archiŭ ACE</comment>
- <comment xml:lang="bg">Архив — ACE</comment>
- <comment xml:lang="ca">arxiu ACE</comment>
- <comment xml:lang="cs">archiv ACE</comment>
- <comment xml:lang="da">ACE-arkiv</comment>
- <comment xml:lang="de">ACE-Archiv</comment>
- <comment xml:lang="el">Συμπιεσμένο αρχείο ACE</comment>
- <comment xml:lang="en-GB">ACE archive</comment>
- <comment xml:lang="eo">ACE-arkivo</comment>
- <comment xml:lang="es">archivador ACE</comment>
- <comment xml:lang="eu">ACE artxiboa</comment>
- <comment xml:lang="fi">ACE-arkisto</comment>
- <comment xml:lang="fo">ACE skjalasavn</comment>
- <comment xml:lang="fr">archive ACE</comment>
- <comment xml:lang="fur">archivi ACE</comment>
- <comment xml:lang="ga">cartlann ACE</comment>
- <comment xml:lang="gl">arquivo ACE</comment>
- <comment xml:lang="he">ארכיון ACE</comment>
- <comment xml:lang="hr">ACE arhiva</comment>
- <comment xml:lang="hu">ACE archívum</comment>
- <comment xml:lang="ia">Archivo ACE</comment>
- <comment xml:lang="id">Arsip ACE</comment>
- <comment xml:lang="it">Archivio ACE</comment>
- <comment xml:lang="ja">ACE アーカイブ</comment>
- <comment xml:lang="ka">ACE არქივი</comment>
- <comment xml:lang="kk">ACE архиві</comment>
- <comment xml:lang="ko">ACE 압축 파일</comment>
- <comment xml:lang="lt">ACE archyvas</comment>
- <comment xml:lang="lv">ACE arhīvs</comment>
- <comment xml:lang="nb">ACE-arkiv</comment>
- <comment xml:lang="nl">ACE-archief</comment>
- <comment xml:lang="nn">ACE-arkiv</comment>
- <comment xml:lang="oc">archiu ACE</comment>
- <comment xml:lang="pl">Archiwum ACE</comment>
- <comment xml:lang="pt">arquivo ACE</comment>
- <comment xml:lang="pt-BR">Pacote ACE</comment>
- <comment xml:lang="ro">Arhivă ACE</comment>
- <comment xml:lang="ru">Архив ACE</comment>
- <comment xml:lang="sk">Archív ACE</comment>
- <comment xml:lang="sl">Datoteka arhiva ACE</comment>
- <comment xml:lang="sq">Arkiv ACE</comment>
- <comment xml:lang="sr">АЦЕ архива</comment>
- <comment xml:lang="sv">ACE-arkiv</comment>
- <comment xml:lang="tr">ACE arşivi</comment>
- <comment xml:lang="uk">архів ACE</comment>
+ <comment xml:lang="zh_TW">ACE 封存檔</comment>
+ <comment xml:lang="zh_CN">ACE 归档文件</comment>
<comment xml:lang="vi">Kho nén ACE</comment>
- <comment xml:lang="zh-CN">ACE 归档文件</comment>
- <comment xml:lang="zh-TW">ACE 封存檔</comment>
+ <comment xml:lang="uk">архів ACE</comment>
+ <comment xml:lang="tr">ACE arşivi</comment>
+ <comment xml:lang="sv">ACE-arkiv</comment>
+ <comment xml:lang="sr">АЦЕ архива</comment>
+ <comment xml:lang="sq">arkiv ACE</comment>
+ <comment xml:lang="sl">Datoteka arhiva ACE</comment>
+ <comment xml:lang="si">ACE ලේඛනාගාරය</comment>
+ <comment xml:lang="sk">Archív ACE</comment>
+ <comment xml:lang="ru">Архив ACE</comment>
+ <comment xml:lang="ro">Arhivă ACE</comment>
+ <comment xml:lang="pt_BR">Pacote ACE</comment>
+ <comment xml:lang="pt">arquivo ACE</comment>
+ <comment xml:lang="pl">Archiwum ACE</comment>
+ <comment xml:lang="oc">archiu ACE</comment>
+ <comment xml:lang="nn">ACE-arkiv</comment>
+ <comment xml:lang="nl">ACE-archief</comment>
+ <comment xml:lang="nb">ACE-arkiv</comment>
+ <comment xml:lang="lv">ACE arhīvs</comment>
+ <comment xml:lang="lt">ACE archyvas</comment>
+ <comment xml:lang="ko">ACE 압축 파일</comment>
+ <comment xml:lang="kk">ACE архиві</comment>
+ <comment xml:lang="ka">ACE არქივი</comment>
+ <comment xml:lang="ja">ACE アーカイブ</comment>
+ <comment xml:lang="it">Archivio ACE</comment>
+ <comment xml:lang="is">ACE safnskrá</comment>
+ <comment xml:lang="id">Arsip ACE</comment>
+ <comment xml:lang="ia">Archivo ACE</comment>
+ <comment xml:lang="hu">ACE archívum</comment>
+ <comment xml:lang="hr">ACE arhiva</comment>
+ <comment xml:lang="he">ארכיון ACE</comment>
+ <comment xml:lang="gl">arquivo ACE</comment>
+ <comment xml:lang="ga">cartlann ACE</comment>
+ <comment xml:lang="fur">archivi ACE</comment>
+ <comment xml:lang="fr">archive ACE</comment>
+ <comment xml:lang="fo">ACE skjalasavn</comment>
+ <comment xml:lang="fi">ACE-arkisto</comment>
+ <comment xml:lang="eu">ACE artxiboa</comment>
+ <comment xml:lang="es">archivador ACE</comment>
+ <comment xml:lang="eo">ACE-arkivo</comment>
+ <comment xml:lang="en_GB">ACE archive</comment>
+ <comment xml:lang="el">Συμπιεσμένο αρχείο ACE</comment>
+ <comment xml:lang="de">ACE-Archiv</comment>
+ <comment xml:lang="da">ACE-arkiv</comment>
+ <comment xml:lang="cs">archiv ACE</comment>
+ <comment xml:lang="ca">arxiu ACE</comment>
+ <comment xml:lang="bg">Архив — ACE</comment>
+ <comment xml:lang="be@latin">Archiŭ ACE</comment>
+ <comment xml:lang="be">архіў ACE</comment>
+ <comment xml:lang="ar">أرشيف ACE</comment>
+ <comment xml:lang="af">ACE-argief</comment>
<generic-icon name="package-x-generic"/>
<magic priority="60">
<match type="string" value="**ACE**" offset="7"/>
@@ -34092,225 +34907,207 @@ command to generate the output files.
</mime-type>
<mime-type type="text/x-adasrc">
<comment>Ada source code</comment>
- <comment xml:lang="af">Ada-bronkode</comment>
- <comment xml:lang="ar">شفرة مصدر Ada</comment>
- <comment xml:lang="be-Latn">Kryničny kod Ada</comment>
- <comment xml:lang="bg">Изходен код — Ada</comment>
- <comment xml:lang="ca">codi font en Ada</comment>
- <comment xml:lang="cs">zdrojový kód v jazyce Ada</comment>
- <comment xml:lang="da">Ada-kildekode</comment>
- <comment xml:lang="de">Ada-Quelltext</comment>
- <comment xml:lang="el">Πηγαίος κώδικας Ada</comment>
- <comment xml:lang="en-GB">Ada source code</comment>
- <comment xml:lang="eo">Ada-fontkodo</comment>
- <comment xml:lang="es">código fuente en Ada</comment>
- <comment xml:lang="eu">Ada iturburu-kodea</comment>
- <comment xml:lang="fi">Ada-lähdekoodi</comment>
- <comment xml:lang="fo">Ada keldukota</comment>
- <comment xml:lang="fr">code source Ada</comment>
- <comment xml:lang="fur">codiç sorzint Ada</comment>
- <comment xml:lang="ga">cód foinseach Ada</comment>
- <comment xml:lang="gl">código fonte en Ada</comment>
- <comment xml:lang="he">קוד מקור Ada</comment>
- <comment xml:lang="hr">Ada izvorni kôd</comment>
- <comment xml:lang="hu">Ada-forráskód</comment>
- <comment xml:lang="ia">Codice-fonte Ada</comment>
- <comment xml:lang="id">Kode sumber Ada</comment>
- <comment xml:lang="it">Codice sorgente Ada</comment>
- <comment xml:lang="ja">Ada ソースコード</comment>
- <comment xml:lang="ka">Ada-ის საწყისი კოდი</comment>
- <comment xml:lang="kk">Ada бастапқы коды</comment>
- <comment xml:lang="ko">Ada 소스 코드</comment>
- <comment xml:lang="lt">Ada pradinis kodas</comment>
- <comment xml:lang="lv">Ada pirmkods</comment>
- <comment xml:lang="ms">Kod sumber Ada</comment>
- <comment xml:lang="nb">Ada-kildekode</comment>
- <comment xml:lang="nl">Ada-broncode</comment>
- <comment xml:lang="nn">Ada-kjeldekode</comment>
- <comment xml:lang="oc">còde font Ada</comment>
- <comment xml:lang="pl">Kod źródłowy Ada</comment>
- <comment xml:lang="pt">código origem Ada</comment>
- <comment xml:lang="pt-BR">Código-fonte Ada</comment>
- <comment xml:lang="ro">Cod sursă Ada</comment>
- <comment xml:lang="ru">Исходный код Ada</comment>
- <comment xml:lang="sk">Zdrojový kód jazyka Ada</comment>
- <comment xml:lang="sl">Datoteka izvorne kode Ada</comment>
- <comment xml:lang="sq">Kod burues Ada</comment>
- <comment xml:lang="sr">Ада изворни ко̂д</comment>
- <comment xml:lang="sv">Ada-källkod</comment>
- <comment xml:lang="tr">Ada kaynak kodu</comment>
- <comment xml:lang="uk">вихідний код мовою Ada</comment>
+ <comment xml:lang="zh_TW">Ada 源碼</comment>
+ <comment xml:lang="zh_CN">Ada 源代码</comment>
<comment xml:lang="vi">Mã nguồn Ada</comment>
- <comment xml:lang="zh-CN">Ada 源代码</comment>
- <comment xml:lang="zh-TW">Ada 源碼</comment>
+ <comment xml:lang="uk">початковий код мовою Ada</comment>
+ <comment xml:lang="tr">Ada kaynak kodu</comment>
+ <comment xml:lang="sv">Ada-källkod</comment>
+ <comment xml:lang="sr">Ада изворни ко̂д</comment>
+ <comment xml:lang="sq">kod burim Ada</comment>
+ <comment xml:lang="sl">Datoteka izvorne kode Ada</comment>
+ <comment xml:lang="si">Ada මූල කේතය</comment>
+ <comment xml:lang="sk">Zdrojový kód jazyka Ada</comment>
+ <comment xml:lang="ru">Исходный код Ada</comment>
+ <comment xml:lang="ro">Cod sursă Ada</comment>
+ <comment xml:lang="pt_BR">Código-fonte Ada</comment>
+ <comment xml:lang="pt">código origem Ada</comment>
+ <comment xml:lang="pl">Kod źródłowy Ada</comment>
+ <comment xml:lang="oc">còde font Ada</comment>
+ <comment xml:lang="nn">Ada-kjeldekode</comment>
+ <comment xml:lang="nl">Ada-broncode</comment>
+ <comment xml:lang="nb">Ada-kildekode</comment>
+ <comment xml:lang="ms">Kod sumber Ada</comment>
+ <comment xml:lang="lv">Ada pirmkods</comment>
+ <comment xml:lang="lt">Ada pradinis kodas</comment>
+ <comment xml:lang="ko">Ada 소스 코드</comment>
+ <comment xml:lang="kk">Ada бастапқы коды</comment>
+ <comment xml:lang="ka">Ada-ის საწყისი კოდი</comment>
+ <comment xml:lang="ja">Ada ソースコード</comment>
+ <comment xml:lang="it">Codice sorgente Ada</comment>
+ <comment xml:lang="is">Ada frumkóði</comment>
+ <comment xml:lang="id">Kode sumber Ada</comment>
+ <comment xml:lang="ia">Codice-fonte Ada</comment>
+ <comment xml:lang="hu">Ada-forráskód</comment>
+ <comment xml:lang="hr">Ada izvorni kôd</comment>
+ <comment xml:lang="he">קוד מקור Ada</comment>
+ <comment xml:lang="gl">código fonte en Ada</comment>
+ <comment xml:lang="ga">cód foinseach Ada</comment>
+ <comment xml:lang="fur">codiç sorzint Ada</comment>
+ <comment xml:lang="fr">code source Ada</comment>
+ <comment xml:lang="fo">Ada keldukota</comment>
+ <comment xml:lang="fi">Ada-lähdekoodi</comment>
+ <comment xml:lang="eu">Ada iturburu-kodea</comment>
+ <comment xml:lang="es">código fuente en Ada</comment>
+ <comment xml:lang="eo">Ada-fontkodo</comment>
+ <comment xml:lang="en_GB">Ada source code</comment>
+ <comment xml:lang="el">Πηγαίος κώδικας Ada</comment>
+ <comment xml:lang="de">Ada-Quelltext</comment>
+ <comment xml:lang="da">Ada-kildekode</comment>
+ <comment xml:lang="cs">zdrojový kód v jazyce Ada</comment>
+ <comment xml:lang="ca">codi font en Ada</comment>
+ <comment xml:lang="bg">Изходен код — Ada</comment>
+ <comment xml:lang="be@latin">Kryničny kod Ada</comment>
+ <comment xml:lang="be">зыходны код Ada</comment>
+ <comment xml:lang="ar">شفرة مصدر Ada</comment>
+ <comment xml:lang="af">Ada-bronkode</comment>
<sub-class-of type="text/plain"/>
<glob pattern="*.adb"/>
<glob pattern="*.ads"/>
</mime-type>
<mime-type type="text/x-authors">
- <comment>author list</comment>
- <comment xml:lang="af">outeurlys</comment>
- <comment xml:lang="ar">لائحة المؤلف</comment>
- <comment xml:lang="be-Latn">śpis aŭtaraŭ</comment>
- <comment xml:lang="bg">Списък на авторите</comment>
- <comment xml:lang="ca">llista d'autors</comment>
- <comment xml:lang="cs">seznam autorů</comment>
- <comment xml:lang="da">forfatterliste</comment>
- <comment xml:lang="de">Autorenliste</comment>
- <comment xml:lang="el">Κατάλογος συγγραφέων</comment>
- <comment xml:lang="en-GB">author list</comment>
- <comment xml:lang="eo">listo de aŭtoroj</comment>
- <comment xml:lang="es">lista de autores</comment>
- <comment xml:lang="eu">egile-zerrenda</comment>
- <comment xml:lang="fi">tekijäluettelo</comment>
- <comment xml:lang="fo">høvundalisti</comment>
- <comment xml:lang="fr">liste d'auteurs</comment>
- <comment xml:lang="fur">liste di autôrs</comment>
- <comment xml:lang="ga">liosta údar</comment>
- <comment xml:lang="gl">lista de autores</comment>
- <comment xml:lang="he">רשימת יוצרים</comment>
- <comment xml:lang="hr">Popis autora</comment>
- <comment xml:lang="hu">szerzőlista</comment>
- <comment xml:lang="ia">Lista de autores</comment>
- <comment xml:lang="id">senarai penulis</comment>
- <comment xml:lang="it">Elenco autori</comment>
- <comment xml:lang="ja">著者リスト</comment>
- <comment xml:lang="kk">авторлар тізімі</comment>
- <comment xml:lang="ko">저자 목록</comment>
- <comment xml:lang="lt">autorių sąrašas</comment>
- <comment xml:lang="lv">autoru saraksts</comment>
- <comment xml:lang="ms">Senarai penulis</comment>
- <comment xml:lang="nb">forfatterliste</comment>
- <comment xml:lang="nl">auteurslijst</comment>
- <comment xml:lang="nn">forfattarliste</comment>
- <comment xml:lang="oc">lista d'autors</comment>
- <comment xml:lang="pl">Lista autorów</comment>
- <comment xml:lang="pt">lista de autores</comment>
- <comment xml:lang="pt-BR">Lista de autores</comment>
- <comment xml:lang="ro">listă autori</comment>
+ <comment>Author list</comment>
+ <comment xml:lang="uk">список авторів</comment>
+ <comment xml:lang="sv">Författarlista</comment>
<comment xml:lang="ru">Список авторов</comment>
- <comment xml:lang="sk">Zoznam autorov</comment>
- <comment xml:lang="sl">seznam avtorjev</comment>
- <comment xml:lang="sq">Lista e autorëve</comment>
- <comment xml:lang="sr">списак аутора</comment>
- <comment xml:lang="sv">författarlista</comment>
- <comment xml:lang="tr">yazar listesi</comment>
- <comment xml:lang="uk">перелік авторів</comment>
- <comment xml:lang="vi">danh sách tác giả</comment>
- <comment xml:lang="zh-CN">作者列表</comment>
- <comment xml:lang="zh-TW">作者清單</comment>
+ <comment xml:lang="pl">Lista autorów</comment>
+ <comment xml:lang="it">Elenco autori</comment>
+ <comment xml:lang="eu">Egile-zerrenda</comment>
+ <comment xml:lang="es">lista de autores</comment>
+ <comment xml:lang="de">Autorenliste</comment>
+ <comment xml:lang="be">спіс аўтараў</comment>
<sub-class-of type="text/plain"/>
<glob pattern="AUTHORS"/>
</mime-type>
<mime-type type="text/x-bibtex">
<comment>BibTeX document</comment>
- <comment xml:lang="af">BibTeX-dokument</comment>
- <comment xml:lang="ar">مستند BibTeX</comment>
- <comment xml:lang="ast">Documentu de BibTeX</comment>
- <comment xml:lang="be-Latn">Dakument BibTeX</comment>
- <comment xml:lang="bg">Документ — BibTeX</comment>
- <comment xml:lang="ca">document BibTeX</comment>
- <comment xml:lang="cs">dokument BibTeX</comment>
- <comment xml:lang="da">BibTeX-dokument</comment>
- <comment xml:lang="de">BibTeX-Dokument</comment>
- <comment xml:lang="el">Έγγραφο BibTeX</comment>
- <comment xml:lang="en-GB">BibTeX document</comment>
- <comment xml:lang="eo">BibTeX-dokumento</comment>
- <comment xml:lang="es">documento BibTeX</comment>
- <comment xml:lang="eu">BibTeX dokumentua</comment>
- <comment xml:lang="fi">BibTeX-asiakirja</comment>
- <comment xml:lang="fo">BibTeX skjal</comment>
- <comment xml:lang="fr">document BibTeX</comment>
- <comment xml:lang="fur">document BibTeX</comment>
- <comment xml:lang="ga">cáipéis BibTeX</comment>
- <comment xml:lang="gl">documento BibTex</comment>
- <comment xml:lang="he">מסמך BibTeX</comment>
- <comment xml:lang="hr">BibTeX dokument</comment>
- <comment xml:lang="hu">BibTeX dokumentum</comment>
- <comment xml:lang="ia">Documento BibTeX</comment>
- <comment xml:lang="id">Dokumen BibTeX</comment>
- <comment xml:lang="it">Documento BibTeX</comment>
- <comment xml:lang="ja">BibTeX ドキュメント</comment>
- <comment xml:lang="ka">BibTeX-ის დოკუმენტი</comment>
- <comment xml:lang="kk">BibTeX құжаты</comment>
- <comment xml:lang="ko">BibTeX 문서</comment>
- <comment xml:lang="lt">BibTeX dokumentas</comment>
- <comment xml:lang="lv">BibTeX dokuments</comment>
- <comment xml:lang="nb">BibTeX-dokument</comment>
- <comment xml:lang="nl">BibTeX-document</comment>
- <comment xml:lang="nn">BibTeX-dokument</comment>
- <comment xml:lang="oc">document BibTeX</comment>
- <comment xml:lang="pl">Dokument BibTeX</comment>
- <comment xml:lang="pt">documento BibTeX</comment>
- <comment xml:lang="pt-BR">Documento BibTeX</comment>
- <comment xml:lang="ro">Document BibTeX</comment>
- <comment xml:lang="ru">Документ BibTeX</comment>
- <comment xml:lang="sk">Dokument BibTeX</comment>
- <comment xml:lang="sl">Dokument BibTeX</comment>
- <comment xml:lang="sq">Dokument BibTeX</comment>
- <comment xml:lang="sr">Биб ТеКс документ</comment>
- <comment xml:lang="sv">BibTeX-dokument</comment>
- <comment xml:lang="tr">BibTeX belgesi</comment>
- <comment xml:lang="uk">документ BibTeX</comment>
+ <comment xml:lang="zh_TW">BibTeX 文件</comment>
+ <comment xml:lang="zh_CN">BibTeX 文档</comment>
<comment xml:lang="vi">Tài liệu BibTeX</comment>
- <comment xml:lang="zh-CN">BibTeX 文档</comment>
- <comment xml:lang="zh-TW">BibTeX 文件</comment>
+ <comment xml:lang="uk">документ BibTeX</comment>
+ <comment xml:lang="tr">BibTeX belgesi</comment>
+ <comment xml:lang="sv">BibTeX-dokument</comment>
+ <comment xml:lang="sr">Биб ТеКс документ</comment>
+ <comment xml:lang="sq">dokument BibTeX</comment>
+ <comment xml:lang="sl">Dokument BibTeX</comment>
+ <comment xml:lang="si">BibTeX ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument BibTeX</comment>
+ <comment xml:lang="ru">Документ BibTeX</comment>
+ <comment xml:lang="ro">Document BibTeX</comment>
+ <comment xml:lang="pt_BR">Documento BibTeX</comment>
+ <comment xml:lang="pt">documento BibTeX</comment>
+ <comment xml:lang="pl">Dokument BibTeX</comment>
+ <comment xml:lang="oc">document BibTeX</comment>
+ <comment xml:lang="nn">BibTeX-dokument</comment>
+ <comment xml:lang="nl">BibTeX-document</comment>
+ <comment xml:lang="nb">BibTeX-dokument</comment>
+ <comment xml:lang="lv">BibTeX dokuments</comment>
+ <comment xml:lang="lt">BibTeX dokumentas</comment>
+ <comment xml:lang="ko">BibTeX 문서</comment>
+ <comment xml:lang="kk">BibTeX құжаты</comment>
+ <comment xml:lang="ka">BibTeX-ის დოკუმენტი</comment>
+ <comment xml:lang="ja">BibTeX ドキュメント</comment>
+ <comment xml:lang="it">Documento BibTeX</comment>
+ <comment xml:lang="is">BibTeX skjal</comment>
+ <comment xml:lang="id">Dokumen BibTeX</comment>
+ <comment xml:lang="ia">Documento BibTeX</comment>
+ <comment xml:lang="hu">BibTeX dokumentum</comment>
+ <comment xml:lang="hr">BibTeX dokument</comment>
+ <comment xml:lang="he">מסמך BibTeX</comment>
+ <comment xml:lang="gl">documento BibTex</comment>
+ <comment xml:lang="ga">cáipéis BibTeX</comment>
+ <comment xml:lang="fur">document BibTeX</comment>
+ <comment xml:lang="fr">document BibTeX</comment>
+ <comment xml:lang="fo">BibTeX skjal</comment>
+ <comment xml:lang="fi">BibTeX-asiakirja</comment>
+ <comment xml:lang="eu">BibTeX dokumentua</comment>
+ <comment xml:lang="es">documento BibTeX</comment>
+ <comment xml:lang="eo">BibTeX-dokumento</comment>
+ <comment xml:lang="en_GB">BibTeX document</comment>
+ <comment xml:lang="el">Έγγραφο BibTeX</comment>
+ <comment xml:lang="de">BibTeX-Dokument</comment>
+ <comment xml:lang="da">BibTeX-dokument</comment>
+ <comment xml:lang="cs">dokument BibTeX</comment>
+ <comment xml:lang="ca">document BibTeX</comment>
+ <comment xml:lang="bg">Документ — BibTeX</comment>
+ <comment xml:lang="be@latin">Dakument BibTeX</comment>
+ <comment xml:lang="be">дакумент BibTeX</comment>
+ <comment xml:lang="ast">Documentu de BibTeX</comment>
+ <comment xml:lang="ar">مستند BibTeX</comment>
+ <comment xml:lang="af">BibTeX-dokument</comment>
<sub-class-of type="text/plain"/>
<magic>
<match type="string" value="% This file was created with JabRef" offset="0"/>
</magic>
<glob pattern="*.bib"/>
</mime-type>
+ <mime-type type="text/x-blueprint">
+ <comment>Blueprint source code</comment>
+ <comment xml:lang="uk">початковий код синьки</comment>
+ <comment xml:lang="sv">Blueprint-källkod</comment>
+ <comment xml:lang="ru">Исходный код Blueprint</comment>
+ <comment xml:lang="pl">Kod źródłowy Blueprint</comment>
+ <comment xml:lang="it">Codice sorgente Blueprint</comment>
+ <comment xml:lang="gl">Código fonte en Blueprint</comment>
+ <comment xml:lang="es">código fuente en Blueprint</comment>
+ <comment xml:lang="de">Blueprint-Quelltext</comment>
+ <comment xml:lang="be">зыходны код Blueprint</comment>
+ <sub-class-of type="text/plain"/>
+ <glob pattern="*.blp"/>
+ </mime-type>
<mime-type type="text/x-c++hdr">
<comment>C++ header</comment>
- <comment xml:lang="ar">ترويسة سي++</comment>
- <comment xml:lang="be-Latn">Zahałoŭny fajł C++</comment>
- <comment xml:lang="bg">Заглавен файл — C++</comment>
- <comment xml:lang="ca">capçalera en C++</comment>
- <comment xml:lang="cs">hlavičkový soubor C++</comment>
- <comment xml:lang="da">C++-posthoved</comment>
- <comment xml:lang="de">C++-Header</comment>
- <comment xml:lang="el">Κεφαλίδα C++</comment>
- <comment xml:lang="en-GB">C++ header</comment>
- <comment xml:lang="es">cabecera de código fuente en C++</comment>
- <comment xml:lang="eu">C++ goiburua</comment>
- <comment xml:lang="fi">C++-otsake</comment>
- <comment xml:lang="fo">C++ tekshøvd</comment>
- <comment xml:lang="fr">en-tête C++</comment>
- <comment xml:lang="fur">intestazion C++</comment>
- <comment xml:lang="ga">ceanntásc C++</comment>
- <comment xml:lang="gl">cabeceira de código fonte en C++</comment>
- <comment xml:lang="he">כותר C++‎</comment>
- <comment xml:lang="hr">C++ zaglavlje</comment>
- <comment xml:lang="hu">C++ fejléc</comment>
- <comment xml:lang="ia">Capite C++</comment>
- <comment xml:lang="id">Header C++</comment>
- <comment xml:lang="it">Header C++</comment>
- <comment xml:lang="ja">C++ ヘッダー</comment>
- <comment xml:lang="ka">C++-ის თავსართი</comment>
- <comment xml:lang="kk">C++ тақырыптама файлы</comment>
- <comment xml:lang="ko">C++ 헤더</comment>
- <comment xml:lang="lt">C++ antraštė</comment>
- <comment xml:lang="lv">C++ galvene</comment>
- <comment xml:lang="nb">C++-kildekodeheader</comment>
- <comment xml:lang="nl">C++-header</comment>
- <comment xml:lang="nn">C++-kjeldekode-hovud</comment>
- <comment xml:lang="oc">entèsta C++</comment>
- <comment xml:lang="pl">Plik nagłówkowy C++</comment>
- <comment xml:lang="pt">cabeçalho C++</comment>
- <comment xml:lang="pt-BR">Cabeçalho C++</comment>
- <comment xml:lang="ro">Antet C++</comment>
- <comment xml:lang="ru">Заголовочный файл C++</comment>
- <comment xml:lang="sk">Hlavičky jazyka C++</comment>
- <comment xml:lang="sl">Datoteka glave C++</comment>
- <comment xml:lang="sq">Header C++</comment>
- <comment xml:lang="sr">Ц++ заглавље</comment>
- <comment xml:lang="sv">C++-huvud</comment>
- <comment xml:lang="tr">C++ başlığı</comment>
- <comment xml:lang="uk">файл заголовків мовою C++</comment>
+ <comment xml:lang="zh_TW">C++ 標頭檔</comment>
+ <comment xml:lang="zh_CN">C++ 头文件</comment>
<comment xml:lang="vi">Phần đầu mã nguồn C++</comment>
- <comment xml:lang="zh-CN">C++ 头文件</comment>
- <comment xml:lang="zh-TW">C++ 標頭檔</comment>
+ <comment xml:lang="uk">файл заголовків мовою C++</comment>
+ <comment xml:lang="tr">C++ başlığı</comment>
+ <comment xml:lang="sv">C++-huvud</comment>
+ <comment xml:lang="sr">Ц++ заглавље</comment>
+ <comment xml:lang="sq">krye C++</comment>
+ <comment xml:lang="sl">Datoteka glave C++</comment>
+ <comment xml:lang="si">C++ ශීර්ෂකය</comment>
+ <comment xml:lang="sk">Hlavičky jazyka C++</comment>
+ <comment xml:lang="ru">Заголовочный файл C++</comment>
+ <comment xml:lang="ro">Antet C++</comment>
+ <comment xml:lang="pt_BR">Cabeçalho C++</comment>
+ <comment xml:lang="pt">cabeçalho C++</comment>
+ <comment xml:lang="pl">Plik nagłówkowy C++</comment>
+ <comment xml:lang="oc">entèsta C++</comment>
+ <comment xml:lang="nn">C++-kjeldekode-hovud</comment>
+ <comment xml:lang="nl">C++-header</comment>
+ <comment xml:lang="nb">C++-kildekodeheader</comment>
+ <comment xml:lang="lv">C++ galvene</comment>
+ <comment xml:lang="lt">C++ antraštė</comment>
+ <comment xml:lang="ko">C++ 헤더</comment>
+ <comment xml:lang="kk">C++ тақырыптама файлы</comment>
+ <comment xml:lang="ka">C++-ის თავსართი</comment>
+ <comment xml:lang="ja">C++ ヘッダー</comment>
+ <comment xml:lang="it">Header C++</comment>
+ <comment xml:lang="is">C++ haus</comment>
+ <comment xml:lang="id">Header C++</comment>
+ <comment xml:lang="ia">Capite C++</comment>
+ <comment xml:lang="hu">C++ fejléc</comment>
+ <comment xml:lang="hr">C++ zaglavlje</comment>
+ <comment xml:lang="he">כותר C++‎</comment>
+ <comment xml:lang="gl">cabeceira de código fonte en C++</comment>
+ <comment xml:lang="ga">ceanntásc C++</comment>
+ <comment xml:lang="fur">intestazion C++</comment>
+ <comment xml:lang="fr">en-tête C++</comment>
+ <comment xml:lang="fo">C++ tekshøvd</comment>
+ <comment xml:lang="fi">C++-otsake</comment>
+ <comment xml:lang="eu">C++ goiburua</comment>
+ <comment xml:lang="es">cabecera de código fuente en C++</comment>
+ <comment xml:lang="en_GB">C++ header</comment>
+ <comment xml:lang="el">Κεφαλίδα C++</comment>
+ <comment xml:lang="de">C++-Header</comment>
+ <comment xml:lang="da">C++-posthoved</comment>
+ <comment xml:lang="cs">hlavičkový soubor C++</comment>
+ <comment xml:lang="ca">capçalera en C++</comment>
+ <comment xml:lang="bg">Заглавен файл — C++</comment>
+ <comment xml:lang="be@latin">Zahałoŭny fajł C++</comment>
+ <comment xml:lang="be">загаловачны файл C++</comment>
+ <comment xml:lang="ar">ترويسة سي++</comment>
<sub-class-of type="text/x-chdr"/>
<glob pattern="*.hh"/>
<glob pattern="*.hp"/>
@@ -34320,57 +35117,60 @@ command to generate the output files.
</mime-type>
<mime-type type="text/x-c++src">
<comment>C++ source code</comment>
- <comment xml:lang="af">C++-bronkode</comment>
- <comment xml:lang="ar">شفرة مصدر سي++</comment>
- <comment xml:lang="be-Latn">Kryničny kod C++</comment>
- <comment xml:lang="bg">Изходен код — C++</comment>
- <comment xml:lang="ca">codi font en C++</comment>
- <comment xml:lang="cs">zdrojový kód v jazyce C++</comment>
- <comment xml:lang="da">C++-kildekode</comment>
- <comment xml:lang="de">C++-Quelltext</comment>
- <comment xml:lang="el">Πηγαίος κώδικας C++</comment>
- <comment xml:lang="en-GB">C++ source code</comment>
- <comment xml:lang="eo">C++-fontkodo</comment>
- <comment xml:lang="es">código fuente en C++</comment>
- <comment xml:lang="eu">C++ iturburu-kodea</comment>
- <comment xml:lang="fi">C++-lähdekoodi</comment>
- <comment xml:lang="fo">C++ keldukota</comment>
- <comment xml:lang="fr">code source C++</comment>
- <comment xml:lang="fur">codiç sorzint C++</comment>
- <comment xml:lang="ga">cód foinseach C++</comment>
- <comment xml:lang="gl">código fonte de C++</comment>
- <comment xml:lang="he">קוד מקור של C++‎</comment>
- <comment xml:lang="hr">C++ izvorni kôd</comment>
- <comment xml:lang="hu">C++-forráskód</comment>
- <comment xml:lang="ia">Codice-fonte C++</comment>
- <comment xml:lang="id">Kode sumber C++</comment>
- <comment xml:lang="it">Codice sorgente C++</comment>
- <comment xml:lang="ja">C++ ソースコード</comment>
- <comment xml:lang="ka">C++-ის საწყისი კოდი</comment>
- <comment xml:lang="kk">C++ бастапқы коды</comment>
- <comment xml:lang="ko">C++ 소스 코드</comment>
- <comment xml:lang="lt">C++ pradinis kodas</comment>
- <comment xml:lang="lv">C++ pirmkods</comment>
- <comment xml:lang="ms">Kod sumber C++</comment>
- <comment xml:lang="nb">C++-kildekode</comment>
- <comment xml:lang="nl">C++-broncode</comment>
- <comment xml:lang="nn">C++-kjeldekode</comment>
- <comment xml:lang="oc">còde font C++</comment>
- <comment xml:lang="pl">Kod źródłowy C++</comment>
- <comment xml:lang="pt">código origem C++</comment>
- <comment xml:lang="pt-BR">Código-fonte C++</comment>
- <comment xml:lang="ro">Cod sursă C++</comment>
- <comment xml:lang="ru">Исходный код C++</comment>
- <comment xml:lang="sk">Zdrojový kód jazyka C++</comment>
- <comment xml:lang="sl">Datoteka izvorne kode C++</comment>
- <comment xml:lang="sq">Kod burues C++</comment>
- <comment xml:lang="sr">Ц++ изворни ко̂д</comment>
- <comment xml:lang="sv">C++-källkod</comment>
- <comment xml:lang="tr">C++ kaynak kodu</comment>
- <comment xml:lang="uk">вихідний код мовою C++</comment>
+ <comment xml:lang="zh_TW">C++ 源碼</comment>
+ <comment xml:lang="zh_CN">C++ 源代码</comment>
<comment xml:lang="vi">Mã nguồn C++</comment>
- <comment xml:lang="zh-CN">C++ 源代码</comment>
- <comment xml:lang="zh-TW">C++ 源碼</comment>
+ <comment xml:lang="uk">початковий код мовою C++</comment>
+ <comment xml:lang="tr">C++ kaynak kodu</comment>
+ <comment xml:lang="sv">C++-källkod</comment>
+ <comment xml:lang="sr">Ц++ изворни ко̂д</comment>
+ <comment xml:lang="sq">kod burim C++</comment>
+ <comment xml:lang="sl">Datoteka izvorne kode C++</comment>
+ <comment xml:lang="si">C++ මූල කේතය</comment>
+ <comment xml:lang="sk">Zdrojový kód jazyka C++</comment>
+ <comment xml:lang="ru">Исходный код C++</comment>
+ <comment xml:lang="ro">Cod sursă C++</comment>
+ <comment xml:lang="pt_BR">Código-fonte C++</comment>
+ <comment xml:lang="pt">código origem C++</comment>
+ <comment xml:lang="pl">Kod źródłowy C++</comment>
+ <comment xml:lang="oc">còde font C++</comment>
+ <comment xml:lang="nn">C++-kjeldekode</comment>
+ <comment xml:lang="nl">C++-broncode</comment>
+ <comment xml:lang="nb">C++-kildekode</comment>
+ <comment xml:lang="ms">Kod sumber C++</comment>
+ <comment xml:lang="lv">C++ pirmkods</comment>
+ <comment xml:lang="lt">C++ pradinis kodas</comment>
+ <comment xml:lang="ko">C++ 소스 코드</comment>
+ <comment xml:lang="kk">C++ бастапқы коды</comment>
+ <comment xml:lang="ka">C++-ის საწყისი კოდი</comment>
+ <comment xml:lang="ja">C++ ソースコード</comment>
+ <comment xml:lang="it">Codice sorgente C++</comment>
+ <comment xml:lang="is">C++ frumkóði</comment>
+ <comment xml:lang="id">Kode sumber C++</comment>
+ <comment xml:lang="ia">Codice-fonte C++</comment>
+ <comment xml:lang="hu">C++-forráskód</comment>
+ <comment xml:lang="hr">C++ izvorni kôd</comment>
+ <comment xml:lang="he">קוד מקור של C++‎</comment>
+ <comment xml:lang="gl">código fonte de C++</comment>
+ <comment xml:lang="ga">cód foinseach C++</comment>
+ <comment xml:lang="fur">codiç sorzint C++</comment>
+ <comment xml:lang="fr">code source C++</comment>
+ <comment xml:lang="fo">C++ keldukota</comment>
+ <comment xml:lang="fi">C++-lähdekoodi</comment>
+ <comment xml:lang="eu">C++ iturburu-kodea</comment>
+ <comment xml:lang="es">código fuente en C++</comment>
+ <comment xml:lang="eo">C++-fontkodo</comment>
+ <comment xml:lang="en_GB">C++ source code</comment>
+ <comment xml:lang="el">Πηγαίος κώδικας C++</comment>
+ <comment xml:lang="de">C++-Quelltext</comment>
+ <comment xml:lang="da">C++-kildekode</comment>
+ <comment xml:lang="cs">zdrojový kód v jazyce C++</comment>
+ <comment xml:lang="ca">codi font en C++</comment>
+ <comment xml:lang="bg">Изходен код — C++</comment>
+ <comment xml:lang="be@latin">Kryničny kod C++</comment>
+ <comment xml:lang="be">зыходны код C++</comment>
+ <comment xml:lang="ar">شفرة مصدر سي++</comment>
+ <comment xml:lang="af">C++-bronkode</comment>
<sub-class-of type="text/x-csrc"/>
<glob pattern="*.cpp"/>
<glob pattern="*.cxx"/>
@@ -34380,185 +35180,208 @@ command to generate the output files.
</mime-type>
<mime-type type="text/x-changelog">
<comment>ChangeLog document</comment>
- <comment xml:lang="af">ChangeLog-dokument</comment>
- <comment xml:lang="ar">مستند ChangeLog</comment>
- <comment xml:lang="ast">Documentu de rexistru de cambeos</comment>
- <comment xml:lang="be-Latn">Dakument zafiksavanych źmienaŭ ChangeLog</comment>
- <comment xml:lang="bg">Дневник за промени — ChangeLog</comment>
- <comment xml:lang="ca">document de registre de canvis</comment>
- <comment xml:lang="cs">dokument ChangeLog</comment>
- <comment xml:lang="da">ChangeLot-dokument</comment>
- <comment xml:lang="de">Änderungsprotokoll-Dokument</comment>
- <comment xml:lang="el">Έγγραφο ChangeLog</comment>
- <comment xml:lang="en-GB">ChangeLog document</comment>
- <comment xml:lang="es">documento de registro de cambios</comment>
- <comment xml:lang="eu">ChangeLog dokumentua</comment>
- <comment xml:lang="fi">Muutoslokiasiakirja</comment>
- <comment xml:lang="fo">ChangeLog skjal</comment>
- <comment xml:lang="fr">document ChangeLog</comment>
- <comment xml:lang="fur">document ChangeLog</comment>
- <comment xml:lang="ga">cáipéis ChangeLog</comment>
- <comment xml:lang="gl">documento Changelog</comment>
- <comment xml:lang="he">מסמך של ChangeLog</comment>
- <comment xml:lang="hr">Dokument zapisa promjena</comment>
- <comment xml:lang="hu">ChangeLog dokumentum</comment>
- <comment xml:lang="ia">Lista de cambiamentos</comment>
- <comment xml:lang="id">Dokumen ChangeLog</comment>
- <comment xml:lang="it">Documento ChangeLog</comment>
- <comment xml:lang="ja">ChangeLog ドキュメント</comment>
- <comment xml:lang="ka">ChangeLog დოკუმენტი</comment>
- <comment xml:lang="kk">ChangeLog құжаты</comment>
- <comment xml:lang="ko">ChangeLog 문서</comment>
- <comment xml:lang="lt">ChangeLog dokumentas</comment>
- <comment xml:lang="lv">ChangeLog dokuments</comment>
- <comment xml:lang="nb">ChangeLog-dokument</comment>
- <comment xml:lang="nl">ChangeLog-document</comment>
- <comment xml:lang="nn">ChangeLog-dokument</comment>
- <comment xml:lang="oc">document ChangeLog</comment>
- <comment xml:lang="pl">Dokument zmian (ChangeLog)</comment>
- <comment xml:lang="pt">documento ChangeLog</comment>
- <comment xml:lang="pt-BR">Documento ChangeLog</comment>
- <comment xml:lang="ro">Document ChangeLog</comment>
- <comment xml:lang="ru">Протокол изменений</comment>
- <comment xml:lang="sk">Dokument ChangeLog</comment>
- <comment xml:lang="sl">Dokument ChangeLog</comment>
- <comment xml:lang="sq">Dokument ChangeLog</comment>
- <comment xml:lang="sr">документ дневника измена</comment>
- <comment xml:lang="sv">Ändringsloggsdokument</comment>
- <comment xml:lang="tr">ChangeLog belgesi</comment>
- <comment xml:lang="uk">документ ChangeLog</comment>
+ <comment xml:lang="zh_TW">ChangeLog 文件</comment>
+ <comment xml:lang="zh_CN">变更日志文档</comment>
<comment xml:lang="vi">Tài liệu ChangeLog (ghi lưu thay đổi)</comment>
- <comment xml:lang="zh-CN">变更日志文档</comment>
- <comment xml:lang="zh-TW">ChangeLog 文件</comment>
+ <comment xml:lang="uk">документ ChangeLog</comment>
+ <comment xml:lang="tr">ChangeLog belgesi</comment>
+ <comment xml:lang="sv">Ändringsloggsdokument</comment>
+ <comment xml:lang="sr">документ дневника измена</comment>
+ <comment xml:lang="sq">dokument regjistri ndryshimesh</comment>
+ <comment xml:lang="sl">Dokument ChangeLog</comment>
+ <comment xml:lang="si">ChangeLog ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument ChangeLog</comment>
+ <comment xml:lang="ru">Протокол изменений</comment>
+ <comment xml:lang="ro">Document ChangeLog</comment>
+ <comment xml:lang="pt_BR">Documento ChangeLog</comment>
+ <comment xml:lang="pt">documento ChangeLog</comment>
+ <comment xml:lang="pl">Dokument zmian (ChangeLog)</comment>
+ <comment xml:lang="oc">document ChangeLog</comment>
+ <comment xml:lang="nn">ChangeLog-dokument</comment>
+ <comment xml:lang="nl">ChangeLog-document</comment>
+ <comment xml:lang="nb">ChangeLog-dokument</comment>
+ <comment xml:lang="lv">ChangeLog dokuments</comment>
+ <comment xml:lang="lt">ChangeLog dokumentas</comment>
+ <comment xml:lang="ko">ChangeLog 문서</comment>
+ <comment xml:lang="kk">ChangeLog құжаты</comment>
+ <comment xml:lang="ka">ChangeLog დოკუმენტი</comment>
+ <comment xml:lang="ja">ChangeLog ドキュメント</comment>
+ <comment xml:lang="it">Documento ChangeLog</comment>
+ <comment xml:lang="is">ChangeLog skjal</comment>
+ <comment xml:lang="id">Dokumen ChangeLog</comment>
+ <comment xml:lang="ia">Lista de cambiamentos</comment>
+ <comment xml:lang="hu">ChangeLog dokumentum</comment>
+ <comment xml:lang="hr">Dokument zapisa promjena</comment>
+ <comment xml:lang="he">מסמך של ChangeLog</comment>
+ <comment xml:lang="gl">documento Changelog</comment>
+ <comment xml:lang="ga">cáipéis ChangeLog</comment>
+ <comment xml:lang="fur">document ChangeLog</comment>
+ <comment xml:lang="fr">document ChangeLog</comment>
+ <comment xml:lang="fo">ChangeLog skjal</comment>
+ <comment xml:lang="fi">Muutoslokiasiakirja</comment>
+ <comment xml:lang="eu">ChangeLog dokumentua</comment>
+ <comment xml:lang="es">documento de registro de cambios</comment>
+ <comment xml:lang="en_GB">ChangeLog document</comment>
+ <comment xml:lang="el">Έγγραφο ChangeLog</comment>
+ <comment xml:lang="de">Änderungsprotokoll-Dokument</comment>
+ <comment xml:lang="da">ChangeLot-dokument</comment>
+ <comment xml:lang="cs">dokument ChangeLog</comment>
+ <comment xml:lang="ca">document de registre de canvis</comment>
+ <comment xml:lang="bg">Дневник за промени — ChangeLog</comment>
+ <comment xml:lang="be@latin">Dakument zafiksavanych źmienaŭ ChangeLog</comment>
+ <comment xml:lang="be">дакумент zafiksavanych źmienaŭ ChangeLog</comment>
+ <comment xml:lang="ast">Documentu de rexistru de cambeos</comment>
+ <comment xml:lang="ar">مستند ChangeLog</comment>
+ <comment xml:lang="af">ChangeLog-dokument</comment>
<sub-class-of type="text/plain"/>
<glob pattern="ChangeLog"/>
</mime-type>
<mime-type type="text/x-chdr">
<comment>C header</comment>
- <comment xml:lang="ar">ترويسة C</comment>
- <comment xml:lang="be-Latn">Zahałoŭny fajł C</comment>
- <comment xml:lang="bg">Заглавен файл — C</comment>
- <comment xml:lang="ca">capçalera en C</comment>
- <comment xml:lang="cs">hlavičkový soubor C</comment>
- <comment xml:lang="da">C-posthoved</comment>
- <comment xml:lang="de">C-Header</comment>
- <comment xml:lang="el">Κεφαλίδα C</comment>
- <comment xml:lang="en-GB">C header</comment>
- <comment xml:lang="es">cabecera de código fuente en C</comment>
- <comment xml:lang="eu">C goiburua</comment>
- <comment xml:lang="fi">C-otsake</comment>
- <comment xml:lang="fo">C tekshøvd</comment>
- <comment xml:lang="fr">en-tête C</comment>
- <comment xml:lang="fur">intestazion C</comment>
- <comment xml:lang="ga">ceanntásc C</comment>
- <comment xml:lang="gl">cabeceira de códifo fonte de C</comment>
- <comment xml:lang="he">כותר C</comment>
- <comment xml:lang="hr">C zaglavlje</comment>
- <comment xml:lang="hu">C fejléc</comment>
- <comment xml:lang="ia">Capite C</comment>
- <comment xml:lang="id">Header C</comment>
- <comment xml:lang="it">Header C</comment>
- <comment xml:lang="ja">C ヘッダー</comment>
- <comment xml:lang="ka">C-ის თავსართი</comment>
- <comment xml:lang="kk">C тақырыптама файлы</comment>
- <comment xml:lang="ko">C 헤더</comment>
- <comment xml:lang="lt">C antraštė</comment>
- <comment xml:lang="lv">C galvene</comment>
- <comment xml:lang="nb">C-kildekodeheader</comment>
- <comment xml:lang="nl">C-header</comment>
- <comment xml:lang="nn">C-kjeldekode-hovud</comment>
- <comment xml:lang="oc">entèsta C</comment>
- <comment xml:lang="pl">Plik nagłówkowy C</comment>
- <comment xml:lang="pt">cabeçalho C</comment>
- <comment xml:lang="pt-BR">Cabeçalho C</comment>
- <comment xml:lang="ro">Antet C</comment>
- <comment xml:lang="ru">Заголовочный файл C</comment>
- <comment xml:lang="sk">Hlavičky jazyka C</comment>
- <comment xml:lang="sl">Datoteka glave C</comment>
- <comment xml:lang="sq">Header C</comment>
- <comment xml:lang="sr">Ц заглавље</comment>
- <comment xml:lang="sv">C-huvud</comment>
- <comment xml:lang="tr">C başlığı</comment>
- <comment xml:lang="uk">файл заголовків мовою C</comment>
+ <comment xml:lang="zh_TW">C 標頭檔</comment>
+ <comment xml:lang="zh_CN">C 程序头文件</comment>
<comment xml:lang="vi">Phần đầu mã nguồn C</comment>
- <comment xml:lang="zh-CN">C 程序头文件</comment>
- <comment xml:lang="zh-TW">C 標頭檔</comment>
+ <comment xml:lang="uk">файл заголовків мовою C</comment>
+ <comment xml:lang="tr">C başlığı</comment>
+ <comment xml:lang="sv">C-huvud</comment>
+ <comment xml:lang="sr">Ц заглавље</comment>
+ <comment xml:lang="sq">krye C</comment>
+ <comment xml:lang="sl">Datoteka glave C</comment>
+ <comment xml:lang="si">C ශීර්ෂකය</comment>
+ <comment xml:lang="sk">Hlavičky jazyka C</comment>
+ <comment xml:lang="ru">Заголовочный файл C</comment>
+ <comment xml:lang="ro">Antet C</comment>
+ <comment xml:lang="pt_BR">Cabeçalho C</comment>
+ <comment xml:lang="pt">cabeçalho C</comment>
+ <comment xml:lang="pl">Plik nagłówkowy C</comment>
+ <comment xml:lang="oc">entèsta C</comment>
+ <comment xml:lang="nn">C-kjeldekode-hovud</comment>
+ <comment xml:lang="nl">C-header</comment>
+ <comment xml:lang="nb">C-kildekodeheader</comment>
+ <comment xml:lang="lv">C galvene</comment>
+ <comment xml:lang="lt">C antraštė</comment>
+ <comment xml:lang="ko">C 헤더</comment>
+ <comment xml:lang="kk">C тақырыптама файлы</comment>
+ <comment xml:lang="ka">C-ის თავსართი</comment>
+ <comment xml:lang="ja">C ヘッダー</comment>
+ <comment xml:lang="it">Header C</comment>
+ <comment xml:lang="is">C haus</comment>
+ <comment xml:lang="id">Header C</comment>
+ <comment xml:lang="ia">Capite C</comment>
+ <comment xml:lang="hu">C fejléc</comment>
+ <comment xml:lang="hr">C zaglavlje</comment>
+ <comment xml:lang="he">כותר C</comment>
+ <comment xml:lang="gl">cabeceira de códifo fonte de C</comment>
+ <comment xml:lang="ga">ceanntásc C</comment>
+ <comment xml:lang="fur">intestazion C</comment>
+ <comment xml:lang="fr">en-tête C</comment>
+ <comment xml:lang="fo">C tekshøvd</comment>
+ <comment xml:lang="fi">C-otsake</comment>
+ <comment xml:lang="eu">C goiburua</comment>
+ <comment xml:lang="es">cabecera de código fuente en C</comment>
+ <comment xml:lang="en_GB">C header</comment>
+ <comment xml:lang="el">Κεφαλίδα C</comment>
+ <comment xml:lang="de">C-Header</comment>
+ <comment xml:lang="da">C-posthoved</comment>
+ <comment xml:lang="cs">hlavičkový soubor C</comment>
+ <comment xml:lang="ca">capçalera en C</comment>
+ <comment xml:lang="bg">Заглавен файл — C</comment>
+ <comment xml:lang="be@latin">Zahałoŭny fajł C</comment>
+ <comment xml:lang="be">загаловачны файл C</comment>
+ <comment xml:lang="ar">ترويسة C</comment>
<sub-class-of type="text/x-csrc"/>
<glob pattern="*.h"/>
</mime-type>
<mime-type type="text/x-cmake">
<comment>CMake source code</comment>
- <comment xml:lang="af">CMake-bronkode</comment>
- <comment xml:lang="ar">شفرة مصدر CMake</comment>
- <comment xml:lang="be-Latn">Kryničny kod CMake</comment>
- <comment xml:lang="bg">Изходен код — CMake</comment>
- <comment xml:lang="ca">codi font en CMake</comment>
- <comment xml:lang="cs">zdrojový kód CMake</comment>
- <comment xml:lang="da">CMake-kildekode</comment>
- <comment xml:lang="de">CMake-Quelltext</comment>
- <comment xml:lang="el">Πηγαίος κώδικας CMake</comment>
- <comment xml:lang="en-GB">CMake source code</comment>
- <comment xml:lang="eo">CMake-fontkodo</comment>
- <comment xml:lang="es">código fuente en CMake</comment>
- <comment xml:lang="eu">CMake iturburu-kodea</comment>
- <comment xml:lang="fi">CMake-lähdekoodi</comment>
- <comment xml:lang="fo">CMake keldukota</comment>
- <comment xml:lang="fr">code source CMake</comment>
- <comment xml:lang="fur">codiç sorzint CMake</comment>
- <comment xml:lang="ga">cód foinseach CMake</comment>
- <comment xml:lang="gl">código fonte de CMake</comment>
- <comment xml:lang="he">קוד מקור של CMake</comment>
- <comment xml:lang="hr">CMake izvorni kôd</comment>
- <comment xml:lang="hu">CMake-forráskód</comment>
- <comment xml:lang="ia">Codice-fonte CMake</comment>
- <comment xml:lang="id">Kode sumber CMake</comment>
- <comment xml:lang="it">Codice sorgente CMake</comment>
- <comment xml:lang="ja">CMake ソースコード</comment>
- <comment xml:lang="ka">CMake-ის საწყისი კოდი</comment>
- <comment xml:lang="kk">CMake бастапқы коды</comment>
- <comment xml:lang="ko">CMake 소스 코드</comment>
- <comment xml:lang="lt">CMake pirminis tekstas</comment>
- <comment xml:lang="lv">CMake pirmkods</comment>
- <comment xml:lang="nb">CMake-kildekode</comment>
- <comment xml:lang="nl">CMake-broncode</comment>
- <comment xml:lang="nn">CMake-kjeldekode</comment>
- <comment xml:lang="oc">còde font CMake</comment>
- <comment xml:lang="pl">Kod źródłowy CMake</comment>
- <comment xml:lang="pt">código origem CMake</comment>
- <comment xml:lang="pt-BR">Código-fonte CMake</comment>
- <comment xml:lang="ro">Cod sursă CMake</comment>
- <comment xml:lang="ru">Исходный код CMake</comment>
- <comment xml:lang="sk">Zdrojový kód CMake</comment>
- <comment xml:lang="sl">Datoteka izvorne kode CMake</comment>
- <comment xml:lang="sq">Kod burues CMake</comment>
- <comment xml:lang="sr">Ц Мејк изворни ко̂д</comment>
- <comment xml:lang="sv">CMake-källkod</comment>
- <comment xml:lang="tr">CMake kaynak kodu</comment>
- <comment xml:lang="uk">вихідний код CMake</comment>
+ <comment xml:lang="zh_TW">CMake 源碼</comment>
+ <comment xml:lang="zh_CN">CMake 源代码</comment>
<comment xml:lang="vi">Mã nguồn CMake</comment>
- <comment xml:lang="zh-CN">CMake 源代码</comment>
- <comment xml:lang="zh-TW">CMake 源碼</comment>
+ <comment xml:lang="uk">початковий код мовою CMake</comment>
+ <comment xml:lang="tr">CMake kaynak kodu</comment>
+ <comment xml:lang="sv">CMake-källkod</comment>
+ <comment xml:lang="sr">Ц Мејк изворни ко̂д</comment>
+ <comment xml:lang="sq">kod burim CMake</comment>
+ <comment xml:lang="sl">Datoteka izvorne kode CMake</comment>
+ <comment xml:lang="si">CMake මූල කේතය</comment>
+ <comment xml:lang="sk">Zdrojový kód CMake</comment>
+ <comment xml:lang="ru">Исходный код CMake</comment>
+ <comment xml:lang="ro">Cod sursă CMake</comment>
+ <comment xml:lang="pt_BR">Código-fonte CMake</comment>
+ <comment xml:lang="pt">código origem CMake</comment>
+ <comment xml:lang="pl">Kod źródłowy CMake</comment>
+ <comment xml:lang="oc">còde font CMake</comment>
+ <comment xml:lang="nn">CMake-kjeldekode</comment>
+ <comment xml:lang="nl">CMake-broncode</comment>
+ <comment xml:lang="nb">CMake-kildekode</comment>
+ <comment xml:lang="lv">CMake pirmkods</comment>
+ <comment xml:lang="lt">CMake pirminis tekstas</comment>
+ <comment xml:lang="ko">CMake 소스 코드</comment>
+ <comment xml:lang="kk">CMake бастапқы коды</comment>
+ <comment xml:lang="ka">CMake-ის საწყისი კოდი</comment>
+ <comment xml:lang="ja">CMake ソースコード</comment>
+ <comment xml:lang="it">Codice sorgente CMake</comment>
+ <comment xml:lang="is">CMake frumkóði</comment>
+ <comment xml:lang="id">Kode sumber CMake</comment>
+ <comment xml:lang="ia">Codice-fonte CMake</comment>
+ <comment xml:lang="hu">CMake-forráskód</comment>
+ <comment xml:lang="hr">CMake izvorni kôd</comment>
+ <comment xml:lang="he">קוד מקור של CMake</comment>
+ <comment xml:lang="gl">código fonte de CMake</comment>
+ <comment xml:lang="ga">cód foinseach CMake</comment>
+ <comment xml:lang="fur">codiç sorzint CMake</comment>
+ <comment xml:lang="fr">code source CMake</comment>
+ <comment xml:lang="fo">CMake keldukota</comment>
+ <comment xml:lang="fi">CMake-lähdekoodi</comment>
+ <comment xml:lang="eu">CMake iturburu-kodea</comment>
+ <comment xml:lang="es">código fuente en CMake</comment>
+ <comment xml:lang="eo">CMake-fontkodo</comment>
+ <comment xml:lang="en_GB">CMake source code</comment>
+ <comment xml:lang="el">Πηγαίος κώδικας CMake</comment>
+ <comment xml:lang="de">CMake-Quelltext</comment>
+ <comment xml:lang="da">CMake-kildekode</comment>
+ <comment xml:lang="cs">zdrojový kód CMake</comment>
+ <comment xml:lang="ca">codi font en CMake</comment>
+ <comment xml:lang="bg">Изходен код — CMake</comment>
+ <comment xml:lang="be@latin">Kryničny kod CMake</comment>
+ <comment xml:lang="be">зыходны код CMake</comment>
+ <comment xml:lang="ar">شفرة مصدر CMake</comment>
+ <comment xml:lang="af">CMake-bronkode</comment>
<glob pattern="*.cmake"/>
<glob pattern="CMakeLists.txt"/>
<sub-class-of type="text/plain"/>
</mime-type>
<mime-type type="text/x-common-lisp">
<comment>Common Lisp source code</comment>
- <comment xml:lang="ca">codi font en Common Lisp</comment>
- <comment xml:lang="da">Common Lisp-kildekode</comment>
- <comment xml:lang="de">Common-Lisp-Quelltext</comment>
- <comment xml:lang="en-GB">Common Lisp source code</comment>
- <comment xml:lang="es">código fuente en Common Lisp</comment>
- <comment xml:lang="fi">Yleinen Lisp-lähdekoodi</comment>
- <comment xml:lang="fr">code source Common Lisp</comment>
- <comment xml:lang="hr">Common Lisp izvorni kôd</comment>
- <comment xml:lang="it">Codice sorgente Common Lisp</comment>
- <comment xml:lang="pl">Kod źródłowy Common Lisp</comment>
- <comment xml:lang="pt-BR">Código-fonte Common Lisp</comment>
+ <comment xml:lang="zh_TW">Common Lisp 原始碼</comment>
+ <comment xml:lang="zh_CN">Common Lisp 源代码</comment>
+ <comment xml:lang="uk">початковий код мовою Common Lisp</comment>
+ <comment xml:lang="tr">Common Lisp kaynak kodu</comment>
<comment xml:lang="sv">Common Lisp-källkod</comment>
- <comment xml:lang="uk">вихідний код мовою Common Lisp</comment>
- <comment xml:lang="zh-CN">Common Lisp 源代码</comment>
- <comment xml:lang="zh-TW">Common Lisp 源碼</comment>
+ <comment xml:lang="si">පොදු Lisp මූලාශ්‍ර කේතය</comment>
+ <comment xml:lang="ru">Исходный код Common Lisp</comment>
+ <comment xml:lang="pt_BR">Código-fonte Common Lisp</comment>
+ <comment xml:lang="pl">Kod źródłowy Common Lisp</comment>
+ <comment xml:lang="nl">Common Lisp-broncode</comment>
+ <comment xml:lang="ko">Common Lisp 소스 코드</comment>
+ <comment xml:lang="kk">Common Lisp бастапқы коды</comment>
+ <comment xml:lang="ja">Common Lisp ソースコード</comment>
+ <comment xml:lang="it">Codice sorgente Common Lisp</comment>
+ <comment xml:lang="is">Sameiginlegur Lisp frumkóði</comment>
+ <comment xml:lang="id">kode sumber Common Lisp</comment>
+ <comment xml:lang="hu">Common Lisp forráskód</comment>
+ <comment xml:lang="hr">Common Lisp izvorni kôd</comment>
+ <comment xml:lang="he">קוד מקור של Common Lisp</comment>
+ <comment xml:lang="gl">Código fonte en Common Lisp</comment>
+ <comment xml:lang="fr">code source Common Lisp</comment>
+ <comment xml:lang="fi">Common Lisp -lähdekoodi</comment>
+ <comment xml:lang="es">código fuente en Common Lisp</comment>
+ <comment xml:lang="en_GB">Common Lisp source code</comment>
+ <comment xml:lang="de">Common-Lisp-Quelltext</comment>
+ <comment xml:lang="da">Common Lisp-kildekode</comment>
+ <comment xml:lang="ca">codi font en Common Lisp</comment>
+ <comment xml:lang="be">зыходны код Common Lisp</comment>
+ <comment xml:lang="ar">شفرة مصدر Common Lisp</comment>
<sub-class-of type="text/plain"/>
<glob pattern="*.asd"/>
<glob pattern="*.fasl"/>
@@ -34567,57 +35390,60 @@ command to generate the output files.
</mime-type>
<mime-type type="text/csv">
<comment>CSV document</comment>
- <comment xml:lang="af">CSV-dokument</comment>
- <comment xml:lang="ar">مستند CSV</comment>
- <comment xml:lang="ast">Documentu CVS</comment>
- <comment xml:lang="be-Latn">Dakument CSV</comment>
- <comment xml:lang="bg">Документ — CSV</comment>
- <comment xml:lang="ca">document CSV</comment>
- <comment xml:lang="cs">dokument CSV</comment>
- <comment xml:lang="da">CSV-dokument</comment>
- <comment xml:lang="de">CSV-Dokument</comment>
- <comment xml:lang="el">Έγγραφο CSV</comment>
- <comment xml:lang="en-GB">CSV document</comment>
- <comment xml:lang="eo">CSV-dokumento</comment>
- <comment xml:lang="es">documento CSV</comment>
- <comment xml:lang="eu">CSV dokumentua</comment>
- <comment xml:lang="fi">CSV-asiakirja</comment>
- <comment xml:lang="fo">CSV skjal</comment>
- <comment xml:lang="fr">document CSV</comment>
- <comment xml:lang="fur">document CSV</comment>
- <comment xml:lang="ga">cáipéis CSV</comment>
- <comment xml:lang="gl">documento CSV</comment>
- <comment xml:lang="he">מסמך CSV</comment>
- <comment xml:lang="hr">CSV dokument</comment>
- <comment xml:lang="hu">CSV dokumentum</comment>
- <comment xml:lang="ia">Documento CSV</comment>
- <comment xml:lang="id">Dokumen CSV</comment>
- <comment xml:lang="it">Documento CSV</comment>
- <comment xml:lang="ja">CSV ドキュメント</comment>
- <comment xml:lang="ka">CSV დოკუმენტი</comment>
- <comment xml:lang="kk">CSV құжаты</comment>
- <comment xml:lang="ko">CSV 문서</comment>
- <comment xml:lang="lt">CSV dokumentas</comment>
- <comment xml:lang="lv">CSV dokuments</comment>
- <comment xml:lang="nb">CSV-dokument</comment>
- <comment xml:lang="nl">CSV-document</comment>
- <comment xml:lang="nn">CSV-dokument</comment>
- <comment xml:lang="oc">document CSV</comment>
- <comment xml:lang="pl">Dokument CSV</comment>
- <comment xml:lang="pt">documento CSV</comment>
- <comment xml:lang="pt-BR">Documento CSV</comment>
- <comment xml:lang="ro">Document CSV</comment>
- <comment xml:lang="ru">Документ CSV</comment>
- <comment xml:lang="sk">Dokument CSV</comment>
- <comment xml:lang="sl">Dokument CSV</comment>
- <comment xml:lang="sq">Dokument CSV</comment>
- <comment xml:lang="sr">ЦСВ документ</comment>
- <comment xml:lang="sv">CSV-dokument</comment>
- <comment xml:lang="tr">CSV belgesi</comment>
- <comment xml:lang="uk">документ CSV</comment>
+ <comment xml:lang="zh_TW">CSV 文件</comment>
+ <comment xml:lang="zh_CN">CSV 文档</comment>
<comment xml:lang="vi">Tài liệu CSV</comment>
- <comment xml:lang="zh-CN">CSV 文档</comment>
- <comment xml:lang="zh-TW">CSV 文件</comment>
+ <comment xml:lang="uk">документ CSV</comment>
+ <comment xml:lang="tr">CSV belgesi</comment>
+ <comment xml:lang="sv">CSV-dokument</comment>
+ <comment xml:lang="sr">ЦСВ документ</comment>
+ <comment xml:lang="sq">dokument CSV</comment>
+ <comment xml:lang="sl">Dokument CSV</comment>
+ <comment xml:lang="si">CSV ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument CSV</comment>
+ <comment xml:lang="ru">Документ CSV</comment>
+ <comment xml:lang="ro">Document CSV</comment>
+ <comment xml:lang="pt_BR">Documento CSV</comment>
+ <comment xml:lang="pt">documento CSV</comment>
+ <comment xml:lang="pl">Dokument CSV</comment>
+ <comment xml:lang="oc">document CSV</comment>
+ <comment xml:lang="nn">CSV-dokument</comment>
+ <comment xml:lang="nl">CSV-document</comment>
+ <comment xml:lang="nb">CSV-dokument</comment>
+ <comment xml:lang="lv">CSV dokuments</comment>
+ <comment xml:lang="lt">CSV dokumentas</comment>
+ <comment xml:lang="ko">CSV 문서</comment>
+ <comment xml:lang="kk">CSV құжаты</comment>
+ <comment xml:lang="ka">CSV დოკუმენტი</comment>
+ <comment xml:lang="ja">CSV ドキュメント</comment>
+ <comment xml:lang="it">Documento CSV</comment>
+ <comment xml:lang="is">CSV skjal</comment>
+ <comment xml:lang="id">Dokumen CSV</comment>
+ <comment xml:lang="ia">Documento CSV</comment>
+ <comment xml:lang="hu">CSV dokumentum</comment>
+ <comment xml:lang="hr">CSV dokument</comment>
+ <comment xml:lang="he">מסמך CSV</comment>
+ <comment xml:lang="gl">documento CSV</comment>
+ <comment xml:lang="ga">cáipéis CSV</comment>
+ <comment xml:lang="fur">document CSV</comment>
+ <comment xml:lang="fr">document CSV</comment>
+ <comment xml:lang="fo">CSV skjal</comment>
+ <comment xml:lang="fi">CSV-asiakirja</comment>
+ <comment xml:lang="eu">CSV dokumentua</comment>
+ <comment xml:lang="es">documento CSV</comment>
+ <comment xml:lang="eo">CSV-dokumento</comment>
+ <comment xml:lang="en_GB">CSV document</comment>
+ <comment xml:lang="el">Έγγραφο CSV</comment>
+ <comment xml:lang="de">CSV-Dokument</comment>
+ <comment xml:lang="da">CSV-dokument</comment>
+ <comment xml:lang="cs">dokument CSV</comment>
+ <comment xml:lang="ca">document CSV</comment>
+ <comment xml:lang="bg">Документ — CSV</comment>
+ <comment xml:lang="be@latin">Dakument CSV</comment>
+ <comment xml:lang="be">дакумент CSV</comment>
+ <comment xml:lang="ast">Documentu CVS</comment>
+ <comment xml:lang="ar">مستند CSV</comment>
+ <comment xml:lang="af">CSV-dokument</comment>
<acronym>CSV</acronym>
<expanded-acronym>Comma Separated Values</expanded-acronym>
<alias type="text/x-comma-separated-values"/>
@@ -34627,206 +35453,139 @@ command to generate the output files.
</mime-type>
<mime-type type="text/csv-schema">
<comment>CSV Schema document</comment>
- <comment xml:lang="af">CSV Schema-dokument</comment>
- <comment xml:lang="ast">Documentu d'esquema CSV</comment>
- <comment xml:lang="bg">Документ — схема на CSV</comment>
- <comment xml:lang="ca">document Schema de CSV</comment>
- <comment xml:lang="cs">dokument schématu CSV</comment>
- <comment xml:lang="da">CSV Schema-dokument</comment>
- <comment xml:lang="de">CSV-Schemadokument</comment>
- <comment xml:lang="en-GB">CSV Schema document</comment>
- <comment xml:lang="es">documento esquemático CSV</comment>
- <comment xml:lang="eu">CSV Schema dokumentua</comment>
- <comment xml:lang="fi">CSV Schema asiakirja</comment>
- <comment xml:lang="fr">document schéma CSV</comment>
- <comment xml:lang="fur">document scheme CSV</comment>
- <comment xml:lang="ga">cáipéis scéimre CSV</comment>
- <comment xml:lang="he">מסמך פריסת CSV</comment>
- <comment xml:lang="hr">CSV Shema dokument</comment>
- <comment xml:lang="hu">CSV sémadokumentum</comment>
- <comment xml:lang="ia">Documento CSV Schema</comment>
- <comment xml:lang="id">Dokumen Skema CSV</comment>
- <comment xml:lang="it">Documento schema CSV</comment>
- <comment xml:lang="kk">CSV сұлба құжаты</comment>
- <comment xml:lang="ko">CSV 스키마 문서</comment>
- <comment xml:lang="pl">Dokument schematu CSV</comment>
- <comment xml:lang="pt">documento CSV Schema</comment>
- <comment xml:lang="pt-BR">Documento CSV Schema</comment>
- <comment xml:lang="ru">Документ CSV Schema</comment>
- <comment xml:lang="sk">Dokument schémy CSV</comment>
- <comment xml:lang="sl">Dokument CSV Schema</comment>
- <comment xml:lang="sr">документ ЦСВ шеме</comment>
- <comment xml:lang="sv">CSV Schema-dokument</comment>
- <comment xml:lang="tr">CSV Şeması belgesi</comment>
+ <comment xml:lang="zh_TW">CSV Schema 文件</comment>
+ <comment xml:lang="zh_CN">CSV 架构文档</comment>
<comment xml:lang="uk">документ Schema у форматі CSV</comment>
- <comment xml:lang="zh-CN">CSV 架构文档</comment>
- <comment xml:lang="zh-TW">CSV Schema 文件</comment>
+ <comment xml:lang="tr">CSV Şeması belgesi</comment>
+ <comment xml:lang="sv">CSV Schema-dokument</comment>
+ <comment xml:lang="sr">документ ЦСВ шеме</comment>
+ <comment xml:lang="sq">dokument CSV Schema</comment>
+ <comment xml:lang="sl">Dokument CSV Schema</comment>
+ <comment xml:lang="si">CSV ක්‍රම ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument schémy CSV</comment>
+ <comment xml:lang="ru">Документ CSV Schema</comment>
+ <comment xml:lang="pt_BR">Documento CSV Schema</comment>
+ <comment xml:lang="pt">documento CSV Schema</comment>
+ <comment xml:lang="pl">Dokument schematu CSV</comment>
+ <comment xml:lang="nl">CSV-schemadocument</comment>
+ <comment xml:lang="ko">CSV 스키마 문서</comment>
+ <comment xml:lang="kk">CSV сұлба құжаты</comment>
+ <comment xml:lang="ja">CSV Schema ドキュメント</comment>
+ <comment xml:lang="it">Documento schema CSV</comment>
+ <comment xml:lang="is">CSV skemaskjal</comment>
+ <comment xml:lang="id">Dokumen Skema CSV</comment>
+ <comment xml:lang="ia">Documento CSV Schema</comment>
+ <comment xml:lang="hu">CSV sémadokumentum</comment>
+ <comment xml:lang="hr">CSV Shema dokument</comment>
+ <comment xml:lang="he">מסמך פריסת CSV</comment>
+ <comment xml:lang="ga">cáipéis scéimre CSV</comment>
+ <comment xml:lang="fur">document scheme CSV</comment>
+ <comment xml:lang="fr">document schéma CSV</comment>
+ <comment xml:lang="fi">CSV Schema -asiakirja</comment>
+ <comment xml:lang="eu">CSV Schema dokumentua</comment>
+ <comment xml:lang="es">documento esquemático CSV</comment>
+ <comment xml:lang="en_GB">CSV Schema document</comment>
+ <comment xml:lang="de">CSV-Schemadokument</comment>
+ <comment xml:lang="da">CSV Schema-dokument</comment>
+ <comment xml:lang="cs">dokument schématu CSV</comment>
+ <comment xml:lang="ca">document Schema de CSV</comment>
+ <comment xml:lang="bg">Документ — схема на CSV</comment>
+ <comment xml:lang="be">дакумент CSV Schema</comment>
+ <comment xml:lang="ast">Documentu d'esquema CSV</comment>
+ <comment xml:lang="ar">مستند مخطط CSV</comment>
+ <comment xml:lang="af">CSV Schema-dokument</comment>
<acronym>CSV</acronym>
<expanded-acronym>Comma Separated Values</expanded-acronym>
<sub-class-of type="text/plain"/>
<glob pattern="*.csvs"/>
</mime-type>
<mime-type type="text/x-copying">
- <comment>license terms</comment>
- <comment xml:lang="af">lisensievoorwaardes</comment>
- <comment xml:lang="ar">شروط الترخيص</comment>
- <comment xml:lang="ast">términos de llicencia</comment>
- <comment xml:lang="be-Latn">licenzijnyja ŭmovy</comment>
- <comment xml:lang="bg">Лицензни условия</comment>
- <comment xml:lang="ca">condicions de llicència</comment>
- <comment xml:lang="cs">licenční podmínky</comment>
- <comment xml:lang="da">licensbetingelser</comment>
- <comment xml:lang="de">Lizenzbedingungen</comment>
- <comment xml:lang="el">Όροι άδειας</comment>
- <comment xml:lang="en-GB">licence terms</comment>
- <comment xml:lang="es">términos de licencia</comment>
- <comment xml:lang="eu">lizentzia baldintzak</comment>
- <comment xml:lang="fi">lisenssiehdot</comment>
- <comment xml:lang="fo">loyvistreytir</comment>
- <comment xml:lang="fr">termes de licence</comment>
- <comment xml:lang="fur">tiermins di licence</comment>
- <comment xml:lang="ga">téarmaí ceadúnais</comment>
- <comment xml:lang="gl">termos de licenza</comment>
- <comment xml:lang="he">תנאי רישיון</comment>
- <comment xml:lang="hr">Uvjeti licence</comment>
- <comment xml:lang="hu">licencfeltételek</comment>
- <comment xml:lang="ia">Conditiones de licentia</comment>
- <comment xml:lang="id">persyaratan lisensi</comment>
- <comment xml:lang="it">Termini di licenza</comment>
- <comment xml:lang="ja">ソフトウェアライセンス条項</comment>
- <comment xml:lang="kk">лицензиялық келісімі</comment>
- <comment xml:lang="ko">라이선스 조항</comment>
- <comment xml:lang="lt">licencijos sąlygos</comment>
- <comment xml:lang="lv">licences nosacījumi</comment>
- <comment xml:lang="nb">lisensbestemmelser</comment>
- <comment xml:lang="nl">licentievoorwaarden</comment>
- <comment xml:lang="nn">lisensvilkår</comment>
- <comment xml:lang="oc">tèrmes de licéncia</comment>
- <comment xml:lang="pl">Warunki licencji</comment>
- <comment xml:lang="pt">termos de licença</comment>
- <comment xml:lang="pt-BR">Termos de licença</comment>
- <comment xml:lang="ro">termeni de licență</comment>
+ <comment>License terms</comment>
+ <comment xml:lang="uk">умови ліцензування</comment>
+ <comment xml:lang="sv">Licensvillkor</comment>
<comment xml:lang="ru">Лицензионное соглашение</comment>
- <comment xml:lang="sk">Licenčné podmienky</comment>
- <comment xml:lang="sl">pogoji in dovoljenja uporabe</comment>
- <comment xml:lang="sq">Kushte liçence</comment>
- <comment xml:lang="sr">услови коришћења</comment>
- <comment xml:lang="sv">licensvillkor</comment>
- <comment xml:lang="tr">lisans koşulları</comment>
- <comment xml:lang="uk">ліцензійні умови</comment>
- <comment xml:lang="vi">điều kiện giấy phép</comment>
- <comment xml:lang="zh-CN">软件许可条款</comment>
- <comment xml:lang="zh-TW">授權條款</comment>
+ <comment xml:lang="pl">Warunki licencji</comment>
+ <comment xml:lang="ja">利用許諾</comment>
+ <comment xml:lang="it">Termini di licenza</comment>
+ <comment xml:lang="gl">Termos de licenza</comment>
+ <comment xml:lang="eu">Lizentziaren terminoak</comment>
+ <comment xml:lang="es">términos de licencia</comment>
+ <comment xml:lang="de">Lizenzbedingungen</comment>
+ <comment xml:lang="be">умовы карыстання</comment>
<sub-class-of type="text/plain"/>
<glob pattern="COPYING"/>
</mime-type>
<mime-type type="text/x-credits">
- <comment>author credits</comment>
- <comment xml:lang="af">outeurerkenning</comment>
- <comment xml:lang="ar">شكر وتقدير المؤلف</comment>
- <comment xml:lang="ast">creitos del autor</comment>
- <comment xml:lang="be-Latn">zasłuhi aŭtara</comment>
- <comment xml:lang="bg">Благодарности към авторите</comment>
- <comment xml:lang="ca">atribucions d'autor</comment>
- <comment xml:lang="cs">autorské zásluhy</comment>
- <comment xml:lang="da">bidragydere</comment>
- <comment xml:lang="de">Autorendanksagung</comment>
- <comment xml:lang="el">Μνεία συγγραφέων</comment>
- <comment xml:lang="en-GB">author credits</comment>
- <comment xml:lang="es">reconocimiento de autoría</comment>
- <comment xml:lang="eu">egile-kredituak</comment>
- <comment xml:lang="fi">tekijöiden kiitokset</comment>
- <comment xml:lang="fo">høvundaheiður</comment>
- <comment xml:lang="fr">remerciements</comment>
- <comment xml:lang="fur">ricognossiments autôrs</comment>
- <comment xml:lang="ga">admhálacha údar</comment>
- <comment xml:lang="gl">créditos de autor</comment>
- <comment xml:lang="he">קרדיטים של היוצר</comment>
- <comment xml:lang="hr">Zasluge autora</comment>
- <comment xml:lang="hu">szerzők listája</comment>
- <comment xml:lang="ia">Recognoscentia de autores</comment>
- <comment xml:lang="id">kredit penulis</comment>
- <comment xml:lang="it">Riconoscimenti autori</comment>
- <comment xml:lang="ja">ソフトウェア作者クレジット</comment>
- <comment xml:lang="kk">бағдарлама авторлары</comment>
- <comment xml:lang="ko">작성자 정보</comment>
- <comment xml:lang="lt">padėkos autoriams</comment>
- <comment xml:lang="lv">veidotāji</comment>
- <comment xml:lang="nb">liste med bidragsytere</comment>
- <comment xml:lang="nl">auteursinformatie</comment>
- <comment xml:lang="nn">forfattarliste</comment>
- <comment xml:lang="oc">mercejaments</comment>
- <comment xml:lang="pl">Podziękowania autorów programu</comment>
- <comment xml:lang="pt">créditos de autor</comment>
- <comment xml:lang="pt-BR">Créditos do autor</comment>
- <comment xml:lang="ro">mulțumiri autori</comment>
+ <comment>Author credits</comment>
+ <comment xml:lang="uk">подяки авторам</comment>
+ <comment xml:lang="sv">Författarlista</comment>
<comment xml:lang="ru">Авторы программы</comment>
- <comment xml:lang="sk">Autorské zásluhy</comment>
- <comment xml:lang="sl">avtorske zasluge</comment>
- <comment xml:lang="sq">Kreditë e autorëve</comment>
- <comment xml:lang="sr">заслуге аутора</comment>
- <comment xml:lang="sv">författarlista</comment>
- <comment xml:lang="tr">yazar bilgileri</comment>
- <comment xml:lang="uk">подяки авторам програми</comment>
- <comment xml:lang="vi">công trạng tác giả</comment>
- <comment xml:lang="zh-CN">软件作者致谢</comment>
- <comment xml:lang="zh-TW">作者致謝名單</comment>
+ <comment xml:lang="pl">Podziękowania autorów programu</comment>
+ <comment xml:lang="it">Riconoscimenti autori</comment>
+ <comment xml:lang="gl">Créditos de autor</comment>
+ <comment xml:lang="eu">Egile-kredituak</comment>
+ <comment xml:lang="es">créditos de autoría</comment>
+ <comment xml:lang="de">Autorendanksagung</comment>
+ <comment xml:lang="be">звесткі пра аўтараў</comment>
<sub-class-of type="text/plain"/>
<glob pattern="CREDITS"/>
</mime-type>
<mime-type type="text/x-csrc">
<comment>C source code</comment>
- <comment xml:lang="af">C-bronkode</comment>
- <comment xml:lang="ar">شفرة مصدر سي</comment>
- <comment xml:lang="be-Latn">Kryničny kod C</comment>
- <comment xml:lang="bg">Изходен код — C</comment>
- <comment xml:lang="ca">codi font en C</comment>
- <comment xml:lang="cs">zdrojový kód v jazyce C</comment>
- <comment xml:lang="da">C-kildekode</comment>
- <comment xml:lang="de">C-Quelltext</comment>
- <comment xml:lang="el">Πηγαίος κώδικας C</comment>
- <comment xml:lang="en-GB">C source code</comment>
- <comment xml:lang="eo">C-fontkodo</comment>
- <comment xml:lang="es">código fuente en C</comment>
- <comment xml:lang="eu">C iturburu-kodea</comment>
- <comment xml:lang="fi">C-lähdekoodi</comment>
- <comment xml:lang="fo">C keldukota</comment>
- <comment xml:lang="fr">code source C</comment>
- <comment xml:lang="fur">codiç sorzint C</comment>
- <comment xml:lang="ga">cód foinseach C</comment>
- <comment xml:lang="gl">código fonte en C</comment>
- <comment xml:lang="he">קוד מקור של C</comment>
- <comment xml:lang="hr">C izvorni kôd</comment>
- <comment xml:lang="hu">C-forráskód</comment>
- <comment xml:lang="ia">Codice-fonte C</comment>
- <comment xml:lang="id">Kode sumber C</comment>
- <comment xml:lang="it">Codice sorgente C</comment>
- <comment xml:lang="ja">C ソースコード</comment>
- <comment xml:lang="ka">C-ის საწყისი კოდი</comment>
- <comment xml:lang="kk">C бастапқы коды</comment>
- <comment xml:lang="ko">C 소스 코드</comment>
- <comment xml:lang="lt">C pradinis kodas</comment>
- <comment xml:lang="lv">C pirmkods</comment>
- <comment xml:lang="ms">Kod sumber C</comment>
- <comment xml:lang="nb">C-kildekode</comment>
- <comment xml:lang="nl">C-broncode</comment>
- <comment xml:lang="nn">C-kjeldekode</comment>
- <comment xml:lang="oc">còde font C</comment>
- <comment xml:lang="pl">Kod źródłowy C</comment>
- <comment xml:lang="pt">código origem C</comment>
- <comment xml:lang="pt-BR">Código-fonte C</comment>
- <comment xml:lang="ro">Cod sursă C</comment>
- <comment xml:lang="ru">Исходный код C</comment>
- <comment xml:lang="sk">Zdrojový kód jazyka C</comment>
- <comment xml:lang="sl">Datoteka izvorne kode C</comment>
- <comment xml:lang="sq">Kod burues C</comment>
- <comment xml:lang="sr">Ц изворни ко̂д</comment>
- <comment xml:lang="sv">C-källkod</comment>
- <comment xml:lang="tr">C kaynak kodu</comment>
- <comment xml:lang="uk">вихідний код мовою C</comment>
+ <comment xml:lang="zh_TW">C 源碼</comment>
+ <comment xml:lang="zh_CN">C 源代码</comment>
<comment xml:lang="vi">Mã nguồn C</comment>
- <comment xml:lang="zh-CN">C 源代码</comment>
- <comment xml:lang="zh-TW">C 源碼</comment>
+ <comment xml:lang="uk">початковий код мовою C</comment>
+ <comment xml:lang="tr">C kaynak kodu</comment>
+ <comment xml:lang="sv">C-källkod</comment>
+ <comment xml:lang="sr">Ц изворни ко̂д</comment>
+ <comment xml:lang="sq">kod burim C</comment>
+ <comment xml:lang="sl">Datoteka izvorne kode C</comment>
+ <comment xml:lang="si">C මූල කේතය</comment>
+ <comment xml:lang="sk">Zdrojový kód jazyka C</comment>
+ <comment xml:lang="ru">Исходный код C</comment>
+ <comment xml:lang="ro">Cod sursă C</comment>
+ <comment xml:lang="pt_BR">Código-fonte C</comment>
+ <comment xml:lang="pt">código origem C</comment>
+ <comment xml:lang="pl">Kod źródłowy C</comment>
+ <comment xml:lang="oc">còde font C</comment>
+ <comment xml:lang="nn">C-kjeldekode</comment>
+ <comment xml:lang="nl">C-broncode</comment>
+ <comment xml:lang="nb">C-kildekode</comment>
+ <comment xml:lang="ms">Kod sumber C</comment>
+ <comment xml:lang="lv">C pirmkods</comment>
+ <comment xml:lang="lt">C pradinis kodas</comment>
+ <comment xml:lang="ko">C 소스 코드</comment>
+ <comment xml:lang="kk">C бастапқы коды</comment>
+ <comment xml:lang="ka">C-ის საწყისი კოდი</comment>
+ <comment xml:lang="ja">C ソースコード</comment>
+ <comment xml:lang="it">Codice sorgente C</comment>
+ <comment xml:lang="is">C frumkóði</comment>
+ <comment xml:lang="id">Kode sumber C</comment>
+ <comment xml:lang="ia">Codice-fonte C</comment>
+ <comment xml:lang="hu">C-forráskód</comment>
+ <comment xml:lang="hr">C izvorni kôd</comment>
+ <comment xml:lang="he">קוד מקור של C</comment>
+ <comment xml:lang="gl">código fonte en C</comment>
+ <comment xml:lang="ga">cód foinseach C</comment>
+ <comment xml:lang="fur">codiç sorzint C</comment>
+ <comment xml:lang="fr">code source C</comment>
+ <comment xml:lang="fo">C keldukota</comment>
+ <comment xml:lang="fi">C-lähdekoodi</comment>
+ <comment xml:lang="eu">C iturburu-kodea</comment>
+ <comment xml:lang="es">código fuente en C</comment>
+ <comment xml:lang="eo">C-fontkodo</comment>
+ <comment xml:lang="en_GB">C source code</comment>
+ <comment xml:lang="el">Πηγαίος κώδικας C</comment>
+ <comment xml:lang="de">C-Quelltext</comment>
+ <comment xml:lang="da">C-kildekode</comment>
+ <comment xml:lang="cs">zdrojový kód v jazyce C</comment>
+ <comment xml:lang="ca">codi font en C</comment>
+ <comment xml:lang="bg">Изходен код — C</comment>
+ <comment xml:lang="be@latin">Kryničny kod C</comment>
+ <comment xml:lang="be">зыходны код C</comment>
+ <comment xml:lang="ar">شفرة مصدر سي</comment>
+ <comment xml:lang="af">C-bronkode</comment>
<sub-class-of type="text/plain"/>
<alias type="text/x-c"/>
<glob pattern="*.c" case-sensitive="true"/>
@@ -34838,158 +35597,169 @@ command to generate the output files.
</mime-type>
<mime-type type="text/x-csharp">
<comment>C# source code</comment>
- <comment xml:lang="af">C#-bronkode</comment>
- <comment xml:lang="ar">شفرة مصدر سي#</comment>
- <comment xml:lang="be-Latn">Kryničny kod C#</comment>
- <comment xml:lang="bg">Изходен код — C#</comment>
- <comment xml:lang="ca">codi font en C#</comment>
- <comment xml:lang="cs">zdrojový kód v jazyce C#</comment>
- <comment xml:lang="da">C#-kildekode</comment>
- <comment xml:lang="de">C#-Quelltext</comment>
- <comment xml:lang="el">Πηγαίος κώδικας C#</comment>
- <comment xml:lang="en-GB">C# source code</comment>
- <comment xml:lang="eo">C#-fontkodo</comment>
- <comment xml:lang="es">código fuente en C#</comment>
- <comment xml:lang="eu">C# iturburu-kodea</comment>
- <comment xml:lang="fi">C#-lähdekoodi</comment>
- <comment xml:lang="fo">C# keldukota</comment>
- <comment xml:lang="fr">code source C#</comment>
- <comment xml:lang="fur">codiç sorzint C#</comment>
- <comment xml:lang="ga">cód foinseach C#</comment>
- <comment xml:lang="gl">código fonte en C#</comment>
- <comment xml:lang="he">קוד מקור של C#‎</comment>
- <comment xml:lang="hr">C# izvorni kôd</comment>
- <comment xml:lang="hu">C#-forráskód</comment>
- <comment xml:lang="ia">Codice-fonte C#</comment>
- <comment xml:lang="id">Kode sumber C#</comment>
- <comment xml:lang="it">Codice sorgente C#</comment>
- <comment xml:lang="ja">C# ソースコード</comment>
- <comment xml:lang="ka">C#-ის საწყისი კოდი</comment>
- <comment xml:lang="kk">C# бастапқы коды</comment>
- <comment xml:lang="ko">C# 소스 코드</comment>
- <comment xml:lang="lt">C# pradinis kodas</comment>
- <comment xml:lang="lv">C# pirmkods</comment>
- <comment xml:lang="ms">Kod sumber C#</comment>
- <comment xml:lang="nb">C#-kildekode</comment>
- <comment xml:lang="nl">C#-broncode</comment>
- <comment xml:lang="nn">C#-kjeldekode</comment>
- <comment xml:lang="oc">còde font C#</comment>
- <comment xml:lang="pl">Kod źródłowy C#</comment>
- <comment xml:lang="pt">código origem C#</comment>
- <comment xml:lang="pt-BR">Código-fonte C#</comment>
- <comment xml:lang="ro">Cod sursă C#</comment>
- <comment xml:lang="ru">Исходный код C#</comment>
- <comment xml:lang="sk">Zdrojový kód jazyka C#</comment>
- <comment xml:lang="sl">Datoteka izvorne kode C#</comment>
- <comment xml:lang="sq">Kod burues C#</comment>
- <comment xml:lang="sr">Ц# изворни ко̂д</comment>
- <comment xml:lang="sv">C#-källkod</comment>
- <comment xml:lang="tr">C# kaynak kodu</comment>
- <comment xml:lang="uk">вихідний код мовою C#</comment>
+ <comment xml:lang="zh_TW">C# 源碼</comment>
+ <comment xml:lang="zh_CN">C# 源代码</comment>
<comment xml:lang="vi">Mã nguồn C#</comment>
- <comment xml:lang="zh-CN">C# 源代码</comment>
- <comment xml:lang="zh-TW">C# 源碼</comment>
+ <comment xml:lang="uk">початковий код мовою C#</comment>
+ <comment xml:lang="tr">C# kaynak kodu</comment>
+ <comment xml:lang="sv">C#-källkod</comment>
+ <comment xml:lang="sr">Ц# изворни ко̂д</comment>
+ <comment xml:lang="sq">kod burim C#</comment>
+ <comment xml:lang="sl">Datoteka izvorne kode C#</comment>
+ <comment xml:lang="si">C# මූල කේතය</comment>
+ <comment xml:lang="sk">Zdrojový kód jazyka C#</comment>
+ <comment xml:lang="ru">Исходный код C#</comment>
+ <comment xml:lang="ro">Cod sursă C#</comment>
+ <comment xml:lang="pt_BR">Código-fonte C#</comment>
+ <comment xml:lang="pt">código origem C#</comment>
+ <comment xml:lang="pl">Kod źródłowy C#</comment>
+ <comment xml:lang="oc">còde font C#</comment>
+ <comment xml:lang="nn">C#-kjeldekode</comment>
+ <comment xml:lang="nl">C#-broncode</comment>
+ <comment xml:lang="nb">C#-kildekode</comment>
+ <comment xml:lang="ms">Kod sumber C#</comment>
+ <comment xml:lang="lv">C# pirmkods</comment>
+ <comment xml:lang="lt">C# pradinis kodas</comment>
+ <comment xml:lang="ko">C# 소스 코드</comment>
+ <comment xml:lang="kk">C# бастапқы коды</comment>
+ <comment xml:lang="ka">C#-ის საწყისი კოდი</comment>
+ <comment xml:lang="ja">C# ソースコード</comment>
+ <comment xml:lang="it">Codice sorgente C#</comment>
+ <comment xml:lang="is">C# frumkóði</comment>
+ <comment xml:lang="id">Kode sumber C#</comment>
+ <comment xml:lang="ia">Codice-fonte C#</comment>
+ <comment xml:lang="hu">C#-forráskód</comment>
+ <comment xml:lang="hr">C# izvorni kôd</comment>
+ <comment xml:lang="he">קוד מקור של C#‎</comment>
+ <comment xml:lang="gl">código fonte en C#</comment>
+ <comment xml:lang="ga">cód foinseach C#</comment>
+ <comment xml:lang="fur">codiç sorzint C#</comment>
+ <comment xml:lang="fr">code source C#</comment>
+ <comment xml:lang="fo">C# keldukota</comment>
+ <comment xml:lang="fi">C#-lähdekoodi</comment>
+ <comment xml:lang="eu">C# iturburu-kodea</comment>
+ <comment xml:lang="es">código fuente en C#</comment>
+ <comment xml:lang="eo">C#-fontkodo</comment>
+ <comment xml:lang="en_GB">C# source code</comment>
+ <comment xml:lang="el">Πηγαίος κώδικας C#</comment>
+ <comment xml:lang="de">C#-Quelltext</comment>
+ <comment xml:lang="da">C#-kildekode</comment>
+ <comment xml:lang="cs">zdrojový kód v jazyce C#</comment>
+ <comment xml:lang="ca">codi font en C#</comment>
+ <comment xml:lang="bg">Изходен код — C#</comment>
+ <comment xml:lang="be@latin">Kryničny kod C#</comment>
+ <comment xml:lang="be">зыходны код C#</comment>
+ <comment xml:lang="ar">شفرة مصدر سي#</comment>
+ <comment xml:lang="af">C#-bronkode</comment>
<sub-class-of type="text/x-csrc"/>
<glob pattern="*.cs"/>
</mime-type>
<mime-type type="text/x-vala">
<comment>Vala source code</comment>
- <comment xml:lang="af">Vala-bronkode</comment>
- <comment xml:lang="ar">شفرة مصدر Vala</comment>
- <comment xml:lang="be-Latn">Kryničny kod Vala</comment>
- <comment xml:lang="bg">Изходен код — Vala</comment>
- <comment xml:lang="ca">codi font en Vala</comment>
- <comment xml:lang="cs">zdrojový kód v jazyce Vala</comment>
- <comment xml:lang="da">Vala-kildekode</comment>
- <comment xml:lang="de">Vala-Quelltext</comment>
- <comment xml:lang="el">Πηγαίος κώδικας Vala</comment>
- <comment xml:lang="en-GB">Vala source code</comment>
- <comment xml:lang="eo">Vala-fontkodo</comment>
- <comment xml:lang="es">código fuente en Vala</comment>
- <comment xml:lang="eu">Vala iturburu-kodea</comment>
- <comment xml:lang="fi">Vala-lähdekoodi</comment>
- <comment xml:lang="fo">Vala keldukota</comment>
- <comment xml:lang="fr">code source Vala</comment>
- <comment xml:lang="fur">codiç sorzint Vala</comment>
- <comment xml:lang="ga">cód foinseach Vala</comment>
- <comment xml:lang="gl">código fonte en Vala</comment>
- <comment xml:lang="he">קוד מקור של Vala</comment>
- <comment xml:lang="hr">Vala izvorni kôd</comment>
- <comment xml:lang="hu">Vala forráskód</comment>
- <comment xml:lang="ia">Codice-fonte Vala</comment>
- <comment xml:lang="id">Kode sumber Vala</comment>
- <comment xml:lang="it">Codice sorgente Vala</comment>
- <comment xml:lang="ja">Vala ソースコード</comment>
- <comment xml:lang="kk">Vala бастапқы коды</comment>
- <comment xml:lang="ko">Vala 소스 코드</comment>
- <comment xml:lang="lt">Vala pradinis kodas</comment>
- <comment xml:lang="lv">Vala pirmkods</comment>
- <comment xml:lang="nb">Vala-kildekode</comment>
- <comment xml:lang="nl">Vala-broncode</comment>
- <comment xml:lang="nn">Vala-kjeldekode</comment>
- <comment xml:lang="oc">còde font Vala</comment>
- <comment xml:lang="pl">Kod źródłowy Vala</comment>
- <comment xml:lang="pt">código origem Vala</comment>
- <comment xml:lang="pt-BR">Código-fonte Vala</comment>
- <comment xml:lang="ro">Cod sursă Vala</comment>
- <comment xml:lang="ru">Исходный код Vala</comment>
- <comment xml:lang="sk">Zdrojový kód Vala</comment>
- <comment xml:lang="sl">Datoteka izvorne kode Vala</comment>
- <comment xml:lang="sq">Kod burues Vala</comment>
- <comment xml:lang="sr">Вала изворни ко̂д</comment>
- <comment xml:lang="sv">Vala-källkod</comment>
- <comment xml:lang="tr">Vala kaynak kodu</comment>
- <comment xml:lang="uk">вихідний код мовою Vala</comment>
+ <comment xml:lang="zh_TW">Vala 源碼</comment>
+ <comment xml:lang="zh_CN">Vala 源代码</comment>
<comment xml:lang="vi">Mã nguồn Vala</comment>
- <comment xml:lang="zh-CN">Vala 源代码</comment>
- <comment xml:lang="zh-TW">Vala 源碼</comment>
+ <comment xml:lang="uk">початковий код мовою Vala</comment>
+ <comment xml:lang="tr">Vala kaynak kodu</comment>
+ <comment xml:lang="sv">Vala-källkod</comment>
+ <comment xml:lang="sr">Вала изворни ко̂д</comment>
+ <comment xml:lang="sq">kod burim Vala</comment>
+ <comment xml:lang="sl">Datoteka izvorne kode Vala</comment>
+ <comment xml:lang="si">වාල මූල කේතය</comment>
+ <comment xml:lang="sk">Zdrojový kód Vala</comment>
+ <comment xml:lang="ru">Исходный код Vala</comment>
+ <comment xml:lang="ro">Cod sursă Vala</comment>
+ <comment xml:lang="pt_BR">Código-fonte Vala</comment>
+ <comment xml:lang="pt">código origem Vala</comment>
+ <comment xml:lang="pl">Kod źródłowy Vala</comment>
+ <comment xml:lang="oc">còde font Vala</comment>
+ <comment xml:lang="nn">Vala-kjeldekode</comment>
+ <comment xml:lang="nl">Vala-broncode</comment>
+ <comment xml:lang="nb">Vala-kildekode</comment>
+ <comment xml:lang="lv">Vala pirmkods</comment>
+ <comment xml:lang="lt">Vala pradinis kodas</comment>
+ <comment xml:lang="ko">Vala 소스 코드</comment>
+ <comment xml:lang="kk">Vala бастапқы коды</comment>
+ <comment xml:lang="ja">Vala ソースコード</comment>
+ <comment xml:lang="it">Codice sorgente Vala</comment>
+ <comment xml:lang="is">Vala frumkóði</comment>
+ <comment xml:lang="id">Kode sumber Vala</comment>
+ <comment xml:lang="ia">Codice-fonte Vala</comment>
+ <comment xml:lang="hu">Vala forráskód</comment>
+ <comment xml:lang="hr">Vala izvorni kôd</comment>
+ <comment xml:lang="he">קוד מקור של Vala</comment>
+ <comment xml:lang="gl">código fonte en Vala</comment>
+ <comment xml:lang="ga">cód foinseach Vala</comment>
+ <comment xml:lang="fur">codiç sorzint Vala</comment>
+ <comment xml:lang="fr">code source Vala</comment>
+ <comment xml:lang="fo">Vala keldukota</comment>
+ <comment xml:lang="fi">Vala-lähdekoodi</comment>
+ <comment xml:lang="eu">Vala iturburu-kodea</comment>
+ <comment xml:lang="es">código fuente en Vala</comment>
+ <comment xml:lang="eo">Vala-fontkodo</comment>
+ <comment xml:lang="en_GB">Vala source code</comment>
+ <comment xml:lang="el">Πηγαίος κώδικας Vala</comment>
+ <comment xml:lang="de">Vala-Quelltext</comment>
+ <comment xml:lang="da">Vala-kildekode</comment>
+ <comment xml:lang="cs">zdrojový kód v jazyce Vala</comment>
+ <comment xml:lang="ca">codi font en Vala</comment>
+ <comment xml:lang="bg">Изходен код — Vala</comment>
+ <comment xml:lang="be@latin">Kryničny kod Vala</comment>
+ <comment xml:lang="be">зыходны код Vala</comment>
+ <comment xml:lang="ar">شفرة مصدر Vala</comment>
+ <comment xml:lang="af">Vala-bronkode</comment>
<sub-class-of type="text/x-csrc"/>
<glob pattern="*.vala"/>
<glob pattern="*.vapi"/>
</mime-type>
<mime-type type="text/x-ooc">
<comment>OOC source code</comment>
- <comment xml:lang="af">OOC-bronkode</comment>
- <comment xml:lang="bg">Изходен код — OOC</comment>
- <comment xml:lang="ca">codi font en OOC</comment>
- <comment xml:lang="cs">zdrojový kód OOC</comment>
- <comment xml:lang="da">OOC-kildekode</comment>
- <comment xml:lang="de">OOC-Quelltext</comment>
- <comment xml:lang="el">Πηγαίος κώδικας OOC</comment>
- <comment xml:lang="en-GB">OOC source code</comment>
- <comment xml:lang="eo">OOC-fontkodo</comment>
- <comment xml:lang="es">código fuente en OOC</comment>
- <comment xml:lang="eu">OOC iturburu-kodea</comment>
- <comment xml:lang="fi">OOC-lähdekoodi</comment>
- <comment xml:lang="fr">source code OOC</comment>
- <comment xml:lang="fur">codiç sorzint OOC</comment>
- <comment xml:lang="ga">cód foinseach OOC</comment>
- <comment xml:lang="gl">código fonte de OOC</comment>
- <comment xml:lang="he">קוד מקור של OOC</comment>
- <comment xml:lang="hr">OOC izvorni kôd</comment>
- <comment xml:lang="hu">OOC forráskód</comment>
- <comment xml:lang="ia">Codice-fonte OCC</comment>
- <comment xml:lang="id">Kode sumber OOC</comment>
- <comment xml:lang="it">Codice sorgente OOC</comment>
- <comment xml:lang="ja">OOC ソースコード</comment>
- <comment xml:lang="ka">OOC-ის საწყისი კოდი</comment>
- <comment xml:lang="kk">OOC бастапқы коды</comment>
- <comment xml:lang="ko">OOC 소스 코드</comment>
- <comment xml:lang="lv">OOC pirmkods</comment>
- <comment xml:lang="nl">OOC broncode</comment>
- <comment xml:lang="oc">font còde OOC</comment>
- <comment xml:lang="pl">Kod źródłowy OOC</comment>
- <comment xml:lang="pt">código origem OOC</comment>
- <comment xml:lang="pt-BR">Código-fonte OOC</comment>
- <comment xml:lang="ru">Исходный код OOC</comment>
- <comment xml:lang="sk">Zdrojový kód OOC</comment>
- <comment xml:lang="sl">Izvorna koda OOC</comment>
- <comment xml:lang="sr">ООЦ изворни ко̂д</comment>
- <comment xml:lang="sv">OOC-källkod</comment>
+ <comment xml:lang="zh_TW">OOC 源碼</comment>
+ <comment xml:lang="zh_CN">OOC 源代码</comment>
+ <comment xml:lang="uk">початковий код мовою OOC</comment>
<comment xml:lang="tr">OOC kaynak kodu</comment>
- <comment xml:lang="uk">вихідний код мовою OOC</comment>
- <comment xml:lang="zh-CN">OOC 源代码</comment>
- <comment xml:lang="zh-TW">OOC 源碼</comment>
+ <comment xml:lang="sv">OOC-källkod</comment>
+ <comment xml:lang="sr">ООЦ изворни ко̂д</comment>
+ <comment xml:lang="sq">kod burim OOC</comment>
+ <comment xml:lang="sl">Izvorna koda OOC</comment>
+ <comment xml:lang="si">OOC මූල කේතය</comment>
+ <comment xml:lang="sk">Zdrojový kód OOC</comment>
+ <comment xml:lang="ru">Исходный код OOC</comment>
+ <comment xml:lang="pt_BR">Código-fonte OOC</comment>
+ <comment xml:lang="pt">código origem OOC</comment>
+ <comment xml:lang="pl">Kod źródłowy OOC</comment>
+ <comment xml:lang="oc">font còde OOC</comment>
+ <comment xml:lang="nl">OOC-broncode</comment>
+ <comment xml:lang="lv">OOC pirmkods</comment>
+ <comment xml:lang="ko">OOC 소스 코드</comment>
+ <comment xml:lang="kk">OOC бастапқы коды</comment>
+ <comment xml:lang="ka">OOC-ის საწყისი კოდი</comment>
+ <comment xml:lang="ja">OOC ソースコード</comment>
+ <comment xml:lang="it">Codice sorgente OOC</comment>
+ <comment xml:lang="is">OOC frumkóði</comment>
+ <comment xml:lang="id">Kode sumber OOC</comment>
+ <comment xml:lang="ia">Codice-fonte OCC</comment>
+ <comment xml:lang="hu">OOC forráskód</comment>
+ <comment xml:lang="hr">OOC izvorni kôd</comment>
+ <comment xml:lang="he">קוד מקור של OOC</comment>
+ <comment xml:lang="gl">código fonte de OOC</comment>
+ <comment xml:lang="ga">cód foinseach OOC</comment>
+ <comment xml:lang="fur">codiç sorzint OOC</comment>
+ <comment xml:lang="fr">source code OOC</comment>
+ <comment xml:lang="fi">OOC-lähdekoodi</comment>
+ <comment xml:lang="eu">OOC iturburu-kodea</comment>
+ <comment xml:lang="es">código fuente en OOC</comment>
+ <comment xml:lang="eo">OOC-fontkodo</comment>
+ <comment xml:lang="en_GB">OOC source code</comment>
+ <comment xml:lang="el">Πηγαίος κώδικας OOC</comment>
+ <comment xml:lang="de">OOC-Quelltext</comment>
+ <comment xml:lang="da">OOC-kildekode</comment>
+ <comment xml:lang="cs">zdrojový kód OOC</comment>
+ <comment xml:lang="ca">codi font en OOC</comment>
+ <comment xml:lang="bg">Изходен код — OOC</comment>
+ <comment xml:lang="be">зыходны код OOC</comment>
+ <comment xml:lang="ar">شفرة مصدر OOC</comment>
+ <comment xml:lang="af">OOC-bronkode</comment>
<acronym>OOC</acronym>
<expanded-acronym>Out Of Class</expanded-acronym>
<sub-class-of type="text/x-csrc"/>
@@ -34997,59 +35767,62 @@ command to generate the output files.
</mime-type>
<mime-type type="text/x-dcl">
<comment>DCL script</comment>
- <comment xml:lang="af">DCL-skrip</comment>
- <comment xml:lang="ar">سكربت DCL</comment>
- <comment xml:lang="az">DCL skripti</comment>
- <comment xml:lang="be-Latn">Skrypt DCL</comment>
- <comment xml:lang="bg">Скрипт — DCL</comment>
- <comment xml:lang="ca">script DCL</comment>
- <comment xml:lang="cs">skript DCL</comment>
- <comment xml:lang="cy">Sgript DCL</comment>
- <comment xml:lang="da">DCL-program</comment>
- <comment xml:lang="de">DCL-Skript</comment>
- <comment xml:lang="el">Δέσμη ενεργειών DCL</comment>
- <comment xml:lang="en-GB">DCL script</comment>
- <comment xml:lang="eo">DCL-skripto</comment>
- <comment xml:lang="es">secuencia de órdenes en DCL</comment>
- <comment xml:lang="eu">DCL script-a</comment>
- <comment xml:lang="fi">DCL-komentotiedosto</comment>
- <comment xml:lang="fo">DCL boðrøð</comment>
- <comment xml:lang="fr">script DCL</comment>
- <comment xml:lang="fur">script DCL</comment>
- <comment xml:lang="ga">script DCL</comment>
- <comment xml:lang="gl">script de DCL</comment>
- <comment xml:lang="he">תסריט DCL</comment>
- <comment xml:lang="hr">DCL skripta</comment>
- <comment xml:lang="hu">DCL-parancsfájl</comment>
- <comment xml:lang="ia">Script DCL</comment>
- <comment xml:lang="id">Skrip DCL</comment>
- <comment xml:lang="it">Script DCL</comment>
- <comment xml:lang="ja">DCL スクリプト</comment>
- <comment xml:lang="ka">DCL სცენარი</comment>
- <comment xml:lang="kk">DCL сценарийі</comment>
- <comment xml:lang="ko">DCL 스크립트</comment>
- <comment xml:lang="lt">DCL scenarijus</comment>
- <comment xml:lang="lv">DCL skripts</comment>
- <comment xml:lang="ms">Skrip DCL</comment>
- <comment xml:lang="nb">DCL-skript</comment>
- <comment xml:lang="nl">DCL-script</comment>
- <comment xml:lang="nn">DCL-skript</comment>
- <comment xml:lang="oc">escript DCL</comment>
- <comment xml:lang="pl">Skrypt DCL</comment>
- <comment xml:lang="pt">script DCL</comment>
- <comment xml:lang="pt-BR">Script DCL</comment>
- <comment xml:lang="ro">Script DCL</comment>
- <comment xml:lang="ru">Сценарий DCL</comment>
- <comment xml:lang="sk">Skript DCL</comment>
- <comment xml:lang="sl">Skriptna datoteka DCL</comment>
- <comment xml:lang="sq">Script DCL</comment>
- <comment xml:lang="sr">ДЦЛ скрипта</comment>
- <comment xml:lang="sv">DCL-skript</comment>
- <comment xml:lang="tr">DCL betiği</comment>
- <comment xml:lang="uk">скрипт DCL</comment>
+ <comment xml:lang="zh_TW">DCL 指令稿</comment>
+ <comment xml:lang="zh_CN">DCL 脚本</comment>
<comment xml:lang="vi">Văn lệnh DCL</comment>
- <comment xml:lang="zh-CN">DCL 脚本</comment>
- <comment xml:lang="zh-TW">DCL 指令稿</comment>
+ <comment xml:lang="uk">скрипт DCL</comment>
+ <comment xml:lang="tr">DCL betiği</comment>
+ <comment xml:lang="sv">DCL-skript</comment>
+ <comment xml:lang="sr">ДЦЛ скрипта</comment>
+ <comment xml:lang="sq">programth DCL</comment>
+ <comment xml:lang="sl">Skriptna datoteka DCL</comment>
+ <comment xml:lang="si">DCL පිටපත</comment>
+ <comment xml:lang="sk">Skript DCL</comment>
+ <comment xml:lang="ru">Сценарий DCL</comment>
+ <comment xml:lang="ro">Script DCL</comment>
+ <comment xml:lang="pt_BR">Script DCL</comment>
+ <comment xml:lang="pt">script DCL</comment>
+ <comment xml:lang="pl">Skrypt DCL</comment>
+ <comment xml:lang="oc">escript DCL</comment>
+ <comment xml:lang="nn">DCL-skript</comment>
+ <comment xml:lang="nl">DCL-script</comment>
+ <comment xml:lang="nb">DCL-skript</comment>
+ <comment xml:lang="ms">Skrip DCL</comment>
+ <comment xml:lang="lv">DCL skripts</comment>
+ <comment xml:lang="lt">DCL scenarijus</comment>
+ <comment xml:lang="ko">DCL 스크립트</comment>
+ <comment xml:lang="kk">DCL сценарийі</comment>
+ <comment xml:lang="ka">DCL სცენარი</comment>
+ <comment xml:lang="ja">DCL スクリプト</comment>
+ <comment xml:lang="it">Script DCL</comment>
+ <comment xml:lang="is">DCL skrifta</comment>
+ <comment xml:lang="id">Skrip DCL</comment>
+ <comment xml:lang="ia">Script DCL</comment>
+ <comment xml:lang="hu">DCL-parancsfájl</comment>
+ <comment xml:lang="hr">DCL skripta</comment>
+ <comment xml:lang="he">תסריט DCL</comment>
+ <comment xml:lang="gl">script de DCL</comment>
+ <comment xml:lang="ga">script DCL</comment>
+ <comment xml:lang="fur">script DCL</comment>
+ <comment xml:lang="fr">script DCL</comment>
+ <comment xml:lang="fo">DCL boðrøð</comment>
+ <comment xml:lang="fi">DCL-komentotiedosto</comment>
+ <comment xml:lang="eu">DCL script-a</comment>
+ <comment xml:lang="es">secuencia de órdenes en DCL</comment>
+ <comment xml:lang="eo">DCL-skripto</comment>
+ <comment xml:lang="en_GB">DCL script</comment>
+ <comment xml:lang="el">Δέσμη ενεργειών DCL</comment>
+ <comment xml:lang="de">DCL-Skript</comment>
+ <comment xml:lang="da">DCL-program</comment>
+ <comment xml:lang="cy">Sgript DCL</comment>
+ <comment xml:lang="cs">skript DCL</comment>
+ <comment xml:lang="ca">script DCL</comment>
+ <comment xml:lang="bg">Скрипт — DCL</comment>
+ <comment xml:lang="be@latin">Skrypt DCL</comment>
+ <comment xml:lang="be">скрыпт DCL</comment>
+ <comment xml:lang="az">DCL skripti</comment>
+ <comment xml:lang="ar">سكربت DCL</comment>
+ <comment xml:lang="af">DCL-skrip</comment>
<acronym>DCL</acronym>
<expanded-acronym>Data Conversion Laboratory</expanded-acronym>
<sub-class-of type="text/plain"/>
@@ -35057,60 +35830,63 @@ command to generate the output files.
</mime-type>
<mime-type type="text/x-dsl">
<comment>DSSSL document</comment>
- <comment xml:lang="af">DSSSL-dokument</comment>
- <comment xml:lang="ar">مستند DSSSL</comment>
- <comment xml:lang="ast">Documentu DSSSL</comment>
- <comment xml:lang="az">DSSSL sənədi</comment>
- <comment xml:lang="be-Latn">Dakument DSSSL</comment>
- <comment xml:lang="bg">Документ — DSSSL</comment>
- <comment xml:lang="ca">document DSSSL</comment>
- <comment xml:lang="cs">dokument DSSSL</comment>
- <comment xml:lang="cy">Dogfen DSSSL</comment>
- <comment xml:lang="da">DSSSL-dokument</comment>
- <comment xml:lang="de">DSSSL-Dokument</comment>
- <comment xml:lang="el">Έγγραφο DSSSL</comment>
- <comment xml:lang="en-GB">DSSSL document</comment>
- <comment xml:lang="eo">DSSSL-dokumento</comment>
- <comment xml:lang="es">documento DSSSL</comment>
- <comment xml:lang="eu">DSSSL dokumentua</comment>
- <comment xml:lang="fi">DSSSL-asiakirja</comment>
- <comment xml:lang="fo">DSSSL skjal</comment>
- <comment xml:lang="fr">document DSSSL</comment>
- <comment xml:lang="fur">document DSSSL</comment>
- <comment xml:lang="ga">cáipéis DSSSL</comment>
- <comment xml:lang="gl">documento DSSSL</comment>
- <comment xml:lang="he">מסמך DSSSL</comment>
- <comment xml:lang="hr">DSSSL dokument</comment>
- <comment xml:lang="hu">DSSSL-dokumentum</comment>
- <comment xml:lang="ia">Documento DSSSL</comment>
- <comment xml:lang="id">Dokumen DSSSL</comment>
- <comment xml:lang="it">Documento DSSSL</comment>
- <comment xml:lang="ja">DSSSL ドキュメント</comment>
- <comment xml:lang="ka">DSSSL დოკუმენტი</comment>
- <comment xml:lang="kk">DSSSL құжаты</comment>
- <comment xml:lang="ko">DSSSL 문서</comment>
- <comment xml:lang="lt">DSSSL dokumentas</comment>
- <comment xml:lang="lv">DSSSL dokuments</comment>
- <comment xml:lang="ms">Dokumen DSSSL</comment>
- <comment xml:lang="nb">DSSSL-dokument</comment>
- <comment xml:lang="nl">DSSSL-document</comment>
- <comment xml:lang="nn">DSSSL-dokument</comment>
- <comment xml:lang="oc">document DSSSL</comment>
- <comment xml:lang="pl">Dokument DSSSL</comment>
- <comment xml:lang="pt">documento DSSSL</comment>
- <comment xml:lang="pt-BR">Documento DSSSL</comment>
- <comment xml:lang="ro">Document DSSSL</comment>
- <comment xml:lang="ru">Документ DSSSL</comment>
- <comment xml:lang="sk">Dokument DSSSL</comment>
- <comment xml:lang="sl">Dokument DSSSL</comment>
- <comment xml:lang="sq">Dokument DSSSL</comment>
- <comment xml:lang="sr">ДСССЛ документ</comment>
- <comment xml:lang="sv">DSSSL-dokument</comment>
- <comment xml:lang="tr">DSSSL belgesi</comment>
- <comment xml:lang="uk">документ DSSSL</comment>
+ <comment xml:lang="zh_TW">DSSSL 文件</comment>
+ <comment xml:lang="zh_CN">DSSSL 文档</comment>
<comment xml:lang="vi">Tài liệu DSSSL</comment>
- <comment xml:lang="zh-CN">DSSSL 文档</comment>
- <comment xml:lang="zh-TW">DSSSL 文件</comment>
+ <comment xml:lang="uk">документ DSSSL</comment>
+ <comment xml:lang="tr">DSSSL belgesi</comment>
+ <comment xml:lang="sv">DSSSL-dokument</comment>
+ <comment xml:lang="sr">ДСССЛ документ</comment>
+ <comment xml:lang="sq">dokument DSSSL</comment>
+ <comment xml:lang="sl">Dokument DSSSL</comment>
+ <comment xml:lang="si">DSSSL ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument DSSSL</comment>
+ <comment xml:lang="ru">Документ DSSSL</comment>
+ <comment xml:lang="ro">Document DSSSL</comment>
+ <comment xml:lang="pt_BR">Documento DSSSL</comment>
+ <comment xml:lang="pt">documento DSSSL</comment>
+ <comment xml:lang="pl">Dokument DSSSL</comment>
+ <comment xml:lang="oc">document DSSSL</comment>
+ <comment xml:lang="nn">DSSSL-dokument</comment>
+ <comment xml:lang="nl">DSSSL-document</comment>
+ <comment xml:lang="nb">DSSSL-dokument</comment>
+ <comment xml:lang="ms">Dokumen DSSSL</comment>
+ <comment xml:lang="lv">DSSSL dokuments</comment>
+ <comment xml:lang="lt">DSSSL dokumentas</comment>
+ <comment xml:lang="ko">DSSSL 문서</comment>
+ <comment xml:lang="kk">DSSSL құжаты</comment>
+ <comment xml:lang="ka">DSSSL დოკუმენტი</comment>
+ <comment xml:lang="ja">DSSSL ドキュメント</comment>
+ <comment xml:lang="it">Documento DSSSL</comment>
+ <comment xml:lang="is">DSSSL skjal</comment>
+ <comment xml:lang="id">Dokumen DSSSL</comment>
+ <comment xml:lang="ia">Documento DSSSL</comment>
+ <comment xml:lang="hu">DSSSL-dokumentum</comment>
+ <comment xml:lang="hr">DSSSL dokument</comment>
+ <comment xml:lang="he">מסמך DSSSL</comment>
+ <comment xml:lang="gl">documento DSSSL</comment>
+ <comment xml:lang="ga">cáipéis DSSSL</comment>
+ <comment xml:lang="fur">document DSSSL</comment>
+ <comment xml:lang="fr">document DSSSL</comment>
+ <comment xml:lang="fo">DSSSL skjal</comment>
+ <comment xml:lang="fi">DSSSL-asiakirja</comment>
+ <comment xml:lang="eu">DSSSL dokumentua</comment>
+ <comment xml:lang="es">documento DSSSL</comment>
+ <comment xml:lang="eo">DSSSL-dokumento</comment>
+ <comment xml:lang="en_GB">DSSSL document</comment>
+ <comment xml:lang="el">Έγγραφο DSSSL</comment>
+ <comment xml:lang="de">DSSSL-Dokument</comment>
+ <comment xml:lang="da">DSSSL-dokument</comment>
+ <comment xml:lang="cy">Dogfen DSSSL</comment>
+ <comment xml:lang="cs">dokument DSSSL</comment>
+ <comment xml:lang="ca">document DSSSL</comment>
+ <comment xml:lang="bg">Документ — DSSSL</comment>
+ <comment xml:lang="be@latin">Dakument DSSSL</comment>
+ <comment xml:lang="be">дакумент DSSSL</comment>
+ <comment xml:lang="az">DSSSL sənədi</comment>
+ <comment xml:lang="ast">Documentu DSSSL</comment>
+ <comment xml:lang="ar">مستند DSSSL</comment>
+ <comment xml:lang="af">DSSSL-dokument</comment>
<acronym>DSSSL</acronym>
<expanded-acronym>Document Style Semantics and Specification Language</expanded-acronym>
<sub-class-of type="text/plain"/>
@@ -35118,112 +35894,118 @@ command to generate the output files.
</mime-type>
<mime-type type="text/x-dsrc">
<comment>D source code</comment>
- <comment xml:lang="af">D-bronkode</comment>
- <comment xml:lang="ar">شفرة مصدر D</comment>
- <comment xml:lang="be-Latn">Kryničny kod D</comment>
- <comment xml:lang="bg">Изходен код — D</comment>
- <comment xml:lang="ca">codi font en D</comment>
- <comment xml:lang="cs">zdrojový kód v jazyce D</comment>
- <comment xml:lang="da">D-kildekode</comment>
- <comment xml:lang="de">D-Quelltext</comment>
- <comment xml:lang="el">Πηγαίος κώδικας D</comment>
- <comment xml:lang="en-GB">D source code</comment>
- <comment xml:lang="eo">D-fontkodo</comment>
- <comment xml:lang="es">código fuente en D</comment>
- <comment xml:lang="eu">D iturburu-kodea</comment>
- <comment xml:lang="fi">D-lähdekoodi</comment>
- <comment xml:lang="fo">D keldukota</comment>
- <comment xml:lang="fr">code source D</comment>
- <comment xml:lang="fur">codiç sorzint D</comment>
- <comment xml:lang="ga">cód foinseach D</comment>
- <comment xml:lang="gl">código fonte de D</comment>
- <comment xml:lang="he">קוד מקור לשפת D</comment>
- <comment xml:lang="hr">D izvorni kôd</comment>
- <comment xml:lang="hu">D-forráskód</comment>
- <comment xml:lang="ia">Codice-fonte D</comment>
- <comment xml:lang="id">Kode sumber D</comment>
- <comment xml:lang="it">Codice sorgente D</comment>
- <comment xml:lang="ja">D ソースコード</comment>
- <comment xml:lang="ka">D-ის საწყისი კოდი</comment>
- <comment xml:lang="kk">D бастапқы коды</comment>
- <comment xml:lang="ko">D 소스 코드</comment>
- <comment xml:lang="lt">D pradinis kodas</comment>
- <comment xml:lang="lv">D pirmkods</comment>
- <comment xml:lang="nb">D-kildekode</comment>
- <comment xml:lang="nl">D-broncode</comment>
- <comment xml:lang="nn">D-kjeldekode</comment>
- <comment xml:lang="oc">còde font D</comment>
- <comment xml:lang="pl">Kod źródłowy D</comment>
- <comment xml:lang="pt">código origem D</comment>
- <comment xml:lang="pt-BR">Código-fonte D</comment>
- <comment xml:lang="ro">Cod sursă D</comment>
- <comment xml:lang="ru">Исходный код D</comment>
- <comment xml:lang="sk">Zdrojový kód jazyka D</comment>
- <comment xml:lang="sl">Datoteka izvorne kode D</comment>
- <comment xml:lang="sq">Kod burues D</comment>
- <comment xml:lang="sr">Д изворни ко̂д</comment>
- <comment xml:lang="sv">D-källkod</comment>
- <comment xml:lang="tr">D kaynak kodu</comment>
- <comment xml:lang="uk">вихідний код мовою D</comment>
+ <comment xml:lang="zh_TW">D 源碼</comment>
+ <comment xml:lang="zh_CN">D 源代码</comment>
<comment xml:lang="vi">Mã nguồn D</comment>
- <comment xml:lang="zh-CN">D 源代码</comment>
- <comment xml:lang="zh-TW">D 源碼</comment>
+ <comment xml:lang="uk">початковий код мовою D</comment>
+ <comment xml:lang="tr">D kaynak kodu</comment>
+ <comment xml:lang="sv">D-källkod</comment>
+ <comment xml:lang="sr">Д изворни ко̂д</comment>
+ <comment xml:lang="sq">kod burim D</comment>
+ <comment xml:lang="sl">Datoteka izvorne kode D</comment>
+ <comment xml:lang="si">D මූල කේතය</comment>
+ <comment xml:lang="sk">Zdrojový kód jazyka D</comment>
+ <comment xml:lang="ru">Исходный код D</comment>
+ <comment xml:lang="ro">Cod sursă D</comment>
+ <comment xml:lang="pt_BR">Código-fonte D</comment>
+ <comment xml:lang="pt">código origem D</comment>
+ <comment xml:lang="pl">Kod źródłowy D</comment>
+ <comment xml:lang="oc">còde font D</comment>
+ <comment xml:lang="nn">D-kjeldekode</comment>
+ <comment xml:lang="nl">D-broncode</comment>
+ <comment xml:lang="nb">D-kildekode</comment>
+ <comment xml:lang="lv">D pirmkods</comment>
+ <comment xml:lang="lt">D pradinis kodas</comment>
+ <comment xml:lang="ko">D 소스 코드</comment>
+ <comment xml:lang="kk">D бастапқы коды</comment>
+ <comment xml:lang="ka">D-ის საწყისი კოდი</comment>
+ <comment xml:lang="ja">D ソースコード</comment>
+ <comment xml:lang="it">Codice sorgente D</comment>
+ <comment xml:lang="is">D frumkóði</comment>
+ <comment xml:lang="id">Kode sumber D</comment>
+ <comment xml:lang="ia">Codice-fonte D</comment>
+ <comment xml:lang="hu">D-forráskód</comment>
+ <comment xml:lang="hr">D izvorni kôd</comment>
+ <comment xml:lang="he">קוד מקור לשפת D</comment>
+ <comment xml:lang="gl">código fonte de D</comment>
+ <comment xml:lang="ga">cód foinseach D</comment>
+ <comment xml:lang="fur">codiç sorzint D</comment>
+ <comment xml:lang="fr">code source D</comment>
+ <comment xml:lang="fo">D keldukota</comment>
+ <comment xml:lang="fi">D-lähdekoodi</comment>
+ <comment xml:lang="eu">D iturburu-kodea</comment>
+ <comment xml:lang="es">código fuente en D</comment>
+ <comment xml:lang="eo">D-fontkodo</comment>
+ <comment xml:lang="en_GB">D source code</comment>
+ <comment xml:lang="el">Πηγαίος κώδικας D</comment>
+ <comment xml:lang="de">D-Quelltext</comment>
+ <comment xml:lang="da">D-kildekode</comment>
+ <comment xml:lang="cs">zdrojový kód v jazyce D</comment>
+ <comment xml:lang="ca">codi font en D</comment>
+ <comment xml:lang="bg">Изходен код — D</comment>
+ <comment xml:lang="be@latin">Kryničny kod D</comment>
+ <comment xml:lang="be">зыходны код D</comment>
+ <comment xml:lang="ar">شفرة مصدر D</comment>
+ <comment xml:lang="af">D-bronkode</comment>
<sub-class-of type="text/x-csrc"/>
<glob pattern="*.d"/>
<glob pattern="*.di"/>
</mime-type>
<mime-type type="application/xml-dtd">
<comment>DTD file</comment>
- <comment xml:lang="af">DTD-lêer</comment>
- <comment xml:lang="ar">ملف DTD</comment>
- <comment xml:lang="be-Latn">Fajł DTD</comment>
- <comment xml:lang="bg">Документ — DTD</comment>
- <comment xml:lang="ca">fitxer DTD</comment>
- <comment xml:lang="cs">soubor DTD</comment>
- <comment xml:lang="da">DTD-fil</comment>
- <comment xml:lang="de">DTD-Datei</comment>
- <comment xml:lang="el">Αρχείο DTD</comment>
- <comment xml:lang="en-GB">DTD file</comment>
- <comment xml:lang="eo">DTD-dosiero</comment>
- <comment xml:lang="es">archivo DTD</comment>
- <comment xml:lang="eu">DTD fitxategia</comment>
- <comment xml:lang="fi">DTD-tiedosto</comment>
- <comment xml:lang="fo">DTD fíla</comment>
- <comment xml:lang="fr">fichier DTD</comment>
- <comment xml:lang="fur">file DTD</comment>
- <comment xml:lang="ga">comhad DTD</comment>
- <comment xml:lang="gl">ficheiro DTD</comment>
- <comment xml:lang="he">מסמך DTD</comment>
- <comment xml:lang="hr">DTD datoteka</comment>
- <comment xml:lang="hu">DTD fájl</comment>
- <comment xml:lang="ia">File DTD</comment>
- <comment xml:lang="id">Berkas DTD</comment>
- <comment xml:lang="it">File DTD</comment>
- <comment xml:lang="ja">DTD ファイル</comment>
- <comment xml:lang="ka">DTD ფაილი</comment>
- <comment xml:lang="kk">DTD файлы</comment>
- <comment xml:lang="ko">DTD 파일</comment>
- <comment xml:lang="lt">DTD failas</comment>
- <comment xml:lang="lv">DTD datne</comment>
- <comment xml:lang="nb">DTD-fil</comment>
- <comment xml:lang="nl">DTD-bestand</comment>
- <comment xml:lang="nn">DTD-fil</comment>
- <comment xml:lang="oc">fichièr DTD</comment>
- <comment xml:lang="pl">Plik DTD</comment>
- <comment xml:lang="pt">ficheiro DTD</comment>
- <comment xml:lang="pt-BR">Arquivo DTD</comment>
- <comment xml:lang="ro">Fișier DTD</comment>
- <comment xml:lang="ru">Файл DTD</comment>
- <comment xml:lang="sk">Súbor DTD</comment>
- <comment xml:lang="sl">Datoteka DTD</comment>
- <comment xml:lang="sq">File DTD</comment>
- <comment xml:lang="sr">ДТД датотека</comment>
- <comment xml:lang="sv">DTD-fil</comment>
- <comment xml:lang="tr">DTD dosyası</comment>
- <comment xml:lang="uk">файл DTD</comment>
+ <comment xml:lang="zh_TW">DTD 檔</comment>
+ <comment xml:lang="zh_CN">DTD 文件</comment>
<comment xml:lang="vi">Tập tin DTD</comment>
- <comment xml:lang="zh-CN">DTD 文件</comment>
- <comment xml:lang="zh-TW">DTD 檔</comment>
+ <comment xml:lang="uk">файл DTD</comment>
+ <comment xml:lang="tr">DTD dosyası</comment>
+ <comment xml:lang="sv">DTD-fil</comment>
+ <comment xml:lang="sr">ДТД датотека</comment>
+ <comment xml:lang="sq">kartelë DTD</comment>
+ <comment xml:lang="sl">Datoteka DTD</comment>
+ <comment xml:lang="si">DTD ගොනුව</comment>
+ <comment xml:lang="sk">Súbor DTD</comment>
+ <comment xml:lang="ru">Файл DTD</comment>
+ <comment xml:lang="ro">Fișier DTD</comment>
+ <comment xml:lang="pt_BR">Arquivo DTD</comment>
+ <comment xml:lang="pt">ficheiro DTD</comment>
+ <comment xml:lang="pl">Plik DTD</comment>
+ <comment xml:lang="oc">fichièr DTD</comment>
+ <comment xml:lang="nn">DTD-fil</comment>
+ <comment xml:lang="nl">DTD-bestand</comment>
+ <comment xml:lang="nb">DTD-fil</comment>
+ <comment xml:lang="lv">DTD datne</comment>
+ <comment xml:lang="lt">DTD failas</comment>
+ <comment xml:lang="ko">DTD 파일</comment>
+ <comment xml:lang="kk">DTD файлы</comment>
+ <comment xml:lang="ka">DTD ფაილი</comment>
+ <comment xml:lang="ja">DTD ファイル</comment>
+ <comment xml:lang="it">File DTD</comment>
+ <comment xml:lang="is">DTD-skrá</comment>
+ <comment xml:lang="id">Berkas DTD</comment>
+ <comment xml:lang="ia">File DTD</comment>
+ <comment xml:lang="hu">DTD fájl</comment>
+ <comment xml:lang="hr">DTD datoteka</comment>
+ <comment xml:lang="he">מסמך DTD</comment>
+ <comment xml:lang="gl">ficheiro DTD</comment>
+ <comment xml:lang="ga">comhad DTD</comment>
+ <comment xml:lang="fur">file DTD</comment>
+ <comment xml:lang="fr">fichier DTD</comment>
+ <comment xml:lang="fo">DTD fíla</comment>
+ <comment xml:lang="fi">DTD-tiedosto</comment>
+ <comment xml:lang="eu">DTD fitxategia</comment>
+ <comment xml:lang="es">archivo DTD</comment>
+ <comment xml:lang="eo">DTD-dosiero</comment>
+ <comment xml:lang="en_GB">DTD file</comment>
+ <comment xml:lang="el">Αρχείο DTD</comment>
+ <comment xml:lang="de">DTD-Datei</comment>
+ <comment xml:lang="da">DTD-fil</comment>
+ <comment xml:lang="cs">soubor DTD</comment>
+ <comment xml:lang="ca">fitxer DTD</comment>
+ <comment xml:lang="bg">Документ — DTD</comment>
+ <comment xml:lang="be@latin">Fajł DTD</comment>
+ <comment xml:lang="be">файл DTD</comment>
+ <comment xml:lang="ar">ملف DTD</comment>
+ <comment xml:lang="af">DTD-lêer</comment>
<acronym>DTD</acronym>
<expanded-acronym>Document Type Definition</expanded-acronym>
<sub-class-of type="text/plain"/>
@@ -35233,232 +36015,275 @@ command to generate the output files.
</mime-type>
<mime-type type="text/x-eiffel">
<comment>Eiffel source code</comment>
- <comment xml:lang="af">Eiffel-bronkode</comment>
- <comment xml:lang="ar">شفرة مصدر Eiffel</comment>
- <comment xml:lang="be-Latn">Kryničny kod Eiffel</comment>
- <comment xml:lang="bg">Изходен код — Eiffel</comment>
- <comment xml:lang="ca">codi font en Eiffel</comment>
- <comment xml:lang="cs">zdrojový kód v jazyce Eiffel</comment>
- <comment xml:lang="da">Eiffel-kildekode</comment>
- <comment xml:lang="de">Eiffel-Quelltext</comment>
- <comment xml:lang="el">Πηγαίος κώδικας Eiffel</comment>
- <comment xml:lang="en-GB">Eiffel source code</comment>
- <comment xml:lang="eo">Eiffel-fontkodo</comment>
- <comment xml:lang="es">código fuente en Eiffel</comment>
- <comment xml:lang="eu">Eiffel iturburu-kodea</comment>
- <comment xml:lang="fi">Eiffel-lähdekoodi</comment>
- <comment xml:lang="fo">Eiffel keldukota</comment>
- <comment xml:lang="fr">code source Eiffel</comment>
- <comment xml:lang="fur">codiç sorzint Eiffel</comment>
- <comment xml:lang="ga">cód foinseach Eiffel</comment>
- <comment xml:lang="gl">código fone de Eiffel</comment>
- <comment xml:lang="he">קוד מקור של Eiffel</comment>
- <comment xml:lang="hr">Eiffel izvorni kôd</comment>
- <comment xml:lang="hu">Eiffel forráskód</comment>
- <comment xml:lang="ia">Codice-fonte Eiffel</comment>
- <comment xml:lang="id">Kode sumber Eiffel</comment>
- <comment xml:lang="it">Codice sorgente Eiffel</comment>
- <comment xml:lang="ja">Eiffel ソースコード</comment>
- <comment xml:lang="ka">Eiffel-ის საწყისი კოდი</comment>
- <comment xml:lang="kk">Eiffel бастапқы коды</comment>
- <comment xml:lang="ko">Eiffel 소스 코드</comment>
- <comment xml:lang="lt">Eiffel pirminis programos tekstas</comment>
- <comment xml:lang="lv">Eiffel pirmkods</comment>
- <comment xml:lang="nb">Eiffel-kildekode</comment>
- <comment xml:lang="nl">Eiffel-broncode</comment>
- <comment xml:lang="nn">Eiffel-kjeldekode</comment>
- <comment xml:lang="oc">còde font Eiffel</comment>
- <comment xml:lang="pl">Kod źródłowy Eiffel</comment>
- <comment xml:lang="pt">código origem Eiffel</comment>
- <comment xml:lang="pt-BR">Código-fonte Eiffel</comment>
- <comment xml:lang="ro">Cod sursă Eiffel</comment>
- <comment xml:lang="ru">Исходный код Eiffel</comment>
- <comment xml:lang="sk">Zdrojový kód Eiffel</comment>
- <comment xml:lang="sl">Datoteka izvorne kode Eiffel</comment>
- <comment xml:lang="sq">Kod burues Eiffel</comment>
- <comment xml:lang="sr">Ајфел изворни ко̂д</comment>
- <comment xml:lang="sv">Eiffel-källkod</comment>
- <comment xml:lang="tr">Eiffel kaynak kodu</comment>
- <comment xml:lang="uk">вихідний код мовою Eiffel</comment>
+ <comment xml:lang="zh_TW">Eiffel 源碼</comment>
+ <comment xml:lang="zh_CN">Eiffel 源代码</comment>
<comment xml:lang="vi">Mã nguồn Eiffel</comment>
- <comment xml:lang="zh-CN">Eiffel 源代码</comment>
- <comment xml:lang="zh-TW">Eiffel 源碼</comment>
+ <comment xml:lang="uk">початковий код мовою Eiffel</comment>
+ <comment xml:lang="tr">Eiffel kaynak kodu</comment>
+ <comment xml:lang="sv">Eiffel-källkod</comment>
+ <comment xml:lang="sr">Ајфел изворни ко̂д</comment>
+ <comment xml:lang="sq">kod burim Eiffel</comment>
+ <comment xml:lang="sl">Datoteka izvorne kode Eiffel</comment>
+ <comment xml:lang="si">අයිෆල් මූල කේතය</comment>
+ <comment xml:lang="sk">Zdrojový kód Eiffel</comment>
+ <comment xml:lang="ru">Исходный код Eiffel</comment>
+ <comment xml:lang="ro">Cod sursă Eiffel</comment>
+ <comment xml:lang="pt_BR">Código-fonte Eiffel</comment>
+ <comment xml:lang="pt">código origem Eiffel</comment>
+ <comment xml:lang="pl">Kod źródłowy Eiffel</comment>
+ <comment xml:lang="oc">còde font Eiffel</comment>
+ <comment xml:lang="nn">Eiffel-kjeldekode</comment>
+ <comment xml:lang="nl">Eiffel-broncode</comment>
+ <comment xml:lang="nb">Eiffel-kildekode</comment>
+ <comment xml:lang="lv">Eiffel pirmkods</comment>
+ <comment xml:lang="lt">Eiffel pirminis programos tekstas</comment>
+ <comment xml:lang="ko">Eiffel 소스 코드</comment>
+ <comment xml:lang="kk">Eiffel бастапқы коды</comment>
+ <comment xml:lang="ka">Eiffel-ის საწყისი კოდი</comment>
+ <comment xml:lang="ja">Eiffel ソースコード</comment>
+ <comment xml:lang="it">Codice sorgente Eiffel</comment>
+ <comment xml:lang="is">Eiffel frumkóði</comment>
+ <comment xml:lang="id">Kode sumber Eiffel</comment>
+ <comment xml:lang="ia">Codice-fonte Eiffel</comment>
+ <comment xml:lang="hu">Eiffel forráskód</comment>
+ <comment xml:lang="hr">Eiffel izvorni kôd</comment>
+ <comment xml:lang="he">קוד מקור של Eiffel</comment>
+ <comment xml:lang="gl">código fone de Eiffel</comment>
+ <comment xml:lang="ga">cód foinseach Eiffel</comment>
+ <comment xml:lang="fur">codiç sorzint Eiffel</comment>
+ <comment xml:lang="fr">code source Eiffel</comment>
+ <comment xml:lang="fo">Eiffel keldukota</comment>
+ <comment xml:lang="fi">Eiffel-lähdekoodi</comment>
+ <comment xml:lang="eu">Eiffel iturburu-kodea</comment>
+ <comment xml:lang="es">código fuente en Eiffel</comment>
+ <comment xml:lang="eo">Eiffel-fontkodo</comment>
+ <comment xml:lang="en_GB">Eiffel source code</comment>
+ <comment xml:lang="el">Πηγαίος κώδικας Eiffel</comment>
+ <comment xml:lang="de">Eiffel-Quelltext</comment>
+ <comment xml:lang="da">Eiffel-kildekode</comment>
+ <comment xml:lang="cs">zdrojový kód v jazyce Eiffel</comment>
+ <comment xml:lang="ca">codi font en Eiffel</comment>
+ <comment xml:lang="bg">Изходен код — Eiffel</comment>
+ <comment xml:lang="be@latin">Kryničny kod Eiffel</comment>
+ <comment xml:lang="be">зыходны код Eiffel</comment>
+ <comment xml:lang="ar">شفرة مصدر Eiffel</comment>
+ <comment xml:lang="af">Eiffel-bronkode</comment>
<sub-class-of type="text/plain"/>
<glob pattern="*.e"/>
<glob pattern="*.eif"/>
</mime-type>
<mime-type type="text/x-emacs-lisp">
<comment>Emacs Lisp source code</comment>
- <comment xml:lang="af">Emacs Lisp-bronkode</comment>
- <comment xml:lang="ar">شفرة مصدر Emacs Lisp</comment>
- <comment xml:lang="az">Emacs Lisp mənbə kodu</comment>
- <comment xml:lang="be-Latn">Kryničny kod Emacs Lisp</comment>
- <comment xml:lang="bg">Изходен код — Emacs Lisp</comment>
- <comment xml:lang="ca">codi font en Emacs Lisp</comment>
- <comment xml:lang="cs">zdrojový kód Emacs Lisp</comment>
- <comment xml:lang="cy">Ffynhonnell rhaglen EMACS LISP</comment>
- <comment xml:lang="da">Emacs Lisp-kildekode</comment>
- <comment xml:lang="de">Emacs-Lisp-Quelltext</comment>
- <comment xml:lang="el">Πηγαίος κώδικας Emacs Lisp</comment>
- <comment xml:lang="en-GB">Emacs Lisp source code</comment>
- <comment xml:lang="eo">fontkodo en Emacs Lisp</comment>
- <comment xml:lang="es">código fuente en Lisp de Emacs</comment>
- <comment xml:lang="eu">Emacs Lisp iturburu-kodea</comment>
- <comment xml:lang="fi">Emacs Lisp -lähdekoodi</comment>
- <comment xml:lang="fo">Emacs Lisp keldukota</comment>
- <comment xml:lang="fr">code source Emacs Lisp</comment>
- <comment xml:lang="fur">codiç sorzint Emacs Lisp</comment>
- <comment xml:lang="ga">cód foinseach Emacs Lisp</comment>
- <comment xml:lang="gl">código fonte de Emacs Lisp</comment>
- <comment xml:lang="he">קוד מקור של Emcas Lisp</comment>
- <comment xml:lang="hr">Emacs Lisp izvorni kôd</comment>
- <comment xml:lang="hu">Emacs Lisp-forráskód</comment>
- <comment xml:lang="ia">Codice-fonte Lisp de Emacs</comment>
- <comment xml:lang="id">Kode sumber Emacs Lisp</comment>
- <comment xml:lang="it">Codice sorgente Emacs Lisp</comment>
- <comment xml:lang="ja">Emacs Lisp ソースコード</comment>
- <comment xml:lang="ka">Emacs-ის Lisp საწყისი კოდი</comment>
- <comment xml:lang="kk">Emacs Lisp бастапқы коды</comment>
- <comment xml:lang="ko">Emacs Lisp 소스 코드</comment>
- <comment xml:lang="lt">Emacs Lisp pradinis kodas</comment>
- <comment xml:lang="lv">Emacs Lisp pirmkods</comment>
- <comment xml:lang="ms">Kod sumber Emacs Lisp</comment>
- <comment xml:lang="nb">Emacs Lisp-kildekode</comment>
- <comment xml:lang="nl">Emacs Lisp-broncode</comment>
- <comment xml:lang="nn">Emacs Lisp kjeldekode</comment>
- <comment xml:lang="oc">còde font Emacs Lisp</comment>
- <comment xml:lang="pl">Kod źródłowy Emacs Lisp</comment>
- <comment xml:lang="pt">código origem Emacs Lisp</comment>
- <comment xml:lang="pt-BR">Código-fonte Lisp do Emacs</comment>
- <comment xml:lang="ro">Cod sursă Emacs Lisp</comment>
- <comment xml:lang="ru">Исходный код Emacs Lisp</comment>
- <comment xml:lang="sk">Zdrojový kód Emacs Lisp</comment>
- <comment xml:lang="sl">Datoteka izvorne kode Emacs Lisp</comment>
- <comment xml:lang="sq">Kod burues Emacs Lisp</comment>
- <comment xml:lang="sr">Емакс Лисп изворни ко̂д</comment>
- <comment xml:lang="sv">Emacs Lisp-källkod</comment>
- <comment xml:lang="tr">Emacs Lisp kaynak kodu</comment>
- <comment xml:lang="uk">вихідний код мовою Emacs Lisp</comment>
+ <comment xml:lang="zh_TW">Emacs Lisp 源碼</comment>
+ <comment xml:lang="zh_CN">Emacs Lisp 源代码</comment>
<comment xml:lang="vi">Mã nguồn Lisp Emacs</comment>
- <comment xml:lang="zh-CN">Emacs Lisp 源代码</comment>
- <comment xml:lang="zh-TW">Emacs Lisp 源碼</comment>
+ <comment xml:lang="uk">початковий код мовою Emacs Lisp</comment>
+ <comment xml:lang="tr">Emacs Lisp kaynak kodu</comment>
+ <comment xml:lang="sv">Emacs Lisp-källkod</comment>
+ <comment xml:lang="sr">Емакс Лисп изворни ко̂д</comment>
+ <comment xml:lang="sq">kod burim Emacs Lisp</comment>
+ <comment xml:lang="sl">Datoteka izvorne kode Emacs Lisp</comment>
+ <comment xml:lang="si">Emacs Lisp මූලාශ්‍ර කේතය</comment>
+ <comment xml:lang="sk">Zdrojový kód Emacs Lisp</comment>
+ <comment xml:lang="ru">Исходный код Emacs Lisp</comment>
+ <comment xml:lang="ro">Cod sursă Emacs Lisp</comment>
+ <comment xml:lang="pt_BR">Código-fonte Lisp do Emacs</comment>
+ <comment xml:lang="pt">código origem Emacs Lisp</comment>
+ <comment xml:lang="pl">Kod źródłowy Emacs Lisp</comment>
+ <comment xml:lang="oc">còde font Emacs Lisp</comment>
+ <comment xml:lang="nn">Emacs Lisp kjeldekode</comment>
+ <comment xml:lang="nl">Emacs Lisp-broncode</comment>
+ <comment xml:lang="nb">Emacs Lisp-kildekode</comment>
+ <comment xml:lang="ms">Kod sumber Emacs Lisp</comment>
+ <comment xml:lang="lv">Emacs Lisp pirmkods</comment>
+ <comment xml:lang="lt">Emacs Lisp pradinis kodas</comment>
+ <comment xml:lang="ko">Emacs Lisp 소스 코드</comment>
+ <comment xml:lang="kk">Emacs Lisp бастапқы коды</comment>
+ <comment xml:lang="ka">Emacs-ის Lisp საწყისი კოდი</comment>
+ <comment xml:lang="ja">Emacs Lisp ソースコード</comment>
+ <comment xml:lang="it">Codice sorgente Emacs Lisp</comment>
+ <comment xml:lang="is">Emacs Lisp frumkóði</comment>
+ <comment xml:lang="id">Kode sumber Emacs Lisp</comment>
+ <comment xml:lang="ia">Codice-fonte Lisp de Emacs</comment>
+ <comment xml:lang="hu">Emacs Lisp-forráskód</comment>
+ <comment xml:lang="hr">Emacs Lisp izvorni kôd</comment>
+ <comment xml:lang="he">קוד מקור של Emcas Lisp</comment>
+ <comment xml:lang="gl">código fonte de Emacs Lisp</comment>
+ <comment xml:lang="ga">cód foinseach Emacs Lisp</comment>
+ <comment xml:lang="fur">codiç sorzint Emacs Lisp</comment>
+ <comment xml:lang="fr">code source Emacs Lisp</comment>
+ <comment xml:lang="fo">Emacs Lisp keldukota</comment>
+ <comment xml:lang="fi">Emacs Lisp -lähdekoodi</comment>
+ <comment xml:lang="eu">Emacs Lisp iturburu-kodea</comment>
+ <comment xml:lang="es">código fuente en Lisp de Emacs</comment>
+ <comment xml:lang="eo">fontkodo en Emacs Lisp</comment>
+ <comment xml:lang="en_GB">Emacs Lisp source code</comment>
+ <comment xml:lang="el">Πηγαίος κώδικας Emacs Lisp</comment>
+ <comment xml:lang="de">Emacs-Lisp-Quelltext</comment>
+ <comment xml:lang="da">Emacs Lisp-kildekode</comment>
+ <comment xml:lang="cy">Ffynhonnell rhaglen EMACS LISP</comment>
+ <comment xml:lang="cs">zdrojový kód Emacs Lisp</comment>
+ <comment xml:lang="ca">codi font en Emacs Lisp</comment>
+ <comment xml:lang="bg">Изходен код — Emacs Lisp</comment>
+ <comment xml:lang="be@latin">Kryničny kod Emacs Lisp</comment>
+ <comment xml:lang="be">зыходны код Emacs Lisp</comment>
+ <comment xml:lang="az">Emacs Lisp mənbə kodu</comment>
+ <comment xml:lang="ar">شفرة مصدر Emacs Lisp</comment>
+ <comment xml:lang="af">Emacs Lisp-bronkode</comment>
<sub-class-of type="text/plain"/>
- <magic priority="50">
+ <magic>
<match type="string" value="\012(" offset="0"/>
<match type="string" value=";ELC\023\000\000\000" offset="0"/>
</magic>
<glob pattern="*.el"/>
</mime-type>
+ <mime-type type="text/x-elixir">
+ <comment>Elixir source code</comment>
+ <comment xml:lang="zh_TW">Elixir 原始碼</comment>
+ <comment xml:lang="zh_CN">Elixir 源代码</comment>
+ <comment xml:lang="uk">початковий код мовою Elixir</comment>
+ <comment xml:lang="tr">Elixir kaynak kodu</comment>
+ <comment xml:lang="sv">Elixir-källkod</comment>
+ <comment xml:lang="sl">Izvorna koda Elixir</comment>
+ <comment xml:lang="si">Elixir මූල කේතය</comment>
+ <comment xml:lang="ru">Исходный код Elixir</comment>
+ <comment xml:lang="pt_BR">Código-fonte Elixir</comment>
+ <comment xml:lang="pl">Kod źródłowy Elixir</comment>
+ <comment xml:lang="nl">Elixir-broncode</comment>
+ <comment xml:lang="ko">Elixir 소스 코드</comment>
+ <comment xml:lang="kk">Elixir бастапқы коды</comment>
+ <comment xml:lang="ja">Elixir ソースコード</comment>
+ <comment xml:lang="it">Codice sorgente Elixir</comment>
+ <comment xml:lang="hr">Elixir izvorni kôd</comment>
+ <comment xml:lang="he">קוד מקור ב־Elixir</comment>
+ <comment xml:lang="gl">Código de fonte Elixir</comment>
+ <comment xml:lang="fi">Elixir-lähdekoodi</comment>
+ <comment xml:lang="eu">Elixir iturburu-kodea</comment>
+ <comment xml:lang="es">código fuente Elixir</comment>
+ <comment xml:lang="en_GB">Elixir source code</comment>
+ <comment xml:lang="de">Elixir-Quelltext</comment>
+ <comment xml:lang="be">зыходны код Elixir</comment>
+ <comment xml:lang="ar">شفرة مصدر Elixir</comment>
+ <sub-class-of type="text/plain"/>
+ <glob pattern="*.ex"/>
+ <glob pattern="*.exs"/>
+ </mime-type>
<mime-type type="text/x-erlang">
<comment>Erlang source code</comment>
- <comment xml:lang="af">Erlang-bronkode</comment>
- <comment xml:lang="ar">شفرة مصدر Erlang</comment>
- <comment xml:lang="be-Latn">Kryničny kod Erlang</comment>
- <comment xml:lang="bg">Изходен код — Erlang</comment>
- <comment xml:lang="ca">codi font en Erlang</comment>
- <comment xml:lang="cs">zdrojový kód v jazyce Erlang</comment>
- <comment xml:lang="da">Erlang-kildekode</comment>
- <comment xml:lang="de">Erlang-Quelltext</comment>
- <comment xml:lang="el">Πηγαίος κώδικας Erlang</comment>
- <comment xml:lang="en-GB">Erlang source code</comment>
- <comment xml:lang="eo">Erlang-fontkodo</comment>
- <comment xml:lang="es">código fuente en Erlang</comment>
- <comment xml:lang="eu">Erlang iturburu-kodea</comment>
- <comment xml:lang="fi">Erlang-lähdekoodi</comment>
- <comment xml:lang="fo">Erlang keldukota</comment>
- <comment xml:lang="fr">code source Erlang</comment>
- <comment xml:lang="fur">codiç sorzint Erlang</comment>
- <comment xml:lang="ga">cód foinseach Erlang</comment>
- <comment xml:lang="gl">código fonte de Erlang</comment>
- <comment xml:lang="he">קוד מקור של Erlang</comment>
- <comment xml:lang="hr">Erlang izvorni kôd</comment>
- <comment xml:lang="hu">Erlang forráskód</comment>
- <comment xml:lang="ia">Codice-fonte Erlang</comment>
- <comment xml:lang="id">Kode sumber Erlang</comment>
- <comment xml:lang="it">Codice sorgente Erlang</comment>
- <comment xml:lang="ja">Erlang ソースコード</comment>
- <comment xml:lang="ka">Erlang-ის საწყისი კოდი</comment>
- <comment xml:lang="kk">Erlang бастапқы коды</comment>
- <comment xml:lang="ko">Erlang 소스 코드</comment>
- <comment xml:lang="lt">Erlang pradinis kodas</comment>
- <comment xml:lang="lv">Erlang pirmkods</comment>
- <comment xml:lang="nb">Erlang-kildekode</comment>
- <comment xml:lang="nl">Erlang-broncode</comment>
- <comment xml:lang="nn">Erlang-kjeldekode</comment>
- <comment xml:lang="oc">còde font Erlang</comment>
- <comment xml:lang="pl">Kod źródłowy Erlang</comment>
- <comment xml:lang="pt">código origem Erlang</comment>
- <comment xml:lang="pt-BR">Código-fonte Erlang</comment>
- <comment xml:lang="ro">Cod sursă Erlang</comment>
- <comment xml:lang="ru">Исходный код Erlang</comment>
- <comment xml:lang="sk">Zdrojový kód Erlang</comment>
- <comment xml:lang="sl">Datoteka izvorne kode Erlang</comment>
- <comment xml:lang="sq">Kod burues Erlang</comment>
- <comment xml:lang="sr">Ерланг изворни ко̂д</comment>
- <comment xml:lang="sv">Erlang-källkod</comment>
- <comment xml:lang="tr">Erlang kaynak kodu</comment>
- <comment xml:lang="uk">вихідний код мовою Erlang</comment>
+ <comment xml:lang="zh_TW">Erlang 源碼</comment>
+ <comment xml:lang="zh_CN">Erlang 源代码</comment>
<comment xml:lang="vi">Mã nguồn Erlang</comment>
- <comment xml:lang="zh-CN">Erlang 源代码</comment>
- <comment xml:lang="zh-TW">Erlang 源碼</comment>
+ <comment xml:lang="uk">початковий код мовою Erlang</comment>
+ <comment xml:lang="tr">Erlang kaynak kodu</comment>
+ <comment xml:lang="sv">Erlang-källkod</comment>
+ <comment xml:lang="sr">Ерланг изворни ко̂д</comment>
+ <comment xml:lang="sq">kod burim Erlang</comment>
+ <comment xml:lang="sl">Datoteka izvorne kode Erlang</comment>
+ <comment xml:lang="si">Erlang මූල කේතය</comment>
+ <comment xml:lang="sk">Zdrojový kód Erlang</comment>
+ <comment xml:lang="ru">Исходный код Erlang</comment>
+ <comment xml:lang="ro">Cod sursă Erlang</comment>
+ <comment xml:lang="pt_BR">Código-fonte Erlang</comment>
+ <comment xml:lang="pt">código origem Erlang</comment>
+ <comment xml:lang="pl">Kod źródłowy Erlang</comment>
+ <comment xml:lang="oc">còde font Erlang</comment>
+ <comment xml:lang="nn">Erlang-kjeldekode</comment>
+ <comment xml:lang="nl">Erlang-broncode</comment>
+ <comment xml:lang="nb">Erlang-kildekode</comment>
+ <comment xml:lang="lv">Erlang pirmkods</comment>
+ <comment xml:lang="lt">Erlang pradinis kodas</comment>
+ <comment xml:lang="ko">Erlang 소스 코드</comment>
+ <comment xml:lang="kk">Erlang бастапқы коды</comment>
+ <comment xml:lang="ka">Erlang-ის საწყისი კოდი</comment>
+ <comment xml:lang="ja">Erlang ソースコード</comment>
+ <comment xml:lang="it">Codice sorgente Erlang</comment>
+ <comment xml:lang="is">Erlang frumkóði</comment>
+ <comment xml:lang="id">Kode sumber Erlang</comment>
+ <comment xml:lang="ia">Codice-fonte Erlang</comment>
+ <comment xml:lang="hu">Erlang forráskód</comment>
+ <comment xml:lang="hr">Erlang izvorni kôd</comment>
+ <comment xml:lang="he">קוד מקור של Erlang</comment>
+ <comment xml:lang="gl">código fonte de Erlang</comment>
+ <comment xml:lang="ga">cód foinseach Erlang</comment>
+ <comment xml:lang="fur">codiç sorzint Erlang</comment>
+ <comment xml:lang="fr">code source Erlang</comment>
+ <comment xml:lang="fo">Erlang keldukota</comment>
+ <comment xml:lang="fi">Erlang-lähdekoodi</comment>
+ <comment xml:lang="eu">Erlang iturburu-kodea</comment>
+ <comment xml:lang="es">código fuente en Erlang</comment>
+ <comment xml:lang="eo">Erlang-fontkodo</comment>
+ <comment xml:lang="en_GB">Erlang source code</comment>
+ <comment xml:lang="el">Πηγαίος κώδικας Erlang</comment>
+ <comment xml:lang="de">Erlang-Quelltext</comment>
+ <comment xml:lang="da">Erlang-kildekode</comment>
+ <comment xml:lang="cs">zdrojový kód v jazyce Erlang</comment>
+ <comment xml:lang="ca">codi font en Erlang</comment>
+ <comment xml:lang="bg">Изходен код — Erlang</comment>
+ <comment xml:lang="be@latin">Kryničny kod Erlang</comment>
+ <comment xml:lang="be">зыходны код Erlang</comment>
+ <comment xml:lang="ar">شفرة مصدر Erlang</comment>
+ <comment xml:lang="af">Erlang-bronkode</comment>
<sub-class-of type="text/plain"/>
<glob pattern="*.erl"/>
</mime-type>
<mime-type type="text/x-fortran">
<comment>Fortran source code</comment>
- <comment xml:lang="af">Fortran-bronkode</comment>
- <comment xml:lang="ar">شفرة مصدر Fortran</comment>
- <comment xml:lang="az">Fortran mənbə kodu</comment>
- <comment xml:lang="be-Latn">Kryničny kod Fortran</comment>
- <comment xml:lang="bg">Изходен код — Fortran</comment>
- <comment xml:lang="ca">codi font en Fortran</comment>
- <comment xml:lang="cs">zdrojový kód v jazyce Fortran</comment>
- <comment xml:lang="cy">Ffynhonnell rhaglen FORTRAN</comment>
- <comment xml:lang="da">Fortran-kildekode</comment>
- <comment xml:lang="de">Fortran-Quelltext</comment>
- <comment xml:lang="el">Πηγαίος κώδικας Fortran</comment>
- <comment xml:lang="en-GB">Fortran source code</comment>
- <comment xml:lang="eo">Fotran-fontkodo</comment>
- <comment xml:lang="es">código fuente en Fortran</comment>
- <comment xml:lang="eu">Fortran-en iturburu-kodea</comment>
- <comment xml:lang="fi">Fortran-lähdekoodi</comment>
- <comment xml:lang="fo">Fortran keldukota</comment>
- <comment xml:lang="fr">code source Fortran</comment>
- <comment xml:lang="fur">codiç sorzint Fortran</comment>
- <comment xml:lang="ga">cód foinseach Fortran</comment>
- <comment xml:lang="gl">código fonte de Fortran</comment>
- <comment xml:lang="he">קוד מקור של Fortran</comment>
- <comment xml:lang="hr">Fortran izvorni kôd</comment>
- <comment xml:lang="hu">Fortran-forráskód</comment>
- <comment xml:lang="ia">Codice-fonte Fortran</comment>
- <comment xml:lang="id">Kode sumber Fortran</comment>
- <comment xml:lang="it">Codice sorgente Fortran</comment>
- <comment xml:lang="ja">Fortran ソースコード</comment>
- <comment xml:lang="ka">Fortran-ის საწყისი კოდი</comment>
- <comment xml:lang="kk">Fortran бастапқы коды</comment>
- <comment xml:lang="ko">포트란 소스 코드</comment>
- <comment xml:lang="lt">Fortran pradinis kodas</comment>
- <comment xml:lang="lv">Fortran pirmkods</comment>
- <comment xml:lang="ms">kod sumber Fortran</comment>
- <comment xml:lang="nb">Fortran-kildekode</comment>
- <comment xml:lang="nl">Fortran-broncode</comment>
- <comment xml:lang="nn">Fortran-kjeldekode</comment>
- <comment xml:lang="oc">còde font Fortran</comment>
- <comment xml:lang="pl">Kod źródłowy Fortran</comment>
- <comment xml:lang="pt">código origem Fortran</comment>
- <comment xml:lang="pt-BR">Código-fonte Fortran</comment>
- <comment xml:lang="ro">Cod sursă Fortran</comment>
- <comment xml:lang="ru">Исходный код Fortran</comment>
- <comment xml:lang="sk">Zdrojový kód Fortran</comment>
- <comment xml:lang="sl">Datoteka izvorne kode Fortran</comment>
- <comment xml:lang="sq">Kod burues Fortran</comment>
- <comment xml:lang="sr">Фортран изворни ко̂д</comment>
- <comment xml:lang="sv">Fortran-källkod</comment>
- <comment xml:lang="tr">Fortran kaynak kodu</comment>
- <comment xml:lang="uk">вихідний код мовою Fortran</comment>
+ <comment xml:lang="zh_TW">Fortran 源碼</comment>
+ <comment xml:lang="zh_CN">Fortran 源代码</comment>
<comment xml:lang="vi">Mã nguồn Fortran</comment>
- <comment xml:lang="zh-CN">Fortran 源代码</comment>
- <comment xml:lang="zh-TW">Fortran 源碼</comment>
+ <comment xml:lang="uk">початковий код мовою Fortran</comment>
+ <comment xml:lang="tr">Fortran kaynak kodu</comment>
+ <comment xml:lang="sv">Fortran-källkod</comment>
+ <comment xml:lang="sr">Фортран изворни ко̂д</comment>
+ <comment xml:lang="sq">kod burim Fortran</comment>
+ <comment xml:lang="sl">Datoteka izvorne kode Fortran</comment>
+ <comment xml:lang="si">Fortran මූල කේතය</comment>
+ <comment xml:lang="sk">Zdrojový kód Fortran</comment>
+ <comment xml:lang="ru">Исходный код Fortran</comment>
+ <comment xml:lang="ro">Cod sursă Fortran</comment>
+ <comment xml:lang="pt_BR">Código-fonte Fortran</comment>
+ <comment xml:lang="pt">código origem Fortran</comment>
+ <comment xml:lang="pl">Kod źródłowy Fortran</comment>
+ <comment xml:lang="oc">còde font Fortran</comment>
+ <comment xml:lang="nn">Fortran-kjeldekode</comment>
+ <comment xml:lang="nl">Fortran-broncode</comment>
+ <comment xml:lang="nb">Fortran-kildekode</comment>
+ <comment xml:lang="ms">kod sumber Fortran</comment>
+ <comment xml:lang="lv">Fortran pirmkods</comment>
+ <comment xml:lang="lt">Fortran pradinis kodas</comment>
+ <comment xml:lang="ko">포트란 소스 코드</comment>
+ <comment xml:lang="kk">Fortran бастапқы коды</comment>
+ <comment xml:lang="ka">Fortran-ის საწყისი კოდი</comment>
+ <comment xml:lang="ja">Fortran ソースコード</comment>
+ <comment xml:lang="it">Codice sorgente Fortran</comment>
+ <comment xml:lang="is">Fortran frumkóði</comment>
+ <comment xml:lang="id">Kode sumber Fortran</comment>
+ <comment xml:lang="ia">Codice-fonte Fortran</comment>
+ <comment xml:lang="hu">Fortran-forráskód</comment>
+ <comment xml:lang="hr">Fortran izvorni kôd</comment>
+ <comment xml:lang="he">קוד מקור של Fortran</comment>
+ <comment xml:lang="gl">código fonte de Fortran</comment>
+ <comment xml:lang="ga">cód foinseach Fortran</comment>
+ <comment xml:lang="fur">codiç sorzint Fortran</comment>
+ <comment xml:lang="fr">code source Fortran</comment>
+ <comment xml:lang="fo">Fortran keldukota</comment>
+ <comment xml:lang="fi">Fortran-lähdekoodi</comment>
+ <comment xml:lang="eu">Fortran-en iturburu-kodea</comment>
+ <comment xml:lang="es">código fuente en Fortran</comment>
+ <comment xml:lang="eo">Fotran-fontkodo</comment>
+ <comment xml:lang="en_GB">Fortran source code</comment>
+ <comment xml:lang="el">Πηγαίος κώδικας Fortran</comment>
+ <comment xml:lang="de">Fortran-Quelltext</comment>
+ <comment xml:lang="da">Fortran-kildekode</comment>
+ <comment xml:lang="cy">Ffynhonnell rhaglen FORTRAN</comment>
+ <comment xml:lang="cs">zdrojový kód v jazyce Fortran</comment>
+ <comment xml:lang="ca">codi font en Fortran</comment>
+ <comment xml:lang="bg">Изходен код — Fortran</comment>
+ <comment xml:lang="be@latin">Kryničny kod Fortran</comment>
+ <comment xml:lang="be">зыходны код Fortran</comment>
+ <comment xml:lang="az">Fortran mənbə kodu</comment>
+ <comment xml:lang="ar">شفرة مصدر Fortran</comment>
+ <comment xml:lang="af">Fortran-bronkode</comment>
<sub-class-of type="text/plain"/>
<glob pattern="*.f"/>
<glob pattern="*.f90"/>
@@ -35467,249 +36292,192 @@ command to generate the output files.
</mime-type>
<mime-type type="text/x-genie">
<comment>Genie source code</comment>
- <comment xml:lang="af">Genie-bronkode</comment>
- <comment xml:lang="bg">Изходен код — Genie</comment>
- <comment xml:lang="ca">codi font en Genie</comment>
- <comment xml:lang="cs">zdrojový kód v jazyce Genie</comment>
- <comment xml:lang="da">Genie-kildekode</comment>
- <comment xml:lang="de">Genie-Quelltext</comment>
- <comment xml:lang="el">Πηγαίος κώδικας Genie</comment>
- <comment xml:lang="en-GB">Genie source code</comment>
- <comment xml:lang="es">código fuente en Genie</comment>
- <comment xml:lang="eu">Genie iturburu-kodea</comment>
- <comment xml:lang="fi">Genie-lähdekoodi</comment>
- <comment xml:lang="fr">code source Genie</comment>
- <comment xml:lang="fur">codiç sorzint Genie</comment>
- <comment xml:lang="ga">cód foinseach Genie</comment>
- <comment xml:lang="he">קוד מקור של Genie</comment>
- <comment xml:lang="hr">Genie izvorni kôd</comment>
- <comment xml:lang="hu">Genie forráskód</comment>
- <comment xml:lang="ia">Codice-fonte Genie</comment>
- <comment xml:lang="id">Kode sumber Genie</comment>
- <comment xml:lang="it">Codice sorgente Genie</comment>
- <comment xml:lang="kk">Genie бастапқы коды</comment>
- <comment xml:lang="ko">Genie 소스 코드</comment>
- <comment xml:lang="oc">còde font Genie</comment>
- <comment xml:lang="pl">Kod źródłowy Genie</comment>
- <comment xml:lang="pt">código origem Genie</comment>
- <comment xml:lang="pt-BR">Código-fonte Genie</comment>
- <comment xml:lang="ru">Исходный код Genie</comment>
- <comment xml:lang="sk">Zdrojový kód Genie</comment>
- <comment xml:lang="sl">Izvorna koda Genie</comment>
- <comment xml:lang="sr">Гение изворни ко̂д</comment>
- <comment xml:lang="sv">Genie-källkod</comment>
+ <comment xml:lang="zh_TW">Genie 源碼</comment>
+ <comment xml:lang="zh_CN">Genie 源代码</comment>
+ <comment xml:lang="uk">початковий код мовою Genie</comment>
<comment xml:lang="tr">Genie kaynak kodu</comment>
- <comment xml:lang="uk">вихідний код мовою Genie</comment>
- <comment xml:lang="zh-CN">Genie 源代码</comment>
- <comment xml:lang="zh-TW">Genie 源碼</comment>
+ <comment xml:lang="sv">Genie-källkod</comment>
+ <comment xml:lang="sr">Гение изворни ко̂д</comment>
+ <comment xml:lang="sq">kod burim Genie</comment>
+ <comment xml:lang="sl">Izvorna koda Genie</comment>
+ <comment xml:lang="si">Genie මූල කේතය</comment>
+ <comment xml:lang="sk">Zdrojový kód Genie</comment>
+ <comment xml:lang="ru">Исходный код Genie</comment>
+ <comment xml:lang="pt_BR">Código-fonte Genie</comment>
+ <comment xml:lang="pt">código origem Genie</comment>
+ <comment xml:lang="pl">Kod źródłowy Genie</comment>
+ <comment xml:lang="oc">còde font Genie</comment>
+ <comment xml:lang="nl">Genie-broncode</comment>
+ <comment xml:lang="ko">Genie 소스 코드</comment>
+ <comment xml:lang="kk">Genie бастапқы коды</comment>
+ <comment xml:lang="ja">Genie ソースコード</comment>
+ <comment xml:lang="it">Codice sorgente Genie</comment>
+ <comment xml:lang="is">Genie frumkóði</comment>
+ <comment xml:lang="id">Kode sumber Genie</comment>
+ <comment xml:lang="ia">Codice-fonte Genie</comment>
+ <comment xml:lang="hu">Genie forráskód</comment>
+ <comment xml:lang="hr">Genie izvorni kôd</comment>
+ <comment xml:lang="he">קוד מקור של Genie</comment>
+ <comment xml:lang="gl">Código de fonte Genie</comment>
+ <comment xml:lang="ga">cód foinseach Genie</comment>
+ <comment xml:lang="fur">codiç sorzint Genie</comment>
+ <comment xml:lang="fr">code source Genie</comment>
+ <comment xml:lang="fi">Genie-lähdekoodi</comment>
+ <comment xml:lang="eu">Genie iturburu-kodea</comment>
+ <comment xml:lang="es">código fuente en Genie</comment>
+ <comment xml:lang="en_GB">Genie source code</comment>
+ <comment xml:lang="el">Πηγαίος κώδικας Genie</comment>
+ <comment xml:lang="de">Genie-Quelltext</comment>
+ <comment xml:lang="da">Genie-kildekode</comment>
+ <comment xml:lang="cs">zdrojový kód v jazyce Genie</comment>
+ <comment xml:lang="ca">codi font en Genie</comment>
+ <comment xml:lang="bg">Изходен код — Genie</comment>
+ <comment xml:lang="be">зыходны код Genie</comment>
+ <comment xml:lang="ar">شفرة مصدر Genie</comment>
+ <comment xml:lang="af">Genie-bronkode</comment>
<sub-class-of type="text/plain"/>
<glob pattern="*.gs" case-sensitive="true"/>
<generic-icon name="text-x-generic"/>
</mime-type>
<mime-type type="text/x-gettext-translation">
- <comment>translation file</comment>
- <comment xml:lang="af">vertaallêer</comment>
- <comment xml:lang="ar">ملف الترجمة</comment>
- <comment xml:lang="ast">ficheru de traducción</comment>
- <comment xml:lang="be-Latn">fajł pierakładu</comment>
- <comment xml:lang="bg">Превод</comment>
- <comment xml:lang="ca">fitxer de traducció</comment>
- <comment xml:lang="cs">soubor překladu</comment>
- <comment xml:lang="da">oversættelsesfil</comment>
- <comment xml:lang="de">Übersetzungsdatei</comment>
- <comment xml:lang="el">Αρχείο μετάφρασης</comment>
- <comment xml:lang="en-GB">translation file</comment>
- <comment xml:lang="eo">tradukad-dosiero</comment>
- <comment xml:lang="es">archivo de traducción</comment>
- <comment xml:lang="eu">itzulpen-fitxategia</comment>
- <comment xml:lang="fi">käännöstiedosto</comment>
- <comment xml:lang="fo">týðingarfíla</comment>
- <comment xml:lang="fr">fichier de traduction</comment>
- <comment xml:lang="fur">file di traduzion</comment>
- <comment xml:lang="ga">comhad aistriúcháin</comment>
- <comment xml:lang="gl">ficheiro de tradución</comment>
- <comment xml:lang="he">קובץ תרגום</comment>
- <comment xml:lang="hr">Datoteka prijevoda</comment>
- <comment xml:lang="hu">fordítási fájl</comment>
- <comment xml:lang="ia">File de traduction</comment>
- <comment xml:lang="id">berkas terjemahan</comment>
- <comment xml:lang="it">File traduzione</comment>
- <comment xml:lang="ja">翻訳ファイル</comment>
- <comment xml:lang="ka">თარგმნის ფაილი</comment>
- <comment xml:lang="kk">аудармалар файлы</comment>
- <comment xml:lang="ko">번역 파일</comment>
- <comment xml:lang="lt">vertimo failas</comment>
- <comment xml:lang="lv">tulkošanas datne</comment>
- <comment xml:lang="nb">oversettelsesfil</comment>
- <comment xml:lang="nl">vertalingsbestand</comment>
- <comment xml:lang="nn">omsetjingsfil</comment>
- <comment xml:lang="oc">fichièr de traduccion</comment>
+ <comment>Translation file</comment>
+ <comment xml:lang="uk">Файл перекладу</comment>
+ <comment xml:lang="sv">Översättningsfil</comment>
+ <comment xml:lang="ru">Файл перевода</comment>
+ <comment xml:lang="pt_BR">Arquivo de tradução</comment>
<comment xml:lang="pl">Plik tłumaczenia</comment>
- <comment xml:lang="pt">ficheiro de tradução</comment>
- <comment xml:lang="pt-BR">Arquivo de tradução</comment>
- <comment xml:lang="ro">fișier traducere</comment>
- <comment xml:lang="ru">Файл переводов</comment>
- <comment xml:lang="sk">Súbor prekladu</comment>
- <comment xml:lang="sl">datoteka prevoda programa</comment>
- <comment xml:lang="sq">File përkthimesh</comment>
- <comment xml:lang="sr">датотека превода</comment>
- <comment xml:lang="sv">översättningsfil</comment>
- <comment xml:lang="tr">çeviri dosyası</comment>
- <comment xml:lang="uk">файл перекладу</comment>
- <comment xml:lang="vi">tập tin dịch</comment>
- <comment xml:lang="zh-CN">翻译文件</comment>
- <comment xml:lang="zh-TW">翻譯檔</comment>
+ <comment xml:lang="ja">翻訳文書</comment>
+ <comment xml:lang="it">File traduzione</comment>
+ <comment xml:lang="gl">Ficheiro de traducións</comment>
+ <comment xml:lang="eu">Itzulpen-fitxategia</comment>
+ <comment xml:lang="es">archivo de traducción</comment>
+ <comment xml:lang="de">Übersetzungsdatei</comment>
+ <comment xml:lang="be">файл перакладу</comment>
<sub-class-of type="text/plain"/>
<glob pattern="*.po"/>
<alias type="text/x-po"/>
<alias type="application/x-gettext"/>
</mime-type>
<mime-type type="text/x-gettext-translation-template">
- <comment>translation template</comment>
- <comment xml:lang="af">vertaalsjabloon</comment>
- <comment xml:lang="ar">قالب الترجمة</comment>
- <comment xml:lang="ast">plantía de traducción</comment>
- <comment xml:lang="be-Latn">šablon dla pierakładu</comment>
- <comment xml:lang="bg">Шаблон за преводи</comment>
- <comment xml:lang="ca">plantilla de traducció</comment>
- <comment xml:lang="cs">šablona překladu</comment>
- <comment xml:lang="da">oversættelsesskabelon</comment>
- <comment xml:lang="de">Übersetzungsvorlage</comment>
- <comment xml:lang="el">Πρότυπο μετάφρασης</comment>
- <comment xml:lang="en-GB">translation template</comment>
- <comment xml:lang="eo">tradukad-ŝablono</comment>
- <comment xml:lang="es">plantilla de traducción</comment>
- <comment xml:lang="eu">itzulpenen txantiloia</comment>
- <comment xml:lang="fi">käännösmalli</comment>
- <comment xml:lang="fo">týðingarformur</comment>
- <comment xml:lang="fr">modèle de traduction</comment>
- <comment xml:lang="fur">model di traduzion</comment>
- <comment xml:lang="ga">teimpléad aistriúcháin</comment>
- <comment xml:lang="gl">plantilla de tradución</comment>
- <comment xml:lang="he">תבנית תרגום</comment>
- <comment xml:lang="hr">Predložak prijevoda</comment>
- <comment xml:lang="hu">fordítási sablon</comment>
- <comment xml:lang="ia">Patrono de traduction</comment>
- <comment xml:lang="id">templat terjemahan</comment>
- <comment xml:lang="it">Modello di traduzione</comment>
- <comment xml:lang="ja">翻訳テンプレート</comment>
- <comment xml:lang="ka">თარგმნის შაბლონი</comment>
- <comment xml:lang="kk">аудармалар үлгісі</comment>
- <comment xml:lang="ko">메시지 번역 서식</comment>
- <comment xml:lang="lt">vertimo šablonas</comment>
- <comment xml:lang="lv">tulkošanas veidne</comment>
- <comment xml:lang="nb">mal for oversetting</comment>
- <comment xml:lang="nl">vertalingssjabloon</comment>
- <comment xml:lang="nn">omsetjingsmal</comment>
- <comment xml:lang="oc">modèl de traduccion</comment>
- <comment xml:lang="pl">Szablon tłumaczenia</comment>
- <comment xml:lang="pt">modelo de tradução</comment>
- <comment xml:lang="pt-BR">Modelo de tradução</comment>
- <comment xml:lang="ro">șablon de traducere</comment>
- <comment xml:lang="ru">Шаблон переводов</comment>
- <comment xml:lang="sk">Šablóna prekladu</comment>
- <comment xml:lang="sl">predloga datoteke prevoda programa</comment>
- <comment xml:lang="sq">Model përkthimesh</comment>
- <comment xml:lang="sr">шаблон превода</comment>
- <comment xml:lang="sv">översättningsmall</comment>
- <comment xml:lang="tr">çeviri şablonu</comment>
+ <comment>Translation template</comment>
<comment xml:lang="uk">шаблон перекладу</comment>
- <comment xml:lang="vi">mẫu dịch</comment>
- <comment xml:lang="zh-CN">翻译模板</comment>
- <comment xml:lang="zh-TW">翻譯模版</comment>
+ <comment xml:lang="sv">Översättningsmall</comment>
+ <comment xml:lang="ru">Шаблон перевода</comment>
+ <comment xml:lang="pt_BR">Modelo de tradução</comment>
+ <comment xml:lang="pl">Szablon tłumaczenia</comment>
+ <comment xml:lang="ja">翻訳雛形</comment>
+ <comment xml:lang="it">Modello traduzione</comment>
+ <comment xml:lang="gl">Modelo de tradución</comment>
+ <comment xml:lang="eu">Itzulpen-txantiloia</comment>
+ <comment xml:lang="es">plantilla de traducciones</comment>
+ <comment xml:lang="de">Übersetzungsvorlage</comment>
+ <comment xml:lang="be">шаблон перакладу</comment>
<sub-class-of type="text/plain"/>
<glob pattern="*.pot"/>
<alias type="text/x-pot"/>
- <magic priority="50">
+ <magic>
<match type="string" value="#, fuzzy\nmsgid \&quot;\&quot;\nmsgstr \&quot;\&quot;\n\&quot;Project-Id-Version:" offset="0:256"/>
</magic>
</mime-type>
<mime-type type="text/x-gherkin">
<comment>Gherkin document</comment>
- <comment xml:lang="bg">Документ — Gherkin</comment>
- <comment xml:lang="ca">document Gherkin</comment>
- <comment xml:lang="da">Gherkin-dokument</comment>
- <comment xml:lang="de">Gherkin-Dokument</comment>
- <comment xml:lang="en-GB">Gherkin document</comment>
- <comment xml:lang="es">documento de Gherkin</comment>
- <comment xml:lang="eu">Gherkin dokumentua</comment>
- <comment xml:lang="fi">Gherkin-asiakirja</comment>
- <comment xml:lang="fr">document Gherkin</comment>
- <comment xml:lang="hr">Gherkin dokument</comment>
- <comment xml:lang="hu">Gherkin dokumentum</comment>
- <comment xml:lang="id">Dokumen Gherkin</comment>
- <comment xml:lang="it">Documento Gherkin</comment>
- <comment xml:lang="kk">Gherkin құжаты</comment>
- <comment xml:lang="ko">게르킨 문서</comment>
- <comment xml:lang="pl">Dokument Gherkin</comment>
- <comment xml:lang="pt-BR">Documento Gherkin</comment>
- <comment xml:lang="ru">Документ Gherkin</comment>
- <comment xml:lang="sk">Dokument Gherkin</comment>
- <comment xml:lang="sl">Dokument Gherkin</comment>
- <comment xml:lang="sv">Gherkin-dokument</comment>
- <comment xml:lang="tr">Gherkin belgesi</comment>
+ <comment xml:lang="zh_TW">Gherkin 文件</comment>
+ <comment xml:lang="zh_CN">Gherkin 文档</comment>
<comment xml:lang="uk">документ Gherkin</comment>
- <comment xml:lang="zh-CN">Gherkin 文档</comment>
- <comment xml:lang="zh-TW">Gherkin 文件</comment>
+ <comment xml:lang="tr">Gherkin belgesi</comment>
+ <comment xml:lang="sv">Gherkin-dokument</comment>
+ <comment xml:lang="sq">dokument Gherkin</comment>
+ <comment xml:lang="sl">Dokument Gherkin</comment>
+ <comment xml:lang="si">ගර්කින් ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument Gherkin</comment>
+ <comment xml:lang="ru">Документ Gherkin</comment>
+ <comment xml:lang="pt_BR">Documento Gherkin</comment>
+ <comment xml:lang="pl">Dokument Gherkin</comment>
+ <comment xml:lang="oc">document Gherkin</comment>
+ <comment xml:lang="nl">Gherkin-document</comment>
+ <comment xml:lang="ko">게르킨 문서</comment>
+ <comment xml:lang="kk">Gherkin құжаты</comment>
+ <comment xml:lang="ja">Gherkin ドキュメント</comment>
+ <comment xml:lang="it">Documento Gherkin</comment>
+ <comment xml:lang="is">Gherkin skjal</comment>
+ <comment xml:lang="id">Dokumen Gherkin</comment>
+ <comment xml:lang="hu">Gherkin dokumentum</comment>
+ <comment xml:lang="hr">Gherkin dokument</comment>
+ <comment xml:lang="he">מסמך Gherkin</comment>
+ <comment xml:lang="gl">Documento Gherkin</comment>
+ <comment xml:lang="fr">document Gherkin</comment>
+ <comment xml:lang="fi">Gherkin-asiakirja</comment>
+ <comment xml:lang="eu">Gherkin dokumentua</comment>
+ <comment xml:lang="es">documento de Gherkin</comment>
+ <comment xml:lang="en_GB">Gherkin document</comment>
+ <comment xml:lang="de">Gherkin-Dokument</comment>
+ <comment xml:lang="da">Gherkin-dokument</comment>
+ <comment xml:lang="ca">document Gherkin</comment>
+ <comment xml:lang="bg">Документ — Gherkin</comment>
+ <comment xml:lang="be">дакумент Gherkin</comment>
+ <comment xml:lang="ar">مستند Gherkin</comment>
<sub-class-of type="text/plain"/>
<glob pattern="*.feature"/>
</mime-type>
<mime-type type="text/html">
<comment>HTML document</comment>
- <comment xml:lang="af">HTML-dokument</comment>
- <comment xml:lang="ar">مستند HTML</comment>
- <comment xml:lang="ast">Documentu HTML</comment>
- <comment xml:lang="be-Latn">Dakument HTML</comment>
- <comment xml:lang="bg">Документ — HTML</comment>
- <comment xml:lang="ca">document HTML</comment>
- <comment xml:lang="cs">dokument HTML</comment>
- <comment xml:lang="da">HTML-dokument</comment>
- <comment xml:lang="de">HTML-Dokument</comment>
- <comment xml:lang="el">Έγγραφο HTML</comment>
- <comment xml:lang="en-GB">HTML document</comment>
- <comment xml:lang="eo">HTML-dokumento</comment>
- <comment xml:lang="es">documento HTML</comment>
- <comment xml:lang="eu">HTML dokumentua</comment>
- <comment xml:lang="fi">HTML-asiakirja</comment>
- <comment xml:lang="fo">HTML skjal</comment>
- <comment xml:lang="fr">document HTML</comment>
- <comment xml:lang="fur">document HTML</comment>
- <comment xml:lang="ga">cáipéis HTML</comment>
- <comment xml:lang="gl">documento HTML</comment>
- <comment xml:lang="he">מסמך HTML</comment>
- <comment xml:lang="hr">HTML dokument</comment>
- <comment xml:lang="hu">HTML dokumentum</comment>
- <comment xml:lang="ia">Documento HTML</comment>
- <comment xml:lang="id">Dokumen HTML</comment>
- <comment xml:lang="it">Documento HTML</comment>
- <comment xml:lang="ja">HTML ドキュメント</comment>
- <comment xml:lang="kk">HTML құжаты</comment>
- <comment xml:lang="ko">HTML 문서</comment>
- <comment xml:lang="lt">HTML dokumentas</comment>
- <comment xml:lang="lv">HTML dokuments</comment>
- <comment xml:lang="nb">HTML-dokument</comment>
- <comment xml:lang="nl">HTML-document</comment>
- <comment xml:lang="nn">HTML-dokument</comment>
- <comment xml:lang="oc">document HTML</comment>
- <comment xml:lang="pl">Dokument HTML</comment>
- <comment xml:lang="pt">documento HTML</comment>
- <comment xml:lang="pt-BR">Documento HTML</comment>
- <comment xml:lang="ro">Document HTML</comment>
- <comment xml:lang="ru">Документ HTML</comment>
- <comment xml:lang="sk">Dokument HTML</comment>
- <comment xml:lang="sl">Dokument HTML</comment>
- <comment xml:lang="sq">Dokument HTML</comment>
- <comment xml:lang="sr">ХТМЛ документ</comment>
- <comment xml:lang="sv">HTML-dokument</comment>
- <comment xml:lang="tr">HTML belgesi</comment>
- <comment xml:lang="uk">документ HTML</comment>
+ <comment xml:lang="zh_TW">HTML 文件</comment>
+ <comment xml:lang="zh_CN">HTML 文档</comment>
<comment xml:lang="vi">Tài liệu HTML</comment>
- <comment xml:lang="zh-CN">HTML 文档</comment>
- <comment xml:lang="zh-TW">HTML 文件</comment>
+ <comment xml:lang="uk">документ HTML</comment>
+ <comment xml:lang="tr">HTML belgesi</comment>
+ <comment xml:lang="sv">HTML-dokument</comment>
+ <comment xml:lang="sr">ХТМЛ документ</comment>
+ <comment xml:lang="sq">dokument HTML</comment>
+ <comment xml:lang="sl">Dokument HTML</comment>
+ <comment xml:lang="si">HTML ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument HTML</comment>
+ <comment xml:lang="ru">Документ HTML</comment>
+ <comment xml:lang="ro">Document HTML</comment>
+ <comment xml:lang="pt_BR">Documento HTML</comment>
+ <comment xml:lang="pt">documento HTML</comment>
+ <comment xml:lang="pl">Dokument HTML</comment>
+ <comment xml:lang="oc">document HTML</comment>
+ <comment xml:lang="nn">HTML-dokument</comment>
+ <comment xml:lang="nl">HTML-document</comment>
+ <comment xml:lang="nb">HTML-dokument</comment>
+ <comment xml:lang="lv">HTML dokuments</comment>
+ <comment xml:lang="lt">HTML dokumentas</comment>
+ <comment xml:lang="ko">HTML 문서</comment>
+ <comment xml:lang="kk">HTML құжаты</comment>
+ <comment xml:lang="ja">HTML ドキュメント</comment>
+ <comment xml:lang="it">Documento HTML</comment>
+ <comment xml:lang="is">HTML skjal</comment>
+ <comment xml:lang="id">Dokumen HTML</comment>
+ <comment xml:lang="ia">Documento HTML</comment>
+ <comment xml:lang="hu">HTML dokumentum</comment>
+ <comment xml:lang="hr">HTML dokument</comment>
+ <comment xml:lang="he">מסמך HTML</comment>
+ <comment xml:lang="gl">documento HTML</comment>
+ <comment xml:lang="ga">cáipéis HTML</comment>
+ <comment xml:lang="fur">document HTML</comment>
+ <comment xml:lang="fr">document HTML</comment>
+ <comment xml:lang="fo">HTML skjal</comment>
+ <comment xml:lang="fi">HTML-asiakirja</comment>
+ <comment xml:lang="eu">HTML dokumentua</comment>
+ <comment xml:lang="es">documento HTML</comment>
+ <comment xml:lang="eo">HTML-dokumento</comment>
+ <comment xml:lang="en_GB">HTML document</comment>
+ <comment xml:lang="el">Έγγραφο HTML</comment>
+ <comment xml:lang="de">HTML-Dokument</comment>
+ <comment xml:lang="da">HTML-dokument</comment>
+ <comment xml:lang="cs">dokument HTML</comment>
+ <comment xml:lang="ca">document HTML</comment>
+ <comment xml:lang="bg">Документ — HTML</comment>
+ <comment xml:lang="be@latin">Dakument HTML</comment>
+ <comment xml:lang="be">дакумент HTML</comment>
+ <comment xml:lang="ast">Documentu HTML</comment>
+ <comment xml:lang="ar">مستند HTML</comment>
+ <comment xml:lang="af">HTML-dokument</comment>
<acronym>HTML</acronym>
<expanded-acronym>HyperText Markup Language</expanded-acronym>
<sub-class-of type="text/plain"/>
- <magic priority="50">
+ <magic>
<match type="string" value="&lt;!DOCTYPE HTML" offset="0:256"/>
<match type="string" value="&lt;!doctype html" offset="0:256"/>
<match type="string" value="&lt;!DOCTYPE html" offset="0:256"/>
@@ -35733,30 +36501,55 @@ command to generate the output files.
<glob pattern="*.html" weight="80"/>
<glob pattern="*.htm" weight="80"/>
</mime-type>
+ <mime-type type="text/x-component">
+ <comment>HTML component</comment>
+ <comment xml:lang="uk">компонент HTML</comment>
+ <comment xml:lang="sv">HTML-komponent</comment>
+ <comment xml:lang="ru">Компонент HTML</comment>
+ <comment xml:lang="pl">Składnik HTML</comment>
+ <comment xml:lang="es">componente de HTML</comment>
+ <comment xml:lang="de">HTML-Komponente</comment>
+ <acronym>HTML</acronym>
+ <expanded-acronym>HyperText Markup Language</expanded-acronym>
+ <sub-class-of type="application/xml"/>
+ <generic-icon name="text-html"/>
+ <glob pattern="*.htc"/>
+ <root-XML namespaceURI="urn:HTMLComponent" localName="PUBLIC"/>
+ </mime-type>
<mime-type type="text/cache-manifest">
<comment>Web application cache file</comment>
- <comment xml:lang="bg">Кеш — уеб приложение</comment>
- <comment xml:lang="ca">fitxer de memòria cau d'aplicació Web</comment>
- <comment xml:lang="da">Webprogrammellemlagerfil</comment>
- <comment xml:lang="de">Webanwendungscache-Datei</comment>
- <comment xml:lang="en-GB">Web application cache file</comment>
- <comment xml:lang="es">archivo de antememoria de aplicación web</comment>
- <comment xml:lang="eu">Web-aplikazio katxe fitxategia</comment>
- <comment xml:lang="fi">Web-sovelluksen välimuistitiedosto</comment>
- <comment xml:lang="fr">fichier de cache d'application Web</comment>
- <comment xml:lang="hr"> Web aplikacija datoteka predmemorije </comment>
- <comment xml:lang="hu">Webalkalmazás gyorsítótárfájl</comment>
- <comment xml:lang="id">Berkas singgahan aplikasi web</comment>
- <comment xml:lang="it">File cache applicazione Web</comment>
- <comment xml:lang="kk">Веб қолданбасының кэш файлы</comment>
- <comment xml:lang="ko">웹 애플리케이션 캐시 파일</comment>
- <comment xml:lang="pl">Plik pamięci podręcznej aplikacji WWW</comment>
- <comment xml:lang="pt-BR">Arquivo de cache de aplicativo Web</comment>
- <comment xml:lang="ru">Файл кэша веб-приложения</comment>
- <comment xml:lang="sv">Webbapplikation cachefil</comment>
- <comment xml:lang="tr">Web uygulama önbellek dosyası</comment>
+ <comment xml:lang="zh_CN">Web 应用缓存文件</comment>
<comment xml:lang="uk">файл кешу вебпрограми</comment>
- <comment xml:lang="zh-CN">Web 应用缓存文件</comment>
+ <comment xml:lang="tr">Web uygulama önbellek dosyası</comment>
+ <comment xml:lang="sv">Webbapplikationscachefil</comment>
+ <comment xml:lang="sq">kartelë fshehtine aplikacioni Web</comment>
+ <comment xml:lang="si">වෙබ් යෙදුම් හැඹිලි ගොනුව</comment>
+ <comment xml:lang="ru">Файл кэша веб-приложения</comment>
+ <comment xml:lang="pt_BR">Arquivo de cache de aplicativo Web</comment>
+ <comment xml:lang="pl">Plik pamięci podręcznej aplikacji WWW</comment>
+ <comment xml:lang="oc">fichièr d'escondedor aplicacion Web</comment>
+ <comment xml:lang="nl">Cachebestand van webtoepassing</comment>
+ <comment xml:lang="ko">웹 애플리케이션 캐시 파일</comment>
+ <comment xml:lang="kk">Веб қолданбасының кэш файлы</comment>
+ <comment xml:lang="ja">Web アプリケーションキャッシュファイル</comment>
+ <comment xml:lang="it">File cache applicazione Web</comment>
+ <comment xml:lang="is">skyndiminnisskrá vefforrits</comment>
+ <comment xml:lang="id">Berkas singgahan aplikasi web</comment>
+ <comment xml:lang="hu">Webalkalmazás gyorsítótárfájl</comment>
+ <comment xml:lang="hr"> Web aplikacija datoteka predmemorije </comment>
+ <comment xml:lang="he">קובץ מטמון של תוכנית ברשת</comment>
+ <comment xml:lang="gl">Ficheiro de caché de aplicación web</comment>
+ <comment xml:lang="fr">fichier de cache d'application Web</comment>
+ <comment xml:lang="fi">Web-sovelluksen välimuistitiedosto</comment>
+ <comment xml:lang="eu">Web-aplikazio katxe fitxategia</comment>
+ <comment xml:lang="es">archivo de antememoria de aplicación web</comment>
+ <comment xml:lang="en_GB">Web application cache file</comment>
+ <comment xml:lang="de">Webanwendungs-Zwischenspeicherdatei</comment>
+ <comment xml:lang="da">Webprogrammellemlagerfil</comment>
+ <comment xml:lang="ca">fitxer de memòria cau d'aplicació Web</comment>
+ <comment xml:lang="bg">Кеш — уеб приложение</comment>
+ <comment xml:lang="be">файл кэша вэб-праграмы</comment>
+ <comment xml:lang="ar">ملف خبيئة تطبيق ويب</comment>
<sub-class-of type="text/plain"/>
<magic>
<match type="string" value="CACHE MANIFEST" offset="0">
@@ -35770,29 +36563,38 @@ command to generate the output files.
</mime-type>
<mime-type type="text/x-google-video-pointer">
<comment>Google Video Pointer shortcut</comment>
- <comment xml:lang="bg">Отметка — Google Video</comment>
- <comment xml:lang="ca">drecera d'apuntador a vídeo de Google</comment>
- <comment xml:lang="da">Google Video Pointer-genvej</comment>
- <comment xml:lang="de">Google-Video-Zeigerverweis</comment>
- <comment xml:lang="en-GB">Google Video Pointer shortcut</comment>
- <comment xml:lang="es">atajo de Google Video Pointer</comment>
- <comment xml:lang="eu">Google Video Pointer lasterbidea</comment>
- <comment xml:lang="fi">Google Video Pointer -pikakuvake</comment>
- <comment xml:lang="fr">raccourci de pointeur vidéo Google</comment>
- <comment xml:lang="hr">Google Video pretraživač prečac</comment>
- <comment xml:lang="hu">Google Video Pointer parancsikon</comment>
- <comment xml:lang="id">Pintasan Google Video Pointer</comment>
- <comment xml:lang="it">Scorciatoia Google Video Pointer</comment>
- <comment xml:lang="kk">Google Video Pointer жарлығы</comment>
- <comment xml:lang="ko">구글 동영상 포인터 바로 가기</comment>
- <comment xml:lang="pl">Skrót listy odtwarzania Google Video</comment>
- <comment xml:lang="pt-BR">Atalho do Google Video Pointer</comment>
- <comment xml:lang="ru">Ссылка Google Video Pointer</comment>
- <comment xml:lang="sv">Google Video Pointer-genväg</comment>
- <comment xml:lang="tr">Google Video Pointer kısayolu</comment>
+ <comment xml:lang="zh_CN">Google Video Pointer 快捷方式</comment>
<comment xml:lang="uk">скорочення вказівника відео Google</comment>
- <comment xml:lang="zh-CN">Google Video Pointer 快捷方式</comment>
- <magic priority="50">
+ <comment xml:lang="tr">Google Video Pointer kısayolu</comment>
+ <comment xml:lang="sv">Google Video Pointer-genväg</comment>
+ <comment xml:lang="sq">shkurtore Google Video Pointer</comment>
+ <comment xml:lang="si">Google Video Pointer කෙටිමඟ</comment>
+ <comment xml:lang="ru">Ссылка Google Video Pointer</comment>
+ <comment xml:lang="pt_BR">Atalho do Google Video Pointer</comment>
+ <comment xml:lang="pl">Skrót listy odtwarzania Google Video</comment>
+ <comment xml:lang="nl">Google Video Pointer-snelkoppeling</comment>
+ <comment xml:lang="ko">구글 동영상 포인터 바로 가기</comment>
+ <comment xml:lang="kk">Google Video Pointer жарлығы</comment>
+ <comment xml:lang="ja">Google Video Pointer ショートカット</comment>
+ <comment xml:lang="it">Scorciatoia Google Video Pointer</comment>
+ <comment xml:lang="is">Google Video Pointer flýtivísun</comment>
+ <comment xml:lang="id">Pintasan Google Video Pointer</comment>
+ <comment xml:lang="hu">Google Video Pointer parancsikon</comment>
+ <comment xml:lang="hr">Google Video pretraživač prečac</comment>
+ <comment xml:lang="he">קיצור למצביע וידאו של Google</comment>
+ <comment xml:lang="fr">raccourci de pointeur vidéo Google</comment>
+ <comment xml:lang="fi">Google Video Pointer -pikakuvake</comment>
+ <comment xml:lang="eu">Google Video Pointer lasterbidea</comment>
+ <comment xml:lang="es">atajo de Google Video Pointer</comment>
+ <comment xml:lang="en_GB">Google Video Pointer shortcut</comment>
+ <comment xml:lang="de">Google-Videozeiger-Verweis</comment>
+ <comment xml:lang="da">Google Video Pointer-genvej</comment>
+ <comment xml:lang="ca">drecera d'apuntador a vídeo de Google</comment>
+ <comment xml:lang="bg">Отметка — Google Video</comment>
+ <comment xml:lang="be">ярлык Google Video Pointer</comment>
+ <comment xml:lang="ar">اختصار مؤشر فيديو غوغل</comment>
+ <sub-class-of type="text/plain"/>
+ <magic>
<match type="string" value="#.download.the.free.Google.Video.Player" offset="0"/>
<match type="string" value="# download the free Google Video Player" offset="0"/>
</magic>
@@ -35801,285 +36603,259 @@ command to generate the output files.
</mime-type>
<mime-type type="text/x-haskell">
<comment>Haskell source code</comment>
- <comment xml:lang="af">Haskell-bronkode</comment>
- <comment xml:lang="ar">شفرة مصدر Haskell</comment>
- <comment xml:lang="az">Haskell mənbə kodu</comment>
- <comment xml:lang="be-Latn">Kryničny kod Haskell</comment>
- <comment xml:lang="bg">Изходен код — Haskell</comment>
- <comment xml:lang="ca">codi font en Haskell</comment>
- <comment xml:lang="cs">zdrojový kód v jazyce Haskell</comment>
- <comment xml:lang="cy">Ffynhonnell rhaglen Haskell</comment>
- <comment xml:lang="da">Haskell-kildekode</comment>
- <comment xml:lang="de">Haskell-Quelltext</comment>
- <comment xml:lang="el">Πηγαίος κώδικας Haskell</comment>
- <comment xml:lang="en-GB">Haskell source code</comment>
- <comment xml:lang="eo">Haskell-fontkodo</comment>
- <comment xml:lang="es">código fuente en Haskell</comment>
- <comment xml:lang="eu">Haskell iturburu-kodea</comment>
- <comment xml:lang="fi">Haskell-lähdekoodi</comment>
- <comment xml:lang="fo">Haskell keldukota</comment>
- <comment xml:lang="fr">code source Haskell</comment>
- <comment xml:lang="fur">codiç sorzint Haskell</comment>
- <comment xml:lang="ga">cód foinseach Haskell</comment>
- <comment xml:lang="gl">código fonte de Haskell</comment>
- <comment xml:lang="he">קוד מקור של Haskell</comment>
- <comment xml:lang="hr">Haskell izvorni kôd</comment>
- <comment xml:lang="hu">Haskell-forráskód</comment>
- <comment xml:lang="ia">Codice-fonte Haskell</comment>
- <comment xml:lang="id">Kode sumber Haskell</comment>
- <comment xml:lang="it">Codice sorgente Haskell</comment>
- <comment xml:lang="ja">Haskell ソースコード</comment>
- <comment xml:lang="kk">Haskell бастапқы коды</comment>
- <comment xml:lang="ko">Haskell 소스 코드</comment>
- <comment xml:lang="lt">Haskell pradinis kodas</comment>
- <comment xml:lang="lv">Haskell pirmkods</comment>
- <comment xml:lang="ms">Kod sumber Haskell</comment>
- <comment xml:lang="nb">Haskell-kildekode</comment>
- <comment xml:lang="nl">Haskell-broncode</comment>
- <comment xml:lang="nn">Haskell-kjeldekode</comment>
- <comment xml:lang="oc">còde font Haskell</comment>
- <comment xml:lang="pl">Kod źródłowy Haskell</comment>
- <comment xml:lang="pt">código origem Haskell</comment>
- <comment xml:lang="pt-BR">Código-fonte Haskell</comment>
- <comment xml:lang="ro">Cod sursă Haskell</comment>
- <comment xml:lang="ru">Исходный код Haskell</comment>
- <comment xml:lang="sk">Zdrojový kód Haskell</comment>
- <comment xml:lang="sl">Datoteka izvorne kode Haskell</comment>
- <comment xml:lang="sq">Kod burues Haskell</comment>
- <comment xml:lang="sr">Хаскел изворни ко̂д</comment>
- <comment xml:lang="sv">Haskell-källkod</comment>
- <comment xml:lang="tr">Haskell kaynak kodu</comment>
- <comment xml:lang="uk">вихідний код мовою Haskell</comment>
+ <comment xml:lang="zh_TW">Haskell 源碼</comment>
+ <comment xml:lang="zh_CN">Haskell 源代码</comment>
<comment xml:lang="vi">Mã nguồn Haskell</comment>
- <comment xml:lang="zh-CN">Haskell 源代码</comment>
- <comment xml:lang="zh-TW">Haskell 源碼</comment>
+ <comment xml:lang="uk">початковий код мовою Haskell</comment>
+ <comment xml:lang="tr">Haskell kaynak kodu</comment>
+ <comment xml:lang="sv">Haskell-källkod</comment>
+ <comment xml:lang="sr">Хаскел изворни ко̂д</comment>
+ <comment xml:lang="sq">kod burim Haskell</comment>
+ <comment xml:lang="sl">Datoteka izvorne kode Haskell</comment>
+ <comment xml:lang="si">Haskell මූල කේතය</comment>
+ <comment xml:lang="sk">Zdrojový kód Haskell</comment>
+ <comment xml:lang="ru">Исходный код Haskell</comment>
+ <comment xml:lang="ro">Cod sursă Haskell</comment>
+ <comment xml:lang="pt_BR">Código-fonte Haskell</comment>
+ <comment xml:lang="pt">código origem Haskell</comment>
+ <comment xml:lang="pl">Kod źródłowy Haskell</comment>
+ <comment xml:lang="oc">còde font Haskell</comment>
+ <comment xml:lang="nn">Haskell-kjeldekode</comment>
+ <comment xml:lang="nl">Haskell-broncode</comment>
+ <comment xml:lang="nb">Haskell-kildekode</comment>
+ <comment xml:lang="ms">Kod sumber Haskell</comment>
+ <comment xml:lang="lv">Haskell pirmkods</comment>
+ <comment xml:lang="lt">Haskell pradinis kodas</comment>
+ <comment xml:lang="ko">Haskell 소스 코드</comment>
+ <comment xml:lang="kk">Haskell бастапқы коды</comment>
+ <comment xml:lang="ja">Haskell ソースコード</comment>
+ <comment xml:lang="it">Codice sorgente Haskell</comment>
+ <comment xml:lang="is">Haskell frumkóði</comment>
+ <comment xml:lang="id">Kode sumber Haskell</comment>
+ <comment xml:lang="ia">Codice-fonte Haskell</comment>
+ <comment xml:lang="hu">Haskell-forráskód</comment>
+ <comment xml:lang="hr">Haskell izvorni kôd</comment>
+ <comment xml:lang="he">קוד מקור של Haskell</comment>
+ <comment xml:lang="gl">código fonte de Haskell</comment>
+ <comment xml:lang="ga">cód foinseach Haskell</comment>
+ <comment xml:lang="fur">codiç sorzint Haskell</comment>
+ <comment xml:lang="fr">code source Haskell</comment>
+ <comment xml:lang="fo">Haskell keldukota</comment>
+ <comment xml:lang="fi">Haskell-lähdekoodi</comment>
+ <comment xml:lang="eu">Haskell iturburu-kodea</comment>
+ <comment xml:lang="es">código fuente en Haskell</comment>
+ <comment xml:lang="eo">Haskell-fontkodo</comment>
+ <comment xml:lang="en_GB">Haskell source code</comment>
+ <comment xml:lang="el">Πηγαίος κώδικας Haskell</comment>
+ <comment xml:lang="de">Haskell-Quelltext</comment>
+ <comment xml:lang="da">Haskell-kildekode</comment>
+ <comment xml:lang="cy">Ffynhonnell rhaglen Haskell</comment>
+ <comment xml:lang="cs">zdrojový kód v jazyce Haskell</comment>
+ <comment xml:lang="ca">codi font en Haskell</comment>
+ <comment xml:lang="bg">Изходен код — Haskell</comment>
+ <comment xml:lang="be@latin">Kryničny kod Haskell</comment>
+ <comment xml:lang="be">зыходны код Haskell</comment>
+ <comment xml:lang="az">Haskell mənbə kodu</comment>
+ <comment xml:lang="ar">شفرة مصدر Haskell</comment>
+ <comment xml:lang="af">Haskell-bronkode</comment>
<sub-class-of type="text/plain"/>
<glob pattern="*.hs"/>
</mime-type>
<mime-type type="text/x-idl">
<comment>IDL document</comment>
- <comment xml:lang="af">IDL-dokument</comment>
- <comment xml:lang="ar">مستند IDL</comment>
- <comment xml:lang="ast">Documentu IDL</comment>
- <comment xml:lang="az">IDL sənədi</comment>
- <comment xml:lang="be-Latn">Dakument IDL</comment>
- <comment xml:lang="bg">Документ — IDL</comment>
- <comment xml:lang="ca">document IDL</comment>
- <comment xml:lang="cs">dokument IDL</comment>
- <comment xml:lang="cy">Dogfen IDL</comment>
- <comment xml:lang="da">IDL-dokument</comment>
- <comment xml:lang="de">IDL-Dokument</comment>
- <comment xml:lang="el">Έγγραφο IDL</comment>
- <comment xml:lang="en-GB">IDL document</comment>
- <comment xml:lang="eo">IDL-dokumento</comment>
- <comment xml:lang="es">documento IDL</comment>
- <comment xml:lang="eu">IDL dokumentua</comment>
- <comment xml:lang="fi">IDL-asiakirja</comment>
- <comment xml:lang="fo">IDL skjal</comment>
- <comment xml:lang="fr">document IDL</comment>
- <comment xml:lang="fur">document IDL</comment>
- <comment xml:lang="ga">cáipéis IDL</comment>
- <comment xml:lang="gl">documento IDL</comment>
- <comment xml:lang="he">מסמך IDL</comment>
- <comment xml:lang="hr">IDL dokument</comment>
- <comment xml:lang="hu">IDL-dokumentum</comment>
- <comment xml:lang="ia">Documento IDL</comment>
- <comment xml:lang="id">Dokumen IDL</comment>
- <comment xml:lang="it">Documento IDL</comment>
- <comment xml:lang="ja">IDL ドキュメント</comment>
- <comment xml:lang="kk">IDL құжаты</comment>
- <comment xml:lang="ko">IDL 문서</comment>
- <comment xml:lang="lt">IDL dokumentas</comment>
- <comment xml:lang="lv">IDL dokuments</comment>
- <comment xml:lang="ms">Dokumen IDL</comment>
- <comment xml:lang="nb">IDL-dokument</comment>
- <comment xml:lang="nl">IDL-document</comment>
- <comment xml:lang="nn">IDL-dokument</comment>
- <comment xml:lang="oc">document IDL</comment>
- <comment xml:lang="pl">Dokument IDL</comment>
- <comment xml:lang="pt">documento IDL</comment>
- <comment xml:lang="pt-BR">Documento IDL</comment>
- <comment xml:lang="ro">Document IDL</comment>
- <comment xml:lang="ru">Документ IDL</comment>
- <comment xml:lang="sk">Dokument IDL</comment>
- <comment xml:lang="sl">Dokument IDL</comment>
- <comment xml:lang="sq">Dokument IDL</comment>
- <comment xml:lang="sr">ИДЛ документ</comment>
- <comment xml:lang="sv">IDL-dokument</comment>
- <comment xml:lang="tr">IDL belgesi</comment>
- <comment xml:lang="uk">документ IDL</comment>
+ <comment xml:lang="zh_TW">IDL 文件</comment>
+ <comment xml:lang="zh_CN">IDL 文档</comment>
<comment xml:lang="vi">Tài liệu IDL</comment>
- <comment xml:lang="zh-CN">IDL 文档</comment>
- <comment xml:lang="zh-TW">IDL 文件</comment>
+ <comment xml:lang="uk">документ IDL</comment>
+ <comment xml:lang="tr">IDL belgesi</comment>
+ <comment xml:lang="sv">IDL-dokument</comment>
+ <comment xml:lang="sr">ИДЛ документ</comment>
+ <comment xml:lang="sq">dokument IDL</comment>
+ <comment xml:lang="sl">Dokument IDL</comment>
+ <comment xml:lang="si">IDL ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument IDL</comment>
+ <comment xml:lang="ru">Документ IDL</comment>
+ <comment xml:lang="ro">Document IDL</comment>
+ <comment xml:lang="pt_BR">Documento IDL</comment>
+ <comment xml:lang="pt">documento IDL</comment>
+ <comment xml:lang="pl">Dokument IDL</comment>
+ <comment xml:lang="oc">document IDL</comment>
+ <comment xml:lang="nn">IDL-dokument</comment>
+ <comment xml:lang="nl">IDL-document</comment>
+ <comment xml:lang="nb">IDL-dokument</comment>
+ <comment xml:lang="ms">Dokumen IDL</comment>
+ <comment xml:lang="lv">IDL dokuments</comment>
+ <comment xml:lang="lt">IDL dokumentas</comment>
+ <comment xml:lang="ko">IDL 문서</comment>
+ <comment xml:lang="kk">IDL құжаты</comment>
+ <comment xml:lang="ja">IDL ドキュメント</comment>
+ <comment xml:lang="it">Documento IDL</comment>
+ <comment xml:lang="is">IDL skjal</comment>
+ <comment xml:lang="id">Dokumen IDL</comment>
+ <comment xml:lang="ia">Documento IDL</comment>
+ <comment xml:lang="hu">IDL-dokumentum</comment>
+ <comment xml:lang="hr">IDL dokument</comment>
+ <comment xml:lang="he">מסמך IDL</comment>
+ <comment xml:lang="gl">documento IDL</comment>
+ <comment xml:lang="ga">cáipéis IDL</comment>
+ <comment xml:lang="fur">document IDL</comment>
+ <comment xml:lang="fr">document IDL</comment>
+ <comment xml:lang="fo">IDL skjal</comment>
+ <comment xml:lang="fi">IDL-asiakirja</comment>
+ <comment xml:lang="eu">IDL dokumentua</comment>
+ <comment xml:lang="es">documento IDL</comment>
+ <comment xml:lang="eo">IDL-dokumento</comment>
+ <comment xml:lang="en_GB">IDL document</comment>
+ <comment xml:lang="el">Έγγραφο IDL</comment>
+ <comment xml:lang="de">IDL-Dokument</comment>
+ <comment xml:lang="da">IDL-dokument</comment>
+ <comment xml:lang="cy">Dogfen IDL</comment>
+ <comment xml:lang="cs">dokument IDL</comment>
+ <comment xml:lang="ca">document IDL</comment>
+ <comment xml:lang="bg">Документ — IDL</comment>
+ <comment xml:lang="be@latin">Dakument IDL</comment>
+ <comment xml:lang="be">дакумент IDL</comment>
+ <comment xml:lang="az">IDL sənədi</comment>
+ <comment xml:lang="ast">Documentu IDL</comment>
+ <comment xml:lang="ar">مستند IDL</comment>
+ <comment xml:lang="af">IDL-dokument</comment>
<acronym>IDL</acronym>
<expanded-acronym>Interface Definition Language</expanded-acronym>
<sub-class-of type="text/plain"/>
<glob pattern="*.idl"/>
</mime-type>
<mime-type type="text/x-install">
- <comment>installation instructions</comment>
- <comment xml:lang="af">installasie-instruksies</comment>
- <comment xml:lang="ar">تعليمات التثبيت</comment>
- <comment xml:lang="ast">instrucciones d'instalación</comment>
- <comment xml:lang="be-Latn">instrukcyja dla instalavańnia</comment>
- <comment xml:lang="bg">Инструкции за инсталация</comment>
- <comment xml:lang="ca">instruccions d'instal·lació</comment>
- <comment xml:lang="cs">návod k instalaci</comment>
- <comment xml:lang="da">installationsinstruktioner</comment>
- <comment xml:lang="de">Installationsanleitung</comment>
- <comment xml:lang="el">Οδηγίες εγκατάστασης</comment>
- <comment xml:lang="en-GB">installation instructions</comment>
- <comment xml:lang="es">instrucciones de instalación</comment>
- <comment xml:lang="eu">instalazioaren instrukzioak</comment>
- <comment xml:lang="fi">asennusohjeet</comment>
- <comment xml:lang="fo">innleggingar vegleiðing</comment>
- <comment xml:lang="fr">instructions d'installation</comment>
- <comment xml:lang="fur">istruzions di instalazion</comment>
- <comment xml:lang="ga">treoracha suiteála</comment>
- <comment xml:lang="gl">instrucións de instalación</comment>
- <comment xml:lang="he">הוראות התקנה</comment>
- <comment xml:lang="hr">Upute za instalaciju</comment>
- <comment xml:lang="hu">telepítési utasítások</comment>
- <comment xml:lang="ia">Instructiones de installation</comment>
- <comment xml:lang="id">instruksi instalasi</comment>
- <comment xml:lang="it">Istruzioni di installazione</comment>
- <comment xml:lang="ja">ソフトウェアインストール説明</comment>
- <comment xml:lang="kk">бағдарламаны орнату нұсқаулары</comment>
- <comment xml:lang="ko">설치 방법</comment>
- <comment xml:lang="lt">diegimo instrukcijos</comment>
- <comment xml:lang="lv">instalācijas instrukcijas</comment>
- <comment xml:lang="nb">installationsinstruksjoner</comment>
- <comment xml:lang="nl">installatie-instructies</comment>
- <comment xml:lang="nn">installasjonsinstruksjonar</comment>
- <comment xml:lang="oc">instructions d'installacion</comment>
- <comment xml:lang="pl">Instrukcje instalacji</comment>
- <comment xml:lang="pt">instruções de instalação</comment>
- <comment xml:lang="pt-BR">Instruções de instalação</comment>
- <comment xml:lang="ro">instrucțiuni de instalare</comment>
+ <comment>Installation instructions</comment>
+ <comment xml:lang="uk">настанови щодо встановлення</comment>
+ <comment xml:lang="sv">Installationsinstruktioner</comment>
<comment xml:lang="ru">Инструкции по установке</comment>
- <comment xml:lang="sk">Návod na inštaláciu</comment>
- <comment xml:lang="sl">navodila namestitve</comment>
- <comment xml:lang="sq">Udhëzime instalimi</comment>
- <comment xml:lang="sr">упутства инсталације</comment>
- <comment xml:lang="sv">installationsinstruktioner</comment>
- <comment xml:lang="tr">kurulum yönergeleri</comment>
- <comment xml:lang="uk">інструкції з встановлення</comment>
- <comment xml:lang="vi">hướng dẫn cài đặt</comment>
- <comment xml:lang="zh-CN">软件安装指南</comment>
- <comment xml:lang="zh-TW">安裝指引</comment>
+ <comment xml:lang="pt_BR">Instruções de instalação</comment>
+ <comment xml:lang="pl">Instrukcje instalacji</comment>
+ <comment xml:lang="ja">導入指南</comment>
+ <comment xml:lang="it">Istruzioni di installazione</comment>
+ <comment xml:lang="eu">Instalazio-argibideak</comment>
+ <comment xml:lang="es">instrucciones de instalación</comment>
+ <comment xml:lang="de">Installationsanleitung</comment>
+ <comment xml:lang="be">інструкцыі для ўсталявання</comment>
<sub-class-of type="text/plain"/>
<glob pattern="INSTALL"/>
</mime-type>
<mime-type type="text/x-java">
<comment>Java source code</comment>
- <comment xml:lang="af">Java-bronkode</comment>
- <comment xml:lang="ar">شفرة مصدر Java</comment>
- <comment xml:lang="be-Latn">Kryničny kod Java</comment>
- <comment xml:lang="bg">Изходен код — Java</comment>
- <comment xml:lang="ca">codi font en Java</comment>
- <comment xml:lang="cs">zdrojový kód v jazyce Java</comment>
- <comment xml:lang="da">Java-kildekode</comment>
- <comment xml:lang="de">Java-Quelltext</comment>
- <comment xml:lang="el">Πηγαίος κώδικας Java</comment>
- <comment xml:lang="en-GB">Java source code</comment>
- <comment xml:lang="eo">Java-fontkodo</comment>
- <comment xml:lang="es">código fuente en Java</comment>
- <comment xml:lang="eu">Java iturburu-kodea</comment>
- <comment xml:lang="fi">Java-lähdekoodi</comment>
- <comment xml:lang="fo">Java keldukota</comment>
- <comment xml:lang="fr">code source Java</comment>
- <comment xml:lang="fur">codiç sorzint Java</comment>
- <comment xml:lang="ga">cód foinseach Java</comment>
- <comment xml:lang="gl">código fonte de Java</comment>
- <comment xml:lang="he">קוד מקור ב־Java</comment>
- <comment xml:lang="hr">Java izvorni kôd</comment>
- <comment xml:lang="hu">Java-forráskód</comment>
- <comment xml:lang="ia">Codice-fonte Java</comment>
- <comment xml:lang="id">Kode sumber Java</comment>
- <comment xml:lang="it">Codice sorgente Java</comment>
- <comment xml:lang="ja">Java ソースコード</comment>
- <comment xml:lang="kk">Java бастапқы коды</comment>
- <comment xml:lang="ko">Java 소스 코드</comment>
- <comment xml:lang="lt">Java pradinis kodas</comment>
- <comment xml:lang="lv">Java pirmkods</comment>
- <comment xml:lang="ms">Kod sumber Java</comment>
- <comment xml:lang="nb">Java-kildekode</comment>
- <comment xml:lang="nl">Java-broncode</comment>
- <comment xml:lang="nn">Java-kjeldekode</comment>
- <comment xml:lang="oc">còde font Java</comment>
- <comment xml:lang="pl">Kod źródłowy Java</comment>
- <comment xml:lang="pt">código origem Java</comment>
- <comment xml:lang="pt-BR">Código-fonte Java</comment>
- <comment xml:lang="ro">Cod sursă Java</comment>
- <comment xml:lang="ru">Исходный код Java</comment>
- <comment xml:lang="sk">Zdrojový kód Java</comment>
- <comment xml:lang="sl">Datoteka izvorne kode Java</comment>
- <comment xml:lang="sq">Kod burues Java</comment>
- <comment xml:lang="sr">Јава изворни ко̂д</comment>
- <comment xml:lang="sv">Java-källkod</comment>
- <comment xml:lang="tr">Java kaynak kodu</comment>
- <comment xml:lang="uk">вихідний код мовою Java</comment>
+ <comment xml:lang="zh_TW">Java 源碼</comment>
+ <comment xml:lang="zh_CN">Java 源代码</comment>
<comment xml:lang="vi">Mã nguồn Java</comment>
- <comment xml:lang="zh-CN">Java 源代码</comment>
- <comment xml:lang="zh-TW">Java 源碼</comment>
+ <comment xml:lang="uk">початковий код мовою Java</comment>
+ <comment xml:lang="tr">Java kaynak kodu</comment>
+ <comment xml:lang="sv">Java-källkod</comment>
+ <comment xml:lang="sr">Јава изворни ко̂д</comment>
+ <comment xml:lang="sq">kod burim Java</comment>
+ <comment xml:lang="sl">Datoteka izvorne kode Java</comment>
+ <comment xml:lang="si">ජාවා මූල කේතය</comment>
+ <comment xml:lang="sk">Zdrojový kód Java</comment>
+ <comment xml:lang="ru">Исходный код Java</comment>
+ <comment xml:lang="ro">Cod sursă Java</comment>
+ <comment xml:lang="pt_BR">Código-fonte Java</comment>
+ <comment xml:lang="pt">código origem Java</comment>
+ <comment xml:lang="pl">Kod źródłowy Java</comment>
+ <comment xml:lang="oc">còde font Java</comment>
+ <comment xml:lang="nn">Java-kjeldekode</comment>
+ <comment xml:lang="nl">Java-broncode</comment>
+ <comment xml:lang="nb">Java-kildekode</comment>
+ <comment xml:lang="ms">Kod sumber Java</comment>
+ <comment xml:lang="lv">Java pirmkods</comment>
+ <comment xml:lang="lt">Java pradinis kodas</comment>
+ <comment xml:lang="ko">Java 소스 코드</comment>
+ <comment xml:lang="kk">Java бастапқы коды</comment>
+ <comment xml:lang="ja">Java ソースコード</comment>
+ <comment xml:lang="it">Codice sorgente Java</comment>
+ <comment xml:lang="is">Java frumkóði</comment>
+ <comment xml:lang="id">Kode sumber Java</comment>
+ <comment xml:lang="ia">Codice-fonte Java</comment>
+ <comment xml:lang="hu">Java-forráskód</comment>
+ <comment xml:lang="hr">Java izvorni kôd</comment>
+ <comment xml:lang="he">קוד מקור ב־Java</comment>
+ <comment xml:lang="gl">código fonte de Java</comment>
+ <comment xml:lang="ga">cód foinseach Java</comment>
+ <comment xml:lang="fur">codiç sorzint Java</comment>
+ <comment xml:lang="fr">code source Java</comment>
+ <comment xml:lang="fo">Java keldukota</comment>
+ <comment xml:lang="fi">Java-lähdekoodi</comment>
+ <comment xml:lang="eu">Java iturburu-kodea</comment>
+ <comment xml:lang="es">código fuente en Java</comment>
+ <comment xml:lang="eo">Java-fontkodo</comment>
+ <comment xml:lang="en_GB">Java source code</comment>
+ <comment xml:lang="el">Πηγαίος κώδικας Java</comment>
+ <comment xml:lang="de">Java-Quelltext</comment>
+ <comment xml:lang="da">Java-kildekode</comment>
+ <comment xml:lang="cs">zdrojový kód v jazyce Java</comment>
+ <comment xml:lang="ca">codi font en Java</comment>
+ <comment xml:lang="bg">Изходен код — Java</comment>
+ <comment xml:lang="be@latin">Kryničny kod Java</comment>
+ <comment xml:lang="be">зыходны код Java</comment>
+ <comment xml:lang="ar">شفرة مصدر Java</comment>
+ <comment xml:lang="af">Java-bronkode</comment>
<sub-class-of type="text/x-csrc"/>
<glob pattern="*.java"/>
</mime-type>
<mime-type type="text/x-ldif">
<comment>LDIF address book</comment>
- <comment xml:lang="af">LDIF-adresboek</comment>
- <comment xml:lang="ar">دفتر عناوين LDIF</comment>
- <comment xml:lang="be-Latn">Adrasnaja kniha LDIF</comment>
- <comment xml:lang="bg">Адресна книга — LDIF</comment>
- <comment xml:lang="ca">llibreta d'adreces LDIF</comment>
- <comment xml:lang="cs">adresář LDIF</comment>
- <comment xml:lang="da">LDIF-adressebog</comment>
- <comment xml:lang="de">LDIF-Adressbuch</comment>
- <comment xml:lang="el">Βιβλίο διευθύνσεων LDIF</comment>
- <comment xml:lang="en-GB">LDIF address book</comment>
- <comment xml:lang="eo">LDIF-adresaro</comment>
- <comment xml:lang="es">libreta de direcciones LDIF</comment>
- <comment xml:lang="eu">LDIF helbide-liburua</comment>
- <comment xml:lang="fi">LDIF-osoitekirja</comment>
- <comment xml:lang="fo">LDIF adressubók</comment>
- <comment xml:lang="fr">carnet d'adresses LDIF</comment>
- <comment xml:lang="fur">rubriche LDIF</comment>
- <comment xml:lang="ga">leabhar seoltaí LDIF</comment>
- <comment xml:lang="gl">lista de enderezos LDIF</comment>
- <comment xml:lang="he">ספר כתובות של LDIF</comment>
- <comment xml:lang="hr">LDIF adresar</comment>
- <comment xml:lang="hu">LDIF címjegyzék</comment>
- <comment xml:lang="ia">Adressario LDIF</comment>
- <comment xml:lang="id">Buku alamat LDIF</comment>
- <comment xml:lang="it">Rubrica LDIF</comment>
- <comment xml:lang="ja">LDIF アドレス帳</comment>
- <comment xml:lang="kk">LDIF адрестер кітабы</comment>
- <comment xml:lang="ko">LDIF 주소록</comment>
- <comment xml:lang="lt">LDIF adresų knygelė</comment>
- <comment xml:lang="lv">LDIF adrešu grāmata</comment>
- <comment xml:lang="nb">LDIF-adressebok</comment>
- <comment xml:lang="nl">LDIF-adresboek</comment>
- <comment xml:lang="nn">LDIF-adressebok</comment>
- <comment xml:lang="oc">quasernet d'adreças LDIF</comment>
- <comment xml:lang="pl">Książka adresowa LDIF</comment>
- <comment xml:lang="pt">livro de endereços LDIF</comment>
- <comment xml:lang="pt-BR">Livro de endereços LDIF</comment>
- <comment xml:lang="ro">Agendă LDIF</comment>
- <comment xml:lang="ru">Адресная книга LDIF</comment>
- <comment xml:lang="sk">Adresár LDIF</comment>
- <comment xml:lang="sl">Datoteka imenika naslovov LDIF</comment>
- <comment xml:lang="sq">Rubrikë LDIF</comment>
- <comment xml:lang="sr">ЛДИФ адресар</comment>
- <comment xml:lang="sv">LDIF-adressbok</comment>
- <comment xml:lang="tr">LDIF adres defteri</comment>
- <comment xml:lang="uk">адресна книга LDIF</comment>
+ <comment xml:lang="zh_TW">LDIF 通訊錄</comment>
+ <comment xml:lang="zh_CN">LDIF 地址簿</comment>
<comment xml:lang="vi">Sổ địa chỉ LDIF</comment>
- <comment xml:lang="zh-CN">LDIF 地址簿</comment>
- <comment xml:lang="zh-TW">LDIF 通訊錄</comment>
+ <comment xml:lang="uk">адресна книга LDIF</comment>
+ <comment xml:lang="tr">LDIF adres defteri</comment>
+ <comment xml:lang="sv">LDIF-adressbok</comment>
+ <comment xml:lang="sr">ЛДИФ адресар</comment>
+ <comment xml:lang="sq">libër adresash LDIF</comment>
+ <comment xml:lang="sl">Datoteka imenika naslovov LDIF</comment>
+ <comment xml:lang="si">LDIF ලිපින පොත</comment>
+ <comment xml:lang="sk">Adresár LDIF</comment>
+ <comment xml:lang="ru">Адресная книга LDIF</comment>
+ <comment xml:lang="ro">Agendă LDIF</comment>
+ <comment xml:lang="pt_BR">Livro de endereços LDIF</comment>
+ <comment xml:lang="pt">livro de endereços LDIF</comment>
+ <comment xml:lang="pl">Książka adresowa LDIF</comment>
+ <comment xml:lang="oc">quasernet d'adreças LDIF</comment>
+ <comment xml:lang="nn">LDIF-adressebok</comment>
+ <comment xml:lang="nl">LDIF-adresboek</comment>
+ <comment xml:lang="nb">LDIF-adressebok</comment>
+ <comment xml:lang="lv">LDIF adrešu grāmata</comment>
+ <comment xml:lang="lt">LDIF adresų knygelė</comment>
+ <comment xml:lang="ko">LDIF 주소록</comment>
+ <comment xml:lang="kk">LDIF адрестер кітабы</comment>
+ <comment xml:lang="ja">LDIF アドレス帳</comment>
+ <comment xml:lang="it">Rubrica LDIF</comment>
+ <comment xml:lang="is">LDIF-nafnaskrá</comment>
+ <comment xml:lang="id">Buku alamat LDIF</comment>
+ <comment xml:lang="ia">Adressario LDIF</comment>
+ <comment xml:lang="hu">LDIF címjegyzék</comment>
+ <comment xml:lang="hr">LDIF adresar</comment>
+ <comment xml:lang="he">ספר כתובות של LDIF</comment>
+ <comment xml:lang="gl">lista de enderezos LDIF</comment>
+ <comment xml:lang="ga">leabhar seoltaí LDIF</comment>
+ <comment xml:lang="fur">rubriche LDIF</comment>
+ <comment xml:lang="fr">carnet d'adresses LDIF</comment>
+ <comment xml:lang="fo">LDIF adressubók</comment>
+ <comment xml:lang="fi">LDIF-osoitekirja</comment>
+ <comment xml:lang="eu">LDIF helbide-liburua</comment>
+ <comment xml:lang="es">libreta de direcciones LDIF</comment>
+ <comment xml:lang="eo">LDIF-adresaro</comment>
+ <comment xml:lang="en_GB">LDIF address book</comment>
+ <comment xml:lang="el">Βιβλίο διευθύνσεων LDIF</comment>
+ <comment xml:lang="de">LDIF-Adressbuch</comment>
+ <comment xml:lang="da">LDIF-adressebog</comment>
+ <comment xml:lang="cs">adresář LDIF</comment>
+ <comment xml:lang="ca">llibreta d'adreces LDIF</comment>
+ <comment xml:lang="bg">Адресна книга — LDIF</comment>
+ <comment xml:lang="be@latin">Adrasnaja kniha LDIF</comment>
+ <comment xml:lang="be">адрасная кніга LDIF</comment>
+ <comment xml:lang="ar">دفتر عناوين LDIF</comment>
+ <comment xml:lang="af">LDIF-adresboek</comment>
<acronym>LDIF</acronym>
<expanded-acronym>LDAP Data Interchange Format</expanded-acronym>
<sub-class-of type="text/plain"/>
- <magic priority="50">
+ <magic>
<match type="string" value="dn: cn=" offset="0"/>
<match type="string" value="dn: mail=" offset="0"/>
</magic>
@@ -36087,246 +36863,228 @@ command to generate the output files.
</mime-type>
<mime-type type="text/x-lilypond">
<comment>Lilypond music sheet</comment>
- <comment xml:lang="af">Lilypond-musiekblad</comment>
- <comment xml:lang="ar">صفحة موسيقى Lilypond</comment>
- <comment xml:lang="be-Latn">Muzyčny arkuš Lilypond</comment>
- <comment xml:lang="bg">Нотация на Lilypond</comment>
- <comment xml:lang="ca">full de música Lilypond</comment>
- <comment xml:lang="cs">notový papír Lilypond</comment>
- <comment xml:lang="da">Lilypondmusikkort</comment>
- <comment xml:lang="de">Lilypond-Notenblatt</comment>
- <comment xml:lang="el">Παρτιτούρα Lilypond</comment>
- <comment xml:lang="en-GB">Lilypond music sheet</comment>
- <comment xml:lang="es">partitura de LilyPond</comment>
- <comment xml:lang="eu">Lilypond musika-orria</comment>
- <comment xml:lang="fi">Lilypond-nuotit</comment>
- <comment xml:lang="fo">Lilypond tónleika ark</comment>
- <comment xml:lang="fr">partition musicale Lilypond</comment>
- <comment xml:lang="fur">spartît Lilypond</comment>
- <comment xml:lang="ga">bileog cheoil Lilypond</comment>
- <comment xml:lang="gl">folla de música de Lilypond</comment>
- <comment xml:lang="he">דף מוזיקה של Lilypond</comment>
- <comment xml:lang="hr">Lilypond glazbena ljestvica</comment>
- <comment xml:lang="hu">Lilypond kotta</comment>
- <comment xml:lang="ia">Partition musical Lilypond</comment>
- <comment xml:lang="id">Lembar musik Lilypond</comment>
- <comment xml:lang="it">Partitura Lilypond</comment>
- <comment xml:lang="ja">Lilypond 楽譜データ</comment>
- <comment xml:lang="kk">Lilypond музыка тізімі</comment>
- <comment xml:lang="ko">Lilypond 악보</comment>
- <comment xml:lang="lt">Lilypond muzikos lapas</comment>
- <comment xml:lang="lv">Lilypond mūzikas lapa</comment>
- <comment xml:lang="nl">Lilypond-muziekblad</comment>
- <comment xml:lang="nn">Lilypond noteark</comment>
- <comment xml:lang="oc">particion musicala Lilypond</comment>
- <comment xml:lang="pl">Plik partytury Lilypond</comment>
- <comment xml:lang="pt">folha de música Lilypond</comment>
- <comment xml:lang="pt-BR">Partitura do Lilypond</comment>
- <comment xml:lang="ro">Fișă muzică Lilypond</comment>
- <comment xml:lang="ru">Список музыки Lilypond</comment>
- <comment xml:lang="sk">Notový papier Lilypond</comment>
- <comment xml:lang="sl">Glasbena predloga Lilypond</comment>
- <comment xml:lang="sq">Partiturë Lilypond</comment>
- <comment xml:lang="sr">Лилипонд музички лист</comment>
- <comment xml:lang="sv">Lilypond-notblad</comment>
- <comment xml:lang="tr">Lilypond müzik sayfası</comment>
- <comment xml:lang="uk">нотний запис Lilypond</comment>
+ <comment xml:lang="zh_TW">Lilypond 樂譜</comment>
+ <comment xml:lang="zh_CN">Lilypond 乐谱</comment>
<comment xml:lang="vi">Bản nhạc Lilypond</comment>
- <comment xml:lang="zh-CN">Lilypond 乐谱</comment>
- <comment xml:lang="zh-TW">Lilypond 樂譜</comment>
+ <comment xml:lang="uk">нотний запис Lilypond</comment>
+ <comment xml:lang="tr">Lilypond müzik sayfası</comment>
+ <comment xml:lang="sv">Lilypond-notblad</comment>
+ <comment xml:lang="sr">Лилипонд музички лист</comment>
+ <comment xml:lang="sq">partiturë Lilypond</comment>
+ <comment xml:lang="sl">Glasbena predloga Lilypond</comment>
+ <comment xml:lang="si">ලිලිපොන්ඩ් සංගීත පත්රය</comment>
+ <comment xml:lang="sk">Notový papier Lilypond</comment>
+ <comment xml:lang="ru">Список музыки Lilypond</comment>
+ <comment xml:lang="ro">Fișă muzică Lilypond</comment>
+ <comment xml:lang="pt_BR">Partitura do Lilypond</comment>
+ <comment xml:lang="pt">folha de música Lilypond</comment>
+ <comment xml:lang="pl">Plik partytury Lilypond</comment>
+ <comment xml:lang="oc">particion musicala Lilypond</comment>
+ <comment xml:lang="nn">Lilypond noteark</comment>
+ <comment xml:lang="nl">Lilypond-muziekblad</comment>
+ <comment xml:lang="lv">Lilypond mūzikas lapa</comment>
+ <comment xml:lang="lt">Lilypond muzikos lapas</comment>
+ <comment xml:lang="ko">Lilypond 악보</comment>
+ <comment xml:lang="kk">Lilypond музыка тізімі</comment>
+ <comment xml:lang="ja">Lilypond 楽譜データ</comment>
+ <comment xml:lang="it">Partitura Lilypond</comment>
+ <comment xml:lang="is">LilyPond nótnablað</comment>
+ <comment xml:lang="id">Lembar musik Lilypond</comment>
+ <comment xml:lang="ia">Partition musical Lilypond</comment>
+ <comment xml:lang="hu">Lilypond kotta</comment>
+ <comment xml:lang="hr">Lilypond glazbena ljestvica</comment>
+ <comment xml:lang="he">דף מוזיקה של Lilypond</comment>
+ <comment xml:lang="gl">folla de música de Lilypond</comment>
+ <comment xml:lang="ga">bileog cheoil Lilypond</comment>
+ <comment xml:lang="fur">spartît Lilypond</comment>
+ <comment xml:lang="fr">partition musicale Lilypond</comment>
+ <comment xml:lang="fo">Lilypond tónleika ark</comment>
+ <comment xml:lang="fi">Lilypond-nuotit</comment>
+ <comment xml:lang="eu">Lilypond musika-orria</comment>
+ <comment xml:lang="es">partitura de LilyPond</comment>
+ <comment xml:lang="en_GB">Lilypond music sheet</comment>
+ <comment xml:lang="el">Παρτιτούρα Lilypond</comment>
+ <comment xml:lang="de">Lilypond-Notenblatt</comment>
+ <comment xml:lang="da">Lilypondmusikkort</comment>
+ <comment xml:lang="cs">notový papír Lilypond</comment>
+ <comment xml:lang="ca">full de música Lilypond</comment>
+ <comment xml:lang="bg">Нотация на Lilypond</comment>
+ <comment xml:lang="be@latin">Muzyčny arkuš Lilypond</comment>
+ <comment xml:lang="be">нотны запіс Lilypond</comment>
+ <comment xml:lang="ar">صفحة موسيقى Lilypond</comment>
+ <comment xml:lang="af">Lilypond-musiekblad</comment>
<glob pattern="*.ly"/>
<sub-class-of type="text/plain"/>
</mime-type>
<mime-type type="text/x-literate-haskell">
<comment>LHS source code</comment>
- <comment xml:lang="af">LHS-bronkode</comment>
- <comment xml:lang="ar">شفرة مصدر LHS</comment>
- <comment xml:lang="be-Latn">Kryničny kod LHS</comment>
- <comment xml:lang="bg">Изходен код — LHS</comment>
- <comment xml:lang="ca">codi font en LHS</comment>
- <comment xml:lang="cs">zdrojový kód LHS</comment>
- <comment xml:lang="da">LHS-kildekode</comment>
- <comment xml:lang="de">LHS-Quelltext</comment>
- <comment xml:lang="el">Πηγαίος κώδικας LHS</comment>
- <comment xml:lang="en-GB">LHS source code</comment>
- <comment xml:lang="eo">LHS-fontkodo</comment>
- <comment xml:lang="es">código fuente en LHS</comment>
- <comment xml:lang="eu">LHS iturburu-kodea</comment>
- <comment xml:lang="fi">LHS-lähdekoodi</comment>
- <comment xml:lang="fo">LHS keld</comment>
- <comment xml:lang="fr">code source LHS</comment>
- <comment xml:lang="fur">codiç sorzint LHS</comment>
- <comment xml:lang="ga">cód foinseach LHS</comment>
- <comment xml:lang="gl">código fonte en LHS</comment>
- <comment xml:lang="he">קוד מקור של LHS</comment>
- <comment xml:lang="hr">LHS izvorni kôd</comment>
- <comment xml:lang="hu">LHS forráskód</comment>
- <comment xml:lang="ia">Codice-fonte LHS</comment>
- <comment xml:lang="id">Kode sumber LHS</comment>
- <comment xml:lang="it">Codice sorgente LHS</comment>
- <comment xml:lang="ja">LHS ソースコード</comment>
- <comment xml:lang="kk">LHS бастапқы коды</comment>
- <comment xml:lang="ko">LHS 소스 코드</comment>
- <comment xml:lang="lt">LHS pradinis kodas</comment>
- <comment xml:lang="lv">LHS pirmkods</comment>
- <comment xml:lang="nb">LHS-kildekode</comment>
- <comment xml:lang="nl">LHS-broncode</comment>
- <comment xml:lang="nn">LHS-kjeldekode</comment>
- <comment xml:lang="oc">còde font LHS</comment>
- <comment xml:lang="pl">Kod źródłowy LHS</comment>
- <comment xml:lang="pt">código origem LHS</comment>
- <comment xml:lang="pt-BR">Código-fonte LHS</comment>
- <comment xml:lang="ro">Cod sursă LHS</comment>
- <comment xml:lang="ru">Исходный код LHS</comment>
- <comment xml:lang="sk">Zdrojový kód LHS</comment>
- <comment xml:lang="sl">Datoteka izvorne kode LHS</comment>
- <comment xml:lang="sq">Kod burues LHS</comment>
- <comment xml:lang="sr">ЛХС изворни ко̂д</comment>
- <comment xml:lang="sv">LHS-källkod</comment>
- <comment xml:lang="tr">LHS kaynak kodu</comment>
- <comment xml:lang="uk">вихідний код LHS</comment>
+ <comment xml:lang="zh_TW">LHS 源碼</comment>
+ <comment xml:lang="zh_CN">LHS 源代码</comment>
<comment xml:lang="vi">Mã nguồn LHS</comment>
- <comment xml:lang="zh-CN">LHS 源代码</comment>
- <comment xml:lang="zh-TW">LHS 源碼</comment>
+ <comment xml:lang="uk">початковий код LHS</comment>
+ <comment xml:lang="tr">LHS kaynak kodu</comment>
+ <comment xml:lang="sv">LHS-källkod</comment>
+ <comment xml:lang="sr">ЛХС изворни ко̂д</comment>
+ <comment xml:lang="sq">kod burim LHS</comment>
+ <comment xml:lang="sl">Datoteka izvorne kode LHS</comment>
+ <comment xml:lang="si">LHS මූල කේතය</comment>
+ <comment xml:lang="sk">Zdrojový kód LHS</comment>
+ <comment xml:lang="ru">Исходный код LHS</comment>
+ <comment xml:lang="ro">Cod sursă LHS</comment>
+ <comment xml:lang="pt_BR">Código-fonte LHS</comment>
+ <comment xml:lang="pt">código origem LHS</comment>
+ <comment xml:lang="pl">Kod źródłowy LHS</comment>
+ <comment xml:lang="oc">còde font LHS</comment>
+ <comment xml:lang="nn">LHS-kjeldekode</comment>
+ <comment xml:lang="nl">LHS-broncode</comment>
+ <comment xml:lang="nb">LHS-kildekode</comment>
+ <comment xml:lang="lv">LHS pirmkods</comment>
+ <comment xml:lang="lt">LHS pradinis kodas</comment>
+ <comment xml:lang="ko">LHS 소스 코드</comment>
+ <comment xml:lang="kk">LHS бастапқы коды</comment>
+ <comment xml:lang="ja">LHS ソースコード</comment>
+ <comment xml:lang="it">Codice sorgente LHS</comment>
+ <comment xml:lang="is">LHS frumkóði</comment>
+ <comment xml:lang="id">Kode sumber LHS</comment>
+ <comment xml:lang="ia">Codice-fonte LHS</comment>
+ <comment xml:lang="hu">LHS forráskód</comment>
+ <comment xml:lang="hr">LHS izvorni kôd</comment>
+ <comment xml:lang="he">קוד מקור של LHS</comment>
+ <comment xml:lang="gl">código fonte en LHS</comment>
+ <comment xml:lang="ga">cód foinseach LHS</comment>
+ <comment xml:lang="fur">codiç sorzint LHS</comment>
+ <comment xml:lang="fr">code source LHS</comment>
+ <comment xml:lang="fo">LHS keld</comment>
+ <comment xml:lang="fi">LHS-lähdekoodi</comment>
+ <comment xml:lang="eu">LHS iturburu-kodea</comment>
+ <comment xml:lang="es">código fuente en LHS</comment>
+ <comment xml:lang="eo">LHS-fontkodo</comment>
+ <comment xml:lang="en_GB">LHS source code</comment>
+ <comment xml:lang="el">Πηγαίος κώδικας LHS</comment>
+ <comment xml:lang="de">LHS-Quelltext</comment>
+ <comment xml:lang="da">LHS-kildekode</comment>
+ <comment xml:lang="cs">zdrojový kód LHS</comment>
+ <comment xml:lang="ca">codi font en LHS</comment>
+ <comment xml:lang="bg">Изходен код — LHS</comment>
+ <comment xml:lang="be@latin">Kryničny kod LHS</comment>
+ <comment xml:lang="be">зыходны код LHS</comment>
+ <comment xml:lang="ar">شفرة مصدر LHS</comment>
+ <comment xml:lang="af">LHS-bronkode</comment>
<acronym>LHS</acronym>
<expanded-acronym>Literate Haskell source code</expanded-acronym>
<sub-class-of type="text/plain"/>
<glob pattern="*.lhs"/>
</mime-type>
<mime-type type="text/x-log">
- <comment>application log</comment>
- <comment xml:lang="ar">سجل التطبيق</comment>
- <comment xml:lang="ast">rexistru d'aplicación</comment>
- <comment xml:lang="be-Latn">časopis aplikacyi</comment>
- <comment xml:lang="bg">Журнал със съобщения</comment>
- <comment xml:lang="ca">registre d'aplicació</comment>
- <comment xml:lang="cs">záznam aplikace</comment>
- <comment xml:lang="da">programlog</comment>
- <comment xml:lang="de">Anwendungsprotokoll</comment>
- <comment xml:lang="el">Καταγραφή εφαρμογή</comment>
- <comment xml:lang="en-GB">application log</comment>
- <comment xml:lang="eo">protokolo de aplikaĵo</comment>
- <comment xml:lang="es">registro de aplicación</comment>
- <comment xml:lang="eu">aplikazio egunkaria</comment>
- <comment xml:lang="fi">sovelluksen lokitiedosto</comment>
- <comment xml:lang="fo">nýtsluskipan logg</comment>
- <comment xml:lang="fr">journal d'application</comment>
- <comment xml:lang="fur">regjistri aplicazion</comment>
- <comment xml:lang="ga">logchomhad feidhmchláir</comment>
- <comment xml:lang="gl">rexistro de aplicativo</comment>
- <comment xml:lang="he">יומן יישום</comment>
- <comment xml:lang="hr">Zapis aplikacije</comment>
- <comment xml:lang="hu">alkalmazás naplója</comment>
- <comment xml:lang="ia">Registro de application</comment>
- <comment xml:lang="id">log aplikasi</comment>
- <comment xml:lang="it">Registro applicazione</comment>
- <comment xml:lang="ja">アプリケーションログ</comment>
- <comment xml:lang="kk">мәлімдемелер журналы</comment>
- <comment xml:lang="ko">프로그램 기록</comment>
- <comment xml:lang="lt">programos žurnalas</comment>
- <comment xml:lang="lv">lietotnes žurnāls</comment>
- <comment xml:lang="ms">Log aplikasi</comment>
- <comment xml:lang="nb">applikasjonslogg</comment>
- <comment xml:lang="nl">programma-logbestand</comment>
- <comment xml:lang="nn">programlogg</comment>
- <comment xml:lang="oc">jornal d'aplicacion</comment>
- <comment xml:lang="pl">Dziennik programu</comment>
- <comment xml:lang="pt">diário de aplicação</comment>
- <comment xml:lang="pt-BR">Registro de aplicativo</comment>
- <comment xml:lang="ro">înregistrare aplicație</comment>
- <comment xml:lang="ru">Журнал сообщений</comment>
- <comment xml:lang="sk">Záznam aplikácie</comment>
- <comment xml:lang="sl">dnevnik programa</comment>
- <comment xml:lang="sq">log i mesazheve të programit</comment>
- <comment xml:lang="sr">дневник програма</comment>
- <comment xml:lang="sv">programlogg</comment>
- <comment xml:lang="tr">uygulama günlüğü</comment>
+ <comment>Application log</comment>
<comment xml:lang="uk">журнал програми</comment>
- <comment xml:lang="vi">bản ghi ứng dụng</comment>
- <comment xml:lang="zh-CN">应用程序日志</comment>
- <comment xml:lang="zh-TW">程式紀錄檔</comment>
+ <comment xml:lang="sv">Programlogg</comment>
+ <comment xml:lang="ru">Журнал сообщений</comment>
+ <comment xml:lang="pl">Dziennik programu</comment>
+ <comment xml:lang="ja">アプリケーション記録</comment>
+ <comment xml:lang="it">Registro applicazione</comment>
+ <comment xml:lang="gl">Rexistro de aplicación</comment>
+ <comment xml:lang="eu">Aplikazio-egunkaria</comment>
+ <comment xml:lang="es">registro de aplicaciones</comment>
+ <comment xml:lang="de">Anwendungsprotokoll</comment>
+ <comment xml:lang="be">журнал праграмы</comment>
<sub-class-of type="text/plain"/>
<glob pattern="*.log"/>
</mime-type>
<mime-type type="text/x-makefile">
<comment>Makefile build file</comment>
- <comment xml:lang="bg">Проект — Makefile</comment>
- <comment xml:lang="ca">fitxer de construcció Makefile</comment>
- <comment xml:lang="da">Makefile build-fil</comment>
- <comment xml:lang="de">Makefile Build-Datei</comment>
- <comment xml:lang="en-GB">Makefile build file</comment>
- <comment xml:lang="es">archivo de generación Makefile</comment>
- <comment xml:lang="eu">Makefile build fitxategia</comment>
- <comment xml:lang="fi">Makefile rakennustiedosto</comment>
- <comment xml:lang="fr">fichier de construction Makefile</comment>
- <comment xml:lang="hr">Makefile datoteka izgradnje</comment>
- <comment xml:lang="hu">Makefile összeállítási fájl</comment>
- <comment xml:lang="id">Berkas build Makefile</comment>
- <comment xml:lang="it">File compilazione Makefile</comment>
- <comment xml:lang="kk">Makefile құрастыру файлы</comment>
- <comment xml:lang="ko">Makefile 빌드 파일</comment>
- <comment xml:lang="pl">Plik budowania Makefile</comment>
- <comment xml:lang="pt-BR">Arquivo de compilação Makefile</comment>
- <comment xml:lang="ru">Сборочный файл Makefile</comment>
- <comment xml:lang="sk">Súbor zostavenia Makefile</comment>
- <comment xml:lang="sv">Makefile-byggfil</comment>
- <comment xml:lang="tr">Makefile derleme dosyası</comment>
+ <comment xml:lang="zh_CN">Makefile 构建文件</comment>
<comment xml:lang="uk">файл збирання Makefile</comment>
- <comment xml:lang="zh-CN">Makefile 构建文件</comment>
+ <comment xml:lang="tr">Makefile derleme dosyası</comment>
+ <comment xml:lang="sv">Makefile-byggfil</comment>
+ <comment xml:lang="sq">kartelë montimi Makefile</comment>
+ <comment xml:lang="si">Makefile ගොඩනැගීමේ ගොනුව</comment>
+ <comment xml:lang="sk">Súbor zostavenia Makefile</comment>
+ <comment xml:lang="ru">Сборочный файл Makefile</comment>
+ <comment xml:lang="pt_BR">Arquivo de compilação Makefile</comment>
+ <comment xml:lang="pl">Plik budowania Makefile</comment>
+ <comment xml:lang="nl">Makefile-compilatiebestand</comment>
+ <comment xml:lang="ko">Makefile 빌드 파일</comment>
+ <comment xml:lang="kk">Makefile құрастыру файлы</comment>
+ <comment xml:lang="ja">Makefile ビルドファイル</comment>
+ <comment xml:lang="it">File compilazione Makefile</comment>
+ <comment xml:lang="is">Makefile byggingaskrá</comment>
+ <comment xml:lang="id">Berkas build Makefile</comment>
+ <comment xml:lang="hu">Makefile összeállítási fájl</comment>
+ <comment xml:lang="hr">Makefile datoteka izgradnje</comment>
+ <comment xml:lang="he">קובץ בניית Makefile</comment>
+ <comment xml:lang="gl">Ficheiro de construción Makefile</comment>
+ <comment xml:lang="fr">fichier de construction Makefile</comment>
+ <comment xml:lang="fi">Makefile-rakennustiedosto</comment>
+ <comment xml:lang="eu">Makefile build fitxategia</comment>
+ <comment xml:lang="es">archivo de generación Makefile</comment>
+ <comment xml:lang="en_GB">Makefile build file</comment>
+ <comment xml:lang="de">Makefile Build-Datei</comment>
+ <comment xml:lang="da">Makefile build-fil</comment>
+ <comment xml:lang="ca">fitxer de construcció Makefile</comment>
+ <comment xml:lang="bg">Проект — Makefile</comment>
+ <comment xml:lang="be">файл зборкі Makefile</comment>
+ <comment xml:lang="ar">ملف بناء Makefile</comment>
<sub-class-of type="text/plain"/>
<glob pattern="makefile"/>
<glob pattern="GNUmakefile"/>
<glob pattern="*.mk"/>
<glob pattern="*.mak"/>
<glob weight="10" pattern="Makefile.*"/>
- <magic priority="50">
+ <magic>
<match type="string" value="#!/usr/bin/make" offset="0"/>
<match type="string" value="#! /usr/bin/make" offset="0"/>
</magic>
</mime-type>
<mime-type type="text/markdown">
<comment>Markdown document</comment>
- <comment xml:lang="af">Markdown-dokument</comment>
- <comment xml:lang="ast">Documentu Markdown</comment>
- <comment xml:lang="bg">Документ — Markdown</comment>
- <comment xml:lang="ca">document Markdown</comment>
- <comment xml:lang="cs">dokument Markdown</comment>
- <comment xml:lang="da">Markdown-dokument</comment>
- <comment xml:lang="de">Markdown-Dokument</comment>
- <comment xml:lang="el">Έγγραφο Markdown</comment>
- <comment xml:lang="en-GB">Markdown document</comment>
- <comment xml:lang="es">documento Markdown</comment>
- <comment xml:lang="eu">Markdown dokumentua</comment>
- <comment xml:lang="fi">Markdown-asiakirja</comment>
- <comment xml:lang="fr">document Markdown</comment>
- <comment xml:lang="fur">document Markdown</comment>
- <comment xml:lang="ga">cáipéis Markdown</comment>
- <comment xml:lang="gl">documento de Markdown</comment>
- <comment xml:lang="he">מסמך Markdown</comment>
- <comment xml:lang="hr">Markdown dokument</comment>
- <comment xml:lang="hu">Markdown dokumentum</comment>
- <comment xml:lang="ia">Documento Markdown</comment>
- <comment xml:lang="id">Dokumen markdown</comment>
- <comment xml:lang="it">Documento Markdown</comment>
- <comment xml:lang="ja">Markdown </comment>
- <comment xml:lang="kk">Markdown құжаты</comment>
- <comment xml:lang="ko">마크다운 문서</comment>
- <comment xml:lang="lv">Markdown dokuments</comment>
- <comment xml:lang="nl">Markdown document</comment>
- <comment xml:lang="oc">document Markdown</comment>
- <comment xml:lang="pl">Dokument Markdown</comment>
- <comment xml:lang="pt">documento Markdown</comment>
- <comment xml:lang="pt-BR">Documento Markdown</comment>
- <comment xml:lang="ru">Документ Markdown</comment>
- <comment xml:lang="sk">Dokument Markdown</comment>
- <comment xml:lang="sl">Dokument Markdown</comment>
- <comment xml:lang="sr">Маркдаун документ</comment>
- <comment xml:lang="sv">Markdown-dokument</comment>
- <comment xml:lang="tr">Markdown belgesi</comment>
+ <comment xml:lang="zh_TW">Markdown 文件</comment>
+ <comment xml:lang="zh_CN">Markdown 文档</comment>
<comment xml:lang="uk">документ Markdown</comment>
- <comment xml:lang="zh-CN">Markdown 文档</comment>
- <comment xml:lang="zh-TW">Markdown 文件</comment>
+ <comment xml:lang="tr">Markdown belgesi</comment>
+ <comment xml:lang="sv">Markdown-dokument</comment>
+ <comment xml:lang="sr">Маркдаун документ</comment>
+ <comment xml:lang="sq">dokument Markdown</comment>
+ <comment xml:lang="sl">Dokument Markdown</comment>
+ <comment xml:lang="si">සලකුණු ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument Markdown</comment>
+ <comment xml:lang="ru">Документ Markdown</comment>
+ <comment xml:lang="pt_BR">Documento Markdown</comment>
+ <comment xml:lang="pt">documento Markdown</comment>
+ <comment xml:lang="pl">Dokument Markdown</comment>
+ <comment xml:lang="oc">document Markdown</comment>
+ <comment xml:lang="nl">Markdown-document</comment>
+ <comment xml:lang="lv">Markdown dokuments</comment>
+ <comment xml:lang="ko">마크다운 문서</comment>
+ <comment xml:lang="kk">Markdown құжаты</comment>
+ <comment xml:lang="ja">Markdown </comment>
+ <comment xml:lang="it">Documento Markdown</comment>
+ <comment xml:lang="is">Markdown skjal</comment>
+ <comment xml:lang="id">Dokumen markdown</comment>
+ <comment xml:lang="ia">Documento Markdown</comment>
+ <comment xml:lang="hu">Markdown dokumentum</comment>
+ <comment xml:lang="hr">Markdown dokument</comment>
+ <comment xml:lang="he">מסמך Markdown</comment>
+ <comment xml:lang="gl">documento de Markdown</comment>
+ <comment xml:lang="ga">cáipéis Markdown</comment>
+ <comment xml:lang="fur">document Markdown</comment>
+ <comment xml:lang="fr">document Markdown</comment>
+ <comment xml:lang="fi">Markdown-asiakirja</comment>
+ <comment xml:lang="eu">Markdown dokumentua</comment>
+ <comment xml:lang="es">documento Markdown</comment>
+ <comment xml:lang="en_GB">Markdown document</comment>
+ <comment xml:lang="el">Έγγραφο Markdown</comment>
+ <comment xml:lang="de">Markdown-Dokument</comment>
+ <comment xml:lang="da">Markdown-dokument</comment>
+ <comment xml:lang="cs">dokument Markdown</comment>
+ <comment xml:lang="ca">document Markdown</comment>
+ <comment xml:lang="bg">Документ — Markdown</comment>
+ <comment xml:lang="be">дакумент Markdown</comment>
+ <comment xml:lang="ast">Documentu Markdown</comment>
+ <comment xml:lang="ar">مستند مارك داون</comment>
+ <comment xml:lang="af">Markdown-dokument</comment>
<sub-class-of type="text/plain"/>
+ <generic-icon name="x-office-document"/>
<glob pattern="*.md"/>
<glob pattern="*.mkd"/>
<glob pattern="*.markdown"/>
@@ -36334,53 +37092,56 @@ command to generate the output files.
</mime-type>
<mime-type type="text/x-moc">
<comment>Qt MOC file</comment>
- <comment xml:lang="ar">ملف Qt MOC</comment>
- <comment xml:lang="be-Latn">Fajł Qt MOC</comment>
- <comment xml:lang="bg">Файл — Qt MOC</comment>
- <comment xml:lang="ca">fitxer MOC de Qt</comment>
- <comment xml:lang="cs">soubor Qt MOC</comment>
- <comment xml:lang="da">Qt MOC-fil</comment>
- <comment xml:lang="de">Qt-MOC-Datei</comment>
- <comment xml:lang="el">Αρχείο Qt MOC</comment>
- <comment xml:lang="en-GB">Qt MOC file</comment>
- <comment xml:lang="es">archivo MOC Qt</comment>
- <comment xml:lang="eu">Qt MOC fitxategia</comment>
- <comment xml:lang="fi">Qt MOC -tiedosto</comment>
- <comment xml:lang="fo">Qt MOC fíla</comment>
- <comment xml:lang="fr">fichier Qt MOC</comment>
- <comment xml:lang="fur">file Qt MOC</comment>
- <comment xml:lang="ga">comhad MOC Qt</comment>
- <comment xml:lang="gl">ficheiro MOC Qt</comment>
- <comment xml:lang="he">קובץ Qt MOC</comment>
- <comment xml:lang="hr">Qt MOC datoteka</comment>
- <comment xml:lang="hu">Qt MOC fájl</comment>
- <comment xml:lang="ia">File Qt MOC</comment>
- <comment xml:lang="id">Berkas Qt MOC</comment>
- <comment xml:lang="it">File MOC Qt</comment>
- <comment xml:lang="ja">Qt MOC ファイル</comment>
- <comment xml:lang="kk">Qt MOC файлы</comment>
- <comment xml:lang="ko">Qt MOC 파일</comment>
- <comment xml:lang="lt">Qt MOC failas</comment>
- <comment xml:lang="lv">Qt MOC datne</comment>
- <comment xml:lang="nb">Qt MOC-fil</comment>
- <comment xml:lang="nl">Qt MOC-bestand</comment>
- <comment xml:lang="nn">Qt MOC-fil</comment>
- <comment xml:lang="oc">fichièr Qt MOC</comment>
- <comment xml:lang="pl">Plik Qt MOC</comment>
- <comment xml:lang="pt">ficheiro Qt MOC</comment>
- <comment xml:lang="pt-BR">Arquivo Qt MOC</comment>
- <comment xml:lang="ro">Fișier Qt MOC</comment>
- <comment xml:lang="ru">Файл Qt MOC</comment>
- <comment xml:lang="sk">Súbor Qt MOC</comment>
- <comment xml:lang="sl">Datoteka Qt MOC</comment>
- <comment xml:lang="sq">File Qt MOC</comment>
- <comment xml:lang="sr">Кут МОЦ датотека</comment>
- <comment xml:lang="sv">Qt MOC-fil</comment>
- <comment xml:lang="tr">Qt MOC dosyası</comment>
- <comment xml:lang="uk">файл-метаоб'єкт Qt</comment>
+ <comment xml:lang="zh_TW">Qt MOC 檔</comment>
+ <comment xml:lang="zh_CN">Qt 元对象编译器文件</comment>
<comment xml:lang="vi">Tập tin MOC của Qt</comment>
- <comment xml:lang="zh-CN">Qt 元对象编译器文件</comment>
- <comment xml:lang="zh-TW">Qt MOC 檔</comment>
+ <comment xml:lang="uk">файл-метаоб'єкт Qt</comment>
+ <comment xml:lang="tr">Qt MOC dosyası</comment>
+ <comment xml:lang="sv">Qt MOC-fil</comment>
+ <comment xml:lang="sr">Кут МОЦ датотека</comment>
+ <comment xml:lang="sq">kartelë Qt MOC</comment>
+ <comment xml:lang="sl">Datoteka Qt MOC</comment>
+ <comment xml:lang="si">Qt MOC ගොනුව</comment>
+ <comment xml:lang="sk">Súbor Qt MOC</comment>
+ <comment xml:lang="ru">Файл Qt MOC</comment>
+ <comment xml:lang="ro">Fișier Qt MOC</comment>
+ <comment xml:lang="pt_BR">Arquivo Qt MOC</comment>
+ <comment xml:lang="pt">ficheiro Qt MOC</comment>
+ <comment xml:lang="pl">Plik Qt MOC</comment>
+ <comment xml:lang="oc">fichièr Qt MOC</comment>
+ <comment xml:lang="nn">Qt MOC-fil</comment>
+ <comment xml:lang="nl">Qt MOC-bestand</comment>
+ <comment xml:lang="nb">Qt MOC-fil</comment>
+ <comment xml:lang="lv">Qt MOC datne</comment>
+ <comment xml:lang="lt">Qt MOC failas</comment>
+ <comment xml:lang="ko">Qt MOC 파일</comment>
+ <comment xml:lang="kk">Qt MOC файлы</comment>
+ <comment xml:lang="ja">Qt MOC ファイル</comment>
+ <comment xml:lang="it">File MOC Qt</comment>
+ <comment xml:lang="is">Qt MOC-skrá</comment>
+ <comment xml:lang="id">Berkas Qt MOC</comment>
+ <comment xml:lang="ia">File Qt MOC</comment>
+ <comment xml:lang="hu">Qt MOC fájl</comment>
+ <comment xml:lang="hr">Qt MOC datoteka</comment>
+ <comment xml:lang="he">קובץ Qt MOC</comment>
+ <comment xml:lang="gl">ficheiro MOC Qt</comment>
+ <comment xml:lang="ga">comhad MOC Qt</comment>
+ <comment xml:lang="fur">file Qt MOC</comment>
+ <comment xml:lang="fr">fichier Qt MOC</comment>
+ <comment xml:lang="fo">Qt MOC fíla</comment>
+ <comment xml:lang="fi">Qt MOC -tiedosto</comment>
+ <comment xml:lang="eu">Qt MOC fitxategia</comment>
+ <comment xml:lang="es">archivo MOC Qt</comment>
+ <comment xml:lang="en_GB">Qt MOC file</comment>
+ <comment xml:lang="el">Αρχείο Qt MOC</comment>
+ <comment xml:lang="de">Qt-MOC-Datei</comment>
+ <comment xml:lang="da">Qt MOC-fil</comment>
+ <comment xml:lang="cs">soubor Qt MOC</comment>
+ <comment xml:lang="ca">fitxer MOC de Qt</comment>
+ <comment xml:lang="bg">Файл — Qt MOC</comment>
+ <comment xml:lang="be@latin">Fajł Qt MOC</comment>
+ <comment xml:lang="be">файл Qt MOC</comment>
+ <comment xml:lang="ar">ملف Qt MOC</comment>
<acronym>Qt MOC</acronym>
<expanded-acronym>Qt Meta Object Compiler</expanded-acronym>
<sub-class-of type="text/plain"/>
@@ -36388,56 +37149,59 @@ command to generate the output files.
</mime-type>
<mime-type type="text/x-ms-regedit">
<comment>Windows Registry extract</comment>
- <comment xml:lang="af">Windows-registerlêeruittreksel</comment>
- <comment xml:lang="ar">استخراج مسجل ويندوز</comment>
- <comment xml:lang="be-Latn">Element rehistru Windows</comment>
- <comment xml:lang="bg">Извадка от регистъра на Windows</comment>
- <comment xml:lang="ca">extracte de Windows Registry</comment>
- <comment xml:lang="cs">výtah registru Windows</comment>
- <comment xml:lang="da">Windows registreringsdatabase-udtrækning</comment>
- <comment xml:lang="de">Windows-Registry-Auszug</comment>
- <comment xml:lang="el">Αποσυμπίεση Windows Registry</comment>
- <comment xml:lang="en-GB">Windows Registry extract</comment>
- <comment xml:lang="es">extracto del registro de Windows</comment>
- <comment xml:lang="eu">Windows-eko erregistro erauzlea</comment>
- <comment xml:lang="fi">Windows-rekisteritietue</comment>
- <comment xml:lang="fo">Windows Registry úrdráttur</comment>
- <comment xml:lang="fr">extrait de registre Windows</comment>
- <comment xml:lang="fur">estrat dal regjistri di Windows</comment>
- <comment xml:lang="ga">sliocht as Clárlann Windows</comment>
- <comment xml:lang="gl">Extracto do rexistro de Windows</comment>
- <comment xml:lang="he">קובץ רשומות מערכת של Windows</comment>
- <comment xml:lang="hr">Izdvojeni Windows registar</comment>
- <comment xml:lang="hu">Windows Registry kivonat</comment>
- <comment xml:lang="ia">Extracto de registro de systema Windows</comment>
- <comment xml:lang="id">Ekstrak Windows Registry</comment>
- <comment xml:lang="it">Estratto Windows Registry</comment>
- <comment xml:lang="ja">WIndows レジストリ抽出ファイル</comment>
- <comment xml:lang="kk">Windows Registry бөлігі</comment>
- <comment xml:lang="ko">Windows 레지스트리 파일</comment>
- <comment xml:lang="lt">Windows registro ištrauka</comment>
- <comment xml:lang="lv">Windows Registry izvilkums</comment>
- <comment xml:lang="nb">Utdrag av Windows Registry</comment>
- <comment xml:lang="nl">Windows Registry-extract</comment>
- <comment xml:lang="nn">Windows Registry-utdrag</comment>
- <comment xml:lang="oc">extrait de registre Windows</comment>
- <comment xml:lang="pl">Wycinek rejestru Windows</comment>
- <comment xml:lang="pt">extrato do registo do Windows</comment>
- <comment xml:lang="pt-BR">Extrator de registro do Windows</comment>
- <comment xml:lang="ro">Extras al registrului Windows</comment>
- <comment xml:lang="ru">Фрагмент Windows Registry</comment>
- <comment xml:lang="sk">Časť registrov Windows</comment>
- <comment xml:lang="sl">izvleček vpisnika Windows</comment>
- <comment xml:lang="sq">Pjesë Windows Registry</comment>
- <comment xml:lang="sr">исцедак Виндоузовог регистра</comment>
- <comment xml:lang="sv">Windows Registry-utdrag</comment>
- <comment xml:lang="tr">Windows Kayıt Defteri özü</comment>
- <comment xml:lang="uk">частина реєстру Windows</comment>
+ <comment xml:lang="zh_TW">Windows Registry 抽出</comment>
+ <comment xml:lang="zh_CN">Windows 注册表提取</comment>
<comment xml:lang="vi">Bản trích Registry Windows</comment>
- <comment xml:lang="zh-CN">Windows 注册表提取</comment>
- <comment xml:lang="zh-TW">Windows Registry 抽出</comment>
+ <comment xml:lang="uk">частина реєстру Windows</comment>
+ <comment xml:lang="tr">Windows Kayıt Defteri özü</comment>
+ <comment xml:lang="sv">Windows Registry-utdrag</comment>
+ <comment xml:lang="sr">исцедак Виндоузовог регистра</comment>
+ <comment xml:lang="sq">copëz Windows Registry</comment>
+ <comment xml:lang="sl">izvleček vpisnika Windows</comment>
+ <comment xml:lang="si">වින්ඩෝස් රෙජිස්ට්රි උපුටා ගැනීම</comment>
+ <comment xml:lang="sk">Časť registrov Windows</comment>
+ <comment xml:lang="ru">Фрагмент Windows Registry</comment>
+ <comment xml:lang="ro">Extras al registrului Windows</comment>
+ <comment xml:lang="pt_BR">Extrator de registro do Windows</comment>
+ <comment xml:lang="pt">extrato do registo do Windows</comment>
+ <comment xml:lang="pl">Wycinek rejestru Windows</comment>
+ <comment xml:lang="oc">extrait de registre Windows</comment>
+ <comment xml:lang="nn">Windows Registry-utdrag</comment>
+ <comment xml:lang="nl">Windows Registry-extract</comment>
+ <comment xml:lang="nb">Utdrag av Windows Registry</comment>
+ <comment xml:lang="lv">Windows Registry izvilkums</comment>
+ <comment xml:lang="lt">Windows registro ištrauka</comment>
+ <comment xml:lang="ko">Windows 레지스트리 파일</comment>
+ <comment xml:lang="kk">Windows Registry бөлігі</comment>
+ <comment xml:lang="ja">WIndows レジストリ抽出ファイル</comment>
+ <comment xml:lang="it">Estratto Windows Registry</comment>
+ <comment xml:lang="is">Windows Registry útdráttur</comment>
+ <comment xml:lang="id">Ekstrak Windows Registry</comment>
+ <comment xml:lang="ia">Extracto de registro de systema Windows</comment>
+ <comment xml:lang="hu">Windows Registry kivonat</comment>
+ <comment xml:lang="hr">Izdvojeni Windows registar</comment>
+ <comment xml:lang="he">קובץ רשומות מערכת של Windows</comment>
+ <comment xml:lang="gl">Extracto do rexistro de Windows</comment>
+ <comment xml:lang="ga">sliocht as Clárlann Windows</comment>
+ <comment xml:lang="fur">estrat dal regjistri di Windows</comment>
+ <comment xml:lang="fr">extrait de registre Windows</comment>
+ <comment xml:lang="fo">Windows Registry úrdráttur</comment>
+ <comment xml:lang="fi">Windows-rekisteritietue</comment>
+ <comment xml:lang="eu">Windows-eko erregistro erauzlea</comment>
+ <comment xml:lang="es">extracto del registro de Windows</comment>
+ <comment xml:lang="en_GB">Windows Registry extract</comment>
+ <comment xml:lang="el">Αποσυμπίεση Windows Registry</comment>
+ <comment xml:lang="de">Windows-Registry-Auszug</comment>
+ <comment xml:lang="da">Windows registreringsdatabase-udtrækning</comment>
+ <comment xml:lang="cs">výtah registru Windows</comment>
+ <comment xml:lang="ca">extracte de Windows Registry</comment>
+ <comment xml:lang="bg">Извадка от регистъра на Windows</comment>
+ <comment xml:lang="be@latin">Element rehistru Windows</comment>
+ <comment xml:lang="be">элемент рэгістру Windows</comment>
+ <comment xml:lang="ar">استخراج مسجل ويندوز</comment>
+ <comment xml:lang="af">Windows-registerlêeruittreksel</comment>
<sub-class-of type="text/plain"/>
- <magic priority="50">
+ <magic>
<match type="string" value="REGEDIT" offset="0"/>
<match type="string" value="Windows Registry Editor Version 5.00" offset="0"/>
<match type="string" value="\xff\xfeW\x00i\x00n\x00d\x00o\x00w\x00s\x00 \x00R\x00e\x00g\x00i\x00s\x00t\x00r\x00y\x00 \x00E\x00d\x00i\x00t\x00o\x00r\x00" offset="0"/>
@@ -36446,31 +37210,41 @@ command to generate the output files.
</mime-type>
<mime-type type="text/x-mof">
<comment>MOF file</comment>
- <comment xml:lang="bg">Модел — MOF</comment>
- <comment xml:lang="ca">fitxer MOF</comment>
- <comment xml:lang="da">MOF-fil</comment>
- <comment xml:lang="de">MOF-Datei</comment>
- <comment xml:lang="en-GB">MOF file</comment>
- <comment xml:lang="es">archivo MOF</comment>
- <comment xml:lang="eu">MOF fitxategia</comment>
- <comment xml:lang="fi">MOF-tiedosto</comment>
- <comment xml:lang="fr">fichier MOF</comment>
- <comment xml:lang="hr">MOF datoteka</comment>
- <comment xml:lang="hu">MOF fájl</comment>
- <comment xml:lang="id">Berkas MOF</comment>
- <comment xml:lang="it">File MOF</comment>
- <comment xml:lang="kk">MOF файлы</comment>
- <comment xml:lang="ko">MOF 파일</comment>
- <comment xml:lang="pl">Plik MOF</comment>
- <comment xml:lang="pt-BR">Arquivo MOF</comment>
- <comment xml:lang="ru">Файл MOF</comment>
- <comment xml:lang="sk">Súbor MOF</comment>
- <comment xml:lang="sl">Datoteka MOF</comment>
- <comment xml:lang="sv">MOF-fil</comment>
- <comment xml:lang="tr">MOF dosyası</comment>
+ <comment xml:lang="zh_TW">MOF 檔</comment>
+ <comment xml:lang="zh_CN">MOF 文件</comment>
<comment xml:lang="uk">файл MOF</comment>
- <comment xml:lang="zh-CN">MOF 文件</comment>
- <comment xml:lang="zh-TW">MOF 檔</comment>
+ <comment xml:lang="tr">MOF dosyası</comment>
+ <comment xml:lang="sv">MOF-fil</comment>
+ <comment xml:lang="sq">kartelë MOF</comment>
+ <comment xml:lang="sl">Datoteka MOF</comment>
+ <comment xml:lang="si">MOF ගොනුව</comment>
+ <comment xml:lang="sk">Súbor MOF</comment>
+ <comment xml:lang="ru">Файл MOF</comment>
+ <comment xml:lang="pt_BR">Arquivo MOF</comment>
+ <comment xml:lang="pl">Plik MOF</comment>
+ <comment xml:lang="oc">fichièr MOF</comment>
+ <comment xml:lang="nl">MOF-bestand</comment>
+ <comment xml:lang="ko">MOF 파일</comment>
+ <comment xml:lang="kk">MOF файлы</comment>
+ <comment xml:lang="ja">MOF ファイル</comment>
+ <comment xml:lang="it">File MOF</comment>
+ <comment xml:lang="is">MOF-skrá</comment>
+ <comment xml:lang="id">Berkas MOF</comment>
+ <comment xml:lang="hu">MOF fájl</comment>
+ <comment xml:lang="hr">MOF datoteka</comment>
+ <comment xml:lang="he">קובץ MOF</comment>
+ <comment xml:lang="gl">Ficheiro MOF</comment>
+ <comment xml:lang="fr">fichier MOF</comment>
+ <comment xml:lang="fi">MOF-tiedosto</comment>
+ <comment xml:lang="eu">MOF fitxategia</comment>
+ <comment xml:lang="es">archivo MOF</comment>
+ <comment xml:lang="en_GB">MOF file</comment>
+ <comment xml:lang="de">MOF-Datei</comment>
+ <comment xml:lang="da">MOF-fil</comment>
+ <comment xml:lang="ca">fitxer MOF</comment>
+ <comment xml:lang="bg">Модел — MOF</comment>
+ <comment xml:lang="be">файл MOF</comment>
+ <comment xml:lang="ar">ملف MOF</comment>
<acronym>MOF</acronym>
<expanded-acronym>Windows Managed Object File</expanded-acronym>
<sub-class-of type="text/x-csrc"/>
@@ -36478,31 +37252,41 @@ command to generate the output files.
</mime-type>
<mime-type type="text/x-mup">
<comment>Mup musical composition document</comment>
- <comment xml:lang="bg">Музикална композиция — Mup</comment>
- <comment xml:lang="ca">document de composició musical Mup</comment>
- <comment xml:lang="da">Mup-musiksamling-dokument</comment>
- <comment xml:lang="de">Mup-Musikkompositions-Dokument</comment>
- <comment xml:lang="en-GB">Mup musical composition document</comment>
- <comment xml:lang="es">documento de composición musical de Mup</comment>
- <comment xml:lang="eu">Mup konposizio musikal dokumentua</comment>
- <comment xml:lang="fi">Mup-sävellysdokumentti</comment>
- <comment xml:lang="fr">document de composition musicale Mup</comment>
- <comment xml:lang="hr">Mup dokument glazbene kompozicije</comment>
- <comment xml:lang="hu">Mup zenei kompozíciós dokumentum</comment>
- <comment xml:lang="id">Dokumen komposisi musik Mup</comment>
- <comment xml:lang="it">Documento composizione musicale Mup</comment>
- <comment xml:lang="kk">Mup музыкалық композиция құжаты</comment>
- <comment xml:lang="ko">mup 작곡 문서</comment>
- <comment xml:lang="pl">Dokument kompozycji muzycznej Mup</comment>
- <comment xml:lang="pt-BR">Documento de composição musical Mup</comment>
- <comment xml:lang="sk">Dokument hudobnej kompozície Mup</comment>
- <comment xml:lang="sv">Mup musikkompositionsdokument</comment>
- <comment xml:lang="tr">Mup musical composition belgesi</comment>
+ <comment xml:lang="zh_TW">Mup 音樂組合文件</comment>
+ <comment xml:lang="zh_CN">Mup 乐曲文档</comment>
<comment xml:lang="uk">документ музичного запису твору Mup</comment>
- <comment xml:lang="zh-CN">Mup 乐曲文档</comment>
- <comment xml:lang="zh-TW">Mup 音樂組合文件</comment>
+ <comment xml:lang="tr">Mup musical composition belgesi</comment>
+ <comment xml:lang="sv">Mup musikkompositionsdokument</comment>
+ <comment xml:lang="sq">dokument kompozimi muzikor Mup</comment>
+ <comment xml:lang="si">Mup සංගීත සංයුතිය ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument hudobnej kompozície Mup</comment>
+ <comment xml:lang="ru">Документ Mup musical composition</comment>
+ <comment xml:lang="pt_BR">Documento de composição musical Mup</comment>
+ <comment xml:lang="pl">Dokument kompozycji muzycznej Mup</comment>
+ <comment xml:lang="nl">Mup-muzikaal-compositie­document</comment>
+ <comment xml:lang="ko">mup 작곡 문서</comment>
+ <comment xml:lang="kk">Mup музыкалық композиция құжаты</comment>
+ <comment xml:lang="ja">Mup 作曲ドキュメント</comment>
+ <comment xml:lang="it">Documento composizione musicale Mup</comment>
+ <comment xml:lang="is">MUP-nótnaskjal</comment>
+ <comment xml:lang="id">Dokumen komposisi musik Mup</comment>
+ <comment xml:lang="hu">Mup zenei kompozíciós dokumentum</comment>
+ <comment xml:lang="hr">Mup dokument glazbene kompozicije</comment>
+ <comment xml:lang="he">מסמך קומפוזיציה מוזיקלית מסוג Mup</comment>
+ <comment xml:lang="gl">Documento de composición musical MUP</comment>
+ <comment xml:lang="fr">document de composition musicale Mup</comment>
+ <comment xml:lang="fi">Mup-sävellysdokumentti</comment>
+ <comment xml:lang="eu">Mup konposizio musikal dokumentua</comment>
+ <comment xml:lang="es">documento de composición musical de Mup</comment>
+ <comment xml:lang="en_GB">Mup musical composition document</comment>
+ <comment xml:lang="de">Mup-Musikkompositions-Dokument</comment>
+ <comment xml:lang="da">Mup-musiksamling-dokument</comment>
+ <comment xml:lang="ca">document de composició musical Mup</comment>
+ <comment xml:lang="bg">Музикална композиция — Mup</comment>
+ <comment xml:lang="be">дакумент музычнай кампазіцыі Mup</comment>
+ <comment xml:lang="ar">وثيقة تأليف موسيقي Mup </comment>
<sub-class-of type="text/plain"/>
- <magic priority="50">
+ <magic>
<match type="string" value="//!Mup" offset="0"/>
</magic>
<glob pattern="*.mup"/>
@@ -36510,148 +37294,195 @@ command to generate the output files.
</mime-type>
<mime-type type="text/x-objcsrc">
<comment>Objective-C source code</comment>
- <comment xml:lang="af">Objective-C-bronkode</comment>
- <comment xml:lang="ar">شفرة مصدر الهدف-C </comment>
- <comment xml:lang="be-Latn">Kryničny kod Objective-C</comment>
- <comment xml:lang="bg">Изходен код — Objective C</comment>
- <comment xml:lang="ca">codi font en Objective-C</comment>
- <comment xml:lang="cs">zdrojový kód v jazyce Objective-C</comment>
- <comment xml:lang="da">Objektiv C-kildekode</comment>
- <comment xml:lang="de">Objective-C-Quelltext</comment>
- <comment xml:lang="el">Πηγαίος κώδικας Objective-C</comment>
- <comment xml:lang="en-GB">Objective-C source code</comment>
- <comment xml:lang="eo">fontkodo en Objective-C</comment>
- <comment xml:lang="es">código fuente en Objective-C</comment>
- <comment xml:lang="eu">Objective-C iturburu-kodea</comment>
- <comment xml:lang="fi">Objective-C-lähdekoodi</comment>
- <comment xml:lang="fo">Objective-C keldukota</comment>
- <comment xml:lang="fr">code source Objective-C</comment>
- <comment xml:lang="fur">codiç sorzint Objective-C</comment>
- <comment xml:lang="ga">cód foinseach Objective-C</comment>
- <comment xml:lang="gl">código fonte de Objective-C</comment>
- <comment xml:lang="he">קוד מקור של Objective-C</comment>
- <comment xml:lang="hr">Objective-C izvorni kôd</comment>
- <comment xml:lang="hu">Objective-C forráskód</comment>
- <comment xml:lang="ia">Codice-fonte Objective-C</comment>
- <comment xml:lang="id">Kode sumber Objective-C</comment>
- <comment xml:lang="it">Codice sorgente Objective-C</comment>
- <comment xml:lang="ja">Objective-C ソースコード</comment>
- <comment xml:lang="ka">Objective-C-ის საწყისი კოდი</comment>
- <comment xml:lang="kk">Objective-C бастапқы коды</comment>
- <comment xml:lang="ko">Objective-C 소스 코드</comment>
- <comment xml:lang="lt">Objective-C pradinis kodas</comment>
- <comment xml:lang="lv">Objective-C pirmkods</comment>
- <comment xml:lang="ms">Kod sumber Objective-C</comment>
- <comment xml:lang="nb">Objective-C-kildekode</comment>
- <comment xml:lang="nl">Objective-C-broncode</comment>
- <comment xml:lang="nn">Objective-C-kjeldekode</comment>
- <comment xml:lang="oc">còde font Objective-C</comment>
- <comment xml:lang="pl">Kod źródłowy Objective-C</comment>
- <comment xml:lang="pt">código origem Objective-C</comment>
- <comment xml:lang="pt-BR">Código-fonte Objective-C</comment>
- <comment xml:lang="ro">Cod sursă Objective-C</comment>
- <comment xml:lang="ru">Исходный код Objective-C</comment>
- <comment xml:lang="sk">Zdrojový kód Objective-C</comment>
- <comment xml:lang="sl">Datoteka izvorne kode Objective-C</comment>
- <comment xml:lang="sq">Kod burues C objekt</comment>
- <comment xml:lang="sr">Објектни-Ц изворни ко̂д</comment>
- <comment xml:lang="sv">Objective-C-källkod</comment>
- <comment xml:lang="tr">Objective-C kaynak kodu</comment>
- <comment xml:lang="uk">вихідний код мовою Objective-C</comment>
+ <comment xml:lang="zh_TW">Objective-C 源碼</comment>
+ <comment xml:lang="zh_CN">Objective-C 源代码</comment>
<comment xml:lang="vi">Mã nguồn Objective-C</comment>
- <comment xml:lang="zh-CN">Objective-C 源代码</comment>
- <comment xml:lang="zh-TW">Objective-C 源碼</comment>
+ <comment xml:lang="uk">початковий код мовою Objective-C</comment>
+ <comment xml:lang="tr">Objective-C kaynak kodu</comment>
+ <comment xml:lang="sv">Objective-C-källkod</comment>
+ <comment xml:lang="sr">Објектни-Ц изворни ко̂д</comment>
+ <comment xml:lang="sq">kod burim Objective-C</comment>
+ <comment xml:lang="sl">Datoteka izvorne kode Objective-C</comment>
+ <comment xml:lang="si">Objective-C මූලාශ්‍ර කේතය</comment>
+ <comment xml:lang="sk">Zdrojový kód Objective-C</comment>
+ <comment xml:lang="ru">Исходный код Objective-C</comment>
+ <comment xml:lang="ro">Cod sursă Objective-C</comment>
+ <comment xml:lang="pt_BR">Código-fonte Objective-C</comment>
+ <comment xml:lang="pt">código origem Objective-C</comment>
+ <comment xml:lang="pl">Kod źródłowy Objective-C</comment>
+ <comment xml:lang="oc">còde font Objective-C</comment>
+ <comment xml:lang="nn">Objective-C-kjeldekode</comment>
+ <comment xml:lang="nl">Objective-C-broncode</comment>
+ <comment xml:lang="nb">Objective-C-kildekode</comment>
+ <comment xml:lang="ms">Kod sumber Objective-C</comment>
+ <comment xml:lang="lv">Objective-C pirmkods</comment>
+ <comment xml:lang="lt">Objective-C pradinis kodas</comment>
+ <comment xml:lang="ko">Objective-C 소스 코드</comment>
+ <comment xml:lang="kk">Objective-C бастапқы коды</comment>
+ <comment xml:lang="ka">Objective-C-ის საწყისი კოდი</comment>
+ <comment xml:lang="ja">Objective-C ソースコード</comment>
+ <comment xml:lang="it">Codice sorgente Objective-C</comment>
+ <comment xml:lang="is">Objective-C frumkóði</comment>
+ <comment xml:lang="id">Kode sumber Objective-C</comment>
+ <comment xml:lang="ia">Codice-fonte Objective-C</comment>
+ <comment xml:lang="hu">Objective-C forráskód</comment>
+ <comment xml:lang="hr">Objective-C izvorni kôd</comment>
+ <comment xml:lang="he">קוד מקור של Objective-C</comment>
+ <comment xml:lang="gl">código fonte de Objective-C</comment>
+ <comment xml:lang="ga">cód foinseach Objective-C</comment>
+ <comment xml:lang="fur">codiç sorzint Objective-C</comment>
+ <comment xml:lang="fr">code source Objective-C</comment>
+ <comment xml:lang="fo">Objective-C keldukota</comment>
+ <comment xml:lang="fi">Objective-C-lähdekoodi</comment>
+ <comment xml:lang="eu">Objective-C iturburu-kodea</comment>
+ <comment xml:lang="es">código fuente en Objective-C</comment>
+ <comment xml:lang="eo">fontkodo en Objective-C</comment>
+ <comment xml:lang="en_GB">Objective-C source code</comment>
+ <comment xml:lang="el">Πηγαίος κώδικας Objective-C</comment>
+ <comment xml:lang="de">Objective-C-Quelltext</comment>
+ <comment xml:lang="da">Objektiv C-kildekode</comment>
+ <comment xml:lang="cs">zdrojový kód v jazyce Objective-C</comment>
+ <comment xml:lang="ca">codi font en Objective-C</comment>
+ <comment xml:lang="bg">Изходен код — Objective C</comment>
+ <comment xml:lang="be@latin">Kryničny kod Objective-C</comment>
+ <comment xml:lang="be">зыходны код Objective-C</comment>
+ <comment xml:lang="ar">شفرة مصدر Objective-C</comment>
+ <comment xml:lang="af">Objective-C-bronkode</comment>
<sub-class-of type="text/x-csrc"/>
<magic priority="30">
<match type="string" value="#import" offset="0"/>
</magic>
<glob pattern="*.m"/>
</mime-type>
+ <mime-type type="text/x-objc++src">
+ <comment>Objective-C++ source code</comment>
+ <comment xml:lang="zh_TW">Objective-C++ 原始碼</comment>
+ <comment xml:lang="zh_CN">Objective-C++ 源代码</comment>
+ <comment xml:lang="uk">початковий код мовою Objective-C++</comment>
+ <comment xml:lang="tr">Objective-C++ kaynak kodu</comment>
+ <comment xml:lang="sv">Objective-C++-källkod</comment>
+ <comment xml:lang="sl">Datoteka izvorne kode Objective-C++</comment>
+ <comment xml:lang="si">අරමුණ-C++ මූල කේතය</comment>
+ <comment xml:lang="ru">Исходный код Objective-C++</comment>
+ <comment xml:lang="pt_BR">Código-fonte Objective-C++</comment>
+ <comment xml:lang="pl">Kod źródłowy Objective-C++</comment>
+ <comment xml:lang="nl">Objective-C++-broncode</comment>
+ <comment xml:lang="ko">Objective-C++ 소스 코드</comment>
+ <comment xml:lang="kk">Objective-C++ бастапқы коды</comment>
+ <comment xml:lang="ja">Objective-C++ ソースコード</comment>
+ <comment xml:lang="it">Codice sorgente Objective-C++</comment>
+ <comment xml:lang="hr">Objective-C++ izvorni kôd</comment>
+ <comment xml:lang="gl">Código fonte de Objective-C++</comment>
+ <comment xml:lang="fi">Objective-C++ lähdekoodi</comment>
+ <comment xml:lang="eu">Objective-C++ iturburu-kodea</comment>
+ <comment xml:lang="es">código fuente en Objective-C++</comment>
+ <comment xml:lang="en_GB">Objective-C++ source code</comment>
+ <comment xml:lang="de">Objective-C++-Quelltext</comment>
+ <comment xml:lang="be">зыходны код Objective-C++</comment>
+ <comment xml:lang="ar">شفرة مصدر Objective-سي++</comment>
+ <sub-class-of type="text/x-c++src"/>
+ <sub-class-of type="text/x-objcsrc"/>
+ <glob pattern="*.mm"/>
+ </mime-type>
<mime-type type="text/x-ocaml">
<comment>OCaml source code</comment>
- <comment xml:lang="af">OCaml-bronkode</comment>
- <comment xml:lang="ar">شفرة مصدر OCaml</comment>
- <comment xml:lang="be-Latn">Kryničny kod OCaml</comment>
- <comment xml:lang="bg">Изходен код — OCaml</comment>
- <comment xml:lang="ca">codi font en OCaml</comment>
- <comment xml:lang="cs">zdrojový kód v jazyce OCaml</comment>
- <comment xml:lang="da">OCaml-kildekode</comment>
- <comment xml:lang="de">OCaml-Quelltext</comment>
- <comment xml:lang="el">Πηγαίος κώδικας OCaml</comment>
- <comment xml:lang="en-GB">OCaml source code</comment>
- <comment xml:lang="eo">OCaml-fontkodo</comment>
- <comment xml:lang="es">código fuente en OCaml</comment>
- <comment xml:lang="eu">OCaml iturburu-kodea</comment>
- <comment xml:lang="fi">OCaml-lähdekoodi</comment>
- <comment xml:lang="fo">OCaml keldukota</comment>
- <comment xml:lang="fr">code source OCaml</comment>
- <comment xml:lang="fur">codiç sorzint OCaml</comment>
- <comment xml:lang="ga">cód foinseach OCaml</comment>
- <comment xml:lang="gl">código fonte de OCaml</comment>
- <comment xml:lang="he">קוד מקור של OCaml</comment>
- <comment xml:lang="hr">OCaml izvorni kôd</comment>
- <comment xml:lang="hu">OCaml forráskód</comment>
- <comment xml:lang="ia">Codice-fonte OCaml</comment>
- <comment xml:lang="id">Kode sumber OCaml</comment>
- <comment xml:lang="it">Codice sorgente OCaml</comment>
- <comment xml:lang="ja">OCaml ソースコード</comment>
- <comment xml:lang="kk">OCaml бастапқы коды</comment>
- <comment xml:lang="ko">OCaml 소스 코드</comment>
- <comment xml:lang="lt">OCaml pradinis kodas</comment>
- <comment xml:lang="lv">OCaml pirmkods</comment>
- <comment xml:lang="nb">OCaml-kildekode</comment>
- <comment xml:lang="nl">OCaml-broncode</comment>
- <comment xml:lang="nn">OCaml-kjeldekode</comment>
- <comment xml:lang="oc">còde font OCaml</comment>
- <comment xml:lang="pl">Kod źródłowy OCaml</comment>
- <comment xml:lang="pt">código origem OCaml</comment>
- <comment xml:lang="pt-BR">Código-fonte OCaml</comment>
- <comment xml:lang="ro">Cod sursă OCaml</comment>
- <comment xml:lang="ru">Исходный код OCaml</comment>
- <comment xml:lang="sk">Zdrojový kód OCaml</comment>
- <comment xml:lang="sl">Datoteka izvorne kode OCaml</comment>
- <comment xml:lang="sq">Kod burues OCaml</comment>
- <comment xml:lang="sr">Окемл изворни ко̂д</comment>
- <comment xml:lang="sv">OCaml-källkod</comment>
- <comment xml:lang="tr">OCaml kaynak kodu</comment>
- <comment xml:lang="uk">первинний код мовою OCaml</comment>
+ <comment xml:lang="zh_TW">OCaml 源碼</comment>
+ <comment xml:lang="zh_CN">OCaml 源代码</comment>
<comment xml:lang="vi">Mã nguồn OCaml</comment>
- <comment xml:lang="zh-CN">OCaml 源代码</comment>
- <comment xml:lang="zh-TW">OCaml 源碼</comment>
+ <comment xml:lang="uk">початковий код мовою OCaml</comment>
+ <comment xml:lang="tr">OCaml kaynak kodu</comment>
+ <comment xml:lang="sv">OCaml-källkod</comment>
+ <comment xml:lang="sr">Окемл изворни ко̂д</comment>
+ <comment xml:lang="sq">kod burim OCaml</comment>
+ <comment xml:lang="sl">Datoteka izvorne kode OCaml</comment>
+ <comment xml:lang="si">OCaml මූල කේතය</comment>
+ <comment xml:lang="sk">Zdrojový kód OCaml</comment>
+ <comment xml:lang="ru">Исходный код OCaml</comment>
+ <comment xml:lang="ro">Cod sursă OCaml</comment>
+ <comment xml:lang="pt_BR">Código-fonte OCaml</comment>
+ <comment xml:lang="pt">código origem OCaml</comment>
+ <comment xml:lang="pl">Kod źródłowy OCaml</comment>
+ <comment xml:lang="oc">còde font OCaml</comment>
+ <comment xml:lang="nn">OCaml-kjeldekode</comment>
+ <comment xml:lang="nl">OCaml-broncode</comment>
+ <comment xml:lang="nb">OCaml-kildekode</comment>
+ <comment xml:lang="lv">OCaml pirmkods</comment>
+ <comment xml:lang="lt">OCaml pradinis kodas</comment>
+ <comment xml:lang="ko">OCaml 소스 코드</comment>
+ <comment xml:lang="kk">OCaml бастапқы коды</comment>
+ <comment xml:lang="ja">OCaml ソースコード</comment>
+ <comment xml:lang="it">Codice sorgente OCaml</comment>
+ <comment xml:lang="is">OCaml frumkóði</comment>
+ <comment xml:lang="id">Kode sumber OCaml</comment>
+ <comment xml:lang="ia">Codice-fonte OCaml</comment>
+ <comment xml:lang="hu">OCaml forráskód</comment>
+ <comment xml:lang="hr">OCaml izvorni kôd</comment>
+ <comment xml:lang="he">קוד מקור של OCaml</comment>
+ <comment xml:lang="gl">código fonte de OCaml</comment>
+ <comment xml:lang="ga">cód foinseach OCaml</comment>
+ <comment xml:lang="fur">codiç sorzint OCaml</comment>
+ <comment xml:lang="fr">code source OCaml</comment>
+ <comment xml:lang="fo">OCaml keldukota</comment>
+ <comment xml:lang="fi">OCaml-lähdekoodi</comment>
+ <comment xml:lang="eu">OCaml iturburu-kodea</comment>
+ <comment xml:lang="es">código fuente en OCaml</comment>
+ <comment xml:lang="eo">OCaml-fontkodo</comment>
+ <comment xml:lang="en_GB">OCaml source code</comment>
+ <comment xml:lang="el">Πηγαίος κώδικας OCaml</comment>
+ <comment xml:lang="de">OCaml-Quelltext</comment>
+ <comment xml:lang="da">OCaml-kildekode</comment>
+ <comment xml:lang="cs">zdrojový kód v jazyce OCaml</comment>
+ <comment xml:lang="ca">codi font en OCaml</comment>
+ <comment xml:lang="bg">Изходен код — OCaml</comment>
+ <comment xml:lang="be@latin">Kryničny kod OCaml</comment>
+ <comment xml:lang="be">зыходны код OCaml</comment>
+ <comment xml:lang="ar">شفرة مصدر OCaml</comment>
+ <comment xml:lang="af">OCaml-bronkode</comment>
+ <sub-class-of type="text/plain"/>
<glob pattern="*.ml"/>
<glob pattern="*.mli"/>
</mime-type>
<mime-type type="text/x-opencl-src">
<comment>OpenCL source code</comment>
- <comment xml:lang="af">OpenCL-bronkode</comment>
- <comment xml:lang="bg">Изходен код — OpenCL</comment>
- <comment xml:lang="ca">codi font en OpenCL</comment>
- <comment xml:lang="cs">zdrojový kód v jazyce OpenCL</comment>
- <comment xml:lang="da">OpenCL-kildekode</comment>
- <comment xml:lang="de">OpenCL-Quelltext</comment>
- <comment xml:lang="en-GB">OpenCL source code</comment>
- <comment xml:lang="es">código fuente en OpenCL</comment>
- <comment xml:lang="eu">OpenCL iturburu-kodea</comment>
- <comment xml:lang="fi">OpenCL-lähdekoodi</comment>
- <comment xml:lang="fr">code source OpenCL</comment>
- <comment xml:lang="fur">codiç sorzint OpenCL</comment>
- <comment xml:lang="ga">cód foinseach OpenCL</comment>
- <comment xml:lang="hr">OpenCL izvorni kôd</comment>
- <comment xml:lang="hu">OpenCL forráskód</comment>
- <comment xml:lang="id">Kode sumber OpenCL</comment>
- <comment xml:lang="it">Codice sorgente OpenCL</comment>
- <comment xml:lang="kk">OpenCL бастапқы коды</comment>
- <comment xml:lang="ko">OpenCL 소스 코드</comment>
- <comment xml:lang="pl">Kod źródłowy OpenCL</comment>
- <comment xml:lang="pt-BR">Código-fonte OpenCL</comment>
- <comment xml:lang="ru">Исходный код OpenGL</comment>
- <comment xml:lang="sk">Zdrojový kód OpenCL</comment>
- <comment xml:lang="sl">Izvorna koda OpenCL</comment>
- <comment xml:lang="sv">OpenCL-källkod</comment>
+ <comment xml:lang="zh_TW">OpenCL 原始碼</comment>
+ <comment xml:lang="zh_CN">OpenCL 源代码</comment>
+ <comment xml:lang="uk">початковий код мовою OpenCL</comment>
<comment xml:lang="tr">OpenCL kaynak kodu</comment>
- <comment xml:lang="uk">вихідний код мовою OpenCL</comment>
- <comment xml:lang="zh-CN">OpenCL 源代码</comment>
- <comment xml:lang="zh-TW">OpenCL 源碼</comment>
+ <comment xml:lang="sv">OpenCL-källkod</comment>
+ <comment xml:lang="sq">kod burim OpenCL</comment>
+ <comment xml:lang="sl">Izvorna koda OpenCL</comment>
+ <comment xml:lang="si">OpenCL මූල කේතය</comment>
+ <comment xml:lang="sk">Zdrojový kód OpenCL</comment>
+ <comment xml:lang="ru">Исходный код OpenGL</comment>
+ <comment xml:lang="pt_BR">Código-fonte OpenCL</comment>
+ <comment xml:lang="pl">Kod źródłowy OpenCL</comment>
+ <comment xml:lang="oc">còdi font OpenCL</comment>
+ <comment xml:lang="nl">OpenCL-broncode</comment>
+ <comment xml:lang="ko">OpenCL 소스 코드</comment>
+ <comment xml:lang="kk">OpenCL бастапқы коды</comment>
+ <comment xml:lang="ja">OpenCL ソースコード</comment>
+ <comment xml:lang="it">Codice sorgente OpenCL</comment>
+ <comment xml:lang="is">OpenCL frumkóði</comment>
+ <comment xml:lang="id">Kode sumber OpenCL</comment>
+ <comment xml:lang="hu">OpenCL forráskód</comment>
+ <comment xml:lang="hr">OpenCL izvorni kôd</comment>
+ <comment xml:lang="he">קוד מקור OpenCL</comment>
+ <comment xml:lang="gl">Código fonte en OpenCL</comment>
+ <comment xml:lang="ga">cód foinseach OpenCL</comment>
+ <comment xml:lang="fur">codiç sorzint OpenCL</comment>
+ <comment xml:lang="fr">code source OpenCL</comment>
+ <comment xml:lang="fi">OpenCL-lähdekoodi</comment>
+ <comment xml:lang="eu">OpenCL iturburu-kodea</comment>
+ <comment xml:lang="es">código fuente en OpenCL</comment>
+ <comment xml:lang="en_GB">OpenCL source code</comment>
+ <comment xml:lang="de">OpenCL-Quelltext</comment>
+ <comment xml:lang="da">OpenCL-kildekode</comment>
+ <comment xml:lang="cs">zdrojový kód v jazyce OpenCL</comment>
+ <comment xml:lang="ca">codi font en OpenCL</comment>
+ <comment xml:lang="bg">Изходен код — OpenCL</comment>
+ <comment xml:lang="be">зыходны код OpenCL</comment>
+ <comment xml:lang="ar">شفرة مصدر OpenCL</comment>
+ <comment xml:lang="af">OpenCL-bronkode</comment>
<acronym>OpenCL</acronym>
<expanded-acronym>Open Computing Language</expanded-acronym>
<sub-class-of type="text/x-csrc"/>
@@ -36659,39 +37490,45 @@ command to generate the output files.
</mime-type>
<mime-type type="text/x-matlab">
<comment>MATLAB file</comment>
- <comment xml:lang="bg">Файл — MATLAB</comment>
- <comment xml:lang="ca">fitxer MATLAB</comment>
- <comment xml:lang="da">MATLAB-fil</comment>
- <comment xml:lang="de">MATLAB-Datei</comment>
- <comment xml:lang="en-GB">MATLAB file</comment>
- <comment xml:lang="es">archivo de MATLAB</comment>
- <comment xml:lang="eu">MATLAB fitxategia</comment>
- <comment xml:lang="fi">MATLAB-tiedosto</comment>
- <comment xml:lang="fr">fichier MATLAB</comment>
- <comment xml:lang="hr">MATLAB datoteka</comment>
- <comment xml:lang="hu">MATLAB fájl</comment>
- <comment xml:lang="id">Berkas MATLAB</comment>
- <comment xml:lang="it">File MATLAB</comment>
- <comment xml:lang="kk">MATLAB файлы</comment>
- <comment xml:lang="ko">MATLAB 파일</comment>
- <comment xml:lang="pl">Plik MATLAB</comment>
- <comment xml:lang="pt-BR">Arquivo do MATLAB</comment>
- <comment xml:lang="ru">Файл MATLAB</comment>
- <comment xml:lang="sk">Súbor MATLAB</comment>
- <comment xml:lang="sl">Datoteka MATLAB</comment>
- <comment xml:lang="sv">MATLAB-fil</comment>
- <comment xml:lang="tr">MATLAB dosyası</comment>
+ <comment xml:lang="zh_TW">MATLAB 檔</comment>
+ <comment xml:lang="zh_CN">MATLAB 文件</comment>
<comment xml:lang="uk">файл MATLAB</comment>
- <comment xml:lang="zh-CN">MATLAB 文件</comment>
- <comment xml:lang="zh-TW">MATLAB 檔</comment>
+ <comment xml:lang="tr">MATLAB dosyası</comment>
+ <comment xml:lang="sv">MATLAB-fil</comment>
+ <comment xml:lang="sq">kartelë MATLAB</comment>
+ <comment xml:lang="sl">Datoteka MATLAB</comment>
+ <comment xml:lang="si">MATLAB ගොනුව</comment>
+ <comment xml:lang="sk">Súbor MATLAB</comment>
+ <comment xml:lang="ru">Файл MATLAB</comment>
+ <comment xml:lang="pt_BR">Arquivo do MATLAB</comment>
+ <comment xml:lang="pl">Plik MATLAB</comment>
+ <comment xml:lang="nl">MATLAB-bestand</comment>
+ <comment xml:lang="ko">MATLAB 파일</comment>
+ <comment xml:lang="kk">MATLAB файлы</comment>
+ <comment xml:lang="ja">MATLAB ファイル</comment>
+ <comment xml:lang="it">File MATLAB</comment>
+ <comment xml:lang="is">MATLAB-skrá</comment>
+ <comment xml:lang="id">Berkas MATLAB</comment>
+ <comment xml:lang="hu">MATLAB fájl</comment>
+ <comment xml:lang="hr">MATLAB datoteka</comment>
+ <comment xml:lang="he">קובץ MATLAB</comment>
+ <comment xml:lang="gl">Ficheiro de MATLAB</comment>
+ <comment xml:lang="fr">fichier MATLAB</comment>
+ <comment xml:lang="fi">MATLAB-tiedosto</comment>
+ <comment xml:lang="eu">MATLAB fitxategia</comment>
+ <comment xml:lang="es">archivo de MATLAB</comment>
+ <comment xml:lang="en_GB">MATLAB file</comment>
+ <comment xml:lang="de">MATLAB-Datei</comment>
+ <comment xml:lang="da">MATLAB-fil</comment>
+ <comment xml:lang="ca">fitxer MATLAB</comment>
+ <comment xml:lang="bg">Файл — MATLAB</comment>
+ <comment xml:lang="be">файл MATLAB</comment>
+ <comment xml:lang="ar">ملف ماتلاب</comment>
<sub-class-of type="text/plain"/>
<magic priority="10">
<match type="string" value="%" offset="0"/>
</magic>
- <magic priority="10">
- <match type="string" value="##" offset="0"/>
- </magic>
- <magic priority="50">
+ <magic>
<match type="string" value="function" offset="0"/>
</magic>
<glob pattern="*.m"/>
@@ -36699,214 +37536,192 @@ command to generate the output files.
</mime-type>
<mime-type type="text/x-meson">
<comment>Meson source code</comment>
- <comment xml:lang="af">Meson-bronkode</comment>
- <comment xml:lang="bg">Изходен код — Meson</comment>
- <comment xml:lang="ca">codi font en Meson</comment>
- <comment xml:lang="cs">zdrojový kód Meson</comment>
- <comment xml:lang="da">Meson-kildekode</comment>
- <comment xml:lang="de">Meson-Quelltext</comment>
- <comment xml:lang="el">Πηγαίος κώδικας Meson</comment>
- <comment xml:lang="en-GB">Meson source code</comment>
- <comment xml:lang="es">código fuente en Meson</comment>
- <comment xml:lang="eu">Meson iturburu-kodea</comment>
- <comment xml:lang="fi">Meson-lähdekoodi</comment>
- <comment xml:lang="fr">code source Meson</comment>
- <comment xml:lang="fur">codiç sorzint Meson</comment>
- <comment xml:lang="ga">cód foinseach Meson</comment>
- <comment xml:lang="he">קוד מקור Meson</comment>
- <comment xml:lang="hr">Meson izvorni kôd</comment>
- <comment xml:lang="hu">Meson forráskód</comment>
- <comment xml:lang="ia">Codice-fonte Meson</comment>
- <comment xml:lang="id">Kode sumber Meson</comment>
- <comment xml:lang="it">Codice sorgente Meson</comment>
- <comment xml:lang="kk">Meson бастапқы коды</comment>
- <comment xml:lang="ko">Meson 소스 코드</comment>
- <comment xml:lang="oc">còde font Meson</comment>
- <comment xml:lang="pl">Kod źródłowy Meson</comment>
- <comment xml:lang="pt">código origem Meson</comment>
- <comment xml:lang="pt-BR">Código-fonte Meson</comment>
- <comment xml:lang="ru">Исходный код Meson</comment>
- <comment xml:lang="sk">Zdrojový kód Meson</comment>
- <comment xml:lang="sl">Izvorna koda Meson</comment>
- <comment xml:lang="sr">Месон изворни ко̂д</comment>
- <comment xml:lang="sv">Meson-källkod</comment>
+ <comment xml:lang="zh_TW">Meson 源碼</comment>
+ <comment xml:lang="zh_CN">Meson 源代码</comment>
+ <comment xml:lang="uk">початковий код мовою Meson</comment>
<comment xml:lang="tr">Meson kaynak kodu</comment>
- <comment xml:lang="uk">вихідний код мовою Meson</comment>
- <comment xml:lang="zh-CN">Meson 源代码</comment>
- <comment xml:lang="zh-TW">Meson 源碼</comment>
+ <comment xml:lang="sv">Meson-källkod</comment>
+ <comment xml:lang="sr">Месон изворни ко̂д</comment>
+ <comment xml:lang="sq">kod burim Meson</comment>
+ <comment xml:lang="sl">Izvorna koda Meson</comment>
+ <comment xml:lang="si">Meson මූල කේතය</comment>
+ <comment xml:lang="sk">Zdrojový kód Meson</comment>
+ <comment xml:lang="ru">Исходный код Meson</comment>
+ <comment xml:lang="pt_BR">Código-fonte Meson</comment>
+ <comment xml:lang="pt">código origem Meson</comment>
+ <comment xml:lang="pl">Kod źródłowy Meson</comment>
+ <comment xml:lang="oc">còde font Meson</comment>
+ <comment xml:lang="nl">Meson-broncode</comment>
+ <comment xml:lang="ko">Meson 소스 코드</comment>
+ <comment xml:lang="kk">Meson бастапқы коды</comment>
+ <comment xml:lang="ja">Meson ソースコード</comment>
+ <comment xml:lang="it">Codice sorgente Meson</comment>
+ <comment xml:lang="is">Meson frumkóði</comment>
+ <comment xml:lang="id">Kode sumber Meson</comment>
+ <comment xml:lang="ia">Codice-fonte Meson</comment>
+ <comment xml:lang="hu">Meson forráskód</comment>
+ <comment xml:lang="hr">Meson izvorni kôd</comment>
+ <comment xml:lang="he">קוד מקור Meson</comment>
+ <comment xml:lang="gl">Código fonte Meson</comment>
+ <comment xml:lang="ga">cód foinseach Meson</comment>
+ <comment xml:lang="fur">codiç sorzint Meson</comment>
+ <comment xml:lang="fr">code source Meson</comment>
+ <comment xml:lang="fi">Meson-lähdekoodi</comment>
+ <comment xml:lang="eu">Meson iturburu-kodea</comment>
+ <comment xml:lang="es">código fuente en Meson</comment>
+ <comment xml:lang="en_GB">Meson source code</comment>
+ <comment xml:lang="el">Πηγαίος κώδικας Meson</comment>
+ <comment xml:lang="de">Meson-Quelltext</comment>
+ <comment xml:lang="da">Meson-kildekode</comment>
+ <comment xml:lang="cs">zdrojový kód Meson</comment>
+ <comment xml:lang="ca">codi font en Meson</comment>
+ <comment xml:lang="bg">Изходен код — Meson</comment>
+ <comment xml:lang="be">зыходны код Meson</comment>
+ <comment xml:lang="ar">شفرة مصدر Meson</comment>
+ <comment xml:lang="af">Meson-bronkode</comment>
<glob pattern="meson.build"/>
<glob pattern="meson_options.txt"/>
<sub-class-of type="text/plain"/>
</mime-type>
<mime-type type="text/x-modelica">
<comment>Modelica model</comment>
- <comment xml:lang="af">Modelica-model</comment>
- <comment xml:lang="bg">Модел — Modelica</comment>
- <comment xml:lang="ca">model de Modelica</comment>
- <comment xml:lang="cs">model Modelica</comment>
- <comment xml:lang="da">Modelica-model</comment>
- <comment xml:lang="de">Modelica-Modell</comment>
- <comment xml:lang="el">Μοντέλο Modelica</comment>
- <comment xml:lang="en-GB">Modelica model</comment>
- <comment xml:lang="es">modelo de Modelica</comment>
- <comment xml:lang="eu">Modelica modeloa</comment>
- <comment xml:lang="fi">Modelica-malli</comment>
- <comment xml:lang="fr">modèle Modelica</comment>
- <comment xml:lang="fur">model Modelica</comment>
- <comment xml:lang="ga">samhail Modelica</comment>
- <comment xml:lang="gl">Modelo de Modelica</comment>
- <comment xml:lang="he">דגם של Modelica</comment>
- <comment xml:lang="hr">Modelica model</comment>
- <comment xml:lang="hu">Modelica modell</comment>
- <comment xml:lang="ia">Modello Modelica</comment>
- <comment xml:lang="id">Model Modelica</comment>
- <comment xml:lang="it">Modello Modelica</comment>
- <comment xml:lang="ja">Modelica モデル</comment>
- <comment xml:lang="kk">Modelica моделі</comment>
- <comment xml:lang="ko">Modelica 모델</comment>
- <comment xml:lang="lv">Modelica modelis</comment>
- <comment xml:lang="oc">modèl Modelica</comment>
- <comment xml:lang="pl">Model Modelica</comment>
- <comment xml:lang="pt">modelo Modelica</comment>
- <comment xml:lang="pt-BR">Modelo da Modelica</comment>
- <comment xml:lang="ru">Модель Modelica</comment>
- <comment xml:lang="sk">Model Modelica</comment>
- <comment xml:lang="sl">Model Modelica</comment>
- <comment xml:lang="sr">модел Моделике</comment>
- <comment xml:lang="sv">Modelica-modell</comment>
- <comment xml:lang="tr">Modelica modeli</comment>
+ <comment xml:lang="zh_TW">Modelica 模型</comment>
+ <comment xml:lang="zh_CN">Modelica 模型</comment>
<comment xml:lang="uk">модель Modelica</comment>
- <comment xml:lang="zh-CN">Modelica 模型</comment>
- <comment xml:lang="zh-TW">Modelica 模型</comment>
+ <comment xml:lang="tr">Modelica modeli</comment>
+ <comment xml:lang="sv">Modelica-modell</comment>
+ <comment xml:lang="sr">модел Моделике</comment>
+ <comment xml:lang="sq">model Modelica</comment>
+ <comment xml:lang="sl">Model Modelica</comment>
+ <comment xml:lang="si">Modelica ආකෘතිය</comment>
+ <comment xml:lang="sk">Model Modelica</comment>
+ <comment xml:lang="ru">Модель Modelica</comment>
+ <comment xml:lang="pt_BR">Modelo da Modelica</comment>
+ <comment xml:lang="pt">modelo Modelica</comment>
+ <comment xml:lang="pl">Model Modelica</comment>
+ <comment xml:lang="oc">modèl Modelica</comment>
+ <comment xml:lang="nl">Modelica-model</comment>
+ <comment xml:lang="lv">Modelica modelis</comment>
+ <comment xml:lang="ko">Modelica 모델</comment>
+ <comment xml:lang="kk">Modelica моделі</comment>
+ <comment xml:lang="ja">Modelica モデル</comment>
+ <comment xml:lang="it">Modello Modelica</comment>
+ <comment xml:lang="is">Modelica líkan</comment>
+ <comment xml:lang="id">Model Modelica</comment>
+ <comment xml:lang="ia">Modello Modelica</comment>
+ <comment xml:lang="hu">Modelica modell</comment>
+ <comment xml:lang="hr">Modelica model</comment>
+ <comment xml:lang="he">דגם של Modelica</comment>
+ <comment xml:lang="gl">Modelo de Modelica</comment>
+ <comment xml:lang="ga">samhail Modelica</comment>
+ <comment xml:lang="fur">model Modelica</comment>
+ <comment xml:lang="fr">modèle Modelica</comment>
+ <comment xml:lang="fi">Modelica-malli</comment>
+ <comment xml:lang="eu">Modelica modeloa</comment>
+ <comment xml:lang="es">modelo de Modelica</comment>
+ <comment xml:lang="en_GB">Modelica model</comment>
+ <comment xml:lang="el">Μοντέλο Modelica</comment>
+ <comment xml:lang="de">Modelica-Modell</comment>
+ <comment xml:lang="da">Modelica-model</comment>
+ <comment xml:lang="cs">model Modelica</comment>
+ <comment xml:lang="ca">model de Modelica</comment>
+ <comment xml:lang="bg">Модел — Modelica</comment>
+ <comment xml:lang="be">мадэль Modelica</comment>
+ <comment xml:lang="ar">نموذج Modelica</comment>
+ <comment xml:lang="af">Modelica-model</comment>
<sub-class-of type="text/plain"/>
<magic priority="10">
<match type="string" value="//" offset="0"/>
</magic>
- <magic priority="50">
+ <magic>
<match type="string" value="function" offset="0"/>
</magic>
- <magic priority="50">
+ <magic>
<match type="string" value="class" offset="0"/>
</magic>
- <magic priority="50">
+ <magic>
<match type="string" value="model" offset="0"/>
</magic>
- <magic priority="50">
+ <magic>
<match type="string" value="record" offset="0"/>
</magic>
<glob pattern="*.mo"/>
</mime-type>
<mime-type type="text/x-pascal">
<comment>Pascal source code</comment>
- <comment xml:lang="af">Pascal-bronkode</comment>
- <comment xml:lang="ar">شفرة مصدر باسكال</comment>
- <comment xml:lang="be-Latn">Kryničny kod Pascal</comment>
- <comment xml:lang="bg">Изходен код — Pascal</comment>
- <comment xml:lang="ca">codi font en Pascal</comment>
- <comment xml:lang="cs">zdrojový kód v jazyce Pascal</comment>
- <comment xml:lang="da">Pascal-kildekode</comment>
- <comment xml:lang="de">Pascal-Quelltext</comment>
- <comment xml:lang="el">Πηγαίος κώδικας Pascal</comment>
- <comment xml:lang="en-GB">Pascal source code</comment>
- <comment xml:lang="eo">Pascal-fontkodo</comment>
- <comment xml:lang="es">código fuente en Pascal</comment>
- <comment xml:lang="eu">Pascal iturburu-kodea</comment>
- <comment xml:lang="fi">Pascal-lähdekoodi</comment>
- <comment xml:lang="fo">Pascal keldukota</comment>
- <comment xml:lang="fr">code source Pascal</comment>
- <comment xml:lang="fur">codiç sorzint Pascal</comment>
- <comment xml:lang="ga">cód foinseach Pascal</comment>
- <comment xml:lang="gl">código fonte en Pascal</comment>
- <comment xml:lang="he">קוד מקור של Pascal</comment>
- <comment xml:lang="hr">Pascal izvorni kôd</comment>
- <comment xml:lang="hu">Pascal-forráskód</comment>
- <comment xml:lang="ia">Codice-fonte Pascal</comment>
- <comment xml:lang="id">Kode sumber Pascal</comment>
- <comment xml:lang="it">Codice sorgente Pascal</comment>
- <comment xml:lang="ja">Pascal ソースコード</comment>
- <comment xml:lang="kk">Pascal бастапқы коды</comment>
- <comment xml:lang="ko">파스칼 소스 코드</comment>
- <comment xml:lang="lt">Pascal pradinis kodas</comment>
- <comment xml:lang="lv">Pascal pirmkods</comment>
- <comment xml:lang="ms">Kod sumber Pascal</comment>
- <comment xml:lang="nb">Pascal-kildekode</comment>
- <comment xml:lang="nl">Pascal-broncode</comment>
- <comment xml:lang="nn">Pascal-kjeldekode</comment>
- <comment xml:lang="oc">còde font Pascal</comment>
- <comment xml:lang="pl">Kod źródłowy Pascal</comment>
- <comment xml:lang="pt">código origem Pascal</comment>
- <comment xml:lang="pt-BR">Código-fonte Pascal</comment>
- <comment xml:lang="ro">Cod sursă Pascal</comment>
- <comment xml:lang="ru">Исходный код Pascal</comment>
- <comment xml:lang="sk">Zdrojový kód Pascal</comment>
- <comment xml:lang="sl">Datoteka izvorne kode Pascal</comment>
- <comment xml:lang="sq">Kod burues Pascal</comment>
- <comment xml:lang="sr">Паскалов изворни ко̂д</comment>
- <comment xml:lang="sv">Pascal-källkod</comment>
- <comment xml:lang="tr">Pascal kaynak kodu</comment>
- <comment xml:lang="uk">вихідний код мовою Pascal</comment>
+ <comment xml:lang="zh_TW">Pascal 源碼</comment>
+ <comment xml:lang="zh_CN">Pascal 源代码</comment>
<comment xml:lang="vi">Mã nguồn Pascal</comment>
- <comment xml:lang="zh-CN">Pascal 源代码</comment>
- <comment xml:lang="zh-TW">Pascal 源碼</comment>
+ <comment xml:lang="uk">початковий код мовою Pascal</comment>
+ <comment xml:lang="tr">Pascal kaynak kodu</comment>
+ <comment xml:lang="sv">Pascal-källkod</comment>
+ <comment xml:lang="sr">Паскалов изворни ко̂д</comment>
+ <comment xml:lang="sq">kod burim Pascal</comment>
+ <comment xml:lang="sl">Datoteka izvorne kode Pascal</comment>
+ <comment xml:lang="si">පැස්කල් මූල කේතය</comment>
+ <comment xml:lang="sk">Zdrojový kód Pascal</comment>
+ <comment xml:lang="ru">Исходный код Pascal</comment>
+ <comment xml:lang="ro">Cod sursă Pascal</comment>
+ <comment xml:lang="pt_BR">Código-fonte Pascal</comment>
+ <comment xml:lang="pt">código origem Pascal</comment>
+ <comment xml:lang="pl">Kod źródłowy Pascal</comment>
+ <comment xml:lang="oc">còde font Pascal</comment>
+ <comment xml:lang="nn">Pascal-kjeldekode</comment>
+ <comment xml:lang="nl">Pascal-broncode</comment>
+ <comment xml:lang="nb">Pascal-kildekode</comment>
+ <comment xml:lang="ms">Kod sumber Pascal</comment>
+ <comment xml:lang="lv">Pascal pirmkods</comment>
+ <comment xml:lang="lt">Pascal pradinis kodas</comment>
+ <comment xml:lang="ko">파스칼 소스 코드</comment>
+ <comment xml:lang="kk">Pascal бастапқы коды</comment>
+ <comment xml:lang="ja">Pascal ソースコード</comment>
+ <comment xml:lang="it">Codice sorgente Pascal</comment>
+ <comment xml:lang="is">Pascal frumkóði</comment>
+ <comment xml:lang="id">Kode sumber Pascal</comment>
+ <comment xml:lang="ia">Codice-fonte Pascal</comment>
+ <comment xml:lang="hu">Pascal-forráskód</comment>
+ <comment xml:lang="hr">Pascal izvorni kôd</comment>
+ <comment xml:lang="he">קוד מקור של Pascal</comment>
+ <comment xml:lang="gl">código fonte en Pascal</comment>
+ <comment xml:lang="ga">cód foinseach Pascal</comment>
+ <comment xml:lang="fur">codiç sorzint Pascal</comment>
+ <comment xml:lang="fr">code source Pascal</comment>
+ <comment xml:lang="fo">Pascal keldukota</comment>
+ <comment xml:lang="fi">Pascal-lähdekoodi</comment>
+ <comment xml:lang="eu">Pascal iturburu-kodea</comment>
+ <comment xml:lang="es">código fuente en Pascal</comment>
+ <comment xml:lang="eo">Pascal-fontkodo</comment>
+ <comment xml:lang="en_GB">Pascal source code</comment>
+ <comment xml:lang="el">Πηγαίος κώδικας Pascal</comment>
+ <comment xml:lang="de">Pascal-Quelltext</comment>
+ <comment xml:lang="da">Pascal-kildekode</comment>
+ <comment xml:lang="cs">zdrojový kód v jazyce Pascal</comment>
+ <comment xml:lang="ca">codi font en Pascal</comment>
+ <comment xml:lang="bg">Изходен код — Pascal</comment>
+ <comment xml:lang="be@latin">Kryničny kod Pascal</comment>
+ <comment xml:lang="be">зыходны код Pascal</comment>
+ <comment xml:lang="ar">شفرة مصدر باسكال</comment>
+ <comment xml:lang="af">Pascal-bronkode</comment>
<sub-class-of type="text/plain"/>
<glob pattern="*.p"/>
<glob pattern="*.pas"/>
</mime-type>
<mime-type type="text/x-patch">
- <comment>differences between files</comment>
- <comment xml:lang="af">verskille tussen lêers</comment>
- <comment xml:lang="ar">الاختلافات بين الملفات</comment>
- <comment xml:lang="be-Latn">adroźnieńni pamiž fajłami</comment>
- <comment xml:lang="bg">Разлики между файлове</comment>
- <comment xml:lang="ca">diferències entre fitxers</comment>
- <comment xml:lang="cs">rozdíly mezi soubory</comment>
- <comment xml:lang="da">forskel mellem filer</comment>
- <comment xml:lang="de">Unterschiede zwischen Dateien</comment>
- <comment xml:lang="el">Διαφορές μεταξύ αρχείων</comment>
- <comment xml:lang="en-GB">differences between files</comment>
- <comment xml:lang="eo">diferencoj inter dosieroj</comment>
- <comment xml:lang="es">diferencias entre archivos</comment>
- <comment xml:lang="eu">fitxategien arteko ezberdintasunak</comment>
- <comment xml:lang="fi">tiedostojen väliset erot</comment>
- <comment xml:lang="fo">munur millum fílur</comment>
- <comment xml:lang="fr">différences entre fichiers</comment>
- <comment xml:lang="fur">diferencis tra file</comment>
- <comment xml:lang="ga">difríochtaí idir chomhaid</comment>
- <comment xml:lang="gl">diferenzas entre ficheiros</comment>
- <comment xml:lang="he">הבדל בין קבצים</comment>
- <comment xml:lang="hr">Razlike između datoteka</comment>
- <comment xml:lang="hu">diff-különbségfájl</comment>
- <comment xml:lang="ia">Differentias inter files</comment>
- <comment xml:lang="id">perbedaan diantara berkas</comment>
- <comment xml:lang="it">Differenze tra file</comment>
- <comment xml:lang="ja">ファイル間差分</comment>
- <comment xml:lang="kk">файлдар арасындағы айырмашылықтары</comment>
- <comment xml:lang="ko">파일 사이의 차이점</comment>
- <comment xml:lang="lt">skirtumai tarp failų</comment>
- <comment xml:lang="lv">divu datņu atšķirība</comment>
- <comment xml:lang="ms">Perbezaan antara fail</comment>
- <comment xml:lang="nb">forskjeller mellom filer</comment>
- <comment xml:lang="nl">verschillen tussen bestanden</comment>
- <comment xml:lang="nn">skilnader mellom filer</comment>
- <comment xml:lang="oc">différences entre fichièrs</comment>
- <comment xml:lang="pl">Różnica pomiędzy plikami</comment>
- <comment xml:lang="pt">diferenças entre ficheiros</comment>
- <comment xml:lang="pt-BR">Diferenças entre arquivos</comment>
- <comment xml:lang="ro">diferențe între fișiere</comment>
- <comment xml:lang="ru">Различия между файлами</comment>
- <comment xml:lang="sk">Rozdiely medzi súbormi</comment>
- <comment xml:lang="sl">razlike med datotekami</comment>
- <comment xml:lang="sq">Diferencë midis file</comment>
- <comment xml:lang="sr">разлике између датотека</comment>
- <comment xml:lang="sv">skillnader mellan filer</comment>
- <comment xml:lang="tr">dosyalar arasındaki fark</comment>
+ <comment>Differences between files</comment>
<comment xml:lang="uk">різниця між файлами</comment>
- <comment xml:lang="vi">khác biệt giữa các tập tin</comment>
- <comment xml:lang="zh-CN">文件的区别</comment>
- <comment xml:lang="zh-TW">檔案內容差異</comment>
+ <comment xml:lang="sv">Skillnader mellan filer</comment>
+ <comment xml:lang="ru">Различия между файлами</comment>
+ <comment xml:lang="pl">Różnica pomiędzy plikami</comment>
+ <comment xml:lang="ja">差分文書</comment>
+ <comment xml:lang="it">Differenze tra file</comment>
+ <comment xml:lang="gl">Diferenzas entre ficheiros</comment>
+ <comment xml:lang="eu">Fitxategien arteko diferentziak</comment>
+ <comment xml:lang="es">diferencias entre archivos</comment>
+ <comment xml:lang="de">Unterschiede zwischen Dateien</comment>
+ <comment xml:lang="be">адрозненні паміж файламі</comment>
<alias type="text/x-diff"/>
<sub-class-of type="text/plain"/>
- <magic priority="50">
+ <magic>
<match type="string" value="diff\t" offset="0"/>
<match type="string" value="diff " offset="0"/>
<match type="string" value="***\t" offset="0"/>
@@ -36921,89 +37736,164 @@ command to generate the output files.
<glob pattern="*.diff"/>
<glob pattern="*.patch"/>
</mime-type>
+ <mime-type type="application/vnd.dart">
+ <comment>Dart source code</comment>
+ <comment xml:lang="zh_TW">Dart 原始碼</comment>
+ <comment xml:lang="zh_CN">Dart 源代码</comment>
+ <comment xml:lang="uk">початковий код мовою Dart</comment>
+ <comment xml:lang="tr">Dart kaynak kodu</comment>
+ <comment xml:lang="sv">Dart-källkod</comment>
+ <comment xml:lang="sl">Izvorna koda Dart</comment>
+ <comment xml:lang="si">ඩාර්ට් මූලාශ්‍ර කේතය</comment>
+ <comment xml:lang="ru">Исходный код Dart</comment>
+ <comment xml:lang="pt_BR">Código-fonte Dart</comment>
+ <comment xml:lang="pl">Kod źródłowy Dart</comment>
+ <comment xml:lang="nl">Dart-broncode</comment>
+ <comment xml:lang="ko">Dart 소스 코드</comment>
+ <comment xml:lang="kk">Dart бастапқы коды</comment>
+ <comment xml:lang="ja">Dart ソースコード</comment>
+ <comment xml:lang="it">Codice sorgente Dart</comment>
+ <comment xml:lang="hr">Dart izvorni kôd</comment>
+ <comment xml:lang="he">קוד מקור ב־Dart</comment>
+ <comment xml:lang="gl">Código fonte Dart</comment>
+ <comment xml:lang="fi">Dart-lähdekoodi</comment>
+ <comment xml:lang="eu">Dart iturburu-kodea</comment>
+ <comment xml:lang="es">código fuente Dart</comment>
+ <comment xml:lang="en_GB">Dart source code</comment>
+ <comment xml:lang="de">Dart-Quelltext</comment>
+ <comment xml:lang="be">зыходны код Dart</comment>
+ <comment xml:lang="ar">شفرة مصدر Dart</comment>
+ <sub-class-of type="text/plain"/>
+ <glob pattern="*.dart"/>
+ <alias type="text/x-dart"/>
+ </mime-type>
+ <mime-type type="text/x-nim">
+ <comment>Nim source code</comment>
+ <comment xml:lang="uk">початковий код мовою Nim</comment>
+ <comment xml:lang="sv">Nim-källkod</comment>
+ <comment xml:lang="ru">Исходный код Nim</comment>
+ <comment xml:lang="pl">Kod źródłowy Nim</comment>
+ <comment xml:lang="it">Codice sorgente Nim</comment>
+ <comment xml:lang="gl">Código fonte Nim</comment>
+ <comment xml:lang="eu">Nim iturburu-kodea</comment>
+ <comment xml:lang="es">código fuente en Nim</comment>
+ <comment xml:lang="de">Nim-Quelltext</comment>
+ <comment xml:lang="be">зыходны код Nim</comment>
+ <sub-class-of type="text/plain"/>
+ <glob pattern="*.nim"/>
+ </mime-type>
+ <mime-type type="text/x-nimscript">
+ <comment>Nimscript source code</comment>
+ <comment xml:lang="uk">початковий код мовою Nimscript</comment>
+ <comment xml:lang="sv">Nimscript-källkod</comment>
+ <comment xml:lang="ru">Исходный код Nimscript</comment>
+ <comment xml:lang="pl">Kod źródłowy NimScript</comment>
+ <comment xml:lang="it">Codice sorgente Nimscript</comment>
+ <comment xml:lang="gl">Código fonte Nimscript</comment>
+ <comment xml:lang="eu">Nimscript iturburu-kodea</comment>
+ <comment xml:lang="es">código fuente en Nimscript</comment>
+ <comment xml:lang="de">Nimscript-Quelltext</comment>
+ <comment xml:lang="be">зыходны код Nimscript</comment>
+ <sub-class-of type="text/x-nim"/>
+ <glob pattern="*.nims"/>
+ <glob pattern="*.nimble"/>
+ </mime-type>
<mime-type type="text/x-go">
<comment>Go source code</comment>
- <comment xml:lang="af">Go-bronkode</comment>
- <comment xml:lang="bg">Изходен код — Go</comment>
- <comment xml:lang="ca">codi font en Go</comment>
- <comment xml:lang="cs">zdrojový kód v jazyce Go</comment>
- <comment xml:lang="da">Go-kildekode</comment>
- <comment xml:lang="de">Go-Quelltext</comment>
- <comment xml:lang="el">Πηγαίος κώδικας Go</comment>
- <comment xml:lang="en-GB">Go source code</comment>
- <comment xml:lang="eo">Go-fontkodo</comment>
- <comment xml:lang="es">código fuente en Go</comment>
- <comment xml:lang="eu">Go iturburu-kodea</comment>
- <comment xml:lang="fi">Go-lähdekoodi</comment>
- <comment xml:lang="fr">code source Go</comment>
- <comment xml:lang="fur">codiç sorzint Go</comment>
- <comment xml:lang="ga">cód foinseach Go</comment>
- <comment xml:lang="gl">código fonte de Go</comment>
- <comment xml:lang="he">קוד מקור של Go</comment>
- <comment xml:lang="hr">Go izvorni kôd</comment>
- <comment xml:lang="hu">Go forráskód</comment>
- <comment xml:lang="ia">Codice-fonte Go</comment>
- <comment xml:lang="id">Kode sumber Go</comment>
- <comment xml:lang="it">Codice sorgente Go</comment>
- <comment xml:lang="ja">Go ソースコード</comment>
- <comment xml:lang="ka">Go-ის საწყისი კოდი</comment>
- <comment xml:lang="kk">Go бастапқы коды</comment>
- <comment xml:lang="ko">Go 소스 코드</comment>
- <comment xml:lang="lv">Go pirmkods</comment>
- <comment xml:lang="nl">Go broncode</comment>
- <comment xml:lang="oc">còde font Go</comment>
- <comment xml:lang="pl">Kod źródłowy Go</comment>
- <comment xml:lang="pt">cigo origem Go</comment>
- <comment xml:lang="pt-BR">Código-fonte Go</comment>
- <comment xml:lang="ru">Исходный код Go</comment>
- <comment xml:lang="sk">Zdrojový kód Go</comment>
- <comment xml:lang="sl">Izvorna koda Go</comment>
- <comment xml:lang="sr">Гоу изворни ко̂д</comment>
- <comment xml:lang="sv">Go-källkod</comment>
+ <comment xml:lang="zh_TW">Go 源碼</comment>
+ <comment xml:lang="zh_CN">Go 源代码</comment>
+ <comment xml:lang="uk">початковий код мовою Go</comment>
<comment xml:lang="tr">Go kaynak kodu</comment>
- <comment xml:lang="uk">вихідний код мовою Go</comment>
- <comment xml:lang="zh-CN">Go 源代码</comment>
- <comment xml:lang="zh-TW">Go 源碼</comment>
+ <comment xml:lang="sv">Go-källkod</comment>
+ <comment xml:lang="sr">Гоу изворни ко̂д</comment>
+ <comment xml:lang="sq">kod burim Go</comment>
+ <comment xml:lang="sl">Izvorna koda Go</comment>
+ <comment xml:lang="si">මූල කේතය වෙත යන්න</comment>
+ <comment xml:lang="sk">Zdrojový kód Go</comment>
+ <comment xml:lang="ru">Исходный код Go</comment>
+ <comment xml:lang="pt_BR">Código-fonte Go</comment>
+ <comment xml:lang="pt">cigo origem Go</comment>
+ <comment xml:lang="pl">Kod źródłowy Go</comment>
+ <comment xml:lang="oc">còde font Go</comment>
+ <comment xml:lang="nl">Go-broncode</comment>
+ <comment xml:lang="lv">Go pirmkods</comment>
+ <comment xml:lang="ko">Go 소스 코드</comment>
+ <comment xml:lang="kk">Go бастапқы коды</comment>
+ <comment xml:lang="ka">Go-ის საწყისი კოდი</comment>
+ <comment xml:lang="ja">Go ソースコード</comment>
+ <comment xml:lang="it">Codice sorgente Go</comment>
+ <comment xml:lang="is">Go frumkóði</comment>
+ <comment xml:lang="id">Kode sumber Go</comment>
+ <comment xml:lang="ia">Codice-fonte Go</comment>
+ <comment xml:lang="hu">Go forráskód</comment>
+ <comment xml:lang="hr">Go izvorni kôd</comment>
+ <comment xml:lang="he">קוד מקור של Go</comment>
+ <comment xml:lang="gl">código fonte de Go</comment>
+ <comment xml:lang="ga">cód foinseach Go</comment>
+ <comment xml:lang="fur">codiç sorzint Go</comment>
+ <comment xml:lang="fr">code source Go</comment>
+ <comment xml:lang="fi">Go-lähdekoodi</comment>
+ <comment xml:lang="eu">Go iturburu-kodea</comment>
+ <comment xml:lang="es">código fuente en Go</comment>
+ <comment xml:lang="eo">Go-fontkodo</comment>
+ <comment xml:lang="en_GB">Go source code</comment>
+ <comment xml:lang="el">Πηγαίος κώδικας Go</comment>
+ <comment xml:lang="de">Go-Quelltext</comment>
+ <comment xml:lang="da">Go-kildekode</comment>
+ <comment xml:lang="cs">zdrojový kód v jazyce Go</comment>
+ <comment xml:lang="ca">codi font en Go</comment>
+ <comment xml:lang="bg">Изходен код — Go</comment>
+ <comment xml:lang="be">зыходны код Go</comment>
+ <comment xml:lang="ar">شفرة مصدر غو</comment>
+ <comment xml:lang="af">Go-bronkode</comment>
<sub-class-of type="text/plain"/>
<glob pattern="*.go"/>
</mime-type>
<mime-type type="text/x-scons">
<comment>SCons configuration file</comment>
- <comment xml:lang="af">SCons-opstellingslêer</comment>
- <comment xml:lang="bg">Настройки — SCons</comment>
- <comment xml:lang="ca">fitxer de configuració de SCons</comment>
- <comment xml:lang="cs">konfigurační soubor SCons</comment>
- <comment xml:lang="da">SCons-konfigurationsfil</comment>
- <comment xml:lang="de">SCons-Konfigurationsdatei</comment>
- <comment xml:lang="el">Αρχείο ρυθμίσεων SCons</comment>
- <comment xml:lang="en-GB">SCons configuration file</comment>
- <comment xml:lang="es">archivo de configuración de SCons</comment>
- <comment xml:lang="eu">SCons konfigurazio-fitxategia</comment>
- <comment xml:lang="fi">SCons-asetustiedosto</comment>
- <comment xml:lang="fr">fichier de configuration SCons</comment>
- <comment xml:lang="fur">file di configurazion SCons</comment>
- <comment xml:lang="ga">comhad cumraíochta SCons</comment>
- <comment xml:lang="he">קובץ תצורה של SCons</comment>
- <comment xml:lang="hr">SCons datoteka podešavanja</comment>
- <comment xml:lang="hu">SCons beállítófájl</comment>
- <comment xml:lang="ia">File de cofniguration SCons</comment>
- <comment xml:lang="id">Berkas konfigurasi SCons</comment>
- <comment xml:lang="it">File configurazione SCons</comment>
- <comment xml:lang="kk">SCons баптаулар файлы</comment>
- <comment xml:lang="ko">SCons 설정 파일</comment>
- <comment xml:lang="oc">fichièr de configuracion SCons</comment>
- <comment xml:lang="pl">Plik konfiguracji SCons</comment>
- <comment xml:lang="pt">ficheiro de configuração SCons</comment>
- <comment xml:lang="pt-BR">Arquivo de configuração do SCons</comment>
- <comment xml:lang="ru">Файл настроек SCons</comment>
- <comment xml:lang="sk">Konfiguračný súbor SCons</comment>
- <comment xml:lang="sl">Prilagoditvena datoteka SCons</comment>
- <comment xml:lang="sr">СКонс датотека подешавања</comment>
- <comment xml:lang="sv">SCons-konfigurationsfil</comment>
- <comment xml:lang="tr">SCons yapılandırma dosyası</comment>
+ <comment xml:lang="zh_TW">SCons 組態檔</comment>
+ <comment xml:lang="zh_CN">SCons 配置文件</comment>
<comment xml:lang="uk">файл налаштувань SCons</comment>
- <comment xml:lang="zh-CN">SCons 配置文件</comment>
- <comment xml:lang="zh-TW">SCons 組態檔</comment>
+ <comment xml:lang="tr">SCons yapılandırma dosyası</comment>
+ <comment xml:lang="sv">SCons-konfigurationsfil</comment>
+ <comment xml:lang="sr">СКонс датотека подешавања</comment>
+ <comment xml:lang="sq">kartelë formësimi SCons</comment>
+ <comment xml:lang="sl">Prilagoditvena datoteka SCons</comment>
+ <comment xml:lang="si">SCons වින්‍යාස ගොනුව</comment>
+ <comment xml:lang="sk">Konfiguračný súbor SCons</comment>
+ <comment xml:lang="ru">Файл настроек SCons</comment>
+ <comment xml:lang="pt_BR">Arquivo de configuração do SCons</comment>
+ <comment xml:lang="pt">ficheiro de configuração SCons</comment>
+ <comment xml:lang="pl">Plik konfiguracji SCons</comment>
+ <comment xml:lang="oc">fichièr de configuracion SCons</comment>
+ <comment xml:lang="nl">SCons-configuratiebestand</comment>
+ <comment xml:lang="ko">SCons 설정 파일</comment>
+ <comment xml:lang="kk">SCons баптаулар файлы</comment>
+ <comment xml:lang="ja">SCons 設定ファイル</comment>
+ <comment xml:lang="it">File configurazione SCons</comment>
+ <comment xml:lang="is">SCons stillingaskrá</comment>
+ <comment xml:lang="id">Berkas konfigurasi SCons</comment>
+ <comment xml:lang="ia">File de cofniguration SCons</comment>
+ <comment xml:lang="hu">SCons beállítófájl</comment>
+ <comment xml:lang="hr">SCons datoteka podešavanja</comment>
+ <comment xml:lang="he">קובץ תצורה של SCons</comment>
+ <comment xml:lang="gl">Ficheiro de configuración SCons</comment>
+ <comment xml:lang="ga">comhad cumraíochta SCons</comment>
+ <comment xml:lang="fur">file di configurazion SCons</comment>
+ <comment xml:lang="fr">fichier de configuration SCons</comment>
+ <comment xml:lang="fi">SCons-asetustiedosto</comment>
+ <comment xml:lang="eu">SCons konfigurazio-fitxategia</comment>
+ <comment xml:lang="es">archivo de configuración de SCons</comment>
+ <comment xml:lang="en_GB">SCons configuration file</comment>
+ <comment xml:lang="el">Αρχείο ρυθμίσεων SCons</comment>
+ <comment xml:lang="de">SCons-Konfigurationsdatei</comment>
+ <comment xml:lang="da">SCons-konfigurationsfil</comment>
+ <comment xml:lang="cs">konfigurační soubor SCons</comment>
+ <comment xml:lang="ca">fitxer de configuració de SCons</comment>
+ <comment xml:lang="bg">Настройки — SCons</comment>
+ <comment xml:lang="be">файл канфігурацыі SCons</comment>
+ <comment xml:lang="ar">ملف إعداد SCons</comment>
+ <comment xml:lang="af">SCons-opstellingslêer</comment>
<sub-class-of type="text/x-python"/>
<glob pattern="SConstruct"/>
<glob pattern="SConscript"/>
@@ -37011,37 +37901,47 @@ command to generate the output files.
</mime-type>
<mime-type type="text/x-python3">
<comment>Python 3 script</comment>
- <comment xml:lang="af">Python 3-skrip</comment>
- <comment xml:lang="bg">Скрипт — Python 3</comment>
- <comment xml:lang="ca">script Python 3</comment>
- <comment xml:lang="cs">skript v jazyce Python 3</comment>
- <comment xml:lang="da">Python 3-program</comment>
- <comment xml:lang="de">Python-3-Skript</comment>
- <comment xml:lang="en-GB">Python 3 script</comment>
- <comment xml:lang="es">secuencia de órdenes en Python 3</comment>
- <comment xml:lang="eu">Python 3 script-a</comment>
- <comment xml:lang="fi">Python 3 -skripti</comment>
- <comment xml:lang="fr">script Python 3</comment>
- <comment xml:lang="fur">script Python 3</comment>
- <comment xml:lang="ga">script Python 3</comment>
- <comment xml:lang="hr">Python3 skripta</comment>
- <comment xml:lang="hu">Python 3 parancsfájl</comment>
- <comment xml:lang="id">Skrip Python 3</comment>
- <comment xml:lang="it">Script Python 3</comment>
- <comment xml:lang="kk">Python 3 скрипті</comment>
- <comment xml:lang="ko">파이썬 3 스크립트</comment>
- <comment xml:lang="pl">Skrypt Python 3</comment>
- <comment xml:lang="pt-BR">Script Python 3</comment>
- <comment xml:lang="ru">Сценарий Python 3</comment>
- <comment xml:lang="sk">Skript Python 3</comment>
- <comment xml:lang="sl">Skript Python 3</comment>
- <comment xml:lang="sv">Python 3-skript</comment>
- <comment xml:lang="tr">Python 3 betiği</comment>
+ <comment xml:lang="zh_TW">Python 3 指令稿</comment>
+ <comment xml:lang="zh_CN">Python 3 脚本</comment>
<comment xml:lang="uk">скрипт мовою Python 3</comment>
- <comment xml:lang="zh-CN">Python 3 脚本</comment>
- <comment xml:lang="zh-TW">Python 3 指令稿</comment>
+ <comment xml:lang="tr">Python 3 betiği</comment>
+ <comment xml:lang="sv">Python 3-skript</comment>
+ <comment xml:lang="sq">programth Python 3</comment>
+ <comment xml:lang="sl">Skript Python 3</comment>
+ <comment xml:lang="si">Python 3 පිටපත</comment>
+ <comment xml:lang="sk">Skript Python 3</comment>
+ <comment xml:lang="ru">Сценарий Python 3</comment>
+ <comment xml:lang="pt_BR">Script Python 3</comment>
+ <comment xml:lang="pl">Skrypt Python 3</comment>
+ <comment xml:lang="oc">script Python 3</comment>
+ <comment xml:lang="nl">Python 3-script</comment>
+ <comment xml:lang="ko">파이썬 3 스크립트</comment>
+ <comment xml:lang="kk">Python 3 скрипті</comment>
+ <comment xml:lang="ja">Python 3 スクリプト</comment>
+ <comment xml:lang="it">Script Python 3</comment>
+ <comment xml:lang="is">Python 3 skrifta</comment>
+ <comment xml:lang="id">Skrip Python 3</comment>
+ <comment xml:lang="hu">Python 3 parancsfájl</comment>
+ <comment xml:lang="hr">Python3 skripta</comment>
+ <comment xml:lang="he">סקריפט Python 3</comment>
+ <comment xml:lang="ga">script Python 3</comment>
+ <comment xml:lang="fur">script Python 3</comment>
+ <comment xml:lang="fr">script Python 3</comment>
+ <comment xml:lang="fi">Python 3 -komentotiedosto</comment>
+ <comment xml:lang="eu">Python 3 script-a</comment>
+ <comment xml:lang="es">secuencia de órdenes en Python 3</comment>
+ <comment xml:lang="en_GB">Python 3 script</comment>
+ <comment xml:lang="de">Python-3-Skript</comment>
+ <comment xml:lang="da">Python 3-program</comment>
+ <comment xml:lang="cs">skript v jazyce Python 3</comment>
+ <comment xml:lang="ca">script Python 3</comment>
+ <comment xml:lang="bg">Скрипт — Python 3</comment>
+ <comment xml:lang="be">скрыпт Python 3</comment>
+ <comment xml:lang="ar">سكربت بايثون٣</comment>
+ <comment xml:lang="af">Python 3-skrip</comment>
<sub-class-of type="text/x-python"/>
- <magic priority="60"><!-- higher priority than text/x-python -->
+ <magic priority="60">
+ <!-- higher priority than text/x-python -->
<match type="string" value="#!/bin/python3" offset="0"/>
<match type="string" value="#! /bin/python3" offset="0"/>
<match type="string" value="eval \&quot;exec /bin/python3" offset="0"/>
@@ -37053,65 +37953,70 @@ command to generate the output files.
<match type="string" value="eval \&quot;exec /usr/local/bin/python3" offset="0"/>
<match type="string" value="/bin/env python3" offset="2:16"/>
</magic>
- <glob pattern="*.py" weight="50"/><!-- lower priority than in text/x-python -->
+ <glob pattern="*.py"/>
+ <!-- lower priority than in text/x-python -->
<glob pattern="*.py3" weight="60"/>
<glob pattern="*.py3x" weight="60"/>
+ <glob pattern="*.pyi" weight="60"/>
</mime-type>
<mime-type type="text/x-python">
<comment>Python script</comment>
- <comment xml:lang="af">Python-skrip</comment>
- <comment xml:lang="ar">سكربت بايثون</comment>
- <comment xml:lang="be-Latn">Skrypt Python</comment>
- <comment xml:lang="bg">Скрипт — Python</comment>
- <comment xml:lang="ca">script Python</comment>
- <comment xml:lang="cs">skript v jazyce Python</comment>
- <comment xml:lang="da">Python-program</comment>
- <comment xml:lang="de">Python-Skript</comment>
- <comment xml:lang="el">Δέσμη ενεργειών Python</comment>
- <comment xml:lang="en-GB">Python script</comment>
- <comment xml:lang="eo">Python-skripto</comment>
- <comment xml:lang="es">secuencia de órdenes en Python</comment>
- <comment xml:lang="eu">Python script-a</comment>
- <comment xml:lang="fi">Python-komentotiedosto</comment>
- <comment xml:lang="fo">Python boðrøð</comment>
- <comment xml:lang="fr">script Python</comment>
- <comment xml:lang="fur">script Python</comment>
- <comment xml:lang="ga">script Python</comment>
- <comment xml:lang="gl">Script en Python</comment>
- <comment xml:lang="he">תסריט Python</comment>
- <comment xml:lang="hr">Python skripta</comment>
- <comment xml:lang="hu">Python-parancsfájl</comment>
- <comment xml:lang="ia">Script Python</comment>
- <comment xml:lang="id">Skrip Python</comment>
- <comment xml:lang="it">Script Python</comment>
- <comment xml:lang="ja">Python スクリプト</comment>
- <comment xml:lang="kk">Python сценарийі</comment>
- <comment xml:lang="ko">파이썬 스크립트</comment>
- <comment xml:lang="lt">Python scenarijus</comment>
- <comment xml:lang="lv">Python skripts</comment>
- <comment xml:lang="ms">Skrip Python</comment>
- <comment xml:lang="nb">Python-skript</comment>
- <comment xml:lang="nl">Python-script</comment>
- <comment xml:lang="nn">Python-skript</comment>
- <comment xml:lang="oc">escript Python</comment>
- <comment xml:lang="pl">Skrypt Python</comment>
- <comment xml:lang="pt">script Python</comment>
- <comment xml:lang="pt-BR">Script Python</comment>
- <comment xml:lang="ro">Script Python</comment>
- <comment xml:lang="ru">Сценарий Python</comment>
- <comment xml:lang="sk">Skript Python</comment>
- <comment xml:lang="sl">Skriptna datoteka Python</comment>
- <comment xml:lang="sq">Script Python</comment>
- <comment xml:lang="sr">Питонова скрипта</comment>
- <comment xml:lang="sv">Pythonskript</comment>
- <comment xml:lang="tr">Python betiği</comment>
- <comment xml:lang="uk">скрипт мовою Python</comment>
+ <comment xml:lang="zh_TW">Python 指令稿</comment>
+ <comment xml:lang="zh_CN">Python 脚本</comment>
<comment xml:lang="vi">Văn lệnh Python</comment>
- <comment xml:lang="zh-CN">Python 脚本</comment>
- <comment xml:lang="zh-TW">Python 指令稿</comment>
+ <comment xml:lang="uk">скрипт мовою Python</comment>
+ <comment xml:lang="tr">Python betiği</comment>
+ <comment xml:lang="sv">Pythonskript</comment>
+ <comment xml:lang="sr">Питонова скрипта</comment>
+ <comment xml:lang="sq">programth Python</comment>
+ <comment xml:lang="sl">Skriptna datoteka Python</comment>
+ <comment xml:lang="si">පයිතන් පිටපත</comment>
+ <comment xml:lang="sk">Skript Python</comment>
+ <comment xml:lang="ru">Сценарий Python</comment>
+ <comment xml:lang="ro">Script Python</comment>
+ <comment xml:lang="pt_BR">Script Python</comment>
+ <comment xml:lang="pt">script Python</comment>
+ <comment xml:lang="pl">Skrypt Python</comment>
+ <comment xml:lang="oc">escript Python</comment>
+ <comment xml:lang="nn">Python-skript</comment>
+ <comment xml:lang="nl">Python-script</comment>
+ <comment xml:lang="nb">Python-skript</comment>
+ <comment xml:lang="ms">Skrip Python</comment>
+ <comment xml:lang="lv">Python skripts</comment>
+ <comment xml:lang="lt">Python scenarijus</comment>
+ <comment xml:lang="ko">파이썬 스크립트</comment>
+ <comment xml:lang="kk">Python сценарийі</comment>
+ <comment xml:lang="ja">Python スクリプト</comment>
+ <comment xml:lang="it">Script Python</comment>
+ <comment xml:lang="is">Python skrifta</comment>
+ <comment xml:lang="id">Skrip Python</comment>
+ <comment xml:lang="ia">Script Python</comment>
+ <comment xml:lang="hu">Python-parancsfájl</comment>
+ <comment xml:lang="hr">Python skripta</comment>
+ <comment xml:lang="he">תסריט Python</comment>
+ <comment xml:lang="gl">Script en Python</comment>
+ <comment xml:lang="ga">script Python</comment>
+ <comment xml:lang="fur">script Python</comment>
+ <comment xml:lang="fr">script Python</comment>
+ <comment xml:lang="fo">Python boðrøð</comment>
+ <comment xml:lang="fi">Python-komentotiedosto</comment>
+ <comment xml:lang="eu">Python script-a</comment>
+ <comment xml:lang="es">secuencia de órdenes en Python</comment>
+ <comment xml:lang="eo">Python-skripto</comment>
+ <comment xml:lang="en_GB">Python script</comment>
+ <comment xml:lang="el">Δέσμη ενεργειών Python</comment>
+ <comment xml:lang="de">Python-Skript</comment>
+ <comment xml:lang="da">Python-program</comment>
+ <comment xml:lang="cs">skript v jazyce Python</comment>
+ <comment xml:lang="ca">script Python</comment>
+ <comment xml:lang="bg">Скрипт — Python</comment>
+ <comment xml:lang="be@latin">Skrypt Python</comment>
+ <comment xml:lang="be">скрыпт Python</comment>
+ <comment xml:lang="ar">سكربت بايثون</comment>
+ <comment xml:lang="af">Python-skrip</comment>
<sub-class-of type="application/x-executable"/>
<sub-class-of type="text/plain"/>
- <magic priority="50">
+ <magic>
<match type="string" value="#!/bin/python" offset="0"/>
<match type="string" value="#! /bin/python" offset="0"/>
<match type="string" value="eval \&quot;exec /bin/python" offset="0"/>
@@ -37129,69 +38034,96 @@ command to generate the output files.
</mime-type>
<mime-type type="text/x-sagemath">
<comment>SageMath script</comment>
- <comment xml:lang="ca">script SageMath</comment>
- <comment xml:lang="fi">SageMath skripti</comment>
- <comment xml:lang="it">Script SageMath</comment>
- <comment xml:lang="pl">Skrypt SageMath</comment>
- <comment xml:lang="pt-BR">Script SageMath</comment>
+ <comment xml:lang="zh_TW">SageMath 指令稿</comment>
+ <comment xml:lang="zh_CN">SageMath 脚本</comment>
<comment xml:lang="uk">скрипт SageMath</comment>
+ <comment xml:lang="tr">SageMath betiği</comment>
+ <comment xml:lang="sv">SageMath-skript</comment>
+ <comment xml:lang="sl">Skript SageMath</comment>
+ <comment xml:lang="si">SageMath පිටපත</comment>
+ <comment xml:lang="ru">Сценарий SageMath</comment>
+ <comment xml:lang="pt_BR">Script SageMath</comment>
+ <comment xml:lang="pl">Skrypt SageMath</comment>
+ <comment xml:lang="nl">SageMath-script</comment>
+ <comment xml:lang="ko">SageMath 스크립트</comment>
+ <comment xml:lang="kk">SageMath сценарийі</comment>
+ <comment xml:lang="ja">SageMath スクリプト</comment>
+ <comment xml:lang="it">Script SageMath</comment>
+ <comment xml:lang="is">SageMath skrifta</comment>
+ <comment xml:lang="id">skrip SageMath</comment>
+ <comment xml:lang="hu">SageMath parancsfájl</comment>
+ <comment xml:lang="hr">SageMath skripta</comment>
+ <comment xml:lang="he">סקריפט SageMath</comment>
+ <comment xml:lang="fr">Script SageMath</comment>
+ <comment xml:lang="fi">SageMath-komentotiedosto</comment>
+ <comment xml:lang="eu">SageMath script-a</comment>
+ <comment xml:lang="es">secuencia de órdenes de SageMath</comment>
+ <comment xml:lang="en_GB">SageMath script</comment>
+ <comment xml:lang="de">SageMath-Skript</comment>
+ <comment xml:lang="da">SageMath-program</comment>
+ <comment xml:lang="ca">script SageMath</comment>
+ <comment xml:lang="be">скрыпт SageMath</comment>
+ <comment xml:lang="ar">سكربت SageMath</comment>
<sub-class-of type="text/x-python"/>
<glob pattern="*.sage" weight="60"/>
</mime-type>
<mime-type type="text/x-lua">
<comment>Lua script</comment>
- <comment xml:lang="af">Lua-skrip</comment>
- <comment xml:lang="ar">سكربت Lua</comment>
- <comment xml:lang="be-Latn">Skrypt Lua</comment>
- <comment xml:lang="bg">Скрипт на Lua</comment>
- <comment xml:lang="ca">script Lua</comment>
- <comment xml:lang="cs">skript v jazyce Lua</comment>
- <comment xml:lang="da">Lua-program</comment>
- <comment xml:lang="de">Lua-Skript</comment>
- <comment xml:lang="el">Δέσμη ενεργειών Lua</comment>
- <comment xml:lang="en-GB">Lua script</comment>
- <comment xml:lang="eo">Lua-skripto</comment>
- <comment xml:lang="es">secuencia de órdenes en Lua</comment>
- <comment xml:lang="eu">Lua script-a</comment>
- <comment xml:lang="fi">Lua-komentotiedosto</comment>
- <comment xml:lang="fo">Lua boðrøð</comment>
- <comment xml:lang="fr">script Lua</comment>
- <comment xml:lang="fur">script Lua</comment>
- <comment xml:lang="ga">script Lua</comment>
- <comment xml:lang="gl">script de Lua</comment>
- <comment xml:lang="he">תסריט Lua</comment>
- <comment xml:lang="hr">Lua skripta</comment>
- <comment xml:lang="hu">Lua parancsfájl</comment>
- <comment xml:lang="ia">Script Lua</comment>
- <comment xml:lang="id">Skrip Lua</comment>
- <comment xml:lang="it">Script Lua</comment>
- <comment xml:lang="ja">Lua スクリプト</comment>
- <comment xml:lang="kk">Lua сценарийі</comment>
- <comment xml:lang="ko">Lua 스크립트</comment>
- <comment xml:lang="lt">Lua scenarijus</comment>
- <comment xml:lang="lv">Lua skripts</comment>
- <comment xml:lang="nb">Lua-skript</comment>
- <comment xml:lang="nl">Lua-script</comment>
- <comment xml:lang="nn">Lua-skript</comment>
- <comment xml:lang="oc">escript Lua</comment>
- <comment xml:lang="pl">Skrypt Lua</comment>
- <comment xml:lang="pt">script Lua</comment>
- <comment xml:lang="pt-BR">Script Lua</comment>
- <comment xml:lang="ro">Script Lua</comment>
- <comment xml:lang="ru">Сценарий Lua</comment>
- <comment xml:lang="sk">Skript Lua</comment>
- <comment xml:lang="sl">Skriptna datoteka Lua</comment>
- <comment xml:lang="sq">Script Lua</comment>
- <comment xml:lang="sr">Луа скрипта</comment>
- <comment xml:lang="sv">Lua-skript</comment>
- <comment xml:lang="tr">Lua betiği</comment>
- <comment xml:lang="uk">скрипт Lua</comment>
+ <comment xml:lang="zh_TW">Lua 指令稿</comment>
+ <comment xml:lang="zh_CN">Lua 脚本</comment>
<comment xml:lang="vi">Văn lệnh Lua</comment>
- <comment xml:lang="zh-CN">Lua 脚本</comment>
- <comment xml:lang="zh-TW">Lua 指令稿</comment>
+ <comment xml:lang="uk">скрипт Lua</comment>
+ <comment xml:lang="tr">Lua betiği</comment>
+ <comment xml:lang="sv">Lua-skript</comment>
+ <comment xml:lang="sr">Луа скрипта</comment>
+ <comment xml:lang="sq">programth Lua</comment>
+ <comment xml:lang="sl">Skriptna datoteka Lua</comment>
+ <comment xml:lang="si">Lua පිටපත</comment>
+ <comment xml:lang="sk">Skript Lua</comment>
+ <comment xml:lang="ru">Сценарий Lua</comment>
+ <comment xml:lang="ro">Script Lua</comment>
+ <comment xml:lang="pt_BR">Script Lua</comment>
+ <comment xml:lang="pt">script Lua</comment>
+ <comment xml:lang="pl">Skrypt Lua</comment>
+ <comment xml:lang="oc">escript Lua</comment>
+ <comment xml:lang="nn">Lua-skript</comment>
+ <comment xml:lang="nl">Lua-script</comment>
+ <comment xml:lang="nb">Lua-skript</comment>
+ <comment xml:lang="lv">Lua skripts</comment>
+ <comment xml:lang="lt">Lua scenarijus</comment>
+ <comment xml:lang="ko">Lua 스크립트</comment>
+ <comment xml:lang="kk">Lua сценарийі</comment>
+ <comment xml:lang="ja">Lua スクリプト</comment>
+ <comment xml:lang="it">Script Lua</comment>
+ <comment xml:lang="is">Lua skrifta</comment>
+ <comment xml:lang="id">Skrip Lua</comment>
+ <comment xml:lang="ia">Script Lua</comment>
+ <comment xml:lang="hu">Lua parancsfájl</comment>
+ <comment xml:lang="hr">Lua skripta</comment>
+ <comment xml:lang="he">תסריט Lua</comment>
+ <comment xml:lang="gl">script de Lua</comment>
+ <comment xml:lang="ga">script Lua</comment>
+ <comment xml:lang="fur">script Lua</comment>
+ <comment xml:lang="fr">script Lua</comment>
+ <comment xml:lang="fo">Lua boðrøð</comment>
+ <comment xml:lang="fi">Lua-komentotiedosto</comment>
+ <comment xml:lang="eu">Lua script-a</comment>
+ <comment xml:lang="es">secuencia de órdenes en Lua</comment>
+ <comment xml:lang="eo">Lua-skripto</comment>
+ <comment xml:lang="en_GB">Lua script</comment>
+ <comment xml:lang="el">Δέσμη ενεργειών Lua</comment>
+ <comment xml:lang="de">Lua-Skript</comment>
+ <comment xml:lang="da">Lua-program</comment>
+ <comment xml:lang="cs">skript v jazyce Lua</comment>
+ <comment xml:lang="ca">script Lua</comment>
+ <comment xml:lang="bg">Скрипт на Lua</comment>
+ <comment xml:lang="be@latin">Skrypt Lua</comment>
+ <comment xml:lang="be">скрыпт Lua</comment>
+ <comment xml:lang="ar">سكربت Lua</comment>
+ <comment xml:lang="af">Lua-skrip</comment>
<sub-class-of type="application/x-executable"/>
<sub-class-of type="text/plain"/>
- <magic priority="50">
+ <magic>
<match type="string" value="/bin/lua" offset="2:16"/>
<match type="string" value="/bin/luajit" offset="2:16"/>
<match type="string" value="/bin/env lua" offset="2:16"/>
@@ -37201,208 +38133,241 @@ command to generate the output files.
</mime-type>
<mime-type type="text/x-readme">
<comment>README document</comment>
- <comment xml:lang="af">README-dokument</comment>
- <comment xml:lang="ar">مستند README</comment>
- <comment xml:lang="ast">Documentu LLEIME</comment>
- <comment xml:lang="az">README sənədi</comment>
- <comment xml:lang="be-Latn">Dakument README</comment>
- <comment xml:lang="bg">Документ — „Да се прочете“</comment>
- <comment xml:lang="ca">document README</comment>
- <comment xml:lang="cs">dokument README</comment>
- <comment xml:lang="cy">Dogfen README</comment>
- <comment xml:lang="da">README-dokument</comment>
- <comment xml:lang="de">README-Dokument</comment>
- <comment xml:lang="el">Έγγραφο README</comment>
- <comment xml:lang="en-GB">README document</comment>
- <comment xml:lang="eo">README-dokumento</comment>
- <comment xml:lang="es">documento README</comment>
- <comment xml:lang="eu">README dokumentua</comment>
- <comment xml:lang="fi">LUEMINUT-asiakirja</comment>
- <comment xml:lang="fo">README skjal</comment>
- <comment xml:lang="fr">document LISEZ-MOI</comment>
- <comment xml:lang="fur">document README</comment>
- <comment xml:lang="ga">cáipéis README</comment>
- <comment xml:lang="gl">documento README</comment>
- <comment xml:lang="he">מסמך README</comment>
- <comment xml:lang="hr">README dokument</comment>
- <comment xml:lang="hu">README-dokumentum</comment>
- <comment xml:lang="ia">Documento LEGE-ME</comment>
- <comment xml:lang="id">Dokumen README</comment>
- <comment xml:lang="it">Documento README</comment>
- <comment xml:lang="ja">README ドキュメント</comment>
- <comment xml:lang="kk">README құжаты</comment>
- <comment xml:lang="ko">README 문서</comment>
- <comment xml:lang="lt">README dokumentas</comment>
- <comment xml:lang="lv">README dokuments</comment>
- <comment xml:lang="ms">Dokumen README</comment>
- <comment xml:lang="nb">README-dokument</comment>
- <comment xml:lang="nl">LEESMIJ-document</comment>
- <comment xml:lang="nn">README-dokument</comment>
- <comment xml:lang="oc">document LISEZ-MOI</comment>
- <comment xml:lang="pl">Dokument README</comment>
- <comment xml:lang="pt">documento LEIA-ME</comment>
- <comment xml:lang="pt-BR">Documento README</comment>
- <comment xml:lang="ro">Document README</comment>
- <comment xml:lang="ru">Документ README</comment>
- <comment xml:lang="sk">Dokument README</comment>
- <comment xml:lang="sl">Dokument README</comment>
- <comment xml:lang="sq">Dokument README</comment>
- <comment xml:lang="sr">документ ПРОЧИТАЈМЕ</comment>
- <comment xml:lang="sv">README-dokument</comment>
- <comment xml:lang="tr">README belgesi</comment>
- <comment xml:lang="uk">документ README</comment>
+ <comment xml:lang="zh_TW">README 說明文件</comment>
+ <comment xml:lang="zh_CN">README 文档</comment>
<comment xml:lang="vi">Tài liệu Đọc Đi (README)</comment>
- <comment xml:lang="zh-CN">README 文档</comment>
- <comment xml:lang="zh-TW">README 說明文件</comment>
+ <comment xml:lang="uk">документ README</comment>
+ <comment xml:lang="tr">README belgesi</comment>
+ <comment xml:lang="sv">README-dokument</comment>
+ <comment xml:lang="sr">документ ПРОЧИТАЈМЕ</comment>
+ <comment xml:lang="sq">dokument README</comment>
+ <comment xml:lang="sl">Dokument README</comment>
+ <comment xml:lang="si">README ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument README</comment>
+ <comment xml:lang="ru">Документ README</comment>
+ <comment xml:lang="ro">Document README</comment>
+ <comment xml:lang="pt_BR">Documento README</comment>
+ <comment xml:lang="pt">documento LEIA-ME</comment>
+ <comment xml:lang="pl">Dokument README</comment>
+ <comment xml:lang="oc">document LISEZ-MOI</comment>
+ <comment xml:lang="nn">README-dokument</comment>
+ <comment xml:lang="nl">LEESMIJ-document</comment>
+ <comment xml:lang="nb">README-dokument</comment>
+ <comment xml:lang="ms">Dokumen README</comment>
+ <comment xml:lang="lv">README dokuments</comment>
+ <comment xml:lang="lt">README dokumentas</comment>
+ <comment xml:lang="ko">README 문서</comment>
+ <comment xml:lang="kk">README құжаты</comment>
+ <comment xml:lang="ja">README ドキュメント</comment>
+ <comment xml:lang="it">Documento README</comment>
+ <comment xml:lang="is">README skjal</comment>
+ <comment xml:lang="id">Dokumen README</comment>
+ <comment xml:lang="ia">Documento LEGE-ME</comment>
+ <comment xml:lang="hu">README-dokumentum</comment>
+ <comment xml:lang="hr">README dokument</comment>
+ <comment xml:lang="he">מסמך README</comment>
+ <comment xml:lang="gl">documento README</comment>
+ <comment xml:lang="ga">cáipéis README</comment>
+ <comment xml:lang="fur">document README</comment>
+ <comment xml:lang="fr">document LISEZ-MOI</comment>
+ <comment xml:lang="fo">README skjal</comment>
+ <comment xml:lang="fi">LUEMINUT-asiakirja</comment>
+ <comment xml:lang="eu">README dokumentua</comment>
+ <comment xml:lang="es">documento README</comment>
+ <comment xml:lang="eo">README-dokumento</comment>
+ <comment xml:lang="en_GB">README document</comment>
+ <comment xml:lang="el">Έγγραφο README</comment>
+ <comment xml:lang="de">README-Dokument</comment>
+ <comment xml:lang="da">README-dokument</comment>
+ <comment xml:lang="cy">Dogfen README</comment>
+ <comment xml:lang="cs">dokument README</comment>
+ <comment xml:lang="ca">document README</comment>
+ <comment xml:lang="bg">Документ — „Да се прочете“</comment>
+ <comment xml:lang="be@latin">Dakument README</comment>
+ <comment xml:lang="be">дакумент README</comment>
+ <comment xml:lang="az">README sənədi</comment>
+ <comment xml:lang="ast">Documentu LLEIME</comment>
+ <comment xml:lang="ar">مستند README</comment>
+ <comment xml:lang="af">README-dokument</comment>
<sub-class-of type="text/plain"/>
<glob weight="10" pattern="README*"/>
</mime-type>
<mime-type type="text/x-nfo">
<comment>NFO document</comment>
- <comment xml:lang="af">NFO-dokument</comment>
- <comment xml:lang="ar">مستند NFO</comment>
- <comment xml:lang="ast">Documentu NFO</comment>
- <comment xml:lang="be-Latn">Dakument NFO</comment>
- <comment xml:lang="bg">Документ — NFO</comment>
- <comment xml:lang="ca">document NFO</comment>
- <comment xml:lang="cs">dokument NFO</comment>
- <comment xml:lang="da">NFO-dokument</comment>
- <comment xml:lang="de">NFO-Dokument</comment>
- <comment xml:lang="el">Έγγραφο NFO</comment>
- <comment xml:lang="en-GB">NFO document</comment>
- <comment xml:lang="eo">NFO-dokumento</comment>
- <comment xml:lang="es">documento NFO</comment>
- <comment xml:lang="eu">NFO dokumentua</comment>
- <comment xml:lang="fi">NFO-asiakirja</comment>
- <comment xml:lang="fo">NFO skjal</comment>
- <comment xml:lang="fr">document NFO</comment>
- <comment xml:lang="fur">document NFO</comment>
- <comment xml:lang="ga">cáipéis NFO</comment>
- <comment xml:lang="gl">documento NFO</comment>
- <comment xml:lang="he">מסמך NFO</comment>
- <comment xml:lang="hr">NFO dokument</comment>
- <comment xml:lang="hu">NFO-dokumentum</comment>
- <comment xml:lang="ia">Documento NFO</comment>
- <comment xml:lang="id">Dokumen NFO</comment>
- <comment xml:lang="it">Documento NFO</comment>
- <comment xml:lang="ja">NFO ドキュメント</comment>
- <comment xml:lang="kk">NFO құжаты</comment>
- <comment xml:lang="ko">NFO 문서</comment>
- <comment xml:lang="lt">NFO dokumentas</comment>
- <comment xml:lang="lv">NFO dokuments</comment>
- <comment xml:lang="nb">NFO-dokument</comment>
- <comment xml:lang="nl">NFO-document</comment>
- <comment xml:lang="nn">NFO-dokument</comment>
- <comment xml:lang="oc">document NFO</comment>
- <comment xml:lang="pl">Dokument NFO</comment>
- <comment xml:lang="pt">documento NFO</comment>
- <comment xml:lang="pt-BR">Documento NFO</comment>
- <comment xml:lang="ro">Document NFO</comment>
- <comment xml:lang="ru">Документ NFO</comment>
- <comment xml:lang="sk">Dokument NFO</comment>
- <comment xml:lang="sl">Dokument NFO</comment>
- <comment xml:lang="sq">Dokument NFO</comment>
- <comment xml:lang="sr">документ НФО</comment>
- <comment xml:lang="sv">NFO-dokument</comment>
- <comment xml:lang="tr">NFO belgesi</comment>
- <comment xml:lang="uk">документ NFO</comment>
+ <comment xml:lang="zh_TW">NFO 文件</comment>
+ <comment xml:lang="zh_CN">NFO 文档</comment>
<comment xml:lang="vi">Tài liệu NFO</comment>
- <comment xml:lang="zh-CN">NFO 文档</comment>
- <comment xml:lang="zh-TW">NFO 文件</comment>
+ <comment xml:lang="uk">документ NFO</comment>
+ <comment xml:lang="tr">NFO belgesi</comment>
+ <comment xml:lang="sv">NFO-dokument</comment>
+ <comment xml:lang="sr">документ НФО</comment>
+ <comment xml:lang="sq">dokument NFO</comment>
+ <comment xml:lang="sl">Dokument NFO</comment>
+ <comment xml:lang="si">NFO ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument NFO</comment>
+ <comment xml:lang="ru">Документ NFO</comment>
+ <comment xml:lang="ro">Document NFO</comment>
+ <comment xml:lang="pt_BR">Documento NFO</comment>
+ <comment xml:lang="pt">documento NFO</comment>
+ <comment xml:lang="pl">Dokument NFO</comment>
+ <comment xml:lang="oc">document NFO</comment>
+ <comment xml:lang="nn">NFO-dokument</comment>
+ <comment xml:lang="nl">NFO-document</comment>
+ <comment xml:lang="nb">NFO-dokument</comment>
+ <comment xml:lang="lv">NFO dokuments</comment>
+ <comment xml:lang="lt">NFO dokumentas</comment>
+ <comment xml:lang="ko">NFO 문서</comment>
+ <comment xml:lang="kk">NFO құжаты</comment>
+ <comment xml:lang="ja">NFO ドキュメント</comment>
+ <comment xml:lang="it">Documento NFO</comment>
+ <comment xml:lang="is">NFO skjal</comment>
+ <comment xml:lang="id">Dokumen NFO</comment>
+ <comment xml:lang="ia">Documento NFO</comment>
+ <comment xml:lang="hu">NFO-dokumentum</comment>
+ <comment xml:lang="hr">NFO dokument</comment>
+ <comment xml:lang="he">מסמך NFO</comment>
+ <comment xml:lang="gl">documento NFO</comment>
+ <comment xml:lang="ga">cáipéis NFO</comment>
+ <comment xml:lang="fur">document NFO</comment>
+ <comment xml:lang="fr">document NFO</comment>
+ <comment xml:lang="fo">NFO skjal</comment>
+ <comment xml:lang="fi">NFO-asiakirja</comment>
+ <comment xml:lang="eu">NFO dokumentua</comment>
+ <comment xml:lang="es">documento NFO</comment>
+ <comment xml:lang="eo">NFO-dokumento</comment>
+ <comment xml:lang="en_GB">NFO document</comment>
+ <comment xml:lang="el">Έγγραφο NFO</comment>
+ <comment xml:lang="de">NFO-Dokument</comment>
+ <comment xml:lang="da">NFO-dokument</comment>
+ <comment xml:lang="cs">dokument NFO</comment>
+ <comment xml:lang="ca">document NFO</comment>
+ <comment xml:lang="bg">Документ — NFO</comment>
+ <comment xml:lang="be@latin">Dakument NFO</comment>
+ <comment xml:lang="be">дакумент NFO</comment>
+ <comment xml:lang="ast">Documentu NFO</comment>
+ <comment xml:lang="ar">مستند NFO</comment>
+ <comment xml:lang="af">NFO-dokument</comment>
<sub-class-of type="text/x-readme"/>
<glob pattern="*.nfo"/>
</mime-type>
+ <mime-type type="text/x-todo-txt">
+ <comment>Todo.txt file</comment>
+ <comment xml:lang="uk">файл Todo.txt</comment>
+ <comment xml:lang="sv">Todo.txt-fil</comment>
+ <comment xml:lang="ru">Файл Todo.txt</comment>
+ <comment xml:lang="pl">Plik Todo.txt</comment>
+ <comment xml:lang="ja">TODO文書</comment>
+ <comment xml:lang="it">File todo.txt</comment>
+ <comment xml:lang="es">archivo Todo.txt</comment>
+ <comment xml:lang="de">Todo.txt-Datei</comment>
+ <sub-class-of type="text/plain"/>
+ <magic priority="10">
+ <match type="string" value="(A) " offset="0"/>
+ <match type="string" value="x " offset="0"/>
+ </magic>
+ <glob weight="10" pattern="todo.txt"/>
+ </mime-type>
<mime-type type="text/x-rpm-spec">
<comment>RPM spec file</comment>
- <comment xml:lang="af">RPM-spesifikasielêer</comment>
- <comment xml:lang="ar">ملف مواصفات RPM</comment>
- <comment xml:lang="be-Latn">Specyfikacyjny fajł RPM</comment>
- <comment xml:lang="bg">Файл — спецификация за RPM</comment>
- <comment xml:lang="ca">fitxer spec RPM</comment>
- <comment xml:lang="cs">soubor specifikace RPM</comment>
- <comment xml:lang="da">RPM spec-fil</comment>
- <comment xml:lang="de">RPM-Spezifikationsdatei</comment>
- <comment xml:lang="el">Αρχείο spec RPM</comment>
- <comment xml:lang="en-GB">RPM spec file</comment>
- <comment xml:lang="es">archivo de especificaciones RPM</comment>
- <comment xml:lang="eu">RPM espezifikazio fitxategia</comment>
- <comment xml:lang="fi">RPM spec -tiedosto</comment>
- <comment xml:lang="fo">RPM tøknilýsingarfíla</comment>
- <comment xml:lang="fr">fichier de spécification RPM</comment>
- <comment xml:lang="fur">file di specifiche RPM</comment>
- <comment xml:lang="ga">comhad spec RPM</comment>
- <comment xml:lang="gl">ficheiro de especificacións RPM</comment>
- <comment xml:lang="he">קובץ מפרט RPM</comment>
- <comment xml:lang="hr">RPM određena datoteka</comment>
- <comment xml:lang="hu">RPM spec fájl</comment>
- <comment xml:lang="ia">File de specification RPM</comment>
- <comment xml:lang="id">Berkas spesifikasi RPM</comment>
- <comment xml:lang="it">File specifica RPM</comment>
- <comment xml:lang="ja">RPM spec ファイル</comment>
- <comment xml:lang="kk">RPM анықтама файлы</comment>
- <comment xml:lang="ko">RPM spec 파일</comment>
- <comment xml:lang="lt">RPM spec failas</comment>
- <comment xml:lang="lv">RPM specifikācijas datne</comment>
- <comment xml:lang="nb">RPM-spesifikasjonsfil</comment>
- <comment xml:lang="nl">RPM-spec-bestand</comment>
- <comment xml:lang="nn">RPM spec-fil</comment>
- <comment xml:lang="oc">fichièr d'especificacion RPM</comment>
- <comment xml:lang="pl">Plik spec RPM</comment>
- <comment xml:lang="pt">ficheiro de especificações RPM</comment>
- <comment xml:lang="pt-BR">Arquivo de especificação RPM</comment>
- <comment xml:lang="ro">Fișier RPM spec</comment>
- <comment xml:lang="ru">Файл описания RPM</comment>
- <comment xml:lang="sk">Súbor RPM spec</comment>
- <comment xml:lang="sl">Določilna datoteka RPM</comment>
- <comment xml:lang="sq">File specifikimi RPM</comment>
- <comment xml:lang="sr">РПМ посебна датотека</comment>
- <comment xml:lang="sv">RPM spec-fil</comment>
- <comment xml:lang="tr">RPM spec dosyası</comment>
- <comment xml:lang="uk">spec-файл RPM</comment>
+ <comment xml:lang="zh_TW">RPM spec 規格檔</comment>
+ <comment xml:lang="zh_CN">RPM spec 文件</comment>
<comment xml:lang="vi">Tập tin đặc tả RPM</comment>
- <comment xml:lang="zh-CN">RPM spec 文件</comment>
- <comment xml:lang="zh-TW">RPM spec 規格檔</comment>
+ <comment xml:lang="uk">spec-файл RPM</comment>
+ <comment xml:lang="tr">RPM spec dosyası</comment>
+ <comment xml:lang="sv">RPM spec-fil</comment>
+ <comment xml:lang="sr">РПМ посебна датотека</comment>
+ <comment xml:lang="sq">kartelë specifikimesh RPM</comment>
+ <comment xml:lang="sl">Določilna datoteka RPM</comment>
+ <comment xml:lang="si">RPM පිරිවිතර ගොනුව</comment>
+ <comment xml:lang="sk">Súbor RPM spec</comment>
+ <comment xml:lang="ru">Файл описания RPM</comment>
+ <comment xml:lang="ro">Fișier RPM spec</comment>
+ <comment xml:lang="pt_BR">Arquivo de especificação RPM</comment>
+ <comment xml:lang="pt">ficheiro de especificações RPM</comment>
+ <comment xml:lang="pl">Plik spec RPM</comment>
+ <comment xml:lang="oc">fichièr d'especificacion RPM</comment>
+ <comment xml:lang="nn">RPM spec-fil</comment>
+ <comment xml:lang="nl">RPM-spec-bestand</comment>
+ <comment xml:lang="nb">RPM-spesifikasjonsfil</comment>
+ <comment xml:lang="lv">RPM specifikācijas datne</comment>
+ <comment xml:lang="lt">RPM spec failas</comment>
+ <comment xml:lang="ko">RPM spec 파일</comment>
+ <comment xml:lang="kk">RPM анықтама файлы</comment>
+ <comment xml:lang="ja">RPM spec ファイル</comment>
+ <comment xml:lang="it">File specifica RPM</comment>
+ <comment xml:lang="is">RPM spec-skrá</comment>
+ <comment xml:lang="id">Berkas spesifikasi RPM</comment>
+ <comment xml:lang="ia">File de specification RPM</comment>
+ <comment xml:lang="hu">RPM spec fájl</comment>
+ <comment xml:lang="hr">RPM određena datoteka</comment>
+ <comment xml:lang="he">קובץ מפרט RPM</comment>
+ <comment xml:lang="gl">ficheiro de especificacións RPM</comment>
+ <comment xml:lang="ga">comhad spec RPM</comment>
+ <comment xml:lang="fur">file di specifiche RPM</comment>
+ <comment xml:lang="fr">fichier de spécification RPM</comment>
+ <comment xml:lang="fo">RPM tøknilýsingarfíla</comment>
+ <comment xml:lang="fi">RPM spec -tiedosto</comment>
+ <comment xml:lang="eu">RPM espezifikazio fitxategia</comment>
+ <comment xml:lang="es">archivo de especificaciones RPM</comment>
+ <comment xml:lang="en_GB">RPM spec file</comment>
+ <comment xml:lang="el">Αρχείο spec RPM</comment>
+ <comment xml:lang="de">RPM-Spezifikationsdatei</comment>
+ <comment xml:lang="da">RPM spec-fil</comment>
+ <comment xml:lang="cs">soubor specifikace RPM</comment>
+ <comment xml:lang="ca">fitxer spec RPM</comment>
+ <comment xml:lang="bg">Файл — спецификация за RPM</comment>
+ <comment xml:lang="be@latin">Specyfikacyjny fajł RPM</comment>
+ <comment xml:lang="be">файл спецыфікацыі RPM</comment>
+ <comment xml:lang="ar">ملف مواصفات RPM</comment>
+ <comment xml:lang="af">RPM-spesifikasielêer</comment>
<acronym>RPM</acronym>
<expanded-acronym>Red Hat Package Manager</expanded-acronym>
<sub-class-of type="text/plain"/>
<glob pattern="*.spec"/>
- <magic priority="50">
+ <magic>
<match type="string" value="Summary: " offset="0"/>
<match type="string" value="%define " offset="0"/>
</magic>
</mime-type>
<mime-type type="text/x-sass">
<comment>Sass CSS pre-processor file</comment>
- <comment xml:lang="af">Sass CSS-voorverwerkerlêer</comment>
- <comment xml:lang="bg">Директиви за препроцесора — Sass CSS</comment>
- <comment xml:lang="ca">fitxer preprocessador CSS Sass</comment>
- <comment xml:lang="cs">soubor preprocesoru Sass CSS</comment>
- <comment xml:lang="da">Sass CSS pre-processor-fil</comment>
- <comment xml:lang="de">Sass-CSS-Präprozessordatei</comment>
- <comment xml:lang="en-GB">Sass CSS pre-processor file</comment>
- <comment xml:lang="es">archivo de preprocesador de CSS Sass</comment>
- <comment xml:lang="eu">Sass CSS fitxategi prozesatu gabea</comment>
- <comment xml:lang="fi">Sass CSS pre-processor -tiedosto</comment>
- <comment xml:lang="fr">fichier de prétraitement CSS Sass</comment>
- <comment xml:lang="fur">file di pre-elaborazion di CSS Sass</comment>
- <comment xml:lang="ga">comhad réamhphróiseálaí CSS Sass</comment>
- <comment xml:lang="he">קובץ קדם עיבוד Sass CSS</comment>
- <comment xml:lang="hr">Sass CSS datoteka predobrade</comment>
- <comment xml:lang="hu">Sass CSS előfeldolgozó fájl</comment>
- <comment xml:lang="id">Berkas pre-processor Sass CSS</comment>
- <comment xml:lang="it">File CSS Sass</comment>
- <comment xml:lang="kk">Sass CSS препроцессор файлы</comment>
- <comment xml:lang="ko">Sass CSS 전처리기 파일</comment>
- <comment xml:lang="pl">Plik preprocesora CSS Sass</comment>
- <comment xml:lang="pt-BR">Arquivo de pré-processamento Sass CSS</comment>
- <comment xml:lang="ru">Файл препроцессора Sass CSS</comment>
- <comment xml:lang="sk">Súbor Sass CSS pre-procesora</comment>
- <comment xml:lang="sr">датотека Сас ЦСС пре-процесора</comment>
- <comment xml:lang="sv">Sass CSS-preprocessorfil</comment>
- <comment xml:lang="tr">Sass CSS önişlemci dosyası</comment>
+ <comment xml:lang="zh_TW">Sass CSS 處理器前檔案</comment>
+ <comment xml:lang="zh_CN">Sass CSS 预处理器文件</comment>
<comment xml:lang="uk">файл препроцесора CSS Sass</comment>
- <comment xml:lang="zh-CN">Sass CSS 预处理器文件</comment>
- <comment xml:lang="zh-TW">Sass CSS 處理器前檔案</comment>
+ <comment xml:lang="tr">Sass CSS önişlemci dosyası</comment>
+ <comment xml:lang="sv">Sass CSS-preprocessorfil</comment>
+ <comment xml:lang="sr">датотека Сас ЦСС пре-процесора</comment>
+ <comment xml:lang="sq">kartelë pre-procesori CSS Sass</comment>
+ <comment xml:lang="si">Sass CSS පෙර-ප්‍රොසෙසර ගොනුව</comment>
+ <comment xml:lang="sk">Súbor Sass CSS pre-procesora</comment>
+ <comment xml:lang="ru">Файл препроцессора Sass CSS</comment>
+ <comment xml:lang="pt_BR">Arquivo de pré-processamento Sass CSS</comment>
+ <comment xml:lang="pl">Plik preprocesora CSS Sass</comment>
+ <comment xml:lang="nl">SaSS CSS-voorverwerkersbestand</comment>
+ <comment xml:lang="ko">Sass CSS 전처리기 파일</comment>
+ <comment xml:lang="kk">Sass CSS препроцессор файлы</comment>
+ <comment xml:lang="ja">Sass CSS プリプロセッサファイル</comment>
+ <comment xml:lang="it">File CSS Sass</comment>
+ <comment xml:lang="is">Sass CSS pre-processor skrá</comment>
+ <comment xml:lang="id">Berkas pre-processor Sass CSS</comment>
+ <comment xml:lang="hu">Sass CSS előfeldolgozó fájl</comment>
+ <comment xml:lang="hr">Sass CSS datoteka predobrade</comment>
+ <comment xml:lang="he">קובץ קדם עיבוד Sass CSS</comment>
+ <comment xml:lang="ga">comhad réamhphróiseálaí CSS Sass</comment>
+ <comment xml:lang="fur">file di pre-elaborazion di CSS Sass</comment>
+ <comment xml:lang="fr">fichier de prétraitement CSS Sass</comment>
+ <comment xml:lang="fi">Sass CSS esikäsittelijä -tiedosto</comment>
+ <comment xml:lang="eu">Sass CSS fitxategi prozesatu gabea</comment>
+ <comment xml:lang="es">archivo de preprocesador de CSS Sass</comment>
+ <comment xml:lang="en_GB">Sass CSS pre-processor file</comment>
+ <comment xml:lang="de">Sass-CSS-Präprozessordatei</comment>
+ <comment xml:lang="da">Sass CSS pre-processor-fil</comment>
+ <comment xml:lang="cs">soubor preprocesoru Sass CSS</comment>
+ <comment xml:lang="ca">fitxer preprocessador CSS Sass</comment>
+ <comment xml:lang="bg">Директиви за препроцесора — Sass CSS</comment>
+ <comment xml:lang="be">файл прэпрацэсара Sass CSS</comment>
+ <comment xml:lang="ar">ملف Sass CSS قبل المعالج</comment>
+ <comment xml:lang="af">Sass CSS-voorverwerkerlêer</comment>
<acronym>Sass</acronym>
<expanded-acronym>Syntactically Awesome Style Sheets</expanded-acronym>
<sub-class-of type="text/plain"/>
@@ -37411,132 +38376,149 @@ command to generate the output files.
</mime-type>
<mime-type type="text/x-scala">
<comment>Scala source code</comment>
- <comment xml:lang="af">Scala-bronkode</comment>
- <comment xml:lang="bg">Изходен код — Scala</comment>
- <comment xml:lang="ca">codi font en Scala</comment>
- <comment xml:lang="cs">zdrojový kód Scala</comment>
- <comment xml:lang="da">Scala-kildekode</comment>
- <comment xml:lang="de">Scala-Quelltext</comment>
- <comment xml:lang="el">Πηγαίος κώδικας Scala</comment>
- <comment xml:lang="en-GB">Scala source code</comment>
- <comment xml:lang="es">código fuente en Scala</comment>
- <comment xml:lang="eu">Scala iturburu-kodea</comment>
- <comment xml:lang="fi">Scala-lähdekoodi</comment>
- <comment xml:lang="fr">code source Scala</comment>
- <comment xml:lang="fur">codiç sorzint Scala</comment>
- <comment xml:lang="ga">cód foinseach Scala</comment>
- <comment xml:lang="gl">código fnote en Scala</comment>
- <comment xml:lang="he">קוד מקור של Scala</comment>
- <comment xml:lang="hr">Scala izvorni kôd</comment>
- <comment xml:lang="hu">Scala forráskód</comment>
- <comment xml:lang="ia">Codice-fonte Scala</comment>
- <comment xml:lang="id">Kode sumber Scala</comment>
- <comment xml:lang="it">Codice sorgente Scala</comment>
- <comment xml:lang="ja">Scala ソースコード</comment>
- <comment xml:lang="ka">Scala-ის საწყისი კოდი</comment>
- <comment xml:lang="kk">Scala бастапқы коды</comment>
- <comment xml:lang="ko">Scala 소스 코드</comment>
- <comment xml:lang="lv">Scala pirmkods</comment>
- <comment xml:lang="nl">Scala broncode</comment>
- <comment xml:lang="oc">còde font Scala</comment>
- <comment xml:lang="pl">Kod źródłowy Scala</comment>
- <comment xml:lang="pt">código origem Scala</comment>
- <comment xml:lang="pt-BR">Código-fonte Scala</comment>
- <comment xml:lang="ru">Исходный код Scala</comment>
- <comment xml:lang="sk">Zdrojový kód Scala</comment>
- <comment xml:lang="sl">Izvorna koda Scala</comment>
- <comment xml:lang="sr">Скала изворни ко̂д</comment>
- <comment xml:lang="sv">Scala-källkod</comment>
+ <comment xml:lang="zh_TW">Scala 源碼</comment>
+ <comment xml:lang="zh_CN">Scala 源代码</comment>
+ <comment xml:lang="uk">початковий код мовою Scala</comment>
<comment xml:lang="tr">Scala kaynak kodu</comment>
- <comment xml:lang="uk">вихідний код мовою Scala</comment>
- <comment xml:lang="zh-CN">Scala 源代码</comment>
- <comment xml:lang="zh-TW">Scala 源碼</comment>
+ <comment xml:lang="sv">Scala-källkod</comment>
+ <comment xml:lang="sr">Скала изворни ко̂д</comment>
+ <comment xml:lang="sq">kod burim Scala</comment>
+ <comment xml:lang="sl">Izvorna koda Scala</comment>
+ <comment xml:lang="si">Scala මූල කේතය</comment>
+ <comment xml:lang="sk">Zdrojový kód Scala</comment>
+ <comment xml:lang="ru">Исходный код Scala</comment>
+ <comment xml:lang="pt_BR">Código-fonte Scala</comment>
+ <comment xml:lang="pt">código origem Scala</comment>
+ <comment xml:lang="pl">Kod źródłowy Scala</comment>
+ <comment xml:lang="oc">còde font Scala</comment>
+ <comment xml:lang="nl">Scala broncode</comment>
+ <comment xml:lang="lv">Scala pirmkods</comment>
+ <comment xml:lang="ko">Scala 소스 코드</comment>
+ <comment xml:lang="kk">Scala бастапқы коды</comment>
+ <comment xml:lang="ka">Scala-ის საწყისი კოდი</comment>
+ <comment xml:lang="ja">Scala ソースコード</comment>
+ <comment xml:lang="it">Codice sorgente Scala</comment>
+ <comment xml:lang="is">Scala frumkóði</comment>
+ <comment xml:lang="id">Kode sumber Scala</comment>
+ <comment xml:lang="ia">Codice-fonte Scala</comment>
+ <comment xml:lang="hu">Scala forráskód</comment>
+ <comment xml:lang="hr">Scala izvorni kôd</comment>
+ <comment xml:lang="he">קוד מקור של Scala</comment>
+ <comment xml:lang="gl">código fnote en Scala</comment>
+ <comment xml:lang="ga">cód foinseach Scala</comment>
+ <comment xml:lang="fur">codiç sorzint Scala</comment>
+ <comment xml:lang="fr">code source Scala</comment>
+ <comment xml:lang="fi">Scala-lähdekoodi</comment>
+ <comment xml:lang="eu">Scala iturburu-kodea</comment>
+ <comment xml:lang="es">código fuente en Scala</comment>
+ <comment xml:lang="en_GB">Scala source code</comment>
+ <comment xml:lang="el">Πηγαίος κώδικας Scala</comment>
+ <comment xml:lang="de">Scala-Quelltext</comment>
+ <comment xml:lang="da">Scala-kildekode</comment>
+ <comment xml:lang="cs">zdrojový kód Scala</comment>
+ <comment xml:lang="ca">codi font en Scala</comment>
+ <comment xml:lang="bg">Изходен код — Scala</comment>
+ <comment xml:lang="be">зыходны код Scala</comment>
+ <comment xml:lang="ar">شفرة مصدر Scala</comment>
+ <comment xml:lang="af">Scala-bronkode</comment>
<sub-class-of type="text/plain"/>
<glob pattern="*.scala"/>
+ <glob pattern="*.sc"/>
</mime-type>
<mime-type type="text/x-scheme">
<comment>Scheme source code</comment>
- <comment xml:lang="af">Scheme-bronkode</comment>
- <comment xml:lang="ar">شفرة مصدر Scheme</comment>
- <comment xml:lang="az">Sxem mənbə kodu</comment>
- <comment xml:lang="be-Latn">Kryničny kod Scheme</comment>
- <comment xml:lang="bg">Изходен код — Scheme</comment>
- <comment xml:lang="ca">codi font en Scheme</comment>
- <comment xml:lang="cs">zdrojový kód Scheme</comment>
- <comment xml:lang="cy">Ffynhonnell Rhaglen Scheme</comment>
- <comment xml:lang="da">Scheme-kildekode</comment>
- <comment xml:lang="de">Scheme-Quelltext</comment>
- <comment xml:lang="el">Πηγαίος κώδικας Scheme</comment>
- <comment xml:lang="en-GB">Scheme source code</comment>
- <comment xml:lang="eo">Scheme-fontkodo</comment>
- <comment xml:lang="es">código fuente en Scheme</comment>
- <comment xml:lang="eu">Scheme iturburu-kodea</comment>
- <comment xml:lang="fi">Scheme-lähdekoodi</comment>
- <comment xml:lang="fo">Scheme keldukota</comment>
- <comment xml:lang="fr">code source Scheme</comment>
- <comment xml:lang="fur">codiç sorzint Scheme</comment>
- <comment xml:lang="ga">cód foinseach Scheme</comment>
- <comment xml:lang="gl">código fonte en Scheme</comment>
- <comment xml:lang="he">קוד מקור של Scheme</comment>
- <comment xml:lang="hr">Scheme izvorni kôd</comment>
- <comment xml:lang="hu">Scheme-forráskód</comment>
- <comment xml:lang="ia">Codice-fonte Scheme</comment>
- <comment xml:lang="id">Kode program Scheme</comment>
- <comment xml:lang="it">Codice sorgente Scheme</comment>
- <comment xml:lang="ja">Scheme ソースコード</comment>
- <comment xml:lang="kk">Scheme бастапқы коды</comment>
- <comment xml:lang="ko">Scheme 소스 코드</comment>
- <comment xml:lang="lt">Scheme pradinis kodas</comment>
- <comment xml:lang="lv">Scheme pirmkods</comment>
- <comment xml:lang="ms">Kod sumber Scheme</comment>
- <comment xml:lang="nb">Scheme-kildekode</comment>
- <comment xml:lang="nl">Scheme-broncode</comment>
- <comment xml:lang="nn">Scheme-kjeldekode</comment>
- <comment xml:lang="oc">còde font Scheme</comment>
- <comment xml:lang="pl">Kod źródłowy Scheme</comment>
- <comment xml:lang="pt">código origem Scheme</comment>
- <comment xml:lang="pt-BR">Código-fonte Scheme</comment>
- <comment xml:lang="ro">Cod sursă Scheme</comment>
- <comment xml:lang="ru">Исходный код Scheme</comment>
- <comment xml:lang="sk">Zdrojový kód Scheme</comment>
- <comment xml:lang="sl">Datoteka izvorne kode Scheme</comment>
- <comment xml:lang="sq">Kod burues Scheme</comment>
- <comment xml:lang="sr">Шемски изворни ко̂д</comment>
- <comment xml:lang="sv">Scheme-källkod</comment>
- <comment xml:lang="tr">Scheme kaynak kodu</comment>
- <comment xml:lang="uk">вихідний файл мовою Scheme</comment>
+ <comment xml:lang="zh_TW">Scheme 源碼</comment>
+ <comment xml:lang="zh_CN">Scheme 源代码</comment>
<comment xml:lang="vi">Mã nguồn Scheme</comment>
- <comment xml:lang="zh-CN">Scheme 源代码</comment>
- <comment xml:lang="zh-TW">Scheme 源碼</comment>
+ <comment xml:lang="uk">початковий код мовою Scheme</comment>
+ <comment xml:lang="tr">Scheme kaynak kodu</comment>
+ <comment xml:lang="sv">Scheme-källkod</comment>
+ <comment xml:lang="sr">Шемски изворни ко̂д</comment>
+ <comment xml:lang="sq">kod burim Scheme</comment>
+ <comment xml:lang="sl">Datoteka izvorne kode Scheme</comment>
+ <comment xml:lang="si">යෝජනා ක්‍රම මූල කේතය</comment>
+ <comment xml:lang="sk">Zdrojový kód Scheme</comment>
+ <comment xml:lang="ru">Исходный код Scheme</comment>
+ <comment xml:lang="ro">Cod sursă Scheme</comment>
+ <comment xml:lang="pt_BR">Código-fonte Scheme</comment>
+ <comment xml:lang="pt">código origem Scheme</comment>
+ <comment xml:lang="pl">Kod źródłowy Scheme</comment>
+ <comment xml:lang="oc">còde font Scheme</comment>
+ <comment xml:lang="nn">Scheme-kjeldekode</comment>
+ <comment xml:lang="nl">Scheme-broncode</comment>
+ <comment xml:lang="nb">Scheme-kildekode</comment>
+ <comment xml:lang="ms">Kod sumber Scheme</comment>
+ <comment xml:lang="lv">Scheme pirmkods</comment>
+ <comment xml:lang="lt">Scheme pradinis kodas</comment>
+ <comment xml:lang="ko">Scheme 소스 코드</comment>
+ <comment xml:lang="kk">Scheme бастапқы коды</comment>
+ <comment xml:lang="ja">Scheme ソースコード</comment>
+ <comment xml:lang="it">Codice sorgente Scheme</comment>
+ <comment xml:lang="is">Scheme frumkóði</comment>
+ <comment xml:lang="id">Kode program Scheme</comment>
+ <comment xml:lang="ia">Codice-fonte Scheme</comment>
+ <comment xml:lang="hu">Scheme-forráskód</comment>
+ <comment xml:lang="hr">Scheme izvorni kôd</comment>
+ <comment xml:lang="he">קוד מקור של Scheme</comment>
+ <comment xml:lang="gl">código fonte en Scheme</comment>
+ <comment xml:lang="ga">cód foinseach Scheme</comment>
+ <comment xml:lang="fur">codiç sorzint Scheme</comment>
+ <comment xml:lang="fr">code source Scheme</comment>
+ <comment xml:lang="fo">Scheme keldukota</comment>
+ <comment xml:lang="fi">Scheme-lähdekoodi</comment>
+ <comment xml:lang="eu">Scheme iturburu-kodea</comment>
+ <comment xml:lang="es">código fuente en Scheme</comment>
+ <comment xml:lang="eo">Scheme-fontkodo</comment>
+ <comment xml:lang="en_GB">Scheme source code</comment>
+ <comment xml:lang="el">Πηγαίος κώδικας Scheme</comment>
+ <comment xml:lang="de">Scheme-Quelltext</comment>
+ <comment xml:lang="da">Scheme-kildekode</comment>
+ <comment xml:lang="cy">Ffynhonnell Rhaglen Scheme</comment>
+ <comment xml:lang="cs">zdrojový kód Scheme</comment>
+ <comment xml:lang="ca">codi font en Scheme</comment>
+ <comment xml:lang="bg">Изходен код — Scheme</comment>
+ <comment xml:lang="be@latin">Kryničny kod Scheme</comment>
+ <comment xml:lang="be">зыходны код Scheme</comment>
+ <comment xml:lang="az">Sxem mənbə kodu</comment>
+ <comment xml:lang="ar">شفرة مصدر Scheme</comment>
+ <comment xml:lang="af">Scheme-bronkode</comment>
<sub-class-of type="text/plain"/>
<glob pattern="*.scm"/>
<glob pattern="*.ss"/>
</mime-type>
<mime-type type="text/x-scss">
<comment>SCSS pre-processor file</comment>
- <comment xml:lang="bg">Директиви за препроцесора — SCSS</comment>
- <comment xml:lang="ca">fitxer preprocessador SCSS</comment>
- <comment xml:lang="da">SCSS pre-processor-fil</comment>
- <comment xml:lang="de">SCSS-Präprozessordatei</comment>
- <comment xml:lang="en-GB">SCSS pre-processor file</comment>
- <comment xml:lang="es">archivo de preprocesador SCSS</comment>
- <comment xml:lang="eu">SCSS fitxategi prozesatu gabea</comment>
- <comment xml:lang="fi">SCSS pre-processor -tiedosto</comment>
- <comment xml:lang="fr">fichier de prétraitement SCSS</comment>
- <comment xml:lang="hr">SCSS datoteka predobrade</comment>
- <comment xml:lang="hu">SCSS előfeldolgozófájl</comment>
- <comment xml:lang="id">Berkas preprosesor SCSS</comment>
- <comment xml:lang="it">File SCSS</comment>
- <comment xml:lang="kk">SCSS препроцессор файлы</comment>
- <comment xml:lang="ko">SCSS 전처리 파일</comment>
- <comment xml:lang="pl">Plik preprocesora SCSS</comment>
- <comment xml:lang="pt-BR">Arquivo de pré-processamento SCSS</comment>
- <comment xml:lang="ru">Файл препроцессора SCSS</comment>
- <comment xml:lang="sv">SCSS förprocessorfil</comment>
- <comment xml:lang="tr">SCSS ön işleyici dosyası</comment>
+ <comment xml:lang="zh_TW">SCSS 前處理器檔</comment>
+ <comment xml:lang="zh_CN">SCSS 预处理文件</comment>
<comment xml:lang="uk">файл засобу попередньої обробки SCSS</comment>
- <comment xml:lang="zh-CN">SCSS 预处理文件</comment>
- <comment xml:lang="zh-TW">SCSS 前處理器檔</comment>
+ <comment xml:lang="tr">SCSS ön işleyici dosyası</comment>
+ <comment xml:lang="sv">SCSS förprocessorfil</comment>
+ <comment xml:lang="sq">kartelë pre-procesori SCSS</comment>
+ <comment xml:lang="si">SCSS පෙර සැකසුම් ගොනුව</comment>
+ <comment xml:lang="ru">Файл препроцессора SCSS</comment>
+ <comment xml:lang="pt_BR">Arquivo de pré-processamento SCSS</comment>
+ <comment xml:lang="pl">Plik preprocesora SCSS</comment>
+ <comment xml:lang="nl">SCSS-voorverwerkersbestand</comment>
+ <comment xml:lang="ko">SCSS 전처리 파일</comment>
+ <comment xml:lang="kk">SCSS препроцессор файлы</comment>
+ <comment xml:lang="ja">SCSS プリプロセッサファイル</comment>
+ <comment xml:lang="it">File SCSS</comment>
+ <comment xml:lang="is">SCSS pre-processor skrá</comment>
+ <comment xml:lang="id">Berkas preprosesor SCSS</comment>
+ <comment xml:lang="hu">SCSS előfeldolgozófájl</comment>
+ <comment xml:lang="hr">SCSS datoteka predobrade</comment>
+ <comment xml:lang="he">קובץ עיבוד קדם SCSS</comment>
+ <comment xml:lang="fr">fichier de prétraitement SCSS</comment>
+ <comment xml:lang="fi">SCSS esikäsittelijä -tiedosto</comment>
+ <comment xml:lang="eu">SCSS fitxategi prozesatu gabea</comment>
+ <comment xml:lang="es">archivo de preprocesador SCSS</comment>
+ <comment xml:lang="en_GB">SCSS pre-processor file</comment>
+ <comment xml:lang="de">SCSS-Präprozessordatei</comment>
+ <comment xml:lang="da">SCSS pre-processor-fil</comment>
+ <comment xml:lang="ca">fitxer preprocessador SCSS</comment>
+ <comment xml:lang="bg">Директиви за препроцесора — SCSS</comment>
+ <comment xml:lang="be">файл прэпрацэсара SCSS</comment>
+ <comment xml:lang="ar">ملف SCSS قبل المعالج</comment>
<acronym>SCSS</acronym>
<expanded-acronym>Sassy CSS</expanded-acronym>
<sub-class-of type="text/plain"/>
@@ -37545,172 +38527,181 @@ command to generate the output files.
</mime-type>
<mime-type type="text/x-setext">
<comment>Setext document</comment>
- <comment xml:lang="af">Setext-dokument</comment>
- <comment xml:lang="ar">مستند Setext</comment>
- <comment xml:lang="ast">Documentu Setext</comment>
- <comment xml:lang="az">Setext sənədi</comment>
- <comment xml:lang="be-Latn">Dakument Setext</comment>
- <comment xml:lang="bg">Документ — Setext</comment>
- <comment xml:lang="ca">document Setext</comment>
- <comment xml:lang="cs">dokument Setext</comment>
- <comment xml:lang="cy">Dogfen Setext</comment>
- <comment xml:lang="da">Setextdokument</comment>
- <comment xml:lang="de">Setext-Dokument</comment>
- <comment xml:lang="el">Έγγραφο Setext</comment>
- <comment xml:lang="en-GB">Setext document</comment>
- <comment xml:lang="eo">Setext-dokumento</comment>
- <comment xml:lang="es">documento Setext</comment>
- <comment xml:lang="eu">Setext dokumentua</comment>
- <comment xml:lang="fi">Setext-asiakirja</comment>
- <comment xml:lang="fo">Setext skjal</comment>
- <comment xml:lang="fr">document Setext</comment>
- <comment xml:lang="fur">document Setext</comment>
- <comment xml:lang="ga">cáipéis Setext</comment>
- <comment xml:lang="gl">documento Settext</comment>
- <comment xml:lang="he">מסמך של Setext</comment>
- <comment xml:lang="hr">Setext dokument</comment>
- <comment xml:lang="hu">Setext-dokumentum</comment>
- <comment xml:lang="ia">Documento Setext</comment>
- <comment xml:lang="id">Dokumen Setext</comment>
- <comment xml:lang="it">Documento Setext</comment>
- <comment xml:lang="ja">Setext ドキュメント</comment>
- <comment xml:lang="kk">Setext құжаты</comment>
- <comment xml:lang="ko">Setext 문서</comment>
- <comment xml:lang="lt">Setext dokumentas</comment>
- <comment xml:lang="lv">Setext dokuments</comment>
- <comment xml:lang="ms">Dokumen Setext</comment>
- <comment xml:lang="nb">Setext-dokument</comment>
- <comment xml:lang="nl">Setext-document</comment>
- <comment xml:lang="nn">Setext-dokument</comment>
- <comment xml:lang="oc">document Setext</comment>
- <comment xml:lang="pl">Dokument Setext</comment>
- <comment xml:lang="pt">documento Setext</comment>
- <comment xml:lang="pt-BR">Documento Setext</comment>
- <comment xml:lang="ro">Document Setext</comment>
- <comment xml:lang="ru">Документ Setext</comment>
- <comment xml:lang="sk">Dokument Setext</comment>
- <comment xml:lang="sl">Dokument Setext</comment>
- <comment xml:lang="sq">Dokument Setext</comment>
- <comment xml:lang="sr">Сетекст документ</comment>
- <comment xml:lang="sv">Setext-dokument</comment>
- <comment xml:lang="tr">Setext belgesi</comment>
- <comment xml:lang="uk">документ Setext</comment>
+ <comment xml:lang="zh_TW">Setext 文件</comment>
+ <comment xml:lang="zh_CN">Setext 文档</comment>
<comment xml:lang="vi">Tài liệu Setext</comment>
- <comment xml:lang="zh-CN">Setext 文档</comment>
- <comment xml:lang="zh-TW">Setext 文件</comment>
+ <comment xml:lang="uk">документ Setext</comment>
+ <comment xml:lang="tr">Setext belgesi</comment>
+ <comment xml:lang="sv">Setext-dokument</comment>
+ <comment xml:lang="sr">Сетекст документ</comment>
+ <comment xml:lang="sq">dokument Setext</comment>
+ <comment xml:lang="sl">Dokument Setext</comment>
+ <comment xml:lang="si">පෙළ ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument Setext</comment>
+ <comment xml:lang="ru">Документ Setext</comment>
+ <comment xml:lang="ro">Document Setext</comment>
+ <comment xml:lang="pt_BR">Documento Setext</comment>
+ <comment xml:lang="pt">documento Setext</comment>
+ <comment xml:lang="pl">Dokument Setext</comment>
+ <comment xml:lang="oc">document Setext</comment>
+ <comment xml:lang="nn">Setext-dokument</comment>
+ <comment xml:lang="nl">Setext-document</comment>
+ <comment xml:lang="nb">Setext-dokument</comment>
+ <comment xml:lang="ms">Dokumen Setext</comment>
+ <comment xml:lang="lv">Setext dokuments</comment>
+ <comment xml:lang="lt">Setext dokumentas</comment>
+ <comment xml:lang="ko">Setext 문서</comment>
+ <comment xml:lang="kk">Setext құжаты</comment>
+ <comment xml:lang="ja">Setext ドキュメント</comment>
+ <comment xml:lang="it">Documento Setext</comment>
+ <comment xml:lang="is">Setext skjal</comment>
+ <comment xml:lang="id">Dokumen Setext</comment>
+ <comment xml:lang="ia">Documento Setext</comment>
+ <comment xml:lang="hu">Setext-dokumentum</comment>
+ <comment xml:lang="hr">Setext dokument</comment>
+ <comment xml:lang="he">מסמך של Setext</comment>
+ <comment xml:lang="gl">documento Settext</comment>
+ <comment xml:lang="ga">cáipéis Setext</comment>
+ <comment xml:lang="fur">document Setext</comment>
+ <comment xml:lang="fr">document Setext</comment>
+ <comment xml:lang="fo">Setext skjal</comment>
+ <comment xml:lang="fi">Setext-asiakirja</comment>
+ <comment xml:lang="eu">Setext dokumentua</comment>
+ <comment xml:lang="es">documento Setext</comment>
+ <comment xml:lang="eo">Setext-dokumento</comment>
+ <comment xml:lang="en_GB">Setext document</comment>
+ <comment xml:lang="el">Έγγραφο Setext</comment>
+ <comment xml:lang="de">Setext-Dokument</comment>
+ <comment xml:lang="da">Setextdokument</comment>
+ <comment xml:lang="cy">Dogfen Setext</comment>
+ <comment xml:lang="cs">dokument Setext</comment>
+ <comment xml:lang="ca">document Setext</comment>
+ <comment xml:lang="bg">Документ — Setext</comment>
+ <comment xml:lang="be@latin">Dakument Setext</comment>
+ <comment xml:lang="be">дакумент Setext</comment>
+ <comment xml:lang="az">Setext sənədi</comment>
+ <comment xml:lang="ast">Documentu Setext</comment>
+ <comment xml:lang="ar">مستند Setext</comment>
+ <comment xml:lang="af">Setext-dokument</comment>
<sub-class-of type="text/plain"/>
<glob pattern="*.etx"/>
</mime-type>
<mime-type type="application/sql">
<comment>SQL code</comment>
- <comment xml:lang="af">SQL-kode</comment>
- <comment xml:lang="ar">شفرة SQL</comment>
- <comment xml:lang="az">SQL kodu</comment>
- <comment xml:lang="be-Latn">Kod SQL</comment>
- <comment xml:lang="bg">Код — SQL</comment>
- <comment xml:lang="ca">codi en SQL</comment>
- <comment xml:lang="cs">kód SQL</comment>
- <comment xml:lang="cy">Côd SQL</comment>
- <comment xml:lang="da">SQL-kode</comment>
- <comment xml:lang="de">SQL-Befehle</comment>
- <comment xml:lang="el">Κώδικας SQL</comment>
- <comment xml:lang="en-GB">SQL code</comment>
- <comment xml:lang="eo">SQL-kodo</comment>
- <comment xml:lang="es">código SQL</comment>
- <comment xml:lang="eu">SQL kodea</comment>
- <comment xml:lang="fi">SQL-koodi</comment>
- <comment xml:lang="fo">SQL kota</comment>
- <comment xml:lang="fr">code SQL</comment>
- <comment xml:lang="fur">codiç SQL</comment>
- <comment xml:lang="ga">cód SQL</comment>
- <comment xml:lang="gl">código SQL</comment>
- <comment xml:lang="he">קוד SQL</comment>
- <comment xml:lang="hr">SQL kôd</comment>
- <comment xml:lang="hu">SQL-kód</comment>
- <comment xml:lang="ia">Codice SQL</comment>
- <comment xml:lang="id">Kode SQL</comment>
- <comment xml:lang="it">Codice SQL</comment>
- <comment xml:lang="ja">SQL コード</comment>
- <comment xml:lang="kk">SQL коды</comment>
- <comment xml:lang="ko">SQL 코드</comment>
- <comment xml:lang="lt">SQL kodas</comment>
- <comment xml:lang="lv">SQL kods</comment>
- <comment xml:lang="ms">Kod SQL</comment>
- <comment xml:lang="nb">SQL-kildekode</comment>
- <comment xml:lang="nl">SQL-code</comment>
- <comment xml:lang="nn">SQL-kode</comment>
- <comment xml:lang="oc">còde SQL</comment>
- <comment xml:lang="pl">Kod SQL</comment>
- <comment xml:lang="pt">código SQL</comment>
- <comment xml:lang="pt-BR">Código SQL</comment>
- <comment xml:lang="ro">Cod SQL</comment>
- <comment xml:lang="ru">Код SQL</comment>
- <comment xml:lang="sk">Kód SQL</comment>
- <comment xml:lang="sl">Datoteka kode SQL</comment>
- <comment xml:lang="sq">Kod SQL</comment>
- <comment xml:lang="sr">СКуЛ ко̂д</comment>
- <comment xml:lang="sv">SQL-kod</comment>
- <comment xml:lang="tr">SQL kodu</comment>
- <comment xml:lang="uk">код SQL</comment>
+ <comment xml:lang="zh_TW">SQL 程式碼</comment>
+ <comment xml:lang="zh_CN">SQL 代码</comment>
<comment xml:lang="vi">Mã SQL</comment>
- <comment xml:lang="zh-CN">SQL 代码</comment>
- <comment xml:lang="zh-TW">SQL 程式碼</comment>
+ <comment xml:lang="uk">код SQL</comment>
+ <comment xml:lang="tr">SQL kodu</comment>
+ <comment xml:lang="sv">SQL-kod</comment>
+ <comment xml:lang="sr">СКуЛ ко̂д</comment>
+ <comment xml:lang="sq">kod SQL</comment>
+ <comment xml:lang="sl">Datoteka kode SQL</comment>
+ <comment xml:lang="si">SQL කේතය</comment>
+ <comment xml:lang="sk">Kód SQL</comment>
+ <comment xml:lang="ru">Код SQL</comment>
+ <comment xml:lang="ro">Cod SQL</comment>
+ <comment xml:lang="pt_BR">Código SQL</comment>
+ <comment xml:lang="pt">código SQL</comment>
+ <comment xml:lang="pl">Kod SQL</comment>
+ <comment xml:lang="oc">còde SQL</comment>
+ <comment xml:lang="nn">SQL-kode</comment>
+ <comment xml:lang="nl">SQL-code</comment>
+ <comment xml:lang="nb">SQL-kildekode</comment>
+ <comment xml:lang="ms">Kod SQL</comment>
+ <comment xml:lang="lv">SQL kods</comment>
+ <comment xml:lang="lt">SQL kodas</comment>
+ <comment xml:lang="ko">SQL 코드</comment>
+ <comment xml:lang="kk">SQL коды</comment>
+ <comment xml:lang="ja">SQL コード</comment>
+ <comment xml:lang="it">Codice SQL</comment>
+ <comment xml:lang="is">SQL kóði</comment>
+ <comment xml:lang="id">Kode SQL</comment>
+ <comment xml:lang="ia">Codice SQL</comment>
+ <comment xml:lang="hu">SQL-kód</comment>
+ <comment xml:lang="hr">SQL kôd</comment>
+ <comment xml:lang="he">קוד SQL</comment>
+ <comment xml:lang="gl">código SQL</comment>
+ <comment xml:lang="ga">cód SQL</comment>
+ <comment xml:lang="fur">codiç SQL</comment>
+ <comment xml:lang="fr">code SQL</comment>
+ <comment xml:lang="fo">SQL kota</comment>
+ <comment xml:lang="fi">SQL-koodi</comment>
+ <comment xml:lang="eu">SQL kodea</comment>
+ <comment xml:lang="es">código SQL</comment>
+ <comment xml:lang="eo">SQL-kodo</comment>
+ <comment xml:lang="en_GB">SQL code</comment>
+ <comment xml:lang="el">Κώδικας SQL</comment>
+ <comment xml:lang="de">SQL-Befehle</comment>
+ <comment xml:lang="da">SQL-kode</comment>
+ <comment xml:lang="cy">Côd SQL</comment>
+ <comment xml:lang="cs">kód SQL</comment>
+ <comment xml:lang="ca">codi en SQL</comment>
+ <comment xml:lang="bg">Код — SQL</comment>
+ <comment xml:lang="be@latin">Kod SQL</comment>
+ <comment xml:lang="be">код SQL</comment>
+ <comment xml:lang="az">SQL kodu</comment>
+ <comment xml:lang="ar">شفرة SQL</comment>
+ <comment xml:lang="af">SQL-kode</comment>
<sub-class-of type="text/plain"/>
<glob pattern="*.sql"/>
<alias type="text/x-sql"/>
</mime-type>
<mime-type type="text/tcl">
<comment>Tcl script</comment>
- <comment xml:lang="af">Tcl-skrip</comment>
- <comment xml:lang="ar">سكربت Tcl</comment>
- <comment xml:lang="be-Latn">Skrypt Tcl</comment>
- <comment xml:lang="bg">Скрипт — Tcl</comment>
- <comment xml:lang="ca">script Tcl</comment>
- <comment xml:lang="cs">skript Tcl</comment>
- <comment xml:lang="da">Tcl-program</comment>
- <comment xml:lang="de">Tcl-Skript</comment>
- <comment xml:lang="el">Δέσμη ενεργειών Tcl</comment>
- <comment xml:lang="en-GB">Tcl script</comment>
- <comment xml:lang="eo">Tcl-skripto</comment>
- <comment xml:lang="es">secuencia de órdenes en Tcl</comment>
- <comment xml:lang="eu">Tcl script-a</comment>
- <comment xml:lang="fi">Tcl-komentotiedosto</comment>
- <comment xml:lang="fo">Tcl boðrøð</comment>
- <comment xml:lang="fr">script Tcl</comment>
- <comment xml:lang="fur">script Tcl</comment>
- <comment xml:lang="ga">script Tcl</comment>
- <comment xml:lang="gl">Script en Tcl</comment>
- <comment xml:lang="he">תסריט Tcl</comment>
- <comment xml:lang="hr">Tcl skripta</comment>
- <comment xml:lang="hu">Tcl-parancsfájl</comment>
- <comment xml:lang="ia">Script Tcl</comment>
- <comment xml:lang="id">Skrip Tcl</comment>
- <comment xml:lang="it">Script Tcl</comment>
- <comment xml:lang="ja">Tcl スクリプト</comment>
- <comment xml:lang="kk">Tcl сценарийі</comment>
- <comment xml:lang="ko">Tcl 스크립트</comment>
- <comment xml:lang="lt">Tcl scenarijus</comment>
- <comment xml:lang="lv">Tcl skripts</comment>
- <comment xml:lang="ms">Skrip Tcl</comment>
- <comment xml:lang="nb">Tcl-skript</comment>
- <comment xml:lang="nl">Tcl-script</comment>
- <comment xml:lang="nn">Tcl-skript</comment>
- <comment xml:lang="oc">escript Tcl</comment>
- <comment xml:lang="pl">Skrypt Tcl</comment>
- <comment xml:lang="pt">script Tcl</comment>
- <comment xml:lang="pt-BR">Script Tcl</comment>
- <comment xml:lang="ro">Script Tcl</comment>
- <comment xml:lang="ru">Сценарий Tcl</comment>
- <comment xml:lang="sk">Skript Tcl</comment>
- <comment xml:lang="sl">Skriptna datoteka Tcl</comment>
- <comment xml:lang="sq">Script Tcl</comment>
- <comment xml:lang="sr">Тцл скрипта</comment>
- <comment xml:lang="sv">Tcl-skript</comment>
- <comment xml:lang="tr">Tcl betiği</comment>
- <comment xml:lang="uk">скрипт Tcl</comment>
+ <comment xml:lang="zh_TW">Tcl 描述語言檔</comment>
+ <comment xml:lang="zh_CN">Tcl 脚本</comment>
<comment xml:lang="vi">Văn lệnh Tcl</comment>
- <comment xml:lang="zh-CN">Tcl 脚本</comment>
- <comment xml:lang="zh-TW">Tcl 描述語言檔</comment>
+ <comment xml:lang="uk">скрипт Tcl</comment>
+ <comment xml:lang="tr">Tcl betiği</comment>
+ <comment xml:lang="sv">Tcl-skript</comment>
+ <comment xml:lang="sr">Тцл скрипта</comment>
+ <comment xml:lang="sq">programth Tcl</comment>
+ <comment xml:lang="sl">Skriptna datoteka Tcl</comment>
+ <comment xml:lang="si">Tcl පිටපත</comment>
+ <comment xml:lang="sk">Skript Tcl</comment>
+ <comment xml:lang="ru">Сценарий Tcl</comment>
+ <comment xml:lang="ro">Script Tcl</comment>
+ <comment xml:lang="pt_BR">Script Tcl</comment>
+ <comment xml:lang="pt">script Tcl</comment>
+ <comment xml:lang="pl">Skrypt Tcl</comment>
+ <comment xml:lang="oc">escript Tcl</comment>
+ <comment xml:lang="nn">Tcl-skript</comment>
+ <comment xml:lang="nl">Tcl-script</comment>
+ <comment xml:lang="nb">Tcl-skript</comment>
+ <comment xml:lang="ms">Skrip Tcl</comment>
+ <comment xml:lang="lv">Tcl skripts</comment>
+ <comment xml:lang="lt">Tcl scenarijus</comment>
+ <comment xml:lang="ko">Tcl 스크립트</comment>
+ <comment xml:lang="kk">Tcl сценарийі</comment>
+ <comment xml:lang="ja">Tcl スクリプト</comment>
+ <comment xml:lang="it">Script Tcl</comment>
+ <comment xml:lang="is">Tcl skrifta</comment>
+ <comment xml:lang="id">Skrip Tcl</comment>
+ <comment xml:lang="ia">Script Tcl</comment>
+ <comment xml:lang="hu">Tcl-parancsfájl</comment>
+ <comment xml:lang="hr">Tcl skripta</comment>
+ <comment xml:lang="he">תסריט Tcl</comment>
+ <comment xml:lang="gl">Script en Tcl</comment>
+ <comment xml:lang="ga">script Tcl</comment>
+ <comment xml:lang="fur">script Tcl</comment>
+ <comment xml:lang="fr">script Tcl</comment>
+ <comment xml:lang="fo">Tcl boðrøð</comment>
+ <comment xml:lang="fi">Tcl-komentotiedosto</comment>
+ <comment xml:lang="eu">Tcl script-a</comment>
+ <comment xml:lang="es">secuencia de órdenes en Tcl</comment>
+ <comment xml:lang="eo">Tcl-skripto</comment>
+ <comment xml:lang="en_GB">Tcl script</comment>
+ <comment xml:lang="el">Δέσμη ενεργειών Tcl</comment>
+ <comment xml:lang="de">Tcl-Skript</comment>
+ <comment xml:lang="da">Tcl-program</comment>
+ <comment xml:lang="cs">skript Tcl</comment>
+ <comment xml:lang="ca">script Tcl</comment>
+ <comment xml:lang="bg">Скрипт — Tcl</comment>
+ <comment xml:lang="be@latin">Skrypt Tcl</comment>
+ <comment xml:lang="be">скрыпт Tcl</comment>
+ <comment xml:lang="ar">سكربت Tcl</comment>
+ <comment xml:lang="af">Tcl-skrip</comment>
<alias type="text/x-tcl"/>
<sub-class-of type="text/plain"/>
<glob pattern="*.tcl"/>
@@ -37718,58 +38709,61 @@ command to generate the output files.
</mime-type>
<mime-type type="text/x-tex">
<comment>TeX document</comment>
- <comment xml:lang="af">TeX-dokument</comment>
- <comment xml:lang="ar">مستند TeX</comment>
- <comment xml:lang="ast">Documentu TeX</comment>
- <comment xml:lang="be-Latn">Dakument TeX</comment>
- <comment xml:lang="bg">Документ — TeX</comment>
- <comment xml:lang="ca">document TeX</comment>
- <comment xml:lang="cs">dokument TeX</comment>
- <comment xml:lang="cy">Dogfen TeX </comment>
- <comment xml:lang="da">TeX-dokument</comment>
- <comment xml:lang="de">TeX-Dokument</comment>
- <comment xml:lang="el">Έγγραφο TeX</comment>
- <comment xml:lang="en-GB">TeX document</comment>
- <comment xml:lang="eo">TeX-dokumento</comment>
- <comment xml:lang="es">documento de TeX</comment>
- <comment xml:lang="eu">TeX dokumentua</comment>
- <comment xml:lang="fi">TeX-asiakirja</comment>
- <comment xml:lang="fo">TeX skjal</comment>
- <comment xml:lang="fr">document TeX</comment>
- <comment xml:lang="fur">document TeX</comment>
- <comment xml:lang="ga">cáipéis TeX</comment>
- <comment xml:lang="gl">documenton TeX</comment>
- <comment xml:lang="he">מסמך TeX</comment>
- <comment xml:lang="hr">TeX dokument</comment>
- <comment xml:lang="hu">TeX-dokumentum</comment>
- <comment xml:lang="ia">Documento TeX</comment>
- <comment xml:lang="id">Dokumen TeX</comment>
- <comment xml:lang="it">Documento TeX</comment>
- <comment xml:lang="ja">TeX ドキュメント</comment>
- <comment xml:lang="kk">TeX құжаты</comment>
- <comment xml:lang="ko">TeX 문서</comment>
- <comment xml:lang="lt">TeX dokumentas</comment>
- <comment xml:lang="lv">TeX dokuments</comment>
- <comment xml:lang="ms">Dokumen TeX</comment>
- <comment xml:lang="nb">TeX-dokument</comment>
- <comment xml:lang="nl">TeX-document</comment>
- <comment xml:lang="nn">TeX-dokument</comment>
- <comment xml:lang="oc">document TeX</comment>
- <comment xml:lang="pl">Dokument TeX</comment>
- <comment xml:lang="pt">documento TeX</comment>
- <comment xml:lang="pt-BR">Documento TeX</comment>
- <comment xml:lang="ro">Document TeX</comment>
- <comment xml:lang="ru">Документ TeX</comment>
- <comment xml:lang="sk">Dokument TeX</comment>
- <comment xml:lang="sl">Dokument TeX</comment>
- <comment xml:lang="sq">Dokument TeX</comment>
- <comment xml:lang="sr">ТеКс документ</comment>
- <comment xml:lang="sv">TeX-dokument</comment>
- <comment xml:lang="tr">TeX belgesi</comment>
- <comment xml:lang="uk">документ TeX</comment>
+ <comment xml:lang="zh_TW">TeX 文件</comment>
+ <comment xml:lang="zh_CN">TeX 文档</comment>
<comment xml:lang="vi">Tài liệu TeX</comment>
- <comment xml:lang="zh-CN">TeX 文档</comment>
- <comment xml:lang="zh-TW">TeX 文件</comment>
+ <comment xml:lang="uk">документ TeX</comment>
+ <comment xml:lang="tr">TeX belgesi</comment>
+ <comment xml:lang="sv">TeX-dokument</comment>
+ <comment xml:lang="sr">ТеКс документ</comment>
+ <comment xml:lang="sq">dokument TeX</comment>
+ <comment xml:lang="sl">Dokument TeX</comment>
+ <comment xml:lang="si">TeX ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument TeX</comment>
+ <comment xml:lang="ru">Документ TeX</comment>
+ <comment xml:lang="ro">Document TeX</comment>
+ <comment xml:lang="pt_BR">Documento TeX</comment>
+ <comment xml:lang="pt">documento TeX</comment>
+ <comment xml:lang="pl">Dokument TeX</comment>
+ <comment xml:lang="oc">document TeX</comment>
+ <comment xml:lang="nn">TeX-dokument</comment>
+ <comment xml:lang="nl">TeX-document</comment>
+ <comment xml:lang="nb">TeX-dokument</comment>
+ <comment xml:lang="ms">Dokumen TeX</comment>
+ <comment xml:lang="lv">TeX dokuments</comment>
+ <comment xml:lang="lt">TeX dokumentas</comment>
+ <comment xml:lang="ko">TeX 문서</comment>
+ <comment xml:lang="kk">TeX құжаты</comment>
+ <comment xml:lang="ja">TeX ドキュメント</comment>
+ <comment xml:lang="it">Documento TeX</comment>
+ <comment xml:lang="is">TeX skjal</comment>
+ <comment xml:lang="id">Dokumen TeX</comment>
+ <comment xml:lang="ia">Documento TeX</comment>
+ <comment xml:lang="hu">TeX-dokumentum</comment>
+ <comment xml:lang="hr">TeX dokument</comment>
+ <comment xml:lang="he">מסמך TeX</comment>
+ <comment xml:lang="gl">documenton TeX</comment>
+ <comment xml:lang="ga">cáipéis TeX</comment>
+ <comment xml:lang="fur">document TeX</comment>
+ <comment xml:lang="fr">document TeX</comment>
+ <comment xml:lang="fo">TeX skjal</comment>
+ <comment xml:lang="fi">TeX-asiakirja</comment>
+ <comment xml:lang="eu">TeX dokumentua</comment>
+ <comment xml:lang="es">documento de TeX</comment>
+ <comment xml:lang="eo">TeX-dokumento</comment>
+ <comment xml:lang="en_GB">TeX document</comment>
+ <comment xml:lang="el">Έγγραφο TeX</comment>
+ <comment xml:lang="de">TeX-Dokument</comment>
+ <comment xml:lang="da">TeX-dokument</comment>
+ <comment xml:lang="cy">Dogfen TeX </comment>
+ <comment xml:lang="cs">dokument TeX</comment>
+ <comment xml:lang="ca">document TeX</comment>
+ <comment xml:lang="bg">Документ — TeX</comment>
+ <comment xml:lang="be@latin">Dakument TeX</comment>
+ <comment xml:lang="be">дакумент TeX</comment>
+ <comment xml:lang="ast">Documentu TeX</comment>
+ <comment xml:lang="ar">مستند TeX</comment>
+ <comment xml:lang="af">TeX-dokument</comment>
<sub-class-of type="text/plain"/>
<alias type="application/x-tex"/>
<glob pattern="*.tex"/>
@@ -37782,501 +38776,571 @@ command to generate the output files.
<magic priority="10">
<match type="string" value="%" offset="0"/>
</magic>
- <magic priority="50">
+ <magic>
<match type="string" value="documentclass" offset="1"/>
</magic>
</mime-type>
<mime-type type="text/x-texinfo">
<comment>TeXInfo document</comment>
- <comment xml:lang="af">TeXInfo-dokument</comment>
- <comment xml:lang="ar">مستند TeXInfo</comment>
- <comment xml:lang="ast">Documentu TeXInfo</comment>
- <comment xml:lang="az">TeXInfo sənədi</comment>
- <comment xml:lang="be-Latn">Dakument TeXInfo</comment>
- <comment xml:lang="bg">Документ — TeXInfo</comment>
- <comment xml:lang="ca">document TeXInfo</comment>
- <comment xml:lang="cs">dokument TeXInfo</comment>
- <comment xml:lang="cy">Dogfen TeXInfo</comment>
- <comment xml:lang="da">TeXInfo-dokument</comment>
- <comment xml:lang="de">TeXInfo-Dokument</comment>
- <comment xml:lang="el">Έγγραφο TeXInfo</comment>
- <comment xml:lang="en-GB">TeXInfo document</comment>
- <comment xml:lang="eo">TeXInfo-dokumento</comment>
- <comment xml:lang="es">documento de TeXInfo</comment>
- <comment xml:lang="eu">TeXInfo dokumentua</comment>
- <comment xml:lang="fi">TeXInfo-asiakirja</comment>
- <comment xml:lang="fo">TeXInfo skjal</comment>
- <comment xml:lang="fr">document TeXInfo</comment>
- <comment xml:lang="fur">document TeXInfo</comment>
- <comment xml:lang="ga">cáipéis TeXInfo</comment>
- <comment xml:lang="gl">documento TeXInfo</comment>
- <comment xml:lang="he">מסמך של TeXInfo</comment>
- <comment xml:lang="hr">TeXInfo dokument</comment>
- <comment xml:lang="hu">TeXInfo-dokumentum</comment>
- <comment xml:lang="ia">Documento TeXInfo</comment>
- <comment xml:lang="id">Dokumen TeXInfo</comment>
- <comment xml:lang="it">Documento TeXInfo</comment>
- <comment xml:lang="ja">TeXInfo ドキュメント</comment>
- <comment xml:lang="kk">TeXInfo құжаты</comment>
- <comment xml:lang="ko">TeXInfo 문서</comment>
- <comment xml:lang="lt">TeXInfo dokumentas</comment>
- <comment xml:lang="lv">TeXInfo dokuments</comment>
- <comment xml:lang="ms">Dokumen TeXInfo</comment>
- <comment xml:lang="nb">TeXInfo-dokument</comment>
- <comment xml:lang="nl">TeXInfo-document</comment>
- <comment xml:lang="nn">TeXInfo-dokument</comment>
- <comment xml:lang="oc">document TeXInfo</comment>
- <comment xml:lang="pl">Dokument TeXInfo</comment>
- <comment xml:lang="pt">documento TeXInfo</comment>
- <comment xml:lang="pt-BR">Documento TeXInfo</comment>
- <comment xml:lang="ro">Document TexInfo</comment>
- <comment xml:lang="ru">Документ TeXInfo</comment>
- <comment xml:lang="sk">Dokument TeXInfo</comment>
- <comment xml:lang="sl">Dokument TeXInfo</comment>
- <comment xml:lang="sq">Dokument TeXInfo</comment>
- <comment xml:lang="sr">ТеКсинфо документ</comment>
- <comment xml:lang="sv">TeXInfo-dokument</comment>
- <comment xml:lang="tr">TeXInfo belgesi</comment>
- <comment xml:lang="uk">документ TeXInfo</comment>
+ <comment xml:lang="zh_TW">TeXInfo 文件</comment>
+ <comment xml:lang="zh_CN">TeXInfo 文档</comment>
<comment xml:lang="vi">Tài liệu TeXInfo</comment>
- <comment xml:lang="zh-CN">TeXInfo 文档</comment>
- <comment xml:lang="zh-TW">TeXInfo 文件</comment>
+ <comment xml:lang="uk">документ TeXInfo</comment>
+ <comment xml:lang="tr">TeXInfo belgesi</comment>
+ <comment xml:lang="sv">TeXInfo-dokument</comment>
+ <comment xml:lang="sr">ТеКсинфо документ</comment>
+ <comment xml:lang="sq">dokument TeXInfo</comment>
+ <comment xml:lang="sl">Dokument TeXInfo</comment>
+ <comment xml:lang="si">TeXInfo ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument TeXInfo</comment>
+ <comment xml:lang="ru">Документ TeXInfo</comment>
+ <comment xml:lang="ro">Document TexInfo</comment>
+ <comment xml:lang="pt_BR">Documento TeXInfo</comment>
+ <comment xml:lang="pt">documento TeXInfo</comment>
+ <comment xml:lang="pl">Dokument TeXInfo</comment>
+ <comment xml:lang="oc">document TeXInfo</comment>
+ <comment xml:lang="nn">TeXInfo-dokument</comment>
+ <comment xml:lang="nl">TeXInfo-document</comment>
+ <comment xml:lang="nb">TeXInfo-dokument</comment>
+ <comment xml:lang="ms">Dokumen TeXInfo</comment>
+ <comment xml:lang="lv">TeXInfo dokuments</comment>
+ <comment xml:lang="lt">TeXInfo dokumentas</comment>
+ <comment xml:lang="ko">TeXInfo 문서</comment>
+ <comment xml:lang="kk">TeXInfo құжаты</comment>
+ <comment xml:lang="ja">TeXInfo ドキュメント</comment>
+ <comment xml:lang="it">Documento TeXInfo</comment>
+ <comment xml:lang="is">TeXInfo skjal</comment>
+ <comment xml:lang="id">Dokumen TeXInfo</comment>
+ <comment xml:lang="ia">Documento TeXInfo</comment>
+ <comment xml:lang="hu">TeXInfo-dokumentum</comment>
+ <comment xml:lang="hr">TeXInfo dokument</comment>
+ <comment xml:lang="he">מסמך של TeXInfo</comment>
+ <comment xml:lang="gl">documento TeXInfo</comment>
+ <comment xml:lang="ga">cáipéis TeXInfo</comment>
+ <comment xml:lang="fur">document TeXInfo</comment>
+ <comment xml:lang="fr">document TeXInfo</comment>
+ <comment xml:lang="fo">TeXInfo skjal</comment>
+ <comment xml:lang="fi">TeXInfo-asiakirja</comment>
+ <comment xml:lang="eu">TeXInfo dokumentua</comment>
+ <comment xml:lang="es">documento de TeXInfo</comment>
+ <comment xml:lang="eo">TeXInfo-dokumento</comment>
+ <comment xml:lang="en_GB">TeXInfo document</comment>
+ <comment xml:lang="el">Έγγραφο TeXInfo</comment>
+ <comment xml:lang="de">TeXInfo-Dokument</comment>
+ <comment xml:lang="da">TeXInfo-dokument</comment>
+ <comment xml:lang="cy">Dogfen TeXInfo</comment>
+ <comment xml:lang="cs">dokument TeXInfo</comment>
+ <comment xml:lang="ca">document TeXInfo</comment>
+ <comment xml:lang="bg">Документ — TeXInfo</comment>
+ <comment xml:lang="be@latin">Dakument TeXInfo</comment>
+ <comment xml:lang="be">дакумент TeXInfo</comment>
+ <comment xml:lang="az">TeXInfo sənədi</comment>
+ <comment xml:lang="ast">Documentu TeXInfo</comment>
+ <comment xml:lang="ar">مستند TeXInfo</comment>
+ <comment xml:lang="af">TeXInfo-dokument</comment>
<sub-class-of type="text/plain"/>
<glob pattern="*.texi"/>
<glob pattern="*.texinfo"/>
</mime-type>
+ <mime-type type="text/x-typst">
+ <comment>Typst document</comment>
+ <comment xml:lang="uk">документ Typst</comment>
+ <comment xml:lang="sv">Typst-dokument</comment>
+ <comment xml:lang="ru">Документ Typst</comment>
+ <comment xml:lang="pl">Dokument Typst</comment>
+ <comment xml:lang="it">Documento Typst</comment>
+ <comment xml:lang="gl">Documento de Typst</comment>
+ <comment xml:lang="eu">Typst dokumentua</comment>
+ <comment xml:lang="es">documento de Typst</comment>
+ <comment xml:lang="de">Typst-Dokument</comment>
+ <comment xml:lang="be">дакумент Typst</comment>
+ <sub-class-of type="text/plain"/>
+ <glob pattern="*.typ"/>
+ </mime-type>
<mime-type type="text/x-troff-me">
<comment>Troff ME input document</comment>
- <comment xml:lang="af">Troff ME-toevoerdokument</comment>
- <comment xml:lang="ar">مستند Troff ME input</comment>
- <comment xml:lang="ast">Documentu d'entrada de Troff ME</comment>
- <comment xml:lang="be-Latn">Uvodny dakument Troff ME</comment>
- <comment xml:lang="bg">Изходен документ — Troff ME</comment>
- <comment xml:lang="ca">document d'entrada Troff ME</comment>
- <comment xml:lang="cs">vstupní dokument Troff ME</comment>
- <comment xml:lang="da">Troff ME inddata-dokument</comment>
- <comment xml:lang="de">Troff-ME-Eingabedokument</comment>
- <comment xml:lang="el">Έγγραφο εντολών troff ME</comment>
- <comment xml:lang="en-GB">Troff ME input document</comment>
- <comment xml:lang="eo">eniga dokumento de Troff ME</comment>
- <comment xml:lang="es">documento de entrada Troff ME</comment>
- <comment xml:lang="eu">Troff ME sarrerako dokumentua</comment>
- <comment xml:lang="fi">Troff ME -syöteasiakirja</comment>
- <comment xml:lang="fo">Troff ME inntaksskjal</comment>
- <comment xml:lang="fr">document d'entrée Troff ME</comment>
- <comment xml:lang="fur">document di jentrade Troff ME</comment>
- <comment xml:lang="ga">cáipéis ionchurtha Troff ME</comment>
- <comment xml:lang="gl">documento de entrada Troff ME</comment>
- <comment xml:lang="he">מסמך קלט של Troff ME</comment>
- <comment xml:lang="hr">Troff ME ulazni dokument</comment>
- <comment xml:lang="hu">Troff ME bemeneti dokumentum</comment>
- <comment xml:lang="ia">Documento de entrata Troff ME</comment>
- <comment xml:lang="id">Dokumen masukan Troff ME</comment>
- <comment xml:lang="it">Documento di input Troff ME</comment>
- <comment xml:lang="ja">Troff ME 入力ドキュメント</comment>
- <comment xml:lang="kk">Troff ME кіріс құжаты</comment>
- <comment xml:lang="ko">Troff ME 입력 문서</comment>
- <comment xml:lang="lt">Troff ME įvesties dokumentas</comment>
- <comment xml:lang="lv">Troff ME ievades dokuments</comment>
- <comment xml:lang="ms">Dokumen input Troff ME</comment>
- <comment xml:lang="nb">Troff ME-inndatadokument</comment>
- <comment xml:lang="nl">Troff ME-invoerdocument</comment>
- <comment xml:lang="nn">Troff ME inndata-dokument</comment>
- <comment xml:lang="oc">document d'entrada Troff ME</comment>
- <comment xml:lang="pl">Dokument wejściowy Troff ME</comment>
- <comment xml:lang="pt">documento origem Troff ME</comment>
- <comment xml:lang="pt-BR">Documento de entrada Troff ME</comment>
- <comment xml:lang="ro">Document intrare Troff ME</comment>
- <comment xml:lang="ru">Входной документ Troff ME</comment>
- <comment xml:lang="sk">Vstupný dokument Troff ME</comment>
- <comment xml:lang="sl">Vnosni dokument Troff ME</comment>
- <comment xml:lang="sq">Dokument i input Troff ME</comment>
- <comment xml:lang="sr">Трофф МЕ улазни документ</comment>
- <comment xml:lang="sv">Troff ME-indatadokument</comment>
- <comment xml:lang="tr">Troff ME girdi belgesi</comment>
- <comment xml:lang="uk">вхідний документ Troff ME</comment>
+ <comment xml:lang="zh_TW">Troff ME 輸入文件</comment>
+ <comment xml:lang="zh_CN">Troff ME 输入文档</comment>
<comment xml:lang="vi">Tài liệu nhập ME Troff</comment>
- <comment xml:lang="zh-CN">Troff ME 输入文档</comment>
- <comment xml:lang="zh-TW">Troff ME 輸入文件</comment>
+ <comment xml:lang="uk">вхідний документ Troff ME</comment>
+ <comment xml:lang="tr">Troff ME girdi belgesi</comment>
+ <comment xml:lang="sv">Troff ME-indatadokument</comment>
+ <comment xml:lang="sr">Трофф МЕ улазни документ</comment>
+ <comment xml:lang="sq">dokument ME input-i për Troff</comment>
+ <comment xml:lang="sl">Vnosni dokument Troff ME</comment>
+ <comment xml:lang="si">ට්‍රොෆ් ME ආදාන ලේඛනය</comment>
+ <comment xml:lang="sk">Vstupný dokument Troff ME</comment>
+ <comment xml:lang="ru">Входной документ Troff ME</comment>
+ <comment xml:lang="ro">Document intrare Troff ME</comment>
+ <comment xml:lang="pt_BR">Documento de entrada Troff ME</comment>
+ <comment xml:lang="pt">documento origem Troff ME</comment>
+ <comment xml:lang="pl">Dokument wejściowy Troff ME</comment>
+ <comment xml:lang="oc">document d'entrada Troff ME</comment>
+ <comment xml:lang="nn">Troff ME inndata-dokument</comment>
+ <comment xml:lang="nl">Troff ME-invoerdocument</comment>
+ <comment xml:lang="nb">Troff ME-inndatadokument</comment>
+ <comment xml:lang="ms">Dokumen input Troff ME</comment>
+ <comment xml:lang="lv">Troff ME ievades dokuments</comment>
+ <comment xml:lang="lt">Troff ME įvesties dokumentas</comment>
+ <comment xml:lang="ko">Troff ME 입력 문서</comment>
+ <comment xml:lang="kk">Troff ME кіріс құжаты</comment>
+ <comment xml:lang="ja">Troff ME 入力ドキュメント</comment>
+ <comment xml:lang="it">Documento di input Troff ME</comment>
+ <comment xml:lang="is">Troff ME inngangsskjal</comment>
+ <comment xml:lang="id">Dokumen masukan Troff ME</comment>
+ <comment xml:lang="ia">Documento de entrata Troff ME</comment>
+ <comment xml:lang="hu">Troff ME bemeneti dokumentum</comment>
+ <comment xml:lang="hr">Troff ME ulazni dokument</comment>
+ <comment xml:lang="he">מסמך קלט של Troff ME</comment>
+ <comment xml:lang="gl">documento de entrada Troff ME</comment>
+ <comment xml:lang="ga">cáipéis ionchurtha Troff ME</comment>
+ <comment xml:lang="fur">document di jentrade Troff ME</comment>
+ <comment xml:lang="fr">document d'entrée Troff ME</comment>
+ <comment xml:lang="fo">Troff ME inntaksskjal</comment>
+ <comment xml:lang="fi">Troff ME -syöteasiakirja</comment>
+ <comment xml:lang="eu">Troff ME sarrerako dokumentua</comment>
+ <comment xml:lang="es">documento de entrada Troff ME</comment>
+ <comment xml:lang="eo">eniga dokumento de Troff ME</comment>
+ <comment xml:lang="en_GB">Troff ME input document</comment>
+ <comment xml:lang="el">Έγγραφο εντολών troff ME</comment>
+ <comment xml:lang="de">Troff-ME-Eingabedokument</comment>
+ <comment xml:lang="da">Troff ME inddata-dokument</comment>
+ <comment xml:lang="cs">vstupní dokument Troff ME</comment>
+ <comment xml:lang="ca">document d'entrada Troff ME</comment>
+ <comment xml:lang="bg">Изходен документ — Troff ME</comment>
+ <comment xml:lang="be@latin">Uvodny dakument Troff ME</comment>
+ <comment xml:lang="be">уваходны дакумент Troff ME</comment>
+ <comment xml:lang="ast">Documentu d'entrada de Troff ME</comment>
+ <comment xml:lang="ar">مستند Troff ME input</comment>
+ <comment xml:lang="af">Troff ME-toevoerdokument</comment>
<sub-class-of type="text/plain"/>
<glob pattern="*.me"/>
</mime-type>
<mime-type type="text/x-troff-mm">
<comment>Troff MM input document</comment>
- <comment xml:lang="af">Troff MM-toevoerdokument</comment>
- <comment xml:lang="ar">مستند Troff MM input</comment>
- <comment xml:lang="ast">Documentu d'entrada de Troff MM</comment>
- <comment xml:lang="be-Latn">Uvodny dakument Troff MM</comment>
- <comment xml:lang="bg">Изходен документ — Troff MM</comment>
- <comment xml:lang="ca">document d'entrada Troff MM</comment>
- <comment xml:lang="cs">vstupní dokument Troff MM</comment>
- <comment xml:lang="da">Troff MM inddata-dokument</comment>
- <comment xml:lang="de">Troff-MM-Eingabedokument</comment>
- <comment xml:lang="el">Έγγραφο εντολών troff MM</comment>
- <comment xml:lang="en-GB">Troff MM input document</comment>
- <comment xml:lang="eo">eniga dokumento de Troff MM</comment>
- <comment xml:lang="es">documento de entrada Troff MM</comment>
- <comment xml:lang="eu">Troff MM sarrerako dokumentua</comment>
- <comment xml:lang="fi">Troff MM -syöteasiakirja</comment>
- <comment xml:lang="fo">Troff MM inntaksskjal</comment>
- <comment xml:lang="fr">document d'entrée Troff MM</comment>
- <comment xml:lang="fur">document di jentrade Troff MM</comment>
- <comment xml:lang="ga">cáipéis ionchurtha Troff MM</comment>
- <comment xml:lang="gl">documento de entrada Troff MM</comment>
- <comment xml:lang="he">מסמך קלט של Troff MM</comment>
- <comment xml:lang="hr">Troff MM ulazni dokument</comment>
- <comment xml:lang="hu">Troff MM bemeneti dokumentum</comment>
- <comment xml:lang="ia">Documento de entrata Troff MM</comment>
- <comment xml:lang="id">Dokumen masukan Troff MM</comment>
- <comment xml:lang="it">Documento di input Troff MM</comment>
- <comment xml:lang="ja">Troff MM 入力ドキュメント</comment>
- <comment xml:lang="kk">Troff MM кіріс құжаты</comment>
- <comment xml:lang="ko">Troff MM 입력 문서</comment>
- <comment xml:lang="lt">Troff MM įvesties dokumentas</comment>
- <comment xml:lang="lv">Troff MM ievades dokuments</comment>
- <comment xml:lang="ms">Dokumen input Troff MM</comment>
- <comment xml:lang="nb">Troff MM-inndatadokument</comment>
- <comment xml:lang="nl">Troff MM-invoerdocument</comment>
- <comment xml:lang="nn">Troff MM inndata-dokument</comment>
- <comment xml:lang="oc">document d'entrada Troff MM</comment>
- <comment xml:lang="pl">Dokument wejściowy Troff MM</comment>
- <comment xml:lang="pt">documento origem Troff MM</comment>
- <comment xml:lang="pt-BR">Documento de entrada Troff MM</comment>
- <comment xml:lang="ro">Document intrare Troff MM</comment>
- <comment xml:lang="ru">Входной документ Troff MM</comment>
- <comment xml:lang="sk">Vstupný dokument Troff MM</comment>
- <comment xml:lang="sl">Vnosni dokument Troff MM</comment>
- <comment xml:lang="sq">Dokument i input Troff MM</comment>
- <comment xml:lang="sr">Трофф ММ улазни документ</comment>
- <comment xml:lang="sv">Troff MM-indatadokument</comment>
- <comment xml:lang="tr">Troff MM girdi belgesi</comment>
- <comment xml:lang="uk">вхідний документ Troff MM</comment>
+ <comment xml:lang="zh_TW">Troff MM 輸入文件</comment>
+ <comment xml:lang="zh_CN">Troff MM 输入文档</comment>
<comment xml:lang="vi">Tài liệu nhập MM Troff</comment>
- <comment xml:lang="zh-CN">Troff MM 输入文档</comment>
- <comment xml:lang="zh-TW">Troff MM 輸入文件</comment>
- <sub-class-of type="text/plain"/>
+ <comment xml:lang="uk">вхідний документ Troff MM</comment>
+ <comment xml:lang="tr">Troff MM girdi belgesi</comment>
+ <comment xml:lang="sv">Troff MM-indatadokument</comment>
+ <comment xml:lang="sr">Трофф ММ улазни документ</comment>
+ <comment xml:lang="sq">dokument MM input-i për Troff</comment>
+ <comment xml:lang="sl">Vnosni dokument Troff MM</comment>
+ <comment xml:lang="si">Troff MM ආදාන ලේඛනය</comment>
+ <comment xml:lang="sk">Vstupný dokument Troff MM</comment>
+ <comment xml:lang="ru">Входной документ Troff MM</comment>
+ <comment xml:lang="ro">Document intrare Troff MM</comment>
+ <comment xml:lang="pt_BR">Documento de entrada Troff MM</comment>
+ <comment xml:lang="pt">documento origem Troff MM</comment>
+ <comment xml:lang="pl">Dokument wejściowy Troff MM</comment>
+ <comment xml:lang="oc">document d'entrada Troff MM</comment>
+ <comment xml:lang="nn">Troff MM inndata-dokument</comment>
+ <comment xml:lang="nl">Troff MM-invoerdocument</comment>
+ <comment xml:lang="nb">Troff MM-inndatadokument</comment>
+ <comment xml:lang="ms">Dokumen input Troff MM</comment>
+ <comment xml:lang="lv">Troff MM ievades dokuments</comment>
+ <comment xml:lang="lt">Troff MM įvesties dokumentas</comment>
+ <comment xml:lang="ko">Troff MM 입력 문서</comment>
+ <comment xml:lang="kk">Troff MM кіріс құжаты</comment>
+ <comment xml:lang="ja">Troff MM 入力ドキュメント</comment>
+ <comment xml:lang="it">Documento di input Troff MM</comment>
+ <comment xml:lang="is">Troff MM inngangsskjal</comment>
+ <comment xml:lang="id">Dokumen masukan Troff MM</comment>
+ <comment xml:lang="ia">Documento de entrata Troff MM</comment>
+ <comment xml:lang="hu">Troff MM bemeneti dokumentum</comment>
+ <comment xml:lang="hr">Troff MM ulazni dokument</comment>
+ <comment xml:lang="he">מסמך קלט של Troff MM</comment>
+ <comment xml:lang="gl">documento de entrada Troff MM</comment>
+ <comment xml:lang="ga">cáipéis ionchurtha Troff MM</comment>
+ <comment xml:lang="fur">document di jentrade Troff MM</comment>
+ <comment xml:lang="fr">document d'entrée Troff MM</comment>
+ <comment xml:lang="fo">Troff MM inntaksskjal</comment>
+ <comment xml:lang="fi">Troff MM -syöteasiakirja</comment>
+ <comment xml:lang="eu">Troff MM sarrerako dokumentua</comment>
+ <comment xml:lang="es">documento de entrada Troff MM</comment>
+ <comment xml:lang="eo">eniga dokumento de Troff MM</comment>
+ <comment xml:lang="en_GB">Troff MM input document</comment>
+ <comment xml:lang="el">Έγγραφο εντολών troff MM</comment>
+ <comment xml:lang="de">Troff-MM-Eingabedokument</comment>
+ <comment xml:lang="da">Troff MM inddata-dokument</comment>
+ <comment xml:lang="cs">vstupní dokument Troff MM</comment>
+ <comment xml:lang="ca">document d'entrada Troff MM</comment>
+ <comment xml:lang="bg">Изходен документ — Troff MM</comment>
+ <comment xml:lang="be@latin">Uvodny dakument Troff MM</comment>
+ <comment xml:lang="be">уваходны дакумент Troff MM</comment>
+ <comment xml:lang="ast">Documentu d'entrada de Troff MM</comment>
+ <comment xml:lang="ar">مستند Troff MM input</comment>
+ <comment xml:lang="af">Troff MM-toevoerdokument</comment>
+ <sub-class-of type="text/troff"/>
<glob pattern="*.mm"/>
</mime-type>
<mime-type type="text/x-troff-ms">
<comment>Troff MS input document</comment>
- <comment xml:lang="af">Troff MS-toevoerdokument</comment>
- <comment xml:lang="ar">مستند Troff MS input</comment>
- <comment xml:lang="ast">Documentu d'entrada de Troff MS</comment>
- <comment xml:lang="be-Latn">Uvodny dakument Troff MS</comment>
- <comment xml:lang="bg">Изходен документ — Troff MS</comment>
- <comment xml:lang="ca">document d'entrada Troff MS</comment>
- <comment xml:lang="cs">vstupní dokument Troff MS</comment>
- <comment xml:lang="da">Troff MS inddata-dokument</comment>
- <comment xml:lang="de">Troff-MS-Eingabedokument</comment>
- <comment xml:lang="el">Έγγραφο εντολών troff MS</comment>
- <comment xml:lang="en-GB">Troff MS input document</comment>
- <comment xml:lang="eo">eniga dokumento de Troff MS</comment>
- <comment xml:lang="es">documento de entrada Troff MS</comment>
- <comment xml:lang="eu">Troff MS sarrerako dokumentua</comment>
- <comment xml:lang="fi">Troff MS -syöteasiakirja</comment>
- <comment xml:lang="fo">Troff MS inntaksskjal</comment>
- <comment xml:lang="fr">document d'entrée Troff MS</comment>
- <comment xml:lang="fur">document di jentrade Troff MS</comment>
- <comment xml:lang="ga">cáipéis ionchurtha Troff MS</comment>
- <comment xml:lang="gl">documento de entrada Troff MS</comment>
- <comment xml:lang="he">מסמך קלט של Troff MS</comment>
- <comment xml:lang="hr">Troff MS ulazni dokument</comment>
- <comment xml:lang="hu">Troff MS bemeneti dokumentum</comment>
- <comment xml:lang="ia">Documento de entrata Troff MS</comment>
- <comment xml:lang="id">Dokumen masukan Troff MS</comment>
- <comment xml:lang="it">Documento di input Troff MS</comment>
- <comment xml:lang="ja">Troff MS 入力ドキュメント</comment>
- <comment xml:lang="kk">Troff MS кіріс құжаты</comment>
- <comment xml:lang="ko">Troff MS 입력 문서</comment>
- <comment xml:lang="lt">Troff MS įvesties dokumentas</comment>
- <comment xml:lang="lv">Troff MS ievades dokuments</comment>
- <comment xml:lang="ms">Dokumen input Troff MS</comment>
- <comment xml:lang="nb">Troff MS-inndatadokument</comment>
- <comment xml:lang="nl">Troff MS-invoerdocument</comment>
- <comment xml:lang="nn">Troff MS inndata-dokument</comment>
- <comment xml:lang="oc">document d'entrada Troff MS</comment>
- <comment xml:lang="pl">Dokument wejściowy Troff MS</comment>
- <comment xml:lang="pt">documento origem Troff MS</comment>
- <comment xml:lang="pt-BR">Documento de entrada Troff MS</comment>
- <comment xml:lang="ro">Document intrare Troff MS</comment>
- <comment xml:lang="ru">Входной документ Troff MS</comment>
- <comment xml:lang="sk">Vstupný dokument Troff MS</comment>
- <comment xml:lang="sl">Vnosni dokument Troff MS</comment>
- <comment xml:lang="sq">Dokument i input Troff MS</comment>
- <comment xml:lang="sr">Трофф МС улазни документ</comment>
- <comment xml:lang="sv">Troff MS-indatadokument</comment>
- <comment xml:lang="tr">Troff MS girdi belgesi</comment>
- <comment xml:lang="uk">вхідний документ Troff MS</comment>
+ <comment xml:lang="zh_TW">Troff MS 輸入文件</comment>
+ <comment xml:lang="zh_CN">Troff MS 输入文档</comment>
<comment xml:lang="vi">Tài liệu nhập MS Troff</comment>
- <comment xml:lang="zh-CN">Troff MS 输入文档</comment>
- <comment xml:lang="zh-TW">Troff MS 輸入文件</comment>
+ <comment xml:lang="uk">вхідний документ Troff MS</comment>
+ <comment xml:lang="tr">Troff MS girdi belgesi</comment>
+ <comment xml:lang="sv">Troff MS-indatadokument</comment>
+ <comment xml:lang="sr">Трофф МС улазни документ</comment>
+ <comment xml:lang="sq">dokument MS input-i për Troff</comment>
+ <comment xml:lang="sl">Vnosni dokument Troff MS</comment>
+ <comment xml:lang="si">Troff MS ආදාන ලේඛනය</comment>
+ <comment xml:lang="sk">Vstupný dokument Troff MS</comment>
+ <comment xml:lang="ru">Входной документ Troff MS</comment>
+ <comment xml:lang="ro">Document intrare Troff MS</comment>
+ <comment xml:lang="pt_BR">Documento de entrada Troff MS</comment>
+ <comment xml:lang="pt">documento origem Troff MS</comment>
+ <comment xml:lang="pl">Dokument wejściowy Troff MS</comment>
+ <comment xml:lang="oc">document d'entrada Troff MS</comment>
+ <comment xml:lang="nn">Troff MS inndata-dokument</comment>
+ <comment xml:lang="nl">Troff MS-invoerdocument</comment>
+ <comment xml:lang="nb">Troff MS-inndatadokument</comment>
+ <comment xml:lang="ms">Dokumen input Troff MS</comment>
+ <comment xml:lang="lv">Troff MS ievades dokuments</comment>
+ <comment xml:lang="lt">Troff MS įvesties dokumentas</comment>
+ <comment xml:lang="ko">Troff MS 입력 문서</comment>
+ <comment xml:lang="kk">Troff MS кіріс құжаты</comment>
+ <comment xml:lang="ja">Troff MS 入力ドキュメント</comment>
+ <comment xml:lang="it">Documento di input Troff MS</comment>
+ <comment xml:lang="is">Troff MS inngangsskjal</comment>
+ <comment xml:lang="id">Dokumen masukan Troff MS</comment>
+ <comment xml:lang="ia">Documento de entrata Troff MS</comment>
+ <comment xml:lang="hu">Troff MS bemeneti dokumentum</comment>
+ <comment xml:lang="hr">Troff MS ulazni dokument</comment>
+ <comment xml:lang="he">מסמך קלט של Troff MS</comment>
+ <comment xml:lang="gl">documento de entrada Troff MS</comment>
+ <comment xml:lang="ga">cáipéis ionchurtha Troff MS</comment>
+ <comment xml:lang="fur">document di jentrade Troff MS</comment>
+ <comment xml:lang="fr">document d'entrée Troff MS</comment>
+ <comment xml:lang="fo">Troff MS inntaksskjal</comment>
+ <comment xml:lang="fi">Troff MS -syöteasiakirja</comment>
+ <comment xml:lang="eu">Troff MS sarrerako dokumentua</comment>
+ <comment xml:lang="es">documento de entrada Troff MS</comment>
+ <comment xml:lang="eo">eniga dokumento de Troff MS</comment>
+ <comment xml:lang="en_GB">Troff MS input document</comment>
+ <comment xml:lang="el">Έγγραφο εντολών troff MS</comment>
+ <comment xml:lang="de">Troff-MS-Eingabedokument</comment>
+ <comment xml:lang="da">Troff MS inddata-dokument</comment>
+ <comment xml:lang="cs">vstupní dokument Troff MS</comment>
+ <comment xml:lang="ca">document d'entrada Troff MS</comment>
+ <comment xml:lang="bg">Изходен документ — Troff MS</comment>
+ <comment xml:lang="be@latin">Uvodny dakument Troff MS</comment>
+ <comment xml:lang="be">уваходны дакумент Troff MS</comment>
+ <comment xml:lang="ast">Documentu d'entrada de Troff MS</comment>
+ <comment xml:lang="ar">مستند Troff MS input</comment>
+ <comment xml:lang="af">Troff MS-toevoerdokument</comment>
<sub-class-of type="text/plain"/>
<glob pattern="*.ms"/>
</mime-type>
<mime-type type="text/x-twig">
<comment>Twig template</comment>
- <comment xml:lang="af">Twig-sjabloon</comment>
- <comment xml:lang="bg">Шаблон — Twig</comment>
- <comment xml:lang="ca">plantilla Twig</comment>
- <comment xml:lang="cs">šablona Twig</comment>
- <comment xml:lang="da">Twig-skabelon</comment>
- <comment xml:lang="de">Twig-Vorlage</comment>
- <comment xml:lang="en-GB">Twig template</comment>
- <comment xml:lang="es">plantilla de Twig</comment>
- <comment xml:lang="eu">Twig txantiloia</comment>
- <comment xml:lang="fi">Twig-malli</comment>
- <comment xml:lang="fr">modèle Twig</comment>
- <comment xml:lang="fur">model Twig</comment>
- <comment xml:lang="ga">teimpléad Twig</comment>
- <comment xml:lang="he">תבנית Twig</comment>
- <comment xml:lang="hr">Twig predložak</comment>
- <comment xml:lang="hu">Twig-sablon</comment>
- <comment xml:lang="id">Templat Twig</comment>
- <comment xml:lang="it">Modello twig</comment>
- <comment xml:lang="kk">Twig үлгісі</comment>
- <comment xml:lang="ko">Twig 문서 서식</comment>
- <comment xml:lang="pl">Szablon Twig</comment>
- <comment xml:lang="pt-BR">Modelo Twig</comment>
- <comment xml:lang="ru">Шаблон Twig</comment>
- <comment xml:lang="sk">Šablóna Twig</comment>
- <comment xml:lang="sr">Твиг шаблон</comment>
- <comment xml:lang="sv">Twig-mall</comment>
- <comment xml:lang="tr">Twig şablonu</comment>
+ <comment xml:lang="zh_TW">Twig 範本</comment>
+ <comment xml:lang="zh_CN">Twig 模板</comment>
<comment xml:lang="uk">шаблон twig</comment>
- <comment xml:lang="zh-CN">Twig 模板</comment>
- <comment xml:lang="zh-TW">Twig 範本</comment>
+ <comment xml:lang="tr">Twig şablonu</comment>
+ <comment xml:lang="sv">Twig-mall</comment>
+ <comment xml:lang="sr">Твиг шаблон</comment>
+ <comment xml:lang="sq">gjedhe Twig</comment>
+ <comment xml:lang="sl">Predloga Twig</comment>
+ <comment xml:lang="si">අතු අච්චුව</comment>
+ <comment xml:lang="sk">Šablóna Twig</comment>
+ <comment xml:lang="ru">Шаблон Twig</comment>
+ <comment xml:lang="pt_BR">Modelo Twig</comment>
+ <comment xml:lang="pl">Szablon Twig</comment>
+ <comment xml:lang="oc">modèl Twig</comment>
+ <comment xml:lang="nl">Twig-sjabloon</comment>
+ <comment xml:lang="ko">Twig 문서 서식</comment>
+ <comment xml:lang="kk">Twig үлгісі</comment>
+ <comment xml:lang="ja">Twig テンプレート</comment>
+ <comment xml:lang="it">Modello twig</comment>
+ <comment xml:lang="is">Twig-sniðmát</comment>
+ <comment xml:lang="id">Templat Twig</comment>
+ <comment xml:lang="hu">Twig-sablon</comment>
+ <comment xml:lang="hr">Twig predložak</comment>
+ <comment xml:lang="he">תבנית Twig</comment>
+ <comment xml:lang="gl">Plantilla de Twig</comment>
+ <comment xml:lang="ga">teimpléad Twig</comment>
+ <comment xml:lang="fur">model Twig</comment>
+ <comment xml:lang="fr">modèle Twig</comment>
+ <comment xml:lang="fi">Twig-malli</comment>
+ <comment xml:lang="eu">Twig txantiloia</comment>
+ <comment xml:lang="es">plantilla de Twig</comment>
+ <comment xml:lang="en_GB">Twig template</comment>
+ <comment xml:lang="de">Twig-Vorlage</comment>
+ <comment xml:lang="da">Twig-skabelon</comment>
+ <comment xml:lang="cs">šablona Twig</comment>
+ <comment xml:lang="ca">plantilla Twig</comment>
+ <comment xml:lang="bg">Шаблон — Twig</comment>
+ <comment xml:lang="be">шаблон Twig</comment>
+ <comment xml:lang="ar">قالب Twig</comment>
+ <comment xml:lang="af">Twig-sjabloon</comment>
<sub-class-of type="text/plain"/>
<glob pattern="*.twig"/>
<generic-icon name="text-x-generic-template"/>
</mime-type>
<mime-type type="text/x-uil">
<comment>X-Motif UIL table</comment>
- <comment xml:lang="af">X-Motif UIL-tabel</comment>
- <comment xml:lang="ar">جدول X-Motif UIL</comment>
- <comment xml:lang="be-Latn">Tablica X-Motif UIL</comment>
- <comment xml:lang="bg">Таблица — X-Motif UIL</comment>
- <comment xml:lang="ca">taula UIL de X-Motif</comment>
- <comment xml:lang="cs">tabulka X-Motif UIL</comment>
- <comment xml:lang="da">X-Motif UIL-tabel</comment>
- <comment xml:lang="de">X-Motif-UIL-Tabelle</comment>
- <comment xml:lang="el">Πίνακας X-Motif UIL</comment>
- <comment xml:lang="en-GB">X-Motif UIL table</comment>
- <comment xml:lang="es">tabla de X-Motif UIL</comment>
- <comment xml:lang="eu">X-Motif UIL taula</comment>
- <comment xml:lang="fi">X-Motif UIL -taulukko</comment>
- <comment xml:lang="fo">X-Motif UIL talva</comment>
- <comment xml:lang="fr">table X-Motif UIL</comment>
- <comment xml:lang="fur">tabele X-Motif UIL</comment>
- <comment xml:lang="ga">tábla X-Motif UIL</comment>
- <comment xml:lang="gl">Táboa de X-Motif UIL</comment>
- <comment xml:lang="he">טבלה של X-Motif UIL</comment>
- <comment xml:lang="hr">X-Motif UIL tablica</comment>
- <comment xml:lang="hu">X-Motif UIL-táblázat</comment>
- <comment xml:lang="ia">Tabella X-Motif UIL</comment>
- <comment xml:lang="id">Tabel X-Motif UIL</comment>
- <comment xml:lang="it">Tabella UIL X-Motif</comment>
- <comment xml:lang="ja">X-Motif UIL 表</comment>
- <comment xml:lang="kk">X-Motif UIL кестесі</comment>
- <comment xml:lang="ko">X-Motif UIL 테이블</comment>
- <comment xml:lang="lt">X-Motif UIL lentelė</comment>
- <comment xml:lang="lv">X-Motif UIL tabula</comment>
- <comment xml:lang="ms">Jadual X-Motif UIL</comment>
- <comment xml:lang="nb">X-Motif UIL-tabell</comment>
- <comment xml:lang="nl">X-Motif UIL-tabel</comment>
- <comment xml:lang="nn">X-Motif UIL-tabell</comment>
- <comment xml:lang="oc">taula X-Motif UIL</comment>
- <comment xml:lang="pl">Tabela UIL X-Motif</comment>
- <comment xml:lang="pt">tabela UIL do X-Motif</comment>
- <comment xml:lang="pt-BR">Tabela UIL do X-Motif</comment>
- <comment xml:lang="ro">Tabel X-Motif UIL</comment>
- <comment xml:lang="ru">Таблица UIL X-Motif</comment>
- <comment xml:lang="sk">Tabuľka X-Motif UIL</comment>
- <comment xml:lang="sl">Preglednica X-Motif UIL</comment>
- <comment xml:lang="sq">Tabelë X-Motif UIL</comment>
- <comment xml:lang="sr">Икс-Мотиф УИЛ табела</comment>
- <comment xml:lang="sv">X-Motif UIL-tabell</comment>
- <comment xml:lang="tr">X-Motif UIL tablosu</comment>
- <comment xml:lang="uk">таблиця X-Motif UIL</comment>
+ <comment xml:lang="zh_TW">X-Motif UIL 表格</comment>
+ <comment xml:lang="zh_CN">X-Motif UIL 表</comment>
<comment xml:lang="vi">Bảng UIL X-Motif</comment>
- <comment xml:lang="zh-CN">X-Motif UIL 表</comment>
- <comment xml:lang="zh-TW">X-Motif UIL 表格</comment>
+ <comment xml:lang="uk">таблиця X-Motif UIL</comment>
+ <comment xml:lang="tr">X-Motif UIL tablosu</comment>
+ <comment xml:lang="sv">X-Motif UIL-tabell</comment>
+ <comment xml:lang="sr">Икс-Мотиф УИЛ табела</comment>
+ <comment xml:lang="sq">tabelë X-Motif UIL</comment>
+ <comment xml:lang="sl">Preglednica X-Motif UIL</comment>
+ <comment xml:lang="si">X-Motif UIL වගුව</comment>
+ <comment xml:lang="sk">Tabuľka X-Motif UIL</comment>
+ <comment xml:lang="ru">Таблица UIL X-Motif</comment>
+ <comment xml:lang="ro">Tabel X-Motif UIL</comment>
+ <comment xml:lang="pt_BR">Tabela UIL do X-Motif</comment>
+ <comment xml:lang="pt">tabela UIL do X-Motif</comment>
+ <comment xml:lang="pl">Tabela UIL X-Motif</comment>
+ <comment xml:lang="oc">taula X-Motif UIL</comment>
+ <comment xml:lang="nn">X-Motif UIL-tabell</comment>
+ <comment xml:lang="nl">X-Motif UIL-tabel</comment>
+ <comment xml:lang="nb">X-Motif UIL-tabell</comment>
+ <comment xml:lang="ms">Jadual X-Motif UIL</comment>
+ <comment xml:lang="lv">X-Motif UIL tabula</comment>
+ <comment xml:lang="lt">X-Motif UIL lentelė</comment>
+ <comment xml:lang="ko">X-Motif UIL 테이블</comment>
+ <comment xml:lang="kk">X-Motif UIL кестесі</comment>
+ <comment xml:lang="ja">X-Motif UIL 表</comment>
+ <comment xml:lang="it">Tabella UIL X-Motif</comment>
+ <comment xml:lang="is">X-Motif UIL tafla</comment>
+ <comment xml:lang="id">Tabel X-Motif UIL</comment>
+ <comment xml:lang="ia">Tabella X-Motif UIL</comment>
+ <comment xml:lang="hu">X-Motif UIL-táblázat</comment>
+ <comment xml:lang="hr">X-Motif UIL tablica</comment>
+ <comment xml:lang="he">טבלה של X-Motif UIL</comment>
+ <comment xml:lang="gl">Táboa de X-Motif UIL</comment>
+ <comment xml:lang="ga">tábla X-Motif UIL</comment>
+ <comment xml:lang="fur">tabele X-Motif UIL</comment>
+ <comment xml:lang="fr">table X-Motif UIL</comment>
+ <comment xml:lang="fo">X-Motif UIL talva</comment>
+ <comment xml:lang="fi">X-Motif UIL -taulukko</comment>
+ <comment xml:lang="eu">X-Motif UIL taula</comment>
+ <comment xml:lang="es">tabla de X-Motif UIL</comment>
+ <comment xml:lang="en_GB">X-Motif UIL table</comment>
+ <comment xml:lang="el">Πίνακας X-Motif UIL</comment>
+ <comment xml:lang="de">X-Motif-UIL-Tabelle</comment>
+ <comment xml:lang="da">X-Motif UIL-tabel</comment>
+ <comment xml:lang="cs">tabulka X-Motif UIL</comment>
+ <comment xml:lang="ca">taula UIL de X-Motif</comment>
+ <comment xml:lang="bg">Таблица — X-Motif UIL</comment>
+ <comment xml:lang="be@latin">Tablica X-Motif UIL</comment>
+ <comment xml:lang="be">табліца X-Motif UIL</comment>
+ <comment xml:lang="ar">جدول X-Motif UIL</comment>
+ <comment xml:lang="af">X-Motif UIL-tabel</comment>
<sub-class-of type="text/plain"/>
<glob pattern="*.uil"/>
</mime-type>
<mime-type type="text/x-uri">
- <comment>resource location</comment>
- <comment xml:lang="ar">موقع المورد</comment>
- <comment xml:lang="be-Latn">pałažeńnie resursu</comment>
- <comment xml:lang="bg">Местоположение на ресурс</comment>
- <comment xml:lang="ca">localització de recurs</comment>
- <comment xml:lang="cs">umístění prostředku</comment>
- <comment xml:lang="da">resurseplacering</comment>
- <comment xml:lang="de">Ressourcenort</comment>
- <comment xml:lang="el">Τοποθεσία πόρου</comment>
- <comment xml:lang="en-GB">resource location</comment>
- <comment xml:lang="eo">loko de risurco</comment>
- <comment xml:lang="es">ubicación del recurso</comment>
- <comment xml:lang="eu">baliabidearen kokalekua</comment>
- <comment xml:lang="fi">resurssisijainti</comment>
- <comment xml:lang="fo">tilfeingisstaður</comment>
- <comment xml:lang="fr">localisation de ressource</comment>
- <comment xml:lang="fur">posizion risorse</comment>
- <comment xml:lang="ga">suíomh acmhainne</comment>
- <comment xml:lang="gl">localización do recurso</comment>
- <comment xml:lang="he">מיקום של משאב</comment>
- <comment xml:lang="hr">Lokacija resursa</comment>
- <comment xml:lang="hu">erőforrás-hely</comment>
- <comment xml:lang="ia">Loco de ressources</comment>
- <comment xml:lang="id">lokasi sumber daya</comment>
- <comment xml:lang="it">Posizione risorsa</comment>
- <comment xml:lang="ja">リソースの場所</comment>
- <comment xml:lang="kk">ресурс орналасуы</comment>
- <comment xml:lang="ko">자원 위치</comment>
- <comment xml:lang="lt">resurso vieta</comment>
- <comment xml:lang="lv">resursa atrašanās vieta</comment>
- <comment xml:lang="ms">Lokasi sumber</comment>
- <comment xml:lang="nb">ressurslokasjon</comment>
- <comment xml:lang="nl">bronlocatie</comment>
- <comment xml:lang="nn">ressursplassering</comment>
- <comment xml:lang="oc">localizacion de ressorsa</comment>
- <comment xml:lang="pl">Położenie zasobu</comment>
- <comment xml:lang="pt">localização de recurso</comment>
- <comment xml:lang="pt-BR">Localização de recurso</comment>
- <comment xml:lang="ro">locație de resursă</comment>
- <comment xml:lang="ru">Расположение ресурса</comment>
- <comment xml:lang="sk">Umiestnenie zdroja</comment>
- <comment xml:lang="sl">mesto vira</comment>
- <comment xml:lang="sq">Pozicion rezerve</comment>
- <comment xml:lang="sr">путања изворишта</comment>
- <comment xml:lang="sv">resursplats</comment>
- <comment xml:lang="tr">kaynak ayırma</comment>
+ <comment>Resource location</comment>
<comment xml:lang="uk">розташування ресурсу</comment>
- <comment xml:lang="vi">địa điểm tài nguyên</comment>
- <comment xml:lang="zh-CN">资源位置</comment>
- <comment xml:lang="zh-TW">資源位置</comment>
+ <comment xml:lang="sv">Resursplats</comment>
+ <comment xml:lang="ru">Расположение ресурса</comment>
+ <comment xml:lang="pl">Położenie zasobu</comment>
+ <comment xml:lang="it">Posizione risorsa</comment>
+ <comment xml:lang="gl">Localización de recurso</comment>
+ <comment xml:lang="eu">Baliabideen kokalekua</comment>
+ <comment xml:lang="es">ubicación de recurso</comment>
+ <comment xml:lang="de">Ressourcenort</comment>
+ <comment xml:lang="be">размяшчэнне рэсурсу</comment>
<sub-class-of type="text/plain"/>
<!-- Note: text/uri-list is reserved by the XDND protocol! -->
</mime-type>
<mime-type type="text/x-uuencode">
<comment>uuencoded file</comment>
- <comment xml:lang="af">uu-geënkodeerde lêer</comment>
- <comment xml:lang="bg">Файл — кодиран с uuencode</comment>
- <comment xml:lang="ca">fitxer uuencoded</comment>
- <comment xml:lang="cs">soubor kódovaný pomocí uuencoding</comment>
- <comment xml:lang="da">uuencodede-fil</comment>
- <comment xml:lang="de">Datei im uuencode-Format</comment>
- <comment xml:lang="el">Αρχείο κωδικοποιημένο unix σε unix (uuencoded)</comment>
- <comment xml:lang="en-GB">uuencoded file</comment>
- <comment xml:lang="es">archivo codificado con uuencode</comment>
- <comment xml:lang="eu">uuencode-aturiko fitxategia</comment>
- <comment xml:lang="fi">uuencoded tiedosto</comment>
- <comment xml:lang="fr">fichier uuencodé</comment>
- <comment xml:lang="fur">file codificât cun uuencode</comment>
- <comment xml:lang="ga">comhad uuencoded</comment>
- <comment xml:lang="gl">Ficheiro uuencoded</comment>
- <comment xml:lang="he">קובץ בקידוד uu</comment>
- <comment xml:lang="hr">uuencoded datoteka</comment>
- <comment xml:lang="hu">uuencode-olt fájl</comment>
- <comment xml:lang="ia">File in uuencode</comment>
- <comment xml:lang="id">berkas ter-uuencode</comment>
- <comment xml:lang="it">File uuencoded</comment>
- <comment xml:lang="ja">未エンコードファイル</comment>
- <comment xml:lang="kk">uuencode кодталған файлы</comment>
- <comment xml:lang="ko">uuencoded 파일</comment>
- <comment xml:lang="lv">uu kodējuma datne</comment>
- <comment xml:lang="oc">fichièr uuencodat</comment>
- <comment xml:lang="pl">Plik zakodowany za pomocą uuencode</comment>
- <comment xml:lang="pt">ficheiro uuencoded</comment>
- <comment xml:lang="pt-BR">Arquivo codificado UUE</comment>
- <comment xml:lang="ru">Файл, кодированный uuencode</comment>
- <comment xml:lang="sk">Súbor v kódovaní uuencode</comment>
- <comment xml:lang="sl">Datoteka uuencode</comment>
- <comment xml:lang="sr">уукодирана датотека</comment>
- <comment xml:lang="sv">uuencode-fil</comment>
- <comment xml:lang="tr">uuencoded dosyası</comment>
+ <comment xml:lang="zh_TW">uuencoded 檔</comment>
+ <comment xml:lang="zh_CN">Uuencode 文件</comment>
<comment xml:lang="uk">файл даних у форматі UUE</comment>
- <comment xml:lang="zh-CN">Uuencode 文件</comment>
- <comment xml:lang="zh-TW">uuencoded 檔</comment>
+ <comment xml:lang="tr">uuencoded dosyası</comment>
+ <comment xml:lang="sv">uuencode-fil</comment>
+ <comment xml:lang="sr">уукодирана датотека</comment>
+ <comment xml:lang="sl">Datoteka uuencode</comment>
+ <comment xml:lang="si">uuencoded ගොනුව</comment>
+ <comment xml:lang="sk">Súbor v kódovaní uuencode</comment>
+ <comment xml:lang="ru">Файл, кодированный uuencode</comment>
+ <comment xml:lang="pt_BR">Arquivo codificado UUE</comment>
+ <comment xml:lang="pt">ficheiro uuencoded</comment>
+ <comment xml:lang="pl">Plik zakodowany za pomocą uuencode</comment>
+ <comment xml:lang="oc">fichièr uuencodat</comment>
+ <comment xml:lang="nl">uuencoded bestand</comment>
+ <comment xml:lang="lv">uu kodējuma datne</comment>
+ <comment xml:lang="ko">uuencoded 파일</comment>
+ <comment xml:lang="kk">uuencode кодталған файлы</comment>
+ <comment xml:lang="ja">未エンコードファイル</comment>
+ <comment xml:lang="it">File uuencoded</comment>
+ <comment xml:lang="is">uuencoded skrá</comment>
+ <comment xml:lang="id">berkas ter-uuencode</comment>
+ <comment xml:lang="ia">File in uuencode</comment>
+ <comment xml:lang="hu">uuencode-olt fájl</comment>
+ <comment xml:lang="hr">uuencoded datoteka</comment>
+ <comment xml:lang="he">קובץ בקידוד uu</comment>
+ <comment xml:lang="gl">Ficheiro uuencoded</comment>
+ <comment xml:lang="ga">comhad uuencoded</comment>
+ <comment xml:lang="fur">file codificât cun uuencode</comment>
+ <comment xml:lang="fr">fichier uuencodé</comment>
+ <comment xml:lang="fi">uuenkoodattu tiedosto</comment>
+ <comment xml:lang="eu">uuencode-aturiko fitxategia</comment>
+ <comment xml:lang="es">archivo codificado con uuencode</comment>
+ <comment xml:lang="en_GB">uuencoded file</comment>
+ <comment xml:lang="el">Αρχείο κωδικοποιημένο unix σε unix (uuencoded)</comment>
+ <comment xml:lang="de">Datei im uuencode-Format</comment>
+ <comment xml:lang="da">uuencodede-fil</comment>
+ <comment xml:lang="cs">soubor kódovaný pomocí uuencoding</comment>
+ <comment xml:lang="ca">fitxer uuencoded</comment>
+ <comment xml:lang="bg">Файл — кодиран с uuencode</comment>
+ <comment xml:lang="be">файл, закадаваны uuencode</comment>
+ <comment xml:lang="ar">ملف uuencoded</comment>
+ <comment xml:lang="af">uu-geënkodeerde lêer</comment>
<sub-class-of type="text/plain"/>
<glob pattern="*.uue"/>
- <magic priority="50">
+ <magic>
<match type="string" value="begin " offset="0"/>
</magic>
<alias type="zz-application/zz-winassoc-uu"/>
</mime-type>
+ <mime-type type="text/x-basic">
+ <comment>BASIC program</comment>
+ <comment xml:lang="uk">програма BASIC</comment>
+ <comment xml:lang="sv">BASIC-program</comment>
+ <comment xml:lang="ru">Программа BASIC</comment>
+ <comment xml:lang="pl">Program BASIC</comment>
+ <comment xml:lang="es">programa en BASIC</comment>
+ <comment xml:lang="de">BASIC-Programm</comment>
+ <sub-class-of type="text/plain"/>
+ <generic-icon name="text-x-script"/>
+ <glob pattern="*.bas"/>
+ </mime-type>
+ <mime-type type="text/x-vb">
+ <comment>Visual Basic .NET source code</comment>
+ <comment xml:lang="uk">початковий код Visual Basic .NET</comment>
+ <comment xml:lang="sv">Visual Basic .NET-källkod</comment>
+ <comment xml:lang="ru">Исходный код Visual Basic .NET</comment>
+ <comment xml:lang="pl">Kod źródłowy Visual Basic .NET</comment>
+ <comment xml:lang="es">código fuente en Visual Basic .NET</comment>
+ <comment xml:lang="de">Visual-Basic-.NET-Quelltext</comment>
+ <sub-class-of type="text/plain"/>
+ <magic>
+ <match type="string" value="Imports" offset="0"/>
+ <match type="string" value="Module" offset="0"/>
+ <match type="string" value="REM" offset="0"/>
+ </magic>
+ <glob pattern="*.vb"/>
+ </mime-type>
<mime-type type="text/vbscript">
<comment>VBScript program</comment>
- <comment xml:lang="ca">programa VBScript</comment>
- <comment xml:lang="da">VBScript-program</comment>
- <comment xml:lang="de">VBScript-Programm</comment>
- <comment xml:lang="en-GB">VBScript program</comment>
- <comment xml:lang="es">programa en VBScript</comment>
- <comment xml:lang="fi">VBScript-ohjelma</comment>
- <comment xml:lang="fr">programme VBScript</comment>
- <comment xml:lang="hr">VBScript program</comment>
- <comment xml:lang="it">Programma VBScript</comment>
- <comment xml:lang="pl">Pogram VBScript</comment>
- <comment xml:lang="pt-BR">Programa VBScript</comment>
- <comment xml:lang="sv">VBScript-program</comment>
+ <comment xml:lang="zh_TW">VBScript 程式</comment>
+ <comment xml:lang="zh_CN">VBScript 程序</comment>
<comment xml:lang="uk">програма мовою VBScript</comment>
- <comment xml:lang="zh-CN">VBScript 程序</comment>
- <comment xml:lang="zh-TW">VBScript 程式</comment>
+ <comment xml:lang="tr">VBScript programı</comment>
+ <comment xml:lang="sv">VBScript-program</comment>
+ <comment xml:lang="sl">Programska datoteka VBScript</comment>
+ <comment xml:lang="si">VBScript වැඩසටහන</comment>
+ <comment xml:lang="ru">Программа VBScript</comment>
+ <comment xml:lang="pt_BR">Programa VBScript</comment>
+ <comment xml:lang="pl">Pogram VBScript</comment>
+ <comment xml:lang="oc">programa VBScript</comment>
+ <comment xml:lang="nl">VBScript-programma</comment>
+ <comment xml:lang="ko">VBScript 프로그램</comment>
+ <comment xml:lang="kk">VBScript бағдарламасы</comment>
+ <comment xml:lang="ja">VBScript プログラム</comment>
+ <comment xml:lang="it">Programma VBScript</comment>
+ <comment xml:lang="is">VBScript forrit</comment>
+ <comment xml:lang="id">program VBScript</comment>
+ <comment xml:lang="hu">VBScript program</comment>
+ <comment xml:lang="hr">VBScript program</comment>
+ <comment xml:lang="he">תכנית VBScript</comment>
+ <comment xml:lang="gl">Programa VBScript</comment>
+ <comment xml:lang="fr">programme VBScript</comment>
+ <comment xml:lang="fi">VBScript-ohjelma</comment>
+ <comment xml:lang="eu">VBScript programa</comment>
+ <comment xml:lang="es">programa en VBScript</comment>
+ <comment xml:lang="en_GB">VBScript program</comment>
+ <comment xml:lang="de">VBScript-Programm</comment>
+ <comment xml:lang="da">VBScript-program</comment>
+ <comment xml:lang="ca">programa VBScript</comment>
+ <comment xml:lang="be">праграма VBScript</comment>
+ <comment xml:lang="ar">برنامج في بي سكريبت</comment>
<alias type="text/vbs"/>
<sub-class-of type="text/plain"/>
<generic-icon name="text-x-script"/>
<glob pattern="*.vbs"/>
</mime-type>
+ <mime-type type="text/vbscript.encode">
+ <comment>Encoded VBScript program</comment>
+ <comment xml:lang="uk">кодована програма VBScript</comment>
+ <comment xml:lang="sv">Kodat VBScript-program</comment>
+ <comment xml:lang="ru">Зашифрованная программа на VBScript</comment>
+ <comment xml:lang="pl">Zakodowany program VBScript</comment>
+ <comment xml:lang="es">Programa en VBScript codificado</comment>
+ <comment xml:lang="de">Verschlüsseltes VBScript-Programm</comment>
+ <sub-class-of type="application/x-executable"/>
+ <sub-class-of type="text/plain"/>
+ <generic-icon name="text-x-script"/>
+ <magic>
+ <match type="string" value="#@~^" offset="0"/>
+ </magic>
+ <glob pattern="*.vbe"/>
+ </mime-type>
<mime-type type="text/x-xmi">
<comment>XMI file</comment>
- <comment xml:lang="af">XMI-lêer</comment>
- <comment xml:lang="ar">ملف XMI</comment>
- <comment xml:lang="be-Latn">Fajł XMI</comment>
- <comment xml:lang="bg">Файл — XMI</comment>
- <comment xml:lang="ca">fitxer XMI</comment>
- <comment xml:lang="cs">soubor XMI</comment>
- <comment xml:lang="da">XMI-fil</comment>
- <comment xml:lang="de">XMI-Datei</comment>
- <comment xml:lang="el">Αρχείο XML</comment>
- <comment xml:lang="en-GB">XMI file</comment>
- <comment xml:lang="eo">XMI-dosiero</comment>
- <comment xml:lang="es">archivo XMI</comment>
- <comment xml:lang="eu">XMI fitxategia</comment>
- <comment xml:lang="fi">XMI-tiedosto</comment>
- <comment xml:lang="fo">XMI fíla</comment>
- <comment xml:lang="fr">fichier XMI</comment>
- <comment xml:lang="fur">file XMI</comment>
- <comment xml:lang="ga">comhad XMI</comment>
- <comment xml:lang="gl">ficheiro XMI</comment>
- <comment xml:lang="he">קובץ XMI</comment>
- <comment xml:lang="hr">XMI datoteka</comment>
- <comment xml:lang="hu">XMI fájl</comment>
- <comment xml:lang="ia">File XMI</comment>
- <comment xml:lang="id">Berkas XMI</comment>
- <comment xml:lang="it">File XMI</comment>
- <comment xml:lang="ja">XMI ファイル</comment>
- <comment xml:lang="kk">XMI файлы</comment>
- <comment xml:lang="ko">XMI 파일</comment>
- <comment xml:lang="lt">XMI failas</comment>
- <comment xml:lang="lv">XMI datne</comment>
- <comment xml:lang="nb">XMI-fil</comment>
- <comment xml:lang="nl">XMI-bestand</comment>
- <comment xml:lang="nn">XMI-fil</comment>
- <comment xml:lang="oc">fichièr XMI</comment>
- <comment xml:lang="pl">Plik XMI</comment>
- <comment xml:lang="pt">ficheiro XMI</comment>
- <comment xml:lang="pt-BR">Arquivo XMI</comment>
- <comment xml:lang="ro">Fișier XMI</comment>
- <comment xml:lang="ru">Файл XMI</comment>
- <comment xml:lang="sk">Súbor XMI</comment>
- <comment xml:lang="sl">Datoteka XMI</comment>
- <comment xml:lang="sq">File XMI</comment>
- <comment xml:lang="sr">ИксМИ датотека</comment>
- <comment xml:lang="sv">XMI-fil</comment>
- <comment xml:lang="tr">XMI dosyası</comment>
- <comment xml:lang="uk">файл XMI</comment>
+ <comment xml:lang="zh_TW">XMI 檔</comment>
+ <comment xml:lang="zh_CN">XMI 文件</comment>
<comment xml:lang="vi">Tập tin XMI</comment>
- <comment xml:lang="zh-CN">XMI 文件</comment>
- <comment xml:lang="zh-TW">XMI 檔</comment>
+ <comment xml:lang="uk">файл XMI</comment>
+ <comment xml:lang="tr">XMI dosyası</comment>
+ <comment xml:lang="sv">XMI-fil</comment>
+ <comment xml:lang="sr">ИксМИ датотека</comment>
+ <comment xml:lang="sq">kartelë XMI</comment>
+ <comment xml:lang="sl">Datoteka XMI</comment>
+ <comment xml:lang="si">XMI ගොනුව</comment>
+ <comment xml:lang="sk">Súbor XMI</comment>
+ <comment xml:lang="ru">Файл XMI</comment>
+ <comment xml:lang="ro">Fișier XMI</comment>
+ <comment xml:lang="pt_BR">Arquivo XMI</comment>
+ <comment xml:lang="pt">ficheiro XMI</comment>
+ <comment xml:lang="pl">Plik XMI</comment>
+ <comment xml:lang="oc">fichièr XMI</comment>
+ <comment xml:lang="nn">XMI-fil</comment>
+ <comment xml:lang="nl">XMI-bestand</comment>
+ <comment xml:lang="nb">XMI-fil</comment>
+ <comment xml:lang="lv">XMI datne</comment>
+ <comment xml:lang="lt">XMI failas</comment>
+ <comment xml:lang="ko">XMI 파일</comment>
+ <comment xml:lang="kk">XMI файлы</comment>
+ <comment xml:lang="ja">XMI ファイル</comment>
+ <comment xml:lang="it">File XMI</comment>
+ <comment xml:lang="is">XMI-skrá</comment>
+ <comment xml:lang="id">Berkas XMI</comment>
+ <comment xml:lang="ia">File XMI</comment>
+ <comment xml:lang="hu">XMI fájl</comment>
+ <comment xml:lang="hr">XMI datoteka</comment>
+ <comment xml:lang="he">קובץ XMI</comment>
+ <comment xml:lang="gl">ficheiro XMI</comment>
+ <comment xml:lang="ga">comhad XMI</comment>
+ <comment xml:lang="fur">file XMI</comment>
+ <comment xml:lang="fr">fichier XMI</comment>
+ <comment xml:lang="fo">XMI fíla</comment>
+ <comment xml:lang="fi">XMI-tiedosto</comment>
+ <comment xml:lang="eu">XMI fitxategia</comment>
+ <comment xml:lang="es">archivo XMI</comment>
+ <comment xml:lang="eo">XMI-dosiero</comment>
+ <comment xml:lang="en_GB">XMI file</comment>
+ <comment xml:lang="el">Αρχείο XML</comment>
+ <comment xml:lang="de">XMI-Datei</comment>
+ <comment xml:lang="da">XMI-fil</comment>
+ <comment xml:lang="cs">soubor XMI</comment>
+ <comment xml:lang="ca">fitxer XMI</comment>
+ <comment xml:lang="bg">Файл — XMI</comment>
+ <comment xml:lang="be@latin">Fajł XMI</comment>
+ <comment xml:lang="be">файл XMI</comment>
+ <comment xml:lang="ar">ملف XMI</comment>
+ <comment xml:lang="af">XMI-lêer</comment>
<acronym>XMI</acronym>
<expanded-acronym>XML Metadata Interchange</expanded-acronym>
<sub-class-of type="application/xml"/>
@@ -38286,55 +39350,58 @@ command to generate the output files.
</mime-type>
<mime-type type="text/x-xslfo">
<comment>XSL FO file</comment>
- <comment xml:lang="af">XSL FO-lêer</comment>
- <comment xml:lang="ar">ملف XSL FO</comment>
- <comment xml:lang="be-Latn">Fajł XSL FO</comment>
- <comment xml:lang="bg">Форматиращ файл — XSL FO</comment>
- <comment xml:lang="ca">fitxer FO XSL</comment>
- <comment xml:lang="cs">soubor XSL FO</comment>
- <comment xml:lang="da">XML FO-fil</comment>
- <comment xml:lang="de">XSL-FO-Datei</comment>
- <comment xml:lang="el">Αρχείο XSL FO</comment>
- <comment xml:lang="en-GB">XSL FO file</comment>
- <comment xml:lang="eo">XSL-FO-dosiero</comment>
- <comment xml:lang="es">archivo XSL FO</comment>
- <comment xml:lang="eu">XSL FO fitxategia</comment>
- <comment xml:lang="fi">XSL FO -tiedosto</comment>
- <comment xml:lang="fo">XSL FO fíla</comment>
- <comment xml:lang="fr">fichier XSL FO</comment>
- <comment xml:lang="fur">file XSL FO</comment>
- <comment xml:lang="ga">comhad XSL FO</comment>
- <comment xml:lang="gl">ficheiro XSL FO</comment>
- <comment xml:lang="he">קובץ XSL FO</comment>
- <comment xml:lang="hr">XSL FO datoteka</comment>
- <comment xml:lang="hu">XSL FO fájl</comment>
- <comment xml:lang="ia">File XSL FO</comment>
- <comment xml:lang="id">Berkas XSL FO</comment>
- <comment xml:lang="it">File XSL FO</comment>
- <comment xml:lang="ja">XSL FO ファイル</comment>
- <comment xml:lang="kk">XSL FO файлы</comment>
- <comment xml:lang="ko">XSL 포매팅 개체 파일</comment>
- <comment xml:lang="lt">XSL FO failas</comment>
- <comment xml:lang="lv">XSL FO datne</comment>
- <comment xml:lang="nb">FO-fil for XSL</comment>
- <comment xml:lang="nl">XSL FO-bestand</comment>
- <comment xml:lang="nn">XSL FO-fil</comment>
- <comment xml:lang="oc">fichièr XSL FO</comment>
- <comment xml:lang="pl">Plik XSL FO</comment>
- <comment xml:lang="pt">ficheiro XSL FO</comment>
- <comment xml:lang="pt-BR">Arquivo XSL FO</comment>
- <comment xml:lang="ro">Fișier XSL FO</comment>
- <comment xml:lang="ru">Файл XSL FO</comment>
- <comment xml:lang="sk">Súbor XSL FO</comment>
- <comment xml:lang="sl">Datoteka XSL FO</comment>
- <comment xml:lang="sq">File XSL FO</comment>
- <comment xml:lang="sr">ИксСЛ ФО датотека</comment>
- <comment xml:lang="sv">XSL FO-fil</comment>
- <comment xml:lang="tr">XSL FO dosyası</comment>
- <comment xml:lang="uk">файл XSL FO</comment>
+ <comment xml:lang="zh_TW">XSL FO 檔</comment>
+ <comment xml:lang="zh_CN">XSL 格式化对象文件</comment>
<comment xml:lang="vi">Tập tin FO của XSL (XFO)</comment>
- <comment xml:lang="zh-CN">XSL 格式化对象文件</comment>
- <comment xml:lang="zh-TW">XSL FO 檔</comment>
+ <comment xml:lang="uk">файл XSL FO</comment>
+ <comment xml:lang="tr">XSL FO dosyası</comment>
+ <comment xml:lang="sv">XSL FO-fil</comment>
+ <comment xml:lang="sr">ИксСЛ ФО датотека</comment>
+ <comment xml:lang="sq">kartelë XSL FO</comment>
+ <comment xml:lang="sl">Datoteka XSL FO</comment>
+ <comment xml:lang="si">XSL FO ගොනුව</comment>
+ <comment xml:lang="sk">Súbor XSL FO</comment>
+ <comment xml:lang="ru">Файл XSL FO</comment>
+ <comment xml:lang="ro">Fișier XSL FO</comment>
+ <comment xml:lang="pt_BR">Arquivo XSL FO</comment>
+ <comment xml:lang="pt">ficheiro XSL FO</comment>
+ <comment xml:lang="pl">Plik XSL FO</comment>
+ <comment xml:lang="oc">fichièr XSL FO</comment>
+ <comment xml:lang="nn">XSL FO-fil</comment>
+ <comment xml:lang="nl">XSL FO-bestand</comment>
+ <comment xml:lang="nb">FO-fil for XSL</comment>
+ <comment xml:lang="lv">XSL FO datne</comment>
+ <comment xml:lang="lt">XSL FO failas</comment>
+ <comment xml:lang="ko">XSL 포매팅 개체 파일</comment>
+ <comment xml:lang="kk">XSL FO файлы</comment>
+ <comment xml:lang="ja">XSL FO ファイル</comment>
+ <comment xml:lang="it">File XSL FO</comment>
+ <comment xml:lang="is">XSL FO skrá</comment>
+ <comment xml:lang="id">Berkas XSL FO</comment>
+ <comment xml:lang="ia">File XSL FO</comment>
+ <comment xml:lang="hu">XSL FO fájl</comment>
+ <comment xml:lang="hr">XSL FO datoteka</comment>
+ <comment xml:lang="he">קובץ XSL FO</comment>
+ <comment xml:lang="gl">ficheiro XSL FO</comment>
+ <comment xml:lang="ga">comhad XSL FO</comment>
+ <comment xml:lang="fur">file XSL FO</comment>
+ <comment xml:lang="fr">fichier XSL FO</comment>
+ <comment xml:lang="fo">XSL FO fíla</comment>
+ <comment xml:lang="fi">XSL FO -tiedosto</comment>
+ <comment xml:lang="eu">XSL FO fitxategia</comment>
+ <comment xml:lang="es">archivo XSL FO</comment>
+ <comment xml:lang="eo">XSL-FO-dosiero</comment>
+ <comment xml:lang="en_GB">XSL FO file</comment>
+ <comment xml:lang="el">Αρχείο XSL FO</comment>
+ <comment xml:lang="de">XSL-FO-Datei</comment>
+ <comment xml:lang="da">XML FO-fil</comment>
+ <comment xml:lang="cs">soubor XSL FO</comment>
+ <comment xml:lang="ca">fitxer FO XSL</comment>
+ <comment xml:lang="bg">Форматиращ файл — XSL FO</comment>
+ <comment xml:lang="be@latin">Fajł XSL FO</comment>
+ <comment xml:lang="be">файл XSL FO</comment>
+ <comment xml:lang="ar">ملف XSL FO</comment>
+ <comment xml:lang="af">XSL FO-lêer</comment>
<acronym>XSL FO</acronym>
<expanded-acronym>XSL Formatting Objects</expanded-acronym>
<sub-class-of type="application/xml"/>
@@ -38344,57 +39411,60 @@ command to generate the output files.
</mime-type>
<mime-type type="text/x-iptables">
<comment>iptables configuration file</comment>
- <comment xml:lang="af">iptables-opstellingslêer</comment>
- <comment xml:lang="ar">ملف تضبيط iptables</comment>
- <comment xml:lang="ast">ficheru de configuración d'iptables</comment>
- <comment xml:lang="be-Latn">kanfihuracyjny fajł iptables</comment>
- <comment xml:lang="bg">Настройки за iptables</comment>
- <comment xml:lang="ca">fitxer de configuració d'iptables</comment>
- <comment xml:lang="cs">soubor nastavení iptables</comment>
- <comment xml:lang="da">iptableskonfigurationsfil</comment>
- <comment xml:lang="de">iptables-Konfigurationsdatei</comment>
- <comment xml:lang="el">Αρχείο ρυθμίσεων iptables</comment>
- <comment xml:lang="en-GB">iptables configuration file</comment>
- <comment xml:lang="es">archivo de configuración de iptables</comment>
- <comment xml:lang="eu">iptables konfigurazio-fitxategia</comment>
- <comment xml:lang="fi">iptables-asetustiedosto</comment>
- <comment xml:lang="fo">iptables samansetingarfíla</comment>
- <comment xml:lang="fr">fichier de configuration iptables</comment>
- <comment xml:lang="fur">file di configurazion di iptables</comment>
- <comment xml:lang="ga">comhad cumraíochta iptables</comment>
- <comment xml:lang="gl">ficheiro de configuración de iptables</comment>
- <comment xml:lang="he">קובץ הגדרה של iptables</comment>
- <comment xml:lang="hr">iptables datoteka podešavanja</comment>
- <comment xml:lang="hu">iptables beállítófájl</comment>
- <comment xml:lang="ia">File de configuration IPTables</comment>
- <comment xml:lang="id">berkas konfigurasi iptables</comment>
- <comment xml:lang="it">File configurazione iptables</comment>
- <comment xml:lang="ja">iptables 設定ファイル</comment>
- <comment xml:lang="kk">iptables баптаулар файлы</comment>
- <comment xml:lang="ko">iptables 설정 파일</comment>
- <comment xml:lang="lt">iptables konfigūracijos failas</comment>
- <comment xml:lang="lv">iptables konfigurācijas datne</comment>
- <comment xml:lang="nb">konfigurasjonsfil for iptables</comment>
- <comment xml:lang="nl">iptables-configuratiebestand</comment>
- <comment xml:lang="nn">iptables oppsettfil</comment>
- <comment xml:lang="oc">fichièr de configuracion iptables</comment>
- <comment xml:lang="pl">Plik konfiguracji iptables</comment>
- <comment xml:lang="pt">ficheiro de configuração iptables</comment>
- <comment xml:lang="pt-BR">Arquivo de configuração do iptables</comment>
- <comment xml:lang="ro">fișier configurare iptables</comment>
- <comment xml:lang="ru">Файл настроек iptables</comment>
- <comment xml:lang="sk">Súbor nastavení iptables</comment>
- <comment xml:lang="sl">nastavitvena datoteka iptables</comment>
- <comment xml:lang="sq">File konfigurimi iptables</comment>
- <comment xml:lang="sr">датотека подешавања иптабела</comment>
- <comment xml:lang="sv">iptables-konfigurationsfil</comment>
- <comment xml:lang="tr">iptables yapılandırma dosyası</comment>
- <comment xml:lang="uk">файл налаштувань iptables</comment>
+ <comment xml:lang="zh_TW">iptables 組態檔</comment>
+ <comment xml:lang="zh_CN">iptables 防火墙配置文件</comment>
<comment xml:lang="vi">tập tin cấu hình iptables</comment>
- <comment xml:lang="zh-CN">iptables 防火墙配置文件</comment>
- <comment xml:lang="zh-TW">iptables 組態檔</comment>
+ <comment xml:lang="uk">файл налаштувань iptables</comment>
+ <comment xml:lang="tr">iptables yapılandırma dosyası</comment>
+ <comment xml:lang="sv">iptables-konfigurationsfil</comment>
+ <comment xml:lang="sr">датотека подешавања иптабела</comment>
+ <comment xml:lang="sq">kartelë formësimi iptables</comment>
+ <comment xml:lang="sl">nastavitvena datoteka iptables</comment>
+ <comment xml:lang="si">iptables වින්‍යාස ගොනුව</comment>
+ <comment xml:lang="sk">Súbor nastavení iptables</comment>
+ <comment xml:lang="ru">Файл настроек iptables</comment>
+ <comment xml:lang="ro">fișier configurare iptables</comment>
+ <comment xml:lang="pt_BR">Arquivo de configuração do iptables</comment>
+ <comment xml:lang="pt">ficheiro de configuração iptables</comment>
+ <comment xml:lang="pl">Plik konfiguracji iptables</comment>
+ <comment xml:lang="oc">fichièr de configuracion iptables</comment>
+ <comment xml:lang="nn">iptables oppsettfil</comment>
+ <comment xml:lang="nl">iptables-configuratiebestand</comment>
+ <comment xml:lang="nb">konfigurasjonsfil for iptables</comment>
+ <comment xml:lang="lv">iptables konfigurācijas datne</comment>
+ <comment xml:lang="lt">iptables konfigūracijos failas</comment>
+ <comment xml:lang="ko">iptables 설정 파일</comment>
+ <comment xml:lang="kk">iptables баптаулар файлы</comment>
+ <comment xml:lang="ja">iptables 設定ファイル</comment>
+ <comment xml:lang="it">File configurazione iptables</comment>
+ <comment xml:lang="is">iptables stillingaskrá</comment>
+ <comment xml:lang="id">berkas konfigurasi iptables</comment>
+ <comment xml:lang="ia">File de configuration IPTables</comment>
+ <comment xml:lang="hu">iptables beállítófájl</comment>
+ <comment xml:lang="hr">iptables datoteka podešavanja</comment>
+ <comment xml:lang="he">קובץ הגדרה של iptables</comment>
+ <comment xml:lang="gl">ficheiro de configuración de iptables</comment>
+ <comment xml:lang="ga">comhad cumraíochta iptables</comment>
+ <comment xml:lang="fur">file di configurazion di iptables</comment>
+ <comment xml:lang="fr">fichier de configuration iptables</comment>
+ <comment xml:lang="fo">iptables samansetingarfíla</comment>
+ <comment xml:lang="fi">iptables-asetustiedosto</comment>
+ <comment xml:lang="eu">iptables konfigurazio-fitxategia</comment>
+ <comment xml:lang="es">archivo de configuración de iptables</comment>
+ <comment xml:lang="en_GB">iptables configuration file</comment>
+ <comment xml:lang="el">Αρχείο ρυθμίσεων iptables</comment>
+ <comment xml:lang="de">iptables-Konfigurationsdatei</comment>
+ <comment xml:lang="da">iptableskonfigurationsfil</comment>
+ <comment xml:lang="cs">soubor nastavení iptables</comment>
+ <comment xml:lang="ca">fitxer de configuració d'iptables</comment>
+ <comment xml:lang="bg">Настройки за iptables</comment>
+ <comment xml:lang="be@latin">kanfihuracyjny fajł iptables</comment>
+ <comment xml:lang="be">файл канфігурацыі iptables</comment>
+ <comment xml:lang="ast">ficheru de configuración d'iptables</comment>
+ <comment xml:lang="ar">ملف إعداد iptables</comment>
+ <comment xml:lang="af">iptables-opstellingslêer</comment>
<sub-class-of type="text/plain"/>
- <magic priority="50">
+ <magic>
<match type="string" value="/etc/sysconfig/iptables" offset="0:256"/>
<match type="string" value="*filter" offset="0:256">
<match type="string" value=":INPUT" offset="0:256">
@@ -38418,76 +39488,66 @@ command to generate the output files.
</mime-type>
<mime-type type="text/x-dbus-service">
<comment>D-Bus service file</comment>
- <comment xml:lang="af">D-Bus-dienslêer</comment>
- <comment xml:lang="bg">Услуга — D-Bus</comment>
- <comment xml:lang="ca">fitxer de servei de D-Bus</comment>
- <comment xml:lang="cs">soubor služby D-Bus</comment>
- <comment xml:lang="da">D-Bus-tjenestefil</comment>
- <comment xml:lang="de">D-Bus-Dienstdatei</comment>
- <comment xml:lang="en-GB">D-Bus service file</comment>
- <comment xml:lang="es">archivo de servicio de D-Bus</comment>
- <comment xml:lang="eu">D-Bus zerbitzu fitxategia</comment>
- <comment xml:lang="fi">D-Bus-palvelutiedosto</comment>
- <comment xml:lang="fr">fichier de service D-Bus</comment>
- <comment xml:lang="fur">file di servizi D-Bus</comment>
- <comment xml:lang="ga">comhad seirbhíse D-Bus</comment>
- <comment xml:lang="hr">Datoteka D-Bus usluge</comment>
- <comment xml:lang="hu">D-Bus szolgáltatás fájl</comment>
- <comment xml:lang="id">Berkas layanan D-Bus</comment>
- <comment xml:lang="it">File servizio D-Bus</comment>
- <comment xml:lang="kk">D-Bus қызметтік файлы</comment>
- <comment xml:lang="ko">D-Bus 서비스 파일</comment>
- <comment xml:lang="pl">Plik usługi D-Bus</comment>
- <comment xml:lang="pt-BR">Arquivo de serviço do D-Bus</comment>
- <comment xml:lang="ru">Файл службы D-Bus</comment>
- <comment xml:lang="sk">Súbor služby D-Bus</comment>
- <comment xml:lang="sr">датотека услуге Д-сабирнице</comment>
- <comment xml:lang="sv">D-BUS-tjänstfil</comment>
- <comment xml:lang="tr">D-Bus hizmeti dosyası</comment>
+ <comment xml:lang="zh_TW">D-Bus 服務檔</comment>
+ <comment xml:lang="zh_CN">D-Bus 服务文件</comment>
<comment xml:lang="uk">файл служби D-Bus</comment>
- <comment xml:lang="zh-CN">D-Bus 服务文件</comment>
- <comment xml:lang="zh-TW">D-Bus 服務檔</comment>
+ <comment xml:lang="tr">D-Bus hizmeti dosyası</comment>
+ <comment xml:lang="sv">D-BUS-tjänstfil</comment>
+ <comment xml:lang="sr">датотека услуге Д-сабирнице</comment>
+ <comment xml:lang="sq">kartelë shërbimi D-Bus</comment>
+ <comment xml:lang="si">D-බස් සේවා ගොනුව</comment>
+ <comment xml:lang="sk">Súbor služby D-Bus</comment>
+ <comment xml:lang="ru">Файл службы D-Bus</comment>
+ <comment xml:lang="pt_BR">Arquivo de serviço do D-Bus</comment>
+ <comment xml:lang="pl">Plik usługi D-Bus</comment>
+ <comment xml:lang="nl">D-Bus-servicebestand</comment>
+ <comment xml:lang="ko">D-Bus 서비스 파일</comment>
+ <comment xml:lang="kk">D-Bus қызметтік файлы</comment>
+ <comment xml:lang="ja">D-Bus サービスファイル</comment>
+ <comment xml:lang="it">File servizio D-Bus</comment>
+ <comment xml:lang="is">D-Bus þjónustuskrá</comment>
+ <comment xml:lang="id">Berkas layanan D-Bus</comment>
+ <comment xml:lang="hu">D-Bus szolgáltatás fájl</comment>
+ <comment xml:lang="hr">Datoteka D-Bus usluge</comment>
+ <comment xml:lang="he">קובץ שירות D-Bus</comment>
+ <comment xml:lang="gl">Ficheiro de servizo D-Bus</comment>
+ <comment xml:lang="ga">comhad seirbhíse D-Bus</comment>
+ <comment xml:lang="fur">file di servizi D-Bus</comment>
+ <comment xml:lang="fr">fichier de service D-Bus</comment>
+ <comment xml:lang="fi">D-Bus-palvelutiedosto</comment>
+ <comment xml:lang="eu">D-Bus zerbitzu fitxategia</comment>
+ <comment xml:lang="es">archivo de servicio de D-Bus</comment>
+ <comment xml:lang="en_GB">D-Bus service file</comment>
+ <comment xml:lang="de">D-Bus-Dienstdatei</comment>
+ <comment xml:lang="da">D-Bus-tjenestefil</comment>
+ <comment xml:lang="cs">soubor služby D-Bus</comment>
+ <comment xml:lang="ca">fitxer de servei de D-Bus</comment>
+ <comment xml:lang="bg">Услуга — D-Bus</comment>
+ <comment xml:lang="be">файл сэрвісу D-Bus</comment>
+ <comment xml:lang="ar">ملف خدمة دي-باص</comment>
+ <comment xml:lang="af">D-Bus-dienslêer</comment>
<sub-class-of type="text/plain"/>
- <magic priority="50">
+ <magic>
<match type="string" value="\n[D-BUS Service]\n" offset="0:256"/>
<match type="string" value="[D-BUS Service]\n" offset="0"/>
</magic>
<glob pattern="*.service"/>
</mime-type>
<mime-type type="text/x-systemd-unit">
- <comment>systemd unit file</comment>
- <comment xml:lang="af">systemd-eenheidlêer</comment>
- <comment xml:lang="ast">ficheru d'unidaes de systemd</comment>
- <comment xml:lang="bg">Елемент — systemd</comment>
- <comment xml:lang="ca">fitxer d'unitat de systemd</comment>
- <comment xml:lang="cs">jednotkový soubor systemd</comment>
- <comment xml:lang="da">systemd unit-fil</comment>
- <comment xml:lang="de">systemd-Einheitsdatei</comment>
- <comment xml:lang="en-GB">systemd unit file</comment>
- <comment xml:lang="es">archivo de unidad de systemd</comment>
- <comment xml:lang="eu">systemd unitate fitxategia</comment>
- <comment xml:lang="fi">systemd-yksikkötiedosto</comment>
- <comment xml:lang="fr">fichier d'unité systemd</comment>
- <comment xml:lang="fur">file unitât di systemd</comment>
- <comment xml:lang="ga">comhad aonaid systemd</comment>
- <comment xml:lang="hr">Datoteka systemd jedinice</comment>
- <comment xml:lang="hu">systemd egység fájl</comment>
- <comment xml:lang="id">berkas unit systemd</comment>
- <comment xml:lang="it">File unità systemd</comment>
- <comment xml:lang="kk">systemd юнит файлы</comment>
- <comment xml:lang="ko">systemd 유닛 파일</comment>
- <comment xml:lang="pl">Plik jednostki systemd</comment>
- <comment xml:lang="pt-BR">Arquivo de unit do systemd</comment>
- <comment xml:lang="ru">Модульный файл Systemd</comment>
- <comment xml:lang="sk">Súbor jednotky systemd</comment>
- <comment xml:lang="sr">датотека јединице системд-а</comment>
- <comment xml:lang="sv">systemd-enhetsfil</comment>
- <comment xml:lang="tr">systemd birim dosyası</comment>
+ <comment>Systemd unit file</comment>
<comment xml:lang="uk">файл модуля systemd</comment>
- <comment xml:lang="zh-CN">systemd 单元文件</comment>
- <comment xml:lang="zh-TW">systemd 單位檔</comment>
+ <comment xml:lang="sv">Systemd-enhetsfil</comment>
+ <comment xml:lang="ru">Модульный файл Systemd</comment>
+ <comment xml:lang="pl">Plik jednostki systemd</comment>
+ <comment xml:lang="ja">systemdのunitファイル</comment>
+ <comment xml:lang="it">File unità systemd</comment>
+ <comment xml:lang="gl">Ficheiro de unidade de Systemd</comment>
+ <comment xml:lang="eu">Systemd unitate-fitxategia</comment>
+ <comment xml:lang="es">archivo de unidad de Systemd</comment>
+ <comment xml:lang="de">Systemd-Einheitendatei</comment>
+ <comment xml:lang="be">файл адзінкі systemd</comment>
<sub-class-of type="text/plain"/>
- <magic priority="50">
+ <magic>
<!-- Matches part-way through the file. -->
<match type="string" value="\n[Unit]\n" offset="0:256"/>
<match type="string" value="\n[Install]\n" offset="0:256"/>
@@ -38502,7 +39562,6 @@ command to generate the output files.
<match type="string" value="\n[Swap]\n" offset="0:256"/>
<!-- Note no [Target] section exists (https://www.freedesktop.org/software/systemd/man/systemd.target.html) -->
<match type="string" value="\n[Timer]\n" offset="0:256"/>
-
<!-- Matches at the start of the file. -->
<match type="string" value="[Unit]\n" offset="0"/>
<match type="string" value="[Install]\n" offset="0"/>
@@ -38530,60 +39589,63 @@ command to generate the output files.
</mime-type>
<mime-type type="application/xslt+xml">
<comment>XSLT stylesheet</comment>
- <comment xml:lang="af">XSLT-stylblad</comment>
- <comment xml:lang="ar">نمط XSLT</comment>
- <comment xml:lang="be-Latn">Arkuš stylaŭ XSLT</comment>
- <comment xml:lang="bg">Стилове — XSLT</comment>
- <comment xml:lang="ca">full d'estil XSLT</comment>
- <comment xml:lang="cs">stylopis XSLT</comment>
- <comment xml:lang="da">XSLT-stilark</comment>
- <comment xml:lang="de">XSLT-Stylesheet</comment>
- <comment xml:lang="el">Φύλλο στυλ XSLT</comment>
- <comment xml:lang="en-GB">XSLT stylesheet</comment>
- <comment xml:lang="eo">XSLT-stilfolio</comment>
- <comment xml:lang="es">hoja de estilos XSLT</comment>
- <comment xml:lang="eu">XSLT estilo-orria</comment>
- <comment xml:lang="fi">XSLT-tyylitiedosto</comment>
- <comment xml:lang="fo">XSLT sniðark</comment>
- <comment xml:lang="fr">feuille de style XSLT</comment>
- <comment xml:lang="fur">sfuei di calcul XSLT</comment>
- <comment xml:lang="ga">stílbhileog XSLT</comment>
- <comment xml:lang="gl">folla de estilo XSLT</comment>
- <comment xml:lang="he">גליון סגנון XSLT</comment>
- <comment xml:lang="hr">XSLT stilska tablica</comment>
- <comment xml:lang="hu">XSLT-stíluslap</comment>
- <comment xml:lang="ia">Folio de stilo XSLT</comment>
- <comment xml:lang="id">Lembar gaya XSLT</comment>
- <comment xml:lang="it">Foglio di stile XSLT</comment>
- <comment xml:lang="ja">XSLT スタイルシート</comment>
- <comment xml:lang="kk">XSLT стильдер кестесі</comment>
- <comment xml:lang="ko">XSLT 스타일시트</comment>
- <comment xml:lang="lt">XSLT stiliaus aprašas</comment>
- <comment xml:lang="lv">XSLT izklājlapa</comment>
- <comment xml:lang="ms">Helaian Gaya XSLT</comment>
- <comment xml:lang="nb">XSLT-stilark</comment>
- <comment xml:lang="nl">XSLT-stijlblad</comment>
- <comment xml:lang="nn">XSLT-stilark</comment>
- <comment xml:lang="oc">fuèlh d'estil XSLT</comment>
- <comment xml:lang="pl">Arkusz stylów XSLT</comment>
- <comment xml:lang="pt">folha de estilos XSLT</comment>
- <comment xml:lang="pt-BR">Folha de estilo XSLT</comment>
- <comment xml:lang="ro">Fișă de stil XSLT</comment>
- <comment xml:lang="ru">Таблица стилей XSLT</comment>
- <comment xml:lang="sk">Štýl XSLT</comment>
- <comment xml:lang="sl">Slogovna predloga XSLT</comment>
- <comment xml:lang="sq">Fletë stili XSLT</comment>
- <comment xml:lang="sr">ИксСЛТ стилски лист</comment>
- <comment xml:lang="sv">XSLT-stilmall</comment>
- <comment xml:lang="tr">XSLT çalışma sayfası</comment>
- <comment xml:lang="uk">таблиця стилів XSLT</comment>
+ <comment xml:lang="zh_TW">XSLT 樣式表</comment>
+ <comment xml:lang="zh_CN">XSLT 样式表</comment>
<comment xml:lang="vi">Tờ kiểu dáng XSLT</comment>
- <comment xml:lang="zh-CN">XSLT 样式表</comment>
- <comment xml:lang="zh-TW">XSLT 樣式表</comment>
+ <comment xml:lang="uk">таблиця стилів XSLT</comment>
+ <comment xml:lang="tr">XSLT çalışma sayfası</comment>
+ <comment xml:lang="sv">XSLT-stilmall</comment>
+ <comment xml:lang="sr">ИксСЛТ стилски лист</comment>
+ <comment xml:lang="sq">fletëstil XSLT</comment>
+ <comment xml:lang="sl">Slogovna predloga XSLT</comment>
+ <comment xml:lang="si">XSLT මෝස්තර පත්‍රිකාව</comment>
+ <comment xml:lang="sk">Štýl XSLT</comment>
+ <comment xml:lang="ru">Таблица стилей XSLT</comment>
+ <comment xml:lang="ro">Fișă de stil XSLT</comment>
+ <comment xml:lang="pt_BR">Folha de estilo XSLT</comment>
+ <comment xml:lang="pt">folha de estilos XSLT</comment>
+ <comment xml:lang="pl">Arkusz stylów XSLT</comment>
+ <comment xml:lang="oc">fuèlh d'estil XSLT</comment>
+ <comment xml:lang="nn">XSLT-stilark</comment>
+ <comment xml:lang="nl">XSLT-stijlblad</comment>
+ <comment xml:lang="nb">XSLT-stilark</comment>
+ <comment xml:lang="ms">Helaian Gaya XSLT</comment>
+ <comment xml:lang="lv">XSLT izklājlapa</comment>
+ <comment xml:lang="lt">XSLT stiliaus aprašas</comment>
+ <comment xml:lang="ko">XSLT 스타일시트</comment>
+ <comment xml:lang="kk">XSLT стильдер кестесі</comment>
+ <comment xml:lang="ja">XSLT スタイルシート</comment>
+ <comment xml:lang="it">Foglio di stile XSLT</comment>
+ <comment xml:lang="is">XSLT stílblað</comment>
+ <comment xml:lang="id">Lembar gaya XSLT</comment>
+ <comment xml:lang="ia">Folio de stilo XSLT</comment>
+ <comment xml:lang="hu">XSLT-stíluslap</comment>
+ <comment xml:lang="hr">XSLT stilska tablica</comment>
+ <comment xml:lang="he">גיליון סגנון XSLT</comment>
+ <comment xml:lang="gl">folla de estilo XSLT</comment>
+ <comment xml:lang="ga">stílbhileog XSLT</comment>
+ <comment xml:lang="fur">sfuei di calcul XSLT</comment>
+ <comment xml:lang="fr">feuille de style XSLT</comment>
+ <comment xml:lang="fo">XSLT sniðark</comment>
+ <comment xml:lang="fi">XSLT-tyylitiedosto</comment>
+ <comment xml:lang="eu">XSLT estilo-orria</comment>
+ <comment xml:lang="es">hoja de estilos XSLT</comment>
+ <comment xml:lang="eo">XSLT-stilfolio</comment>
+ <comment xml:lang="en_GB">XSLT stylesheet</comment>
+ <comment xml:lang="el">Φύλλο στυλ XSLT</comment>
+ <comment xml:lang="de">XSLT-Stilvorlage</comment>
+ <comment xml:lang="da">XSLT-stilark</comment>
+ <comment xml:lang="cs">stylopis XSLT</comment>
+ <comment xml:lang="ca">full d'estil XSLT</comment>
+ <comment xml:lang="bg">Стилове — XSLT</comment>
+ <comment xml:lang="be@latin">Arkuš stylaŭ XSLT</comment>
+ <comment xml:lang="be">табліца стыляў XSLT</comment>
+ <comment xml:lang="ar">نمط XSLT</comment>
+ <comment xml:lang="af">XSLT-stylblad</comment>
<acronym>XSLT</acronym>
<expanded-acronym>eXtensible Stylesheet Language Transformation</expanded-acronym>
<generic-icon name="text-x-generic"/>
- <magic priority="50">
+ <magic>
<match type="string" value="&lt;xsl:stylesheet" offset="0:256"/>
</magic>
<glob pattern="*.xsl"/>
@@ -38593,34 +39655,44 @@ command to generate the output files.
</mime-type>
<mime-type type="text/x-maven+xml">
<comment>Maven description file</comment>
- <comment xml:lang="af">Maven-beskrywingslêer</comment>
- <comment xml:lang="bg">Модел — Maven</comment>
- <comment xml:lang="ca">fitxer de descripció Maven</comment>
- <comment xml:lang="cs">popisný soubor Maven</comment>
- <comment xml:lang="da">Maven-beskrivelsesfil</comment>
- <comment xml:lang="de">Maven-Beschreibungsdatei</comment>
- <comment xml:lang="en-GB">Maven description file</comment>
- <comment xml:lang="es">archivo de descripción de Maven</comment>
- <comment xml:lang="eu">Maven azalpen fitxategia</comment>
- <comment xml:lang="fi">Maven-kuvaustiedosto</comment>
- <comment xml:lang="fr">fichier de description Maven</comment>
- <comment xml:lang="fur">file di descrizion Maven</comment>
- <comment xml:lang="ga">cur síos Maven</comment>
- <comment xml:lang="hr">Maven datoteka opisa</comment>
- <comment xml:lang="hu">Maven leírófájl</comment>
- <comment xml:lang="id">Berkas deskripsi Maven</comment>
- <comment xml:lang="it">File descrizione Mave</comment>
- <comment xml:lang="kk">Maven сипаттама файлы</comment>
- <comment xml:lang="ko">Maven 설명 파일</comment>
- <comment xml:lang="pl">Plik opisu Maven</comment>
- <comment xml:lang="pt-BR">Arquivo de descrição Maven</comment>
- <comment xml:lang="ru">Файл описания Maven</comment>
- <comment xml:lang="sk">Súbor popisu Maven</comment>
- <comment xml:lang="sv">Maven-beskrivningsfil</comment>
- <comment xml:lang="tr">Maven açıklama dosyası</comment>
+ <comment xml:lang="zh_TW">Maven 描述檔</comment>
+ <comment xml:lang="zh_CN">Maven 描述文件</comment>
<comment xml:lang="uk">файл опису Maven</comment>
- <comment xml:lang="zh-CN">Maven 描述文件</comment>
- <comment xml:lang="zh-TW">Maven 描述檔</comment>
+ <comment xml:lang="tr">Maven açıklama dosyası</comment>
+ <comment xml:lang="sv">Maven-beskrivningsfil</comment>
+ <comment xml:lang="sq">kartelë përshkrimi Maven</comment>
+ <comment xml:lang="sl">Opisna datoteka Maven</comment>
+ <comment xml:lang="si">Maven විස්තර ගොනුව</comment>
+ <comment xml:lang="sk">Súbor popisu Maven</comment>
+ <comment xml:lang="ru">Файл описания Maven</comment>
+ <comment xml:lang="pt_BR">Arquivo de descrição Maven</comment>
+ <comment xml:lang="pl">Plik opisu Maven</comment>
+ <comment xml:lang="nl">Maven-omschrijvingsbestand</comment>
+ <comment xml:lang="ko">Maven 설명 파일</comment>
+ <comment xml:lang="kk">Maven сипаттама файлы</comment>
+ <comment xml:lang="ja">Maven 説明ファイル</comment>
+ <comment xml:lang="it">File descrizione Mave</comment>
+ <comment xml:lang="is">Maven lýsingarskrá</comment>
+ <comment xml:lang="id">Berkas deskripsi Maven</comment>
+ <comment xml:lang="hu">Maven leírófájl</comment>
+ <comment xml:lang="hr">Maven datoteka opisa</comment>
+ <comment xml:lang="he">קובץ תיאור Maven</comment>
+ <comment xml:lang="gl">Ficheiro de descrición de Maven</comment>
+ <comment xml:lang="ga">cur síos Maven</comment>
+ <comment xml:lang="fur">file di descrizion Maven</comment>
+ <comment xml:lang="fr">fichier de description Maven</comment>
+ <comment xml:lang="fi">Maven-kuvaustiedosto</comment>
+ <comment xml:lang="eu">Maven azalpen fitxategia</comment>
+ <comment xml:lang="es">archivo de descripción de Maven</comment>
+ <comment xml:lang="en_GB">Maven description file</comment>
+ <comment xml:lang="de">Maven-Beschreibungsdatei</comment>
+ <comment xml:lang="da">Maven-beskrivelsesfil</comment>
+ <comment xml:lang="cs">popisný soubor Maven</comment>
+ <comment xml:lang="ca">fitxer de descripció Maven</comment>
+ <comment xml:lang="bg">Модел — Maven</comment>
+ <comment xml:lang="be">файл апісання Maven</comment>
+ <comment xml:lang="ar">ملف وصف Maven</comment>
+ <comment xml:lang="af">Maven-beskrywingslêer</comment>
<generic-icon name="text-x-generic"/>
<glob pattern="pom.xml"/>
<glob pattern="settings.xml"/>
@@ -38628,111 +39700,117 @@ command to generate the output files.
</mime-type>
<mime-type type="text/xmcd">
<comment>XMCD CD database</comment>
- <comment xml:lang="af">XMCD CD-databasis</comment>
- <comment xml:lang="ar">قاعدة بيانات XMCD CD</comment>
- <comment xml:lang="be-Latn">Baza źviestak ab dyskach XMCD</comment>
- <comment xml:lang="bg">База от данни за CD-та — XMCD</comment>
- <comment xml:lang="ca">base de dades de CD XMCD</comment>
- <comment xml:lang="cs">databáze XMCD CD</comment>
- <comment xml:lang="da">XMCD-cd-database</comment>
- <comment xml:lang="de">XMCD-CD-Datenbank</comment>
- <comment xml:lang="el">Βάση δεδομένων CD XMCD</comment>
- <comment xml:lang="en-GB">XMCD CD database</comment>
- <comment xml:lang="es">base de datos de CD XMCD</comment>
- <comment xml:lang="eu">XMCD CD datu-basea</comment>
- <comment xml:lang="fi">XMCD CD -tietokanta</comment>
- <comment xml:lang="fo">XMCD fløgu dátustovnur</comment>
- <comment xml:lang="fr">base de données de CD XMCD</comment>
- <comment xml:lang="fur">base di dâts XMCD CD</comment>
- <comment xml:lang="ga">bunachar sonraí XMCD CD</comment>
- <comment xml:lang="gl">base de datos de CD XMCD</comment>
- <comment xml:lang="he">מסד נתונים XMCD CD</comment>
- <comment xml:lang="hr">XMCD CD baza podataka</comment>
- <comment xml:lang="hu">XMCD CD-adatbázis</comment>
- <comment xml:lang="ia">Base de datos de CD XMCD</comment>
- <comment xml:lang="id">Basis data XMCD CD</comment>
- <comment xml:lang="it">Database XMCD CD</comment>
- <comment xml:lang="ja">XMCD CD データベース</comment>
- <comment xml:lang="kk">XMCD CD дерекқоры</comment>
- <comment xml:lang="ko">XMCD CD 데이터베이스</comment>
- <comment xml:lang="lt">XMCD CD duomenų bazė</comment>
- <comment xml:lang="lv">XMCD CD datubāze</comment>
- <comment xml:lang="nb">XMCD CD-database</comment>
- <comment xml:lang="nl">XMCD CD-gegevensbank</comment>
- <comment xml:lang="nn">XMCD CD-database</comment>
- <comment xml:lang="oc">banca de donadas de CD XMCD</comment>
- <comment xml:lang="pl">Baza danych CD XMCD</comment>
- <comment xml:lang="pt">base de dados XMCD CD</comment>
- <comment xml:lang="pt-BR">Banco de dados de CD XMCD</comment>
- <comment xml:lang="ro">Bază de date XMCD CD</comment>
- <comment xml:lang="ru">База данных компакт-дисков XMCD</comment>
- <comment xml:lang="sk">Databáza XMCD CD</comment>
- <comment xml:lang="sl">Podatkovna zbirka XMCD CD</comment>
- <comment xml:lang="sq">Bazë me të dhëna XMCD CD</comment>
- <comment xml:lang="sr">ИксМЦД ЦД база података</comment>
- <comment xml:lang="sv">XMCD cd-databas</comment>
- <comment xml:lang="tr">XMCD CD veri tabanı</comment>
- <comment xml:lang="uk">база даних XMCD CD</comment>
+ <comment xml:lang="zh_TW">XMCD CD 資料庫</comment>
+ <comment xml:lang="zh_CN">XMCD CD 数据库</comment>
<comment xml:lang="vi">Cơ sở dữ liệu CD XMCD</comment>
- <comment xml:lang="zh-CN">XMCD CD 数据库</comment>
- <comment xml:lang="zh-TW">XMCD CD 資料庫</comment>
+ <comment xml:lang="uk">база даних XMCD CD</comment>
+ <comment xml:lang="tr">XMCD CD veri tabanı</comment>
+ <comment xml:lang="sv">XMCD cd-databas</comment>
+ <comment xml:lang="sr">ИксМЦД ЦД база података</comment>
+ <comment xml:lang="sq">bazë të dhënash XMCD CD</comment>
+ <comment xml:lang="sl">Podatkovna zbirka XMCD CD</comment>
+ <comment xml:lang="si">XMCD CD දත්ත ගබඩාව</comment>
+ <comment xml:lang="sk">Databáza XMCD CD</comment>
+ <comment xml:lang="ru">База данных компакт-дисков XMCD</comment>
+ <comment xml:lang="ro">Bază de date XMCD CD</comment>
+ <comment xml:lang="pt_BR">Banco de dados de CD XMCD</comment>
+ <comment xml:lang="pt">base de dados XMCD CD</comment>
+ <comment xml:lang="pl">Baza danych CD XMCD</comment>
+ <comment xml:lang="oc">banca de donadas de CD XMCD</comment>
+ <comment xml:lang="nn">XMCD CD-database</comment>
+ <comment xml:lang="nl">XMCD CD-gegevensbank</comment>
+ <comment xml:lang="nb">XMCD CD-database</comment>
+ <comment xml:lang="lv">XMCD CD datubāze</comment>
+ <comment xml:lang="lt">XMCD CD duomenų bazė</comment>
+ <comment xml:lang="ko">XMCD CD 데이터베이스</comment>
+ <comment xml:lang="kk">XMCD CD дерекқоры</comment>
+ <comment xml:lang="ja">XMCD CD データベース</comment>
+ <comment xml:lang="it">Database XMCD CD</comment>
+ <comment xml:lang="is">XMCD CD gagnagrunnur</comment>
+ <comment xml:lang="id">Basis data XMCD CD</comment>
+ <comment xml:lang="ia">Base de datos de CD XMCD</comment>
+ <comment xml:lang="hu">XMCD CD-adatbázis</comment>
+ <comment xml:lang="hr">XMCD CD baza podataka</comment>
+ <comment xml:lang="he">מסד נתונים XMCD CD</comment>
+ <comment xml:lang="gl">base de datos de CD XMCD</comment>
+ <comment xml:lang="ga">bunachar sonraí XMCD CD</comment>
+ <comment xml:lang="fur">base di dâts XMCD CD</comment>
+ <comment xml:lang="fr">base de données de CD XMCD</comment>
+ <comment xml:lang="fo">XMCD fløgu dátustovnur</comment>
+ <comment xml:lang="fi">XMCD CD -tietokanta</comment>
+ <comment xml:lang="eu">XMCD CD datu-basea</comment>
+ <comment xml:lang="es">base de datos de CD XMCD</comment>
+ <comment xml:lang="en_GB">XMCD CD database</comment>
+ <comment xml:lang="el">Βάση δεδομένων CD XMCD</comment>
+ <comment xml:lang="de">XMCD-CD-Datenbank</comment>
+ <comment xml:lang="da">XMCD-cd-database</comment>
+ <comment xml:lang="cs">databáze XMCD CD</comment>
+ <comment xml:lang="ca">base de dades de CD XMCD</comment>
+ <comment xml:lang="bg">База от данни за CD-та — XMCD</comment>
+ <comment xml:lang="be@latin">Baza źviestak ab dyskach XMCD</comment>
+ <comment xml:lang="be">база даных кампакт-дыскаў XMCD</comment>
+ <comment xml:lang="ar">قاعدة بيانات XMCD CD</comment>
+ <comment xml:lang="af">XMCD CD-databasis</comment>
<sub-class-of type="text/plain"/>
- <magic priority="50">
+ <magic>
<match type="string" value="# xmcd" offset="0"/>
</magic>
</mime-type>
<mime-type type="application/xml">
<comment>XML document</comment>
- <comment xml:lang="af">XML-dokument</comment>
- <comment xml:lang="ar">مستند XML</comment>
- <comment xml:lang="ast">Documentu XML</comment>
- <comment xml:lang="be-Latn">Dakument XML</comment>
- <comment xml:lang="bg">Документ — XML</comment>
- <comment xml:lang="ca">document XML</comment>
- <comment xml:lang="cs">dokument XML</comment>
- <comment xml:lang="da">XML-dokument</comment>
- <comment xml:lang="de">XML-Dokument</comment>
- <comment xml:lang="el">Έγγραφο XML</comment>
- <comment xml:lang="en-GB">XML document</comment>
- <comment xml:lang="eo">XML-dokumento</comment>
- <comment xml:lang="es">documento XML</comment>
- <comment xml:lang="eu">XML dokumentua</comment>
- <comment xml:lang="fi">XML-asiakirja</comment>
- <comment xml:lang="fo">XML skjal</comment>
- <comment xml:lang="fr">document XML</comment>
- <comment xml:lang="fur">document XML</comment>
- <comment xml:lang="ga">cáipéis XML</comment>
- <comment xml:lang="gl">documento XML</comment>
- <comment xml:lang="he">מסמך XML</comment>
- <comment xml:lang="hr">XML dokument</comment>
- <comment xml:lang="hu">XML dokumentum</comment>
- <comment xml:lang="ia">Documento XML</comment>
- <comment xml:lang="id">Dokumen XML</comment>
- <comment xml:lang="it">Documento XML</comment>
- <comment xml:lang="ja">XML ドキュメント</comment>
- <comment xml:lang="kk">XML құжаты</comment>
- <comment xml:lang="ko">XML 문서</comment>
- <comment xml:lang="lt">XML dokumentas</comment>
- <comment xml:lang="lv">XML dokuments</comment>
- <comment xml:lang="nb">XML-dokument</comment>
- <comment xml:lang="nl">XML-document</comment>
- <comment xml:lang="nn">XML-dokument</comment>
- <comment xml:lang="oc">document XML</comment>
- <comment xml:lang="pl">Dokument XML</comment>
- <comment xml:lang="pt">documento XML</comment>
- <comment xml:lang="pt-BR">Documento XML</comment>
- <comment xml:lang="ro">Document XML</comment>
- <comment xml:lang="ru">Документ XML</comment>
- <comment xml:lang="sk">Dokument XML</comment>
- <comment xml:lang="sl">Dokument XML</comment>
- <comment xml:lang="sq">Dokument XML</comment>
- <comment xml:lang="sr">ИксМЛ документ</comment>
- <comment xml:lang="sv">XML-dokument</comment>
- <comment xml:lang="tr">XML belgesi</comment>
- <comment xml:lang="uk">документ XML</comment>
+ <comment xml:lang="zh_TW">XML 文件</comment>
+ <comment xml:lang="zh_CN">XML 文档</comment>
<comment xml:lang="vi">Tài liệu XML</comment>
- <comment xml:lang="zh-CN">XML 文档</comment>
- <comment xml:lang="zh-TW">XML 文件</comment>
+ <comment xml:lang="uk">документ XML</comment>
+ <comment xml:lang="tr">XML belgesi</comment>
+ <comment xml:lang="sv">XML-dokument</comment>
+ <comment xml:lang="sr">ИксМЛ документ</comment>
+ <comment xml:lang="sq">dokument XML</comment>
+ <comment xml:lang="sl">Dokument XML</comment>
+ <comment xml:lang="si">XML ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument XML</comment>
+ <comment xml:lang="ru">Документ XML</comment>
+ <comment xml:lang="ro">Document XML</comment>
+ <comment xml:lang="pt_BR">Documento XML</comment>
+ <comment xml:lang="pt">documento XML</comment>
+ <comment xml:lang="pl">Dokument XML</comment>
+ <comment xml:lang="oc">document XML</comment>
+ <comment xml:lang="nn">XML-dokument</comment>
+ <comment xml:lang="nl">XML-document</comment>
+ <comment xml:lang="nb">XML-dokument</comment>
+ <comment xml:lang="lv">XML dokuments</comment>
+ <comment xml:lang="lt">XML dokumentas</comment>
+ <comment xml:lang="ko">XML 문서</comment>
+ <comment xml:lang="kk">XML құжаты</comment>
+ <comment xml:lang="ja">XML ドキュメント</comment>
+ <comment xml:lang="it">Documento XML</comment>
+ <comment xml:lang="is">XML skjal</comment>
+ <comment xml:lang="id">Dokumen XML</comment>
+ <comment xml:lang="ia">Documento XML</comment>
+ <comment xml:lang="hu">XML dokumentum</comment>
+ <comment xml:lang="hr">XML dokument</comment>
+ <comment xml:lang="he">מסמך XML</comment>
+ <comment xml:lang="gl">documento XML</comment>
+ <comment xml:lang="ga">cáipéis XML</comment>
+ <comment xml:lang="fur">document XML</comment>
+ <comment xml:lang="fr">document XML</comment>
+ <comment xml:lang="fo">XML skjal</comment>
+ <comment xml:lang="fi">XML-asiakirja</comment>
+ <comment xml:lang="eu">XML dokumentua</comment>
+ <comment xml:lang="es">documento XML</comment>
+ <comment xml:lang="eo">XML-dokumento</comment>
+ <comment xml:lang="en_GB">XML document</comment>
+ <comment xml:lang="el">Έγγραφο XML</comment>
+ <comment xml:lang="de">XML-Dokument</comment>
+ <comment xml:lang="da">XML-dokument</comment>
+ <comment xml:lang="cs">dokument XML</comment>
+ <comment xml:lang="ca">document XML</comment>
+ <comment xml:lang="bg">Документ — XML</comment>
+ <comment xml:lang="be@latin">Dakument XML</comment>
+ <comment xml:lang="be">дакумент XML</comment>
+ <comment xml:lang="ast">Documentu XML</comment>
+ <comment xml:lang="ar">مستند XML</comment>
+ <comment xml:lang="af">XML-dokument</comment>
<acronym>XML</acronym>
<expanded-acronym>eXtensible Markup Language</expanded-acronym>
<sub-class-of type="text/plain"/>
@@ -38748,55 +39826,58 @@ command to generate the output files.
</mime-type>
<mime-type type="application/xml-external-parsed-entity">
<comment>XML entities document</comment>
- <comment xml:lang="af">XML-entiteitedokument</comment>
- <comment xml:lang="ar">مستند كيانات XML</comment>
- <comment xml:lang="ast">Documentu d'entidaes XML</comment>
- <comment xml:lang="be-Latn">Dakument elementaŭ XML</comment>
- <comment xml:lang="bg">Документ — заместващи последователности в XML</comment>
- <comment xml:lang="ca">document d'entitats XML</comment>
- <comment xml:lang="cs">dokument entit XML</comment>
- <comment xml:lang="da">XML-enhedsdokument</comment>
- <comment xml:lang="de">XML-Dokument-Entitäten</comment>
- <comment xml:lang="el">Έγγραφο οντοτήτων XML</comment>
- <comment xml:lang="en-GB">XML entities document</comment>
- <comment xml:lang="es">documento de entidades XML</comment>
- <comment xml:lang="eu">XML entitateen dokumentua</comment>
- <comment xml:lang="fi">XML-entiteettiasiakirja</comment>
- <comment xml:lang="fo">XML einindisskjal</comment>
- <comment xml:lang="fr">document d'entités XML</comment>
- <comment xml:lang="fur">document entitâts XML</comment>
- <comment xml:lang="ga">cáipéis aonán XML</comment>
- <comment xml:lang="gl">documento de entidades XML</comment>
- <comment xml:lang="he">מסמך ישויות XML</comment>
- <comment xml:lang="hr">Dokument XML subjekata</comment>
- <comment xml:lang="hu">XML egyeddokumentum</comment>
- <comment xml:lang="ia">Documento de entitates XML</comment>
- <comment xml:lang="id">Dokumen entitas XML</comment>
- <comment xml:lang="it">Documento entità XML</comment>
- <comment xml:lang="ja">XML エントリドキュメント</comment>
- <comment xml:lang="kk">XML мәндер құжаты</comment>
- <comment xml:lang="ko">XML 엔티티 문서</comment>
- <comment xml:lang="lt">XML esybių dokumentas</comment>
- <comment xml:lang="lv">XML vienību dokuments</comment>
- <comment xml:lang="nb">XML-entitetsdokument</comment>
- <comment xml:lang="nl">XML entiteiten-document</comment>
- <comment xml:lang="nn">XML-entitet-dokument</comment>
- <comment xml:lang="oc">document d'entitats XML</comment>
- <comment xml:lang="pl">Dokument jednostek XML</comment>
- <comment xml:lang="pt">documento de entidades XML</comment>
- <comment xml:lang="pt-BR">Documento de entidades XML</comment>
- <comment xml:lang="ro">Document entități XML</comment>
- <comment xml:lang="ru">Файл сущностей XML</comment>
- <comment xml:lang="sk">Dokument entít XML</comment>
- <comment xml:lang="sl">Dokument XML določil</comment>
- <comment xml:lang="sq">Dokument njësish XML</comment>
- <comment xml:lang="sr">документ ИксМЛ ставки</comment>
- <comment xml:lang="sv">XML-entitetsdokument</comment>
- <comment xml:lang="tr">XML varlıklar belgesi</comment>
- <comment xml:lang="uk">документ об’єктів XML</comment>
+ <comment xml:lang="zh_TW">XML 實體文件</comment>
+ <comment xml:lang="zh_CN">XML 特征文档</comment>
<comment xml:lang="vi">Tài liệu thực thể XML</comment>
- <comment xml:lang="zh-CN">XML 特征文档</comment>
- <comment xml:lang="zh-TW">XML 實體文件</comment>
+ <comment xml:lang="uk">документ об’єктів XML</comment>
+ <comment xml:lang="tr">XML varlıklar belgesi</comment>
+ <comment xml:lang="sv">XML-entitetsdokument</comment>
+ <comment xml:lang="sr">документ ИксМЛ ставки</comment>
+ <comment xml:lang="sq">dokument njësish XML</comment>
+ <comment xml:lang="sl">Dokument XML določil</comment>
+ <comment xml:lang="si">XML ආයතන ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument entít XML</comment>
+ <comment xml:lang="ru">Файл сущностей XML</comment>
+ <comment xml:lang="ro">Document entități XML</comment>
+ <comment xml:lang="pt_BR">Documento de entidades XML</comment>
+ <comment xml:lang="pt">documento de entidades XML</comment>
+ <comment xml:lang="pl">Dokument jednostek XML</comment>
+ <comment xml:lang="oc">document d'entitats XML</comment>
+ <comment xml:lang="nn">XML-entitet-dokument</comment>
+ <comment xml:lang="nl">XML entiteiten-document</comment>
+ <comment xml:lang="nb">XML-entitetsdokument</comment>
+ <comment xml:lang="lv">XML vienību dokuments</comment>
+ <comment xml:lang="lt">XML esybių dokumentas</comment>
+ <comment xml:lang="ko">XML 엔티티 문서</comment>
+ <comment xml:lang="kk">XML мәндер құжаты</comment>
+ <comment xml:lang="ja">XML エントリドキュメント</comment>
+ <comment xml:lang="it">Documento entità XML</comment>
+ <comment xml:lang="is">XML-eininda skjal</comment>
+ <comment xml:lang="id">Dokumen entitas XML</comment>
+ <comment xml:lang="ia">Documento de entitates XML</comment>
+ <comment xml:lang="hu">XML egyeddokumentum</comment>
+ <comment xml:lang="hr">Dokument XML subjekata</comment>
+ <comment xml:lang="he">מסמך ישויות XML</comment>
+ <comment xml:lang="gl">documento de entidades XML</comment>
+ <comment xml:lang="ga">cáipéis aonán XML</comment>
+ <comment xml:lang="fur">document entitâts XML</comment>
+ <comment xml:lang="fr">document d'entités XML</comment>
+ <comment xml:lang="fo">XML einindisskjal</comment>
+ <comment xml:lang="fi">XML-entiteettiasiakirja</comment>
+ <comment xml:lang="eu">XML entitateen dokumentua</comment>
+ <comment xml:lang="es">documento de entidades XML</comment>
+ <comment xml:lang="en_GB">XML entities document</comment>
+ <comment xml:lang="el">Έγγραφο οντοτήτων XML</comment>
+ <comment xml:lang="de">XML-Entitätendokument</comment>
+ <comment xml:lang="da">XML-enhedsdokument</comment>
+ <comment xml:lang="cs">dokument entit XML</comment>
+ <comment xml:lang="ca">document d'entitats XML</comment>
+ <comment xml:lang="bg">Документ — заместващи последователности в XML</comment>
+ <comment xml:lang="be@latin">Dakument elementaŭ XML</comment>
+ <comment xml:lang="be">дакумент сутнасцей XML</comment>
+ <comment xml:lang="ast">Documentu d'entidaes XML</comment>
+ <comment xml:lang="ar">مستند كيانات XML</comment>
+ <comment xml:lang="af">XML-entiteitedokument</comment>
<acronym>XML</acronym>
<expanded-acronym>eXtensible Markup Language</expanded-acronym>
<sub-class-of type="application/xml"/>
@@ -38806,169 +39887,178 @@ command to generate the output files.
</mime-type>
<mime-type type="video/dv">
<comment>DV video</comment>
- <comment xml:lang="af">DV-video</comment>
- <comment xml:lang="ar">DV مرئي</comment>
- <comment xml:lang="ast">Videu en DV</comment>
- <comment xml:lang="be-Latn">Videa DV</comment>
- <comment xml:lang="bg">Видео — DV</comment>
- <comment xml:lang="ca">vídeo DV</comment>
- <comment xml:lang="cs">video DV</comment>
- <comment xml:lang="da">DV-video</comment>
- <comment xml:lang="de">DV-Video</comment>
- <comment xml:lang="el">Βίντεο DV</comment>
- <comment xml:lang="en-GB">DV video</comment>
- <comment xml:lang="eo">DV-video</comment>
- <comment xml:lang="es">vídeo DV</comment>
- <comment xml:lang="eu">DV bideoa</comment>
- <comment xml:lang="fi">DV-video</comment>
- <comment xml:lang="fo">DV video</comment>
- <comment xml:lang="fr">vidéo DV</comment>
- <comment xml:lang="fur">video DV</comment>
- <comment xml:lang="ga">físeán DV</comment>
- <comment xml:lang="gl">vídeo DV</comment>
- <comment xml:lang="he">וידאו DV</comment>
- <comment xml:lang="hr">DV video snimka</comment>
- <comment xml:lang="hu">DV videó</comment>
- <comment xml:lang="ia">Video DV</comment>
- <comment xml:lang="id">Video DV</comment>
- <comment xml:lang="it">Video DV</comment>
- <comment xml:lang="ja">DV 動画</comment>
- <comment xml:lang="ka">DV ვიდეო</comment>
- <comment xml:lang="kk">DV видеосы</comment>
- <comment xml:lang="ko">DV 동영상</comment>
- <comment xml:lang="lt">DV vaizdo įrašas</comment>
- <comment xml:lang="lv">DV video</comment>
- <comment xml:lang="nb">DV-film</comment>
- <comment xml:lang="nl">DV-video</comment>
- <comment xml:lang="nn">DV-video</comment>
- <comment xml:lang="oc">vidèo DV</comment>
- <comment xml:lang="pl">Plik wideo DV</comment>
- <comment xml:lang="pt">vídeo DV</comment>
- <comment xml:lang="pt-BR">Vídeo DV</comment>
- <comment xml:lang="ro">Video DV</comment>
- <comment xml:lang="ru">Видео DV</comment>
- <comment xml:lang="sk">Video DV</comment>
- <comment xml:lang="sl">Video datoteka DV</comment>
- <comment xml:lang="sq">Video DV</comment>
- <comment xml:lang="sr">ДВ видео</comment>
- <comment xml:lang="sv">DV-video</comment>
- <comment xml:lang="tr">DV video</comment>
- <comment xml:lang="uk">відеокліп DV</comment>
+ <comment xml:lang="zh_TW">DV 視訊</comment>
+ <comment xml:lang="zh_CN">DV 视频</comment>
<comment xml:lang="vi">Ảnh động DV</comment>
- <comment xml:lang="zh-CN">DV 视频</comment>
- <comment xml:lang="zh-TW">DV 視訊</comment>
+ <comment xml:lang="uk">відеокліп DV</comment>
+ <comment xml:lang="tr">DV video</comment>
+ <comment xml:lang="sv">DV-video</comment>
+ <comment xml:lang="sr">ДВ видео</comment>
+ <comment xml:lang="sq">video DV</comment>
+ <comment xml:lang="sl">Video datoteka DV</comment>
+ <comment xml:lang="si">DV වීඩියෝ</comment>
+ <comment xml:lang="sk">Video DV</comment>
+ <comment xml:lang="ru">Видео DV</comment>
+ <comment xml:lang="ro">Video DV</comment>
+ <comment xml:lang="pt_BR">Vídeo DV</comment>
+ <comment xml:lang="pt">vídeo DV</comment>
+ <comment xml:lang="pl">Plik wideo DV</comment>
+ <comment xml:lang="oc">vidèo DV</comment>
+ <comment xml:lang="nn">DV-video</comment>
+ <comment xml:lang="nl">DV-video</comment>
+ <comment xml:lang="nb">DV-film</comment>
+ <comment xml:lang="lv">DV video</comment>
+ <comment xml:lang="lt">DV vaizdo įrašas</comment>
+ <comment xml:lang="ko">DV 동영상</comment>
+ <comment xml:lang="kk">DV видеосы</comment>
+ <comment xml:lang="ka">DV ვიდეო</comment>
+ <comment xml:lang="ja">DV 動画</comment>
+ <comment xml:lang="it">Video DV</comment>
+ <comment xml:lang="is">DV myndskeið</comment>
+ <comment xml:lang="id">Video DV</comment>
+ <comment xml:lang="ia">Video DV</comment>
+ <comment xml:lang="hu">DV videó</comment>
+ <comment xml:lang="hr">DV video snimka</comment>
+ <comment xml:lang="he">וידאו DV</comment>
+ <comment xml:lang="gl">vídeo DV</comment>
+ <comment xml:lang="ga">físeán DV</comment>
+ <comment xml:lang="fur">video DV</comment>
+ <comment xml:lang="fr">vidéo DV</comment>
+ <comment xml:lang="fo">DV video</comment>
+ <comment xml:lang="fi">DV-video</comment>
+ <comment xml:lang="eu">DV bideoa</comment>
+ <comment xml:lang="es">vídeo DV</comment>
+ <comment xml:lang="eo">DV-video</comment>
+ <comment xml:lang="en_GB">DV video</comment>
+ <comment xml:lang="el">Βίντεο DV</comment>
+ <comment xml:lang="de">DV-Video</comment>
+ <comment xml:lang="da">DV-video</comment>
+ <comment xml:lang="cs">video DV</comment>
+ <comment xml:lang="ca">vídeo DV</comment>
+ <comment xml:lang="bg">Видео — DV</comment>
+ <comment xml:lang="be@latin">Videa DV</comment>
+ <comment xml:lang="be">відэа DV</comment>
+ <comment xml:lang="ast">Videu en DV</comment>
+ <comment xml:lang="ar">فيديو DV</comment>
+ <comment xml:lang="af">DV-video</comment>
<acronym>DV</acronym>
<expanded-acronym>Digital Video</expanded-acronym>
- <magic priority="50">
+ <magic>
<match type="big32" value="0x1f070000" mask="0xffffff00" offset="0"/>
</magic>
<glob pattern="*.dv"/>
</mime-type>
<mime-type type="video/isivideo">
<comment>ISI video</comment>
- <comment xml:lang="af">ISI-video</comment>
- <comment xml:lang="ar">مرئي ISI</comment>
- <comment xml:lang="ast">Videu n'ISI</comment>
- <comment xml:lang="az">ISI video faylı</comment>
- <comment xml:lang="be-Latn">Videa ISI</comment>
- <comment xml:lang="bg">Видео — ISI</comment>
- <comment xml:lang="ca">vídeo ISI</comment>
- <comment xml:lang="cs">video ISI</comment>
- <comment xml:lang="cy">Fideo ISI</comment>
- <comment xml:lang="da">ISI-video</comment>
- <comment xml:lang="de">ISI-Video</comment>
- <comment xml:lang="el">Βίντεο ISI</comment>
- <comment xml:lang="en-GB">ISI video</comment>
- <comment xml:lang="eo">ISI-video</comment>
- <comment xml:lang="es">vídeo ISI</comment>
- <comment xml:lang="eu">ISI bideoa</comment>
- <comment xml:lang="fi">ISI-video</comment>
- <comment xml:lang="fo">ISI video</comment>
- <comment xml:lang="fr">vidéo ISI</comment>
- <comment xml:lang="fur">video ISI</comment>
- <comment xml:lang="ga">físeán ISI</comment>
- <comment xml:lang="gl">vídeo ISI</comment>
- <comment xml:lang="he">וידאו ISI</comment>
- <comment xml:lang="hr">ISI video snimka</comment>
- <comment xml:lang="hu">ISI-videó</comment>
- <comment xml:lang="ia">Video ISI</comment>
- <comment xml:lang="id">Video ISI</comment>
- <comment xml:lang="it">Video ISI</comment>
- <comment xml:lang="ja">ISI 動画</comment>
- <comment xml:lang="kk">ISI видеосы</comment>
- <comment xml:lang="ko">ISI 동영상</comment>
- <comment xml:lang="lt">ISI vaizdo įrašas</comment>
- <comment xml:lang="lv">ISI video</comment>
- <comment xml:lang="ms">Video ISI</comment>
- <comment xml:lang="nb">ISI-film</comment>
- <comment xml:lang="nl">ISI-video</comment>
- <comment xml:lang="nn">ISI video</comment>
- <comment xml:lang="oc">vidèo ISI</comment>
- <comment xml:lang="pl">Plik wideo ISI</comment>
- <comment xml:lang="pt">vídeo ISI</comment>
- <comment xml:lang="pt-BR">Vídeo ISI</comment>
- <comment xml:lang="ro">Video ISI</comment>
- <comment xml:lang="ru">Видео ISI</comment>
- <comment xml:lang="sk">Video ISI</comment>
- <comment xml:lang="sl">Video datoteka ISI</comment>
- <comment xml:lang="sq">Video ISI</comment>
- <comment xml:lang="sr">ИСИ видео</comment>
- <comment xml:lang="sv">ISI-video</comment>
- <comment xml:lang="tr">ISI videosu</comment>
- <comment xml:lang="uk">відеокліп ISI</comment>
+ <comment xml:lang="zh_TW">ISI 視訊</comment>
+ <comment xml:lang="zh_CN">ISI 视频</comment>
<comment xml:lang="vi">Ảnh động ISI</comment>
- <comment xml:lang="zh-CN">ISI 视频</comment>
- <comment xml:lang="zh-TW">ISI 視訊</comment>
+ <comment xml:lang="uk">відеокліп ISI</comment>
+ <comment xml:lang="tr">ISI videosu</comment>
+ <comment xml:lang="sv">ISI-video</comment>
+ <comment xml:lang="sr">ИСИ видео</comment>
+ <comment xml:lang="sq">video ISI</comment>
+ <comment xml:lang="sl">Video datoteka ISI</comment>
+ <comment xml:lang="si">ISI වීඩියෝව</comment>
+ <comment xml:lang="sk">Video ISI</comment>
+ <comment xml:lang="ru">Видео ISI</comment>
+ <comment xml:lang="ro">Video ISI</comment>
+ <comment xml:lang="pt_BR">Vídeo ISI</comment>
+ <comment xml:lang="pt">vídeo ISI</comment>
+ <comment xml:lang="pl">Plik wideo ISI</comment>
+ <comment xml:lang="oc">vidèo ISI</comment>
+ <comment xml:lang="nn">ISI video</comment>
+ <comment xml:lang="nl">ISI-video</comment>
+ <comment xml:lang="nb">ISI-film</comment>
+ <comment xml:lang="ms">Video ISI</comment>
+ <comment xml:lang="lv">ISI video</comment>
+ <comment xml:lang="lt">ISI vaizdo įrašas</comment>
+ <comment xml:lang="ko">ISI 동영상</comment>
+ <comment xml:lang="kk">ISI видеосы</comment>
+ <comment xml:lang="ja">ISI 動画</comment>
+ <comment xml:lang="it">Video ISI</comment>
+ <comment xml:lang="is">ISI myndskeið</comment>
+ <comment xml:lang="id">Video ISI</comment>
+ <comment xml:lang="ia">Video ISI</comment>
+ <comment xml:lang="hu">ISI-videó</comment>
+ <comment xml:lang="hr">ISI video snimka</comment>
+ <comment xml:lang="he">וידאו ISI</comment>
+ <comment xml:lang="gl">vídeo ISI</comment>
+ <comment xml:lang="ga">físeán ISI</comment>
+ <comment xml:lang="fur">video ISI</comment>
+ <comment xml:lang="fr">vidéo ISI</comment>
+ <comment xml:lang="fo">ISI video</comment>
+ <comment xml:lang="fi">ISI-video</comment>
+ <comment xml:lang="eu">ISI bideoa</comment>
+ <comment xml:lang="es">vídeo ISI</comment>
+ <comment xml:lang="eo">ISI-video</comment>
+ <comment xml:lang="en_GB">ISI video</comment>
+ <comment xml:lang="el">Βίντεο ISI</comment>
+ <comment xml:lang="de">ISI-Video</comment>
+ <comment xml:lang="da">ISI-video</comment>
+ <comment xml:lang="cy">Fideo ISI</comment>
+ <comment xml:lang="cs">video ISI</comment>
+ <comment xml:lang="ca">vídeo ISI</comment>
+ <comment xml:lang="bg">Видео — ISI</comment>
+ <comment xml:lang="be@latin">Videa ISI</comment>
+ <comment xml:lang="be">відэа ISI</comment>
+ <comment xml:lang="az">ISI video faylı</comment>
+ <comment xml:lang="ast">Videu n'ISI</comment>
+ <comment xml:lang="ar">فيديو ISI</comment>
+ <comment xml:lang="af">ISI-video</comment>
</mime-type>
<mime-type type="video/mp2t">
<comment>MPEG-2 transport stream</comment>
- <comment xml:lang="af">MPEG-2-vervoerstroom</comment>
- <comment xml:lang="ar">بث نقل MPEG-2</comment>
- <comment xml:lang="bg">Поток — транспорт по MPEG-2</comment>
- <comment xml:lang="ca">flux de transport MPEG-2</comment>
- <comment xml:lang="cs">přenosový proud MPEG-2</comment>
- <comment xml:lang="da">MPEG-2-transportstrøm</comment>
- <comment xml:lang="de">MPEG-2-Transportstrom</comment>
- <comment xml:lang="el">Ροή μεταφοράς MPEG-2</comment>
- <comment xml:lang="en-GB">MPEG-2 transport stream</comment>
- <comment xml:lang="es">flujo de transporte MPEG-2</comment>
- <comment xml:lang="eu">MPEG-2 korronte garraioa</comment>
- <comment xml:lang="fi">MPEG-2 -siirtobittivirta</comment>
- <comment xml:lang="fo">MPEG-2 flutningsstreymur</comment>
- <comment xml:lang="fr">flux de transport MPEG-2</comment>
- <comment xml:lang="fur">flus di traspuart MPEG-2</comment>
- <comment xml:lang="ga">sruth aistrithe MPEG-2</comment>
- <comment xml:lang="gl">fluxo de transporte MPEG-2</comment>
- <comment xml:lang="he">העברת זרימה של MPEG-2</comment>
- <comment xml:lang="hr">MPEG-2 transportno strujanje</comment>
- <comment xml:lang="hu">MPEG-2 átviteli adatfolyam</comment>
- <comment xml:lang="ia">Fluxo de transporto MPEG-2</comment>
- <comment xml:lang="id">Stream transport MPEG-2</comment>
- <comment xml:lang="it">Stream di trasporto MPEG-2</comment>
- <comment xml:lang="ja">MPEG-2 トランスポートストリーム</comment>
- <comment xml:lang="ka">MPEG-2-ის ტრანსპორტული ნაკადი</comment>
- <comment xml:lang="kk">MPEG-2 көліктік ағыны</comment>
- <comment xml:lang="ko">MPEG-2 전송 스트림</comment>
- <comment xml:lang="lt">MPEG-2 transportavimo srautas</comment>
- <comment xml:lang="lv">MPEG-2 transporta straume</comment>
- <comment xml:lang="nl">MPEG-2 transport stream</comment>
- <comment xml:lang="oc">flux de transpòrt MPEG-2</comment>
- <comment xml:lang="pl">Strumień przesyłania MPEG-2</comment>
- <comment xml:lang="pt">fluxo de transporte MPEG-2</comment>
- <comment xml:lang="pt-BR">Fluxo de transporte de MPEG-2</comment>
- <comment xml:lang="ro">Flux transport MPEG-2</comment>
- <comment xml:lang="ru">Транспортный поток MPEG-2</comment>
- <comment xml:lang="sk">MPEG-2 Transport Stream</comment>
- <comment xml:lang="sl">Pretočni vir prenosega MPEG</comment>
- <comment xml:lang="sr">МПЕГ-2 ток преноса</comment>
- <comment xml:lang="sv">MPEG-2 transportström</comment>
- <comment xml:lang="tr">MPEG-2 aktarım akışı</comment>
+ <comment xml:lang="zh_TW">MPEG-2 傳輸串流</comment>
+ <comment xml:lang="zh_CN">MPEG-2 传输流</comment>
<comment xml:lang="uk">потік передавання даних MPEG-2</comment>
- <comment xml:lang="zh-CN">MPEG-2 传输流</comment>
- <comment xml:lang="zh-TW">MPEG-2 傳輸串流</comment>
+ <comment xml:lang="tr">MPEG-2 aktarım akışı</comment>
+ <comment xml:lang="sv">MPEG-2 transportström</comment>
+ <comment xml:lang="sr">МПЕГ-2 ток преноса</comment>
+ <comment xml:lang="sl">Pretočni vir prenosega MPEG</comment>
+ <comment xml:lang="si">MPEG-2 ප්රවාහන ප්රවාහය</comment>
+ <comment xml:lang="sk">MPEG-2 Transport Stream</comment>
+ <comment xml:lang="ru">Транспортный поток MPEG-2</comment>
+ <comment xml:lang="ro">Flux transport MPEG-2</comment>
+ <comment xml:lang="pt_BR">Fluxo de transporte de MPEG-2</comment>
+ <comment xml:lang="pt">fluxo de transporte MPEG-2</comment>
+ <comment xml:lang="pl">Strumień przesyłania MPEG-2</comment>
+ <comment xml:lang="oc">flux de transpòrt MPEG-2</comment>
+ <comment xml:lang="nl">MPEG-2 transport stream</comment>
+ <comment xml:lang="lv">MPEG-2 transporta straume</comment>
+ <comment xml:lang="lt">MPEG-2 transportavimo srautas</comment>
+ <comment xml:lang="ko">MPEG-2 전송 스트림</comment>
+ <comment xml:lang="kk">MPEG-2 көліктік ағыны</comment>
+ <comment xml:lang="ka">MPEG-2-ის ტრანსპორტული ნაკადი</comment>
+ <comment xml:lang="ja">MPEG-2 トランスポートストリーム</comment>
+ <comment xml:lang="it">Stream di trasporto MPEG-2</comment>
+ <comment xml:lang="is">MPEG-2 Transport streymi</comment>
+ <comment xml:lang="id">Stream transport MPEG-2</comment>
+ <comment xml:lang="ia">Fluxo de transporto MPEG-2</comment>
+ <comment xml:lang="hu">MPEG-2 átviteli adatfolyam</comment>
+ <comment xml:lang="hr">MPEG-2 transportno strujanje</comment>
+ <comment xml:lang="he">העברת זרימה של MPEG-2</comment>
+ <comment xml:lang="gl">fluxo de transporte MPEG-2</comment>
+ <comment xml:lang="ga">sruth aistrithe MPEG-2</comment>
+ <comment xml:lang="fur">flus di traspuart MPEG-2</comment>
+ <comment xml:lang="fr">flux de transport MPEG-2</comment>
+ <comment xml:lang="fo">MPEG-2 flutningsstreymur</comment>
+ <comment xml:lang="fi">MPEG-2 -siirtobittivirta</comment>
+ <comment xml:lang="eu">MPEG-2 korronte garraioa</comment>
+ <comment xml:lang="es">flujo de transporte MPEG-2</comment>
+ <comment xml:lang="en_GB">MPEG-2 transport stream</comment>
+ <comment xml:lang="el">Ροή μεταφοράς MPEG-2</comment>
+ <comment xml:lang="de">MPEG-2-Transportstrom</comment>
+ <comment xml:lang="da">MPEG-2-transportstrøm</comment>
+ <comment xml:lang="cs">přenosový proud MPEG-2</comment>
+ <comment xml:lang="ca">flux de transport MPEG-2</comment>
+ <comment xml:lang="bg">Поток — транспорт по MPEG-2</comment>
+ <comment xml:lang="be">транспартная плынь MPEG-2</comment>
+ <comment xml:lang="ar">بث نقل MPEG-2</comment>
+ <comment xml:lang="af">MPEG-2-vervoerstroom</comment>
<acronym>MPEG-2 TS</acronym>
<expanded-acronym>Moving Picture Experts Group 2 Transport Stream</expanded-acronym>
- <magic priority="50">
+ <magic>
<match type="byte" value="0x47" offset="0">
<match type="byte" value="0x47" offset="188">
<match type="byte" value="0x47" offset="376">
@@ -39001,65 +40091,68 @@ command to generate the output files.
</mime-type>
<mime-type type="video/mpeg">
<comment>MPEG video</comment>
- <comment xml:lang="af">MPEG-video</comment>
- <comment xml:lang="ar">MPEG مرئي</comment>
- <comment xml:lang="ast">Videu en MPEG</comment>
- <comment xml:lang="be-Latn">Videa MPEG</comment>
- <comment xml:lang="bg">Видео — MPEG</comment>
- <comment xml:lang="ca">vídeo MPEG</comment>
- <comment xml:lang="cs">video MPEG</comment>
- <comment xml:lang="da">MPEG-video</comment>
- <comment xml:lang="de">MPEG-Video</comment>
- <comment xml:lang="el">Βίντεο MPEG</comment>
- <comment xml:lang="en-GB">MPEG video</comment>
- <comment xml:lang="eo">MPEG-video</comment>
- <comment xml:lang="es">vídeo MPEG</comment>
- <comment xml:lang="eu">MPEG bideoa</comment>
- <comment xml:lang="fi">MPEG-video</comment>
- <comment xml:lang="fo">MPEG video</comment>
- <comment xml:lang="fr">vidéo MPEG</comment>
- <comment xml:lang="fur">video MPEG</comment>
- <comment xml:lang="ga">físeán MPEG</comment>
- <comment xml:lang="gl">vídeo MPEG</comment>
- <comment xml:lang="he">וידאו MPEG</comment>
- <comment xml:lang="hr">MPEG video snimka</comment>
- <comment xml:lang="hu">MPEG-videó</comment>
- <comment xml:lang="ia">Video MPEG</comment>
- <comment xml:lang="id">Video MPEG</comment>
- <comment xml:lang="it">Video MPEG</comment>
- <comment xml:lang="ja">MPEG 動画</comment>
- <comment xml:lang="ka">MPEG ვიდეო</comment>
- <comment xml:lang="kk">MPEG видеосы</comment>
- <comment xml:lang="ko">MPEG 동영상</comment>
- <comment xml:lang="lt">MPEG vaizdo įrašas</comment>
- <comment xml:lang="lv">MPEG video</comment>
- <comment xml:lang="ms">Video MPEG</comment>
- <comment xml:lang="nb">MPEG-film</comment>
- <comment xml:lang="nl">MPEG-video</comment>
- <comment xml:lang="nn">MPEG-video</comment>
- <comment xml:lang="oc">vidèo MPEG</comment>
- <comment xml:lang="pl">Plik wideo MPEG</comment>
- <comment xml:lang="pt">vídeo MPEG</comment>
- <comment xml:lang="pt-BR">Vídeo MPEG</comment>
- <comment xml:lang="ro">Video MPEG</comment>
- <comment xml:lang="ru">Видео MPEG</comment>
- <comment xml:lang="sk">Video MPEG</comment>
- <comment xml:lang="sl">Video datoteka MPEG</comment>
- <comment xml:lang="sq">Video MPEG</comment>
- <comment xml:lang="sr">МПЕГ видео</comment>
- <comment xml:lang="sv">MPEG-video</comment>
- <comment xml:lang="tr">MPEG videosu</comment>
- <comment xml:lang="uk">відеокліп MPEG</comment>
+ <comment xml:lang="zh_TW">MPEG 視訊</comment>
+ <comment xml:lang="zh_CN">MPEG 视频</comment>
<comment xml:lang="vi">Ảnh động MPEG</comment>
- <comment xml:lang="zh-CN">MPEG 视频</comment>
- <comment xml:lang="zh-TW">MPEG 視訊</comment>
+ <comment xml:lang="uk">відеокліп MPEG</comment>
+ <comment xml:lang="tr">MPEG videosu</comment>
+ <comment xml:lang="sv">MPEG-video</comment>
+ <comment xml:lang="sr">МПЕГ видео</comment>
+ <comment xml:lang="sq">video MPEG</comment>
+ <comment xml:lang="sl">Video datoteka MPEG</comment>
+ <comment xml:lang="si">MPEG වීඩියෝව</comment>
+ <comment xml:lang="sk">Video MPEG</comment>
+ <comment xml:lang="ru">Видео MPEG</comment>
+ <comment xml:lang="ro">Video MPEG</comment>
+ <comment xml:lang="pt_BR">Vídeo MPEG</comment>
+ <comment xml:lang="pt">vídeo MPEG</comment>
+ <comment xml:lang="pl">Plik wideo MPEG</comment>
+ <comment xml:lang="oc">vidèo MPEG</comment>
+ <comment xml:lang="nn">MPEG-video</comment>
+ <comment xml:lang="nl">MPEG-video</comment>
+ <comment xml:lang="nb">MPEG-film</comment>
+ <comment xml:lang="ms">Video MPEG</comment>
+ <comment xml:lang="lv">MPEG video</comment>
+ <comment xml:lang="lt">MPEG vaizdo įrašas</comment>
+ <comment xml:lang="ko">MPEG 동영상</comment>
+ <comment xml:lang="kk">MPEG видеосы</comment>
+ <comment xml:lang="ka">MPEG ვიდეო</comment>
+ <comment xml:lang="ja">MPEG 動画</comment>
+ <comment xml:lang="it">Video MPEG</comment>
+ <comment xml:lang="is">MPEG myndskeið</comment>
+ <comment xml:lang="id">Video MPEG</comment>
+ <comment xml:lang="ia">Video MPEG</comment>
+ <comment xml:lang="hu">MPEG-videó</comment>
+ <comment xml:lang="hr">MPEG video snimka</comment>
+ <comment xml:lang="he">וידאו MPEG</comment>
+ <comment xml:lang="gl">vídeo MPEG</comment>
+ <comment xml:lang="ga">físeán MPEG</comment>
+ <comment xml:lang="fur">video MPEG</comment>
+ <comment xml:lang="fr">vidéo MPEG</comment>
+ <comment xml:lang="fo">MPEG video</comment>
+ <comment xml:lang="fi">MPEG-video</comment>
+ <comment xml:lang="eu">MPEG bideoa</comment>
+ <comment xml:lang="es">vídeo MPEG</comment>
+ <comment xml:lang="eo">MPEG-video</comment>
+ <comment xml:lang="en_GB">MPEG video</comment>
+ <comment xml:lang="el">Βίντεο MPEG</comment>
+ <comment xml:lang="de">MPEG-Video</comment>
+ <comment xml:lang="da">MPEG-video</comment>
+ <comment xml:lang="cs">video MPEG</comment>
+ <comment xml:lang="ca">vídeo MPEG</comment>
+ <comment xml:lang="bg">Видео — MPEG</comment>
+ <comment xml:lang="be@latin">Videa MPEG</comment>
+ <comment xml:lang="be">відэа MPEG</comment>
+ <comment xml:lang="ast">Videu en MPEG</comment>
+ <comment xml:lang="ar">فيديو MPEG</comment>
+ <comment xml:lang="af">MPEG-video</comment>
<acronym>MPEG</acronym>
<expanded-acronym>Moving Picture Experts Group</expanded-acronym>
<alias type="video/x-mpeg"/>
<alias type="video/mpeg-system"/>
<alias type="video/x-mpeg-system"/>
<alias type="video/x-mpeg2"/>
- <magic priority="50">
+ <magic>
<match type="string" value="\x47\x3f\xff\x10" offset="0"/>
<match type="big32" value="0x000001b3" offset="0"/>
<match type="big32" value="0x000001ba" offset="0"/>
@@ -39073,9 +40166,33 @@ command to generate the output files.
</mime-type>
<mime-type type="video/vnd.mpegurl">
<comment>Video playlist</comment>
+ <comment xml:lang="zh_CN">视频播放列表</comment>
+ <comment xml:lang="uk">список відтворення відео</comment>
+ <comment xml:lang="tr">Video çalma listesi</comment>
+ <comment xml:lang="sv">Videospellista</comment>
+ <comment xml:lang="sl">Seznam predvajanja videoposnetkov</comment>
+ <comment xml:lang="si">වීඩියෝ ධාවන ලැයිස්තුව</comment>
+ <comment xml:lang="ru">Список воспроизведения видео-данных</comment>
+ <comment xml:lang="pl">Lista odtwarzania wideo</comment>
+ <comment xml:lang="oc">lista de lectura vidèo</comment>
+ <comment xml:lang="nl">Video-afspeellijst</comment>
+ <comment xml:lang="ko">동영상 재생 목록</comment>
+ <comment xml:lang="kk">Видео ойнату тізімі</comment>
+ <comment xml:lang="ka">ვიდეო დასაკრავი სია</comment>
+ <comment xml:lang="ja">ビデオ再生リスト</comment>
+ <comment xml:lang="it">Playlist video</comment>
+ <comment xml:lang="hr">Video popis izvođenja</comment>
+ <comment xml:lang="gl">Lista de reprodución de vídeos</comment>
+ <comment xml:lang="fi">Video-soittolista</comment>
+ <comment xml:lang="eu">Bideoen erreprodukzio-zerrenda</comment>
+ <comment xml:lang="es">lista de reproducción de vídeo</comment>
+ <comment xml:lang="en_GB">Video playlist</comment>
+ <comment xml:lang="de">Video-Wiedergabeliste</comment>
+ <comment xml:lang="be">плэй-ліст відэа</comment>
+ <comment xml:lang="ar">قائمة تشغيل فيديو</comment>
<sub-class-of type="text/plain"/>
<alias type="video/x-mpegurl"/>
- <magic priority="50">
+ <magic>
<match type="string" value="#EXTM4U" offset="0"/>
</magic>
<glob pattern="*.m1u"/>
@@ -39084,58 +40201,61 @@ command to generate the output files.
</mime-type>
<mime-type type="video/quicktime">
<comment>QuickTime video</comment>
- <comment xml:lang="af">QuickTime-video</comment>
- <comment xml:lang="ar">QuickTime مرئي</comment>
- <comment xml:lang="ast">Videu en QuickTime</comment>
- <comment xml:lang="be-Latn">Videa QuickTime</comment>
- <comment xml:lang="bg">Видео — QuickTime</comment>
- <comment xml:lang="ca">vídeo QuickTime</comment>
- <comment xml:lang="cs">video QuickTime</comment>
- <comment xml:lang="da">QuickTime-video</comment>
- <comment xml:lang="de">QuickTime-Video</comment>
- <comment xml:lang="el">Βίντεο QuickTime</comment>
- <comment xml:lang="en-GB">QuickTime video</comment>
- <comment xml:lang="eo">QuickTime-video</comment>
- <comment xml:lang="es">vídeo QuickTime</comment>
- <comment xml:lang="eu">QuickTime bideoa</comment>
- <comment xml:lang="fi">QuickTime-video</comment>
- <comment xml:lang="fo">QuickTime video</comment>
- <comment xml:lang="fr">vidéo QuickTime</comment>
- <comment xml:lang="fur">video QuickTime</comment>
- <comment xml:lang="ga">físeán QuickTime</comment>
- <comment xml:lang="gl">vídeo QuickTime</comment>
- <comment xml:lang="he">וידאו של QuickTime</comment>
- <comment xml:lang="hr">QuickTime video snimka</comment>
- <comment xml:lang="hu">QuickTime videó</comment>
- <comment xml:lang="ia">Video QuickTime</comment>
- <comment xml:lang="id">Video QuickTime</comment>
- <comment xml:lang="it">Video QuickTime</comment>
- <comment xml:lang="ja">QuickTime 動画</comment>
- <comment xml:lang="kk">QuickTime видеосы</comment>
- <comment xml:lang="ko">퀵타임 동영상</comment>
- <comment xml:lang="lt">QuickTime vaizdo įrašas</comment>
- <comment xml:lang="lv">QuickTime video</comment>
- <comment xml:lang="ms">Video QuickTime</comment>
- <comment xml:lang="nb">Quicktime film</comment>
- <comment xml:lang="nl">QuickTime-video</comment>
- <comment xml:lang="nn">QuickTime-video</comment>
- <comment xml:lang="oc">vidèo QuickTime</comment>
- <comment xml:lang="pl">Plik wideo QuickTime</comment>
- <comment xml:lang="pt">vídeo QuickTime</comment>
- <comment xml:lang="pt-BR">Vídeo do QuickTime</comment>
- <comment xml:lang="ro">Video QuickTime</comment>
- <comment xml:lang="ru">Видео QuickTime</comment>
- <comment xml:lang="sk">Video QuickTime</comment>
- <comment xml:lang="sl">Video datoteka QuickTime</comment>
- <comment xml:lang="sq">Video QuickTime</comment>
- <comment xml:lang="sr">Квик Тајм видео</comment>
- <comment xml:lang="sv">QuickTime-video</comment>
- <comment xml:lang="tr">QuickTime videosu</comment>
- <comment xml:lang="uk">відеокліп QuickTime</comment>
+ <comment xml:lang="zh_TW">QuickTime 視訊</comment>
+ <comment xml:lang="zh_CN">QuickTime 视频</comment>
<comment xml:lang="vi">Ảnh động QuickTime</comment>
- <comment xml:lang="zh-CN">QuickTime 视频</comment>
- <comment xml:lang="zh-TW">QuickTime 視訊</comment>
- <magic priority="50">
+ <comment xml:lang="uk">відеокліп QuickTime</comment>
+ <comment xml:lang="tr">QuickTime videosu</comment>
+ <comment xml:lang="sv">QuickTime-video</comment>
+ <comment xml:lang="sr">Квик Тајм видео</comment>
+ <comment xml:lang="sq">video QuickTime</comment>
+ <comment xml:lang="sl">Video datoteka QuickTime</comment>
+ <comment xml:lang="si">QuickTime වීඩියෝව</comment>
+ <comment xml:lang="sk">Video QuickTime</comment>
+ <comment xml:lang="ru">Видео QuickTime</comment>
+ <comment xml:lang="ro">Video QuickTime</comment>
+ <comment xml:lang="pt_BR">Vídeo do QuickTime</comment>
+ <comment xml:lang="pt">vídeo QuickTime</comment>
+ <comment xml:lang="pl">Plik wideo QuickTime</comment>
+ <comment xml:lang="oc">vidèo QuickTime</comment>
+ <comment xml:lang="nn">QuickTime-video</comment>
+ <comment xml:lang="nl">QuickTime-video</comment>
+ <comment xml:lang="nb">Quicktime film</comment>
+ <comment xml:lang="ms">Video QuickTime</comment>
+ <comment xml:lang="lv">QuickTime video</comment>
+ <comment xml:lang="lt">QuickTime vaizdo įrašas</comment>
+ <comment xml:lang="ko">퀵타임 동영상</comment>
+ <comment xml:lang="kk">QuickTime видеосы</comment>
+ <comment xml:lang="ja">QuickTime 動画</comment>
+ <comment xml:lang="it">Video QuickTime</comment>
+ <comment xml:lang="is">QuickTime myndskeið</comment>
+ <comment xml:lang="id">Video QuickTime</comment>
+ <comment xml:lang="ia">Video QuickTime</comment>
+ <comment xml:lang="hu">QuickTime videó</comment>
+ <comment xml:lang="hr">QuickTime video snimka</comment>
+ <comment xml:lang="he">וידאו של QuickTime</comment>
+ <comment xml:lang="gl">vídeo QuickTime</comment>
+ <comment xml:lang="ga">físeán QuickTime</comment>
+ <comment xml:lang="fur">video QuickTime</comment>
+ <comment xml:lang="fr">vidéo QuickTime</comment>
+ <comment xml:lang="fo">QuickTime video</comment>
+ <comment xml:lang="fi">QuickTime-video</comment>
+ <comment xml:lang="eu">QuickTime bideoa</comment>
+ <comment xml:lang="es">vídeo QuickTime</comment>
+ <comment xml:lang="eo">QuickTime-video</comment>
+ <comment xml:lang="en_GB">QuickTime video</comment>
+ <comment xml:lang="el">Βίντεο QuickTime</comment>
+ <comment xml:lang="de">QuickTime-Video</comment>
+ <comment xml:lang="da">QuickTime-video</comment>
+ <comment xml:lang="cs">video QuickTime</comment>
+ <comment xml:lang="ca">vídeo QuickTime</comment>
+ <comment xml:lang="bg">Видео — QuickTime</comment>
+ <comment xml:lang="be@latin">Videa QuickTime</comment>
+ <comment xml:lang="be">відэа QuickTime</comment>
+ <comment xml:lang="ast">Videu en QuickTime</comment>
+ <comment xml:lang="ar">فيديو QuickTime</comment>
+ <comment xml:lang="af">QuickTime-video</comment>
+ <magic>
<match type="string" value="mdat" offset="12"/>
<match type="string" value="mdat" offset="4"/>
<match type="string" value="moov" offset="4"/>
@@ -39148,56 +40268,59 @@ command to generate the output files.
</mime-type>
<mime-type type="image/x-quicktime">
<comment>QuickTime image</comment>
- <comment xml:lang="af">QuickTime-beeld</comment>
- <comment xml:lang="ar">صورة QuickTime</comment>
- <comment xml:lang="be-Latn">Vyjava QuickTime</comment>
- <comment xml:lang="bg">Изображение — QuickTime</comment>
- <comment xml:lang="ca">imatge QuickTime</comment>
- <comment xml:lang="cs">obrázek QuickTime</comment>
- <comment xml:lang="da">QuickTime-billede</comment>
- <comment xml:lang="de">QuickTime-Bild</comment>
- <comment xml:lang="el">Εικόνα QuickTime</comment>
- <comment xml:lang="en-GB">QuickTime image</comment>
- <comment xml:lang="eo">QuickTime-bildo</comment>
- <comment xml:lang="es">imagen de QuickTime</comment>
- <comment xml:lang="eu">QuickTime irudia</comment>
- <comment xml:lang="fi">QuickTime-kuva</comment>
- <comment xml:lang="fo">QuickTime mynd</comment>
- <comment xml:lang="fr">image QuickTime</comment>
- <comment xml:lang="fur">imagjin QuickTime</comment>
- <comment xml:lang="ga">íomhá QuickTime</comment>
- <comment xml:lang="gl">imaxe QuickTime</comment>
- <comment xml:lang="he">תמונה של QuickTime</comment>
- <comment xml:lang="hr">QuickTime slika</comment>
- <comment xml:lang="hu">QuickTime kép</comment>
- <comment xml:lang="ia">Imagine QuickTime</comment>
- <comment xml:lang="id">Citra QuickTime</comment>
- <comment xml:lang="it">Immagine QuickTime</comment>
- <comment xml:lang="ja">QuickTime 画像</comment>
- <comment xml:lang="kk">QuickTime суреті</comment>
- <comment xml:lang="ko">퀵타임 그림</comment>
- <comment xml:lang="lt">QuickTime paveikslėlis</comment>
- <comment xml:lang="lv">QuickTime attēls</comment>
- <comment xml:lang="nb">Quicktime bilde</comment>
- <comment xml:lang="nl">QuickTime-afbeelding</comment>
- <comment xml:lang="nn">QuickTime-bilete</comment>
- <comment xml:lang="oc">imatge QuickTime</comment>
- <comment xml:lang="pl">Obraz QuickTime</comment>
- <comment xml:lang="pt">imagem QuickTime</comment>
- <comment xml:lang="pt-BR">Imagem do QuickTime</comment>
- <comment xml:lang="ro">Imagine QuickTime</comment>
- <comment xml:lang="ru">Изображение QuickTime</comment>
- <comment xml:lang="sk">Obrázok QuickTime</comment>
- <comment xml:lang="sl">Slikovna datoteka QuickTime</comment>
- <comment xml:lang="sq">Figurë QuickTime</comment>
- <comment xml:lang="sr">Квик Тајм слика</comment>
- <comment xml:lang="sv">QuickTime-bild</comment>
- <comment xml:lang="tr">QuickTime görüntüsü</comment>
- <comment xml:lang="uk">зображення QuickTime</comment>
+ <comment xml:lang="zh_TW">QuickTime 影像</comment>
+ <comment xml:lang="zh_CN">QuickTime 图像</comment>
<comment xml:lang="vi">Ảnh QuickTime</comment>
- <comment xml:lang="zh-CN">QuickTime 图像</comment>
- <comment xml:lang="zh-TW">QuickTime 影像</comment>
- <magic priority="50">
+ <comment xml:lang="uk">зображення QuickTime</comment>
+ <comment xml:lang="tr">QuickTime görüntüsü</comment>
+ <comment xml:lang="sv">QuickTime-bild</comment>
+ <comment xml:lang="sr">Квик Тајм слика</comment>
+ <comment xml:lang="sq">figurë QuickTime</comment>
+ <comment xml:lang="sl">Slikovna datoteka QuickTime</comment>
+ <comment xml:lang="si">QuickTime රූපය</comment>
+ <comment xml:lang="sk">Obrázok QuickTime</comment>
+ <comment xml:lang="ru">Изображение QuickTime</comment>
+ <comment xml:lang="ro">Imagine QuickTime</comment>
+ <comment xml:lang="pt_BR">Imagem do QuickTime</comment>
+ <comment xml:lang="pt">imagem QuickTime</comment>
+ <comment xml:lang="pl">Obraz QuickTime</comment>
+ <comment xml:lang="oc">imatge QuickTime</comment>
+ <comment xml:lang="nn">QuickTime-bilete</comment>
+ <comment xml:lang="nl">QuickTime-afbeelding</comment>
+ <comment xml:lang="nb">Quicktime bilde</comment>
+ <comment xml:lang="lv">QuickTime attēls</comment>
+ <comment xml:lang="lt">QuickTime paveikslėlis</comment>
+ <comment xml:lang="ko">퀵타임 그림</comment>
+ <comment xml:lang="kk">QuickTime суреті</comment>
+ <comment xml:lang="ja">QuickTime 画像</comment>
+ <comment xml:lang="it">Immagine QuickTime</comment>
+ <comment xml:lang="is">QuickTime mynd</comment>
+ <comment xml:lang="id">Citra QuickTime</comment>
+ <comment xml:lang="ia">Imagine QuickTime</comment>
+ <comment xml:lang="hu">QuickTime kép</comment>
+ <comment xml:lang="hr">QuickTime slika</comment>
+ <comment xml:lang="he">תמונה של QuickTime</comment>
+ <comment xml:lang="gl">imaxe QuickTime</comment>
+ <comment xml:lang="ga">íomhá QuickTime</comment>
+ <comment xml:lang="fur">imagjin QuickTime</comment>
+ <comment xml:lang="fr">image QuickTime</comment>
+ <comment xml:lang="fo">QuickTime mynd</comment>
+ <comment xml:lang="fi">QuickTime-kuva</comment>
+ <comment xml:lang="eu">QuickTime irudia</comment>
+ <comment xml:lang="es">imagen de QuickTime</comment>
+ <comment xml:lang="eo">QuickTime-bildo</comment>
+ <comment xml:lang="en_GB">QuickTime image</comment>
+ <comment xml:lang="el">Εικόνα QuickTime</comment>
+ <comment xml:lang="de">QuickTime-Bild</comment>
+ <comment xml:lang="da">QuickTime-billede</comment>
+ <comment xml:lang="cs">obrázek QuickTime</comment>
+ <comment xml:lang="ca">imatge QuickTime</comment>
+ <comment xml:lang="bg">Изображение — QuickTime</comment>
+ <comment xml:lang="be@latin">Vyjava QuickTime</comment>
+ <comment xml:lang="be">выява QuickTime</comment>
+ <comment xml:lang="ar">صورة QuickTime</comment>
+ <comment xml:lang="af">QuickTime-beeld</comment>
+ <magic>
<match type="string" value="idat" offset="4"/>
</magic>
<glob pattern="*.qtif"/>
@@ -39205,35 +40328,44 @@ command to generate the output files.
</mime-type>
<mime-type type="image/ktx">
<comment>Khronos texture image</comment>
- <comment xml:lang="af">Khronos-tekstuurbeeld</comment>
- <comment xml:lang="bg">Изображение — текстура за Khronos</comment>
- <comment xml:lang="ca">imatge de textura de Khronos</comment>
- <comment xml:lang="cs">obrázek s texturou Khronos</comment>
- <comment xml:lang="da">Khronos-strukturbillede</comment>
- <comment xml:lang="de">Khronos-Texturbild</comment>
- <comment xml:lang="en-GB">Khronos texture image</comment>
- <comment xml:lang="es">imagen de textura de Khronos</comment>
- <comment xml:lang="eu">Khronos testura irudia</comment>
- <comment xml:lang="fi">Khronos-tekstuurikuva</comment>
- <comment xml:lang="fr">image de texture Khronos</comment>
- <comment xml:lang="fur">imagjin di struture/texture Khronos</comment>
- <comment xml:lang="ga">íomhá uigeachta Khronos</comment>
- <comment xml:lang="hr">Khronos tekstura slika</comment>
- <comment xml:lang="hu">Khronos textúra kép</comment>
- <comment xml:lang="id">Citra tekstur Khronos</comment>
- <comment xml:lang="it">Immagine texture Khronos</comment>
- <comment xml:lang="kk">Khronos текстура суреті</comment>
- <comment xml:lang="ko">크로노스 텍스처 파일</comment>
- <comment xml:lang="pl">Obraz tekstury Khronos</comment>
- <comment xml:lang="pt-BR">Imagem de textura do Khronos</comment>
- <comment xml:lang="ru">Изображение текстуры Khronos</comment>
- <comment xml:lang="sk">Obrázok textúry Khronos</comment>
- <comment xml:lang="sr">слика Кронос текстуре</comment>
- <comment xml:lang="sv">Khronos-texturbild</comment>
- <comment xml:lang="tr">Khronos kaplama görüntüsü</comment>
+ <comment xml:lang="zh_TW">Khronos 紋理影像</comment>
+ <comment xml:lang="zh_CN">Khronos 纹理图像</comment>
<comment xml:lang="uk">зображення текстури Khronos</comment>
- <comment xml:lang="zh-CN">Khronos 纹理图像</comment>
- <comment xml:lang="zh-TW">Khronos 紋理影像</comment>
+ <comment xml:lang="tr">Khronos kaplama görüntüsü</comment>
+ <comment xml:lang="sv">Khronos-texturbild</comment>
+ <comment xml:lang="sr">слика Кронос текстуре</comment>
+ <comment xml:lang="sl">Slika teksture Khronos</comment>
+ <comment xml:lang="si">ක්‍රොනොස් වයනය රූපය</comment>
+ <comment xml:lang="sk">Obrázok textúry Khronos</comment>
+ <comment xml:lang="ru">Изображение текстуры Khronos</comment>
+ <comment xml:lang="pt_BR">Imagem de textura do Khronos</comment>
+ <comment xml:lang="pl">Obraz tekstury Khronos</comment>
+ <comment xml:lang="nl">Khronos-textuurafbeelding</comment>
+ <comment xml:lang="ko">크로노스 텍스처 파일</comment>
+ <comment xml:lang="kk">Khronos текстура суреті</comment>
+ <comment xml:lang="ja">Khronos テクスチャ画像</comment>
+ <comment xml:lang="it">Immagine texture Khronos</comment>
+ <comment xml:lang="is">Khronos efnisáferðarmynd</comment>
+ <comment xml:lang="id">Citra tekstur Khronos</comment>
+ <comment xml:lang="hu">Khronos textúra kép</comment>
+ <comment xml:lang="hr">Khronos tekstura slika</comment>
+ <comment xml:lang="he">תמונת מרקם של Khronos</comment>
+ <comment xml:lang="gl">Imaxe de textura Khronos</comment>
+ <comment xml:lang="ga">íomhá uigeachta Khronos</comment>
+ <comment xml:lang="fur">imagjin di struture/texture Khronos</comment>
+ <comment xml:lang="fr">image de texture Khronos</comment>
+ <comment xml:lang="fi">Khronos-tekstuurikuva</comment>
+ <comment xml:lang="eu">Khronos testura irudia</comment>
+ <comment xml:lang="es">imagen de textura de Khronos</comment>
+ <comment xml:lang="en_GB">Khronos texture image</comment>
+ <comment xml:lang="de">Khronos-Texturbild</comment>
+ <comment xml:lang="da">Khronos-strukturbillede</comment>
+ <comment xml:lang="cs">obrázek s texturou Khronos</comment>
+ <comment xml:lang="ca">imatge de textura de Khronos</comment>
+ <comment xml:lang="bg">Изображение — текстура за Khronos</comment>
+ <comment xml:lang="be">выява тэкстуры Khronos</comment>
+ <comment xml:lang="ar">صور نسيج Khronos</comment>
+ <comment xml:lang="af">Khronos-tekstuurbeeld</comment>
<magic priority="80">
<match type="big32" value="0xAB4B5458" offset="0">
<match type="big32" value="0x203131BB" offset="4">
@@ -39245,35 +40377,44 @@ command to generate the output files.
</mime-type>
<mime-type type="image/ktx2">
<comment>Khronos texture image</comment>
- <comment xml:lang="af">Khronos-tekstuurbeeld</comment>
- <comment xml:lang="bg">Изображение — текстура за Khronos</comment>
- <comment xml:lang="ca">imatge de textura de Khronos</comment>
- <comment xml:lang="cs">obrázek s texturou Khronos</comment>
- <comment xml:lang="da">Khronos-strukturbillede</comment>
- <comment xml:lang="de">Khronos-Texturbild</comment>
- <comment xml:lang="en-GB">Khronos texture image</comment>
- <comment xml:lang="es">imagen de textura de Khronos</comment>
- <comment xml:lang="eu">Khronos testura irudia</comment>
- <comment xml:lang="fi">Khronos-tekstuurikuva</comment>
- <comment xml:lang="fr">image de texture Khronos</comment>
- <comment xml:lang="fur">imagjin di struture/texture Khronos</comment>
- <comment xml:lang="ga">íomhá uigeachta Khronos</comment>
- <comment xml:lang="hr">Khronos tekstura slika</comment>
- <comment xml:lang="hu">Khronos textúra kép</comment>
- <comment xml:lang="id">Citra tekstur Khronos</comment>
- <comment xml:lang="it">Immagine texture Khronos</comment>
- <comment xml:lang="kk">Khronos текстура суреті</comment>
- <comment xml:lang="ko">크로노스 텍스처 파일</comment>
- <comment xml:lang="pl">Obraz tekstury Khronos</comment>
- <comment xml:lang="pt-BR">Imagem de textura do Khronos</comment>
- <comment xml:lang="ru">Изображение текстуры Khronos</comment>
- <comment xml:lang="sk">Obrázok textúry Khronos</comment>
- <comment xml:lang="sr">слика Кронос текстуре</comment>
- <comment xml:lang="sv">Khronos-texturbild</comment>
- <comment xml:lang="tr">Khronos kaplama görüntüsü</comment>
+ <comment xml:lang="zh_TW">Khronos 紋理影像</comment>
+ <comment xml:lang="zh_CN">Khronos 纹理图像</comment>
<comment xml:lang="uk">зображення текстури Khronos</comment>
- <comment xml:lang="zh-CN">Khronos 纹理图像</comment>
- <comment xml:lang="zh-TW">Khronos 紋理影像</comment>
+ <comment xml:lang="tr">Khronos kaplama görüntüsü</comment>
+ <comment xml:lang="sv">Khronos-texturbild</comment>
+ <comment xml:lang="sr">слика Кронос текстуре</comment>
+ <comment xml:lang="sl">Slika teksture Khronos</comment>
+ <comment xml:lang="si">ක්‍රොනොස් වයනය රූපය</comment>
+ <comment xml:lang="sk">Obrázok textúry Khronos</comment>
+ <comment xml:lang="ru">Изображение текстуры Khronos</comment>
+ <comment xml:lang="pt_BR">Imagem de textura do Khronos</comment>
+ <comment xml:lang="pl">Obraz tekstury Khronos</comment>
+ <comment xml:lang="nl">Khronos-textuurafbeelding</comment>
+ <comment xml:lang="ko">크로노스 텍스처 파일</comment>
+ <comment xml:lang="kk">Khronos текстура суреті</comment>
+ <comment xml:lang="ja">Khronos テクスチャ画像</comment>
+ <comment xml:lang="it">Immagine texture Khronos</comment>
+ <comment xml:lang="is">Khronos efnisáferðarmynd</comment>
+ <comment xml:lang="id">Citra tekstur Khronos</comment>
+ <comment xml:lang="hu">Khronos textúra kép</comment>
+ <comment xml:lang="hr">Khronos tekstura slika</comment>
+ <comment xml:lang="he">תמונת מרקם של Khronos</comment>
+ <comment xml:lang="gl">Imaxe de textura Khronos</comment>
+ <comment xml:lang="ga">íomhá uigeachta Khronos</comment>
+ <comment xml:lang="fur">imagjin di struture/texture Khronos</comment>
+ <comment xml:lang="fr">image de texture Khronos</comment>
+ <comment xml:lang="fi">Khronos-tekstuurikuva</comment>
+ <comment xml:lang="eu">Khronos testura irudia</comment>
+ <comment xml:lang="es">imagen de textura de Khronos</comment>
+ <comment xml:lang="en_GB">Khronos texture image</comment>
+ <comment xml:lang="de">Khronos-Texturbild</comment>
+ <comment xml:lang="da">Khronos-strukturbillede</comment>
+ <comment xml:lang="cs">obrázek s texturou Khronos</comment>
+ <comment xml:lang="ca">imatge de textura de Khronos</comment>
+ <comment xml:lang="bg">Изображение — текстура за Khronos</comment>
+ <comment xml:lang="be">выява тэкстуры Khronos</comment>
+ <comment xml:lang="ar">صور نسيج Khronos</comment>
+ <comment xml:lang="af">Khronos-tekstuurbeeld</comment>
<magic priority="80">
<match type="big32" value="0xAB4B5458" offset="0">
<match type="big32" value="0x203230BB" offset="4">
@@ -39285,12 +40426,34 @@ command to generate the output files.
</mime-type>
<mime-type type="image/astc">
<comment>ASTC texture</comment>
- <comment xml:lang="ca">textura ASTC</comment>
- <comment xml:lang="fi">ASTC tekstuuri</comment>
- <comment xml:lang="it">Texture ASTC</comment>
- <comment xml:lang="pl">Tekstura ASTC</comment>
- <comment xml:lang="pt-BR">Textura ASTC</comment>
<comment xml:lang="uk">текстура ASTC</comment>
+ <comment xml:lang="tr">ASTC dokusu</comment>
+ <comment xml:lang="sv">ASTC-textur</comment>
+ <comment xml:lang="sl">Tekstura ASTC</comment>
+ <comment xml:lang="si">ASTC වයනය</comment>
+ <comment xml:lang="ru">Текстура ASTC</comment>
+ <comment xml:lang="pt_BR">Textura ASTC</comment>
+ <comment xml:lang="pl">Tekstura ASTC</comment>
+ <comment xml:lang="nl">ASTC-textuur</comment>
+ <comment xml:lang="ko">ASTC 텍스처</comment>
+ <comment xml:lang="kk">ASTC текстурасы</comment>
+ <comment xml:lang="ja">ASTC テクスチャ</comment>
+ <comment xml:lang="it">Texture ASTC</comment>
+ <comment xml:lang="is">ASTC efnisáferð</comment>
+ <comment xml:lang="id">tekstur ASTC</comment>
+ <comment xml:lang="hu">ASTC textúra</comment>
+ <comment xml:lang="hr">ASTC tekstura</comment>
+ <comment xml:lang="he">מרקם של ASTC</comment>
+ <comment xml:lang="gl">Textura ASTC</comment>
+ <comment xml:lang="fr">Texture ASTC</comment>
+ <comment xml:lang="fi">ASTC-tekstuuri</comment>
+ <comment xml:lang="es">textura ASTC</comment>
+ <comment xml:lang="en_GB">ASTC texture</comment>
+ <comment xml:lang="de">ASTC-Textur</comment>
+ <comment xml:lang="da">ASTC-struktur</comment>
+ <comment xml:lang="ca">textura ASTC</comment>
+ <comment xml:lang="be">тэкстура ASTC</comment>
+ <comment xml:lang="ar">نسيج ASTC</comment>
<acronym>ASTC</acronym>
<expanded-acronym>Advanced Scalable Texture Compression</expanded-acronym>
<glob pattern="*.astc"/>
@@ -39300,230 +40463,242 @@ command to generate the output files.
</mime-type>
<mime-type type="video/vnd.vivo">
<comment>Vivo video</comment>
- <comment xml:lang="af">Vivo-video</comment>
- <comment xml:lang="ar">Vivo مرئي</comment>
- <comment xml:lang="ast">Videu en Vivo</comment>
- <comment xml:lang="az">Vivo video faylı</comment>
- <comment xml:lang="be-Latn">Videa Vivo</comment>
- <comment xml:lang="bg">Видео — Vivo</comment>
- <comment xml:lang="ca">vídeo Vivo</comment>
- <comment xml:lang="cs">video Vivo</comment>
- <comment xml:lang="cy">Fideo Vivo</comment>
- <comment xml:lang="da">Vivo-video</comment>
- <comment xml:lang="de">Vivo-Video</comment>
- <comment xml:lang="el">Βίντεο Vivo</comment>
- <comment xml:lang="en-GB">Vivo video</comment>
- <comment xml:lang="eo">Vivo-video</comment>
- <comment xml:lang="es">vídeo Vivo</comment>
- <comment xml:lang="eu">Vivo bideoa</comment>
- <comment xml:lang="fi">Vivo-video</comment>
- <comment xml:lang="fo">Vivo video</comment>
- <comment xml:lang="fr">vidéo Vivo</comment>
- <comment xml:lang="fur">video Vivo</comment>
- <comment xml:lang="ga">físeán Vivo</comment>
- <comment xml:lang="gl">vídeo Vivo</comment>
- <comment xml:lang="he">וידאו של Vivo</comment>
- <comment xml:lang="hr">Vivo video snimka</comment>
- <comment xml:lang="hu">Vivo-videó</comment>
- <comment xml:lang="ia">Video Vivo</comment>
- <comment xml:lang="id">Video Vivo</comment>
- <comment xml:lang="it">Video Vivo</comment>
- <comment xml:lang="ja">Vivo 動画</comment>
- <comment xml:lang="kk">Vivo видеосы</comment>
- <comment xml:lang="ko">Vivo 동영상</comment>
- <comment xml:lang="lt">Vivo vaizdo įrašas</comment>
- <comment xml:lang="lv">Vivo video</comment>
- <comment xml:lang="ms">Video Vivo</comment>
- <comment xml:lang="nb">Vivo-film</comment>
- <comment xml:lang="nl">Vivo-video</comment>
- <comment xml:lang="nn">Vivo-film</comment>
- <comment xml:lang="oc">vidèo Vivo</comment>
- <comment xml:lang="pl">Plik wideo Vivo</comment>
- <comment xml:lang="pt">vídeo Vivo</comment>
- <comment xml:lang="pt-BR">Vídeo Vivo</comment>
- <comment xml:lang="ro">Video Vivo</comment>
- <comment xml:lang="ru">Видео Vivo</comment>
- <comment xml:lang="sk">Video Vivo</comment>
- <comment xml:lang="sl">Video datoteka Vivo</comment>
- <comment xml:lang="sq">Video Vivo</comment>
- <comment xml:lang="sr">Виво видео</comment>
- <comment xml:lang="sv">Vivo-video</comment>
- <comment xml:lang="tr">Vivo videosu</comment>
- <comment xml:lang="uk">відео Vivo</comment>
+ <comment xml:lang="zh_TW">Vivo 視訊</comment>
+ <comment xml:lang="zh_CN">Vivo 视频</comment>
<comment xml:lang="vi">Ảnh động Vivo</comment>
- <comment xml:lang="zh-CN">Vivo 视频</comment>
- <comment xml:lang="zh-TW">Vivo 視訊</comment>
+ <comment xml:lang="uk">відео Vivo</comment>
+ <comment xml:lang="tr">Vivo videosu</comment>
+ <comment xml:lang="sv">Vivo-video</comment>
+ <comment xml:lang="sr">Виво видео</comment>
+ <comment xml:lang="sq">video Vivo</comment>
+ <comment xml:lang="sl">Video datoteka Vivo</comment>
+ <comment xml:lang="si">Vivo වීඩියෝව</comment>
+ <comment xml:lang="sk">Video Vivo</comment>
+ <comment xml:lang="ru">Видео Vivo</comment>
+ <comment xml:lang="ro">Video Vivo</comment>
+ <comment xml:lang="pt_BR">Vídeo Vivo</comment>
+ <comment xml:lang="pt">vídeo Vivo</comment>
+ <comment xml:lang="pl">Plik wideo Vivo</comment>
+ <comment xml:lang="oc">vidèo Vivo</comment>
+ <comment xml:lang="nn">Vivo-film</comment>
+ <comment xml:lang="nl">Vivo-video</comment>
+ <comment xml:lang="nb">Vivo-film</comment>
+ <comment xml:lang="ms">Video Vivo</comment>
+ <comment xml:lang="lv">Vivo video</comment>
+ <comment xml:lang="lt">Vivo vaizdo įrašas</comment>
+ <comment xml:lang="ko">Vivo 동영상</comment>
+ <comment xml:lang="kk">Vivo видеосы</comment>
+ <comment xml:lang="ja">Vivo 動画</comment>
+ <comment xml:lang="it">Video Vivo</comment>
+ <comment xml:lang="is">Vivo myndskeið</comment>
+ <comment xml:lang="id">Video Vivo</comment>
+ <comment xml:lang="ia">Video Vivo</comment>
+ <comment xml:lang="hu">Vivo-videó</comment>
+ <comment xml:lang="hr">Vivo video snimka</comment>
+ <comment xml:lang="he">וידאו של Vivo</comment>
+ <comment xml:lang="gl">vídeo Vivo</comment>
+ <comment xml:lang="ga">físeán Vivo</comment>
+ <comment xml:lang="fur">video Vivo</comment>
+ <comment xml:lang="fr">vidéo Vivo</comment>
+ <comment xml:lang="fo">Vivo video</comment>
+ <comment xml:lang="fi">Vivo-video</comment>
+ <comment xml:lang="eu">Vivo bideoa</comment>
+ <comment xml:lang="es">vídeo Vivo</comment>
+ <comment xml:lang="eo">Vivo-video</comment>
+ <comment xml:lang="en_GB">Vivo video</comment>
+ <comment xml:lang="el">Βίντεο Vivo</comment>
+ <comment xml:lang="de">Vivo-Video</comment>
+ <comment xml:lang="da">Vivo-video</comment>
+ <comment xml:lang="cy">Fideo Vivo</comment>
+ <comment xml:lang="cs">video Vivo</comment>
+ <comment xml:lang="ca">vídeo Vivo</comment>
+ <comment xml:lang="bg">Видео — Vivo</comment>
+ <comment xml:lang="be@latin">Videa Vivo</comment>
+ <comment xml:lang="be">відэа Vivo</comment>
+ <comment xml:lang="az">Vivo video faylı</comment>
+ <comment xml:lang="ast">Videu en Vivo</comment>
+ <comment xml:lang="ar">فيديو Vivo</comment>
+ <comment xml:lang="af">Vivo-video</comment>
<alias type="video/vivo"/>
<glob pattern="*.viv"/>
<glob pattern="*.vivo"/>
</mime-type>
<mime-type type="video/wavelet">
<comment>Wavelet video</comment>
- <comment xml:lang="af">Wavelet-video</comment>
- <comment xml:lang="ar">Wavelet مرئي</comment>
- <comment xml:lang="ast">Videu en Wavelet</comment>
- <comment xml:lang="az">Wavelet video faylı</comment>
- <comment xml:lang="be-Latn">Videa Wavelet</comment>
- <comment xml:lang="bg">Видео — Wavelet</comment>
- <comment xml:lang="ca">vídeo Wavelet</comment>
- <comment xml:lang="cs">video Wavelet</comment>
- <comment xml:lang="cy">Fideo Wavelet</comment>
- <comment xml:lang="da">Wavelet-video</comment>
- <comment xml:lang="de">Wavelet-Video</comment>
- <comment xml:lang="el">Βίντεο Wavelet</comment>
- <comment xml:lang="en-GB">Wavelet video</comment>
- <comment xml:lang="eo">Wavelet-video</comment>
- <comment xml:lang="es">vídeo Wavelet</comment>
- <comment xml:lang="eu">Wavelet bideoa</comment>
- <comment xml:lang="fi">Wavelet-video</comment>
- <comment xml:lang="fo">Wavelet video</comment>
- <comment xml:lang="fr">vidéo Wavelet</comment>
- <comment xml:lang="fur">video Wavelet</comment>
- <comment xml:lang="ga">físeán Wavelet</comment>
- <comment xml:lang="gl">vídeo Wavelet</comment>
- <comment xml:lang="he">וידאו של Wavelet</comment>
- <comment xml:lang="hr">Wavelet video snimka</comment>
- <comment xml:lang="hu">Wavelet-videó</comment>
- <comment xml:lang="ia">Video Wavelet</comment>
- <comment xml:lang="id">Video Wavelet</comment>
- <comment xml:lang="it">Video Wavelet</comment>
- <comment xml:lang="ja">Wavelet 動画</comment>
- <comment xml:lang="kk">Wavelet видеосы</comment>
- <comment xml:lang="ko">Wavelet 동영상</comment>
- <comment xml:lang="lt">Wavelet vaizdo įrašas</comment>
- <comment xml:lang="lv">Wavelet video</comment>
- <comment xml:lang="ms">Video Wavelet</comment>
- <comment xml:lang="nb">Wavelet-film</comment>
- <comment xml:lang="nl">Wavelet-video</comment>
- <comment xml:lang="nn">Wavelet video</comment>
- <comment xml:lang="oc">vidèo Wavelet</comment>
- <comment xml:lang="pl">Plik wideo Wavelet</comment>
- <comment xml:lang="pt">vídeo Wavelet</comment>
- <comment xml:lang="pt-BR">Vídeo Wavelet</comment>
- <comment xml:lang="ro">Video Wavelet</comment>
- <comment xml:lang="ru">Видео Wavelet</comment>
- <comment xml:lang="sk">Video Wavelet</comment>
- <comment xml:lang="sl">Video datoteka Wavelet</comment>
- <comment xml:lang="sq">Video Wavelet</comment>
- <comment xml:lang="sr">Вејвелет видео</comment>
- <comment xml:lang="sv">Wavelet-video</comment>
- <comment xml:lang="tr">Wavelet videosu</comment>
- <comment xml:lang="uk">відеокліп Wavelet</comment>
+ <comment xml:lang="zh_TW">Wavelet 視訊</comment>
+ <comment xml:lang="zh_CN">Wavelet 视频</comment>
<comment xml:lang="vi">Ảnh động Wavelet</comment>
- <comment xml:lang="zh-CN">Wavelet 视频</comment>
- <comment xml:lang="zh-TW">Wavelet 視訊</comment>
+ <comment xml:lang="uk">відеокліп Wavelet</comment>
+ <comment xml:lang="tr">Wavelet videosu</comment>
+ <comment xml:lang="sv">Wavelet-video</comment>
+ <comment xml:lang="sr">Вејвелет видео</comment>
+ <comment xml:lang="sq">video Wavelet</comment>
+ <comment xml:lang="sl">Video datoteka Wavelet</comment>
+ <comment xml:lang="si">Wavelet වීඩියෝව</comment>
+ <comment xml:lang="sk">Video Wavelet</comment>
+ <comment xml:lang="ru">Видео Wavelet</comment>
+ <comment xml:lang="ro">Video Wavelet</comment>
+ <comment xml:lang="pt_BR">Vídeo Wavelet</comment>
+ <comment xml:lang="pt">vídeo Wavelet</comment>
+ <comment xml:lang="pl">Plik wideo Wavelet</comment>
+ <comment xml:lang="oc">vidèo Wavelet</comment>
+ <comment xml:lang="nn">Wavelet video</comment>
+ <comment xml:lang="nl">Wavelet-video</comment>
+ <comment xml:lang="nb">Wavelet-film</comment>
+ <comment xml:lang="ms">Video Wavelet</comment>
+ <comment xml:lang="lv">Wavelet video</comment>
+ <comment xml:lang="lt">Wavelet vaizdo įrašas</comment>
+ <comment xml:lang="ko">Wavelet 동영상</comment>
+ <comment xml:lang="kk">Wavelet видеосы</comment>
+ <comment xml:lang="ja">Wavelet 動画</comment>
+ <comment xml:lang="it">Video Wavelet</comment>
+ <comment xml:lang="is">Wavelet myndskeið</comment>
+ <comment xml:lang="id">Video Wavelet</comment>
+ <comment xml:lang="ia">Video Wavelet</comment>
+ <comment xml:lang="hu">Wavelet-videó</comment>
+ <comment xml:lang="hr">Wavelet video snimka</comment>
+ <comment xml:lang="he">וידאו של Wavelet</comment>
+ <comment xml:lang="gl">vídeo Wavelet</comment>
+ <comment xml:lang="ga">físeán Wavelet</comment>
+ <comment xml:lang="fur">video Wavelet</comment>
+ <comment xml:lang="fr">vidéo Wavelet</comment>
+ <comment xml:lang="fo">Wavelet video</comment>
+ <comment xml:lang="fi">Wavelet-video</comment>
+ <comment xml:lang="eu">Wavelet bideoa</comment>
+ <comment xml:lang="es">vídeo Wavelet</comment>
+ <comment xml:lang="eo">Wavelet-video</comment>
+ <comment xml:lang="en_GB">Wavelet video</comment>
+ <comment xml:lang="el">Βίντεο Wavelet</comment>
+ <comment xml:lang="de">Wavelet-Video</comment>
+ <comment xml:lang="da">Wavelet-video</comment>
+ <comment xml:lang="cy">Fideo Wavelet</comment>
+ <comment xml:lang="cs">video Wavelet</comment>
+ <comment xml:lang="ca">vídeo Wavelet</comment>
+ <comment xml:lang="bg">Видео — Wavelet</comment>
+ <comment xml:lang="be@latin">Videa Wavelet</comment>
+ <comment xml:lang="be">відэа Wavelet</comment>
+ <comment xml:lang="az">Wavelet video faylı</comment>
+ <comment xml:lang="ast">Videu en Wavelet</comment>
+ <comment xml:lang="ar">فيديو Wavelet</comment>
+ <comment xml:lang="af">Wavelet-video</comment>
</mime-type>
<mime-type type="video/x-anim">
<comment>ANIM animation</comment>
- <comment xml:lang="af">ANIM-animasie</comment>
- <comment xml:lang="ar">تحريكة ANIM</comment>
- <comment xml:lang="az">ANIM animasiyası</comment>
- <comment xml:lang="be-Latn">Animacyja ANIM</comment>
- <comment xml:lang="bg">Анимация — ANIM</comment>
- <comment xml:lang="ca">animació ANIM</comment>
- <comment xml:lang="cs">animace ANIM</comment>
- <comment xml:lang="cy">Animeiddiad ANIM</comment>
- <comment xml:lang="da">ANIM-animation</comment>
- <comment xml:lang="de">ANIM-Animation</comment>
- <comment xml:lang="el">Κινούμενο σχέδιο ANIM</comment>
- <comment xml:lang="en-GB">ANIM animation</comment>
- <comment xml:lang="eo">ANIM-animacio</comment>
- <comment xml:lang="es">animación ANIM</comment>
- <comment xml:lang="eu">ANIM animazioa</comment>
- <comment xml:lang="fi">ANIM-animaatio</comment>
- <comment xml:lang="fo">ANIM teknmyndagerð</comment>
- <comment xml:lang="fr">animation ANIM</comment>
- <comment xml:lang="fur">animazion ANIM</comment>
- <comment xml:lang="ga">beochan ANIM</comment>
- <comment xml:lang="gl">animación ANIM</comment>
- <comment xml:lang="he">הנפשת ANIM</comment>
- <comment xml:lang="hr">ANIM animacija</comment>
- <comment xml:lang="hu">ANIM-animáció</comment>
- <comment xml:lang="ia">Animation ANIM</comment>
- <comment xml:lang="id">Animasi ANIM</comment>
- <comment xml:lang="it">Animazione ANIM</comment>
- <comment xml:lang="ja">ANIM アニメーション</comment>
- <comment xml:lang="ka">ANIM ანიმაცია</comment>
- <comment xml:lang="kk">ANIM анимациясы</comment>
- <comment xml:lang="ko">ANIM 동화상</comment>
- <comment xml:lang="lt">ANIM animacija</comment>
- <comment xml:lang="lv">ANIM animācija</comment>
- <comment xml:lang="ms">Animasi ANIM</comment>
- <comment xml:lang="nb">ANIM-animasjon</comment>
- <comment xml:lang="nl">ANIM-animatie</comment>
- <comment xml:lang="nn">ANIM-animasjon</comment>
- <comment xml:lang="oc">animacion ANIM</comment>
- <comment xml:lang="pl">Plik animacji ANIM</comment>
- <comment xml:lang="pt">animação ANIM</comment>
- <comment xml:lang="pt-BR">Animação ANIM</comment>
- <comment xml:lang="ro">Animație ANIM</comment>
- <comment xml:lang="ru">Анимация ANIM</comment>
- <comment xml:lang="sk">Animácia ANIM</comment>
- <comment xml:lang="sl">Datoteka animacije ANIM</comment>
- <comment xml:lang="sq">Animim ANIM</comment>
- <comment xml:lang="sr">АНИМ анимација</comment>
- <comment xml:lang="sv">ANIM-animering</comment>
- <comment xml:lang="tr">ANIM canlandırması</comment>
- <comment xml:lang="uk">анімація ANIM</comment>
+ <comment xml:lang="zh_TW">ANIM 動畫</comment>
+ <comment xml:lang="zh_CN">ANIM 动画</comment>
<comment xml:lang="vi">Hoạt ảnh ANIM</comment>
- <comment xml:lang="zh-CN">ANIM 动画</comment>
- <comment xml:lang="zh-TW">ANIM 動畫</comment>
+ <comment xml:lang="uk">анімація ANIM</comment>
+ <comment xml:lang="tr">ANIM canlandırması</comment>
+ <comment xml:lang="sv">ANIM-animering</comment>
+ <comment xml:lang="sr">АНИМ анимација</comment>
+ <comment xml:lang="sq">animacion ANIM</comment>
+ <comment xml:lang="sl">Datoteka animacije ANIM</comment>
+ <comment xml:lang="si">ANIM සජීවිකරණය</comment>
+ <comment xml:lang="sk">Animácia ANIM</comment>
+ <comment xml:lang="ru">Анимация ANIM</comment>
+ <comment xml:lang="ro">Animație ANIM</comment>
+ <comment xml:lang="pt_BR">Animação ANIM</comment>
+ <comment xml:lang="pt">animação ANIM</comment>
+ <comment xml:lang="pl">Plik animacji ANIM</comment>
+ <comment xml:lang="oc">animacion ANIM</comment>
+ <comment xml:lang="nn">ANIM-animasjon</comment>
+ <comment xml:lang="nl">ANIM-animatie</comment>
+ <comment xml:lang="nb">ANIM-animasjon</comment>
+ <comment xml:lang="ms">Animasi ANIM</comment>
+ <comment xml:lang="lv">ANIM animācija</comment>
+ <comment xml:lang="lt">ANIM animacija</comment>
+ <comment xml:lang="ko">ANIM 동화상</comment>
+ <comment xml:lang="kk">ANIM анимациясы</comment>
+ <comment xml:lang="ka">ANIM ანიმაცია</comment>
+ <comment xml:lang="ja">ANIM アニメーション</comment>
+ <comment xml:lang="it">Animazione ANIM</comment>
+ <comment xml:lang="is">ANIM hreyfimynd</comment>
+ <comment xml:lang="id">Animasi ANIM</comment>
+ <comment xml:lang="ia">Animation ANIM</comment>
+ <comment xml:lang="hu">ANIM-animáció</comment>
+ <comment xml:lang="hr">ANIM animacija</comment>
+ <comment xml:lang="he">הנפשת ANIM</comment>
+ <comment xml:lang="gl">animación ANIM</comment>
+ <comment xml:lang="ga">beochan ANIM</comment>
+ <comment xml:lang="fur">animazion ANIM</comment>
+ <comment xml:lang="fr">animation ANIM</comment>
+ <comment xml:lang="fo">ANIM teknmyndagerð</comment>
+ <comment xml:lang="fi">ANIM-animaatio</comment>
+ <comment xml:lang="eu">ANIM animazioa</comment>
+ <comment xml:lang="es">animación ANIM</comment>
+ <comment xml:lang="eo">ANIM-animacio</comment>
+ <comment xml:lang="en_GB">ANIM animation</comment>
+ <comment xml:lang="el">Κινούμενο σχέδιο ANIM</comment>
+ <comment xml:lang="de">ANIM-Animation</comment>
+ <comment xml:lang="da">ANIM-animation</comment>
+ <comment xml:lang="cy">Animeiddiad ANIM</comment>
+ <comment xml:lang="cs">animace ANIM</comment>
+ <comment xml:lang="ca">animació ANIM</comment>
+ <comment xml:lang="bg">Анимация — ANIM</comment>
+ <comment xml:lang="be@latin">Animacyja ANIM</comment>
+ <comment xml:lang="be">анімацыя ANIM</comment>
+ <comment xml:lang="az">ANIM animasiyası</comment>
+ <comment xml:lang="ar">تحريكة ANIM</comment>
+ <comment xml:lang="af">ANIM-animasie</comment>
<glob pattern="*.anim[1-9j]"/>
</mime-type>
<mime-type type="video/x-flic">
<comment>FLIC animation</comment>
- <comment xml:lang="af">FLIC-animasie</comment>
- <comment xml:lang="ar">تحريكة FLIC</comment>
- <comment xml:lang="be-Latn">Animacyja FLIC</comment>
- <comment xml:lang="bg">Анимация — FLIC</comment>
- <comment xml:lang="ca">animació FLIC</comment>
- <comment xml:lang="cs">animace FLIC</comment>
- <comment xml:lang="da">FLIC-animation</comment>
- <comment xml:lang="de">FLIC-Animation</comment>
- <comment xml:lang="el">Κινούμενο σχέδιο FLIC</comment>
- <comment xml:lang="en-GB">FLIC animation</comment>
- <comment xml:lang="es">animación FLIC</comment>
- <comment xml:lang="eu">FLIC animazioa</comment>
- <comment xml:lang="fi">FLIC-animaatio</comment>
- <comment xml:lang="fo">FLIC teknimyndagerð</comment>
- <comment xml:lang="fr">animation FLIC</comment>
- <comment xml:lang="fur">animazion FLIC</comment>
- <comment xml:lang="ga">beochan FLIC</comment>
- <comment xml:lang="gl">animación FLIC</comment>
- <comment xml:lang="he">הנפשת FLIC</comment>
- <comment xml:lang="hr">FLIC animacija</comment>
- <comment xml:lang="hu">FLIC animáció</comment>
- <comment xml:lang="ia">Animation FLIC</comment>
- <comment xml:lang="id">Animasi FLIC</comment>
- <comment xml:lang="it">Animazione FLIC</comment>
- <comment xml:lang="ja">FLIC アニメーション</comment>
- <comment xml:lang="ka">FLIC ანიმაცია</comment>
- <comment xml:lang="kk">FLIC анимациясы</comment>
- <comment xml:lang="ko">FLIC 동화상</comment>
- <comment xml:lang="lt">FLIC animacija</comment>
- <comment xml:lang="lv">FLIC animācija</comment>
- <comment xml:lang="nb">FLIC-animasjon</comment>
- <comment xml:lang="nl">FLIC-animatie</comment>
- <comment xml:lang="nn">FLIC-animasjon</comment>
- <comment xml:lang="oc">animacion FLIC</comment>
- <comment xml:lang="pl">Plik animacji FLIC</comment>
- <comment xml:lang="pt">animação FLIC</comment>
- <comment xml:lang="pt-BR">Animação FLIC</comment>
- <comment xml:lang="ro">Animație FLIC</comment>
- <comment xml:lang="ru">Анимация FLIC</comment>
- <comment xml:lang="sk">Animácia FLIC</comment>
- <comment xml:lang="sl">Datoteka animacije FLIC</comment>
- <comment xml:lang="sq">Animim FLIC</comment>
- <comment xml:lang="sr">ФЛИЦ анимација</comment>
- <comment xml:lang="sv">FLIC-animering</comment>
- <comment xml:lang="tr">FLIC animasyonu</comment>
- <comment xml:lang="uk">анімація FLIC</comment>
+ <comment xml:lang="zh_TW">FLIC 動畫</comment>
+ <comment xml:lang="zh_CN">FLIC 动画</comment>
<comment xml:lang="vi">Hoạt ảnh FLIC</comment>
- <comment xml:lang="zh-CN">FLIC 动画</comment>
- <comment xml:lang="zh-TW">FLIC 動畫</comment>
+ <comment xml:lang="uk">анімація FLIC</comment>
+ <comment xml:lang="tr">FLIC animasyonu</comment>
+ <comment xml:lang="sv">FLIC-animering</comment>
+ <comment xml:lang="sr">ФЛИЦ анимација</comment>
+ <comment xml:lang="sq">animacion FLIC</comment>
+ <comment xml:lang="sl">Datoteka animacije FLIC</comment>
+ <comment xml:lang="si">FLIC සජීවිකරණය</comment>
+ <comment xml:lang="sk">Animácia FLIC</comment>
+ <comment xml:lang="ru">Анимация FLIC</comment>
+ <comment xml:lang="ro">Animație FLIC</comment>
+ <comment xml:lang="pt_BR">Animação FLIC</comment>
+ <comment xml:lang="pt">animação FLIC</comment>
+ <comment xml:lang="pl">Plik animacji FLIC</comment>
+ <comment xml:lang="oc">animacion FLIC</comment>
+ <comment xml:lang="nn">FLIC-animasjon</comment>
+ <comment xml:lang="nl">FLIC-animatie</comment>
+ <comment xml:lang="nb">FLIC-animasjon</comment>
+ <comment xml:lang="lv">FLIC animācija</comment>
+ <comment xml:lang="lt">FLIC animacija</comment>
+ <comment xml:lang="ko">FLIC 동화상</comment>
+ <comment xml:lang="kk">FLIC анимациясы</comment>
+ <comment xml:lang="ka">FLIC ანიმაცია</comment>
+ <comment xml:lang="ja">FLIC アニメーション</comment>
+ <comment xml:lang="it">Animazione FLIC</comment>
+ <comment xml:lang="is">FLIC-hreyfimynd</comment>
+ <comment xml:lang="id">Animasi FLIC</comment>
+ <comment xml:lang="ia">Animation FLIC</comment>
+ <comment xml:lang="hu">FLIC animáció</comment>
+ <comment xml:lang="hr">FLIC animacija</comment>
+ <comment xml:lang="he">הנפשת FLIC</comment>
+ <comment xml:lang="gl">animación FLIC</comment>
+ <comment xml:lang="ga">beochan FLIC</comment>
+ <comment xml:lang="fur">animazion FLIC</comment>
+ <comment xml:lang="fr">animation FLIC</comment>
+ <comment xml:lang="fo">FLIC teknimyndagerð</comment>
+ <comment xml:lang="fi">FLIC-animaatio</comment>
+ <comment xml:lang="eu">FLIC animazioa</comment>
+ <comment xml:lang="es">animación FLIC</comment>
+ <comment xml:lang="en_GB">FLIC animation</comment>
+ <comment xml:lang="el">Κινούμενο σχέδιο FLIC</comment>
+ <comment xml:lang="de">FLIC-Animation</comment>
+ <comment xml:lang="da">FLIC-animation</comment>
+ <comment xml:lang="cs">animace FLIC</comment>
+ <comment xml:lang="ca">animació FLIC</comment>
+ <comment xml:lang="bg">Анимация — FLIC</comment>
+ <comment xml:lang="be@latin">Animacyja FLIC</comment>
+ <comment xml:lang="be">анімацыя FLIC</comment>
+ <comment xml:lang="ar">تحريكة FLIC</comment>
+ <comment xml:lang="af">FLIC-animasie</comment>
<alias type="video/fli"/>
<alias type="video/x-fli"/>
- <magic priority="50">
+ <magic>
<match type="little16" value="0xAF11" offset="0"/>
<match type="little16" value="0xAF12" offset="0"/>
</magic>
@@ -39532,57 +40707,60 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-hwp">
<comment>Haansoft Hangul document</comment>
- <comment xml:lang="af">Haansoft Hangul-dokument</comment>
- <comment xml:lang="ar">مستند Haansoft Hangul</comment>
- <comment xml:lang="ast">Documentu de Haansoft Hangul</comment>
- <comment xml:lang="be-Latn">Dakument Haansoft Hangul</comment>
- <comment xml:lang="bg">Документ — Haansoft Hangul</comment>
- <comment xml:lang="ca">document d'Haansoft Hangul</comment>
- <comment xml:lang="cs">dokument Haansoft Hangul</comment>
- <comment xml:lang="da">Haansoft Hangul-dokument</comment>
- <comment xml:lang="de">Haansoft-Hangul-Dokument</comment>
- <comment xml:lang="el">Έγγραφο Haansoft Hangul</comment>
- <comment xml:lang="en-GB">Haansoft Hangul document</comment>
- <comment xml:lang="es">documento de Haansoft Hangul</comment>
- <comment xml:lang="eu">Haansoft Hangul dokumentua</comment>
- <comment xml:lang="fi">Haansoft Hangul -asiakirja</comment>
- <comment xml:lang="fo">Haansoft Hangul skjal</comment>
- <comment xml:lang="fr">document Haansoft Hangul</comment>
- <comment xml:lang="fur">document Haansoft Hangul</comment>
- <comment xml:lang="ga">cáipéis Haansoft Hangul</comment>
- <comment xml:lang="gl">documento de Haansoft Hangul</comment>
- <comment xml:lang="he">מסמך Haansoft Hangul</comment>
- <comment xml:lang="hr">Haansoft Hangul dokument</comment>
- <comment xml:lang="hu">Haansoft hangul dokumentum</comment>
- <comment xml:lang="ia">Documento Haansoft Hangul</comment>
- <comment xml:lang="id">Dokumen Haansoft Hangul</comment>
- <comment xml:lang="it">Documento Haansoft Hangul</comment>
- <comment xml:lang="ja">Haansoft Hangul ドキュメント</comment>
- <comment xml:lang="kk">Haansoft Hangul құжаты</comment>
- <comment xml:lang="ko">한소프트 한글 문서</comment>
- <comment xml:lang="lt">Haansoft Hangul dokumentas</comment>
- <comment xml:lang="lv">Haansoft Hangul dokuments</comment>
- <comment xml:lang="nb">Haansoft Hangul-dokument</comment>
- <comment xml:lang="nl">Haansoft Hangul-document</comment>
- <comment xml:lang="nn">Haansoft Hangul-dokument</comment>
- <comment xml:lang="oc">document Haansoft Hangul</comment>
- <comment xml:lang="pl">Dokument Haansoft Hangul</comment>
- <comment xml:lang="pt">documento Haansoft Hangul</comment>
- <comment xml:lang="pt-BR">Documento do Haansoft Hangul</comment>
- <comment xml:lang="ro">Document Haansoft Hangul</comment>
- <comment xml:lang="ru">Документ Haansoft Hangul</comment>
- <comment xml:lang="sk">Dokument Haansoft Hangul</comment>
- <comment xml:lang="sl">Dokument Haansoft Hangul</comment>
- <comment xml:lang="sq">Dokument Haansoft Hangul</comment>
- <comment xml:lang="sr">Хансофт Хангул документ</comment>
- <comment xml:lang="sv">Haansoft Hangul-dokument</comment>
- <comment xml:lang="tr">Haansoft Hangul belgesi</comment>
- <comment xml:lang="uk">документ Haansoft Hangul</comment>
+ <comment xml:lang="zh_TW">Haansoft 韓文文件</comment>
+ <comment xml:lang="zh_CN">Haansoft Hangul 文档</comment>
<comment xml:lang="vi">Tài liệu Hangul Haansoft</comment>
- <comment xml:lang="zh-CN">Haansoft Hangul 文档</comment>
- <comment xml:lang="zh-TW">Haansoft 韓文文件</comment>
+ <comment xml:lang="uk">документ Haansoft Hangul</comment>
+ <comment xml:lang="tr">Haansoft Hangul belgesi</comment>
+ <comment xml:lang="sv">Haansoft Hangul-dokument</comment>
+ <comment xml:lang="sr">Хансофт Хангул документ</comment>
+ <comment xml:lang="sq">dokument Haansoft Hangul</comment>
+ <comment xml:lang="sl">Dokument Haansoft Hangul</comment>
+ <comment xml:lang="si">Haansoft Hangul ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument Haansoft Hangul</comment>
+ <comment xml:lang="ru">Документ Haansoft Hangul</comment>
+ <comment xml:lang="ro">Document Haansoft Hangul</comment>
+ <comment xml:lang="pt_BR">Documento do Haansoft Hangul</comment>
+ <comment xml:lang="pt">documento Haansoft Hangul</comment>
+ <comment xml:lang="pl">Dokument Haansoft Hangul</comment>
+ <comment xml:lang="oc">document Haansoft Hangul</comment>
+ <comment xml:lang="nn">Haansoft Hangul-dokument</comment>
+ <comment xml:lang="nl">Haansoft Hangul-document</comment>
+ <comment xml:lang="nb">Haansoft Hangul-dokument</comment>
+ <comment xml:lang="lv">Haansoft Hangul dokuments</comment>
+ <comment xml:lang="lt">Haansoft Hangul dokumentas</comment>
+ <comment xml:lang="ko">한소프트 한글 문서</comment>
+ <comment xml:lang="kk">Haansoft Hangul құжаты</comment>
+ <comment xml:lang="ja">Haansoft Hangul ドキュメント</comment>
+ <comment xml:lang="it">Documento Haansoft Hangul</comment>
+ <comment xml:lang="is">Haansoft Hangul skjal</comment>
+ <comment xml:lang="id">Dokumen Haansoft Hangul</comment>
+ <comment xml:lang="ia">Documento Haansoft Hangul</comment>
+ <comment xml:lang="hu">Haansoft hangul dokumentum</comment>
+ <comment xml:lang="hr">Haansoft Hangul dokument</comment>
+ <comment xml:lang="he">מסמך Haansoft Hangul</comment>
+ <comment xml:lang="gl">documento de Haansoft Hangul</comment>
+ <comment xml:lang="ga">cáipéis Haansoft Hangul</comment>
+ <comment xml:lang="fur">document Haansoft Hangul</comment>
+ <comment xml:lang="fr">document Haansoft Hangul</comment>
+ <comment xml:lang="fo">Haansoft Hangul skjal</comment>
+ <comment xml:lang="fi">Haansoft Hangul -asiakirja</comment>
+ <comment xml:lang="eu">Haansoft Hangul dokumentua</comment>
+ <comment xml:lang="es">documento de Haansoft Hangul</comment>
+ <comment xml:lang="en_GB">Haansoft Hangul document</comment>
+ <comment xml:lang="el">Έγγραφο Haansoft Hangul</comment>
+ <comment xml:lang="de">Haansoft-Hangul-Dokument</comment>
+ <comment xml:lang="da">Haansoft Hangul-dokument</comment>
+ <comment xml:lang="cs">dokument Haansoft Hangul</comment>
+ <comment xml:lang="ca">document d'Haansoft Hangul</comment>
+ <comment xml:lang="bg">Документ — Haansoft Hangul</comment>
+ <comment xml:lang="be@latin">Dakument Haansoft Hangul</comment>
+ <comment xml:lang="be">дакумент Haansoft Hangul</comment>
+ <comment xml:lang="ast">Documentu de Haansoft Hangul</comment>
+ <comment xml:lang="ar">مستند Haansoft Hangul</comment>
+ <comment xml:lang="af">Haansoft Hangul-dokument</comment>
<generic-icon name="x-office-document"/>
- <magic priority="50">
+ <magic>
<match type="string" value="HWP Document File" offset="0"/>
</magic>
<glob pattern="*.hwp"/>
@@ -39590,349 +40768,367 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-hwt">
<comment>Haansoft Hangul document template</comment>
- <comment xml:lang="af">Haansoft Hangul-dokumentsjabloon</comment>
- <comment xml:lang="ar">قالب مستند Haansoft Hangul</comment>
- <comment xml:lang="ast">Plantía de documentu de Haansoft Hangul</comment>
- <comment xml:lang="be-Latn">Šablon dakumentu Haansoft Hangul</comment>
- <comment xml:lang="bg">Шаблон за документи — Haansoft Hangul</comment>
- <comment xml:lang="ca">plantilla de document d'Haansoft Hangul</comment>
- <comment xml:lang="cs">šablona dokumentu Haansoft Hangul</comment>
- <comment xml:lang="da">Haansoft Hangul-dokumentskabelon</comment>
- <comment xml:lang="de">Haansoft-Hangul-Dokumentvorlage</comment>
- <comment xml:lang="el">Πρότυπο εγγράφου Haansoft Hangul</comment>
- <comment xml:lang="en-GB">Haansoft Hangul document template</comment>
- <comment xml:lang="es">plantilla de documento de Haansoft Hangul</comment>
- <comment xml:lang="eu">Haansoft Hangul dokumentuaren txantiloia</comment>
- <comment xml:lang="fi">Haansoft Hangul -asiakirjamalli</comment>
- <comment xml:lang="fo">Haansoft Hangul skjalaformur</comment>
- <comment xml:lang="fr">modèle de document Haansoft Hangul</comment>
- <comment xml:lang="fur">model document Haansoft Hangul</comment>
- <comment xml:lang="ga">teimpléad cháipéis Haansoft Hangul</comment>
- <comment xml:lang="gl">modelo de documento de Haansoft Hangul</comment>
- <comment xml:lang="he">תבנית מסמך של Haansoft Hangul</comment>
- <comment xml:lang="hr">Haansoft Hangul predložak dokumenta</comment>
- <comment xml:lang="hu">Haansoft hangul dokumentumsablon</comment>
- <comment xml:lang="ia">Patrono de documento Haansoft Hangul</comment>
- <comment xml:lang="id">Templat dokumen Haansoft Hangul</comment>
- <comment xml:lang="it">Modello documento Haansoft Hangul</comment>
- <comment xml:lang="ja">Haansoft Hangul ドキュメントテンプレート</comment>
- <comment xml:lang="kk">Haansoft Hangul құжат үлгісі</comment>
- <comment xml:lang="ko">한소프트 한글 문서 서식</comment>
- <comment xml:lang="lt">Haansoft Hangul dokumento šablonas</comment>
- <comment xml:lang="lv">Haansoft Hangul dokumentu veidne</comment>
- <comment xml:lang="nb">Haansoft Hangul-dokumentmal</comment>
- <comment xml:lang="nl">Haansoft Hangul-documentsjabloon</comment>
- <comment xml:lang="nn">Haansoft Hangul-dokumentmal</comment>
- <comment xml:lang="oc">modèl de document Haansoft Hangul</comment>
- <comment xml:lang="pl">Szablon dokumentu Haansoft Hangul</comment>
- <comment xml:lang="pt">modelo de documento Haansoft Hangul</comment>
- <comment xml:lang="pt-BR">Modelo de documento do Haansoft Hangul</comment>
- <comment xml:lang="ro">Document șablon Haansoft Hangul</comment>
- <comment xml:lang="ru">Шаблон документа Haansoft Hangul</comment>
- <comment xml:lang="sk">Šablóna dokumentu Haansoft Hangul</comment>
- <comment xml:lang="sl">Predloga dokumenta Haansoft Hangul</comment>
- <comment xml:lang="sq">Model dokumenti Haansoft Hangul</comment>
- <comment xml:lang="sr">шаблон Хансофт Хангул документа</comment>
- <comment xml:lang="sv">Haansoft Hangul-dokumentmall</comment>
- <comment xml:lang="tr">Haansoft Hangul belge şablonu</comment>
- <comment xml:lang="uk">шаблон документа Haansoft Hangul</comment>
+ <comment xml:lang="zh_TW">Haansoft 韓文文件範本</comment>
+ <comment xml:lang="zh_CN">Haansoft Hangul 文档模板</comment>
<comment xml:lang="vi">Mẫu tài liệu Hangul Haansoft</comment>
- <comment xml:lang="zh-CN">Haansoft Hangul 文档模板</comment>
- <comment xml:lang="zh-TW">Haansoft 韓文文件範本</comment>
+ <comment xml:lang="uk">шаблон документа Haansoft Hangul</comment>
+ <comment xml:lang="tr">Haansoft Hangul belge şablonu</comment>
+ <comment xml:lang="sv">Haansoft Hangul-dokumentmall</comment>
+ <comment xml:lang="sr">шаблон Хансофт Хангул документа</comment>
+ <comment xml:lang="sq">gjedhe dokumentesh Haansoft Hangul</comment>
+ <comment xml:lang="sl">Predloga dokumenta Haansoft Hangul</comment>
+ <comment xml:lang="si">Haansoft Hangul ලේඛන අච්චුව</comment>
+ <comment xml:lang="sk">Šablóna dokumentu Haansoft Hangul</comment>
+ <comment xml:lang="ru">Шаблон документа Haansoft Hangul</comment>
+ <comment xml:lang="ro">Document șablon Haansoft Hangul</comment>
+ <comment xml:lang="pt_BR">Modelo de documento do Haansoft Hangul</comment>
+ <comment xml:lang="pt">modelo de documento Haansoft Hangul</comment>
+ <comment xml:lang="pl">Szablon dokumentu Haansoft Hangul</comment>
+ <comment xml:lang="oc">modèl de document Haansoft Hangul</comment>
+ <comment xml:lang="nn">Haansoft Hangul-dokumentmal</comment>
+ <comment xml:lang="nl">Haansoft Hangul-documentsjabloon</comment>
+ <comment xml:lang="nb">Haansoft Hangul-dokumentmal</comment>
+ <comment xml:lang="lv">Haansoft Hangul dokumentu veidne</comment>
+ <comment xml:lang="lt">Haansoft Hangul dokumento šablonas</comment>
+ <comment xml:lang="ko">한소프트 한글 문서 서식</comment>
+ <comment xml:lang="kk">Haansoft Hangul құжат үлгісі</comment>
+ <comment xml:lang="ja">Haansoft Hangul ドキュメントテンプレート</comment>
+ <comment xml:lang="it">Modello documento Haansoft Hangul</comment>
+ <comment xml:lang="is">Haansoft Hangul sniðskjal</comment>
+ <comment xml:lang="id">Templat dokumen Haansoft Hangul</comment>
+ <comment xml:lang="ia">Patrono de documento Haansoft Hangul</comment>
+ <comment xml:lang="hu">Haansoft hangul dokumentumsablon</comment>
+ <comment xml:lang="hr">Haansoft Hangul predložak dokumenta</comment>
+ <comment xml:lang="he">תבנית מסמך של Haansoft Hangul</comment>
+ <comment xml:lang="gl">modelo de documento de Haansoft Hangul</comment>
+ <comment xml:lang="ga">teimpléad cháipéis Haansoft Hangul</comment>
+ <comment xml:lang="fur">model document Haansoft Hangul</comment>
+ <comment xml:lang="fr">modèle de document Haansoft Hangul</comment>
+ <comment xml:lang="fo">Haansoft Hangul skjalaformur</comment>
+ <comment xml:lang="fi">Haansoft Hangul -asiakirjamalli</comment>
+ <comment xml:lang="eu">Haansoft Hangul dokumentuaren txantiloia</comment>
+ <comment xml:lang="es">plantilla de documento de Haansoft Hangul</comment>
+ <comment xml:lang="en_GB">Haansoft Hangul document template</comment>
+ <comment xml:lang="el">Πρότυπο εγγράφου Haansoft Hangul</comment>
+ <comment xml:lang="de">Haansoft-Hangul-Dokumentvorlage</comment>
+ <comment xml:lang="da">Haansoft Hangul-dokumentskabelon</comment>
+ <comment xml:lang="cs">šablona dokumentu Haansoft Hangul</comment>
+ <comment xml:lang="ca">plantilla de document d'Haansoft Hangul</comment>
+ <comment xml:lang="bg">Шаблон за документи — Haansoft Hangul</comment>
+ <comment xml:lang="be@latin">Šablon dakumentu Haansoft Hangul</comment>
+ <comment xml:lang="be">шаблон дакумента Haansoft Hangul</comment>
+ <comment xml:lang="ast">Plantía de documentu de Haansoft Hangul</comment>
+ <comment xml:lang="ar">قالب مستند Haansoft Hangul</comment>
+ <comment xml:lang="af">Haansoft Hangul-dokumentsjabloon</comment>
<generic-icon name="x-office-document"/>
<glob pattern="*.hwt"/>
<alias type="application/vnd.haansoft-hwt"/>
</mime-type>
<mime-type type="video/x-mng">
<comment>MNG animation</comment>
- <comment xml:lang="af">MNG-animasie</comment>
- <comment xml:lang="ar">تحريكة MNG</comment>
- <comment xml:lang="be-Latn">Animacyja MNG</comment>
- <comment xml:lang="bg">Анимация — MNG</comment>
- <comment xml:lang="ca">animació MNG</comment>
- <comment xml:lang="cs">animace MNG</comment>
- <comment xml:lang="da">MNG-animation</comment>
- <comment xml:lang="de">MNG-Animation</comment>
- <comment xml:lang="el">Κινούμενο σχέδιο MNG</comment>
- <comment xml:lang="en-GB">MNG animation</comment>
- <comment xml:lang="eo">MNG-animacio</comment>
- <comment xml:lang="es">animación MNG</comment>
- <comment xml:lang="eu">MNG animazioa</comment>
- <comment xml:lang="fi">MNG-animaatio</comment>
- <comment xml:lang="fo">MNG teknimyndagerð</comment>
- <comment xml:lang="fr">animation MNG</comment>
- <comment xml:lang="fur">animazion MNG</comment>
- <comment xml:lang="ga">beochan MNG</comment>
- <comment xml:lang="gl">animación MNG</comment>
- <comment xml:lang="he">הנפשת MNG</comment>
- <comment xml:lang="hr">MNG animacija</comment>
- <comment xml:lang="hu">MNG-animáció</comment>
- <comment xml:lang="ia">Animation MNG</comment>
- <comment xml:lang="id">Animasi MNG</comment>
- <comment xml:lang="it">Animazione MNG</comment>
- <comment xml:lang="ja">MNG アニメーション</comment>
- <comment xml:lang="kk">MNG анимациясы</comment>
- <comment xml:lang="ko">MNG 동화상</comment>
- <comment xml:lang="lt">MNG animacija</comment>
- <comment xml:lang="lv">MNG animācija</comment>
- <comment xml:lang="ms">Animasi MNG</comment>
- <comment xml:lang="nb">MNG-animasjon</comment>
- <comment xml:lang="nl">MNG-animatie</comment>
- <comment xml:lang="nn">MNG-animasjon</comment>
- <comment xml:lang="oc">animacion MNG</comment>
- <comment xml:lang="pl">Animacja MNG</comment>
- <comment xml:lang="pt">animação MNG</comment>
- <comment xml:lang="pt-BR">Animação MNG</comment>
- <comment xml:lang="ro">Animație MNG</comment>
- <comment xml:lang="ru">Анимация MNG</comment>
- <comment xml:lang="sk">Animácia MNG</comment>
- <comment xml:lang="sl">Datoteka animacije MNG</comment>
- <comment xml:lang="sq">Animim MNG</comment>
- <comment xml:lang="sr">МНГ анимација</comment>
- <comment xml:lang="sv">MNG-animering</comment>
- <comment xml:lang="tr">MNG canlandırması</comment>
- <comment xml:lang="uk">анімація MNG</comment>
+ <comment xml:lang="zh_TW">MNG 動畫</comment>
+ <comment xml:lang="zh_CN">MNG 动画</comment>
<comment xml:lang="vi">Hoạt ảnh MNG</comment>
- <comment xml:lang="zh-CN">MNG 动画</comment>
- <comment xml:lang="zh-TW">MNG 動畫</comment>
+ <comment xml:lang="uk">анімація MNG</comment>
+ <comment xml:lang="tr">MNG canlandırması</comment>
+ <comment xml:lang="sv">MNG-animering</comment>
+ <comment xml:lang="sr">МНГ анимација</comment>
+ <comment xml:lang="sq">animacion MNG</comment>
+ <comment xml:lang="sl">Datoteka animacije MNG</comment>
+ <comment xml:lang="si">MNG සජීවිකරණය</comment>
+ <comment xml:lang="sk">Animácia MNG</comment>
+ <comment xml:lang="ru">Анимация MNG</comment>
+ <comment xml:lang="ro">Animație MNG</comment>
+ <comment xml:lang="pt_BR">Animação MNG</comment>
+ <comment xml:lang="pt">animação MNG</comment>
+ <comment xml:lang="pl">Animacja MNG</comment>
+ <comment xml:lang="oc">animacion MNG</comment>
+ <comment xml:lang="nn">MNG-animasjon</comment>
+ <comment xml:lang="nl">MNG-animatie</comment>
+ <comment xml:lang="nb">MNG-animasjon</comment>
+ <comment xml:lang="ms">Animasi MNG</comment>
+ <comment xml:lang="lv">MNG animācija</comment>
+ <comment xml:lang="lt">MNG animacija</comment>
+ <comment xml:lang="ko">MNG 동화상</comment>
+ <comment xml:lang="kk">MNG анимациясы</comment>
+ <comment xml:lang="ja">MNG アニメーション</comment>
+ <comment xml:lang="it">Animazione MNG</comment>
+ <comment xml:lang="is">MNG hreyfimynd</comment>
+ <comment xml:lang="id">Animasi MNG</comment>
+ <comment xml:lang="ia">Animation MNG</comment>
+ <comment xml:lang="hu">MNG-animáció</comment>
+ <comment xml:lang="hr">MNG animacija</comment>
+ <comment xml:lang="he">הנפשת MNG</comment>
+ <comment xml:lang="gl">animación MNG</comment>
+ <comment xml:lang="ga">beochan MNG</comment>
+ <comment xml:lang="fur">animazion MNG</comment>
+ <comment xml:lang="fr">animation MNG</comment>
+ <comment xml:lang="fo">MNG teknimyndagerð</comment>
+ <comment xml:lang="fi">MNG-animaatio</comment>
+ <comment xml:lang="eu">MNG animazioa</comment>
+ <comment xml:lang="es">animación MNG</comment>
+ <comment xml:lang="eo">MNG-animacio</comment>
+ <comment xml:lang="en_GB">MNG animation</comment>
+ <comment xml:lang="el">Κινούμενο σχέδιο MNG</comment>
+ <comment xml:lang="de">MNG-Animation</comment>
+ <comment xml:lang="da">MNG-animation</comment>
+ <comment xml:lang="cs">animace MNG</comment>
+ <comment xml:lang="ca">animació MNG</comment>
+ <comment xml:lang="bg">Анимация — MNG</comment>
+ <comment xml:lang="be@latin">Animacyja MNG</comment>
+ <comment xml:lang="be">анімацыя MNG</comment>
+ <comment xml:lang="ar">تحريكة MNG</comment>
+ <comment xml:lang="af">MNG-animasie</comment>
<acronym>MNG</acronym>
<expanded-acronym>Multiple-Image Network Graphics</expanded-acronym>
- <magic priority="50">
+ <magic>
<match type="string" value="\x8AMNG\x0D\x0A\x1A\x0A" offset="0"/>
</magic>
<glob pattern="*.mng"/>
</mime-type>
<mime-type type="application/vnd.ms-asf">
<comment>ASF video</comment>
- <comment xml:lang="af">ASF-video</comment>
- <comment xml:lang="ar">ASF مرئي</comment>
- <comment xml:lang="ast">Videu n'ASF</comment>
- <comment xml:lang="be-Latn">Videa ASF</comment>
- <comment xml:lang="bg">Видео — ASF</comment>
- <comment xml:lang="ca">vídeo ASF</comment>
- <comment xml:lang="cs">video ASF</comment>
- <comment xml:lang="da">ASF-video</comment>
- <comment xml:lang="de">ASF-Video</comment>
- <comment xml:lang="el">Βίντεο ASF</comment>
- <comment xml:lang="en-GB">ASF video</comment>
- <comment xml:lang="eo">ASF-video</comment>
- <comment xml:lang="es">vídeo ASF</comment>
- <comment xml:lang="eu">ASF bideoa</comment>
- <comment xml:lang="fi">ASF-video</comment>
- <comment xml:lang="fo">ASF video</comment>
- <comment xml:lang="fr">vidéo ASF</comment>
- <comment xml:lang="fur">video ASF</comment>
- <comment xml:lang="ga">físeán ASF</comment>
- <comment xml:lang="gl">vídeo ASF</comment>
- <comment xml:lang="he">וידאו ASF</comment>
- <comment xml:lang="hr">ASF video snimka</comment>
- <comment xml:lang="hu">ASF videó</comment>
- <comment xml:lang="ia">Video ASF</comment>
- <comment xml:lang="id">Video ASF</comment>
- <comment xml:lang="it">Video ASF</comment>
- <comment xml:lang="ja">ASF 動画</comment>
- <comment xml:lang="ka">ASF ვიდეო</comment>
- <comment xml:lang="kk">ASF видеосы</comment>
- <comment xml:lang="ko">ASF 동영상</comment>
- <comment xml:lang="lt">ASF vaizdo įrašas</comment>
- <comment xml:lang="lv">ASF video</comment>
- <comment xml:lang="nb">ASF-film</comment>
- <comment xml:lang="nl">ASF-video</comment>
- <comment xml:lang="nn">ASF-video</comment>
- <comment xml:lang="oc">vidèo ASF</comment>
- <comment xml:lang="pl">Plik wideo ASF</comment>
- <comment xml:lang="pt">vídeo ASF</comment>
- <comment xml:lang="pt-BR">Vídeo ASF</comment>
- <comment xml:lang="ro">Video ASF</comment>
- <comment xml:lang="ru">Видео ASF</comment>
- <comment xml:lang="sk">Video ASF</comment>
- <comment xml:lang="sl">Video datoteka ASF</comment>
- <comment xml:lang="sq">Video ASF</comment>
- <comment xml:lang="sr">АСФ видео</comment>
- <comment xml:lang="sv">ASF-video</comment>
- <comment xml:lang="tr">ASF videosu</comment>
- <comment xml:lang="uk">відеокліп ASF</comment>
+ <comment xml:lang="zh_TW">ASF 視訊</comment>
+ <comment xml:lang="zh_CN">ASF 视频</comment>
<comment xml:lang="vi">Ảnh động ASF</comment>
- <comment xml:lang="zh-CN">ASF 视频</comment>
- <comment xml:lang="zh-TW">ASF 視訊</comment>
+ <comment xml:lang="uk">відеокліп ASF</comment>
+ <comment xml:lang="tr">ASF videosu</comment>
+ <comment xml:lang="sv">ASF-video</comment>
+ <comment xml:lang="sr">АСФ видео</comment>
+ <comment xml:lang="sq">video ASF</comment>
+ <comment xml:lang="sl">Video datoteka ASF</comment>
+ <comment xml:lang="si">ASF වීඩියෝව</comment>
+ <comment xml:lang="sk">Video ASF</comment>
+ <comment xml:lang="ru">Видео ASF</comment>
+ <comment xml:lang="ro">Video ASF</comment>
+ <comment xml:lang="pt_BR">Vídeo ASF</comment>
+ <comment xml:lang="pt">vídeo ASF</comment>
+ <comment xml:lang="pl">Plik wideo ASF</comment>
+ <comment xml:lang="oc">vidèo ASF</comment>
+ <comment xml:lang="nn">ASF-video</comment>
+ <comment xml:lang="nl">ASF-video</comment>
+ <comment xml:lang="nb">ASF-film</comment>
+ <comment xml:lang="lv">ASF video</comment>
+ <comment xml:lang="lt">ASF vaizdo įrašas</comment>
+ <comment xml:lang="ko">ASF 동영상</comment>
+ <comment xml:lang="kk">ASF видеосы</comment>
+ <comment xml:lang="ka">ASF ვიდეო</comment>
+ <comment xml:lang="ja">ASF 動画</comment>
+ <comment xml:lang="it">Video ASF</comment>
+ <comment xml:lang="is">ASF myndskeið</comment>
+ <comment xml:lang="id">Video ASF</comment>
+ <comment xml:lang="ia">Video ASF</comment>
+ <comment xml:lang="hu">ASF videó</comment>
+ <comment xml:lang="hr">ASF video snimka</comment>
+ <comment xml:lang="he">וידאו ASF</comment>
+ <comment xml:lang="gl">vídeo ASF</comment>
+ <comment xml:lang="ga">físeán ASF</comment>
+ <comment xml:lang="fur">video ASF</comment>
+ <comment xml:lang="fr">vidéo ASF</comment>
+ <comment xml:lang="fo">ASF video</comment>
+ <comment xml:lang="fi">ASF-video</comment>
+ <comment xml:lang="eu">ASF bideoa</comment>
+ <comment xml:lang="es">vídeo ASF</comment>
+ <comment xml:lang="eo">ASF-video</comment>
+ <comment xml:lang="en_GB">ASF video</comment>
+ <comment xml:lang="el">Βίντεο ASF</comment>
+ <comment xml:lang="de">ASF-Video</comment>
+ <comment xml:lang="da">ASF-video</comment>
+ <comment xml:lang="cs">video ASF</comment>
+ <comment xml:lang="ca">vídeo ASF</comment>
+ <comment xml:lang="bg">Видео — ASF</comment>
+ <comment xml:lang="be@latin">Videa ASF</comment>
+ <comment xml:lang="be">відэа ASF</comment>
+ <comment xml:lang="ast">Videu n'ASF</comment>
+ <comment xml:lang="ar">فيديو ASF</comment>
+ <comment xml:lang="af">ASF-video</comment>
<acronym>ASF</acronym>
<expanded-acronym>Advanced Streaming Format</expanded-acronym>
<alias type="video/x-ms-wm"/>
<alias type="video/x-ms-asf"/>
<alias type="video/x-ms-asf-plugin"/>
<glob pattern="*.asf"/>
- <magic priority="50">
+ <magic>
<match type="big32" value="0x3026b275" offset="0"/>
<match type="string" value="[Reference]" offset="0"/>
</magic>
</mime-type>
<mime-type type="application/x-netshow-channel">
<comment>Windows Media Station file</comment>
- <comment xml:lang="af">Windows Media Station-lêer</comment>
- <comment xml:lang="ar">ملف محطة Windows Media</comment>
- <comment xml:lang="be-Latn">Fajł Windows Media Station</comment>
- <comment xml:lang="bg">Файл — Windows Media Station</comment>
- <comment xml:lang="ca">fitxer de Windows Media Station</comment>
- <comment xml:lang="cs">soubor Windows Media Station</comment>
- <comment xml:lang="da">Windows Media Station-fil</comment>
- <comment xml:lang="de">Windows-Media-Streamingbeschreibung</comment>
- <comment xml:lang="el">Αρχείο Windows Media Station</comment>
- <comment xml:lang="en-GB">Windows Media Station file</comment>
- <comment xml:lang="es">archivo de emisora de Windows Media</comment>
- <comment xml:lang="eu">Windows Media Station fitxategia</comment>
- <comment xml:lang="fi">Windows Media Station-tiedosto</comment>
- <comment xml:lang="fo">Windows Media Station fíla</comment>
- <comment xml:lang="fr">fichier Windows Media Station</comment>
- <comment xml:lang="fur">file Windows Media Station</comment>
- <comment xml:lang="ga">comhad Windows Media Station</comment>
- <comment xml:lang="gl">ficheiro de emisora de Windows Media</comment>
- <comment xml:lang="he">קובץ תחנה של Windows Media</comment>
- <comment xml:lang="hr">Windows Media Station datoteka</comment>
- <comment xml:lang="hu">Windows Media Station fájl</comment>
- <comment xml:lang="ia">File de station Windows Media</comment>
- <comment xml:lang="id">Berkas Windows Media Station</comment>
- <comment xml:lang="it">File Windows Media Station</comment>
- <comment xml:lang="ja">Windows Media Station ファイル</comment>
- <comment xml:lang="kk">Windows Media Station файлы</comment>
- <comment xml:lang="ko">Windows Media Station 파일</comment>
- <comment xml:lang="lt">Windows Media Station failas</comment>
- <comment xml:lang="lv">Windows Media Station datne</comment>
- <comment xml:lang="nb">Windows Media Station-fil</comment>
- <comment xml:lang="nl">Windows Media Station-bestand</comment>
- <comment xml:lang="nn">Windows Media Station-fil</comment>
- <comment xml:lang="oc">fichièr Windows Media Station</comment>
- <comment xml:lang="pl">Plik Windows Media Station</comment>
- <comment xml:lang="pt">ficheiro Windows Media Station</comment>
- <comment xml:lang="pt-BR">Arquivo de estação do Windows Media</comment>
- <comment xml:lang="ro">Fișier Windows Media Station</comment>
- <comment xml:lang="ru">Файл Windows Media Station</comment>
- <comment xml:lang="sk">Súbor Windows Media Station</comment>
- <comment xml:lang="sl">Datoteka Windows Media Station</comment>
- <comment xml:lang="sq">File Windows Media Station</comment>
- <comment xml:lang="sr">датотека станице Виндоузовог Медија</comment>
- <comment xml:lang="sv">Windows Media Station-fil</comment>
- <comment xml:lang="tr">Windows Media Station dosyası</comment>
- <comment xml:lang="uk">файл Windows Media Station</comment>
+ <comment xml:lang="zh_TW">Windows Media Station 檔</comment>
+ <comment xml:lang="zh_CN">Windows 媒体工作站文件</comment>
<comment xml:lang="vi">Tập tin Windows Media Station</comment>
- <comment xml:lang="zh-CN">Windows 媒体工作站文件</comment>
- <comment xml:lang="zh-TW">Windows Media Station 檔</comment>
+ <comment xml:lang="uk">файл Windows Media Station</comment>
+ <comment xml:lang="tr">Windows Media Station dosyası</comment>
+ <comment xml:lang="sv">Windows Media Station-fil</comment>
+ <comment xml:lang="sr">датотека станице Виндоузовог Медија</comment>
+ <comment xml:lang="sq">kartelë Windows Media Station</comment>
+ <comment xml:lang="sl">Datoteka Windows Media Station</comment>
+ <comment xml:lang="si">Windows Media Station ගොනුව</comment>
+ <comment xml:lang="sk">Súbor Windows Media Station</comment>
+ <comment xml:lang="ru">Файл Windows Media Station</comment>
+ <comment xml:lang="ro">Fișier Windows Media Station</comment>
+ <comment xml:lang="pt_BR">Arquivo de estação do Windows Media</comment>
+ <comment xml:lang="pt">ficheiro Windows Media Station</comment>
+ <comment xml:lang="pl">Plik Windows Media Station</comment>
+ <comment xml:lang="oc">fichièr Windows Media Station</comment>
+ <comment xml:lang="nn">Windows Media Station-fil</comment>
+ <comment xml:lang="nl">Windows Media Station-bestand</comment>
+ <comment xml:lang="nb">Windows Media Station-fil</comment>
+ <comment xml:lang="lv">Windows Media Station datne</comment>
+ <comment xml:lang="lt">Windows Media Station failas</comment>
+ <comment xml:lang="ko">Windows Media Station 파일</comment>
+ <comment xml:lang="kk">Windows Media Station файлы</comment>
+ <comment xml:lang="ja">Windows Media Station ファイル</comment>
+ <comment xml:lang="it">File Windows Media Station</comment>
+ <comment xml:lang="is">Windows Media Station skrá</comment>
+ <comment xml:lang="id">Berkas Windows Media Station</comment>
+ <comment xml:lang="ia">File de station Windows Media</comment>
+ <comment xml:lang="hu">Windows Media Station fájl</comment>
+ <comment xml:lang="hr">Windows Media Station datoteka</comment>
+ <comment xml:lang="he">קובץ תחנה של Windows Media</comment>
+ <comment xml:lang="gl">ficheiro de emisora de Windows Media</comment>
+ <comment xml:lang="ga">comhad Windows Media Station</comment>
+ <comment xml:lang="fur">file Windows Media Station</comment>
+ <comment xml:lang="fr">fichier Windows Media Station</comment>
+ <comment xml:lang="fo">Windows Media Station fíla</comment>
+ <comment xml:lang="fi">Windows Media Station -tiedosto</comment>
+ <comment xml:lang="eu">Windows Media Station fitxategia</comment>
+ <comment xml:lang="es">archivo de emisora de Windows Media</comment>
+ <comment xml:lang="en_GB">Windows Media Station file</comment>
+ <comment xml:lang="el">Αρχείο Windows Media Station</comment>
+ <comment xml:lang="de">Windows-Media-Station-Datei</comment>
+ <comment xml:lang="da">Windows Media Station-fil</comment>
+ <comment xml:lang="cs">soubor Windows Media Station</comment>
+ <comment xml:lang="ca">fitxer de Windows Media Station</comment>
+ <comment xml:lang="bg">Файл — Windows Media Station</comment>
+ <comment xml:lang="be@latin">Fajł Windows Media Station</comment>
+ <comment xml:lang="be">файл Windows Media Station</comment>
+ <comment xml:lang="ar">ملف محطة ويندوز ميديا</comment>
+ <comment xml:lang="af">Windows Media Station-lêer</comment>
<sub-class-of type="application/vnd.ms-asf"/>
<generic-icon name="video-x-generic"/>
<glob pattern="*.nsc"/>
- <magic priority="50">
+ <magic>
<match type="string" value="[Address]" offset="0"/>
</magic>
</mime-type>
<mime-type type="video/x-ms-wmv">
<comment>Windows Media video</comment>
- <comment xml:lang="af">Windows Media-video</comment>
- <comment xml:lang="ar">Windows Media مرئي</comment>
- <comment xml:lang="ast">Videu de Windows Media</comment>
- <comment xml:lang="be-Latn">Videa Windows Media</comment>
- <comment xml:lang="bg">Видео — Windows Media</comment>
- <comment xml:lang="ca">vídeo de Windows Media</comment>
- <comment xml:lang="cs">video Windows Media</comment>
- <comment xml:lang="da">Windows Medie-video</comment>
- <comment xml:lang="de">Windows-Media-Video</comment>
- <comment xml:lang="el">Βίντεο Windows Media</comment>
- <comment xml:lang="en-GB">Windows Media video</comment>
- <comment xml:lang="es">vídeo de Windows Media</comment>
- <comment xml:lang="eu">Windows Media bideoa</comment>
- <comment xml:lang="fi">Windows Media -video</comment>
- <comment xml:lang="fo">Windows Media video</comment>
- <comment xml:lang="fr">vidéo Windows Media</comment>
- <comment xml:lang="fur">video Windows Media</comment>
- <comment xml:lang="ga">físeán Windows Media</comment>
- <comment xml:lang="gl">vídeo de Windows Media</comment>
- <comment xml:lang="he">וידאו של Windows Media</comment>
- <comment xml:lang="hr">Windows Media video snimka</comment>
- <comment xml:lang="hu">Windows Media videó</comment>
- <comment xml:lang="ia">Video Windows Media</comment>
- <comment xml:lang="id">Video Windows Media</comment>
- <comment xml:lang="it">Video Windows Media</comment>
- <comment xml:lang="ja">Windows Media 動画</comment>
- <comment xml:lang="kk">Windows Media видеосы</comment>
- <comment xml:lang="ko">Windows 미디어 오디오</comment>
- <comment xml:lang="lt">Windows Media vaizdo įrašas</comment>
- <comment xml:lang="lv">Windows Media video</comment>
- <comment xml:lang="nb">Windows Media film</comment>
- <comment xml:lang="nl">Windows Media-video</comment>
- <comment xml:lang="nn">Windows Media-video</comment>
- <comment xml:lang="oc">vidèo Windows Media</comment>
- <comment xml:lang="pl">Plik wideo Windows Media</comment>
- <comment xml:lang="pt">vídeo Windows Media</comment>
- <comment xml:lang="pt-BR">Vídeo do Windows Media</comment>
- <comment xml:lang="ro">Video Windows Media</comment>
- <comment xml:lang="ru">Видео Windows Media</comment>
- <comment xml:lang="sk">Video Windows Media</comment>
- <comment xml:lang="sl">Video datoteka Windows Media</comment>
- <comment xml:lang="sq">Video Windows Media</comment>
- <comment xml:lang="sr">Виндоуз Медија видео</comment>
- <comment xml:lang="sv">Windows Media-video</comment>
- <comment xml:lang="tr">Windows Media videosu</comment>
- <comment xml:lang="uk">відеокліп Windows Media</comment>
+ <comment xml:lang="zh_TW">Windows Media 視訊</comment>
+ <comment xml:lang="zh_CN">Windows Media 视频</comment>
<comment xml:lang="vi">Ảnh động Windows Media</comment>
- <comment xml:lang="zh-CN">Windows Media 视频</comment>
- <comment xml:lang="zh-TW">Windows Media 視訊</comment>
+ <comment xml:lang="uk">відеокліп Windows Media</comment>
+ <comment xml:lang="tr">Windows Media videosu</comment>
+ <comment xml:lang="sv">Windows Media-video</comment>
+ <comment xml:lang="sr">Виндоуз Медија видео</comment>
+ <comment xml:lang="sq">video Windows Media</comment>
+ <comment xml:lang="sl">Video datoteka Windows Media</comment>
+ <comment xml:lang="si">වින්ඩෝස් මීඩියා වීඩියෝව</comment>
+ <comment xml:lang="sk">Video Windows Media</comment>
+ <comment xml:lang="ru">Видео Windows Media</comment>
+ <comment xml:lang="ro">Video Windows Media</comment>
+ <comment xml:lang="pt_BR">Vídeo do Windows Media</comment>
+ <comment xml:lang="pt">vídeo Windows Media</comment>
+ <comment xml:lang="pl">Plik wideo Windows Media</comment>
+ <comment xml:lang="oc">vidèo Windows Media</comment>
+ <comment xml:lang="nn">Windows Media-video</comment>
+ <comment xml:lang="nl">Windows Media-video</comment>
+ <comment xml:lang="nb">Windows Media film</comment>
+ <comment xml:lang="lv">Windows Media video</comment>
+ <comment xml:lang="lt">Windows Media vaizdo įrašas</comment>
+ <comment xml:lang="ko">Windows 미디어 오디오</comment>
+ <comment xml:lang="kk">Windows Media видеосы</comment>
+ <comment xml:lang="ja">Windows Media 動画</comment>
+ <comment xml:lang="it">Video Windows Media</comment>
+ <comment xml:lang="is">Windows Media myndskeið</comment>
+ <comment xml:lang="id">Video Windows Media</comment>
+ <comment xml:lang="ia">Video Windows Media</comment>
+ <comment xml:lang="hu">Windows Media videó</comment>
+ <comment xml:lang="hr">Windows Media video snimka</comment>
+ <comment xml:lang="he">וידאו של Windows Media</comment>
+ <comment xml:lang="gl">vídeo de Windows Media</comment>
+ <comment xml:lang="ga">físeán Windows Media</comment>
+ <comment xml:lang="fur">video Windows Media</comment>
+ <comment xml:lang="fr">vidéo Windows Media</comment>
+ <comment xml:lang="fo">Windows Media video</comment>
+ <comment xml:lang="fi">Windows Media -video</comment>
+ <comment xml:lang="eu">Windows Media bideoa</comment>
+ <comment xml:lang="es">vídeo de Windows Media</comment>
+ <comment xml:lang="en_GB">Windows Media video</comment>
+ <comment xml:lang="el">Βίντεο Windows Media</comment>
+ <comment xml:lang="de">Windows-Media-Video</comment>
+ <comment xml:lang="da">Windows Medie-video</comment>
+ <comment xml:lang="cs">video Windows Media</comment>
+ <comment xml:lang="ca">vídeo de Windows Media</comment>
+ <comment xml:lang="bg">Видео — Windows Media</comment>
+ <comment xml:lang="be@latin">Videa Windows Media</comment>
+ <comment xml:lang="be">відэа Windows Media</comment>
+ <comment xml:lang="ast">Videu de Windows Media</comment>
+ <comment xml:lang="ar">فيديو ويندوز ميديا</comment>
+ <comment xml:lang="af">Windows Media-video</comment>
<sub-class-of type="application/vnd.ms-asf"/>
<glob pattern="*.wmv"/>
</mime-type>
- <mime-type type="video/x-msvideo">
+ <mime-type type="video/vnd.avi">
<comment>AVI video</comment>
- <comment xml:lang="af">AVI-video</comment>
- <comment xml:lang="ar">AVI مرئي</comment>
- <comment xml:lang="ast">Videu n'AVI</comment>
- <comment xml:lang="az">AVI video faylı</comment>
- <comment xml:lang="be-Latn">Videa AVI</comment>
- <comment xml:lang="bg">Видео — AVI</comment>
- <comment xml:lang="ca">vídeo AVI</comment>
- <comment xml:lang="cs">video AVI</comment>
- <comment xml:lang="cy">Fideo AVI</comment>
- <comment xml:lang="da">AVI-video</comment>
- <comment xml:lang="de">AVI-Video</comment>
- <comment xml:lang="el">Βίντεο AVI</comment>
- <comment xml:lang="en-GB">AVI video</comment>
- <comment xml:lang="eo">AVI-video</comment>
- <comment xml:lang="es">vídeo AVI</comment>
- <comment xml:lang="eu">AVI bideoa</comment>
- <comment xml:lang="fi">AVI-video</comment>
- <comment xml:lang="fo">AVI video</comment>
- <comment xml:lang="fr">vidéo AVI</comment>
- <comment xml:lang="fur">video AVI</comment>
- <comment xml:lang="ga">físeán AVI</comment>
- <comment xml:lang="gl">vídeo AVI</comment>
- <comment xml:lang="he">וידאו AVI</comment>
- <comment xml:lang="hr">AVI video snimka</comment>
- <comment xml:lang="hu">AVI-videó</comment>
- <comment xml:lang="ia">Video AVI</comment>
- <comment xml:lang="id">Video AVI</comment>
- <comment xml:lang="it">Video AVI</comment>
- <comment xml:lang="ja">AVI 動画</comment>
- <comment xml:lang="ka">AVI ვიდეო</comment>
- <comment xml:lang="kk">AVI видеосы</comment>
- <comment xml:lang="ko">AVI 동영상</comment>
- <comment xml:lang="lt">AVI vaizdo įrašas</comment>
- <comment xml:lang="lv">AVI video</comment>
- <comment xml:lang="ms">Video AVI</comment>
- <comment xml:lang="nb">AVI-film</comment>
- <comment xml:lang="nl">AVI-video</comment>
- <comment xml:lang="nn">AVI-video</comment>
- <comment xml:lang="oc">vidèo AVI</comment>
- <comment xml:lang="pl">Plik wideo AVI</comment>
- <comment xml:lang="pt">vídeo AVI</comment>
- <comment xml:lang="pt-BR">Vídeo AVI</comment>
- <comment xml:lang="ro">Video AVI</comment>
- <comment xml:lang="ru">Видео AVI</comment>
- <comment xml:lang="sk">Video AVI</comment>
- <comment xml:lang="sl">Video datoteka AVI</comment>
- <comment xml:lang="sq">Video AVI</comment>
- <comment xml:lang="sr">АВИ видео</comment>
- <comment xml:lang="sv">AVI-video</comment>
- <comment xml:lang="tr">AVI videosu</comment>
- <comment xml:lang="uk">відеокліп AVI</comment>
+ <comment xml:lang="zh_TW">AVI 視訊</comment>
+ <comment xml:lang="zh_CN">AVI 视频</comment>
<comment xml:lang="vi">Ảnh động AVI</comment>
- <comment xml:lang="zh-CN">AVI 视频</comment>
- <comment xml:lang="zh-TW">AVI 視訊</comment>
+ <comment xml:lang="uk">відеокліп AVI</comment>
+ <comment xml:lang="tr">AVI videosu</comment>
+ <comment xml:lang="sv">AVI-video</comment>
+ <comment xml:lang="sr">АВИ видео</comment>
+ <comment xml:lang="sq">video AVI</comment>
+ <comment xml:lang="sl">Video datoteka AVI</comment>
+ <comment xml:lang="si">AVI වීඩියෝ</comment>
+ <comment xml:lang="sk">Video AVI</comment>
+ <comment xml:lang="ru">Видео AVI</comment>
+ <comment xml:lang="ro">Video AVI</comment>
+ <comment xml:lang="pt_BR">Vídeo AVI</comment>
+ <comment xml:lang="pt">vídeo AVI</comment>
+ <comment xml:lang="pl">Plik wideo AVI</comment>
+ <comment xml:lang="oc">vidèo AVI</comment>
+ <comment xml:lang="nn">AVI-video</comment>
+ <comment xml:lang="nl">AVI-video</comment>
+ <comment xml:lang="nb">AVI-film</comment>
+ <comment xml:lang="ms">Video AVI</comment>
+ <comment xml:lang="lv">AVI video</comment>
+ <comment xml:lang="lt">AVI vaizdo įrašas</comment>
+ <comment xml:lang="ko">AVI 동영상</comment>
+ <comment xml:lang="kk">AVI видеосы</comment>
+ <comment xml:lang="ka">AVI ვიდეო</comment>
+ <comment xml:lang="ja">AVI 動画</comment>
+ <comment xml:lang="it">Video AVI</comment>
+ <comment xml:lang="is">AVI myndskeið</comment>
+ <comment xml:lang="id">Video AVI</comment>
+ <comment xml:lang="ia">Video AVI</comment>
+ <comment xml:lang="hu">AVI-videó</comment>
+ <comment xml:lang="hr">AVI video snimka</comment>
+ <comment xml:lang="he">וידאו AVI</comment>
+ <comment xml:lang="gl">vídeo AVI</comment>
+ <comment xml:lang="ga">físeán AVI</comment>
+ <comment xml:lang="fur">video AVI</comment>
+ <comment xml:lang="fr">vidéo AVI</comment>
+ <comment xml:lang="fo">AVI video</comment>
+ <comment xml:lang="fi">AVI-video</comment>
+ <comment xml:lang="eu">AVI bideoa</comment>
+ <comment xml:lang="es">vídeo AVI</comment>
+ <comment xml:lang="eo">AVI-video</comment>
+ <comment xml:lang="en_GB">AVI video</comment>
+ <comment xml:lang="el">Βίντεο AVI</comment>
+ <comment xml:lang="de">AVI-Video</comment>
+ <comment xml:lang="da">AVI-video</comment>
+ <comment xml:lang="cy">Fideo AVI</comment>
+ <comment xml:lang="cs">video AVI</comment>
+ <comment xml:lang="ca">vídeo AVI</comment>
+ <comment xml:lang="bg">Видео — AVI</comment>
+ <comment xml:lang="be@latin">Videa AVI</comment>
+ <comment xml:lang="be">відэа AVI</comment>
+ <comment xml:lang="az">AVI video faylı</comment>
+ <comment xml:lang="ast">Videu n'AVI</comment>
+ <comment xml:lang="ar">فيديو AVI</comment>
+ <comment xml:lang="af">AVI-video</comment>
<acronym>AVI</acronym>
<expanded-acronym>Audio Video Interleave</expanded-acronym>
<alias type="video/x-avi"/>
@@ -39940,7 +41136,8 @@ command to generate the output files.
<alias type="video/divx"/>
<alias type="video/msvideo"/>
<alias type="video/vnd.divx"/>
- <magic priority="50">
+ <alias type="video/x-msvideo"/>
+ <magic>
<match type="string" value="RIFF" offset="0">
<match type="string" value="AVI " offset="8"/>
</match>
@@ -39954,117 +41151,123 @@ command to generate the output files.
</mime-type>
<mime-type type="video/x-nsv">
<comment>NullSoft video</comment>
- <comment xml:lang="af">NullSoft-video</comment>
- <comment xml:lang="ar">NullSoft مرئي</comment>
- <comment xml:lang="ast">Videu de NullSoft</comment>
- <comment xml:lang="be-Latn">Videa NullSoft</comment>
- <comment xml:lang="bg">Видео — NullSoft</comment>
- <comment xml:lang="ca">vídeo NullSoft</comment>
- <comment xml:lang="cs">video NullSoft</comment>
- <comment xml:lang="da">NullSoft-video</comment>
- <comment xml:lang="de">NullSoft-Video</comment>
- <comment xml:lang="el">Βίντεο Nullsoft</comment>
- <comment xml:lang="en-GB">NullSoft video</comment>
- <comment xml:lang="eo">NullSoft-video</comment>
- <comment xml:lang="es">vídeo NullSoft</comment>
- <comment xml:lang="eu">NullSoft bideoa</comment>
- <comment xml:lang="fi">NullSoft-video</comment>
- <comment xml:lang="fo">NullSoft video</comment>
- <comment xml:lang="fr">vidéo NullSoft</comment>
- <comment xml:lang="fur">video NullSoft</comment>
- <comment xml:lang="ga">físeán NullSoft</comment>
- <comment xml:lang="gl">vídeo de NullSoft</comment>
- <comment xml:lang="he">וידאו של NullSot</comment>
- <comment xml:lang="hr">NullSoft video snimka</comment>
- <comment xml:lang="hu">NullSoft videó</comment>
- <comment xml:lang="ia">Video NullSoft</comment>
- <comment xml:lang="id">Video NullSoft</comment>
- <comment xml:lang="it">Video NullSoft</comment>
- <comment xml:lang="ja">NullSoft 動画</comment>
- <comment xml:lang="kk">NullSoft видеосы</comment>
- <comment xml:lang="ko">널소프트 동영상</comment>
- <comment xml:lang="lt">NullSoft vaizdo įrašas</comment>
- <comment xml:lang="lv">NullSoft video</comment>
- <comment xml:lang="nb">Nullsoft-film</comment>
- <comment xml:lang="nl">NullSoft-video</comment>
- <comment xml:lang="nn">NullSoft-video</comment>
- <comment xml:lang="oc">vidèo NullSoft</comment>
- <comment xml:lang="pl">Plik wideo NullSoft</comment>
- <comment xml:lang="pt">vídeo NullSoft</comment>
- <comment xml:lang="pt-BR">Vídeo do NullSoft</comment>
- <comment xml:lang="ro">Video NullSoft</comment>
- <comment xml:lang="ru">Видео Nullsoft</comment>
- <comment xml:lang="sk">Video NullSoft</comment>
- <comment xml:lang="sl">Video datoteka NullSoft</comment>
- <comment xml:lang="sq">Video NullSoft</comment>
- <comment xml:lang="sr">Нул Софт видео</comment>
- <comment xml:lang="sv">NullSoft-video</comment>
- <comment xml:lang="tr">Nullsoft videosu</comment>
- <comment xml:lang="uk">відеокліп NullSoft</comment>
+ <comment xml:lang="zh_TW">NullSoft 視訊</comment>
+ <comment xml:lang="zh_CN">NullSoft 视频</comment>
<comment xml:lang="vi">Ảnh động NullSoft</comment>
- <comment xml:lang="zh-CN">NullSoft 视频</comment>
- <comment xml:lang="zh-TW">NullSoft 視訊</comment>
- <magic priority="50">
+ <comment xml:lang="uk">відеокліп NullSoft</comment>
+ <comment xml:lang="tr">Nullsoft videosu</comment>
+ <comment xml:lang="sv">NullSoft-video</comment>
+ <comment xml:lang="sr">Нул Софт видео</comment>
+ <comment xml:lang="sq">video NullSoft</comment>
+ <comment xml:lang="sl">Video datoteka NullSoft</comment>
+ <comment xml:lang="si">NullSoft වීඩියෝව</comment>
+ <comment xml:lang="sk">Video NullSoft</comment>
+ <comment xml:lang="ru">Видео Nullsoft</comment>
+ <comment xml:lang="ro">Video NullSoft</comment>
+ <comment xml:lang="pt_BR">Vídeo do NullSoft</comment>
+ <comment xml:lang="pt">vídeo NullSoft</comment>
+ <comment xml:lang="pl">Plik wideo NullSoft</comment>
+ <comment xml:lang="oc">vidèo NullSoft</comment>
+ <comment xml:lang="nn">NullSoft-video</comment>
+ <comment xml:lang="nl">NullSoft-video</comment>
+ <comment xml:lang="nb">Nullsoft-film</comment>
+ <comment xml:lang="lv">NullSoft video</comment>
+ <comment xml:lang="lt">NullSoft vaizdo įrašas</comment>
+ <comment xml:lang="ko">널소프트 동영상</comment>
+ <comment xml:lang="kk">NullSoft видеосы</comment>
+ <comment xml:lang="ja">NullSoft 動画</comment>
+ <comment xml:lang="it">Video NullSoft</comment>
+ <comment xml:lang="is">Nullsoft myndskeið</comment>
+ <comment xml:lang="id">Video NullSoft</comment>
+ <comment xml:lang="ia">Video NullSoft</comment>
+ <comment xml:lang="hu">NullSoft videó</comment>
+ <comment xml:lang="hr">NullSoft video snimka</comment>
+ <comment xml:lang="he">וידאו של NullSot</comment>
+ <comment xml:lang="gl">vídeo de NullSoft</comment>
+ <comment xml:lang="ga">físeán NullSoft</comment>
+ <comment xml:lang="fur">video NullSoft</comment>
+ <comment xml:lang="fr">vidéo NullSoft</comment>
+ <comment xml:lang="fo">NullSoft video</comment>
+ <comment xml:lang="fi">NullSoft-video</comment>
+ <comment xml:lang="eu">NullSoft bideoa</comment>
+ <comment xml:lang="es">vídeo NullSoft</comment>
+ <comment xml:lang="eo">NullSoft-video</comment>
+ <comment xml:lang="en_GB">NullSoft video</comment>
+ <comment xml:lang="el">Βίντεο Nullsoft</comment>
+ <comment xml:lang="de">NullSoft-Video</comment>
+ <comment xml:lang="da">NullSoft-video</comment>
+ <comment xml:lang="cs">video NullSoft</comment>
+ <comment xml:lang="ca">vídeo NullSoft</comment>
+ <comment xml:lang="bg">Видео — NullSoft</comment>
+ <comment xml:lang="be@latin">Videa NullSoft</comment>
+ <comment xml:lang="be">відэа NullSoft</comment>
+ <comment xml:lang="ast">Videu de NullSoft</comment>
+ <comment xml:lang="ar">فيديو NullSoft</comment>
+ <comment xml:lang="af">NullSoft-video</comment>
+ <magic>
<match type="string" value="NSVf" offset="0"/>
</magic>
<glob pattern="*.nsv"/>
</mime-type>
<mime-type type="application/sdp">
<comment>SDP multicast stream file</comment>
- <comment xml:lang="ar">ملف دفق متعدد البث SDP</comment>
- <comment xml:lang="be-Latn">Šmatadrasny płynievy fajł SDP</comment>
- <comment xml:lang="bg">Поток — SDP multicast</comment>
- <comment xml:lang="ca">fitxer de flux de multidifusió SDP</comment>
- <comment xml:lang="cs">soubor vícesměrového vysílání proudu SDP</comment>
- <comment xml:lang="da">SDP multicast-strømfil</comment>
- <comment xml:lang="de">SDP-Multicast-Datenstromdatei</comment>
- <comment xml:lang="el">Αρχείο ροής πολλαπλής αναμετάδοσης SDP</comment>
- <comment xml:lang="en-GB">SDP multicast stream file</comment>
- <comment xml:lang="es">archivo de flujo multicast SDP</comment>
- <comment xml:lang="eu">SDP multicast korrontearen fitxategia</comment>
- <comment xml:lang="fi">SDP-monilähetysvirran tiedosto</comment>
- <comment xml:lang="fo">SDP margvarpað streymafíla</comment>
- <comment xml:lang="fr">fichier de flux multidiffusion SDP</comment>
- <comment xml:lang="fur">file di flus a trasmission multiple SDP</comment>
- <comment xml:lang="ga">comhad shruth ilchraolacháin SDP</comment>
- <comment xml:lang="gl">ficheiro de fluxo multicast SDP</comment>
- <comment xml:lang="he">קובץ שידור בזרימה SDP</comment>
- <comment xml:lang="hr">SDP datoteka strujanja emitiranja</comment>
- <comment xml:lang="hu">SDP multicast műsorfájl</comment>
- <comment xml:lang="ia">File de fluxo multidiffusion SDP</comment>
- <comment xml:lang="id">Berkas SDP multicast stream</comment>
- <comment xml:lang="it">File stream multicast SDP</comment>
- <comment xml:lang="ja">SDP マルチキャストストリームファイル</comment>
- <comment xml:lang="kk">SDP мультикаст ағым файлы</comment>
- <comment xml:lang="ko">SDP 멀티캐스트 스트림 파일</comment>
- <comment xml:lang="lt">SDP daugiaadresio srauto failas</comment>
- <comment xml:lang="lv">SDP multiraides straumes datne</comment>
- <comment xml:lang="nb">SDP-multicaststrøm</comment>
- <comment xml:lang="nl">SDP-multicast-streambestand</comment>
- <comment xml:lang="nn">SDP multicast straumfil</comment>
- <comment xml:lang="oc">fichièr de flux multidifusion SDP</comment>
- <comment xml:lang="pl">Plik strumienia multicast SDP</comment>
- <comment xml:lang="pt">ficheiro de fluxo SDP multicast</comment>
- <comment xml:lang="pt-BR">Arquivo de canal multicast SDP</comment>
- <comment xml:lang="ro">Fișier flux multicast SDP</comment>
- <comment xml:lang="ru">Файл мультикаст-потока SDP</comment>
- <comment xml:lang="sk">Súbor viacsmerového vysielania prúdu SDP</comment>
- <comment xml:lang="sl">Pretočni vir večsmernega oddajanja</comment>
- <comment xml:lang="sq">File stream multicast SDP</comment>
- <comment xml:lang="sr">СДП датотека тока вишеструког емитовања</comment>
- <comment xml:lang="sv">SDP multicast stream-fil</comment>
- <comment xml:lang="tr">SDP çoklu yayın akışı dosyası</comment>
- <comment xml:lang="uk">файл потокової трансляції SDP</comment>
+ <comment xml:lang="zh_TW">SDP multicast 串流檔</comment>
+ <comment xml:lang="zh_CN">SDP 多播流文件</comment>
<comment xml:lang="vi">Tập tin luồng truyền một-nhiều SDP</comment>
- <comment xml:lang="zh-CN">SDP 多播流文件</comment>
- <comment xml:lang="zh-TW">SDP multicast 串流檔</comment>
+ <comment xml:lang="uk">файл потокової трансляції SDP</comment>
+ <comment xml:lang="tr">SDP çoklu yayın akışı dosyası</comment>
+ <comment xml:lang="sv">SDP multicast stream-fil</comment>
+ <comment xml:lang="sr">СДП датотека тока вишеструког емитовања</comment>
+ <comment xml:lang="sq">kartelë transmetimi multicast SDP</comment>
+ <comment xml:lang="sl">Pretočni vir večsmernega oddajanja</comment>
+ <comment xml:lang="si">SDP බහු විකාශන ප්‍රවාහ ගොනුව</comment>
+ <comment xml:lang="sk">Súbor viacsmerového vysielania prúdu SDP</comment>
+ <comment xml:lang="ru">Файл мультикаст-потока SDP</comment>
+ <comment xml:lang="ro">Fișier flux multicast SDP</comment>
+ <comment xml:lang="pt_BR">Arquivo de canal multicast SDP</comment>
+ <comment xml:lang="pt">ficheiro de fluxo SDP multicast</comment>
+ <comment xml:lang="pl">Plik strumienia multicast SDP</comment>
+ <comment xml:lang="oc">fichièr de flux multidifusion SDP</comment>
+ <comment xml:lang="nn">SDP multicast straumfil</comment>
+ <comment xml:lang="nl">SDP-multicast-streambestand</comment>
+ <comment xml:lang="nb">SDP-multicaststrøm</comment>
+ <comment xml:lang="lv">SDP multiraides straumes datne</comment>
+ <comment xml:lang="lt">SDP daugiaadresio srauto failas</comment>
+ <comment xml:lang="ko">SDP 멀티캐스트 스트림 파일</comment>
+ <comment xml:lang="kk">SDP мультикаст ағым файлы</comment>
+ <comment xml:lang="ja">SDP マルチキャストストリームファイル</comment>
+ <comment xml:lang="it">File stream multicast SDP</comment>
+ <comment xml:lang="is">SDP multicast streymisskrá</comment>
+ <comment xml:lang="id">Berkas SDP multicast stream</comment>
+ <comment xml:lang="ia">File de fluxo multidiffusion SDP</comment>
+ <comment xml:lang="hu">SDP multicast műsorfájl</comment>
+ <comment xml:lang="hr">SDP datoteka strujanja emitiranja</comment>
+ <comment xml:lang="he">קובץ שידור בזרימה SDP</comment>
+ <comment xml:lang="gl">ficheiro de fluxo multicast SDP</comment>
+ <comment xml:lang="ga">comhad shruth ilchraolacháin SDP</comment>
+ <comment xml:lang="fur">file di flus a trasmission multiple SDP</comment>
+ <comment xml:lang="fr">fichier de flux multidiffusion SDP</comment>
+ <comment xml:lang="fo">SDP margvarpað streymafíla</comment>
+ <comment xml:lang="fi">SDP-monilähetysvirran tiedosto</comment>
+ <comment xml:lang="eu">SDP multicast korrontearen fitxategia</comment>
+ <comment xml:lang="es">archivo de flujo multicast SDP</comment>
+ <comment xml:lang="en_GB">SDP multicast stream file</comment>
+ <comment xml:lang="el">Αρχείο ροής πολλαπλής αναμετάδοσης SDP</comment>
+ <comment xml:lang="de">SDP-Multicast-Datenstromdatei</comment>
+ <comment xml:lang="da">SDP multicast-strømfil</comment>
+ <comment xml:lang="cs">soubor vícesměrového vysílání proudu SDP</comment>
+ <comment xml:lang="ca">fitxer de flux de multidifusió SDP</comment>
+ <comment xml:lang="bg">Поток — SDP multicast</comment>
+ <comment xml:lang="be@latin">Šmatadrasny płynievy fajł SDP</comment>
+ <comment xml:lang="be">файл шматадраснай плыні SDP</comment>
+ <comment xml:lang="ar">ملف دفق متعدد البث SDP</comment>
<acronym>SDP</acronym>
<expanded-acronym>Session Description Protocol</expanded-acronym>
<sub-class-of type="text/plain"/>
<alias type="application/x-sdp"/>
<alias type="application/vnd.sdp"/>
<generic-icon name="video-x-generic"/>
- <magic priority="50">
+ <magic>
<match type="string" value="v=" offset="0">
<match type="string" value="s=" offset="0:256"/>
</match>
@@ -40073,165 +41276,175 @@ command to generate the output files.
</mime-type>
<mime-type type="video/x-sgi-movie">
<comment>SGI video</comment>
- <comment xml:lang="af">SGI-video</comment>
- <comment xml:lang="ar">SGI مرئي</comment>
- <comment xml:lang="ast">Videu en SGI</comment>
- <comment xml:lang="az">SGI video faylı</comment>
- <comment xml:lang="be-Latn">Videa SGI</comment>
- <comment xml:lang="bg">Видео — SGI</comment>
- <comment xml:lang="ca">vídeo SGI</comment>
- <comment xml:lang="cs">video SGI</comment>
- <comment xml:lang="cy">Video SGI</comment>
- <comment xml:lang="da">SGI-video</comment>
- <comment xml:lang="de">SGI-Video</comment>
- <comment xml:lang="el">Βίντεο SGI</comment>
- <comment xml:lang="en-GB">SGI video</comment>
- <comment xml:lang="eo">SGI-video</comment>
- <comment xml:lang="es">vídeo SGI</comment>
- <comment xml:lang="eu">SGI bideoa</comment>
- <comment xml:lang="fi">SGI-video</comment>
- <comment xml:lang="fo">SGI video</comment>
- <comment xml:lang="fr">vidéo SGI</comment>
- <comment xml:lang="fur">video SGI</comment>
- <comment xml:lang="ga">físeán SGI</comment>
- <comment xml:lang="gl">vídeo SGI</comment>
- <comment xml:lang="he">וידאו SGI</comment>
- <comment xml:lang="hr">SGI video snimka</comment>
- <comment xml:lang="hu">SGI-videó</comment>
- <comment xml:lang="ia">Video SGI</comment>
- <comment xml:lang="id">Video SGI</comment>
- <comment xml:lang="it">Video SGI</comment>
- <comment xml:lang="ja">SGI 動画</comment>
- <comment xml:lang="kk">SGI видеосы</comment>
- <comment xml:lang="ko">SGI 동영상</comment>
- <comment xml:lang="lt">SGI vaizdo įrašas</comment>
- <comment xml:lang="lv">SGI video</comment>
- <comment xml:lang="ms">Video SGI</comment>
- <comment xml:lang="nb">SGI-film</comment>
- <comment xml:lang="nl">SGI-video</comment>
- <comment xml:lang="nn">SGI-video</comment>
- <comment xml:lang="oc">vidèo SGI</comment>
- <comment xml:lang="pl">Plik wideo SGI</comment>
- <comment xml:lang="pt">vídeo SGI</comment>
- <comment xml:lang="pt-BR">Vídeo SGI</comment>
- <comment xml:lang="ro">Video SGI</comment>
- <comment xml:lang="ru">Видео SGI</comment>
- <comment xml:lang="sk">Video SGI</comment>
- <comment xml:lang="sl">Video datoteka SGI</comment>
- <comment xml:lang="sq">Video SGI</comment>
- <comment xml:lang="sr">СГИ видео</comment>
- <comment xml:lang="sv">SGI-video</comment>
- <comment xml:lang="tr">SGI videosu</comment>
- <comment xml:lang="uk">відеокліп SGI</comment>
+ <comment xml:lang="zh_TW">SGI 視訊</comment>
+ <comment xml:lang="zh_CN">SGI 视频</comment>
<comment xml:lang="vi">Ảnh động SGI</comment>
- <comment xml:lang="zh-CN">SGI 视频</comment>
- <comment xml:lang="zh-TW">SGI 視訊</comment>
- <magic priority="50">
+ <comment xml:lang="uk">відеокліп SGI</comment>
+ <comment xml:lang="tr">SGI videosu</comment>
+ <comment xml:lang="sv">SGI-video</comment>
+ <comment xml:lang="sr">СГИ видео</comment>
+ <comment xml:lang="sq">video SGI</comment>
+ <comment xml:lang="sl">Video datoteka SGI</comment>
+ <comment xml:lang="si">SGI වීඩියෝව</comment>
+ <comment xml:lang="sk">Video SGI</comment>
+ <comment xml:lang="ru">Видео SGI</comment>
+ <comment xml:lang="ro">Video SGI</comment>
+ <comment xml:lang="pt_BR">Vídeo SGI</comment>
+ <comment xml:lang="pt">vídeo SGI</comment>
+ <comment xml:lang="pl">Plik wideo SGI</comment>
+ <comment xml:lang="oc">vidèo SGI</comment>
+ <comment xml:lang="nn">SGI-video</comment>
+ <comment xml:lang="nl">SGI-video</comment>
+ <comment xml:lang="nb">SGI-film</comment>
+ <comment xml:lang="ms">Video SGI</comment>
+ <comment xml:lang="lv">SGI video</comment>
+ <comment xml:lang="lt">SGI vaizdo įrašas</comment>
+ <comment xml:lang="ko">SGI 동영상</comment>
+ <comment xml:lang="kk">SGI видеосы</comment>
+ <comment xml:lang="ja">SGI 動画</comment>
+ <comment xml:lang="it">Video SGI</comment>
+ <comment xml:lang="is">SGI myndskeið</comment>
+ <comment xml:lang="id">Video SGI</comment>
+ <comment xml:lang="ia">Video SGI</comment>
+ <comment xml:lang="hu">SGI-videó</comment>
+ <comment xml:lang="hr">SGI video snimka</comment>
+ <comment xml:lang="he">וידאו SGI</comment>
+ <comment xml:lang="gl">vídeo SGI</comment>
+ <comment xml:lang="ga">físeán SGI</comment>
+ <comment xml:lang="fur">video SGI</comment>
+ <comment xml:lang="fr">vidéo SGI</comment>
+ <comment xml:lang="fo">SGI video</comment>
+ <comment xml:lang="fi">SGI-video</comment>
+ <comment xml:lang="eu">SGI bideoa</comment>
+ <comment xml:lang="es">vídeo SGI</comment>
+ <comment xml:lang="eo">SGI-video</comment>
+ <comment xml:lang="en_GB">SGI video</comment>
+ <comment xml:lang="el">Βίντεο SGI</comment>
+ <comment xml:lang="de">SGI-Video</comment>
+ <comment xml:lang="da">SGI-video</comment>
+ <comment xml:lang="cy">Video SGI</comment>
+ <comment xml:lang="cs">video SGI</comment>
+ <comment xml:lang="ca">vídeo SGI</comment>
+ <comment xml:lang="bg">Видео — SGI</comment>
+ <comment xml:lang="be@latin">Videa SGI</comment>
+ <comment xml:lang="be">відэа SGI</comment>
+ <comment xml:lang="az">SGI video faylı</comment>
+ <comment xml:lang="ast">Videu en SGI</comment>
+ <comment xml:lang="ar">فيديو SGI</comment>
+ <comment xml:lang="af">SGI-video</comment>
+ <magic>
<match type="string" value="MOVI" offset="0"/>
</magic>
<glob pattern="*.movie"/>
</mime-type>
<mime-type type="application/vnd.emusic-emusic_package">
<comment>eMusic download package</comment>
- <comment xml:lang="af">eMusic-aflaaipakket</comment>
- <comment xml:lang="ar">حزمة تنزيل eMusic</comment>
- <comment xml:lang="be-Latn">pakunak zahruzki eMusic</comment>
- <comment xml:lang="bg">Пакет за сваляне — eMusic</comment>
- <comment xml:lang="ca">paquet de baixades d'eMusic</comment>
- <comment xml:lang="cs">balíček stahování eMusic</comment>
- <comment xml:lang="da">eMusic-downloadpakke</comment>
- <comment xml:lang="de">eMusic-Download-Paket</comment>
- <comment xml:lang="el">Πακέτο λήψης eMusic</comment>
- <comment xml:lang="en-GB">eMusic download package</comment>
- <comment xml:lang="es">paquete de descarga eMusic</comment>
- <comment xml:lang="eu">eMusic deskargaren paketea</comment>
- <comment xml:lang="fi">eMusic-imurointipaketti</comment>
- <comment xml:lang="fo">eMusic niðurtøkupakki</comment>
- <comment xml:lang="fr">paquet de téléchargement eMusic</comment>
- <comment xml:lang="fur">pachet di discjariament eMusic</comment>
- <comment xml:lang="ga">pacáiste íosluchtú eMusic</comment>
- <comment xml:lang="gl">paquete de descarga de eMusic</comment>
- <comment xml:lang="he">חבילת הורדה של eMusic</comment>
- <comment xml:lang="hr">eMusic preuzeti paket</comment>
- <comment xml:lang="hu">eMusic letöltési csomag</comment>
- <comment xml:lang="ia">Pacchetto de discargamento eMusic</comment>
- <comment xml:lang="id">paket unduh eMusic</comment>
- <comment xml:lang="it">Pacchetto scaricamento eMusic</comment>
- <comment xml:lang="ja">eMusic ダウンロードパッケージ</comment>
- <comment xml:lang="kk">eMusic жүктемелер дестесі</comment>
- <comment xml:lang="ko">eMusic 다운로드 패키지</comment>
- <comment xml:lang="lt">eMusic atsiuntimo paketas</comment>
- <comment xml:lang="lv">eMusic lejupielādes paciņa</comment>
- <comment xml:lang="nb">eMusic nedlastingspakke</comment>
- <comment xml:lang="nl">eMusic-downloadpakket</comment>
- <comment xml:lang="nn">eMusic nedlastingspakke</comment>
- <comment xml:lang="oc">paquet de telecargament eMusic</comment>
- <comment xml:lang="pl">Pobrany pakiet eMusic</comment>
- <comment xml:lang="pt">pacote transferido eMusic</comment>
- <comment xml:lang="pt-BR">Pacote de download do eMusic</comment>
- <comment xml:lang="ro">pachet descărcare eMusic</comment>
- <comment xml:lang="ru">Пакет загрузок eMusic</comment>
- <comment xml:lang="sk">Balíček sťahovania eMusic</comment>
- <comment xml:lang="sl">Datoteka paketa eMusic</comment>
- <comment xml:lang="sq">Paketë shkarkimi eMusic</comment>
- <comment xml:lang="sr">пакет преузимања еМузике</comment>
- <comment xml:lang="sv">eMusic-hämtningspaket</comment>
- <comment xml:lang="tr">eMusic indirme paketi</comment>
- <comment xml:lang="uk">пакунок завантаження eMusic</comment>
+ <comment xml:lang="zh_TW">eMusic 下載包</comment>
+ <comment xml:lang="zh_CN">eMusic 下载包</comment>
<comment xml:lang="vi">gói nhạc tải xuống eMusic</comment>
- <comment xml:lang="zh-CN">eMusic 下载包</comment>
- <comment xml:lang="zh-TW">eMusic 下載包</comment>
+ <comment xml:lang="uk">пакунок завантаження eMusic</comment>
+ <comment xml:lang="tr">eMusic indirme paketi</comment>
+ <comment xml:lang="sv">eMusic-hämtningspaket</comment>
+ <comment xml:lang="sr">пакет преузимања еМузике</comment>
+ <comment xml:lang="sq">paketë shkarkimi eMusic</comment>
+ <comment xml:lang="sl">Datoteka paketa eMusic</comment>
+ <comment xml:lang="si">eMusic බාගත කිරීමේ පැකේජය</comment>
+ <comment xml:lang="sk">Balíček sťahovania eMusic</comment>
+ <comment xml:lang="ru">Пакет загрузок eMusic</comment>
+ <comment xml:lang="ro">pachet descărcare eMusic</comment>
+ <comment xml:lang="pt_BR">Pacote de download do eMusic</comment>
+ <comment xml:lang="pt">pacote transferido eMusic</comment>
+ <comment xml:lang="pl">Pobrany pakiet eMusic</comment>
+ <comment xml:lang="oc">paquet de telecargament eMusic</comment>
+ <comment xml:lang="nn">eMusic nedlastingspakke</comment>
+ <comment xml:lang="nl">eMusic-downloadpakket</comment>
+ <comment xml:lang="nb">eMusic nedlastingspakke</comment>
+ <comment xml:lang="lv">eMusic lejupielādes paciņa</comment>
+ <comment xml:lang="lt">eMusic atsiuntimo paketas</comment>
+ <comment xml:lang="ko">eMusic 다운로드 패키지</comment>
+ <comment xml:lang="kk">eMusic жүктемелер дестесі</comment>
+ <comment xml:lang="ja">eMusic ダウンロードパッケージ</comment>
+ <comment xml:lang="it">Pacchetto scaricamento eMusic</comment>
+ <comment xml:lang="is">eMusic niðurhalspakki</comment>
+ <comment xml:lang="id">paket unduh eMusic</comment>
+ <comment xml:lang="ia">Pacchetto de discargamento eMusic</comment>
+ <comment xml:lang="hu">eMusic letöltési csomag</comment>
+ <comment xml:lang="hr">eMusic preuzeti paket</comment>
+ <comment xml:lang="he">חבילת הורדה של eMusic</comment>
+ <comment xml:lang="gl">paquete de descarga de eMusic</comment>
+ <comment xml:lang="ga">pacáiste íosluchtú eMusic</comment>
+ <comment xml:lang="fur">pachet di discjariament eMusic</comment>
+ <comment xml:lang="fr">paquet de téléchargement eMusic</comment>
+ <comment xml:lang="fo">eMusic niðurtøkupakki</comment>
+ <comment xml:lang="fi">eMusic-imurointipaketti</comment>
+ <comment xml:lang="eu">eMusic deskargaren paketea</comment>
+ <comment xml:lang="es">paquete de descarga eMusic</comment>
+ <comment xml:lang="en_GB">eMusic download package</comment>
+ <comment xml:lang="el">Πακέτο λήψης eMusic</comment>
+ <comment xml:lang="de">eMusic-Download-Paket</comment>
+ <comment xml:lang="da">eMusic-downloadpakke</comment>
+ <comment xml:lang="cs">balíček stahování eMusic</comment>
+ <comment xml:lang="ca">paquet de baixades d'eMusic</comment>
+ <comment xml:lang="bg">Пакет за сваляне — eMusic</comment>
+ <comment xml:lang="be@latin">pakunak zahruzki eMusic</comment>
+ <comment xml:lang="be">пакет спампоўвання eMusic</comment>
+ <comment xml:lang="ar">حزمة تنزيل eMusic</comment>
+ <comment xml:lang="af">eMusic-aflaaipakket</comment>
<generic-icon name="package-x-generic"/>
- <magic priority="50">
+ <magic>
<match type="string" value="nF7YLao" offset="0"/>
</magic>
<glob pattern="*.emp"/>
</mime-type>
<mime-type type="application/vnd.google-earth.kml+xml">
<comment>KML geographic data</comment>
- <comment xml:lang="af">KML geografiese data</comment>
- <comment xml:lang="ar">بيانات جغرافية KML</comment>
- <comment xml:lang="bg">Географски данни — KML</comment>
- <comment xml:lang="ca">dades geogràfiques KML</comment>
- <comment xml:lang="cs">geografická data KML</comment>
- <comment xml:lang="da">Geografiske data i KML-format</comment>
- <comment xml:lang="de">KML geographische Daten</comment>
- <comment xml:lang="el">Γεωγραφικά δεδομένα KML</comment>
- <comment xml:lang="en-GB">KML geographic data</comment>
- <comment xml:lang="es">datos geográficos KML</comment>
- <comment xml:lang="eu">KML datu geografikoak</comment>
- <comment xml:lang="fi">KML-paikkatieto</comment>
- <comment xml:lang="fo">KML landafrøðilig dáta</comment>
- <comment xml:lang="fr">données géographiques KML</comment>
- <comment xml:lang="fur">dâts gjeografics KML</comment>
- <comment xml:lang="ga">sonraí geografacha KML</comment>
- <comment xml:lang="gl">datos xeográficos KML</comment>
- <comment xml:lang="he">מידע גאוגרפי KML</comment>
- <comment xml:lang="hr">KML geografski podaci</comment>
- <comment xml:lang="hu">KML földrajzi adatok</comment>
- <comment xml:lang="ia">Datos geographic KML</comment>
- <comment xml:lang="id">Data geografis KML</comment>
- <comment xml:lang="it">Dati geografici KML</comment>
- <comment xml:lang="ja">KML 地理データ</comment>
- <comment xml:lang="kk">KML географилық ақпараты</comment>
- <comment xml:lang="ko">KML 지리 정보 데이터</comment>
- <comment xml:lang="lt">KML geografiniai duomenys</comment>
- <comment xml:lang="lv">KML ģeogrāfiskie dati</comment>
- <comment xml:lang="nl">KML geographic data</comment>
- <comment xml:lang="oc">donadas geograficas KML</comment>
- <comment xml:lang="pl">Dane geograficzne KML</comment>
- <comment xml:lang="pt">dados geográficos KML</comment>
- <comment xml:lang="pt-BR">Dados geográficos KML</comment>
- <comment xml:lang="ro">Date geografice KML</comment>
- <comment xml:lang="ru">Географические данные KML</comment>
- <comment xml:lang="sk">Zemepisné údaje KML</comment>
- <comment xml:lang="sl">Datoteka geografskih podatkov KML</comment>
- <comment xml:lang="sr">КМЛ географски подаци</comment>
- <comment xml:lang="sv">KML geografisk data</comment>
- <comment xml:lang="tr">KML coğrafi verisi</comment>
+ <comment xml:lang="zh_TW">KML 地理資料</comment>
+ <comment xml:lang="zh_CN">KML 地理数据</comment>
<comment xml:lang="uk">географічні дані KML</comment>
- <comment xml:lang="zh-CN">KML 地理数据</comment>
- <comment xml:lang="zh-TW">KML 地理資料</comment>
+ <comment xml:lang="tr">KML coğrafi verisi</comment>
+ <comment xml:lang="sv">KML geografisk data</comment>
+ <comment xml:lang="sr">КМЛ географски подаци</comment>
+ <comment xml:lang="sq">të dhëna gjeografike KML</comment>
+ <comment xml:lang="sl">Datoteka geografskih podatkov KML</comment>
+ <comment xml:lang="si">KML භූගෝලීය දත්ත</comment>
+ <comment xml:lang="sk">Zemepisné údaje KML</comment>
+ <comment xml:lang="ru">Географические данные KML</comment>
+ <comment xml:lang="ro">Date geografice KML</comment>
+ <comment xml:lang="pt_BR">Dados geográficos KML</comment>
+ <comment xml:lang="pt">dados geográficos KML</comment>
+ <comment xml:lang="pl">Dane geograficzne KML</comment>
+ <comment xml:lang="oc">donadas geograficas KML</comment>
+ <comment xml:lang="nl">KML geografische gegevens</comment>
+ <comment xml:lang="lv">KML ģeogrāfiskie dati</comment>
+ <comment xml:lang="lt">KML geografiniai duomenys</comment>
+ <comment xml:lang="ko">KML 지리 정보 데이터</comment>
+ <comment xml:lang="kk">KML географилық ақпараты</comment>
+ <comment xml:lang="ja">KML 地理データ</comment>
+ <comment xml:lang="it">Dati geografici KML</comment>
+ <comment xml:lang="is">KML hnattstaðsetningargögn</comment>
+ <comment xml:lang="id">Data geografis KML</comment>
+ <comment xml:lang="ia">Datos geographic KML</comment>
+ <comment xml:lang="hu">KML földrajzi adatok</comment>
+ <comment xml:lang="hr">KML geografski podaci</comment>
+ <comment xml:lang="he">מידע גאוגרפי KML</comment>
+ <comment xml:lang="gl">datos xeográficos KML</comment>
+ <comment xml:lang="ga">sonraí geografacha KML</comment>
+ <comment xml:lang="fur">dâts gjeografics KML</comment>
+ <comment xml:lang="fr">données géographiques KML</comment>
+ <comment xml:lang="fo">KML landafrøðilig dáta</comment>
+ <comment xml:lang="fi">KML-paikkatieto</comment>
+ <comment xml:lang="eu">KML datu geografikoak</comment>
+ <comment xml:lang="es">datos geográficos KML</comment>
+ <comment xml:lang="en_GB">KML geographic data</comment>
+ <comment xml:lang="el">Γεωγραφικά δεδομένα KML</comment>
+ <comment xml:lang="de">KML-Geodaten</comment>
+ <comment xml:lang="da">Geografiske data i KML-format</comment>
+ <comment xml:lang="cs">geografická data KML</comment>
+ <comment xml:lang="ca">dades geogràfiques KML</comment>
+ <comment xml:lang="bg">Географски данни — KML</comment>
+ <comment xml:lang="be">геаграфічныя даныя KML</comment>
+ <comment xml:lang="ar">بيانات جغرافية KML</comment>
+ <comment xml:lang="af">KML geografiese data</comment>
<acronym>KML</acronym>
<expanded-acronym>Keyhole Markup Language</expanded-acronym>
<sub-class-of type="application/xml"/>
@@ -40240,49 +41453,53 @@ command to generate the output files.
</mime-type>
<mime-type type="application/vnd.google-earth.kmz">
<comment>KML geographic compressed data</comment>
- <comment xml:lang="af">KML saamgepersde geografiese data</comment>
- <comment xml:lang="ar">بيانات جغرافية مضغوطة KML</comment>
- <comment xml:lang="bg">Географски данни — KML, компресирани</comment>
- <comment xml:lang="ca">dades geogràfiques KML amb compressió</comment>
- <comment xml:lang="cs">komprimovaná geografická data KML</comment>
- <comment xml:lang="da">KML-geografiske komprimerede data</comment>
- <comment xml:lang="de">KML geographische komprimierte Daten</comment>
- <comment xml:lang="el">Γεωγραφικά συμπιεσμένα δεδομένα KML</comment>
- <comment xml:lang="en-GB">KML geographic compressed data</comment>
- <comment xml:lang="es">datos geográficos comprimidos KML</comment>
- <comment xml:lang="eu">KML datu geografiko konprimituak</comment>
- <comment xml:lang="fi">Pakattu KML-paikkatieto</comment>
- <comment xml:lang="fo">KML landafrøðilig stappað dáta</comment>
- <comment xml:lang="fr">données géographiques KML compressées</comment>
- <comment xml:lang="fur">dâts gjeografics KML comprimûts</comment>
- <comment xml:lang="ga">sonraí comhbhrúite geografacha KML</comment>
- <comment xml:lang="gl">datos xeográficos KML comprimidos </comment>
- <comment xml:lang="he">מידע גאוגרפי דחוס KML</comment>
- <comment xml:lang="hr">KML sažeti geografski podaci</comment>
- <comment xml:lang="hu">KML tömörített földrajzi adatok</comment>
- <comment xml:lang="ia">Datos geographic KML comprimite</comment>
- <comment xml:lang="id">Data geografis KML terkompresi</comment>
- <comment xml:lang="it">Dati geografici KML compressi</comment>
- <comment xml:lang="ja">KML 地理圧縮データ</comment>
- <comment xml:lang="kk">KML географиялық сығылған ақпарат</comment>
- <comment xml:lang="ko">KML 지리 정보 압축 데이터</comment>
- <comment xml:lang="lt">KML geografiniai suglaudinti duomenys</comment>
- <comment xml:lang="lv">KML saspiesti ģeogrāfiskie dati</comment>
- <comment xml:lang="nl">KML geographic compressed data</comment>
- <comment xml:lang="oc">donadas geograficas KML compressats</comment>
- <comment xml:lang="pl">Skompresowane dane geograficzne KML</comment>
- <comment xml:lang="pt">dados geográficos comprimidos KML</comment>
- <comment xml:lang="pt-BR">Dados geográficos KML compactados</comment>
- <comment xml:lang="ro">Date geografice comprimate KML</comment>
- <comment xml:lang="ru">Сжатые географические данные KML</comment>
- <comment xml:lang="sk">Komprimované zemepisné údaje KML</comment>
- <comment xml:lang="sl">Skrčeni geografski podatki KML</comment>
- <comment xml:lang="sr">КМЛ географски запаковани подаци</comment>
- <comment xml:lang="sv">KML geografiskt komprimerat data</comment>
- <comment xml:lang="tr">KML sıkıştırılmış coğrafi verisi</comment>
+ <comment xml:lang="zh_TW">KML 地理壓縮資料</comment>
+ <comment xml:lang="zh_CN">KML 地理压缩数据</comment>
<comment xml:lang="uk">стиснуті географічні дані KML</comment>
- <comment xml:lang="zh-CN">KML 地理压缩数据</comment>
- <comment xml:lang="zh-TW">KML 地理壓縮資料</comment>
+ <comment xml:lang="tr">KML sıkıştırılmış coğrafi verisi</comment>
+ <comment xml:lang="sv">KML geografiskt komprimerat data</comment>
+ <comment xml:lang="sr">КМЛ географски запаковани подаци</comment>
+ <comment xml:lang="sq">të dhëna gjeografike KML të ngjeshura</comment>
+ <comment xml:lang="sl">Skrčeni geografski podatki KML</comment>
+ <comment xml:lang="si">KML භූගෝලීය සම්පීඩිත දත්ත</comment>
+ <comment xml:lang="sk">Komprimované zemepisné údaje KML</comment>
+ <comment xml:lang="ru">Сжатые географические данные KML</comment>
+ <comment xml:lang="ro">Date geografice comprimate KML</comment>
+ <comment xml:lang="pt_BR">Dados geográficos KML compactados</comment>
+ <comment xml:lang="pt">dados geográficos comprimidos KML</comment>
+ <comment xml:lang="pl">Skompresowane dane geograficzne KML</comment>
+ <comment xml:lang="oc">donadas geograficas KML compressats</comment>
+ <comment xml:lang="nl">KML geografische gecomprimeerde gegevens</comment>
+ <comment xml:lang="lv">KML saspiesti ģeogrāfiskie dati</comment>
+ <comment xml:lang="lt">KML geografiniai suglaudinti duomenys</comment>
+ <comment xml:lang="ko">KML 지리 정보 압축 데이터</comment>
+ <comment xml:lang="kk">KML географиялық сығылған ақпарат</comment>
+ <comment xml:lang="ja">KML 地理圧縮データ</comment>
+ <comment xml:lang="it">Dati geografici KML compressi</comment>
+ <comment xml:lang="is">KML þjöppuð hnattstaðsetningargögn</comment>
+ <comment xml:lang="id">Data geografis KML terkompresi</comment>
+ <comment xml:lang="ia">Datos geographic KML comprimite</comment>
+ <comment xml:lang="hu">KML tömörített földrajzi adatok</comment>
+ <comment xml:lang="hr">KML sažeti geografski podaci</comment>
+ <comment xml:lang="he">מידע גאוגרפי דחוס KML</comment>
+ <comment xml:lang="gl">datos xeográficos KML comprimidos </comment>
+ <comment xml:lang="ga">sonraí comhbhrúite geografacha KML</comment>
+ <comment xml:lang="fur">dâts gjeografics KML comprimûts</comment>
+ <comment xml:lang="fr">données géographiques KML compressées</comment>
+ <comment xml:lang="fo">KML landafrøðilig stappað dáta</comment>
+ <comment xml:lang="fi">pakattu KML-paikkatieto</comment>
+ <comment xml:lang="eu">KML datu geografiko konprimituak</comment>
+ <comment xml:lang="es">datos geográficos comprimidos KML</comment>
+ <comment xml:lang="en_GB">KML geographic compressed data</comment>
+ <comment xml:lang="el">Γεωγραφικά συμπιεσμένα δεδομένα KML</comment>
+ <comment xml:lang="de">Komprimierte KML-Geodaten</comment>
+ <comment xml:lang="da">KML-geografiske komprimerede data</comment>
+ <comment xml:lang="cs">komprimovaná geografická data KML</comment>
+ <comment xml:lang="ca">dades geogràfiques KML amb compressió</comment>
+ <comment xml:lang="bg">Географски данни — KML, компресирани</comment>
+ <comment xml:lang="be">сціснутыя геаграфічныя даныя KML</comment>
+ <comment xml:lang="ar">بيانات جغرافية مضغوطة KML</comment>
+ <comment xml:lang="af">KML saamgepersde geografiese data</comment>
<acronym>KML</acronym>
<expanded-acronym>Keyhole Markup Language</expanded-acronym>
<sub-class-of type="application/zip"/>
@@ -40290,35 +41507,44 @@ command to generate the output files.
</mime-type>
<mime-type type="application/geo+json">
<comment>GeoJSON geospatial data</comment>
- <comment xml:lang="af">GeoJSON georuimtelike data</comment>
- <comment xml:lang="bg">Географски данни — GeoJSON</comment>
- <comment xml:lang="ca">dades geomàtiques GeoJSON</comment>
- <comment xml:lang="cs">geoprostorová data GeoJSON</comment>
- <comment xml:lang="da">GEoJSON-geospatiale data</comment>
- <comment xml:lang="de">GeoJSON raumbezogene Daten</comment>
- <comment xml:lang="en-GB">GeoJSON geospatial data</comment>
- <comment xml:lang="es">datos geoespaciales en GeoJSON</comment>
- <comment xml:lang="eu">GeoJSON geomatika datua</comment>
- <comment xml:lang="fi">GeoJSON-paikkatiedot</comment>
- <comment xml:lang="fr">données géospatiales GeoJSON</comment>
- <comment xml:lang="fur">dâts gjeo-spaziâls GeoJSON</comment>
- <comment xml:lang="ga">sonraí geospásúla GeoJSON</comment>
- <comment xml:lang="hr">GeoJSON geoprostorni podaci</comment>
- <comment xml:lang="hu">GeoJSON téradatok</comment>
- <comment xml:lang="id">Data geospasial GeoJSON</comment>
- <comment xml:lang="it">Dati geo-spaziali GeoJSON</comment>
- <comment xml:lang="kk">GeoJSON геокеңістіктік деректері</comment>
- <comment xml:lang="ko">GeoJSON 지리 정보 데이터</comment>
- <comment xml:lang="pl">Dane geoprzestrzenne GeoJSON</comment>
- <comment xml:lang="pt-BR">Dados geoespaciais GeoJSON</comment>
- <comment xml:lang="ru">Геопространственные данные GeoJSON</comment>
- <comment xml:lang="sk">Geopriestorové údaje GeoJSON</comment>
- <comment xml:lang="sr">ГеоЈСОН геопросторни подаци</comment>
- <comment xml:lang="sv">Geospatialt GeoJSON-data</comment>
- <comment xml:lang="tr">GeoJSON coğrafi verileri</comment>
+ <comment xml:lang="zh_TW">GeoJSON 地理空間資料</comment>
+ <comment xml:lang="zh_CN">GeoJSON 地理空间数据</comment>
<comment xml:lang="uk">геопросторові дані GeoJSON</comment>
- <comment xml:lang="zh-CN">GeoJSON 地理空间数据</comment>
- <comment xml:lang="zh-TW">GeoJSON 地理空間資料</comment>
+ <comment xml:lang="tr">GeoJSON coğrafi verileri</comment>
+ <comment xml:lang="sv">Geospatialt GeoJSON-data</comment>
+ <comment xml:lang="sr">ГеоЈСОН геопросторни подаци</comment>
+ <comment xml:lang="sq">të dhëna gjeohapësinore GeoJSON</comment>
+ <comment xml:lang="si">GeoJSON භූගෝලීය දත්ත</comment>
+ <comment xml:lang="sk">Geopriestorové údaje GeoJSON</comment>
+ <comment xml:lang="ru">Геопространственные данные GeoJSON</comment>
+ <comment xml:lang="pt_BR">Dados geoespaciais GeoJSON</comment>
+ <comment xml:lang="pl">Dane geoprzestrzenne GeoJSON</comment>
+ <comment xml:lang="nl">GeoJSON geospatiële gegevens</comment>
+ <comment xml:lang="ko">GeoJSON 지리 정보 데이터</comment>
+ <comment xml:lang="kk">GeoJSON геокеңістіктік деректері</comment>
+ <comment xml:lang="ja">GeoJSON 地理空間データ</comment>
+ <comment xml:lang="it">Dati geo-spaziali GeoJSON</comment>
+ <comment xml:lang="is">GeoJSON landupplýsingagögn</comment>
+ <comment xml:lang="id">Data geospasial GeoJSON</comment>
+ <comment xml:lang="hu">GeoJSON téradatok</comment>
+ <comment xml:lang="hr">GeoJSON geoprostorni podaci</comment>
+ <comment xml:lang="he">נתונים מרחביים ב־GeoJSON</comment>
+ <comment xml:lang="gl">Datos xeoespaciais GeoJSON</comment>
+ <comment xml:lang="ga">sonraí geospásúla GeoJSON</comment>
+ <comment xml:lang="fur">dâts gjeo-spaziâls GeoJSON</comment>
+ <comment xml:lang="fr">données géospatiales GeoJSON</comment>
+ <comment xml:lang="fi">GeoJSON-paikkatieto</comment>
+ <comment xml:lang="eu">GeoJSON geomatika datua</comment>
+ <comment xml:lang="es">datos geoespaciales en GeoJSON</comment>
+ <comment xml:lang="en_GB">GeoJSON geospatial data</comment>
+ <comment xml:lang="de">GeoJSON raumbezogene Daten</comment>
+ <comment xml:lang="da">GEoJSON-geospatiale data</comment>
+ <comment xml:lang="cs">geoprostorová data GeoJSON</comment>
+ <comment xml:lang="ca">dades geomàtiques GeoJSON</comment>
+ <comment xml:lang="bg">Географски данни — GeoJSON</comment>
+ <comment xml:lang="be">геапрасторавыя даныя GeoJSON</comment>
+ <comment xml:lang="ar">بيانات جغرافية مكانية GeoJSON</comment>
+ <comment xml:lang="af">GeoJSON georuimtelike data</comment>
<sub-class-of type="application/json"/>
<glob pattern="*.geojson"/>
<glob pattern="*.geo.json"/>
@@ -40326,37 +41552,46 @@ command to generate the output files.
</mime-type>
<mime-type type="application/gpx+xml">
<comment>GPX geographic data</comment>
- <comment xml:lang="af">GPX geografiese data</comment>
- <comment xml:lang="bg">Географски данни — GPX</comment>
- <comment xml:lang="ca">dades geogràfiques GPX</comment>
- <comment xml:lang="cs">geografická data GPX</comment>
- <comment xml:lang="da">GPX-geografiske data</comment>
- <comment xml:lang="de">GPX geographische Daten</comment>
- <comment xml:lang="en-GB">GPX geographic data</comment>
- <comment xml:lang="es">datos geográficos en GPX</comment>
- <comment xml:lang="eu">GPX datu geografikoak</comment>
- <comment xml:lang="fi">GPX-paikkatieto</comment>
- <comment xml:lang="fr">données géographiques GPX</comment>
- <comment xml:lang="fur">dâts gjeografics GPX</comment>
- <comment xml:lang="ga">sonraí geografacha GPX</comment>
- <comment xml:lang="he">נתונים גאוגרפיים GPX</comment>
- <comment xml:lang="hr">GPX geografski podaci</comment>
- <comment xml:lang="hu">GPX földrajzi adatok</comment>
- <comment xml:lang="id">Data geografis GPX</comment>
- <comment xml:lang="it">Dati geografici GPX</comment>
- <comment xml:lang="kk">GPX географикалық деректері</comment>
- <comment xml:lang="ko">GPX 지리 공간정보 데이터</comment>
- <comment xml:lang="oc">Donadas geograficas GPX</comment>
- <comment xml:lang="pl">Dane geograficzne GPX</comment>
- <comment xml:lang="pt-BR">Dados geográficos GPX</comment>
- <comment xml:lang="ru">Географические данные GPX</comment>
- <comment xml:lang="sk">Zemepisné údaje GPX</comment>
- <comment xml:lang="sr">ГПИкс географски подаци</comment>
- <comment xml:lang="sv">GPX geografisk data</comment>
- <comment xml:lang="tr">GPX coğrafi verileri</comment>
+ <comment xml:lang="zh_TW">GPX 地理資料</comment>
+ <comment xml:lang="zh_CN">GPX 地理数据</comment>
<comment xml:lang="uk">географічні дані GPX</comment>
- <comment xml:lang="zh-CN">GPX 地理数据</comment>
- <comment xml:lang="zh-TW">GPX 地理資料</comment>
+ <comment xml:lang="tr">GPX coğrafi verileri</comment>
+ <comment xml:lang="sv">GPX geografisk data</comment>
+ <comment xml:lang="sr">ГПИкс географски подаци</comment>
+ <comment xml:lang="sq">të dhëna gjeografike GPX</comment>
+ <comment xml:lang="sl">Zemljepisni podatki GPX</comment>
+ <comment xml:lang="si">GPX භූගෝලීය දත්ත</comment>
+ <comment xml:lang="sk">Zemepisné údaje GPX</comment>
+ <comment xml:lang="ru">Географические данные GPX</comment>
+ <comment xml:lang="pt_BR">Dados geográficos GPX</comment>
+ <comment xml:lang="pl">Dane geograficzne GPX</comment>
+ <comment xml:lang="oc">Donadas geograficas GPX</comment>
+ <comment xml:lang="nl">GPX geografische gegevens</comment>
+ <comment xml:lang="ko">GPX 지리 공간정보 데이터</comment>
+ <comment xml:lang="kk">GPX географикалық деректері</comment>
+ <comment xml:lang="ja">GPX 地理データ</comment>
+ <comment xml:lang="it">Dati geografici GPX</comment>
+ <comment xml:lang="is">GPX hnattstaðsetningargögn</comment>
+ <comment xml:lang="id">Data geografis GPX</comment>
+ <comment xml:lang="hu">GPX földrajzi adatok</comment>
+ <comment xml:lang="hr">GPX geografski podaci</comment>
+ <comment xml:lang="he">נתונים גאוגרפיים GPX</comment>
+ <comment xml:lang="gl">Datos xeográficos GPX</comment>
+ <comment xml:lang="ga">sonraí geografacha GPX</comment>
+ <comment xml:lang="fur">dâts gjeografics GPX</comment>
+ <comment xml:lang="fr">données géographiques GPX</comment>
+ <comment xml:lang="fi">GPX-paikkatieto</comment>
+ <comment xml:lang="eu">GPX datu geografikoak</comment>
+ <comment xml:lang="es">datos geográficos en GPX</comment>
+ <comment xml:lang="en_GB">GPX geographic data</comment>
+ <comment xml:lang="de">GPX geographische Daten</comment>
+ <comment xml:lang="da">GPX-geografiske data</comment>
+ <comment xml:lang="cs">geografická data GPX</comment>
+ <comment xml:lang="ca">dades geogràfiques GPX</comment>
+ <comment xml:lang="bg">Географски данни — GPX</comment>
+ <comment xml:lang="be">геаграфічныя даныя GPX</comment>
+ <comment xml:lang="ar">بيانات جغرافية GPX</comment>
+ <comment xml:lang="af">GPX geografiese data</comment>
<acronym>GPX</acronym>
<expanded-acronym>GPS Exchange Format</expanded-acronym>
<sub-class-of type="application/xml"/>
@@ -40369,55 +41604,58 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-ica">
<comment>Citrix ICA settings file</comment>
- <comment xml:lang="af">Citrix ICA-instellingslêer</comment>
- <comment xml:lang="ar">ملف إعدادات Citrix ICA</comment>
- <comment xml:lang="be-Latn">Fajł naładaŭ Citrix ICA</comment>
- <comment xml:lang="bg">Настройки — Citrix ICA</comment>
- <comment xml:lang="ca">fitxer d'ajusts de Citrix ICA</comment>
- <comment xml:lang="cs">soubor nastavení Citrix ICA</comment>
- <comment xml:lang="da">Citrix ICA-opsætningsfil</comment>
- <comment xml:lang="de">Citrix-ICA-Einstellungsdatei</comment>
- <comment xml:lang="el">Αρχείο ρυθμίσεων Citrix ICA</comment>
- <comment xml:lang="en-GB">Citrix ICA settings file</comment>
- <comment xml:lang="es">archivo de configuración de Citrix ICA</comment>
- <comment xml:lang="eu">Citrix ICA ezarpenen fitxategia</comment>
- <comment xml:lang="fi">Citrix ICA -asetustiedosto</comment>
- <comment xml:lang="fo">Citrix ICA stillingarfíla</comment>
- <comment xml:lang="fr">fichier de paramètres ICA Citrix</comment>
- <comment xml:lang="fur">file impostazions Citrix ICA</comment>
- <comment xml:lang="ga">comhad socruithe Citrix ICA</comment>
- <comment xml:lang="gl">ficheiro de configuracións de Citrix ICA</comment>
- <comment xml:lang="he">קובץ הגדרות של Citrix ICA</comment>
- <comment xml:lang="hr">Citrix ICA datoteka postavki</comment>
- <comment xml:lang="hu">Citrix ICA beállításfájl</comment>
- <comment xml:lang="ia">File de configuration ICA Citrix</comment>
- <comment xml:lang="id">Berkas penataan Citrix ICA</comment>
- <comment xml:lang="it">File impostazioni Citrix ICA</comment>
- <comment xml:lang="ja">Citrix ICA 設定ファイル</comment>
- <comment xml:lang="ka">Citrix ICA-ის პარამეტრების ფაილი</comment>
- <comment xml:lang="kk">Citrix ICA баптаулар файлы</comment>
- <comment xml:lang="ko">시트릭스 ICA 설정 파일</comment>
- <comment xml:lang="lt">Citrix ICA parametrų failas</comment>
- <comment xml:lang="lv">Citrix ICA iestatījumu datne</comment>
- <comment xml:lang="nb">Innstillingsfil for Citrix ICA</comment>
- <comment xml:lang="nl">Citrix ICA-instellingen</comment>
- <comment xml:lang="nn">Citrix ICA-innstillingsfil</comment>
- <comment xml:lang="oc">fichièr de paramètres ICA Citrix</comment>
- <comment xml:lang="pl">Plik ustawień Citrix ICA</comment>
- <comment xml:lang="pt">ficheiro de definições Citrix ICA</comment>
- <comment xml:lang="pt-BR">Arquivo de configuração do Citrix ICA</comment>
- <comment xml:lang="ro">Fișier de configurări Citrix ICA</comment>
- <comment xml:lang="ru">Файл настроек Citrix ICA</comment>
- <comment xml:lang="sk">Súbor nastavení Citrix ICA</comment>
- <comment xml:lang="sl">Nastavitvena datoteka Citrix ICA</comment>
- <comment xml:lang="sq">File rregullimesh Citrix ICA</comment>
- <comment xml:lang="sr">датотека подешавања Цитрикс ИЦА-а</comment>
- <comment xml:lang="sv">Citrix ICA-inställningsfil</comment>
- <comment xml:lang="tr">Citrix ICA ayar dosyası</comment>
- <comment xml:lang="uk">файл параметрів ICA Citrix</comment>
+ <comment xml:lang="zh_TW">Citrix ICA 設定值檔案</comment>
+ <comment xml:lang="zh_CN">Citrix ICA 设置文件</comment>
<comment xml:lang="vi">Tập tin thiết lập ICA Citrix</comment>
- <comment xml:lang="zh-CN">Citrix ICA 设置文件</comment>
- <comment xml:lang="zh-TW">Citrix ICA 設定值檔案</comment>
+ <comment xml:lang="uk">файл параметрів ICA Citrix</comment>
+ <comment xml:lang="tr">Citrix ICA ayar dosyası</comment>
+ <comment xml:lang="sv">Citrix ICA-inställningsfil</comment>
+ <comment xml:lang="sr">датотека подешавања Цитрикс ИЦА-а</comment>
+ <comment xml:lang="sq">kartelë rregullimesh Citrix ICA</comment>
+ <comment xml:lang="sl">Nastavitvena datoteka Citrix ICA</comment>
+ <comment xml:lang="si">Citrix ICA සැකසුම් ගොනුව</comment>
+ <comment xml:lang="sk">Súbor nastavení Citrix ICA</comment>
+ <comment xml:lang="ru">Файл настроек Citrix ICA</comment>
+ <comment xml:lang="ro">Fișier de configurări Citrix ICA</comment>
+ <comment xml:lang="pt_BR">Arquivo de configuração do Citrix ICA</comment>
+ <comment xml:lang="pt">ficheiro de definições Citrix ICA</comment>
+ <comment xml:lang="pl">Plik ustawień Citrix ICA</comment>
+ <comment xml:lang="oc">fichièr de paramètres ICA Citrix</comment>
+ <comment xml:lang="nn">Citrix ICA-innstillingsfil</comment>
+ <comment xml:lang="nl">Citrix ICA-instellingen</comment>
+ <comment xml:lang="nb">Innstillingsfil for Citrix ICA</comment>
+ <comment xml:lang="lv">Citrix ICA iestatījumu datne</comment>
+ <comment xml:lang="lt">Citrix ICA parametrų failas</comment>
+ <comment xml:lang="ko">시트릭스 ICA 설정 파일</comment>
+ <comment xml:lang="kk">Citrix ICA баптаулар файлы</comment>
+ <comment xml:lang="ka">Citrix ICA-ის პარამეტრების ფაილი</comment>
+ <comment xml:lang="ja">Citrix ICA 設定ファイル</comment>
+ <comment xml:lang="it">File impostazioni Citrix ICA</comment>
+ <comment xml:lang="is">Citrix ICA stillingaskrá</comment>
+ <comment xml:lang="id">Berkas penataan Citrix ICA</comment>
+ <comment xml:lang="ia">File de configuration ICA Citrix</comment>
+ <comment xml:lang="hu">Citrix ICA beállításfájl</comment>
+ <comment xml:lang="hr">Citrix ICA datoteka postavki</comment>
+ <comment xml:lang="he">קובץ הגדרות של Citrix ICA</comment>
+ <comment xml:lang="gl">ficheiro de configuracións de Citrix ICA</comment>
+ <comment xml:lang="ga">comhad socruithe Citrix ICA</comment>
+ <comment xml:lang="fur">file impostazions Citrix ICA</comment>
+ <comment xml:lang="fr">fichier de paramètres ICA Citrix</comment>
+ <comment xml:lang="fo">Citrix ICA stillingarfíla</comment>
+ <comment xml:lang="fi">Citrix ICA -asetustiedosto</comment>
+ <comment xml:lang="eu">Citrix ICA ezarpenen fitxategia</comment>
+ <comment xml:lang="es">archivo de configuración de Citrix ICA</comment>
+ <comment xml:lang="en_GB">Citrix ICA settings file</comment>
+ <comment xml:lang="el">Αρχείο ρυθμίσεων Citrix ICA</comment>
+ <comment xml:lang="de">Citrix-ICA-Einstellungsdatei</comment>
+ <comment xml:lang="da">Citrix ICA-opsætningsfil</comment>
+ <comment xml:lang="cs">soubor nastavení Citrix ICA</comment>
+ <comment xml:lang="ca">fitxer d'ajusts de Citrix ICA</comment>
+ <comment xml:lang="bg">Настройки — Citrix ICA</comment>
+ <comment xml:lang="be@latin">Fajł naładaŭ Citrix ICA</comment>
+ <comment xml:lang="be">файл налад Citrix ICA</comment>
+ <comment xml:lang="ar">ملف إعدادات Citrix ICA</comment>
+ <comment xml:lang="af">Citrix ICA-instellingslêer</comment>
<acronym>ICA</acronym>
<expanded-acronym>Independent Computing Architecture</expanded-acronym>
<sub-class-of type="text/plain"/>
@@ -40426,55 +41664,58 @@ command to generate the output files.
</mime-type>
<mime-type type="application/vnd.mozilla.xul+xml">
<comment>XUL interface document</comment>
- <comment xml:lang="af">XUL-koppelvlakdokument</comment>
- <comment xml:lang="ar">مستند واجهة XUL</comment>
- <comment xml:lang="ast">Documentu d'interfaz XUL</comment>
- <comment xml:lang="be-Latn">Interfejsny dakument XUL</comment>
- <comment xml:lang="bg">Документ — интерфейс, XUL</comment>
- <comment xml:lang="ca">document d'interfície XUL</comment>
- <comment xml:lang="cs">dokument rozhraní XUL</comment>
- <comment xml:lang="da">XUL-grænsefladedokument</comment>
- <comment xml:lang="de">XUL-Oberflächendokument</comment>
- <comment xml:lang="el">Έγγραφο διεπαφής XUL</comment>
- <comment xml:lang="en-GB">XUL interface document</comment>
- <comment xml:lang="es">documento de interfaz XUL</comment>
- <comment xml:lang="eu">XUL interfazearen dokumentua</comment>
- <comment xml:lang="fi">XUL-käyttöliittymäasiakirja</comment>
- <comment xml:lang="fo">XUL markamótsskjal</comment>
- <comment xml:lang="fr">document d'interface XUL</comment>
- <comment xml:lang="fur">document di interface XUL</comment>
- <comment xml:lang="ga">cáipéis chomhéadan XUL</comment>
- <comment xml:lang="gl">documento de interface XUL</comment>
- <comment xml:lang="he">מסמך ממשק XUL</comment>
- <comment xml:lang="hr">XUL dokument sučelja</comment>
- <comment xml:lang="hu">XUL-felületdokumentum</comment>
- <comment xml:lang="ia">Documento de interfacie XUL</comment>
- <comment xml:lang="id">Dokumen antarmuka XUL</comment>
- <comment xml:lang="it">Documento interfaccia XUL</comment>
- <comment xml:lang="ja">XUL インターフェイスドキュメント</comment>
- <comment xml:lang="kk">XUL интерфейс құжаты</comment>
- <comment xml:lang="ko">XUL 인터페이스 문서</comment>
- <comment xml:lang="lt">XUL sąsajos dokumentas</comment>
- <comment xml:lang="lv">XUL saskarnes dokuments</comment>
- <comment xml:lang="nb">XUL-grensesnittdokument</comment>
- <comment xml:lang="nl">XUL-interface-document</comment>
- <comment xml:lang="nn">XUL-grensesnitt-dokument</comment>
- <comment xml:lang="oc">document d'interfàcia XUL</comment>
- <comment xml:lang="pl">Dokument interfejsu XUL</comment>
- <comment xml:lang="pt">documento de ambiente XUL</comment>
- <comment xml:lang="pt-BR">Documento de interface XUL</comment>
- <comment xml:lang="ro">Document interfață XUL</comment>
- <comment xml:lang="ru">Документ интерфейса XUL</comment>
- <comment xml:lang="sk">Dokument rozhrania XUL</comment>
- <comment xml:lang="sl">Dokument vmesnika XUL</comment>
- <comment xml:lang="sq">Dokument interfaqe XUL</comment>
- <comment xml:lang="sr">документ ИксУЛ сучеља</comment>
- <comment xml:lang="sv">XUL-gränssnittsdokument</comment>
- <comment xml:lang="tr">XUL arayüz belgesi</comment>
- <comment xml:lang="uk">документ інтерфейсу XUL</comment>
+ <comment xml:lang="zh_TW">XUL 介面文件</comment>
+ <comment xml:lang="zh_CN">XUL 界面文档</comment>
<comment xml:lang="vi">Tài liệu giao diện XUL</comment>
- <comment xml:lang="zh-CN">XUL 界面文档</comment>
- <comment xml:lang="zh-TW">XUL 介面文件</comment>
+ <comment xml:lang="uk">документ інтерфейсу XUL</comment>
+ <comment xml:lang="tr">XUL arayüz belgesi</comment>
+ <comment xml:lang="sv">XUL-gränssnittsdokument</comment>
+ <comment xml:lang="sr">документ ИксУЛ сучеља</comment>
+ <comment xml:lang="sq">dokument ndërfaqeje XUL</comment>
+ <comment xml:lang="sl">Dokument vmesnika XUL</comment>
+ <comment xml:lang="si">XUL අතුරුමුහුණත් ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument rozhrania XUL</comment>
+ <comment xml:lang="ru">Документ интерфейса XUL</comment>
+ <comment xml:lang="ro">Document interfață XUL</comment>
+ <comment xml:lang="pt_BR">Documento de interface XUL</comment>
+ <comment xml:lang="pt">documento de ambiente XUL</comment>
+ <comment xml:lang="pl">Dokument interfejsu XUL</comment>
+ <comment xml:lang="oc">document d'interfàcia XUL</comment>
+ <comment xml:lang="nn">XUL-grensesnitt-dokument</comment>
+ <comment xml:lang="nl">XUL-interface-document</comment>
+ <comment xml:lang="nb">XUL-grensesnittdokument</comment>
+ <comment xml:lang="lv">XUL saskarnes dokuments</comment>
+ <comment xml:lang="lt">XUL sąsajos dokumentas</comment>
+ <comment xml:lang="ko">XUL 인터페이스 문서</comment>
+ <comment xml:lang="kk">XUL интерфейс құжаты</comment>
+ <comment xml:lang="ja">XUL インターフェイスドキュメント</comment>
+ <comment xml:lang="it">Documento interfaccia XUL</comment>
+ <comment xml:lang="is">XUL viðmótsskjal</comment>
+ <comment xml:lang="id">Dokumen antarmuka XUL</comment>
+ <comment xml:lang="ia">Documento de interfacie XUL</comment>
+ <comment xml:lang="hu">XUL-felületdokumentum</comment>
+ <comment xml:lang="hr">XUL dokument sučelja</comment>
+ <comment xml:lang="he">מסמך ממשק XUL</comment>
+ <comment xml:lang="gl">documento de interface XUL</comment>
+ <comment xml:lang="ga">cáipéis chomhéadan XUL</comment>
+ <comment xml:lang="fur">document di interface XUL</comment>
+ <comment xml:lang="fr">document d'interface XUL</comment>
+ <comment xml:lang="fo">XUL markamótsskjal</comment>
+ <comment xml:lang="fi">XUL-käyttöliittymäasiakirja</comment>
+ <comment xml:lang="eu">XUL interfazearen dokumentua</comment>
+ <comment xml:lang="es">documento de interfaz XUL</comment>
+ <comment xml:lang="en_GB">XUL interface document</comment>
+ <comment xml:lang="el">Έγγραφο διεπαφής XUL</comment>
+ <comment xml:lang="de">XUL-Benutzeroberflächendokument</comment>
+ <comment xml:lang="da">XUL-grænsefladedokument</comment>
+ <comment xml:lang="cs">dokument rozhraní XUL</comment>
+ <comment xml:lang="ca">document d'interfície XUL</comment>
+ <comment xml:lang="bg">Документ — интерфейс, XUL</comment>
+ <comment xml:lang="be@latin">Interfejsny dakument XUL</comment>
+ <comment xml:lang="be">дакумент інтэрфейсу XUL</comment>
+ <comment xml:lang="ast">Documentu d'interfaz XUL</comment>
+ <comment xml:lang="ar">مستند واجهة XUL</comment>
+ <comment xml:lang="af">XUL-koppelvlakdokument</comment>
<acronym>XUL</acronym>
<expanded-acronym>XML User interface markup Language</expanded-acronym>
<sub-class-of type="application/xml"/>
@@ -40484,492 +41725,549 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-xpinstall">
<comment>XPInstall installer module</comment>
- <comment xml:lang="af">XPInstall-installasiemodule</comment>
- <comment xml:lang="ar">وحدة مثبت XPInstall </comment>
- <comment xml:lang="bg">Пакет — инсталация XPInstall</comment>
- <comment xml:lang="ca">mòdul de l'instal·lador XPinstall</comment>
- <comment xml:lang="cs">modul instalátoru XPInstall</comment>
- <comment xml:lang="da">XPInstall-installationsmodul</comment>
- <comment xml:lang="de">XPInstall-Installationsmodul</comment>
- <comment xml:lang="el">Άρθρωμα εγκατάστασης XPInstall</comment>
- <comment xml:lang="en-GB">XPInstall installer module</comment>
- <comment xml:lang="es">módulo del instalador XPInstall</comment>
- <comment xml:lang="eu">XPInstall instalatzailearen modulua</comment>
- <comment xml:lang="fi">XPInstall-asennuspaketti</comment>
- <comment xml:lang="fo">XPInstall innleggjaramótul</comment>
- <comment xml:lang="fr">module d'installation XPInstall</comment>
- <comment xml:lang="fur">modul instaladôr XPInstall</comment>
- <comment xml:lang="ga">modúl suiteála XPInstall</comment>
- <comment xml:lang="gl">Módulo do instalador XPInstall</comment>
- <comment xml:lang="he">מודול התקנה של XPInstall</comment>
- <comment xml:lang="hr">XPInstall instalacijski modul</comment>
- <comment xml:lang="hu">XPInstall telepítőmodul</comment>
- <comment xml:lang="ia">Modulo de installation XPInstall</comment>
- <comment xml:lang="id">Modul installer XPInstall</comment>
- <comment xml:lang="it">Modulo installatore XPInstall</comment>
- <comment xml:lang="ja">XPInstall インストーラモジュール</comment>
- <comment xml:lang="kk">XPInstall орнату модулі</comment>
- <comment xml:lang="ko">XPInstall 설치 프로그램 모듈</comment>
- <comment xml:lang="lt">XPInstall įdiegiklio modulis</comment>
- <comment xml:lang="lv">XPInstall instalatora modulis</comment>
- <comment xml:lang="nl">XPInstall installeer module</comment>
- <comment xml:lang="oc">modul d'installacion XPInstall</comment>
- <comment xml:lang="pl">Moduł instalatora XPInstall</comment>
- <comment xml:lang="pt">módulo de instalador XPInstall</comment>
- <comment xml:lang="pt-BR">Módulo de instalador XPInstall</comment>
- <comment xml:lang="ro">Modul de instalare XPInstall</comment>
- <comment xml:lang="ru">Модуль установщика XPInstall</comment>
- <comment xml:lang="sk">Modul inštalátora XPInstall</comment>
- <comment xml:lang="sl">modul namestilnika XPInstall</comment>
- <comment xml:lang="sr">модул инсталатера Инсталирања ИксПе-а</comment>
- <comment xml:lang="sv">XPInstall-installeringsmodul</comment>
- <comment xml:lang="tr">XPInstall kurulum modülü</comment>
+ <comment xml:lang="zh_TW">XPInstall 安裝程式模組</comment>
+ <comment xml:lang="zh_CN">XPInstall 安装工具模块</comment>
<comment xml:lang="uk">модуль засобу встановлення XPInstall</comment>
- <comment xml:lang="zh-CN">XPInstall 安装工具模块</comment>
- <comment xml:lang="zh-TW">XPInstall 安裝程式模組</comment>
+ <comment xml:lang="tr">XPInstall kurulum modülü</comment>
+ <comment xml:lang="sv">XPInstall-installeringsmodul</comment>
+ <comment xml:lang="sr">модул инсталатера Инсталирања ИксПе-а</comment>
+ <comment xml:lang="sq">modul instaluesi XPInstall</comment>
+ <comment xml:lang="sl">modul namestilnika XPInstall</comment>
+ <comment xml:lang="si">XPI ස්ථාපක මොඩියුලය ස්ථාපනය කරන්න</comment>
+ <comment xml:lang="sk">Modul inštalátora XPInstall</comment>
+ <comment xml:lang="ru">Модуль установщика XPInstall</comment>
+ <comment xml:lang="ro">Modul de instalare XPInstall</comment>
+ <comment xml:lang="pt_BR">Módulo de instalador XPInstall</comment>
+ <comment xml:lang="pt">módulo de instalador XPInstall</comment>
+ <comment xml:lang="pl">Moduł instalatora XPInstall</comment>
+ <comment xml:lang="oc">modul d'installacion XPInstall</comment>
+ <comment xml:lang="nl">XPInstall installeer module</comment>
+ <comment xml:lang="lv">XPInstall instalatora modulis</comment>
+ <comment xml:lang="lt">XPInstall įdiegiklio modulis</comment>
+ <comment xml:lang="ko">XPInstall 설치 프로그램 모듈</comment>
+ <comment xml:lang="kk">XPInstall орнату модулі</comment>
+ <comment xml:lang="ja">XPInstall インストーラモジュール</comment>
+ <comment xml:lang="it">Modulo installatore XPInstall</comment>
+ <comment xml:lang="is">XPInstall uppsetningareining</comment>
+ <comment xml:lang="id">Modul installer XPInstall</comment>
+ <comment xml:lang="ia">Modulo de installation XPInstall</comment>
+ <comment xml:lang="hu">XPInstall telepítőmodul</comment>
+ <comment xml:lang="hr">XPInstall instalacijski modul</comment>
+ <comment xml:lang="he">מודול התקנה של XPInstall</comment>
+ <comment xml:lang="gl">Módulo do instalador XPInstall</comment>
+ <comment xml:lang="ga">modúl suiteála XPInstall</comment>
+ <comment xml:lang="fur">modul instaladôr XPInstall</comment>
+ <comment xml:lang="fr">module d'installation XPInstall</comment>
+ <comment xml:lang="fo">XPInstall innleggjaramótul</comment>
+ <comment xml:lang="fi">XPInstall-asennuspaketti</comment>
+ <comment xml:lang="eu">XPInstall instalatzailearen modulua</comment>
+ <comment xml:lang="es">módulo del instalador XPInstall</comment>
+ <comment xml:lang="en_GB">XPInstall installer module</comment>
+ <comment xml:lang="el">Άρθρωμα εγκατάστασης XPInstall</comment>
+ <comment xml:lang="de">XPInstall-Installationsmodul</comment>
+ <comment xml:lang="da">XPInstall-installationsmodul</comment>
+ <comment xml:lang="cs">modul instalátoru XPInstall</comment>
+ <comment xml:lang="ca">mòdul de l'instal·lador XPinstall</comment>
+ <comment xml:lang="bg">Пакет — инсталация XPInstall</comment>
+ <comment xml:lang="be">модуль усталёўшчыка XPInstall</comment>
+ <comment xml:lang="ar">وحدة مثبت XPInstall</comment>
+ <comment xml:lang="af">XPInstall-installasiemodule</comment>
<sub-class-of type="application/zip"/>
<glob pattern="*.xpi"/>
</mime-type>
<mime-type type="application/vnd.openxmlformats-officedocument.wordprocessingml.document">
<comment>Word 2007 document</comment>
- <comment xml:lang="af">Word 2007-dokument</comment>
- <comment xml:lang="ar">مستند Word 2007</comment>
- <comment xml:lang="ast">Documentu de Word 2007</comment>
- <comment xml:lang="bg">Документ — Word 2007</comment>
- <comment xml:lang="ca">document de Word 2007</comment>
- <comment xml:lang="cs">dokument Word 2007</comment>
- <comment xml:lang="da">Word 2007-dokument</comment>
- <comment xml:lang="de">Word-2007-Dokument</comment>
- <comment xml:lang="el">Έγγραφο Word 2007</comment>
- <comment xml:lang="en-GB">Word 2007 document</comment>
- <comment xml:lang="es">documento de Word 2007</comment>
- <comment xml:lang="eu">Word 2007 dokumentua</comment>
- <comment xml:lang="fi">Word 2007 -asiakirja</comment>
- <comment xml:lang="fo">Word 2007 skjal</comment>
- <comment xml:lang="fr">document Word 2007</comment>
- <comment xml:lang="fur">document Word 2007</comment>
- <comment xml:lang="ga">cáipéis Word 2007</comment>
- <comment xml:lang="gl">documento de Word 2007</comment>
- <comment xml:lang="he">מסמך Word 2007</comment>
- <comment xml:lang="hr">Word 2007 dokument</comment>
- <comment xml:lang="hu">Word 2007 dokumentum</comment>
- <comment xml:lang="ia">Documento Word 2007</comment>
- <comment xml:lang="id">Dokumen Word 2007</comment>
- <comment xml:lang="it">Documento Word 2007</comment>
- <comment xml:lang="ja">Word 2007 ドキュメント</comment>
- <comment xml:lang="kk">Word 2007 құжаты</comment>
- <comment xml:lang="ko">Word 2007 문서</comment>
- <comment xml:lang="lt">Word 2007 dokumentas</comment>
- <comment xml:lang="lv">Word 2007 dokuments</comment>
- <comment xml:lang="nl">Word 2007-document</comment>
- <comment xml:lang="oc">document Word 2007</comment>
- <comment xml:lang="pl">Dokument Word 2007</comment>
- <comment xml:lang="pt">documento Word 2007</comment>
- <comment xml:lang="pt-BR">Documento do Word 2007</comment>
- <comment xml:lang="ro">Document Word 2007</comment>
- <comment xml:lang="ru">Документ Word 2007</comment>
- <comment xml:lang="sk">Dokument Word 2007</comment>
- <comment xml:lang="sl">Dokument Word 2007</comment>
- <comment xml:lang="sr">документ Ворда 2007</comment>
- <comment xml:lang="sv">Word 2007-dokument</comment>
- <comment xml:lang="tr">Word 2007 belgesi</comment>
- <comment xml:lang="uk">документ Word 2007</comment>
+ <comment xml:lang="zh_TW">Word 2007 文件</comment>
+ <comment xml:lang="zh_CN">Word 2007 文档</comment>
<comment xml:lang="vi">Tài liệu Word 2007</comment>
- <comment xml:lang="zh-CN">Word 2007 文档</comment>
- <comment xml:lang="zh-TW">Word 2007 文件</comment>
+ <comment xml:lang="uk">документ Word 2007</comment>
+ <comment xml:lang="tr">Word 2007 belgesi</comment>
+ <comment xml:lang="sv">Word 2007-dokument</comment>
+ <comment xml:lang="sr">документ Ворда 2007</comment>
+ <comment xml:lang="sq">dokument Word 2007</comment>
+ <comment xml:lang="sl">Dokument Word 2007</comment>
+ <comment xml:lang="si">Word 2007 ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument Word 2007</comment>
+ <comment xml:lang="ru">Документ Word 2007</comment>
+ <comment xml:lang="ro">Document Word 2007</comment>
+ <comment xml:lang="pt_BR">Documento do Word 2007</comment>
+ <comment xml:lang="pt">documento Word 2007</comment>
+ <comment xml:lang="pl">Dokument Word 2007</comment>
+ <comment xml:lang="oc">document Word 2007</comment>
+ <comment xml:lang="nl">Word 2007-document</comment>
+ <comment xml:lang="lv">Word 2007 dokuments</comment>
+ <comment xml:lang="lt">Word 2007 dokumentas</comment>
+ <comment xml:lang="ko">Word 2007 문서</comment>
+ <comment xml:lang="kk">Word 2007 құжаты</comment>
+ <comment xml:lang="ja">Word 2007 ドキュメント</comment>
+ <comment xml:lang="it">Documento Word 2007</comment>
+ <comment xml:lang="is">Word 2007 skjal</comment>
+ <comment xml:lang="id">Dokumen Word 2007</comment>
+ <comment xml:lang="ia">Documento Word 2007</comment>
+ <comment xml:lang="hu">Word 2007 dokumentum</comment>
+ <comment xml:lang="hr">Word 2007 dokument</comment>
+ <comment xml:lang="he">מסמך Word 2007</comment>
+ <comment xml:lang="gl">documento de Word 2007</comment>
+ <comment xml:lang="ga">cáipéis Word 2007</comment>
+ <comment xml:lang="fur">document Word 2007</comment>
+ <comment xml:lang="fr">document Word 2007</comment>
+ <comment xml:lang="fo">Word 2007 skjal</comment>
+ <comment xml:lang="fi">Word 2007 -asiakirja</comment>
+ <comment xml:lang="eu">Word 2007 dokumentua</comment>
+ <comment xml:lang="es">documento de Word 2007</comment>
+ <comment xml:lang="en_GB">Word 2007 document</comment>
+ <comment xml:lang="el">Έγγραφο Word 2007</comment>
+ <comment xml:lang="de">Word-2007-Dokument</comment>
+ <comment xml:lang="da">Word 2007-dokument</comment>
+ <comment xml:lang="cs">dokument Word 2007</comment>
+ <comment xml:lang="ca">document de Word 2007</comment>
+ <comment xml:lang="bg">Документ — Word 2007</comment>
+ <comment xml:lang="be">дакумент Word 2007</comment>
+ <comment xml:lang="ast">Documentu de Word 2007</comment>
+ <comment xml:lang="ar">مستند ورد 2007</comment>
+ <comment xml:lang="af">Word 2007-dokument</comment>
<glob pattern="*.docx"/>
<sub-class-of type="application/zip"/>
<generic-icon name="x-office-document"/>
</mime-type>
<mime-type type="application/vnd.openxmlformats-officedocument.wordprocessingml.template">
<comment>Word 2007 document template</comment>
- <comment xml:lang="af">Word 2007-dokumentsjabloon</comment>
- <comment xml:lang="ast">Plantía de documentu de Word 2007</comment>
- <comment xml:lang="bg">Шаблон за документи — Word 2007</comment>
- <comment xml:lang="ca">plantilla de document de Word 2007</comment>
- <comment xml:lang="cs">šablona dokumentu Word 2007</comment>
- <comment xml:lang="da">Word 2007-dokumentskabelon</comment>
- <comment xml:lang="de">Word-2007-Dokumentvorlage</comment>
- <comment xml:lang="el">Πρότυπο έγγραφο Word 2007</comment>
- <comment xml:lang="en-GB">Word 2007 document template</comment>
- <comment xml:lang="es">plantilla de documento de Word 2007</comment>
- <comment xml:lang="eu">Word 2007 dokumentuaren txantiloia</comment>
- <comment xml:lang="fi">Word 2007 -asiakirjamalli</comment>
- <comment xml:lang="fr">modèle de document Word 2007</comment>
- <comment xml:lang="fur">model document Word 2007</comment>
- <comment xml:lang="ga">teimpléad cháipéis Word 2007</comment>
- <comment xml:lang="gl">Plantilla de documento de Word 2007</comment>
- <comment xml:lang="he">תבנית מסמך של Word 2007</comment>
- <comment xml:lang="hr">Word 2007 predložak dokumenta</comment>
- <comment xml:lang="hu">Word 2007 dokumentumsablon</comment>
- <comment xml:lang="ia">Patrono de documento Word 2007</comment>
- <comment xml:lang="id">Templat dokumen Word 2007</comment>
- <comment xml:lang="it">Modello documento Word 2007</comment>
- <comment xml:lang="ja">Word 2007 文書テンプレート</comment>
- <comment xml:lang="ka">Word 2007-ის დოკუმენტის შაბლონი</comment>
- <comment xml:lang="kk">Word 2007 құжатының үлгісі</comment>
- <comment xml:lang="ko">Word 2007 문서 서식</comment>
- <comment xml:lang="lv">Word 2007 dokumenta veidne</comment>
- <comment xml:lang="nl">Word 2007 document sjabloon</comment>
- <comment xml:lang="oc">modèl de document Word 2007</comment>
- <comment xml:lang="pl">Szablon dokumentu Word 2007</comment>
- <comment xml:lang="pt">modelo de documento Word 2007</comment>
- <comment xml:lang="pt-BR">Modelo de documento do Word 2007</comment>
- <comment xml:lang="ru">Шаблон документа Word 2007</comment>
- <comment xml:lang="sk">Šablóna dokumentu Word 2007</comment>
- <comment xml:lang="sl">Predloga dokumenta Word 2007</comment>
- <comment xml:lang="sr">шаблон документа Ворда 2007</comment>
- <comment xml:lang="sv">Word 2007-dokumentmall</comment>
- <comment xml:lang="tr">Word 2007 belge şablonu</comment>
+ <comment xml:lang="zh_TW">Word 2007 文件範本</comment>
+ <comment xml:lang="zh_CN">Word 2007 文档模板</comment>
<comment xml:lang="uk">шаблон документа Word 2007</comment>
- <comment xml:lang="zh-CN">Word 2007 文档模板</comment>
- <comment xml:lang="zh-TW">Word 2007 文件範本</comment>
+ <comment xml:lang="tr">Word 2007 belge şablonu</comment>
+ <comment xml:lang="sv">Word 2007-dokumentmall</comment>
+ <comment xml:lang="sr">шаблон документа Ворда 2007</comment>
+ <comment xml:lang="sq">gjedhe dokumentesh Word 2007</comment>
+ <comment xml:lang="sl">Predloga dokumenta Word 2007</comment>
+ <comment xml:lang="si">Word 2007 ලේඛන සැකිල්ල</comment>
+ <comment xml:lang="sk">Šablóna dokumentu Word 2007</comment>
+ <comment xml:lang="ru">Шаблон документа Word 2007</comment>
+ <comment xml:lang="pt_BR">Modelo de documento do Word 2007</comment>
+ <comment xml:lang="pt">modelo de documento Word 2007</comment>
+ <comment xml:lang="pl">Szablon dokumentu Word 2007</comment>
+ <comment xml:lang="oc">modèl de document Word 2007</comment>
+ <comment xml:lang="nl">Word 2007-documentsjabloon</comment>
+ <comment xml:lang="lv">Word 2007 dokumenta veidne</comment>
+ <comment xml:lang="ko">Word 2007 문서 서식</comment>
+ <comment xml:lang="kk">Word 2007 құжатының үлгісі</comment>
+ <comment xml:lang="ka">Word 2007-ის დოკუმენტის შაბლონი</comment>
+ <comment xml:lang="ja">Word 2007 ドキュメントテンプレート</comment>
+ <comment xml:lang="it">Modello documento Word 2007</comment>
+ <comment xml:lang="is">Word sniðmát fyrir textaskjal</comment>
+ <comment xml:lang="id">Templat dokumen Word 2007</comment>
+ <comment xml:lang="ia">Patrono de documento Word 2007</comment>
+ <comment xml:lang="hu">Word 2007 dokumentumsablon</comment>
+ <comment xml:lang="hr">Word 2007 predložak dokumenta</comment>
+ <comment xml:lang="he">תבנית מסמך של Word 2007</comment>
+ <comment xml:lang="gl">Plantilla de documento de Word 2007</comment>
+ <comment xml:lang="ga">teimpléad cháipéis Word 2007</comment>
+ <comment xml:lang="fur">model document Word 2007</comment>
+ <comment xml:lang="fr">modèle de document Word 2007</comment>
+ <comment xml:lang="fi">Word 2007 -asiakirjamalli</comment>
+ <comment xml:lang="eu">Word 2007 dokumentuaren txantiloia</comment>
+ <comment xml:lang="es">plantilla de documento de Word 2007</comment>
+ <comment xml:lang="en_GB">Word 2007 document template</comment>
+ <comment xml:lang="el">Πρότυπο έγγραφο Word 2007</comment>
+ <comment xml:lang="de">Word-2007-Dokumentvorlage</comment>
+ <comment xml:lang="da">Word 2007-dokumentskabelon</comment>
+ <comment xml:lang="cs">šablona dokumentu Word 2007</comment>
+ <comment xml:lang="ca">plantilla de document de Word 2007</comment>
+ <comment xml:lang="bg">Шаблон за документи — Word 2007</comment>
+ <comment xml:lang="be">шаблон дакумента Word 2007</comment>
+ <comment xml:lang="ast">Plantía de documentu de Word 2007</comment>
+ <comment xml:lang="ar">قالب مستند ورد 2007</comment>
+ <comment xml:lang="af">Word 2007-dokumentsjabloon</comment>
<glob pattern="*.dotx"/>
<sub-class-of type="application/zip"/>
<generic-icon name="x-office-document"/>
</mime-type>
<mime-type type="application/vnd.openxmlformats-officedocument.presentationml.presentation">
<comment>PowerPoint 2007 presentation</comment>
- <comment xml:lang="af">PowerPoint 2007-voorlegging</comment>
- <comment xml:lang="ar">عرض تقديمي PowerPoint 2007</comment>
- <comment xml:lang="bg">Презентация — PowerPoint 2007</comment>
- <comment xml:lang="ca">presentació de PowerPoint 2007</comment>
- <comment xml:lang="cs">prezentace PowerPoint 2007</comment>
- <comment xml:lang="da">PowerPoint 2007-præsentation</comment>
- <comment xml:lang="de">PowerPoint-2007-Präsentation</comment>
- <comment xml:lang="el">Παρουσίαση PowerPoint 2007</comment>
- <comment xml:lang="en-GB">PowerPoint 2007 presentation</comment>
- <comment xml:lang="es">presentación de PowerPoint 2007</comment>
- <comment xml:lang="eu">PowerPoint 2007 aurkezpena</comment>
- <comment xml:lang="fi">PowerPoint 2007 -esitys</comment>
- <comment xml:lang="fo">PowerPoint 2007 framløga</comment>
- <comment xml:lang="fr">présentation PowerPoint 2007</comment>
- <comment xml:lang="fur">presentazion PowerPoint 2007</comment>
- <comment xml:lang="ga">láithreoireacht PowerPoint 2007</comment>
- <comment xml:lang="gl">presentación de PowerPoint 2007</comment>
- <comment xml:lang="he">מצגת של PowerPoint 2007</comment>
- <comment xml:lang="hr">PowerPoint 2007 prezentacija</comment>
- <comment xml:lang="hu">PowerPoint 2007 prezentáció</comment>
- <comment xml:lang="ia">Presentation PowerPoint 2007</comment>
- <comment xml:lang="id">Presentasi PowerPoint 2007</comment>
- <comment xml:lang="it">Presentazione standard PowerPoint 2007</comment>
- <comment xml:lang="ja">PowerPoint 2007 プレゼンテーション</comment>
- <comment xml:lang="kk">PowerPoint 2007 презентациясы</comment>
- <comment xml:lang="ko">PowerPoint 2007 프레젠테이션</comment>
- <comment xml:lang="lt">PowerPoint 2007 pateiktis</comment>
- <comment xml:lang="lv">PowerPoint 2007 prezentācija</comment>
- <comment xml:lang="nl">PowerPoint 2007-presentatie</comment>
- <comment xml:lang="oc">presentacion PowerPoint 2007</comment>
- <comment xml:lang="pl">Prezentacja PowerPoint 2007</comment>
- <comment xml:lang="pt">apresentação PowerPoint 2007</comment>
- <comment xml:lang="pt-BR">Apresentação do PowerPoint 2007</comment>
- <comment xml:lang="ro">Prezentare PowerPoint 2007</comment>
- <comment xml:lang="ru">Презентация PowerPoint 2007</comment>
- <comment xml:lang="sk">Prezentácia PowerPoint 2007</comment>
- <comment xml:lang="sl">Predstavitev Microsoft PowerPoint 2007</comment>
- <comment xml:lang="sr">презентација Пауер Поинта 2007</comment>
- <comment xml:lang="sv">PowerPoint 2007-presentation</comment>
- <comment xml:lang="tr">PowerPoint 2007 sunumu</comment>
- <comment xml:lang="uk">презентація PowerPoint 2007</comment>
+ <comment xml:lang="zh_TW">PowerPoint 2007 簡報</comment>
+ <comment xml:lang="zh_CN">PowerPoint 2007 演示文稿</comment>
<comment xml:lang="vi">Trình diễn PowerPoint 2007</comment>
- <comment xml:lang="zh-CN">PowerPoint 2007 演示文稿</comment>
- <comment xml:lang="zh-TW">PowerPoint 2007 簡報</comment>
+ <comment xml:lang="uk">презентація PowerPoint 2007</comment>
+ <comment xml:lang="tr">PowerPoint 2007 sunumu</comment>
+ <comment xml:lang="sv">PowerPoint 2007-presentation</comment>
+ <comment xml:lang="sr">презентација Пауер Поинта 2007</comment>
+ <comment xml:lang="sq">paraqitje PowerPoint 2007</comment>
+ <comment xml:lang="sl">Predstavitev Microsoft PowerPoint 2007</comment>
+ <comment xml:lang="si">PowerPoint 2007 ඉදිරිපත් කිරීම</comment>
+ <comment xml:lang="sk">Prezentácia PowerPoint 2007</comment>
+ <comment xml:lang="ru">Презентация PowerPoint 2007</comment>
+ <comment xml:lang="ro">Prezentare PowerPoint 2007</comment>
+ <comment xml:lang="pt_BR">Apresentação do PowerPoint 2007</comment>
+ <comment xml:lang="pt">apresentação PowerPoint 2007</comment>
+ <comment xml:lang="pl">Prezentacja PowerPoint 2007</comment>
+ <comment xml:lang="oc">presentacion PowerPoint 2007</comment>
+ <comment xml:lang="nl">PowerPoint 2007-presentatie</comment>
+ <comment xml:lang="lv">PowerPoint 2007 prezentācija</comment>
+ <comment xml:lang="lt">PowerPoint 2007 pateiktis</comment>
+ <comment xml:lang="ko">PowerPoint 2007 프레젠테이션</comment>
+ <comment xml:lang="kk">PowerPoint 2007 презентациясы</comment>
+ <comment xml:lang="ja">PowerPoint 2007 プレゼンテーション</comment>
+ <comment xml:lang="it">Presentazione standard PowerPoint 2007</comment>
+ <comment xml:lang="is">PowerPoint 2007 kynning</comment>
+ <comment xml:lang="id">Presentasi PowerPoint 2007</comment>
+ <comment xml:lang="ia">Presentation PowerPoint 2007</comment>
+ <comment xml:lang="hu">PowerPoint 2007 prezentáció</comment>
+ <comment xml:lang="hr">PowerPoint 2007 prezentacija</comment>
+ <comment xml:lang="he">מצגת של PowerPoint 2007</comment>
+ <comment xml:lang="gl">presentación de PowerPoint 2007</comment>
+ <comment xml:lang="ga">láithreoireacht PowerPoint 2007</comment>
+ <comment xml:lang="fur">presentazion PowerPoint 2007</comment>
+ <comment xml:lang="fr">présentation PowerPoint 2007</comment>
+ <comment xml:lang="fo">PowerPoint 2007 framløga</comment>
+ <comment xml:lang="fi">PowerPoint 2007 -esitys</comment>
+ <comment xml:lang="eu">PowerPoint 2007 aurkezpena</comment>
+ <comment xml:lang="es">presentación de PowerPoint 2007</comment>
+ <comment xml:lang="en_GB">PowerPoint 2007 presentation</comment>
+ <comment xml:lang="el">Παρουσίαση PowerPoint 2007</comment>
+ <comment xml:lang="de">PowerPoint-2007-Präsentation</comment>
+ <comment xml:lang="da">PowerPoint 2007-præsentation</comment>
+ <comment xml:lang="cs">prezentace PowerPoint 2007</comment>
+ <comment xml:lang="ca">presentació de PowerPoint 2007</comment>
+ <comment xml:lang="bg">Презентация — PowerPoint 2007</comment>
+ <comment xml:lang="be">прэзентацыя PowerPoint 2007</comment>
+ <comment xml:lang="ar">عرض تقديمي بوربوينت 2007</comment>
+ <comment xml:lang="af">PowerPoint 2007-voorlegging</comment>
<glob pattern="*.pptx"/>
<sub-class-of type="application/zip"/>
<generic-icon name="x-office-presentation"/>
</mime-type>
<mime-type type="application/vnd.openxmlformats-officedocument.presentationml.slide">
<comment>PowerPoint 2007 slide</comment>
- <comment xml:lang="af">PowerPoint 2007-skyfie</comment>
- <comment xml:lang="bg">Кадър — PoerPoint 2007</comment>
- <comment xml:lang="ca">dispositiva de PowerPoint 2007</comment>
- <comment xml:lang="cs">snímek PowerPoint 2007</comment>
- <comment xml:lang="da">PowerPoint 2007-slide</comment>
- <comment xml:lang="de">PowerPoint 2007-Folie</comment>
- <comment xml:lang="el">Διαφάνεια PowerPoint 2007</comment>
- <comment xml:lang="en-GB">PowerPoint 2007 slide</comment>
- <comment xml:lang="es">diapositiva de PowerPoint 2007</comment>
- <comment xml:lang="eu">PowerPoint 2007 diapositiba</comment>
- <comment xml:lang="fi">PowerPoint 2007 -dia</comment>
- <comment xml:lang="fr">diapositive PowerPoint 2007</comment>
- <comment xml:lang="fur">diapositive PowerPoint 2007</comment>
- <comment xml:lang="ga">sleamhnán PowerPoint 2007</comment>
- <comment xml:lang="gl">Diaporama de PowerPoint 2007</comment>
- <comment xml:lang="he">שקופית של PowerPoint 2007</comment>
- <comment xml:lang="hr">PowerPoint 2007 slikovna prezentacija</comment>
- <comment xml:lang="hu">PowerPoint 2007 dia</comment>
- <comment xml:lang="ia">Diapositiva PowerPoint 2007</comment>
- <comment xml:lang="id">Slide PowerPoint 2007</comment>
- <comment xml:lang="it">Diapositiva PowerPoint 2007</comment>
- <comment xml:lang="ja">PowerPoint 2007 スライド</comment>
- <comment xml:lang="ka">PowerPoint 2007-ის სლაიდი</comment>
- <comment xml:lang="kk">PowerPoint 2007 слайды</comment>
- <comment xml:lang="ko">PowerPoint 2007 슬라이드</comment>
- <comment xml:lang="lv">PowerPoint 2007 slaids</comment>
- <comment xml:lang="nl">PowerPoint 2007 dia</comment>
- <comment xml:lang="oc">diapositive PowerPoint 2007</comment>
- <comment xml:lang="pl">Slajd PowerPoint 2007</comment>
- <comment xml:lang="pt">diapositivo PowerPoint 2007</comment>
- <comment xml:lang="pt-BR">Slide do PowerPoint 2007</comment>
- <comment xml:lang="ru">Слайд PowerPoint 2007</comment>
- <comment xml:lang="sk">Snímka PowerPoint 2007</comment>
- <comment xml:lang="sl">Prosojnica PowerPoint 2007</comment>
- <comment xml:lang="sr">слајд Пауер Поинта 2007</comment>
- <comment xml:lang="sv">PowerPoint 2007-bildspel</comment>
- <comment xml:lang="tr">PowerPoint 2007 slaytı</comment>
+ <comment xml:lang="zh_TW">PowerPoint 2007 投影片</comment>
+ <comment xml:lang="zh_CN">PowerPoint 2007 幻灯片</comment>
<comment xml:lang="uk">слайд PowerPoint 2007</comment>
- <comment xml:lang="zh-CN">PowerPoint 2007 幻灯片</comment>
- <comment xml:lang="zh-TW">PowerPoint 2007 投影片</comment>
+ <comment xml:lang="tr">PowerPoint 2007 slaytı</comment>
+ <comment xml:lang="sv">PowerPoint 2007-bildspel</comment>
+ <comment xml:lang="sr">слајд Пауер Поинта 2007</comment>
+ <comment xml:lang="sq">diapozitiv PowerPoint 2007</comment>
+ <comment xml:lang="sl">Prosojnica PowerPoint 2007</comment>
+ <comment xml:lang="si">PowerPoint 2007 ස්ලයිඩය</comment>
+ <comment xml:lang="sk">Snímka PowerPoint 2007</comment>
+ <comment xml:lang="ru">Слайд PowerPoint 2007</comment>
+ <comment xml:lang="pt_BR">Slide do PowerPoint 2007</comment>
+ <comment xml:lang="pt">diapositivo PowerPoint 2007</comment>
+ <comment xml:lang="pl">Slajd PowerPoint 2007</comment>
+ <comment xml:lang="oc">diapositive PowerPoint 2007</comment>
+ <comment xml:lang="nl">PowerPoint 2007-dia</comment>
+ <comment xml:lang="lv">PowerPoint 2007 slaids</comment>
+ <comment xml:lang="ko">PowerPoint 2007 슬라이드</comment>
+ <comment xml:lang="kk">PowerPoint 2007 слайды</comment>
+ <comment xml:lang="ka">PowerPoint 2007-ის სლაიდი</comment>
+ <comment xml:lang="ja">PowerPoint 2007 スライド</comment>
+ <comment xml:lang="it">Diapositiva PowerPoint 2007</comment>
+ <comment xml:lang="is">PowerPoint 2007 skyggna</comment>
+ <comment xml:lang="id">Slide PowerPoint 2007</comment>
+ <comment xml:lang="ia">Diapositiva PowerPoint 2007</comment>
+ <comment xml:lang="hu">PowerPoint 2007 dia</comment>
+ <comment xml:lang="hr">PowerPoint 2007 slikovna prezentacija</comment>
+ <comment xml:lang="he">שקופית של PowerPoint 2007</comment>
+ <comment xml:lang="gl">Diaporama de PowerPoint 2007</comment>
+ <comment xml:lang="ga">sleamhnán PowerPoint 2007</comment>
+ <comment xml:lang="fur">diapositive PowerPoint 2007</comment>
+ <comment xml:lang="fr">diapositive PowerPoint 2007</comment>
+ <comment xml:lang="fi">PowerPoint 2007 -dia</comment>
+ <comment xml:lang="eu">PowerPoint 2007 diapositiba</comment>
+ <comment xml:lang="es">diapositiva de PowerPoint 2007</comment>
+ <comment xml:lang="en_GB">PowerPoint 2007 slide</comment>
+ <comment xml:lang="el">Διαφάνεια PowerPoint 2007</comment>
+ <comment xml:lang="de">PowerPoint-2007-Folie</comment>
+ <comment xml:lang="da">PowerPoint 2007-slide</comment>
+ <comment xml:lang="cs">snímek PowerPoint 2007</comment>
+ <comment xml:lang="ca">dispositiva de PowerPoint 2007</comment>
+ <comment xml:lang="bg">Кадър — PoerPoint 2007</comment>
+ <comment xml:lang="be">слайд PowerPoint 2007</comment>
+ <comment xml:lang="ar">شريحة بوربوينت 2007</comment>
+ <comment xml:lang="af">PowerPoint 2007-skyfie</comment>
<glob pattern="*.sldx"/>
<sub-class-of type="application/zip"/>
<generic-icon name="x-office-presentation"/>
</mime-type>
<mime-type type="application/vnd.openxmlformats-officedocument.presentationml.slideshow">
<comment>PowerPoint 2007 show</comment>
- <comment xml:lang="af">PowerPoint 2007-vertoning</comment>
- <comment xml:lang="ar">عرض PowerPoint 2007</comment>
- <comment xml:lang="bg">Презентация-шоу — PowerPoint 2007</comment>
- <comment xml:lang="ca">exposició de PowerPoint 2007</comment>
- <comment xml:lang="cs">prezentace PowerPoint 2007</comment>
- <comment xml:lang="da">PowerPoint 2007-dias</comment>
- <comment xml:lang="de">PowerPoint-2007-Präsentation</comment>
- <comment xml:lang="el">Παρουσίαση PowerPoint 2007</comment>
- <comment xml:lang="en-GB">PowerPoint 2007 show</comment>
- <comment xml:lang="es">presentación autoejecutable de PowerPoint 2007</comment>
- <comment xml:lang="eu">PowerPoint 2007 ikuskizuna</comment>
- <comment xml:lang="fi">PowerPoint 2007 -diaesitys</comment>
- <comment xml:lang="fo">PowerPoint 2007 framsýning</comment>
- <comment xml:lang="fr">diaporama PowerPoint 2007</comment>
- <comment xml:lang="fur">esecuzion presentazion PowerPoint 2007</comment>
- <comment xml:lang="ga">taispeántas PowerPoint 2007</comment>
- <comment xml:lang="gl">Exposición de PowerPoint 2007</comment>
- <comment xml:lang="he">תצוגה של PowerPoint 2007</comment>
- <comment xml:lang="hr">PowerPoint 2007 prezentacija</comment>
- <comment xml:lang="hu">PowerPoint 2007 bemutató</comment>
- <comment xml:lang="ia">Projection de diapositivas PowerPoint 2007</comment>
- <comment xml:lang="id">Presentasi PowerPoint 2007</comment>
- <comment xml:lang="it">Solo presentazione PowerPoint 2007</comment>
- <comment xml:lang="ja">PowerPoint 2007 プレゼンテーション</comment>
- <comment xml:lang="kk">PowerPoint 2007 көрсетілімі</comment>
- <comment xml:lang="ko">PowerPoint 2007 쇼</comment>
- <comment xml:lang="lt">PowerPoint 2007 pateiktis</comment>
- <comment xml:lang="lv">PowerPoint 2007 slīdrāde</comment>
- <comment xml:lang="nl">PowerPoint 2007 show</comment>
- <comment xml:lang="oc">diaporama PowerPoint 2007</comment>
- <comment xml:lang="pl">Pokaz PowerPoint 2007</comment>
- <comment xml:lang="pt">espetáculo PowerPoint 2007</comment>
- <comment xml:lang="pt-BR">Apresentação do PowerPoint 2007</comment>
- <comment xml:lang="ro">Prezentare PowerPoint 2007</comment>
- <comment xml:lang="ru">Презентация PowerPoint 2007</comment>
- <comment xml:lang="sk">Ukážka PowerPoint 2007</comment>
- <comment xml:lang="sl">Zagonska predstavitev PowerPoint 2007</comment>
- <comment xml:lang="sr">приказ Пауер Поинта 2007</comment>
- <comment xml:lang="sv">PowerPoint 2007-visning</comment>
- <comment xml:lang="tr">PowerPoint 2007 gösterisi</comment>
+ <comment xml:lang="zh_TW">PowerPoint 2007 展示</comment>
+ <comment xml:lang="zh_CN">PowerPoint 2007 放映</comment>
<comment xml:lang="uk">показ слайдів PowerPoint 2007</comment>
- <comment xml:lang="zh-CN">PowerPoint 2007 放映</comment>
- <comment xml:lang="zh-TW">PowerPoint 2007 展示</comment>
+ <comment xml:lang="tr">PowerPoint 2007 gösterisi</comment>
+ <comment xml:lang="sv">PowerPoint 2007-visning</comment>
+ <comment xml:lang="sr">приказ Пауер Поинта 2007</comment>
+ <comment xml:lang="sl">Zagonska predstavitev PowerPoint 2007</comment>
+ <comment xml:lang="si">PowerPoint 2007 ප්රදර්ශනය</comment>
+ <comment xml:lang="sk">Ukážka PowerPoint 2007</comment>
+ <comment xml:lang="ru">Презентация PowerPoint 2007</comment>
+ <comment xml:lang="ro">Prezentare PowerPoint 2007</comment>
+ <comment xml:lang="pt_BR">Apresentação do PowerPoint 2007</comment>
+ <comment xml:lang="pt">espetáculo PowerPoint 2007</comment>
+ <comment xml:lang="pl">Pokaz PowerPoint 2007</comment>
+ <comment xml:lang="oc">diaporama PowerPoint 2007</comment>
+ <comment xml:lang="nl">PowerPoint 2007-show</comment>
+ <comment xml:lang="lv">PowerPoint 2007 slīdrāde</comment>
+ <comment xml:lang="lt">PowerPoint 2007 pateiktis</comment>
+ <comment xml:lang="ko">PowerPoint 2007 쇼</comment>
+ <comment xml:lang="kk">PowerPoint 2007 көрсетілімі</comment>
+ <comment xml:lang="ja">PowerPoint 2007 プレゼンテーション</comment>
+ <comment xml:lang="it">Solo presentazione PowerPoint 2007</comment>
+ <comment xml:lang="is">PowerPoint 2007 glærukynning</comment>
+ <comment xml:lang="id">Presentasi PowerPoint 2007</comment>
+ <comment xml:lang="ia">Projection de diapositivas PowerPoint 2007</comment>
+ <comment xml:lang="hu">PowerPoint 2007 bemutató</comment>
+ <comment xml:lang="hr">PowerPoint 2007 prezentacija</comment>
+ <comment xml:lang="he">תצוגה של PowerPoint 2007</comment>
+ <comment xml:lang="gl">Exposición de PowerPoint 2007</comment>
+ <comment xml:lang="ga">taispeántas PowerPoint 2007</comment>
+ <comment xml:lang="fur">esecuzion presentazion PowerPoint 2007</comment>
+ <comment xml:lang="fr">diaporama PowerPoint 2007</comment>
+ <comment xml:lang="fo">PowerPoint 2007 framsýning</comment>
+ <comment xml:lang="fi">PowerPoint 2007 -diaesitys</comment>
+ <comment xml:lang="eu">PowerPoint 2007 ikuskizuna</comment>
+ <comment xml:lang="es">presentación autoejecutable de PowerPoint 2007</comment>
+ <comment xml:lang="en_GB">PowerPoint 2007 show</comment>
+ <comment xml:lang="el">Παρουσίαση PowerPoint 2007</comment>
+ <comment xml:lang="de">PowerPoint-2007-Präsentation</comment>
+ <comment xml:lang="da">PowerPoint 2007-dias</comment>
+ <comment xml:lang="cs">prezentace PowerPoint 2007</comment>
+ <comment xml:lang="ca">exposició de PowerPoint 2007</comment>
+ <comment xml:lang="bg">Презентация-шоу — PowerPoint 2007</comment>
+ <comment xml:lang="be">паказ слайдаў PowerPoint 2007</comment>
+ <comment xml:lang="ar">عرض بوربوينت 2007</comment>
+ <comment xml:lang="af">PowerPoint 2007-vertoning</comment>
<glob pattern="*.ppsx"/>
<sub-class-of type="application/zip"/>
<generic-icon name="x-office-presentation"/>
</mime-type>
<mime-type type="application/vnd.openxmlformats-officedocument.presentationml.template">
<comment>PowerPoint 2007 presentation template</comment>
- <comment xml:lang="af">PowerPoint 2007-voorleggingsjabloon</comment>
- <comment xml:lang="bg">Шаблон за презентации — PowerPoint 2007</comment>
- <comment xml:lang="ca">plantilla de presentació de PowerPoint 2007</comment>
- <comment xml:lang="cs">šablona prezentace PowerPoint 2007</comment>
- <comment xml:lang="da">PowerPoint 2007-præsentationsskabelon</comment>
- <comment xml:lang="de">PowerPoint 2007-Präsentationsvorlage</comment>
- <comment xml:lang="el">Πρότυπο παρουσίασης PowerPoint 2007</comment>
- <comment xml:lang="en-GB">PowerPoint 2007 presentation template</comment>
- <comment xml:lang="es">plantilla de presentación de PowerPoint 2007</comment>
- <comment xml:lang="eu">PowerPoint 2007 aurkezpen txantiloia</comment>
- <comment xml:lang="fi">PowerPoint 2007 -esitysmalli</comment>
- <comment xml:lang="fr">modèle de présentation PowerPoint 2007</comment>
- <comment xml:lang="fur">model presentazion PowerPoint 2007</comment>
- <comment xml:lang="ga">teimpléad láithreoireachta PowerPoint 2007</comment>
- <comment xml:lang="gl">modelo de presentación de PowerPoint 2007</comment>
- <comment xml:lang="he">תבנית למצגת של PowerPoint 2007</comment>
- <comment xml:lang="hr">PowerPoint 2007 predložak prezentacije</comment>
- <comment xml:lang="hu">PowerPoint 2007 bemutatósablon</comment>
- <comment xml:lang="ia">Patrono de presentation PowerPoint 2007</comment>
- <comment xml:lang="id">Templat presentasi PowerPoint 2007</comment>
- <comment xml:lang="it">Modello presentazione PowerPoint 2007</comment>
- <comment xml:lang="ja">PowerPoint 2007 プレゼンテーションテンプレート</comment>
- <comment xml:lang="ka">PowerPoint 2007-ის პრეზენტაციის შაბლონი</comment>
- <comment xml:lang="kk">PowerPoint 2007 презентация шаблоны</comment>
- <comment xml:lang="ko">PowerPoint 2007 프레젠테이션 서식</comment>
- <comment xml:lang="lv">PowerPoint 2007 prezentācijas veidne</comment>
- <comment xml:lang="nl">PowerPoint 2007 presentation sjabloon</comment>
- <comment xml:lang="oc">modèl de presentacion PowerPoint 2007</comment>
- <comment xml:lang="pl">Szablon prezentacji PowerPoint 2007</comment>
- <comment xml:lang="pt">modelo de apresentação PowerPoint 2007</comment>
- <comment xml:lang="pt-BR">Modelo de apresentação do PowerPoint 2007</comment>
- <comment xml:lang="ru">Шаблон презентации PowerPoint 2007</comment>
- <comment xml:lang="sk">Šablóna prezentácie PowerPoint 2007</comment>
- <comment xml:lang="sl">Predloga predstavitve PowerPoint 2007</comment>
- <comment xml:lang="sr">шаблон презентације Пауер Поинта 2007</comment>
- <comment xml:lang="sv">PowerPoint 2007-presentationsmall</comment>
- <comment xml:lang="tr">PowerPoint 2007 sunum şablonu</comment>
+ <comment xml:lang="zh_TW">PowerPoint 2007 簡報範本</comment>
+ <comment xml:lang="zh_CN">PowerPoint 2007 演示文稿模板</comment>
<comment xml:lang="uk">шаблон презентації PowerPoint 2007</comment>
- <comment xml:lang="zh-CN">PowerPoint 2007 演示文稿模板</comment>
- <comment xml:lang="zh-TW">PowerPoint 2007 簡報範本</comment>
+ <comment xml:lang="tr">PowerPoint 2007 sunum şablonu</comment>
+ <comment xml:lang="sv">PowerPoint 2007-presentationsmall</comment>
+ <comment xml:lang="sr">шаблон презентације Пауер Поинта 2007</comment>
+ <comment xml:lang="sq">gjedhe paraqitjesh PowerPoint 2007</comment>
+ <comment xml:lang="sl">Predloga predstavitve PowerPoint 2007</comment>
+ <comment xml:lang="si">PowerPoint 2007 ඉදිරිපත් කිරීමේ අච්චුව</comment>
+ <comment xml:lang="sk">Šablóna prezentácie PowerPoint 2007</comment>
+ <comment xml:lang="ru">Шаблон презентации PowerPoint 2007</comment>
+ <comment xml:lang="pt_BR">Modelo de apresentação do PowerPoint 2007</comment>
+ <comment xml:lang="pt">modelo de apresentação PowerPoint 2007</comment>
+ <comment xml:lang="pl">Szablon prezentacji PowerPoint 2007</comment>
+ <comment xml:lang="oc">modèl de presentacion PowerPoint 2007</comment>
+ <comment xml:lang="nl">PowerPoint 2007-presentatiesjabloon</comment>
+ <comment xml:lang="lv">PowerPoint 2007 prezentācijas veidne</comment>
+ <comment xml:lang="ko">PowerPoint 2007 프레젠테이션 서식</comment>
+ <comment xml:lang="kk">PowerPoint 2007 презентация шаблоны</comment>
+ <comment xml:lang="ka">PowerPoint 2007-ის პრეზენტაციის შაბლონი</comment>
+ <comment xml:lang="ja">PowerPoint 2007 プレゼンテーションテンプレート</comment>
+ <comment xml:lang="it">Modello presentazione PowerPoint 2007</comment>
+ <comment xml:lang="is">PowerPoint 2007 sniðmát fyrir glærukynningu</comment>
+ <comment xml:lang="id">Templat presentasi PowerPoint 2007</comment>
+ <comment xml:lang="ia">Patrono de presentation PowerPoint 2007</comment>
+ <comment xml:lang="hu">PowerPoint 2007 bemutatósablon</comment>
+ <comment xml:lang="hr">PowerPoint 2007 predložak prezentacije</comment>
+ <comment xml:lang="he">תבנית למצגת של PowerPoint 2007</comment>
+ <comment xml:lang="gl">modelo de presentación de PowerPoint 2007</comment>
+ <comment xml:lang="ga">teimpléad láithreoireachta PowerPoint 2007</comment>
+ <comment xml:lang="fur">model presentazion PowerPoint 2007</comment>
+ <comment xml:lang="fr">modèle de présentation PowerPoint 2007</comment>
+ <comment xml:lang="fi">PowerPoint 2007 -esitysmalli</comment>
+ <comment xml:lang="eu">PowerPoint 2007 aurkezpen txantiloia</comment>
+ <comment xml:lang="es">plantilla de presentación de PowerPoint 2007</comment>
+ <comment xml:lang="en_GB">PowerPoint 2007 presentation template</comment>
+ <comment xml:lang="el">Πρότυπο παρουσίασης PowerPoint 2007</comment>
+ <comment xml:lang="de">PowerPoint-2007-Präsentationsvorlage</comment>
+ <comment xml:lang="da">PowerPoint 2007-præsentationsskabelon</comment>
+ <comment xml:lang="cs">šablona prezentace PowerPoint 2007</comment>
+ <comment xml:lang="ca">plantilla de presentació de PowerPoint 2007</comment>
+ <comment xml:lang="bg">Шаблон за презентации — PowerPoint 2007</comment>
+ <comment xml:lang="be">шаблон прэзентацыі PowerPoint 2007</comment>
+ <comment xml:lang="ar">قالب عرض بوربوينت 2007</comment>
+ <comment xml:lang="af">PowerPoint 2007-voorleggingsjabloon</comment>
<glob pattern="*.potx"/>
<sub-class-of type="application/zip"/>
<generic-icon name="x-office-presentation"/>
</mime-type>
<mime-type type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet">
<comment>Excel 2007 spreadsheet</comment>
- <comment xml:lang="af">Excel 2007-sigblad</comment>
- <comment xml:lang="ar">جدول Excel 2007</comment>
- <comment xml:lang="bg">Таблица — Excel 2007</comment>
- <comment xml:lang="ca">full de càlcul d'Excel 2007</comment>
- <comment xml:lang="cs">sešit Excel 2007</comment>
- <comment xml:lang="da">Excel 2007-regneark</comment>
- <comment xml:lang="de">Excel-2007-Tabelle</comment>
- <comment xml:lang="el">Λογιστικό φύλλο Excel 2007</comment>
- <comment xml:lang="en-GB">Excel 2007 spreadsheet</comment>
- <comment xml:lang="es">hoja de cálculo de Excel 2007</comment>
- <comment xml:lang="eu">Excel 2007 kalkulu-orria</comment>
- <comment xml:lang="fi">Excel 2007 -taulukko</comment>
- <comment xml:lang="fo">Excel 2007 rokniark</comment>
- <comment xml:lang="fr">feuille de calcul Excel 2007</comment>
- <comment xml:lang="fur">sfuei di calcul Excel 2007</comment>
- <comment xml:lang="ga">scarbhileog Excel 2007</comment>
- <comment xml:lang="gl">folla de cálculo de Excel 2007</comment>
- <comment xml:lang="he">גליון נתונים של Excel 2007</comment>
- <comment xml:lang="hr">Excel 2007 proračunska tablica</comment>
- <comment xml:lang="hu">Excel 2007 táblázat</comment>
- <comment xml:lang="ia">Folio de calculo Excel 2007</comment>
- <comment xml:lang="id">Lembar sebar Excel 2007</comment>
- <comment xml:lang="it">Foglio di calcolo Excel 2007</comment>
- <comment xml:lang="ja">Excel 2007 スプレッドシート</comment>
- <comment xml:lang="ka">Excel 2007-ის ცხრილი</comment>
- <comment xml:lang="kk">Excel 2007 электрондық кестесі</comment>
- <comment xml:lang="ko">Excel 2007 스프레드시트</comment>
- <comment xml:lang="lt">Excel 2007 skaičialentė</comment>
- <comment xml:lang="lv">Excel 2007 izklājlapa</comment>
- <comment xml:lang="nl">Excel 2007-rekenblad</comment>
- <comment xml:lang="oc">fuèlh de calcul Excel 2007</comment>
- <comment xml:lang="pl">Arkusz Excel 2007</comment>
- <comment xml:lang="pt">folha de cálculo Excel 2007</comment>
- <comment xml:lang="pt-BR">Planilha do Excel 2007</comment>
- <comment xml:lang="ro">Foaie de calcul Excel 2007</comment>
- <comment xml:lang="ru">Электронная таблица Excel 2007</comment>
- <comment xml:lang="sk">Zošit Excel 2007</comment>
- <comment xml:lang="sl">Razpredelnica Microsoft Excel 2007</comment>
- <comment xml:lang="sr">табела Ексела 2007</comment>
- <comment xml:lang="sv">Excel 2007-kalkylblad</comment>
- <comment xml:lang="tr">Excel 2007 hesap çizelgesi sayfası</comment>
- <comment xml:lang="uk">ел. таблиця Excel 2007</comment>
+ <comment xml:lang="zh_TW">Excel 2007 試算表</comment>
+ <comment xml:lang="zh_CN">Excel 2007 电子表格</comment>
<comment xml:lang="vi">Bảng tính Excel 2007</comment>
- <comment xml:lang="zh-CN">Excel 2007 电子表格</comment>
- <comment xml:lang="zh-TW">Excel 2007 試算表</comment>
+ <comment xml:lang="uk">електронна таблиця Excel 2007</comment>
+ <comment xml:lang="tr">Excel 2007 hesap çizelgesi sayfası</comment>
+ <comment xml:lang="sv">Excel 2007-kalkylblad</comment>
+ <comment xml:lang="sr">табела Ексела 2007</comment>
+ <comment xml:lang="sq">fletëllogaritje Excel 2007</comment>
+ <comment xml:lang="sl">Razpredelnica Microsoft Excel 2007</comment>
+ <comment xml:lang="si">Excel 2007 පැතුරුම්පත</comment>
+ <comment xml:lang="sk">Zošit Excel 2007</comment>
+ <comment xml:lang="ru">Электронная таблица Excel 2007</comment>
+ <comment xml:lang="ro">Foaie de calcul Excel 2007</comment>
+ <comment xml:lang="pt_BR">Planilha do Excel 2007</comment>
+ <comment xml:lang="pt">folha de cálculo Excel 2007</comment>
+ <comment xml:lang="pl">Arkusz Excel 2007</comment>
+ <comment xml:lang="oc">fuèlh de calcul Excel 2007</comment>
+ <comment xml:lang="nl">Excel 2007-rekenblad</comment>
+ <comment xml:lang="lv">Excel 2007 izklājlapa</comment>
+ <comment xml:lang="lt">Excel 2007 skaičialentė</comment>
+ <comment xml:lang="ko">Excel 2007 스프레드시트</comment>
+ <comment xml:lang="kk">Excel 2007 электрондық кестесі</comment>
+ <comment xml:lang="ka">Excel 2007-ის ცხრილი</comment>
+ <comment xml:lang="ja">Excel 2007 スプレッドシート</comment>
+ <comment xml:lang="it">Foglio di calcolo Excel 2007</comment>
+ <comment xml:lang="is">Excel 2007 töflureikniskjal</comment>
+ <comment xml:lang="id">Lembar sebar Excel 2007</comment>
+ <comment xml:lang="ia">Folio de calculo Excel 2007</comment>
+ <comment xml:lang="hu">Excel 2007 táblázat</comment>
+ <comment xml:lang="hr">Excel 2007 proračunska tablica</comment>
+ <comment xml:lang="he">גיליון נתונים של Excel 2007</comment>
+ <comment xml:lang="gl">folla de cálculo de Excel 2007</comment>
+ <comment xml:lang="ga">scarbhileog Excel 2007</comment>
+ <comment xml:lang="fur">sfuei di calcul Excel 2007</comment>
+ <comment xml:lang="fr">feuille de calcul Excel 2007</comment>
+ <comment xml:lang="fo">Excel 2007 rokniark</comment>
+ <comment xml:lang="fi">Excel 2007 -taulukko</comment>
+ <comment xml:lang="eu">Excel 2007 kalkulu-orria</comment>
+ <comment xml:lang="es">hoja de cálculo de Excel 2007</comment>
+ <comment xml:lang="en_GB">Excel 2007 spreadsheet</comment>
+ <comment xml:lang="el">Λογιστικό φύλλο Excel 2007</comment>
+ <comment xml:lang="de">Excel-2007-Tabelle</comment>
+ <comment xml:lang="da">Excel 2007-regneark</comment>
+ <comment xml:lang="cs">sešit Excel 2007</comment>
+ <comment xml:lang="ca">full de càlcul d'Excel 2007</comment>
+ <comment xml:lang="bg">Таблица — Excel 2007</comment>
+ <comment xml:lang="be">электронная табліца Excel 2007</comment>
+ <comment xml:lang="ar">جدول اكسل 2007</comment>
+ <comment xml:lang="af">Excel 2007-sigblad</comment>
<glob pattern="*.xlsx"/>
<sub-class-of type="application/zip"/>
<generic-icon name="x-office-spreadsheet"/>
</mime-type>
<mime-type type="application/vnd.openxmlformats-officedocument.spreadsheetml.template">
<comment>Excel 2007 spreadsheet template</comment>
- <comment xml:lang="af">Excel 2007-sigbladsjabloon</comment>
- <comment xml:lang="bg">Шаблон за таблици — Excel 2007</comment>
- <comment xml:lang="ca">plantilla de full de càlcul d'Excel 2007</comment>
- <comment xml:lang="cs">šablona sešitu Excel 2007</comment>
- <comment xml:lang="da">Excel 2007-regnearksskabelon</comment>
- <comment xml:lang="de">Excel 2007-Tabellenvorlage</comment>
- <comment xml:lang="el">Πρότυπο λογιστικού φύλλου Excel 2007</comment>
- <comment xml:lang="en-GB">Excel 2007 spreadsheet template</comment>
- <comment xml:lang="es">plantilla de hoja de cálculo de Excel 2007</comment>
- <comment xml:lang="eu">Excel 2007 kalkulu-orri txantiloia</comment>
- <comment xml:lang="fi">Excel 2007 -taulukkomalli</comment>
- <comment xml:lang="fr">modèle de feuille de calcul Excel 2007</comment>
- <comment xml:lang="fur">model sfuei di calcul Excel 2007</comment>
- <comment xml:lang="ga">teimpléad scarbhileoige Excel 2007</comment>
- <comment xml:lang="gl">modelo de folla de cálculo Excel 2007</comment>
- <comment xml:lang="he">תבנית של גיליון נתונים של Excel 2007</comment>
- <comment xml:lang="hr">Excel 2007 predložak proračunske tablice</comment>
- <comment xml:lang="hu">Excel 2007 táblázatsablon</comment>
- <comment xml:lang="ia">Patrono de folio de calculo Excel 2007</comment>
- <comment xml:lang="id">Templat lembar kerja Excel 2007</comment>
- <comment xml:lang="it">Modello foglio di calcolo Excel 2007</comment>
- <comment xml:lang="ja">Excel 2007 スプレッドシートテンプレート</comment>
- <comment xml:lang="ka">Excel 2007-ის ცხრილის შაბლონი</comment>
- <comment xml:lang="kk">Excel 2007 кесте шаблоны</comment>
- <comment xml:lang="ko">Excel 2007 스프레드시트 서식</comment>
- <comment xml:lang="lv">Excel 2007 izklājlapas veidne</comment>
- <comment xml:lang="nl">Excel 2007 spreadsheet sjabloon</comment>
- <comment xml:lang="oc">modèl de fuèlh de calcul Excel 2007</comment>
- <comment xml:lang="pl">Szablon arkusza Excel 2007</comment>
- <comment xml:lang="pt">modelo de folha de cálculo Excel 2007</comment>
- <comment xml:lang="pt-BR">Modelo de planilha do Excel 2007</comment>
- <comment xml:lang="ru">Шаблон электронной таблицы Excel 2007</comment>
- <comment xml:lang="sk">Šablóna zošitu Excel 2007</comment>
- <comment xml:lang="sl">Predloga razpredelnice Excel 2007</comment>
- <comment xml:lang="sr">шаблон табеле Ексела 2007</comment>
- <comment xml:lang="sv">Excel 2007-kalkylarksmall</comment>
- <comment xml:lang="tr">Excel 2007 hesap çizelgesi şablonu</comment>
+ <comment xml:lang="zh_TW">Excel 2007 試算表範本</comment>
+ <comment xml:lang="zh_CN">Excel 2007 电子表格模板</comment>
<comment xml:lang="uk">шаблон електронної таблиці Excel 2007</comment>
- <comment xml:lang="zh-CN">Excel 2007 电子表格模板</comment>
- <comment xml:lang="zh-TW">Excel 2007 試算表範本</comment>
+ <comment xml:lang="tr">Excel 2007 hesap çizelgesi şablonu</comment>
+ <comment xml:lang="sv">Excel 2007-kalkylarksmall</comment>
+ <comment xml:lang="sr">шаблон табеле Ексела 2007</comment>
+ <comment xml:lang="sq">gjedhe fletëllogaritjesh Excel 2007</comment>
+ <comment xml:lang="sl">Predloga razpredelnice Excel 2007</comment>
+ <comment xml:lang="si">Excel 2007 පැතුරුම්පත් අච්චුව</comment>
+ <comment xml:lang="sk">Šablóna zošitu Excel 2007</comment>
+ <comment xml:lang="ru">Шаблон электронной таблицы Excel 2007</comment>
+ <comment xml:lang="pt_BR">Modelo de planilha do Excel 2007</comment>
+ <comment xml:lang="pt">modelo de folha de cálculo Excel 2007</comment>
+ <comment xml:lang="pl">Szablon arkusza Excel 2007</comment>
+ <comment xml:lang="oc">modèl de fuèlh de calcul Excel 2007</comment>
+ <comment xml:lang="nl">Excel 2007 spreadsheet sjabloon</comment>
+ <comment xml:lang="lv">Excel 2007 izklājlapas veidne</comment>
+ <comment xml:lang="ko">Excel 2007 스프레드시트 서식</comment>
+ <comment xml:lang="kk">Excel 2007 кесте шаблоны</comment>
+ <comment xml:lang="ka">Excel 2007-ის ცხრილის შაბლონი</comment>
+ <comment xml:lang="ja">Excel 2007 スプレッドシートテンプレート</comment>
+ <comment xml:lang="it">Modello foglio di calcolo Excel 2007</comment>
+ <comment xml:lang="is">Excel 2007 töflureiknisniðmát</comment>
+ <comment xml:lang="id">Templat lembar kerja Excel 2007</comment>
+ <comment xml:lang="ia">Patrono de folio de calculo Excel 2007</comment>
+ <comment xml:lang="hu">Excel 2007 táblázatsablon</comment>
+ <comment xml:lang="hr">Excel 2007 predložak proračunske tablice</comment>
+ <comment xml:lang="he">תבנית של גיליון נתונים של Excel 2007</comment>
+ <comment xml:lang="gl">modelo de folla de cálculo Excel 2007</comment>
+ <comment xml:lang="ga">teimpléad scarbhileoige Excel 2007</comment>
+ <comment xml:lang="fur">model sfuei di calcul Excel 2007</comment>
+ <comment xml:lang="fr">modèle de feuille de calcul Excel 2007</comment>
+ <comment xml:lang="fi">Excel 2007 -taulukkomalli</comment>
+ <comment xml:lang="eu">Excel 2007 kalkulu-orri txantiloia</comment>
+ <comment xml:lang="es">plantilla de hoja de cálculo de Excel 2007</comment>
+ <comment xml:lang="en_GB">Excel 2007 spreadsheet template</comment>
+ <comment xml:lang="el">Πρότυπο λογιστικού φύλλου Excel 2007</comment>
+ <comment xml:lang="de">Excel-2007-Tabellenvorlage</comment>
+ <comment xml:lang="da">Excel 2007-regnearksskabelon</comment>
+ <comment xml:lang="cs">šablona sešitu Excel 2007</comment>
+ <comment xml:lang="ca">plantilla de full de càlcul d'Excel 2007</comment>
+ <comment xml:lang="bg">Шаблон за таблици — Excel 2007</comment>
+ <comment xml:lang="be">шаблон электроннай табліцы Excel 2007</comment>
+ <comment xml:lang="ar">قالب جدول اكسل 2007</comment>
+ <comment xml:lang="af">Excel 2007-sigbladsjabloon</comment>
<glob pattern="*.xltx"/>
<sub-class-of type="application/zip"/>
<generic-icon name="x-office-spreadsheet"/>
</mime-type>
+ <mime-type type="application/vnd.ms-officetheme">
+ <comment>Microsoft Office 2007 theme</comment>
+ <comment xml:lang="uk">тема Microsoft Office 2007</comment>
+ <comment xml:lang="sv">Microsoft Office 2007-tema</comment>
+ <comment xml:lang="ru">Тема Microsoft Office 2007</comment>
+ <comment xml:lang="pl">Motyw Microsoft Office 2007</comment>
+ <comment xml:lang="it">Tema Microsoft Office 2007</comment>
+ <comment xml:lang="eu">Microsoft Office 2007 gaia</comment>
+ <comment xml:lang="es">tema de Microsoft Office 2007</comment>
+ <comment xml:lang="de">Microsoft-Office-2007-Thema</comment>
+ <comment xml:lang="be">тэма Microsoft Office 2007</comment>
+ <glob pattern="*.thmx"/>
+ <sub-class-of type="application/zip"/>
+ <generic-icon name="text-x-generic-template"/>
+ </mime-type>
<mime-type type="application/x-t602">
<comment>T602 document</comment>
- <comment xml:lang="af">T602-dokument</comment>
- <comment xml:lang="ar">مستند T602</comment>
- <comment xml:lang="ast">Documentu T602</comment>
- <comment xml:lang="be-Latn">Dakument T602</comment>
- <comment xml:lang="bg">Документ — T602</comment>
- <comment xml:lang="ca">document T602</comment>
- <comment xml:lang="cs">dokument T602</comment>
- <comment xml:lang="da">T602-dokument</comment>
- <comment xml:lang="de">T602-Dokument</comment>
- <comment xml:lang="el">Έγγραφο T602</comment>
- <comment xml:lang="en-GB">T602 document</comment>
- <comment xml:lang="eo">T602-dokumento</comment>
- <comment xml:lang="es">documento T602</comment>
- <comment xml:lang="eu">T602 dokumentua</comment>
- <comment xml:lang="fi">T602-asiakirja</comment>
- <comment xml:lang="fo">T602 skjal</comment>
- <comment xml:lang="fr">document T602</comment>
- <comment xml:lang="fur">document T602</comment>
- <comment xml:lang="ga">cáipéis T602</comment>
- <comment xml:lang="gl">documento T602</comment>
- <comment xml:lang="he">מסמך T602</comment>
- <comment xml:lang="hr">T602 dokument</comment>
- <comment xml:lang="hu">T602 dokumentum</comment>
- <comment xml:lang="ia">Documento T602</comment>
- <comment xml:lang="id">Dokumen T602</comment>
- <comment xml:lang="it">Documento T602</comment>
- <comment xml:lang="ja">T602 ドキュメント</comment>
- <comment xml:lang="kk">T602 құжаты</comment>
- <comment xml:lang="ko">T602 문서</comment>
- <comment xml:lang="lt">T602 dokumentas</comment>
- <comment xml:lang="lv">T602 dokuments</comment>
- <comment xml:lang="nb">T602-dokument</comment>
- <comment xml:lang="nl">T602-document</comment>
- <comment xml:lang="nn">T602-dokument</comment>
- <comment xml:lang="oc">document T602</comment>
- <comment xml:lang="pl">Dokument T602</comment>
- <comment xml:lang="pt">documento T602</comment>
- <comment xml:lang="pt-BR">Documento T602</comment>
- <comment xml:lang="ro">Document T602</comment>
- <comment xml:lang="ru">Документ T602</comment>
- <comment xml:lang="sk">Dokument T602</comment>
- <comment xml:lang="sl">Dokument T602</comment>
- <comment xml:lang="sq">Dokument T602</comment>
- <comment xml:lang="sr">Т602 документ</comment>
- <comment xml:lang="sv">T602-dokument</comment>
- <comment xml:lang="tr">T602 belgesi</comment>
- <comment xml:lang="uk">документ T602</comment>
+ <comment xml:lang="zh_TW">T602 文件</comment>
+ <comment xml:lang="zh_CN">T602 文档</comment>
<comment xml:lang="vi">Tài liệu T602</comment>
- <comment xml:lang="zh-CN">T602 文档</comment>
- <comment xml:lang="zh-TW">T602 文件</comment>
+ <comment xml:lang="uk">документ T602</comment>
+ <comment xml:lang="tr">T602 belgesi</comment>
+ <comment xml:lang="sv">T602-dokument</comment>
+ <comment xml:lang="sr">Т602 документ</comment>
+ <comment xml:lang="sq">dokument T602</comment>
+ <comment xml:lang="sl">Dokument T602</comment>
+ <comment xml:lang="si">T602 ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument T602</comment>
+ <comment xml:lang="ru">Документ T602</comment>
+ <comment xml:lang="ro">Document T602</comment>
+ <comment xml:lang="pt_BR">Documento T602</comment>
+ <comment xml:lang="pt">documento T602</comment>
+ <comment xml:lang="pl">Dokument T602</comment>
+ <comment xml:lang="oc">document T602</comment>
+ <comment xml:lang="nn">T602-dokument</comment>
+ <comment xml:lang="nl">T602-document</comment>
+ <comment xml:lang="nb">T602-dokument</comment>
+ <comment xml:lang="lv">T602 dokuments</comment>
+ <comment xml:lang="lt">T602 dokumentas</comment>
+ <comment xml:lang="ko">T602 문서</comment>
+ <comment xml:lang="kk">T602 құжаты</comment>
+ <comment xml:lang="ja">T602 ドキュメント</comment>
+ <comment xml:lang="it">Documento T602</comment>
+ <comment xml:lang="is">T602 skjal</comment>
+ <comment xml:lang="id">Dokumen T602</comment>
+ <comment xml:lang="ia">Documento T602</comment>
+ <comment xml:lang="hu">T602 dokumentum</comment>
+ <comment xml:lang="hr">T602 dokument</comment>
+ <comment xml:lang="he">מסמך T602</comment>
+ <comment xml:lang="gl">documento T602</comment>
+ <comment xml:lang="ga">cáipéis T602</comment>
+ <comment xml:lang="fur">document T602</comment>
+ <comment xml:lang="fr">document T602</comment>
+ <comment xml:lang="fo">T602 skjal</comment>
+ <comment xml:lang="fi">T602-asiakirja</comment>
+ <comment xml:lang="eu">T602 dokumentua</comment>
+ <comment xml:lang="es">documento T602</comment>
+ <comment xml:lang="eo">T602-dokumento</comment>
+ <comment xml:lang="en_GB">T602 document</comment>
+ <comment xml:lang="el">Έγγραφο T602</comment>
+ <comment xml:lang="de">T602-Dokument</comment>
+ <comment xml:lang="da">T602-dokument</comment>
+ <comment xml:lang="cs">dokument T602</comment>
+ <comment xml:lang="ca">document T602</comment>
+ <comment xml:lang="bg">Документ — T602</comment>
+ <comment xml:lang="be@latin">Dakument T602</comment>
+ <comment xml:lang="be">дакумент T602</comment>
+ <comment xml:lang="ast">Documentu T602</comment>
+ <comment xml:lang="ar">مستند T602</comment>
+ <comment xml:lang="af">T602-dokument</comment>
<generic-icon name="x-office-document"/>
- <magic priority="50">
+ <magic>
<match offset="0" type="string" value="@CT 0"/>
<match offset="0" type="string" value="@CT 1"/>
<match offset="0" type="string" value="@CT 2"/>
@@ -40978,33 +42276,44 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-cisco-vpn-settings">
<comment>Cisco VPN settings</comment>
- <comment xml:lang="bg">Настройки — ВЧМ на Cisco</comment>
- <comment xml:lang="ca">ajusts VPN de Cisco</comment>
- <comment xml:lang="da">Cisco VPN-indstillinger</comment>
- <comment xml:lang="de">Cisco-VPN-Einstellungen</comment>
- <comment xml:lang="en-GB">Cisco VPN settings</comment>
- <comment xml:lang="es">configuración de Cisco VPN</comment>
- <comment xml:lang="eu">Cisco VPN ezarpenak</comment>
- <comment xml:lang="fi">Ciscon VPN-asetukset</comment>
- <comment xml:lang="fr">paramètres VPN Cisco</comment>
- <comment xml:lang="hr">Cisco VPN postavke</comment>
- <comment xml:lang="hu">Cisco VPN beállítások</comment>
- <comment xml:lang="id">Pengaturan VPN Cisco</comment>
- <comment xml:lang="it">Impostazioni VPN Cisco</comment>
- <comment xml:lang="kk">Cisco VPN баптаулары</comment>
- <comment xml:lang="ko">시스코 VPN 설정</comment>
- <comment xml:lang="pl">Ustawienia VPN Cisco</comment>
- <comment xml:lang="pt-BR">Configurações de VPN da Cisco</comment>
- <comment xml:lang="ru">Файл настроек Cisco VPN</comment>
- <comment xml:lang="sk">Nastavenia Cisco VPN</comment>
- <comment xml:lang="sl">Nastavitve Cisco VPN</comment>
- <comment xml:lang="sv">Cisco VPN-inställningar</comment>
- <comment xml:lang="tr">Cisco VPN ayarları</comment>
+ <comment xml:lang="zh_TW">Cisco VPN 設定</comment>
+ <comment xml:lang="zh_CN">Cisco VPN 设置</comment>
<comment xml:lang="uk">параметри VPN Cisco</comment>
- <comment xml:lang="zh-CN">Cisco VPN 设置</comment>
- <comment xml:lang="zh-TW">Cisco VPN 設定</comment>
+ <comment xml:lang="tr">Cisco VPN ayarları</comment>
+ <comment xml:lang="sv">Cisco VPN-inställningar</comment>
+ <comment xml:lang="sq">rregullime VPN-je Cisco</comment>
+ <comment xml:lang="sl">Nastavitve Cisco VPN</comment>
+ <comment xml:lang="si">Cisco VPN සැකසුම්</comment>
+ <comment xml:lang="sk">Nastavenia Cisco VPN</comment>
+ <comment xml:lang="ru">Файл настроек Cisco VPN</comment>
+ <comment xml:lang="pt_BR">Configurações de VPN da Cisco</comment>
+ <comment xml:lang="pl">Ustawienia VPN Cisco</comment>
+ <comment xml:lang="oc">paramètres VPN Cisco</comment>
+ <comment xml:lang="nl">Cisco VPN-instellingen</comment>
+ <comment xml:lang="ko">시스코 VPN 설정</comment>
+ <comment xml:lang="kk">Cisco VPN баптаулары</comment>
+ <comment xml:lang="ja">Cisco VPN 設定</comment>
+ <comment xml:lang="it">Impostazioni VPN Cisco</comment>
+ <comment xml:lang="is">Cisco VPN-stillingar</comment>
+ <comment xml:lang="id">Pengaturan VPN Cisco</comment>
+ <comment xml:lang="hu">Cisco VPN beállítások</comment>
+ <comment xml:lang="hr">Cisco VPN postavke</comment>
+ <comment xml:lang="he">הגדרות VPN של Cisco</comment>
+ <comment xml:lang="gl">Configuracións de Cisco VPN</comment>
+ <comment xml:lang="fr">paramètres VPN Cisco</comment>
+ <comment xml:lang="fi">Ciscon VPN-asetukset</comment>
+ <comment xml:lang="eu">Cisco VPN ezarpenak</comment>
+ <comment xml:lang="es">configuración de Cisco VPN</comment>
+ <comment xml:lang="en_GB">Cisco VPN settings</comment>
+ <comment xml:lang="de">Cisco-VPN-Einstellungen</comment>
+ <comment xml:lang="da">Cisco VPN-indstillinger</comment>
+ <comment xml:lang="ca">ajusts VPN de Cisco</comment>
+ <comment xml:lang="bg">Настройки — ВЧМ на Cisco</comment>
+ <comment xml:lang="be">налады Cisco VPN</comment>
+ <comment xml:lang="ar">إعدادات Cisco VPN</comment>
+ <sub-class-of type="text/plain"/>
<generic-icon name="text-x-generic"/>
- <magic priority="50">
+ <magic>
<match type="string" value="[main]" offset="0">
<match type="string" value="AuthType=" offset="0:256"/>
</match>
@@ -41013,52 +42322,59 @@ command to generate the output files.
</mime-type>
<mime-type type="application/vnd.iccprofile">
<comment>ICC profile</comment>
- <comment xml:lang="af">ICC-profiel</comment>
- <comment xml:lang="ar">تشكيلة OCL</comment>
- <comment xml:lang="ast">Perfil ICC</comment>
- <comment xml:lang="bg">Цветови профил — OCL</comment>
- <comment xml:lang="ca">perfil ICC</comment>
- <comment xml:lang="cs">profil ICC</comment>
- <comment xml:lang="da">ICC-profil</comment>
- <comment xml:lang="de">ICC-Profil</comment>
- <comment xml:lang="el">Προφίλ ICC</comment>
- <comment xml:lang="en-GB">ICC profile</comment>
- <comment xml:lang="eo">ICC-profilo</comment>
- <comment xml:lang="es">perfil ICC</comment>
- <comment xml:lang="eu">ICC profila</comment>
- <comment xml:lang="fi">ICC-profiili</comment>
- <comment xml:lang="fo">ICC umhvarv</comment>
- <comment xml:lang="fr">profil ICC</comment>
- <comment xml:lang="fur">profîl ICC</comment>
- <comment xml:lang="ga">próifíl ICC</comment>
- <comment xml:lang="gl">perfíl ICC</comment>
- <comment xml:lang="he">פרופיל ICC</comment>
- <comment xml:lang="hr">ICC profil</comment>
- <comment xml:lang="hu">ICC profil</comment>
- <comment xml:lang="ia">Profilo ICC</comment>
- <comment xml:lang="id">Profil ICC</comment>
- <comment xml:lang="it">Profilo ICC</comment>
- <comment xml:lang="ja">ICC プロファイル</comment>
- <comment xml:lang="kk">ICC профайлы</comment>
- <comment xml:lang="ko">ICC 프로필</comment>
- <comment xml:lang="lt">ICC profilis</comment>
- <comment xml:lang="lv">ICC profils</comment>
- <comment xml:lang="nl">ICC profiel</comment>
- <comment xml:lang="oc">perfil ICC</comment>
- <comment xml:lang="pl">Profil ICC</comment>
- <comment xml:lang="pt">perfil ICC</comment>
- <comment xml:lang="pt-BR">Perfil ICC</comment>
- <comment xml:lang="ro">Profil ICC</comment>
- <comment xml:lang="ru">Профиль ICC</comment>
- <comment xml:lang="sk">Profil farieb ICC</comment>
- <comment xml:lang="sl">Datoteka profila ICC</comment>
- <comment xml:lang="sr">ИЦЦ профил</comment>
- <comment xml:lang="sv">ICC-profil</comment>
- <comment xml:lang="tr">ICC profili</comment>
+ <comment xml:lang="zh_TW">ICC 設定組合</comment>
+ <comment xml:lang="zh_CN">ICC 配置文件</comment>
<comment xml:lang="uk">профіль ICC</comment>
- <comment xml:lang="zh-CN">ICC 配置文件</comment>
- <comment xml:lang="zh-TW">ICC 設定組合</comment>
- <magic priority="50">
+ <comment xml:lang="tr">ICC profili</comment>
+ <comment xml:lang="sv">ICC-profil</comment>
+ <comment xml:lang="sr">ИЦЦ профил</comment>
+ <comment xml:lang="sq">profil ICC</comment>
+ <comment xml:lang="sl">Datoteka profila ICC</comment>
+ <comment xml:lang="si">ICC පැතිකඩ</comment>
+ <comment xml:lang="sk">Profil farieb ICC</comment>
+ <comment xml:lang="ru">Профиль ICC</comment>
+ <comment xml:lang="ro">Profil ICC</comment>
+ <comment xml:lang="pt_BR">Perfil ICC</comment>
+ <comment xml:lang="pt">perfil ICC</comment>
+ <comment xml:lang="pl">Profil ICC</comment>
+ <comment xml:lang="oc">perfil ICC</comment>
+ <comment xml:lang="nl">ICC-profiel</comment>
+ <comment xml:lang="lv">ICC profils</comment>
+ <comment xml:lang="lt">ICC profilis</comment>
+ <comment xml:lang="ko">ICC 프로필</comment>
+ <comment xml:lang="kk">ICC профайлы</comment>
+ <comment xml:lang="ka">ICC პროფილი</comment>
+ <comment xml:lang="ja">ICC プロファイル</comment>
+ <comment xml:lang="it">Profilo ICC</comment>
+ <comment xml:lang="is">ICC snið</comment>
+ <comment xml:lang="id">Profil ICC</comment>
+ <comment xml:lang="ia">Profilo ICC</comment>
+ <comment xml:lang="hu">ICC profil</comment>
+ <comment xml:lang="hr">ICC profil</comment>
+ <comment xml:lang="he">פרופיל ICC</comment>
+ <comment xml:lang="gl">perfíl ICC</comment>
+ <comment xml:lang="ga">próifíl ICC</comment>
+ <comment xml:lang="fur">profîl ICC</comment>
+ <comment xml:lang="fr">profil ICC</comment>
+ <comment xml:lang="fo">ICC umhvarv</comment>
+ <comment xml:lang="fi">ICC-profiili</comment>
+ <comment xml:lang="eu">ICC profila</comment>
+ <comment xml:lang="es">perfil ICC</comment>
+ <comment xml:lang="eo">ICC-profilo</comment>
+ <comment xml:lang="en_GB">ICC profile</comment>
+ <comment xml:lang="el">Προφίλ ICC</comment>
+ <comment xml:lang="de">ICC-Profil</comment>
+ <comment xml:lang="da">ICC-profil</comment>
+ <comment xml:lang="cs">profil ICC</comment>
+ <comment xml:lang="ca">perfil ICC</comment>
+ <comment xml:lang="bg">Цветови профил — OCL</comment>
+ <comment xml:lang="be">профіль ICC</comment>
+ <comment xml:lang="ast">Perfil ICC</comment>
+ <comment xml:lang="ar">تشكيلة ICC</comment>
+ <comment xml:lang="af">ICC-profiel</comment>
+ <acronym>ICC</acronym>
+ <expanded-acronym>International Color Consortium</expanded-acronym>
+ <magic>
<match type="string" value="acsp" offset="36"/>
</magic>
<glob pattern="*.icc"/>
@@ -41066,49 +42382,53 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-it87">
<comment>IT 8.7 color calibration file</comment>
- <comment xml:lang="ar">ملف ضبط ألوان IT 8.7</comment>
- <comment xml:lang="bg">Цветово калибриране — IT 8.7</comment>
- <comment xml:lang="ca">fitxer de calibratge de color IT 8.7</comment>
- <comment xml:lang="cs">soubor kalibrace barev IT 8.7</comment>
- <comment xml:lang="da">IT 8.7 farvekalibreringsfil</comment>
- <comment xml:lang="de">IT 8.7-Farbkalibrierungsdatei</comment>
- <comment xml:lang="el">Αρχείο βαθμονόμησης χρώματος ΙΤ 8.7</comment>
- <comment xml:lang="en-GB">IT 8.7 color calibration file</comment>
- <comment xml:lang="es">archivo de calibración de color IT 8.7</comment>
- <comment xml:lang="eu">IT 8.7 kolore-kalibrazioaren fitxategia</comment>
- <comment xml:lang="fi">IT 8.7 -värikalibrointitiedosto</comment>
- <comment xml:lang="fo">IT 8.7 litstillingarfíla</comment>
- <comment xml:lang="fr">fichier de calibration couleur IT 8.7</comment>
- <comment xml:lang="fur">file calibradure colôr IT 8.7</comment>
- <comment xml:lang="ga">comhad calabraithe dathanna IT 8.7</comment>
- <comment xml:lang="gl">ficheiro de calibración de cor IT 8.7</comment>
- <comment xml:lang="he">קובץ כיול צבע IT 8.7</comment>
- <comment xml:lang="hr">IT 8.7 datoteka kalibracije boja</comment>
- <comment xml:lang="hu">IT 8.7 színkalibrációs fájl</comment>
- <comment xml:lang="ia">File de calibration de colores IT 8.7</comment>
- <comment xml:lang="id">Berkas kalibrasi warna IT 8.7</comment>
- <comment xml:lang="it">File calibrazione colore IT 8.7</comment>
- <comment xml:lang="ja">IT 8.7 カラーキャリブレーションファイル</comment>
- <comment xml:lang="kk">IT 8.7 түс баптау файлы</comment>
- <comment xml:lang="ko">IT 8.7 색 조율 파일</comment>
- <comment xml:lang="lt">IT 8.7 spalvų kalibravimo failas</comment>
- <comment xml:lang="lv">IT 8.7 krāsu kalibrācijas datne</comment>
- <comment xml:lang="nl">IT 8.7 kleurcalibratie bestand</comment>
- <comment xml:lang="oc">fichièr de calibracion color IT 8.7</comment>
- <comment xml:lang="pl">Plik kalibracji kolorów IT 8.7</comment>
- <comment xml:lang="pt">ficheiro de calibração de cor IT 8.7</comment>
- <comment xml:lang="pt-BR">Arquivo de calibração de cor IT 8.7</comment>
- <comment xml:lang="ro">Fișier de calibrare a culorii IT 8.7</comment>
- <comment xml:lang="ru">Файл калибровки цвета IT 8.7</comment>
- <comment xml:lang="sk">Súbor kalibrácie farieb IT 8.7</comment>
- <comment xml:lang="sl">Umeritvena datoteka barve IT 8.7</comment>
- <comment xml:lang="sr">ИТ 8.7 датотека калибрације боје</comment>
- <comment xml:lang="sv">IT 8.7-färgkalibreringsfil</comment>
- <comment xml:lang="tr">IT 8.7 renk kalibrasyon dosyası</comment>
+ <comment xml:lang="zh_TW">IT 8.7 色彩校正檔</comment>
+ <comment xml:lang="zh_CN">IT 8.7 色彩校准文件</comment>
<comment xml:lang="uk">файл калібрування кольорів IT 8.7</comment>
- <comment xml:lang="zh-CN">IT 8.7 色彩校准文件</comment>
- <comment xml:lang="zh-TW">IT 8.7 色彩校正檔</comment>
- <magic priority="50">
+ <comment xml:lang="tr">IT 8.7 renk kalibrasyon dosyası</comment>
+ <comment xml:lang="sv">IT 8.7-färgkalibreringsfil</comment>
+ <comment xml:lang="sr">ИТ 8.7 датотека калибрације боје</comment>
+ <comment xml:lang="sq">kartelë kalibrimi ngjyrash IT 8.7</comment>
+ <comment xml:lang="sl">Umeritvena datoteka barve IT 8.7</comment>
+ <comment xml:lang="si">IT 8.7 වර්ණ ක්‍රමාංකන ගොනුව</comment>
+ <comment xml:lang="sk">Súbor kalibrácie farieb IT 8.7</comment>
+ <comment xml:lang="ru">Файл калибровки цвета IT 8.7</comment>
+ <comment xml:lang="ro">Fișier de calibrare a culorii IT 8.7</comment>
+ <comment xml:lang="pt_BR">Arquivo de calibração de cor IT 8.7</comment>
+ <comment xml:lang="pt">ficheiro de calibração de cor IT 8.7</comment>
+ <comment xml:lang="pl">Plik kalibracji kolorów IT 8.7</comment>
+ <comment xml:lang="oc">fichièr de calibracion color IT 8.7</comment>
+ <comment xml:lang="nl">IT 8.7-kleurcalibratiebestand</comment>
+ <comment xml:lang="lv">IT 8.7 krāsu kalibrācijas datne</comment>
+ <comment xml:lang="lt">IT 8.7 spalvų kalibravimo failas</comment>
+ <comment xml:lang="ko">IT 8.7 색 조율 파일</comment>
+ <comment xml:lang="kk">IT 8.7 түс баптау файлы</comment>
+ <comment xml:lang="ja">IT 8.7 カラーキャリブレーションファイル</comment>
+ <comment xml:lang="it">File calibrazione colore IT 8.7</comment>
+ <comment xml:lang="is">IT 8.7 litkvörðunarskrá</comment>
+ <comment xml:lang="id">Berkas kalibrasi warna IT 8.7</comment>
+ <comment xml:lang="ia">File de calibration de colores IT 8.7</comment>
+ <comment xml:lang="hu">IT 8.7 színkalibrációs fájl</comment>
+ <comment xml:lang="hr">IT 8.7 datoteka kalibracije boja</comment>
+ <comment xml:lang="he">קובץ כיול צבע IT 8.7</comment>
+ <comment xml:lang="gl">ficheiro de calibración de cor IT 8.7</comment>
+ <comment xml:lang="ga">comhad calabraithe dathanna IT 8.7</comment>
+ <comment xml:lang="fur">file calibradure colôr IT 8.7</comment>
+ <comment xml:lang="fr">fichier de calibration couleur IT 8.7</comment>
+ <comment xml:lang="fo">IT 8.7 litstillingarfíla</comment>
+ <comment xml:lang="fi">IT 8.7 -värikalibrointitiedosto</comment>
+ <comment xml:lang="eu">IT 8.7 kolore-kalibrazioaren fitxategia</comment>
+ <comment xml:lang="es">archivo de calibración de color IT 8.7</comment>
+ <comment xml:lang="en_GB">IT 8.7 color calibration file</comment>
+ <comment xml:lang="el">Αρχείο βαθμονόμησης χρώματος ΙΤ 8.7</comment>
+ <comment xml:lang="de">IT-8.7-Farbkalibrierungsdatei</comment>
+ <comment xml:lang="da">IT 8.7 farvekalibreringsfil</comment>
+ <comment xml:lang="cs">soubor kalibrace barev IT 8.7</comment>
+ <comment xml:lang="ca">fitxer de calibratge de color IT 8.7</comment>
+ <comment xml:lang="bg">Цветово калибриране — IT 8.7</comment>
+ <comment xml:lang="be">файл каліброўкі колеру IT 8.7</comment>
+ <comment xml:lang="ar">ملف ضبط ألوان IT 8.7</comment>
+ <magic>
<match type="string" value="IT8.7" offset="0"/>
</magic>
<sub-class-of type="text/plain"/>
@@ -41117,44 +42437,50 @@ command to generate the output files.
</mime-type>
<mime-type type="application/x-ccmx">
<comment>CCMX color correction file</comment>
- <comment xml:lang="bg">Цветови поправки — CCMX</comment>
- <comment xml:lang="ca">fitxer de correcció de color CCMX</comment>
- <comment xml:lang="cs">soubor korekce barev CCMX</comment>
- <comment xml:lang="da">CCMX-farvekorrektionsfil</comment>
- <comment xml:lang="de">CCMX-Farbkorrekturdatei</comment>
- <comment xml:lang="el">Αρχείο διόρθωσης χρωμάτων CCMX</comment>
- <comment xml:lang="en-GB">CCMX colour correction file</comment>
- <comment xml:lang="es">archivo de corrección de color CCMX</comment>
- <comment xml:lang="eu">CCMX kolore-kalibrazioaren fitxategia</comment>
- <comment xml:lang="fi">CCMX-värikorjaustiedosto</comment>
- <comment xml:lang="fr">fichier de correction colorimétrique CCMX</comment>
- <comment xml:lang="fur">file corezion colôr CCMX</comment>
- <comment xml:lang="ga">comhad ceartúchán dathanna CCMX</comment>
- <comment xml:lang="gl">Ficheiro de corrección de cor CCMX</comment>
- <comment xml:lang="he">קובץ תיקון צבע מסוג CCMX</comment>
- <comment xml:lang="hr">CCMX datotkea ispravka boja</comment>
- <comment xml:lang="hu">CCMX színjavítási fájl</comment>
- <comment xml:lang="ia">File de correction de colores CCMX</comment>
- <comment xml:lang="id">Berkas koreksi warna CCMX</comment>
- <comment xml:lang="it">File correzione colore CCMX</comment>
- <comment xml:lang="ja">CCMX カラー訂正ファイル</comment>
- <comment xml:lang="kk">CCMX түсті келтіру файлы</comment>
- <comment xml:lang="ko">CCMX 색상 보정 파일</comment>
- <comment xml:lang="lv">CCMX krāsu korekciju datne</comment>
- <comment xml:lang="oc">fichièr de correccion colorimetrica CCMX</comment>
- <comment xml:lang="pl">Plik korekcji kolorów CCMX</comment>
- <comment xml:lang="pt">ficheiro de correção de cor CCMX</comment>
- <comment xml:lang="pt-BR">Arquivo de correção de cor CCMX</comment>
- <comment xml:lang="ru">Файл цветовой коррекции CCMX</comment>
- <comment xml:lang="sk">Súbor korekcie farieb CCMX</comment>
- <comment xml:lang="sl">Datoteka barvne poprave CCMX</comment>
- <comment xml:lang="sr">ЦЦМИкс датотека поправке боје</comment>
- <comment xml:lang="sv">CCMX-färgkorrigeringsfil</comment>
- <comment xml:lang="tr">CCMX renk düzeltme dosyası</comment>
+ <comment xml:lang="zh_TW">CCMX 色彩校正檔</comment>
+ <comment xml:lang="zh_CN">CCMX 色彩校准文件</comment>
<comment xml:lang="uk">файл даних виправлення кольорів CCMX</comment>
- <comment xml:lang="zh-CN">CCMX 色彩校准文件</comment>
- <comment xml:lang="zh-TW">CCMX 色彩校正檔</comment>
- <magic priority="50">
+ <comment xml:lang="tr">CCMX renk düzeltme dosyası</comment>
+ <comment xml:lang="sv">CCMX-färgkorrigeringsfil</comment>
+ <comment xml:lang="sr">ЦЦМИкс датотека поправке боје</comment>
+ <comment xml:lang="sq">kartelë saktësimi ngjyrash CCMX</comment>
+ <comment xml:lang="sl">Datoteka barvne poprave CCMX</comment>
+ <comment xml:lang="si">CCMX වර්ණ නිවැරදි කිරීමේ ගොනුව</comment>
+ <comment xml:lang="sk">Súbor korekcie farieb CCMX</comment>
+ <comment xml:lang="ru">Файл цветовой коррекции CCMX</comment>
+ <comment xml:lang="pt_BR">Arquivo de correção de cor CCMX</comment>
+ <comment xml:lang="pt">ficheiro de correção de cor CCMX</comment>
+ <comment xml:lang="pl">Plik korekcji kolorów CCMX</comment>
+ <comment xml:lang="oc">fichièr de correccion colorimetrica CCMX</comment>
+ <comment xml:lang="nl">CCMX-kleurcorrectiebestand</comment>
+ <comment xml:lang="lv">CCMX krāsu korekciju datne</comment>
+ <comment xml:lang="ko">CCMX 색상 보정 파일</comment>
+ <comment xml:lang="kk">CCMX түсті келтіру файлы</comment>
+ <comment xml:lang="ja">CCMX カラー訂正ファイル</comment>
+ <comment xml:lang="it">File correzione colore CCMX</comment>
+ <comment xml:lang="is">CCMX litleiðréttingarskrá</comment>
+ <comment xml:lang="id">Berkas koreksi warna CCMX</comment>
+ <comment xml:lang="ia">File de correction de colores CCMX</comment>
+ <comment xml:lang="hu">CCMX színjavítási fájl</comment>
+ <comment xml:lang="hr">CCMX datotkea ispravka boja</comment>
+ <comment xml:lang="he">קובץ תיקון צבע מסוג CCMX</comment>
+ <comment xml:lang="gl">Ficheiro de corrección de cor CCMX</comment>
+ <comment xml:lang="ga">comhad ceartúchán dathanna CCMX</comment>
+ <comment xml:lang="fur">file corezion colôr CCMX</comment>
+ <comment xml:lang="fr">fichier de correction colorimétrique CCMX</comment>
+ <comment xml:lang="fi">CCMX-värikorjaustiedosto</comment>
+ <comment xml:lang="eu">CCMX kolore-kalibrazioaren fitxategia</comment>
+ <comment xml:lang="es">archivo de corrección de color CCMX</comment>
+ <comment xml:lang="en_GB">CCMX colour correction file</comment>
+ <comment xml:lang="el">Αρχείο διόρθωσης χρωμάτων CCMX</comment>
+ <comment xml:lang="de">CCMX-Farbkorrekturdatei</comment>
+ <comment xml:lang="da">CCMX-farvekorrektionsfil</comment>
+ <comment xml:lang="cs">soubor korekce barev CCMX</comment>
+ <comment xml:lang="ca">fitxer de correcció de color CCMX</comment>
+ <comment xml:lang="bg">Цветови поправки — CCMX</comment>
+ <comment xml:lang="be">файл карэкцыі колеру CCMX</comment>
+ <comment xml:lang="ar">ملف تصحيح لون CCMX</comment>
+ <magic>
<match type="string" value="CCMX" offset="0"/>
</magic>
<sub-class-of type="text/plain"/>
@@ -41163,315 +42489,231 @@ command to generate the output files.
</mime-type>
<mime-type type="application/winhlp">
<comment>WinHelp help file</comment>
- <comment xml:lang="af">WinHelp-hulplêer</comment>
- <comment xml:lang="bg">Помощен файл — WinHelp</comment>
- <comment xml:lang="ca">fitxer d'ajuda WinHelp</comment>
- <comment xml:lang="cs">soubor nápovědy WinHelp</comment>
- <comment xml:lang="da">WinHelp-hjælpefil</comment>
- <comment xml:lang="de">WinHelp-Hilfedatei</comment>
- <comment xml:lang="el">Αρχείο βοήθειας WinHelp</comment>
- <comment xml:lang="en-GB">WinHelp help file</comment>
- <comment xml:lang="es">archivo de ayuda de WinHelp</comment>
- <comment xml:lang="eu">WinHelp laguntza fitxategia</comment>
- <comment xml:lang="fi">WinHelp-ohjetiedosto</comment>
- <comment xml:lang="fr">fichier d'aide WinHelp</comment>
- <comment xml:lang="fur">file di jutori WinHelp</comment>
- <comment xml:lang="ga">comhad cabhrach WinHelp</comment>
- <comment xml:lang="gl">Ficheiro de axuda WinHelp</comment>
- <comment xml:lang="he">קובץ עזרה מסוג WinHelp</comment>
- <comment xml:lang="hr">WinHelp datoteka pomoći</comment>
- <comment xml:lang="hu">WinHelp súgófájl</comment>
- <comment xml:lang="ia">File de adjuta WinHelp</comment>
- <comment xml:lang="id">Berkas bantuan WinHelp</comment>
- <comment xml:lang="it">File aiuto WInHelp</comment>
- <comment xml:lang="ja">WinHelp ヘルプファイル</comment>
- <comment xml:lang="kk">WinHelp көмек файлы</comment>
- <comment xml:lang="ko">WinHelp 도움말 파일</comment>
- <comment xml:lang="lv">WinHelp palīdzības datne</comment>
- <comment xml:lang="oc">fichièr d'ajuda WinHelp</comment>
- <comment xml:lang="pl">Plik pomocy WinHelp</comment>
- <comment xml:lang="pt">ficheiro de ajuda WinHelp</comment>
- <comment xml:lang="pt-BR">Arquivo de ajuda WinHelp</comment>
- <comment xml:lang="ru">Файл справки WinHelp</comment>
- <comment xml:lang="sk">Súbor Pomocníka WinHelp</comment>
- <comment xml:lang="sl">Datoteka pomoči WinHelp</comment>
- <comment xml:lang="sr">датотека помоћи Вин хелпа</comment>
- <comment xml:lang="sv">WinHelp-hjälpfil</comment>
- <comment xml:lang="tr">WinHelp yardım dosyası</comment>
+ <comment xml:lang="zh_TW">WinHelp 說明檔</comment>
+ <comment xml:lang="zh_CN">WinHelp 帮助文件</comment>
<comment xml:lang="uk">файл довідки WinHelp</comment>
- <comment xml:lang="zh-CN">WinHelp 帮助文件</comment>
- <comment xml:lang="zh-TW">WinHelp 說明檔</comment>
- <magic priority="50">
+ <comment xml:lang="tr">WinHelp yardım dosyası</comment>
+ <comment xml:lang="sv">WinHelp-hjälpfil</comment>
+ <comment xml:lang="sr">датотека помоћи Вин хелпа</comment>
+ <comment xml:lang="sq">kartelë ndihme WinHelp</comment>
+ <comment xml:lang="sl">Datoteka pomoči WinHelp</comment>
+ <comment xml:lang="si">WinHelp උදව් ගොනුව</comment>
+ <comment xml:lang="sk">Súbor Pomocníka WinHelp</comment>
+ <comment xml:lang="ru">Файл справки WinHelp</comment>
+ <comment xml:lang="pt_BR">Arquivo de ajuda WinHelp</comment>
+ <comment xml:lang="pt">ficheiro de ajuda WinHelp</comment>
+ <comment xml:lang="pl">Plik pomocy WinHelp</comment>
+ <comment xml:lang="oc">fichièr d'ajuda WinHelp</comment>
+ <comment xml:lang="nl">WinHelp-hulpbestand</comment>
+ <comment xml:lang="lv">WinHelp palīdzības datne</comment>
+ <comment xml:lang="ko">WinHelp 도움말 파일</comment>
+ <comment xml:lang="kk">WinHelp көмек файлы</comment>
+ <comment xml:lang="ja">WinHelp ヘルプファイル</comment>
+ <comment xml:lang="it">File aiuto WInHelp</comment>
+ <comment xml:lang="is">WinHelp-hjálparskrá</comment>
+ <comment xml:lang="id">Berkas bantuan WinHelp</comment>
+ <comment xml:lang="ia">File de adjuta WinHelp</comment>
+ <comment xml:lang="hu">WinHelp súgófájl</comment>
+ <comment xml:lang="hr">WinHelp datoteka pomoći</comment>
+ <comment xml:lang="he">קובץ עזרה מסוג WinHelp</comment>
+ <comment xml:lang="gl">Ficheiro de axuda WinHelp</comment>
+ <comment xml:lang="ga">comhad cabhrach WinHelp</comment>
+ <comment xml:lang="fur">file di jutori WinHelp</comment>
+ <comment xml:lang="fr">fichier d'aide WinHelp</comment>
+ <comment xml:lang="fi">WinHelp-ohjetiedosto</comment>
+ <comment xml:lang="eu">WinHelp laguntza fitxategia</comment>
+ <comment xml:lang="es">archivo de ayuda de WinHelp</comment>
+ <comment xml:lang="en_GB">WinHelp help file</comment>
+ <comment xml:lang="el">Αρχείο βοήθειας WinHelp</comment>
+ <comment xml:lang="de">WinHelp-Hilfedatei</comment>
+ <comment xml:lang="da">WinHelp-hjælpefil</comment>
+ <comment xml:lang="cs">soubor nápovědy WinHelp</comment>
+ <comment xml:lang="ca">fitxer d'ajuda WinHelp</comment>
+ <comment xml:lang="bg">Помощен файл — WinHelp</comment>
+ <comment xml:lang="be">файл даведкі WinHelp</comment>
+ <comment xml:lang="ar">ملف مساعدة ويندوز</comment>
+ <comment xml:lang="af">WinHelp-hulplêer</comment>
+ <magic>
<match type="little32" value="0x00035f3f" offset="0"/>
</magic>
<glob pattern="*.hlp"/>
<alias type="zz-application/zz-winassoc-hlp"/>
</mime-type>
<mime-type type="application/x-bsdiff">
- <comment>binary differences between files</comment>
- <comment xml:lang="bg">двоична разлика между файлове</comment>
- <comment xml:lang="ca">diferencies binàries entre fitxers</comment>
- <comment xml:lang="cs">binární rozdíl mezi soubory</comment>
- <comment xml:lang="da">binære forskelle mellem filer</comment>
- <comment xml:lang="de">binäre Unterschiede zwischen Dateien</comment>
- <comment xml:lang="en-GB">binary differences between files</comment>
- <comment xml:lang="es">diferencias entre archivos binarios</comment>
- <comment xml:lang="eu">fitxategi binarioen arteko ezberdinstasunak</comment>
- <comment xml:lang="fi">binaariset erot tiedostojen välillä</comment>
- <comment xml:lang="fr">différences binaires entre fichiers</comment>
- <comment xml:lang="fur">diferencis binariis tra file</comment>
- <comment xml:lang="ga">difríochtaí dénártha idir comhaid</comment>
- <comment xml:lang="he">הבדלים בינריים בין קבצים</comment>
- <comment xml:lang="hr">Binarne razlike između datoteka</comment>
- <comment xml:lang="hu">bináris különbségfájl</comment>
- <comment xml:lang="id">perbedaan biner antar berkas</comment>
- <comment xml:lang="it">Differenze binarie tra file</comment>
- <comment xml:lang="kk">файлдар арасындағы бинарлық айырмашылықтар</comment>
- <comment xml:lang="ko">바이너리 차이 비교 파일</comment>
- <comment xml:lang="pl">Binarna różnica pomiędzy plikami</comment>
- <comment xml:lang="pt-BR">Diferenças binárias entre arquivos</comment>
- <comment xml:lang="ru">Двоичные различия между файлами</comment>
- <comment xml:lang="sk">Binárne rozdiely medzi súbormi</comment>
- <comment xml:lang="sr">бинарне разлике датотека</comment>
- <comment xml:lang="sv">binära skillnader mellan filer</comment>
- <comment xml:lang="tr">dosyalar arasındaki ikilik farklar</comment>
+ <comment>Binary differences between files</comment>
<comment xml:lang="uk">двійкова різниця між файлами</comment>
- <comment xml:lang="zh-CN">文件的二进制区别</comment>
- <comment xml:lang="zh-TW">檔案間的二進位差異</comment>
+ <comment xml:lang="sv">Binära skillnader mellan filer</comment>
+ <comment xml:lang="ru">Двоичные различия между файлами</comment>
+ <comment xml:lang="pl">Binarna różnica pomiędzy plikami</comment>
+ <comment xml:lang="it">Differenze binarie tra file</comment>
+ <comment xml:lang="eu">Fitxategien arteko diferentzia bitarra</comment>
+ <comment xml:lang="es">diferencias binarias entre archivos</comment>
+ <comment xml:lang="de">Binäre Unterschiede zwischen Dateien</comment>
+ <comment xml:lang="be">бінарныя адрозненні паміж файламі</comment>
<magic>
<match type="string" value="BSDIFF40" offset="0"/>
<match type="string" value="BSDIFN40" offset="0"/>
</magic>
<glob pattern="*.bsdiff"/>
</mime-type>
-
<!-- Tree content-types -->
<mime-type type="x-content/image-dcf">
<!-- http://en.wikipedia.org/wiki/Design_rule_for_Camera_File_system -->
- <comment>digital photos</comment>
- <comment xml:lang="af">digitale foto’s</comment>
- <comment xml:lang="ar">الصور الرقمية</comment>
- <comment xml:lang="be-Latn">ličbavyja zdymki</comment>
- <comment xml:lang="bg">Цифрови фотографии</comment>
- <comment xml:lang="ca">fotos digitals</comment>
- <comment xml:lang="cs">digitální fotografie</comment>
- <comment xml:lang="da">digitale billeder</comment>
- <comment xml:lang="de">Digitale Fotos</comment>
- <comment xml:lang="el">Ψηφιακές φωτογραφίες</comment>
- <comment xml:lang="en-GB">digital photos</comment>
- <comment xml:lang="es">fotos digitales</comment>
- <comment xml:lang="eu">argazki digitalak</comment>
- <comment xml:lang="fi">digivalokuvia</comment>
- <comment xml:lang="fo">talgildar myndir</comment>
- <comment xml:lang="fr">photos numériques</comment>
- <comment xml:lang="fur">fotos digjitâls</comment>
- <comment xml:lang="ga">grianghraif dhigiteacha</comment>
- <comment xml:lang="gl">fotos dixitais</comment>
- <comment xml:lang="he">תמונות דיגיטליות</comment>
- <comment xml:lang="hr">Digitalne fotografije</comment>
- <comment xml:lang="hu">digitális fényképek</comment>
- <comment xml:lang="ia">Photos digital</comment>
- <comment xml:lang="id">foto digital</comment>
- <comment xml:lang="it">Foto digitali</comment>
- <comment xml:lang="ja">デジタルフォト</comment>
- <comment xml:lang="kk">сандық фотосуреттер</comment>
- <comment xml:lang="ko">디지털 사진</comment>
- <comment xml:lang="lt">skaitmeninės nuotraukos</comment>
- <comment xml:lang="lv">digitāla fotogrāfija</comment>
- <comment xml:lang="nl">digitale foto's</comment>
- <comment xml:lang="nn">digitale fotografi</comment>
- <comment xml:lang="oc">fòtos numericas</comment>
- <comment xml:lang="pl">Zdjęcia cyfrowe</comment>
- <comment xml:lang="pt">fotografias digitais</comment>
- <comment xml:lang="pt-BR">Fotos digitais</comment>
- <comment xml:lang="ro">fotografii digitale</comment>
- <comment xml:lang="ru">Цифровые фотографии</comment>
- <comment xml:lang="sk">Digitálne fotografie</comment>
- <comment xml:lang="sl">digitalne fotografije</comment>
- <comment xml:lang="sq">Fotografi dixhitale</comment>
- <comment xml:lang="sr">дигиталне фотографије</comment>
- <comment xml:lang="sv">digitalbilder</comment>
- <comment xml:lang="tr">sayısal fotoğraflar</comment>
+ <comment>Digital photos</comment>
<comment xml:lang="uk">цифрові фотографії</comment>
- <comment xml:lang="vi">ảnh chụp số</comment>
- <comment xml:lang="zh-CN">数字化图像</comment>
- <comment xml:lang="zh-TW">數位相片</comment>
+ <comment xml:lang="sv">Digitalbilder</comment>
+ <comment xml:lang="ru">Цифровые фотографии</comment>
+ <comment xml:lang="pt_BR">Fotos digitais</comment>
+ <comment xml:lang="pl">Zdjęcia cyfrowe</comment>
+ <comment xml:lang="it">Foto digitali</comment>
+ <comment xml:lang="gl">Fotos dixitais</comment>
+ <comment xml:lang="eu">Argazki digitalak</comment>
+ <comment xml:lang="es">fotografías digitales</comment>
+ <comment xml:lang="de">Digitale Fotos</comment>
+ <comment xml:lang="be">лічбавыя фатаграфіі</comment>
<treemagic>
<treematch path="dcim" type="directory" non-empty="true"/>
</treemagic>
</mime-type>
-
<mime-type type="x-content/video-vcd">
<!-- TRANSLATORS: This is a brand-name, not a generic term. Please see
http://en.wikipedia.org/wiki/Video_CD
http://www.herongyang.com/CD-DVD/VCD-Movie-File-Directory-Structure.html -->
<comment>Video CD</comment>
- <comment xml:lang="af">Video-CD</comment>
- <comment xml:lang="ar">Video CD</comment>
- <comment xml:lang="ast">CD de videu</comment>
- <comment xml:lang="be-Latn">Videa CD</comment>
- <comment xml:lang="bg">CD — видео</comment>
- <comment xml:lang="ca">Video CD</comment>
- <comment xml:lang="cs">Video CD</comment>
- <comment xml:lang="da">Video-cd</comment>
- <comment xml:lang="de">Video-CD</comment>
- <comment xml:lang="el">Video CD</comment>
- <comment xml:lang="en-GB">Video CD</comment>
- <comment xml:lang="eo">Video-KD</comment>
- <comment xml:lang="es">Video CD</comment>
- <comment xml:lang="eu">Bideo CDa</comment>
- <comment xml:lang="fi">Video CD</comment>
- <comment xml:lang="fo">Video CD</comment>
- <comment xml:lang="fr">CD vidéo</comment>
- <comment xml:lang="fur">Video CD</comment>
- <comment xml:lang="ga">dlúthdhiosca físe</comment>
- <comment xml:lang="gl">Video CD</comment>
- <comment xml:lang="he">תקליטור וידאו</comment>
- <comment xml:lang="hr">Video CD</comment>
- <comment xml:lang="hu">Video CD</comment>
- <comment xml:lang="ia">Video CD</comment>
- <comment xml:lang="id">Video CD</comment>
- <comment xml:lang="it">Video CD</comment>
- <comment xml:lang="ja">ビデオ CD</comment>
- <comment xml:lang="kk">видео CD</comment>
- <comment xml:lang="ko">비디오 CD</comment>
- <comment xml:lang="lt">Vaizdo CD</comment>
- <comment xml:lang="lv">Video CD</comment>
- <comment xml:lang="nl">video-CD</comment>
- <comment xml:lang="nn">Video-CD</comment>
- <comment xml:lang="oc">CD vidèo</comment>
- <comment xml:lang="pl">Video CD</comment>
- <comment xml:lang="pt">Video CD</comment>
- <comment xml:lang="pt-BR">CD de vídeo</comment>
- <comment xml:lang="ro">CD video</comment>
- <comment xml:lang="ru">Видео CD</comment>
- <comment xml:lang="sk">Video CD</comment>
- <comment xml:lang="sl">Video CD</comment>
- <comment xml:lang="sq">CD Video</comment>
- <comment xml:lang="sr">Видео ЦД</comment>
- <comment xml:lang="sv">Video-cd</comment>
- <comment xml:lang="tr">Video CD</comment>
- <comment xml:lang="uk">Video CD</comment>
+ <comment xml:lang="zh_TW">Video CD</comment>
+ <comment xml:lang="zh_CN">VCD</comment>
<comment xml:lang="vi">Đĩa CD ảnh động</comment>
- <comment xml:lang="zh-CN">VCD</comment>
- <comment xml:lang="zh-TW">Video CD</comment>
+ <comment xml:lang="uk">Video CD</comment>
+ <comment xml:lang="tr">Video CD</comment>
+ <comment xml:lang="sv">Video-cd</comment>
+ <comment xml:lang="sr">Видео ЦД</comment>
+ <comment xml:lang="sq">CD Video</comment>
+ <comment xml:lang="sl">Video CD</comment>
+ <comment xml:lang="si">වීඩියෝ සීඩී</comment>
+ <comment xml:lang="sk">Video CD</comment>
+ <comment xml:lang="ru">Видео CD</comment>
+ <comment xml:lang="ro">CD video</comment>
+ <comment xml:lang="pt_BR">CD de vídeo</comment>
+ <comment xml:lang="pt">Video CD</comment>
+ <comment xml:lang="pl">Video CD</comment>
+ <comment xml:lang="oc">CD vidèo</comment>
+ <comment xml:lang="nn">Video-CD</comment>
+ <comment xml:lang="nl">video-CD</comment>
+ <comment xml:lang="lv">Video CD</comment>
+ <comment xml:lang="lt">Vaizdo CD</comment>
+ <comment xml:lang="ko">비디오 CD</comment>
+ <comment xml:lang="kk">видео CD</comment>
+ <comment xml:lang="ka">ვიდეო CD</comment>
+ <comment xml:lang="ja">ビデオ CD</comment>
+ <comment xml:lang="it">Video CD</comment>
+ <comment xml:lang="is">Video CD-mynddiskur</comment>
+ <comment xml:lang="id">Video CD</comment>
+ <comment xml:lang="ia">Video CD</comment>
+ <comment xml:lang="hu">Video CD</comment>
+ <comment xml:lang="hr">Video CD</comment>
+ <comment xml:lang="he">תקליטור וידאו</comment>
+ <comment xml:lang="gl">Video CD</comment>
+ <comment xml:lang="ga">dlúthdhiosca físe</comment>
+ <comment xml:lang="fur">Video CD</comment>
+ <comment xml:lang="fr">CD vidéo</comment>
+ <comment xml:lang="fo">Video CD</comment>
+ <comment xml:lang="fi">Video CD</comment>
+ <comment xml:lang="eu">Bideo CDa</comment>
+ <comment xml:lang="es">Video CD</comment>
+ <comment xml:lang="eo">Video-KD</comment>
+ <comment xml:lang="en_GB">Video CD</comment>
+ <comment xml:lang="el">Video CD</comment>
+ <comment xml:lang="de">Video-CD</comment>
+ <comment xml:lang="da">Video-cd</comment>
+ <comment xml:lang="cs">Video CD</comment>
+ <comment xml:lang="ca">Video CD</comment>
+ <comment xml:lang="bg">CD — видео</comment>
+ <comment xml:lang="be@latin">Videa CD</comment>
+ <comment xml:lang="be">відэа CD</comment>
+ <comment xml:lang="ast">CD de videu</comment>
+ <comment xml:lang="ar">سي دي فيديو</comment>
+ <comment xml:lang="af">Video-CD</comment>
<treemagic>
<treematch path="mpegav/AVSEQ01.DAT" type="file"/>
</treemagic>
</mime-type>
-
<mime-type type="x-content/video-svcd">
<!-- TRANSLATORS: This is a brand-name, not a generic term. Please see
http://en.wikipedia.org/wiki/Super_Video_CD
http://everything2.com/index.pl?node_id=1009222 -->
<comment>Super Video CD</comment>
- <comment xml:lang="af">Super Video-CD</comment>
- <comment xml:lang="ar">Super Video CD</comment>
- <comment xml:lang="ast">CD de Super Video</comment>
- <comment xml:lang="be-Latn">Super Video CD</comment>
- <comment xml:lang="bg">CD — супер видео</comment>
- <comment xml:lang="ca">Super Video CD</comment>
- <comment xml:lang="cs">Super Video CD</comment>
- <comment xml:lang="da">Super Video-cd</comment>
- <comment xml:lang="de">Super-Video-CD</comment>
- <comment xml:lang="el">Super Video CD</comment>
- <comment xml:lang="en-GB">Super Video CD</comment>
- <comment xml:lang="eo">Super-Video-KD</comment>
- <comment xml:lang="es">Super Video CD</comment>
- <comment xml:lang="eu">Super Bideo CDa</comment>
- <comment xml:lang="fi">Super Video CD</comment>
- <comment xml:lang="fo">Super Video CD</comment>
- <comment xml:lang="fr">Super VCD</comment>
- <comment xml:lang="fur">Super Video CD</comment>
- <comment xml:lang="ga">dlúthdhiosca Super Video</comment>
- <comment xml:lang="gl">Super vídeo CD</comment>
- <comment xml:lang="he">Super Video CD</comment>
- <comment xml:lang="hr">Super Video CD</comment>
- <comment xml:lang="hu">Super Video CD</comment>
- <comment xml:lang="ia">Super Video CD</comment>
- <comment xml:lang="id">Super Video CD</comment>
- <comment xml:lang="it">Super Video CD</comment>
- <comment xml:lang="ja">スーパービデオ CD</comment>
- <comment xml:lang="kk">Super Video CD</comment>
- <comment xml:lang="ko">수퍼 비디오 CD</comment>
- <comment xml:lang="lt">Super vaizdo CD</comment>
- <comment xml:lang="lv">Super Video CD</comment>
- <comment xml:lang="nl">super-video-CD</comment>
- <comment xml:lang="nn">Super Video-CD</comment>
- <comment xml:lang="oc">Super VCD</comment>
- <comment xml:lang="pl">Super Video CD</comment>
- <comment xml:lang="pt">Super Video CD</comment>
- <comment xml:lang="pt-BR">CD de Super Vídeo (SVCD)</comment>
- <comment xml:lang="ro">Super Video CD</comment>
- <comment xml:lang="ru">Super Video CD</comment>
- <comment xml:lang="sk">Super Video CD</comment>
- <comment xml:lang="sl">Super Video CD</comment>
- <comment xml:lang="sq">CD Super Video</comment>
- <comment xml:lang="sr">Супер видео ЦД</comment>
- <comment xml:lang="sv">Super Video CD</comment>
- <comment xml:lang="tr">Super Video CD</comment>
- <comment xml:lang="uk">Super Video CD</comment>
+ <comment xml:lang="zh_TW">Super Video CD</comment>
+ <comment xml:lang="zh_CN">SVCD</comment>
<comment xml:lang="vi">Đĩa CD siêu ảnh động</comment>
- <comment xml:lang="zh-CN">SVCD</comment>
- <comment xml:lang="zh-TW">Super Video CD</comment>
+ <comment xml:lang="uk">Super Video CD</comment>
+ <comment xml:lang="tr">Super Video CD</comment>
+ <comment xml:lang="sv">Super Video CD</comment>
+ <comment xml:lang="sr">Супер видео ЦД</comment>
+ <comment xml:lang="sq">CD Super Video</comment>
+ <comment xml:lang="sl">Super Video CD</comment>
+ <comment xml:lang="si">සුපිරි වීඩියෝ CD</comment>
+ <comment xml:lang="sk">Super Video CD</comment>
+ <comment xml:lang="ru">Super Video CD</comment>
+ <comment xml:lang="ro">Super Video CD</comment>
+ <comment xml:lang="pt_BR">CD de Super Vídeo (SVCD)</comment>
+ <comment xml:lang="pt">Super Video CD</comment>
+ <comment xml:lang="pl">Super Video CD</comment>
+ <comment xml:lang="oc">Super VCD</comment>
+ <comment xml:lang="nn">Super Video-CD</comment>
+ <comment xml:lang="nl">super-video-CD</comment>
+ <comment xml:lang="lv">Super Video CD</comment>
+ <comment xml:lang="lt">Super vaizdo CD</comment>
+ <comment xml:lang="ko">수퍼 비디오 CD</comment>
+ <comment xml:lang="kk">Super Video CD</comment>
+ <comment xml:lang="ka">Super Video CD</comment>
+ <comment xml:lang="ja">スーパービデオ CD</comment>
+ <comment xml:lang="it">Super Video CD</comment>
+ <comment xml:lang="is">Super Video CD-mynddiskur</comment>
+ <comment xml:lang="id">Super Video CD</comment>
+ <comment xml:lang="ia">Super Video CD</comment>
+ <comment xml:lang="hu">Super Video CD</comment>
+ <comment xml:lang="hr">Super Video CD</comment>
+ <comment xml:lang="he">Super Video CD</comment>
+ <comment xml:lang="gl">Super vídeo CD</comment>
+ <comment xml:lang="ga">dlúthdhiosca Super Video</comment>
+ <comment xml:lang="fur">Super Video CD</comment>
+ <comment xml:lang="fr">Super VCD</comment>
+ <comment xml:lang="fo">Super Video CD</comment>
+ <comment xml:lang="fi">Super Video CD</comment>
+ <comment xml:lang="eu">Super Bideo CDa</comment>
+ <comment xml:lang="es">Super Video CD</comment>
+ <comment xml:lang="eo">Super-Video-KD</comment>
+ <comment xml:lang="en_GB">Super Video CD</comment>
+ <comment xml:lang="el">Super Video CD</comment>
+ <comment xml:lang="de">Super-Video-CD</comment>
+ <comment xml:lang="da">Super Video-cd</comment>
+ <comment xml:lang="cs">Super Video CD</comment>
+ <comment xml:lang="ca">Super Video CD</comment>
+ <comment xml:lang="bg">CD — супер видео</comment>
+ <comment xml:lang="be@latin">Super Video CD</comment>
+ <comment xml:lang="be">Super Video CD</comment>
+ <comment xml:lang="ast">CD de Super Video</comment>
+ <comment xml:lang="ar">سي دي فيديو فائق</comment>
+ <comment xml:lang="af">Super Video-CD</comment>
<treemagic>
<treematch path="MPEG2/AVSEQ01.MPG" type="file"/>
</treemagic>
</mime-type>
-
<mime-type type="x-content/video-dvd">
<!-- http://en.wikipedia.org/wiki/DVD-Video -->
- <comment>video DVD</comment>
- <comment xml:lang="af">video-DVD</comment>
- <comment xml:lang="ar">DVD مرئي</comment>
- <comment xml:lang="ast">DVD de videu</comment>
- <comment xml:lang="be-Latn">videa DVD</comment>
- <comment xml:lang="bg">DVD — видео</comment>
- <comment xml:lang="ca">DVD de video</comment>
- <comment xml:lang="cs">videodisk DVD</comment>
- <comment xml:lang="da">video-dvd</comment>
- <comment xml:lang="de">Video-DVD</comment>
- <comment xml:lang="el">Βίντεο DVD</comment>
- <comment xml:lang="en-GB">video DVD</comment>
- <comment xml:lang="eo">video-DVD</comment>
- <comment xml:lang="es">DVD de vídeo</comment>
- <comment xml:lang="eu">bideo DVDa</comment>
- <comment xml:lang="fi">video-DVD</comment>
- <comment xml:lang="fo">video DVD</comment>
- <comment xml:lang="fr">DVD vidéo</comment>
- <comment xml:lang="fur">DVD video</comment>
- <comment xml:lang="ga">DVD físe</comment>
- <comment xml:lang="gl">DVD de vídeo</comment>
- <comment xml:lang="he">DVD וידאו</comment>
- <comment xml:lang="hr">Video DVD</comment>
- <comment xml:lang="hu">video DVD</comment>
- <comment xml:lang="ia">DVD video</comment>
- <comment xml:lang="id">DVD video</comment>
- <comment xml:lang="it">DVD video</comment>
- <comment xml:lang="ja">ビデオ DVD</comment>
- <comment xml:lang="ka">ვიდეო DVD</comment>
- <comment xml:lang="kk">видео DVD</comment>
- <comment xml:lang="ko">동영상 DVD</comment>
- <comment xml:lang="lt">vaizdo DVD</comment>
- <comment xml:lang="lv">video DVD</comment>
- <comment xml:lang="nl">video-DVD</comment>
- <comment xml:lang="nn">Video-DVD</comment>
- <comment xml:lang="oc">DVD vidèo</comment>
- <comment xml:lang="pl">DVD-Video</comment>
- <comment xml:lang="pt">DVD vídeo</comment>
- <comment xml:lang="pt-BR">DVD de vídeo</comment>
- <comment xml:lang="ro">DVD video</comment>
+ <comment>Video DVD</comment>
+ <comment xml:lang="uk">DVD з відеозаписами</comment>
+ <comment xml:lang="sv">Video-dvd</comment>
<comment xml:lang="ru">Видео DVD</comment>
- <comment xml:lang="sk">DVD-Video</comment>
- <comment xml:lang="sl">video DVD</comment>
- <comment xml:lang="sq">DVD video</comment>
- <comment xml:lang="sr">видео ДВД</comment>
- <comment xml:lang="sv">video-dvd</comment>
- <comment xml:lang="tr">video DVD</comment>
- <comment xml:lang="uk">відео-DVD</comment>
- <comment xml:lang="vi">đĩa DVD ảnh động</comment>
- <comment xml:lang="zh-CN">视频 DVD</comment>
- <comment xml:lang="zh-TW">視訊 DVD</comment>
+ <comment xml:lang="pt_BR">DVD de vídeo</comment>
+ <comment xml:lang="pl">DVD-Video</comment>
+ <comment xml:lang="ja">動画DVD</comment>
+ <comment xml:lang="it">DVD video</comment>
+ <comment xml:lang="gl">DVD de vídeo</comment>
+ <comment xml:lang="eu">Bideoko DVDa</comment>
+ <comment xml:lang="es">DVD de vídeo</comment>
+ <comment xml:lang="de">Video-DVD</comment>
+ <comment xml:lang="be">відэа DVD</comment>
<treemagic>
<treematch path="VIDEO_TS/VIDEO_TS.IFO" type="file"/>
<treematch path="VIDEO_TS/VIDEO_TS.IFO;1" type="file"/>
@@ -41479,733 +42721,426 @@ command to generate the output files.
<treematch path="VIDEO_TS.IFO;1" type="file"/>
</treemagic>
</mime-type>
-
<mime-type type="x-content/audio-cdda">
<!-- http://en.wikipedia.org/wiki/Red_Book_(audio_CD_standard) -->
- <comment>audio CD</comment>
- <comment xml:lang="af">oudio-CD</comment>
- <comment xml:lang="ar">CD سمعي</comment>
- <comment xml:lang="be-Latn">aŭdyjo CD</comment>
- <comment xml:lang="bg">CD — аудио</comment>
- <comment xml:lang="ca">CD d'àudio</comment>
- <comment xml:lang="cs">zvukové CD</comment>
- <comment xml:lang="da">lyd-cd</comment>
- <comment xml:lang="de">Audio-CD</comment>
- <comment xml:lang="el">CD ήχου</comment>
- <comment xml:lang="en-GB">audio CD</comment>
- <comment xml:lang="eo">Son-KD</comment>
- <comment xml:lang="es">CD de audio</comment>
- <comment xml:lang="eu">Audio CDa</comment>
- <comment xml:lang="fi">ääni-CD</comment>
- <comment xml:lang="fo">audio CD</comment>
- <comment xml:lang="fr">CD audio</comment>
- <comment xml:lang="fur">CD audio</comment>
- <comment xml:lang="ga">dlúthdhiosca fuaime</comment>
- <comment xml:lang="gl">CD de son</comment>
- <comment xml:lang="he">תקליטור שמע</comment>
- <comment xml:lang="hr">Glazbeni CD</comment>
- <comment xml:lang="hu">hang CD</comment>
- <comment xml:lang="ia">CD audio</comment>
- <comment xml:lang="id">CD audio</comment>
- <comment xml:lang="it">CD audio</comment>
- <comment xml:lang="ja">オーディオ CD</comment>
- <comment xml:lang="kk">аудио CD</comment>
- <comment xml:lang="ko">오디오 CD</comment>
- <comment xml:lang="lt">garso CD</comment>
- <comment xml:lang="lv">audio CD</comment>
- <comment xml:lang="nl">audio-CD</comment>
- <comment xml:lang="nn">lyd-CD</comment>
- <comment xml:lang="oc">CD àudio</comment>
- <comment xml:lang="pl">CD-Audio</comment>
- <comment xml:lang="pt">CD áudio</comment>
- <comment xml:lang="pt-BR">CD de áudio</comment>
- <comment xml:lang="ro">CD audio</comment>
+ <comment>Audio CD</comment>
+ <comment xml:lang="uk">звуковий компакт-диск</comment>
+ <comment xml:lang="sv">Ljud-cd</comment>
<comment xml:lang="ru">Аудио CD</comment>
- <comment xml:lang="sk">Zvukové CD</comment>
- <comment xml:lang="sl">zvočni CD</comment>
- <comment xml:lang="sq">CD audio</comment>
- <comment xml:lang="sr">звучни ЦД</comment>
- <comment xml:lang="sv">ljud-cd</comment>
- <comment xml:lang="tr">ses CD'si</comment>
- <comment xml:lang="uk">звуковий CD</comment>
- <comment xml:lang="vi">đĩa CD âm thanh</comment>
- <comment xml:lang="zh-CN">音频 CD</comment>
- <comment xml:lang="zh-TW">音訊 CD</comment>
+ <comment xml:lang="pt_BR">CD de áudio</comment>
+ <comment xml:lang="pl">CD-Audio</comment>
+ <comment xml:lang="ja">音声CD</comment>
+ <comment xml:lang="it">CD audio</comment>
+ <comment xml:lang="gl">CD de son</comment>
+ <comment xml:lang="eu">Audioko CDa</comment>
+ <comment xml:lang="es">CD de audio</comment>
+ <comment xml:lang="de">Audio-CD</comment>
+ <comment xml:lang="be">аўдыя CD</comment>
</mime-type>
-
<mime-type type="x-content/blank-cd">
<!-- http://en.wikipedia.org/wiki/Compact_Disc -->
- <comment>blank CD disc</comment>
- <comment xml:lang="af">skoon CD-skyf</comment>
- <comment xml:lang="ar">قرص CD فارغ</comment>
- <comment xml:lang="be-Latn">čysty dysk CD</comment>
- <comment xml:lang="bg">CD — празно</comment>
- <comment xml:lang="ca">disc CD en blanc</comment>
- <comment xml:lang="cs">prázdný disk CD</comment>
- <comment xml:lang="da">tom cd-disk</comment>
- <comment xml:lang="de">Leere CD</comment>
- <comment xml:lang="el">Κενό CD</comment>
- <comment xml:lang="en-GB">blank CD disc</comment>
- <comment xml:lang="es">disco CD en blanco</comment>
- <comment xml:lang="eu">CD disko hutsa</comment>
- <comment xml:lang="fi">tyhjä CD-levy</comment>
- <comment xml:lang="fo">blonk fløga</comment>
- <comment xml:lang="fr">CD vierge</comment>
- <comment xml:lang="fur">disc CD vueit</comment>
- <comment xml:lang="ga">dlúthdhiosca folamh</comment>
- <comment xml:lang="gl">disco de CD en brancho</comment>
- <comment xml:lang="he">תקליטור ריק</comment>
- <comment xml:lang="hr">Prazni CD disk</comment>
- <comment xml:lang="hu">üres CD-lemez</comment>
- <comment xml:lang="ia">Disco CD vacue</comment>
- <comment xml:lang="id">cakram CD kosong</comment>
- <comment xml:lang="it">Disco vuoto CD</comment>
- <comment xml:lang="ja">ブランク CD ディスク</comment>
- <comment xml:lang="kk">таза CD дискі</comment>
- <comment xml:lang="ko">빈 CD 디스크</comment>
- <comment xml:lang="lt">tuščias CD diskas</comment>
- <comment xml:lang="lv">tukšs CD disks</comment>
- <comment xml:lang="nl">blanco CD</comment>
- <comment xml:lang="nn">tom CD-plate</comment>
- <comment xml:lang="oc">CD verge</comment>
- <comment xml:lang="pl">Pusta płyta CD</comment>
- <comment xml:lang="pt">CD vazio</comment>
- <comment xml:lang="pt-BR">Disco CD vazio</comment>
- <comment xml:lang="ro">disc gol CD</comment>
- <comment xml:lang="ru">Чистый диск CD</comment>
- <comment xml:lang="sk">Prázdny disk CD</comment>
- <comment xml:lang="sl">prazen CD disk</comment>
- <comment xml:lang="sq">Disk bosh CD</comment>
- <comment xml:lang="sr">празан ЦД диск</comment>
- <comment xml:lang="sv">tom cd-skiva</comment>
- <comment xml:lang="tr">boş CD diski</comment>
+ <comment>Blank CD disc</comment>
<comment xml:lang="uk">порожній компакт-диск</comment>
- <comment xml:lang="vi">đĩa CD trống</comment>
- <comment xml:lang="zh-CN">空 CD 光盘</comment>
- <comment xml:lang="zh-TW">空白 CD 光碟</comment>
+ <comment xml:lang="sv">Tom cd-skiva</comment>
+ <comment xml:lang="ru">Чистый диск CD</comment>
+ <comment xml:lang="pt_BR">Disco CD vazio</comment>
+ <comment xml:lang="pl">Pusta płyta CD</comment>
+ <comment xml:lang="ja">空CD</comment>
+ <comment xml:lang="it">Disco vuoto CD</comment>
+ <comment xml:lang="gl">Disco de CD en branco</comment>
+ <comment xml:lang="eu">CD disko hutsa</comment>
+ <comment xml:lang="es">disco CD vacío</comment>
+ <comment xml:lang="de">Leere CD</comment>
+ <comment xml:lang="be">чысты дыск CD</comment>
</mime-type>
-
<mime-type type="x-content/blank-dvd">
<!-- http://en.wikipedia.org/wiki/DVD -->
- <comment>blank DVD disc</comment>
- <comment xml:lang="af">skoon DVD-skyf</comment>
- <comment xml:lang="ar">قرص DVD فارغ</comment>
- <comment xml:lang="be-Latn">čysty dysk DVD</comment>
- <comment xml:lang="bg">DVD — празно</comment>
- <comment xml:lang="ca">disc DVD en blanc</comment>
- <comment xml:lang="cs">prázdný disk DVD</comment>
- <comment xml:lang="da">tom dvd-disk</comment>
- <comment xml:lang="de">Leere DVD</comment>
- <comment xml:lang="el">Κενό DVD</comment>
- <comment xml:lang="en-GB">blank DVD disc</comment>
- <comment xml:lang="es">disco DVD en blanco</comment>
- <comment xml:lang="eu">DVD disko hutsa</comment>
- <comment xml:lang="fi">tyhjä DVD-levy</comment>
- <comment xml:lang="fo">blonk margfløga</comment>
- <comment xml:lang="fr">DVD vierge</comment>
- <comment xml:lang="fur">disc DVD vueit</comment>
- <comment xml:lang="ga">DVD folamh</comment>
- <comment xml:lang="gl">disco de DVD en branco</comment>
- <comment xml:lang="he">תקליטור DVD ריק</comment>
- <comment xml:lang="hr">Prazni DVD disk</comment>
- <comment xml:lang="hu">üres DVD-lemez</comment>
- <comment xml:lang="ia">Disco DVD vacue</comment>
- <comment xml:lang="id">cakram DVD kosong</comment>
- <comment xml:lang="it">Disco vuoto DVD</comment>
- <comment xml:lang="ja">ブランク DVD ディスク</comment>
- <comment xml:lang="kk">таза DVD дискі</comment>
- <comment xml:lang="ko">빈 DVD 디스크</comment>
- <comment xml:lang="lt">tuščias DVD diskas</comment>
- <comment xml:lang="lv">tukšs DVD disks</comment>
- <comment xml:lang="nl">blanco DVD</comment>
- <comment xml:lang="nn">tom DVD-plate</comment>
- <comment xml:lang="oc">DVD verge</comment>
- <comment xml:lang="pl">Pusta płyta DVD</comment>
- <comment xml:lang="pt">DVD vazio</comment>
- <comment xml:lang="pt-BR">Disco DVD vazio</comment>
- <comment xml:lang="ro">disc gol DVD</comment>
- <comment xml:lang="ru">Чистый диск DVD</comment>
- <comment xml:lang="sk">Prázdny disk DVD</comment>
- <comment xml:lang="sl">prazen DVD disk</comment>
- <comment xml:lang="sq">Disk bosh DVD</comment>
- <comment xml:lang="sr">празан ДВД диск</comment>
- <comment xml:lang="sv">tom dvd-skiva</comment>
- <comment xml:lang="tr">boş DVD diski</comment>
+ <comment>Blank DVD disc</comment>
<comment xml:lang="uk">порожній диск DVD</comment>
- <comment xml:lang="vi">đĩa DVD trống</comment>
- <comment xml:lang="zh-CN">空 DVD 光盘</comment>
- <comment xml:lang="zh-TW">空白 DVD 光碟</comment>
+ <comment xml:lang="sv">Tom dvd-skiva</comment>
+ <comment xml:lang="ru">Чистый диск DVD</comment>
+ <comment xml:lang="pt_BR">Disco DVD vazio</comment>
+ <comment xml:lang="pl">Pusta płyta DVD</comment>
+ <comment xml:lang="ja">空DVD</comment>
+ <comment xml:lang="it">Disco vuoto DVD</comment>
+ <comment xml:lang="gl">Disco de DVD en branco</comment>
+ <comment xml:lang="eu">DVD disko hutsa</comment>
+ <comment xml:lang="es">disco DVD vacío</comment>
+ <comment xml:lang="de">Leere DVD</comment>
+ <comment xml:lang="be">чысты дыск DVD</comment>
</mime-type>
-
<mime-type type="x-content/blank-bd">
<!-- http://en.wikipedia.org/wiki/Blu-ray_Disc -->
- <comment>blank Blu-ray disc</comment>
- <comment xml:lang="af">skoon Blu-ray-skyf</comment>
- <comment xml:lang="ar">قرص بلو-راي فارغ</comment>
- <comment xml:lang="be-Latn">čysty dysk Blu-ray</comment>
- <comment xml:lang="bg">Blu-ray — празно</comment>
- <comment xml:lang="ca">disc Blu-Ray en blanc</comment>
- <comment xml:lang="cs">prázdný disk Blu-ray</comment>
- <comment xml:lang="da">tom Blu-ray-disk</comment>
- <comment xml:lang="de">Leere Blu-ray-Scheibe</comment>
- <comment xml:lang="el">Κενό Blu-ray</comment>
- <comment xml:lang="en-GB">blank Blu-ray disc</comment>
- <comment xml:lang="es">disco Blu-ray en blanco</comment>
- <comment xml:lang="eu">Blu-ray disko hutsa</comment>
- <comment xml:lang="fi">tyhjä Blu-ray-levy</comment>
- <comment xml:lang="fo">blankur Blu-ray diskur</comment>
- <comment xml:lang="fr">disque Blu-Ray vierge</comment>
- <comment xml:lang="fur">disc Blu-ray vueit</comment>
- <comment xml:lang="ga">diosca folamh Blu-Ray</comment>
- <comment xml:lang="gl">disco Blu-ray en branco</comment>
- <comment xml:lang="he">תקליטור בלו־ריי ריק</comment>
- <comment xml:lang="hr">Prazni Blu-ray disk</comment>
- <comment xml:lang="hu">üres Blu-Ray lemez</comment>
- <comment xml:lang="ia">Disco Bly-ray vacue</comment>
- <comment xml:lang="id">cakram Blu-ray kosong</comment>
- <comment xml:lang="it">Disco vuoto Blu-ray</comment>
- <comment xml:lang="ja">ブランク Blu-ray ディスク</comment>
- <comment xml:lang="kk">таза Blu-ray дискі</comment>
- <comment xml:lang="ko">빈 블루레이 디스크</comment>
- <comment xml:lang="lt">tuščias Blu-ray diskas</comment>
- <comment xml:lang="lv">tukšs Blu-ray disks</comment>
- <comment xml:lang="nl">blanco Blu-ray-disk</comment>
- <comment xml:lang="nn">tom Blu-Ray-plate</comment>
- <comment xml:lang="oc">disc Blu-Ray verge</comment>
- <comment xml:lang="pl">Pusta płyta Blu-ray</comment>
- <comment xml:lang="pt">Blu-Ray vazio</comment>
- <comment xml:lang="pt-BR">Disco Blu-ray vazio</comment>
- <comment xml:lang="ro">disc gol Blu-ray</comment>
- <comment xml:lang="ru">Чистый диск Blu-ray</comment>
- <comment xml:lang="sk">Prázdny disk Blu-ray</comment>
- <comment xml:lang="sl">prazen Blu-Ray disk</comment>
- <comment xml:lang="sq">Disk bosh Blu-ray</comment>
- <comment xml:lang="sr">празан Блу-реј диск</comment>
- <comment xml:lang="sv">tom Blu-ray-skiva</comment>
- <comment xml:lang="tr">boş Blu-ray diski</comment>
+ <comment>Blank Blu-ray disc</comment>
<comment xml:lang="uk">порожній диск Blu-ray</comment>
- <comment xml:lang="vi">đĩa Blu-ray trống</comment>
- <comment xml:lang="zh-CN">空蓝光 DVD</comment>
- <comment xml:lang="zh-TW">空白 Blu-ray 光碟</comment>
+ <comment xml:lang="sv">Tom Blu-ray-skiva</comment>
+ <comment xml:lang="ru">Чистый диск Blu-ray</comment>
+ <comment xml:lang="pt_BR">Disco Blu-ray vazio</comment>
+ <comment xml:lang="pl">Pusta płyta Blu-ray</comment>
+ <comment xml:lang="it">Disco vuoto Blu-ray</comment>
+ <comment xml:lang="gl">Disco Blu-ray en branco</comment>
+ <comment xml:lang="eu">Blu-ray disko hutsa</comment>
+ <comment xml:lang="es">disco Blu-ray vacío</comment>
+ <comment xml:lang="de">Leere Blu-ray</comment>
+ <comment xml:lang="be">чысты дыск Blu-ray</comment>
</mime-type>
-
<mime-type type="x-content/blank-hddvd">
<!-- http://en.wikipedia.org/wiki/HD_DVD -->
- <comment>blank HD DVD disc</comment>
- <comment xml:lang="af">skoon HD-DVD-skyf</comment>
- <comment xml:lang="ar">قرص HD DVD فارغ</comment>
- <comment xml:lang="be-Latn">čysty dysk HD DVD</comment>
- <comment xml:lang="bg">HD DVD — празно</comment>
- <comment xml:lang="ca">disc HD-DVD en blanc</comment>
- <comment xml:lang="cs">prázdný disk HD DVD</comment>
- <comment xml:lang="da">tom HD dvd-disk</comment>
- <comment xml:lang="de">Leere HD-DVD</comment>
- <comment xml:lang="el">Κενό HD DVD</comment>
- <comment xml:lang="en-GB">blank HD DVD disc</comment>
- <comment xml:lang="es">disco HD DVD en blanco</comment>
- <comment xml:lang="eu">HD DVD disko hutsa</comment>
- <comment xml:lang="fi">tyhjä HD DVD -levy</comment>
- <comment xml:lang="fo">blankur HD DVD diskur</comment>
- <comment xml:lang="fr">disque HD-DVD vierge</comment>
- <comment xml:lang="fur">disc HD DVD vueit</comment>
- <comment xml:lang="ga">HD DVD folamh</comment>
- <comment xml:lang="gl">disco de HD DVD en branco</comment>
- <comment xml:lang="he">דיסק HD DVD ריק</comment>
- <comment xml:lang="hr">Prazni HD DVD disk</comment>
- <comment xml:lang="hu">üres HD DVD-lemez</comment>
- <comment xml:lang="ia">Disco HD DVD vacue</comment>
- <comment xml:lang="id">cakram HD DVD kosong</comment>
- <comment xml:lang="it">Disco vuoto DVD HD</comment>
- <comment xml:lang="ja">ブランク HD DVD ディスク</comment>
- <comment xml:lang="kk">таза HD DVD дискі</comment>
- <comment xml:lang="ko">빈 HD DVD 디스크</comment>
- <comment xml:lang="lt">tuščias HD DVD diskas</comment>
- <comment xml:lang="lv">tukšs HD DVD disks</comment>
- <comment xml:lang="nl">blanco HD-DVD</comment>
- <comment xml:lang="nn">tom HD-DVD-plate</comment>
- <comment xml:lang="oc">disc HD-DVD verge</comment>
- <comment xml:lang="pl">Pusta płyta HD DVD</comment>
- <comment xml:lang="pt">HD DVD vazio</comment>
- <comment xml:lang="pt-BR">Disco HD DVD vazio</comment>
- <comment xml:lang="ro">disc gol HD DVD</comment>
- <comment xml:lang="ru">Чистый диск HD DVD</comment>
- <comment xml:lang="sk">Prázdny disk HD DVD</comment>
- <comment xml:lang="sl">prazen HD DVD disk</comment>
- <comment xml:lang="sq">Disk bosh DVD HD</comment>
- <comment xml:lang="sr">празан ХД ДВД диск</comment>
- <comment xml:lang="sv">tom HD DVD-skiva</comment>
- <comment xml:lang="tr">boş HD DVD diski</comment>
+ <comment>Blank HD DVD disc</comment>
<comment xml:lang="uk">порожній диск HD DVD</comment>
- <comment xml:lang="vi">đĩa DVD HD trống</comment>
- <comment xml:lang="zh-CN">空 HD DVD 光盘</comment>
- <comment xml:lang="zh-TW">空白 HD DVD 光碟</comment>
+ <comment xml:lang="sv">Tom HD DVD-skiva</comment>
+ <comment xml:lang="ru">Чистый диск HD DVD</comment>
+ <comment xml:lang="pt_BR">Disco HD DVD vazio</comment>
+ <comment xml:lang="pl">Pusta płyta HD DVD</comment>
+ <comment xml:lang="it">Disco vuoto DVD HD</comment>
+ <comment xml:lang="gl">Disco de HD DVD en branco</comment>
+ <comment xml:lang="eu">HD DVD disko hutsa</comment>
+ <comment xml:lang="es">disco HD DVD vacío</comment>
+ <comment xml:lang="de">Leere HD-DVD</comment>
+ <comment xml:lang="be">чысты дыск HD DVD</comment>
</mime-type>
-
<mime-type type="x-content/audio-dvd">
<!-- http://en.wikipedia.org/wiki/DVD-Audio -->
- <comment>audio DVD</comment>
- <comment xml:lang="af">oudio-DVD</comment>
- <comment xml:lang="ar">DVD سمعي</comment>
- <comment xml:lang="be-Latn">aŭdyjo DVD</comment>
- <comment xml:lang="bg">DVD — аудио</comment>
- <comment xml:lang="ca">DVD d'àudio</comment>
- <comment xml:lang="cs">zvukové DVD</comment>
- <comment xml:lang="da">lyd-dvd</comment>
- <comment xml:lang="de">Audio-DVD</comment>
- <comment xml:lang="el">DVD ήχου</comment>
- <comment xml:lang="en-GB">audio DVD</comment>
- <comment xml:lang="eo">Son-DVD</comment>
- <comment xml:lang="es">DVD de audio</comment>
- <comment xml:lang="eu">audio DVDa</comment>
- <comment xml:lang="fi">ääni-DVD</comment>
- <comment xml:lang="fo">Ljóð DVD</comment>
- <comment xml:lang="fr">DVD audio</comment>
- <comment xml:lang="fur">DVD audio</comment>
- <comment xml:lang="ga">DVD fuaime</comment>
- <comment xml:lang="gl">DVD de son</comment>
- <comment xml:lang="he">DVD שמע</comment>
- <comment xml:lang="hr">Glazbeni DVD</comment>
- <comment xml:lang="hu">hang DVD</comment>
- <comment xml:lang="ia">DVD audio</comment>
- <comment xml:lang="id">DVD audio</comment>
- <comment xml:lang="it">DVD audio</comment>
- <comment xml:lang="ja">オーディオ DVD</comment>
- <comment xml:lang="kk">аудио DVD</comment>
- <comment xml:lang="ko">오디오 DVD</comment>
- <comment xml:lang="lt">garso DVD</comment>
- <comment xml:lang="lv">audio DVD</comment>
- <comment xml:lang="nl">audio-DVD</comment>
- <comment xml:lang="nn">lyd-DVD</comment>
- <comment xml:lang="oc">DVD àudio</comment>
- <comment xml:lang="pl">DVD-Audio</comment>
- <comment xml:lang="pt">DVD áudio</comment>
- <comment xml:lang="pt-BR">DVD de áudio</comment>
- <comment xml:lang="ro">DVD audio</comment>
+ <comment>Audio DVD</comment>
+ <comment xml:lang="uk">Звуковий DVD</comment>
+ <comment xml:lang="sv">Ljud-dvd</comment>
<comment xml:lang="ru">Аудио DVD</comment>
- <comment xml:lang="sk">Zvukové DVD</comment>
- <comment xml:lang="sl">zvočni DVD</comment>
- <comment xml:lang="sq">DVD audio</comment>
- <comment xml:lang="sr">звучни ДВД</comment>
- <comment xml:lang="sv">ljud-dvd</comment>
- <comment xml:lang="tr">ses DVD'si</comment>
- <comment xml:lang="uk">звуковий DVD</comment>
- <comment xml:lang="vi">đĩa DVD âm thanh</comment>
- <comment xml:lang="zh-CN">音频 DVD</comment>
- <comment xml:lang="zh-TW">音訊 DVD</comment>
+ <comment xml:lang="pt_BR">DVD de áudio</comment>
+ <comment xml:lang="pl">DVD-Audio</comment>
+ <comment xml:lang="it">DVD audio</comment>
+ <comment xml:lang="gl">DVD de son</comment>
+ <comment xml:lang="eu">Audioko DVDa</comment>
+ <comment xml:lang="es">DVD de audio</comment>
+ <comment xml:lang="de">Audio-DVD</comment>
+ <comment xml:lang="be">аўдыя DVD</comment>
<treemagic>
<treematch path="AUDIO_TS/AUDIO_TS.IFO" type="file"/>
<treematch path="AUDIO_TS/AUDIO_TS.IFO;1" type="file"/>
</treemagic>
</mime-type>
-
<mime-type type="x-content/video-bluray">
<!-- http://en.wikipedia.org/wiki/Blu-ray_Disc
http://www.blu-raydisc.com/Section-13470/Section-13890/Index.html -->
<comment>Blu-ray video disc</comment>
- <comment xml:lang="af">Blu-ray-videoskyf</comment>
- <comment xml:lang="ar">قرص بلو-راي مرئي</comment>
- <comment xml:lang="ast">Discu Blu-ray de videu</comment>
- <comment xml:lang="be-Latn">Videadysk Blu-ray</comment>
- <comment xml:lang="bg">Blu-ray — видео</comment>
- <comment xml:lang="ca">disc de vídeo Blu-Ray</comment>
- <comment xml:lang="cs">videodisk Blu-ray</comment>
- <comment xml:lang="da">Blu-ray-videodisk</comment>
- <comment xml:lang="de">Blu-ray-Videoscheibe</comment>
- <comment xml:lang="el">Δίσκος βίντεο Blu-ray</comment>
- <comment xml:lang="en-GB">Blu-ray video disc</comment>
- <comment xml:lang="es">disco de vídeo Blu-ray</comment>
- <comment xml:lang="eu">Blu-ray bideo-diskoa</comment>
- <comment xml:lang="fi">Blu-ray-videolevy</comment>
- <comment xml:lang="fo">Blu-ray diskur</comment>
- <comment xml:lang="fr">disque vidéo Blu-Ray</comment>
- <comment xml:lang="fur">disc video Blu-ray</comment>
- <comment xml:lang="ga">diosca físe Blu-Ray</comment>
- <comment xml:lang="gl">disco de vídeo Blu-ray</comment>
- <comment xml:lang="he">תקליטור וידאו מסוג בלו־ריי</comment>
- <comment xml:lang="hr">Blu-ray video disk</comment>
- <comment xml:lang="hu">Blu-ray videolemez</comment>
- <comment xml:lang="ia">Disco video Blu-ray</comment>
- <comment xml:lang="id">Cakram video Blu-ray</comment>
- <comment xml:lang="it">Disco video Blu-ray</comment>
- <comment xml:lang="ja">Blu-ray ビデオディスク</comment>
- <comment xml:lang="ka">Blu-ray ვიდეო დისკი</comment>
- <comment xml:lang="kk">Blu-ray видео дискі</comment>
- <comment xml:lang="ko">블루레이 동영상 디스크</comment>
- <comment xml:lang="lt">Blu-ray vaizdo diskas</comment>
- <comment xml:lang="lv">Blu-ray video disks</comment>
- <comment xml:lang="nl">Blu-ray-videodisk</comment>
- <comment xml:lang="nn">Blu-Ray videoplate</comment>
- <comment xml:lang="oc">disc vidèo Blu-Ray</comment>
- <comment xml:lang="pl">Płyta wideo Blu-ray</comment>
- <comment xml:lang="pt">Blu-ray de vídeo</comment>
- <comment xml:lang="pt-BR">Disco de vídeo Blu-ray</comment>
- <comment xml:lang="ro">Disc video Blu-ray</comment>
- <comment xml:lang="ru">Видеодиск Blu-ray</comment>
- <comment xml:lang="sk">Videodisk Blu-ray</comment>
- <comment xml:lang="sl">Blu-ray video disk</comment>
- <comment xml:lang="sq">Disk video Blu-ray</comment>
- <comment xml:lang="sr">Блу-реј видео диск</comment>
- <comment xml:lang="sv">Blu-ray-videoskiva</comment>
- <comment xml:lang="tr">Blu-ray video diski</comment>
- <comment xml:lang="uk">відеодиск Blu-ray</comment>
+ <comment xml:lang="zh_TW">Blu-ray 視訊光碟</comment>
+ <comment xml:lang="zh_CN">蓝光视频光盘</comment>
<comment xml:lang="vi">Đĩa ảnh động Blu-ray</comment>
- <comment xml:lang="zh-CN">蓝光视频光盘</comment>
- <comment xml:lang="zh-TW">Blu-ray 視訊光碟</comment>
+ <comment xml:lang="uk">відеодиск Blu-ray</comment>
+ <comment xml:lang="tr">Blu-ray video diski</comment>
+ <comment xml:lang="sv">Blu-ray-videoskiva</comment>
+ <comment xml:lang="sr">Блу-реј видео диск</comment>
+ <comment xml:lang="sq">disk video Blu-ray</comment>
+ <comment xml:lang="sl">Blu-ray video disk</comment>
+ <comment xml:lang="si">Blu-ray වීඩියෝ තැටිය</comment>
+ <comment xml:lang="sk">Videodisk Blu-ray</comment>
+ <comment xml:lang="ru">Видеодиск Blu-ray</comment>
+ <comment xml:lang="ro">Disc video Blu-ray</comment>
+ <comment xml:lang="pt_BR">Disco de vídeo Blu-ray</comment>
+ <comment xml:lang="pt">Blu-ray de vídeo</comment>
+ <comment xml:lang="pl">Płyta wideo Blu-ray</comment>
+ <comment xml:lang="oc">disc vidèo Blu-Ray</comment>
+ <comment xml:lang="nn">Blu-Ray videoplate</comment>
+ <comment xml:lang="nl">Blu-ray-videodisk</comment>
+ <comment xml:lang="lv">Blu-ray video disks</comment>
+ <comment xml:lang="lt">Blu-ray vaizdo diskas</comment>
+ <comment xml:lang="ko">블루레이 동영상 디스크</comment>
+ <comment xml:lang="kk">Blu-ray видео дискі</comment>
+ <comment xml:lang="ka">Blu-ray ვიდეო დისკი</comment>
+ <comment xml:lang="ja">Blu-ray ビデオディスク</comment>
+ <comment xml:lang="it">Disco video Blu-ray</comment>
+ <comment xml:lang="is">Blu-Ray mynddiskur</comment>
+ <comment xml:lang="id">Cakram video Blu-ray</comment>
+ <comment xml:lang="ia">Disco video Blu-ray</comment>
+ <comment xml:lang="hu">Blu-ray videolemez</comment>
+ <comment xml:lang="hr">Blu-ray video disk</comment>
+ <comment xml:lang="he">תקליטור וידאו מסוג בלו־ריי</comment>
+ <comment xml:lang="gl">disco de vídeo Blu-ray</comment>
+ <comment xml:lang="ga">diosca físe Blu-Ray</comment>
+ <comment xml:lang="fur">disc video Blu-ray</comment>
+ <comment xml:lang="fr">disque vidéo Blu-Ray</comment>
+ <comment xml:lang="fo">Blu-ray diskur</comment>
+ <comment xml:lang="fi">Blu-ray-videolevy</comment>
+ <comment xml:lang="eu">Blu-ray bideo-diskoa</comment>
+ <comment xml:lang="es">disco de vídeo Blu-ray</comment>
+ <comment xml:lang="en_GB">Blu-ray video disc</comment>
+ <comment xml:lang="el">Δίσκος βίντεο Blu-ray</comment>
+ <comment xml:lang="de">Blu-ray-Video</comment>
+ <comment xml:lang="da">Blu-ray-videodisk</comment>
+ <comment xml:lang="cs">videodisk Blu-ray</comment>
+ <comment xml:lang="ca">disc de vídeo Blu-Ray</comment>
+ <comment xml:lang="bg">Blu-ray — видео</comment>
+ <comment xml:lang="be@latin">Videadysk Blu-ray</comment>
+ <comment xml:lang="be">відэадыск Blu-ray</comment>
+ <comment xml:lang="ast">Discu Blu-ray de videu</comment>
+ <comment xml:lang="ar">قرص فيديو بلو-راي</comment>
+ <comment xml:lang="af">Blu-ray-videoskyf</comment>
<treemagic>
<treematch path="BDAV" type="directory" non-empty="true"/>
<treematch path="BDMV" type="directory" non-empty="true"/>
</treemagic>
</mime-type>
-
<mime-type type="x-content/video-hddvd">
<!-- http://en.wikipedia.org/wiki/HD_DVD
http://www.dvdafteredit.com/wiki/The_HVDVD_TS_Folder -->
<comment>HD DVD video disc</comment>
- <comment xml:lang="af">HD-DVD-videoskyf</comment>
- <comment xml:lang="ar">قرص HD DVD مرئي</comment>
- <comment xml:lang="ast">Discu HD DVD de videu</comment>
- <comment xml:lang="be-Latn">Videadysk HD DVD</comment>
- <comment xml:lang="bg">HD DVD — видео</comment>
- <comment xml:lang="ca">disc de vídeo HD-DVD</comment>
- <comment xml:lang="cs">Videodisk HD DVD</comment>
- <comment xml:lang="da">HD DVD-videodisk</comment>
- <comment xml:lang="de">HD-DVD-Videoscheibe</comment>
- <comment xml:lang="el">Δίσκος βίντεο HD DVD</comment>
- <comment xml:lang="en-GB">HD DVD video disc</comment>
- <comment xml:lang="es">disco de vídeo HD DVD</comment>
- <comment xml:lang="eu">HD DVD bideo-diskoa</comment>
- <comment xml:lang="fi">HD DVD -videolevy</comment>
- <comment xml:lang="fo">HD DVD video diskur</comment>
- <comment xml:lang="fr">disque vidéo HD DVD</comment>
- <comment xml:lang="fur">disc video HD DVD</comment>
- <comment xml:lang="ga">diosca físe HD DVD</comment>
- <comment xml:lang="gl">disco de vídeo HD DVD</comment>
- <comment xml:lang="he">תקליטור וידאו HD DVD</comment>
- <comment xml:lang="hr">HD DVD video disk</comment>
- <comment xml:lang="hu">HD DVD videolemez</comment>
- <comment xml:lang="ia">Disco video HD DVD</comment>
- <comment xml:lang="id">Cakram video HD DVD</comment>
- <comment xml:lang="it">Disco video DVD HD</comment>
- <comment xml:lang="ja">HD DVD ビデオディスク</comment>
- <comment xml:lang="kk">HD DVD видео дискі</comment>
- <comment xml:lang="ko">HD DVD 동영상 디스크</comment>
- <comment xml:lang="lt">HD DVD vaizdo diskas</comment>
- <comment xml:lang="lv">HD DVD video disks</comment>
- <comment xml:lang="nl">HD-DVD-videodisk</comment>
- <comment xml:lang="nn">HD-DVD-videodisk</comment>
- <comment xml:lang="oc">disc vidèo HD DVD</comment>
- <comment xml:lang="pl">Płyta wideo HD DVD</comment>
- <comment xml:lang="pt">HD DVD de vídeo</comment>
- <comment xml:lang="pt-BR">Disco de vídeo HD DVD</comment>
- <comment xml:lang="ro">Disc video HD DVD</comment>
- <comment xml:lang="ru">Видеодиск HD DVD</comment>
- <comment xml:lang="sk">Videodisk HD DVD</comment>
- <comment xml:lang="sl">HD DVD video disk</comment>
- <comment xml:lang="sq">Disk video DVD HD</comment>
- <comment xml:lang="sr">ХД ДВД видео диск</comment>
- <comment xml:lang="sv">HD DVD-videoskiva</comment>
- <comment xml:lang="tr">HD DVD vidyo diski</comment>
- <comment xml:lang="uk">відеодиск HD DVD</comment>
+ <comment xml:lang="zh_TW">HD DVD 視訊光碟</comment>
+ <comment xml:lang="zh_CN">HD DVD 视频光盘</comment>
<comment xml:lang="vi">Đĩa ảnh động DVD HD</comment>
- <comment xml:lang="zh-CN">HD DVD 视频光盘</comment>
- <comment xml:lang="zh-TW">HD DVD 視訊光碟</comment>
+ <comment xml:lang="uk">відеодиск HD DVD</comment>
+ <comment xml:lang="tr">HD DVD vidyo diski</comment>
+ <comment xml:lang="sv">HD DVD-videoskiva</comment>
+ <comment xml:lang="sr">ХД ДВД видео диск</comment>
+ <comment xml:lang="sq">disk video DVD HD</comment>
+ <comment xml:lang="sl">HD DVD video disk</comment>
+ <comment xml:lang="si">HD DVD වීඩියෝ තැටිය</comment>
+ <comment xml:lang="sk">Videodisk HD DVD</comment>
+ <comment xml:lang="ru">Видеодиск HD DVD</comment>
+ <comment xml:lang="ro">Disc video HD DVD</comment>
+ <comment xml:lang="pt_BR">Disco de vídeo HD DVD</comment>
+ <comment xml:lang="pt">HD DVD de vídeo</comment>
+ <comment xml:lang="pl">Płyta wideo HD DVD</comment>
+ <comment xml:lang="oc">disc vidèo HD DVD</comment>
+ <comment xml:lang="nn">HD-DVD-videodisk</comment>
+ <comment xml:lang="nl">HD-DVD-videodisk</comment>
+ <comment xml:lang="lv">HD DVD video disks</comment>
+ <comment xml:lang="lt">HD DVD vaizdo diskas</comment>
+ <comment xml:lang="ko">HD DVD 동영상 디스크</comment>
+ <comment xml:lang="kk">HD DVD видео дискі</comment>
+ <comment xml:lang="ka">HD DVD ვიდეო დისკი</comment>
+ <comment xml:lang="ja">HD DVD ビデオディスク</comment>
+ <comment xml:lang="it">Disco video DVD HD</comment>
+ <comment xml:lang="is">HD DVD mynddiskur</comment>
+ <comment xml:lang="id">Cakram video HD DVD</comment>
+ <comment xml:lang="ia">Disco video HD DVD</comment>
+ <comment xml:lang="hu">HD DVD videolemez</comment>
+ <comment xml:lang="hr">HD DVD video disk</comment>
+ <comment xml:lang="he">תקליטור וידאו HD DVD</comment>
+ <comment xml:lang="gl">disco de vídeo HD DVD</comment>
+ <comment xml:lang="ga">diosca físe HD DVD</comment>
+ <comment xml:lang="fur">disc video HD DVD</comment>
+ <comment xml:lang="fr">disque vidéo HD DVD</comment>
+ <comment xml:lang="fo">HD DVD video diskur</comment>
+ <comment xml:lang="fi">HD DVD -videolevy</comment>
+ <comment xml:lang="eu">HD DVD bideo-diskoa</comment>
+ <comment xml:lang="es">disco de vídeo HD DVD</comment>
+ <comment xml:lang="en_GB">HD DVD video disc</comment>
+ <comment xml:lang="el">Δίσκος βίντεο HD DVD</comment>
+ <comment xml:lang="de">HD-DVD-Video</comment>
+ <comment xml:lang="da">HD DVD-videodisk</comment>
+ <comment xml:lang="cs">Videodisk HD DVD</comment>
+ <comment xml:lang="ca">disc de vídeo HD-DVD</comment>
+ <comment xml:lang="bg">HD DVD — видео</comment>
+ <comment xml:lang="be@latin">Videadysk HD DVD</comment>
+ <comment xml:lang="be">відэадыск HD DVD</comment>
+ <comment xml:lang="ast">Discu HD DVD de videu</comment>
+ <comment xml:lang="ar">قرص فيديو HD DVD</comment>
+ <comment xml:lang="af">HD-DVD-videoskyf</comment>
<treemagic>
<treematch path="HVDVD_TS/HV000I01.IFO" type="file"/>
<treematch path="HVDVD_TS/HV001I01.IFO" type="file"/>
<treematch path="HVDVD_TS/HVA00001.VTI" type="file"/>
</treemagic>
</mime-type>
-
<mime-type type="x-content/ebook-reader">
<!-- see fd.o hal spec -->
- <comment>e-book reader</comment>
- <comment xml:lang="af">e-boekleser</comment>
- <comment xml:lang="bg">Четец на е-книги</comment>
- <comment xml:lang="ca">lector de llibres electrònics</comment>
- <comment xml:lang="cs">čtečka elektronických knih</comment>
- <comment xml:lang="da">e-bogslæser</comment>
- <comment xml:lang="de">E-Book-Leser</comment>
- <comment xml:lang="el">Αναγνώστης ηλεκτρονικών βιβλίων</comment>
- <comment xml:lang="en-GB">e-book reader</comment>
- <comment xml:lang="es">lector de libros electrónicos</comment>
- <comment xml:lang="eu">e-book irakurlea</comment>
- <comment xml:lang="fi">e-kirjan lukulaite</comment>
- <comment xml:lang="fr">lecteur de livre numérique</comment>
- <comment xml:lang="fur">letôr e-book</comment>
- <comment xml:lang="ga">léitheoir r-leabhair</comment>
- <comment xml:lang="gl">lector de libros electrónicos</comment>
- <comment xml:lang="he">קורא ספרים אלקטרוניים</comment>
- <comment xml:lang="hr">Čitač e-knjiga</comment>
- <comment xml:lang="hu">e-könyvolvasó</comment>
- <comment xml:lang="ia">Lector de libro electronic</comment>
- <comment xml:lang="id">pembaca e-book</comment>
- <comment xml:lang="it">Lettore e-book</comment>
- <comment xml:lang="ja">電子書籍リーダー</comment>
- <comment xml:lang="kk">электронды кітаптарды оқу құрылғысы</comment>
- <comment xml:lang="ko">전자책 리더</comment>
- <comment xml:lang="lv">e-grāmatu lasītājs</comment>
- <comment xml:lang="nl">e-book reader</comment>
- <comment xml:lang="oc">lector de libre numeric</comment>
- <comment xml:lang="pl">Czytnik e-booków</comment>
- <comment xml:lang="pt">leitor de ebooks</comment>
- <comment xml:lang="pt-BR">Leitor de e-book</comment>
+ <comment>E-book reader</comment>
+ <comment xml:lang="uk">пристрій для читання ел. книг</comment>
+ <comment xml:lang="sv">E-bokläsare</comment>
<comment xml:lang="ru">Устройство для чтения электронных книг</comment>
- <comment xml:lang="sk">Čítačka e-kníh</comment>
- <comment xml:lang="sl">Bralnik elektronskih knjig</comment>
- <comment xml:lang="sr">читач ел. књига</comment>
- <comment xml:lang="sv">e-bokläsare</comment>
- <comment xml:lang="tr">e-kitap okuyucu</comment>
- <comment xml:lang="uk">пристрій для читання електронних книг</comment>
- <comment xml:lang="zh-CN">电子书阅读器</comment>
- <comment xml:lang="zh-TW">e-book 閱讀器</comment>
+ <comment xml:lang="pt_BR">Leitor de e-book</comment>
+ <comment xml:lang="pl">Czytnik e-booków</comment>
+ <comment xml:lang="ja">電子書籍閲覧機</comment>
+ <comment xml:lang="it">Lettore e-book</comment>
+ <comment xml:lang="gl">Lector de libros electrónicos</comment>
+ <comment xml:lang="es">lector de libros electrónicos</comment>
+ <comment xml:lang="de">E-Book-Reader</comment>
+ <comment xml:lang="be">электронная кніга</comment>
<treemagic>
<treematch path=".kobo" type="directory" non-empty="true"/>
<treematch path="system/com.amazon.ebook.booklet.reader" non-empty="false"/>
</treemagic>
</mime-type>
-
<mime-type type="x-content/image-picturecd">
<!-- TRANSLATORS: This is a brand-name, not a generic term. Please see
http://en.wikipedia.org/wiki/Picture_CD
http://www.re.org/kristin/picturecd.html -->
<comment>Picture CD</comment>
- <comment xml:lang="af">Picture CD</comment>
- <comment xml:lang="ar">Picture CD</comment>
- <comment xml:lang="be-Latn">Picture CD</comment>
- <comment xml:lang="bg">Picture CD — изображения</comment>
- <comment xml:lang="ca">CD d'imatges</comment>
- <comment xml:lang="cs">Picture CD</comment>
- <comment xml:lang="da">Billedcd</comment>
- <comment xml:lang="de">Picture CD</comment>
- <comment xml:lang="el">CD εικόνων</comment>
- <comment xml:lang="en-GB">Picture CD</comment>
- <comment xml:lang="es">Picture CD</comment>
- <comment xml:lang="eu">Picture CD</comment>
- <comment xml:lang="fi">Picture CD</comment>
- <comment xml:lang="fo">Picture CD</comment>
- <comment xml:lang="fr">CD Picture</comment>
- <comment xml:lang="fur">Picture CD</comment>
- <comment xml:lang="ga">dlúthdhiosca grianghraf</comment>
- <comment xml:lang="gl">Picture CD</comment>
- <comment xml:lang="he">תקליטור תמונות</comment>
- <comment xml:lang="hr">Slikovni CD</comment>
- <comment xml:lang="hu">Picture CD</comment>
- <comment xml:lang="ia">Disco Picture CD</comment>
- <comment xml:lang="id">CD Gambar</comment>
- <comment xml:lang="it">Picture CD</comment>
- <comment xml:lang="ja">ピクチャー CD</comment>
- <comment xml:lang="kk">Picture CD</comment>
- <comment xml:lang="ko">Picture CD</comment>
- <comment xml:lang="lt">Paveikslėlių CD</comment>
- <comment xml:lang="lv">Attēlu CD</comment>
- <comment xml:lang="nl">foto-CD</comment>
- <comment xml:lang="nn">Bilete-CD</comment>
- <comment xml:lang="oc">CD Picture</comment>
- <comment xml:lang="pl">Picture CD</comment>
- <comment xml:lang="pt">Picture CD</comment>
- <comment xml:lang="pt-BR">CD de Fotos</comment>
- <comment xml:lang="ro">CD cu fotografii</comment>
- <comment xml:lang="ru">Picture CD</comment>
- <comment xml:lang="sk">Picture CD</comment>
- <comment xml:lang="sl">Slikovni CD</comment>
- <comment xml:lang="sq">Picture CD</comment>
- <comment xml:lang="sr">ЦД са сликама</comment>
- <comment xml:lang="sv">Picture CD</comment>
- <comment xml:lang="tr">Resim CD'si</comment>
- <comment xml:lang="uk">CD з зображеннями</comment>
+ <comment xml:lang="zh_TW">圖片 CD</comment>
+ <comment xml:lang="zh_CN">柯达 Picture CD</comment>
<comment xml:lang="vi">Đĩa CD ảnh</comment>
- <comment xml:lang="zh-CN">柯达 Picture CD</comment>
- <comment xml:lang="zh-TW">圖片 CD</comment>
+ <comment xml:lang="uk">CD з зображеннями</comment>
+ <comment xml:lang="tr">Resim CD'si</comment>
+ <comment xml:lang="sv">Picture CD</comment>
+ <comment xml:lang="sr">ЦД са сликама</comment>
+ <comment xml:lang="sq">Picture CD</comment>
+ <comment xml:lang="sl">Slikovni CD</comment>
+ <comment xml:lang="si">පින්තූර සීඩී</comment>
+ <comment xml:lang="sk">Picture CD</comment>
+ <comment xml:lang="ru">Picture CD</comment>
+ <comment xml:lang="ro">CD cu fotografii</comment>
+ <comment xml:lang="pt_BR">CD de Fotos</comment>
+ <comment xml:lang="pt">Picture CD</comment>
+ <comment xml:lang="pl">Picture CD</comment>
+ <comment xml:lang="oc">CD Picture</comment>
+ <comment xml:lang="nn">Bilete-CD</comment>
+ <comment xml:lang="nl">Picture CD</comment>
+ <comment xml:lang="lv">Attēlu CD</comment>
+ <comment xml:lang="lt">Paveikslėlių CD</comment>
+ <comment xml:lang="ko">Picture CD</comment>
+ <comment xml:lang="kk">Picture CD</comment>
+ <comment xml:lang="ka">ფოტო სურათებიანი CD</comment>
+ <comment xml:lang="ja">ピクチャー CD</comment>
+ <comment xml:lang="it">Picture CD</comment>
+ <comment xml:lang="is">Picture CD-mynddiskur</comment>
+ <comment xml:lang="id">CD Gambar</comment>
+ <comment xml:lang="ia">Disco Picture CD</comment>
+ <comment xml:lang="hu">Picture CD</comment>
+ <comment xml:lang="hr">Slikovni CD</comment>
+ <comment xml:lang="he">תקליטור תמונות</comment>
+ <comment xml:lang="gl">Picture CD</comment>
+ <comment xml:lang="ga">dlúthdhiosca grianghraf</comment>
+ <comment xml:lang="fur">Picture CD</comment>
+ <comment xml:lang="fr">CD Picture</comment>
+ <comment xml:lang="fo">Picture CD</comment>
+ <comment xml:lang="fi">Picture CD</comment>
+ <comment xml:lang="eu">Picture CD</comment>
+ <comment xml:lang="es">Picture CD</comment>
+ <comment xml:lang="en_GB">Picture CD</comment>
+ <comment xml:lang="el">CD εικόνων</comment>
+ <comment xml:lang="de">Kodak Picture-CD</comment>
+ <comment xml:lang="da">Billedcd</comment>
+ <comment xml:lang="cs">Picture CD</comment>
+ <comment xml:lang="ca">CD d'imatges</comment>
+ <comment xml:lang="bg">Picture CD — изображения</comment>
+ <comment xml:lang="be@latin">Picture CD</comment>
+ <comment xml:lang="be">Picture CD</comment>
+ <comment xml:lang="ar">سي دي صورة</comment>
+ <comment xml:lang="af">Picture CD</comment>
<treemagic>
<treematch path="PICTURES" type="directory" non-empty="true" match-case="true"/>
</treemagic>
</mime-type>
-
<mime-type type="x-content/audio-player">
<!-- see fd.o hal spec -->
- <comment>portable audio player</comment>
- <comment xml:lang="af">draagbare oudiospeler</comment>
- <comment xml:lang="ar">مشغل الملفات المسموعة المحمولة</comment>
- <comment xml:lang="be-Latn">pieranosny aŭdyjoplayer</comment>
- <comment xml:lang="bg">Преносим аудио плеър</comment>
- <comment xml:lang="ca">reproductor d'àudio portàtil</comment>
- <comment xml:lang="cs">přenosný zvukový přehrávač</comment>
- <comment xml:lang="da">bærbar lydafspiller</comment>
- <comment xml:lang="de">Portables Audio-Wiedergabegerät</comment>
- <comment xml:lang="el">Φορητός αναπαραγωγέας μουσικής</comment>
- <comment xml:lang="en-GB">portable audio player</comment>
- <comment xml:lang="es">reproductor de audio portátil</comment>
- <comment xml:lang="eu">audio erreproduzigailu eramangarria</comment>
- <comment xml:lang="fi">siirrettävä äänisoitin</comment>
- <comment xml:lang="fo">leysur ljóðavspælari</comment>
- <comment xml:lang="fr">lecteur audio portable</comment>
- <comment xml:lang="fur">riprodutôr audio portatil</comment>
- <comment xml:lang="ga">seinnteoir iniompartha fuaime</comment>
- <comment xml:lang="gl">dispositivo de son portábel</comment>
- <comment xml:lang="he">נגן מוזיקה נייד</comment>
- <comment xml:lang="hr">Prenosivi glazbeni svirač</comment>
- <comment xml:lang="hu">hordozható zenelejátszó</comment>
- <comment xml:lang="ia">Lector audio portabile</comment>
- <comment xml:lang="id">pemutar audio portable</comment>
- <comment xml:lang="it">Lettore audio portabile</comment>
- <comment xml:lang="ja">ポータブルオーディオプレイヤー</comment>
- <comment xml:lang="kk">тасымалы аудио плеер</comment>
- <comment xml:lang="ko">휴대용 오디오 재생기</comment>
- <comment xml:lang="lt">nešiojamasis garso leistuvas</comment>
- <comment xml:lang="lv">portatīvais audio atskaņotājs</comment>
- <comment xml:lang="nl">draagbare audiospeler</comment>
- <comment xml:lang="nn">portable audio layer</comment>
- <comment xml:lang="oc">lector àudio portable</comment>
- <comment xml:lang="pl">Przenośny odtwarzacz dźwięku</comment>
- <comment xml:lang="pt">reprodutor áudio portátil</comment>
- <comment xml:lang="pt-BR">Reprodutor de áudio portátil</comment>
- <comment xml:lang="ro">player audio portabil</comment>
+ <comment>Portable audio player</comment>
+ <comment xml:lang="uk">портативний звуковий програвач</comment>
+ <comment xml:lang="sv">Bärbar ljudspelare</comment>
<comment xml:lang="ru">Портативный аудиопроигрыватель</comment>
- <comment xml:lang="sk">Prenosný hudobný prehrávač</comment>
- <comment xml:lang="sl">prenosni predvajalnik zvoka</comment>
- <comment xml:lang="sq">Lexues audio portativ</comment>
- <comment xml:lang="sr">преносна музичка справица</comment>
- <comment xml:lang="sv">bärbar ljudspelare</comment>
- <comment xml:lang="tr">taşınabilir ses oynatıcısı</comment>
- <comment xml:lang="uk">портативний аудіопрогравач</comment>
- <comment xml:lang="vi">bộ phát nhạc di động</comment>
- <comment xml:lang="zh-CN">便携式音频播放器</comment>
- <comment xml:lang="zh-TW">可攜式音訊播放程式</comment>
+ <comment xml:lang="pl">Przenośny odtwarzacz dźwięku</comment>
+ <comment xml:lang="it">Lettore audio portabile</comment>
+ <comment xml:lang="es">reproductor de audio portátil</comment>
+ <comment xml:lang="de">Portables Audio-Wiedergabegerät</comment>
+ <comment xml:lang="be">партатыўны аўдыяплэер</comment>
</mime-type>
-
<mime-type type="x-content/ostree-repository">
<!-- https://github.com/ostreedev/ostree/blob/master/man/ostree-create-usb.xml -->
<comment>OSTree software updates</comment>
- <comment xml:lang="bg">Обновление — OSTree</comment>
- <comment xml:lang="ca">actualitzacions de programari OSTree</comment>
- <comment xml:lang="da">OSTree-softwareopdateringer</comment>
- <comment xml:lang="de">OSTree-Softwareaktualisierungen</comment>
- <comment xml:lang="en-GB">OSTree software updates</comment>
- <comment xml:lang="es">actualizaciones de programas de OSTree</comment>
- <comment xml:lang="eu">OSTree software eguneraketak</comment>
- <comment xml:lang="fi">OSTree-ohjelmistopäivitykset</comment>
- <comment xml:lang="fr">mises à jour logicielles OSTree</comment>
- <comment xml:lang="hr">OSTree nadopune softvera</comment>
- <comment xml:lang="hu">OSTree szoftverfrissítések</comment>
- <comment xml:lang="id">Pemutakhiran perangkat lunak OSTree</comment>
- <comment xml:lang="it">Aggiornamenti software OSTree</comment>
- <comment xml:lang="kk">OSTree бағдарламалық қамтама жаңартулары</comment>
- <comment xml:lang="ko">OSTree 소프트웨어 업데이트</comment>
- <comment xml:lang="pl">Aktualizacje oprogramowania OSTree</comment>
- <comment xml:lang="pt-BR">Atualizações de software OSTree</comment>
- <comment xml:lang="sv">OSTree programvaruuppdateringar</comment>
- <comment xml:lang="tr">OSTree yazılım güncellemeleri</comment>
+ <comment xml:lang="zh_TW">OSTree 軟體更新</comment>
+ <comment xml:lang="zh_CN">OSTree 软件更新</comment>
<comment xml:lang="uk">оновлення програмного забезпечення OSTree</comment>
- <comment xml:lang="zh-CN">OSTree 软件更新</comment>
- <comment xml:lang="zh-TW">OSTree 軟體更新</comment>
+ <comment xml:lang="tr">OSTree yazılım güncellemeleri</comment>
+ <comment xml:lang="sv">OSTree programvaruuppdateringar</comment>
+ <comment xml:lang="sq">përditësime software-i OSTree</comment>
+ <comment xml:lang="sl">Posodobitve programja OSTree</comment>
+ <comment xml:lang="si">OSTree මෘදුකාංග යාවත්කාලීන</comment>
+ <comment xml:lang="ru">Обновления программного обеспечения OSTree</comment>
+ <comment xml:lang="pt_BR">Atualizações de software OSTree</comment>
+ <comment xml:lang="pl">Aktualizacje oprogramowania OSTree</comment>
+ <comment xml:lang="nl">OSTree-software-updates</comment>
+ <comment xml:lang="ko">OSTree 소프트웨어 업데이트</comment>
+ <comment xml:lang="kk">OSTree бағдарламалық қамтама жаңартулары</comment>
+ <comment xml:lang="ja">OSTree ソフトウェアアップデート</comment>
+ <comment xml:lang="it">Aggiornamenti software OSTree</comment>
+ <comment xml:lang="is">OSTree hugbúnaðaruppfærslur</comment>
+ <comment xml:lang="id">Pemutakhiran perangkat lunak OSTree</comment>
+ <comment xml:lang="hu">OSTree szoftverfrissítések</comment>
+ <comment xml:lang="hr">OSTree nadopune softvera</comment>
+ <comment xml:lang="he">עדכוני תכנה של OSTree</comment>
+ <comment xml:lang="fr">mises à jour logicielles OSTree</comment>
+ <comment xml:lang="fi">OSTree-ohjelmistopäivitykset</comment>
+ <comment xml:lang="eu">OSTree software eguneraketak</comment>
+ <comment xml:lang="es">actualizaciones de programas de OSTree</comment>
+ <comment xml:lang="en_GB">OSTree software updates</comment>
+ <comment xml:lang="de">OSTree-Softwareaktualisierungen</comment>
+ <comment xml:lang="da">OSTree-softwareopdateringer</comment>
+ <comment xml:lang="ca">actualitzacions de programari OSTree</comment>
+ <comment xml:lang="bg">Обновление — OSTree</comment>
+ <comment xml:lang="be">абнаўленні ПЗ OSTree</comment>
+ <comment xml:lang="ar">تحديثات برامج OSTree</comment>
<treemagic>
<treematch path=".ostree" type="directory" non-empty="true" match-case="true"/>
<treematch path="ostree/repo" type="directory" non-empty="true" match-case="true"/>
<treematch path="var/lib/flatpak/repo" type="directory" non-empty="true" match-case="true"/>
</treemagic>
</mime-type>
-
<mime-type type="x-content/software">
<!-- http://standards.freedesktop.org/autostart-spec/autostart-spec-latest.html
http://bugzilla.gnome.org/show_bug.cgi?id=509823#c3 -->
- <comment>software</comment>
- <comment xml:lang="af">sagteware</comment>
- <comment xml:lang="ar">برنامج</comment>
- <comment xml:lang="be-Latn">prahrama</comment>
- <comment xml:lang="bg">Софтуер</comment>
- <comment xml:lang="ca">programari</comment>
- <comment xml:lang="cs">software</comment>
- <comment xml:lang="da">software</comment>
- <comment xml:lang="de">Software</comment>
- <comment xml:lang="el">Λογισμικό</comment>
- <comment xml:lang="en-GB">software</comment>
- <comment xml:lang="es">software</comment>
- <comment xml:lang="eu">softwarea</comment>
- <comment xml:lang="fi">ohjelmisto</comment>
- <comment xml:lang="fo">ritbúnaður</comment>
- <comment xml:lang="fr">logiciel</comment>
- <comment xml:lang="fur">software</comment>
- <comment xml:lang="ga">bogearraí</comment>
- <comment xml:lang="gl">software</comment>
- <comment xml:lang="he">תכנה</comment>
- <comment xml:lang="hr">Softver</comment>
- <comment xml:lang="hu">szoftver</comment>
- <comment xml:lang="ia">Software</comment>
- <comment xml:lang="id">peranti lunak</comment>
- <comment xml:lang="it">Software</comment>
- <comment xml:lang="ja">ソフトウェア</comment>
- <comment xml:lang="ka">პროგრამული უზრუნველყოფა</comment>
- <comment xml:lang="kk">бағдарламалық қамтама</comment>
- <comment xml:lang="ko">소프트웨어</comment>
- <comment xml:lang="lt">programinė įranga</comment>
- <comment xml:lang="lv">programmatūra</comment>
- <comment xml:lang="nl">software</comment>
- <comment xml:lang="nn">programvare</comment>
- <comment xml:lang="oc">logicial</comment>
- <comment xml:lang="pl">Oprogramowanie</comment>
- <comment xml:lang="pt">programa</comment>
- <comment xml:lang="pt-BR">Aplicativo</comment>
- <comment xml:lang="ro">software</comment>
- <comment xml:lang="ru">Программное обеспечение</comment>
- <comment xml:lang="sk">Softvér</comment>
- <comment xml:lang="sl">programska oprema</comment>
- <comment xml:lang="sq">Software</comment>
- <comment xml:lang="sr">софтвер</comment>
- <comment xml:lang="sv">programvara</comment>
- <comment xml:lang="tr">yazılım</comment>
+ <comment>Software</comment>
<comment xml:lang="uk">програмне забезпечення</comment>
- <comment xml:lang="vi">phần mềm</comment>
- <comment xml:lang="zh-CN">软件</comment>
- <comment xml:lang="zh-TW">軟體</comment>
+ <comment xml:lang="sv">Programvara</comment>
+ <comment xml:lang="ru">Программное обеспечение</comment>
+ <comment xml:lang="pt_BR">Software</comment>
+ <comment xml:lang="pl">Oprogramowanie</comment>
+ <comment xml:lang="ja">ソフトウェア</comment>
+ <comment xml:lang="it">Software</comment>
+ <comment xml:lang="gl">Software</comment>
+ <comment xml:lang="eu">Softwarea</comment>
+ <comment xml:lang="es">sóftwer</comment>
+ <comment xml:lang="de">Software</comment>
+ <comment xml:lang="be">праграмнае забеспячэнне</comment>
</mime-type>
-
<mime-type type="x-content/unix-software">
<!-- http://standards.freedesktop.org/autostart-spec/autostart-spec-latest.html
http://bugzilla.gnome.org/show_bug.cgi?id=509823#c3 -->
<comment>UNIX software</comment>
- <comment xml:lang="af">UNIX-sagteware</comment>
- <comment xml:lang="ar">برنامج يونكس</comment>
- <comment xml:lang="bg">Софтуер — UNIX</comment>
- <comment xml:lang="ca">programari d'UNIX</comment>
- <comment xml:lang="cs">software systému UNIX</comment>
- <comment xml:lang="da">UNIX-programmer</comment>
- <comment xml:lang="de">UNIX-Software</comment>
- <comment xml:lang="el">Λογισμικό UNIX</comment>
- <comment xml:lang="en-GB">UNIX software</comment>
- <comment xml:lang="es">software de UNIX</comment>
- <comment xml:lang="eu">UNIXeko softwarea</comment>
- <comment xml:lang="fi">UNIX-ohjelmisto</comment>
- <comment xml:lang="fo">UNIX ritbúnaður</comment>
- <comment xml:lang="fr">logiciel UNIX</comment>
- <comment xml:lang="fur">software UNIX</comment>
- <comment xml:lang="ga">bogearraí UNIX</comment>
- <comment xml:lang="gl">Software de UNIX</comment>
- <comment xml:lang="he">תכנה ל־UNIX</comment>
- <comment xml:lang="hr">UNIX softver</comment>
- <comment xml:lang="hu">UNIX-szoftver</comment>
- <comment xml:lang="ia">Software pro UNIX</comment>
- <comment xml:lang="id">Peranti lunak UNIX</comment>
- <comment xml:lang="it">Software UNIX</comment>
- <comment xml:lang="ja">UNIX ソフトウェア</comment>
- <comment xml:lang="kk">UNIX бағдарламасы</comment>
- <comment xml:lang="ko">UNIX 소프트웨어</comment>
- <comment xml:lang="lt">UNIX programinė įranga</comment>
- <comment xml:lang="lv">UNIX programmatūra</comment>
- <comment xml:lang="nl">UNIX software</comment>
- <comment xml:lang="oc">logicial UNIX</comment>
- <comment xml:lang="pl">Oprogramowanie systemu UNIX</comment>
- <comment xml:lang="pt">programa UNIX</comment>
- <comment xml:lang="pt-BR">Aplicativo UNIX</comment>
- <comment xml:lang="ro">Software UNIX</comment>
- <comment xml:lang="ru">Программа UNIX</comment>
- <comment xml:lang="sk">Softvér UNIX</comment>
- <comment xml:lang="sl">Programska datoteka UNIX</comment>
- <comment xml:lang="sr">ЈУНИКС-ов софтвер</comment>
- <comment xml:lang="sv">UNIX-programvara</comment>
- <comment xml:lang="tr">UNIX yazılımı</comment>
+ <comment xml:lang="zh_TW">UNIX 軟體</comment>
+ <comment xml:lang="zh_CN">UNIX 软件</comment>
<comment xml:lang="uk">програмне забезпечення UNIX</comment>
- <comment xml:lang="zh-CN">UNIX 软件</comment>
- <comment xml:lang="zh-TW">UNIX 軟體</comment>
+ <comment xml:lang="tr">UNIX yazılımı</comment>
+ <comment xml:lang="sv">UNIX-programvara</comment>
+ <comment xml:lang="sr">ЈУНИКС-ов софтвер</comment>
+ <comment xml:lang="sq">software UNIX</comment>
+ <comment xml:lang="sl">Programska datoteka UNIX</comment>
+ <comment xml:lang="si">UNIX මෘදුකාංගය</comment>
+ <comment xml:lang="sk">Softvér UNIX</comment>
+ <comment xml:lang="ru">Программа UNIX</comment>
+ <comment xml:lang="ro">Software UNIX</comment>
+ <comment xml:lang="pt_BR">Aplicativo UNIX</comment>
+ <comment xml:lang="pt">programa UNIX</comment>
+ <comment xml:lang="pl">Oprogramowanie systemu UNIX</comment>
+ <comment xml:lang="oc">logicial UNIX</comment>
+ <comment xml:lang="nl">UNIX-software</comment>
+ <comment xml:lang="lv">UNIX programmatūra</comment>
+ <comment xml:lang="lt">UNIX programinė įranga</comment>
+ <comment xml:lang="ko">UNIX 소프트웨어</comment>
+ <comment xml:lang="kk">UNIX бағдарламасы</comment>
+ <comment xml:lang="ja">UNIX ソフトウェア</comment>
+ <comment xml:lang="it">Software UNIX</comment>
+ <comment xml:lang="is">UNIX hugbúnaður</comment>
+ <comment xml:lang="id">Peranti lunak UNIX</comment>
+ <comment xml:lang="ia">Software pro UNIX</comment>
+ <comment xml:lang="hu">UNIX-szoftver</comment>
+ <comment xml:lang="hr">UNIX softver</comment>
+ <comment xml:lang="he">תכנה ל־UNIX</comment>
+ <comment xml:lang="gl">Software de UNIX</comment>
+ <comment xml:lang="ga">bogearraí UNIX</comment>
+ <comment xml:lang="fur">software UNIX</comment>
+ <comment xml:lang="fr">logiciel UNIX</comment>
+ <comment xml:lang="fo">UNIX ritbúnaður</comment>
+ <comment xml:lang="fi">UNIX-ohjelmisto</comment>
+ <comment xml:lang="eu">UNIXeko softwarea</comment>
+ <comment xml:lang="es">software de UNIX</comment>
+ <comment xml:lang="en_GB">UNIX software</comment>
+ <comment xml:lang="el">Λογισμικό UNIX</comment>
+ <comment xml:lang="de">UNIX-Software</comment>
+ <comment xml:lang="da">UNIX-programmer</comment>
+ <comment xml:lang="cs">software systému UNIX</comment>
+ <comment xml:lang="ca">programari d'UNIX</comment>
+ <comment xml:lang="bg">Софтуер — UNIX</comment>
+ <comment xml:lang="be">ПЗ UNIX</comment>
+ <comment xml:lang="ar">برنامج يونكس</comment>
+ <comment xml:lang="af">UNIX-sagteware</comment>
<sub-class-of type="x-content/software"/>
<treemagic>
<treematch path=".autorun" type="file" match-case="true"/>
@@ -42213,145 +43148,161 @@ command to generate the output files.
<treematch path="autorun.sh" type="file" match-case="true"/>
</treemagic>
</mime-type>
-
<mime-type type="x-content/win32-software">
<!-- http://standards.freedesktop.org/autostart-spec/autostart-spec-latest.html
http://bugzilla.gnome.org/show_bug.cgi?id=509823#c3 -->
<comment>Windows software</comment>
- <comment xml:lang="af">Windows-sagteware</comment>
- <comment xml:lang="ar">برنامج ويندوز</comment>
- <comment xml:lang="bg">Софтуер — Windows</comment>
- <comment xml:lang="ca">programari de Windows</comment>
- <comment xml:lang="cs">software systému Windows</comment>
- <comment xml:lang="da">Windowsprogram</comment>
- <comment xml:lang="de">Windows-Software</comment>
- <comment xml:lang="el">Λογισμικό Windows</comment>
- <comment xml:lang="en-GB">Windows software</comment>
- <comment xml:lang="es">software de Windows</comment>
- <comment xml:lang="eu">Windows-eko softwarea</comment>
- <comment xml:lang="fi">Windows-ohjelmisto</comment>
- <comment xml:lang="fo">Windows ritbúnaður</comment>
- <comment xml:lang="fr">logiciel Windows</comment>
- <comment xml:lang="fur">software Windows</comment>
- <comment xml:lang="ga">bogearraí Windows</comment>
- <comment xml:lang="gl">Software de Windows</comment>
- <comment xml:lang="he">תכנה ל־Windows</comment>
- <comment xml:lang="hr">Windows softver</comment>
- <comment xml:lang="hu">Windows-szoftver</comment>
- <comment xml:lang="ia">Software Windows</comment>
- <comment xml:lang="id">Piranti lunak Windows</comment>
- <comment xml:lang="it">Software Windows</comment>
- <comment xml:lang="ja">Windows ソフトウェア</comment>
- <comment xml:lang="kk">Windows бағдарламасы</comment>
- <comment xml:lang="ko">Windows 소프트웨어</comment>
- <comment xml:lang="lt">Windows programinė įranga</comment>
- <comment xml:lang="lv">Windows programmatūra</comment>
- <comment xml:lang="nl">Windows software</comment>
- <comment xml:lang="oc">logicial Windows</comment>
- <comment xml:lang="pl">Oprogramowanie systemu Windows</comment>
- <comment xml:lang="pt">programa Windows</comment>
- <comment xml:lang="pt-BR">Programa do Windows</comment>
- <comment xml:lang="ro">Software Windows</comment>
- <comment xml:lang="ru">Программа Windows</comment>
- <comment xml:lang="sk">Softvér Windows</comment>
- <comment xml:lang="sl">Programska oprema za okolje Windows</comment>
- <comment xml:lang="sr">Виндоузов софтвер</comment>
- <comment xml:lang="sv">Windows-program</comment>
- <comment xml:lang="tr">Windows yazılımı</comment>
+ <comment xml:lang="zh_TW">Windows 軟體</comment>
+ <comment xml:lang="zh_CN">Windows 软件</comment>
<comment xml:lang="uk">програмне забезпечення Windows</comment>
- <comment xml:lang="zh-CN">Windows 软件</comment>
- <comment xml:lang="zh-TW">Windows 軟體</comment>
+ <comment xml:lang="tr">Windows yazılımı</comment>
+ <comment xml:lang="sv">Windows-program</comment>
+ <comment xml:lang="sr">Виндоузов софтвер</comment>
+ <comment xml:lang="sq">software Windows</comment>
+ <comment xml:lang="sl">Programska oprema za okolje Windows</comment>
+ <comment xml:lang="si">වින්ඩෝස් මෘදුකාංග</comment>
+ <comment xml:lang="sk">Softvér Windows</comment>
+ <comment xml:lang="ru">Программа Windows</comment>
+ <comment xml:lang="ro">Software Windows</comment>
+ <comment xml:lang="pt_BR">Programa do Windows</comment>
+ <comment xml:lang="pt">programa Windows</comment>
+ <comment xml:lang="pl">Oprogramowanie systemu Windows</comment>
+ <comment xml:lang="oc">logicial Windows</comment>
+ <comment xml:lang="nl">Windows-software</comment>
+ <comment xml:lang="lv">Windows programmatūra</comment>
+ <comment xml:lang="lt">Windows programinė įranga</comment>
+ <comment xml:lang="ko">Windows 소프트웨어</comment>
+ <comment xml:lang="kk">Windows бағдарламасы</comment>
+ <comment xml:lang="ka">Windows-ის პროგრამა</comment>
+ <comment xml:lang="ja">Windows ソフトウェア</comment>
+ <comment xml:lang="it">Software Windows</comment>
+ <comment xml:lang="is">Windows hugbúnaður</comment>
+ <comment xml:lang="id">Piranti lunak Windows</comment>
+ <comment xml:lang="ia">Software Windows</comment>
+ <comment xml:lang="hu">Windows-szoftver</comment>
+ <comment xml:lang="hr">Windows softver</comment>
+ <comment xml:lang="he">תכנה ל־Windows</comment>
+ <comment xml:lang="gl">Software de Windows</comment>
+ <comment xml:lang="ga">bogearraí Windows</comment>
+ <comment xml:lang="fur">software Windows</comment>
+ <comment xml:lang="fr">logiciel Windows</comment>
+ <comment xml:lang="fo">Windows ritbúnaður</comment>
+ <comment xml:lang="fi">Windows-ohjelmisto</comment>
+ <comment xml:lang="eu">Windows-eko softwarea</comment>
+ <comment xml:lang="es">software de Windows</comment>
+ <comment xml:lang="en_GB">Windows software</comment>
+ <comment xml:lang="el">Λογισμικό Windows</comment>
+ <comment xml:lang="de">Windows-Software</comment>
+ <comment xml:lang="da">Windowsprogram</comment>
+ <comment xml:lang="cs">software systému Windows</comment>
+ <comment xml:lang="ca">programari de Windows</comment>
+ <comment xml:lang="bg">Софтуер — Windows</comment>
+ <comment xml:lang="be">ПЗ Windows</comment>
+ <comment xml:lang="ar">برنامج ويندوز</comment>
+ <comment xml:lang="af">Windows-sagteware</comment>
<sub-class-of type="x-content/software"/>
<treemagic>
<treematch path="autorun.exe" type="file" executable="true"/>
<treematch path="autorun.inf" type="file"/>
</treemagic>
</mime-type>
-
<mime-type type="application/trig">
<comment>TriG RDF document</comment>
- <comment xml:lang="af">TriG RDF-dokument</comment>
- <comment xml:lang="ast">Documentu RDF TriG</comment>
- <comment xml:lang="bg">Документ — TriG RDF</comment>
- <comment xml:lang="ca">document TriG RDF</comment>
- <comment xml:lang="cs">dokument Trig RDF</comment>
- <comment xml:lang="da">TriG RDF-dokument</comment>
- <comment xml:lang="de">TriG-RDF-Dokument</comment>
- <comment xml:lang="el">Έγγραφο TriG RDF</comment>
- <comment xml:lang="en-GB">TriG RDF document</comment>
- <comment xml:lang="es">documento RDF de TriG</comment>
- <comment xml:lang="eu">TriG RDF dokumentua</comment>
- <comment xml:lang="fi">TriG RDF -asiakirja</comment>
- <comment xml:lang="fr">document RDF TriG</comment>
- <comment xml:lang="fur">document TriG RDF</comment>
- <comment xml:lang="ga">cáipéis RDF TriG</comment>
- <comment xml:lang="gl">Documento RDF TriG</comment>
- <comment xml:lang="he">מסמך RDF של TriG</comment>
- <comment xml:lang="hr">TriG RDF dokument</comment>
- <comment xml:lang="hu">TriG RDF dokumentum</comment>
- <comment xml:lang="ia">Documento TriG RDF</comment>
- <comment xml:lang="id">Dokumen TriG RDF</comment>
- <comment xml:lang="it">Documento TriG RDF</comment>
- <comment xml:lang="kk">TriG RDF құжаты</comment>
- <comment xml:lang="ko">TriG RDF 문서</comment>
- <comment xml:lang="oc">document RDF TriG</comment>
- <comment xml:lang="pl">Dokument RDF TriG</comment>
- <comment xml:lang="pt">documento TriG RDF</comment>
- <comment xml:lang="pt-BR">Documento RDF do TriG</comment>
- <comment xml:lang="ru">Документ TriG RDF</comment>
- <comment xml:lang="sk">RDF dokument TriG</comment>
- <comment xml:lang="sl">Dokument TriG RDF</comment>
- <comment xml:lang="sr">ТриГ РДФ документ</comment>
- <comment xml:lang="sv">TriG RDF-dokument</comment>
- <comment xml:lang="tr">TriG RDF belgesi</comment>
+ <comment xml:lang="zh_TW">TriG RDF 文件</comment>
+ <comment xml:lang="zh_CN">TriG RDF 文档</comment>
<comment xml:lang="uk">документ RDF TriG</comment>
- <comment xml:lang="zh-CN">TriG RDF 文档</comment>
- <comment xml:lang="zh-TW">TriG RDF 文件</comment>
+ <comment xml:lang="tr">TriG RDF belgesi</comment>
+ <comment xml:lang="sv">TriG RDF-dokument</comment>
+ <comment xml:lang="sr">ТриГ РДФ документ</comment>
+ <comment xml:lang="sq">dokument TriG RDF</comment>
+ <comment xml:lang="sl">Dokument TriG RDF</comment>
+ <comment xml:lang="si">TriG RDF ලේඛනය</comment>
+ <comment xml:lang="sk">RDF dokument TriG</comment>
+ <comment xml:lang="ru">Документ TriG RDF</comment>
+ <comment xml:lang="pt_BR">Documento RDF do TriG</comment>
+ <comment xml:lang="pt">documento TriG RDF</comment>
+ <comment xml:lang="pl">Dokument RDF TriG</comment>
+ <comment xml:lang="oc">document RDF TriG</comment>
+ <comment xml:lang="nl">TriG RDF-document</comment>
+ <comment xml:lang="ko">TriG RDF 문서</comment>
+ <comment xml:lang="kk">TriG RDF құжаты</comment>
+ <comment xml:lang="ja">TriG RDF ドキュメント</comment>
+ <comment xml:lang="it">Documento TriG RDF</comment>
+ <comment xml:lang="is">TriG RDF skjal</comment>
+ <comment xml:lang="id">Dokumen TriG RDF</comment>
+ <comment xml:lang="ia">Documento TriG RDF</comment>
+ <comment xml:lang="hu">TriG RDF dokumentum</comment>
+ <comment xml:lang="hr">TriG RDF dokument</comment>
+ <comment xml:lang="he">מסמך RDF של TriG</comment>
+ <comment xml:lang="gl">Documento RDF TriG</comment>
+ <comment xml:lang="ga">cáipéis RDF TriG</comment>
+ <comment xml:lang="fur">document TriG RDF</comment>
+ <comment xml:lang="fr">document RDF TriG</comment>
+ <comment xml:lang="fi">TriG RDF -asiakirja</comment>
+ <comment xml:lang="eu">TriG RDF dokumentua</comment>
+ <comment xml:lang="es">documento RDF de TriG</comment>
+ <comment xml:lang="en_GB">TriG RDF document</comment>
+ <comment xml:lang="el">Έγγραφο TriG RDF</comment>
+ <comment xml:lang="de">TriG-RDF-Dokument</comment>
+ <comment xml:lang="da">TriG RDF-dokument</comment>
+ <comment xml:lang="cs">dokument Trig RDF</comment>
+ <comment xml:lang="ca">document TriG RDF</comment>
+ <comment xml:lang="bg">Документ — TriG RDF</comment>
+ <comment xml:lang="be">дакумент TriG RDF</comment>
+ <comment xml:lang="ast">Documentu RDF TriG</comment>
+ <comment xml:lang="ar">وثيقة TriG RDF</comment>
+ <comment xml:lang="af">TriG RDF-dokument</comment>
<acronym>TriG</acronym>
<expanded-acronym>TriG RDF Graph Triple Language</expanded-acronym>
<sub-class-of type="text/plain"/>
<glob pattern="*.trig"/>
<alias type="application/x-trig"/>
</mime-type>
-
<mime-type type="application/vnd.apple.keynote">
<comment>Apple Keynote 5 presentation</comment>
- <comment xml:lang="af">Apple Keynote 5-voorlegging</comment>
- <comment xml:lang="bg">Презентация — Apple Keynote 5</comment>
- <comment xml:lang="ca">presentació d'Apple Keynote 5</comment>
- <comment xml:lang="cs">prezentace Apple Keynote 5</comment>
- <comment xml:lang="da">Apple Keynote 5-præsentation</comment>
- <comment xml:lang="de">Apple-Keynote-5-Präsentation</comment>
- <comment xml:lang="el">Παρουσίαση Apple Keynote 5</comment>
- <comment xml:lang="en-GB">Apple Keynote 5 presentation</comment>
- <comment xml:lang="es">presentación de Apple Keynote 5</comment>
- <comment xml:lang="eu">Apple Keynote 5 aurkezpena</comment>
- <comment xml:lang="fi">Apple Keynote 5 -esitys</comment>
- <comment xml:lang="fr">présentation Apple Keynote 5</comment>
- <comment xml:lang="fur">presentazion Apple Keynote 5</comment>
- <comment xml:lang="ga">láithreoireacht Apple Keynote 5</comment>
- <comment xml:lang="gl">Presentación de Apple Keynote 5</comment>
- <comment xml:lang="he">מצגת Apple Keynote 5</comment>
- <comment xml:lang="hr">Apple Keynote 5 prezentacija</comment>
- <comment xml:lang="hu">Apple Keynote 5 prezentáció</comment>
- <comment xml:lang="ia">Presentation Apple Keynote 5</comment>
- <comment xml:lang="id">Presentasi Apple Keynote 5</comment>
- <comment xml:lang="it">Presentazione Apple Keynote 5</comment>
- <comment xml:lang="kk">Apple Keynote 5 презентациясы</comment>
- <comment xml:lang="ko">Apple 키노트 5 프레젠테이션</comment>
- <comment xml:lang="oc">presentacion Apple Keynote 5</comment>
- <comment xml:lang="pl">Prezentacja Apple Keynote 5</comment>
- <comment xml:lang="pt">apresentação Apple Keynote 5</comment>
- <comment xml:lang="pt-BR">Apresentação do Apple Keynote 5</comment>
- <comment xml:lang="ru">Презентация Apple Keynote 5</comment>
- <comment xml:lang="sk">Prezentácia Apple Keynote 5</comment>
- <comment xml:lang="sl">Predstavitev Apple Keynote 5</comment>
- <comment xml:lang="sr">презентација Епл Кинота 5</comment>
- <comment xml:lang="sv">Apple Keynote 5-presentation</comment>
- <comment xml:lang="tr">Apple Keynote 5 sunumu</comment>
+ <comment xml:lang="zh_TW">Apple Keynote 5 簡報</comment>
+ <comment xml:lang="zh_CN">Apple Keynote 5 演示文稿</comment>
<comment xml:lang="uk">презентація Apple Keynote 5</comment>
- <comment xml:lang="zh-CN">Apple Keynote 5 演示文稿</comment>
- <comment xml:lang="zh-TW">Apple Keynote 5 簡報</comment>
+ <comment xml:lang="tr">Apple Keynote 5 sunumu</comment>
+ <comment xml:lang="sv">Apple Keynote 5-presentation</comment>
+ <comment xml:lang="sr">презентација Епл Кинота 5</comment>
+ <comment xml:lang="sq">paraqitje Apple Keynote 5</comment>
+ <comment xml:lang="sl">Predstavitev Apple Keynote 5</comment>
+ <comment xml:lang="si">Apple Keynote 5 ඉදිරිපත් කිරීම</comment>
+ <comment xml:lang="sk">Prezentácia Apple Keynote 5</comment>
+ <comment xml:lang="ru">Презентация Apple Keynote 5</comment>
+ <comment xml:lang="pt_BR">Apresentação do Apple Keynote 5</comment>
+ <comment xml:lang="pt">apresentação Apple Keynote 5</comment>
+ <comment xml:lang="pl">Prezentacja Apple Keynote 5</comment>
+ <comment xml:lang="oc">presentacion Apple Keynote 5</comment>
+ <comment xml:lang="nl">Apple Keynote 5-presentatie</comment>
+ <comment xml:lang="ko">Apple 키노트 5 프레젠테이션</comment>
+ <comment xml:lang="kk">Apple Keynote 5 презентациясы</comment>
+ <comment xml:lang="ja">Apple Keynote 5 プレゼンテーション</comment>
+ <comment xml:lang="it">Presentazione Apple Keynote 5</comment>
+ <comment xml:lang="is">Apple Keynote 5 glærukynning</comment>
+ <comment xml:lang="id">Presentasi Apple Keynote 5</comment>
+ <comment xml:lang="ia">Presentation Apple Keynote 5</comment>
+ <comment xml:lang="hu">Apple Keynote 5 prezentáció</comment>
+ <comment xml:lang="hr">Apple Keynote 5 prezentacija</comment>
+ <comment xml:lang="he">מצגת Apple Keynote 5</comment>
+ <comment xml:lang="gl">Presentación de Apple Keynote 5</comment>
+ <comment xml:lang="ga">láithreoireacht Apple Keynote 5</comment>
+ <comment xml:lang="fur">presentazion Apple Keynote 5</comment>
+ <comment xml:lang="fr">présentation Apple Keynote 5</comment>
+ <comment xml:lang="fi">Apple Keynote 5 -esitys</comment>
+ <comment xml:lang="eu">Apple Keynote 5 aurkezpena</comment>
+ <comment xml:lang="es">presentación de Apple Keynote 5</comment>
+ <comment xml:lang="en_GB">Apple Keynote 5 presentation</comment>
+ <comment xml:lang="el">Παρουσίαση Apple Keynote 5</comment>
+ <comment xml:lang="de">Apple-Keynote-5-Präsentation</comment>
+ <comment xml:lang="da">Apple Keynote 5-præsentation</comment>
+ <comment xml:lang="cs">prezentace Apple Keynote 5</comment>
+ <comment xml:lang="ca">presentació d'Apple Keynote 5</comment>
+ <comment xml:lang="bg">Презентация — Apple Keynote 5</comment>
+ <comment xml:lang="be">прэзентацыя Apple Keynote 5</comment>
+ <comment xml:lang="ar">عرض أبل كي نوت ٥</comment>
+ <comment xml:lang="af">Apple Keynote 5-voorlegging</comment>
<sub-class-of type="application/zip"/>
<generic-icon name="x-office-presentation"/>
<magic priority="70">
@@ -42362,33 +43313,138 @@ command to generate the output files.
<glob pattern="*.key" weight="80"/>
<alias type="application/x-iwork-keynote-sffkey"/>
</mime-type>
-
+ <mime-type type="application/vnd.apple.numbers">
+ <comment>Apple Numbers spreadsheet</comment>
+ <comment xml:lang="zh_TW">Apple Numbers 試算表</comment>
+ <comment xml:lang="uk">електронні таблиці Apple Numbers</comment>
+ <comment xml:lang="tr">Apple Numbers hesap çizelgesi</comment>
+ <comment xml:lang="sv">Apple Numbers-kalkylblad</comment>
+ <comment xml:lang="sl">Razpredelnica Apple Numbers</comment>
+ <comment xml:lang="si">ඇපල් අංක පැතුරුම්පත</comment>
+ <comment xml:lang="ru">Электронная таблица Apple Numbers</comment>
+ <comment xml:lang="pl">Arkusz Apple Numbers</comment>
+ <comment xml:lang="nl">Apple Numbers-werkblad</comment>
+ <comment xml:lang="ko">애플 넘버스 스프레드시트</comment>
+ <comment xml:lang="kk">Apple Numbers электрондық кестесі</comment>
+ <comment xml:lang="ja">Apple Numbers スプレッドシート</comment>
+ <comment xml:lang="it">Foglio di calcolo Apple Numbers</comment>
+ <comment xml:lang="hr">Apple Numbers proračunska tablica</comment>
+ <comment xml:lang="fi">Apple Numbers-taulukko</comment>
+ <comment xml:lang="es">hoja de cálculo Apple Numbers</comment>
+ <comment xml:lang="en_GB">Apple Numbers spreadsheet</comment>
+ <comment xml:lang="de">Apple-Numbers-Tabelle</comment>
+ <comment xml:lang="be">электронная табліца Apple Numbers</comment>
+ <comment xml:lang="ar">جدول أرقام أبل</comment>
+ <sub-class-of type="application/zip"/>
+ <generic-icon name="x-office-spreadsheet"/>
+ <magic priority="65">
+ <match type="string" value="PK\003\004" offset="0">
+ <match type="string" value="index.xml" offset="30"/>
+ <match type="string" value="Index/Document.iwa" offset="30"/>
+ </match>
+ </magic>
+ <glob pattern="*.numbers"/>
+ <alias type="application/x-iwork-numbers-sffnumbers"/>
+ </mime-type>
+ <mime-type type="application/vnd.apple.pages">
+ <comment>Apple Pages document</comment>
+ <comment xml:lang="zh_TW">Apple Pages 文件</comment>
+ <comment xml:lang="uk">документ Apple Pages</comment>
+ <comment xml:lang="tr">Apple Pages belgesi</comment>
+ <comment xml:lang="sv">Apple Pages-dokument</comment>
+ <comment xml:lang="sl">Dokument Apple Pages</comment>
+ <comment xml:lang="si">Apple පිටු ලේඛනය</comment>
+ <comment xml:lang="ru">Документ Apple Pages</comment>
+ <comment xml:lang="pl">Dokument Apple Pages</comment>
+ <comment xml:lang="nl">Apple Pages-document</comment>
+ <comment xml:lang="ko">애플 페이지 문서</comment>
+ <comment xml:lang="kk">Apple Pages құжаты</comment>
+ <comment xml:lang="ja">Apple Pages ドキュメント</comment>
+ <comment xml:lang="it">Documento Apple Pages</comment>
+ <comment xml:lang="hr">Apple Pages dokument</comment>
+ <comment xml:lang="fi">Apple Pages-asiakirja</comment>
+ <comment xml:lang="eu">Apple Pages dokumentua</comment>
+ <comment xml:lang="es">documento de Apple Pages</comment>
+ <comment xml:lang="en_GB">Apple Pages document</comment>
+ <comment xml:lang="de">Apple-Pages-Dokument</comment>
+ <comment xml:lang="be">дакумент Apple Pages</comment>
+ <comment xml:lang="ar">مستند صفحات أبل</comment>
+ <sub-class-of type="application/zip"/>
+ <generic-icon name="x-office-document"/>
+ <magic priority="70">
+ <match type="string" value="PK\003\004" offset="0">
+ <match type="string" value="index.xml" offset="30"/>
+ <match type="string" value="Index/Document.iwa" offset="30"/>
+ </match>
+ </magic>
+ <glob pattern="*.pages"/>
+ <alias type="application/x-iwork-pages-sffpages"/>
+ </mime-type>
+ <mime-type type="application/vnd.apple.pkpass">
+ <comment>Apple Wallet pass</comment>
+ <comment xml:lang="uk">пропуск Apple Wallet</comment>
+ <comment xml:lang="tr">Apple Cüzdan geçişi</comment>
+ <comment xml:lang="sv">Apple Wallet-pass</comment>
+ <comment xml:lang="si">Apple Wallet පාස්</comment>
+ <comment xml:lang="ru">Пропуск Apple Wallet</comment>
+ <comment xml:lang="pl">Hasło Apple Wallet</comment>
+ <comment xml:lang="nl">Apple Wallet-pas</comment>
+ <comment xml:lang="ko">애플 지갑 인증</comment>
+ <comment xml:lang="kk">Apple Wallet рұқсатнамасы</comment>
+ <comment xml:lang="ja">Apple ウォレットパス</comment>
+ <comment xml:lang="it">Pass Apple Wallet</comment>
+ <comment xml:lang="hr">Apple Novčanik propusnica</comment>
+ <comment xml:lang="gl">Pase de Apple Wallet</comment>
+ <comment xml:lang="fi">Apple Wallet-kulkulupa</comment>
+ <comment xml:lang="es">monedero Apple Wallet</comment>
+ <comment xml:lang="en_GB">Apple Wallet pass</comment>
+ <comment xml:lang="de">Apple-Wallet-Pass</comment>
+ <comment xml:lang="be">пропуск Apple Wallet</comment>
+ <comment xml:lang="ar">بطاقة محفظة أبل</comment>
+ <sub-class-of type="application/zip"/>
+ <magic priority="65">
+ <match type="string" value="PK\003\004" offset="0">
+ <match type="string" value="pass.json" offset="30"/>
+ </match>
+ </magic>
+ <glob pattern="*.pkpass"/>
+ </mime-type>
<mime-type type="application/x-pagemaker">
<comment>Adobe PageMaker document</comment>
- <comment xml:lang="bg">Документ — Adobe PageMaker</comment>
- <comment xml:lang="ca">document d'Adobe PageMaker</comment>
- <comment xml:lang="da">Adobe PageMaker-dokument</comment>
- <comment xml:lang="de">Adobe-PageMaker-Dokument</comment>
- <comment xml:lang="en-GB">Adobe PageMaker document</comment>
- <comment xml:lang="es">documento de Adobe PageMaker</comment>
- <comment xml:lang="eu">Adobe PageMaker dokumentua</comment>
- <comment xml:lang="fi">Adobe PageMaker -asiakirja</comment>
- <comment xml:lang="fr">document Adobe PageMaker</comment>
- <comment xml:lang="hr">Adobe PageMaker dokument</comment>
- <comment xml:lang="hu">Adobe PageMaker dokumentum</comment>
- <comment xml:lang="id">Dokume Adobe PageMaker</comment>
- <comment xml:lang="it">Documento Adobe PageMaker</comment>
- <comment xml:lang="kk">Adobe PageMaker құжаты</comment>
- <comment xml:lang="ko">어도비 페이지메이커 문서</comment>
- <comment xml:lang="pl">Dokument Adobe PageMaker</comment>
- <comment xml:lang="pt-BR">Documento do Adobe PageMaker</comment>
- <comment xml:lang="ru">Документ Adobe PageMaker</comment>
- <comment xml:lang="sk">Dokument Adobe PageMaker</comment>
- <comment xml:lang="sv">Adobe PageMaker-dokument</comment>
- <comment xml:lang="tr">Adobe PageMaker belgesi</comment>
+ <comment xml:lang="zh_TW">Adobe PageMaker 文件</comment>
+ <comment xml:lang="zh_CN">Adobe PageMaker 文档</comment>
<comment xml:lang="uk">документ Adobe PageMaker</comment>
- <comment xml:lang="zh-CN">Adobe PageMaker 文档</comment>
- <comment xml:lang="zh-TW">Adobe PageMaker 文件</comment>
+ <comment xml:lang="tr">Adobe PageMaker belgesi</comment>
+ <comment xml:lang="sv">Adobe PageMaker-dokument</comment>
+ <comment xml:lang="sq">dokument Adobe PageMaker</comment>
+ <comment xml:lang="sl">Dokument Adobe PageMaker</comment>
+ <comment xml:lang="si">Adobe PageMaker ලේඛනය</comment>
+ <comment xml:lang="sk">Dokument Adobe PageMaker</comment>
+ <comment xml:lang="ru">Документ Adobe PageMaker</comment>
+ <comment xml:lang="pt_BR">Documento do Adobe PageMaker</comment>
+ <comment xml:lang="pl">Dokument Adobe PageMaker</comment>
+ <comment xml:lang="nl">Adobe PageMaker-document</comment>
+ <comment xml:lang="ko">어도비 페이지메이커 문서</comment>
+ <comment xml:lang="kk">Adobe PageMaker құжаты</comment>
+ <comment xml:lang="ja">Adobe PageMaker ドキュメント</comment>
+ <comment xml:lang="it">Documento Adobe PageMaker</comment>
+ <comment xml:lang="is">Adobe PageMaker skjal</comment>
+ <comment xml:lang="id">Dokume Adobe PageMaker</comment>
+ <comment xml:lang="hu">Adobe PageMaker dokumentum</comment>
+ <comment xml:lang="hr">Adobe PageMaker dokument</comment>
+ <comment xml:lang="he">מסמך Adobe PageMaker</comment>
+ <comment xml:lang="gl">Documento de Adobe Pagemaker</comment>
+ <comment xml:lang="fr">document Adobe PageMaker</comment>
+ <comment xml:lang="fi">Adobe PageMaker -asiakirja</comment>
+ <comment xml:lang="eu">Adobe PageMaker dokumentua</comment>
+ <comment xml:lang="es">documento de Adobe PageMaker</comment>
+ <comment xml:lang="en_GB">Adobe PageMaker document</comment>
+ <comment xml:lang="de">Adobe-PageMaker-Dokument</comment>
+ <comment xml:lang="da">Adobe PageMaker-dokument</comment>
+ <comment xml:lang="ca">document d'Adobe PageMaker</comment>
+ <comment xml:lang="bg">Документ — Adobe PageMaker</comment>
+ <comment xml:lang="be">дакумент Adobe PageMaker</comment>
+ <comment xml:lang="ar">مستند أدوبي بيج ميكر</comment>
<sub-class-of type="application/x-ole-storage"/>
<generic-icon name="x-office-document"/>
<glob pattern="*.p65"/>
@@ -42396,118 +43452,141 @@ command to generate the output files.
<glob pattern="*.pm6"/>
<glob pattern="*.pmd"/>
</mime-type>
-
<mime-type type="application/x-doom-wad">
<comment>Doom WAD file</comment>
- <comment xml:lang="bg">Ниво — Doom</comment>
- <comment xml:lang="ca">fitxer WAD de Doom</comment>
- <comment xml:lang="da">Doom WAD-fil</comment>
- <comment xml:lang="de">Doom-WAD-Datei</comment>
- <comment xml:lang="en-GB">Doom WAD file</comment>
- <comment xml:lang="es">archivo WAD de Doom</comment>
- <comment xml:lang="eu">Doom WAD fitxategia</comment>
- <comment xml:lang="fi">Doom WAD -tiedosto</comment>
- <comment xml:lang="fr">fichier Doom WAD</comment>
- <comment xml:lang="hr">Doom WAD datoteka</comment>
- <comment xml:lang="hu">Doom WAD fájl</comment>
- <comment xml:lang="id">Berkas WAD Doom</comment>
- <comment xml:lang="it">File WAD Doom</comment>
- <comment xml:lang="kk">Doom WAD файлы</comment>
- <comment xml:lang="ko">둠 WAD 파일</comment>
- <comment xml:lang="pl">Plik WAD gry Doom</comment>
- <comment xml:lang="pt-BR">Arquivo Doom WAD</comment>
- <comment xml:lang="ru">Файл Doom WAD</comment>
- <comment xml:lang="sv">Doom WAD-fil</comment>
- <comment xml:lang="tr">Doom WAD dosyası</comment>
+ <comment xml:lang="zh_TW">Doom WAD 檔</comment>
+ <comment xml:lang="zh_CN">Doom WAD 文件</comment>
<comment xml:lang="uk">файл WAD Doom</comment>
- <comment xml:lang="zh-CN">Doom WAD 文件</comment>
- <comment xml:lang="zh-TW">Doom WAD 檔</comment>
+ <comment xml:lang="tr">Doom WAD dosyası</comment>
+ <comment xml:lang="sv">Doom WAD-fil</comment>
+ <comment xml:lang="sq">kartelë Doom WAD</comment>
+ <comment xml:lang="sl">Datoteka Doom WAD</comment>
+ <comment xml:lang="si">Doom WAD ගොනුව</comment>
+ <comment xml:lang="ru">Файл Doom WAD</comment>
+ <comment xml:lang="pt_BR">Arquivo Doom WAD</comment>
+ <comment xml:lang="pl">Plik WAD gry Doom</comment>
+ <comment xml:lang="nl">Doom WAD-bestand</comment>
+ <comment xml:lang="ko">둠 WAD 파일</comment>
+ <comment xml:lang="kk">Doom WAD файлы</comment>
+ <comment xml:lang="ja">Doom WAD ファイル</comment>
+ <comment xml:lang="it">File WAD Doom</comment>
+ <comment xml:lang="is">Doom WAD skrá</comment>
+ <comment xml:lang="id">Berkas WAD Doom</comment>
+ <comment xml:lang="hu">Doom WAD fájl</comment>
+ <comment xml:lang="hr">Doom WAD datoteka</comment>
+ <comment xml:lang="he">קובץ WAD של Doom</comment>
+ <comment xml:lang="gl">Ficheiro de Doom WAD</comment>
+ <comment xml:lang="fr">fichier Doom WAD</comment>
+ <comment xml:lang="fi">Doom WAD -tiedosto</comment>
+ <comment xml:lang="eu">Doom WAD fitxategia</comment>
+ <comment xml:lang="es">archivo WAD de Doom</comment>
+ <comment xml:lang="en_GB">Doom WAD file</comment>
+ <comment xml:lang="de">Doom-WAD-Datei</comment>
+ <comment xml:lang="da">Doom WAD-fil</comment>
+ <comment xml:lang="ca">fitxer WAD de Doom</comment>
+ <comment xml:lang="bg">Ниво — Doom</comment>
+ <comment xml:lang="be">файл Doom WAD</comment>
+ <comment xml:lang="ar">ملف Doom WAD</comment>
<acronym>WAD</acronym>
<expanded-acronym>Where's All the Data</expanded-acronym>
<generic-icon name="package-x-generic"/>
- <magic priority="50">
+ <magic>
<match type="string" value="IWAD" offset="0"/>
<match type="string" value="PWAD" offset="0"/>
</magic>
<glob pattern="*.wad" weight="80"/>
</mime-type>
-
<mime-type type="application/x-amiga-disk-format">
<comment>Amiga disk image</comment>
- <comment xml:lang="af">Amiga-skyfbeeldlêer</comment>
- <comment xml:lang="bg">Диск — Amiga</comment>
- <comment xml:lang="ca">imatge de disc d'Amiga</comment>
- <comment xml:lang="cs">obraz disku pro Amigu</comment>
- <comment xml:lang="da">Amiga-diskaftryk</comment>
- <comment xml:lang="de">Amiga-Datenträgerabbild</comment>
- <comment xml:lang="el">Εικόνα δίσκου Amiga</comment>
- <comment xml:lang="en-GB">Amiga disk image</comment>
- <comment xml:lang="es">imagen de disco de Amiga</comment>
- <comment xml:lang="eu">Amiga disko irudia</comment>
- <comment xml:lang="fi">Amiga-levytiedosto</comment>
- <comment xml:lang="fr">image disque Amiga</comment>
- <comment xml:lang="fur">imagjin disc Amiga</comment>
- <comment xml:lang="ga">íomhá diosca Amiga</comment>
- <comment xml:lang="he">דמות כונן Amiga</comment>
- <comment xml:lang="hr">Amiga slika diska</comment>
- <comment xml:lang="hu">Amiga lemezkép</comment>
- <comment xml:lang="ia">Imagine de disco Amiga</comment>
- <comment xml:lang="id">Image disk Amiga</comment>
- <comment xml:lang="it">Disco immagine Amiga</comment>
- <comment xml:lang="kk">Amiga диск бейнесі</comment>
- <comment xml:lang="ko">Amiga 디스크 이미지</comment>
- <comment xml:lang="oc">imatge disc Amiga</comment>
- <comment xml:lang="pl">Obraz dysku Amiga</comment>
- <comment xml:lang="pt">imagem de disco Amiga</comment>
- <comment xml:lang="pt-BR">Imagem de disco Amiga</comment>
- <comment xml:lang="ru">Образ диска Amiga</comment>
- <comment xml:lang="sk">Obraz disku Amiga</comment>
- <comment xml:lang="sr">слика диска Амиге</comment>
- <comment xml:lang="sv">Amiga-diskavbild</comment>
- <comment xml:lang="tr">Amiga disk görüntüsü</comment>
+ <comment xml:lang="zh_TW">Amiga 磁碟映像檔</comment>
+ <comment xml:lang="zh_CN">Amiga 磁盘映像</comment>
<comment xml:lang="uk">образ диска Amiga</comment>
- <comment xml:lang="zh-CN">Amiga 磁盘映像</comment>
- <comment xml:lang="zh-TW">Amiga 磁碟映像檔</comment>
- <magic priority="50">
+ <comment xml:lang="tr">Amiga disk görüntüsü</comment>
+ <comment xml:lang="sv">Amiga-diskavbild</comment>
+ <comment xml:lang="sr">слика диска Амиге</comment>
+ <comment xml:lang="sq">pamje disku Amiga</comment>
+ <comment xml:lang="sl">Slika diska Amiga</comment>
+ <comment xml:lang="si">Amiga තැටි රූපය</comment>
+ <comment xml:lang="sk">Obraz disku Amiga</comment>
+ <comment xml:lang="ru">Образ диска Amiga</comment>
+ <comment xml:lang="pt_BR">Imagem de disco Amiga</comment>
+ <comment xml:lang="pt">imagem de disco Amiga</comment>
+ <comment xml:lang="pl">Obraz dysku Amiga</comment>
+ <comment xml:lang="oc">imatge disc Amiga</comment>
+ <comment xml:lang="nl">Amiga-schijfkopiebestand</comment>
+ <comment xml:lang="ko">Amiga 디스크 이미지</comment>
+ <comment xml:lang="kk">Amiga диск бейнесі</comment>
+ <comment xml:lang="ja">Amiga ディスクイメージ</comment>
+ <comment xml:lang="it">Disco immagine Amiga</comment>
+ <comment xml:lang="is">Amiga diskmynd</comment>
+ <comment xml:lang="id">Image disk Amiga</comment>
+ <comment xml:lang="ia">Imagine de disco Amiga</comment>
+ <comment xml:lang="hu">Amiga lemezkép</comment>
+ <comment xml:lang="hr">Amiga slika diska</comment>
+ <comment xml:lang="he">דמות כונן Amiga</comment>
+ <comment xml:lang="gl">Imaxe de disco de Amiga</comment>
+ <comment xml:lang="ga">íomhá diosca Amiga</comment>
+ <comment xml:lang="fur">imagjin disc Amiga</comment>
+ <comment xml:lang="fr">image disque Amiga</comment>
+ <comment xml:lang="fi">Amiga-levytiedosto</comment>
+ <comment xml:lang="eu">Amiga disko irudia</comment>
+ <comment xml:lang="es">imagen de disco de Amiga</comment>
+ <comment xml:lang="en_GB">Amiga disk image</comment>
+ <comment xml:lang="el">Εικόνα δίσκου Amiga</comment>
+ <comment xml:lang="de">Amiga-Datenträgerabbild</comment>
+ <comment xml:lang="da">Amiga-diskaftryk</comment>
+ <comment xml:lang="cs">obraz disku pro Amigu</comment>
+ <comment xml:lang="ca">imatge de disc d'Amiga</comment>
+ <comment xml:lang="bg">Диск — Amiga</comment>
+ <comment xml:lang="be">вобраз дыска Amiga</comment>
+ <comment xml:lang="ar">صورة قرص Amiga</comment>
+ <comment xml:lang="af">Amiga-skyfbeeldlêer</comment>
+ <magic>
<match type="string" value="DOS\x00" offset="0"/>
</magic>
<glob pattern="*.adf"/>
</mime-type>
-
<mime-type type="application/vnd.flatpak">
<comment>Flatpak application bundle</comment>
- <comment xml:lang="af">Flatpak-toepassingsbundel</comment>
- <comment xml:lang="bg">Програмен пакет — Flatpak</comment>
- <comment xml:lang="ca">paquet d'aplicació Flatpak</comment>
- <comment xml:lang="cs">balíček Flatpak s aplikací</comment>
- <comment xml:lang="da">Flatpak-programsamling</comment>
- <comment xml:lang="de">Flatpak-Anwendungspaket</comment>
- <comment xml:lang="en-GB">Flatpak application bundle</comment>
- <comment xml:lang="es">paquete de aplicación Flatpak</comment>
- <comment xml:lang="eu">Flatpak aplikazio bilduma</comment>
- <comment xml:lang="fi">Flatpak-sovelluspaketti</comment>
- <comment xml:lang="fr">lot applicatif Flatpak</comment>
- <comment xml:lang="fur">côl di aplicazions Flatpak</comment>
- <comment xml:lang="ga">burla feidhmchláir Flatpak</comment>
- <comment xml:lang="he">חבילת יישומי Flatpak</comment>
- <comment xml:lang="hr">Flatpak paket aplikacije</comment>
- <comment xml:lang="hu">Flatpak alkalmazáscsomag</comment>
- <comment xml:lang="id">Bundel aplikasi Flatpak</comment>
- <comment xml:lang="it">Bundle applicazione Flatpak</comment>
- <comment xml:lang="kk">Flatpak қолданбалар дестесі</comment>
- <comment xml:lang="ko">Flatpak 프로그램 번들</comment>
- <comment xml:lang="pl">Pakiet programu Flatpak</comment>
- <comment xml:lang="pt-BR">Pacote de aplicativo Flatpak</comment>
- <comment xml:lang="ru">Пакет приложения Flatpak</comment>
- <comment xml:lang="sk">Balík aplikácií Flatpak</comment>
- <comment xml:lang="sr">скуп програма Флатпака</comment>
- <comment xml:lang="sv">Flatpak-programbunt</comment>
- <comment xml:lang="tr">Flatpak uygulama paketi</comment>
+ <comment xml:lang="zh_TW">Flatpak 應用程式套組</comment>
+ <comment xml:lang="zh_CN">Flatpak 应用组合包</comment>
<comment xml:lang="uk">пакунок із програмами Flatpak</comment>
- <comment xml:lang="zh-CN">Flatpak 应用组合包</comment>
- <comment xml:lang="zh-TW">Flatpak 應用程式套組</comment>
+ <comment xml:lang="tr">Flatpak uygulama paketi</comment>
+ <comment xml:lang="sv">Flatpak-programbunt</comment>
+ <comment xml:lang="sr">скуп програма Флатпака</comment>
+ <comment xml:lang="sq">paketë aplikacionesh Flatpak</comment>
+ <comment xml:lang="si">Flatpak යෙදුම් මිටියක්</comment>
+ <comment xml:lang="sk">Balík aplikácií Flatpak</comment>
+ <comment xml:lang="ru">Пакет приложения Flatpak</comment>
+ <comment xml:lang="pt_BR">Pacote de aplicativo Flatpak</comment>
+ <comment xml:lang="pl">Pakiet programu Flatpak</comment>
+ <comment xml:lang="nl">Flatpak-toepassingsbundel</comment>
+ <comment xml:lang="ko">Flatpak 프로그램 번들</comment>
+ <comment xml:lang="kk">Flatpak қолданбалар дестесі</comment>
+ <comment xml:lang="ja">Flatpak アプリケーションバンドル</comment>
+ <comment xml:lang="it">Bundle applicazione Flatpak</comment>
+ <comment xml:lang="is">Flatpak forritavöndull</comment>
+ <comment xml:lang="id">Bundel aplikasi Flatpak</comment>
+ <comment xml:lang="hu">Flatpak alkalmazáscsomag</comment>
+ <comment xml:lang="hr">Flatpak paket aplikacije</comment>
+ <comment xml:lang="he">חבילת יישומי Flatpak</comment>
+ <comment xml:lang="ga">burla feidhmchláir Flatpak</comment>
+ <comment xml:lang="fur">côl di aplicazions Flatpak</comment>
+ <comment xml:lang="fr">lot applicatif Flatpak</comment>
+ <comment xml:lang="fi">Flatpak-sovelluspaketti</comment>
+ <comment xml:lang="eu">Flatpak aplikazio bilduma</comment>
+ <comment xml:lang="es">paquete de aplicación Flatpak</comment>
+ <comment xml:lang="en_GB">Flatpak application bundle</comment>
+ <comment xml:lang="de">Flatpak-Anwendungspaket</comment>
+ <comment xml:lang="da">Flatpak-programsamling</comment>
+ <comment xml:lang="cs">balíček Flatpak s aplikací</comment>
+ <comment xml:lang="ca">paquet d'aplicació Flatpak</comment>
+ <comment xml:lang="bg">Програмен пакет — Flatpak</comment>
+ <comment xml:lang="be">пакет праграмы Flatpak</comment>
+ <comment xml:lang="ar">حزمة تطبيق Flatpak</comment>
+ <comment xml:lang="af">Flatpak-toepassingsbundel</comment>
<generic-icon name="package-x-generic"/>
- <magic priority="50">
+ <magic>
<match type="string" value="xdg-app\x00\x01\x00\x89\xe5" offset="0"/>
<match type="string" value="flatpak\x00\x01\x00\x89\xe5" offset="0"/>
</magic>
@@ -42515,155 +43594,183 @@ command to generate the output files.
<glob pattern="*.xdgapp"/>
<alias type="application/vnd.xdgapp"/>
</mime-type>
-
<mime-type type="application/vnd.flatpak.repo">
<comment>Flatpak repository description</comment>
- <comment xml:lang="bg">Описание на хранилище — Flatpak</comment>
- <comment xml:lang="ca">descripció de dipòsit de Flatpak</comment>
- <comment xml:lang="cs">popis repozitáře Flatpak</comment>
- <comment xml:lang="da">Flatpak-arkivbeskrivelse</comment>
- <comment xml:lang="de">Flatpak-Repositoriumsbeschreibung</comment>
- <comment xml:lang="en-GB">Flatpak repository description</comment>
- <comment xml:lang="es">descripción de repositorio de Flatpak</comment>
- <comment xml:lang="eu">Flatpak biltegi deskribapena</comment>
- <comment xml:lang="fi">Flatpak-ohjelmistolähdekuvaus</comment>
- <comment xml:lang="fr">description de dépôt Flatpak</comment>
- <comment xml:lang="fur">descrizion dipuesit Flatpak</comment>
- <comment xml:lang="ga">cur síos ar stórlann Flatpak</comment>
- <comment xml:lang="he">תיאור מאגר Flatpak</comment>
- <comment xml:lang="hr">Flatpak opis repozitorija</comment>
- <comment xml:lang="hu">Flatpak tárolóleírás</comment>
- <comment xml:lang="id">Deskripsi repositori Flatpak</comment>
- <comment xml:lang="it">Descrizione repository Flatpack</comment>
- <comment xml:lang="kk">Flatpak репозиторийі сипаттамасы</comment>
- <comment xml:lang="ko">Flatpak 저장소 디스크립션</comment>
- <comment xml:lang="pl">Opis repozytorium Flatpak</comment>
- <comment xml:lang="pt-BR">Descrição de repositório Flatpak</comment>
- <comment xml:lang="ru">Описание репозитория Flatpak</comment>
- <comment xml:lang="sk">Popis repozitára Flatpak</comment>
- <comment xml:lang="sr">опис ризнице Флатпака</comment>
- <comment xml:lang="sv">Flatpak-förrådsbeskrivning</comment>
- <comment xml:lang="tr">Flatpak depo açıklaması</comment>
+ <comment xml:lang="zh_TW">Flatpak 軟體庫描述</comment>
+ <comment xml:lang="zh_CN">Flatpak 软件库描述</comment>
<comment xml:lang="uk">опис сховища Flatpak</comment>
- <comment xml:lang="zh-CN">Flatpak 软件库描述</comment>
- <comment xml:lang="zh-TW">Flatpak 軟體庫描述</comment>
+ <comment xml:lang="tr">Flatpak depo açıklaması</comment>
+ <comment xml:lang="sv">Flatpak-förrådsbeskrivning</comment>
+ <comment xml:lang="sr">опис ризнице Флатпака</comment>
+ <comment xml:lang="sq">përshkrim depoje Flatpak</comment>
+ <comment xml:lang="si">Flatpak ගබඩා විස්තරය</comment>
+ <comment xml:lang="sk">Popis repozitára Flatpak</comment>
+ <comment xml:lang="ru">Описание репозитория Flatpak</comment>
+ <comment xml:lang="pt_BR">Descrição de repositório Flatpak</comment>
+ <comment xml:lang="pl">Opis repozytorium Flatpak</comment>
+ <comment xml:lang="nl">Flatpak-pakketbronomschrijving</comment>
+ <comment xml:lang="ko">Flatpak 저장소 디스크립션</comment>
+ <comment xml:lang="kk">Flatpak репозиторийі сипаттамасы</comment>
+ <comment xml:lang="ja">Flatpak リポジトリ説明</comment>
+ <comment xml:lang="it">Descrizione repository Flatpack</comment>
+ <comment xml:lang="is">Flatpak lýsing gagnasafns</comment>
+ <comment xml:lang="id">Deskripsi repositori Flatpak</comment>
+ <comment xml:lang="hu">Flatpak tárolóleírás</comment>
+ <comment xml:lang="hr">Flatpak opis repozitorija</comment>
+ <comment xml:lang="he">תיאור מאגר Flatpak</comment>
+ <comment xml:lang="ga">cur síos ar stórlann Flatpak</comment>
+ <comment xml:lang="fur">descrizion dipuesit Flatpak</comment>
+ <comment xml:lang="fr">description de dépôt Flatpak</comment>
+ <comment xml:lang="fi">Flatpak-ohjelmistolähdekuvaus</comment>
+ <comment xml:lang="eu">Flatpak biltegi deskribapena</comment>
+ <comment xml:lang="es">descripción de repositorio de Flatpak</comment>
+ <comment xml:lang="en_GB">Flatpak repository description</comment>
+ <comment xml:lang="de">Flatpak-Repositorybeschreibung</comment>
+ <comment xml:lang="da">Flatpak-arkivbeskrivelse</comment>
+ <comment xml:lang="cs">popis repozitáře Flatpak</comment>
+ <comment xml:lang="ca">descripció de dipòsit de Flatpak</comment>
+ <comment xml:lang="bg">Описание на хранилище — Flatpak</comment>
+ <comment xml:lang="be">апісанне рэпазіторыя Flatpak</comment>
+ <comment xml:lang="ar">وصف مستودع Flatpak</comment>
<generic-icon name="package-x-generic"/>
<sub-class-of type="text/plain"/>
- <magic priority="50">
+ <magic>
<match type="string" value="[Flatpak Repo]" offset="0:256"/>
</magic>
<glob pattern="*.flatpakrepo"/>
</mime-type>
-
<mime-type type="application/vnd.flatpak.ref">
<comment>Flatpak repository reference</comment>
- <comment xml:lang="bg">Указател към хранилище — Flatpak</comment>
- <comment xml:lang="ca">referència de dipòsit Flatpak</comment>
- <comment xml:lang="cs">odkaz na repozitář Flatpak</comment>
- <comment xml:lang="da">Flatpak-arkivreference</comment>
- <comment xml:lang="de">Flatpak-Repositoriumsreferenz</comment>
- <comment xml:lang="en-GB">Flatpak repository reference</comment>
- <comment xml:lang="es">referencia a repositorio de Flatpak</comment>
- <comment xml:lang="eu">Flatpak biltegi erreferentzia</comment>
- <comment xml:lang="fi">Flatpak-ohjelmistolähdeviite</comment>
- <comment xml:lang="fr">référence de dépôt Flatpak</comment>
- <comment xml:lang="fur">riferiment dipuesit Flatpak</comment>
- <comment xml:lang="ga">tagairt do stórlann Flatpak</comment>
- <comment xml:lang="hr">Flatpak preporučeni repozitorij</comment>
- <comment xml:lang="hu">Flatpak tárolóhivatkozás</comment>
- <comment xml:lang="id">Acuan repositori Flatpak</comment>
- <comment xml:lang="it">Riferimento repository Flatpack</comment>
- <comment xml:lang="kk">Flatpak репозиторийіне сілтеме</comment>
- <comment xml:lang="ko">Flatpak 저장소 참조</comment>
- <comment xml:lang="pl">Odwołanie do repozytorium Flatpak</comment>
- <comment xml:lang="pt-BR">Referência de repositório Flatpak</comment>
- <comment xml:lang="ru">Ссылка на репозиторий Flatpak</comment>
- <comment xml:lang="sk">Referencia repozitára Flatpak</comment>
- <comment xml:lang="sr">упута ризнице Флатпака</comment>
- <comment xml:lang="sv">Flatpak-förrådsreferens</comment>
- <comment xml:lang="tr">Flatpak depo atfı</comment>
+ <comment xml:lang="zh_TW">Flatpak 軟體庫參照</comment>
+ <comment xml:lang="zh_CN">Flatpak 软件库引用</comment>
<comment xml:lang="uk">посилання на сховище Flatpak</comment>
- <comment xml:lang="zh-CN">Flatpak 软件库引用</comment>
- <comment xml:lang="zh-TW">Flatpak 軟體庫參照</comment>
+ <comment xml:lang="tr">Flatpak depo atfı</comment>
+ <comment xml:lang="sv">Flatpak-förrådsreferens</comment>
+ <comment xml:lang="sr">упута ризнице Флатпака</comment>
+ <comment xml:lang="sq">referencë depoje Flatpak</comment>
+ <comment xml:lang="si">Flatpak නිධිය යොමුව</comment>
+ <comment xml:lang="sk">Referencia repozitára Flatpak</comment>
+ <comment xml:lang="ru">Ссылка на репозиторий Flatpak</comment>
+ <comment xml:lang="pt_BR">Referência de repositório Flatpak</comment>
+ <comment xml:lang="pl">Odwołanie do repozytorium Flatpak</comment>
+ <comment xml:lang="nl">Flatpak-pakketbronverwijzing</comment>
+ <comment xml:lang="ko">Flatpak 저장소 참조</comment>
+ <comment xml:lang="kk">Flatpak репозиторийіне сілтеме</comment>
+ <comment xml:lang="ja">Flatpak リポジトリリファレンス</comment>
+ <comment xml:lang="it">Riferimento repository Flatpack</comment>
+ <comment xml:lang="is">Flatpak tilvísun gagnasafns</comment>
+ <comment xml:lang="id">Acuan repositori Flatpak</comment>
+ <comment xml:lang="hu">Flatpak tárolóhivatkozás</comment>
+ <comment xml:lang="hr">Flatpak preporučeni repozitorij</comment>
+ <comment xml:lang="he">הפניית מאגר Flatpak</comment>
+ <comment xml:lang="ga">tagairt do stórlann Flatpak</comment>
+ <comment xml:lang="fur">riferiment dipuesit Flatpak</comment>
+ <comment xml:lang="fr">référence de dépôt Flatpak</comment>
+ <comment xml:lang="fi">Flatpak-ohjelmistolähdeviite</comment>
+ <comment xml:lang="eu">Flatpak biltegi erreferentzia</comment>
+ <comment xml:lang="es">referencia a repositorio de Flatpak</comment>
+ <comment xml:lang="en_GB">Flatpak repository reference</comment>
+ <comment xml:lang="de">Flatpak-Repositoryreferenz</comment>
+ <comment xml:lang="da">Flatpak-arkivreference</comment>
+ <comment xml:lang="cs">odkaz na repozitář Flatpak</comment>
+ <comment xml:lang="ca">referència de dipòsit Flatpak</comment>
+ <comment xml:lang="bg">Указател към хранилище — Flatpak</comment>
+ <comment xml:lang="be">спасылкая рэпазіторыя Flatpak</comment>
+ <comment xml:lang="ar">مرجع مستودع Flatpak</comment>
<generic-icon name="package-x-generic"/>
<sub-class-of type="text/plain"/>
- <magic priority="50">
+ <magic>
<match type="string" value="[Flatpak Ref]" offset="0:256"/>
</magic>
<glob pattern="*.flatpakref"/>
</mime-type>
-
<mime-type type="application/vnd.squashfs">
<comment>Squashfs filesystem image</comment>
- <comment xml:lang="bg">Диск — Squashfs</comment>
- <comment xml:lang="ca">imatge de sistema de fitxers Squashfs</comment>
- <comment xml:lang="da">Squashfs-filsystemaftryk</comment>
- <comment xml:lang="de">Squashfs-Dateisystemabbild</comment>
- <comment xml:lang="en-GB">Squashfs filesystem image</comment>
- <comment xml:lang="es">imagen de sistema de archivos de Squashfs</comment>
- <comment xml:lang="eu">Squashfs fitxategi sistema irudia</comment>
- <comment xml:lang="fi">Squashfs-tiedostojärjestelmän levykuva</comment>
- <comment xml:lang="fr">image de système de fichiers Squashfs</comment>
- <comment xml:lang="hr">Squashfs slika datotečnog sustava</comment>
- <comment xml:lang="hu">Squashfs fájlrenszerkép</comment>
- <comment xml:lang="id">Image sistem berkas Squashfs</comment>
- <comment xml:lang="it">Immagine file system squashfs</comment>
- <comment xml:lang="kk">Squashfs файлдық жүйе бейнесі</comment>
- <comment xml:lang="ko">Squashfs 파일 시스템 이미지</comment>
- <comment xml:lang="pl">Obraz systemu plików SquashFS</comment>
- <comment xml:lang="pt-BR">Imagem de sistema de arquivos Squashfs</comment>
- <comment xml:lang="ru">Образ файловой системы Squashfs</comment>
- <comment xml:lang="sk">Obraz systému súborov Squashfs</comment>
- <comment xml:lang="sv">Squashfs filsystemsavbildning</comment>
- <comment xml:lang="tr">Squashfs dosya sistemi görüntüsü</comment>
+ <comment xml:lang="zh_TW">Squashfs 檔案系統映像</comment>
+ <comment xml:lang="zh_CN">Squashfs 文件系统映像</comment>
<comment xml:lang="uk">образ файлової системи squashfs</comment>
- <comment xml:lang="zh-CN">Squashfs 文件系统映像</comment>
- <comment xml:lang="zh-TW">Squashfs 檔案系統映像</comment>
- <magic priority="50">
+ <comment xml:lang="tr">Squashfs dosya sistemi görüntüsü</comment>
+ <comment xml:lang="sv">Squashfs filsystemsavbildning</comment>
+ <comment xml:lang="sq">pamje sistemi kartelash Squashfs</comment>
+ <comment xml:lang="si">Squashfs ගොනු පද්ධති රූපය</comment>
+ <comment xml:lang="sk">Obraz systému súborov Squashfs</comment>
+ <comment xml:lang="ru">Образ файловой системы Squashfs</comment>
+ <comment xml:lang="pt_BR">Imagem de sistema de arquivos Squashfs</comment>
+ <comment xml:lang="pl">Obraz systemu plików SquashFS</comment>
+ <comment xml:lang="nl">Squashfs-schijfkopiebestand</comment>
+ <comment xml:lang="ko">Squashfs 파일 시스템 이미지</comment>
+ <comment xml:lang="kk">Squashfs файлдық жүйе бейнесі</comment>
+ <comment xml:lang="ja">Squashfs ファイルシステムイメージ</comment>
+ <comment xml:lang="it">Immagine file system squashfs</comment>
+ <comment xml:lang="is">Squashfs skráakerfismynd</comment>
+ <comment xml:lang="id">Image sistem berkas Squashfs</comment>
+ <comment xml:lang="hu">Squashfs fájlrenszerkép</comment>
+ <comment xml:lang="hr">Squashfs slika datotečnog sustava</comment>
+ <comment xml:lang="he">תמונת מערכת קבצים Squashfs</comment>
+ <comment xml:lang="fr">image de système de fichiers Squashfs</comment>
+ <comment xml:lang="fi">Squashfs-tiedostojärjestelmän levykuva</comment>
+ <comment xml:lang="eu">Squashfs fitxategi sistema irudia</comment>
+ <comment xml:lang="es">imagen de sistema de archivos de Squashfs</comment>
+ <comment xml:lang="en_GB">Squashfs filesystem image</comment>
+ <comment xml:lang="de">Squashfs-Dateisystemabbild</comment>
+ <comment xml:lang="da">Squashfs-filsystemaftryk</comment>
+ <comment xml:lang="ca">imatge de sistema de fitxers Squashfs</comment>
+ <comment xml:lang="bg">Диск — Squashfs</comment>
+ <comment xml:lang="be">вобраз файлавай сістэмы Squashfs</comment>
+ <comment xml:lang="ar">صورة نظام ملفات Squashfs</comment>
+ <sub-class-of type="application/vnd.efi.img"/>
+ <magic>
<match type="string" value="sqsh" offset="0"/>
<match type="string" value="hsqs" offset="0"/>
</magic>
<glob pattern="*.sqsh"/>
</mime-type>
-
<!-- AppImage application bundle (Type 2) -->
<mime-type type="application/vnd.appimage">
<comment>AppImage application bundle</comment>
- <comment xml:lang="af">AppImage-toepassingsbundel</comment>
- <comment xml:lang="bg">Програмен пакет — AppImage</comment>
- <comment xml:lang="ca">paquet d'aplicació AppImage</comment>
- <comment xml:lang="cs">balíček AppImage s aplikací</comment>
- <comment xml:lang="da">AppImage-programsamling</comment>
- <comment xml:lang="de">AppImage-Anwendungspaket</comment>
- <comment xml:lang="en-GB">AppImage application bundle</comment>
- <comment xml:lang="es">paquete de aplicación AppImage</comment>
- <comment xml:lang="eu">AppImage aplikazio bilduma</comment>
- <comment xml:lang="fi">AppImage-sovelluspaketti</comment>
- <comment xml:lang="fr">lot applicatif AppImage</comment>
- <comment xml:lang="fur">côl di aplicazions AppImage</comment>
- <comment xml:lang="ga">burla feidhmchláir AppImage</comment>
- <comment xml:lang="he">חבילת יישומי AppImage</comment>
- <comment xml:lang="hr">AppImage paket aplikacije</comment>
- <comment xml:lang="hu">AppImage alkalmazáscsomag</comment>
- <comment xml:lang="id">Bundel aplikasi AppImage</comment>
- <comment xml:lang="it">Bundle applicazione AppImage</comment>
- <comment xml:lang="kk">AppImage қолданбалар дестесі</comment>
- <comment xml:lang="ko">AppImage 프로그램 번들</comment>
- <comment xml:lang="pl">Pakiet programu AppImage</comment>
- <comment xml:lang="pt">pacote de aplicação AppImage</comment>
- <comment xml:lang="pt-BR">Pacote de aplicativo AppImage</comment>
- <comment xml:lang="ru">Пакет приложения AppImage</comment>
- <comment xml:lang="sk">Balík aplikácií AppImage</comment>
- <comment xml:lang="sr">скуп програма Ап-слике</comment>
- <comment xml:lang="sv">AppImage-programbunt</comment>
- <comment xml:lang="tr">AppImage uygulama paketi</comment>
+ <comment xml:lang="zh_TW">AppImage 應用程式套組</comment>
+ <comment xml:lang="zh_CN">AppImage 应用组合包</comment>
<comment xml:lang="uk">пакунок із програмами AppImage</comment>
- <comment xml:lang="zh-CN">AppImage 应用组合包</comment>
- <comment xml:lang="zh-TW">AppImage 應用程式套組</comment>
+ <comment xml:lang="tr">AppImage uygulama paketi</comment>
+ <comment xml:lang="sv">AppImage-programbunt</comment>
+ <comment xml:lang="sr">скуп програма Ап-слике</comment>
+ <comment xml:lang="sq">paketë aplikacioni AppImage</comment>
+ <comment xml:lang="si">AppImage යෙදුම් මිටියක්</comment>
+ <comment xml:lang="sk">Balík aplikácií AppImage</comment>
+ <comment xml:lang="ru">Пакет приложения AppImage</comment>
+ <comment xml:lang="pt_BR">Pacote de aplicativo AppImage</comment>
+ <comment xml:lang="pt">pacote de aplicação AppImage</comment>
+ <comment xml:lang="pl">Pakiet programu AppImage</comment>
+ <comment xml:lang="nl">AppImage-toepassingsbundel</comment>
+ <comment xml:lang="ko">AppImage 프로그램 번들</comment>
+ <comment xml:lang="kk">AppImage қолданбалар дестесі</comment>
+ <comment xml:lang="ja">AppImage アプリケーションバンドル</comment>
+ <comment xml:lang="it">Bundle applicazione AppImage</comment>
+ <comment xml:lang="is">AppImage forritavöndull</comment>
+ <comment xml:lang="id">Bundel aplikasi AppImage</comment>
+ <comment xml:lang="hu">AppImage alkalmazáscsomag</comment>
+ <comment xml:lang="hr">AppImage paket aplikacije</comment>
+ <comment xml:lang="he">חבילת יישומי AppImage</comment>
+ <comment xml:lang="gl">Paquete de aplicación de AppImage</comment>
+ <comment xml:lang="ga">burla feidhmchláir AppImage</comment>
+ <comment xml:lang="fur">côl di aplicazions AppImage</comment>
+ <comment xml:lang="fr">lot applicatif AppImage</comment>
+ <comment xml:lang="fi">AppImage-sovelluspaketti</comment>
+ <comment xml:lang="eu">AppImage aplikazio bilduma</comment>
+ <comment xml:lang="es">paquete de aplicación AppImage</comment>
+ <comment xml:lang="en_GB">AppImage application bundle</comment>
+ <comment xml:lang="de">AppImage-Anwendungspaket</comment>
+ <comment xml:lang="da">AppImage-programsamling</comment>
+ <comment xml:lang="cs">balíček AppImage s aplikací</comment>
+ <comment xml:lang="ca">paquet d'aplicació AppImage</comment>
+ <comment xml:lang="bg">Програмен пакет — AppImage</comment>
+ <comment xml:lang="be">пакет праграмы AppImage</comment>
+ <comment xml:lang="ar">حزمة تطبيق AppImage</comment>
+ <comment xml:lang="af">AppImage-toepassingsbundel</comment>
<sub-class-of type="application/x-executable"/>
<sub-class-of type="application/vnd.squashfs"/>
<generic-icon name="application-x-executable"/>
- <magic priority="50">
+ <magic>
<match value="ELF" type="string" offset="1">
<match value="0x41" type="byte" offset="8">
<match value="0x49" type="byte" offset="9">
@@ -42674,79 +43781,125 @@ command to generate the output files.
</magic>
<glob weight="60" pattern="*.appimage"/>
</mime-type>
-
<mime-type type="application/vnd.snap">
<comment>Snap package</comment>
- <comment xml:lang="af">Snap-pakket</comment>
- <comment xml:lang="bg">Пакет — Snap</comment>
- <comment xml:lang="ca">paquet snap</comment>
- <comment xml:lang="cs">balíček Snap</comment>
- <comment xml:lang="da">Snap-pakke</comment>
- <comment xml:lang="de">Snap-Paket</comment>
- <comment xml:lang="en-GB">Snap package</comment>
- <comment xml:lang="es">paquete Snap</comment>
- <comment xml:lang="eu">Snap paketea</comment>
- <comment xml:lang="fi">Snap-paketti</comment>
- <comment xml:lang="fr">paquet Snap</comment>
- <comment xml:lang="fur">pachet Snap</comment>
- <comment xml:lang="ga">pacáiste Snap</comment>
- <comment xml:lang="he">חבילת Snap</comment>
- <comment xml:lang="hr">Snap paket</comment>
- <comment xml:lang="hu">Snap-csomag</comment>
- <comment xml:lang="id">Paket Snap</comment>
- <comment xml:lang="it">Pacchetto snap</comment>
- <comment xml:lang="kk">Snap дестесі</comment>
- <comment xml:lang="ko">Snap 패키지</comment>
- <comment xml:lang="pl">Pakiet Snap</comment>
- <comment xml:lang="pt-BR">Pacote Snap</comment>
- <comment xml:lang="ru">Пакет Snap</comment>
- <comment xml:lang="sk">Balík Snap</comment>
- <comment xml:lang="sl">Paket Snap</comment>
- <comment xml:lang="sr">Снап пакет</comment>
- <comment xml:lang="sv">Snap-paket</comment>
- <comment xml:lang="tr">Snap paketi</comment>
+ <comment xml:lang="zh_TW">Snap 軟體包</comment>
+ <comment xml:lang="zh_CN">Snap 软件包</comment>
<comment xml:lang="uk">пакунок snap</comment>
- <comment xml:lang="zh-CN">Snap 软件包</comment>
- <comment xml:lang="zh-TW">Snap 軟體包</comment>
+ <comment xml:lang="tr">Snap paketi</comment>
+ <comment xml:lang="sv">Snap-paket</comment>
+ <comment xml:lang="sr">Снап пакет</comment>
+ <comment xml:lang="sq">paketë Snap</comment>
+ <comment xml:lang="sl">Paket Snap</comment>
+ <comment xml:lang="si">Snap පැකේජය</comment>
+ <comment xml:lang="sk">Balík Snap</comment>
+ <comment xml:lang="ru">Пакет Snap</comment>
+ <comment xml:lang="pt_BR">Pacote Snap</comment>
+ <comment xml:lang="pl">Pakiet Snap</comment>
+ <comment xml:lang="oc">paquet Snap</comment>
+ <comment xml:lang="nl">Snap-pakket</comment>
+ <comment xml:lang="ko">Snap 패키지</comment>
+ <comment xml:lang="kk">Snap дестесі</comment>
+ <comment xml:lang="ja">Snap パッケージ</comment>
+ <comment xml:lang="it">Pacchetto snap</comment>
+ <comment xml:lang="is">Snap-pakki</comment>
+ <comment xml:lang="id">Paket Snap</comment>
+ <comment xml:lang="hu">Snap-csomag</comment>
+ <comment xml:lang="hr">Snap paket</comment>
+ <comment xml:lang="he">חבילת Snap</comment>
+ <comment xml:lang="ga">pacáiste Snap</comment>
+ <comment xml:lang="fur">pachet Snap</comment>
+ <comment xml:lang="fr">paquet Snap</comment>
+ <comment xml:lang="fi">Snap-paketti</comment>
+ <comment xml:lang="eu">Snap paketea</comment>
+ <comment xml:lang="es">paquete Snap</comment>
+ <comment xml:lang="en_GB">Snap package</comment>
+ <comment xml:lang="de">Snap-Paket</comment>
+ <comment xml:lang="da">Snap-pakke</comment>
+ <comment xml:lang="cs">balíček Snap</comment>
+ <comment xml:lang="ca">paquet snap</comment>
+ <comment xml:lang="bg">Пакет — Snap</comment>
+ <comment xml:lang="be">пакет Snap</comment>
+ <comment xml:lang="ar">حزمة سناب</comment>
+ <comment xml:lang="af">Snap-pakket</comment>
<glob pattern="*.snap"/>
<sub-class-of type="application/vnd.squashfs"/>
</mime-type>
-
<!-- 3D models and GCODEs -->
+ <mime-type type="model/3mf">
+ <comment>3MF document</comment>
+ <comment xml:lang="zh_CN">3MF 文档</comment>
+ <comment xml:lang="uk">документ 3MF</comment>
+ <comment xml:lang="tr">3MF belgesi</comment>
+ <comment xml:lang="sv">3MF-dokument</comment>
+ <comment xml:lang="sl">Dokument 3MF</comment>
+ <comment xml:lang="si">3MF ලේඛනය</comment>
+ <comment xml:lang="ru">Документ 3MF</comment>
+ <comment xml:lang="pt_BR">Documento 3MF</comment>
+ <comment xml:lang="pl">Dokument 3MF</comment>
+ <comment xml:lang="nl">3MF-document</comment>
+ <comment xml:lang="ko">3MF 문서</comment>
+ <comment xml:lang="kk">3MF құжаты</comment>
+ <comment xml:lang="ja">3MF ドキュメント</comment>
+ <comment xml:lang="it">Documento 3MF</comment>
+ <comment xml:lang="hr">3MF dokument</comment>
+ <comment xml:lang="fi">3MF-asiakirja</comment>
+ <comment xml:lang="eu">3MF dokumentua</comment>
+ <comment xml:lang="es">documento 3MF</comment>
+ <comment xml:lang="en_GB">3MF document</comment>
+ <comment xml:lang="de">3MF-Dokument</comment>
+ <comment xml:lang="be">дакумент 3MF</comment>
+ <comment xml:lang="ar">مستند 3MF</comment>
+ <acronym>3MF</acronym>
+ <expanded-acronym>3D Manufacturing Format</expanded-acronym>
+ <glob pattern="*.3mf"/>
+ <alias type="application/vnd.ms-3mfdocument"/>
+ <sub-class-of type="application/zip"/>
+ <generic-icon name="image-x-generic"/>
+ </mime-type>
<mime-type type="model/stl">
<comment>STL 3D model</comment>
- <comment xml:lang="af">STL 3D-model</comment>
- <comment xml:lang="bg">Модел — STL 3D</comment>
- <comment xml:lang="ca">model 3D STL</comment>
- <comment xml:lang="cs">3D model STL</comment>
- <comment xml:lang="da">STL 3D-model</comment>
- <comment xml:lang="de">STL 3D-Modell</comment>
- <comment xml:lang="en-GB">STL 3D model</comment>
- <comment xml:lang="es">modelo 3D de STL</comment>
- <comment xml:lang="eu">STL 3D modeloa</comment>
- <comment xml:lang="fi">STL 3D malli</comment>
- <comment xml:lang="fr">modèle 3D STL</comment>
- <comment xml:lang="fur">model STL 3D</comment>
- <comment xml:lang="ga">samhail 3T STL</comment>
- <comment xml:lang="hr">STL 3D model</comment>
- <comment xml:lang="hu">STL 3D modell</comment>
- <comment xml:lang="id">Model 3D STL</comment>
- <comment xml:lang="it">Modello 3D STL</comment>
- <comment xml:lang="kk">STL 3D моделі</comment>
- <comment xml:lang="ko">STL 3D 모델</comment>
- <comment xml:lang="pl">Model 3D STL</comment>
- <comment xml:lang="pt-BR">Modelo 3D STL</comment>
- <comment xml:lang="ru">3D-модель STL</comment>
- <comment xml:lang="sk">STL 3D model</comment>
- <comment xml:lang="sl">Model STL 3D</comment>
- <comment xml:lang="sv">STL-3D-modell</comment>
- <comment xml:lang="tr">STL 3D modeli</comment>
+ <comment xml:lang="zh_TW">STL 3D 模型</comment>
+ <comment xml:lang="zh_CN">STL 3D 模型</comment>
<comment xml:lang="uk">просторова модель STL</comment>
- <comment xml:lang="zh-CN">STL 3D 模型</comment>
- <comment xml:lang="zh-TW">STL 3D 模型</comment>
+ <comment xml:lang="tr">STL 3D modeli</comment>
+ <comment xml:lang="sv">STL-3D-modell</comment>
+ <comment xml:lang="sq">model STL 3D</comment>
+ <comment xml:lang="sl">Model STL 3D</comment>
+ <comment xml:lang="si">STL 3D ආකෘතිය</comment>
+ <comment xml:lang="sk">STL 3D model</comment>
+ <comment xml:lang="ru">3D-модель STL</comment>
+ <comment xml:lang="pt_BR">Modelo 3D STL</comment>
+ <comment xml:lang="pl">Model 3D STL</comment>
+ <comment xml:lang="nl">STL 3D-model</comment>
+ <comment xml:lang="ko">STL 3D 모델</comment>
+ <comment xml:lang="kk">STL 3D моделі</comment>
+ <comment xml:lang="ja">STL 3D モデル</comment>
+ <comment xml:lang="it">Modello 3D STL</comment>
+ <comment xml:lang="is">STL 3D-líkan</comment>
+ <comment xml:lang="id">Model 3D STL</comment>
+ <comment xml:lang="hu">STL 3D modell</comment>
+ <comment xml:lang="hr">STL 3D model</comment>
+ <comment xml:lang="he">דגם תלת ממדי של STL</comment>
+ <comment xml:lang="ga">samhail 3T STL</comment>
+ <comment xml:lang="fur">model STL 3D</comment>
+ <comment xml:lang="fr">modèle 3D STL</comment>
+ <comment xml:lang="fi">STL 3D-malli</comment>
+ <comment xml:lang="eu">STL 3D modeloa</comment>
+ <comment xml:lang="es">modelo 3D de STL</comment>
+ <comment xml:lang="en_GB">STL 3D model</comment>
+ <comment xml:lang="de">STL 3D-Modell</comment>
+ <comment xml:lang="da">STL 3D-model</comment>
+ <comment xml:lang="cs">3D model STL</comment>
+ <comment xml:lang="ca">model 3D STL</comment>
+ <comment xml:lang="bg">Модел — STL 3D</comment>
+ <comment xml:lang="be">мадэль STL 3D</comment>
+ <comment xml:lang="ar">نموذج STL 3D</comment>
+ <comment xml:lang="af">STL 3D-model</comment>
<acronym>STL</acronym>
<expanded-acronym>StereoLithography</expanded-acronym>
- <magic priority="50">
+ <generic-icon name="image-x-generic"/>
+ <magic>
<match type="string" value="solid" offset="0"/>
<match type="string" value="SOLID" offset="0"/>
</magic>
@@ -42754,74 +43907,115 @@ command to generate the output files.
<alias type="model/x.stl-ascii"/>
<alias type="model/x.stl-binary"/>
</mime-type>
-
<mime-type type="text/x.gcode">
<comment>G-code file</comment>
- <comment xml:lang="bg">Модел — G-code</comment>
- <comment xml:lang="ca">fitxer G-code</comment>
- <comment xml:lang="cs">soubor G-code</comment>
- <comment xml:lang="da">G-code-fil</comment>
- <comment xml:lang="de">G-Code-Datei</comment>
- <comment xml:lang="en-GB">G-code file</comment>
- <comment xml:lang="es">archivo G-code</comment>
- <comment xml:lang="eu">G-code fitxategia</comment>
- <comment xml:lang="fi">G-code-tiedosto</comment>
- <comment xml:lang="fr">fichier G-code</comment>
- <comment xml:lang="fur">file G-code</comment>
- <comment xml:lang="ga">comhad G-code</comment>
- <comment xml:lang="hr">G-kôd datoteka</comment>
- <comment xml:lang="hu">G-code fájl</comment>
- <comment xml:lang="id">Berkas G-code</comment>
- <comment xml:lang="it">File G-code</comment>
- <comment xml:lang="kk">G-code файлы</comment>
- <comment xml:lang="ko">G-code 파일</comment>
- <comment xml:lang="pl">Plik G-code</comment>
- <comment xml:lang="pt-BR">Arquivo G-code</comment>
- <comment xml:lang="ru">Файл G-code</comment>
- <comment xml:lang="sk">Súbor G-code</comment>
- <comment xml:lang="sl">Datoteka G-code</comment>
- <comment xml:lang="sr">датотека Г-ко̂да</comment>
- <comment xml:lang="sv">G-code-fil</comment>
- <comment xml:lang="tr">G-code dosyası</comment>
+ <comment xml:lang="zh_TW">G-code 檔案</comment>
+ <comment xml:lang="zh_CN">G-code 文件</comment>
<comment xml:lang="uk">файл G-code</comment>
- <comment xml:lang="zh-CN">G-code 文件</comment>
- <comment xml:lang="zh-TW">G-code 檔案</comment>
+ <comment xml:lang="tr">G-code dosyası</comment>
+ <comment xml:lang="sv">G-code-fil</comment>
+ <comment xml:lang="sr">датотека Г-ко̂да</comment>
+ <comment xml:lang="sq">kartelë G-code</comment>
+ <comment xml:lang="sl">Datoteka G-code</comment>
+ <comment xml:lang="si">G-කේත ගොනුව</comment>
+ <comment xml:lang="sk">Súbor G-code</comment>
+ <comment xml:lang="ru">Файл G-code</comment>
+ <comment xml:lang="pt_BR">Arquivo G-code</comment>
+ <comment xml:lang="pl">Plik G-code</comment>
+ <comment xml:lang="oc">fichièr G-code</comment>
+ <comment xml:lang="nl">G-code-bestand</comment>
+ <comment xml:lang="ko">G-code 파일</comment>
+ <comment xml:lang="kk">G-code файлы</comment>
+ <comment xml:lang="ja">G-code ファイル</comment>
+ <comment xml:lang="it">File G-code</comment>
+ <comment xml:lang="is">G-code skrá</comment>
+ <comment xml:lang="id">Berkas G-code</comment>
+ <comment xml:lang="hu">G-code fájl</comment>
+ <comment xml:lang="hr">G-kôd datoteka</comment>
+ <comment xml:lang="he">קובץ G-code</comment>
+ <comment xml:lang="ga">comhad G-code</comment>
+ <comment xml:lang="fur">file G-code</comment>
+ <comment xml:lang="fr">fichier G-code</comment>
+ <comment xml:lang="fi">G-code-tiedosto</comment>
+ <comment xml:lang="eu">G-code fitxategia</comment>
+ <comment xml:lang="es">archivo G-code</comment>
+ <comment xml:lang="en_GB">G-code file</comment>
+ <comment xml:lang="de">G-Code-Datei</comment>
+ <comment xml:lang="da">G-code-fil</comment>
+ <comment xml:lang="cs">soubor G-code</comment>
+ <comment xml:lang="ca">fitxer G-code</comment>
+ <comment xml:lang="bg">Модел — G-code</comment>
+ <comment xml:lang="be">файл G-code</comment>
+ <comment xml:lang="ar">ملف G-code</comment>
<sub-class-of type="text/plain"/>
<generic-icon name="text-x-generic"/>
<glob pattern="*.gcode"/>
</mime-type>
-
+ <mime-type type="text/x-gcode-gx">
+ <comment>G-code Extended file</comment>
+ <comment xml:lang="uk">файл G-code Extended</comment>
+ <comment xml:lang="tr">G-code Uzatılmış dosyası</comment>
+ <comment xml:lang="sv">Utökad G-code-fil</comment>
+ <comment xml:lang="si">G-කේත විස්තීරණ ගොනුව</comment>
+ <comment xml:lang="ru">Файл G-code Extended</comment>
+ <comment xml:lang="pl">Plik rozszerzonego G-code</comment>
+ <comment xml:lang="nl">G-code Extended-bestand</comment>
+ <comment xml:lang="ko">G-code 확장 파일</comment>
+ <comment xml:lang="kk">G-code Extended файлы</comment>
+ <comment xml:lang="ja">G-code 拡張ファイル</comment>
+ <comment xml:lang="it">File G-code Extended</comment>
+ <comment xml:lang="hr">G-kôd proširena datoteka</comment>
+ <comment xml:lang="fi">G-code Extended-tiedosto</comment>
+ <comment xml:lang="es">archivo G-code extendido</comment>
+ <comment xml:lang="en_GB">G-code Extended file</comment>
+ <comment xml:lang="de">Erweiterte G-Code-Datei</comment>
+ <comment xml:lang="be">файл G-code Extended</comment>
+ <comment xml:lang="ar">ملف غي-كود الموسع</comment>
+ <magic>
+ <match type="string" value="xgcode 1.0" offset="0"/>
+ </magic>
+ <glob pattern="*.gx"/>
+ </mime-type>
<mime-type type="application/x-fds-disk">
<comment>Nintendo FDS disk image</comment>
- <comment xml:lang="af">Nintendo FDS-skyfbeeldlêer</comment>
- <comment xml:lang="bg">Диск — Nintendo FDS</comment>
- <comment xml:lang="ca">imatge de disc Nintendo FDS</comment>
- <comment xml:lang="cs">obraz disku pro Nintendo FDS</comment>
- <comment xml:lang="da">Nintendo FDS-diskaftryk</comment>
- <comment xml:lang="de">Nintendo-FDS-Datenträgerabbild</comment>
- <comment xml:lang="en-GB">Nintendo FDS disk image</comment>
- <comment xml:lang="es">imagen de disco FDS de Nintendo</comment>
- <comment xml:lang="eu">Nintendo FDS disko irudia</comment>
- <comment xml:lang="fi">Nintendo FDS -levykuva</comment>
- <comment xml:lang="fr">image disque Nintendo FDS</comment>
- <comment xml:lang="fur">imagjin disc Nintendo FDS</comment>
- <comment xml:lang="ga">íomhá diosca Nintendo FDS</comment>
- <comment xml:lang="hr">Nintendo FDS slika diska</comment>
- <comment xml:lang="hu">Nintendo FDS lemezkép</comment>
- <comment xml:lang="id">Image disk Nintendo FDS</comment>
- <comment xml:lang="it">Immagine disco Nintendo FDS</comment>
- <comment xml:lang="kk">Nintendo FDS диск бейнесі</comment>
- <comment xml:lang="ko">닌텐도 FDS 디스크 이미지</comment>
- <comment xml:lang="pl">Obraz dysku Nintendo FDS</comment>
- <comment xml:lang="pt-BR">Imagem de disco Nintendo FDS</comment>
- <comment xml:lang="ru">Образ диска Nintendo FDS</comment>
- <comment xml:lang="sk">Obraz disku Nintendo FDS</comment>
- <comment xml:lang="sr">Нинтендо ФДС слика диска</comment>
- <comment xml:lang="sv">Nintendo FDS-diskavbild</comment>
- <comment xml:lang="tr">Nintendo FDS disk görüntüsü</comment>
+ <comment xml:lang="zh_TW">Nintendo FDS 磁碟映像檔</comment>
+ <comment xml:lang="zh_CN">任天堂 FDS 磁盘映像</comment>
<comment xml:lang="uk">образ диска FDS Nintendo</comment>
- <comment xml:lang="zh-CN">任天堂 FDS 磁盘映像</comment>
- <comment xml:lang="zh-TW">Nintendo FDS 磁碟映像檔</comment>
+ <comment xml:lang="tr">Nintendo FDS disk görüntüsü</comment>
+ <comment xml:lang="sv">Nintendo FDS-diskavbild</comment>
+ <comment xml:lang="sr">Нинтендо ФДС слика диска</comment>
+ <comment xml:lang="sq">pamje disku Nintendo FDS</comment>
+ <comment xml:lang="sl">Slika diska Nintendo FDS</comment>
+ <comment xml:lang="si">Nintendo FDS තැටි රූපය</comment>
+ <comment xml:lang="sk">Obraz disku Nintendo FDS</comment>
+ <comment xml:lang="ru">Образ диска Nintendo FDS</comment>
+ <comment xml:lang="pt_BR">Imagem de disco Nintendo FDS</comment>
+ <comment xml:lang="pl">Obraz dysku Nintendo FDS</comment>
+ <comment xml:lang="nl">Nintendo FDS-schijfkopiebestand</comment>
+ <comment xml:lang="ko">닌텐도 FDS 디스크 이미지</comment>
+ <comment xml:lang="kk">Nintendo FDS диск бейнесі</comment>
+ <comment xml:lang="ja">Nintendo FDS ディスクイメージ</comment>
+ <comment xml:lang="it">Immagine disco Nintendo FDS</comment>
+ <comment xml:lang="is">Nintendo FDS diskmynd</comment>
+ <comment xml:lang="id">Image disk Nintendo FDS</comment>
+ <comment xml:lang="hu">Nintendo FDS lemezkép</comment>
+ <comment xml:lang="hr">Nintendo FDS slika diska</comment>
+ <comment xml:lang="he">תמונת כונן Nintendo FDS</comment>
+ <comment xml:lang="ga">íomhá diosca Nintendo FDS</comment>
+ <comment xml:lang="fur">imagjin disc Nintendo FDS</comment>
+ <comment xml:lang="fr">image disque Nintendo FDS</comment>
+ <comment xml:lang="fi">Nintendo FDS -levykuva</comment>
+ <comment xml:lang="eu">Nintendo FDS disko irudia</comment>
+ <comment xml:lang="es">imagen de disco FDS de Nintendo</comment>
+ <comment xml:lang="en_GB">Nintendo FDS disk image</comment>
+ <comment xml:lang="de">Nintendo-FDS-Datenträgerabbild</comment>
+ <comment xml:lang="da">Nintendo FDS-diskaftryk</comment>
+ <comment xml:lang="cs">obraz disku pro Nintendo FDS</comment>
+ <comment xml:lang="ca">imatge de disc Nintendo FDS</comment>
+ <comment xml:lang="bg">Диск — Nintendo FDS</comment>
+ <comment xml:lang="be">вобраз дыска Nintendo FDS</comment>
+ <comment xml:lang="ar">صورة قرص نينتندو اف دي اس</comment>
+ <comment xml:lang="af">Nintendo FDS-skyfbeeldlêer</comment>
<acronym>FDS</acronym>
<expanded-acronym>Famicom Disk System</expanded-acronym>
<glob pattern="*.fds"/>
@@ -42829,30 +44023,106 @@ command to generate the output files.
<match type="string" value="*NINTENDO-HVC*" offset="1"/>
</magic>
</mime-type>
-
+ <mime-type type="application/ovf">
+ <comment>OVF disk image</comment>
+ <comment xml:lang="zh_CN">OVF 磁盘映像</comment>
+ <comment xml:lang="uk">образ диска OVF</comment>
+ <comment xml:lang="tr">OVF disk görüntüsü</comment>
+ <comment xml:lang="sv">OVF-diskavbildning</comment>
+ <comment xml:lang="sl">Slika diska OVF</comment>
+ <comment xml:lang="si">OVF තැටි රූපය</comment>
+ <comment xml:lang="ru">Образ диска OVF</comment>
+ <comment xml:lang="pt_BR">Imagem de disco OVF</comment>
+ <comment xml:lang="pl">Obraz dysku OVF</comment>
+ <comment xml:lang="nl">OVF-schijfkopiebestand</comment>
+ <comment xml:lang="ko">OVF 디스크 이미지</comment>
+ <comment xml:lang="kk">OVF диск бейнесі</comment>
+ <comment xml:lang="ja">OVF ディスクイメージ</comment>
+ <comment xml:lang="it">Immagine disco OVF</comment>
+ <comment xml:lang="hr">OVF slika diska</comment>
+ <comment xml:lang="fi">OVF-levykuva</comment>
+ <comment xml:lang="eu">OVF disko-irudia</comment>
+ <comment xml:lang="es">imagen de disco OVF</comment>
+ <comment xml:lang="en_GB">OVF disk image</comment>
+ <comment xml:lang="de">OVF-Datenträgerabbild</comment>
+ <comment xml:lang="be">вобраз дыска OVF</comment>
+ <comment xml:lang="ar">صورة قرص OVF</comment>
+ <acronym>OVF</acronym>
+ <expanded-acronym>Open Virtualization Format</expanded-acronym>
+ <glob pattern="*.ova"/>
+ <magic priority="62">
+ <match type="string" value=".ovf" offset="1:256">
+ <match type="string" value="ustar\0" offset="257"/>
+ <match type="string" value="ustar\040\040\0" offset="257"/>
+ </match>
+ </magic>
+ <alias type="application/x-virtualbox-ova"/>
+ <sub-class-of type="application/x-tar"/>
+ </mime-type>
+ <mime-type type="application/x-qed-disk">
+ <comment>QEMU QED disk image</comment>
+ <comment xml:lang="zh_TW">QEMU QED 磁碟映像檔</comment>
+ <comment xml:lang="zh_CN">QEMU QED 磁盘映像</comment>
+ <comment xml:lang="uk">образ диска QED QEMU</comment>
+ <comment xml:lang="tr">QEMU QED disk görüntüsü</comment>
+ <comment xml:lang="sv">QEMU QED-diskavbildning</comment>
+ <comment xml:lang="sl">Slika diska QEMU QED</comment>
+ <comment xml:lang="si">QEMU QED තැටි රූපය</comment>
+ <comment xml:lang="ru">Образ диска QEMU QED</comment>
+ <comment xml:lang="pt_BR">Imagem de disco QEMU QED</comment>
+ <comment xml:lang="pl">Obraz dysku QED QEMU</comment>
+ <comment xml:lang="nl">QEMU QED-schijfkopiebestand</comment>
+ <comment xml:lang="ko">QEMU QED 디스크 이미지</comment>
+ <comment xml:lang="kk">QEMU QED диск бейнесі</comment>
+ <comment xml:lang="ja">QEMU QED ディスクイメージ</comment>
+ <comment xml:lang="it">Immagine disco QEMU QED</comment>
+ <comment xml:lang="hr">QEMU QED slika diska</comment>
+ <comment xml:lang="fi">QEMU QED-levykuva</comment>
+ <comment xml:lang="eu">QEMU QED disko-irudia</comment>
+ <comment xml:lang="es">imagen de disco QED de QEMU</comment>
+ <comment xml:lang="en_GB">QEMU QED disk image</comment>
+ <comment xml:lang="de">QEMU-QED-Datenträgerabbild</comment>
+ <comment xml:lang="be">вобраз дыска QEMU QED</comment>
+ <comment xml:lang="ar">صورة قرص QEMU QED</comment>
+ <acronym>QED</acronym>
+ <expanded-acronym>QEMU Enhanced Disk</expanded-acronym>
+ <glob pattern="*.qed"/>
+ <magic>
+ <match type="string" value="QED\0" offset="0"/>
+ </magic>
+ </mime-type>
<mime-type type="application/x-qemu-disk">
<comment>QEMU QCOW disk image</comment>
- <comment xml:lang="ca">imatge de disc QEMU QCOW</comment>
- <comment xml:lang="da">QEMU QCOW-diskaftryk</comment>
- <comment xml:lang="de">QEMU QCOW-Datenträgerabbild</comment>
- <comment xml:lang="en-GB">QEMU QCOW disk image</comment>
- <comment xml:lang="es">imagen de disco QCOW de QEMU</comment>
- <comment xml:lang="fi">QEMU QCOW -levykuva</comment>
- <comment xml:lang="fr">image disque QEMU QCOW</comment>
- <comment xml:lang="hr">QEMU QCOW slika diska</comment>
- <comment xml:lang="hu">QEMU QCOW lemezkép</comment>
- <comment xml:lang="id">Image disk QCOW QEMU</comment>
- <comment xml:lang="it">Immagine disco QEMU QCOW</comment>
- <comment xml:lang="kk">QEMU QCOW диск бейнесі</comment>
- <comment xml:lang="ko">QEMU QCOW 디스크 이미지</comment>
- <comment xml:lang="pl">Obraz dysku QCOW QEMU</comment>
- <comment xml:lang="pt-BR">Imagem de disco QEMU QCOW</comment>
- <comment xml:lang="ru">Образ диска QEMU QCOW</comment>
- <comment xml:lang="sv">QEMU QCOW-diskavbildning</comment>
- <comment xml:lang="tr">QEMU QCOW disk görüntüsü</comment>
+ <comment xml:lang="zh_TW">QEMU QCOW 磁碟映像檔</comment>
+ <comment xml:lang="zh_CN">QEMU QCOW 磁盘映像</comment>
<comment xml:lang="uk">образ диска QCOW QEMU</comment>
- <comment xml:lang="zh-CN">QEMU QCOW 磁盘映像</comment>
- <comment xml:lang="zh-TW">QEMU QCOW 磁碟映像檔</comment>
+ <comment xml:lang="tr">QEMU QCOW disk görüntüsü</comment>
+ <comment xml:lang="sv">QEMU QCOW-diskavbildning</comment>
+ <comment xml:lang="sl">Slika diska QEMU QCOW</comment>
+ <comment xml:lang="si">QEMU QCOW තැටි රූපය</comment>
+ <comment xml:lang="ru">Образ диска QEMU QCOW</comment>
+ <comment xml:lang="pt_BR">Imagem de disco QEMU QCOW</comment>
+ <comment xml:lang="pl">Obraz dysku QCOW QEMU</comment>
+ <comment xml:lang="nl">QEMU QCOW-schijfkopiebestand</comment>
+ <comment xml:lang="ko">QEMU QCOW 디스크 이미지</comment>
+ <comment xml:lang="kk">QEMU QCOW диск бейнесі</comment>
+ <comment xml:lang="ja">QEMU QCOW ディスクイメージ</comment>
+ <comment xml:lang="it">Immagine disco QEMU QCOW</comment>
+ <comment xml:lang="is">QEMU QCOW diskmynd</comment>
+ <comment xml:lang="id">Image disk QCOW QEMU</comment>
+ <comment xml:lang="hu">QEMU QCOW lemezkép</comment>
+ <comment xml:lang="hr">QEMU QCOW slika diska</comment>
+ <comment xml:lang="he">תמונת כונן QEMU QCOW</comment>
+ <comment xml:lang="fr">image disque QEMU QCOW</comment>
+ <comment xml:lang="fi">QEMU QCOW -levykuva</comment>
+ <comment xml:lang="eu">QEMU QCOW disko-irudia</comment>
+ <comment xml:lang="es">imagen de disco QCOW de QEMU</comment>
+ <comment xml:lang="en_GB">QEMU QCOW disk image</comment>
+ <comment xml:lang="de">QEMU-QCOW-Datenträgerabbild</comment>
+ <comment xml:lang="da">QEMU QCOW-diskaftryk</comment>
+ <comment xml:lang="ca">imatge de disc QEMU QCOW</comment>
+ <comment xml:lang="be">вобраз дыска QEMU QCOW</comment>
+ <comment xml:lang="ar">صورة قرص QEMU QCOW</comment>
<acronym>QCOW</acronym>
<expanded-acronym>QEMU Copy On Write</expanded-acronym>
<glob pattern="*.qcow2"/>
@@ -42863,58 +44133,213 @@ command to generate the output files.
</match>
</magic>
</mime-type>
-
+ <mime-type type="application/x-vhd-disk">
+ <comment>VHD disk image</comment>
+ <comment xml:lang="zh_TW">VHD 磁碟映像檔</comment>
+ <comment xml:lang="zh_CN">VHD 磁盘映像</comment>
+ <comment xml:lang="uk">образ диска VHD</comment>
+ <comment xml:lang="tr">VHD disk görüntüsü</comment>
+ <comment xml:lang="sv">VHD-diskavbildning</comment>
+ <comment xml:lang="sl">Slika diska VHD</comment>
+ <comment xml:lang="si">VHD තැටි රූපය</comment>
+ <comment xml:lang="ru">Образ диска VHD</comment>
+ <comment xml:lang="pt_BR">Imagem de disco VHD</comment>
+ <comment xml:lang="pl">Obraz dysku VHD</comment>
+ <comment xml:lang="nl">VHD-schijfkopiebestand</comment>
+ <comment xml:lang="ko">VHD 디스크 이미지</comment>
+ <comment xml:lang="kk">VHD диск бейнесі</comment>
+ <comment xml:lang="ja">VHD ディスクイメージ</comment>
+ <comment xml:lang="it">Immagine disco VHD</comment>
+ <comment xml:lang="hr">VHD slika diska</comment>
+ <comment xml:lang="fi">VHD-levykuva</comment>
+ <comment xml:lang="eu">VHD disko-irudia</comment>
+ <comment xml:lang="es">imagen de disco VHD</comment>
+ <comment xml:lang="en_GB">VHD disk image</comment>
+ <comment xml:lang="de">VHD-Datenträgerabbild</comment>
+ <comment xml:lang="be">вобраз дыска VHD</comment>
+ <comment xml:lang="ar">صورة قرص VHD</comment>
+ <acronym>VHD</acronym>
+ <expanded-acronym>Virtual Hard Disk</expanded-acronym>
+ <glob pattern="*.vhd"/>
+ <glob pattern="*.vpc"/>
+ <magic>
+ <match type="string" value="conectix" offset="0"/>
+ </magic>
+ <alias type="application/x-virtualbox-vhd"/>
+ </mime-type>
+ <mime-type type="application/x-vhdx-disk">
+ <comment>VHDX disk image</comment>
+ <comment xml:lang="zh_TW">VHDX 磁碟映像檔</comment>
+ <comment xml:lang="zh_CN">VHDX 磁盘映像</comment>
+ <comment xml:lang="uk">образ диска VHDX</comment>
+ <comment xml:lang="tr">VHDX disk görüntüsü</comment>
+ <comment xml:lang="sv">VHDX-diskavbildning</comment>
+ <comment xml:lang="sl">Slika diska VHDX</comment>
+ <comment xml:lang="si">VHDX තැටි රූපය</comment>
+ <comment xml:lang="ru">Образ диска VHDX</comment>
+ <comment xml:lang="pt_BR">Imagem de disco VHDX</comment>
+ <comment xml:lang="pl">Obraz dysku VHDX</comment>
+ <comment xml:lang="nl">VHDX-schijfkopiebestand</comment>
+ <comment xml:lang="ko">VHDX 디스크 이미지</comment>
+ <comment xml:lang="kk">VHDX диск бейнесі</comment>
+ <comment xml:lang="ja">VHDX ディスクイメージ</comment>
+ <comment xml:lang="it">Immagine disco VHDX</comment>
+ <comment xml:lang="hr">VHDX slika diska</comment>
+ <comment xml:lang="fi">VHDX-levykuva</comment>
+ <comment xml:lang="eu">VHDX disko-irudia</comment>
+ <comment xml:lang="es">imagen de disco VHDX</comment>
+ <comment xml:lang="en_GB">VHDX disk image</comment>
+ <comment xml:lang="de">VHDX-Datenträgerabbild</comment>
+ <comment xml:lang="be">вобраз дыска VHDX</comment>
+ <comment xml:lang="ar">صورة قرص VHDX</comment>
+ <acronym>VHDX</acronym>
+ <expanded-acronym>Virtual Hard Disk v2</expanded-acronym>
+ <glob pattern="*.vhdx"/>
+ <magic>
+ <match type="string" value="vhdxfile" offset="0"/>
+ </magic>
+ <alias type="application/x-virtualbox-vhdx"/>
+ </mime-type>
+ <mime-type type="application/x-vmdk-disk">
+ <comment>VMDK disk image</comment>
+ <comment xml:lang="zh_TW">VMDK 磁碟映像檔</comment>
+ <comment xml:lang="zh_CN">VMDK 磁盘映像</comment>
+ <comment xml:lang="uk">образ диска VMDK</comment>
+ <comment xml:lang="tr">VMDK disk görüntüsü</comment>
+ <comment xml:lang="sv">VMDK-diskavbildning</comment>
+ <comment xml:lang="sl">Slika diska VMDK</comment>
+ <comment xml:lang="si">VMDK තැටි රූපය</comment>
+ <comment xml:lang="ru">Образ диска VMDK</comment>
+ <comment xml:lang="pt_BR">Imagem de disco VMDK</comment>
+ <comment xml:lang="pl">Obraz dysku VMDK</comment>
+ <comment xml:lang="nl">VMDK-schijfkopiebestand</comment>
+ <comment xml:lang="ko">VMDK 디스크 이미지</comment>
+ <comment xml:lang="kk">VMDK диск бейнесі</comment>
+ <comment xml:lang="ja">VMDK ディスクイメージ</comment>
+ <comment xml:lang="it">Immagine disco VMDK</comment>
+ <comment xml:lang="hr">VMDK slika diska</comment>
+ <comment xml:lang="fi">VMDK-levykuva</comment>
+ <comment xml:lang="eu">VMDK disko-irudia</comment>
+ <comment xml:lang="es">imagen de disco VMDK</comment>
+ <comment xml:lang="en_GB">VMDK disk image</comment>
+ <comment xml:lang="de">VMDK-Datenträgerabbild</comment>
+ <comment xml:lang="be">вобраз дыска VMDK</comment>
+ <comment xml:lang="ar">صورة قرص VMDK</comment>
+ <acronym>VMDK</acronym>
+ <expanded-acronym>Virtual Machine Disk</expanded-acronym>
+ <glob pattern="*.vmdk"/>
+ <magic>
+ <match type="string" value="KDMV\x01\x00\x00\x00" offset="0"/>
+ <match type="string" value="KDMV\x02\x00\x00\x00" offset="0"/>
+ </magic>
+ <alias type="application/x-virtualbox-vmdk"/>
+ </mime-type>
+ <mime-type type="application/x-vdi-disk">
+ <comment>VDI disk image</comment>
+ <comment xml:lang="zh_TW">VDI 磁碟映像檔</comment>
+ <comment xml:lang="zh_CN">VDI 磁盘映像</comment>
+ <comment xml:lang="uk">образ диска VDI</comment>
+ <comment xml:lang="tr">VDI disk görüntüsü</comment>
+ <comment xml:lang="sv">VDI-diskavbildning</comment>
+ <comment xml:lang="sl">Slika diska VDI</comment>
+ <comment xml:lang="si">VDI තැටි රූපය</comment>
+ <comment xml:lang="ru">Образ диска VDI</comment>
+ <comment xml:lang="pt_BR">Imagem de disco VDI</comment>
+ <comment xml:lang="pl">Obraz dysku VDI</comment>
+ <comment xml:lang="nl">VDI-schijfkopiebestand</comment>
+ <comment xml:lang="ko">VDI 디스크 이미지</comment>
+ <comment xml:lang="kk">VDI диск бейнесі</comment>
+ <comment xml:lang="ja">VDI ディスクイメージ</comment>
+ <comment xml:lang="it">Immagine disco VDI</comment>
+ <comment xml:lang="hr">VDI slika diska</comment>
+ <comment xml:lang="fi">VDI-levykuva</comment>
+ <comment xml:lang="eu">VDI disko-irudia</comment>
+ <comment xml:lang="es">imagen de disco VDI</comment>
+ <comment xml:lang="en_GB">VDI disk image</comment>
+ <comment xml:lang="de">VDI-Datenträgerabbild</comment>
+ <comment xml:lang="be">вобраз дыска VDI</comment>
+ <comment xml:lang="ar">صورة قرص VDI</comment>
+ <acronym>VDI</acronym>
+ <expanded-acronym>Virtual Disk Image</expanded-acronym>
+ <glob pattern="*.vdi"/>
+ <magic>
+ <match type="string" value="&lt;&lt;&lt; QEMU VM Virtual Disk Image &gt;&gt;&gt;\n" offset="0"/>
+ <match type="string" value="&lt;&lt;&lt; Oracle VM VirtualBox Disk Image &gt;&gt;&gt;\n" offset="0"/>
+ <match type="string" value="&lt;&lt;&lt; Sun VirtualBox Disk Image &gt;&gt;&gt;\n" offset="0"/>
+ <match type="string" value="&lt;&lt;&lt; Sun xVM VirtualBox Disk Image &gt;&gt;&gt;\n" offset="0"/>
+ <match type="string" value="&lt;&lt;&lt; innotek VirtualBox Disk Image &gt;&gt;&gt;" offset="0"/>
+ <match type="string" value="&lt;&lt;&lt; CloneVDI VirtualBox Disk Image &gt;&gt;&gt;\n" offset="0"/>
+ </magic>
+ <alias type="application/x-virtualbox-vdi"/>
+ </mime-type>
<mime-type type="application/x-appleworks-document">
<comment>AppleWorks document</comment>
- <comment xml:lang="ca">document AppleWorks</comment>
- <comment xml:lang="da">AppleWorks-dokument</comment>
- <comment xml:lang="de">AppleWorks-Dokument</comment>
- <comment xml:lang="en-GB">AppleWorks document</comment>
- <comment xml:lang="es">documento de AppleWorks</comment>
- <comment xml:lang="fi">AppleWorks-asiakirja</comment>
- <comment xml:lang="fr">document AppleWorks</comment>
- <comment xml:lang="hr">AppleWorks dokument</comment>
- <comment xml:lang="hu">AppleWorks-dokumentum</comment>
- <comment xml:lang="id">Dokumen AppleWorks</comment>
- <comment xml:lang="it">Documento AppleWorks</comment>
- <comment xml:lang="kk">AppleWorks құжаты</comment>
- <comment xml:lang="ko">AppleWorks 문서</comment>
- <comment xml:lang="pl">Dokument AppleWorks</comment>
- <comment xml:lang="pt-BR">Documento AppleWorks</comment>
- <comment xml:lang="ru">Документ AppleWorks</comment>
- <comment xml:lang="sl">Dokument AppleWorks</comment>
- <comment xml:lang="sv">AppleWorks-dokument</comment>
- <comment xml:lang="tr">AppleWorks belgesi</comment>
+ <comment xml:lang="zh_TW">AppleWorks 文件</comment>
+ <comment xml:lang="zh_CN">AppleWorks 文档</comment>
<comment xml:lang="uk">документ AppleWorks</comment>
- <comment xml:lang="zh-CN">AppleWorks 文档</comment>
- <comment xml:lang="zh-TW">AppleWorks 文件</comment>
+ <comment xml:lang="tr">AppleWorks belgesi</comment>
+ <comment xml:lang="sv">AppleWorks-dokument</comment>
+ <comment xml:lang="sl">Dokument AppleWorks</comment>
+ <comment xml:lang="si">AppleWorks ලේඛනය</comment>
+ <comment xml:lang="ru">Документ AppleWorks</comment>
+ <comment xml:lang="pt_BR">Documento AppleWorks</comment>
+ <comment xml:lang="pl">Dokument AppleWorks</comment>
+ <comment xml:lang="oc">document AppleWorks</comment>
+ <comment xml:lang="nl">AppleWorks-document</comment>
+ <comment xml:lang="ko">AppleWorks 문서</comment>
+ <comment xml:lang="kk">AppleWorks құжаты</comment>
+ <comment xml:lang="ja">AppleWorks ドキュメント</comment>
+ <comment xml:lang="it">Documento AppleWorks</comment>
+ <comment xml:lang="is">AppleWorks skjal</comment>
+ <comment xml:lang="id">Dokumen AppleWorks</comment>
+ <comment xml:lang="hu">AppleWorks-dokumentum</comment>
+ <comment xml:lang="hr">AppleWorks dokument</comment>
+ <comment xml:lang="he">מסמך AppleWorks</comment>
+ <comment xml:lang="fr">document AppleWorks</comment>
+ <comment xml:lang="fi">AppleWorks-asiakirja</comment>
+ <comment xml:lang="eu">AppleWorks dokumentua</comment>
+ <comment xml:lang="es">documento de AppleWorks</comment>
+ <comment xml:lang="en_GB">AppleWorks document</comment>
+ <comment xml:lang="de">AppleWorks-Dokument</comment>
+ <comment xml:lang="da">AppleWorks-dokument</comment>
+ <comment xml:lang="ca">document AppleWorks</comment>
+ <comment xml:lang="be">дакумент AppleWorks</comment>
+ <comment xml:lang="ar">مستند AppleWorks</comment>
<generic-icon name="x-office-document"/>
<glob pattern="*.cwk"/>
</mime-type>
-
<mime-type type="application/x-bps-patch">
<comment>BPS patch</comment>
- <comment xml:lang="ca">pedaç de BPS</comment>
- <comment xml:lang="da">BPS-rettelse</comment>
- <comment xml:lang="de">BPS-Patch</comment>
- <comment xml:lang="en-GB">BPS patch</comment>
- <comment xml:lang="es">parche BPS</comment>
- <comment xml:lang="fi">BPS-korjaus</comment>
- <comment xml:lang="fr">correctif BPS</comment>
- <comment xml:lang="hr">BPS zakrpa</comment>
- <comment xml:lang="hu">BPS javítócsomag</comment>
- <comment xml:lang="id">Patch BPS</comment>
- <comment xml:lang="it">Patch BPS</comment>
- <comment xml:lang="kk">BPS өзгерісі</comment>
- <comment xml:lang="ko">BPS 패치</comment>
- <comment xml:lang="pl">Łata BPS</comment>
- <comment xml:lang="pt-BR">Patch BPS</comment>
- <comment xml:lang="ru">Патч BPS</comment>
- <comment xml:lang="sv">BPS patch</comment>
- <comment xml:lang="tr">BPS yaması</comment>
+ <comment xml:lang="zh_TW">BPS 修補檔</comment>
+ <comment xml:lang="zh_CN">BPS 补丁</comment>
<comment xml:lang="uk">латка BPS</comment>
- <comment xml:lang="zh-CN">BPS 补丁</comment>
- <comment xml:lang="zh-TW">BPS 修補檔</comment>
+ <comment xml:lang="tr">BPS yaması</comment>
+ <comment xml:lang="sv">BPS-patch</comment>
+ <comment xml:lang="sl">Popravek BPS</comment>
+ <comment xml:lang="si">BPS පැච්</comment>
+ <comment xml:lang="sk">Záplata BPS</comment>
+ <comment xml:lang="ru">Патч BPS</comment>
+ <comment xml:lang="pt_BR">Patch BPS</comment>
+ <comment xml:lang="pl">Łata BPS</comment>
+ <comment xml:lang="nl">BPS-patch</comment>
+ <comment xml:lang="ko">BPS 패치</comment>
+ <comment xml:lang="kk">BPS өзгерісі</comment>
+ <comment xml:lang="ja">BPS パッチ</comment>
+ <comment xml:lang="it">Patch BPS</comment>
+ <comment xml:lang="is">BPS kóðabót</comment>
+ <comment xml:lang="id">Patch BPS</comment>
+ <comment xml:lang="hu">BPS javítócsomag</comment>
+ <comment xml:lang="hr">BPS zakrpa</comment>
+ <comment xml:lang="he">טלאי BPS</comment>
+ <comment xml:lang="fr">correctif BPS</comment>
+ <comment xml:lang="fi">BPS-korjaus</comment>
+ <comment xml:lang="es">parche BPS</comment>
+ <comment xml:lang="en_GB">BPS patch</comment>
+ <comment xml:lang="de">BPS-Patch</comment>
+ <comment xml:lang="da">BPS-rettelse</comment>
+ <comment xml:lang="ca">pedaç de BPS</comment>
+ <comment xml:lang="be">патч BPS</comment>
+ <comment xml:lang="ar">رقعة BPS</comment>
<acronym>BPS</acronym>
<expanded-acronym>Binary Patching System</expanded-acronym>
<glob pattern="*.bps"/>
@@ -42922,30 +44347,37 @@ command to generate the output files.
<match type="string" value="BPS1" offset="0"/>
</magic>
</mime-type>
-
<mime-type type="application/x-ips-patch">
<comment>IPS patch</comment>
- <comment xml:lang="ca">pedaç d'IPS</comment>
- <comment xml:lang="da">IPS-rettelse</comment>
- <comment xml:lang="de">IPS-Patch</comment>
- <comment xml:lang="en-GB">IPS patch</comment>
- <comment xml:lang="es">parche IPS</comment>
- <comment xml:lang="fi">IPS-korjaus</comment>
- <comment xml:lang="fr">correctif IPS</comment>
- <comment xml:lang="hr">IPS zakrpa</comment>
- <comment xml:lang="hu">IPS javítócsomag</comment>
- <comment xml:lang="id">Patch IPS</comment>
- <comment xml:lang="it">Patch IPS</comment>
- <comment xml:lang="kk">IPS өзгерісі</comment>
- <comment xml:lang="ko">IPS 패치</comment>
- <comment xml:lang="pl">Łata IPS</comment>
- <comment xml:lang="pt-BR">Patch IPS</comment>
- <comment xml:lang="ru">Патч IPS</comment>
- <comment xml:lang="sv">IPS patch</comment>
- <comment xml:lang="tr">IPS yaması</comment>
+ <comment xml:lang="zh_TW">IPS 修補檔</comment>
+ <comment xml:lang="zh_CN">IPS 补丁</comment>
<comment xml:lang="uk">латка IPS</comment>
- <comment xml:lang="zh-CN">IPS 补丁</comment>
- <comment xml:lang="zh-TW">IPS 修補檔</comment>
+ <comment xml:lang="tr">IPS yaması</comment>
+ <comment xml:lang="sv">IPS-patch</comment>
+ <comment xml:lang="sl">Popravek IPS</comment>
+ <comment xml:lang="si">IPS පැච්</comment>
+ <comment xml:lang="ru">Патч IPS</comment>
+ <comment xml:lang="pt_BR">Patch IPS</comment>
+ <comment xml:lang="pl">Łata IPS</comment>
+ <comment xml:lang="nl">IPS-patch</comment>
+ <comment xml:lang="ko">IPS 패치</comment>
+ <comment xml:lang="kk">IPS өзгерісі</comment>
+ <comment xml:lang="ja">IPS パッチ</comment>
+ <comment xml:lang="it">Patch IPS</comment>
+ <comment xml:lang="is">IPS kóðabót</comment>
+ <comment xml:lang="id">Patch IPS</comment>
+ <comment xml:lang="hu">IPS javítócsomag</comment>
+ <comment xml:lang="hr">IPS zakrpa</comment>
+ <comment xml:lang="he">טלאי IPS</comment>
+ <comment xml:lang="fr">correctif IPS</comment>
+ <comment xml:lang="fi">IPS-korjaus</comment>
+ <comment xml:lang="es">parche IPS</comment>
+ <comment xml:lang="en_GB">IPS patch</comment>
+ <comment xml:lang="de">IPS-Patch</comment>
+ <comment xml:lang="da">IPS-rettelse</comment>
+ <comment xml:lang="ca">pedaç d'IPS</comment>
+ <comment xml:lang="be">патч IPS</comment>
+ <comment xml:lang="ar">رقعة IPS</comment>
<acronym>IPS</acronym>
<expanded-acronym>International Patching System</expanded-acronym>
<glob pattern="*.ips"/>
@@ -42953,24 +44385,37 @@ command to generate the output files.
<match type="string" value="PATCH" offset="0"/>
</magic>
</mime-type>
-
<mime-type type="application/x-pyspread-spreadsheet">
<comment>Pyspread spreadsheet</comment>
- <comment xml:lang="ca">full de càlcul de Pyspread</comment>
- <comment xml:lang="da">Pyspread-regneark</comment>
- <comment xml:lang="de">Pyspread-Tabelle</comment>
- <comment xml:lang="en-GB">Pyspread spreadsheet</comment>
- <comment xml:lang="es">hoja de cálculo de Pyspread</comment>
- <comment xml:lang="fi">Pyspread-taulukko</comment>
- <comment xml:lang="fr">feuille de calcul Pyspread</comment>
- <comment xml:lang="hr">Pyspread proračunska tablica</comment>
- <comment xml:lang="it">Foglio di calcolo Pyspread</comment>
- <comment xml:lang="pl">Arkusz pyspread</comment>
- <comment xml:lang="pt-BR">Planilha do Pyspread</comment>
+ <comment xml:lang="zh_TW">Pyspread 試算表</comment>
+ <comment xml:lang="zh_CN">Pyspread 电子表格</comment>
+ <comment xml:lang="uk">електронна таблиця Pyspread</comment>
+ <comment xml:lang="tr">Pyspread hesap çizelgesi</comment>
<comment xml:lang="sv">Pyspread-kalkylblad</comment>
- <comment xml:lang="uk">ел. таблиця Pyspread</comment>
- <comment xml:lang="zh-CN">Pyspread 电子表格</comment>
- <comment xml:lang="zh-TW">Pyspread 試算表</comment>
+ <comment xml:lang="sl">Preglednica Pyspread</comment>
+ <comment xml:lang="si">Pyspread පැතුරුම්පත</comment>
+ <comment xml:lang="ru">Электронная таблица Pyspread</comment>
+ <comment xml:lang="pt_BR">Planilha do Pyspread</comment>
+ <comment xml:lang="pl">Arkusz pyspread</comment>
+ <comment xml:lang="nl">Pyspread werkblad</comment>
+ <comment xml:lang="ko">Pyspread 스프레드시트</comment>
+ <comment xml:lang="kk">Pyspread электрондық кестесі</comment>
+ <comment xml:lang="ja">Pyspread スプレッドシート</comment>
+ <comment xml:lang="it">Foglio di calcolo Pyspread</comment>
+ <comment xml:lang="is">Pyspread töflureikniskjal</comment>
+ <comment xml:lang="id">lembar kerja Pyspread</comment>
+ <comment xml:lang="hu">Pyspread-munkafüzet</comment>
+ <comment xml:lang="hr">Pyspread proračunska tablica</comment>
+ <comment xml:lang="he">גיליון Pyspread</comment>
+ <comment xml:lang="fr">feuille de calcul Pyspread</comment>
+ <comment xml:lang="fi">Pyspread-taulukko</comment>
+ <comment xml:lang="es">hoja de cálculo de Pyspread</comment>
+ <comment xml:lang="en_GB">Pyspread spreadsheet</comment>
+ <comment xml:lang="de">Pyspread-Tabelle</comment>
+ <comment xml:lang="da">Pyspread-regneark</comment>
+ <comment xml:lang="ca">full de càlcul de Pyspread</comment>
+ <comment xml:lang="be">электронная табліца Pyspread</comment>
+ <comment xml:lang="ar">ورقة عمل Pyspread</comment>
<glob pattern="*.pysu"/>
<magic>
<match type="string" value="[Pyspread save file version]" offset="0"/>
@@ -42978,65 +44423,128 @@ command to generate the output files.
<generic-icon name="x-office-spreadsheet"/>
</mime-type>
<mime-type type="application/x-pyspread-bz-spreadsheet">
- <comment>Pyspread spreadsheet (bzip-compressed)</comment>
- <comment xml:lang="ca">full de càlcul de Pyspread (amb compressió bzip)</comment>
- <comment xml:lang="da">Pyspread-regneark (bzip-komprimeret)</comment>
- <comment xml:lang="de">Pyspread-Tabelle (bzip-komprimiert)</comment>
- <comment xml:lang="en-GB">Pyspread spreadsheet (bzip-compressed)</comment>
- <comment xml:lang="es">hoja de cálculo de Pyspread (comprimida con bzip)</comment>
- <comment xml:lang="fi">Pyspread-taulukko (bzip-pakattu)</comment>
- <comment xml:lang="fr">feuille de calcul Pyspread (compressée bzip)</comment>
- <comment xml:lang="hr">Pyspread proračunska tablica (bzip sažeta)</comment>
- <comment xml:lang="it">Foglio di calcolo Pyspread (compresso con bzip)</comment>
- <comment xml:lang="pl">Arkusz pyspread (kompresja bzip)</comment>
- <comment xml:lang="pt-BR">Planilha do Pyspread (compactada com bzip)</comment>
- <comment xml:lang="sv">Pyspread-kalkylblad (bzip-komprimerat)</comment>
- <comment xml:lang="uk">ел. таблиця Pyspread (стиснена bzip)</comment>
- <comment xml:lang="zh-CN">Pyspread 电子表格(bzip 压缩)</comment>
- <comment xml:lang="zh-TW">Pyspread 試算表 (bzip 壓縮)</comment>
- <sub-class-of type="application/x-bzip"/>
+ <comment>Pyspread spreadsheet (bzip2-compressed)</comment>
+ <comment xml:lang="uk">електронна таблиця Pyspread (стиснена bzip2)</comment>
+ <comment xml:lang="sv">Pyspread-kalkylblad (bzip2-komprimerat)</comment>
+ <comment xml:lang="ru">Электронная таблица Pyspread (сжатая bzip2)</comment>
+ <comment xml:lang="pl">Arkusz pyspread (kompresja bzip2)</comment>
+ <comment xml:lang="es">hoja de cálculo de Pyspread (comprimida con BZIP2)</comment>
+ <comment xml:lang="de">Pyspread-Tabelle (bzip2-komprimiert)</comment>
+ <sub-class-of type="application/x-bzip2"/>
<glob pattern="*.pys"/>
<generic-icon name="x-office-spreadsheet"/>
</mime-type>
-
<mime-type type="text/x-kotlin">
<comment>Kotlin source code</comment>
- <comment xml:lang="ca">codi font en Kotlin</comment>
- <comment xml:lang="da">Kotlin-kildekode</comment>
- <comment xml:lang="de">Kotlin-Quelltext</comment>
- <comment xml:lang="en-GB">Kotlin source code</comment>
- <comment xml:lang="es">código fuente en Kotlin</comment>
- <comment xml:lang="fi">Kotlin-lähdekoodi</comment>
- <comment xml:lang="fr">code source Kotlin</comment>
- <comment xml:lang="hr">Kotlin izvorni kôd</comment>
- <comment xml:lang="it">Codice sorgente Kotlin</comment>
- <comment xml:lang="pl">Kod źródłowy Kotlin</comment>
- <comment xml:lang="pt-BR">Código-fonte Kotlin</comment>
+ <comment xml:lang="zh_TW">Kotlin 原始碼</comment>
+ <comment xml:lang="zh_CN">Kotlin 源代码</comment>
+ <comment xml:lang="uk">початковий код мовою Kotlin</comment>
+ <comment xml:lang="tr">Kotlin kaynak kodu</comment>
<comment xml:lang="sv">Kotlin-källkod</comment>
- <comment xml:lang="uk">вихідний код мовою Kotlin</comment>
- <comment xml:lang="zh-CN">Kotlin 源代码</comment>
- <comment xml:lang="zh-TW">Kotlin 源碼</comment>
+ <comment xml:lang="sl">Izvorna koda Kotlin</comment>
+ <comment xml:lang="si">Kotlin මූල කේතය</comment>
+ <comment xml:lang="ru">Исходный код Kotlin</comment>
+ <comment xml:lang="pt_BR">Código-fonte Kotlin</comment>
+ <comment xml:lang="pl">Kod źródłowy Kotlin</comment>
+ <comment xml:lang="oc">còdi font Kotlin</comment>
+ <comment xml:lang="nl">Kotlin-broncode</comment>
+ <comment xml:lang="ko">Kotlin 소스 코드</comment>
+ <comment xml:lang="kk">Kotlin бастапқы коды</comment>
+ <comment xml:lang="ja">Kotlin ソースコード</comment>
+ <comment xml:lang="it">Codice sorgente Kotlin</comment>
+ <comment xml:lang="is">Kotlin frumkóði</comment>
+ <comment xml:lang="id">kode sumber Kotlin</comment>
+ <comment xml:lang="hu">Kotlin forráskód</comment>
+ <comment xml:lang="hr">Kotlin izvorni kôd</comment>
+ <comment xml:lang="he">קוד מקור של Kotlin</comment>
+ <comment xml:lang="gl">Código fonte en Kotlin</comment>
+ <comment xml:lang="fr">code source Kotlin</comment>
+ <comment xml:lang="fi">Kotlin-lähdekoodi</comment>
+ <comment xml:lang="es">código fuente en Kotlin</comment>
+ <comment xml:lang="en_GB">Kotlin source code</comment>
+ <comment xml:lang="de">Kotlin-Quelltext</comment>
+ <comment xml:lang="da">Kotlin-kildekode</comment>
+ <comment xml:lang="ca">codi font en Kotlin</comment>
+ <comment xml:lang="be">зыходны код Kotlin</comment>
+ <comment xml:lang="ar">شفرة مصدر Kotlin</comment>
<sub-class-of type="text/plain"/>
<glob pattern="*.kt"/>
</mime-type>
-
+ <mime-type type="text/x-devicetree-source">
+ <comment>Devicetree source code</comment>
+ <comment xml:lang="uk">початковий код devicetree</comment>
+ <comment xml:lang="sv">Enhetsträdskällkod</comment>
+ <comment xml:lang="ru">Исходный код Devicetree</comment>
+ <comment xml:lang="pl">Kod źródłowy DeviceTree</comment>
+ <comment xml:lang="it">Codice sorgente Devicetree</comment>
+ <comment xml:lang="gl">Código fonte en Devicetree</comment>
+ <comment xml:lang="es">código fuente de árbol de dispositivos</comment>
+ <comment xml:lang="de">Gerätebaum-Quelltext</comment>
+ <comment xml:lang="be">зыходны код Devicetree</comment>
+ <acronym>DTS</acronym>
+ <expanded-acronym>Device Tree Source</expanded-acronym>
+ <sub-class-of type="text/plain"/>
+ <glob pattern="*.dts"/>
+ <glob pattern="*.dtsi"/>
+ <magic>
+ <match type="string" mask="0x8080" value="\000\000" offset="0">
+ <match type="string" value="/dts-v1/" offset="0:4080"/>
+ </match>
+ </magic>
+ <magic priority="40">
+ <match type="string" mask="0x8080" value="\000\000" offset="0">
+ <match type="string" value="/ {" offset="0:4090"/>
+ <match type="string" value="include " offset="0:4080">
+ <match type="string" value=".dts" offset="10:4090"/>
+ </match>
+ </match>
+ </magic>
+ </mime-type>
+ <mime-type type="text/x-devicetree-binary">
+ <comment>Flattened Devicetree</comment>
+ <comment xml:lang="uk">зведене Devicetree</comment>
+ <comment xml:lang="sv">Utplattat enhetsträd</comment>
+ <comment xml:lang="ru">Плоское дерево устройств</comment>
+ <comment xml:lang="pl">Spłaszczone DeviceTree</comment>
+ <comment xml:lang="it">Devicetree compatto</comment>
+ <comment xml:lang="es">árbol de dispositivos aplanado</comment>
+ <comment xml:lang="de">Verflachter Gerätebaum</comment>
+ <acronym>DTB</acronym>
+ <expanded-acronym>Device Tree Binary</expanded-acronym>
+ <glob pattern="*.dtb"/>
+ <magic>
+ <match type="big32" value="0xd00dfeed" offset="0"/>
+ </magic>
+ </mime-type>
<mime-type type="image/avif">
- <comment>AV1 Image File Format (AVIF)</comment>
- <comment xml:lang="ca">format de fitxer d'imatge AV1 (AVIF)</comment>
- <comment xml:lang="da">AV1-billedfilformat (AVIF)</comment>
- <comment xml:lang="de">AV1-Bilddateiformat (AVIF)</comment>
- <comment xml:lang="en-GB">AV1 Image File Format (AVIF)</comment>
- <comment xml:lang="es">formato de archivo de imagen AV1 (AVIF)</comment>
- <comment xml:lang="fi">AV1-kuvatiedostomuoto (AVIF)</comment>
- <comment xml:lang="hr">AV1 format datoteke slike (AVIF)</comment>
- <comment xml:lang="it">AV1 Image File Format (AVIF)</comment>
- <comment xml:lang="pl">Format pliku obrazu AV1 (AVIF)</comment>
- <comment xml:lang="pt-BR">Formato de arquivo de imagem AV1 (AVIF)</comment>
- <comment xml:lang="sv">AV1-bildfilformat (AVIF)</comment>
- <comment xml:lang="uk">формат файлів зображень AV1 (AVIF)</comment>
- <comment xml:lang="zh-CN">AV1 图像文件格式(AVIF)</comment>
- <comment xml:lang="zh-TW">AV1 影像檔案格式 (AVIF)</comment>
- <magic priority="50">
+ <comment>AVIF image</comment>
+ <comment xml:lang="zh_TW">AVIF 影像</comment>
+ <comment xml:lang="zh_CN">AVIF 图像</comment>
+ <comment xml:lang="uk">зображення AVIF</comment>
+ <comment xml:lang="tr">AVIF görüntüsü</comment>
+ <comment xml:lang="sv">AVIF-bild</comment>
+ <comment xml:lang="sl">Slika AVIF</comment>
+ <comment xml:lang="si">AVIF රූපය</comment>
+ <comment xml:lang="ru">Изображение AVIF</comment>
+ <comment xml:lang="pt_BR">Imagem AVIF</comment>
+ <comment xml:lang="pl">Obraz AVIF</comment>
+ <comment xml:lang="oc">imatge AVIF</comment>
+ <comment xml:lang="nl">AVIF-afbeelding</comment>
+ <comment xml:lang="ko">AVIF 그림</comment>
+ <comment xml:lang="kk">AVIF суреті</comment>
+ <comment xml:lang="ja">AVIF 画像</comment>
+ <comment xml:lang="it">Immagine AVIF</comment>
+ <comment xml:lang="hr">AVIF slika</comment>
+ <comment xml:lang="fi">AVIF-kuva</comment>
+ <comment xml:lang="eu">AVIF irudia</comment>
+ <comment xml:lang="es">imagen AVIF</comment>
+ <comment xml:lang="en_GB">AVIF image</comment>
+ <comment xml:lang="de">AVIF-Bild</comment>
+ <comment xml:lang="be">выява AVIF</comment>
+ <comment xml:lang="ar">صورة AVIF</comment>
+ <acronym>AVIF</acronym>
+ <expanded-acronym>AV1 Image File Format</expanded-acronym>
+ <magic>
<match type="string" value="ftypavif" offset="4"/>
<match type="string" value="ftypavis" offset="4"/>
<match type="string" value="ftypmif1" offset="4">
@@ -43049,4 +44557,369 @@ command to generate the output files.
<glob pattern="*.avifs"/>
<alias type="image/avif-sequence"/>
</mime-type>
+ <mime-type type="image/qoi">
+ <comment>Quite OK Image Format</comment>
+ <comment xml:lang="uk">формат зображень Quite OK</comment>
+ <comment xml:lang="sv">Quite OK Image-format</comment>
+ <comment xml:lang="ru">Формат изображений Quite OK</comment>
+ <comment xml:lang="pl">Obraz QOI</comment>
+ <comment xml:lang="it">Formato immagine Quite OK</comment>
+ <comment xml:lang="es">formato de imagen Quite OK</comment>
+ <comment xml:lang="de">Quite-OK-Bildformat</comment>
+ <magic>
+ <match type="string" value="qoif" offset="0"/>
+ </magic>
+ <glob pattern="*.qoi"/>
+ </mime-type>
+ <mime-type type="video/vnd.radgamettools.bink">
+ <comment>Bink Video</comment>
+ <comment xml:lang="zh_CN">Bink 视频</comment>
+ <comment xml:lang="uk">відео Bink</comment>
+ <comment xml:lang="tr">Bink Videosu</comment>
+ <comment xml:lang="sv">Bink-video</comment>
+ <comment xml:lang="sl">Video Bink</comment>
+ <comment xml:lang="si">බින්ක් වීඩියෝව</comment>
+ <comment xml:lang="ru">Видео Bink</comment>
+ <comment xml:lang="pt_BR">Vídeo Bink</comment>
+ <comment xml:lang="pl">Plik wideo Bink</comment>
+ <comment xml:lang="nl">Bink-video</comment>
+ <comment xml:lang="ko">Bink 동영상</comment>
+ <comment xml:lang="kk">Bink видеосы</comment>
+ <comment xml:lang="ja">Bink 動画</comment>
+ <comment xml:lang="it">Video Bink</comment>
+ <comment xml:lang="hr">Bink video snimka</comment>
+ <comment xml:lang="fi">Bink Video</comment>
+ <comment xml:lang="eu">Bink bideoa</comment>
+ <comment xml:lang="es">vídeo BINK</comment>
+ <comment xml:lang="en_GB">Bink Video</comment>
+ <comment xml:lang="de">Bink-Video</comment>
+ <comment xml:lang="be">відэа Bink</comment>
+ <comment xml:lang="ar">فيديو Bink</comment>
+ <magic>
+ <match type="string" value="BIK" offset="0">
+ <match type="string" value="b" offset="3"/>
+ <match type="string" value="f" offset="3"/>
+ <match type="string" value="g" offset="3"/>
+ <match type="string" value="h" offset="3"/>
+ <match type="string" value="i" offset="3"/>
+ </match>
+ <match type="string" value="KB2" offset="0">
+ <match type="string" value="a" offset="3"/>
+ <match type="string" value="d" offset="3"/>
+ <match type="string" value="f" offset="3"/>
+ <match type="string" value="g" offset="3"/>
+ <match type="string" value="h" offset="3"/>
+ <match type="string" value="i" offset="3"/>
+ <match type="string" value="j" offset="3"/>
+ <match type="string" value="k" offset="3"/>
+ </match>
+ </magic>
+ <glob pattern="*.bik"/>
+ <glob pattern="*.bk2"/>
+ </mime-type>
+ <mime-type type="video/vnd.radgamettools.smacker">
+ <comment>Smacker Video</comment>
+ <comment xml:lang="zh_CN">Smacker 视频</comment>
+ <comment xml:lang="uk">відео Smacker</comment>
+ <comment xml:lang="tr">Smacker Videosu</comment>
+ <comment xml:lang="sv">Smacker-video</comment>
+ <comment xml:lang="sl">Video Smacker</comment>
+ <comment xml:lang="si">ස්මකර් වීඩියෝව</comment>
+ <comment xml:lang="ru">Видео Smacker</comment>
+ <comment xml:lang="pt_BR">Vídeo Smacker</comment>
+ <comment xml:lang="pl">Plik wideo Smacker</comment>
+ <comment xml:lang="nl">Smacker-video</comment>
+ <comment xml:lang="ko">Smacker 동영상</comment>
+ <comment xml:lang="kk">Smacker видеосы</comment>
+ <comment xml:lang="ja">Smacker 動画</comment>
+ <comment xml:lang="it">Video Smacker</comment>
+ <comment xml:lang="hr">Smacker video snimka</comment>
+ <comment xml:lang="fi">Smacker Video</comment>
+ <comment xml:lang="eu">Smacker bideoa</comment>
+ <comment xml:lang="es">vídeo Smacker</comment>
+ <comment xml:lang="en_GB">Smacker Video</comment>
+ <comment xml:lang="de">Smacker-Video</comment>
+ <comment xml:lang="be">відэа Smacker</comment>
+ <comment xml:lang="ar">فيديو Smacker</comment>
+ <magic>
+ <match type="string" value="SMK" offset="0">
+ <match type="string" value="2" offset="3"/>
+ <match type="string" value="4" offset="3"/>
+ </match>
+ </magic>
+ <glob pattern="*.smk"/>
+ </mime-type>
+ <mime-type type="text/org">
+ <comment>Org-mode file</comment>
+ <comment xml:lang="zh_CN">Org-mode 文件</comment>
+ <comment xml:lang="uk">файл Org-mode</comment>
+ <comment xml:lang="tr">Org-mode dosyası</comment>
+ <comment xml:lang="sv">Org-mode-fil</comment>
+ <comment xml:lang="sl">Datoteka org-mode</comment>
+ <comment xml:lang="si">Org-mode ගොනුව</comment>
+ <comment xml:lang="ru">Файл Org-mode</comment>
+ <comment xml:lang="pl">Plik Org-mode</comment>
+ <comment xml:lang="nl">Org-mode-bestand</comment>
+ <comment xml:lang="ko">Org-mode 파일</comment>
+ <comment xml:lang="kk">Org-mode файлы</comment>
+ <comment xml:lang="ja">Org-mode ファイル</comment>
+ <comment xml:lang="it">File Org-mode</comment>
+ <comment xml:lang="hr">Org-mode datoteka</comment>
+ <comment xml:lang="fi">Org-mode-tiedosto</comment>
+ <comment xml:lang="es">archivo modo Org</comment>
+ <comment xml:lang="en_GB">Org-mode file</comment>
+ <comment xml:lang="de">Org-mode-Datei</comment>
+ <comment xml:lang="be">файл Org-mode</comment>
+ <comment xml:lang="ar">ملف Org-mode</comment>
+ <sub-class-of type="text/plain"/>
+ <glob pattern="*.org"/>
+ </mime-type>
+ <mime-type type="application/x-openzim">
+ <comment>OpenZIM file</comment>
+ <comment xml:lang="zh_CN">OpenZIM 文件</comment>
+ <comment xml:lang="uk">файл OpenZIM</comment>
+ <comment xml:lang="tr">OpenZIM dosyası</comment>
+ <comment xml:lang="sv">OpenZIM-fil</comment>
+ <comment xml:lang="sl">Datoteka OpenZIM</comment>
+ <comment xml:lang="si">OpenZIM ගොනුව</comment>
+ <comment xml:lang="ru">Файл OpenZIM</comment>
+ <comment xml:lang="pt_BR">Arquivo OpenZIM</comment>
+ <comment xml:lang="pl">Plik OpenZIM</comment>
+ <comment xml:lang="oc">fichièr OpenZIM</comment>
+ <comment xml:lang="nl">OpenZIM-bestand</comment>
+ <comment xml:lang="ko">OpenZIM 파일</comment>
+ <comment xml:lang="kk">OpenZIM файлы</comment>
+ <comment xml:lang="ja">OpenZIM ファイル</comment>
+ <comment xml:lang="it">File OpenZIM</comment>
+ <comment xml:lang="hr">OpenZIM datoteka</comment>
+ <comment xml:lang="fi">OpenZIM-tiedosto</comment>
+ <comment xml:lang="eu">OpenZIM fitxategia</comment>
+ <comment xml:lang="es">archivo OpenZIM</comment>
+ <comment xml:lang="en_GB">OpenZIM file</comment>
+ <comment xml:lang="de">OpenZIM-Datei</comment>
+ <comment xml:lang="be">файл OpenZIM</comment>
+ <comment xml:lang="ar">ملف OpenZIM </comment>
+ <acronym>ZIM</acronym>
+ <expanded-acronym>Zeno IMproved</expanded-acronym>
+ <glob pattern="*.zim"/>
+ <magic>
+ <match type="string" value="\x5a\x49\x4d\x04" offset="0"/>
+ </magic>
+ </mime-type>
+ <mime-type type="application/sparql-query">
+ <comment>SPARQL query</comment>
+ <comment xml:lang="zh_CN">SPARQL 查询</comment>
+ <comment xml:lang="uk">запит SPARQL</comment>
+ <comment xml:lang="tr">SPARQL sorgusu</comment>
+ <comment xml:lang="sv">SPARQL-fråga</comment>
+ <comment xml:lang="sl">Poizvedba SPARQL</comment>
+ <comment xml:lang="si">SPARQL විමසුම</comment>
+ <comment xml:lang="ru">Запрос SPARQL</comment>
+ <comment xml:lang="pl">Zapytanie SPARQL</comment>
+ <comment xml:lang="nl">SPARQL-zoekopdracht</comment>
+ <comment xml:lang="ko">SPARQL 질의문</comment>
+ <comment xml:lang="kk">SPARQL сұранымы</comment>
+ <comment xml:lang="ka">SPARQL მოთხოვნა</comment>
+ <comment xml:lang="ja">SPARQL クエリー</comment>
+ <comment xml:lang="it">Ricerca SPARQL</comment>
+ <comment xml:lang="hr">SPARQL zahtjev</comment>
+ <comment xml:lang="he">שאילתת SPARQL</comment>
+ <comment xml:lang="fi">SPARQL-kysely</comment>
+ <comment xml:lang="eu">SPARQL kontsulta</comment>
+ <comment xml:lang="es">consulta SPARQL</comment>
+ <comment xml:lang="en_GB">SPARQL query</comment>
+ <comment xml:lang="de">SPARQL-Abfrage</comment>
+ <comment xml:lang="be">запыт SPARQL</comment>
+ <comment xml:lang="ar">استعلام SPARQL</comment>
+ <acronym>SPARQL</acronym>
+ <expanded-acronym>SPARQL Protocol and RDF Query Language</expanded-acronym>
+ <glob pattern="*.qs"/>
+ <magic priority="40">
+ <match type="string" value="PREFIX" offset="0"/>
+ </magic>
+ </mime-type>
+ <mime-type type="application/sparql-results+xml">
+ <comment>SPARQL query results</comment>
+ <comment xml:lang="zh_CN">SPARQL 查询结果</comment>
+ <comment xml:lang="uk">результати запиту SPARQL</comment>
+ <comment xml:lang="tr">SPARQL sorgu sonuçları</comment>
+ <comment xml:lang="sv">SPARQL-frågeresultat</comment>
+ <comment xml:lang="sl">Rezultati poizvedbe SPARQL</comment>
+ <comment xml:lang="si">SPARQL විමසුම් ප්රතිඵල</comment>
+ <comment xml:lang="ru">Результаты запроса SPARQL</comment>
+ <comment xml:lang="pl">Wyniki zapytania SPARQL</comment>
+ <comment xml:lang="nl">SPARQL-zoekopdrachtresultaten</comment>
+ <comment xml:lang="ko">SPARQL 질의문 결과</comment>
+ <comment xml:lang="kk">SPARQL сұраным нәтижелері</comment>
+ <comment xml:lang="ja">SPARQL クエリーの結果</comment>
+ <comment xml:lang="it">Risultati ricerca SPARQL</comment>
+ <comment xml:lang="hr">Rezultati SPARQL zahtjeva</comment>
+ <comment xml:lang="he">תוצאות שאילתת SPARQL</comment>
+ <comment xml:lang="fi">SPARQL-kyselyn tulokset</comment>
+ <comment xml:lang="eu">SPARQL kontsultaren emaitzak</comment>
+ <comment xml:lang="es">resultados de consulta SPARQL</comment>
+ <comment xml:lang="en_GB">SPARQL query results</comment>
+ <comment xml:lang="de">SPARQL-Abfrageergebnisse</comment>
+ <comment xml:lang="be">вынікі запыту SPARQL</comment>
+ <comment xml:lang="ar">نتائج استعلام SPARQL</comment>
+ <acronym>SPARQL</acronym>
+ <expanded-acronym>SPARQL Protocol and RDF Query Language</expanded-acronym>
+ <sub-class-of type="application/xml"/>
+ <root-XML namespaceURI="http://www.w3.org/2005/sparql-results#" localName="sparql"/>
+ <glob pattern="*.srx"/>
+ </mime-type>
+ <mime-type type="application/wasm">
+ <comment>WASM binary module</comment>
+ <comment xml:lang="uk">двійковий модуль WASM</comment>
+ <comment xml:lang="sv">WASM-binärmodul</comment>
+ <comment xml:lang="ru">Двоичный модуль WASM</comment>
+ <comment xml:lang="pl">Moduł binarny WASM</comment>
+ <comment xml:lang="es">módulo binario de WASM</comment>
+ <comment xml:lang="de">WASM-Binärmodul</comment>
+ <acronym>WASM</acronym>
+ <expanded-acronym>Web Assembly</expanded-acronym>
+ <glob pattern="*.wasm"/>
+ <magic>
+ <match type="string" value="\000asm" offset="0"/>
+ </magic>
+ </mime-type>
+ <mime-type type="application/x-openvpn-profile">
+ <comment>OpenVPN profile</comment>
+ <comment xml:lang="uk">профіль OpenVPN</comment>
+ <comment xml:lang="sv">OpenVPN-profil</comment>
+ <comment xml:lang="ru">Профиль OpenVPN</comment>
+ <comment xml:lang="pl">Profil OpenVPN</comment>
+ <comment xml:lang="it">Profilo OpenVPN</comment>
+ <comment xml:lang="es">perfil OpenVPN</comment>
+ <comment xml:lang="de">OpenVPN-Profil</comment>
+ <comment xml:lang="be">профіль OpenVPN</comment>
+ <sub-class-of type="text/plain"/>
+ <generic-icon name="text-x-generic"/>
+ <glob pattern="*.openvpn"/>
+ <glob pattern="*.ovpn"/>
+ </mime-type>
+ <mime-type type="application/x-modrinth-modpack+zip">
+ <comment>Modrinth Modpack</comment>
+ <comment xml:lang="uk">модпак Modrinth</comment>
+ <comment xml:lang="sv">Modrinth-moddpack</comment>
+ <comment xml:lang="ru">Модификационный пакет Modrinth</comment>
+ <comment xml:lang="pl">Pakiet modów Modrinth</comment>
+ <comment xml:lang="it">Modpack Modrinth</comment>
+ <comment xml:lang="es">paquete de modificaciones de Modrinth</comment>
+ <comment xml:lang="de">Modrinth-Modpack</comment>
+ <sub-class-of type="application/zip"/>
+ <generic-icon name="package-x-generic"/>
+ <glob pattern="*.mrpack"/>
+ </mime-type>
+ <mime-type type="application/cbor">
+ <comment>CBOR Data</comment>
+ <comment xml:lang="zh_TW">CBOR 資料</comment>
+ <comment xml:lang="uk">дані CBOR</comment>
+ <comment xml:lang="sv">CBOR-data</comment>
+ <comment xml:lang="ru">Данные CBOR</comment>
+ <comment xml:lang="pl">Dane CBOR</comment>
+ <comment xml:lang="it">Dati CBOR</comment>
+ <comment xml:lang="es">datos CBOR</comment>
+ <comment xml:lang="de">CBOR-Daten</comment>
+ <comment xml:lang="be">даныя CBOR</comment>
+ <acronym>CBOR</acronym>
+ <expanded-acronym>Concise Binary Object Representation</expanded-acronym>
+ <glob pattern="*.cbor"/>
+ </mime-type>
+ <mime-type type="application/x-eris-link+cbor">
+ <comment>ERIS Link</comment>
+ <comment xml:lang="uk">посилання ERIS</comment>
+ <comment xml:lang="sv">ERIS-länk</comment>
+ <comment xml:lang="ru">Ссылка ERIS</comment>
+ <comment xml:lang="pl">Dowiązanie ERIS</comment>
+ <comment xml:lang="it">Collegamento ERIS</comment>
+ <comment xml:lang="es">enlace ERIS</comment>
+ <comment xml:lang="de">ERIS-Verweis</comment>
+ <comment xml:lang="be">спасылка ERIS</comment>
+ <acronym>ERIS</acronym>
+ <expanded-acronym>Encoding for Robust Immutable Storage</expanded-acronym>
+ <sub-class-of type="application/cbor"/>
+ <glob pattern="*.eris"/>
+ <magic priority="90">
+ <match type="string" value="\xD9\xD9\xF7\x84\xD9\x01\x14\x58\x42" offset="0"/>
+ </magic>
+ </mime-type>
+ <mime-type type="application/vnd.gerber">
+ <comment>Gerber file</comment>
+ <comment xml:lang="uk">файл Gerber</comment>
+ <comment xml:lang="sv">Gerber-fil</comment>
+ <comment xml:lang="ru">Файл Gerber</comment>
+ <comment xml:lang="pl">Plik Gerber</comment>
+ <comment xml:lang="it">File Gerber</comment>
+ <comment xml:lang="es">archivo de Gerber</comment>
+ <comment xml:lang="de">Gerber-Datei</comment>
+ <comment xml:lang="be">файл Gerber</comment>
+ <sub-class-of type="text/plain"/>
+ <glob pattern="*.gbr"/>
+ <!--Try to match with some common opening commands-->
+ <magic>
+ <!--A comment line-->
+ <match type="string" value="G04 " offset="0"/>
+ <!--Some setup macros-->
+ <match type="string" value="%FSLA" offset="0"/>
+ <match type="string" value="%MO" offset="0"/>
+ <match type="string" value="%TF." offset="0"/>
+ <!--Seems to be common with files exported from some programs-->
+ <match type="string" value="G75*" offset="0"/>
+ </magic>
+ <generic-icon name="text-x-generic"/>
+ <!--Already being used as the MIME identifier by some programs-->
+ <alias type="application/x-gerber"/>
+ </mime-type>
+ <mime-type type="application/x-gerber-job">
+ <comment>Gerber job file</comment>
+ <comment xml:lang="uk">файл завдання Gerber</comment>
+ <comment xml:lang="sv">Gerber-jobbfil</comment>
+ <comment xml:lang="ru">Файл работ Gerber</comment>
+ <comment xml:lang="pl">Plik zadania Gerber</comment>
+ <comment xml:lang="it">File lavoro Gerber</comment>
+ <comment xml:lang="es">archivo de tarea de Gerber</comment>
+ <comment xml:lang="de">Gerber-Aufgabendatei</comment>
+ <comment xml:lang="be">працоўны файл Gerber</comment>
+ <sub-class-of type="application/json"/>
+ <glob pattern="*.gbrjob"/>
+ <generic-icon name="text-x-generic"/>
+ </mime-type>
+ <mime-type type="application/x-excellon">
+ <comment>Excellon drill file</comment>
+ <comment xml:lang="uk">файл drill Excellon</comment>
+ <comment xml:lang="sv">Excellon-borrfil</comment>
+ <comment xml:lang="ru">Файл Excellon drill</comment>
+ <comment xml:lang="pl">Plik wiercenia Excellon</comment>
+ <comment xml:lang="es">archivo de perforación de Excellon</comment>
+ <comment xml:lang="de">Excellon-Bohrdatei</comment>
+ <sub-class-of type="text/plain"/>
+ <glob pattern="*.drl"/>
+ <magic>
+ <!--This is always the header for an excellon drill file-->
+ <match type="string" value="M48\n" offset="0"/>
+ </magic>
+ <generic-icon name="text-x-generic"/>
+ </mime-type>
+ <mime-type type="application/x-tiled-tmx">
+ <comment>Tiled map files</comment>
+ <comment xml:lang="uk">файли мозаїчної карти</comment>
+ <comment xml:lang="sv">Tiled-kartfiler</comment>
+ <comment xml:lang="ru">Файлы карты Tiled</comment>
+ <comment xml:lang="pl">Pliki map Tiled</comment>
+ <comment xml:lang="es">archivos de mapa en mosaico</comment>
+ <comment xml:lang="de">Tiled-Kartendatei</comment>
+ <sub-class-of type="application/xml"/>
+ <glob pattern="*.tmx"/>
+ </mime-type>
+ <mime-type type="application/x-tiled-tsx">
+ <comment>Tiled tileset files</comment>
+ <comment xml:lang="uk">файл набору плиток мозаїки</comment>
+ <comment xml:lang="sv">Tiled-kartrutuppsättningsfiler</comment>
+ <comment xml:lang="ru">Файлы наборов плиток Tiled</comment>
+ <comment xml:lang="pl">Pliki zestawów kafli Tiled</comment>
+ <comment xml:lang="de">Tiled-Kartensetdatei</comment>
+ <sub-class-of type="application/xml"/>
+ <glob pattern="*.tsx"/>
+ </mime-type>
</mime-info>
diff --git a/src/corelib/mimetypes/mimetypes.qrc b/src/corelib/mimetypes/mimetypes.qrc
deleted file mode 100644
index 4720bd302a..0000000000
--- a/src/corelib/mimetypes/mimetypes.qrc
+++ /dev/null
@@ -1,5 +0,0 @@
-<RCC>
- <qresource prefix="/qt-project.org/qmime/packages">
- <file alias="freedesktop.org.xml" compression-algorithm="best">mime/packages/freedesktop.org.xml</file>
- </qresource>
-</RCC>
diff --git a/src/corelib/mimetypes/mimetypes_resources.cmake b/src/corelib/mimetypes/mimetypes_resources.cmake
index 4020f6c675..00fa4f5271 100644
--- a/src/corelib/mimetypes/mimetypes_resources.cmake
+++ b/src/corelib/mimetypes/mimetypes_resources.cmake
@@ -1,3 +1,6 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+
# List of files that need to be packaged as resources.
# This file exists solely because of unit tests that need access to this
# information as well. This was previously handled by referencing a qrc
diff --git a/src/corelib/mimetypes/qmimedatabase.cpp b/src/corelib/mimetypes/qmimedatabase.cpp
index f7cd926220..d52ccacbe7 100644
--- a/src/corelib/mimetypes/qmimedatabase.cpp
+++ b/src/corelib/mimetypes/qmimedatabase.cpp
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2015 Klaralvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author David Faure <david.faure@kdab.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2015 Klaralvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author David Faure <david.faure@kdab.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include <qplatformdefs.h> // always first
@@ -46,6 +10,7 @@
#include "qmimeprovider_p.h"
#include "qmimetype_p.h"
+#include <private/qduplicatetracker_p.h>
#include <private/qfilesystementry_p.h>
#include <QtCore/QFile>
@@ -61,6 +26,17 @@
QT_BEGIN_NAMESPACE
+using namespace Qt::StringLiterals;
+
+static QString directoryMimeType()
+{
+ return QStringLiteral("inode/directory");
+}
+static QString plainTextMimeType()
+{
+ return QStringLiteral("text/plain");
+}
+
Q_GLOBAL_STATIC(QMimeDatabasePrivate, staticQMimeDatabase)
QMimeDatabasePrivate *QMimeDatabasePrivate::instance()
@@ -69,7 +45,7 @@ QMimeDatabasePrivate *QMimeDatabasePrivate::instance()
}
QMimeDatabasePrivate::QMimeDatabasePrivate()
- : m_defaultMimeType(QLatin1String("application/octet-stream"))
+ : m_defaultMimeType(QStringLiteral("application/octet-stream"))
{
}
@@ -77,6 +53,7 @@ QMimeDatabasePrivate::~QMimeDatabasePrivate()
{
}
+Q_CONSTINIT
#ifdef QT_BUILD_INTERNAL
Q_CORE_EXPORT
#else
@@ -92,16 +69,21 @@ bool QMimeDatabasePrivate::shouldCheck()
return true;
}
-#if defined(Q_OS_UNIX) && !defined(Q_OS_NACL) && !defined(Q_OS_INTEGRITY)
+static QStringList locateMimeDirectories()
+{
+ return QStandardPaths::locateAll(QStandardPaths::GenericDataLocation, QStringLiteral("mime"), QStandardPaths::LocateDirectory);
+}
+
+#if defined(Q_OS_UNIX) && !defined(Q_OS_INTEGRITY)
# define QT_USE_MMAP
#endif
void QMimeDatabasePrivate::loadProviders()
{
// We use QStandardPaths every time to check if new files appeared
- const QStringList mimeDirs = QStandardPaths::locateAll(QStandardPaths::GenericDataLocation, QLatin1String("mime"), QStandardPaths::LocateDirectory);
+ const QStringList mimeDirs = locateMimeDirectories();
const auto fdoIterator = std::find_if(mimeDirs.constBegin(), mimeDirs.constEnd(), [](const QString &mimeDir) -> bool {
- return QFileInfo::exists(mimeDir + QStringLiteral("/packages/freedesktop.org.xml")); }
+ return QFileInfo::exists(mimeDir + "/packages/freedesktop.org.xml"_L1); }
);
const bool needInternalDB = QMimeXMLProvider::InternalDatabaseAvailable && fdoIterator == mimeDirs.constEnd();
//qDebug() << "mime dirs:" << mimeDirs;
@@ -112,7 +94,7 @@ void QMimeDatabasePrivate::loadProviders()
m_providers.reserve(mimeDirs.size() + (needInternalDB ? 1 : 0));
for (const QString &mimeDir : mimeDirs) {
- const QString cacheFile = mimeDir + QStringLiteral("/mime.cache");
+ const QString cacheFile = mimeDir + "/mime.cache"_L1;
// Check if we already have a provider for this dir
const auto predicate = [mimeDir](const std::unique_ptr<QMimeProviderBase> &prov)
{
@@ -160,6 +142,13 @@ void QMimeDatabasePrivate::loadProviders()
m_providers.push_back(std::move(*it));
}
}
+
+ auto it = m_providers.begin();
+ (*it)->setOverrideProvider(nullptr);
+ ++it;
+ const auto end = m_providers.end();
+ for (; it != end; ++it)
+ (*it)->setOverrideProvider((it - 1)->get());
}
const QMimeDatabasePrivate::Providers &QMimeDatabasePrivate::providers()
@@ -195,17 +184,16 @@ QMimeType QMimeDatabasePrivate::mimeTypeForName(const QString &nameOrAlias)
{
const QString mimeName = resolveAlias(nameOrAlias);
for (const auto &provider : providers()) {
- const QMimeType mime = provider->mimeTypeForName(mimeName);
- if (mime.isValid())
- return mime;
+ if (provider->knowsMimeType(mimeName))
+ return QMimeType(QMimeTypePrivate(mimeName));
}
return {};
}
QStringList QMimeDatabasePrivate::mimeTypeForFileName(const QString &fileName)
{
- if (fileName.endsWith(QLatin1Char('/')))
- return QStringList() << QLatin1String("inode/directory");
+ if (fileName.endsWith(u'/'))
+ return { directoryMimeType() };
const QMimeGlobMatchResult result = findByFileName(fileName);
QStringList matchingMimeTypes = result.m_matchingMimeTypes;
@@ -222,68 +210,68 @@ QMimeGlobMatchResult QMimeDatabasePrivate::findByFileName(const QString &fileNam
return result;
}
-void QMimeDatabasePrivate::loadMimeTypePrivate(QMimeTypePrivate &mimePrivate)
+QMimeTypePrivate::LocaleHash QMimeDatabasePrivate::localeComments(const QString &name)
{
QMutexLocker locker(&mutex);
- if (mimePrivate.name.isEmpty())
- return; // invalid mimetype
- if (!mimePrivate.loaded) { // XML provider sets loaded=true, binary provider does this on demand
- Q_ASSERT(mimePrivate.fromCache);
- bool found = false;
- for (const auto &provider : providers()) {
- if (provider->loadMimeTypePrivate(mimePrivate)) {
- found = true;
- break;
- }
- }
- if (!found) {
- const QString file = mimePrivate.name + QLatin1String(".xml");
- qWarning() << "No file found for" << file << ", even though update-mime-info said it would exist.\n"
- "Either it was just removed, or the directory doesn't have executable permission..."
- << QStandardPaths::locateAll(QStandardPaths::GenericDataLocation, QLatin1String("mime"), QStandardPaths::LocateDirectory);
- }
- mimePrivate.loaded = true;
+ for (const auto &provider : providers()) {
+ auto comments = provider->localeComments(name);
+ if (!comments.isEmpty())
+ return comments; // maybe we want to merge in comments from more global providers, in
+ // case of more translations?
}
+ return {};
}
-void QMimeDatabasePrivate::loadGenericIcon(QMimeTypePrivate &mimePrivate)
+QStringList QMimeDatabasePrivate::globPatterns(const QString &name)
{
QMutexLocker locker(&mutex);
- if (mimePrivate.fromCache) {
- mimePrivate.genericIconName.clear();
- for (const auto &provider : providers()) {
- provider->loadGenericIcon(mimePrivate);
- if (!mimePrivate.genericIconName.isEmpty())
- break;
- }
+ QStringList patterns;
+ const auto &providerList = providers();
+ // reverse iteration because we start from most global, add up, clear if delete-all, and add up
+ // again.
+ for (auto rit = providerList.rbegin(); rit != providerList.rend(); ++rit) {
+ auto *provider = rit->get();
+ if (provider->hasGlobDeleteAll(name))
+ patterns.clear();
+ patterns += provider->globPatterns(name);
}
+ return patterns;
}
-void QMimeDatabasePrivate::loadIcon(QMimeTypePrivate &mimePrivate)
+QString QMimeDatabasePrivate::genericIcon(const QString &name)
{
QMutexLocker locker(&mutex);
- if (mimePrivate.fromCache) {
- mimePrivate.iconName.clear();
- for (const auto &provider : providers()) {
- provider->loadIcon(mimePrivate);
- if (!mimePrivate.iconName.isEmpty())
- break;
- }
+ for (const auto &provider : providers()) {
+ QString genericIconName = provider->genericIcon(name);
+ if (!genericIconName.isEmpty())
+ return genericIconName;
+ }
+ return {};
+}
+
+QString QMimeDatabasePrivate::icon(const QString &name)
+{
+ QMutexLocker locker(&mutex);
+ for (const auto &provider : providers()) {
+ QString iconName = provider->icon(name);
+ if (!iconName.isEmpty())
+ return iconName;
}
+ return {};
}
-static QString fallbackParent(const QString &mimeTypeName)
+QString QMimeDatabasePrivate::fallbackParent(const QString &mimeTypeName) const
{
- const QStringView myGroup = QStringView{mimeTypeName}.left(mimeTypeName.indexOf(QLatin1Char('/')));
+ const QStringView myGroup = QStringView{mimeTypeName}.left(mimeTypeName.indexOf(u'/'));
// All text/* types are subclasses of text/plain.
- if (myGroup == QLatin1String("text") && mimeTypeName != QLatin1String("text/plain"))
- return QLatin1String("text/plain");
+ if (myGroup == "text"_L1 && mimeTypeName != plainTextMimeType())
+ return plainTextMimeType();
// All real-file mimetypes implicitly derive from application/octet-stream
- if (myGroup != QLatin1String("inode") &&
+ if (myGroup != "inode"_L1 &&
// ignore non-file extensions
- myGroup != QLatin1String("all") && myGroup != QLatin1String("fonts") && myGroup != QLatin1String("print") && myGroup != QLatin1String("uri")
- && mimeTypeName != QLatin1String("application/octet-stream")) {
- return QLatin1String("application/octet-stream");
+ myGroup != "all"_L1 && myGroup != "fonts"_L1 && myGroup != "print"_L1 && myGroup != "uri"_L1
+ && mimeTypeName != defaultMimeType()) {
+ return defaultMimeType();
}
return QString();
}
@@ -346,38 +334,37 @@ QMimeType QMimeDatabasePrivate::findByData(const QByteArray &data, int *accuracy
{
if (data.isEmpty()) {
*accuracyPtr = 100;
- return mimeTypeForName(QLatin1String("application/x-zerosize"));
+ return mimeTypeForName(QStringLiteral("application/x-zerosize"));
}
- *accuracyPtr = 0;
- QMimeType candidate;
+ QMimeMagicResult result;
for (const auto &provider : providers())
- provider->findByMagic(data, accuracyPtr, candidate);
+ provider->findByMagic(data, result);
- if (candidate.isValid())
- return candidate;
+ if (result.isValid()) {
+ *accuracyPtr = result.accuracy;
+ return QMimeType(QMimeTypePrivate(result.candidate));
+ }
if (isTextFile(data)) {
*accuracyPtr = 5;
- return mimeTypeForName(QLatin1String("text/plain"));
+ return mimeTypeForName(plainTextMimeType());
}
return mimeTypeForName(defaultMimeType());
}
-QMimeType QMimeDatabasePrivate::mimeTypeForFileNameAndData(const QString &fileName, QIODevice *device, int *accuracyPtr)
+QMimeType QMimeDatabasePrivate::mimeTypeForFileNameAndData(const QString &fileName, QIODevice *device)
{
// First, glob patterns are evaluated. If there is a match with max weight,
// this one is selected and we are done. Otherwise, the file contents are
// evaluated and the match with the highest value (either a magic priority or
// a glob pattern weight) is selected. Matching starts from max level (most
// specific) in both cases, even when there is already a suffix matching candidate.
- *accuracyPtr = 0;
// Pass 1) Try to match on the file name
QMimeGlobMatchResult candidatesByName = findByFileName(fileName);
- if (candidatesByName.m_allMatchingMimeTypes.count() == 1) {
- *accuracyPtr = 100;
+ if (candidatesByName.m_allMatchingMimeTypes.size() == 1) {
const QMimeType mime = mimeTypeForName(candidatesByName.m_matchingMimeTypes.at(0));
if (mime.isValid())
return mime;
@@ -386,12 +373,16 @@ QMimeType QMimeDatabasePrivate::mimeTypeForFileNameAndData(const QString &fileNa
// Extension is unknown, or matches multiple mimetypes.
// Pass 2) Match on content, if we can read the data
- const auto matchOnContent = [this, accuracyPtr, &candidatesByName](QIODevice *device) {
+ const auto matchOnContent = [this, &candidatesByName](QIODevice *device) {
+ const bool openedByUs = !device->isOpen() && device->open(QIODevice::ReadOnly);
if (device->isOpen()) {
// Read 16K in one go (QIODEVICE_BUFFERSIZE in qiodevice_p.h).
// This is much faster than seeking back and forth into QIODevice.
const QByteArray data = device->peek(16384);
+ if (openedByUs)
+ device->close();
+
int magicAccuracy = 0;
QMimeType candidateByData(findByData(data, &magicAccuracy));
@@ -400,27 +391,23 @@ QMimeType QMimeDatabasePrivate::mimeTypeForFileNameAndData(const QString &fileNa
const QString sniffedMime = candidateByData.name();
// If the sniffedMime matches a highest-weight glob match, use it
if (candidatesByName.m_matchingMimeTypes.contains(sniffedMime)) {
- *accuracyPtr = 100;
return candidateByData;
}
- for (const QString &m : qAsConst(candidatesByName.m_allMatchingMimeTypes)) {
+ for (const QString &m : std::as_const(candidatesByName.m_allMatchingMimeTypes)) {
if (inherits(m, sniffedMime)) {
// We have magic + pattern pointing to this, so it's a pretty good match
- *accuracyPtr = 100;
return mimeTypeForName(m);
}
}
if (candidatesByName.m_allMatchingMimeTypes.isEmpty()) {
// No glob, use magic
- *accuracyPtr = magicAccuracy;
return candidateByData;
}
}
}
- if (candidatesByName.m_allMatchingMimeTypes.count() > 1) {
+ if (candidatesByName.m_allMatchingMimeTypes.size() > 1) {
candidatesByName.m_matchingMimeTypes.sort(); // make it deterministic
- *accuracyPtr = 20;
const QMimeType mime = mimeTypeForName(candidatesByName.m_matchingMimeTypes.at(0));
if (mime.isValid())
return mime;
@@ -433,10 +420,78 @@ QMimeType QMimeDatabasePrivate::mimeTypeForFileNameAndData(const QString &fileNa
return matchOnContent(device);
QFile fallbackFile(fileName);
- fallbackFile.open(QIODevice::ReadOnly); // error handling: matchOnContent() will check isOpen()
return matchOnContent(&fallbackFile);
}
+QMimeType QMimeDatabasePrivate::mimeTypeForFileExtension(const QString &fileName)
+{
+ const QStringList matches = mimeTypeForFileName(fileName);
+ if (matches.isEmpty()) {
+ return mimeTypeForName(defaultMimeType());
+ } else {
+ // We have to pick one in case of multiple matches.
+ return mimeTypeForName(matches.first());
+ }
+}
+
+QMimeType QMimeDatabasePrivate::mimeTypeForData(QIODevice *device)
+{
+ int accuracy = 0;
+ const bool openedByUs = !device->isOpen() && device->open(QIODevice::ReadOnly);
+ if (device->isOpen()) {
+ // Read 16K in one go (QIODEVICE_BUFFERSIZE in qiodevice_p.h).
+ // This is much faster than seeking back and forth into QIODevice.
+ const QByteArray data = device->peek(16384);
+ QMimeType result = findByData(data, &accuracy);
+ if (openedByUs)
+ device->close();
+ return result;
+ }
+ return mimeTypeForName(defaultMimeType());
+}
+
+QMimeType QMimeDatabasePrivate::mimeTypeForFile(const QString &fileName,
+ const QFileInfo &fileInfo,
+ QMimeDatabase::MatchMode mode)
+{
+ if (false) {
+#ifdef Q_OS_UNIX
+ } else if (fileInfo.isNativePath()) {
+ // If this is a local file, we'll want to do a stat() ourselves so we can
+ // detect additional inode types. In addition we want to follow symlinks.
+ const QByteArray nativeFilePath = QFile::encodeName(fileName);
+ QT_STATBUF statBuffer;
+ if (QT_STAT(nativeFilePath.constData(), &statBuffer) == 0) {
+ if (S_ISDIR(statBuffer.st_mode))
+ return mimeTypeForName(directoryMimeType());
+ if (S_ISCHR(statBuffer.st_mode))
+ return mimeTypeForName(QStringLiteral("inode/chardevice"));
+ if (S_ISBLK(statBuffer.st_mode))
+ return mimeTypeForName(QStringLiteral("inode/blockdevice"));
+ if (S_ISFIFO(statBuffer.st_mode))
+ return mimeTypeForName(QStringLiteral("inode/fifo"));
+ if (S_ISSOCK(statBuffer.st_mode))
+ return mimeTypeForName(QStringLiteral("inode/socket"));
+ }
+#endif
+ } else if (fileInfo.isDir()) {
+ return mimeTypeForName(directoryMimeType());
+ }
+
+ switch (mode) {
+ case QMimeDatabase::MatchDefault:
+ break;
+ case QMimeDatabase::MatchExtension:
+ return mimeTypeForFileExtension(fileName);
+ case QMimeDatabase::MatchContent: {
+ QFile file(fileName);
+ return mimeTypeForData(&file);
+ }
+ }
+ // MatchDefault:
+ return mimeTypeForFileNameAndData(fileName, nullptr);
+}
+
QList<QMimeType> QMimeDatabasePrivate::allMimeTypes()
{
QList<QMimeType> result;
@@ -448,6 +503,7 @@ QList<QMimeType> QMimeDatabasePrivate::allMimeTypes()
bool QMimeDatabasePrivate::inherits(const QString &mime, const QString &parent)
{
const QString resolvedParent = resolveAlias(parent);
+ QDuplicateTracker<QString> seen;
std::stack<QString, QStringList> toCheck;
toCheck.push(mime);
while (!toCheck.empty()) {
@@ -456,8 +512,11 @@ bool QMimeDatabasePrivate::inherits(const QString &mime, const QString &parent)
const QString mimeName = toCheck.top();
toCheck.pop();
const auto parentList = parents(mimeName);
- for (const QString &par : parentList)
- toCheck.push(resolveAlias(par));
+ for (const QString &par : parentList) {
+ const QString resolvedPar = resolveAlias(par);
+ if (!seen.hasSeen(resolvedPar))
+ toCheck.push(resolvedPar);
+ }
}
return false;
}
@@ -499,7 +558,7 @@ bool QMimeDatabasePrivate::inherits(const QString &mime, const QString &parent)
\snippet code/src_corelib_mimetype_qmimedatabase.cpp 0
- \sa QMimeType, {MIME Type Browser Example}
+ \sa QMimeType, {MIME Type Browser}
*/
/*!
@@ -568,48 +627,7 @@ QMimeType QMimeDatabase::mimeTypeForFile(const QFileInfo &fileInfo, MatchMode mo
{
QMutexLocker locker(&d->mutex);
- if (fileInfo.isDir())
- return d->mimeTypeForName(QLatin1String("inode/directory"));
-
- const QString filePath = fileInfo.filePath();
-
-#ifdef Q_OS_UNIX
- // Cannot access statBuf.st_mode from the filesystem engine, so we have to stat again.
- // In addition we want to follow symlinks.
- const QByteArray nativeFilePath = QFile::encodeName(filePath);
- QT_STATBUF statBuffer;
- if (QT_STAT(nativeFilePath.constData(), &statBuffer) == 0) {
- if (S_ISCHR(statBuffer.st_mode))
- return d->mimeTypeForName(QLatin1String("inode/chardevice"));
- if (S_ISBLK(statBuffer.st_mode))
- return d->mimeTypeForName(QLatin1String("inode/blockdevice"));
- if (S_ISFIFO(statBuffer.st_mode))
- return d->mimeTypeForName(QLatin1String("inode/fifo"));
- if (S_ISSOCK(statBuffer.st_mode))
- return d->mimeTypeForName(QLatin1String("inode/socket"));
- }
-#endif
-
- int priority = 0;
- switch (mode) {
- case MatchDefault:
- return d->mimeTypeForFileNameAndData(filePath, nullptr, &priority);
- case MatchExtension:
- locker.unlock();
- return mimeTypeForFile(filePath, mode);
- case MatchContent: {
- QFile file(filePath);
- if (file.open(QIODevice::ReadOnly)) {
- locker.unlock();
- return mimeTypeForData(&file);
- } else {
- return d->mimeTypeForName(d->defaultMimeType());
- }
- }
- default:
- Q_ASSERT(false);
- }
- return d->mimeTypeForName(d->defaultMimeType());
+ return d->mimeTypeForFile(fileInfo.filePath(), fileInfo, mode);
}
/*!
@@ -619,22 +637,13 @@ QMimeType QMimeDatabase::mimeTypeForFile(const QFileInfo &fileInfo, MatchMode mo
*/
QMimeType QMimeDatabase::mimeTypeForFile(const QString &fileName, MatchMode mode) const
{
+ QMutexLocker locker(&d->mutex);
+
if (mode == MatchExtension) {
- QMutexLocker locker(&d->mutex);
- const QStringList matches = d->mimeTypeForFileName(fileName);
- const int matchCount = matches.count();
- if (matchCount == 0) {
- return d->mimeTypeForName(d->defaultMimeType());
- } else if (matchCount == 1) {
- return d->mimeTypeForName(matches.first());
- } else {
- // We have to pick one.
- return d->mimeTypeForName(matches.first());
- }
+ return d->mimeTypeForFileExtension(fileName);
} else {
- // Implemented as a wrapper around mimeTypeForFile(QFileInfo), so no mutex.
QFileInfo fileInfo(fileName);
- return mimeTypeForFile(fileInfo, mode);
+ return d->mimeTypeForFile(fileName, fileInfo, mode);
}
}
@@ -656,7 +665,7 @@ QList<QMimeType> QMimeDatabase::mimeTypesForFileName(const QString &fileName) co
const QStringList matches = d->mimeTypeForFileName(fileName);
QList<QMimeType> mimes;
- mimes.reserve(matches.count());
+ mimes.reserve(matches.size());
for (const QString &mime : matches)
mimes.append(d->mimeTypeForName(mime));
return mimes;
@@ -670,7 +679,7 @@ QList<QMimeType> QMimeDatabase::mimeTypesForFileName(const QString &fileName) co
QString QMimeDatabase::suffixForFileName(const QString &fileName) const
{
QMutexLocker locker(&d->mutex);
- const int suffixLength = d->findByFileName(fileName).m_knownSuffixLength;
+ const qsizetype suffixLength = d->findByFileName(fileName).m_knownSuffixLength;
return fileName.right(suffixLength);
}
@@ -700,18 +709,7 @@ QMimeType QMimeDatabase::mimeTypeForData(QIODevice *device) const
{
QMutexLocker locker(&d->mutex);
- int accuracy = 0;
- const bool openedByUs = !device->isOpen() && device->open(QIODevice::ReadOnly);
- if (device->isOpen()) {
- // Read 16K in one go (QIODEVICE_BUFFERSIZE in qiodevice_p.h).
- // This is much faster than seeking back and forth into QIODevice.
- const QByteArray data = device->peek(16384);
- const QMimeType result = d->findByData(data, &accuracy);
- if (openedByUs)
- device->close();
- return result;
- }
- return d->mimeTypeForName(d->defaultMimeType());
+ return d->mimeTypeForData(device);
}
/*!
@@ -734,7 +732,7 @@ QMimeType QMimeDatabase::mimeTypeForUrl(const QUrl &url) const
return mimeTypeForFile(url.toLocalFile());
const QString scheme = url.scheme();
- if (scheme.startsWith(QLatin1String("http")) || scheme == QLatin1String("mailto"))
+ if (scheme.startsWith("http"_L1) || scheme == "mailto"_L1)
return mimeTypeForName(d->defaultMimeType());
return mimeTypeForFile(url.path(), MatchExtension);
@@ -763,14 +761,10 @@ QMimeType QMimeDatabase::mimeTypeForFileNameAndData(const QString &fileName, QIO
{
QMutexLocker locker(&d->mutex);
- if (fileName.endsWith(QLatin1Char('/')))
- return d->mimeTypeForName(QLatin1String("inode/directory"));
+ if (fileName.endsWith(u'/'))
+ return d->mimeTypeForName(directoryMimeType());
- int accuracy = 0;
- const bool openedByUs = !device->isOpen() && device->open(QIODevice::ReadOnly);
- const QMimeType result = d->mimeTypeForFileNameAndData(fileName, device, &accuracy);
- if (openedByUs)
- device->close();
+ const QMimeType result = d->mimeTypeForFileNameAndData(fileName, device);
return result;
}
@@ -794,13 +788,12 @@ QMimeType QMimeDatabase::mimeTypeForFileNameAndData(const QString &fileName, con
{
QMutexLocker locker(&d->mutex);
- if (fileName.endsWith(QLatin1Char('/')))
- return d->mimeTypeForName(QLatin1String("inode/directory"));
+ if (fileName.endsWith(u'/'))
+ return d->mimeTypeForName(directoryMimeType());
QBuffer buffer(const_cast<QByteArray *>(&data));
buffer.open(QIODevice::ReadOnly);
- int accuracy = 0;
- return d->mimeTypeForFileNameAndData(fileName, &buffer, &accuracy);
+ return d->mimeTypeForFileNameAndData(fileName, &buffer);
}
/*!
diff --git a/src/corelib/mimetypes/qmimedatabase.h b/src/corelib/mimetypes/qmimedatabase.h
index 9111e5a04c..acf1edff27 100644
--- a/src/corelib/mimetypes/qmimedatabase.h
+++ b/src/corelib/mimetypes/qmimedatabase.h
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2015 Klaralvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author David Faure <david.faure@kdab.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2015 Klaralvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author David Faure <david.faure@kdab.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QMIMEDATABASE_H
#define QMIMEDATABASE_H
diff --git a/src/corelib/mimetypes/qmimedatabase_p.h b/src/corelib/mimetypes/qmimedatabase_p.h
index e6af23e7ed..cb28f0b791 100644
--- a/src/corelib/mimetypes/qmimedatabase_p.h
+++ b/src/corelib/mimetypes/qmimedatabase_p.h
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2015 Klaralvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author David Faure <david.faure@kdab.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2015 Klaralvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author David Faure <david.faure@kdab.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QMIMEDATABASE_P_H
#define QMIMEDATABASE_P_H
@@ -52,6 +16,7 @@
// We mean it.
//
+#include "qmimedatabase.h"
#include "qmimetype.h"
QT_REQUIRE_CONFIG(mimetype);
@@ -68,6 +33,7 @@ QT_REQUIRE_CONFIG(mimetype);
QT_BEGIN_NAMESPACE
+class QFileInfo;
class QIODevice;
class QMimeDatabase;
class QMimeProviderBase;
@@ -82,7 +48,7 @@ public:
static QMimeDatabasePrivate *instance();
- inline QString defaultMimeType() const { return m_defaultMimeType; }
+ const QString &defaultMimeType() const { return m_defaultMimeType; }
bool inherits(const QString &mime, const QString &parent);
@@ -91,15 +57,19 @@ public:
QString resolveAlias(const QString &nameOrAlias);
QStringList parents(const QString &mimeName);
QMimeType mimeTypeForName(const QString &nameOrAlias);
- QMimeType mimeTypeForFileNameAndData(const QString &fileName, QIODevice *device, int *priorityPtr);
+ QMimeType mimeTypeForFileNameAndData(const QString &fileName, QIODevice *device);
+ QMimeType mimeTypeForFileExtension(const QString &fileName);
+ QMimeType mimeTypeForData(QIODevice *device);
+ QMimeType mimeTypeForFile(const QString &fileName, const QFileInfo &fileInfo, QMimeDatabase::MatchMode mode);
QMimeType findByData(const QByteArray &data, int *priorityPtr);
QStringList mimeTypeForFileName(const QString &fileName);
QMimeGlobMatchResult findByFileName(const QString &fileName);
// API for QMimeType. Takes care of locking the mutex.
- void loadMimeTypePrivate(QMimeTypePrivate &mimePrivate);
- void loadGenericIcon(QMimeTypePrivate &mimePrivate);
- void loadIcon(QMimeTypePrivate &mimePrivate);
+ QMimeTypePrivate::LocaleHash localeComments(const QString &name);
+ QStringList globPatterns(const QString &name);
+ QString genericIcon(const QString &name);
+ QString icon(const QString &name);
QStringList mimeParents(const QString &mimeName);
QStringList listAliases(const QString &mimeName);
bool mimeInherits(const QString &mime, const QString &parent);
@@ -109,12 +79,13 @@ private:
const Providers &providers();
bool shouldCheck();
void loadProviders();
+ QString fallbackParent(const QString &mimeTypeName) const;
- mutable Providers m_providers;
+ const QString m_defaultMimeType;
+ mutable Providers m_providers; // most local first, most global last
QElapsedTimer m_lastCheck;
public:
- const QString m_defaultMimeType;
QMutex mutex;
};
diff --git a/src/corelib/mimetypes/qmimeglobpattern.cpp b/src/corelib/mimetypes/qmimeglobpattern.cpp
index a61a13e723..d50787a0be 100644
--- a/src/corelib/mimetypes/qmimeglobpattern.cpp
+++ b/src/corelib/mimetypes/qmimeglobpattern.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qmimeglobpattern_p.h"
@@ -47,6 +11,8 @@
QT_BEGIN_NAMESPACE
+using namespace Qt::StringLiterals;
+
/*!
\internal
\class QMimeGlobMatchResult
@@ -56,7 +22,8 @@ QT_BEGIN_NAMESPACE
Handles glob weights, and preferring longer matches over shorter matches.
*/
-void QMimeGlobMatchResult::addMatch(const QString &mimeType, int weight, const QString &pattern, int knownSuffixLength)
+void QMimeGlobMatchResult::addMatch(const QString &mimeType, int weight, const QString &pattern,
+ qsizetype knownSuffixLength)
{
if (m_allMatchingMimeTypes.contains(mimeType))
return;
@@ -68,9 +35,9 @@ void QMimeGlobMatchResult::addMatch(const QString &mimeType, int weight, const Q
bool replace = weight > m_weight;
if (!replace) {
// Compare the length of the match
- if (pattern.length() < m_matchingPatternLength)
+ if (pattern.size() < m_matchingPatternLength)
return; // too short, ignore
- else if (pattern.length() > m_matchingPatternLength) {
+ else if (pattern.size() > m_matchingPatternLength) {
// longer: clear any previous match (like *.bz2, when pattern is *.tar.bz2)
replace = true;
}
@@ -78,7 +45,7 @@ void QMimeGlobMatchResult::addMatch(const QString &mimeType, int weight, const Q
if (replace) {
m_matchingMimeTypes.clear();
// remember the new "longer" length
- m_matchingPatternLength = pattern.length();
+ m_matchingPatternLength = pattern.size();
m_weight = weight;
}
if (!m_matchingMimeTypes.contains(mimeType)) {
@@ -91,34 +58,34 @@ void QMimeGlobMatchResult::addMatch(const QString &mimeType, int weight, const Q
}
}
-QMimeGlobPattern::PatternType QMimeGlobPattern::detectPatternType(const QString &pattern) const
+QMimeGlobPattern::PatternType QMimeGlobPattern::detectPatternType(QStringView pattern) const
{
- const int patternLength = pattern.length();
+ const qsizetype patternLength = pattern.size();
if (!patternLength)
return OtherPattern;
- const bool starCount = pattern.count(QLatin1Char('*')) == 1;
- const bool hasSquareBracket = pattern.indexOf(QLatin1Char('[')) != -1;
- const bool hasQuestionMark = pattern.indexOf(QLatin1Char('?')) != -1;
+ const qsizetype starCount = pattern.count(u'*');
+ const bool hasSquareBracket = pattern.indexOf(u'[') != -1;
+ const bool hasQuestionMark = pattern.indexOf(u'?') != -1;
if (!hasSquareBracket && !hasQuestionMark) {
if (starCount == 1) {
// Patterns like "*~", "*.extension"
- if (pattern.at(0) == QLatin1Char('*'))
+ if (pattern.at(0) == u'*')
return SuffixPattern;
// Patterns like "README*" (well this is currently the only one like that...)
- if (pattern.at(patternLength - 1) == QLatin1Char('*'))
+ if (pattern.at(patternLength - 1) == u'*')
return PrefixPattern;
- }
- // Names without any wildcards like "README"
- if (starCount == 0)
+ } else if (starCount == 0) {
+ // Names without any wildcards like "README"
return LiteralPattern;
+ }
}
- if (pattern == QLatin1String("[0-9][0-9][0-9].vdr"))
+ if (pattern == "[0-9][0-9][0-9].vdr"_L1)
return VdrPattern;
- if (pattern == QLatin1String("*.anim[1-9j]"))
+ if (pattern == "*.anim[1-9j]"_L1)
return AnimPattern;
return OtherPattern;
@@ -142,10 +109,10 @@ bool QMimeGlobPattern::matchFileName(const QString &inputFileName) const
const QString fileName = m_caseSensitivity == Qt::CaseInsensitive
? inputFileName.toLower() : inputFileName;
- const int patternLength = m_pattern.length();
+ const qsizetype patternLength = m_pattern.size();
if (!patternLength)
return false;
- const int fileNameLength = fileName.length();
+ const qsizetype fileNameLength = fileName.size();
switch (m_patternType) {
case SuffixPattern: {
@@ -175,14 +142,14 @@ bool QMimeGlobPattern::matchFileName(const QString &inputFileName) const
case VdrPattern: // "[0-9][0-9][0-9].vdr" case
return fileNameLength == 7
&& fileName.at(0).isDigit() && fileName.at(1).isDigit() && fileName.at(2).isDigit()
- && QStringView{fileName}.mid(3, 4) == QLatin1String(".vdr");
+ && QStringView{fileName}.mid(3, 4) == ".vdr"_L1;
case AnimPattern: { // "*.anim[1-9j]" case
if (fileNameLength < 6)
return false;
const QChar lastChar = fileName.at(fileNameLength - 1);
- const bool lastCharOK = (lastChar.isDigit() && lastChar != QLatin1Char('0'))
- || lastChar == QLatin1Char('j');
- return lastCharOK && QStringView{fileName}.mid(fileNameLength - 6, 5) == QLatin1String(".anim");
+ const bool lastCharOK = (lastChar.isDigit() && lastChar != u'0')
+ || lastChar == u'j';
+ return lastCharOK && QStringView{fileName}.mid(fileNameLength - 6, 5) == ".anim"_L1;
}
case OtherPattern:
// Other fallback patterns: slow but correct method
@@ -196,26 +163,26 @@ bool QMimeGlobPattern::matchFileName(const QString &inputFileName) const
return false;
}
-static bool isSimplePattern(const QString &pattern)
+static bool isSimplePattern(QStringView pattern)
{
// starts with "*.", has no other '*'
- return pattern.lastIndexOf(QLatin1Char('*')) == 0
- && pattern.length() > 1
- && pattern.at(1) == QLatin1Char('.') // (other dots are OK, like *.tar.bz2)
+ return pattern.lastIndexOf(u'*') == 0
+ && pattern.size() > 1
+ && pattern.at(1) == u'.' // (other dots are OK, like *.tar.bz2)
// and contains no other special character
- && !pattern.contains(QLatin1Char('?'))
- && !pattern.contains(QLatin1Char('['))
+ && !pattern.contains(u'?')
+ && !pattern.contains(u'[')
;
}
-static bool isFastPattern(const QString &pattern)
+static bool isFastPattern(QStringView pattern)
{
// starts with "*.", has no other '*' and no other '.'
- return pattern.lastIndexOf(QLatin1Char('*')) == 0
- && pattern.lastIndexOf(QLatin1Char('.')) == 1
+ return pattern.lastIndexOf(u'*') == 0
+ && pattern.lastIndexOf(u'.') == 1
// and contains no other special character
- && !pattern.contains(QLatin1Char('?'))
- && !pattern.contains(QLatin1Char('['))
+ && !pattern.contains(u'?')
+ && !pattern.contains(u'[')
;
}
@@ -253,45 +220,45 @@ void QMimeAllGlobPatterns::removeMimeType(const QString &mimeType)
m_lowWeightGlobs.removeMimeType(mimeType);
}
-void QMimeGlobPatternList::match(QMimeGlobMatchResult &result,
- const QString &fileName) const
+void QMimeGlobPatternList::match(QMimeGlobMatchResult &result, const QString &fileName,
+ const AddMatchFilterFunc &filterFunc) const
{
-
- QMimeGlobPatternList::const_iterator it = this->constBegin();
- const QMimeGlobPatternList::const_iterator endIt = this->constEnd();
- for (; it != endIt; ++it) {
- const QMimeGlobPattern &glob = *it;
- if (glob.matchFileName(fileName)) {
+ for (const QMimeGlobPattern &glob : *this) {
+ if (glob.matchFileName(fileName) && filterFunc(glob.mimeType())) {
const QString pattern = glob.pattern();
- const int suffixLen = isSimplePattern(pattern) ? pattern.length() - 2 : 0;
+ const qsizetype suffixLen = isSimplePattern(pattern) ? pattern.size() - strlen("*.") : 0;
result.addMatch(glob.mimeType(), glob.weight(), pattern, suffixLen);
}
}
}
-void QMimeAllGlobPatterns::matchingGlobs(const QString &fileName, QMimeGlobMatchResult &result) const
+void QMimeAllGlobPatterns::matchingGlobs(const QString &fileName, QMimeGlobMatchResult &result,
+ const AddMatchFilterFunc &filterFunc) const
{
// First try the high weight matches (>50), if any.
- m_highWeightGlobs.match(result, fileName);
+ m_highWeightGlobs.match(result, fileName, filterFunc);
// Now use the "fast patterns" dict, for simple *.foo patterns with weight 50
// (which is most of them, so this optimization is definitely worth it)
- const int lastDot = fileName.lastIndexOf(QLatin1Char('.'));
+ const qsizetype lastDot = fileName.lastIndexOf(u'.');
if (lastDot != -1) { // if no '.', skip the extension lookup
- const int ext_len = fileName.length() - lastDot - 1;
+ const qsizetype ext_len = fileName.size() - lastDot - 1;
const QString simpleExtension = fileName.right(ext_len).toLower();
// (toLower because fast patterns are always case-insensitive and saved as lowercase)
const QStringList matchingMimeTypes = m_fastPatterns.value(simpleExtension);
- const QString simplePattern = QLatin1String("*.") + simpleExtension;
- for (const QString &mime : matchingMimeTypes)
- result.addMatch(mime, 50, simplePattern, simpleExtension.size());
+ const QString simplePattern = "*."_L1 + simpleExtension;
+ for (const QString &mime : matchingMimeTypes) {
+ if (filterFunc(mime)) {
+ result.addMatch(mime, 50, simplePattern, simpleExtension.size());
+ }
+ }
// Can't return yet; *.tar.bz2 has to win over *.bz2, so we need the low-weight mimetypes anyway,
// at least those with weight 50.
}
// Finally, try the low weight matches (<=50)
- m_lowWeightGlobs.match(result, fileName);
+ m_lowWeightGlobs.match(result, fileName, filterFunc);
}
void QMimeAllGlobPatterns::clear()
diff --git a/src/corelib/mimetypes/qmimeglobpattern_p.h b/src/corelib/mimetypes/qmimeglobpattern_p.h
index 584e3329a6..b4316355ba 100644
--- a/src/corelib/mimetypes/qmimeglobpattern_p.h
+++ b/src/corelib/mimetypes/qmimeglobpattern_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QMIMEGLOBPATTERN_P_H
#define QMIMEGLOBPATTERN_P_H
@@ -58,17 +22,20 @@ QT_REQUIRE_CONFIG(mimetype);
#include <QtCore/qstringlist.h>
#include <QtCore/qhash.h>
+#include <algorithm>
+
QT_BEGIN_NAMESPACE
struct QMimeGlobMatchResult
{
- void addMatch(const QString &mimeType, int weight, const QString &pattern, int knownSuffixLength = 0);
+ void addMatch(const QString &mimeType, int weight, const QString &pattern,
+ qsizetype knownSuffixLength = 0);
QStringList m_matchingMimeTypes; // only those with highest weight
QStringList m_allMatchingMimeTypes;
int m_weight = 0;
- int m_matchingPatternLength = 0;
- int m_knownSuffixLength = 0;
+ qsizetype m_matchingPatternLength = 0;
+ qsizetype m_knownSuffixLength = 0;
};
class QMimeGlobPattern
@@ -112,7 +79,7 @@ private:
AnimPattern, // special handling for "*.anim[1-9j]" pattern
OtherPattern
};
- PatternType detectPatternType(const QString &pattern) const;
+ PatternType detectPatternType(QStringView pattern) const;
QString m_pattern;
QString m_mimeType;
@@ -122,31 +89,32 @@ private:
};
Q_DECLARE_SHARED(QMimeGlobPattern)
+using AddMatchFilterFunc = std::function<bool(const QString &)>;
+
class QMimeGlobPatternList : public QList<QMimeGlobPattern>
{
public:
- bool hasPattern(const QString &mimeType, const QString &pattern) const
+ bool hasPattern(QStringView mimeType, QStringView pattern) const
{
- const_iterator it = begin();
- const const_iterator myend = end();
- for (; it != myend; ++it)
- if ((*it).pattern() == pattern && (*it).mimeType() == mimeType)
- return true;
- return false;
+ auto matchesMimeAndPattern = [mimeType, pattern](const QMimeGlobPattern &e) {
+ return e.pattern() == pattern && e.mimeType() == mimeType;
+ };
+ return std::any_of(begin(), end(), matchesMimeAndPattern);
}
/*!
"noglobs" is very rare occurrence, so it's ok if it's slow
*/
- void removeMimeType(const QString &mimeType)
+ void removeMimeType(QStringView mimeType)
{
- auto isMimeTypeEqual = [&mimeType](const QMimeGlobPattern &pattern) {
+ auto isMimeTypeEqual = [mimeType](const QMimeGlobPattern &pattern) {
return pattern.mimeType() == mimeType;
};
removeIf(isMimeTypeEqual);
}
- void match(QMimeGlobMatchResult &result, const QString &fileName) const;
+ void match(QMimeGlobMatchResult &result, const QString &fileName,
+ const AddMatchFilterFunc &filterFunc) const;
};
/*!
@@ -163,7 +131,8 @@ public:
void addGlob(const QMimeGlobPattern &glob);
void removeMimeType(const QString &mimeType);
- void matchingGlobs(const QString &fileName, QMimeGlobMatchResult &result) const;
+ void matchingGlobs(const QString &fileName, QMimeGlobMatchResult &result,
+ const AddMatchFilterFunc &filterFunc) const;
void clear();
PatternsMap m_fastPatterns; // example: "doc" -> "application/msword", "text/plain"
diff --git a/src/corelib/mimetypes/qmimemagicrule.cpp b/src/corelib/mimetypes/qmimemagicrule.cpp
index 2c8c2e7199..3c33d53aac 100644
--- a/src/corelib/mimetypes/qmimemagicrule.cpp
+++ b/src/corelib/mimetypes/qmimemagicrule.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#define QT_NO_CAST_FROM_ASCII
@@ -47,29 +11,31 @@
#include <QtCore/QDebug>
#include <qendian.h>
+#include <private/qoffsetstringarray_p.h>
+#include <private/qtools_p.h>
+
QT_BEGIN_NAMESPACE
+using namespace Qt::StringLiterals;
+using namespace QtMiscUtils;
+
// in the same order as Type!
-static const char magicRuleTypes_string[] =
- "invalid\0"
- "string\0"
- "host16\0"
- "host32\0"
- "big16\0"
- "big32\0"
- "little16\0"
- "little32\0"
- "byte\0"
- "\0";
-
-static const int magicRuleTypes_indices[] = {
- 0, 8, 15, 22, 29, 35, 41, 50, 59, 64, 0
-};
+static constexpr auto magicRuleTypes = qOffsetStringArray(
+ "invalid",
+ "string",
+ "host16",
+ "host32",
+ "big16",
+ "big32",
+ "little16",
+ "little32",
+ "byte"
+);
QMimeMagicRule::Type QMimeMagicRule::type(const QByteArray &theTypeName)
{
for (int i = String; i <= Byte; ++i) {
- if (theTypeName == magicRuleTypes_string + magicRuleTypes_indices[i])
+ if (theTypeName == magicRuleTypes.at(i))
return Type(i);
}
return Invalid;
@@ -77,7 +43,7 @@ QMimeMagicRule::Type QMimeMagicRule::type(const QByteArray &theTypeName)
QByteArray QMimeMagicRule::typeName(QMimeMagicRule::Type theType)
{
- return magicRuleTypes_string + magicRuleTypes_indices[theType];
+ return magicRuleTypes.at(theType);
}
bool QMimeMagicRule::operator==(const QMimeMagicRule &other) const
@@ -94,12 +60,12 @@ bool QMimeMagicRule::operator==(const QMimeMagicRule &other) const
}
// Used by both providers
-bool QMimeMagicRule::matchSubstring(const char *dataPtr, int dataSize, int rangeStart, int rangeLength,
- int valueLength, const char *valueData, const char *mask)
+bool QMimeMagicRule::matchSubstring(const char *dataPtr, qsizetype dataSize, int rangeStart, int rangeLength,
+ qsizetype valueLength, const char *valueData, const char *mask)
{
// Size of searched data.
// Example: value="ABC", rangeLength=3 -> we need 3+3-1=5 bytes (ABCxx,xABCx,xxABC would match)
- const int dataNeeded = qMin(rangeLength + valueLength - 1, dataSize - rangeStart);
+ const qsizetype dataNeeded = qMin(rangeLength + valueLength - 1, dataSize - rangeStart);
if (!mask) {
// callgrind says QByteArray::indexOf is much slower, since our strings are typically too
@@ -123,7 +89,7 @@ bool QMimeMagicRule::matchSubstring(const char *dataPtr, int dataSize, int range
// deviceSize is 4, so dataNeeded was max'ed to 4.
// maxStartPos = 4 - 3 + 1 = 2, and indeed
// we need to check for a match a positions 0 and 1 (ABCx and xABC).
- const int maxStartPos = dataNeeded - valueLength + 1;
+ const qsizetype maxStartPos = dataNeeded - valueLength + 1;
for (int i = 0; i < maxStartPos; ++i) {
const char *d = readDataBase + i;
bool valid = true;
@@ -181,21 +147,17 @@ static inline QByteArray makePattern(const QByteArray &value)
char c = 0;
for (int i = 0; i < 2 && p + 1 < e; ++i) {
++p;
- if (*p >= '0' && *p <= '9')
- c = (c << 4) + *p - '0';
- else if (*p >= 'a' && *p <= 'f')
- c = (c << 4) + *p - 'a' + 10;
- else if (*p >= 'A' && *p <= 'F')
- c = (c << 4) + *p - 'A' + 10;
+ if (const int h = fromHex(*p); h != -1)
+ c = (c << 4) + h;
else
continue;
}
*data++ = c;
- } else if (*p >= '0' && *p <= '7') { // oct (\\7, or \\77, or \\377)
+ } else if (isOctalDigit(*p)) { // oct (\\7, or \\77, or \\377)
char c = *p - '0';
- if (p + 1 < e && p[1] >= '0' && p[1] <= '7') {
+ if (p + 1 < e && isOctalDigit(p[1])) {
c = (c << 3) + *(++p) - '0';
- if (p + 1 < e && p[1] >= '0' && p[1] <= '7' && p[-1] <= '3')
+ if (p + 1 < e && isOctalDigit(p[1]) && p[-1] <= '3')
c = (c << 3) + *(++p) - '0';
}
*data++ = c;
@@ -231,11 +193,14 @@ QMimeMagicRule::QMimeMagicRule(const QString &type,
m_mask(mask),
m_matchFunction(nullptr)
{
- if (Q_UNLIKELY(m_type == Invalid))
- *errorString = QLatin1String("Type ") + type + QLatin1String(" is not supported");
+ if (Q_UNLIKELY(m_type == Invalid)) {
+ if (errorString)
+ *errorString = "Type "_L1 + type + " is not supported"_L1;
+ return;
+ }
// Parse for offset as "1" or "1:10"
- const int colonIndex = offsets.indexOf(QLatin1Char(':'));
+ const qsizetype colonIndex = offsets.indexOf(u':');
const QStringView startPosStr = QStringView{offsets}.mid(0, colonIndex); // \ These decay to returning 'offsets'
const QStringView endPosStr = QStringView{offsets}.mid(colonIndex + 1);// / unchanged when colonIndex == -1
if (Q_UNLIKELY(!QMimeTypeParserBase::parseNumber(startPosStr, &m_startPos, errorString)) ||
@@ -257,7 +222,7 @@ QMimeMagicRule::QMimeMagicRule(const QString &type,
if (Q_UNLIKELY(!ok)) {
m_type = Invalid;
if (errorString)
- *errorString = QLatin1String("Invalid magic rule value \"") + QLatin1String(m_value) + QLatin1Char('"');
+ *errorString = "Invalid magic rule value \""_L1 + QLatin1StringView(m_value) + u'"';
return;
}
m_numberMask = !m_mask.isEmpty() ? m_mask.toUInt(&ok, 0) : 0; // autodetect base
@@ -271,7 +236,7 @@ QMimeMagicRule::QMimeMagicRule(const QString &type,
if (Q_UNLIKELY(m_mask.size() < 4 || !m_mask.startsWith("0x"))) {
m_type = Invalid;
if (errorString)
- *errorString = QLatin1String("Invalid magic rule mask \"") + QLatin1String(m_mask) + QLatin1Char('"');
+ *errorString = "Invalid magic rule mask \""_L1 + QLatin1StringView(m_mask) + u'"';
return;
}
const QByteArray &tempMask = QByteArray::fromHex(QByteArray::fromRawData(
@@ -279,7 +244,7 @@ QMimeMagicRule::QMimeMagicRule(const QString &type,
if (Q_UNLIKELY(tempMask.size() != m_pattern.size())) {
m_type = Invalid;
if (errorString)
- *errorString = QLatin1String("Invalid magic rule mask size \"") + QLatin1String(m_mask) + QLatin1Char('"');
+ *errorString = "Invalid magic rule mask size \""_L1 + QLatin1StringView(m_mask) + u'"';
return;
}
m_mask = tempMask;
diff --git a/src/corelib/mimetypes/qmimemagicrule_p.h b/src/corelib/mimetypes/qmimemagicrule_p.h
index 5091d483b6..bd1b72d113 100644
--- a/src/corelib/mimetypes/qmimemagicrule_p.h
+++ b/src/corelib/mimetypes/qmimemagicrule_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QMIMEMAGICRULE_P_H
#define QMIMEMAGICRULE_P_H
@@ -99,7 +63,9 @@ public:
static Type type(const QByteArray &type);
static QByteArray typeName(Type type);
- static bool matchSubstring(const char *dataPtr, int dataSize, int rangeStart, int rangeLength, int valueLength, const char *valueData, const char *mask);
+ static bool matchSubstring(const char *dataPtr, qsizetype dataSize, int rangeStart,
+ int rangeLength, qsizetype valueLength, const char *valueData,
+ const char *mask);
private:
Type m_type;
diff --git a/src/corelib/mimetypes/qmimemagicrulematcher.cpp b/src/corelib/mimetypes/qmimemagicrulematcher.cpp
index 8f44fd2f80..24a12ee561 100644
--- a/src/corelib/mimetypes/qmimemagicrulematcher.cpp
+++ b/src/corelib/mimetypes/qmimemagicrulematcher.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#define QT_NO_CAST_FROM_ASCII
diff --git a/src/corelib/mimetypes/qmimemagicrulematcher_p.h b/src/corelib/mimetypes/qmimemagicrulematcher_p.h
index fe714987e6..02bc73150e 100644
--- a/src/corelib/mimetypes/qmimemagicrulematcher_p.h
+++ b/src/corelib/mimetypes/qmimemagicrulematcher_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QMIMEMAGICRULEMATCHER_P_H
#define QMIMEMAGICRULEMATCHER_P_H
diff --git a/src/corelib/mimetypes/qmimeprovider.cpp b/src/corelib/mimetypes/qmimeprovider.cpp
index f152094dcd..458cd46385 100644
--- a/src/corelib/mimetypes/qmimeprovider.cpp
+++ b/src/corelib/mimetypes/qmimeprovider.cpp
@@ -1,43 +1,7 @@
-/****************************************************************************
-**
-** Copyright (C) 2018 The Qt Company Ltd.
-** Copyright (C) 2018 Klaralvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author David Faure <david.faure@kdab.com>
-** Copyright (C) 2019 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2018 The Qt Company Ltd.
+// Copyright (C) 2018 Klaralvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author David Faure <david.faure@kdab.com>
+// Copyright (C) 2019 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qmimeprovider_p.h"
@@ -55,7 +19,7 @@
#include <QtEndian>
#if QT_CONFIG(mimetype_database)
-# if defined(Q_CC_MSVC)
+# if defined(Q_CC_MSVC_ONLY)
# pragma section(".qtmimedatabase", read, shared)
__declspec(allocate(".qtmimedatabase")) __declspec(align(4096))
# elif defined(Q_OS_DARWIN)
@@ -84,17 +48,7 @@ __attribute__((section(".qtmimedatabase"), aligned(4096)))
QT_BEGIN_NAMESPACE
-QMimeProviderBase::QMimeProviderBase(QMimeDatabasePrivate *db, const QString &directory)
- : m_db(db), m_directory(directory)
-{
-}
-
-
-QMimeBinaryProvider::QMimeBinaryProvider(QMimeDatabasePrivate *db, const QString &directory)
- : QMimeProviderBase(db, directory), m_mimetypeListLoaded(false)
-{
- ensureLoaded();
-}
+using namespace Qt::StringLiterals;
struct QMimeBinaryProvider::CacheFile
{
@@ -123,6 +77,43 @@ struct QMimeBinaryProvider::CacheFile
bool m_valid;
};
+static inline void appendIfNew(QStringList &list, const QString &str)
+{
+ if (!list.contains(str))
+ list.push_back(str);
+}
+
+QMimeProviderBase::QMimeProviderBase(QMimeDatabasePrivate *db, const QString &directory)
+ : m_db(db), m_directory(directory)
+{
+}
+
+QMimeProviderBase *QMimeProviderBase::overrideProvider() const
+{
+ return m_overrideProvider;
+}
+
+void QMimeProviderBase::setOverrideProvider(QMimeProviderBase *provider)
+{
+ m_overrideProvider = provider;
+}
+
+bool QMimeProviderBase::isMimeTypeGlobsExcluded(const QString &name) const
+{
+ if (m_overrideProvider) {
+ if (m_overrideProvider->hasGlobDeleteAll(name))
+ return true;
+ return m_overrideProvider->isMimeTypeGlobsExcluded(name);
+ }
+ return false;
+}
+
+QMimeBinaryProvider::QMimeBinaryProvider(QMimeDatabasePrivate *db, const QString &directory)
+ : QMimeProviderBase(db, directory), m_mimetypeListLoaded(false)
+{
+ ensureLoaded();
+}
+
QMimeBinaryProvider::CacheFile::CacheFile(const QString &fileName)
: file(fileName), m_valid(false)
{
@@ -143,7 +134,7 @@ bool QMimeBinaryProvider::CacheFile::load()
const int minor = getUint16(2);
m_valid = (major == 1 && minor >= 1 && minor <= 2);
}
- m_mtime = QFileInfo(file).lastModified();
+ m_mtime = QFileInfo(file).lastModified(QTimeZone::UTC);
return m_valid;
}
@@ -157,10 +148,7 @@ bool QMimeBinaryProvider::CacheFile::reload()
return load();
}
-QMimeBinaryProvider::~QMimeBinaryProvider()
-{
- delete m_cacheFile;
-}
+QMimeBinaryProvider::~QMimeBinaryProvider() = default;
bool QMimeBinaryProvider::isValid()
{
@@ -188,7 +176,7 @@ enum {
bool QMimeBinaryProvider::checkCacheChanged()
{
QFileInfo fileInfo(m_cacheFile->file);
- if (fileInfo.lastModified() > m_cacheFile->m_mtime) {
+ if (fileInfo.lastModified(QTimeZone::UTC) > m_cacheFile->m_mtime) {
// Deletion can't happen by just running update-mime-database.
// But the user could use rm -rf :-)
m_cacheFile->reload(); // will mark itself as invalid on failure
@@ -200,8 +188,8 @@ bool QMimeBinaryProvider::checkCacheChanged()
void QMimeBinaryProvider::ensureLoaded()
{
if (!m_cacheFile) {
- const QString cacheFileName = m_directory + QLatin1String("/mime.cache");
- m_cacheFile = new CacheFile(cacheFileName);
+ const QString cacheFileName = m_directory + "/mime.cache"_L1;
+ m_cacheFile = std::make_unique<CacheFile>(cacheFileName);
m_mimetypeListLoaded = false;
m_mimetypeExtra.clear();
} else {
@@ -212,31 +200,15 @@ void QMimeBinaryProvider::ensureLoaded()
return; // nothing to do
}
}
- if (!m_cacheFile->isValid()) { // verify existence and version
- delete m_cacheFile;
- m_cacheFile = nullptr;
- }
-}
-
-static QMimeType mimeTypeForNameUnchecked(const QString &name)
-{
- QMimeTypePrivate data;
- data.name = name;
- data.fromCache = true;
- // The rest is retrieved on demand.
- // comment and globPatterns: in loadMimeTypePrivate
- // iconName: in loadIcon
- // genericIconName: in loadGenericIcon
- return QMimeType(data);
+ if (!m_cacheFile->isValid()) // verify existence and version
+ m_cacheFile.reset();
}
-QMimeType QMimeBinaryProvider::mimeTypeForName(const QString &name)
+bool QMimeBinaryProvider::knowsMimeType(const QString &name)
{
if (!m_mimetypeListLoaded)
loadMimeTypeList();
- if (!m_mimetypeNames.contains(name))
- return QMimeType(); // unknown mimetype
- return mimeTypeForNameUnchecked(name);
+ return m_mimetypeNames.contains(name);
}
void QMimeBinaryProvider::addFileNameMatches(const QString &fileName, QMimeGlobMatchResult &result)
@@ -244,25 +216,34 @@ void QMimeBinaryProvider::addFileNameMatches(const QString &fileName, QMimeGlobM
if (fileName.isEmpty())
return;
Q_ASSERT(m_cacheFile);
- const QString lowerFileName = fileName.toLower();
+ int numMatches = 0;
// Check literals (e.g. "Makefile")
- matchGlobList(result, m_cacheFile, m_cacheFile->getUint32(PosLiteralListOffset), fileName);
+ numMatches = matchGlobList(result, m_cacheFile.get(),
+ m_cacheFile->getUint32(PosLiteralListOffset), fileName);
// Check the very common *.txt cases with the suffix tree
- if (result.m_matchingMimeTypes.isEmpty()) {
+ if (numMatches == 0) {
+ const QString lowerFileName = fileName.toLower();
const int reverseSuffixTreeOffset = m_cacheFile->getUint32(PosReverseSuffixTreeOffset);
const int numRoots = m_cacheFile->getUint32(reverseSuffixTreeOffset);
const int firstRootOffset = m_cacheFile->getUint32(reverseSuffixTreeOffset + 4);
- matchSuffixTree(result, m_cacheFile, numRoots, firstRootOffset, lowerFileName, lowerFileName.length() - 1, false);
- if (result.m_matchingMimeTypes.isEmpty())
- matchSuffixTree(result, m_cacheFile, numRoots, firstRootOffset, fileName, fileName.length() - 1, true);
+ if (matchSuffixTree(result, m_cacheFile.get(), numRoots, firstRootOffset, lowerFileName,
+ lowerFileName.size() - 1, false)) {
+ ++numMatches;
+ } else if (matchSuffixTree(result, m_cacheFile.get(), numRoots, firstRootOffset, fileName,
+ fileName.size() - 1, true)) {
+ ++numMatches;
+ }
}
// Check complex globs (e.g. "callgrind.out[0-9]*" or "README*")
- if (result.m_matchingMimeTypes.isEmpty())
- matchGlobList(result, m_cacheFile, m_cacheFile->getUint32(PosGlobListOffset), fileName);
+ if (numMatches == 0)
+ matchGlobList(result, m_cacheFile.get(), m_cacheFile->getUint32(PosGlobListOffset),
+ fileName);
}
-void QMimeBinaryProvider::matchGlobList(QMimeGlobMatchResult &result, CacheFile *cacheFile, int off, const QString &fileName)
+int QMimeBinaryProvider::matchGlobList(QMimeGlobMatchResult &result, CacheFile *cacheFile, int off,
+ const QString &fileName)
{
+ int numMatches = 0;
const int numGlobs = cacheFile->getUint32(off);
//qDebug() << "Loading" << numGlobs << "globs from" << cacheFile->file.fileName() << "at offset" << cacheFile->globListOffset;
for (int i = 0; i < numGlobs; ++i) {
@@ -272,18 +253,26 @@ void QMimeBinaryProvider::matchGlobList(QMimeGlobMatchResult &result, CacheFile
const int weight = flagsAndWeight & 0xff;
const bool caseSensitive = flagsAndWeight & 0x100;
const Qt::CaseSensitivity qtCaseSensitive = caseSensitive ? Qt::CaseSensitive : Qt::CaseInsensitive;
- const QString pattern = QLatin1String(cacheFile->getCharStar(globOffset));
+ const QString pattern = QLatin1StringView(cacheFile->getCharStar(globOffset));
- const char *mimeType = cacheFile->getCharStar(mimeTypeOffset);
+ const QLatin1StringView mimeType(cacheFile->getCharStar(mimeTypeOffset));
//qDebug() << pattern << mimeType << weight << caseSensitive;
- QMimeGlobPattern glob(pattern, QString() /*unused*/, weight, qtCaseSensitive);
+ if (isMimeTypeGlobsExcluded(mimeType))
+ continue;
- if (glob.matchFileName(fileName))
- result.addMatch(QLatin1String(mimeType), weight, pattern);
+ QMimeGlobPattern glob(pattern, QString() /*unused*/, weight, qtCaseSensitive);
+ if (glob.matchFileName(fileName)) {
+ result.addMatch(mimeType, weight, pattern);
+ ++numMatches;
+ }
}
+ return numMatches;
}
-bool QMimeBinaryProvider::matchSuffixTree(QMimeGlobMatchResult &result, QMimeBinaryProvider::CacheFile *cacheFile, int numEntries, int firstOffset, const QString &fileName, int charPos, bool caseSensitiveCheck)
+bool QMimeBinaryProvider::matchSuffixTree(QMimeGlobMatchResult &result,
+ QMimeBinaryProvider::CacheFile *cacheFile, int numEntries,
+ int firstOffset, const QString &fileName,
+ qsizetype charPos, bool caseSensitiveCheck)
{
QChar fileChar = fileName[charPos];
int min = 0;
@@ -310,13 +299,16 @@ bool QMimeBinaryProvider::matchSuffixTree(QMimeGlobMatchResult &result, QMimeBin
if (mch != 0)
break;
const int mimeTypeOffset = cacheFile->getUint32(childOff + 4);
- const char *mimeType = cacheFile->getCharStar(mimeTypeOffset);
+ const QLatin1StringView mimeType(cacheFile->getCharStar(mimeTypeOffset));
+ if (isMimeTypeGlobsExcluded(mimeType))
+ continue;
const int flagsAndWeight = cacheFile->getUint32(childOff + 8);
const int weight = flagsAndWeight & 0xff;
const bool caseSensitive = flagsAndWeight & 0x100;
if (caseSensitiveCheck || !caseSensitive) {
- result.addMatch(QLatin1String(mimeType), weight,
- QLatin1Char('*') + QStringView{fileName}.mid(charPos + 1), fileName.size() - charPos - 2);
+ result.addMatch(mimeType, weight,
+ u'*' + QStringView{ fileName }.mid(charPos + 1),
+ fileName.size() - charPos - 2);
success = true;
}
}
@@ -330,7 +322,7 @@ bool QMimeBinaryProvider::matchSuffixTree(QMimeGlobMatchResult &result, QMimeBin
bool QMimeBinaryProvider::matchMagicRule(QMimeBinaryProvider::CacheFile *cacheFile, int numMatchlets, int firstOffset, const QByteArray &data)
{
const char *dataPtr = data.constData();
- const int dataSize = data.size();
+ const qsizetype dataSize = data.size();
for (int matchlet = 0; matchlet < numMatchlets; ++matchlet) {
const int off = firstOffset + matchlet * 32;
const int rangeStart = cacheFile->getUint32(off);
@@ -355,7 +347,7 @@ bool QMimeBinaryProvider::matchMagicRule(QMimeBinaryProvider::CacheFile *cacheFi
return false;
}
-void QMimeBinaryProvider::findByMagic(const QByteArray &data, int *accuracyPtr, QMimeType &candidate)
+void QMimeBinaryProvider::findByMagic(const QByteArray &data, QMimeMagicResult &result)
{
const int magicListOffset = m_cacheFile->getUint32(PosMagicListOffset);
const int numMatches = m_cacheFile->getUint32(magicListOffset);
@@ -366,14 +358,16 @@ void QMimeBinaryProvider::findByMagic(const QByteArray &data, int *accuracyPtr,
const int off = firstMatchOffset + i * 16;
const int numMatchlets = m_cacheFile->getUint32(off + 8);
const int firstMatchletOffset = m_cacheFile->getUint32(off + 12);
- if (matchMagicRule(m_cacheFile, numMatchlets, firstMatchletOffset, data)) {
+ if (matchMagicRule(m_cacheFile.get(), numMatchlets, firstMatchletOffset, data)) {
const int mimeTypeOffset = m_cacheFile->getUint32(off + 4);
const char *mimeType = m_cacheFile->getCharStar(mimeTypeOffset);
- *accuracyPtr = m_cacheFile->getUint32(off);
- // Return the first match. We have no rules for conflicting magic data...
- // (mime.cache itself is sorted, but what about local overrides with a lower prio?)
- candidate = mimeTypeForNameUnchecked(QLatin1String(mimeType));
- return;
+ const int accuracy = static_cast<int>(m_cacheFile->getUint32(off));
+ if (accuracy > result.accuracy) {
+ result.accuracy = accuracy;
+ result.candidate = QString::fromLatin1(mimeType);
+ // Return the first match, mime.cache is sorted
+ return;
+ }
}
}
}
@@ -403,8 +397,7 @@ void QMimeBinaryProvider::addParents(const QString &mime, QStringList &result)
const int parentOffset = m_cacheFile->getUint32(parentsOffset + 4 + 4 * i);
const char *aParent = m_cacheFile->getCharStar(parentOffset);
const QString strParent = QString::fromLatin1(aParent);
- if (!result.contains(strParent))
- result.append(strParent);
+ appendIfNew(result, strParent);
}
break;
}
@@ -431,7 +424,7 @@ QString QMimeBinaryProvider::resolveAlias(const QString &name)
} else {
const int mimeOffset = m_cacheFile->getUint32(off + 4);
const char *mimeType = m_cacheFile->getCharStar(mimeOffset);
- return QLatin1String(mimeType);
+ return QLatin1StringView(mimeType);
}
}
return QString();
@@ -451,8 +444,7 @@ void QMimeBinaryProvider::addAliases(const QString &name, QStringList &result)
const int aliasOffset = m_cacheFile->getUint32(off);
const char *alias = m_cacheFile->getCharStar(aliasOffset);
const QString strAlias = QString::fromLatin1(alias);
- if (!result.contains(strAlias))
- result.append(strAlias);
+ appendIfNew(result, strAlias);
}
}
}
@@ -464,13 +456,14 @@ void QMimeBinaryProvider::loadMimeTypeList()
m_mimetypeNames.clear();
// Unfortunately mime.cache doesn't have a full list of all mimetypes.
// So we have to parse the plain-text files called "types".
- QFile file(m_directory + QStringLiteral("/types"));
+ QFile file(m_directory + QStringView(u"/types"));
if (file.open(QIODevice::ReadOnly)) {
while (!file.atEnd()) {
- QByteArray line = file.readLine();
- if (line.endsWith('\n'))
- line.chop(1);
- m_mimetypeNames.insert(QString::fromLatin1(line));
+ const QByteArray line = file.readLine();
+ auto lineView = QByteArrayView(line);
+ if (lineView.endsWith('\n'))
+ lineView.chop(1);
+ m_mimetypeNames.insert(QString::fromLatin1(lineView));
}
}
}
@@ -480,80 +473,95 @@ void QMimeBinaryProvider::addAllMimeTypes(QList<QMimeType> &result)
{
loadMimeTypeList();
if (result.isEmpty()) {
- result.reserve(m_mimetypeNames.count());
- for (const QString &name : qAsConst(m_mimetypeNames))
- result.append(mimeTypeForNameUnchecked(name));
+ result.reserve(m_mimetypeNames.size());
+ for (const QString &name : std::as_const(m_mimetypeNames))
+ result.append(QMimeType(QMimeTypePrivate(name)));
} else {
- for (const QString &name : qAsConst(m_mimetypeNames))
+ for (const QString &name : std::as_const(m_mimetypeNames))
if (std::find_if(result.constBegin(), result.constEnd(), [name](const QMimeType &mime) -> bool { return mime.name() == name; })
== result.constEnd())
- result.append(mimeTypeForNameUnchecked(name));
+ result.append(QMimeType(QMimeTypePrivate(name)));
}
}
-bool QMimeBinaryProvider::loadMimeTypePrivate(QMimeTypePrivate &data)
+QMimeTypePrivate::LocaleHash QMimeBinaryProvider::localeComments(const QString &name)
{
-#ifdef QT_NO_XMLSTREAMREADER
- Q_UNUSED(data);
- qWarning("Cannot load mime type since QXmlStreamReader is not available.");
- return false;
-#else
- if (data.loaded)
- return true;
+ MimeTypeExtraMap::const_iterator it = loadMimeTypeExtra(name);
+ if (it != m_mimetypeExtra.cend())
+ return it->second.localeComments;
+ return {};
+}
+
+bool QMimeBinaryProvider::hasGlobDeleteAll(const QString &name)
+{
+ MimeTypeExtraMap::const_iterator it = loadMimeTypeExtra(name);
+ if (it != m_mimetypeExtra.cend())
+ return it->second.hasGlobDeleteAll;
+ return {};
+}
+
+QStringList QMimeBinaryProvider::globPatterns(const QString &name)
+{
+ MimeTypeExtraMap::const_iterator it = loadMimeTypeExtra(name);
+ if (it != m_mimetypeExtra.cend())
+ return it->second.globPatterns;
+ return {};
+}
- auto it = m_mimetypeExtra.constFind(data.name);
- if (it == m_mimetypeExtra.constEnd()) {
+QMimeBinaryProvider::MimeTypeExtraMap::const_iterator
+QMimeBinaryProvider::loadMimeTypeExtra(const QString &mimeName)
+{
+#if QT_CONFIG(xmlstreamreader)
+ auto it = m_mimetypeExtra.find(mimeName);
+ if (it == m_mimetypeExtra.cend()) {
// load comment and globPatterns
// shared-mime-info since 1.3 lowercases the xml files
- QString mimeFile = m_directory + QLatin1Char('/') + data.name.toLower() + QLatin1String(".xml");
+ QString mimeFile = m_directory + u'/' + mimeName.toLower() + ".xml"_L1;
if (!QFile::exists(mimeFile))
- mimeFile = m_directory + QLatin1Char('/') + data.name + QLatin1String(".xml"); // pre-1.3
+ mimeFile = m_directory + u'/' + mimeName + ".xml"_L1; // pre-1.3
QFile qfile(mimeFile);
if (!qfile.open(QFile::ReadOnly))
- return false;
+ return m_mimetypeExtra.cend();
- auto insertIt = m_mimetypeExtra.insert(data.name, MimeTypeExtra{});
- it = insertIt;
- MimeTypeExtra &extra = insertIt.value();
+ it = m_mimetypeExtra.try_emplace(mimeName).first;
+ MimeTypeExtra &extra = it->second;
QString mainPattern;
QXmlStreamReader xml(&qfile);
if (xml.readNextStartElement()) {
- if (xml.name() != QLatin1String("mime-type")) {
- return false;
+ if (xml.name() != "mime-type"_L1) {
+ return m_mimetypeExtra.cend();
}
- const auto name = xml.attributes().value(QLatin1String("type"));
+ const auto name = xml.attributes().value("type"_L1);
if (name.isEmpty())
- return false;
- if (name.compare(data.name, Qt::CaseInsensitive))
- qWarning() << "Got name" << name << "in file" << mimeFile << "expected" << data.name;
+ return m_mimetypeExtra.cend();
+ if (name.compare(mimeName, Qt::CaseInsensitive))
+ qWarning() << "Got name" << name << "in file" << mimeFile << "expected" << mimeName;
while (xml.readNextStartElement()) {
const auto tag = xml.name();
- if (tag == QLatin1String("comment")) {
- QString lang = xml.attributes().value(QLatin1String("xml:lang")).toString();
+ if (tag == "comment"_L1) {
+ QString lang = xml.attributes().value("xml:lang"_L1).toString();
const QString text = xml.readElementText();
if (lang.isEmpty()) {
- lang = QLatin1String("default"); // no locale attribute provided, treat it as default.
+ lang = "default"_L1; // no locale attribute provided, treat it as default.
}
extra.localeComments.insert(lang, text);
continue; // we called readElementText, so we're at the EndElement already.
- } else if (tag == QLatin1String("glob-deleteall")) { // as written out by shared-mime-info >= 0.70
- extra.globPatterns.clear();
- mainPattern.clear();
- } else if (tag == QLatin1String("glob")) { // as written out by shared-mime-info >= 0.70
- const QString pattern = xml.attributes().value(QLatin1String("pattern")).toString();
- if (mainPattern.isEmpty() && pattern.startsWith(QLatin1Char('*'))) {
+ } else if (tag == "glob-deleteall"_L1) { // as written out by shared-mime-info >= 0.70
+ extra.hasGlobDeleteAll = true;
+ } else if (tag == "glob"_L1) { // as written out by shared-mime-info >= 0.70
+ const QString pattern = xml.attributes().value("pattern"_L1).toString();
+ if (mainPattern.isEmpty() && pattern.startsWith(u'*')) {
mainPattern = pattern;
}
- if (!extra.globPatterns.contains(pattern))
- extra.globPatterns.append(pattern);
+ appendIfNew(extra.globPatterns, pattern);
}
xml.skipCurrentElement();
}
- Q_ASSERT(xml.name() == QLatin1String("mime-type"));
+ Q_ASSERT(xml.name() == "mime-type"_L1);
}
// Let's assume that shared-mime-info is at least version 0.70
@@ -565,15 +573,17 @@ bool QMimeBinaryProvider::loadMimeTypePrivate(QMimeTypePrivate &data)
extra.globPatterns.prepend(mainPattern);
}
}
- const MimeTypeExtra &e = it.value();
- data.localeComments = e.localeComments;
- data.globPatterns = e.globPatterns;
- return true;
-#endif //QT_NO_XMLSTREAMREADER
+ return it;
+#else
+ Q_UNUSED(mimeName);
+ qWarning("Cannot load mime type since QXmlStreamReader is not available.");
+ return m_mimetypeExtra.cend();
+#endif // feature xmlstreamreader
}
// Binary search in the icons or generic-icons list
-QLatin1String QMimeBinaryProvider::iconForMime(CacheFile *cacheFile, int posListOffset, const QByteArray &inputMime)
+QLatin1StringView QMimeBinaryProvider::iconForMime(CacheFile *cacheFile, int posListOffset,
+ const QByteArray &inputMime)
{
const int iconsListOffset = cacheFile->getUint32(posListOffset);
const int numIcons = cacheFile->getUint32(iconsListOffset);
@@ -591,28 +601,22 @@ QLatin1String QMimeBinaryProvider::iconForMime(CacheFile *cacheFile, int posList
end = medium - 1;
else {
const int iconOffset = cacheFile->getUint32(off + 4);
- return QLatin1String(cacheFile->getCharStar(iconOffset));
+ return QLatin1StringView(cacheFile->getCharStar(iconOffset));
}
}
- return QLatin1String();
+ return QLatin1StringView();
}
-void QMimeBinaryProvider::loadIcon(QMimeTypePrivate &data)
+QString QMimeBinaryProvider::icon(const QString &name)
{
- const QByteArray inputMime = data.name.toLatin1();
- const QLatin1String icon = iconForMime(m_cacheFile, PosIconsListOffset, inputMime);
- if (!icon.isEmpty()) {
- data.iconName = icon;
- }
+ const QByteArray inputMime = name.toLatin1();
+ return iconForMime(m_cacheFile.get(), PosIconsListOffset, inputMime);
}
-void QMimeBinaryProvider::loadGenericIcon(QMimeTypePrivate &data)
+QString QMimeBinaryProvider::genericIcon(const QString &name)
{
- const QByteArray inputMime = data.name.toLatin1();
- const QLatin1String icon = iconForMime(m_cacheFile, PosGenericIconsListOffset, inputMime);
- if (!icon.isEmpty()) {
- data.genericIconName = icon;
- }
+ const QByteArray inputMime = name.toLatin1();
+ return iconForMime(m_cacheFile.get(), PosGenericIconsListOffset, inputMime);
}
////
@@ -697,43 +701,39 @@ bool QMimeXMLProvider::isInternalDatabase() const
#endif
}
-QMimeType QMimeXMLProvider::mimeTypeForName(const QString &name)
+bool QMimeXMLProvider::knowsMimeType(const QString &name)
{
- return m_nameMimeTypeMap.value(name);
+ return m_nameMimeTypeMap.contains(name);
}
void QMimeXMLProvider::addFileNameMatches(const QString &fileName, QMimeGlobMatchResult &result)
{
- m_mimeTypeGlobs.matchingGlobs(fileName, result);
+ auto filterFunc = [this](const QString &name) { return !isMimeTypeGlobsExcluded(name); };
+ m_mimeTypeGlobs.matchingGlobs(fileName, result, filterFunc);
}
-void QMimeXMLProvider::findByMagic(const QByteArray &data, int *accuracyPtr, QMimeType &candidate)
+void QMimeXMLProvider::findByMagic(const QByteArray &data, QMimeMagicResult &result)
{
- QString candidateName;
- bool foundOne = false;
- for (const QMimeMagicRuleMatcher &matcher : qAsConst(m_magicMatchers)) {
+ for (const QMimeMagicRuleMatcher &matcher : std::as_const(m_magicMatchers)) {
if (matcher.matches(data)) {
const int priority = matcher.priority();
- if (priority > *accuracyPtr) {
- *accuracyPtr = priority;
- candidateName = matcher.mimetype();
- foundOne = true;
+ if (priority > result.accuracy) {
+ result.accuracy = priority;
+ result.candidate = matcher.mimetype();
}
}
}
- if (foundOne)
- candidate = mimeTypeForName(candidateName);
}
void QMimeXMLProvider::ensureLoaded()
{
QStringList allFiles;
- const QString packageDir = m_directory + QStringLiteral("/packages");
+ const QString packageDir = m_directory + QStringView(u"/packages");
QDir dir(packageDir);
const QStringList files = dir.entryList(QDir::Files | QDir::NoDotAndDotDot);
- allFiles.reserve(files.count());
+ allFiles.reserve(files.size());
for (const QString &xmlFile : files)
- allFiles.append(packageDir + QLatin1Char('/') + xmlFile);
+ allFiles.append(packageDir + u'/' + xmlFile);
if (m_allFiles == allFiles)
return;
@@ -747,10 +747,35 @@ void QMimeXMLProvider::ensureLoaded()
//qDebug() << "Loading" << m_allFiles;
- for (const QString &file : qAsConst(allFiles))
+ for (const QString &file : std::as_const(allFiles))
load(file);
}
+QMimeTypePrivate::LocaleHash QMimeXMLProvider::localeComments(const QString &name)
+{
+ return m_nameMimeTypeMap.value(name).localeComments;
+}
+
+bool QMimeXMLProvider::hasGlobDeleteAll(const QString &name)
+{
+ return m_nameMimeTypeMap.value(name).hasGlobDeleteAll;
+}
+
+QStringList QMimeXMLProvider::globPatterns(const QString &name)
+{
+ return m_nameMimeTypeMap.value(name).globPatterns;
+}
+
+QString QMimeXMLProvider::icon(const QString &name)
+{
+ return m_nameMimeTypeMap.value(name).iconName;
+}
+
+QString QMimeXMLProvider::genericIcon(const QString &name)
+{
+ return m_nameMimeTypeMap.value(name).genericIconName;
+}
+
void QMimeXMLProvider::load(const QString &fileName)
{
QString errorMessage;
@@ -763,7 +788,7 @@ bool QMimeXMLProvider::load(const QString &fileName, QString *errorMessage)
QFile file(fileName);
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
if (errorMessage)
- *errorMessage = QLatin1String("Cannot open ") + fileName + QLatin1String(": ") + file.errorString();
+ *errorMessage = "Cannot open "_L1 + fileName + ": "_L1 + file.errorString();
return false;
}
@@ -792,10 +817,9 @@ void QMimeXMLProvider::addGlobPattern(const QMimeGlobPattern &glob)
m_mimeTypeGlobs.addGlob(glob);
}
-void QMimeXMLProvider::addMimeType(const QMimeType &mt)
+void QMimeXMLProvider::addMimeType(const QMimeTypeXMLData &mt)
{
- Q_ASSERT(!mt.d.data()->fromCache);
- m_nameMimeTypeMap.insert(mt.name(), mt);
+ m_nameMimeTypeMap.insert(mt.name, mt);
}
void QMimeXMLProvider::addParents(const QString &mime, QStringList &result)
@@ -814,13 +838,10 @@ void QMimeXMLProvider::addParent(const QString &child, const QString &parent)
void QMimeXMLProvider::addAliases(const QString &name, QStringList &result)
{
// Iterate through the whole hash. This method is rarely used.
- for (auto it = m_aliases.constBegin(), end = m_aliases.constEnd() ; it != end ; ++it) {
- if (it.value() == name) {
- if (!result.contains(it.key()))
- result.append(it.key());
- }
+ for (const auto &[alias, mimeName] : std::as_const(m_aliases).asKeyValueRange()) {
+ if (mimeName == name)
+ appendIfNew(result, alias);
}
-
}
QString QMimeXMLProvider::resolveAlias(const QString &name)
@@ -836,13 +857,16 @@ void QMimeXMLProvider::addAlias(const QString &alias, const QString &name)
void QMimeXMLProvider::addAllMimeTypes(QList<QMimeType> &result)
{
if (result.isEmpty()) { // fast path
- result = m_nameMimeTypeMap.values();
+ for (auto it = m_nameMimeTypeMap.constBegin(), end = m_nameMimeTypeMap.constEnd();
+ it != end; ++it) {
+ result.append(QMimeType(QMimeTypePrivate(it.value().name)));
+ }
} else {
for (auto it = m_nameMimeTypeMap.constBegin(), end = m_nameMimeTypeMap.constEnd() ; it != end ; ++it) {
const QString newMime = it.key();
if (std::find_if(result.constBegin(), result.constEnd(), [newMime](const QMimeType &mime) -> bool { return mime.name() == newMime; })
== result.constEnd())
- result.append(it.value());
+ result.append(QMimeType(QMimeTypePrivate(it.value().name)));
}
}
}
diff --git a/src/corelib/mimetypes/qmimeprovider_p.h b/src/corelib/mimetypes/qmimeprovider_p.h
index affc554698..3ded01cd46 100644
--- a/src/corelib/mimetypes/qmimeprovider_p.h
+++ b/src/corelib/mimetypes/qmimeprovider_p.h
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2015 Klaralvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author David Faure <david.faure@kdab.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2015 Klaralvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author David Faure <david.faure@kdab.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QMIMEPROVIDER_P_H
#define QMIMEPROVIDER_P_H
@@ -60,40 +24,61 @@ QT_REQUIRE_CONFIG(mimetype);
#include <QtCore/qdatetime.h>
#include <QtCore/qset.h>
+#include <map>
+
QT_BEGIN_NAMESPACE
class QMimeMagicRuleMatcher;
+class QMimeTypeXMLData;
+class QMimeProviderBase;
+
+struct QMimeMagicResult
+{
+ bool isValid() const { return !candidate.isEmpty(); }
+
+ QString candidate;
+ int accuracy = 0;
+};
class QMimeProviderBase
{
+ Q_DISABLE_COPY(QMimeProviderBase)
+
public:
QMimeProviderBase(QMimeDatabasePrivate *db, const QString &directory);
virtual ~QMimeProviderBase() {}
virtual bool isValid() = 0;
virtual bool isInternalDatabase() const = 0;
- virtual QMimeType mimeTypeForName(const QString &name) = 0;
+ virtual bool knowsMimeType(const QString &name) = 0;
virtual void addFileNameMatches(const QString &fileName, QMimeGlobMatchResult &result) = 0;
virtual void addParents(const QString &mime, QStringList &result) = 0;
virtual QString resolveAlias(const QString &name) = 0;
virtual void addAliases(const QString &name, QStringList &result) = 0;
- virtual void findByMagic(const QByteArray &data, int *accuracyPtr, QMimeType &candidate) = 0;
+ virtual void findByMagic(const QByteArray &data, QMimeMagicResult &result) = 0;
virtual void addAllMimeTypes(QList<QMimeType> &result) = 0;
- virtual bool loadMimeTypePrivate(QMimeTypePrivate &) { return false; }
- virtual void loadIcon(QMimeTypePrivate &) {}
- virtual void loadGenericIcon(QMimeTypePrivate &) {}
- virtual void ensureLoaded() {}
+ virtual QMimeTypePrivate::LocaleHash localeComments(const QString &name) = 0;
+ virtual bool hasGlobDeleteAll(const QString &name) = 0;
+ virtual QStringList globPatterns(const QString &name) = 0;
+ virtual QString icon(const QString &name) = 0;
+ virtual QString genericIcon(const QString &name) = 0;
+ virtual void ensureLoaded() { }
QString directory() const { return m_directory; }
+ QMimeProviderBase *overrideProvider() const;
+ void setOverrideProvider(QMimeProviderBase *provider);
+ bool isMimeTypeGlobsExcluded(const QString &name) const;
+
QMimeDatabasePrivate *m_db;
QString m_directory;
+ QMimeProviderBase *m_overrideProvider = nullptr; // more "local" than this one
};
/*
Parses the files 'mime.cache' and 'types' on demand
*/
-class QMimeBinaryProvider : public QMimeProviderBase
+class QMimeBinaryProvider final : public QMimeProviderBase
{
public:
QMimeBinaryProvider(QMimeDatabasePrivate *db, const QString &directory);
@@ -101,29 +86,35 @@ public:
bool isValid() override;
bool isInternalDatabase() const override;
- QMimeType mimeTypeForName(const QString &name) override;
+ bool knowsMimeType(const QString &name) override;
void addFileNameMatches(const QString &fileName, QMimeGlobMatchResult &result) override;
void addParents(const QString &mime, QStringList &result) override;
QString resolveAlias(const QString &name) override;
void addAliases(const QString &name, QStringList &result) override;
- void findByMagic(const QByteArray &data, int *accuracyPtr, QMimeType &candidate) override;
+ void findByMagic(const QByteArray &data, QMimeMagicResult &result) override;
void addAllMimeTypes(QList<QMimeType> &result) override;
- bool loadMimeTypePrivate(QMimeTypePrivate &) override;
- void loadIcon(QMimeTypePrivate &) override;
- void loadGenericIcon(QMimeTypePrivate &) override;
+ QMimeTypePrivate::LocaleHash localeComments(const QString &name) override;
+ bool hasGlobDeleteAll(const QString &name) override;
+ QStringList globPatterns(const QString &name) override;
+ QString icon(const QString &name) override;
+ QString genericIcon(const QString &name) override;
void ensureLoaded() override;
private:
struct CacheFile;
- void matchGlobList(QMimeGlobMatchResult &result, CacheFile *cacheFile, int offset, const QString &fileName);
- bool matchSuffixTree(QMimeGlobMatchResult &result, CacheFile *cacheFile, int numEntries, int firstOffset, const QString &fileName, int charPos, bool caseSensitiveCheck);
- bool matchMagicRule(CacheFile *cacheFile, int numMatchlets, int firstOffset, const QByteArray &data);
- QLatin1String iconForMime(CacheFile *cacheFile, int posListOffset, const QByteArray &inputMime);
+ int matchGlobList(QMimeGlobMatchResult &result, CacheFile *cacheFile, int offset,
+ const QString &fileName);
+ bool matchSuffixTree(QMimeGlobMatchResult &result, CacheFile *cacheFile, int numEntries,
+ int firstOffset, const QString &fileName, qsizetype charPos,
+ bool caseSensitiveCheck);
+ bool matchMagicRule(CacheFile *cacheFile, int numMatchlets, int firstOffset,
+ const QByteArray &data);
+ QLatin1StringView iconForMime(CacheFile *cacheFile, int posListOffset, const QByteArray &inputMime);
void loadMimeTypeList();
bool checkCacheChanged();
- CacheFile *m_cacheFile = nullptr;
+ std::unique_ptr<CacheFile> m_cacheFile;
QStringList m_cacheFileNames;
QSet<QString> m_mimetypeNames;
bool m_mimetypeListLoaded;
@@ -131,14 +122,18 @@ private:
{
QHash<QString, QString> localeComments;
QStringList globPatterns;
+ bool hasGlobDeleteAll = false;
};
- QMap<QString, MimeTypeExtra> m_mimetypeExtra;
+ using MimeTypeExtraMap = std::map<QString, MimeTypeExtra>;
+ MimeTypeExtraMap m_mimetypeExtra;
+
+ MimeTypeExtraMap::const_iterator loadMimeTypeExtra(const QString &mimeName);
};
/*
Parses the raw XML files (slower)
*/
-class QMimeXMLProvider : public QMimeProviderBase
+class QMimeXMLProvider final : public QMimeProviderBase
{
public:
enum InternalDatabaseEnum { InternalDatabase };
@@ -153,19 +148,24 @@ public:
bool isValid() override;
bool isInternalDatabase() const override;
- QMimeType mimeTypeForName(const QString &name) override;
+ bool knowsMimeType(const QString &name) override;
void addFileNameMatches(const QString &fileName, QMimeGlobMatchResult &result) override;
void addParents(const QString &mime, QStringList &result) override;
QString resolveAlias(const QString &name) override;
void addAliases(const QString &name, QStringList &result) override;
- void findByMagic(const QByteArray &data, int *accuracyPtr, QMimeType &candidate) override;
+ void findByMagic(const QByteArray &data, QMimeMagicResult &result) override;
void addAllMimeTypes(QList<QMimeType> &result) override;
void ensureLoaded() override;
+ QMimeTypePrivate::LocaleHash localeComments(const QString &name) override;
+ bool hasGlobDeleteAll(const QString &name) override;
+ QStringList globPatterns(const QString &name) override;
+ QString icon(const QString &name) override;
+ QString genericIcon(const QString &name) override;
bool load(const QString &fileName, QString *errorMessage);
// Called by the mimetype xml parser
- void addMimeType(const QMimeType &mt);
+ void addMimeType(const QMimeTypeXMLData &mt);
void addGlobPattern(const QMimeGlobPattern &glob);
void addParent(const QString &child, const QString &parent);
void addAlias(const QString &alias, const QString &name);
@@ -175,7 +175,7 @@ private:
void load(const QString &fileName);
void load(const char *data, qsizetype len);
- typedef QHash<QString, QMimeType> NameMimeTypeMap;
+ typedef QHash<QString, QMimeTypeXMLData> NameMimeTypeMap;
NameMimeTypeMap m_nameMimeTypeMap;
typedef QHash<QString, QString> AliasHash;
diff --git a/src/corelib/mimetypes/qmimetype.cpp b/src/corelib/mimetypes/qmimetype.cpp
index 3c10360561..e26c8b898d 100644
--- a/src/corelib/mimetypes/qmimetype.cpp
+++ b/src/corelib/mimetypes/qmimetype.cpp
@@ -1,50 +1,11 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2015 Klaralvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author David Faure <david.faure@kdab.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2015 Klaralvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author David Faure <david.faure@kdab.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qmimetype.h"
#include "qmimetype_p.h"
#include "qmimedatabase_p.h"
-#include "qmimeprovider_p.h"
-
-#include "qmimeglobpattern_p.h"
#include <QtCore/QDebug>
#include <QtCore/QLocale>
@@ -54,32 +15,7 @@
QT_BEGIN_NAMESPACE
-QMimeTypePrivate::QMimeTypePrivate()
- : loaded(false), fromCache(false)
-{}
-
-QMimeTypePrivate::QMimeTypePrivate(const QMimeType &other)
- : loaded(other.d->loaded),
- name(other.d->name),
- localeComments(other.d->localeComments),
- genericIconName(other.d->genericIconName),
- iconName(other.d->iconName),
- globPatterns(other.d->globPatterns)
-{}
-
-void QMimeTypePrivate::clear()
-{
- name.clear();
- localeComments.clear();
- genericIconName.clear();
- iconName.clear();
- globPatterns.clear();
-}
-
-void QMimeTypePrivate::addGlobPattern(const QString &pattern)
-{
- globPatterns.append(pattern);
-}
+using namespace Qt::StringLiterals;
/*!
\class QMimeType
@@ -88,6 +24,7 @@ void QMimeTypePrivate::addGlobPattern(const QString &pattern)
\brief The QMimeType class describes types of file or data, represented by a MIME type string.
\since 5.0
+ \compares equality
For instance a file named "readme.txt" has the MIME type "text/plain".
The MIME type can be determined from the file name, or from the file
@@ -104,7 +41,7 @@ void QMimeTypePrivate::addGlobPattern(const QString &pattern)
MIME types can inherit from each other: for instance a C source file is
a specific type of plain text file, so text/x-csrc inherits text/plain.
- \sa QMimeDatabase, {MIME Type Browser Example}
+ \sa QMimeDatabase, {MIME Type Browser}
*/
/*!
@@ -175,14 +112,15 @@ QMimeType::~QMimeType()
}
/*!
- \fn bool QMimeType::operator==(const QMimeType &other) const;
- Returns \c true if \a other equals this QMimeType object, otherwise returns \c false.
+ \fn bool QMimeType::operator==(const QMimeType &lhs, const QMimeType &rhs);
+ Returns \c true if \a lhs equals to the \a rhs QMimeType object, otherwise
+ returns \c false.
The name is the unique identifier for a mimetype, so two mimetypes with
the same name, are equal.
*/
-bool QMimeType::operator==(const QMimeType &other) const
+bool comparesEqual(const QMimeType &lhs, const QMimeType &rhs) noexcept
{
- return d == other.d || d->name == other.d->name;
+ return lhs.d == rhs.d || lhs.d->name == rhs.d->name;
}
/*!
@@ -198,8 +136,9 @@ size_t qHash(const QMimeType &key, size_t seed) noexcept
}
/*!
- \fn bool QMimeType::operator!=(const QMimeType &other) const;
- Returns \c true if \a other does not equal this QMimeType object, otherwise returns \c false.
+ \fn bool QMimeType::operator!=(const QMimeType &lhs, const QMimeType &rhs);
+ Returns \c true if QMimeType \a lhs is not equal to QMimeType \a rhs,
+ otherwise returns \c false.
*/
/*!
@@ -253,24 +192,38 @@ QString QMimeType::name() const
*/
QString QMimeType::comment() const
{
- QMimeDatabasePrivate::instance()->loadMimeTypePrivate(const_cast<QMimeTypePrivate&>(*d));
-
- QStringList languageList;
- languageList << QLocale().name();
- languageList << QLocale().uiLanguages();
- languageList << QLatin1String("default"); // use the default locale if possible.
- for (const QString &language : qAsConst(languageList)) {
- const QString lang = language == QLatin1String("C") ? QLatin1String("en_US") : language;
- const QString comm = d->localeComments.value(lang);
+ const auto localeComments = QMimeDatabasePrivate::instance()->localeComments(d->name);
+
+ QStringList languageList = QLocale().uiLanguages(QLocale::TagSeparator::Underscore);
+ qsizetype defaultIndex = languageList.indexOf(u"en_US"_s);
+
+ // Include the default locale as fall-back.
+ if (defaultIndex >= 0) {
+ // en_US is generally the default, and may be omitted from the
+ // overtly-named locales in the MIME type's data (QTBUG-105007).
+ ++defaultIndex; // Skip over en_US.
+ // That's typically followed by en_Latn_US and en (in that order):
+ if (defaultIndex < languageList.size() && languageList.at(defaultIndex) == u"en_Latn_US")
+ ++defaultIndex;
+ if (defaultIndex < languageList.size() && languageList.at(defaultIndex) == u"en")
+ ++defaultIndex;
+ } else {
+ // Absent en-US, just append it:
+ defaultIndex = languageList.size();
+ }
+ languageList.insert(defaultIndex, u"default"_s);
+
+ for (const QString &language : std::as_const(languageList)) {
+ const QString lang = language == "C"_L1 ? u"en_US"_s : language;
+ QString comm = localeComments.value(lang);
if (!comm.isEmpty())
return comm;
- const int pos = lang.indexOf(QLatin1Char('_'));
- if (pos != -1) {
- // "pt_BR" not found? try just "pt"
- const QString shortLang = lang.left(pos);
- const QString commShort = d->localeComments.value(shortLang);
- if (!commShort.isEmpty())
- return commShort;
+ const qsizetype cut = lang.indexOf(u'_');
+ // If "de_CH" is missing, check for "de" (and similar):
+ if (cut != -1) {
+ comm = localeComments.value(lang.left(cut));
+ if (!comm.isEmpty())
+ return comm;
}
}
@@ -294,8 +247,8 @@ QString QMimeType::comment() const
*/
QString QMimeType::genericIconName() const
{
- QMimeDatabasePrivate::instance()->loadGenericIcon(const_cast<QMimeTypePrivate&>(*d));
- if (d->genericIconName.isEmpty()) {
+ QString genericIconName = QMimeDatabasePrivate::instance()->genericIcon(d->name);
+ if (genericIconName.isEmpty()) {
// From the spec:
// If the generic icon name is empty (not specified by the mimetype definition)
// then the mimetype is used to generate the generic icon by using the top-level
@@ -303,19 +256,19 @@ QString QMimeType::genericIconName() const
// (i.e. "video-x-generic" in the previous example).
const QString group = name();
QStringView groupRef(group);
- const int slashindex = groupRef.indexOf(QLatin1Char('/'));
+ const qsizetype slashindex = groupRef.indexOf(u'/');
if (slashindex != -1)
groupRef = groupRef.left(slashindex);
- return groupRef + QLatin1String("-x-generic");
+ return groupRef + "-x-generic"_L1;
}
- return d->genericIconName;
+ return genericIconName;
}
static QString make_default_icon_name_from_mimetype_name(QString iconName)
{
- const int slashindex = iconName.indexOf(QLatin1Char('/'));
+ const qsizetype slashindex = iconName.indexOf(u'/');
if (slashindex != -1)
- iconName[slashindex] = QLatin1Char('-');
+ iconName[slashindex] = u'-';
return iconName;
}
@@ -330,11 +283,11 @@ static QString make_default_icon_name_from_mimetype_name(QString iconName)
*/
QString QMimeType::iconName() const
{
- QMimeDatabasePrivate::instance()->loadIcon(const_cast<QMimeTypePrivate&>(*d));
- if (d->iconName.isEmpty()) {
+ QString iconName = QMimeDatabasePrivate::instance()->icon(d->name);
+ if (iconName.isEmpty()) {
return make_default_icon_name_from_mimetype_name(name());
}
- return d->iconName;
+ return iconName;
}
/*!
@@ -346,8 +299,7 @@ QString QMimeType::iconName() const
*/
QStringList QMimeType::globPatterns() const
{
- QMimeDatabasePrivate::instance()->loadMimeTypePrivate(const_cast<QMimeTypePrivate&>(*d));
- return d->globPatterns;
+ return QMimeDatabasePrivate::instance()->globPatterns(d->name);
}
/*!
@@ -376,14 +328,17 @@ QStringList QMimeType::parentMimeTypes() const
static void collectParentMimeTypes(const QString &mime, QStringList &allParents)
{
const QStringList parents = QMimeDatabasePrivate::instance()->mimeParents(mime);
+ QStringList newParents;
for (const QString &parent : parents) {
// I would use QSet, but since order matters I better not
- if (!allParents.contains(parent))
+ if (!allParents.contains(parent)) {
allParents.append(parent);
+ newParents.append(parent);
+ }
}
// We want a breadth-first search, so that the least-specific parent (octet-stream) is last
// This means iterating twice, unfortunately.
- for (const QString &parent : parents)
+ for (const QString &parent : newParents)
collectParentMimeTypes(parent, allParents);
}
@@ -441,14 +396,15 @@ QStringList QMimeType::aliases() const
*/
QStringList QMimeType::suffixes() const
{
- QMimeDatabasePrivate::instance()->loadMimeTypePrivate(const_cast<QMimeTypePrivate&>(*d));
+ const QStringList patterns = globPatterns();
QStringList result;
- for (const QString &pattern : qAsConst(d->globPatterns)) {
+ result.reserve(patterns.size());
+ for (const QString &pattern : patterns) {
// Not a simple suffix if it looks like: README or *. or *.* or *.JP*G or *.JP?
- if (pattern.startsWith(QLatin1String("*.")) &&
- pattern.length() > 2 &&
- pattern.indexOf(QLatin1Char('*'), 2) < 0 && pattern.indexOf(QLatin1Char('?'), 2) < 0) {
+ if (pattern.startsWith("*."_L1) &&
+ pattern.size() > 2 &&
+ pattern.indexOf(u'*', 2) < 0 && pattern.indexOf(u'?', 2) < 0) {
const QString suffix = pattern.mid(2);
result.append(suffix);
}
@@ -484,17 +440,11 @@ QString QMimeType::preferredSuffix() const
*/
QString QMimeType::filterString() const
{
- QMimeDatabasePrivate::instance()->loadMimeTypePrivate(const_cast<QMimeTypePrivate&>(*d));
+ const QStringList patterns = globPatterns();
QString filter;
- if (!d->globPatterns.empty()) {
- filter += comment() + QLatin1String(" (");
- for (int i = 0; i < d->globPatterns.size(); ++i) {
- if (i != 0)
- filter += QLatin1Char(' ');
- filter += d->globPatterns.at(i);
- }
- filter += QLatin1Char(')');
+ if (!patterns.isEmpty()) {
+ filter = comment() + " ("_L1 + patterns.join(u' ') + u')';
}
return filter;
@@ -529,3 +479,5 @@ QDebug operator<<(QDebug debug, const QMimeType &mime)
#endif
QT_END_NAMESPACE
+
+#include "moc_qmimetype.cpp"
diff --git a/src/corelib/mimetypes/qmimetype.h b/src/corelib/mimetypes/qmimetype.h
index 365808e48b..508a5cfb53 100644
--- a/src/corelib/mimetypes/qmimetype.h
+++ b/src/corelib/mimetypes/qmimetype.h
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2015 Klaralvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author David Faure <david.faure@kdab.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2015 Klaralvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author David Faure <david.faure@kdab.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QMIMETYPE_H
#define QMIMETYPE_H
@@ -81,18 +45,18 @@ public:
QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_PURE_SWAP(QMimeType)
void swap(QMimeType &other) noexcept
{
- qSwap(d, other.d);
+ d.swap(other.d);
}
explicit QMimeType(const QMimeTypePrivate &dd);
~QMimeType();
-
+#if QT_CORE_REMOVED_SINCE(6, 8)
bool operator==(const QMimeType &other) const;
inline bool operator!=(const QMimeType &other) const
{
return !operator==(other);
}
-
+#endif
bool isValid() const;
bool isDefault() const;
@@ -122,6 +86,10 @@ protected:
friend Q_CORE_EXPORT size_t qHash(const QMimeType &key, size_t seed) noexcept;
QExplicitlySharedDataPointer<QMimeTypePrivate> d;
+
+private:
+ friend Q_CORE_EXPORT bool comparesEqual(const QMimeType &lhs, const QMimeType &rhs) noexcept;
+ Q_DECLARE_EQUALITY_COMPARABLE(QMimeType)
};
Q_DECLARE_SHARED(QMimeType)
diff --git a/src/corelib/mimetypes/qmimetype_p.h b/src/corelib/mimetypes/qmimetype_p.h
index 0d6b4b4b12..b6040098a9 100644
--- a/src/corelib/mimetypes/qmimetype_p.h
+++ b/src/corelib/mimetypes/qmimetype_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QMIMETYPE_P_H
#define QMIMETYPE_P_H
@@ -52,13 +16,14 @@
//
#include <QtCore/private/qglobal_p.h>
-#include "qmimetype.h"
+#include <QtCore/qshareddata.h>
QT_REQUIRE_CONFIG(mimetype);
#include <QtCore/qhash.h>
#include <QtCore/qstringlist.h>
+class QMimeBinaryProvider;
QT_BEGIN_NAMESPACE
class Q_AUTOTEST_EXPORT QMimeTypePrivate : public QSharedData
@@ -66,41 +31,12 @@ class Q_AUTOTEST_EXPORT QMimeTypePrivate : public QSharedData
public:
typedef QHash<QString, QString> LocaleHash;
- QMimeTypePrivate();
- explicit QMimeTypePrivate(const QMimeType &other);
+ QMimeTypePrivate() { }
+ explicit QMimeTypePrivate(const QString &name) : name(name) { }
- void clear();
-
- void addGlobPattern(const QString &pattern);
-
- bool loaded; // QSharedData leaves a 4 byte gap, so don't put 8 byte members first
- bool fromCache; // true if this comes from the binary provider
QString name;
- LocaleHash localeComments;
- QString genericIconName;
- QString iconName;
- QStringList globPatterns;
};
QT_END_NAMESPACE
-#define QMIMETYPE_BUILDER_FROM_RVALUE_REFS \
- QT_BEGIN_NAMESPACE \
- static QMimeType buildQMimeType ( \
- QString &&name, \
- QString &&genericIconName, \
- QString &&iconName, \
- QStringList &&globPatterns \
- ) \
- { \
- QMimeTypePrivate qMimeTypeData; \
- qMimeTypeData.loaded = true; \
- qMimeTypeData.name = std::move(name); \
- qMimeTypeData.genericIconName = std::move(genericIconName); \
- qMimeTypeData.iconName = std::move(iconName); \
- qMimeTypeData.globPatterns = std::move(globPatterns); \
- return QMimeType(qMimeTypeData); \
- } \
- QT_END_NAMESPACE
-
-#endif // QMIMETYPE_P_H
+#endif // QMIMETYPE_P_H
diff --git a/src/corelib/mimetypes/qmimetypeparser.cpp b/src/corelib/mimetypes/qmimetypeparser.cpp
index ff9936d335..3f1e53b25d 100644
--- a/src/corelib/mimetypes/qmimetypeparser.cpp
+++ b/src/corelib/mimetypes/qmimetypeparser.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#define QT_NO_CAST_FROM_ASCII
@@ -53,6 +17,8 @@
QT_BEGIN_NAMESPACE
+using namespace Qt::StringLiterals;
+
// XML tags in MIME files
static const char mimeInfoTagC[] = "mime-info";
static const char mimeTypeTagC[] = "mime-type";
@@ -112,13 +78,13 @@ QMimeTypeParserBase::ParseState QMimeTypeParserBase::nextState(ParseState curren
{
switch (currentState) {
case ParseBeginning:
- if (startElement == QLatin1String(mimeInfoTagC))
+ if (startElement == QLatin1StringView(mimeInfoTagC))
return ParseMimeInfo;
- if (startElement == QLatin1String(mimeTypeTagC))
+ if (startElement == QLatin1StringView(mimeTypeTagC))
return ParseMimeType;
return ParseError;
case ParseMimeInfo:
- return startElement == QLatin1String(mimeTypeTagC) ? ParseMimeType : ParseError;
+ return startElement == QLatin1StringView(mimeTypeTagC) ? ParseMimeType : ParseError;
case ParseMimeType:
case ParseComment:
case ParseGenericIcon:
@@ -129,29 +95,29 @@ QMimeTypeParserBase::ParseState QMimeTypeParserBase::nextState(ParseState curren
case ParseAlias:
case ParseOtherMimeTypeSubTag:
case ParseMagicMatchRule:
- if (startElement == QLatin1String(mimeTypeTagC)) // Sequence of <mime-type>
+ if (startElement == QLatin1StringView(mimeTypeTagC)) // Sequence of <mime-type>
return ParseMimeType;
- if (startElement == QLatin1String(commentTagC))
+ if (startElement == QLatin1StringView(commentTagC))
return ParseComment;
- if (startElement == QLatin1String(genericIconTagC))
+ if (startElement == QLatin1StringView(genericIconTagC))
return ParseGenericIcon;
- if (startElement == QLatin1String(iconTagC))
+ if (startElement == QLatin1StringView(iconTagC))
return ParseIcon;
- if (startElement == QLatin1String(globTagC))
+ if (startElement == QLatin1StringView(globTagC))
return ParseGlobPattern;
- if (startElement == QLatin1String(globDeleteAllTagC))
+ if (startElement == QLatin1StringView(globDeleteAllTagC))
return ParseGlobDeleteAll;
- if (startElement == QLatin1String(subClassTagC))
+ if (startElement == QLatin1StringView(subClassTagC))
return ParseSubClass;
- if (startElement == QLatin1String(aliasTagC))
+ if (startElement == QLatin1StringView(aliasTagC))
return ParseAlias;
- if (startElement == QLatin1String(magicTagC))
+ if (startElement == QLatin1StringView(magicTagC))
return ParseMagic;
- if (startElement == QLatin1String(matchTagC))
+ if (startElement == QLatin1StringView(matchTagC))
return ParseMagicMatchRule;
return ParseOtherMimeTypeSubTag;
case ParseMagic:
- if (startElement == QLatin1String(matchTagC))
+ if (startElement == QLatin1StringView(matchTagC))
return ParseMagicMatchRule;
break;
case ParseError:
@@ -167,13 +133,13 @@ bool QMimeTypeParserBase::parseNumber(QStringView n, int *target, QString *error
*target = n.toInt(&ok);
if (Q_UNLIKELY(!ok)) {
if (errorMessage)
- *errorMessage = QLatin1String("Not a number '") + n + QLatin1String("'.");
+ *errorMessage = "Not a number '"_L1 + n + "'."_L1;
return false;
}
return true;
}
-#ifndef QT_NO_XMLSTREAMREADER
+#if QT_CONFIG(xmlstreamreader)
struct CreateMagicMatchRuleResult
{
QString errorMessage; // must be first
@@ -188,24 +154,18 @@ struct CreateMagicMatchRuleResult
static CreateMagicMatchRuleResult createMagicMatchRule(const QXmlStreamAttributes &atts)
{
- const auto type = atts.value(QLatin1String(matchTypeAttributeC));
- const auto value = atts.value(QLatin1String(matchValueAttributeC));
- const auto offsets = atts.value(QLatin1String(matchOffsetAttributeC));
- const auto mask = atts.value(QLatin1String(matchMaskAttributeC));
+ const auto type = atts.value(QLatin1StringView(matchTypeAttributeC));
+ const auto value = atts.value(QLatin1StringView(matchValueAttributeC));
+ const auto offsets = atts.value(QLatin1StringView(matchOffsetAttributeC));
+ const auto mask = atts.value(QLatin1StringView(matchMaskAttributeC));
return CreateMagicMatchRuleResult(type, value, offsets, mask);
}
-#endif
+#endif // feature xmlstreamreader
bool QMimeTypeParserBase::parse(QIODevice *dev, const QString &fileName, QString *errorMessage)
{
-#ifdef QT_NO_XMLSTREAMREADER
- Q_UNUSED(dev);
- if (errorMessage)
- *errorMessage = QString::fromLatin1("QXmlStreamReader is not available, cannot parse '%1'.").arg(fileName);
- return false;
-#else
- QMimeTypePrivate data;
- data.loaded = true;
+#if QT_CONFIG(xmlstreamreader)
+ QMimeTypeXMLData data;
int priority = 50;
QStack<QMimeMagicRule *> currentRules; // stack for the nesting of rules
QList<QMimeMagicRule> rules; // toplevel rules
@@ -218,7 +178,7 @@ bool QMimeTypeParserBase::parse(QIODevice *dev, const QString &fileName, QString
const QXmlStreamAttributes atts = reader.attributes();
switch (ps) {
case ParseMimeType: { // start parsing a MIME type name
- const QString name = atts.value(QLatin1String(mimeTypeAttributeC)).toString();
+ const QString name = atts.value(QLatin1StringView(mimeTypeAttributeC)).toString();
if (name.isEmpty()) {
reader.raiseError(QStringLiteral("Missing 'type'-attribute"));
} else {
@@ -227,15 +187,15 @@ bool QMimeTypeParserBase::parse(QIODevice *dev, const QString &fileName, QString
}
break;
case ParseGenericIcon:
- data.genericIconName = atts.value(QLatin1String(nameAttributeC)).toString();
+ data.genericIconName = atts.value(QLatin1StringView(nameAttributeC)).toString();
break;
case ParseIcon:
- data.iconName = atts.value(QLatin1String(nameAttributeC)).toString();
+ data.iconName = atts.value(QLatin1StringView(nameAttributeC)).toString();
break;
case ParseGlobPattern: {
- const QString pattern = atts.value(QLatin1String(patternAttributeC)).toString();
- unsigned weight = atts.value(QLatin1String(weightAttributeC)).toInt();
- const bool caseSensitive = atts.value(QLatin1String(caseSensitiveAttributeC)) == QLatin1String("true");
+ const QString pattern = atts.value(QLatin1StringView(patternAttributeC)).toString();
+ unsigned weight = atts.value(QLatin1StringView(weightAttributeC)).toInt();
+ const bool caseSensitive = atts.value(QLatin1StringView(caseSensitiveAttributeC)) == "true"_L1;
if (weight == 0)
weight = QMimeGlobPattern::DefaultWeight;
@@ -249,16 +209,17 @@ bool QMimeTypeParserBase::parse(QIODevice *dev, const QString &fileName, QString
break;
case ParseGlobDeleteAll:
data.globPatterns.clear();
+ data.hasGlobDeleteAll = true;
break;
case ParseSubClass: {
- const QString inheritsFrom = atts.value(QLatin1String(mimeTypeAttributeC)).toString();
+ const QString inheritsFrom = atts.value(QLatin1StringView(mimeTypeAttributeC)).toString();
if (!inheritsFrom.isEmpty())
processParent(data.name, inheritsFrom);
}
break;
case ParseComment: {
// comments have locale attributes.
- QString locale = atts.value(QLatin1String(localeAttributeC)).toString();
+ QString locale = atts.value(QLatin1StringView(localeAttributeC)).toString();
const QString comment = reader.readElementText();
if (locale.isEmpty())
locale = QString::fromLatin1("default");
@@ -266,14 +227,14 @@ bool QMimeTypeParserBase::parse(QIODevice *dev, const QString &fileName, QString
}
break;
case ParseAlias: {
- const QString alias = atts.value(QLatin1String(mimeTypeAttributeC)).toString();
+ const QString alias = atts.value(QLatin1StringView(mimeTypeAttributeC)).toString();
if (!alias.isEmpty())
processAlias(alias, data.name);
}
break;
case ParseMagic: {
priority = 50;
- const auto priorityS = atts.value(QLatin1String(priorityAttributeC));
+ const auto priorityS = atts.value(QLatin1StringView(priorityAttributeC));
if (!priorityS.isEmpty()) {
if (!parseNumber(priorityS, &priority, errorMessage))
return false;
@@ -299,7 +260,7 @@ bool QMimeTypeParserBase::parse(QIODevice *dev, const QString &fileName, QString
break;
}
case ParseError:
- reader.raiseError(QLatin1String("Unexpected element <") + reader.name() + QLatin1Char('>'));
+ reader.raiseError("Unexpected element <"_L1 + reader.name() + u'>');
break;
default:
break;
@@ -310,15 +271,15 @@ bool QMimeTypeParserBase::parse(QIODevice *dev, const QString &fileName, QString
case QXmlStreamReader::EndElement: // Finished element
{
const auto elementName = reader.name();
- if (elementName == QLatin1String(mimeTypeTagC)) {
- if (!process(QMimeType(data), errorMessage))
+ if (elementName == QLatin1StringView(mimeTypeTagC)) {
+ if (!process(data, errorMessage))
return false;
data.clear();
- } else if (elementName == QLatin1String(matchTagC)) {
+ } else if (elementName == QLatin1StringView(matchTagC)) {
// Closing a <match> tag, pop stack
currentRules.pop();
//qDebug() << " MATCH closed. Stack size is now" << currentRules.size();
- } else if (elementName == QLatin1String(magicTagC)) {
+ } else if (elementName == QLatin1StringView(magicTagC)) {
//qDebug() << "MAGIC ended, we got" << rules.count() << "rules, with prio" << priority;
// Finished a <magic> sequence
QMimeMagicRuleMatcher ruleMatcher(data.name, priority);
@@ -344,7 +305,27 @@ bool QMimeTypeParserBase::parse(QIODevice *dev, const QString &fileName, QString
}
return true;
-#endif //QT_NO_XMLSTREAMREADER
+#else
+ Q_UNUSED(dev);
+ if (errorMessage)
+ *errorMessage = "QXmlStreamReader is not available, cannot parse '%1'."_L1.arg(fileName);
+ return false;
+#endif // feature xmlstreamreader
+}
+
+void QMimeTypeXMLData::clear()
+{
+ hasGlobDeleteAll = false;
+ name.clear();
+ localeComments.clear();
+ genericIconName.clear();
+ iconName.clear();
+ globPatterns.clear();
+}
+
+void QMimeTypeXMLData::addGlobPattern(const QString &pattern)
+{
+ globPatterns.append(pattern);
}
QT_END_NAMESPACE
diff --git a/src/corelib/mimetypes/qmimetypeparser_p.h b/src/corelib/mimetypes/qmimetypeparser_p.h
index 9634718ef1..d4266ffcc0 100644
--- a/src/corelib/mimetypes/qmimetypeparser_p.h
+++ b/src/corelib/mimetypes/qmimetypeparser_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QMIMETYPEPARSER_P_H
@@ -52,7 +16,7 @@
// We mean it.
//
-#include "qmimedatabase_p.h"
+#include <QtCore/qtconfigmacros.h>
QT_REQUIRE_CONFIG(mimetype);
@@ -60,6 +24,21 @@ QT_REQUIRE_CONFIG(mimetype);
QT_BEGIN_NAMESPACE
+class QMimeTypeXMLData
+{
+public:
+ void clear();
+
+ void addGlobPattern(const QString &pattern);
+
+ bool hasGlobDeleteAll = false; // true if the mimetype has a glob-deleteall tag
+ QString name;
+ QMimeTypePrivate::LocaleHash localeComments;
+ QString genericIconName; // TODO move to a struct that's specific to the XML provider
+ QString iconName; // TODO move to a struct that's specific to the XML provider
+ QStringList globPatterns;
+};
+
class QIODevice;
class QMimeTypeParserBase
@@ -75,7 +54,7 @@ public:
static bool parseNumber(QStringView n, int *target, QString *errorMessage);
protected:
- virtual bool process(const QMimeType &t, QString *errorMessage) = 0;
+ virtual bool process(const QMimeTypeXMLData &t, QString *errorMessage) = 0;
virtual bool process(const QMimeGlobPattern &t, QString *errorMessage) = 0;
virtual void processParent(const QString &child, const QString &parent) = 0;
virtual void processAlias(const QString &alias, const QString &name) = 0;
@@ -109,7 +88,7 @@ public:
explicit QMimeTypeParser(QMimeXMLProvider &provider) : m_provider(provider) {}
protected:
- inline bool process(const QMimeType &t, QString *) override
+ inline bool process(const QMimeTypeXMLData &t, QString *) override
{ m_provider.addMimeType(t); return true; }
inline bool process(const QMimeGlobPattern &glob, QString *) override
diff --git a/src/corelib/platform/android/qandroidextras.cpp b/src/corelib/platform/android/qandroidextras.cpp
index d9bcc76a1a..aa0c3fd093 100644
--- a/src/corelib/platform/android/qandroidextras.cpp
+++ b/src/corelib/platform/android/qandroidextras.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qandroidextras_p.h"
@@ -153,14 +117,17 @@ QAndroidBinder QAndroidParcelPrivate::readBinder() const
/*!
\class QAndroidParcel
+ \inheaderfile QtCore/private/qandroidextras_p.h
\preliminary
- \inmodule QtCore
+ \inmodule QtCorePrivate
\brief Wraps the most important methods of Android Parcel class.
The QAndroidParcel is a convenience class that wraps the most important
\l {https://developer.android.com/reference/android/os/Parcel.html}{Android Parcel}
methods.
+ \include qtcore.qdoc qtcoreprivate-usage
+
\since 6.2
*/
@@ -269,14 +236,17 @@ QJniObject QAndroidParcel::handle() const
/*!
\class QAndroidBinder
+ \inheaderfile QtCore/private/qandroidextras_p.h
\preliminary
- \inmodule QtCore
+ \inmodule QtCorePrivate
\brief Wraps the most important methods of Android Binder class.
The QAndroidBinder is a convenience class that wraps the most important
\l {https://developer.android.com/reference/android/os/Binder.html}{Android Binder}
methods.
+ \include qtcore.qdoc qtcoreprivate-usage
+
\since 6.2
*/
@@ -406,8 +376,9 @@ QJniObject QAndroidBinder::handle() const
/*!
\class QAndroidServiceConnection
+ \inheaderfile QtCore/private/qandroidextras_p.h
\preliminary
- \inmodule QtCore
+ \inmodule QtCorePrivate
\brief Wraps the most important methods of Android ServiceConnection class.
The QAndroidServiceConnection is a convenience abstract class which wraps the
@@ -416,6 +387,8 @@ QJniObject QAndroidBinder::handle() const
It is useful when you perform a QtAndroidPrivate::bindService operation.
+ \include qtcore.qdoc qtcoreprivate-usage
+
\since 6.2
*/
@@ -478,7 +451,7 @@ QJniObject QAndroidServiceConnection::handle() const
*/
-static QBasicAtomicInteger<uint> nextUniqueActivityRequestCode = Q_BASIC_ATOMIC_INITIALIZER(0);
+Q_CONSTINIT static QBasicAtomicInteger<uint> nextUniqueActivityRequestCode = Q_BASIC_ATOMIC_INITIALIZER(0);
// Get a unique activity request code.
static int uniqueActivityRequestCode()
@@ -532,13 +505,16 @@ public:
/*!
\class QAndroidActivityResultReceiver
+ \inheaderfile QtCore/private/qandroidextras_p.h
\preliminary
- \inmodule QtCore
+ \inmodule QtCorePrivate
\since 6.2
\brief Interface used for callbacks from onActivityResult() in the main Android activity.
Create a subclass of this class to be notified of the results when using the
\c QtAndroidPrivate::startActivity() and \c QtAndroidPrivate::startIntentSender() APIs.
+
+ \include qtcore.qdoc qtcoreprivate-usage
*/
/*!
@@ -627,14 +603,17 @@ public:
/*!
\class QAndroidService
+ \inheaderfile QtCore/private/qandroidextras_p.h
\preliminary
- \inmodule QtCore
+ \inmodule QtCorePrivate
\brief Wraps the most important methods of Android Service class.
The QAndroidService is a convenience class that wraps the most important
\l {https://developer.android.com/reference/android/app/Service.html}{Android Service}
methods.
+ \include qtcore.qdoc qtcoreprivate-usage
+
\since 6.2
*/
@@ -693,17 +672,59 @@ QAndroidBinder* QAndroidService::onBind(const QAndroidIntent &/*intent*/)
return nullptr;
}
+static jboolean onTransact(JNIEnv */*env*/, jclass /*cls*/, jlong id, jint code, jobject data,
+ jobject reply, jint flags)
+{
+ if (!id)
+ return false;
+
+ return reinterpret_cast<QAndroidBinder*>(id)->onTransact(
+ code, QAndroidParcel(data), QAndroidParcel(reply), QAndroidBinder::CallType(flags));
+}
+
+static void onServiceConnected(JNIEnv */*env*/, jclass /*cls*/, jlong id, jstring name,
+ jobject service)
+{
+ if (!id)
+ return;
+
+ return reinterpret_cast<QAndroidServiceConnection *>(id)->onServiceConnected(
+ QJniObject(name).toString(), QAndroidBinder(service));
+}
+
+static void onServiceDisconnected(JNIEnv */*env*/, jclass /*cls*/, jlong id, jstring name)
+{
+ if (!id)
+ return;
+
+ return reinterpret_cast<QAndroidServiceConnection *>(id)->onServiceDisconnected(
+ QJniObject(name).toString());
+}
+
+bool QtAndroidPrivate::registerExtrasNatives(QJniEnvironment &env)
+{
+ static const JNINativeMethod methods[] = {
+ {"onTransact", "(JILandroid/os/Parcel;Landroid/os/Parcel;I)Z", (void *)onTransact},
+ {"onServiceConnected", "(JLjava/lang/String;Landroid/os/IBinder;)V", (void *)onServiceConnected},
+ {"onServiceDisconnected", "(JLjava/lang/String;)V", (void *)onServiceDisconnected}
+ };
+
+ return env.registerNativeMethods("org/qtproject/qt/android/extras/QtNative", methods, 3);
+}
/*!
\class QAndroidIntent
+ \inheaderfile QtCore/private/qandroidextras_p.h
\preliminary
- \inmodule QtCore
+ \inmodule QtCorePrivate
\brief Wraps the most important methods of Android Intent class.
The QAndroidIntent is a convenience class that wraps the most important
\l {https://developer.android.com/reference/android/content/Intent.html}{Android Intent}
methods.
+ \include qtcore.qdoc qtcoreprivate-usage
+
\since 6.2
*/
@@ -824,10 +845,13 @@ QJniObject QAndroidIntent::handle() const
/*!
\namespace QtAndroidPrivate
\preliminary
- \inmodule QtCore
+ \inmodule QtCorePrivate
\since 6.2
- \brief The QtAndroid namespace provides miscellaneous functions to aid Android development.
- \inheaderfile QtAndroid
+ \brief The QtAndroidPrivate namespace provides miscellaneous functions
+ to aid Android development.
+ \inheaderfile QtCore/private/qandroidextras_p.h
+
+ \include qtcore.qdoc qtcoreprivate-usage
*/
/*!
@@ -1051,62 +1075,14 @@ QtAndroidPrivate::PermissionResult resultFromAndroid(jint value)
using PendingPermissionRequestsHash
= QHash<int, QSharedPointer<QPromise<QtAndroidPrivate::PermissionResult>>>;
Q_GLOBAL_STATIC(PendingPermissionRequestsHash, g_pendingPermissionRequests);
-static QBasicMutex g_pendingPermissionRequestsMutex;
+Q_CONSTINIT static QBasicMutex g_pendingPermissionRequestsMutex;
static int nextRequestCode()
{
- static QBasicAtomicInt counter = Q_BASIC_ATOMIC_INITIALIZER(0);
+ Q_CONSTINIT static QBasicAtomicInt counter = Q_BASIC_ATOMIC_INITIALIZER(0);
return counter.fetchAndAddRelaxed(1);
}
-static QStringList nativeStringsFromPermission(QtAndroidPrivate::PermissionType permission)
-{
- static const auto precisePerm = QStringLiteral("android.permission.ACCESS_FINE_LOCATION");
- static const auto coarsePerm = QStringLiteral("android.permission.ACCESS_COARSE_LOCATION");
- static const auto backgroundPerm =
- QStringLiteral("android.permission.ACCESS_BACKGROUND_LOCATION");
-
- switch (permission) {
- case QtAndroidPrivate::Location:
- return {coarsePerm};
- case QtAndroidPrivate::PreciseLocation:
- return {precisePerm};
- case QtAndroidPrivate::BackgroundLocation:
- // Keep the background permission first to be able to use .first()
- // in checkPermission because it takes single permission
- if (QtAndroidPrivate::androidSdkVersion() >= 29)
- return {backgroundPerm, coarsePerm};
- return {coarsePerm};
- case QtAndroidPrivate::PreciseBackgroundLocation:
- // Keep the background permission first to be able to use .first()
- // in checkPermission because it takes single permission
- if (QtAndroidPrivate::androidSdkVersion() >= 29)
- return {backgroundPerm, precisePerm};
- return {precisePerm};
- case QtAndroidPrivate::Camera:
- return {QStringLiteral("android.permission.CAMERA")};
- case QtAndroidPrivate::Microphone:
- return {QStringLiteral("android.permission.RECORD_AUDIO")};
- case QtAndroidPrivate::Bluetooth:
- return { QStringLiteral("android.permission.BLUETOOTH") };
- case QtAndroidPrivate::BodySensors:
- return {QStringLiteral("android.permission.BODY_SENSORS")};
- case QtAndroidPrivate::PhysicalActivity:
- return {QStringLiteral("android.permission.ACTIVITY_RECOGNITION")};
- case QtAndroidPrivate::Contacts:
- return {QStringLiteral("android.permission.READ_CONTACTS"),
- QStringLiteral("android.permission.WRITE_CONTACTS")};
- case QtAndroidPrivate::Storage:
- return {QStringLiteral("android.permission.READ_EXTERNAL_STORAGE"),
- QStringLiteral("android.permission.WRITE_EXTERNAL_STORAGE")};
- case QtAndroidPrivate::Calendar:
- return {QStringLiteral("android.permission.READ_CALENDAR"),
- QStringLiteral("android.permission.WRITE_CALENDAR")};
- }
-
- return {};
-}
-
/*!
\internal
@@ -1139,29 +1115,36 @@ static void sendRequestPermissionsResult(JNIEnv *env, jobject *obj, jint request
request->addResult(result, i);
}
+ QtAndroidPrivate::releaseAndroidDeadlockProtector();
request->finish();
}
QFuture<QtAndroidPrivate::PermissionResult>
requestPermissionsInternal(const QStringList &permissions)
{
- QSharedPointer<QPromise<QtAndroidPrivate::PermissionResult>> promise;
- promise.reset(new QPromise<QtAndroidPrivate::PermissionResult>());
- QFuture<QtAndroidPrivate::PermissionResult> future = promise->future();
- promise->start();
-
// No mechanism to request permission for SDK version below 23, because
// permissions defined in the manifest are granted at install time.
if (QtAndroidPrivate::androidSdkVersion() < 23) {
- for (int i = 0; i < permissions.size(); ++i)
- promise->addResult(QtAndroidPrivate::checkPermission(permissions.at(i)).result(), i);
- promise->finish();
- return future;
+ QList<QtAndroidPrivate::PermissionResult> result;
+ result.reserve(permissions.size());
+ // ### can we kick off all checkPermission()s, and whenAll() collect results?
+ for (const QString &permission : permissions)
+ result.push_back(QtAndroidPrivate::checkPermission(permission).result());
+ return QtFuture::makeReadyRangeFuture(result);
}
+ if (!QtAndroidPrivate::acquireAndroidDeadlockProtector())
+ return QtFuture::makeReadyValueFuture(QtAndroidPrivate::Denied);
+
+ QSharedPointer<QPromise<QtAndroidPrivate::PermissionResult>> promise;
+ promise.reset(new QPromise<QtAndroidPrivate::PermissionResult>());
+ QFuture<QtAndroidPrivate::PermissionResult> future = promise->future();
+ promise->start();
+
const int requestCode = nextRequestCode();
QMutexLocker locker(&g_pendingPermissionRequestsMutex);
g_pendingPermissionRequests->insert(requestCode, promise);
+ locker.unlock();
QNativeInterface::QAndroidApplication::runOnAndroidMainThread([permissions, requestCode] {
QJniEnvironment env;
@@ -1193,64 +1176,16 @@ requestPermissionsInternal(const QStringList &permissions)
QFuture<QtAndroidPrivate::PermissionResult>
QtAndroidPrivate::requestPermission(const QString &permission)
{
- // avoid the uneccessary call and response to an empty permission string
- if (permission.size() > 0)
- return requestPermissionsInternal({permission});
-
- QPromise<QtAndroidPrivate::PermissionResult> promise;
- QFuture<QtAndroidPrivate::PermissionResult> future = promise.future();
- promise.start();
- promise.addResult(QtAndroidPrivate::Denied);
- promise.finish();
- return future;
-}
-
-static bool isBackgroundLocationApi29(QtAndroidPrivate::PermissionType permission)
-{
- return QNativeInterface::QAndroidApplication::sdkVersion() >= 29
- && (permission == QtAndroidPrivate::BackgroundLocation
- || permission == QtAndroidPrivate::PreciseBackgroundLocation);
+ return requestPermissions({permission});
}
-/*!
- \preliminary
-
- Requests the \a permission and returns a QFuture representing the
- result of the request.
-
- \since 6.2
- \sa checkPermission()
-*/
QFuture<QtAndroidPrivate::PermissionResult>
-QtAndroidPrivate::requestPermission(QtAndroidPrivate::PermissionType permission)
+QtAndroidPrivate::requestPermissions(const QStringList &permissions)
{
- QSharedPointer<QPromise<QtAndroidPrivate::PermissionResult>> promise;
- promise.reset(new QPromise<QtAndroidPrivate::PermissionResult>());
- QFuture<QtAndroidPrivate::PermissionResult> future = promise->future();
- promise->start();
- const auto nativePermissions = nativeStringsFromPermission(permission);
-
- if (nativePermissions.size() > 0) {
- requestPermissionsInternal(nativePermissions).then(
- [promise, permission](QFuture<QtAndroidPrivate::PermissionResult> future) {
- auto AuthorizedCount = future.results().count(QtAndroidPrivate::Authorized);
- if (AuthorizedCount > 0) {
- if (isBackgroundLocationApi29(permission))
- promise->addResult(future.resultAt(0), 0);
- else
- promise->addResult(QtAndroidPrivate::Authorized, 0);
- } else {
- promise->addResult(QtAndroidPrivate::Denied, 0);
- }
- promise->finish();
- });
-
- return future;
- }
-
- promise->addResult(QtAndroidPrivate::Denied);
- promise->finish();
- return future;
+ // avoid the uneccessary call and response to an empty permission string
+ if (permissions.isEmpty())
+ return QtFuture::makeReadyValueFuture(QtAndroidPrivate::Denied);
+ return requestPermissionsInternal(permissions);
}
/*!
@@ -1264,60 +1199,30 @@ QtAndroidPrivate::requestPermission(QtAndroidPrivate::PermissionType permission)
QFuture<QtAndroidPrivate::PermissionResult>
QtAndroidPrivate::checkPermission(const QString &permission)
{
- QPromise<QtAndroidPrivate::PermissionResult> promise;
- QFuture<QtAndroidPrivate::PermissionResult> future = promise.future();
- promise.start();
-
- if (permission.size() > 0) {
+ QtAndroidPrivate::PermissionResult result = Denied;
+ if (!permission.isEmpty()) {
auto res = QJniObject::callStaticMethod<jint>(qtNativeClassName,
"checkSelfPermission",
"(Ljava/lang/String;)I",
QJniObject::fromString(permission).object());
- promise.addResult(resultFromAndroid(res));
- } else {
- promise.addResult(QtAndroidPrivate::Denied);
+ result = resultFromAndroid(res);
}
-
- promise.finish();
- return future;
+ return QtFuture::makeReadyValueFuture(result);
}
-/*!
- \preliminary
- Checks whether this process has the named \a permission and returns a QFuture
- representing the result of the check.
-
- \since 6.2
- \sa requestPermission()
-*/
-QFuture<QtAndroidPrivate::PermissionResult>
-QtAndroidPrivate::checkPermission(QtAndroidPrivate::PermissionType permission)
-{
- const auto nativePermissions = nativeStringsFromPermission(permission);
-
- if (nativePermissions.size() > 0)
- return checkPermission(nativePermissions.first());
-
- QPromise<QtAndroidPrivate::PermissionResult> promise;
- QFuture<QtAndroidPrivate::PermissionResult> future = promise.future();
- promise.start();
- promise.addResult(QtAndroidPrivate::Denied);
- promise.finish();
- return future;
-}
-
-bool QtAndroidPrivate::registerPermissionNatives()
+bool QtAndroidPrivate::registerPermissionNatives(QJniEnvironment &env)
{
if (QtAndroidPrivate::androidSdkVersion() < 23)
return true;
- JNINativeMethod methods[] = {
+ const JNINativeMethod methods[] = {
{"sendRequestPermissionsResult", "(I[Ljava/lang/String;[I)V",
reinterpret_cast<void *>(sendRequestPermissionsResult)
}};
- QJniEnvironment env;
return env.registerNativeMethods(qtNativeClassName, methods, 1);
}
QT_END_NAMESPACE
+
+#include "moc_qandroidextras_p.cpp"
diff --git a/src/corelib/platform/android/qandroidextras_p.h b/src/corelib/platform/android/qandroidextras_p.h
index 0d6dc2097d..efdc6cf74f 100644
--- a/src/corelib/platform/android/qandroidextras_p.h
+++ b/src/corelib/platform/android/qandroidextras_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QANDROIDEXTRAS_H
#define QANDROIDEXTRAS_H
@@ -261,21 +225,6 @@ namespace QtAndroidPrivate
BindFlags flags = BindFlag::None);
#if QT_CONFIG(future)
- enum PermissionType {
- Camera,
- Microphone,
- Bluetooth,
- Location,
- PreciseLocation,
- BackgroundLocation,
- PreciseBackgroundLocation,
- BodySensors,
- PhysicalActivity,
- Contacts,
- Storage,
- Calendar
- };
-
enum PermissionResult {
Undetermined,
Authorized,
@@ -283,12 +232,9 @@ namespace QtAndroidPrivate
};
Q_CORE_EXPORT QFuture<QtAndroidPrivate::PermissionResult>
- requestPermission(QtAndroidPrivate::PermissionType permission);
- Q_CORE_EXPORT QFuture<QtAndroidPrivate::PermissionResult>
requestPermission(const QString &permission);
-
- Q_CORE_EXPORT QFuture<QtAndroidPrivate::PermissionResult>
- checkPermission(QtAndroidPrivate::PermissionType permission);
+ QFuture<QtAndroidPrivate::PermissionResult>
+ requestPermissions(const QStringList &permissions);
Q_CORE_EXPORT QFuture<QtAndroidPrivate::PermissionResult>
checkPermission(const QString &permission);
#endif
diff --git a/src/corelib/platform/android/qandroidnativeinterface.cpp b/src/corelib/platform/android/qandroidnativeinterface.cpp
index b8e2cbb424..fc3a09c78b 100644
--- a/src/corelib/platform/android/qandroidnativeinterface.cpp
+++ b/src/corelib/platform/android/qandroidnativeinterface.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include <QtCore/qcoreapplication_platform.h>
@@ -43,9 +7,13 @@
#include <QtCore/private/qjnihelpers_p.h>
#include <QtCore/qjniobject.h>
#if QT_CONFIG(future) && !defined(QT_NO_QOBJECT)
-#include <QtConcurrent/QtConcurrent>
+#include <QtCore/qfuture.h>
+#include <QtCore/qfuturewatcher.h>
#include <QtCore/qpromise.h>
+#include <QtCore/qtimer.h>
+#include <QtCore/qthreadpool.h>
#include <deque>
+#include <memory>
#endif
QT_BEGIN_NAMESPACE
@@ -53,10 +21,14 @@ QT_BEGIN_NAMESPACE
#if QT_CONFIG(future) && !defined(QT_NO_QOBJECT)
static const char qtNativeClassName[] = "org/qtproject/qt/android/QtNative";
-typedef std::pair<std::function<QVariant()>, QSharedPointer<QPromise<QVariant>>> RunnablePair;
-typedef std::deque<RunnablePair> PendingRunnables;
+struct PendingRunnable {
+ std::function<QVariant()> function;
+ std::shared_ptr<QPromise<QVariant>> promise;
+};
+
+using PendingRunnables = std::deque<PendingRunnable>;
Q_GLOBAL_STATIC(PendingRunnables, g_pendingRunnables);
-static QBasicMutex g_pendingRunnablesMutex;
+Q_CONSTINIT static QBasicMutex g_pendingRunnablesMutex;
#endif
/*!
@@ -74,14 +46,14 @@ static QBasicMutex g_pendingRunnablesMutex;
QT_DEFINE_NATIVE_INTERFACE(QAndroidApplication);
/*!
- \fn jobject QNativeInterface::QAndroidApplication::context()
+ \fn QJniObject QNativeInterface::QAndroidApplication::context()
- Returns the Android context as a \c jobject. The context is an \c Activity
+ Returns the Android context as a \c QJniObject. The context is an \c Activity
if the main activity object is valid. Otherwise, the context is a \c Service.
\since 6.2
*/
-jobject QNativeInterface::QAndroidApplication::context()
+QtJniTypes::Context QNativeInterface::QAndroidApplication::context()
{
return QtAndroidPrivate::context();
}
@@ -96,7 +68,7 @@ jobject QNativeInterface::QAndroidApplication::context()
*/
bool QNativeInterface::QAndroidApplication::isActivityContext()
{
- return QtAndroidPrivate::activity();
+ return QtAndroidPrivate::activity().isValid();
}
/*!
@@ -122,8 +94,7 @@ int QNativeInterface::QAndroidApplication::sdkVersion()
*/
void QNativeInterface::QAndroidApplication::hideSplashScreen(int duration)
{
- QJniObject::callStaticMethod<void>("org/qtproject/qt/android/QtNative",
- "hideSplashScreen", "(I)V", duration);
+ QtAndroidPrivate::activity().callMethod<void>("hideSplashScreen", duration);
}
/*!
@@ -191,12 +162,12 @@ QFuture<QVariant> QNativeInterface::QAndroidApplication::runOnAndroidMainThread(
const std::function<QVariant()> &runnable,
const QDeadlineTimer timeout)
{
- QSharedPointer<QPromise<QVariant>> promise(new QPromise<QVariant>());
+ auto promise = std::make_shared<QPromise<QVariant>>();
QFuture<QVariant> future = promise->future();
promise->start();
- (void) QtConcurrent::run([=, &future]() {
- if (!timeout.isForever()) {
+ if (!timeout.isForever()) {
+ QThreadPool::globalInstance()->start([=]() mutable {
QEventLoop loop;
QTimer::singleShot(timeout.remainingTime(), &loop, [&]() {
future.cancel();
@@ -212,12 +183,24 @@ QFuture<QVariant> QNativeInterface::QAndroidApplication::runOnAndroidMainThread(
loop.quit();
});
watcher.setFuture(future);
+
+ // we're going to sleep, make sure we don't block
+ // QThreadPool::globalInstance():
+
+ QThreadPool::globalInstance()->releaseThread();
+ const auto sg = qScopeGuard([] {
+ QThreadPool::globalInstance()->reserveThread();
+ });
loop.exec();
- }
- });
+ });
+ }
QMutexLocker locker(&g_pendingRunnablesMutex);
- g_pendingRunnables->push_back(std::pair(runnable, promise));
+#ifdef __cpp_aggregate_paren_init
+ g_pendingRunnables->emplace_back(runnable, std::move(promise));
+#else
+ g_pendingRunnables->push_back({runnable, std::move(promise)});
+#endif
locker.unlock();
QJniObject::callStaticMethod<void>(qtNativeClassName,
@@ -235,24 +218,23 @@ static void runPendingCppRunnables(JNIEnv */*env*/, jobject /*obj*/)
if (g_pendingRunnables->empty())
break;
- std::pair pair = std::move(g_pendingRunnables->front());
+ PendingRunnable r = std::move(g_pendingRunnables->front());
g_pendingRunnables->pop_front();
locker.unlock();
// run the runnable outside the sync block!
- auto promise = pair.second;
- if (!promise->isCanceled())
- promise->addResult(pair.first());
- promise->finish();
+ if (!r.promise->isCanceled())
+ r.promise->addResult(r.function());
+ r.promise->finish();
}
}
#endif
-bool QtAndroidPrivate::registerNativeInterfaceNatives()
+bool QtAndroidPrivate::registerNativeInterfaceNatives(QJniEnvironment &env)
{
#if QT_CONFIG(future) && !defined(QT_NO_QOBJECT)
- JNINativeMethod methods = {"runPendingCppRunnables", "()V", (void *)runPendingCppRunnables};
- return QJniEnvironment().registerNativeMethods(qtNativeClassName, &methods, 1);
+ const JNINativeMethod methods = {"runPendingCppRunnables", "()V", (void *)runPendingCppRunnables};
+ return env.registerNativeMethods(qtNativeClassName, &methods, 1);
#else
return true;
#endif
diff --git a/src/corelib/platform/darwin/qdarwinpermissionplugin.mm b/src/corelib/platform/darwin/qdarwinpermissionplugin.mm
new file mode 100644
index 0000000000..5c527f396c
--- /dev/null
+++ b/src/corelib/platform/darwin/qdarwinpermissionplugin.mm
@@ -0,0 +1,90 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#include "qdarwinpermissionplugin_p.h"
+
+QT_BEGIN_NAMESPACE
+
+QDarwinPermissionPlugin::QDarwinPermissionPlugin(QDarwinPermissionHandler *handler)
+ : QPermissionPlugin()
+ , m_handler(handler)
+{
+}
+
+QDarwinPermissionPlugin::~QDarwinPermissionPlugin()
+{
+ [m_handler release];
+}
+
+Qt::PermissionStatus QDarwinPermissionPlugin::checkPermission(const QPermission &permission)
+{
+ return [m_handler checkPermission:permission];
+}
+
+void QDarwinPermissionPlugin::requestPermission(const QPermission &permission, const PermissionCallback &callback)
+{
+ if (!verifyUsageDescriptions(permission)) {
+ callback(Qt::PermissionStatus::Denied);
+ return;
+ }
+
+ [m_handler requestPermission:permission withCallback:[=](Qt::PermissionStatus status) {
+ // In case the callback comes in on a secondary thread we need to marshal it
+ // back to the main thread. And if it doesn't, we still want to propagate it
+ // via an event, to avoid any GCD locks deadlocking the application on iOS
+ // if the user responds to the result by running a nested event loop.
+ // Luckily Qt::QueuedConnection gives us exactly what we need.
+ QMetaObject::invokeMethod(this, "permissionUpdated", Qt::QueuedConnection,
+ Q_ARG(Qt::PermissionStatus, status), Q_ARG(PermissionCallback, callback));
+ }];
+}
+
+void QDarwinPermissionPlugin::permissionUpdated(Qt::PermissionStatus status, const PermissionCallback &callback)
+{
+ callback(status);
+}
+
+bool QDarwinPermissionPlugin::verifyUsageDescriptions(const QPermission &permission)
+{
+ // FIXME: Look up the responsible process and inspect that,
+ // as that's what needs to have the usage descriptions.
+ // FIXME: Verify entitlements if the process is sandboxed.
+ auto *infoDictionary = NSBundle.mainBundle.infoDictionary;
+ for (auto description : [m_handler usageDescriptionsFor:permission]) {
+ if (!infoDictionary[description.toNSString()]) {
+ qCWarning(lcPermissions) <<
+ "Requesting" << permission.type().name() <<
+ "requires" << description << "in Info.plist";
+ return false;
+ }
+ }
+ return true;
+}
+
+QT_END_NAMESPACE
+
+QT_USE_NAMESPACE
+
+@implementation QDarwinPermissionHandler
+
+- (Qt::PermissionStatus)checkPermission:(QPermission)permission
+{
+ Q_UNREACHABLE(); // All handlers should at least provide a check
+}
+
+- (void)requestPermission:(QPermission)permission withCallback:(PermissionCallback)callback
+{
+ Q_UNUSED(permission);
+ qCWarning(lcPermissions).nospace() << "Could not request " << permission.type().name() << ". "
+ << "Please make sure you have included the required usage description in your Info.plist";
+ callback(Qt::PermissionStatus::Denied);
+}
+
+- (QStringList)usageDescriptionsFor:(QPermission)permission
+{
+ return {};
+}
+
+@end
+
+#include "moc_qdarwinpermissionplugin_p.cpp"
diff --git a/src/corelib/platform/darwin/qdarwinpermissionplugin_bluetooth.mm b/src/corelib/platform/darwin/qdarwinpermissionplugin_bluetooth.mm
new file mode 100644
index 0000000000..0cd375561f
--- /dev/null
+++ b/src/corelib/platform/darwin/qdarwinpermissionplugin_bluetooth.mm
@@ -0,0 +1,86 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#include "qdarwinpermissionplugin_p_p.h"
+
+#include <deque>
+
+#include <CoreBluetooth/CoreBluetooth.h>
+
+@interface QDarwinBluetoothPermissionHandler () <CBCentralManagerDelegate>
+@property (nonatomic, retain) CBCentralManager *manager;
+@end
+
+@implementation QDarwinBluetoothPermissionHandler {
+ std::deque<PermissionCallback> m_callbacks;
+}
+
+- (instancetype)init
+{
+ if ((self = [super init]))
+ self.manager = nil;
+
+ return self;
+}
+
+- (Qt::PermissionStatus)checkPermission:(QPermission)permission
+{
+ Q_UNUSED(permission);
+ return [self currentStatus];
+}
+
+- (Qt::PermissionStatus)currentStatus
+{
+ auto status = CBCentralManager.authorization;
+ switch (status) {
+ case CBManagerAuthorizationNotDetermined:
+ return Qt::PermissionStatus::Undetermined;
+ case CBManagerAuthorizationRestricted:
+ case CBManagerAuthorizationDenied:
+ return Qt::PermissionStatus::Denied;
+ case CBManagerAuthorizationAllowedAlways:
+ return Qt::PermissionStatus::Granted;
+ }
+
+ qCWarning(lcPermissions) << "Unknown permission status" << status << "detected in" << self;
+ return Qt::PermissionStatus::Denied;
+}
+
+- (void)requestPermission:(QPermission)permission withCallback:(PermissionCallback)callback
+{
+ m_callbacks.push_back(callback);
+ if (!self.manager) {
+ self.manager = [[[CBCentralManager alloc]
+ initWithDelegate:self queue:dispatch_get_main_queue()] autorelease];
+ }
+}
+
+- (void)centralManagerDidUpdateState:(CBCentralManager *)manager
+{
+ Q_ASSERT(manager == self.manager);
+ Q_ASSERT(!m_callbacks.empty());
+
+ auto status = [self currentStatus];
+
+ for (auto callback : m_callbacks)
+ callback(status);
+
+ m_callbacks = {};
+ self.manager = nil;
+}
+
+- (QStringList)usageDescriptionsFor:(QPermission)permission
+{
+ Q_UNUSED(permission);
+#ifdef Q_OS_MACOS
+ if (QOperatingSystemVersion::current() > QOperatingSystemVersion::MacOSBigSur)
+#endif
+ {
+ return { "NSBluetoothAlwaysUsageDescription" };
+ }
+
+ return {};
+}
+@end
+
+#include "moc_qdarwinpermissionplugin_p_p.cpp"
diff --git a/src/corelib/platform/darwin/qdarwinpermissionplugin_calendar.mm b/src/corelib/platform/darwin/qdarwinpermissionplugin_calendar.mm
new file mode 100644
index 0000000000..a3eddd6d8f
--- /dev/null
+++ b/src/corelib/platform/darwin/qdarwinpermissionplugin_calendar.mm
@@ -0,0 +1,71 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#include "qdarwinpermissionplugin_p_p.h"
+
+#include <EventKit/EventKit.h>
+
+@interface QDarwinCalendarPermissionHandler ()
+@property (nonatomic, retain) EKEventStore *eventStore;
+@end
+
+@implementation QDarwinCalendarPermissionHandler
+- (Qt::PermissionStatus)checkPermission:(QPermission)permission
+{
+ Q_UNUSED(permission);
+ return [self currentStatus];
+}
+
+- (Qt::PermissionStatus)currentStatus
+{
+ auto status = [EKEventStore authorizationStatusForEntityType:EKEntityTypeEvent];
+ switch (status) {
+ case EKAuthorizationStatusNotDetermined:
+ return Qt::PermissionStatus::Undetermined;
+ case EKAuthorizationStatusRestricted:
+ case EKAuthorizationStatusDenied:
+ return Qt::PermissionStatus::Denied;
+ case EKAuthorizationStatusAuthorized:
+ return Qt::PermissionStatus::Granted;
+#if QT_MACOS_IOS_PLATFORM_SDK_EQUAL_OR_ABOVE(140000, 170000)
+ case EKAuthorizationStatusWriteOnly:
+ // FIXME: Add WriteOnly AccessMode
+ return Qt::PermissionStatus::Denied;
+#endif
+ }
+
+ qCWarning(lcPermissions) << "Unknown permission status" << status << "detected in" << self;
+ return Qt::PermissionStatus::Denied;
+}
+
+- (QStringList)usageDescriptionsFor:(QPermission)permission
+{
+ Q_UNUSED(permission);
+ return { "NSCalendarsUsageDescription" };
+}
+
+- (void)requestPermission:(QPermission)permission withCallback:(PermissionCallback)callback
+{
+ if (!self.eventStore) {
+ // Note: Creating the EKEventStore results in warnings in the
+ // console about "An error occurred in the persistent store".
+ // This seems like a EventKit API bug.
+ self.eventStore = [[EKEventStore new] autorelease];
+ }
+
+ [self.eventStore requestAccessToEntityType:EKEntityTypeEvent
+ completion:^(BOOL granted, NSError * _Nullable error) {
+ Q_UNUSED(granted); // We use status instead
+ // Permission denied will result in an error, which we don't
+ // want to report/log, so we ignore the error and just report
+ // the status.
+ Q_UNUSED(error);
+
+ callback([self currentStatus]);
+ }
+ ];
+}
+
+@end
+
+#include "moc_qdarwinpermissionplugin_p_p.cpp"
diff --git a/src/corelib/platform/darwin/qdarwinpermissionplugin_camera.mm b/src/corelib/platform/darwin/qdarwinpermissionplugin_camera.mm
new file mode 100644
index 0000000000..51c517d6f3
--- /dev/null
+++ b/src/corelib/platform/darwin/qdarwinpermissionplugin_camera.mm
@@ -0,0 +1,42 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#include "qdarwinpermissionplugin_p_p.h"
+
+#include <AVFoundation/AVFoundation.h>
+
+QT_DEFINE_PERMISSION_STATUS_CONVERTER(AVAuthorizationStatus);
+
+#ifndef BUILDING_PERMISSION_REQUEST
+
+@implementation QDarwinCameraPermissionHandler
+- (Qt::PermissionStatus)checkPermission:(QPermission)permission
+{
+ const auto status = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];
+ return nativeStatusToQtStatus(status);
+}
+
+- (QStringList)usageDescriptionsFor:(QPermission)permission
+{
+ Q_UNUSED(permission);
+ return { "NSCameraUsageDescription" };
+}
+@end
+
+#include "moc_qdarwinpermissionplugin_p_p.cpp"
+
+#else // Building request
+
+@implementation QDarwinCameraPermissionHandler (Request)
+- (void)requestPermission:(QPermission)permission withCallback:(PermissionCallback)callback
+{
+ [AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted)
+ {
+ Q_UNUSED(granted); // We use status instead
+ const auto status = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];
+ callback(nativeStatusToQtStatus(status));
+ }];
+}
+@end
+
+#endif // BUILDING_PERMISSION_REQUEST
diff --git a/src/corelib/platform/darwin/qdarwinpermissionplugin_contacts.mm b/src/corelib/platform/darwin/qdarwinpermissionplugin_contacts.mm
new file mode 100644
index 0000000000..3221b6dc1d
--- /dev/null
+++ b/src/corelib/platform/darwin/qdarwinpermissionplugin_contacts.mm
@@ -0,0 +1,58 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#include "qdarwinpermissionplugin_p_p.h"
+
+#include <Contacts/Contacts.h>
+
+QT_DEFINE_PERMISSION_STATUS_CONVERTER(CNAuthorizationStatus);
+
+@interface QDarwinContactsPermissionHandler ()
+@property (nonatomic, retain) CNContactStore *contactStore;
+@end
+
+@implementation QDarwinContactsPermissionHandler
+- (Qt::PermissionStatus)checkPermission:(QPermission)permission
+{
+ Q_UNUSED(permission);
+ return [self currentStatus];
+}
+
+- (Qt::PermissionStatus)currentStatus
+{
+ const auto status = [CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts];
+ return nativeStatusToQtStatus(status);
+}
+
+- (QStringList)usageDescriptionsFor:(QPermission)permission
+{
+ Q_UNUSED(permission);
+ return { "NSContactsUsageDescription" };
+}
+
+- (void)requestPermission:(QPermission)permission withCallback:(PermissionCallback)callback
+{
+ if (!self.contactStore) {
+ // Note: Creating the CNContactStore results in warnings in the
+ // console about "Attempted to register account monitor for types
+ // client is not authorized to access", mentioning CardDAV, LDAP,
+ // and Exchange. This seems like a Contacts API bug.
+ self.contactStore = [[CNContactStore new] autorelease];
+ }
+
+ [self.contactStore requestAccessForEntityType:CNEntityTypeContacts
+ completionHandler:^(BOOL granted, NSError * _Nullable error) {
+ Q_UNUSED(granted); // We use status instead
+ // Permission denied will result in an error, which we don't
+ // want to report/log, so we ignore the error and just report
+ // the status.
+ Q_UNUSED(error);
+
+ callback([self currentStatus]);
+ }
+ ];
+}
+
+@end
+
+#include "moc_qdarwinpermissionplugin_p_p.cpp"
diff --git a/src/corelib/platform/darwin/qdarwinpermissionplugin_location.mm b/src/corelib/platform/darwin/qdarwinpermissionplugin_location.mm
new file mode 100644
index 0000000000..1d32c0fcac
--- /dev/null
+++ b/src/corelib/platform/darwin/qdarwinpermissionplugin_location.mm
@@ -0,0 +1,263 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#include "qdarwinpermissionplugin_p_p.h"
+
+#include <deque>
+
+#include <CoreLocation/CoreLocation.h>
+
+@interface QDarwinLocationPermissionHandler () <CLLocationManagerDelegate>
+@property (nonatomic, retain) CLLocationManager *manager;
+@end
+
+Q_LOGGING_CATEGORY(lcLocationPermission, "qt.permissions.location");
+
+void warmUpLocationServices()
+{
+ // After creating a CLLocationManager the authorizationStatus
+ // will initially be kCLAuthorizationStatusNotDetermined. The
+ // status will then update to an actual status if the app was
+ // previously authorized/denied once the location services
+ // do some initial book-keeping in the background. By kicking
+ // off a CLLocationManager early on here, we ensure that by
+ // the time the user calls checkPermission the authorization
+ // status has been resolved.
+ qCDebug(lcLocationPermission) << "Warming up location services";
+ [[CLLocationManager new] release];
+}
+
+Q_CONSTRUCTOR_FUNCTION(warmUpLocationServices);
+
+struct PermissionRequest
+{
+ QPermission permission;
+ PermissionCallback callback;
+};
+
+@implementation QDarwinLocationPermissionHandler {
+ std::deque<PermissionRequest> m_requests;
+}
+
+- (instancetype)init
+{
+ if ((self = [super init])) {
+ // The delegate callbacks will come in on the thread that
+ // the CLLocationManager is created on, and we want those
+ // to come in on the main thread, so we defer creation
+ // of the manger until requestPermission, where we know
+ // we are on the main thread.
+ self.manager = nil;
+ }
+
+ return self;
+}
+
+- (Qt::PermissionStatus)checkPermission:(QPermission)permission
+{
+ const auto locationPermission = *permission.value<QLocationPermission>();
+
+ auto status = [self authorizationStatus:locationPermission];
+ if (status != Qt::PermissionStatus::Granted)
+ return status;
+
+ return [self accuracyAuthorization:locationPermission];
+}
+
+- (Qt::PermissionStatus)authorizationStatus:(QLocationPermission)permission
+{
+ NSString *bundleIdentifier = NSBundle.mainBundle.bundleIdentifier;
+ if (!bundleIdentifier || !bundleIdentifier.length) {
+ qCWarning(lcLocationPermission) << "Missing bundle identifier"
+ << "in Info.plist. Can not use location permissions.";
+ return Qt::PermissionStatus::Denied;
+ }
+
+#if defined(Q_OS_VISIONOS)
+ if (permission.availability() == QLocationPermission::Always)
+ return Qt::PermissionStatus::Denied;
+#endif
+
+ auto status = [self authorizationStatus];
+ switch (status) {
+ case kCLAuthorizationStatusRestricted:
+ case kCLAuthorizationStatusDenied:
+ return Qt::PermissionStatus::Denied;
+ case kCLAuthorizationStatusNotDetermined:
+ return Qt::PermissionStatus::Undetermined;
+#if !defined(Q_OS_VISIONOS)
+ case kCLAuthorizationStatusAuthorizedAlways:
+ return Qt::PermissionStatus::Granted;
+#endif
+#if defined(Q_OS_IOS) || defined(Q_OS_VISIONOS)
+ case kCLAuthorizationStatusAuthorizedWhenInUse:
+ if (permission.availability() == QLocationPermission::Always)
+ return Qt::PermissionStatus::Denied;
+ return Qt::PermissionStatus::Granted;
+#endif
+ }
+
+ qCWarning(lcPermissions) << "Unknown permission status" << status << "detected in" << self;
+ return Qt::PermissionStatus::Denied;
+}
+
+- (CLAuthorizationStatus)authorizationStatus
+{
+ if (self.manager) {
+ if (@available(macOS 11, iOS 14, *))
+ return self.manager.authorizationStatus;
+ }
+
+ return QT_IGNORE_DEPRECATIONS(CLLocationManager.authorizationStatus);
+}
+
+- (Qt::PermissionStatus)accuracyAuthorization:(QLocationPermission)permission
+{
+ auto status = CLAccuracyAuthorizationReducedAccuracy;
+ if (@available(macOS 11, iOS 14, *))
+ status = self.manager.accuracyAuthorization;
+
+ switch (status) {
+ case CLAccuracyAuthorizationFullAccuracy:
+ return Qt::PermissionStatus::Granted;
+ case CLAccuracyAuthorizationReducedAccuracy:
+ if (permission.accuracy() == QLocationPermission::Approximate)
+ return Qt::PermissionStatus::Granted;
+ else
+ return Qt::PermissionStatus::Denied;
+ }
+
+ qCWarning(lcPermissions) << "Unknown accuracy status" << status << "detected in" << self;
+ return Qt::PermissionStatus::Denied;
+}
+
+- (QStringList)usageDescriptionsFor:(QPermission)permission
+{
+#if defined(Q_OS_MACOS)
+ return { "NSLocationUsageDescription" };
+#else // iOS 11 and above
+ QStringList usageDescriptions = { "NSLocationWhenInUseUsageDescription" };
+ const auto locationPermission = *permission.value<QLocationPermission>();
+ if (locationPermission.availability() == QLocationPermission::Always)
+ usageDescriptions << "NSLocationAlwaysAndWhenInUseUsageDescription";
+ return usageDescriptions;
+#endif
+}
+
+- (void)requestPermission:(QPermission)permission withCallback:(PermissionCallback)callback
+{
+ const bool requestAlreadyInFlight = !m_requests.empty();
+
+ m_requests.push_back({ permission, callback });
+
+ if (requestAlreadyInFlight) {
+ qCDebug(lcLocationPermission).nospace() << "Already processing "
+ << m_requests.front().permission << ". Deferring request";
+ } else {
+ [self requestQueuedPermission];
+ }
+}
+
+- (void)requestQueuedPermission
+{
+ Q_ASSERT(!m_requests.empty());
+ const auto permission = m_requests.front().permission;
+
+ qCDebug(lcLocationPermission) << "Requesting" << permission;
+
+ if (!self.manager) {
+ self.manager = [[CLLocationManager new] autorelease];
+ self.manager.delegate = self;
+ }
+
+ const auto locationPermission = *permission.value<QLocationPermission>();
+ switch (locationPermission.availability()) {
+ case QLocationPermission::WhenInUse:
+ // The documentation specifies that requestWhenInUseAuthorization can
+ // only be called when the current authorization status is undetermined.
+ switch ([self authorizationStatus]) {
+ case kCLAuthorizationStatusNotDetermined:
+ [self.manager requestWhenInUseAuthorization];
+ break;
+ default:
+ [self deliverResult];
+ }
+ break;
+ case QLocationPermission::Always:
+#if defined(Q_OS_VISIONOS)
+ [self deliverResult]; // Not supported
+#else
+ // The documentation specifies that requestAlwaysAuthorization can only
+ // be called when the current authorization status is either undetermined,
+ // or authorized when in use.
+ switch ([self authorizationStatus]) {
+ case kCLAuthorizationStatusNotDetermined:
+ [self.manager requestAlwaysAuthorization];
+ break;
+#ifdef Q_OS_IOS
+ case kCLAuthorizationStatusAuthorizedWhenInUse:
+ // Unfortunately when asking for AlwaysAuthorization when in
+ // the WhenInUse state, to "upgrade" the permission, the iOS
+ // location system will not give us a callback if the user
+ // denies the request, leaving us hanging without a way to
+ // respond to the permission request.
+ qCWarning(lcLocationPermission) << "QLocationPermission::WhenInUse"
+ << "can not be upgraded to QLocationPermission::Always on iOS."
+ << "Please request QLocationPermission::Always directly.";
+ Q_FALLTHROUGH();
+#endif
+ default:
+ [self deliverResult];
+ }
+#endif
+ break;
+ }
+}
+
+- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status
+{
+ qCDebug(lcLocationPermission) << "Processing authorization"
+ << "update with status" << status;
+
+ if (m_requests.empty()) {
+ qCDebug(lcLocationPermission) << "No requests in flight. Ignoring.";
+ return;
+ }
+
+ if (status == kCLAuthorizationStatusNotDetermined) {
+ // Initializing a CLLocationManager will result in an initial
+ // callback to the delegate even before we've requested any
+ // location permissions. Normally we would ignore this callback
+ // due to the request queue check above, but if this callback
+ // comes in after the application has requested a permission
+ // we don't want to report the undetermined status, but rather
+ // wait for the actual result to come in.
+ qCDebug(lcLocationPermission) << "Ignoring delegate callback"
+ << "with status kCLAuthorizationStatusNotDetermined";
+ return;
+ }
+
+ [self deliverResult];
+}
+
+- (void)deliverResult
+{
+ auto request = m_requests.front();
+ m_requests.pop_front();
+
+ auto status = [self checkPermission:request.permission];
+ qCDebug(lcLocationPermission) << "Result for"
+ << request.permission << "was" << status;
+
+ request.callback(status);
+
+ if (!m_requests.empty()) {
+ qCDebug(lcLocationPermission) << "Still have"
+ << m_requests.size() << "deferred request(s)";
+ [self requestQueuedPermission];
+ }
+}
+
+@end
+
+#include "moc_qdarwinpermissionplugin_p_p.cpp"
diff --git a/src/corelib/platform/darwin/qdarwinpermissionplugin_microphone.mm b/src/corelib/platform/darwin/qdarwinpermissionplugin_microphone.mm
new file mode 100644
index 0000000000..5dc434309d
--- /dev/null
+++ b/src/corelib/platform/darwin/qdarwinpermissionplugin_microphone.mm
@@ -0,0 +1,42 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#include "qdarwinpermissionplugin_p_p.h"
+
+#include <AVFoundation/AVFoundation.h>
+
+QT_DEFINE_PERMISSION_STATUS_CONVERTER(AVAuthorizationStatus);
+
+#ifndef BUILDING_PERMISSION_REQUEST
+
+@implementation QDarwinMicrophonePermissionHandler
+- (Qt::PermissionStatus)checkPermission:(QPermission)permission
+{
+ const auto status = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeAudio];
+ return nativeStatusToQtStatus(status);
+}
+
+- (QStringList)usageDescriptionsFor:(QPermission)permission
+{
+ Q_UNUSED(permission);
+ return { "NSMicrophoneUsageDescription" };
+}
+@end
+
+#include "moc_qdarwinpermissionplugin_p_p.cpp"
+
+#else // Building request
+
+@implementation QDarwinMicrophonePermissionHandler (Request)
+- (void)requestPermission:(QPermission)permission withCallback:(PermissionCallback)callback
+{
+ [AVCaptureDevice requestAccessForMediaType:AVMediaTypeAudio completionHandler:^(BOOL granted)
+ {
+ Q_UNUSED(granted); // We use status instead
+ const auto status = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeAudio];
+ callback(nativeStatusToQtStatus(status));
+ }];
+}
+@end
+
+#endif // BUILDING_PERMISSION_REQUEST
diff --git a/src/corelib/platform/darwin/qdarwinpermissionplugin_p.h b/src/corelib/platform/darwin/qdarwinpermissionplugin_p.h
new file mode 100644
index 0000000000..03530133ad
--- /dev/null
+++ b/src/corelib/platform/darwin/qdarwinpermissionplugin_p.h
@@ -0,0 +1,58 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QDARWINPERMISSIONPLUGIN_P_H
+#define QDARWINPERMISSIONPLUGIN_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. This header file may change
+// from version to version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QtCore/qnamespace.h>
+#include <QtCore/private/qpermissions_p.h>
+#include <QtCore/private/qcore_mac_p.h>
+
+#if defined(__OBJC__)
+#include <Foundation/NSObject.h>
+#endif
+
+QT_USE_NAMESPACE
+
+using namespace QPermissions::Private;
+
+#if defined(__OBJC__)
+Q_CORE_EXPORT
+#endif
+QT_DECLARE_NAMESPACED_OBJC_INTERFACE(QDarwinPermissionHandler, NSObject
+- (Qt::PermissionStatus)checkPermission:(QPermission)permission;
+- (void)requestPermission:(QPermission)permission withCallback:(PermissionCallback)callback;
+- (QStringList)usageDescriptionsFor:(QPermission)permission;
+)
+
+QT_BEGIN_NAMESPACE
+
+class Q_CORE_EXPORT QDarwinPermissionPlugin : public QPermissionPlugin
+{
+ Q_OBJECT
+public:
+ QDarwinPermissionPlugin(QDarwinPermissionHandler *handler);
+ ~QDarwinPermissionPlugin();
+
+ Qt::PermissionStatus checkPermission(const QPermission &permission) override;
+ void requestPermission(const QPermission &permission, const PermissionCallback &callback) override;
+
+private:
+ Q_SLOT void permissionUpdated(Qt::PermissionStatus status, const PermissionCallback &callback);
+ bool verifyUsageDescriptions(const QPermission &permission);
+ QDarwinPermissionHandler *m_handler = nullptr;
+};
+
+QT_END_NAMESPACE
+
+#endif // QDARWINPERMISSIONPLUGIN_P_H
diff --git a/src/corelib/platform/darwin/qdarwinpermissionplugin_p_p.h b/src/corelib/platform/darwin/qdarwinpermissionplugin_p_p.h
new file mode 100644
index 0000000000..649af06507
--- /dev/null
+++ b/src/corelib/platform/darwin/qdarwinpermissionplugin_p_p.h
@@ -0,0 +1,104 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QDARWINPERMISSIONPLUGIN_P_P_H
+#define QDARWINPERMISSIONPLUGIN_P_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. This header file may change
+// from version to version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#if !defined(QT_DARWIN_PERMISSION_PLUGIN)
+#error "This header should only be included from permission plugins"
+#endif
+
+#include <QtCore/qnamespace.h>
+#include <QtCore/private/qpermissions_p.h>
+#include <QtCore/private/qcore_mac_p.h>
+
+#include "qdarwinpermissionplugin_p.h"
+
+using namespace QPermissions::Private;
+
+#ifndef QT_JOIN
+#define QT_JOIN_IMPL(A, B) A ## B
+#define QT_JOIN(A, B) QT_JOIN_IMPL(A, B)
+#endif
+
+#define PERMISSION_PLUGIN_NAME(SUFFIX) \
+ QT_JOIN(QT_JOIN(QT_JOIN( \
+ QDarwin, QT_DARWIN_PERMISSION_PLUGIN), Permission), SUFFIX)
+
+#define PERMISSION_PLUGIN_CLASSNAME PERMISSION_PLUGIN_NAME(Plugin)
+#define PERMISSION_PLUGIN_HANDLER PERMISSION_PLUGIN_NAME(Handler)
+
+QT_DECLARE_NAMESPACED_OBJC_INTERFACE(
+ PERMISSION_PLUGIN_HANDLER,
+ QDarwinPermissionHandler
+)
+
+QT_BEGIN_NAMESPACE
+
+class Q_CORE_EXPORT PERMISSION_PLUGIN_CLASSNAME : public QDarwinPermissionPlugin
+{
+ Q_OBJECT
+ Q_PLUGIN_METADATA(
+ IID QPermissionPluginInterface_iid
+ FILE "QDarwin" QT_STRINGIFY(QT_DARWIN_PERMISSION_PLUGIN) "PermissionPlugin.json")
+public:
+ PERMISSION_PLUGIN_CLASSNAME()
+ : QDarwinPermissionPlugin([[PERMISSION_PLUGIN_HANDLER alloc] init])
+ {}
+};
+
+QT_END_NAMESPACE
+
+// Request
+#if defined(BUILDING_PERMISSION_REQUEST)
+extern "C" void PERMISSION_PLUGIN_NAME(Request)() {}
+#endif
+
+// -------------------------------------------------------
+
+namespace {
+template <typename NativeStatus>
+struct NativeStatusHelper;
+
+template <typename NativeStatus>
+Qt::PermissionStatus nativeStatusToQtStatus(NativeStatus status)
+{
+ using Converter = NativeStatusHelper<NativeStatus>;
+ switch (status) {
+ case Converter::Authorized:
+ return Qt::PermissionStatus::Granted;
+ case Converter::Denied:
+ case Converter::Restricted:
+ return Qt::PermissionStatus::Denied;
+ case Converter::Undetermined:
+ return Qt::PermissionStatus::Undetermined;
+ }
+ qCWarning(lcPermissions) << "Unknown permission status" << status << "detected in"
+ << QT_STRINGIFY(QT_DARWIN_PERMISSION_PLUGIN);
+ return Qt::PermissionStatus::Denied;
+}
+} // namespace
+
+#define QT_DEFINE_PERMISSION_STATUS_CONVERTER(NativeStatus) \
+namespace { template<> \
+struct NativeStatusHelper<NativeStatus> \
+{\
+ enum { \
+ Authorized = NativeStatus##Authorized, \
+ Denied = NativeStatus##Denied, \
+ Restricted = NativeStatus##Restricted, \
+ Undetermined = NativeStatus##NotDetermined \
+ }; \
+}; }
+
+#endif // QDARWINPERMISSIONPLUGIN_P_P_H
diff --git a/src/corelib/platform/ios/PrivacyInfo.xcprivacy b/src/corelib/platform/ios/PrivacyInfo.xcprivacy
new file mode 100644
index 0000000000..5f84a229a5
--- /dev/null
+++ b/src/corelib/platform/ios/PrivacyInfo.xcprivacy
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>NSPrivacyTracking</key>
+ <false/>
+ <key>NSPrivacyCollectedDataTypes</key>
+ <array/>
+ <key>NSPrivacyTrackingDomains</key>
+ <array/>
+ <key>NSPrivacyAccessedAPITypes</key>
+ <array>
+ <dict>
+ <key>NSPrivacyAccessedAPIType</key>
+ <string>NSPrivacyAccessedAPICategoryFileTimestamp</string>
+ <key>NSPrivacyAccessedAPITypeReasons</key>
+ <array>
+ <string>0A2A.1</string> <!-- QFileInfo -->
+ </array>
+ </dict>
+ <dict>
+ <key>NSPrivacyAccessedAPIType</key>
+ <string>NSPrivacyAccessedAPICategoryDiskSpace</string>
+ <key>NSPrivacyAccessedAPITypeReasons</key>
+ <array>
+ <string>85F4.1</string> <!-- QStorageInfo -->
+ </array>
+ </dict>
+ </array>
+</dict>
+</plist>
diff --git a/src/corelib/platform/wasm/qstdweb.cpp b/src/corelib/platform/wasm/qstdweb.cpp
index 2bbf57953b..75e76a6806 100644
--- a/src/corelib/platform/wasm/qstdweb.cpp
+++ b/src/corelib/platform/wasm/qstdweb.cpp
@@ -1,53 +1,379 @@
-/****************************************************************************
-**
-** Copyright (C) 2019 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2019 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qstdweb_p.h"
+#include <QtCore/qcoreapplication.h>
+#include <QtCore/qfile.h>
+#include <QtCore/qmimedata.h>
+
#include <emscripten/bind.h>
+#include <emscripten/emscripten.h>
+#include <emscripten/html5.h>
+#include <emscripten/threading.h>
+
#include <cstdint>
#include <iostream>
+#include <unordered_map>
+
QT_BEGIN_NAMESPACE
+using namespace Qt::Literals::StringLiterals;
+
namespace qstdweb {
+static void usePotentialyUnusedSymbols()
+{
+ // Using this adds a reference on JSEvents and specialHTMLTargets which are always exported.
+ // This hack is needed as it is currently impossible to specify a dollar sign in
+ // target_link_options. The following is impossible:
+ // DEFAULT_LIBRARY_FUNCS_TO_INCLUDE=$JSEvents
+ // TODO(mikolajboc): QTBUG-108444, review this when cmake gets fixed.
+ // Volatile is to make this unoptimizable, so that the function is referenced, but is not
+ // called at runtime.
+ volatile bool doIt = false;
+ if (doIt)
+ emscripten_set_wheel_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, 0, 0, NULL);
+}
+
+Q_CONSTRUCTOR_FUNCTION(usePotentialyUnusedSymbols)
typedef double uint53_t; // see Number.MAX_SAFE_INTEGER
+namespace {
+// Reads file in chunks in order to avoid holding two copies in memory at the same time
+struct ChunkedFileReader
+{
+public:
+ static void read(File file, char *buffer, uint32_t offset, uint32_t end,
+ std::function<void()> onCompleted)
+ {
+ (new ChunkedFileReader(end, std::move(onCompleted), std::move(file)))
+ ->readNextChunk(offset, buffer);
+ }
+
+private:
+ ChunkedFileReader(uint32_t end, std::function<void()> onCompleted, File file)
+ : end(end), onCompleted(std::move(onCompleted)), file(std::move(file))
+ {
+ }
+
+ void readNextChunk(uint32_t chunkBegin, char *chunkBuffer)
+ {
+ // Copy current chunk from JS memory to Wasm memory
+ qstdweb::ArrayBuffer result = fileReader.result();
+ qstdweb::Uint8Array(result).copyTo(chunkBuffer);
+
+ // Read next chunk if not at buffer end
+ const uint32_t nextChunkBegin = std::min(chunkBegin + result.byteLength(), end);
+ if (nextChunkBegin == end) {
+ onCompleted();
+ delete this;
+ return;
+ }
+ char *nextChunkBuffer = chunkBuffer + result.byteLength();
+ fileReader.onLoad([this, nextChunkBegin, nextChunkBuffer](emscripten::val) {
+ readNextChunk(nextChunkBegin, nextChunkBuffer);
+ });
+ const uint32_t nextChunkEnd = std::min(nextChunkBegin + chunkSize, end);
+ qstdweb::Blob blob = file.slice(nextChunkBegin, nextChunkEnd);
+ fileReader.readAsArrayBuffer(blob);
+ }
+
+ static constexpr uint32_t chunkSize = 256 * 1024;
+
+ qstdweb::FileReader fileReader;
+ uint32_t end;
+ std::function<void()> onCompleted;
+ File file;
+};
+
+enum class CallbackType {
+ Then,
+ Catch,
+ Finally,
+};
+
+void validateCallbacks(const PromiseCallbacks& callbacks) {
+ Q_ASSERT(!!callbacks.catchFunc || !!callbacks.finallyFunc || !!callbacks.thenFunc);
+}
+
+using ThunkId = int;
+
+#define THUNK_NAME(type, i) callbackThunk##type##i
+
+// A resource pool for exported promise thunk functions. ThunkPool::poolSize sets of
+// 3 promise thunks (then, catch, finally) are exported and can be used by promises
+// in C++. To allocate a thunk, call allocateThunk. When a thunk is ready for use,
+// a callback with allocation RAII object ThunkAllocation will be returned. Deleting
+// the object frees the thunk and automatically makes any pending allocateThunk call
+// run its callback with a free thunk slot.
+class ThunkPool {
+public:
+ static constexpr size_t poolSize = 4;
+
+ // An allocation for a thunk function set. Following the RAII pattern, destruction of
+ // this objects frees a corresponding thunk pool entry.
+ // To actually make the thunks react to a js promise's callbacks, call bindToPromise.
+ class ThunkAllocation {
+ public:
+ ThunkAllocation(int thunkId, ThunkPool* pool) : m_thunkId(thunkId), m_pool(pool) {}
+ ~ThunkAllocation() {
+ m_pool->free(m_thunkId);
+ }
+
+ // The id of the underlaying thunk set
+ int id() const { return m_thunkId; }
+
+ // Binds the corresponding thunk set to the js promise 'target'.
+ void bindToPromise(emscripten::val target, const PromiseCallbacks& callbacks) {
+ using namespace emscripten;
+
+ if (Q_LIKELY(callbacks.thenFunc)) {
+ target = target.call<val>(
+ "then",
+ emscripten::val::module_property(thunkName(CallbackType::Then, id()).data()));
+ }
+ if (callbacks.catchFunc) {
+ target = target.call<val>(
+ "catch",
+ emscripten::val::module_property(thunkName(CallbackType::Catch, id()).data()));
+ }
+ // Guarantee the invocation of at least one callback by always
+ // registering 'finally'. This is required by WebPromiseManager
+ // design
+ target = target.call<val>(
+ "finally", emscripten::val::module_property(
+ thunkName(CallbackType::Finally, id()).data()));
+ }
+
+ private:
+ int m_thunkId;
+ ThunkPool* m_pool;
+ };
+
+ ThunkPool() {
+ std::iota(m_free.begin(), m_free.end(), 0);
+ }
+
+ void setThunkCallback(std::function<void(int, CallbackType, emscripten::val)> callback) {
+ m_callback = std::move(callback);
+ }
+
+ void allocateThunk(std::function<void(std::unique_ptr<ThunkAllocation>)> onAllocated) {
+ if (m_free.empty()) {
+ m_pendingAllocations.push_back(std::move(onAllocated));
+ return;
+ }
+
+ const int thunkId = m_free.back();
+ m_free.pop_back();
+ onAllocated(std::make_unique<ThunkAllocation>(thunkId, this));
+ }
+
+ static QByteArray thunkName(CallbackType type, size_t i) {
+ return QStringLiteral("promiseCallback%1%2").arg([type]() -> QString {
+ switch (type) {
+ case CallbackType::Then:
+ return QStringLiteral("Then");
+ case CallbackType::Catch:
+ return QStringLiteral("Catch");
+ case CallbackType::Finally:
+ return QStringLiteral("Finally");
+ }
+ }()).arg(i).toLatin1();
+ }
+
+ static ThunkPool* get();
+
+#define THUNK(i) \
+ static void THUNK_NAME(Then, i)(emscripten::val result) \
+ { \
+ get()->onThunkCalled(i, CallbackType::Then, std::move(result)); \
+ } \
+ static void THUNK_NAME(Catch, i)(emscripten::val result) \
+ { \
+ get()->onThunkCalled(i, CallbackType::Catch, std::move(result)); \
+ } \
+ static void THUNK_NAME(Finally, i)() \
+ { \
+ get()->onThunkCalled(i, CallbackType::Finally, emscripten::val::undefined()); \
+ }
+
+ THUNK(0);
+ THUNK(1);
+ THUNK(2);
+ THUNK(3);
+
+#undef THUNK
+
+private:
+ void onThunkCalled(int index, CallbackType type, emscripten::val result) {
+ m_callback(index, type, std::move(result));
+ }
+
+ void free(int thunkId) {
+ if (m_pendingAllocations.empty()) {
+ // Return the thunk to the free pool
+ m_free.push_back(thunkId);
+ return;
+ }
+
+ // Take the next enqueued allocation and reuse the thunk
+ auto allocation = m_pendingAllocations.back();
+ m_pendingAllocations.pop_back();
+ allocation(std::make_unique<ThunkAllocation>(thunkId, this));
+ }
+
+ std::function<void(int, CallbackType, emscripten::val)> m_callback;
+
+ std::vector<int> m_free = std::vector<int>(poolSize);
+ std::vector<std::function<void(std::unique_ptr<ThunkAllocation>)>> m_pendingAllocations;
+};
+
+Q_GLOBAL_STATIC(ThunkPool, g_thunkPool)
+
+ThunkPool* ThunkPool::get()
+{
+ return g_thunkPool;
+}
+
+#define CALLBACK_BINDING(i) \
+ emscripten::function(ThunkPool::thunkName(CallbackType::Then, i).data(), \
+ &ThunkPool::THUNK_NAME(Then, i)); \
+ emscripten::function(ThunkPool::thunkName(CallbackType::Catch, i).data(), \
+ &ThunkPool::THUNK_NAME(Catch, i)); \
+ emscripten::function(ThunkPool::thunkName(CallbackType::Finally, i).data(), \
+ &ThunkPool::THUNK_NAME(Finally, i));
+
+EMSCRIPTEN_BINDINGS(qtThunkPool) {
+ CALLBACK_BINDING(0)
+ CALLBACK_BINDING(1)
+ CALLBACK_BINDING(2)
+ CALLBACK_BINDING(3)
+}
+
+#undef CALLBACK_BINDING
+#undef THUNK_NAME
+
+class WebPromiseManager
+{
+public:
+ WebPromiseManager();
+ ~WebPromiseManager();
+
+ WebPromiseManager(const WebPromiseManager& other) = delete;
+ WebPromiseManager(WebPromiseManager&& other) = delete;
+ WebPromiseManager& operator=(const WebPromiseManager& other) = delete;
+ WebPromiseManager& operator=(WebPromiseManager&& other) = delete;
+
+ void adoptPromise(emscripten::val target, PromiseCallbacks callbacks);
+
+ static WebPromiseManager* get();
+
+private:
+ struct RegistryEntry {
+ PromiseCallbacks callbacks;
+ std::unique_ptr<ThunkPool::ThunkAllocation> allocation;
+ };
+
+ static std::optional<CallbackType> parseCallbackType(emscripten::val callbackType);
+
+ void subscribeToJsPromiseCallbacks(int i, const PromiseCallbacks& callbacks, emscripten::val jsContextfulPromise);
+ void promiseThunkCallback(int i, CallbackType type, emscripten::val result);
+
+ void registerPromise(std::unique_ptr<ThunkPool::ThunkAllocation> allocation, PromiseCallbacks promise);
+ void unregisterPromise(ThunkId context);
+
+ std::array<RegistryEntry, ThunkPool::poolSize> m_promiseRegistry;
+};
+
+Q_GLOBAL_STATIC(WebPromiseManager, webPromiseManager)
+
+WebPromiseManager::WebPromiseManager()
+{
+ ThunkPool::get()->setThunkCallback(std::bind(
+ &WebPromiseManager::promiseThunkCallback, this,
+ std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));
+}
+
+std::optional<CallbackType>
+WebPromiseManager::parseCallbackType(emscripten::val callbackType)
+{
+ if (!callbackType.isString())
+ return std::nullopt;
+
+ const std::string data = callbackType.as<std::string>();
+ if (data == "then")
+ return CallbackType::Then;
+ if (data == "catch")
+ return CallbackType::Catch;
+ if (data == "finally")
+ return CallbackType::Finally;
+ return std::nullopt;
+}
+
+WebPromiseManager::~WebPromiseManager() = default;
+
+WebPromiseManager *WebPromiseManager::get()
+{
+ return webPromiseManager();
+}
+
+void WebPromiseManager::promiseThunkCallback(int context, CallbackType type, emscripten::val result)
+{
+ auto* promiseState = &m_promiseRegistry[context];
+
+ auto* callbacks = &promiseState->callbacks;
+ switch (type) {
+ case CallbackType::Then:
+ callbacks->thenFunc(result);
+ break;
+ case CallbackType::Catch:
+ callbacks->catchFunc(result);
+ break;
+ case CallbackType::Finally:
+ // Final callback may be empty, used solely for promise unregistration
+ if (callbacks->finallyFunc) {
+ callbacks->finallyFunc();
+ }
+ unregisterPromise(context);
+ break;
+ }
+}
+
+void WebPromiseManager::registerPromise(
+ std::unique_ptr<ThunkPool::ThunkAllocation> allocation,
+ PromiseCallbacks callbacks)
+{
+ const ThunkId id = allocation->id();
+ m_promiseRegistry[id] =
+ RegistryEntry {std::move(callbacks), std::move(allocation)};
+}
+
+void WebPromiseManager::unregisterPromise(ThunkId context)
+{
+ m_promiseRegistry[context] = {};
+}
+
+void WebPromiseManager::adoptPromise(emscripten::val target, PromiseCallbacks callbacks) {
+ ThunkPool::get()->allocateThunk([=](std::unique_ptr<ThunkPool::ThunkAllocation> allocation) {
+ allocation->bindToPromise(std::move(target), callbacks);
+ registerPromise(std::move(allocation), std::move(callbacks));
+ });
+}
+#if defined(QT_STATIC)
+
+EM_JS(bool, jsHaveAsyncify, (), { return typeof Asyncify !== "undefined"; });
+EM_JS(bool, jsHaveJspi, (),
+ { return typeof Asyncify !== "undefined" && !!Asyncify.makeAsyncFunction && !!WebAssembly.Function; });
+
+#else
+
+bool jsHaveAsyncify() { return false; }
+bool jsHaveJspi() { return false; }
+
+#endif
+} // namespace
ArrayBuffer::ArrayBuffer(uint32_t size)
{
@@ -68,30 +394,71 @@ uint32_t ArrayBuffer::byteLength() const
return m_arrayBuffer["byteLength"].as<uint32_t>();
}
+ArrayBuffer ArrayBuffer::slice(uint32_t begin, uint32_t end) const
+{
+ return ArrayBuffer(m_arrayBuffer.call<emscripten::val>("slice", begin, end));
+}
+
+emscripten::val ArrayBuffer::val() const
+{
+ return m_arrayBuffer;
+}
+
Blob::Blob(const emscripten::val &blob)
:m_blob(blob)
{
}
+Blob Blob::fromArrayBuffer(const ArrayBuffer &arrayBuffer)
+{
+ auto array = emscripten::val::array();
+ array.call<void>("push", arrayBuffer.val());
+ return Blob(emscripten::val::global("Blob").new_(array));
+}
+
uint32_t Blob::size() const
{
return m_blob["size"].as<uint32_t>();
}
-// Copies content from the given buffer into a Blob object
-Blob Blob::copyFrom(const char *buffer, uint32_t size)
+Blob Blob::copyFrom(const char *buffer, uint32_t size, std::string mimeType)
{
Uint8Array contentCopy = Uint8Array::copyFrom(buffer, size);
emscripten::val contentArray = emscripten::val::array();
- contentArray.call<void>("push", contentCopy.m_uint8Array);
+ contentArray.call<void>("push", contentCopy.val());
emscripten::val type = emscripten::val::object();
- type.set("type","application/octet-stream");
+ type.set("type", std::move(mimeType));
return Blob(emscripten::val::global("Blob").new_(contentArray, type));
}
-emscripten::val Blob::val()
+// Copies content from the given buffer into a Blob object
+Blob Blob::copyFrom(const char *buffer, uint32_t size)
+{
+ return copyFrom(buffer, size, "application/octet-stream");
+}
+
+Blob Blob::slice(uint32_t begin, uint32_t end) const
+{
+ return Blob(m_blob.call<emscripten::val>("slice", begin, end));
+}
+
+ArrayBuffer Blob::arrayBuffer_sync() const
+{
+ QEventLoop loop;
+ emscripten::val buffer;
+ qstdweb::Promise::make(m_blob, QStringLiteral("arrayBuffer"), {
+ .thenFunc = [&loop, &buffer](emscripten::val arrayBuffer) {
+ buffer = arrayBuffer;
+ loop.quit();
+ }
+ });
+ loop.exec();
+ return ArrayBuffer(buffer);
+}
+
+emscripten::val Blob::val() const
{
return m_blob;
}
@@ -102,6 +469,17 @@ File::File(const emscripten::val &file)
}
+File::~File() = default;
+
+File::File(const File &other) = default;
+
+File::File(File &&other) = default;
+
+File &File::operator=(const File &other) = default;
+
+File &File::operator=(File &&other) = default;
+
+
Blob File::slice(uint64_t begin, uint64_t end) const
{
return Blob(m_file.call<emscripten::val>("slice", uint53_t(begin), uint53_t(end)));
@@ -124,47 +502,17 @@ std::string Blob::type() const
// Streams partial file content into the given buffer asynchronously. The completed
// callback is called on completion.
-void File::stream(uint32_t offset, uint32_t length, char *buffer, const std::function<void ()> &completed) const
+void File::stream(uint32_t offset, uint32_t length, char *buffer,
+ std::function<void()> completed) const
{
- // Read file in chunks in order to avoid holding two copies in memory at the same time
- const uint32_t chunkSize = 256 * 1024;
- const uint32_t end = offset + length;
- // assert end < file.size
- auto fileReader = std::make_shared<qstdweb::FileReader>();
-
- // "this" is valid now, but may not be by the time the chunkCompleted callback
- // below is made. Make a copy of the file handle.
- const File fileHandle = *this;
- auto chunkCompleted = std::make_shared<std::function<void (uint32_t, char *buffer)>>();
- *chunkCompleted = [=](uint32_t chunkBegin, char *chunkBuffer) mutable {
-
- // Copy current chunk from JS memory to Wasm memory
- qstdweb::ArrayBuffer result = fileReader->result();
- qstdweb::Uint8Array(result).copyTo(chunkBuffer);
-
- // Read next chunk if not at buffer end
- uint32_t nextChunkBegin = std::min(chunkBegin + result.byteLength(), end);
- uint32_t nextChunkEnd = std::min(nextChunkBegin + chunkSize, end);
- if (nextChunkBegin == end) {
- completed();
- chunkCompleted.reset();
- return;
- }
- char *nextChunkBuffer = chunkBuffer + result.byteLength();
- fileReader->onLoad([=]() { (*chunkCompleted)(nextChunkBegin, nextChunkBuffer); });
- qstdweb::Blob blob = fileHandle.slice(nextChunkBegin, nextChunkEnd);
- fileReader->readAsArrayBuffer(blob);
- };
-
- // Read first chunk. First iteration is a dummy iteration with no available data.
- (*chunkCompleted)(offset, buffer);
+ ChunkedFileReader::read(*this, buffer, offset, offset + length, std::move(completed));
}
// Streams file content into the given buffer asynchronously. The completed
// callback is called on completion.
-void File::stream(char *buffer, const std::function<void ()> &completed) const
+void File::stream(char *buffer, std::function<void()> completed) const
{
- stream(0, size(), buffer, completed);
+ stream(0, size(), buffer, std::move(completed));
}
std::string File::type() const
@@ -172,6 +520,27 @@ std::string File::type() const
return m_file["type"].as<std::string>();
}
+emscripten::val File::val() const
+{
+ return m_file;
+}
+
+FileUrlRegistration::FileUrlRegistration(File file)
+{
+ m_path = QString::fromStdString(emscripten::val::global("window")["URL"].call<std::string>(
+ "createObjectURL", file.file()));
+}
+
+FileUrlRegistration::~FileUrlRegistration()
+{
+ emscripten::val::global("window")["URL"].call<void>("revokeObjectURL",
+ emscripten::val(m_path.toStdString()));
+}
+
+FileUrlRegistration::FileUrlRegistration(FileUrlRegistration &&other) = default;
+
+FileUrlRegistration &FileUrlRegistration::operator=(FileUrlRegistration &&other) = default;
+
FileList::FileList(const emscripten::val &fileList)
:m_fileList(fileList)
{
@@ -193,6 +562,11 @@ File FileList::operator[](int index) const
return item(index);
}
+emscripten::val FileList::val() const
+{
+ return m_fileList;
+}
+
ArrayBuffer FileReader::result() const
{
return ArrayBuffer(m_fileReader["result"]);
@@ -203,19 +577,27 @@ void FileReader::readAsArrayBuffer(const Blob &blob) const
m_fileReader.call<void>("readAsArrayBuffer", blob.m_blob);
}
-void FileReader::onLoad(const std::function<void ()> &onLoad)
+void FileReader::onLoad(const std::function<void(emscripten::val)> &onLoad)
+{
+ m_onLoad.reset();
+ m_onLoad = std::make_unique<EventCallback>(m_fileReader, "load", onLoad);
+}
+
+void FileReader::onError(const std::function<void(emscripten::val)> &onError)
{
- m_onLoad.reset(new EventCallback(m_fileReader, "load", onLoad));
+ m_onError.reset();
+ m_onError = std::make_unique<EventCallback>(m_fileReader, "error", onError);
}
-void FileReader::onError(const std::function<void ()> &onError)
+void FileReader::onAbort(const std::function<void(emscripten::val)> &onAbort)
{
- m_onError.reset(new EventCallback(m_fileReader, "error", onError));
+ m_onAbort.reset();
+ m_onAbort = std::make_unique<EventCallback>(m_fileReader, "abort", onAbort);
}
-void FileReader::onAbort(const std::function<void ()> &onAbort)
+emscripten::val FileReader::val() const
{
- m_onAbort.reset(new EventCallback(m_fileReader, "abort", onAbort));
+ return m_fileReader;
}
Uint8Array Uint8Array::heap()
@@ -246,7 +628,7 @@ Uint8Array::Uint8Array(const ArrayBuffer &buffer, uint32_t offset, uint32_t leng
// Constructs a Uint8Array which references an area on the heap.
Uint8Array::Uint8Array(const char *buffer, uint32_t size)
-:m_uint8Array(Uint8Array::constructor_().new_(Uint8Array::heap().buffer().m_arrayBuffer, uint32_t(buffer), size))
+:m_uint8Array(Uint8Array::constructor_().new_(Uint8Array::heap().buffer().m_arrayBuffer, uintptr_t(buffer), size))
{
}
@@ -273,13 +655,32 @@ void Uint8Array::set(const Uint8Array &source)
m_uint8Array.call<void>("set", source.m_uint8Array); // copies source content
}
-// Copies the Uint8Array conent to a destination on the heap
+Uint8Array Uint8Array::subarray(uint32_t begin, uint32_t end)
+{
+ // Note: using uint64_t here errors with "Cannot convert a BigInt value to a number"
+ // (see JS BigInt and Number types). Use uint32_t for now.
+ return Uint8Array(m_uint8Array.call<emscripten::val>("subarray", begin, end));
+}
+
+// Copies the Uint8Array content to a destination on the heap
void Uint8Array::copyTo(char *destination) const
{
Uint8Array(destination, length()).set(*this);
}
-// Copies the Uint8Array conent to a destination on the heap
+// Copies the Uint8Array content to a destination QByteArray
+QByteArray Uint8Array::copyToQByteArray() const
+{
+ if (length() > std::numeric_limits<qsizetype>::max())
+ return QByteArray();
+
+ QByteArray destinationArray;
+ destinationArray.resize(length());
+ copyTo(destinationArray.data());
+ return destinationArray;
+}
+
+// Copies the Uint8Array content to a destination on the heap
void Uint8Array::copy(char *destination, const Uint8Array &source)
{
Uint8Array(destination, source.length()).set(source);
@@ -293,6 +694,17 @@ Uint8Array Uint8Array::copyFrom(const char *buffer, uint32_t size)
return contentCopy;
}
+// Copies content from a QByteArray to a new Uint8Array object
+Uint8Array Uint8Array::copyFrom(const QByteArray &buffer)
+{
+ return copyFrom(buffer.constData(), buffer.size());
+}
+
+emscripten::val Uint8Array::val() const
+{
+ return m_uint8Array;
+}
+
emscripten::val Uint8Array::heap_()
{
return emscripten::val::module_property("HEAPU8");
@@ -303,30 +715,221 @@ emscripten::val Uint8Array::constructor_()
return emscripten::val::global("Uint8Array");
}
+class EventListener {
+public:
+ EventListener(uintptr_t handler)
+ :m_handler(handler)
+ {
+
+ }
+
+ // Special function - addEventListender() allows adding an object with a
+ // handleEvent() function which eceives the event.
+ void handleEvent(emscripten::val event) {
+ auto handlerPtr = reinterpret_cast<std::function<void(emscripten::val)> *>(m_handler);
+ (*handlerPtr)(event);
+ }
+
+ uintptr_t m_handler;
+};
+
// Registers a callback function for a named event on the given element. The event
// name must be the name as returned by the Event.type property: e.g. "load", "error".
-EventCallback::EventCallback(emscripten::val element, const std::string &name, const std::function<void ()> &fn)
-:m_fn(fn)
+EventCallback::~EventCallback()
{
- element.set(contextPropertyName(name).c_str(), emscripten::val(intptr_t(this)));
- element.set((std::string("on") + name).c_str(), emscripten::val::module_property("qtStdWebEventCallbackActivate"));
+ m_element.call<void>("removeEventListener", m_eventName, m_eventListener);
}
-void EventCallback::activate(emscripten::val event)
+EventCallback::EventCallback(emscripten::val element, const std::string &name, const std::function<void(emscripten::val)> &handler)
+ :m_element(element)
+ ,m_eventName(name)
+ ,m_handler(std::make_unique<std::function<void(emscripten::val)>>(handler))
{
- emscripten::val target = event["target"];
- std::string eventName = event["type"].as<std::string>();
- EventCallback *that = reinterpret_cast<EventCallback *>(target[contextPropertyName(eventName).c_str()].as<intptr_t>());
- that->m_fn();
+ uintptr_t handlerUint = reinterpret_cast<uintptr_t>(m_handler.get()); // FIXME: pass pointer directly instead
+ m_eventListener = emscripten::val::module_property("QtEventListener").new_(handlerUint);
+ m_element.call<void>("addEventListener", m_eventName, m_eventListener);
}
-std::string EventCallback::contextPropertyName(const std::string &eventName)
+EMSCRIPTEN_BINDINGS(qtStdwebCalback) {
+ emscripten::class_<EventListener>("QtEventListener")
+ .constructor<uintptr_t>()
+ .function("handleEvent", &EventListener::handleEvent);
+}
+
+namespace Promise {
+ void adoptPromise(emscripten::val promiseObject, PromiseCallbacks callbacks) {
+ validateCallbacks(callbacks);
+
+ WebPromiseManager::get()->adoptPromise(
+ std::move(promiseObject), std::move(callbacks));
+ }
+
+ void all(std::vector<emscripten::val> promises, PromiseCallbacks callbacks) {
+ struct State {
+ std::map<int, emscripten::val> results;
+ int remainingThenCallbacks;
+ int remainingFinallyCallbacks;
+ };
+
+ validateCallbacks(callbacks);
+
+ auto state = std::make_shared<State>();
+ state->remainingThenCallbacks = state->remainingFinallyCallbacks = promises.size();
+
+ for (size_t i = 0; i < promises.size(); ++i) {
+ PromiseCallbacks individualPromiseCallback;
+ if (callbacks.thenFunc) {
+ individualPromiseCallback.thenFunc = [i, state, callbacks](emscripten::val partialResult) mutable {
+ state->results.emplace(i, std::move(partialResult));
+ if (!--(state->remainingThenCallbacks)) {
+ std::vector<emscripten::val> transformed;
+ for (auto& data : state->results) {
+ transformed.push_back(std::move(data.second));
+ }
+ callbacks.thenFunc(emscripten::val::array(std::move(transformed)));
+ }
+ };
+ }
+ if (callbacks.catchFunc) {
+ individualPromiseCallback.catchFunc = [state, callbacks](emscripten::val error) mutable {
+ callbacks.catchFunc(error);
+ };
+ }
+ individualPromiseCallback.finallyFunc = [state, callbacks]() mutable {
+ if (!--(state->remainingFinallyCallbacks)) {
+ if (callbacks.finallyFunc)
+ callbacks.finallyFunc();
+ // Explicitly reset here for verbosity, this would have been done automatically with the
+ // destruction of the adopted promise in WebPromiseManager.
+ state.reset();
+ }
+ };
+
+ adoptPromise(std::move(promises.at(i)), std::move(individualPromiseCallback));
+ }
+ }
+}
+
+// Asyncify and thread blocking: Normally, it's not possible to block the main
+// thread, except if asyncify is enabled. Secondary threads can always block.
+//
+// haveAsyncify(): returns true if the main thread can block on QEventLoop::exec(),
+// if either asyncify 1 or 2 (JSPI) is available.
+//
+// haveJspi(): returns true if asyncify 2 (JSPI) is available.
+//
+// canBlockCallingThread(): returns true if the calling thread can block on
+// QEventLoop::exec(), using either asyncify or as a seconarday thread.
+bool haveJspi()
{
- return std::string("data-qtEventCallbackContext") + eventName;
+ static bool HaveJspi = jsHaveJspi();
+ return HaveJspi;
}
-EMSCRIPTEN_BINDINGS(qtStdwebCalback) {
- emscripten::function("qtStdWebEventCallbackActivate", &EventCallback::activate);
+bool haveAsyncify()
+{
+ static bool HaveAsyncify = jsHaveAsyncify() || haveJspi();
+ return HaveAsyncify;
+}
+
+bool canBlockCallingThread()
+{
+ return haveAsyncify() || !emscripten_is_main_runtime_thread();
+}
+
+BlobIODevice::BlobIODevice(Blob blob)
+ : m_blob(blob)
+{
+
+}
+
+bool BlobIODevice::open(QIODevice::OpenMode mode)
+{
+ if (mode.testFlag(QIODevice::WriteOnly))
+ return false;
+ return QIODevice::open(mode);
+}
+
+bool BlobIODevice::isSequential() const
+{
+ return false;
+}
+
+qint64 BlobIODevice::size() const
+{
+ return m_blob.size();
+}
+
+bool BlobIODevice::seek(qint64 pos)
+{
+ if (pos >= size())
+ return false;
+ return QIODevice::seek(pos);
+}
+
+qint64 BlobIODevice::readData(char *data, qint64 maxSize)
+{
+ uint64_t begin = QIODevice::pos();
+ uint64_t end = std::min<uint64_t>(begin + maxSize, size());
+ uint64_t size = end - begin;
+ if (size > 0) {
+ qstdweb::ArrayBuffer buffer = m_blob.slice(begin, end).arrayBuffer_sync();
+ qstdweb::Uint8Array(buffer).copyTo(data);
+ }
+ return size;
+}
+
+qint64 BlobIODevice::writeData(const char *, qint64)
+{
+ Q_UNREACHABLE();
+}
+
+Uint8ArrayIODevice::Uint8ArrayIODevice(Uint8Array array)
+ : m_array(array)
+{
+
+}
+
+bool Uint8ArrayIODevice::open(QIODevice::OpenMode mode)
+{
+ return QIODevice::open(mode);
+}
+
+bool Uint8ArrayIODevice::isSequential() const
+{
+ return false;
+}
+
+qint64 Uint8ArrayIODevice::size() const
+{
+ return m_array.length();
+}
+
+bool Uint8ArrayIODevice::seek(qint64 pos)
+{
+ if (pos >= size())
+ return false;
+ return QIODevice::seek(pos);
+}
+
+qint64 Uint8ArrayIODevice::readData(char *data, qint64 maxSize)
+{
+ uint64_t begin = QIODevice::pos();
+ uint64_t end = std::min<uint64_t>(begin + maxSize, size());
+ uint64_t size = end - begin;
+ if (size > 0)
+ m_array.subarray(begin, end).copyTo(data);
+ return size;
+}
+
+qint64 Uint8ArrayIODevice::writeData(const char *data, qint64 maxSize)
+{
+ uint64_t begin = QIODevice::pos();
+ uint64_t end = std::min<uint64_t>(begin + maxSize, size());
+ uint64_t size = end - begin;
+ if (size > 0)
+ m_array.subarray(begin, end).set(Uint8Array(data, size));
+ return size;
}
} // namespace qstdweb
diff --git a/src/corelib/platform/wasm/qstdweb_p.h b/src/corelib/platform/wasm/qstdweb_p.h
index 9d5e2418ec..a3b5bd5b6b 100644
--- a/src/corelib/platform/wasm/qstdweb_p.h
+++ b/src/corelib/platform/wasm/qstdweb_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2019 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QSTDWEB_P_H
#define QSTDWEB_P_H
@@ -51,17 +15,36 @@
// We mean it.
//
-#include <qglobal.h>
+#include <private/qglobal_p.h>
+#include <QtCore/qglobal.h>
+#include "QtCore/qhash.h"
+#include "QtCore/qiodevice.h"
+
#include <emscripten/val.h>
+
#include <cstdint>
#include <functional>
+#include <initializer_list>
+#include <memory>
+#include <string>
+#include <utility>
+
+#if QT_CONFIG(thread)
+#include <emscripten/proxying.h>
+#include <emscripten/threading.h>
+#endif // #if QT_CONFIG(thread)
QT_BEGIN_NAMESPACE
+class QMimeData;
+
namespace qstdweb {
+ extern const char makeContextfulPromiseFunctionName[];
// DOM API in C++, implemented using emscripten val.h and bind.h.
// This is private API and can be extended and changed as needed.
+ // The API mirrors that of the native API, with some extensions
+ // to ease usage from C++ code.
class ArrayBuffer;
class Blob;
@@ -71,23 +54,29 @@ namespace qstdweb {
class Uint8Array;
class EventCallback;
- class ArrayBuffer {
+ class Q_CORE_EXPORT ArrayBuffer {
public:
explicit ArrayBuffer(uint32_t size);
explicit ArrayBuffer(const emscripten::val &arrayBuffer);
uint32_t byteLength() const;
+ ArrayBuffer slice(uint32_t begin, uint32_t end) const;
+ emscripten::val val() const;
private:
friend class Uint8Array;
emscripten::val m_arrayBuffer = emscripten::val::undefined();
};
- class Blob {
+ class Q_CORE_EXPORT Blob {
public:
explicit Blob(const emscripten::val &blob);
+ static Blob fromArrayBuffer(const ArrayBuffer &arrayBuffer);
uint32_t size() const;
+ static Blob copyFrom(const char *buffer, uint32_t size, std::string mimeType);
static Blob copyFrom(const char *buffer, uint32_t size);
- emscripten::val val();
+ Blob slice(uint32_t begin, uint32_t end) const;
+ ArrayBuffer arrayBuffer_sync() const;
+ emscripten::val val() const;
std::string type() const;
private:
@@ -95,23 +84,54 @@ namespace qstdweb {
emscripten::val m_blob = emscripten::val::undefined();
};
- class File {
+ class Q_CORE_EXPORT File {
public:
File() = default;
explicit File(const emscripten::val &file);
+ ~File();
+
+ File(const File &other);
+ File(File &&other);
+ File &operator=(const File &other);
+ File &operator=(File &&other);
Blob slice(uint64_t begin, uint64_t end) const;
std::string name() const;
uint64_t size() const;
std::string type() const;
- void stream(uint32_t offset, uint32_t length, char *buffer, const std::function<void ()> &completed) const;
- void stream(char *buffer, const std::function<void ()> &completed) const;
+ void stream(uint32_t offset, uint32_t length, char *buffer,
+ std::function<void()> completed) const;
+ void stream(char *buffer, std::function<void()> completed) const;
+ emscripten::val val() const;
+ void fileUrlRegistration() const;
+ const QString &fileUrlPath() const { return m_urlPath; }
+ emscripten::val file() const { return m_file; }
private:
emscripten::val m_file = emscripten::val::undefined();
+ QString m_urlPath;
};
- class FileList {
+ class Q_CORE_EXPORT FileUrlRegistration
+ {
+ public:
+ explicit FileUrlRegistration(File file);
+ ~FileUrlRegistration();
+
+ FileUrlRegistration(const FileUrlRegistration &other) = delete;
+ FileUrlRegistration(FileUrlRegistration &&other);
+ FileUrlRegistration &operator=(const FileUrlRegistration &other) = delete;
+ FileUrlRegistration &operator=(FileUrlRegistration &&other);
+
+ const QString &path() const { return m_path; }
+
+ private:
+ QString m_path;
+ };
+
+ using FileUrlRegistrations = std::vector<std::unique_ptr<FileUrlRegistration>>;
+
+ class Q_CORE_EXPORT FileList {
public:
FileList() = default;
explicit FileList(const emscripten::val &fileList);
@@ -119,19 +139,21 @@ namespace qstdweb {
int length() const;
File item(int index) const;
File operator[](int index) const;
+ emscripten::val val() const;
private:
emscripten::val m_fileList = emscripten::val::undefined();
};
- class FileReader {
+ class Q_CORE_EXPORT FileReader {
public:
ArrayBuffer result() const;
void readAsArrayBuffer(const Blob &blob) const;
- void onLoad(const std::function<void ()> &onLoad);
- void onError(const std::function<void ()> &onError);
- void onAbort(const std::function<void ()> &onAbort);
+ void onLoad(const std::function<void(emscripten::val)> &onLoad);
+ void onError(const std::function<void(emscripten::val)> &onError);
+ void onAbort(const std::function<void(emscripten::val)> &onAbort);
+ emscripten::val val() const;
private:
emscripten::val m_fileReader = emscripten::val::global("FileReader").new_();
@@ -140,7 +162,7 @@ namespace qstdweb {
std::unique_ptr<EventCallback> m_onAbort;
};
- class Uint8Array {
+ class Q_CORE_EXPORT Uint8Array {
public:
static Uint8Array heap();
explicit Uint8Array(const emscripten::val &uint8Array);
@@ -152,26 +174,158 @@ namespace qstdweb {
ArrayBuffer buffer() const;
uint32_t length() const;
void set(const Uint8Array &source);
+ Uint8Array subarray(uint32_t begin, uint32_t end);
void copyTo(char *destination) const;
+ QByteArray copyToQByteArray() const;
+
static void copy(char *destination, const Uint8Array &source);
static Uint8Array copyFrom(const char *buffer, uint32_t size);
+ static Uint8Array copyFrom(const QByteArray &buffer);
+ emscripten::val val() const;
+
private:
- friend class Blob;
static emscripten::val heap_();
static emscripten::val constructor_();
emscripten::val m_uint8Array = emscripten::val::undefined();
};
- class EventCallback
+ class Q_CORE_EXPORT EventCallback
+ {
+ public:
+ EventCallback() = default;
+ ~EventCallback();
+ EventCallback(EventCallback const&) = delete;
+ EventCallback& operator=(EventCallback const&) = delete;
+ EventCallback(emscripten::val element, const std::string &name,
+ const std::function<void(emscripten::val)> &fn);
+
+ private:
+ emscripten::val m_element = emscripten::val::undefined();
+ std::string m_eventName;
+ std::unique_ptr<std::function<void(emscripten::val)>> m_handler;
+ emscripten::val m_eventListener = emscripten::val::undefined();
+ };
+
+ struct PromiseCallbacks
+ {
+ std::function<void(emscripten::val)> thenFunc;
+ std::function<void(emscripten::val)> catchFunc;
+ std::function<void()> finallyFunc;
+ };
+
+ namespace Promise {
+ void Q_CORE_EXPORT adoptPromise(emscripten::val promise, PromiseCallbacks callbacks);
+
+ template<typename... Args>
+ void make(emscripten::val target,
+ QString methodName,
+ PromiseCallbacks callbacks,
+ Args... args)
+ {
+ emscripten::val promiseObject = target.call<emscripten::val>(
+ methodName.toStdString().c_str(), std::forward<Args>(args)...);
+ if (promiseObject.isUndefined() || promiseObject["constructor"]["name"].as<std::string>() != "Promise") {
+ qFatal("This function did not return a promise");
+ }
+
+ adoptPromise(std::move(promiseObject), std::move(callbacks));
+ }
+
+ void Q_CORE_EXPORT all(std::vector<emscripten::val> promises, PromiseCallbacks callbacks);
+ };
+
+ template<class F>
+ decltype(auto) bindForever(F wrappedCallback)
+ {
+ return wrappedCallback;
+ }
+
+ class Q_CORE_EXPORT BlobIODevice: public QIODevice
{
public:
- EventCallback(emscripten::val element, const std::string &name, const std::function<void ()> &fn);
- static void activate(emscripten::val event);
+ BlobIODevice(Blob blob);
+ bool open(QIODeviceBase::OpenMode mode) override;
+ bool isSequential() const override;
+ qint64 size() const override;
+ bool seek(qint64 pos) override;
+
+ protected:
+ qint64 readData(char *data, qint64 maxSize) override;
+ qint64 writeData(const char *, qint64) override;
+
private:
- static std::string contextPropertyName(const std::string &eventName);
- std::function<void ()> m_fn;
+ Blob m_blob;
};
+
+ class Uint8ArrayIODevice: public QIODevice
+ {
+ public:
+ Uint8ArrayIODevice(Uint8Array array);
+ bool open(QIODevice::OpenMode mode) override;
+ bool isSequential() const override;
+ qint64 size() const override;
+ bool seek(qint64 pos) override;
+
+ protected:
+ qint64 readData(char *data, qint64 maxSize) override;
+ qint64 writeData(const char *data, qint64 size) override;
+
+ private:
+ Uint8Array m_array;
+ };
+
+ inline emscripten::val window()
+ {
+ static emscripten::val savedWindow = emscripten::val::global("window");
+ return savedWindow;
+ }
+
+ bool haveAsyncify();
+ bool Q_CORE_EXPORT haveJspi();
+ bool canBlockCallingThread();
+
+ struct CancellationFlag
+ {
+ };
+
+#if QT_CONFIG(thread)
+ template<class T>
+ T proxyCall(std::function<T()> task, emscripten::ProxyingQueue *queue)
+ {
+ T result;
+ queue->proxySync(emscripten_main_runtime_thread_id(),
+ [task, result = &result]() { *result = task(); });
+ return result;
+ }
+
+ template<>
+ inline void proxyCall<void>(std::function<void()> task, emscripten::ProxyingQueue *queue)
+ {
+ queue->proxySync(emscripten_main_runtime_thread_id(), task);
+ }
+
+ template<class T>
+ T runTaskOnMainThread(std::function<T()> task, emscripten::ProxyingQueue *queue)
+ {
+ return emscripten_is_main_runtime_thread() ? task() : proxyCall<T>(std::move(task), queue);
+ }
+
+ template<class T>
+ T runTaskOnMainThread(std::function<T()> task)
+ {
+ emscripten::ProxyingQueue singleUseQueue;
+ return runTaskOnMainThread<T>(task, &singleUseQueue);
+ }
+
+#else
+ template<class T>
+ T runTaskOnMainThread(std::function<T()> task)
+ {
+ return task();
+ }
+#endif // QT_CONFIG(thread)
+
}
QT_END_NAMESPACE
diff --git a/src/corelib/platform/windows/qcomobject_p.h b/src/corelib/platform/windows/qcomobject_p.h
new file mode 100644
index 0000000000..8f27a18ff6
--- /dev/null
+++ b/src/corelib/platform/windows/qcomobject_p.h
@@ -0,0 +1,127 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QCOMOBJECT_P_H
+#define QCOMOBJECT_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QtCore/private/qglobal_p.h>
+
+#if defined(Q_OS_WIN) || defined(Q_QDOC)
+
+# include <QtCore/qt_windows.h>
+
+QT_BEGIN_NAMESPACE
+
+namespace QtPrivate {
+
+template <typename... TInterfaces>
+struct QComObjectTraits
+{
+ static constexpr bool isGuidOf(REFIID riid) noexcept
+ {
+ return ((riid == __uuidof(TInterfaces)) || ...);
+ }
+};
+
+} // namespace QtPrivate
+
+// NOTE: In order to be able to query the intermediate interface, i.e. the one you do not specify in
+// QComObject interface list (TFirstInterface, TInterfaces) but that is a base for any of them
+// (except IUnknown) you need to provide an explicit specialization of function
+// QComObjectTraits<...>::isGuidOf for that type. For example, if you want to inherit interface
+// IMFSampleGrabberSinkCallback which inherits IMFClockStateSink and you want to be able to query
+// the latter one you need to provide this explicit specialization:
+//
+// class SinkCallback : public QComObject<IMFSampleGrabberSinkCallback>
+// {
+// ...
+// };
+//
+// namespace QtPrivate {
+//
+// template <>
+// struct QComObjectTraits<IMFSampleGrabberSinkCallback>
+// {
+// static constexpr bool isGuidOf(REFIID riid) noexcept
+// {
+// return QComObjectTraits<IMFSampleGrabberSinkCallback, IMFClockStateSink>::isGuidOf(riid);
+// }
+// };
+//
+// }
+
+template <typename TFirstInterface, typename... TAdditionalInterfaces>
+class QComObject : public TFirstInterface, public TAdditionalInterfaces...
+{
+public:
+ STDMETHODIMP QueryInterface(REFIID riid, void **ppvObject) override
+ {
+ if (!ppvObject)
+ return E_POINTER;
+
+ if (riid == __uuidof(IUnknown)) {
+ *ppvObject = static_cast<IUnknown *>(static_cast<TFirstInterface *>(this));
+ AddRef();
+
+ return S_OK;
+ }
+
+ return tryQueryInterface<TFirstInterface, TAdditionalInterfaces...>(riid, ppvObject);
+ }
+
+ STDMETHODIMP_(ULONG) AddRef() override { return ++m_referenceCount; }
+
+ STDMETHODIMP_(ULONG) Release() override
+ {
+ const LONG referenceCount = --m_referenceCount;
+ if (referenceCount == 0)
+ delete this;
+
+ return referenceCount;
+ }
+
+protected:
+ QComObject() = default;
+
+ // Destructor is not public. Caller should call Release.
+ // Derived class should make its destructor private to force this behavior.
+ virtual ~QComObject() = default;
+
+private:
+ template <typename TInterface, typename... TRest>
+ HRESULT tryQueryInterface(REFIID riid, void **ppvObject)
+ {
+ if (QtPrivate::QComObjectTraits<TInterface>::isGuidOf(riid)) {
+ *ppvObject = static_cast<TInterface *>(this);
+ AddRef();
+
+ return S_OK;
+ }
+
+ if constexpr (sizeof...(TRest) > 0)
+ return tryQueryInterface<TRest...>(riid, ppvObject);
+
+ *ppvObject = nullptr;
+
+ return E_NOINTERFACE;
+ }
+
+ std::atomic<LONG> m_referenceCount = 1;
+};
+
+QT_END_NAMESPACE
+
+#endif // Q_OS_WIN
+
+#endif // QCOMOBJECT_P_H
diff --git a/src/corelib/platform/windows/qfactorycacheregistration.cpp b/src/corelib/platform/windows/qfactorycacheregistration.cpp
new file mode 100644
index 0000000000..6bd69c66d1
--- /dev/null
+++ b/src/corelib/platform/windows/qfactorycacheregistration.cpp
@@ -0,0 +1,53 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#include "qfactorycacheregistration_p.h"
+
+#include <QtCore/QMutex>
+
+QT_BEGIN_NAMESPACE
+
+#ifdef QT_USE_FACTORY_CACHE_REGISTRATION
+
+static QBasicMutex registrationMutex;
+static detail::QWinRTFactoryCacheRegistration *firstElement;
+
+detail::QWinRTFactoryCacheRegistration::QWinRTFactoryCacheRegistration(
+ QFunctionPointer clearFunction)
+ : m_clearFunction(clearFunction)
+{
+ QMutexLocker lock(&registrationMutex);
+
+ // forward pointers
+ m_next = std::exchange(firstElement, this);
+
+ // backward pointers
+ m_prevNext = &firstElement;
+ if (m_next)
+ m_next->m_prevNext = &m_next;
+}
+
+detail::QWinRTFactoryCacheRegistration::~QWinRTFactoryCacheRegistration()
+{
+ QMutexLocker lock(&registrationMutex);
+
+ *m_prevNext = m_next;
+
+ if (m_next)
+ m_next->m_prevNext = m_prevNext;
+}
+
+void detail::QWinRTFactoryCacheRegistration::clearAllCaches()
+{
+ QMutexLocker lock(&registrationMutex);
+
+ detail::QWinRTFactoryCacheRegistration *element;
+
+ for (element = firstElement; element != nullptr; element = element->m_next) {
+ element->m_clearFunction();
+ }
+}
+
+#endif
+
+QT_END_NAMESPACE
diff --git a/src/corelib/platform/windows/qfactorycacheregistration_p.h b/src/corelib/platform/windows/qfactorycacheregistration_p.h
new file mode 100644
index 0000000000..d0b19b995b
--- /dev/null
+++ b/src/corelib/platform/windows/qfactorycacheregistration_p.h
@@ -0,0 +1,52 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QFACTORYCACHEREGISTRATION_P_H
+#define QFACTORYCACHEREGISTRATION_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QtCore/qglobal.h>
+
+#if !defined(QT_BOOTSTRAPPED) && QT_CONFIG(cpp_winrt)
+# define QT_USE_FACTORY_CACHE_REGISTRATION
+#endif
+
+#ifdef QT_USE_FACTORY_CACHE_REGISTRATION
+
+#include "qt_winrtbase_p.h"
+
+QT_BEGIN_NAMESPACE
+
+namespace detail {
+
+class QWinRTFactoryCacheRegistration
+{
+public:
+ Q_CORE_EXPORT explicit QWinRTFactoryCacheRegistration(QFunctionPointer clearFunction);
+ Q_CORE_EXPORT ~QWinRTFactoryCacheRegistration();
+ Q_CORE_EXPORT static void clearAllCaches();
+
+ Q_DISABLE_COPY_MOVE(QWinRTFactoryCacheRegistration)
+private:
+ QWinRTFactoryCacheRegistration **m_prevNext = nullptr;
+ QWinRTFactoryCacheRegistration *m_next = nullptr;
+ QFunctionPointer m_clearFunction;
+};
+
+inline QWinRTFactoryCacheRegistration reg([]() noexcept { winrt::clear_factory_cache(); });
+}
+
+QT_END_NAMESPACE
+
+#endif
+#endif // QFACTORYCACHEREGISTRATION_P_H
diff --git a/src/corelib/platform/windows/qt_winrtbase_p.h b/src/corelib/platform/windows/qt_winrtbase_p.h
new file mode 100644
index 0000000000..fb7366f93d
--- /dev/null
+++ b/src/corelib/platform/windows/qt_winrtbase_p.h
@@ -0,0 +1,34 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QT_WINRTBASE_P_H
+#define QT_WINRTBASE_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QtCore/qglobal.h>
+
+#if QT_CONFIG(cpp_winrt)
+# include <winrt/base.h>
+# include <QtCore/private/qfactorycacheregistration_p.h>
+// Workaround for Windows SDK bug.
+// See https://github.com/microsoft/Windows.UI.Composition-Win32-Samples/issues/47
+namespace winrt::impl
+{
+ template <typename Async>
+ auto wait_for(Async const& async, Windows::Foundation::TimeSpan const& timeout);
+}
+// See https://learn.microsoft.com/en-us/windows/uwp/cpp-and-winrt-apis/faq#how-do-i-resolve-ambiguities-with-getcurrenttime-and-or-try-
+// for more workarounds.
+#endif // QT_CONFIG(cpp/winrt)
+
+#endif // QT_WINRTBASE_P_H
diff --git a/src/corelib/plugin/qcoffpeparser.cpp b/src/corelib/plugin/qcoffpeparser.cpp
index f258ef5de2..639e402a07 100644
--- a/src/corelib/plugin/qcoffpeparser.cpp
+++ b/src/corelib/plugin/qcoffpeparser.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qcoffpeparser_p.h"
@@ -45,21 +9,19 @@
#include <optional>
-#define WIN32_LEAN_AND_MEAN
-#include <windows.h>
-#undef min
-#undef max
+#include <qt_windows.h>
QT_BEGIN_NAMESPACE
+using namespace Qt::StringLiterals;
+
// Whether we include some extra validity checks
// (checks to ensure we don't read out-of-bounds are always included)
static constexpr bool IncludeValidityChecks = true;
-static constexpr char rawSectionName[] = ".qtmetadata";
-static constexpr QLatin1String metadataSectionName(rawSectionName, sizeof(rawSectionName) - 1);
-static constexpr QLatin1String truncatedSectionName =
- metadataSectionName.left(sizeof(IMAGE_SECTION_HEADER::Name));
+static constexpr inline auto metadataSectionName() noexcept { return ".qtmetadata"_L1; }
+static constexpr QLatin1StringView truncatedSectionName =
+ metadataSectionName().left(sizeof(IMAGE_SECTION_HEADER::Name));
#ifdef QT_BUILD_INTERNAL
# define QCOFFPEPARSER_DEBUG
@@ -78,7 +40,7 @@ static const WORD ExpectedMachine =
#if 0
// nothing, just so everything is #elf
#elif defined(Q_PROCESSOR_ARM_32)
- IMAGE_FILE_MACHINE_ARM
+ IMAGE_FILE_MACHINE_ARMNT
#elif defined(Q_PROCESSOR_ARM_64)
IMAGE_FILE_MACHINE_ARM64
#elif defined(Q_PROCESSOR_IA64)
@@ -155,7 +117,7 @@ Q_DECL_UNUSED static QDebug &operator<<(QDebug &d, HeaderDebug h)
switch (h.h->FileHeader.Machine) {
case IMAGE_FILE_MACHINE_I386: d << "i386"; break;
case IMAGE_FILE_MACHINE_ARM: d << "ARM"; break;
- case IMAGE_FILE_MACHINE_ARMNT: d << "ARM Thumb-2"; break;;
+ case IMAGE_FILE_MACHINE_ARMNT: d << "ARM Thumb-2"; break;
case IMAGE_FILE_MACHINE_THUMB: d << "Thumb"; break;
case IMAGE_FILE_MACHINE_IA64: d << "IA-64"; break;
case IMAGE_FILE_MACHINE_MIPS16: d << "MIPS16"; break;
@@ -330,7 +292,7 @@ findStringTable(QByteArrayView data, const IMAGE_NT_HEADERS *ntHeader, const Err
return data.sliced(off, size);
}
-static QLatin1String findSectionName(const IMAGE_SECTION_HEADER *section, QByteArrayView stringTable)
+static QLatin1StringView findSectionName(const IMAGE_SECTION_HEADER *section, QByteArrayView stringTable)
{
auto ptr = reinterpret_cast<const char *>(section->Name);
qsizetype n = qstrnlen(ptr, sizeof(section->Name));
@@ -346,13 +308,13 @@ static QLatin1String findSectionName(const IMAGE_SECTION_HEADER *section, QByteA
bool ok;
qsizetype offset = QByteArrayView(ptr + 1, n - 1).toUInt(&ok);
if (!ok || offset >= stringTable.size())
- return QLatin1String();
+ return {};
ptr = stringTable.data() + offset;
n = qstrnlen(ptr, stringTable.size() - offset);
}
- return QLatin1String(ptr, n);
+ return {ptr, n};
}
QLibraryScanResult QCoffPeParser::parse(QByteArrayView data, QString *errMsg)
@@ -367,7 +329,7 @@ QLibraryScanResult QCoffPeParser::parse(QByteArrayView data, QString *errMsg)
return {};
QByteArrayView stringTable;
- if (auto optional = findStringTable(data, ntHeaders, error); optional)
+ if (auto optional = findStringTable(data, ntHeaders, error))
stringTable = *optional;
else
return {};
@@ -375,7 +337,7 @@ QLibraryScanResult QCoffPeParser::parse(QByteArrayView data, QString *errMsg)
// scan the sections now
const auto sectionTableEnd = section + ntHeaders->FileHeader.NumberOfSections;
for ( ; section < sectionTableEnd; ++section) {
- QLatin1String sectionName = findSectionName(section, stringTable);
+ QLatin1StringView sectionName = findSectionName(section, stringTable);
peDebug << "section" << sectionName << SectionDebug{section};
if (IncludeValidityChecks && sectionName.isEmpty())
return error(QLibrary::tr("a section name is empty or extends past the end of the file"));
@@ -383,7 +345,7 @@ QLibraryScanResult QCoffPeParser::parse(QByteArrayView data, QString *errMsg)
size_t offset = section->PointerToRawData;
if (size_t end; qAddOverflow<size_t>(offset, section->SizeOfRawData, &end)
|| end > size_t(data.size()))
- return error(QLibrary::tr("a section data extends past the end of the file"));
+ return error(QLibrary::tr("section contents extend past the end of the file"));
DWORD type = section->Characteristics
& (IMAGE_SCN_CNT_CODE | IMAGE_SCN_CNT_INITIALIZED_DATA
@@ -392,7 +354,7 @@ QLibraryScanResult QCoffPeParser::parse(QByteArrayView data, QString *errMsg)
continue;
// if we do have a string table, the name may be complete
- if (sectionName != truncatedSectionName && sectionName != metadataSectionName)
+ if (sectionName != truncatedSectionName && sectionName != metadataSectionName())
continue;
peDebug << "found .qtmetadata section";
diff --git a/src/corelib/plugin/qcoffpeparser_p.h b/src/corelib/plugin/qcoffpeparser_p.h
index 91de6a416b..19c650fee0 100644
--- a/src/corelib/plugin/qcoffpeparser_p.h
+++ b/src/corelib/plugin/qcoffpeparser_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
// no, this is not a misspelling of "coffeeparser"
#ifndef QCOFFPEPARSER_H
diff --git a/src/corelib/plugin/qelfparser_p.cpp b/src/corelib/plugin/qelfparser_p.cpp
index ed973e4323..7f6271cde4 100644
--- a/src/corelib/plugin/qelfparser_p.cpp
+++ b/src/corelib/plugin/qelfparser_p.cpp
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2017 The Qt Company Ltd.
-** Copyright (C) 2021 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2017 The Qt Company Ltd.
+// Copyright (C) 2021 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qelfparser_p.h"
@@ -58,6 +22,8 @@
QT_BEGIN_NAMESPACE
+using namespace Qt::StringLiterals;
+
// ### Qt7: propagate the constant and eliminate dead code
static constexpr bool ElfNotesAreMandatory = QT_VERSION >= QT_VERSION_CHECK(7,0,0);
@@ -88,6 +54,10 @@ static Q_LOGGING_CATEGORY(lcElfParser, "qt.core.plugin.elfparser")
# define PT_GNU_PROPERTY 0x6474e553
#endif
+#ifndef PN_XNUM
+# define PN_XNUM 0xffff
+#endif
+
QT_WARNING_PUSH
QT_WARNING_DISABLE_CLANG("-Wunused-const-variable")
@@ -141,14 +111,22 @@ struct ElfMachineCheck
static const Elf32_Half ExpectedMachine =
#if 0
// nothing
+#elif defined(Q_PROCESSOR_ALPHA)
+ EM_ALPHA
#elif defined(Q_PROCESSOR_ARM_32)
EM_ARM
#elif defined(Q_PROCESSOR_ARM_64)
EM_AARCH64
#elif defined(Q_PROCESSOR_BLACKFIN)
EM_BLACKFIN
+#elif defined(Q_PROCESSOR_HPPA)
+ EM_PARISC
#elif defined(Q_PROCESSOR_IA64)
EM_IA_64
+#elif defined(Q_PROCESSOR_LOONGARCH)
+ EM_LOONGARCH
+#elif defined(Q_PROCESSOR_M68K)
+ EM_68K
#elif defined(Q_PROCESSOR_MIPS)
EM_MIPS
#elif defined(Q_PROCESSOR_POWER_32)
@@ -162,10 +140,8 @@ struct ElfMachineCheck
#elif defined(Q_PROCESSOR_SH)
EM_SH
#elif defined(Q_PROCESSOR_SPARC_V9)
-# warning "Please confirm that this is correct for Linux and Solaris"
EM_SPARCV9
#elif defined(Q_PROCESSOR_SPARC_64)
-# warning "Please confirm that this is correct for Linux and Solaris"
EM_SPARCV9
#elif defined(Q_PROCESSOR_SPARC)
EM_SPARC
@@ -363,7 +339,7 @@ Q_DECL_UNUSED Q_DECL_COLD_FUNCTION static QDebug &operator<<(QDebug &d, ElfHeade
case ELFOSABI_SYSV: d << " (SYSV"; break;
case ELFOSABI_HPUX: d << " (HP-UX"; break;
case ELFOSABI_NETBSD: d << " (NetBSD"; break;
- case ELFOSABI_GNU: d << " (GNU/Linux"; break;
+ case ELFOSABI_LINUX: d << " (GNU/Linux"; break;
case ELFOSABI_SOLARIS: d << " (Solaris"; break;
case ELFOSABI_AIX: d << " (AIX"; break;
case ELFOSABI_IRIX: d << " (IRIX"; break;
@@ -407,17 +383,27 @@ Q_DECL_UNUSED Q_DECL_COLD_FUNCTION static QDebug &operator<<(QDebug &d, ElfHeade
switch (r.machine) {
// list definitely not exhaustive!
case EM_NONE: d << ", no machine"; break;
+ case EM_ALPHA: d << ", Alpha"; break;
+ case EM_68K: d << ", MC68000"; break;
case EM_ARM: d << ", ARM"; break;
case EM_AARCH64: d << ", AArch64"; break;
+#ifdef EM_BLACKFIN
case EM_BLACKFIN: d << ", Blackfin"; break;
+#endif
case EM_IA_64: d << ", IA-64"; break;
+#ifdef EM_LOONGARCH
+ case EM_LOONGARCH: d << ", LoongArch"; break;
+#endif
case EM_MIPS: d << ", MIPS"; break;
+ case EM_PARISC: d << ", HPPA"; break;
case EM_PPC: d << ", PowerPC"; break;
case EM_PPC64: d << ", PowerPC 64-bit"; break;
#ifdef EM_RISCV
case EM_RISCV: d << ", RISC-V"; break;
#endif
+#ifdef EM_S390
case EM_S390: d << ", S/390"; break;
+#endif
case EM_SH: d << ", SuperH"; break;
case EM_SPARC: d << ", SPARC"; break;
case EM_SPARCV9: d << ", SPARCv9"; break;
@@ -557,6 +543,8 @@ static bool preScanProgramHeaders(QByteArrayView data, const ErrorMaker &error)
// first, validate the extent of the full program header table
T::Word e_phnum = header->e_phnum;
+ if (e_phnum == PN_XNUM)
+ return error(QLibrary::tr("unimplemented: PN_XNUM program headers")), false;
T::Off offset = e_phnum * sizeof(T::Phdr); // can't overflow due to size of T::Half
if (qAddOverflow(offset, header->e_phoff, &offset) || offset > size_t(data.size()))
return error(QLibrary::tr("program header table extends past the end of the file")), false;
@@ -696,11 +684,11 @@ static QLibraryScanResult scanSections(QByteArrayView data, const ErrorMaker &er
const char *shstrtab_start = data.data() + offset;
shdr = sections;
for (int section = 0; shdr != sections_end; ++section, ++shdr) {
- QLatin1String name;
+ QLatin1StringView name;
if (shdr->sh_name < shstrtab_size) {
const char *namestart = shstrtab_start + shdr->sh_name;
size_t len = qstrnlen(namestart, shstrtab_size - shdr->sh_name);
- name = QLatin1String(namestart, len);
+ name = QLatin1StringView(namestart, len);
}
qEDebug << "section" << section << "name" << name << ElfSectionDebug{shdr};
@@ -711,13 +699,13 @@ static QLibraryScanResult scanSections(QByteArrayView data, const ErrorMaker &er
// sections aren't allowed to extend past the end of the file, unless
// they are NOBITS sections
if (shdr->sh_type == SHT_NOBITS)
- continue;;
+ continue;
if (T::Off end; qAddOverflow(shdr->sh_offset, shdr->sh_size, &end)
|| end > size_t(data.size())) {
- return error(QLibrary::tr("a section data extends past the end of the file"));
+ return error(QLibrary::tr("section contents extend past the end of the file"));
}
- if (name != QLatin1String(".qtmetadata"))
+ if (name != ".qtmetadata"_L1)
continue;
qEDebug << "found .qtmetadata section";
if (shdr->sh_size < sizeof(QPluginMetaData::MagicHeader))
diff --git a/src/corelib/plugin/qelfparser_p.h b/src/corelib/plugin/qelfparser_p.h
index 5c8a0b700f..61498a859a 100644
--- a/src/corelib/plugin/qelfparser_p.h
+++ b/src/corelib/plugin/qelfparser_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QELFPARSER_P_H
#define QELFPARSER_P_H
diff --git a/src/corelib/plugin/qfactoryinterface.cpp b/src/corelib/plugin/qfactoryinterface.cpp
index b503c245c5..1a48d311aa 100644
--- a/src/corelib/plugin/qfactoryinterface.cpp
+++ b/src/corelib/plugin/qfactoryinterface.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qfactoryinterface.h"
diff --git a/src/corelib/plugin/qfactoryinterface.h b/src/corelib/plugin/qfactoryinterface.h
index 86a1c8315f..098b7d4201 100644
--- a/src/corelib/plugin/qfactoryinterface.h
+++ b/src/corelib/plugin/qfactoryinterface.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QFACTORYINTERFACE_H
#define QFACTORYINTERFACE_H
@@ -51,7 +15,7 @@ struct Q_CORE_EXPORT QFactoryInterface
virtual QStringList keys() const = 0;
};
-#ifndef Q_CLANG_QDOC
+#ifndef Q_QDOC
Q_DECLARE_INTERFACE(QFactoryInterface, "org.qt-project.Qt.QFactoryInterface")
#endif
diff --git a/src/corelib/plugin/qfactoryloader.cpp b/src/corelib/plugin/qfactoryloader.cpp
index 79423251a4..e2d9a40cb4 100644
--- a/src/corelib/plugin/qfactoryloader.cpp
+++ b/src/corelib/plugin/qfactoryloader.cpp
@@ -1,62 +1,23 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2018 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// Copyright (C) 2022 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qfactoryloader_p.h"
#ifndef QT_NO_QOBJECT
-#include "qfactoryinterface.h"
-
#include "private/qcoreapplication_p.h"
#include "private/qduplicatetracker_p.h"
#include "private/qloggingregistry_p.h"
#include "private/qobject_p.h"
#include "qcborarray.h"
#include "qcbormap.h"
+#include "qcborstreamreader.h"
#include "qcborvalue.h"
-#include "qcborvalue.h"
-#include "qdir.h"
+#include "qdirlisting.h"
#include "qfileinfo.h"
#include "qjsonarray.h"
#include "qjsondocument.h"
#include "qjsonobject.h"
-#include "qmap.h"
#include "qmutex.h"
#include "qplugin.h"
#include "qplugin_p.h"
@@ -68,28 +29,189 @@
#include <qtcore_tracepoints_p.h>
+#include <map>
+#include <vector>
+
QT_BEGIN_NAMESPACE
-bool QPluginParsedMetaData::parse(QByteArrayView raw)
+using namespace Qt::StringLiterals;
+
+Q_TRACE_POINT(qtcore, QFactoryLoader_update, const QString &fileName);
+
+namespace {
+struct IterationResult
+{
+ enum Result {
+ FinishedSearch = 0,
+ ContinueSearch,
+
+ // parse errors
+ ParsingError = -1,
+ InvalidMetaDataVersion = -2,
+ InvalidTopLevelItem = -3,
+ InvalidHeaderItem = -4,
+ };
+ Result result;
+ QCborError error = { QCborError::NoError };
+
+ Q_IMPLICIT IterationResult(Result r) : result(r) {}
+ Q_IMPLICIT IterationResult(QCborError e) : result(ParsingError), error(e) {}
+};
+
+struct QFactoryLoaderIidSearch
+{
+ QLatin1StringView iid;
+ bool matchesIid = false;
+ QFactoryLoaderIidSearch(QLatin1StringView iid) : iid(iid)
+ { Q_ASSERT(!iid.isEmpty()); }
+
+ static IterationResult::Result skip(QCborStreamReader &reader)
+ {
+ // skip this, whatever it is
+ reader.next();
+ return IterationResult::ContinueSearch;
+ }
+
+ IterationResult::Result operator()(QtPluginMetaDataKeys key, QCborStreamReader &reader)
+ {
+ if (key != QtPluginMetaDataKeys::IID)
+ return skip(reader);
+ matchesIid = (reader.readAllString() == iid);
+ return IterationResult::FinishedSearch;
+ }
+ IterationResult::Result operator()(QUtf8StringView, QCborStreamReader &reader)
+ {
+ return skip(reader);
+ }
+};
+
+struct QFactoryLoaderMetaDataKeysExtractor : QFactoryLoaderIidSearch
+{
+ QCborArray keys;
+ QFactoryLoaderMetaDataKeysExtractor(QLatin1StringView iid)
+ : QFactoryLoaderIidSearch(iid)
+ {}
+
+ IterationResult::Result operator()(QtPluginMetaDataKeys key, QCborStreamReader &reader)
+ {
+ if (key == QtPluginMetaDataKeys::IID) {
+ QFactoryLoaderIidSearch::operator()(key, reader);
+ return IterationResult::ContinueSearch;
+ }
+ if (key != QtPluginMetaDataKeys::MetaData)
+ return skip(reader);
+
+ if (!matchesIid)
+ return IterationResult::FinishedSearch;
+ if (!reader.isMap() || !reader.isLengthKnown())
+ return IterationResult::InvalidHeaderItem;
+ if (!reader.enterContainer())
+ return IterationResult::ParsingError;
+ while (reader.isValid()) {
+ // the metadata is JSON, so keys are all strings
+ QByteArray key = reader.readAllUtf8String();
+ if (key == "Keys") {
+ if (!reader.isArray() || !reader.isLengthKnown())
+ return IterationResult::InvalidHeaderItem;
+ keys = QCborValue::fromCbor(reader).toArray();
+ break;
+ }
+ skip(reader);
+ }
+ // warning: we may not have finished iterating over the header
+ return IterationResult::FinishedSearch;
+ }
+ using QFactoryLoaderIidSearch::operator();
+};
+} // unnamed namespace
+
+template <typename F> static IterationResult iterateInPluginMetaData(QByteArrayView raw, F &&f)
{
QPluginMetaData::Header header;
Q_ASSERT(raw.size() >= qsizetype(sizeof(header)));
memcpy(&header, raw.data(), sizeof(header));
if (Q_UNLIKELY(header.version > QPluginMetaData::CurrentMetaDataVersion))
- return setError(QFactoryLoader::tr("Invalid metadata version"));
+ return IterationResult::InvalidMetaDataVersion;
// use fromRawData to keep QCborStreamReader from copying
raw = raw.sliced(sizeof(header));
QByteArray ba = QByteArray::fromRawData(raw.data(), raw.size());
- QCborParserError err;
- QCborValue metadata = QCborValue::fromCbor(ba, &err);
+ QCborStreamReader reader(ba);
+ if (reader.isInvalid())
+ return reader.lastError();
+ if (!reader.isMap())
+ return IterationResult::InvalidTopLevelItem;
+ if (!reader.enterContainer())
+ return reader.lastError();
+ while (reader.isValid()) {
+ IterationResult::Result r;
+ if (reader.isInteger()) {
+ // integer key, one of ours
+ qint64 value = reader.toInteger();
+ auto key = QtPluginMetaDataKeys(value);
+ if (qint64(key) != value)
+ return IterationResult::InvalidHeaderItem;
+ if (!reader.next())
+ return reader.lastError();
+ r = f(key, reader);
+ } else if (reader.isString()) {
+ QByteArray key = reader.readAllUtf8String();
+ if (key.isNull())
+ return reader.lastError();
+ r = f(QUtf8StringView(key), reader);
+ } else {
+ return IterationResult::InvalidTopLevelItem;
+ }
+
+ if (QCborError e = reader.lastError())
+ return e;
+ if (r != IterationResult::ContinueSearch)
+ return r;
+ }
- if (err.error != QCborError::NoError)
- return setError(QFactoryLoader::tr("Metadata parsing error: %1").arg(err.error.toString()));
- if (!metadata.isMap())
+ if (!reader.leaveContainer())
+ return reader.lastError();
+ return IterationResult::FinishedSearch;
+}
+
+static bool isIidMatch(QByteArrayView raw, QLatin1StringView iid)
+{
+ QFactoryLoaderIidSearch search(iid);
+ iterateInPluginMetaData(raw, search);
+ return search.matchesIid;
+}
+
+bool QPluginParsedMetaData::parse(QByteArrayView raw)
+{
+ QCborMap map;
+ auto r = iterateInPluginMetaData(raw, [&](const auto &key, QCborStreamReader &reader) {
+ QCborValue item = QCborValue::fromCbor(reader);
+ if (item.isInvalid())
+ return IterationResult::ParsingError;
+ if constexpr (std::is_enum_v<std::decay_t<decltype(key)>>)
+ map[int(key)] = item;
+ else
+ map[QString::fromUtf8(key)] = item;
+ return IterationResult::ContinueSearch;
+ });
+
+ switch (r.result) {
+ case IterationResult::FinishedSearch:
+ case IterationResult::ContinueSearch:
+ break;
+
+ // parse errors
+ case IterationResult::ParsingError:
+ return setError(QFactoryLoader::tr("Metadata parsing error: %1").arg(r.error.toString()));
+ case IterationResult::InvalidMetaDataVersion:
+ return setError(QFactoryLoader::tr("Invalid metadata version"));
+ case IterationResult::InvalidTopLevelItem:
+ case IterationResult::InvalidHeaderItem:
return setError(QFactoryLoader::tr("Unexpected metadata contents"));
- QCborMap map = metadata.toMap();
- metadata = {};
+ }
+
+ // header was validated
+ auto header = qFromUnaligned<QPluginMetaData::Header>(raw.data());
DecodedArchRequirements archReq =
header.version == 0 ? decodeVersion0ArchRequirements(header.plugin_arch_requirements)
@@ -130,17 +252,21 @@ QJsonObject QPluginParsedMetaData::toJson() const
class QFactoryLoaderPrivate : public QObjectPrivate
{
Q_DECLARE_PUBLIC(QFactoryLoader)
+ Q_DISABLE_COPY_MOVE(QFactoryLoaderPrivate)
public:
QFactoryLoaderPrivate() { }
QByteArray iid;
#if QT_CONFIG(library)
~QFactoryLoaderPrivate();
mutable QMutex mutex;
- QList<QLibraryPrivate*> libraryList;
- QMap<QString,QLibraryPrivate*> keyMap;
+ QDuplicateTracker<QString> loadedPaths;
+ std::vector<QLibraryPrivate::UniquePtr> libraries;
+ std::map<QString, QLibraryPrivate*> keyMap;
QString suffix;
+ QString extraSearchPath;
Qt::CaseSensitivity cs;
- QDuplicateTracker<QString> loadedPaths;
+
+ void updateSinglePath(const QString &pluginDir);
#endif
};
@@ -149,128 +275,134 @@ public:
static Q_LOGGING_CATEGORY_WITH_ENV_OVERRIDE(lcFactoryLoader, "QT_DEBUG_PLUGINS",
"qt.core.plugin.factoryloader")
-Q_GLOBAL_STATIC(QList<QFactoryLoader *>, qt_factory_loaders)
+namespace {
+struct QFactoryLoaderGlobals
+{
+ // needs to be recursive because loading one plugin could cause another
+ // factory to be initialized
+ QRecursiveMutex mutex;
+ QList<QFactoryLoader *> loaders;
+};
+}
-Q_GLOBAL_STATIC(QRecursiveMutex, qt_factoryloader_mutex)
+Q_GLOBAL_STATIC(QFactoryLoaderGlobals, qt_factoryloader_global)
QFactoryLoaderPrivate::~QFactoryLoaderPrivate()
-{
- for (QLibraryPrivate *library : qAsConst(libraryList))
- library->release();
-}
+ = default;
-void QFactoryLoader::update()
+inline void QFactoryLoaderPrivate::updateSinglePath(const QString &path)
{
-#ifdef QT_SHARED
- Q_D(QFactoryLoader);
- QStringList paths = QCoreApplication::libraryPaths();
- for (int i = 0; i < paths.count(); ++i) {
- const QString &pluginDir = paths.at(i);
- // Already loaded, skip it...
- if (d->loadedPaths.hasSeen(pluginDir))
- continue;
-
-#ifdef Q_OS_ANDROID
- QString path = pluginDir;
-#else
- QString path = pluginDir + d->suffix;
-#endif
+ struct LibraryReleaser {
+ void operator()(QLibraryPrivate *library)
+ { if (library) library->release(); }
+ };
- qCDebug(lcFactoryLoader) << "checking directory path" << path << "...";
+ // If we've already loaded, skip it...
+ if (loadedPaths.hasSeen(path))
+ return;
- if (!QDir(path).exists(QLatin1String(".")))
- continue;
+ qCDebug(lcFactoryLoader) << "checking directory path" << path << "...";
- QStringList plugins = QDir(path).entryList(
+ QDirListing plugins(path,
#if defined(Q_OS_WIN)
- QStringList(QStringLiteral("*.dll")),
+ QStringList(QStringLiteral("*.dll")),
#elif defined(Q_OS_ANDROID)
- QStringList(QLatin1String("libplugins_%1_*.so").arg(d->suffix)),
+ QStringList("libplugins_%1_*.so"_L1.arg(suffix)),
#endif
- QDir::Files);
- QLibraryPrivate *library = nullptr;
-
- for (int j = 0; j < plugins.count(); ++j) {
- QString fileName = QDir::cleanPath(path + QLatin1Char('/') + plugins.at(j));
-
-#ifdef Q_OS_MAC
- const bool isDebugPlugin = fileName.endsWith(QLatin1String("_debug.dylib"));
- const bool isDebugLibrary =
- #ifdef QT_DEBUG
- true;
- #else
- false;
- #endif
-
- // Skip mismatching plugins so that we don't end up loading both debug and release
- // versions of the same Qt libraries (due to the plugin's dependencies).
- if (isDebugPlugin != isDebugLibrary)
- continue;
+ QDir::Files);
+
+ for (const auto &dirEntry : plugins) {
+ const QString &fileName = dirEntry.fileName();
+#ifdef Q_OS_DARWIN
+ const bool isDebugPlugin = fileName.endsWith("_debug.dylib"_L1);
+ const bool isDebugLibrary =
+ #ifdef QT_DEBUG
+ true;
+ #else
+ false;
+ #endif
+
+ // Skip mismatching plugins so that we don't end up loading both debug and release
+ // versions of the same Qt libraries (due to the plugin's dependencies).
+ if (isDebugPlugin != isDebugLibrary)
+ continue;
#elif defined(Q_PROCESSOR_X86)
- if (fileName.endsWith(QLatin1String(".avx2")) || fileName.endsWith(QLatin1String(".avx512"))) {
- // ignore AVX2-optimized file, we'll do a bait-and-switch to it later
- continue;
- }
+ if (fileName.endsWith(".avx2"_L1) || fileName.endsWith(".avx512"_L1)) {
+ // ignore AVX2-optimized file, we'll do a bait-and-switch to it later
+ continue;
+ }
#endif
- qCDebug(lcFactoryLoader) << "looking at" << fileName;
-
- Q_TRACE(QFactoryLoader_update, fileName);
+ qCDebug(lcFactoryLoader) << "looking at" << fileName;
- library = QLibraryPrivate::findOrCreate(QFileInfo(fileName).canonicalFilePath());
- if (!library->isPlugin()) {
- qCDebug(lcFactoryLoader) << library->errorString << Qt::endl
- << " not a plugin";
- library->release();
- continue;
- }
+ Q_TRACE(QFactoryLoader_update, fileName);
- QStringList keys;
- bool metaDataOk = false;
+ QLibraryPrivate::UniquePtr library;
+ library.reset(QLibraryPrivate::findOrCreate(dirEntry.canonicalFilePath()));
+ if (!library->isPlugin()) {
+ qCDebug(lcFactoryLoader) << library->errorString << Qt::endl
+ << " not a plugin";
+ continue;
+ }
- QString iid = library->metaData.value(QtPluginMetaDataKeys::IID).toString();
- if (iid == QLatin1String(d->iid.constData(), d->iid.size())) {
- QCborMap object = library->metaData.value(QtPluginMetaDataKeys::MetaData).toMap();
- metaDataOk = true;
+ QStringList keys;
+ bool metaDataOk = false;
- QCborArray k = object.value(QLatin1String("Keys")).toArray();
- for (int i = 0; i < k.size(); ++i)
- keys += d->cs ? k.at(i).toString() : k.at(i).toString().toLower();
- }
- qCDebug(lcFactoryLoader) << "Got keys from plugin meta data" << keys;
+ QString iid = library->metaData.value(QtPluginMetaDataKeys::IID).toString();
+ if (iid == QLatin1StringView(this->iid.constData(), this->iid.size())) {
+ QCborMap object = library->metaData.value(QtPluginMetaDataKeys::MetaData).toMap();
+ metaDataOk = true;
+ const QCborArray k = object.value("Keys"_L1).toArray();
+ for (QCborValueConstRef v : k)
+ keys += cs ? v.toString() : v.toString().toLower();
+ }
+ qCDebug(lcFactoryLoader) << "Got keys from plugin meta data" << keys;
- if (!metaDataOk) {
- library->release();
- continue;
- }
+ if (!metaDataOk)
+ continue;
- int keyUsageCount = 0;
- for (int k = 0; k < keys.count(); ++k) {
- // first come first serve, unless the first
- // library was built with a future Qt version,
- // whereas the new one has a Qt version that fits
- // better
- constexpr int QtVersionNoPatch = QT_VERSION_CHECK(QT_VERSION_MAJOR, QT_VERSION_MINOR, 0);
- const QString &key = keys.at(k);
- QLibraryPrivate *previous = d->keyMap.value(key);
- int prev_qt_version = 0;
- if (previous)
- prev_qt_version = int(previous->metaData.value(QtPluginMetaDataKeys::QtVersion).toInteger());
- int qt_version = int(library->metaData.value(QtPluginMetaDataKeys::QtVersion).toInteger());
- if (!previous || (prev_qt_version > QtVersionNoPatch && qt_version <= QtVersionNoPatch)) {
- d->keyMap[key] = library;
- ++keyUsageCount;
- }
- }
- if (keyUsageCount || keys.isEmpty()) {
- library->setLoadHints(QLibrary::PreventUnloadHint); // once loaded, don't unload
- QMutexLocker locker(&d->mutex);
- d->libraryList += library;
- } else {
- library->release();
+ int keyUsageCount = 0;
+ for (const QString &key : std::as_const(keys)) {
+ // first come first serve, unless the first
+ // library was built with a future Qt version,
+ // whereas the new one has a Qt version that fits
+ // better
+ constexpr int QtVersionNoPatch = QT_VERSION_CHECK(QT_VERSION_MAJOR, QT_VERSION_MINOR, 0);
+ QLibraryPrivate *&previous = keyMap[key];
+ int prev_qt_version = 0;
+ if (previous)
+ prev_qt_version = int(previous->metaData.value(QtPluginMetaDataKeys::QtVersion).toInteger());
+ int qt_version = int(library->metaData.value(QtPluginMetaDataKeys::QtVersion).toInteger());
+ if (!previous || (prev_qt_version > QtVersionNoPatch && qt_version <= QtVersionNoPatch)) {
+ previous = library.get(); // we WILL .release()
+ ++keyUsageCount;
}
}
+ if (keyUsageCount || keys.isEmpty()) {
+ library->setLoadHints(QLibrary::PreventUnloadHint); // once loaded, don't unload
+ QMutexLocker locker(&mutex);
+ libraries.push_back(std::move(library));
+ }
+ };
+}
+
+void QFactoryLoader::update()
+{
+#ifdef QT_SHARED
+ Q_D(QFactoryLoader);
+
+ const QStringList paths = QCoreApplication::libraryPaths();
+ for (const QString &pluginDir : paths) {
+#ifdef Q_OS_ANDROID
+ QString path = pluginDir;
+#else
+ QString path = pluginDir + d->suffix;
+#endif
+
+ d->updateSinglePath(path);
}
+ if (!d->extraSearchPath.isEmpty())
+ d->updateSinglePath(d->extraSearchPath);
#else
Q_D(QFactoryLoader);
qCDebug(lcFactoryLoader) << "ignoring" << d->iid
@@ -280,25 +412,29 @@ void QFactoryLoader::update()
QFactoryLoader::~QFactoryLoader()
{
- QMutexLocker locker(qt_factoryloader_mutex());
- qt_factory_loaders()->removeAll(this);
+ if (!qt_factoryloader_global.isDestroyed()) {
+ QMutexLocker locker(&qt_factoryloader_global->mutex);
+ qt_factoryloader_global->loaders.removeOne(this);
+ }
}
-#if defined(Q_OS_UNIX) && !defined (Q_OS_MAC)
+#if defined(Q_OS_UNIX) && !defined (Q_OS_DARWIN)
QLibraryPrivate *QFactoryLoader::library(const QString &key) const
{
Q_D(const QFactoryLoader);
- return d->keyMap.value(d->cs ? key : key.toLower());
+ const auto it = d->keyMap.find(d->cs ? key : key.toLower());
+ if (it == d->keyMap.cend())
+ return nullptr;
+ return it->second;
}
#endif
void QFactoryLoader::refreshAll()
{
- QMutexLocker locker(qt_factoryloader_mutex());
- QList<QFactoryLoader *> *loaders = qt_factory_loaders();
- for (QList<QFactoryLoader *>::const_iterator it = loaders->constBegin();
- it != loaders->constEnd(); ++it) {
- (*it)->update();
+ if (qt_factoryloader_global.exists()) {
+ QMutexLocker locker(&qt_factoryloader_global->mutex);
+ for (QFactoryLoader *loader : std::as_const(qt_factoryloader_global->loaders))
+ loader->update();
}
}
@@ -309,6 +445,9 @@ QFactoryLoader::QFactoryLoader(const char *iid,
Qt::CaseSensitivity cs)
: QObject(*new QFactoryLoaderPrivate)
{
+ Q_ASSERT_X(suffix.startsWith(u'/'), "QFactoryLoader",
+ "For historical reasons, the suffix must start with '/' (and it can't be empty)");
+
moveToThread(QCoreApplicationPrivate::mainThread());
Q_D(QFactoryLoader);
d->iid = iid;
@@ -316,30 +455,54 @@ QFactoryLoader::QFactoryLoader(const char *iid,
d->cs = cs;
d->suffix = suffix;
# ifdef Q_OS_ANDROID
- if (!d->suffix.isEmpty() && d->suffix.at(0) == QLatin1Char('/'))
+ if (!d->suffix.isEmpty() && d->suffix.at(0) == u'/')
d->suffix.remove(0, 1);
# endif
- QMutexLocker locker(qt_factoryloader_mutex());
+ QMutexLocker locker(&qt_factoryloader_global->mutex);
update();
- qt_factory_loaders()->append(this);
+ qt_factoryloader_global->loaders.append(this);
#else
Q_UNUSED(suffix);
Q_UNUSED(cs);
#endif
}
+void QFactoryLoader::setExtraSearchPath(const QString &path)
+{
+#if QT_CONFIG(library)
+ Q_D(QFactoryLoader);
+ if (d->extraSearchPath == path)
+ return; // nothing to do
+
+ QMutexLocker locker(&qt_factoryloader_global->mutex);
+ QString oldPath = std::exchange(d->extraSearchPath, path);
+ if (oldPath.isEmpty()) {
+ // easy case, just update this directory
+ d->updateSinglePath(d->extraSearchPath);
+ } else {
+ // must re-scan everything
+ d->loadedPaths.clear();
+ d->libraries.clear();
+ d->keyMap.clear();
+ update();
+ }
+#else
+ Q_UNUSED(path);
+#endif
+}
+
QFactoryLoader::MetaDataList QFactoryLoader::metaData() const
{
Q_D(const QFactoryLoader);
QList<QPluginParsedMetaData> metaData;
#if QT_CONFIG(library)
QMutexLocker locker(&d->mutex);
- for (int i = 0; i < d->libraryList.size(); ++i)
- metaData.append(d->libraryList.at(i)->metaData);
+ for (const auto &library : d->libraries)
+ metaData.append(library->metaData);
#endif
- QLatin1String iid(d->iid.constData(), d->iid.size());
+ QLatin1StringView iid(d->iid.constData(), d->iid.size());
const auto staticPlugins = QPluginLoader::staticPlugins();
for (const QStaticPlugin &plugin : staticPlugins) {
QByteArrayView pluginData(static_cast<const char *>(plugin.rawMetaData), plugin.rawMetaDataSize);
@@ -348,6 +511,37 @@ QFactoryLoader::MetaDataList QFactoryLoader::metaData() const
continue;
metaData.append(std::move(parsed));
}
+
+ // other portions of the code will cast to int (e.g., keyMap())
+ Q_ASSERT(metaData.size() <= std::numeric_limits<int>::max());
+ return metaData;
+}
+
+QList<QCborArray> QFactoryLoader::metaDataKeys() const
+{
+ Q_D(const QFactoryLoader);
+ QList<QCborArray> metaData;
+#if QT_CONFIG(library)
+ QMutexLocker locker(&d->mutex);
+ for (const auto &library : d->libraries) {
+ const QCborValue md = library->metaData.value(QtPluginMetaDataKeys::MetaData);
+ metaData.append(md["Keys"_L1].toArray());
+ }
+#endif
+
+ QLatin1StringView iid(d->iid.constData(), d->iid.size());
+ const auto staticPlugins = QPluginLoader::staticPlugins();
+ for (const QStaticPlugin &plugin : staticPlugins) {
+ QByteArrayView pluginData(static_cast<const char *>(plugin.rawMetaData),
+ plugin.rawMetaDataSize);
+ QFactoryLoaderMetaDataKeysExtractor extractor{ iid };
+ iterateInPluginMetaData(pluginData, extractor);
+ if (extractor.matchesIid)
+ metaData += std::move(extractor.keys);
+ }
+
+ // other portions of the code will cast to int (e.g., keyMap())
+ Q_ASSERT(metaData.size() <= std::numeric_limits<int>::max());
return metaData;
}
@@ -359,8 +553,8 @@ QObject *QFactoryLoader::instance(int index) const
#if QT_CONFIG(library)
QMutexLocker lock(&d->mutex);
- if (index < d->libraryList.size()) {
- QLibraryPrivate *library = d->libraryList.at(index);
+ if (size_t(index) < d->libraries.size()) {
+ QLibraryPrivate *library = d->libraries[index].get();
if (QObject *obj = library->pluginInstance()) {
if (!obj->parent())
obj->moveToThread(QCoreApplicationPrivate::mainThread());
@@ -368,16 +562,16 @@ QObject *QFactoryLoader::instance(int index) const
}
return nullptr;
}
- index -= d->libraryList.size();
+ // we know d->libraries.size() <= index <= numeric_limits<decltype(index)>::max() → no overflow
+ index -= static_cast<int>(d->libraries.size());
lock.unlock();
#endif
- QLatin1String iid(d->iid.constData(), d->iid.size());
+ QLatin1StringView iid(d->iid.constData(), d->iid.size());
const QList<QStaticPlugin> staticPlugins = QPluginLoader::staticPlugins();
for (QStaticPlugin plugin : staticPlugins) {
QByteArrayView pluginData(static_cast<const char *>(plugin.rawMetaData), plugin.rawMetaDataSize);
- QPluginParsedMetaData parsed(pluginData);
- if (parsed.isError() || parsed.value(QtPluginMetaDataKeys::IID) != iid)
+ if (!isIidMatch(pluginData, iid))
continue;
if (index == 0)
@@ -391,26 +585,22 @@ QObject *QFactoryLoader::instance(int index) const
QMultiMap<int, QString> QFactoryLoader::keyMap() const
{
QMultiMap<int, QString> result;
- const QList<QPluginParsedMetaData> metaDataList = metaData();
- for (int i = 0; i < metaDataList.size(); ++i) {
- const QCborMap metaData = metaDataList.at(i).value(QtPluginMetaDataKeys::MetaData).toMap();
- const QCborArray keys = metaData.value(QLatin1String("Keys")).toArray();
- const int keyCount = keys.size();
- for (int k = 0; k < keyCount; ++k)
- result.insert(i, keys.at(k).toString());
+ const QList<QCborArray> metaDataList = metaDataKeys();
+ for (int i = 0; i < int(metaDataList.size()); ++i) {
+ const QCborArray &keys = metaDataList[i];
+ for (QCborValueConstRef key : keys)
+ result.insert(i, key.toString());
}
return result;
}
int QFactoryLoader::indexOf(const QString &needle) const
{
- const QList<QPluginParsedMetaData> metaDataList = metaData();
- for (int i = 0; i < metaDataList.size(); ++i) {
- const QCborMap metaData = metaDataList.at(i).value(QtPluginMetaDataKeys::MetaData).toMap();
- const QCborArray keys = metaData.value(QLatin1String("Keys")).toArray();
- const int keyCount = keys.size();
- for (int k = 0; k < keyCount; ++k) {
- if (!keys.at(k).toString().compare(needle, Qt::CaseInsensitive))
+ const QList<QCborArray> metaDataList = metaDataKeys();
+ for (int i = 0; i < int(metaDataList.size()); ++i) {
+ const QCborArray &keys = metaDataList[i];
+ for (QCborValueConstRef key : keys) {
+ if (key.toString().compare(needle, Qt::CaseInsensitive) == 0)
return i;
}
}
diff --git a/src/corelib/plugin/qfactoryloader_p.h b/src/corelib/plugin/qfactoryloader_p.h
index f7033d144f..56dc7e6ad1 100644
--- a/src/corelib/plugin/qfactoryloader_p.h
+++ b/src/corelib/plugin/qfactoryloader_p.h
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2017 The Qt Company Ltd.
-** Copyright (C) 2021 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2017 The Qt Company Ltd.
+// Copyright (C) 2022 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QFACTORYLOADER_P_H
#define QFACTORYLOADER_P_H
@@ -90,7 +54,7 @@ public:
// if data is not a map, toMap() returns empty, so shall these functions
QCborMap toCbor() const { return data.toMap(); }
- QCborValue value(QtPluginMetaDataKeys k) const { return toCbor()[int(k)]; }
+ QCborValue value(QtPluginMetaDataKeys k) const { return data[int(k)]; }
};
class QFactoryLoaderPrivate;
@@ -110,17 +74,19 @@ public:
void update();
static void refreshAll();
-#if defined(Q_OS_UNIX) && !defined (Q_OS_MAC)
+#if defined(Q_OS_UNIX) && !defined (Q_OS_DARWIN)
QLibraryPrivate *library(const QString &key) const;
-#endif // Q_OS_UNIX && !Q_OS_MAC
+#endif // Q_OS_UNIX && !Q_OS_DARWIN
#endif // QT_CONFIG(library)
+ void setExtraSearchPath(const QString &path);
QMultiMap<int, QString> keyMap() const;
int indexOf(const QString &needle) const;
using MetaDataList = QList<QPluginParsedMetaData>;
MetaDataList metaData() const;
+ QList<QCborArray> metaDataKeys() const;
QObject *instance(int index) const;
};
diff --git a/src/corelib/plugin/qlibrary.cpp b/src/corelib/plugin/qlibrary.cpp
index 9f89abdf01..a3ef8e3c52 100644
--- a/src/corelib/plugin/qlibrary.cpp
+++ b/src/corelib/plugin/qlibrary.cpp
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Copyright (C) 2021 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// Copyright (C) 2021 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qlibrary.h"
#include "qlibrary_p.h"
@@ -47,12 +11,11 @@
#include <qfile.h>
#include <qfileinfo.h>
#include <qjsondocument.h>
-#include <qmap.h>
#include <qmutex.h>
#include <qoperatingsystemversion.h>
#include <qstringlist.h>
-#ifdef Q_OS_MAC
+#ifdef Q_OS_DARWIN
# include <private/qcore_mac_p.h>
#endif
#include <private/qcoreapplication_p.h>
@@ -66,8 +29,15 @@
#include <qtcore_tracepoints_p.h>
+#include <QtCore/q20map.h>
+
QT_BEGIN_NAMESPACE
+using namespace Qt::StringLiterals;
+
+Q_TRACE_POINT(qtcore, QLibraryPrivate_load_entry, const QString &fileName);
+Q_TRACE_POINT(qtcore, QLibraryPrivate_load_exit, bool success);
+
// On Unix systema and on Windows with MinGW, we can mix and match debug and
// release plugins without problems. (unless compiled in debug-and-release mode
// - why?)
@@ -209,10 +179,20 @@ static QLibraryScanResult qt_find_pattern(const char *s, qsizetype s_len, QStrin
return QMachOParser::parse(s, s_len, errMsg);
#elif defined(Q_OS_WIN)
return QCoffPeParser::parse({s, s_len}, errMsg);
+#else
+# warning "Qt does not know how to efficiently parse your platform's binary format; using slow fall-back."
#endif
- QByteArrayView pattern = QPluginMetaData::MagicString;
- static const QByteArrayMatcher matcher(pattern.toByteArray());
- qsizetype i = matcher.indexIn(s, s_len);
+ static constexpr auto matcher = [] {
+ // QPluginMetaData::MagicString is not NUL-terminated, but
+ // qMakeStaticByteArrayMatcher requires its argument to be, so
+ // duplicate here, but statically check we didn't mess up:
+ constexpr auto &pattern = "QTMETADATA !";
+ constexpr auto magic = std::string_view(QPluginMetaData::MagicString,
+ sizeof(QPluginMetaData::MagicString));
+ static_assert(pattern == magic);
+ return qMakeStaticByteArrayMatcher(pattern);
+ }();
+ qsizetype i = matcher.indexIn({s, s_len});
if (i < 0) {
*errMsg = QLibrary::tr("'%1' is not a Qt plugin").arg(*errMsg);
return QLibraryScanResult{};
@@ -231,7 +211,7 @@ static QLibraryScanResult qt_find_pattern(const char *s, qsizetype s_len, QStrin
information could not be read.
Returns true if version information is present and successfully read.
*/
-static bool findPatternUnloaded(const QString &library, QLibraryPrivate *lib)
+static QLibraryScanResult findPatternUnloaded(const QString &library, QLibraryPrivate *lib)
{
QFile file(library);
if (!file.open(QIODevice::ReadOnly)) {
@@ -239,7 +219,7 @@ static bool findPatternUnloaded(const QString &library, QLibraryPrivate *lib)
lib->errorString = file.errorString();
qCWarning(qt_lcDebugPlugins, "%ls: cannot open: %ls", qUtf16Printable(library),
qUtf16Printable(file.errorString()));
- return false;
+ return {};
}
// Files can be bigger than the virtual memory size on 32-bit systems, so
@@ -256,7 +236,7 @@ static bool findPatternUnloaded(const QString &library, QLibraryPrivate *lib)
// This can't be used as a plugin.
qCWarning(qt_lcDebugPlugins, "%ls: failed to map to memory: %ls",
qUtf16Printable(library), qUtf16Printable(file.errorString()));
- return false;
+ return {};
}
#else
QByteArray data;
@@ -273,15 +253,19 @@ static bool findPatternUnloaded(const QString &library, QLibraryPrivate *lib)
QString errMsg = library;
QLibraryScanResult r = qt_find_pattern(filedata, fdlen, &errMsg);
if (r.length) {
+#if defined(Q_OF_MACH_O)
+ if (r.isEncrypted)
+ return r;
+#endif
if (!lib->metaData.parse(QByteArrayView(filedata + r.pos, r.length))) {
errMsg = lib->metaData.errorString();
- qCWarning(qt_lcDebugPlugins, "Found invalid metadata in lib %ls: %ls",
+ qCDebug(qt_lcDebugPlugins, "Found invalid metadata in lib %ls: %ls",
qUtf16Printable(library), qUtf16Printable(errMsg));
} else {
qCDebug(qt_lcDebugPlugins, "Found metadata in lib %ls, metadata=\n%s\n",
qUtf16Printable(library),
QJsonDocument(lib->metaData.toJson()).toJson().constData());
- return true;
+ return r;
}
} else {
qCDebug(qt_lcDebugPlugins, "Failed to find metadata in lib %ls: %ls",
@@ -290,7 +274,7 @@ static bool findPatternUnloaded(const QString &library, QLibraryPrivate *lib)
lib->errorString = QLibrary::tr("Failed to extract plugin meta data from '%1': %2")
.arg(library, errMsg);
- return false;
+ return {};
}
static void installCoverageTool(QLibraryPrivate *libPrivate)
@@ -338,13 +322,13 @@ private:
static inline QLibraryStore *instance();
// all members and instance() are protected by qt_library_mutex
- typedef QMap<QString, QLibraryPrivate *> LibraryMap;
+ typedef std::map<QString, QLibraryPrivate *> LibraryMap;
LibraryMap libraryMap;
};
-static QBasicMutex qt_library_mutex;
-static QLibraryStore *qt_library_data = nullptr;
-static bool qt_library_data_once;
+Q_CONSTINIT static QBasicMutex qt_library_mutex;
+Q_CONSTINIT static QLibraryStore *qt_library_data = nullptr;
+Q_CONSTINIT static bool qt_library_data_once;
QLibraryStore::~QLibraryStore()
{
@@ -358,19 +342,12 @@ inline void QLibraryStore::cleanup()
return;
// find any libraries that are still loaded but have a no one attached to them
- LibraryMap::Iterator it = data->libraryMap.begin();
- for (; it != data->libraryMap.end(); ++it) {
- QLibraryPrivate *lib = it.value();
+ for (auto &[_, lib] : data->libraryMap) {
if (lib->libraryRefCount.loadRelaxed() == 1) {
if (lib->libraryUnloadCount.loadRelaxed() > 0) {
Q_ASSERT(lib->pHnd.loadRelaxed());
lib->libraryUnloadCount.storeRelaxed(1);
-#ifdef __GLIBC__
- // glibc has a bug in unloading from global destructors
- // see https://bugzilla.novell.com/show_bug.cgi?id=622977
- // and http://sourceware.org/bugzilla/show_bug.cgi?id=11941
- lib->unload(QLibraryPrivate::NoUnloadSys);
-#elif defined(Q_OS_DARWIN)
+#if defined(Q_OS_DARWIN)
// We cannot fully unload libraries, as we don't know if there are
// lingering references (in system threads e.g.) to Objective-C classes
// defined in the library.
@@ -379,14 +356,13 @@ inline void QLibraryStore::cleanup()
lib->unload();
#endif
}
- delete lib;
- it.value() = nullptr;
+ delete std::exchange(lib, nullptr);
}
}
// dump all objects that remain
if (lcDebugLibrary().isDebugEnabled()) {
- for (QLibraryPrivate *lib : qAsConst(data->libraryMap)) {
+ for (auto &[_, lib] : data->libraryMap) {
if (lib)
qDebug(lcDebugLibrary)
<< "On QtCore unload," << lib->fileName << "was leaked, with"
@@ -417,24 +393,34 @@ QLibraryStore *QLibraryStore::instance()
inline QLibraryPrivate *QLibraryStore::findOrCreate(const QString &fileName, const QString &version,
QLibrary::LoadHints loadHints)
{
+ auto lazyNewLib = [&] {
+ auto result = new QLibraryPrivate(fileName, version, loadHints);
+ result->libraryRefCount.ref();
+ return result;
+ };
+
+ if (fileName.isEmpty()) // request for empty d-pointer in QLibrary::setLoadHints();
+ return lazyNewLib(); // must return an independent (new) object
+
QMutexLocker locker(&qt_library_mutex);
QLibraryStore *data = instance();
- // check if this library is already loaded
- QLibraryPrivate *lib = nullptr;
- if (Q_LIKELY(data)) {
- lib = data->libraryMap.value(fileName);
- if (lib)
- lib->mergeLoadHints(loadHints);
+ if (Q_UNLIKELY(!data)) {
+ locker.unlock();
+ return lazyNewLib();
}
- if (!lib)
- lib = new QLibraryPrivate(fileName, version, loadHints);
- // track this library
- if (Q_LIKELY(data) && !fileName.isEmpty())
- data->libraryMap.insert(fileName, lib);
+ QString mapName = version.isEmpty() ? fileName : fileName + u'\0' + version;
+
+ QLibraryPrivate *&lib = data->libraryMap[std::move(mapName)];
+ if (lib) {
+ // already loaded
+ lib->libraryRefCount.ref();
+ lib->mergeLoadHints(loadHints);
+ } else {
+ lib = lazyNewLib();
+ }
- lib->libraryRefCount.ref();
return lib;
}
@@ -452,9 +438,12 @@ inline void QLibraryStore::releaseLibrary(QLibraryPrivate *lib)
Q_ASSERT(lib->libraryUnloadCount.loadRelaxed() == 0);
if (Q_LIKELY(data) && !lib->fileName.isEmpty()) {
- QLibraryPrivate *that = data->libraryMap.take(lib->fileName);
- Q_ASSERT(lib == that);
- Q_UNUSED(that);
+ using q20::erase_if;
+ const auto n = erase_if(data->libraryMap, [lib](const auto &e) {
+ return e.second == lib;
+ });
+ Q_ASSERT_X(n, "~QLibrary", "Did not find this library in the library map");
+ Q_UNUSED(n);
}
delete lib;
}
@@ -483,7 +472,7 @@ void QLibraryPrivate::mergeLoadHints(QLibrary::LoadHints lh)
if (pHnd.loadRelaxed())
return;
- loadHintsInt.storeRelaxed(lh.toInt());
+ loadHintsInt.fetchAndOrRelaxed(lh.toInt());
}
QFunctionPointer QLibraryPrivate::resolve(const char *symbol)
@@ -495,6 +484,13 @@ QFunctionPointer QLibraryPrivate::resolve(const char *symbol)
void QLibraryPrivate::setLoadHints(QLibrary::LoadHints lh)
{
+ // Set the load hints directly for a dummy if this object is not associated
+ // with a file. Such object is not shared between multiple instances.
+ if (fileName.isEmpty()) {
+ loadHintsInt.storeRelaxed(lh.toInt());
+ return;
+ }
+
// this locks a global mutex
QMutexLocker lock(&qt_library_mutex);
mergeLoadHints(lh);
@@ -618,40 +614,41 @@ QtPluginInstanceFunction QLibraryPrivate::loadPlugin()
bool QLibrary::isLibrary(const QString &fileName)
{
#if defined(Q_OS_WIN)
- return fileName.endsWith(QLatin1String(".dll"), Qt::CaseInsensitive);
+ return fileName.endsWith(".dll"_L1, Qt::CaseInsensitive);
#else // Generic Unix
# if defined(Q_OS_DARWIN)
// On Apple platforms, dylib look like libmylib.1.0.0.dylib
- if (fileName.endsWith(QLatin1String(".dylib")))
+ if (fileName.endsWith(".dylib"_L1))
return true;
# endif
QString completeSuffix = QFileInfo(fileName).completeSuffix();
if (completeSuffix.isEmpty())
return false;
- auto isValidSuffix = [](QStringView s) {
- // if this throws an empty-array error, you need to fix the #ifdef's:
- const QLatin1String candidates[] = {
+ // if this throws an empty-array error, you need to fix the #ifdef's:
+ const QLatin1StringView candidates[] = {
# if defined(Q_OS_HPUX)
/*
See "HP-UX Linker and Libraries User's Guide", section "Link-time Differences between PA-RISC and IPF":
"In PA-RISC (PA-32 and PA-64) shared libraries are suffixed with .sl. In IPF (32-bit and 64-bit),
the shared libraries are suffixed with .so. For compatibility, the IPF linker also supports the .sl suffix."
- */
- QLatin1String("sl"),
+*/
+ "sl"_L1,
# if defined __ia64
- QLatin1String("so"),
+ "so"_L1,
# endif
# elif defined(Q_OS_AIX)
- QLatin1String("a"),
- QLatin1String("so"),
+ "a"_L1,
+ "so"_L1,
# elif defined(Q_OS_DARWIN)
- QLatin1String("so"),
- QLatin1String("bundle"),
+ "so"_L1,
+ "bundle"_L1,
# elif defined(Q_OS_UNIX)
- QLatin1String("so"),
+ "so"_L1,
# endif
- }; // candidates
+ }; // candidates
+
+ auto isValidSuffix = [&candidates](QStringView s) {
return std::find(std::begin(candidates), std::end(candidates), s) != std::end(candidates);
};
@@ -729,8 +726,8 @@ void QLibraryPrivate::updatePluginState()
bool success = false;
-#if defined(Q_OS_UNIX) && !defined(Q_OS_MAC)
- if (fileName.endsWith(QLatin1String(".debug"))) {
+#if defined(Q_OS_UNIX) && !defined(Q_OS_DARWIN)
+ if (fileName.endsWith(".debug"_L1)) {
// refuse to load a file that ends in .debug
// these are the debug symbols from the libraries
// the problem is that they are valid shared library files
@@ -745,7 +742,22 @@ void QLibraryPrivate::updatePluginState()
if (!pHnd.loadRelaxed()) {
// scan for the plugin metadata without loading
- success = findPatternUnloaded(fileName, this);
+ QLibraryScanResult result = findPatternUnloaded(fileName, this);
+#if defined(Q_OF_MACH_O)
+ if (result.length && result.isEncrypted) {
+ // We found the .qtmetadata section, but since the library is encrypted
+ // we need to dlopen() it before we can parse the metadata for further
+ // validation.
+ qCDebug(qt_lcDebugPlugins, "Library is encrypted. Doing prospective load before parsing metadata");
+ locker.unlock();
+ load();
+ locker.relock();
+ success = qt_get_metadata(this, &errorString);
+ } else
+#endif
+ {
+ success = result.length != 0;
+ }
} else {
// library is already loaded (probably via QLibrary)
// simply get the target function and call it.
@@ -768,17 +780,17 @@ void QLibraryPrivate::updatePluginState()
uint qt_version = uint(metaData.value(QtPluginMetaDataKeys::QtVersion).toInteger());
bool debug = metaData.value(QtPluginMetaDataKeys::IsDebug).toBool();
if ((qt_version & 0x00ff00) > (QT_VERSION & 0x00ff00) || (qt_version & 0xff0000) != (QT_VERSION & 0xff0000)) {
- qCWarning(qt_lcDebugPlugins, "In %s:\n"
+ qCDebug(qt_lcDebugPlugins, "In %s:\n"
" Plugin uses incompatible Qt library (%d.%d.%d) [%s]",
QFile::encodeName(fileName).constData(),
(qt_version&0xff0000) >> 16, (qt_version&0xff00) >> 8, qt_version&0xff,
debug ? "debug" : "release");
errorString = QLibrary::tr("The plugin '%1' uses incompatible Qt library. (%2.%3.%4) [%5]")
- .arg(fileName)
- .arg((qt_version&0xff0000) >> 16)
- .arg((qt_version&0xff00) >> 8)
- .arg(qt_version&0xff)
- .arg(debug ? QLatin1String("debug") : QLatin1String("release"));
+ .arg(fileName,
+ QString::number((qt_version & 0xff0000) >> 16),
+ QString::number((qt_version & 0xff00) >> 8),
+ QString::number(qt_version & 0xff),
+ debug ? "debug"_L1 : "release"_L1);
} else if (PluginMustMatchQtDebug && debug != QtBuildIsDebug) {
//don't issue a qWarning since we will hopefully find a non-debug? --Sam
errorString = QLibrary::tr("The plugin '%1' uses incompatible Qt library."
@@ -804,9 +816,11 @@ bool QLibrary::load()
return false;
if (d.tag() == Loaded)
return d->pHnd.loadRelaxed();
- else
+ if (d->load()) {
d.setTag(Loaded);
- return d->load();
+ return true;
+ }
+ return false;
}
/*!
@@ -820,7 +834,9 @@ bool QLibrary::load()
call will fail, and unloading will only happen when every instance
has called unload().
- Note that on Mac OS X 10.3 (Panther), dynamic libraries cannot be unloaded.
+ Note that on \macos, dynamic libraries cannot be unloaded.
+ QLibrary::unload() will return \c true, but the library will remain
+ loaded into the process.
\sa resolve(), load()
*/
@@ -834,13 +850,17 @@ bool QLibrary::unload()
}
/*!
- Returns \c true if the library is loaded; otherwise returns \c false.
+ Returns \c true if load() succeeded; otherwise returns \c false.
+
+ \note Prior to Qt 6.6, this function would return \c true even without a
+ call to load() if another QLibrary object on the same library had caused it
+ to be loaded.
\sa load()
*/
bool QLibrary::isLoaded() const
{
- return d && d->pHnd.loadRelaxed();
+ return d.tag() == Loaded;
}
@@ -934,13 +954,7 @@ QLibrary::~QLibrary()
void QLibrary::setFileName(const QString &fileName)
{
- QLibrary::LoadHints lh;
- if (d) {
- lh = d->loadHints();
- d->release();
- d = {};
- }
- d = QLibraryPrivate::findOrCreate(fileName, QString(), lh);
+ setFileNameAndVersion(fileName, QString());
}
QString QLibrary::fileName() const
@@ -963,13 +977,7 @@ QString QLibrary::fileName() const
*/
void QLibrary::setFileNameAndVersion(const QString &fileName, int verNum)
{
- QLibrary::LoadHints lh;
- if (d) {
- lh = d->loadHints();
- d->release();
- d = {};
- }
- d = QLibraryPrivate::findOrCreate(fileName, verNum >= 0 ? QString::number(verNum) : QString(), lh);
+ setFileNameAndVersion(fileName, verNum >= 0 ? QString::number(verNum) : QString());
}
/*!
@@ -987,9 +995,9 @@ void QLibrary::setFileNameAndVersion(const QString &fileName, const QString &ver
if (d) {
lh = d->loadHints();
d->release();
- d = {};
}
- d = QLibraryPrivate::findOrCreate(fileName, version, lh);
+ QLibraryPrivate *dd = QLibraryPrivate::findOrCreate(fileName, version, lh);
+ d = QTaggedPointer(dd, NotLoaded); // we haven't load()ed
}
/*!
@@ -1124,6 +1132,10 @@ QString QLibrary::errorString() const
lazy symbol resolution, and will not export external symbols for resolution
in other dynamically-loaded libraries.
+ \note Hints can only be cleared when this object is not associated with a
+ file. Hints can only be added once the file name is set (\a hints will
+ be or'ed with the old hints).
+
\note Setting this property after the library has been loaded has no effect
and loadHints() will not reflect those changes.
diff --git a/src/corelib/plugin/qlibrary.h b/src/corelib/plugin/qlibrary.h
index ac59f45789..f31047b214 100644
--- a/src/corelib/plugin/qlibrary.h
+++ b/src/corelib/plugin/qlibrary.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QLIBRARY_H
#define QLIBRARY_H
@@ -63,7 +27,7 @@ public:
DeepBindHint = 0x10
};
Q_DECLARE_FLAGS(LoadHints, LoadHint)
- Q_FLAG(LoadHint)
+ Q_ENUM(LoadHint)
Q_FLAG(LoadHints)
explicit QLibrary(QObject *parent = nullptr);
diff --git a/src/corelib/plugin/qlibrary_p.h b/src/corelib/plugin/qlibrary_p.h
index 42d3d7256d..87d36ee5c8 100644
--- a/src/corelib/plugin/qlibrary_p.h
+++ b/src/corelib/plugin/qlibrary_p.h
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Copyright (C) 2021 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// Copyright (C) 2021 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QLIBRARY_P_H
#define QLIBRARY_P_H
@@ -64,6 +28,8 @@
# include "QtCore/qt_windows.h"
#endif
+#include <memory>
+
QT_REQUIRE_CONFIG(library);
QT_BEGIN_NAMESPACE
@@ -74,6 +40,9 @@ struct QLibraryScanResult
{
qsizetype pos;
qsizetype length;
+#if defined(Q_OF_MACH_O)
+ bool isEncrypted = false;
+#endif
};
class QLibraryStore;
@@ -87,6 +56,12 @@ public:
#endif
enum UnloadFlag { UnloadSys, NoUnloadSys };
+ struct Deleter {
+ // QLibraryPrivate::release() is not, yet, and cannot easily be made, noexcept:
+ void operator()(QLibraryPrivate *p) const { p->release(); }
+ };
+ using UniquePtr = std::unique_ptr<QLibraryPrivate, Deleter>;
+
const QString fileName;
const QString fullVersion;
diff --git a/src/corelib/plugin/qlibrary_unix.cpp b/src/corelib/plugin/qlibrary_unix.cpp
index c119bee2fc..a6fb5403cd 100644
--- a/src/corelib/plugin/qlibrary_unix.cpp
+++ b/src/corelib/plugin/qlibrary_unix.cpp
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2020 Intel Corporation
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2020 Intel Corporation
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qplatformdefs.h"
@@ -48,7 +12,7 @@
#include <dlfcn.h>
-#ifdef Q_OS_MAC
+#ifdef Q_OS_DARWIN
# include <private/qcore_mac_p.h>
#endif
@@ -59,11 +23,7 @@
QT_BEGIN_NAMESPACE
-static QString qdlerror()
-{
- const char *err = dlerror();
- return err ? QLatin1Char('(') + QString::fromLocal8Bit(err) + QLatin1Char(')') : QString();
-}
+using namespace Qt::StringLiterals;
QStringList QLibraryPrivate::suffixes_sys(const QString &fullVersion)
{
@@ -82,36 +42,36 @@ QStringList QLibraryPrivate::suffixes_sys(const QString &fullVersion)
// .so is preferred.
# if defined(__ia64)
if (!fullVersion.isEmpty()) {
- suffixes << QLatin1String(".so.%1").arg(fullVersion);
+ suffixes << ".so.%1"_L1.arg(fullVersion);
} else {
- suffixes << QLatin1String(".so");
+ suffixes << ".so"_L1;
}
# endif
if (!fullVersion.isEmpty()) {
- suffixes << QLatin1String(".sl.%1").arg(fullVersion);
- suffixes << QLatin1String(".%1").arg(fullVersion);
+ suffixes << ".sl.%1"_L1.arg(fullVersion);
+ suffixes << ".%1"_L1.arg(fullVersion);
} else {
- suffixes << QLatin1String(".sl");
+ suffixes << ".sl"_L1;
}
#elif defined(Q_OS_AIX)
suffixes << ".a";
#else
if (!fullVersion.isEmpty()) {
- suffixes << QLatin1String(".so.%1").arg(fullVersion);
+ suffixes << ".so.%1"_L1.arg(fullVersion);
} else {
- suffixes << QLatin1String(".so");
+ suffixes << ".so"_L1;
# ifdef Q_OS_ANDROID
suffixes << QStringLiteral(LIBS_SUFFIX);
# endif
}
#endif
-# ifdef Q_OS_MAC
+# ifdef Q_OS_DARWIN
if (!fullVersion.isEmpty()) {
- suffixes << QLatin1String(".%1.bundle").arg(fullVersion);
- suffixes << QLatin1String(".%1.dylib").arg(fullVersion);
+ suffixes << ".%1.bundle"_L1.arg(fullVersion);
+ suffixes << ".%1.dylib"_L1.arg(fullVersion);
} else {
- suffixes << QLatin1String(".bundle") << QLatin1String(".dylib");
+ suffixes << ".bundle"_L1 << ".dylib"_L1;
}
#endif
return suffixes;
@@ -119,21 +79,26 @@ QStringList QLibraryPrivate::suffixes_sys(const QString &fullVersion)
QStringList QLibraryPrivate::prefixes_sys()
{
- return QStringList() << QLatin1String("lib");
+ return QStringList() << "lib"_L1;
}
bool QLibraryPrivate::load_sys()
{
+#if defined(Q_OS_WASM) && defined(QT_STATIC)
+ // emscripten does not support dlopen when using static linking
+ return false;
+#endif
+
QMutexLocker locker(&mutex);
QString attempt;
QFileSystemEntry fsEntry(fileName);
QString path = fsEntry.path();
QString name = fsEntry.fileName();
- if (path == QLatin1String(".") && !fileName.startsWith(path))
+ if (path == "."_L1 && !fileName.startsWith(path))
path.clear();
else
- path += QLatin1Char('/');
+ path += u'/';
QStringList suffixes;
QStringList prefixes;
@@ -198,7 +163,7 @@ bool QLibraryPrivate::load_sys()
QStringList tmp;
qSwap(tmp, list);
list.reserve(tmp.size() * 2);
- for (const QString &s : qAsConst(tmp)) {
+ for (const QString &s : std::as_const(tmp)) {
QString modifiedPath = s;
f(&modifiedPath);
list.append(modifiedPath);
@@ -207,10 +172,10 @@ bool QLibraryPrivate::load_sys()
};
if (pluginState == IsAPlugin) {
// add ".avx2" to each suffix in the list
- transform(suffixes, [](QString *s) { s->append(QLatin1String(".avx2")); });
+ transform(suffixes, [](QString *s) { s->append(".avx2"_L1); });
} else {
// prepend "haswell/" to each prefix in the list
- transform(prefixes, [](QString *s) { s->prepend(QLatin1String("haswell/")); });
+ transform(prefixes, [](QString *s) { s->prepend("haswell/"_L1); });
}
}
#endif
@@ -222,15 +187,15 @@ bool QLibraryPrivate::load_sys()
for (int suffix = 0; retry && !hnd && suffix < suffixes.size(); suffix++) {
if (!prefixes.at(prefix).isEmpty() && name.startsWith(prefixes.at(prefix)))
continue;
- if (path.isEmpty() && prefixes.at(prefix).contains(QLatin1Char('/')))
+ if (path.isEmpty() && prefixes.at(prefix).contains(u'/'))
continue;
if (!suffixes.at(suffix).isEmpty() && name.endsWith(suffixes.at(suffix)))
continue;
if (loadHints & QLibrary::LoadArchiveMemberHint) {
attempt = name;
- int lparen = attempt.indexOf(QLatin1Char('('));
+ qsizetype lparen = attempt.indexOf(u'(');
if (lparen == -1)
- lparen = attempt.count();
+ lparen = attempt.size();
attempt = path + prefixes.at(prefix) + attempt.insert(lparen, suffixes.at(suffix));
} else {
attempt = path + prefixes.at(prefix) + name + suffixes.at(suffix);
@@ -240,19 +205,11 @@ bool QLibraryPrivate::load_sys()
#ifdef Q_OS_ANDROID
if (!hnd) {
auto attemptFromBundle = attempt;
- hnd = dlopen(QFile::encodeName(attemptFromBundle.replace(QLatin1Char('/'), QLatin1Char('_'))), dlFlags);
- }
- if (hnd) {
- using JniOnLoadPtr = jint (*)(JavaVM *vm, void *reserved);
- JniOnLoadPtr jniOnLoad = reinterpret_cast<JniOnLoadPtr>(dlsym(hnd, "JNI_OnLoad"));
- if (jniOnLoad && jniOnLoad(QJniEnvironment::javaVM(), nullptr) == JNI_ERR) {
- dlclose(hnd);
- hnd = nullptr;
- }
+ hnd = dlopen(QFile::encodeName(attemptFromBundle.replace(u'/', u'_')), dlFlags);
}
#endif
- if (!hnd && fileName.startsWith(QLatin1Char('/')) && QFile::exists(attempt)) {
+ if (!hnd && fileName.startsWith(u'/') && QFile::exists(attempt)) {
// We only want to continue if dlopen failed due to that the shared library did not exist.
// However, we are only able to apply this check for absolute filenames (since they are
// not influenced by the content of LD_LIBRARY_PATH, /etc/ld.so.cache, DT_RPATH etc...)
@@ -262,7 +219,7 @@ bool QLibraryPrivate::load_sys()
}
}
-#ifdef Q_OS_MAC
+#ifdef Q_OS_DARWIN
if (!hnd) {
QByteArray utf8Bundle = fileName.toUtf8();
QCFType<CFURLRef> bundleUrl = CFURLCreateFromFileSystemRepresentation(NULL, reinterpret_cast<const UInt8*>(utf8Bundle.data()), utf8Bundle.length(), true);
@@ -279,7 +236,8 @@ bool QLibraryPrivate::load_sys()
locker.relock();
if (!hnd) {
- errorString = QLibrary::tr("Cannot load library %1: %2").arg(fileName, qdlerror());
+ errorString = QLibrary::tr("Cannot load library %1: %2").arg(fileName,
+ QLatin1StringView(dlerror()));
}
if (hnd) {
qualifiedFileName = attempt;
@@ -291,36 +249,27 @@ bool QLibraryPrivate::load_sys()
bool QLibraryPrivate::unload_sys()
{
- if (dlclose(pHnd.loadAcquire())) {
-#if defined (Q_OS_QNX) // Workaround until fixed in QNX; fixes crash in
- char *error = dlerror(); // QtDeclarative auto test "qqmlenginecleanup" for instance
+ bool doTryUnload = true;
+#ifndef RTLD_NODELETE
+ if (loadHints() & QLibrary::PreventUnloadHint)
+ doTryUnload = false;
+#endif
+ if (doTryUnload && dlclose(pHnd.loadAcquire())) {
+ const char *error = dlerror();
+#if defined (Q_OS_QNX)
+ // Workaround until fixed in QNX; fixes crash in
+ // QtDeclarative auto test "qqmlenginecleanup" for instance
if (!qstrcmp(error, "Shared objects still referenced")) // On QNX that's only "informative"
return true;
- errorString = QLibrary::tr("Cannot unload library %1: %2").arg(fileName,
- QLatin1String(error));
-#else
- errorString = QLibrary::tr("Cannot unload library %1: %2").arg(fileName, qdlerror());
#endif
+ errorString = QLibrary::tr("Cannot unload library %1: %2").arg(fileName,
+ QLatin1StringView(error));
return false;
}
errorString.clear();
return true;
}
-#if defined(Q_OS_LINUX)
-Q_CORE_EXPORT QFunctionPointer qt_linux_find_symbol_sys(const char *symbol)
-{
- return QFunctionPointer(dlsym(RTLD_DEFAULT, symbol));
-}
-#endif
-
-#ifdef Q_OS_MAC
-Q_CORE_EXPORT QFunctionPointer qt_mac_resolve_sys(void *handle, const char *symbol)
-{
- return QFunctionPointer(dlsym(handle, symbol));
-}
-#endif
-
QFunctionPointer QLibraryPrivate::resolve_sys(const char *symbol)
{
QFunctionPointer address = QFunctionPointer(dlsym(pHnd.loadAcquire(), symbol));
diff --git a/src/corelib/plugin/qlibrary_win.cpp b/src/corelib/plugin/qlibrary_win.cpp
index eab7255a7a..c95118e554 100644
--- a/src/corelib/plugin/qlibrary_win.cpp
+++ b/src/corelib/plugin/qlibrary_win.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qplatformdefs.h"
#include "qlibrary_p.h"
@@ -49,6 +13,8 @@
QT_BEGIN_NAMESPACE
+using namespace Qt::StringLiterals;
+
extern QString qt_error_string(int code);
QStringList QLibraryPrivate::suffixes_sys(const QString& fullVersion)
@@ -81,7 +47,7 @@ bool QLibraryPrivate::load_sys()
QStringList attempts;
if (pluginState != IsAPlugin)
- attempts.append(fileName + QLatin1String(".dll"));
+ attempts.append(fileName + ".dll"_L1);
// If the fileName is an absolute path we try that first, otherwise we
// use the system-specific suffix first
@@ -93,7 +59,7 @@ bool QLibraryPrivate::load_sys()
locker.unlock();
Handle hnd = nullptr;
- for (const QString &attempt : qAsConst(attempts)) {
+ for (const QString &attempt : std::as_const(attempts)) {
hnd = LoadLibrary(reinterpret_cast<const wchar_t*>(QDir::toNativeSeparators(attempt).utf16()));
// If we have a handle or the last error is something other than "unable
@@ -115,9 +81,9 @@ bool QLibraryPrivate::load_sys()
::GetModuleFileName(hnd, buffer, MAX_PATH);
QString moduleFileName = QString::fromWCharArray(buffer);
- moduleFileName.remove(0, 1 + moduleFileName.lastIndexOf(QLatin1Char('\\')));
+ moduleFileName.remove(0, 1 + moduleFileName.lastIndexOf(u'\\'));
const QDir dir(fsEntry.path());
- if (dir.path() == QLatin1String("."))
+ if (dir.path() == "."_L1)
qualifiedFileName = moduleFileName;
else
qualifiedFileName = dir.filePath(moduleFileName);
diff --git a/src/corelib/plugin/qmachparser.cpp b/src/corelib/plugin/qmachparser.cpp
index 310d8e06c3..7a82b84cb3 100644
--- a/src/corelib/plugin/qmachparser.cpp
+++ b/src/corelib/plugin/qmachparser.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qmachparser_p.h"
@@ -46,6 +10,8 @@
QT_BEGIN_NAMESPACE
+using namespace Qt::StringLiterals;
+
// Whether we include some extra validity checks
// (checks to ensure we don't read out-of-bounds are always included)
static constexpr bool IncludeValidityChecks = true;
@@ -90,6 +56,23 @@ static QLibraryScanResult notfound(const QString &reason, QString *errorString)
return {};
}
+static bool isEncrypted(const my_mach_header *header)
+{
+ auto commandCursor = uintptr_t(header) + sizeof(my_mach_header);
+ for (uint32_t i = 0; i < header->ncmds; ++i) {
+ load_command *loadCommand = reinterpret_cast<load_command *>(commandCursor);
+ if (loadCommand->cmd == LC_ENCRYPTION_INFO || loadCommand->cmd == LC_ENCRYPTION_INFO_64) {
+ // The layout of encryption_info_command and encryption_info_command_64 is the same
+ // up until and including cryptid, so we can treat it as encryption_info_command.
+ auto encryptionInfoCommand = reinterpret_cast<encryption_info_command*>(loadCommand);
+ return encryptionInfoCommand->cryptid != 0;
+ }
+ commandCursor += loadCommand->cmdsize;
+ }
+
+ return false;
+}
+
QLibraryScanResult QMachOParser::parse(const char *m_s, ulong fdlen, QString *errorString)
{
// The minimum size of a Mach-O binary we're interested in.
@@ -143,7 +126,8 @@ QLibraryScanResult QMachOParser::parse(const char *m_s, ulong fdlen, QString *e
// check magic
if (header->magic != my_magic)
- return notfound(QLibrary::tr("invalid magic %1").arg(qFromBigEndian(header->magic), 8, 16, QLatin1Char('0')),
+ return notfound(QLibrary::tr("invalid magic %1").arg(qFromBigEndian(header->magic),
+ 8, 16, '0'_L1),
errorString);
}
@@ -199,8 +183,12 @@ QLibraryScanResult QMachOParser::parse(const char *m_s, ulong fdlen, QString *e
if (sect[j].size < sizeof(QPluginMetaData::MagicHeader))
return notfound(QLibrary::tr(".qtmetadata section is too small"), errorString);
+ const bool binaryIsEncrypted = isEncrypted(header);
qsizetype pos = reinterpret_cast<const char *>(header) - m_s + sect[j].offset;
- if (IncludeValidityChecks) {
+
+ // We can not read the section data of encrypted libraries until they
+ // have been dlopened(), so skip validity check if that's the case.
+ if (IncludeValidityChecks && !binaryIsEncrypted) {
QByteArrayView expectedMagic = QByteArrayView::fromArray(QPluginMetaData::MagicString);
QByteArrayView actualMagic = QByteArrayView(m_s + pos, expectedMagic.size());
if (expectedMagic != actualMagic)
@@ -208,7 +196,7 @@ QLibraryScanResult QMachOParser::parse(const char *m_s, ulong fdlen, QString *e
}
pos += sizeof(QPluginMetaData::MagicString);
- return { pos, qsizetype(sect[j].size - sizeof(QPluginMetaData::MagicString)) };
+ return { pos, qsizetype(sect[j].size - sizeof(QPluginMetaData::MagicString)), binaryIsEncrypted };
}
}
diff --git a/src/corelib/plugin/qmachparser_p.h b/src/corelib/plugin/qmachparser_p.h
index 216f4c3bb9..85a174e66e 100644
--- a/src/corelib/plugin/qmachparser_p.h
+++ b/src/corelib/plugin/qmachparser_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QMACHPARSER_P_H
#define QMACHPARSER_P_H
diff --git a/src/corelib/plugin/qplugin.h b/src/corelib/plugin/qplugin.h
index 6efdcfe7f6..909c8acdcc 100644
--- a/src/corelib/plugin/qplugin.h
+++ b/src/corelib/plugin/qplugin.h
@@ -1,50 +1,20 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Copyright (C) 2021 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// Copyright (C) 2021 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QPLUGIN_H
#define QPLUGIN_H
+#if 0
+#pragma qt_class(QtPlugin)
+#endif
+
#include <QtCore/qobject.h>
#include <QtCore/qpointer.h>
#include <QtCore/qjsonobject.h>
+#include <QtCore/q20algorithm.h>
+
QT_BEGIN_NAMESPACE
// Used up to Qt 6.2
@@ -74,10 +44,8 @@ struct QPluginMetaData
template <size_t OSize, typename OO, size_t ISize, typename II>
static constexpr void copy(OO (&out)[OSize], II (&in)[ISize])
{
- // std::copy is not constexpr until C++20
static_assert(OSize <= ISize, "Output would not be fully initialized");
- for (size_t i = 0; i < OSize; ++i)
- out[i] = in[i];
+ q20::copy_n(in, OSize, out);
}
static constexpr quint8 archRequirements()
@@ -159,7 +127,7 @@ void Q_CORE_EXPORT qRegisterStaticPluginFunction(QStaticPlugin staticPlugin);
#if defined(Q_OF_ELF) || (defined(Q_OS_WIN) && (defined (Q_CC_GNU) || defined(Q_CC_CLANG)))
# define QT_PLUGIN_METADATA_SECTION \
__attribute__ ((section (".qtmetadata"))) __attribute__((used))
-#elif defined(Q_OS_MAC)
+#elif defined(Q_OS_DARWIN)
# define QT_PLUGIN_METADATA_SECTION \
__attribute__ ((section ("__TEXT,qtmetadata"))) __attribute__((used))
#elif defined(Q_CC_MSVC)
diff --git a/src/corelib/plugin/qplugin.qdoc b/src/corelib/plugin/qplugin.qdoc
index 968fb4820a..0ca248a548 100644
--- a/src/corelib/plugin/qplugin.qdoc
+++ b/src/corelib/plugin/qplugin.qdoc
@@ -1,32 +1,9 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
\headerfile <QtPlugin>
+ \inmodule QtCore
\title Defining Plugins
\keyword qtplugin-defining-plugins
\ingroup plugins
@@ -42,13 +19,10 @@
This macro associates the given \a Identifier (a string literal)
to the interface class called \a ClassName. The \a Identifier must
- be unique. For example:
-
- \snippet plugandpaint/app/interfaces.h 3
+ be unique.
This macro is normally used right after the class definition for
- \a ClassName, in a header file. See the
- \l{tools/plugandpaint/app}{Plug & Paint} example for details.
+ \a ClassName, in a header file.
If you want to use Q_DECLARE_INTERFACE with interface classes
declared in a namespace then you have to make sure the Q_DECLARE_INTERFACE
@@ -76,8 +50,6 @@
\snippet code/doc_src_qplugin.cpp 1
- See the \l{tools/plugandpaint/app}{Plug & Paint} example for details.
-
Note that the class this macro appears on must be default-constructible.
FILE is optional and points to a json file.
@@ -105,11 +77,9 @@
\snippet code/doc_src_qplugin.cpp 2
Static plugins must also be included by the linker when your
- application is built. For Qt's predefined plugins,
- you can use the \c QTPLUGIN to add
- the required plugins to your build. For example:
+ application is built. See \l{Static Plugins} for more information
+ on this.
- \snippet code/doc_src_qplugin.pro 3
- \sa {Static Plugins}, {How to Create Qt Plugins}, {qmake-getting-started}{Getting Started with qmake}
+ \sa {Static Plugins}, {How to Create Qt Plugins}
*/
diff --git a/src/corelib/plugin/qplugin_p.h b/src/corelib/plugin/qplugin_p.h
index 026992ba97..534ca569df 100644
--- a/src/corelib/plugin/qplugin_p.h
+++ b/src/corelib/plugin/qplugin_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2018 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2018 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QPLUGIN_P_H
#define QPLUGIN_P_H
diff --git a/src/corelib/plugin/qpluginloader.cpp b/src/corelib/plugin/qpluginloader.cpp
index fb69142149..03b8cfbb84 100644
--- a/src/corelib/plugin/qpluginloader.cpp
+++ b/src/corelib/plugin/qpluginloader.cpp
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2018 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2018 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qpluginloader.h"
@@ -53,6 +17,8 @@
QT_BEGIN_NAMESPACE
+using namespace Qt::StringLiterals;
+
#if QT_CONFIG(library)
/*!
@@ -105,9 +71,11 @@ QT_BEGIN_NAMESPACE
link to plugins statically. You can use QLibrary if you need to
load dynamic libraries in a statically linked application.
- \sa QLibrary, {Plug & Paint Example}
+ \sa QLibrary
*/
+static constexpr QLibrary::LoadHints defaultLoadHints = QLibrary::PreventUnloadHint;
+
/*!
Constructs a plugin loader with the given \a parent.
*/
@@ -131,7 +99,7 @@ QPluginLoader::QPluginLoader(const QString &fileName, QObject *parent)
: QObject(parent), d(nullptr), did_load(false)
{
setFileName(fileName);
- setLoadHints(QLibrary::PreventUnloadHint);
+ setLoadHints(defaultLoadHints);
}
/*!
@@ -267,7 +235,7 @@ static QString locatePlugin(const QString& fileName)
suffixes.prepend(QString());
// Split up "subdir/filename"
- const int slash = fileName.lastIndexOf(QLatin1Char('/'));
+ const qsizetype slash = fileName.lastIndexOf(u'/');
const auto baseName = QStringView{fileName}.mid(slash + 1);
const auto basePath = isAbsolute ? QStringView() : QStringView{fileName}.left(slash + 1); // keep the '/'
@@ -278,19 +246,19 @@ static QString locatePlugin(const QString& fileName)
paths = QCoreApplication::libraryPaths();
}
- for (const QString &path : qAsConst(paths)) {
- for (const QString &prefix : qAsConst(prefixes)) {
- for (const QString &suffix : qAsConst(suffixes)) {
+ for (const QString &path : std::as_const(paths)) {
+ for (const QString &prefix : std::as_const(prefixes)) {
+ for (const QString &suffix : std::as_const(suffixes)) {
#ifdef Q_OS_ANDROID
{
QString pluginPath = basePath + prefix + baseName + suffix;
- const QString fn = path + QLatin1String("/lib") + pluginPath.replace(QLatin1Char('/'), QLatin1Char('_'));
+ const QString fn = path + "/lib"_L1 + pluginPath.replace(u'/', u'_');
qCDebug(qt_lcDebugPlugins) << "Trying..." << fn;
if (QFileInfo(fn).isFile())
return fn;
}
#endif
- const QString fn = path + QLatin1Char('/') + basePath + prefix + baseName + suffix;
+ const QString fn = path + u'/' + basePath + prefix + baseName + suffix;
qCDebug(qt_lcDebugPlugins) << "Trying..." << fn;
if (QFileInfo(fn).isFile())
return fn;
@@ -327,7 +295,7 @@ static QString locatePlugin(const QString& fileName)
void QPluginLoader::setFileName(const QString &fileName)
{
#if defined(QT_SHARED)
- QLibrary::LoadHints lh = QLibrary::PreventUnloadHint;
+ QLibrary::LoadHints lh = defaultLoadHints;
if (d) {
lh = d->loadHints();
d->release();
@@ -381,15 +349,21 @@ QString QPluginLoader::errorString() const
void QPluginLoader::setLoadHints(QLibrary::LoadHints loadHints)
{
if (!d) {
- d = QLibraryPrivate::findOrCreate(QString()); // ugly, but we need a d-ptr
+ d = QLibraryPrivate::findOrCreate({}, {}, loadHints); // ugly, but we need a d-ptr
d->errorString.clear();
+ } else {
+ d->setLoadHints(loadHints);
}
- d->setLoadHints(loadHints);
}
QLibrary::LoadHints QPluginLoader::loadHints() const
{
- return d ? d->loadHints() : QLibrary::LoadHints();
+ // Not having a d-pointer means that the user hasn't called
+ // setLoadHints() / setFileName() yet. In setFileName() we will
+ // then force defaultLoadHints on loading, so we must return them
+ // from here as well.
+
+ return d ? d->loadHints() : defaultLoadHints;
}
#endif // QT_CONFIG(library)
@@ -406,7 +380,19 @@ Q_GLOBAL_STATIC(StaticPluginList, staticPluginList)
*/
void Q_CORE_EXPORT qRegisterStaticPluginFunction(QStaticPlugin plugin)
{
- staticPluginList()->append(plugin);
+ // using operator* because we shouldn't be registering plugins while
+ // unloading the application!
+ StaticPluginList &plugins = *staticPluginList;
+
+ // insert the plugin in the list, sorted by address, so we can detect
+ // duplicate registrations
+ auto comparator = [=](const QStaticPlugin &p1, const QStaticPlugin &p2) {
+ using Less = std::less<decltype(plugin.instance)>;
+ return Less{}(p1.instance, p2.instance);
+ };
+ auto pos = std::lower_bound(plugins.constBegin(), plugins.constEnd(), plugin, comparator);
+ if (pos == plugins.constEnd() || pos->instance != plugin.instance)
+ plugins.insert(pos, plugin);
}
/*!
@@ -417,12 +403,11 @@ void Q_CORE_EXPORT qRegisterStaticPluginFunction(QStaticPlugin plugin)
QObjectList QPluginLoader::staticInstances()
{
QObjectList instances;
- const StaticPluginList *plugins = staticPluginList();
- if (plugins) {
- const int numPlugins = plugins->size();
- instances.reserve(numPlugins);
- for (int i = 0; i < numPlugins; ++i)
- instances += plugins->at(i).instance();
+ if (staticPluginList.exists()) {
+ const StaticPluginList &plugins = *staticPluginList;
+ instances.reserve(plugins.size());
+ for (QStaticPlugin plugin : plugins)
+ instances += plugin.instance();
}
return instances;
}
diff --git a/src/corelib/plugin/qpluginloader.h b/src/corelib/plugin/qpluginloader.h
index b242de2991..e541994e62 100644
--- a/src/corelib/plugin/qpluginloader.h
+++ b/src/corelib/plugin/qpluginloader.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QPLUGINLOADER_H
#define QPLUGINLOADER_H
diff --git a/src/corelib/plugin/qsystemlibrary.cpp b/src/corelib/plugin/qsystemlibrary.cpp
index 593b0c3be7..d3dff226d9 100644
--- a/src/corelib/plugin/qsystemlibrary.cpp
+++ b/src/corelib/plugin/qsystemlibrary.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qsystemlibrary_p.h"
#include <QtCore/qvarlengtharray.h>
@@ -72,52 +36,56 @@
QT_BEGIN_NAMESPACE
+using namespace Qt::StringLiterals;
+
#if !defined(QT_BOOTSTRAPPED)
extern QString qAppFileName();
#endif
static QString qSystemDirectory()
{
- QVarLengthArray<wchar_t, MAX_PATH> fullPath;
-
- UINT retLen = ::GetSystemDirectory(fullPath.data(), MAX_PATH);
- if (retLen > MAX_PATH) {
- fullPath.resize(retLen);
- retLen = ::GetSystemDirectory(fullPath.data(), retLen);
- }
- // in some rare cases retLen might be 0
- return QString::fromWCharArray(fullPath.constData(), int(retLen));
+ static const QString result = []() -> QString {
+ QVarLengthArray<wchar_t, MAX_PATH> fullPath = {};
+ UINT retLen = ::GetSystemDirectoryW(fullPath.data(), MAX_PATH);
+ if (retLen > MAX_PATH) {
+ fullPath.resize(retLen);
+ retLen = ::GetSystemDirectoryW(fullPath.data(), retLen);
+ }
+ // in some rare cases retLen might be 0
+ return QString::fromWCharArray(fullPath.constData(), int(retLen));
+ }();
+ return result;
}
HINSTANCE QSystemLibrary::load(const wchar_t *libraryName, bool onlySystemDirectory /* = true */)
{
+ if (onlySystemDirectory)
+ return ::LoadLibraryExW(libraryName, nullptr, LOAD_LIBRARY_SEARCH_SYSTEM32);
+
QStringList searchOrder;
#if !defined(QT_BOOTSTRAPPED)
- if (!onlySystemDirectory)
- searchOrder << QFileInfo(qAppFileName()).path();
+ searchOrder << QFileInfo(qAppFileName()).path();
#endif
searchOrder << qSystemDirectory();
- if (!onlySystemDirectory) {
- const QString PATH(QLatin1String(qgetenv("PATH").constData()));
- searchOrder << PATH.split(QLatin1Char(';'), Qt::SkipEmptyParts);
- }
- QString fileName = QString::fromWCharArray(libraryName);
- fileName.append(QLatin1String(".dll"));
+ const QString PATH(QLatin1StringView(qgetenv("PATH")));
+ searchOrder << PATH.split(u';', Qt::SkipEmptyParts);
+
+ const QString fileName = QString::fromWCharArray(libraryName);
// Start looking in the order specified
for (int i = 0; i < searchOrder.count(); ++i) {
QString fullPathAttempt = searchOrder.at(i);
- if (!fullPathAttempt.endsWith(QLatin1Char('\\'))) {
- fullPathAttempt.append(QLatin1Char('\\'));
+ if (!fullPathAttempt.endsWith(u'\\')) {
+ fullPathAttempt.append(u'\\');
}
fullPathAttempt.append(fileName);
HINSTANCE inst = ::LoadLibrary(reinterpret_cast<const wchar_t *>(fullPathAttempt.utf16()));
- if (inst != 0)
+ if (inst != nullptr)
return inst;
}
- return 0;
+ return nullptr;
}
QT_END_NAMESPACE
diff --git a/src/corelib/plugin/qsystemlibrary_p.h b/src/corelib/plugin/qsystemlibrary_p.h
index b27e746fd3..0b4ad7dbc2 100644
--- a/src/corelib/plugin/qsystemlibrary_p.h
+++ b/src/corelib/plugin/qsystemlibrary_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QSYSTEMLIBRARY_P_H
#define QSYSTEMLIBRARY_P_H
@@ -64,27 +28,23 @@ public:
explicit QSystemLibrary(const QString &libraryName)
{
m_libraryName = libraryName;
- m_handle = 0;
- m_didLoad = false;
}
explicit QSystemLibrary(const wchar_t *libraryName)
{
m_libraryName = QString::fromWCharArray(libraryName);
- m_handle = 0;
- m_didLoad = false;
}
bool load(bool onlySystemDirectory = true)
{
m_handle = load((const wchar_t *)m_libraryName.utf16(), onlySystemDirectory);
m_didLoad = true;
- return (m_handle != 0);
+ return (m_handle != nullptr);
}
bool isLoaded()
{
- return (m_handle != 0);
+ return (m_handle != nullptr);
}
QFunctionPointer resolve(const char *symbol)
@@ -92,7 +52,7 @@ public:
if (!m_didLoad)
load();
if (!m_handle)
- return 0;
+ return nullptr;
return QFunctionPointer(GetProcAddress(m_handle, symbol));
}
@@ -102,10 +62,11 @@ public:
}
static Q_CORE_EXPORT HINSTANCE load(const wchar_t *lpFileName, bool onlySystemDirectory = true);
+
private:
- HINSTANCE m_handle;
- QString m_libraryName;
- bool m_didLoad;
+ HINSTANCE m_handle = nullptr;
+ QString m_libraryName = {};
+ bool m_didLoad = false;
};
QT_END_NAMESPACE
diff --git a/src/corelib/plugin/quuid.cpp b/src/corelib/plugin/quuid.cpp
index 7f7d537fe4..9c7216c3c5 100644
--- a/src/corelib/plugin/quuid.cpp
+++ b/src/corelib/plugin/quuid.cpp
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Copyright (C) 2017 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// Copyright (C) 2017 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "quuid.h"
@@ -49,6 +13,9 @@
QT_BEGIN_NAMESPACE
+// ensure QList of this is efficient
+static_assert(QTypeInfo<QUuid::Id128Bytes>::isRelocatable);
+
// 16 bytes (a uint, two shorts and a uchar[8]), each represented by two hex
// digits; plus four dashes and a pair of enclosing brace: 16*2 + 4 + 2 = 38.
enum { MaxStringUuidLength = 38 };
@@ -323,6 +290,125 @@ static QUuid createFromName(const QUuid &ns, const QByteArray &baseData, QCrypto
*/
/*!
+ \class QUuid::Id128Bytes
+ \inmodule QtCore
+ \since 6.6
+
+ This trivial structure is 128 bits (16 bytes) in size and holds the binary
+ representation of a UUID. Applications can \c{memcpy()} its contents to and
+ from many other libraries' UUID or GUID structures that take 128-bit
+ values.
+*/
+
+/*!
+ \fn QUuid::Id128Bytes qFromBigEndian(QUuid::Id128Bytes src)
+ \since 6.6
+ \relates QUuid::Id128Bytes
+ \overload
+
+ Converts \a src from big-endian byte order and returns the struct holding
+ the binary representation of UUID in host byte order.
+
+ \sa <QtEndian>
+*/
+
+/*!
+ \fn QUuid::Id128Bytes qFromLittleEndian(QUuid::Id128Bytes src)
+ \since 6.6
+ \relates QUuid::Id128Bytes
+ \overload
+
+ Converts \a src from little-endian byte order and returns the struct holding
+ the binary representation of UUID in host byte order.
+
+ \sa <QtEndian>
+*/
+
+/*!
+ \fn QUuid::Id128Bytes qToBigEndian(QUuid::Id128Bytes src)
+ \since 6.6
+ \relates QUuid::Id128Bytes
+ \overload
+
+ Converts \a src from host byte order and returns the struct holding the
+ binary representation of UUID in big-endian byte order.
+
+ \sa <QtEndian>
+*/
+
+/*!
+ \fn QUuid::Id128Bytes qToLittleEndian(QUuid::Id128Bytes src)
+ \since 6.6
+ \relates QUuid::Id128Bytes
+ \overload
+
+ Converts \a src from host byte order and returns the struct holding the
+ binary representation of UUID in little-endian byte order.
+
+ \sa <QtEndian>
+*/
+
+/*!
+ \fn QUuid::QUuid(Id128Bytes id128, QSysInfo::Endian order) noexcept
+ \since 6.6
+
+ Creates a QUuid based on the integral \a id128 parameter. The input
+ \a id128 parameter is considered to have byte order \a order.
+
+ \sa fromBytes(), toBytes(), toRfc4122(), toUInt128()
+*/
+
+/*!
+ \fn QUuid::fromUInt128(quint128 uuid, QSysInfo::Endian order) noexcept
+ \since 6.6
+
+ Creates a QUuid based on the integral \a uuid parameter. The input \a uuid
+ parameter is considered to have byte order \a order.
+
+ \note This function is only present on platforms that offer a 128-bit
+ integer type.
+
+ \sa toUInt128(), fromBytes(), toBytes(), toRfc4122()
+*/
+
+/*!
+ \fn quint128 QUuid::toUInt128(QSysInfo::Endian order) const noexcept
+ \since 6.6
+
+ Returns a 128-bit integer created from this QUuid on the byte order
+ specified by \a order. The binary content of this function is the same as
+ toRfc4122() if the order is QSysInfo::BigEndian. See that function for more
+ details.
+
+ \note This function is only present on platforms that offer a 128-bit
+ integer type.
+
+ \sa toRfc4122(), fromUInt128(), toBytes(), fromBytes(), QUuid()
+*/
+
+/*!
+ \fn QUuid::Id128Bytes QUuid::toBytes(QSysInfo::Endian order) const noexcept
+ \since 6.6
+
+ Returns a 128-bit ID created from this QUuid on the byte order specified
+ by \a order. The binary content of this function is the same as toRfc4122()
+ if the order is QSysInfo::BigEndian. See that function for more details.
+
+ \sa toRfc4122(), fromBytes(), QUuid()
+*/
+
+/*!
+ \fn QUuid QUuid::fromBytes(const void *bytes, QSysInfo::Endian order) noexcept
+ \since 6.6
+
+ Reads 128 bits (16 bytes) from \a bytes using byte order \a order and
+ returns the QUuid corresponding to those bytes. This function does the same
+ as fromRfc4122() if the byte order \a order is QSysInfo::BigEndian.
+
+ \sa fromRfc4122()
+*/
+
+/*!
\fn QUuid::QUuid(const GUID &guid)
Casts a Windows \a guid to a Qt QUuid.
@@ -395,7 +481,7 @@ static QUuid createFromName(const QUuid &ns, const QByteArray &baseData, QCrypto
public data members in QUuid.
\note In Qt versions prior to 6.3, this function was an overload
- set consisting of QStringView and QLatin1String instead of
+ set consisting of QStringView and QLatin1StringView instead of
one function taking QAnyStringView.
\sa toString(), QUuid()
@@ -416,13 +502,13 @@ static QUuid uuidFromString(QStringView text) noexcept
return _q_uuidFromHex(latin1);
}
-static QUuid uuidFromString(QLatin1String text) noexcept
+static QUuid uuidFromString(QLatin1StringView text) noexcept
{
if (Q_UNLIKELY(text.size() < MaxStringUuidLength - 2
- || (text.front() == QLatin1Char('{') && text.size() < MaxStringUuidLength - 1))) {
+ || (text.front() == '{' && text.size() < MaxStringUuidLength - 1))) {
// Too short. Don't call _q_uuidFromHex(); QL1Ss need not be NUL-terminated,
// and we don't want to read trailing garbage as potentially valid data.
- text = QLatin1String();
+ text = QLatin1StringView();
}
return _q_uuidFromHex(text.data());
}
@@ -431,7 +517,7 @@ Q_ALWAYS_INLINE
// can treat UTF-8 the same as Latin-1:
static QUuid uuidFromString(QUtf8StringView text) noexcept
{
- return uuidFromString(QLatin1String(text.data(), text.size()));
+ return uuidFromString(QLatin1StringView(text.data(), text.size()));
}
QUuid QUuid::fromString(QAnyStringView text) noexcept
@@ -504,32 +590,13 @@ QUuid QUuid::createUuidV5(const QUuid &ns, const QByteArray &baseData)
\since 4.8
- \sa toRfc4122(), QUuid()
+ \sa toRfc4122(), QUuid(), fromBytes()
*/
QUuid QUuid::fromRfc4122(QByteArrayView bytes) noexcept
{
if (bytes.isEmpty() || bytes.size() != 16)
return QUuid();
-
- uint d1;
- ushort d2, d3;
- uchar d4[8];
-
- const uchar *data = reinterpret_cast<const uchar *>(bytes.data());
-
- d1 = qFromBigEndian<quint32>(data);
- data += sizeof(quint32);
- d2 = qFromBigEndian<quint16>(data);
- data += sizeof(quint16);
- d3 = qFromBigEndian<quint16>(data);
- data += sizeof(quint16);
-
- for (int i = 0; i < 8; ++i) {
- d4[i] = *(data);
- data++;
- }
-
- return QUuid(d1, d2, d3, d4[0], d4[1], d4[2], d4[3], d4[4], d4[5], d4[6], d4[7]);
+ return fromBytes(bytes.data());
}
/*!
@@ -659,27 +726,16 @@ QByteArray QUuid::toByteArray(QUuid::StringFormat mode) const
\endtable
+ The bytes in the byte array returned by this function contains the same
+ binary content as toBytes().
+
+ \sa toBytes()
\since 4.8
*/
QByteArray QUuid::toRfc4122() const
{
- // we know how many bytes a UUID has, I hope :)
- QByteArray bytes(16, Qt::Uninitialized);
- uchar *data = reinterpret_cast<uchar *>(bytes.data());
-
- qToBigEndian(data1, data);
- data += sizeof(quint32);
- qToBigEndian(data2, data);
- data += sizeof(quint16);
- qToBigEndian(data3, data);
- data += sizeof(quint16);
-
- for (int i = 0; i < 8; ++i) {
- *(data) = data4[i];
- data++;
- }
-
- return bytes;
+ Id128Bytes bytes = toBytes();
+ return QByteArrayView(bytes).toByteArray();
}
#ifndef QT_NO_DATASTREAM
@@ -689,14 +745,19 @@ QByteArray QUuid::toRfc4122() const
*/
QDataStream &operator<<(QDataStream &s, const QUuid &id)
{
- QByteArray bytes;
+ constexpr int NumBytes = sizeof(QUuid);
+ static_assert(NumBytes == 16, "Change the serialization format when this ever hits");
+ char bytes[NumBytes];
if (s.byteOrder() == QDataStream::BigEndian) {
- bytes = id.toRfc4122();
+ const auto id128 = id.toBytes();
+ static_assert(sizeof(id128) == NumBytes);
+ memcpy(bytes, &id128, NumBytes);
} else {
- // we know how many bytes a UUID has, I hope :)
- bytes = QByteArray(16, Qt::Uninitialized);
- uchar *data = reinterpret_cast<uchar *>(bytes.data());
+ auto *data = bytes;
+ // for historical reasons, our little-endian serialization format
+ // stores each of the UUID fields in little endian, instead of storing
+ // a little endian Id128
qToLittleEndian(id.data1, data);
data += sizeof(quint32);
qToLittleEndian(id.data2, data);
@@ -710,9 +771,9 @@ QDataStream &operator<<(QDataStream &s, const QUuid &id)
}
}
- if (s.writeRawData(bytes.data(), 16) != 16) {
+ if (s.writeRawData(bytes, NumBytes) != NumBytes)
s.setStatus(QDataStream::WriteFailed);
- }
+
return s;
}
@@ -931,7 +992,7 @@ QUuid QUuid::createUuid()
return result;
}
-#else // Q_OS_WIN
+#elif !defined(QT_BOOTSTRAPPED)
QUuid QUuid::createUuid()
{
@@ -945,7 +1006,7 @@ QUuid QUuid::createUuid()
return result;
}
-#endif // !Q_OS_WIN
+#endif // !Q_OS_WIN && !QT_BOOTSTRAPPED
/*!
\fn bool QUuid::operator==(const GUID &guid) const
diff --git a/src/corelib/plugin/quuid.h b/src/corelib/plugin/quuid.h
index 9229d5b694..7125e8e2cc 100644
--- a/src/corelib/plugin/quuid.h
+++ b/src/corelib/plugin/quuid.h
@@ -1,48 +1,13 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QUUID_H
#define QUUID_H
+#include <QtCore/qendian.h>
#include <QtCore/qstring.h>
-#if defined(Q_OS_WIN) || defined(Q_CLANG_QDOC)
+#if defined(Q_OS_WIN) || defined(Q_QDOC)
#ifndef GUID_DEFINED
#define GUID_DEFINED
typedef struct _GUID
@@ -55,14 +20,13 @@ typedef struct _GUID
#endif
#endif
-#if defined(Q_OS_DARWIN) || defined(Q_CLANG_QDOC)
+#if defined(Q_OS_DARWIN) || defined(Q_QDOC)
Q_FORWARD_DECLARE_CF_TYPE(CFUUID);
Q_FORWARD_DECLARE_OBJC_CLASS(NSUUID);
#endif
QT_BEGIN_NAMESPACE
-
class Q_CORE_EXPORT QUuid
{
QUuid(Qt::Initialization) {}
@@ -91,31 +55,73 @@ public:
Id128 = 3
};
+ union alignas(16) Id128Bytes {
+ quint8 data[16];
+ quint16 data16[8];
+ quint32 data32[4];
+ quint64 data64[2];
+#if defined(__SIZEOF_INT128__)
+QT_WARNING_PUSH
+QT_WARNING_DISABLE_GCC("-Wpedantic") // ISO C++ does not support ‘__int128’ for ‘data128’
+ unsigned __int128 data128[1];
+QT_WARNING_POP
+#elif defined(QT_SUPPORTS_INT128)
+# error "struct QUuid::Id128Bytes should not depend on QT_SUPPORTS_INT128 for ABI reasons."
+# error "Adjust the declaration of the `data128` member above so it is always defined if it's " \
+ "supported by the current compiler/architecture in any configuration."
+#endif
+
+ constexpr explicit operator QByteArrayView() const noexcept
+ {
+ return QByteArrayView(data, sizeof(data));
+ }
+
+ friend constexpr Id128Bytes qbswap(Id128Bytes b) noexcept
+ {
+ // 128-bit byte swap
+ auto b0 = qbswap(b.data64[0]);
+ auto b1 = qbswap(b.data64[1]);
+ b.data64[0] = b1;
+ b.data64[1] = b0;
+ return b;
+ }
+ };
+
constexpr QUuid() noexcept : data1(0), data2(0), data3(0), data4{0,0,0,0,0,0,0,0} {}
constexpr QUuid(uint l, ushort w1, ushort w2, uchar b1, uchar b2, uchar b3,
uchar b4, uchar b5, uchar b6, uchar b7, uchar b8) noexcept
: data1(l), data2(w1), data3(w2), data4{b1, b2, b3, b4, b5, b6, b7, b8} {}
+ explicit inline QUuid(Id128Bytes id128, QSysInfo::Endian order = QSysInfo::BigEndian) noexcept;
explicit QUuid(QAnyStringView string) noexcept
: QUuid{fromString(string)} {}
static QUuid fromString(QAnyStringView string) noexcept;
-#if QT_REMOVED_SINCE(6, 3)
+#if QT_CORE_REMOVED_SINCE(6, 3)
explicit QUuid(const QString &);
static QUuid fromString(QStringView string) noexcept;
- static QUuid fromString(QLatin1String string) noexcept;
+ static QUuid fromString(QLatin1StringView string) noexcept;
explicit QUuid(const char *);
explicit QUuid(const QByteArray &);
#endif
QString toString(StringFormat mode = WithBraces) const;
QByteArray toByteArray(StringFormat mode = WithBraces) const;
+ inline Id128Bytes toBytes(QSysInfo::Endian order = QSysInfo::BigEndian) const noexcept;
QByteArray toRfc4122() const;
-#if QT_REMOVED_SINCE(6, 3)
+
+ static inline QUuid fromBytes(const void *bytes, QSysInfo::Endian order = QSysInfo::BigEndian);
+#if QT_CORE_REMOVED_SINCE(6, 3)
static QUuid fromRfc4122(const QByteArray &);
#endif
static QUuid fromRfc4122(QByteArrayView) noexcept;
+
bool isNull() const noexcept;
+#ifdef QT_SUPPORTS_INT128
+ static constexpr QUuid fromUInt128(quint128 uuid, QSysInfo::Endian order = QSysInfo::BigEndian) noexcept;
+ constexpr quint128 toUInt128(QSysInfo::Endian order = QSysInfo::BigEndian) const noexcept;
+#endif
+
constexpr bool operator==(const QUuid &orig) const noexcept
{
if (data1 != orig.data1 || data2 != orig.data2 ||
@@ -137,7 +143,7 @@ public:
bool operator<(const QUuid &other) const noexcept;
bool operator>(const QUuid &other) const noexcept;
-#if defined(Q_OS_WIN) || defined(Q_CLANG_QDOC)
+#if defined(Q_OS_WIN) || defined(Q_QDOC)
// On Windows we have a type GUID that is used by the platform API, so we
// provide convenience operators to cast from and to this type.
constexpr QUuid(const GUID &guid) noexcept
@@ -187,7 +193,7 @@ public:
QUuid::Variant variant() const noexcept;
QUuid::Version version() const noexcept;
-#if defined(Q_OS_DARWIN) || defined(Q_CLANG_QDOC)
+#if defined(Q_OS_DARWIN) || defined(Q_QDOC)
static QUuid fromCFUUID(CFUUIDRef uuid);
CFUUIDRef toCFUUID() const Q_DECL_CF_RETURNS_RETAINED;
static QUuid fromNSUUID(const NSUUID *uuid);
@@ -213,11 +219,92 @@ Q_CORE_EXPORT QDebug operator<<(QDebug, const QUuid &);
Q_CORE_EXPORT size_t qHash(const QUuid &uuid, size_t seed = 0) noexcept;
+QUuid::QUuid(Id128Bytes uuid, QSysInfo::Endian order) noexcept
+{
+ if (order == QSysInfo::LittleEndian)
+ uuid = qbswap(uuid);
+ data1 = qFromBigEndian<quint32>(&uuid.data[0]);
+ data2 = qFromBigEndian<quint16>(&uuid.data[4]);
+ data3 = qFromBigEndian<quint16>(&uuid.data[6]);
+ memcpy(data4, &uuid.data[8], sizeof(data4));
+}
+
+QUuid::Id128Bytes QUuid::toBytes(QSysInfo::Endian order) const noexcept
+{
+ Id128Bytes result = {};
+ qToBigEndian(data1, &result.data[0]);
+ qToBigEndian(data2, &result.data[4]);
+ qToBigEndian(data3, &result.data[6]);
+ memcpy(&result.data[8], data4, sizeof(data4));
+ if (order == QSysInfo::LittleEndian)
+ return qbswap(result);
+ return result;
+}
+
+QUuid QUuid::fromBytes(const void *bytes, QSysInfo::Endian order)
+{
+ Id128Bytes result = {};
+ memcpy(result.data, bytes, sizeof(result));
+ return QUuid(result, order);
+}
+
+#ifdef QT_SUPPORTS_INT128
+constexpr QUuid QUuid::fromUInt128(quint128 uuid, QSysInfo::Endian order) noexcept
+{
+ QUuid result = {};
+ if (order == QSysInfo::BigEndian) {
+ result.data1 = qFromBigEndian<quint32>(int(uuid));
+ result.data2 = qFromBigEndian<quint16>(ushort(uuid >> 32));
+ result.data3 = qFromBigEndian<quint16>(ushort(uuid >> 48));
+ for (int i = 0; i < 8; ++i)
+ result.data4[i] = uchar(uuid >> (64 + i * 8));
+ } else {
+ result.data1 = qFromLittleEndian<quint32>(uint(uuid >> 96));
+ result.data2 = qFromLittleEndian<quint16>(ushort(uuid >> 80));
+ result.data3 = qFromLittleEndian<quint16>(ushort(uuid >> 64));
+ for (int i = 0; i < 8; ++i)
+ result.data4[i] = uchar(uuid >> (56 - i * 8));
+ }
+ return result;
+}
+
+constexpr quint128 QUuid::toUInt128(QSysInfo::Endian order) const noexcept
+{
+ quint128 result = {};
+ if (order == QSysInfo::BigEndian) {
+ for (int i = 0; i < 8; ++i)
+ result |= quint64(data4[i]) << (i * 8);
+ result = result << 64;
+ result |= quint64(qToBigEndian<quint16>(data3)) << 48;
+ result |= quint64(qToBigEndian<quint16>(data2)) << 32;
+ result |= qToBigEndian<quint32>(data1);
+ } else {
+ result = qToLittleEndian<quint32>(data1);
+ result = result << 32;
+ result |= quint64(qToLittleEndian<quint16>(data2)) << 16;
+ result |= quint64(qToLittleEndian<quint16>(data3));
+ result = result << 64;
+ for (int i = 0; i < 8; ++i)
+ result |= quint64(data4[i]) << (56 - i * 8);
+ }
+ return result;
+}
+#endif
+
inline bool operator<=(const QUuid &lhs, const QUuid &rhs) noexcept
{ return !(rhs < lhs); }
inline bool operator>=(const QUuid &lhs, const QUuid &rhs) noexcept
{ return !(lhs < rhs); }
+#if defined(Q_QDOC)
+// provide fake declarations of qXXXEndian() functions, so that qDoc could
+// distinguish them from the general template
+QUuid::Id128Bytes qFromBigEndian(QUuid::Id128Bytes src);
+QUuid::Id128Bytes qFromLittleEndian(QUuid::Id128Bytes src);
+QUuid::Id128Bytes qToBigEndian(QUuid::Id128Bytes src);
+QUuid::Id128Bytes qToLittleEndian(QUuid::Id128Bytes src);
+#endif
+
QT_END_NAMESPACE
#endif // QUUID_H
diff --git a/src/corelib/qt_cmdline.cmake b/src/corelib/qt_cmdline.cmake
index b38039f61f..dddb74cbaf 100644
--- a/src/corelib/qt_cmdline.cmake
+++ b/src/corelib/qt_cmdline.cmake
@@ -1,14 +1,17 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+
qt_commandline_option(doubleconversion TYPE enum VALUES no qt system)
-qt_commandline_option(eventfd TYPE boolean)
qt_commandline_option(glib TYPE boolean)
qt_commandline_option(icu TYPE boolean)
qt_commandline_option(inotify TYPE boolean)
qt_commandline_option(journald TYPE boolean)
qt_commandline_option(libb2 TYPE enum VALUES no qt system)
qt_commandline_option(mimetype-database TYPE boolean)
+qt_commandline_option(mimetype-database-compression TYPE optionalString VALUES zstd gzip none)
qt_commandline_option(pcre TYPE enum VALUES no qt system)
qt_commandline_option(posix-ipc TYPE boolean NAME ipc_posix)
qt_commandline_option(pps TYPE boolean NAME qqnx_pps)
qt_commandline_option(slog2 TYPE boolean)
qt_commandline_option(syslog TYPE boolean)
-qt_commandline_option(trace TYPE optionalString VALUES etw lttng no yes)
+qt_commandline_option(trace TYPE optionalString VALUES etw lttng ctf no yes)
diff --git a/src/corelib/qtcore.tracepoints b/src/corelib/qtcore.tracepoints
deleted file mode 100644
index 4647b440a8..0000000000
--- a/src/corelib/qtcore.tracepoints
+++ /dev/null
@@ -1,41 +0,0 @@
-{
-QT_BEGIN_NAMESPACE
-class QEvent;
-QT_END_NAMESPACE
-}
-
-QCoreApplicationPrivate_init_entry()
-QCoreApplicationPrivate_init_exit()
-
-QFactoryLoader_update(const QString &fileName)
-
-QLibraryPrivate_load_entry(const QString &fileName)
-QLibraryPrivate_load_exit(bool success)
-
-QEvent_ctor(QEvent *event, int type)
-QEvent_dtor(QEvent *event, int type)
-
-QCoreApplication_postEvent_entry(QObject *receiver, QEvent *event, int type)
-QCoreApplication_postEvent_exit()
-QCoreApplication_postEvent_event_compressed(QObject *receiver, QEvent *event)
-QCoreApplication_postEvent_event_posted(QObject *receiver, QEvent *event, int type)
-
-QCoreApplication_sendEvent(QObject *receiver, QEvent *event, int type)
-QCoreApplication_sendSpontaneousEvent(QObject *receiver, QEvent *event, int type)
-
-QCoreApplication_notify_entry(QObject *receiver, QEvent *event, int type)
-QCoreApplication_notify_exit(bool consumed, bool filtered)
-
-QObject_ctor(QObject *object)
-QObject_dtor(QObject *object)
-
-QMetaObject_activate_entry(QObject *sender, int signalIndex)
-QMetaObject_activate_exit()
-QMetaObject_activate_slot_entry(QObject *receiver, int slotIndex)
-QMetaObject_activate_slot_exit()
-QMetaObject_activate_slot_functor_entry(void *slotObject)
-QMetaObject_activate_slot_functor_exit()
-QMetaObject_activate_declarative_signal_entry(QObject *sender, int signalIndex)
-QMetaObject_activate_declarative_signal_exit()
-
-qt_message_print(int type, const char *category, const char *function, const char *file, int line, const QString &message)
diff --git a/src/corelib/serialization/make-xml-parser.sh b/src/corelib/serialization/make-xml-parser.sh
index 0296e4c22b..1889833700 100755
--- a/src/corelib/serialization/make-xml-parser.sh
+++ b/src/corelib/serialization/make-xml-parser.sh
@@ -1,42 +1,6 @@
#!/bin/sh
-#############################################################################
-##
-## Copyright (C) 2016 The Qt Company Ltd.
-## Contact: https://www.qt.io/licensing/
-##
-## This file is the build configuration utility of the Qt Toolkit.
-##
-## $QT_BEGIN_LICENSE:LGPL$
-## Commercial License Usage
-## Licensees holding valid commercial Qt licenses may use this file in
-## accordance with the commercial license agreement provided with the
-## Software or, alternatively, in accordance with the terms contained in
-## a written agreement between you and The Qt Company. For licensing terms
-## and conditions see https://www.qt.io/terms-conditions. For further
-## information use the contact form at https://www.qt.io/contact-us.
-##
-## GNU Lesser General Public License Usage
-## Alternatively, this file may be used under the terms of the GNU Lesser
-## General Public License version 3 as published by the Free Software
-## Foundation and appearing in the file LICENSE.LGPL3 included in the
-## packaging of this file. Please review the following information to
-## ensure the GNU Lesser General Public License version 3 requirements
-## will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-##
-## GNU General Public License Usage
-## Alternatively, this file may be used under the terms of the GNU
-## General Public License version 2.0 or (at your option) the GNU General
-## Public license version 3 or any later version approved by the KDE Free
-## Qt Foundation. The licenses are as published by the Free Software
-## Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-## included in the packaging of this file. Please review the following
-## information to ensure the GNU General Public License requirements will
-## be met: https://www.gnu.org/licenses/gpl-2.0.html and
-## https://www.gnu.org/licenses/gpl-3.0.html.
-##
-## $QT_END_LICENSE$
-##
-#############################################################################
+# Copyright (C) 2016 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
me=$(dirname $0)
mkdir -p $me/out
diff --git a/src/corelib/serialization/qcborarray.cpp b/src/corelib/serialization/qcborarray.cpp
index 11f469dc86..626fb49a70 100644
--- a/src/corelib/serialization/qcborarray.cpp
+++ b/src/corelib/serialization/qcborarray.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2018 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2018 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qcborarray.h"
#include "qcborvalue_p.h"
@@ -49,11 +13,16 @@ using namespace QtCbor;
\class QCborArray
\inmodule QtCore
\ingroup cbor
+ \ingroup qtserialization
\reentrant
\since 5.12
\brief The QCborArray class is used to hold an array of CBOR elements.
+ \compares strong
+ \compareswith strong QCborValueConstRef
+ \endcompareswith
+
This class can be used to hold one sequential container in CBOR (an array).
CBOR is the Concise Binary Object Representation, a very compact form of
binary data encoding that is a superset of JSON. It was created by the IETF
@@ -66,7 +35,8 @@ using namespace QtCbor;
from those two, though there may be loss of information in some
conversions.
- \sa QCborValue, QCborMap, QJsonArray, QList
+ \sa QCborValue, QCborMap, QJsonArray, QList, {Parsing and displaying CBOR data},
+ {Serialization Converter}, {Saving and Loading a Game}
*/
/*!
@@ -454,7 +424,7 @@ void QCborArray::removeAt(qsizetype i)
bool QCborArray::contains(const QCborValue &value) const
{
for (qsizetype i = 0; i < size(); ++i) {
- int cmp = d->compareElement(i, value);
+ int cmp = d->compareElement(i, value, Comparison::ForEquality);
if (cmp == 0)
return true;
}
@@ -476,9 +446,9 @@ bool QCborArray::contains(const QCborValue &value) const
*/
/*!
- \fn bool QCborArray::operator==(const QCborArray &other) const
+ \fn bool QCborArray::operator==(const QCborArray &lhs, const QCborArray &rhs)
- Compares this array and \a other, comparing each element in sequence, and
+ Compares \a lhs and \a rhs arrays, comparing each element in sequence, and
returns true if both arrays contains the same elements, false otherwise.
For more information on CBOR equality in Qt, see, QCborValue::compare().
@@ -488,9 +458,9 @@ bool QCborArray::contains(const QCborValue &value) const
*/
/*!
- \fn bool QCborArray::operator!=(const QCborArray &other) const
+ \fn bool QCborArray::operator!=(const QCborArray &lhs, const QCborArray &rhs)
- Compares this array and \a other, comparing each element in sequence, and
+ Compares \a lhs and \a rhs arrays, comparing each element in sequence, and
returns true if the two arrays' contents are different, false otherwise.
For more information on CBOR equality in Qt, see, QCborValue::compare().
@@ -500,19 +470,58 @@ bool QCborArray::contains(const QCborValue &value) const
*/
/*!
- \fn bool QCborArray::operator<(const QCborArray &other) const
+ \fn bool QCborArray::operator<(const QCborArray &lhs, const QCborArray &rhs)
- Compares this array and \a other, comparing each element in sequence, and
- returns true if this array should be sorted before \a other, false
+ Compares \a lhs and \a rhs arrays, comparing each element in sequence, and
+ returns true if \a lhs array should be sorted before \a rhs, false
otherwise.
For more information on CBOR sorting order, see QCborValue::compare().
\sa compare(), QCborValue::operator==(), QCborMap::operator==(),
- operator==(), operator!=()
+ operator==(), operator!=(), operator<=()
*/
/*!
+ \fn bool QCborArray::operator<=(const QCborArray &lhs, const QCborArray &rhs)
+
+ Compares \a lhs and \a rhs arrays, comparing each element in sequence, and
+ returns true if \a lhs array should be sorted before \a rhs, or if both
+ arrays contains the same elements, false otherwise.
+
+ For more information on CBOR sorting order, see QCborValue::compare().
+
+ \sa compare(), QCborValue::operator==(), QCborMap::operator==(),
+ operator==(), operator!=(), operator<()
+*/
+
+/*!
+ \fn bool QCborArray::operator>(const QCborArray &lhs, const QCborArray &rhs)
+
+ Compares \a lhs and \a rhs arrays, comparing each element in sequence, and
+ returns true if \a lhs array should be sorted after \a rhs, false
+ otherwise.
+
+ For more information on CBOR sorting order, see QCborValue::compare().
+
+ \sa compare(), QCborValue::operator==(), QCborMap::operator==(),
+ operator==(), operator!=(), operator>=()
+*/
+
+/*!
+ \fn bool QCborArray::operator>=(const QCborArray &lhs, const QCborArray &rhs)
+
+ Compares \a lhs and \a rhs arrays, comparing each element in sequence, and
+ returns true if \a lhs array should be sorted after \a rhs, or if both
+ arrays contains the same elements, false otherwise.
+
+ For more information on CBOR sorting order, see QCborValue::compare().
+
+ \sa compare(), QCborValue::operator==(), QCborMap::operator==(),
+ operator==(), operator!=(), operator>()
+*/
+
+/*!
\typedef QCborArray::iterator
A synonym to QCborArray::Iterator.
@@ -713,6 +722,10 @@ void QCborArray::detach(qsizetype reserved)
\brief The QCborArray::Iterator class provides an STL-style non-const iterator for QCborArray.
+ \compares strong
+ \compareswith strong QCborArray::ConstIterator
+ \endcompareswith
+
QCborArray::Iterator allows you to iterate over a QCborArray and to modify
the array item associated with the iterator. If you want to iterate over a
const QCborArray, use QCborArray::ConstIterator instead. It is generally a
@@ -809,7 +822,7 @@ void QCborArray::detach(qsizetype reserved)
*/
/*!
- \fn QCborValueRef QCborArray::Iterator::operator[](qsizetype j)
+ \fn QCborValueRef QCborArray::Iterator::operator[](qsizetype j) const
Returns a modifiable reference to the item at a position \a j steps forward
from the item pointed to by this iterator.
@@ -827,63 +840,63 @@ void QCborArray::detach(qsizetype reserved)
*/
/*!
- \fn bool QCborArray::Iterator::operator==(const Iterator &other) const
- \fn bool QCborArray::Iterator::operator==(const ConstIterator &other) const
+ \fn bool QCborArray::Iterator::operator==(const Iterator &lhs, const Iterator &rhs)
+ \fn bool QCborArray::Iterator::operator==(const Iterator &lhs, const ConstIterator &rhs)
- Returns \c true if \a other points to the same entry in the array as this
+ Returns \c true if \a lhs points to the same entry in the array as \a rhs
iterator; otherwise returns \c false.
\sa operator!=()
*/
/*!
- \fn bool QCborArray::Iterator::operator!=(const Iterator &other) const
- \fn bool QCborArray::Iterator::operator!=(const ConstIterator &other) const
+ \fn bool QCborArray::Iterator::operator!=(const Iterator &lhs, const Iterator &rhs)
+ \fn bool QCborArray::Iterator::operator!=(const Iterator &lhs, const ConstIterator &rhs)
- Returns \c true if \a other points to a different entry in the array than
- this iterator; otherwise returns \c false.
+ Returns \c true if \a lhs points to a different entry in the array than
+ \a rhs iterator; otherwise returns \c false.
\sa operator==()
*/
/*!
- \fn bool QCborArray::Iterator::operator<(const Iterator& other) const
- \fn bool QCborArray::Iterator::operator<(const ConstIterator& other) const
+ \fn bool QCborArray::Iterator::operator<(const Iterator &lhs, const Iterator &rhs)
+ \fn bool QCborArray::Iterator::operator<(const Iterator &lhs, const ConstIterator &rhs)
- Returns \c true if the entry in the array pointed to by this iterator
- occurs before the entry pointed to by the \a other iterator.
+ Returns \c true if the entry in the array pointed to by \a lhs iterator
+ occurs before the entry pointed to by the \a rhs iterator.
*/
/*!
- \fn bool QCborArray::Iterator::operator<=(const Iterator& other) const
- \fn bool QCborArray::Iterator::operator<=(const ConstIterator& other) const
+ \fn bool QCborArray::Iterator::operator<=(const Iterator &lhs, const Iterator &rhs)
+ \fn bool QCborArray::Iterator::operator<=(const Iterator &lhs, const ConstIterator &rhs)
- Returns \c true if the entry in the array pointed to by this iterator
- occurs before or is the same entry as is pointed to by the \a other
+ Returns \c true if the entry in the array pointed to by \a lhs iterator
+ occurs before or is the same entry as is pointed to by the \a rhs
iterator.
*/
/*!
- \fn bool QCborArray::Iterator::operator>(const Iterator& other) const
- \fn bool QCborArray::Iterator::operator>(const ConstIterator& other) const
+ \fn bool QCborArray::Iterator::operator>(const Iterator &lhs, const Iterator &rhs)
+ \fn bool QCborArray::Iterator::operator>(const Iterator &lhs, const ConstIterator &rhs)
- Returns \c true if the entry in the array pointed to by this iterator
- occurs after the entry pointed to by the \a other iterator.
+ Returns \c true if the entry in the array pointed to by \a lhs iterator
+ occurs after the entry pointed to by the \a rhs iterator.
*/
/*!
- \fn bool QCborArray::Iterator::operator>=(const Iterator& other) const
- \fn bool QCborArray::Iterator::operator>=(const ConstIterator& other) const
+ \fn bool QCborArray::Iterator::operator>=(const Iterator &lhs, const Iterator &rhs)
+ \fn bool QCborArray::Iterator::operator>=(const Iterator &lhs, const ConstIterator &rhs)
- Returns \c true if the entry in the array pointed to by this iterator
- occurs after or is the same entry as is pointed to by the \a other
+ Returns \c true if the entry in the array pointed to by \a lhs iterator
+ occurs after or is the same entry as is pointed to by the \a rhs
iterator.
*/
/*!
\fn QCborArray::Iterator &QCborArray::Iterator::operator++()
- The prefix ++ operator, \c{++it}, advances the iterator to the next item in
+ The prefix \c{++} operator, \c{++it}, advances the iterator to the next item in
the array and returns this iterator.
Calling this function on QCborArray::end() leads to undefined results.
@@ -895,14 +908,14 @@ void QCborArray::detach(qsizetype reserved)
\fn QCborArray::Iterator QCborArray::Iterator::operator++(int)
\overload
- The postfix ++ operator, \c{it++}, advances the iterator to the next item
+ The postfix \c{++} operator, \c{it++}, advances the iterator to the next item
in the array and returns an iterator to the previously current item.
*/
/*!
\fn QCborArray::Iterator &QCborArray::Iterator::operator--()
- The prefix -- operator, \c{--it}, makes the preceding item current and
+ The prefix \c{--} operator, \c{--it}, makes the preceding item current and
returns this iterator.
Calling this function on QCborArray::begin() leads to undefined results.
@@ -914,7 +927,7 @@ void QCborArray::detach(qsizetype reserved)
\fn QCborArray::Iterator QCborArray::Iterator::operator--(int)
\overload
- The postfix -- operator, \c{it--}, makes the preceding item current and
+ The postfix \c{--} operator, \c{it--}, makes the preceding item current and
returns an iterator to the previously current item.
*/
@@ -968,6 +981,10 @@ void QCborArray::detach(qsizetype reserved)
\brief The QCborArray::ConstIterator class provides an STL-style const iterator for QCborArray.
+ \compares strong
+ \compareswith strong QCborArray::Iterator
+ \endcompareswith
+
QCborArray::ConstIterator allows you to iterate over a QCborArray. If you
want to modify the QCborArray as you iterate over it, use
QCborArray::Iterator instead. It is generally good practice to use
@@ -1055,7 +1072,7 @@ void QCborArray::detach(qsizetype reserved)
*/
/*!
- \fn const QCborValueRef QCborArray::ConstIterator::operator[](qsizetype j)
+ \fn QCborValueRef QCborArray::ConstIterator::operator[](qsizetype j) const
Returns the item at a position \a j steps forward from the item pointed to
by this iterator.
@@ -1067,63 +1084,57 @@ void QCborArray::detach(qsizetype reserved)
*/
/*!
- \fn bool QCborArray::ConstIterator::operator==(const Iterator &other) const
- \fn bool QCborArray::ConstIterator::operator==(const ConstIterator &other) const
+ \fn bool QCborArray::ConstIterator::operator==(const ConstIterator &lhs, const ConstIterator &rhs)
- Returns \c true if \a other points to the same entry in the array as this
+ Returns \c true if \a lhs points to the same entry in the array as \a rhs
iterator; otherwise returns \c false.
\sa operator!=()
*/
/*!
- \fn bool QCborArray::ConstIterator::operator!=(const Iterator &o) const
- \fn bool QCborArray::ConstIterator::operator!=(const ConstIterator &o) const
+ \fn bool QCborArray::ConstIterator::operator!=(const ConstIterator &lhs, const ConstIterator &rhs)
- Returns \c true if \a o points to a different entry in the array than
- this iterator; otherwise returns \c false.
+ Returns \c true if \a lhs points to a different entry in the array than
+ \a rhs iterator; otherwise returns \c false.
\sa operator==()
*/
/*!
- \fn bool QCborArray::ConstIterator::operator<(const Iterator &other) const
- \fn bool QCborArray::ConstIterator::operator<(const ConstIterator &other) const
+ \fn bool QCborArray::ConstIterator::operator<(const ConstIterator &lhs, const ConstIterator &rhs)
- Returns \c true if the entry in the array pointed to by this iterator
- occurs before the entry pointed to by the \a other iterator.
+ Returns \c true if the entry in the array pointed to by \a lhs iterator
+ occurs before the entry pointed to by the \a rhs iterator.
*/
/*!
- \fn bool QCborArray::ConstIterator::operator<=(const Iterator &other) const
- \fn bool QCborArray::ConstIterator::operator<=(const ConstIterator &other) const
+ \fn bool QCborArray::ConstIterator::operator<=(const ConstIterator &lhs, const ConstIterator &rhs)
- Returns \c true if the entry in the array pointed to by this iterator
- occurs before or is the same entry as is pointed to by the \a other
+ Returns \c true if the entry in the array pointed to by \a lhs iterator
+ occurs before or is the same entry as is pointed to by the \a rhs
iterator.
*/
/*!
- \fn bool QCborArray::ConstIterator::operator>(const Iterator &other) const
- \fn bool QCborArray::ConstIterator::operator>(const ConstIterator &other) const
+ \fn bool QCborArray::ConstIterator::operator>(const ConstIterator &lhs, const ConstIterator &rhs)
- Returns \c true if the entry in the array pointed to by this iterator
- occurs after the entry pointed to by the \a other iterator.
+ Returns \c true if the entry in the array pointed to by \a lhs iterator
+ occurs after the entry pointed to by the \a rhs iterator.
*/
/*!
- \fn bool QCborArray::ConstIterator::operator>=(const Iterator &other) const
- \fn bool QCborArray::ConstIterator::operator>=(const ConstIterator &other) const
+ \fn bool QCborArray::ConstIterator::operator>=(const ConstIterator &lhs, const ConstIterator &rhs)
- Returns \c true if the entry in the array pointed to by this iterator
- occurs after or is the same entry as is pointed to by the \a other
+ Returns \c true if the entry in the array pointed to by \a lhs iterator
+ occurs after or is the same entry as is pointed to by the \a rhs
iterator.
*/
/*!
\fn QCborArray::ConstIterator &QCborArray::ConstIterator::operator++()
- The prefix ++ operator, \c{++it}, advances the iterator to the next item in
+ The prefix \c{++} operator, \c{++it}, advances the iterator to the next item in
the array and returns this iterator.
Calling this function on QCborArray::end() leads to undefined results.
@@ -1135,14 +1146,14 @@ void QCborArray::detach(qsizetype reserved)
\fn QCborArray::ConstIterator QCborArray::ConstIterator::operator++(int)
\overload
- The postfix ++ operator, \c{it++}, advances the iterator to the next item
+ The postfix \c{++} operator, \c{it++}, advances the iterator to the next item
in the array and returns an iterator to the previously current item.
*/
/*!
\fn QCborArray::ConstIterator &QCborArray::ConstIterator::operator--()
- The prefix -- operator, \c{--it}, makes the preceding item current and
+ The prefix \c{--} operator, \c{--it}, makes the preceding item current and
returns this iterator.
Calling this function on QCborArray::begin() leads to undefined results.
@@ -1154,7 +1165,7 @@ void QCborArray::detach(qsizetype reserved)
\fn QCborArray::ConstIterator QCborArray::ConstIterator::operator--(int)
\overload
- The postfix -- operator, \c{it--}, makes the preceding item current and
+ The postfix \c{--} operator, \c{it--}, makes the preceding item current and
returns an iterator to the previously current item.
*/
diff --git a/src/corelib/serialization/qcborarray.h b/src/corelib/serialization/qcborarray.h
index dd0628b3bb..481f316f33 100644
--- a/src/corelib/serialization/qcborarray.h
+++ b/src/corelib/serialization/qcborarray.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2018 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2022 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QCBORARRAY_H
#define QCBORARRAY_H
@@ -57,7 +21,7 @@ class Q_CORE_EXPORT QCborArray
public:
class ConstIterator;
class Iterator {
- mutable QCborValueRef item;
+ QCborValueRef item {};
friend class ConstIterator;
friend class QCborArray;
Iterator(QCborContainerPrivate *dd, qsizetype ii) : item(dd, ii) {}
@@ -79,21 +43,23 @@ public:
}
QCborValueRef operator*() const { return item; }
- QCborValueRef *operator->() const { return &item; }
- QCborValueRef operator[](qsizetype j) { return { item.d, item.i + j }; }
-
+ QCborValueRef *operator->() { return &item; }
+ const QCborValueConstRef *operator->() const { return &item; }
+ QCborValueRef operator[](qsizetype j) const { return { item.d, item.i + j }; }
+#if QT_CORE_REMOVED_SINCE(6, 8)
bool operator==(const Iterator &o) const { return item.d == o.item.d && item.i == o.item.i; }
- bool operator!=(const Iterator &o) const { return !(*this == o); }
+ bool operator!=(const Iterator &o) const { return !operator==(o); }
bool operator<(const Iterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i < other.item.i; }
bool operator<=(const Iterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i <= other.item.i; }
bool operator>(const Iterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i > other.item.i; }
bool operator>=(const Iterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i >= other.item.i; }
bool operator==(const ConstIterator &o) const { return item.d == o.item.d && item.i == o.item.i; }
- bool operator!=(const ConstIterator &o) const { return !(*this == o); }
+ bool operator!=(const ConstIterator &o) const { return !operator==(o); }
bool operator<(const ConstIterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i < other.item.i; }
bool operator<=(const ConstIterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i <= other.item.i; }
bool operator>(const ConstIterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i > other.item.i; }
bool operator>=(const ConstIterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i >= other.item.i; }
+#endif
Iterator &operator++() { ++item.i; return *this; }
Iterator operator++(int) { Iterator n = *this; ++item.i; return n; }
Iterator &operator--() { item.i--; return *this; }
@@ -103,10 +69,57 @@ public:
Iterator operator+(qsizetype j) const { return Iterator({ item.d, item.i + j }); }
Iterator operator-(qsizetype j) const { return Iterator({ item.d, item.i - j }); }
qsizetype operator-(Iterator j) const { return item.i - j.item.i; }
+ private:
+ // Helper functions
+ static bool comparesEqual_helper(const Iterator &lhs, const Iterator &rhs) noexcept
+ {
+ return lhs.item.d == rhs.item.d && lhs.item.i == rhs.item.i;
+ }
+
+ static bool comparesEqual_helper(const Iterator &lhs, const ConstIterator &rhs) noexcept
+ {
+ return lhs.item.d == rhs.item.d && lhs.item.i == rhs.item.i;
+ }
+
+ static Qt::strong_ordering compareThreeWay_helper(const Iterator &lhs,
+ const Iterator &rhs) noexcept
+ {
+ Q_ASSERT(lhs.item.d == rhs.item.d);
+ return Qt::compareThreeWay(lhs.item.i, rhs.item.i);
+ }
+
+ static Qt::strong_ordering compareThreeWay_helper(const Iterator &lhs,
+ const ConstIterator &rhs) noexcept
+ {
+ Q_ASSERT(lhs.item.d == rhs.item.d);
+ return Qt::compareThreeWay(lhs.item.i, rhs.item.i);
+ }
+
+ // Compare friends
+ friend bool comparesEqual(const Iterator &lhs, const Iterator &rhs) noexcept
+ {
+ return comparesEqual_helper(lhs, rhs);
+ }
+ friend Qt::strong_ordering compareThreeWay(const Iterator &lhs,
+ const Iterator &rhs) noexcept
+ {
+ return compareThreeWay_helper(lhs, rhs);
+ }
+ Q_DECLARE_STRONGLY_ORDERED(Iterator)
+ friend bool comparesEqual(const Iterator &lhs, const ConstIterator &rhs) noexcept
+ {
+ return comparesEqual_helper(lhs, rhs);
+ }
+ friend Qt::strong_ordering compareThreeWay(const Iterator &lhs,
+ const ConstIterator &rhs) noexcept
+ {
+ return compareThreeWay_helper(lhs, rhs);
+ }
+ Q_DECLARE_STRONGLY_ORDERED(Iterator, ConstIterator)
};
class ConstIterator {
- QCborValueRef item;
+ QCborValueConstRef item;
friend class Iterator;
friend class QCborArray;
ConstIterator(QCborContainerPrivate *dd, qsizetype ii) : item(dd, ii) {}
@@ -127,22 +140,23 @@ public:
return *this;
}
- const QCborValueRef operator*() const { return item; }
- const QCborValueRef *operator->() const { return &item; }
- const QCborValueRef operator[](qsizetype j) { return { item.d, item.i + j }; }
-
+ QCborValueConstRef operator*() const { return item; }
+ const QCborValueConstRef *operator->() const { return &item; }
+ QCborValueConstRef operator[](qsizetype j) const { return QCborValueRef{ item.d, item.i + j }; }
+#if QT_CORE_REMOVED_SINCE(6, 8)
bool operator==(const Iterator &o) const { return item.d == o.item.d && item.i == o.item.i; }
- bool operator!=(const Iterator &o) const { return !(*this == o); }
+ bool operator!=(const Iterator &o) const { return !operator==(o); }
bool operator<(const Iterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i < other.item.i; }
bool operator<=(const Iterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i <= other.item.i; }
bool operator>(const Iterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i > other.item.i; }
bool operator>=(const Iterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i >= other.item.i; }
bool operator==(const ConstIterator &o) const { return item.d == o.item.d && item.i == o.item.i; }
- bool operator!=(const ConstIterator &o) const { return !(*this == o); }
+ bool operator!=(const ConstIterator &o) const { return !operator==(o); }
bool operator<(const ConstIterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i < other.item.i; }
bool operator<=(const ConstIterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i <= other.item.i; }
bool operator>(const ConstIterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i > other.item.i; }
bool operator>=(const ConstIterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i >= other.item.i; }
+#endif
ConstIterator &operator++() { ++item.i; return *this; }
ConstIterator operator++(int) { ConstIterator n = *this; ++item.i; return n; }
ConstIterator &operator--() { item.i--; return *this; }
@@ -152,6 +166,31 @@ public:
ConstIterator operator+(qsizetype j) const { return ConstIterator({ item.d, item.i + j }); }
ConstIterator operator-(qsizetype j) const { return ConstIterator({ item.d, item.i - j }); }
qsizetype operator-(ConstIterator j) const { return item.i - j.item.i; }
+ private:
+ // Helper functions
+ static bool comparesEqual_helper(const ConstIterator &lhs,
+ const ConstIterator &rhs) noexcept
+ {
+ return lhs.item.d == rhs.item.d && lhs.item.i == rhs.item.i;
+ }
+ static Qt::strong_ordering compareThreeWay_helper(const ConstIterator &lhs,
+ const ConstIterator &rhs) noexcept
+ {
+ Q_ASSERT(lhs.item.d == rhs.item.d);
+ return Qt::compareThreeWay(lhs.item.i, rhs.item.i);
+ }
+
+ // Compare friends
+ friend bool comparesEqual(const ConstIterator &lhs, const ConstIterator &rhs) noexcept
+ {
+ return comparesEqual_helper(lhs, rhs);
+ }
+ friend Qt::strong_ordering compareThreeWay(const ConstIterator &lhs,
+ const ConstIterator &rhs) noexcept
+ {
+ return compareThreeWay_helper(lhs, rhs);
+ }
+ Q_DECLARE_STRONGLY_ORDERED(ConstIterator)
};
typedef qsizetype size_type;
@@ -176,7 +215,7 @@ public:
void swap(QCborArray &other) noexcept
{
- qSwap(d, other.d);
+ d.swap(other.d);
}
QCborValue toCborValue() const { return *this; }
@@ -216,19 +255,11 @@ public:
bool contains(const QCborValue &value) const;
int compare(const QCborArray &other) const noexcept Q_DECL_PURE_FUNCTION;
-#if 0 && __has_include(<compare>)
- std::strong_ordering operator<=>(const QCborArray &other) const
- {
- int c = compare(other);
- if (c > 0) return std::strong_ordering::greater;
- if (c == 0) return std::strong_ordering::equivalent;
- return std::strong_ordering::less;
- }
-#else
+#if QT_CORE_REMOVED_SINCE(6, 8)
bool operator==(const QCborArray &other) const noexcept
{ return compare(other) == 0; }
bool operator!=(const QCborArray &other) const noexcept
- { return !(*this == other); }
+ { return !operator==(other); }
bool operator<(const QCborArray &other) const
{ return compare(other) < 0; }
#endif
@@ -272,6 +303,48 @@ public:
QJsonArray toJsonArray() const;
private:
+ friend Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool
+ comparesEqual(const QCborArray &lhs, const QCborArray &rhs) noexcept;
+ friend Qt::strong_ordering compareThreeWay(const QCborArray &lhs,
+ const QCborArray &rhs) noexcept
+ {
+ int c = lhs.compare(rhs);
+ return Qt::compareThreeWay(c, 0);
+ }
+ Q_DECLARE_STRONGLY_ORDERED(QCborArray)
+
+ static Q_DECL_PURE_FUNCTION bool
+ comparesEqual_helper(const QCborArray &lhs, const QCborValue &rhs) noexcept;
+ static Q_DECL_PURE_FUNCTION Qt::strong_ordering
+ compareThreeWay_helper(const QCborArray &lhs, const QCborValue &rhs) noexcept;
+ friend bool comparesEqual(const QCborArray &lhs,
+ const QCborValue &rhs) noexcept
+ {
+ return comparesEqual_helper(lhs, rhs);
+ }
+ friend Qt::strong_ordering compareThreeWay(const QCborArray &lhs,
+ const QCborValue &rhs) noexcept
+ {
+ return compareThreeWay_helper(lhs, rhs);
+ }
+ Q_DECLARE_STRONGLY_ORDERED(QCborArray, QCborValue)
+
+ static Q_DECL_PURE_FUNCTION bool
+ comparesEqual_helper(const QCborArray &lhs, QCborValueConstRef rhs) noexcept;
+ static Q_DECL_PURE_FUNCTION Qt::strong_ordering
+ compareThreeWay_helper(const QCborArray &lhs, QCborValueConstRef rhs) noexcept;
+ friend bool comparesEqual(const QCborArray &lhs,
+ const QCborValueConstRef &rhs) noexcept
+ {
+ return comparesEqual_helper(lhs, rhs);
+ }
+ friend Qt::strong_ordering compareThreeWay(const QCborArray &lhs,
+ const QCborValueConstRef &rhs) noexcept
+ {
+ return compareThreeWay_helper(lhs, rhs);
+ }
+ Q_DECLARE_STRONGLY_ORDERED(QCborArray, QCborValueConstRef)
+
void detach(qsizetype reserve = 0);
friend QCborValue;
@@ -288,6 +361,7 @@ inline QCborValue::QCborValue(QCborArray &&a)
{
}
+#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0) && !defined(QT_BOOTSTRAPPED)
inline QCborArray QCborValueRef::toArray() const
{
return concrete().toArray();
@@ -297,6 +371,17 @@ inline QCborArray QCborValueRef::toArray(const QCborArray &a) const
{
return concrete().toArray(a);
}
+#endif
+
+inline QCborArray QCborValueConstRef::toArray() const
+{
+ return concrete().toArray();
+}
+
+inline QCborArray QCborValueConstRef::toArray(const QCborArray &a) const
+{
+ return concrete().toArray(a);
+}
Q_CORE_EXPORT size_t qHash(const QCborArray &array, size_t seed = 0);
diff --git a/src/corelib/serialization/qcborcommon.cpp b/src/corelib/serialization/qcborcommon.cpp
index 0ebefe38d7..b3d4f70aa2 100644
--- a/src/corelib/serialization/qcborcommon.cpp
+++ b/src/corelib/serialization/qcborcommon.cpp
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2018 Intel Corporation.
-** Copyright (C) 2019 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2018 Intel Corporation.
+// Copyright (C) 2019 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#define CBOR_NO_ENCODER_API
#define CBOR_NO_PARSER_API
@@ -46,11 +10,14 @@
QT_BEGIN_NAMESPACE
+QT_IMPL_METATYPE_EXTERN(QCborTag)
+
#include <cborerrorstrings.c>
/*!
\headerfile <QtCborCommon>
-
+ \inmodule QtCore
+ \ingroup qtserialization
\brief The <QtCborCommon> header contains definitions common to both the
streaming classes (QCborStreamReader and QCborStreamWriter) and to
QCborValue.
@@ -212,7 +179,9 @@ QDataStream &operator>>(QDataStream &ds, QCborSimpleType &st)
\brief The QCborError class holds the error condition found while parsing or
validating a CBOR stream.
- \sa QCborStreamReader, QCborValue, QCborParserError
+ \sa QCborStreamReader, QCborValue, QCborParserError,
+ {Parsing and displaying CBOR data}, {Serialization Converter},
+ {Saving and Loading a Game}
*/
/*!
@@ -231,7 +200,7 @@ QDataStream &operator>>(QDataStream &ds, QCborSimpleType &st)
\value UnexpectedBreak The CBOR stream contains a Break where it is not allowed (data is
corrupt and the error is not recoverable).
\value UnknownType The CBOR stream contains an unknown/unparsable Type (data is corrupt
- and the and the error is not recoverable).
+ and the error is not recoverable).
\value IllegalType The CBOR stream contains a known type in a position it is not allowed
to exist (data is corrupt and the error is not recoverable).
\value IllegalNumber The CBOR stream appears to be encoding a number larger than 64-bit
diff --git a/src/corelib/serialization/qcborcommon.h b/src/corelib/serialization/qcborcommon.h
index 2ea0cec44c..bd7a93dfe7 100644
--- a/src/corelib/serialization/qcborcommon.h
+++ b/src/corelib/serialization/qcborcommon.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2018 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2018 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QCBORCOMMON_H
#define QCBORCOMMON_H
@@ -151,7 +115,7 @@ enum class QCborNegativeInteger : quint64 {};
QT_END_NAMESPACE
-Q_DECLARE_METATYPE(QCborTag)
+QT_DECL_METATYPE_EXTERN(QCborTag, Q_CORE_EXPORT)
// To avoid changing namespace we need to reinstate defines, even though our .cpp
// will then have to remove them again.
diff --git a/src/corelib/serialization/qcborcommon_p.h b/src/corelib/serialization/qcborcommon_p.h
index 9b7f4b7099..69e80cb9d6 100644
--- a/src/corelib/serialization/qcborcommon_p.h
+++ b/src/corelib/serialization/qcborcommon_p.h
@@ -1,47 +1,12 @@
-/****************************************************************************
-**
-** Copyright (C) 2018 Intel Corporation.
-** Copyright (C) 2019 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2018 Intel Corporation.
+// Copyright (C) 2019 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QCBORCOMMON_P_H
#define QCBORCOMMON_P_H
#include "qcborcommon.h"
+#include "private/qglobal_p.h"
//
// W A R N I N G
diff --git a/src/corelib/serialization/qcbordiagnostic.cpp b/src/corelib/serialization/qcbordiagnostic.cpp
index b7d8f1ed6b..e89afc4827 100644
--- a/src/corelib/serialization/qcbordiagnostic.cpp
+++ b/src/corelib/serialization/qcbordiagnostic.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2018 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2018 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qcborvalue.h"
#include "qcborvalue_p.h"
@@ -49,6 +13,8 @@
QT_BEGIN_NAMESPACE
+using namespace Qt::StringLiterals;
+
namespace {
class DiagnosticNotation
{
@@ -75,7 +41,7 @@ private:
++dn->nestingLevel;
static const char indent[IndentationWidth + 1] = " ";
if (dn->opts & QCborValue::LineWrapped)
- dn->separator += QLatin1String(indent, IndentationWidth);
+ dn->separator += QLatin1StringView(indent, IndentationWidth);
}
~Nest()
{
@@ -86,7 +52,7 @@ private:
};
DiagnosticNotation(QCborValue::DiagnosticNotationOptions opts_)
- : separator(QLatin1String(opts_ & QCborValue::LineWrapped ? "\n" : "")), opts(opts_)
+ : separator(opts_ & QCborValue::LineWrapped ? "\n"_L1 : ""_L1), opts(opts_)
{
byteArrayFormatStack.push(int(QCborKnownTags::ExpectedBase16));
}
@@ -109,11 +75,11 @@ static QString makeFpString(double d)
} else if (convertDoubleTo(d, &v)) {
s = QString::fromLatin1("%1.0").arg(v);
if (d < 0)
- s.prepend(QLatin1Char('-'));
+ s.prepend(u'-');
} else {
s = QString::number(d, 'g', QLocale::FloatingPointShortest);
if (!s.contains(u'.') && !s.contains(u'e'))
- s += QLatin1Char('.');
+ s += u'.';
}
return s;
}
@@ -131,7 +97,7 @@ static bool isByteArrayEncodingTag(QCborTag tag)
void DiagnosticNotation::appendString(const QString &s)
{
- result += QLatin1Char('"');
+ result += u'"';
const QChar *begin = s.begin();
const QChar *end = s.end();
@@ -161,7 +127,7 @@ void DiagnosticNotation::appendString(const QString &s)
};
int buflen = 2;
QChar buf[10];
- buf[0] = QLatin1Char('\\');
+ buf[0] = u'\\';
buf[1] = QChar::Null;
char16_t uc = ptr->unicode();
@@ -203,18 +169,18 @@ void DiagnosticNotation::appendString(const QString &s)
begin = ptr + 1;
}
- result += QLatin1Char('"');
+ result += u'"';
}
void DiagnosticNotation::appendArray(const QCborArray &a)
{
- result += QLatin1Char('[');
+ result += u'[';
// length 2 (including the space) when not line wrapping
- QLatin1String commaValue(", ", opts & QCborValue::LineWrapped ? 1 : 2);
+ QLatin1StringView commaValue(", ", opts & QCborValue::LineWrapped ? 1 : 2);
{
Nest n(this);
- QLatin1String comma;
+ QLatin1StringView comma;
for (auto v : a) {
result += comma + separator;
comma = commaValue;
@@ -222,28 +188,28 @@ void DiagnosticNotation::appendArray(const QCborArray &a)
}
}
- result += separator + QLatin1Char(']');
+ result += separator + u']';
}
void DiagnosticNotation::appendMap(const QCborMap &m)
{
- result += QLatin1Char('{');
+ result += u'{';
// length 2 (including the space) when not line wrapping
- QLatin1String commaValue(", ", opts & QCborValue::LineWrapped ? 1 : 2);
+ QLatin1StringView commaValue(", ", opts & QCborValue::LineWrapped ? 1 : 2);
{
Nest n(this);
- QLatin1String comma;
+ QLatin1StringView comma;
for (auto v : m) {
result += comma + separator;
comma = commaValue;
appendValue(v.first);
- result += QLatin1String(": ");
+ result += ": "_L1;
appendValue(v.second);
}
}
- result += separator + QLatin1Char('}');
+ result += separator + u'}';
};
void DiagnosticNotation::appendValue(const QCborValue &v)
@@ -276,16 +242,16 @@ void DiagnosticNotation::appendValue(const QCborValue &v)
case QCborValue::Map:
return appendMap(v.toMap());
case QCborValue::False:
- result += QLatin1String("false");
+ result += "false"_L1;
return;
case QCborValue::True:
- result += QLatin1String("true");
+ result += "true"_L1;
return;
case QCborValue::Null:
- result += QLatin1String("null");
+ result += "null"_L1;
return;
case QCborValue::Undefined:
- result += QLatin1String("undefined");
+ result += "undefined"_L1;
return;
case QCborValue::Double:
result += makeFpString(v.toDouble());
@@ -305,9 +271,9 @@ void DiagnosticNotation::appendValue(const QCborValue &v)
bool byteArrayFormat = opts & QCborValue::ExtendedFormat && isByteArrayEncodingTag(v.tag());
if (byteArrayFormat)
byteArrayFormatStack.push(int(v.tag()));
- result += QString::number(quint64(v.tag())) + QLatin1Char('(');
+ result += QString::number(quint64(v.tag())) + u'(';
appendValue(v.taggedValue());
- result += QLatin1Char(')');
+ result += u')';
if (byteArrayFormat)
byteArrayFormatStack.pop();
} else {
diff --git a/src/corelib/serialization/qcbormap.cpp b/src/corelib/serialization/qcbormap.cpp
index b178018b7c..038e0d61ce 100644
--- a/src/corelib/serialization/qcbormap.cpp
+++ b/src/corelib/serialization/qcbormap.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2018 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2018 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qcbormap.h"
#include "qcborvalue_p.h"
@@ -48,11 +12,16 @@ using namespace QtCbor;
\class QCborMap
\inmodule QtCore
\ingroup cbor
+ \ingroup qtserialization
\reentrant
\since 5.12
\brief The QCborMap class is used to hold an associative container representable in CBOR.
+ \compares strong
+ \compareswith strong QCborValue QCborValueConstRef
+ \endcompareswith
+
This class can be used to hold an associative container in CBOR, a map
between a key and a value type. CBOR is the Concise Binary Object
Representation, a very compact form of binary data encoding that is a
@@ -82,7 +51,9 @@ using namespace QtCbor;
stringified using a one-way method that the conversion back to QCborMap
will not undo.
- \sa QCborArray, QCborValue, QJsonDocument, QVariantMap
+ \sa QCborArray, QCborValue, QJsonDocument, QVariantMap,
+ {Parsing and displaying CBOR data}, {Serialization Converter},
+ {Saving and Loading a Game}
*/
/*!
@@ -328,7 +299,7 @@ QList<QCborValue> QCborMap::keys() const
duplicate keys is usually an indication of a problem in the sender.
\sa operator[](qint64), find(qint64), constFind(qint64), remove(qint64), contains(qint64)
- value(QLatin1String), value(const QString &), value(const QCborValue &)
+ value(QLatin1StringView), value(const QString &), value(const QCborValue &)
*/
/*!
@@ -350,7 +321,8 @@ QList<QCborValue> QCborMap::keys() const
is usually an indication of a problem in the sender.
\sa value(qint64), find(qint64), constFind(qint64), remove(qint64), contains(qint64)
- operator[](QLatin1String), operator[](const QString &), operator[](const QCborOperator[] &)
+ operator[](QLatin1StringView), operator[](const QString &),
+ operator[](const QCborOperator[] &)
*/
/*!
@@ -366,7 +338,7 @@ QList<QCborValue> QCborMap::keys() const
is usually an indication of a problem in the sender.
\sa value(qint64), operator[](qint64), find(qint64), contains(qint64),
- take(QLatin1String), take(const QString &), take(const QCborValue &), insert()
+ take(QLatin1StringView), take(const QString &), take(const QCborValue &), insert()
*/
/*!
@@ -382,7 +354,7 @@ QList<QCborValue> QCborMap::keys() const
is usually an indication of a problem in the sender.
\sa value(qint64), operator[](qint64), find(qint64), contains(qint64)
- remove(QLatin1String), remove(const QString &), remove(const QCborValue &)
+ remove(QLatin1StringView), remove(const QString &), remove(const QCborValue &)
*/
/*!
@@ -393,7 +365,7 @@ QList<QCborValue> QCborMap::keys() const
are simpler to encode and decode.
\sa value(qint64), operator[](qint64), find(qint64), remove(qint64),
- contains(QLatin1String), remove(const QString &), remove(const QCborValue &)
+ contains(QLatin1StringView), remove(const QString &), remove(const QCborValue &)
*/
/*!
@@ -418,22 +390,15 @@ QList<QCborValue> QCborMap::keys() const
is usually an indication of a problem in the sender.
\sa value(qint64), find(qint64), contains(qint64), remove(qint64),
- operator[](QLatin1String), operator[](const QString &), operator[](const QCborValue &)
+ operator[](QLatin1StringView), operator[](const QString &), operator[](const QCborValue &)
*/
QCborValueRef QCborMap::operator[](qint64 key)
{
- auto it = find(key);
- if (it == constEnd()) {
- // insert element
- detach(it.item.i + 2);
- d->append(key);
- d->append(Undefined{});
- }
- return { d.data(), it.item.i };
+ return QCborContainerPrivate::findOrAddMapKey(*this, key);
}
/*!
- \fn QCborValue QCborMap::value(QLatin1String key) const
+ \fn QCborValue QCborMap::value(QLatin1StringView key) const
\overload
Returns the QCborValue element in this map that corresponds to key \a key,
@@ -450,13 +415,13 @@ QCborValueRef QCborMap::operator[](qint64 key)
stream with them. They are usually not permitted and having duplicate keys
is usually an indication of a problem in the sender.
- \sa operator[](QLatin1String), find(QLatin1String), constFind(QLatin1String),
- remove(QLatin1String), contains(QLatin1String)
+ \sa operator[](QLatin1StringView), find(QLatin1StringView), constFind(QLatin1StringView),
+ remove(QLatin1StringView), contains(QLatin1StringView)
value(qint64), value(const QString &), value(const QCborValue &)
*/
/*!
- \fn QCborValue QCborMap::operator[](QLatin1String key) const
+ \fn QCborValue QCborMap::operator[](QLatin1StringView key) const
\overload
Returns the QCborValue element in this map that corresponds to key \a key,
@@ -473,13 +438,13 @@ QCborValueRef QCborMap::operator[](qint64 key)
stream with them. They are usually not permitted and having duplicate keys
is usually an indication of a problem in the sender.
- \sa value(QLatin1String), find(QLatin1String), constFind(QLatin1String),
- remove(QLatin1String), contains(QLatin1String)
+ \sa value(QLatin1StringView), find(QLatin1StringView), constFind(QLatin1StringView),
+ remove(QLatin1StringView), contains(QLatin1StringView)
operator[](qint64), operator[](const QString &), operator[](const QCborOperator[] &)
*/
/*!
- \fn QCborValue QCborMap::take(QLatin1String key)
+ \fn QCborValue QCborMap::take(QLatin1StringView key)
Removes the key \a key and the corresponding value from the map and returns
the value, if it is found. If the map contains no such key, this function does nothing.
@@ -490,12 +455,13 @@ QCborValueRef QCborMap::operator[](qint64 key)
stream with them. They are usually not permitted and having duplicate keys
is usually an indication of a problem in the sender.
- \sa value(QLatin1String), operator[](QLatin1String), find(QLatin1String), contains(QLatin1String),
- take(qint64), take(const QString &), take(const QCborValue &), insert()
+ \sa value(QLatin1StringView), operator[](QLatin1StringView), find(QLatin1StringView),
+ contains(QLatin1StringView), take(qint64), take(const QString &),
+ take(const QCborValue &), insert()
*/
/*!
- \fn void QCborMap::remove(QLatin1String key)
+ \fn void QCborMap::remove(QLatin1StringView key)
\overload
Removes the key \a key and the corresponding value from the map, if it is
@@ -507,19 +473,21 @@ QCborValueRef QCborMap::operator[](qint64 key)
stream with them. They are usually not permitted and having duplicate keys
is usually an indication of a problem in the sender.
- \sa value(QLatin1String), operator[](QLatin1String), find(QLatin1String), contains(QLatin1String)
- remove(qint64), remove(const QString &), remove(const QCborValue &)
+ \sa value(QLatin1StringView), operator[](QLatin1StringView), find(QLatin1StringView),
+ contains(QLatin1StringView), remove(qint64), remove(const QString &),
+ remove(const QCborValue &)
*/
/*!
- \fn bool QCborMap::contains(QLatin1String key) const
+ \fn bool QCborMap::contains(QLatin1StringView key) const
\overload
Returns true if this map contains a key-value pair identified by key \a
key.
- \sa value(QLatin1String), operator[](QLatin1String), find(QLatin1String), remove(QLatin1String),
- contains(qint64), remove(const QString &), remove(const QCborValue &)
+ \sa value(QLatin1StringView), operator[](QLatin1StringView), find(QLatin1StringView),
+ remove(QLatin1StringView), contains(qint64), remove(const QString &),
+ remove(const QCborValue &)
*/
/*!
@@ -544,19 +512,13 @@ QCborValueRef QCborMap::operator[](qint64 key)
stream with them. They are usually not permitted and having duplicate keys
is usually an indication of a problem in the sender.
- \sa value(QLatin1String), find(QLatin1String), contains(QLatin1String), remove(QLatin1String),
- operator[](qint64), operator[](const QString &), operator[](const QCborValue &)
+ \sa value(QLatin1StringView), find(QLatin1StringView), contains(QLatin1StringView),
+ remove(QLatin1StringView), operator[](qint64), operator[](const QString &),
+ operator[](const QCborValue &)
*/
-QCborValueRef QCborMap::operator[](QLatin1String key)
+QCborValueRef QCborMap::operator[](QLatin1StringView key)
{
- auto it = find(key);
- if (it == constEnd()) {
- // insert element
- detach(it.item.i + 2);
- d->append(key);
- d->append(Undefined{});
- }
- return { d.data(), it.item.i };
+ return QCborContainerPrivate::findOrAddMapKey(*this, key);
}
/*!
@@ -579,7 +541,7 @@ QCborValueRef QCborMap::operator[](QLatin1String key)
\sa operator[](const QString &), find(const QString &), constFind(const QString &),
remove(const QString &), contains(const QString &)
- value(qint64), value(QLatin1String), value(const QCborValue &)
+ value(qint64), value(QLatin1StringView), value(const QCborValue &)
*/
/*!
@@ -602,7 +564,7 @@ QCborValueRef QCborMap::operator[](QLatin1String key)
\sa value(const QString &), find(const QString &), constFind(const QString &),
remove(const QString &), contains(const QString &)
- operator[](qint64), operator[](QLatin1String), operator[](const QCborOperator[] &)
+ operator[](qint64), operator[](QLatin1StringView), operator[](const QCborOperator[] &)
*/
/*!
@@ -617,8 +579,9 @@ QCborValueRef QCborMap::operator[](QLatin1String key)
stream with them. They are usually not permitted and having duplicate keys
is usually an indication of a problem in the sender.
- \sa value(const QString &), operator[](const QString &), find(const QString &), contains(const QString &),
- take(QLatin1String), take(qint64), take(const QCborValue &), insert()
+ \sa value(const QString &), operator[](const QString &), find(const QString &),
+ contains(const QString &), take(QLatin1StringView), take(qint64),
+ take(const QCborValue &), insert()
*/
/*!
@@ -636,7 +599,7 @@ QCborValueRef QCborMap::operator[](QLatin1String key)
\sa value(const QString &), operator[](const QString &), find(const QString &),
contains(const QString &)
- remove(qint64), remove(QLatin1String), remove(const QCborValue &)
+ remove(qint64), remove(QLatin1StringView), remove(const QCborValue &)
*/
/*!
@@ -648,7 +611,7 @@ QCborValueRef QCborMap::operator[](QLatin1String key)
\sa value(const QString &), operator[](const QString &), find(const QString &),
remove(const QString &),
- contains(qint64), remove(QLatin1String), remove(const QCborValue &)
+ contains(qint64), remove(QLatin1StringView), remove(const QCborValue &)
*/
/*!
@@ -673,19 +636,13 @@ QCborValueRef QCborMap::operator[](QLatin1String key)
stream with them. They are usually not permitted and having duplicate keys
is usually an indication of a problem in the sender.
- \sa value(const QString &), find(const QString &), contains(const QString &), remove(const QString &),
- operator[](qint64), operator[](QLatin1String), operator[](const QCborValue &)
+ \sa value(const QString &), find(const QString &), contains(const QString &),
+ remove(const QString &), operator[](qint64), operator[](QLatin1StringView),
+ operator[](const QCborValue &)
*/
QCborValueRef QCborMap::operator[](const QString & key)
{
- auto it = find(key);
- if (it == constEnd()) {
- // insert element
- detach(it.item.i + 2);
- d->append(key);
- d->append(Undefined{});
- }
- return { d.data(), it.item.i };
+ return QCborContainerPrivate::findOrAddMapKey(*this, qToStringViewIgnoringNull(key));
}
/*!
@@ -707,7 +664,7 @@ QCborValueRef QCborMap::operator[](const QString & key)
\sa operator[](const QCborValue &), find(const QCborValue &), constFind(const QCborValue &),
remove(const QCborValue &), contains(const QCborValue &)
- value(qint64), value(QLatin1String), value(const QString &)
+ value(qint64), value(QLatin1StringView), value(const QString &)
*/
/*!
@@ -729,7 +686,7 @@ QCborValueRef QCborMap::operator[](const QString & key)
\sa value(const QCborValue &), find(const QCborValue &), constFind(const QCborValue &),
remove(const QCborValue &), contains(const QCborValue &)
- operator[](qint64), operator[](QLatin1String), operator[](const QCborOperator[] &)
+ operator[](qint64), operator[](QLatin1StringView), operator[](const QCborOperator[] &)
*/
/*!
@@ -744,8 +701,9 @@ QCborValueRef QCborMap::operator[](const QString & key)
stream with them. They are usually not permitted and having duplicate keys
is usually an indication of a problem in the sender.
- \sa value(const QCborValue &), operator[](const QCborValue &), find(const QCborValue &), contains(const QCborValue &),
- take(QLatin1String), take(const QString &), take(qint64), insert()
+ \sa value(const QCborValue &), operator[](const QCborValue &), find(const QCborValue &),
+ contains(const QCborValue &), take(QLatin1StringView), take(const QString &),
+ take(qint64), insert()
*/
/*!
@@ -762,7 +720,7 @@ QCborValueRef QCborMap::operator[](const QString & key)
\sa value(const QCborValue &), operator[](const QCborValue &), find(const QCborValue &),
contains(const QCborValue &)
- remove(qint64), remove(QLatin1String), remove(const QString &)
+ remove(qint64), remove(QLatin1StringView), remove(const QString &)
*/
/*!
@@ -773,7 +731,7 @@ QCborValueRef QCborMap::operator[](const QString & key)
\sa value(const QCborValue &), operator[](const QCborValue &), find(const QCborValue &),
remove(const QCborValue &),
- contains(qint64), remove(QLatin1String), remove(const QString &)
+ contains(qint64), remove(QLatin1StringView), remove(const QString &)
*/
/*!
@@ -798,19 +756,21 @@ QCborValueRef QCborMap::operator[](const QString & key)
stream with them. They are usually not permitted and having duplicate keys
is usually an indication of a problem in the sender.
- \sa value(const QCborValue &), find(const QCborValue &), contains(const QCborValue &), remove(const QCborValue &),
- operator[](qint64), operator[](QLatin1String), operator[](const QString &)
+ \sa value(const QCborValue &), find(const QCborValue &), contains(const QCborValue &),
+ remove(const QCborValue &), operator[](qint64), operator[](QLatin1StringView),
+ operator[](const QString &)
*/
QCborValueRef QCborMap::operator[](const QCborValue &key)
{
- auto it = find(key);
- if (it == constEnd()) {
- // insert element
- detach(it.item.i + 2);
- d->append(key);
- d->append(Undefined{});
- }
- return { d.data(), it.item.i };
+ return QCborContainerPrivate::findOrAddMapKey<const QCborValue &>(*this, key);
+}
+
+template <typename KeyType> inline QCborValueRef
+QCborContainerPrivate::findOrAddMapKey(QCborMap &map, KeyType key)
+{
+ QCborValueRef result = findOrAddMapKey<KeyType>(map.d.data(), key);
+ map.d = result.d;
+ return result;
}
/*!
@@ -829,8 +789,8 @@ QCborValueRef QCborMap::operator[](const QCborValue &key)
stream with them. They are usually not permitted and having duplicate keys
is usually an indication of a problem in the sender.
- \sa value(qint64), operator[](qint64), constFind(qint64), remove(qint64), contains(qint64)
- value(QLatin1String), value(const QString &), value(const QCborValue &)
+ \sa value(qint64), operator[](qint64), constFind(qint64), remove(qint64), contains(qint64),
+ value(QLatin1StringView), value(const QString &), value(const QCborValue &)
*/
QCborMap::iterator QCborMap::find(qint64 key)
{
@@ -840,8 +800,8 @@ QCborMap::iterator QCborMap::find(qint64 key)
}
/*!
- \fn QCborMap::iterator QCborMap::find(QLatin1String key)
- \fn QCborMap::const_iterator QCborMap::find(QLatin1String key) const
+ \fn QCborMap::iterator QCborMap::find(QLatin1StringView key)
+ \fn QCborMap::const_iterator QCborMap::find(QLatin1StringView key) const
\overload
Returns a map iterator to the key-value pair whose key is \a key, if the
@@ -853,11 +813,11 @@ QCborMap::iterator QCborMap::find(qint64 key)
stream with them. They are usually not permitted and having duplicate keys
is usually an indication of a problem in the sender.
- \sa value(QLatin1String), operator[](QLatin1String), constFind(QLatin1String),
- remove(QLatin1String), contains(QLatin1String)
+ \sa value(QLatin1StringView), operator[](QLatin1StringView), constFind(QLatin1StringView),
+ remove(QLatin1StringView), contains(QLatin1StringView),
value(qint64), value(const QString &), value(const QCborValue &)
*/
-QCborMap::iterator QCborMap::find(QLatin1String key)
+QCborMap::iterator QCborMap::find(QLatin1StringView key)
{
detach();
auto it = constFind(key);
@@ -879,8 +839,8 @@ QCborMap::iterator QCborMap::find(QLatin1String key)
is usually an indication of a problem in the sender.
\sa value(const QString &), operator[](const QString &), constFind(const QString &),
- remove(const QString &), contains(const QString &)
- value(qint64), value(QLatin1String), value(const QCborValue &)
+ remove(const QString &), contains(const QString &),
+ value(qint64), value(QLatin1StringView), value(const QCborValue &)
*/
QCborMap::iterator QCborMap::find(const QString & key)
{
@@ -904,8 +864,8 @@ QCborMap::iterator QCborMap::find(const QString & key)
is usually an indication of a problem in the sender.
\sa value(const QCborValue &), operator[](const QCborValue &), constFind(const QCborValue &),
- remove(const QCborValue &), contains(const QCborValue &)
- value(qint64), value(QLatin1String), value(const QString &)
+ remove(const QCborValue &), contains(const QCborValue &),
+ value(qint64), value(QLatin1StringView), value(const QString &)
*/
QCborMap::iterator QCborMap::find(const QCborValue &key)
{
@@ -927,17 +887,12 @@ QCborMap::iterator QCborMap::find(const QCborValue &key)
stream with them. They are usually not permitted and having duplicate keys
is usually an indication of a problem in the sender.
- \sa value(qint64), operator[](qint64), find(qint64), remove(qint64), contains(qint64)
- value(QLatin1String), value(const QString &), value(const QCborValue &)
+ \sa value(qint64), operator[](qint64), find(qint64), remove(qint64), contains(qint64),
+ value(QLatin1StringView), value(const QString &), value(const QCborValue &)
*/
QCborMap::const_iterator QCborMap::constFind(qint64 key) const
{
- for (qsizetype i = 0; i < 2 * size(); i += 2) {
- const auto &e = d->elements.at(i);
- if (e.type == QCborValue::Integer && e.value == key)
- return { d.data(), i + 1 };
- }
- return constEnd();
+ return d ? d->findCborMapKey(key) : constEnd();
}
/*!
@@ -952,17 +907,13 @@ QCborMap::const_iterator QCborMap::constFind(qint64 key) const
stream with them. They are usually not permitted and having duplicate keys
is usually an indication of a problem in the sender.
- \sa value(QLatin1String), operator[](QLatin1String), find(QLatin1String),
- remove(QLatin1String), contains(QLatin1String)
+ \sa value(QLatin1StringView), operator[](QLatin1StringView), find(QLatin1StringView),
+ remove(QLatin1StringView), contains(QLatin1StringView),
value(qint64), value(const QString &), value(const QCborValue &)
*/
-QCborMap::const_iterator QCborMap::constFind(QLatin1String key) const
+QCborMap::const_iterator QCborMap::constFind(QLatin1StringView key) const
{
- for (qsizetype i = 0; i < 2 * size(); i += 2) {
- if (d->stringEqualsElement(i, key))
- return { d.data(), i + 1 };
- }
- return constEnd();
+ return d ? d->findCborMapKey(key) : constEnd();
}
/*!
@@ -978,16 +929,12 @@ QCborMap::const_iterator QCborMap::constFind(QLatin1String key) const
is usually an indication of a problem in the sender.
\sa value(const QString &), operator[](const QString &), find(const QString &),
- remove(const QString &), contains(const QString &)
- value(qint64), value(QLatin1String), value(const QCborValue &)
+ remove(const QString &), contains(const QString &),
+ value(qint64), value(QLatin1StringView), value(const QCborValue &)
*/
-QCborMap::const_iterator QCborMap::constFind(const QString & key) const
+QCborMap::const_iterator QCborMap::constFind(const QString &key) const
{
- for (qsizetype i = 0; i < 2 * size(); i += 2) {
- if (d->stringEqualsElement(i, key))
- return { d.data(), i + 1 };
- }
- return constEnd();
+ return d ? d->findCborMapKey(qToStringViewIgnoringNull(key)) : constEnd();
}
/*!
@@ -1004,16 +951,11 @@ QCborMap::const_iterator QCborMap::constFind(const QString & key) const
\sa value(const QCborValue &), operator[](const QCborValue &), find(const QCborValue &),
remove(const QCborValue &), contains(const QCborValue &),
- value(qint64), value(QLatin1String), value(const QString &)
+ value(qint64), value(QLatin1StringView), value(const QString &)
*/
QCborMap::const_iterator QCborMap::constFind(const QCborValue &key) const
{
- for (qsizetype i = 0; i < 2 * size(); i += 2) {
- int cmp = d->compareElement(i, key);
- if (cmp == 0)
- return { d.data(), i + 1 };
- }
- return constEnd();
+ return d ? d->findCborMapKey<const QCborValue &>(key) : constEnd();
}
/*!
@@ -1031,7 +973,7 @@ QCborMap::const_iterator QCborMap::constFind(const QCborValue &key) const
*/
/*!
- \fn QCborMap::iterator QCborMap::insert(QLatin1String key, const QCborValue &value)
+ \fn QCborMap::iterator QCborMap::insert(QLatin1StringView key, const QCborValue &value)
\overload
Inserts the key \a key and value \a value into this map and returns a map
@@ -1040,8 +982,8 @@ QCborMap::const_iterator QCborMap::constFind(const QCborValue &key) const
If the map already had a key equal to \a key, its value will be overwritten
by \a value.
- \sa erase(), remove(QLatin1String), value(QLatin1String), operator[](QLatin1String),
- find(QLatin1String), contains(QLatin1String), take(QLatin1String), extract()
+ \sa erase(), remove(QLatin1StringView), value(QLatin1StringView), operator[](QLatin1StringView),
+ find(QLatin1StringView), contains(QLatin1StringView), take(QLatin1StringView), extract()
*/
/*!
@@ -1167,10 +1109,10 @@ QCborValue QCborMap::extract(iterator it)
*/
/*!
- \fn bool QCborMap::operator==(const QCborMap &other) const
+ \fn bool QCborMap::operator==(const QCborMap &lhs, const QCborMap &rhs)
- Compares this map and \a other, comparing each element in sequence, and
- returns true if the two maps contains the same elements in the same order,
+ Compares \a lhs and \a rhs maps, comparing each element in sequence, and
+ returns true if the two maps contain the same elements in the same order,
false otherwise.
Note that CBOR maps are unordered, which means that two maps containing the
@@ -1186,10 +1128,10 @@ QCborValue QCborMap::extract(iterator it)
*/
/*!
- \fn bool QCborMap::operator!=(const QCborMap &other) const
+ \fn bool QCborMap::operator!=(const QCborMap &lhs, const QCborMap &rhs)
- Compares this map and \a other, comparing each element in sequence, and
- returns true if the two maps contains any different elements or elements in
+ Compares \a lhs and \a rhs maps, comparing each element in sequence, and
+ returns true if the two maps contain any different elements or elements in
different orders, false otherwise.
Note that CBOR maps are unordered, which means that two maps containing the
@@ -1205,10 +1147,10 @@ QCborValue QCborMap::extract(iterator it)
*/
/*!
- \fn bool QCborMap::operator<(const QCborMap &other) const
+ \fn bool QCborMap::operator<(const QCborMap &lhs, const QCborMap &rhs)
- Compares this map and \a other, comparing each element in sequence, and
- returns true if this map should be sorted before \a other, false
+ Compares \a lhs and \a rhs maps, comparing each element in sequence, and
+ returns true if \a lhs map should be sorted before \a rhs, false
otherwise.
Note that CBOR maps are unordered, which means that two maps containing the
@@ -1223,6 +1165,65 @@ QCborValue QCborMap::extract(iterator it)
operator==(), operator!=()
*/
+/*!
+ \fn bool QCborMap::operator<=(const QCborMap &lhs, const QCborMap &rhs)
+
+ Compares \a lhs and \a rhs maps, comparing each element in sequence, and
+ returns true if \a lhs map should be sorted before \a rhs or
+ if the two maps contain the same elements in the same order, false
+ otherwise.
+
+ Note that CBOR maps are unordered, which means that two maps containing the
+ very same pairs but in different order will still compare differently. To
+ avoid this, it is recommended to insert elements into the map in a
+ predictable order, such as by ascending key value. In fact, maps with keys
+ in sorted order are required for Canonical CBOR representation.
+
+ For more information on CBOR sorting order, see QCborValue::compare().
+
+ \sa compare(), QCborValue::operator==(), QCborMap::operator==(),
+ operator==(), operator!=()
+*/
+
+/*!
+ \fn bool QCborMap::operator>=(const QCborMap &lhs, const QCborMap &rhs)
+
+ Compares \a lhs and \a rhs maps, comparing each element in sequence, and
+ returns true if \a lhs map should be sorted after \a rhs or
+ if the two maps contain the same elements in the same order, false
+ otherwise.
+
+ Note that CBOR maps are unordered, which means that two maps containing the
+ very same pairs but in different order will still compare differently. To
+ avoid this, it is recommended to insert elements into the map in a
+ predictable order, such as by ascending key value. In fact, maps with keys
+ in sorted order are required for Canonical CBOR representation.
+
+ For more information on CBOR sorting order, see QCborValue::compare().
+
+ \sa compare(), QCborValue::operator==(), QCborMap::operator==(),
+ operator==(), operator!=()
+*/
+
+/*!
+ \fn bool QCborMap::operator>(const QCborMap &lhs, const QCborMap &rhs)
+
+ Compares \a lhs and \a rhs maps, comparing each element in sequence, and
+ returns true if \a lhs map should be sorted after \a rhs, false
+ otherwise.
+
+ Note that CBOR maps are unordered, which means that two maps containing the
+ very same pairs but in different order will still compare differently. To
+ avoid this, it is recommended to insert elements into the map in a
+ predictable order, such as by ascending key value. In fact, maps with keys
+ in sorted order are required for Canonical CBOR representation.
+
+ For more information on CBOR sorting order, see QCborValue::compare().
+
+ \sa compare(), QCborValue::operator==(), QCborMap::operator==(),
+ operator==(), operator!=()
+*/
+
void QCborMap::detach(qsizetype reserved)
{
d = QCborContainerPrivate::detach(d.data(), reserved ? reserved : size() * 2);
@@ -1237,6 +1238,10 @@ void QCborMap::detach(qsizetype reserved)
\brief The QCborMap::Iterator class provides an STL-style non-const iterator for QCborMap.
+ \compares strong
+ \compareswith strong ConstIterator
+ \endcompareswith
+
QCborMap::Iterator allows you to iterate over a QCborMap and to modify the
value (but not the key) stored under a particular key. If you want to
iterate over a const QCborMap, you should use QCborMap::ConstIterator. It
@@ -1358,63 +1363,63 @@ void QCborMap::detach(qsizetype reserved)
*/
/*!
- \fn bool QCborMap::Iterator::operator==(const Iterator &other) const
- \fn bool QCborMap::Iterator::operator==(const ConstIterator &other) const
+ \fn bool QCborMap::Iterator::operator==(const Iterator &lhs, const Iterator &rhs)
+ \fn bool QCborMap::Iterator::operator==(const Iterator &lhs, const ConstIterator &rhs)
- Returns \c true if \a other points to the same entry in the map as this
+ Returns \c true if \a lhs points to the same entry in the map as \a rhs
iterator; otherwise returns \c false.
\sa operator!=()
*/
/*!
- \fn bool QCborMap::Iterator::operator!=(const Iterator &other) const
- \fn bool QCborMap::Iterator::operator!=(const ConstIterator &other) const
+ \fn bool QCborMap::Iterator::operator!=(const Iterator &lhs, const Iterator &rhs)
+ \fn bool QCborMap::Iterator::operator!=(const Iterator &lhs, const ConstIterator &rhs)
- Returns \c true if \a other points to a different entry in the map than
- this iterator; otherwise returns \c false.
+ Returns \c true if \a lhs points to a different entry in the map than
+ \a rhs iterator; otherwise returns \c false.
\sa operator==()
*/
/*!
- \fn bool QCborMap::Iterator::operator<(const Iterator& other) const
- \fn bool QCborMap::Iterator::operator<(const ConstIterator& other) const
+ \fn bool QCborMap::Iterator::operator<(const Iterator &lhs, const Iterator &rhs)
+ \fn bool QCborMap::Iterator::operator<(const Iterator &lhs, const ConstIterator &rhs)
- Returns \c true if the entry in the map pointed to by this iterator
- occurs before the entry pointed to by the \a other iterator.
+ Returns \c true if the entry in the map pointed to by \a lhs iterator
+ occurs before the entry pointed to by the \a rhs iterator.
*/
/*!
- \fn bool QCborMap::Iterator::operator<=(const Iterator& other) const
- \fn bool QCborMap::Iterator::operator<=(const ConstIterator& other) const
+ \fn bool QCborMap::Iterator::operator<=(const Iterator &lhs, const Iterator &rhs)
+ \fn bool QCborMap::Iterator::operator<=(const Iterator &lhs, const ConstIterator &rhs)
- Returns \c true if the entry in the map pointed to by this iterator
- occurs before or is the same entry as is pointed to by the \a other
+ Returns \c true if the entry in the map pointed to by \a lhs iterator
+ occurs before or is the same entry as is pointed to by the \a rhs
iterator.
*/
/*!
- \fn bool QCborMap::Iterator::operator>(const Iterator& other) const
- \fn bool QCborMap::Iterator::operator>(const ConstIterator& other) const
+ \fn bool QCborMap::Iterator::operator>(const Iterator &lhs, const Iterator &rhs)
+ \fn bool QCborMap::Iterator::operator>(const Iterator &lhs, const ConstIterator &rhs)
- Returns \c true if the entry in the map pointed to by this iterator
- occurs after the entry pointed to by the \a other iterator.
+ Returns \c true if the entry in the map pointed to by \a lhs iterator
+ occurs after the entry pointed to by the \a rhs iterator.
*/
/*!
- \fn bool QCborMap::Iterator::operator>=(const Iterator& other) const
- \fn bool QCborMap::Iterator::operator>=(const ConstIterator& other) const
+ \fn bool QCborMap::Iterator::operator>=(const Iterator &lhs, const Iterator &rhs)
+ \fn bool QCborMap::Iterator::operator>=(const Iterator &lhs, const ConstIterator &rhs)
- Returns \c true if the entry in the map pointed to by this iterator
- occurs after or is the same entry as is pointed to by the \a other
+ Returns \c true if the entry in the map pointed to by \a lhs iterator
+ occurs after or is the same entry as is pointed to by the \a rhs
iterator.
*/
/*!
\fn QCborMap::Iterator &QCborMap::Iterator::operator++()
- The prefix ++ operator, \c{++i}, advances the iterator to the next item in
+ The prefix \c{++} operator, \c{++i}, advances the iterator to the next item in
the map and returns this iterator.
Calling this function on QCborMap::end() leads to undefined results.
@@ -1426,14 +1431,14 @@ void QCborMap::detach(qsizetype reserved)
\fn QCborMap::Iterator QCborMap::Iterator::operator++(int)
\overload
- The postfix ++ operator, \c{i++}, advances the iterator to the next item in
+ The postfix \c{++} operator, \c{i++}, advances the iterator to the next item in
the map and returns an iterator to the previously current item.
*/
/*!
\fn QCborMap::Iterator QCborMap::Iterator::operator--()
- The prefix -- operator, \c{--i}, makes the preceding item current and
+ The prefix \c{--} operator, \c{--i}, makes the preceding item current and
returns this iterator.
Calling this function on QCborMap::begin() leads to undefined results.
@@ -1445,7 +1450,7 @@ void QCborMap::detach(qsizetype reserved)
\fn QCborMap::Iterator QCborMap::Iterator::operator--(int)
\overload
- The postfix -- operator, \c{i--}, makes the preceding item current and
+ The postfix \c{--} operator, \c{i--}, makes the preceding item current and
returns an iterator pointing to the previously current item.
*/
@@ -1503,6 +1508,10 @@ void QCborMap::detach(qsizetype reserved)
\brief The QCborMap::ConstIterator class provides an STL-style const iterator for QCborMap.
+ \compares strong
+ \compareswith strong Iterator
+ \endcompareswith
+
QCborMap::ConstIterator allows you to iterate over a QCborMap. If you want
to modify the QCborMap as you iterate over it, you must use
QCborMap::Iterator instead. It is generally good practice to use
@@ -1603,63 +1612,57 @@ void QCborMap::detach(qsizetype reserved)
*/
/*!
- \fn bool QCborMap::ConstIterator::operator==(const ConstIterator &other) const
- \fn bool QCborMap::ConstIterator::operator==(const Iterator &other) const
+ \fn bool QCborMap::ConstIterator::operator==(const ConstIterator &lhs, const ConstIterator &rhs)
- Returns \c true if \a other points to the same entry in the map as this
+ Returns \c true if \a lhs points to the same entry in the map as \a rhs
iterator; otherwise returns \c false.
\sa operator!=()
*/
/*!
- \fn bool QCborMap::ConstIterator::operator!=(const ConstIterator &other) const
- \fn bool QCborMap::ConstIterator::operator!=(const Iterator &other) const
+ \fn bool QCborMap::ConstIterator::operator!=(const ConstIterator &lhs, const ConstIterator &rhs)
- Returns \c true if \a other points to a different entry in the map than
- this iterator; otherwise returns \c false.
+ Returns \c true if \a lhs points to a different entry in the map than
+ \a rhs iterator; otherwise returns \c false.
\sa operator==()
*/
/*!
- \fn bool QCborMap::ConstIterator::operator<(const Iterator &other) const
- \fn bool QCborMap::ConstIterator::operator<(const ConstIterator &other) const
+ \fn bool QCborMap::ConstIterator::operator<(const ConstIterator &lhs, const ConstIterator &rhs)
- Returns \c true if the entry in the map pointed to by this iterator
- occurs before the entry pointed to by the \a other iterator.
+ Returns \c true if the entry in the map pointed to by \a lhs iterator
+ occurs before the entry pointed to by the \a rhs iterator.
*/
/*!
- \fn bool QCborMap::ConstIterator::operator<=(const Iterator &other) const
- \fn bool QCborMap::ConstIterator::operator<=(const ConstIterator &other) const
+ \fn bool QCborMap::ConstIterator::operator<=(const ConstIterator &lhs, const ConstIterator &rhs)
- Returns \c true if the entry in the map pointed to by this iterator
- occurs before or is the same entry as is pointed to by the \a other
+ Returns \c true if the entry in the map pointed to by \a lhs iterator
+ occurs before or is the same entry as is pointed to by the \a rhs
iterator.
*/
/*!
- \fn bool QCborMap::ConstIterator::operator>(const Iterator &other) const
- \fn bool QCborMap::ConstIterator::operator>(const ConstIterator &other) const
+ \fn bool QCborMap::ConstIterator::operator>(const ConstIterator &lhs, const ConstIterator &rhs)
- Returns \c true if the entry in the map pointed to by this iterator
- occurs after the entry pointed to by the \a other iterator.
+ Returns \c true if the entry in the map pointed to by \a lhs iterator
+ occurs after the entry pointed to by the \a rhs iterator.
*/
/*!
- \fn bool QCborMap::ConstIterator::operator>=(const Iterator &other) const
- \fn bool QCborMap::ConstIterator::operator>=(const ConstIterator &other) const
+ \fn bool QCborMap::ConstIterator::operator>=(const ConstIterator &lhs, const ConstIterator &rhs)
- Returns \c true if the entry in the map pointed to by this iterator
- occurs after or is the same entry as is pointed to by the \a other
+ Returns \c true if the entry in the map pointed to by \a lhs iterator
+ occurs after or is the same entry as is pointed to by the \a rhs
iterator.
*/
/*!
\fn QCborMap::ConstIterator &QCborMap::ConstIterator::operator++()
- The prefix ++ operator, \c{++i}, advances the iterator to the next item in
+ The prefix \c{++} operator, \c{++i}, advances the iterator to the next item in
the map and returns this iterator.
Calling this function on QCborMap::end() leads to undefined results.
@@ -1671,14 +1674,14 @@ void QCborMap::detach(qsizetype reserved)
\fn QCborMap::ConstIterator QCborMap::ConstIterator::operator++(int)
\overload
- The postfix ++ operator, \c{i++}, advances the iterator to the next item in
+ The postfix \c{++} operator, \c{i++}, advances the iterator to the next item in
the map and returns an iterator to the previously current item.
*/
/*!
\fn QCborMap::ConstIterator &QCborMap::ConstIterator::operator--()
- The prefix -- operator, \c{--i}, makes the preceding item current and
+ The prefix \c{--} operator, \c{--i}, makes the preceding item current and
returns this iterator.
Calling this function on QCborMap::begin() leads to undefined results.
@@ -1690,7 +1693,7 @@ void QCborMap::detach(qsizetype reserved)
\fn QCborMap::ConstIterator QCborMap::ConstIterator::operator--(int)
\overload
- The postfix -- operator, \c{i--}, makes the preceding item current and
+ The postfix \c{--} operator, \c{i--}, makes the preceding item current and
returns an iterator pointing to the previously current item.
*/
diff --git a/src/corelib/serialization/qcbormap.h b/src/corelib/serialization/qcbormap.h
index f84552d992..d2fd769240 100644
--- a/src/corelib/serialization/qcbormap.h
+++ b/src/corelib/serialization/qcbormap.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2018 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2022 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QCBORMAP_H
#define QCBORMAP_H
@@ -56,26 +20,27 @@ class QCborContainerPrivate;
class Q_CORE_EXPORT QCborMap
{
public:
- typedef QPair<QCborValue, QCborValue> value_type;
+ typedef std::pair<QCborValue, QCborValue> value_type;
typedef QCborValue key_type;
typedef QCborValue mapped_type;
typedef qsizetype size_type;
class ConstIterator;
class Iterator {
- mutable QCborValueRef item; // points to the value
+ QCborValueRef item {}; // points to the value
friend class ConstIterator;
friend class QCborMap;
Iterator(QCborContainerPrivate *dd, qsizetype ii) : item(dd, ii) {}
public:
typedef std::random_access_iterator_tag iterator_category;
typedef qsizetype difference_type;
- typedef QPair<const QCborValueRef, QCborValueRef> value_type;
- typedef QPair<const QCborValueRef, QCborValueRef> reference;
- typedef QPair<const QCborValueRef, QCborValueRef> pointer;
+ typedef std::pair<QCborValueConstRef, QCborValueRef> value_type;
+ typedef std::pair<QCborValueConstRef, QCborValueRef> reference;
+ typedef std::pair<QCborValueConstRef, QCborValueRef> pointer;
constexpr Iterator() = default;
constexpr Iterator(const Iterator &) = default;
+ ~Iterator() = default;
Iterator &operator=(const Iterator &other)
{
// rebind the reference
@@ -84,23 +49,32 @@ public:
return *this;
}
- value_type operator*() const { return { {item.d, item.i - 1}, item }; }
- QCborValueRef *operator->() const { return &item; }
- QCborValue key() const { return QCborValueRef(item.d, item.i - 1); }
+ value_type operator*() const { return { QCborValueRef{item.d, item.i - 1}, item }; }
+ value_type operator[](qsizetype j) const { return *(*this + j); }
+ QCborValueRef *operator->() { return &item; }
+ const QCborValueConstRef *operator->() const { return &item; }
+#if QT_VERSION >= QT_VERSION_CHECK(7,0,0)
+ QCborValueConstRef
+#else
+ QCborValue
+#endif
+ key() const { return QCborValueRef(item.d, item.i - 1); }
QCborValueRef value() const { return item; }
+#if QT_CORE_REMOVED_SINCE(6, 8)
bool operator==(const Iterator &o) const { return item.d == o.item.d && item.i == o.item.i; }
- bool operator!=(const Iterator &o) const { return !(*this == o); }
+ bool operator!=(const Iterator &o) const { return !operator==(o); }
bool operator<(const Iterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i < other.item.i; }
bool operator<=(const Iterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i <= other.item.i; }
bool operator>(const Iterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i > other.item.i; }
bool operator>=(const Iterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i >= other.item.i; }
bool operator==(const ConstIterator &o) const { return item.d == o.item.d && item.i == o.item.i; }
- bool operator!=(const ConstIterator &o) const { return !(*this == o); }
+ bool operator!=(const ConstIterator &o) const { return !operator==(o); }
bool operator<(const ConstIterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i < other.item.i; }
bool operator<=(const ConstIterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i <= other.item.i; }
bool operator>(const ConstIterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i > other.item.i; }
bool operator>=(const ConstIterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i >= other.item.i; }
+#endif
Iterator &operator++() { item.i += 2; return *this; }
Iterator operator++(int) { Iterator n = *this; item.i += 2; return n; }
Iterator &operator--() { item.i -= 2; return *this; }
@@ -110,24 +84,74 @@ public:
Iterator operator+(qsizetype j) const { return Iterator({ item.d, item.i + 2 * j }); }
Iterator operator-(qsizetype j) const { return Iterator({ item.d, item.i - 2 * j }); }
qsizetype operator-(Iterator j) const { return (item.i - j.item.i) / 2; }
+
+ private:
+ // Helper functions
+ static bool comparesEqual_helper(const Iterator &lhs, const Iterator &rhs) noexcept
+ {
+ return lhs.item.d == rhs.item.d && lhs.item.i == rhs.item.i;
+ }
+
+ static bool comparesEqual_helper(const Iterator &lhs, const ConstIterator &rhs) noexcept
+ {
+ return lhs.item.d == rhs.item.d && lhs.item.i == rhs.item.i;
+ }
+
+ static Qt::strong_ordering compareThreeWay_helper(const Iterator &lhs,
+ const Iterator &rhs) noexcept
+ {
+ Q_ASSERT(lhs.item.d == rhs.item.d);
+ return Qt::compareThreeWay(lhs.item.i, rhs.item.i);
+ }
+
+ static Qt::strong_ordering compareThreeWay_helper(const Iterator &lhs,
+ const ConstIterator &rhs) noexcept
+ {
+ Q_ASSERT(lhs.item.d == rhs.item.d);
+ return Qt::compareThreeWay(lhs.item.i, rhs.item.i);
+ }
+
+ // Compare friends
+ friend bool comparesEqual(const Iterator &lhs, const Iterator &rhs) noexcept
+ {
+ return comparesEqual_helper(lhs, rhs);
+ }
+ friend Qt::strong_ordering compareThreeWay(const Iterator &lhs,
+ const Iterator &rhs) noexcept
+ {
+ return compareThreeWay_helper(lhs, rhs);
+ }
+ Q_DECLARE_STRONGLY_ORDERED(Iterator)
+ friend bool comparesEqual(const Iterator &lhs, const ConstIterator &rhs) noexcept
+ {
+ return comparesEqual_helper(lhs, rhs);
+ }
+ friend Qt::strong_ordering compareThreeWay(const Iterator &lhs,
+ const ConstIterator &rhs) noexcept
+ {
+ return compareThreeWay_helper(lhs, rhs);
+ }
+ Q_DECLARE_STRONGLY_ORDERED(Iterator, ConstIterator)
};
class ConstIterator {
- QCborValueRef item; // points to the value
+ QCborValueConstRef item; // points to the value
friend class Iterator;
friend class QCborMap;
friend class QCborValue;
friend class QCborValueRef;
+ constexpr ConstIterator(QCborValueConstRef it) : item{it} {}
ConstIterator(QCborContainerPrivate *dd, qsizetype ii) : item(dd, ii) {}
public:
typedef std::random_access_iterator_tag iterator_category;
typedef qsizetype difference_type;
- typedef QPair<const QCborValueRef, const QCborValueRef> value_type;
- typedef QPair<const QCborValueRef, const QCborValueRef> reference;
- typedef QPair<const QCborValueRef, const QCborValueRef> pointer;
+ typedef std::pair<QCborValueConstRef, QCborValueConstRef> value_type;
+ typedef std::pair<QCborValueConstRef, QCborValueConstRef> reference;
+ typedef std::pair<QCborValueConstRef, QCborValueConstRef> pointer;
constexpr ConstIterator() = default;
constexpr ConstIterator(const ConstIterator &) = default;
+ ~ConstIterator() = default;
ConstIterator &operator=(const ConstIterator &other)
{
// rebind the reference
@@ -136,32 +160,65 @@ public:
return *this;
}
- value_type operator*() const { return { {item.d, item.i - 1}, item }; }
- const QCborValueRef *operator->() const { return &item; }
- QCborValue key() const { return QCborValueRef(item.d, item.i - 1); }
- QCborValueRef value() const { return item; }
+ value_type operator*() const { return { QCborValueRef(item.d, item.i - 1), item }; }
+ value_type operator[](qsizetype j) const { return *(*this + j); }
+ const QCborValueConstRef *operator->() const { return &item; }
+#if QT_VERSION >= QT_VERSION_CHECK(7,0,0)
+ QCborValueConstRef
+#else
+ QCborValue
+#endif
+ key() const { return QCborValueRef(item.d, item.i - 1); }
+ QCborValueConstRef value() const { return item; }
+#if QT_CORE_REMOVED_SINCE(6, 8)
bool operator==(const Iterator &o) const { return item.d == o.item.d && item.i == o.item.i; }
- bool operator!=(const Iterator &o) const { return !(*this == o); }
+ bool operator!=(const Iterator &o) const { return !operator==(o); }
bool operator<(const Iterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i < other.item.i; }
bool operator<=(const Iterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i <= other.item.i; }
bool operator>(const Iterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i > other.item.i; }
bool operator>=(const Iterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i >= other.item.i; }
bool operator==(const ConstIterator &o) const { return item.d == o.item.d && item.i == o.item.i; }
- bool operator!=(const ConstIterator &o) const { return !(*this == o); }
+ bool operator!=(const ConstIterator &o) const { return !operator==(o); }
bool operator<(const ConstIterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i < other.item.i; }
bool operator<=(const ConstIterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i <= other.item.i; }
bool operator>(const ConstIterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i > other.item.i; }
bool operator>=(const ConstIterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i >= other.item.i; }
+#endif
ConstIterator &operator++() { item.i += 2; return *this; }
ConstIterator operator++(int) { ConstIterator n = *this; item.i += 2; return n; }
ConstIterator &operator--() { item.i -= 2; return *this; }
ConstIterator operator--(int) { ConstIterator n = *this; item.i -= 2; return n; }
ConstIterator &operator+=(qsizetype j) { item.i += 2 * j; return *this; }
ConstIterator &operator-=(qsizetype j) { item.i -= 2 * j; return *this; }
- ConstIterator operator+(qsizetype j) const { return ConstIterator({ item.d, item.i + 2 * j }); }
- ConstIterator operator-(qsizetype j) const { return ConstIterator({ item.d, item.i - 2 * j }); }
+ ConstIterator operator+(qsizetype j) const { return ConstIterator{ item.d, item.i + 2 * j }; }
+ ConstIterator operator-(qsizetype j) const { return ConstIterator{ item.d, item.i - 2 * j }; }
qsizetype operator-(ConstIterator j) const { return (item.i - j.item.i) / 2; }
+ private:
+ // Helper functions
+ static bool comparesEqual_helper(const ConstIterator &lhs,
+ const ConstIterator &rhs) noexcept
+ {
+ return lhs.item.d == rhs.item.d && lhs.item.i == rhs.item.i;
+ }
+ static Qt::strong_ordering compareThreeWay_helper(const ConstIterator &lhs,
+ const ConstIterator &rhs) noexcept
+ {
+ Q_ASSERT(lhs.item.d == rhs.item.d);
+ return Qt::compareThreeWay(lhs.item.i, rhs.item.i);
+ }
+
+ // Compare friends
+ friend bool comparesEqual(const ConstIterator &lhs, const ConstIterator &rhs) noexcept
+ {
+ return comparesEqual_helper(lhs, rhs);
+ }
+ friend Qt::strong_ordering compareThreeWay(const ConstIterator &lhs,
+ const ConstIterator &rhs) noexcept
+ {
+ return compareThreeWay_helper(lhs, rhs);
+ }
+ Q_DECLARE_STRONGLY_ORDERED(ConstIterator)
};
QCborMap() noexcept;
@@ -178,7 +235,7 @@ public:
void swap(QCborMap &other) noexcept
{
- qSwap(d, other.d);
+ d.swap(other.d);
}
QCborValue toCborValue() const { return *this; }
@@ -189,73 +246,65 @@ public:
QList<QCborValue> keys() const;
QCborValue value(qint64 key) const
- { const_iterator it = find(key); return it == end() ? QCborValue() : it.value(); }
- QCborValue value(QLatin1String key) const
- { const_iterator it = find(key); return it == end() ? QCborValue() : it.value(); }
+ { const_iterator it = find(key); return comparesEqual(it, end()) ? QCborValue() : it.value(); }
+ QCborValue value(QLatin1StringView key) const
+ { const_iterator it = find(key); return comparesEqual(it, end()) ? QCborValue() : it.value(); }
QCborValue value(const QString & key) const
- { const_iterator it = find(key); return it == end() ? QCborValue() : it.value(); }
+ { const_iterator it = find(key); return comparesEqual(it, end()) ? QCborValue() : it.value(); }
QCborValue value(const QCborValue &key) const
- { const_iterator it = find(key); return it == end() ? QCborValue() : it.value(); }
+ { const_iterator it = find(key); return comparesEqual(it, end()) ? QCborValue() : it.value(); }
#if !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII)
template<size_t N> QT_ASCII_CAST_WARN const QCborValue value(const char (&key)[N]) const
{ return value(QString::fromUtf8(key, N - 1)); }
#endif
const QCborValue operator[](qint64 key) const
- { const_iterator it = find(key); return it == end() ? QCborValue() : it.value(); }
- const QCborValue operator[](QLatin1String key) const
- { const_iterator it = find(key); return it == end() ? QCborValue() : it.value(); }
+ { const_iterator it = find(key); return comparesEqual(it, end()) ? QCborValue() : it.value(); }
+ const QCborValue operator[](QLatin1StringView key) const
+ { const_iterator it = find(key); return comparesEqual(it, end()) ? QCborValue() : it.value(); }
const QCborValue operator[](const QString & key) const
- { const_iterator it = find(key); return it == end() ? QCborValue() : it.value(); }
+ { const_iterator it = find(key); return comparesEqual(it, end()) ? QCborValue() : it.value(); }
const QCborValue operator[](const QCborValue &key) const
- { const_iterator it = find(key); return it == end() ? QCborValue() : it.value(); }
+ { const_iterator it = find(key); return comparesEqual(it, end()) ? QCborValue() : it.value(); }
#if !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII)
template<size_t N> QT_ASCII_CAST_WARN const QCborValue operator[](const char (&key)[N]) const
{ return operator[](QString::fromUtf8(key, N - 1)); }
#endif
QCborValueRef operator[](qint64 key);
- QCborValueRef operator[](QLatin1String key);
+ QCborValueRef operator[](QLatin1StringView key);
QCborValueRef operator[](const QString & key);
QCborValueRef operator[](const QCborValue &key);
QCborValue take(qint64 key)
- { const_iterator it = constFind(key); if (it != constEnd()) return extract(it); return QCborValue(); }
- QCborValue take(QLatin1String key)
- { const_iterator it = constFind(key); if (it != constEnd()) return extract(it); return QCborValue(); }
+ { const_iterator it = constFind(key); if (!comparesEqual(it, constEnd())) return extract(it); return QCborValue(); }
+ QCborValue take(QLatin1StringView key)
+ { const_iterator it = constFind(key); if (!comparesEqual(it, constEnd())) return extract(it); return QCborValue(); }
QCborValue take(const QString &key)
- { const_iterator it = constFind(key); if (it != constEnd()) return extract(it); return QCborValue(); }
+ { const_iterator it = constFind(key); if (!comparesEqual(it, constEnd())) return extract(it); return QCborValue(); }
QCborValue take(const QCborValue &key)
- { const_iterator it = constFind(key); if (it != constEnd()) return extract(it); return QCborValue(); }
+ { const_iterator it = constFind(key); if (!comparesEqual(it, constEnd())) return extract(it); return QCborValue(); }
void remove(qint64 key)
- { const_iterator it = constFind(key); if (it != constEnd()) erase(it); }
- void remove(QLatin1String key)
- { const_iterator it = constFind(key); if (it != constEnd()) erase(it); }
+ { const_iterator it = constFind(key); if (!comparesEqual(it, constEnd())) erase(it); }
+ void remove(QLatin1StringView key)
+ { const_iterator it = constFind(key); if (!comparesEqual(it, constEnd())) erase(it); }
void remove(const QString & key)
- { const_iterator it = constFind(key); if (it != constEnd()) erase(it); }
+ { const_iterator it = constFind(key); if (!comparesEqual(it, constEnd())) erase(it); }
void remove(const QCborValue &key)
- { const_iterator it = constFind(key); if (it != constEnd()) erase(it); }
+ { const_iterator it = constFind(key); if (!comparesEqual(it, constEnd())) erase(it); }
bool contains(qint64 key) const
- { const_iterator it = find(key); return it != end(); }
- bool contains(QLatin1String key) const
- { const_iterator it = find(key); return it != end(); }
+ { const_iterator it = find(key); return !comparesEqual(it, end()); }
+ bool contains(QLatin1StringView key) const
+ { const_iterator it = find(key); return !comparesEqual(it, end()); }
bool contains(const QString & key) const
- { const_iterator it = find(key); return it != end(); }
+ { const_iterator it = find(key); return !comparesEqual(it, end()); }
bool contains(const QCborValue &key) const
- { const_iterator it = find(key); return it != end(); }
+ { const_iterator it = find(key); return !comparesEqual(it, end()); }
int compare(const QCborMap &other) const noexcept Q_DECL_PURE_FUNCTION;
-#if 0 && __has_include(<compare>)
- std::strong_ordering operator<=>(const QCborMap &other) const
- {
- int c = compare(other);
- if (c > 0) return std::strong_ordering::greater;
- if (c == 0) return std::strong_ordering::equivalent;
- return std::strong_ordering::less;
- }
-#else
+#if QT_CORE_REMOVED_SINCE(6, 8)
bool operator==(const QCborMap &other) const noexcept
{ return compare(other) == 0; }
bool operator!=(const QCborMap &other) const noexcept
- { return !(*this == other); }
+ { return !operator==(other); }
bool operator<(const QCborMap &other) const
{ return compare(other) < 0; }
#endif
@@ -277,15 +326,15 @@ public:
bool empty() const { return isEmpty(); }
iterator find(qint64 key);
- iterator find(QLatin1String key);
+ iterator find(QLatin1StringView key);
iterator find(const QString & key);
iterator find(const QCborValue &key);
const_iterator constFind(qint64 key) const;
- const_iterator constFind(QLatin1String key) const;
+ const_iterator constFind(QLatin1StringView key) const;
const_iterator constFind(const QString & key) const;
const_iterator constFind(const QCborValue &key) const;
const_iterator find(qint64 key) const { return constFind(key); }
- const_iterator find(QLatin1String key) const { return constFind(key); }
+ const_iterator find(QLatin1StringView key) const { return constFind(key); }
const_iterator find(const QString & key) const { return constFind(key); }
const_iterator find(const QCborValue &key) const { return constFind(key); }
@@ -295,7 +344,7 @@ public:
v = value_;
return { d.data(), v.i };
}
- iterator insert(QLatin1String key, const QCborValue &value_)
+ iterator insert(QLatin1StringView key, const QCborValue &value_)
{
QCborValueRef v = operator[](key); // detaches
v = value_;
@@ -324,11 +373,54 @@ public:
QJsonObject toJsonObject() const;
private:
+ friend class QCborContainerPrivate;
friend class QCborValue;
friend class QCborValueRef;
friend class QJsonPrivate::Variant;
void detach(qsizetype reserve = 0);
+ friend Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool
+ comparesEqual(const QCborMap &lhs, const QCborMap &rhs) noexcept;
+ friend Qt::strong_ordering compareThreeWay(const QCborMap &lhs,
+ const QCborMap &rhs) noexcept
+ {
+ int c = lhs.compare(rhs);
+ return Qt::compareThreeWay(c, 0);
+ }
+ Q_DECLARE_STRONGLY_ORDERED(QCborMap)
+
+ static Q_DECL_PURE_FUNCTION bool
+ comparesEqual_helper(const QCborMap &lhs, const QCborValue &rhs) noexcept;
+ static Q_DECL_PURE_FUNCTION Qt::strong_ordering
+ compareThreeWay_helper(const QCborMap &lhs, const QCborValue &rhs) noexcept;
+ friend bool comparesEqual(const QCborMap &lhs,
+ const QCborValue &rhs) noexcept
+ {
+ return comparesEqual_helper(lhs, rhs);
+ }
+ friend Qt::strong_ordering compareThreeWay(const QCborMap &lhs,
+ const QCborValue &rhs) noexcept
+ {
+ return compareThreeWay_helper(lhs, rhs);
+ }
+ Q_DECLARE_STRONGLY_ORDERED(QCborMap, QCborValue)
+
+ static Q_DECL_PURE_FUNCTION bool
+ comparesEqual_helper(const QCborMap &lhs, QCborValueConstRef rhs) noexcept;
+ static Q_DECL_PURE_FUNCTION Qt::strong_ordering
+ compareThreeWay_helper(const QCborMap &lhs, QCborValueConstRef rhs) noexcept;
+ friend bool comparesEqual(const QCborMap &lhs,
+ const QCborValueConstRef &rhs) noexcept
+ {
+ return comparesEqual_helper(lhs, rhs);
+ }
+ friend Qt::strong_ordering compareThreeWay(const QCborMap &lhs,
+ const QCborValueConstRef &rhs) noexcept
+ {
+ return compareThreeWay_helper(lhs, rhs);
+ }
+ Q_DECLARE_STRONGLY_ORDERED(QCborMap, QCborValueConstRef)
+
explicit QCborMap(QCborContainerPrivate &dd) noexcept;
QExplicitlySharedDataPointer<QCborContainerPrivate> d;
};
@@ -340,6 +432,7 @@ inline QCborValue::QCborValue(QCborMap &&m)
{
}
+#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0) && !defined(QT_BOOTSTRAPPED)
inline QCborMap QCborValueRef::toMap() const
{
return concrete().toMap();
@@ -349,6 +442,17 @@ inline QCborMap QCborValueRef::toMap(const QCborMap &m) const
{
return concrete().toMap(m);
}
+#endif
+
+inline QCborMap QCborValueConstRef::toMap() const
+{
+ return concrete().toMap();
+}
+
+inline QCborMap QCborValueConstRef::toMap(const QCborMap &m) const
+{
+ return concrete().toMap(m);
+}
Q_CORE_EXPORT size_t qHash(const QCborMap &map, size_t seed = 0);
diff --git a/src/corelib/serialization/qcborstream.h b/src/corelib/serialization/qcborstream.h
index f2b88820cd..7850d26663 100644
--- a/src/corelib/serialization/qcborstream.h
+++ b/src/corelib/serialization/qcborstream.h
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2019 The Qt Company Ltd.
-** Copyright (C) 2018 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2019 The Qt Company Ltd.
+// Copyright (C) 2018 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QCBORSTREAM_H
#define QCBORSTREAM_H
diff --git a/src/corelib/serialization/qcborstreamreader.cpp b/src/corelib/serialization/qcborstreamreader.cpp
index cf90f3e397..863c24534a 100644
--- a/src/corelib/serialization/qcborstreamreader.cpp
+++ b/src/corelib/serialization/qcborstreamreader.cpp
@@ -1,48 +1,11 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qcborstreamreader.h"
#define CBOR_NO_ENCODER_API
#include <private/qcborcommon_p.h>
-#include <private/qbytearray_p.h>
#include <private/qnumeric_p.h>
#include <private/qstringconverter_p.h>
#include <qiodevice.h>
@@ -65,6 +28,7 @@ static CborError qt_cbor_decoder_transfer_string(void *token, const void **userp
QT_WARNING_PUSH
QT_WARNING_DISABLE_MSVC(4334) // '<<': result of 32-bit shift implicitly converted to 64 bits (was 64-bit shift intended?)
+QT_WARNING_DISABLE_GCC("-Wimplicit-fallthrough")
#include <cborparser.c>
@@ -72,13 +36,11 @@ QT_WARNING_POP
static CborError _cbor_value_dup_string(const CborValue *, void **, size_t *, CborValue *)
{
- Q_UNREACHABLE();
- return CborErrorInternalError;
+ Q_UNREACHABLE_RETURN(CborErrorInternalError);
}
[[maybe_unused]] static CborError cbor_value_get_half_float_as_float(const CborValue *, float *)
{
- Q_UNREACHABLE();
- return CborErrorInternalError;
+ Q_UNREACHABLE_RETURN(CborErrorInternalError);
}
// confirm our constants match TinyCBOR's
@@ -98,6 +60,7 @@ static_assert(int(QCborStreamReader::Invalid) == CborInvalidType);
\class QCborStreamReader
\inmodule QtCore
\ingroup cbor
+ \ingroup qtserialization
\reentrant
\since 5.12
@@ -187,7 +150,9 @@ static_assert(int(QCborStreamReader::Invalid) == CborInvalidType);
parsing from a QByteArray, or reparse(), if it is instead reading directly
a the QIDOevice that now has more data available (see setDevice()).
- \sa QCborStreamWriter, QCborValue, QXmlStreamReader
+ \sa QCborStreamWriter, QCborValue, QXmlStreamReader,
+ {Parsing and displaying CBOR data}, {Serialization Converter},
+ {Saving and Loading a Game}
*/
/*!
@@ -565,7 +530,7 @@ public:
CborValue currentElement;
QCborError lastError = {};
- QByteArray::size_type bufferStart;
+ QByteArray::size_type bufferStart = 0;
bool corrupt = false;
QCborStreamReaderPrivate(const QByteArray &data)
@@ -653,21 +618,24 @@ public:
QByteArray *array;
QString *string;
};
- enum { ByteArray = -1, String = -3 };
+ enum Type { ByteArray = -1, String = -3, Utf8String = -5 };
qsizetype maxlen_or_type;
ReadStringChunk(char *ptr, qsizetype maxlen) : ptr(ptr), maxlen_or_type(maxlen) {}
- ReadStringChunk(QByteArray *array) : array(array), maxlen_or_type(ByteArray) {}
+ ReadStringChunk(QByteArray *array, Type type = ByteArray) : array(array), maxlen_or_type(type) {}
ReadStringChunk(QString *str) : string(str), maxlen_or_type(String) {}
bool isString() const { return maxlen_or_type == String; }
+ bool isUtf8String() const { return maxlen_or_type == Utf8String; }
bool isByteArray() const { return maxlen_or_type == ByteArray; }
bool isPlainPointer() const { return maxlen_or_type >= 0; }
};
static QCborStreamReader::StringResultCode appendStringChunk(QCborStreamReader &reader, QByteArray *data);
+ bool readFullString(ReadStringChunk params);
QCborStreamReader::StringResult<qsizetype> readStringChunk(ReadStringChunk params);
qsizetype readStringChunk_byte(ReadStringChunk params, qsizetype len);
qsizetype readStringChunk_unicode(ReadStringChunk params, qsizetype utf8len);
+ qsizetype readStringChunk_utf8(ReadStringChunk params, qsizetype utf8len);
bool ensureStringIteration();
};
@@ -717,7 +685,7 @@ static CborError qt_cbor_decoder_transfer_string(void *token, const void **userp
// (otherwise, we'd lose the length information)
qsizetype total;
if (len > size_t(std::numeric_limits<QByteArray::size_type>::max())
- || add_overflow<qsizetype>(offset, len, &total))
+ || qAddOverflow<qsizetype>(offset, len, &total))
return CborErrorDataTooLarge;
// our string transfer is just saving the offset to the userptr
@@ -787,7 +755,7 @@ inline void QCborStreamReader::preparse()
\sa addData(), isValid()
*/
QCborStreamReader::QCborStreamReader()
- : QCborStreamReader(QByteArray())
+ : d(new QCborStreamReaderPrivate({})), type_(Invalid)
{
}
@@ -964,7 +932,7 @@ void QCborStreamReader::reset()
\sa isValid()
*/
-QCborError QCborStreamReader::lastError()
+QCborError QCborStreamReader::lastError() const
{
return d->lastError;
}
@@ -1005,7 +973,7 @@ QCborStreamReader::Type QCborStreamReader::parentContainerType() const
{
if (d->containerStack.isEmpty())
return Invalid;
- return Type(cbor_value_get_type(&qAsConst(d->containerStack).top()));
+ return Type(cbor_value_get_type(&std::as_const(d->containerStack).top()));
}
/*!
@@ -1325,16 +1293,20 @@ bool QCborStreamReader::leaveContainer()
Decodes one string chunk from the CBOR string and returns it. This function
is used for both regular and chunked string contents, so the caller must
- always loop around calling this function, even if isLengthKnown() has
+ always loop around calling this function, even if isLengthKnown()
is true. The typical use of this function is as follows:
\snippet code/src_corelib_serialization_qcborstream.cpp 27
+ The readAllString() function implements the above loop and some extra checks.
+
+//! [string-no-type-conversions]
This function does not perform any type conversions, including from integers
or from byte arrays. Therefore, it may only be called if isString() returned
true; calling it in any other condition is an error.
+//! [string-no-type-conversions]
- \sa readByteArray(), isString(), readStringChunk()
+ \sa readAllString(), readByteArray(), isString(), readStringChunk()
*/
QCborStreamReader::StringResult<QString> QCborStreamReader::_readString_helper()
{
@@ -1344,7 +1316,41 @@ QCborStreamReader::StringResult<QString> QCborStreamReader::_readString_helper()
if (r.status == Error) {
result.data.clear();
} else {
- Q_ASSERT(r.data == result.data.length());
+ Q_ASSERT(r.data == result.data.size());
+ if (r.status == EndOfString && lastError() == QCborError::NoError)
+ preparse();
+ }
+
+ return result;
+}
+
+/*!
+ \fn QCborStreamReader::StringResult<QByteArray> QCborStreamReader::readUtf8String()
+ \since 6.7
+
+ Decodes one string chunk from the CBOR string and returns it. This function
+ is used for both regular and chunked string contents, so the caller must
+ always loop around calling this function, even if isLengthKnown() is true.
+ The typical use of this function is as for readString() in the following:
+
+ \snippet code/src_corelib_serialization_qcborstream.cpp 27
+
+ The readAllUtf8String() function implements the above loop and some extra checks.
+
+ \include qcborstreamreader.cpp string-no-type-conversions
+
+ \sa readAllString(), readByteArray(), isString(), readStringChunk()
+ */
+QCborStreamReader::StringResult<QByteArray> QCborStreamReader::_readUtf8String_helper()
+{
+ using P = QCborStreamReaderPrivate::ReadStringChunk;
+ QCborStreamReader::StringResult<QByteArray> result;
+ auto r = d->readStringChunk(P{ &result.data, P::Utf8String });
+ result.status = r.status;
+ if (r.status == Error) {
+ result.data.clear();
+ } else {
+ Q_ASSERT(r.data == result.data.size());
if (r.status == EndOfString && lastError() == QCborError::NoError)
preparse();
}
@@ -1357,16 +1363,20 @@ QCborStreamReader::StringResult<QString> QCborStreamReader::_readString_helper()
Decodes one byte array chunk from the CBOR string and returns it. This
function is used for both regular and chunked contents, so the caller must
- always loop around calling this function, even if isLengthKnown() has
+ always loop around calling this function, even if isLengthKnown()
is true. The typical use of this function is as follows:
\snippet code/src_corelib_serialization_qcborstream.cpp 28
+ The readAllByteArray() function implements the above loop and some extra checks.
+
+//! [bytearray-no-type-conversions]
This function does not perform any type conversions, including from integers
or from strings. Therefore, it may only be called if isByteArray() is true;
calling it in any other condition is an error.
+//! [bytearray-no-type-conversions]
- \sa readString(), isByteArray(), readStringChunk()
+ \sa readAllByteArray(), readString(), isByteArray(), readStringChunk()
*/
QCborStreamReader::StringResult<QByteArray> QCborStreamReader::_readByteArray_helper()
{
@@ -1376,7 +1386,7 @@ QCborStreamReader::StringResult<QByteArray> QCborStreamReader::_readByteArray_he
if (r.status == Error) {
result.data.clear();
} else {
- Q_ASSERT(r.data == result.data.length());
+ Q_ASSERT(r.data == result.data.size());
if (r.status == EndOfString && lastError() == QCborError::NoError)
preparse();
}
@@ -1415,6 +1425,147 @@ qsizetype QCborStreamReader::_currentStringChunkSize() const
return -1;
}
+bool QCborStreamReaderPrivate::readFullString(ReadStringChunk params)
+{
+ auto r = readStringChunk(params);
+ while (r.status == QCborStreamReader::Ok) {
+ // keep appending
+ r = readStringChunk(params);
+ }
+
+ bool ok = r.status == QCborStreamReader::EndOfString;
+ Q_ASSERT(ok == !lastError);
+ return ok;
+}
+
+/*!
+ \fn QCborStreamReader::readAllString()
+ \since 6.7
+
+ Decodes the current text string and returns it. If the string is chunked,
+ this function will iterate over all chunks and concatenate them. If an
+ error happens, this function returns a default-constructed QString(), but
+ that may not be distinguishable from certain empty text strings. Instead,
+ check lastError() to determine if an error has happened.
+
+ \include qcborstreamreader.cpp string-no-type-conversions
+
+//! [note-not-restartable]
+ \note This function cannot be resumed. That is, this function should not
+ be used in contexts where the CBOR data may still be received, for example
+ from a socket or pipe. It should only be used when the full data has
+ already been received and is available in the input QByteArray or
+ QIODevice.
+//! [note-not-restartable]
+
+ \sa readString(), readStringChunk(), isString(), readAllByteArray()
+ */
+/*!
+ \fn QCborStreamReader::readAndAppendToString(QString &dst)
+ \since 6.7
+
+ Decodes the current text string and appends to \a dst. If the string is
+ chunked, this function will iterate over all chunks and concatenate them.
+ If an error happens during decoding, other chunks that could be decoded
+ successfully may have been written to \a dst nonetheless. Returns \c true
+ if the decoding happened without errors, \c false otherwise.
+
+ \include qcborstreamreader.cpp string-no-type-conversions
+
+ \include qcborstreamreader.cpp note-not-restartable
+
+ \sa readString(), readStringChunk(), isString(), readAndAppendToByteArray()
+ */
+bool QCborStreamReader::_readAndAppendToString_helper(QString &dst)
+{
+ bool ok = d->readFullString(&dst);
+ if (ok)
+ preparse();
+ return ok;
+}
+
+/*!
+ \fn QCborStreamReader::readAllUtf8String()
+ \since 6.7
+
+ Decodes the current text string and returns it. If the string is chunked,
+ this function will iterate over all chunks and concatenate them. If an
+ error happens, this function returns a default-constructed QString(), but
+ that may not be distinguishable from certain empty text strings. Instead,
+ check lastError() to determine if an error has happened.
+
+ \include qcborstreamreader.cpp string-no-type-conversions
+
+ \include qcborstreamreader.cpp note-not-restartable
+
+ \sa readString(), readStringChunk(), isString(), readAllByteArray()
+ */
+/*!
+ \fn QCborStreamReader::readAndAppendToUtf8String(QByteArray &dst)
+ \since 6.7
+
+ Decodes the current text string and appends to \a dst. If the string is
+ chunked, this function will iterate over all chunks and concatenate them.
+ If an error happens during decoding, other chunks that could be decoded
+ successfully may have been written to \a dst nonetheless. Returns \c true
+ if the decoding happened without errors, \c false otherwise.
+
+ \include qcborstreamreader.cpp string-no-type-conversions
+
+ \include qcborstreamreader.cpp note-not-restartable
+
+ \sa readString(), readStringChunk(), isString(), readAndAppendToByteArray()
+ */
+bool QCborStreamReader::_readAndAppendToUtf8String_helper(QByteArray &dst)
+{
+ using P = QCborStreamReaderPrivate::ReadStringChunk;
+ bool ok = d->readFullString({ &dst, P::Utf8String });
+ if (ok)
+ preparse();
+ return ok;
+}
+
+/*!
+ \fn QCborStreamReader::readAllByteArray()
+ \since 6.7
+
+ Decodes the current byte string and returns it. If the string is chunked,
+ this function will iterate over all chunks and concatenate them. If an
+ error happens, this function returns a default-constructed QByteArray(),
+ but that may not be distinguishable from certain empty byte strings.
+ Instead, check lastError() to determine if an error has happened.
+
+ \include qcborstreamreader.cpp bytearray-no-type-conversions
+
+ \include qcborstreamreader.cpp note-not-restartable
+
+ \sa readByteArray(), readStringChunk(), isByteArray(), readAllString()
+ */
+
+/*!
+ \fn QCborStreamReader::readAndAppendToByteArray(QByteArray &dst)
+ \since 6.7
+
+ Decodes the current byte string and appends to \a dst. If the string is
+ chunked, this function will iterate over all chunks and concatenate them.
+ If an error happens during decoding, other chunks that could be decoded
+ successfully may have been written to \a dst nonetheless. Returns \c true
+ if the decoding happened without errors, \c false otherwise.
+
+ \include qcborstreamreader.cpp bytearray-no-type-conversions
+
+ \include qcborstreamreader.cpp note-not-restartable
+
+ \sa readByteArray(), readStringChunk(), isByteArray(), readAndAppendToString()
+ */
+bool QCborStreamReader::_readAndAppendToByteArray_helper(QByteArray &dst)
+{
+ bool ok = d->readFullString(&dst);
+ if (ok)
+ preparse();
+ return ok;
+}
+
/*!
Reads the current string chunk into the buffer pointed to by \a ptr, whose
size is \a maxlen. This function returns a \l StringResult object, with the
@@ -1487,6 +1638,12 @@ QCborStreamReaderPrivate::readStringChunk(ReadStringChunk params)
// qt_cbor_decoder_transfer_string() enforces that
// QIODevice::bytesAvailable() be bigger than the amount we're about to
// read.
+ //
+ // This is an important security gate: if the CBOR stream is corrupt or
+ // malicious, and has an impossibly large string size, we only go past it
+ // if the transfer to the destination buffer will succeed (modulo QIODevice
+ // I/O failures).
+
#if 1
// Using internal TinyCBOR API!
err = _cbor_value_get_string_chunk(&currentElement, &content, &len, &currentElement);
@@ -1529,6 +1686,8 @@ QCborStreamReaderPrivate::readStringChunk(ReadStringChunk params)
if (params.isString()) {
// readString()
result.data = readStringChunk_unicode(params, qsizetype(len));
+ } else if (params.isUtf8String()) {
+ result.data = readStringChunk_utf8(params, qsizetype(len));
} else {
// readByteArray() or readStringChunk()
result.data = readStringChunk_byte(params, qsizetype(len));
@@ -1575,11 +1734,11 @@ QCborStreamReaderPrivate::readStringChunk_byte(ReadStringChunk params, qsizetype
else
toRead = params.maxlen_or_type; // buffer smaller than string
ptr = params.ptr;
- } else if (params.isByteArray()) {
+ } else if (!params.isString()) {
// See note above on having ensured there is enough incoming data.
auto oldSize = params.array->size();
auto newSize = oldSize;
- if (add_overflow<decltype(newSize)>(oldSize, toRead, &newSize)) {
+ if (qAddOverflow<decltype(newSize)>(oldSize, toRead, &newSize)) {
handleError(CborErrorDataTooLarge);
return -1;
}
@@ -1589,7 +1748,7 @@ QCborStreamReaderPrivate::readStringChunk_byte(ReadStringChunk params, qsizetype
// the distinction between DataTooLarge and OOM is mostly for
// compatibility with Qt 5; in Qt 6, we could consider everything
// to be OOM.
- handleError(newSize > MaxByteArraySize ? CborErrorDataTooLarge: CborErrorOutOfMemory);
+ handleError(newSize > QByteArray::max_size() ? CborErrorDataTooLarge: CborErrorOutOfMemory);
return -1;
}
@@ -1622,24 +1781,25 @@ QCborStreamReaderPrivate::readStringChunk_byte(ReadStringChunk params, qsizetype
inline qsizetype
QCborStreamReaderPrivate::readStringChunk_unicode(ReadStringChunk params, qsizetype utf8len)
{
+ Q_ASSERT(params.isString());
+
// See QUtf8::convertToUnicode() a detailed explanation of why this
// conversion uses the same number of words or less.
- QChar *begin = nullptr;
- if (params.isString()) {
- QT_TRY {
- params.string->resize(utf8len);
- } QT_CATCH (const std::bad_alloc &) {
- if (utf8len > MaxStringSize)
- handleError(CborErrorDataTooLarge);
- else
- handleError(CborErrorOutOfMemory);
- return -1;
- }
-
- begin = const_cast<QChar *>(params.string->constData());
+ qsizetype currentSize = params.string->size();
+ size_t newSize = size_t(utf8len) + size_t(currentSize); // can't overflow
+ if (utf8len > QString::max_size() || qsizetype(newSize) < 0) {
+ handleError(CborErrorDataTooLarge);
+ return -1;
+ }
+ QT_TRY {
+ params.string->resize(qsizetype(newSize));
+ } QT_CATCH (const std::bad_alloc &) {
+ handleError(CborErrorOutOfMemory);
+ return -1;
}
- QChar *ptr = begin;
+ QChar *begin = const_cast<QChar *>(params.string->constData());
+ QChar *ptr = begin + currentSize;
QStringConverter::State cs(QStringConverter::Flag::Stateless);
if (device == nullptr) {
// Easy case: we can decode straight from the buffer we already have
@@ -1671,9 +1831,25 @@ QCborStreamReaderPrivate::readStringChunk_unicode(ReadStringChunk params, qsizet
}
qsizetype size = ptr - begin;
- if (params.isString())
- params.string->truncate(size);
- return size;
+ params.string->truncate(ptr - begin);
+ return size - currentSize; // how many bytes we added
+}
+
+inline qsizetype
+QCborStreamReaderPrivate::readStringChunk_utf8(ReadStringChunk params, qsizetype utf8len)
+{
+ qsizetype result = readStringChunk_byte(params, utf8len);
+ if (result < 0)
+ return result;
+
+ // validate the UTF-8 content we've just read
+ QByteArrayView chunk = *params.array;
+ chunk = chunk.last(result);
+ if (QtPrivate::isValidUtf8(chunk))
+ return result;
+
+ handleError(CborErrorInvalidUtf8TextString);
+ return -1;
}
QT_END_NAMESPACE
diff --git a/src/corelib/serialization/qcborstreamreader.h b/src/corelib/serialization/qcborstreamreader.h
index 3665b09ea8..2666b7c7b2 100644
--- a/src/corelib/serialization/qcborstreamreader.h
+++ b/src/corelib/serialization/qcborstreamreader.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2018 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2018 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QCBORSTREAMREADER_H
#define QCBORSTREAMREADER_H
@@ -113,7 +77,10 @@ public:
void clear();
void reset();
+#if QT_CORE_REMOVED_SINCE(6, 7)
QCborError lastError();
+#endif
+ QCborError lastError() const;
qint64 currentOffset() const;
@@ -153,7 +120,14 @@ public:
bool enterContainer() { Q_ASSERT(isContainer()); return _enterContainer_helper(); }
bool leaveContainer();
+ bool readAndAppendToString(QString &dst)
+ { Q_ASSERT(isString()); return _readAndAppendToString_helper(dst); }
+ bool readAndAppendToUtf8String(QByteArray &dst)
+ { Q_ASSERT(isString()); return _readAndAppendToUtf8String_helper(dst); }
+ bool readAndAppendToByteArray(QByteArray &dst)
+ { Q_ASSERT(isByteArray()); return _readAndAppendToByteArray_helper(dst); }
StringResult<QString> readString() { Q_ASSERT(isString()); return _readString_helper(); }
+ StringResult<QByteArray> readUtf8String() { Q_ASSERT(isString()); return _readUtf8String_helper(); }
StringResult<QByteArray> readByteArray(){ Q_ASSERT(isByteArray()); return _readByteArray_helper(); }
qsizetype currentStringChunkSize() const{ Q_ASSERT(isString() || isByteArray()); return _currentStringChunkSize(); }
StringResult<qsizetype> readStringChunk(char *ptr, qsizetype maxlen);
@@ -175,13 +149,38 @@ public:
return -v - 1;
return v;
}
+ QString readAllString()
+ {
+ QString dst;
+ if (!readAndAppendToString(dst))
+ dst = QString{};
+ return dst;
+ }
+ QByteArray readAllUtf8String()
+ {
+ QByteArray dst;
+ if (!readAndAppendToUtf8String(dst))
+ dst = QByteArray{};
+ return dst;
+ }
+ QByteArray readAllByteArray()
+ {
+ QByteArray dst;
+ if (!readAndAppendToByteArray(dst))
+ dst = QByteArray{};
+ return dst;
+ }
private:
void preparse();
bool _enterContainer_helper();
StringResult<QString> _readString_helper();
+ StringResult<QByteArray> _readUtf8String_helper();
StringResult<QByteArray> _readByteArray_helper();
qsizetype _currentStringChunkSize() const;
+ bool _readAndAppendToString_helper(QString &);
+ bool _readAndAppendToUtf8String_helper(QByteArray &);
+ bool _readAndAppendToByteArray_helper(QByteArray &);
template <typename FP> FP _toFloatingPoint() const noexcept
{
diff --git a/src/corelib/serialization/qcborstreamwriter.cpp b/src/corelib/serialization/qcborstreamwriter.cpp
index d3c0066cca..7b5099567e 100644
--- a/src/corelib/serialization/qcborstreamwriter.cpp
+++ b/src/corelib/serialization/qcborstreamwriter.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2018 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2018 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qcborstreamwriter.h"
@@ -43,9 +7,11 @@
#include <private/qcborcommon_p.h>
#include <private/qnumeric_p.h>
+#include <private/qstringconverter_p.h>
#include <qbuffer.h>
#include <qdebug.h>
#include <qstack.h>
+#include <qvarlengtharray.h>
QT_BEGIN_NAMESPACE
@@ -65,14 +31,12 @@ QT_WARNING_POP
// but never defined
[[maybe_unused]] static CborError cbor_encoder_close_container_checked(CborEncoder*, const CborEncoder*)
{
- Q_UNREACHABLE();
- return CborErrorInternalError;
+ Q_UNREACHABLE_RETURN(CborErrorInternalError);
}
[[maybe_unused]] static CborError cbor_encode_float_as_half_float(CborEncoder *, float)
{
- Q_UNREACHABLE();
- return CborErrorInternalError;
+ Q_UNREACHABLE_RETURN(CborErrorInternalError);
}
Q_DECLARE_TYPEINFO(CborEncoder, Q_PRIMITIVE_TYPE);
@@ -81,6 +45,7 @@ Q_DECLARE_TYPEINFO(CborEncoder, Q_PRIMITIVE_TYPE);
\class QCborStreamWriter
\inmodule QtCore
\ingroup cbor
+ \ingroup qtserialization
\reentrant
\since 5.12
@@ -211,6 +176,8 @@ Q_DECLARE_TYPEINFO(CborEncoder, Q_PRIMITIVE_TYPE);
\endlist
\sa QCborStreamReader, QCborValue, QXmlStreamWriter
+ {Parsing and displaying CBOR data}, {Serialization Converter},
+ {Saving and Loading a Game}
*/
class QCborStreamWriterPrivate
@@ -449,11 +416,11 @@ void QCborStreamWriter::append(QCborNegativeInteger n)
/*!
\overload
- Appends the text string \a str to the stream, creating a CBOR Text String
- value. QCborStreamWriter will attempt to write the entire string in one
- chunk.
+ Appends the Latin-1 string viewed by \a str to the stream, creating a CBOR
+ Text String value. QCborStreamWriter will attempt to write the entire string
+ in one chunk.
- The following example appends a simple string to the stream:
+ The following example appends a simple Latin-1 string literal to the stream:
\snippet code/src_corelib_serialization_qcborstream.cpp 8
@@ -466,7 +433,7 @@ void QCborStreamWriter::append(QCborNegativeInteger n)
\sa QCborStreamReader::isString(), QCborStreamReader::readString()
*/
-void QCborStreamWriter::append(QLatin1String str)
+void QCborStreamWriter::append(QLatin1StringView str)
{
// We've got Latin-1 but CBOR wants UTF-8, so check if the string is the
// common subset (US-ASCII).
@@ -474,8 +441,10 @@ void QCborStreamWriter::append(QLatin1String str)
// it is plain US-ASCII
appendTextString(str.latin1(), str.size());
} else {
- // non-ASCII, so we need a pass-through UTF-16
- append(QString(str));
+ // non-ASCII, convert:
+ QVarLengthArray<char> utf8(str.size() * 2); // each L1 char gives at most two U8 units
+ const qsizetype written = QUtf8::convertFromLatin1(utf8.data(), str) - utf8.data();
+ appendTextString(utf8.data(), written);
}
}
@@ -639,11 +608,11 @@ void QCborStreamWriter::appendByteString(const char *data, qsizetype len)
The string pointed to by \a utf8 is expected to be properly encoded UTF-8.
QCborStreamWriter performs no validation that this is the case.
- Unlike the QLatin1String overload of append(), this function is not limited
+ Unlike the QLatin1StringView overload of append(), this function is not limited
to 2 GB. However, note that neither QCborStreamReader::readString() nor
QCborValue support reading CBOR streams with text strings larger than 2 GB.
- \sa append(QLatin1String), append(QStringView),
+ \sa append(QLatin1StringView), append(QStringView),
QCborStreamReader::isString(), QCborStreamReader::readString()
*/
void QCborStreamWriter::appendTextString(const char *utf8, qsizetype len)
@@ -663,11 +632,11 @@ void QCborStreamWriter::appendTextString(const char *utf8, qsizetype len)
The string pointed to by \a str is expected to be properly encoded UTF-8.
QCborStreamWriter performs no validation that this is the case.
- Unlike the QLatin1String overload of append(), this function is not limited
+ Unlike the QLatin1StringView overload of append(), this function is not limited
to 2 GB. However, note that neither QCborStreamReader nor QCborValue support
reading CBOR streams with text strings larger than 2 GB.
- \sa append(QLatin1String), append(QStringView),
+ \sa append(QLatin1StringView), append(QStringView),
QCborStreamReader::isString(), QCborStreamReader::readString()
*/
@@ -762,7 +731,8 @@ void QCborStreamWriter::startArray()
seem to allow up to 2\sup{64}-1 elements in the array. However, both
QCborStreamWriter and QCborStreamReader are currently limited to 2\sup{32}-2
items on 32-bit systems and 2\sup{64}-2 items on 64-bit ones. Also note that
- QCborArray is currently limited to 2\sup{27} elements in any platform.
+ QCborArray is currently limited to 2\sup{27} elements on 32-bit platforms and
+ 2\sup{59} elements on 64-bit ones.
\sa startArray(), endArray(), startMap(), QCborStreamReader::isArray(),
QCborStreamReader::isLengthKnown()
@@ -835,7 +805,8 @@ void QCborStreamWriter::startMap()
seem to allow up to 2\sup{64}-1 pairs in the map. However, both
QCborStreamWriter and QCborStreamReader are currently limited to 2\sup{31}-1
items on 32-bit systems and 2\sup{63}-1 items on 64-bit ones. Also note that
- QCborMap is currently limited to 2\sup{26} elements in any platform.
+ QCborMap is currently limited to 2\sup{26} elements on 32-bit platforms and
+ 2\sup{58} on 64-bit ones.
\sa startMap(), endMap(), startArray(), QCborStreamReader::isMap(),
QCborStreamReader::isLengthKnown()
@@ -865,3 +836,7 @@ bool QCborStreamWriter::endMap()
}
QT_END_NAMESPACE
+
+#undef CBOR_ENCODER_WRITER_CONTROL
+#undef CBOR_ENCODER_WRITE_FUNCTION
+#undef CBOR_ENCODER_NO_CHECK_USER
diff --git a/src/corelib/serialization/qcborstreamwriter.h b/src/corelib/serialization/qcborstreamwriter.h
index 9c2f9e81ab..1018646c99 100644
--- a/src/corelib/serialization/qcborstreamwriter.h
+++ b/src/corelib/serialization/qcborstreamwriter.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2018 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2018 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QCBORSTREAMWRITER_H
#define QCBORSTREAMWRITER_H
@@ -77,7 +41,7 @@ public:
void append(qint64 i);
void append(QCborNegativeInteger n);
void append(const QByteArray &ba) { appendByteString(ba.constData(), ba.size()); }
- void append(QLatin1String str);
+ void append(QLatin1StringView str);
void append(QStringView str);
void append(QCborTag tag);
void append(QCborKnownTags tag) { append(QCborTag(tag)); }
diff --git a/src/corelib/serialization/qcborvalue.cpp b/src/corelib/serialization/qcborvalue.cpp
index 562f363869..cd0b842111 100644
--- a/src/corelib/serialization/qcborvalue.cpp
+++ b/src/corelib/serialization/qcborvalue.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2022 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qcborvalue.h"
#include "qcborvalue_p.h"
@@ -53,7 +17,8 @@
#include <qendian.h>
#include <qlocale.h>
-#include <private/qbytearray_p.h>
+#include <qdatetime.h>
+#include <qtimezone.h>
#include <private/qnumeric_p.h>
#include <private/qsimd_p.h>
@@ -61,15 +26,33 @@
QT_BEGIN_NAMESPACE
+// Worst case memory allocation for a corrupt stream: 256 MB for 32-bit, 1 GB for 64-bit
+static constexpr quint64 MaxAcceptableMemoryUse = (sizeof(void*) == 4 ? 256 : 1024) * 1024 * 1024;
+
+// Internal limits to ensure we don't blow up the memory when parsing a corrupt
+// (possibly crafted to exploit) CBOR stream. The recursion impacts both the
+// maps/arrays we'll open when parsing and the thread's stack, as the parser is
+// itself recursive. If someone really needs more than 1024 layers of nesting,
+// they probably have a weird use-case for which custom parsing and
+// serialisation code would make sense. The limit on element count is the
+// preallocated limit: if the stream does actually have more elements, we will
+// grow the container.
+Q_DECL_UNUSED static constexpr int MaximumRecursionDepth = 1024;
+Q_DECL_UNUSED static constexpr quint64 MaximumPreallocatedElementCount =
+ MaxAcceptableMemoryUse / MaximumRecursionDepth / sizeof(QtCbor::Element) - 1;
+
/*!
\class QCborValue
\inmodule QtCore
\ingroup cbor
+ \ingroup qtserialization
\reentrant
\since 5.12
\brief The QCborValue class encapsulates a value in CBOR.
+ \compares strong
+
This class can be used to hold one of the many types available in CBOR.
CBOR is the Concise Binary Object Representation, a very compact form of
binary data encoding that is a superset of JSON. It was created by the IETF
@@ -209,8 +192,9 @@ QT_BEGIN_NAMESPACE
array or map it refers to will be modified with the new value. In all other
aspects, its API is identical to QCborValue.
- \sa QCborArray, QCborMap, QCborStreamReader, QCborStreamWriter
- QJsonValue, QJsonDocument
+ \sa QCborArray, QCborMap, QCborStreamReader, QCborStreamWriter,
+ QJsonValue, QJsonDocument, {Serialization Converter}, {Saving and Loading a Game}
+ {Parsing and displaying CBOR data}
*/
/*!
@@ -421,7 +405,7 @@ QT_BEGIN_NAMESPACE
/*!
\fn QCborValue::QCborValue(QCborSimpleType st)
- Creates a QCborValue of simple type \a st. The type can later later be retrieved
+ Creates a QCborValue of simple type \a st. The type can later be retrieved
using toSimpleType() as well as isSimpleType(st).
CBOR simple types are types that do not have any associated value, like
@@ -766,6 +750,17 @@ QT_BEGIN_NAMESPACE
using namespace QtCbor;
+static QCborContainerPrivate *assignContainer(QCborContainerPrivate *&d, QCborContainerPrivate *x)
+{
+ if (d == x)
+ return d;
+ if (d)
+ d->deref();
+ if (x)
+ x->ref.ref();
+ return d = x;
+}
+
static QCborValue::Type convertToExtendedType(QCborContainerPrivate *d)
{
qint64 tag = d->elements.at(0).value;
@@ -793,9 +788,9 @@ static QCborValue::Type convertToExtendedType(QCborContainerPrivate *d)
bool ok = false;
if (e.type == QCborValue::Integer) {
#if QT_POINTER_SIZE == 8
- // we don't have a fast 64-bit mul_overflow implementation on
+ // we don't have a fast 64-bit qMulOverflow implementation on
// 32-bit architectures.
- ok = !mul_overflow(e.value, qint64(1000), &msecs);
+ ok = !qMulOverflow(e.value, qint64(1000), &msecs);
#else
static const qint64 Limit = std::numeric_limits<qint64>::max() / 1000;
ok = (e.value > -Limit && e.value < Limit);
@@ -806,7 +801,7 @@ static QCborValue::Type convertToExtendedType(QCborContainerPrivate *d)
ok = convertDoubleTo(round(e.fpvalue() * 1000), &msecs);
}
if (ok)
- dt = QDateTime::fromMSecsSinceEpoch(msecs, Qt::UTC);
+ dt = QDateTime::fromMSecsSinceEpoch(msecs, QTimeZone::UTC);
}
if (dt.isValid()) {
QByteArray text = dt.toString(Qt::ISODateWithMs).toLatin1();
@@ -895,7 +890,7 @@ static void writeDoubleToCbor(QCborStreamWriter &writer, double d, QCborValue::E
// no data loss, we could use float
#ifndef QT_BOOTSTRAPPED
if ((opt & QCborValue::UseFloat16) == QCborValue::UseFloat16) {
- qfloat16 f16 = f;
+ qfloat16 f16 = qfloat16(f);
if (f16 == f)
return writer.append(f16);
}
@@ -909,12 +904,12 @@ static void writeDoubleToCbor(QCborStreamWriter &writer, double d, QCborValue::E
}
#endif // QT_CONFIG(cborstreamwriter)
-static inline int typeOrder(Element e1, Element e2)
+static inline int typeOrder(QCborValue::Type e1, QCborValue::Type e2)
{
- auto comparable = [](Element e) {
- if (e.type >= 0x10000) // see QCborValue::isTag_helper()
+ auto comparable = [](QCborValue::Type type) {
+ if (type >= 0x10000) // see QCborValue::isTag_helper()
return QCborValue::Tag;
- return e.type;
+ return type;
};
return comparable(e1) - comparable(e2);
}
@@ -928,14 +923,24 @@ QCborContainerPrivate::~QCborContainerPrivate()
}
}
-void QCborContainerPrivate::compact(qsizetype reserved)
+void QCborContainerPrivate::compact()
{
if (usedData > data.size() / 2)
return;
// 50% savings if we recreate the byte data
- // ### TBD
- Q_UNUSED(reserved);
+ QByteArray newData;
+ QByteArray::size_type newUsedData = 0;
+ // Compact only elements that have byte data.
+ // Nested containers will be compacted when their data changes.
+ for (auto &e : elements) {
+ if (e.flags & Element::HasByteData) {
+ if (const ByteData *b = byteData(e))
+ e.value = addByteDataImpl(newData, newUsedData, b->byte(), b->len);
+ }
+ }
+ data = newData;
+ usedData = newUsedData;
}
QCborContainerPrivate *QCborContainerPrivate::clone(QCborContainerPrivate *d, qsizetype reserved)
@@ -943,12 +948,17 @@ QCborContainerPrivate *QCborContainerPrivate::clone(QCborContainerPrivate *d, qs
if (!d) {
d = new QCborContainerPrivate;
} else {
- d = new QCborContainerPrivate(*d);
+ // in case QList::reserve throws
+ QExplicitlySharedDataPointer u(new QCborContainerPrivate(*d));
if (reserved >= 0) {
- d->elements.reserve(reserved);
- d->compact(reserved);
+ u->elements.reserve(reserved);
+ u->compact();
}
- for (auto &e : qAsConst(d->elements)) {
+
+ d = u.take();
+ d->ref.storeRelaxed(0);
+
+ for (auto &e : std::as_const(d->elements)) {
if (e.flags & Element::IsContainer)
e.container->ref.ref();
}
@@ -974,7 +984,7 @@ QCborContainerPrivate *QCborContainerPrivate::grow(QCborContainerPrivate *d, qsi
Q_ASSERT(index >= 0);
d = detach(d, index + 1);
Q_ASSERT(d);
- int j = d->elements.size();
+ qsizetype j = d->elements.size();
while (j++ < index)
d->append(Undefined());
return d;
@@ -1014,10 +1024,23 @@ void QCborContainerPrivate::replaceAt_complex(Element &e, const QCborValue &valu
// Copy string data, if any
if (const ByteData *b = value.container->byteData(value.n)) {
- if (this == value.container)
- e.value = addByteData(b->toByteArray(), b->len);
- else
+ const auto flags = e.flags;
+ // The element e has an invalid e.value, because it is copied from
+ // value. It means that calling compact() will trigger an assertion
+ // or just silently corrupt the data.
+ // Temporarily unset the Element::HasByteData flag in order to skip
+ // the element e in the call to compact().
+ e.flags = e.flags & ~Element::HasByteData;
+ if (this == value.container) {
+ const QByteArray valueData = b->toByteArray();
+ compact();
+ e.value = addByteData(valueData, valueData.size());
+ } else {
+ compact();
e.value = addByteData(b->byte(), b->len);
+ }
+ // restore the flags
+ e.flags = flags;
}
if (disp == MoveContainer)
@@ -1042,6 +1065,12 @@ Q_NEVER_INLINE void QCborContainerPrivate::appendAsciiString(QStringView s)
qt_to_latin1_unchecked(l, s.utf16(), len);
}
+void QCborContainerPrivate::appendNonAsciiString(QStringView s)
+{
+ appendByteData(reinterpret_cast<const char *>(s.utf16()), s.size() * 2,
+ QCborValue::String, QtCbor::Element::StringIsUtf16);
+}
+
QCborValue QCborContainerPrivate::extractAt_complex(Element e)
{
// create a new container for the returned value, containing the byte data
@@ -1054,7 +1083,7 @@ QCborValue QCborContainerPrivate::extractAt_complex(Element e)
// make a shallow copy of the byte data
container->appendByteData(b->byte(), b->len, e.type, e.flags);
usedData -= b->len + qsizetype(sizeof(*b));
- compact(elements.size());
+ compact();
} else {
// just share with the original byte data
container->data = data;
@@ -1065,9 +1094,127 @@ QCborValue QCborContainerPrivate::extractAt_complex(Element e)
return makeValue(e.type, 0, container);
}
+// Similar to QStringIterator::next() but returns malformed surrogate pair
+// itself when one is detected, and returns the length in UTF-8.
+static auto nextUtf32Character(const char16_t *&ptr, const char16_t *end) noexcept
+{
+ Q_ASSERT(ptr != end);
+ struct R {
+ char32_t c;
+ qsizetype len = 1; // in UTF-8 code units (bytes)
+ } r = { *ptr++ };
+
+ if (r.c < 0x0800) {
+ if (r.c >= 0x0080)
+ ++r.len;
+ } else if (!QChar::isHighSurrogate(r.c) || ptr == end) {
+ r.len += 2;
+ } else {
+ r.len += 3;
+ r.c = QChar::surrogateToUcs4(r.c, *ptr++);
+ }
+
+ return r;
+}
+
+static qsizetype stringLengthInUtf8(const char16_t *ptr, const char16_t *end) noexcept
+{
+ qsizetype len = 0;
+ while (ptr < end)
+ len += nextUtf32Character(ptr, end).len;
+ return len;
+}
+
+static int compareStringsInUtf8(QStringView lhs, QStringView rhs, Comparison mode) noexcept
+{
+ if (mode == Comparison::ForEquality)
+ return lhs == rhs ? 0 : 1;
+
+ // The UTF-16 length is *usually* comparable, but not always. There are
+ // pathological cases where they can be wrong, so we need to compare as if
+ // we were doing it in UTF-8. That includes the case of UTF-16 surrogate
+ // pairs, because qstring.cpp sorts them before U+E000-U+FFFF.
+ int diff = 0;
+ qsizetype len1 = 0;
+ qsizetype len2 = 0;
+ const char16_t *src1 = lhs.utf16();
+ const char16_t *src2 = rhs.utf16();
+ const char16_t *end1 = src1 + lhs.size();
+ const char16_t *end2 = src2 + rhs.size();
+
+ // first, scan until we find a difference (if any)
+ do {
+ auto r1 = nextUtf32Character(src1, end1);
+ auto r2 = nextUtf32Character(src2, end2);
+ len1 += r1.len;
+ len2 += r2.len;
+ diff = int(r1.c) - int(r2.c); // no underflow due to limited range
+ } while (src1 < end1 && src2 < end2 && diff == 0);
+
+ // compute the full length past this first difference
+ len1 += stringLengthInUtf8(src1, end1);
+ len2 += stringLengthInUtf8(src2, end2);
+ if (len1 == len2)
+ return diff;
+ return len1 < len2 ? -1 : 1;
+}
+
+static int compareStringsInUtf8(QUtf8StringView lhs, QStringView rhs, Comparison mode) noexcept
+{
+ // CBOR requires that the shortest of the two strings be sorted first, so
+ // we have to calculate the UTF-8 length of the UTF-16 string while
+ // comparing. Unlike the UTF-32 comparison above, we convert the UTF-16
+ // string to UTF-8 so we only need to decode one string.
+
+ const qsizetype len1 = lhs.size();
+ const auto src1 = reinterpret_cast<const uchar *>(lhs.data());
+ const char16_t *src2 = rhs.utf16();
+ const char16_t *const end2 = src2 + rhs.size();
+
+ // Compare the two strings until we find a difference.
+ int diff = 0;
+ qptrdiff idx1 = 0;
+ qsizetype len2 = 0;
+ do {
+ uchar utf8[4]; // longest possible Unicode character in UTF-8
+ uchar *ptr = utf8;
+ char16_t uc = *src2++;
+ int r = QUtf8Functions::toUtf8<QUtf8BaseTraits>(uc, ptr, src2, end2);
+ Q_UNUSED(r); // ignore failure to encode proper UTF-16 surrogates
+
+ qptrdiff n = ptr - utf8;
+ len2 += n;
+ if (len1 - idx1 < n)
+ return -1; // lhs is definitely shorter
+ diff = memcmp(src1 + idx1, utf8, n);
+ idx1 += n;
+ } while (diff == 0 && idx1 < len1 && src2 < end2);
+
+ if (mode == Comparison::ForEquality && diff)
+ return diff;
+ if ((idx1 == len1) != (src2 == end2)) {
+ // One of the strings ended earlier than the other
+ return idx1 == len1 ? -1 : 1;
+ }
+
+ // We found a difference and neither string ended, so continue calculating
+ // the UTF-8 length of rhs.
+ len2 += stringLengthInUtf8(src2, end2);
+
+ if (len1 != len2)
+ return len1 < len2 ? -1 : 1;
+ return diff;
+}
+
+static int compareStringsInUtf8(QStringView lhs, QUtf8StringView rhs, Comparison mode) noexcept
+{
+ return -compareStringsInUtf8(rhs, lhs, mode);
+}
+
QT_WARNING_DISABLE_MSVC(4146) // unary minus operator applied to unsigned type, result still unsigned
-static int compareContainer(const QCborContainerPrivate *c1, const QCborContainerPrivate *c2);
-static int compareElementNoData(const Element &e1, const Element &e2)
+static int compareContainer(const QCborContainerPrivate *c1, const QCborContainerPrivate *c2,
+ Comparison mode) noexcept;
+static int compareElementNoData(const Element &e1, const Element &e2) noexcept
{
Q_ASSERT(e1.type == e2.type);
@@ -1111,15 +1258,16 @@ static int compareElementNoData(const Element &e1, const Element &e2)
}
static int compareElementRecursive(const QCborContainerPrivate *c1, const Element &e1,
- const QCborContainerPrivate *c2, const Element &e2)
+ const QCborContainerPrivate *c2, const Element &e2,
+ Comparison mode) noexcept
{
- int cmp = typeOrder(e1, e2);
+ int cmp = typeOrder(e1.type, e2.type);
if (cmp != 0)
return cmp;
if ((e1.flags & Element::IsContainer) || (e2.flags & Element::IsContainer))
return compareContainer(e1.flags & Element::IsContainer ? e1.container : nullptr,
- e2.flags & Element::IsContainer ? e2.container : nullptr);
+ e2.flags & Element::IsContainer ? e2.container : nullptr, mode);
// string data?
const ByteData *b1 = c1 ? c1->byteData(e1) : nullptr;
@@ -1127,11 +1275,6 @@ static int compareElementRecursive(const QCborContainerPrivate *c1, const Elemen
if (b1 || b2) {
auto len1 = b1 ? b1->len : 0;
auto len2 = b2 ? b2->len : 0;
-
- if (e1.flags & Element::StringIsUtf16)
- len1 /= 2;
- if (e2.flags & Element::StringIsUtf16)
- len2 /= 2;
if (len1 == 0 || len2 == 0)
return len1 < len2 ? -1 : len1 == len2 ? 0 : 1;
@@ -1140,58 +1283,37 @@ static int compareElementRecursive(const QCborContainerPrivate *c1, const Elemen
Q_ASSERT(b2);
// Officially with CBOR, we sort first the string with the shortest
- // UTF-8 length. The length of an ASCII string is the same as its UTF-8
- // and UTF-16 ones, but the UTF-8 length of a string is bigger than the
- // UTF-16 equivalent. Combinations are:
- // 1) UTF-16 and UTF-16
- // 2) UTF-16 and UTF-8 <=== this is the problem case
- // 3) UTF-16 and US-ASCII
- // 4) UTF-8 and UTF-8
- // 5) UTF-8 and US-ASCII
- // 6) US-ASCII and US-ASCII
- if ((e1.flags & Element::StringIsUtf16) && (e2.flags & Element::StringIsUtf16)) {
- // Case 1: both UTF-16, so lengths are comparable.
- // (we can't use memcmp in little-endian machines)
- if (len1 == len2)
- return QtPrivate::compareStrings(b1->asStringView(), b2->asStringView());
- return len1 < len2 ? -1 : 1;
- }
+ // UTF-8 length. Since US-ASCII is just a subset of UTF-8, its length
+ // is the UTF-8 length. But the UTF-16 length may not be directly
+ // comparable.
+ if ((e1.flags & Element::StringIsUtf16) && (e2.flags & Element::StringIsUtf16))
+ return compareStringsInUtf8(b1->asStringView(), b2->asStringView(), mode);
if (!(e1.flags & Element::StringIsUtf16) && !(e2.flags & Element::StringIsUtf16)) {
- // Cases 4, 5 and 6: neither is UTF-16, so lengths are comparable too
+ // Neither is UTF-16, so lengths are comparable too
// (this case includes byte arrays too)
- if (len1 == len2)
+ if (len1 == len2) {
+ if (mode == Comparison::ForEquality) {
+ // GCC optimizes this to __memcmpeq(); Clang to bcmp()
+ return memcmp(b1->byte(), b2->byte(), size_t(len1)) == 0 ? 0 : 1;
+ }
return memcmp(b1->byte(), b2->byte(), size_t(len1));
+ }
return len1 < len2 ? -1 : 1;
}
- if (!(e1.flags & Element::StringIsAscii) || !(e2.flags & Element::StringIsAscii)) {
- // Case 2: one of them is UTF-8 and the other is UTF-16, so lengths
- // are NOT comparable. We need to convert to UTF-16 first...
- // (we can't use QUtf8::compareUtf8 because we need to compare lengths)
- auto string = [](const Element &e, const ByteData *b) {
- return e.flags & Element::StringIsUtf16 ? b->asQStringRaw() : b->toUtf8String();
- };
-
- QString s1 = string(e1, b1);
- QString s2 = string(e2, b2);
- if (s1.size() == s2.size())
- return s1.compare(s2);
- return s1.size() < s2.size() ? -1 : 1;
- }
-
- // Case 3 (UTF-16 and US-ASCII) remains, so lengths are comparable again
- if (len1 != len2)
- return len1 < len2 ? -1 : 1;
+ // Only one is UTF-16
if (e1.flags & Element::StringIsUtf16)
- return QtPrivate::compareStrings(b1->asStringView(), b2->asLatin1());
- return QtPrivate::compareStrings(b1->asLatin1(), b2->asStringView());
+ return compareStringsInUtf8(b1->asStringView(), b2->asUtf8StringView(), mode);
+ else
+ return compareStringsInUtf8(b1->asUtf8StringView(), b2->asStringView(), mode);
}
return compareElementNoData(e1, e2);
}
-static int compareContainer(const QCborContainerPrivate *c1, const QCborContainerPrivate *c2)
+static int compareContainer(const QCborContainerPrivate *c1, const QCborContainerPrivate *c2,
+ Comparison mode) noexcept
{
auto len1 = c1 ? c1->elements.size() : 0;
auto len2 = c2 ? c2->elements.size() : 0;
@@ -1203,7 +1325,7 @@ static int compareContainer(const QCborContainerPrivate *c1, const QCborContaine
for (qsizetype i = 0; i < len1; ++i) {
const Element &e1 = c1->elements.at(i);
const Element &e2 = c2->elements.at(i);
- int cmp = QCborContainerPrivate::compareElement_helper(c1, e1, c2, e2);
+ int cmp = compareElementRecursive(c1, e1, c2, e2, mode);
if (cmp)
return cmp;
}
@@ -1212,15 +1334,16 @@ static int compareContainer(const QCborContainerPrivate *c1, const QCborContaine
}
inline int QCborContainerPrivate::compareElement_helper(const QCborContainerPrivate *c1, Element e1,
- const QCborContainerPrivate *c2, Element e2)
+ const QCborContainerPrivate *c2, Element e2,
+ Comparison mode) noexcept
{
- return compareElementRecursive(c1, e1, c2, e2);
+ return compareElementRecursive(c1, e1, c2, e2, mode);
}
/*!
- \fn bool QCborValue::operator==(const QCborValue &other) const
+ \fn bool QCborValue::operator==(const QCborValue &lhs, const QCborValue &rhs)
- Compares this value and \a other, and returns true if they hold the same
+ Compares \a lhs and \a rhs, and returns true if they hold the same
contents, false otherwise. If each QCborValue contains an array or map, the
comparison is recursive to elements contained in them.
@@ -1231,9 +1354,9 @@ inline int QCborContainerPrivate::compareElement_helper(const QCborContainerPriv
*/
/*!
- \fn bool QCborValue::operator!=(const QCborValue &other) const
+ \fn bool QCborValue::operator!=(const QCborValue &lhs, const QCborValue &rhs)
- Compares this value and \a other, and returns true if contents differ,
+ Compares \a lhs and \a rhs, and returns true if contents differ,
false otherwise. If each QCborValue contains an array or map, the comparison
is recursive to elements contained in them.
@@ -1242,12 +1365,20 @@ inline int QCborContainerPrivate::compareElement_helper(const QCborContainerPriv
\sa compare(), QCborValue::operator==(), QCborMap::operator==(),
operator==(), operator<()
*/
+bool comparesEqual(const QCborValue &lhs,
+ const QCborValue &rhs) noexcept
+{
+ Element e1 = QCborContainerPrivate::elementFromValue(lhs);
+ Element e2 = QCborContainerPrivate::elementFromValue(rhs);
+ return compareElementRecursive(lhs.container, e1, rhs.container, e2,
+ Comparison::ForEquality) == 0;
+}
/*!
- \fn bool QCborValue::operator<(const QCborValue &other) const
+ \fn bool QCborValue::operator<(const QCborValue &lhs, const QCborValue &rhs)
- Compares this value and \a other, and returns true if this value should be
- sorted before \a other, false otherwise. If each QCborValue contains an
+ Compares \a lhs and \a rhs, and returns true if \a lhs should be
+ sorted before \a rhs, false otherwise. If each QCborValue contains an
array or map, the comparison is recursive to elements contained in them.
For more information on CBOR sorting order, see QCborValue::compare().
@@ -1257,6 +1388,47 @@ inline int QCborContainerPrivate::compareElement_helper(const QCborContainerPriv
*/
/*!
+ \fn bool QCborValue::operator<=(const QCborValue &lhs, const QCborValue &rhs)
+
+ Compares \a lhs and \a rhs, and returns true if \a lhs should be
+ sorted before \a rhs or is being equal to \a rhs, false otherwise.
+ If each QCborValue contains an array or map, the comparison is recursive
+ to elements contained in them.
+
+ For more information on CBOR sorting order, see QCborValue::compare().
+
+ \sa compare(), QCborValue::operator<(), QCborMap::operator==(),
+ operator==(), operator!=()
+*/
+
+/*!
+ \fn bool QCborValue::operator>(const QCborValue &lhs, const QCborValue &rhs)
+
+ Compares \a lhs and \a rhs, and returns true if \a lhs should be
+ sorted after \a rhs, false otherwise. If each QCborValue contains an
+ array or map, the comparison is recursive to elements contained in them.
+
+ For more information on CBOR sorting order, see QCborValue::compare().
+
+ \sa compare(), QCborValue::operator>=(), QCborMap::operator==(),
+ operator==(), operator!=()
+*/
+
+/*!
+ \fn bool QCborValue::operator>=(const QCborValue &lhs, const QCborValue &rhs)
+
+ Compares \a lhs and \a rhs, and returns true if \a lhs should be
+ sorted after \a rhs or is being equal to \a rhs, false otherwise.
+ If each QCborValue contains an array or map, the comparison is recursive
+ to elements contained in them.
+
+ For more information on CBOR sorting order, see QCborValue::compare().
+
+ \sa compare(), QCborValue::operator>(), QCborMap::operator==(),
+ operator==(), operator!=()
+*/
+
+/*!
Compares this value and \a other, and returns an integer that indicates
whether this value should be sorted prior to (if the result is negative) or
after \a other (if the result is positive). If this function returns 0, the
@@ -1321,17 +1493,59 @@ int QCborValue::compare(const QCborValue &other) const
{
Element e1 = QCborContainerPrivate::elementFromValue(*this);
Element e2 = QCborContainerPrivate::elementFromValue(other);
- return compareElementRecursive(container, e1, other.container, e2);
+ return compareElementRecursive(container, e1, other.container, e2, Comparison::ForOrdering);
+}
+
+bool comparesEqual(const QCborArray &lhs, const QCborArray &rhs) noexcept
+{
+ return compareContainer(lhs.d.constData(), rhs.d.constData(), Comparison::ForEquality) == 0;
}
int QCborArray::compare(const QCborArray &other) const noexcept
{
- return compareContainer(d.data(), other.d.data());
+ return compareContainer(d.data(), other.d.data(), Comparison::ForOrdering);
+}
+
+bool QCborArray::comparesEqual_helper(const QCborArray &lhs, const QCborValue &rhs) noexcept
+{
+ if (typeOrder(QCborValue::Array, rhs.type()))
+ return false;
+ return compareContainer(lhs.d.constData(), rhs.container, Comparison::ForEquality) == 0;
+}
+
+Qt::strong_ordering
+QCborArray::compareThreeWay_helper(const QCborArray &lhs, const QCborValue &rhs) noexcept
+{
+ int c = typeOrder(QCborValue::Array, rhs.type());
+ if (c == 0)
+ c = compareContainer(lhs.d.constData(), rhs.container, Comparison::ForOrdering);
+ return Qt::compareThreeWay(c, 0);
+}
+
+bool comparesEqual(const QCborMap &lhs, const QCborMap &rhs) noexcept
+{
+ return compareContainer(lhs.d.constData(), rhs.d.constData(), Comparison::ForEquality) == 0;
}
int QCborMap::compare(const QCborMap &other) const noexcept
{
- return compareContainer(d.data(), other.d.data());
+ return compareContainer(d.data(), other.d.data(), Comparison::ForOrdering);
+}
+
+bool QCborMap::comparesEqual_helper(const QCborMap &lhs, const QCborValue &rhs) noexcept
+{
+ if (typeOrder(QCborValue::Map, rhs.type()))
+ return false;
+ return compareContainer(lhs.d.constData(), rhs.container, Comparison::ForEquality) == 0;
+}
+
+Qt::strong_ordering
+QCborMap::compareThreeWay_helper(const QCborMap &lhs, const QCborValue &rhs) noexcept
+{
+ int c = typeOrder(QCborValue::Map, rhs.type());
+ if (c == 0)
+ c = compareContainer(lhs.d.constData(), rhs.container, Comparison::ForOrdering);
+ return Qt::compareThreeWay(c, 0);
}
#if QT_CONFIG(cborstreamwriter)
@@ -1384,7 +1598,7 @@ static void encodeToCbor(QCborStreamWriter &writer, const QCborContainerPrivate
return writer.append(b->asStringView());
return writer.appendTextString(b->byte(), b->len);
}
- return writer.append(QLatin1String());
+ return writer.append(QLatin1StringView());
case QCborValue::Array:
case QCborValue::Map:
@@ -1483,6 +1697,19 @@ static Element decodeBasicValueFromCbor(QCborStreamReader &reader)
return e;
}
+// Clamp allocation to avoid crashing due to corrupt stream. This also
+// ensures we never overflow qsizetype. The returned length is doubled for Map
+// entries to account for key-value pairs.
+static qsizetype clampedContainerLength(const QCborStreamReader &reader)
+{
+ if (!reader.isLengthKnown())
+ return 0;
+ int mapShift = reader.isMap() ? 1 : 0;
+ quint64 shiftedMaxElements = MaximumPreallocatedElementCount >> mapShift;
+ qsizetype len = qsizetype(qMin(reader.length(), shiftedMaxElements));
+ return len << mapShift;
+}
+
static inline QCborContainerPrivate *createContainerFromCbor(QCborStreamReader &reader, int remainingRecursionDepth)
{
if (Q_UNLIKELY(remainingRecursionDepth == 0)) {
@@ -1491,33 +1718,27 @@ static inline QCborContainerPrivate *createContainerFromCbor(QCborStreamReader &
}
QCborContainerPrivate *d = nullptr;
- int mapShift = reader.isMap() ? 1 : 0;
- if (reader.isLengthKnown()) {
- quint64 len = reader.length();
-
- // Clamp allocation to 1M elements (avoids crashing due to corrupt
- // stream or loss of precision when converting from quint64 to
- // QList::size_type).
- len = qMin(len, quint64(1024 * 1024 - 1));
- if (len) {
- d = new QCborContainerPrivate;
- d->ref.storeRelaxed(1);
- d->elements.reserve(qsizetype(len) << mapShift);
- }
- } else {
- d = new QCborContainerPrivate;
- d->ref.storeRelaxed(1);
+ {
+ // in case QList::reserve throws
+ QExplicitlySharedDataPointer u(new QCborContainerPrivate);
+ if (qsizetype len = clampedContainerLength(reader))
+ u->elements.reserve(len);
+ d = u.take();
}
reader.enterContainer();
- if (reader.lastError() != QCborError::NoError)
+ if (reader.lastError() != QCborError::NoError) {
+ d->elements.clear();
return d;
+ }
while (reader.hasNext() && reader.lastError() == QCborError::NoError)
d->decodeValueFromCbor(reader, remainingRecursionDepth - 1);
if (reader.lastError() == QCborError::NoError)
reader.leaveContainer();
+ else
+ d->elements.squeeze();
return d;
}
@@ -1587,7 +1808,7 @@ void QCborContainerPrivate::decodeStringFromCbor(QCborStreamReader &reader)
// add space for aligned ByteData (this can't overflow)
offset += sizeof(QtCbor::ByteData) + alignof(QtCbor::ByteData);
offset &= ~(alignof(QtCbor::ByteData) - 1);
- if (offset > size_t(MaxByteArraySize)) {
+ if (offset > size_t(QByteArray::max_size())) {
// overflow
setErrorInReader(reader, { QCborError::DataTooLarge });
return;
@@ -1600,9 +1821,9 @@ void QCborContainerPrivate::decodeStringFromCbor(QCborStreamReader &reader)
// so capa how much we allocate
newCapacity = offset + MaxMemoryIncrement - EstimatedOverhead;
}
- if (newCapacity > size_t(MaxByteArraySize)) {
+ if (newCapacity > size_t(QByteArray::max_size())) {
// this may cause an allocation failure
- newCapacity = MaxByteArraySize;
+ newCapacity = QByteArray::max_size();
}
if (newCapacity > size_t(data.capacity()))
data.reserve(newCapacity);
@@ -1653,7 +1874,7 @@ void QCborContainerPrivate::decodeStringFromCbor(QCborStreamReader &reader)
// check that this UTF-8 text string can be loaded onto a QString
if (e.type == QCborValue::String) {
- if (Q_UNLIKELY(b->len > MaxStringSize)) {
+ if (Q_UNLIKELY(b->len > QString::max_size())) {
setErrorInReader(reader, { QCborError::DataTooLarge });
status = QCborStreamReader::Error;
}
@@ -1713,7 +1934,6 @@ QCborValue::QCborValue(const QByteArray &ba)
container->ref.storeRelaxed(1);
}
-#if QT_STRINGVIEW_LEVEL < 2
/*!
Creates a QCborValue with string value \a s. The value can later be
retrieved using toString().
@@ -1721,7 +1941,6 @@ QCborValue::QCborValue(const QByteArray &ba)
\sa toString(), isString(), isByteArray()
*/
QCborValue::QCborValue(const QString &s) : QCborValue(qToStringViewIgnoringNull(s)) {}
-#endif
/*!
Creates a QCborValue with string value \a s. The value can later be
@@ -1739,12 +1958,12 @@ QCborValue::QCborValue(QStringView s)
/*!
\overload
- Creates a QCborValue with string value \a s. The value can later be
- retrieved using toString().
+ Creates a QCborValue with the Latin-1 string viewed by \a s.
+ The value can later be retrieved using toString().
\sa toString(), isString(), isByteArray()
*/
-QCborValue::QCborValue(QLatin1String s)
+QCborValue::QCborValue(QLatin1StringView s)
: n(0), container(new QCborContainerPrivate), t(String)
{
container->append(s);
@@ -1805,7 +2024,7 @@ QCborValue::QCborValue(QCborTag tag, const QCborValue &tv)
/*!
Copies the contents of \a other into this object.
*/
-QCborValue::QCborValue(const QCborValue &other)
+QCborValue::QCborValue(const QCborValue &other) noexcept
: n(other.n), container(other.container), t(other.t)
{
if (container)
@@ -1850,7 +2069,6 @@ QCborValue::QCborValue(const QUrl &url)
t = Url;
container->elements[1].type = String;
}
-#endif
#if QT_CONFIG(regularexpression)
/*!
@@ -1889,6 +2107,7 @@ QCborValue::QCborValue(const QUuid &uuid)
// change our type
t = Uuid;
}
+#endif
// destructor
void QCborValue::dispose()
@@ -1899,15 +2118,10 @@ void QCborValue::dispose()
/*!
Replaces the contents of this QCborObject with a copy of \a other.
*/
-QCborValue &QCborValue::operator=(const QCborValue &other)
+QCborValue &QCborValue::operator=(const QCborValue &other) noexcept
{
- if (other.container)
- other.container->ref.ref();
- if (container)
- container->deref();
-
n = other.n;
- container = other.container;
+ assignContainer(container, other.container);
t = other.t;
return *this;
}
@@ -2025,7 +2239,6 @@ QUrl QCborValue::toUrl(const QUrl &defaultValue) const
return QUrl::fromEncoded(byteData->asByteArrayView());
}
-#endif
#if QT_CONFIG(regularexpression)
/*!
@@ -2068,6 +2281,7 @@ QUuid QCborValue::toUuid(const QUuid &defaultValue) const
return QUuid::fromRfc4122(byteData->asByteArrayView());
}
+#endif
/*!
\fn QCborArray QCborValue::toArray() const
@@ -2108,7 +2322,8 @@ QCborArray QCborValue::toArray(const QCborArray &defaultValue) const
Q_ASSERT(n == -1 || container == nullptr);
if (n < 0)
dd = container;
- return dd ? QCborArray(*dd) : defaultValue;
+ // return QCborArray(*dd); but that's UB if dd is nullptr
+ return dd ? QCborArray(*dd) : QCborArray();
}
/*!
@@ -2150,7 +2365,8 @@ QCborMap QCborValue::toMap(const QCborMap &defaultValue) const
Q_ASSERT(n == -1 || container == nullptr);
if (n < 0)
dd = container;
- return dd ? QCborMap(*dd) : defaultValue;
+ // return QCborMap(*dd); but that's UB if dd is nullptr
+ return dd ? QCborMap(*dd) : QCborMap();
}
/*!
@@ -2167,9 +2383,7 @@ QCborMap QCborValue::toMap(const QCborMap &defaultValue) const
*/
const QCborValue QCborValue::operator[](const QString &key) const
{
- if (isMap())
- return toMap().value(key);
- return QCborValue();
+ return QCborContainerPrivate::findCborMapKey(*this, qToStringViewIgnoringNull(key));
}
/*!
@@ -2186,11 +2400,9 @@ const QCborValue QCborValue::operator[](const QString &key) const
\sa operator[](qint64), QCborMap::operator[], QCborMap::value(),
QCborMap::find()
*/
-const QCborValue QCborValue::operator[](QLatin1String key) const
+const QCborValue QCborValue::operator[](QLatin1StringView key) const
{
- if (isMap())
- return toMap().value(key);
- return QCborValue();
+ return QCborContainerPrivate::findCborMapKey(*this, key);
}
/*!
@@ -2206,44 +2418,53 @@ const QCborValue QCborValue::operator[](QLatin1String key) const
*/
const QCborValue QCborValue::operator[](qint64 key) const
{
- if (isMap())
- return toMap().value(key);
- if (isArray())
- return toArray().at(key);
- return QCborValue();
+ if (isArray() && container && quint64(key) < quint64(container->elements.size()))
+ return container->valueAt(key);
+ return QCborContainerPrivate::findCborMapKey(*this, key);
}
-/*!
- \internal
- */
-static Q_DECL_COLD_FUNCTION QCborMap arrayAsMap(const QCborArray &array)
-{
- if (array.size())
- qWarning("Using CBOR array as map forced conversion");
- QCborMap map;
- for (qsizetype i = array.size(); i-- > 0; ) {
- QCborValue entry = array.at(i);
- // Ignore padding entries that may have been added to grow the array
- // when inserting past its end:
- if (!entry.isInvalid())
- map[i] = entry;
- }
- return map;
+static bool shouldArrayRemainArray(qint64 key, QCborValue::Type t, QCborContainerPrivate *container)
+{
+ constexpr qint64 LargeKey = 0x10000;
+ if (t != QCborValue::Array)
+ return false;
+ if (key < 0)
+ return false; // negative keys can't be an array index
+ if (key < LargeKey)
+ return true;
+
+ // Only convert to map if key is greater than array size + 1
+ qsizetype currentSize = container ? container->elements.size() : 0;
+ return key <= currentSize;
}
/*!
\internal
*/
-static QCborContainerPrivate *maybeDetach(QCborContainerPrivate *container, qsizetype size)
+static void convertArrayToMap(QCborContainerPrivate *&array)
{
- auto replace = QCborContainerPrivate::detach(container, size);
- Q_ASSERT(replace);
- if (replace != container) {
- if (container)
- container->deref();
- replace->ref.ref();
+ if (Q_LIKELY(!array || array->elements.isEmpty()))
+ return;
+
+ // The Q_LIKELY and the qWarning mark the rest of this function as unlikely
+ qWarning("Using CBOR array as map forced conversion");
+
+ qsizetype size = array->elements.size();
+ QCborContainerPrivate *map = QCborContainerPrivate::detach(array, size * 2);
+ map->elements.resize(size * 2);
+
+ // this may be an in-place copy, so we have to do it from the end
+ auto dst = map->elements.begin();
+ auto src = array->elements.constBegin();
+ for (qsizetype i = size - 1; i >= 0; --i) {
+ Q_ASSERT(src->type != QCborValue::Invalid);
+ dst[i * 2 + 1] = src[i];
}
- return replace;
+ for (qsizetype i = 0; i < size; ++i)
+ dst[i * 2] = { i, QCborValue::Integer };
+
+ // update reference counts
+ assignContainer(array, map);
}
/*!
@@ -2253,16 +2474,48 @@ static QCborContainerPrivate *maybeGrow(QCborContainerPrivate *container, qsizet
{
auto replace = QCborContainerPrivate::grow(container, index);
Q_ASSERT(replace);
- if (replace != container) {
- if (container)
- container->deref();
- replace->ref.ref();
- }
if (replace->elements.size() == index)
replace->append(Undefined());
else
Q_ASSERT(replace->elements.size() > index);
- return replace;
+ return assignContainer(container, replace);
+}
+
+template <typename KeyType> inline QCborValueRef
+QCborContainerPrivate::findOrAddMapKey(QCborValue &self, KeyType key)
+{
+ // we need a map, so convert if necessary
+ if (self.isArray())
+ convertArrayToMap(self.container);
+ else if (!self.isMap())
+ self = QCborValue(QCborValue::Map);
+ self.t = QCborValue::Map;
+ self.n = -1;
+
+ QCborValueRef result = findOrAddMapKey<KeyType>(self.container, key);
+ assignContainer(self.container, result.d);
+ return result;
+}
+
+template<typename KeyType> QCborValueRef
+QCborContainerPrivate::findOrAddMapKey(QCborValueRef self, KeyType key)
+{
+ auto &e = self.d->elements[self.i];
+
+ // we need a map, so convert if necessary
+ if (e.type == QCborValue::Array) {
+ convertArrayToMap(e.container);
+ } else if (e.type != QCborValue::Map) {
+ if (e.flags & QtCbor::Element::IsContainer)
+ e.container->deref();
+ e.container = nullptr;
+ }
+ e.flags = QtCbor::Element::IsContainer;
+ e.type = QCborValue::Map;
+
+ QCborValueRef result = findOrAddMapKey<KeyType>(e.container, key);
+ assignContainer(e.container, result.d);
+ return result;
}
/*!
@@ -2280,30 +2533,7 @@ static QCborContainerPrivate *maybeGrow(QCborContainerPrivate *container, qsizet
*/
QCborValueRef QCborValue::operator[](const QString &key)
{
- if (!isMap())
- *this = QCborValue(isArray() ? arrayAsMap(toArray()) : QCborMap());
-
- const qsizetype size = container ? container->elements.size() : 0;
- qsizetype index = size + 1;
- bool found = false;
- if (container) {
- QCborMap proxy(*container);
- auto it = proxy.constFind(key);
- if (it < proxy.constEnd()) {
- found = true;
- index = it.item.i;
- }
- }
-
- container = maybeDetach(container, size + (found ? 0 : 2));
- Q_ASSERT(container);
- if (!found) {
- container->append(key);
- container->append(QCborValue());
- }
- Q_ASSERT(index & 1 && !(container->elements.size() & 1));
- Q_ASSERT(index < container->elements.size());
- return { container, index };
+ return QCborContainerPrivate::findOrAddMapKey(*this, qToStringViewIgnoringNull(key));
}
/*!
@@ -2321,32 +2551,9 @@ QCborValueRef QCborValue::operator[](const QString &key)
\sa operator[](qint64), QCborMap::operator[], QCborMap::value(),
QCborMap::find()
*/
-QCborValueRef QCborValue::operator[](QLatin1String key)
+QCborValueRef QCborValue::operator[](QLatin1StringView key)
{
- if (!isMap())
- *this = QCborValue(isArray() ? arrayAsMap(toArray()) : QCborMap());
-
- const qsizetype size = container ? container->elements.size() : 0;
- qsizetype index = size + 1;
- bool found = false;
- if (container) {
- QCborMap proxy(*container);
- auto it = proxy.constFind(key);
- if (it < proxy.constEnd()) {
- found = true;
- index = it.item.i;
- }
- }
-
- container = maybeDetach(container, size + (found ? 0 : 2));
- Q_ASSERT(container);
- if (!found) {
- container->append(key);
- container->append(QCborValue());
- }
- Q_ASSERT(index & 1 && !(container->elements.size() & 1));
- Q_ASSERT(index < container->elements.size());
- return { container, index };
+ return QCborContainerPrivate::findOrAddMapKey(*this, key);
}
/*!
@@ -2367,40 +2574,14 @@ QCborValueRef QCborValue::operator[](QLatin1String key)
*/
QCborValueRef QCborValue::operator[](qint64 key)
{
- if (isArray() && key >= 0 && key < 0x10000) {
+ if (shouldArrayRemainArray(key, t, container)) {
container = maybeGrow(container, key);
return { container, qsizetype(key) };
}
- if (!isMap())
- *this = QCborValue(isArray() ? arrayAsMap(toArray()) : QCborMap());
-
- const qsizetype size = container ? container->elements.size() : 0;
- Q_ASSERT(!(size & 1));
- qsizetype index = size + 1;
- bool found = false;
- if (container) {
- QCborMap proxy(*container);
- auto it = proxy.constFind(key);
- if (it < proxy.constEnd()) {
- found = true;
- index = it.item.i;
- }
- }
-
- container = maybeDetach(container, size + (found ? 0 : 2));
- Q_ASSERT(container);
- if (!found) {
- container->append(key);
- container->append(QCborValue());
- }
- Q_ASSERT(index & 1 && !(container->elements.size() & 1));
- Q_ASSERT(index < container->elements.size());
- return { container, index };
+ return QCborContainerPrivate::findOrAddMapKey(*this, key);
}
#if QT_CONFIG(cborstreamreader)
-enum { MaximumRecursionDepth = 1024 };
-
/*!
Decodes one item from the CBOR stream found in \a reader and returns the
equivalent representation. This function is recursive: if the item is a map
@@ -2636,10 +2817,12 @@ Q_NEVER_INLINE void QCborValue::toCbor(QCborStreamWriter &writer, EncodingOption
}
}
+# if QT_VERSION < QT_VERSION_CHECK(7, 0, 0) && !defined(QT_BOOTSTRAPPED)
void QCborValueRef::toCbor(QCborStreamWriter &writer, QCborValue::EncodingOptions opt)
{
concrete().toCbor(writer, opt);
}
+# endif
#endif // QT_CONFIG(cborstreamwriter)
void QCborValueRef::assign(QCborValueRef that, const QCborValue &other)
@@ -2658,6 +2841,151 @@ void QCborValueRef::assign(QCborValueRef that, const QCborValueRef other)
that = other.concrete();
}
+bool QCborValueConstRef::concreteBoolean(QCborValueConstRef self, bool defaultValue) noexcept
+{
+ QtCbor::Element e = self.d->elements.at(self.i);
+ if (e.type != QCborValue::False && e.type != QCborValue::True)
+ return defaultValue;
+ return e.type == QCborValue::True;
+}
+
+double QCborValueConstRef::concreteDouble(QCborValueConstRef self, double defaultValue) noexcept
+{
+ QtCbor::Element e = self.d->elements.at(self.i);
+ if (e.type == QCborValue::Integer)
+ return e.value;
+ if (e.type != QCborValue::Double)
+ return defaultValue;
+ return e.fpvalue();
+}
+
+qint64 QCborValueConstRef::concreteIntegral(QCborValueConstRef self, qint64 defaultValue) noexcept
+{
+ QtCbor::Element e = self.d->elements.at(self.i);
+ QCborValue::Type t = e.type;
+ if (t == QCborValue::Double)
+ return e.fpvalue();
+ if (t != QCborValue::Integer)
+ return defaultValue;
+ return e.value;
+}
+
+QByteArray QCborValueConstRef::concreteByteArray(QCborValueConstRef self,
+ const QByteArray &defaultValue)
+{
+ QtCbor::Element e = self.d->elements.at(self.i);
+ if (e.type != QCborValue::ByteArray)
+ return defaultValue;
+ return self.d->byteArrayAt(self.i);
+}
+
+QString QCborValueConstRef::concreteString(QCborValueConstRef self, const QString &defaultValue)
+{
+ QtCbor::Element e = self.d->elements.at(self.i);
+ if (e.type != QCborValue::String)
+ return defaultValue;
+ return self.d->stringAt(self.i);
+}
+
+bool
+QCborValueConstRef::comparesEqual_helper(QCborValueConstRef lhs, QCborValueConstRef rhs) noexcept
+{
+ QtCbor::Element e1 = lhs.d->elements.at(lhs.i);
+ QtCbor::Element e2 = rhs.d->elements.at(rhs.i);
+ return compareElementRecursive(lhs.d, e1, rhs.d, e2, Comparison::ForEquality) == 0;
+}
+
+Qt::strong_ordering
+QCborValueConstRef::compareThreeWay_helper(QCborValueConstRef lhs, QCborValueConstRef rhs) noexcept
+{
+ QtCbor::Element e1 = lhs.d->elements.at(lhs.i);
+ QtCbor::Element e2 = rhs.d->elements.at(rhs.i);
+ int c = compareElementRecursive(lhs.d, e1, rhs.d, e2, Comparison::ForOrdering);
+ return Qt::compareThreeWay(c, 0);
+}
+
+bool
+QCborValueConstRef::comparesEqual_helper(QCborValueConstRef lhs, const QCborValue &rhs) noexcept
+{
+ QtCbor::Element e1 = lhs.d->elements.at(lhs.i);
+ QtCbor::Element e2 = QCborContainerPrivate::elementFromValue(rhs);
+ return compareElementRecursive(lhs.d, e1, rhs.container, e2, Comparison::ForEquality) == 0;
+}
+
+Qt::strong_ordering
+QCborValueConstRef::compareThreeWay_helper(QCborValueConstRef lhs, const QCborValue &rhs) noexcept
+{
+ QtCbor::Element e1 = lhs.d->elements.at(lhs.i);
+ QtCbor::Element e2 = QCborContainerPrivate::elementFromValue(rhs);
+ int c = compareElementRecursive(lhs.d, e1, rhs.container, e2, Comparison::ForOrdering);
+ return Qt::compareThreeWay(c, 0);
+}
+
+bool QCborArray::comparesEqual_helper(const QCborArray &lhs, QCborValueConstRef rhs) noexcept
+{
+ QtCbor::Element e2 = rhs.d->elements.at(rhs.i);
+ if (typeOrder(QCborValue::Array, e2.type))
+ return false;
+ return compareContainer(lhs.d.constData(), e2.container, Comparison::ForEquality) == 0;
+}
+
+Qt::strong_ordering
+QCborArray::compareThreeWay_helper(const QCborArray &lhs, QCborValueConstRef rhs) noexcept
+{
+ QtCbor::Element e2 = rhs.d->elements.at(rhs.i);
+ int c = typeOrder(QCborValue::Array, e2.type);
+ if (c == 0)
+ c = compareContainer(lhs.d.constData(), e2.container, Comparison::ForOrdering);
+ return Qt::compareThreeWay(c, 0);
+}
+
+bool QCborMap::comparesEqual_helper(const QCborMap &lhs, QCborValueConstRef rhs) noexcept
+{
+ QtCbor::Element e2 = rhs.d->elements.at(rhs.i);
+ if (typeOrder(QCborValue::Array, e2.type))
+ return false;
+ return compareContainer(lhs.d.constData(), e2.container, Comparison::ForEquality) == 0;
+}
+
+Qt::strong_ordering
+QCborMap::compareThreeWay_helper(const QCborMap &lhs, QCborValueConstRef rhs) noexcept
+{
+ QtCbor::Element e2 = rhs.d->elements.at(rhs.i);
+ int c = typeOrder(QCborValue::Map, e2.type);
+ if (c == 0)
+ c = compareContainer(lhs.d.constData(), e2.container, Comparison::ForOrdering);
+ return Qt::compareThreeWay(c, 0);
+}
+
+QCborValue QCborValueConstRef::concrete(QCborValueConstRef self) noexcept
+{
+ return self.d->valueAt(self.i);
+}
+
+QCborValue::Type QCborValueConstRef::concreteType(QCborValueConstRef self) noexcept
+{
+ return self.d->elements.at(self.i).type;
+}
+
+const QCborValue QCborValueConstRef::operator[](const QString &key) const
+{
+ const QCborValue item = d->valueAt(i);
+ return item[key];
+}
+
+const QCborValue QCborValueConstRef::operator[](const QLatin1StringView key) const
+{
+ const QCborValue item = d->valueAt(i);
+ return item[key];
+}
+
+const QCborValue QCborValueConstRef::operator[](qint64 key) const
+{
+ const QCborValue item = d->valueAt(i);
+ return item[key];
+}
+
+#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0) && !defined(QT_BOOTSTRAPPED)
QCborValue QCborValueRef::concrete(QCborValueRef self) noexcept
{
return self.d->valueAt(self.i);
@@ -2684,8 +3012,7 @@ QCborValue::Type QCborValueRef::concreteType(QCborValueRef self) noexcept
*/
const QCborValue QCborValueRef::operator[](const QString &key) const
{
- const QCborValue item = d->valueAt(i);
- return item[key];
+ return QCborValueConstRef::operator[](key);
}
/*!
@@ -2704,10 +3031,9 @@ const QCborValue QCborValueRef::operator[](const QString &key) const
\sa operator[](qint64), QCborMap::operator[], QCborMap::value(),
QCborMap::find()
*/
-const QCborValue QCborValueRef::operator[](QLatin1String key) const
+const QCborValue QCborValueRef::operator[](QLatin1StringView key) const
{
- const QCborValue item = d->valueAt(i);
- return item[key];
+ return QCborValueConstRef::operator[](key);
}
/*!
@@ -2724,8 +3050,7 @@ const QCborValue QCborValueRef::operator[](QLatin1String key) const
*/
const QCborValue QCborValueRef::operator[](qint64 key) const
{
- const QCborValue item = d->valueAt(i);
- return item[key];
+ return QCborValueConstRef::operator[](key);
}
/*!
@@ -2744,48 +3069,7 @@ const QCborValue QCborValueRef::operator[](qint64 key) const
*/
QCborValueRef QCborValueRef::operator[](const QString &key)
{
- auto &e = d->elements[i];
- qsizetype size = 0;
- if (e.flags & QtCbor::Element::IsContainer) {
- if (e.container) {
- if (e.type == QCborValue::Array) {
- QCborValue repack = QCborValue(arrayAsMap(QCborArray(*e.container)));
- qSwap(e.container, repack.container);
- } else if (e.type != QCborValue::Map) {
- e.container->deref();
- e.container = nullptr;
- }
- }
- e.type = QCborValue::Map;
- if (e.container)
- size = e.container->elements.size();
- } else {
- // Stomp any prior e.value, replace with a map (that we'll grow)
- e.container = nullptr;
- e.type = QCborValue::Map;
- e.flags = QtCbor::Element::IsContainer;
- }
-
- qsizetype index = size + 1;
- bool found = false;
- if (e.container) {
- QCborMap proxy(*e.container);
- auto it = proxy.constFind(key);
- if (it < proxy.constEnd()) {
- found = true;
- index = it.item.i;
- }
- }
-
- e.container = maybeDetach(e.container, size + (found ? 0 : 2));
- Q_ASSERT(e.container);
- if (!found) {
- e.container->append(key);
- e.container->append(QCborValue());
- }
- Q_ASSERT(index & 1 && !(e.container->elements.size() & 1));
- Q_ASSERT(index < e.container->elements.size());
- return { e.container, index };
+ return QCborContainerPrivate::findOrAddMapKey(*this, qToStringViewIgnoringNull(key));
}
/*!
@@ -2803,50 +3087,9 @@ QCborValueRef QCborValueRef::operator[](const QString &key)
\sa operator[](qint64), QCborMap::operator[], QCborMap::value(),
QCborMap::find()
*/
-QCborValueRef QCborValueRef::operator[](QLatin1String key)
+QCborValueRef QCborValueRef::operator[](QLatin1StringView key)
{
- auto &e = d->elements[i];
- qsizetype size = 0;
- if (e.flags & QtCbor::Element::IsContainer) {
- if (e.container) {
- if (e.type == QCborValue::Array) {
- QCborValue repack = QCborValue(arrayAsMap(QCborArray(*e.container)));
- qSwap(e.container, repack.container);
- } else if (e.type != QCborValue::Map) {
- e.container->deref();
- e.container = nullptr;
- }
- }
- e.type = QCborValue::Map;
- if (e.container)
- size = e.container->elements.size();
- } else {
- // Stomp any prior e.value, replace with a map (that we'll grow)
- e.container = nullptr;
- e.type = QCborValue::Map;
- e.flags = QtCbor::Element::IsContainer;
- }
-
- qsizetype index = size + 1;
- bool found = false;
- if (e.container) {
- QCborMap proxy(*e.container);
- auto it = proxy.constFind(key);
- if (it < proxy.constEnd()) {
- found = true;
- index = it.item.i;
- }
- }
-
- e.container = maybeDetach(e.container, size + (found ? 0 : 2));
- Q_ASSERT(e.container);
- if (!found) {
- e.container->append(key);
- e.container->append(QCborValue());
- }
- Q_ASSERT(index & 1 && !(e.container->elements.size() & 1));
- Q_ASSERT(index < e.container->elements.size());
- return { e.container, index };
+ return QCborContainerPrivate::findOrAddMapKey(*this, key);
}
/*!
@@ -2868,54 +3111,14 @@ QCborValueRef QCborValueRef::operator[](QLatin1String key)
QCborValueRef QCborValueRef::operator[](qint64 key)
{
auto &e = d->elements[i];
- if (e.type == QCborValue::Array && key >= 0 && key < 0x10000) {
+ if (shouldArrayRemainArray(key, e.type, e.container)) {
e.container = maybeGrow(e.container, key);
+ e.flags |= QtCbor::Element::IsContainer;
return { e.container, qsizetype(key) };
}
- qsizetype size = 0;
- if (e.flags & QtCbor::Element::IsContainer) {
- if (e.container) {
- if (e.type == QCborValue::Array) {
- QCborValue repack = QCborValue(arrayAsMap(QCborArray(*e.container)));
- qSwap(e.container, repack.container);
- } else if (e.type != QCborValue::Map) {
- e.container->deref();
- e.container = nullptr;
- }
- }
- e.type = QCborValue::Map;
- if (e.container)
- size = e.container->elements.size();
- } else {
- // Stomp any prior e.value, replace with a map (that we'll grow)
- e.container = nullptr;
- e.type = QCborValue::Map;
- e.flags = QtCbor::Element::IsContainer;
- }
- Q_ASSERT(!(size & 1));
-
- qsizetype index = size + 1;
- bool found = false;
- if (e.container) {
- QCborMap proxy(*e.container);
- auto it = proxy.constFind(key);
- if (it < proxy.constEnd()) {
- found = true;
- index = it.item.i;
- }
- }
-
- e.container = maybeDetach(e.container, size + (found ? 0 : 2));
- Q_ASSERT(e.container);
- if (!found) {
- e.container->append(key);
- e.container->append(QCborValue());
- }
- Q_ASSERT(index & 1 && !(e.container->elements.size() & 1));
- Q_ASSERT(index < e.container->elements.size());
- return { e.container, index };
+ return QCborContainerPrivate::findOrAddMapKey(*this, key);
}
-
+#endif // < Qt 7
inline QCborArray::QCborArray(QCborContainerPrivate &dd) noexcept
: d(&dd)
@@ -2963,13 +3166,13 @@ size_t qHash(const QCborValue &value, size_t seed)
#ifndef QT_BOOTSTRAPPED
case QCborValue::Url:
return qHash(value.toUrl(), seed);
-#endif
-#if QT_CONFIG(regularexpression)
+# if QT_CONFIG(regularexpression)
case QCborValue::RegularExpression:
return qHash(value.toRegularExpression(), seed);
-#endif
+# endif
case QCborValue::Uuid:
return qHash(value.toUuid(), seed);
+#endif
case QCborValue::Invalid:
return seed;
default:
diff --git a/src/corelib/serialization/qcborvalue.h b/src/corelib/serialization/qcborvalue.h
index 9a26c9ab66..93adbec344 100644
--- a/src/corelib/serialization/qcborvalue.h
+++ b/src/corelib/serialization/qcborvalue.h
@@ -1,48 +1,13 @@
-/****************************************************************************
-**
-** Copyright (C) 2018 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2022 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QCBORVALUE_H
#define QCBORVALUE_H
#include <QtCore/qbytearray.h>
-#include <QtCore/qdatetime.h>
#include <QtCore/qcborcommon.h>
+#include <QtCore/qcompare.h>
+#include <QtCore/qdatetime.h>
#if QT_CONFIG(regularexpression)
# include <QtCore/qregularexpression.h>
#endif
@@ -58,10 +23,6 @@
# undef False
#endif
-#if 0 && __has_include(<compare>)
-# include <compare>
-#endif
-
QT_BEGIN_NAMESPACE
class QCborArray;
@@ -146,11 +107,9 @@ public:
QCborValue(QCborSimpleType st) : t(type_helper(st)) {}
QCborValue(const QByteArray &ba);
-#if QT_STRINGVIEW_LEVEL < 2
QCborValue(const QString &s);
-#endif
QCborValue(QStringView s);
- QCborValue(QLatin1String s);
+ QCborValue(QLatin1StringView s);
#ifndef QT_NO_CAST_FROM_ASCII
QT_ASCII_CAST_WARN QCborValue(const char *s) : QCborValue(QString::fromUtf8(s)) {}
#endif
@@ -166,30 +125,30 @@ public:
explicit QCborValue(const QDateTime &dt);
#ifndef QT_BOOTSTRAPPED
explicit QCborValue(const QUrl &url);
-#endif
-#if QT_CONFIG(regularexpression)
+# if QT_CONFIG(regularexpression)
explicit QCborValue(const QRegularExpression &rx);
-#endif
+# endif
explicit QCborValue(const QUuid &uuid);
+#endif
~QCborValue() { if (container) dispose(); }
// make sure const char* doesn't go call the bool constructor
QCborValue(const void *) = delete;
- QCborValue(const QCborValue &other);
+ QCborValue(const QCborValue &other) noexcept;
QCborValue(QCborValue &&other) noexcept
- : n(other.n), container(qExchange(other.container, nullptr)), t(qExchange(other.t, Undefined))
+ : n(other.n), container(std::exchange(other.container, nullptr)), t(std::exchange(other.t, Undefined))
{
}
- QCborValue &operator=(const QCborValue &other);
+ QCborValue &operator=(const QCborValue &other) noexcept;
QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_MOVE_AND_SWAP(QCborValue)
void swap(QCborValue &other) noexcept
{
- qSwap(n, other.n);
- qSwap(container, other.container);
- qSwap(t, other.t);
+ std::swap(n, other.n);
+ qt_ptr_swap(container, other.container);
+ std::swap(t, other.t);
}
Type type() const { return t; }
@@ -238,11 +197,13 @@ public:
QByteArray toByteArray(const QByteArray &defaultValue = {}) const;
QString toString(const QString &defaultValue = {}) const;
QDateTime toDateTime(const QDateTime &defaultValue = {}) const;
+#ifndef QT_BOOTSTRAPPED
QUrl toUrl(const QUrl &defaultValue = {}) const;
-#if QT_CONFIG(regularexpression)
+# if QT_CONFIG(regularexpression)
QRegularExpression toRegularExpression(const QRegularExpression &defaultValue = {}) const;
-#endif
+# endif
QUuid toUuid(const QUuid &defaultValue = {}) const;
+#endif
// only forward-declared, need split functions
QCborArray toArray() const;
@@ -251,26 +212,18 @@ public:
QCborMap toMap(const QCborMap &defaultValue) const;
const QCborValue operator[](const QString &key) const;
- const QCborValue operator[](QLatin1String key) const;
+ const QCborValue operator[](QLatin1StringView key) const;
const QCborValue operator[](qint64 key) const;
QCborValueRef operator[](qint64 key);
- QCborValueRef operator[](QLatin1String key);
+ QCborValueRef operator[](QLatin1StringView key);
QCborValueRef operator[](const QString & key);
int compare(const QCborValue &other) const;
-#if 0 && __has_include(<compare>)
- std::strong_ordering operator<=>(const QCborValue &other) const
- {
- int c = compare(other);
- if (c > 0) return std::partial_ordering::greater;
- if (c == 0) return std::partial_ordering::equivalent;
- return std::partial_ordering::less;
- }
-#else
+#if QT_CORE_REMOVED_SINCE(6, 8)
bool operator==(const QCborValue &other) const noexcept
{ return compare(other) == 0; }
bool operator!=(const QCborValue &other) const noexcept
- { return !(*this == other); }
+ { return !operator==(other); }
bool operator<(const QCborValue &other) const
{ return compare(other) < 0; }
#endif
@@ -296,6 +249,19 @@ public:
QString toDiagnosticNotation(DiagnosticNotationOptions opts = Compact) const;
private:
+ friend Q_CORE_EXPORT Q_DECL_PURE_FUNCTION
+ bool comparesEqual(const QCborValue &lhs, const QCborValue &rhs) noexcept;
+ friend Qt::strong_ordering compareThreeWay(const QCborValue &lhs,
+ const QCborValue &rhs) noexcept
+ {
+ int c = lhs.compare(rhs);
+ return Qt::compareThreeWay(c, 0);
+ }
+
+ Q_DECLARE_STRONGLY_ORDERED(QCborValue)
+ friend class QCborArray;
+ friend class QCborMap;
+ friend class QCborValueConstRef;
friend class QCborValueRef;
friend class QCborContainerPrivate;
friend class QJsonPrivate::Value;
@@ -330,11 +296,160 @@ private:
};
Q_DECLARE_SHARED(QCborValue)
-class Q_CORE_EXPORT QCborValueRef
+class QCborValueConstRef
{
public:
+ QCborValueConstRef(const QCborValueConstRef &) = default;
+ QCborValueConstRef &operator=(const QCborValueConstRef &) = delete;
operator QCborValue() const { return concrete(); }
+ QCborValue::Type type() const { return concreteType(*this); }
+ bool isInteger() const { return type() == QCborValue::Integer; }
+ bool isByteArray() const { return type() == QCborValue::ByteArray; }
+ bool isString() const { return type() == QCborValue::String; }
+ bool isArray() const { return type() == QCborValue::Array; }
+ bool isMap() const { return type() == QCborValue::Map; }
+ bool isTag() const { return concrete().isTag(); }
+ bool isFalse() const { return type() == QCborValue::False; }
+ bool isTrue() const { return type() == QCborValue::True; }
+ bool isBool() const { return isFalse() || isTrue(); }
+ bool isNull() const { return type() == QCborValue::Null; }
+ bool isUndefined() const { return type() == QCborValue::Undefined; }
+ bool isDouble() const { return type() == QCborValue::Double; }
+ bool isDateTime() const { return type() == QCborValue::DateTime; }
+ bool isUrl() const { return type() == QCborValue::Url; }
+ bool isRegularExpression() const { return type() == QCborValue::RegularExpression; }
+ bool isUuid() const { return type() == QCborValue::Uuid; }
+ bool isInvalid() const { return type() == QCborValue::Invalid; }
+ bool isContainer() const { return isMap() || isArray(); }
+ bool isSimpleType() const { return concrete().isSimpleType(); }
+ bool isSimpleType(QCborSimpleType st) const { return concrete().isSimpleType(st); }
+
+ QCborSimpleType toSimpleType(QCborSimpleType defaultValue = QCborSimpleType::Undefined) const
+ {
+ return concrete().toSimpleType(defaultValue);
+ }
+
+ QCborTag tag(QCborTag defaultValue = QCborTag(-1)) const
+ { return concrete().tag(defaultValue); }
+ QCborValue taggedValue(const QCborValue &defaultValue = QCborValue()) const
+ { return concrete().taggedValue(defaultValue); }
+
+ qint64 toInteger(qint64 defaultValue = 0) const
+ { return concrete().toInteger(defaultValue); }
+ bool toBool(bool defaultValue = false) const
+ { return concrete().toBool(defaultValue); }
+ double toDouble(double defaultValue = 0) const
+ { return concrete().toDouble(defaultValue); }
+
+ QByteArray toByteArray(const QByteArray &defaultValue = {}) const
+ { return concrete().toByteArray(defaultValue); }
+ QString toString(const QString &defaultValue = {}) const
+ { return concrete().toString(defaultValue); }
+ QDateTime toDateTime(const QDateTime &defaultValue = {}) const
+ { return concrete().toDateTime(defaultValue); }
+#ifndef QT_BOOTSTRAPPED
+ QUrl toUrl(const QUrl &defaultValue = {}) const
+ { return concrete().toUrl(defaultValue); }
+# if QT_CONFIG(regularexpression)
+ QRegularExpression toRegularExpression(const QRegularExpression &defaultValue = {}) const
+ { return concrete().toRegularExpression(defaultValue); }
+# endif
+ QUuid toUuid(const QUuid &defaultValue = {}) const
+ { return concrete().toUuid(defaultValue); }
+#endif
+
+ // only forward-declared, need split functions. Implemented in qcbor{array,map}.h
+ inline QCborArray toArray() const;
+ inline QCborArray toArray(const QCborArray &a) const;
+ inline QCborMap toMap() const;
+ inline QCborMap toMap(const QCborMap &m) const;
+
+ Q_CORE_EXPORT const QCborValue operator[](const QString &key) const;
+ Q_CORE_EXPORT const QCborValue operator[](QLatin1StringView key) const;
+ Q_CORE_EXPORT const QCborValue operator[](qint64 key) const;
+
+ int compare(const QCborValue &other) const
+ { return concrete().compare(other); }
+
+ QVariant toVariant() const { return concrete().toVariant(); }
+ inline QJsonValue toJsonValue() const; // in qjsonvalue.h
+
+#if QT_CONFIG(cborstreamwriter)
+ QByteArray toCbor(QCborValue::EncodingOptions opt = QCborValue::NoTransformation) const
+ { return concrete().toCbor(opt); }
+ void toCbor(QCborStreamWriter &writer, QCborValue::EncodingOptions opt = QCborValue::NoTransformation) const
+ { return concrete().toCbor(writer, opt); }
+#endif
+
+ QString toDiagnosticNotation(QCborValue::DiagnosticNotationOptions opt = QCborValue::Compact) const
+ { return concrete().toDiagnosticNotation(opt); }
+
+protected:
+ friend class QCborValue;
+ friend class QCborArray;
+ friend class QCborMap;
+ friend class QCborContainerPrivate;
+
+ QCborValue concrete() const noexcept { return concrete(*this); }
+ static Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool
+ comparesEqual_helper(QCborValueConstRef lhs, QCborValueConstRef rhs) noexcept;
+ static Q_CORE_EXPORT Q_DECL_PURE_FUNCTION Qt::strong_ordering
+ compareThreeWay_helper(QCborValueConstRef lhs, QCborValueConstRef rhs) noexcept;
+ friend bool comparesEqual(const QCborValueConstRef &lhs,
+ const QCborValueConstRef &rhs) noexcept
+ {
+ return comparesEqual_helper(lhs, rhs);
+ }
+ friend Qt::strong_ordering compareThreeWay(const QCborValueConstRef &lhs,
+ const QCborValueConstRef &rhs) noexcept
+ {
+ return compareThreeWay_helper(lhs, rhs);
+ }
+ Q_DECLARE_STRONGLY_ORDERED(QCborValueConstRef)
+
+ static Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool
+ comparesEqual_helper(QCborValueConstRef lhs, const QCborValue &rhs) noexcept;
+ static Q_CORE_EXPORT Q_DECL_PURE_FUNCTION Qt::strong_ordering
+ compareThreeWay_helper(QCborValueConstRef lhs, const QCborValue &rhs) noexcept;
+ friend bool comparesEqual(const QCborValueConstRef &lhs,
+ const QCborValue &rhs) noexcept
+ {
+ return comparesEqual_helper(lhs, rhs);
+ }
+ friend Qt::strong_ordering compareThreeWay(const QCborValueConstRef &lhs,
+ const QCborValue &rhs) noexcept
+ {
+ return compareThreeWay_helper(lhs, rhs);
+ }
+ Q_DECLARE_STRONGLY_ORDERED(QCborValueConstRef, QCborValue)
+
+ static Q_CORE_EXPORT QCborValue concrete(QCborValueConstRef that) noexcept;
+ static Q_CORE_EXPORT QCborValue::Type concreteType(QCborValueConstRef that) noexcept Q_DECL_PURE_FUNCTION;
+ static Q_CORE_EXPORT bool
+ concreteBoolean(QCborValueConstRef that, bool defaultValue) noexcept Q_DECL_PURE_FUNCTION;
+ static Q_CORE_EXPORT double
+ concreteDouble(QCborValueConstRef that, double defaultValue) noexcept Q_DECL_PURE_FUNCTION;
+ static Q_CORE_EXPORT qint64
+ concreteIntegral(QCborValueConstRef that, qint64 defaultValue) noexcept Q_DECL_PURE_FUNCTION;
+ static Q_CORE_EXPORT QByteArray
+ concreteByteArray(QCborValueConstRef that, const QByteArray &defaultValue);
+ static Q_CORE_EXPORT QString
+ concreteString(QCborValueConstRef that, const QString &defaultValue);
+
+ constexpr QCborValueConstRef() : d(nullptr), i(0) {} // this will actually be invalid
+ constexpr QCborValueConstRef(QCborContainerPrivate *dd, qsizetype ii)
+ : d(dd), i(ii)
+ {}
+ QCborContainerPrivate *d;
+ qsizetype i;
+};
+
+QT_WARNING_PUSH
+QT6_ONLY(QT_WARNING_DISABLE_MSVC(4275)) // non dll-interface class 'QJsonValueConstRef' used as base for dll-interface class 'QJsonValueRef'
+class QT6_ONLY(Q_CORE_EXPORT) QCborValueRef : public QCborValueConstRef
+{
+public:
QCborValueRef(const QCborValueRef &) noexcept = default;
QCborValueRef(QCborValueRef &&) noexcept = default;
QCborValueRef &operator=(const QCborValue &other)
@@ -344,6 +459,15 @@ public:
QCborValueRef &operator=(const QCborValueRef &other)
{ assign(*this, other); return *this; }
+ QT7_ONLY(Q_CORE_EXPORT) QCborValueRef operator[](qint64 key);
+ QT7_ONLY(Q_CORE_EXPORT) QCborValueRef operator[](QLatin1StringView key);
+ QT7_ONLY(Q_CORE_EXPORT) QCborValueRef operator[](const QString & key);
+
+#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0) && !defined(QT_BOOTSTRAPPED)
+ // retained for binary compatibility (due to the Q_CORE_EXPORT) because at
+ // least one compiler emits and exports all inlines in an exported class
+
+ operator QCborValue() const { return concrete(); }
QCborValue::Type type() const { return concreteType(); }
bool isInteger() const { return type() == QCborValue::Integer; }
bool isByteArray() const { return type() == QCborValue::ByteArray; }
@@ -371,6 +495,10 @@ public:
{
return type() == QCborValue::type_helper(st);
}
+ QCborSimpleType toSimpleType(QCborSimpleType defaultValue = QCborSimpleType::Undefined) const
+ {
+ return isSimpleType() ? QCborSimpleType(type() & 0xff) : defaultValue;
+ }
QCborTag tag(QCborTag defaultValue = QCborTag(-1)) const
{ return concrete().tag(defaultValue); }
@@ -378,28 +506,28 @@ public:
{ return concrete().taggedValue(defaultValue); }
qint64 toInteger(qint64 defaultValue = 0) const
- { return concrete().toInteger(defaultValue); }
+ { return concreteIntegral(*this, defaultValue); }
bool toBool(bool defaultValue = false) const
- { return concrete().toBool(defaultValue); }
+ { return concreteBoolean(*this, defaultValue); }
double toDouble(double defaultValue = 0) const
- { return concrete().toDouble(defaultValue); }
+ { return concreteDouble(*this, defaultValue); }
QByteArray toByteArray(const QByteArray &defaultValue = {}) const
- { return concrete().toByteArray(defaultValue); }
+ { return concreteByteArray(*this, defaultValue); }
QString toString(const QString &defaultValue = {}) const
- { return concrete().toString(defaultValue); }
+ { return concreteString(*this, defaultValue); }
QDateTime toDateTime(const QDateTime &defaultValue = {}) const
{ return concrete().toDateTime(defaultValue); }
#ifndef QT_BOOTSTRAPPED
QUrl toUrl(const QUrl &defaultValue = {}) const
{ return concrete().toUrl(defaultValue); }
-#endif
-#if QT_CONFIG(regularexpression)
+# if QT_CONFIG(regularexpression)
QRegularExpression toRegularExpression(const QRegularExpression &defaultValue = {}) const
{ return concrete().toRegularExpression(defaultValue); }
-#endif
+# endif
QUuid toUuid(const QUuid &defaultValue = {}) const
{ return concrete().toUuid(defaultValue); }
+#endif
// only forward-declared, need split functions. Implemented in qcbor{array,map}.h
QCborArray toArray() const;
@@ -408,27 +536,16 @@ public:
QCborMap toMap(const QCborMap &m) const;
const QCborValue operator[](const QString &key) const;
- const QCborValue operator[](QLatin1String key) const;
+ const QCborValue operator[](QLatin1StringView key) const;
const QCborValue operator[](qint64 key) const;
- QCborValueRef operator[](qint64 key);
- QCborValueRef operator[](QLatin1String key);
- QCborValueRef operator[](const QString & key);
int compare(const QCborValue &other) const
{ return concrete().compare(other); }
-#if 0 && __has_include(<compare>)
- std::strong_ordering operator<=>(const QCborValue &other) const
- {
- int c = compare(other);
- if (c > 0) return std::strong_ordering::greater;
- if (c == 0) return std::strong_ordering::equivalent;
- return std::strong_ordering::less;
- }
-#else
+#if QT_CORE_REMOVED_SINCE(6, 8)
bool operator==(const QCborValue &other) const
{ return compare(other) == 0; }
bool operator!=(const QCborValue &other) const
- { return !(*this == other); }
+ { return !operator==(other); }
bool operator<(const QCborValue &other) const
{ return compare(other) < 0; }
#endif
@@ -437,25 +554,17 @@ public:
QJsonValue toJsonValue() const;
#if QT_CONFIG(cborstreamwriter)
+ using QCborValueConstRef::toCbor;
QByteArray toCbor(QCborValue::EncodingOptions opt = QCborValue::NoTransformation)
- { return concrete().toCbor(opt); }
+ { return std::as_const(*this).toCbor(opt); }
void toCbor(QCborStreamWriter &writer, QCborValue::EncodingOptions opt = QCborValue::NoTransformation);
#endif
+ using QCborValueConstRef::toDiagnosticNotation;
QString toDiagnosticNotation(QCborValue::DiagnosticNotationOptions opt = QCborValue::Compact)
- { return concrete().toDiagnosticNotation(opt); }
+ { return std::as_const(*this).toDiagnosticNotation(opt); }
private:
- friend class QCborValue;
- friend class QCborArray;
- friend class QCborMap;
- friend class QCborContainerPrivate;
- friend class QCborValueRefPtr;
-
- // static so we can pass this by value
- static void assign(QCborValueRef that, const QCborValue &other);
- static void assign(QCborValueRef that, QCborValue &&other);
- static void assign(QCborValueRef that, const QCborValueRef other);
static QCborValue concrete(QCborValueRef that) noexcept;
QCborValue concrete() const noexcept { return concrete(*this); }
@@ -463,14 +572,30 @@ private:
QCborValue::Type concreteType() const noexcept { return concreteType(*this); }
// this will actually be invalid...
- constexpr QCborValueRef() : d(nullptr), i(0) {}
+ constexpr QCborValueRef() : QCborValueConstRef(nullptr, 0) {}
QCborValueRef(QCborContainerPrivate *dd, qsizetype ii)
- : d(dd), i(ii)
+ : QCborValueConstRef(dd, ii)
{}
- QCborContainerPrivate *d;
- qsizetype i;
+#else
+private:
+ using QCborValueConstRef::QCborValueConstRef;
+#endif // < Qt 7
+
+ friend class QCborValue;
+ friend class QCborArray;
+ friend class QCborMap;
+ friend class QCborContainerPrivate;
+ friend class QCborValueConstRef;
+
+ // static so we can pass this by value
+ QT7_ONLY(Q_CORE_EXPORT) static void assign(QCborValueRef that, const QCborValue &other);
+ QT7_ONLY(Q_CORE_EXPORT) static void assign(QCborValueRef that, QCborValue &&other);
+ QT7_ONLY(Q_CORE_EXPORT) static void assign(QCborValueRef that, const QCborValueRef other);
};
+QT_WARNING_POP
+Q_DECLARE_OPERATORS_FOR_FLAGS(QCborValue::EncodingOptions)
+Q_DECLARE_OPERATORS_FOR_FLAGS(QCborValue::DiagnosticNotationOptions)
Q_CORE_EXPORT size_t qHash(const QCborValue &value, size_t seed = 0);
diff --git a/src/corelib/serialization/qcborvalue_p.h b/src/corelib/serialization/qcborvalue_p.h
index 5c8f244ad8..33eb912a6d 100644
--- a/src/corelib/serialization/qcborvalue_p.h
+++ b/src/corelib/serialization/qcborvalue_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QCBORVALUE_P_H
#define QCBORVALUE_P_H
@@ -65,6 +29,11 @@
QT_BEGIN_NAMESPACE
namespace QtCbor {
+enum class Comparison {
+ ForEquality,
+ ForOrdering,
+};
+
struct Undefined {};
struct Element
{
@@ -115,7 +84,8 @@ struct ByteData
QString toUtf8String() const { return QString::fromUtf8(byte(), len); }
QByteArray asByteArrayView() const { return QByteArray::fromRawData(byte(), len); }
- QLatin1String asLatin1() const { return QLatin1String(byte(), len); }
+ QLatin1StringView asLatin1() const { return {byte(), len}; }
+ QUtf8StringView asUtf8StringView() const { return QUtf8StringView(byte(), len); }
QStringView asStringView() const{ return QStringView(utf16(), len / 2); }
QString asQStringRaw() const { return QString::fromRawData(utf16(), len / 2); }
};
@@ -138,18 +108,19 @@ public:
QList<QtCbor::Element> elements;
void deref() { if (!ref.deref()) delete this; }
- void compact(qsizetype reserved);
+ void compact();
static QCborContainerPrivate *clone(QCborContainerPrivate *d, qsizetype reserved = -1);
static QCborContainerPrivate *detach(QCborContainerPrivate *d, qsizetype reserved);
static QCborContainerPrivate *grow(QCborContainerPrivate *d, qsizetype index);
- qptrdiff addByteData(const char *block, qsizetype len)
+ static qptrdiff addByteDataImpl(QByteArray &target, QByteArray::size_type &targetUsed,
+ const char *block, qsizetype len)
{
// This function does not do overflow checking, since the len parameter
// is expected to be trusted. There's another version of this function
// in decodeStringFromCbor(), which checks.
- qptrdiff offset = data.size();
+ qptrdiff offset = target.size();
// align offset
offset += alignof(QtCbor::ByteData) - 1;
@@ -157,10 +128,10 @@ public:
qptrdiff increment = qptrdiff(sizeof(QtCbor::ByteData)) + len;
- usedData += increment;
- data.resize(offset + increment);
+ targetUsed += increment;
+ target.resize(offset + increment);
- char *ptr = data.begin() + offset;
+ char *ptr = target.begin() + offset;
auto b = new (ptr) QtCbor::ByteData;
b->len = len;
if (block)
@@ -169,6 +140,11 @@ public:
return offset;
}
+ qptrdiff addByteData(const char *block, qsizetype len)
+ {
+ return addByteDataImpl(data, usedData, block, len);
+ }
+
const QtCbor::ByteData *byteData(QtCbor::Element e) const
{
if ((e.flags & QtCbor::Element::HasByteData) == 0)
@@ -219,7 +195,7 @@ public:
}
void insertAt(qsizetype idx, const QCborValue &value, ContainerDisposition disp = CopyContainer)
{
- replaceAt_internal(*elements.insert(elements.begin() + int(idx), {}), value, disp);
+ replaceAt_internal(*elements.insert(idx, {}), value, disp);
}
void append(QtCbor::Undefined)
@@ -249,31 +225,29 @@ public:
{
appendByteData(str, len, QCborValue::String);
}
- void append(QLatin1String s)
+ void append(QLatin1StringView s)
{
if (!QtPrivate::isAscii(s))
- return append(QString(s));
+ return appendNonAsciiString(QString(s));
// US-ASCII is a subset of UTF-8, so we can keep in 8-bit
appendByteData(s.latin1(), s.size(), QCborValue::String,
QtCbor::Element::StringIsAscii);
}
void appendAsciiString(QStringView s);
+ void appendNonAsciiString(QStringView s);
-#if QT_STRINGVIEW_LEVEL < 2
void append(const QString &s)
{
append(qToStringViewIgnoringNull(s));
}
-#endif
void append(QStringView s)
{
if (QtPrivate::isAscii(s))
appendAsciiString(s);
else
- appendByteData(reinterpret_cast<const char *>(s.utf16()), s.size() * 2,
- QCborValue::String, QtCbor::Element::StringIsUtf16);
+ appendNonAsciiString(s);
}
void append(const QCborValue &v)
{
@@ -366,7 +340,7 @@ public:
return e;
}
- static int compareUtf8(const QtCbor::ByteData *b, const QLatin1String &s)
+ static int compareUtf8(const QtCbor::ByteData *b, QLatin1StringView s)
{
return QUtf8::compareUtf8(QByteArrayView(b->byte(), b->len), s);
}
@@ -377,7 +351,7 @@ public:
}
template<typename String>
- int stringCompareElement(const QtCbor::Element &e, String s) const
+ int stringCompareElement(const QtCbor::Element &e, String s, QtCbor::Comparison mode) const
{
if (e.type != QCborValue::String)
return int(e.type) - int(QCborValue::String);
@@ -386,15 +360,18 @@ public:
if (!b)
return s.isEmpty() ? 0 : -1;
- if (e.flags & QtCbor::Element::StringIsUtf16)
+ if (e.flags & QtCbor::Element::StringIsUtf16) {
+ if (mode == QtCbor::Comparison::ForEquality)
+ return QtPrivate::equalStrings(b->asStringView(), s) ? 0 : 1;
return QtPrivate::compareStrings(b->asStringView(), s);
+ }
return compareUtf8(b, s);
}
template<typename String>
bool stringEqualsElement(const QtCbor::Element &e, String s) const
{
- return stringCompareElement(e, s) == 0;
+ return stringCompareElement(e, s, QtCbor::Comparison::ForEquality) == 0;
}
template<typename String>
@@ -404,12 +381,13 @@ public:
}
static int compareElement_helper(const QCborContainerPrivate *c1, QtCbor::Element e1,
- const QCborContainerPrivate *c2, QtCbor::Element e2);
- int compareElement(qsizetype idx, const QCborValue &value) const
+ const QCborContainerPrivate *c2, QtCbor::Element e2,
+ QtCbor::Comparison mode) noexcept;
+ int compareElement(qsizetype idx, const QCborValue &value, QtCbor::Comparison mode) const
{
auto &e1 = elements.at(idx);
auto e2 = elementFromValue(value);
- return compareElement_helper(this, e1, value.container, e2);
+ return compareElement_helper(this, e1, value.container, e2, mode);
}
void removeAt(qsizetype idx)
@@ -418,6 +396,62 @@ public:
elements.remove(idx);
}
+ // doesn't apply to JSON
+ template <typename KeyType> QCborValueConstRef findCborMapKey(KeyType key)
+ {
+ qsizetype i = 0;
+ for ( ; i < elements.size(); i += 2) {
+ const auto &e = elements.at(i);
+ bool equals;
+ if constexpr (std::is_same_v<std::decay_t<KeyType>, QCborValue>) {
+ equals = (compareElement(i, key, QtCbor::Comparison::ForEquality) == 0);
+ } else if constexpr (std::is_integral_v<KeyType>) {
+ equals = (e.type == QCborValue::Integer && e.value == key);
+ } else {
+ // assume it's a string
+ equals = stringEqualsElement(i, key);
+ }
+ if (equals)
+ break;
+ }
+ return { this, i + 1 };
+ }
+ template <typename KeyType> static QCborValue findCborMapKey(const QCborValue &self, KeyType key)
+ {
+ if (self.isMap() && self.container) {
+ qsizetype idx = self.container->findCborMapKey(key).i;
+ if (idx < self.container->elements.size())
+ return self.container->valueAt(idx);
+ }
+ return QCborValue();
+ }
+ template <typename KeyType> static QCborValueRef
+ findOrAddMapKey(QCborContainerPrivate *container, KeyType key)
+ {
+ qsizetype size = 0;
+ qsizetype index = size + 1;
+ if (container) {
+ size = container->elements.size();
+ index = container->findCborMapKey<KeyType>(key).i; // returns size + 1 if not found
+ }
+ Q_ASSERT(index & 1);
+ Q_ASSERT((size & 1) == 0);
+
+ container = detach(container, qMax(index + 1, size));
+ Q_ASSERT(container);
+ Q_ASSERT((container->elements.size() & 1) == 0);
+
+ if (index >= size) {
+ container->append(key);
+ container->append(QCborValue());
+ }
+ Q_ASSERT(index < container->elements.size());
+ return { container, index };
+ }
+ template <typename KeyType> static QCborValueRef findOrAddMapKey(QCborMap &map, KeyType key);
+ template <typename KeyType> static QCborValueRef findOrAddMapKey(QCborValue &self, KeyType key);
+ template <typename KeyType> static QCborValueRef findOrAddMapKey(QCborValueRef self, KeyType key);
+
#if QT_CONFIG(cborstreamreader)
void decodeValueFromCbor(QCborStreamReader &reader, int remainingStackDepth);
void decodeStringFromCbor(QCborStreamReader &reader);
diff --git a/src/corelib/serialization/qdatastream.cpp b/src/corelib/serialization/qdatastream.cpp
index ec3bd06a34..d35e871de0 100644
--- a/src/corelib/serialization/qdatastream.cpp
+++ b/src/corelib/serialization/qdatastream.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qdatastream.h"
#include "qdatastream_p.h"
@@ -51,9 +15,13 @@
QT_BEGIN_NAMESPACE
+constexpr quint32 QDataStream::NullCode;
+constexpr quint32 QDataStream::ExtendedSize;
+
/*!
\class QDataStream
\inmodule QtCore
+ \ingroup qtserialization
\reentrant
\brief The QDataStream class provides serialization of binary data
to a QIODevice.
@@ -102,17 +70,30 @@ QT_BEGIN_NAMESPACE
need of manually defining streaming operators. Enum classes are
serialized using the declared size.
- To take one example, a \c{char *} string is written as a 32-bit
- integer equal to the length of the string including the '\\0' byte,
- followed by all the characters of the string including the
- '\\0' byte. When reading a \c{char *} string, 4 bytes are read to
- create the 32-bit length value, then that many characters for the
- \c {char *} string including the '\\0' terminator are read.
-
The initial I/O device is usually set in the constructor, but can be
changed with setDevice(). If you've reached the end of the data
(or if there is no I/O device set) atEnd() will return true.
+ \section1 Serializing containers and strings
+
+ The serialization format is a length specifier first, then \a l bytes of data.
+ The length specifier is one quint32 if the version is less than 6.7 or if the
+ number of elements is less than 0xfffffffe (2^32 -2). Otherwise there is
+ an extend value 0xfffffffe followed by one quint64 with the actual value.
+ In addition for containers that support isNull(), it is encoded as a single
+ quint32 with all bits set and no data.
+
+ To take one example, if the string size fits into 32 bits, a \c{char *} string
+ is written as a 32-bit integer equal to the length of the string, including
+ the '\\0' byte, followed by all the characters of the string, including the
+ '\\0' byte. If the string size is greater, the value 0xffffffffe is written
+ as a marker of an extended size, followed by 64 bits of the actual size.
+ When reading a \c {char *} string, 4 bytes are read first. If the value is
+ not equal to 0xffffffffe (the marker of extended size), then these 4 bytes
+ are treated as the 32 bit size of the string. Otherwise, the next 8 bytes are
+ read and treated as a 64 bit size of the string. Then, all the characters for
+ the \c {char *} string, including the '\\0' terminator, are read.
+
\section1 Versioning
QDataStream's binary format has evolved since Qt 1.0, and is
@@ -199,6 +180,27 @@ QT_BEGIN_NAMESPACE
If no full packet is received, this code restores the stream to the
initial position, after which you need to wait for more data to arrive.
+ \section1 Corruption and Security
+
+ QDataStream is not resilient against corrupted data inputs and should
+ therefore not be used for security-sensitive situations, even when using
+ transactions. Transactions will help determine if a valid input can
+ currently be decoded with the data currently available on an asynchronous
+ device, but will assume that the data that is available is correctly
+ formed.
+
+ Additionally, many QDataStream demarshalling operators will allocate memory
+ based on information found in the stream. Those operators perform no
+ verification on whether the requested amount of memory is reasonable or if
+ it is compatible with the amount of data available in the stream (example:
+ demarshalling a QByteArray or QString may see the request for allocation of
+ several gigabytes of data).
+
+ QDataStream should not be used on content whose provenance cannot be
+ trusted. Applications should be designed to attempt to decode only streams
+ whose provenance is at least as trustworthy as that of the application
+ itself or its plugins.
+
\sa QTextStream, QVariant
*/
@@ -236,6 +238,11 @@ QT_BEGIN_NAMESPACE
data in the underlying device.
\value ReadCorruptData The data stream has read corrupt data.
\value WriteFailed The data stream cannot write to the underlying device.
+ \value [since 6.7] SizeLimitExceeded The data stream cannot read or write
+ the data because its size is larger than supported
+ by the current platform. This can happen, for
+ example, when trying to read more that 2 GiB of
+ data on a 32-bit platform.
*/
/*****************************************************************************
@@ -264,7 +271,7 @@ QT_BEGIN_NAMESPACE
return retVal;
#define CHECK_STREAM_TRANSACTION_PRECOND(retVal) \
- if (!d || d->transactionDepth == 0) { \
+ if (transactionDepth == 0) { \
qWarning("QDataStream: No transaction in progress"); \
return retVal; \
}
@@ -277,12 +284,6 @@ QT_BEGIN_NAMESPACE
QDataStream::QDataStream()
{
- dev = nullptr;
- owndev = false;
- byteorder = BigEndian;
- ver = Qt_DefaultCompiledVersion;
- noswap = QSysInfo::ByteOrder == QSysInfo::BigEndian;
- q_status = Ok;
}
/*!
@@ -294,11 +295,6 @@ QDataStream::QDataStream()
QDataStream::QDataStream(QIODevice *d)
{
dev = d; // set device
- owndev = false;
- byteorder = BigEndian; // default byte order
- ver = Qt_DefaultCompiledVersion;
- noswap = QSysInfo::ByteOrder == QSysInfo::BigEndian;
- q_status = Ok;
}
/*!
@@ -323,10 +319,6 @@ QDataStream::QDataStream(QByteArray *a, OpenMode flags)
buf->open(flags);
dev = buf;
owndev = true;
- byteorder = BigEndian;
- ver = Qt_DefaultCompiledVersion;
- noswap = QSysInfo::ByteOrder == QSysInfo::BigEndian;
- q_status = Ok;
}
/*!
@@ -347,10 +339,6 @@ QDataStream::QDataStream(const QByteArray &a)
buf->open(QIODevice::ReadOnly);
dev = buf;
owndev = true;
- byteorder = BigEndian;
- ver = Qt_DefaultCompiledVersion;
- noswap = QSysInfo::ByteOrder == QSysInfo::BigEndian;
- q_status = Ok;
}
/*!
@@ -412,16 +400,14 @@ bool QDataStream::atEnd() const
}
/*!
+ \fn QDataStream::FloatingPointPrecision QDataStream::floatingPointPrecision() const
+
Returns the floating point precision of the data stream.
\since 4.6
\sa FloatingPointPrecision, setFloatingPointPrecision()
*/
-QDataStream::FloatingPointPrecision QDataStream::floatingPointPrecision() const
-{
- return d ? d->floatingPointPrecision : QDataStream::DoublePrecision;
-}
/*!
Sets the floating point precision of the data stream to \a precision. If the floating point precision is
@@ -445,22 +431,17 @@ QDataStream::FloatingPointPrecision QDataStream::floatingPointPrecision() const
*/
void QDataStream::setFloatingPointPrecision(QDataStream::FloatingPointPrecision precision)
{
- if (!d)
- d.reset(new QDataStreamPrivate());
- d->floatingPointPrecision = precision;
+ fpPrecision = precision;
}
/*!
+ \fn QDataStream::status() const
+
Returns the status of the data stream.
\sa Status, setStatus(), resetStatus()
*/
-QDataStream::Status QDataStream::status() const
-{
- return q_status;
-}
-
/*!
Resets the status of the data stream.
@@ -508,11 +489,14 @@ void QDataStream::setStatus(Status status)
void QDataStream::setByteOrder(ByteOrder bo)
{
+#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0) && !defined(QT_BOOTSTRAPPED)
+ // accessed by inline byteOrder() prior to Qt 6.8
byteorder = bo;
+#endif
if (QSysInfo::ByteOrder == QSysInfo::BigEndian)
- noswap = (byteorder == BigEndian);
+ noswap = (bo == BigEndian);
else
- noswap = (byteorder == LittleEndian);
+ noswap = (bo == LittleEndian);
}
@@ -558,6 +542,11 @@ void QDataStream::setByteOrder(ByteOrder bo)
\value Qt_6_1 Same as Qt_6_0
\value Qt_6_2 Same as Qt_6_0
\value Qt_6_3 Same as Qt_6_0
+ \value Qt_6_4 Same as Qt_6_0
+ \value Qt_6_5 Same as Qt_6_0
+ \value Qt_6_6 Version 21 (Qt 6.6)
+ \value Qt_6_7 Version 22 (Qt 6.7)
+ \value Qt_6_8 Same as Qt_6_7
\omitvalue Qt_DefaultCompiledVersion
\sa setVersion(), version()
@@ -631,10 +620,7 @@ void QDataStream::startTransaction()
{
CHECK_STREAM_PRECOND(Q_VOID)
- if (!d)
- d.reset(new QDataStreamPrivate());
-
- if (++d->transactionDepth == 1) {
+ if (++transactionDepth == 1) {
dev->startTransaction();
resetStatus();
}
@@ -663,7 +649,7 @@ void QDataStream::startTransaction()
bool QDataStream::commitTransaction()
{
CHECK_STREAM_TRANSACTION_PRECOND(false)
- if (--d->transactionDepth == 0) {
+ if (--transactionDepth == 0) {
CHECK_STREAM_PRECOND(false)
if (q_status == ReadPastEnd) {
@@ -703,7 +689,7 @@ void QDataStream::rollbackTransaction()
setStatus(ReadPastEnd);
CHECK_STREAM_TRANSACTION_PRECOND(Q_VOID)
- if (--d->transactionDepth != 0)
+ if (--transactionDepth != 0)
return;
CHECK_STREAM_PRECOND(Q_VOID)
@@ -739,7 +725,7 @@ void QDataStream::abortTransaction()
q_status = ReadCorruptData;
CHECK_STREAM_TRANSACTION_PRECOND(Q_VOID)
- if (--d->transactionDepth != 0)
+ if (--transactionDepth != 0)
return;
CHECK_STREAM_PRECOND(Q_VOID)
@@ -762,13 +748,13 @@ bool QDataStream::isDeviceTransactionStarted() const
\internal
*/
-int QDataStream::readBlock(char *data, int len)
+qint64 QDataStream::readBlock(char *data, qint64 len)
{
// Disable reads on failure in transacted stream
if (q_status != Ok && dev->isTransactionStarted())
return -1;
- const int readResult = dev->read(data, len);
+ const qint64 readResult = dev->read(data, len);
if (readResult != len)
setStatus(ReadPastEnd);
return readResult;
@@ -992,25 +978,12 @@ QDataStream &QDataStream::operator>>(double &f)
/*!
\overload
- \since 5.9
-
- Reads a floating point number from the stream into \a f,
- using the standard IEEE 754 format. Returns a reference to the
- stream.
-*/
-QDataStream &QDataStream::operator>>(qfloat16 &f)
-{
- return *this >> reinterpret_cast<qint16&>(f);
-}
-
-
-/*!
- \overload
- Reads the '\\0'-terminated string \a s from the stream and returns
- a reference to the stream.
+ Reads string \a s from the stream and returns a reference to the stream.
- The string is deserialized using \c{readBytes()}.
+ The string is deserialized using \c{readBytes()} where the serialization
+ format is a \c quint32 length specifier first, followed by that many bytes
+ of data. The resulting string is always '\\0'-terminated.
Space for the string is allocated using \c{new []} -- the caller must
destroy it with \c{delete []}.
@@ -1020,7 +993,7 @@ QDataStream &QDataStream::operator>>(qfloat16 &f)
QDataStream &QDataStream::operator>>(char *&s)
{
- uint len = 0;
+ qint64 len = 0;
return readBytes(s, len);
}
@@ -1054,7 +1027,29 @@ QDataStream &QDataStream::operator>>(char32_t &c)
return *this;
}
+#if QT_DEPRECATED_SINCE(6, 11)
+
+/*
+ \deprecated [6.11] Use an overload that takes qint64 length instead.
+*/
+QDataStream &QDataStream::readBytes(char *&s, uint &l)
+{
+ qint64 length = 0;
+ (void)readBytes(s, length);
+ if (length != qint64(uint(length))) {
+ setStatus(SizeLimitExceeded); // Cannot store length in l
+ delete[] s;
+ l = 0;
+ return *this;
+ }
+ l = uint(length);
+ return *this;
+}
+
+#endif // QT_DEPRECATED_SINCE(6, 11)
+
/*!
+ \since 6.7
Reads the buffer \a s from the stream and returns a reference to
the stream.
@@ -1064,30 +1059,40 @@ QDataStream &QDataStream::operator>>(char32_t &c)
The \a l parameter is set to the length of the buffer. If the
string read is empty, \a l is set to 0 and \a s is set to \nullptr.
- The serialization format is a quint32 length specifier first,
- then \a l bytes of data.
+ The serialization format is a length specifier first, then \a l
+ bytes of data. The length specifier is one quint32 if the version
+ is less than 6.7 or if the number of elements is less than 0xfffffffe
+ (2^32 -2), otherwise there is an extend value 0xfffffffe followed by
+ one quint64 with the actual value. In addition for containers that
+ support isNull(), it is encoded as a single quint32 with all bits
+ set and no data.
\sa readRawData(), writeBytes()
*/
-QDataStream &QDataStream::readBytes(char *&s, uint &l)
+QDataStream &QDataStream::readBytes(char *&s, qint64 &l)
{
s = nullptr;
l = 0;
CHECK_STREAM_PRECOND(*this)
- quint32 len;
- *this >> len;
- if (len == 0)
+ qint64 length = readQSizeType(*this);
+ if (length == 0)
+ return *this;
+
+ qsizetype len = qsizetype(length);
+ if (length != len || length < 0) {
+ setStatus(SizeLimitExceeded); // Cannot store len
return *this;
+ }
- const quint32 Step = 1024 * 1024;
- quint32 allocated = 0;
+ qsizetype step = (dev->bytesAvailable() >= len) ? len : 1024 * 1024;
+ qsizetype allocated = 0;
char *prevBuf = nullptr;
char *curBuf = nullptr;
do {
- int blockSize = qMin(Step, len - allocated);
+ qsizetype blockSize = qMin(step, len - allocated);
prevBuf = curBuf;
curBuf = new char[allocated + blockSize + 1];
if (prevBuf) {
@@ -1099,11 +1104,12 @@ QDataStream &QDataStream::readBytes(char *&s, uint &l)
return *this;
}
allocated += blockSize;
+ step *= 2;
} while (allocated < len);
s = curBuf;
s[len] = '\0';
- l = (uint)len;
+ l = len;
return *this;
}
@@ -1116,7 +1122,7 @@ QDataStream &QDataStream::readBytes(char *&s, uint &l)
\sa readBytes(), QIODevice::read(), writeRawData()
*/
-int QDataStream::readRawData(char *s, int len)
+qint64 QDataStream::readRawData(char *s, qint64 len)
{
CHECK_STREAM_PRECOND(-1)
return readBlock(s, len);
@@ -1254,18 +1260,13 @@ QDataStream &QDataStream::operator<<(qint64 i)
*/
/*!
+ \fn QDataStream &QDataStream::operator<<(bool i)
+ \overload
+
Writes a boolean value, \a i, to the stream. Returns a reference
to the stream.
*/
-QDataStream &QDataStream::operator<<(bool i)
-{
- CHECK_STREAM_WRITE_PRECOND(*this)
- if (!dev->putChar(qint8(i)))
- q_status = WriteFailed;
- return *this;
-}
-
/*!
\overload
@@ -1340,19 +1341,6 @@ QDataStream &QDataStream::operator<<(double f)
/*!
- \fn QDataStream &QDataStream::operator<<(qfloat16 f)
- \overload
- \since 5.9
-
- Writes a floating point number, \a f, to the stream using
- the standard IEEE 754 format. Returns a reference to the stream.
-*/
-QDataStream &QDataStream::operator<<(qfloat16 f)
-{
- return *this << reinterpret_cast<qint16&>(f);
-}
-
-/*!
\overload
Writes the '\\0'-terminated string \a s to the stream and returns a
@@ -1365,13 +1353,9 @@ QDataStream &QDataStream::operator<<(qfloat16 f)
QDataStream &QDataStream::operator<<(const char *s)
{
- if (!s) {
- *this << (quint32)0;
- return *this;
- }
- int len = int(qstrlen(s)) + 1; // also write null terminator
- *this << (quint32)len; // write length specifier
- writeRawData(s, len);
+ // Include null terminator, unless s itself is null
+ const qint64 len = s ? qint64(qstrlen(s)) + 1 : 0;
+ writeBytes(s, len);
return *this;
}
@@ -1403,22 +1387,26 @@ QDataStream &QDataStream::operator<<(char32_t c)
Writes the length specifier \a len and the buffer \a s to the
stream and returns a reference to the stream.
- The \a len is serialized as a quint32, followed by \a len bytes
- from \a s. Note that the data is \e not encoded.
+ The \a len is serialized as a quint32 and an optional quint64,
+ followed by \a len bytes from \a s. Note that the data is
+ \e not encoded.
\sa writeRawData(), readBytes()
*/
-QDataStream &QDataStream::writeBytes(const char *s, uint len)
+QDataStream &QDataStream::writeBytes(const char *s, qint64 len)
{
+ if (len < 0) {
+ q_status = WriteFailed;
+ return *this;
+ }
CHECK_STREAM_WRITE_PRECOND(*this)
- *this << (quint32)len; // write length specifier
- if (len)
+ // Write length then, if any, content
+ if (writeQSizeType(*this, len) && len > 0)
writeRawData(s, len);
return *this;
}
-
/*!
Writes \a len bytes from \a s to the stream. Returns the
number of bytes actually written, or -1 on error.
@@ -1427,10 +1415,10 @@ QDataStream &QDataStream::writeBytes(const char *s, uint len)
\sa writeBytes(), QIODevice::write(), readRawData()
*/
-int QDataStream::writeRawData(const char *s, int len)
+qint64 QDataStream::writeRawData(const char *s, qint64 len)
{
CHECK_STREAM_WRITE_PRECOND(-1)
- int ret = dev->write(s, len);
+ qint64 ret = dev->write(s, len);
if (ret != len)
q_status = WriteFailed;
return ret;
@@ -1447,13 +1435,13 @@ int QDataStream::writeRawData(const char *s, int len)
\sa QIODevice::seek()
*/
-int QDataStream::skipRawData(int len)
+qint64 QDataStream::skipRawData(qint64 len)
{
CHECK_STREAM_PRECOND(-1)
if (q_status != Ok && dev->isTransactionStarted())
return -1;
- const int skipResult = dev->skip(len);
+ const qint64 skipResult = dev->skip(len);
if (skipResult != len)
setStatus(ReadPastEnd);
return skipResult;
diff --git a/src/corelib/serialization/qdatastream.h b/src/corelib/serialization/qdatastream.h
index a673bfab82..cf37df71d7 100644
--- a/src/corelib/serialization/qdatastream.h
+++ b/src/corelib/serialization/qdatastream.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QDATASTREAM_H
#define QDATASTREAM_H
@@ -45,25 +9,43 @@
#include <QtCore/qcontainerfwd.h>
#include <QtCore/qnamespace.h>
+#include <iterator> // std::distance(), std::next()
+
#ifdef Status
#error qdatastream.h must be included before any header file that defines Status
#endif
QT_BEGIN_NAMESPACE
+#if QT_CORE_REMOVED_SINCE(6, 3)
class qfloat16;
+#endif
class QByteArray;
+class QDataStream;
class QIODevice;
+class QString;
-#if !defined(QT_NO_DATASTREAM) || defined(QT_BOOTSTRAPPED)
+#if !defined(QT_NO_DATASTREAM)
class QDataStreamPrivate;
namespace QtPrivate {
class StreamStateSaver;
+template <typename Container>
+QDataStream &readArrayBasedContainer(QDataStream &s, Container &c);
+template <typename Container>
+QDataStream &readListBasedContainer(QDataStream &s, Container &c);
+template <typename Container>
+QDataStream &readAssociativeContainer(QDataStream &s, Container &c);
+template <typename Container>
+QDataStream &writeSequentialContainer(QDataStream &s, const Container &c);
+template <typename Container>
+QDataStream &writeAssociativeContainer(QDataStream &s, const Container &c);
+template <typename Container>
+QDataStream &writeAssociativeMultiContainer(QDataStream &s, const Container &c);
}
class Q_CORE_EXPORT QDataStream : public QIODeviceBase
{
public:
- enum Version {
+ enum Version QT7_ONLY(: quint8) {
Qt_1_0 = 1,
Qt_2_0 = 2,
Qt_2_1 = 3,
@@ -100,8 +82,13 @@ public:
Qt_6_1 = Qt_6_0,
Qt_6_2 = Qt_6_0,
Qt_6_3 = Qt_6_0,
- Qt_DefaultCompiledVersion = Qt_6_3
-#if QT_VERSION >= QT_VERSION_CHECK(6, 4, 0)
+ Qt_6_4 = Qt_6_0,
+ Qt_6_5 = Qt_6_0,
+ Qt_6_6 = 21,
+ Qt_6_7 = 22,
+ Qt_6_8 = Qt_6_7,
+ Qt_DefaultCompiledVersion = Qt_6_8
+#if QT_VERSION >= QT_VERSION_CHECK(6, 9, 0)
#error Add the datastream version for this Qt version and update Qt_DefaultCompiledVersion
#endif
};
@@ -111,14 +98,15 @@ public:
LittleEndian = QSysInfo::LittleEndian
};
- enum Status {
+ enum Status QT7_ONLY(: quint8) {
Ok,
ReadPastEnd,
ReadCorruptData,
- WriteFailed
+ WriteFailed,
+ SizeLimitExceeded,
};
- enum FloatingPointPrecision {
+ enum FloatingPointPrecision QT7_ONLY(: quint8) {
SinglePrecision,
DoublePrecision
};
@@ -134,10 +122,12 @@ public:
bool atEnd() const;
+ QT_CORE_INLINE_SINCE(6, 8)
Status status() const;
void setStatus(Status status);
void resetStatus();
+ QT_CORE_INLINE_SINCE(6, 8)
FloatingPointPrecision floatingPointPrecision() const;
void setFloatingPointPrecision(FloatingPointPrecision precision);
@@ -159,8 +149,9 @@ public:
QDataStream &operator>>(std::nullptr_t &ptr) { ptr = nullptr; return *this; }
QDataStream &operator>>(bool &i);
- // ### Qt 7: remove the operator or make qfloat16 fully defined, see QTBUG-93499
+#if QT_CORE_REMOVED_SINCE(6, 3)
QDataStream &operator>>(qfloat16 &f);
+#endif
QDataStream &operator>>(float &f);
QDataStream &operator>>(double &f);
QDataStream &operator>>(char *&str);
@@ -177,23 +168,42 @@ public:
QDataStream &operator<<(qint64 i);
QDataStream &operator<<(quint64 i);
QDataStream &operator<<(std::nullptr_t) { return *this; }
+#if QT_CORE_REMOVED_SINCE(6, 8) || defined(Q_QDOC)
QDataStream &operator<<(bool i);
- // ### Qt 7: remove the operator or make qfloat16 fully defined, see QTBUG-93499
+#endif
+#if !defined(Q_QDOC)
+ // Disable implicit conversions to bool (e.g. for pointers)
+ template <typename T,
+ std::enable_if_t<std::is_same_v<T, bool>, bool> = true>
+ QDataStream &operator<<(T i)
+ {
+ return (*this << qint8(i));
+ }
+#endif
+#if QT_CORE_REMOVED_SINCE(6, 3)
QDataStream &operator<<(qfloat16 f);
+#endif
QDataStream &operator<<(float f);
QDataStream &operator<<(double f);
QDataStream &operator<<(const char *str);
QDataStream &operator<<(char16_t c);
QDataStream &operator<<(char32_t c);
-
+#if QT_DEPRECATED_SINCE(6, 11)
+ QT_DEPRECATED_VERSION_X_6_11("Use an overload that takes qint64 length.")
QDataStream &readBytes(char *&, uint &len);
- int readRawData(char *, int len);
-
+#endif
+#if QT_CORE_REMOVED_SINCE(6, 7)
QDataStream &writeBytes(const char *, uint len);
- int writeRawData(const char *, int len);
-
int skipRawData(int len);
+ int readRawData(char *, int len);
+ int writeRawData(const char *, int len);
+#endif
+ QDataStream &readBytes(char *&, qint64 &len);
+ qint64 readRawData(char *, qint64 len);
+ QDataStream &writeBytes(const char *, qint64 len);
+ qint64 writeRawData(const char *, qint64 len);
+ qint64 skipRawData(qint64 len);
void startTransaction();
bool commitTransaction();
@@ -206,21 +216,53 @@ private:
QScopedPointer<QDataStreamPrivate> d;
- QIODevice *dev;
- bool owndev;
- bool noswap;
- ByteOrder byteorder;
- int ver;
- Status q_status;
+ QIODevice *dev = nullptr;
+ bool owndev = false;
+ bool noswap = QSysInfo::ByteOrder == QSysInfo::BigEndian;
+ quint8 fpPrecision = QDataStream::DoublePrecision;
+ quint8 q_status = Ok;
+#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0) && !defined(QT_BOOTSTRAPPED)
+ ByteOrder byteorder = BigEndian;
+ int ver = Qt_DefaultCompiledVersion;
+#else
+ Version ver = Qt_DefaultCompiledVersion;
+#endif
+ quint16 transactionDepth = 0;
+#if QT_CORE_REMOVED_SINCE(6, 7)
int readBlock(char *data, int len);
+#endif
+ qint64 readBlock(char *data, qint64 len);
+ static inline qint64 readQSizeType(QDataStream &s);
+ static inline bool writeQSizeType(QDataStream &s, qint64 value);
+ static constexpr quint32 NullCode = 0xffffffffu;
+ static constexpr quint32 ExtendedSize = 0xfffffffeu;
+
friend class QtPrivate::StreamStateSaver;
+ Q_CORE_EXPORT friend QDataStream &operator<<(QDataStream &out, const QString &str);
+ Q_CORE_EXPORT friend QDataStream &operator>>(QDataStream &in, QString &str);
+ Q_CORE_EXPORT friend QDataStream &operator<<(QDataStream &out, const QByteArray &ba);
+ Q_CORE_EXPORT friend QDataStream &operator>>(QDataStream &in, QByteArray &ba);
+ template <typename Container>
+ friend QDataStream &QtPrivate::readArrayBasedContainer(QDataStream &s, Container &c);
+ template <typename Container>
+ friend QDataStream &QtPrivate::readListBasedContainer(QDataStream &s, Container &c);
+ template <typename Container>
+ friend QDataStream &QtPrivate::readAssociativeContainer(QDataStream &s, Container &c);
+ template <typename Container>
+ friend QDataStream &QtPrivate::writeSequentialContainer(QDataStream &s, const Container &c);
+ template <typename Container>
+ friend QDataStream &QtPrivate::writeAssociativeContainer(QDataStream &s, const Container &c);
+ template <typename Container>
+ friend QDataStream &QtPrivate::writeAssociativeMultiContainer(QDataStream &s,
+ const Container &c);
};
namespace QtPrivate {
class StreamStateSaver
{
+ Q_DISABLE_COPY_MOVE(StreamStateSaver)
public:
inline StreamStateSaver(QDataStream *s) : stream(s), oldStatus(s->status())
{
@@ -246,10 +288,14 @@ QDataStream &readArrayBasedContainer(QDataStream &s, Container &c)
StreamStateSaver stateSaver(&s);
c.clear();
- quint32 n;
- s >> n;
+ qint64 size = QDataStream::readQSizeType(s);
+ qsizetype n = size;
+ if (size != n || size < 0) {
+ s.setStatus(QDataStream::SizeLimitExceeded);
+ return s;
+ }
c.reserve(n);
- for (quint32 i = 0; i < n; ++i) {
+ for (qsizetype i = 0; i < n; ++i) {
typename Container::value_type t;
s >> t;
if (s.status() != QDataStream::Ok) {
@@ -268,9 +314,13 @@ QDataStream &readListBasedContainer(QDataStream &s, Container &c)
StreamStateSaver stateSaver(&s);
c.clear();
- quint32 n;
- s >> n;
- for (quint32 i = 0; i < n; ++i) {
+ qint64 size = QDataStream::readQSizeType(s);
+ qsizetype n = size;
+ if (size != n || size < 0) {
+ s.setStatus(QDataStream::SizeLimitExceeded);
+ return s;
+ }
+ for (qsizetype i = 0; i < n; ++i) {
typename Container::value_type t;
s >> t;
if (s.status() != QDataStream::Ok) {
@@ -289,9 +339,13 @@ QDataStream &readAssociativeContainer(QDataStream &s, Container &c)
StreamStateSaver stateSaver(&s);
c.clear();
- quint32 n;
- s >> n;
- for (quint32 i = 0; i < n; ++i) {
+ qint64 size = QDataStream::readQSizeType(s);
+ qsizetype n = size;
+ if (size != n || size < 0) {
+ s.setStatus(QDataStream::SizeLimitExceeded);
+ return s;
+ }
+ for (qsizetype i = 0; i < n; ++i) {
typename Container::key_type k;
typename Container::mapped_type t;
s >> k >> t;
@@ -308,7 +362,8 @@ QDataStream &readAssociativeContainer(QDataStream &s, Container &c)
template <typename Container>
QDataStream &writeSequentialContainer(QDataStream &s, const Container &c)
{
- s << quint32(c.size());
+ if (!QDataStream::writeQSizeType(s, c.size()))
+ return s;
for (const typename Container::value_type &t : c)
s << t;
@@ -318,7 +373,8 @@ QDataStream &writeSequentialContainer(QDataStream &s, const Container &c)
template <typename Container>
QDataStream &writeAssociativeContainer(QDataStream &s, const Container &c)
{
- s << quint32(c.size());
+ if (!QDataStream::writeQSizeType(s, c.size()))
+ return s;
auto it = c.constBegin();
auto end = c.constEnd();
while (it != end) {
@@ -332,7 +388,8 @@ QDataStream &writeAssociativeContainer(QDataStream &s, const Container &c)
template <typename Container>
QDataStream &writeAssociativeMultiContainer(QDataStream &s, const Container &c)
{
- s << quint32(c.size());
+ if (!QDataStream::writeQSizeType(s, c.size()))
+ return s;
auto it = c.constBegin();
auto end = c.constEnd();
while (it != end) {
@@ -372,14 +429,58 @@ using QDataStreamIfHasIStreamOperatorsContainer =
inline QIODevice *QDataStream::device() const
{ return dev; }
+#if QT_CORE_INLINE_IMPL_SINCE(6, 8)
+QDataStream::Status QDataStream::status() const
+{
+ return Status(q_status);
+}
+
+QDataStream::FloatingPointPrecision QDataStream::floatingPointPrecision() const
+{
+ return FloatingPointPrecision(fpPrecision);
+}
+#endif // INLINE_SINCE 6.8
+
inline QDataStream::ByteOrder QDataStream::byteOrder() const
-{ return byteorder; }
+{
+ if constexpr (QSysInfo::ByteOrder == QSysInfo::BigEndian)
+ return noswap ? BigEndian : LittleEndian;
+ return noswap ? LittleEndian : BigEndian;
+}
inline int QDataStream::version() const
{ return ver; }
inline void QDataStream::setVersion(int v)
-{ ver = v; }
+{ ver = Version(v); }
+
+qint64 QDataStream::readQSizeType(QDataStream &s)
+{
+ quint32 first;
+ s >> first;
+ if (first == NullCode)
+ return -1;
+ if (first < ExtendedSize || s.version() < QDataStream::Qt_6_7)
+ return qint64(first);
+ qint64 extendedLen;
+ s >> extendedLen;
+ return extendedLen;
+}
+
+bool QDataStream::writeQSizeType(QDataStream &s, qint64 value)
+{
+ if (value < qint64(ExtendedSize)) {
+ s << quint32(value);
+ } else if (s.version() >= QDataStream::Qt_6_7) {
+ s << ExtendedSize << value;
+ } else if (value == qint64(ExtendedSize)) {
+ s << ExtendedSize;
+ } else {
+ s.setStatus(QDataStream::SizeLimitExceeded); // value is too big for old format
+ return false;
+ }
+ return true;
+}
inline QDataStream &QDataStream::operator>>(char &i)
{ return *this >> reinterpret_cast<qint8&>(i); }
@@ -434,7 +535,7 @@ typename std::enable_if_t<std::is_enum<T>::value, QDataStream &>
operator>>(QDataStream &s, T &t)
{ return s >> reinterpret_cast<typename std::underlying_type<T>::type &>(t); }
-#ifndef Q_CLANG_QDOC
+#ifndef Q_QDOC
template<typename T>
inline QDataStreamIfHasIStreamOperatorsContainer<QList<T>, T> operator>>(QDataStream &s, QList<T> &v)
@@ -567,7 +668,7 @@ QDataStream &operator>>(QDataStream& s, std::pair<T1, T2> &p);
template <class T1, class T2>
QDataStream &operator<<(QDataStream& s, const std::pair<T1, T2> &p);
-#endif // Q_CLANG_QDOC
+#endif // Q_QDOC
inline QDataStream &operator>>(QDataStream &s, QKeyCombination &combination)
{
diff --git a/src/corelib/serialization/qdatastream_p.h b/src/corelib/serialization/qdatastream_p.h
index 3ca0ae840e..c4fe7c784c 100644
--- a/src/corelib/serialization/qdatastream_p.h
+++ b/src/corelib/serialization/qdatastream_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QDATASTREAM_P_H
#define QDATASTREAM_P_H
@@ -60,11 +24,6 @@ QT_BEGIN_NAMESPACE
class QDataStreamPrivate
{
public:
- QDataStreamPrivate() : floatingPointPrecision(QDataStream::DoublePrecision),
- transactionDepth(0) { }
-
- QDataStream::FloatingPointPrecision floatingPointPrecision;
- int transactionDepth;
};
#endif
diff --git a/src/corelib/serialization/qjson_p.h b/src/corelib/serialization/qjson_p.h
index edab2c6b13..5a5b6926be 100644
--- a/src/corelib/serialization/qjson_p.h
+++ b/src/corelib/serialization/qjson_p.h
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2016 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QJSON_P_H
#define QJSON_P_H
@@ -56,6 +20,11 @@
#include <qcborvalue.h>
#include <private/qcborvalue_p.h>
+#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0) && !defined(QT_BOOTSTRAPPED)
+# include <qjsonarray.h>
+# include <qjsonobject.h>
+#endif
+
QT_BEGIN_NAMESPACE
namespace QJsonPrivate {
@@ -136,7 +105,6 @@ struct ObjectIterator
bool operator<=(ObjectIterator other) const { return it <= other.it; }
bool operator>=(ObjectIterator other) const { return it >= other.it; }
-private:
ElementsIterator it;
};
@@ -203,8 +171,31 @@ inline void swap(KeyIterator::reference a, KeyIterator::reference b)
class Value
{
public:
- static QCborContainerPrivate *container(const QCborValue &v) { return v.container; }
static qint64 valueHelper(const QCborValue &v) { return v.n; }
+ static QCborContainerPrivate *container(const QCborValue &v) { return v.container; }
+ static const QCborContainerPrivate *container(QJsonValueConstRef r) noexcept
+ {
+#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0) && !defined(QT_BOOTSTRAPPED)
+ return (r.is_object ? r.o->o : r.a->a).data();
+#else
+ return r.d;
+#endif
+ }
+ static QCborContainerPrivate *container(QJsonValueRef r) noexcept
+ {
+ return const_cast<QCborContainerPrivate *>(container(QJsonValueConstRef(r)));
+ }
+ static qsizetype indexHelper(QJsonValueConstRef r) noexcept
+ {
+ qsizetype index = r.index;
+ if (r.is_object)
+ index = index * 2 + 1;
+ return index;
+ }
+ static const QtCbor::Element &elementHelper(QJsonValueConstRef r) noexcept
+ {
+ return container(r)->elements.at(indexHelper(r));
+ }
static QJsonValue fromTrustedCbor(const QCborValue &v)
{
diff --git a/src/corelib/serialization/qjsonarray.cpp b/src/corelib/serialization/qjsonarray.cpp
index bf678a0bd8..0c1b0ac7c8 100644
--- a/src/corelib/serialization/qjsonarray.cpp
+++ b/src/corelib/serialization/qjsonarray.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include <qjsonobject.h>
#include <qjsonvalue.h>
@@ -58,11 +22,16 @@ QT_BEGIN_NAMESPACE
\inmodule QtCore
\ingroup json
\ingroup shared
+ \ingroup qtserialization
\reentrant
\since 5.0
\brief The QJsonArray class encapsulates a JSON array.
+ \compares equality
+ \compareswith equality QJsonValue
+ \endcompareswith
+
A JSON array is a list of values. The list can be manipulated by inserting and
removing QJsonValue's from the array.
@@ -75,7 +44,7 @@ QT_BEGIN_NAMESPACE
You can convert the array to and from text based JSON through QJsonDocument.
- \sa {JSON Support in Qt}, {JSON Save Game Example}
+ \sa {JSON Support in Qt}, {Saving and Loading a Game}
*/
/*!
@@ -155,7 +124,6 @@ QJsonArray::QJsonArray() = default;
QJsonArray::QJsonArray(QCborContainerPrivate *array)
: a(array)
{
- Q_ASSERT(array);
}
/*!
@@ -175,11 +143,13 @@ QJsonArray::QJsonArray(std::initializer_list<QJsonValue> args)
Since QJsonArray is implicitly shared, the copy is shallow
as long as the object doesn't get modified.
*/
-QJsonArray::QJsonArray(const QJsonArray &other)
-{
- a = other.a;
-}
+QJsonArray::QJsonArray(const QJsonArray &other) noexcept = default;
+
+/*!
+ \since 5.10
+ Move-constructs a QJsonArray from \a other.
+*/
QJsonArray::QJsonArray(QJsonArray &&other) noexcept
: a(other.a)
{
@@ -189,18 +159,7 @@ QJsonArray::QJsonArray(QJsonArray &&other) noexcept
/*!
Assigns \a other to this array.
*/
-QJsonArray &QJsonArray::operator =(const QJsonArray &other)
-{
- a = other.a;
- return *this;
-}
-
-/*!
- \fn QJsonArray::QJsonArray(QJsonArray &&other)
- \since 5.10
-
- Move-constructs a QJsonArray from \a other.
-*/
+QJsonArray &QJsonArray::operator =(const QJsonArray &other) noexcept = default;
/*!
\fn QJsonArray &QJsonArray::operator =(QJsonArray &&other)
@@ -256,6 +215,7 @@ QJsonArray QJsonArray::fromStringList(const QStringList &list)
return array;
}
+#ifndef QT_NO_VARIANT
/*!
Converts the variant list \a list to a QJsonArray.
@@ -280,6 +240,7 @@ QVariantList QJsonArray::toVariantList() const
{
return QCborArray::fromJsonArray(*this).toVariantList();
}
+#endif // !QT_NO_VARIANT
/*!
@@ -376,7 +337,7 @@ void QJsonArray::append(const QJsonValue &value)
*/
void QJsonArray::removeAt(qsizetype i)
{
- if (!a || i < 0 || i >= a->elements.length())
+ if (!a || i < 0 || i >= a->elements.size())
return;
detach();
a->removeAt(i);
@@ -412,7 +373,7 @@ void QJsonArray::removeAt(qsizetype i)
*/
QJsonValue QJsonArray::takeAt(qsizetype i)
{
- if (!a || i < 0 || i >= a->elements.length())
+ if (!a || i < 0 || i >= a->elements.size())
return QJsonValue(QJsonValue::Undefined);
detach();
@@ -431,11 +392,11 @@ QJsonValue QJsonArray::takeAt(qsizetype i)
void QJsonArray::insert(qsizetype i, const QJsonValue &value)
{
if (a)
- detach(a->elements.length() + 1);
+ detach(a->elements.size() + 1);
else
a = new QCborContainerPrivate;
- Q_ASSERT (i >= 0 && i <= a->elements.length());
+ Q_ASSERT (i >= 0 && i <= a->elements.size());
a->insertAt(i, value.type() == QJsonValue::Undefined ? QCborValue(nullptr)
: QCborValue::fromJsonValue(value));
}
@@ -466,7 +427,7 @@ void QJsonArray::insert(qsizetype i, const QJsonValue &value)
*/
void QJsonArray::replace(qsizetype i, const QJsonValue &value)
{
- Q_ASSERT (a && i >= 0 && i < a->elements.length());
+ Q_ASSERT (a && i >= 0 && i < a->elements.size());
detach();
a->replaceAt(i, QCborValue::fromJsonValue(value));
}
@@ -500,7 +461,7 @@ bool QJsonArray::contains(const QJsonValue &value) const
*/
QJsonValueRef QJsonArray::operator [](qsizetype i)
{
- Q_ASSERT(a && i >= 0 && i < a->elements.length());
+ Q_ASSERT(a && i >= 0 && i < a->elements.size());
return QJsonValueRef(this, i);
}
@@ -514,36 +475,40 @@ QJsonValue QJsonArray::operator[](qsizetype i) const
return at(i);
}
-/*!
- Returns \c true if this array is equal to \a other.
- */
-bool QJsonArray::operator==(const QJsonArray &other) const
+bool comparesEqual(const QJsonArray &lhs, const QJsonArray &rhs) noexcept
{
- if (a == other.a)
+ if (lhs.a == rhs.a)
return true;
- if (!a)
- return !other.a->elements.length();
- if (!other.a)
- return !a->elements.length();
- if (a->elements.length() != other.a->elements.length())
+ if (!lhs.a)
+ return !rhs.a->elements.size();
+ if (!rhs.a)
+ return !lhs.a->elements.size();
+ if (lhs.a->elements.size() != rhs.a->elements.size())
return false;
- for (qsizetype i = 0; i < a->elements.length(); ++i) {
- if (a->valueAt(i) != other.a->valueAt(i))
+ for (qsizetype i = 0; i < lhs.a->elements.size(); ++i) {
+ if (lhs.a->valueAt(i) != rhs.a->valueAt(i))
return false;
}
return true;
}
-/*!
- Returns \c true if this array is not equal to \a other.
- */
-bool QJsonArray::operator!=(const QJsonArray &other) const
+bool comparesEqual(const QJsonArray &lhs, const QJsonValue &rhs) noexcept
{
- return !(*this == other);
+ return lhs == rhs.toArray();
}
+/*! \fn bool QJsonArray::operator==(const QJsonArray &lhs, const QJsonArray &rhs)
+
+ Returns \c true if \a lhs array is equal to \a rhs, \c false otherwise.
+*/
+
+/*! \fn bool QJsonArray::operator!=(const QJsonArray &lhs, const QJsonArray &rhs)
+
+ Returns \c true if \a lhs array is not equal to \a rhs, \c false otherwise.
+*/
+
/*! \fn QJsonArray::iterator QJsonArray::begin()
Returns an \l{STL-style iterators}{STL-style iterator} pointing to the first item in
@@ -638,6 +603,10 @@ bool QJsonArray::operator!=(const QJsonArray &other) const
\inmodule QtCore
\brief The QJsonArray::iterator class provides an STL-style non-const iterator for QJsonArray.
+ \compares strong
+ \compareswith strong QJsonArray::const_iterator
+ \endcompareswith
+
QJsonArray::iterator allows you to iterate over a QJsonArray
and to modify the array item associated with the
iterator. If you want to iterate over a const QJsonArray, use
@@ -742,60 +711,60 @@ bool QJsonArray::operator!=(const QJsonArray &other) const
*/
/*!
- \fn bool QJsonArray::iterator::operator==(const iterator &other) const
- \fn bool QJsonArray::iterator::operator==(const const_iterator &other) const
+ \fn bool QJsonArray::iterator::operator==(const iterator &lhs, const iterator &rhs)
+ \fn bool QJsonArray::iterator::operator==(const iterator &lhs, const const_iterator &rhs)
- Returns \c true if \a other points to the same item as this
+ Returns \c true if \a lhs points to the same item as \a rhs
iterator; otherwise returns \c false.
\sa operator!=()
*/
/*!
- \fn bool QJsonArray::iterator::operator!=(const iterator &other) const
- \fn bool QJsonArray::iterator::operator!=(const const_iterator &other) const
+ \fn bool QJsonArray::iterator::operator!=(const iterator &lhs, const iterator &rhs)
+ \fn bool QJsonArray::iterator::operator!=(const iterator &lhs, const const_iterator &rhs)
- Returns \c true if \a other points to a different item than this
+ Returns \c true if \a lhs points to a different item than \a rhs
iterator; otherwise returns \c false.
\sa operator==()
*/
/*!
- \fn bool QJsonArray::iterator::operator<(const iterator& other) const
- \fn bool QJsonArray::iterator::operator<(const const_iterator& other) const
+ \fn bool QJsonArray::iterator::operator<(const iterator &lhs, const iterator &rhs)
+ \fn bool QJsonArray::iterator::operator<(const iterator &lhs, const const_iterator &rhs)
- Returns \c true if the item pointed to by this iterator is less than
- the item pointed to by the \a other iterator.
+ Returns \c true if the item pointed to by \a lhs iterator is less than
+ the item pointed to by the \a rhs iterator.
*/
/*!
- \fn bool QJsonArray::iterator::operator<=(const iterator& other) const
- \fn bool QJsonArray::iterator::operator<=(const const_iterator& other) const
+ \fn bool QJsonArray::iterator::operator<=(const iterator &lhs, const iterator &rhs)
+ \fn bool QJsonArray::iterator::operator<=(const iterator &lhs, const const_iterator &rhs)
- Returns \c true if the item pointed to by this iterator is less than
- or equal to the item pointed to by the \a other iterator.
+ Returns \c true if the item pointed to by \a lhs iterator is less than
+ or equal to the item pointed to by the \a rhs iterator.
*/
/*!
- \fn bool QJsonArray::iterator::operator>(const iterator& other) const
- \fn bool QJsonArray::iterator::operator>(const const_iterator& other) const
+ \fn bool QJsonArray::iterator::operator>(const iterator &lhs, const iterator &rhs)
+ \fn bool QJsonArray::iterator::operator>(const iterator &lhs, const const_iterator &rhs)
- Returns \c true if the item pointed to by this iterator is greater
- than the item pointed to by the \a other iterator.
+ Returns \c true if the item pointed to by \a lhs iterator is greater
+ than the item pointed to by the \a rhs iterator.
*/
/*!
- \fn bool QJsonArray::iterator::operator>=(const iterator& other) const
- \fn bool QJsonArray::iterator::operator>=(const const_iterator& other) const
+ \fn bool QJsonArray::iterator::operator>=(const iterator &lhs, const iterator &rhs)
+ \fn bool QJsonArray::iterator::operator>=(const iterator &lhs, const const_iterator &rhs)
- Returns \c true if the item pointed to by this iterator is greater
- than or equal to the item pointed to by the \a other iterator.
+ Returns \c true if the item pointed to by \a lhs iterator is greater
+ than or equal to the item pointed to by the \a rhs iterator.
*/
/*! \fn QJsonArray::iterator &QJsonArray::iterator::operator++()
- The prefix ++ operator, \c{++it}, advances the iterator to the
+ The prefix \c{++} operator, \c{++it}, advances the iterator to the
next item in the array and returns an iterator to the new current
item.
@@ -808,14 +777,14 @@ bool QJsonArray::operator!=(const QJsonArray &other) const
\overload
- The postfix ++ operator, \c{it++}, advances the iterator to the
+ The postfix \c{++} operator, \c{it++}, advances the iterator to the
next item in the array and returns an iterator to the previously
current item.
*/
/*! \fn QJsonArray::iterator &QJsonArray::iterator::operator--()
- The prefix -- operator, \c{--it}, makes the preceding item
+ The prefix \c{--} operator, \c{--it}, makes the preceding item
current and returns an iterator to the new current item.
Calling this function on QJsonArray::begin() leads to undefined results.
@@ -827,7 +796,7 @@ bool QJsonArray::operator!=(const QJsonArray &other) const
\overload
- The postfix -- operator, \c{it--}, makes the preceding item
+ The postfix \c{--} operator, \c{it--}, makes the preceding item
current and returns an iterator to the previously current item.
*/
@@ -873,6 +842,10 @@ bool QJsonArray::operator!=(const QJsonArray &other) const
\inmodule QtCore
\brief The QJsonArray::const_iterator class provides an STL-style const iterator for QJsonArray.
+ \compares strong
+ \compareswith strong QJsonArray::iterator
+ \endcompareswith
+
QJsonArray::const_iterator allows you to iterate over a
QJsonArray. If you want to modify the QJsonArray as
you iterate over it, use QJsonArray::iterator instead. It is generally a
@@ -965,53 +938,53 @@ bool QJsonArray::operator!=(const QJsonArray &other) const
\sa operator+()
*/
-/*! \fn bool QJsonArray::const_iterator::operator==(const const_iterator &other) const
+/*! \fn bool QJsonArray::const_iterator::operator==(const const_iterator &lhs, const const_iterator &rhs)
- Returns \c true if \a other points to the same item as this
+ Returns \c true if \a lhs points to the same item as \a rhs
iterator; otherwise returns \c false.
\sa operator!=()
*/
-/*! \fn bool QJsonArray::const_iterator::operator!=(const const_iterator &other) const
+/*! \fn bool QJsonArray::const_iterator::operator!=(const const_iterator &lhs, const const_iterator &rhs)
- Returns \c true if \a other points to a different item than this
+ Returns \c true if \a lhs points to a different item than \a rhs
iterator; otherwise returns \c false.
\sa operator==()
*/
/*!
- \fn bool QJsonArray::const_iterator::operator<(const const_iterator& other) const
+ \fn bool QJsonArray::const_iterator::operator<(const const_iterator &lhs, const const_iterator &rhs)
- Returns \c true if the item pointed to by this iterator is less than
- the item pointed to by the \a other iterator.
+ Returns \c true if the item pointed to by \a lhs iterator is less than
+ the item pointed to by the \a rhs iterator.
*/
/*!
- \fn bool QJsonArray::const_iterator::operator<=(const const_iterator& other) const
+ \fn bool QJsonArray::const_iterator::operator<=(const const_iterator &lhs, const const_iterator &rhs)
- Returns \c true if the item pointed to by this iterator is less than
- or equal to the item pointed to by the \a other iterator.
+ Returns \c true if the item pointed to by \a lhs iterator is less than
+ or equal to the item pointed to by the \a rhs iterator.
*/
/*!
- \fn bool QJsonArray::const_iterator::operator>(const const_iterator& other) const
+ \fn bool QJsonArray::const_iterator::operator>(const const_iterator &lhs, const const_iterator &rhs)
- Returns \c true if the item pointed to by this iterator is greater
- than the item pointed to by the \a other iterator.
+ Returns \c true if the item pointed to by \a lhs iterator is greater
+ than the item pointed to by the \a rhs iterator.
*/
/*!
- \fn bool QJsonArray::const_iterator::operator>=(const const_iterator& other) const
+ \fn bool QJsonArray::const_iterator::operator>=(const const_iterator &lhs, const const_iterator &rhs)
- Returns \c true if the item pointed to by this iterator is greater
- than or equal to the item pointed to by the \a other iterator.
+ Returns \c true if the item pointed to by \a lhs iterator is greater
+ than or equal to the item pointed to by the \a rhs iterator.
*/
/*! \fn QJsonArray::const_iterator &QJsonArray::const_iterator::operator++()
- The prefix ++ operator, \c{++it}, advances the iterator to the
+ The prefix \c{++} operator, \c{++it}, advances the iterator to the
next item in the array and returns an iterator to the new current
item.
@@ -1024,14 +997,14 @@ bool QJsonArray::operator!=(const QJsonArray &other) const
\overload
- The postfix ++ operator, \c{it++}, advances the iterator to the
+ The postfix \c{++} operator, \c{it++}, advances the iterator to the
next item in the array and returns an iterator to the previously
current item.
*/
/*! \fn QJsonArray::const_iterator &QJsonArray::const_iterator::operator--()
- The prefix -- operator, \c{--it}, makes the preceding item
+ The prefix \c{--} operator, \c{--it}, makes the preceding item
current and returns an iterator to the new current item.
Calling this function on QJsonArray::begin() leads to undefined results.
@@ -1043,7 +1016,7 @@ bool QJsonArray::operator!=(const QJsonArray &other) const
\overload
- The postfix -- operator, \c{it--}, makes the preceding item
+ The postfix \c{--} operator, \c{it--}, makes the preceding item
current and returns an iterator to the previously current item.
*/
@@ -1121,9 +1094,7 @@ QDebug operator<<(QDebug dbg, const QJsonArray &a)
#ifndef QT_NO_DATASTREAM
QDataStream &operator<<(QDataStream &stream, const QJsonArray &array)
{
- QJsonDocument doc{array};
- stream << doc.toJson(QJsonDocument::Compact);
- return stream;
+ return stream << QJsonDocument{array};
}
QDataStream &operator>>(QDataStream &stream, QJsonArray &array)
diff --git a/src/corelib/serialization/qjsonarray.h b/src/corelib/serialization/qjsonarray.h
index 406fbc2f47..26a04e9196 100644
--- a/src/corelib/serialization/qjsonarray.h
+++ b/src/corelib/serialization/qjsonarray.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QJSONARRAY_H
#define QJSONARRAY_H
@@ -59,8 +23,8 @@ public:
~QJsonArray();
- QJsonArray(const QJsonArray &other);
- QJsonArray &operator =(const QJsonArray &other);
+ QJsonArray(const QJsonArray &other) noexcept;
+ QJsonArray &operator =(const QJsonArray &other) noexcept;
QJsonArray(QJsonArray &&other) noexcept;
@@ -96,12 +60,13 @@ public:
QJsonValueRef operator[](qsizetype i);
QJsonValue operator[](qsizetype i) const;
+#if QT_CORE_REMOVED_SINCE(6, 8)
bool operator==(const QJsonArray &other) const;
bool operator!=(const QJsonArray &other) const;
-
+#endif
void swap(QJsonArray &other) noexcept
{
- qSwap(a, other.a);
+ a.swap(other.a);
}
class const_iterator;
@@ -120,48 +85,94 @@ public:
constexpr iterator(const iterator &other) = default;
iterator &operator=(const iterator &other)
{
- item.a = other.item.a;
- item.index = other.item.index;
+ item.rebind(other.item);
return *this;
}
inline QJsonValueRef operator*() const { return item; }
- inline QJsonValueRef *operator->() const { return &item; }
- inline QJsonValueRef operator[](qsizetype j) const
- { return { item.a, qsizetype(item.index) + j }; }
+ inline const QJsonValueConstRef *operator->() const { return &item; }
+ inline QJsonValueRef *operator->() { return &item; }
+ inline QJsonValueRef operator[](qsizetype j) const { return *(*this + j); }
+#if QT_CORE_REMOVED_SINCE(6, 8)
inline bool operator==(const iterator &o) const
- { return item.a == o.item.a && item.index == o.item.index; }
- inline bool operator!=(const iterator &o) const { return !(*this == o); }
+ { return item.d == o.item.d && item.index == o.item.index; }
+ inline bool operator!=(const iterator &o) const { return !operator==(o); }
inline bool operator<(const iterator &other) const
- { Q_ASSERT(item.a == other.item.a); return item.index < other.item.index; }
+ { Q_ASSERT(item.d == other.item.d); return item.index < other.item.index; }
inline bool operator<=(const iterator &other) const
- { Q_ASSERT(item.a == other.item.a); return item.index <= other.item.index; }
- inline bool operator>(const iterator &other) const { return !(*this <= other); }
- inline bool operator>=(const iterator &other) const { return !(*this < other); }
+ { Q_ASSERT(item.d == other.item.d); return item.index <= other.item.index; }
+ inline bool operator>(const iterator &other) const { return !operator<=(other); }
+ inline bool operator>=(const iterator &other) const { return !operator<(other); }
inline bool operator==(const const_iterator &o) const
- { return item.a == o.item.a && item.index == o.item.index; }
- inline bool operator!=(const const_iterator &o) const { return !(*this == o); }
+ { return item.d == o.item.d && item.index == o.item.index; }
+ inline bool operator!=(const const_iterator &o) const { return !operator==(o); }
inline bool operator<(const const_iterator &other) const
- { Q_ASSERT(item.a == other.item.a); return item.index < other.item.index; }
+ { Q_ASSERT(item.d == other.item.d); return item.index < other.item.index; }
inline bool operator<=(const const_iterator &other) const
- { Q_ASSERT(item.a == other.item.a); return item.index <= other.item.index; }
- inline bool operator>(const const_iterator &other) const { return !(*this <= other); }
- inline bool operator>=(const const_iterator &other) const { return !(*this < other); }
+ { Q_ASSERT(item.d == other.item.d); return item.index <= other.item.index; }
+ inline bool operator>(const const_iterator &other) const { return !operator<=(other); }
+ inline bool operator>=(const const_iterator &other) const { return !operator<(other); }
+#endif
inline iterator &operator++() { ++item.index; return *this; }
inline iterator operator++(int) { iterator n = *this; ++item.index; return n; }
inline iterator &operator--() { item.index--; return *this; }
inline iterator operator--(int) { iterator n = *this; item.index--; return n; }
inline iterator &operator+=(qsizetype j) { item.index += quint64(j); return *this; }
inline iterator &operator-=(qsizetype j) { item.index -= quint64(j); return *this; }
- inline iterator operator+(qsizetype j) const
- { return iterator(item.a, qsizetype(item.index) + j); }
- inline iterator operator-(qsizetype j) const
- { return iterator(item.a, qsizetype(item.index) - j); }
+ inline iterator operator+(qsizetype j) const { iterator r = *this; return r += j; }
+ inline iterator operator-(qsizetype j) const { return operator+(-j); }
inline qsizetype operator-(iterator j) const { return item.index - j.item.index; }
private:
- mutable QJsonValueRef item;
+ // Helper functions
+ static bool comparesEqual_helper(const iterator &lhs, const iterator &rhs) noexcept
+ {
+ return lhs.item.d == rhs.item.d && lhs.item.index == rhs.item.index;
+ }
+
+ static bool comparesEqual_helper(const iterator &lhs, const const_iterator &rhs) noexcept
+ {
+ return lhs.item.d == rhs.item.d && lhs.item.index == rhs.item.index;
+ }
+
+ static Qt::strong_ordering compareThreeWay_helper(const iterator &lhs,
+ const iterator &rhs) noexcept
+ {
+ Q_ASSERT(lhs.item.d == rhs.item.d);
+ return Qt::compareThreeWay(lhs.item.index, rhs.item.index);
+ }
+
+ static Qt::strong_ordering compareThreeWay_helper(const iterator &lhs,
+ const const_iterator &rhs) noexcept
+ {
+ Q_ASSERT(lhs.item.d == rhs.item.d);
+ return Qt::compareThreeWay(lhs.item.index, rhs.item.index);
+ }
+
+ // Compare friends
+ friend bool comparesEqual(const iterator &lhs, const iterator &rhs) noexcept
+ {
+ return comparesEqual_helper(lhs, rhs);
+ }
+ friend Qt::strong_ordering compareThreeWay(const iterator &lhs,
+ const iterator &rhs) noexcept
+ {
+ return compareThreeWay_helper(lhs, rhs);
+ }
+ Q_DECLARE_STRONGLY_ORDERED(iterator)
+ friend bool comparesEqual(const iterator &lhs, const const_iterator &rhs) noexcept
+ {
+ return comparesEqual_helper(lhs, rhs);
+ }
+ friend Qt::strong_ordering compareThreeWay(const iterator &lhs,
+ const const_iterator &rhs) noexcept
+ {
+ return compareThreeWay_helper(lhs, rhs);
+ }
+ Q_DECLARE_STRONGLY_ORDERED(iterator, const_iterator)
+
+ QJsonValueRef item;
friend class QJsonArray;
};
friend class iterator;
@@ -182,39 +193,61 @@ public:
constexpr const_iterator(const const_iterator &other) = default;
const_iterator &operator=(const const_iterator &other)
{
- item.a = other.item.a;
- item.index = other.item.index;
+ item.rebind(other.item);
return *this;
}
- inline const QJsonValueRef operator*() const { return item; }
- inline const QJsonValueRef *operator->() const { return &item; }
+ inline const QJsonValueConstRef operator*() const { return item; }
+ inline const QJsonValueConstRef *operator->() const { return &item; }
- inline QJsonValueRef operator[](qsizetype j) const
- { return { item.a, qsizetype(item.index) + j }; }
+ inline QJsonValueConstRef operator[](qsizetype j) const { return *(*this + j); }
+#if QT_CORE_REMOVED_SINCE(6, 8)
inline bool operator==(const const_iterator &o) const
- { return item.a == o.item.a && item.index == o.item.index; }
- inline bool operator!=(const const_iterator &o) const { return !(*this == o); }
+ { return item.d == o.item.d && item.index == o.item.index; }
+ inline bool operator!=(const const_iterator &o) const { return !operator==(o); }
inline bool operator<(const const_iterator &other) const
- { Q_ASSERT(item.a == other.item.a); return item.index < other.item.index; }
+ { Q_ASSERT(item.d == other.item.d); return item.index < other.item.index; }
inline bool operator<=(const const_iterator &other) const
- { Q_ASSERT(item.a == other.item.a); return item.index <= other.item.index; }
- inline bool operator>(const const_iterator &other) const { return !(*this <= other); }
- inline bool operator>=(const const_iterator &other) const { return !(*this < other); }
+ { Q_ASSERT(item.d == other.item.d); return item.index <= other.item.index; }
+ inline bool operator>(const const_iterator &other) const { return !operator<=(other); }
+ inline bool operator>=(const const_iterator &other) const { return !operator<(other); }
+#endif
inline const_iterator &operator++() { ++item.index; return *this; }
inline const_iterator operator++(int) { const_iterator n = *this; ++item.index; return n; }
inline const_iterator &operator--() { item.index--; return *this; }
inline const_iterator operator--(int) { const_iterator n = *this; item.index--; return n; }
inline const_iterator &operator+=(qsizetype j) { item.index += quint64(j); return *this; }
inline const_iterator &operator-=(qsizetype j) { item.index -= quint64(j); return *this; }
- inline const_iterator operator+(qsizetype j) const
- { return const_iterator(item.a, qsizetype(item.index) + j); }
- inline const_iterator operator-(qsizetype j) const
- { return const_iterator(item.a, qsizetype(item.index) - j); }
+ inline const_iterator operator+(qsizetype j) const { const_iterator r = *this; return r += j; }
+ inline const_iterator operator-(qsizetype j) const { return operator+(-j); }
inline qsizetype operator-(const_iterator j) const { return item.index - j.item.index; }
private:
- QJsonValueRef item;
+ // Helper functions
+ static bool comparesEqual_helper(const const_iterator &lhs,
+ const const_iterator &rhs) noexcept
+ {
+ return lhs.item.d == rhs.item.d && lhs.item.index == rhs.item.index;
+ }
+ static Qt::strong_ordering compareThreeWay_helper(const const_iterator &lhs,
+ const const_iterator &rhs) noexcept
+ {
+ Q_ASSERT(lhs.item.d == rhs.item.d);
+ return Qt::compareThreeWay(lhs.item.index, rhs.item.index);
+ }
+
+ // Compare friends
+ friend bool comparesEqual(const const_iterator &lhs, const const_iterator &rhs) noexcept
+ {
+ return comparesEqual_helper(lhs, rhs);
+ }
+ friend Qt::strong_ordering compareThreeWay(const const_iterator &lhs,
+ const const_iterator &rhs) noexcept
+ {
+ return compareThreeWay_helper(lhs, rhs);
+ }
+ Q_DECLARE_STRONGLY_ORDERED(const_iterator)
+ QJsonValueConstRef item;
friend class QJsonArray;
};
friend class const_iterator;
@@ -261,10 +294,21 @@ public:
private:
friend class QJsonValue;
+ friend class QJsonValueConstRef;
+ friend class QJsonValueRef;
+ friend class QJsonPrivate::Value;
friend class QJsonDocument;
friend class QCborArray;
friend Q_CORE_EXPORT QDebug operator<<(QDebug, const QJsonArray &);
+ friend Q_CORE_EXPORT bool comparesEqual(const QJsonArray &lhs,
+ const QJsonArray &rhs) noexcept;
+
+ friend Q_CORE_EXPORT bool comparesEqual(const QJsonArray &lhs,
+ const QJsonValue &rhs) noexcept;
+ Q_DECLARE_EQUALITY_COMPARABLE(QJsonArray)
+ Q_DECLARE_EQUALITY_COMPARABLE(QJsonArray, QJsonValue)
+
QJsonArray(QCborContainerPrivate *array);
bool detach(qsizetype reserve = 0);
@@ -273,6 +317,12 @@ private:
Q_DECLARE_SHARED(QJsonArray)
+#if QT_VERSION >= QT_VERSION_CHECK(7, 0, 0) || defined(QT_BOOTSTRAPPED)
+inline QJsonValueConstRef::QJsonValueConstRef(QJsonArray *a, qsizetype idx)
+ : d(a ? a->a.data() : nullptr), is_object(false), index(idx)
+{}
+#endif
+
Q_CORE_EXPORT size_t qHash(const QJsonArray &array, size_t seed = 0);
#if !defined(QT_NO_DEBUG_STREAM) && !defined(QT_JSON_READONLY)
diff --git a/src/corelib/serialization/qjsoncbor.cpp b/src/corelib/serialization/qjsoncbor.cpp
index 3d79388b1d..da07eca8a7 100644
--- a/src/corelib/serialization/qjsoncbor.cpp
+++ b/src/corelib/serialization/qjsoncbor.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qcborvalue.h"
#include "qcborvalue_p.h"
@@ -48,6 +12,9 @@
#include "qjsondocument.h"
#include "qjson_p.h"
+#include <qmap.h>
+#include <qhash.h>
+
#include <private/qnumeric_p.h>
#include <quuid.h>
@@ -98,7 +65,6 @@ static QString maybeEncodeTag(const QCborContainerPrivate *d)
{
qint64 tag = d->elements.at(0).value;
const Element &e = d->elements.at(1);
- const ByteData *b = d->byteData(e);
switch (tag) {
case qint64(QCborKnownTags::DateTimeString):
@@ -115,8 +81,12 @@ static QString maybeEncodeTag(const QCborContainerPrivate *d)
break;
case qint64(QCborKnownTags::Uuid):
- if (e.type == QCborValue::ByteArray && b->len == sizeof(QUuid))
+#ifndef QT_BOOTSTRAPPED
+ if (const ByteData *b = d->byteData(e); e.type == QCborValue::ByteArray && b
+ && b->len == sizeof(QUuid))
return QUuid::fromRfc4122(b->asByteArrayView()).toString(QUuid::WithoutBraces);
+#endif
+ break;
}
// don't know what to do, bail out
@@ -205,10 +175,14 @@ static QJsonValue convertExtendedTypeToJson(QCborContainerPrivate *d)
switch (tag) {
case qint64(QCborKnownTags::Url):
- // use the fullly-encoded URL form
+#ifdef QT_BOOTSTRAPPED
+ break;
+#else
+ // use the fully-encoded URL form
if (d->elements.at(1).type == QCborValue::String)
return QUrl::fromEncoded(d->byteData(1)->asByteArrayView()).toString(QUrl::FullyEncoded);
Q_FALLTHROUGH();
+#endif
case qint64(QCborKnownTags::DateTimeString):
case qint64(QCborKnownTags::ExpectedBase64url):
@@ -424,10 +398,12 @@ QJsonValue QCborValue::toJsonValue() const
return QJsonPrivate::Value::fromTrustedCbor(simpleTypeString(type()));
}
+#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0) && !defined(QT_BOOTSTRAPPED)
QJsonValue QCborValueRef::toJsonValue() const
{
return qt_convertToJson(d, i);
}
+#endif
/*!
Recursively converts every \l QCborValue element in this array to JSON
@@ -445,11 +421,13 @@ QJsonArray QCborArray::toJsonArray() const
return convertToJsonArray(d.data());
}
+#ifndef QT_NO_VARIANT
QJsonArray QJsonPrivate::Variant::toJsonArray(const QVariantList &list)
{
const auto cborArray = QCborArray::fromVariantList(list);
return convertToJsonArray(cborArray.d.data(), ConversionMode::FromVariantToJson);
}
+#endif // !QT_NO_VARIANT
/*!
Recursively converts every \l QCborValue value in this map to JSON using
@@ -493,6 +471,7 @@ QJsonObject QCborMap::toJsonObject() const
return convertToJsonObject(d.data());
}
+#ifndef QT_NO_VARIANT
QJsonObject QJsonPrivate::Variant::toJsonObject(const QVariantMap &map)
{
const auto cborMap = QCborMap::fromVariantMap(map);
@@ -580,15 +559,15 @@ QVariant QCborValue::toVariant() const
#ifndef QT_BOOTSTRAPPED
case Url:
return toUrl();
-#endif
-#if QT_CONFIG(regularexpression)
+# if QT_CONFIG(regularexpression)
case RegularExpression:
return toRegularExpression();
-#endif
+# endif
case Uuid:
return toUuid();
+#endif
case Invalid:
return QVariant();
@@ -600,9 +579,9 @@ QVariant QCborValue::toVariant() const
if (isSimpleType())
return QVariant::fromValue(toSimpleType());
- Q_UNREACHABLE();
- return QVariant();
+ Q_UNREACHABLE_RETURN(QVariant());
}
+#endif // !QT_NO_VARIANT
/*!
Converts the JSON value contained in \a v into its corresponding CBOR value
@@ -656,6 +635,7 @@ QCborValue QCborValue::fromJsonValue(const QJsonValue &v)
return QCborValue();
}
+#ifndef QT_NO_VARIANT
static void appendVariant(QCborContainerPrivate *d, const QVariant &variant)
{
// Handle strings and byte arrays directly, to avoid creating a temporary
@@ -757,9 +737,9 @@ QCborValue QCborValue::fromVariant(const QVariant &variant)
#ifndef QT_BOOTSTRAPPED
case QMetaType::QUrl:
return QCborValue(variant.toUrl());
-#endif
case QMetaType::QUuid:
return QCborValue(variant.toUuid());
+#endif
case QMetaType::QVariantList:
return QCborArray::fromVariantList(variant.toList());
case QMetaType::QVariantMap:
@@ -856,6 +836,7 @@ QCborArray QCborArray::fromVariantList(const QVariantList &list)
appendVariant(a.d.data(), v);
return a;
}
+#endif // !QT_NO_VARIANT
/*!
Converts all JSON items found in the \a array array to CBOR using
@@ -887,6 +868,7 @@ QCborArray QCborArray::fromJsonArray(QJsonArray &&array) noexcept
}
+#ifndef QT_NO_VARIANT
/*!
Converts the CBOR values to QVariant using QCborValue::toVariant() and
"stringifies" all the CBOR keys in this map, returning the QVariantMap that
@@ -983,6 +965,7 @@ QCborMap QCborMap::fromVariantHash(const QVariantHash &hash)
}
return m;
}
+#endif // !QT_NO_VARIANT
/*!
Converts all JSON items found in the \a obj object to CBOR using
diff --git a/src/corelib/serialization/qjsondocument.cpp b/src/corelib/serialization/qjsondocument.cpp
index 6b015d759d..e2528f18dc 100644
--- a/src/corelib/serialization/qjsondocument.cpp
+++ b/src/corelib/serialization/qjsondocument.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include <qjsondocument.h>
#include <qjsonobject.h>
@@ -43,6 +7,8 @@
#include <qjsonarray.h>
#include <qstringlist.h>
#include <qvariant.h>
+#include <qmap.h>
+#include <qhash.h>
#include <qdebug.h>
#include <qcbormap.h>
#include <qcborarray.h>
@@ -58,11 +24,14 @@ QT_BEGIN_NAMESPACE
\inmodule QtCore
\ingroup json
\ingroup shared
+ \ingroup qtserialization
\reentrant
\since 5.0
\brief The QJsonDocument class provides a way to read and write JSON documents.
+ \compares equality
+
QJsonDocument is a class that wraps a complete JSON document and can read
this document from, and write it to, a UTF-8 encoded text-based
representation.
@@ -77,7 +46,7 @@ QT_BEGIN_NAMESPACE
and isObject(). The array or object contained in the document can be retrieved using
array() or object() and then read or manipulated.
- \sa {JSON Support in Qt}, {JSON Save Game Example}
+ \sa {JSON Support in Qt}, {Saving and Loading a Game}
*/
@@ -214,6 +183,7 @@ QJsonDocument &QJsonDocument::operator =(const QJsonDocument &other)
Swaps the document \a other with this. This operation is very fast and never fails.
*/
+#ifndef QT_NO_VARIANT
/*!
Creates a QJsonDocument from the QVariant \a variant.
@@ -264,6 +234,7 @@ QVariant QJsonDocument::toVariant() const
return QJsonArray(container).toVariantList();
return QJsonObject(container).toVariantMap();
}
+#endif // !QT_NO_VARIANT
/*!
\enum QJsonDocument::JsonFormat
@@ -285,7 +256,7 @@ QVariant QJsonDocument::toVariant() const
\sa fromJson(), JsonFormat
*/
-#if !defined(QT_JSON_READONLY) || defined(Q_CLANG_QDOC)
+#if !defined(QT_JSON_READONLY) || defined(Q_QDOC)
QByteArray QJsonDocument::toJson(JsonFormat format) const
{
QByteArray json;
@@ -314,7 +285,7 @@ QByteArray QJsonDocument::toJson(JsonFormat format) const
*/
QJsonDocument QJsonDocument::fromJson(const QByteArray &json, QJsonParseError *error)
{
- QJsonPrivate::Parser parser(json.constData(), json.length());
+ QJsonPrivate::Parser parser(json.constData(), json.size());
QJsonDocument result;
const QCborValue val = parser.parse(error);
if (val.isArray() || val.isMap()) {
@@ -425,7 +396,6 @@ void QJsonDocument::setArray(const QJsonArray &array)
d->value = QCborValue::fromJsonValue(array);
}
-#if QT_STRINGVIEW_LEVEL < 2
/*!
Returns a QJsonValue representing the value for the key \a key.
@@ -442,7 +412,6 @@ const QJsonValue QJsonDocument::operator[](const QString &key) const
{
return (*this)[QStringView(key)];
}
-#endif
/*!
\overload
@@ -460,7 +429,7 @@ const QJsonValue QJsonDocument::operator[](QStringView key) const
\overload
\since 5.10
*/
-const QJsonValue QJsonDocument::operator[](QLatin1String key) const
+const QJsonValue QJsonDocument::operator[](QLatin1StringView key) const
{
if (!isObject())
return QJsonValue(QJsonValue::Undefined);
@@ -489,20 +458,22 @@ const QJsonValue QJsonDocument::operator[](qsizetype i) const
}
/*!
- Returns \c true if the \a other document is equal to this document.
- */
-bool QJsonDocument::operator==(const QJsonDocument &other) const
+ \fn bool QJsonDocument::operator==(const QJsonDocument &lhs, const QJsonDocument &rhs)
+
+ Returns \c true if the \a lhs document is equal to \a rhs document, \c false otherwise.
+*/
+bool comparesEqual(const QJsonDocument &lhs, const QJsonDocument &rhs) noexcept
{
- if (d && other.d)
- return d->value == other.d->value;
- return !d == !other.d;
+ if (lhs.d && rhs.d)
+ return lhs.d->value == rhs.d->value;
+ return !lhs.d == !rhs.d;
}
/*!
- \fn bool QJsonDocument::operator!=(const QJsonDocument &other) const
+ \fn bool QJsonDocument::operator!=(const QJsonDocument &lhs, const QJsonDocument &rhs)
- returns \c true if \a other is not equal to this document
- */
+ Returns \c true if the \a lhs document is not equal to \a rhs document, \c false otherwise.
+*/
/*!
returns \c true if this document is null.
diff --git a/src/corelib/serialization/qjsondocument.h b/src/corelib/serialization/qjsondocument.h
index d262a5e6b6..3659f7b5cb 100644
--- a/src/corelib/serialization/qjsondocument.h
+++ b/src/corelib/serialization/qjsondocument.h
@@ -1,45 +1,10 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QJSONDOCUMENT_H
#define QJSONDOCUMENT_H
+#include <QtCore/qcompare.h>
#include <QtCore/qjsonvalue.h>
#include <QtCore/qscopedpointer.h>
@@ -116,7 +81,7 @@ public:
static QJsonDocument fromJson(const QByteArray &json, QJsonParseError *error = nullptr);
-#if !defined(QT_JSON_READONLY) || defined(Q_CLANG_QDOC)
+#if !defined(QT_JSON_READONLY) || defined(Q_QDOC)
QByteArray toJson(JsonFormat format = Indented) const;
#endif
@@ -130,22 +95,23 @@ public:
void setObject(const QJsonObject &object);
void setArray(const QJsonArray &array);
-#if QT_STRINGVIEW_LEVEL < 2
const QJsonValue operator[](const QString &key) const;
-#endif
const QJsonValue operator[](QStringView key) const;
- const QJsonValue operator[](QLatin1String key) const;
+ const QJsonValue operator[](QLatin1StringView key) const;
const QJsonValue operator[](qsizetype i) const;
-
+#if QT_CORE_REMOVED_SINCE(6, 8)
bool operator==(const QJsonDocument &other) const;
- bool operator!=(const QJsonDocument &other) const { return !(*this == other); }
-
+ bool operator!=(const QJsonDocument &other) const { return !operator==(other); }
+#endif
bool isNull() const;
private:
friend class QJsonValue;
friend class QJsonPrivate::Parser;
friend Q_CORE_EXPORT QDebug operator<<(QDebug, const QJsonDocument &);
+ friend Q_CORE_EXPORT bool comparesEqual(const QJsonDocument &lhs,
+ const QJsonDocument &rhs) noexcept;
+ Q_DECLARE_EQUALITY_COMPARABLE(QJsonDocument)
QJsonDocument(const QCborValue &data);
diff --git a/src/corelib/serialization/qjsonobject.cpp b/src/corelib/serialization/qjsonobject.cpp
index a06af5d02d..2f61de0824 100644
--- a/src/corelib/serialization/qjsonobject.cpp
+++ b/src/corelib/serialization/qjsonobject.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include <qjsonobject.h>
#include <qjsonvalue.h>
@@ -45,6 +9,8 @@
#include <qdebug.h>
#include <qvariant.h>
#include <qcbormap.h>
+#include <qmap.h>
+#include <qhash.h>
#include <private/qcborvalue_p.h>
#include "qjsonwriter_p.h"
@@ -59,11 +25,16 @@ QT_BEGIN_NAMESPACE
\inmodule QtCore
\ingroup json
\ingroup shared
+ \ingroup qtserialization
\reentrant
\since 5.0
\brief The QJsonObject class encapsulates a JSON object.
+ \compares equality
+ \compareswith equality QJsonValue QJsonValueConstRef
+ \endcompareswith
+
A JSON object is a list of key value pairs, where the keys are unique strings
and the values are represented by a QJsonValue.
@@ -76,7 +47,7 @@ QT_BEGIN_NAMESPACE
You can convert the object to and from text based JSON through QJsonDocument.
- \sa {JSON Support in Qt}, {JSON Save Game Example}
+ \sa {JSON Support in Qt}, {Saving and Loading a Game}
*/
/*!
@@ -118,7 +89,7 @@ QT_BEGIN_NAMESPACE
QJsonObject::QJsonObject() = default;
/*!
- \fn QJsonObject::QJsonObject(std::initializer_list<QPair<QString, QJsonValue> > args)
+ \fn QJsonObject::QJsonObject(std::initializer_list<std::pair<QString, QJsonValue> > args)
\since 5.4
Constructs a QJsonObject instance initialized from \a args initialization list.
For example:
@@ -137,7 +108,6 @@ QJsonObject::QJsonObject() = default;
QJsonObject::QJsonObject(QCborContainerPrivate *object)
: o(object)
{
- Q_ASSERT(o);
}
/*!
@@ -145,7 +115,7 @@ QJsonObject::QJsonObject(QCborContainerPrivate *object)
*/
QJsonObject::~QJsonObject() = default;
-QJsonObject::QJsonObject(std::initializer_list<QPair<QString, QJsonValue> > args)
+QJsonObject::QJsonObject(std::initializer_list<std::pair<QString, QJsonValue> > args)
{
for (const auto &arg : args)
insert(arg.first, arg.second);
@@ -157,11 +127,13 @@ QJsonObject::QJsonObject(std::initializer_list<QPair<QString, QJsonValue> > args
Since QJsonObject is implicitly shared, the copy is shallow
as long as the object does not get modified.
*/
-QJsonObject::QJsonObject(const QJsonObject &other)
-{
- o = other.o;
-}
+QJsonObject::QJsonObject(const QJsonObject &other) noexcept = default;
+
+/*!
+ \since 5.10
+ Move-constructs a QJsonObject from \a other.
+*/
QJsonObject::QJsonObject(QJsonObject &&other) noexcept
: o(other.o)
{
@@ -171,18 +143,8 @@ QJsonObject::QJsonObject(QJsonObject &&other) noexcept
/*!
Assigns \a other to this object.
*/
-QJsonObject &QJsonObject::operator =(const QJsonObject &other)
-{
- o = other.o;
- return *this;
-}
+QJsonObject &QJsonObject::operator =(const QJsonObject &other) noexcept = default;
-/*!
- \fn QJsonObject::QJsonObject(QJsonObject &&other)
- \since 5.10
-
- Move-constructs a QJsonObject from \a other.
-*/
/*!
\fn QJsonObject &QJsonObject::operator =(QJsonObject &&other)
@@ -198,7 +160,7 @@ QJsonObject &QJsonObject::operator =(const QJsonObject &other)
Swaps the object \a other with this. This operation is very fast and never fails.
*/
-
+#ifndef QT_NO_VARIANT
/*!
Converts the variant map \a map to a QJsonObject.
@@ -261,18 +223,19 @@ QVariantHash QJsonObject::toVariantHash() const
{
return QCborMap::fromJsonObject(*this).toVariantHash();
}
+#endif // !QT_NO_VARIANT
/*!
Returns a list of all keys in this object.
- The list is sorted lexographically.
+ The list is sorted alphabetically.
*/
QStringList QJsonObject::keys() const
{
QStringList keys;
if (o) {
- keys.reserve(o->elements.length() / 2);
- for (qsizetype i = 0, end = o->elements.length(); i < end; i += 2)
+ keys.reserve(o->elements.size() / 2);
+ for (qsizetype i = 0, end = o->elements.size(); i < end; i += 2)
keys.append(o->stringAt(i));
}
return keys;
@@ -283,7 +246,7 @@ QStringList QJsonObject::keys() const
*/
qsizetype QJsonObject::size() const
{
- return o ? o->elements.length() / 2 : 0;
+ return o ? o->elements.size() / 2 : 0;
}
/*!
@@ -306,14 +269,13 @@ static qsizetype indexOf(const QExplicitlySharedDataPointer<QCborContainerPrivat
const auto it = std::lower_bound(
begin, end, key,
[&](const QJsonPrivate::ConstKeyIterator::value_type &e, const String &key) {
- return o->stringCompareElement(e.key(), key) < 0;
+ return o->stringCompareElement(e.key(), key, QtCbor::Comparison::ForOrdering) < 0;
});
*keyExists = (it != end) && o->stringEqualsElement((*it).key(), key);
- return (it - begin) * 2;
+ return it.it - begin.it;
}
-#if QT_STRINGVIEW_LEVEL < 2
/*!
Returns a QJsonValue representing the value for the key \a key.
@@ -325,7 +287,6 @@ QJsonValue QJsonObject::value(const QString &key) const
{
return value(QStringView(key));
}
-#endif
/*!
\overload
@@ -340,7 +301,7 @@ QJsonValue QJsonObject::value(QStringView key) const
\overload
\since 5.7
*/
-QJsonValue QJsonObject::value(QLatin1String key) const
+QJsonValue QJsonObject::value(QLatin1StringView key) const
{
return valueImpl(key);
}
@@ -361,7 +322,6 @@ QJsonValue QJsonObject::valueImpl(T key) const
return QJsonPrivate::Value::fromTrustedCbor(o->valueAt(i + 1));
}
-#if QT_STRINGVIEW_LEVEL < 2
/*!
Returns a QJsonValue representing the value for the key \a key.
@@ -375,7 +335,6 @@ QJsonValue QJsonObject::operator [](const QString &key) const
{
return (*this)[QStringView(key)];
}
-#endif
/*!
\fn QJsonValue QJsonObject::operator [](QStringView key) const
@@ -385,13 +344,12 @@ QJsonValue QJsonObject::operator [](const QString &key) const
*/
/*!
- \fn QJsonValue QJsonObject::operator [](QLatin1String key) const
+ \fn QJsonValue QJsonObject::operator [](QLatin1StringView key) const
\overload
\since 5.7
*/
-#if QT_STRINGVIEW_LEVEL < 2
/*!
Returns a reference to the value for \a key. If there is no value with key
\a key in the object, one is created with a QJsonValue::Null value and then
@@ -409,7 +367,6 @@ QJsonValueRef QJsonObject::operator [](const QString &key)
{
return (*this)[QStringView(key)];
}
-#endif
/*!
\overload
@@ -424,7 +381,7 @@ QJsonValueRef QJsonObject::operator [](QStringView key)
\overload
\since 5.7
*/
-QJsonValueRef QJsonObject::operator [](QLatin1String key)
+QJsonValueRef QJsonObject::operator [](QLatin1StringView key)
{
return atImpl(key);
}
@@ -441,7 +398,7 @@ QJsonValueRef QJsonObject::atImpl(T key)
bool keyExists = false;
auto index = indexOf(o, key, &keyExists);
if (!keyExists) {
- detach(o->elements.length() / 2 + 1);
+ detach(o->elements.size() / 2 + 1);
o->insertAt(index, key);
o->insertAt(index + 1, QCborValue::fromJsonValue(QJsonValue()));
}
@@ -449,7 +406,6 @@ QJsonValueRef QJsonObject::atImpl(T key)
return QJsonValueRef(this, index / 2);
}
-#if QT_STRINGVIEW_LEVEL < 2
/*!
Inserts a new item with the key \a key and a value of \a value.
@@ -467,7 +423,6 @@ QJsonObject::iterator QJsonObject::insert(const QString &key, const QJsonValue &
{
return insert(QStringView(key), value);
}
-#endif
/*!
\overload
@@ -482,7 +437,7 @@ QJsonObject::iterator QJsonObject::insert(QStringView key, const QJsonValue &val
\overload
\since 5.14
*/
-QJsonObject::iterator QJsonObject::insert(QLatin1String key, const QJsonValue &value)
+QJsonObject::iterator QJsonObject::insert(QLatin1StringView key, const QJsonValue &value)
{
return insertImpl(key, value);
}
@@ -509,7 +464,7 @@ template <typename T>
QJsonObject::iterator QJsonObject::insertAt(qsizetype pos, T key, const QJsonValue &value, bool keyExists)
{
if (o)
- detach(o->elements.length() / 2 + (keyExists ? 0 : 1));
+ detach(o->elements.size() / 2 + (keyExists ? 0 : 1));
else
o = new QCborContainerPrivate;
@@ -522,7 +477,6 @@ QJsonObject::iterator QJsonObject::insertAt(qsizetype pos, T key, const QJsonVal
return {this, pos / 2};
}
-#if QT_STRINGVIEW_LEVEL < 2
/*!
Removes \a key from the object.
@@ -532,7 +486,6 @@ void QJsonObject::remove(const QString &key)
{
remove(QStringView(key));
}
-#endif
/*!
\overload
@@ -547,7 +500,7 @@ void QJsonObject::remove(QStringView key)
\overload
\since 5.14
*/
-void QJsonObject::remove(QLatin1String key)
+void QJsonObject::remove(QLatin1StringView key)
{
removeImpl(key);
}
@@ -566,10 +519,9 @@ void QJsonObject::removeImpl(T key)
if (!keyExists)
return;
- removeAt(index / 2);
+ removeAt(index);
}
-#if QT_STRINGVIEW_LEVEL < 2
/*!
Removes \a key from the object.
@@ -583,7 +535,6 @@ QJsonValue QJsonObject::take(const QString &key)
{
return take(QStringView(key));
}
-#endif
/*!
\overload
@@ -598,7 +549,7 @@ QJsonValue QJsonObject::take(QStringView key)
\overload
\since 5.14
*/
-QJsonValue QJsonObject::take(QLatin1String key)
+QJsonValue QJsonObject::take(QLatin1StringView key)
{
return takeImpl(key);
}
@@ -619,11 +570,10 @@ QJsonValue QJsonObject::takeImpl(T key)
detach();
const QJsonValue v = QJsonPrivate::Value::fromTrustedCbor(o->extractAt(index + 1));
- removeAt(index / 2);
+ removeAt(index);
return v;
}
-#if QT_STRINGVIEW_LEVEL < 2
/*!
Returns \c true if the object contains key \a key.
@@ -633,7 +583,6 @@ bool QJsonObject::contains(const QString &key) const
{
return contains(QStringView(key));
}
-#endif
/*!
\overload
@@ -648,7 +597,7 @@ bool QJsonObject::contains(QStringView key) const
\overload
\since 5.7
*/
-bool QJsonObject::contains(QLatin1String key) const
+bool QJsonObject::contains(QLatin1StringView key) const
{
return containsImpl(key);
}
@@ -668,22 +617,24 @@ bool QJsonObject::containsImpl(T key) const
}
/*!
- Returns \c true if \a other is equal to this object.
- */
-bool QJsonObject::operator==(const QJsonObject &other) const
+ \fn bool QJsonObject::operator==(const QJsonObject &lhs, const QJsonObject &rhs)
+
+ Returns \c true if \a lhs object is equal to \a rhs, \c false otherwise.
+*/
+bool comparesEqual(const QJsonObject &lhs, const QJsonObject &rhs) noexcept
{
- if (o == other.o)
+ if (lhs.o == rhs.o)
return true;
- if (!o)
- return !other.o->elements.length();
- if (!other.o)
- return !o->elements.length();
- if (o->elements.length() != other.o->elements.length())
+ if (!lhs.o)
+ return !rhs.o->elements.size();
+ if (!rhs.o)
+ return !lhs.o->elements.size();
+ if (lhs.o->elements.size() != rhs.o->elements.size())
return false;
- for (qsizetype i = 0, end = o->elements.length(); i < end; ++i) {
- if (o->valueAt(i) != other.o->valueAt(i))
+ for (qsizetype i = 0, end = lhs.o->elements.size(); i < end; ++i) {
+ if (lhs.o->valueAt(i) != rhs.o->valueAt(i))
return false;
}
@@ -691,12 +642,10 @@ bool QJsonObject::operator==(const QJsonObject &other) const
}
/*!
- Returns \c true if \a other is not equal to this object.
- */
-bool QJsonObject::operator!=(const QJsonObject &other) const
-{
- return !(*this == other);
-}
+ \fn bool QJsonObject::operator!=(const QJsonObject &lhs, const QJsonObject &rhs)
+
+ Returns \c true if \a lhs object is not equal to \a rhs, \c false otherwise.
+*/
/*!
Removes the (key, value) pair pointed to by the iterator \a it
@@ -707,16 +656,14 @@ bool QJsonObject::operator!=(const QJsonObject &other) const
*/
QJsonObject::iterator QJsonObject::erase(QJsonObject::iterator it)
{
- if (it.item.o != this || qsizetype(it.item.index) >= o->elements.length())
- return {this, o->elements.length()};
-
- removeAt(it.item.index);
+ removeAt(it.item.index * 2);
- // iterator hasn't changed
- return it;
+ // index hasn't changed; the container pointer shouldn't have changed
+ // because we shouldn't have detached (detaching happens on obtaining a
+ // non-const iterator). But just in case we did, reload the pointer.
+ return { this, qsizetype(it.item.index) };
}
-#if QT_STRINGVIEW_LEVEL < 2
/*!
Returns an iterator pointing to the item with key \a key in the
map.
@@ -728,7 +675,6 @@ QJsonObject::iterator QJsonObject::find(const QString &key)
{
return find(QStringView(key));
}
-#endif
/*!
\overload
@@ -743,7 +689,7 @@ QJsonObject::iterator QJsonObject::find(QStringView key)
\overload
\since 5.7
*/
-QJsonObject::iterator QJsonObject::find(QLatin1String key)
+QJsonObject::iterator QJsonObject::find(QLatin1StringView key)
{
return findImpl(key);
}
@@ -762,12 +708,10 @@ QJsonObject::iterator QJsonObject::findImpl(T key)
return {this, index / 2};
}
-#if QT_STRINGVIEW_LEVEL < 2
/*! \fn QJsonObject::const_iterator QJsonObject::find(const QString &key) const
\overload
*/
-#endif
/*! \fn QJsonObject::const_iterator QJsonObject::find(QStringView key) const
@@ -775,13 +719,12 @@ QJsonObject::iterator QJsonObject::findImpl(T key)
\since 5.14
*/
-/*! \fn QJsonObject::const_iterator QJsonObject::find(QLatin1String key) const
+/*! \fn QJsonObject::const_iterator QJsonObject::find(QLatin1StringView key) const
\overload
\since 5.7
*/
-#if QT_STRINGVIEW_LEVEL < 2
/*!
Returns a const iterator pointing to the item with key \a key in the
map.
@@ -793,7 +736,6 @@ QJsonObject::const_iterator QJsonObject::constFind(const QString &key) const
{
return constFind(QStringView(key));
}
-#endif
/*!
\overload
@@ -808,7 +750,7 @@ QJsonObject::const_iterator QJsonObject::constFind(QStringView key) const
\overload
\since 5.7
*/
-QJsonObject::const_iterator QJsonObject::constFind(QLatin1String key) const
+QJsonObject::const_iterator QJsonObject::constFind(QLatin1StringView key) const
{
return constFindImpl(key);
}
@@ -898,6 +840,10 @@ QJsonObject::const_iterator QJsonObject::constFindImpl(T key) const
\brief The QJsonObject::iterator class provides an STL-style non-const iterator for QJsonObject.
+ \compares strong
+ \compareswith strong QJsonObject::const_iterator
+ \endcompareswith
+
QJsonObject::iterator allows you to iterate over a QJsonObject
and to modify the value (but not the key) stored under
a particular key. If you want to iterate over a const QJsonObject, you
@@ -914,7 +860,7 @@ QJsonObject::const_iterator QJsonObject::constFindImpl(T key) const
Multiple iterators can be used on the same object. Existing iterators will however
become dangling once the object gets modified.
- \sa QJsonObject::const_iterator, {JSON Support in Qt}, {JSON Save Game Example}
+ \sa QJsonObject::const_iterator, {JSON Support in Qt}, {Saving and Loading a Game}
*/
/*! \typedef QJsonObject::iterator::difference_type
@@ -1003,12 +949,17 @@ QJsonObject::const_iterator QJsonObject::constFindImpl(T key) const
\sa key()
*/
-/*! \fn QJsonValueRef *QJsonObject::iterator::operator->() const
+/*! \fn QJsonValueRef *QJsonObject::iterator::operator->()
Returns a pointer to a modifiable reference to the current item.
*/
-/*! \fn const QJsonValueRef QJsonObject::iterator::operator[](qsizetype j)
+/*! \fn const QJsonValueConstRef *QJsonObject::iterator::operator->() const
+
+ Returns a pointer to a constant reference to the current item.
+*/
+
+/*! \fn const QJsonValueRef QJsonObject::iterator::operator[](qsizetype j) const
Returns a modifiable reference to the item at offset \a j from the
item pointed to by this iterator (the item at position \c{*this + j}).
@@ -1026,60 +977,60 @@ QJsonObject::const_iterator QJsonObject::constFindImpl(T key) const
*/
/*!
- \fn bool QJsonObject::iterator::operator==(const iterator &other) const
- \fn bool QJsonObject::iterator::operator==(const const_iterator &other) const
+ \fn bool QJsonObject::iterator::operator==(const iterator &lhs, const iterator &rhs)
+ \fn bool QJsonObject::iterator::operator==(const iterator &lhs, const const_iterator &rhs)
- Returns \c true if \a other points to the same item as this
+ Returns \c true if \a lhs points to the same item as \a rhs
iterator; otherwise returns \c false.
\sa operator!=()
*/
/*!
- \fn bool QJsonObject::iterator::operator!=(const iterator &other) const
- \fn bool QJsonObject::iterator::operator!=(const const_iterator &other) const
+ \fn bool QJsonObject::iterator::operator!=(const iterator &lhs, const iterator &rhs)
+ \fn bool QJsonObject::iterator::operator!=(const iterator &lhs, const const_iterator &rhs)
- Returns \c true if \a other points to a different item than this
+ Returns \c true if \a lhs points to a different item than \a rhs
iterator; otherwise returns \c false.
\sa operator==()
*/
/*!
- \fn bool QJsonObject::iterator::operator<(const iterator& other) const
- \fn bool QJsonObject::iterator::operator<(const const_iterator& other) const
+ \fn bool QJsonObject::iterator::operator<(const iterator &lhs, const iterator &rhs)
+ \fn bool QJsonObject::iterator::operator<(const iterator &lhs, const const_iterator &rhs)
- Returns \c true if the item pointed to by this iterator is less than
- the item pointed to by the \a other iterator.
+ Returns \c true if the item pointed to by \a lhs iterator is less than
+ the item pointed to by the \a rhs iterator.
*/
/*!
- \fn bool QJsonObject::iterator::operator<=(const iterator& other) const
- \fn bool QJsonObject::iterator::operator<=(const const_iterator& other) const
+ \fn bool QJsonObject::iterator::operator<=(const iterator &lhs, const iterator &rhs)
+ \fn bool QJsonObject::iterator::operator<=(const iterator &lhs, const const_iterator &rhs)
- Returns \c true if the item pointed to by this iterator is less than
- or equal to the item pointed to by the \a other iterator.
+ Returns \c true if the item pointed to by \a lhs iterator is less than
+ or equal to the item pointed to by the \a rhs iterator.
*/
/*!
- \fn bool QJsonObject::iterator::operator>(const iterator& other) const
- \fn bool QJsonObject::iterator::operator>(const const_iterator& other) const
+ \fn bool QJsonObject::iterator::operator>(const iterator &lhs, const iterator &rhs)
+ \fn bool QJsonObject::iterator::operator>(const iterator &lhs, const const_iterator &rhs)
- Returns \c true if the item pointed to by this iterator is greater
- than the item pointed to by the \a other iterator.
+ Returns \c true if the item pointed to by \a lhs iterator is greater
+ than the item pointed to by the \a rhs iterator.
*/
/*!
- \fn bool QJsonObject::iterator::operator>=(const iterator& other) const
- \fn bool QJsonObject::iterator::operator>=(const const_iterator& other) const
+ \fn bool QJsonObject::iterator::operator>=(const iterator &lhs, const iterator &rhs)
+ \fn bool QJsonObject::iterator::operator>=(const iterator &lhs, const const_iterator &rhs)
- Returns \c true if the item pointed to by this iterator is greater
- than or equal to the item pointed to by the \a other iterator.
+ Returns \c true if the item pointed to by \a lhs iterator is greater
+ than or equal to the item pointed to by the \a rhs iterator.
*/
/*! \fn QJsonObject::iterator QJsonObject::iterator::operator++()
- The prefix ++ operator, \c{++i}, advances the iterator to the
+ The prefix \c{++} operator, \c{++i}, advances the iterator to the
next item in the object and returns an iterator to the new current
item.
@@ -1092,14 +1043,14 @@ QJsonObject::const_iterator QJsonObject::constFindImpl(T key) const
\overload
- The postfix ++ operator, \c{i++}, advances the iterator to the
+ The postfix \c{++} operator, \c{i++}, advances the iterator to the
next item in the object and returns an iterator to the previously
current item.
*/
/*! \fn QJsonObject::iterator QJsonObject::iterator::operator--()
- The prefix -- operator, \c{--i}, makes the preceding item
+ The prefix \c{--} operator, \c{--i}, makes the preceding item
current and returns an iterator pointing to the new current item.
Calling this function on QJsonObject::begin() leads to undefined
@@ -1112,7 +1063,7 @@ QJsonObject::const_iterator QJsonObject::constFindImpl(T key) const
\overload
- The postfix -- operator, \c{i--}, makes the preceding item
+ The postfix \c{--} operator, \c{i--}, makes the preceding item
current and returns an iterator pointing to the previously
current item.
*/
@@ -1163,6 +1114,10 @@ QJsonObject::const_iterator QJsonObject::constFindImpl(T key) const
\since 5.0
\brief The QJsonObject::const_iterator class provides an STL-style const iterator for QJsonObject.
+ \compares strong
+ \compareswith strong QJsonObject::iterator
+ \endcompareswith
+
QJsonObject::const_iterator allows you to iterate over a QJsonObject.
If you want to modify the QJsonObject as you iterate
over it, you must use QJsonObject::iterator instead. It is generally
@@ -1179,7 +1134,7 @@ QJsonObject::const_iterator QJsonObject::constFindImpl(T key) const
Multiple iterators can be used on the same object. Existing iterators
will however become dangling if the object gets modified.
- \sa QJsonObject::iterator, {JSON Support in Qt}, {JSON Save Game Example}
+ \sa QJsonObject::iterator, {JSON Support in Qt}, {Saving and Loading a Game}
*/
/*! \typedef QJsonObject::const_iterator::difference_type
@@ -1238,14 +1193,14 @@ QJsonObject::const_iterator QJsonObject::constFindImpl(T key) const
\sa value()
*/
-/*! \fn QJsonValueRef QJsonObject::const_iterator::value() const
+/*! \fn QJsonValueConstRef QJsonObject::const_iterator::value() const
Returns the current item's value.
\sa key(), operator*()
*/
-/*! \fn const QJsonValueRef QJsonObject::const_iterator::operator*() const
+/*! \fn const QJsonValueConstRef QJsonObject::const_iterator::operator*() const
Returns the current item's value.
@@ -1254,12 +1209,12 @@ QJsonObject::const_iterator QJsonObject::constFindImpl(T key) const
\sa key()
*/
-/*! \fn const QJsonValueRef *QJsonObject::const_iterator::operator->() const
+/*! \fn const QJsonValueConstRef *QJsonObject::const_iterator::operator->() const
Returns a pointer to the current item.
*/
-/*! \fn const QJsonValue QJsonObject::const_iterator::operator[](qsizetype j)
+/*! \fn const QJsonValueConstRef QJsonObject::const_iterator::operator[](qsizetype j) const
Returns the item at offset \a j from the item pointed to by this iterator (the item at
position \c{*this + j}).
@@ -1271,55 +1226,53 @@ QJsonObject::const_iterator QJsonObject::constFindImpl(T key) const
*/
-/*! \fn bool QJsonObject::const_iterator::operator==(const const_iterator &other) const
- \fn bool QJsonObject::const_iterator::operator==(const iterator &other) const
+/*! \fn bool QJsonObject::const_iterator::operator==(const const_iterator &lhs, const const_iterator &rhs)
- Returns \c true if \a other points to the same item as this
+ Returns \c true if \a lhs points to the same item as \a rhs
iterator; otherwise returns \c false.
\sa operator!=()
*/
-/*! \fn bool QJsonObject::const_iterator::operator!=(const const_iterator &other) const
- \fn bool QJsonObject::const_iterator::operator!=(const iterator &other) const
+/*! \fn bool QJsonObject::const_iterator::operator!=(const const_iterator &lhs, const const_iterator &rhs)
- Returns \c true if \a other points to a different item than this
+ Returns \c true if \a lhs points to a different item than \a rhs
iterator; otherwise returns \c false.
\sa operator==()
*/
/*!
- \fn bool QJsonObject::const_iterator::operator<(const const_iterator& other) const
+ \fn bool QJsonObject::const_iterator::operator<(const const_iterator &lhs, const const_iterator &rhs)
- Returns \c true if the item pointed to by this iterator is less than
- the item pointed to by the \a other iterator.
+ Returns \c true if the item pointed to by \a lhs iterator is less than
+ the item pointed to by the \a rhs iterator.
*/
/*!
- \fn bool QJsonObject::const_iterator::operator<=(const const_iterator& other) const
+ \fn bool QJsonObject::const_iterator::operator<=(const const_iterator &lhs, const const_iterator &rhs)
- Returns \c true if the item pointed to by this iterator is less than
- or equal to the item pointed to by the \a other iterator.
+ Returns \c true if the item pointed to by \a lhs iterator is less than
+ or equal to the item pointed to by the \a rhs iterator.
*/
/*!
- \fn bool QJsonObject::const_iterator::operator>(const const_iterator& other) const
+ \fn bool QJsonObject::const_iterator::operator>(const const_iterator &lhs, const const_iterator &rhs)
- Returns \c true if the item pointed to by this iterator is greater
- than the item pointed to by the \a other iterator.
+ Returns \c true if the item pointed to by \a lhs iterator is greater
+ than the item pointed to by the \a rhs iterator.
*/
/*!
- \fn bool QJsonObject::const_iterator::operator>=(const const_iterator& other) const
+ \fn bool QJsonObject::const_iterator::operator>=(const const_iterator &lhs, const const_iterator &rhs)
- Returns \c true if the item pointed to by this iterator is greater
- than or equal to the item pointed to by the \a other iterator.
+ Returns \c true if the item pointed to by \a lhs iterator is greater
+ than or equal to the item pointed to by the \a rhs iterator.
*/
/*! \fn QJsonObject::const_iterator QJsonObject::const_iterator::operator++()
- The prefix ++ operator, \c{++i}, advances the iterator to the
+ The prefix \c{++} operator, \c{++i}, advances the iterator to the
next item in the object and returns an iterator to the new current
item.
@@ -1332,14 +1285,14 @@ QJsonObject::const_iterator QJsonObject::constFindImpl(T key) const
\overload
- The postfix ++ operator, \c{i++}, advances the iterator to the
+ The postfix \c{++} operator, \c{i++}, advances the iterator to the
next item in the object and returns an iterator to the previously
current item.
*/
/*! \fn QJsonObject::const_iterator &QJsonObject::const_iterator::operator--()
- The prefix -- operator, \c{--i}, makes the preceding item
+ The prefix \c{--} operator, \c{--i}, makes the preceding item
current and returns an iterator pointing to the new current item.
Calling this function on QJsonObject::begin() leads to undefined
@@ -1352,7 +1305,7 @@ QJsonObject::const_iterator QJsonObject::constFindImpl(T key) const
\overload
- The postfix -- operator, \c{i--}, makes the preceding item
+ The postfix \c{--} operator, \c{i--}, makes the preceding item
current and returns an iterator pointing to the previously
current item.
*/
@@ -1411,16 +1364,17 @@ bool QJsonObject::detach(qsizetype reserve)
{
if (!o)
return true;
- o = QCborContainerPrivate::detach(o.data(), reserve ? reserve * 2 : o->elements.length());
+ o = QCborContainerPrivate::detach(o.data(), reserve ? reserve * 2 : o->elements.size());
return o;
}
+#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0) && !defined(QT_BOOTSTRAPPED)
/*!
\internal
*/
QString QJsonObject::keyAt(qsizetype i) const
{
- Q_ASSERT(o && i >= 0 && i * 2 < o->elements.length());
+ Q_ASSERT(o && i >= 0 && i * 2 < o->elements.size());
return o->stringAt(i * 2);
}
@@ -1429,7 +1383,7 @@ QString QJsonObject::keyAt(qsizetype i) const
*/
QJsonValue QJsonObject::valueAt(qsizetype i) const
{
- if (!o || i < 0 || 2 * i + 1 >= o->elements.length())
+ if (!o || i < 0 || 2 * i + 1 >= o->elements.size())
return QJsonValue(QJsonValue::Undefined);
return QJsonPrivate::Value::fromTrustedCbor(o->valueAt(2 * i + 1));
}
@@ -1439,7 +1393,7 @@ QJsonValue QJsonObject::valueAt(qsizetype i) const
*/
void QJsonObject::setValueAt(qsizetype i, const QJsonValue &val)
{
- Q_ASSERT(o && i >= 0 && 2 * i + 1 < o->elements.length());
+ Q_ASSERT(o && i >= 0 && 2 * i + 1 < o->elements.size());
detach();
if (val.isUndefined()) {
o->removeAt(2 * i + 1);
@@ -1448,6 +1402,7 @@ void QJsonObject::setValueAt(qsizetype i, const QJsonValue &val)
o->replaceAt(2 * i + 1, QCborValue::fromJsonValue(val));
}
}
+#endif // Qt 7
/*!
\internal
@@ -1455,8 +1410,8 @@ void QJsonObject::setValueAt(qsizetype i, const QJsonValue &val)
void QJsonObject::removeAt(qsizetype index)
{
detach();
- o->removeAt(2 * index + 1);
- o->removeAt(2 * index);
+ o->removeAt(index + 1);
+ o->removeAt(index);
}
size_t qHash(const QJsonObject &object, size_t seed)
diff --git a/src/corelib/serialization/qjsonobject.h b/src/corelib/serialization/qjsonobject.h
index e477345643..4cdbf4511d 100644
--- a/src/corelib/serialization/qjsonobject.h
+++ b/src/corelib/serialization/qjsonobject.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QJSONOBJECT_H
#define QJSONOBJECT_H
@@ -57,12 +21,12 @@ class Q_CORE_EXPORT QJsonObject
public:
QJsonObject();
- QJsonObject(std::initializer_list<QPair<QString, QJsonValue> > args);
+ QJsonObject(std::initializer_list<std::pair<QString, QJsonValue> > args);
~QJsonObject();
- QJsonObject(const QJsonObject &other);
- QJsonObject &operator =(const QJsonObject &other);
+ QJsonObject(const QJsonObject &other) noexcept;
+ QJsonObject &operator =(const QJsonObject &other) noexcept;
QJsonObject(QJsonObject &&other) noexcept;
@@ -74,7 +38,7 @@ public:
void swap(QJsonObject &other) noexcept
{
- qSwap(o, other.o);
+ o.swap(other.o);
}
static QJsonObject fromVariantMap(const QVariantMap &map);
@@ -88,40 +52,37 @@ public:
inline qsizetype length() const { return size(); }
bool isEmpty() const;
-#if QT_STRINGVIEW_LEVEL < 2
QJsonValue value(const QString &key) const;
QJsonValue operator[] (const QString &key) const;
QJsonValueRef operator[] (const QString &key);
-#endif
QJsonValue value(QStringView key) const;
- QJsonValue value(QLatin1String key) const;
+ QJsonValue value(QLatin1StringView key) const;
QJsonValue operator[] (QStringView key) const { return value(key); }
- QJsonValue operator[] (QLatin1String key) const { return value(key); }
+ QJsonValue operator[] (QLatin1StringView key) const { return value(key); }
QJsonValueRef operator[] (QStringView key);
- QJsonValueRef operator[] (QLatin1String key);
+ QJsonValueRef operator[] (QLatin1StringView key);
-#if QT_STRINGVIEW_LEVEL < 2
void remove(const QString &key);
QJsonValue take(const QString &key);
bool contains(const QString &key) const;
-#endif
void remove(QStringView key);
- void remove(QLatin1String key);
+ void remove(QLatin1StringView key);
QJsonValue take(QStringView key);
- QJsonValue take(QLatin1String key);
+ QJsonValue take(QLatin1StringView key);
bool contains(QStringView key) const;
- bool contains(QLatin1String key) const;
+ bool contains(QLatin1StringView key) const;
+#if QT_CORE_REMOVED_SINCE(6, 8)
bool operator==(const QJsonObject &other) const;
bool operator!=(const QJsonObject &other) const;
-
+#endif
class const_iterator;
class iterator
{
friend class const_iterator;
friend class QJsonObject;
- mutable QJsonValueRef item;
+ QJsonValueRef item;
public:
typedef std::random_access_iterator_tag iterator_category;
@@ -136,62 +97,109 @@ public:
constexpr iterator(const iterator &other) = default;
iterator &operator=(const iterator &other)
{
- item.o = other.item.o;
- item.index = other.item.index;
+ item.rebind(other.item);
return *this;
}
- inline QString key() const { return item.o->keyAt(item.index); }
+ inline QString key() const { return item.objectKey(); }
inline QJsonValueRef value() const { return item; }
inline QJsonValueRef operator*() const { return item; }
- inline QJsonValueRef *operator->() const { return &item; }
- const QJsonValueRef operator[](qsizetype j) { return { item.o, qsizetype(item.index) + j }; }
-
+ inline const QJsonValueConstRef *operator->() const { return &item; }
+ inline QJsonValueRef *operator->() { return &item; }
+ inline QJsonValueRef operator[](qsizetype j) const { return *(*this + j); }
+#if QT_CORE_REMOVED_SINCE(6, 8)
inline bool operator==(const iterator &other) const
- { return item.o == other.item.o && item.index == other.item.index; }
- inline bool operator!=(const iterator &other) const { return !(*this == other); }
+ { return item.d == other.item.d && item.index == other.item.index; }
+ inline bool operator!=(const iterator &other) const { return !operator==(other); }
bool operator<(const iterator& other) const
- { Q_ASSERT(item.o == other.item.o); return item.index < other.item.index; }
+ { Q_ASSERT(item.d == other.item.d); return item.index < other.item.index; }
bool operator<=(const iterator& other) const
- { Q_ASSERT(item.o == other.item.o); return item.index <= other.item.index; }
- bool operator>(const iterator& other) const { return !(*this <= other); }
- bool operator>=(const iterator& other) const { return !(*this < other); }
-
+ { Q_ASSERT(item.d == other.item.d); return item.index <= other.item.index; }
+ bool operator>(const iterator& other) const { return !operator<=(other); }
+ bool operator>=(const iterator& other) const { return !operator<(other); }
+#endif
inline iterator &operator++() { ++item.index; return *this; }
inline iterator operator++(int) { iterator r = *this; ++item.index; return r; }
inline iterator &operator--() { --item.index; return *this; }
inline iterator operator--(int) { iterator r = *this; --item.index; return r; }
- inline iterator operator+(qsizetype j) const
- { iterator r = *this; r.item.index += quint64(j); return r; }
+ inline iterator operator+(qsizetype j) const { iterator r = *this; return r += j; }
inline iterator operator-(qsizetype j) const { return operator+(-j); }
inline iterator &operator+=(qsizetype j) { item.index += quint64(j); return *this; }
inline iterator &operator-=(qsizetype j) { item.index -= quint64(j); return *this; }
qsizetype operator-(iterator j) const { return item.index - j.item.index; }
public:
+#if QT_CORE_REMOVED_SINCE(6, 8)
inline bool operator==(const const_iterator &other) const
- { return item.o == other.item.o && item.index == other.item.index; }
- inline bool operator!=(const const_iterator &other) const { return !(*this == other); }
+ { return item.d == other.item.d && item.index == other.item.index; }
+ inline bool operator!=(const const_iterator &other) const { return !operator==(other); }
bool operator<(const const_iterator& other) const
- { Q_ASSERT(item.o == other.item.o); return item.index < other.item.index; }
+ { Q_ASSERT(item.d == other.item.d); return item.index < other.item.index; }
bool operator<=(const const_iterator& other) const
- { Q_ASSERT(item.o == other.item.o); return item.index <= other.item.index; }
- bool operator>(const const_iterator& other) const { return !(*this <= other); }
- bool operator>=(const const_iterator& other) const { return !(*this < other); }
+ { Q_ASSERT(item.d == other.item.d); return item.index <= other.item.index; }
+ bool operator>(const const_iterator& other) const { return operator<=(other); }
+ bool operator>=(const const_iterator& other) const { return operator<(other); }
+#endif
+ private:
+ // Helper functions
+ static bool comparesEqual_helper(const iterator &lhs, const iterator &rhs) noexcept
+ {
+ return lhs.item.d == rhs.item.d && lhs.item.index == rhs.item.index;
+ }
+ static bool comparesEqual_helper(const iterator &lhs, const const_iterator &rhs) noexcept
+ {
+ return lhs.item.d == rhs.item.d && lhs.item.index == rhs.item.index;
+ }
+
+ static Qt::strong_ordering compareThreeWay_helper(const iterator &lhs,
+ const iterator &rhs) noexcept
+ {
+ Q_ASSERT(lhs.item.d == rhs.item.d);
+ return Qt::compareThreeWay(lhs.item.index, rhs.item.index);
+ }
+ static Qt::strong_ordering compareThreeWay_helper(const iterator &lhs,
+ const const_iterator &rhs) noexcept
+ {
+ Q_ASSERT(lhs.item.d == rhs.item.d);
+ return Qt::compareThreeWay(lhs.item.index, rhs.item.index);
+ }
+
+ // Compare friends
+ friend bool comparesEqual(const iterator &lhs, const iterator &rhs) noexcept
+ {
+ return comparesEqual_helper(lhs, rhs);
+ }
+ friend Qt::strong_ordering compareThreeWay(const iterator &lhs,
+ const iterator &rhs) noexcept
+ {
+ return compareThreeWay_helper(lhs, rhs);
+ }
+ Q_DECLARE_STRONGLY_ORDERED(iterator)
+
+ friend bool comparesEqual(const iterator &lhs, const const_iterator &rhs) noexcept
+ {
+ return comparesEqual_helper(lhs, rhs);
+ }
+ friend Qt::strong_ordering compareThreeWay(const iterator &lhs,
+ const const_iterator &rhs) noexcept
+ {
+ return compareThreeWay_helper(lhs, rhs);
+ }
+ Q_DECLARE_STRONGLY_ORDERED(iterator, const_iterator)
};
friend class iterator;
class const_iterator
{
friend class iterator;
- QJsonValueRef item;
+ QJsonValueConstRef item;
public:
typedef std::random_access_iterator_tag iterator_category;
typedef qsizetype difference_type;
typedef QJsonValue value_type;
- typedef const QJsonValueRef reference;
- typedef const QJsonValueRef *pointer;
+ typedef const QJsonValueConstRef reference;
+ typedef const QJsonValueConstRef *pointer;
inline const_iterator() : item(static_cast<QJsonObject*>(nullptr), 0) { }
inline const_iterator(const QJsonObject *obj, qsizetype index)
@@ -202,47 +210,72 @@ public:
constexpr const_iterator(const const_iterator &other) = default;
const_iterator &operator=(const const_iterator &other)
{
- item.o = other.item.o;
- item.index = other.item.index;
+ item.rebind(other.item);
return *this;
}
- inline QString key() const { return item.o->keyAt(item.index); }
- inline QJsonValueRef value() const { return item; }
- inline const QJsonValueRef operator*() const { return item; }
- inline const QJsonValueRef *operator->() const { return &item; }
- const QJsonValueRef operator[](qsizetype j) { return { item.o, qsizetype(item.index) + j }; }
-
+ inline QString key() const { return item.objectKey(); }
+ inline QJsonValueConstRef value() const { return item; }
+ inline const QJsonValueConstRef operator*() const { return item; }
+ inline const QJsonValueConstRef *operator->() const { return &item; }
+ inline QJsonValueConstRef operator[](qsizetype j) const { return *(*this + j); }
+#if QT_CORE_REMOVED_SINCE(6, 8)
inline bool operator==(const const_iterator &other) const
- { return item.o == other.item.o && item.index == other.item.index; }
- inline bool operator!=(const const_iterator &other) const { return !(*this == other); }
+ { return item.d == other.item.d && item.index == other.item.index; }
+ inline bool operator!=(const const_iterator &other) const { return !operator==(other); }
bool operator<(const const_iterator& other) const
- { Q_ASSERT(item.o == other.item.o); return item.index < other.item.index; }
+ { Q_ASSERT(item.d == other.item.d); return item.index < other.item.index; }
bool operator<=(const const_iterator& other) const
- { Q_ASSERT(item.o == other.item.o); return item.index <= other.item.index; }
- bool operator>(const const_iterator& other) const { return !(*this <= other); }
- bool operator>=(const const_iterator& other) const { return !(*this < other); }
-
+ { Q_ASSERT(item.d == other.item.d); return item.index <= other.item.index; }
+ bool operator>(const const_iterator& other) const { return !operator<=(other); }
+ bool operator>=(const const_iterator& other) const { return !operator<(other); }
+#endif
inline const_iterator &operator++() { ++item.index; return *this; }
inline const_iterator operator++(int) { const_iterator r = *this; ++item.index; return r; }
inline const_iterator &operator--() { --item.index; return *this; }
inline const_iterator operator--(int) { const_iterator r = *this; --item.index; return r; }
- inline const_iterator operator+(qsizetype j) const
- { const_iterator r = *this; r.item.index += quint64(j); return r; }
+ inline const_iterator operator+(qsizetype j) const { const_iterator r = *this; return r += j; }
inline const_iterator operator-(qsizetype j) const { return operator+(-j); }
inline const_iterator &operator+=(qsizetype j) { item.index += quint64(j); return *this; }
inline const_iterator &operator-=(qsizetype j) { item.index -= quint64(j); return *this; }
qsizetype operator-(const_iterator j) const { return item.index - j.item.index; }
-
+#if QT_CORE_REMOVED_SINCE(6, 8)
inline bool operator==(const iterator &other) const
- { return item.o == other.item.o && item.index == other.item.index; }
- inline bool operator!=(const iterator &other) const { return !(*this == other); }
+ { return item.d == other.item.d && item.index == other.item.index; }
+ inline bool operator!=(const iterator &other) const { return !operator==(other); }
bool operator<(const iterator& other) const
- { Q_ASSERT(item.o == other.item.o); return item.index < other.item.index; }
+ { Q_ASSERT(item.d == other.item.d); return item.index < other.item.index; }
bool operator<=(const iterator& other) const
- { Q_ASSERT(item.o == other.item.o); return item.index <= other.item.index; }
- bool operator>(const iterator& other) const { return !(*this <= other); }
- bool operator>=(const iterator& other) const { return !(*this < other); }
+ { Q_ASSERT(item.d == other.item.d); return item.index <= other.item.index; }
+ bool operator>(const iterator& other) const { return !operator<=(other); }
+ bool operator>=(const iterator& other) const { return !operator<(other); }
+#endif
+
+ private:
+ // Helper functions
+ static bool comparesEqual_helper(const const_iterator &lhs,
+ const const_iterator &rhs) noexcept
+ {
+ return lhs.item.d == rhs.item.d && lhs.item.index == rhs.item.index;
+ }
+ static Qt::strong_ordering compareThreeWay_helper(const const_iterator &lhs,
+ const const_iterator &rhs) noexcept
+ {
+ Q_ASSERT(lhs.item.d == rhs.item.d);
+ return Qt::compareThreeWay(lhs.item.index, rhs.item.index);
+ }
+
+ // Compare friends
+ friend bool comparesEqual(const const_iterator &lhs, const const_iterator &rhs) noexcept
+ {
+ return comparesEqual_helper(lhs, rhs);
+ }
+ friend Qt::strong_ordering compareThreeWay(const const_iterator &lhs,
+ const const_iterator &rhs) noexcept
+ {
+ return compareThreeWay_helper(lhs, rhs);
+ }
+ Q_DECLARE_STRONGLY_ORDERED(const_iterator)
};
friend class const_iterator;
@@ -258,20 +291,18 @@ public:
// more Qt
typedef iterator Iterator;
typedef const_iterator ConstIterator;
-#if QT_STRINGVIEW_LEVEL < 2
iterator find(const QString &key);
const_iterator find(const QString &key) const { return constFind(key); }
const_iterator constFind(const QString &key) const;
iterator insert(const QString &key, const QJsonValue &value);
-#endif
iterator find(QStringView key);
- iterator find(QLatin1String key);
+ iterator find(QLatin1StringView key);
const_iterator find(QStringView key) const { return constFind(key); }
- const_iterator find(QLatin1String key) const { return constFind(key); }
+ const_iterator find(QLatin1StringView key) const { return constFind(key); }
const_iterator constFind(QStringView key) const;
- const_iterator constFind(QLatin1String key) const;
+ const_iterator constFind(QLatin1StringView key) const;
iterator insert(QStringView key, const QJsonValue &value);
- iterator insert(QLatin1String key, const QJsonValue &value);
+ iterator insert(QLatin1StringView key, const QJsonValue &value);
// STL compatibility
typedef QJsonValue mapped_type;
@@ -281,8 +312,25 @@ public:
inline bool empty() const { return isEmpty(); }
private:
+ friend Q_CORE_EXPORT bool comparesEqual(const QJsonObject &lhs,
+ const QJsonObject &rhs) noexcept;
+ friend bool comparesEqual(const QJsonObject &lhs,
+ const QJsonValue &rhs) noexcept
+ {
+ return comparesEqual(lhs, rhs.toObject());
+ }
+ friend bool comparesEqual(const QJsonObject &lhs,
+ const QJsonValueConstRef &rhs) noexcept
+ {
+ return comparesEqual(lhs, rhs.toObject());
+ }
+ Q_DECLARE_EQUALITY_COMPARABLE(QJsonObject)
+ Q_DECLARE_EQUALITY_COMPARABLE(QJsonObject, QJsonValue)
+ Q_DECLARE_EQUALITY_COMPARABLE(QJsonObject, QJsonValueConstRef)
friend class QJsonValue;
friend class QJsonDocument;
+ friend class QJsonPrivate::Value;
+ friend class QJsonValueConstRef;
friend class QJsonValueRef;
friend class QCborMap;
friend Q_CORE_EXPORT QDebug operator<<(QDebug, const QJsonObject &);
@@ -299,9 +347,11 @@ private:
template <typename T> const_iterator constFindImpl(T key) const;
template <typename T> iterator insertImpl(T key, const QJsonValue &value);
+#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0) && !defined(QT_BOOTSTRAPPED)
QString keyAt(qsizetype i) const;
QJsonValue valueAt(qsizetype i) const;
void setValueAt(qsizetype i, const QJsonValue &val);
+#endif
void removeAt(qsizetype i);
template <typename T> iterator insertAt(qsizetype i, T key, const QJsonValue &val, bool exists);
@@ -310,6 +360,12 @@ private:
Q_DECLARE_SHARED(QJsonObject)
+#if QT_VERSION >= QT_VERSION_CHECK(7, 0, 0) || defined(QT_BOOTSTRAPPED)
+inline QJsonValueConstRef::QJsonValueConstRef(QJsonObject *o, qsizetype idx)
+ : d(o ? o->o.data() : nullptr), is_object(true), index(idx)
+{}
+#endif
+
Q_CORE_EXPORT size_t qHash(const QJsonObject &object, size_t seed = 0);
#if !defined(QT_NO_DEBUG_STREAM) && !defined(QT_JSON_READONLY)
diff --git a/src/corelib/serialization/qjsonparser.cpp b/src/corelib/serialization/qjsonparser.cpp
index 5dc2a30915..ba4887225d 100644
--- a/src/corelib/serialization/qjsonparser.cpp
+++ b/src/corelib/serialization/qjsonparser.cpp
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Copyright (C) 2021 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// Copyright (C) 2021 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QT_BOOTSTRAPPED
#include <qcoreapplication.h>
@@ -47,23 +11,30 @@
#include "private/qstringconverter_p.h"
#include "private/qcborvalue_p.h"
#include "private/qnumeric_p.h"
+#include <private/qtools_p.h>
//#define PARSER_DEBUG
#ifdef PARSER_DEBUG
-static int indent = 0;
-#define BEGIN qDebug() << QByteArray(4*indent++, ' ').constData() << "pos=" << current
-#define END --indent
-#define DEBUG qDebug() << QByteArray(4*indent, ' ').constData()
+# error currently broken after `current` was moved to StashedContainer
+Q_CONSTINIT static int indent = 0;
+# define QT_PARSER_TRACING_BEGIN \
+ qDebug() << QByteArray(4 * indent++, ' ').constData() << "pos=" << current
+# define QT_PARSER_TRACING_END --indent
+# define QT_PARSER_TRACING_DEBUG qDebug() << QByteArray(4 * indent, ' ').constData()
#else
-#define BEGIN if (1) ; else qDebug()
-#define END do {} while (0)
-#define DEBUG if (1) ; else qDebug()
+# define QT_PARSER_TRACING_BEGIN QT_NO_QDEBUG_MACRO()
+# define QT_PARSER_TRACING_END \
+ do { \
+ } while (0)
+# define QT_PARSER_TRACING_DEBUG QT_NO_QDEBUG_MACRO()
#endif
static const int nestingLimit = 1024;
QT_BEGIN_NAMESPACE
+using namespace QtMiscUtils;
+
// error strings for the JSON parser
#define JSONERR_OK QT_TRANSLATE_NOOP("QJsonParseError", "no error occurred")
#define JSONERR_UNTERM_OBJ QT_TRANSLATE_NOOP("QJsonParseError", "unterminated object")
@@ -86,12 +57,13 @@ QT_BEGIN_NAMESPACE
\inmodule QtCore
\ingroup json
\ingroup shared
+ \ingroup qtserialization
\reentrant
\since 5.0
\brief The QJsonParseError class is used to report errors during JSON parsing.
- \sa {JSON Support in Qt}, {JSON Save Game Example}
+ \sa {JSON Support in Qt}, {Saving and Loading a Game}
*/
/*!
@@ -193,7 +165,7 @@ QString QJsonParseError::errorString() const
#ifndef QT_BOOTSTRAPPED
return QCoreApplication::translate("QJsonParseError", sz);
#else
- return QLatin1String(sz);
+ return QLatin1StringView(sz);
#endif
}
@@ -333,7 +305,7 @@ QCborValue Parser::parse(QJsonParseError *error)
QCborValue data;
- DEBUG << Qt::hex << (uint)token;
+ QT_PARSER_TRACING_DEBUG << Qt::hex << (uint)token;
if (token == BeginArray) {
container = new QCborContainerPrivate;
if (!parseArray())
@@ -357,7 +329,7 @@ QCborValue Parser::parse(QJsonParseError *error)
goto error;
}
- END;
+ QT_PARSER_TRACING_END;
{
if (error) {
error->offset = 0;
@@ -379,10 +351,42 @@ error:
return QCborValue();
}
+// We need to retain the _last_ value for any duplicate keys and we need to deref containers.
+// Therefore the manual implementation of std::unique().
+template<typename Iterator, typename Compare, typename Assign>
+static Iterator customAssigningUniqueLast(Iterator first, Iterator last,
+ Compare compare, Assign assign)
+{
+ first = std::adjacent_find(first, last, compare);
+ if (first == last)
+ return last;
+
+ // After adjacent_find, we know that *first and *(first+1) compare equal,
+ // and that first+1 != last.
+ Iterator result = first++;
+ Q_ASSERT(compare(*result, *first));
+ assign(*result, *first);
+ Q_ASSERT(first != last);
+
+ while (++first != last) {
+ if (!compare(*result, *first))
+ ++result;
+
+ // Due to adjacent_find above, we know that we've at least eliminated one element.
+ // Therefore we have to move each further element across the gap.
+ Q_ASSERT(result != first);
+
+ // We have to overwrite each element we want to eliminate, to deref() the container.
+ // Therefore we don't try to optimize the number of assignments here.
+ assign(*result, *first);
+ }
+
+ return ++result;
+}
+
static void sortContainer(QCborContainerPrivate *container)
{
using Forward = QJsonPrivate::KeyIterator;
- using Reverse = std::reverse_iterator<Forward>;
using Value = Forward::value_type;
auto compare = [container](const Value &a, const Value &b)
@@ -413,24 +417,35 @@ static void sortContainer(QCborContainerPrivate *container)
if (bKey.flags & QtCbor::Element::StringIsUtf16)
return QCborContainerPrivate::compareUtf8(aData, bData->asStringView());
- // We're missing an explicit UTF-8 to UTF-8 comparison in Qt, but
- // UTF-8 to UTF-8 comparison retains simple byte ordering, so we'll
- // abuse the Latin-1 comparison function.
- return QtPrivate::compareStrings(aData->asLatin1(), bData->asLatin1());
+ return QtPrivate::compareStrings(aData->asUtf8StringView(), bData->asUtf8StringView());
}
};
- std::sort(Forward(container->elements.begin()), Forward(container->elements.end()),
- [&compare](const Value &a, const Value &b) { return compare(a, b) < 0; });
+ // The elements' containers are owned by the outer container, not by the elements themselves.
+ auto move = [](Forward::reference target, Forward::reference source)
+ {
+ QtCbor::Element &targetValue = target.value();
+
+ // If the target has a container, deref it before overwriting, so that we don't leak.
+ if (targetValue.flags & QtCbor::Element::IsContainer)
+ targetValue.container->deref();
- // We need to retain the _last_ value for any duplicate keys. Therefore the reverse dance here.
- auto it = std::unique(Reverse(container->elements.end()), Reverse(container->elements.begin()),
- [&compare](const Value &a, const Value &b) {
- return compare(a, b) == 0;
- }).base().elementsIterator();
+ // Do not move, so that we can clear the value afterwards.
+ target = source;
- // The erase from beginning is expensive but hopefully rare.
- container->elements.erase(container->elements.begin(), it);
+ // Clear the source value, so that we don't store the same container twice.
+ source.value() = QtCbor::Element();
+ };
+
+ std::stable_sort(
+ Forward(container->elements.begin()), Forward(container->elements.end()),
+ [&compare](const Value &a, const Value &b) { return compare(a, b) < 0; });
+
+ Forward result = customAssigningUniqueLast(
+ Forward(container->elements.begin()), Forward(container->elements.end()),
+ [&compare](const Value &a, const Value &b) { return compare(a, b) == 0; }, move);
+
+ container->elements.erase(result.elementsIterator(), container->elements.end());
}
@@ -446,7 +461,7 @@ bool Parser::parseObject()
return false;
}
- BEGIN << "parseObject" << json;
+ QT_PARSER_TRACING_BEGIN << "parseObject" << json;
char token = nextToken();
while (token == Quote) {
@@ -464,13 +479,13 @@ bool Parser::parseObject()
}
}
- DEBUG << "end token=" << token;
+ QT_PARSER_TRACING_DEBUG << "end token=" << token;
if (token != EndObject) {
lastError = QJsonParseError::UnterminatedObject;
return false;
}
- END;
+ QT_PARSER_TRACING_END;
--nestingLevel;
@@ -484,7 +499,7 @@ bool Parser::parseObject()
*/
bool Parser::parseMember()
{
- BEGIN << "parseMember";
+ QT_PARSER_TRACING_BEGIN << "parseMember";
if (!parseString())
return false;
@@ -500,7 +515,7 @@ bool Parser::parseMember()
if (!parseValue())
return false;
- END;
+ QT_PARSER_TRACING_END;
return true;
}
@@ -509,7 +524,7 @@ bool Parser::parseMember()
*/
bool Parser::parseArray()
{
- BEGIN << "parseArray";
+ QT_PARSER_TRACING_BEGIN << "parseArray";
if (++nestingLevel > nestingLimit) {
lastError = QJsonParseError::DeepNesting;
@@ -545,8 +560,8 @@ bool Parser::parseArray()
}
}
- DEBUG << "size =" << (container ? container->elements.length() : 0);
- END;
+ QT_PARSER_TRACING_DEBUG << "size =" << (container ? container->elements.size() : 0);
+ QT_PARSER_TRACING_END;
--nestingLevel;
@@ -560,7 +575,7 @@ value = false / null / true / object / array / number / string
bool Parser::parseValue()
{
- BEGIN << "parse Value" << json;
+ QT_PARSER_TRACING_BEGIN << "parse Value" << json;
switch (*json++) {
case 'n':
@@ -572,8 +587,8 @@ bool Parser::parseValue()
*json++ == 'l' &&
*json++ == 'l') {
container->append(QCborValue(QCborValue::Null));
- DEBUG << "value: null";
- END;
+ QT_PARSER_TRACING_DEBUG << "value: null";
+ QT_PARSER_TRACING_END;
return true;
}
lastError = QJsonParseError::IllegalValue;
@@ -587,8 +602,8 @@ bool Parser::parseValue()
*json++ == 'u' &&
*json++ == 'e') {
container->append(QCborValue(true));
- DEBUG << "value: true";
- END;
+ QT_PARSER_TRACING_DEBUG << "value: true";
+ QT_PARSER_TRACING_END;
return true;
}
lastError = QJsonParseError::IllegalValue;
@@ -603,8 +618,8 @@ bool Parser::parseValue()
*json++ == 's' &&
*json++ == 'e') {
container->append(QCborValue(false));
- DEBUG << "value: false";
- END;
+ QT_PARSER_TRACING_DEBUG << "value: false";
+ QT_PARSER_TRACING_END;
return true;
}
lastError = QJsonParseError::IllegalValue;
@@ -612,24 +627,24 @@ bool Parser::parseValue()
case Quote: {
if (!parseString())
return false;
- DEBUG << "value: string";
- END;
+ QT_PARSER_TRACING_DEBUG << "value: string";
+ QT_PARSER_TRACING_END;
return true;
}
case BeginArray: {
StashedContainer stashedContainer(&container, QCborValue::Array);
if (!parseArray())
return false;
- DEBUG << "value: array";
- END;
+ QT_PARSER_TRACING_DEBUG << "value: array";
+ QT_PARSER_TRACING_END;
return true;
}
case BeginObject: {
StashedContainer stashedContainer(&container, QCborValue::Map);
if (!parseObject())
return false;
- DEBUG << "value: object";
- END;
+ QT_PARSER_TRACING_DEBUG << "value: object";
+ QT_PARSER_TRACING_END;
return true;
}
case ValueSeparator:
@@ -645,8 +660,8 @@ bool Parser::parseValue()
--json;
if (!parseNumber())
return false;
- DEBUG << "value: number";
- END;
+ QT_PARSER_TRACING_DEBUG << "value: number";
+ QT_PARSER_TRACING_END;
}
return true;
@@ -672,7 +687,7 @@ bool Parser::parseValue()
bool Parser::parseNumber()
{
- BEGIN << "parseNumber" << json;
+ QT_PARSER_TRACING_BEGIN << "parseNumber" << json;
const char *start = json;
bool isInt = true;
@@ -685,14 +700,14 @@ bool Parser::parseNumber()
if (json < end && *json == '0') {
++json;
} else {
- while (json < end && *json >= '0' && *json <= '9')
+ while (json < end && isAsciiDigit(*json))
++json;
}
// frac = decimal-point 1*DIGIT
if (json < end && *json == '.') {
++json;
- while (json < end && *json >= '0' && *json <= '9') {
+ while (json < end && isAsciiDigit(*json)) {
isInt = isInt && *json == '0';
++json;
}
@@ -704,7 +719,7 @@ bool Parser::parseNumber()
++json;
if (json < end && (*json == '-' || *json == '+'))
++json;
- while (json < end && *json >= '0' && *json <= '9')
+ while (json < end && isAsciiDigit(*json))
++json;
}
@@ -714,14 +729,14 @@ bool Parser::parseNumber()
}
const QByteArray number = QByteArray::fromRawData(start, json - start);
- DEBUG << "numberstring" << number;
+ QT_PARSER_TRACING_DEBUG << "numberstring" << number;
if (isInt) {
bool ok;
qlonglong n = number.toLongLong(&ok);
if (ok) {
container->append(QCborValue(n));
- END;
+ QT_PARSER_TRACING_END;
return true;
}
}
@@ -740,7 +755,7 @@ bool Parser::parseNumber()
else
container->append(QCborValue(d));
- END;
+ QT_PARSER_TRACING_END;
return true;
}
@@ -769,15 +784,13 @@ bool Parser::parseNumber()
static inline bool addHexDigit(char digit, char32_t *result)
{
*result <<= 4;
- if (digit >= '0' && digit <= '9')
- *result |= (digit - '0');
- else if (digit >= 'a' && digit <= 'f')
- *result |= (digit - 'a') + 10;
- else if (digit >= 'A' && digit <= 'F')
- *result |= (digit - 'A') + 10;
- else
- return false;
- return true;
+ const int h = fromHex(digit);
+ if (h != -1) {
+ *result |= h;
+ return true;
+ }
+
+ return false;
}
static inline bool scanEscapeSequence(const char *&json, const char *end, char32_t *ch)
@@ -786,7 +799,7 @@ static inline bool scanEscapeSequence(const char *&json, const char *end, char32
if (json >= end)
return false;
- DEBUG << "scan escape" << (char)*json;
+ QT_PARSER_TRACING_DEBUG << "scan escape" << (char)*json;
uchar escaped = *json++;
switch (escaped) {
case '"':
@@ -830,7 +843,7 @@ static inline bool scanUtf8Char(const char *&json, const char *end, char32_t *re
const auto *usrc = reinterpret_cast<const uchar *>(json);
const auto *uend = reinterpret_cast<const uchar *>(end);
const uchar b = *usrc++;
- int res = QUtf8Functions::fromUtf8<QUtf8BaseTraits>(b, result, usrc, uend);
+ qsizetype res = QUtf8Functions::fromUtf8<QUtf8BaseTraits>(b, result, usrc, uend);
if (res < 0)
return false;
@@ -844,7 +857,7 @@ bool Parser::parseString()
// try to parse a utf-8 string without escape sequences, and note whether it's 7bit ASCII.
- BEGIN << "parse string" << json;
+ QT_PARSER_TRACING_BEGIN << "parse string" << json;
bool isUtf8 = true;
bool isAscii = true;
while (json < end) {
@@ -865,10 +878,10 @@ bool Parser::parseString()
}
if (ch > 0x7f)
isAscii = false;
- DEBUG << " " << ch << char(ch);
+ QT_PARSER_TRACING_DEBUG << " " << ch << char(ch);
}
++json;
- DEBUG << "end of string";
+ QT_PARSER_TRACING_DEBUG << "end of string";
if (json >= end) {
lastError = QJsonParseError::UnterminatedString;
return false;
@@ -880,11 +893,11 @@ bool Parser::parseString()
container->appendAsciiString(start, json - start - 1);
else
container->appendUtf8String(start, json - start - 1);
- END;
+ QT_PARSER_TRACING_END;
return true;
}
- DEBUG << "has escape sequences";
+ QT_PARSER_TRACING_DEBUG << "has escape sequences";
json = start;
@@ -913,10 +926,14 @@ bool Parser::parseString()
return false;
}
- container->appendByteData(reinterpret_cast<const char *>(ucs4.utf16()), ucs4.size() * 2,
+ container->appendByteData(reinterpret_cast<const char *>(ucs4.constData()), ucs4.size() * 2,
QCborValue::String, QtCbor::Element::StringIsUtf16);
- END;
+ QT_PARSER_TRACING_END;
return true;
}
QT_END_NAMESPACE
+
+#undef QT_PARSER_TRACING_BEGIN
+#undef QT_PARSER_TRACING_END
+#undef QT_PARSER_TRACING_DEBUG
diff --git a/src/corelib/serialization/qjsonparser_p.h b/src/corelib/serialization/qjsonparser_p.h
index 14d9705447..47830a108e 100644
--- a/src/corelib/serialization/qjsonparser_p.h
+++ b/src/corelib/serialization/qjsonparser_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QJSONPARSER_P_H
#define QJSONPARSER_P_H
diff --git a/src/corelib/serialization/qjsonvalue.cpp b/src/corelib/serialization/qjsonvalue.cpp
index 933a8e1552..6c2656d89f 100644
--- a/src/corelib/serialization/qjsonvalue.cpp
+++ b/src/corelib/serialization/qjsonvalue.cpp
@@ -1,41 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// Copyright (C) 2022 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include <qjsonobject.h>
#include <qjsonvalue.h>
@@ -45,6 +10,8 @@
#include <quuid.h>
#include <qvariant.h>
#include <qstringlist.h>
+#include <qmap.h>
+#include <qhash.h>
#include <qdebug.h>
#include "qdatastream.h"
@@ -58,16 +25,44 @@
QT_BEGIN_NAMESPACE
+static QJsonValue::Type convertFromCborType(QCborValue::Type type) noexcept
+{
+ switch (type) {
+ case QCborValue::Null:
+ return QJsonValue::Null;
+ case QCborValue::True:
+ case QCborValue::False:
+ return QJsonValue::Bool;
+ case QCborValue::Double:
+ case QCborValue::Integer:
+ return QJsonValue::Double;
+ case QCborValue::String:
+ return QJsonValue::String;
+ case QCborValue::Array:
+ return QJsonValue::Array;
+ case QCborValue::Map:
+ return QJsonValue::Object;
+ case QCborValue::Undefined:
+ default:
+ return QJsonValue::Undefined;
+ }
+}
+
/*!
\class QJsonValue
\inmodule QtCore
\ingroup json
\ingroup shared
+ \ingroup qtserialization
\reentrant
\since 5.0
\brief The QJsonValue class encapsulates a value in JSON.
+ \compares equality
+ \compareswith equality QJsonValueConstRef QJsonValueRef
+ \endcompareswith
+
A value in JSON can be one of 6 basic types:
JSON is a format to store structured data. It has 6 basic data types:
@@ -105,7 +100,7 @@ QT_BEGIN_NAMESPACE
\li \l {QJsonObject}::operator[](const QString & key) const
\endlist
- \sa {JSON Support in Qt}, {JSON Save Game Example}
+ \sa {JSON Support in Qt}, {Saving and Loading a Game}
*/
/*!
@@ -207,9 +202,9 @@ QJsonValue::QJsonValue(const QString &s)
*/
/*!
- Creates a value of type String, with value \a s.
+ Creates a value of type String, with the Latin-1 string viewed by \a s.
*/
-QJsonValue::QJsonValue(QLatin1String s)
+QJsonValue::QJsonValue(QLatin1StringView s)
: value(s)
{
}
@@ -257,15 +252,12 @@ QJsonValue::~QJsonValue() = default;
/*!
Creates a copy of \a other.
*/
-QJsonValue::QJsonValue(const QJsonValue &other)
- : value(other.value)
-{
-}
+QJsonValue::QJsonValue(const QJsonValue &other) noexcept = default;
/*!
Assigns the value stored in \a other to this object.
*/
-QJsonValue &QJsonValue::operator =(const QJsonValue &other)
+QJsonValue &QJsonValue::operator =(const QJsonValue &other) noexcept
{
QJsonValue copy(other);
swap(copy);
@@ -357,6 +349,7 @@ void QJsonValue::swap(QJsonValue &other) noexcept
error cases as e.g. accessing a non existing key in a QJsonObject.
*/
+#ifndef QT_NO_VARIANT
/*!
Converts \a variant to a QJsonValue and returns it.
@@ -599,6 +592,7 @@ QVariant QJsonValue::toVariant() const
error condition, when trying to read an out of bounds value
in an array or a non existent key in an object.
*/
+#endif // !QT_NO_VARIANT
/*!
Returns the type of the value.
@@ -607,25 +601,7 @@ QVariant QJsonValue::toVariant() const
*/
QJsonValue::Type QJsonValue::type() const
{
- switch (value.type()) {
- case QCborValue::Null:
- return QJsonValue::Null;
- case QCborValue::True:
- case QCborValue::False:
- return QJsonValue::Bool;
- case QCborValue::Double:
- case QCborValue::Integer:
- return QJsonValue::Double;
- case QCborValue::String:
- return QJsonValue::String;
- case QCborValue::Array:
- return QJsonValue::Array;
- case QCborValue::Map:
- return QJsonValue::Object;
- case QCborValue::Undefined:
- default:
- return QJsonValue::Undefined;
- }
+ return convertFromCborType(value.type());
}
/*!
@@ -736,11 +712,14 @@ QString QJsonValue::toString() const
*/
QJsonArray QJsonValue::toArray(const QJsonArray &defaultValue) const
{
- const auto dd = QJsonPrivate::Value::container(value);
- const auto n = QJsonPrivate::Value::valueHelper(value);
- if (value.type() != QCborValue::Array || n >= 0 || !dd)
+ if (!isArray())
return defaultValue;
-
+ QCborContainerPrivate *dd = nullptr;
+ const auto n = QJsonPrivate::Value::valueHelper(value);
+ const auto container = QJsonPrivate::Value::container(value);
+ Q_ASSERT(n == -1 || container == nullptr);
+ if (n < 0)
+ dd = container;
return QJsonArray(dd);
}
@@ -763,11 +742,14 @@ QJsonArray QJsonValue::toArray() const
*/
QJsonObject QJsonValue::toObject(const QJsonObject &defaultValue) const
{
- const auto dd = QJsonPrivate::Value::container(value);
- const auto n = QJsonPrivate::Value::valueHelper(value);
- if (value.type() != QCborValue::Map || n >= 0 || !dd)
+ if (!isObject())
return defaultValue;
-
+ QCborContainerPrivate *dd = nullptr;
+ const auto container = QJsonPrivate::Value::container(value);
+ const auto n = QJsonPrivate::Value::valueHelper(value);
+ Q_ASSERT(n == -1 || container == nullptr);
+ if (n < 0)
+ dd = container;
return QJsonObject(dd);
}
@@ -783,7 +765,6 @@ QJsonObject QJsonValue::toObject() const
return toObject(QJsonObject());
}
-#if QT_STRINGVIEW_LEVEL < 2
/*!
Returns a QJsonValue representing the value for the key \a key.
@@ -800,7 +781,6 @@ const QJsonValue QJsonValue::operator[](const QString &key) const
{
return (*this)[QStringView(key)];
}
-#endif
/*!
\overload
@@ -818,7 +798,7 @@ const QJsonValue QJsonValue::operator[](QStringView key) const
\overload
\since 5.10
*/
-const QJsonValue QJsonValue::operator[](QLatin1String key) const
+const QJsonValue QJsonValue::operator[](QLatin1StringView key) const
{
if (!isObject())
return QJsonValue(QJsonValue::Undefined);
@@ -847,35 +827,37 @@ const QJsonValue QJsonValue::operator[](qsizetype i) const
}
/*!
- Returns \c true if the value is equal to \a other.
- */
-bool QJsonValue::operator==(const QJsonValue &other) const
+ \fn bool QJsonValue::operator==(const QJsonValue &lhs, const QJsonValue &rhs)
+
+ Returns \c true if the \a lhs value is equal to \a rhs value, \c false otherwise.
+*/
+bool comparesEqual(const QJsonValue &lhs, const QJsonValue &rhs) noexcept
{
- if (value.type() != other.value.type()) {
- if (isDouble() && other.isDouble()) {
+ if (lhs.value.type() != rhs.value.type()) {
+ if (lhs.isDouble() && rhs.isDouble()) {
// One value Cbor integer, one Cbor double, should interact as doubles.
- return toDouble() == other.toDouble();
+ return lhs.toDouble() == rhs.toDouble();
}
return false;
}
- switch (value.type()) {
+ switch (lhs.value.type()) {
case QCborValue::Undefined:
case QCborValue::Null:
case QCborValue::True:
case QCborValue::False:
break;
case QCborValue::Double:
- return toDouble() == other.toDouble();
+ return lhs.toDouble() == rhs.toDouble();
case QCborValue::Integer:
- return QJsonPrivate::Value::valueHelper(value)
- == QJsonPrivate::Value::valueHelper(other.value);
+ return QJsonPrivate::Value::valueHelper(lhs.value)
+ == QJsonPrivate::Value::valueHelper(rhs.value);
case QCborValue::String:
- return toString() == other.toString();
+ return lhs.toString() == rhs.toString();
case QCborValue::Array:
- return toArray() == other.toArray();
+ return lhs.toArray() == rhs.toArray();
case QCborValue::Map:
- return toObject() == other.toObject();
+ return lhs.toObject() == rhs.toObject();
default:
return false;
}
@@ -883,12 +865,10 @@ bool QJsonValue::operator==(const QJsonValue &other) const
}
/*!
- Returns \c true if the value is not equal to \a other.
- */
-bool QJsonValue::operator!=(const QJsonValue &other) const
-{
- return !(*this == other);
-}
+ \fn bool QJsonValue::operator!=(const QJsonValue &lhs, const QJsonValue &rhs)
+
+ Returns \c true if the \a lhs value is not equal to \a rhs value, \c false otherwise.
+*/
/*!
\class QJsonValueRef
@@ -913,48 +893,200 @@ bool QJsonValue::operator!=(const QJsonValue &other) const
However, they are not explicitly documented here.
*/
-
-QJsonValueRef &QJsonValueRef::operator =(const QJsonValue &val)
+void QJsonValueRef::detach()
{
+#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0) && !defined(QT_BOOTSTRAPPED)
+ QCborContainerPrivate *d = QJsonPrivate::Value::container(*this);
+ d = QCborContainerPrivate::detach(d, d->elements.size());
+
if (is_object)
- o->setValueAt(index, val);
+ o->o.reset(d);
else
- a->replace(index, val);
+ a->a.reset(d);
+#else
+ d = QCborContainerPrivate::detach(d, d->elements.size());
+#endif
+}
- return *this;
+static QJsonValueRef &assignToRef(QJsonValueRef &ref, const QCborValue &value, bool is_object)
+{
+ QCborContainerPrivate *d = QJsonPrivate::Value::container(ref);
+ qsizetype index = QJsonPrivate::Value::indexHelper(ref);
+ if (is_object && value.isUndefined()) {
+ d->removeAt(index);
+ d->removeAt(index - 1);
+ } else {
+ d->replaceAt(index, value);
+ }
+
+ return ref;
+}
+
+QJsonValueRef &QJsonValueRef::operator =(const QJsonValue &val)
+{
+ detach();
+ return assignToRef(*this, QCborValue::fromJsonValue(val), is_object);
}
QJsonValueRef &QJsonValueRef::operator =(const QJsonValueRef &ref)
{
- if (is_object)
- o->setValueAt(index, ref);
- else
- a->replace(index, ref);
+ // ### optimize more?
+ const QCborContainerPrivate *d = QJsonPrivate::Value::container(ref);
+ qsizetype index = QJsonPrivate::Value::indexHelper(ref);
- return *this;
+ if (d == QJsonPrivate::Value::container(*this) &&
+ index == QJsonPrivate::Value::indexHelper(*this))
+ return *this; // self assignment
+
+ detach();
+ return assignToRef(*this, d->valueAt(index), is_object);
+}
+
+#ifndef QT_NO_VARIANT
+QVariant QJsonValueConstRef::toVariant() const
+{
+ return concrete(*this).toVariant();
+}
+#endif // !QT_NO_VARIANT
+
+QJsonArray QJsonValueConstRef::toArray() const
+{
+ return concrete(*this).toArray();
+}
+
+QJsonObject QJsonValueConstRef::toObject() const
+{
+ return concrete(*this).toObject();
+}
+
+QJsonValue::Type QJsonValueConstRef::concreteType(QJsonValueConstRef self) noexcept
+{
+ return convertFromCborType(QJsonPrivate::Value::elementHelper(self).type);
+}
+
+bool QJsonValueConstRef::concreteBool(QJsonValueConstRef self, bool defaultValue) noexcept
+{
+ auto &e = QJsonPrivate::Value::elementHelper(self);
+ if (e.type == QCborValue::False)
+ return false;
+ if (e.type == QCborValue::True)
+ return true;
+ return defaultValue;
+}
+
+qint64 QJsonValueConstRef::concreteInt(QJsonValueConstRef self, qint64 defaultValue, bool clamp) noexcept
+{
+ auto &e = QJsonPrivate::Value::elementHelper(self);
+ qint64 v = defaultValue;
+ if (e.type == QCborValue::Double) {
+ // convertDoubleTo modifies the output even on returning false
+ if (!convertDoubleTo<qint64>(e.fpvalue(), &v))
+ v = defaultValue;
+ } else if (e.type == QCborValue::Integer) {
+ v = e.value;
+ }
+ if (clamp && qint64(int(v)) != v)
+ return defaultValue;
+ return v;
+}
+
+double QJsonValueConstRef::concreteDouble(QJsonValueConstRef self, double defaultValue) noexcept
+{
+ auto &e = QJsonPrivate::Value::elementHelper(self);
+ if (e.type == QCborValue::Double)
+ return e.fpvalue();
+ if (e.type == QCborValue::Integer)
+ return e.value;
+ return defaultValue;
}
+QString QJsonValueConstRef::concreteString(QJsonValueConstRef self, const QString &defaultValue)
+{
+ const QCborContainerPrivate *d = QJsonPrivate::Value::container(self);
+ qsizetype index = QJsonPrivate::Value::indexHelper(self);
+ if (d->elements.at(index).type != QCborValue::String)
+ return defaultValue;
+ return d->stringAt(index);
+}
+
+QJsonValue QJsonValueConstRef::concrete(QJsonValueConstRef self) noexcept
+{
+ const QCborContainerPrivate *d = QJsonPrivate::Value::container(self);
+ qsizetype index = QJsonPrivate::Value::indexHelper(self);
+ return QJsonPrivate::Value::fromTrustedCbor(d->valueAt(index));
+}
+
+QString QJsonValueConstRef::objectKey(QJsonValueConstRef self)
+{
+ Q_ASSERT(self.is_object);
+ Q_ASSERT(self.is_object);
+ const QCborContainerPrivate *d = QJsonPrivate::Value::container(self);
+ qsizetype index = QJsonPrivate::Value::indexHelper(self);
+
+ Q_ASSERT(d);
+ Q_ASSERT(index < d->elements.size());
+ return d->stringAt(index - 1);
+}
+
+#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0) && !defined(QT_BOOTSTRAPPED)
QVariant QJsonValueRef::toVariant() const
{
- return toValue().toVariant();
+ return QJsonValueConstRef::toVariant();
}
QJsonArray QJsonValueRef::toArray() const
{
- return toValue().toArray();
+ return QJsonValueConstRef::toArray();
}
QJsonObject QJsonValueRef::toObject() const
{
- return toValue().toObject();
+ return QJsonValueConstRef::toObject();
}
QJsonValue QJsonValueRef::toValue() const
{
- if (!is_object)
- return a->at(index);
- return o->valueAt(index);
+ return concrete(*this);
}
+#else
+QJsonValueRef QJsonValueRef::operator[](qsizetype key)
+{
+ if (d->elements.at(index).type != QCborValue::Array)
+ d->replaceAt(index, QCborValue::Array);
+
+ auto &e = d->elements[index];
+ e.container = QCborContainerPrivate::grow(e.container, key); // detaches
+ e.flags |= QtCbor::Element::IsContainer;
+
+ return QJsonValueRef(e.container, key, false);
+}
+
+QJsonValueRef QJsonValueRef::operator[](QAnyStringView key)
+{
+ // must go through QJsonObject because some of the machinery is non-static
+ // member or file-static in qjsonobject.cpp
+ QJsonObject o = QJsonPrivate::Value::fromTrustedCbor(d->valueAt(index)).toObject();
+ QJsonValueRef ret = key.visit([&](auto v) {
+ if constexpr (std::is_same_v<decltype(v), QUtf8StringView>)
+ return o[QString::fromUtf8(v)];
+ else
+ return o[v];
+ });
+
+ // ### did the QJsonObject::operator[] above detach?
+ QCborContainerPrivate *x = o.o.take();
+ Q_ASSERT(x->ref.loadRelaxed() == 1);
+
+ auto &e = d->elements[index];
+ if (e.flags & QtCbor::Element::IsContainer && e.container != x)
+ o.o.reset(e.container); // might not an object!
+
+ e.flags |= QtCbor::Element::IsContainer;
+ e.container = x;
+
+ return ret;
+}
+#endif
size_t qHash(const QJsonValue &value, size_t seed)
{
@@ -974,8 +1106,7 @@ size_t qHash(const QJsonValue &value, size_t seed)
case QJsonValue::Undefined:
return seed;
}
- Q_UNREACHABLE();
- return 0;
+ Q_UNREACHABLE_RETURN(0);
}
#if !defined(QT_NO_DEBUG_STREAM) && !defined(QT_JSON_READONLY)
diff --git a/src/corelib/serialization/qjsonvalue.h b/src/corelib/serialization/qjsonvalue.h
index fe7d0baf2f..d71dadf837 100644
--- a/src/corelib/serialization/qjsonvalue.h
+++ b/src/corelib/serialization/qjsonvalue.h
@@ -1,49 +1,14 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QJSONVALUE_H
#define QJSONVALUE_H
+#include <QtCore/qcborvalue.h>
+#include <QtCore/qcompare.h>
#include <QtCore/qglobal.h>
#include <QtCore/qstring.h>
#include <QtCore/qshareddata.h>
-#include <QtCore/qcborvalue.h>
QT_BEGIN_NAMESPACE
@@ -75,7 +40,7 @@ public:
QJsonValue(int n);
QJsonValue(qint64 v);
QJsonValue(const QString &s);
- QJsonValue(QLatin1String s);
+ QJsonValue(QLatin1StringView s);
#ifndef QT_NO_CAST_FROM_ASCII
QT_ASCII_CAST_WARN inline QJsonValue(const char *s)
: QJsonValue(QString::fromUtf8(s)) {}
@@ -87,8 +52,8 @@ public:
~QJsonValue();
- QJsonValue(const QJsonValue &other);
- QJsonValue &operator =(const QJsonValue &other);
+ QJsonValue(const QJsonValue &other) noexcept;
+ QJsonValue &operator =(const QJsonValue &other) noexcept;
QJsonValue(QJsonValue &&other) noexcept;
@@ -123,17 +88,21 @@ public:
QJsonObject toObject() const;
QJsonObject toObject(const QJsonObject &defaultValue) const;
-#if QT_STRINGVIEW_LEVEL < 2
const QJsonValue operator[](const QString &key) const;
-#endif
const QJsonValue operator[](QStringView key) const;
- const QJsonValue operator[](QLatin1String key) const;
+ const QJsonValue operator[](QLatin1StringView key) const;
const QJsonValue operator[](qsizetype i) const;
+#if QT_CORE_REMOVED_SINCE(6, 8)
bool operator==(const QJsonValue &other) const;
bool operator!=(const QJsonValue &other) const;
+#endif
private:
+ friend Q_CORE_EXPORT bool comparesEqual(const QJsonValue &lhs,
+ const QJsonValue &rhs) noexcept;
+ Q_DECLARE_EQUALITY_COMPARABLE(QJsonValue)
+
// avoid implicit conversions from char * to bool
QJsonValue(const void *) = delete;
friend class QJsonPrivate::Value;
@@ -150,22 +119,141 @@ private:
static_assert(sizeof(QCborValue::Type) == sizeof(QJsonValue::Type));
};
-class Q_CORE_EXPORT QJsonValueRef
+Q_DECLARE_SHARED(QJsonValue)
+
+class QJsonValueConstRef
{
public:
- QJsonValueRef(QJsonArray *array, qsizetype idx)
+ QJsonValueConstRef(const QJsonValueConstRef &) = default;
+ QJsonValueConstRef &operator=(const QJsonValueConstRef &) = delete;
+ inline operator QJsonValue() const { return concrete(*this); }
+
+ Q_CORE_EXPORT QVariant toVariant() const;
+ QJsonValue::Type type() const { return concreteType(*this); }
+ bool isNull() const { return type() == QJsonValue::Null; }
+ bool isBool() const { return type() == QJsonValue::Bool; }
+ bool isDouble() const { return type() == QJsonValue::Double; }
+ bool isString() const { return type() == QJsonValue::String; }
+ bool isArray() const { return type() == QJsonValue::Array; }
+ bool isObject() const { return type() == QJsonValue::Object; }
+ bool isUndefined() const { return type() == QJsonValue::Undefined; }
+
+ bool toBool(bool defaultValue = false) const
+ { return concreteBool(*this, defaultValue); }
+ int toInt(int defaultValue = 0) const
+ { return int(concreteInt(*this, defaultValue, true)); }
+ qint64 toInteger(qint64 defaultValue = 0) const
+ { return concreteInt(*this, defaultValue, false); }
+ double toDouble(double defaultValue = 0) const
+ { return concreteDouble(*this, defaultValue); }
+ QString toString(const QString &defaultValue = {}) const
+ { return concreteString(*this, defaultValue); }
+ Q_CORE_EXPORT QJsonArray toArray() const;
+ Q_CORE_EXPORT QJsonObject toObject() const;
+
+ const QJsonValue operator[](QStringView key) const { return concrete(*this)[key]; }
+ const QJsonValue operator[](QLatin1StringView key) const { return concrete(*this)[key]; }
+ const QJsonValue operator[](qsizetype i) const { return concrete(*this)[i]; }
+
+protected:
+ friend bool comparesEqual(const QJsonValueConstRef &lhs,
+ const QJsonValueConstRef &rhs) noexcept
+ {
+ return comparesEqual(concrete(lhs), concrete(rhs));
+ }
+ friend bool comparesEqual(const QJsonValueConstRef &lhs,
+ const QJsonValue &rhs) noexcept
+ {
+ return comparesEqual(concrete(lhs), rhs);
+ }
+ Q_DECLARE_EQUALITY_COMPARABLE(QJsonValueConstRef)
+ Q_DECLARE_EQUALITY_COMPARABLE(QJsonValueConstRef, QJsonValue)
+
+ Q_CORE_EXPORT static QJsonValue::Type
+ concreteType(QJsonValueConstRef self) noexcept Q_DECL_PURE_FUNCTION;
+ Q_CORE_EXPORT static bool
+ concreteBool(QJsonValueConstRef self, bool defaultValue) noexcept Q_DECL_PURE_FUNCTION;
+ Q_CORE_EXPORT static qint64
+ concreteInt(QJsonValueConstRef self, qint64 defaultValue, bool clamp) noexcept Q_DECL_PURE_FUNCTION;
+ Q_CORE_EXPORT static double
+ concreteDouble(QJsonValueConstRef self, double defaultValue) noexcept Q_DECL_PURE_FUNCTION;
+ Q_CORE_EXPORT static QString concreteString(QJsonValueConstRef self, const QString &defaultValue);
+ Q_CORE_EXPORT static QJsonValue concrete(QJsonValueConstRef self) noexcept;
+
+ // for iterators
+ Q_CORE_EXPORT static QString objectKey(QJsonValueConstRef self);
+ QString objectKey() const { return objectKey(*this); }
+
+#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0) && !defined(QT_BOOTSTRAPPED)
+ QJsonValueConstRef(QJsonArray *array, qsizetype idx)
: a(array), is_object(false), index(static_cast<quint64>(idx)) {}
- QJsonValueRef(QJsonObject *object, qsizetype idx)
+ QJsonValueConstRef(QJsonObject *object, qsizetype idx)
: o(object), is_object(true), index(static_cast<quint64>(idx)) {}
+ void rebind(QJsonValueConstRef other)
+ {
+ Q_ASSERT(is_object == other.is_object);
+ if (is_object)
+ o = other.o;
+ else
+ a = other.a;
+ index = other.index;
+ }
+
+ union {
+ QJsonArray *a;
+ QJsonObject *o;
+ void *d;
+ };
+ quint64 is_object : 1;
+ quint64 index : 63;
+#else
+ constexpr QJsonValueConstRef(QCborContainerPrivate *d, size_t index, bool is_object)
+ : d(d), is_object(is_object), index(index)
+ {}
+
+ // implemented in qjsonarray.h & qjsonobject.h, to get their d
+ QJsonValueConstRef(QJsonArray *array, qsizetype idx);
+ QJsonValueConstRef(QJsonObject *object, qsizetype idx);
+
+ void rebind(QJsonValueConstRef other)
+ {
+ d = other.d;
+ index = other.index;
+ }
+
+ QCborContainerPrivate *d = nullptr;
+ size_t is_object : 1;
+ size_t index : std::numeric_limits<size_t>::digits - 1;
+#endif
+
+ friend class QJsonArray;
+ friend class QJsonObject;
+ friend class QJsonPrivate::Value;
+};
+
+QT_WARNING_PUSH
+QT6_ONLY(QT_WARNING_DISABLE_MSVC(4275)) // non dll-interface class 'QJsonValueConstRef' used as base for dll-interface class 'QJsonValueRef'
+class QT6_ONLY(Q_CORE_EXPORT) QJsonValueRef : public QJsonValueConstRef
+{
+public:
QJsonValueRef(const QJsonValueRef &) = default;
+ QT7_ONLY(Q_CORE_EXPORT) QJsonValueRef &operator = (const QJsonValue &val);
+ QT7_ONLY(Q_CORE_EXPORT) QJsonValueRef &operator = (const QJsonValueRef &val);
+
+#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0) && !defined(QT_BOOTSTRAPPED)
+ // retained for binary compatibility (due to the Q_CORE_EXPORT) because at
+ // least one compiler emits and exports all inlines in an exported class
- inline operator QJsonValue() const { return toValue(); }
- QJsonValueRef &operator = (const QJsonValue &val);
- QJsonValueRef &operator = (const QJsonValueRef &val);
+ QJsonValueRef(QJsonArray *array, qsizetype idx)
+ : QJsonValueConstRef(array, idx) {}
+ QJsonValueRef(QJsonObject *object, qsizetype idx)
+ : QJsonValueConstRef(object, idx) {}
+
+ operator QJsonValue() const { return toValue(); }
QVariant toVariant() const;
- inline QJsonValue::Type type() const { return toValue().type(); }
+ inline QJsonValue::Type type() const { return QJsonValueConstRef::type(); }
inline bool isNull() const { return type() == QJsonValue::Null; }
inline bool isBool() const { return type() == QJsonValue::Bool; }
inline bool isDouble() const { return type() == QJsonValue::Double; }
@@ -174,36 +262,57 @@ public:
inline bool isObject() const { return type() == QJsonValue::Object; }
inline bool isUndefined() const { return type() == QJsonValue::Undefined; }
- inline bool toBool(bool defaultValue = false) const { return toValue().toBool(defaultValue); }
- inline int toInt(int defaultValue = 0) const { return toValue().toInt(defaultValue); }
- inline qint64 toInteger(qint64 defaultValue = 0) const { return toValue().toInteger(defaultValue); }
- inline double toDouble(double defaultValue = 0) const { return toValue().toDouble(defaultValue); }
- inline QString toString(const QString &defaultValue = {}) const { return toValue().toString(defaultValue); }
+ inline bool toBool(bool defaultValue = false) const { return QJsonValueConstRef::toBool(defaultValue); }
+ inline int toInt(int defaultValue = 0) const { return QJsonValueConstRef::toInt(defaultValue); }
+ inline qint64 toInteger(qint64 defaultValue = 0) const { return QJsonValueConstRef::toInteger(defaultValue); }
+ inline double toDouble(double defaultValue = 0) const { return QJsonValueConstRef::toDouble(defaultValue); }
+ inline QString toString(const QString &defaultValue = {}) const { return QJsonValueConstRef::toString(defaultValue); }
QJsonArray toArray() const;
QJsonObject toObject() const;
- const QJsonValue operator[](QStringView key) const { return toValue()[key]; }
- const QJsonValue operator[](QLatin1String key) const { return toValue()[key]; }
- const QJsonValue operator[](qsizetype i) const { return toValue()[i]; }
+ const QJsonValue operator[](QStringView key) const { return QJsonValueConstRef::operator[](key); }
+ const QJsonValue operator[](QLatin1StringView key) const { return QJsonValueConstRef::operator[](key); }
+ const QJsonValue operator[](qsizetype i) const { return QJsonValueConstRef::operator[](i); }
- inline bool operator==(const QJsonValue &other) const { return toValue() == other; }
- inline bool operator!=(const QJsonValue &other) const { return toValue() != other; }
+#if QT_CORE_REMOVED_SINCE(6, 8)
+ inline bool operator==(const QJsonValue &other) const { return comparesEqual(*this, other); }
+ inline bool operator!=(const QJsonValue &other) const { return !comparesEqual(*this, other); }
+#endif
private:
+ friend bool comparesEqual(const QJsonValueRef &lhs,
+ const QJsonValueRef &rhs) noexcept
+ {
+ return comparesEqual(QJsonValue(lhs), QJsonValue(rhs));
+ }
+ friend bool comparesEqual(const QJsonValueRef &lhs,
+ const QJsonValueConstRef &rhs) noexcept
+ {
+ return comparesEqual(QJsonValue(lhs), QJsonValue(rhs));
+ }
+ Q_DECLARE_EQUALITY_COMPARABLE(QJsonValueRef)
+ Q_DECLARE_EQUALITY_COMPARABLE(QJsonValueRef, QJsonValueConstRef)
+
QJsonValue toValue() const;
+#else
+ using QJsonValueConstRef::operator[];
+ Q_CORE_EXPORT QJsonValueRef operator[](QAnyStringView key);
+ Q_CORE_EXPORT QJsonValueRef operator[](qsizetype i);
- union {
- QJsonArray *a;
- QJsonObject *o;
- };
- quint64 is_object : 1;
- quint64 index : 63;
+private:
+ using QJsonValueConstRef::QJsonValueConstRef;
+#endif // < Qt 7
+ QT7_ONLY(Q_CORE_EXPORT) void detach();
friend class QJsonArray;
friend class QJsonObject;
};
+QT_WARNING_POP
-Q_DECLARE_SHARED(QJsonValue)
+inline QJsonValue QCborValueConstRef::toJsonValue() const
+{
+ return concrete().toJsonValue();
+}
Q_CORE_EXPORT size_t qHash(const QJsonValue &value, size_t seed = 0);
diff --git a/src/corelib/serialization/qjsonwriter.cpp b/src/corelib/serialization/qjsonwriter.cpp
index 54aad864a5..ab34e9228d 100644
--- a/src/corelib/serialization/qjsonwriter.cpp
+++ b/src/corelib/serialization/qjsonwriter.cpp
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2016 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include <cmath>
#include <qlocale.h>
@@ -58,23 +22,24 @@ static inline uchar hexdig(uint u)
return (u < 0xa ? '0' + u : 'a' + u - 0xa);
}
-static QByteArray escapedString(const QString &s)
+static QByteArray escapedString(QStringView s)
{
// give it a minimum size to ensure the resize() below always adds enough space
- QByteArray ba(qMax(s.length(), 16), Qt::Uninitialized);
+ QByteArray ba(qMax(s.size(), 16), Qt::Uninitialized);
+ auto ba_const_start = [&]() { return reinterpret_cast<const uchar *>(ba.constData()); };
uchar *cursor = reinterpret_cast<uchar *>(const_cast<char *>(ba.constData()));
- const uchar *ba_end = cursor + ba.length();
- const char16_t *src = reinterpret_cast<const char16_t *>(s.constBegin());
- const char16_t *const end = reinterpret_cast<const char16_t *>(s.constEnd());
+ const uchar *ba_end = cursor + ba.size();
+ const char16_t *src = s.utf16();
+ const char16_t *const end = s.utf16() + s.size();
while (src != end) {
if (cursor >= ba_end - 6) {
// ensure we have enough space
- int pos = cursor - (const uchar *)ba.constData();
+ qptrdiff pos = cursor - ba_const_start();
ba.resize(ba.size()*2);
- cursor = (uchar *)ba.data() + pos;
- ba_end = (const uchar *)ba.constData() + ba.length();
+ cursor = reinterpret_cast<uchar *>(ba.data()) + pos;
+ ba_end = ba_const_start() + ba.size();
}
char16_t u = *src++;
@@ -124,7 +89,7 @@ static QByteArray escapedString(const QString &s)
}
}
- ba.resize(cursor - (const uchar *)ba.constData());
+ ba.resize(cursor - ba_const_start());
return ba;
}
@@ -143,7 +108,7 @@ static void valueToJson(const QCborValue &v, QByteArray &json, int indent, bool
break;
case QCborValue::Double: {
const double d = v.toDouble();
- if (qIsFinite(d))
+ if (qt_is_finite(d))
json += QByteArray::number(d, 'g', QLocale::FloatingPointShortest);
else
json += "null"; // +INF || -INF || NaN (see RFC4627#section2.4)
diff --git a/src/corelib/serialization/qjsonwriter_p.h b/src/corelib/serialization/qjsonwriter_p.h
index 8c263bb7c3..f61840247f 100644
--- a/src/corelib/serialization/qjsonwriter_p.h
+++ b/src/corelib/serialization/qjsonwriter_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QJSONWRITER_P_H
#define QJSONWRITER_P_H
diff --git a/src/corelib/serialization/qtextstream.cpp b/src/corelib/serialization/qtextstream.cpp
index 50bb63465f..e9d650b3e2 100644
--- a/src/corelib/serialization/qtextstream.cpp
+++ b/src/corelib/serialization/qtextstream.cpp
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2016 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
//#define QTEXTSTREAM_DEBUG
static const int QTEXTSTREAM_BUFFERSIZE = 16384;
@@ -50,6 +14,7 @@ static const int QTEXTSTREAM_BUFFERSIZE = 16384;
\ingroup io
\ingroup string-processing
+ \ingroup qtserialization
\reentrant
QTextStream can operate on a QIODevice, a QByteArray or a
@@ -231,6 +196,8 @@ static const int QTEXTSTREAM_BUFFERSIZE = 16384;
#include "qnumeric.h"
#include "qvarlengtharray.h"
#include <private/qdebug_p.h>
+#include <private/qnumeric_p.h>
+#include <private/qtools_p.h>
#include <locale.h>
#include "private/qlocale_p.h"
@@ -279,6 +246,9 @@ static const int QTEXTSTREAM_BUFFERSIZE = 16384;
QT_BEGIN_NAMESPACE
+using namespace Qt::StringLiterals;
+using namespace QtMiscUtils;
+
//-------------------------------------------------------------------
/*!
@@ -310,7 +280,7 @@ void QTextStreamPrivate::Params::reset()
realNumberPrecision = 6;
integerBase = 0;
fieldWidth = 0;
- padChar = QLatin1Char(' ');
+ padChar = u' ';
fieldAlignment = QTextStream::AlignRight;
realNumberNotation = QTextStream::SmartNotation;
numberFlags = { };
@@ -390,6 +360,7 @@ bool QTextStreamPrivate::fillReadBuffer(qint64 maxBytes)
if (bytesRead <= 0)
return false;
+#ifndef QT_BOOTSTRAPPED
if (autoDetectUnicode) {
autoDetectUnicode = false;
@@ -404,6 +375,7 @@ bool QTextStreamPrivate::fillReadBuffer(qint64 maxBytes)
#if defined (QTEXTSTREAM_DEBUG)
qDebug("QTextStreamPrivate::fillReadBuffer(), using %s encoding", QStringConverter::nameForEncoding(encoding));
#endif
+#endif
#if defined (QTEXTSTREAM_DEBUG)
qDebug("QTextStreamPrivate::fillReadBuffer(), device->read(\"%s\", %d) == %d",
@@ -415,7 +387,7 @@ bool QTextStreamPrivate::fillReadBuffer(qint64 maxBytes)
// remove all '\r\n' in the string.
if (readBuffer.size() > oldReadBufferSize && textModeEnabled) {
- QChar CR = QLatin1Char('\r');
+ QChar CR = u'\r';
QChar *writePtr = readBuffer.data() + oldReadBufferSize;
QChar *readPtr = readBuffer.data() + oldReadBufferSize;
QChar *endPtr = readBuffer.data() + readBuffer.size();
@@ -483,7 +455,7 @@ void QTextStreamPrivate::flushWriteBuffer()
bool textModeEnabled = device->isTextModeEnabled();
if (textModeEnabled) {
device->setTextModeEnabled(false);
- writeBuffer.replace(QLatin1Char('\n'), QLatin1String("\r\n"));
+ writeBuffer.replace(u'\n', "\r\n"_L1);
}
#endif
@@ -590,9 +562,9 @@ bool QTextStreamPrivate::scan(const QChar **ptr, int *length, int maxlen, TokenD
}
break;
case EndOfLine:
- if (ch == QLatin1Char('\n')) {
+ if (ch == u'\n') {
foundToken = true;
- delimSize = (lastChar == QLatin1Char('\r')) ? 2 : 1;
+ delimSize = (lastChar == u'\r') ? 2 : 1;
consumeDelimiter = true;
}
lastChar = ch;
@@ -614,7 +586,7 @@ bool QTextStreamPrivate::scan(const QChar **ptr, int *length, int maxlen, TokenD
// don't make it part of the line.
if (delimiter == EndOfLine && totalSize > 0 && !foundToken) {
if (((string && stringOffset + totalSize == string->size()) || (device && device->atEnd()))
- && lastChar == QLatin1Char('\r')) {
+ && lastChar == u'\r') {
consumeDelimiter = true;
++delimSize;
}
@@ -712,7 +684,7 @@ inline void QTextStreamPrivate::restoreToSavedConverterState()
/*!
\internal
*/
-void QTextStreamPrivate::write(const QChar *data, int len)
+void QTextStreamPrivate::write(const QChar *data, qsizetype len)
{
if (string) {
// ### What about seek()??
@@ -742,7 +714,7 @@ inline void QTextStreamPrivate::write(QChar ch)
/*!
\internal
*/
-void QTextStreamPrivate::write(QLatin1String data)
+void QTextStreamPrivate::write(QLatin1StringView data)
{
if (string) {
// ### What about seek()??
@@ -757,7 +729,7 @@ void QTextStreamPrivate::write(QLatin1String data)
/*!
\internal
*/
-void QTextStreamPrivate::writePadding(int len)
+void QTextStreamPrivate::writePadding(qsizetype len)
{
if (string) {
// ### What about seek()??
@@ -822,7 +794,7 @@ inline void QTextStreamPrivate::putChar(QChar ch)
/*!
\internal
*/
-QTextStreamPrivate::PaddingResult QTextStreamPrivate::padding(int len) const
+QTextStreamPrivate::PaddingResult QTextStreamPrivate::padding(qsizetype len) const
{
Q_ASSERT(params.fieldWidth > len); // calling padding() when no padding is needed is an error
@@ -849,7 +821,7 @@ QTextStreamPrivate::PaddingResult QTextStreamPrivate::padding(int len) const
/*!
\internal
*/
-void QTextStreamPrivate::putString(const QChar *data, int len, bool number)
+void QTextStreamPrivate::putString(const QChar *data, qsizetype len, bool number)
{
if (Q_UNLIKELY(params.fieldWidth > len)) {
@@ -878,7 +850,7 @@ void QTextStreamPrivate::putString(const QChar *data, int len, bool number)
/*!
\internal
*/
-void QTextStreamPrivate::putString(QLatin1String data, bool number)
+void QTextStreamPrivate::putString(QLatin1StringView data, bool number)
{
if (Q_UNLIKELY(params.fieldWidth > data.size())) {
@@ -891,7 +863,7 @@ void QTextStreamPrivate::putString(QLatin1String data, bool number)
if (sign == locale.negativeSign() || sign == locale.positiveSign()) {
// write the sign before the padding, then skip it later
write(&sign, 1);
- data = QLatin1String(data.data() + 1, data.size() - 1);
+ data = QLatin1StringView(data.data() + 1, data.size() - 1);
}
}
@@ -1030,7 +1002,10 @@ QTextStream::QTextStream(FILE *fileHandle, OpenMode openMode)
fileHandle, int(openMode));
#endif
QFile *file = new QFile;
- file->open(fileHandle, openMode);
+ // Discarding the return value of open; even if it failed
+ // (and the file is not open), QTextStream still reports `Ok`
+ // for closed QIODevices, so there's nothing really to do here.
+ (void)file->open(fileHandle, openMode);
Q_D(QTextStream);
d->device = file;
@@ -1433,7 +1408,8 @@ QTextStream::RealNumberNotation QTextStream::realNumberNotation() const
/*!
Sets the precision of real numbers to \a precision. This value
describes the number of fraction digits QTextStream should
- write when generating real numbers.
+ write when generating real numbers (FixedNotation, ScientificNotation), or
+ the maximum number of significant digits (SmartNotation).
The precision cannot be a negative value. The default value is 6.
@@ -1452,7 +1428,9 @@ void QTextStream::setRealNumberPrecision(int precision)
/*!
Returns the current real number precision, or the number of fraction
- digits QTextStream will write when generating real numbers.
+ digits QTextStream will write when generating real numbers
+ (FixedNotation, ScientificNotation), or the maximum number of significant
+ digits (SmartNotation).
\sa setRealNumberNotation(), realNumberNotation(), numberFlags(), integerBase()
*/
@@ -1646,7 +1624,7 @@ QTextStreamPrivate::NumberParsingStatus QTextStreamPrivate::getNumber(qulonglong
QChar ch;
if (!getChar(&ch))
return npsInvalidPrefix;
- if (ch == QLatin1Char('0')) {
+ if (ch == u'0') {
QChar ch2;
if (!getChar(&ch2)) {
// Result is the number 0
@@ -1655,9 +1633,9 @@ QTextStreamPrivate::NumberParsingStatus QTextStreamPrivate::getNumber(qulonglong
}
ch2 = ch2.toLower();
- if (ch2 == QLatin1Char('x')) {
+ if (ch2 == u'x') {
base = 16;
- } else if (ch2 == QLatin1Char('b')) {
+ } else if (ch2 == u'b') {
base = 2;
} else if (ch2.isDigit() && ch2.digitValue() >= 0 && ch2.digitValue() <= 7) {
base = 8;
@@ -1682,9 +1660,9 @@ QTextStreamPrivate::NumberParsingStatus QTextStreamPrivate::getNumber(qulonglong
case 2: {
QChar pf1, pf2, dig;
// Parse prefix '0b'
- if (!getChar(&pf1) || pf1 != QLatin1Char('0'))
+ if (!getChar(&pf1) || pf1 != u'0')
return npsInvalidPrefix;
- if (!getChar(&pf2) || pf2.toLower() != QLatin1Char('b'))
+ if (!getChar(&pf2) || pf2.toLower() != u'b')
return npsInvalidPrefix;
// Parse digits
int ndigits = 0;
@@ -1710,13 +1688,13 @@ QTextStreamPrivate::NumberParsingStatus QTextStreamPrivate::getNumber(qulonglong
case 8: {
QChar pf, dig;
// Parse prefix '0'
- if (!getChar(&pf) || pf != QLatin1Char('0'))
+ if (!getChar(&pf) || pf != u'0')
return npsInvalidPrefix;
// Parse digits
int ndigits = 0;
while (getChar(&dig)) {
int n = dig.toLower().unicode();
- if (n >= '0' && n <= '7') {
+ if (isOctalDigit(n)) {
val *= 8;
val += n - '0';
} else {
@@ -1773,20 +1751,17 @@ QTextStreamPrivate::NumberParsingStatus QTextStreamPrivate::getNumber(qulonglong
case 16: {
QChar pf1, pf2, dig;
// Parse prefix ' 0x'
- if (!getChar(&pf1) || pf1 != QLatin1Char('0'))
+ if (!getChar(&pf1) || pf1 != u'0')
return npsInvalidPrefix;
- if (!getChar(&pf2) || pf2.toLower() != QLatin1Char('x'))
+ if (!getChar(&pf2) || pf2.toLower() != u'x')
return npsInvalidPrefix;
// Parse digits
int ndigits = 0;
while (getChar(&dig)) {
- int n = dig.toLower().unicode();
- if (n >= '0' && n <= '9') {
- val <<= 4;
- val += n - '0';
- } else if (n >= 'a' && n <= 'f') {
+ const int h = fromHex(dig.unicode());
+ if (h != -1) {
val <<= 4;
- val += 10 + (n - 'a');
+ val += h;
} else {
ungetChar(dig);
break;
@@ -1942,13 +1917,13 @@ bool QTextStreamPrivate::getReal(double *f)
// nan/+inf/-inf, so here we also check for uppercase and mixed
// case versions.
if (!qstricmp(buf, "nan") || !qstricmp(buf, "+nan") || !qstricmp(buf, "-nan")) {
- *f = qQNaN();
+ *f = qt_qnan();
return true;
} else if (!qstricmp(buf, "+inf") || !qstricmp(buf, "inf")) {
- *f = qInf();
+ *f = qt_inf();
return true;
} else if (!qstricmp(buf, "-inf")) {
- *f = -qInf();
+ *f = -qt_inf();
return true;
}
bool ok;
@@ -1980,7 +1955,7 @@ QTextStream &QTextStream::operator>>(QChar &c)
\overload
Reads a character from the stream and stores it in \a c. The
- character from the stream is converted to ISO-5589-1 before it is
+ character from the stream is converted to ISO-8859-1 before it is
stored.
\sa QChar::toLatin1()
@@ -1994,6 +1969,14 @@ QTextStream &QTextStream::operator>>(char &c)
}
/*!
+ \fn QTextStream &QTextStream::operator>>(char16_t &c)
+ \overload
+ \since 6.4
+
+ Reads a character from the stream and stores it in \a c.
+*/
+
+/*!
Reads an integer from the stream and stores it in \a i, then
returns a reference to the QTextStream. The number is cast to
the correct type before it is stored. If no number was detected on
@@ -2251,8 +2234,8 @@ void QTextStreamPrivate::putNumber(qulonglong number, bool negative)
// workaround for backward compatibility - in octal form with
// ShowBase flag set zero should be written as '00'
if (number == 0 && base == 8 && params.numberFlags & QTextStream::ShowBase
- && result == QLatin1String("0")) {
- result.prepend(QLatin1Char('0'));
+ && result == "0"_L1) {
+ result.prepend(u'0');
}
}
putString(result, true);
@@ -2286,6 +2269,15 @@ QTextStream &QTextStream::operator<<(char c)
}
/*!
+ \fn QTextStream &QTextStream::operator<<(char16_t c)
+ \overload
+ \since 6.3.1
+
+ Writes the Unicode character \a c to the stream, then returns a
+ reference to the QTextStream.
+*/
+
+/*!
Writes the integer number \a i to the stream, then returns a
reference to the QTextStream. By default, the number is stored in
decimal form, but you can also set the base by calling
@@ -2496,7 +2488,7 @@ QTextStream &QTextStream::operator<<(QStringView string)
Writes \a string to the stream, and returns a reference to the
QTextStream.
*/
-QTextStream &QTextStream::operator<<(QLatin1String string)
+QTextStream &QTextStream::operator<<(QLatin1StringView string)
{
Q_D(QTextStream);
CHECK_VALID_STREAM(*this);
@@ -2514,7 +2506,7 @@ QTextStream &QTextStream::operator<<(const QByteArray &array)
{
Q_D(QTextStream);
CHECK_VALID_STREAM(*this);
- d->putString(QString::fromUtf8(array.constData(), array.length()));
+ d->putString(QString::fromUtf8(array.constData(), array.size()));
return *this;
}
@@ -2844,7 +2836,7 @@ QTextStream &center(QTextStream &stream)
*/
QTextStream &endl(QTextStream &stream)
{
- return stream << QLatin1Char('\n') << Qt::flush;
+ return stream << '\n'_L1 << Qt::flush;
}
/*!
@@ -2958,7 +2950,7 @@ void QTextStream::setEncoding(QStringConverter::Encoding encoding)
d->encoding = encoding;
d->toUtf16 = QStringDecoder(d->encoding);
- bool generateBOM = d->hasWrittenData && d->generateBOM;
+ bool generateBOM = !d->hasWrittenData && d->generateBOM;
d->fromUtf16 = QStringEncoder(d->encoding,
generateBOM ? QStringEncoder::Flag::WriteBom : QStringEncoder::Flag::Default);
diff --git a/src/corelib/serialization/qtextstream.h b/src/corelib/serialization/qtextstream.h
index e69c6a67dc..7a0fc42a68 100644
--- a/src/corelib/serialization/qtextstream.h
+++ b/src/corelib/serialization/qtextstream.h
@@ -1,53 +1,21 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QTEXTSTREAM_H
#define QTEXTSTREAM_H
#include <QtCore/qiodevicebase.h>
-#include <QtCore/qstring.h>
#include <QtCore/qchar.h>
#include <QtCore/qscopedpointer.h>
-#include <QtCore/qstringconverter.h>
+#include <QtCore/qstringconverter_base.h>
#include <stdio.h>
+#if 0
+// the macros around the class name throw off syncqt:
+#pragma qt_class(QTextStream)
+#endif
+
#ifdef Status
#error qtextstream.h must be included before any header file that defines Status
#endif
@@ -56,9 +24,20 @@ QT_BEGIN_NAMESPACE
class QIODevice;
class QLocale;
+class QString;
+
+#if !QT_DEPRECATED_SINCE(6, 9)
+# define QT_NO_INHERITABLE_TEXT_STREAM
+#endif
+
+#ifdef QT_NO_INHERITABLE_TEXT_STREAM
+# define QT_TEXT_STREAM_FINAL final
+#else
+# define QT_TEXT_STREAM_FINAL
+#endif
class QTextStreamPrivate;
-class Q_CORE_EXPORT QTextStream : public QIODeviceBase
+class Q_CORE_EXPORT QTextStream QT_TEXT_STREAM_FINAL : public QIODeviceBase
{
Q_DECLARE_PRIVATE(QTextStream)
@@ -95,7 +74,8 @@ public:
explicit QTextStream(QString *string, OpenMode openMode = ReadWrite);
explicit QTextStream(QByteArray *array, OpenMode openMode = ReadWrite);
explicit QTextStream(const QByteArray &array, OpenMode openMode = ReadOnly);
- virtual ~QTextStream();
+ QT6_ONLY(virtual)
+ ~QTextStream();
void setEncoding(QStringConverter::Encoding encoding);
QStringConverter::Encoding encoding() const;
@@ -153,6 +133,8 @@ public:
QTextStream &operator>>(QChar &ch);
QTextStream &operator>>(char &ch);
+ QTextStream &operator>>(char16_t &ch)
+ { QChar c; *this >> c; ch = c.unicode(); return *this; }
QTextStream &operator>>(signed short &i);
QTextStream &operator>>(unsigned short &i);
QTextStream &operator>>(signed int &i);
@@ -169,6 +151,7 @@ public:
QTextStream &operator<<(QChar ch);
QTextStream &operator<<(char ch);
+ QTextStream &operator<<(char16_t ch) { return *this << QChar(ch); }
QTextStream &operator<<(signed short i);
QTextStream &operator<<(unsigned short i);
QTextStream &operator<<(signed int i);
@@ -181,7 +164,7 @@ public:
QTextStream &operator<<(double f);
QTextStream &operator<<(const QString &s);
QTextStream &operator<<(QStringView s);
- QTextStream &operator<<(QLatin1String s);
+ QTextStream &operator<<(QLatin1StringView s);
QTextStream &operator<<(const QByteArray &array);
QTextStream &operator<<(const char *c);
QTextStream &operator<<(const void *ptr);
diff --git a/src/corelib/serialization/qtextstream_p.h b/src/corelib/serialization/qtextstream_p.h
index 79643de35d..909b75d0de 100644
--- a/src/corelib/serialization/qtextstream_p.h
+++ b/src/corelib/serialization/qtextstream_p.h
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2016 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QTEXTSTREAM_P_H
#define QTEXTSTREAM_P_H
@@ -53,8 +17,9 @@
//
#include <QtCore/private/qglobal_p.h>
-#include "qiodevice.h"
-#include "qlocale.h"
+#include <QtCore/qstringconverter.h>
+#include <QtCore/qiodevice.h>
+#include <QtCore/qlocale.h>
#include "qtextstream.h"
QT_BEGIN_NAMESPACE
@@ -174,14 +139,17 @@ public:
NumberParsingStatus getNumber(qulonglong *l);
bool getReal(double *f);
- inline void write(const QString &data) { write(data.begin(), data.length()); }
+ inline void write(QStringView data) { write(data.begin(), data.size()); }
inline void write(QChar ch);
- void write(const QChar *data, int len);
- void write(QLatin1String data);
- void writePadding(int len);
- inline void putString(const QString &ch, bool number = false) { putString(ch.constData(), ch.length(), number); }
- void putString(const QChar *data, int len, bool number = false);
- void putString(QLatin1String data, bool number = false);
+ void write(const QChar *data, qsizetype len);
+ void write(QLatin1StringView data);
+ void writePadding(qsizetype len);
+ inline void putString(QStringView string, bool number = false)
+ {
+ putString(string.constData(), string.size(), number);
+ }
+ void putString(const QChar *data, qsizetype len, bool number = false);
+ void putString(QLatin1StringView data, bool number = false);
void putString(QUtf8StringView data, bool number = false);
inline void putChar(QChar ch);
void putNumber(qulonglong number, bool negative);
@@ -189,7 +157,7 @@ public:
struct PaddingResult {
int left, right;
};
- PaddingResult padding(int len) const;
+ PaddingResult padding(qsizetype len) const;
// buffers
bool fillReadBuffer(qint64 maxBytes = -1);
diff --git a/src/corelib/serialization/qxmlstream.cpp b/src/corelib/serialization/qxmlstream.cpp
index 68c06eb0bd..0fe8c87779 100644
--- a/src/corelib/serialization/qxmlstream.cpp
+++ b/src/corelib/serialization/qxmlstream.cpp
@@ -1,45 +1,9 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "QtCore/qxmlstream.h"
-#ifndef QT_NO_XMLSTREAM
+#if QT_CONFIG(xmlstream)
#include "qxmlutils_p.h"
#include <qdebug.h>
@@ -49,28 +13,22 @@
#include <qstack.h>
#include <qbuffer.h>
#include <qscopeguard.h>
-#ifndef QT_BOOTSTRAPPED
#include <qcoreapplication.h>
-#else
-// This specialization of Q_DECLARE_TR_FUNCTIONS is not in qcoreapplication.h,
-// because that header depends on QObject being available, which is not the
-// case for most bootstrapped applications.
-#define Q_DECLARE_TR_FUNCTIONS(context) \
-public: \
- static inline QString tr(const char *sourceText, const char *comment = nullptr) \
- { Q_UNUSED(comment); return QString::fromUtf8(sourceText); } \
- static inline QString tr(const char *sourceText, const char*, int) \
- { return QString::fromUtf8(sourceText); } \
-private:
-#endif
+
+#include <private/qoffsetstringarray_p.h>
+#include <private/qtools_p.h>
#include <iterator>
#include "qxmlstream_p.h"
#include "qxmlstreamparser_p.h"
+#include <private/qstringconverter_p.h>
+#include <private/qstringiterator_p.h>
QT_BEGIN_NAMESPACE
using namespace QtPrivate;
+using namespace Qt::StringLiterals;
+using namespace QtMiscUtils;
enum { StreamEOF = ~0U };
@@ -89,8 +47,62 @@ auto reversed(Range &r)
template <typename Range>
void reversed(const Range &&) = delete;
+
+// implementation of missing QUtf8StringView methods for ASCII-only needles:
+auto transform(QLatin1StringView haystack, char needle)
+{
+ struct R { QLatin1StringView haystack; char16_t needle; };
+ return R{haystack, uchar(needle)};
+}
+
+auto transform(QStringView haystack, char needle)
+{
+ struct R { QStringView haystack; char16_t needle; };
+ return R{haystack, uchar(needle)};
+}
+
+auto transform(QUtf8StringView haystack, char needle)
+{
+ struct R { QByteArrayView haystack; char needle; };
+ return R{haystack, needle};
+}
+
+auto transform(QLatin1StringView haystack, QLatin1StringView needle)
+{
+ struct R { QLatin1StringView haystack; QLatin1StringView needle; };
+ return R{haystack, needle};
+}
+
+auto transform(QStringView haystack, QLatin1StringView needle)
+{
+ struct R { QStringView haystack; QLatin1StringView needle; };
+ return R{haystack, needle};
}
+auto transform(QUtf8StringView haystack, QLatin1StringView needle)
+{
+ struct R { QLatin1StringView haystack; QLatin1StringView needle; };
+ return R{QLatin1StringView{QByteArrayView{haystack}}, needle};
+}
+
+#define WRAP(method, Needle) \
+ auto method (QAnyStringView s, Needle needle) noexcept \
+ { \
+ return s.visit([needle](auto s) { \
+ auto r = transform(s, needle); \
+ return r.haystack. method (r.needle); \
+ }); \
+ } \
+ /*end*/
+
+WRAP(count, char)
+WRAP(contains, char)
+WRAP(contains, QLatin1StringView)
+WRAP(endsWith, char)
+WRAP(indexOf, QLatin1StringView)
+
+} // unnamed namespace
+
/*!
\enum QXmlStreamReader::TokenType
@@ -129,7 +141,7 @@ void reversed(const Range &&) = delete;
\value DTD The reader reports a DTD in text(), notation
declarations in notationDeclarations(), and entity declarations in
entityDeclarations(). Details of the DTD declaration are reported
- in in dtdName(), dtdPublicId(), and dtdSystemId().
+ in dtdName(), dtdPublicId(), and dtdSystemId().
\value EntityReference The reader reports an entity reference that
could not be resolved. The name of the reference is reported in
@@ -174,7 +186,7 @@ void reversed(const Range &&) = delete;
addData() or by waiting for it to arrive on the device().
\value UnexpectedElementError The parser encountered an element
- that was different to those it expected.
+ or token that was different to those it expected.
*/
@@ -221,7 +233,7 @@ QString QXmlStreamEntityResolver::resolveUndeclaredEntity(const QString &/*name*
return QString();
}
-#ifndef QT_NO_XMLSTREAMREADER
+#if QT_CONFIG(xmlstreamreader)
QString QXmlStreamReaderPrivate::resolveUndeclaredEntity(const QString &name)
{
@@ -277,6 +289,8 @@ QXmlStreamEntityResolver *QXmlStreamReader::entityResolver() const
\ingroup xml-tools
+ \ingroup qtserialization
+
QXmlStreamReader provides a simple streaming API to parse well-formed
XML. It is an alternative to first loading the complete XML into a
DOM tree (see \l QDomDocument). QXmlStreamReader reads data either
@@ -309,13 +323,34 @@ QXmlStreamEntityResolver *QXmlStreamReader::entityResolver() const
QXmlStreamReader is a well-formed XML 1.0 parser that does \e not
include external parsed entities. As long as no error occurs, the
- application code can thus be assured that the data provided by the
- stream reader satisfies the W3C's criteria for well-formed XML. For
- example, you can be certain that all tags are indeed nested and
- closed properly, that references to internal entities have been
- replaced with the correct replacement text, and that attributes have
- been normalized or added according to the internal subset of the
- DTD.
+ application code can thus be assured, that
+ \list
+ \li the data provided by the stream reader satisfies the W3C's
+ criteria for well-formed XML,
+ \li tokens are provided in a valid order.
+ \endlist
+
+ Unless QXmlStreamReader raises an error, it guarantees the following:
+ \list
+ \li All tags are nested and closed properly.
+ \li References to internal entities have been replaced with the
+ correct replacement text.
+ \li Attributes have been normalized or added according to the
+ internal subset of the \l DTD.
+ \li Tokens of type \l StartDocument happen before all others,
+ aside from comments and processing instructions.
+ \li At most one DOCTYPE element (a token of type \l DTD) is present.
+ \li If present, the DOCTYPE appears before all other elements,
+ aside from StartDocument, comments and processing instructions.
+ \endlist
+
+ In particular, once any token of type \l StartElement, \l EndElement,
+ \l Characters, \l EntityReference or \l EndDocument is seen, no
+ tokens of type StartDocument or DTD will be seen. If one is present in
+ the input stream, out of order, an error is raised.
+
+ \note The token types \l Comment and \l ProcessingInstruction may appear
+ anywhere in the stream.
If an error occurs while parsing, atEnd() and hasError() return
true, and error() returns the error that occurred. The functions
@@ -408,41 +443,55 @@ QXmlStreamReader::QXmlStreamReader(QIODevice *device)
}
/*!
- Creates a new stream reader that reads from \a data.
+ \overload
- \sa addData(), clear(), setDevice()
- */
-QXmlStreamReader::QXmlStreamReader(const QByteArray &data)
- : d_ptr(new QXmlStreamReaderPrivate(this))
-{
- Q_D(QXmlStreamReader);
- d->dataBuffer = data;
-}
+ \fn QXmlStreamReader::QXmlStreamReader(const QByteArray &data)
+
+ Creates a new stream reader that reads from \a data.
+
+ \sa addData(), clear(), setDevice()
+*/
/*!
- Creates a new stream reader that reads from \a data.
+ Creates a new stream reader that reads from \a data.
- \sa addData(), clear(), setDevice()
- */
-QXmlStreamReader::QXmlStreamReader(const QString &data)
+ \note In Qt versions prior to 6.5, this constructor was overloaded
+ for QString and \c {const char*}.
+
+ \sa addData(), clear(), setDevice()
+*/
+QXmlStreamReader::QXmlStreamReader(QAnyStringView data)
: d_ptr(new QXmlStreamReaderPrivate(this))
{
Q_D(QXmlStreamReader);
- d->dataBuffer = data.toUtf8();
- d->decoder = QStringDecoder(QStringDecoder::Utf8);
- d->lockEncoding = true;
+ data.visit([d](auto data) {
+ if constexpr (std::is_same_v<decltype(data), QStringView>) {
+ d->dataBuffer = data.toUtf8();
+ d->decoder = QStringDecoder(QStringDecoder::Utf8);
+ d->lockEncoding = true;
+ } else if constexpr (std::is_same_v<decltype(data), QLatin1StringView>) {
+ // Conversion to a QString is required, to avoid breaking
+ // pre-existing (before porting to QAnyStringView) behavior.
+ d->dataBuffer = QString::fromLatin1(data).toUtf8();
+ d->decoder = QStringDecoder(QStringDecoder::Utf8);
+ d->lockEncoding = true;
+ } else {
+ d->dataBuffer = QByteArray(data.data(), data.size());
+ }
+ });
}
/*!
- Creates a new stream reader that reads from \a data.
+ \internal
- \sa addData(), clear(), setDevice()
- */
-QXmlStreamReader::QXmlStreamReader(const char *data)
+ Creates a new stream reader that reads from \a data.
+ Used by the weak constructor taking a QByteArray.
+*/
+QXmlStreamReader::QXmlStreamReader(const QByteArray &data, PrivateConstructorTag)
: d_ptr(new QXmlStreamReaderPrivate(this))
{
Q_D(QXmlStreamReader);
- d->dataBuffer = QByteArray(data);
+ d->dataBuffer = data;
}
/*!
@@ -491,47 +540,61 @@ QIODevice *QXmlStreamReader::device() const
return d->device;
}
-
/*!
- Adds more \a data for the reader to read. This function does
- nothing if the reader has a device().
+ \overload
- \sa readNext(), clear()
- */
-void QXmlStreamReader::addData(const QByteArray &data)
-{
- Q_D(QXmlStreamReader);
- if (d->device) {
- qWarning("QXmlStreamReader: addData() with device()");
- return;
- }
- d->dataBuffer += data;
-}
+ \fn void QXmlStreamReader::addData(const QByteArray &data)
+
+ Adds more \a data for the reader to read. This function does
+ nothing if the reader has a device().
+
+ \sa readNext(), clear()
+*/
/*!
- Adds more \a data for the reader to read. This function does
- nothing if the reader has a device().
+ Adds more \a data for the reader to read. This function does
+ nothing if the reader has a device().
- \sa readNext(), clear()
- */
-void QXmlStreamReader::addData(const QString &data)
+ \note In Qt versions prior to 6.5, this function was overloaded
+ for QString and \c {const char*}.
+
+ \sa readNext(), clear()
+*/
+void QXmlStreamReader::addData(QAnyStringView data)
{
Q_D(QXmlStreamReader);
- d->lockEncoding = true;
- if (!d->decoder.isValid())
- d->decoder = QStringDecoder(QStringDecoder::Utf8);
- addData(data.toUtf8());
+ data.visit([this, d](auto data) {
+ if constexpr (std::is_same_v<decltype(data), QStringView>) {
+ d->lockEncoding = true;
+ if (!d->decoder.isValid())
+ d->decoder = QStringDecoder(QStringDecoder::Utf8);
+ addDataImpl(data.toUtf8());
+ } else if constexpr (std::is_same_v<decltype(data), QLatin1StringView>) {
+ // Conversion to a QString is required, to avoid breaking
+ // pre-existing (before porting to QAnyStringView) behavior.
+ if (!d->decoder.isValid())
+ d->decoder = QStringDecoder(QStringDecoder::Utf8);
+ addDataImpl(QString::fromLatin1(data).toUtf8());
+ } else {
+ addDataImpl(QByteArray(data.data(), data.size()));
+ }
+ });
}
/*!
- Adds more \a data for the reader to read. This function does
- nothing if the reader has a device().
+ \internal
- \sa readNext(), clear()
- */
-void QXmlStreamReader::addData(const char *data)
+ Adds more \a data for the reader to read. This function does
+ nothing if the reader has a device().
+*/
+void QXmlStreamReader::addDataImpl(const QByteArray &data)
{
- addData(QByteArray(data));
+ Q_D(QXmlStreamReader);
+ if (d->device) {
+ qWarning("QXmlStreamReader: addData() with device()");
+ return;
+ }
+ d->dataBuffer += data;
}
/*!
@@ -618,6 +681,7 @@ QXmlStreamReader::TokenType QXmlStreamReader::readNext()
d->token = -1;
return readNext();
}
+ d->checkToken();
return d->type;
}
@@ -658,7 +722,7 @@ QXmlStreamReader::TokenType QXmlStreamReader::tokenType() const
bool QXmlStreamReader::readNextStartElement()
{
while (readNext() != Invalid) {
- if (isEndElement())
+ if (isEndElement() || isEndDocument())
return false;
else if (isStartElement())
return true;
@@ -688,55 +752,24 @@ void QXmlStreamReader::skipCurrentElement()
}
}
-/*
- * Use the following Perl script to generate the error string index list:
-===== PERL SCRIPT ====
-print "static const char QXmlStreamReader_tokenTypeString_string[] =\n";
-$counter = 0;
-$i = 0;
-while (<STDIN>) {
- chomp;
- print " \"$_\\0\"\n";
- $sizes[$i++] = $counter;
- $counter += length 1 + $_;
-}
-print " \"\\0\";\n\nstatic const short QXmlStreamReader_tokenTypeString_indices[] = {\n ";
-for ($j = 0; $j < $i; ++$j) {
- printf "$sizes[$j], ";
-}
-print "0\n};\n";
-===== PERL SCRIPT ====
-
- * The input data is as follows (copied from qxmlstream.h):
-NoToken
-Invalid
-StartDocument
-EndDocument
-StartElement
-EndElement
-Characters
-Comment
-DTD
-EntityReference
-ProcessingInstruction
-*/
-static const char QXmlStreamReader_tokenTypeString_string[] =
- "NoToken\0"
- "Invalid\0"
- "StartDocument\0"
- "EndDocument\0"
- "StartElement\0"
- "EndElement\0"
- "Characters\0"
- "Comment\0"
- "DTD\0"
- "EntityReference\0"
- "ProcessingInstruction\0";
-
-static const short QXmlStreamReader_tokenTypeString_indices[] = {
- 0, 8, 16, 30, 42, 55, 66, 77, 85, 89, 105, 0
-};
+static constexpr auto QXmlStreamReader_tokenTypeString = qOffsetStringArray(
+ "NoToken",
+ "Invalid",
+ "StartDocument",
+ "EndDocument",
+ "StartElement",
+ "EndElement",
+ "Characters",
+ "Comment",
+ "DTD",
+ "EntityReference",
+ "ProcessingInstruction"
+);
+static constexpr auto QXmlStreamReader_XmlContextString = qOffsetStringArray(
+ "Prolog",
+ "Body"
+);
/*!
\property QXmlStreamReader::namespaceProcessing
@@ -769,11 +802,19 @@ bool QXmlStreamReader::namespaceProcessing() const
QString QXmlStreamReader::tokenString() const
{
Q_D(const QXmlStreamReader);
- return QLatin1String(QXmlStreamReader_tokenTypeString_string +
- QXmlStreamReader_tokenTypeString_indices[d->type]);
+ return QLatin1StringView(QXmlStreamReader_tokenTypeString.at(d->type));
}
-#endif // QT_NO_XMLSTREAMREADER
+/*!
+ \internal
+ \return \param ctxt (Prolog/Body) as a string.
+ */
+static constexpr QLatin1StringView contextString(QXmlStreamReaderPrivate::XmlContext ctxt)
+{
+ return QLatin1StringView(QXmlStreamReader_XmlContextString.at(static_cast<int>(ctxt)));
+}
+
+#endif // feature xmlstreamreader
QXmlStreamPrivateTagStack::QXmlStreamPrivateTagStack()
{
@@ -787,7 +828,7 @@ QXmlStreamPrivateTagStack::QXmlStreamPrivateTagStack()
tagsDone = false;
}
-#ifndef QT_NO_XMLSTREAMREADER
+#if QT_CONFIG(xmlstreamreader)
QXmlStreamReaderPrivate::QXmlStreamReaderPrivate(QXmlStreamReader *q)
:q_ptr(q)
@@ -802,7 +843,7 @@ QXmlStreamReaderPrivate::QXmlStreamReaderPrivate(QXmlStreamReader *q)
init();
#define ADD_PREDEFINED(n, v) \
do { \
- Entity e = Entity::createLiteral(QLatin1String(n), QLatin1String(v)); \
+ Entity e = Entity::createLiteral(n##_L1, v##_L1); \
entityHash.insert(qToStringViewIgnoringNull(e.name), std::move(e)); \
} while (false)
ADD_PREDEFINED("lt", "<");
@@ -823,6 +864,7 @@ void QXmlStreamReaderPrivate::init()
isWhitespace = true;
isCDATA = false;
standalone = false;
+ hasStandalone = false;
tos = 0;
resumeReduction = 0;
state_stack[tos++] = 0;
@@ -859,6 +901,8 @@ void QXmlStreamReaderPrivate::init()
type = QXmlStreamReader::NoToken;
error = QXmlStreamReader::NoError;
+ currentContext = XmlContext::Prolog;
+ foundDTD = false;
}
/*
@@ -969,8 +1013,8 @@ inline uint QXmlStreamReaderPrivate::peekChar()
*/
bool QXmlStreamReaderPrivate::scanUntil(const char *str, short tokenToInject)
{
- int pos = textBuffer.size();
- int oldLineNumber = lineNumber;
+ const qsizetype pos = textBuffer.size();
+ const auto oldLineNumber = lineNumber;
uint c;
while ((c = getChar()) != StreamEOF) {
@@ -1017,7 +1061,7 @@ bool QXmlStreamReaderPrivate::scanUntil(const char *str, short tokenToInject)
bool QXmlStreamReaderPrivate::scanString(const char *str, short tokenToInject, bool requireSpace)
{
- int n = 0;
+ qsizetype n = 0;
while (str[n]) {
uint c = getChar();
if (c != ushort(str[n])) {
@@ -1030,12 +1074,11 @@ bool QXmlStreamReaderPrivate::scanString(const char *str, short tokenToInject, b
}
++n;
}
- for (int i = 0; i < n; ++i)
- textBuffer += QChar(ushort(str[i]));
+ textBuffer += QLatin1StringView(str, n);
if (requireSpace) {
- int s = fastScanSpace();
+ const qsizetype s = fastScanSpace();
if (!s || atEnd) {
- int pos = textBuffer.size() - n - s;
+ qsizetype pos = textBuffer.size() - n - s;
putString(textBuffer, pos);
textBuffer.resize(pos);
return false;
@@ -1145,9 +1188,9 @@ bool QXmlStreamReaderPrivate::scanAttType()
encountered.
*/
-inline int QXmlStreamReaderPrivate::fastScanLiteralContent()
+inline qsizetype QXmlStreamReaderPrivate::fastScanLiteralContent()
{
- int n = 0;
+ qsizetype n = 0;
uint c;
while ((c = getChar()) != StreamEOF) {
switch (ushort(c)) {
@@ -1169,7 +1212,7 @@ inline int QXmlStreamReaderPrivate::fastScanLiteralContent()
case ' ':
case '\t':
if (normalizeLiterals)
- textBuffer += QLatin1Char(' ');
+ textBuffer += u' ';
else
textBuffer += QChar(c);
++n;
@@ -1195,9 +1238,9 @@ inline int QXmlStreamReaderPrivate::fastScanLiteralContent()
return n;
}
-inline int QXmlStreamReaderPrivate::fastScanSpace()
+inline qsizetype QXmlStreamReaderPrivate::fastScanSpace()
{
- int n = 0;
+ qsizetype n = 0;
uint c;
while ((c = getChar()) != StreamEOF) {
switch (c) {
@@ -1228,9 +1271,9 @@ inline int QXmlStreamReaderPrivate::fastScanSpace()
Used for text nodes essentially. That is, characters appearing
inside elements.
*/
-inline int QXmlStreamReaderPrivate::fastScanContentCharList()
+inline qsizetype QXmlStreamReaderPrivate::fastScanContentCharList()
{
- int n = 0;
+ qsizetype n = 0;
uint c;
while ((c = getChar()) != StreamEOF) {
switch (ushort(c)) {
@@ -1241,7 +1284,7 @@ inline int QXmlStreamReaderPrivate::fastScanContentCharList()
return n;
case ']': {
isWhitespace = false;
- int pos = textBuffer.size();
+ const qsizetype pos = textBuffer.size();
textBuffer += QChar(ushort(c));
++n;
while ((c = getChar()) == ']') {
@@ -1251,7 +1294,7 @@ inline int QXmlStreamReaderPrivate::fastScanContentCharList()
if (c == 0) {
putString(textBuffer, pos);
textBuffer.resize(pos);
- } else if (c == '>' && textBuffer.at(textBuffer.size()-2) == QLatin1Char(']')) {
+ } else if (c == '>' && textBuffer.at(textBuffer.size() - 2) == u']') {
raiseWellFormedError(QXmlStream::tr("Sequence ']]>' not allowed in content."));
} else {
putChar(c);
@@ -1292,15 +1335,17 @@ inline int QXmlStreamReaderPrivate::fastScanContentCharList()
return n;
}
-inline int QXmlStreamReaderPrivate::fastScanName(int *prefix)
+// Fast scan an XML attribute name (e.g. "xml:lang").
+inline std::optional<qsizetype> QXmlStreamReaderPrivate::fastScanName(Value *val)
{
- int n = 0;
+ qsizetype n = 0;
uint c;
while ((c = getChar()) != StreamEOF) {
if (n >= 4096) {
// This is too long to be a sensible name, and
- // can exhaust memory
- return 0;
+ // can exhaust memory, or the range of decltype(*prefix)
+ raiseNamePrefixTooLongError();
+ return std::nullopt;
}
switch (c) {
case '\n':
@@ -1329,16 +1374,16 @@ inline int QXmlStreamReaderPrivate::fastScanName(int *prefix)
case '+':
case '*':
putChar(c);
- if (prefix && *prefix == n+1) {
- *prefix = 0;
+ if (val && val->prefix == n + 1) {
+ val->prefix = 0;
putChar(':');
--n;
}
return n;
case ':':
- if (prefix) {
- if (*prefix == 0) {
- *prefix = n+2;
+ if (val) {
+ if (val->prefix == 0) {
+ val->prefix = qint16(n + 2);
} else { // only one colon allowed according to the namespace spec.
putChar(c);
return n;
@@ -1354,9 +1399,9 @@ inline int QXmlStreamReaderPrivate::fastScanName(int *prefix)
}
}
- if (prefix)
- *prefix = 0;
- int pos = textBuffer.size() - n;
+ if (val)
+ val->prefix = 0;
+ qsizetype pos = textBuffer.size() - n;
putString(textBuffer, pos);
textBuffer.resize(pos);
return 0;
@@ -1413,9 +1458,9 @@ static inline NameChar fastDetermineNameChar(QChar ch)
return NotName;
}
-inline int QXmlStreamReaderPrivate::fastScanNMTOKEN()
+inline qsizetype QXmlStreamReaderPrivate::fastScanNMTOKEN()
{
- int n = 0;
+ qsizetype n = 0;
uint c;
while ((c = getChar()) != StreamEOF) {
if (fastDetermineNameChar(QChar(c)) == NotName) {
@@ -1427,7 +1472,7 @@ inline int QXmlStreamReaderPrivate::fastScanNMTOKEN()
}
}
- int pos = textBuffer.size() - n;
+ qsizetype pos = textBuffer.size() - n;
putString(textBuffer, pos);
textBuffer.resize(pos);
@@ -1479,7 +1524,7 @@ void QXmlStreamReaderPrivate::putReplacementInAttributeValue(QStringView s)
uint QXmlStreamReaderPrivate::getChar_helper()
{
- const int BUFFER_SIZE = 8192;
+ constexpr qsizetype BUFFER_SIZE = 8192;
characterOffset += readBufferPos;
readBufferPos = 0;
if (readBuffer.size())
@@ -1571,25 +1616,25 @@ void QXmlStreamReaderPrivate::resolveTag()
++i;
if (i != n)
continue;
- if (dtdAttribute.attributePrefix.isEmpty() && dtdAttribute.attributeName == QLatin1String("xmlns")) {
+ if (dtdAttribute.attributePrefix.isEmpty() && dtdAttribute.attributeName == "xmlns"_L1) {
NamespaceDeclaration &namespaceDeclaration = namespaceDeclarations.push();
namespaceDeclaration.prefix.clear();
const XmlStringRef ns(dtdAttribute.defaultValue);
- if (ns == QLatin1String("http://www.w3.org/2000/xmlns/") ||
- ns == QLatin1String("http://www.w3.org/XML/1998/namespace"))
+ if (ns == "http://www.w3.org/2000/xmlns/"_L1 ||
+ ns == "http://www.w3.org/XML/1998/namespace"_L1)
raiseWellFormedError(QXmlStream::tr("Illegal namespace declaration."));
else
namespaceDeclaration.namespaceUri = ns;
- } else if (dtdAttribute.attributePrefix == QLatin1String("xmlns")) {
+ } else if (dtdAttribute.attributePrefix == "xmlns"_L1) {
NamespaceDeclaration &namespaceDeclaration = namespaceDeclarations.push();
XmlStringRef namespacePrefix = dtdAttribute.attributeName;
XmlStringRef namespaceUri = dtdAttribute.defaultValue;
- if (((namespacePrefix == QLatin1String("xml"))
- ^ (namespaceUri == QLatin1String("http://www.w3.org/XML/1998/namespace")))
- || namespaceUri == QLatin1String("http://www.w3.org/2000/xmlns/")
+ if (((namespacePrefix == "xml"_L1)
+ ^ (namespaceUri == "http://www.w3.org/XML/1998/namespace"_L1))
+ || namespaceUri == "http://www.w3.org/2000/xmlns/"_L1
|| namespaceUri.isEmpty()
- || namespacePrefix == QLatin1String("xmlns"))
+ || namespacePrefix == "xmlns"_L1)
raiseWellFormedError(QXmlStream::tr("Illegal namespace declaration."));
namespaceDeclaration.prefix = namespacePrefix;
@@ -1718,9 +1763,9 @@ void QXmlStreamReaderPrivate::checkPublicLiteral(QStringView publicId)
{
//#x20 | #xD | #xA | [a-zA-Z0-9] | [-'()+,./:=?;!*#@$_%]
- const ushort *data = reinterpret_cast<const ushort *>(publicId.constData());
+ const char16_t *data = publicId.utf16();
uchar c = 0;
- int i;
+ qsizetype i;
for (i = publicId.size() - 1; i >= 0; --i) {
if (data[i] < 256)
switch ((c = data[i])) {
@@ -1730,9 +1775,7 @@ void QXmlStreamReaderPrivate::checkPublicLiteral(QStringView publicId)
case '$': case '_': case '%': case '\'': case '\"':
continue;
default:
- if ((c >= 'a' && c <= 'z')
- || (c >= 'A' && c <= 'Z')
- || (c >= '0' && c <= '9'))
+ if (isAsciiLetterOrNumber(c))
continue;
}
break;
@@ -1764,8 +1807,8 @@ bool QXmlStreamReaderPrivate::checkStartDocument()
void QXmlStreamReaderPrivate::startDocument()
{
QString err;
- if (documentVersion != QLatin1String("1.0")) {
- if (documentVersion.view().contains(QLatin1Char(' ')))
+ if (documentVersion != "1.0"_L1) {
+ if (documentVersion.view().contains(u' '))
err = QXmlStream::tr("Invalid XML version string.");
else
err = QXmlStream::tr("Unsupported XML version.");
@@ -1776,7 +1819,6 @@ void QXmlStreamReaderPrivate::startDocument()
* proper order:
*
* [23] XMLDecl ::= '<?xml' VersionInfo EncodingDecl? SDDecl? S? '?>' */
- bool hasStandalone = false;
for (qsizetype i = 0; err.isNull() && i < n; ++i) {
Attribute &attrib = attributeStack[i];
@@ -1784,7 +1826,7 @@ void QXmlStreamReaderPrivate::startDocument()
XmlStringRef key(symString(attrib.key));
XmlStringRef value(symString(attrib.value));
- if (prefix.isEmpty() && key == QLatin1String("encoding")) {
+ if (prefix.isEmpty() && key == "encoding"_L1) {
documentEncoding = value;
if (hasStandalone)
@@ -1802,16 +1844,16 @@ void QXmlStreamReaderPrivate::startDocument()
}
}
}
- } else if (prefix.isEmpty() && key == QLatin1String("standalone")) {
+ } else if (prefix.isEmpty() && key == "standalone"_L1) {
hasStandalone = true;
- if (value == QLatin1String("yes"))
+ if (value == "yes"_L1)
standalone = true;
- else if (value == QLatin1String("no"))
+ else if (value == "no"_L1)
standalone = false;
else
err = QXmlStream::tr("Standalone accepts only yes or no.");
} else {
- err = QXmlStream::tr("Invalid attribute in XML declaration.");
+ err = QXmlStream::tr("Invalid attribute in XML declaration: %1 = %2").arg(key).arg(value);
}
}
@@ -1840,6 +1882,14 @@ void QXmlStreamReaderPrivate::raiseWellFormedError(const QString &message)
raiseError(QXmlStreamReader::NotWellFormedError, message);
}
+void QXmlStreamReaderPrivate::raiseNamePrefixTooLongError()
+{
+ // TODO: add a ImplementationLimitsExceededError and use it instead
+ raiseError(QXmlStreamReader::NotWellFormedError,
+ QXmlStream::tr("Length of XML attribute name exceeds implementation limits (4KiB "
+ "characters)."));
+}
+
void QXmlStreamReaderPrivate::parseError()
{
@@ -1852,7 +1902,7 @@ void QXmlStreamReaderPrivate::parseError()
int ers = state_stack[tos];
int nexpected = 0;
int expected[nmax];
- if (token != ERROR)
+ if (token != XML_ERROR)
for (int tk = 0; tk < TERMINAL_COUNT; ++tk) {
int k = t_action(ers, tk);
if (k <= 0)
@@ -1865,22 +1915,27 @@ void QXmlStreamReaderPrivate::parseError()
if (nexpected && nexpected < nmax) {
//: '<first option>'
- QString exp_str = QXmlStream::tr("'%1'", "expected").arg(QLatin1String(spell[expected[0]]));
+ QString exp_str = QXmlStream::tr("'%1'", "expected")
+ .arg(QLatin1StringView(spell[expected[0]]));
if (nexpected == 2) {
//: <first option>, '<second option>'
- exp_str = QXmlStream::tr("%1 or '%2'", "expected").arg(exp_str, QLatin1String(spell[expected[1]]));
+ exp_str = QXmlStream::tr("%1 or '%2'", "expected")
+ .arg(exp_str, QLatin1StringView(spell[expected[1]]));
} else if (nexpected > 2) {
int s = 1;
for (; s < nexpected - 1; ++s) {
//: <options so far>, '<next option>'
- exp_str = QXmlStream::tr("%1, '%2'", "expected").arg(exp_str, QLatin1String(spell[expected[s]]));
+ exp_str = QXmlStream::tr("%1, '%2'", "expected")
+ .arg(exp_str, QLatin1StringView(spell[expected[s]]));
}
//: <options so far>, or '<final option>'
- exp_str = QXmlStream::tr("%1, or '%2'", "expected").arg(exp_str, QLatin1String(spell[expected[s]]));
+ exp_str = QXmlStream::tr("%1, or '%2'", "expected")
+ .arg(exp_str, QLatin1StringView(spell[expected[s]]));
}
- error_message = QXmlStream::tr("Expected %1, but got '%2'.").arg(exp_str, QLatin1String(spell[token]));
+ error_message = QXmlStream::tr("Expected %1, but got '%2'.")
+ .arg(exp_str, QLatin1StringView(spell[token]));
} else {
- error_message = QXmlStream::tr("Unexpected '%1'.").arg(QLatin1String(spell[token]));
+ error_message = QXmlStream::tr("Unexpected '%1'.").arg(QLatin1StringView(spell[token]));
}
raiseWellFormedError(error_message);
@@ -2266,7 +2321,7 @@ QXmlStreamAttributes QXmlStreamReader::attributes() const
return d->attributes;
}
-#endif // QT_NO_XMLSTREAMREADER
+#endif // feature xmlstreamreader
/*!
\class QXmlStreamAttribute
@@ -2277,6 +2332,8 @@ QXmlStreamAttributes QXmlStreamReader::attributes() const
\ingroup xml-tools
+ \compares equality
+
An attribute consists of an optionally empty namespaceUri(), a
name(), a value(), and an isDefault() attribute.
@@ -2307,7 +2364,7 @@ QXmlStreamAttribute::QXmlStreamAttribute(const QString &namespaceUri, const QStr
*/
QXmlStreamAttribute::QXmlStreamAttribute(const QString &qualifiedName, const QString &value)
{
- int colon = qualifiedName.indexOf(QLatin1Char(':'));
+ qsizetype colon = qualifiedName.indexOf(u':');
m_name = qualifiedName.mid(colon + 1);
m_qualifiedName = qualifiedName;
m_value = value;
@@ -2351,14 +2408,14 @@ QXmlStreamAttribute::QXmlStreamAttribute(const QString &qualifiedName, const QSt
value following an ATTLIST declaration in the DTD; otherwise
returns \c false.
*/
-/*! \fn bool QXmlStreamAttribute::operator==(const QXmlStreamAttribute &other) const
+/*! \fn bool QXmlStreamAttribute::operator==(const QXmlStreamAttribute &lhs, const QXmlStreamAttribute &rhs)
- Compares this attribute with \a other and returns \c true if they are
+ Compares \a lhs attribute with \a rhs and returns \c true if they are
equal; otherwise returns \c false.
*/
-/*! \fn bool QXmlStreamAttribute::operator!=(const QXmlStreamAttribute &other) const
+/*! \fn bool QXmlStreamAttribute::operator!=(const QXmlStreamAttribute &lhs, const QXmlStreamAttribute &rhs)
- Compares this attribute with \a other and returns \c true if they are
+ Compares \a lhs attribute with \a rhs and returns \c true if they are
not equal; otherwise returns \c false.
*/
@@ -2407,6 +2464,8 @@ QXmlStreamAttribute::QXmlStreamAttribute(const QString &qualifiedName, const QSt
\ingroup xml-tools
+ \compares equality
+
An notation declaration consists of a name(), a systemId(), and a publicId().
*/
@@ -2430,14 +2489,14 @@ Returns the system identifier.
Returns the public identifier.
*/
-/*! \fn inline bool QXmlStreamNotationDeclaration::operator==(const QXmlStreamNotationDeclaration &other) const
+/*! \fn inline bool QXmlStreamNotationDeclaration::operator==(const QXmlStreamNotationDeclaration &lhs, const QXmlStreamNotationDeclaration &rhs)
- Compares this notation declaration with \a other and returns \c true
+ Compares \a lhs notation declaration with \a rhs and returns \c true
if they are equal; otherwise returns \c false.
*/
-/*! \fn inline bool QXmlStreamNotationDeclaration::operator!=(const QXmlStreamNotationDeclaration &other) const
+/*! \fn inline bool QXmlStreamNotationDeclaration::operator!=(const QXmlStreamNotationDeclaration &lhs, const QXmlStreamNotationDeclaration &rhs)
- Compares this notation declaration with \a other and returns \c true
+ Compares \a lhs notation declaration with \a rhs and returns \c true
if they are not equal; otherwise returns \c false.
*/
@@ -2457,16 +2516,18 @@ Returns the public identifier.
\ingroup xml-tools
+ \compares equality
+
An namespace declaration consists of a prefix() and a namespaceUri().
*/
-/*! \fn inline bool QXmlStreamNamespaceDeclaration::operator==(const QXmlStreamNamespaceDeclaration &other) const
+/*! \fn inline bool QXmlStreamNamespaceDeclaration::operator==(const QXmlStreamNamespaceDeclaration &lhs, const QXmlStreamNamespaceDeclaration &rhs)
- Compares this namespace declaration with \a other and returns \c true
+ Compares \a lhs namespace declaration with \a rhs and returns \c true
if they are equal; otherwise returns \c false.
*/
-/*! \fn inline bool QXmlStreamNamespaceDeclaration::operator!=(const QXmlStreamNamespaceDeclaration &other) const
+/*! \fn inline bool QXmlStreamNamespaceDeclaration::operator!=(const QXmlStreamNamespaceDeclaration &lhs, const QXmlStreamNamespaceDeclaration &rhs)
- Compares this namespace declaration with \a other and returns \c true
+ Compares \a lhs namespace declaration with \a rhs and returns \c true
if they are not equal; otherwise returns \c false.
*/
@@ -2523,6 +2584,7 @@ Returns the namespaceUri.
\ingroup xml-tools
+ \compares equality
An entity declaration consists of a name(), a notationName(), a
systemId(), a publicId(), and a value().
*/
@@ -2555,50 +2617,25 @@ Returns the public identifier.
Returns the entity's value.
*/
-/*! \fn bool QXmlStreamEntityDeclaration::operator==(const QXmlStreamEntityDeclaration &other) const
+/*! \fn bool QXmlStreamEntityDeclaration::operator==(const QXmlStreamEntityDeclaration &lhs, const QXmlStreamEntityDeclaration &rhs)
- Compares this entity declaration with \a other and returns \c true if
+ Compares \a lhs entity declaration with \a rhs and returns \c true if
they are equal; otherwise returns \c false.
*/
-/*! \fn bool QXmlStreamEntityDeclaration::operator!=(const QXmlStreamEntityDeclaration &other) const
+/*! \fn bool QXmlStreamEntityDeclaration::operator!=(const QXmlStreamEntityDeclaration &lhs, const QXmlStreamEntityDeclaration &rhs)
- Compares this entity declaration with \a other and returns \c true if
+ Compares \a lhs entity declaration with \a rhs and returns \c true if
they are not equal; otherwise returns \c false.
*/
/*! Returns the value of the attribute \a name in the namespace
described with \a namespaceUri, or an empty string reference if the
attribute is not defined. The \a namespaceUri can be empty.
- */
-QStringView QXmlStreamAttributes::value(const QString &namespaceUri, const QString &name) const
-{
- for (const QXmlStreamAttribute &attribute : *this) {
- if (attribute.name() == name && attribute.namespaceUri() == namespaceUri)
- return attribute.value();
- }
- return QStringView();
-}
-
-/*!\overload
- Returns the value of the attribute \a name in the namespace
- described with \a namespaceUri, or an empty string reference if the
- attribute is not defined. The \a namespaceUri can be empty.
- */
-QStringView QXmlStreamAttributes::value(const QString &namespaceUri, QLatin1String name) const
-{
- for (const QXmlStreamAttribute &attribute : *this) {
- if (attribute.name() == name && attribute.namespaceUri() == namespaceUri)
- return attribute.value();
- }
- return QStringView();
-}
-/*!\overload
- Returns the value of the attribute \a name in the namespace
- described with \a namespaceUri, or an empty string reference if the
- attribute is not defined. The \a namespaceUri can be empty.
+ \note In Qt versions prior to 6.6, this function was implemented as an
+ overload set accepting combinations of QString and QLatin1StringView only.
*/
-QStringView QXmlStreamAttributes::value(QLatin1String namespaceUri, QLatin1String name) const
+QStringView QXmlStreamAttributes::value(QAnyStringView namespaceUri, QAnyStringView name) const noexcept
{
for (const QXmlStreamAttribute &attribute : *this) {
if (attribute.name() == name && attribute.namespaceUri() == namespaceUri)
@@ -2618,29 +2655,12 @@ QStringView QXmlStreamAttributes::value(QLatin1String namespaceUri, QLatin1Strin
different prefixes can point to the same namespace), you shouldn't
use qualified names, but a resolved namespaceUri and the attribute's
local name.
- */
-QStringView QXmlStreamAttributes::value(const QString &qualifiedName) const
-{
- for (const QXmlStreamAttribute &attribute : *this) {
- if (attribute.qualifiedName() == qualifiedName)
- return attribute.value();
- }
- return QStringView();
-}
-/*!\overload
+ \note In Qt versions prior to 6.6, this function was implemented as an
+ overload set accepting QString and QLatin1StringView only.
- Returns the value of the attribute with qualified name \a
- qualifiedName , or an empty string reference if the attribute is not
- defined. A qualified name is the raw name of an attribute in the XML
- data. It consists of the namespace prefix, followed by colon,
- followed by the attribute's local name. Since the namespace prefix
- is not unique (the same prefix can point to different namespaces and
- different prefixes can point to the same namespace), you shouldn't
- use qualified names, but a resolved namespaceUri and the attribute's
- local name.
*/
-QStringView QXmlStreamAttributes::value(QLatin1String qualifiedName) const
+QStringView QXmlStreamAttributes::value(QAnyStringView qualifiedName) const noexcept
{
for (const QXmlStreamAttribute &attribute : *this) {
if (attribute.qualifiedName() == qualifiedName)
@@ -2667,7 +2687,7 @@ void QXmlStreamAttributes::append(const QString &qualifiedName, const QString &v
append(QXmlStreamAttribute(qualifiedName, value));
}
-#ifndef QT_NO_XMLSTREAMREADER
+#if QT_CONFIG(xmlstreamreader)
/*! \fn bool QXmlStreamReader::isStartDocument() const
Returns \c true if tokenType() equals \l StartDocument; otherwise returns \c false.
@@ -2728,6 +2748,8 @@ bool QXmlStreamReader::isCDATA() const
XML declaration; otherwise returns \c false.
If no XML declaration has been parsed, this function returns \c false.
+
+ \sa hasStandaloneDeclaration()
*/
bool QXmlStreamReader::isStandaloneDocument() const
{
@@ -2735,6 +2757,21 @@ bool QXmlStreamReader::isStandaloneDocument() const
return d->standalone;
}
+/*!
+ \since 6.6
+
+ Returns \c true if this document has an explicit standalone
+ declaration (can be 'yes' or 'no'); otherwise returns \c false;
+
+ If no XML declaration has been parsed, this function returns \c false.
+
+ \sa isStandaloneDocument()
+ */
+bool QXmlStreamReader::hasStandaloneDeclaration() const
+{
+ Q_D(const QXmlStreamReader);
+ return d->hasStandalone;
+}
/*!
\since 4.4
@@ -2766,7 +2803,7 @@ QStringView QXmlStreamReader::documentEncoding() const
return QStringView();
}
-#endif // QT_NO_XMLSTREAMREADER
+#endif // feature xmlstreamreader
/*!
\class QXmlStreamWriter
@@ -2778,6 +2815,7 @@ QStringView QXmlStreamReader::documentEncoding() const
simple streaming API.
\ingroup xml-tools
+ \ingroup qtserialization
QXmlStreamWriter is the counterpart to QXmlStreamReader for writing
XML. Like its related class, it operates on a QIODevice specified
@@ -2842,25 +2880,29 @@ QStringView QXmlStreamReader::documentEncoding() const
*/
-#ifndef QT_NO_XMLSTREAMWRITER
+#if QT_CONFIG(xmlstreamwriter)
-class QXmlStreamWriterPrivate : public QXmlStreamPrivateTagStack {
+class QXmlStreamWriterPrivate : public QXmlStreamPrivateTagStack
+{
QXmlStreamWriter *q_ptr;
Q_DECLARE_PUBLIC(QXmlStreamWriter)
public:
+ enum class StartElementOption {
+ KeepEverything = 0, // write out every attribute, namespace, &c.
+ OmitNamespaceDeclarations = 1,
+ };
+
QXmlStreamWriterPrivate(QXmlStreamWriter *q);
~QXmlStreamWriterPrivate() {
if (deleteDevice)
delete device;
}
- void write(const XmlStringRef &);
- void write(const QString &);
- void writeEscaped(const QString &, bool escapeWhitespace = false);
- void write(const char *s, int len);
- template <int N> void write(const char (&s)[N]) { write(s, N - 1); }
+ void write(QAnyStringView s);
+ void writeEscaped(QAnyStringView, bool escapeWhitespace = false);
bool finishStartElement(bool contents = true);
- void writeStartElement(const QString &namespaceUri, const QString &name);
+ void writeStartElement(QAnyStringView namespaceUri, QAnyStringView name,
+ StartElementOption option = StartElementOption::KeepEverything);
QIODevice *device;
QString *stringDevice;
uint deleteDevice :1;
@@ -2871,23 +2913,26 @@ public:
uint hasIoError :1;
uint hasEncodingError :1;
uint autoFormatting :1;
- QByteArray autoFormattingIndent;
+ std::string autoFormattingIndent;
NamespaceDeclaration emptyNamespace;
qsizetype lastNamespaceDeclaration;
- QStringEncoder toUtf8;
- NamespaceDeclaration &findNamespace(const QString &namespaceUri, bool writeDeclaration = false, bool noDefault = false);
+ NamespaceDeclaration &addExtraNamespace(QAnyStringView namespaceUri, QAnyStringView prefix);
+ NamespaceDeclaration &findNamespace(QAnyStringView namespaceUri, bool writeDeclaration = false, bool noDefault = false);
void writeNamespaceDeclaration(const NamespaceDeclaration &namespaceDeclaration);
int namespacePrefixCount;
void indent(int level);
+private:
+ void doWriteToDevice(QStringView s);
+ void doWriteToDevice(QUtf8StringView s);
+ void doWriteToDevice(QLatin1StringView s);
};
QXmlStreamWriterPrivate::QXmlStreamWriterPrivate(QXmlStreamWriter *q)
- : autoFormattingIndent(4, ' '),
- toUtf8(QStringEncoder::Utf8, QStringEncoder::Flag::Stateless)
+ : autoFormattingIndent(4, ' ')
{
q_ptr = q;
device = nullptr;
@@ -2903,108 +2948,109 @@ QXmlStreamWriterPrivate::QXmlStreamWriterPrivate(QXmlStreamWriter *q)
namespacePrefixCount = 0;
}
-void QXmlStreamWriterPrivate::write(const XmlStringRef &s)
+void QXmlStreamWriterPrivate::write(QAnyStringView s)
{
if (device) {
if (hasIoError)
return;
- QByteArray bytes = toUtf8(s);
- if (toUtf8.hasError()) {
- hasEncodingError = true;
- return;
- }
- if (device->write(bytes) != bytes.size())
- hasIoError = true;
- }
- else if (stringDevice)
- stringDevice->append(s);
- else
+
+ s.visit([&] (auto s) { doWriteToDevice(s); });
+ } else if (stringDevice) {
+ s.visit([&] (auto s) { stringDevice->append(s); });
+ } else {
qWarning("QXmlStreamWriter: No device");
+ }
}
-void QXmlStreamWriterPrivate::write(const QString &s)
+void QXmlStreamWriterPrivate::writeEscaped(QAnyStringView s, bool escapeWhitespace)
{
- if (device) {
- if (hasIoError)
- return;
- QByteArray bytes = toUtf8(s);
- if (toUtf8.hasError()) {
- hasEncodingError = true;
- return;
+ struct NextLatin1 {
+ char32_t operator()(const char *&it, const char *) const
+ { return uchar(*it++); }
+ };
+ struct NextUtf8 {
+ char32_t operator()(const char *&it, const char *end) const
+ {
+ uchar uc = *it++;
+ char32_t utf32 = 0;
+ char32_t *output = &utf32;
+ qsizetype n = QUtf8Functions::fromUtf8<QUtf8BaseTraits>(uc, output, it, end);
+ return n < 0 ? 0 : utf32;
}
- if (device->write(bytes) != bytes.size())
- hasIoError = true;
- }
- else if (stringDevice)
- stringDevice->append(s);
- else
- qWarning("QXmlStreamWriter: No device");
-}
+ };
+ struct NextUtf16 {
+ char32_t operator()(const QChar *&it, const QChar *end) const
+ {
+ QStringIterator decoder(it, end);
+ char32_t result = decoder.next(u'\0');
+ it = decoder.position();
+ return result;
+ }
+ };
-void QXmlStreamWriterPrivate::writeEscaped(const QString &s, bool escapeWhitespace)
-{
QString escaped;
escaped.reserve(s.size());
- for ( int i = 0; i < s.size(); ++i ) {
- QChar c = s.at(i);
- switch (c.unicode()) {
- case '<':
- escaped.append(QLatin1String("&lt;"));
- break;
- case '>':
- escaped.append(QLatin1String("&gt;"));
- break;
- case '&':
- escaped.append(QLatin1String("&amp;"));
- break;
- case '\"':
- escaped.append(QLatin1String("&quot;"));
- break;
- case '\t':
- if (escapeWhitespace)
- escaped.append(QLatin1String("&#9;"));
- else
- escaped += c;
- break;
- case '\n':
- if (escapeWhitespace)
- escaped.append(QLatin1String("&#10;"));
- else
- escaped += c;
- break;
- case '\v':
- case '\f':
- hasEncodingError = true;
- break;
- case '\r':
- if (escapeWhitespace)
- escaped.append(QLatin1String("&#13;"));
- else
- escaped += c;
- break;
- default:
- if (c.unicode() > 0x1f && c.unicode() < 0xfffe)
- escaped += c;
- else
- hasEncodingError = true;
- break;
- }
- }
- write(escaped);
-}
+ s.visit([&] (auto s) {
+ using View = decltype(s);
+ using Decoder = std::conditional_t<std::is_same_v<View, QLatin1StringView>, NextLatin1,
+ std::conditional_t<std::is_same_v<View, QUtf8StringView>, NextUtf8, NextUtf16>>;
+
+ auto it = s.begin();
+ const auto end = s.end();
+ Decoder decoder;
+
+ while (it != end) {
+ QLatin1StringView replacement;
+ auto mark = it;
+
+ while (it != end) {
+ auto next_it = it;
+ char32_t uc = decoder(next_it, end);
+ if (uc == u'<') {
+ replacement = "&lt;"_L1;
+ break;
+ } else if (uc == u'>') {
+ replacement = "&gt;"_L1;
+ break;
+ } else if (uc == u'&') {
+ replacement = "&amp;"_L1;
+ break;
+ } else if (uc == u'\"') {
+ replacement = "&quot;"_L1;
+ break;
+ } else if (uc == u'\t') {
+ if (escapeWhitespace) {
+ replacement = "&#9;"_L1;
+ break;
+ }
+ } else if (uc == u'\n') {
+ if (escapeWhitespace) {
+ replacement = "&#10;"_L1;
+ break;
+ }
+ } else if (uc == u'\v' || uc == u'\f') {
+ hasEncodingError = true;
+ break;
+ } else if (uc == u'\r') {
+ if (escapeWhitespace) {
+ replacement = "&#13;"_L1;
+ break;
+ }
+ } else if (uc <= u'\x1F' || uc == u'\uFFFE' || uc == u'\uFFFF') {
+ hasEncodingError = true;
+ break;
+ }
+ it = next_it;
+ }
-// Writes utf8
-void QXmlStreamWriterPrivate::write(const char *s, int len)
-{
- if (device) {
- if (hasIoError)
- return;
- if (device->write(s, len) != len)
- hasIoError = true;
- return;
- }
+ escaped.append(View{mark, it});
+ escaped.append(replacement);
+ if (it != end)
+ ++it;
+ }
+ } );
- write(QString::fromUtf8(s, len));
+ write(escaped);
}
void QXmlStreamWriterPrivate::writeNamespaceDeclaration(const NamespaceDeclaration &namespaceDeclaration) {
@@ -3041,7 +3087,33 @@ bool QXmlStreamWriterPrivate::finishStartElement(bool contents)
return hadSomethingWritten;
}
-QXmlStreamPrivateTagStack::NamespaceDeclaration &QXmlStreamWriterPrivate::findNamespace(const QString &namespaceUri, bool writeDeclaration, bool noDefault)
+QXmlStreamPrivateTagStack::NamespaceDeclaration &
+QXmlStreamWriterPrivate::addExtraNamespace(QAnyStringView namespaceUri, QAnyStringView prefix)
+{
+ const bool prefixIsXml = prefix == "xml"_L1;
+ const bool namespaceUriIsXml = namespaceUri == "http://www.w3.org/XML/1998/namespace"_L1;
+ if (prefixIsXml && !namespaceUriIsXml) {
+ qWarning("Reserved prefix 'xml' must not be bound to a different namespace name "
+ "than 'http://www.w3.org/XML/1998/namespace'");
+ } else if (!prefixIsXml && namespaceUriIsXml) {
+ const QString prefixString = prefix.toString();
+ qWarning("The prefix '%ls' must not be bound to namespace name "
+ "'http://www.w3.org/XML/1998/namespace' which 'xml' is already bound to",
+ qUtf16Printable(prefixString));
+ }
+ if (namespaceUri == "http://www.w3.org/2000/xmlns/"_L1) {
+ const QString prefixString = prefix.toString();
+ qWarning("The prefix '%ls' must not be bound to namespace name "
+ "'http://www.w3.org/2000/xmlns/'",
+ qUtf16Printable(prefixString));
+ }
+ auto &namespaceDeclaration = namespaceDeclarations.push();
+ namespaceDeclaration.prefix = addToStringStorage(prefix);
+ namespaceDeclaration.namespaceUri = addToStringStorage(namespaceUri);
+ return namespaceDeclaration;
+}
+
+QXmlStreamPrivateTagStack::NamespaceDeclaration &QXmlStreamWriterPrivate::findNamespace(QAnyStringView namespaceUri, bool writeDeclaration, bool noDefault)
{
for (NamespaceDeclaration &namespaceDeclaration : reversed(namespaceDeclarations)) {
if (namespaceDeclaration.namespaceUri == namespaceUri) {
@@ -3058,7 +3130,7 @@ QXmlStreamPrivateTagStack::NamespaceDeclaration &QXmlStreamWriterPrivate::findNa
QString s;
int n = ++namespacePrefixCount;
forever {
- s = QLatin1Char('n') + QString::number(n++);
+ s = u'n' + QString::number(n++);
qsizetype j = namespaceDeclarations.size() - 2;
while (j >= 0 && namespaceDeclarations.at(j).prefix != s)
--j;
@@ -3078,10 +3150,43 @@ QXmlStreamPrivateTagStack::NamespaceDeclaration &QXmlStreamWriterPrivate::findNa
void QXmlStreamWriterPrivate::indent(int level)
{
write("\n");
- for (int i = level; i > 0; --i)
- write(autoFormattingIndent.constData(), autoFormattingIndent.length());
+ for (int i = 0; i < level; ++i)
+ write(autoFormattingIndent);
+}
+
+void QXmlStreamWriterPrivate::doWriteToDevice(QStringView s)
+{
+ constexpr qsizetype MaxChunkSize = 512;
+ char buffer [3 * MaxChunkSize];
+ QStringEncoder::State state;
+ while (!s.isEmpty()) {
+ const qsizetype chunkSize = std::min(s.size(), MaxChunkSize);
+ char *end = QUtf8::convertFromUnicode(buffer, s.first(chunkSize), &state);
+ doWriteToDevice(QUtf8StringView{buffer, end});
+ s = s.sliced(chunkSize);
+ }
+ if (state.remainingChars > 0)
+ hasEncodingError = true;
}
+void QXmlStreamWriterPrivate::doWriteToDevice(QUtf8StringView s)
+{
+ QByteArrayView bytes = s;
+ if (device->write(bytes.data(), bytes.size()) != bytes.size())
+ hasIoError = true;
+}
+
+void QXmlStreamWriterPrivate::doWriteToDevice(QLatin1StringView s)
+{
+ constexpr qsizetype MaxChunkSize = 512;
+ char buffer [2 * MaxChunkSize];
+ while (!s.isEmpty()) {
+ const qsizetype chunkSize = std::min(s.size(), MaxChunkSize);
+ char *end = QUtf8::convertFromLatin1(buffer, s.first(chunkSize));
+ doWriteToDevice(QUtf8StringView{buffer, end});
+ s = s.sliced(chunkSize);
+ }
+}
/*!
Constructs a stream writer.
@@ -3224,13 +3329,14 @@ bool QXmlStreamWriter::autoFormatting() const
void QXmlStreamWriter::setAutoFormattingIndent(int spacesOrTabs)
{
Q_D(QXmlStreamWriter);
- d->autoFormattingIndent = QByteArray(qAbs(spacesOrTabs), spacesOrTabs >= 0 ? ' ' : '\t');
+ d->autoFormattingIndent.assign(size_t(qAbs(spacesOrTabs)), spacesOrTabs >= 0 ? ' ' : '\t');
}
int QXmlStreamWriter::autoFormattingIndent() const
{
Q_D(const QXmlStreamWriter);
- return d->autoFormattingIndent.count(' ') - d->autoFormattingIndent.count('\t');
+ const QLatin1StringView indent(d->autoFormattingIndent);
+ return indent.count(u' ') - indent.count(u'\t');
}
/*!
@@ -3255,12 +3361,15 @@ bool QXmlStreamWriter::hasError() const
This function can only be called after writeStartElement() before
any content is written, or after writeEmptyElement().
+
+ \note In Qt versions prior to 6.5, this function took QString, not
+ QAnyStringView.
*/
-void QXmlStreamWriter::writeAttribute(const QString &qualifiedName, const QString &value)
+void QXmlStreamWriter::writeAttribute(QAnyStringView qualifiedName, QAnyStringView value)
{
Q_D(QXmlStreamWriter);
Q_ASSERT(d->inStartElement);
- Q_ASSERT(qualifiedName.count(QLatin1Char(':')) <= 1);
+ Q_ASSERT(count(qualifiedName, ':') <= 1);
d->write(" ");
d->write(qualifiedName);
d->write("=\"");
@@ -3275,12 +3384,15 @@ void QXmlStreamWriter::writeAttribute(const QString &qualifiedName, const QStrin
This function can only be called after writeStartElement() before
any content is written, or after writeEmptyElement().
+
+ \note In Qt versions prior to 6.5, this function took QString, not
+ QAnyStringView.
*/
-void QXmlStreamWriter::writeAttribute(const QString &namespaceUri, const QString &name, const QString &value)
+void QXmlStreamWriter::writeAttribute(QAnyStringView namespaceUri, QAnyStringView name, QAnyStringView value)
{
Q_D(QXmlStreamWriter);
Q_ASSERT(d->inStartElement);
- Q_ASSERT(!name.contains(QLatin1Char(':')));
+ Q_ASSERT(!contains(name, ':'));
QXmlStreamWriterPrivate::NamespaceDeclaration &namespaceDeclaration = d->findNamespace(namespaceUri, true, true);
d->write(" ");
if (!namespaceDeclaration.prefix.isEmpty()) {
@@ -3304,12 +3416,9 @@ void QXmlStreamWriter::writeAttribute(const QString &namespaceUri, const QString
void QXmlStreamWriter::writeAttribute(const QXmlStreamAttribute& attribute)
{
if (attribute.namespaceUri().isEmpty())
- writeAttribute(attribute.qualifiedName().toString(),
- attribute.value().toString());
+ writeAttribute(attribute.qualifiedName(), attribute.value());
else
- writeAttribute(attribute.namespaceUri().toString(),
- attribute.name().toString(),
- attribute.value().toString());
+ writeAttribute(attribute.namespaceUri(), attribute.name(), attribute.value());
}
@@ -3339,15 +3448,26 @@ void QXmlStreamWriter::writeAttributes(const QXmlStreamAttributes& attributes)
This function mainly exists for completeness. Normally you should
not need use it, because writeCharacters() automatically escapes all
non-content characters.
+
+ \note In Qt versions prior to 6.5, this function took QString, not
+ QAnyStringView.
*/
-void QXmlStreamWriter::writeCDATA(const QString &text)
+void QXmlStreamWriter::writeCDATA(QAnyStringView text)
{
Q_D(QXmlStreamWriter);
d->finishStartElement();
- QString copy(text);
- copy.replace(QLatin1String("]]>"), QLatin1String("]]]]><![CDATA[>"));
d->write("<![CDATA[");
- d->write(copy);
+ while (!text.isEmpty()) {
+ const auto idx = indexOf(text, "]]>"_L1);
+ if (idx < 0)
+ break; // no forbidden sequence found
+ d->write(text.first(idx));
+ d->write("]]" // text[idx, idx + 2)
+ "]]><![CDATA[" // escape sequence to separate ]] and >
+ ">"); // text[idx + 2, idx + 3)
+ text = text.sliced(idx + 3); // skip over "]]>"
+ }
+ d->write(text); // write remainder
d->write("]]>");
}
@@ -3357,8 +3477,11 @@ void QXmlStreamWriter::writeCDATA(const QString &text)
"]]>", ">" is also escaped as "&gt;".
\sa writeEntityReference()
+
+ \note In Qt versions prior to 6.5, this function took QString, not
+ QAnyStringView.
*/
-void QXmlStreamWriter::writeCharacters(const QString &text)
+void QXmlStreamWriter::writeCharacters(QAnyStringView text)
{
Q_D(QXmlStreamWriter);
d->finishStartElement();
@@ -3367,13 +3490,16 @@ void QXmlStreamWriter::writeCharacters(const QString &text)
/*! Writes \a text as XML comment, where \a text must not contain the
- forbidden sequence "--" or end with "-". Note that XML does not
- provide any way to escape "-" in a comment.
+ forbidden sequence \c{--} or end with \c{-}. Note that XML does not
+ provide any way to escape \c{-} in a comment.
+
+ \note In Qt versions prior to 6.5, this function took QString, not
+ QAnyStringView.
*/
-void QXmlStreamWriter::writeComment(const QString &text)
+void QXmlStreamWriter::writeComment(QAnyStringView text)
{
Q_D(QXmlStreamWriter);
- Q_ASSERT(!text.contains(QLatin1String("--")) && !text.endsWith(QLatin1Char('-')));
+ Q_ASSERT(!contains(text, "--"_L1) && !endsWith(text, '-'));
if (!d->finishStartElement(false) && d->autoFormatting)
d->indent(d->tagStack.size());
d->write("<!--");
@@ -3385,8 +3511,11 @@ void QXmlStreamWriter::writeComment(const QString &text)
/*! Writes a DTD section. The \a dtd represents the entire
doctypedecl production from the XML 1.0 specification.
+
+ \note In Qt versions prior to 6.5, this function took QString, not
+ QAnyStringView.
*/
-void QXmlStreamWriter::writeDTD(const QString &dtd)
+void QXmlStreamWriter::writeDTD(QAnyStringView dtd)
{
Q_D(QXmlStreamWriter);
d->finishStartElement();
@@ -3402,12 +3531,15 @@ void QXmlStreamWriter::writeDTD(const QString &dtd)
/*! \overload
Writes an empty element with qualified name \a qualifiedName.
Subsequent calls to writeAttribute() will add attributes to this element.
+
+ \note In Qt versions prior to 6.5, this function took QString, not
+ QAnyStringView.
*/
-void QXmlStreamWriter::writeEmptyElement(const QString &qualifiedName)
+void QXmlStreamWriter::writeEmptyElement(QAnyStringView qualifiedName)
{
Q_D(QXmlStreamWriter);
- Q_ASSERT(qualifiedName.count(QLatin1Char(':')) <= 1);
- d->writeStartElement(QString(), qualifiedName);
+ Q_ASSERT(count(qualifiedName, ':') <= 1);
+ d->writeStartElement({}, qualifiedName);
d->inEmptyElement = true;
}
@@ -3418,11 +3550,14 @@ void QXmlStreamWriter::writeEmptyElement(const QString &qualifiedName)
Subsequent calls to writeAttribute() will add attributes to this element.
\sa writeNamespace()
+
+ \note In Qt versions prior to 6.5, this function took QString, not
+ QAnyStringView.
*/
-void QXmlStreamWriter::writeEmptyElement(const QString &namespaceUri, const QString &name)
+void QXmlStreamWriter::writeEmptyElement(QAnyStringView namespaceUri, QAnyStringView name)
{
Q_D(QXmlStreamWriter);
- Q_ASSERT(!name.contains(QLatin1Char(':')));
+ Q_ASSERT(!contains(name, ':'));
d->writeStartElement(namespaceUri, name);
d->inEmptyElement = true;
}
@@ -3435,8 +3570,10 @@ void QXmlStreamWriter::writeEmptyElement(const QString &namespaceUri, const QStr
This is a convenience function equivalent to:
\snippet code/src_corelib_xml_qxmlstream.cpp 1
+ \note In Qt versions prior to 6.5, this function took QString, not
+ QAnyStringView.
*/
-void QXmlStreamWriter::writeTextElement(const QString &qualifiedName, const QString &text)
+void QXmlStreamWriter::writeTextElement(QAnyStringView qualifiedName, QAnyStringView text)
{
writeStartElement(qualifiedName);
writeCharacters(text);
@@ -3452,8 +3589,10 @@ void QXmlStreamWriter::writeTextElement(const QString &qualifiedName, const QStr
This is a convenience function equivalent to:
\snippet code/src_corelib_xml_qxmlstream.cpp 2
+ \note In Qt versions prior to 6.5, this function took QString, not
+ QAnyStringView.
*/
-void QXmlStreamWriter::writeTextElement(const QString &namespaceUri, const QString &name, const QString &text)
+void QXmlStreamWriter::writeTextElement(QAnyStringView namespaceUri, QAnyStringView name, QAnyStringView text)
{
writeStartElement(namespaceUri, name);
writeCharacters(text);
@@ -3514,8 +3653,11 @@ void QXmlStreamWriter::writeEndElement()
/*!
Writes the entity reference \a name to the stream, as "&\a{name};".
+
+ \note In Qt versions prior to 6.5, this function took QString, not
+ QAnyStringView.
*/
-void QXmlStreamWriter::writeEntityReference(const QString &name)
+void QXmlStreamWriter::writeEntityReference(QAnyStringView name)
{
Q_D(QXmlStreamWriter);
d->finishStartElement();
@@ -3539,19 +3681,17 @@ void QXmlStreamWriter::writeEntityReference(const QString &name)
\e http://www.w3.org/2000/xmlns/ are used for the namespace mechanism
itself and thus completely forbidden in declarations.
+ \note In Qt versions prior to 6.5, this function took QString, not
+ QAnyStringView.
*/
-void QXmlStreamWriter::writeNamespace(const QString &namespaceUri, const QString &prefix)
+void QXmlStreamWriter::writeNamespace(QAnyStringView namespaceUri, QAnyStringView prefix)
{
Q_D(QXmlStreamWriter);
- Q_ASSERT(prefix != QLatin1String("xmlns"));
+ Q_ASSERT(prefix != "xmlns"_L1);
if (prefix.isEmpty()) {
d->findNamespace(namespaceUri, d->inStartElement);
} else {
- Q_ASSERT(!((prefix == QLatin1String("xml")) ^ (namespaceUri == QLatin1String("http://www.w3.org/XML/1998/namespace"))));
- Q_ASSERT(namespaceUri != QLatin1String("http://www.w3.org/2000/xmlns/"));
- QXmlStreamWriterPrivate::NamespaceDeclaration &namespaceDeclaration = d->namespaceDeclarations.push();
- namespaceDeclaration.prefix = d->addToStringStorage(prefix);
- namespaceDeclaration.namespaceUri = d->addToStringStorage(namespaceUri);
+ auto &namespaceDeclaration = d->addExtraNamespace(namespaceUri, prefix);
if (d->inStartElement)
d->writeNamespaceDeclaration(namespaceDeclaration);
}
@@ -3567,12 +3707,15 @@ void QXmlStreamWriter::writeNamespace(const QString &namespaceUri, const QString
Note that the namespaces \e http://www.w3.org/XML/1998/namespace
(bound to \e xmlns) and \e http://www.w3.org/2000/xmlns/ (bound to
\e xml) by definition cannot be declared as default.
+
+ \note In Qt versions prior to 6.5, this function took QString, not
+ QAnyStringView.
*/
-void QXmlStreamWriter::writeDefaultNamespace(const QString &namespaceUri)
+void QXmlStreamWriter::writeDefaultNamespace(QAnyStringView namespaceUri)
{
Q_D(QXmlStreamWriter);
- Q_ASSERT(namespaceUri != QLatin1String("http://www.w3.org/XML/1998/namespace"));
- Q_ASSERT(namespaceUri != QLatin1String("http://www.w3.org/2000/xmlns/"));
+ Q_ASSERT(namespaceUri != "http://www.w3.org/XML/1998/namespace"_L1);
+ Q_ASSERT(namespaceUri != "http://www.w3.org/2000/xmlns/"_L1);
QXmlStreamWriterPrivate::NamespaceDeclaration &namespaceDeclaration = d->namespaceDeclarations.push();
namespaceDeclaration.prefix.clear();
namespaceDeclaration.namespaceUri = d->addToStringStorage(namespaceUri);
@@ -3584,11 +3727,14 @@ void QXmlStreamWriter::writeDefaultNamespace(const QString &namespaceUri)
/*!
Writes an XML processing instruction with \a target and \a data,
where \a data must not contain the sequence "?>".
+
+ \note In Qt versions prior to 6.5, this function took QString, not
+ QAnyStringView.
*/
-void QXmlStreamWriter::writeProcessingInstruction(const QString &target, const QString &data)
+void QXmlStreamWriter::writeProcessingInstruction(QAnyStringView target, QAnyStringView data)
{
Q_D(QXmlStreamWriter);
- Q_ASSERT(!data.contains(QLatin1String("?>")));
+ Q_ASSERT(!contains(data, "?>"_L1));
if (!d->finishStartElement(false) && d->autoFormatting)
d->indent(d->tagStack.size());
d->write("<?");
@@ -3611,7 +3757,7 @@ void QXmlStreamWriter::writeProcessingInstruction(const QString &target, const Q
*/
void QXmlStreamWriter::writeStartDocument()
{
- writeStartDocument(QLatin1String("1.0"));
+ writeStartDocument("1.0"_L1);
}
@@ -3619,8 +3765,11 @@ void QXmlStreamWriter::writeStartDocument()
Writes a document start with the XML version number \a version.
\sa writeEndDocument()
+
+ \note In Qt versions prior to 6.5, this function took QString, not
+ QAnyStringView.
*/
-void QXmlStreamWriter::writeStartDocument(const QString &version)
+void QXmlStreamWriter::writeStartDocument(QAnyStringView version)
{
Q_D(QXmlStreamWriter);
d->finishStartElement(false);
@@ -3636,8 +3785,11 @@ void QXmlStreamWriter::writeStartDocument(const QString &version)
\sa writeEndDocument()
\since 4.5
+
+ \note In Qt versions prior to 6.5, this function took QString, not
+ QAnyStringView.
*/
-void QXmlStreamWriter::writeStartDocument(const QString &version, bool standalone)
+void QXmlStreamWriter::writeStartDocument(QAnyStringView version, bool standalone)
{
Q_D(QXmlStreamWriter);
d->finishStartElement(false);
@@ -3658,12 +3810,15 @@ void QXmlStreamWriter::writeStartDocument(const QString &version, bool standalon
writeAttribute() will add attributes to this element.
\sa writeEndElement(), writeEmptyElement()
+
+ \note In Qt versions prior to 6.5, this function took QString, not
+ QAnyStringView.
*/
-void QXmlStreamWriter::writeStartElement(const QString &qualifiedName)
+void QXmlStreamWriter::writeStartElement(QAnyStringView qualifiedName)
{
Q_D(QXmlStreamWriter);
- Q_ASSERT(qualifiedName.count(QLatin1Char(':')) <= 1);
- d->writeStartElement(QString(), qualifiedName);
+ Q_ASSERT(count(qualifiedName, ':') <= 1);
+ d->writeStartElement({}, qualifiedName);
}
@@ -3674,15 +3829,19 @@ void QXmlStreamWriter::writeStartElement(const QString &qualifiedName)
element.
\sa writeNamespace(), writeEndElement(), writeEmptyElement()
+
+ \note In Qt versions prior to 6.5, this function took QString, not
+ QAnyStringView.
*/
-void QXmlStreamWriter::writeStartElement(const QString &namespaceUri, const QString &name)
+void QXmlStreamWriter::writeStartElement(QAnyStringView namespaceUri, QAnyStringView name)
{
Q_D(QXmlStreamWriter);
- Q_ASSERT(!name.contains(QLatin1Char(':')));
+ Q_ASSERT(!contains(name, ':'));
d->writeStartElement(namespaceUri, name);
}
-void QXmlStreamWriterPrivate::writeStartElement(const QString &namespaceUri, const QString &name)
+void QXmlStreamWriterPrivate::writeStartElement(QAnyStringView namespaceUri, QAnyStringView name,
+ StartElementOption option)
{
if (!finishStartElement(false) && autoFormatting)
indent(tagStack.size());
@@ -3698,12 +3857,14 @@ void QXmlStreamWriterPrivate::writeStartElement(const QString &namespaceUri, con
write(tag.name);
inStartElement = lastWasStartElement = true;
- for (qsizetype i = lastNamespaceDeclaration; i < namespaceDeclarations.size(); ++i)
- writeNamespaceDeclaration(namespaceDeclarations[i]);
+ if (option != StartElementOption::OmitNamespaceDeclarations) {
+ for (qsizetype i = lastNamespaceDeclaration; i < namespaceDeclarations.size(); ++i)
+ writeNamespaceDeclaration(namespaceDeclarations[i]);
+ }
tag.namespaceDeclarationsSize = lastNamespaceDeclaration;
}
-#ifndef QT_NO_XMLSTREAMREADER
+#if QT_CONFIG(xmlstreamreader)
/*! Writes the current state of the \a reader. All possible valid
states are supported.
@@ -3713,6 +3874,7 @@ void QXmlStreamWriterPrivate::writeStartElement(const QString &namespaceUri, con
*/
void QXmlStreamWriter::writeCurrentToken(const QXmlStreamReader &reader)
{
+ Q_D(QXmlStreamWriter);
switch (reader.tokenType()) {
case QXmlStreamReader::NoToken:
break;
@@ -3723,13 +3885,19 @@ void QXmlStreamWriter::writeCurrentToken(const QXmlStreamReader &reader)
writeEndDocument();
break;
case QXmlStreamReader::StartElement: {
- writeStartElement(reader.namespaceUri().toString(), reader.name().toString());
- QXmlStreamNamespaceDeclarations namespaceDeclarations = reader.namespaceDeclarations();
- for (int i = 0; i < namespaceDeclarations.size(); ++i) {
- const QXmlStreamNamespaceDeclaration &namespaceDeclaration = namespaceDeclarations.at(i);
- writeNamespace(namespaceDeclaration.namespaceUri().toString(),
- namespaceDeclaration.prefix().toString());
+ // Namespaces must be added before writeStartElement is called so new prefixes are found
+ QList<QXmlStreamPrivateTagStack::NamespaceDeclaration> extraNamespaces;
+ for (const auto &namespaceDeclaration : reader.namespaceDeclarations()) {
+ auto &extraNamespace = d->addExtraNamespace(namespaceDeclaration.namespaceUri(),
+ namespaceDeclaration.prefix());
+ extraNamespaces.append(extraNamespace);
}
+ d->writeStartElement(
+ reader.namespaceUri(), reader.name(),
+ QXmlStreamWriterPrivate::StartElementOption::OmitNamespaceDeclarations);
+ // Namespace declarations are written afterwards
+ for (const auto &extraNamespace : std::as_const(extraNamespaces))
+ d->writeNamespaceDeclaration(extraNamespace);
writeAttributes(reader.attributes());
} break;
case QXmlStreamReader::EndElement:
@@ -3737,22 +3905,22 @@ void QXmlStreamWriter::writeCurrentToken(const QXmlStreamReader &reader)
break;
case QXmlStreamReader::Characters:
if (reader.isCDATA())
- writeCDATA(reader.text().toString());
+ writeCDATA(reader.text());
else
- writeCharacters(reader.text().toString());
+ writeCharacters(reader.text());
break;
case QXmlStreamReader::Comment:
- writeComment(reader.text().toString());
+ writeComment(reader.text());
break;
case QXmlStreamReader::DTD:
- writeDTD(reader.text().toString());
+ writeDTD(reader.text());
break;
case QXmlStreamReader::EntityReference:
- writeEntityReference(reader.name().toString());
+ writeEntityReference(reader.name());
break;
case QXmlStreamReader::ProcessingInstruction:
- writeProcessingInstruction(reader.processingInstructionTarget().toString(),
- reader.processingInstructionData().toString());
+ writeProcessingInstruction(reader.processingInstructionTarget(),
+ reader.processingInstructionData());
break;
default:
Q_ASSERT(reader.tokenType() != QXmlStreamReader::Invalid);
@@ -3761,9 +3929,99 @@ void QXmlStreamWriter::writeCurrentToken(const QXmlStreamReader &reader)
}
}
+static constexpr bool isTokenAllowedInContext(QXmlStreamReader::TokenType type,
+ QXmlStreamReaderPrivate::XmlContext ctxt)
+{
+ switch (type) {
+ case QXmlStreamReader::StartDocument:
+ case QXmlStreamReader::DTD:
+ return ctxt == QXmlStreamReaderPrivate::XmlContext::Prolog;
+
+ case QXmlStreamReader::StartElement:
+ case QXmlStreamReader::EndElement:
+ case QXmlStreamReader::Characters:
+ case QXmlStreamReader::EntityReference:
+ case QXmlStreamReader::EndDocument:
+ return ctxt == QXmlStreamReaderPrivate::XmlContext::Body;
+
+ case QXmlStreamReader::Comment:
+ case QXmlStreamReader::ProcessingInstruction:
+ return true;
+
+ case QXmlStreamReader::NoToken:
+ case QXmlStreamReader::Invalid:
+ return false;
+ }
+
+ // GCC 8.x does not treat __builtin_unreachable() as constexpr
+#if !defined(Q_CC_GNU_ONLY) || (Q_CC_GNU >= 900)
+ Q_UNREACHABLE_RETURN(false);
+#else
+ return false;
+#endif
+}
+
+/*!
+ \internal
+ \brief QXmlStreamReader::isValidToken
+ \return \c true if \param type is a valid token type.
+ \return \c false if \param type is an unexpected token,
+ which indicates a non-well-formed or invalid XML stream.
+ */
+bool QXmlStreamReaderPrivate::isValidToken(QXmlStreamReader::TokenType type)
+{
+ // Don't change currentContext, if Invalid or NoToken occur in the prolog
+ if (type == QXmlStreamReader::Invalid || type == QXmlStreamReader::NoToken)
+ return false;
+
+ // If a token type gets rejected in the body, there is no recovery
+ const bool result = isTokenAllowedInContext(type, currentContext);
+ if (result || currentContext == XmlContext::Body)
+ return result;
+
+ // First non-Prolog token observed => switch context to body and check again.
+ currentContext = XmlContext::Body;
+ return isTokenAllowedInContext(type, currentContext);
+}
+
/*!
- \fn bool QXmlStreamAttributes::hasAttribute(const QString &qualifiedName) const
- \since 4.5
+ \internal
+ Checks token type and raises an error, if it is invalid
+ in the current context (prolog/body).
+ */
+void QXmlStreamReaderPrivate::checkToken()
+{
+ Q_Q(QXmlStreamReader);
+
+ // The token type must be consumed, to keep track if the body has been reached.
+ const XmlContext context = currentContext;
+ const bool ok = isValidToken(type);
+
+ // Do nothing if an error has been raised already (going along with an unexpected token)
+ if (error != QXmlStreamReader::Error::NoError)
+ return;
+
+ if (!ok) {
+ raiseError(QXmlStreamReader::UnexpectedElementError,
+ QXmlStream::tr("Unexpected token type %1 in %2.")
+ .arg(q->tokenString(), contextString(context)));
+ return;
+ }
+
+ if (type != QXmlStreamReader::DTD)
+ return;
+
+ // Raise error on multiple DTD tokens
+ if (foundDTD) {
+ raiseError(QXmlStreamReader::UnexpectedElementError,
+ QXmlStream::tr("Found second DTD token in %1.").arg(contextString(context)));
+ } else {
+ foundDTD = true;
+ }
+}
+
+/*!
+ \fn bool QXmlStreamAttributes::hasAttribute(QAnyStringView qualifiedName) const
Returns \c true if this QXmlStreamAttributes has an attribute whose
qualified name is \a qualifiedName; otherwise returns \c false.
@@ -3777,25 +4035,18 @@ void QXmlStreamWriter::writeCurrentToken(const QXmlStreamReader &reader)
*/
/*!
- \fn bool QXmlStreamAttributes::hasAttribute(QLatin1String qualifiedName) const
- \overload
- \since 4.5
-*/
-
-/*!
- \fn bool QXmlStreamAttributes::hasAttribute(const QString &namespaceUri,
- const QString &name) const
+ \fn bool QXmlStreamAttributes::hasAttribute(QAnyStringView namespaceUri,
+ QAnyStringView name) const
\overload
- \since 4.5
Returns \c true if this QXmlStreamAttributes has an attribute whose
namespace URI and name correspond to \a namespaceUri and \a name;
otherwise returns \c false.
*/
-#endif // QT_NO_XMLSTREAMREADER
-#endif // QT_NO_XMLSTREAMWRITER
+#endif // feature xmlstreamreader
+#endif // feature xmlstreamwriter
QT_END_NAMESPACE
-#endif // QT_NO_XMLSTREAM
+#endif // feature xmlstream
diff --git a/src/corelib/serialization/qxmlstream.g b/src/corelib/serialization/qxmlstream.g
index 0051c6255b..860b7fd727 100644
--- a/src/corelib/serialization/qxmlstream.g
+++ b/src/corelib/serialization/qxmlstream.g
@@ -1,41 +1,5 @@
-----------------------------------------------------------------------------
---
-- Copyright (C) 2020 The Qt Company Ltd.
--- Contact: https://www.qt.io/licensing/
---
--- This file is part of the QtCore module of the Qt Toolkit.
---
--- $QT_BEGIN_LICENSE:LGPL$
--- Commercial License Usage
--- Licensees holding valid commercial Qt licenses may use this file in
--- accordance with the commercial license agreement provided with the
--- Software or, alternatively, in accordance with the terms contained in
--- a written agreement between you and The Qt Company. For licensing terms
--- and conditions see https://www.qt.io/terms-conditions. For further
--- information use the contact form at https://www.qt.io/contact-us.
---
--- GNU Lesser General Public License Usage
--- Alternatively, this file may be used under the terms of the GNU Lesser
--- General Public License version 3 as published by the Free Software
--- Foundation and appearing in the file LICENSE.LGPL3 included in the
--- packaging of this file. Please review the following information to
--- ensure the GNU Lesser General Public License version 3 requirements
--- will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
---
--- GNU General Public License Usage
--- Alternatively, this file may be used under the terms of the GNU
--- General Public License version 2.0 or (at your option) the GNU General
--- Public license version 3 or any later version approved by the KDE Free
--- Qt Foundation. The licenses are as published by the Free Software
--- Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
--- included in the packaging of this file. Please review the following
--- information to ensure the GNU General Public License requirements will
--- be met: https://www.gnu.org/licenses/gpl-2.0.html and
--- https://www.gnu.org/licenses/gpl-3.0.html.
---
--- $QT_END_LICENSE$
---
-----------------------------------------------------------------------------
+-- SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
%parser QXmlStreamGrammar
%impl qxmlstreamparser_p.h
@@ -88,13 +52,13 @@
%token IMPLIED "IMPLIED"
%token FIXED "FIXED"
--- conent spec
+-- content spec
%token EMPTY "EMPTY"
%token ANY "ANY"
%token PCDATA "PCDATA"
-- error
-%token ERROR
+%token XML_ERROR
-- entities
%token PARSE_ENTITY
@@ -145,44 +109,8 @@
%start document
-/./****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtQml module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+/.// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
//
@@ -219,12 +147,16 @@
#ifndef QXMLSTREAMPARSER_P_H
#define QXMLSTREAMPARSER_P_H
-#ifndef QT_NO_XMLSTREAMREADER
+QT_BEGIN_NAMESPACE
+
+#if QT_CONFIG(xmlstreamreader)
bool QXmlStreamReaderPrivate::parse()
{
// cleanup currently reported token
+ using namespace Qt::StringLiterals;
+
switch (type) {
case QXmlStreamReader::StartElement:
name.clear();
@@ -319,7 +251,7 @@ bool QXmlStreamReaderPrivate::parse()
} else switch (token_char) {
case 0xfffe:
case 0xffff:
- token = ERROR;
+ token = XML_ERROR;
break;
case '\r':
token = SPACE;
@@ -732,9 +664,9 @@ attdef ::= attdef_start att_type default_decl;
dtdAttribute.attributePrefix = addToStringStorage(symPrefix(1));
dtdAttribute.attributeName = addToStringStorage(symString(1));
dtdAttribute.attributeQualifiedName = addToStringStorage(symName(1));
- dtdAttribute.isNamespaceAttribute = (dtdAttribute.attributePrefix == QLatin1String("xmlns")
+ dtdAttribute.isNamespaceAttribute = (dtdAttribute.attributePrefix == "xmlns"_L1
|| (dtdAttribute.attributePrefix.isEmpty()
- && dtdAttribute.attributeName == QLatin1String("xmlns")));
+ && dtdAttribute.attributeName == "xmlns"_L1));
if (lastAttributeValue.isNull()) {
dtdAttribute.defaultValue.clear();
} else {
@@ -756,14 +688,14 @@ attlist_decl ::= langle_bang ATTLIST qname attdef_list space_opt RANGLE;
case $rule_number: {
if (referenceToUnparsedEntityDetected && !standalone)
break;
- int n = dtdAttributes.size();
+ qsizetype n = dtdAttributes.size();
XmlStringRef tagName = addToStringStorage(symName(3));
while (n--) {
DtdAttribute &dtdAttribute = dtdAttributes[n];
if (!dtdAttribute.tagName.isNull())
break;
dtdAttribute.tagName = tagName;
- for (int i = 0; i < n; ++i) {
+ for (qsizetype i = 0; i < n; ++i) {
if ((dtdAttributes[i].tagName.isNull() || dtdAttributes[i].tagName == tagName)
&& dtdAttributes[i].attributeQualifiedName == dtdAttribute.attributeQualifiedName) {
dtdAttribute.attributeQualifiedName.clear(); // redefined, delete it
@@ -869,11 +801,11 @@ processing_instruction ::= LANGLE QUESTIONMARK name space;
/.
case $rule_number: {
setType(QXmlStreamReader::ProcessingInstruction);
- int pos = sym(4).pos + sym(4).len;
+ const qsizetype pos = sym(4).pos + sym(4).len;
processingInstructionTarget = symString(3);
if (scanUntil("?>")) {
processingInstructionData = XmlStringRef(&textBuffer, pos, textBuffer.size() - pos - 2);
- if (!processingInstructionTarget.view().compare(QLatin1String("xml"), Qt::CaseInsensitive)) {
+ if (!processingInstructionTarget.view().compare("xml"_L1, Qt::CaseInsensitive)) {
raiseWellFormedError(QXmlStream::tr("XML declaration not at start of document."));
}
else if (!QXmlUtils::isNCName(processingInstructionTarget))
@@ -891,7 +823,7 @@ processing_instruction ::= LANGLE QUESTIONMARK name QUESTIONMARK RANGLE;
case $rule_number:
setType(QXmlStreamReader::ProcessingInstruction);
processingInstructionTarget = symString(3);
- if (!processingInstructionTarget.view().compare(QLatin1String("xml"), Qt::CaseInsensitive))
+ if (!processingInstructionTarget.view().compare("xml"_L1, Qt::CaseInsensitive))
raiseWellFormedError(QXmlStream::tr("Invalid processing instruction name."));
break;
./
@@ -921,7 +853,7 @@ comment ::= comment_start RANGLE;
/.
case $rule_number: {
setType(QXmlStreamReader::Comment);
- int pos = sym(1).pos + 4;
+ const qsizetype pos = sym(1).pos + 4;
text = XmlStringRef(&textBuffer, pos, textBuffer.size() - pos - 3);
} break;
./
@@ -933,7 +865,7 @@ cdata ::= langle_bang CDATA_START;
setType(QXmlStreamReader::Characters);
isCDATA = true;
isWhitespace = false;
- int pos = sym(2).pos;
+ const qsizetype pos = sym(2).pos;
if (scanUntil("]]>", -1)) {
text = XmlStringRef(&textBuffer, pos, textBuffer.size() - pos - 3);
} else {
@@ -1069,7 +1001,7 @@ literal_content_start ::= SPACE;
/.
case $rule_number:
if (normalizeLiterals)
- textBuffer.data()[textBuffer.size()-1] = QLatin1Char(' ');
+ textBuffer.data()[textBuffer.size()-1] = u' ';
break;
./
@@ -1184,13 +1116,13 @@ attribute ::= qname space_opt EQ space_opt attribute_value;
/.
case $rule_number: {
XmlStringRef prefix = symPrefix(1);
- if (prefix.isEmpty() && symString(1) == QLatin1String("xmlns") && namespaceProcessing) {
+ if (prefix.isEmpty() && symString(1) == "xmlns"_L1 && namespaceProcessing) {
NamespaceDeclaration &namespaceDeclaration = namespaceDeclarations.push();
namespaceDeclaration.prefix.clear();
const XmlStringRef ns(symString(5));
- if (ns.view() == QLatin1String("http://www.w3.org/2000/xmlns/") ||
- ns.view() == QLatin1String("http://www.w3.org/XML/1998/namespace"))
+ if (ns.view() == "http://www.w3.org/2000/xmlns/"_L1 ||
+ ns.view() == "http://www.w3.org/XML/1998/namespace"_L1)
raiseWellFormedError(QXmlStream::tr("Illegal namespace declaration."));
else
namespaceDeclaration.namespaceUri = addToStringStorage(ns);
@@ -1201,8 +1133,7 @@ attribute ::= qname space_opt EQ space_opt attribute_value;
XmlStringRef attributeQualifiedName = symName(1);
bool normalize = false;
- for (int a = 0; a < dtdAttributes.size(); ++a) {
- DtdAttribute &dtdAttribute = dtdAttributes[a];
+ for (const DtdAttribute &dtdAttribute : std::as_const(dtdAttributes)) {
if (!dtdAttribute.isCDATA
&& dtdAttribute.tagName == qualifiedName
&& dtdAttribute.attributeQualifiedName == attributeQualifiedName
@@ -1213,10 +1144,10 @@ attribute ::= qname space_opt EQ space_opt attribute_value;
}
if (normalize) {
// normalize attribute value (simplify and trim)
- int pos = textBuffer.size();
- int n = 0;
+ const qsizetype pos = textBuffer.size();
+ qsizetype n = 0;
bool wasSpace = true;
- for (int i = 0; i < attribute.value.len; ++i) {
+ for (qsizetype i = 0; i < attribute.value.len; ++i) {
QChar c = textBuffer.at(attribute.value.pos + i);
if (c.unicode() == ' ') {
if (wasSpace)
@@ -1234,16 +1165,16 @@ attribute ::= qname space_opt EQ space_opt attribute_value;
attribute.value.pos = pos;
attribute.value.len = n;
}
- if (prefix == QLatin1String("xmlns") && namespaceProcessing) {
+ if (prefix == "xmlns"_L1 && namespaceProcessing) {
NamespaceDeclaration &namespaceDeclaration = namespaceDeclarations.push();
XmlStringRef namespacePrefix = symString(attribute.key);
XmlStringRef namespaceUri = symString(attribute.value);
attributeStack.pop();
- if (((namespacePrefix == QLatin1String("xml"))
- ^ (namespaceUri == QLatin1String("http://www.w3.org/XML/1998/namespace")))
- || namespaceUri == QLatin1String("http://www.w3.org/2000/xmlns/")
+ if (((namespacePrefix == "xml"_L1)
+ ^ (namespaceUri == "http://www.w3.org/XML/1998/namespace"_L1))
+ || namespaceUri == "http://www.w3.org/2000/xmlns/"_L1
|| namespaceUri.isEmpty()
- || namespacePrefix == QLatin1String("xmlns"))
+ || namespacePrefix == "xmlns"_L1)
raiseWellFormedError(QXmlStream::tr("Illegal namespace declaration."));
namespaceDeclaration.prefix = addToStringStorage(namespacePrefix);
@@ -1299,9 +1230,9 @@ etag ::= LANGLE SLASH qname space_opt RANGLE;
Tag tag = tagStack_pop();
namespaceUri = tag.namespaceDeclaration.namespaceUri;
+ prefix = tag.namespaceDeclaration.prefix;
name = tag.name;
qualifiedName = tag.qualifiedName;
- prefix = tag.namespaceDeclaration.prefix;
if (qualifiedName != symName(3))
raiseWellFormedError(QXmlStream::tr("Opening and ending tag mismatch."));
} break;
@@ -1488,7 +1419,12 @@ space_opt ::= space;
qname ::= LETTER;
/.
case $rule_number: {
- sym(1).len += fastScanName(&sym(1).prefix);
+ Value &val = sym(1);
+ if (auto res = fastScanName(&val))
+ val.len += *res;
+ else
+ return false;
+
if (atEnd) {
resume($rule_number);
return false;
@@ -1499,7 +1435,11 @@ qname ::= LETTER;
name ::= LETTER;
/.
case $rule_number:
- sym(1).len += fastScanName();
+ if (auto res = fastScanName())
+ sym(1).len += *res;
+ else
+ return false;
+
if (atEnd) {
resume($rule_number);
return false;
@@ -1547,7 +1487,9 @@ nmtoken ::= COLON;
return false;
}
-#endif
+#endif // feature xmlstreamreader
+
+QT_END_NAMESPACE
#endif
diff --git a/src/corelib/serialization/qxmlstream.h b/src/corelib/serialization/qxmlstream.h
index afd8563cc1..8a12c6d611 100644
--- a/src/corelib/serialization/qxmlstream.h
+++ b/src/corelib/serialization/qxmlstream.h
@@ -1,49 +1,14 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QXMLSTREAM_H
#define QXMLSTREAM_H
#include <QtCore/qiodevice.h>
-#ifndef QT_NO_XMLSTREAM
+#if QT_CONFIG(xmlstream)
+#include <QtCore/qcompare.h>
#include <QtCore/qlist.h>
#include <QtCore/qscopedpointer.h>
#include <QtCore/qstring.h>
@@ -58,12 +23,12 @@ public:
QXmlString(QStringPrivate &&d) : m_string(std::move(d)) {}
QXmlString(const QString &s) : m_string(s.data_ptr()) {}
QXmlString & operator=(const QString &s) { m_string = s.data_ptr(); return *this; }
- QXmlString & operator=(QString &&s) { qSwap(m_string, s.data_ptr()); return *this; }
+ QXmlString & operator=(QString &&s) { m_string.swap(s.data_ptr()); return *this; }
inline constexpr QXmlString() {}
void swap(QXmlString &other) noexcept
{
- qSwap(m_string, other.m_string);
+ m_string.swap(other.m_string);
}
inline operator QStringView() const { return QStringView(m_string.data(), m_string.size); }
@@ -94,13 +59,23 @@ public:
}
inline QStringView value() const { return m_value; }
inline bool isDefault() const { return m_isDefault; }
- inline bool operator==(const QXmlStreamAttribute &other) const {
- return (value() == other.value()
- && (namespaceUri().isNull() ? (qualifiedName() == other.qualifiedName())
- : (namespaceUri() == other.namespaceUri() && name() == other.name())));
- }
+#if QT_CORE_REMOVED_SINCE(6, 8)
+ inline bool operator==(const QXmlStreamAttribute &other) const
+ { return comparesEqual(*this, other); }
inline bool operator!=(const QXmlStreamAttribute &other) const
- { return !operator==(other); }
+ { return !operator==(other); }
+#endif
+
+private:
+ friend bool comparesEqual(const QXmlStreamAttribute &lhs,
+ const QXmlStreamAttribute &rhs) noexcept
+ {
+ return (lhs.value() == rhs.value()
+ && (lhs.namespaceUri().isNull() ? (lhs.qualifiedName() == rhs.qualifiedName())
+ : (lhs.namespaceUri() == rhs.namespaceUri()
+ && lhs.name() == rhs.name())));
+ }
+ Q_DECLARE_EQUALITY_COMPARABLE(QXmlStreamAttribute)
};
Q_DECLARE_TYPEINFO(QXmlStreamAttribute, Q_RELOCATABLE_TYPE);
@@ -111,25 +86,25 @@ class QXmlStreamAttributes : public QList<QXmlStreamAttribute>
{
public:
inline QXmlStreamAttributes() {}
+#if QT_CORE_REMOVED_SINCE(6, 6)
Q_CORE_EXPORT QStringView value(const QString &namespaceUri, const QString &name) const;
- Q_CORE_EXPORT QStringView value(const QString &namespaceUri, QLatin1String name) const;
- Q_CORE_EXPORT QStringView value(QLatin1String namespaceUri, QLatin1String name) const;
+ Q_CORE_EXPORT QStringView value(const QString &namespaceUri, QLatin1StringView name) const;
+ Q_CORE_EXPORT QStringView value(QLatin1StringView namespaceUri, QLatin1StringView name) const;
Q_CORE_EXPORT QStringView value(const QString &qualifiedName) const;
- Q_CORE_EXPORT QStringView value(QLatin1String qualifiedName) const;
+ Q_CORE_EXPORT QStringView value(QLatin1StringView qualifiedName) const;
+#endif
+ Q_CORE_EXPORT QStringView value(QAnyStringView namespaceUri, QAnyStringView name) const noexcept;
+ Q_CORE_EXPORT QStringView value(QAnyStringView qualifiedName) const noexcept;
+
Q_CORE_EXPORT void append(const QString &namespaceUri, const QString &name, const QString &value);
Q_CORE_EXPORT void append(const QString &qualifiedName, const QString &value);
- inline bool hasAttribute(const QString &qualifiedName) const
- {
- return !value(qualifiedName).isNull();
- }
-
- inline bool hasAttribute(QLatin1String qualifiedName) const
+ bool hasAttribute(QAnyStringView qualifiedName) const
{
return !value(qualifiedName).isNull();
}
- inline bool hasAttribute(const QString &namespaceUri, const QString &name) const
+ bool hasAttribute(QAnyStringView namespaceUri, QAnyStringView name) const
{
return !value(namespaceUri, name).isNull();
}
@@ -147,11 +122,19 @@ public:
inline QStringView prefix() const { return m_prefix; }
inline QStringView namespaceUri() const { return m_namespaceUri; }
- inline bool operator==(const QXmlStreamNamespaceDeclaration &other) const {
- return (prefix() == other.prefix() && namespaceUri() == other.namespaceUri());
- }
+#if QT_CORE_REMOVED_SINCE(6, 8)
+ inline bool operator==(const QXmlStreamNamespaceDeclaration &other) const
+ { return comparesEqual(*this, other); }
inline bool operator!=(const QXmlStreamNamespaceDeclaration &other) const
- { return !operator==(other); }
+ { return !operator==(other); }
+#endif
+private:
+ friend bool comparesEqual(const QXmlStreamNamespaceDeclaration &lhs,
+ const QXmlStreamNamespaceDeclaration &rhs) noexcept
+ {
+ return (lhs.prefix() == rhs.prefix() && lhs.namespaceUri() == rhs.namespaceUri());
+ }
+ Q_DECLARE_EQUALITY_COMPARABLE(QXmlStreamNamespaceDeclaration)
};
Q_DECLARE_TYPEINFO(QXmlStreamNamespaceDeclaration, Q_RELOCATABLE_TYPE);
@@ -167,12 +150,20 @@ public:
inline QStringView name() const { return m_name; }
inline QStringView systemId() const { return m_systemId; }
inline QStringView publicId() const { return m_publicId; }
- inline bool operator==(const QXmlStreamNotationDeclaration &other) const {
- return (name() == other.name() && systemId() == other.systemId()
- && publicId() == other.publicId());
- }
+#if QT_CORE_REMOVED_SINCE(6, 8)
+ inline bool operator==(const QXmlStreamNotationDeclaration &other) const
+ { return comparesEqual(*this, other); }
inline bool operator!=(const QXmlStreamNotationDeclaration &other) const
- { return !operator==(other); }
+ { return !operator==(other); }
+#endif
+private:
+ friend bool comparesEqual(const QXmlStreamNotationDeclaration &lhs,
+ const QXmlStreamNotationDeclaration &rhs) noexcept
+ {
+ return (lhs.name() == rhs.name() && lhs.systemId() == rhs.systemId()
+ && lhs.publicId() == rhs.publicId());
+ }
+ Q_DECLARE_EQUALITY_COMPARABLE(QXmlStreamNotationDeclaration)
};
Q_DECLARE_TYPEINFO(QXmlStreamNotationDeclaration, Q_RELOCATABLE_TYPE);
@@ -190,15 +181,24 @@ public:
inline QStringView systemId() const { return m_systemId; }
inline QStringView publicId() const { return m_publicId; }
inline QStringView value() const { return m_value; }
- inline bool operator==(const QXmlStreamEntityDeclaration &other) const {
- return (name() == other.name()
- && notationName() == other.notationName()
- && systemId() == other.systemId()
- && publicId() == other.publicId()
- && value() == other.value());
- }
+#if QT_CORE_REMOVED_SINCE(6, 8)
+ inline bool operator==(const QXmlStreamEntityDeclaration &other) const
+ { return comparesEqual(*this, other); }
inline bool operator!=(const QXmlStreamEntityDeclaration &other) const
- { return !operator==(other); }
+ { return !operator==(other); }
+#endif
+
+private:
+ friend bool comparesEqual(const QXmlStreamEntityDeclaration &lhs,
+ const QXmlStreamEntityDeclaration &rhs) noexcept
+ {
+ return (lhs.name() == rhs.name()
+ && lhs.notationName() == rhs.notationName()
+ && lhs.systemId() == rhs.systemId()
+ && lhs.publicId() == rhs.publicId()
+ && lhs.value() == rhs.value());
+ }
+ Q_DECLARE_EQUALITY_COMPARABLE(QXmlStreamEntityDeclaration)
};
Q_DECLARE_TYPEINFO(QXmlStreamEntityDeclaration, Q_RELOCATABLE_TYPE);
@@ -206,14 +206,17 @@ typedef QList<QXmlStreamEntityDeclaration> QXmlStreamEntityDeclarations;
class Q_CORE_EXPORT QXmlStreamEntityResolver
{
+ Q_DISABLE_COPY_MOVE(QXmlStreamEntityResolver)
public:
+ QXmlStreamEntityResolver() = default;
virtual ~QXmlStreamEntityResolver();
virtual QString resolveEntity(const QString& publicId, const QString& systemId);
virtual QString resolveUndeclaredEntity(const QString &name);
};
-#ifndef QT_NO_XMLSTREAMREADER
-class Q_CORE_EXPORT QXmlStreamReader {
+#if QT_CONFIG(xmlstreamreader)
+class Q_CORE_EXPORT QXmlStreamReader
+{
QDOC_PROPERTY(bool namespaceProcessing READ namespaceProcessing WRITE setNamespaceProcessing)
public:
enum TokenType {
@@ -233,16 +236,27 @@ public:
QXmlStreamReader();
explicit QXmlStreamReader(QIODevice *device);
+#if QT_CORE_REMOVED_SINCE(6, 5)
explicit QXmlStreamReader(const QByteArray &data);
explicit QXmlStreamReader(const QString &data);
explicit QXmlStreamReader(const char * data);
+#endif // QT_CORE_REMOVED_SINCE(6, 5)
+ Q_WEAK_OVERLOAD
+ explicit QXmlStreamReader(const QByteArray &data)
+ : QXmlStreamReader(data, PrivateConstructorTag{}) { }
+ explicit QXmlStreamReader(QAnyStringView data);
~QXmlStreamReader();
void setDevice(QIODevice *device);
QIODevice *device() const;
+#if QT_CORE_REMOVED_SINCE(6, 5)
void addData(const QByteArray &data);
void addData(const QString &data);
void addData(const char *data);
+#endif // QT_CORE_REMOVED_SINCE(6, 5)
+ Q_WEAK_OVERLOAD
+ void addData(const QByteArray &data) { addDataImpl(data); }
+ void addData(QAnyStringView data);
void clear();
@@ -271,6 +285,7 @@ public:
inline bool isProcessingInstruction() const { return tokenType() == ProcessingInstruction; }
bool isStandaloneDocument() const;
+ bool hasStandaloneDeclaration() const;
QStringView documentVersion() const;
QStringView documentEncoding() const;
@@ -329,14 +344,18 @@ public:
QXmlStreamEntityResolver *entityResolver() const;
private:
+ struct PrivateConstructorTag { };
+ QXmlStreamReader(const QByteArray &data, PrivateConstructorTag);
+ void addDataImpl(const QByteArray &data);
+
Q_DISABLE_COPY(QXmlStreamReader)
Q_DECLARE_PRIVATE(QXmlStreamReader)
QScopedPointer<QXmlStreamReaderPrivate> d_ptr;
};
-#endif // QT_NO_XMLSTREAMREADER
+#endif // feature xmlstreamreader
-#ifndef QT_NO_XMLSTREAMWRITER
+#if QT_CONFIG(xmlstreamwriter)
class QXmlStreamWriterPrivate;
@@ -360,11 +379,17 @@ public:
void setAutoFormattingIndent(int spacesOrTabs);
int autoFormattingIndent() const;
+#if QT_CORE_REMOVED_SINCE(6,5)
void writeAttribute(const QString &qualifiedName, const QString &value);
void writeAttribute(const QString &namespaceUri, const QString &name, const QString &value);
+#endif
+ void writeAttribute(QAnyStringView qualifiedName, QAnyStringView value);
+ void writeAttribute(QAnyStringView namespaceUri, QAnyStringView name, QAnyStringView value);
+
void writeAttribute(const QXmlStreamAttribute& attribute);
void writeAttributes(const QXmlStreamAttributes& attributes);
+#if QT_CORE_REMOVED_SINCE(6,5)
void writeCDATA(const QString &text);
void writeCharacters(const QString &text);
void writeComment(const QString &text);
@@ -376,22 +401,47 @@ public:
void writeTextElement(const QString &qualifiedName, const QString &text);
void writeTextElement(const QString &namespaceUri, const QString &name, const QString &text);
+#endif
+ void writeCDATA(QAnyStringView text);
+ void writeCharacters(QAnyStringView text);
+ void writeComment(QAnyStringView text);
+
+ void writeDTD(QAnyStringView dtd);
+
+ void writeEmptyElement(QAnyStringView qualifiedName);
+ void writeEmptyElement(QAnyStringView namespaceUri, QAnyStringView name);
+
+ void writeTextElement(QAnyStringView qualifiedName, QAnyStringView text);
+ void writeTextElement(QAnyStringView namespaceUri, QAnyStringView name, QAnyStringView text);
+
void writeEndDocument();
void writeEndElement();
+#if QT_CORE_REMOVED_SINCE(6,5)
void writeEntityReference(const QString &name);
- void writeNamespace(const QString &namespaceUri, const QString &prefix = QString());
+ void writeNamespace(const QString &namespaceUri, const QString &prefix);
void writeDefaultNamespace(const QString &namespaceUri);
- void writeProcessingInstruction(const QString &target, const QString &data = QString());
+ void writeProcessingInstruction(const QString &target, const QString &data);
+#endif
+ void writeEntityReference(QAnyStringView name);
+ void writeNamespace(QAnyStringView namespaceUri, QAnyStringView prefix = {});
+ void writeDefaultNamespace(QAnyStringView namespaceUri);
+ void writeProcessingInstruction(QAnyStringView target, QAnyStringView data = {});
void writeStartDocument();
+#if QT_CORE_REMOVED_SINCE(6,5)
void writeStartDocument(const QString &version);
void writeStartDocument(const QString &version, bool standalone);
void writeStartElement(const QString &qualifiedName);
void writeStartElement(const QString &namespaceUri, const QString &name);
+#endif
+ void writeStartDocument(QAnyStringView version);
+ void writeStartDocument(QAnyStringView version, bool standalone);
+ void writeStartElement(QAnyStringView qualifiedName);
+ void writeStartElement(QAnyStringView namespaceUri, QAnyStringView name);
-#ifndef QT_NO_XMLSTREAMREADER
+#if QT_CONFIG(xmlstreamreader)
void writeCurrentToken(const QXmlStreamReader &reader);
#endif
@@ -402,9 +452,10 @@ private:
Q_DECLARE_PRIVATE(QXmlStreamWriter)
QScopedPointer<QXmlStreamWriterPrivate> d_ptr;
};
-#endif // QT_NO_XMLSTREAMWRITER
+#endif // feature xmlstreamwriter
QT_END_NAMESPACE
-#endif // QT_NO_XMLSTREAM
+#endif // feature xmlstream
+
#endif // QXMLSTREAM_H
diff --git a/src/corelib/serialization/qxmlstream_p.h b/src/corelib/serialization/qxmlstream_p.h
index 41b04d4c38..a29ee656e9 100644
--- a/src/corelib/serialization/qxmlstream_p.h
+++ b/src/corelib/serialization/qxmlstream_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
//
// W A R N I N G
@@ -52,8 +16,12 @@
#include <qstringconverter.h>
#include <qxmlstream.h>
#include "qxmlstreamgrammar_p.h"
+#include <QtCore/qhash.h>
+#include <QCoreApplication> // Q_DECLARE_TR_FUNCTIONS
+
#include <memory>
+#include <optional>
#ifndef QXMLSTREAM_P_H
#define QXMLSTREAM_P_H
@@ -70,12 +38,12 @@ public:
qsizetype m_size = 0;
constexpr XmlStringRef() = default;
- constexpr inline XmlStringRef(const QString *string, int pos, int length)
- : m_string(string), m_pos(pos), m_size(length)
+ constexpr inline XmlStringRef(const QString *string, qsizetype pos, qsizetype length)
+ : m_string(string), m_pos(pos), m_size((Q_ASSERT(length >= 0), length))
{
}
XmlStringRef(const QString *string)
- : XmlStringRef(string, 0, string->length())
+ : XmlStringRef(string, 0, string->size())
{
}
@@ -87,7 +55,6 @@ public:
d.size = m_size;
return QXmlString(std::move(d));
}
- operator QStringView() const { return view(); }
void clear() { m_string = nullptr; m_pos = 0; m_size= 0; }
QStringView view() const { return m_string ? QStringView(m_string->data() + m_pos, m_size) : QStringView(); }
@@ -95,6 +62,33 @@ public:
bool isNull() const { return !m_string; }
QString toString() const { return view().toString(); }
+ using value_type = QStringView::value_type;
+ using size_type = QStringView::size_type;
+ using difference_type = QStringView::difference_type;
+ using pointer = QStringView::pointer;
+ using const_pointer = QStringView::const_pointer;
+ using reference = QStringView::reference;
+ using const_reference = QStringView::const_reference;
+ using iterator = QStringView::iterator;
+ using const_iterator = QStringView::const_iterator;
+ using reverse_iterator = QStringView::reverse_iterator;
+ using const_reverse_iterator = QStringView::const_reverse_iterator;
+
+#define MAKE_MEMBER(name) \
+ auto name () const noexcept { return view(). name (); }
+ MAKE_MEMBER(data)
+ MAKE_MEMBER(size)
+ MAKE_MEMBER(empty)
+ MAKE_MEMBER(begin)
+ MAKE_MEMBER(end)
+ MAKE_MEMBER(cbegin)
+ MAKE_MEMBER(cend)
+ MAKE_MEMBER(rbegin)
+ MAKE_MEMBER(rend)
+ MAKE_MEMBER(crbegin)
+ MAKE_MEMBER(crend)
+#undef MAKE_MEMBER
+
#define MAKE_OP(op) \
friend auto operator op(const XmlStringRef &lhs, const XmlStringRef &rhs) noexcept { return lhs.view() op rhs.view(); } \
/*end*/
@@ -124,6 +118,8 @@ using namespace QtPrivate;
template <typename T> class QXmlStreamSimpleStack
{
+ Q_DISABLE_COPY_MOVE(QXmlStreamSimpleStack)
+
T *data;
qsizetype tos, cap;
public:
@@ -170,7 +166,6 @@ public:
const T *cend() const { return end(); }
};
-
class QXmlStream
{
Q_DECLARE_TR_FUNCTIONS(QXmlStream)
@@ -189,7 +184,7 @@ public:
XmlStringRef name;
XmlStringRef qualifiedName;
NamespaceDeclaration namespaceDeclaration;
- int tagStackStringStorageSize;
+ qsizetype tagStackStringStorageSize;
qsizetype namespaceDeclarationsSize;
};
@@ -197,17 +192,17 @@ public:
QXmlStreamPrivateTagStack();
QXmlStreamSimpleStack<NamespaceDeclaration> namespaceDeclarations;
QString tagStackStringStorage;
- int tagStackStringStorageSize;
- int initialTagStackStringStorageSize;
+ qsizetype tagStackStringStorageSize;
+ qsizetype initialTagStackStringStorageSize;
bool tagsDone;
- XmlStringRef addToStringStorage(QStringView s)
+ XmlStringRef addToStringStorage(QAnyStringView s)
{
- int pos = tagStackStringStorageSize;
- int sz = s.size();
+ qsizetype pos = tagStackStringStorageSize;
if (pos != tagStackStringStorage.size())
tagStackStringStorage.resize(pos);
- tagStackStringStorage.append(s.data(), sz);
+ s.visit([&](auto s) { tagStackStringStorage.append(s); });
+ qsizetype sz = (tagStackStringStorage.size() - pos);
tagStackStringStorageSize += sz;
return XmlStringRef(&tagStackStringStorage, pos, sz);
}
@@ -246,14 +241,14 @@ public:
uchar firstByte;
qint64 nbytesread;
QString readBuffer;
- int readBufferPos;
+ qsizetype readBufferPos;
QXmlStreamSimpleStack<uint> putStack;
struct Entity {
Entity() = default;
Entity(const QString &name, const QString &value)
: name(name), value(value), external(false), unparsed(false), literal(false),
hasBeenParsed(false), isCurrentlyReferenced(false){}
- static inline Entity createLiteral(QLatin1String name, QLatin1String value)
+ static inline Entity createLiteral(QLatin1StringView name, QLatin1StringView value)
{ Entity result(name, value); result.literal = result.hasBeenParsed = true; return result; }
QString name, value;
uint external : 1;
@@ -302,6 +297,17 @@ public:
QStringDecoder decoder;
bool atEnd;
+ enum class XmlContext
+ {
+ Prolog,
+ Body,
+ };
+
+ XmlContext currentContext = XmlContext::Prolog;
+ bool foundDTD = false;
+ bool isValidToken(QXmlStreamReader::TokenType type);
+ void checkToken();
+
/*!
\sa setType()
*/
@@ -389,6 +395,7 @@ public:
uint hasExternalDtdSubset : 1;
uint lockEncoding : 1;
uint namespaceProcessing : 1;
+ uint hasStandalone : 1; // TODO: expose in public API
int resumeReduction;
void resume(int rule);
@@ -405,9 +412,9 @@ public:
int tos;
int stack_size;
struct Value {
- int pos;
- int len;
- int prefix;
+ qsizetype pos; // offset into textBuffer
+ qsizetype len; // length incl. prefix (if any)
+ qint16 prefix; // prefix of a name (as in "prefix:name") limited to 4k in fastScanName()
ushort c;
};
@@ -500,11 +507,11 @@ public:
// scan optimization functions. Not strictly necessary but LALR is
// not very well suited for scanning fast
- int fastScanLiteralContent();
- int fastScanSpace();
- int fastScanContentCharList();
- int fastScanName(int *prefix = nullptr);
- inline int fastScanNMTOKEN();
+ qsizetype fastScanLiteralContent();
+ qsizetype fastScanSpace();
+ qsizetype fastScanContentCharList();
+ std::optional<qsizetype> fastScanName(Value *val = nullptr);
+ inline qsizetype fastScanNMTOKEN();
bool parse();
@@ -512,6 +519,7 @@ public:
void raiseError(QXmlStreamReader::Error error, const QString& message = QString());
void raiseWellFormedError(const QString &message);
+ void raiseNamePrefixTooLongError();
QXmlStreamEntityResolver *entityResolver;
diff --git a/src/corelib/serialization/qxmlstreamgrammar.cpp b/src/corelib/serialization/qxmlstreamgrammar.cpp
index d709515249..074b9023ce 100644
--- a/src/corelib/serialization/qxmlstreamgrammar.cpp
+++ b/src/corelib/serialization/qxmlstreamgrammar.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
// This file was generated by qlalr - DO NOT EDIT!
#include "qxmlstreamgrammar_p.h"
diff --git a/src/corelib/serialization/qxmlstreamgrammar_p.h b/src/corelib/serialization/qxmlstreamgrammar_p.h
index 32dd1d05fd..80ee8e929f 100644
--- a/src/corelib/serialization/qxmlstreamgrammar_p.h
+++ b/src/corelib/serialization/qxmlstreamgrammar_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
//
// W A R N I N G
@@ -80,7 +44,6 @@ public:
ENTITY = 32,
ENTITY_DONE = 45,
EQ = 14,
- ERROR = 43,
FIXED = 39,
HASH = 6,
ID = 48,
@@ -117,6 +80,7 @@ public:
UNRESOLVED_ENTITY = 46,
VERSION = 55,
XML = 54,
+ XML_ERROR = 43,
ACCEPT_STATE = 416,
RULE_COUNT = 270,
diff --git a/src/corelib/serialization/qxmlstreamparser_p.h b/src/corelib/serialization/qxmlstreamparser_p.h
index d568f9d024..1363bf4d41 100644
--- a/src/corelib/serialization/qxmlstreamparser_p.h
+++ b/src/corelib/serialization/qxmlstreamparser_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtQml module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
//
@@ -74,12 +38,14 @@
QT_BEGIN_NAMESPACE
-#ifndef QT_NO_XMLSTREAMREADER
+#if QT_CONFIG(xmlstreamreader)
bool QXmlStreamReaderPrivate::parse()
{
// cleanup currently reported token
+ using namespace Qt::StringLiterals;
+
switch (type) {
case QXmlStreamReader::StartElement:
name.clear();
@@ -174,7 +140,7 @@ bool QXmlStreamReaderPrivate::parse()
} else switch (token_char) {
case 0xfffe:
case 0xffff:
- token = ERROR;
+ token = XML_ERROR;
break;
case '\r':
token = SPACE;
@@ -467,9 +433,9 @@ bool QXmlStreamReaderPrivate::parse()
dtdAttribute.attributePrefix = addToStringStorage(symPrefix(1));
dtdAttribute.attributeName = addToStringStorage(symString(1));
dtdAttribute.attributeQualifiedName = addToStringStorage(symName(1));
- dtdAttribute.isNamespaceAttribute = (dtdAttribute.attributePrefix == QLatin1String("xmlns")
+ dtdAttribute.isNamespaceAttribute = (dtdAttribute.attributePrefix == "xmlns"_L1
|| (dtdAttribute.attributePrefix.isEmpty()
- && dtdAttribute.attributeName == QLatin1String("xmlns")));
+ && dtdAttribute.attributeName == "xmlns"_L1));
if (lastAttributeValue.isNull()) {
dtdAttribute.defaultValue.clear();
} else {
@@ -484,14 +450,14 @@ bool QXmlStreamReaderPrivate::parse()
case 88: {
if (referenceToUnparsedEntityDetected && !standalone)
break;
- int n = dtdAttributes.size();
+ qsizetype n = dtdAttributes.size();
XmlStringRef tagName = addToStringStorage(symName(3));
while (n--) {
DtdAttribute &dtdAttribute = dtdAttributes[n];
if (!dtdAttribute.tagName.isNull())
break;
dtdAttribute.tagName = tagName;
- for (int i = 0; i < n; ++i) {
+ for (qsizetype i = 0; i < n; ++i) {
if ((dtdAttributes[i].tagName.isNull() || dtdAttributes[i].tagName == tagName)
&& dtdAttributes[i].attributeQualifiedName == dtdAttribute.attributeQualifiedName) {
dtdAttribute.attributeQualifiedName.clear(); // redefined, delete it
@@ -572,11 +538,11 @@ bool QXmlStreamReaderPrivate::parse()
case 96: {
setType(QXmlStreamReader::ProcessingInstruction);
- int pos = sym(4).pos + sym(4).len;
+ const qsizetype pos = sym(4).pos + sym(4).len;
processingInstructionTarget = symString(3);
if (scanUntil("?>")) {
processingInstructionData = XmlStringRef(&textBuffer, pos, textBuffer.size() - pos - 2);
- if (!processingInstructionTarget.view().compare(QLatin1String("xml"), Qt::CaseInsensitive)) {
+ if (!processingInstructionTarget.view().compare("xml"_L1, Qt::CaseInsensitive)) {
raiseWellFormedError(QXmlStream::tr("XML declaration not at start of document."));
}
else if (!QXmlUtils::isNCName(processingInstructionTarget))
@@ -591,7 +557,7 @@ bool QXmlStreamReaderPrivate::parse()
case 97:
setType(QXmlStreamReader::ProcessingInstruction);
processingInstructionTarget = symString(3);
- if (!processingInstructionTarget.view().compare(QLatin1String("xml"), Qt::CaseInsensitive))
+ if (!processingInstructionTarget.view().compare("xml"_L1, Qt::CaseInsensitive))
raiseWellFormedError(QXmlStream::tr("Invalid processing instruction name."));
break;
@@ -611,7 +577,7 @@ bool QXmlStreamReaderPrivate::parse()
case 100: {
setType(QXmlStreamReader::Comment);
- int pos = sym(1).pos + 4;
+ const qsizetype pos = sym(1).pos + 4;
text = XmlStringRef(&textBuffer, pos, textBuffer.size() - pos - 3);
} break;
@@ -619,7 +585,7 @@ bool QXmlStreamReaderPrivate::parse()
setType(QXmlStreamReader::Characters);
isCDATA = true;
isWhitespace = false;
- int pos = sym(2).pos;
+ const qsizetype pos = sym(2).pos;
if (scanUntil("]]>", -1)) {
text = XmlStringRef(&textBuffer, pos, textBuffer.size() - pos - 3);
} else {
@@ -693,7 +659,7 @@ bool QXmlStreamReaderPrivate::parse()
case 173:
if (normalizeLiterals)
- textBuffer.data()[textBuffer.size()-1] = QLatin1Char(' ');
+ textBuffer.data()[textBuffer.size()-1] = u' ';
break;
case 174:
@@ -749,13 +715,13 @@ bool QXmlStreamReaderPrivate::parse()
case 229: {
XmlStringRef prefix = symPrefix(1);
- if (prefix.isEmpty() && symString(1) == QLatin1String("xmlns") && namespaceProcessing) {
+ if (prefix.isEmpty() && symString(1) == "xmlns"_L1 && namespaceProcessing) {
NamespaceDeclaration &namespaceDeclaration = namespaceDeclarations.push();
namespaceDeclaration.prefix.clear();
const XmlStringRef ns(symString(5));
- if (ns.view() == QLatin1String("http://www.w3.org/2000/xmlns/") ||
- ns.view() == QLatin1String("http://www.w3.org/XML/1998/namespace"))
+ if (ns.view() == "http://www.w3.org/2000/xmlns/"_L1 ||
+ ns.view() == "http://www.w3.org/XML/1998/namespace"_L1)
raiseWellFormedError(QXmlStream::tr("Illegal namespace declaration."));
else
namespaceDeclaration.namespaceUri = addToStringStorage(ns);
@@ -766,8 +732,7 @@ bool QXmlStreamReaderPrivate::parse()
XmlStringRef attributeQualifiedName = symName(1);
bool normalize = false;
- for (int a = 0; a < dtdAttributes.size(); ++a) {
- DtdAttribute &dtdAttribute = dtdAttributes[a];
+ for (const DtdAttribute &dtdAttribute : std::as_const(dtdAttributes)) {
if (!dtdAttribute.isCDATA
&& dtdAttribute.tagName == qualifiedName
&& dtdAttribute.attributeQualifiedName == attributeQualifiedName
@@ -778,10 +743,10 @@ bool QXmlStreamReaderPrivate::parse()
}
if (normalize) {
// normalize attribute value (simplify and trim)
- int pos = textBuffer.size();
- int n = 0;
+ const qsizetype pos = textBuffer.size();
+ qsizetype n = 0;
bool wasSpace = true;
- for (int i = 0; i < attribute.value.len; ++i) {
+ for (qsizetype i = 0; i < attribute.value.len; ++i) {
QChar c = textBuffer.at(attribute.value.pos + i);
if (c.unicode() == ' ') {
if (wasSpace)
@@ -799,16 +764,16 @@ bool QXmlStreamReaderPrivate::parse()
attribute.value.pos = pos;
attribute.value.len = n;
}
- if (prefix == QLatin1String("xmlns") && namespaceProcessing) {
+ if (prefix == "xmlns"_L1 && namespaceProcessing) {
NamespaceDeclaration &namespaceDeclaration = namespaceDeclarations.push();
XmlStringRef namespacePrefix = symString(attribute.key);
XmlStringRef namespaceUri = symString(attribute.value);
attributeStack.pop();
- if (((namespacePrefix == QLatin1String("xml"))
- ^ (namespaceUri == QLatin1String("http://www.w3.org/XML/1998/namespace")))
- || namespaceUri == QLatin1String("http://www.w3.org/2000/xmlns/")
+ if (((namespacePrefix == "xml"_L1)
+ ^ (namespaceUri == "http://www.w3.org/XML/1998/namespace"_L1))
+ || namespaceUri == "http://www.w3.org/2000/xmlns/"_L1
|| namespaceUri.isEmpty()
- || namespacePrefix == QLatin1String("xmlns"))
+ || namespacePrefix == "xmlns"_L1)
raiseWellFormedError(QXmlStream::tr("Illegal namespace declaration."));
namespaceDeclaration.prefix = addToStringStorage(namespacePrefix);
@@ -982,7 +947,12 @@ bool QXmlStreamReaderPrivate::parse()
break;
case 262: {
- sym(1).len += fastScanName(&sym(1).prefix);
+ Value &val = sym(1);
+ if (auto res = fastScanName(&val))
+ val.len += *res;
+ else
+ return false;
+
if (atEnd) {
resume(262);
return false;
@@ -990,7 +960,11 @@ bool QXmlStreamReaderPrivate::parse()
} break;
case 263:
- sym(1).len += fastScanName();
+ if (auto res = fastScanName())
+ sym(1).len += *res;
+ else
+ return false;
+
if (atEnd) {
resume(263);
return false;
@@ -1024,7 +998,7 @@ bool QXmlStreamReaderPrivate::parse()
return false;
}
-#endif
+#endif // feature xmlstreamreader
QT_END_NAMESPACE
diff --git a/src/corelib/serialization/qxmlutils.cpp b/src/corelib/serialization/qxmlutils.cpp
index dccdf85182..e6fae7c173 100644
--- a/src/corelib/serialization/qxmlutils.cpp
+++ b/src/corelib/serialization/qxmlutils.cpp
@@ -1,48 +1,16 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include <qstring.h>
#include "qxmlutils_p.h"
+#include <private/qtools_p.h>
+
QT_BEGIN_NAMESPACE
+using namespace QtMiscUtils;
+
/* TODO:
* - isNameChar() doesn't have to be public, it's only needed in
* qdom.cpp -- refactor fixedXmlName() to use isNCName()
@@ -80,7 +48,7 @@ bool QXmlUtils::rangeContains(RangeIter begin, RangeIter end, const QChar c)
return cp >= begin->min;
while (begin != end) {
- int delta = (end - begin) / 2;
+ qptrdiff delta = (end - begin) / 2;
RangeIter mid = begin + delta;
if (mid->min > cp)
@@ -233,16 +201,12 @@ bool QXmlUtils::isEncName(QStringView encName)
if (encName.isEmpty())
return false;
const auto first = encName.front().unicode();
- if (!((first >= 'a' && first <= 'z') || (first >= 'A' && first <= 'Z')))
+ if (!(isAsciiLower(first) || isAsciiUpper(first)))
return false;
for (QChar ch : encName.mid(1)) {
const auto cp = ch.unicode();
- if ((cp >= 'a' && cp <= 'z')
- || (cp >= 'A' && cp <= 'Z')
- || (cp >= '0' && cp <= '9')
- || cp == '.' || cp == '_' || cp == '-') {
+ if (isAsciiLetterOrNumber(cp) || cp == '.' || cp == '_' || cp == '-')
continue;
- }
return false;
}
return true;
@@ -271,13 +235,16 @@ bool QXmlUtils::isLetter(const QChar c)
\sa {http://www.w3.org/TR/REC-xml/#NT-Char},
{Extensible Markup Language (XML) 1.0 (Fourth Edition), [2] Char}
*/
-bool QXmlUtils::isChar(const QChar c)
+bool QXmlUtils::isChar(const char32_t c)
{
- return (c.unicode() >= 0x0020 && c.unicode() <= 0xD7FF)
- || c.unicode() == 0x0009
- || c.unicode() == 0x000A
- || c.unicode() == 0x000D
- || (c.unicode() >= 0xE000 && c.unicode() <= 0xFFFD);
+ // The valid range is defined by https://www.w3.org/TR/REC-xml/#NT-Char as following:
+ // Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]
+ return (c >= 0x0020 && c <= 0xD7FF)
+ || c == 0x0009
+ || c == 0x000A
+ || c == 0x000D
+ || (c >= 0xE000 && c <= 0xFFFD)
+ || (c >= 0x10000 && c <= 0x10FFFF);
}
/*!
@@ -318,12 +285,8 @@ bool QXmlUtils::isPublicID(QStringView candidate)
for (QChar ch : candidate) {
const ushort cp = ch.unicode();
- if ((cp >= 'a' && cp <= 'z')
- || (cp >= 'A' && cp <= 'Z')
- || (cp >= '0' && cp <= '9'))
- {
+ if (isAsciiLetterOrNumber(cp))
continue;
- }
switch (cp)
{
@@ -380,7 +343,7 @@ bool QXmlUtils::isNCName(QStringView ncName)
return false;
for (QChar at : ncName) {
- if (!QXmlUtils::isNameChar(at) || at == QLatin1Char(':'))
+ if (!QXmlUtils::isNameChar(at) || at == u':')
return false;
}
diff --git a/src/corelib/serialization/qxmlutils_p.h b/src/corelib/serialization/qxmlutils_p.h
index db6bddd5be..0ad1758979 100644
--- a/src/corelib/serialization/qxmlutils_p.h
+++ b/src/corelib/serialization/qxmlutils_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QXMLUTILS_P_H
#define QXMLUTILS_P_H
@@ -69,7 +33,7 @@ class Q_CORE_EXPORT QXmlUtils
{
public:
static bool isEncName(QStringView encName);
- static bool isChar(const QChar c);
+ static bool isChar(const char32_t c);
static bool isNameChar(const QChar c);
static bool isLetter(const QChar c);
static bool isNCName(QStringView ncName);
diff --git a/src/corelib/text/UNICODE_LICENSE.txt b/src/corelib/text/UNICODE_LICENSE.txt
deleted file mode 100644
index 500dbd5463..0000000000
--- a/src/corelib/text/UNICODE_LICENSE.txt
+++ /dev/null
@@ -1,46 +0,0 @@
-UNICODE, INC. LICENSE AGREEMENT - DATA FILES AND SOFTWARE
-
-See Terms of Use for definitions of Unicode Inc.'s
-Data Files and Software.
-
-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-2020 Unicode, Inc. All rights reserved.
-Distributed under the Terms of Use in https://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 either
-(a) this copyright and permission notice appear with all copies
-of the Data Files or Software, or
-(b) this copyright and permission notice appear in associated
-Documentation.
-
-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.
diff --git a/src/corelib/text/qanystringview.qdoc b/src/corelib/text/qanystringview.cpp
index ec4f1c5a42..4129257c02 100644
--- a/src/corelib/text/qanystringview.qdoc
+++ b/src/corelib/text/qanystringview.cpp
@@ -1,29 +1,11 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#include "qanystringview.h"
+#include "qdebug.h"
+#include "qttypetraits.h"
+
+QT_BEGIN_NAMESPACE
/*!
\class QAnyStringView
@@ -35,15 +17,23 @@
\ingroup tools
\ingroup string-processing
+ \compares strong
+ \compareswith strong char16_t QChar {const char16_t *} {const char *} \
+ QByteArray QByteArrayView QString QStringView QUtf8StringView \
+ QLatin1StringView
+ \endcompareswith
+
A QAnyStringView references a contiguous portion of a string it does
not own. It acts as an interface type to all kinds of strings,
without the need to construct a QString first.
Unlike QStringView and QUtf8StringView, QAnyStringView can hold
strings of any of the following encodings: UTF-8, UTF-16, and
- Latin-1. The latter is supported to keep old source working
- efficiently. It is expected that by Qt 7, the Latin-1 support will
- be removed.
+ Latin-1. The latter is supported because Latin-1, unlike UTF-8,
+ can be efficiently compared to UTF-16 data: a length mismatch
+ already means the strings cannot be equal. This is not true for
+ UTF-8/UTF-16 comparisons, because UTF-8 is a variable-length
+ encoding.
The string may be represented as an array (or an array-compatible
data-structure such as QString, std::basic_string, etc.) of \c
@@ -60,14 +50,19 @@
When used as an interface type, QAnyStringView allows a single
function to accept a wide variety of string data sources. One
function accepting QAnyStringView thus replaces five function
- overloads (taking QString, \c{(const QChar*, int)},
- QUtf8StringView, QLatin1String (but see above), and QChar), while
+ overloads (taking QString, \c{(const QChar*, qsizetype)},
+ QUtf8StringView, QLatin1StringView (but see above), and QChar), while
at the same time enabling even more string data sources to be
passed to the function, such as \c{u8"Hello World"}, a \c char8_t
string literal.
Like elsewhere in Qt, QAnyStringView assumes \c char data is encoded
- in UTF-8, unless it is presented as a QLatin1String.
+ in UTF-8, unless it is presented as a QLatin1StringView.
+
+ Since Qt 6.4, however, UTF-8 string literals that are pure US-ASCII are
+ automatically stored as Latin-1. This is a compile-time check with no
+ runtime overhead. The feature requires compiling in C++20, or with a recent
+ GCC.
QAnyStringViews should be passed by value, not by reference-to-const:
\snippet code/src_corelib_text_qanystringview.cpp 0
@@ -97,13 +92,13 @@
\endlist
The 8-bit character types are interpreted as UTF-8 data (except when
- presented as a QLatin1String) while the 16-bit character types are
+ presented as a QLatin1StringView) while the 16-bit character types are
interpreted as UTF-16 data in host byte order (the same as QString).
\section2 Sizes and Sub-Strings
All sizes and positions in QAnyStringView functions are in the
- encoding's code points (that is, UTF-16 surrogate pairs count as
+ encoding's code units (that is, UTF-16 surrogate pairs count as
two for the purposes of these functions, the same as in QString,
and UTF-8 multibyte sequences count as two, three or four,
depending on their length).
@@ -140,7 +135,7 @@
*/
/*!
- \fn template <typename Char> QAnyStringView::QAnyStringView(const Char *str, qsizetype len)
+ \fn template <typename Char, QAnyStringView::if_compatible_char<Char> = true> QAnyStringView::QAnyStringView(const Char *str, qsizetype len)
Constructs a string view on \a str with length \a len.
@@ -157,7 +152,7 @@
*/
/*!
- \fn template <typename Char> QAnyStringView::QAnyStringView(const Char *first, const Char *last)
+ \fn template <typename Char, QAnyStringView::if_compatible_char<Char> = true> QAnyStringView::QAnyStringView(const Char *first, const Char *last)
Constructs a string view on \a first with length (\a last - \a first).
@@ -232,6 +227,23 @@
*/
/*!
+ \fn template <typename Container, QAnyStringView::if_compatible_container<Container>> QAnyStringView::QAnyStringView(const Container &str)
+
+ Constructs a string view on \a str. The length is taken from \c{std::size(str)}.
+
+ \c{std::data(str)} must remain valid for the lifetime of this string view object.
+
+ This constructor only participates in overload resolution if \c Container is a
+ container with a compatible character type as \c{value_type}.
+
+ The string view will be empty if and only if \c{std::size(str) == 0}. It is unspecified
+ whether this constructor can result in a null string view (\c{std::data(str)} would
+ have to return \nullptr for this).
+
+ \sa isNull(), isEmpty()
+*/
+
+/*!
\fn template <typename Char, size_t Size> static QAnyStringView fromArray(const Char (&string)[Size]) noexcept
Constructs a string view on the full character string literal \a string,
@@ -321,7 +333,7 @@
*/
/*!
- \fn int QAnyStringView::length() const
+ \fn QAnyStringView::length() const
Same as size().
@@ -357,9 +369,217 @@
*/
/*!
+ \fn QAnyStringView::mid(qsizetype pos, qsizetype n) const
+ \since 6.5
+
+ Returns the substring of length \a n starting at position
+ \a pos in this object.
+
+ \deprecated Use sliced() instead in new code.
+
+ Returns an empty string view if \a n exceeds the
+ length of the string view. If there are less than \a n code points
+ available in the string view starting at \a pos, or if
+ \a n is negative (default), the function returns all code points that
+ are available from \a pos.
+
+ \sa first(), last(), sliced(), chopped(), chop(), truncate(), {Sizes and Sub-Strings}
+*/
+
+/*!
+ \fn QAnyStringView::left(qsizetype n) const
+ \since 6.5
+
+ \deprecated Use first() instead in new code.
+
+ Returns the substring of length \a n starting at position
+ 0 in this object.
+
+ The entire string view is returned if \a n is greater than or equal
+ to size(), or less than zero.
+
+ \sa first(), last(), sliced(), chopped(), chop(), truncate(), {Sizes and Sub-Strings}
+*/
+
+/*!
+ \fn QAnyStringView::right(qsizetype n) const
+ \since 6.5
+
+ \deprecated Use last() instead in new code.
+
+ Returns the substring of length \a n starting at position
+ size() - \a n in this object.
+
+ The entire string view is returned if \a n is greater than or equal
+ to size(), or less than zero.
+
+ \sa first(), last(), sliced(), chopped(), chop(), truncate(), {Sizes and Sub-Strings}
+*/
+
+/*!
+ \fn QAnyStringView::first(qsizetype n) const
+ \since 6.5
+
+ Returns a string view that contains the first \a n code points
+ of this string view.
+
+ \note The behavior is undefined when \a n < 0 or \a n > size().
+
+ \sa last(), sliced(), chopped(), chop(), truncate(), {Sizes and Sub-Strings}
+*/
+
+/*!
+ \fn QAnyStringView::last(qsizetype n) const
+ \since 6.5
+
+ Returns a string view that contains the last \a n code points of this string view.
+
+ \note The behavior is undefined when \a n < 0 or \a n > size().
+
+ \sa first(), sliced(), chopped(), chop(), truncate(), {Sizes and Sub-Strings}
+*/
+
+/*!
+ \fn QAnyStringView::sliced(qsizetype pos, qsizetype n) const
+ \since 6.5
+
+ Returns a string view containing \a n code points of this string view,
+ starting at position \a pos.
+
+//! [UB-sliced-index-length]
+ \note The behavior is undefined when \a pos < 0, \a n < 0,
+ or \a pos + \a n > size().
+//! [UB-sliced-index-length]
+
+ \sa first(), last(), chopped(), chop(), truncate(), {Sizes and Sub-Strings}
+*/
+
+/*!
+ \fn QAnyStringView::sliced(qsizetype pos) const
+ \since 6.5
+
+ Returns a string view starting at position \a pos in this object,
+ and extending to its end.
+
+//! [UB-sliced-index-only]
+ \note The behavior is undefined when \a pos < 0 or \a pos > size().
+//! [UB-sliced-index-only]
+
+ \sa first(), last(), chopped(), chop(), truncate(), {Sizes and Sub-Strings}
+*/
+
+/*!
+ \fn QAnyStringView::chopped(qsizetype n) const
+ \since 6.5
+
+ Returns the substring of length size() - \a n starting at the
+ beginning of this object.
+
+ Same as \c{first(size() - n)}.
+
+ \note The behavior is undefined when \a n < 0 or \a n > size().
+
+ \sa sliced(), first(), last(), chop(), truncate(), {Sizes and Sub-Strings}
+*/
+
+/*!
+ \fn QAnyStringView::truncate(qsizetype n)
+ \since 6.5
+
+ Truncates this string view to \a n code points.
+
+ Same as \c{*this = first(n)}.
+
+ \note The behavior is undefined when \a n < 0 or \a n > size().
+
+ \sa sliced(), first(), last(), chopped(), chop(), {Sizes and Sub-Strings}
+*/
+
+/*!
+ \fn QAnyStringView::chop(qsizetype n)
+ \since 6.5
+
+ Truncates this string view by \a n code points.
+
+ Same as \c{*this = first(size() - n)}.
+
+ \note The behavior is undefined when \a n < 0 or \a n > size().
+
+ \sa sliced(), first(), last(), chopped(), truncate(), {Sizes and Sub-Strings}
+*/
+
+/*! \fn template <typename Visitor> decltype(auto) QAnyStringView::visit(Visitor &&v) const
+
+ Calls \a v with either a QUtf8StringView, QLatin1String, or QStringView, depending
+ on the encoding of the string data this string-view references.
+
+ This is how most functions taking QAnyStringView fork off into per-encoding
+ functions:
+
+ \code
+ void processImpl(QLatin1String s) { ~~~ }
+ void processImpl(QUtf8StringView s) { ~~~ }
+ void processImpl(QStringView s) { ~~~ }
+
+ void process(QAnyStringView s)
+ {
+ s.visit([](auto s) { processImpl(s); });
+ }
+ \endcode
+
+ Here, we're reusing the same name, \c s, for both the QAnyStringView
+ object, as well as the lambda's parameter. This is idiomatic code and helps
+ track the identity of the objects through visit() calls, for example in more
+ complex situations such as
+
+ \code
+ bool equal(QAnyStringView lhs, QAnyStringView rhs)
+ {
+ // assuming operator==(QAnyStringView, QAnyStringView) didn't, yet, exist:
+ return lhs.visit([rhs](auto lhs) {
+ rhs.visit([lhs](auto rhs) {
+ return lhs == rhs;
+ });
+ });
+ }
+ \endcode
+
+ visit() requires that all lambda instantiations have the same return type.
+ If they differ, you get a compile error, even if there is a common type. To
+ fix, you can use explicit return types on the lambda, or cast in the return
+ statements:
+
+ \code
+ // wrong:
+ QAnyStringView firstHalf(QAnyStringView input)
+ {
+ return input.visit([](auto input) { // ERROR: lambdas return different types
+ return input.sliced(0, input.size() / 2);
+ });
+ }
+ // correct:
+ QAnyStringView firstHalf(QAnyStringView input)
+ {
+ return input.visit([](auto input) -> QAnyStringView { // OK, explicit return type
+ return input.sliced(0, input.size() / 2);
+ });
+ }
+ // also correct:
+ QAnyStringView firstHalf(QAnyStringView input)
+ {
+ return input.visit([](auto input) {
+ return QAnyStringView(input.sliced(0, input.size() / 2)); // OK, cast to common type
+ });
+ }
+ \endcode
+*/
+
+/*!
\fn QAnyStringView::compare(QAnyStringView lhs, QAnyStringView rhs, Qt::CaseSensitivity cs)
- Returns an integer that compares to zero as \a lhs compares to \a rhs.
+ Compares the string view \a lhs with the string view \a rhs and returns a
+ negative integer if \a lhs is less than \a rhs, a positive integer if it is
+ greater than \a rhs, and zero if they are equal.
If \a cs is Qt::CaseSensitive (the default), the comparison is case sensitive;
otherwise the comparison is case-insensitive.
@@ -368,12 +588,12 @@
*/
/*!
- \fn bool QAnyStringView::operator==(QAnyStringView lhs, QAnyStringView rhs)
- \fn bool QAnyStringView::operator!=(QAnyStringView lhs, QAnyStringView rhs)
- \fn bool QAnyStringView::operator<=(QAnyStringView lhs, QAnyStringView rhs)
- \fn bool QAnyStringView::operator>=(QAnyStringView lhs, QAnyStringView rhs)
- \fn bool QAnyStringView::operator<(QAnyStringView lhs, QAnyStringView rhs)
- \fn bool QAnyStringView::operator>(QAnyStringView lhs, QAnyStringView rhs)
+ \fn bool QAnyStringView::operator==(const QAnyStringView &lhs, const QAnyStringView & rhs)
+ \fn bool QAnyStringView::operator!=(const QAnyStringView & lhs, const QAnyStringView & rhs)
+ \fn bool QAnyStringView::operator<=(const QAnyStringView & lhs, const QAnyStringView & rhs)
+ \fn bool QAnyStringView::operator>=(const QAnyStringView & lhs, const QAnyStringView & rhs)
+ \fn bool QAnyStringView::operator<(const QAnyStringView & lhs, const QAnyStringView & rhs)
+ \fn bool QAnyStringView::operator>(const QAnyStringView & lhs, const QAnyStringView & rhs)
Operators that compare \a lhs to \a rhs.
@@ -395,3 +615,46 @@
\sa QString::isNull(), QAnyStringView
*/
+/*!
+ \fn QAnyStringView::operator<<(QDebug d, QAnyStringView s)
+ \since 6.7
+ \relates QDebug
+
+ Outputs \a s to debug stream \a d.
+
+ If \c{d.quotedString()} is \c true, indicates which encoding the string is
+ in. If you just want the string data, use visit() like this:
+
+ \code
+ s.visit([&d) (auto s) { d << s; });
+ \endcode
+
+ \sa QAnyStringView::visit()
+*/
+QDebug operator<<(QDebug d, QAnyStringView s)
+{
+ struct S { const char *prefix, *suffix; };
+ const auto affixes = s.visit([](auto s) {
+ using View = decltype(s);
+ if constexpr (std::is_same_v<View, QLatin1StringView>) {
+ return S{"", "_L1"};
+ } else if constexpr (std::is_same_v<View, QUtf8StringView>) {
+ return S{"u8", ""};
+ } else if constexpr (std::is_same_v<View, QStringView>) {
+ return S{"u", ""};
+ } else {
+ static_assert(QtPrivate::type_dependent_false<View>());
+ }
+ });
+ const QDebugStateSaver saver(d);
+ d.nospace();
+ if (d.quoteStrings())
+ d << affixes.prefix;
+ s.visit([&d](auto s) { d << s; });
+ if (d.quoteStrings())
+ d << affixes.suffix;
+ return d;
+}
+
+
+QT_END_NAMESPACE
diff --git a/src/corelib/text/qanystringview.h b/src/corelib/text/qanystringview.h
index 774651cb6a..01efd83743 100644
--- a/src/corelib/text/qanystringview.h
+++ b/src/corelib/text/qanystringview.h
@@ -1,56 +1,33 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2022 The Qt Company Ltd.
+// Copyright (C) 2020 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QANYSTRINGVIEW_H
#define QANYSTRINGVIEW_H
+#include <QtCore/qcompare.h>
+#include <QtCore/qlatin1stringview.h>
#include <QtCore/qstringview.h>
#include <QtCore/qutf8stringview.h>
#ifdef __cpp_impl_three_way_comparison
#include <compare>
#endif
+#include <QtCore/q20type_traits.h>
#include <limits>
+class tst_QAnyStringView;
+
QT_BEGIN_NAMESPACE
-template <typename, typename> class QStringBuilder;
-template <typename> struct QConcatenable;
+namespace QtPrivate {
+
+template <typename Tag, typename Result>
+struct wrapped { using type = Result; };
+
+template <typename Tag, typename Result>
+using wrapped_t = typename wrapped<Tag, Result>::type;
+
+} // namespace QtPrivate
class QAnyStringView
{
@@ -58,6 +35,32 @@ public:
typedef qptrdiff difference_type;
typedef qsizetype size_type;
private:
+ static constexpr size_t SizeMask = (std::numeric_limits<size_t>::max)() / 4;
+#if QT_VERSION >= QT_VERSION_CHECK(7, 0, 0) || defined(QT_BOOTSTRAPPED)
+ static constexpr int SizeShift = 2;
+ static constexpr size_t Latin1Flag = 1;
+#else
+ static constexpr int SizeShift = 0;
+ static constexpr size_t Latin1Flag = SizeMask + 1;
+#endif
+ static constexpr size_t TwoByteCodePointFlag = Latin1Flag << 1;
+ static constexpr size_t TypeMask = ~(SizeMask << SizeShift);
+ static_assert(TypeMask == (Latin1Flag|TwoByteCodePointFlag));
+
+ // Tag bits
+ // 0 0 Utf8
+ // 0 1 Latin1
+ // 1 0 Utf16
+ // 1 1 Unused
+ // ^ ^ latin1
+ // | sizeof code-point == 2
+ enum Tag : size_t {
+ Utf8 = 0,
+ Latin1 = Latin1Flag,
+ Utf16 = TwoByteCodePointFlag,
+ Unused = TypeMask,
+ };
+
template <typename Char>
using if_compatible_char = std::enable_if_t<std::disjunction_v<
QtPrivate::IsCompatibleCharType<Char>,
@@ -77,51 +80,66 @@ private:
QtPrivate::IsContainerCompatibleWithQUtf8StringView<T>
>, bool>;
+ template <typename QStringOrQByteArray, typename T>
+ using if_convertible_to = std::enable_if_t<std::conjunction_v<
+ // need to exclude a bunch of stuff, because we take by universal reference:
+ std::negation<std::disjunction<
+ std::is_same<q20::remove_cvref_t<T>, QAnyStringView::Tag>,
+ std::is_same<q20::remove_cvref_t<T>, QAnyStringView>, // don't make a copy/move ctor
+ std::is_pointer<std::decay_t<T>>, // const char*, etc
+ std::is_same<q20::remove_cvref_t<T>, QByteArray>,
+ std::is_same<q20::remove_cvref_t<T>, QString>
+ >>,
+ // this is what we're really after:
+ std::is_convertible<T, QStringOrQByteArray>
+ >, bool>;
+
// confirm we don't make an accidental copy constructor:
static_assert(QtPrivate::IsContainerCompatibleWithQStringView<QAnyStringView>::value == false);
static_assert(QtPrivate::IsContainerCompatibleWithQUtf8StringView<QAnyStringView>::value == false);
- template <typename Char>
- static constexpr std::size_t encodeType(qsizetype sz) noexcept
+ template<typename Char>
+ static constexpr bool isAsciiOnlyCharsAtCompileTime(Char *str, qsizetype sz) noexcept
+ {
+ // do not perform check if not at compile time
+ if (!q20::is_constant_evaluated())
+ return false;
+ if constexpr (sizeof(Char) != sizeof(char)) {
+ Q_UNUSED(str);
+ Q_UNUSED(sz);
+ return false;
+ } else {
+ for (qsizetype i = 0; i < sz; ++i) {
+ if (uchar(str[i]) > 0x7f)
+ return false;
+ }
+ return true;
+ }
+ }
+
+ template<typename Char>
+ static constexpr std::size_t encodeType(const Char *str, qsizetype sz) noexcept
{
- // only deals with Utf8 and Utf16 - there's only one way to create
- // a Latin1 string, and that ctor deals with the tag itself
+ // Utf16 if 16 bit, Latin1 if ASCII, else Utf8
Q_ASSERT(sz >= 0);
Q_ASSERT(sz <= qsizetype(SizeMask));
- return std::size_t(sz) | uint(sizeof(Char) == sizeof(char16_t)) * Tag::Utf16;
+ Q_ASSERT(str || !sz);
+ return (std::size_t(sz) << SizeShift)
+ | uint(sizeof(Char) == sizeof(char16_t)) * Tag::Utf16
+ | uint(isAsciiOnlyCharsAtCompileTime(str, sz)) * Tag::Latin1;
}
template <typename Char>
- static qsizetype lengthHelperPointer(const Char *str) noexcept
+ static constexpr qsizetype lengthHelperPointer(const Char *str) noexcept
{
-#if defined(Q_CC_GNU) && !defined(Q_CC_CLANG) && !defined(Q_CC_INTEL)
- if (__builtin_constant_p(*str)) {
- qsizetype result = 0;
- while (*str++ != u'\0')
- ++result;
- return result;
- }
-#endif
+ if (q20::is_constant_evaluated())
+ return qsizetype(std::char_traits<Char>::length(str));
if constexpr (sizeof(Char) == sizeof(char16_t))
return QtPrivate::qustrlen(reinterpret_cast<const char16_t*>(str));
else
return qsizetype(strlen(reinterpret_cast<const char*>(str)));
}
- template <typename Container>
- static constexpr qsizetype lengthHelperContainer(const Container &c) noexcept
- {
- return qsizetype(std::size(c));
- }
-
- template <typename Char, size_t N>
- static constexpr qsizetype lengthHelperContainer(const Char (&str)[N]) noexcept
- {
- const auto it = std::char_traits<Char>::find(str, N, Char(0));
- const auto end = it ? it : std::next(str, N);
- return qsizetype(std::distance(str, end));
- }
-
static QChar toQChar(char ch) noexcept { return toQChar(QLatin1Char{ch}); } // we don't handle UTF-8 multibytes
static QChar toQChar(QChar ch) noexcept { return ch; }
static QChar toQChar(QLatin1Char ch) noexcept { return ch; }
@@ -136,14 +154,15 @@ public:
template <typename Char, if_compatible_char<Char> = true>
constexpr QAnyStringView(const Char *str, qsizetype len)
- : m_data{str},
- m_size{encodeType<Char>((Q_ASSERT(len >= 0), Q_ASSERT(str || !len), len))} {}
+ : m_data{str}, m_size{encodeType<Char>(str, len)}
+ {
+ }
template <typename Char, if_compatible_char<Char> = true>
constexpr QAnyStringView(const Char *f, const Char *l)
: QAnyStringView(f, l - f) {}
-#ifdef Q_CLANG_QDOC
+#ifdef Q_QDOC
template <typename Char, size_t N>
constexpr QAnyStringView(const Char (&array)[N]) noexcept;
@@ -159,16 +178,21 @@ public:
// defined in qstring.h
inline QAnyStringView(const QByteArray &str) noexcept; // TODO: Should we have this at all? Remove?
inline QAnyStringView(const QString &str) noexcept;
- inline constexpr QAnyStringView(QLatin1String str) noexcept;
-
- // defined in qstringbuilder.h
- template <typename A, typename B>
- inline QAnyStringView(const QStringBuilder<A, B> &expr,
- typename QConcatenable<QStringBuilder<A, B>>::ConvertTo &&capacity = {});
+ inline constexpr QAnyStringView(QLatin1StringView str) noexcept;
template <typename Container, if_compatible_container<Container> = true>
- constexpr QAnyStringView(const Container &c) noexcept
- : QAnyStringView(std::data(c), lengthHelperContainer(c)) {}
+ constexpr Q_ALWAYS_INLINE QAnyStringView(const Container &c) noexcept
+ : QAnyStringView(std::data(c), QtPrivate::lengthHelperContainer(c)) {}
+
+ template <typename Container, if_convertible_to<QString, Container> = true>
+ constexpr QAnyStringView(Container &&c, QtPrivate::wrapped_t<Container, QString> &&capacity = {})
+ //noexcept(std::is_nothrow_constructible_v<QString, Container>)
+ : QAnyStringView(capacity = std::forward<Container>(c)) {}
+
+ template <typename Container, if_convertible_to<QByteArray, Container> = true>
+ constexpr QAnyStringView(Container &&c, QtPrivate::wrapped_t<Container, QByteArray> &&capacity = {})
+ //noexcept(std::is_nothrow_constructible_v<QByteArray, Container>)
+ : QAnyStringView(capacity = std::forward<Container>(c)) {}
template <typename Char, if_compatible_char<Char> = true>
constexpr QAnyStringView(const Char &c) noexcept
@@ -182,11 +206,11 @@ public:
: QAnyStringView(capacity = QChar::fromUcs4(c)) {}
constexpr QAnyStringView(QStringView v) noexcept
- : QAnyStringView(std::data(v), lengthHelperContainer(v)) {}
+ : QAnyStringView(std::data(v), QtPrivate::lengthHelperContainer(v)) {}
template <bool UseChar8T>
constexpr QAnyStringView(QBasicUtf8StringView<UseChar8T> v) noexcept
- : QAnyStringView(std::data(v), lengthHelperContainer(v)) {}
+ : QAnyStringView(std::data(v), QtPrivate::lengthHelperContainer(v)) {}
template <typename Char, size_t Size, if_compatible_char<Char> = true>
[[nodiscard]] constexpr static QAnyStringView fromArray(const Char (&string)[Size]) noexcept
@@ -196,14 +220,62 @@ public:
template <typename Visitor>
inline constexpr decltype(auto) visit(Visitor &&v) const;
+ [[nodiscard]]
+ constexpr QAnyStringView mid(qsizetype pos, qsizetype n = -1) const
+ {
+ using namespace QtPrivate;
+ auto result = QContainerImplHelper::mid(size(), &pos, &n);
+ return result == QContainerImplHelper::Null ? QAnyStringView() : sliced(pos, n);
+ }
+ [[nodiscard]]
+ constexpr QAnyStringView left(qsizetype n) const
+ {
+ if (size_t(n) >= size_t(size()))
+ n = size();
+ return sliced(0, n);
+ }
+ [[nodiscard]]
+ constexpr QAnyStringView right(qsizetype n) const
+ {
+ if (size_t(n) >= size_t(size()))
+ n = size();
+ return sliced(size() - n, n);
+ }
+
+ [[nodiscard]] constexpr QAnyStringView sliced(qsizetype pos) const
+ { verify(pos, 0); auto r = *this; r.advanceData(pos); r.setSize(size() - pos); return r; }
+ [[nodiscard]] constexpr QAnyStringView sliced(qsizetype pos, qsizetype n) const
+ { verify(pos, n); auto r = *this; r.advanceData(pos); r.setSize(n); return r; }
+ [[nodiscard]] constexpr QAnyStringView first(qsizetype n) const
+ { verify(0, n); return sliced(0, n); }
+ [[nodiscard]] constexpr QAnyStringView last(qsizetype n) const
+ { verify(0, n); return sliced(size() - n, n); }
+ [[nodiscard]] constexpr QAnyStringView chopped(qsizetype n) const
+ { verify(0, n); return sliced(0, size() - n); }
+
+ constexpr void truncate(qsizetype n)
+ { verify(0, n); setSize(n); }
+ constexpr void chop(qsizetype n)
+ { verify(0, n); setSize(size() - n); }
+
+
[[nodiscard]] inline QString toString() const; // defined in qstring.h
- [[nodiscard]] constexpr qsizetype size() const noexcept { return qsizetype(m_size & SizeMask); }
+ [[nodiscard]] constexpr qsizetype size() const noexcept
+ { return qsizetype((m_size >> SizeShift) & SizeMask); }
[[nodiscard]] constexpr const void *data() const noexcept { return m_data; }
[[nodiscard]] Q_CORE_EXPORT static int compare(QAnyStringView lhs, QAnyStringView rhs, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
[[nodiscard]] Q_CORE_EXPORT static bool equal(QAnyStringView lhs, QAnyStringView rhs) noexcept;
+ static constexpr inline bool detects_US_ASCII_at_compile_time =
+#ifdef QT_SUPPORTS_IS_CONSTANT_EVALUATED
+ true
+#else
+ false
+#endif
+ ;
+
//
// STL compatibility API:
//
@@ -222,47 +294,20 @@ public:
{ return size(); }
private:
- [[nodiscard]] friend inline bool operator==(QAnyStringView lhs, QAnyStringView rhs) noexcept
+ friend bool comparesEqual(const QAnyStringView &lhs, const QAnyStringView &rhs) noexcept
{ return QAnyStringView::equal(lhs, rhs); }
- [[nodiscard]] friend inline bool operator!=(QAnyStringView lhs, QAnyStringView rhs) noexcept
- { return !QAnyStringView::equal(lhs, rhs); }
+ friend Qt::strong_ordering
+ compareThreeWay(const QAnyStringView &lhs, const QAnyStringView &rhs) noexcept
+ {
+ const int res = QAnyStringView::compare(lhs, rhs);
+ return Qt::compareThreeWay(res, 0);
+ }
+ Q_DECLARE_STRONGLY_ORDERED(QAnyStringView)
-#if defined(__cpp_impl_three_way_comparison) && !defined(Q_QDOC)
- [[nodiscard]] friend inline auto operator<=>(QAnyStringView lhs, QAnyStringView rhs) noexcept
- { return QAnyStringView::compare(lhs, rhs) <=> 0; }
-#else
- [[nodiscard]] friend inline bool operator<=(QAnyStringView lhs, QAnyStringView rhs) noexcept
- { return QAnyStringView::compare(lhs, rhs) <= 0; }
- [[nodiscard]] friend inline bool operator>=(QAnyStringView lhs, QAnyStringView rhs) noexcept
- { return QAnyStringView::compare(lhs, rhs) >= 0; }
- [[nodiscard]] friend inline bool operator<(QAnyStringView lhs, QAnyStringView rhs) noexcept
- { return QAnyStringView::compare(lhs, rhs) < 0; }
- [[nodiscard]] friend inline bool operator>(QAnyStringView lhs, QAnyStringView rhs) noexcept
- { return QAnyStringView::compare(lhs, rhs) > 0; }
+#ifndef QT_NO_DEBUG_STREAM
+ Q_CORE_EXPORT friend QDebug operator<<(QDebug d, QAnyStringView s);
#endif
- // TODO: Optimize by inverting and storing the flags in the low bits and
- // the size in the high.
- static_assert(std::is_same_v<std::size_t, size_t>);
- static_assert(sizeof(size_t) == sizeof(qsizetype));
- static constexpr size_t SizeMask = (std::numeric_limits<size_t>::max)() / 4;
- static constexpr size_t Latin1Flag = SizeMask + 1;
- static constexpr size_t TwoByteCodePointFlag = Latin1Flag << 1;
- static constexpr size_t TypeMask = (std::numeric_limits<size_t>::max)() & ~SizeMask;
- static_assert(TypeMask == (Latin1Flag|TwoByteCodePointFlag));
- // HI HI LO LO ...
- // 0 0 SZ SZ Utf8
- // 0 1 SZ SZ Latin1
- // 1 0 SZ SZ Utf16
- // 1 1 SZ SZ Unused
- // ^ ^ latin1
- // | sizeof code-point == 2
- enum Tag : size_t {
- Utf8 = 0,
- Latin1 = Latin1Flag,
- Utf16 = TwoByteCodePointFlag,
- Unused = TypeMask,
- };
[[nodiscard]] constexpr Tag tag() const noexcept { return Tag{m_size & TypeMask}; }
[[nodiscard]] constexpr bool isUtf16() const noexcept { return tag() == Tag::Utf16; }
[[nodiscard]] constexpr bool isUtf8() const noexcept { return tag() == Tag::Utf8; }
@@ -271,9 +316,13 @@ private:
{ return Q_ASSERT(isUtf16()), QStringView{m_data_utf16, size()}; }
[[nodiscard]] constexpr q_no_char8_t::QUtf8StringView asUtf8StringView() const
{ return Q_ASSERT(isUtf8()), q_no_char8_t::QUtf8StringView{m_data_utf8, size()}; }
- [[nodiscard]] inline constexpr QLatin1String asLatin1StringView() const;
+ [[nodiscard]] inline constexpr QLatin1StringView asLatin1StringView() const;
[[nodiscard]] constexpr size_t charSize() const noexcept { return isUtf16() ? 2 : 1; }
- Q_ALWAYS_INLINE constexpr void verify(qsizetype pos, qsizetype n = 0) const
+ constexpr void setSize(qsizetype sz) noexcept { m_size = size_t(sz) | tag(); }
+ constexpr void advanceData(qsizetype delta) noexcept
+ { m_data_utf8 += delta * charSize(); }
+ Q_ALWAYS_INLINE constexpr void verify([[maybe_unused]] qsizetype pos = 0,
+ [[maybe_unused]] qsizetype n = 1) const
{
Q_ASSERT(pos >= 0);
Q_ASSERT(pos <= size());
@@ -286,6 +335,7 @@ private:
const char16_t *m_data_utf16;
};
size_t m_size;
+ friend class ::tst_QAnyStringView;
};
Q_DECLARE_TYPEINFO(QAnyStringView, Q_PRIMITIVE_TYPE);
@@ -294,7 +344,7 @@ template <typename QStringLike, std::enable_if_t<std::disjunction_v<
std::is_same<QStringLike, QByteArray>
>, bool> = true>
[[nodiscard]] inline QAnyStringView qToAnyStringViewIgnoringNull(const QStringLike &s) noexcept
-{ return QAnyStringView(s.data(), s.size()); }
+{ return QAnyStringView(s.begin(), s.size()); }
QT_END_NAMESPACE
diff --git a/src/corelib/text/qbytearray.cpp b/src/corelib/text/qbytearray.cpp
index 03fbe2b139..e6387e4bed 100644
--- a/src/corelib/text/qbytearray.cpp
+++ b/src/corelib/text/qbytearray.cpp
@@ -1,43 +1,7 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Copyright (C) 2016 Intel Corporation.
-** Copyright (C) 2019 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2022 The Qt Company Ltd.
+// Copyright (C) 2016 Intel Corporation.
+// Copyright (C) 2019 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qbytearray.h"
#include "qbytearraymatcher.h"
@@ -50,25 +14,36 @@
#include "private/qsimd_p.h"
#include "qstringalgorithms_p.h"
#include "qscopedpointer.h"
-#include "qbytearray_p.h"
#include "qstringconverter_p.h"
#include <qdatastream.h>
#include <qmath.h>
+#if defined(Q_OS_WASM)
+#include "private/qstdweb_p.h"
+#endif
#ifndef QT_NO_COMPRESS
#include <zconf.h>
#include <zlib.h>
+#include <qxpfunctional.h>
#endif
#include <ctype.h>
#include <limits.h>
#include <string.h>
#include <stdlib.h>
-#define IS_RAW_DATA(d) ((d)->flags() & QArrayData::RawDataType)
+#include <algorithm>
+
+#ifdef Q_OS_WIN
+# if !defined(QT_BOOTSTRAPPED) && (defined(QT_NO_CAST_FROM_ASCII) || defined(QT_NO_CAST_FROM_BYTEARRAY))
+// MSVC requires this, but let's apply it to MinGW compilers too, just in case
+# error "This file cannot be compiled with QT_NO_CAST_{TO,FROM}_ASCII, " \
+ "otherwise some QByteArray functions will not get exported."
+# endif
+#endif
QT_BEGIN_NAMESPACE
-const char QByteArray::_empty = '\0';
+Q_CONSTINIT const char QByteArray::_empty = '\0';
// ASCII case system, used by QByteArray::to{Upper,Lower}() and qstr(n)icmp():
static constexpr inline uchar asciiUpper(uchar c)
@@ -144,31 +119,30 @@ char *qstrcpy(char *dst, const char *src)
A safe \c strncpy() function.
Copies at most \a len bytes from \a src (stopping at \a len or the
- terminating '\\0' whichever comes first) into \a dst and returns a
- pointer to \a dst. Guarantees that \a dst is '\\0'-terminated. If
- \a src or \a dst is \nullptr, returns \nullptr immediately.
+ terminating '\\0' whichever comes first) into \a dst. Guarantees that \a
+ dst is '\\0'-terminated, except when \a dst is \nullptr or \a len is 0. If
+ \a src is \nullptr, returns \nullptr, otherwise returns \a dst.
This function assumes that \a dst is at least \a len characters
long.
\note If \a dst and \a src overlap, the behavior is undefined.
+ \note Unlike strncpy(), this function does \e not write '\\0' to all \a
+ len bytes of \a dst, but stops after the terminating '\\0'. In this sense,
+ it's similar to C11's strncpy_s().
+
\sa qstrcpy()
*/
char *qstrncpy(char *dst, const char *src, size_t len)
{
- if (!src || !dst)
- return nullptr;
- if (len > 0) {
-#ifdef Q_CC_MSVC
- strncpy_s(dst, len, src, len - 1);
-#else
- strncpy(dst, src, len);
-#endif
- dst[len-1] = '\0';
+ if (dst && len > 0) {
+ *dst = '\0';
+ if (src)
+ std::strncat(dst, src, len - 1);
}
- return dst;
+ return src ? dst : nullptr;
}
/*! \fn size_t qstrlen(const char *str)
@@ -270,7 +244,7 @@ int qstricmp(const char *str1, const char *str2)
max += offset;
do {
uchar c = s1[offset];
- if (int res = asciiLower(c) - asciiLower(s2[offset]))
+ if (int res = QtMiscUtils::caseCompareAscii(c, s2[offset]))
return res;
if (!c)
return 0;
@@ -309,7 +283,7 @@ int qstricmp(const char *str1, const char *str2)
// yes, find out where
uint start = qCountTrailingZeroBits(mask);
uint end = sizeof(mask) * 8 - qCountLeadingZeroBits(mask);
- Q_ASSUME(end >= start);
+ Q_ASSERT(end >= start);
offset += start;
n = end - start;
break;
@@ -353,7 +327,7 @@ int qstrnicmp(const char *str1, const char *str2, size_t len)
return s1 ? 1 : (s2 ? -1 : 0);
for (; len--; ++s1, ++s2) {
const uchar c = *s1;
- if (int res = asciiLower(c) - asciiLower(*s2))
+ if (int res = QtMiscUtils::caseCompareAscii(c, *s2))
return res;
if (!c) // strings are equal
break;
@@ -394,7 +368,7 @@ int qstrnicmp(const char *str1, qsizetype len1, const char *str2, qsizetype len2
if (!c)
return 1;
- if (int res = asciiLower(s1[i]) - asciiLower(c))
+ if (int res = QtMiscUtils::caseCompareAscii(s1[i], c))
return res;
}
return s2[i] ? -1 : 0;
@@ -402,7 +376,7 @@ int qstrnicmp(const char *str1, qsizetype len1, const char *str2, qsizetype len2
// not null-terminated
const qsizetype len = qMin(len1, len2);
for (qsizetype i = 0; i < len; ++i) {
- if (int res = asciiLower(s1[i]) - asciiLower(s2[i]))
+ if (int res = QtMiscUtils::caseCompareAscii(s1[i], s2[i]))
return res;
}
if (len1 == len2)
@@ -542,7 +516,9 @@ quint16 qChecksum(QByteArrayView data, Qt::ChecksumType standard)
\sa qUncompress(const QByteArray &data)
*/
-/*! \relates QByteArray
+/*!
+ \fn QByteArray qCompress(const uchar* data, qsizetype nbytes, int compressionLevel)
+ \relates QByteArray
\overload
@@ -551,44 +527,196 @@ quint16 qChecksum(QByteArrayView data, Qt::ChecksumType standard)
*/
#ifndef QT_NO_COMPRESS
+using CompressSizeHint_t = quint32; // 32-bit BE, historically
+
+enum class ZLibOp : bool { Compression, Decompression };
+
+Q_DECL_COLD_FUNCTION
+static const char *zlibOpAsString(ZLibOp op)
+{
+ switch (op) {
+ case ZLibOp::Compression: return "qCompress";
+ case ZLibOp::Decompression: return "qUncompress";
+ }
+ Q_UNREACHABLE_RETURN(nullptr);
+}
+
+Q_DECL_COLD_FUNCTION
+static QByteArray zlibError(ZLibOp op, const char *what)
+{
+ qWarning("%s: %s", zlibOpAsString(op), what);
+ return QByteArray();
+}
+
+Q_DECL_COLD_FUNCTION
+static QByteArray dataIsNull(ZLibOp op)
+{
+ return zlibError(op, "Data is null");
+}
+
+Q_DECL_COLD_FUNCTION
+static QByteArray lengthIsNegative(ZLibOp op)
+{
+ return zlibError(op, "Input length is negative");
+}
+
+Q_DECL_COLD_FUNCTION
+static QByteArray tooMuchData(ZLibOp op)
+{
+ return zlibError(op, "Not enough memory");
+}
+
+Q_DECL_COLD_FUNCTION
+static QByteArray invalidCompressedData()
+{
+ return zlibError(ZLibOp::Decompression, "Input data is corrupted");
+}
+
+Q_DECL_COLD_FUNCTION
+static QByteArray unexpectedZlibError(ZLibOp op, int err, const char *msg)
+{
+ qWarning("%s unexpected zlib error: %s (%d)",
+ zlibOpAsString(op),
+ msg ? msg : "",
+ err);
+ return QByteArray();
+}
+
+static QByteArray xxflate(ZLibOp op, QArrayDataPointer<char> out, QByteArrayView input,
+ qxp::function_ref<int(z_stream *) const> init,
+ qxp::function_ref<int(z_stream *, size_t) const> processChunk,
+ qxp::function_ref<void(z_stream *) const> deinit)
+{
+ if (out.data() == nullptr) // allocation failed
+ return tooMuchData(op);
+ qsizetype capacity = out.allocatedCapacity();
+
+ const auto initalSize = out.size;
+
+ z_stream zs = {};
+ zs.next_in = reinterpret_cast<uchar *>(const_cast<char *>(input.data())); // 1980s C API...
+ if (const int err = init(&zs); err != Z_OK)
+ return unexpectedZlibError(op, err, zs.msg);
+ const auto sg = qScopeGuard([&] { deinit(&zs); });
+
+ using ZlibChunkSize_t = decltype(zs.avail_in);
+ static_assert(!std::is_signed_v<ZlibChunkSize_t>);
+ static_assert(std::is_same_v<ZlibChunkSize_t, decltype(zs.avail_out)>);
+ constexpr auto MaxChunkSize = std::numeric_limits<ZlibChunkSize_t>::max();
+ [[maybe_unused]]
+ constexpr auto MaxStatisticsSize = std::numeric_limits<decltype(zs.total_out)>::max();
+
+ size_t inputLeft = size_t(input.size());
+
+ int res;
+ do {
+ Q_ASSERT(out.freeSpaceAtBegin() == 0); // ensure prepend optimization stays out of the way
+ Q_ASSERT(capacity == out.allocatedCapacity());
+
+ if (zs.avail_out == 0) {
+ Q_ASSERT(size_t(out.size) - initalSize > MaxStatisticsSize || // total_out overflow
+ size_t(out.size) - initalSize == zs.total_out);
+ Q_ASSERT(out.size <= capacity);
+
+ qsizetype avail_out = capacity - out.size;
+ if (avail_out == 0) {
+ out->reallocateAndGrow(QArrayData::GrowsAtEnd, 1); // grow to next natural capacity
+ if (out.data() == nullptr) // reallocation failed
+ return tooMuchData(op);
+ capacity = out.allocatedCapacity();
+ avail_out = capacity - out.size;
+ }
+ zs.next_out = reinterpret_cast<uchar *>(out.data()) + out.size;
+ zs.avail_out = size_t(avail_out) > size_t(MaxChunkSize) ? MaxChunkSize
+ : ZlibChunkSize_t(avail_out);
+ out.size += zs.avail_out;
+
+ Q_ASSERT(zs.avail_out > 0);
+ }
+
+ if (zs.avail_in == 0) {
+ // zs.next_in is kept up-to-date by processChunk(), so nothing to do
+ zs.avail_in = inputLeft > MaxChunkSize ? MaxChunkSize : ZlibChunkSize_t(inputLeft);
+ inputLeft -= zs.avail_in;
+ }
+
+ res = processChunk(&zs, inputLeft);
+ } while (res == Z_OK);
+
+ switch (res) {
+ case Z_STREAM_END:
+ out.size -= zs.avail_out;
+ Q_ASSERT(size_t(out.size) - initalSize > MaxStatisticsSize || // total_out overflow
+ size_t(out.size) - initalSize == zs.total_out);
+ Q_ASSERT(out.size <= out.allocatedCapacity());
+ out.data()[out.size] = '\0';
+ return QByteArray(std::move(out));
+
+ case Z_MEM_ERROR:
+ return tooMuchData(op);
+
+ case Z_BUF_ERROR:
+ Q_UNREACHABLE(); // cannot happen - we supply a buffer that can hold the result,
+ // or else error out early
+
+ case Z_DATA_ERROR: // can only happen on decompression
+ Q_ASSERT(op == ZLibOp::Decompression);
+ return invalidCompressedData();
+
+ default:
+ return unexpectedZlibError(op, res, zs.msg);
+ }
+}
+
QByteArray qCompress(const uchar* data, qsizetype nbytes, int compressionLevel)
{
+ constexpr qsizetype HeaderSize = sizeof(CompressSizeHint_t);
if (nbytes == 0) {
- return QByteArray(4, '\0');
- }
- if (!data) {
- qWarning("qCompress: Data is null");
- return QByteArray();
+ return QByteArray(HeaderSize, '\0');
}
+ if (!data)
+ return dataIsNull(ZLibOp::Compression);
+
+ if (nbytes < 0)
+ return lengthIsNegative(ZLibOp::Compression);
+
if (compressionLevel < -1 || compressionLevel > 9)
compressionLevel = -1;
- ulong len = nbytes + nbytes / 100 + 13;
- QByteArray bazip;
- int res;
- do {
- bazip.resize(len + 4);
- res = ::compress2((uchar*)bazip.data()+4, &len, data, nbytes, compressionLevel);
-
- switch (res) {
- case Z_OK:
- bazip.resize(len + 4);
- bazip[0] = (nbytes & 0xff000000) >> 24;
- bazip[1] = (nbytes & 0x00ff0000) >> 16;
- bazip[2] = (nbytes & 0x0000ff00) >> 8;
- bazip[3] = (nbytes & 0x000000ff);
- break;
- case Z_MEM_ERROR:
- qWarning("qCompress: Z_MEM_ERROR: Not enough memory");
- bazip.resize(0);
- break;
- case Z_BUF_ERROR:
- len *= 2;
- break;
+ QArrayDataPointer out = [&] {
+ constexpr qsizetype SingleAllocLimit = 256 * 1024; // the maximum size for which we use
+ // zlib's compressBound() to guarantee
+ // the output buffer size is sufficient
+ // to hold result
+ qsizetype capacity = HeaderSize;
+ if (nbytes < SingleAllocLimit) {
+ // use maximum size
+ capacity += compressBound(uLong(nbytes)); // cannot overflow (both times)!
+ return QArrayDataPointer<char>(capacity);
}
- } while (res == Z_BUF_ERROR);
- return bazip;
+ // for larger buffers, assume it compresses optimally, and
+ // grow geometrically from there:
+ constexpr qsizetype MaxCompressionFactor = 1024; // max theoretical factor is 1032
+ // cf. http://www.zlib.org/zlib_tech.html,
+ // but use a nearby power-of-two (faster)
+ capacity += std::max(qsizetype(compressBound(uLong(SingleAllocLimit))),
+ nbytes / MaxCompressionFactor);
+ return QArrayDataPointer<char>(capacity, 0, QArrayData::Grow);
+ }();
+
+ if (out.data() == nullptr) // allocation failed
+ return tooMuchData(ZLibOp::Compression);
+
+ qToBigEndian(qt_saturate<CompressSizeHint_t>(nbytes), out.data());
+ out.size = HeaderSize;
+
+ return xxflate(ZLibOp::Compression, std::move(out), {data, nbytes},
+ [=] (z_stream *zs) { return deflateInit(zs, compressionLevel); },
+ [] (z_stream *zs, size_t inputLeft) {
+ return deflate(zs, inputLeft ? Z_NO_FLUSH : Z_FINISH);
+ },
+ [] (z_stream *zs) { deflateEnd(zs); });
}
#endif
@@ -610,18 +738,21 @@ QByteArray qCompress(const uchar* data, qsizetype nbytes, int compressionLevel)
data that was compressed using zlib, you first need to prepend a four
byte header to the byte array containing the data. The header must
contain the expected length (in bytes) of the uncompressed data,
- expressed as an unsigned, big-endian, 32-bit integer.
+ expressed as an unsigned, big-endian, 32-bit integer. This number is
+ just a hint for the initial size of the output buffer size,
+ though. If the indicated size is too small to hold the result, the
+ output buffer size will still be increased until either the output
+ fits or the system runs out of memory. So, despite the 32-bit
+ header, this function, on 64-bit platforms, can produce more than
+ 4GiB of output.
+
+ \note In Qt versions prior to Qt 6.5, more than 2GiB of data
+ worked unreliably; in Qt versions prior to Qt 6.0, not at all.
\sa qCompress()
*/
#ifndef QT_NO_COMPRESS
-static QByteArray invalidCompressedData()
-{
- qWarning("qUncompress: Input data is corrupted");
- return QByteArray();
-}
-
/*! \relates QByteArray
\overload
@@ -631,64 +762,39 @@ static QByteArray invalidCompressedData()
*/
QByteArray qUncompress(const uchar* data, qsizetype nbytes)
{
- if (!data) {
- qWarning("qUncompress: Data is null");
- return QByteArray();
- }
- if (nbytes <= 4) {
- if (nbytes < 4 || (data[0]!=0 || data[1]!=0 || data[2]!=0 || data[3]!=0))
- qWarning("qUncompress: Input data is corrupted");
- return QByteArray();
- }
- size_t expectedSize = size_t((data[0] << 24) | (data[1] << 16) |
- (data[2] << 8) | (data[3] ));
- size_t len = qMax(expectedSize, 1ul);
- const size_t maxPossibleSize = MaxAllocSize - sizeof(QByteArray::Data);
- if (Q_UNLIKELY(len >= maxPossibleSize)) {
- // QByteArray does not support that huge size anyway.
- return invalidCompressedData();
- }
+ if (!data)
+ return dataIsNull(ZLibOp::Decompression);
+
+ if (nbytes < 0)
+ return lengthIsNegative(ZLibOp::Decompression);
- QByteArray::DataPointer d(QByteArray::Data::allocate(len));
- if (Q_UNLIKELY(d.data() == nullptr))
+ constexpr qsizetype HeaderSize = sizeof(CompressSizeHint_t);
+ if (nbytes < HeaderSize)
return invalidCompressedData();
- forever {
- const auto alloc = len;
- int res = ::uncompress((uchar*)d.data(), reinterpret_cast<uLongf*>(&len),
- data+4, nbytes-4);
-
- switch (res) {
- case Z_OK: {
- Q_ASSERT(len <= alloc);
- Q_UNUSED(alloc);
- d.data()[len] = '\0';
- d.size = len;
- return QByteArray(d);
- }
+ const auto expectedSize = qFromBigEndian<CompressSizeHint_t>(data);
+ if (nbytes == HeaderSize) {
+ if (expectedSize != 0)
+ return invalidCompressedData();
+ return QByteArray();
+ }
- case Z_MEM_ERROR:
- qWarning("qUncompress: Z_MEM_ERROR: Not enough memory");
- return QByteArray();
+ constexpr auto MaxDecompressedSize = size_t(QByteArray::max_size());
+ if constexpr (MaxDecompressedSize < std::numeric_limits<CompressSizeHint_t>::max()) {
+ if (expectedSize > MaxDecompressedSize)
+ return tooMuchData(ZLibOp::Decompression);
+ }
- case Z_BUF_ERROR:
- len *= 2;
- if (Q_UNLIKELY(len >= maxPossibleSize)) {
- // QByteArray does not support that huge size anyway.
- return invalidCompressedData();
- } else {
- // grow the block
- d->reallocate(d->allocatedCapacity()*2, QArrayData::Grow);
- if (Q_UNLIKELY(d.data() == nullptr))
- return invalidCompressedData();
- }
- continue;
+ // expectedSize may be truncated, so always use at least nbytes
+ // (larger by at most 1%, according to zlib docs)
+ qsizetype capacity = std::max(qsizetype(expectedSize), // cannot overflow!
+ nbytes);
- case Z_DATA_ERROR:
- qWarning("qUncompress: Z_DATA_ERROR: Input data is corrupted");
- return QByteArray();
- }
- }
+ QArrayDataPointer<char> d(capacity);
+ return xxflate(ZLibOp::Decompression, std::move(d), {data + HeaderSize, nbytes - HeaderSize},
+ [] (z_stream *zs) { return inflateInit(zs); },
+ [] (z_stream *zs, size_t) { return inflate(zs, Z_NO_FLUSH); },
+ [] (z_stream *zs) { inflateEnd(zs); });
}
#endif
@@ -703,6 +809,14 @@ QByteArray qUncompress(const uchar* data, qsizetype nbytes)
\reentrant
+ \compares strong
+ \compareswith strong {const char *} QByteArrayView
+ \endcompareswith
+ \compareswith strong QChar char16_t QString QStringView QLatin1StringView \
+ QUtf8StringView
+ When comparing with string types, the content is interpreted as utf-8.
+ \endcompareswith
+
QByteArray can be used to store both raw bytes (including '\\0's)
and traditional 8-bit '\\0'-terminated strings. Using QByteArray
is much more convenient than using \c{const char *}. Behind the
@@ -927,8 +1041,8 @@ QByteArray qUncompress(const uchar* data, qsizetype nbytes)
comparison is limited to ASCII. Non-ASCII characters are treated as
caseless, since their case depends on encoding. This affects functions that
support a case insensitive option or that change the case of their
- arguments. Functions that this affects include contains(), indexOf(),
- lastIndexOf(), isLower(), isUpper(), toLower() and toUpper().
+ arguments. Functions that this affects include compare(), isLower(),
+ isUpper(), toLower() and toUpper().
This issue does not apply to \l{QString}s since they represent characters
using Unicode.
@@ -1172,6 +1286,22 @@ QByteArray::iterator QByteArray::erase(QByteArray::const_iterator first, QByteAr
return begin() + start;
}
+/*!
+ \fn QByteArray::iterator QByteArray::erase(QByteArray::const_iterator it)
+
+ \overload
+ \since 6.5
+
+ Removes the character denoted by \c it from the byte array.
+ Returns an iterator to the character immediately after the
+ erased character.
+
+ \code
+ QByteArray ba = "abcdefg";
+ auto it = ba.erase(ba.cbegin()); // ba is now "bcdefg" and it points to "b"
+ \endcode
+*/
+
/*! \fn QByteArray::QByteArray(const QByteArray &other)
Constructs a copy of \a other.
@@ -1219,6 +1349,9 @@ QByteArray &QByteArray::operator=(const QByteArray & other) noexcept
\overload
Assigns \a str to this byte array.
+
+ \a str is assumed to point to a null-terminated string, and its length is
+ determined dynamically.
*/
QByteArray &QByteArray::operator=(const char *str)
@@ -1228,14 +1361,7 @@ QByteArray &QByteArray::operator=(const char *str)
} else if (!*str) {
d = DataPointer::fromRawData(&_empty, 0);
} else {
- const qsizetype len = qsizetype(strlen(str));
- const auto capacityAtEnd = d->allocatedCapacity() - d.freeSpaceAtBegin();
- if (d->needsDetach() || len > capacityAtEnd
- || (len < size() && len < (capacityAtEnd >> 1)))
- // ### inefficient! reallocData() does copy the old data and we then overwrite it in the next line
- reallocData(len, QArrayData::KeepSize);
- memcpy(d.data(), str, len + 1); // include null terminator
- d.size = len;
+ assign(str);
}
return *this;
}
@@ -1273,6 +1399,15 @@ QByteArray &QByteArray::operator=(const char *str)
\sa isEmpty(), resize()
*/
+/*! \fn qsizetype QByteArray::max_size()
+ \since 6.8
+
+ This function is provided for STL compatibility.
+ It returns the maximum number of elements that the byte array can
+ theoretically hold. In practice, the number can be much smaller,
+ limited by the amount of memory available to the system.
+*/
+
/*! \fn bool QByteArray::isEmpty() const
Returns \c true if the byte array has size 0; otherwise returns \c false.
@@ -1686,7 +1821,7 @@ QByteArray::QByteArray(const char *data, qsizetype size)
if (!size) {
d = DataPointer::fromRawData(&_empty, 0);
} else {
- d = DataPointer(Data::allocate(size), size);
+ d = DataPointer(size, size);
Q_CHECK_PTR(d.data());
memcpy(d.data(), data, size);
d.data()[size] = '\0';
@@ -1705,7 +1840,7 @@ QByteArray::QByteArray(qsizetype size, char ch)
if (size <= 0) {
d = DataPointer::fromRawData(&_empty, 0);
} else {
- d = DataPointer(Data::allocate(size), size);
+ d = DataPointer(size, size);
Q_CHECK_PTR(d.data());
memset(d.data(), ch, size);
d.data()[size] = '\0';
@@ -1713,8 +1848,6 @@ QByteArray::QByteArray(qsizetype size, char ch)
}
/*!
- \internal
-
Constructs a byte array of size \a size with uninitialized contents.
*/
@@ -1723,7 +1856,7 @@ QByteArray::QByteArray(qsizetype size, Qt::Initialization)
if (size <= 0) {
d = DataPointer::fromRawData(&_empty, 0);
} else {
- d = DataPointer(Data::allocate(size), size);
+ d = DataPointer(size, size);
Q_CHECK_PTR(d.data());
d.data()[size] = '\0';
}
@@ -1758,6 +1891,46 @@ void QByteArray::resize(qsizetype size)
}
/*!
+ \since 6.4
+
+ Sets the size of the byte array to \a newSize bytes.
+
+ If \a newSize is greater than the current size, the byte array is
+ extended to make it \a newSize bytes with the extra bytes added to
+ the end. The new bytes are initialized to \a c.
+
+ If \a newSize is less than the current size, bytes beyond position
+ \a newSize are excluded from the byte array.
+
+ \note While resize() will grow the capacity if needed, it never shrinks
+ capacity. To shed excess capacity, use squeeze().
+
+ \sa size(), truncate(), squeeze()
+*/
+void QByteArray::resize(qsizetype newSize, char c)
+{
+ const auto old = d.size;
+ resize(newSize);
+ if (old < d.size)
+ memset(d.data() + old, c, d.size - old);
+}
+
+/*!
+ \since 6.8
+
+ Resizes the byte array to \a size bytes. If the size of the
+ byte array grows, the new bytes are uninitialized.
+
+ The behavior is identical to \c{resize(size)}.
+
+ \sa resize()
+*/
+void QByteArray::resizeForOverwrite(qsizetype size)
+{
+ resize(size);
+}
+
+/*!
Sets every byte in the byte array to \a ch. If \a size is different from -1
(the default), the byte array is resized to size \a size beforehand.
@@ -1787,7 +1960,7 @@ void QByteArray::reallocData(qsizetype alloc, QArrayData::AllocationOption optio
const bool cannotUseReallocate = d.freeSpaceAtBegin() > 0;
if (d->needsDetach() || cannotUseReallocate) {
- DataPointer dd(Data::allocate(alloc, option), qMin(alloc, d.size));
+ DataPointer dd(alloc, qMin(alloc, d.size), option);
Q_CHECK_PTR(dd.data());
if (dd.size > 0)
::memcpy(dd.data(), d.data(), dd.size);
@@ -1820,26 +1993,6 @@ void QByteArray::expand(qsizetype i)
}
/*!
- \internal
- Return a QByteArray that is sure to be '\\0'-terminated.
-
- By default, all QByteArray have an extra NUL at the end,
- guaranteeing that assumption. However, if QByteArray::fromRawData
- is used, then the NUL is there only if the user put it there. We
- can't be sure.
-*/
-QByteArray QByteArray::nulTerminated() const
-{
- // is this fromRawData?
- if (d.isMutable())
- return *this; // no, then we're sure we're zero terminated
-
- QByteArray copy(*this);
- copy.detach();
- return copy;
-}
-
-/*!
\fn QByteArray &QByteArray::prepend(QByteArrayView ba)
Prepends the byte array view \a ba to this byte array and returns a
@@ -1927,9 +2080,17 @@ QByteArray &QByteArray::prepend(const QByteArray &ba)
QByteArray &QByteArray::append(const QByteArray &ba)
{
- if (size() == 0 && ba.size() > d->freeSpaceAtEnd() && ba.d.isMutable())
- return (*this = ba);
- return append(QByteArrayView(ba));
+ if (!ba.isNull()) {
+ if (isNull()) {
+ if (Q_UNLIKELY(!ba.d.isMutable()))
+ assign(ba); // fromRawData, so we do a deep copy
+ else
+ operator=(ba);
+ } else if (ba.size()) {
+ append(QByteArrayView(ba));
+ }
+ }
+ return *this;
}
/*!
@@ -1988,6 +2149,73 @@ QByteArray& QByteArray::append(char ch)
}
/*!
+ \fn QByteArray &QByteArray::assign(QByteArrayView v)
+ \since 6.6
+
+ Replaces the contents of this byte array with a copy of \a v and returns a
+ reference to this byte array.
+
+ The size of this byte array will be equal to the size of \a v.
+
+ This function only allocates memory if the size of \a v exceeds the capacity
+ of this byte array or this byte array is shared.
+*/
+
+/*!
+ \fn QByteArray &QByteArray::assign(qsizetype n, char c)
+ \since 6.6
+
+ Replaces the contents of this byte array with \a n copies of \a c and
+ returns a reference to this byte array.
+
+ The size of this byte array will be equal to \a n, which has to be non-negative.
+
+ This function will only allocate memory if \a n exceeds the capacity of this
+ byte array or this byte array is shared.
+
+ \sa fill()
+*/
+
+/*!
+ \fn template <typename InputIterator, QByteArray::if_input_iterator<InputIterator>> QByteArray &QByteArray::assign(InputIterator first, InputIterator last)
+ \since 6.6
+
+ Replaces the contents of this byte array with a copy of the elements in the
+ iterator range [\a first, \a last) and returns a reference to this
+ byte array.
+
+ The size of this byte array will be equal to the number of elements in the
+ range [\a first, \a last).
+
+ This function will only allocate memory if the number of elements in the
+ range exceeds the capacity of this byte array or this byte array is shared.
+
+ \note This function overload only participates in overload resolution if
+ \c InputIterator meets the requirements of a
+ \l {https://en.cppreference.com/w/cpp/named_req/InputIterator} {LegacyInputIterator}.
+
+ \note The behavior is undefined if either argument is an iterator into *this or
+ [\a first, \a last) is not a valid range.
+*/
+
+QByteArray &QByteArray::assign(QByteArrayView v)
+{
+ const auto len = v.size();
+
+ if (len <= capacity() && isDetached()) {
+ const auto offset = d.freeSpaceAtBegin();
+ if (offset)
+ d.setBegin(d.begin() - offset);
+ std::memcpy(d.begin(), v.data(), len);
+ d.size = len;
+ d.data()[d.size] = '\0';
+ } else {
+ *this = v.toByteArray();
+ }
+ return *this;
+}
+
+/*!
Inserts \a data at index position \a i and returns a
reference to this byte array.
@@ -2029,7 +2257,7 @@ QByteArray &QByteArray::insert(qsizetype i, QByteArrayView data)
return *this;
}
- if (!d->needsDetach() && QtPrivate::q_points_into_range(str, d.data(), d.data() + d.size)) {
+ if (!d->needsDetach() && QtPrivate::q_points_into_range(str, d)) {
QVarLengthArray a(str, str + size);
return insert(i, a);
}
@@ -2134,15 +2362,56 @@ QByteArray &QByteArray::remove(qsizetype pos, qsizetype len)
{
if (len <= 0 || pos < 0 || size_t(pos) >= size_t(size()))
return *this;
- detach();
if (pos + len > d->size)
len = d->size - pos;
- d->erase(d.begin() + pos, len);
- d.data()[d.size] = '\0';
+
+ auto begin = d.begin();
+ if (!d->isShared()) {
+ d->erase(begin + pos, len);
+ d.data()[d.size] = '\0';
+ } else {
+ QByteArray copy{size() - len, Qt::Uninitialized};
+ const auto toRemove_start = d.begin() + pos;
+ copy.d->copyRanges({{d.begin(), toRemove_start},
+ {toRemove_start + len, d.end()}});
+ swap(copy);
+ }
return *this;
}
/*!
+ \fn QByteArray &QByteArray::removeAt(qsizetype pos)
+
+ \since 6.5
+
+ Removes the character at index \a pos. If \a pos is out of bounds
+ (i.e. \a pos >= size()) this function does nothing.
+
+ \sa remove()
+*/
+
+/*!
+ \fn QByteArray &QByteArray::removeFirst()
+
+ \since 6.5
+
+ Removes the first character in this byte array. If the byte array is empty,
+ this function does nothing.
+
+ \sa remove()
+*/
+/*!
+ \fn QByteArray &QByteArray::removeLast()
+
+ \since 6.5
+
+ Removes the last character in this byte array. If the byte array is empty,
+ this function does nothing.
+
+ \sa remove()
+*/
+
+/*!
\fn template <typename Predicate> QByteArray &QByteArray::removeIf(Predicate pred)
\since 6.1
@@ -2164,13 +2433,16 @@ QByteArray &QByteArray::remove(qsizetype pos, qsizetype len)
QByteArray &QByteArray::replace(qsizetype pos, qsizetype len, QByteArrayView after)
{
- if (QtPrivate::q_points_into_range(after.data(), d.data(), d.data() + d.size)) {
+ if (QtPrivate::q_points_into_range(after.data(), d)) {
QVarLengthArray copy(after.data(), after.data() + after.size());
return replace(pos, len, QByteArrayView{copy});
}
if (len == after.size() && (pos + len <= size())) {
- detach();
- memmove(d.data() + pos, after.data(), len*sizeof(char));
+ // same size: in-place replacement possible
+ if (len > 0) {
+ detach();
+ memcpy(d.data() + pos, after.data(), len*sizeof(char));
+ }
return *this;
} else {
// ### optimize me
@@ -2221,11 +2493,11 @@ QByteArray &QByteArray::replace(QByteArrayView before, QByteArrayView after)
return *this;
// protect against before or after being part of this
- if (QtPrivate::q_points_into_range(a, d.data(), d.data() + d.size)) {
+ if (QtPrivate::q_points_into_range(a, d)) {
QVarLengthArray copy(a, a + asize);
return replace(before, QByteArrayView{copy});
}
- if (QtPrivate::q_points_into_range(b, d.data(), d.data() + d.size)) {
+ if (QtPrivate::q_points_into_range(b, d)) {
QVarLengthArray copy(b, b + bsize);
return replace(QByteArrayView{copy}, after);
}
@@ -2333,12 +2605,11 @@ QByteArray &QByteArray::replace(QByteArrayView before, QByteArrayView after)
QByteArray &QByteArray::replace(char before, char after)
{
- if (!isEmpty()) {
- char *i = data();
- char *e = i + size();
- for (; i != e; ++i)
- if (*i == before)
- * i = after;
+ if (before != after) {
+ if (const auto pos = indexOf(before); pos >= 0) {
+ const auto detachedData = data();
+ std::replace(detachedData + pos, detachedData + size(), before, after);
+ }
}
return *this;
}
@@ -2414,20 +2685,6 @@ QByteArray QByteArray::repeated(qsizetype times) const
hashHaystack -= std::size_t(a) << ol_minus_1; \
hashHaystack <<= 1
-static inline qsizetype findCharHelper(QByteArrayView haystack, qsizetype from, char needle) noexcept
-{
- if (from < 0)
- from = qMax(from + haystack.size(), qsizetype(0));
- if (from < haystack.size()) {
- const char *const b = haystack.data();
- if (const auto n = static_cast<const char *>(
- memchr(b + from, needle, static_cast<size_t>(haystack.size() - from)))) {
- return n - b;
- }
- }
- return -1;
-}
-
qsizetype QtPrivate::findByteArray(QByteArrayView haystack, qsizetype from, QByteArrayView needle) noexcept
{
const auto ol = needle.size();
@@ -2440,7 +2697,7 @@ qsizetype QtPrivate::findByteArray(QByteArrayView haystack, qsizetype from, QByt
}
if (ol == 1)
- return findCharHelper(haystack, from, needle.front());
+ return findByteArray(haystack, from, needle.front());
if (from > l || ol + from > l)
return -1;
@@ -2462,6 +2719,7 @@ qsizetype QtPrivate::findByteArray(QByteArrayView haystack, qsizetype from, QByt
*/
/*!
+ \fn qsizetype QByteArray::indexOf(char ch, qsizetype from) const
\overload
Returns the index position of the start of the first occurrence of the
@@ -2474,11 +2732,6 @@ qsizetype QtPrivate::findByteArray(QByteArrayView haystack, qsizetype from, QByt
\sa lastIndexOf(), contains()
*/
-qsizetype QByteArray::indexOf(char ch, qsizetype from) const
-{
- return qToByteArrayViewIgnoringNull(*this).indexOf(ch, from);
-}
-
static qsizetype lastIndexOfHelper(const char *haystack, qsizetype l, const char *needle,
qsizetype ol, qsizetype from)
{
@@ -2532,6 +2785,11 @@ static inline qsizetype lastIndexOfCharHelper(QByteArrayView haystack, qsizetype
return -1;
}
+qsizetype QtPrivate::lastIndexOf(QByteArrayView haystack, qsizetype from, char needle) noexcept
+{
+ return lastIndexOfCharHelper(haystack, from, needle);
+}
+
qsizetype QtPrivate::lastIndexOf(QByteArrayView haystack, qsizetype from, QByteArrayView needle) noexcept
{
if (haystack.isEmpty()) {
@@ -2551,9 +2809,11 @@ qsizetype QtPrivate::lastIndexOf(QByteArrayView haystack, qsizetype from, QByteA
Returns the index position of the start of the last occurrence of the
sequence of bytes viewed by \a bv in this byte array, searching backward
- from index position \a from. If \a from is -1, the search starts at
- the last character; if \a from is -2, at the next to last character
- and so on. Returns -1 if no match is found.
+ from index position \a from.
+
+ \include qstring.qdocinc negative-index-start-search-from-end
+
+ Returns -1 if no match is found.
Example:
\snippet code/src_corelib_text_qbytearray.cpp 23
@@ -2583,6 +2843,7 @@ qsizetype QtPrivate::lastIndexOf(QByteArrayView haystack, qsizetype from, QByteA
*/
/*!
+ \fn qsizetype QByteArray::lastIndexOf(char ch, qsizetype from) const
\overload
Returns the index position of the start of the last occurrence of byte \a ch
@@ -2596,11 +2857,6 @@ qsizetype QtPrivate::lastIndexOf(QByteArrayView haystack, qsizetype from, QByteA
\sa indexOf(), contains()
*/
-qsizetype QByteArray::lastIndexOf(char ch, qsizetype from) const
-{
- return qToByteArrayViewIgnoringNull(*this).lastIndexOf(ch, from);
-}
-
static inline qsizetype countCharHelper(QByteArrayView haystack, char needle) noexcept
{
qsizetype num = 0;
@@ -2622,8 +2878,8 @@ qsizetype QtPrivate::count(QByteArrayView haystack, QByteArrayView needle) noexc
qsizetype num = 0;
qsizetype i = -1;
if (haystack.size() > 500 && needle.size() > 5) {
- QByteArrayMatcher matcher(needle.data(), needle.size());
- while ((i = matcher.indexIn(haystack.data(), haystack.size(), i + 1)) != -1)
+ QByteArrayMatcher matcher(needle);
+ while ((i = matcher.indexIn(haystack, i + 1)) != -1)
++num;
} else {
while ((i = haystack.indexOf(needle, i + 1)) != -1)
@@ -2651,15 +2907,17 @@ qsizetype QtPrivate::count(QByteArrayView haystack, QByteArrayView needle) noexc
qsizetype QByteArray::count(char ch) const
{
- return static_cast<int>(countCharHelper(*this, ch));
+ return countCharHelper(*this, ch);
}
+#if QT_DEPRECATED_SINCE(6, 4)
/*! \fn qsizetype QByteArray::count() const
-
+ \deprecated [6.4] Use size() or length() instead.
\overload
Same as size().
*/
+#endif
/*!
\fn int QByteArray::compare(QByteArrayView bv, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
@@ -2740,56 +2998,44 @@ static constexpr inline bool isUpperCaseAscii(char c)
return c >= 'A' && c <= 'Z';
}
+/*
+ Returns true if \a c is an lowercase ASCII letter.
+ */
+static constexpr inline bool isLowerCaseAscii(char c)
+{
+ return c >= 'a' && c <= 'z';
+}
+
/*!
- Returns \c true if this byte array contains only ASCII uppercase letters,
- otherwise returns \c false.
+ Returns \c true if this byte array is uppercase, that is, if
+ it's identical to its toUpper() folding.
+
+ Note that this does \e not mean that the byte array only contains
+ uppercase letters; only that it contains no ASCII lowercase letters.
+
\since 5.12
\sa isLower(), toUpper()
*/
bool QByteArray::isUpper() const
{
- if (isEmpty())
- return false;
-
- const char *d = data();
-
- for (qsizetype i = 0, max = size(); i < max; ++i) {
- if (!isUpperCaseAscii(d[i]))
- return false;
- }
-
- return true;
-}
-
-/*
- Returns true if \a c is an lowercase ASCII letter.
- */
-static constexpr inline bool isLowerCaseAscii(char c)
-{
- return c >= 'a' && c <= 'z';
+ return std::none_of(begin(), end(), isLowerCaseAscii);
}
/*!
- Returns \c true if this byte array contains only lowercase ASCII letters,
- otherwise returns \c false.
+ Returns \c true if this byte array is lowercase, that is, if
+ it's identical to its toLower() folding.
+
+ Note that this does \e not mean that the byte array only contains
+ lowercase letters; only that it contains no ASCII uppercase letters.
+
\since 5.12
\sa isUpper(), toLower()
*/
bool QByteArray::isLower() const
{
- if (isEmpty())
- return false;
-
- const char *d = data();
-
- for (qsizetype i = 0, max = size(); i < max; ++i) {
- if (!isLowerCaseAscii(d[i]))
- return false;
- }
-
- return true;
+ return std::none_of(begin(), end(), isUpperCaseAscii);
}
/*!
@@ -2802,6 +3048,9 @@ bool QByteArray::isLower() const
*/
/*!
+ \fn QByteArray QByteArray::left(qsizetype len) const &
+ \fn QByteArray QByteArray::left(qsizetype len) &&
+
Returns a byte array that contains the first \a len bytes of this byte
array.
@@ -2816,16 +3065,10 @@ bool QByteArray::isLower() const
\sa first(), last(), startsWith(), chopped(), chop(), truncate()
*/
-QByteArray QByteArray::left(qsizetype len) const
-{
- if (len >= size())
- return *this;
- if (len < 0)
- len = 0;
- return QByteArray(data(), len);
-}
-
/*!
+ \fn QByteArray QByteArray::right(qsizetype len) const &
+ \fn QByteArray QByteArray::right(qsizetype len) &&
+
Returns a byte array that contains the last \a len bytes of this byte array.
If you know that \a len cannot be out of bounds, use last() instead in new
@@ -2836,18 +3079,13 @@ QByteArray QByteArray::left(qsizetype len) const
Returns an empty QByteArray if \a len is smaller than 0.
- \sa endsWith(), last(), first(), sliced(), chopped(), chop(), truncate()
+ \sa endsWith(), last(), first(), sliced(), chopped(), chop(), truncate(), slice()
*/
-QByteArray QByteArray::right(qsizetype len) const
-{
- if (len >= size())
- return *this;
- if (len < 0)
- len = 0;
- return QByteArray(end() - len, len);
-}
/*!
+ \fn QByteArray QByteArray::mid(qsizetype pos, qsizetype len) const &
+ \fn QByteArray QByteArray::mid(qsizetype pos, qsizetype len) &&
+
Returns a byte array containing \a len bytes from this byte array,
starting at position \a pos.
@@ -2858,10 +3096,10 @@ QByteArray QByteArray::right(qsizetype len) const
returns a byte array containing all bytes starting at position \a
pos until the end of the byte array.
- \sa first(), last(), sliced(), chopped(), chop(), truncate()
+ \sa first(), last(), sliced(), chopped(), chop(), truncate(), slice()
*/
-QByteArray QByteArray::mid(qsizetype pos, qsizetype len) const
+QByteArray QByteArray::mid(qsizetype pos, qsizetype len) const &
{
qsizetype p = pos;
qsizetype l = len;
@@ -2876,14 +3114,33 @@ QByteArray QByteArray::mid(qsizetype pos, qsizetype len) const
case QContainerImplHelper::Full:
return *this;
case QContainerImplHelper::Subset:
- return QByteArray(d.data() + p, l);
+ return sliced(p, l);
}
- Q_UNREACHABLE();
- return QByteArray();
+ Q_UNREACHABLE_RETURN(QByteArray());
+}
+
+QByteArray QByteArray::mid(qsizetype pos, qsizetype len) &&
+{
+ qsizetype p = pos;
+ qsizetype l = len;
+ using namespace QtPrivate;
+ switch (QContainerImplHelper::mid(size(), &p, &l)) {
+ case QContainerImplHelper::Null:
+ return QByteArray();
+ case QContainerImplHelper::Empty:
+ resize(0); // keep capacity if we've reserve()d
+ [[fallthrough]];
+ case QContainerImplHelper::Full:
+ return std::move(*this);
+ case QContainerImplHelper::Subset:
+ return std::move(*this).sliced(p, l);
+ }
+ Q_UNREACHABLE_RETURN(QByteArray());
}
/*!
- \fn QByteArray QByteArray::first(qsizetype n) const
+ \fn QByteArray QByteArray::first(qsizetype n) const &
+ \fn QByteArray QByteArray::first(qsizetype n) &&
\since 6.0
Returns the first \a n bytes of the byte array.
@@ -2893,11 +3150,12 @@ QByteArray QByteArray::mid(qsizetype pos, qsizetype len) const
Example:
\snippet code/src_corelib_text_qbytearray.cpp 27
- \sa last(), sliced(), startsWith(), chopped(), chop(), truncate()
+ \sa last(), sliced(), startsWith(), chopped(), chop(), truncate(), slice()
*/
/*!
- \fn QByteArray QByteArray::last(qsizetype n) const
+ \fn QByteArray QByteArray::last(qsizetype n) const &
+ \fn QByteArray QByteArray::last(qsizetype n) &&
\since 6.0
Returns the last \a n bytes of the byte array.
@@ -2907,11 +3165,12 @@ QByteArray QByteArray::mid(qsizetype pos, qsizetype len) const
Example:
\snippet code/src_corelib_text_qbytearray.cpp 28
- \sa first(), sliced(), endsWith(), chopped(), chop(), truncate()
+ \sa first(), sliced(), endsWith(), chopped(), chop(), truncate(), slice()
*/
/*!
- \fn QByteArray QByteArray::sliced(qsizetype pos, qsizetype n) const
+ \fn QByteArray QByteArray::sliced(qsizetype pos, qsizetype n) const &
+ \fn QByteArray QByteArray::sliced(qsizetype pos, qsizetype n) &&
\since 6.0
Returns a byte array containing the \a n bytes of this object starting
@@ -2923,11 +3182,20 @@ QByteArray QByteArray::mid(qsizetype pos, qsizetype len) const
Example:
\snippet code/src_corelib_text_qbytearray.cpp 29
- \sa first(), last(), chopped(), chop(), truncate()
+ \sa first(), last(), chopped(), chop(), truncate(), slice()
*/
+QByteArray QByteArray::sliced_helper(QByteArray &a, qsizetype pos, qsizetype n)
+{
+ if (n == 0)
+ return fromRawData(&_empty, 0);
+ DataPointer d = std::move(a.d).sliced(pos, n);
+ d.data()[n] = 0;
+ return QByteArray(std::move(d));
+}
/*!
- \fn QByteArray QByteArray::sliced(qsizetype pos) const
+ \fn QByteArray QByteArray::sliced(qsizetype pos) const &
+ \fn QByteArray QByteArray::sliced(qsizetype pos) &&
\since 6.0
\overload
@@ -2936,11 +3204,41 @@ QByteArray QByteArray::mid(qsizetype pos, qsizetype len) const
\note The behavior is undefined when \a pos < 0 or \a pos > size().
- \sa first(), last(), sliced(), chopped(), chop(), truncate()
+ \sa first(), last(), chopped(), chop(), truncate(), slice()
*/
/*!
- \fn QByteArray QByteArray::chopped(qsizetype len) const
+ \fn QByteArray &QByteArray::slice(qsizetype pos, qsizetype n)
+ \since 6.8
+
+ Modifies this byte array to start at position \a pos, extending for \a n
+ bytes, and returns a reference to this byte array.
+
+ \note The behavior is undefined if \a pos < 0, \a n < 0,
+ or \a pos + \a n > size().
+
+ Example:
+ \snippet code/src_corelib_text_qbytearray.cpp 57
+
+ \sa sliced(), first(), last(), chopped(), chop(), truncate()
+*/
+
+/*!
+ \fn QByteArray &QByteArray::slice(qsizetype pos)
+ \since 6.8
+ \overload
+
+ Modifies this byte array to start at position \a pos, extending to its
+ end, and returns a reference to this byte array.
+
+ \note The behavior is undefined if \a pos < 0 or \a pos > size().
+
+ \sa sliced(), first(), last(), chopped(), chop(), truncate()
+*/
+
+/*!
+ \fn QByteArray QByteArray::chopped(qsizetype len) const &
+ \fn QByteArray QByteArray::chopped(qsizetype len) &&
\since 5.10
Returns a byte array that contains the leftmost size() - \a len bytes of
@@ -2948,7 +3246,7 @@ QByteArray QByteArray::mid(qsizetype pos, qsizetype len) const
\note The behavior is undefined if \a len is negative or greater than size().
- \sa endsWith(), first(), last(), sliced(), chop(), truncate()
+ \sa endsWith(), first(), last(), sliced(), chop(), truncate(), slice()
*/
/*!
@@ -2963,11 +3261,7 @@ QByteArray QByteArray::mid(qsizetype pos, qsizetype len) const
\sa isLower(), toUpper(), {Character Case}
*/
-// prevent the compiler from inlining the function in each of
-// toLower and toUpper when the only difference is the table being used
-// (even with constant propagation, there's no gain in performance).
template <typename T>
-Q_NEVER_INLINE
static QByteArray toCase_template(T &input, uchar (*lookup)(uchar))
{
// find the first bad character in input
@@ -3038,7 +3332,7 @@ void QByteArray::clear()
d.clear();
}
-#if !defined(QT_NO_DATASTREAM) || defined(QT_BOOTSTRAPPED)
+#if !defined(QT_NO_DATASTREAM)
/*! \relates QByteArray
@@ -3051,7 +3345,7 @@ void QByteArray::clear()
QDataStream &operator<<(QDataStream &out, const QByteArray &ba)
{
if (ba.isNull() && out.version() >= 6) {
- out << (quint32)0xffffffff;
+ QDataStream::writeQSizeType(out, -1);
return out;
}
return out.writeBytes(ba.constData(), ba.size());
@@ -3068,13 +3362,21 @@ QDataStream &operator<<(QDataStream &out, const QByteArray &ba)
QDataStream &operator>>(QDataStream &in, QByteArray &ba)
{
ba.clear();
- quint32 len;
- in >> len;
- if (len == 0xffffffff)
+
+ qint64 size = QDataStream::readQSizeType(in);
+ qsizetype len = size;
+ if (size != len || size < -1) {
+ ba.clear();
+ in.setStatus(QDataStream::SizeLimitExceeded);
+ return in;
+ }
+ if (len == -1) { // null byte-array
+ ba = QByteArray();
return in;
+ }
- const quint32 Step = 1024 * 1024;
- quint32 allocated = 0;
+ constexpr qsizetype Step = 1024 * 1024;
+ qsizetype allocated = 0;
do {
qsizetype blockSize = qMin(Step, len - allocated);
@@ -3091,253 +3393,169 @@ QDataStream &operator>>(QDataStream &in, QByteArray &ba)
}
#endif // QT_NO_DATASTREAM
-/*! \fn bool QByteArray::operator==(const QString &str) const
-
- Returns \c true if this byte array is equal to the UTF-8 encoding of \a str;
- otherwise returns \c false.
-
- The comparison is case sensitive.
-
- You can disable this operator by defining \c
- QT_NO_CAST_FROM_ASCII when you compile your applications. You
- then need to call QString::fromUtf8(), QString::fromLatin1(),
- or QString::fromLocal8Bit() explicitly if you want to convert the byte
- array to a QString before doing the comparison.
-*/
-
-/*! \fn bool QByteArray::operator!=(const QString &str) const
-
- Returns \c true if this byte array is not equal to the UTF-8 encoding of \a
- str; otherwise returns \c false.
-
- The comparison is case sensitive.
-
- You can disable this operator by defining \c
- QT_NO_CAST_FROM_ASCII when you compile your applications. You
- then need to call QString::fromUtf8(), QString::fromLatin1(),
- or QString::fromLocal8Bit() explicitly if you want to convert the byte
- array to a QString before doing the comparison.
-*/
-
-/*! \fn bool QByteArray::operator<(const QString &str) const
-
- Returns \c true if this byte array is lexically less than the UTF-8 encoding
- of \a str; otherwise returns \c false.
-
- The comparison is case sensitive.
-
- You can disable this operator by defining \c
- QT_NO_CAST_FROM_ASCII when you compile your applications. You
- then need to call QString::fromUtf8(), QString::fromLatin1(),
- or QString::fromLocal8Bit() explicitly if you want to convert the byte
- array to a QString before doing the comparison.
-*/
-
-/*! \fn bool QByteArray::operator>(const QString &str) const
-
- Returns \c true if this byte array is lexically greater than the UTF-8
- encoding of \a str; otherwise returns \c false.
-
- The comparison is case sensitive.
-
- You can disable this operator by defining \c
- QT_NO_CAST_FROM_ASCII when you compile your applications. You
- then need to call QString::fromUtf8(), QString::fromLatin1(),
- or QString::fromLocal8Bit() explicitly if you want to convert the byte
- array to a QString before doing the comparison.
-*/
-
-/*! \fn bool QByteArray::operator<=(const QString &str) const
-
- Returns \c true if this byte array is lexically less than or equal to the
- UTF-8 encoding of \a str; otherwise returns \c false.
-
- The comparison is case sensitive.
-
- You can disable this operator by defining \c
- QT_NO_CAST_FROM_ASCII when you compile your applications. You
- then need to call QString::fromUtf8(), QString::fromLatin1(),
- or QString::fromLocal8Bit() explicitly if you want to convert the byte
- array to a QString before doing the comparison.
-*/
-
-/*! \fn bool QByteArray::operator>=(const QString &str) const
-
- Returns \c true if this byte array is greater than or equal to the UTF-8
- encoding of \a str; otherwise returns \c false.
-
- The comparison is case sensitive.
-
- You can disable this operator by defining \c
- QT_NO_CAST_FROM_ASCII when you compile your applications. You
- then need to call QString::fromUtf8(), QString::fromLatin1(),
- or QString::fromLocal8Bit() explicitly if you want to convert the byte
- array to a QString before doing the comparison.
-*/
-
-/*! \fn bool QByteArray::operator==(const QByteArray &a1, const QByteArray &a2)
+/*! \fn bool QByteArray::operator==(const QByteArray &lhs, const QByteArray &rhs)
\overload
- Returns \c true if byte array \a a1 is equal to byte array \a a2;
+ Returns \c true if byte array \a lhs is equal to byte array \a rhs;
otherwise returns \c false.
\sa QByteArray::compare()
*/
-/*! \fn bool QByteArray::operator==(const QByteArray &a1, const char *a2)
+/*! \fn bool QByteArray::operator==(const QByteArray &lhs, const char * const &rhs)
\overload
- Returns \c true if byte array \a a1 is equal to the '\\0'-terminated string
- \a a2; otherwise returns \c false.
+ Returns \c true if byte array \a lhs is equal to the '\\0'-terminated string
+ \a rhs; otherwise returns \c false.
\sa QByteArray::compare()
*/
-/*! \fn bool QByteArray::operator==(const char *a1, const QByteArray &a2)
+/*! \fn bool QByteArray::operator==(const char * const &lhs, const QByteArray &rhs)
\overload
- Returns \c true if '\\0'-terminated string \a a1 is equal to byte array \a
- a2; otherwise returns \c false.
+ Returns \c true if '\\0'-terminated string \a lhs is equal to byte array \a
+ rhs; otherwise returns \c false.
\sa QByteArray::compare()
*/
-/*! \fn bool QByteArray::operator!=(const QByteArray &a1, const QByteArray &a2)
+/*! \fn bool QByteArray::operator!=(const QByteArray &lhs, const QByteArray &rhs)
\overload
- Returns \c true if byte array \a a1 is not equal to byte array \a a2;
+ Returns \c true if byte array \a lhs is not equal to byte array \a rhs;
otherwise returns \c false.
\sa QByteArray::compare()
*/
-/*! \fn bool QByteArray::operator!=(const QByteArray &a1, const char *a2)
+/*! \fn bool QByteArray::operator!=(const QByteArray &lhs, const char * const &rhs)
\overload
- Returns \c true if byte array \a a1 is not equal to the '\\0'-terminated
- string \a a2; otherwise returns \c false.
+ Returns \c true if byte array \a lhs is not equal to the '\\0'-terminated
+ string \a rhs; otherwise returns \c false.
\sa QByteArray::compare()
*/
-/*! \fn bool QByteArray::operator!=(const char *a1, const QByteArray &a2)
+/*! \fn bool QByteArray::operator!=(const char * const &lhs, const QByteArray &rhs)
\overload
- Returns \c true if '\\0'-terminated string \a a1 is not equal to byte array
- \a a2; otherwise returns \c false.
+ Returns \c true if '\\0'-terminated string \a lhs is not equal to byte array
+ \a rhs; otherwise returns \c false.
\sa QByteArray::compare()
*/
-/*! \fn bool QByteArray::operator<(const QByteArray &a1, const QByteArray &a2)
+/*! \fn bool QByteArray::operator<(const QByteArray &lhs, const QByteArray &rhs)
\overload
- Returns \c true if byte array \a a1 is lexically less than byte array
- \a a2; otherwise returns \c false.
+ Returns \c true if byte array \a lhs is lexically less than byte array
+ \a rhs; otherwise returns \c false.
\sa QByteArray::compare()
*/
-/*! \fn bool QByteArray::operator<(const QByteArray &a1, const char *a2)
+/*! \fn bool QByteArray::operator<(const QByteArray &lhs, const char * const &rhs)
\overload
- Returns \c true if byte array \a a1 is lexically less than the
- '\\0'-terminated string \a a2; otherwise returns \c false.
+ Returns \c true if byte array \a lhs is lexically less than the
+ '\\0'-terminated string \a rhs; otherwise returns \c false.
\sa QByteArray::compare()
*/
-/*! \fn bool QByteArray::operator<(const char *a1, const QByteArray &a2)
+/*! \fn bool QByteArray::operator<(const char * const &lhs, const QByteArray &rhs)
\overload
- Returns \c true if '\\0'-terminated string \a a1 is lexically less than byte
- array \a a2; otherwise returns \c false.
+ Returns \c true if '\\0'-terminated string \a lhs is lexically less than byte
+ array \a rhs; otherwise returns \c false.
\sa QByteArray::compare()
*/
-/*! \fn bool QByteArray::operator<=(const QByteArray &a1, const QByteArray &a2)
+/*! \fn bool QByteArray::operator<=(const QByteArray &lhs, const QByteArray &rhs)
\overload
- Returns \c true if byte array \a a1 is lexically less than or equal
- to byte array \a a2; otherwise returns \c false.
+ Returns \c true if byte array \a lhs is lexically less than or equal
+ to byte array \a rhs; otherwise returns \c false.
\sa QByteArray::compare()
*/
-/*! \fn bool QByteArray::operator<=(const QByteArray &a1, const char *a2)
+/*! \fn bool QByteArray::operator<=(const QByteArray &lhs, const char * const &rhs)
\overload
- Returns \c true if byte array \a a1 is lexically less than or equal to the
- '\\0'-terminated string \a a2; otherwise returns \c false.
+ Returns \c true if byte array \a lhs is lexically less than or equal to the
+ '\\0'-terminated string \a rhs; otherwise returns \c false.
\sa QByteArray::compare()
*/
-/*! \fn bool QByteArray::operator<=(const char *a1, const QByteArray &a2)
+/*! \fn bool QByteArray::operator<=(const char * const &lhs, const QByteArray &rhs)
\overload
- Returns \c true if '\\0'-terminated string \a a1 is lexically less than or
- equal to byte array \a a2; otherwise returns \c false.
+ Returns \c true if '\\0'-terminated string \a lhs is lexically less than or
+ equal to byte array \a rhs; otherwise returns \c false.
\sa QByteArray::compare()
*/
-/*! \fn bool QByteArray::operator>(const QByteArray &a1, const QByteArray &a2)
+/*! \fn bool QByteArray::operator>(const QByteArray &lhs, const QByteArray &rhs)
\overload
- Returns \c true if byte array \a a1 is lexically greater than byte
- array \a a2; otherwise returns \c false.
+ Returns \c true if byte array \a lhs is lexically greater than byte
+ array \a rhs; otherwise returns \c false.
\sa QByteArray::compare()
*/
-/*! \fn bool QByteArray::operator>(const QByteArray &a1, const char *a2)
+/*! \fn bool QByteArray::operator>(const QByteArray &lhs, const char * const &rhs)
\overload
- Returns \c true if byte array \a a1 is lexically greater than the
- '\\0'-terminated string \a a2; otherwise returns \c false.
+ Returns \c true if byte array \a lhs is lexically greater than the
+ '\\0'-terminated string \a rhs; otherwise returns \c false.
\sa QByteArray::compare()
*/
-/*! \fn bool QByteArray::operator>(const char *a1, const QByteArray &a2)
+/*! \fn bool QByteArray::operator>(const char * const &lhs, const QByteArray &rhs)
\overload
- Returns \c true if '\\0'-terminated string \a a1 is lexically greater than
- byte array \a a2; otherwise returns \c false.
+ Returns \c true if '\\0'-terminated string \a lhs is lexically greater than
+ byte array \a rhs; otherwise returns \c false.
\sa QByteArray::compare()
*/
-/*! \fn bool QByteArray::operator>=(const QByteArray &a1, const QByteArray &a2)
+/*! \fn bool QByteArray::operator>=(const QByteArray &lhs, const QByteArray &rhs)
\overload
- Returns \c true if byte array \a a1 is lexically greater than or
- equal to byte array \a a2; otherwise returns \c false.
+ Returns \c true if byte array \a lhs is lexically greater than or
+ equal to byte array \a rhs; otherwise returns \c false.
\sa QByteArray::compare()
*/
-/*! \fn bool QByteArray::operator>=(const QByteArray &a1, const char *a2)
+/*! \fn bool QByteArray::operator>=(const QByteArray &lhs, const char * const &rhs)
\overload
- Returns \c true if byte array \a a1 is lexically greater than or equal to
- the '\\0'-terminated string \a a2; otherwise returns \c false.
+ Returns \c true if byte array \a lhs is lexically greater than or equal to
+ the '\\0'-terminated string \a rhs; otherwise returns \c false.
\sa QByteArray::compare()
*/
-/*! \fn bool QByteArray::operator>=(const char *a1, const QByteArray &a2)
+/*! \fn bool QByteArray::operator>=(const char * const &lhs, const QByteArray &rhs)
\overload
- Returns \c true if '\\0'-terminated string \a a1 is lexically greater than
- or equal to byte array \a a2; otherwise returns \c false.
+ Returns \c true if '\\0'-terminated string \a lhs is lexically greater than
+ or equal to byte array \a rhs; otherwise returns \c false.
\sa QByteArray::compare()
*/
-/*! \fn const QByteArray operator+(const QByteArray &a1, const QByteArray &a2)
+/*! \fn QByteArray operator+(const QByteArray &a1, const QByteArray &a2)
\relates QByteArray
Returns a byte array that is the result of concatenating byte
@@ -3346,7 +3564,7 @@ QDataStream &operator>>(QDataStream &in, QByteArray &ba)
\sa QByteArray::operator+=()
*/
-/*! \fn const QByteArray operator+(const QByteArray &a1, const char *a2)
+/*! \fn QByteArray operator+(const QByteArray &a1, const char *a2)
\relates QByteArray
\overload
@@ -3355,7 +3573,7 @@ QDataStream &operator>>(QDataStream &in, QByteArray &ba)
and '\\0'-terminated string \a a2.
*/
-/*! \fn const QByteArray operator+(const QByteArray &a1, char a2)
+/*! \fn QByteArray operator+(const QByteArray &a1, char a2)
\relates QByteArray
\overload
@@ -3364,7 +3582,7 @@ QDataStream &operator>>(QDataStream &in, QByteArray &ba)
array \a a1 and byte \a a2.
*/
-/*! \fn const QByteArray operator+(const char *a1, const QByteArray &a2)
+/*! \fn QByteArray operator+(const char *a1, const QByteArray &a2)
\relates QByteArray
\overload
@@ -3373,7 +3591,7 @@ QDataStream &operator>>(QDataStream &in, QByteArray &ba)
string \a a1 and byte array \a a2.
*/
-/*! \fn const QByteArray operator+(char a1, const QByteArray &a2)
+/*! \fn QByteArray operator+(char a1, const QByteArray &a2)
\relates QByteArray
\overload
@@ -3440,9 +3658,7 @@ QByteArray QByteArray::trimmed_helper(QByteArray &a)
QByteArrayView QtPrivate::trimmed(QByteArrayView view) noexcept
{
- auto start = view.begin();
- auto stop = view.end();
- QStringAlgorithms<QByteArrayView>::trimmed_helper_positions(start, stop);
+ const auto [start, stop] = QStringAlgorithms<QByteArrayView>::trimmed_helper_positions(view);
return QByteArrayView(start, stop);
}
@@ -3520,46 +3736,38 @@ QByteArray QByteArray::rightJustified(qsizetype width, char fill, bool truncate)
return result;
}
-bool QByteArray::isNull() const
-{
- return d->isNull();
-}
-
-static qlonglong toIntegral_helper(QByteArrayView data, bool *ok, int base, qlonglong)
+auto QtPrivate::toSignedInteger(QByteArrayView data, int base) -> ParsedNumber<qlonglong>
{
- return QLocaleData::bytearrayToLongLong(data, base, ok);
-}
+#if defined(QT_CHECK_RANGE)
+ if (base != 0 && (base < 2 || base > 36)) {
+ qWarning("QByteArray::toIntegral: Invalid base %d", base);
+ base = 10;
+ }
+#endif
+ if (data.isEmpty())
+ return {};
-static qulonglong toIntegral_helper(QByteArrayView data, bool *ok, int base, qulonglong)
-{
- return QLocaleData::bytearrayToUnsLongLong(data, base, ok);
+ const QSimpleParsedNumber r = QLocaleData::bytearrayToLongLong(data, base);
+ if (r.ok())
+ return ParsedNumber(r.result);
+ return {};
}
-template <typename T> static inline
-T toIntegral_helper(QByteArrayView data, bool *ok, int base)
+auto QtPrivate::toUnsignedInteger(QByteArrayView data, int base) -> ParsedNumber<qulonglong>
{
- using Int64 = typename std::conditional<std::is_unsigned<T>::value, qulonglong, qlonglong>::type;
-
#if defined(QT_CHECK_RANGE)
if (base != 0 && (base < 2 || base > 36)) {
qWarning("QByteArray::toIntegral: Invalid base %d", base);
base = 10;
}
#endif
- if (data.isEmpty()) {
- if (ok)
- *ok = false;
- return 0;
- }
+ if (data.isEmpty())
+ return {};
- // we select the right overload by the last, unused parameter
- Int64 val = toIntegral_helper(data, ok, base, Int64());
- if (T(val) != val) {
- if (ok)
- *ok = false;
- val = 0;
- }
- return T(val);
+ const QSimpleParsedNumber r = QLocaleData::bytearrayToUnsLongLong(data, base);
+ if (r.ok())
+ return ParsedNumber(r.result);
+ return {};
}
/*!
@@ -3569,8 +3777,9 @@ T toIntegral_helper(QByteArrayView data, bool *ok, int base)
If \a base is 0, the base is determined automatically using the following
rules: If the byte array begins with "0x", it is assumed to be hexadecimal
- (base 16); otherwise, if it begins with "0", it is assumed to be octal (base
- 8); otherwise it is assumed to be decimal.
+ (base 16); otherwise, if it begins with "0b", it is assumed to be binary
+ (base 2); otherwise, if it begins with "0", it is assumed to be octal
+ (base 8); otherwise it is assumed to be decimal.
Returns 0 if the conversion fails.
@@ -3581,17 +3790,14 @@ T toIntegral_helper(QByteArrayView data, bool *ok, int base)
regardless of the user's locale. Use QLocale to perform locale-aware
conversions between numbers and strings.
+ \note Support for the "0b" prefix was added in Qt 6.4.
+
\sa number()
*/
qlonglong QByteArray::toLongLong(bool *ok, int base) const
{
- return toIntegral_helper<qlonglong>(*this, ok, base);
-}
-
-qlonglong QByteArrayView::toLongLong(bool *ok, int base) const
-{
- return toIntegral_helper<qlonglong>(*this, ok, base);
+ return QtPrivate::toIntegral<qlonglong>(qToByteArrayViewIgnoringNull(*this), ok, base);
}
/*!
@@ -3601,8 +3807,9 @@ qlonglong QByteArrayView::toLongLong(bool *ok, int base) const
If \a base is 0, the base is determined automatically using the following
rules: If the byte array begins with "0x", it is assumed to be hexadecimal
- (base 16); otherwise, if it begins with "0", it is assumed to be octal (base
- 8); otherwise it is assumed to be decimal.
+ (base 16); otherwise, if it begins with "0b", it is assumed to be binary
+ (base 2); otherwise, if it begins with "0", it is assumed to be octal
+ (base 8); otherwise it is assumed to be decimal.
Returns 0 if the conversion fails.
@@ -3613,17 +3820,14 @@ qlonglong QByteArrayView::toLongLong(bool *ok, int base) const
regardless of the user's locale. Use QLocale to perform locale-aware
conversions between numbers and strings.
+ \note Support for the "0b" prefix was added in Qt 6.4.
+
\sa number()
*/
qulonglong QByteArray::toULongLong(bool *ok, int base) const
{
- return toIntegral_helper<qulonglong>(*this, ok, base);
-}
-
-qulonglong QByteArrayView::toULongLong(bool *ok, int base) const
-{
- return toIntegral_helper<qulonglong>(*this, ok, base);
+ return QtPrivate::toIntegral<qulonglong>(qToByteArrayViewIgnoringNull(*this), ok, base);
}
/*!
@@ -3633,8 +3837,9 @@ qulonglong QByteArrayView::toULongLong(bool *ok, int base) const
If \a base is 0, the base is determined automatically using the following
rules: If the byte array begins with "0x", it is assumed to be hexadecimal
- (base 16); otherwise, if it begins with "0", it is assumed to be octal (base
- 8); otherwise it is assumed to be decimal.
+ (base 16); otherwise, if it begins with "0b", it is assumed to be binary
+ (base 2); otherwise, if it begins with "0", it is assumed to be octal
+ (base 8); otherwise it is assumed to be decimal.
Returns 0 if the conversion fails.
@@ -3647,17 +3852,14 @@ qulonglong QByteArrayView::toULongLong(bool *ok, int base) const
regardless of the user's locale. Use QLocale to perform locale-aware
conversions between numbers and strings.
+ \note Support for the "0b" prefix was added in Qt 6.4.
+
\sa number()
*/
int QByteArray::toInt(bool *ok, int base) const
{
- return toIntegral_helper<int>(*this, ok, base);
-}
-
-int QByteArrayView::toInt(bool *ok, int base) const
-{
- return toIntegral_helper<int>(*this, ok, base);
+ return QtPrivate::toIntegral<int>(qToByteArrayViewIgnoringNull(*this), ok, base);
}
/*!
@@ -3667,8 +3869,9 @@ int QByteArrayView::toInt(bool *ok, int base) const
If \a base is 0, the base is determined automatically using the following
rules: If the byte array begins with "0x", it is assumed to be hexadecimal
- (base 16); otherwise, if it begins with "0", it is assumed to be octal (base
- 8); otherwise it is assumed to be decimal.
+ (base 16); otherwise, if it begins with "0b", it is assumed to be binary
+ (base 2); otherwise, if it begins with "0", it is assumed to be octal
+ (base 8); otherwise it is assumed to be decimal.
Returns 0 if the conversion fails.
@@ -3679,17 +3882,14 @@ int QByteArrayView::toInt(bool *ok, int base) const
regardless of the user's locale. Use QLocale to perform locale-aware
conversions between numbers and strings.
+ \note Support for the "0b" prefix was added in Qt 6.4.
+
\sa number()
*/
uint QByteArray::toUInt(bool *ok, int base) const
{
- return toIntegral_helper<uint>(*this, ok, base);
-}
-
-uint QByteArrayView::toUInt(bool *ok, int base) const
-{
- return toIntegral_helper<uint>(*this, ok, base);
+ return QtPrivate::toIntegral<uint>(qToByteArrayViewIgnoringNull(*this), ok, base);
}
/*!
@@ -3701,8 +3901,9 @@ uint QByteArrayView::toUInt(bool *ok, int base) const
If \a base is 0, the base is determined automatically using the following
rules: If the byte array begins with "0x", it is assumed to be hexadecimal
- (base 16); otherwise, if it begins with "0", it is assumed to be octal (base
- 8); otherwise it is assumed to be decimal.
+ (base 16); otherwise, if it begins with "0b", it is assumed to be binary
+ (base 2); otherwise, if it begins with "0", it is assumed to be octal
+ (base 8); otherwise it is assumed to be decimal.
Returns 0 if the conversion fails.
@@ -3715,16 +3916,13 @@ uint QByteArrayView::toUInt(bool *ok, int base) const
regardless of the user's locale. Use QLocale to perform locale-aware
conversions between numbers and strings.
+ \note Support for the "0b" prefix was added in Qt 6.4.
+
\sa number()
*/
long QByteArray::toLong(bool *ok, int base) const
{
- return toIntegral_helper<long>(*this, ok, base);
-}
-
-long QByteArrayView::toLong(bool *ok, int base) const
-{
- return toIntegral_helper<long>(*this, ok, base);
+ return QtPrivate::toIntegral<long>(qToByteArrayViewIgnoringNull(*this), ok, base);
}
/*!
@@ -3736,8 +3934,9 @@ long QByteArrayView::toLong(bool *ok, int base) const
If \a base is 0, the base is determined automatically using the following
rules: If the byte array begins with "0x", it is assumed to be hexadecimal
- (base 16); otherwise, if it begins with "0", it is assumed to be octal (base
- 8); otherwise it is assumed to be decimal.
+ (base 16); otherwise, if it begins with "0b", it is assumed to be binary
+ (base 2); otherwise, if it begins with "0", it is assumed to be octal
+ (base 8); otherwise it is assumed to be decimal.
Returns 0 if the conversion fails.
@@ -3748,16 +3947,13 @@ long QByteArrayView::toLong(bool *ok, int base) const
regardless of the user's locale. Use QLocale to perform locale-aware
conversions between numbers and strings.
+ \note Support for the "0b" prefix was added in Qt 6.4.
+
\sa number()
*/
ulong QByteArray::toULong(bool *ok, int base) const
{
- return toIntegral_helper<ulong>(*this, ok, base);
-}
-
-ulong QByteArrayView::toULong(bool *ok, int base) const
-{
- return toIntegral_helper<ulong>(*this, ok, base);
+ return QtPrivate::toIntegral<ulong>(qToByteArrayViewIgnoringNull(*this), ok, base);
}
/*!
@@ -3766,9 +3962,10 @@ ulong QByteArrayView::toULong(bool *ok, int base) const
digits beyond 9; A is ten, B is eleven and so on.
If \a base is 0, the base is determined automatically using the following
- rules: If the byte array begins with "0x", it is assumed to be hexadecimal;
- otherwise, if it begins with "0", it is assumed to be octal; otherwise it is
- assumed to be decimal.
+ rules: If the byte array begins with "0x", it is assumed to be hexadecimal
+ (base 16); otherwise, if it begins with "0b", it is assumed to be binary
+ (base 2); otherwise, if it begins with "0", it is assumed to be octal
+ (base 8); otherwise it is assumed to be decimal.
Returns 0 if the conversion fails.
@@ -3779,17 +3976,14 @@ ulong QByteArrayView::toULong(bool *ok, int base) const
regardless of the user's locale. Use QLocale to perform locale-aware
conversions between numbers and strings.
+ \note Support for the "0b" prefix was added in Qt 6.4.
+
\sa number()
*/
short QByteArray::toShort(bool *ok, int base) const
{
- return toIntegral_helper<short>(*this, ok, base);
-}
-
-short QByteArrayView::toShort(bool *ok, int base) const
-{
- return toIntegral_helper<short>(*this, ok, base);
+ return QtPrivate::toIntegral<short>(qToByteArrayViewIgnoringNull(*this), ok, base);
}
/*!
@@ -3798,9 +3992,10 @@ short QByteArrayView::toShort(bool *ok, int base) const
letters for digits beyond 9; A is ten, B is eleven and so on.
If \a base is 0, the base is determined automatically using the following
- rules: If the byte array begins with "0x", it is assumed to be hexadecimal;
- otherwise, if it begins with "0", it is assumed to be octal; otherwise it is
- assumed to be decimal.
+ rules: If the byte array begins with "0x", it is assumed to be hexadecimal
+ (base 16); otherwise, if it begins with "0b", it is assumed to be binary
+ (base 2); otherwise, if it begins with "0", it is assumed to be octal
+ (base 8); otherwise it is assumed to be decimal.
Returns 0 if the conversion fails.
@@ -3811,17 +4006,14 @@ short QByteArrayView::toShort(bool *ok, int base) const
regardless of the user's locale. Use QLocale to perform locale-aware
conversions between numbers and strings.
+ \note Support for the "0b" prefix was added in Qt 6.4.
+
\sa number()
*/
ushort QByteArray::toUShort(bool *ok, int base) const
{
- return toIntegral_helper<ushort>(*this, ok, base);
-}
-
-ushort QByteArrayView::toUShort(bool *ok, int base) const
-{
- return toIntegral_helper<ushort>(*this, ok, base);
+ return QtPrivate::toIntegral<ushort>(qToByteArrayViewIgnoringNull(*this), ok, base);
}
/*!
@@ -3854,14 +4046,13 @@ double QByteArray::toDouble(bool *ok) const
return QByteArrayView(*this).toDouble(ok);
}
-double QByteArrayView::toDouble(bool *ok) const
+auto QtPrivate::toDouble(QByteArrayView a) noexcept -> ParsedNumber<double>
{
- bool nonNullOk = false;
- int processed = 0;
- double d = qt_asciiToDouble(data(), size(), nonNullOk, processed, WhitespacesAllowed);
- if (ok)
- *ok = nonNullOk;
- return d;
+ auto r = qt_asciiToDouble(a.data(), a.size(), WhitespacesAllowed);
+ if (r.ok())
+ return ParsedNumber{r.result};
+ else
+ return {};
}
/*!
@@ -3894,9 +4085,15 @@ float QByteArray::toFloat(bool *ok) const
return QLocaleData::convertDoubleToFloat(toDouble(ok), ok);
}
-float QByteArrayView::toFloat(bool *ok) const
+auto QtPrivate::toFloat(QByteArrayView a) noexcept -> ParsedNumber<float>
{
- return QLocaleData::convertDoubleToFloat(toDouble(ok), ok);
+ if (const auto r = toDouble(a)) {
+ bool ok = true;
+ const auto f = QLocaleData::convertDoubleToFloat(*r, &ok);
+ if (ok)
+ return ParsedNumber(f);
+ }
+ return {};
}
/*!
@@ -3912,27 +4109,29 @@ float QByteArrayView::toFloat(bool *ok) const
*/
QByteArray QByteArray::toBase64(Base64Options options) const
{
- const char alphabet_base64[] = "ABCDEFGH" "IJKLMNOP" "QRSTUVWX" "YZabcdef"
- "ghijklmn" "opqrstuv" "wxyz0123" "456789+/";
- const char alphabet_base64url[] = "ABCDEFGH" "IJKLMNOP" "QRSTUVWX" "YZabcdef"
- "ghijklmn" "opqrstuv" "wxyz0123" "456789-_";
+ constexpr char alphabet_base64[] = "ABCDEFGH" "IJKLMNOP" "QRSTUVWX" "YZabcdef"
+ "ghijklmn" "opqrstuv" "wxyz0123" "456789+/";
+ constexpr char alphabet_base64url[] = "ABCDEFGH" "IJKLMNOP" "QRSTUVWX" "YZabcdef"
+ "ghijklmn" "opqrstuv" "wxyz0123" "456789-_";
const char *const alphabet = options & Base64UrlEncoding ? alphabet_base64url : alphabet_base64;
- const char padchar = '=';
+ constexpr char padchar = '=';
qsizetype padlen = 0;
- QByteArray tmp((size() + 2) / 3 * 4, Qt::Uninitialized);
+ const qsizetype sz = size();
+
+ QByteArray tmp((sz + 2) / 3 * 4, Qt::Uninitialized);
qsizetype i = 0;
char *out = tmp.data();
- while (i < size()) {
+ while (i < sz) {
// encode 3 bytes at a time
int chunk = 0;
chunk |= int(uchar(data()[i++])) << 16;
- if (i == size()) {
+ if (i == sz) {
padlen = 2;
} else {
chunk |= int(uchar(data()[i++])) << 8;
- if (i == size())
+ if (i == sz)
padlen = 1;
else
chunk |= int(uchar(data()[i++]));
@@ -4027,7 +4226,7 @@ static char *qulltoa2(char *p, qulonglong n, int base)
base = 10;
}
#endif
- const char b = 'a' - 10;
+ constexpr char b = 'a' - 10;
do {
const int c = n % base;
n /= base;
@@ -4044,7 +4243,7 @@ static char *qulltoa2(char *p, qulonglong n, int base)
*/
QByteArray &QByteArray::setNum(qlonglong n, int base)
{
- const int buffsize = 66; // big enough for MAX_ULLONG in base 2
+ constexpr int buffsize = 66; // big enough for MAX_ULLONG in base 2
char buff[buffsize];
char *p;
@@ -4069,7 +4268,7 @@ QByteArray &QByteArray::setNum(qlonglong n, int base)
QByteArray &QByteArray::setNum(qulonglong n, int base)
{
- const int buffsize = 66; // big enough for MAX_ULLONG in base 2
+ constexpr int buffsize = 66; // big enough for MAX_ULLONG in base 2
char buff[buffsize];
char *p = qulltoa2(buff + buffsize, n, base);
@@ -4207,7 +4406,7 @@ QByteArray QByteArray::number(double n, char format, int precision)
{
QLocaleData::DoubleForm form = QLocaleData::DFDecimal;
- switch (asciiLower(format)) {
+ switch (QtMiscUtils::toAsciiLower(format)) {
case 'f':
form = QLocaleData::DFDecimal;
break;
@@ -4397,7 +4596,7 @@ QByteArray::FromBase64Result QByteArray::fromBase64Encoding(QByteArray &&base64,
base64.size(),
base64.data(), // in-place
options);
- base64.truncate(int(base64result.decodedLength));
+ base64.truncate(base64result.decodedLength);
return { std::move(base64), base64result.status };
}
@@ -4413,7 +4612,7 @@ QByteArray::FromBase64Result QByteArray::fromBase64Encoding(const QByteArray &ba
base64Size,
const_cast<char *>(result.constData()),
options);
- result.truncate(int(base64result.decodedLength));
+ result.truncate(base64result.decodedLength);
return { std::move(result), base64result.status };
}
@@ -4526,7 +4725,7 @@ static void q_fromPercentEncoding(QByteArray *ba, char percent)
const char *inputPtr = data;
qsizetype i = 0;
- qsizetype len = ba->count();
+ qsizetype len = ba->size();
qsizetype outlen = 0;
int a, b;
char c;
@@ -4557,20 +4756,17 @@ static void q_fromPercentEncoding(QByteArray *ba, char percent)
ba->truncate(outlen);
}
-void q_fromPercentEncoding(QByteArray *ba)
-{
- q_fromPercentEncoding(ba, '%');
-}
-
/*!
- \since 4.4
+ \since 6.4
- Returns a decoded copy of the URI/URL-style percent-encoded \a input.
- The \a percent parameter allows you to replace the '%' character for
- another (for instance, '_' or '=').
+ Decodes URI/URL-style percent-encoding.
+
+ Returns a byte array containing the decoded text. The \a percent parameter
+ allows use of a different character than '%' (for instance, '_' or '=') as
+ the escape character.
For example:
- \snippet code/src_corelib_text_qbytearray.cpp 51
+ \snippet code/src_corelib_text_qbytearray.cpp 54
\note Given invalid input (such as a string containing the sequence "%G5",
which is not a valid hexadecimal number) the output will be invalid as
@@ -4578,18 +4774,35 @@ void q_fromPercentEncoding(QByteArray *ba)
\sa toPercentEncoding(), QUrl::fromPercentEncoding()
*/
-QByteArray QByteArray::fromPercentEncoding(const QByteArray &input, char percent)
+QByteArray QByteArray::percentDecoded(char percent) const
{
- if (input.isNull())
- return QByteArray(); // preserve null
- if (input.isEmpty())
- return QByteArray(input.data(), 0);
+ if (isEmpty())
+ return *this; // Preserves isNull().
- QByteArray tmp = input;
+ QByteArray tmp = *this;
q_fromPercentEncoding(&tmp, percent);
return tmp;
}
+/*!
+ \since 4.4
+
+ Decodes \a input from URI/URL-style percent-encoding.
+
+ Returns a byte array containing the decoded text. The \a percent parameter
+ allows use of a different character than '%' (for instance, '_' or '=') as
+ the escape character. Equivalent to input.percentDecoded(percent).
+
+ For example:
+ \snippet code/src_corelib_text_qbytearray.cpp 51
+
+ \sa percentDecoded()
+*/
+QByteArray QByteArray::fromPercentEncoding(const QByteArray &input, char percent)
+{
+ return input.percentDecoded(percent);
+}
+
/*! \fn QByteArray QByteArray::fromStdString(const std::string &str)
\since 5.4
@@ -4597,6 +4810,10 @@ QByteArray QByteArray::fromPercentEncoding(const QByteArray &input, char percent
\sa toStdString(), QString::fromStdString()
*/
+QByteArray QByteArray::fromStdString(const std::string &s)
+{
+ return QByteArray(s.data(), qsizetype(s.size()));
+}
/*!
\fn std::string QByteArray::toStdString() const
@@ -4610,68 +4827,9 @@ QByteArray QByteArray::fromPercentEncoding(const QByteArray &input, char percent
\sa fromStdString(), QString::toStdString()
*/
-
-static inline bool q_strchr(const char str[], char chr)
+std::string QByteArray::toStdString() const
{
- if (!str) return false;
-
- const char *ptr = str;
- char c;
- while ((c = *ptr++))
- if (c == chr)
- return true;
- return false;
-}
-
-static void q_toPercentEncoding(QByteArray *ba, const char *dontEncode, const char *alsoEncode, char percent)
-{
- if (ba->isEmpty())
- return;
-
- QByteArray input = *ba;
- qsizetype len = input.count();
- const char *inputData = input.constData();
- char *output = nullptr;
- qsizetype length = 0;
-
- for (qsizetype i = 0; i < len; ++i) {
- unsigned char c = *inputData++;
- if (((c >= 0x61 && c <= 0x7A) // ALPHA
- || (c >= 0x41 && c <= 0x5A) // ALPHA
- || (c >= 0x30 && c <= 0x39) // DIGIT
- || c == 0x2D // -
- || c == 0x2E // .
- || c == 0x5F // _
- || c == 0x7E // ~
- || q_strchr(dontEncode, c))
- && !q_strchr(alsoEncode, c)) {
- if (output)
- output[length] = c;
- ++length;
- } else {
- if (!output) {
- // detach now
- ba->resize(len*3); // worst case
- output = ba->data();
- }
- output[length++] = percent;
- output[length++] = QtMiscUtils::toHexUpper((c & 0xf0) >> 4);
- output[length++] = QtMiscUtils::toHexUpper(c & 0xf);
- }
- }
- if (output)
- ba->truncate(length);
-}
-
-void q_toPercentEncoding(QByteArray *ba, const char *exclude, const char *include)
-{
- q_toPercentEncoding(ba, exclude, include, '%');
-}
-
-void q_normalizePercentEncoding(QByteArray *ba, const char *exclude)
-{
- q_fromPercentEncoding(ba, '%');
- q_toPercentEncoding(ba, exclude, nullptr, '%');
+ return std::string(data(), size_t(size()));
}
/*!
@@ -4706,23 +4864,100 @@ QByteArray QByteArray::toPercentEncoding(const QByteArray &exclude, const QByteA
if (isEmpty())
return QByteArray(data(), 0);
- QByteArray include2 = include;
- if (percent != '%') // the default
- if ((percent >= 0x61 && percent <= 0x7A) // ALPHA
- || (percent >= 0x41 && percent <= 0x5A) // ALPHA
- || (percent >= 0x30 && percent <= 0x39) // DIGIT
- || percent == 0x2D // -
- || percent == 0x2E // .
- || percent == 0x5F // _
- || percent == 0x7E) // ~
- include2 += percent;
+ const auto contains = [](const QByteArray &view, char c) {
+ // As view.contains(c), but optimised to bypass a lot of overhead:
+ return view.size() > 0 && memchr(view.data(), c, view.size()) != nullptr;
+ };
QByteArray result = *this;
- q_toPercentEncoding(&result, exclude.nulTerminated().constData(), include2.nulTerminated().constData(), percent);
+ char *output = nullptr;
+ qsizetype length = 0;
+
+ for (unsigned char c : *this) {
+ if (char(c) != percent
+ && ((c >= 0x61 && c <= 0x7A) // ALPHA
+ || (c >= 0x41 && c <= 0x5A) // ALPHA
+ || (c >= 0x30 && c <= 0x39) // DIGIT
+ || c == 0x2D // -
+ || c == 0x2E // .
+ || c == 0x5F // _
+ || c == 0x7E // ~
+ || contains(exclude, c))
+ && !contains(include, c)) {
+ if (output)
+ output[length] = c;
+ ++length;
+ } else {
+ if (!output) {
+ // detach now
+ result.resize(size() * 3); // worst case
+ output = result.data();
+ }
+ output[length++] = percent;
+ output[length++] = QtMiscUtils::toHexUpper((c & 0xf0) >> 4);
+ output[length++] = QtMiscUtils::toHexUpper(c & 0xf);
+ }
+ }
+ if (output)
+ result.truncate(length);
return result;
}
+#if defined(Q_OS_WASM) || defined(Q_QDOC)
+
+/*!
+ Constructs a new QByteArray containing a copy of the Uint8Array \a uint8array.
+
+ This function transfers data from a JavaScript data buffer - which
+ is not addressable from C++ code - to heap memory owned by a QByteArray.
+ The Uint8Array can be released once this function returns and a copy
+ has been made.
+
+ The \a uint8array argument must an emscripten::val referencing an Uint8Array
+ object, e.g. obtained from a global JavaScript variable:
+
+ \snippet code/src_corelib_text_qbytearray.cpp 55
+
+ This function returns a null QByteArray if the size of the Uint8Array
+ exceeds the maximum capacity of QByteArray, or if the \a uint8array
+ argument is not of the Uint8Array type.
+
+ \since 6.5
+ \ingroup platform-type-conversions
+
+ \sa toEcmaUint8Array()
+*/
+
+QByteArray QByteArray::fromEcmaUint8Array(emscripten::val uint8array)
+{
+ return qstdweb::Uint8Array(uint8array).copyToQByteArray();
+}
+
+/*!
+ Creates a Uint8Array from a QByteArray.
+
+ This function transfers data from heap memory owned by a QByteArray
+ to a JavaScript data buffer. The function allocates and copies into an
+ ArrayBuffer, and returns a Uint8Array view to that buffer.
+
+ The JavaScript objects own a copy of the data, and this
+ QByteArray can be safely deleted after the copy has been made.
+
+ \snippet code/src_corelib_text_qbytearray.cpp 56
+
+ \since 6.5
+ \ingroup platform-type-conversions
+
+ \sa toEcmaUint8Array()
+*/
+emscripten::val QByteArray::toEcmaUint8Array()
+{
+ return qstdweb::Uint8Array::copyFrom(*this).val();
+}
+
+#endif
+
/*! \typedef QByteArray::ConstIterator
\internal
*/
@@ -4819,11 +5054,13 @@ QByteArray QByteArray::toPercentEncoding(const QByteArray &exclude, const QByteA
\sa QStringLiteral
*/
+#if QT_DEPRECATED_SINCE(6, 8)
/*!
\fn QtLiterals::operator""_qba(const char *str, size_t size)
\relates QByteArray
\since 6.2
+ \deprecated [6.8] Use \c _ba from Qt::StringLiterals namespace instead.
Literal operator that creates a QByteArray out of the first \a size characters
in the char string literal \a str.
@@ -4841,6 +5078,32 @@ QByteArray QByteArray::toPercentEncoding(const QByteArray &exclude, const QByteA
\sa QByteArrayLiteral, QtLiterals::operator""_qs(const char16_t *str, size_t size)
*/
+#endif // QT_DEPRECATED_SINCE(6, 8)
+
+/*!
+ \fn Qt::Literals::StringLiterals::operator""_ba(const char *str, size_t size)
+
+ \relates QByteArray
+ \since 6.4
+
+ Literal operator that creates a QByteArray out of the first \a size characters
+ in the char string literal \a str.
+
+ The QByteArray is created at compile time, and the generated string data is stored
+ in the read-only segment of the compiled object file. Duplicate literals may share
+ the same read-only memory. This functionality is interchangeable with
+ QByteArrayLiteral, but saves typing when many string literals are present in the
+ code.
+
+ The following code creates a QByteArray:
+ \code
+ using namespace Qt::Literals::StringLiterals;
+
+ auto str = "hello"_ba;
+ \endcode
+
+ \sa Qt::Literals::StringLiterals
+*/
/*!
\class QByteArray::FromBase64Result
@@ -4943,3 +5206,5 @@ size_t qHash(const QByteArray::FromBase64Result &key, size_t seed) noexcept
*/
QT_END_NAMESPACE
+
+#undef REHASH
diff --git a/src/corelib/text/qbytearray.h b/src/corelib/text/qbytearray.h
index 0a604f1594..3c8a3bba45 100644
--- a/src/corelib/text/qbytearray.h
+++ b/src/corelib/text/qbytearray.h
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2022 The Qt Company Ltd.
+// Copyright (C) 2016 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QBYTEARRAY_H
#define QBYTEARRAY_H
@@ -45,13 +9,13 @@
#include <QtCore/qnamespace.h>
#include <QtCore/qarraydata.h>
#include <QtCore/qarraydatapointer.h>
+#include <QtCore/qcompare.h>
#include <QtCore/qcontainerfwd.h>
#include <QtCore/qbytearrayalgorithms.h>
#include <QtCore/qbytearrayview.h>
#include <stdlib.h>
#include <string.h>
-#include <stdarg.h>
#include <string>
#include <iterator>
@@ -70,6 +34,14 @@ Q_FORWARD_DECLARE_CF_TYPE(CFData);
Q_FORWARD_DECLARE_OBJC_CLASS(NSData);
#endif
+#if defined(Q_OS_WASM) || defined(Q_QDOC)
+namespace emscripten {
+ class val;
+}
+#endif
+
+class tst_QByteArray;
+
QT_BEGIN_NAMESPACE
class QString;
@@ -90,6 +62,11 @@ private:
DataPointer d;
static const char _empty;
+
+ friend class ::tst_QByteArray;
+
+ template <typename InputIterator>
+ using if_input_iterator = QtPrivate::IfIsInputIterator<InputIterator>;
public:
enum Base64Option {
@@ -115,19 +92,22 @@ public:
QByteArray(const char *, qsizetype size = -1);
QByteArray(qsizetype size, char c);
QByteArray(qsizetype size, Qt::Initialization);
+ explicit QByteArray(QByteArrayView v) : QByteArray(v.data(), v.size()) {}
inline QByteArray(const QByteArray &) noexcept;
inline ~QByteArray();
QByteArray &operator=(const QByteArray &) noexcept;
QByteArray &operator=(const char *str);
inline QByteArray(QByteArray && other) noexcept
- { qSwap(d, other.d); }
+ = default;
QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_PURE_SWAP(QByteArray)
inline void swap(QByteArray &other) noexcept
- { qSwap(d, other.d); }
+ { d.swap(other.d); }
- inline bool isEmpty() const;
+ bool isEmpty() const noexcept { return size() == 0; }
void resize(qsizetype size);
+ void resize(qsizetype size, char c);
+ void resizeForOverwrite(qsizetype size);
QByteArray &fill(char c, qsizetype size = -1);
@@ -140,11 +120,11 @@ public:
inline operator const void *() const;
#endif
inline char *data();
- inline const char *data() const;
- inline const char *constData() const;
+ inline const char *data() const noexcept;
+ const char *constData() const noexcept { return data(); }
inline void detach();
inline bool isDetached() const;
- inline bool isSharedWith(const QByteArray &other) const
+ inline bool isSharedWith(const QByteArray &other) const noexcept
{ return data() == other.data() && size() == other.size(); }
void clear();
@@ -156,10 +136,12 @@ public:
[[nodiscard]] char back() const { return at(size() - 1); }
[[nodiscard]] inline char &back();
+ QT_CORE_INLINE_SINCE(6, 7)
qsizetype indexOf(char c, qsizetype from = 0) const;
qsizetype indexOf(QByteArrayView bv, qsizetype from = 0) const
{ return QtPrivate::findByteArray(qToByteArrayViewIgnoringNull(*this), from, bv); }
+ QT_CORE_INLINE_SINCE(6, 7)
qsizetype lastIndexOf(char c, qsizetype from = -1) const;
qsizetype lastIndexOf(QByteArrayView bv) const
{ return lastIndexOf(bv, size()); }
@@ -174,20 +156,69 @@ public:
inline int compare(QByteArrayView a, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept;
- [[nodiscard]] QByteArray left(qsizetype len) const;
- [[nodiscard]] QByteArray right(qsizetype len) const;
- [[nodiscard]] QByteArray mid(qsizetype index, qsizetype len = -1) const;
-
- [[nodiscard]] QByteArray first(qsizetype n) const
- { Q_ASSERT(n >= 0); Q_ASSERT(n <= size()); return QByteArray(data(), n); }
- [[nodiscard]] QByteArray last(qsizetype n) const
- { Q_ASSERT(n >= 0); Q_ASSERT(n <= size()); return QByteArray(data() + size() - n, n); }
- [[nodiscard]] QByteArray sliced(qsizetype pos) const
- { Q_ASSERT(pos >= 0); Q_ASSERT(pos <= size()); return QByteArray(data() + pos, size() - pos); }
- [[nodiscard]] QByteArray sliced(qsizetype pos, qsizetype n) const
- { Q_ASSERT(pos >= 0); Q_ASSERT(n >= 0); Q_ASSERT(size_t(pos) + size_t(n) <= size_t(size())); return QByteArray(data() + pos, n); }
- [[nodiscard]] QByteArray chopped(qsizetype len) const
- { Q_ASSERT(len >= 0); Q_ASSERT(len <= size()); return first(size() - len); }
+#if QT_CORE_REMOVED_SINCE(6, 7)
+ QByteArray left(qsizetype len) const;
+ QByteArray right(qsizetype len) const;
+ QByteArray mid(qsizetype index, qsizetype len = -1) const;
+ QByteArray first(qsizetype n) const;
+ QByteArray last(qsizetype n) const;
+ QByteArray sliced(qsizetype pos) const;
+ QByteArray sliced(qsizetype pos, qsizetype n) const;
+ QByteArray chopped(qsizetype len) const;
+#else
+ [[nodiscard]] QByteArray left(qsizetype n) const &
+ {
+ if (n >= size())
+ return *this;
+ return first(qMax(n, 0));
+ }
+ [[nodiscard]] QByteArray left(qsizetype n) &&
+ {
+ if (n >= size())
+ return std::move(*this);
+ return std::move(*this).first(qMax(n, 0));
+ }
+ [[nodiscard]] QByteArray right(qsizetype n) const &
+ {
+ if (n >= size())
+ return *this;
+ return last(qMax(n, 0));
+ }
+ [[nodiscard]] QByteArray right(qsizetype n) &&
+ {
+ if (n >= size())
+ return std::move(*this);
+ return std::move(*this).last(qMax(n, 0));
+ }
+ [[nodiscard]] QByteArray mid(qsizetype index, qsizetype len = -1) const &;
+ [[nodiscard]] QByteArray mid(qsizetype index, qsizetype len = -1) &&;
+
+ [[nodiscard]] QByteArray first(qsizetype n) const &
+ { verify(0, n); return sliced(0, n); }
+ [[nodiscard]] QByteArray last(qsizetype n) const &
+ { verify(0, n); return sliced(size() - n, n); }
+ [[nodiscard]] QByteArray sliced(qsizetype pos) const &
+ { verify(pos, 0); return sliced(pos, size() - pos); }
+ [[nodiscard]] QByteArray sliced(qsizetype pos, qsizetype n) const &
+ { verify(pos, n); return QByteArray(d.data() + pos, n); }
+ [[nodiscard]] QByteArray chopped(qsizetype len) const &
+ { verify(0, len); return sliced(0, size() - len); }
+
+ [[nodiscard]] QByteArray first(qsizetype n) &&
+ {
+ verify(0, n);
+ resize(n); // may detach and allocate memory
+ return std::move(*this);
+ }
+ [[nodiscard]] QByteArray last(qsizetype n) &&
+ { verify(0, n); return sliced_helper(*this, size() - n, n); }
+ [[nodiscard]] QByteArray sliced(qsizetype pos) &&
+ { verify(pos, 0); return sliced_helper(*this, pos, size() - pos); }
+ [[nodiscard]] QByteArray sliced(qsizetype pos, qsizetype n) &&
+ { verify(pos, n); return sliced_helper(*this, pos, n); }
+ [[nodiscard]] QByteArray chopped(qsizetype len) &&
+ { verify(0, len); return std::move(*this).first(size() - len); }
+#endif
bool startsWith(QByteArrayView bv) const
{ return QtPrivate::startsWith(qToByteArrayViewIgnoringNull(*this), bv); }
@@ -208,7 +239,18 @@ public:
void truncate(qsizetype pos);
void chop(qsizetype n);
-#if !defined(Q_CLANG_QDOC)
+ QByteArray &slice(qsizetype pos)
+ { verify(pos, 0); return remove(0, pos); }
+ QByteArray &slice(qsizetype pos, qsizetype n)
+ {
+ verify(pos, n);
+ if (isNull())
+ return *this;
+ resize(pos + n);
+ return remove(0, pos);
+ }
+
+#if !defined(Q_QDOC)
[[nodiscard]] QByteArray toLower() const &
{ return toLower_helper(*this); }
[[nodiscard]] QByteArray toLower() &&
@@ -249,13 +291,27 @@ public:
QByteArray &append(char c);
inline QByteArray &append(qsizetype count, char c);
QByteArray &append(const char *s)
- { return append(QByteArrayView(s, qsizetype(qstrlen(s)))); }
+ { return append(s, -1); }
QByteArray &append(const char *s, qsizetype len)
- { return append(QByteArrayView(s, len)); }
+ { return append(QByteArrayView(s, len < 0 ? qsizetype(qstrlen(s)) : len)); }
QByteArray &append(const QByteArray &a);
QByteArray &append(QByteArrayView a)
{ return insert(size(), a); }
+ QByteArray &assign(QByteArrayView v);
+ QByteArray &assign(qsizetype n, char c)
+ {
+ Q_ASSERT(n >= 0);
+ return fill(c, n);
+ }
+ template <typename InputIterator, if_input_iterator<InputIterator> = true>
+ QByteArray &assign(InputIterator first, InputIterator last)
+ {
+ d.assign(first, last);
+ d.data()[d.size] = '\0';
+ return *this;
+ }
+
QByteArray &insert(qsizetype i, QByteArrayView data);
inline QByteArray &insert(qsizetype i, const char *s)
{ return insert(i, QByteArrayView(s)); }
@@ -268,10 +324,15 @@ public:
{ return insert(i, QByteArrayView(s, len)); }
QByteArray &remove(qsizetype index, qsizetype len);
+ QByteArray &removeAt(qsizetype pos)
+ { return size_t(pos) < size_t(size()) ? remove(pos, 1) : *this; }
+ QByteArray &removeFirst() { return !isEmpty() ? remove(0, 1) : *this; }
+ QByteArray &removeLast() { return !isEmpty() ? remove(size() - 1, 1) : *this; }
+
template <typename Predicate>
QByteArray &removeIf(Predicate pred)
{
- QtPrivate::sequential_erase_if(*this, pred);
+ removeIf_helper(pred);
return *this;
}
@@ -299,64 +360,15 @@ public:
[[nodiscard]] QByteArray repeated(qsizetype times) const;
#if !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII)
+#if QT_CORE_REMOVED_SINCE(6, 8)
QT_ASCII_CAST_WARN inline bool operator==(const QString &s2) const;
QT_ASCII_CAST_WARN inline bool operator!=(const QString &s2) const;
QT_ASCII_CAST_WARN inline bool operator<(const QString &s2) const;
QT_ASCII_CAST_WARN inline bool operator>(const QString &s2) const;
QT_ASCII_CAST_WARN inline bool operator<=(const QString &s2) const;
QT_ASCII_CAST_WARN inline bool operator>=(const QString &s2) const;
-#endif
- friend inline bool operator==(const QByteArray &a1, const QByteArray &a2) noexcept
- { return QByteArrayView(a1) == QByteArrayView(a2); }
- friend inline bool operator==(const QByteArray &a1, const char *a2) noexcept
- { return a2 ? QtPrivate::compareMemory(a1, a2) == 0 : a1.isEmpty(); }
- friend inline bool operator==(const char *a1, const QByteArray &a2) noexcept
- { return a1 ? QtPrivate::compareMemory(a1, a2) == 0 : a2.isEmpty(); }
- friend inline bool operator!=(const QByteArray &a1, const QByteArray &a2) noexcept
- { return !(a1==a2); }
- friend inline bool operator!=(const QByteArray &a1, const char *a2) noexcept
- { return a2 ? QtPrivate::compareMemory(a1, a2) != 0 : !a1.isEmpty(); }
- friend inline bool operator!=(const char *a1, const QByteArray &a2) noexcept
- { return a1 ? QtPrivate::compareMemory(a1, a2) != 0 : !a2.isEmpty(); }
- friend inline bool operator<(const QByteArray &a1, const QByteArray &a2) noexcept
- { return QtPrivate::compareMemory(QByteArrayView(a1), QByteArrayView(a2)) < 0; }
- friend inline bool operator<(const QByteArray &a1, const char *a2) noexcept
- { return QtPrivate::compareMemory(a1, a2) < 0; }
- friend inline bool operator<(const char *a1, const QByteArray &a2) noexcept
- { return QtPrivate::compareMemory(a1, a2) < 0; }
- friend inline bool operator<=(const QByteArray &a1, const QByteArray &a2) noexcept
- { return QtPrivate::compareMemory(QByteArrayView(a1), QByteArrayView(a2)) <= 0; }
- friend inline bool operator<=(const QByteArray &a1, const char *a2) noexcept
- { return QtPrivate::compareMemory(a1, a2) <= 0; }
- friend inline bool operator<=(const char *a1, const QByteArray &a2) noexcept
- { return QtPrivate::compareMemory(a1, a2) <= 0; }
- friend inline bool operator>(const QByteArray &a1, const QByteArray &a2) noexcept
- { return QtPrivate::compareMemory(QByteArrayView(a1), QByteArrayView(a2)) > 0; }
- friend inline bool operator>(const QByteArray &a1, const char *a2) noexcept
- { return QtPrivate::compareMemory(a1, a2) > 0; }
- friend inline bool operator>(const char *a1, const QByteArray &a2) noexcept
- { return QtPrivate::compareMemory(a1, a2) > 0; }
- friend inline bool operator>=(const QByteArray &a1, const QByteArray &a2) noexcept
- { return QtPrivate::compareMemory(QByteArrayView(a1), QByteArrayView(a2)) >= 0; }
- friend inline bool operator>=(const QByteArray &a1, const char *a2) noexcept
- { return QtPrivate::compareMemory(a1, a2) >= 0; }
- friend inline bool operator>=(const char *a1, const QByteArray &a2) noexcept
- { return QtPrivate::compareMemory(a1, a2) >= 0; }
-
- // Check isEmpty() instead of isNull() for backwards compatibility.
- friend inline bool operator==(const QByteArray &a1, std::nullptr_t) noexcept { return a1.isEmpty(); }
- friend inline bool operator!=(const QByteArray &a1, std::nullptr_t) noexcept { return !a1.isEmpty(); }
- friend inline bool operator< (const QByteArray & , std::nullptr_t) noexcept { return false; }
- friend inline bool operator> (const QByteArray &a1, std::nullptr_t) noexcept { return !a1.isEmpty(); }
- friend inline bool operator<=(const QByteArray &a1, std::nullptr_t) noexcept { return a1.isEmpty(); }
- friend inline bool operator>=(const QByteArray & , std::nullptr_t) noexcept { return true; }
-
- friend inline bool operator==(std::nullptr_t, const QByteArray &a2) noexcept { return a2 == nullptr; }
- friend inline bool operator!=(std::nullptr_t, const QByteArray &a2) noexcept { return a2 != nullptr; }
- friend inline bool operator< (std::nullptr_t, const QByteArray &a2) noexcept { return a2 > nullptr; }
- friend inline bool operator> (std::nullptr_t, const QByteArray &a2) noexcept { return a2 < nullptr; }
- friend inline bool operator<=(std::nullptr_t, const QByteArray &a2) noexcept { return a2 >= nullptr; }
- friend inline bool operator>=(std::nullptr_t, const QByteArray &a2) noexcept { return a2 <= nullptr; }
+#endif // QT_CORE_REMOVED_SINCE(6, 8)
+#endif // !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII)
short toShort(bool *ok = nullptr, int base = 10) const;
ushort toUShort(bool *ok = nullptr, int base = 10) const;
@@ -373,6 +385,7 @@ public:
QByteArray toPercentEncoding(const QByteArray &exclude = QByteArray(),
const QByteArray &include = QByteArray(),
char percent = '%') const;
+ [[nodiscard]] QByteArray percentDecoded(char percent = '%') const;
inline QByteArray &setNum(short, int base = 10);
inline QByteArray &setNum(ushort, int base = 10);
@@ -416,26 +429,31 @@ public:
NSData *toRawNSData() const Q_DECL_NS_RETURNS_AUTORELEASED;
#endif
+#if defined(Q_OS_WASM) || defined(Q_QDOC)
+ static QByteArray fromEcmaUint8Array(emscripten::val uint8array);
+ emscripten::val toEcmaUint8Array();
+#endif
+
typedef char *iterator;
typedef const char *const_iterator;
typedef iterator Iterator;
typedef const_iterator ConstIterator;
typedef std::reverse_iterator<iterator> reverse_iterator;
typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
- inline iterator begin();
- inline const_iterator begin() const;
- inline const_iterator cbegin() const;
- inline const_iterator constBegin() const;
- inline iterator end();
- inline const_iterator end() const;
- inline const_iterator cend() const;
- inline const_iterator constEnd() const;
+ iterator begin() { return data(); }
+ const_iterator begin() const noexcept { return d.data(); }
+ const_iterator cbegin() const noexcept { return begin(); }
+ const_iterator constBegin() const noexcept { return begin(); }
+ iterator end() { return begin() + size(); }
+ const_iterator end() const noexcept { return begin() + size(); }
+ const_iterator cend() const noexcept { return end(); }
+ const_iterator constEnd() const noexcept { return end(); }
reverse_iterator rbegin() { return reverse_iterator(end()); }
reverse_iterator rend() { return reverse_iterator(begin()); }
- const_reverse_iterator rbegin() const { return const_reverse_iterator(end()); }
- const_reverse_iterator rend() const { return const_reverse_iterator(begin()); }
- const_reverse_iterator crbegin() const { return const_reverse_iterator(end()); }
- const_reverse_iterator crend() const { return const_reverse_iterator(begin()); }
+ const_reverse_iterator rbegin() const noexcept { return const_reverse_iterator(end()); }
+ const_reverse_iterator rend() const noexcept { return const_reverse_iterator(begin()); }
+ const_reverse_iterator crbegin() const noexcept { return rbegin(); }
+ const_reverse_iterator crend() const noexcept { return rend(); }
// stl compatibility
typedef qsizetype size_type;
@@ -463,27 +481,93 @@ public:
{ prepend(a); }
void shrink_to_fit() { squeeze(); }
iterator erase(const_iterator first, const_iterator last);
+ inline iterator erase(const_iterator it) { return erase(it, it + 1); }
+ static constexpr qsizetype max_size() noexcept
+ {
+ // -1 to deal with the NUL terminator
+ return Data::max_size() - 1;
+ }
- static inline QByteArray fromStdString(const std::string &s);
- inline std::string toStdString() const;
+ static QByteArray fromStdString(const std::string &s);
+ std::string toStdString() const;
- inline qsizetype size() const { return d->size; }
- inline qsizetype count() const { return size(); }
- inline qsizetype length() const { return size(); }
- bool isNull() const;
+ inline qsizetype size() const noexcept { return d->size; }
+#if QT_DEPRECATED_SINCE(6, 4)
+ QT_DEPRECATED_VERSION_X_6_4("Use size() or length() instead.")
+ inline qsizetype count() const noexcept { return size(); }
+#endif
+ inline qsizetype length() const noexcept { return size(); }
+ QT_CORE_INLINE_SINCE(6, 4)
+ bool isNull() const noexcept;
+ inline const DataPointer &data_ptr() const { return d; }
inline DataPointer &data_ptr() { return d; }
- explicit inline QByteArray(const DataPointer &dd)
- : d(dd)
+#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0)
+ explicit inline QByteArray(const DataPointer &dd) : d(dd) {}
+#endif
+ explicit inline QByteArray(DataPointer &&dd) : d(std::move(dd)) {}
+
+private:
+ friend bool comparesEqual(const QByteArray &lhs, const QByteArrayView &rhs) noexcept
+ { return QByteArrayView(lhs) == rhs; }
+ friend Qt::strong_ordering
+ compareThreeWay(const QByteArray &lhs, const QByteArrayView &rhs) noexcept
{
+ const int res = QtPrivate::compareMemory(QByteArrayView(lhs), rhs);
+ return Qt::compareThreeWay(res, 0);
}
+ Q_DECLARE_STRONGLY_ORDERED(QByteArray)
+ Q_DECLARE_STRONGLY_ORDERED(QByteArray, QByteArrayView)
+ Q_DECLARE_STRONGLY_ORDERED(QByteArray, const char *)
+#if defined(__GLIBCXX__) && defined(__cpp_lib_three_way_comparison)
+ // libstdc++ has a bug [0] when `operator const void *()` is preferred over
+ // `operator<=>()` when calling std::less<> and other similar methods.
+ // Fix it by explicitly providing relational operators in such case.
+ // [0]: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114153
+ friend bool operator<(const QByteArray &lhs, const QByteArray &rhs) noexcept
+ { return is_lt(compareThreeWay(lhs, rhs)); }
+ friend bool operator<=(const QByteArray &lhs, const QByteArray &rhs) noexcept
+ { return is_lteq(compareThreeWay(lhs, rhs)); }
+ friend bool operator>(const QByteArray &lhs, const QByteArray &rhs) noexcept
+ { return is_gt(compareThreeWay(lhs, rhs)); }
+ friend bool operator>=(const QByteArray &lhs, const QByteArray &rhs) noexcept
+ { return is_gteq(compareThreeWay(lhs, rhs)); }
+#endif // defined(__GLIBCXX__) && defined(__cpp_lib_three_way_comparison)
+
+ // Check isEmpty() instead of isNull() for backwards compatibility.
+ friend bool comparesEqual(const QByteArray &lhs, std::nullptr_t) noexcept
+ { return lhs.isEmpty(); }
+ friend Qt::strong_ordering compareThreeWay(const QByteArray &lhs, std::nullptr_t) noexcept
+ { return lhs.isEmpty() ? Qt::strong_ordering::equivalent : Qt::strong_ordering::greater; }
+ Q_DECLARE_STRONGLY_ORDERED(QByteArray, std::nullptr_t)
+
+ // defined in qstring.cpp
+ friend Q_CORE_EXPORT bool comparesEqual(const QByteArray &lhs, const QChar &rhs) noexcept;
+ friend Q_CORE_EXPORT Qt::strong_ordering
+ compareThreeWay(const QByteArray &lhs, const QChar &rhs) noexcept;
+ friend Q_CORE_EXPORT bool comparesEqual(const QByteArray &lhs, char16_t rhs) noexcept;
+ friend Q_CORE_EXPORT Qt::strong_ordering
+ compareThreeWay(const QByteArray &lhs, char16_t rhs) noexcept;
+#if !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII)
+ Q_DECLARE_STRONGLY_ORDERED(QByteArray, QChar, QT_ASCII_CAST_WARN)
+ Q_DECLARE_STRONGLY_ORDERED(QByteArray, char16_t, QT_ASCII_CAST_WARN)
+#endif // !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII)
+
-private:
void reallocData(qsizetype alloc, QArrayData::AllocationOption option);
void reallocGrowData(qsizetype n);
void expand(qsizetype i);
- QByteArray nulTerminated() const;
+ Q_ALWAYS_INLINE constexpr void verify([[maybe_unused]] qsizetype pos = 0,
+ [[maybe_unused]] qsizetype n = 1) const
+ {
+ Q_ASSERT(pos >= 0);
+ Q_ASSERT(pos <= d.size);
+ Q_ASSERT(n >= 0);
+ Q_ASSERT(n <= d.size - pos);
+ }
+
+ static QByteArray sliced_helper(QByteArray &a, qsizetype pos, qsizetype n);
static QByteArray toLower_helper(const QByteArray &a);
static QByteArray toLower_helper(QByteArray &a);
static QByteArray toUpper_helper(const QByteArray &a);
@@ -492,9 +576,20 @@ private:
static QByteArray trimmed_helper(QByteArray &a);
static QByteArray simplified_helper(const QByteArray &a);
static QByteArray simplified_helper(QByteArray &a);
+ template <typename Predicate>
+ qsizetype removeIf_helper(Predicate pred)
+ {
+ const qsizetype result = d->eraseIf(pred);
+ if (result > 0)
+ d.data()[d.size] = '\0';
+ return result;
+ }
friend class QString;
friend Q_CORE_EXPORT QByteArray qUncompress(const uchar *data, qsizetype nbytes);
+
+ template <typename T> friend qsizetype erase(QByteArray &ba, const T &t);
+ template <typename Predicate> friend qsizetype erase_if(QByteArray &ba, Predicate pred);
};
Q_DECLARE_OPERATORS_FOR_FLAGS(QByteArray::Base64Options)
@@ -503,12 +598,10 @@ inline constexpr QByteArray::QByteArray() noexcept {}
inline QByteArray::~QByteArray() {}
inline char QByteArray::at(qsizetype i) const
-{ Q_ASSERT(size_t(i) < size_t(size())); return d.data()[i]; }
+{ verify(i, 1); return d.data()[i]; }
inline char QByteArray::operator[](qsizetype i) const
-{ Q_ASSERT(size_t(i) < size_t(size())); return d.data()[i]; }
+{ verify(i, 1); return d.data()[i]; }
-inline bool QByteArray::isEmpty() const
-{ return size() == 0; }
#ifndef QT_NO_CAST_FROM_BYTEARRAY
inline QByteArray::operator const char *() const
{ return data(); }
@@ -521,7 +614,7 @@ inline char *QByteArray::data()
Q_ASSERT(d.data());
return d.data();
}
-inline const char *QByteArray::data() const
+inline const char *QByteArray::data() const noexcept
{
#if QT5_NULL_STRINGS == 1
return d.data() ? d.data() : &_empty;
@@ -529,8 +622,6 @@ inline const char *QByteArray::data() const
return d.data();
#endif
}
-inline const char *QByteArray::constData() const
-{ return data(); }
inline void QByteArray::detach()
{ if (d->needsDetach()) reallocData(size(), QArrayData::KeepSize); }
inline bool QByteArray::isDetached() const
@@ -559,25 +650,9 @@ inline void QByteArray::squeeze()
}
inline char &QByteArray::operator[](qsizetype i)
-{ Q_ASSERT(i >= 0 && i < size()); return data()[i]; }
+{ verify(i, 1); return data()[i]; }
inline char &QByteArray::front() { return operator[](0); }
inline char &QByteArray::back() { return operator[](size() - 1); }
-inline QByteArray::iterator QByteArray::begin()
-{ return data(); }
-inline QByteArray::const_iterator QByteArray::begin() const
-{ return data(); }
-inline QByteArray::const_iterator QByteArray::cbegin() const
-{ return data(); }
-inline QByteArray::const_iterator QByteArray::constBegin() const
-{ return data(); }
-inline QByteArray::iterator QByteArray::end()
-{ return data() + size(); }
-inline QByteArray::const_iterator QByteArray::end() const
-{ return data() + size(); }
-inline QByteArray::const_iterator QByteArray::cend() const
-{ return data() + size(); }
-inline QByteArray::const_iterator QByteArray::constEnd() const
-{ return data() + size(); }
inline QByteArray &QByteArray::append(qsizetype n, char ch)
{ return insert(size(), n, ch); }
inline QByteArray &QByteArray::prepend(qsizetype n, char ch)
@@ -592,15 +667,21 @@ inline int QByteArray::compare(QByteArrayView a, Qt::CaseSensitivity cs) const n
qstrnicmp(data(), size(), a.data(), a.size());
}
#if !defined(QT_USE_QSTRINGBUILDER)
-inline const QByteArray operator+(const QByteArray &a1, const QByteArray &a2)
+inline QByteArray operator+(const QByteArray &a1, const QByteArray &a2)
{ return QByteArray(a1) += a2; }
-inline const QByteArray operator+(const QByteArray &a1, const char *a2)
+inline QByteArray operator+(QByteArray &&lhs, const QByteArray &rhs)
+{ return std::move(lhs += rhs); }
+inline QByteArray operator+(const QByteArray &a1, const char *a2)
{ return QByteArray(a1) += a2; }
-inline const QByteArray operator+(const QByteArray &a1, char a2)
+inline QByteArray operator+(QByteArray &&lhs, const char *rhs)
+{ return std::move(lhs += rhs); }
+inline QByteArray operator+(const QByteArray &a1, char a2)
{ return QByteArray(a1) += a2; }
-inline const QByteArray operator+(const char *a1, const QByteArray &a2)
+inline QByteArray operator+(QByteArray &&lhs, char rhs)
+{ return std::move(lhs += rhs); }
+inline QByteArray operator+(const char *a1, const QByteArray &a2)
{ return QByteArray(a1) += a2; }
-inline const QByteArray operator+(char a1, const QByteArray &a2)
+inline QByteArray operator+(char a1, const QByteArray &a2)
{ return QByteArray(&a1, 1) += a2; }
#endif // QT_USE_QSTRINGBUILDER
@@ -619,11 +700,22 @@ inline QByteArray &QByteArray::setNum(ulong n, int base)
inline QByteArray &QByteArray::setNum(float n, char format, int precision)
{ return setNum(double(n), format, precision); }
-inline std::string QByteArray::toStdString() const
-{ return std::string(constData(), length()); }
-
-inline QByteArray QByteArray::fromStdString(const std::string &s)
-{ return QByteArray(s.data(), qsizetype(s.size())); }
+#if QT_CORE_INLINE_IMPL_SINCE(6, 4)
+bool QByteArray::isNull() const noexcept
+{
+ return d->isNull();
+}
+#endif
+#if QT_CORE_INLINE_IMPL_SINCE(6, 7)
+qsizetype QByteArray::indexOf(char ch, qsizetype from) const
+{
+ return qToByteArrayViewIgnoringNull(*this).indexOf(ch, from);
+}
+qsizetype QByteArray::lastIndexOf(char ch, qsizetype from) const
+{
+ return qToByteArrayViewIgnoringNull(*this).lastIndexOf(ch, from);
+}
+#endif
#if !defined(QT_NO_DATASTREAM) || defined(QT_BOOTSTRAPPED)
Q_CORE_EXPORT QDataStream &operator<<(QDataStream &, const QByteArray &);
@@ -649,8 +741,8 @@ public:
void swap(QByteArray::FromBase64Result &other) noexcept
{
- qSwap(decoded, other.decoded);
- qSwap(decodingStatus, other.decodingStatus);
+ decoded.swap(other.decoded);
+ std::swap(decodingStatus, other.decodingStatus);
}
explicit operator bool() const noexcept { return decodingStatus == QByteArray::Base64DecodingStatus::Ok; }
@@ -689,13 +781,13 @@ Q_CORE_EXPORT Q_DECL_PURE_FUNCTION size_t qHash(const QByteArray::FromBase64Resu
template <typename T>
qsizetype erase(QByteArray &ba, const T &t)
{
- return QtPrivate::sequential_erase(ba, t);
+ return ba.removeIf_helper([&t](const auto &e) { return t == e; });
}
template <typename Predicate>
qsizetype erase_if(QByteArray &ba, Predicate pred)
{
- return QtPrivate::sequential_erase_if(ba, pred);
+ return ba.removeIf_helper(pred);
}
//
@@ -703,14 +795,32 @@ qsizetype erase_if(QByteArray &ba, Predicate pred)
//
QByteArray QByteArrayView::toByteArray() const
{
- return QByteArray(data(), size());
+ return QByteArray(*this);
}
-inline namespace QtLiterals {
-inline QByteArray operator"" _qba(const char *str, size_t size) noexcept
+namespace Qt {
+inline namespace Literals {
+inline namespace StringLiterals {
+
+inline QByteArray operator""_ba(const char *str, size_t size) noexcept
{
return QByteArray(QByteArrayData(nullptr, const_cast<char *>(str), qsizetype(size)));
}
+
+} // StringLiterals
+} // Literals
+} // Qt
+
+inline namespace QtLiterals {
+#if QT_DEPRECATED_SINCE(6, 8)
+
+QT_DEPRECATED_VERSION_X_6_8("Use _ba from Qt::StringLiterals namespace instead.")
+inline QByteArray operator""_qba(const char *str, size_t size) noexcept
+{
+ return Qt::StringLiterals::operator""_ba(str, size);
+}
+
+#endif // QT_DEPRECATED_SINCE(6, 8)
} // QtLiterals
QT_END_NAMESPACE
diff --git a/src/corelib/text/qbytearray_p.h b/src/corelib/text/qbytearray_p.h
deleted file mode 100644
index 90552cb442..0000000000
--- a/src/corelib/text/qbytearray_p.h
+++ /dev/null
@@ -1,65 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QBYTEARRAY_P_H
-#define QBYTEARRAY_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists for the convenience
-// of other Qt classes. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include <QtCore/qbytearray.h>
-#include "private/qtools_p.h"
-
-QT_BEGIN_NAMESPACE
-
-// -1 because of the terminating NUL
-constexpr qsizetype MaxByteArraySize = MaxAllocSize - sizeof(std::remove_pointer<QByteArray::DataPointer>::type) - 1;
-constexpr qsizetype MaxStringSize = (MaxAllocSize - sizeof(std::remove_pointer<QByteArray::DataPointer>::type)) / 2 - 1;
-
-QT_END_NAMESPACE
-
-#endif // QBYTEARRAY_P_H
diff --git a/src/corelib/text/qbytearrayalgorithms.h b/src/corelib/text/qbytearrayalgorithms.h
index b669f065b9..7060161bb4 100644
--- a/src/corelib/text/qbytearrayalgorithms.h
+++ b/src/corelib/text/qbytearrayalgorithms.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QBYTEARRAYALGORITHMS_H
#define QBYTEARRAYALGORITHMS_H
@@ -61,10 +25,16 @@ bool startsWith(QByteArrayView haystack, QByteArrayView needle) noexcept;
[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION
bool endsWith(QByteArrayView haystack, QByteArrayView needle) noexcept;
+[[nodiscard]] inline
+qsizetype findByteArray(QByteArrayView haystack, qsizetype from, char needle) noexcept;
+
[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION
qsizetype findByteArray(QByteArrayView haystack, qsizetype from, QByteArrayView needle) noexcept;
[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION
+qsizetype lastIndexOf(QByteArrayView haystack, qsizetype from, char needle) noexcept;
+
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION
qsizetype lastIndexOf(QByteArrayView haystack, qsizetype from, QByteArrayView needle) noexcept;
[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION
@@ -76,6 +46,53 @@ qsizetype count(QByteArrayView haystack, QByteArrayView needle) noexcept;
[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool isValidUtf8(QByteArrayView s) noexcept;
+template <typename T>
+class ParsedNumber
+{
+ T m_value;
+ quint32 m_error : 1;
+ quint32 m_reserved : 31;
+ void *m_reserved2 = nullptr;
+public:
+ constexpr ParsedNumber() noexcept : m_value(), m_error(true), m_reserved(0) {}
+ constexpr explicit ParsedNumber(T v) : m_value(v), m_error(false), m_reserved(0) {}
+
+ // minimal optional-like API:
+ explicit operator bool() const noexcept { return !m_error; }
+ T &operator*() { Q_ASSERT(*this); return m_value; }
+ const T &operator*() const { Q_ASSERT(*this); return m_value; }
+ T *operator->() noexcept { return *this ? &m_value : nullptr; }
+ const T *operator->() const noexcept { return *this ? &m_value : nullptr; }
+ template <typename U> // not = T, as that'd allow calls that are incompatible with std::optional
+ T value_or(U &&u) const { return *this ? m_value : T(std::forward<U>(u)); }
+};
+
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION ParsedNumber<double> toDouble(QByteArrayView a) noexcept;
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION ParsedNumber<float> toFloat(QByteArrayView a) noexcept;
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION ParsedNumber<qlonglong> toSignedInteger(QByteArrayView data, int base);
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION ParsedNumber<qulonglong> toUnsignedInteger(QByteArrayView data, int base);
+
+// QByteArrayView has incomplete type here, and we can't include qbytearrayview.h,
+// since it includes qbytearrayalgorithms.h. Use the ByteArrayView template type as
+// a workaround.
+template <typename T, typename ByteArrayView,
+ typename = std::enable_if_t<std::is_same_v<ByteArrayView, QByteArrayView>>>
+static inline T toIntegral(ByteArrayView data, bool *ok, int base)
+{
+ const auto val = [&] {
+ if constexpr (std::is_unsigned_v<T>)
+ return toUnsignedInteger(data, base);
+ else
+ return toSignedInteger(data, base);
+ }();
+ const bool failed = !val || T(*val) != *val;
+ if (ok)
+ *ok = !failed;
+ if (failed)
+ return 0;
+ return T(*val);
+}
+
} // namespace QtPrivate
/*****************************************************************************
@@ -87,7 +104,7 @@ Q_CORE_EXPORT char *qstrdup(const char *);
inline size_t qstrlen(const char *str)
{
QT_WARNING_PUSH
-#if defined(Q_CC_GNU) && Q_CC_GNU >= 900 && Q_CC_GNU < 1000
+#if defined(Q_CC_GNU_ONLY) && Q_CC_GNU >= 900 && Q_CC_GNU < 1000
// spurious compiler warning (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91490#c6)
// when Q_DECLARE_METATYPE_TEMPLATE_1ARG is used
QT_WARNING_DISABLE_GCC("-Wstringop-overflow")
diff --git a/src/corelib/text/qbytearraylist.cpp b/src/corelib/text/qbytearraylist.cpp
index cd77cd905a..81bb54dfe4 100644
--- a/src/corelib/text/qbytearraylist.cpp
+++ b/src/corelib/text/qbytearraylist.cpp
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2014 by Southwest Research Institute (R)
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2014 by Southwest Research Institute (R)
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include <qbytearraylist.h>
@@ -103,12 +67,6 @@ QT_BEGIN_NAMESPACE
*/
/*!
- \fn QByteArray QByteArrayList::join() const
-
- Joins all the byte arrays into a single byte array.
-*/
-
-/*!
\fn QByteArray QByteArrayList::join(const QByteArray &separator) const
Joins all the byte arrays into a single byte array with each
@@ -120,7 +78,7 @@ QT_BEGIN_NAMESPACE
\since 6.3
Joins all the byte arrays into a single byte array with each
- element separated by the given \a separator.
+ element separated by the given \a separator, if any.
*/
/*!
@@ -144,15 +102,15 @@ static qsizetype QByteArrayList_joinedSize(const QByteArrayList *that, qsizetype
return totalLength;
}
-QByteArray QtPrivate::QByteArrayList_join(const QByteArrayList *that, QByteArrayView sep)
+QByteArray QtPrivate::QByteArrayList_join(const QByteArrayList *that, const char *sep, qsizetype seplen)
{
QByteArray res;
- if (const qsizetype joinedSize = QByteArrayList_joinedSize(that, sep.size()))
+ if (const qsizetype joinedSize = QByteArrayList_joinedSize(that, seplen))
res.reserve(joinedSize); // don't call reserve(0) - it allocates one byte for the NUL
const qsizetype size = that->size();
for (qsizetype i = 0; i < size; ++i) {
if (i)
- res.append(sep);
+ res.append(sep, seplen);
res += that->at(i);
}
return res;
diff --git a/src/corelib/text/qbytearraylist.h b/src/corelib/text/qbytearraylist.h
index 890cbcef2d..f5302884f1 100644
--- a/src/corelib/text/qbytearraylist.h
+++ b/src/corelib/text/qbytearraylist.h
@@ -1,43 +1,7 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2016 Intel Corporation.
-** Copyright (C) 2014 by Southwest Research Institute (R)
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2016 Intel Corporation.
+// Copyright (C) 2014 by Southwest Research Institute (R)
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include <QtCore/qlist.h>
@@ -55,23 +19,23 @@ typedef QListIterator<QByteArray> QByteArrayListIterator;
typedef QMutableListIterator<QByteArray> QMutableByteArrayListIterator;
#endif
-#ifndef Q_CLANG_QDOC
+#ifndef Q_QDOC
namespace QtPrivate {
-#if QT_REMOVED_SINCE(6, 3)
+#if QT_CORE_REMOVED_SINCE(6, 3) && QT_POINTER_SIZE != 4
QByteArray Q_CORE_EXPORT QByteArrayList_join(const QByteArrayList *that, const char *separator, int separatorLength);
#endif
- QByteArray Q_CORE_EXPORT QByteArrayList_join(const QByteArrayList *that, QByteArrayView separator);
+ QByteArray Q_CORE_EXPORT QByteArrayList_join(const QByteArrayList *that, const char *sep, qsizetype len);
}
#endif
-#ifdef Q_CLANG_QDOC
+#ifdef Q_QDOC
class QByteArrayList : public QList<QByteArray>
#else
template <> struct QListSpecialMethods<QByteArray> : QListSpecialMethodsBase<QByteArray>
#endif
{
-#ifndef Q_CLANG_QDOC
+#ifndef Q_QDOC
protected:
~QListSpecialMethods() = default;
#endif
@@ -80,15 +44,13 @@ public:
using QListSpecialMethodsBase<QByteArray>::lastIndexOf;
using QListSpecialMethodsBase<QByteArray>::contains;
- inline QByteArray join() const
- { return join(QByteArrayView{}); }
- inline QByteArray join(QByteArrayView sep) const // ### Qt 7: merge with the () overload
+ QByteArray join(QByteArrayView sep = {}) const
{
- return QtPrivate::QByteArrayList_join(self(), sep);
+ return QtPrivate::QByteArrayList_join(self(), sep.data(), sep.size());
}
Q_WEAK_OVERLOAD
inline QByteArray join(const QByteArray &sep) const
- { return join(QByteArrayView{sep}); }
+ { return join(qToByteArrayViewIgnoringNull(sep)); }
inline QByteArray join(char sep) const
{ return join({&sep, 1}); }
};
diff --git a/src/corelib/text/qbytearraymatcher.cpp b/src/corelib/text/qbytearraymatcher.cpp
index 9f89ef084f..ae38fb584b 100644
--- a/src/corelib/text/qbytearraymatcher.cpp
+++ b/src/corelib/text/qbytearraymatcher.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qbytearraymatcher.h"
@@ -206,21 +170,6 @@ void QByteArrayMatcher::setPattern(const QByteArray &pattern)
}
/*!
- Searches the byte array \a ba, from byte position \a from (default
- 0, i.e. from the first byte), for the byte array pattern() that
- was set in the constructor or in the most recent call to
- setPattern(). Returns the position where the pattern() matched in
- \a ba, or -1 if no match was found.
-*/
-qsizetype QByteArrayMatcher::indexIn(const QByteArray &ba, qsizetype from) const
-{
- if (from < 0)
- from = 0;
- return bm_find(reinterpret_cast<const uchar *>(ba.constData()), ba.size(), from,
- p.p, p.l, p.q_skiptable);
-}
-
-/*!
Searches the char string \a str, which has length \a len, from
byte position \a from (default 0, i.e. from the first byte), for
the byte array pattern() that was set in the constructor or in the
@@ -246,6 +195,13 @@ qsizetype QByteArrayMatcher::indexIn(const char *str, qsizetype len, qsizetype f
setPattern(). Returns the position where the pattern() matched in
\a data, or -1 if no match was found.
*/
+qsizetype QByteArrayMatcher::indexIn(QByteArrayView data, qsizetype from) const
+{
+ if (from < 0)
+ from = 0;
+ return bm_find(reinterpret_cast<const uchar *>(data.data()), data.size(), from,
+ p.p, p.l, p.q_skiptable);
+}
/*!
\fn QByteArray QByteArrayMatcher::pattern() const
@@ -375,8 +331,7 @@ qsizetype qFindByteArray(
QByteArray::indexOf(), in particular if repeated matching takes place.
Unlike QByteArrayMatcher, this class calculates the internal
- representation at \e{compile-time}, if your compiler supports
- C++14-level \c{constexpr} (C++11 is not sufficient), so it can
+ representation at \e{compile-time}, so it can
even benefit if you are doing one-off byte array matches.
Create the QStaticByteArrayMatcher by calling qMakeStaticByteArrayMatcher(),
@@ -392,16 +347,11 @@ qsizetype qFindByteArray(
Since this class is designed to do all the up-front calculations at compile-time,
it does not offer a setPattern() method.
- \note Qt detects the necessary C++14 compiler support by way of the feature
- test recommendations from
- \l{https://isocpp.org/std/standing-documents/sd-6-sg10-feature-test-recommendations}
- {C++ Committee's Standing Document 6}.
-
\sa QByteArrayMatcher, QStringMatcher
*/
/*!
- \fn template <uint N> int QStaticByteArrayMatcher<N>::indexIn(const char *haystack, int hlen, int from = 0) const
+ \fn template <size_t N> qsizetype QStaticByteArrayMatcher<N>::indexIn(const char *haystack, qsizetype hlen, qsizetype from = 0) const
Searches the char string \a haystack, which has length \a hlen, from
byte position \a from (default 0, i.e. from the first byte), for
@@ -411,7 +361,7 @@ qsizetype qFindByteArray(
*/
/*!
- \fn template <uint N> int QStaticByteArrayMatcher<N>::indexIn(const QByteArray &haystack, int from = 0) const
+ \fn template <size_t N> qsizetype QStaticByteArrayMatcher<N>::indexIn(const QByteArray &haystack, qsizetype from = 0) const
Searches the char string \a haystack, from byte position \a from
(default 0, i.e. from the first byte), for the byte array pattern()
@@ -421,7 +371,7 @@ qsizetype qFindByteArray(
*/
/*!
- \fn template <uint N> QByteArray QStaticByteArrayMatcher<N>::pattern() const
+ \fn template <size_t N> QByteArray QStaticByteArrayMatcher<N>::pattern() const
Returns the byte array pattern that this byte array matcher will
search for.
@@ -432,7 +382,7 @@ qsizetype qFindByteArray(
/*!
\internal
*/
-int QStaticByteArrayMatcherBase::indexOfIn(const char *needle, uint nlen, const char *haystack, int hlen, int from) const noexcept
+qsizetype QStaticByteArrayMatcherBase::indexOfIn(const char *needle, size_t nlen, const char *haystack, qsizetype hlen, qsizetype from) const noexcept
{
if (from < 0)
from = 0;
@@ -441,12 +391,12 @@ int QStaticByteArrayMatcherBase::indexOfIn(const char *needle, uint nlen, const
}
/*!
- \fn template <uint N> QStaticByteArrayMatcher<N>::QStaticByteArrayMatcher(const char (&pattern)[N])
+ \fn template <size_t N> QStaticByteArrayMatcher<N>::QStaticByteArrayMatcher(const char (&pattern)[N])
\internal
*/
/*!
- \fn template <uint N> QStaticByteArrayMatcher qMakeStaticByteArrayMatcher(const char (&pattern)[N])
+ \fn template <size_t N> QStaticByteArrayMatcher qMakeStaticByteArrayMatcher(const char (&pattern)[N])
\since 5.9
\relates QStaticByteArrayMatcher
@@ -461,3 +411,5 @@ int QStaticByteArrayMatcherBase::indexOfIn(const char *needle, uint nlen, const
QT_END_NAMESPACE
+
+#undef REHASH
diff --git a/src/corelib/text/qbytearraymatcher.h b/src/corelib/text/qbytearraymatcher.h
index d9ea638500..1de9c23f10 100644
--- a/src/corelib/text/qbytearraymatcher.h
+++ b/src/corelib/text/qbytearraymatcher.h
@@ -1,47 +1,13 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QBYTEARRAYMATCHER_H
#define QBYTEARRAYMATCHER_H
#include <QtCore/qbytearray.h>
+#include <QtCore/q20algorithm.h>
+#include <iterator>
#include <limits>
QT_BEGIN_NAMESPACE
@@ -65,12 +31,15 @@ public:
void setPattern(const QByteArray &pattern);
+#if QT_CORE_REMOVED_SINCE(6, 3)
qsizetype indexIn(const QByteArray &ba, qsizetype from = 0) const;
+#else
+ Q_WEAK_OVERLOAD
+ qsizetype indexIn(const QByteArray &ba, qsizetype from = 0) const
+ { return indexIn(QByteArrayView{ba}, from); }
+#endif
qsizetype indexIn(const char *str, qsizetype len, qsizetype from = 0) const;
- qsizetype indexIn(QByteArrayView data, qsizetype from = 0) const
- {
- return indexIn(data.data(), data.size(), from);
- }
+ qsizetype indexIn(QByteArrayView data, qsizetype from = 0) const;
inline QByteArray pattern() const
{
if (q_pattern.isNull())
@@ -99,43 +68,25 @@ class QStaticByteArrayMatcherBase
uchar data[256];
} m_skiptable;
protected:
- explicit constexpr QStaticByteArrayMatcherBase(const char *pattern, uint n) noexcept
+ explicit constexpr QStaticByteArrayMatcherBase(const char *pattern, size_t n) noexcept
: m_skiptable(generate(pattern, n)) {}
// compiler-generated copy/more ctors/assignment operators are ok!
- // compiler-generated dtor is ok!
+ ~QStaticByteArrayMatcherBase() = default;
+#if QT_CORE_REMOVED_SINCE(6, 3) && QT_POINTER_SIZE != 4
Q_CORE_EXPORT int indexOfIn(const char *needle, uint nlen, const char *haystack, int hlen, int from) const noexcept;
+#endif
+ Q_CORE_EXPORT qsizetype indexOfIn(const char *needle, size_t nlen,
+ const char *haystack, qsizetype hlen,
+ qsizetype from) const noexcept;
private:
- static constexpr Skiptable generate(const char *pattern, uint n) noexcept
+ static constexpr Skiptable generate(const char *pattern, size_t n) noexcept
{
const auto uchar_max = (std::numeric_limits<uchar>::max)();
uchar max = n > uchar_max ? uchar_max : uchar(n);
- Skiptable table = {
- // this verbose initialization code aims to avoid some opaque error messages
- // even on powerful compilers such as GCC 5.3. Even though for GCC a loop
- // format can be found that v5.3 groks, it's probably better to go with this
- // for the time being:
- {
- max, max, max, max, max, max, max, max, max, max, max, max, max, max, max, max,
- max, max, max, max, max, max, max, max, max, max, max, max, max, max, max, max,
- max, max, max, max, max, max, max, max, max, max, max, max, max, max, max, max,
- max, max, max, max, max, max, max, max, max, max, max, max, max, max, max, max,
- max, max, max, max, max, max, max, max, max, max, max, max, max, max, max, max,
- max, max, max, max, max, max, max, max, max, max, max, max, max, max, max, max,
- max, max, max, max, max, max, max, max, max, max, max, max, max, max, max, max,
- max, max, max, max, max, max, max, max, max, max, max, max, max, max, max, max,
-
- max, max, max, max, max, max, max, max, max, max, max, max, max, max, max, max,
- max, max, max, max, max, max, max, max, max, max, max, max, max, max, max, max,
- max, max, max, max, max, max, max, max, max, max, max, max, max, max, max, max,
- max, max, max, max, max, max, max, max, max, max, max, max, max, max, max, max,
- max, max, max, max, max, max, max, max, max, max, max, max, max, max, max, max,
- max, max, max, max, max, max, max, max, max, max, max, max, max, max, max, max,
- max, max, max, max, max, max, max, max, max, max, max, max, max, max, max, max,
- max, max, max, max, max, max, max, max, max, max, max, max, max, max, max, max,
- }
- };
+ Skiptable table = {};
+ q20::fill(std::begin(table.data), std::end(table.data), max);
pattern += n - max;
while (max--)
table.data[uchar(*pattern++)] = max;
@@ -143,28 +94,32 @@ private:
}
};
-template <uint N>
+template <size_t N>
class QStaticByteArrayMatcher : QStaticByteArrayMatcherBase
{
char m_pattern[N];
+ // N includes the terminating '\0'!
static_assert(N > 2, "QStaticByteArrayMatcher makes no sense for finding a single-char pattern");
public:
explicit constexpr QStaticByteArrayMatcher(const char (&patternToMatch)[N]) noexcept
: QStaticByteArrayMatcherBase(patternToMatch, N - 1), m_pattern()
{
- for (uint i = 0; i < N; ++i)
+ for (size_t i = 0; i < N; ++i)
m_pattern[i] = patternToMatch[i];
}
- int indexIn(const QByteArray &haystack, int from = 0) const noexcept
+ Q_WEAK_OVERLOAD
+ qsizetype indexIn(const QByteArray &haystack, qsizetype from = 0) const noexcept
{ return this->indexOfIn(m_pattern, N - 1, haystack.data(), haystack.size(), from); }
- int indexIn(const char *haystack, int hlen, int from = 0) const noexcept
+ qsizetype indexIn(const char *haystack, qsizetype hlen, qsizetype from = 0) const noexcept
{ return this->indexOfIn(m_pattern, N - 1, haystack, hlen, from); }
+ qsizetype indexIn(QByteArrayView haystack, qsizetype from = 0) const noexcept
+ { return this->indexOfIn(m_pattern, N - 1, haystack.data(), haystack.size(), from); }
- QByteArray pattern() const { return QByteArray(m_pattern, int(N - 1)); }
+ QByteArray pattern() const { return QByteArray(m_pattern, qsizetype(N - 1)); }
};
-template <uint N>
+template <size_t N>
constexpr QStaticByteArrayMatcher<N> qMakeStaticByteArrayMatcher(const char (&pattern)[N]) noexcept
{ return QStaticByteArrayMatcher<N>(pattern); }
diff --git a/src/corelib/text/qbytearrayview.h b/src/corelib/text/qbytearrayview.h
index 11db03c62f..45ebc812cd 100644
--- a/src/corelib/text/qbytearrayview.h
+++ b/src/corelib/text/qbytearrayview.h
@@ -1,53 +1,19 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QBYTEARRAYVIEW_H
#define QBYTEARRAYVIEW_H
#include <QtCore/qbytearrayalgorithms.h>
+#include <QtCore/qcompare.h>
+#include <QtCore/qstringfwd.h>
+#include <QtCore/qarraydata.h>
#include <string>
+#include <string_view>
+#include <QtCore/q20type_traits.h>
QT_BEGIN_NAMESPACE
-class QByteArray;
-class QLatin1String;
-
namespace QtPrivate {
template <typename Byte>
@@ -60,8 +26,7 @@ struct IsCompatibleByteTypeHelper
template <typename Byte>
struct IsCompatibleByteType
- : IsCompatibleByteTypeHelper<
- typename std::remove_cv_t<typename std::remove_reference_t<Byte>>> {};
+ : IsCompatibleByteTypeHelper<q20::remove_cvref_t<Byte>> {};
template <typename Pointer>
struct IsCompatibleByteArrayPointerHelper : std::false_type {};
@@ -70,8 +35,7 @@ struct IsCompatibleByteArrayPointerHelper<Byte *>
: IsCompatibleByteType<Byte> {};
template<typename Pointer>
struct IsCompatibleByteArrayPointer
- : IsCompatibleByteArrayPointerHelper<
- typename std::remove_cv_t<typename std::remove_reference_t<Pointer>>> {};
+ : IsCompatibleByteArrayPointerHelper<q20::remove_cvref_t<Pointer>> {};
template <typename T, typename Enable = void>
struct IsContainerCompatibleWithQByteArrayView : std::false_type {};
@@ -100,6 +64,13 @@ struct IsContainerCompatibleWithQByteArrayView<T, std::enable_if_t<
// Don't make an accidental copy constructor
std::negation<std::is_same<std::decay_t<T>, QByteArrayView>>>>> : std::true_type {};
+// Used by QLatin1StringView too
+template <typename Char>
+static constexpr qsizetype lengthHelperPointer(const Char *data) noexcept
+{
+ return qsizetype(std::char_traits<Char>::length(data));
+}
+
} // namespace QtPrivate
class Q_CORE_EXPORT QByteArrayView
@@ -138,12 +109,6 @@ private:
typename std::enable_if_t<QtPrivate::IsContainerCompatibleWithQByteArrayView<T>::value,
bool>;
- template <typename Char>
- static constexpr qsizetype lengthHelperPointer(const Char *data) noexcept
- {
- return qsizetype(std::char_traits<Char>::length(data));
- }
-
template <typename Container>
static constexpr qsizetype lengthHelperContainer(const Container &c) noexcept
{
@@ -185,7 +150,7 @@ public:
template <typename Pointer, if_compatible_pointer<Pointer> = true>
constexpr QByteArrayView(const Pointer &data) noexcept
: QByteArrayView(
- data, data ? lengthHelperPointer(data) : 0) {}
+ data, data ? QtPrivate::lengthHelperPointer(data) : 0) {}
#endif
#ifdef Q_QDOC
@@ -203,6 +168,9 @@ public:
constexpr QByteArrayView(const char (&data)[Size]) noexcept
: QByteArrayView(data, lengthHelperCharArray(data, Size)) {}
+ constexpr QByteArrayView(QLatin1StringView v) noexcept; // defined in qlatin1stringview.h
+ constexpr QByteArrayView(QUtf8StringView v) noexcept; // defined in qutf8stringview.h
+
#ifdef Q_QDOC
template <typename Byte, size_t Size>
#else
@@ -217,7 +185,7 @@ public:
[[nodiscard]] constexpr const_pointer constData() const noexcept { return data(); }
[[nodiscard]] constexpr char operator[](qsizetype n) const
- { Q_ASSERT(n >= 0); Q_ASSERT(n < size()); return m_data[n]; }
+ { verify(n, 1); return m_data[n]; }
//
// QByteArray API
@@ -225,49 +193,81 @@ public:
[[nodiscard]] constexpr char at(qsizetype n) const { return (*this)[n]; }
[[nodiscard]] constexpr QByteArrayView first(qsizetype n) const
- { Q_ASSERT(n >= 0); Q_ASSERT(n <= size()); return QByteArrayView(data(), n); }
+ { verify(0, n); return sliced(0, n); }
[[nodiscard]] constexpr QByteArrayView last(qsizetype n) const
- { Q_ASSERT(n >= 0); Q_ASSERT(n <= size()); return QByteArrayView(data() + size() - n, n); }
+ { verify(0, n); return sliced(size() - n, n); }
[[nodiscard]] constexpr QByteArrayView sliced(qsizetype pos) const
- { Q_ASSERT(pos >= 0); Q_ASSERT(pos <= size()); return QByteArrayView(data() + pos, size() - pos); }
+ { verify(pos, 0); return QByteArrayView(data() + pos, size() - pos); }
[[nodiscard]] constexpr QByteArrayView sliced(qsizetype pos, qsizetype n) const
- { Q_ASSERT(pos >= 0); Q_ASSERT(n >= 0); Q_ASSERT(size_t(pos) + size_t(n) <= size_t(size())); return QByteArrayView(data() + pos, n); }
+ { verify(pos, n); return QByteArrayView(data() + pos, n); }
[[nodiscard]] constexpr QByteArrayView chopped(qsizetype len) const
- { Q_ASSERT(len >= 0); Q_ASSERT(len <= size()); return first(size() - len); }
+ { verify(0, len); return sliced(0, size() - len); }
+
+ [[nodiscard]] constexpr QByteArrayView left(qsizetype n) const
+ { if (n < 0 || n > size()) n = size(); return QByteArrayView(data(), n); }
+ [[nodiscard]] constexpr QByteArrayView right(qsizetype n) const
+ { if (n < 0 || n > size()) n = size(); if (n < 0) n = 0; return QByteArrayView(data() + size() - n, n); }
+ [[nodiscard]] constexpr QByteArrayView mid(qsizetype pos, qsizetype n = -1) const
+ {
+ using namespace QtPrivate;
+ auto result = QContainerImplHelper::mid(size(), &pos, &n);
+ return result == QContainerImplHelper::Null ? QByteArrayView()
+ : QByteArrayView(m_data + pos, n);
+ }
constexpr void truncate(qsizetype n)
- { Q_ASSERT(n >= 0); Q_ASSERT(n <= size()); m_size = n; }
+ { verify(0, n); m_size = n; }
constexpr void chop(qsizetype n)
- { Q_ASSERT(n >= 0); Q_ASSERT(n <= size()); m_size -= n; }
+ { verify(0, n); m_size -= n; }
// Defined in qbytearray.cpp:
[[nodiscard]] QByteArrayView trimmed() const noexcept
{ return QtPrivate::trimmed(*this); }
- [[nodiscard]] short toShort(bool *ok = nullptr, int base = 10) const;
- [[nodiscard]] ushort toUShort(bool *ok = nullptr, int base = 10) const;
- [[nodiscard]] int toInt(bool *ok = nullptr, int base = 10) const;
- [[nodiscard]] uint toUInt(bool *ok = nullptr, int base = 10) const;
- [[nodiscard]] long toLong(bool *ok = nullptr, int base = 10) const;
- [[nodiscard]] ulong toULong(bool *ok = nullptr, int base = 10) const;
- [[nodiscard]] qlonglong toLongLong(bool *ok = nullptr, int base = 10) const;
- [[nodiscard]] qulonglong toULongLong(bool *ok = nullptr, int base = 10) const;
- [[nodiscard]] float toFloat(bool *ok = nullptr) const;
- [[nodiscard]] double toDouble(bool *ok = nullptr) const;
+ [[nodiscard]] short toShort(bool *ok = nullptr, int base = 10) const
+ { return QtPrivate::toIntegral<short>(*this, ok, base); }
+ [[nodiscard]] ushort toUShort(bool *ok = nullptr, int base = 10) const
+ { return QtPrivate::toIntegral<ushort>(*this, ok, base); }
+ [[nodiscard]] int toInt(bool *ok = nullptr, int base = 10) const
+ { return QtPrivate::toIntegral<int>(*this, ok, base); }
+ [[nodiscard]] uint toUInt(bool *ok = nullptr, int base = 10) const
+ { return QtPrivate::toIntegral<uint>(*this, ok, base); }
+ [[nodiscard]] long toLong(bool *ok = nullptr, int base = 10) const
+ { return QtPrivate::toIntegral<long>(*this, ok, base); }
+ [[nodiscard]] ulong toULong(bool *ok = nullptr, int base = 10) const
+ { return QtPrivate::toIntegral<ulong>(*this, ok, base); }
+ [[nodiscard]] qlonglong toLongLong(bool *ok = nullptr, int base = 10) const
+ { return QtPrivate::toIntegral<qlonglong>(*this, ok, base); }
+ [[nodiscard]] qulonglong toULongLong(bool *ok = nullptr, int base = 10) const
+ { return QtPrivate::toIntegral<qulonglong>(*this, ok, base); }
+ [[nodiscard]] float toFloat(bool *ok = nullptr) const
+ {
+ const auto r = QtPrivate::toFloat(*this);
+ if (ok)
+ *ok = bool(r);
+ return r.value_or(0.0f);
+ }
+ [[nodiscard]] double toDouble(bool *ok = nullptr) const
+ {
+ const auto r = QtPrivate::toDouble(*this);
+ if (ok)
+ *ok = bool(r);
+ return r.value_or(0.0);
+ }
[[nodiscard]] bool startsWith(QByteArrayView other) const noexcept
{ return QtPrivate::startsWith(*this, other); }
- [[nodiscard]] bool startsWith(char c) const noexcept
+ [[nodiscard]] constexpr bool startsWith(char c) const noexcept
{ return !empty() && front() == c; }
[[nodiscard]] bool endsWith(QByteArrayView other) const noexcept
{ return QtPrivate::endsWith(*this, other); }
- [[nodiscard]] bool endsWith(char c) const noexcept
+ [[nodiscard]] constexpr bool endsWith(char c) const noexcept
{ return !empty() && back() == c; }
[[nodiscard]] qsizetype indexOf(QByteArrayView a, qsizetype from = 0) const noexcept
{ return QtPrivate::findByteArray(*this, from, a); }
[[nodiscard]] qsizetype indexOf(char ch, qsizetype from = 0) const noexcept
- { return QtPrivate::findByteArray(*this, from, QByteArrayView(&ch, 1)); }
+ { return QtPrivate::findByteArray(*this, from, ch); }
[[nodiscard]] bool contains(QByteArrayView a) const noexcept
{ return indexOf(a) != qsizetype(-1); }
@@ -279,7 +279,7 @@ public:
[[nodiscard]] qsizetype lastIndexOf(QByteArrayView a, qsizetype from) const noexcept
{ return QtPrivate::lastIndexOf(*this, from, a); }
[[nodiscard]] qsizetype lastIndexOf(char ch, qsizetype from = -1) const noexcept
- { return QtPrivate::lastIndexOf(*this, from, QByteArrayView(&ch, 1)); }
+ { return QtPrivate::lastIndexOf(*this, from, ch); }
[[nodiscard]] qsizetype count(QByteArrayView a) const noexcept
{ return QtPrivate::count(*this, a); }
@@ -306,6 +306,9 @@ public:
[[nodiscard]] constexpr char front() const { Q_ASSERT(!empty()); return m_data[0]; }
[[nodiscard]] constexpr char back() const { Q_ASSERT(!empty()); return m_data[m_size - 1]; }
+ [[nodiscard]] constexpr Q_IMPLICIT operator std::string_view() const noexcept
+ { return std::string_view(m_data, size_t(m_size)); }
+
//
// Qt compatibility API:
//
@@ -316,20 +319,51 @@ public:
[[nodiscard]] constexpr char first() const { return front(); }
[[nodiscard]] constexpr char last() const { return back(); }
- friend inline bool operator==(QByteArrayView lhs, QByteArrayView rhs) noexcept
- { return lhs.size() == rhs.size() && QtPrivate::compareMemory(lhs, rhs) == 0; }
- friend inline bool operator!=(QByteArrayView lhs, QByteArrayView rhs) noexcept
- { return !(lhs == rhs); }
- friend inline bool operator< (QByteArrayView lhs, QByteArrayView rhs) noexcept
- { return QtPrivate::compareMemory(lhs, rhs) < 0; }
- friend inline bool operator<=(QByteArrayView lhs, QByteArrayView rhs) noexcept
- { return QtPrivate::compareMemory(lhs, rhs) <= 0; }
- friend inline bool operator> (QByteArrayView lhs, QByteArrayView rhs) noexcept
- { return !(lhs <= rhs); }
- friend inline bool operator>=(QByteArrayView lhs, QByteArrayView rhs) noexcept
- { return !(lhs < rhs); }
-
private:
+ Q_ALWAYS_INLINE constexpr void verify([[maybe_unused]] qsizetype pos = 0,
+ [[maybe_unused]] qsizetype n = 1) const
+ {
+ Q_ASSERT(pos >= 0);
+ Q_ASSERT(pos <= size());
+ Q_ASSERT(n >= 0);
+ Q_ASSERT(n <= size() - pos);
+ }
+
+ friend bool
+ comparesEqual(const QByteArrayView &lhs, const QByteArrayView &rhs) noexcept
+ {
+ return lhs.size() == rhs.size()
+ && (!lhs.size() || memcmp(lhs.data(), rhs.data(), lhs.size()) == 0);
+ }
+ friend Qt::strong_ordering
+ compareThreeWay(const QByteArrayView &lhs, const QByteArrayView &rhs) noexcept
+ {
+ const int res = QtPrivate::compareMemory(lhs, rhs);
+ return Qt::compareThreeWay(res, 0);
+ }
+ Q_DECLARE_STRONGLY_ORDERED(QByteArrayView)
+
+ friend bool comparesEqual(const QByteArrayView &lhs, const char *rhs) noexcept
+ { return comparesEqual(lhs, QByteArrayView(rhs)); }
+ friend Qt::strong_ordering
+ compareThreeWay(const QByteArrayView &lhs, const char *rhs) noexcept
+ { return compareThreeWay(lhs, QByteArrayView(rhs)); }
+ Q_DECLARE_STRONGLY_ORDERED(QByteArrayView, const char *)
+
+ // defined in qstring.cpp
+ friend Q_CORE_EXPORT bool
+ comparesEqual(const QByteArrayView &lhs, const QChar &rhs) noexcept;
+ friend Q_CORE_EXPORT Qt::strong_ordering
+ compareThreeWay(const QByteArrayView &lhs, const QChar &rhs) noexcept;
+ friend Q_CORE_EXPORT bool
+ comparesEqual(const QByteArrayView &lhs, char16_t rhs) noexcept;
+ friend Q_CORE_EXPORT Qt::strong_ordering
+ compareThreeWay(const QByteArrayView &lhs, char16_t rhs) noexcept;
+#if !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII)
+ Q_DECLARE_STRONGLY_ORDERED(QByteArrayView, QChar, QT_ASCII_CAST_WARN)
+ Q_DECLARE_STRONGLY_ORDERED(QByteArrayView, char16_t, QT_ASCII_CAST_WARN)
+#endif // !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII)
+
qsizetype m_size;
const storage_type *m_data;
};
@@ -338,7 +372,7 @@ Q_DECLARE_TYPEINFO(QByteArrayView, Q_PRIMITIVE_TYPE);
template<typename QByteArrayLike,
std::enable_if_t<std::is_same_v<QByteArrayLike, QByteArray>, bool> = true>
[[nodiscard]] inline QByteArrayView qToByteArrayViewIgnoringNull(const QByteArrayLike &b) noexcept
-{ return QByteArrayView(b.data(), b.size()); }
+{ return QByteArrayView(b.begin(), b.size()); }
inline int QByteArrayView::compare(QByteArrayView a, Qt::CaseSensitivity cs) const noexcept
{
@@ -353,6 +387,20 @@ inline quint16 qChecksum(const char *s, qsizetype len,
{ return qChecksum(QByteArrayView(s, len), standard); }
#endif
+qsizetype QtPrivate::findByteArray(QByteArrayView haystack, qsizetype from, char needle) noexcept
+{
+ if (from < 0)
+ from = qMax(from + haystack.size(), qsizetype(0));
+ if (from < haystack.size()) {
+ const char *const b = haystack.data();
+ if (const auto n = static_cast<const char *>(
+ memchr(b + from, needle, static_cast<size_t>(haystack.size() - from)))) {
+ return n - b;
+ }
+ }
+ return -1;
+}
+
QT_END_NAMESPACE
#endif // QBYTEARRAYVIEW_H
diff --git a/src/corelib/text/qbytearrayview.qdoc b/src/corelib/text/qbytearrayview.qdoc
index 96bb1ccb56..eb890917eb 100644
--- a/src/corelib/text/qbytearrayview.qdoc
+++ b/src/corelib/text/qbytearrayview.qdoc
@@ -1,29 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
\class QByteArrayView
@@ -38,6 +14,15 @@
\reentrant
+ \compares strong
+ \compareswith strong QByteArray {const char *}
+ \endcompareswith
+ \compareswith strong QString QStringView QUtf8StringView QLatin1StringView \
+ QChar char16_t
+ When comparing with string and Unicode character types, the content is
+ interpreted as UTF-8.
+ \endcompareswith
+
A QByteArrayView references a contiguous portion of raw bytes it does
not own. It acts as an interface type to all kinds of byte-array-like data,
without the need to construct a QByteArray first.
@@ -80,6 +65,12 @@
If in doubt, obtain a strong reference to the data by calling toByteArray() to convert
the QByteArrayView into a QByteArray.
+ The methods supported by QByteArrayView reflect those of \l QByteArray. In
+ particular, to the limited degree that it ascribes semantics (such as
+ character case, spacing, digits of numbers) to the character data viewed, it
+ uses the C locale and ASCII encoding. See \l {C locale and ASCII functions}
+ for details and the limitations on these methods.
+
\section1 Compatible Byte Types
QByteArrayView can be constructed on any container of bytes, where the byte type
@@ -202,7 +193,7 @@
*/
/*!
- \fn template <typename Byte> QByteArrayView::QByteArrayView(const Byte *data, qsizetype len)
+ \fn template <typename Byte, QByteArrayView::if_compatible_byte<Byte> = true> QByteArrayView::QByteArrayView(const Byte *data, qsizetype len)
Constructs a byte array view on \a data with length \a len.
@@ -220,7 +211,7 @@
*/
/*!
- \fn template <typename Byte> QByteArrayView::QByteArrayView(const Byte *first, const Byte *last)
+ \fn template <typename Byte, QByteArrayView::if_compatible_byte<Byte> = true> QByteArrayView::QByteArrayView(const Byte *first, const Byte *last)
Constructs a byte array view on \a first with length (\a last - \a first).
@@ -288,7 +279,7 @@
*/
/*!
- \fn template <typename Container> QByteArrayView::QByteArrayView(const Container &c)
+ \fn template <typename Container, QByteArrayView::if_compatible_container<Container> = true> QByteArrayView::QByteArrayView(const Container &c)
Constructs a byte array view on the array-like container \a c. The length and data
are set via \c{std::size(c)} and \c{std::data(c)} respectively.
@@ -296,7 +287,7 @@
The container's data must remain valid for the lifetime of this byte array view object.
This constructor participates in overload resolution if \a c is any contiguous
- container container with elements of a compatible byte type.
+ container with elements of a compatible byte type.
\sa {Compatible Byte Types}
*/
@@ -323,10 +314,6 @@
The return value will be a null QByteArray if and only if this byte array
view is null.
-
- \warning QByteArrayView can store data with more than 2\sup{31} bytes while
- QByteArray cannot. Calling this function on a byte array view for which size()
- returns a value greater than \c{INT_MAX / 2} constitutes undefined behavior.
*/
/*!
@@ -354,12 +341,12 @@
*/
/*! //! friend
- \fn int QByteArrayView::operator==(QByteArrayView lhs, QByteArrayView rhs)
- \fn int QByteArrayView::operator!=(QByteArrayView lhs, QByteArrayView rhs)
- \fn int QByteArrayView::operator< (QByteArrayView lhs, QByteArrayView rhs)
- \fn int QByteArrayView::operator<=(QByteArrayView lhs, QByteArrayView rhs)
- \fn int QByteArrayView::operator> (QByteArrayView lhs, QByteArrayView rhs)
- \fn int QByteArrayView::operator>=(QByteArrayView lhs, QByteArrayView rhs)
+ \fn int QByteArrayView::operator==(const QByteArrayView &lhs, const QByteArrayView &rhs)
+ \fn int QByteArrayView::operator!=(const QByteArrayView &lhs, const QByteArrayView &rhs)
+ \fn int QByteArrayView::operator< (const QByteArrayView &lhs, const QByteArrayView &rhs)
+ \fn int QByteArrayView::operator<=(const QByteArrayView &lhs, const QByteArrayView &rhs)
+ \fn int QByteArrayView::operator> (const QByteArrayView &lhs, const QByteArrayView &rhs)
+ \fn int QByteArrayView::operator>=(const QByteArrayView &lhs, const QByteArrayView &rhs)
Comparison operators for QByteArrayView.
*/
@@ -503,7 +490,7 @@
*/
/*!
- \fn int QByteArrayView::length() const
+ \fn QByteArrayView::length() const
Same as size().
@@ -584,8 +571,10 @@
Returns a byte array view that points to \a n bytes of this byte array
view, starting at position \a pos.
+//! [UB-sliced-index-length]
\note The behavior is undefined when \a pos < 0, \a n < 0,
or \a pos + \a n > size().
+//! [UB-sliced-index-length]
\sa first(), last(), chopped(), chop(), truncate()
*/
@@ -596,7 +585,9 @@
Returns a byte array view starting at position \a pos in this object,
and extending to its end.
+//! [UB-sliced-index-only]
\note The behavior is undefined when \a pos < 0 or \a pos > size().
+//! [UB-sliced-index-only]
\sa first(), last(), chopped(), chop(), truncate()
*/
@@ -640,6 +631,54 @@
*/
/*!
+ \fn QByteArrayView QByteArrayView::mid(qsizetype start, qsizetype length) const
+ \since 6.5
+
+ \deprecated Use sliced() instead in new code.
+
+ Returns the subarray of length \a length starting at position
+ \a start in this object.
+
+ Returns an empty byte array view if \a start exceeds the
+ length of the byte array view. If there are less than \a length characters
+ available in the byte array view starting at \a start, or if
+ \a length is negative (default), the function returns all characters that
+ are available from \a start.
+
+ \sa first(), last(), sliced(), chopped(), chop(), truncate()
+*/
+
+/*!
+ \fn QByteArrayView QByteArrayView::left(qsizetype length) const
+ \since 6.5
+
+ \deprecated Use first() instead in new code.
+
+ Returns the subarray of length \a length starting at position
+ 0 in this object.
+
+ The entire byte array view is returned if \a length is greater than or equal
+ to size(), or less than zero.
+
+ \sa first(), last(), sliced(), startsWith(), chopped(), chop(), truncate()
+*/
+
+/*!
+ \fn QByteArrayView QByteArrayView::right(qsizetype length) const
+ \since 6.5
+
+ \deprecated Use last() instead in new code.
+
+ Returns the subarray of length \a length starting at position
+ size() - \a length in this object.
+
+ The entire byte array view is returned if \a length is greater than or equal
+ to size(), or less than zero.
+
+ \sa first(), last(), sliced(), endsWith(), chopped(), chop(), truncate()
+*/
+
+/*!
\fn QByteArrayView QByteArrayView::trimmed() const noexcept
\since 6.3
@@ -923,8 +962,7 @@
respectively, in this byte array view, searching forward from index position
\a from.Returns -1 if no match is found.
- If \a from is -1, the search starts at the last character; if it is
- -2, at the next to last character and so on.
+ \include qstring.qdocinc negative-index-start-search-from-end
\sa lastIndexOf(), contains()
*/
@@ -947,8 +985,10 @@
Returns the index position of either the start of the last occurrence of
the sequence of bytes viewed by \a bv or the last occurrence of byte \a ch,
respectively, in this byte array view, searching backward from index position
- \a from. If \a from is -1, the search starts at the last character;
- if \a from is -2, at the next to last character and so on.
+ \a from.
+
+ \include qstring.qdocinc negative-index-start-search-from-end
+
Returns -1 if no match is found.
\note When searching for a 0-length \a bv, the match at the end of
@@ -1005,3 +1045,12 @@
\sa QByteArray::isNull(), QByteArrayView
*/
+
+/*!
+ \fn QByteArrayView::operator std::string_view() const
+ \since 6.7
+
+ Converts this QByteArrayView object to a \c{std::string_view} object.
+ The returned view will have the same data pointer and length of
+ this view.
+*/
diff --git a/src/corelib/text/qbytedata_p.h b/src/corelib/text/qbytedata_p.h
index 3c36085021..fcbf82d6ce 100644
--- a/src/corelib/text/qbytedata_p.h
+++ b/src/corelib/text/qbytedata_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QBYTEDATA_P_H
#define QBYTEDATA_P_H
@@ -55,6 +19,8 @@
#include <qbytearray.h>
#include <QtCore/qlist.h>
+#include <climits>
+
QT_BEGIN_NAMESPACE
// this class handles a list of QByteArrays. It is a variant of QRingBuffer
@@ -139,6 +105,7 @@ public:
// preferably use this function to read data.
inline QByteArray read()
{
+ Q_ASSERT(!isEmpty());
squeezeFirst();
bufferCompleteSize -= buffers.first().size();
return buffers.takeFirst();
@@ -156,8 +123,15 @@ public:
inline QByteArray read(qint64 amount)
{
amount = qMin(byteAmount(), amount);
+ if constexpr (sizeof(qsizetype) == sizeof(int)) { // 32-bit
+ // While we cannot overall have more than INT_MAX memory allocated,
+ // the QByteArrays we hold may be shared copies of each other,
+ // causing byteAmount() to exceed INT_MAX.
+ if (amount > INT_MAX)
+ qBadAlloc(); // what resize() would do if it saw past the truncation
+ }
QByteArray byteData;
- byteData.resize(amount);
+ byteData.resize(qsizetype(amount));
read(byteData.data(), byteData.size());
return byteData;
}
@@ -265,9 +239,9 @@ public:
}
// the number of QByteArrays
- inline int bufferCount() const
+ qsizetype bufferCount() const
{
- return buffers.length();
+ return buffers.size();
}
inline bool isEmpty() const
@@ -283,7 +257,7 @@ public:
return buffers.first().size() - firstPos;
}
- inline QByteArray& operator[](int i)
+ QByteArray &operator[](qsizetype i)
{
if (i == 0)
squeezeFirst();
@@ -292,13 +266,13 @@ public:
}
inline bool canReadLine() const {
- int i = 0;
- if (i < buffers.length()) {
+ qsizetype i = 0;
+ if (i < buffers.size()) {
if (buffers.at(i).indexOf('\n', firstPos) != -1)
return true;
++i;
- for (; i < buffers.length(); i++)
+ for (; i < buffers.size(); i++)
if (buffers.at(i).contains('\n'))
return true;
}
diff --git a/src/corelib/text/qchar.cpp b/src/corelib/text/qchar.cpp
index d4a30c1dc6..63296a92de 100644
--- a/src/corelib/text/qchar.cpp
+++ b/src/corelib/text/qchar.cpp
@@ -1,50 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-// Don't define it while compiling this module, or USERS of Qt will
-// not be able to link.
-#ifdef QT_NO_CAST_FROM_ASCII
-# undef QT_NO_CAST_FROM_ASCII
-#endif
-#ifdef QT_NO_CAST_TO_ASCII
-# undef QT_NO_CAST_TO_ASCII
-#endif
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
#include "qchar.h"
#include "qdatastream.h"
@@ -68,7 +24,7 @@ QT_BEGIN_NAMESPACE
This class is only useful to construct a QChar with 8-bit character.
- \sa QChar, QLatin1String, QString
+ \sa QChar, QLatin1StringView, QString
*/
/*!
@@ -99,6 +55,13 @@ QT_BEGIN_NAMESPACE
\ingroup string-processing
\reentrant
+ \compares strong
+ \compareswith strong char16_t QString QStringView QLatin1StringView QUtf8StringView
+ \endcompareswith
+ \compareswith strong {const char *} QByteArray QByteArrayView
+ The contents of the byte array is interpreted as utf-8.
+ \endcompareswith
+
In Qt, Unicode characters are 16-bit entities without any markup
or structure. This class represents such an entity. It is
lightweight, so it can be used everywhere. Most compilers treat
@@ -190,16 +153,18 @@ QT_BEGIN_NAMESPACE
\value Unicode_6_0 Version 6.0
\value Unicode_6_1 Version 6.1
\value Unicode_6_2 Version 6.2
- \value Unicode_6_3 Version 6.3 Since Qt 5.3
- \value Unicode_7_0 Version 7.0 Since Qt 5.5
- \value Unicode_8_0 Version 8.0 Since Qt 5.6
- \value Unicode_9_0 Version 9.0 Since Qt 5.11
- \value Unicode_10_0 Version 10.0 Since Qt 5.11
- \value Unicode_11_0 Version 11.0 Since Qt 5.15
- \value Unicode_12_0 Version 12.0 Since Qt 5.15
- \value Unicode_12_1 Version 12.1 Since Qt 5.15
- \value Unicode_13_0 Version 13.0 Since Qt 5.15
- \value Unicode_14_0 Version 14.0 Since Qt 6.3
+ \value [since 5.3] Unicode_6_3 Version 6.3
+ \value [since 5.5] Unicode_7_0 Version 7.0
+ \value [since 5.6] Unicode_8_0 Version 8.0
+ \value [since 5.11] Unicode_9_0 Version 9.0
+ \value [since 5.11] Unicode_10_0 Version 10.0
+ \value [since 5.15] Unicode_11_0 Version 11.0
+ \value [since 5.15] Unicode_12_0 Version 12.0
+ \value [since 5.15] Unicode_12_1 Version 12.1
+ \value [since 5.15] Unicode_13_0 Version 13.0
+ \value [since 6.3] Unicode_14_0 Version 14.0
+ \value [since 6.5] Unicode_15_0 Version 15.0
+ \value [since 6.8] Unicode_15_1 Version 15.1
\value Unicode_Unassigned The value is not assigned to any character
in version 8.0 of Unicode.
@@ -299,18 +264,18 @@ QT_BEGIN_NAMESPACE
\value Script_Common For characters that may be used with multiple scripts
and that do not inherit their script from the preceding characters.
- \value Script_Adlam Since Qt 5.11
- \value Script_Ahom Since Qt 5.6
- \value Script_AnatolianHieroglyphs Since Qt 5.6
+ \value [since 5.11] Script_Adlam
+ \value [since 5.6] Script_Ahom
+ \value [since 5.6] Script_AnatolianHieroglyphs
\value Script_Arabic
\value Script_Armenian
\value Script_Avestan
\value Script_Balinese
\value Script_Bamum
- \value Script_BassaVah Since Qt 5.5
+ \value [since 5.5] Script_BassaVah
\value Script_Batak
\value Script_Bengali
- \value Script_Bhaiksuki Since Qt 5.11
+ \value [since 5.11] Script_Bhaiksuki
\value Script_Bopomofo
\value Script_Brahmi
\value Script_Braille
@@ -318,38 +283,38 @@ QT_BEGIN_NAMESPACE
\value Script_Buhid
\value Script_CanadianAboriginal
\value Script_Carian
- \value Script_CaucasianAlbanian Since Qt 5.5
+ \value [since 5.5] Script_CaucasianAlbanian
\value Script_Chakma
\value Script_Cham
\value Script_Cherokee
- \value Script_Chorasmian Since Qt 5.15
+ \value [since 5.15] Script_Chorasmian
\value Script_Coptic
\value Script_Cuneiform
\value Script_Cypriot
- \value Script_CyproMinoan Since Qt 6.3
+ \value [since 6.3] Script_CyproMinoan
\value Script_Cyrillic
\value Script_Deseret
\value Script_Devanagari
- \value Script_DivesAkuru Since Qt 5.15
- \value Script_Dogra Since Qt 5.15
- \value Script_Duployan Since Qt 5.5
+ \value [since 5.15] Script_DivesAkuru
+ \value [since 5.15] Script_Dogra
+ \value [since 5.5] Script_Duployan
\value Script_EgyptianHieroglyphs
- \value Script_Elbasan Since Qt 5.5
- \value Script_Elymaic Since Qt 5.15
+ \value [since 5.5] Script_Elbasan
+ \value [since 5.15] Script_Elymaic
\value Script_Ethiopic
\value Script_Georgian
\value Script_Glagolitic
\value Script_Gothic
- \value Script_Grantha Since Qt 5.5
+ \value [since 5.5] Script_Grantha
\value Script_Greek
\value Script_Gujarati
- \value Script_GunjalaGondi Since Qt 5.15
+ \value [since 5.15] Script_GunjalaGondi
\value Script_Gurmukhi
\value Script_Han
\value Script_Hangul
- \value Script_HanifiRohingya Since Qt 5.15
+ \value [since 5.15] Script_HanifiRohingya
\value Script_Hanunoo
- \value Script_Hatran Since Qt 5.6
+ \value [since 5.6] Script_Hatran
\value Script_Hebrew
\value Script_Hiragana
\value Script_ImperialAramaic
@@ -359,78 +324,80 @@ QT_BEGIN_NAMESPACE
\value Script_Kaithi
\value Script_Kannada
\value Script_Katakana
+ \value [since 6.5] Script_Kawi
\value Script_KayahLi
\value Script_Kharoshthi
- \value Script_KhitanSmallScript Since Qt 5.15
+ \value [since 5.15] Script_KhitanSmallScript
\value Script_Khmer
- \value Script_Khojki Since Qt 5.5
- \value Script_Khudawadi Since Qt 5.5
+ \value [since 5.5] Script_Khojki
+ \value [since 5.5] Script_Khudawadi
\value Script_Lao
\value Script_Latin
\value Script_Lepcha
\value Script_Limbu
- \value Script_LinearA Since Qt 5.5
+ \value [since 5.5] Script_LinearA
\value Script_LinearB
\value Script_Lisu
\value Script_Lycian
\value Script_Lydian
- \value Script_Mahajani Since Qt 5.5
- \value Script_Makasar Since Qt 5.15
+ \value [since 5.5] Script_Mahajani
+ \value [since 5.15] Script_Makasar
\value Script_Malayalam
\value Script_Mandaic
- \value Script_Manichaean Since Qt 5.5
- \value Script_Marchen Since Qt 5.11
- \value Script_MasaramGondi Since Qt 5.11
- \value Script_Medefaidrin Since Qt 5.15
+ \value [since 5.5] Script_Manichaean
+ \value [since 5.11] Script_Marchen
+ \value [since 5.11] Script_MasaramGondi
+ \value [since 5.15] Script_Medefaidrin
\value Script_MeeteiMayek
- \value Script_MendeKikakui Since Qt 5.5
+ \value [since 5.5] Script_MendeKikakui
\value Script_MeroiticCursive
\value Script_MeroiticHieroglyphs
\value Script_Miao
- \value Script_Modi Since Qt 5.5
+ \value [since 5.5] Script_Modi
\value Script_Mongolian
- \value Script_Mro Since Qt 5.5
- \value Script_Multani Since Qt 5.6
+ \value [since 5.5] Script_Mro
+ \value [since 5.6] Script_Multani
\value Script_Myanmar
- \value Script_Nabataean Since Qt 5.5
- \value Script_Nandinagari Since Qt 5.15
- \value Script_Newa Since Qt 5.11
+ \value [since 5.5] Script_Nabataean
+ \value [since 6.3] Script_NagMundari
+ \value [since 5.15] Script_Nandinagari
+ \value [since 5.11] Script_Newa
\value Script_NewTaiLue
\value Script_Nko
- \value Script_Nushu Since Qt 5.11
- \value Script_NyiakengPuachueHmong Since Qt 5.15
+ \value [since 5.11] Script_Nushu
+ \value [since 5.15] Script_NyiakengPuachueHmong
\value Script_Ogham
\value Script_OlChiki
- \value Script_OldHungarian Since Qt 5.6
+ \value [since 5.6] Script_OldHungarian
\value Script_OldItalic
- \value Script_OldNorthArabian Since Qt 5.5
- \value Script_OldPermic Since Qt 5.5
+ \value [since 5.5] Script_OldNorthArabian
+ \value [since 5.5] Script_OldPermic
\value Script_OldPersian
- \value Script_OldSogdian Since Qt 5.15
+ \value [since 5.15] Script_OldSogdian
\value Script_OldSouthArabian
\value Script_OldTurkic
- \value Script_OldUyghur Since Qt 6.3
+ \value [since 6.3] Script_OldUyghur
\value Script_Oriya
- \value Script_Osage Since Qt 5.11
+ \value [since 5.11] Script_Osage
\value Script_Osmanya
- \value Script_PahawhHmong Since Qt 5.5
- \value Script_Palmyrene Since Qt 5.5
- \value Script_PauCinHau Since Qt 5.5
+ \value [since 5.5] Script_PahawhHmong
+ \value [since 5.5] Script_Palmyrene
+ \value [since 5.5] Script_PauCinHau
\value Script_PhagsPa
\value Script_Phoenician
- \value Script_PsalterPahlavi Since Qt 5.5
+ \value [since 5.5] Script_PsalterPahlavi
\value Script_Rejang
\value Script_Runic
\value Script_Samaritan
\value Script_Saurashtra
\value Script_Sharada
\value Script_Shavian
- \value Script_Siddham Since Qt 5.5
- \value Script_SignWriting Since Qt 5.6
+ \value [since 5.5] Script_Siddham
+ \value [since 5.6] Script_SignWriting
\value Script_Sinhala
- \value Script_Sogdian Since Qt 5.15
+ \value [since 5.15] Script_Sogdian
\value Script_SoraSompeng
- \value Script_Soyombo Since Qt 5.11
+ \value [since 5.11] Script_Soyombo
\value Script_Sundanese
\value Script_SylotiNagri
\value Script_Syriac
@@ -441,23 +408,23 @@ QT_BEGIN_NAMESPACE
\value Script_TaiViet
\value Script_Takri
\value Script_Tamil
- \value Script_Tangut Since Qt 5.11
- \value Script_Tangsa Since Qt 6.3
+ \value [since 5.11] Script_Tangut
+ \value [since 6.3] Script_Tangsa
\value Script_Telugu
\value Script_Thaana
\value Script_Thai
\value Script_Tibetan
\value Script_Tifinagh
- \value Script_Tirhuta Since Qt 5.5
- \value Script_Toto Since Qt 6.3
+ \value [since 5.5] Script_Tirhuta
+ \value [since 6.3] Script_Toto
\value Script_Ugaritic
\value Script_Vai
- \value Script_Vithkuqi Since Qt 6.3
- \value Script_Wancho Since Qt 5.15
- \value Script_WarangCiti Since Qt 5.5
- \value Script_Yezidi Since Qt 5.15
+ \value [since 6.3] Script_Vithkuqi
+ \value [since 5.15] Script_Wancho
+ \value [since 5.5] Script_WarangCiti
+ \value [since 5.15] Script_Yezidi
\value Script_Yi
- \value Script_ZanabazarSquare Since Qt 5.11
+ \value [since 5.11] Script_ZanabazarSquare
\omitvalue ScriptCount
@@ -482,18 +449,18 @@ QT_BEGIN_NAMESPACE
\value DirEN
\value DirES
\value DirET
- \value DirFSI Since Qt 5.3
+ \value [since 5.3] DirFSI
\value DirL
\value DirLRE
- \value DirLRI Since Qt 5.3
+ \value [since 5.3] DirLRI
\value DirLRO
\value DirNSM
\value DirON
\value DirPDF
- \value DirPDI Since Qt 5.3
+ \value [since 5.3] DirPDI
\value DirR
\value DirRLE
- \value DirRLI Since Qt 5.3
+ \value [since 5.3] DirRLI
\value DirRLO
\value DirS
\value DirWS
@@ -599,7 +566,7 @@ QT_BEGIN_NAMESPACE
\value ByteOrderSwapped
\value ParagraphSeparator
\value LineSeparator
- \value VisualTabCharacter Used to represent a tabulation as a horizontal arrow. Since 6.2.
+ \value [since 6.2] VisualTabCharacter Used to represent a tabulation as a horizontal arrow.
\value LastValidCodePoint
*/
@@ -1401,7 +1368,7 @@ static const QChar * QT_FASTCALL decompositionHelper(
{
if (ucs4 >= Hangul_SBase && ucs4 < Hangul_SBase + Hangul_SCount) {
// compute Hangul syllable decomposition as per UAX #15
- const uint SIndex = ucs4 - Hangul_SBase;
+ const char32_t SIndex = ucs4 - Hangul_SBase;
buffer[0] = QChar(Hangul_LBase + SIndex / Hangul_NCount); // L
buffer[1] = QChar(Hangul_VBase + (SIndex % Hangul_NCount) / Hangul_TCount); // V
buffer[2] = QChar(Hangul_TBase + SIndex % Hangul_TCount); // T
@@ -1780,47 +1747,64 @@ QDataStream &operator>>(QDataStream &in, QChar &chr)
*****************************************************************************/
/*!
- \fn bool QChar::operator==(QChar c1, QChar c2)
+ \fn bool QChar::operator==(const QChar &c1, const QChar &c2)
Returns \c true if \a c1 and \a c2 are the same Unicode character;
otherwise returns \c false.
*/
/*!
- \fn int QChar::operator!=(QChar c1, QChar c2)
+ \fn bool QChar::operator!=(const QChar &c1, const QChar &c2)
Returns \c true if \a c1 and \a c2 are not the same Unicode
character; otherwise returns \c false.
*/
/*!
- \fn int QChar::operator<=(QChar c1, QChar c2)
+ \fn bool QChar::operator<=(const QChar &c1, const QChar &c2)
Returns \c true if the numeric Unicode value of \a c1 is less than
or equal to that of \a c2; otherwise returns \c false.
*/
/*!
- \fn int QChar::operator>=(QChar c1, QChar c2)
+ \fn bool QChar::operator>=(const QChar &c1, const QChar &c2)
Returns \c true if the numeric Unicode value of \a c1 is greater than
or equal to that of \a c2; otherwise returns \c false.
*/
/*!
- \fn int QChar::operator<(QChar c1, QChar c2)
+ \fn bool QChar::operator<(const QChar &c1, const QChar &c2)
Returns \c true if the numeric Unicode value of \a c1 is less than
that of \a c2; otherwise returns \c false.
*/
/*!
- \fn int QChar::operator>(QChar c1, QChar c2)
+ \fn bool QChar::operator>(const QChar &c1, const QChar &c2)
Returns \c true if the numeric Unicode value of \a c1 is greater than
that of \a c2; otherwise returns \c false.
*/
+/*!
+ \fn Qt::Literals::StringLiterals::operator""_L1(char ch)
+
+ \relates QLatin1Char
+ \since 6.4
+
+ Literal operator that creates a QLatin1Char out of \a ch.
+
+ The following code creates a QLatin1Char:
+ \code
+ using namespace Qt::Literals::StringLiterals;
+
+ auto ch = 'a'_L1;
+ \endcode
+
+ \sa Qt::Literals::StringLiterals
+*/
// ---------------------------------------------------------------------------
@@ -1834,7 +1818,7 @@ static void decomposeHelper(QString *str, bool canonical, QChar::UnicodeVersion
QString &s = *str;
const unsigned short *utf16 = reinterpret_cast<unsigned short *>(s.data());
- const unsigned short *uc = utf16 + s.length();
+ const unsigned short *uc = utf16 + s.size();
while (uc != utf16 + from) {
char32_t ucs4 = *(--uc);
if (QChar(ucs4).isLowSurrogate() && uc != utf16) {
@@ -1880,26 +1864,26 @@ struct UCS2SurrogatePair {
inline bool operator<(const UCS2SurrogatePair &ligature1, const UCS2SurrogatePair &ligature2)
{ return QChar::surrogateToUcs4(ligature1.p1.u1, ligature1.p1.u2) < QChar::surrogateToUcs4(ligature2.p1.u1, ligature2.p1.u2); }
-inline bool operator<(uint u1, const UCS2SurrogatePair &ligature)
+inline bool operator<(char32_t u1, const UCS2SurrogatePair &ligature)
{ return u1 < QChar::surrogateToUcs4(ligature.p1.u1, ligature.p1.u2); }
-inline bool operator<(const UCS2SurrogatePair &ligature, uint u1)
+inline bool operator<(const UCS2SurrogatePair &ligature, char32_t u1)
{ return QChar::surrogateToUcs4(ligature.p1.u1, ligature.p1.u2) < u1; }
-static uint inline ligatureHelper(uint u1, uint u2)
+static char32_t inline ligatureHelper(char32_t u1, char32_t u2)
{
if (u1 >= Hangul_LBase && u1 < Hangul_SBase + Hangul_SCount) {
// compute Hangul syllable composition as per UAX #15
// hangul L-V pair
- const uint LIndex = u1 - Hangul_LBase;
+ const char32_t LIndex = u1 - Hangul_LBase;
if (LIndex < Hangul_LCount) {
- const uint VIndex = u2 - Hangul_VBase;
+ const char32_t VIndex = u2 - Hangul_VBase;
if (VIndex < Hangul_VCount)
return Hangul_SBase + (LIndex * Hangul_VCount + VIndex) * Hangul_TCount;
}
// hangul LV-T pair
- const uint SIndex = u1 - Hangul_SBase;
+ const char32_t SIndex = u1 - Hangul_SBase;
if (SIndex < Hangul_SCount && (SIndex % Hangul_TCount) == 0) {
- const uint TIndex = u2 - Hangul_TBase;
+ const char32_t TIndex = u2 - Hangul_TBase;
if (TIndex < Hangul_TCount && TIndex)
return u1 + TIndex;
}
@@ -1929,19 +1913,19 @@ static void composeHelper(QString *str, QChar::UnicodeVersion version, qsizetype
{
QString &s = *str;
- if (from < 0 || s.length() - from < 2)
+ if (from < 0 || s.size() - from < 2)
return;
- uint stcode = 0; // starter code point
+ char32_t stcode = 0; // starter code point
qsizetype starter = -1; // starter position
qsizetype next = -1; // to prevent i == next
int lastCombining = 255; // to prevent combining > lastCombining
qsizetype pos = from;
- while (pos < s.length()) {
+ while (pos < s.size()) {
qsizetype i = pos;
char32_t uc = s.at(pos).unicode();
- if (QChar(uc).isHighSurrogate() && pos < s.length()-1) {
+ if (QChar(uc).isHighSurrogate() && pos < s.size()-1) {
ushort low = s.at(pos+1).unicode();
if (QChar(low).isLowSurrogate()) {
uc = QChar::surrogateToUcs4(uc, low);
@@ -1961,7 +1945,7 @@ static void composeHelper(QString *str, QChar::UnicodeVersion version, qsizetype
int combining = p->combiningClass;
if ((i == next || combining > lastCombining) && starter >= from) {
// allowed to form ligature with S
- uint ligature = ligatureHelper(stcode, uc);
+ char32_t ligature = ligatureHelper(stcode, uc);
if (ligature) {
stcode = ligature;
QChar *d = s.data();
@@ -1988,7 +1972,7 @@ static void composeHelper(QString *str, QChar::UnicodeVersion version, qsizetype
static void canonicalOrderHelper(QString *str, QChar::UnicodeVersion version, qsizetype from)
{
QString &s = *str;
- const qsizetype l = s.length()-1;
+ const qsizetype l = s.size()-1;
char32_t u1, u2;
char16_t c1, c2;
@@ -2076,8 +2060,8 @@ static bool normalizationQuickCheckHelper(QString *str, QString::NormalizationFo
enum { NFQC_YES = 0, NFQC_NO = 1, NFQC_MAYBE = 3 };
- const ushort *string = reinterpret_cast<const ushort *>(str->constData());
- qsizetype length = str->length();
+ const auto *string = reinterpret_cast<const char16_t *>(str->constData());
+ qsizetype length = str->size();
// this avoids one out of bounds check in the loop
while (length > from && QChar::isHighSurrogate(string[length - 1]))
@@ -2120,8 +2104,8 @@ static bool normalizationQuickCheckHelper(QString *str, QString::NormalizationFo
*lastStable = pos;
}
- if (length != str->length()) // low surrogate parts at the end of text
- *lastStable = str->length() - 1;
+ if (length != str->size()) // low surrogate parts at the end of text
+ *lastStable = str->size() - 1;
return true;
}
diff --git a/src/corelib/text/qchar.h b/src/corelib/text/qchar.h
index f8d63c54f1..c0c53664c2 100644
--- a/src/corelib/text/qchar.h
+++ b/src/corelib/text/qchar.h
@@ -1,46 +1,11 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QCHAR_H
#define QCHAR_H
#include <QtCore/qglobal.h>
+#include <QtCore/qcompare.h>
#include <functional> // for std::hash
@@ -56,32 +21,27 @@ public:
constexpr inline char toLatin1() const noexcept { return ch; }
constexpr inline char16_t unicode() const noexcept { return char16_t(uchar(ch)); }
- friend constexpr inline bool operator==(QLatin1Char lhs, QLatin1Char rhs) noexcept { return lhs.ch == rhs.ch; }
- friend constexpr inline bool operator!=(QLatin1Char lhs, QLatin1Char rhs) noexcept { return lhs.ch != rhs.ch; }
- friend constexpr inline bool operator<=(QLatin1Char lhs, QLatin1Char rhs) noexcept { return lhs.ch <= rhs.ch; }
- friend constexpr inline bool operator>=(QLatin1Char lhs, QLatin1Char rhs) noexcept { return lhs.ch >= rhs.ch; }
- friend constexpr inline bool operator< (QLatin1Char lhs, QLatin1Char rhs) noexcept { return lhs.ch < rhs.ch; }
- friend constexpr inline bool operator> (QLatin1Char lhs, QLatin1Char rhs) noexcept { return lhs.ch > rhs.ch; }
-
- friend constexpr inline bool operator==(char lhs, QLatin1Char rhs) noexcept { return lhs == rhs.toLatin1(); }
- friend constexpr inline bool operator!=(char lhs, QLatin1Char rhs) noexcept { return lhs != rhs.toLatin1(); }
- friend constexpr inline bool operator<=(char lhs, QLatin1Char rhs) noexcept { return lhs <= rhs.toLatin1(); }
- friend constexpr inline bool operator>=(char lhs, QLatin1Char rhs) noexcept { return lhs >= rhs.toLatin1(); }
- friend constexpr inline bool operator< (char lhs, QLatin1Char rhs) noexcept { return lhs < rhs.toLatin1(); }
- friend constexpr inline bool operator> (char lhs, QLatin1Char rhs) noexcept { return lhs > rhs.toLatin1(); }
-
- friend constexpr inline bool operator==(QLatin1Char lhs, char rhs) noexcept { return lhs.toLatin1() == rhs; }
- friend constexpr inline bool operator!=(QLatin1Char lhs, char rhs) noexcept { return lhs.toLatin1() != rhs; }
- friend constexpr inline bool operator<=(QLatin1Char lhs, char rhs) noexcept { return lhs.toLatin1() <= rhs; }
- friend constexpr inline bool operator>=(QLatin1Char lhs, char rhs) noexcept { return lhs.toLatin1() >= rhs; }
- friend constexpr inline bool operator< (QLatin1Char lhs, char rhs) noexcept { return lhs.toLatin1() < rhs; }
- friend constexpr inline bool operator> (QLatin1Char lhs, char rhs) noexcept { return lhs.toLatin1() > rhs; }
+ friend constexpr bool
+ comparesEqual(const QLatin1Char &lhs, const QLatin1Char &rhs) noexcept
+ { return lhs.ch == rhs.ch; }
+ friend constexpr Qt::strong_ordering
+ compareThreeWay(const QLatin1Char &lhs, const QLatin1Char &rhs) noexcept
+ { return Qt::compareThreeWay(uchar(lhs.ch), uchar(rhs.ch)); }
+ Q_DECLARE_STRONGLY_ORDERED_LITERAL_TYPE(QLatin1Char)
+
+ friend constexpr bool comparesEqual(const QLatin1Char &lhs, char rhs) noexcept
+ { return lhs.toLatin1() == rhs; }
+ friend constexpr Qt::strong_ordering
+ compareThreeWay(const QLatin1Char &lhs, char rhs) noexcept
+ { return Qt::compareThreeWay(uchar(lhs.toLatin1()), uchar(rhs)); }
+ Q_DECLARE_STRONGLY_ORDERED_LITERAL_TYPE(QLatin1Char, char)
private:
char ch;
};
-class Q_CORE_EXPORT QChar {
+#define QT_CHAR_FASTCALL QT7_ONLY(Q_CORE_EXPORT) QT_FASTCALL
+class QT6_ONLY(Q_CORE_EXPORT) QChar {
public:
enum SpecialCharacter {
Null = 0x0000,
@@ -117,7 +77,7 @@ public:
constexpr Q_IMPLICIT QChar(SpecialCharacter s) noexcept : ucs(char16_t(s)) {}
constexpr Q_IMPLICIT QChar(QLatin1Char ch) noexcept : ucs(ch.unicode()) {}
constexpr Q_IMPLICIT QChar(char16_t ch) noexcept : ucs(ch) {}
-#if defined(Q_OS_WIN) || defined(Q_CLANG_QDOC)
+#if defined(Q_OS_WIN) || defined(Q_QDOC)
constexpr Q_IMPLICIT QChar(wchar_t ch) noexcept : ucs(char16_t(ch)) {}
#endif
@@ -370,6 +330,10 @@ public:
Script_Toto,
Script_Vithkuqi,
+ // Unicode 15.0 additions
+ Script_Kawi,
+ Script_NagMundari,
+
ScriptCount
};
@@ -461,7 +425,9 @@ public:
Unicode_12_0,
Unicode_12_1,
Unicode_13_0,
- Unicode_14_0
+ Unicode_14_0,
+ Unicode_15_0,
+ Unicode_15_1,
};
inline Category category() const noexcept { return QChar::category(ucs); }
@@ -555,39 +521,39 @@ public:
return char16_t(ucs4%0x400 + 0xdc00);
}
- static Category QT_FASTCALL category(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
- static Direction QT_FASTCALL direction(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
- static JoiningType QT_FASTCALL joiningType(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
- static unsigned char QT_FASTCALL combiningClass(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
+ static Category QT_CHAR_FASTCALL category(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
+ static Direction QT_CHAR_FASTCALL direction(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
+ static JoiningType QT_CHAR_FASTCALL joiningType(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
+ static unsigned char QT_CHAR_FASTCALL combiningClass(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
- static char32_t QT_FASTCALL mirroredChar(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
- static bool QT_FASTCALL hasMirrored(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
+ static char32_t QT_CHAR_FASTCALL mirroredChar(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
+ static bool QT_CHAR_FASTCALL hasMirrored(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
- static QString QT_FASTCALL decomposition(char32_t ucs4);
- static Decomposition QT_FASTCALL decompositionTag(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
+ static QString QT_CHAR_FASTCALL decomposition(char32_t ucs4);
+ static Decomposition QT_CHAR_FASTCALL decompositionTag(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
- static int QT_FASTCALL digitValue(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
- static char32_t QT_FASTCALL toLower(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
- static char32_t QT_FASTCALL toUpper(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
- static char32_t QT_FASTCALL toTitleCase(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
- static char32_t QT_FASTCALL toCaseFolded(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
+ static int QT_CHAR_FASTCALL digitValue(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
+ static char32_t QT_CHAR_FASTCALL toLower(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
+ static char32_t QT_CHAR_FASTCALL toUpper(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
+ static char32_t QT_CHAR_FASTCALL toTitleCase(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
+ static char32_t QT_CHAR_FASTCALL toCaseFolded(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
- static Script QT_FASTCALL script(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
+ static Script QT_CHAR_FASTCALL script(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
- static UnicodeVersion QT_FASTCALL unicodeVersion(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
+ static UnicodeVersion QT_CHAR_FASTCALL unicodeVersion(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
- static UnicodeVersion QT_FASTCALL currentUnicodeVersion() noexcept Q_DECL_CONST_FUNCTION;
+ static UnicodeVersion QT_CHAR_FASTCALL currentUnicodeVersion() noexcept Q_DECL_CONST_FUNCTION;
- static bool QT_FASTCALL isPrint(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
+ static bool QT_CHAR_FASTCALL isPrint(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
static constexpr inline bool isSpace(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION
{
// note that [0x09..0x0d] + 0x85 are exceptional Cc-s and must be handled explicitly
return ucs4 == 0x20 || (ucs4 <= 0x0d && ucs4 >= 0x09)
|| (ucs4 > 127 && (ucs4 == 0x85 || ucs4 == 0xa0 || QChar::isSpace_helper(ucs4)));
}
- static bool QT_FASTCALL isMark(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
- static bool QT_FASTCALL isPunct(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
- static bool QT_FASTCALL isSymbol(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
+ static bool QT_CHAR_FASTCALL isMark(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
+ static bool QT_CHAR_FASTCALL isPunct(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
+ static bool QT_CHAR_FASTCALL isSymbol(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
static constexpr inline bool isLetter(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION
{
return (ucs4 >= 'A' && ucs4 <= 'z' && (ucs4 >= 'a' || ucs4 <= 'Z'))
@@ -610,34 +576,44 @@ public:
static constexpr inline bool isTitleCase(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION
{ return ucs4 > 127 && QChar::category(ucs4) == Letter_Titlecase; }
- friend constexpr inline bool operator==(QChar c1, QChar c2) noexcept { return c1.ucs == c2.ucs; }
- friend constexpr inline bool operator< (QChar c1, QChar c2) noexcept { return c1.ucs < c2.ucs; }
-
- friend constexpr inline bool operator!=(QChar c1, QChar c2) noexcept { return !operator==(c1, c2); }
- friend constexpr inline bool operator>=(QChar c1, QChar c2) noexcept { return !operator< (c1, c2); }
- friend constexpr inline bool operator> (QChar c1, QChar c2) noexcept { return operator< (c2, c1); }
- friend constexpr inline bool operator<=(QChar c1, QChar c2) noexcept { return !operator< (c2, c1); }
-
- friend constexpr inline bool operator==(QChar lhs, std::nullptr_t) noexcept { return lhs.isNull(); }
- friend constexpr inline bool operator< (QChar, std::nullptr_t) noexcept { return false; }
- friend constexpr inline bool operator==(std::nullptr_t, QChar rhs) noexcept { return rhs.isNull(); }
- friend constexpr inline bool operator< (std::nullptr_t, QChar rhs) noexcept { return !rhs.isNull(); }
+ friend constexpr bool comparesEqual(const QChar &lhs, const QChar &rhs) noexcept
+ { return lhs.ucs == rhs.ucs; }
+ friend constexpr Qt::strong_ordering
+ compareThreeWay(const QChar &lhs, const QChar &rhs) noexcept
+ { return Qt::compareThreeWay(lhs.ucs, rhs.ucs); }
+ Q_DECLARE_STRONGLY_ORDERED_LITERAL_TYPE(QChar)
- friend constexpr inline bool operator!=(QChar lhs, std::nullptr_t) noexcept { return !operator==(lhs, nullptr); }
- friend constexpr inline bool operator>=(QChar lhs, std::nullptr_t) noexcept { return !operator< (lhs, nullptr); }
- friend constexpr inline bool operator> (QChar lhs, std::nullptr_t) noexcept { return operator< (nullptr, lhs); }
- friend constexpr inline bool operator<=(QChar lhs, std::nullptr_t) noexcept { return !operator< (nullptr, lhs); }
-
- friend constexpr inline bool operator!=(std::nullptr_t, QChar rhs) noexcept { return !operator==(nullptr, rhs); }
- friend constexpr inline bool operator>=(std::nullptr_t, QChar rhs) noexcept { return !operator< (nullptr, rhs); }
- friend constexpr inline bool operator> (std::nullptr_t, QChar rhs) noexcept { return operator< (rhs, nullptr); }
- friend constexpr inline bool operator<=(std::nullptr_t, QChar rhs) noexcept { return !operator< (rhs, nullptr); }
+ friend constexpr bool comparesEqual(const QChar &lhs, std::nullptr_t) noexcept
+ { return lhs.isNull(); }
+ friend constexpr Qt::strong_ordering
+ compareThreeWay(const QChar &lhs, std::nullptr_t) noexcept
+ { return lhs.isNull() ? Qt::strong_ordering::equivalent : Qt::strong_ordering::greater; }
+ Q_DECLARE_STRONGLY_ORDERED_LITERAL_TYPE(QChar, std::nullptr_t)
private:
- static bool QT_FASTCALL isSpace_helper(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
- static bool QT_FASTCALL isLetter_helper(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
- static bool QT_FASTCALL isNumber_helper(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
- static bool QT_FASTCALL isLetterOrNumber_helper(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
+ static bool QT_CHAR_FASTCALL isSpace_helper(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
+ static bool QT_CHAR_FASTCALL isLetter_helper(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
+ static bool QT_CHAR_FASTCALL isNumber_helper(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
+ static bool QT_CHAR_FASTCALL isLetterOrNumber_helper(char32_t ucs4) noexcept Q_DECL_CONST_FUNCTION;
+
+ // defined in qstring.cpp, because we need to go via QUtf8StringView
+ static bool QT_CHAR_FASTCALL
+ equal_helper(QChar lhs, const char *rhs) noexcept Q_DECL_CONST_FUNCTION;
+ static int QT_CHAR_FASTCALL
+ compare_helper(QChar lhs, const char *rhs) noexcept Q_DECL_CONST_FUNCTION;
+
+#if !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII)
+ Q_WEAK_OVERLOAD
+ friend bool comparesEqual(const QChar &lhs, const char *rhs) noexcept
+ { return equal_helper(lhs, rhs); }
+ Q_WEAK_OVERLOAD
+ friend Qt::strong_ordering compareThreeWay(const QChar &lhs, const char *rhs) noexcept
+ {
+ const int res = compare_helper(lhs, rhs);
+ return Qt::compareThreeWay(res, 0);
+ }
+ Q_DECLARE_STRONGLY_ORDERED(QChar, const char *, Q_WEAK_OVERLOAD QT_ASCII_CAST_WARN)
+#endif // !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII)
#ifdef QT_NO_CAST_FROM_ASCII
QChar(char c) = delete;
@@ -646,6 +622,7 @@ private:
char16_t ucs;
};
+#undef QT_CHAR_FASTCALL
Q_DECLARE_TYPEINFO(QChar, Q_PRIMITIVE_TYPE);
@@ -654,6 +631,19 @@ Q_CORE_EXPORT QDataStream &operator<<(QDataStream &, QChar);
Q_CORE_EXPORT QDataStream &operator>>(QDataStream &, QChar &);
#endif
+namespace Qt {
+inline namespace Literals {
+inline namespace StringLiterals {
+
+constexpr inline QLatin1Char operator""_L1(char ch) noexcept
+{
+ return QLatin1Char(ch);
+}
+
+} // StringLiterals
+} // Literals
+} // Qt
+
QT_END_NAMESPACE
namespace std {
diff --git a/src/corelib/text/qcollator.cpp b/src/corelib/text/qcollator.cpp
index 8bffae83da..1f7e7459e7 100644
--- a/src/corelib/text/qcollator.cpp
+++ b/src/corelib/text/qcollator.cpp
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Copyright (C) 2013 Aleix Pol Gonzalez <aleixpol@kde.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// Copyright (C) 2013 Aleix Pol Gonzalez <aleixpol@kde.org>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qcollator_p.h"
#include "qstringlist.h"
@@ -47,6 +11,7 @@
#include "qthreadstorage.h"
QT_BEGIN_NAMESPACE
+QT_DEFINE_QESDP_SPECIALIZATION_DTOR(QCollatorSortKeyPrivate)
namespace {
struct GenerationalCollator
@@ -83,7 +48,7 @@ Q_GLOBAL_STATIC(QThreadStorage<GenerationalCollator>, defaultCollator)
\ingroup shared
QCollator is initialized with a QLocale. It can then be used to compare and
- sort strings in using the ordering appropriate to the locale.
+ sort strings by using the ordering appropriate for that locale.
A QCollator object can be used together with template-based sorting
algorithms, such as std::sort(), to sort a list with QString entries.
@@ -93,9 +58,25 @@ Q_GLOBAL_STATIC(QThreadStorage<GenerationalCollator>, defaultCollator)
In addition to the locale, several optional flags can be set that influence
the result of the collation.
- \note On Linux, Qt is normally compiled to use ICU. When it isn't, all
- options are ignored and the only supported locales are the system default
- (that \c{setlocale(LC_COLLATE, nullptr)} would report) and the "C" locale.
+ \section1 POSIX fallback implementation
+
+ On Unix systems, Qt is normally compiled to use ICU (except for \macos,
+ where Qt defaults to using an equivalent Apple API). However, if ICU was
+ not available at compile time or explicitly disabled, Qt will use a
+ fallback backend that uses the POSIX API only. This backend has several
+ limitations:
+
+ \list
+ \li Only the QLocale::c() and QLocale::system() locales are supported.
+ Consult the POSIX and C Standard Library manuals for the
+ \c{<locale.h>} header for more information on the system locale.
+ \li caseSensitivity() is not supported: only case-sensitive collation
+ can be performed.
+ \li numericMode() and ignorePunctuation() are not supported.
+ \endlist
+
+ The use of any of the unsupported options will cause a warning to be
+ printed to the application's output.
*/
/*!
@@ -133,8 +114,7 @@ QCollator::QCollator(const QCollator &other)
{
if (d) {
// Ensure clean, lest both copies try to init() at the same time:
- if (d->dirty)
- d->init();
+ d->ensureInitialized();
d->ref.ref();
}
}
@@ -159,8 +139,7 @@ QCollator &QCollator::operator=(const QCollator &other)
d = other.d;
if (d) {
// Ensure clean, lest both copies try to init() at the same time:
- if (d->dirty)
- d->init();
+ d->ensureInitialized();
d->ref.ref();
}
}
@@ -172,19 +151,19 @@ QCollator &QCollator::operator=(const QCollator &other)
Move constructor. Moves from \a other into this collator.
- Note that a moved-from QCollator can only be destroyed or assigned to.
- The effect of calling other functions than the destructor or one of the
- assignment operators is undefined.
+//! [partially-formed]
+ \note The moved-from object \a other is placed in a partially-formed state,
+ in which the only valid operations are destruction and assignment of a new
+ value.
+//! [partially-formed]
*/
/*!
\fn QCollator & QCollator::operator=(QCollator && other)
- Move-assigns from \a other to this collator.
+ Move-assigns \a other to this QCollator instance.
- Note that a moved-from QCollator can only be destroyed or assigned to.
- The effect of calling other functions than the destructor or one of the
- assignment operators is undefined.
+ \include qcollator.cpp partially-formed
*/
/*!
@@ -339,10 +318,10 @@ bool QCollator::ignorePunctuation() const
Compares \a s1 with \a s2.
- Returns an integer less than, equal to, or greater than zero depending on
- whether \a s1 sorts before, with or after \a s2.
+ Returns a negative integer if \a s1 is less than \a s2, a positive integer
+ if it is greater than \a s2, and zero if they are equal.
*/
-#if QT_STRINGVIEW_LEVEL < 2
+
/*!
\fn bool QCollator::operator()(const QString &s1, const QString &s2) const
\overload
@@ -356,17 +335,20 @@ bool QCollator::ignorePunctuation() const
*/
/*!
- \fn int QCollator::compare(const QChar *s1, int len1, const QChar *s2, int len2) const
+ \fn int QCollator::compare(const QChar *s1, qsizetype len1, const QChar *s2, qsizetype len2) const
\overload
\since 5.2
Compares \a s1 with \a s2. \a len1 and \a len2 specify the lengths of the
QChar arrays pointed to by \a s1 and \a s2.
- Returns an integer less than, equal to, or greater than zero depending on
- whether \a s1 sorts before, with or after \a s2.
+ Returns a negative integer if \a s1 is less than \a s2, a positive integer
+ if it is greater than \a s2, and zero if they are equal.
+
+
+ \note In Qt versions prior to 6.4, the length arguments were of type
+ \c{int}, not \c{qsizetype}.
*/
-#endif // QT_STRINGVIEW_LEVEL < 2
/*!
\since 6.3
@@ -443,6 +425,14 @@ QCollatorSortKey::QCollatorSortKey(const QCollatorSortKey &other)
}
/*!
+ \since 6.8
+ \fn QCollatorSortKey::QCollatorSortKey(QCollatorSortKey &&other)
+ Move-constructs a new QCollatorSortKey from \a other.
+
+ \include qcollator.cpp partially-formed
+*/
+
+/*!
Destroys the collator key.
*/
QCollatorSortKey::~QCollatorSortKey()
@@ -463,7 +453,9 @@ QCollatorSortKey& QCollatorSortKey::operator=(const QCollatorSortKey &other)
/*!
\fn QCollatorSortKey &QCollatorSortKey::operator=(QCollatorSortKey && other)
- Move-assigns \a other to this collator key.
+ Move-assigns \a other to this QCollatorSortKey instance.
+
+ \include qcollator.cpp partially-formed
*/
/*!
diff --git a/src/corelib/text/qcollator.h b/src/corelib/text/qcollator.h
index ddfbacfd19..9f61cfc22a 100644
--- a/src/corelib/text/qcollator.h
+++ b/src/corelib/text/qcollator.h
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Copyright (C) 2013 Aleix Pol Gonzalez <aleixpol@kde.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// Copyright (C) 2013 Aleix Pol Gonzalez <aleixpol@kde.org>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QCOLLATOR_H
#define QCOLLATOR_H
@@ -49,12 +13,14 @@ QT_BEGIN_NAMESPACE
class QCollatorPrivate;
class QCollatorSortKeyPrivate;
+QT_DECLARE_QESDP_SPECIALIZATION_DTOR_WITH_EXPORT(QCollatorSortKeyPrivate, Q_CORE_EXPORT)
class Q_CORE_EXPORT QCollatorSortKey
{
friend class QCollator;
public:
QCollatorSortKey(const QCollatorSortKey &other);
+ QCollatorSortKey(QCollatorSortKey &&other) noexcept = default;
~QCollatorSortKey();
QCollatorSortKey &operator=(const QCollatorSortKey &other);
QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_PURE_SWAP(QCollatorSortKey)
@@ -87,7 +53,7 @@ public:
QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_MOVE_AND_SWAP(QCollator)
void swap(QCollator &other) noexcept
- { qSwap(d, other.d); }
+ { qt_ptr_swap(d, other.d); }
void setLocale(const QLocale &locale);
QLocale locale() const;
@@ -101,15 +67,17 @@ public:
void setIgnorePunctuation(bool on);
bool ignorePunctuation() const;
-#if QT_STRINGVIEW_LEVEL < 2
int compare(const QString &s1, const QString &s2) const
{ return compare(QStringView(s1), QStringView(s2)); }
+#if QT_CORE_REMOVED_SINCE(6, 4) && QT_POINTER_SIZE != 4
int compare(const QChar *s1, int len1, const QChar *s2, int len2) const
{ return compare(QStringView(s1, len1), QStringView(s2, len2)); }
+#endif
+ int compare(const QChar *s1, qsizetype len1, const QChar *s2, qsizetype len2) const
+ { return compare(QStringView(s1, len1), QStringView(s2, len2)); }
bool operator()(const QString &s1, const QString &s2) const
{ return compare(s1, s2) < 0; }
-#endif
int compare(QStringView s1, QStringView s2) const;
bool operator()(QStringView s1, QStringView s2) const
diff --git a/src/corelib/text/qcollator_icu.cpp b/src/corelib/text/qcollator_icu.cpp
index 0dca1ee9c9..84f9c51537 100644
--- a/src/corelib/text/qcollator_icu.cpp
+++ b/src/corelib/text/qcollator_icu.cpp
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Copyright (C) 2013 Aleix Pol Gonzalez <aleixpol@kde.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// Copyright (C) 2013 Aleix Pol Gonzalez <aleixpol@kde.org>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qcollator_p.h"
#include "qlocale_p.h"
@@ -114,29 +78,28 @@ int QCollator::compare(QStringView s1, QStringView s2) const
if (!s2.size())
return +1;
- if (d->dirty)
- d->init();
+ d->ensureInitialized();
if (d->collator) {
+ // truncating sizes (QTBUG-105038)
return ucol_strcoll(d->collator,
reinterpret_cast<const UChar *>(s1.data()), s1.size(),
reinterpret_cast<const UChar *>(s2.data()), s2.size());
}
- return QString::compare_helper(s1.data(), s1.size(),
- s2.data(), s2.size(),
- d->caseSensitivity);
+ return QtPrivate::compareStrings(s1, s2, d->caseSensitivity);
}
QCollatorSortKey QCollator::sortKey(const QString &string) const
{
- if (d->dirty)
- d->init();
+ d->ensureInitialized();
+
if (d->isC())
return QCollatorSortKey(new QCollatorSortKeyPrivate(string.toUtf8()));
if (d->collator) {
QByteArray result(16 + string.size() + (string.size() >> 2), Qt::Uninitialized);
+ // truncating sizes (QTBUG-105038)
int size = ucol_getSortKey(d->collator, (const UChar *)string.constData(),
string.size(), (uint8_t *)result.data(), result.size());
if (size > result.size()) {
diff --git a/src/corelib/text/qcollator_macx.cpp b/src/corelib/text/qcollator_macx.cpp
index 62b3a904a0..23c23bd53a 100644
--- a/src/corelib/text/qcollator_macx.cpp
+++ b/src/corelib/text/qcollator_macx.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 Aleix Pol Gonzalez <aleixpol@kde.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 Aleix Pol Gonzalez <aleixpol@kde.org>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qcollator_p.h"
#include "qlocale_p.h"
@@ -99,8 +63,8 @@ int QCollator::compare(QStringView s1, QStringView s2) const
if (!s2.size())
return +1;
- if (d->dirty)
- d->init();
+ d->ensureInitialized();
+
if (!d->collator)
return s1.compare(s2, caseSensitivity());
@@ -118,25 +82,27 @@ int QCollator::compare(QStringView s1, QStringView s2) const
QCollatorSortKey QCollator::sortKey(const QString &string) const
{
- if (d->dirty)
- d->init();
+ d->ensureInitialized();
+
if (!d->collator) {
// What should (or even *can*) we do here ? (See init()'s comment.)
qWarning("QCollator doesn't support sort keys for the C locale on Darwin");
return QCollatorSortKey(nullptr);
}
- //Documentation recommends having it 5 times as big as the input
+ auto text = reinterpret_cast<const UniChar *>(string.constData());
+ // Documentation recommends having it 5 times as big as the input
QList<UCCollationValue> ret(string.size() * 5);
ItemCount actualSize;
- int status = UCGetCollationKey(d->collator,
- reinterpret_cast<const UniChar *>(string.constData()),
- string.count(), ret.size(), &actualSize, ret.data());
+ int status = UCGetCollationKey(d->collator, text, string.size(),
+ ret.size(), &actualSize, ret.data());
ret.resize(actualSize + 1);
if (status == kUCOutputBufferTooSmall) {
- UCGetCollationKey(d->collator, reinterpret_cast<const UniChar *>(string.constData()),
- string.count(), ret.size(), &actualSize, ret.data());
+ status = UCGetCollationKey(d->collator, text, string.size(),
+ ret.size(), &actualSize, ret.data());
+ Q_ASSERT(status != kUCOutputBufferTooSmall);
+ Q_ASSERT(ret.size() == qsizetype(actualSize + 1));
}
ret[actualSize] = 0;
return QCollatorSortKey(new QCollatorSortKeyPrivate(std::move(ret)));
@@ -150,7 +116,7 @@ int QCollatorSortKey::compare(const QCollatorSortKey &key) const
SInt32 order;
UCCompareCollationKeys(d->m_key.data(), d->m_key.size(),
key.d->m_key.data(), key.d->m_key.size(),
- 0, &order);
+ nullptr, &order);
return order;
}
diff --git a/src/corelib/text/qcollator_p.h b/src/corelib/text/qcollator_p.h
index 402b58f1fb..b96cdbaa32 100644
--- a/src/corelib/text/qcollator_p.h
+++ b/src/corelib/text/qcollator_p.h
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2013 Aleix Pol Gonzalez <aleixpol@kde.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2013 Aleix Pol Gonzalez <aleixpol@kde.org>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QCOLLATOR_P_H
#define QCOLLATOR_P_H
@@ -110,6 +74,12 @@ public:
collator = NoCollator;
}
+ void ensureInitialized()
+ {
+ if (dirty)
+ init();
+ }
+
// Implemented by each back-end, in its own way:
void init();
void cleanup();
diff --git a/src/corelib/text/qcollator_posix.cpp b/src/corelib/text/qcollator_posix.cpp
index 7f04847434..5ed80c1b8e 100644
--- a/src/corelib/text/qcollator_posix.cpp
+++ b/src/corelib/text/qcollator_posix.cpp
@@ -1,46 +1,11 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Copyright (C) 2013 Aleix Pol Gonzalez <aleixpol@kde.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// Copyright (C) 2013 Aleix Pol Gonzalez <aleixpol@kde.org>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qcollator_p.h"
#include "qstringlist.h"
#include "qstring.h"
+#include "qvarlengtharray.h"
#include <cstring>
#include <cwchar>
@@ -71,7 +36,7 @@ void QCollatorPrivate::cleanup()
static void stringToWCharArray(QVarLengthArray<wchar_t> &ret, QStringView string)
{
ret.resize(string.length());
- int len = string.toWCharArray(ret.data());
+ qsizetype len = string.toWCharArray(ret.data());
ret.resize(len+1);
ret[len] = 0;
}
@@ -85,8 +50,8 @@ int QCollator::compare(QStringView s1, QStringView s2) const
if (d->isC())
return s1.compare(s2, caseSensitivity());
- if (d->dirty)
- d->init();
+
+ d->ensureInitialized();
QVarLengthArray<wchar_t> array1, array2;
stringToWCharArray(array1, s1);
@@ -96,8 +61,7 @@ int QCollator::compare(QStringView s1, QStringView s2) const
QCollatorSortKey QCollator::sortKey(const QString &string) const
{
- if (d->dirty)
- d->init();
+ d->ensureInitialized();
QVarLengthArray<wchar_t> original;
stringToWCharArray(original, string);
@@ -105,13 +69,19 @@ QCollatorSortKey QCollator::sortKey(const QString &string) const
if (d->isC()) {
std::copy(original.cbegin(), original.cend(), result.begin());
} else {
- size_t size = std::wcsxfrm(result.data(), original.constData(), string.size());
- if (size > uint(result.size())) {
- result.resize(size+1);
- size = std::wcsxfrm(result.data(), original.constData(), string.size());
+ auto availableSizeIncludingNullTerminator = result.size();
+ size_t neededSizeExcludingNullTerminator = std::wcsxfrm(
+ result.data(), original.constData(), availableSizeIncludingNullTerminator);
+ if (neededSizeExcludingNullTerminator > size_t(availableSizeIncludingNullTerminator - 1)) {
+ result.resize(neededSizeExcludingNullTerminator + 1);
+ availableSizeIncludingNullTerminator = result.size();
+ neededSizeExcludingNullTerminator = std::wcsxfrm(result.data(), original.constData(),
+ availableSizeIncludingNullTerminator);
+ Q_ASSERT(neededSizeExcludingNullTerminator
+ == size_t(availableSizeIncludingNullTerminator - 1));
}
- result.resize(size+1);
- result[size] = 0;
+ result.resize(neededSizeExcludingNullTerminator + 1);
+ result[neededSizeExcludingNullTerminator] = 0;
}
return QCollatorSortKey(new QCollatorSortKeyPrivate(std::move(result)));
}
diff --git a/src/corelib/text/qcollator_win.cpp b/src/corelib/text/qcollator_win.cpp
index 59f8add822..b588f5ff46 100644
--- a/src/corelib/text/qcollator_win.cpp
+++ b/src/corelib/text/qcollator_win.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 Aleix Pol Gonzalez <aleixpol@kde.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 Aleix Pol Gonzalez <aleixpol@kde.org>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qcollator_p.h"
#include "qlocale_p.h"
@@ -93,8 +57,7 @@ int QCollator::compare(QStringView s1, QStringView s2) const
if (d->isC())
return s1.compare(s2, d->caseSensitivity);
- if (d->dirty)
- d->init();
+ d->ensureInitialized();
//* from Windows documentation *
// Returns one of the following values if successful. To maintain the C
@@ -128,11 +91,12 @@ int QCollator::compare(QStringView s1, QStringView s2) const
QCollatorSortKey QCollator::sortKey(const QString &string) const
{
- if (d->dirty)
- d->init();
+ d->ensureInitialized();
+
if (d->isC())
return QCollatorSortKey(new QCollatorSortKeyPrivate(string));
+ // truncating sizes (QTBUG-105038)
int size = LCMapStringW(d->localeID, LCMAP_SORTKEY | d->collator,
reinterpret_cast<const wchar_t*>(string.constData()), string.size(),
0, 0);
diff --git a/src/corelib/text/qdoublescanprint_p.h b/src/corelib/text/qdoublescanprint_p.h
index 3865c69a99..b098cc4082 100644
--- a/src/corelib/text/qdoublescanprint_p.h
+++ b/src/corelib/text/qdoublescanprint_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QDOUBLESCANPRINT_P_H
#define QDOUBLESCANPRINT_P_H
@@ -51,7 +15,7 @@
// We mean it.
//
-#include <qglobal.h>
+#include <private/qglobal_p.h>
#if defined(Q_CC_MSVC) && (defined(QT_BOOTSTRAPPED) || defined(QT_NO_DOUBLECONVERSION))
# include <stdio.h>
diff --git a/src/corelib/text/qlatin1stringmatcher.cpp b/src/corelib/text/qlatin1stringmatcher.cpp
new file mode 100644
index 0000000000..68bf97db5c
--- /dev/null
+++ b/src/corelib/text/qlatin1stringmatcher.cpp
@@ -0,0 +1,201 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#include "qlatin1stringmatcher.h"
+#include <limits.h>
+
+QT_BEGIN_NAMESPACE
+
+/*! \class QLatin1StringMatcher
+ \inmodule QtCore
+ \brief Optimized search for substring in Latin-1 text.
+
+ A QLatin1StringMatcher can search for one QLatin1StringView
+ as a substring of another, either ignoring case or taking it into
+ account.
+
+ \since 6.5
+ \ingroup tools
+ \ingroup string-processing
+
+ This class is useful when you have a Latin-1 encoded string that
+ you want to repeatedly search for in some QLatin1StringViews
+ (perhaps in a loop), or when you want to search for all
+ instances of it in a given QLatin1StringView. Using a matcher
+ object and indexIn() is faster than matching a plain
+ QLatin1StringView with QLatin1StringView::indexOf() if repeated
+ matching takes place. This class offers no benefit if you are
+ doing one-off matches. The string to be searched for must not
+ be destroyed or changed before the matcher object is destroyed,
+ as the matcher accesses the string when searching for it.
+
+ Create a QLatin1StringMatcher for the QLatin1StringView
+ you want to search for and the case sensitivity. Then call
+ indexIn() with the QLatin1StringView that you want to search
+ within.
+
+ \sa QLatin1StringView, QStringMatcher, QByteArrayMatcher
+*/
+
+/*!
+ Construct an empty Latin-1 string matcher.
+ This will match at each position in any string.
+ \sa setPattern(), setCaseSensitivity(), indexIn()
+*/
+QLatin1StringMatcher::QLatin1StringMatcher() noexcept
+ : m_pattern(),
+ m_cs(Qt::CaseSensitive),
+ m_caseSensitiveSearcher(m_pattern.data(), m_pattern.data())
+{
+}
+
+/*!
+ Constructs a Latin-1 string matcher that searches for the given \a pattern
+ with given case sensitivity \a cs. The \a pattern argument must
+ not be destroyed before this matcher object. Call indexIn()
+ to find the \a pattern in the given QLatin1StringView.
+*/
+QLatin1StringMatcher::QLatin1StringMatcher(QLatin1StringView pattern,
+ Qt::CaseSensitivity cs) noexcept
+ : m_pattern(pattern), m_cs(cs)
+{
+ setSearcher();
+}
+
+/*!
+ Destroys the Latin-1 string matcher.
+*/
+QLatin1StringMatcher::~QLatin1StringMatcher() noexcept
+{
+ freeSearcher();
+}
+
+/*!
+ \internal
+*/
+void QLatin1StringMatcher::setSearcher() noexcept
+{
+ if (m_cs == Qt::CaseSensitive) {
+ new (&m_caseSensitiveSearcher) CaseSensitiveSearcher(m_pattern.data(), m_pattern.end());
+ } else {
+ QtPrivate::QCaseInsensitiveLatin1Hash foldCase;
+ qsizetype bufferSize = std::min(m_pattern.size(), qsizetype(sizeof m_foldBuffer));
+ for (qsizetype i = 0; i < bufferSize; ++i)
+ m_foldBuffer[i] = static_cast<char>(foldCase(m_pattern[i].toLatin1()));
+
+ new (&m_caseInsensitiveSearcher)
+ CaseInsensitiveSearcher(m_foldBuffer, &m_foldBuffer[bufferSize]);
+ }
+}
+
+/*!
+ \internal
+*/
+void QLatin1StringMatcher::freeSearcher() noexcept
+{
+ if (m_cs == Qt::CaseSensitive)
+ m_caseSensitiveSearcher.~CaseSensitiveSearcher();
+ else
+ m_caseInsensitiveSearcher.~CaseInsensitiveSearcher();
+}
+
+/*!
+ Sets the \a pattern to search for. The string pointed to by the
+ QLatin1StringView must not be destroyed before the matcher is
+ destroyed, unless it is set to point to a different \a pattern
+ with longer lifetime first.
+
+ \sa pattern(), indexIn()
+*/
+void QLatin1StringMatcher::setPattern(QLatin1StringView pattern) noexcept
+{
+ if (m_pattern.latin1() == pattern.latin1() && m_pattern.size() == pattern.size())
+ return; // Same address and size
+
+ freeSearcher();
+ m_pattern = pattern;
+ setSearcher();
+}
+
+/*!
+ Returns the Latin-1 pattern that the matcher searches for.
+
+ \sa setPattern(), indexIn()
+*/
+QLatin1StringView QLatin1StringMatcher::pattern() const noexcept
+{
+ return m_pattern;
+}
+
+/*!
+ Sets the case sensitivity to \a cs.
+
+ \sa caseSensitivity(), indexIn()
+*/
+void QLatin1StringMatcher::setCaseSensitivity(Qt::CaseSensitivity cs) noexcept
+{
+ if (m_cs == cs)
+ return;
+
+ freeSearcher();
+ m_cs = cs;
+ setSearcher();
+}
+
+/*!
+ Returns the case sensitivity the matcher uses.
+
+ \sa setCaseSensitivity(), indexIn()
+*/
+Qt::CaseSensitivity QLatin1StringMatcher::caseSensitivity() const noexcept
+{
+ return m_cs;
+}
+
+/*!
+ Searches for the pattern in the given \a haystack starting from
+ \a from.
+
+ \sa caseSensitivity(), pattern()
+*/
+qsizetype QLatin1StringMatcher::indexIn(QLatin1StringView haystack, qsizetype from) const noexcept
+{
+ if (m_pattern.isEmpty() && from == haystack.size())
+ return from;
+ if (from < 0) // Historical behavior (see QString::indexOf and co.)
+ from += haystack.size();
+ if (from >= haystack.size())
+ return -1;
+
+ auto begin = haystack.begin() + from;
+ auto end = haystack.end();
+ auto found = begin;
+ if (m_cs == Qt::CaseSensitive) {
+ found = m_caseSensitiveSearcher(begin, end, m_pattern.begin(), m_pattern.end()).begin;
+ if (found == end)
+ return -1;
+ } else {
+ const qsizetype bufferSize = std::min(m_pattern.size(), qsizetype(sizeof m_foldBuffer));
+ const QLatin1StringView restNeedle = m_pattern.sliced(bufferSize);
+ const bool needleLongerThanBuffer = restNeedle.size() > 0;
+ QLatin1StringView restHaystack = haystack;
+ do {
+ found = m_caseInsensitiveSearcher(found, end, m_foldBuffer, &m_foldBuffer[bufferSize])
+ .begin;
+ if (found == end) {
+ return -1;
+ } else if (!needleLongerThanBuffer) {
+ break;
+ }
+ restHaystack = haystack.sliced(
+ qMin(haystack.size(),
+ bufferSize + qsizetype(std::distance(haystack.begin(), found))));
+ if (restHaystack.startsWith(restNeedle, Qt::CaseInsensitive))
+ break;
+ ++found;
+ } while (true);
+ }
+ return std::distance(haystack.begin(), found);
+}
+
+QT_END_NAMESPACE
diff --git a/src/corelib/text/qlatin1stringmatcher.h b/src/corelib/text/qlatin1stringmatcher.h
new file mode 100644
index 0000000000..3b8c24fc92
--- /dev/null
+++ b/src/corelib/text/qlatin1stringmatcher.h
@@ -0,0 +1,172 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QLATIN1STRINGMATCHER_H
+#define QLATIN1STRINGMATCHER_H
+
+#include <functional>
+#include <iterator>
+#include <limits>
+
+#include <QtCore/q20algorithm.h>
+#include <QtCore/qstring.h>
+
+QT_BEGIN_NAMESPACE
+
+namespace QtPrivate {
+template<class RandomIt1,
+ class Hash = std::hash<typename std::iterator_traits<RandomIt1>::value_type>,
+ class BinaryPredicate = std::equal_to<>>
+class q_boyer_moore_searcher_hashed_needle
+{
+public:
+ constexpr q_boyer_moore_searcher_hashed_needle(RandomIt1 pat_first, RandomIt1 pat_last)
+ : m_skiptable{}
+ {
+ const size_t n = std::distance(pat_first, pat_last);
+ constexpr auto uchar_max = (std::numeric_limits<uchar>::max)();
+ uchar max = n > uchar_max ? uchar_max : uchar(n);
+ q20::fill(std::begin(m_skiptable), std::end(m_skiptable), max);
+
+ RandomIt1 pattern = pat_first;
+ pattern += n - max;
+ while (max--)
+ m_skiptable[uchar(*pattern++)] = max;
+ }
+
+ template<class RandomIt2>
+ constexpr auto operator()(RandomIt2 first, RandomIt2 last, RandomIt1 pat_first,
+ RandomIt1 pat_last) const
+ {
+ struct R
+ {
+ RandomIt2 begin, end;
+ };
+ Hash hf;
+ BinaryPredicate pred;
+ auto pat_length = std::distance(pat_first, pat_last);
+ if (pat_length == 0)
+ return R{ first, first };
+
+ const qsizetype pl_minus_one = qsizetype(pat_length - 1);
+ RandomIt2 current = first + pl_minus_one;
+
+ while (current < last) {
+ qsizetype skip = m_skiptable[hf(*current)];
+ if (!skip) {
+ // possible match
+ while (skip < pat_length) {
+ if (!pred(hf(*(current - skip)), uchar(pat_first[pl_minus_one - skip])))
+ break;
+ skip++;
+ }
+ if (skip > pl_minus_one) { // we have a match
+ auto match = current - skip + 1;
+ return R{ match, match + pat_length };
+ }
+
+ // If we don't have a match we are a bit inefficient as we only skip by one
+ // when we have the non matching char in the string.
+ if (m_skiptable[hf(*(current - skip))] == pat_length)
+ skip = pat_length - skip;
+ else
+ skip = 1;
+ }
+ current += skip;
+ }
+
+ return R{ last, last };
+ }
+
+private:
+ alignas(16) uchar m_skiptable[256];
+};
+
+struct QCaseSensitiveLatin1Hash
+{
+ constexpr QCaseSensitiveLatin1Hash() = default;
+
+ constexpr std::size_t operator()(char c) const noexcept { return std::size_t(uchar(c)); }
+};
+
+struct QCaseInsensitiveLatin1Hash
+{
+ constexpr QCaseInsensitiveLatin1Hash() = default;
+
+ constexpr std::size_t operator()(char c) const noexcept
+ {
+ return std::size_t(latin1Lower[uchar(c)]);
+ }
+
+ static int difference(char lhs, char rhs)
+ {
+ return int(latin1Lower[uchar(lhs)]) - int(latin1Lower[uchar(rhs)]);
+ }
+
+ static auto matcher(char ch)
+ {
+ return [sought = latin1Lower[uchar(ch)]](char other) {
+ return latin1Lower[uchar(other)] == sought;
+ };
+ }
+
+private:
+ static constexpr uchar latin1Lower[256] = {
+ 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
+ 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,
+ 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,
+ 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
+ 0x40,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f,
+ 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x5b,0x5c,0x5d,0x5e,0x5f,
+ 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f,
+ 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x7b,0x7c,0x7d,0x7e,0x7f,
+ 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,
+ 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f,
+ 0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf,
+ 0xb0,0xb1,0xb2,0xb3,0xb4,0xb5,0xb6,0xb7,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,0xbe,0xbf,
+ // 0xd7 (multiplication sign) and 0xdf (sz ligature) complicate life
+ 0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,0xeb,0xec,0xed,0xee,0xef,
+ 0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xd7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xdf,
+ 0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,0xeb,0xec,0xed,0xee,0xef,
+ 0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff
+ };
+};
+}
+
+class QLatin1StringMatcher
+{
+public:
+ Q_CORE_EXPORT QLatin1StringMatcher() noexcept;
+ Q_CORE_EXPORT explicit QLatin1StringMatcher(
+ QLatin1StringView pattern, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
+ Q_CORE_EXPORT ~QLatin1StringMatcher() noexcept;
+
+ Q_CORE_EXPORT void setPattern(QLatin1StringView pattern) noexcept;
+ Q_CORE_EXPORT QLatin1StringView pattern() const noexcept;
+ Q_CORE_EXPORT void setCaseSensitivity(Qt::CaseSensitivity cs) noexcept;
+ Q_CORE_EXPORT Qt::CaseSensitivity caseSensitivity() const noexcept;
+
+ Q_CORE_EXPORT qsizetype indexIn(QLatin1StringView haystack, qsizetype from = 0) const noexcept;
+
+private:
+ void setSearcher() noexcept;
+ void freeSearcher() noexcept;
+
+ QLatin1StringView m_pattern;
+ Qt::CaseSensitivity m_cs;
+ typedef QtPrivate::q_boyer_moore_searcher_hashed_needle<const char *,
+ QtPrivate::QCaseSensitiveLatin1Hash>
+ CaseSensitiveSearcher;
+ typedef QtPrivate::q_boyer_moore_searcher_hashed_needle<const char *,
+ QtPrivate::QCaseInsensitiveLatin1Hash>
+ CaseInsensitiveSearcher;
+ union {
+ CaseSensitiveSearcher m_caseSensitiveSearcher;
+ CaseInsensitiveSearcher m_caseInsensitiveSearcher;
+ };
+ char m_foldBuffer[256];
+};
+
+QT_END_NAMESPACE
+
+#endif // QLATIN1MATCHER_H
diff --git a/src/corelib/text/qlatin1stringview.h b/src/corelib/text/qlatin1stringview.h
new file mode 100644
index 0000000000..91392d9540
--- /dev/null
+++ b/src/corelib/text/qlatin1stringview.h
@@ -0,0 +1,375 @@
+// Copyright (C) 2020 The Qt Company Ltd.
+// Copyright (C) 2019 Intel Corporation.
+// Copyright (C) 2019 Mail.ru Group.
+// Copyright (C) 2020 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QLATIN1STRINGVIEW_H
+#define QLATIN1STRINGVIEW_H
+
+#include <QtCore/qchar.h>
+#include <QtCore/qcompare.h>
+#include <QtCore/qnamespace.h>
+#include <QtCore/qtversionchecks.h>
+#include <QtCore/qstringview.h>
+
+#if 0
+// Workaround for generating forward headers
+#pragma qt_class(QLatin1String)
+#pragma qt_class(QLatin1StringView)
+#endif
+
+QT_BEGIN_NAMESPACE
+
+class QString;
+
+#if QT_VERSION >= QT_VERSION_CHECK(7, 0, 0) || defined(QT_BOOTSTRAPPED) || defined(Q_QDOC)
+# define Q_L1S_VIEW_IS_PRIMARY
+class QLatin1StringView
+#else
+class QLatin1String
+#endif
+{
+public:
+#ifdef Q_L1S_VIEW_IS_PRIMARY
+ constexpr QLatin1StringView() noexcept {}
+ constexpr QLatin1StringView(std::nullptr_t) noexcept : QLatin1StringView() {}
+ constexpr explicit QLatin1StringView(const char *s) noexcept
+ : QLatin1StringView(s, s ? qsizetype(QtPrivate::lengthHelperPointer(s)) : 0) {}
+ constexpr QLatin1StringView(const char *f, const char *l)
+ : QLatin1StringView(f, qsizetype(l - f)) {}
+ constexpr QLatin1StringView(const char *s, qsizetype sz) noexcept : m_data(s), m_size(sz) {}
+ explicit QLatin1StringView(const QByteArray &s) noexcept
+ : QLatin1StringView(s.constData(), s.size()) {}
+ constexpr explicit QLatin1StringView(QByteArrayView s) noexcept
+ : QLatin1StringView(s.constData(), s.size()) {}
+#else
+ constexpr QLatin1String() noexcept : m_size(0), m_data(nullptr) {}
+ Q_WEAK_OVERLOAD
+ constexpr QLatin1String(std::nullptr_t) noexcept : QLatin1String() {}
+ constexpr explicit QLatin1String(const char *s) noexcept
+ : m_size(s ? qsizetype(QtPrivate::lengthHelperPointer(s)) : 0), m_data(s) {}
+ constexpr QLatin1String(const char *f, const char *l)
+ : QLatin1String(f, qsizetype(l - f)) {}
+ constexpr QLatin1String(const char *s, qsizetype sz) noexcept : m_size(sz), m_data(s) {}
+ explicit QLatin1String(const QByteArray &s) noexcept : m_size(s.size()), m_data(s.constData()) {}
+ constexpr explicit QLatin1String(QByteArrayView s) noexcept : m_size(s.size()), m_data(s.data()) {}
+#endif // !Q_L1S_VIEW_IS_PRIMARY
+
+ inline QString toString() const;
+
+ constexpr const char *latin1() const noexcept { return m_data; }
+ constexpr qsizetype size() const noexcept { return m_size; }
+ constexpr const char *data() const noexcept { return m_data; }
+ [[nodiscard]] constexpr const char *constData() const noexcept { return data(); }
+ [[nodiscard]] constexpr const char *constBegin() const noexcept { return begin(); }
+ [[nodiscard]] constexpr const char *constEnd() const noexcept { return end(); }
+
+ [[nodiscard]] constexpr QLatin1Char first() const { return front(); }
+ [[nodiscard]] constexpr QLatin1Char last() const { return back(); }
+
+ [[nodiscard]] constexpr qsizetype length() const noexcept { return size(); }
+
+ constexpr bool isNull() const noexcept { return !data(); }
+ constexpr bool isEmpty() const noexcept { return !size(); }
+
+ [[nodiscard]] constexpr bool empty() const noexcept { return size() == 0; }
+
+ template <typename...Args>
+ [[nodiscard]] inline QString arg(Args &&...args) const;
+
+ [[nodiscard]] constexpr QLatin1Char at(qsizetype i) const
+ {
+ Q_ASSERT(i >= 0);
+ Q_ASSERT(i < size());
+ return QLatin1Char(m_data[i]);
+ }
+ [[nodiscard]] constexpr QLatin1Char operator[](qsizetype i) const { return at(i); }
+
+ [[nodiscard]] constexpr QLatin1Char front() const { return at(0); }
+ [[nodiscard]] constexpr QLatin1Char back() const { return at(size() - 1); }
+
+ [[nodiscard]] int compare(QStringView other, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
+ { return QtPrivate::compareStrings(*this, other, cs); }
+ [[nodiscard]] int compare(QLatin1StringView other, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
+ { return QtPrivate::compareStrings(*this, other, cs); }
+ [[nodiscard]] inline int compare(QUtf8StringView other, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept;
+ [[nodiscard]] constexpr int compare(QChar c) const noexcept
+ { return isEmpty() ? -1 : front() == c ? int(size() > 1) : uchar(m_data[0]) - c.unicode(); }
+ [[nodiscard]] int compare(QChar c, Qt::CaseSensitivity cs) const noexcept
+ { return QtPrivate::compareStrings(*this, QStringView(&c, 1), cs); }
+
+ [[nodiscard]] bool startsWith(QStringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
+ { return QtPrivate::startsWith(*this, s, cs); }
+ [[nodiscard]] bool startsWith(QLatin1StringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
+ { return QtPrivate::startsWith(*this, s, cs); }
+ [[nodiscard]] constexpr bool startsWith(QChar c) const noexcept
+ { return !isEmpty() && front() == c; }
+ [[nodiscard]] bool startsWith(QChar c, Qt::CaseSensitivity cs) const noexcept
+ { return QtPrivate::startsWith(*this, QStringView(&c, 1), cs); }
+
+ [[nodiscard]] bool endsWith(QStringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
+ { return QtPrivate::endsWith(*this, s, cs); }
+ [[nodiscard]] bool endsWith(QLatin1StringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
+ { return QtPrivate::endsWith(*this, s, cs); }
+ [[nodiscard]] constexpr bool endsWith(QChar c) const noexcept
+ { return !isEmpty() && back() == c; }
+ [[nodiscard]] bool endsWith(QChar c, Qt::CaseSensitivity cs) const noexcept
+ { return QtPrivate::endsWith(*this, QStringView(&c, 1), cs); }
+
+ [[nodiscard]] qsizetype indexOf(QStringView s, qsizetype from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
+ { return QtPrivate::findString(*this, from, s, cs); }
+ [[nodiscard]] qsizetype indexOf(QLatin1StringView s, qsizetype from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
+ { return QtPrivate::findString(*this, from, s, cs); }
+ [[nodiscard]] qsizetype indexOf(QChar c, qsizetype from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
+ { return QtPrivate::findString(*this, from, QStringView(&c, 1), cs); }
+
+ [[nodiscard]] bool contains(QStringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
+ { return indexOf(s, 0, cs) != -1; }
+ [[nodiscard]] bool contains(QLatin1StringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
+ { return indexOf(s, 0, cs) != -1; }
+ [[nodiscard]] bool contains(QChar c, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
+ { return indexOf(QStringView(&c, 1), 0, cs) != -1; }
+
+ [[nodiscard]] qsizetype lastIndexOf(QStringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
+ { return lastIndexOf(s, size(), cs); }
+ [[nodiscard]] qsizetype lastIndexOf(QStringView s, qsizetype from, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
+ { return QtPrivate::lastIndexOf(*this, from, s, cs); }
+ [[nodiscard]] qsizetype lastIndexOf(QLatin1StringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
+ { return lastIndexOf(s, size(), cs); }
+ [[nodiscard]] qsizetype lastIndexOf(QLatin1StringView s, qsizetype from, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
+ { return QtPrivate::lastIndexOf(*this, from, s, cs); }
+ [[nodiscard]] qsizetype lastIndexOf(QChar c, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
+ { return lastIndexOf(c, -1, cs); }
+ [[nodiscard]] qsizetype lastIndexOf(QChar c, qsizetype from, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
+ { return QtPrivate::lastIndexOf(*this, from, QStringView(&c, 1), cs); }
+
+ [[nodiscard]] qsizetype count(QStringView str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
+ { return QtPrivate::count(*this, str, cs); }
+ [[nodiscard]] qsizetype count(QLatin1StringView str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
+ { return QtPrivate::count(*this, str, cs); }
+ [[nodiscard]] qsizetype count(QChar ch, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
+ { return QtPrivate::count(*this, ch, cs); }
+
+ [[nodiscard]] short toShort(bool *ok = nullptr, int base = 10) const
+ { return QtPrivate::toIntegral<short>(QByteArrayView(*this), ok, base); }
+ [[nodiscard]] ushort toUShort(bool *ok = nullptr, int base = 10) const
+ { return QtPrivate::toIntegral<ushort>(QByteArrayView(*this), ok, base); }
+ [[nodiscard]] int toInt(bool *ok = nullptr, int base = 10) const
+ { return QtPrivate::toIntegral<int>(QByteArrayView(*this), ok, base); }
+ [[nodiscard]] uint toUInt(bool *ok = nullptr, int base = 10) const
+ { return QtPrivate::toIntegral<uint>(QByteArrayView(*this), ok, base); }
+ [[nodiscard]] long toLong(bool *ok = nullptr, int base = 10) const
+ { return QtPrivate::toIntegral<long>(QByteArrayView(*this), ok, base); }
+ [[nodiscard]] ulong toULong(bool *ok = nullptr, int base = 10) const
+ { return QtPrivate::toIntegral<ulong>(QByteArrayView(*this), ok, base); }
+ [[nodiscard]] qlonglong toLongLong(bool *ok = nullptr, int base = 10) const
+ { return QtPrivate::toIntegral<qlonglong>(QByteArrayView(*this), ok, base); }
+ [[nodiscard]] qulonglong toULongLong(bool *ok = nullptr, int base = 10) const
+ { return QtPrivate::toIntegral<qulonglong>(QByteArrayView(*this), ok, base); }
+ [[nodiscard]] float toFloat(bool *ok = nullptr) const
+ {
+ const auto r = QtPrivate::toFloat(*this);
+ if (ok)
+ *ok = bool(r);
+ return r.value_or(0.0f);
+ }
+ [[nodiscard]] double toDouble(bool *ok = nullptr) const
+ {
+ const auto r = QtPrivate::toDouble(*this);
+ if (ok)
+ *ok = bool(r);
+ return r.value_or(0.0);
+ }
+
+ using value_type = const char;
+ using pointer = value_type*;
+ using const_pointer = pointer;
+ using reference = value_type&;
+ using const_reference = reference;
+ using iterator = value_type*;
+ using const_iterator = iterator;
+ using difference_type = qsizetype; // violates Container concept requirements
+ using size_type = qsizetype; // violates Container concept requirements
+
+ constexpr const_iterator begin() const noexcept { return data(); }
+ constexpr const_iterator cbegin() const noexcept { return data(); }
+ constexpr const_iterator end() const noexcept { return data() + size(); }
+ constexpr const_iterator cend() const noexcept { return data() + size(); }
+
+ using reverse_iterator = std::reverse_iterator<iterator>;
+ using const_reverse_iterator = reverse_iterator;
+
+ const_reverse_iterator rbegin() const noexcept { return const_reverse_iterator(end()); }
+ const_reverse_iterator crbegin() const noexcept { return const_reverse_iterator(end()); }
+ const_reverse_iterator rend() const noexcept { return const_reverse_iterator(begin()); }
+ const_reverse_iterator crend() const noexcept { return const_reverse_iterator(begin()); }
+
+ [[nodiscard]] constexpr QLatin1StringView mid(qsizetype pos, qsizetype n = -1) const
+ {
+ using namespace QtPrivate;
+ auto result = QContainerImplHelper::mid(size(), &pos, &n);
+ return result == QContainerImplHelper::Null ? QLatin1StringView()
+ : QLatin1StringView(m_data + pos, n);
+ }
+ [[nodiscard]] constexpr QLatin1StringView left(qsizetype n) const
+ {
+ if (size_t(n) >= size_t(size()))
+ n = size();
+ return {m_data, n};
+ }
+ [[nodiscard]] constexpr QLatin1StringView right(qsizetype n) const
+ {
+ if (size_t(n) >= size_t(size()))
+ n = size();
+ return {m_data + m_size - n, n};
+ }
+
+ [[nodiscard]] constexpr QLatin1StringView sliced(qsizetype pos) const
+ { verify(pos, 0); return {m_data + pos, m_size - pos}; }
+ [[nodiscard]] constexpr QLatin1StringView sliced(qsizetype pos, qsizetype n) const
+ { verify(pos, n); return {m_data + pos, n}; }
+ [[nodiscard]] constexpr QLatin1StringView first(qsizetype n) const
+ { verify(0, n); return sliced(0, n); }
+ [[nodiscard]] constexpr QLatin1StringView last(qsizetype n) const
+ { verify(0, n); return sliced(size() - n, n); }
+ [[nodiscard]] constexpr QLatin1StringView chopped(qsizetype n) const
+ { verify(0, n); return sliced(0, size() - n); }
+
+ constexpr void chop(qsizetype n)
+ { verify(0, n); m_size -= n; }
+ constexpr void truncate(qsizetype n)
+ { verify(0, n); m_size = n; }
+
+ [[nodiscard]] QLatin1StringView trimmed() const noexcept { return QtPrivate::trimmed(*this); }
+
+ template <typename Needle, typename...Flags>
+ [[nodiscard]] constexpr auto tokenize(Needle &&needle, Flags...flags) const
+ noexcept(noexcept(qTokenize(std::declval<const QLatin1StringView &>(),
+ std::forward<Needle>(needle), flags...)))
+ -> decltype(qTokenize(*this, std::forward<Needle>(needle), flags...))
+ { return qTokenize(*this, std::forward<Needle>(needle), flags...); }
+
+ friend bool comparesEqual(const QLatin1StringView &s1, const QLatin1StringView &s2) noexcept
+ { return s1.size() == s2.size() && QtPrivate::equalStrings(s1, s2); }
+ friend Qt::strong_ordering
+ compareThreeWay(const QLatin1StringView &s1, const QLatin1StringView &s2) noexcept
+ {
+ const int res = QtPrivate::compareStrings(s1, s2);
+ return Qt::compareThreeWay(res, 0);
+ }
+ Q_DECLARE_STRONGLY_ORDERED(QLatin1StringView)
+
+ // QChar <> QLatin1StringView
+ friend bool comparesEqual(const QLatin1StringView &lhs, QChar rhs) noexcept
+ { return lhs.size() == 1 && rhs == lhs.front(); }
+ friend Qt::strong_ordering
+ compareThreeWay(const QLatin1StringView &lhs, QChar rhs) noexcept
+ {
+ // negate, as the helper function expects QChar as lhs
+ const int res = -compare_helper(&rhs, 1, lhs);
+ return Qt::compareThreeWay(res, 0);
+ }
+ Q_DECLARE_STRONGLY_ORDERED(QLatin1StringView, QChar)
+
+ // QStringView <> QLatin1StringView
+ friend bool comparesEqual(const QLatin1StringView &lhs, const QStringView &rhs) noexcept
+ { return lhs.size() == rhs.size() && QtPrivate::equalStrings(lhs, rhs); }
+ friend Qt::strong_ordering
+ compareThreeWay(const QLatin1StringView &lhs, const QStringView &rhs) noexcept
+ {
+ const int res = QtPrivate::compareStrings(lhs, rhs);
+ return Qt::compareThreeWay(res, 0);
+ }
+ Q_DECLARE_STRONGLY_ORDERED(QLatin1StringView, QStringView)
+
+ // Reversed helper methods for QStringView <> QLatin1StringView comparison.
+ // If we do not provide them explicitly, QStringView <> QByteArrayView
+ // overloads will be selected, which will provide wrong results, because
+ // they will convert from utf-8
+ friend bool comparesEqual(const QStringView &lhs, const QLatin1StringView &rhs) noexcept
+ { return comparesEqual(rhs, lhs); }
+ friend Qt::strong_ordering
+ compareThreeWay(const QStringView &lhs, const QLatin1StringView &rhs) noexcept
+ { return QtOrderingPrivate::reversed(compareThreeWay(rhs, lhs)); }
+
+private:
+ friend bool comparesEqual(const QLatin1StringView &lhs, const QByteArrayView &rhs) noexcept
+ { return equal_helper(lhs, rhs.data(), rhs.size()); }
+ friend Qt::strong_ordering
+ compareThreeWay(const QLatin1StringView &lhs, const QByteArrayView &rhs) noexcept
+ {
+ const int res = compare_helper(lhs, rhs.data(), rhs.size());
+ return Qt::compareThreeWay(res, 0);
+ }
+
+ // Reversed helper methods for QByteArrayView <> QLatin1StringView comparison.
+ // If we do not provide them explicitly, QByteArrayView <> QByteArrayView
+ // overloads will be selected, which will provide wrong results
+ friend bool comparesEqual(const QByteArrayView &lhs, const QLatin1StringView &rhs) noexcept
+ { return comparesEqual(rhs, lhs); }
+ friend Qt::strong_ordering
+ compareThreeWay(const QByteArrayView &lhs, const QLatin1StringView &rhs) noexcept
+ { return QtOrderingPrivate::reversed(compareThreeWay(rhs, lhs)); }
+
+public:
+#if !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII)
+ Q_DECLARE_STRONGLY_ORDERED(QLatin1StringView, QByteArrayView, QT_ASCII_CAST_WARN)
+ Q_DECLARE_STRONGLY_ORDERED(QLatin1StringView, QByteArray, QT_ASCII_CAST_WARN)
+ Q_DECLARE_STRONGLY_ORDERED(QLatin1StringView, const char *, QT_ASCII_CAST_WARN)
+#endif // !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII)
+
+private:
+ Q_ALWAYS_INLINE constexpr void verify([[maybe_unused]] qsizetype pos,
+ [[maybe_unused]] qsizetype n = 1) const
+ {
+ Q_ASSERT(pos >= 0);
+ Q_ASSERT(pos <= size());
+ Q_ASSERT(n >= 0);
+ Q_ASSERT(n <= size() - pos);
+ }
+ static int compare_helper(const QLatin1StringView &s1, const char *s2) noexcept
+ { return compare_helper(s1, s2, qstrlen(s2)); }
+ Q_CORE_EXPORT static bool equal_helper(QLatin1StringView s1, const char *s2, qsizetype len) noexcept;
+ Q_CORE_EXPORT static int compare_helper(const QLatin1StringView &s1, const char *s2, qsizetype len) noexcept;
+ Q_CORE_EXPORT static int compare_helper(const QChar *data1, qsizetype length1,
+ QLatin1StringView s2,
+ Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
+#if QT_VERSION >= QT_VERSION_CHECK(7, 0, 0) || defined(QT_BOOTSTRAPPED)
+ const char *m_data = nullptr;
+ qsizetype m_size = 0;
+#else
+ qsizetype m_size;
+ const char *m_data;
+#endif
+};
+#ifdef Q_L1S_VIEW_IS_PRIMARY
+Q_DECLARE_TYPEINFO(QLatin1StringView, Q_RELOCATABLE_TYPE);
+#else
+Q_DECLARE_TYPEINFO(QLatin1String, Q_RELOCATABLE_TYPE);
+#endif
+
+constexpr QByteArrayView::QByteArrayView(QLatin1StringView v) noexcept
+ : QByteArrayView(v.data(), v.size())
+{}
+
+namespace Qt {
+inline namespace Literals {
+inline namespace StringLiterals {
+
+constexpr inline QLatin1StringView operator""_L1(const char *str, size_t size) noexcept
+{
+ return {str, qsizetype(size)};
+}
+
+} // StringLiterals
+} // Literals
+} // Qt
+
+QT_END_NAMESPACE
+
+#ifdef Q_L1S_VIEW_IS_PRIMARY
+# undef Q_L1S_VIEW_IS_PRIMARY
+#endif
+
+#endif // QLATIN1STRINGVIEW_H
diff --git a/src/corelib/text/qlatin1stringview.qdoc b/src/corelib/text/qlatin1stringview.qdoc
new file mode 100644
index 0000000000..711057767b
--- /dev/null
+++ b/src/corelib/text/qlatin1stringview.qdoc
@@ -0,0 +1,1295 @@
+// Copyright (C) 2021 The Qt Company Ltd.
+// Copyright (C) 2022 Intel Corporation.
+// Copyright (C) 2019 Mail.ru Group.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
+
+/*! \class QLatin1StringView
+ \inmodule QtCore
+ \brief The QLatin1StringView class provides a thin wrapper around
+ a US-ASCII/Latin-1 encoded string literal.
+
+ \ingroup string-processing
+ \reentrant
+
+ \compares strong
+ \compareswith strong char16_t QChar QStringView QUtf8StringView QString \
+ {const char16_t *}
+ \endcompareswith
+ \compareswith strong {const char *} QByteArray QByteArrayView
+ The byte array data is interpreted as utf-8.
+ \endcompareswith
+
+ Many of QString's member functions are overloaded to accept
+ \c{const char *} instead of QString. This includes the copy
+ constructor, the assignment operator, the comparison operators,
+ and various other functions such as \l{QString::insert()}{insert()},
+ \l{QString::append()}{append()}, and \l{QString::prepend()}{prepend()}.
+ Some of these functions are optimized to avoid constructing a
+ QString object for the \c{const char *} data. For example,
+ assuming \c str is a QString,
+
+ \snippet code/src_corelib_text_qstring.cpp 3
+
+ is much faster than
+
+ \snippet code/src_corelib_text_qstring.cpp 4
+
+ because it doesn't construct four temporary QString objects and
+ make a deep copy of the character data.
+
+ However, that is not true for all QString member functions that take
+ \c{const char *} and therefore applications should assume a temporary will
+ be created, such as in
+
+ \snippet code/src_corelib_text_qstring.cpp 4bis
+
+ Applications that define \l QT_NO_CAST_FROM_ASCII (as explained
+ in the QString documentation) don't have access to QString's
+ \c{const char *} API. To provide an efficient way of specifying
+ constant Latin-1 strings, Qt provides the QLatin1StringView, which is
+ just a very thin wrapper around a \c{const char *}. Using
+ QLatin1StringView, the example code above becomes
+
+ \snippet code/src_corelib_text_qstring.cpp 5
+
+ This is a bit longer to type, but it provides exactly the same
+ benefits as the first version of the code, and is faster than
+ converting the Latin-1 strings using QString::fromLatin1().
+
+ Thanks to the QString(QLatin1StringView) constructor,
+ QLatin1StringView can be used everywhere a QString is expected. For
+ example:
+
+ \snippet code/src_corelib_text_qstring.cpp 6
+
+ \note If the function you're calling with a QLatin1StringView
+ argument isn't actually overloaded to take QLatin1StringView, the
+ implicit conversion to QString will trigger a memory allocation,
+ which is usually what you want to avoid by using QLatin1StringView
+ in the first place. In those cases, using QStringLiteral may be
+ the better option.
+
+ \sa QString, QLatin1Char, {QStringLiteral()}{QStringLiteral},
+ QT_NO_CAST_FROM_ASCII
+*/
+
+/*!
+ \class QLatin1String
+ \inmodule QtCore
+ \brief QLatin1String is the same as QLatin1StringView.
+
+ QLatin1String is a view to a Latin-1 string. It's the same as
+ QLatin1StringView and is kept for compatibility reasons. It is
+ recommended to use QLatin1StringView instead.
+
+ Please see the QLatin1StringView documentation for details.
+*/
+
+/*!
+ \typedef QLatin1StringView::value_type
+ \since 5.10
+
+ Alias for \c{const char}. Provided for compatibility with the STL.
+*/
+
+/*!
+ \typedef QLatin1StringView::difference_type
+ \since 5.10
+
+ Alias for \c{qsizetype}. Provided for compatibility with the STL.
+*/
+
+/*!
+ \typedef QLatin1StringView::size_type
+ \since 5.10
+
+ Alias for \c{qsizetype}. Provided for compatibility with the STL.
+
+ \note In version prior to Qt 6, this was an alias for \c{int},
+ restricting the amount of data that could be held in a QLatin1StringView
+ on 64-bit architectures.
+*/
+
+/*!
+ \typedef QLatin1StringView::pointer
+ \typedef QLatin1StringView::const_pointer
+ \since 6.7
+
+ Alias for \c{value_type *}. Provided for compatibility with the STL.
+*/
+
+/*!
+ \typedef QLatin1StringView::reference
+ \since 5.10
+
+ Alias for \c{value_type &}. Provided for compatibility with the STL.
+*/
+
+/*!
+ \typedef QLatin1StringView::const_reference
+ \since 5.11
+
+ Alias for \c{reference}. Provided for compatibility with the STL.
+*/
+
+/*!
+ \typedef QLatin1StringView::iterator
+ \since 5.10
+
+ QLatin1StringView does not support mutable iterators, so this is the same
+ as const_iterator.
+
+ \sa const_iterator, reverse_iterator
+*/
+
+/*!
+ \typedef QLatin1StringView::const_iterator
+ \since 5.10
+
+ \sa iterator, const_reverse_iterator
+*/
+
+/*!
+ \typedef QLatin1StringView::reverse_iterator
+ \since 5.10
+
+ QLatin1StringView does not support mutable reverse iterators, so this is the
+ same as const_reverse_iterator.
+
+ \sa const_reverse_iterator, iterator
+*/
+
+/*!
+ \typedef QLatin1StringView::const_reverse_iterator
+ \since 5.10
+
+ \sa reverse_iterator, const_iterator
+*/
+
+/*! \fn QLatin1StringView::QLatin1StringView()
+ \since 5.6
+
+ Constructs a QLatin1StringView object that stores a \nullptr.
+
+ \sa data(), isEmpty(), isNull(), {Distinction Between Null and Empty Strings}
+*/
+
+/*! \fn QLatin1StringView::QLatin1StringView(std::nullptr_t)
+ \since 6.4
+
+ Constructs a QLatin1StringView object that stores a \nullptr.
+
+ \sa data(), isEmpty(), isNull(), {Distinction Between Null and Empty Strings}
+*/
+
+/*! \fn QLatin1StringView::QLatin1StringView(const char *str)
+
+ Constructs a QLatin1StringView object that stores \a str.
+
+ The string data is \e not copied. The caller must be able to
+ guarantee that \a str will not be deleted or modified as long as
+ the QLatin1StringView object exists.
+
+ \sa latin1()
+*/
+
+/*! \fn QLatin1StringView::QLatin1StringView(const char *str, qsizetype size)
+
+ Constructs a QLatin1StringView object that stores \a str with \a size.
+
+ The string data is \e not copied. The caller must be able to
+ guarantee that \a str will not be deleted or modified as long as
+ the QLatin1StringView object exists.
+
+ \note: any null ('\\0') bytes in the byte array will be included in this
+ string, which will be converted to Unicode null characters (U+0000) if this
+ string is used by QString. This behavior is different from Qt 5.x.
+
+ \sa latin1()
+*/
+
+/*!
+ \fn QLatin1StringView::QLatin1StringView(const char *first, const char *last)
+ \since 5.10
+
+ Constructs a QLatin1StringView object that stores \a first with length
+ (\a last - \a first).
+
+ The range \c{[first,last)} must remain valid for the lifetime of
+ this Latin-1 string object.
+
+ Passing \nullptr as \a first is safe if \a last is \nullptr,
+ too, and results in a null Latin-1 string.
+
+ The behavior is undefined if \a last precedes \a first, \a first
+ is \nullptr and \a last is not, or if \c{last - first >
+ INT_MAX}.
+*/
+
+/*! \fn QLatin1StringView::QLatin1StringView(const QByteArray &str)
+
+ Constructs a QLatin1StringView object as a view on \a str.
+
+ The string data is \e not copied. The caller must be able to
+ guarantee that \a str will not be deleted or modified as long as
+ the QLatin1StringView object exists.
+
+ \sa latin1()
+*/
+
+/*! \fn QLatin1StringView::QLatin1StringView(QByteArrayView str)
+ \since 6.3
+
+ Constructs a QLatin1StringView object as a view on \a str.
+
+ The string data is \e not copied. The caller must be able to
+ guarantee that the data which \a str is pointing to will not
+ be deleted or modified as long as the QLatin1StringView object
+ exists. The size is obtained from \a str as-is, without checking
+ for a null-terminator.
+
+ \note: any null ('\\0') bytes in the byte array will be included in this
+ string, which will be converted to Unicode null characters (U+0000) if this
+ string is used by QString.
+
+ \sa latin1()
+*/
+
+/*!
+ \fn QString QLatin1StringView::toString() const
+ \since 6.0
+
+ Converts this Latin-1 string into a QString. Equivalent to
+ \code
+ return QString(*this);
+ \endcode
+*/
+
+/*! \fn const char *QLatin1StringView::latin1() const
+
+ Returns the start of the Latin-1 string referenced by this object.
+*/
+
+/*! \fn const char *QLatin1StringView::data() const
+
+ Returns the start of the Latin-1 string referenced by this object.
+*/
+
+/*! \fn const char *QLatin1StringView::constData() const
+ \since 6.4
+
+ Returns the start of the Latin-1 string referenced by this object.
+
+ This function is provided for compatibility with other Qt containers.
+
+ \sa data()
+*/
+
+/*! \fn qsizetype QLatin1StringView::size() const
+
+ Returns the size of the Latin-1 string referenced by this object.
+
+ \note In version prior to Qt 6, this function returned \c{int},
+ restricting the amount of data that could be held in a QLatin1StringView
+ on 64-bit architectures.
+*/
+
+/*! \fn qsizetype QLatin1StringView::length() const
+ \since 6.4
+
+ Same as size().
+
+ This function is provided for compatibility with other Qt containers.
+*/
+
+/*! \fn bool QLatin1StringView::isNull() const
+ \since 5.10
+
+ Returns whether the Latin-1 string referenced by this object is null
+ (\c{data() == nullptr}) or not.
+
+ \sa isEmpty(), data()
+*/
+
+/*! \fn bool QLatin1StringView::isEmpty() const
+ \since 5.10
+
+ Returns whether the Latin-1 string referenced by this object is empty
+ (\c{size() == 0}) or not.
+
+ \sa isNull(), size()
+*/
+
+/*! \fn bool QLatin1StringView::empty() const
+ \since 6.4
+
+ Returns whether the Latin-1 string referenced by this object is empty
+ (\c{size() == 0}) or not.
+
+ This function is provided for STL compatibility.
+
+ \sa isEmpty(), isNull(), size()
+*/
+
+/*! \fn QLatin1Char QLatin1StringView::at(qsizetype pos) const
+ \since 5.8
+
+ Returns the character at position \a pos in this object.
+
+ \note This function performs no error checking.
+ The behavior is undefined when \a pos < 0 or \a pos >= size().
+
+ \sa operator[]()
+*/
+
+/*! \fn QLatin1Char QLatin1StringView::operator[](qsizetype pos) const
+ \since 5.8
+
+ Returns the character at position \a pos in this object.
+
+ \note This function performs no error checking.
+ The behavior is undefined when \a pos < 0 or \a pos >= size().
+
+ \sa at()
+*/
+
+/*!
+ \fn QLatin1Char QLatin1StringView::front() const
+ \since 5.10
+
+ Returns the first character in the string.
+ Same as \c{at(0)}.
+
+ This function is provided for STL compatibility.
+
+ \warning Calling this function on an empty string constitutes
+ undefined behavior.
+
+ \sa back(), at(), operator[]()
+*/
+
+/*!
+ \fn QLatin1Char QLatin1StringView::first() const
+ \since 6.4
+
+ Returns the first character in the string.
+ Same as \c{at(0)} or front().
+
+ This function is provided for compatibility with other Qt containers.
+
+ \warning Calling this function on an empty string constitutes
+ undefined behavior.
+
+ \sa last(), front(), back()
+*/
+
+/*!
+ \fn QLatin1Char QLatin1StringView::back() const
+ \since 5.10
+
+ Returns the last character in the string.
+ Same as \c{at(size() - 1)}.
+
+ This function is provided for STL compatibility.
+
+ \warning Calling this function on an empty string constitutes
+ undefined behavior.
+
+ \sa front(), at(), operator[]()
+*/
+
+/*!
+ \fn QLatin1Char QLatin1StringView::last() const
+ \since 6.4
+
+ Returns the last character in the string.
+ Same as \c{at(size() - 1)} or back().
+
+ This function is provided for compatibility with other Qt containers.
+
+ \warning Calling this function on an empty string constitutes
+ undefined behavior.
+
+ \sa first(), back(), front()
+*/
+
+/*!
+ \fn int QLatin1StringView::compare(QStringView str, Qt::CaseSensitivity cs) const
+ \fn int QLatin1StringView::compare(QLatin1StringView l1, Qt::CaseSensitivity cs) const
+ \fn int QLatin1StringView::compare(QChar ch) const
+ \fn int QLatin1StringView::compare(QChar ch, Qt::CaseSensitivity cs) const
+ \since 5.14
+
+ Compares this string view with UTF-16 string view \a str, Latin-1 string view \a l1,
+ or the character \a ch, respectively. Returns a negative integer if this
+ string is less than \a str, \a l1 or \a ch, returns a positive integer if it
+ is greater than \a str, \a l1 or \a ch, and zero if they are equal.
+
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
+
+ \sa operator==(), operator<(), operator>()
+*/
+
+/*!
+ \fn int QLatin1StringView::compare(QUtf8StringView str, Qt::CaseSensitivity cs) const
+ \since 6.5
+
+ Compares this string view with \a str and returns a negative integer if
+ this string view is less than \a str, a positive integer if it is greater than
+ \a str, and zero if they are equal.
+
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {comparison}
+
+ \sa operator==(), operator<(), operator>()
+*/
+
+
+/*!
+ \fn bool QLatin1StringView::startsWith(QStringView str, Qt::CaseSensitivity cs) const
+ \since 5.10
+ \fn bool QLatin1StringView::startsWith(QLatin1StringView l1, Qt::CaseSensitivity cs) const
+ \since 5.10
+ \fn bool QLatin1StringView::startsWith(QChar ch) const
+ \since 5.10
+ \fn bool QLatin1StringView::startsWith(QChar ch, Qt::CaseSensitivity cs) const
+ \since 5.10
+
+ Returns \c true if this Latin-1 string view starts with the UTF-16
+ string viewed by \a str, the Latin-1 string viewed by \a l1, or the
+ character \a ch, respectively; otherwise returns \c false.
+
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
+
+ \sa endsWith()
+*/
+
+/*!
+ \fn bool QLatin1StringView::endsWith(QStringView str, Qt::CaseSensitivity cs) const
+ \since 5.10
+ \fn bool QLatin1StringView::endsWith(QLatin1StringView l1, Qt::CaseSensitivity cs) const
+ \since 5.10
+ \fn bool QLatin1StringView::endsWith(QChar ch) const
+ \since 5.10
+ \fn bool QLatin1StringView::endsWith(QChar ch, Qt::CaseSensitivity cs) const
+ \since 5.10
+
+ Returns \c true if this Latin-1 string view ends with the UTF-16 string
+ viewed \a str, the Latin-1 string viewed by \a l1, or the character \a ch,
+ respectively; otherwise returns \c false.
+
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
+
+ \sa startsWith()
+*/
+
+/*!
+ \fn qsizetype QLatin1StringView::indexOf(QStringView str, qsizetype from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
+ \fn qsizetype QLatin1StringView::indexOf(QLatin1StringView l1, qsizetype from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
+ \fn qsizetype QLatin1StringView::indexOf(QChar c, qsizetype from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
+ \since 5.14
+
+ Returns the index position in this Latin-1 string view of the first
+ occurrence of the UTF-16 string viewed by \a str, the Latin-1 string
+ viewed by \a l1, or the character \a ch, respectively, searching forward
+ from index position \a from. Returns -1 if \a str, \a l1 or \a c is not
+ found, respectively.
+
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
+
+ \include qstring.qdocinc negative-index-start-search-from-end
+
+ \sa QString::indexOf()
+*/
+
+/*!
+ \fn bool QLatin1StringView::contains(QStringView str, Qt::CaseSensitivity cs) const
+ \fn bool QLatin1StringView::contains(QLatin1StringView l1, Qt::CaseSensitivity cs) const
+ \fn bool QLatin1StringView::contains(QChar c, Qt::CaseSensitivity cs) const
+ \since 5.14
+
+ Returns \c true if this Latin-1 string view contains an occurrence of the
+ UTF-16 string viewed by \a str, the Latin-1 string viewed by \a l1, or the
+ character \a ch, respectively; otherwise returns \c false.
+
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
+
+ \sa indexOf(), QStringView::contains(), QStringView::indexOf(),
+ QString::indexOf()
+*/
+
+/*!
+ \fn qsizetype QLatin1StringView::lastIndexOf(QStringView str, qsizetype from, Qt::CaseSensitivity cs) const
+ \fn qsizetype QLatin1StringView::lastIndexOf(QLatin1StringView l1, qsizetype from, Qt::CaseSensitivity cs) const
+ \fn qsizetype QLatin1StringView::lastIndexOf(QChar c, qsizetype from, Qt::CaseSensitivity cs) const
+ \since 5.14
+
+ Returns the index position in this Latin-1 string view of the last
+ occurrence of the UTF-16 string viewed by \a str, the Latin-1 string
+ viewed by \a l1, or the character \a ch, respectively, searching backward
+ from index position \a from; returns -1 if \a str, \a l1 or \a ch is not
+ found, respectively.
+
+ \include qstring.qdocinc negative-index-start-search-from-end
+
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
+
+ \note When searching for a 0-length \a str or \a l1, the match at
+ the end of the data is excluded from the search by a negative \a
+ from, even though \c{-1} is normally thought of as searching from
+ the end of the string: the match at the end is \e after the last
+ character, so it is excluded. To include such a final empty match,
+ either give a positive value for \a from or omit the \a from
+ parameter entirely.
+
+ \sa indexOf(), QStringView::lastIndexOf(), QStringView::indexOf(),
+ QString::indexOf()
+*/
+
+/*!
+ \fn qsizetype QLatin1StringView::lastIndexOf(QStringView str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
+ \fn qsizetype QLatin1StringView::lastIndexOf(QLatin1StringView l1, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
+ \since 6.2
+ \overload lastIndexOf()
+
+ Returns the index position in this Latin-1 string view of the last
+ occurrence of the UTF-16 string viewed by \a str or the Latin-1 string
+ viewed by \a l1, respectively. Returns -1 if \a str or \a l1 is not found,
+ respectively.
+
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
+*/
+
+/*!
+ \fn qsizetype QLatin1StringView::lastIndexOf(QChar ch, Qt::CaseSensitivity cs) const
+ \since 6.3
+ \overload
+*/
+
+/*!
+ \fn qsizetype QLatin1StringView::count(QStringView str, Qt::CaseSensitivity cs) const
+ \fn qsizetype QLatin1StringView::count(QLatin1StringView l1, Qt::CaseSensitivity cs) const
+ \fn qsizetype QLatin1StringView::count(QChar ch, Qt::CaseSensitivity cs) const
+ \since 6.4
+
+ Returns the number of (potentially overlapping) occurrences of the
+ UTF-16 string viewed by \a str, the Latin-1 string viewed by \a l1,
+ or the character \a ch, respectively, in this string view.
+
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
+
+ \sa contains(), indexOf()
+*/
+
+/*!
+ \fn QLatin1StringView::const_iterator QLatin1StringView::begin() const
+ \since 5.10
+
+ Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the
+ first character in the string.
+
+ This function is provided for STL compatibility.
+
+ \sa end(), cbegin(), rbegin(), data()
+*/
+
+/*!
+ \fn QLatin1StringView::const_iterator QLatin1StringView::cbegin() const
+ \since 5.10
+
+ Same as begin().
+
+ This function is provided for STL compatibility.
+
+ \sa cend(), begin(), crbegin(), data()
+*/
+
+/*!
+ \fn QLatin1StringView::const_iterator QLatin1StringView::constBegin() const
+ \since 6.4
+
+ Same as begin().
+
+ This function is provided for compatibility with other Qt containers.
+
+ \sa constEnd(), begin(), cbegin(), data()
+*/
+
+/*!
+ \fn QLatin1StringView::const_iterator QLatin1StringView::end() const
+ \since 5.10
+
+ Returns a const \l{STL-style iterators}{STL-style iterator} pointing just
+ after the last character in the string.
+
+ This function is provided for STL compatibility.
+
+ \sa begin(), cend(), rend()
+*/
+
+/*! \fn QLatin1StringView::const_iterator QLatin1StringView::cend() const
+ \since 5.10
+
+ Same as end().
+
+ This function is provided for STL compatibility.
+
+ \sa cbegin(), end(), crend()
+*/
+
+/*! \fn QLatin1StringView::const_iterator QLatin1StringView::constEnd() const
+ \since 6.4
+
+ Same as end().
+
+ This function is provided for compatibility with other Qt containers.
+
+ \sa constBegin(), end(), cend(), crend()
+*/
+
+/*!
+ \fn QLatin1StringView::const_reverse_iterator QLatin1StringView::rbegin() const
+ \since 5.10
+
+ Returns a const \l{STL-style iterators}{STL-style} reverse iterator pointing
+ to the first character in the string, in reverse order.
+
+ This function is provided for STL compatibility.
+
+ \sa rend(), crbegin(), begin()
+*/
+
+/*!
+ \fn QLatin1StringView::const_reverse_iterator QLatin1StringView::crbegin() const
+ \since 5.10
+
+ Same as rbegin().
+
+ This function is provided for STL compatibility.
+
+ \sa crend(), rbegin(), cbegin()
+*/
+
+/*!
+ \fn QLatin1StringView::const_reverse_iterator QLatin1StringView::rend() const
+ \since 5.10
+
+ Returns a \l{STL-style iterators}{STL-style} reverse iterator pointing just
+ after the last character in the string, in reverse order.
+
+ This function is provided for STL compatibility.
+
+ \sa rbegin(), crend(), end()
+*/
+
+/*!
+ \fn QLatin1StringView::const_reverse_iterator QLatin1StringView::crend() const
+ \since 5.10
+
+ Same as rend().
+
+ This function is provided for STL compatibility.
+
+ \sa crbegin(), rend(), cend()
+*/
+
+/*!
+ \fn QLatin1StringView QLatin1StringView::mid(qsizetype start, qsizetype length) const
+ \since 5.8
+
+ Returns the substring of length \a length starting at position
+ \a start in this Latin-1 string view.
+
+ If you know that \a start and \a length cannot be out of bounds, use
+ sliced() instead in new code, because it is faster.
+
+ Returns an empty Latin-1 string view if \a start exceeds the length
+ of this string view. If there are less than \a length characters available
+ in this string view starting at \a start, or if \a length is negative
+ (default), the function returns all characters that are available from
+ \a start.
+
+ \sa first(), last(), sliced(), chopped(), chop(), truncate()
+*/
+
+/*!
+ \fn QLatin1StringView QLatin1StringView::left(qsizetype length) const
+ \since 5.8
+
+ If you know that \a length cannot be out of bounds, use first() instead in
+ new code, because it is faster.
+
+ Returns the substring of length \a length starting at position
+ 0 in this Latin-1 string view.
+
+ The entire Latin-1 string view is returned if \a length is greater
+ than or equal to size(), or less than zero.
+
+ \sa first(), last(), sliced(), startsWith(), chopped(), chop(), truncate()
+*/
+
+/*!
+ \fn QLatin1StringView QLatin1StringView::right(qsizetype length) const
+ \since 5.8
+
+ If you know that \a length cannot be out of bounds, use last() instead in
+ new code, because it is faster.
+
+ Returns the substring of length \a length starting at position
+ size() - \a length in this Latin-1 string view.
+
+ The entire Latin-1 string view is returned if \a length is greater
+ than or equal to size(), or less than zero.
+
+ \sa first(), last(), sliced(), endsWith(), chopped(), chop(), truncate()
+*/
+
+/*!
+ \fn QLatin1StringView QLatin1StringView::first(qsizetype n) const
+ \since 6.0
+
+ Returns a Latin-1 string view that contains the first \a n characters
+ of this string view.
+
+ \note The behavior is undefined when \a n < 0 or \a n > size().
+
+ \sa last(), startsWith(), chopped(), chop(), truncate()
+*/
+
+/*!
+ \fn QLatin1StringView QLatin1StringView::last(qsizetype n) const
+ \since 6.0
+
+ Returns a Latin-1 string view that contains the last \a n characters
+ of this string view.
+
+ \note The behavior is undefined when \a n < 0 or \a n > size().
+
+ \sa first(), endsWith(), chopped(), chop(), truncate()
+*/
+
+/*!
+ \fn QLatin1StringView QLatin1StringView::sliced(qsizetype pos, qsizetype n) const
+ \since 6.0
+
+ Returns a Latin-1 string view that points to \a n characters of this
+ string view, starting at position \a pos.
+
+//! [UB-sliced-index-length]
+ \note The behavior is undefined when \a pos < 0, \a n < 0,
+ or \c{pos + n > size()}.
+//! [UB-sliced-index-length]
+
+ \sa first(), last(), chopped(), chop(), truncate()
+*/
+
+/*!
+ \fn QLatin1StringView QLatin1StringView::sliced(qsizetype pos) const
+ \since 6.0
+
+ Returns a Latin-1 string view starting at position \a pos in this
+ string view, and extending to its end.
+
+//! [UB-sliced-index-only]
+ \note The behavior is undefined when \a pos < 0 or \a pos > size().
+//! [UB-sliced-index-only]
+
+ \sa first(), last(), chopped(), chop(), truncate()
+*/
+
+/*!
+ \fn QLatin1StringView QLatin1StringView::chopped(qsizetype length) const
+ \since 5.10
+
+ Returns the substring of length size() - \a length starting at the
+ beginning of this object.
+
+ Same as \c{left(size() - length)}.
+
+ \note The behavior is undefined when \a length < 0 or \a length > size().
+
+ \sa sliced(), first(), last(), chop(), truncate()
+*/
+
+/*!
+ \fn void QLatin1StringView::truncate(qsizetype length)
+ \since 5.10
+
+ Truncates this string to length \a length.
+
+ Same as \c{*this = left(length)}.
+
+ \note The behavior is undefined when \a length < 0 or \a length > size().
+
+ \sa sliced(), first(), last(), chopped(), chop()
+*/
+
+/*!
+ \fn void QLatin1StringView::chop(qsizetype length)
+ \since 5.10
+
+ Truncates this string by \a length characters.
+
+ Same as \c{*this = left(size() - length)}.
+
+ \note The behavior is undefined when \a length < 0 or \a length > size().
+
+ \sa sliced(), first(), last(), chopped(), truncate()
+*/
+
+/*!
+ \fn QLatin1StringView QLatin1StringView::trimmed() const
+ \since 5.10
+
+ Strips leading and trailing whitespace and returns the result.
+
+ Whitespace means any character for which QChar::isSpace() returns
+ \c true. This includes the ASCII characters '\\t', '\\n', '\\v',
+ '\\f', '\\r', and ' '.
+*/
+
+/*!
+ \fn bool QLatin1StringView::operator==(const QLatin1StringView &lhs, const char * const &rhs)
+ \since 4.3
+
+ Returns \c true if the string \a lhs is equal to const char pointer \a rhs;
+ otherwise returns \c false.
+
+ The \a rhs const char pointer is converted to a QUtf8StringView.
+
+ You can disable this operator by defining
+ \l QT_NO_CAST_FROM_ASCII when you compile your applications. This
+ can be useful if you want to ensure that all user-visible strings
+ go through QObject::tr(), for example.
+
+ \sa {Comparing Strings}
+*/
+
+/*!
+ \fn bool QLatin1StringView::operator==(const QLatin1StringView &lhs, const QByteArray &rhs)
+ \since 5.0
+ \overload
+
+ The \a rhs byte array is converted to a QUtf8StringView.
+
+ You can disable this operator by defining
+ \l QT_NO_CAST_FROM_ASCII when you compile your applications. This
+ can be useful if you want to ensure that all user-visible strings
+ go through QObject::tr(), for example.
+*/
+
+/*!
+ \fn bool QLatin1StringView::operator!=(const QLatin1StringView &lhs, const char * const &rhs)
+ \since 4.3
+
+ Returns \c true if the string \a lhs is not equal to const char pointer \a rhs;
+ otherwise returns \c false.
+
+ The \a rhs const char pointer is converted to a QUtf8StringView.
+
+ You can disable this operator by defining
+ \l QT_NO_CAST_FROM_ASCII when you compile your applications. This
+ can be useful if you want to ensure that all user-visible strings
+ go through QObject::tr(), for example.
+
+ \sa {Comparing Strings}
+*/
+
+/*!
+ \fn bool QLatin1StringView::operator!=(const QLatin1StringView &lhs, const QByteArray &rhs)
+ \since 5.0
+ \overload operator!=()
+
+ The \a rhs byte array is converted to a QUtf8StringView.
+
+ You can disable this operator by defining
+ \l QT_NO_CAST_FROM_ASCII when you compile your applications. This
+ can be useful if you want to ensure that all user-visible strings
+ go through QObject::tr(), for example.
+*/
+
+/*!
+ \fn bool QLatin1StringView::operator>(const QLatin1StringView &lhs, const char * const &rhs)
+ \since 4.3
+
+ Returns \c true if the string \a lhs is lexically greater than const char pointer
+ \a rhs; otherwise returns \c false.
+
+ The \a rhs const char pointer is converted to a QUtf8StringView.
+
+ You can disable this operator by defining \l QT_NO_CAST_FROM_ASCII
+ when you compile your applications. This can be useful if you want
+ to ensure that all user-visible strings go through QObject::tr(),
+ for example.
+
+ \sa {Comparing Strings}
+*/
+
+/*!
+ \fn bool QLatin1StringView::operator>(const QLatin1StringView &lhs, const QByteArray &rhs)
+ \since 5.0
+ \overload
+
+ The \a rhs byte array is converted to a QUtf8StringView.
+
+ You can disable this operator by defining \l QT_NO_CAST_FROM_ASCII
+ when you compile your applications. This can be useful if you want
+ to ensure that all user-visible strings go through QObject::tr(),
+ for example.
+*/
+
+/*!
+ \fn bool QLatin1StringView::operator<(const QLatin1StringView &lhs, const char * const &rhs)
+ \since 4.3
+
+ Returns \c true if the string \a lhs is lexically less than const char pointer
+ \a rhs; otherwise returns \c false.
+
+ The \a rhs const char pointer is converted to a QUtf8StringView.
+
+ You can disable this operator by defining
+ \l QT_NO_CAST_FROM_ASCII when you compile your applications. This
+ can be useful if you want to ensure that all user-visible strings
+ go through QObject::tr(), for example.
+
+ \sa {Comparing Strings}
+*/
+
+/*!
+ \fn bool QLatin1StringView::operator<(const QLatin1StringView &lhs, const QByteArray &rhs)
+ \since 5.0
+ \overload
+
+ The \a rhs byte array is converted to a QUtf8StringView.
+
+ You can disable this operator by defining
+ \l QT_NO_CAST_FROM_ASCII when you compile your applications. This
+ can be useful if you want to ensure that all user-visible strings
+ go through QObject::tr(), for example.
+*/
+
+/*!
+ \fn bool QLatin1StringView::operator>=(const QLatin1StringView &lhs, const char * const &rhs)
+ \since 4.3
+
+ Returns \c true if the string \a lhs is lexically greater than or equal to
+ const char pointer \a rhs; otherwise returns \c false.
+
+ The \a rhs const char pointer is converted to a QUtf8StringView.
+
+ You can disable this operator by defining
+ \l QT_NO_CAST_FROM_ASCII when you compile your applications. This
+ can be useful if you want to ensure that all user-visible strings
+ go through QObject::tr(), for example.
+
+ \sa {Comparing Strings}
+*/
+
+/*!
+ \fn bool QLatin1StringView::operator>=(const QLatin1StringView &lhs, const QByteArray &rhs)
+ \since 5.0
+ \overload
+
+ The \a rhs byte array is converted to a QUtf8StringView.
+
+ You can disable this operator by defining
+ \l QT_NO_CAST_FROM_ASCII when you compile your applications. This
+ can be useful if you want to ensure that all user-visible strings
+ go through QObject::tr(), for example.
+*/
+
+/*!
+ \fn bool QLatin1StringView::operator<=(const QLatin1StringView &lhs, const char * const &rhs)
+ \since 4.3
+
+ Returns \c true if the string \a lhs is lexically less than or equal to
+ const char pointer \a rhs; otherwise returns \c false.
+
+ The \a rhs const char pointer is converted to a QUtf8StringView.
+
+ You can disable this operator by defining
+ \l QT_NO_CAST_FROM_ASCII when you compile your applications. This
+ can be useful if you want to ensure that all user-visible strings
+ go through QObject::tr(), for example.
+
+ \sa {Comparing Strings}
+*/
+
+/*!
+ \fn bool QLatin1StringView::operator<=(const QLatin1StringView &lhs, const QByteArray &rhs)
+ \since 5.0
+ \overload
+
+ The \a rhs byte array is converted to a QUtf8StringView.
+
+ You can disable this operator by defining
+ \l QT_NO_CAST_FROM_ASCII when you compile your applications. This
+ can be useful if you want to ensure that all user-visible strings
+ go through QObject::tr(), for example.
+*/
+
+/*! \fn bool QLatin1StringView::operator==(const QLatin1StringView &lhs, const QLatin1StringView &rhs)
+
+ Returns \c true if string \a lhs is lexically equal to string \a rhs;
+ otherwise returns \c false.
+*/
+/*! \fn bool QLatin1StringView::operator!=(const QLatin1StringView &lhs, const QLatin1StringView &rhs)
+
+ Returns \c true if string \a lhs is lexically not equal to string \a rhs;
+ otherwise returns \c false.
+*/
+/*! \fn bool QLatin1StringView::operator<(const QLatin1StringView &lhs, const QLatin1StringView &rhs)
+
+ Returns \c true if string \a lhs is lexically less than string \a rhs;
+ otherwise returns \c false.
+*/
+/*! \fn bool QLatin1StringView::operator<=(const QLatin1StringView &lhs, const QLatin1StringView &rhs)
+
+ Returns \c true if string \a lhs is lexically less than or equal to
+ string \a rhs; otherwise returns \c false.
+*/
+/*! \fn bool QLatin1StringView::operator>(const QLatin1StringView &lhs, const QLatin1StringView &rhs)
+
+ Returns \c true if string \a lhs is lexically greater than string \a rhs;
+ otherwise returns \c false.
+*/
+/*! \fn bool QLatin1StringView::operator>=(const QLatin1StringView &lhs, const QLatin1StringView &rhs)
+
+ Returns \c true if string \a lhs is lexically greater than or equal
+ to string \a rhs; otherwise returns \c false.
+*/
+
+/*! \fn bool QLatin1StringView::operator==(const QChar &lhs, const QLatin1StringView &rhs)
+
+ Returns \c true if char \a lhs is lexically equal to string \a rhs;
+ otherwise returns \c false.
+*/
+/*! \fn bool QLatin1StringView::operator<(const QChar &lhs, const QLatin1StringView &rhs)
+
+ Returns \c true if char \a lhs is lexically less than string \a rhs;
+ otherwise returns \c false.
+*/
+/*! \fn bool QLatin1StringView::operator>(const QChar &lhs, const QLatin1StringView &rhs)
+ Returns \c true if char \a lhs is lexically greater than string \a rhs;
+ otherwise returns \c false.
+*/
+/*! \fn bool QLatin1StringView::operator!=(const QChar &lhs, const QLatin1StringView &rhs)
+
+ Returns \c true if char \a lhs is lexically not equal to string \a rhs;
+ otherwise returns \c false.
+*/
+/*! \fn bool QLatin1StringView::operator<=(const QChar &lhs, const QLatin1StringView &rhs)
+
+ Returns \c true if char \a lhs is lexically less than or equal to
+ string \a rhs; otherwise returns \c false.
+*/
+/*! \fn bool QLatin1StringView::operator>=(const QChar &lhs, const QLatin1StringView &rhs)
+
+ Returns \c true if char \a lhs is lexically greater than or equal to
+ string \a rhs; otherwise returns \c false.
+*/
+
+/*! \fn bool QLatin1StringView::operator==(const QLatin1StringView &lhs, const QChar &rhs)
+
+ Returns \c true if string \a lhs is lexically equal to char \a rhs;
+ otherwise returns \c false.
+*/
+/*! \fn bool QLatin1StringView::operator<(const QLatin1StringView &lhs, const QChar &rhs)
+
+ Returns \c true if string \a lhs is lexically less than char \a rhs;
+ otherwise returns \c false.
+*/
+/*! \fn bool QLatin1StringView::operator>(const QLatin1StringView &lhs, const QChar &rhs)
+
+ Returns \c true if string \a lhs is lexically greater than char \a rhs;
+ otherwise returns \c false.
+*/
+/*! \fn bool QLatin1StringView::operator!=(const QLatin1StringView &lhs, const QChar &rhs)
+
+ Returns \c true if string \a lhs is lexically not equal to char \a rhs;
+ otherwise returns \c false.
+*/
+/*! \fn bool QLatin1StringView::operator<=(const QLatin1StringView &lhs, const QChar &rhs)
+
+ Returns \c true if string \a lhs is lexically less than or equal to
+ char \a rhs; otherwise returns \c false.
+*/
+/*! \fn bool QLatin1StringView::operator>=(const QLatin1StringView &lhs, const QChar &rhs)
+
+ Returns \c true if string \a lhs is lexically greater than or equal to
+ char \a rhs; otherwise returns \c false.
+*/
+
+/*! \fn bool QLatin1StringView::operator==(const QStringView &lhs, const QLatin1StringView &rhs)
+
+ Returns \c true if string view \a lhs is lexically equal to string \a rhs;
+ otherwise returns \c false.
+*/
+/*! \fn bool QLatin1StringView::operator<(const QStringView &lhs, const QLatin1StringView &rhs)
+
+ Returns \c true if string view \a lhs is lexically less than string \a rhs;
+ otherwise returns \c false.
+*/
+/*! \fn bool QLatin1StringView::operator>(const QStringView &lhs, const QLatin1StringView &rhs)
+
+ Returns \c true if string view \a lhs is lexically greater than string \a rhs;
+ otherwise returns \c false.
+*/
+/*! \fn bool QLatin1StringView::operator!=(const QStringView &lhs, const QLatin1StringView &rhs)
+
+ Returns \c true if string view \a lhs is lexically not equal to string \a rhs;
+ otherwise returns \c false.
+*/
+/*! \fn bool QLatin1StringView::operator<=(const QStringView &lhs, const QLatin1StringView &rhs)
+
+ Returns \c true if string view \a lhs is lexically less than or equal to
+ string \a rhs; otherwise returns \c false.
+*/
+/*! \fn bool QLatin1StringView::operator>=(const QStringView &lhs, const QLatin1StringView &rhs)
+
+ Returns \c true if string view \a lhs is lexically greater than or equal to
+ string \a rhs; otherwise returns \c false.
+*/
+
+/*! \fn bool QLatin1StringView::operator==(const QLatin1StringView &lhs, const QStringView &rhs)
+
+ Returns \c true if string \a lhs is lexically equal to string view \a rhs;
+ otherwise returns \c false.
+*/
+/*! \fn bool QLatin1StringView::operator<(const QLatin1StringView &lhs, const QStringView &rhs)
+
+ Returns \c true if string \a lhs is lexically less than string view \a rhs;
+ otherwise returns \c false.
+*/
+/*! \fn bool QLatin1StringView::operator>(const QLatin1StringView &lhs, const QStringView &rhs)
+
+ Returns \c true if string \a lhs is lexically greater than string view \a rhs;
+ otherwise returns \c false.
+*/
+/*! \fn bool QLatin1StringView::operator!=(const QLatin1StringView &lhs, const QStringView &rhs)
+
+ Returns \c true if string \a lhs is lexically not equal to string view \a rhs;
+ otherwise returns \c false.
+*/
+/*! \fn bool QLatin1StringView::operator<=(const QLatin1StringView &lhs, const QStringView &rhs)
+
+ Returns \c true if string \a lhs is lexically less than or equal to
+ string view \a rhs; otherwise returns \c false.
+*/
+/*! \fn bool QLatin1StringView::operator>=(const QLatin1StringView &lhs, const QStringView &rhs)
+
+ Returns \c true if string \a lhs is lexically greater than or equal to
+ string view \a rhs; otherwise returns \c false.
+*/
+
+/*! \fn bool QLatin1StringView::operator==(const char * const &lhs, const QLatin1StringView &rhs)
+
+ Returns \c true if const char pointer \a lhs is lexically equal to
+ string \a rhs; otherwise returns \c false.
+*/
+/*! \fn bool QLatin1StringView::operator<(const char * const &lhs, const QLatin1StringView &rhs)
+
+ Returns \c true if const char pointer \a lhs is lexically less than
+ string \a rhs; otherwise returns \c false.
+*/
+/*! \fn bool QLatin1StringView::operator>(const char * const &lhs, const QLatin1StringView &rhs)
+
+ Returns \c true if const char pointer \a lhs is lexically greater than
+ string \a rhs; otherwise returns \c false.
+*/
+/*! \fn bool QLatin1StringView::operator!=(const char * const &lhs, const QLatin1StringView &rhs)
+
+ Returns \c true if const char pointer \a lhs is lexically not equal to
+ string \a rhs; otherwise returns \c false.
+*/
+/*! \fn bool QLatin1StringView::operator<=(const char * const &lhs, const QLatin1StringView &rhs)
+
+ Returns \c true if const char pointer \a lhs is lexically less than or
+ equal to string \a rhs; otherwise returns \c false.
+*/
+/*! \fn bool QLatin1StringView::operator>=(const char * const &lhs, const QLatin1StringView &rhs)
+
+ Returns \c true if const char pointer \a lhs is lexically greater than or
+ equal to string \a rhs; otherwise returns \c false.
+*/
+
+/*!
+ \fn qlonglong QLatin1StringView::toLongLong(bool *ok, int base) const
+ \fn qulonglong QLatin1StringView::toULongLong(bool *ok, int base) const
+ \fn int QLatin1StringView::toInt(bool *ok, int base) const
+ \fn uint QLatin1StringView::toUInt(bool *ok, int base) const
+ \fn long QLatin1StringView::toLong(bool *ok, int base) const
+ \fn ulong QLatin1StringView::toULong(bool *ok, int base) const
+ \fn short QLatin1StringView::toShort(bool *ok, int base) const
+ \fn ushort QLatin1StringView::toUShort(bool *ok, int base) const
+
+ \since 6.4
+
+ Returns this QLatin1StringView converted to a corresponding numeric value using
+ base \a base, which is ten by default. Bases 0 and 2 through 36 are supported,
+ using letters for digits beyond 9; A is ten, B is eleven and so on.
+
+ If \a base is 0, the base is determined automatically using the following
+ rules (in this order), if the Latin-1 string view begins with:
+
+ \list
+ \li \c "0x", the rest of it is read as hexadecimal (base 16)
+ \li \c "0b", the rest of it is read as binary (base 2)
+ \li \c "0", the rest of it is read as octal (base 8)
+ \li otherwise it is read as decimal
+ \endlist
+
+ Returns 0 if the conversion fails.
+
+ If \a ok is not \nullptr, failure is reported by setting *\a{ok}
+ to \c false, and success by setting *\a{ok} to \c true.
+
+//! [latin1-numeric-conversion-note]
+ \note The conversion of the number is performed in the default C locale,
+ regardless of the user's locale. Use QLocale to perform locale-aware
+ conversions between numbers and strings.
+
+ This function ignores leading and trailing spacing characters.
+//! [latin1-numeric-conversion-note]
+
+ \note Support for the "0b" prefix was added in Qt 6.4.
+*/
+
+/*!
+ \fn double QLatin1StringView::toDouble(bool *ok) const
+ \fn float QLatin1StringView::toFloat(bool *ok) const
+ \since 6.4
+
+ Returns this QLatin1StringView converted to a corresponding floating-point value.
+
+ Returns an infinity if the conversion overflows or 0.0 if the
+ conversion fails for other reasons (e.g. underflow).
+
+ If \a ok is not \nullptr, failure is reported by setting *\a{ok}
+ to \c false, and success by setting *\a{ok} to \c true.
+
+ \warning The QLatin1StringView content may only contain valid numerical
+ characters which includes the plus/minus sign, the character e used in
+ scientific notation, and the decimal point. Including the unit or additional
+ characters leads to a conversion error.
+
+ \include qlatin1stringview.qdoc latin1-numeric-conversion-note
+*/
+
+/*!
+ \fn Qt::Literals::StringLiterals::operator""_L1(const char *str, size_t size)
+
+ \relates QLatin1StringView
+ \since 6.4
+
+ Literal operator that creates a QLatin1StringView out of the first \a size
+ characters in the char string literal \a str.
+
+ The following code creates a QLatin1StringView:
+ \code
+ using namespace Qt::Literals::StringLiterals;
+
+ auto str = "hello"_L1;
+ \endcode
+
+ \sa Qt::Literals::StringLiterals
+*/
diff --git a/src/corelib/text/qlocale.cpp b/src/corelib/text/qlocale.cpp
index 45794cc703..ab95b300eb 100644
--- a/src/corelib/text/qlocale.cpp
+++ b/src/corelib/text/qlocale.cpp
@@ -1,46 +1,10 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Copyright (C) 2021 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2022 The Qt Company Ltd.
+// Copyright (C) 2021 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qglobal.h"
-#if (defined(QT_STATIC) || defined(QT_BOOTSTRAPPED)) && defined(Q_CC_GNU) && Q_CC_GNU >= 1000
+#if (defined(QT_STATIC) || defined(QT_BOOTSTRAPPED)) && defined(Q_CC_GNU_ONLY) && Q_CC_GNU >= 1000
QT_WARNING_DISABLE_GCC("-Wfree-nonheap-object") // false positive tracking
#endif
@@ -58,6 +22,7 @@ QT_WARNING_DISABLE_GCC("-Wfree-nonheap-object") // false positive tracking
#include "qlocale.h"
#include "qlocale_p.h"
#include "qlocale_tools_p.h"
+#include <private/qtools_p.h>
#if QT_CONFIG(datetimeparser)
#include "private/qdatetimeparser_p.h"
#endif
@@ -65,8 +30,13 @@ QT_WARNING_DISABLE_GCC("-Wfree-nonheap-object") // false positive tracking
#include "qdatetime.h"
#include "qstringlist.h"
#include "qvariant.h"
+#include "qvarlengtharray.h"
#include "qstringbuilder.h"
+#if QT_CONFIG(timezone)
+# include "qtimezone.h"
+#endif
#include "private/qnumeric_p.h"
+#include "private/qtools_p.h"
#include <cmath>
#ifndef QT_NO_SYSTEMLOCALE
# include "qmutex.h"
@@ -80,20 +50,40 @@ QT_WARNING_DISABLE_GCC("-Wfree-nonheap-object") // false positive tracking
#include "private/qgregoriancalendar_p.h"
#include "qcalendar.h"
+#include <q20iterator.h>
+
QT_BEGIN_NAMESPACE
+constexpr int QLocale::DefaultTwoDigitBaseYear;
+
+QT_IMPL_METATYPE_EXTERN_TAGGED(QList<Qt::DayOfWeek>, QList_Qt__DayOfWeek)
#ifndef QT_NO_SYSTEMLOCALE
-static QSystemLocale *_systemLocale = nullptr;
-class QSystemLocaleSingleton: public QSystemLocale
-{
-public:
- QSystemLocaleSingleton() : QSystemLocale(true) {}
-};
+QT_IMPL_METATYPE_EXTERN_TAGGED(QSystemLocale::CurrencyToStringArgument,
+ QSystemLocale__CurrencyToStringArgument)
+#endif
-Q_GLOBAL_STATIC(QSystemLocaleSingleton, QSystemLocale_globalSystemLocale)
-static QLocaleData systemLocaleData;
+using namespace Qt::StringLiterals;
+using namespace QtMiscUtils;
+
+#ifndef QT_NO_SYSTEMLOCALE
+Q_CONSTINIT static QSystemLocale *_systemLocale = nullptr;
+Q_CONSTINIT static QLocaleData systemLocaleData = {};
#endif
+static_assert(ascii_isspace(' '));
+static_assert(ascii_isspace('\t'));
+static_assert(ascii_isspace('\n'));
+static_assert(ascii_isspace('\v'));
+static_assert(ascii_isspace('\f'));
+static_assert(ascii_isspace('\r'));
+static_assert(!ascii_isspace('\0'));
+static_assert(!ascii_isspace('\a'));
+static_assert(!ascii_isspace('a'));
+static_assert(!ascii_isspace('\177'));
+static_assert(!ascii_isspace(uchar('\200')));
+static_assert(!ascii_isspace(uchar('\xA0'))); // NBSP (is a space but Latin 1, not ASCII)
+static_assert(!ascii_isspace(uchar('\377')));
+
/******************************************************************************
** Helpers for accessing Qt locale database
*/
@@ -102,22 +92,58 @@ QT_BEGIN_INCLUDE_NAMESPACE
#include "qlocale_data_p.h"
QT_END_INCLUDE_NAMESPACE
-QLocale::Language QLocalePrivate::codeToLanguage(QStringView code) noexcept
+QLocale::Language QLocalePrivate::codeToLanguage(QStringView code,
+ QLocale::LanguageCodeTypes codeTypes) noexcept
{
const auto len = code.size();
if (len != 2 && len != 3)
return QLocale::AnyLanguage;
- char16_t uc1 = code[0].toLower().unicode();
- char16_t uc2 = code[1].toLower().unicode();
- char16_t uc3 = len > 2 ? code[2].toLower().unicode() : 0;
- const unsigned char *c = language_code_list;
- for (; *c != 0; c += 3) {
- if (uc1 == c[0] && uc2 == c[1] && uc3 == c[2])
- return QLocale::Language((c - language_code_list)/3);
+ const char16_t uc1 = code[0].toLower().unicode();
+ const char16_t uc2 = code[1].toLower().unicode();
+ const char16_t uc3 = len > 2 ? code[2].toLower().unicode() : 0;
+
+ // All language codes are ASCII.
+ if (uc1 > 0x7F || uc2 > 0x7F || uc3 > 0x7F)
+ return QLocale::AnyLanguage;
+
+ const AlphaCode codeBuf = { char(uc1), char(uc2), char(uc3) };
+
+ auto searchCode = [codeBuf](auto f) {
+ return std::find_if(languageCodeList.begin(), languageCodeList.end(),
+ [=](LanguageCodeEntry i) { return f(i) == codeBuf; });
+ };
+
+ if (codeTypes.testFlag(QLocale::ISO639Part1) && uc3 == 0) {
+ auto i = searchCode([](LanguageCodeEntry i) { return i.part1; });
+ if (i != languageCodeList.end())
+ return QLocale::Language(std::distance(languageCodeList.begin(), i));
+ }
+
+ if (uc3 != 0) {
+ if (codeTypes.testFlag(QLocale::ISO639Part2B)) {
+ auto i = searchCode([](LanguageCodeEntry i) { return i.part2B; });
+ if (i != languageCodeList.end())
+ return QLocale::Language(std::distance(languageCodeList.begin(), i));
+ }
+
+ // Optimization: Part 2T code if present is always the same as Part 3 code.
+ // This is asserted in iso639_3.LanguageCodeData.
+ if (codeTypes.testFlag(QLocale::ISO639Part2T)
+ && !codeTypes.testFlag(QLocale::ISO639Part3)) {
+ auto i = searchCode([](LanguageCodeEntry i) { return i.part2T; });
+ if (i != languageCodeList.end())
+ return QLocale::Language(std::distance(languageCodeList.begin(), i));
+ }
+
+ if (codeTypes.testFlag(QLocale::ISO639Part3)) {
+ auto i = searchCode([](LanguageCodeEntry i) { return i.part3; });
+ if (i != languageCodeList.end())
+ return QLocale::Language(std::distance(languageCodeList.begin(), i));
+ }
}
- if (uc3 == 0) {
+ if (codeTypes.testFlag(QLocale::LegacyLanguageCode) && uc3 == 0) {
// legacy codes
if (uc1 == 'n' && uc2 == 'o') // no -> nb
return QLocale::NorwegianBokmal;
@@ -151,7 +177,7 @@ QLocale::Script QLocalePrivate::codeToScript(QStringView code) noexcept
unsigned char c3 = code[3].toLower().toLatin1();
const unsigned char *c = script_code_list;
- for (int i = 0; i < QLocale::LastScript; ++i, c += 4) {
+ for (qsizetype i = 0; i < QLocale::LastScript; ++i, c += 4) {
if (c0 == c[0] && c1 == c[1] && c2 == c[2] && c3 == c[3])
return QLocale::Script(i);
}
@@ -177,32 +203,46 @@ QLocale::Territory QLocalePrivate::codeToTerritory(QStringView code) noexcept
return QLocale::AnyTerritory;
}
-QLatin1String QLocalePrivate::languageToCode(QLocale::Language language)
+std::array<char, 4> QLocalePrivate::languageToCode(QLocale::Language language,
+ QLocale::LanguageCodeTypes codeTypes)
{
if (language == QLocale::AnyLanguage || language > QLocale::LastLanguage)
- return QLatin1String();
+ return {};
if (language == QLocale::C)
- return QLatin1String("C");
+ return {'C'};
+
+ const LanguageCodeEntry &i = languageCodeList[language];
+
+ if (codeTypes.testFlag(QLocale::ISO639Part1) && i.part1.isValid())
+ return i.part1.decode();
+
+ if (codeTypes.testFlag(QLocale::ISO639Part2B) && i.part2B.isValid())
+ return i.part2B.decode();
- const unsigned char *c = language_code_list + 3 * language;
- return QLatin1String(reinterpret_cast<const char*>(c), c[2] == 0 ? 2 : 3);
+ if (codeTypes.testFlag(QLocale::ISO639Part2T) && i.part2T.isValid())
+ return i.part2T.decode();
+
+ if (codeTypes.testFlag(QLocale::ISO639Part3))
+ return i.part3.decode();
+
+ return {};
}
-QLatin1String QLocalePrivate::scriptToCode(QLocale::Script script)
+QLatin1StringView QLocalePrivate::scriptToCode(QLocale::Script script)
{
if (script == QLocale::AnyScript || script > QLocale::LastScript)
- return QLatin1String();
+ return {};
const unsigned char *c = script_code_list + 4 * script;
- return QLatin1String(reinterpret_cast<const char *>(c), 4);
+ return {reinterpret_cast<const char *>(c), 4};
}
-QLatin1String QLocalePrivate::territoryToCode(QLocale::Territory territory)
+QLatin1StringView QLocalePrivate::territoryToCode(QLocale::Territory territory)
{
if (territory == QLocale::AnyTerritory || territory > QLocale::LastTerritory)
- return QLatin1String();
+ return {};
const unsigned char *c = territory_code_list + 3 * territory;
- return QLatin1String(reinterpret_cast<const char*>(c), c[2] == 0 ? 2 : 3);
+ return {reinterpret_cast<const char*>(c), c[2] == 0 ? 2 : 3};
}
namespace {
@@ -212,7 +252,7 @@ struct LikelyPair
QLocaleId value = QLocaleId { 0, 0, 0 };
};
-bool operator<(const LikelyPair &lhs, const LikelyPair &rhs)
+bool operator<(LikelyPair lhs, LikelyPair rhs)
{
// Must match the comparison LocaleDataWriter.likelySubtags() uses when
// sorting, see qtbase/util/locale_database.qlocalexml2cpp.py
@@ -370,20 +410,34 @@ QByteArray QLocaleId::name(char separator) const
if (language_id == QLocale::C)
return QByteArrayLiteral("C");
- const unsigned char *lang = language_code_list + 3 * language_id;
+ const LanguageCodeEntry &language = languageCodeList[language_id];
+ AlphaCode lang;
+ qsizetype langLen;
+
+ if (language.part1.isValid()) {
+ lang = language.part1;
+ langLen = 2;
+ } else {
+ lang = language.part2B.isValid() ? language.part2B : language.part3;
+ langLen = 3;
+ }
+
const unsigned char *script =
(script_id != QLocale::AnyScript ? script_code_list + 4 * script_id : nullptr);
const unsigned char *country =
(territory_id != QLocale::AnyTerritory
? territory_code_list + 3 * territory_id : nullptr);
- char len = (lang[2] != 0 ? 3 : 2) + (script ? 4 + 1 : 0)
- + (country ? (country[2] != 0 ? 3 : 2) + 1 : 0);
+ qsizetype len = langLen + (script ? 4 + 1 : 0) + (country ? (country[2] != 0 ? 3 : 2) + 1 : 0);
QByteArray name(len, Qt::Uninitialized);
char *uc = name.data();
- *uc++ = lang[0];
- *uc++ = lang[1];
- if (lang[2] != 0)
- *uc++ = lang[2];
+
+ auto langArray = lang.decode();
+
+ *uc++ = langArray[0];
+ *uc++ = langArray[1];
+ if (langLen > 2)
+ *uc++ = langArray[2];
+
if (script) {
*uc++ = separator;
*uc++ = script[0];
@@ -411,9 +465,9 @@ QByteArray QLocalePrivate::bcp47Name(char separator) const
return m_data->id().withLikelySubtagsRemoved().name(separator);
}
-static int findLocaleIndexById(const QLocaleId &localeId)
+static qsizetype findLocaleIndexById(QLocaleId localeId)
{
- quint16 idx = locale_index[localeId.language_id];
+ qsizetype idx = locale_index[localeId.language_id];
// If there are no locales for specified language (so we we've got the
// default language, which has no associated script or country), give up:
if (localeId.language_id && idx == 0)
@@ -430,17 +484,17 @@ static int findLocaleIndexById(const QLocaleId &localeId)
return -1;
}
-int QLocaleData::findLocaleIndex(QLocaleId lid)
+qsizetype QLocaleData::findLocaleIndex(QLocaleId lid)
{
QLocaleId localeId = lid;
QLocaleId likelyId = localeId.withLikelySubtagsAdded();
const ushort fallback = likelyId.language_id;
// Try a straight match with the likely data:
- int index = findLocaleIndexById(likelyId);
+ qsizetype index = findLocaleIndexById(likelyId);
if (index >= 0)
return index;
- QList<QLocaleId> tried;
+ QVarLengthArray<QLocaleId, 6> tried;
tried.push_back(likelyId);
#define CheckCandidate(id) do { \
@@ -480,13 +534,13 @@ int QLocaleData::findLocaleIndex(QLocaleId lid)
return locale_index[fallback];
}
-static QStringView findTag(QStringView name)
+static QStringView findTag(QStringView name) noexcept
{
- const QString separators = QStringLiteral("_-.@");
- int i = 0;
- while (i < name.size() && !separators.contains(name[i]))
- i++;
- return name.first(i);
+ const std::u16string_view v(name.utf16(), size_t(name.size()));
+ const auto i = v.find_first_of(u"_-.@");
+ if (i == std::string_view::npos)
+ return name;
+ return name.first(qsizetype(i));
}
static bool validTag(QStringView tag)
@@ -494,7 +548,7 @@ static bool validTag(QStringView tag)
// Is tag is a non-empty sequence of ASCII letters and/or digits ?
for (QChar uc : tag) {
const char16_t ch = uc.unicode();
- if (!((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || (ch >= '0' && ch <= '9')))
+ if (!isAsciiLetterOrNumber(ch))
return false;
}
return tag.size() > 0;
@@ -507,7 +561,7 @@ static bool isScript(QStringView tag)
static const QString allScripts =
QString::fromLatin1(reinterpret_cast<const char *>(script_code_list),
sizeof(script_code_list) - 1);
- return tag.length() == 4 && allScripts.indexOf(tag) % 4 == 0;
+ return tag.size() == 4 && allScripts.indexOf(tag) % 4 == 0;
}
bool qt_splitLocaleName(QStringView name, QStringView *lang, QStringView *script, QStringView *land)
@@ -568,26 +622,26 @@ QLocaleId QLocaleId::fromName(QStringView name)
return { langId, QLocalePrivate::codeToScript(script), QLocalePrivate::codeToTerritory(land) };
}
-QString qt_readEscapedFormatString(QStringView format, int *idx)
+QString qt_readEscapedFormatString(QStringView format, qsizetype *idx)
{
- int &i = *idx;
+ qsizetype &i = *idx;
- Q_ASSERT(format.at(i) == QLatin1Char('\''));
+ Q_ASSERT(format.at(i) == u'\'');
++i;
if (i == format.size())
return QString();
if (format.at(i).unicode() == '\'') { // "''" outside of a quoted string
++i;
- return QLatin1String("'");
+ return "'"_L1;
}
QString result;
while (i < format.size()) {
if (format.at(i).unicode() == '\'') {
- if (format.mid(i + 1).startsWith(QLatin1Char('\''))) {
+ if (format.mid(i + 1).startsWith(u'\'')) {
// "''" inside a quoted string
- result.append(QLatin1Char('\''));
+ result.append(u'\'');
i += 2;
} else {
break;
@@ -618,7 +672,7 @@ QString qt_readEscapedFormatString(QStringView format, int *idx)
qt_repeatCount(u"aab"); // == 2
\endcode
*/
-int qt_repeatCount(QStringView s)
+qsizetype qt_repeatCount(QStringView s)
{
if (s.isEmpty())
return 0;
@@ -626,15 +680,15 @@ int qt_repeatCount(QStringView s)
qsizetype j = 1;
while (j < s.size() && s.at(j) == c)
++j;
- return int(j);
+ return j;
}
-static const QLocaleData *default_data = nullptr;
+Q_CONSTINIT static const QLocaleData *default_data = nullptr;
+Q_CONSTINIT QBasicAtomicInt QLocalePrivate::s_generation = Q_BASIC_ATOMIC_INITIALIZER(0);
-static const QLocaleData *const c_data = locale_data;
static QLocalePrivate *c_private()
{
- static QLocalePrivate c_locale(c_data, 0, QLocale::OmitGroupSeparator, 1);
+ static QLocalePrivate c_locale(locale_data, 0, QLocale::OmitGroupSeparator, 1);
return &c_locale;
}
@@ -644,37 +698,48 @@ static QLocalePrivate *c_private()
*/
/*!
- Constructs a QSystemLocale object.
+ \internal
+ Constructs a QSystemLocale object.
+
+ The constructor will automatically install this object as the system locale.
+ It and the destructor maintain a stack of system locales, with the
+ most-recently-created instance (that hasn't yet been deleted) used as the
+ system locale. This is only intended as a way to let a platform plugin
+ install its own system locale, overriding what might otherwise be provided
+ for its class of platform (as Android does, differing from Linux), and to
+ let tests transiently override the system or plugin-supplied one. As such,
+ there should not be diverse threads creating and destroying QSystemLocale
+ instances concurrently, so no attempt is made at thread-safety in managing
+ the stack.
- The constructor will automatically install this object as the system locale,
- if there's not one active. It also resets the flag that'll prompt
- QLocale::system() to re-initialize its data, so that instantiating a
- QSystemLocale transiently (doesn't install the transient as system locale if
- there was one already and) triggers an update to the system locale's data.
+ This constructor also resets the flag that'll prompt QLocale::system() to
+ re-initialize its data, so that instantiating a QSystemLocale (even
+ transiently) triggers a refresh of the system locale's data. This is
+ exploited by some test code.
*/
-QSystemLocale::QSystemLocale()
+QSystemLocale::QSystemLocale() : next(_systemLocale)
{
- if (!_systemLocale)
- _systemLocale = this;
+ _systemLocale = this;
systemLocaleData.m_language_id = 0;
}
/*!
\internal
-*/
-QSystemLocale::QSystemLocale(bool)
-{ }
-
-/*!
- Deletes the object.
+ Deletes the object.
*/
QSystemLocale::~QSystemLocale()
{
if (_systemLocale == this) {
- _systemLocale = nullptr;
+ _systemLocale = next;
+ // Change to system locale => force refresh.
systemLocaleData.m_language_id = 0;
+ } else {
+ for (QSystemLocale *p = _systemLocale; p; p = p->next) {
+ if (p->next == this)
+ p->next = next;
+ }
}
}
@@ -682,7 +747,12 @@ static const QSystemLocale *systemLocale()
{
if (_systemLocale)
return _systemLocale;
- return QSystemLocale_globalSystemLocale();
+
+ // As this is only ever instantiated with _systemLocale null, it is
+ // necessarily the ->next-most in any chain that may subsequently develop;
+ // and it won't be destructed until exit()-time.
+ static QSystemLocale globalInstance;
+ return &globalInstance;
}
static void updateSystemPrivate()
@@ -713,28 +783,49 @@ static void updateSystemPrivate()
systemLocaleData.m_script_id = res.toInt();
// Should we replace Any values based on likely sub-tags ?
+
+ // If system locale is default locale, update the default collator's generation:
+ if (default_data == &systemLocaleData)
+ QLocalePrivate::s_generation.fetchAndAddRelaxed(1);
}
#endif // !QT_NO_SYSTEMLOCALE
-static const QLocaleData *systemData()
+static const QLocaleData *systemData(qsizetype *sysIndex = nullptr)
{
#ifndef QT_NO_SYSTEMLOCALE
/*
Copy over the information from the fallback locale and modify.
- This modifies (cross-thread) global state, so take care to only call it in
- one thread.
+ If sysIndex is passed, it should be the m_index of the system locale's
+ QLocalePrivate, which we'll update if it needs it.
+
+ This modifies (cross-thread) global state, so is mutex-protected.
*/
{
- static QBasicMutex systemDataMutex;
+ Q_CONSTINIT static QLocaleId sysId;
+ bool updated = false;
+
+ Q_CONSTINIT static QBasicMutex systemDataMutex;
systemDataMutex.lock();
- if (systemLocaleData.m_language_id == 0)
+ if (systemLocaleData.m_language_id == 0) {
updateSystemPrivate();
+ updated = true;
+ }
+ // Initialization of system private has *sysIndex == -1 to hit this.
+ if (sysIndex && (updated || *sysIndex < 0)) {
+ const QLocaleId nowId = systemLocaleData.id();
+ if (sysId != nowId || *sysIndex < 0) {
+ // This look-up may be expensive:
+ *sysIndex = QLocaleData::findLocaleIndex(nowId);
+ sysId = nowId;
+ }
+ }
systemDataMutex.unlock();
}
return &systemLocaleData;
#else
+ Q_UNUSED(sysIndex);
return locale_data;
#endif
}
@@ -746,7 +837,7 @@ static const QLocaleData *defaultData()
return default_data;
}
-static uint defaultIndex()
+static qsizetype defaultIndex()
{
const QLocaleData *const data = defaultData();
#ifndef QT_NO_SYSTEMLOCALE
@@ -757,15 +848,15 @@ static uint defaultIndex()
}
#endif
- Q_ASSERT(data >= locale_data);
- Q_ASSERT(data < locale_data + std::size(locale_data));
+ using QtPrivate::q_points_into_range;
+ Q_ASSERT(q_points_into_range(data, locale_data));
return data - locale_data;
}
const QLocaleData *QLocaleData::c()
{
Q_ASSERT(locale_index[QLocale::C] == 0);
- return c_data;
+ return locale_data;
}
#ifndef QT_NO_DATASTREAM
@@ -784,18 +875,17 @@ QDataStream &operator>>(QDataStream &ds, QLocale &l)
}
#endif // QT_NO_DATASTREAM
-static const int locale_data_size = sizeof(locale_data)/sizeof(QLocaleData) - 1;
+static constexpr qsizetype locale_data_size = q20::ssize(locale_data) - 1; // trailing guard
-QBasicAtomicInt QLocalePrivate::s_generation = Q_BASIC_ATOMIC_INITIALIZER(0);
-Q_GLOBAL_STATIC_WITH_ARGS(QSharedDataPointer<QLocalePrivate>, defaultLocalePrivate,
- (new QLocalePrivate(defaultData(), defaultIndex())))
+Q_GLOBAL_STATIC(QSharedDataPointer<QLocalePrivate>, defaultLocalePrivate,
+ new QLocalePrivate(defaultData(), defaultIndex()))
static QLocalePrivate *localePrivateByName(QStringView name)
{
if (name == u"C")
return c_private();
- const int index = QLocaleData::findLocaleIndex(QLocaleId::fromName(name));
- Q_ASSERT(index >= 0 && size_t(index) < std::size(locale_data) - 1);
+ const qsizetype index = QLocaleData::findLocaleIndex(QLocaleId::fromName(name));
+ Q_ASSERT(index >= 0 && index < locale_data_size);
return new QLocalePrivate(locale_data + index, index,
locale_data[index].m_language_id == QLocale::C
? QLocale::OmitGroupSeparator : QLocale::DefaultNumberOptions);
@@ -807,8 +897,8 @@ static QLocalePrivate *findLocalePrivate(QLocale::Language language, QLocale::Sc
if (language == QLocale::C)
return c_private();
- int index = QLocaleData::findLocaleIndex(QLocaleId { language, script, territory });
- Q_ASSERT(index >= 0 && size_t(index) < std::size(locale_data) - 1);
+ qsizetype index = QLocaleData::findLocaleIndex(QLocaleId { language, script, territory });
+ Q_ASSERT(index >= 0 && index < locale_data_size);
const QLocaleData *data = locale_data + index;
QLocale::NumberOptions numberOptions = QLocale::DefaultNumberOptions;
@@ -823,29 +913,41 @@ static QLocalePrivate *findLocalePrivate(QLocale::Language language, QLocale::Sc
return new QLocalePrivate(data, index, numberOptions);
}
-QString QLocaleData::decimalPoint() const
+static std::optional<QString>
+systemLocaleString(const QLocaleData *that, QSystemLocale::QueryType type)
{
#ifndef QT_NO_SYSTEMLOCALE
- if (this == &systemLocaleData) {
- auto res = systemLocale()->query(QSystemLocale::DecimalPoint).toString();
- if (!res.isEmpty())
- return res;
- }
+ if (that != &systemLocaleData)
+ return std::nullopt;
+
+ QVariant v = systemLocale()->query(type);
+ if (v.metaType() != QMetaType::fromType<QString>())
+ return std::nullopt;
+
+ return v.toString();
+#else
+ Q_UNUSED(that)
+ Q_UNUSED(type)
+ return std::nullopt;
#endif
- return decimalSeparator().getData(single_character_data);
+}
+
+static QString localeString(const QLocaleData *that, QSystemLocale::QueryType type,
+ QLocaleData::DataRange range)
+{
+ if (auto opt = systemLocaleString(that, type))
+ return *opt;
+ return range.getData(single_character_data);
+}
+
+QString QLocaleData::decimalPoint() const
+{
+ return localeString(this, QSystemLocale::DecimalPoint, decimalSeparator());
}
QString QLocaleData::groupSeparator() const
{
- // Empty => don't do grouping
-#ifndef QT_NO_SYSTEMLOCALE
- if (this == &systemLocaleData) {
- QVariant res = systemLocale()->query(QSystemLocale::GroupSeparator);
- if (!res.isNull())
- return res.toString();
- }
-#endif
- return groupDelim().getData(single_character_data);
+ return localeString(this, QSystemLocale::GroupSeparator, groupDelim());
}
QString QLocaleData::percentSign() const
@@ -860,14 +962,7 @@ QString QLocaleData::listSeparator() const
QString QLocaleData::zeroDigit() const
{
-#ifndef QT_NO_SYSTEMLOCALE
- if (this == &systemLocaleData) {
- auto res = systemLocale()->query(QSystemLocale::ZeroDigit).toString();
- if (!res.isEmpty())
- return res;
- }
-#endif
- return zero().getData(single_character_data);
+ return localeString(this, QSystemLocale::ZeroDigit, zero());
}
char32_t QLocaleData::zeroUcs() const
@@ -888,26 +983,12 @@ char32_t QLocaleData::zeroUcs() const
QString QLocaleData::negativeSign() const
{
-#ifndef QT_NO_SYSTEMLOCALE
- if (this == &systemLocaleData) {
- auto res = systemLocale()->query(QSystemLocale::NegativeSign).toString();
- if (!res.isEmpty())
- return res;
- }
-#endif
- return minus().getData(single_character_data);
+ return localeString(this, QSystemLocale::NegativeSign, minus());
}
QString QLocaleData::positiveSign() const
{
-#ifndef QT_NO_SYSTEMLOCALE
- if (this == &systemLocaleData) {
- auto res = systemLocale()->query(QSystemLocale::PositiveSign).toString();
- if (!res.isEmpty())
- return res;
- }
-#endif
- return plus().getData(single_character_data);
+ return localeString(this, QSystemLocale::PositiveSign, plus());
}
QString QLocaleData::exponentSeparator() const
@@ -922,6 +1003,21 @@ QLocale::QLocale(QLocalePrivate &dd)
: d(&dd)
{}
+/*!
+ \variable QLocale::DefaultTwoDigitBaseYear
+ \since 6.7
+
+ \brief The default start year of the century within which a format taking
+ a two-digit year will select. The value of the constant is \c {1900}.
+
+ Some locales use, particularly for ShortFormat, only the last two digits of
+ the year. Proir to 6.7 the year 1900 was always used as a base year for
+ such cases. Now various QLocale and QDate functions have the overloads that
+ allow callers to specify the base year, and this constant is used as its
+ default value.
+
+ \sa toDate(), toDateTime(), QDate::fromString(), QDateTime::fromString()
+*/
/*!
\since 6.3
@@ -957,12 +1053,10 @@ QLocale::QLocale(QStringView name)
{
}
-#if QT_STRINGVIEW_LEVEL < 2
/*!
\fn QLocale::QLocale(const QString &name)
\overload
*/
-#endif
/*!
Constructs a QLocale object initialized with the default locale.
@@ -993,7 +1087,7 @@ QLocale::QLocale()
*/
QLocale::QLocale(Language language, Territory territory)
- : d(findLocalePrivate(language, QLocale::AnyScript, territory))
+ : d(findLocalePrivate(language, AnyScript, territory))
{
}
@@ -1025,10 +1119,7 @@ QLocale::QLocale(Language language, Script script, Territory territory)
Constructs a QLocale object as a copy of \a other.
*/
-QLocale::QLocale(const QLocale &other)
-{
- d = other.d;
-}
+QLocale::QLocale(const QLocale &other) noexcept = default;
/*!
Destructor
@@ -1043,11 +1134,7 @@ QLocale::~QLocale()
to this QLocale object.
*/
-QLocale &QLocale::operator=(const QLocale &other)
-{
- d = other.d;
- return *this;
-}
+QLocale &QLocale::operator=(const QLocale &other) noexcept = default;
/*!
\internal
@@ -1127,10 +1214,10 @@ QString QLocale::quoteString(QStringView str, QuotationStyle style) const
#ifndef QT_NO_SYSTEMLOCALE
if (d->m_data == &systemLocaleData) {
QVariant res;
- if (style == QLocale::AlternateQuotation)
+ if (style == AlternateQuotation)
res = systemLocale()->query(QSystemLocale::StringToAlternateQuotation,
QVariant::fromValue(str));
- if (res.isNull() || style == QLocale::StandardQuotation)
+ if (res.isNull() || style == StandardQuotation)
res = systemLocale()->query(QSystemLocale::StringToStandardQuotation,
QVariant::fromValue(str));
if (!res.isNull())
@@ -1139,7 +1226,7 @@ QString QLocale::quoteString(QStringView str, QuotationStyle style) const
#endif
QLocaleData::DataRange start, end;
- if (style == QLocale::StandardQuotation) {
+ if (style == StandardQuotation) {
start = d->m_data->quoteStart();
end = d->m_data->quoteEnd();
} else {
@@ -1169,7 +1256,7 @@ QString QLocale::createSeparatedList(const QStringList &list) const
}
#endif
- const int size = list.size();
+ const qsizetype size = list.size();
if (size < 1)
return QString();
@@ -1184,7 +1271,7 @@ QString QLocale::createSeparatedList(const QStringList &list) const
QStringView formatMid = d->m_data->midListPattern().viewData(list_pattern_part_data);
QStringView formatEnd = d->m_data->endListPattern().viewData(list_pattern_part_data);
QString result = formatStart.arg(list.at(0), list.at(1));
- for (int i = 2; i < size - 1; ++i)
+ for (qsizetype i = 2; i < size - 1; ++i)
result = formatMid.arg(result, list.at(i));
result = formatEnd.arg(result, list.at(size - 1));
return result;
@@ -1271,51 +1358,94 @@ QLocale::Country QLocale::country() const
#endif
/*!
- Returns the language and country of this locale as a
- string of the form "language_country", where
- language is a lowercase, two-letter ISO 639 language code,
- and country is an uppercase, two- or three-letter ISO 3166 country code.
+ \since 6.7
+ \enum QLocale::TagSeparator
+
+ Indicate how to combine the parts that make up a locale identifier.
- Note that even if QLocale object was constructed with an explicit script,
- name() will not contain it for compatibility reasons. Use \l bcp47Name() instead
- if you need a full locale name.
+ A locale identifier may be made up of several tags, indicating language,
+ script and territory (plus, potentially, other details), joined together to
+ form the identifier. Various standards and conventional forms use either a
+ dash (the Unicode HYPHEN-MINUS, U+002D) or an underscore (LOW LINE, U+005F).
+ Different clients of QLocale may thus need one or the other.
- \sa QLocale(), language(), script(), territory(), bcp47Name()
+ \value Dash Use \c{'-'}, the dash or hyphen character.
+ \value Underscore Use \c{'_'}, the underscore character.
+
+ \note Although dash and underscore are the only separators used in public
+ standards (as at 2023), it is possible to cast any \l
+ {https://en.cppreference.com/w/cpp/language/ascii} {ASCII} character to this
+ type if a non-standard ASCII separator is needed. Casting a non-ASCII
+ character (with decimal value above 127) is not supported: such values are
+ reserved for future use as enum members if some public standard ever uses a
+ non-ASCII separator. It is, of course, possible to use QString::replace() to
+ replace the separator used by a function taking a parameter of this type
+ with an arbitrary Unicode character or string.
*/
-QString QLocale::name() const
+Q_DECL_COLD_FUNCTION static void badSeparatorWarning(const char *method, char sep)
{
+ qWarning("QLocale::%s(): Using non-ASCII separator '%c' (%02x) is unsupported",
+ method, sep, uint(uchar(sep)));
+}
+
+/*!
+ \brief The short name of this locale.
+
+ Returns the language and territory of this locale as a string of the form
+ "language_territory", where language is a lowercase, two-letter ISO 639
+ language code, and territory is an uppercase, two- or three-letter ISO 3166
+ territory code. If the locale has no specified territory, only the language
+ name is returned. Since Qt 6.7 an optional \a separator parameter can be
+ supplied to override the default underscore character separating the two
+ tags.
+
+ Even if the QLocale object was constructed with an explicit script, name()
+ will not contain it for compatibility reasons. Use \l bcp47Name() instead if
+ you need a full locale name, or construct the string you want to identify a
+ locale by from those returned by passing its \l language() to \l
+ languageToCode() and similar for the script and territory.
+
+ \sa QLocale(), language(), script(), territory(), bcp47Name(), uiLanguages()
+*/
+
+QString QLocale::name(TagSeparator separator) const
+{
+ const char sep = char(separator);
+ if (uchar(sep) > 0x7f) {
+ badSeparatorWarning("name", sep);
+ return {};
+ }
+ const auto code = d->languageCode();
+ QLatin1StringView view{code.data()};
+
Language l = language();
if (l == C)
- return d->languageCode();
+ return view;
Territory c = territory();
if (c == AnyTerritory)
- return d->languageCode();
-
- return d->languageCode() + QLatin1Char('_') + d->territoryCode();
-}
-
-static qlonglong toIntegral_helper(const QLocaleData *d, QStringView str, bool *ok,
- QLocale::NumberOptions mode, qlonglong)
-{
- return d->stringToLongLong(str, 10, ok, mode);
-}
+ return view;
-static qulonglong toIntegral_helper(const QLocaleData *d, QStringView str, bool *ok,
- QLocale::NumberOptions mode, qulonglong)
-{
- return d->stringToUnsLongLong(str, 10, ok, mode);
+ return view + QLatin1Char(sep) + d->territoryCode();
}
template <typename T> static inline
T toIntegral_helper(const QLocalePrivate *d, QStringView str, bool *ok)
{
- using Int64 =
- typename std::conditional<std::is_unsigned<T>::value, qulonglong, qlonglong>::type;
+ constexpr bool isUnsigned = std::is_unsigned_v<T>;
+ using Int64 = typename std::conditional_t<isUnsigned, quint64, qint64>;
+
+ QSimpleParsedNumber<Int64> r{};
+ if constexpr (isUnsigned)
+ r = d->m_data->stringToUnsLongLong(str, 10, d->m_numberOptions);
+ else
+ r = d->m_data->stringToLongLong(str, 10, d->m_numberOptions);
- // we select the right overload by the last, unused parameter
- Int64 val = toIntegral_helper(d->m_data, str, ok, d->m_numberOptions, Int64());
+ if (ok)
+ *ok = r.ok();
+
+ Int64 val = r.result;
if (T(val) != val) {
if (ok != nullptr)
*ok = false;
@@ -1328,49 +1458,79 @@ T toIntegral_helper(const QLocalePrivate *d, QStringView str, bool *ok)
/*!
\since 4.8
- Returns the dash-separated language, script and country (and possibly other
- BCP47 fields) of this locale as a string.
+ \brief Returns the BCP47 field names joined with dashes.
+
+ This combines as many of language, script and territory (and possibly other
+ BCP47 fields) for this locale as are needed to uniquely specify it. Note
+ that fields may be omitted if the Unicode consortium's \l {Matching
+ combinations of language, script and territory}{Likely Subtag Rules} imply
+ the omitted fields when given those retained. See \l name() for how to
+ construct a string from individual fields, if some other format is needed.
- Unlike the uiLanguages() the returned value of the bcp47Name() represents
- the locale name of the QLocale data but not the language the user-interface
- should be in.
+ Unlike uiLanguages(), the value returned by bcp47Name() represents the
+ locale name of the QLocale data; this need not be the language the
+ user-interface should be in.
- This function tries to conform the locale name to BCP47.
+ This function tries to conform the locale name to the IETF Best Common
+ Practice 47, defined by RFC 5646. Since Qt 6.7, it supports an optional \a
+ separator parameter which can be used to override the BCP47-specified use of
+ a hyphen to separate the tags. For use in IETF-defined protocols, however,
+ the default, QLocale::TagSeparator::Dash, should be retained.
- \sa language(), territory(), script(), uiLanguages()
+ \sa name(), language(), territory(), script(), uiLanguages()
*/
-QString QLocale::bcp47Name() const
+QString QLocale::bcp47Name(TagSeparator separator) const
{
- return QString::fromLatin1(d->bcp47Name());
+ const char sep = char(separator);
+ if (uchar(sep) > 0x7f) {
+ badSeparatorWarning("bcp47Name", sep);
+ return {};
+ }
+ return QString::fromLatin1(d->bcp47Name(sep));
}
/*!
Returns the two- or three-letter language code for \a language, as defined
in the ISO 639 standards.
+ If specified, \a codeTypes selects which set of codes to consider. The first
+ code from the set that is defined for \a language is returned. Otherwise,
+ all ISO-639 codes are considered. The codes are considered in the following
+ order: \c ISO639Part1, \c ISO639Part2B, \c ISO639Part2T, \c ISO639Part3.
+ \c LegacyLanguageCode is ignored by this function.
+
\note For \c{QLocale::C} the function returns \c{"C"}.
For \c QLocale::AnyLanguage an empty string is returned.
+ If the language has no code in any selected code set, an empty string
+ is returned.
- \since 6.1
+ \since 6.3
\sa codeToLanguage(), language(), name(), bcp47Name(), territoryToCode(), scriptToCode()
*/
-QString QLocale::languageToCode(Language language)
+QString QLocale::languageToCode(Language language, LanguageCodeTypes codeTypes)
{
- return QLocalePrivate::languageToCode(language);
+ const auto code = QLocalePrivate::languageToCode(language, codeTypes);
+ return QLatin1StringView{code.data()};
}
/*!
Returns the QLocale::Language enum corresponding to the two- or three-letter
\a languageCode, as defined in the ISO 639 standards.
- If the code is invalid or not known QLocale::AnyLanguage is returned.
+ If specified, \a codeTypes selects which set of codes to consider for
+ conversion. By default all codes known to Qt are considered. The codes are
+ matched in the following order: \c ISO639Part1, \c ISO639Part2B,
+ \c ISO639Part2T, \c ISO639Part3, \c LegacyLanguageCode.
- \since 6.1
+ If the code is invalid or not known \c QLocale::AnyLanguage is returned.
+
+ \since 6.3
\sa languageToCode(), codeToTerritory(), codeToScript()
*/
-QLocale::Language QLocale::codeToLanguage(QStringView languageCode) noexcept
+QLocale::Language QLocale::codeToLanguage(QStringView languageCode,
+ LanguageCodeTypes codeTypes) noexcept
{
- return QLocalePrivate::codeToLanguage(languageCode);
+ return QLocalePrivate::codeToLanguage(languageCode, codeTypes);
}
/*!
@@ -1471,9 +1631,9 @@ QLocale::Script QLocale::codeToScript(QStringView scriptCode) noexcept
QString QLocale::languageToString(Language language)
{
- if (language > QLocale::LastLanguage)
- return QLatin1String("Unknown");
- return QLatin1String(language_name_list + language_name_index[language]);
+ if (language > LastLanguage)
+ return "Unknown"_L1;
+ return QString::fromUtf8(language_name_list + language_name_index[language]);
}
/*!
@@ -1483,11 +1643,11 @@ QString QLocale::languageToString(Language language)
\sa languageToString(), scriptToString(), territory(), bcp47Name()
*/
-QString QLocale::territoryToString(QLocale::Territory territory)
+QString QLocale::territoryToString(Territory territory)
{
- if (territory > QLocale::LastTerritory)
- return QLatin1String("Unknown");
- return QLatin1String(territory_name_list + territory_name_index[territory]);
+ if (territory > LastTerritory)
+ return "Unknown"_L1;
+ return QString::fromUtf8(territory_name_list + territory_name_index[territory]);
}
#if QT_DEPRECATED_SINCE(6, 6)
@@ -1511,14 +1671,13 @@ QString QLocale::countryToString(Country country)
\sa languageToString(), territoryToString(), script(), bcp47Name()
*/
-QString QLocale::scriptToString(QLocale::Script script)
+QString QLocale::scriptToString(Script script)
{
- if (script > QLocale::LastScript)
- return QLatin1String("Unknown");
- return QLatin1String(script_name_list + script_name_index[script]);
+ if (script > LastScript)
+ return "Unknown"_L1;
+ return QString::fromUtf8(script_name_list + script_name_index[script]);
}
-#if QT_STRINGVIEW_LEVEL < 2
/*!
\fn short QLocale::toShort(const QString &s, bool *ok) const
@@ -1651,9 +1810,6 @@ QString QLocale::scriptToString(QLocale::Script script)
If \a ok is not \nullptr, failure is reported by setting *\a{ok}
to \c false, and success by setting *\a{ok} to \c true.
- This function does not fall back to the 'C' locale if the string
- cannot be interpreted in this locale.
-
This function ignores leading and trailing whitespace.
\sa toDouble(), toInt(), toString()
@@ -1669,9 +1825,6 @@ QString QLocale::scriptToString(QLocale::Script script)
If \a ok is not \nullptr, failure is reported by setting *\a{ok}
to \c false, and success by setting *\a{ok} to \c true.
- This function does not fall back to the 'C' locale if the string
- cannot be interpreted in this locale.
-
\snippet code/src_corelib_text_qlocale.cpp 3
Notice that the last conversion returns 1234.0, because '.' is the
@@ -1681,7 +1834,6 @@ QString QLocale::scriptToString(QLocale::Script script)
\sa toFloat(), toInt(), toString()
*/
-#endif // QT_STRINGVIEW_LEVEL < 2
/*!
Returns the short int represented by the localized string \a s.
@@ -1874,10 +2026,6 @@ float QLocale::toFloat(QStringView s, bool *ok) const
If \a ok is not \nullptr, failure is reported by setting *\a{ok}
to \c false, and success by setting *\a{ok} to \c true.
- Unlike QString::toDouble(), this function does not fall back to
- the "C" locale if the string cannot be interpreted in this
- locale.
-
\snippet code/src_corelib_text_qlocale.cpp 3-qstringview
Notice that the last conversion returns 1234.0, because '.' is the
@@ -1923,7 +2071,6 @@ QString QLocale::toString(qulonglong i) const
return d->m_data->unsLongLongToString(i, -1, 10, -1, flags);
}
-#if QT_STRINGVIEW_LEVEL < 2
/*!
Returns a localized string representation of the given \a date in the
specified \a format.
@@ -1960,7 +2107,6 @@ QString QLocale::toString(QTime time, const QString &format) const
\sa QDateTime::toString(), QDate::toString(), QTime::toString()
*/
-#endif
/*!
\since 5.14
@@ -2041,7 +2187,7 @@ QString QLocale::toString(QDate date, FormatType format) const
static bool timeFormatContainsAP(QStringView format)
{
- int i = 0;
+ qsizetype i = 0;
while (i < format.size()) {
if (format.at(i).unicode() == '\'') {
qt_readEscapedFormatString(format, &i);
@@ -2260,7 +2406,7 @@ QString QLocale::dateTimeFormat(FormatType format) const
}
}
#endif
- return dateFormat(format) + QLatin1Char(' ') + timeFormat(format);
+ return dateFormat(format) + u' ' + timeFormat(format);
}
#if QT_CONFIG(datestring)
@@ -2292,6 +2438,16 @@ QTime QLocale::toTime(const QString &string, FormatType format) const
Parses \a string and returns the date it represents. The format of the date
string is chosen according to the \a format parameter (see dateFormat()).
+//! [base-year-for-short]
+ Some locales use, particularly for ShortFormat, only the last two digits of
+ the year. In such a case, the 100 years starting at \a baseYear are the
+ candidates first considered. Prior to 6.7 there was no \a baseYear parameter
+ and 1900 was always used. This is the default for \a baseYear, selecting a
+ year from then to 1999. In some cases, other fields may lead to the next or
+ previous century being selected, to get a result consistent with all fields
+ given. See \l QDate::fromString() for details.
+//! [base-year-for-short]
+
\note Month and day names, where used, must be given in the locale's
language.
@@ -2299,18 +2455,18 @@ QTime QLocale::toTime(const QString &string, FormatType format) const
\sa dateFormat(), toTime(), toDateTime(), QDate::fromString()
*/
-QDate QLocale::toDate(const QString &string, FormatType format) const
+QDate QLocale::toDate(const QString &string, FormatType format, int baseYear) const
{
- return toDate(string, dateFormat(format));
+ return toDate(string, dateFormat(format), baseYear);
}
/*!
\since 5.14
\overload
*/
-QDate QLocale::toDate(const QString &string, FormatType format, QCalendar cal) const
+QDate QLocale::toDate(const QString &string, FormatType format, QCalendar cal, int baseYear) const
{
- return toDate(string, dateFormat(format), cal);
+ return toDate(string, dateFormat(format), cal, baseYear);
}
/*!
@@ -2322,6 +2478,8 @@ QDate QLocale::toDate(const QString &string, FormatType format, QCalendar cal) c
date string is chosen according to the \a format parameter (see
dateFormat()).
+ \include qlocale.cpp base-year-for-short
+
\note Month and day names, where used, must be given in the locale's
language. Any am/pm indicators used must match \l amText() or \l pmText(),
ignoring case.
@@ -2330,18 +2488,19 @@ QDate QLocale::toDate(const QString &string, FormatType format, QCalendar cal) c
\sa dateTimeFormat(), toTime(), toDate(), QDateTime::fromString()
*/
-QDateTime QLocale::toDateTime(const QString &string, FormatType format) const
+QDateTime QLocale::toDateTime(const QString &string, FormatType format, int baseYear) const
{
- return toDateTime(string, dateTimeFormat(format));
+ return toDateTime(string, dateTimeFormat(format), baseYear);
}
/*!
\since 5.14
\overload
*/
-QDateTime QLocale::toDateTime(const QString &string, FormatType format, QCalendar cal) const
+QDateTime QLocale::toDateTime(const QString &string, FormatType format, QCalendar cal,
+ int baseYear) const
{
- return toDateTime(string, dateTimeFormat(format), cal);
+ return toDateTime(string, dateTimeFormat(format), cal, baseYear);
}
/*!
@@ -2382,6 +2541,16 @@ QTime QLocale::toTime(const QString &string, const QString &format) const
Parses \a string and returns the date it represents. See QDate::fromString()
for the interpretation of \a format.
+//! [base-year-for-two-digit]
+ When \a format only specifies the last two digits of a year, the 100 years
+ starting at \a baseYear are the candidates first considered. Prior to 6.7
+ there was no \a baseYear parameter and 1900 was always used. This is the
+ default for \a baseYear, selecting a year from then to 1999. In some cases,
+ other fields may lead to the next or previous century being selected, to get
+ a result consistent with all fields given. See \l QDate::fromString() for
+ details.
+//! [base-year-for-two-digit]
+
\note Month and day names, where used, must be given in the locale's
language.
@@ -2389,26 +2558,27 @@ QTime QLocale::toTime(const QString &string, const QString &format) const
\sa dateFormat(), toTime(), toDateTime(), QDate::fromString()
*/
-QDate QLocale::toDate(const QString &string, const QString &format) const
+QDate QLocale::toDate(const QString &string, const QString &format, int baseYear) const
{
- return toDate(string, format, QCalendar());
+ return toDate(string, format, QCalendar(), baseYear);
}
/*!
\since 5.14
\overload
*/
-QDate QLocale::toDate(const QString &string, const QString &format, QCalendar cal) const
+QDate QLocale::toDate(const QString &string, const QString &format, QCalendar cal, int baseYear) const
{
QDate date;
#if QT_CONFIG(datetimeparser)
QDateTimeParser dt(QMetaType::QDate, QDateTimeParser::FromString, cal);
dt.setDefaultLocale(*this);
if (dt.parseFormat(format))
- dt.fromString(string, &date, nullptr);
+ dt.fromString(string, &date, nullptr, baseYear);
#else
Q_UNUSED(string);
Q_UNUSED(format);
+ Q_UNUSED(baseYear);
Q_UNUSED(cal);
#endif
return date;
@@ -2422,6 +2592,8 @@ QDate QLocale::toDate(const QString &string, const QString &format, QCalendar ca
Parses \a string and returns the date-time it represents. See
QDateTime::fromString() for the interpretation of \a format.
+ \include qlocale.cpp base-year-for-two-digit
+
\note Month and day names, where used, must be given in the locale's
language. Any am/pm indicators used must match \l amText() or \l pmText(),
ignoring case.
@@ -2435,27 +2607,31 @@ QDate QLocale::toDate(const QString &string, const QString &format, QCalendar ca
\sa dateTimeFormat(), toTime(), toDate(), QDateTime::fromString()
*/
-QDateTime QLocale::toDateTime(const QString &string, const QString &format) const
+QDateTime QLocale::toDateTime(const QString &string, const QString &format, int baseYear) const
{
- return toDateTime(string, format, QCalendar());
+ return toDateTime(string, format, QCalendar(), baseYear);
}
/*!
\since 5.14
\overload
*/
-QDateTime QLocale::toDateTime(const QString &string, const QString &format, QCalendar cal) const
+QDateTime QLocale::toDateTime(const QString &string, const QString &format, QCalendar cal,
+ int baseYear) const
{
#if QT_CONFIG(datetimeparser)
QDateTime datetime;
QDateTimeParser dt(QMetaType::QDateTime, QDateTimeParser::FromString, cal);
dt.setDefaultLocale(*this);
- if (dt.parseFormat(format) && (dt.fromString(string, &datetime) || !datetime.isValid()))
+ if (dt.parseFormat(format) && (dt.fromString(string, &datetime, baseYear)
+ || !datetime.isValid())) {
return datetime;
+ }
#else
Q_UNUSED(string);
Q_UNUSED(format);
+ Q_UNUSED(baseYear);
Q_UNUSED(cal);
#endif
return QDateTime();
@@ -2465,7 +2641,14 @@ QDateTime QLocale::toDateTime(const QString &string, const QString &format, QCal
/*!
\since 4.1
- Returns the decimal point character of this locale.
+ Returns the fractional part separator for this locale.
+
+ This is the token that separates the whole number part from the fracional
+ part in the representation of a number which has a fractional part. This is
+ commonly called the "decimal point character" - even though, in many
+ locales, it is not a "point" (or similar dot). It is (since Qt 6.0) returned
+ as a string in case some locale needs more than one UTF-16 code-point to
+ represent its separator.
\sa groupSeparator(), toString()
*/
@@ -2477,7 +2660,14 @@ QString QLocale::decimalPoint() const
/*!
\since 4.1
- Returns the group separator character of this locale.
+ Returns the digit-grouping separator for this locale.
+
+ This is a token used to break up long sequences of digits, in the
+ representation of a number, to make it easier to read. In some locales it
+ may be empty, indicating that digits should not be broken up into groups in
+ this way. In others it may be a spacing character. It is (since Qt 6.0)
+ returned as a string in case some locale needs more than one UTF-16
+ code-point to represent its separator.
\sa decimalPoint(), toString()
*/
@@ -2489,7 +2679,12 @@ QString QLocale::groupSeparator() const
/*!
\since 4.1
- Returns the percent character of this locale.
+ Returns the percent marker of this locale.
+
+ This is a token presumed to be appended to a number to indicate a
+ percentage. It is (since Qt 6.0) returned as a string because, in some
+ locales, it is not a single character - for example, because it includes a
+ text-direction-control character.
\sa toString()
*/
@@ -2503,6 +2698,13 @@ QString QLocale::percent() const
Returns the zero digit character of this locale.
+ This is a single Unicode character but may be encoded as a surrogate pair,
+ so is (since Qt 6.0) returned as a string. In most locales, other digits
+ follow it in Unicode ordering - however, some number systems, notably those
+ using U+3007 as zero, do not have contiguous digits. Use toString() to
+ obtain suitable representations of numbers, rather than trying to construct
+ them from this zero digit.
+
\sa toString()
*/
QString QLocale::zeroDigit() const
@@ -2513,7 +2715,12 @@ QString QLocale::zeroDigit() const
/*!
\since 4.1
- Returns the negative sign character of this locale.
+ Returns the negative sign indicator of this locale.
+
+ This is a token presumed to be used as a prefix to a number to indicate that
+ it is negative. It is (since Qt 6.0) returned as a string because, in some
+ locales, it is not a single character - for example, because it includes a
+ text-direction-control character.
\sa positiveSign(), toString()
*/
@@ -2525,7 +2732,12 @@ QString QLocale::negativeSign() const
/*!
\since 4.5
- Returns the positive sign character of this locale.
+ Returns the positive sign indicator of this locale.
+
+ This is a token presumed to be used as a prefix to a number to indicate that
+ it is positive. It is (since Qt 6.0) returned as a string because, in some
+ locales, it is not a single character - for example, because it includes a
+ text-direction-control character.
\sa negativeSign(), toString()
*/
@@ -2537,8 +2749,13 @@ QString QLocale::positiveSign() const
/*!
\since 4.1
- Returns the exponential character of this locale, used to separate exponent
- from mantissa in some floating-point numeric representations.
+ Returns the exponent separator for this locale.
+
+ This is a token used to separate mantissa from exponent in some
+ floating-point numeric representations. It is (since Qt 6.0) returned as a
+ string because, in some locales, it is not a single character - for example,
+ it may consist of a multiplication sign and a representation of the "ten to
+ the power" operator.
\sa toString(double, char, int)
*/
@@ -2547,19 +2764,6 @@ QString QLocale::exponential() const
return d->m_data->exponentSeparator();
}
-static bool qIsUpper(char c)
-{
- return c >= 'A' && c <= 'Z';
-}
-
-static char qToLower(char c)
-{
- if (c >= 'A' && c <= 'Z')
- return c - 'A' + 'a';
- else
- return c;
-}
-
/*!
\overload
Returns a string representing the floating-point number \a f.
@@ -2570,26 +2774,24 @@ static char qToLower(char c)
The \a format defaults to \c{'g'}. It can be any of the following:
\table
- \header \li Format \li Meaning
- \row \li \c 'e' \li format as [-]9.9e[+|-]999
- \row \li \c 'E' \li format as [-]9.9E[+|-]999
- \row \li \c 'f' \li format as [-]9.9
- \row \li \c 'g' \li use \c 'e' or \c 'f' format, whichever is more concise
- \row \li \c 'G' \li use \c 'E' or \c 'f' format, whichever is more concise
+ \header \li Format \li Meaning \li Meaning of \a precision
+ \row \li \c 'e' \li format as [-]9.9e[+|-]999 \li number of digits \e after the decimal point
+ \row \li \c 'E' \li format as [-]9.9E[+|-]999 \li "
+ \row \li \c 'f' \li format as [-]9.9 \li "
+ \row \li \c 'F' \li same as \c 'f' except for INF and NAN (see below) \li "
+ \row \li \c 'g' \li use \c 'e' or \c 'f' format, whichever is more concise \li maximum number of significant digits (trailing zeroes are omitted)
+ \row \li \c 'G' \li use \c 'E' or \c 'F' format, whichever is more concise \li "
\endtable
- For the \c 'e', \c 'E', and \c 'f' formats, the \a precision represents the
- number of digits \e after the decimal point. For the \c 'g' and \c 'G'
- formats, the \a precision represents the maximum number of significant
- digits (trailing zeroes are omitted). The special \a precision value
- QLocale::FloatingPointShortest selects the shortest representation that,
- when read as a number, gets back the original floating-point value. Aside
- from that, any negative \a precision is ignored in favor of the default, 6.
+ The special \a precision value QLocale::FloatingPointShortest selects the
+ shortest representation that, when read as a number, gets back the original floating-point
+ value. Aside from that, any negative \a precision is ignored in favor of the
+ default, 6.
For the \c 'e', \c 'f' and \c 'g' formats, positive infinity is represented
as "inf", negative infinity as "-inf" and floating-point NaN (not-a-number)
- values are represented as "nan". For the \c 'E' and \c 'G' formats, "INF"
- and "NAN" are used instead. This does not vary with locale.
+ values are represented as "nan". For the \c 'E', \c 'F' and \c 'G' formats,
+ "INF" and "NAN" are used instead. This does not vary with locale.
\sa toDouble(), numberOptions(), exponential(), decimalPoint(), zeroDigit(),
positiveSign(), percent(), toCurrencyString(), formattedDataSize(),
@@ -2599,20 +2801,20 @@ static char qToLower(char c)
QString QLocale::toString(double f, char format, int precision) const
{
QLocaleData::DoubleForm form = QLocaleData::DFDecimal;
- uint flags = qIsUpper(format) ? QLocaleData::CapitalEorX : 0;
+ uint flags = isAsciiUpper(format) ? QLocaleData::CapitalEorX : 0;
- switch (qToLower(format)) {
- case 'f':
- form = QLocaleData::DFDecimal;
- break;
- case 'e':
- form = QLocaleData::DFExponent;
- break;
- case 'g':
- form = QLocaleData::DFSignificantDigits;
- break;
- default:
- break;
+ switch (QtMiscUtils::toAsciiLower(format)) {
+ case 'f':
+ form = QLocaleData::DFDecimal;
+ break;
+ case 'e':
+ form = QLocaleData::DFExponent;
+ break;
+ case 'g':
+ form = QLocaleData::DFSignificantDigits;
+ break;
+ default:
+ break;
}
if (!(d->m_numberOptions & OmitGroupSeparator))
@@ -2659,8 +2861,19 @@ QString QLocale::toString(double f, char format, int precision) const
QLocale QLocale::system()
{
- QT_PREPEND_NAMESPACE(systemData)(); // Ensure system data is up to date.
- static QLocalePrivate locale(systemData(), defaultIndex(), DefaultNumberOptions, 1);
+ constexpr auto sysData = []() {
+ // Same return as systemData(), but leave the setup to the actual call to it.
+#ifdef QT_NO_SYSTEMLOCALE
+ return locale_data;
+#else
+ return &systemLocaleData;
+#endif
+ };
+ Q_CONSTINIT static QLocalePrivate locale(sysData(), -1, DefaultNumberOptions, 1);
+ // Calling systemData() ensures system data is up to date; we also need it
+ // to ensure that locale's index stays up to date:
+ systemData(&locale.m_index);
+ Q_ASSERT(locale.m_index >= 0 && locale.m_index < locale_data_size);
return QLocale(locale);
}
@@ -2677,15 +2890,14 @@ QLocale QLocale::system()
QList<QLocale> locales = QLocale::matchingLocales(QLocale::AnyLanguage, QLocale::AnyScript,
QLocale::Russia);
*/
-QList<QLocale> QLocale::matchingLocales(QLocale::Language language, QLocale::Script script,
- QLocale::Territory territory)
+QList<QLocale> QLocale::matchingLocales(Language language, Script script, Territory territory)
{
const QLocaleId filter { language, script, territory };
if (!filter.isValid())
return QList<QLocale>();
- if (language == QLocale::C)
- return QList<QLocale>() << QLocale(QLocale::C);
+ if (language == C)
+ return QList<QLocale>{QLocale(C)};
QList<QLocale> result;
if (filter.matchesAll())
@@ -2702,6 +2914,15 @@ QList<QLocale> QLocale::matchingLocales(QLocale::Language language, QLocale::Scr
++index;
}
+ // Add current system locale, if it matches
+ const auto syslocaledata = systemData();
+
+ if (filter.acceptLanguage(syslocaledata->m_language_id)) {
+ const QLocaleId id = syslocaledata->id();
+ if (filter.acceptScriptTerritory(id))
+ result.append(system());
+ }
+
return result;
}
@@ -2719,7 +2940,7 @@ QList<QLocale> QLocale::matchingLocales(QLocale::Language language, QLocale::Scr
QList<QLocale::Country> QLocale::countriesForLanguage(Language language)
{
const auto locales = matchingLocales(language, AnyScript, AnyCountry);
- QList<QLocale::Country> result;
+ QList<Country> result;
result.reserve(locales.size());
for (const auto &locale : locales)
result.append(locale.territory());
@@ -2797,6 +3018,14 @@ QString QLocale::standaloneDayName(int day, FormatType type) const
// Calendar look-up of month and day names:
+// Only used in assertions
+[[maybe_unused]] static bool sameLocale(const QLocaleData *locale, const QCalendarLocale &calendar)
+{
+ return locale->m_language_id == calendar.m_language_id
+ && locale->m_script_id == calendar.m_script_id
+ && locale->m_territory_id == calendar.m_territory_id;
+}
+
/*!
\internal
*/
@@ -2905,12 +3134,13 @@ QString QCalendarBackend::monthName(const QLocale &locale, int month, int,
QLocale::FormatType format) const
{
Q_ASSERT(month >= 1 && month <= maximumMonthsInYear());
- return rawMonthName(localeMonthIndexData()[locale.d->m_index],
- localeMonthData(), month, format);
+ const QCalendarLocale &monthly = localeMonthIndexData()[locale.d->m_index];
+ Q_ASSERT(sameLocale(locale.d->m_data, monthly));
+ return rawMonthName(monthly, localeMonthData(), month, format);
}
-QString QGregorianCalendar::monthName(const QLocale &locale, int month, int year,
- QLocale::FormatType format) const
+QString QRomanCalendar::monthName(const QLocale &locale, int month, int year,
+ QLocale::FormatType format) const
{
#ifndef QT_NO_SYSTEMLOCALE
if (locale.d->m_data == &systemLocaleData) {
@@ -2940,12 +3170,13 @@ QString QCalendarBackend::standaloneMonthName(const QLocale &locale, int month,
QLocale::FormatType format) const
{
Q_ASSERT(month >= 1 && month <= maximumMonthsInYear());
- return rawStandaloneMonthName(localeMonthIndexData()[locale.d->m_index],
- localeMonthData(), month, format);
+ const QCalendarLocale &monthly = localeMonthIndexData()[locale.d->m_index];
+ Q_ASSERT(sameLocale(locale.d->m_data, monthly));
+ return rawStandaloneMonthName(monthly, localeMonthData(), month, format);
}
-QString QGregorianCalendar::standaloneMonthName(const QLocale &locale, int month, int year,
- QLocale::FormatType format) const
+QString QRomanCalendar::standaloneMonthName(const QLocale &locale, int month, int year,
+ QLocale::FormatType format) const
{
#ifndef QT_NO_SYSTEMLOCALE
if (locale.d->m_data == &systemLocaleData) {
@@ -3052,10 +3283,10 @@ Qt::DayOfWeek QLocale::firstDayOfWeek() const
QLocale::MeasurementSystem QLocalePrivate::measurementSystem() const
{
- for (int i = 0; i < ImperialMeasurementSystemsCount; ++i) {
- if (ImperialMeasurementSystems[i].languageId == m_data->m_language_id
- && ImperialMeasurementSystems[i].territoryId == m_data->m_territory_id) {
- return ImperialMeasurementSystems[i].system;
+ for (const auto &system : ImperialMeasurementSystems) {
+ if (system.languageId == m_data->m_language_id
+ && system.territoryId == m_data->m_territory_id) {
+ return system.system;
}
}
return QLocale::MetricSystem;
@@ -3113,34 +3344,34 @@ QLocale::MeasurementSystem QLocale::measurementSystem() const
Qt::LayoutDirection QLocale::textDirection() const
{
switch (script()) {
- case QLocale::AdlamScript:
- case QLocale::ArabicScript:
- case QLocale::AvestanScript:
- case QLocale::CypriotScript:
- case QLocale::HatranScript:
- case QLocale::HebrewScript:
- case QLocale::ImperialAramaicScript:
- case QLocale::InscriptionalPahlaviScript:
- case QLocale::InscriptionalParthianScript:
- case QLocale::KharoshthiScript:
- case QLocale::LydianScript:
- case QLocale::MandaeanScript:
- case QLocale::ManichaeanScript:
- case QLocale::MendeKikakuiScript:
- case QLocale::MeroiticCursiveScript:
- case QLocale::MeroiticScript:
- case QLocale::NabataeanScript:
- case QLocale::NkoScript:
- case QLocale::OldHungarianScript:
- case QLocale::OldNorthArabianScript:
- case QLocale::OldSouthArabianScript:
- case QLocale::OrkhonScript:
- case QLocale::PalmyreneScript:
- case QLocale::PhoenicianScript:
- case QLocale::PsalterPahlaviScript:
- case QLocale::SamaritanScript:
- case QLocale::SyriacScript:
- case QLocale::ThaanaScript:
+ case AdlamScript:
+ case ArabicScript:
+ case AvestanScript:
+ case CypriotScript:
+ case HatranScript:
+ case HebrewScript:
+ case ImperialAramaicScript:
+ case InscriptionalPahlaviScript:
+ case InscriptionalParthianScript:
+ case KharoshthiScript:
+ case LydianScript:
+ case MandaeanScript:
+ case ManichaeanScript:
+ case MendeKikakuiScript:
+ case MeroiticCursiveScript:
+ case MeroiticScript:
+ case NabataeanScript:
+ case NkoScript:
+ case OldHungarianScript:
+ case OldNorthArabianScript:
+ case OldSouthArabianScript:
+ case OrkhonScript:
+ case PalmyreneScript:
+ case PhoenicianScript:
+ case PsalterPahlaviScript:
+ case SamaritanScript:
+ case SyriacScript:
+ case ThaanaScript:
return Qt::RightToLeft;
default:
break;
@@ -3273,7 +3504,19 @@ QString QCalendarBackend::dateTimeToString(QStringView format, const QDateTime &
day = parts.day;
}
- int i = 0;
+ auto appendToResult = [&](int t, int repeat) {
+ auto data = locale.d->m_data;
+ if (repeat > 1)
+ result.append(data->longLongToString(t, -1, 10, repeat, QLocaleData::ZeroPadded));
+ else
+ result.append(data->longLongToString(t));
+ };
+
+ auto formatType = [](int repeat) {
+ return repeat == 3 ? QLocale::ShortFormat : QLocale::LongFormat;
+ };
+
+ qsizetype i = 0;
while (i < format.size()) {
if (format.at(i).unicode() == '\'') {
result.append(qt_readEscapedFormatString(format, &i));
@@ -3281,7 +3524,9 @@ QString QCalendarBackend::dateTimeToString(QStringView format, const QDateTime &
}
const QChar c = format.at(i);
- int repeat = qt_repeatCount(format.mid(i));
+ qsizetype rep = qt_repeatCount(format.mid(i));
+ Q_ASSERT(rep < std::numeric_limits<int>::max());
+ int repeat = int(rep);
bool used = false;
if (formatDate) {
switch (c.unicode()) {
@@ -3293,15 +3538,11 @@ QString QCalendarBackend::dateTimeToString(QStringView format, const QDateTime &
repeat = 2;
switch (repeat) {
- case 4: {
- const int len = (year < 0) ? 5 : 4;
- result.append(locale.d->m_data->longLongToString(year, -1, 10, len,
- QLocaleData::ZeroPadded));
+ case 4:
+ appendToResult(year, (year < 0) ? 5 : 4);
break;
- }
case 2:
- result.append(locale.d->m_data->longLongToString(year % 100, -1, 10, 2,
- QLocaleData::ZeroPadded));
+ appendToResult(year % 100, 2);
break;
default:
repeat = 1;
@@ -3313,43 +3554,20 @@ QString QCalendarBackend::dateTimeToString(QStringView format, const QDateTime &
case 'M':
used = true;
repeat = qMin(repeat, 4);
- switch (repeat) {
- case 1:
- result.append(locale.d->m_data->longLongToString(month));
- break;
- case 2:
- result.append(locale.d->m_data->longLongToString(month, -1, 10, 2,
- QLocaleData::ZeroPadded));
- break;
- case 3:
- result.append(monthName(locale, month, year, QLocale::ShortFormat));
- break;
- case 4:
- result.append(monthName(locale, month, year, QLocale::LongFormat));
- break;
- }
+ if (repeat <= 2)
+ appendToResult(month, repeat);
+ else
+ result.append(monthName(locale, month, year, formatType(repeat)));
break;
case 'd':
used = true;
repeat = qMin(repeat, 4);
- switch (repeat) {
- case 1:
- result.append(locale.d->m_data->longLongToString(day));
- break;
- case 2:
- result.append(locale.d->m_data->longLongToString(day, -1, 10, 2,
- QLocaleData::ZeroPadded));
- break;
- case 3:
- result.append(locale.dayName(
- dayOfWeek(date.toJulianDay()), QLocale::ShortFormat));
- break;
- case 4:
- result.append(locale.dayName(
- dayOfWeek(date.toJulianDay()), QLocale::LongFormat));
- break;
- }
+ if (repeat <= 2)
+ appendToResult(day, repeat);
+ else
+ result.append(
+ locale.dayName(dayOfWeek(date.toJulianDay()), formatType(repeat)));
break;
default:
@@ -3368,58 +3586,25 @@ QString QCalendarBackend::dateTimeToString(QStringView format, const QDateTime &
else if (hour == 0)
hour = 12;
}
-
- switch (repeat) {
- case 1:
- result.append(locale.d->m_data->longLongToString(hour));
- break;
- case 2:
- result.append(locale.d->m_data->longLongToString(hour, -1, 10, 2,
- QLocaleData::ZeroPadded));
- break;
- }
+ appendToResult(hour, repeat);
break;
}
case 'H':
used = true;
repeat = qMin(repeat, 2);
- switch (repeat) {
- case 1:
- result.append(locale.d->m_data->longLongToString(time.hour()));
- break;
- case 2:
- result.append(locale.d->m_data->longLongToString(time.hour(), -1, 10, 2,
- QLocaleData::ZeroPadded));
- break;
- }
+ appendToResult(time.hour(), repeat);
break;
case 'm':
used = true;
repeat = qMin(repeat, 2);
- switch (repeat) {
- case 1:
- result.append(locale.d->m_data->longLongToString(time.minute()));
- break;
- case 2:
- result.append(locale.d->m_data->longLongToString(time.minute(), -1, 10, 2,
- QLocaleData::ZeroPadded));
- break;
- }
+ appendToResult(time.minute(), repeat);
break;
case 's':
used = true;
repeat = qMin(repeat, 2);
- switch (repeat) {
- case 1:
- result.append(locale.d->m_data->longLongToString(time.second()));
- break;
- case 2:
- result.append(locale.d->m_data->longLongToString(time.second(), -1, 10, 2,
- QLocaleData::ZeroPadded));
- break;
- }
+ appendToResult(time.second(), repeat);
break;
case 'A':
@@ -3427,7 +3612,7 @@ QString QCalendarBackend::dateTimeToString(QStringView format, const QDateTime &
QString text = time.hour() < 12 ? locale.amText() : locale.pmText();
used = true;
repeat = 1;
- if (format.mid(i + 1).startsWith(QLatin1Char('p'), Qt::CaseInsensitive))
+ if (format.mid(i + 1).startsWith(u'p', Qt::CaseInsensitive))
++repeat;
if (c.unicode() == 'A' && (repeat == 1 || format.at(i + 1).unicode() == 'P'))
text = std::move(text).toUpper();
@@ -3440,13 +3625,12 @@ QString QCalendarBackend::dateTimeToString(QStringView format, const QDateTime &
case 'z':
used = true;
- repeat = (repeat >= 3) ? 3 : 1;
+ repeat = qMin(repeat, 3);
// note: the millisecond component is treated like the decimal part of the seconds
// so ms == 2 is always printed as "002", but ms == 200 can be either "2" or "200"
- result.append(locale.d->m_data->longLongToString(time.msec(), -1, 10, 3,
- QLocaleData::ZeroPadded));
- if (repeat == 1) {
+ appendToResult(time.msec(), 3);
+ if (repeat != 3) {
if (result.endsWith(locale.zeroDigit()))
result.chop(1);
if (result.endsWith(locale.zeroDigit()))
@@ -3454,20 +3638,63 @@ QString QCalendarBackend::dateTimeToString(QStringView format, const QDateTime &
}
break;
- case 't':
+ case 't': {
+ enum AbbrType { Long, Offset, Short };
+ const auto tzAbbr = [locale](const QDateTime &when, AbbrType type) {
+#if QT_CONFIG(timezone)
+ if (type != Short || locale != QLocale::system()) {
+ QTimeZone::NameType mode =
+ type == Short ? QTimeZone::ShortName
+ : type == Long ? QTimeZone::LongName : QTimeZone::OffsetName;
+ return when.timeRepresentation().displayName(when, mode, locale);
+ } // else: prefer QDateTime's abbreviation, for backwards-compatibility.
+#endif // else, make do with non-localized abbreviation:
+ if (type != Offset)
+ return when.timeZoneAbbreviation();
+ // For Offset, we can coerce to a UTC-based zone's abbreviation:
+ return when.toOffsetFromUtc(when.offsetFromUtc()).timeZoneAbbreviation();
+ };
used = true;
- repeat = 1;
- // If we have a QDateTime use the time spec otherwise use the current system tzname
- result.append(formatDate ? datetime.timeZoneAbbreviation()
- : QDateTime::currentDateTime().timeZoneAbbreviation());
+ repeat = qMin(repeat, 4);
+ // If we don't have a date-time, use the current system time:
+ const QDateTime when = formatDate ? datetime : QDateTime::currentDateTime();
+ QString text;
+ switch (repeat) {
+ case 4:
+ text = tzAbbr(when, Long);
+ break;
+ case 3: // ±hh:mm
+ case 2: // ±hhmm (we'll remove the ':' at the end)
+ text = tzAbbr(when, Offset);
+ Q_ASSERT(text.startsWith("UTC"_L1)); // Need to strip this.
+ // The Qt::UTC case omits the zero offset:
+ text = (text.size() == 3
+ ? u"+00:00"_s
+ : (text.size() <= 6
+ // Whole-hour offsets may lack the zero minutes:
+ ? QStringView{text}.sliced(3) + ":00"_L1
+ : std::move(text).sliced(3)));
+ if (repeat == 2)
+ text = text.remove(u':');
+ break;
+ default:
+ text = tzAbbr(when, Short);
+ // UTC-offset zones only include minutes if non-zero.
+ if (text.startsWith("UTC"_L1) && text.size() == 6)
+ text += ":00"_L1;
+ break;
+ }
+ if (!text.isEmpty())
+ result.append(text);
break;
+ }
default:
break;
}
}
if (!used)
- result.append(QString(repeat, c));
+ result.resize(result.size() + repeat, c);
i += repeat;
}
@@ -3490,10 +3717,10 @@ QString QLocaleData::doubleToString(double d, int precision, DoubleForm form,
width = 0;
int decpt;
- int bufSize = 1;
+ qsizetype bufSize = 1;
if (precision == QLocale::FloatingPointShortest)
bufSize += std::numeric_limits<double>::max_digits10;
- else if (form == DFDecimal && qIsFinite(d))
+ else if (form == DFDecimal && qt_is_finite(d))
bufSize += wholePartSpace(qAbs(d)) + precision;
else // Add extra digit due to different interpretations of precision.
bufSize += qMax(2, precision) + 1; // Must also be big enough for "nan" or "inf"
@@ -3515,15 +3742,14 @@ QString QLocaleData::doubleToString(double d, int precision, DoubleForm form,
if (zero == u"0") {
// No need to convert digits.
- Q_ASSERT(std::all_of(buf.cbegin(), buf.cbegin() + length, [](char ch)
- { return '0' <= ch && ch <= '9'; }));
+ Q_ASSERT(std::all_of(buf.cbegin(), buf.cbegin() + length, isAsciiDigit));
// That check is taken care of in unicodeForDigits, below.
} else if (zero.size() == 2 && zero.at(0).isHighSurrogate()) {
const char32_t zeroUcs4 = QChar::surrogateToUcs4(zero.at(0), zero.at(1));
QString converted;
converted.reserve(2 * digits.size());
- for (int i = 0; i < digits.length(); ++i) {
- const char32_t digit = unicodeForDigit(digits.at(i).unicode() - '0', zeroUcs4);
+ for (QChar ch : std::as_const(digits)) {
+ const char32_t digit = unicodeForDigit(ch.unicode() - '0', zeroUcs4);
Q_ASSERT(QChar::requiresSurrogates(digit));
converted.append(QChar::highSurrogate(digit));
converted.append(QChar::lowSurrogate(digit));
@@ -3534,7 +3760,7 @@ QString QLocaleData::doubleToString(double d, int precision, DoubleForm form,
Q_ASSERT(!zero.at(0).isSurrogate());
char16_t z = zero.at(0).unicode();
char16_t *const value = reinterpret_cast<char16_t *>(digits.data());
- for (int i = 0; i < digits.length(); ++i)
+ for (qsizetype i = 0; i < digits.size(); ++i)
value[i] = unicodeForDigit(value[i] - '0', z);
}
@@ -3542,81 +3768,78 @@ QString QLocaleData::doubleToString(double d, int precision, DoubleForm form,
const bool groupDigits = flags & GroupDigits;
const int minExponentDigits = flags & ZeroPadExponent ? 2 : 1;
switch (form) {
- case DFExponent:
- numStr = exponentForm(std::move(digits), decpt, precision, PMDecimalDigits,
- mustMarkDecimal, minExponentDigits);
- break;
- case DFDecimal:
- numStr = decimalForm(std::move(digits), decpt, precision, PMDecimalDigits,
- mustMarkDecimal, groupDigits);
- break;
- case DFSignificantDigits: {
- PrecisionMode mode = (flags & AddTrailingZeroes) ?
- PMSignificantDigits : PMChopTrailingZeros;
-
- /* POSIX specifies sprintf() to follow fprintf(), whose 'g/G'
- format says; with P = 6 if precision unspecified else 1 if
- precision is 0 else precision; when 'e/E' would have exponent
- X, use:
- * 'f/F' if P > X >= -4, with precision P-1-X
- * 'e/E' otherwise, with precision P-1
- Helpfully, we already have mapped precision < 0 to 6 - except
- for F.P.Shortest mode, which is its own story - and those of
- our callers with unspecified precision either used 6 or -1
- for it.
- */
- bool useDecimal;
- if (precision == QLocale::FloatingPointShortest) {
- // Find out which representation is shorter.
- // Set bias to everything added to exponent form but not
- // decimal, minus the converse.
-
- // Exponent adds separator, sign and digits:
- int bias = 2 + minExponentDigits;
- // Decimal form may get grouping separators inserted:
- if (groupDigits && decpt >= m_grouping_top + m_grouping_least)
- bias -= (decpt - m_grouping_top - m_grouping_least) / m_grouping_higher + 1;
- // X = decpt - 1 needs two digits if decpt > 10:
- if (decpt > 10 && minExponentDigits == 1)
- ++bias;
- // Assume digitCount < 95, so we can ignore the 3-digit
- // exponent case (we'll set useDecimal false anyway).
-
- const int digitCount = digits.length() / zero.size();
- if (!mustMarkDecimal) {
- // Decimal separator is skipped if at end; adjust if
- // that happens for only one form:
- if (digitCount <= decpt && digitCount > 1)
- ++bias; // decimal but not exponent
- else if (digitCount == 1 && decpt <= 0)
- --bias; // exponent but not decimal
- }
- // When 0 < decpt <= digitCount, the forms have equal digit
- // counts, plus things bias has taken into account;
- // otherwise decimal form's digit count is right-padded with
- // zeros to decpt, when decpt is positive, otherwise it's
- // left-padded with 1 - decpt zeros.
- useDecimal = (decpt <= 0 ? 1 - decpt <= bias
- : decpt <= digitCount ? 0 <= bias
- : decpt <= digitCount + bias);
- } else {
- // X == decpt - 1, POSIX's P; -4 <= X < P iff -4 < decpt <= P
- Q_ASSERT(precision >= 0);
- useDecimal = decpt > -4 && decpt <= (precision ? precision : 1);
+ case DFExponent:
+ numStr = exponentForm(std::move(digits), decpt, precision, PMDecimalDigits,
+ mustMarkDecimal, minExponentDigits);
+ break;
+ case DFDecimal:
+ numStr = decimalForm(std::move(digits), decpt, precision, PMDecimalDigits,
+ mustMarkDecimal, groupDigits);
+ break;
+ case DFSignificantDigits: {
+ PrecisionMode mode
+ = (flags & AddTrailingZeroes) ? PMSignificantDigits : PMChopTrailingZeros;
+
+ /* POSIX specifies sprintf() to follow fprintf(), whose 'g/G' format
+ says; with P = 6 if precision unspecified else 1 if precision is
+ 0 else precision; when 'e/E' would have exponent X, use:
+ * 'f/F' if P > X >= -4, with precision P-1-X
+ * 'e/E' otherwise, with precision P-1
+ Helpfully, we already have mapped precision < 0 to 6 - except for
+ F.P.Shortest mode, which is its own story - and those of our
+ callers with unspecified precision either used 6 or -1 for it.
+ */
+ bool useDecimal;
+ if (precision == QLocale::FloatingPointShortest) {
+ // Find out which representation is shorter.
+ // Set bias to everything added to exponent form but not
+ // decimal, minus the converse.
+
+ // Exponent adds separator, sign and digits:
+ int bias = 2 + minExponentDigits;
+ // Decimal form may get grouping separators inserted:
+ if (groupDigits && decpt >= m_grouping_top + m_grouping_least)
+ bias -= (decpt - m_grouping_least) / m_grouping_higher + 1;
+ // X = decpt - 1 needs two digits if decpt > 10:
+ if (decpt > 10 && minExponentDigits == 1)
+ ++bias;
+ // Assume digitCount < 95, so we can ignore the 3-digit
+ // exponent case (we'll set useDecimal false anyway).
+
+ const qsizetype digitCount = digits.size() / zero.size();
+ if (!mustMarkDecimal) {
+ // Decimal separator is skipped if at end; adjust if
+ // that happens for only one form:
+ if (digitCount <= decpt && digitCount > 1)
+ ++bias; // decimal but not exponent
+ else if (digitCount == 1 && decpt <= 0)
+ --bias; // exponent but not decimal
}
-
- numStr = useDecimal
- ? decimalForm(std::move(digits), decpt, precision, mode,
- mustMarkDecimal, groupDigits)
- : exponentForm(std::move(digits), decpt, precision, mode,
- mustMarkDecimal, minExponentDigits);
- break;
+ // When 0 < decpt <= digitCount, the forms have equal digit
+ // counts, plus things bias has taken into account; otherwise
+ // decimal form's digit count is right-padded with zeros to
+ // decpt, when decpt is positive, otherwise it's left-padded
+ // with 1 - decpt zeros.
+ useDecimal = (decpt <= 0 ? 1 - decpt <= bias
+ : decpt <= digitCount ? 0 <= bias : decpt <= digitCount + bias);
+ } else {
+ // X == decpt - 1, POSIX's P; -4 <= X < P iff -4 < decpt <= P
+ Q_ASSERT(precision >= 0);
+ useDecimal = decpt > -4 && decpt <= (precision ? precision : 1);
}
+
+ numStr = useDecimal
+ ? decimalForm(std::move(digits), decpt, precision, mode,
+ mustMarkDecimal, groupDigits)
+ : exponentForm(std::move(digits), decpt, precision, mode,
+ mustMarkDecimal, minExponentDigits);
+ break;
+ }
}
// Pad with zeros. LeftAdjusted overrides ZeroPadded.
if (flags & ZeroPadded && !(flags & LeftAdjusted)) {
- for (int i = numStr.length() / zero.length() + prefix.size(); i < width; ++i)
+ for (qsizetype i = numStr.size() / zero.size() + prefix.size(); i < width; ++i)
numStr.prepend(zero);
}
}
@@ -3639,33 +3862,33 @@ QString QLocaleData::decimalForm(QString &&digits, int decpt, int precision,
for (; decpt < 0; ++decpt)
digits.prepend(zero);
} else {
- for (int i = digits.length() / digitWidth; i < decpt; ++i)
+ for (qsizetype i = digits.size() / digitWidth; i < decpt; ++i)
digits.append(zero);
}
switch (pm) {
case PMDecimalDigits:
- for (int i = digits.length() / digitWidth - decpt; i < precision; ++i)
+ for (qsizetype i = digits.size() / digitWidth - decpt; i < precision; ++i)
digits.append(zero);
break;
case PMSignificantDigits:
- for (int i = digits.length() / digitWidth; i < precision; ++i)
+ for (qsizetype i = digits.size() / digitWidth; i < precision; ++i)
digits.append(zero);
break;
case PMChopTrailingZeros:
- Q_ASSERT(digits.length() / digitWidth <= qMax(decpt, 1) || !digits.endsWith(zero));
+ Q_ASSERT(digits.size() / digitWidth <= qMax(decpt, 1) || !digits.endsWith(zero));
break;
}
- if (mustMarkDecimal || decpt < digits.length() / digitWidth)
+ if (mustMarkDecimal || decpt < digits.size() / digitWidth)
digits.insert(decpt * digitWidth, decimalPoint());
if (groupDigits) {
const QString group = groupSeparator();
- int i = decpt - m_grouping_least;
+ qsizetype i = decpt - m_grouping_least;
if (i >= m_grouping_top) {
digits.insert(i * digitWidth, group);
- while ((i -= m_grouping_higher) >= m_grouping_top)
+ while ((i -= m_grouping_higher) > 0)
digits.insert(i * digitWidth, group);
}
}
@@ -3687,19 +3910,19 @@ QString QLocaleData::exponentForm(QString &&digits, int decpt, int precision,
switch (pm) {
case PMDecimalDigits:
- for (int i = digits.length() / digitWidth; i < precision + 1; ++i)
+ for (qsizetype i = digits.size() / digitWidth; i < precision + 1; ++i)
digits.append(zero);
break;
case PMSignificantDigits:
- for (int i = digits.length() / digitWidth; i < precision; ++i)
+ for (qsizetype i = digits.size() / digitWidth; i < precision; ++i)
digits.append(zero);
break;
case PMChopTrailingZeros:
- Q_ASSERT(digits.length() / digitWidth <= 1 || !digits.endsWith(zero));
+ Q_ASSERT(digits.size() / digitWidth <= 1 || !digits.endsWith(zero));
break;
}
- if (mustMarkDecimal || digits.length() > digitWidth)
+ if (mustMarkDecimal || digits.size() > digitWidth)
digits.insert(digitWidth, decimalPoint());
digits.append(exponentSeparator());
@@ -3748,7 +3971,7 @@ QString QLocaleData::applyIntegerFormatting(QString &&numStr, bool negative, int
{
const QString zero = base == 10 ? zeroDigit() : QStringLiteral("0");
const auto digitWidth = zero.size();
- const auto digitCount = numStr.length() / digitWidth;
+ const auto digitCount = numStr.size() / digitWidth;
const auto basePrefix = [&] () -> QStringView {
if (flags & ShowBase) {
@@ -3765,15 +3988,15 @@ QString QLocaleData::applyIntegerFormatting(QString &&numStr, bool negative, int
const QString prefix = signPrefix(negative, flags) + basePrefix;
// Count how much of width we've used up. Each digit counts as one
- int usedWidth = digitCount + prefix.size();
+ qsizetype usedWidth = digitCount + prefix.size();
if (base == 10 && flags & GroupDigits) {
const QString group = groupSeparator();
- int i = digitCount - m_grouping_least;
+ qsizetype i = digitCount - m_grouping_least;
if (i >= m_grouping_top) {
numStr.insert(i * digitWidth, group);
++usedWidth;
- while ((i -= m_grouping_higher) >= m_grouping_top) {
+ while ((i -= m_grouping_higher) > 0) {
numStr.insert(i * digitWidth, group);
++usedWidth;
}
@@ -3785,7 +4008,7 @@ QString QLocaleData::applyIntegerFormatting(QString &&numStr, bool negative, int
if (noPrecision)
precision = 1;
- for (int i = numStr.length(); i < precision; ++i) {
+ for (qsizetype i = numStr.size(); i < precision; ++i) {
numStr.prepend(zero);
usedWidth++;
}
@@ -3793,7 +4016,7 @@ QString QLocaleData::applyIntegerFormatting(QString &&numStr, bool negative, int
// LeftAdjusted overrides ZeroPadded; and sprintf() only pads when
// precision is not specified in the format string.
if (noPrecision && flags & ZeroPadded && !(flags & LeftAdjusted)) {
- for (int i = usedWidth; i < width; ++i)
+ for (qsizetype i = usedWidth; i < width; ++i)
numStr.prepend(zero);
}
@@ -3803,50 +4026,259 @@ QString QLocaleData::applyIntegerFormatting(QString &&numStr, bool negative, int
return result;
}
+inline QLocaleData::NumericData QLocaleData::numericData(QLocaleData::NumberMode mode) const
+{
+ NumericData result;
+ if (this == c()) {
+ result.isC = true;
+ return result;
+ }
+ result.setZero(zero().viewData(single_character_data));
+ result.group = groupDelim().viewData(single_character_data);
+ // Note: minus, plus and exponent might not actually be single characters.
+ result.minus = minus().viewData(single_character_data);
+ result.plus = plus().viewData(single_character_data);
+ if (mode != IntegerMode)
+ result.decimal = decimalSeparator().viewData(single_character_data);
+ if (mode == DoubleScientificMode) {
+ result.exponent = exponential().viewData(single_character_data);
+ // exponentCyrillic means "apply the Cyrrilic-specific exponent hack"
+ result.exponentCyrillic = m_script_id == QLocale::CyrillicScript;
+ }
+#ifndef QT_NO_SYSTEMLOCALE
+ if (this == &systemLocaleData) {
+ const auto getString = [sys = systemLocale()](QSystemLocale::QueryType query) {
+ return sys->query(query).toString();
+ };
+ if (mode != IntegerMode) {
+ result.sysDecimal = getString(QSystemLocale::DecimalPoint);
+ if (result.sysDecimal.size())
+ result.decimal = QStringView{result.sysDecimal};
+ }
+ result.sysGroup = getString(QSystemLocale::GroupSeparator);
+ if (result.sysGroup.size())
+ result.group = QStringView{result.sysGroup};
+ result.sysMinus = getString(QSystemLocale::NegativeSign);
+ if (result.sysMinus.size())
+ result.minus = QStringView{result.sysMinus};
+ result.sysPlus = getString(QSystemLocale::PositiveSign);
+ if (result.sysPlus.size())
+ result.plus = QStringView{result.sysPlus};
+ result.setZero(getString(QSystemLocale::ZeroDigit));
+ }
+#endif
+
+ return result;
+}
+
+namespace {
+// A bit like QStringIterator but rather specialized ... and some of the tokens
+// it recognizes aren't single Unicode code-points (but it does map each to a
+// single character).
+class NumericTokenizer
+{
+ // TODO: use deterministic finite-state-automata.
+ // TODO QTBUG-95460: CLDR has Inf/NaN representations per locale.
+ static constexpr char lettersInfNaN[] = "afin"; // Letters of Inf, NaN
+ static constexpr auto matchInfNaN = QtPrivate::makeCharacterSetMatch<lettersInfNaN>();
+ const QStringView m_text;
+ const QLocaleData::NumericData m_guide;
+ qsizetype m_index = 0;
+ const QLocaleData::NumberMode m_mode;
+ static_assert('+' + 1 == ',' && ',' + 1 == '-' && '-' + 1 == '.');
+ char lastMark; // C locale accepts '+' through lastMark.
+public:
+ NumericTokenizer(QStringView text, QLocaleData::NumericData &&guide,
+ QLocaleData::NumberMode mode)
+ : m_text(text), m_guide(guide), m_mode(mode),
+ lastMark(mode == QLocaleData::IntegerMode ? '-' : '.')
+ {
+ Q_ASSERT(m_guide.isValid(mode));
+ }
+ bool done() const { return !(m_index < m_text.size()); }
+ qsizetype index() const { return m_index; }
+ inline int asBmpDigit(char16_t digit) const;
+ char nextToken();
+};
+
+int NumericTokenizer::asBmpDigit(char16_t digit) const
+{
+ // If digit *is* a digit, result will be in range 0 through 9; otherwise not.
+ // Must match qlocale_tools.h's unicodeForDigit()
+ if (m_guide.zeroUcs != u'\u3007' || digit == m_guide.zeroUcs)
+ return digit - m_guide.zeroUcs;
+
+ // QTBUG-85409: Suzhou's digits aren't contiguous !
+ if (digit == u'\u3020') // U+3020 POSTAL MARK FACE is not a digit.
+ return -1;
+ // ... but is followed by digits 1 through 9.
+ return digit - u'\u3020';
+}
+
+char NumericTokenizer::nextToken()
+{
+ // As long as caller stops iterating on a zero return, those don't need to
+ // keep m_index correctly updated.
+ Q_ASSERT(!done());
+ // Mauls non-letters above 'Z' but we don't care:
+ const auto asciiLower = [](unsigned char c) { return c >= 'A' ? c | 0x20 : c; };
+ const QStringView tail = m_text.sliced(m_index);
+ const QChar ch = tail.front();
+ if (ch == u'\u2212') {
+ // Special case: match the "proper" minus sign, for all locales.
+ ++m_index;
+ return '-';
+ }
+ if (m_guide.isC) {
+ // "Conversion" to C locale is just a filter:
+ ++m_index;
+ if (Q_LIKELY(ch.unicode() < 256)) {
+ unsigned char ascii = asciiLower(ch.toLatin1());
+ if (Q_LIKELY(isAsciiDigit(ascii) || ('+' <= ascii && ascii <= lastMark)
+ // No caller presently (6.5) passes DoubleStandardMode,
+ // so !IntegerMode implies scientific, for now.
+ || (m_mode != QLocaleData::IntegerMode
+ && matchInfNaN.matches(ascii))
+ || (m_mode == QLocaleData::DoubleScientificMode
+ && ascii == 'e'))) {
+ return ascii;
+ }
+ }
+ return 0;
+ }
+ if (ch.unicode() < 256) {
+ // Accept the C locale's digits and signs in all locales:
+ char ascii = asciiLower(ch.toLatin1());
+ if (isAsciiDigit(ascii) || ascii == '-' || ascii == '+'
+ // Also its Inf and NaN letters:
+ || (m_mode != QLocaleData::IntegerMode && matchInfNaN.matches(ascii))) {
+ ++m_index;
+ return ascii;
+ }
+ }
+
+ // Other locales may be trickier:
+ if (tail.startsWith(m_guide.minus)) {
+ m_index += m_guide.minus.size();
+ return '-';
+ }
+ if (tail.startsWith(m_guide.plus)) {
+ m_index += m_guide.plus.size();
+ return '+';
+ }
+ if (!m_guide.group.isEmpty() && tail.startsWith(m_guide.group)) {
+ m_index += m_guide.group.size();
+ return ',';
+ }
+ if (m_mode != QLocaleData::IntegerMode && tail.startsWith(m_guide.decimal)) {
+ m_index += m_guide.decimal.size();
+ return '.';
+ }
+ if (m_mode == QLocaleData::DoubleScientificMode
+ && tail.startsWith(m_guide.exponent, Qt::CaseInsensitive)) {
+ m_index += m_guide.exponent.size();
+ return 'e';
+ }
+
+ // Must match qlocale_tools.h's unicodeForDigit()
+ if (m_guide.zeroLen == 1) {
+ if (!ch.isSurrogate()) {
+ const uint gap = asBmpDigit(ch.unicode());
+ if (gap < 10u) {
+ ++m_index;
+ return '0' + gap;
+ }
+ } else if (ch.isHighSurrogate() && tail.size() > 1 && tail.at(1).isLowSurrogate()) {
+ return 0;
+ }
+ } else if (ch.isHighSurrogate()) {
+ // None of the corner cases below matches a surrogate, so (update
+ // already and) return early if we don't have a digit.
+ if (tail.size() > 1) {
+ QChar low = tail.at(1);
+ if (low.isLowSurrogate()) {
+ m_index += 2;
+ const uint gap = QChar::surrogateToUcs4(ch, low) - m_guide.zeroUcs;
+ return gap < 10u ? '0' + gap : 0;
+ }
+ }
+ return 0;
+ }
+
+ // All cases where tail starts with properly-matched surrogate pair
+ // have been handled by this point.
+ Q_ASSERT(!(ch.isHighSurrogate() && tail.size() > 1 && tail.at(1).isLowSurrogate()));
+
+ // Weird corner cases follow (code above assumes these match no surrogates).
+
+ // Some locales use a non-breaking space (U+00A0) or its thin version
+ // (U+202f) for grouping. These look like spaces, so people (and thus some
+ // of our tests) use a regular space instead and complain if it doesn't
+ // work.
+ // Should this be extended generally to any case where group is a space ?
+ if ((m_guide.group == u"\u00a0" || m_guide.group == u"\u202f") && tail.startsWith(u' ')) {
+ ++m_index;
+ return ',';
+ }
+
+ // Cyrillic has its own E, used by Ukrainian as exponent; but others
+ // writing Cyrillic may well use that; and Ukrainians might well use E.
+ // All other Cyrillic locales (officially) use plain ASCII E.
+ if (m_guide.exponentCyrillic // Only true in scientific float mode.
+ && (tail.startsWith(u"\u0415", Qt::CaseInsensitive)
+ || tail.startsWith(u"E", Qt::CaseInsensitive))) {
+ ++m_index;
+ return 'e';
+ }
+
+ return 0;
+}
+} // namespace with no name
+
/*
- Converts a number in locale to its representation in the C locale.
- Only has to guarantee that a string that is a correct representation of
- a number will be converted. If junk is passed in, junk will be passed
- out and the error will be detected during the actual conversion to a
- number. We can't detect junk here, since we don't even know the base
- of the number.
+ Converts a number in locale representation to the C locale equivalent.
+
+ Only has to guarantee that a string that is a correct representation of a
+ number will be converted. Checks signs, separators and digits appear in all
+ the places they should, and nowhere else.
+
+ Returns true precisely if the number appears to be well-formed, modulo
+ things a parser for C Locale strings (without digit-grouping separators;
+ they're stripped) will catch. When it returns true, it records (and
+ '\0'-terminates) the C locale representation in *result.
+
+ Note: only QString integer-parsing methods have a base parameter (hence need
+ to cope with letters as possible digits); but these are now all routed via
+ byteArrayToU?LongLong(), so no longer come via here. The QLocale
+ number-parsers only work in decimal, so don't have to cope with any digits
+ other than 0 through 9.
*/
bool QLocaleData::numberToCLocale(QStringView s, QLocale::NumberOptions number_options,
- CharBuff *result) const
+ NumberMode mode, CharBuff *result) const
{
s = s.trimmed();
if (s.size() < 1)
return false;
+ NumericTokenizer tokens(s, numericData(mode), mode);
+
+ // Digit-grouping details (all modes):
+ qsizetype digitsInGroup = 0;
+ qsizetype last_separator_idx = -1;
+ qsizetype start_of_digits_idx = -1;
+
+ // Floating-point details (non-integer modes):
+ qsizetype decpt_idx = -1;
+ qsizetype exponent_idx = -1;
+
+ char last = '\0';
+ while (!tokens.done()) {
+ qsizetype idx = tokens.index(); // before nextToken() advances
+ char out = tokens.nextToken();
+ if (out == 0)
+ return false;
+ Q_ASSERT(tokens.index() > idx); // it always *should* advance (except on zero return)
- const QChar *uc = s.data();
- auto length = s.size();
- decltype(length) idx = 0;
-
- int digitsInGroup = 0;
- int group_cnt = 0; // counts number of group chars
- int decpt_idx = -1;
- int last_separator_idx = -1;
- int start_of_digits_idx = -1;
- int exponent_idx = -1;
-
- while (idx < length) {
- const QStringView in = QStringView(uc + idx, uc[idx].isHighSurrogate() ? 2 : 1);
-
- char out = numericToCLocale(in);
- if (out == 0) {
- const QChar simple = in.size() == 1 ? in.front() : QChar::Null;
- if (in == listSeparator())
- out = ';';
- else if (in == percentSign())
- out = '%';
- // for handling base-x numbers
- else if (simple.toLatin1() >= 'A' && simple.toLatin1() <= 'Z')
- out = simple.toLower().toLatin1();
- else if (simple.toLatin1() >= 'a' && simple.toLatin1() <= 'z')
- out = simple.toLatin1();
- else
- break;
- } else if (out == '.') {
+ if (out == '.') {
// Fail if more than one decimal point or point after e
if (decpt_idx != -1 || exponent_idx != -1)
return false;
@@ -3855,26 +4287,26 @@ bool QLocaleData::numberToCLocale(QStringView s, QLocale::NumberOptions number_o
exponent_idx = idx;
}
- if (number_options & QLocale::RejectLeadingZeroInExponent) {
- if (exponent_idx != -1 && out == '0' && idx < length - 1) {
- // After the exponent there can only be '+', '-' or digits.
- // If we find a '0' directly after some non-digit, then that is a leading zero.
- if (result->last() < '0' || result->last() > '9')
- return false;
- }
+ if (number_options.testFlag(QLocale::RejectLeadingZeroInExponent)
+ && exponent_idx != -1 && out == '0') {
+ // After the exponent there can only be '+', '-' or digits.
+ // If we find a '0' directly after some non-digit, then that is a
+ // leading zero, acceptable only if it is the whole exponent.
+ if (!tokens.done() && !isAsciiDigit(last))
+ return false;
}
- if (number_options & QLocale::RejectTrailingZeroesAfterDot) {
- // If we've seen a decimal point and the last character after the exponent is 0, then
- // that is a trailing zero.
- if (decpt_idx >= 0 && idx == exponent_idx && result->last() == '0')
- return false;
+ if (number_options.testFlag(QLocale::RejectTrailingZeroesAfterDot) && decpt_idx >= 0) {
+ // In a fractional part, a 0 just before the exponent is trailing:
+ if (idx == exponent_idx && last == '0')
+ return false;
}
- if (!(number_options & QLocale::RejectGroupSeparator)) {
- if (start_of_digits_idx == -1 && out >= '0' && out <= '9') {
- start_of_digits_idx = idx;
- digitsInGroup++;
+ if (!number_options.testFlag(QLocale::RejectGroupSeparator)) {
+ if (isAsciiDigit(out)) {
+ if (start_of_digits_idx == -1)
+ start_of_digits_idx = idx;
+ ++digitsInGroup;
} else if (out == ',') {
// Don't allow group chars after the decimal point or exponent
if (decpt_idx != -1 || exponent_idx != -1)
@@ -3883,7 +4315,7 @@ bool QLocaleData::numberToCLocale(QStringView s, QLocale::NumberOptions number_o
if (last_separator_idx == -1) {
// Check distance from the beginning of the digits:
if (start_of_digits_idx == -1 || m_grouping_top > digitsInGroup
- || digitsInGroup >= m_grouping_higher + m_grouping_top) {
+ || digitsInGroup >= m_grouping_least + m_grouping_top) {
return false;
}
} else {
@@ -3893,67 +4325,58 @@ bool QLocaleData::numberToCLocale(QStringView s, QLocale::NumberOptions number_o
}
last_separator_idx = idx;
- ++group_cnt;
digitsInGroup = 0;
-
- // don't add the group separator
- idx += in.size();
- continue;
- } else if (out == '.' || idx == exponent_idx) {
- // Were there enough digits since the last separator?
- if (last_separator_idx != -1 && digitsInGroup != m_grouping_least)
+ } else if (mode != IntegerMode && (out == '.' || idx == exponent_idx)
+ && last_separator_idx != -1) {
+ // Were there enough digits since the last group separator?
+ if (digitsInGroup != m_grouping_least)
return false;
- // If we saw no separator, should we fail if
- // digitsInGroup > m_grouping_top + m_grouping_least ?
// stop processing separators
last_separator_idx = -1;
- } else if (out >= '0' && out <= '9') {
- digitsInGroup++;
}
+ } else if (out == ',') {
+ return false;
}
- result->append(out);
- idx += in.size();
+ last = out;
+ if (out != ',') // Leave group separators out of the result.
+ result->append(out);
}
- if (!(number_options & QLocale::RejectGroupSeparator)) {
- // group separator post-processing
- // did we end in a separator?
- if (last_separator_idx + 1 == idx)
- return false;
- // Were there enough digits since the last separator?
- if (last_separator_idx != -1 && digitsInGroup != m_grouping_least)
+ if (!number_options.testFlag(QLocale::RejectGroupSeparator) && last_separator_idx != -1) {
+ // Were there enough digits since the last group separator?
+ if (digitsInGroup != m_grouping_least)
return false;
- // If we saw no separator, and no decimal point, should we fail if
- // digitsInGroup > m_grouping_top + m_grouping_least ?
}
- if (number_options & QLocale::RejectTrailingZeroesAfterDot) {
- // In decimal form, the last character can be a trailing zero if we've seen a decpt.
- if (decpt_idx != -1 && exponent_idx == -1 && result->last() == '0')
+ if (number_options.testFlag(QLocale::RejectTrailingZeroesAfterDot)
+ && decpt_idx != -1 && exponent_idx == -1) {
+ // In the fractional part, a final zero is trailing:
+ if (last == '0')
return false;
}
result->append('\0');
- return idx == length;
+ return true;
}
-bool QLocaleData::validateChars(QStringView str, NumberMode numMode, QByteArray *buff,
- int decDigits, QLocale::NumberOptions number_options) const
+ParsingResult
+QLocaleData::validateChars(QStringView str, NumberMode numMode, int decDigits,
+ QLocale::NumberOptions number_options) const
{
- buff->clear();
- buff->reserve(str.length());
+ ParsingResult result;
+ result.buff.reserve(str.size());
enum { Whole, Fractional, Exponent } state = Whole;
const bool scientific = numMode == DoubleScientificMode;
- char last = 0;
+ NumericTokenizer tokens(str, numericData(numMode), numMode);
+ char last = '\0';
- for (qsizetype i = 0; i < str.size();) {
- const QStringView in = str.mid(i, str.at(i).isHighSurrogate() ? 2 : 1);
- char c = numericToCLocale(in);
+ while (!tokens.done()) {
+ char c = tokens.nextToken();
- if (c >= '0' && c <= '9') {
+ if (isAsciiDigit(c)) {
switch (state) {
case Whole:
// Nothing special to do (unless we want to check grouping sizes).
@@ -3961,185 +4384,149 @@ bool QLocaleData::validateChars(QStringView str, NumberMode numMode, QByteArray
case Fractional:
// If a double has too many digits in its fractional part it is Invalid.
if (decDigits-- == 0)
- return false;
+ return {};
break;
case Exponent:
- if (last < '0' || last > '9') {
+ if (!isAsciiDigit(last)) {
// This is the first digit in the exponent (there may have beena '+'
// or '-' in before). If it's a zero, the exponent is zero-padded.
if (c == '0' && (number_options & QLocale::RejectLeadingZeroInExponent))
- return false;
+ return {};
}
break;
}
} else {
switch (c) {
- case '.':
- // If an integer has a decimal point, it is Invalid.
- // A double can only have one, at the end of its whole-number part.
- if (numMode == IntegerMode || state != Whole)
- return false;
- // Even when decDigits is 0, we do allow the decimal point to be
- // present - just as long as no digits follow it.
-
- state = Fractional;
- break;
+ case '.':
+ // If an integer has a decimal point, it is Invalid.
+ // A double can only have one, at the end of its whole-number part.
+ if (numMode == IntegerMode || state != Whole)
+ return {};
+ // Even when decDigits is 0, we do allow the decimal point to be
+ // present - just as long as no digits follow it.
+
+ state = Fractional;
+ break;
- case '+':
- case '-':
- // A sign can only appear at the start or after the e of scientific:
- if (i != 0 && !(scientific && last == 'e'))
- return false;
- break;
+ case '+':
+ case '-':
+ // A sign can only appear at the start or after the e of scientific:
+ if (last != '\0' && !(scientific && last == 'e'))
+ return {};
+ break;
- case ',':
- // Grouping is only allowed after a digit in the whole-number portion:
- if ((number_options & QLocale::RejectGroupSeparator) || state != Whole
- || last < '0' || last > '9') {
- return false;
- }
- // We could check grouping sizes are correct, but fixup()s are
- // probably better off correcting any misplacement instead.
- break;
+ case ',':
+ // Grouping is only allowed after a digit in the whole-number portion:
+ if ((number_options & QLocale::RejectGroupSeparator) || state != Whole
+ || !isAsciiDigit(last)) {
+ return {};
+ }
+ // We could check grouping sizes are correct, but fixup()s are
+ // probably better off correcting any misplacement instead.
+ break;
- case 'e':
- // Only one e is allowed and only in scientific:
- if (!scientific || state == Exponent)
- return false;
- state = Exponent;
- break;
+ case 'e':
+ // Only one e is allowed and only in scientific:
+ if (!scientific || state == Exponent)
+ return {};
+ state = Exponent;
+ break;
- default:
- // Nothing else can validly appear in a number.
- // In fact, numericToCLocale() must have returned 0. If anyone changes
- // it to return something else, we probably need to handle it here !
- Q_ASSERT(!c);
- return false;
+ default:
+ // Nothing else can validly appear in a number.
+ // NumericTokenizer allows letters of "inf" and "nan", but
+ // validators don't accept those values.
+ // For anything else, tokens.nextToken() must have returned 0.
+ Q_ASSERT(!c || c == 'a' || c == 'f' || c == 'i' || c == 'n');
+ return {};
}
}
last = c;
if (c != ',') // Skip grouping
- buff->append(c);
- i += in.size();
+ result.buff.append(c);
}
- return true;
+ result.state = ParsingResult::Acceptable;
+
+ // Intermediate if it ends with any character that requires a digit after
+ // it to be valid e.g. group separator, sign, or exponent
+ if (last == ',' || last == '-' || last == '+' || last == 'e')
+ result.state = ParsingResult::Intermediate;
+
+ return result;
}
double QLocaleData::stringToDouble(QStringView str, bool *ok,
QLocale::NumberOptions number_options) const
{
CharBuff buff;
- if (!numberToCLocale(str, number_options, &buff)) {
+ if (!numberToCLocale(str, number_options, DoubleScientificMode, &buff)) {
if (ok != nullptr)
*ok = false;
return 0.0;
}
- int processed = 0;
- bool nonNullOk = false;
- double d = qt_asciiToDouble(buff.constData(), buff.length() - 1, nonNullOk, processed);
+ auto r = qt_asciiToDouble(buff.constData(), buff.size() - 1);
if (ok != nullptr)
- *ok = nonNullOk;
- return d;
+ *ok = r.ok();
+ return r.result;
}
-qlonglong QLocaleData::stringToLongLong(QStringView str, int base, bool *ok,
- QLocale::NumberOptions number_options) const
+QSimpleParsedNumber<qint64>
+QLocaleData::stringToLongLong(QStringView str, int base,
+ QLocale::NumberOptions number_options) const
{
CharBuff buff;
- if (!numberToCLocale(str, number_options, &buff)) {
- if (ok != nullptr)
- *ok = false;
- return 0;
- }
+ if (!numberToCLocale(str, number_options, IntegerMode, &buff))
+ return {};
- return bytearrayToLongLong(QByteArrayView(buff.constData(), buff.size()), base, ok);
+ return bytearrayToLongLong(QByteArrayView(buff), base);
}
-qulonglong QLocaleData::stringToUnsLongLong(QStringView str, int base, bool *ok,
- QLocale::NumberOptions number_options) const
+QSimpleParsedNumber<quint64>
+QLocaleData::stringToUnsLongLong(QStringView str, int base,
+ QLocale::NumberOptions number_options) const
{
CharBuff buff;
- if (!numberToCLocale(str, number_options, &buff)) {
- if (ok != nullptr)
- *ok = false;
- return 0;
- }
+ if (!numberToCLocale(str, number_options, IntegerMode, &buff))
+ return {};
- return bytearrayToUnsLongLong(QByteArrayView(buff.constData(), buff.size()), base, ok);
+ return bytearrayToUnsLongLong(QByteArrayView(buff), base);
}
-qlonglong QLocaleData::bytearrayToLongLong(QByteArrayView num, int base, bool *ok)
+static bool checkParsed(QByteArrayView num, qsizetype used)
{
- if (num.isEmpty() || num.at(0) == '\0') {
- if (ok != nullptr)
- *ok = false;
- return 0;
- }
-
- bool _ok;
- const char *endptr;
- const qlonglong l = qstrntoll(num.data(), num.size(), &endptr, base, &_ok);
-
- if (!_ok || endptr == num.data()) {
- if (ok != nullptr)
- *ok = false;
- return 0;
- }
+ if (used <= 0)
+ return false;
- const char *const stop = num.end();
- if (endptr < stop && *endptr != '\0') {
- while (endptr < stop && ascii_isspace(*endptr))
- ++endptr;
+ const qsizetype len = num.size();
+ if (used < len && num[used] != '\0') {
+ while (used < len && ascii_isspace(num[used]))
+ ++used;
}
- if (endptr < stop && *endptr != '\0') {
+ if (used < len && num[used] != '\0')
// we stopped at a non-digit character after converting some digits
- if (ok != nullptr)
- *ok = false;
- return 0;
- }
+ return false;
- if (ok != nullptr)
- *ok = true;
- return l;
+ return true;
}
-qulonglong QLocaleData::bytearrayToUnsLongLong(QByteArrayView num, int base, bool *ok)
+QSimpleParsedNumber<qint64> QLocaleData::bytearrayToLongLong(QByteArrayView num, int base)
{
- if (num.isEmpty() || num.at(0) == '\0') {
- if (ok != nullptr)
- *ok = false;
- return 0;
- }
-
- bool _ok;
- const char *endptr;
- const qulonglong l = qstrntoull(num.data(), num.size(), &endptr, base, &_ok);
-
- if (!_ok || endptr == num.data()) {
- if (ok != nullptr)
- *ok = false;
- return 0;
- }
-
- const char *const stop = num.end();
- if (endptr < stop && *endptr != '\0') {
- while (endptr < stop && ascii_isspace(*endptr))
- ++endptr;
- }
-
- if (endptr < stop && *endptr != '\0') {
- if (ok != nullptr)
- *ok = false;
- return 0;
- }
+ auto r = qstrntoll(num.data(), num.size(), base);
+ if (!checkParsed(num, r.used))
+ return {};
+ return r;
+}
- if (ok != nullptr)
- *ok = true;
- return l;
+QSimpleParsedNumber<quint64> QLocaleData::bytearrayToUnsLongLong(QByteArrayView num, int base)
+{
+ auto r = qstrntoull(num.data(), num.size(), base);
+ if (!checkParsed(num, r.used))
+ return {};
+ return r;
}
/*!
@@ -4158,7 +4545,7 @@ qulonglong QLocaleData::bytearrayToUnsLongLong(QByteArrayView num, int base, boo
\since 4.8
Returns a currency symbol according to the \a format.
*/
-QString QLocale::currencySymbol(QLocale::CurrencySymbolFormat format) const
+QString QLocale::currencySymbol(CurrencySymbolFormat format) const
{
#ifndef QT_NO_SYSTEMLOCALE
if (d->m_data == &systemLocaleData) {
@@ -4175,7 +4562,7 @@ QString QLocale::currencySymbol(QLocale::CurrencySymbolFormat format) const
case CurrencyIsoCode: {
const char *code = d->m_data->m_currency_iso_code;
if (auto len = qstrnlen(code, 3))
- return QString::fromLatin1(code, int(len));
+ return QString::fromLatin1(code, qsizetype(len));
break;
}
}
@@ -4209,8 +4596,8 @@ QString QLocale::toCurrencyString(qlonglong value, const QString &symbol) const
QString str = toString(value);
QString sym = symbol.isNull() ? currencySymbol() : symbol;
if (sym.isEmpty())
- sym = currencySymbol(QLocale::CurrencyIsoCode);
- return range.getData(currency_format_data).arg(str, sym);
+ sym = currencySymbol(CurrencyIsoCode);
+ return range.viewData(currency_format_data).arg(str, sym);
}
/*!
@@ -4231,7 +4618,7 @@ QString QLocale::toCurrencyString(qulonglong value, const QString &symbol) const
QString str = toString(value);
QString sym = symbol.isNull() ? currencySymbol() : symbol;
if (sym.isEmpty())
- sym = currencySymbol(QLocale::CurrencyIsoCode);
+ sym = currencySymbol(CurrencyIsoCode);
return d->m_data->currencyFormat().getData(currency_format_data).arg(str, sym);
}
@@ -4264,8 +4651,8 @@ QString QLocale::toCurrencyString(double value, const QString &symbol, int preci
QString str = toString(value, 'f', precision == -1 ? d->m_data->m_currency_digits : precision);
QString sym = symbol.isNull() ? currencySymbol() : symbol;
if (sym.isEmpty())
- sym = currencySymbol(QLocale::CurrencyIsoCode);
- return range.getData(currency_format_data).arg(str, sym);
+ sym = currencySymbol(CurrencyIsoCode);
+ return range.viewData(currency_format_data).arg(str, sym);
}
/*!
@@ -4324,59 +4711,89 @@ QString QLocale::formattedDataSize(qint64 bytes, int precision, DataSizeFormats
// We don't support sizes in units larger than exbibytes because
// the number of bytes would not fit into qint64.
Q_ASSERT(power <= 6 && power >= 0);
- QString unit;
+ QStringView unit;
if (power > 0) {
QLocaleData::DataRange range = (format & DataSizeSIQuantifiers)
? d->m_data->byteAmountSI() : d->m_data->byteAmountIEC();
- unit = range.getListEntry(byte_unit_data, power - 1);
+ unit = range.viewListEntry(byte_unit_data, power - 1);
} else {
- unit = d->m_data->byteCount().getData(byte_unit_data);
+ unit = d->m_data->byteCount().viewData(byte_unit_data);
}
- return number + QLatin1Char(' ') + unit;
+ return number + u' ' + unit;
}
/*!
\since 4.8
-
- Returns an ordered list of locale names for translation purposes in
- preference order (like "en-Latn-US", "en-US", "en").
-
- The return value represents locale names that the user expects to see the
- UI translation in.
-
- Most like you do not need to use this function directly, but just pass the
+ \brief List of locale names for use in selecting translations
+
+ Each entry in the returned list is the name of a locale suitable to the
+ user's preferences for what to translate the UI into. Where a name in the
+ list is composed of several tags, they are joined as indicated by \a
+ separator. Prior to Qt 6.7 a dash was used as separator.
+
+ For example, using the default separator QLocale::TagSeparator::Dash, if the
+ user has configured their system to use English as used in the USA, the list
+ would be "en-Latn-US", "en-US", "en". The order of entries is the order in
+ which to check for translations; earlier items in the list are to be
+ preferred over later ones. If your translation files use underscores, rather
+ than dashes, to separate locale tags, pass QLocale::TagSeparator::Underscore
+ as \a separator.
+
+ Most likely you do not need to use this function directly, but just pass the
QLocale object to the QTranslator::load() function.
- The first item in the list is the most preferred one.
-
\sa QTranslator, bcp47Name()
*/
-QStringList QLocale::uiLanguages() const
+QStringList QLocale::uiLanguages(TagSeparator separator) const
{
+ const char sep = char(separator);
QStringList uiLanguages;
- QList<QLocale> locales;
-#ifndef QT_NO_SYSTEMLOCALE
- if (d->m_data == &systemLocaleData) {
+ if (uchar(sep) > 0x7f) {
+ badSeparatorWarning("uiLanguages", sep);
+ return uiLanguages;
+ }
+ QList<QLocaleId> localeIds;
+#ifdef QT_NO_SYSTEMLOCALE
+ constexpr bool isSystem = false;
+#else
+ const bool isSystem = d->m_data == &systemLocaleData;
+ if (isSystem) {
uiLanguages = systemLocale()->query(QSystemLocale::UILanguages).toStringList();
- // ... but we need to include likely-adjusted forms of each of those, too:
- for (const auto &entry : uiLanguages)
- locales.append(QLocale(entry));
- if (locales.isEmpty())
- locales.append(systemLocale()->fallbackLocale());
+ // ... but we need to include likely-adjusted forms of each of those, too.
+ // For now, collect up locale Ids representing the entries, for later processing:
+ for (const auto &entry : std::as_const(uiLanguages))
+ localeIds.append(QLocaleId::fromName(entry));
+ if (localeIds.isEmpty())
+ localeIds.append(systemLocale()->fallbackLocale().d->m_data->id());
+ // If the system locale (isn't C and) didn't include itself in the list,
+ // or as fallback, presume to know better than it and put its name
+ // first. (Known issue, QTBUG-104930, on some macOS versions when in
+ // locale en_DE.) Our translation system might have a translation for a
+ // locale the platform doesn't believe in.
+ const QString name = bcp47Name(separator);
+ if (!name.isEmpty() && language() != C && !uiLanguages.contains(name)) {
+ // That uses contains(name) as a cheap pre-test, but there may be an
+ // entry that matches this on purging likely subtags.
+ const QLocaleId mine = d->m_data->id().withLikelySubtagsRemoved();
+ const auto isMine = [mine](const QString &entry) {
+ return QLocaleId::fromName(entry).withLikelySubtagsRemoved() == mine;
+ };
+ if (std::none_of(uiLanguages.constBegin(), uiLanguages.constEnd(), isMine)) {
+ localeIds.prepend(d->m_data->id());
+ uiLanguages.prepend(name);
+ }
+ }
} else
#endif
{
- locales.append(*this);
+ localeIds.append(d->m_data->id());
}
- for (int i = locales.size(); i-- > 0; ) {
- const QLocale &locale = locales.at(i);
- const auto data = locale.d->m_data;
- QLocaleId id = data->id();
-
- int j;
+ for (qsizetype i = localeIds.size(); i-- > 0; ) {
+ QLocaleId id = localeIds.at(i);
+ qsizetype j;
QByteArray prior;
- if (i < uiLanguages.size()) {
+ if (isSystem && i < uiLanguages.size()) {
// Adding likely-adjusted forms to system locale's list.
// Name the locale is derived from:
prior = uiLanguages.at(i).toLatin1();
@@ -4384,33 +4801,49 @@ QStringList QLocale::uiLanguages() const
j = i + 1;
} else if (id.language_id == C) {
// Attempt no likely sub-tag amendments to C:
- uiLanguages.append(locale.name());
+ uiLanguages.append(QString::fromLatin1(id.name(sep)));
continue;
} else {
- // Plain locale, not system locale; just append.
- const QString name = locale.bcp47Name();
- uiLanguages.append(name);
- prior = name.toLatin1();
+ // Plain locale or empty system uiLanguages; just append.
+ prior = id.name(sep);
+ uiLanguages.append(QString::fromLatin1(prior));
j = uiLanguages.size();
}
const QLocaleId max = id.withLikelySubtagsAdded();
const QLocaleId min = max.withLikelySubtagsRemoved();
- id.script_id = 0; // For re-use as script-less variant.
- // Include version with all likely sub-tags (last) if distinct from the rest:
- if (max != min && max != id && max.name() != prior)
- uiLanguages.insert(j, QString::fromLatin1(max.name()));
+ // Include minimal version (last) unless it's what our locale is derived from:
+ if (auto name = min.name(sep); name != prior)
+ uiLanguages.insert(j, QString::fromLatin1(name));
+ else if (!isSystem)
+ --j; // bcp47Name() matches min(): put more specific forms *before* it.
+
+ if (id.script_id) {
+ // Include scriptless version if likely-equivalent and distinct:
+ id.script_id = 0;
+ if (id != min && id.withLikelySubtagsAdded() == max) {
+ if (auto name = id.name(sep); name != prior)
+ uiLanguages.insert(j, QString::fromLatin1(name));
+ }
+ }
- // Include scriptless version if likely-equivalent and distinct:
- if (data->m_script_id && id != min && id.name() != prior
- && id.withLikelySubtagsAdded() == max) {
- uiLanguages.insert(j, QString::fromLatin1(id.name()));
+ if (!id.territory_id) {
+ Q_ASSERT(!min.territory_id);
+ Q_ASSERT(!id.script_id); // because we just cleared it.
+ // Include version with territory if it likely-equivalent and distinct:
+ id.territory_id = max.territory_id;
+ if (id != max && id.withLikelySubtagsAdded() == max) {
+ if (auto name = id.name(sep); name != prior)
+ uiLanguages.insert(j, QString::fromLatin1(name));
+ }
}
- // Include minimal version (first) unless it's what our locale is derived from:
- if (min.name() != prior)
- uiLanguages.insert(j, QString::fromLatin1(min.name()));
+ // Include version with all likely sub-tags (first) if distinct from the rest:
+ if (max != min && max != id) {
+ if (auto name = max.name(sep); name != prior)
+ uiLanguages.insert(j, QString::fromLatin1(name));
+ }
}
return uiLanguages;
}
@@ -4442,7 +4875,7 @@ QLocale QLocale::collation() const
\since 4.8
Returns a native name of the language for the locale. For example
- "Schwiizertüütsch" for Swiss-German locale.
+ "Schweizer Hochdeutsch" for the Swiss-German locale.
\sa nativeTerritoryName(), languageToString()
*/
diff --git a/src/corelib/text/qlocale.h b/src/corelib/text/qlocale.h
index 82852524eb..cb3eb64193 100644
--- a/src/corelib/text/qlocale.h
+++ b/src/corelib/text/qlocale.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QLOCALE_H
#define QLOCALE_H
@@ -72,6 +36,8 @@ class Q_CORE_EXPORT QLocale
friend class QTextStreamPrivate;
public:
+ static constexpr int DefaultTwoDigitBaseYear = 1900;
+
// see qlocale_data_p.h for more info on generated data
// GENERATED PART STARTS HERE
enum Language : ushort {
@@ -405,6 +371,20 @@ public:
Zulu = 327,
Kaingang = 328,
Nheengatu = 329,
+ Haryanvi = 330,
+ NorthernFrisian = 331,
+ Rajasthani = 332,
+ Moksha = 333,
+ TokiPona = 334,
+ Pijin = 335,
+ Obolo = 336,
+ Baluchi = 337,
+ Ligurian = 338,
+ Rohingya = 339,
+ Torwali = 340,
+ Anii = 341,
+ Kangri = 342,
+ Venetian = 343,
Afan = Oromo,
Bengali = Bangla,
@@ -426,7 +406,7 @@ public:
Uigur = Uyghur,
Walamo = Wolaytta,
- LastLanguage = Nheengatu
+ LastLanguage = Venetian
};
enum Script : ushort {
@@ -572,6 +552,7 @@ public:
VaiScript = 139,
VarangKshitiScript = 140,
YiScript = 141,
+ HanifiScript = 142,
BengaliScript = BanglaScript,
MendeKikakuiScript = MendeScript,
@@ -579,7 +560,7 @@ public:
SimplifiedChineseScript = SimplifiedHanScript,
TraditionalChineseScript = TraditionalHanScript,
- LastScript = YiScript
+ LastScript = HanifiScript
};
// ### Qt 7: Rename to Territory
@@ -892,6 +873,7 @@ public:
Q_ENUM(MeasurementSystem)
enum FormatType { LongFormat, ShortFormat, NarrowFormat };
+ Q_ENUM(FormatType)
enum NumberOption {
DefaultNumberOptions = 0x0,
OmitGroupSeparator = 0x01,
@@ -902,16 +884,21 @@ public:
RejectTrailingZeroesAfterDot = 0x20
};
Q_DECLARE_FLAGS(NumberOptions, NumberOption)
+ Q_FLAG(NumberOptions)
enum FloatingPointPrecisionOption {
FloatingPointShortest = -128
};
+ enum class TagSeparator : char { Dash = '-', Underscore = '_' };
+ Q_ENUM(TagSeparator)
+
enum CurrencySymbolFormat {
CurrencyIsoCode,
CurrencySymbol,
CurrencyDisplayName
};
+ Q_ENUM(CurrencySymbolFormat)
enum DataSizeFormat {
// Single-bit values, for internal use.
@@ -927,18 +914,17 @@ public:
Q_FLAG(DataSizeFormats)
QLocale();
-#if QT_STRINGVIEW_LEVEL < 2
- explicit QLocale(const QString &name) : QLocale(qToStringViewIgnoringNull(name)) {}
-#endif
+ QT_CORE_INLINE_SINCE(6, 4)
+ explicit QLocale(const QString &name);
explicit QLocale(QStringView name);
QLocale(Language language, Territory territory);
QLocale(Language language, Script script = AnyScript, Territory territory = AnyTerritory);
- QLocale(const QLocale &other);
+ QLocale(const QLocale &other) noexcept;
QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_PURE_SWAP(QLocale)
- QLocale &operator=(const QLocale &other);
+ QLocale &operator=(const QLocale &other) noexcept;
~QLocale();
- void swap(QLocale &other) noexcept { qSwap(d, other.d); }
+ void swap(QLocale &other) noexcept { d.swap(other.d); }
Language language() const;
Script script() const;
@@ -947,9 +933,14 @@ public:
QT_DEPRECATED_VERSION_X_6_6("Use territory() instead")
Country country() const;
#endif
- QString name() const;
+#if QT_CORE_REMOVED_SINCE(6, 7)
+ QString name() const;
QString bcp47Name() const;
+#endif
+ QString name(TagSeparator separator = TagSeparator::Underscore) const;
+ QString bcp47Name(TagSeparator separator = TagSeparator::Dash) const;
+
QString nativeLanguageName() const;
QString nativeTerritoryName() const;
#if QT_DEPRECATED_SINCE(6, 6)
@@ -957,7 +948,6 @@ public:
QString nativeCountryName() const;
#endif
-#if QT_STRINGVIEW_LEVEL < 2
short toShort(const QString &s, bool *ok = nullptr) const
{ return toShort(qToStringViewIgnoringNull(s), ok); }
ushort toUShort(const QString &s, bool *ok = nullptr) const
@@ -978,7 +968,6 @@ public:
{ return toFloat(qToStringViewIgnoringNull(s), ok); }
double toDouble(const QString &s, bool *ok = nullptr) const
{ return toDouble(qToStringViewIgnoringNull(s), ok); }
-#endif
short toShort(QStringView s, bool *ok = nullptr) const;
ushort toUShort(QStringView s, bool *ok = nullptr) const;
@@ -1003,13 +992,11 @@ public:
QString toString(float f, char format = 'g', int precision = 6) const
{ return toString(double(f), format, precision); }
-#if QT_STRINGVIEW_LEVEL < 2
// (Can't inline first two: passing by value doesn't work when only forward-declared.)
QString toString(QDate date, const QString &format) const;
QString toString(QTime time, const QString &format) const;
QString toString(const QDateTime &dateTime, const QString &format) const
{ return toString(dateTime, qToStringViewIgnoringNull(format)); }
-#endif
QString toString(QDate date, QStringView format) const;
QString toString(QTime time, QStringView format) const;
QString toString(const QDateTime &dateTime, QStringView format) const;
@@ -1029,18 +1016,39 @@ public:
QString dateFormat(FormatType format = LongFormat) const;
QString timeFormat(FormatType format = LongFormat) const;
QString dateTimeFormat(FormatType format = LongFormat) const;
+ // QCalendar's header has to #include QLocale's, preventing the reverse, so
+ // QCalendar parameters can't have defaults here.
#if QT_CONFIG(datestring)
- QDate toDate(const QString &string, FormatType = LongFormat) const;
QTime toTime(const QString &string, FormatType = LongFormat) const;
- QDateTime toDateTime(const QString &string, FormatType format = LongFormat) const;
- QDate toDate(const QString &string, const QString &format) const;
QTime toTime(const QString &string, const QString &format) const;
+# if QT_CORE_REMOVED_SINCE(6, 7)
+ QDate toDate(const QString &string, FormatType = LongFormat) const;
+ QDate toDate(const QString &string, const QString &format) const;
+ QDateTime toDateTime(const QString &string, FormatType format = LongFormat) const;
QDateTime toDateTime(const QString &string, const QString &format) const;
// Calendar-aware API
QDate toDate(const QString &string, FormatType format, QCalendar cal) const;
- QDateTime toDateTime(const QString &string, FormatType format, QCalendar cal) const;
QDate toDate(const QString &string, const QString &format, QCalendar cal) const;
+ QDateTime toDateTime(const QString &string, FormatType format, QCalendar cal) const;
QDateTime toDateTime(const QString &string, const QString &format, QCalendar cal) const;
+# endif
+ QDate toDate(const QString &string, FormatType = LongFormat,
+ int baseYear = DefaultTwoDigitBaseYear) const;
+ QDate toDate(const QString &string, const QString &format,
+ int baseYear = DefaultTwoDigitBaseYear) const;
+ QDateTime toDateTime(const QString &string, FormatType format = LongFormat,
+ int baseYear = DefaultTwoDigitBaseYear) const;
+ QDateTime toDateTime(const QString &string, const QString &format,
+ int baseYear = DefaultTwoDigitBaseYear) const;
+ // Calendar-aware API
+ QDate toDate(const QString &string, FormatType format, QCalendar cal,
+ int baseYear = DefaultTwoDigitBaseYear) const;
+ QDate toDate(const QString &string, const QString &format, QCalendar cal,
+ int baseYear = DefaultTwoDigitBaseYear) const;
+ QDateTime toDateTime(const QString &string, FormatType format, QCalendar cal,
+ int baseYear = DefaultTwoDigitBaseYear) const;
+ QDateTime toDateTime(const QString &string, const QString &format, QCalendar cal,
+ int baseYear = DefaultTwoDigitBaseYear) const;
#endif
QString decimalPoint() const;
@@ -1086,10 +1094,35 @@ public:
QString formattedDataSize(qint64 bytes, int precision = 2, DataSizeFormats format = DataSizeIecFormat) const;
+#if QT_CORE_REMOVED_SINCE(6, 7)
QStringList uiLanguages() const;
+#endif
+ QStringList uiLanguages(TagSeparator separator = TagSeparator::Dash) const;
+
+ enum LanguageCodeType {
+ ISO639Part1 = 1 << 0,
+ ISO639Part2B = 1 << 1,
+ ISO639Part2T = 1 << 2,
+ ISO639Part3 = 1 << 3,
+ LegacyLanguageCode = 1 << 15,
+ ISO639Part2 = ISO639Part2B | ISO639Part2T,
+ ISO639Alpha2 = ISO639Part1,
+ ISO639Alpha3 = ISO639Part2 | ISO639Part3,
+ ISO639 = ISO639Alpha2 | ISO639Alpha3,
+
+ AnyLanguageCode = -1
+ };
+ Q_DECLARE_FLAGS(LanguageCodeTypes, LanguageCodeType)
+ Q_FLAG(LanguageCodeTypes)
+
+#if QT_CORE_REMOVED_SINCE(6, 3)
static QString languageToCode(Language language);
static Language codeToLanguage(QStringView languageCode) noexcept;
+#endif
+ static QString languageToCode(Language language, LanguageCodeTypes codeTypes = AnyLanguageCode);
+ static Language codeToLanguage(QStringView languageCode,
+ LanguageCodeTypes codeTypes = AnyLanguageCode) noexcept;
static QString territoryToCode(Territory territory);
static Territory codeToTerritory(QStringView territoryCode) noexcept;
#if QT_DEPRECATED_SINCE(6, 6)
@@ -1124,6 +1157,7 @@ public:
NumberOptions numberOptions() const;
enum QuotationStyle { StandardQuotation, AlternateQuotation };
+ Q_ENUM(QuotationStyle)
QString quoteString(const QString &str, QuotationStyle style = StandardQuotation) const
{ return quoteString(QStringView(str), style); }
QString quoteString(QStringView str, QuotationStyle style = StandardQuotation) const;
@@ -1136,7 +1170,7 @@ private:
friend class QLocalePrivate;
friend class QSystemLocale;
friend class QCalendarBackend;
- friend class QGregorianCalendar;
+ friend class QRomanCalendar;
friend Q_CORE_EXPORT size_t qHash(const QLocale &key, size_t seed) noexcept;
friend bool operator==(const QLocale &lhs, const QLocale &rhs) { return lhs.equals(rhs); }
@@ -1146,6 +1180,12 @@ private:
};
Q_DECLARE_SHARED(QLocale)
Q_DECLARE_OPERATORS_FOR_FLAGS(QLocale::NumberOptions)
+Q_DECLARE_OPERATORS_FOR_FLAGS(QLocale::LanguageCodeTypes)
+
+#if QT_CORE_INLINE_IMPL_SINCE(6, 4)
+QLocale::QLocale(const QString &name)
+ : QLocale(qToStringViewIgnoringNull(name)) {}
+#endif
#ifndef QT_NO_DATASTREAM
Q_CORE_EXPORT QDataStream &operator<<(QDataStream &, const QLocale &);
diff --git a/src/corelib/text/qlocale.qdoc b/src/corelib/text/qlocale.qdoc
index dc9c4e632f..f3f0a5cc2d 100644
--- a/src/corelib/text/qlocale.qdoc
+++ b/src/corelib/text/qlocale.qdoc
@@ -1,29 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
\class QLocale
@@ -74,7 +50,7 @@
\note For the current keyboard input locale take a look at
QInputMethod::locale().
- QLocale's data is based on Common Locale Data Repository v40.
+ QLocale's data is based on Common Locale Data Repository v44.1.
\section1 Matching combinations of language, script and territory
@@ -119,16 +95,17 @@
\value Afrikaans
\value Aghem
\value Akan
- \value Akkadian Since Qt 5.1
- \value Akoose Since Qt 5.3
+ \value [since 5.1] Akkadian
+ \value [since 5.3] Akoose
\value Albanian
- \value AmericanSignLanguage Since Qt 5.7
+ \value [since 5.7] AmericanSignLanguage
\value Amharic
- \value AncientEgyptian Since Qt 5.1
- \value AncientGreek Since Qt 5.1
+ \value [since 5.1] AncientEgyptian
+ \value [since 5.1] AncientGreek
+ \value [since 6.7] Anii
\value Arabic
- \value Aragonese Since Qt 5.1
- \value Aramaic Since Qt 5.1
+ \value [since 5.1] Aragonese
+ \value [since 5.1] Aramaic
\value Armenian
\value Assamese
\value Asturian
@@ -139,48 +116,49 @@
\value Aymara
\value Azerbaijani
\value Bafia
- \value Balinese Since Qt 5.1
+ \value [since 5.1] Balinese
+ \value [since 6.6] Baluchi
\value Bambara
- \value Bamun Since Qt 5.1
- \value Bangla Since Qt 6.0
+ \value [since 5.1] Bamun
+ \value [since 6.0] Bangla
\value Basaa
\value Bashkir
\value Basque
- \value BatakToba Since Qt 5.1
+ \value [since 5.1] BatakToba
\value Belarusian
\value Bemba
\value Bena
\value Bengali Obsolete, please use Bangla
- \value Bhojpuri Since Qt 5.7
+ \value [since 5.7] Bhojpuri
\value Bhutani Obsolete, please use Dzongkha
\value Bislama
\value Blin
\value Bodo
\value Bosnian
\value Breton
- \value Buginese Since Qt 5.1
+ \value [since 5.1] Buginese
\value Bulgarian
\value Burmese
\value Byelorussian Obsolete, please use Belarusian
\value Cambodian Obsolete, please use Khmer
- \value Cantonese Since Qt 5.7
+ \value [since 5.7] Cantonese
\value Catalan
- \value Cebuano Since Qt 5.14
- \value CentralAtlasTamazight Since Qt 6.0
- \value CentralKurdish Since Qt 5.5
+ \value [since 5.14] Cebuano
+ \value [since 6.0] CentralAtlasTamazight
+ \value [since 5.5] CentralKurdish
\value CentralMoroccoTamazight Obsolete, please use CentralAtlasTamazight
- \value Chakma Since Qt 5.1
+ \value [since 5.1] Chakma
\value Chamorro
\value Chechen
\value Cherokee
\value Chewa Obsolete, please use Nyanja
- \value Chickasaw Since Qt 5.14
+ \value [since 5.14] Chickasaw
\value Chiga
\value Chinese (Mandarin)
\value Church
\value Chuvash
\value Colognian
- \value Coptic Since Qt 5.1
+ \value [since 5.1] Coptic
\value Cornish
\value Corsican
\value Cree
@@ -188,13 +166,13 @@
\value Czech
\value Danish
\value Divehi
- \value Dogri Since Qt 5.1
+ \value [since 5.1] Dogri
\value Duala
\value Dutch
\value Dzongkha
\value Embu
\value English
- \value Erzya Since Qt 5.14
+ \value [since 5.14] Erzya
\value Esperanto
\value Estonian
\value Ewe
@@ -214,13 +192,14 @@
\value Geez
\value Georgian
\value German
- \value Gothic Since Qt 5.1
+ \value [since 5.1] Gothic
\value Greek
\value Greenlandic Obsolete, please use Kalaallisut
\value Guarani
\value Gujarati
\value Gusii
\value Haitian
+ \value [since 6.5] Haryanvi
\value Hausa
\value Hawaiian
\value Hebrew
@@ -229,16 +208,16 @@
\value HiriMotu
\value Hungarian
\value Icelandic
- \value Ido Since Qt 5.12
+ \value [since 5.12] Ido
\value Igbo
- \value InariSami Since Qt 5.5
+ \value [since 5.5] InariSami
\value Indonesian
- \value Ingush Since Qt 5.1
+ \value [since 5.1] Ingush
\value Interlingua
\value Interlingue
\value Inuktitut
\value Inupiak Obsolete, please use Inupiaq
- \value Inupiaq Since 6.0
+ \value [since 6.0] Inupiaq
\value Irish
\value Italian
\value Japanese
@@ -247,18 +226,19 @@
\value JolaFonyi
\value Kabuverdianu
\value Kabyle
- \value Kaingang Since 6.3
+ \value [since 6.3] Kaingang
\value Kako
- \value Kalaallisut Since Qt 6.0
+ \value [since 6.0] Kalaallisut
\value Kalenjin
\value Kamba
+ \value [since 6.7] Kangri
\value Kannada
\value Kanuri
\value Kashmiri
\value Kazakh
- \value Kenyang Since Qt 5.5
+ \value [since 5.5] Kenyang
\value Khmer
- \value Kiche Since Qt 5.5
+ \value [since 5.5] Kiche
\value Kikuyu
\value Kinyarwanda
\value Kirghiz Obsolete, please use Kyrgyz
@@ -270,69 +250,72 @@
\value KoyraboroSenni
\value KoyraChiini
\value Kpelle
- \value Kuanyama Since 6.0
+ \value [since 6.0] Kuanyama
\value Kurdish
\value Kurundi Obsolete, please use Rundi
\value Kwanyama Obsolete, please use Kuanyama
\value Kwasio
- \value Kyrgyz Since 6.0
- \value Lakota Since Qt 5.3
+ \value [since 6.0] Kyrgyz
+ \value [since 5.3] Lakota
\value Langi
\value Lao
\value Latin
\value Latvian
- \value Lezghian Since Qt 5.5
+ \value [since 5.5] Lezghian
\value Limburgish
\value Lingala
- \value LiteraryChinese Since Qt 5.7
+ \value [since 6.6] Ligurian
+ \value [since 5.7] LiteraryChinese
\value Lithuanian
- \value Lojban Since Qt 5.12
- \value LowerSorbian Since Qt 5.5
+ \value [since 5.12] Lojban
+ \value [since 5.5] LowerSorbian
\value LowGerman
\value LubaKatanga
- \value LuleSami Since Qt 5.5
+ \value [since 5.5] LuleSami
\value Luo
\value Luxembourgish
\value Luyia
\value Macedonian
\value Machame
- \value Maithili Since Qt 5.5
+ \value [since 5.5] Maithili
\value MakhuwaMeetto
\value Makonde
\value Malagasy
\value Malay
\value Malayalam
\value Maltese
- \value Mandingo Since Qt 5.1
- \value Manipuri Since Qt 5.1
+ \value [since 5.1] Mandingo
+ \value [since 5.1] Manipuri
\value Manx
\value Maori
- \value Mapuche Since Qt 5.5
+ \value [since 5.5] Mapuche
\value Marathi
\value Marshallese
\value Masai
- \value Mazanderani Since Qt 5.7
- \value Mende Since Qt 5.5
+ \value [since 5.7] Mazanderani
+ \value [since 5.5] Mende
\value Meru
\value Meta
- \value Mohawk Since Qt 5.5
+ \value [since 5.5] Mohawk
+ \value [since 6.5] Moksha
\value Mongolian
\value Morisyen
\value Mundang
- \value Muscogee Since Qt 5.14
+ \value [since 5.14] Muscogee
\value Nama
\value NauruLanguage
\value Navaho Obsolete, please use Navajo
- \value Navajo Since 6.0
+ \value [since 6.0] Navajo
\value Ndonga
\value Nepali
- \value Newari Since Qt 5.7
+ \value [since 5.7] Newari
\value Ngiemboon
- \value Nheengatu Since 6.3
- \value NigerianPidgin Since Qt 6.0
+ \value [since 6.3] Nheengatu
+ \value [since 6.0] NigerianPidgin
\value Ngomba
- \value Nko Since Qt 5.5
- \value NorthernLuri Since Qt 5.7
+ \value [since 5.5] Nko
+ \value [since 6.5] NorthernFrisian
+ \value [since 5.7] NorthernLuri
\value NorthernSami
\value NorthernSotho
\value NorthNdebele
@@ -341,29 +324,33 @@
\value Nuer
\value Nyanja
\value Nyankole
+ \value [since 6.5] Obolo
\value Occitan
- \value Odia Since 6.0
+ \value [since 6.0] Odia
\value Ojibwa
- \value OldIrish Since Qt 5.1
- \value OldNorse Since Qt 5.1
- \value OldPersian Since Qt 5.1
+ \value [since 5.1] OldIrish
+ \value [since 5.1] OldNorse
+ \value [since 5.1] OldPersian
\value Oriya Obsolete, please use Odia
\value Oromo
- \value Osage Since Qt 5.7
+ \value [since 5.7] Osage
\value Ossetic
- \value Pahlavi Since Qt 5.1
- \value Palauan Since Qt 5.7
+ \value [since 5.1] Pahlavi
+ \value [since 5.7] Palauan
\value Pali
- \value Papiamento Since Qt 5.7
+ \value [since 5.7] Papiamento
\value Pashto
\value Persian
- \value Phoenician Since Qt 5.1
+ \value [since 5.1] Phoenician
+ \value [since 6.5] Pijin
\value Polish
\value Portuguese
- \value Prussian Since Qt 5.5
+ \value [since 5.5] Prussian
\value Punjabi
\value Quechua
+ \value [since 6.5] Rajasthani
\value RhaetoRomance Obsolete, please use Romansh
+ \value [since 6.6] Rohingya
\value Romanian
\value Romansh
\value Rombo
@@ -377,30 +364,30 @@
\value Sango
\value Sangu
\value Sanskrit
- \value Santali Since Qt 5.1
+ \value [since 5.1] Santali
\value Sardinian
- \value Saurashtra Since Qt 5.1
+ \value [since 5.1] Saurashtra
\value Sena
\value Serbian
\value Shambala
\value Shona
\value SichuanYi
- \value Sicilian Since Qt 5.12
+ \value [since 5.12] Sicilian
\value Sidamo
- \value Silesian Since Qt 5.14
+ \value [since 5.14] Silesian
\value Sindhi
\value Sinhala
- \value SkoltSami Since Qt 5.5
+ \value [since 5.5] SkoltSami
\value Slovak
\value Slovenian
\value Soga
\value Somali
- \value SouthernKurdish Since Qt 5.12
- \value SouthernSami Since Qt 5.5
+ \value [since 5.12] SouthernKurdish
+ \value [since 5.5] SouthernSami
\value SouthernSotho
\value SouthNdebele
\value Spanish
- \value StandardMoroccanTamazight Since Qt 5.3
+ \value [since 5.3] StandardMoroccanTamazight
\value Sundanese
\value Swahili
\value Swati
@@ -409,7 +396,7 @@
\value Syriac
\value Tachelhit
\value Tahitian
- \value TaiDam Since Qt 5.1
+ \value [since 5.1] TaiDam
\value Taita
\value Tajik
\value Tamil
@@ -422,36 +409,39 @@
\value Tibetan
\value Tigre
\value Tigrinya
- \value TokelauLanguage Since Qt 5.7
- \value TokPisin Since Qt 5.7
+ \value [since 5.7] TokelauLanguage
+ \value [since 6.5] TokiPona
+ \value [since 5.7] TokPisin
\value Tongan
+ \value [since 6.6] Torwali
\value Tsonga
\value Tswana
\value Turkish
\value Turkmen
- \value TuvaluLanguage Since Qt 5.7
+ \value [since 5.7] TuvaluLanguage
\value Tyap
- \value Ugaritic Since Qt 5.1
+ \value [since 5.1] Ugaritic
\value Uighur Obsolete, please use Uyghur
\value Uigur Obsolete, please use Uyghur
\value Ukrainian
- \value UpperSorbian Since Qt 5.5
+ \value [since 5.5] UpperSorbian
\value Urdu
- \value Uyghur Since 6.0
+ \value [since 6.0] Uyghur
\value Uzbek
\value Vai
\value Venda
+ \value [since 6.7] Venetian
\value Vietnamese
\value Volapuk
\value Vunjo
\value Walamo Obsolete, please use Wolaytta
\value Walloon
\value Walser
- \value Warlpiri Since Qt 5.5
+ \value [since 5.5] Warlpiri
\value Welsh
- \value WesternBalochi Since Qt 5.12
+ \value [since 5.12] WesternBalochi
\value WesternFrisian same as Frisian
- \value Wolaytta Since 6.0
+ \value [since 6.0] Wolaytta
\value Wolof
\value Xhosa
\value Yangben
@@ -485,7 +475,7 @@
details are specific.
\value AnyCountry Osbolete alias for \c AnyTerritory
- \value AnyTerritory Since 6.2
+ \value [since 6.2] AnyTerritory
\value Afghanistan
\value AlandIslands
@@ -517,7 +507,7 @@
\value Bolivia
\value Bonaire
\value BosniaAndHerzegowina Obsolete, use \c BosniaAndHerzegovina instead
- \value BosniaAndHerzegovina Since 6.0
+ \value [since 6.0] BosniaAndHerzegovina
\value Botswana
\value BouvetIsland
\value Brazil
@@ -550,10 +540,10 @@
\value CostaRica
\value Croatia
\value Cuba
- \value Curacao Since Qt 6.0
+ \value [since 6.0] Curacao
\value CuraSao Obsolete, use \c Curacao instead
\value Cyprus
- \value Czechia Since 6.0
+ \value [since 6.0] Czechia
\value CzechRepublic Obsolete, use \c Czechia instead
\value DemocraticRepublicOfCongo Obsolete, use \c CongoKinshasa instead
\value DemocraticRepublicOfKorea Obsolete, use \c NorthKorea instead
@@ -571,8 +561,8 @@
\value Estonia
\value Eswatini
\value Ethiopia
- \value EuropeanUnion Since Qt 5.7
- \value Europe Since Qt 5.12
+ \value [since 5.7] EuropeanUnion
+ \value [since 5.12] Europe
\value FalklandIslands
\value FaroeIslands
\value Fiji
@@ -619,7 +609,7 @@
\value Kazakhstan
\value Kenya
\value Kiribati
- \value Kosovo Since Qt 5.2
+ \value [since 5.2] Kosovo
\value Kuwait
\value Kyrgyzstan
\value Laos
@@ -659,7 +649,7 @@
\value Myanmar
\value Namibia
\value NauruCountry Osbolete alias for \c NauruTerritory
- \value NauruTerritory Since 6.2
+ \value [since 6.2] NauruTerritory
\value Nepal
\value Netherlands
\value NewCaledonia
@@ -673,7 +663,7 @@
\value NorthKorea
\value Norway
\value Oman
- \value OutlyingOceania Since Qt 5.7
+ \value [since 5.7] OutlyingOceania
\value Pakistan
\value Palau
\value PalestinianTerritories
@@ -739,7 +729,7 @@
\value TimorLeste
\value Togo
\value TokelauCountry Osbolete alias for \c TokelauTerritory
- \value TokelauTerritory Since 6.2
+ \value [since 6.2] TokelauTerritory
\value Tonga
\value TrinidadAndTobago
\value TristanDaCunha
@@ -748,7 +738,7 @@
\value Turkmenistan
\value TurksAndCaicosIslands
\value TuvaluCountry Osbolete alias for \c TuvaluTerritory
- \value TuvaluTerritory Since 6.2
+ \value [since 6.2] TuvaluTerritory
\value Uganda
\value Ukraine
\value UnitedArabEmirates
@@ -767,7 +757,7 @@
\value WallisAndFutuna
\value WallisAndFutunaIslands
\value WesternSahara
- \value World Since Qt 5.12
+ \value [since 5.12] World
\value Yemen
\value Zambia
\value Zimbabwe
@@ -788,151 +778,152 @@
\value AnyScript
- \value AdlamScript Since Qt 5.7
- \value AhomScript Since Qt 5.7
- \value AnatolianHieroglyphsScript Since Qt 5.7
+ \value [since 5.7] AdlamScript
+ \value [since 5.7] AhomScript
+ \value [since 5.7] AnatolianHieroglyphsScript
\value ArabicScript
\value ArmenianScript
- \value AvestanScript Since Qt 5.1
- \value BalineseScript Since Qt 5.1
- \value BamumScript Since Qt 5.1
- \value BanglaScript Since 6.0
- \value BassaVahScript Since Qt 5.5
- \value BatakScript Since Qt 5.1
+ \value [since 5.1] AvestanScript
+ \value [since 5.1] BalineseScript
+ \value [since 5.1] BamumScript
+ \value [since 6.0] BanglaScript
+ \value [since 5.5] BassaVahScript
+ \value [since 5.1] BatakScript
\value BengaliScript Obsolete, please use BanglaScript
- \value BhaiksukiScript Since Qt 5.7
- \value BopomofoScript Since Qt 5.1
- \value BrahmiScript Since Qt 5.1
- \value BrailleScript Since Qt 5.1
- \value BugineseScript Since Qt 5.1
- \value BuhidScript Since Qt 5.1
- \value CanadianAboriginalScript Since Qt 5.1
- \value CarianScript Since Qt 5.1
- \value CaucasianAlbanianScript Since Qt 5.5
- \value ChakmaScript Since Qt 5.1
- \value ChamScript Since Qt 5.1
+ \value [since 5.7] BhaiksukiScript
+ \value [since 5.1] BopomofoScript
+ \value [since 5.1] BrahmiScript
+ \value [since 5.1] BrailleScript
+ \value [since 5.1] BugineseScript
+ \value [since 5.1] BuhidScript
+ \value [since 5.1] CanadianAboriginalScript
+ \value [since 5.1] CarianScript
+ \value [since 5.5] CaucasianAlbanianScript
+ \value [since 5.1] ChakmaScript
+ \value [since 5.1] ChamScript
\value CherokeeScript
- \value CopticScript Since Qt 5.1
- \value CuneiformScript Since Qt 5.1
- \value CypriotScript Since Qt 5.1
+ \value [since 5.1] CopticScript
+ \value [since 5.1] CuneiformScript
+ \value [since 5.1] CypriotScript
\value CyrillicScript
- \value DeseretScript Since Qt 5.1
+ \value [since 5.1] DeseretScript
\value DevanagariScript
- \value DuployanScript Since Qt 5.5
- \value EgyptianHieroglyphsScript Since Qt 5.1
- \value ElbasanScript Since Qt 5.5
+ \value [since 5.5] DuployanScript
+ \value [since 5.1] EgyptianHieroglyphsScript
+ \value [since 5.5] ElbasanScript
\value EthiopicScript
- \value FraserScript Since Qt 5.1
+ \value [since 5.1] FraserScript
\value GeorgianScript
- \value GlagoliticScript Since Qt 5.1
- \value GothicScript Since Qt 5.1
- \value GranthaScript Since Qt 5.5
+ \value [since 5.1] GlagoliticScript
+ \value [since 5.1] GothicScript
+ \value [since 5.5] GranthaScript
\value GreekScript
\value GujaratiScript
\value GurmukhiScript
- \value HangulScript Since Qt 5.1
- \value HanScript Since Qt 5.1
- \value HanunooScript Since Qt 5.1
- \value HanWithBopomofoScript Since Qt 5.7
- \value HatranScript Since Qt 5.7
+ \value [since 5.1] HangulScript
+ \value [since 6.6] HanifiScript
+ \value [since 5.1] HanScript
+ \value [since 5.1] HanunooScript
+ \value [since 5.7] HanWithBopomofoScript
+ \value [since 5.7] HatranScript
\value HebrewScript
- \value HiraganaScript Since Qt 5.1
- \value ImperialAramaicScript Since Qt 5.1
- \value InscriptionalPahlaviScript Since Qt 5.1
- \value InscriptionalParthianScript Since Qt 5.1
- \value JamoScript Since Qt 5.7
+ \value [since 5.1] HiraganaScript
+ \value [since 5.1] ImperialAramaicScript
+ \value [since 5.1] InscriptionalPahlaviScript
+ \value [since 5.1] InscriptionalParthianScript
+ \value [since 5.7] JamoScript
\value JapaneseScript
- \value JavaneseScript Since Qt 5.1
- \value KaithiScript Since Qt 5.1
+ \value [since 5.1] JavaneseScript
+ \value [since 5.1] KaithiScript
\value KannadaScript
- \value KatakanaScript Since Qt 5.1
- \value KayahLiScript Since Qt 5.1
- \value KharoshthiScript Since Qt 5.1
- \value KhmerScript Since Qt 5.1
- \value KhojkiScript Since Qt 5.5
- \value KhudawadiScript Since Qt 5.5
+ \value [since 5.1] KatakanaScript
+ \value [since 5.1] KayahLiScript
+ \value [since 5.1] KharoshthiScript
+ \value [since 5.1] KhmerScript
+ \value [since 5.5] KhojkiScript
+ \value [since 5.5] KhudawadiScript
\value KoreanScript
- \value LannaScript Since Qt 5.1
+ \value [since 5.1] LannaScript
\value LaoScript
\value LatinScript
- \value LepchaScript Since Qt 5.1
- \value LimbuScript Since Qt 5.1
- \value LinearAScript Since Qt 5.5
- \value LinearBScript Since Qt 5.1
- \value LycianScript Since Qt 5.1
- \value LydianScript Since Qt 5.1
- \value MahajaniScript Since Qt 5.5
+ \value [since 5.1] LepchaScript
+ \value [since 5.1] LimbuScript
+ \value [since 5.5] LinearAScript
+ \value [since 5.1] LinearBScript
+ \value [since 5.1] LycianScript
+ \value [since 5.1] LydianScript
+ \value [since 5.5] MahajaniScript
\value MalayalamScript
- \value MandaeanScript Since Qt 5.1
- \value ManichaeanScript Since Qt 5.5
- \value MarchenScript Since Qt 5.7
- \value MeiteiMayekScript Since Qt 5.1
- \value MendeScript Since Qt 6.0
+ \value [since 5.1] MandaeanScript
+ \value [since 5.5] ManichaeanScript
+ \value [since 5.7] MarchenScript
+ \value [since 5.1] MeiteiMayekScript
+ \value [since 6.0] MendeScript
\value MendeKikakuiScript Obsolete, please use MendeScript
- \value MeroiticCursiveScript Since Qt 5.1
- \value MeroiticScript Since Qt 5.1
- \value ModiScript Since Qt 5.5
+ \value [since 5.1] MeroiticCursiveScript
+ \value [since 5.1] MeroiticScript
+ \value [since 5.5] ModiScript
\value MongolianScript
- \value MroScript Since Qt 5.5
- \value MultaniScript Since Qt 5.7
+ \value [since 5.5] MroScript
+ \value [since 5.7] MultaniScript
\value MyanmarScript
- \value NabataeanScript Since Qt 5.5
- \value NewaScript Since Qt 5.7
- \value NewTaiLueScript Since Qt 5.1
- \value NkoScript Since Qt 5.1
- \value OghamScript Since Qt 5.1
- \value OlChikiScript Since Qt 5.1
- \value OldHungarianScript Since Qt 5.7
- \value OldItalicScript Since Qt 5.1
- \value OldNorthArabianScript Since Qt 5.5
- \value OldPermicScript Since Qt 5.5
- \value OldPersianScript Since Qt 5.1
- \value OldSouthArabianScript Since Qt 5.1
- \value OdiaScript Since 6.0
+ \value [since 5.5] NabataeanScript
+ \value [since 5.7] NewaScript
+ \value [since 5.1] NewTaiLueScript
+ \value [since 5.1] NkoScript
+ \value [since 5.1] OghamScript
+ \value [since 5.1] OlChikiScript
+ \value [since 5.7] OldHungarianScript
+ \value [since 5.1] OldItalicScript
+ \value [since 5.5] OldNorthArabianScript
+ \value [since 5.5] OldPermicScript
+ \value [since 5.1] OldPersianScript
+ \value [since 5.1] OldSouthArabianScript
+ \value [since 6.0] OdiaScript
\value OriyaScript Obsolete, please use OdiaScript
- \value OrkhonScript Since Qt 5.1
- \value OsageScript Since Qt 5.7
- \value OsmanyaScript Since Qt 5.1
- \value PahawhHmongScript Since Qt 5.5
- \value PalmyreneScript Since Qt 5.5
- \value PauCinHauScript Since Qt 5.5
- \value PhagsPaScript Since Qt 5.1
- \value PhoenicianScript Since Qt 5.1
- \value PollardPhoneticScript Since Qt 5.1
- \value PsalterPahlaviScript Since Qt 5.5
- \value RejangScript Since Qt 5.1
- \value RunicScript Since Qt 5.1
- \value SamaritanScript Since Qt 5.1
- \value SaurashtraScript Since Qt 5.1
- \value SharadaScript Since Qt 5.1
- \value ShavianScript Since Qt 5.1
- \value SiddhamScript Since Qt 5.5
- \value SignWritingScript Since Qt 5.7
+ \value [since 5.1] OrkhonScript
+ \value [since 5.7] OsageScript
+ \value [since 5.1] OsmanyaScript
+ \value [since 5.5] PahawhHmongScript
+ \value [since 5.5] PalmyreneScript
+ \value [since 5.5] PauCinHauScript
+ \value [since 5.1] PhagsPaScript
+ \value [since 5.1] PhoenicianScript
+ \value [since 5.1] PollardPhoneticScript
+ \value [since 5.5] PsalterPahlaviScript
+ \value [since 5.1] RejangScript
+ \value [since 5.1] RunicScript
+ \value [since 5.1] SamaritanScript
+ \value [since 5.1] SaurashtraScript
+ \value [since 5.1] SharadaScript
+ \value [since 5.1] ShavianScript
+ \value [since 5.5] SiddhamScript
+ \value [since 5.7] SignWritingScript
\value SimplifiedChineseScript same as SimplifiedHanScript
\value SimplifiedHanScript same as SimplifiedChineseScript
\value SinhalaScript
- \value SoraSompengScript Since Qt 5.1
- \value SundaneseScript Since Qt 5.1
- \value SylotiNagriScript Since Qt 5.1
+ \value [since 5.1] SoraSompengScript
+ \value [since 5.1] SundaneseScript
+ \value [since 5.1] SylotiNagriScript
\value SyriacScript
- \value TagalogScript Since Qt 5.1
- \value TagbanwaScript Since Qt 5.1
- \value TaiLeScript Since Qt 5.1
- \value TaiVietScript Since Qt 5.1
- \value TakriScript Since Qt 5.1
+ \value [since 5.1] TagalogScript
+ \value [since 5.1] TagbanwaScript
+ \value [since 5.1] TaiLeScript
+ \value [since 5.1] TaiVietScript
+ \value [since 5.1] TakriScript
\value TamilScript
- \value TangutScript Since Qt 5.7
+ \value [since 5.7] TangutScript
\value TeluguScript
\value ThaanaScript
\value ThaiScript
\value TibetanScript
\value TifinaghScript
- \value TirhutaScript Since Qt 5.5
+ \value [since 5.5] TirhutaScript
\value TraditionalChineseScript same as TraditionalHanScript
\value TraditionalHanScript same as TraditionalChineseScript
- \value UgariticScript Since Qt 5.1
+ \value [since 5.1] UgariticScript
\value VaiScript
- \value VarangKshitiScript Since Qt 5.5
+ \value [since 5.5] VarangKshitiScript
\value YiScript
\omitvalue LastScript
@@ -1033,6 +1024,25 @@
\since 4.4
*/
+/*!
+ \enum QLocale::LanguageCodeType
+
+ This enum defines language code types that can be used to restrict set
+ of language codes considered by \c codeToLanguage and \c languageToCode.
+
+ \value ISO639Part1 ISO 639 Part 1 Alpha 2 code.
+ \value ISO639Part2B ISO 639 Part 2 bibliographic Alpha 3 code.
+ \value ISO639Part2T ISO 639 Part 2 terminological Alpha 3 code.
+ \value ISO639Part3 ISO 639 Part 3 Alpha 3 code.
+ \value LegacyLanguageCode Codes that are not part of the above set, but that
+ were supported by Qt in the past. This value can only be used by
+ codeToLanguage(). It is ignored when passed to languageToCode().
+ \value ISO639Part2 Any ISO 639 Part 2 code.
+ \value ISO639Alpha2 Any ISO-639 2-letter code.
+ \value ISO639Alpha3 Any ISO-639 3-letter code.
+ \value ISO639 Any ISO 639 code.
+ \value AnyLanguageCode Specifies that any code can be used.
+*/
/*!
\fn bool QLocale::operator==(const QLocale &lhs, const QLocale &rhs)
@@ -1143,7 +1153,7 @@
*/
/*!
- \fn QVariant QSystemLocale::query(QueryType type, QVariant in = QVariant()) const
+ \fn QVariant QSystemLocale::query(QueryType type, QVariant &&in = QVariant()) const
Generic query method for locale data. Provides indirection.
Denotes the \a type of the query
diff --git a/src/corelib/text/qlocale_data_p.h b/src/corelib/text/qlocale_data_p.h
index 4bd4d256b4..6175398dd9 100644
--- a/src/corelib/text/qlocale_data_p.h
+++ b/src/corelib/text/qlocale_data_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2019 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2019 The Qt Company Ltd.
+// SPDX-License-Identifier: Unicode-3.0
#ifndef QLOCALE_DATA_P_H
#define QLOCALE_DATA_P_H
@@ -51,34 +15,71 @@
// We mean it.
//
-#include <QtCore/private/qglobal_p.h>
+#include <QtCore/qendian.h>
+#include <QtCore/private/qlocale_p.h>
+
+#include <array>
+#include <cstring> // std::memcmp
QT_BEGIN_NAMESPACE
-/* This part of the file isn't generated, but written by hand since
- * Unicode CLDR doesn't contain measurement system information.
- */
+/* This part of the file isn't generated, but written by hand. Unicode CLDR's
+ information about measurement systems doesn't say which to use by default in
+ each locale. Even if it did, adding another entry in every locale's row of
+ locale_data[] would take up much more memory than the small table below.
+*/
struct TerritoryLanguage
{
quint16 languageId;
quint16 territoryId;
QLocale::MeasurementSystem system;
};
-static const TerritoryLanguage ImperialMeasurementSystems[] = {
+static constexpr TerritoryLanguage ImperialMeasurementSystems[] = {
{ QLocale::English, QLocale::UnitedStates, QLocale::ImperialUSSystem },
{ QLocale::English, QLocale::UnitedStatesMinorOutlyingIslands, QLocale::ImperialUSSystem },
{ QLocale::Spanish, QLocale::UnitedStates, QLocale::ImperialUSSystem },
{ QLocale::Hawaiian, QLocale::UnitedStates, QLocale::ImperialUSSystem },
{ QLocale::English, QLocale::UnitedKingdom, QLocale::ImperialUKSystem }
};
-static const int ImperialMeasurementSystemsCount =
- sizeof(ImperialMeasurementSystems)/sizeof(ImperialMeasurementSystems[0]);
+
+/*
+ Storage for alpha codes with length of up to 4 allowing efficient comparison.
+*/
+struct AlphaCode {
+ constexpr AlphaCode(char c1 = 0, char c2 = 0, char c3 = 0)
+ : c1(c2m(c1)), c2(c2m(c2)), c3(c2m(c3)), reserved(0) { }
+
+ uint16_t c1: 5, c2:5, c3: 5, reserved:1;
+
+ bool isValid() const noexcept { return c1 != 0; }
+
+ std::array<char, 4> decode() const { return {m2c(c1), m2c(c2), m2c(c3), 0}; }
+
+private:
+ static constexpr uint16_t c2m(char c) { return c ? c - 'a' + 1 : 0; }
+ static constexpr char m2c (uint16_t c) { return c ? c + 'a' - 1 : 0; }
+
+ friend bool operator==(AlphaCode lhs, AlphaCode rhs) noexcept
+ {
+ static_assert(std::has_unique_object_representations_v<AlphaCode>,
+ "memcmp() cannot be used to implement equality on "
+ "types that don't have unique object representations");
+ return std::memcmp(&lhs, &rhs, sizeof(lhs)) == 0;
+ }
+};
+
+struct LanguageCodeEntry {
+ AlphaCode part1;
+ AlphaCode part2B;
+ AlphaCode part2T;
+ AlphaCode part3;
+};
// GENERATED PART STARTS HERE
/*
- This part of the file was generated on 2021-11-09 from the
- Common Locale Data Repository v40
+ This part of the file was generated on 2024-04-04 from the
+ Common Locale Data Repository v44.1
http://www.unicode.org/cldr/
@@ -87,7 +88,7 @@ static const int ImperialMeasurementSystemsCount =
edited) CLDR data; see qtbase/util/locale_database/.
*/
-static const QLocaleId likely_subtags[] = {
+static constexpr QLocaleId likely_subtags[] = {
{ 2, 0, 0 }, { 2, 27, 90 }, // ab -> ab_Cyrl_GE
{ 3, 0, 0 }, { 3, 66, 77 }, // aa -> aa_Latn_ET
{ 4, 0, 0 }, { 4, 66, 216 }, // af -> af_Latn_ZA
@@ -233,6 +234,7 @@ static const QLocaleId likely_subtags[] = {
{ 112, 0, 0 }, { 112, 66, 111 }, // id -> id_Latn_ID
{ 113, 0, 0 }, { 113, 27, 193 }, // inh -> inh_Cyrl_RU
{ 114, 0, 0 }, { 114, 66, 258 }, // ia -> ia_Latn_001
+ { 115, 0, 0 }, { 115, 66, 75 }, // ie -> ie_Latn_EE
{ 116, 0, 0 }, { 116, 18, 41 }, // iu -> iu_Cans_CA
{ 117, 0, 0 }, { 117, 66, 248 }, // ik -> ik_Latn_US
{ 118, 0, 0 }, { 118, 66, 114 }, // ga -> ga_Latn_IE
@@ -248,7 +250,8 @@ static const QLocaleId likely_subtags[] = {
{ 128, 0, 0 }, { 128, 66, 124 }, // kln -> kln_Latn_KE
{ 129, 0, 0 }, { 129, 66, 124 }, // kam -> kam_Latn_KE
{ 130, 0, 0 }, { 130, 56, 110 }, // kn -> kn_Knda_IN
- { 131, 0, 0 }, { 131, 66, 0 }, // kr -> kr_Latn
+ { 131, 4, 0 }, { 131, 4, 169 }, // kr_Arab -> kr_Arab_NG
+ { 131, 0, 0 }, { 131, 66, 169 }, // kr -> kr_Latn_NG
{ 132, 0, 0 }, { 132, 4, 110 }, // ks -> ks_Arab_IN
{ 133, 0, 1 }, { 133, 4, 1 }, // kk_AF -> kk_Arab_AF
{ 133, 0, 50 }, { 133, 4, 50 }, // kk_CN -> kk_Arab_CN
@@ -349,6 +352,7 @@ static const QLocaleId likely_subtags[] = {
{ 213, 0, 0 }, { 213, 66, 243 }, // nyn -> nyn_Latn_UG
{ 214, 0, 0 }, { 214, 66, 84 }, // oc -> oc_Latn_FR
{ 215, 0, 0 }, { 215, 91, 110 }, // or -> or_Orya_IN
+ { 216, 0, 0 }, { 216, 18, 41 }, // oj -> oj_Cans_CA
{ 217, 0, 0 }, { 217, 92, 114 }, // sga -> sga_Ogam_IE
{ 218, 0, 0 }, { 218, 111, 225 }, // non -> non_Runr_SE
{ 219, 0, 0 }, { 219, 98, 112 }, // peo -> peo_Xpeo_IR
@@ -358,13 +362,20 @@ static const QLocaleId likely_subtags[] = {
{ 223, 109, 0 }, { 223, 109, 50 }, // pal_Phlp -> pal_Phlp_CN
{ 223, 0, 0 }, { 223, 50, 112 }, // pal -> pal_Phli_IR
{ 224, 0, 0 }, { 224, 66, 179 }, // pau -> pau_Latn_PW
- { 226, 0, 0 }, { 226, 66, 13 }, // pap -> pap_Latn_AW
+ { 225, 14, 0 }, { 225, 14, 110 }, // pi_Brah -> pi_Brah_IN
+ { 225, 29, 0 }, { 225, 29, 110 }, // pi_Deva -> pi_Deva_IN
+ { 225, 59, 0 }, { 225, 59, 110 }, // pi_Khar -> pi_Khar_IN
+ { 225, 60, 0 }, { 225, 60, 110 }, // pi_Khmr -> pi_Khmr_IN
+ { 225, 86, 0 }, { 225, 86, 110 }, // pi_Mymr -> pi_Mymr_IN
+ { 225, 133, 0 }, { 225, 133, 110 }, // pi_Thai -> pi_Thai_IN
+ { 225, 0, 0 }, { 225, 119, 110 }, // pi -> pi_Sinh_IN
+ { 226, 0, 0 }, { 226, 66, 62 }, // pap -> pap_Latn_CW
{ 227, 0, 0 }, { 227, 4, 1 }, // ps -> ps_Arab_AF
{ 228, 0, 0 }, { 228, 4, 112 }, // fa -> fa_Arab_IR
{ 229, 0, 0 }, { 229, 107, 132 }, // phn -> phn_Phnx_LB
{ 230, 0, 0 }, { 230, 66, 187 }, // pl -> pl_Latn_PL
{ 231, 0, 0 }, { 231, 66, 32 }, // pt -> pt_Latn_BR
- { 232, 0, 0 }, { 232, 66, 258 }, // prg -> prg_Latn_001
+ { 232, 0, 0 }, { 232, 66, 187 }, // prg -> prg_Latn_PL
{ 233, 0, 178 }, { 233, 4, 178 }, // pa_PK -> pa_Arab_PK
{ 233, 4, 0 }, { 233, 4, 178 }, // pa_Arab -> pa_Arab_PK
{ 233, 0, 0 }, { 233, 41, 110 }, // pa -> pa_Guru_IN
@@ -397,6 +408,7 @@ static const QLocaleId likely_subtags[] = {
{ 256, 0, 0 }, { 256, 66, 117 }, // scn -> scn_Latn_IT
{ 257, 0, 0 }, { 257, 66, 77 }, // sid -> sid_Latn_ET
{ 258, 0, 0 }, { 258, 66, 187 }, // szl -> szl_Latn_PL
+ { 259, 0, 110 }, { 259, 29, 110 }, // sd_IN -> sd_Deva_IN
{ 259, 29, 0 }, { 259, 29, 110 }, // sd_Deva -> sd_Deva_IN
{ 259, 61, 0 }, { 259, 61, 110 }, // sd_Khoj -> sd_Khoj_IN
{ 259, 62, 0 }, { 259, 62, 110 }, // sd_Sind -> sd_Sind_IN
@@ -472,253 +484,471 @@ static const QLocaleId likely_subtags[] = {
{ 320, 0, 0 }, { 320, 66, 206 }, // wo -> wo_Latn_SN
{ 321, 0, 0 }, { 321, 66, 216 }, // xh -> xh_Latn_ZA
{ 322, 0, 0 }, { 322, 66, 40 }, // yav -> yav_Latn_CM
- { 323, 0, 0 }, { 323, 47, 258 }, // yi -> yi_Hebr_001
+ { 323, 0, 0 }, { 323, 47, 244 }, // yi -> yi_Hebr_UA
{ 324, 0, 0 }, { 324, 66, 169 }, // yo -> yo_Latn_NG
{ 325, 0, 0 }, { 325, 66, 170 }, // dje -> dje_Latn_NE
{ 326, 0, 0 }, { 326, 66, 50 }, // za -> za_Latn_CN
{ 327, 0, 0 }, { 327, 66, 216 }, // zu -> zu_Latn_ZA
{ 328, 0, 0 }, { 328, 66, 32 }, // kgp -> kgp_Latn_BR
{ 329, 0, 0 }, { 329, 66, 32 }, // yrl -> yrl_Latn_BR
+ { 330, 0, 0 }, { 330, 29, 110 }, // bgc -> bgc_Deva_IN
+ { 331, 0, 0 }, { 331, 66, 91 }, // frr -> frr_Latn_DE
+ { 332, 0, 0 }, { 332, 29, 110 }, // raj -> raj_Deva_IN
+ { 333, 0, 0 }, { 333, 27, 193 }, // mdf -> mdf_Cyrl_RU
+ { 334, 0, 0 }, { 334, 66, 258 }, // tok -> tok_Latn_001
+ { 335, 0, 0 }, { 335, 66, 214 }, // pis -> pis_Latn_SB
+ { 336, 0, 0 }, { 336, 66, 169 }, // ann -> ann_Latn_NG
+ { 337, 0, 0 }, { 337, 4, 178 }, // bal -> bal_Arab_PK
+ { 338, 0, 0 }, { 338, 66, 117 }, // lij -> lij_Latn_IT
+ { 339, 0, 0 }, { 339, 142, 161 }, // rhg -> rhg_Rohg_MM
+ { 340, 0, 0 }, { 340, 4, 178 }, // trw -> trw_Arab_PK
+ { 341, 0, 0 }, { 341, 66, 25 }, // blo -> blo_Latn_BJ
+ { 342, 0, 0 }, { 342, 29, 110 }, // xnr -> xnr_Deva_IN
+ { 343, 0, 0 }, { 343, 66, 117 }, // vec -> vec_Latn_IT
+ { 0, 4, 1 }, { 228, 4, 1 }, // und_Arab_AF -> fa_Arab_AF
{ 0, 66, 1 }, { 299, 66, 1 }, // und_Latn_AF -> tk_Latn_AF
{ 0, 0, 1 }, { 228, 4, 1 }, // und_AF -> fa_Arab_AF
+ { 0, 66, 2 }, { 275, 66, 2 }, // und_Latn_AX -> sv_Latn_AX
{ 0, 0, 2 }, { 275, 66, 2 }, // und_AX -> sv_Latn_AX
{ 0, 27, 3 }, { 169, 27, 3 }, // und_Cyrl_AL -> mk_Cyrl_AL
+ { 0, 66, 3 }, { 9, 66, 3 }, // und_Latn_AL -> sq_Latn_AL
{ 0, 0, 3 }, { 9, 66, 3 }, // und_AL -> sq_Latn_AL
{ 0, 66, 4 }, { 85, 66, 4 }, // und_Latn_DZ -> fr_Latn_DZ
{ 0, 0, 4 }, { 14, 4, 4 }, // und_DZ -> ar_Arab_DZ
+ { 0, 66, 5 }, { 244, 66, 5 }, // und_Latn_AS -> sm_Latn_AS
{ 0, 0, 5 }, { 244, 66, 5 }, // und_AS -> sm_Latn_AS
+ { 0, 66, 6 }, { 48, 66, 6 }, // und_Latn_AD -> ca_Latn_AD
{ 0, 0, 6 }, { 48, 66, 6 }, // und_AD -> ca_Latn_AD
+ { 0, 66, 7 }, { 231, 66, 7 }, // und_Latn_AO -> pt_Latn_AO
{ 0, 0, 7 }, { 231, 66, 7 }, // und_AO -> pt_Latn_AO
- { 0, 0, 9 }, { 0, 66, 9 }, // und_AQ -> und_Latn_AQ
+ { 0, 0, 8 }, { 75, 66, 8 }, // und_AI -> en_Latn_AI
+ { 0, 0, 9 }, { 75, 66, 9 }, // und_AQ -> en_Latn_AQ
+ { 0, 0, 10 }, { 75, 66, 10 }, // und_AG -> en_Latn_AG
+ { 0, 66, 11 }, { 270, 66, 11 }, // und_Latn_AR -> es_Latn_AR
{ 0, 0, 11 }, { 270, 66, 11 }, // und_AR -> es_Latn_AR
{ 0, 66, 12 }, { 148, 66, 12 }, // und_Latn_AM -> ku_Latn_AM
{ 0, 0, 12 }, { 17, 5, 12 }, // und_AM -> hy_Armn_AM
+ { 0, 66, 13 }, { 72, 66, 13 }, // und_Latn_AW -> nl_Latn_AW
{ 0, 0, 13 }, { 72, 66, 13 }, // und_AW -> nl_Latn_AW
+ { 0, 0, 14 }, { 75, 66, 14 }, // und_AC -> en_Latn_AC
+ { 0, 0, 15 }, { 75, 66, 15 }, // und_AU -> en_Latn_AU
+ { 0, 66, 16 }, { 94, 66, 16 }, // und_Latn_AT -> de_Latn_AT
{ 0, 0, 16 }, { 94, 66, 16 }, // und_AT -> de_Latn_AT
+ { 0, 66, 17 }, { 25, 66, 17 }, // und_Latn_AZ -> az_Latn_AZ
{ 0, 0, 17 }, { 25, 66, 17 }, // und_AZ -> az_Latn_AZ
+ { 0, 0, 18 }, { 75, 66, 18 }, // und_BS -> en_Latn_BS
{ 0, 0, 19 }, { 14, 4, 19 }, // und_BH -> ar_Arab_BH
{ 0, 0, 20 }, { 30, 9, 20 }, // und_BD -> bn_Beng_BD
+ { 0, 0, 21 }, { 75, 66, 21 }, // und_BB -> en_Latn_BB
+ { 0, 27, 22 }, { 35, 27, 22 }, // und_Cyrl_BY -> be_Cyrl_BY
{ 0, 0, 22 }, { 35, 27, 22 }, // und_BY -> be_Cyrl_BY
+ { 0, 66, 23 }, { 72, 66, 23 }, // und_Latn_BE -> nl_Latn_BE
{ 0, 0, 23 }, { 72, 66, 23 }, // und_BE -> nl_Latn_BE
+ { 0, 0, 24 }, { 75, 66, 24 }, // und_BZ -> en_Latn_BZ
+ { 0, 66, 25 }, { 85, 66, 25 }, // und_Latn_BJ -> fr_Latn_BJ
{ 0, 0, 25 }, { 85, 66, 25 }, // und_BJ -> fr_Latn_BJ
+ { 0, 0, 26 }, { 75, 66, 26 }, // und_BM -> en_Latn_BM
{ 0, 29, 27 }, { 199, 29, 27 }, // und_Deva_BT -> ne_Deva_BT
+ { 0, 134, 27 }, { 73, 134, 27 }, // und_Tibt_BT -> dz_Tibt_BT
{ 0, 0, 27 }, { 73, 134, 27 }, // und_BT -> dz_Tibt_BT
+ { 0, 66, 28 }, { 270, 66, 28 }, // und_Latn_BO -> es_Latn_BO
{ 0, 0, 28 }, { 270, 66, 28 }, // und_BO -> es_Latn_BO
{ 0, 27, 29 }, { 252, 27, 29 }, // und_Cyrl_BA -> sr_Cyrl_BA
+ { 0, 66, 29 }, { 42, 66, 29 }, // und_Latn_BA -> bs_Latn_BA
{ 0, 0, 29 }, { 42, 66, 29 }, // und_BA -> bs_Latn_BA
- { 0, 0, 31 }, { 0, 66, 31 }, // und_BV -> und_Latn_BV
+ { 0, 0, 30 }, { 75, 66, 30 }, // und_BW -> en_Latn_BW
+ { 0, 0, 31 }, { 75, 66, 31 }, // und_BV -> en_Latn_BV
+ { 0, 66, 32 }, { 231, 66, 32 }, // und_Latn_BR -> pt_Latn_BR
{ 0, 0, 32 }, { 231, 66, 32 }, // und_BR -> pt_Latn_BR
+ { 0, 0, 33 }, { 75, 66, 33 }, // und_IO -> en_Latn_IO
+ { 0, 0, 34 }, { 75, 66, 34 }, // und_VG -> en_Latn_VG
+ { 0, 66, 35 }, { 176, 66, 35 }, // und_Latn_BN -> ms_Latn_BN
{ 0, 0, 35 }, { 176, 66, 35 }, // und_BN -> ms_Latn_BN
+ { 0, 27, 36 }, { 45, 27, 36 }, // und_Cyrl_BG -> bg_Cyrl_BG
{ 0, 0, 36 }, { 45, 27, 36 }, // und_BG -> bg_Cyrl_BG
+ { 0, 66, 37 }, { 85, 66, 37 }, // und_Latn_BF -> fr_Latn_BF
{ 0, 0, 37 }, { 85, 66, 37 }, // und_BF -> fr_Latn_BF
+ { 0, 66, 38 }, { 238, 66, 38 }, // und_Latn_BI -> rn_Latn_BI
{ 0, 0, 38 }, { 238, 66, 38 }, // und_BI -> rn_Latn_BI
{ 0, 0, 39 }, { 135, 60, 39 }, // und_KH -> km_Khmr_KH
+ { 0, 66, 40 }, { 85, 66, 40 }, // und_Latn_CM -> fr_Latn_CM
{ 0, 0, 40 }, { 85, 66, 40 }, // und_CM -> fr_Latn_CM
- { 0, 47, 41 }, { 323, 47, 41 }, // und_Hebr_CA -> yi_Hebr_CA
+ { 0, 137, 41 }, { 47, 137, 41 }, // und_Hant_CA -> yue_Hant_CA
+ { 0, 0, 41 }, { 75, 66, 41 }, // und_CA -> en_Latn_CA
+ { 0, 66, 42 }, { 270, 66, 42 }, // und_Latn_IC -> es_Latn_IC
{ 0, 0, 42 }, { 270, 66, 42 }, // und_IC -> es_Latn_IC
+ { 0, 66, 43 }, { 231, 66, 43 }, // und_Latn_CV -> pt_Latn_CV
{ 0, 0, 43 }, { 231, 66, 43 }, // und_CV -> pt_Latn_CV
+ { 0, 66, 44 }, { 226, 66, 44 }, // und_Latn_BQ -> pap_Latn_BQ
{ 0, 0, 44 }, { 226, 66, 44 }, // und_BQ -> pap_Latn_BQ
+ { 0, 0, 45 }, { 75, 66, 45 }, // und_KY -> en_Latn_KY
+ { 0, 66, 46 }, { 85, 66, 46 }, // und_Latn_CF -> fr_Latn_CF
{ 0, 0, 46 }, { 85, 66, 46 }, // und_CF -> fr_Latn_CF
+ { 0, 66, 47 }, { 270, 66, 47 }, // und_Latn_EA -> es_Latn_EA
{ 0, 0, 47 }, { 270, 66, 47 }, // und_EA -> es_Latn_EA
+ { 0, 66, 48 }, { 85, 66, 48 }, // und_Latn_TD -> fr_Latn_TD
{ 0, 0, 48 }, { 85, 66, 48 }, // und_TD -> fr_Latn_TD
+ { 0, 66, 49 }, { 270, 66, 49 }, // und_Latn_CL -> es_Latn_CL
{ 0, 0, 49 }, { 270, 66, 49 }, // und_CL -> es_Latn_CL
{ 0, 4, 50 }, { 306, 4, 50 }, // und_Arab_CN -> ug_Arab_CN
{ 0, 66, 50 }, { 326, 66, 50 }, // und_Latn_CN -> za_Latn_CN
{ 0, 0, 50 }, { 58, 118, 50 }, // und_CN -> zh_Hans_CN
- { 0, 0, 52 }, { 0, 66, 52 }, // und_CP -> und_Latn_CP
+ { 0, 0, 51 }, { 75, 66, 51 }, // und_CX -> en_Latn_CX
+ { 0, 0, 52 }, { 75, 66, 52 }, // und_CP -> en_Latn_CP
{ 0, 4, 53 }, { 176, 4, 53 }, // und_Arab_CC -> ms_Arab_CC
+ { 0, 0, 53 }, { 176, 4, 53 }, // und_CC -> ms_Arab_CC
+ { 0, 66, 54 }, { 270, 66, 54 }, // und_Latn_CO -> es_Latn_CO
{ 0, 0, 54 }, { 270, 66, 54 }, // und_CO -> es_Latn_CO
{ 0, 66, 55 }, { 85, 66, 55 }, // und_Latn_KM -> fr_Latn_KM
{ 0, 0, 55 }, { 14, 4, 55 }, // und_KM -> ar_Arab_KM
+ { 0, 66, 56 }, { 85, 66, 56 }, // und_Latn_CG -> fr_Latn_CG
{ 0, 0, 56 }, { 85, 66, 56 }, // und_CG -> fr_Latn_CG
+ { 0, 66, 57 }, { 273, 66, 57 }, // und_Latn_CD -> sw_Latn_CD
{ 0, 0, 57 }, { 273, 66, 57 }, // und_CD -> sw_Latn_CD
+ { 0, 0, 58 }, { 75, 66, 58 }, // und_CK -> en_Latn_CK
+ { 0, 66, 59 }, { 270, 66, 59 }, // und_Latn_CR -> es_Latn_CR
{ 0, 0, 59 }, { 270, 66, 59 }, // und_CR -> es_Latn_CR
+ { 0, 66, 60 }, { 66, 66, 60 }, // und_Latn_HR -> hr_Latn_HR
{ 0, 0, 60 }, { 66, 66, 60 }, // und_HR -> hr_Latn_HR
+ { 0, 66, 61 }, { 270, 66, 61 }, // und_Latn_CU -> es_Latn_CU
{ 0, 0, 61 }, { 270, 66, 61 }, // und_CU -> es_Latn_CU
+ { 0, 66, 62 }, { 226, 66, 62 }, // und_Latn_CW -> pap_Latn_CW
{ 0, 0, 62 }, { 226, 66, 62 }, // und_CW -> pap_Latn_CW
{ 0, 66, 63 }, { 298, 66, 63 }, // und_Latn_CY -> tr_Latn_CY
{ 0, 0, 63 }, { 96, 39, 63 }, // und_CY -> el_Grek_CY
+ { 0, 66, 64 }, { 67, 66, 64 }, // und_Latn_CZ -> cs_Latn_CZ
{ 0, 0, 64 }, { 67, 66, 64 }, // und_CZ -> cs_Latn_CZ
+ { 0, 66, 65 }, { 68, 66, 65 }, // und_Latn_DK -> da_Latn_DK
{ 0, 0, 65 }, { 68, 66, 65 }, // und_DK -> da_Latn_DK
+ { 0, 0, 66 }, { 75, 66, 66 }, // und_DG -> en_Latn_DG
+ { 0, 66, 67 }, { 3, 66, 67 }, // und_Latn_DJ -> aa_Latn_DJ
{ 0, 0, 67 }, { 3, 66, 67 }, // und_DJ -> aa_Latn_DJ
+ { 0, 0, 68 }, { 75, 66, 68 }, // und_DM -> en_Latn_DM
+ { 0, 66, 69 }, { 270, 66, 69 }, // und_Latn_DO -> es_Latn_DO
{ 0, 0, 69 }, { 270, 66, 69 }, // und_DO -> es_Latn_DO
+ { 0, 66, 70 }, { 270, 66, 70 }, // und_Latn_EC -> es_Latn_EC
{ 0, 0, 70 }, { 270, 66, 70 }, // und_EC -> es_Latn_EC
{ 0, 0, 71 }, { 14, 4, 71 }, // und_EG -> ar_Arab_EG
+ { 0, 66, 72 }, { 270, 66, 72 }, // und_Latn_SV -> es_Latn_SV
{ 0, 0, 72 }, { 270, 66, 72 }, // und_SV -> es_Latn_SV
+ { 0, 66, 73 }, { 270, 66, 73 }, // und_Latn_GQ -> es_Latn_GQ
{ 0, 0, 73 }, { 270, 66, 73 }, // und_GQ -> es_Latn_GQ
+ { 0, 33, 74 }, { 292, 33, 74 }, // und_Ethi_ER -> ti_Ethi_ER
{ 0, 0, 74 }, { 292, 33, 74 }, // und_ER -> ti_Ethi_ER
+ { 0, 66, 75 }, { 78, 66, 75 }, // und_Latn_EE -> et_Latn_EE
{ 0, 0, 75 }, { 78, 66, 75 }, // und_EE -> et_Latn_EE
+ { 0, 0, 76 }, { 75, 66, 76 }, // und_SZ -> en_Latn_SZ
{ 0, 66, 77 }, { 75, 66, 77 }, // und_Latn_ET -> en_Latn_ET
{ 0, 0, 77 }, { 11, 33, 77 }, // und_ET -> am_Ethi_ET
- { 0, 0, 78 }, { 239, 27, 193 }, // und_150 -> ru_Cyrl_RU
- { 0, 0, 79 }, { 75, 66, 114 }, // und_EU -> en_Latn_IE
+ { 0, 0, 80 }, { 75, 66, 80 }, // und_FK -> en_Latn_FK
+ { 0, 66, 81 }, { 81, 66, 81 }, // und_Latn_FO -> fo_Latn_FO
{ 0, 0, 81 }, { 81, 66, 81 }, // und_FO -> fo_Latn_FO
+ { 0, 0, 82 }, { 75, 66, 82 }, // und_FJ -> en_Latn_FJ
+ { 0, 66, 83 }, { 84, 66, 83 }, // und_Latn_FI -> fi_Latn_FI
{ 0, 0, 83 }, { 84, 66, 83 }, // und_FI -> fi_Latn_FI
+ { 0, 66, 84 }, { 85, 66, 84 }, // und_Latn_FR -> fr_Latn_FR
{ 0, 0, 84 }, { 85, 66, 84 }, // und_FR -> fr_Latn_FR
+ { 0, 66, 85 }, { 85, 66, 85 }, // und_Latn_GF -> fr_Latn_GF
{ 0, 0, 85 }, { 85, 66, 85 }, // und_GF -> fr_Latn_GF
+ { 0, 66, 86 }, { 85, 66, 86 }, // und_Latn_PF -> fr_Latn_PF
{ 0, 0, 86 }, { 85, 66, 86 }, // und_PF -> fr_Latn_PF
+ { 0, 66, 87 }, { 85, 66, 87 }, // und_Latn_TF -> fr_Latn_TF
{ 0, 0, 87 }, { 85, 66, 87 }, // und_TF -> fr_Latn_TF
+ { 0, 66, 88 }, { 85, 66, 88 }, // und_Latn_GA -> fr_Latn_GA
{ 0, 0, 88 }, { 85, 66, 88 }, // und_GA -> fr_Latn_GA
- { 0, 27, 90 }, { 222, 27, 90 }, // und_Cyrl_GE -> os_Cyrl_GE
+ { 0, 0, 89 }, { 75, 66, 89 }, // und_GM -> en_Latn_GM
+ { 0, 27, 90 }, { 2, 27, 90 }, // und_Cyrl_GE -> ab_Cyrl_GE
{ 0, 66, 90 }, { 148, 66, 90 }, // und_Latn_GE -> ku_Latn_GE
{ 0, 0, 90 }, { 93, 35, 90 }, // und_GE -> ka_Geor_GE
+ { 0, 66, 91 }, { 94, 66, 91 }, // und_Latn_DE -> de_Latn_DE
{ 0, 0, 91 }, { 94, 66, 91 }, // und_DE -> de_Latn_DE
+ { 0, 66, 92 }, { 6, 66, 92 }, // und_Latn_GH -> ak_Latn_GH
{ 0, 0, 92 }, { 6, 66, 92 }, // und_GH -> ak_Latn_GH
+ { 0, 0, 93 }, { 75, 66, 93 }, // und_GI -> en_Latn_GI
{ 0, 27, 94 }, { 169, 27, 94 }, // und_Cyrl_GR -> mk_Cyrl_GR
{ 0, 0, 94 }, { 96, 39, 94 }, // und_GR -> el_Grek_GR
+ { 0, 66, 95 }, { 127, 66, 95 }, // und_Latn_GL -> kl_Latn_GL
{ 0, 0, 95 }, { 127, 66, 95 }, // und_GL -> kl_Latn_GL
+ { 0, 0, 96 }, { 75, 66, 96 }, // und_GD -> en_Latn_GD
+ { 0, 66, 97 }, { 85, 66, 97 }, // und_Latn_GP -> fr_Latn_GP
{ 0, 0, 97 }, { 85, 66, 97 }, // und_GP -> fr_Latn_GP
+ { 0, 0, 98 }, { 75, 66, 98 }, // und_GU -> en_Latn_GU
+ { 0, 66, 99 }, { 270, 66, 99 }, // und_Latn_GT -> es_Latn_GT
{ 0, 0, 99 }, { 270, 66, 99 }, // und_GT -> es_Latn_GT
+ { 0, 0, 100 }, { 75, 66, 100 }, // und_GG -> en_Latn_GG
+ { 0, 66, 101 }, { 231, 66, 101 }, // und_Latn_GW -> pt_Latn_GW
{ 0, 0, 101 }, { 231, 66, 101 }, // und_GW -> pt_Latn_GW
+ { 0, 66, 102 }, { 85, 66, 102 }, // und_Latn_GN -> fr_Latn_GN
{ 0, 0, 102 }, { 85, 66, 102 }, // und_GN -> fr_Latn_GN
+ { 0, 0, 103 }, { 75, 66, 103 }, // und_GY -> en_Latn_GY
+ { 0, 66, 104 }, { 100, 66, 104 }, // und_Latn_HT -> ht_Latn_HT
{ 0, 0, 104 }, { 100, 66, 104 }, // und_HT -> ht_Latn_HT
- { 0, 0, 105 }, { 0, 66, 105 }, // und_HM -> und_Latn_HM
+ { 0, 0, 105 }, { 75, 66, 105 }, // und_HM -> en_Latn_HM
+ { 0, 66, 106 }, { 270, 66, 106 }, // und_Latn_HN -> es_Latn_HN
{ 0, 0, 106 }, { 270, 66, 106 }, // und_HN -> es_Latn_HN
{ 0, 0, 107 }, { 58, 137, 107 }, // und_HK -> zh_Hant_HK
+ { 0, 66, 108 }, { 107, 66, 108 }, // und_Latn_HU -> hu_Latn_HU
{ 0, 0, 108 }, { 107, 66, 108 }, // und_HU -> hu_Latn_HU
+ { 0, 66, 109 }, { 108, 66, 109 }, // und_Latn_IS -> is_Latn_IS
{ 0, 0, 109 }, { 108, 66, 109 }, // und_IS -> is_Latn_IS
{ 0, 4, 110 }, { 305, 4, 110 }, // und_Arab_IN -> ur_Arab_IN
{ 0, 0, 110 }, { 105, 29, 110 }, // und_IN -> hi_Deva_IN
{ 0, 4, 111 }, { 176, 4, 111 }, // und_Arab_ID -> ms_Arab_ID
+ { 0, 66, 111 }, { 112, 66, 111 }, // und_Latn_ID -> id_Latn_ID
{ 0, 0, 111 }, { 112, 66, 111 }, // und_ID -> id_Latn_ID
+ { 0, 4, 112 }, { 228, 4, 112 }, // und_Arab_IR -> fa_Arab_IR
{ 0, 66, 112 }, { 299, 66, 112 }, // und_Latn_IR -> tk_Latn_IR
{ 0, 0, 112 }, { 228, 4, 112 }, // und_IR -> fa_Arab_IR
{ 0, 0, 113 }, { 14, 4, 113 }, // und_IQ -> ar_Arab_IQ
+ { 0, 0, 114 }, { 75, 66, 114 }, // und_IE -> en_Latn_IE
+ { 0, 0, 115 }, { 75, 66, 115 }, // und_IM -> en_Latn_IM
{ 0, 0, 116 }, { 103, 47, 116 }, // und_IL -> he_Hebr_IL
+ { 0, 66, 117 }, { 119, 66, 117 }, // und_Latn_IT -> it_Latn_IT
{ 0, 0, 117 }, { 119, 66, 117 }, // und_IT -> it_Latn_IT
+ { 0, 66, 118 }, { 85, 66, 118 }, // und_Latn_CI -> fr_Latn_CI
{ 0, 0, 118 }, { 85, 66, 118 }, // und_CI -> fr_Latn_CI
+ { 0, 0, 119 }, { 75, 66, 119 }, // und_JM -> en_Latn_JM
{ 0, 0, 120 }, { 120, 53, 120 }, // und_JP -> ja_Jpan_JP
+ { 0, 0, 121 }, { 75, 66, 121 }, // und_JE -> en_Latn_JE
{ 0, 0, 122 }, { 14, 4, 122 }, // und_JO -> ar_Arab_JO
{ 0, 0, 123 }, { 239, 27, 123 }, // und_KZ -> ru_Cyrl_KZ
+ { 0, 66, 124 }, { 273, 66, 124 }, // und_Latn_KE -> sw_Latn_KE
{ 0, 0, 124 }, { 273, 66, 124 }, // und_KE -> sw_Latn_KE
+ { 0, 0, 125 }, { 75, 66, 125 }, // und_KI -> en_Latn_KI
{ 0, 27, 126 }, { 252, 27, 126 }, // und_Cyrl_XK -> sr_Cyrl_XK
+ { 0, 66, 126 }, { 9, 66, 126 }, // und_Latn_XK -> sq_Latn_XK
{ 0, 0, 126 }, { 9, 66, 126 }, // und_XK -> sq_Latn_XK
{ 0, 0, 127 }, { 14, 4, 127 }, // und_KW -> ar_Arab_KW
+ { 0, 27, 128 }, { 150, 27, 128 }, // und_Cyrl_KG -> ky_Cyrl_KG
{ 0, 0, 128 }, { 150, 27, 128 }, // und_KG -> ky_Cyrl_KG
{ 0, 0, 129 }, { 153, 65, 129 }, // und_LA -> lo_Laoo_LA
+ { 0, 66, 130 }, { 270, 66, 130 }, // und_Latn_419 -> es_Latn_419
{ 0, 0, 130 }, { 270, 66, 130 }, // und_419 -> es_Latn_419
+ { 0, 66, 131 }, { 155, 66, 131 }, // und_Latn_LV -> lv_Latn_LV
{ 0, 0, 131 }, { 155, 66, 131 }, // und_LV -> lv_Latn_LV
{ 0, 0, 132 }, { 14, 4, 132 }, // und_LB -> ar_Arab_LB
+ { 0, 66, 133 }, { 268, 66, 133 }, // und_Latn_LS -> st_Latn_LS
{ 0, 0, 133 }, { 268, 66, 133 }, // und_LS -> st_Latn_LS
+ { 0, 0, 134 }, { 75, 66, 134 }, // und_LR -> en_Latn_LR
{ 0, 0, 135 }, { 14, 4, 135 }, // und_LY -> ar_Arab_LY
+ { 0, 66, 136 }, { 94, 66, 136 }, // und_Latn_LI -> de_Latn_LI
{ 0, 0, 136 }, { 94, 66, 136 }, // und_LI -> de_Latn_LI
+ { 0, 66, 137 }, { 160, 66, 137 }, // und_Latn_LT -> lt_Latn_LT
{ 0, 0, 137 }, { 160, 66, 137 }, // und_LT -> lt_Latn_LT
+ { 0, 66, 138 }, { 85, 66, 138 }, // und_Latn_LU -> fr_Latn_LU
{ 0, 0, 138 }, { 85, 66, 138 }, // und_LU -> fr_Latn_LU
{ 0, 66, 139 }, { 231, 66, 139 }, // und_Latn_MO -> pt_Latn_MO
{ 0, 0, 139 }, { 58, 137, 139 }, // und_MO -> zh_Hant_MO
+ { 0, 27, 140 }, { 169, 27, 140 }, // und_Cyrl_MK -> mk_Cyrl_MK
{ 0, 66, 140 }, { 9, 66, 140 }, // und_Latn_MK -> sq_Latn_MK
{ 0, 0, 140 }, { 169, 27, 140 }, // und_MK -> mk_Cyrl_MK
+ { 0, 66, 141 }, { 174, 66, 141 }, // und_Latn_MG -> mg_Latn_MG
{ 0, 0, 141 }, { 174, 66, 141 }, // und_MG -> mg_Latn_MG
+ { 0, 0, 142 }, { 75, 66, 142 }, // und_MW -> en_Latn_MW
+ { 0, 66, 143 }, { 176, 66, 143 }, // und_Latn_MY -> ms_Latn_MY
{ 0, 0, 143 }, { 176, 66, 143 }, // und_MY -> ms_Latn_MY
{ 0, 0, 144 }, { 69, 132, 144 }, // und_MV -> dv_Thaa_MV
+ { 0, 66, 145 }, { 28, 66, 145 }, // und_Latn_ML -> bm_Latn_ML
{ 0, 0, 145 }, { 28, 66, 145 }, // und_ML -> bm_Latn_ML
+ { 0, 66, 146 }, { 177, 66, 146 }, // und_Latn_MT -> mt_Latn_MT
{ 0, 0, 146 }, { 177, 66, 146 }, // und_MT -> mt_Latn_MT
+ { 0, 0, 147 }, { 75, 66, 147 }, // und_MH -> en_Latn_MH
+ { 0, 66, 148 }, { 85, 66, 148 }, // und_Latn_MQ -> fr_Latn_MQ
{ 0, 0, 148 }, { 85, 66, 148 }, // und_MQ -> fr_Latn_MQ
{ 0, 66, 149 }, { 85, 66, 149 }, // und_Latn_MR -> fr_Latn_MR
{ 0, 0, 149 }, { 14, 4, 149 }, // und_MR -> ar_Arab_MR
{ 0, 4, 150 }, { 305, 4, 150 }, // und_Arab_MU -> ur_Arab_MU
{ 0, 29, 150 }, { 38, 29, 150 }, // und_Deva_MU -> bho_Deva_MU
+ { 0, 66, 150 }, { 192, 66, 150 }, // und_Latn_MU -> mfe_Latn_MU
{ 0, 0, 150 }, { 192, 66, 150 }, // und_MU -> mfe_Latn_MU
+ { 0, 66, 151 }, { 85, 66, 151 }, // und_Latn_YT -> fr_Latn_YT
{ 0, 0, 151 }, { 85, 66, 151 }, // und_YT -> fr_Latn_YT
+ { 0, 66, 152 }, { 270, 66, 152 }, // und_Latn_MX -> es_Latn_MX
{ 0, 0, 152 }, { 270, 66, 152 }, // und_MX -> es_Latn_MX
+ { 0, 0, 153 }, { 75, 66, 153 }, // und_FM -> en_Latn_FM
{ 0, 27, 154 }, { 303, 27, 154 }, // und_Cyrl_MD -> uk_Cyrl_MD
+ { 0, 66, 154 }, { 235, 66, 154 }, // und_Latn_MD -> ro_Latn_MD
{ 0, 0, 154 }, { 235, 66, 154 }, // und_MD -> ro_Latn_MD
+ { 0, 66, 155 }, { 85, 66, 155 }, // und_Latn_MC -> fr_Latn_MC
{ 0, 0, 155 }, { 85, 66, 155 }, // und_MC -> fr_Latn_MC
{ 0, 4, 156 }, { 133, 4, 156 }, // und_Arab_MN -> kk_Arab_MN
+ { 0, 27, 156 }, { 191, 27, 156 }, // und_Cyrl_MN -> mn_Cyrl_MN
{ 0, 0, 156 }, { 191, 27, 156 }, // und_MN -> mn_Cyrl_MN
+ { 0, 66, 157 }, { 252, 66, 157 }, // und_Latn_ME -> sr_Latn_ME
{ 0, 0, 157 }, { 252, 66, 157 }, // und_ME -> sr_Latn_ME
+ { 0, 0, 158 }, { 75, 66, 158 }, // und_MS -> en_Latn_MS
{ 0, 66, 159 }, { 85, 66, 159 }, // und_Latn_MA -> fr_Latn_MA
{ 0, 0, 159 }, { 14, 4, 159 }, // und_MA -> ar_Arab_MA
+ { 0, 66, 160 }, { 231, 66, 160 }, // und_Latn_MZ -> pt_Latn_MZ
{ 0, 0, 160 }, { 231, 66, 160 }, // und_MZ -> pt_Latn_MZ
+ { 0, 4, 161 }, { 339, 4, 161 }, // und_Arab_MM -> rhg_Arab_MM
{ 0, 0, 161 }, { 46, 86, 161 }, // und_MM -> my_Mymr_MM
+ { 0, 66, 162 }, { 4, 66, 162 }, // und_Latn_NA -> af_Latn_NA
{ 0, 0, 162 }, { 4, 66, 162 }, // und_NA -> af_Latn_NA
+ { 0, 0, 163 }, { 75, 66, 163 }, // und_NR -> en_Latn_NR
+ { 0, 29, 164 }, { 199, 29, 164 }, // und_Deva_NP -> ne_Deva_NP
{ 0, 0, 164 }, { 199, 29, 164 }, // und_NP -> ne_Deva_NP
+ { 0, 66, 165 }, { 72, 66, 165 }, // und_Latn_NL -> nl_Latn_NL
{ 0, 0, 165 }, { 72, 66, 165 }, // und_NL -> nl_Latn_NL
+ { 0, 66, 166 }, { 85, 66, 166 }, // und_Latn_NC -> fr_Latn_NC
{ 0, 0, 166 }, { 85, 66, 166 }, // und_NC -> fr_Latn_NC
+ { 0, 0, 167 }, { 75, 66, 167 }, // und_NZ -> en_Latn_NZ
+ { 0, 66, 168 }, { 270, 66, 168 }, // und_Latn_NI -> es_Latn_NI
{ 0, 0, 168 }, { 270, 66, 168 }, // und_NI -> es_Latn_NI
{ 0, 4, 169 }, { 101, 4, 169 }, // und_Arab_NG -> ha_Arab_NG
+ { 0, 0, 169 }, { 75, 66, 169 }, // und_NG -> en_Latn_NG
+ { 0, 66, 170 }, { 101, 66, 170 }, // und_Latn_NE -> ha_Latn_NE
{ 0, 0, 170 }, { 101, 66, 170 }, // und_NE -> ha_Latn_NE
+ { 0, 0, 171 }, { 75, 66, 171 }, // und_NU -> en_Latn_NU
+ { 0, 0, 172 }, { 75, 66, 172 }, // und_NF -> en_Latn_NF
+ { 0, 0, 173 }, { 75, 66, 173 }, // und_MP -> en_Latn_MP
{ 0, 0, 174 }, { 142, 63, 174 }, // und_KP -> ko_Kore_KP
+ { 0, 66, 175 }, { 209, 66, 175 }, // und_Latn_NO -> nb_Latn_NO
{ 0, 0, 175 }, { 209, 66, 175 }, // und_NO -> nb_Latn_NO
{ 0, 0, 176 }, { 14, 4, 176 }, // und_OM -> ar_Arab_OM
- { 0, 0, 177 }, { 75, 66, 66 }, // und_QO -> en_Latn_DG
{ 0, 4, 178 }, { 305, 4, 178 }, // und_Arab_PK -> ur_Arab_PK
{ 0, 0, 178 }, { 305, 4, 178 }, // und_PK -> ur_Arab_PK
+ { 0, 66, 179 }, { 224, 66, 179 }, // und_Latn_PW -> pau_Latn_PW
{ 0, 0, 179 }, { 224, 66, 179 }, // und_PW -> pau_Latn_PW
{ 0, 0, 180 }, { 14, 4, 180 }, // und_PS -> ar_Arab_PS
+ { 0, 66, 181 }, { 270, 66, 181 }, // und_Latn_PA -> es_Latn_PA
{ 0, 0, 181 }, { 270, 66, 181 }, // und_PA -> es_Latn_PA
+ { 0, 66, 182 }, { 294, 66, 182 }, // und_Latn_PG -> tpi_Latn_PG
{ 0, 0, 182 }, { 294, 66, 182 }, // und_PG -> tpi_Latn_PG
+ { 0, 66, 183 }, { 97, 66, 183 }, // und_Latn_PY -> gn_Latn_PY
{ 0, 0, 183 }, { 97, 66, 183 }, // und_PY -> gn_Latn_PY
+ { 0, 66, 184 }, { 270, 66, 184 }, // und_Latn_PE -> es_Latn_PE
{ 0, 0, 184 }, { 270, 66, 184 }, // und_PE -> es_Latn_PE
+ { 0, 66, 185 }, { 83, 66, 185 }, // und_Latn_PH -> fil_Latn_PH
{ 0, 0, 185 }, { 83, 66, 185 }, // und_PH -> fil_Latn_PH
+ { 0, 0, 186 }, { 75, 66, 186 }, // und_PN -> en_Latn_PN
+ { 0, 66, 187 }, { 230, 66, 187 }, // und_Latn_PL -> pl_Latn_PL
{ 0, 0, 187 }, { 230, 66, 187 }, // und_PL -> pl_Latn_PL
+ { 0, 66, 188 }, { 231, 66, 188 }, // und_Latn_PT -> pt_Latn_PT
{ 0, 0, 188 }, { 231, 66, 188 }, // und_PT -> pt_Latn_PT
+ { 0, 66, 189 }, { 270, 66, 189 }, // und_Latn_PR -> es_Latn_PR
{ 0, 0, 189 }, { 270, 66, 189 }, // und_PR -> es_Latn_PR
{ 0, 0, 190 }, { 14, 4, 190 }, // und_QA -> ar_Arab_QA
+ { 0, 66, 191 }, { 85, 66, 191 }, // und_Latn_RE -> fr_Latn_RE
{ 0, 0, 191 }, { 85, 66, 191 }, // und_RE -> fr_Latn_RE
{ 0, 27, 192 }, { 45, 27, 192 }, // und_Cyrl_RO -> bg_Cyrl_RO
+ { 0, 66, 192 }, { 235, 66, 192 }, // und_Latn_RO -> ro_Latn_RO
{ 0, 0, 192 }, { 235, 66, 192 }, // und_RO -> ro_Latn_RO
{ 0, 0, 193 }, { 239, 27, 193 }, // und_RU -> ru_Cyrl_RU
+ { 0, 66, 194 }, { 138, 66, 194 }, // und_Latn_RW -> rw_Latn_RW
{ 0, 0, 194 }, { 138, 66, 194 }, // und_RW -> rw_Latn_RW
+ { 0, 66, 195 }, { 85, 66, 195 }, // und_Latn_BL -> fr_Latn_BL
{ 0, 0, 195 }, { 85, 66, 195 }, // und_BL -> fr_Latn_BL
+ { 0, 0, 196 }, { 75, 66, 196 }, // und_SH -> en_Latn_SH
+ { 0, 0, 197 }, { 75, 66, 197 }, // und_KN -> en_Latn_KN
+ { 0, 0, 198 }, { 75, 66, 198 }, // und_LC -> en_Latn_LC
+ { 0, 66, 199 }, { 85, 66, 199 }, // und_Latn_MF -> fr_Latn_MF
{ 0, 0, 199 }, { 85, 66, 199 }, // und_MF -> fr_Latn_MF
+ { 0, 66, 200 }, { 85, 66, 200 }, // und_Latn_PM -> fr_Latn_PM
{ 0, 0, 200 }, { 85, 66, 200 }, // und_PM -> fr_Latn_PM
+ { 0, 0, 201 }, { 75, 66, 201 }, // und_VC -> en_Latn_VC
+ { 0, 66, 202 }, { 244, 66, 202 }, // und_Latn_WS -> sm_Latn_WS
{ 0, 0, 202 }, { 244, 66, 202 }, // und_WS -> sm_Latn_WS
+ { 0, 66, 203 }, { 119, 66, 203 }, // und_Latn_SM -> it_Latn_SM
{ 0, 0, 203 }, { 119, 66, 203 }, // und_SM -> it_Latn_SM
+ { 0, 66, 204 }, { 231, 66, 204 }, // und_Latn_ST -> pt_Latn_ST
{ 0, 0, 204 }, { 231, 66, 204 }, // und_ST -> pt_Latn_ST
{ 0, 0, 205 }, { 14, 4, 205 }, // und_SA -> ar_Arab_SA
+ { 0, 66, 206 }, { 85, 66, 206 }, // und_Latn_SN -> fr_Latn_SN
{ 0, 0, 206 }, { 85, 66, 206 }, // und_SN -> fr_Latn_SN
+ { 0, 27, 207 }, { 252, 27, 207 }, // und_Cyrl_RS -> sr_Cyrl_RS
+ { 0, 66, 207 }, { 252, 66, 207 }, // und_Latn_RS -> sr_Latn_RS
{ 0, 0, 207 }, { 252, 27, 207 }, // und_RS -> sr_Cyrl_RS
+ { 0, 66, 208 }, { 85, 66, 208 }, // und_Latn_SC -> fr_Latn_SC
{ 0, 0, 208 }, { 85, 66, 208 }, // und_SC -> fr_Latn_SC
+ { 0, 0, 210 }, { 75, 66, 210 }, // und_SG -> en_Latn_SG
+ { 0, 0, 211 }, { 75, 66, 211 }, // und_SX -> en_Latn_SX
{ 0, 27, 212 }, { 303, 27, 212 }, // und_Cyrl_SK -> uk_Cyrl_SK
+ { 0, 66, 212 }, { 262, 66, 212 }, // und_Latn_SK -> sk_Latn_SK
{ 0, 0, 212 }, { 262, 66, 212 }, // und_SK -> sk_Latn_SK
+ { 0, 66, 213 }, { 263, 66, 213 }, // und_Latn_SI -> sl_Latn_SI
{ 0, 0, 213 }, { 263, 66, 213 }, // und_SI -> sl_Latn_SI
+ { 0, 0, 214 }, { 75, 66, 214 }, // und_SB -> en_Latn_SB
+ { 0, 66, 215 }, { 265, 66, 215 }, // und_Latn_SO -> so_Latn_SO
{ 0, 0, 215 }, { 265, 66, 215 }, // und_SO -> so_Latn_SO
- { 0, 0, 217 }, { 0, 66, 217 }, // und_GS -> und_Latn_GS
+ { 0, 0, 216 }, { 75, 66, 216 }, // und_ZA -> en_Latn_ZA
+ { 0, 0, 217 }, { 75, 66, 217 }, // und_GS -> en_Latn_GS
{ 0, 0, 218 }, { 142, 63, 218 }, // und_KR -> ko_Kore_KR
+ { 0, 0, 219 }, { 14, 4, 219 }, // und_SS -> ar_Arab_SS
+ { 0, 66, 220 }, { 270, 66, 220 }, // und_Latn_ES -> es_Latn_ES
{ 0, 0, 220 }, { 270, 66, 220 }, // und_ES -> es_Latn_ES
{ 0, 0, 221 }, { 260, 119, 221 }, // und_LK -> si_Sinh_LK
{ 0, 0, 222 }, { 14, 4, 222 }, // und_SD -> ar_Arab_SD
+ { 0, 66, 223 }, { 72, 66, 223 }, // und_Latn_SR -> nl_Latn_SR
{ 0, 0, 223 }, { 72, 66, 223 }, // und_SR -> nl_Latn_SR
+ { 0, 66, 224 }, { 209, 66, 224 }, // und_Latn_SJ -> nb_Latn_SJ
{ 0, 0, 224 }, { 209, 66, 224 }, // und_SJ -> nb_Latn_SJ
{ 0, 47, 225 }, { 323, 47, 225 }, // und_Hebr_SE -> yi_Hebr_SE
+ { 0, 66, 225 }, { 275, 66, 225 }, // und_Latn_SE -> sv_Latn_SE
{ 0, 0, 225 }, { 275, 66, 225 }, // und_SE -> sv_Latn_SE
+ { 0, 66, 226 }, { 94, 66, 226 }, // und_Latn_CH -> de_Latn_CH
{ 0, 0, 226 }, { 94, 66, 226 }, // und_CH -> de_Latn_CH
{ 0, 66, 227 }, { 85, 66, 227 }, // und_Latn_SY -> fr_Latn_SY
{ 0, 0, 227 }, { 14, 4, 227 }, // und_SY -> ar_Arab_SY
{ 0, 66, 228 }, { 284, 66, 228 }, // und_Latn_TW -> trv_Latn_TW
{ 0, 0, 228 }, { 58, 137, 228 }, // und_TW -> zh_Hant_TW
{ 0, 4, 229 }, { 228, 4, 229 }, // und_Arab_TJ -> fa_Arab_TJ
+ { 0, 27, 229 }, { 282, 27, 229 }, // und_Cyrl_TJ -> tg_Cyrl_TJ
{ 0, 0, 229 }, { 282, 27, 229 }, // und_TJ -> tg_Cyrl_TJ
+ { 0, 66, 230 }, { 273, 66, 230 }, // und_Latn_TZ -> sw_Latn_TZ
{ 0, 0, 230 }, { 273, 66, 230 }, // und_TZ -> sw_Latn_TZ
{ 0, 0, 231 }, { 289, 133, 231 }, // und_TH -> th_Thai_TH
+ { 0, 66, 232 }, { 231, 66, 232 }, // und_Latn_TL -> pt_Latn_TL
{ 0, 0, 232 }, { 231, 66, 232 }, // und_TL -> pt_Latn_TL
+ { 0, 66, 233 }, { 85, 66, 233 }, // und_Latn_TG -> fr_Latn_TG
{ 0, 0, 233 }, { 85, 66, 233 }, // und_TG -> fr_Latn_TG
+ { 0, 66, 234 }, { 293, 66, 234 }, // und_Latn_TK -> tkl_Latn_TK
{ 0, 0, 234 }, { 293, 66, 234 }, // und_TK -> tkl_Latn_TK
+ { 0, 66, 235 }, { 295, 66, 235 }, // und_Latn_TO -> to_Latn_TO
{ 0, 0, 235 }, { 295, 66, 235 }, // und_TO -> to_Latn_TO
+ { 0, 0, 236 }, { 75, 66, 236 }, // und_TT -> en_Latn_TT
+ { 0, 0, 237 }, { 75, 66, 237 }, // und_TA -> en_Latn_TA
{ 0, 66, 238 }, { 85, 66, 238 }, // und_Latn_TN -> fr_Latn_TN
{ 0, 0, 238 }, { 14, 4, 238 }, // und_TN -> ar_Arab_TN
- { 0, 4, 239 }, { 25, 4, 239 }, // und_Arab_TR -> az_Arab_TR
+ { 0, 66, 239 }, { 298, 66, 239 }, // und_Latn_TR -> tr_Latn_TR
{ 0, 0, 239 }, { 298, 66, 239 }, // und_TR -> tr_Latn_TR
+ { 0, 66, 240 }, { 299, 66, 240 }, // und_Latn_TM -> tk_Latn_TM
{ 0, 0, 240 }, { 299, 66, 240 }, // und_TM -> tk_Latn_TM
+ { 0, 0, 241 }, { 75, 66, 241 }, // und_TC -> en_Latn_TC
+ { 0, 66, 242 }, { 300, 66, 242 }, // und_Latn_TV -> tvl_Latn_TV
{ 0, 0, 242 }, { 300, 66, 242 }, // und_TV -> tvl_Latn_TV
+ { 0, 66, 243 }, { 273, 66, 243 }, // und_Latn_UG -> sw_Latn_UG
{ 0, 0, 243 }, { 273, 66, 243 }, // und_UG -> sw_Latn_UG
+ { 0, 27, 244 }, { 303, 27, 244 }, // und_Cyrl_UA -> uk_Cyrl_UA
{ 0, 47, 244 }, { 323, 47, 244 }, // und_Hebr_UA -> yi_Hebr_UA
{ 0, 66, 244 }, { 230, 66, 244 }, // und_Latn_UA -> pl_Latn_UA
{ 0, 0, 244 }, { 303, 27, 244 }, // und_UA -> uk_Cyrl_UA
{ 0, 0, 245 }, { 14, 4, 245 }, // und_AE -> ar_Arab_AE
- { 0, 4, 246 }, { 132, 4, 246 }, // und_Arab_GB -> ks_Arab_GB
- { 0, 47, 246 }, { 323, 47, 246 }, // und_Hebr_GB -> yi_Hebr_GB
+ { 0, 4, 246 }, { 305, 4, 246 }, // und_Arab_GB -> ur_Arab_GB
+ { 0, 0, 246 }, { 75, 66, 246 }, // und_GB -> en_Latn_GB
+ { 0, 0, 247 }, { 75, 66, 247 }, // und_UM -> en_Latn_UM
{ 0, 47, 248 }, { 323, 47, 248 }, // und_Hebr_US -> yi_Hebr_US
+ { 0, 0, 248 }, { 75, 66, 248 }, // und_US -> en_Latn_US
+ { 0, 0, 249 }, { 75, 66, 249 }, // und_VI -> en_Latn_VI
+ { 0, 66, 250 }, { 270, 66, 250 }, // und_Latn_UY -> es_Latn_UY
{ 0, 0, 250 }, { 270, 66, 250 }, // und_UY -> es_Latn_UY
+ { 0, 66, 251 }, { 307, 66, 251 }, // und_Latn_UZ -> uz_Latn_UZ
{ 0, 0, 251 }, { 307, 66, 251 }, // und_UZ -> uz_Latn_UZ
+ { 0, 66, 252 }, { 39, 66, 252 }, // und_Latn_VU -> bi_Latn_VU
{ 0, 0, 252 }, { 39, 66, 252 }, // und_VU -> bi_Latn_VU
+ { 0, 66, 253 }, { 119, 66, 253 }, // und_Latn_VA -> it_Latn_VA
{ 0, 0, 253 }, { 119, 66, 253 }, // und_VA -> it_Latn_VA
+ { 0, 66, 254 }, { 270, 66, 254 }, // und_Latn_VE -> es_Latn_VE
{ 0, 0, 254 }, { 270, 66, 254 }, // und_VE -> es_Latn_VE
+ { 0, 66, 255 }, { 310, 66, 255 }, // und_Latn_VN -> vi_Latn_VN
{ 0, 0, 255 }, { 310, 66, 255 }, // und_VN -> vi_Latn_VN
+ { 0, 66, 256 }, { 85, 66, 256 }, // und_Latn_WF -> fr_Latn_WF
{ 0, 0, 256 }, { 85, 66, 256 }, // und_WF -> fr_Latn_WF
{ 0, 0, 257 }, { 14, 4, 257 }, // und_EH -> ar_Arab_EH
{ 0, 0, 259 }, { 14, 4, 259 }, // und_YE -> ar_Arab_YE
+ { 0, 66, 260 }, { 36, 66, 260 }, // und_Latn_ZM -> bem_Latn_ZM
+ { 0, 0, 260 }, { 36, 66, 260 }, // und_ZM -> bem_Latn_ZM
+ { 0, 66, 261 }, { 254, 66, 261 }, // und_Latn_ZW -> sn_Latn_ZW
{ 0, 0, 261 }, { 254, 66, 261 }, // und_ZW -> sn_Latn_ZW
{ 0, 1, 0 }, { 87, 1, 102 }, // und_Adlm -> ff_Adlm_GN
{ 0, 4, 0 }, { 14, 4, 71 }, // und_Arab -> ar_Arab_EG
@@ -732,7 +962,7 @@ static const QLocaleId likely_subtags[] = {
{ 0, 13, 0 }, { 58, 13, 228 }, // und_Bopo -> zh_Bopo_TW
{ 0, 15, 0 }, { 85, 15, 84 }, // und_Brai -> fr_Brai_FR
{ 0, 16, 0 }, { 44, 16, 111 }, // und_Bugi -> bug_Bugi_ID
- { 0, 18, 0 }, { 65, 18, 41 }, // und_Cans -> cr_Cans_CA
+ { 0, 18, 0 }, { 116, 18, 41 }, // und_Cans -> iu_Cans_CA
{ 0, 21, 0 }, { 52, 21, 20 }, // und_Cakm -> ccp_Cakm_BD
{ 0, 23, 0 }, { 55, 23, 248 }, // und_Cher -> chr_Cher_US
{ 0, 24, 0 }, { 62, 24, 71 }, // und_Copt -> cop_Copt_EG
@@ -769,6 +999,7 @@ static const QLocaleId likely_subtags[] = {
{ 0, 62, 0 }, { 259, 62, 110 }, // und_Sind -> sd_Sind_IN
{ 0, 63, 0 }, { 142, 63, 218 }, // und_Kore -> ko_Kore_KR
{ 0, 65, 0 }, { 153, 65, 129 }, // und_Laoo -> lo_Laoo_LA
+ { 0, 66, 0 }, { 75, 66, 248 }, // und_Latn -> en_Latn_US
{ 0, 70, 0 }, { 13, 70, 94 }, // und_Linb -> grc_Linb_GR
{ 0, 73, 0 }, { 105, 73, 110 }, // und_Mahj -> hi_Mahj_IN
{ 0, 74, 0 }, { 175, 74, 110 }, // und_Mlym -> ml_Mlym_IN
@@ -816,3042 +1047,5153 @@ static const QLocaleId likely_subtags[] = {
{ 0, 137, 0 }, { 58, 137, 228 }, // und_Hant -> zh_Hant_TW
{ 0, 138, 0 }, { 302, 138, 227 }, // und_Ugar -> uga_Ugar_SY
{ 0, 139, 0 }, { 308, 139, 134 }, // und_Vaii -> vai_Vaii_LR
- { 0, 141, 0 }, { 255, 141, 50 } // und_Yiii -> ii_Yiii_CN
+ { 0, 141, 0 }, { 255, 141, 50 }, // und_Yiii -> ii_Yiii_CN
+ { 0, 142, 0 }, { 339, 142, 161 } // und_Rohg -> rhg_Rohg_MM
};
-static const quint16 locale_index[] = {
+static constexpr quint16 locale_index[] = {
0, // AnyLanguage
0, // C
1, // Abkhazian
2, // Afar
- 3, // Afrikaans
- 5, // Aghem
- 6, // Akan
+ 5, // Afrikaans
+ 7, // Aghem
+ 8, // Akan
0, // Akkadian
- 7, // Akoose
- 8, // Albanian
+ 9, // Akoose
+ 10, // Albanian
0, // American Sign Language
- 11, // Amharic
+ 13, // Amharic
0, // Ancient Egyptian
0, // Ancient Greek
- 12, // Arabic
- 40, // Aragonese
+ 14, // Arabic
+ 42, // Aragonese
0, // Aramaic
- 41, // Armenian
- 42, // Assamese
- 43, // Asturian
- 44, // Asu
- 45, // Atsam
+ 43, // Armenian
+ 44, // Assamese
+ 45, // Asturian
+ 46, // Asu
+ 47, // Atsam
0, // Avaric
0, // Avestan
0, // Aymara
- 46, // Azerbaijani
- 49, // Bafia
+ 48, // Azerbaijani
+ 53, // Bafia
0, // Balinese
- 50, // Bambara
+ 54, // Bambara
0, // Bamun
- 52, // Bangla
- 54, // Basaa
- 55, // Bashkir
- 56, // Basque
+ 56, // Bangla
+ 58, // Basaa
+ 59, // Bashkir
+ 60, // Basque
0, // Batak Toba
- 57, // Belarusian
- 58, // Bemba
- 59, // Bena
- 0, // Bhojpuri
+ 61, // Belarusian
+ 62, // Bemba
+ 63, // Bena
+ 64, // Bhojpuri
0, // Bislama
- 60, // Blin
- 61, // Bodo
- 62, // Bosnian
- 64, // Breton
+ 65, // Blin
+ 66, // Bodo
+ 67, // Bosnian
+ 69, // Breton
0, // Buginese
- 65, // Bulgarian
- 66, // Burmese
- 67, // Cantonese
- 69, // Catalan
- 73, // Cebuano
- 74, // Central Atlas Tamazight
- 75, // Central Kurdish
- 77, // Chakma
+ 70, // Bulgarian
+ 71, // Burmese
+ 72, // Cantonese
+ 74, // Catalan
+ 78, // Cebuano
+ 79, // Central Atlas Tamazight
+ 80, // Central Kurdish
+ 82, // Chakma
0, // Chamorro
- 79, // Chechen
- 80, // Cherokee
- 81, // Chickasaw
- 82, // Chiga
- 83, // Chinese
- 90, // Church
- 91, // Chuvash
- 92, // Colognian
+ 84, // Chechen
+ 85, // Cherokee
+ 86, // Chickasaw
+ 87, // Chiga
+ 88, // Chinese
+ 95, // Church
+ 96, // Chuvash
+ 97, // Colognian
0, // Coptic
- 93, // Cornish
- 94, // Corsican
+ 98, // Cornish
+ 99, // Corsican
0, // Cree
- 95, // Croatian
- 97, // Czech
- 98, // Danish
- 100, // Divehi
- 101, // Dogri
- 102, // Duala
- 103, // Dutch
- 110, // Dzongkha
- 111, // Embu
- 112, // English
- 218, // Erzya
- 219, // Esperanto
- 220, // Estonian
- 221, // Ewe
- 223, // Ewondo
- 224, // Faroese
+ 100, // Croatian
+ 102, // Czech
+ 103, // Danish
+ 105, // Divehi
+ 106, // Dogri
+ 107, // Duala
+ 108, // Dutch
+ 115, // Dzongkha
+ 116, // Embu
+ 117, // English
+ 226, // Erzya
+ 227, // Esperanto
+ 228, // Estonian
+ 229, // Ewe
+ 231, // Ewondo
+ 232, // Faroese
0, // Fijian
- 226, // Filipino
- 227, // Finnish
- 228, // French
- 274, // Friulian
- 275, // Fulah
- 299, // Gaelic
- 300, // Ga
- 301, // Galician
- 302, // Ganda
- 303, // Geez
- 304, // Georgian
- 305, // German
+ 234, // Filipino
+ 235, // Finnish
+ 236, // French
+ 282, // Friulian
+ 283, // Fulah
+ 307, // Gaelic
+ 308, // Ga
+ 309, // Galician
+ 310, // Ganda
+ 311, // Geez
+ 313, // Georgian
+ 314, // German
0, // Gothic
- 312, // Greek
- 314, // Guarani
- 315, // Gujarati
- 316, // Gusii
+ 321, // Greek
+ 323, // Guarani
+ 324, // Gujarati
+ 325, // Gusii
0, // Haitian
- 317, // Hausa
- 321, // Hawaiian
- 322, // Hebrew
+ 326, // Hausa
+ 331, // Hawaiian
+ 332, // Hebrew
0, // Herero
- 323, // Hindi
+ 333, // Hindi
0, // Hiri Motu
- 325, // Hungarian
- 326, // Icelandic
- 327, // Ido
- 328, // Igbo
- 329, // Inari Sami
- 330, // Indonesian
+ 335, // Hungarian
+ 336, // Icelandic
+ 337, // Ido
+ 338, // Igbo
+ 339, // Inari Sami
+ 340, // Indonesian
0, // Ingush
- 331, // Interlingua
- 0, // Interlingue
- 332, // Inuktitut
+ 341, // Interlingua
+ 342, // Interlingue
+ 343, // Inuktitut
0, // Inupiaq
- 334, // Irish
- 336, // Italian
- 340, // Japanese
- 341, // Javanese
- 342, // Jju
- 343, // Jola Fonyi
- 344, // Kabuverdianu
- 345, // Kabyle
- 346, // Kako
- 347, // Kalaallisut
- 348, // Kalenjin
- 349, // Kamba
- 350, // Kannada
+ 345, // Irish
+ 347, // Italian
+ 351, // Japanese
+ 352, // Javanese
+ 353, // Jju
+ 354, // Jola-Fonyi
+ 355, // Kabuverdianu
+ 356, // Kabyle
+ 357, // Kako
+ 358, // Kalaallisut
+ 359, // Kalenjin
+ 360, // Kamba
+ 361, // Kannada
0, // Kanuri
- 351, // Kashmiri
- 353, // Kazakh
- 354, // Kenyang
- 355, // Khmer
- 356, // Kiche
- 357, // Kikuyu
- 358, // Kinyarwanda
+ 362, // Kashmiri
+ 364, // Kazakh
+ 365, // Kenyang
+ 366, // Khmer
+ 367, // Kiche
+ 368, // Kikuyu
+ 369, // Kinyarwanda
0, // Komi
0, // Kongo
- 359, // Konkani
- 360, // Korean
+ 370, // Konkani
+ 371, // Korean
0, // Koro
- 362, // Koyraboro Senni
- 363, // Koyra Chiini
- 364, // Kpelle
+ 374, // Koyraboro Senni
+ 375, // Koyra Chiini
+ 376, // Kpelle
0, // Kuanyama
- 365, // Kurdish
- 366, // Kwasio
- 367, // Kyrgyz
- 368, // Lakota
- 369, // Langi
- 370, // Lao
- 371, // Latin
- 372, // Latvian
+ 378, // Kurdish
+ 379, // Kwasio
+ 380, // Kyrgyz
+ 381, // Lakota
+ 382, // Langi
+ 383, // Lao
+ 384, // Latin
+ 385, // Latvian
0, // Lezghian
0, // Limburgish
- 373, // Lingala
+ 386, // Lingala
0, // Literary Chinese
- 377, // Lithuanian
- 378, // Lojban
- 379, // Lower Sorbian
- 380, // Low German
- 382, // Luba Katanga
- 383, // Lule Sami
- 384, // Luo
- 385, // Luxembourgish
- 386, // Luyia
- 387, // Macedonian
- 388, // Machame
- 389, // Maithili
- 390, // Makhuwa Meetto
- 391, // Makonde
- 392, // Malagasy
- 393, // Malayalam
- 394, // Malay
- 399, // Maltese
+ 390, // Lithuanian
+ 391, // Lojban
+ 392, // Lower Sorbian
+ 393, // Low German
+ 395, // Luba-Katanga
+ 396, // Lule Sami
+ 398, // Luo
+ 399, // Luxembourgish
+ 400, // Luyia
+ 401, // Macedonian
+ 402, // Machame
+ 403, // Maithili
+ 404, // Makhuwa-Meetto
+ 405, // Makonde
+ 406, // Malagasy
+ 407, // Malayalam
+ 408, // Malay
+ 414, // Maltese
0, // Mandingo
- 400, // Manipuri
- 402, // Manx
- 403, // Maori
- 404, // Mapuche
- 405, // Marathi
+ 415, // Manipuri
+ 417, // Manx
+ 418, // Maori
+ 419, // Mapuche
+ 420, // Marathi
0, // Marshallese
- 406, // Masai
- 408, // Mazanderani
+ 421, // Masai
+ 423, // Mazanderani
0, // Mende
- 409, // Meru
- 410, // Meta
- 411, // Mohawk
- 412, // Mongolian
- 414, // Morisyen
- 415, // Mundang
- 416, // Muscogee
- 417, // Nama
+ 424, // Meru
+ 425, // Meta
+ 426, // Mohawk
+ 427, // Mongolian
+ 430, // Morisyen
+ 431, // Mundang
+ 432, // Muscogee
+ 433, // Nama
0, // Nauru
- 418, // Navajo
+ 434, // Navajo
0, // Ndonga
- 419, // Nepali
+ 435, // Nepali
0, // Newari
- 421, // Ngiemboon
- 422, // Ngomba
- 423, // Nigerian Pidgin
- 424, // Nko
- 425, // Northern Luri
- 427, // Northern Sami
- 430, // Northern Sotho
- 431, // North Ndebele
- 432, // Norwegian Bokmal
- 434, // Norwegian Nynorsk
- 435, // Nuer
- 436, // Nyanja
- 437, // Nyankole
- 438, // Occitan
- 439, // Odia
+ 437, // Ngiemboon
+ 438, // Ngomba
+ 439, // Nigerian Pidgin
+ 440, // Nko
+ 441, // Northern Luri
+ 443, // Northern Sami
+ 446, // Northern Sotho
+ 447, // North Ndebele
+ 448, // Norwegian Bokmal
+ 450, // Norwegian Nynorsk
+ 451, // Nuer
+ 452, // Nyanja
+ 453, // Nyankole
+ 454, // Occitan
+ 456, // Odia
0, // Ojibwa
0, // Old Irish
0, // Old Norse
0, // Old Persian
- 440, // Oromo
- 442, // Osage
- 443, // Ossetic
+ 457, // Oromo
+ 459, // Osage
+ 460, // Ossetic
0, // Pahlavi
0, // Palauan
0, // Pali
- 0, // Papiamento
- 445, // Pashto
- 447, // Persian
+ 462, // Papiamento
+ 464, // Pashto
+ 466, // Persian
0, // Phoenician
- 449, // Polish
- 450, // Portuguese
- 462, // Prussian
- 463, // Punjabi
- 465, // Quechua
- 468, // Romanian
- 470, // Romansh
- 471, // Rombo
- 472, // Rundi
- 473, // Russian
- 479, // Rwa
- 480, // Saho
- 481, // Sakha
- 482, // Samburu
+ 468, // Polish
+ 469, // Portuguese
+ 481, // Prussian
+ 482, // Punjabi
+ 484, // Quechua
+ 487, // Romanian
+ 489, // Romansh
+ 490, // Rombo
+ 491, // Rundi
+ 492, // Russian
+ 498, // Rwa
+ 499, // Saho
+ 500, // Sakha
+ 501, // Samburu
0, // Samoan
- 483, // Sango
- 484, // Sangu
- 485, // Sanskrit
- 486, // Santali
- 488, // Sardinian
+ 502, // Sango
+ 503, // Sangu
+ 504, // Sanskrit
+ 505, // Santali
+ 507, // Sardinian
0, // Saurashtra
- 489, // Sena
- 490, // Serbian
- 498, // Shambala
- 499, // Shona
- 500, // Sichuan Yi
- 501, // Sicilian
- 502, // Sidamo
- 503, // Silesian
- 504, // Sindhi
- 506, // Sinhala
- 507, // Skolt Sami
- 508, // Slovak
- 509, // Slovenian
- 510, // Soga
- 511, // Somali
- 515, // Southern Kurdish
- 516, // Southern Sami
- 517, // Southern Sotho
- 518, // South Ndebele
- 519, // Spanish
- 547, // Standard Moroccan Tamazight
- 548, // Sundanese
- 549, // Swahili
- 553, // Swati
- 554, // Swedish
- 557, // Swiss German
- 560, // Syriac
- 561, // Tachelhit
+ 508, // Sena
+ 509, // Serbian
+ 517, // Shambala
+ 518, // Shona
+ 519, // Sichuan Yi
+ 520, // Sicilian
+ 521, // Sidamo
+ 522, // Silesian
+ 523, // Sindhi
+ 525, // Sinhala
+ 526, // Skolt Sami
+ 527, // Slovak
+ 528, // Slovenian
+ 529, // Soga
+ 530, // Somali
+ 534, // Southern Kurdish
+ 536, // Southern Sami
+ 538, // Southern Sotho
+ 540, // South Ndebele
+ 541, // Spanish
+ 569, // Standard Moroccan Tamazight
+ 570, // Sundanese
+ 571, // Swahili
+ 575, // Swati
+ 577, // Swedish
+ 580, // Swiss German
+ 583, // Syriac
+ 585, // Tachelhit
0, // Tahitian
- 563, // Tai Dam
- 564, // Taita
- 565, // Tajik
- 566, // Tamil
- 570, // Taroko
- 571, // Tasawaq
- 572, // Tatar
- 573, // Telugu
- 574, // Teso
- 576, // Thai
- 577, // Tibetan
- 579, // Tigre
- 580, // Tigrinya
+ 587, // Tai Dam
+ 588, // Taita
+ 589, // Tajik
+ 590, // Tamil
+ 594, // Taroko
+ 595, // Tasawaq
+ 596, // Tatar
+ 597, // Telugu
+ 598, // Teso
+ 600, // Thai
+ 601, // Tibetan
+ 603, // Tigre
+ 604, // Tigrinya
0, // Tokelau
- 582, // Tok Pisin
- 583, // Tongan
- 584, // Tsonga
- 585, // Tswana
- 586, // Turkish
- 588, // Turkmen
+ 606, // Tok Pisin
+ 607, // Tongan
+ 608, // Tsonga
+ 609, // Tswana
+ 611, // Turkish
+ 613, // Turkmen
0, // Tuvalu
- 589, // Tyap
+ 614, // Tyap
0, // Ugaritic
- 590, // Ukrainian
- 591, // Upper Sorbian
- 592, // Urdu
- 594, // Uyghur
- 595, // Uzbek
- 598, // Vai
- 600, // Venda
- 601, // Vietnamese
- 602, // Volapuk
- 603, // Vunjo
- 604, // Walloon
- 605, // Walser
- 606, // Warlpiri
- 607, // Welsh
- 608, // Western Balochi
- 609, // Western Frisian
- 610, // Wolaytta
- 611, // Wolof
- 612, // Xhosa
- 613, // Yangben
- 614, // Yiddish
- 615, // Yoruba
- 617, // Zarma
- 0, // Zhuang
- 618, // Zulu
- 619, // Kaingang
- 620, // Nheengatu
+ 615, // Ukrainian
+ 616, // Upper Sorbian
+ 617, // Urdu
+ 619, // Uyghur
+ 620, // Uzbek
+ 623, // Vai
+ 625, // Venda
+ 626, // Vietnamese
+ 627, // Volapuk
+ 628, // Vunjo
+ 629, // Walloon
+ 630, // Walser
+ 631, // Warlpiri
+ 632, // Welsh
+ 633, // Western Balochi
+ 638, // Western Frisian
+ 639, // Wolaytta
+ 640, // Wolof
+ 641, // Xhosa
+ 642, // Yangben
+ 643, // Yiddish
+ 644, // Yoruba
+ 646, // Zarma
+ 647, // Zhuang
+ 648, // Zulu
+ 649, // Kaingang
+ 650, // Nheengatu
+ 653, // Haryanvi
+ 654, // Northern Frisian
+ 655, // Rajasthani
+ 656, // Moksha
+ 657, // Toki Pona
+ 658, // Pijin
+ 659, // Obolo
+ 660, // Baluchi
+ 662, // Ligurian
+ 663, // Rohingya
+ 665, // Torwali
+ 666, // Anii
+ 667, // Kangri
+ 668, // Venetian
0 // trailing 0
};
-static const QLocaleData locale_data[] = {
+static constexpr QLocaleData locale_data[] = {
// lang script terr lStrt lpMid lpEnd lPair lDelm dec group prcnt zero minus plus exp qtOpn qtEnd altQO altQE lDFmt sDFmt lTFmt sTFmt slDay lDays ssDys sDays snDay nDays am pm byte siQnt iecQn crSym crDsp crFmt crFNg ntLng ntTer currISO curDgt curRnd dow1st wknd+ wknd- grpTop grpMid grpEnd
{ 1, 0, 0, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 8, 0, 17, 0, 0, 0, 0, 56, 56, 83, 96, 0, 0, 0, 5, 22, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 8, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 0, 0, 4, 0, 0, 0, {0,0,0}, 2, 1, 1, 6, 7, 1, 3, 3 }, // C/AnyScript/AnyTerritory
- { 2, 27, 90, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 44, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 0, 0, 4, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {71,69,76}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Abkhazian/Cyrillic/Georgia
- { 3, 66, 77, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 44, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 0, 0, 4, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 0, 0, {69,84,66}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Afar/Latin/Ethiopia
- { 4, 66, 216, 0, 0, 7, 7, 6, 1, 14, 2, 3, 4, 5, 9, 10, 11, 12, 13, 54, 44, 0, 0, 109, 109, 166, 166, 193, 193, 2, 2, 45, 5, 22, 1, 0, 9, 13, 0, 9, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 57, 57, 27, 27, 13, 13, 3, 3, 5, 17, 23, 1, 20, 4, 6, 9, 11, {90,65,82}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Afrikaans/Latin/South Africa
- { 4, 66, 162, 0, 0, 7, 7, 6, 1, 14, 2, 3, 4, 5, 9, 10, 11, 12, 13, 71, 44, 10, 22, 109, 109, 166, 166, 193, 193, 2, 2, 45, 5, 22, 2, 20, 9, 13, 0, 20, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 12, 7, 57, 57, 27, 27, 13, 13, 3, 3, 5, 17, 23, 1, 16, 4, 6, 9, 7, {78,65,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Afrikaans/Latin/Namibia
- { 5, 66, 40, 0, 0, 0, 0, 6, 1, 14, 2, 3, 4, 5, 9, 15, 11, 16, 13, 71, 87, 0, 0, 206, 206, 277, 277, 304, 304, 5, 5, 0, 5, 22, 3, 36, 0, 0, 27, 32, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 71, 71, 27, 27, 13, 13, 3, 3, 4, 17, 23, 4, 14, 4, 0, 5, 7, {88,65,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Aghem/Latin/Cameroon
- { 6, 66, 92, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 95, 113, 10, 22, 317, 317, 365, 365, 392, 392, 8, 8, 0, 5, 22, 7, 50, 9, 0, 39, 43, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 12, 7, 48, 48, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 10, 4, 0, 4, 5, {71,72,83}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Akan/Latin/Ghana
- { 8, 66, 40, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 44, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 3, 0, 4, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 4, 0, 5, 0, 0, 0, {88,65,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Akoose/Latin/Cameroon
- { 9, 66, 3, 0, 0, 15, 15, 6, 1, 14, 2, 3, 4, 5, 9, 17, 18, 10, 11, 0, 121, 29, 22, 405, 405, 462, 489, 516, 516, 10, 10, 50, 5, 22, 10, 60, 19, 24, 48, 53, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 13, 7, 57, 57, 27, 27, 14, 14, 11, 10, 4, 17, 23, 4, 13, 5, 7, 5, 8, {65,76,76}, 0, 0, 1, 6, 7, 2, 3, 3 }, // Albanian/Latin/Albania
- { 9, 66, 126, 0, 0, 15, 15, 6, 1, 14, 2, 3, 4, 5, 9, 17, 18, 10, 11, 0, 121, 0, 0, 405, 405, 462, 489, 516, 516, 10, 10, 50, 5, 22, 14, 73, 19, 24, 48, 61, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 10, 5, 57, 57, 27, 27, 14, 14, 11, 10, 4, 17, 23, 1, 6, 5, 7, 5, 6, {69,85,82}, 2, 1, 1, 6, 7, 2, 3, 3 }, // Albanian/Latin/Kosovo
- { 9, 66, 140, 0, 0, 15, 15, 6, 1, 14, 2, 3, 4, 5, 9, 17, 18, 10, 11, 0, 121, 0, 0, 405, 405, 462, 489, 516, 516, 10, 10, 50, 5, 22, 15, 79, 19, 24, 48, 67, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 10, 5, 57, 57, 27, 27, 14, 14, 11, 10, 4, 17, 23, 3, 16, 5, 7, 5, 18, {77,75,68}, 2, 1, 1, 6, 7, 2, 3, 3 }, // Albanian/Latin/Macedonia
- { 11, 33, 77, 24, 24, 30, 39, 6, 0, 1, 2, 3, 4, 5, 9, 17, 18, 19, 20, 27, 127, 10, 22, 530, 530, 557, 557, 583, 583, 21, 20, 54, 57, 22, 18, 95, 9, 13, 85, 89, 6, 6, 9, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 27, 27, 26, 26, 13, 13, 3, 4, 3, 23, 23, 2, 9, 4, 6, 4, 5, {69,84,66}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Amharic/Ethiopic/Ethiopia
- { 14, 4, 71, 47, 47, 47, 47, 53, 21, 22, 23, 25, 26, 28, 30, 11, 10, 13, 12, 137, 154, 10, 22, 596, 596, 596, 596, 647, 647, 24, 24, 80, 84, 22, 20, 104, 19, 0, 94, 101, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 12, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 5, 9, 5, 0, 7, 3, {69,71,80}, 2, 1, 6, 5, 6, 1, 3, 3 }, // Arabic/Arabic/Egypt
- { 14, 4, 4, 47, 47, 47, 47, 6, 1, 0, 32, 3, 35, 37, 9, 11, 10, 13, 12, 137, 154, 10, 22, 596, 596, 596, 596, 647, 647, 24, 24, 80, 84, 22, 25, 113, 9, 13, 94, 104, 6, 6, 6, 6, 1, 1, 1, 3, 1, 2, 2, 1, 1, 1, 1, 1, 17, 10, 12, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 5, 12, 4, 6, 7, 7, {68,90,68}, 2, 1, 6, 5, 6, 1, 3, 3 }, // Arabic/Arabic/Algeria
- { 14, 4, 19, 47, 47, 47, 47, 53, 21, 22, 23, 25, 26, 28, 30, 11, 10, 13, 12, 137, 154, 10, 22, 596, 596, 596, 596, 647, 647, 24, 24, 80, 84, 22, 30, 125, 19, 0, 94, 111, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 12, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 5, 12, 5, 0, 7, 7, {66,72,68}, 3, 0, 6, 5, 6, 1, 3, 3 }, // Arabic/Arabic/Bahrain
- { 14, 4, 48, 47, 47, 47, 47, 53, 21, 22, 23, 25, 26, 28, 30, 11, 10, 13, 12, 137, 154, 10, 22, 596, 596, 596, 596, 647, 647, 24, 24, 80, 84, 22, 3, 137, 19, 0, 94, 118, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 12, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 4, 15, 5, 0, 7, 4, {88,65,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Arabic/Arabic/Chad
- { 14, 4, 55, 47, 47, 47, 47, 53, 21, 22, 23, 25, 26, 28, 30, 11, 10, 13, 12, 137, 154, 0, 0, 596, 596, 596, 596, 647, 647, 24, 24, 80, 84, 22, 4, 152, 19, 0, 94, 122, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 10, 5, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 2, 14, 5, 0, 7, 9, {75,77,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Arabic/Arabic/Comoros
- { 14, 4, 67, 47, 47, 47, 47, 53, 21, 22, 23, 25, 26, 28, 30, 11, 10, 13, 12, 137, 154, 10, 22, 596, 596, 596, 596, 647, 647, 24, 24, 80, 84, 22, 35, 166, 19, 0, 94, 131, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 12, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 3, 11, 5, 0, 7, 6, {68,74,70}, 0, 0, 6, 6, 7, 1, 3, 3 }, // Arabic/Arabic/Djibouti
- { 14, 4, 74, 47, 47, 47, 47, 53, 21, 22, 23, 25, 26, 28, 30, 11, 10, 13, 12, 137, 154, 10, 22, 596, 596, 596, 596, 647, 647, 24, 24, 80, 84, 22, 38, 177, 19, 0, 94, 137, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 12, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 3, 12, 5, 0, 7, 7, {69,82,78}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Arabic/Arabic/Eritrea
- { 14, 4, 113, 47, 47, 47, 47, 53, 21, 22, 23, 25, 26, 28, 30, 11, 10, 13, 12, 137, 154, 10, 22, 596, 596, 596, 596, 647, 647, 24, 24, 80, 84, 22, 41, 189, 19, 0, 94, 144, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 12, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 5, 11, 5, 0, 7, 6, {73,81,68}, 0, 0, 6, 5, 6, 1, 3, 3 }, // Arabic/Arabic/Iraq
- { 14, 4, 116, 47, 47, 47, 47, 53, 21, 22, 23, 25, 26, 28, 30, 11, 10, 13, 12, 137, 154, 1, 1, 596, 596, 596, 596, 647, 647, 24, 24, 80, 84, 22, 46, 200, 19, 0, 94, 150, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 9, 4, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 1, 18, 5, 0, 7, 7, {73,76,83}, 2, 1, 7, 5, 6, 1, 3, 3 }, // Arabic/Arabic/Israel
- { 14, 4, 122, 47, 47, 47, 47, 53, 21, 22, 23, 25, 26, 28, 30, 11, 10, 13, 12, 137, 154, 10, 22, 596, 596, 596, 596, 647, 647, 24, 24, 80, 84, 22, 47, 218, 19, 0, 94, 157, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 12, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 5, 11, 5, 0, 7, 6, {74,79,68}, 3, 0, 6, 5, 6, 1, 3, 3 }, // Arabic/Arabic/Jordan
- { 14, 4, 127, 47, 47, 47, 47, 53, 21, 22, 23, 25, 26, 28, 30, 11, 10, 13, 12, 137, 154, 10, 22, 596, 596, 596, 596, 647, 647, 24, 24, 80, 84, 22, 52, 229, 19, 0, 94, 163, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 12, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 5, 11, 5, 0, 7, 6, {75,87,68}, 3, 0, 6, 5, 6, 1, 3, 3 }, // Arabic/Arabic/Kuwait
- { 14, 4, 132, 47, 47, 47, 47, 53, 21, 22, 23, 25, 26, 28, 30, 11, 10, 13, 12, 137, 154, 10, 22, 596, 596, 596, 596, 647, 647, 24, 24, 80, 84, 22, 57, 240, 19, 0, 94, 169, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 12, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 5, 11, 5, 0, 7, 5, {76,66,80}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Arabic/Arabic/Lebanon
- { 14, 4, 135, 47, 47, 47, 47, 6, 1, 0, 32, 3, 35, 37, 9, 11, 10, 13, 12, 137, 154, 10, 22, 596, 596, 596, 596, 647, 647, 24, 24, 80, 84, 22, 62, 251, 9, 13, 94, 174, 6, 6, 6, 6, 1, 1, 1, 3, 1, 2, 2, 1, 1, 1, 1, 1, 17, 10, 12, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 5, 10, 4, 6, 7, 5, {76,89,68}, 3, 0, 6, 5, 6, 1, 3, 3 }, // Arabic/Arabic/Libya
- { 14, 4, 149, 47, 47, 47, 47, 53, 21, 22, 23, 25, 26, 28, 30, 11, 10, 13, 12, 137, 154, 10, 22, 596, 596, 596, 596, 647, 647, 24, 24, 80, 84, 22, 67, 261, 19, 0, 94, 179, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 12, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 4, 15, 5, 0, 7, 9, {77,82,85}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Arabic/Arabic/Mauritania
- { 14, 4, 159, 47, 47, 47, 47, 6, 1, 0, 32, 3, 35, 37, 9, 11, 10, 13, 12, 137, 154, 0, 0, 596, 596, 596, 596, 647, 647, 24, 24, 80, 84, 22, 71, 276, 9, 13, 94, 188, 6, 6, 6, 6, 1, 1, 1, 3, 1, 2, 2, 1, 1, 1, 1, 1, 17, 10, 10, 5, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 5, 10, 4, 6, 7, 6, {77,65,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Arabic/Arabic/Morocco
- { 14, 4, 176, 47, 47, 47, 47, 53, 21, 22, 23, 25, 26, 28, 30, 11, 10, 13, 12, 137, 154, 10, 22, 596, 596, 596, 596, 647, 647, 24, 24, 80, 84, 22, 76, 286, 19, 0, 94, 194, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 12, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 5, 10, 5, 0, 7, 5, {79,77,82}, 3, 0, 6, 5, 6, 1, 3, 3 }, // Arabic/Arabic/Oman
- { 14, 4, 180, 47, 47, 47, 47, 53, 21, 22, 23, 25, 26, 28, 30, 11, 10, 13, 12, 137, 154, 10, 22, 596, 596, 596, 596, 647, 647, 24, 24, 80, 84, 22, 46, 200, 19, 0, 94, 199, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 12, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 1, 18, 5, 0, 7, 18, {73,76,83}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Arabic/Arabic/Palestinian Territories
- { 14, 4, 190, 47, 47, 47, 47, 53, 21, 22, 23, 25, 26, 28, 30, 11, 10, 13, 12, 137, 154, 10, 22, 596, 596, 596, 596, 647, 647, 24, 24, 80, 84, 22, 81, 296, 19, 0, 94, 217, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 12, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 5, 9, 5, 0, 7, 3, {81,65,82}, 2, 1, 6, 5, 6, 1, 3, 3 }, // Arabic/Arabic/Qatar
- { 14, 4, 205, 47, 47, 47, 47, 53, 21, 22, 23, 25, 26, 28, 30, 11, 10, 13, 12, 137, 154, 10, 22, 596, 596, 596, 596, 647, 647, 24, 24, 80, 84, 22, 86, 305, 19, 0, 94, 220, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 12, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 5, 10, 5, 0, 7, 24, {83,65,82}, 2, 1, 7, 5, 6, 1, 3, 3 }, // Arabic/Arabic/Saudi Arabia
- { 14, 4, 215, 47, 47, 47, 47, 53, 21, 22, 23, 25, 26, 28, 30, 11, 10, 13, 12, 137, 154, 10, 22, 596, 596, 596, 596, 647, 647, 24, 24, 80, 84, 22, 91, 315, 19, 0, 94, 244, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 12, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 1, 10, 5, 0, 7, 7, {83,79,83}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Arabic/Arabic/Somalia
- { 14, 4, 219, 47, 47, 47, 47, 53, 21, 22, 23, 25, 26, 28, 30, 11, 10, 13, 12, 137, 154, 10, 22, 596, 596, 596, 596, 647, 647, 24, 24, 80, 84, 22, 92, 325, 19, 0, 94, 251, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 12, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 1, 17, 5, 0, 7, 12, {83,83,80}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Arabic/Arabic/South Sudan
- { 14, 4, 222, 47, 47, 47, 47, 53, 21, 22, 23, 25, 26, 28, 30, 11, 10, 13, 12, 137, 154, 10, 22, 596, 596, 596, 596, 647, 647, 24, 24, 80, 84, 22, 93, 342, 19, 0, 94, 263, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 12, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 4, 11, 5, 0, 7, 7, {83,68,71}, 2, 1, 6, 5, 6, 1, 3, 3 }, // Arabic/Arabic/Sudan
- { 14, 4, 227, 47, 47, 47, 47, 53, 21, 22, 23, 25, 26, 28, 30, 11, 10, 13, 12, 137, 154, 10, 22, 596, 596, 596, 596, 647, 647, 24, 24, 80, 84, 22, 97, 353, 19, 0, 94, 270, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 12, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 5, 10, 5, 0, 7, 5, {83,89,80}, 0, 0, 6, 5, 6, 1, 3, 3 }, // Arabic/Arabic/Syria
- { 14, 4, 238, 47, 47, 47, 47, 6, 1, 0, 32, 3, 35, 37, 9, 11, 10, 13, 12, 137, 154, 10, 22, 596, 596, 596, 596, 647, 647, 24, 24, 80, 84, 22, 102, 363, 9, 13, 94, 275, 6, 6, 6, 6, 1, 1, 1, 3, 1, 2, 2, 1, 1, 1, 1, 1, 17, 10, 12, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 5, 11, 4, 6, 7, 4, {84,78,68}, 3, 0, 1, 6, 7, 1, 3, 3 }, // Arabic/Arabic/Tunisia
- { 14, 4, 245, 47, 47, 47, 47, 6, 0, 1, 32, 3, 35, 37, 9, 11, 10, 13, 12, 137, 154, 10, 22, 596, 596, 596, 596, 647, 647, 24, 24, 80, 84, 22, 107, 374, 9, 13, 94, 279, 6, 6, 6, 6, 1, 1, 1, 3, 1, 2, 2, 1, 1, 1, 1, 1, 17, 10, 12, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 5, 12, 4, 6, 7, 24, {65,69,68}, 2, 1, 6, 5, 6, 1, 3, 3 }, // Arabic/Arabic/United Arab Emirates
- { 14, 4, 257, 47, 47, 47, 47, 6, 0, 1, 32, 3, 35, 37, 9, 11, 10, 13, 12, 137, 154, 10, 22, 596, 596, 596, 596, 647, 647, 24, 24, 80, 84, 22, 71, 276, 9, 13, 94, 303, 6, 6, 6, 6, 1, 1, 1, 3, 1, 2, 2, 1, 1, 1, 1, 1, 17, 10, 12, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 5, 10, 4, 6, 7, 15, {77,65,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Arabic/Arabic/Western Sahara
- { 14, 4, 258, 47, 47, 47, 47, 53, 21, 22, 23, 25, 26, 28, 30, 11, 10, 13, 12, 137, 154, 10, 22, 596, 596, 596, 596, 647, 647, 24, 24, 80, 84, 22, 0, 0, 19, 0, 318, 340, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 12, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 0, 0, 5, 0, 22, 6, {0,0,0}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Arabic/Arabic/World
- { 14, 4, 259, 47, 47, 47, 47, 53, 21, 22, 23, 25, 26, 28, 30, 11, 10, 13, 12, 137, 154, 10, 22, 596, 596, 596, 596, 647, 647, 24, 24, 80, 84, 22, 112, 386, 19, 0, 94, 346, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 12, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 5, 9, 5, 0, 7, 5, {89,69,82}, 0, 0, 7, 5, 6, 1, 3, 3 }, // Arabic/Arabic/Yemen
- { 15, 66, 220, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 44, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 14, 0, 4, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Aragonese/Latin/Spain
- { 17, 5, 12, 0, 0, 54, 54, 6, 1, 14, 2, 3, 4, 5, 9, 17, 18, 17, 18, 164, 184, 0, 0, 660, 660, 721, 721, 748, 748, 0, 0, 121, 127, 22, 117, 395, 19, 0, 351, 358, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 20, 8, 10, 5, 61, 61, 27, 27, 13, 13, 2, 2, 6, 17, 23, 1, 13, 5, 0, 7, 8, {65,77,68}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Armenian/Armenian/Armenia
- { 18, 9, 110, 0, 0, 61, 61, 6, 0, 1, 2, 39, 4, 5, 9, 10, 11, 12, 13, 192, 210, 42, 42, 761, 761, 818, 818, 849, 849, 25, 25, 144, 148, 22, 118, 408, 4, 0, 366, 373, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 12, 7, 57, 57, 31, 31, 13, 13, 9, 7, 4, 37, 23, 1, 12, 5, 0, 7, 4, {73,78,82}, 2, 1, 7, 7, 7, 1, 2, 3 }, // Assamese/Bangla/India
- { 19, 66, 220, 0, 0, 70, 70, 6, 1, 0, 2, 3, 4, 5, 9, 17, 18, 10, 11, 218, 87, 0, 0, 862, 862, 915, 915, 942, 942, 34, 32, 0, 5, 22, 14, 420, 19, 0, 377, 386, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 22, 6, 10, 5, 53, 53, 27, 27, 13, 13, 12, 11, 5, 17, 23, 1, 4, 5, 0, 9, 6, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Asturian/Latin/Spain
- { 20, 66, 230, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 0, 0, 955, 955, 1014, 1014, 1041, 1041, 46, 43, 0, 5, 22, 119, 424, 19, 0, 392, 398, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 59, 59, 27, 27, 13, 13, 9, 8, 4, 17, 23, 3, 21, 5, 0, 6, 8, {84,90,83}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Asu/Latin/Tanzania
- { 21, 66, 169, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 44, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 122, 0, 4, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {78,71,78}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Atsam/Latin/Nigeria
- { 25, 66, 17, 0, 0, 77, 77, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 240, 184, 0, 0, 1054, 1054, 1120, 1146, 96, 96, 0, 0, 185, 5, 22, 123, 445, 19, 0, 406, 416, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 8, 10, 5, 66, 66, 26, 26, 13, 13, 2, 2, 4, 17, 23, 1, 17, 5, 0, 10, 10, {65,90,78}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Azerbaijani/Latin/Azerbaijan
- { 25, 4, 112, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 44, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 0, 0, 4, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 0, 0, {73,82,82}, 0, 0, 6, 5, 5, 1, 3, 3 }, // Azerbaijani/Arabic/Iran
- { 25, 27, 17, 0, 0, 0, 0, 6, 1, 0, 2, 3, 4, 5, 9, 17, 18, 19, 20, 240, 184, 0, 0, 1172, 1172, 1238, 1238, 96, 96, 55, 51, 0, 5, 22, 123, 462, 19, 0, 426, 436, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 8, 10, 5, 66, 66, 26, 26, 13, 13, 2, 2, 4, 17, 23, 1, 5, 5, 0, 10, 10, {65,90,78}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Azerbaijani/Cyrillic/Azerbaijan
- { 26, 66, 40, 0, 0, 0, 0, 6, 1, 14, 2, 3, 4, 5, 9, 17, 18, 12, 13, 71, 87, 0, 0, 1264, 1264, 1308, 1308, 1336, 1336, 57, 53, 0, 5, 22, 3, 467, 19, 0, 446, 451, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 44, 44, 28, 28, 13, 13, 6, 7, 4, 17, 23, 4, 4, 5, 0, 5, 7, {88,65,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Bafia/Latin/Cameroon
- { 28, 66, 145, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 17, 18, 10, 11, 71, 87, 0, 0, 1349, 1349, 1392, 1392, 1419, 1419, 0, 0, 0, 5, 22, 124, 471, 9, 13, 458, 467, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 43, 43, 27, 27, 13, 13, 2, 2, 4, 17, 23, 5, 17, 4, 6, 9, 4, {88,79,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Bambara/Latin/Mali
- { 28, 90, 145, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 44, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 124, 0, 4, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 5, 0, 5, 0, 0, 0, {88,79,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Bambara/Nko/Mali
- { 30, 9, 20, 0, 0, 85, 85, 6, 0, 1, 2, 39, 4, 5, 9, 10, 11, 12, 13, 192, 87, 10, 22, 1432, 1432, 1489, 1489, 1525, 1525, 0, 0, 144, 5, 22, 129, 488, 0, 31, 471, 476, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 12, 7, 57, 57, 36, 36, 17, 17, 2, 2, 4, 17, 23, 1, 14, 4, 6, 5, 8, {66,68,84}, 2, 1, 7, 6, 7, 1, 2, 3 }, // Bangla/Bangla/Bangladesh
- { 30, 9, 110, 0, 0, 85, 85, 6, 0, 1, 2, 39, 4, 5, 9, 10, 11, 12, 13, 192, 87, 10, 22, 1432, 1432, 1489, 1489, 1525, 1525, 0, 0, 144, 5, 22, 118, 502, 0, 31, 471, 484, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 12, 7, 57, 57, 36, 36, 17, 17, 2, 2, 4, 17, 23, 1, 12, 4, 6, 5, 4, {73,78,82}, 2, 1, 7, 7, 7, 1, 2, 3 }, // Bangla/Bangla/India
- { 31, 66, 40, 0, 0, 0, 0, 6, 1, 14, 2, 3, 4, 5, 9, 17, 18, 15, 10, 71, 87, 0, 0, 1542, 1542, 1611, 1611, 1638, 1638, 63, 60, 0, 5, 22, 3, 514, 19, 0, 488, 493, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 69, 69, 27, 27, 13, 13, 10, 9, 4, 17, 23, 4, 15, 5, 0, 5, 8, {88,65,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Basaa/Latin/Cameroon
- { 32, 27, 193, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 44, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 130, 0, 4, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {82,85,66}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Bashkir/Cyrillic/Russia
- { 33, 66, 220, 0, 0, 94, 94, 6, 1, 0, 2, 3, 40, 5, 9, 10, 11, 10, 11, 257, 293, 54, 0, 1651, 1651, 1718, 1718, 1745, 1745, 0, 0, 189, 5, 22, 14, 529, 19, 24, 501, 508, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 36, 6, 12, 5, 67, 67, 27, 27, 13, 13, 2, 2, 7, 17, 23, 1, 5, 5, 7, 7, 8, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Basque/Latin/Spain
- { 35, 27, 22, 0, 0, 103, 103, 6, 1, 14, 2, 3, 4, 5, 9, 17, 18, 15, 10, 299, 185, 66, 0, 1758, 1758, 1813, 1813, 1833, 1833, 0, 0, 196, 201, 22, 131, 534, 19, 0, 516, 526, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 22, 7, 11, 5, 55, 55, 20, 20, 13, 13, 2, 2, 5, 17, 23, 2, 16, 5, 0, 10, 8, {66,89,78}, 2, 0, 1, 6, 7, 2, 3, 3 }, // Belarusian/Cyrillic/Belarus
- { 36, 66, 260, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 10, 22, 1846, 1846, 1846, 1846, 83, 83, 73, 69, 0, 5, 22, 133, 0, 9, 13, 534, 543, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 79, 79, 79, 79, 13, 13, 8, 7, 4, 17, 23, 1, 0, 4, 6, 9, 6, {90,77,87}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Bemba/Latin/Zambia
- { 37, 66, 230, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 0, 0, 1925, 1925, 2006, 2006, 2033, 2033, 81, 76, 0, 5, 22, 119, 550, 0, 0, 549, 555, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 81, 81, 27, 27, 13, 13, 7, 7, 4, 17, 23, 3, 22, 4, 0, 6, 10, {84,90,83}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Bena/Latin/Tanzania
- { 40, 33, 74, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 44, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 0, 0, 4, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 0, 0, {69,82,78}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Blin/Ethiopic/Eritrea
- { 41, 29, 110, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 321, 339, 10, 22, 2046, 2046, 2099, 2099, 2131, 2131, 88, 83, 0, 5, 22, 118, 572, 4, 0, 565, 569, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 12, 7, 53, 53, 32, 32, 18, 18, 3, 6, 4, 17, 23, 1, 3, 5, 0, 4, 4, {73,78,82}, 2, 1, 7, 7, 7, 1, 2, 3 }, // Bodo/Devanagari/India
- { 42, 66, 29, 0, 0, 110, 110, 6, 1, 0, 2, 3, 4, 5, 9, 15, 11, 12, 13, 345, 364, 0, 0, 2149, 2149, 2206, 2206, 2233, 2246, 91, 89, 218, 5, 22, 134, 575, 19, 0, 573, 581, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 11, 10, 5, 57, 57, 27, 27, 13, 13, 10, 7, 7, 17, 23, 2, 40, 5, 0, 8, 19, {66,65,77}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Bosnian/Latin/Bosnia And Herzegovina
- { 42, 27, 29, 0, 0, 117, 117, 6, 1, 0, 2, 3, 4, 5, 9, 15, 10, 16, 12, 375, 395, 0, 0, 2259, 2259, 2314, 2314, 2341, 2341, 101, 96, 0, 5, 22, 136, 615, 19, 0, 600, 608, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 20, 7, 10, 5, 55, 55, 27, 27, 13, 13, 11, 13, 4, 17, 23, 2, 19, 5, 0, 8, 19, {66,65,77}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Bosnian/Cyrillic/Bosnia And Herzegovina
- { 43, 66, 84, 0, 0, 124, 124, 6, 1, 14, 2, 3, 4, 5, 9, 17, 18, 10, 11, 71, 127, 0, 0, 2354, 2354, 2396, 2396, 2428, 2428, 112, 109, 225, 232, 249, 14, 420, 19, 0, 627, 636, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 42, 42, 32, 32, 17, 17, 4, 4, 7, 17, 23, 1, 4, 5, 0, 9, 5, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Breton/Latin/France
- { 45, 27, 36, 0, 0, 117, 117, 6, 1, 14, 2, 3, 4, 5, 9, 15, 10, 15, 10, 299, 402, 77, 91, 2445, 2445, 2499, 2499, 2519, 2519, 116, 113, 272, 5, 22, 138, 634, 19, 24, 641, 650, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 22, 12, 14, 9, 54, 54, 20, 20, 13, 13, 6, 6, 7, 17, 23, 3, 13, 5, 7, 9, 8, {66,71,78}, 2, 1, 1, 6, 7, 2, 3, 3 }, // Bulgarian/Cyrillic/Bulgaria
- { 46, 86, 161, 132, 132, 139, 139, 149, 0, 1, 2, 41, 4, 5, 9, 10, 11, 12, 13, 414, 432, 100, 1, 2532, 2532, 2532, 2532, 2585, 2585, 122, 119, 279, 5, 22, 133, 647, 4, 0, 658, 658, 7, 7, 10, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 10, 4, 53, 53, 53, 53, 13, 13, 5, 3, 5, 17, 23, 1, 11, 5, 0, 6, 6, {77,77,75}, 0, 0, 7, 6, 7, 1, 3, 3 }, // Burmese/Myanmar/Myanmar
- { 47, 137, 107, 150, 150, 155, 155, 6, 0, 1, 2, 3, 4, 5, 9, 42, 43, 44, 45, 440, 454, 110, 27, 2598, 2598, 2598, 2598, 2625, 2625, 127, 122, 0, 5, 22, 141, 658, 9, 13, 664, 666, 5, 5, 5, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 14, 8, 13, 6, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 2, 4, 6, 2, 14, {72,75,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Cantonese/Traditional Han/Hong Kong
- { 47, 118, 50, 150, 150, 155, 155, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 462, 454, 100, 0, 2598, 2598, 2638, 2638, 2625, 2625, 127, 122, 0, 5, 22, 144, 660, 9, 13, 680, 682, 5, 5, 5, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 13, 8, 10, 5, 27, 27, 20, 20, 13, 13, 2, 2, 4, 17, 23, 1, 3, 4, 6, 2, 7, {67,78,89}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Cantonese/Simplified Han/China
- { 48, 66, 220, 0, 0, 110, 110, 6, 1, 0, 2, 3, 4, 5, 9, 17, 18, 10, 11, 218, 87, 55, 1, 2658, 2658, 2717, 2717, 2744, 2744, 129, 124, 0, 5, 22, 14, 420, 19, 24, 689, 695, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 22, 6, 11, 4, 59, 59, 27, 27, 20, 20, 5, 5, 5, 17, 23, 1, 4, 5, 7, 6, 7, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Catalan/Latin/Spain
- { 48, 66, 6, 0, 0, 110, 110, 6, 1, 0, 2, 3, 4, 5, 9, 17, 18, 10, 11, 218, 87, 55, 1, 2658, 2658, 2717, 2717, 2744, 2744, 129, 124, 0, 5, 22, 14, 420, 19, 24, 689, 702, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 22, 6, 11, 4, 59, 59, 27, 27, 20, 20, 5, 5, 5, 17, 23, 1, 4, 5, 7, 6, 7, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Catalan/Latin/Andorra
- { 48, 66, 84, 0, 0, 110, 110, 6, 1, 0, 2, 3, 4, 5, 9, 17, 18, 10, 11, 218, 87, 55, 1, 2658, 2658, 2717, 2717, 2744, 2744, 129, 124, 0, 5, 22, 14, 420, 19, 24, 689, 709, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 22, 6, 11, 4, 59, 59, 27, 27, 20, 20, 5, 5, 5, 17, 23, 1, 4, 5, 7, 6, 6, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Catalan/Latin/France
- { 48, 66, 117, 0, 0, 110, 110, 6, 1, 0, 2, 3, 4, 5, 9, 17, 18, 10, 11, 218, 87, 55, 1, 2658, 2658, 2717, 2717, 2744, 2744, 129, 124, 0, 5, 22, 14, 420, 19, 24, 689, 715, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 22, 6, 11, 4, 59, 59, 27, 27, 20, 20, 5, 5, 5, 17, 23, 1, 4, 5, 7, 6, 6, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Catalan/Latin/Italy
- { 49, 66, 185, 0, 0, 160, 169, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 321, 339, 10, 22, 2764, 2764, 2819, 2819, 2846, 2846, 0, 0, 284, 5, 22, 145, 663, 9, 13, 721, 729, 6, 6, 9, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 12, 7, 55, 55, 27, 27, 13, 13, 2, 2, 8, 17, 23, 1, 15, 4, 6, 8, 9, {80,72,80}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Cebuano/Latin/Philippines
- { 50, 66, 159, 0, 0, 0, 0, 6, 1, 14, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 0, 0, 2859, 2859, 2906, 2906, 2933, 2933, 134, 129, 0, 5, 22, 0, 678, 19, 0, 738, 755, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 47, 47, 27, 27, 13, 13, 9, 10, 4, 17, 23, 0, 15, 5, 0, 17, 6, {77,65,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Central Atlas Tamazight/Latin/Morocco
- { 51, 4, 113, 0, 0, 0, 0, 53, 21, 22, 23, 25, 46, 48, 30, 10, 11, 12, 13, 27, 44, 10, 22, 2946, 2946, 2946, 2946, 3003, 3003, 143, 139, 0, 5, 22, 41, 693, 19, 0, 761, 775, 6, 6, 6, 6, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 12, 7, 57, 57, 57, 57, 13, 13, 3, 3, 4, 17, 23, 5, 13, 5, 0, 14, 5, {73,81,68}, 0, 0, 6, 5, 6, 1, 3, 3 }, // Central Kurdish/Arabic/Iraq
- { 51, 4, 112, 0, 0, 0, 0, 53, 21, 22, 23, 25, 46, 48, 30, 10, 11, 12, 13, 27, 44, 0, 0, 2946, 2946, 2946, 2946, 3003, 3003, 143, 139, 0, 5, 22, 0, 706, 19, 0, 761, 780, 6, 6, 6, 6, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 10, 5, 57, 57, 57, 57, 13, 13, 3, 3, 4, 17, 23, 0, 12, 5, 0, 14, 5, {73,82,82}, 0, 0, 6, 5, 5, 1, 3, 3 }, // Central Kurdish/Arabic/Iran
- { 52, 21, 20, 0, 0, 177, 177, 6, 0, 1, 2, 50, 4, 5, 9, 10, 11, 12, 13, 192, 87, 10, 22, 3016, 3016, 3142, 3142, 3226, 3226, 0, 0, 292, 5, 22, 129, 718, 0, 31, 785, 797, 6, 6, 12, 12, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 18, 6, 12, 7,126,126, 84, 84, 38, 38, 2, 2, 8, 17, 23, 1, 21, 4, 6, 12, 14, {66,68,84}, 2, 1, 7, 6, 7, 1, 2, 3 }, // Chakma/Chakma/Bangladesh
- { 52, 21, 110, 0, 0, 177, 177, 6, 0, 1, 2, 50, 4, 5, 9, 10, 11, 12, 13, 192, 87, 10, 22, 3016, 3016, 3142, 3142, 3226, 3226, 0, 0, 292, 5, 22, 118, 739, 0, 31, 785, 811, 6, 6, 12, 12, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 18, 6, 12, 7,126,126, 84, 84, 38, 38, 2, 2, 8, 17, 23, 1, 27, 4, 6, 12, 10, {73,78,82}, 2, 1, 7, 7, 7, 1, 2, 3 }, // Chakma/Chakma/India
- { 54, 27, 193, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 44, 0, 0, 3264, 3264, 3308, 3308, 3332, 3308, 0, 0, 0, 5, 22, 130, 766, 19, 0, 821, 828, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 44, 44, 24, 24, 16, 24, 2, 2, 4, 17, 23, 1, 11, 5, 0, 7, 5, {82,85,66}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Chechen/Cyrillic/Russia
- { 55, 23, 248, 0, 0, 189, 198, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 321, 339, 10, 22, 3348, 3348, 3396, 3396, 3423, 3423, 146, 142, 300, 5, 22, 2, 777, 9, 13, 833, 836, 6, 6, 9, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 12, 7, 48, 48, 27, 27, 13, 13, 3, 6, 6, 17, 23, 1, 6, 4, 6, 3, 15, {85,83,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Cherokee/Cherokee/United States
- { 56, 66, 248, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 44, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 146, 0, 4, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 0, 5, 0, 0, 0, {85,83,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Chickasaw/Latin/United States
- { 57, 66, 243, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 0, 0, 3436, 3436, 3509, 3509, 3536, 3536, 0, 0, 0, 5, 22, 149, 783, 9, 0, 851, 857, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 73, 73, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 19, 4, 0, 6, 6, {85,71,88}, 0, 0, 1, 7, 7, 1, 3, 3 }, // Chiga/Latin/Uganda
- { 58, 118, 50, 150, 150, 206, 206, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 462, 454, 100, 0, 2598, 2598, 2638, 2638, 2625, 2625, 127, 122, 306, 5, 22, 152, 660, 9, 13, 863, 867, 5, 5, 5, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 13, 8, 10, 5, 27, 27, 20, 20, 13, 13, 2, 2, 2, 17, 23, 1, 3, 4, 6, 4, 2, {67,78,89}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Chinese/Simplified Han/China
- { 58, 118, 107, 150, 150, 206, 206, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 462, 87, 123, 27, 2598, 2598, 2638, 2638, 2625, 2625, 127, 122, 306, 5, 22, 141, 802, 9, 13, 863, 869, 5, 5, 5, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 13, 6, 11, 6, 27, 27, 20, 20, 13, 13, 2, 2, 2, 17, 23, 3, 2, 4, 6, 4, 9, {72,75,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Chinese/Simplified Han/Hong Kong
- { 58, 118, 139, 150, 150, 206, 206, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 462, 87, 123, 27, 2598, 2598, 2638, 2638, 2625, 2625, 127, 122, 306, 5, 22, 153, 804, 9, 13, 863, 878, 5, 5, 5, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 13, 6, 11, 6, 27, 27, 20, 20, 13, 13, 2, 2, 2, 17, 23, 4, 3, 4, 6, 4, 9, {77,79,80}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Chinese/Simplified Han/Macao
- { 58, 118, 210, 150, 150, 206, 206, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 462, 127, 123, 27, 2598, 2598, 2638, 2638, 2625, 2625, 127, 122, 306, 5, 22, 2, 807, 9, 13, 863, 887, 5, 5, 5, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 13, 8, 11, 6, 27, 27, 20, 20, 13, 13, 2, 2, 2, 17, 23, 1, 4, 4, 6, 4, 3, {83,71,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Chinese/Simplified Han/Singapore
- { 58, 137, 107, 150, 150, 211, 211, 6, 0, 1, 2, 3, 4, 5, 9, 42, 43, 44, 45, 462, 87, 110, 27, 2598, 2598, 3549, 3549, 2625, 2625, 127, 122, 308, 5, 22, 141, 802, 9, 13, 890, 894, 5, 5, 5, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 13, 8, 13, 6, 27, 27, 20, 20, 13, 13, 2, 2, 3, 17, 23, 3, 2, 4, 6, 4, 9, {72,75,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Chinese/Traditional Han/Hong Kong
- { 58, 137, 139, 150, 150, 211, 211, 6, 0, 1, 2, 3, 4, 5, 9, 42, 43, 44, 45, 462, 87, 110, 27, 2598, 2598, 3549, 3549, 2625, 2625, 127, 122, 308, 5, 22, 153, 811, 9, 13, 890, 903, 5, 5, 5, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 13, 8, 13, 6, 27, 27, 20, 20, 13, 13, 2, 2, 3, 17, 23, 4, 3, 4, 6, 4, 9, {77,79,80}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Chinese/Traditional Han/Macao
- { 58, 137, 228, 150, 150, 206, 206, 6, 0, 1, 2, 3, 4, 5, 9, 42, 43, 44, 45, 440, 454, 134, 134, 2598, 2598, 3549, 3549, 2625, 2625, 127, 122, 0, 5, 22, 2, 814, 9, 13, 890, 912, 5, 5, 5, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 14, 8, 12, 5, 27, 27, 20, 20, 13, 13, 2, 2, 4, 17, 23, 1, 3, 4, 6, 4, 2, {84,87,68}, 2, 0, 7, 6, 7, 1, 3, 3 }, // Chinese/Traditional Han/Taiwan
- { 59, 27, 193, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 44, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 130, 0, 4, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {82,85,66}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Church/Cyrillic/Russia
- { 60, 27, 193, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 44, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 130, 0, 4, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {82,85,66}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Chuvash/Cyrillic/Russia
- { 61, 66, 91, 0, 0, 216, 216, 6, 1, 14, 2, 3, 40, 5, 52, 15, 10, 16, 12, 475, 364, 0, 0, 3569, 3569, 3640, 3640, 3667, 3667, 149, 148, 0, 5, 22, 14, 73, 19, 0, 914, 920, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 23, 10, 10, 5, 71, 71, 27, 27, 13, 13, 16, 16, 4, 17, 23, 1, 4, 5, 0, 6, 11, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Colognian/Latin/Germany
- { 63, 66, 246, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 71, 127, 0, 0, 3680, 3680, 3740, 3740, 83, 83, 165, 164, 0, 5, 22, 92, 0, 9, 0, 931, 939, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 60, 60, 27, 27, 13, 13, 4, 4, 4, 17, 23, 1, 0, 4, 0, 8, 14, {71,66,80}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Cornish/Latin/United Kingdom
- { 64, 66, 84, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 44, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 14, 0, 4, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Corsican/Latin/France
- { 66, 66, 60, 0, 0, 110, 110, 6, 1, 0, 2, 3, 40, 5, 9, 15, 10, 16, 12, 345, 498, 54, 0, 2149, 2149, 2206, 2206, 2233, 2246, 0, 0, 218, 5, 22, 157, 817, 19, 0, 953, 961, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 13, 12, 5, 57, 57, 27, 27, 13, 13, 2, 2, 7, 17, 23, 2, 13, 5, 0, 8, 8, {72,82,75}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Croatian/Latin/Croatia
- { 66, 66, 29, 0, 0, 110, 110, 6, 1, 0, 2, 3, 40, 5, 9, 15, 10, 16, 12, 345, 511, 54, 0, 2149, 2149, 2206, 2206, 2246, 2246, 0, 0, 218, 5, 22, 134, 596, 19, 0, 953, 581, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 9, 12, 5, 57, 57, 27, 27, 13, 13, 2, 2, 7, 17, 23, 2, 19, 5, 0, 8, 19, {66,65,77}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Croatian/Latin/Bosnia And Herzegovina
- { 67, 66, 64, 0, 0, 224, 224, 6, 1, 14, 2, 3, 4, 5, 9, 15, 10, 16, 12, 520, 184, 1, 1, 3767, 3767, 3815, 3815, 3835, 3835, 169, 168, 311, 5, 22, 159, 830, 19, 0, 969, 976, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 8, 9, 4, 48, 48, 20, 20, 13, 13, 4, 4, 5, 17, 23, 2, 12, 5, 0, 7, 5, {67,90,75}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Czech/Latin/Czechia
- { 68, 66, 65, 0, 0, 231, 231, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 537, 560, 146, 146, 3848, 3848, 3898, 3925, 3959, 3959, 0, 0, 0, 5, 22, 161, 842, 19, 0, 981, 986, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 10, 10, 5, 50, 50, 27, 34, 13, 13, 2, 2, 5, 17, 23, 3, 11, 5, 0, 5, 7, {68,75,75}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Danish/Latin/Denmark
- { 68, 66, 95, 0, 0, 231, 231, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 537, 560, 146, 146, 3848, 3848, 3898, 3925, 3959, 3959, 0, 0, 0, 5, 22, 161, 842, 19, 0, 981, 993, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 10, 10, 5, 50, 50, 27, 34, 13, 13, 2, 2, 5, 17, 23, 3, 11, 5, 0, 5, 8, {68,75,75}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Danish/Latin/Greenland
- { 69, 132, 144, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 44, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 0, 0, 4, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 0, 0, {77,86,82}, 2, 1, 5, 6, 7, 1, 3, 3 }, // Divehi/Thaana/Maldives
- { 70, 29, 110, 0, 0, 239, 248, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 570, 87, 10, 22, 3972, 4022, 4072, 4072, 4101, 4123, 173, 172, 0, 5, 22, 118, 853, 9, 0, 1001, 569, 6, 6, 9, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 12, 7, 50, 50, 29, 29, 22, 24, 4, 9, 4, 17, 23, 1, 10, 4, 0, 5, 4, {73,78,82}, 2, 1, 7, 7, 7, 1, 3, 3 }, // Dogri/Devanagari/India
- { 71, 66, 40, 0, 0, 0, 0, 6, 1, 14, 2, 3, 4, 5, 9, 17, 18, 12, 13, 71, 87, 0, 0, 4147, 4147, 4191, 4191, 4218, 4218, 177, 181, 0, 5, 22, 3, 0, 19, 0, 1006, 1011, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 44, 44, 27, 27, 13, 13, 5, 6, 4, 17, 23, 4, 0, 5, 0, 5, 8, {88,65,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Duala/Latin/Cameroon
- { 72, 66, 165, 0, 0, 7, 7, 6, 1, 0, 2, 3, 4, 5, 9, 12, 13, 12, 13, 71, 432, 0, 0, 4231, 4231, 4289, 4289, 4309, 4309, 165, 164, 0, 5, 22, 14, 73, 4, 37, 1019, 1019, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 58, 58, 20, 20, 13, 13, 4, 4, 4, 17, 23, 1, 4, 5, 7, 10, 9, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Dutch/Latin/Netherlands
- { 72, 66, 13, 0, 0, 7, 7, 6, 1, 0, 2, 3, 4, 5, 9, 12, 13, 12, 13, 71, 432, 0, 0, 4231, 4231, 4289, 4289, 4309, 4309, 165, 164, 0, 5, 22, 164, 863, 4, 37, 1019, 1029, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 58, 58, 20, 20, 13, 13, 4, 4, 4, 17, 23, 4, 16, 5, 7, 10, 5, {65,87,71}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Dutch/Latin/Aruba
- { 72, 66, 23, 0, 0, 7, 7, 6, 1, 0, 2, 3, 4, 5, 9, 12, 13, 12, 13, 71, 128, 0, 0, 4231, 4231, 4289, 4289, 4309, 4309, 165, 164, 0, 5, 22, 14, 73, 4, 37, 1034, 1040, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 9, 10, 5, 58, 58, 20, 20, 13, 13, 4, 4, 4, 17, 23, 1, 4, 5, 7, 6, 6, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Dutch/Latin/Belgium
- { 72, 66, 44, 0, 0, 7, 7, 6, 1, 0, 2, 3, 4, 5, 9, 12, 13, 12, 13, 71, 432, 0, 0, 4231, 4231, 4289, 4289, 4309, 4309, 165, 164, 0, 5, 22, 2, 879, 4, 37, 1019, 1046, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 58, 58, 20, 20, 13, 13, 4, 4, 4, 17, 23, 1, 18, 5, 7, 10, 19, {85,83,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Dutch/Latin/Caribbean Netherlands
- { 72, 66, 62, 0, 0, 7, 7, 6, 1, 0, 2, 3, 4, 5, 9, 12, 13, 12, 13, 71, 432, 0, 0, 4231, 4231, 4289, 4289, 4309, 4309, 165, 164, 0, 5, 22, 168, 897, 4, 37, 1019, 1065, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 58, 58, 20, 20, 13, 13, 4, 4, 4, 17, 23, 4, 30, 5, 7, 10, 7, {65,78,71}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Dutch/Latin/Curacao
- { 72, 66, 211, 0, 0, 7, 7, 6, 1, 0, 2, 3, 4, 5, 9, 12, 13, 12, 13, 71, 432, 0, 0, 4231, 4231, 4289, 4289, 4309, 4309, 165, 164, 0, 5, 22, 168, 897, 4, 37, 1019, 1072, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 58, 58, 20, 20, 13, 13, 4, 4, 4, 17, 23, 4, 30, 5, 7, 10, 12, {65,78,71}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Dutch/Latin/Sint Maarten
- { 72, 66, 223, 0, 0, 7, 7, 6, 1, 0, 2, 3, 4, 5, 9, 12, 13, 12, 13, 71, 432, 0, 0, 4231, 4231, 4289, 4289, 4309, 4309, 165, 164, 0, 5, 22, 2, 927, 4, 37, 1019, 1084, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 58, 58, 20, 20, 13, 13, 4, 4, 4, 17, 23, 1, 17, 5, 7, 10, 8, {83,82,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Dutch/Latin/Suriname
- { 73, 134, 27, 256, 256, 256, 256, 6, 0, 1, 2, 56, 4, 5, 9, 10, 11, 12, 13, 588, 44, 156, 183, 4322, 4322, 4400, 4400, 4433, 4433, 182, 187, 0, 5, 22, 172, 944, 9, 0, 1092, 1098, 9, 9, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 30, 10, 27, 22, 78, 78, 33, 33, 26, 26, 5, 6, 4, 17, 23, 3, 8, 4, 0, 6, 5, {66,84,78}, 2, 1, 7, 6, 7, 1, 2, 3 }, // Dzongkha/Tibetan/Bhutan
- { 74, 66, 124, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 0, 0, 4459, 4459, 4522, 4522, 4549, 4549, 187, 193, 0, 5, 22, 175, 952, 9, 13, 1103, 1109, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 63, 63, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 17, 4, 6, 6, 5, {75,69,83}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Embu/Latin/Kenya
- { 75, 66, 248, 0, 0, 265, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 321, 339, 10, 22, 0, 0, 56, 56, 83, 83, 0, 0, 0, 5, 22, 2, 969, 9, 13, 1114, 1130, 6, 6, 10, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 9, 4, 6, 16, 13, {85,83,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // English/Latin/United States
- { 75, 28, 248, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 44, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 146, 0, 4, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 0, 5, 0, 0, 0, {85,83,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // English/Deseret/United States
- { 75, 66, 5, 0, 0, 265, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 321, 339, 10, 22, 0, 0, 56, 56, 83, 83, 0, 0, 0, 5, 22, 2, 969, 9, 13, 1123, 1143, 6, 6, 10, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 9, 4, 6, 7, 14, {85,83,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // English/Latin/American Samoa
- { 75, 66, 8, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 0, 0, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 2, 978, 9, 13, 1123, 1157, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 21, 4, 6, 7, 8, {88,67,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Anguilla
- { 75, 66, 10, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 10, 22, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 2, 978, 9, 13, 1123, 1165, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 21, 4, 6, 7, 17, {88,67,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // English/Latin/Antigua And Barbuda
- { 75, 66, 15, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 6, 10, 11, 12, 13, 0, 87, 10, 22, 0, 0, 56, 56, 4562, 4562, 82, 195, 0, 5, 22, 2, 999, 9, 13, 1182, 1182, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 12, 7, 56, 56, 27, 27, 24, 24, 2, 2, 5, 17, 23, 1, 17, 4, 6, 18, 9, {65,85,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Australia
- { 75, 66, 16, 0, 0, 275, 275, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 0, 0, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 14, 73, 4, 0, 1123, 1200, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 4, 5, 0, 7, 7, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Austria
- { 75, 66, 18, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 10, 22, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 2, 1016, 9, 13, 1123, 1207, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 15, 4, 6, 7, 7, {66,83,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // English/Latin/Bahamas
- { 75, 66, 21, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 10, 22, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 2, 1031, 9, 13, 1123, 1214, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 16, 4, 6, 7, 8, {66,66,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Barbados
- { 75, 66, 23, 0, 0, 275, 275, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 0, 0, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 14, 73, 19, 0, 1123, 1222, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 8, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 4, 5, 0, 7, 7, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Belgium
- { 75, 66, 24, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 618, 127, 0, 0, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 2, 1047, 9, 13, 1123, 1229, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 13, 4, 6, 7, 6, {66,90,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // English/Latin/Belize
- { 75, 66, 26, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 10, 22, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 2, 1060, 9, 13, 1123, 1235, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 16, 4, 6, 7, 7, {66,77,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Bermuda
- { 75, 66, 30, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 618, 127, 0, 0, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 155, 1076, 9, 13, 1123, 1242, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 14, 4, 6, 7, 8, {66,87,80}, 2, 1, 7, 6, 7, 1, 3, 3 }, // English/Latin/Botswana
- { 75, 66, 33, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 0, 0, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 146, 969, 9, 13, 1123, 1250, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 9, 4, 6, 7, 30, {85,83,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/British Indian Ocean Territory
- { 75, 66, 34, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 10, 22, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 146, 969, 9, 13, 1123, 1280, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 9, 4, 6, 7, 22, {85,83,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/British Virgin Islands
- { 75, 66, 38, 0, 0, 265, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 321, 339, 0, 0, 0, 0, 56, 56, 83, 83, 0, 0, 0, 5, 22, 178, 1090, 9, 13, 1123, 1302, 6, 6, 10, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 15, 4, 6, 7, 7, {66,73,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // English/Latin/Burundi
- { 75, 66, 40, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 0, 0, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 3, 1105, 9, 13, 1123, 1309, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 4, 25, 4, 6, 7, 8, {88,65,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // English/Latin/Cameroon
- { 75, 66, 41, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 321, 44, 10, 22, 0, 0, 56, 56, 83, 83, 165, 164, 0, 5, 22, 2, 1130, 9, 13, 1317, 1333, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 10, 12, 7, 56, 56, 27, 27, 13, 13, 4, 4, 5, 17, 23, 1, 15, 4, 6, 16, 6, {67,65,68}, 2, 0, 7, 6, 7, 1, 3, 3 }, // English/Latin/Canada
- { 75, 66, 45, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 10, 22, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 2, 1145, 9, 13, 1123, 1339, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 21, 4, 6, 7, 14, {75,89,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Cayman Islands
- { 75, 66, 51, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 0, 0, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 2, 999, 9, 13, 1123, 1353, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 17, 4, 6, 7, 16, {65,85,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Christmas Island
- { 75, 66, 53, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 0, 0, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 2, 999, 9, 13, 1123, 1369, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 17, 4, 6, 7, 23, {65,85,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Cocos Islands
- { 75, 66, 58, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 0, 0, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 2, 1166, 9, 13, 1123, 1392, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 18, 4, 6, 7, 12, {78,90,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Cook Islands
- { 75, 66, 63, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 10, 22, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 14, 73, 9, 13, 1123, 1404, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 4, 4, 6, 7, 6, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Cyprus
- { 75, 66, 65, 0, 0, 275, 275, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 146, 146, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 161, 1184, 19, 0, 1123, 1410, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 12, 5, 0, 7, 7, {68,75,75}, 2, 0, 1, 6, 7, 1, 3, 3 }, // English/Latin/Denmark
- { 75, 66, 66, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 0, 0, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 146, 969, 9, 13, 1123, 1417, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 9, 4, 6, 7, 12, {85,83,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Diego Garcia
- { 75, 66, 68, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 10, 22, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 2, 978, 9, 13, 1123, 1429, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 21, 4, 6, 7, 8, {88,67,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // English/Latin/Dominica
- { 75, 66, 74, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 10, 22, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 38, 1196, 9, 13, 1123, 1437, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 14, 4, 6, 7, 7, {69,82,78}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Eritrea
- { 75, 66, 76, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 10, 22, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 181, 1210, 9, 13, 1123, 1444, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 15, 4, 6, 7, 8, {83,90,76}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Eswatini
- { 75, 66, 78, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 0, 0, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 0, 0, 19, 0, 1123, 1452, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 0, 0, 5, 0, 7, 6, {0,0,0}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Europe
- { 75, 66, 80, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 0, 0, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 92, 1225, 9, 13, 1123, 1458, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 22, 4, 6, 7, 16, {70,75,80}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Falkland Islands
- { 75, 66, 82, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 10, 22, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 2, 1247, 9, 13, 1123, 1474, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 13, 4, 6, 7, 4, {70,74,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Fiji
- { 75, 66, 83, 0, 0, 275, 275, 6, 1, 14, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 147, 147, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 14, 73, 19, 0, 1123, 1478, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 9, 4, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 4, 5, 0, 7, 7, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Finland
- { 75, 66, 89, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 10, 22, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 182, 1260, 9, 13, 1123, 1485, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 14, 4, 6, 7, 6, {71,77,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Gambia
- { 75, 66, 91, 0, 0, 275, 275, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 0, 0, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 14, 73, 19, 0, 1123, 1491, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 4, 5, 0, 7, 7, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Germany
- { 75, 66, 92, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 10, 22, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 7, 1274, 9, 13, 1123, 1498, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 13, 4, 6, 7, 5, {71,72,83}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Ghana
- { 75, 66, 93, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 0, 0, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 92, 1287, 9, 13, 1123, 1503, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 15, 4, 6, 7, 9, {71,73,80}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Gibraltar
- { 75, 66, 96, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 10, 22, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 2, 978, 9, 13, 1123, 1512, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 21, 4, 6, 7, 7, {88,67,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Grenada
- { 75, 66, 98, 0, 0, 265, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 321, 339, 10, 22, 0, 0, 56, 56, 83, 83, 0, 0, 0, 5, 22, 2, 969, 9, 13, 1123, 1519, 6, 6, 10, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 9, 4, 6, 7, 4, {85,83,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // English/Latin/Guam
- { 75, 66, 100, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 0, 0, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 92, 1302, 9, 13, 1123, 1523, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 8, 4, 6, 7, 8, {71,66,80}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Guernsey
- { 75, 66, 103, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 10, 22, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 2, 1310, 9, 13, 1123, 1531, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 16, 4, 6, 7, 6, {71,89,68}, 2, 0, 1, 6, 7, 1, 3, 3 }, // English/Latin/Guyana
- { 75, 66, 107, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 87, 10, 22, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 141, 1326, 9, 13, 1123, 1537, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 8, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 16, 4, 6, 7, 19, {72,75,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // English/Latin/Hong Kong
- { 75, 66, 110, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 192, 127, 10, 22, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 118, 1342, 9, 13, 1123, 1258, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 12, 4, 6, 7, 5, {73,78,82}, 2, 1, 7, 7, 7, 1, 2, 3 }, // English/Latin/India
- { 75, 66, 114, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 71, 127, 0, 0, 0, 0, 56, 56, 83, 83, 165, 164, 0, 5, 22, 14, 73, 9, 13, 1123, 1556, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 56, 56, 27, 27, 13, 13, 4, 4, 5, 17, 23, 1, 4, 4, 6, 7, 7, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Ireland
- { 75, 66, 115, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 0, 0, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 92, 1302, 9, 13, 1123, 1563, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 8, 4, 6, 7, 11, {71,66,80}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Isle Of Man
- { 75, 66, 116, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 1, 1, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 46, 1354, 9, 13, 1123, 1574, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 9, 4, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 18, 4, 6, 7, 6, {73,76,83}, 2, 1, 7, 5, 6, 1, 3, 3 }, // English/Latin/Israel
- { 75, 66, 119, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 87, 10, 22, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 2, 1372, 9, 13, 1123, 1580, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 15, 4, 6, 7, 7, {74,77,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // English/Latin/Jamaica
- { 75, 66, 121, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 0, 0, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 92, 1302, 9, 13, 1123, 1587, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 8, 4, 6, 7, 6, {71,66,80}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Jersey
- { 75, 66, 124, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 0, 0, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 175, 1387, 9, 13, 1123, 1109, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 15, 4, 6, 7, 5, {75,69,83}, 2, 1, 7, 6, 7, 1, 3, 3 }, // English/Latin/Kenya
- { 75, 66, 125, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 10, 22, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 2, 999, 9, 13, 1123, 1593, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 17, 4, 6, 7, 8, {65,85,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Kiribati
- { 75, 66, 133, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 10, 22, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 1, 1402, 9, 13, 1123, 1601, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 18, 4, 6, 7, 7, {90,65,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Lesotho
- { 75, 66, 134, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 10, 22, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 2, 1420, 9, 13, 1123, 1608, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 15, 4, 6, 7, 7, {76,82,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Liberia
- { 75, 66, 139, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 10, 22, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 153, 1435, 9, 13, 1123, 1615, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 4, 15, 4, 6, 7, 15, {77,79,80}, 2, 1, 7, 6, 7, 1, 3, 3 }, // English/Latin/Macao
- { 75, 66, 141, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 0, 0, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 183, 1450, 9, 13, 1123, 1630, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 2, 15, 4, 6, 7, 10, {77,71,65}, 0, 0, 1, 6, 7, 1, 3, 3 }, // English/Latin/Madagascar
- { 75, 66, 142, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 10, 22, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 185, 1465, 9, 13, 1123, 1640, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 2, 15, 4, 6, 7, 6, {77,87,75}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Malawi
- { 75, 66, 143, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 10, 22, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 187, 1480, 9, 13, 1123, 1646, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 2, 17, 4, 6, 7, 8, {77,89,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Malaysia
- { 75, 66, 146, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 0, 0, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 14, 73, 9, 13, 1123, 1654, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 4, 4, 6, 7, 5, {69,85,82}, 2, 1, 7, 6, 7, 1, 3, 3 }, // English/Latin/Malta
- { 75, 66, 147, 0, 0, 265, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 321, 339, 10, 22, 0, 0, 56, 56, 83, 83, 0, 0, 0, 5, 22, 2, 969, 9, 13, 1123, 1659, 6, 6, 10, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 9, 4, 6, 7, 16, {85,83,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // English/Latin/Marshall Islands
- { 75, 66, 150, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 0, 0, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 189, 1497, 9, 13, 1123, 1675, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 2, 15, 4, 6, 7, 9, {77,85,82}, 2, 0, 1, 6, 7, 1, 3, 3 }, // English/Latin/Mauritius
- { 75, 66, 153, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 10, 22, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 146, 969, 9, 13, 1123, 1684, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 9, 4, 6, 7, 10, {85,83,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Micronesia
- { 75, 66, 158, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 0, 0, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 2, 978, 9, 13, 1123, 1694, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 21, 4, 6, 7, 10, {88,67,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Montserrat
- { 75, 66, 162, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 10, 22, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 2, 1512, 9, 13, 1123, 1704, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 15, 4, 6, 7, 7, {78,65,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Namibia
- { 75, 66, 163, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 0, 0, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 2, 999, 9, 13, 1123, 1711, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 17, 4, 6, 7, 5, {65,85,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Nauru
- { 75, 66, 165, 0, 0, 275, 275, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 0, 0, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 14, 73, 4, 37, 1123, 1716, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 4, 5, 7, 7, 11, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Netherlands
- { 75, 66, 167, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 128, 10, 22, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 2, 1166, 9, 13, 1123, 1727, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 7, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 18, 4, 6, 7, 11, {78,90,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/New Zealand
- { 75, 66, 169, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 0, 0, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 122, 1527, 9, 13, 1123, 1738, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 14, 4, 6, 7, 7, {78,71,78}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Nigeria
- { 75, 66, 171, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 0, 0, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 2, 1166, 9, 13, 1123, 1745, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 18, 4, 6, 7, 4, {78,90,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Niue
- { 75, 66, 172, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 0, 0, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 2, 999, 9, 13, 1123, 1749, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 17, 4, 6, 7, 14, {65,85,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Norfolk Island
- { 75, 66, 173, 0, 0, 265, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 321, 339, 10, 22, 0, 0, 56, 56, 83, 83, 0, 0, 0, 5, 22, 2, 969, 9, 13, 1123, 1763, 6, 6, 10, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 9, 4, 6, 7, 24, {85,83,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Northern Mariana Islands
- { 75, 66, 178, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 10, 22, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 189, 1541, 9, 13, 1123, 1787, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 2, 15, 4, 6, 7, 8, {80,75,82}, 2, 0, 7, 6, 7, 1, 3, 3 }, // English/Latin/Pakistan
- { 75, 66, 179, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 10, 22, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 146, 969, 9, 13, 1123, 1795, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 9, 4, 6, 7, 5, {85,83,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Palau
- { 75, 66, 182, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 10, 22, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 133, 1556, 9, 13, 1123, 1800, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 22, 4, 6, 7, 16, {80,71,75}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Papua New Guinea
- { 75, 66, 185, 0, 0, 265, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 321, 339, 10, 22, 0, 0, 56, 56, 83, 83, 0, 0, 0, 5, 22, 145, 663, 9, 13, 1123, 1816, 6, 6, 10, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 15, 4, 6, 7, 11, {80,72,80}, 2, 1, 7, 6, 7, 1, 3, 3 }, // English/Latin/Philippines
- { 75, 66, 186, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 0, 0, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 2, 1166, 9, 13, 1123, 1827, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 18, 4, 6, 7, 16, {78,90,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Pitcairn
- { 75, 66, 189, 0, 0, 265, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 321, 339, 10, 22, 0, 0, 56, 56, 83, 83, 0, 0, 0, 5, 22, 2, 969, 9, 13, 1123, 1843, 6, 6, 10, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 9, 4, 6, 7, 11, {85,83,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // English/Latin/Puerto Rico
- { 75, 66, 194, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 0, 0, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 191, 1578, 9, 13, 1123, 1854, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 2, 13, 4, 6, 7, 6, {82,87,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // English/Latin/Rwanda
- { 75, 66, 196, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 0, 0, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 92, 1591, 9, 13, 1123, 1860, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 15, 4, 6, 7, 10, {83,72,80}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Saint Helena
- { 75, 66, 197, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 10, 22, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 2, 978, 9, 13, 1123, 1870, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 21, 4, 6, 7, 17, {88,67,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Saint Kitts And Nevis
- { 75, 66, 198, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 10, 22, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 2, 978, 9, 13, 1123, 1887, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 21, 4, 6, 7, 9, {88,67,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Saint Lucia
- { 75, 66, 201, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 10, 22, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 2, 978, 9, 13, 1123, 1896, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 21, 4, 6, 7, 24, {88,67,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Saint Vincent And Grenadines
- { 75, 66, 202, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 10, 22, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 193, 1606, 9, 13, 1123, 1152, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 11, 4, 6, 7, 5, {87,83,84}, 2, 1, 7, 6, 7, 1, 3, 3 }, // English/Latin/Samoa
- { 75, 66, 208, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 0, 0, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 196, 1617, 9, 13, 1123, 1920, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 2, 17, 4, 6, 7, 10, {83,67,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Seychelles
- { 75, 66, 209, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 10, 22, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 10, 1634, 9, 13, 1123, 1930, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 2, 20, 4, 6, 7, 12, {83,76,76}, 0, 0, 1, 6, 7, 1, 3, 3 }, // English/Latin/Sierra Leone
- { 75, 66, 210, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 87, 10, 22, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 2, 1654, 9, 13, 1123, 1942, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 16, 4, 6, 7, 9, {83,71,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // English/Latin/Singapore
- { 75, 66, 211, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 0, 0, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 168, 1670, 9, 13, 1123, 1951, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 4, 29, 4, 6, 7, 12, {65,78,71}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Sint Maarten
- { 75, 66, 213, 0, 0, 275, 275, 6, 1, 0, 2, 3, 4, 5, 6, 10, 11, 12, 13, 0, 127, 0, 0, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 14, 73, 19, 24, 1123, 1963, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 4, 5, 7, 7, 8, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Slovenia
- { 75, 66, 214, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 10, 22, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 2, 1699, 9, 13, 1123, 1971, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 22, 4, 6, 7, 15, {83,66,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Solomon Islands
- { 75, 66, 216, 0, 0, 275, 275, 6, 1, 14, 2, 3, 4, 5, 9, 10, 11, 12, 13, 618, 636, 0, 0, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 1, 1402, 9, 13, 1123, 1986, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 18, 4, 6, 7, 12, {90,65,82}, 2, 1, 7, 6, 7, 1, 3, 3 }, // English/Latin/South Africa
- { 75, 66, 219, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 10, 22, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 92, 1721, 9, 13, 1123, 1998, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 20, 4, 6, 7, 11, {83,83,80}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/South Sudan
- { 75, 66, 222, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 10, 22, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 0, 1741, 9, 13, 1123, 2009, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 0, 14, 4, 6, 7, 5, {83,68,71}, 2, 1, 6, 5, 6, 1, 3, 3 }, // English/Latin/Sudan
- { 75, 66, 225, 0, 0, 275, 275, 6, 1, 14, 2, 3, 4, 5, 52, 10, 11, 12, 13, 0, 44, 0, 0, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 161, 1755, 19, 0, 1123, 2014, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 2, 13, 5, 0, 7, 6, {83,69,75}, 2, 0, 1, 6, 7, 1, 3, 3 }, // English/Latin/Sweden
- { 75, 66, 226, 0, 0, 275, 275, 6, 0, 13, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 0, 0, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 0, 1768, 4, 44, 1123, 2020, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 0, 11, 5, 5, 7, 11, {67,72,70}, 2, 0, 1, 6, 7, 1, 3, 3 }, // English/Latin/Switzerland
- { 75, 66, 230, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 0, 0, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 119, 1779, 9, 13, 1123, 2031, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 18, 4, 6, 7, 8, {84,90,83}, 2, 0, 1, 6, 7, 1, 3, 3 }, // English/Latin/Tanzania
- { 75, 66, 234, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 0, 0, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 2, 1166, 9, 13, 1123, 2039, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 18, 4, 6, 7, 7, {78,90,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Tokelau
- { 75, 66, 235, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 10, 22, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 198, 1797, 9, 13, 1123, 2046, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 2, 14, 4, 6, 7, 5, {84,79,80}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Tonga
- { 75, 66, 236, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 10, 22, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 2, 1811, 9, 13, 1123, 2051, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 24, 4, 6, 7, 17, {84,84,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // English/Latin/Trinidad And Tobago
- { 75, 66, 241, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 10, 22, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 146, 969, 9, 13, 1123, 2068, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 9, 4, 6, 7, 22, {85,83,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Turks And Caicos Islands
- { 75, 66, 242, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 0, 0, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 2, 999, 9, 13, 1123, 2090, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 17, 4, 6, 7, 6, {65,85,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Tuvalu
- { 75, 66, 243, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 0, 0, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 149, 1835, 9, 13, 1123, 857, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 16, 4, 6, 7, 6, {85,71,88}, 0, 0, 1, 7, 7, 1, 3, 3 }, // English/Latin/Uganda
- { 75, 66, 245, 0, 0, 265, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 10, 22, 0, 0, 56, 56, 83, 83, 0, 0, 0, 5, 22, 200, 1851, 9, 13, 1123, 2096, 6, 6, 10, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 27, 4, 6, 7, 20, {65,69,68}, 2, 1, 6, 5, 6, 1, 3, 3 }, // English/Latin/United Arab Emirates
- { 75, 66, 246, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 0, 0, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 92, 1878, 9, 13, 2116, 2131, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 13, 4, 6, 15, 14, {71,66,80}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/United Kingdom
- { 75, 66, 247, 0, 0, 265, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 321, 339, 10, 22, 0, 0, 56, 56, 83, 83, 0, 0, 0, 5, 22, 2, 969, 9, 13, 1123, 2145, 6, 6, 10, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 9, 4, 6, 7, 21, {85,83,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // English/Latin/United States Outlying Islands
- { 75, 66, 249, 0, 0, 265, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 321, 339, 10, 22, 0, 0, 56, 56, 83, 83, 0, 0, 0, 5, 22, 2, 969, 9, 13, 1123, 2166, 6, 6, 10, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 9, 4, 6, 7, 19, {85,83,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // English/Latin/United States Virgin Islands
- { 75, 66, 252, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 10, 22, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 203, 1891, 9, 13, 1123, 2185, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 2, 12, 4, 6, 7, 7, {86,85,86}, 0, 0, 1, 6, 7, 1, 3, 3 }, // English/Latin/Vanuatu
- { 75, 66, 258, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 10, 22, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 0, 0, 9, 13, 1123, 2192, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 0, 0, 4, 6, 7, 5, {0,0,0}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/World
- { 75, 66, 260, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 10, 22, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 133, 1903, 9, 13, 1123, 543, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 14, 4, 6, 7, 6, {90,77,87}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Zambia
- { 75, 66, 261, 0, 0, 275, 275, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 618, 87, 0, 0, 0, 0, 56, 56, 83, 83, 82, 195, 0, 5, 22, 146, 969, 9, 13, 1123, 2197, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 9, 4, 6, 7, 8, {85,83,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // English/Latin/Zimbabwe
- { 76, 27, 193, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 44, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 130, 0, 4, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {82,85,66}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Erzya/Cyrillic/Russia
- { 77, 66, 258, 0, 0, 284, 284, 6, 1, 14, 2, 3, 40, 5, 9, 10, 11, 12, 13, 646, 46, 205, 0, 4586, 4586, 4636, 4636, 4656, 4656, 189, 197, 316, 5, 22, 0, 0, 4, 0, 2205, 2214, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 26, 8, 25, 5, 50, 50, 20, 20, 13, 13, 3, 3, 6, 17, 23, 0, 0, 5, 0, 9, 5, {0,0,0}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Esperanto/Latin/World
- { 78, 66, 75, 0, 0, 293, 293, 6, 1, 14, 2, 3, 40, 5, 52, 15, 10, 16, 12, 345, 184, 0, 0, 4669, 4669, 4731, 4731, 4731, 4731, 0, 0, 322, 5, 22, 14, 420, 19, 24, 2219, 2224, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 18, 8, 10, 5, 62, 62, 13, 13, 13, 13, 2, 2, 6, 17, 23, 1, 4, 5, 7, 5, 5, {69,85,82}, 2, 1, 1, 6, 7, 2, 3, 3 }, // Estonian/Latin/Estonia
- { 79, 66, 92, 0, 0, 301, 312, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 672, 339, 230, 230, 4744, 4744, 4787, 4787, 4814, 4814, 192, 200, 0, 5, 22, 7, 1917, 9, 13, 2229, 2235, 6, 6, 11, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 6, 17, 12, 43, 43, 27, 27, 13, 13, 3, 5, 4, 17, 23, 3, 10, 4, 6, 6, 12, {71,72,83}, 2, 1, 1, 6, 7, 3, 3, 3 }, // Ewe/Latin/Ghana
- { 79, 66, 233, 0, 0, 301, 312, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 672, 339, 0, 0, 4744, 4744, 4787, 4787, 4814, 4814, 192, 200, 0, 5, 22, 124, 1927, 9, 13, 2229, 2247, 6, 6, 11, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 6, 10, 5, 43, 43, 27, 27, 13, 13, 3, 5, 4, 17, 23, 5, 33, 4, 6, 6, 11, {88,79,70}, 0, 0, 1, 6, 7, 3, 3, 3 }, // Ewe/Latin/Togo
- { 80, 66, 40, 0, 0, 0, 0, 6, 1, 14, 2, 3, 4, 5, 9, 17, 18, 10, 11, 71, 87, 0, 0, 4827, 4827, 4911, 4911, 4940, 4940, 195, 205, 0, 5, 22, 3, 1960, 19, 0, 2258, 2264, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 84, 84, 29, 29, 13, 13, 7, 9, 4, 17, 23, 4, 16, 5, 0, 6, 7, {88,65,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Ewondo/Latin/Cameroon
- { 81, 66, 81, 0, 0, 231, 231, 6, 1, 0, 2, 3, 40, 5, 9, 10, 11, 12, 13, 345, 184, 0, 0, 4953, 4953, 5026, 5053, 5087, 5087, 0, 0, 328, 5, 22, 161, 1976, 19, 24, 2271, 2279, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 10, 5, 73, 73, 27, 34, 13, 13, 2, 2, 3, 17, 23, 2, 11, 5, 7, 8, 7, {68,75,75}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Faroese/Latin/Faroe Islands
- { 81, 66, 65, 0, 0, 231, 231, 6, 1, 0, 2, 3, 40, 5, 9, 10, 11, 12, 13, 345, 184, 0, 0, 4953, 4953, 5026, 5053, 5087, 5087, 0, 0, 328, 5, 22, 161, 1976, 19, 24, 2271, 986, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 10, 5, 73, 73, 27, 34, 13, 13, 2, 2, 3, 17, 23, 3, 11, 5, 7, 8, 7, {68,75,75}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Faroese/Latin/Denmark
- { 83, 66, 185, 0, 0, 322, 331, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 321, 339, 10, 22, 5100, 5100, 5154, 5154, 5154, 5154, 0, 0, 0, 5, 22, 145, 1987, 9, 13, 2286, 729, 6, 6, 9, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 12, 7, 54, 54, 27, 27, 27, 27, 2, 2, 5, 17, 23, 1, 17, 4, 6, 8, 9, {80,72,80}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Filipino/Latin/Philippines
- { 84, 66, 83, 0, 0, 293, 293, 6, 1, 14, 2, 3, 40, 5, 9, 11, 11, 13, 13, 520, 695, 147, 147, 5181, 5247, 5327, 5327, 5347, 5347, 202, 214, 331, 336, 353, 14, 420, 19, 0, 2294, 2299, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 8, 9, 4, 66, 80, 20, 20, 13, 13, 3, 3, 5, 17, 23, 1, 4, 5, 0, 5, 5, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Finnish/Latin/Finland
- { 85, 66, 84, 0, 0, 339, 339, 6, 1, 57, 2, 3, 4, 5, 9, 17, 18, 17, 18, 71, 127, 0, 0, 5360, 5360, 5411, 5411, 5445, 5445, 0, 0, 376, 232, 249, 14, 420, 19, 24, 2304, 2312, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 1, 4, 5, 7, 8, 6, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // French/Latin/France
- { 85, 66, 4, 0, 0, 339, 339, 6, 1, 57, 2, 3, 4, 5, 9, 17, 18, 17, 18, 71, 127, 10, 22, 5360, 5360, 5411, 5411, 5445, 5445, 0, 0, 376, 232, 249, 182, 2004, 19, 24, 2304, 2318, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 12, 7, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 2, 14, 5, 7, 8, 7, {68,90,68}, 2, 1, 6, 5, 6, 1, 3, 3 }, // French/Latin/Algeria
- { 85, 66, 23, 0, 0, 339, 339, 6, 1, 57, 2, 3, 4, 5, 9, 17, 18, 17, 18, 71, 128, 247, 0, 5360, 5360, 5411, 5411, 5445, 5445, 0, 0, 376, 232, 249, 14, 420, 19, 24, 2304, 2325, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 7, 23, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 1, 4, 5, 7, 8, 8, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // French/Latin/Belgium
- { 85, 66, 25, 0, 0, 339, 339, 6, 1, 57, 2, 3, 4, 5, 9, 17, 18, 17, 18, 71, 127, 0, 0, 5360, 5360, 5411, 5411, 5445, 5445, 0, 0, 376, 232, 249, 124, 2018, 19, 24, 2304, 2333, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 5, 17, 5, 7, 8, 5, {88,79,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // French/Latin/Benin
- { 85, 66, 37, 0, 0, 339, 339, 6, 1, 57, 2, 3, 4, 5, 9, 17, 18, 17, 18, 71, 127, 0, 0, 5360, 5360, 5411, 5411, 5445, 5445, 0, 0, 376, 232, 249, 124, 2018, 19, 24, 2304, 2338, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 5, 17, 5, 7, 8, 12, {88,79,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // French/Latin/Burkina Faso
- { 85, 66, 38, 0, 0, 339, 339, 6, 1, 57, 2, 3, 4, 5, 9, 17, 18, 17, 18, 71, 127, 0, 0, 5360, 5360, 5411, 5411, 5445, 5445, 0, 0, 376, 232, 249, 178, 2035, 19, 24, 2304, 1302, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 3, 15, 5, 7, 8, 7, {66,73,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // French/Latin/Burundi
- { 85, 66, 40, 0, 0, 339, 339, 6, 1, 57, 2, 3, 4, 5, 9, 17, 18, 17, 18, 71, 127, 0, 0, 5360, 5360, 5411, 5411, 5445, 5445, 205, 217, 376, 232, 249, 3, 2050, 19, 24, 2304, 1011, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 5, 4, 6, 17, 23, 4, 16, 5, 7, 8, 8, {88,65,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // French/Latin/Cameroon
- { 85, 66, 41, 0, 0, 339, 339, 6, 1, 14, 2, 3, 4, 5, 9, 17, 18, 11, 10, 71, 44, 270, 270, 5360, 5360, 5411, 5411, 5445, 5445, 165, 164, 376, 232, 249, 2, 2066, 19, 24, 2350, 1333, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 24, 9, 51, 51, 34, 34, 13, 13, 4, 4, 6, 17, 23, 1, 15, 5, 7, 17, 6, {67,65,68}, 2, 0, 7, 6, 7, 1, 3, 3 }, // French/Latin/Canada
- { 85, 66, 46, 0, 0, 339, 339, 6, 1, 57, 2, 3, 4, 5, 9, 17, 18, 17, 18, 71, 127, 0, 0, 5360, 5360, 5411, 5411, 5445, 5445, 0, 0, 376, 232, 249, 3, 2050, 19, 24, 2304, 2367, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 4, 16, 5, 7, 8, 25, {88,65,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // French/Latin/Central African Republic
- { 85, 66, 48, 0, 0, 339, 339, 6, 1, 57, 2, 3, 4, 5, 9, 17, 18, 17, 18, 71, 127, 10, 22, 5360, 5360, 5411, 5411, 5445, 5445, 0, 0, 376, 232, 249, 3, 2050, 19, 24, 2304, 2392, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 12, 7, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 4, 16, 5, 7, 8, 5, {88,65,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // French/Latin/Chad
- { 85, 66, 55, 0, 0, 339, 339, 6, 1, 57, 2, 3, 4, 5, 9, 17, 18, 17, 18, 71, 127, 0, 0, 5360, 5360, 5411, 5411, 5445, 5445, 0, 0, 376, 232, 249, 4, 2081, 19, 24, 2304, 2397, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 2, 14, 5, 7, 8, 7, {75,77,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // French/Latin/Comoros
- { 85, 66, 56, 0, 0, 339, 339, 6, 1, 57, 2, 3, 4, 5, 9, 17, 18, 17, 18, 71, 127, 0, 0, 5360, 5360, 5411, 5411, 5445, 5445, 0, 0, 376, 232, 249, 3, 2050, 19, 24, 2304, 2404, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 4, 16, 5, 7, 8, 17, {88,65,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // French/Latin/Congo Brazzaville
- { 85, 66, 57, 0, 0, 339, 339, 6, 1, 57, 2, 3, 4, 5, 9, 17, 18, 17, 18, 71, 127, 0, 0, 5360, 5360, 5411, 5411, 5445, 5445, 0, 0, 376, 232, 249, 3, 2095, 19, 24, 2304, 2421, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 2, 15, 5, 7, 8, 14, {67,68,70}, 2, 1, 1, 6, 7, 1, 3, 3 }, // French/Latin/Congo Kinshasa
- { 85, 66, 67, 0, 0, 339, 339, 6, 1, 57, 2, 3, 4, 5, 9, 17, 18, 17, 18, 71, 127, 10, 22, 5360, 5360, 5411, 5411, 5445, 5445, 0, 0, 376, 232, 249, 35, 2110, 19, 24, 2304, 2435, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 12, 7, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 3, 16, 5, 7, 8, 8, {68,74,70}, 0, 0, 6, 6, 7, 1, 3, 3 }, // French/Latin/Djibouti
- { 85, 66, 73, 0, 0, 339, 339, 6, 1, 57, 2, 3, 4, 5, 9, 17, 18, 17, 18, 71, 127, 0, 0, 5360, 5360, 5411, 5411, 5445, 5445, 0, 0, 376, 232, 249, 3, 2050, 19, 24, 2304, 2443, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 4, 16, 5, 7, 8, 18, {88,65,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // French/Latin/Equatorial Guinea
- { 85, 66, 85, 0, 0, 339, 339, 6, 1, 57, 2, 3, 4, 5, 9, 17, 18, 17, 18, 71, 127, 0, 0, 5360, 5360, 5411, 5411, 5445, 5445, 0, 0, 376, 232, 249, 14, 420, 19, 24, 2304, 2461, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 1, 4, 5, 7, 8, 16, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // French/Latin/French Guiana
- { 85, 66, 86, 0, 0, 339, 339, 6, 1, 57, 2, 3, 4, 5, 9, 17, 18, 17, 18, 71, 127, 0, 0, 5360, 5360, 5411, 5411, 5445, 5445, 0, 0, 376, 232, 249, 205, 2126, 19, 24, 2304, 2477, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 4, 9, 5, 7, 8, 19, {88,80,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // French/Latin/French Polynesia
- { 85, 66, 88, 0, 0, 339, 339, 6, 1, 57, 2, 3, 4, 5, 9, 17, 18, 17, 18, 71, 127, 0, 0, 5360, 5360, 5411, 5411, 5445, 5445, 0, 0, 376, 232, 249, 3, 2050, 19, 24, 2304, 2496, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 4, 16, 5, 7, 8, 5, {88,65,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // French/Latin/Gabon
- { 85, 66, 97, 0, 0, 339, 339, 6, 1, 57, 2, 3, 4, 5, 9, 17, 18, 17, 18, 71, 127, 0, 0, 5360, 5360, 5411, 5411, 5445, 5445, 0, 0, 376, 232, 249, 14, 420, 19, 24, 2304, 2501, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 1, 4, 5, 7, 8, 10, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // French/Latin/Guadeloupe
- { 85, 66, 102, 0, 0, 339, 339, 6, 1, 57, 2, 3, 4, 5, 9, 17, 18, 17, 18, 71, 127, 0, 0, 5360, 5360, 5411, 5411, 5445, 5445, 0, 0, 376, 232, 249, 209, 2135, 19, 24, 2304, 2443, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 2, 13, 5, 7, 8, 6, {71,78,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // French/Latin/Guinea
- { 85, 66, 104, 0, 0, 339, 339, 6, 1, 57, 2, 3, 4, 5, 9, 17, 18, 17, 18, 71, 127, 0, 0, 5360, 5360, 5411, 5411, 5445, 5445, 0, 0, 376, 232, 249, 7, 2148, 19, 24, 2304, 2511, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 1, 16, 5, 7, 8, 5, {72,84,71}, 2, 1, 1, 6, 7, 1, 3, 3 }, // French/Latin/Haiti
- { 85, 66, 118, 0, 0, 339, 339, 6, 1, 57, 2, 3, 4, 5, 9, 17, 18, 17, 18, 71, 127, 0, 0, 5360, 5360, 5411, 5411, 5445, 5445, 0, 0, 376, 232, 249, 124, 2018, 19, 24, 2304, 2516, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 5, 17, 5, 7, 8, 13, {88,79,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // French/Latin/Ivory Coast
- { 85, 66, 138, 0, 0, 339, 339, 6, 1, 0, 2, 3, 4, 5, 9, 17, 18, 17, 18, 71, 127, 0, 0, 5360, 5360, 5411, 5411, 5445, 5445, 0, 0, 376, 232, 249, 14, 420, 19, 24, 2304, 2529, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 1, 4, 5, 7, 8, 10, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // French/Latin/Luxembourg
- { 85, 66, 141, 0, 0, 339, 339, 6, 1, 57, 2, 3, 4, 5, 9, 17, 18, 17, 18, 71, 127, 0, 0, 5360, 5360, 5411, 5411, 5445, 5445, 0, 0, 376, 232, 249, 183, 2164, 19, 24, 2304, 1630, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 2, 15, 5, 7, 8, 10, {77,71,65}, 0, 0, 1, 6, 7, 1, 3, 3 }, // French/Latin/Madagascar
- { 85, 66, 145, 0, 0, 339, 339, 6, 1, 57, 2, 3, 4, 5, 9, 17, 18, 17, 18, 71, 127, 0, 0, 5360, 5360, 5411, 5411, 5445, 5445, 0, 0, 376, 232, 249, 124, 2018, 19, 24, 2304, 467, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 5, 17, 5, 7, 8, 4, {88,79,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // French/Latin/Mali
- { 85, 66, 148, 0, 0, 339, 339, 6, 1, 57, 2, 3, 4, 5, 9, 17, 18, 17, 18, 71, 127, 0, 0, 5360, 5360, 5411, 5411, 5445, 5445, 0, 0, 376, 232, 249, 14, 420, 19, 24, 2304, 2539, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 1, 4, 5, 7, 8, 10, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // French/Latin/Martinique
- { 85, 66, 149, 0, 0, 339, 339, 6, 1, 57, 2, 3, 4, 5, 9, 17, 18, 17, 18, 71, 127, 10, 22, 5360, 5360, 5411, 5411, 5445, 5445, 0, 0, 376, 232, 249, 211, 2179, 19, 24, 2304, 2549, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 12, 7, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 2, 19, 5, 7, 8, 10, {77,82,85}, 2, 1, 1, 6, 7, 1, 3, 3 }, // French/Latin/Mauritania
- { 85, 66, 150, 0, 0, 339, 339, 6, 1, 57, 2, 3, 4, 5, 9, 17, 18, 17, 18, 71, 127, 0, 0, 5360, 5360, 5411, 5411, 5445, 5445, 0, 0, 376, 232, 249, 189, 2198, 19, 24, 2304, 2559, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 2, 18, 5, 7, 8, 7, {77,85,82}, 2, 0, 1, 6, 7, 1, 3, 3 }, // French/Latin/Mauritius
- { 85, 66, 151, 0, 0, 339, 339, 6, 1, 57, 2, 3, 4, 5, 9, 17, 18, 17, 18, 71, 127, 0, 0, 5360, 5360, 5411, 5411, 5445, 5445, 0, 0, 376, 232, 249, 14, 420, 19, 24, 2304, 2566, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 1, 4, 5, 7, 8, 7, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // French/Latin/Mayotte
- { 85, 66, 155, 0, 0, 339, 339, 6, 1, 57, 2, 3, 4, 5, 9, 17, 18, 17, 18, 71, 127, 0, 0, 5360, 5360, 5411, 5411, 5445, 5445, 0, 0, 376, 232, 249, 14, 420, 19, 24, 2304, 2573, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 1, 4, 5, 7, 8, 6, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // French/Latin/Monaco
- { 85, 66, 159, 0, 0, 339, 339, 6, 1, 0, 2, 3, 4, 5, 9, 17, 18, 17, 18, 71, 127, 0, 0, 5360, 5360, 5411, 5411, 5445, 5445, 165, 164, 376, 232, 249, 213, 2216, 19, 24, 2304, 2579, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 4, 4, 6, 17, 23, 3, 15, 5, 7, 8, 5, {77,65,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // French/Latin/Morocco
- { 85, 66, 166, 0, 0, 339, 339, 6, 1, 57, 2, 3, 4, 5, 9, 17, 18, 17, 18, 71, 127, 0, 0, 5360, 5360, 5411, 5411, 5445, 5445, 0, 0, 376, 232, 249, 205, 2126, 19, 24, 2304, 2584, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 4, 9, 5, 7, 8, 18, {88,80,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // French/Latin/New Caledonia
- { 85, 66, 170, 0, 0, 339, 339, 6, 1, 57, 2, 3, 4, 5, 9, 17, 18, 17, 18, 71, 127, 0, 0, 5360, 5360, 5411, 5411, 5445, 5445, 0, 0, 376, 232, 249, 124, 2018, 19, 24, 2304, 1738, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 5, 17, 5, 7, 8, 5, {88,79,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // French/Latin/Niger
- { 85, 66, 191, 0, 0, 339, 339, 6, 1, 57, 2, 3, 4, 5, 9, 17, 18, 17, 18, 71, 127, 0, 0, 5360, 5360, 5411, 5411, 5445, 5445, 0, 0, 376, 232, 249, 14, 420, 19, 24, 2304, 2602, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 1, 4, 5, 7, 8, 10, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // French/Latin/Reunion
- { 85, 66, 194, 0, 0, 339, 339, 6, 1, 57, 2, 3, 4, 5, 9, 17, 18, 17, 18, 71, 127, 0, 0, 5360, 5360, 5411, 5411, 5445, 5445, 0, 0, 376, 232, 249, 191, 2231, 19, 24, 2304, 1854, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 2, 14, 5, 7, 8, 6, {82,87,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // French/Latin/Rwanda
- { 85, 66, 195, 0, 0, 339, 339, 6, 1, 57, 2, 3, 4, 5, 9, 17, 18, 17, 18, 71, 127, 0, 0, 5360, 5360, 5411, 5411, 5445, 5445, 0, 0, 376, 232, 249, 14, 420, 19, 24, 2304, 2612, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 1, 4, 5, 7, 8, 16, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // French/Latin/Saint Barthelemy
- { 85, 66, 199, 0, 0, 339, 339, 6, 1, 57, 2, 3, 4, 5, 9, 17, 18, 17, 18, 71, 127, 0, 0, 5360, 5360, 5411, 5411, 5445, 5445, 0, 0, 376, 232, 249, 14, 420, 19, 24, 2304, 2628, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 1, 4, 5, 7, 8, 12, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // French/Latin/Saint Martin
- { 85, 66, 200, 0, 0, 339, 339, 6, 1, 57, 2, 3, 4, 5, 9, 17, 18, 17, 18, 71, 127, 0, 0, 5360, 5360, 5411, 5411, 5445, 5445, 0, 0, 376, 232, 249, 14, 420, 19, 24, 2304, 2640, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 1, 4, 5, 7, 8, 24, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // French/Latin/Saint Pierre And Miquelon
- { 85, 66, 206, 0, 0, 339, 339, 6, 1, 57, 2, 3, 4, 5, 9, 17, 18, 17, 18, 71, 127, 0, 0, 5360, 5360, 5411, 5411, 5445, 5445, 0, 0, 376, 232, 249, 124, 2018, 19, 24, 2304, 2664, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 5, 17, 5, 7, 8, 7, {88,79,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // French/Latin/Senegal
- { 85, 66, 208, 0, 0, 339, 339, 6, 1, 57, 2, 3, 4, 5, 9, 17, 18, 17, 18, 71, 127, 0, 0, 5360, 5360, 5411, 5411, 5445, 5445, 0, 0, 376, 232, 249, 196, 2245, 19, 24, 2304, 1920, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 2, 21, 5, 7, 8, 10, {83,67,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // French/Latin/Seychelles
- { 85, 66, 226, 0, 0, 339, 339, 6, 1, 57, 2, 3, 4, 5, 9, 17, 18, 19, 20, 0, 184, 294, 0, 5360, 5360, 5411, 5411, 5445, 5445, 0, 0, 376, 232, 249, 216, 2266, 19, 24, 2671, 2686, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 8, 14, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 3, 12, 5, 7, 15, 6, {67,72,70}, 2, 0, 1, 6, 7, 1, 3, 3 }, // French/Latin/Switzerland
- { 85, 66, 227, 0, 0, 339, 339, 6, 1, 57, 2, 3, 4, 5, 9, 17, 18, 17, 18, 71, 127, 10, 22, 5360, 5360, 5411, 5411, 5445, 5445, 0, 0, 376, 232, 249, 219, 2278, 19, 24, 2304, 2692, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 12, 7, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 2, 14, 5, 7, 8, 5, {83,89,80}, 0, 0, 6, 5, 6, 1, 3, 3 }, // French/Latin/Syria
- { 85, 66, 233, 0, 0, 339, 339, 6, 1, 57, 2, 3, 4, 5, 9, 17, 18, 17, 18, 71, 127, 0, 0, 5360, 5360, 5411, 5411, 5445, 5445, 0, 0, 376, 232, 249, 124, 2018, 19, 24, 2304, 2247, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 5, 17, 5, 7, 8, 4, {88,79,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // French/Latin/Togo
- { 85, 66, 238, 0, 0, 339, 339, 6, 1, 57, 2, 3, 4, 5, 9, 17, 18, 17, 18, 71, 127, 10, 22, 5360, 5360, 5411, 5411, 5445, 5445, 0, 0, 376, 232, 249, 221, 2292, 19, 24, 2304, 2697, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 12, 7, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 2, 14, 5, 7, 8, 7, {84,78,68}, 3, 0, 1, 6, 7, 1, 3, 3 }, // French/Latin/Tunisia
- { 85, 66, 252, 0, 0, 339, 339, 6, 1, 57, 2, 3, 4, 5, 9, 17, 18, 17, 18, 71, 127, 10, 22, 5360, 5360, 5411, 5411, 5445, 5445, 0, 0, 376, 232, 249, 203, 2306, 19, 24, 2304, 2185, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 12, 7, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 2, 14, 5, 7, 8, 7, {86,85,86}, 0, 0, 1, 6, 7, 1, 3, 3 }, // French/Latin/Vanuatu
- { 85, 66, 256, 0, 0, 339, 339, 6, 1, 57, 2, 3, 4, 5, 9, 17, 18, 17, 18, 71, 127, 0, 0, 5360, 5360, 5411, 5411, 5445, 5445, 0, 0, 376, 232, 249, 205, 2126, 19, 24, 2304, 2704, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 4, 9, 5, 7, 8, 16, {88,80,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // French/Latin/Wallis And Futuna
- { 86, 66, 117, 0, 0, 347, 347, 6, 1, 0, 2, 3, 4, 5, 9, 12, 13, 10, 11, 703, 127, 0, 0, 5458, 5458, 5507, 5507, 5445, 5445, 5, 124, 0, 5, 22, 14, 420, 4, 0, 2720, 2726, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 10, 5, 49, 49, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 4, 5, 0, 6, 6, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Friulian/Latin/Italy
- { 87, 66, 206, 0, 0, 0, 0, 6, 1, 14, 2, 3, 4, 5, 9, 15, 11, 16, 13, 71, 87, 0, 0, 5534, 5534, 5592, 5592, 5619, 5619, 210, 221, 0, 5, 22, 124, 2320, 19, 0, 2732, 2738, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 58, 58, 27, 27, 13, 13, 6, 7, 4, 17, 23, 5, 19, 5, 0, 6, 8, {88,79,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Fulah/Latin/Senegal
- { 87, 1, 37, 354, 354, 354, 360, 6, 0, 58, 2, 59, 4, 5, 9, 10, 11, 12, 13, 730, 210, 0, 0, 5632, 5632, 5750, 5750, 5802, 5802, 216, 228, 382, 394, 22, 223, 2339, 4, 0, 2746, 2756, 6, 6, 6, 8, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 17, 8, 10, 5,118,118, 52, 52, 22, 22, 4, 4, 12, 27, 23, 6, 51, 5, 0, 10, 25, {88,79,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Fulah/Adlam/Burkina Faso
- { 87, 1, 40, 354, 354, 354, 360, 6, 0, 58, 2, 59, 4, 5, 9, 10, 11, 12, 13, 730, 210, 0, 0, 5632, 5632, 5750, 5750, 5802, 5802, 216, 228, 382, 394, 22, 229, 2390, 4, 0, 2746, 2781, 6, 6, 6, 8, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 17, 8, 10, 5,118,118, 52, 52, 22, 22, 4, 4, 12, 27, 23, 8, 44, 5, 0, 10, 16, {88,65,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Fulah/Adlam/Cameroon
- { 87, 1, 89, 354, 354, 354, 360, 6, 0, 58, 2, 59, 4, 5, 9, 10, 11, 12, 13, 730, 210, 10, 22, 5632, 5632, 5750, 5750, 5802, 5802, 216, 228, 382, 394, 22, 182, 2434, 4, 0, 2746, 2797, 6, 6, 6, 8, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 17, 8, 12, 7,118,118, 52, 52, 22, 22, 4, 4, 12, 27, 23, 1, 29, 5, 0, 10, 14, {71,77,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Fulah/Adlam/Gambia
- { 87, 1, 92, 354, 354, 354, 360, 6, 0, 58, 2, 59, 4, 5, 9, 10, 11, 12, 13, 730, 210, 10, 22, 5632, 5632, 5750, 5750, 5802, 5802, 216, 228, 382, 394, 22, 7, 2463, 4, 0, 2746, 2811, 6, 6, 6, 8, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 17, 8, 12, 7,118,118, 52, 52, 22, 22, 4, 4, 12, 27, 23, 3, 23, 5, 0, 10, 8, {71,72,83}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Fulah/Adlam/Ghana
- { 87, 1, 101, 354, 354, 354, 360, 6, 0, 58, 2, 59, 4, 5, 9, 10, 11, 12, 13, 730, 210, 0, 0, 5632, 5632, 5750, 5750, 5802, 5802, 216, 228, 382, 394, 22, 223, 2339, 4, 0, 2746, 2819, 6, 6, 6, 8, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 17, 8, 10, 5,118,118, 52, 52, 22, 22, 4, 4, 12, 27, 23, 6, 51, 5, 0, 10, 23, {88,79,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Fulah/Adlam/Guinea Bissau
- { 87, 1, 102, 354, 354, 354, 360, 6, 0, 58, 2, 59, 4, 5, 9, 10, 11, 12, 13, 730, 210, 0, 0, 5632, 5632, 5750, 5750, 5802, 5802, 216, 228, 382, 394, 22, 209, 2486, 4, 0, 2746, 2819, 6, 6, 6, 8, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 17, 8, 10, 5,118,118, 52, 52, 22, 22, 4, 4, 12, 27, 23, 2, 25, 5, 0, 10, 8, {71,78,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Fulah/Adlam/Guinea
- { 87, 1, 134, 354, 354, 354, 360, 6, 0, 58, 2, 59, 4, 5, 9, 10, 11, 12, 13, 730, 210, 10, 22, 5632, 5632, 5750, 5750, 5802, 5802, 216, 228, 382, 394, 22, 2, 2511, 4, 0, 2746, 2842, 6, 6, 6, 8, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 17, 8, 12, 7,118,118, 52, 52, 22, 22, 4, 4, 12, 27, 23, 1, 31, 5, 0, 10, 18, {76,82,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Fulah/Adlam/Liberia
- { 87, 1, 149, 354, 354, 354, 360, 6, 0, 58, 2, 59, 4, 5, 9, 10, 11, 12, 13, 730, 210, 10, 22, 5632, 5632, 5750, 5750, 5802, 5802, 216, 228, 382, 394, 22, 211, 2542, 4, 0, 2746, 2860, 6, 6, 6, 8, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 17, 8, 12, 7,118,118, 52, 52, 22, 22, 4, 4, 12, 27, 23, 2, 37, 5, 0, 10, 16, {77,82,85}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Fulah/Adlam/Mauritania
- { 87, 1, 169, 354, 354, 354, 360, 6, 0, 58, 2, 59, 4, 5, 9, 10, 11, 12, 13, 730, 210, 0, 0, 5632, 5632, 5750, 5750, 5802, 5802, 216, 228, 382, 394, 22, 122, 2579, 4, 0, 2746, 2876, 6, 6, 6, 8, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 17, 8, 10, 5,118,118, 52, 52, 22, 22, 4, 4, 12, 27, 23, 1, 33, 5, 0, 10, 18, {78,71,78}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Fulah/Adlam/Nigeria
- { 87, 1, 170, 354, 354, 354, 360, 6, 0, 58, 2, 59, 4, 5, 9, 10, 11, 12, 13, 730, 210, 0, 0, 5632, 5632, 5750, 5750, 5802, 5802, 216, 228, 382, 394, 22, 223, 2339, 4, 0, 2746, 2894, 6, 6, 6, 8, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 17, 8, 10, 5,118,118, 52, 52, 22, 22, 4, 4, 12, 27, 23, 6, 51, 5, 0, 10, 12, {88,79,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Fulah/Adlam/Niger
- { 87, 1, 206, 354, 354, 354, 360, 6, 0, 58, 2, 59, 4, 5, 9, 10, 11, 12, 13, 730, 210, 0, 0, 5632, 5632, 5750, 5750, 5802, 5802, 216, 228, 382, 394, 22, 223, 2339, 4, 0, 2746, 2906, 6, 6, 6, 8, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 17, 8, 10, 5,118,118, 52, 52, 22, 22, 4, 4, 12, 27, 23, 6, 51, 5, 0, 10, 16, {88,79,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Fulah/Adlam/Senegal
- { 87, 1, 209, 354, 354, 354, 360, 6, 0, 58, 2, 59, 4, 5, 9, 10, 11, 12, 13, 730, 210, 10, 22, 5632, 5632, 5750, 5750, 5802, 5802, 216, 228, 382, 394, 22, 10, 2612, 4, 0, 2746, 2922, 6, 6, 6, 8, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 17, 8, 12, 7,118,118, 52, 52, 22, 22, 4, 4, 12, 27, 23, 2, 33, 5, 0, 10, 14, {83,76,76}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Fulah/Adlam/Sierra Leone
- { 87, 66, 37, 0, 0, 0, 0, 6, 1, 14, 2, 3, 4, 5, 9, 15, 11, 16, 13, 71, 87, 0, 0, 5534, 5534, 5592, 5592, 5619, 5619, 210, 221, 0, 5, 22, 124, 2320, 19, 0, 2732, 2936, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 58, 58, 27, 27, 13, 13, 6, 7, 4, 17, 23, 5, 19, 5, 0, 6, 14, {88,79,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Fulah/Latin/Burkina Faso
- { 87, 66, 40, 0, 0, 0, 0, 6, 1, 14, 2, 3, 4, 5, 9, 15, 11, 16, 13, 71, 87, 0, 0, 5534, 5534, 5592, 5592, 5619, 5619, 210, 221, 0, 5, 22, 3, 2645, 19, 0, 2732, 2950, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 58, 58, 27, 27, 13, 13, 6, 7, 4, 17, 23, 4, 18, 5, 0, 6, 8, {88,65,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Fulah/Latin/Cameroon
- { 87, 66, 89, 0, 0, 0, 0, 6, 1, 14, 2, 3, 4, 5, 9, 15, 11, 16, 13, 71, 87, 10, 22, 5534, 5534, 5592, 5592, 5619, 5619, 210, 221, 0, 5, 22, 182, 2663, 19, 0, 2732, 2958, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 12, 7, 58, 58, 27, 27, 13, 13, 6, 7, 4, 17, 23, 1, 13, 5, 0, 6, 6, {71,77,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Fulah/Latin/Gambia
- { 87, 66, 92, 0, 0, 0, 0, 6, 1, 14, 2, 3, 4, 5, 9, 15, 11, 16, 13, 71, 87, 10, 22, 5534, 5534, 5592, 5592, 5619, 5619, 210, 221, 0, 5, 22, 7, 0, 19, 0, 2732, 2964, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 12, 7, 58, 58, 27, 27, 13, 13, 6, 7, 4, 17, 23, 3, 0, 5, 0, 6, 5, {71,72,83}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Fulah/Latin/Ghana
- { 87, 66, 101, 0, 0, 0, 0, 6, 1, 14, 2, 3, 4, 5, 9, 15, 11, 16, 13, 71, 87, 0, 0, 5534, 5534, 5592, 5592, 5619, 5619, 210, 221, 0, 5, 22, 124, 2320, 19, 0, 2732, 2969, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 58, 58, 27, 27, 13, 13, 6, 7, 4, 17, 23, 5, 19, 5, 0, 6, 12, {88,79,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Fulah/Latin/Guinea Bissau
- { 87, 66, 102, 0, 0, 0, 0, 6, 1, 14, 2, 3, 4, 5, 9, 15, 11, 16, 13, 71, 87, 0, 0, 5534, 5534, 5592, 5592, 5619, 5619, 210, 221, 0, 5, 22, 209, 0, 19, 0, 2732, 2969, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 58, 58, 27, 27, 13, 13, 6, 7, 4, 17, 23, 2, 0, 5, 0, 6, 4, {71,78,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Fulah/Latin/Guinea
- { 87, 66, 134, 0, 0, 0, 0, 6, 1, 14, 2, 3, 4, 5, 9, 15, 11, 16, 13, 71, 87, 10, 22, 5534, 5534, 5592, 5592, 5619, 5619, 210, 221, 0, 5, 22, 2, 2676, 19, 0, 2732, 2981, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 12, 7, 58, 58, 27, 27, 13, 13, 6, 7, 4, 17, 23, 1, 16, 5, 0, 6, 9, {76,82,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Fulah/Latin/Liberia
- { 87, 66, 149, 0, 0, 0, 0, 6, 1, 14, 2, 3, 4, 5, 9, 15, 11, 16, 13, 71, 87, 10, 22, 5534, 5534, 5592, 5592, 5619, 5619, 210, 221, 0, 5, 22, 211, 2692, 19, 0, 2732, 2990, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 12, 7, 58, 58, 27, 27, 13, 13, 6, 7, 4, 17, 23, 2, 15, 5, 0, 6, 8, {77,82,85}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Fulah/Latin/Mauritania
- { 87, 66, 169, 0, 0, 0, 0, 6, 1, 14, 2, 3, 4, 5, 9, 15, 11, 16, 13, 71, 87, 0, 0, 5534, 5534, 5592, 5592, 5619, 5619, 210, 221, 0, 5, 22, 122, 2707, 19, 0, 2732, 2998, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 58, 58, 27, 27, 13, 13, 6, 7, 4, 17, 23, 1, 16, 5, 0, 6, 9, {78,71,78}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Fulah/Latin/Nigeria
- { 87, 66, 170, 0, 0, 0, 0, 6, 1, 14, 2, 3, 4, 5, 9, 15, 11, 16, 13, 71, 87, 0, 0, 5534, 5534, 5592, 5592, 5619, 5619, 210, 221, 0, 5, 22, 124, 2320, 19, 0, 2732, 3007, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 58, 58, 27, 27, 13, 13, 6, 7, 4, 17, 23, 5, 19, 5, 0, 6, 6, {88,79,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Fulah/Latin/Niger
- { 87, 66, 209, 0, 0, 0, 0, 6, 1, 14, 2, 3, 4, 5, 9, 15, 11, 16, 13, 71, 87, 10, 22, 5534, 5534, 5592, 5592, 5619, 5619, 210, 221, 0, 5, 22, 10, 2723, 19, 0, 2732, 3013, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 12, 7, 58, 58, 27, 27, 13, 13, 6, 7, 4, 17, 23, 2, 18, 5, 0, 6, 11, {83,76,76}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Fulah/Latin/Sierra Leone
- { 88, 66, 246, 0, 0, 368, 368, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 747, 127, 0, 0, 5824, 5824, 5892, 5892, 5919, 5919, 3, 131, 421, 5, 22, 92, 2741, 9, 13, 3024, 3032, 6, 6, 10, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 21, 10, 10, 5, 68, 68, 27, 27, 13, 13, 1, 1, 6, 17, 23, 1, 15, 4, 6, 8, 22, {71,66,80}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Gaelic/Latin/United Kingdom
- { 89, 66, 92, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 44, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 7, 0, 4, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 0, 5, 0, 0, 0, {71,72,83}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Ga/Latin/Ghana
- { 90, 66, 220, 0, 0, 347, 347, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 768, 127, 0, 0, 5932, 5980, 6028, 6062, 942, 6096, 165, 164, 0, 5, 22, 14, 420, 19, 0, 3054, 386, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 10, 5, 48, 48, 34, 34, 13, 20, 4, 4, 5, 17, 23, 1, 4, 5, 0, 6, 6, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Galician/Latin/Spain
- { 91, 66, 243, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 0, 0, 6116, 6116, 6181, 6181, 6208, 6208, 0, 0, 0, 5, 22, 149, 2756, 0, 0, 3060, 3067, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 65, 65, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 19, 4, 0, 7, 7, {85,71,88}, 0, 0, 1, 7, 7, 1, 3, 3 }, // Ganda/Latin/Uganda
- { 92, 33, 77, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 44, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 0, 0, 4, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 0, 0, {69,84,66}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Geez/Ethiopic/Ethiopia
- { 93, 35, 90, 0, 0, 378, 378, 6, 1, 14, 2, 3, 4, 5, 9, 15, 10, 17, 18, 795, 184, 0, 0, 6221, 6221, 6282, 6282, 6309, 6309, 0, 0, 427, 432, 22, 0, 2775, 19, 0, 3074, 3081, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 8, 10, 5, 61, 61, 27, 27, 13, 13, 2, 2, 5, 29, 23, 1, 12, 5, 0, 7, 10, {71,69,76}, 2, 1, 1, 6, 7, 2, 3, 3 }, // Georgian/Georgian/Georgia
- { 94, 66, 91, 0, 0, 386, 386, 6, 1, 0, 2, 3, 4, 5, 9, 15, 10, 16, 12, 345, 184, 0, 0, 6322, 6322, 6381, 6401, 3667, 3667, 0, 0, 461, 5, 22, 14, 73, 19, 0, 3091, 3098, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 10, 5, 59, 59, 20, 27, 13, 13, 2, 2, 5, 17, 23, 1, 4, 5, 0, 7, 11, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // German/Latin/Germany
- { 94, 66, 16, 0, 0, 386, 386, 6, 1, 14, 2, 3, 4, 5, 9, 15, 10, 16, 12, 345, 184, 0, 0, 6322, 6322, 6381, 6401, 3667, 3667, 0, 0, 461, 5, 22, 14, 73, 19, 0, 3109, 3109, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 10, 5, 59, 59, 20, 27, 13, 13, 2, 2, 5, 17, 23, 1, 4, 5, 0, 24, 10, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // German/Latin/Austria
- { 94, 66, 23, 0, 0, 386, 386, 6, 1, 0, 2, 3, 4, 5, 9, 15, 10, 16, 12, 345, 184, 0, 0, 6322, 6322, 6381, 6401, 3667, 3667, 0, 0, 461, 5, 22, 14, 73, 19, 0, 3091, 3133, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 10, 5, 59, 59, 20, 27, 13, 13, 2, 2, 5, 17, 23, 1, 4, 5, 0, 7, 7, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // German/Latin/Belgium
- { 94, 66, 117, 0, 0, 386, 386, 6, 1, 0, 2, 3, 4, 5, 9, 15, 10, 16, 12, 345, 184, 0, 0, 6322, 6322, 6381, 6401, 3667, 3667, 0, 0, 461, 5, 22, 14, 73, 19, 0, 3091, 3140, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 10, 5, 59, 59, 20, 27, 13, 13, 2, 2, 5, 17, 23, 1, 4, 5, 0, 7, 7, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // German/Latin/Italy
- { 94, 66, 136, 0, 0, 386, 386, 6, 0, 13, 2, 3, 4, 5, 9, 15, 10, 16, 12, 345, 184, 0, 0, 6322, 6322, 6381, 6401, 3667, 3667, 0, 0, 461, 5, 22, 216, 2787, 19, 0, 3091, 3147, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 10, 5, 59, 59, 20, 27, 13, 13, 2, 2, 5, 17, 23, 3, 17, 5, 0, 7, 13, {67,72,70}, 2, 0, 1, 6, 7, 1, 3, 3 }, // German/Latin/Liechtenstein
- { 94, 66, 138, 0, 0, 386, 386, 6, 1, 0, 2, 3, 4, 5, 9, 15, 10, 16, 12, 345, 184, 0, 0, 6322, 6322, 6381, 6401, 3667, 3667, 0, 0, 461, 5, 22, 14, 73, 19, 0, 3091, 3160, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 10, 5, 59, 59, 20, 27, 13, 13, 2, 2, 5, 17, 23, 1, 4, 5, 0, 7, 9, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // German/Latin/Luxembourg
- { 94, 66, 226, 0, 0, 386, 386, 6, 0, 13, 2, 3, 4, 5, 9, 15, 10, 16, 12, 345, 184, 0, 0, 6322, 6322, 6381, 6401, 3667, 3667, 0, 0, 461, 5, 22, 216, 2787, 19, 0, 3169, 3169, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 10, 5, 59, 59, 20, 27, 13, 13, 2, 2, 5, 17, 23, 3, 17, 5, 0, 21, 7, {67,72,70}, 2, 0, 1, 6, 7, 1, 3, 3 }, // German/Latin/Switzerland
- { 96, 39, 94, 0, 0, 395, 395, 6, 1, 0, 2, 3, 4, 5, 6, 17, 18, 10, 11, 71, 87, 10, 22, 6428, 6428, 6482, 6482, 6509, 6509, 220, 232, 0, 5, 22, 14, 2804, 19, 0, 3190, 3198, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 6, 12, 7, 54, 54, 27, 27, 13, 13, 4, 4, 4, 17, 23, 1, 4, 5, 0, 8, 6, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Greek/Greek/Greece
- { 96, 39, 63, 0, 0, 395, 395, 6, 1, 0, 2, 3, 4, 5, 6, 17, 18, 10, 11, 71, 87, 10, 22, 6428, 6428, 6482, 6482, 6509, 6509, 220, 232, 0, 5, 22, 14, 2804, 19, 0, 3190, 3204, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 6, 12, 7, 54, 54, 27, 27, 13, 13, 4, 4, 4, 17, 23, 1, 4, 5, 0, 8, 6, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Greek/Greek/Cyprus
- { 97, 66, 183, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 44, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 237, 0, 4, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {80,89,71}, 0, 0, 7, 6, 7, 1, 3, 3 }, // Guarani/Latin/Paraguay
- { 98, 40, 110, 0, 0, 404, 404, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 192, 87, 308, 321, 6522, 6522, 6574, 6574, 6605, 6605, 0, 0, 466, 5, 22, 118, 2808, 9, 13, 3210, 3217, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 13, 8, 52, 52, 31, 31, 18, 18, 2, 2, 4, 17, 23, 1, 13, 4, 6, 7, 4, {73,78,82}, 2, 1, 7, 7, 7, 1, 2, 3 }, // Gujarati/Gujarati/India
- { 99, 66, 124, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 0, 0, 6623, 6623, 6684, 6684, 6711, 6711, 224, 236, 0, 5, 22, 175, 952, 9, 13, 3221, 1109, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 61, 61, 27, 27, 13, 13, 6, 3, 4, 17, 23, 3, 17, 4, 6, 8, 5, {75,69,83}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Gusii/Latin/Kenya
- { 101, 66, 169, 0, 0, 413, 422, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 814, 87, 0, 0, 6724, 6724, 6775, 6775, 6802, 6802, 230, 239, 0, 470, 511, 122, 2821, 4, 0, 3229, 3234, 6, 6, 9, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 10, 5, 51, 51, 27, 27, 13, 13, 6, 5, 5, 41, 47, 1, 15, 5, 0, 5, 8, {78,71,78}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Hausa/Latin/Nigeria
- { 101, 4, 169, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 44, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 122, 0, 4, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {78,71,78}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Hausa/Arabic/Nigeria
- { 101, 66, 92, 0, 0, 413, 422, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 814, 87, 10, 22, 6724, 6724, 6775, 6775, 6802, 6802, 230, 239, 0, 470, 511, 7, 2836, 4, 0, 3229, 2964, 6, 6, 9, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 12, 7, 51, 51, 27, 27, 13, 13, 6, 5, 5, 41, 47, 3, 13, 5, 0, 5, 4, {71,72,83}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Hausa/Latin/Ghana
- { 101, 66, 170, 0, 0, 413, 422, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 814, 87, 0, 0, 6724, 6724, 6775, 6775, 6802, 6802, 230, 239, 0, 470, 511, 124, 2849, 4, 0, 3229, 3242, 6, 6, 9, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 10, 5, 51, 51, 27, 27, 13, 13, 6, 5, 5, 41, 47, 5, 29, 5, 0, 5, 5, {88,79,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Hausa/Latin/Niger
- { 102, 66, 248, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 87, 10, 22, 6815, 6815, 6871, 6871, 83, 83, 0, 0, 0, 5, 22, 2, 0, 9, 13, 3247, 3261, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 12, 7, 56, 56, 20, 20, 13, 13, 2, 2, 4, 17, 23, 1, 0, 4, 6, 14, 19, {85,83,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Hawaiian/Latin/United States
- { 103, 47, 116, 0, 0, 430, 430, 6, 0, 1, 2, 3, 35, 37, 9, 11, 11, 13, 13, 831, 695, 1, 1, 6891, 6891, 6955, 6955, 7000, 7000, 236, 244, 558, 5, 22, 46, 2878, 19, 0, 3280, 3285, 6, 6, 6, 6, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 18, 8, 9, 4, 64, 64, 45, 45, 20, 20, 6, 5, 4, 17, 23, 1, 7, 5, 0, 5, 5, {73,76,83}, 2, 1, 7, 5, 6, 1, 3, 3 }, // Hebrew/Hebrew/Israel
- { 105, 29, 110, 0, 0, 436, 445, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 87, 10, 22, 7020, 7020, 7072, 7072, 7103, 7103, 82, 195, 562, 5, 22, 118, 2885, 9, 0, 3290, 569, 6, 6, 9, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 12, 7, 52, 52, 31, 31, 18, 18, 2, 2, 4, 17, 23, 1, 12, 4, 0, 6, 4, {73,78,82}, 2, 1, 7, 7, 7, 1, 2, 3 }, // Hindi/Devanagari/India
- { 105, 66, 110, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 44, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 118, 0, 4, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {73,78,82}, 2, 1, 7, 7, 7, 1, 3, 3 }, // Hindi/Latin/India
- { 107, 66, 108, 0, 0, 453, 453, 6, 1, 14, 2, 3, 4, 5, 9, 15, 11, 18, 17, 849, 868, 1, 1, 7121, 7121, 7172, 7172, 7190, 7190, 242, 249, 566, 5, 22, 238, 2897, 19, 0, 3296, 3302, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 13, 9, 4, 51, 51, 18, 18, 16, 16, 3, 3, 4, 17, 23, 2, 13, 5, 0, 6, 12, {72,85,70}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Hungarian/Latin/Hungary
- { 108, 66, 109, 0, 0, 231, 231, 6, 1, 0, 2, 3, 4, 5, 9, 15, 10, 16, 12, 345, 695, 0, 0, 7206, 7206, 7286, 7286, 7320, 7320, 245, 252, 570, 5, 22, 240, 2910, 19, 0, 3314, 3322, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 10, 5, 80, 80, 34, 34, 13, 13, 4, 4, 4, 17, 23, 3, 13, 5, 0, 8, 6, {73,83,75}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Icelandic/Latin/Iceland
- { 109, 66, 258, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 44, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 0, 0, 4, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 0, 0, {0,0,0}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Ido/Latin/World
- { 110, 66, 169, 0, 0, 461, 470, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 87, 0, 0, 7333, 7333, 7386, 7386, 83, 83, 249, 256, 0, 5, 22, 122, 2923, 9, 13, 3328, 3332, 6, 6, 9, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 10, 5, 53, 53, 28, 28, 13, 13, 7, 7, 4, 17, 23, 1, 5, 4, 6, 4, 8, {78,71,78}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Igbo/Latin/Nigeria
- { 111, 66, 83, 0, 0, 0, 0, 6, 1, 14, 2, 3, 4, 5, 9, 10, 11, 12, 13, 881, 695, 147, 147, 7414, 7483, 7555, 7555, 83, 7582, 256, 263, 0, 5, 22, 14, 420, 19, 0, 3340, 3351, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 9, 4, 69, 72, 27, 27, 13, 13, 3, 3, 4, 17, 23, 1, 4, 5, 0, 11, 5, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Inari Sami/Latin/Finland
- { 112, 66, 111, 0, 0, 478, 488, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 618, 127, 146, 146, 7595, 7595, 7637, 7637, 7664, 7664, 0, 0, 0, 5, 22, 243, 2928, 9, 0, 3356, 3356, 6, 6, 10, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 10, 5, 42, 42, 27, 27, 13, 13, 2, 2, 4, 17, 23, 2, 16, 4, 0, 9, 9, {73,68,82}, 2, 0, 7, 6, 7, 1, 3, 3 }, // Indonesian/Latin/Indonesia
- { 114, 66, 258, 0, 0, 347, 347, 6, 1, 0, 2, 3, 4, 5, 9, 12, 13, 10, 11, 899, 432, 0, 0, 7677, 7677, 7733, 7733, 7760, 7760, 0, 0, 0, 5, 22, 0, 0, 4, 37, 3365, 3376, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 26, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 0, 0, 5, 7, 11, 5, {0,0,0}, 2, 1, 1, 6, 7, 2, 3, 3 }, // Interlingua/Latin/World
- { 116, 18, 41, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 44, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 245, 0, 4, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 0, 5, 0, 0, 0, {67,65,68}, 2, 0, 7, 6, 7, 1, 3, 3 }, // Inuktitut/Canadian Aboriginal/Canada
- { 116, 66, 41, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 44, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 245, 0, 4, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 0, 5, 0, 0, 0, {67,65,68}, 2, 0, 7, 6, 7, 1, 3, 3 }, // Inuktitut/Latin/Canada
- { 118, 66, 114, 0, 0, 368, 368, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 71, 127, 0, 0, 7773, 7773, 7847, 7847, 7883, 7883, 259, 266, 574, 5, 22, 14, 73, 9, 13, 3381, 3388, 6, 6, 10, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 74, 74, 36, 36, 13, 13, 4, 4, 6, 17, 23, 1, 4, 4, 6, 7, 4, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Irish/Latin/Ireland
- { 118, 66, 246, 0, 0, 368, 368, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 71, 127, 0, 0, 7773, 7773, 7847, 7847, 7883, 7883, 259, 266, 574, 5, 22, 92, 2944, 9, 13, 3381, 3392, 6, 6, 10, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 74, 74, 36, 36, 13, 13, 4, 4, 6, 17, 23, 1, 14, 4, 6, 7, 19, {71,66,80}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Irish/Latin/United Kingdom
- { 119, 66, 117, 0, 0, 347, 347, 6, 1, 0, 2, 3, 4, 5, 9, 17, 18, 10, 11, 71, 127, 0, 0, 7896, 7896, 7952, 7952, 7979, 7979, 0, 0, 0, 5, 22, 14, 420, 19, 0, 3411, 3419, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 4, 5, 0, 8, 6, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Italian/Latin/Italy
- { 119, 66, 203, 0, 0, 347, 347, 6, 1, 0, 2, 3, 4, 5, 9, 17, 18, 10, 11, 71, 127, 0, 0, 7896, 7896, 7952, 7952, 7979, 7979, 0, 0, 0, 5, 22, 14, 420, 19, 0, 3411, 3425, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 4, 5, 0, 8, 10, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Italian/Latin/San Marino
- { 119, 66, 226, 0, 0, 347, 347, 6, 0, 13, 2, 3, 4, 5, 9, 17, 18, 19, 20, 0, 184, 0, 0, 7896, 7896, 7952, 7952, 7979, 7979, 0, 0, 0, 5, 22, 0, 2958, 19, 0, 3411, 3435, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 8, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 15, 5, 0, 8, 8, {67,72,70}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Italian/Latin/Switzerland
- { 119, 66, 253, 0, 0, 347, 347, 6, 1, 0, 2, 3, 4, 5, 9, 17, 18, 10, 11, 71, 127, 0, 0, 7896, 7896, 7952, 7952, 7979, 7979, 0, 0, 0, 5, 22, 14, 420, 19, 0, 3411, 3443, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 4, 5, 0, 8, 18, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Italian/Latin/Vatican City
- { 120, 53, 120, 150, 150, 150, 150, 6, 0, 1, 2, 3, 4, 5, 9, 42, 43, 44, 45, 462, 636, 329, 1, 7992, 7992, 8019, 8019, 8019, 8019, 263, 270, 580, 583, 22, 144, 2973, 9, 13, 3461, 3461, 5, 5, 5, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 13, 10, 10, 4, 27, 27, 13, 13, 13, 13, 2, 2, 3, 17, 23, 1, 3, 4, 6, 3, 2, {74,80,89}, 0, 0, 7, 6, 7, 1, 3, 3 }, // Japanese/Japanese/Japan
- { 121, 66, 111, 0, 0, 497, 507, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 432, 0, 0, 8032, 8032, 8072, 8072, 8100, 8100, 265, 272, 600, 5, 22, 243, 2928, 4, 0, 3464, 3468, 6, 6, 10, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 40, 40, 28, 28, 13, 13, 4, 5, 4, 17, 23, 2, 16, 5, 0, 4, 9, {73,68,82}, 2, 0, 7, 6, 7, 1, 3, 3 }, // Javanese/Latin/Indonesia
- { 122, 66, 169, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 44, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 122, 0, 4, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {78,71,78}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Jju/Latin/Nigeria
- { 123, 66, 206, 0, 0, 0, 0, 6, 1, 14, 2, 3, 4, 5, 9, 17, 18, 10, 11, 71, 87, 0, 0, 8113, 8113, 8162, 8162, 8189, 8189, 0, 0, 0, 5, 22, 124, 2976, 19, 0, 3477, 3482, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 49, 49, 27, 27, 13, 13, 2, 2, 4, 17, 23, 5, 16, 5, 0, 5, 7, {88,79,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Jola Fonyi/Latin/Senegal
- { 124, 66, 43, 0, 0, 110, 110, 6, 1, 14, 2, 3, 4, 5, 9, 10, 11, 12, 13, 925, 127, 0, 0, 8202, 8202, 8274, 8274, 8301, 8301, 82, 195, 0, 5, 22, 248, 2992, 19, 24, 3489, 3501, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 10, 10, 5, 72, 72, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 18, 5, 7, 12, 10, {67,86,69}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Kabuverdianu/Latin/Cape Verde
- { 125, 66, 4, 0, 0, 516, 524, 6, 1, 14, 2, 3, 4, 5, 9, 17, 18, 10, 11, 71, 87, 10, 22, 8314, 8347, 8397, 8397, 8426, 8439, 269, 277, 604, 611, 22, 182, 3010, 0, 0, 3511, 3520, 6, 6, 8, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 12, 7, 33, 50, 29, 29, 13, 13, 7, 9, 7, 21, 23, 2, 14, 4, 0, 9, 8, {68,90,68}, 2, 1, 6, 5, 6, 1, 3, 3 }, // Kabyle/Latin/Algeria
- { 126, 66, 40, 0, 0, 0, 0, 6, 1, 0, 2, 3, 4, 5, 9, 17, 18, 19, 20, 54, 952, 0, 0, 8452, 8452, 8452, 8452, 8505, 8505, 0, 0, 0, 5, 22, 3, 3024, 4, 0, 3528, 3532, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 53, 53, 53, 53, 20, 20, 2, 2, 4, 17, 23, 4, 9, 5, 0, 4, 7, {88,65,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Kako/Latin/Cameroon
- { 127, 66, 95, 0, 0, 531, 531, 6, 1, 0, 2, 3, 40, 5, 52, 18, 17, 20, 19, 54, 44, 146, 146, 8525, 8525, 8622, 8622, 8649, 8649, 0, 0, 0, 5, 22, 161, 3033, 9, 49, 3539, 3550, 6, 6, 11, 11, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 17, 10, 10, 5, 97, 97, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 19, 4, 5, 11, 16, {68,75,75}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Kalaallisut/Latin/Greenland
- { 128, 66, 124, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 0, 0, 8662, 8662, 8714, 8714, 8741, 8741, 276, 286, 0, 5, 22, 175, 3052, 9, 13, 3566, 3574, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 52, 52, 27, 27, 13, 13, 6, 10, 4, 17, 23, 3, 19, 4, 6, 8, 12, {75,69,83}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Kalenjin/Latin/Kenya
- { 129, 66, 124, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 0, 0, 8754, 8754, 8827, 8827, 8854, 8854, 282, 296, 0, 5, 22, 175, 3071, 9, 13, 3586, 1109, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 73, 73, 27, 27, 13, 13, 9, 7, 4, 17, 23, 3, 16, 4, 6, 7, 5, {75,69,83}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Kamba/Latin/Kenya
- { 130, 56, 110, 0, 0, 542, 554, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 321, 87, 308, 321, 8867, 8867, 8920, 8920, 8952, 8952, 291, 303, 632, 640, 22, 118, 3087, 9, 13, 3593, 3598, 6, 6, 12, 11, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 13, 8, 53, 53, 32, 32, 19, 19, 9, 7, 8, 35, 23, 1, 13, 4, 6, 5, 4, {73,78,82}, 2, 1, 7, 7, 7, 1, 3, 3 }, // Kannada/Kannada/India
- { 132, 4, 110, 0, 0, 0, 0, 53, 21, 22, 23, 61, 35, 62, 65, 10, 11, 12, 13, 321, 339, 10, 22, 8971, 8971, 9022, 9022, 9071, 9071, 0, 0, 0, 5, 22, 118, 3100, 4, 0, 3602, 3607, 6, 6, 6, 6, 1, 1, 1, 1, 1, 3, 3, 4, 1, 1, 1, 1, 18, 6, 12, 7, 51, 51, 49, 49, 13, 13, 2, 2, 4, 17, 23, 1, 16, 5, 0, 5, 9, {73,78,82}, 2, 1, 7, 7, 7, 1, 2, 3 }, // Kashmiri/Arabic/India
- { 132, 29, 110, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 44, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 118, 0, 4, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {73,78,82}, 2, 1, 7, 7, 7, 1, 3, 3 }, // Kashmiri/Devanagari/India
- { 133, 27, 123, 0, 0, 0, 565, 6, 1, 14, 2, 3, 4, 5, 9, 17, 18, 10, 11, 962, 184, 0, 0, 9084, 9084, 9139, 9139, 9159, 9159, 0, 0, 196, 675, 692, 249, 3116, 19, 0, 3616, 3626, 6, 6, 6, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 22, 8, 10, 5, 55, 55, 20, 20, 13, 13, 2, 2, 4, 17, 23, 1, 17, 5, 0, 10, 9, {75,90,84}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Kazakh/Cyrillic/Kazakhstan
- { 134, 66, 40, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 44, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 3, 0, 4, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 4, 0, 5, 0, 0, 0, {88,65,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Kenyang/Latin/Cameroon
- { 135, 60, 39, 0, 0, 575, 584, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 71, 87, 10, 22, 9172, 9217, 9263, 9263, 9302, 9302, 0, 0, 715, 5, 22, 250, 3133, 0, 31, 3635, 3640, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 6, 12, 7, 45, 46, 39, 39, 13, 13, 2, 2, 2, 17, 23, 1, 11, 4, 6, 5, 7, {75,72,82}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Khmer/Khmer/Cambodia
- { 136, 66, 99, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 44, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 251, 0, 4, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {71,84,81}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Kiche/Latin/Guatemala
- { 137, 66, 124, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 0, 0, 9315, 9315, 9377, 9377, 9404, 9404, 300, 310, 0, 5, 22, 175, 3144, 9, 13, 3647, 1109, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 62, 62, 27, 27, 13, 13, 6, 8, 4, 17, 23, 3, 16, 4, 6, 6, 5, {75,69,83}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Kikuyu/Latin/Kenya
- { 138, 66, 194, 0, 0, 0, 0, 6, 1, 0, 2, 3, 4, 5, 9, 17, 18, 12, 13, 27, 44, 0, 0, 9417, 9417, 9500, 9500, 83, 83, 0, 0, 0, 5, 22, 191, 0, 4, 0, 3653, 3664, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 83, 83, 34, 34, 13, 13, 2, 2, 4, 17, 23, 2, 0, 5, 0, 11, 8, {82,87,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Kinyarwanda/Latin/Rwanda
- { 141, 29, 110, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 71, 210, 10, 22, 9534, 9534, 9534, 9534, 9584, 9602, 0, 0, 717, 5, 22, 118, 2885, 9, 13, 3672, 569, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 6, 12, 7, 50, 50, 50, 50, 18, 19, 2, 2, 4, 17, 23, 1, 12, 4, 6, 6, 4, {73,78,82}, 2, 1, 7, 7, 7, 1, 3, 3 }, // Konkani/Devanagari/India
- { 142, 63, 218, 0, 0, 593, 593, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 984, 1000, 339, 352, 9621, 9621, 9648, 9648, 9648, 9648, 306, 318, 721, 5, 22, 252, 3160, 9, 13, 3678, 3681, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 9, 13, 7, 27, 27, 13, 13, 13, 13, 2, 2, 3, 17, 23, 1, 6, 4, 6, 3, 4, {75,82,87}, 0, 0, 7, 6, 7, 1, 3, 3 }, // Korean/Korean/South Korea
- { 142, 63, 174, 0, 0, 593, 593, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 984, 1000, 339, 352, 9621, 9621, 9648, 9648, 9648, 9648, 306, 318, 721, 5, 22, 253, 3166, 9, 13, 3678, 3685, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 9, 13, 7, 27, 27, 13, 13, 13, 13, 2, 2, 3, 17, 23, 3, 16, 4, 6, 3, 11, {75,80,87}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Korean/Korean/North Korea
- { 144, 66, 145, 0, 0, 0, 0, 6, 0, 14, 2, 3, 4, 5, 9, 10, 11, 12, 13, 71, 87, 0, 0, 9661, 9661, 9714, 9714, 9741, 9741, 308, 320, 0, 5, 22, 124, 3182, 0, 0, 3696, 3711, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 53, 53, 27, 27, 13, 13, 6, 6, 4, 17, 23, 5, 16, 4, 0, 15, 5, {88,79,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Koyraboro Senni/Latin/Mali
- { 145, 66, 145, 0, 0, 0, 0, 6, 0, 14, 2, 3, 4, 5, 9, 10, 11, 12, 13, 71, 87, 0, 0, 9754, 9754, 9806, 9806, 9741, 9741, 308, 320, 0, 5, 22, 124, 3182, 0, 0, 3716, 3711, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 52, 52, 27, 27, 13, 13, 6, 6, 4, 17, 23, 5, 16, 4, 0, 11, 5, {88,79,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Koyra Chiini/Latin/Mali
- { 146, 66, 134, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 44, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 2, 0, 4, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {76,82,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Kpelle/Latin/Liberia
- { 148, 66, 239, 0, 0, 600, 600, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 44, 0, 0, 9833, 9833, 9874, 9874, 9893, 9893, 314, 326, 0, 5, 22, 256, 0, 19, 24, 3727, 3732, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 41, 41, 19, 19, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 7, 5, 7, {84,82,89}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Kurdish/Latin/Turkey
- { 149, 66, 40, 0, 0, 0, 0, 6, 1, 14, 2, 3, 4, 5, 9, 15, 11, 17, 18, 71, 87, 0, 0, 9906, 9906, 9994, 9994,10023,10023, 316, 328, 0, 5, 22, 3, 3198, 19, 0, 3739, 3745, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 88, 88, 29, 29, 13, 13, 4, 4, 4, 17, 23, 4, 13, 5, 0, 6, 7, {88,65,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Kwasio/Latin/Cameroon
- { 150, 27, 128, 0, 0, 607, 607, 6, 1, 14, 2, 3, 4, 5, 9, 17, 18, 15, 10, 1009, 87, 0, 0,10036,10036,10092,10092,10129,10129, 320, 332, 196, 724, 22, 257, 3211, 19, 0, 3752, 3760, 6, 6, 10, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 6, 10, 5, 56, 56, 37, 37, 13, 13, 5, 14, 4, 18, 23, 3, 15, 5, 0, 8, 10, {75,71,83}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Kyrgyz/Cyrillic/Kyrgyzstan
- { 151, 66, 248, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 321, 339, 10, 22,10142,10142,10142,10142, 83,10228, 0, 0, 0, 5, 22, 2, 0, 4, 0, 3770, 3782, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 12, 7, 86, 86, 86, 86, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 12, 22, {85,83,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Lakota/Latin/United States
- { 152, 66, 230, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 11, 11, 13, 13, 0, 127, 0, 0,10241,10241,10303,10303,10338,10338, 325, 346, 0, 5, 22, 119, 3226, 4, 0, 3804, 3812, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 62, 62, 35, 35, 13, 13, 3, 3, 4, 17, 23, 3, 22, 5, 0, 8, 9, {84,90,83}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Langi/Latin/Tanzania
- { 153, 65, 129, 0, 0, 0, 617, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 1032, 87, 359, 1,10351,10351,10407,10407,10442,10442, 328, 349, 0, 5, 22, 260, 3248, 9, 44, 3821, 3821, 6, 6, 6, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 8, 24, 4, 56, 56, 35, 35, 16, 16, 8, 8, 4, 17, 23, 1, 7, 4, 5, 3, 3, {76,65,75}, 0, 0, 7, 6, 7, 1, 3, 3 }, // Lao/Lao/Laos
- { 154, 66, 253, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 44, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 14, 0, 4, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Latin/Latin/Vatican City
- { 155, 66, 131, 0, 0, 216, 216, 6, 1, 14, 2, 3, 4, 5, 9, 10, 11, 12, 13, 1051, 184, 0, 0,10458,10529,10600,10650,10700,10700, 336, 357, 742, 5, 22, 14, 3255, 19, 0, 3824, 3832, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 26, 8, 10, 5, 71, 71, 50, 50, 13, 13, 14, 11, 5, 17, 23, 1, 4, 5, 0, 8, 7, {69,85,82}, 2, 1, 1, 6, 7, 2, 3, 3 }, // Latvian/Latin/Latvia
- { 158, 66, 57, 0, 0, 626, 626, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 71, 87, 0, 0,10713,10713,10812,10812,10839,10839, 350, 368, 0, 5, 22, 3, 3259, 19, 0, 3839, 3846, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 99, 99, 27, 27, 13, 13, 8, 6, 4, 17, 23, 2, 16, 5, 0, 7, 30, {67,68,70}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Lingala/Latin/Congo Kinshasa
- { 158, 66, 7, 0, 0, 626, 626, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 71, 87, 0, 0,10713,10713,10812,10812,10839,10839, 350, 368, 0, 5, 22, 261, 3275, 19, 0, 3839, 3876, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 99, 99, 27, 27, 13, 13, 8, 6, 4, 17, 23, 2, 16, 5, 0, 7, 6, {65,79,65}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Lingala/Latin/Angola
- { 158, 66, 46, 0, 0, 626, 626, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 71, 87, 0, 0,10713,10713,10812,10812,10839,10839, 350, 368, 0, 5, 22, 3, 3291, 19, 0, 3839, 3882, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 99, 99, 27, 27, 13, 13, 8, 6, 4, 17, 23, 4, 16, 5, 0, 7, 26, {88,65,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Lingala/Latin/Central African Republic
- { 158, 66, 56, 0, 0, 626, 626, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 71, 87, 0, 0,10713,10713,10812,10812,10839,10839, 350, 368, 0, 5, 22, 3, 3291, 19, 0, 3839, 3908, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 99, 99, 27, 27, 13, 13, 8, 6, 4, 17, 23, 4, 16, 5, 0, 7, 5, {88,65,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Lingala/Latin/Congo Brazzaville
- { 160, 66, 137, 0, 0, 635, 635, 6, 1, 14, 2, 3, 40, 5, 52, 15, 10, 15, 10, 1077, 44, 0, 0,10852,10852,10940,10940,10960,10960, 358, 374, 747, 5, 22, 14, 3307, 19, 0, 3913, 3921, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 27, 10, 10, 5, 88, 88, 20, 20, 13, 13, 9, 6, 6, 17, 23, 1, 5, 5, 0, 8, 7, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Lithuanian/Latin/Lithuania
- { 161, 66, 258, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 44, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 0, 0, 4, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 0, 0, {0,0,0}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Lojban/Latin/World
- { 162, 66, 91, 0, 0, 224, 224, 6, 1, 0, 2, 3, 4, 5, 9, 15, 10, 16, 12, 345, 121, 1, 1,10973,10973,11025,11025,11052,11052, 367, 380, 0, 5, 22, 14, 420, 19, 0, 3928, 3942, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 9, 4, 52, 52, 27, 27, 13, 13, 9, 10, 4, 17, 23, 1, 4, 5, 0, 14, 6, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Lower Sorbian/Latin/Germany
- { 163, 66, 91, 0, 0, 216, 216, 6, 1, 0, 2, 3, 4, 5, 9, 15, 10, 16, 12, 1104, 185, 383, 402,11065,11065,11129,11129, 3667, 3667, 0, 0, 0, 5, 22, 14, 73, 19, 0, 3948, 3962, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 7, 19, 10, 64, 64, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 4, 5, 0, 14, 11, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Low German/Latin/Germany
- { 163, 66, 165, 0, 0, 216, 216, 6, 1, 0, 2, 3, 4, 5, 9, 15, 10, 16, 12, 1104, 185, 383, 402,11065,11065,11129,11129, 3667, 3667, 0, 0, 0, 5, 22, 14, 73, 19, 0, 3948, 3973, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 7, 19, 10, 64, 64, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 4, 5, 0, 14, 12, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Low German/Latin/Netherlands
- { 164, 66, 57, 0, 0, 0, 0, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 71, 87, 0, 0,11156,11156,11205,11205,11232,11232, 376, 390, 0, 5, 22, 3, 3312, 0, 0, 3985, 3993, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 49, 49, 27, 27, 13, 13, 5, 6, 4, 17, 23, 2, 17, 4, 0, 8, 16, {67,68,70}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Luba Katanga/Latin/Congo Kinshasa
- { 165, 66, 225, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 44, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 161, 0, 4, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 2, 0, 5, 0, 0, 0, {83,69,75}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Lule Sami/Latin/Sweden
- { 166, 66, 124, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 0, 0,11245,11245,11313,11313,11340,11340, 381, 396, 0, 5, 22, 175, 3329, 0, 0, 4009, 1109, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 68, 68, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 16, 4, 0, 6, 5, {75,69,83}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Luo/Latin/Kenya
- { 167, 66, 138, 0, 0, 643, 643, 6, 1, 0, 2, 3, 4, 5, 9, 15, 10, 16, 12, 345, 184, 0, 0,11353,11353,11417,11444, 3667, 3667, 383, 398, 461, 5, 22, 14, 73, 19, 0, 4015, 4015, 6, 6, 10, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 10, 5, 64, 64, 27, 34, 13, 13, 5, 8, 5, 17, 23, 1, 4, 5, 0, 14, 10, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Luxembourgish/Latin/Luxembourg
- { 168, 66, 124, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 15, 10, 16, 12, 0, 127, 0, 0,11478,11478,11552,11552, 83, 83, 165, 164, 0, 5, 22, 175, 3345, 9, 54, 4029, 1109, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 74, 74, 20, 20, 13, 13, 4, 4, 4, 17, 23, 3, 16, 4, 6, 7, 5, {75,69,83}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Luyia/Latin/Kenya
- { 169, 27, 140, 0, 0, 117, 117, 6, 1, 0, 2, 3, 4, 5, 9, 15, 10, 16, 12, 0, 121, 0, 0,11572,11572,11625,11625, 2519, 2519, 388, 406, 753, 5, 22, 263, 3361, 19, 0, 4036, 4046, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 10, 5, 53, 53, 34, 34, 13, 13, 10, 8, 5, 17, 23, 4, 16, 5, 0, 10, 18, {77,75,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Macedonian/Cyrillic/Macedonia
- { 170, 66, 230, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 0, 0,11659,11659,11720,11720, 1041, 1041, 398, 414, 0, 5, 22, 119, 3377, 9, 0, 4064, 2031, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 61, 61, 27, 27, 13, 13, 5, 9, 4, 17, 23, 3, 20, 4, 0, 9, 8, {84,90,83}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Machame/Latin/Tanzania
- { 171, 29, 110, 0, 0, 436, 445, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 87, 10, 22,11747,11747, 7072, 7072, 7103, 7103, 403, 423, 0, 5, 22, 118, 2885, 4, 0, 4073, 569, 6, 6, 9, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 12, 7, 63, 63, 31, 31, 18, 18, 3, 4, 4, 17, 23, 1, 12, 5, 0, 6, 4, {73,78,82}, 2, 1, 7, 7, 7, 1, 3, 3 }, // Maithili/Devanagari/India
- { 172, 66, 160, 0, 0, 0, 0, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 0, 0,11810,11810,11868,11868,11895,11895, 406, 427, 0, 5, 22, 267, 0, 4, 0, 4079, 4084, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 58, 58, 27, 27, 13, 13, 8, 10, 4, 17, 23, 3, 0, 5, 0, 5, 10, {77,90,78}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Makhuwa Meetto/Latin/Mozambique
- { 173, 66, 230, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 0, 0,11908,11908,12040,12040,12067,12067, 414, 437, 0, 5, 22, 119, 3377, 9, 13, 4094, 2031, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5,132,132, 27, 27, 13, 13, 4, 5, 4, 17, 23, 3, 20, 4, 6, 10, 8, {84,90,83}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Makonde/Latin/Tanzania
- { 174, 66, 141, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 17, 18, 10, 11, 71, 44, 0, 0,12080,12080,12139,12139,12172,12172, 0, 0, 0, 5, 22, 183, 1459, 9, 0, 4104, 4112, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 59, 59, 33, 33, 13, 13, 2, 2, 4, 17, 23, 2, 6, 4, 0, 8, 12, {77,71,65}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Malagasy/Latin/Madagascar
- { 175, 74, 110, 0, 0, 653, 666, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 1127, 87, 10, 22,12185,12261,12336,12336,12376,12397, 0, 0, 758, 764, 22, 118, 3397, 9, 13, 4124, 4130, 6, 6, 13, 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 12, 7, 76, 75, 40, 40, 21, 20, 2, 2, 6, 27, 23, 1, 11, 4, 6, 6, 6, {73,78,82}, 2, 1, 7, 7, 7, 1, 2, 3 }, // Malayalam/Malayalam/India
- { 176, 66, 143, 0, 0, 488, 488, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 128, 10, 22,12417,12417,12459,12459,12486,12486, 418, 442, 742, 5, 22, 187, 3408, 9, 13, 4136, 1646, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 7, 12, 7, 42, 42, 27, 27, 13, 13, 2, 3, 4, 17, 23, 2, 16, 4, 6, 6, 8, {77,89,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Malay/Latin/Malaysia
- { 176, 4, 143, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 44, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 187, 0, 4, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 2, 0, 5, 0, 0, 0, {77,89,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Malay/Arabic/Malaysia
- { 176, 66, 35, 0, 0, 488, 488, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 59, 128, 10, 22,12417,12417,12459,12459,12486,12486, 418, 442, 742, 5, 22, 2, 3424, 9, 13, 4136, 4142, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 12, 7, 12, 7, 42, 42, 27, 27, 13, 13, 2, 3, 4, 17, 23, 1, 12, 4, 6, 6, 6, {66,78,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Malay/Latin/Brunei
- { 176, 66, 111, 0, 0, 488, 488, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 618, 127, 146, 146,12417,12417,12459,12459,12486,12486, 418, 442, 742, 5, 22, 243, 2928, 9, 0, 4136, 3356, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 10, 5, 42, 42, 27, 27, 13, 13, 2, 3, 4, 17, 23, 2, 16, 4, 0, 6, 9, {73,68,82}, 2, 0, 7, 6, 7, 1, 3, 3 }, // Malay/Latin/Indonesia
- { 176, 66, 210, 0, 0, 488, 488, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 128, 10, 22,12417,12417,12459,12459,12486,12486, 418, 442, 742, 5, 22, 2, 3436, 9, 13, 4136, 4148, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 7, 12, 7, 42, 42, 27, 27, 13, 13, 2, 3, 4, 17, 23, 1, 15, 4, 6, 6, 9, {83,71,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Malay/Latin/Singapore
- { 177, 66, 146, 0, 0, 678, 686, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 1145, 127, 0, 0,12499,12499,12561,12561,12588,12608, 0, 0, 0, 5, 22, 14, 3451, 9, 0, 4157, 1654, 6, 6, 8, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 10, 10, 5, 62, 62, 27, 27, 20, 19, 2, 2, 4, 17, 23, 1, 4, 4, 0, 5, 5, {69,85,82}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Maltese/Latin/Malta
- { 179, 9, 110, 0, 0, 693, 693, 6, 0, 1, 2, 39, 4, 5, 9, 10, 11, 12, 13, 1168, 87, 10, 22,12627,12627,12627,12627,12685,12710, 420, 445, 0, 5, 22, 118, 3455, 4, 0, 4162, 4170, 6, 6, 11, 11, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 12, 7, 58, 58, 58, 58, 25, 29, 4, 5, 4, 17, 23, 1, 14, 5, 0, 8, 8, {73,78,82}, 2, 1, 7, 7, 7, 1, 3, 3 }, // Manipuri/Bangla/India
- { 179, 78, 110, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 44, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 118, 0, 4, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {73,78,82}, 2, 1, 7, 7, 7, 1, 3, 3 }, // Manipuri/Meitei Mayek/India
- { 180, 66, 115, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 54, 127, 0, 0,12739,12739,12795,12795, 83, 83, 165, 164, 0, 5, 22, 92, 0, 9, 0, 4178, 4183, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 8, 10, 5, 56, 56, 29, 29, 13, 13, 4, 4, 4, 17, 23, 1, 0, 4, 0, 5, 12, {71,66,80}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Manx/Latin/Isle Of Man
- { 181, 66, 167, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 432, 10, 22,12824,12824,12870,12870,12896,12896, 0, 0, 0, 5, 22, 2, 3469, 4, 0, 4195, 4207, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 46, 46, 26, 26, 13, 13, 2, 2, 4, 17, 23, 1, 15, 5, 0, 12, 8, {78,90,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Maori/Latin/New Zealand
- { 182, 66, 49, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 44, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 2, 0, 4, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {67,76,80}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Mapuche/Latin/Chile
- { 183, 29, 110, 0, 0, 704, 704, 6, 0, 1, 2, 69, 4, 5, 9, 10, 11, 12, 13, 192, 87, 10, 22,12909,12909,12961,12961, 7103, 7103, 0, 0, 562, 5, 22, 118, 2885, 9, 13, 4215, 569, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 12, 7, 52, 52, 31, 31, 18, 18, 2, 2, 4, 17, 23, 1, 12, 4, 6, 5, 4, {73,78,82}, 2, 1, 7, 7, 7, 1, 2, 3 }, // Marathi/Devanagari/India
- { 185, 66, 124, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 0, 0,12992,12992,11720,11720,12067,12067, 424, 450, 0, 5, 22, 175, 3484, 9, 13, 1077, 1109, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 57, 57, 27, 27, 13, 13, 9, 6, 4, 17, 23, 3, 18, 4, 6, 3, 5, {75,69,83}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Masai/Latin/Kenya
- { 185, 66, 230, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 0, 0,12992,12992,11720,11720,12067,12067, 424, 450, 0, 5, 22, 119, 3502, 9, 13, 1077, 4220, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 57, 57, 27, 27, 13, 13, 9, 6, 4, 17, 23, 3, 21, 4, 6, 3, 8, {84,90,83}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Masai/Latin/Tanzania
- { 186, 4, 112, 0, 0, 0, 0, 53, 21, 22, 23, 61, 35, 62, 65, 17, 18, 19, 20, 27, 44, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 791, 795, 22, 270, 3523, 4, 0, 4228, 4235, 6, 6, 6, 6, 1, 1, 1, 1, 1, 3, 3, 4, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 39, 23, 3, 10, 5, 0, 7, 5, {73,82,82}, 0, 0, 6, 5, 5, 1, 3, 3 }, // Mazanderani/Arabic/Iran
- { 188, 66, 124, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 0, 0,13049,13049,13099,13099,13126,13126, 433, 456, 0, 5, 22, 175, 952, 9, 13, 4240, 1109, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 50, 50, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 17, 4, 6, 6, 5, {75,69,83}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Meru/Latin/Kenya
- { 189, 66, 40, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 95, 44, 0, 0,13139,13139,13139,13139,13187,13187, 0, 0, 0, 5, 22, 3, 3533, 4, 0, 4246, 4251, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 10, 10, 5, 48, 48, 48, 48, 20, 20, 2, 2, 4, 17, 23, 4, 5, 5, 0, 5, 7, {88,65,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Meta/Latin/Cameroon
- { 190, 66, 41, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 44, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 245, 0, 4, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 0, 5, 0, 0, 0, {67,65,68}, 2, 0, 7, 6, 7, 1, 3, 3 }, // Mohawk/Latin/Canada
- { 191, 27, 156, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 1186, 1221, 54, 0,13207,13249,13291,13291,13291,13291, 435, 458, 196, 834, 22, 273, 3538, 4, 0, 4258, 4264, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 35, 10, 12, 5, 42, 42, 20, 20, 20, 20, 4, 4, 4, 17, 23, 1, 13, 5, 0, 6, 6, {77,78,84}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Mongolian/Cyrillic/Mongolia
- { 191, 83, 50, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 44, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 274, 0, 4, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 0, 5, 0, 0, 0, {67,78,89}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Mongolian/Mongolian/China
- { 192, 66, 150, 0, 0, 0, 0, 6, 0, 14, 2, 3, 4, 5, 9, 10, 11, 12, 13, 71, 87, 0, 0,13311,13311,13358,13358,13384,13384, 0, 0, 0, 5, 22, 189, 3551, 4, 0, 4270, 4284, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 47, 47, 26, 26, 13, 13, 2, 2, 4, 17, 23, 2, 14, 5, 0, 14, 5, {77,85,82}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Morisyen/Latin/Mauritius
- { 193, 66, 40, 0, 0, 0, 0, 6, 1, 0, 2, 3, 4, 5, 9, 17, 18, 10, 11, 71, 87, 0, 0,13397,13397,13470,13470,13497,13497, 439, 462, 0, 5, 22, 3, 3565, 9, 13, 4289, 4295, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 73, 73, 27, 27, 13, 13, 5, 5, 4, 17, 23, 4, 10, 4, 6, 6, 7, {88,65,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Mundang/Latin/Cameroon
- { 194, 66, 248, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 44, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 146, 0, 4, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 0, 5, 0, 0, 0, {85,83,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Muscogee/Latin/United States
- { 195, 66, 162, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 10, 22,13510,13510,13601,13601,13623,13623, 444, 467, 0, 5, 22, 2, 3575, 9, 0, 4302, 4315, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 91, 91, 22, 22, 13, 13, 7, 5, 4, 17, 23, 1, 15, 4, 0, 13, 8, {78,65,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Nama/Latin/Namibia
- { 197, 66, 248, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 44, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 146, 0, 4, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 0, 5, 0, 0, 0, {85,83,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Navajo/Latin/United States
- { 199, 29, 164, 713, 0, 718, 718, 6, 0, 1, 2, 69, 4, 5, 9, 10, 11, 12, 13, 27, 293, 0, 0,13636,13636,13689,13689,13721,13721, 451, 472, 562, 851, 22, 277, 3590, 4, 0, 4323, 4323, 5, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 10, 5, 53, 53, 32, 32, 17, 17, 9, 7, 4, 19, 23, 4, 14, 5, 0, 6, 5, {78,80,82}, 2, 1, 7, 6, 7, 1, 2, 3 }, // Nepali/Devanagari/Nepal
- { 199, 29, 110, 713, 0, 718, 718, 6, 0, 1, 2, 69, 4, 5, 9, 10, 11, 12, 13, 27, 293, 10, 22,13636,13636,13689,13689,13721,13721, 451, 472, 562, 851, 22, 118, 3604, 4, 0, 4323, 569, 5, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 12, 7, 53, 53, 32, 32, 17, 17, 9, 7, 4, 19, 23, 1, 14, 5, 0, 6, 4, {73,78,82}, 2, 1, 7, 7, 7, 1, 2, 3 }, // Nepali/Devanagari/India
- { 201, 66, 40, 0, 0, 0, 0, 6, 1, 0, 2, 3, 4, 5, 9, 17, 18, 10, 11, 1231, 127, 0, 0,13738,13738,13738,13738, 83, 83, 460, 479, 0, 5, 22, 3, 3618, 4, 0, 4329, 4345, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 32, 8, 10, 5,110,110,110,110, 13, 13, 9, 8, 4, 17, 23, 4, 9, 5, 0, 16, 7, {88,65,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Ngiemboon/Latin/Cameroon
- { 202, 66, 40, 725, 725, 736, 752, 6, 1, 0, 2, 3, 4, 5, 9, 17, 18, 19, 20, 95, 44, 0, 0,13848,13848,13848,13848,13907,13907, 469, 487, 0, 5, 22, 3, 3627, 4, 0, 4352, 4357, 11, 11, 16, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 10, 10, 5, 59, 59, 59, 59, 24, 24, 8, 13, 4, 17, 23, 4, 5, 5, 0, 5, 7, {88,65,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Ngomba/Latin/Cameroon
- { 203, 66, 169, 0, 0, 761, 770, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 0, 0,13931,13931,13982,13982, 83, 83, 477, 500, 870, 5, 22, 122, 3632, 9, 0, 4364, 4378, 6, 6, 9, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 51, 51, 32, 32, 13, 13, 9, 8, 8, 17, 23, 1, 14, 4, 0, 14, 8, {78,71,78}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Nigerian Pidgin/Latin/Nigeria
- { 204, 90, 102, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 44, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 209, 0, 4, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 2, 0, 5, 0, 0, 0, {71,78,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Nko/Nko/Guinea
- { 205, 4, 112, 0, 0, 0, 0, 53, 21, 22, 23, 61, 35, 62, 65, 10, 11, 12, 13, 27, 44, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 0, 0, 4, 0, 4386, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 3, 3, 4, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 11, 0, {73,82,82}, 0, 0, 6, 5, 5, 1, 3, 3 }, // Northern Luri/Arabic/Iran
- { 205, 4, 113, 0, 0, 0, 0, 53, 21, 22, 23, 61, 35, 62, 65, 10, 11, 12, 13, 27, 44, 10, 22, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 41, 0, 4, 0, 4386, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 3, 3, 4, 1, 1, 1, 1, 17, 10, 12, 7, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 5, 0, 5, 0, 11, 0, {73,81,68}, 0, 0, 6, 5, 6, 1, 3, 3 }, // Northern Luri/Arabic/Iraq
- { 206, 66, 175, 0, 0, 293, 293, 6, 1, 14, 2, 3, 40, 5, 70, 11, 11, 13, 13, 27, 44, 0, 0,14014,14014,14088,14088,14120,14120, 486, 508, 0, 5, 22, 161, 3646, 19, 0, 4397, 4412, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 17, 10, 10, 5, 74, 74, 32, 32, 13, 13, 11, 13, 4, 17, 23, 2, 14, 5, 0, 15, 5, {78,79,75}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Northern Sami/Latin/Norway
- { 206, 66, 83, 0, 0, 293, 293, 6, 1, 14, 2, 3, 40, 5, 70, 11, 11, 13, 13, 71, 560, 0, 0,14133,14133,14202,14202,14222,14222, 497, 181, 0, 5, 22, 14, 420, 19, 0, 4397, 4417, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 16, 10, 10, 5, 69, 69, 20, 20, 13, 13, 2, 2, 4, 17, 23, 1, 4, 5, 0, 15, 6, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Northern Sami/Latin/Finland
- { 206, 66, 225, 0, 0, 293, 293, 6, 1, 14, 2, 3, 40, 5, 70, 11, 11, 13, 13, 27, 44, 0, 0,14014,14014,14088,14088,14120,14120, 486, 508, 0, 5, 22, 161, 3660, 19, 0, 4397, 4423, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 17, 10, 10, 5, 74, 74, 32, 32, 13, 13, 11, 13, 4, 17, 23, 2, 14, 5, 0, 15, 6, {83,69,75}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Northern Sami/Latin/Sweden
- { 207, 66, 216, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 44, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 1, 0, 4, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {90,65,82}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Northern Sotho/Latin/South Africa
- { 208, 66, 261, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 0, 0,14235,14235,14284,14284,14311,14311, 0, 0, 0, 5, 22, 146, 3674, 9, 13, 4429, 2197, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 49, 49, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 17, 4, 6, 10, 8, {85,83,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // North Ndebele/Latin/Zimbabwe
- { 209, 66, 175, 0, 0, 231, 231, 6, 1, 14, 2, 3, 40, 5, 9, 17, 18, 12, 13, 520, 560, 0, 0, 3848, 3848, 3925, 3925, 3959, 3959, 165, 164, 0, 5, 22, 161, 3691, 4, 37, 4439, 4451, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 50, 50, 34, 34, 13, 13, 4, 4, 4, 17, 23, 2, 13, 5, 7, 12, 5, {78,79,75}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Norwegian Bokmal/Latin/Norway
- { 209, 66, 224, 0, 0, 231, 231, 6, 1, 14, 2, 3, 40, 5, 9, 17, 18, 12, 13, 520, 560, 0, 0, 3848, 3848, 3925, 3925, 3959, 3959, 165, 164, 0, 5, 22, 161, 3691, 4, 37, 4439, 4456, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 50, 50, 34, 34, 13, 13, 4, 4, 4, 17, 23, 2, 13, 5, 7, 12, 21, {78,79,75}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Norwegian Bokmal/Latin/Svalbard And Jan Mayen
- { 210, 66, 175, 0, 0, 231, 231, 6, 1, 14, 2, 3, 40, 5, 9, 17, 18, 12, 13, 520, 560, 412, 0,14324,14324,14374,14401, 3959, 3959, 165, 164, 0, 5, 22, 161, 3691, 19, 0, 4477, 4490, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 16, 5, 50, 50, 27, 27, 13, 13, 4, 4, 4, 17, 23, 2, 13, 5, 0, 13, 5, {78,79,75}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Norwegian Nynorsk/Latin/Norway
- { 211, 66, 219, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 71, 128, 428, 22,14428,14428,14506,14506,14543,14543, 499, 521, 0, 5, 22, 92, 0, 9, 13, 4495, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 9, 12, 7, 78, 78, 37, 37, 13, 13, 2, 2, 4, 17, 23, 1, 0, 4, 6, 9, 0, {83,83,80}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Nuer/Latin/South Sudan
- { 212, 66, 142, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 44, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 0, 0, 4, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 0, 0, {77,87,75}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Nyanja/Latin/Malawi
- { 213, 66, 243, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 0, 0, 3436, 3436, 3509, 3509, 3536, 3536, 0, 0, 0, 5, 22, 149, 783, 9, 0, 4504, 857, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 73, 73, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 19, 4, 0, 10, 6, {85,71,88}, 0, 0, 1, 7, 7, 1, 3, 3 }, // Nyankole/Latin/Uganda
- { 214, 66, 84, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 44, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 14, 0, 4, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Occitan/Latin/France
- { 215, 91, 110, 0, 0, 778, 786, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 321, 339, 10, 22,14556,14556,14609,14609,14641,14641, 0, 0, 878, 5, 22, 118, 3704, 9, 13, 4514, 4519, 6, 6, 8, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 12, 7, 53, 53, 32, 32, 17, 17, 2, 2, 5, 17, 23, 1, 12, 4, 6, 5, 4, {73,78,82}, 2, 1, 7, 7, 7, 1, 2, 3 }, // Odia/Odia/India
- { 220, 66, 77, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 321, 127, 10, 22,14658,14658,14712,14712, 83, 83, 501, 523, 0, 5, 22, 131, 3716, 9, 0, 4523, 4529, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 12, 7, 54, 54, 27, 27, 13, 13, 2, 2, 4, 17, 23, 2, 17, 4, 0, 6, 10, {69,84,66}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Oromo/Latin/Ethiopia
- { 220, 66, 124, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 321, 127, 0, 0,14658,14658,14712,14712,14739,14739, 501, 523, 0, 5, 22, 175, 0, 9, 0, 4523, 4539, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 10, 5, 54, 54, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 0, 4, 0, 6, 8, {75,69,83}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Oromo/Latin/Kenya
- { 221, 101, 248, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 44, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 146, 0, 4, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 0, 5, 0, 0, 0, {85,83,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Osage/Osage/United States
- { 222, 27, 90, 0, 0, 793, 793, 6, 1, 14, 2, 3, 4, 5, 9, 17, 18, 15, 10, 1263, 184, 0, 0,14752,14812,14872,14899,14926,14926, 503, 525, 0, 5, 22, 0, 3733, 4, 0, 4547, 4551, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 8, 10, 5, 60, 60, 27, 27, 13, 13, 15, 15, 4, 17, 23, 1, 3, 5, 0, 4, 11, {71,69,76}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Ossetic/Cyrillic/Georgia
- { 222, 27, 193, 0, 0, 793, 793, 6, 1, 14, 2, 3, 4, 5, 9, 17, 18, 15, 10, 1263, 184, 0, 0,14752,14812,14872,14899,14926,14926, 503, 525, 0, 5, 22, 130, 3736, 4, 0, 4547, 4562, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 8, 10, 5, 60, 60, 27, 27, 13, 13, 15, 15, 4, 17, 23, 1, 3, 5, 0, 4, 6, {82,85,66}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Ossetic/Cyrillic/Russia
- { 227, 4, 1, 802, 802, 808, 817, 53, 21, 22, 23, 61, 35, 62, 65, 10, 11, 12, 13, 1286, 454, 55, 1,14939,14939,14939,14939, 83, 83, 518, 540, 883, 5, 22, 281, 3739, 9, 13, 4568, 4572, 6, 6, 9, 8, 1, 1, 1, 1, 1, 3, 3, 4, 1, 1, 1, 1, 20, 8, 11, 4, 38, 38, 38, 38, 13, 13, 4, 4, 5, 17, 23, 1, 6, 4, 6, 4, 9, {65,70,78}, 0, 0, 6, 4, 5, 1, 3, 3 }, // Pashto/Arabic/Afghanistan
- { 227, 4, 178, 802, 802, 808, 817, 53, 21, 22, 23, 61, 35, 62, 65, 10, 11, 12, 13, 1286, 454, 10, 22,14939,14939,14939,14939, 83, 83, 518, 540, 883, 5, 22, 189, 3745, 9, 13, 4568, 4581, 6, 6, 9, 8, 1, 1, 1, 1, 1, 3, 3, 4, 1, 1, 1, 1, 20, 8, 12, 7, 38, 38, 38, 38, 13, 13, 4, 4, 5, 17, 23, 2, 15, 4, 6, 4, 7, {80,75,82}, 2, 0, 7, 6, 7, 1, 3, 3 }, // Pashto/Arabic/Pakistan
- { 228, 4, 112, 825, 825, 832, 840, 53, 21, 22, 23, 61, 74, 37, 65, 17, 18, 19, 20, 71, 454, 55, 1,14977,14977,14977,14977,15025,15025, 522, 544, 791, 5, 22, 282, 3760, 60, 66, 4588, 4235, 7, 7, 8, 7, 1, 1, 1, 1, 1, 2, 2, 4, 1, 1, 1, 1, 16, 8, 11, 4, 48, 48, 48, 48, 13, 13, 9, 8, 4, 17, 23, 4, 10, 6, 8, 5, 5, {73,82,82}, 0, 0, 6, 5, 5, 1, 3, 3 }, // Persian/Arabic/Iran
- { 228, 4, 1, 825, 825, 832, 840, 53, 21, 22, 23, 61, 74, 37, 65, 17, 18, 19, 20, 71, 454, 55, 1,14977,14977,14977,14977,15025,15025, 522, 544, 791, 5, 22, 281, 3770, 4, 66, 4593, 4572, 7, 7, 8, 7, 1, 1, 1, 1, 1, 2, 2, 4, 1, 1, 1, 1, 16, 8, 11, 4, 48, 48, 48, 48, 13, 13, 9, 8, 4, 17, 23, 1, 16, 5, 8, 3, 9, {65,70,78}, 0, 0, 6, 4, 5, 1, 3, 3 }, // Persian/Arabic/Afghanistan
- { 230, 66, 187, 0, 0, 110, 110, 6, 1, 14, 2, 3, 4, 5, 9, 15, 11, 17, 18, 0, 561, 0, 0,15038,15038,15096,15096,15129,15142, 0, 0, 311, 5, 22, 286, 3786, 19, 24, 4596, 4602, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 9, 10, 5, 58, 58, 33, 33, 13, 13, 2, 2, 5, 17, 23, 2, 12, 5, 7, 6, 6, {80,76,78}, 2, 1, 1, 6, 7, 2, 3, 3 }, // Polish/Latin/Poland
- { 231, 66, 32, 0, 0, 347, 347, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 768, 127, 0, 0,15155,15155,15233,15233,15267,15267, 0, 0, 0, 5, 22, 1, 3798, 4, 0, 4608, 4617, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 10, 10, 5, 78, 78, 34, 34, 13, 13, 2, 2, 5, 17, 23, 2, 15, 5, 0, 9, 6, {66,82,76}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Portuguese/Latin/Brazil
- { 231, 66, 7, 0, 0, 347, 347, 6, 1, 14, 2, 3, 4, 5, 9, 17, 18, 10, 11, 768, 127, 0, 0,15155,15155,15280,15280,15267,15267, 531, 552, 0, 5, 22, 261, 3813, 19, 24, 4608, 4623, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 10, 5, 78, 78, 48, 48, 13, 13, 8, 8, 5, 17, 23, 2, 15, 5, 7, 9, 6, {65,79,65}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Portuguese/Latin/Angola
- { 231, 66, 43, 0, 0, 347, 347, 6, 1, 14, 2, 3, 4, 5, 9, 17, 18, 10, 11, 768, 127, 0, 0,15155,15155,15280,15280,15267,15267, 531, 552, 0, 5, 22, 248, 3828, 19, 24, 4608, 4629, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 10, 5, 78, 78, 48, 48, 13, 13, 8, 8, 5, 17, 23, 1, 20, 5, 7, 9, 10, {67,86,69}, 2, 1, 1, 6, 7, 2, 3, 3 }, // Portuguese/Latin/Cape Verde
- { 231, 66, 73, 0, 0, 347, 347, 6, 1, 14, 2, 3, 4, 5, 9, 17, 18, 10, 11, 768, 127, 0, 0,15155,15155,15280,15280,15267,15267, 531, 552, 0, 5, 22, 3, 3848, 19, 24, 4608, 4639, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 10, 5, 78, 78, 48, 48, 13, 13, 8, 8, 5, 17, 23, 4, 17, 5, 7, 9, 16, {88,65,70}, 0, 0, 1, 6, 7, 2, 3, 3 }, // Portuguese/Latin/Equatorial Guinea
- { 231, 66, 101, 0, 0, 347, 347, 6, 1, 14, 2, 3, 4, 5, 9, 17, 18, 10, 11, 768, 127, 0, 0,15155,15155,15280,15280,15267,15267, 531, 552, 0, 5, 22, 124, 3865, 19, 24, 4608, 4655, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 10, 5, 78, 78, 48, 48, 13, 13, 8, 8, 5, 17, 23, 5, 18, 5, 7, 9, 12, {88,79,70}, 0, 0, 1, 6, 7, 2, 3, 3 }, // Portuguese/Latin/Guinea Bissau
- { 231, 66, 138, 0, 0, 347, 347, 6, 1, 14, 2, 3, 4, 5, 9, 17, 18, 10, 11, 768, 127, 0, 0,15155,15155,15280,15280,15267,15267, 531, 552, 0, 5, 22, 14, 420, 19, 24, 4608, 4667, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 10, 5, 78, 78, 48, 48, 13, 13, 8, 8, 5, 17, 23, 1, 4, 5, 7, 9, 10, {69,85,82}, 2, 1, 1, 6, 7, 2, 3, 3 }, // Portuguese/Latin/Luxembourg
- { 231, 66, 139, 0, 0, 347, 347, 6, 1, 14, 2, 3, 4, 5, 9, 17, 18, 10, 11, 768, 127, 10, 22,15155,15155,15280,15280,15267,15267, 531, 552, 0, 5, 22, 153, 3883, 19, 24, 4608, 4677, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 12, 7, 78, 78, 48, 48, 13, 13, 8, 8, 5, 17, 23, 4, 15, 5, 7, 9, 19, {77,79,80}, 2, 1, 7, 6, 7, 2, 3, 3 }, // Portuguese/Latin/Macao
- { 231, 66, 160, 0, 0, 347, 347, 6, 1, 14, 2, 3, 4, 5, 9, 17, 18, 10, 11, 768, 127, 0, 0,15155,15155,15280,15280,15267,15267, 531, 552, 0, 5, 22, 267, 3898, 19, 24, 4608, 4696, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 10, 5, 78, 78, 48, 48, 13, 13, 8, 8, 5, 17, 23, 3, 19, 5, 7, 9, 10, {77,90,78}, 2, 1, 7, 6, 7, 2, 3, 3 }, // Portuguese/Latin/Mozambique
- { 231, 66, 188, 0, 0, 347, 347, 6, 1, 14, 2, 3, 4, 5, 9, 17, 18, 10, 11, 768, 127, 0, 0,15155,15155,15280,15280,15267,15267, 531, 552, 0, 5, 22, 14, 420, 19, 24, 4706, 4723, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 10, 5, 78, 78, 48, 48, 13, 13, 8, 8, 5, 17, 23, 1, 4, 5, 7, 17, 8, {69,85,82}, 2, 1, 7, 6, 7, 2, 3, 3 }, // Portuguese/Latin/Portugal
- { 231, 66, 204, 0, 0, 347, 347, 6, 1, 14, 2, 3, 4, 5, 9, 17, 18, 10, 11, 768, 127, 0, 0,15155,15155,15280,15280,15267,15267, 531, 552, 0, 5, 22, 288, 3917, 19, 24, 4608, 4731, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 10, 5, 78, 78, 48, 48, 13, 13, 8, 8, 5, 17, 23, 2, 28, 5, 7, 9, 19, {83,84,78}, 2, 1, 1, 6, 7, 2, 3, 3 }, // Portuguese/Latin/Sao Tome And Principe
- { 231, 66, 226, 0, 0, 347, 347, 6, 1, 14, 2, 3, 4, 5, 9, 17, 18, 10, 11, 768, 127, 0, 0,15155,15155,15280,15280,15267,15267, 531, 552, 0, 5, 22, 216, 3945, 19, 24, 4608, 4750, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 10, 5, 78, 78, 48, 48, 13, 13, 8, 8, 5, 17, 23, 3, 12, 5, 7, 9, 5, {67,72,70}, 2, 0, 1, 6, 7, 2, 3, 3 }, // Portuguese/Latin/Switzerland
- { 231, 66, 232, 0, 0, 347, 347, 6, 1, 14, 2, 3, 4, 5, 9, 17, 18, 10, 11, 768, 127, 0, 0,15155,15155,15280,15280,15267,15267, 531, 552, 0, 5, 22, 146, 3957, 19, 24, 4608, 4755, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 10, 5, 78, 78, 48, 48, 13, 13, 8, 8, 5, 17, 23, 3, 24, 5, 7, 9, 11, {85,83,68}, 2, 1, 1, 6, 7, 2, 3, 3 }, // Portuguese/Latin/Timor-Leste
- { 232, 66, 258, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 44, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 0, 0, 4, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 0, 0, {0,0,0}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Prussian/Latin/World
- { 233, 41, 110, 0, 0, 847, 847, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 87, 10, 22,15328,15328,15384,15384,15419,15419, 539, 560, 888, 5, 22, 118, 3981, 4, 0, 4766, 4772, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 12, 7, 56, 56, 35, 35, 22, 22, 6, 6, 4, 17, 23, 1, 11, 5, 0, 6, 4, {73,78,82}, 2, 1, 7, 7, 7, 1, 2, 3 }, // Punjabi/Gurmukhi/India
- { 233, 4, 178, 0, 0, 0, 0, 53, 21, 22, 23, 61, 35, 62, 65, 10, 11, 12, 13, 618, 127, 10, 22,15441,15441,15441,15441, 83, 83, 0, 0, 0, 5, 22, 76, 3992, 4, 0, 4776, 4581, 6, 6, 6, 6, 1, 1, 1, 1, 1, 3, 3, 4, 1, 1, 1, 1, 18, 10, 12, 7, 36, 36, 36, 36, 13, 13, 2, 2, 4, 17, 23, 1, 6, 5, 0, 6, 7, {80,75,82}, 2, 0, 7, 6, 7, 1, 3, 3 }, // Punjabi/Arabic/Pakistan
- { 234, 66, 184, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 192, 127, 0, 0,15477,15477,15529,15529,15556,15556, 165, 164, 0, 5, 22, 290, 3998, 4, 0, 4782, 4790, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 10, 10, 5, 52, 52, 27, 27, 13, 13, 4, 4, 4, 17, 23, 2, 11, 5, 0, 8, 4, {80,69,78}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Quechua/Latin/Peru
- { 234, 66, 28, 0, 0, 0, 0, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 192, 127, 0, 0,15477,15477,15529,15529,15556,15556, 165, 164, 0, 5, 22, 292, 4009, 4, 0, 4782, 4794, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 10, 10, 5, 52, 52, 27, 27, 13, 13, 4, 4, 4, 17, 23, 2, 9, 5, 0, 8, 7, {66,79,66}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Quechua/Latin/Bolivia
- { 234, 66, 70, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 192, 127, 0, 0,15477,15477,15529,15529,15556,15556, 165, 164, 0, 5, 22, 2, 4018, 4, 0, 4782, 4801, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 10, 10, 5, 52, 52, 27, 27, 13, 13, 4, 4, 4, 17, 23, 1, 15, 5, 0, 8, 7, {85,83,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Quechua/Latin/Ecuador
- { 235, 66, 192, 0, 0, 856, 856, 6, 1, 0, 2, 3, 4, 5, 9, 15, 11, 17, 18, 0, 560, 0, 0,15569,15569,15616,15616, 5445, 5445, 165, 164, 892, 5, 22, 294, 4033, 19, 24, 4808, 4814, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 47, 47, 33, 33, 13, 13, 4, 4, 4, 17, 23, 3, 12, 5, 7, 6, 7, {82,79,78}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Romanian/Latin/Romania
- { 235, 66, 154, 0, 0, 856, 856, 6, 1, 0, 2, 3, 4, 5, 9, 15, 11, 17, 18, 0, 560, 0, 0,15569,15569,15649,15649,15676,15676, 165, 164, 892, 5, 22, 10, 4045, 19, 24, 4808, 4821, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 47, 47, 27, 27, 15, 15, 4, 4, 4, 17, 23, 1, 15, 5, 7, 6, 17, {77,68,76}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Romanian/Latin/Moldova
- { 236, 66, 226, 0, 0, 347, 347, 6, 0, 13, 2, 3, 40, 5, 9, 17, 18, 19, 20, 1306, 432, 0, 0,15691,15691,15746,15746,15768,15768, 0, 0, 0, 5, 22, 216, 4060, 19, 0, 4838, 4847, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 8, 10, 5, 55, 55, 22, 22, 13, 13, 2, 2, 5, 17, 23, 3, 13, 5, 0, 9, 6, {67,72,70}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Romansh/Latin/Switzerland
- { 237, 66, 230, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 0, 0,15781,15781,15845,15845,12067,12067, 545, 566, 0, 5, 22, 119, 4073, 9, 0, 4853, 2031, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 64, 64, 28, 28, 13, 13, 8, 7, 4, 17, 23, 3, 18, 4, 0, 9, 8, {84,90,83}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Rombo/Latin/Tanzania
- { 238, 66, 38, 0, 0, 0, 0, 6, 1, 0, 2, 3, 4, 5, 9, 11, 11, 13, 13, 71, 87, 0, 0,15873,15873,15961,15961, 83, 83, 553, 573, 0, 5, 22, 178, 4091, 0, 0, 4862, 4870, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 88, 88, 33, 33, 13, 13, 5, 5, 4, 17, 23, 3, 20, 4, 0, 8, 8, {66,73,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Rundi/Latin/Burundi
- { 239, 27, 193, 0, 0, 117, 117, 6, 1, 14, 2, 3, 4, 5, 9, 17, 18, 15, 10, 299, 560, 0, 0,15994,15994,16055,16055,16075,16075, 0, 0, 196, 834, 22, 130, 4111, 19, 0, 4878, 4885, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 22, 10, 10, 5, 61, 61, 20, 20, 13, 13, 2, 2, 5, 17, 23, 1, 16, 5, 0, 7, 6, {82,85,66}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Russian/Cyrillic/Russia
- { 239, 27, 22, 0, 0, 117, 117, 6, 1, 14, 2, 3, 4, 5, 9, 17, 18, 15, 10, 299, 560, 0, 0,15994,15994,16055,16055,16075,16075, 0, 0, 196, 834, 22, 131, 4127, 19, 0, 4878, 526, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 22, 10, 10, 5, 61, 61, 20, 20, 13, 13, 2, 2, 5, 17, 23, 2, 17, 5, 0, 7, 8, {66,89,78}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Russian/Cyrillic/Belarus
- { 239, 27, 123, 0, 0, 117, 117, 6, 1, 14, 2, 3, 4, 5, 9, 17, 18, 15, 10, 299, 560, 0, 0,15994,15994,16055,16055,16075,16075, 0, 0, 196, 834, 22, 249, 4144, 19, 0, 4878, 4891, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 22, 10, 10, 5, 61, 61, 20, 20, 13, 13, 2, 2, 5, 17, 23, 1, 15, 5, 0, 7, 9, {75,90,84}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Russian/Cyrillic/Kazakhstan
- { 239, 27, 128, 0, 0, 117, 117, 6, 1, 14, 2, 3, 4, 5, 9, 17, 18, 15, 10, 299, 560, 0, 0,15994,15994,16055,16055,16075,16075, 0, 0, 196, 834, 22, 257, 4159, 19, 0, 4878, 4900, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 22, 10, 10, 5, 61, 61, 20, 20, 13, 13, 2, 2, 5, 17, 23, 3, 14, 5, 0, 7, 8, {75,71,83}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Russian/Cyrillic/Kyrgyzstan
- { 239, 27, 154, 0, 0, 117, 117, 6, 1, 14, 2, 3, 4, 5, 9, 17, 18, 15, 10, 299, 560, 0, 0,15994,15994,16055,16055,16075,16075, 0, 0, 196, 834, 22, 10, 4173, 19, 0, 4878, 4908, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 22, 10, 10, 5, 61, 61, 20, 20, 13, 13, 2, 2, 5, 17, 23, 1, 14, 5, 0, 7, 7, {77,68,76}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Russian/Cyrillic/Moldova
- { 239, 27, 244, 0, 0, 117, 117, 6, 1, 14, 2, 3, 4, 5, 9, 17, 18, 15, 10, 299, 560, 0, 0,15994,15994,16055,16055,16075,16075, 0, 0, 196, 834, 22, 297, 4187, 19, 0, 4878, 4915, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 22, 10, 10, 5, 61, 61, 20, 20, 13, 13, 2, 2, 5, 17, 23, 1, 17, 5, 0, 7, 7, {85,65,72}, 2, 1, 1, 6, 7, 2, 3, 3 }, // Russian/Cyrillic/Ukraine
- { 240, 66, 230, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 0, 0,11659,11659,11720,11720, 1041, 1041, 398, 414, 0, 5, 22, 119, 3377, 0, 0, 4922, 2031, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 61, 61, 27, 27, 13, 13, 5, 9, 4, 17, 23, 3, 20, 4, 0, 6, 8, {84,90,83}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Rwa/Latin/Tanzania
- { 241, 66, 74, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 44, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 0, 0, 4, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 0, 0, {69,82,78}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Saho/Latin/Eritrea
- { 242, 27, 193, 0, 0, 864, 864, 6, 1, 14, 2, 3, 4, 5, 9, 17, 18, 15, 10, 1329, 293, 0, 0,16088,16088,16158,16158,16178,16178, 558, 578, 896, 901, 22, 130, 4204, 19, 0, 4928, 4937, 6, 6, 11, 11, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 30, 6, 10, 5, 70, 70, 20, 20, 13, 13, 2, 2, 5, 17, 23, 1, 20, 5, 0, 9, 9, {82,85,66}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Sakha/Cyrillic/Russia
- { 243, 66, 124, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 0, 0,16191,16191,16295,16295,16322,16322, 560, 580, 0, 5, 22, 175, 4224, 9, 13, 4946, 1109, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5,104,104, 27, 27, 13, 13, 7, 5, 4, 17, 23, 3, 18, 4, 6, 8, 5, {75,69,83}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Samburu/Latin/Kenya
- { 245, 66, 46, 0, 0, 0, 0, 6, 1, 0, 2, 3, 4, 5, 9, 17, 18, 10, 11, 71, 87, 0, 0,16335,16335,16400,16400,16427,16427, 567, 585, 0, 5, 22, 3, 4242, 9, 44, 4954, 4959, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 65, 65, 27, 27, 13, 13, 2, 2, 4, 17, 23, 4, 18, 4, 5, 5, 22, {88,65,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Sango/Latin/Central African Republic
- { 246, 66, 230, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 0, 0,16440,16440,16499,16499,16526,16526, 569, 587, 0, 5, 22, 119, 4260, 0, 0, 4981, 4990, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 59, 59, 27, 27, 13, 13, 9, 9, 4, 17, 23, 3, 18, 4, 0, 9, 9, {84,90,83}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Sangu/Latin/Tanzania
- { 247, 29, 110, 0, 0, 875, 885, 6, 0, 1, 2, 69, 4, 5, 9, 10, 11, 12, 13, 0, 87, 10, 22,16539,16539, 7072, 7072, 7103, 7103, 451, 472, 0, 5, 22, 118, 4278, 4, 0, 4999, 5011, 6, 6, 10, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 12, 7, 66, 66, 31, 31, 18, 18, 9, 7, 4, 17, 23, 1, 15, 5, 0, 12, 5, {73,78,82}, 2, 1, 7, 7, 7, 1, 2, 3 }, // Sanskrit/Devanagari/India
- { 248, 93, 110, 0, 0, 0, 0, 6, 0, 1, 2, 76, 4, 5, 9, 10, 11, 12, 13, 0, 87, 10, 22,16605,16605,16646,16646,16671,16671, 578, 596, 0, 5, 22, 118, 4293, 4, 0, 5016, 5023, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 12, 7, 41, 41, 25, 25, 13, 13, 5, 5, 4, 17, 23, 1, 16, 5, 0, 7, 6, {73,78,82}, 2, 1, 7, 7, 7, 1, 3, 3 }, // Santali/Ol Chiki/India
- { 248, 29, 110, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 44, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 118, 0, 4, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {73,78,82}, 2, 1, 7, 7, 7, 1, 3, 3 }, // Santali/Devanagari/India
- { 249, 66, 117, 0, 0, 347, 347, 6, 1, 0, 2, 3, 4, 5, 9, 17, 18, 10, 11, 1359, 127, 0, 0,16684,16684,16738,16738,16765,16765, 0, 0, 0, 5, 22, 14, 4309, 19, 0, 5029, 715, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 37, 10, 10, 5, 54, 54, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 4, 5, 0, 5, 6, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Sardinian/Latin/Italy
- { 251, 66, 160, 0, 0, 0, 0, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 768, 87, 0, 0,16778,16778,16832,16832,16859,16859, 0, 0, 0, 5, 22, 267, 4313, 0, 0, 5034, 4696, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 10, 5, 54, 54, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 21, 4, 0, 4, 10, {77,90,78}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Sena/Latin/Mozambique
- { 252, 27, 207, 0, 0, 117, 117, 6, 1, 0, 2, 3, 4, 5, 9, 15, 10, 12, 12, 345, 395, 0, 0,16872,16872,16923,16923, 2341, 2341, 0, 0, 918, 5, 22, 298, 4334, 19, 24, 5038, 5044, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 7, 10, 5, 51, 51, 27, 27, 13, 13, 2, 2, 7, 17, 23, 3, 12, 5, 7, 6, 6, {82,83,68}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Serbian/Cyrillic/Serbia
- { 252, 27, 29, 0, 0, 117, 117, 6, 1, 0, 2, 3, 4, 5, 9, 15, 10, 12, 12, 345, 395, 0, 0, 2259, 2259, 2314,16923, 2341, 2341, 101, 601, 918, 5, 22, 136, 4346, 19, 24, 5038, 608, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 7, 10, 5, 55, 55, 27, 27, 13, 13, 11, 8, 7, 17, 23, 2, 40, 5, 7, 6, 19, {66,65,77}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Serbian/Cyrillic/Bosnia And Herzegovina
- { 252, 27, 126, 0, 0, 117, 117, 6, 1, 0, 2, 3, 4, 5, 9, 15, 10, 12, 12, 345, 395, 0, 0,16872,16872,16923,16923, 2341, 2341, 0, 0, 918, 5, 22, 14, 4386, 19, 24, 5038, 5050, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 7, 10, 5, 51, 51, 27, 27, 13, 13, 2, 2, 7, 17, 23, 1, 4, 5, 7, 6, 6, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Serbian/Cyrillic/Kosovo
- { 252, 27, 157, 0, 0, 117, 117, 6, 1, 0, 2, 3, 4, 5, 9, 15, 10, 12, 12, 345, 395, 0, 0,16950,16950,16923,16923, 2341, 2341, 101, 601, 918, 5, 22, 14, 4386, 19, 24, 5038, 5056, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 7, 10, 5, 54, 54, 27, 27, 13, 13, 11, 8, 7, 17, 23, 1, 4, 5, 7, 6, 9, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Serbian/Cyrillic/Montenegro
- { 252, 66, 29, 0, 0, 110, 110, 6, 1, 0, 2, 3, 4, 5, 9, 15, 10, 12, 12, 345, 395, 0, 0, 2149, 2149, 2206,17004, 2233, 2233, 583, 609, 218, 5, 22, 134, 575, 19, 24, 5065, 581, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 7, 10, 5, 57, 57, 27, 27, 13, 13, 11, 8, 7, 17, 23, 2, 40, 5, 7, 6, 19, {66,65,77}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Serbian/Latin/Bosnia And Herzegovina
- { 252, 66, 126, 0, 0, 110, 110, 6, 1, 0, 2, 3, 4, 5, 9, 15, 10, 12, 12, 345, 395, 0, 0,17031,17031,17004,17004, 2233, 2233, 0, 0, 218, 5, 22, 14, 4390, 19, 24, 5065, 5071, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 7, 10, 5, 53, 53, 27, 27, 13, 13, 2, 2, 7, 17, 23, 1, 4, 5, 7, 6, 6, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Serbian/Latin/Kosovo
- { 252, 66, 157, 0, 0, 110, 110, 6, 1, 0, 2, 3, 4, 5, 9, 15, 10, 12, 12, 345, 395, 0, 0,17084,17084,17004,17004, 2233, 2233, 583, 609, 218, 5, 22, 14, 4390, 19, 24, 5065, 5077, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 7, 10, 5, 56, 56, 27, 27, 13, 13, 11, 8, 7, 17, 23, 1, 4, 5, 7, 6, 9, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Serbian/Latin/Montenegro
- { 252, 66, 207, 0, 0, 110, 110, 6, 1, 0, 2, 3, 4, 5, 9, 15, 10, 12, 12, 345, 395, 0, 0,17031,17031,17004,17004, 2233, 2233, 0, 0, 218, 5, 22, 298, 4394, 19, 24, 5065, 5086, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 7, 10, 5, 53, 53, 27, 27, 13, 13, 2, 2, 7, 17, 23, 3, 12, 5, 7, 6, 6, {82,83,68}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Serbian/Latin/Serbia
- { 253, 66, 230, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 0, 0,17140,17140,17202,17202,17229,17229, 594, 617, 0, 5, 22, 119, 4406, 0, 0, 5092, 2031, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 62, 62, 27, 27, 13, 13, 5, 8, 4, 17, 23, 3, 20, 4, 0, 9, 8, {84,90,83}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Shambala/Latin/Tanzania
- { 254, 66, 261, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 11, 11, 13, 13, 27, 44, 0, 0,17242,17242,17296,17296,17323,17323, 0, 0, 0, 5, 22, 146, 4426, 9, 13, 5101, 2197, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 54, 54, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 15, 4, 6, 8, 8, {85,83,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Shona/Latin/Zimbabwe
- { 255, 141, 50, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 44, 0, 0,17336,17336,17363,17363,17383,17383, 599, 625, 0, 5, 22, 152, 0, 4, 0, 5109, 5112, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 20, 20, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 3, 2, {67,78,89}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Sichuan Yi/Yi/China
- { 256, 66, 117, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 44, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 14, 0, 4, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Sicilian/Latin/Italy
- { 257, 66, 77, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 44, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 0, 0, 4, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 0, 0, {69,84,66}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Sidamo/Latin/Ethiopia
- { 258, 66, 187, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 44, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 286, 0, 4, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 2, 0, 5, 0, 0, 0, {80,76,78}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Silesian/Latin/Poland
- { 259, 4, 178, 0, 0, 894, 902, 53, 21, 22, 23, 25, 26, 28, 30, 10, 11, 12, 13, 27, 44, 10, 22,17396,17396,17396,17396,17430,17430, 601, 627, 925, 931, 22, 189, 4441, 19, 0, 5114, 5118, 6, 6, 8, 7, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 12, 7, 34, 34, 34, 34, 30, 30, 11, 11, 6, 25, 23, 2, 12, 5, 0, 4, 7, {80,75,82}, 2, 0, 7, 6, 7, 1, 3, 3 }, // Sindhi/Arabic/Pakistan
- { 259, 29, 110, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 321, 339, 10, 22,17460,17487,17528,17550,17578,17578, 612, 638, 0, 5, 22, 118, 4453, 4, 0, 5125, 569, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 12, 7, 27, 41, 22, 28, 20, 20, 20, 14, 4, 17, 23, 1, 17, 5, 0, 6, 4, {73,78,82}, 2, 1, 7, 7, 7, 1, 3, 3 }, // Sindhi/Devanagari/India
- { 260, 119, 221, 0, 0, 909, 918, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 44, 146, 146,17598,17598,17659,17659,17697,17697, 632, 652, 956, 961, 22, 301, 4470, 9, 13, 5131, 5136, 6, 6, 9, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 61, 61, 38, 38, 18, 18, 5, 4, 5, 42, 23, 3, 17, 4, 6, 5, 11, {76,75,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Sinhala/Sinhala/Sri Lanka
- { 261, 66, 83, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 44, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 14, 0, 4, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Skolt Sami/Latin/Finland
- { 262, 66, 212, 0, 0, 224, 926, 6, 1, 14, 2, 3, 4, 5, 6, 15, 10, 16, 12, 520, 364, 1, 1,17715,17715,17766,17766,17786,17786, 0, 0, 311, 5, 22, 14, 420, 19, 24, 5147, 5157, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 9, 4, 51, 51, 20, 20, 13, 13, 2, 2, 5, 17, 23, 1, 4, 5, 7, 10, 9, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Slovak/Latin/Slovakia
- { 263, 66, 213, 0, 0, 933, 933, 6, 1, 0, 2, 3, 40, 5, 6, 15, 10, 16, 12, 345, 499, 0, 0,17799,17799,17850,17850,17884,17884, 169, 656, 50, 5, 22, 14, 4487, 19, 24, 5166, 5177, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 9, 10, 5, 51, 51, 34, 34, 13, 13, 4, 4, 4, 17, 23, 1, 4, 5, 7, 11, 9, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Slovenian/Latin/Slovenia
- { 264, 66, 243, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 0, 0,17897,17897,17961,17961,17995,17995, 637, 660, 0, 5, 22, 149, 2756, 19, 0, 5186, 3067, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 64, 64, 34, 34, 13, 13, 6, 6, 4, 17, 23, 3, 19, 5, 0, 7, 7, {85,71,88}, 0, 0, 1, 7, 7, 1, 3, 3 }, // Soga/Latin/Uganda
- { 265, 66, 215, 0, 0, 941, 941, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 321, 127, 10, 22,18008,18008,18054,18054,18085,18085, 643, 666, 1003, 1009, 22, 91, 4491, 9, 13, 5193, 5201, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 12, 7, 46, 46, 31, 31, 14, 14, 2, 2, 6, 17, 23, 1, 20, 4, 6, 8, 10, {83,79,83}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Somali/Latin/Somalia
- { 265, 66, 67, 0, 0, 941, 941, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 321, 127, 10, 22,18008,18008,18054,18054,18085,18085, 643, 666, 1003, 1009, 22, 35, 4511, 9, 13, 5193, 5211, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 12, 7, 46, 46, 31, 31, 14, 14, 2, 2, 6, 17, 23, 3, 13, 4, 6, 8, 7, {68,74,70}, 0, 0, 6, 6, 7, 1, 3, 3 }, // Somali/Latin/Djibouti
- { 265, 66, 77, 0, 0, 941, 941, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 321, 127, 10, 22,18008,18008,18054,18054,18085,18085, 643, 666, 1003, 1009, 22, 131, 4524, 9, 13, 5193, 5218, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 12, 7, 46, 46, 31, 31, 14, 14, 2, 2, 6, 17, 23, 2, 15, 4, 6, 8, 8, {69,84,66}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Somali/Latin/Ethiopia
- { 265, 66, 124, 0, 0, 941, 941, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 321, 127, 0, 0,18008,18008,18054,18054,18085,18085, 643, 666, 1003, 1009, 22, 175, 4539, 9, 13, 5193, 1109, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 10, 5, 46, 46, 31, 31, 14, 14, 2, 2, 6, 17, 23, 3, 15, 4, 6, 8, 5, {75,69,83}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Somali/Latin/Kenya
- { 266, 4, 112, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 44, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 0, 0, 4, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 0, 0, {73,82,82}, 0, 0, 6, 5, 5, 1, 3, 3 }, // Southern Kurdish/Arabic/Iran
- { 267, 66, 225, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 44, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 161, 0, 4, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 2, 0, 5, 0, 0, 0, {83,69,75}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Southern Sami/Latin/Sweden
- { 268, 66, 216, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 44, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 1, 0, 4, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {90,65,82}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Southern Sotho/Latin/South Africa
- { 269, 66, 216, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 44, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 1, 0, 4, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {90,65,82}, 2, 1, 7, 6, 7, 1, 3, 3 }, // South Ndebele/Latin/South Africa
- { 270, 66, 220, 0, 0, 70, 70, 6, 1, 0, 2, 3, 4, 5, 9, 17, 18, 10, 11, 768, 87, 55, 1,18099,18099,18151,18151,15556,15556, 129, 124, 0, 5, 22, 14, 420, 19, 0, 5226, 386, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 11, 4, 52, 52, 27, 27, 13, 13, 5, 5, 5, 17, 23, 1, 4, 5, 0, 17, 6, {69,85,82}, 2, 1, 1, 6, 7, 2, 3, 3 }, // Spanish/Latin/Spain
- { 270, 66, 11, 0, 0, 70, 70, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 768, 87, 0, 0,18099,18099,18151,18151, 5445, 5445, 129, 124, 0, 5, 22, 2, 4554, 4, 37, 5226, 5243, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 10, 5, 52, 52, 27, 27, 13, 13, 5, 5, 5, 17, 23, 1, 14, 5, 7, 7, 9, {65,82,83}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Spanish/Latin/Argentina
- { 270, 66, 24, 0, 0, 70, 70, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 768, 87, 0, 0,18099,18099,18151,18151, 5445, 7760, 129, 124, 0, 5, 22, 2, 4568, 9, 0, 5226, 5252, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 10, 5, 52, 52, 27, 27, 13, 13, 5, 5, 5, 17, 23, 1, 14, 4, 0, 7, 6, {66,90,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Spanish/Latin/Belize
- { 270, 66, 28, 0, 0, 70, 70, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 768, 87, 0, 0,18099,18099,18151,18151, 5445, 7760, 129, 124, 0, 5, 22, 292, 4582, 9, 0, 5226, 4794, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 10, 5, 52, 52, 27, 27, 13, 13, 5, 5, 5, 17, 23, 2, 9, 4, 0, 7, 7, {66,79,66}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Spanish/Latin/Bolivia
- { 270, 66, 32, 0, 0, 70, 70, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 768, 87, 0, 0,18099,18099,18151,18151, 5445, 7760, 129, 124, 0, 5, 22, 1, 4591, 9, 0, 5226, 4617, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 10, 5, 52, 52, 27, 27, 13, 13, 5, 5, 5, 17, 23, 2, 14, 4, 0, 7, 6, {66,82,76}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Spanish/Latin/Brazil
- { 270, 66, 42, 0, 0, 70, 70, 6, 1, 0, 2, 3, 4, 5, 9, 17, 18, 10, 11, 768, 87, 55, 1,18099,18099,18151,18151,15556,15556, 129, 124, 0, 5, 22, 14, 420, 19, 0, 5226, 5258, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 11, 4, 52, 52, 27, 27, 13, 13, 5, 5, 5, 17, 23, 1, 4, 5, 0, 7, 8, {69,85,82}, 2, 1, 1, 6, 7, 2, 3, 3 }, // Spanish/Latin/Canary Islands
- { 270, 66, 47, 0, 0, 70, 70, 6, 1, 0, 2, 3, 4, 5, 9, 17, 18, 10, 11, 768, 87, 55, 1,18099,18099,18151,18151,15556,15556, 129, 124, 0, 5, 22, 14, 420, 19, 0, 5226, 5266, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 11, 4, 52, 52, 27, 27, 13, 13, 5, 5, 5, 17, 23, 1, 4, 5, 0, 7, 15, {69,85,82}, 2, 1, 1, 6, 7, 2, 3, 3 }, // Spanish/Latin/Ceuta And Melilla
- { 270, 66, 49, 0, 0, 70, 70, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 768, 432, 0, 0,18099,18099,18151,18151, 5445, 7760, 129, 124, 0, 5, 22, 2, 4605, 9, 0, 5226, 5281, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 10, 5, 52, 52, 27, 27, 13, 13, 5, 5, 5, 17, 23, 1, 12, 4, 0, 7, 5, {67,76,80}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Spanish/Latin/Chile
- { 270, 66, 54, 0, 0, 70, 70, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 768, 128, 10, 22,18099,18099,18151,18151, 7760, 5445, 129, 124, 0, 5, 22, 2, 4617, 9, 0, 5226, 5286, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 7, 12, 7, 52, 52, 27, 27, 13, 13, 5, 5, 5, 17, 23, 1, 15, 4, 0, 7, 8, {67,79,80}, 2, 0, 7, 6, 7, 1, 3, 3 }, // Spanish/Latin/Colombia
- { 270, 66, 59, 0, 0, 70, 70, 6, 1, 14, 2, 3, 4, 5, 9, 10, 11, 12, 13, 768, 87, 0, 0,18099,18099,18151,18151, 5445, 7760, 129, 124, 0, 5, 22, 304, 4632, 9, 0, 5226, 5294, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 10, 5, 52, 52, 27, 27, 13, 13, 5, 5, 5, 17, 23, 1, 19, 4, 0, 7, 10, {67,82,67}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Spanish/Latin/Costa Rica
- { 270, 66, 61, 0, 0, 70, 70, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 768, 87, 0, 0,18099,18099,18151,18151, 5445, 7760, 129, 124, 0, 5, 22, 2, 4651, 9, 0, 5226, 5304, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 10, 5, 52, 52, 27, 27, 13, 13, 5, 5, 5, 17, 23, 1, 11, 4, 0, 7, 4, {67,85,80}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Spanish/Latin/Cuba
- { 270, 66, 69, 0, 0, 70, 70, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 768, 87, 10, 22,18099,18099,18151,18151, 5445, 5445, 129, 124, 0, 5, 22, 305, 4662, 9, 13, 5226, 5308, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 12, 7, 52, 52, 27, 27, 13, 13, 5, 5, 5, 17, 23, 3, 15, 4, 6, 7, 20, {68,79,80}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Spanish/Latin/Dominican Republic
- { 270, 66, 70, 0, 0, 70, 70, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 768, 87, 0, 0,18099,18099,18151,18151, 5445, 7760, 129, 124, 0, 5, 22, 2, 4677, 9, 0, 5226, 4801, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 10, 5, 52, 52, 27, 27, 13, 13, 5, 5, 5, 17, 23, 1, 20, 4, 0, 7, 7, {85,83,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Spanish/Latin/Ecuador
- { 270, 66, 72, 0, 0, 70, 70, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 768, 87, 0, 0,18099,18099,18151,18151, 5445, 7760, 129, 124, 0, 5, 22, 2, 4677, 9, 0, 5226, 5328, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 10, 5, 52, 52, 27, 27, 13, 13, 5, 5, 5, 17, 23, 1, 20, 4, 0, 7, 11, {85,83,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Spanish/Latin/El Salvador
- { 270, 66, 73, 0, 0, 70, 70, 6, 1, 0, 2, 3, 4, 5, 9, 17, 18, 10, 11, 768, 87, 55, 1,18099,18099,18151,18151,15556,15556, 129, 124, 0, 5, 22, 3, 4697, 19, 0, 5226, 5339, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 11, 4, 52, 52, 27, 27, 13, 13, 5, 5, 5, 17, 23, 4, 28, 5, 0, 7, 17, {88,65,70}, 0, 0, 1, 6, 7, 2, 3, 3 }, // Spanish/Latin/Equatorial Guinea
- { 270, 66, 99, 0, 0, 70, 70, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 768, 128, 0, 0,18099,18099,18151,18151, 5445, 7760, 129, 124, 0, 5, 22, 251, 4725, 9, 0, 5226, 5356, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 7, 10, 5, 52, 52, 27, 27, 13, 13, 5, 5, 5, 17, 23, 1, 7, 4, 0, 7, 9, {71,84,81}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Spanish/Latin/Guatemala
- { 270, 66, 106, 0, 0, 70, 70, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 1396, 87, 0, 0,18099,18099,18151,18151, 5445, 7760, 129, 124, 0, 5, 22, 10, 4732, 9, 0, 5226, 5365, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 10, 5, 52, 52, 27, 27, 13, 13, 5, 5, 5, 17, 23, 1, 17, 4, 0, 7, 8, {72,78,76}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Spanish/Latin/Honduras
- { 270, 66, 130, 0, 0, 70, 70, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 768, 87, 0, 0,18099,18099,18151,18151, 5445, 7760, 129, 124, 0, 5, 22, 0, 0, 9, 0, 5373, 5396, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 10, 5, 52, 52, 27, 27, 13, 13, 5, 5, 5, 17, 23, 0, 0, 4, 0, 23, 13, {0,0,0}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Spanish/Latin/Latin America
- { 270, 66, 152, 0, 0, 70, 70, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 768, 127, 0, 0,18099,18099,18151,18151, 5445, 5445, 129, 124, 0, 5, 22, 2, 4749, 9, 0, 5409, 5426, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 10, 5, 52, 52, 27, 27, 13, 13, 5, 5, 5, 17, 23, 1, 13, 4, 0, 17, 6, {77,88,78}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Spanish/Latin/Mexico
- { 270, 66, 168, 0, 0, 70, 70, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 768, 87, 0, 0,18099,18099,18151,18151, 5445, 7760, 129, 124, 0, 5, 22, 308, 4762, 9, 0, 5226, 5432, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 10, 5, 52, 52, 27, 27, 13, 13, 5, 5, 5, 17, 23, 2, 20, 4, 0, 7, 9, {78,73,79}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Spanish/Latin/Nicaragua
- { 270, 66, 181, 0, 0, 70, 70, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 768, 1423, 10, 22,18099,18099,18151,18151, 5445, 7760, 129, 124, 0, 5, 22, 310, 4782, 9, 0, 5226, 5441, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 12, 7, 52, 52, 27, 27, 13, 13, 5, 5, 5, 17, 23, 3, 15, 4, 0, 7, 6, {80,65,66}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Spanish/Latin/Panama
- { 270, 66, 183, 0, 0, 70, 70, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 768, 87, 0, 0,18099,18099,18151,18151, 5445, 7760, 129, 124, 0, 5, 22, 313, 4797, 9, 0, 5226, 5447, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 10, 5, 52, 52, 27, 27, 13, 13, 5, 5, 5, 17, 23, 3, 17, 4, 0, 7, 8, {80,89,71}, 0, 0, 7, 6, 7, 1, 3, 3 }, // Spanish/Latin/Paraguay
- { 270, 66, 184, 0, 0, 70, 70, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 768, 128, 0, 0,18099,18099,18151,18151, 5445, 7760, 129, 124, 0, 5, 22, 290, 4814, 9, 0, 5226, 4790, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 7, 10, 5, 52, 52, 27, 27, 13, 13, 5, 5, 5, 17, 23, 2, 11, 4, 0, 7, 4, {80,69,78}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Spanish/Latin/Peru
- { 270, 66, 185, 0, 0, 70, 70, 6, 1, 0, 2, 3, 4, 5, 9, 17, 18, 10, 11, 768, 87, 10, 22,18099,18099,18151,18151,15556,15556, 129, 124, 0, 5, 22, 145, 4825, 19, 0, 5226, 5455, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 12, 7, 52, 52, 27, 27, 13, 13, 5, 5, 5, 17, 23, 1, 13, 5, 0, 7, 9, {80,72,80}, 2, 1, 7, 6, 7, 2, 3, 3 }, // Spanish/Latin/Philippines
- { 270, 66, 189, 0, 0, 70, 70, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 768, 1423, 10, 22,18099,18099,18151,18151, 5445, 7760, 129, 124, 0, 5, 22, 2, 4677, 9, 0, 5226, 1843, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 12, 7, 52, 52, 27, 27, 13, 13, 5, 5, 5, 17, 23, 1, 20, 4, 0, 7, 11, {85,83,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Spanish/Latin/Puerto Rico
- { 270, 66, 248, 0, 0, 70, 70, 6, 0, 1, 2, 3, 4, 5, 9, 17, 18, 10, 11, 768, 87, 10, 22,18099,18099,18151,18151, 5445, 5445, 129, 124, 0, 5, 22, 2, 4677, 9, 0, 5226, 5464, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 12, 7, 52, 52, 27, 27, 13, 13, 5, 5, 5, 17, 23, 1, 20, 4, 0, 7, 14, {85,83,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Spanish/Latin/United States
- { 270, 66, 250, 0, 0, 70, 70, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 768, 87, 0, 0,18099,18099,18151,18151, 5445, 7760, 129, 124, 0, 5, 22, 2, 4838, 4, 37, 5226, 5478, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 10, 5, 52, 52, 27, 27, 13, 13, 5, 5, 5, 17, 23, 1, 13, 5, 7, 7, 7, {85,89,85}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Spanish/Latin/Uruguay
- { 270, 66, 254, 0, 0, 70, 70, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 768, 87, 10, 22,18099,18099,18151,18151, 5445, 7760, 129, 124, 0, 5, 22, 316, 4851, 9, 0, 5226, 5485, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 12, 7, 52, 52, 27, 27, 13, 13, 5, 5, 5, 17, 23, 4, 16, 4, 0, 7, 9, {86,69,83}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Spanish/Latin/Venezuela
- { 271, 135, 159, 0, 0, 0, 0, 6, 1, 14, 2, 3, 4, 5, 9, 17, 18, 15, 11, 71, 87, 0, 0,18178,18178,18225,18225, 83, 83, 645, 668, 0, 5, 22, 0, 4867, 0, 0, 5494, 5502, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 47, 47, 29, 29, 13, 13, 6, 8, 4, 17, 23, 0, 14, 4, 0, 8, 6, {77,65,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Standard Moroccan Tamazight/Tifinagh/Morocco
- { 272, 66, 111, 0, 0, 950, 963, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 87, 147, 147,18254,18254,18297,18297, 7664, 7664, 0, 0, 0, 5, 22, 243, 4881, 9, 0, 5508, 0, 6, 6, 13, 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 9, 4, 43, 43, 27, 27, 13, 13, 2, 2, 4, 17, 23, 2, 15, 4, 0, 10, 0, {73,68,82}, 2, 0, 7, 6, 7, 1, 3, 3 }, // Sundanese/Latin/Indonesia
- { 273, 66, 230, 0, 0, 470, 470, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 0, 0, 955, 955, 955, 955, 83, 83, 0, 0, 742, 1026, 22, 119, 3377, 4, 0, 5518, 2031, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 59, 59, 59, 59, 13, 13, 2, 2, 5, 51, 23, 3, 20, 5, 0, 9, 8, {84,90,83}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Swahili/Latin/Tanzania
- { 273, 66, 57, 0, 0, 470, 470, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 0, 0, 955, 955, 955, 955, 83, 83, 0, 0, 742, 1026, 22, 3, 4896, 4, 0, 5518, 5527, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 59, 59, 59, 59, 13, 13, 2, 2, 5, 51, 23, 2, 16, 5, 0, 9, 32, {67,68,70}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Swahili/Latin/Congo Kinshasa
- { 273, 66, 124, 0, 0, 470, 470, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 0, 0, 955, 955, 955, 955, 83, 83, 0, 0, 742, 1026, 22, 175, 952, 4, 0, 5518, 1109, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 59, 59, 59, 59, 13, 13, 2, 2, 5, 51, 23, 3, 17, 5, 0, 9, 5, {75,69,83}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Swahili/Latin/Kenya
- { 273, 66, 243, 0, 0, 470, 470, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 0, 0, 955, 955, 955, 955, 83, 83, 0, 0, 742, 1026, 22, 149, 4912, 4, 0, 5518, 857, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 59, 59, 59, 59, 13, 13, 2, 2, 5, 51, 23, 3, 18, 5, 0, 9, 6, {85,71,88}, 0, 0, 1, 7, 7, 1, 3, 3 }, // Swahili/Latin/Uganda
- { 274, 66, 216, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 44, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 1, 0, 4, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {90,65,82}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Swati/Latin/South Africa
- { 275, 66, 225, 0, 0, 975, 975, 6, 1, 14, 2, 3, 40, 5, 52, 11, 11, 13, 13, 71, 44, 0, 0,18324,18324,18373,18373, 3959, 3959, 651, 676, 0, 5, 22, 161, 4930, 19, 0, 5559, 5566, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 16, 10, 10, 5, 49, 49, 28, 28, 13, 13, 2, 2, 4, 17, 23, 2, 12, 5, 0, 7, 7, {83,69,75}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Swedish/Latin/Sweden
- { 275, 66, 2, 0, 0, 975, 975, 6, 1, 14, 2, 3, 40, 5, 52, 11, 11, 13, 13, 71, 44, 0, 0,18324,18324,18373,18373, 3959, 3959, 651, 676, 0, 5, 22, 14, 420, 19, 0, 5559, 5573, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 16, 10, 10, 5, 49, 49, 28, 28, 13, 13, 2, 2, 4, 17, 23, 1, 4, 5, 0, 7, 5, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Swedish/Latin/Aland Islands
- { 275, 66, 83, 0, 0, 975, 975, 6, 1, 14, 2, 3, 40, 5, 52, 11, 11, 13, 13, 71, 44, 0, 0,18324,18324,18373,18373, 3959, 3959, 651, 676, 0, 5, 22, 14, 420, 19, 0, 5559, 1478, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 16, 10, 10, 5, 49, 49, 28, 28, 13, 13, 2, 2, 4, 17, 23, 1, 4, 5, 0, 7, 7, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Swedish/Latin/Finland
- { 276, 66, 226, 0, 0, 386, 386, 6, 0, 13, 2, 3, 40, 5, 9, 17, 18, 19, 20, 345, 184, 0, 0,18401,18401,18463,18463, 3667, 3667, 653, 678, 0, 5, 22, 216, 4942, 19, 0, 5578, 5578, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 10, 5, 62, 62, 27, 27, 13, 13, 12, 11, 4, 17, 23, 3, 16, 5, 0, 16, 7, {67,72,70}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Swiss German/Latin/Switzerland
- { 276, 66, 84, 0, 0, 386, 386, 6, 0, 13, 2, 3, 40, 5, 9, 17, 18, 19, 20, 345, 184, 0, 0,18401,18401,18463,18463, 3667, 3667, 653, 678, 0, 5, 22, 14, 73, 19, 0, 5578, 5594, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 10, 5, 62, 62, 27, 27, 13, 13, 12, 11, 4, 17, 23, 1, 4, 5, 0, 16, 10, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Swiss German/Latin/France
- { 276, 66, 136, 0, 0, 386, 386, 6, 0, 13, 2, 3, 40, 5, 9, 17, 18, 19, 20, 345, 184, 0, 0,18401,18401,18463,18463, 3667, 3667, 653, 678, 0, 5, 22, 216, 4942, 19, 0, 5578, 5604, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 10, 5, 62, 62, 27, 27, 13, 13, 12, 11, 4, 17, 23, 3, 16, 5, 0, 16, 13, {67,72,70}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Swiss German/Latin/Liechtenstein
- { 277, 123, 113, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 44, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 0, 0, 4, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 0, 0, {73,81,68}, 0, 0, 6, 5, 6, 1, 3, 3 }, // Syriac/Syriac/Iraq
- { 278, 135, 159, 0, 0, 0, 0, 6, 1, 14, 2, 3, 4, 5, 9, 17, 18, 15, 11, 71, 87, 0, 0,18490,18490,18225,18225, 83, 83, 645, 668, 0, 5, 22, 0, 4867, 0, 0, 5617, 5502, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 46, 46, 29, 29, 13, 13, 6, 8, 4, 17, 23, 0, 14, 4, 0, 7, 6, {77,65,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Tachelhit/Tifinagh/Morocco
- { 278, 66, 159, 0, 0, 0, 0, 6, 1, 14, 2, 3, 4, 5, 9, 17, 18, 15, 11, 71, 87, 0, 0,18536,18536,18583,18583, 83, 83, 665, 689, 0, 5, 22, 0, 4958, 0, 0, 5624, 5634, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 47, 47, 29, 29, 13, 13, 6, 8, 4, 17, 23, 0, 14, 4, 0, 10, 6, {77,65,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Tachelhit/Latin/Morocco
- { 280, 127, 255, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 44, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 320, 0, 4, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {86,78,68}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Tai Dam/Tai Viet/Vietnam
- { 281, 66, 124, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 0, 0,18612,18612,18716,18716,18743,18743, 671, 697, 0, 5, 22, 175, 952, 9, 13, 5640, 1109, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5,104,104, 27, 27, 13, 13, 10, 10, 4, 17, 23, 3, 17, 4, 6, 7, 5, {75,69,83}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Taita/Latin/Kenya
- { 282, 27, 229, 0, 0, 0, 0, 6, 1, 14, 2, 3, 4, 5, 9, 10, 11, 12, 13, 618, 127, 0, 0,18756,18756,18810,18810,18837,18837, 0, 0, 0, 5, 22, 321, 4972, 19, 0, 5647, 5653, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 10, 5, 54, 54, 27, 27, 13, 13, 2, 2, 4, 17, 23, 4, 6, 5, 0, 6, 10, {84,74,83}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Tajik/Cyrillic/Tajikistan
- { 283, 129, 110, 0, 0, 984, 984, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 192, 87, 440, 352,18850,18850,18898,18898,18936,18936, 681, 707, 1077, 5, 22, 118, 4978, 9, 13, 5663, 5668, 6, 6, 13, 13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 12, 7, 48, 48, 38, 38, 19, 19, 8, 8, 7, 17, 23, 1, 13, 4, 6, 5, 7, {73,78,82}, 2, 1, 7, 7, 7, 1, 2, 3 }, // Tamil/Tamil/India
- { 283, 129, 143, 0, 0, 984, 984, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 192, 87, 440, 352,18850,18850,18898,18898,18936,18936, 681, 707, 1077, 5, 22, 187, 4991, 9, 13, 5663, 5675, 6, 6, 13, 13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 12, 7, 48, 48, 38, 38, 19, 19, 8, 8, 7, 17, 23, 2, 17, 4, 6, 5, 7, {77,89,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Tamil/Tamil/Malaysia
- { 283, 129, 210, 0, 0, 984, 984, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 192, 87, 440, 352,18850,18850,18898,18898,18936,18936, 681, 707, 1077, 5, 22, 2, 5008, 9, 13, 5663, 5682, 6, 6, 13, 13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 12, 7, 48, 48, 38, 38, 19, 19, 8, 8, 7, 17, 23, 1, 17, 4, 6, 5, 11, {83,71,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Tamil/Tamil/Singapore
- { 283, 129, 221, 0, 0, 984, 984, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 192, 87, 0, 0,18850,18850,18898,18898,18936,18936, 681, 707, 1077, 5, 22, 325, 5025, 9, 13, 5663, 5693, 6, 6, 13, 13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 10, 5, 48, 48, 38, 38, 19, 19, 8, 8, 7, 17, 23, 3, 13, 4, 6, 5, 6, {76,75,82}, 2, 1, 1, 6, 7, 1, 2, 3 }, // Tamil/Tamil/Sri Lanka
- { 284, 66, 228, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 44, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 328, 0, 4, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 0, 5, 0, 0, 0, {84,87,68}, 2, 0, 7, 6, 7, 1, 3, 3 }, // Taroko/Latin/Taiwan
- { 285, 66, 170, 0, 0, 0, 0, 6, 0, 14, 2, 3, 4, 5, 9, 10, 11, 12, 13, 71, 87, 0, 0, 9661, 9661, 9714, 9714, 9741, 9741, 689, 715, 0, 5, 22, 124, 3182, 0, 0, 5699, 5712, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 53, 53, 27, 27, 13, 13, 8, 10, 4, 17, 23, 5, 16, 4, 0, 13, 5, {88,79,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Tasawaq/Latin/Niger
- { 286, 27, 193, 0, 0, 997, 997, 6, 1, 14, 2, 3, 4, 5, 9, 10, 11, 12, 13, 1431, 560, 1, 1,18955,18955,19010,19010,19045,19045, 0, 0, 0, 5, 22, 130, 5038, 19, 0, 5717, 4885, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 10, 9, 4, 55, 55, 35, 35, 13, 13, 2, 2, 4, 17, 23, 1, 11, 5, 0, 5, 6, {82,85,66}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Tatar/Cyrillic/Russia
- { 287, 131, 110, 0, 0, 1006, 1006, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 1454, 432, 10, 22,19058,19058,19117,19117,19148,19148, 0, 0, 1084, 1091, 22, 118, 5049, 9, 13, 5722, 5728, 6, 6, 11, 11, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 12, 7, 59, 59, 31, 31, 17, 17, 2, 2, 7, 29, 23, 1, 14, 4, 6, 6, 8, {73,78,82}, 2, 1, 7, 7, 7, 1, 2, 3 }, // Telugu/Telugu/India
- { 288, 66, 243, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 0, 0,19165,19165,19233,19233,19260,19260, 697, 725, 0, 5, 22, 149, 5063, 9, 13, 5736, 857, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 68, 68, 27, 27, 13, 13, 9, 6, 4, 17, 23, 3, 21, 4, 6, 6, 6, {85,71,88}, 0, 0, 1, 7, 7, 1, 3, 3 }, // Teso/Latin/Uganda
- { 288, 66, 124, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 0, 0,19165,19165,19233,19233,19260,19260, 697, 725, 0, 5, 22, 175, 5084, 9, 13, 5736, 5742, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 68, 68, 27, 27, 13, 13, 9, 6, 4, 17, 23, 3, 20, 4, 6, 6, 5, {75,69,83}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Teso/Latin/Kenya
- { 289, 133, 231, 1017, 1017, 1022, 1030, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 1472, 87, 452, 0,19273,19273,19340,19340,19362,19362, 706, 731, 1120, 5, 22, 331, 5104, 9, 13, 5747, 5747, 5, 5, 8, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 6, 28, 5, 67, 67, 22, 22, 15, 15, 10, 10, 4, 17, 23, 1, 3, 4, 6, 3, 3, {84,72,66}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Thai/Thai/Thailand
- { 290, 134, 50, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 1491, 44, 0, 0,19377,19377,19455,19455,19505,19505, 716, 741, 0, 5, 22, 152, 5107, 4, 0, 5750, 5758, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 10, 10, 5, 78, 78, 50, 50, 26, 26, 7, 8, 4, 17, 23, 1, 6, 5, 0, 8, 6, {67,78,89}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Tibetan/Tibetan/China
- { 290, 134, 110, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 1491, 44, 10, 22,19377,19377,19455,19455,19505,19505, 716, 741, 0, 5, 22, 118, 5113, 4, 0, 5750, 5764, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 10, 12, 7, 78, 78, 50, 50, 26, 26, 7, 8, 4, 17, 23, 1, 12, 5, 0, 8, 7, {73,78,82}, 2, 1, 7, 7, 7, 1, 3, 3 }, // Tibetan/Tibetan/India
- { 291, 33, 74, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 44, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 0, 0, 4, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 0, 0, {69,82,78}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Tigre/Ethiopic/Eritrea
- { 292, 33, 77, 24, 24, 1037, 1037, 6, 0, 1, 2, 3, 4, 5, 9, 17, 18, 10, 11, 1514, 127, 10, 22,19531,19531,19559,19559,19579,19579, 723, 749, 0, 5, 22, 131, 102, 9, 0, 5771, 89, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 8, 12, 7, 28, 28, 20, 20, 13, 13, 4, 4, 4, 17, 23, 2, 2, 4, 0, 4, 5, {69,84,66}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Tigrinya/Ethiopic/Ethiopia
- { 292, 33, 74, 24, 24, 1037, 1037, 6, 0, 1, 2, 3, 4, 5, 9, 12, 13, 10, 11, 1514, 127, 10, 22,19531,19531,19559,19559,19579,19579, 723, 749, 0, 5, 22, 38, 5125, 9, 0, 5771, 5775, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 8, 12, 7, 28, 28, 20, 20, 13, 13, 4, 4, 4, 17, 23, 3, 3, 4, 0, 4, 4, {69,82,78}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Tigrinya/Ethiopic/Eritrea
- { 294, 66, 182, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 44, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 0, 0, 4, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 0, 0, {80,71,75}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Tok Pisin/Latin/Papua New Guinea
- { 295, 66, 235, 1044, 1044, 1044, 1044, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 71, 87, 10, 22,19592,19592,19651,19651,19679,19679, 727, 753, 1124, 1129, 1188, 198, 5128, 4, 0, 5779, 2046, 8, 8, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 6, 12, 7, 59, 59, 28, 28, 13, 13, 10, 6, 5, 59, 65, 2, 17, 5, 0, 13, 5, {84,79,80}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Tongan/Latin/Tonga
- { 296, 66, 216, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 44, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 1, 0, 4, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {90,65,82}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Tsonga/Latin/South Africa
- { 297, 66, 216, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 44, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 1, 0, 4, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {90,65,82}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Tswana/Latin/South Africa
- { 298, 66, 239, 0, 0, 1052, 1052, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 1531, 561, 0, 0,19692,19692,19745,19745,19772,19772, 737, 759, 185, 5, 22, 256, 5145, 9, 13, 5792, 5798, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 9, 10, 5, 53, 53, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 11, 4, 6, 6, 7, {84,82,89}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Turkish/Latin/Turkey
- { 298, 66, 63, 0, 0, 1052, 1052, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 1531, 561, 10, 22,19692,19692,19745,19745,19772,19772, 737, 759, 185, 5, 22, 14, 73, 9, 13, 5792, 5805, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 9, 12, 7, 53, 53, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 4, 4, 6, 6, 6, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Turkish/Latin/Cyprus
- { 299, 66, 240, 0, 0, 1060, 1060, 6, 1, 14, 2, 3, 4, 5, 9, 10, 11, 10, 11, 1531, 560, 0, 0,19785,19838,19891,19918,19945,19945, 739, 761, 1253, 5, 22, 332, 5156, 19, 0, 5811, 5823, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 53, 53, 27, 27, 13, 13, 13, 14, 4, 17, 23, 3, 14, 5, 0, 12, 12, {84,77,84}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Turkmen/Latin/Turkmenistan
- { 301, 66, 169, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 44, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 122, 0, 4, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {78,71,78}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Tyap/Latin/Nigeria
- { 303, 27, 244, 0, 0, 103, 103, 6, 1, 14, 2, 3, 4, 5, 77, 17, 18, 15, 10, 1547, 184, 0, 0,19958,19958, 2499, 2499,20013,20013, 752, 775, 1257, 834, 22, 297, 5170, 19, 0, 5835, 5845, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 22, 8, 10, 5, 55, 55, 20, 20, 13, 13, 2, 2, 5, 17, 23, 1, 17, 5, 0, 10, 7, {85,65,72}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Ukrainian/Cyrillic/Ukraine
- { 304, 66, 91, 0, 0, 224, 224, 6, 1, 0, 2, 3, 4, 5, 9, 15, 10, 16, 12, 345, 121, 1, 480,20026,20026,20078,20078,20105,20105, 367, 777, 1262, 5, 22, 14, 420, 19, 0, 5852, 5867, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 9, 12, 52, 52, 27, 27, 13, 13, 9, 9, 5, 17, 23, 1, 4, 5, 0, 15, 6, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Upper Sorbian/Latin/Germany
- { 305, 4, 178, 802, 802, 1068, 1078, 6, 0, 1, 2, 3, 35, 37, 9, 11, 10, 13, 12, 1569, 87, 10, 22,20118,20118,20118,20118, 83, 83, 0, 0, 1267, 1271, 22, 189, 5187, 9, 13, 5873, 4581, 6, 6, 10, 9, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 18, 6, 12, 7, 35, 35, 35, 35, 13, 13, 2, 2, 4, 20, 23, 2, 14, 4, 6, 4, 7, {80,75,82}, 2, 0, 7, 6, 7, 1, 3, 3 }, // Urdu/Arabic/Pakistan
- { 305, 4, 110, 802, 802, 1068, 1078, 6, 21, 22, 2, 61, 35, 62, 65, 11, 10, 13, 12, 1569, 87, 10, 22,20118,20118,20118,20118, 83, 83, 0, 0, 1267, 1271, 22, 118, 5201, 9, 13, 5873, 5877, 6, 6, 10, 9, 1, 1, 1, 1, 1, 3, 3, 4, 1, 1, 1, 1, 18, 6, 12, 7, 35, 35, 35, 35, 13, 13, 2, 2, 4, 20, 23, 1, 12, 4, 6, 4, 5, {73,78,82}, 2, 1, 7, 7, 7, 1, 3, 3 }, // Urdu/Arabic/India
- { 306, 4, 50, 0, 0, 265, 275, 6, 0, 1, 2, 3, 4, 5, 9, 18, 17, 20, 19, 1587, 44, 0, 0,20153,20153,20207,20207,20227,20227, 754, 786, 0, 5, 22, 144, 5213, 9, 13, 5882, 5890, 6, 6, 10, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 54, 54, 20, 20, 13, 13, 12, 12, 4, 17, 23, 1, 11, 4, 6, 8, 5, {67,78,89}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Uyghur/Arabic/China
- { 307, 66, 251, 0, 0, 1087, 1087, 6, 1, 14, 2, 3, 4, 5, 9, 10, 11, 13, 12, 1604, 127, 55, 0,20240,20240,20300,20300,20331,20331, 325, 798, 185, 5, 22, 335, 5224, 19, 0, 5895, 5901, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 11, 5, 60, 60, 31, 31, 13, 13, 2, 2, 4, 17, 23, 4, 17, 5, 0, 6, 11, {85,90,83}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Uzbek/Latin/Uzbekistan
- { 307, 4, 1, 0, 0, 0, 0, 53, 21, 22, 23, 61, 35, 62, 65, 10, 11, 12, 13, 1622, 454, 55, 1,14977,14977,20344,20344, 83, 83, 0, 0, 0, 5, 22, 281, 3770, 19, 0, 5912, 4572, 6, 6, 6, 6, 1, 1, 1, 1, 1, 3, 3, 4, 1, 1, 1, 1, 33, 8, 11, 4, 48, 48, 20, 20, 13, 13, 2, 2, 4, 17, 23, 1, 6, 5, 0, 6, 9, {65,70,78}, 0, 0, 6, 4, 5, 1, 3, 3 }, // Uzbek/Arabic/Afghanistan
- { 307, 27, 251, 0, 0, 0, 0, 6, 1, 14, 2, 3, 4, 5, 9, 10, 11, 12, 13, 795, 127, 54, 0,20364,20364,20416,20416,20443,20443, 766, 800, 0, 5, 22, 339, 5241, 19, 0, 5918, 5925, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 8, 12, 5, 52, 52, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 14, 5, 0, 7, 10, {85,90,83}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Uzbek/Cyrillic/Uzbekistan
- { 308, 139, 134, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 10, 22,20456,20456,20456,20456, 83, 83, 0, 0, 0, 5, 22, 2, 5255, 9, 13, 5935, 5937, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 29, 29, 29, 29, 13, 13, 2, 2, 4, 17, 23, 1, 8, 4, 6, 2, 4, {76,82,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Vai/Vai/Liberia
- { 308, 66, 134, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 10, 22,20485,20485,20485,20485, 83, 83, 0, 0, 0, 5, 22, 2, 5263, 9, 13, 5941, 5944, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 47, 47, 47, 47, 13, 13, 2, 2, 4, 17, 23, 1, 13, 4, 6, 3, 8, {76,82,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Vai/Latin/Liberia
- { 309, 66, 216, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 44, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 1, 0, 4, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {90,65,82}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Venda/Latin/South Africa
- { 310, 66, 255, 0, 0, 1095, 1095, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 192, 127, 0, 0,20532,20532,20586,20586,20618,20618, 768, 802, 0, 5, 22, 320, 5276, 19, 0, 5952, 5962, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 10, 10, 5, 54, 54, 32, 32, 20, 20, 2, 2, 4, 17, 23, 1, 13, 5, 0, 10, 8, {86,78,68}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Vietnamese/Latin/Vietnam
- { 311, 66, 258, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 44, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 0, 0, 4, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 0, 0, {0,0,0}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Volapuk/Latin/World
- { 312, 66, 230, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 0, 0,11659,11659,11720,11720, 1041, 1041, 398, 414, 0, 5, 22, 119, 3377, 9, 0, 5970, 2031, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 61, 61, 27, 27, 13, 13, 5, 9, 4, 17, 23, 3, 20, 4, 0, 8, 8, {84,90,83}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Vunjo/Latin/Tanzania
- { 313, 66, 23, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 44, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 14, 0, 4, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Walloon/Latin/Belgium
- { 314, 66, 226, 0, 0, 386, 386, 6, 1, 13, 2, 3, 4, 5, 9, 17, 18, 19, 20, 345, 44, 0, 0,20638,20638,20690,20690,20717,20717, 0, 0, 0, 5, 22, 0, 0, 4, 0, 5978, 5984, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 10, 10, 5, 52, 52, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 6, 6, {67,72,70}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Walser/Latin/Switzerland
- { 315, 66, 15, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 44, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 246, 0, 4, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 2, 0, 5, 0, 0, 0, {65,85,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Warlpiri/Latin/Australia
- { 316, 66, 246, 0, 0, 1103, 1114, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 0, 0,20730,20730,20806,20834,20863,20863, 770, 804, 1291, 5, 22, 92, 5289, 9, 13, 5990, 5997, 6, 6, 11, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 8, 10, 5, 76, 76, 28, 29, 14, 14, 2, 2, 7, 17, 23, 1, 12, 4, 6, 7, 16, {71,66,80}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Welsh/Latin/United Kingdom
- { 317, 4, 178, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 44, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 189, 0, 4, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 2, 0, 5, 0, 0, 0, {80,75,82}, 2, 0, 7, 6, 7, 1, 3, 3 }, // Western Balochi/Arabic/Pakistan
- { 318, 66, 165, 0, 0, 7, 7, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 71, 432, 0, 0,20877,20877,20930,20930, 83, 83, 0, 0, 0, 5, 22, 14, 73, 4, 37, 6013, 6018, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 53, 53, 20, 20, 13, 13, 2, 2, 4, 17, 23, 1, 4, 5, 7, 5, 8, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Western Frisian/Latin/Netherlands
- { 319, 33, 77, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 44, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 0, 0, 4, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 0, 0, {69,84,66}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Wolaytta/Ethiopic/Ethiopia
- { 320, 66, 206, 0, 0, 0, 0, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 1655, 432, 0, 0,20950,20950,20999,20999,20999,20999, 689, 806, 0, 5, 22, 124, 5301, 4, 0, 6026, 2738, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 49, 49, 27, 27, 27, 27, 3, 3, 4, 17, 23, 5, 29, 5, 0, 5, 8, {88,79,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Wolof/Latin/Senegal
- { 321, 66, 216, 0, 0, 0, 0, 6, 0, 14, 2, 3, 4, 5, 9, 12, 13, 10, 11, 27, 44, 0, 0,21026,21026,21086,21086, 83, 83, 0, 0, 0, 5, 22, 1, 5330, 9, 0, 6031, 6039, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 60, 60, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 24, 4, 0, 8, 15, {90,65,82}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Xhosa/Latin/South Africa
- { 322, 66, 40, 0, 0, 0, 0, 6, 1, 14, 2, 3, 4, 5, 9, 17, 18, 17, 18, 71, 87, 0, 0,21113,21113,21183,21183,21203,21203, 772, 809, 0, 5, 22, 3, 0, 19, 24, 6054, 6060, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 70, 70, 20, 20, 13, 13, 8, 8, 4, 17, 23, 4, 0, 5, 7, 6, 7, {88,65,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Yangben/Latin/Cameroon
- { 323, 47, 258, 0, 0, 1124, 1124, 6, 0, 1, 2, 3, 4, 5, 9, 11, 11, 13, 13, 1672, 127, 0, 0,21216,21216,21216,21216, 83, 83, 780, 817, 0, 5, 22, 0, 0, 4, 0, 6067, 6073, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 8, 10, 5, 53, 53, 53, 53, 13, 13, 11, 10, 4, 17, 23, 0, 0, 5, 0, 6, 5, {0,0,0}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Yiddish/Hebrew/World
- { 324, 66, 169, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 1691, 87, 0, 1,21269,21312,21380,21380,21412,21412, 791, 827, 1298, 1309, 22, 122, 5354, 9, 13, 6078, 6088, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 3, 43, 68, 32, 32, 13, 13, 5, 5, 11, 37, 23, 1, 14, 4, 6, 10, 8, {78,71,78}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Yoruba/Latin/Nigeria
- { 324, 66, 25, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 1691, 87, 0, 1,21425,21468,21536,21536,21568,21568, 796, 832, 1346, 1309, 22, 124, 5368, 9, 13, 6078, 6096, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 3, 43, 68, 32, 32, 13, 13, 5, 5, 11, 37, 23, 5, 26, 4, 6, 10, 6, {88,79,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Yoruba/Latin/Benin
- { 325, 66, 170, 0, 0, 0, 0, 6, 0, 14, 2, 3, 4, 5, 9, 10, 11, 12, 13, 71, 87, 0, 0,21581,21581, 9714, 9714,21633,21633, 689, 715, 0, 5, 22, 124, 3182, 0, 0, 6102, 5712, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 52, 52, 27, 27, 13, 13, 8, 10, 4, 17, 23, 5, 16, 4, 0, 10, 5, {88,79,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Zarma/Latin/Niger
- { 327, 66, 216, 0, 0, 1133, 1142, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 321, 339, 0, 0,21646,21646,21719,21719,21746,21746, 0, 0, 0, 5, 22, 1, 5394, 9, 13, 6112, 6119, 6, 6, 9, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 10, 5, 73, 73, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 20, 4, 6, 7, 17, {90,65,82}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Zulu/Latin/South Africa
- { 328, 66, 32, 0, 0, 1150, 1150, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 1707, 127, 0, 0,21759,21759,21845,21845,21879,21879, 0, 0, 1357, 5, 22, 1, 5414, 4, 0, 6136, 6143, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 10, 10, 5, 86, 86, 34, 34, 20, 20, 2, 2, 7, 17, 23, 2, 12, 5, 0, 7, 6, {66,82,76}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Kaingang/Latin/Brazil
- { 329, 66, 32, 0, 0, 1159, 1159, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 0, 0,21899,21899,21963,21963,21990,21990, 0, 0, 1364, 5, 22, 1, 5426, 4, 0, 6149, 6157, 6, 6, 10, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 64, 64, 27, 27, 13, 13, 2, 2, 8, 17, 23, 2, 15, 5, 0, 8, 6, {66,82,76}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Nheengatu/Latin/Brazil
- { 329, 66, 54, 0, 0, 1159, 1159, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 10, 22,21899,21899,21963,21963,21990,21990, 129, 124, 1364, 5, 22, 2, 5441, 4, 0, 6163, 6170, 6, 6, 10, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 64, 64, 27, 27, 13, 13, 5, 5, 8, 17, 23, 1, 17, 5, 0, 7, 8, {67,79,80}, 2, 0, 7, 6, 7, 1, 3, 3 }, // Nheengatu/Latin/Colombia
- { 329, 66, 254, 0, 0, 1159, 1159, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 127, 10, 22,21899,21899,21963,21963,21990,21990, 129, 124, 1364, 5, 22, 316, 5458, 4, 0, 6163, 6178, 6, 6, 10, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 64, 64, 27, 27, 13, 13, 5, 5, 8, 17, 23, 4, 22, 5, 0, 7, 9, {86,69,83}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Nheengatu/Latin/Venezuela
+ { 2, 27, 90, 0, 0, 7, 7, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 13, 14, 27, 49, 10, 0, 109, 109, 157, 157, 179, 179, 0, 0, 0, 5, 22, 0, 0, 4, 0, 0, 6, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 22, 10, 13, 5, 48, 48, 22, 22, 15, 15, 2, 2, 4, 17, 23, 1, 0, 5, 0, 6, 9, {71,69,76}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Abkhazian/Cyrillic/Georgia
+ { 3, 66, 77, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 59, 78, 23, 38, 194, 194, 245, 245, 272, 272, 0, 0, 0, 5, 22, 1, 0, 2, 0, 15, 20, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 8, 15, 7, 51, 51, 27, 27, 13, 13, 2, 2, 4, 17, 23, 2, 0, 4, 0, 5, 7, {69,84,66}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Afar/Latin/Ethiopia
+ { 3, 66, 67, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 59, 78, 23, 38, 194, 194, 245, 245, 272, 272, 0, 0, 0, 5, 22, 3, 0, 2, 0, 15, 27, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 8, 15, 7, 51, 51, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 0, 4, 0, 5, 7, {68,74,70}, 0, 0, 6, 6, 7, 1, 3, 3 }, // Afar/Latin/Djibouti
+ { 3, 66, 74, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 59, 78, 23, 38, 194, 194, 245, 245, 272, 272, 0, 0, 0, 5, 22, 6, 0, 2, 0, 15, 34, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 8, 15, 7, 51, 51, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 0, 4, 0, 5, 7, {69,82,78}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Afar/Latin/Eritrea
+ { 4, 66, 216, 0, 0, 16, 16, 6, 1, 9, 2, 3, 4, 5, 10, 14, 15, 16, 17, 86, 103, 10, 0, 285, 285, 342, 342, 369, 369, 2, 2, 45, 5, 22, 9, 0, 2, 9, 41, 50, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 57, 57, 27, 27, 13, 13, 3, 3, 5, 17, 23, 1, 20, 4, 6, 9, 11, {90,65,82}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Afrikaans/Latin/South Africa
+ { 4, 66, 162, 0, 0, 16, 16, 6, 1, 9, 2, 3, 4, 5, 10, 14, 15, 16, 17, 113, 103, 23, 38, 285, 285, 342, 342, 369, 369, 2, 2, 45, 5, 22, 10, 20, 2, 9, 41, 61, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 15, 7, 57, 57, 27, 27, 13, 13, 3, 3, 5, 17, 23, 1, 16, 4, 6, 9, 7, {78,65,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Afrikaans/Latin/Namibia
+ { 5, 66, 40, 0, 0, 0, 0, 6, 1, 9, 2, 3, 4, 5, 10, 13, 15, 18, 17, 113, 129, 10, 0, 382, 382, 453, 453, 480, 480, 5, 5, 0, 5, 22, 11, 36, 0, 0, 68, 73, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 13, 5, 71, 71, 27, 27, 13, 13, 3, 3, 4, 17, 23, 4, 14, 4, 0, 5, 7, {88,65,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Aghem/Latin/Cameroon
+ { 6, 66, 92, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 137, 155, 23, 38, 493, 493, 541, 541, 568, 568, 8, 8, 0, 5, 22, 15, 50, 2, 0, 80, 84, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 15, 7, 48, 48, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 10, 4, 0, 4, 5, {71,72,83}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Akan/Latin/Ghana
+ { 8, 66, 40, 0, 0, 24, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 163, 103, 10, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 11, 60, 15, 0, 89, 95, 6, 6, 5, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 4, 10, 5, 0, 6, 7, {88,65,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Akoose/Latin/Cameroon
+ { 9, 66, 3, 0, 0, 29, 29, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 14, 15, 0, 180, 45, 38, 581, 581, 638, 638, 665, 665, 10, 10, 50, 5, 22, 18, 70, 4, 20, 102, 107, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 16, 7, 57, 57, 27, 27, 14, 14, 11, 10, 4, 17, 23, 4, 13, 5, 7, 5, 8, {65,76,76}, 0, 0, 1, 6, 7, 2, 3, 3 }, // Albanian/Latin/Albania
+ { 9, 66, 126, 0, 0, 29, 29, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 14, 15, 0, 180, 10, 0, 581, 581, 638, 638, 665, 665, 10, 10, 50, 5, 22, 22, 83, 4, 20, 102, 115, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 13, 5, 57, 57, 27, 27, 14, 14, 11, 10, 4, 17, 23, 1, 6, 5, 7, 5, 6, {69,85,82}, 2, 1, 1, 6, 7, 2, 3, 3 }, // Albanian/Latin/Kosovo
+ { 9, 66, 140, 0, 0, 29, 29, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 14, 15, 0, 180, 10, 0, 581, 581, 638, 638, 665, 665, 10, 10, 50, 5, 22, 23, 89, 4, 20, 102, 121, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 13, 5, 57, 57, 27, 27, 14, 14, 11, 10, 4, 17, 23, 3, 16, 5, 7, 5, 18, {77,75,68}, 2, 1, 1, 6, 7, 2, 3, 3 }, // Albanian/Latin/Macedonia
+ { 11, 33, 77, 38, 38, 44, 53, 6, 0, 1, 2, 3, 4, 5, 10, 11, 12, 19, 20, 163, 186, 61, 76, 679, 679, 706, 706, 732, 732, 21, 20, 54, 57, 22, 26, 105, 2, 9, 139, 143, 6, 6, 9, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 27, 27, 26, 26, 13, 13, 3, 4, 3, 23, 23, 2, 9, 4, 6, 4, 5, {69,84,66}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Amharic/Ethiopic/Ethiopia
+ { 14, 4, 71, 61, 61, 61, 61, 67, 21, 22, 23, 25, 26, 28, 30, 15, 14, 17, 16, 196, 213, 61, 76, 745, 745, 745, 745, 796, 796, 24, 24, 80, 84, 22, 28, 114, 27, 0, 148, 155, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 15, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 5, 9, 6, 0, 7, 3, {69,71,80}, 2, 1, 6, 5, 6, 1, 3, 3 }, // Arabic/Arabic/Egypt
+ { 14, 4, 4, 61, 61, 61, 61, 6, 1, 0, 32, 3, 35, 37, 10, 15, 14, 17, 16, 196, 213, 61, 76, 745, 745, 745, 745, 796, 796, 24, 24, 80, 84, 22, 33, 123, 33, 38, 148, 158, 6, 6, 6, 6, 1, 1, 1, 3, 1, 2, 2, 1, 1, 1, 1, 1, 17, 10, 15, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 5, 12, 5, 7, 7, 7, {68,90,68}, 2, 1, 6, 5, 6, 1, 3, 3 }, // Arabic/Arabic/Algeria
+ { 14, 4, 19, 61, 61, 61, 61, 67, 21, 22, 23, 25, 26, 28, 30, 15, 14, 17, 16, 196, 213, 61, 76, 745, 745, 745, 745, 796, 796, 24, 24, 80, 84, 22, 38, 135, 27, 0, 148, 165, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 15, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 5, 12, 6, 0, 7, 7, {66,72,68}, 3, 0, 6, 5, 6, 1, 3, 3 }, // Arabic/Arabic/Bahrain
+ { 14, 4, 48, 61, 61, 61, 61, 67, 21, 22, 23, 25, 26, 28, 30, 15, 14, 17, 16, 196, 213, 61, 76, 745, 745, 745, 745, 796, 796, 24, 24, 80, 84, 22, 11, 147, 27, 0, 148, 172, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 15, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 4, 15, 6, 0, 7, 4, {88,65,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Arabic/Arabic/Chad
+ { 14, 4, 55, 61, 61, 61, 61, 67, 21, 22, 23, 25, 26, 28, 30, 15, 14, 17, 16, 196, 213, 10, 0, 745, 745, 745, 745, 796, 796, 24, 24, 80, 84, 22, 12, 162, 27, 0, 148, 176, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 13, 5, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 2, 14, 6, 0, 7, 9, {75,77,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Arabic/Arabic/Comoros
+ { 14, 4, 67, 61, 61, 61, 61, 67, 21, 22, 23, 25, 26, 28, 30, 15, 14, 17, 16, 196, 213, 61, 76, 745, 745, 745, 745, 796, 796, 24, 24, 80, 84, 22, 3, 176, 27, 0, 148, 185, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 15, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 3, 11, 6, 0, 7, 6, {68,74,70}, 0, 0, 6, 6, 7, 1, 3, 3 }, // Arabic/Arabic/Djibouti
+ { 14, 4, 74, 61, 61, 61, 61, 67, 21, 22, 23, 25, 26, 28, 30, 15, 14, 17, 16, 196, 213, 61, 76, 745, 745, 745, 745, 796, 796, 24, 24, 80, 84, 22, 6, 187, 27, 0, 148, 191, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 15, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 3, 12, 6, 0, 7, 7, {69,82,78}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Arabic/Arabic/Eritrea
+ { 14, 4, 113, 61, 61, 61, 61, 67, 21, 22, 23, 25, 26, 28, 30, 15, 14, 17, 16, 196, 213, 61, 76, 745, 745, 745, 745, 796, 796, 24, 24, 80, 84, 22, 43, 199, 27, 0, 148, 198, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 15, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 5, 11, 6, 0, 7, 6, {73,81,68}, 0, 0, 6, 5, 6, 1, 3, 3 }, // Arabic/Arabic/Iraq
+ { 14, 4, 116, 61, 61, 61, 61, 67, 21, 22, 23, 25, 26, 28, 30, 15, 14, 17, 16, 196, 213, 11, 1, 745, 745, 745, 745, 796, 796, 24, 24, 80, 84, 22, 48, 210, 27, 0, 148, 204, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 12, 4, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 1, 18, 6, 0, 7, 7, {73,76,83}, 2, 1, 7, 5, 6, 1, 3, 3 }, // Arabic/Arabic/Israel
+ { 14, 4, 122, 61, 61, 61, 61, 67, 21, 22, 23, 25, 26, 28, 30, 15, 14, 17, 16, 196, 213, 61, 76, 745, 745, 745, 745, 796, 796, 24, 24, 80, 84, 22, 49, 228, 27, 0, 148, 211, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 15, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 5, 11, 6, 0, 7, 6, {74,79,68}, 3, 0, 6, 5, 6, 1, 3, 3 }, // Arabic/Arabic/Jordan
+ { 14, 4, 127, 61, 61, 61, 61, 67, 21, 22, 23, 25, 26, 28, 30, 15, 14, 17, 16, 196, 213, 61, 76, 745, 745, 745, 745, 796, 796, 24, 24, 80, 84, 22, 54, 239, 27, 0, 148, 217, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 15, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 5, 11, 6, 0, 7, 6, {75,87,68}, 3, 0, 6, 5, 6, 1, 3, 3 }, // Arabic/Arabic/Kuwait
+ { 14, 4, 132, 61, 61, 61, 61, 67, 21, 22, 23, 25, 26, 28, 30, 15, 14, 17, 16, 196, 213, 61, 76, 745, 745, 745, 745, 796, 796, 24, 24, 80, 84, 22, 59, 250, 27, 0, 148, 223, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 15, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 5, 11, 6, 0, 7, 5, {76,66,80}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Arabic/Arabic/Lebanon
+ { 14, 4, 135, 61, 61, 61, 61, 6, 1, 0, 32, 3, 35, 37, 10, 15, 14, 17, 16, 196, 213, 61, 76, 745, 745, 745, 745, 796, 796, 24, 24, 80, 84, 22, 64, 261, 33, 38, 148, 228, 6, 6, 6, 6, 1, 1, 1, 3, 1, 2, 2, 1, 1, 1, 1, 1, 17, 10, 15, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 5, 10, 5, 7, 7, 5, {76,89,68}, 3, 0, 6, 5, 6, 1, 3, 3 }, // Arabic/Arabic/Libya
+ { 14, 4, 149, 61, 61, 61, 61, 67, 21, 22, 23, 25, 26, 28, 30, 15, 14, 17, 16, 196, 213, 61, 76, 745, 745, 745, 745, 796, 796, 24, 24, 80, 84, 22, 69, 271, 27, 0, 148, 233, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 15, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 4, 15, 6, 0, 7, 9, {77,82,85}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Arabic/Arabic/Mauritania
+ { 14, 4, 159, 61, 61, 61, 61, 6, 1, 0, 32, 3, 35, 37, 10, 15, 14, 17, 16, 196, 213, 10, 0, 745, 745, 745, 745, 796, 796, 24, 24, 80, 84, 22, 73, 286, 33, 38, 148, 242, 6, 6, 6, 6, 1, 1, 1, 3, 1, 2, 2, 1, 1, 1, 1, 1, 17, 10, 13, 5, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 5, 10, 5, 7, 7, 6, {77,65,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Arabic/Arabic/Morocco
+ { 14, 4, 176, 61, 61, 61, 61, 67, 21, 22, 23, 25, 26, 28, 30, 15, 14, 17, 16, 196, 213, 61, 76, 745, 745, 745, 745, 796, 796, 24, 24, 80, 84, 22, 78, 296, 27, 0, 148, 248, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 15, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 5, 10, 6, 0, 7, 5, {79,77,82}, 3, 0, 6, 5, 6, 1, 3, 3 }, // Arabic/Arabic/Oman
+ { 14, 4, 180, 61, 61, 61, 61, 67, 21, 22, 23, 25, 26, 28, 30, 15, 14, 17, 16, 196, 213, 61, 76, 745, 745, 745, 745, 796, 796, 24, 24, 80, 84, 22, 48, 210, 27, 0, 148, 253, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 15, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 1, 18, 6, 0, 7, 18, {73,76,83}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Arabic/Arabic/Palestinian Territories
+ { 14, 4, 190, 61, 61, 61, 61, 67, 21, 22, 23, 25, 26, 28, 30, 15, 14, 17, 16, 196, 213, 61, 76, 745, 745, 745, 745, 796, 796, 24, 24, 80, 84, 22, 83, 306, 27, 0, 148, 271, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 15, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 5, 9, 6, 0, 7, 3, {81,65,82}, 2, 1, 6, 5, 6, 1, 3, 3 }, // Arabic/Arabic/Qatar
+ { 14, 4, 205, 61, 61, 61, 61, 67, 21, 22, 23, 25, 26, 28, 30, 15, 14, 17, 16, 196, 213, 61, 76, 745, 745, 745, 745, 796, 796, 24, 24, 80, 84, 22, 88, 315, 27, 0, 148, 274, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 15, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 5, 10, 6, 0, 7, 24, {83,65,82}, 2, 1, 7, 5, 6, 1, 3, 3 }, // Arabic/Arabic/Saudi Arabia
+ { 14, 4, 215, 61, 61, 61, 61, 67, 21, 22, 23, 25, 26, 28, 30, 15, 14, 17, 16, 196, 213, 61, 76, 745, 745, 745, 745, 796, 796, 24, 24, 80, 84, 22, 93, 325, 27, 0, 148, 298, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 15, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 1, 10, 6, 0, 7, 7, {83,79,83}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Arabic/Arabic/Somalia
+ { 14, 4, 219, 61, 61, 61, 61, 67, 21, 22, 23, 25, 26, 28, 30, 15, 14, 17, 16, 196, 213, 61, 76, 745, 745, 745, 745, 796, 796, 24, 24, 80, 84, 22, 94, 335, 27, 0, 148, 305, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 15, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 1, 17, 6, 0, 7, 12, {83,83,80}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Arabic/Arabic/South Sudan
+ { 14, 4, 222, 61, 61, 61, 61, 67, 21, 22, 23, 25, 26, 28, 30, 15, 14, 17, 16, 196, 213, 61, 76, 745, 745, 745, 745, 796, 796, 24, 24, 80, 84, 22, 95, 352, 27, 0, 148, 317, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 15, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 4, 11, 6, 0, 7, 7, {83,68,71}, 2, 1, 6, 5, 6, 1, 3, 3 }, // Arabic/Arabic/Sudan
+ { 14, 4, 227, 61, 61, 61, 61, 67, 21, 22, 23, 25, 26, 28, 30, 15, 14, 17, 16, 196, 213, 61, 76, 745, 745, 745, 745, 796, 796, 24, 24, 80, 84, 22, 99, 363, 27, 0, 148, 324, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 15, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 5, 10, 6, 0, 7, 5, {83,89,80}, 0, 0, 6, 5, 6, 1, 3, 3 }, // Arabic/Arabic/Syria
+ { 14, 4, 238, 61, 61, 61, 61, 6, 1, 0, 32, 3, 35, 37, 10, 15, 14, 17, 16, 196, 213, 61, 76, 745, 745, 745, 745, 796, 796, 24, 24, 80, 84, 22, 104, 373, 33, 38, 148, 329, 6, 6, 6, 6, 1, 1, 1, 3, 1, 2, 2, 1, 1, 1, 1, 1, 17, 10, 15, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 5, 11, 5, 7, 7, 4, {84,78,68}, 3, 0, 1, 6, 7, 1, 3, 3 }, // Arabic/Arabic/Tunisia
+ { 14, 4, 245, 61, 61, 61, 61, 6, 0, 1, 32, 3, 35, 37, 10, 15, 14, 17, 16, 196, 213, 61, 76, 745, 745, 745, 745, 796, 796, 24, 24, 80, 84, 22, 109, 384, 33, 38, 148, 333, 6, 6, 6, 6, 1, 1, 1, 3, 1, 2, 2, 1, 1, 1, 1, 1, 17, 10, 15, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 5, 12, 5, 7, 7, 24, {65,69,68}, 2, 1, 6, 6, 7, 1, 3, 3 }, // Arabic/Arabic/United Arab Emirates
+ { 14, 4, 257, 61, 61, 61, 61, 6, 0, 1, 32, 3, 35, 37, 10, 15, 14, 17, 16, 196, 213, 61, 76, 745, 745, 745, 745, 796, 796, 24, 24, 80, 84, 22, 73, 286, 33, 38, 148, 357, 6, 6, 6, 6, 1, 1, 1, 3, 1, 2, 2, 1, 1, 1, 1, 1, 17, 10, 15, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 5, 10, 5, 7, 7, 15, {77,65,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Arabic/Arabic/Western Sahara
+ { 14, 4, 258, 61, 61, 61, 61, 67, 21, 22, 23, 25, 26, 28, 30, 15, 14, 17, 16, 196, 213, 61, 76, 745, 745, 745, 745, 796, 796, 24, 24, 80, 84, 22, 0, 0, 27, 0, 372, 394, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 15, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 0, 0, 6, 0, 22, 6, {0,0,0}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Arabic/Arabic/world
+ { 14, 4, 259, 61, 61, 61, 61, 67, 21, 22, 23, 25, 26, 28, 30, 15, 14, 17, 16, 196, 213, 61, 76, 745, 745, 745, 745, 796, 796, 24, 24, 80, 84, 22, 114, 396, 27, 0, 148, 400, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 15, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 37, 23, 5, 9, 6, 0, 7, 5, {89,69,82}, 0, 0, 7, 5, 6, 1, 3, 3 }, // Arabic/Arabic/Yemen
+ { 15, 66, 220, 0, 0, 68, 68, 6, 1, 0, 2, 3, 4, 5, 10, 11, 12, 15, 15, 223, 129, 11, 1, 809, 809, 860, 860, 887, 887, 0, 0, 0, 5, 22, 22, 405, 2, 9, 405, 413, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 22, 6, 12, 4, 51, 51, 27, 27, 16, 16, 2, 2, 4, 17, 23, 1, 4, 4, 6, 8, 7, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Aragonese/Latin/Spain
+ { 17, 5, 12, 0, 0, 75, 75, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 11, 12, 245, 49, 10, 0, 903, 903, 964, 964, 991, 991, 0, 0, 121, 127, 22, 119, 409, 4, 0, 420, 427, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 20, 8, 13, 5, 61, 61, 27, 27, 13, 13, 2, 2, 6, 17, 23, 1, 13, 5, 0, 7, 8, {65,77,68}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Armenian/Armenian/Armenia
+ { 18, 9, 110, 0, 0, 82, 82, 6, 0, 1, 2, 39, 4, 5, 10, 14, 15, 16, 17, 265, 283, 83, 83, 1004, 1004, 1061, 1061, 1092, 1092, 25, 25, 144, 148, 22, 120, 422, 2, 9, 435, 442, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 15, 7, 57, 57, 31, 31, 13, 13, 9, 7, 4, 37, 23, 1, 12, 4, 6, 7, 4, {73,78,82}, 2, 1, 7, 7, 7, 1, 2, 3 }, // Assamese/Bangla/India
+ { 19, 66, 220, 0, 0, 68, 68, 6, 1, 0, 2, 3, 4, 5, 10, 11, 12, 14, 15, 223, 129, 10, 0, 1105, 1105, 1158, 1158, 1185, 1185, 34, 32, 0, 5, 22, 22, 405, 4, 0, 446, 455, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 22, 6, 13, 5, 53, 53, 27, 27, 13, 13, 12, 11, 5, 17, 23, 1, 4, 5, 0, 9, 6, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Asturian/Latin/Spain
+ { 20, 66, 230, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 1198, 1198, 1257, 1257, 1284, 1284, 46, 43, 0, 5, 22, 121, 434, 4, 0, 461, 467, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 59, 59, 27, 27, 13, 13, 9, 8, 4, 17, 23, 3, 21, 5, 0, 6, 8, {84,90,83}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Asu/Latin/Tanzania
+ { 21, 66, 169, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 137, 155, 10, 0, 1297, 1297, 1383, 1383, 83, 83, 0, 0, 0, 5, 22, 124, 455, 15, 0, 475, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 13, 5, 86, 86, 33, 33, 13, 13, 2, 2, 4, 17, 23, 1, 4, 5, 0, 5, 0, {78,71,78}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Atsam/Latin/Nigeria
+ { 25, 66, 17, 0, 0, 91, 91, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 291, 49, 10, 0, 1416, 1416, 1482, 1508, 96, 96, 0, 0, 185, 5, 22, 125, 459, 4, 0, 480, 490, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 8, 13, 5, 66, 66, 26, 26, 13, 13, 2, 2, 4, 17, 23, 1, 17, 5, 0, 10, 10, {65,90,78}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Azerbaijani/Latin/Azerbaijan
+ { 25, 4, 112, 0, 0, 0, 0, 67, 21, 22, 23, 40, 35, 41, 44, 11, 12, 19, 20, 163, 103, 10, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 0, 0, 15, 0, 500, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 3, 3, 4, 1, 1, 1, 1, 17, 10, 13, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 6, 0, {73,82,82}, 0, 0, 6, 5, 5, 1, 3, 3 }, // Azerbaijani/Arabic/Iran
+ { 25, 4, 113, 0, 0, 0, 0, 67, 21, 22, 23, 40, 35, 41, 44, 11, 12, 19, 20, 163, 103, 10, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 0, 0, 15, 0, 500, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 3, 3, 4, 1, 1, 1, 1, 17, 10, 13, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 6, 0, {73,81,68}, 0, 0, 6, 5, 6, 1, 3, 3 }, // Azerbaijani/Arabic/Iraq
+ { 25, 4, 239, 0, 0, 0, 0, 67, 21, 22, 23, 40, 35, 41, 44, 11, 12, 19, 20, 163, 103, 10, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 126, 0, 15, 0, 500, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 3, 3, 4, 1, 1, 1, 1, 17, 10, 13, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 6, 0, {84,82,89}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Azerbaijani/Arabic/Turkey
+ { 25, 27, 17, 0, 0, 0, 0, 6, 1, 0, 2, 3, 4, 5, 10, 11, 12, 19, 20, 291, 49, 10, 0, 1534, 1534, 1600, 1600, 96, 96, 55, 51, 0, 5, 22, 125, 476, 4, 0, 506, 516, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 8, 13, 5, 66, 66, 26, 26, 13, 13, 2, 2, 4, 17, 23, 1, 5, 5, 0, 10, 10, {65,90,78}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Azerbaijani/Cyrillic/Azerbaijan
+ { 26, 66, 40, 0, 0, 0, 0, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 16, 17, 113, 129, 10, 0, 1626, 1626, 1670, 1670, 1698, 1698, 57, 53, 0, 5, 22, 11, 481, 4, 0, 526, 531, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 13, 5, 44, 44, 28, 28, 13, 13, 6, 7, 4, 17, 23, 4, 4, 5, 0, 5, 7, {88,65,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Bafia/Latin/Cameroon
+ { 28, 66, 145, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 11, 12, 14, 15, 113, 129, 10, 0, 1711, 1711, 1754, 1754, 1781, 1781, 0, 0, 0, 5, 22, 127, 485, 2, 9, 538, 547, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 13, 5, 43, 43, 27, 27, 13, 13, 2, 2, 4, 17, 23, 5, 17, 4, 6, 9, 4, {88,79,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Bambara/Latin/Mali
+ { 28, 90, 145, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 113, 129, 10, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 127, 0, 2, 9, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 13, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 5, 0, 4, 6, 0, 0, {88,79,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Bambara/Nko/Mali
+ { 30, 9, 20, 0, 0, 99, 99, 6, 0, 1, 2, 39, 4, 5, 10, 14, 15, 16, 17, 265, 129, 61, 76, 1794, 1794, 1851, 1851, 1887, 1887, 0, 0, 144, 5, 22, 132, 502, 0, 45, 551, 556, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 15, 7, 57, 57, 36, 36, 17, 17, 2, 2, 4, 17, 23, 1, 14, 4, 6, 5, 8, {66,68,84}, 2, 1, 7, 6, 7, 1, 2, 3 }, // Bangla/Bangla/Bangladesh
+ { 30, 9, 110, 0, 0, 99, 99, 6, 0, 1, 2, 39, 4, 5, 10, 14, 15, 16, 17, 265, 129, 61, 76, 1794, 1794, 1851, 1851, 1887, 1887, 0, 0, 144, 5, 22, 120, 516, 2, 9, 551, 564, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 15, 7, 57, 57, 36, 36, 17, 17, 2, 2, 4, 17, 23, 1, 12, 4, 6, 5, 4, {73,78,82}, 2, 1, 7, 7, 7, 1, 2, 3 }, // Bangla/Bangla/India
+ { 31, 66, 40, 0, 0, 0, 0, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 13, 14, 113, 129, 10, 0, 1904, 1904, 1973, 1973, 2000, 2000, 63, 60, 0, 5, 22, 11, 528, 4, 0, 568, 573, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 13, 5, 69, 69, 27, 27, 13, 13, 10, 9, 4, 17, 23, 4, 15, 5, 0, 5, 8, {88,65,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Basaa/Latin/Cameroon
+ { 32, 27, 193, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 163, 103, 10, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 133, 0, 15, 0, 581, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 12, 0, {82,85,66}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Bashkir/Cyrillic/Russia
+ { 33, 66, 220, 0, 0, 108, 108, 6, 1, 0, 2, 3, 48, 5, 10, 11, 12, 14, 15, 308, 344, 98, 0, 2013, 2013, 2080, 2080, 2107, 2107, 0, 0, 189, 5, 22, 22, 543, 4, 20, 593, 600, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 36, 6, 15, 5, 67, 67, 27, 27, 13, 13, 2, 2, 7, 17, 23, 1, 5, 5, 7, 7, 8, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Basque/Latin/Spain
+ { 35, 27, 22, 0, 0, 117, 117, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 13, 14, 350, 50, 113, 0, 2120, 2120, 2175, 2175, 2195, 2195, 0, 0, 196, 201, 22, 1, 548, 4, 0, 608, 618, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 22, 7, 14, 5, 55, 55, 20, 20, 13, 13, 2, 2, 5, 17, 23, 2, 16, 5, 0, 10, 8, {66,89,78}, 2, 0, 1, 6, 7, 2, 3, 3 }, // Belarusian/Cyrillic/Belarus
+ { 36, 66, 260, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 2208, 2208, 2208, 2208, 83, 83, 73, 69, 0, 5, 22, 134, 0, 2, 9, 626, 635, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 79, 79, 79, 79, 13, 13, 8, 7, 4, 17, 23, 1, 0, 4, 6, 9, 6, {90,77,87}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Bemba/Latin/Zambia
+ { 37, 66, 230, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 2287, 2287, 2368, 2368, 2395, 2395, 81, 76, 0, 5, 22, 121, 564, 0, 0, 641, 647, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 81, 81, 27, 27, 13, 13, 7, 7, 4, 17, 23, 3, 22, 4, 0, 6, 10, {84,90,83}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Bena/Latin/Tanzania
+ { 38, 29, 110, 0, 0, 0, 0, 6, 0, 1, 2, 49, 4, 5, 10, 14, 15, 16, 17, 163, 103, 61, 76, 2408, 2408, 2408, 2408, 83, 83, 88, 83, 0, 5, 22, 120, 0, 2, 0, 657, 664, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 55, 55, 55, 55, 13, 13, 3, 4, 4, 17, 23, 1, 0, 4, 0, 7, 4, {73,78,82}, 2, 1, 7, 7, 7, 1, 3, 3 }, // Bhojpuri/Devanagari/India
+ { 40, 33, 74, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 372, 78, 61, 76, 2463, 2463, 2505, 2505, 2530, 2530, 0, 0, 0, 5, 22, 6, 0, 2, 0, 668, 671, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 22, 8, 15, 7, 42, 42, 25, 25, 13, 13, 2, 2, 4, 17, 23, 3, 0, 4, 0, 3, 4, {69,82,78}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Blin/Ethiopic/Eritrea
+ { 41, 29, 110, 0, 0, 124, 134, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 291, 394, 127, 142, 2543, 2597, 2650, 2650, 2682, 2682, 91, 87, 0, 5, 22, 120, 586, 2, 9, 675, 664, 6, 6, 10, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 10, 54, 53, 32, 32, 17, 17, 3, 6, 4, 17, 23, 1, 11, 4, 6, 3, 4, {73,78,82}, 2, 1, 7, 7, 7, 1, 2, 3 }, // Bodo/Devanagari/India
+ { 42, 66, 29, 0, 0, 143, 143, 6, 1, 0, 2, 3, 4, 5, 10, 13, 15, 16, 17, 404, 423, 10, 0, 2699, 2699, 2756, 2756, 2783, 2796, 94, 93, 218, 5, 22, 135, 597, 4, 0, 678, 686, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 11, 13, 5, 57, 57, 27, 27, 13, 13, 10, 7, 7, 17, 23, 2, 40, 5, 0, 8, 19, {66,65,77}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Bosnian/Latin/Bosnia and Herzegovina
+ { 42, 27, 29, 0, 0, 150, 150, 6, 1, 0, 2, 3, 4, 5, 10, 13, 14, 18, 16, 434, 454, 10, 0, 2809, 2809, 2864, 2864, 2891, 2891, 104, 100, 0, 5, 22, 137, 637, 4, 0, 705, 713, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 20, 7, 13, 5, 55, 55, 27, 27, 13, 13, 11, 13, 4, 17, 23, 2, 19, 5, 0, 8, 19, {66,65,77}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Bosnian/Cyrillic/Bosnia and Herzegovina
+ { 43, 66, 84, 0, 0, 157, 157, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 14, 15, 113, 186, 10, 0, 2904, 2904, 2946, 2946, 2978, 2978, 115, 113, 225, 232, 249, 22, 405, 4, 0, 732, 741, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 42, 42, 32, 32, 17, 17, 4, 4, 7, 17, 23, 1, 4, 5, 0, 9, 5, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Breton/Latin/France
+ { 45, 27, 36, 0, 0, 150, 150, 6, 1, 9, 2, 3, 4, 5, 10, 13, 14, 13, 14, 350, 461, 152, 1, 2995, 2995, 3049, 3049, 3069, 3069, 119, 117, 272, 5, 22, 139, 656, 4, 20, 746, 755, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 22, 12, 17, 4, 54, 54, 20, 20, 13, 13, 6, 6, 7, 17, 23, 3, 13, 5, 7, 9, 8, {66,71,78}, 2, 1, 1, 6, 7, 2, 3, 3 }, // Bulgarian/Cyrillic/Bulgaria
+ { 46, 86, 161, 165, 165, 172, 172, 182, 0, 1, 2, 50, 4, 5, 10, 14, 15, 16, 17, 473, 129, 169, 1, 3082, 3082, 3082, 3082, 3135, 3135, 125, 123, 279, 5, 22, 134, 669, 15, 0, 763, 763, 7, 7, 10, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 13, 4, 53, 53, 53, 53, 13, 13, 5, 3, 5, 17, 23, 1, 11, 5, 0, 6, 6, {77,77,75}, 0, 0, 7, 6, 7, 1, 3, 3 }, // Burmese/Myanmar/Myanmar
+ { 47, 137, 107, 183, 183, 188, 188, 6, 0, 1, 2, 3, 4, 5, 10, 51, 52, 53, 54, 491, 505, 182, 43, 3148, 3148, 3148, 3148, 3175, 3175, 130, 126, 0, 5, 22, 142, 680, 2, 9, 769, 771, 5, 5, 5, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 14, 8, 16, 6, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 2, 4, 6, 2, 14, {72,75,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Cantonese/Traditional Han/Hong Kong
+ { 47, 118, 50, 183, 183, 188, 188, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 513, 505, 169, 0, 3148, 3148, 3188, 3188, 3175, 3175, 130, 126, 0, 5, 22, 145, 682, 2, 9, 785, 787, 5, 5, 5, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 13, 8, 13, 5, 27, 27, 20, 20, 13, 13, 2, 2, 4, 17, 23, 1, 3, 4, 6, 2, 7, {67,78,89}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Cantonese/Simplified Han/China
+ { 48, 66, 220, 0, 0, 143, 143, 6, 1, 0, 2, 3, 4, 5, 10, 11, 12, 14, 15, 526, 129, 99, 1, 3208, 3208, 3267, 3267, 3267, 3267, 132, 128, 0, 5, 22, 22, 405, 4, 20, 794, 413, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 6, 14, 4, 59, 59, 27, 27, 27, 27, 5, 5, 5, 17, 23, 1, 4, 5, 7, 6, 7, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Catalan/Latin/Spain
+ { 48, 66, 6, 0, 0, 143, 143, 6, 1, 0, 2, 3, 4, 5, 10, 11, 12, 14, 15, 526, 129, 99, 1, 3208, 3208, 3267, 3267, 3267, 3267, 132, 128, 0, 5, 22, 22, 405, 4, 20, 794, 800, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 6, 14, 4, 59, 59, 27, 27, 27, 27, 5, 5, 5, 17, 23, 1, 4, 5, 7, 6, 7, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Catalan/Latin/Andorra
+ { 48, 66, 84, 0, 0, 143, 143, 6, 1, 0, 2, 3, 4, 5, 10, 11, 12, 14, 15, 526, 129, 99, 1, 3208, 3208, 3267, 3267, 3267, 3267, 132, 128, 0, 5, 22, 22, 405, 4, 20, 794, 807, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 6, 14, 4, 59, 59, 27, 27, 27, 27, 5, 5, 5, 17, 23, 1, 4, 5, 7, 6, 6, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Catalan/Latin/France
+ { 48, 66, 117, 0, 0, 143, 143, 6, 1, 0, 2, 3, 4, 5, 10, 11, 12, 14, 15, 526, 129, 99, 1, 3208, 3208, 3267, 3267, 3267, 3267, 132, 128, 0, 5, 22, 22, 405, 4, 20, 794, 813, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 6, 14, 4, 59, 59, 27, 27, 27, 27, 5, 5, 5, 17, 23, 1, 4, 5, 7, 6, 6, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Catalan/Latin/Italy
+ { 49, 66, 185, 0, 0, 193, 202, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 549, 567, 23, 38, 3294, 3294, 3349, 3349, 3376, 3376, 0, 0, 284, 5, 22, 146, 685, 2, 9, 819, 826, 6, 6, 9, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 15, 7, 55, 55, 27, 27, 13, 13, 2, 2, 8, 17, 23, 1, 15, 4, 6, 7, 9, {80,72,80}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Cebuano/Latin/Philippines
+ { 50, 66, 159, 0, 0, 0, 0, 6, 1, 9, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 3389, 3389, 3436, 3436, 3463, 3463, 137, 133, 0, 5, 22, 0, 700, 4, 0, 835, 852, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 47, 47, 27, 27, 13, 13, 9, 10, 4, 17, 23, 0, 15, 5, 0, 17, 6, {77,65,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Central Atlas Tamazight/Latin/Morocco
+ { 51, 4, 113, 0, 0, 0, 0, 67, 21, 22, 23, 25, 55, 57, 59, 14, 15, 16, 17, 163, 103, 61, 76, 3476, 3476, 3476, 3476, 3533, 3533, 146, 143, 0, 5, 22, 43, 715, 4, 0, 858, 872, 6, 6, 6, 6, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 15, 7, 57, 57, 57, 57, 13, 13, 3, 3, 4, 17, 23, 5, 13, 5, 0, 14, 5, {73,81,68}, 0, 0, 6, 5, 6, 1, 3, 3 }, // Central Kurdish/Arabic/Iraq
+ { 51, 4, 112, 0, 0, 0, 0, 67, 21, 22, 23, 25, 55, 57, 59, 14, 15, 16, 17, 163, 103, 10, 0, 3476, 3476, 3476, 3476, 3533, 3533, 146, 143, 0, 5, 22, 0, 728, 4, 0, 858, 877, 6, 6, 6, 6, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 13, 5, 57, 57, 57, 57, 13, 13, 3, 3, 4, 17, 23, 0, 12, 5, 0, 14, 5, {73,82,82}, 0, 0, 6, 5, 5, 1, 3, 3 }, // Central Kurdish/Arabic/Iran
+ { 52, 21, 20, 0, 0, 210, 210, 6, 0, 1, 2, 61, 4, 5, 10, 14, 15, 16, 17, 265, 129, 61, 76, 3546, 3546, 3672, 3672, 3756, 3756, 0, 0, 292, 5, 22, 132, 740, 0, 45, 882, 894, 6, 6, 12, 12, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 18, 6, 15, 7,126,126, 84, 84, 38, 38, 2, 2, 8, 17, 23, 1, 21, 4, 6, 12, 14, {66,68,84}, 2, 1, 7, 6, 7, 1, 2, 3 }, // Chakma/Chakma/Bangladesh
+ { 52, 21, 110, 0, 0, 210, 210, 6, 0, 1, 2, 61, 4, 5, 10, 14, 15, 16, 17, 265, 129, 61, 76, 3546, 3546, 3672, 3672, 3756, 3756, 0, 0, 292, 5, 22, 120, 761, 0, 45, 882, 908, 6, 6, 12, 12, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 18, 6, 15, 7,126,126, 84, 84, 38, 38, 2, 2, 8, 17, 23, 1, 27, 4, 6, 12, 10, {73,78,82}, 2, 1, 7, 7, 7, 1, 2, 3 }, // Chakma/Chakma/India
+ { 54, 27, 193, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 163, 103, 10, 0, 3794, 3794, 3838, 3838, 3862, 3838, 0, 0, 0, 5, 22, 133, 788, 4, 0, 918, 925, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 44, 44, 24, 24, 16, 24, 2, 2, 4, 17, 23, 1, 11, 5, 0, 7, 5, {82,85,66}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Chechen/Cyrillic/Russia
+ { 55, 23, 248, 0, 0, 222, 231, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 549, 567, 61, 76, 3878, 3878, 3926, 3926, 3953, 3953, 149, 146, 300, 5, 22, 10, 799, 2, 9, 930, 933, 6, 6, 9, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 15, 7, 48, 48, 27, 27, 13, 13, 3, 6, 6, 17, 23, 1, 6, 4, 6, 3, 15, {85,83,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Cherokee/Cherokee/United States
+ { 56, 66, 248, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 549, 567, 23, 38, 3966, 3966, 3966, 3966, 83, 83, 0, 0, 0, 5, 22, 10, 0, 15, 0, 948, 964, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 15, 7, 87, 87, 87, 87, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 16, 13, {85,83,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Chickasaw/Latin/United States
+ { 57, 66, 243, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 4053, 4053, 4126, 4126, 4153, 4153, 0, 0, 0, 5, 22, 147, 805, 2, 0, 977, 983, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 73, 73, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 19, 4, 0, 6, 6, {85,71,88}, 0, 0, 1, 7, 7, 1, 3, 3 }, // Chiga/Latin/Uganda
+ { 58, 118, 50, 183, 183, 239, 239, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 513, 505, 169, 0, 3148, 3148, 3188, 3188, 3175, 3175, 130, 126, 306, 5, 22, 150, 682, 2, 9, 989, 993, 5, 5, 5, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 13, 8, 13, 5, 27, 27, 20, 20, 13, 13, 2, 2, 2, 17, 23, 1, 3, 4, 6, 4, 2, {67,78,89}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Chinese/Simplified Han/China
+ { 58, 118, 107, 183, 183, 239, 239, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 513, 129, 198, 43, 3148, 3148, 3188, 3188, 3175, 3175, 130, 126, 306, 5, 22, 142, 824, 2, 9, 989, 995, 5, 5, 5, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 13, 6, 14, 6, 27, 27, 20, 20, 13, 13, 2, 2, 2, 17, 23, 3, 2, 4, 6, 4, 9, {72,75,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Chinese/Simplified Han/Hong Kong
+ { 58, 118, 139, 183, 183, 239, 239, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 513, 129, 198, 43, 3148, 3148, 3188, 3188, 3175, 3175, 130, 126, 306, 5, 22, 151, 826, 2, 9, 989, 1004, 5, 5, 5, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 13, 6, 14, 6, 27, 27, 20, 20, 13, 13, 2, 2, 2, 17, 23, 4, 3, 4, 6, 4, 9, {77,79,80}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Chinese/Simplified Han/Macao
+ { 58, 118, 210, 183, 183, 239, 239, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 513, 78, 198, 43, 3148, 3148, 3188, 3188, 3175, 3175, 130, 126, 306, 5, 22, 10, 829, 2, 9, 989, 1013, 5, 5, 5, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 13, 8, 14, 6, 27, 27, 20, 20, 13, 13, 2, 2, 2, 17, 23, 1, 4, 4, 6, 4, 3, {83,71,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Chinese/Simplified Han/Singapore
+ { 58, 137, 107, 183, 183, 244, 244, 6, 0, 1, 2, 3, 4, 5, 10, 51, 52, 53, 54, 513, 129, 182, 43, 3148, 3148, 4166, 4166, 3175, 3175, 130, 126, 308, 5, 22, 142, 824, 2, 9, 1016, 1020, 5, 5, 5, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 13, 8, 16, 6, 27, 27, 20, 20, 13, 13, 2, 2, 3, 17, 23, 3, 2, 4, 6, 4, 9, {72,75,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Chinese/Traditional Han/Hong Kong
+ { 58, 137, 139, 183, 183, 244, 244, 6, 0, 1, 2, 3, 4, 5, 10, 51, 52, 53, 54, 513, 129, 182, 43, 3148, 3148, 4166, 4166, 3175, 3175, 130, 126, 308, 5, 22, 151, 833, 2, 9, 1016, 1029, 5, 5, 5, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 13, 8, 16, 6, 27, 27, 20, 20, 13, 13, 2, 2, 3, 17, 23, 4, 3, 4, 6, 4, 9, {77,79,80}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Chinese/Traditional Han/Macao
+ { 58, 137, 228, 183, 183, 239, 239, 6, 0, 1, 2, 3, 4, 5, 10, 51, 52, 53, 54, 491, 505, 182, 43, 3148, 3148, 4166, 4166, 3175, 3175, 130, 126, 0, 5, 22, 10, 836, 2, 9, 1016, 1038, 5, 5, 5, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 14, 8, 16, 6, 27, 27, 20, 20, 13, 13, 2, 2, 4, 17, 23, 1, 3, 4, 6, 4, 2, {84,87,68}, 2, 0, 7, 6, 7, 1, 3, 3 }, // Chinese/Traditional Han/Taiwan
+ { 59, 27, 193, 0, 0, 249, 249, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 13, 14, 573, 596, 10, 0, 4186, 4186, 4253, 4253, 4289, 4289, 0, 0, 0, 5, 22, 133, 839, 4, 0, 1040, 1059, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 10, 13, 5, 67, 67, 36, 36, 13, 13, 2, 2, 4, 17, 23, 1, 18, 5, 0, 19, 7, {82,85,66}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Church/Cyrillic/Russia
+ { 60, 27, 193, 0, 0, 257, 257, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 13, 14, 606, 49, 10, 0, 4302, 4302, 4367, 4367, 4399, 4399, 0, 0, 0, 5, 22, 133, 857, 4, 0, 1066, 1071, 6, 6, 10, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 22, 10, 13, 5, 65, 65, 32, 32, 13, 13, 2, 2, 4, 17, 23, 1, 12, 5, 0, 5, 6, {82,85,66}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Chuvash/Cyrillic/Russia
+ { 61, 66, 91, 0, 0, 267, 267, 6, 1, 9, 2, 3, 48, 5, 63, 13, 14, 18, 16, 628, 423, 10, 0, 4412, 4412, 4483, 4483, 4510, 4510, 152, 152, 0, 5, 22, 22, 83, 4, 0, 1077, 1083, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 23, 10, 13, 5, 71, 71, 27, 27, 13, 13, 16, 16, 4, 17, 23, 1, 4, 5, 0, 6, 11, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Colognian/Latin/Germany
+ { 63, 66, 246, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 113, 186, 10, 0, 4523, 4523, 4583, 4583, 83, 83, 168, 168, 0, 5, 22, 94, 0, 2, 0, 1094, 1102, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 60, 60, 27, 27, 13, 13, 4, 4, 4, 17, 23, 1, 0, 4, 0, 8, 14, {71,66,80}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Cornish/Latin/United Kingdom
+ { 64, 66, 84, 0, 0, 275, 275, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 11, 12, 651, 186, 10, 0, 4610, 4610, 4660, 4660, 4694, 4694, 0, 0, 0, 5, 22, 155, 405, 4, 51, 1116, 1121, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 25, 10, 13, 5, 50, 50, 34, 34, 13, 13, 2, 2, 4, 17, 23, 3, 4, 5, 7, 5, 7, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Corsican/Latin/France
+ { 66, 66, 60, 0, 0, 143, 143, 6, 1, 0, 2, 3, 48, 5, 10, 13, 14, 18, 16, 404, 676, 98, 0, 2699, 2699, 2756, 2756, 2783, 2796, 0, 0, 218, 5, 22, 22, 405, 4, 0, 1128, 1136, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 13, 15, 5, 57, 57, 27, 27, 13, 13, 2, 2, 7, 17, 23, 1, 4, 5, 0, 8, 8, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Croatian/Latin/Croatia
+ { 66, 66, 29, 0, 0, 143, 143, 6, 1, 0, 2, 3, 48, 5, 10, 13, 14, 18, 16, 404, 689, 98, 0, 2699, 2699, 2756, 2756, 2796, 2796, 0, 0, 218, 5, 22, 135, 618, 4, 0, 1128, 686, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 9, 15, 5, 57, 57, 27, 27, 13, 13, 2, 2, 7, 17, 23, 2, 19, 5, 0, 8, 19, {66,65,77}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Croatian/Latin/Bosnia and Herzegovina
+ { 67, 66, 64, 0, 0, 282, 282, 6, 1, 9, 2, 3, 4, 5, 10, 13, 14, 18, 16, 698, 49, 114, 1, 4707, 4707, 4755, 4755, 4775, 4775, 172, 172, 311, 5, 22, 158, 869, 4, 0, 1144, 1151, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 8, 13, 4, 48, 48, 20, 20, 13, 13, 4, 4, 5, 17, 23, 2, 12, 5, 0, 7, 5, {67,90,75}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Czech/Latin/Czechia
+ { 68, 66, 65, 0, 0, 289, 289, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 715, 49, 212, 212, 4788, 4788, 4838, 4838, 4874, 4874, 0, 0, 0, 5, 22, 160, 881, 4, 0, 1156, 1161, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 10, 13, 5, 50, 50, 36, 36, 13, 13, 2, 2, 5, 17, 23, 3, 11, 5, 0, 5, 7, {68,75,75}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Danish/Latin/Denmark
+ { 68, 66, 95, 0, 0, 289, 289, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 715, 49, 212, 212, 4788, 4788, 4838, 4838, 4874, 4874, 0, 0, 0, 5, 22, 160, 881, 4, 0, 1156, 1168, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 10, 13, 5, 50, 50, 36, 36, 13, 13, 2, 2, 5, 17, 23, 3, 11, 5, 0, 5, 8, {68,75,75}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Danish/Latin/Greenland
+ { 69, 132, 144, 0, 0, 0, 0, 2, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 113, 283, 10, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 163, 0, 15, 0, 1176, 1186, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 6, 13, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 2, 0, 5, 0, 10, 13, {77,86,82}, 2, 1, 5, 6, 7, 1, 3, 3 }, // Divehi/Thaana/Maldives
+ { 70, 29, 110, 0, 0, 297, 306, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 738, 129, 61, 76, 4887, 4887, 4937, 4937, 4966, 4988, 176, 176, 0, 5, 22, 120, 892, 2, 0, 1199, 664, 6, 6, 9, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 15, 7, 50, 50, 29, 29, 22, 24, 4, 9, 4, 17, 23, 1, 10, 4, 0, 5, 4, {73,78,82}, 2, 1, 7, 7, 7, 1, 3, 3 }, // Dogri/Devanagari/India
+ { 71, 66, 40, 0, 0, 0, 0, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 16, 17, 113, 129, 10, 0, 5012, 5012, 5056, 5056, 5083, 5083, 180, 185, 0, 5, 22, 11, 0, 4, 0, 1204, 1209, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 13, 5, 44, 44, 27, 27, 13, 13, 5, 6, 4, 17, 23, 4, 0, 5, 0, 5, 8, {88,65,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Duala/Latin/Cameroon
+ { 72, 66, 165, 0, 0, 16, 16, 6, 1, 0, 2, 3, 4, 5, 10, 16, 17, 16, 17, 113, 394, 10, 0, 5096, 5096, 5154, 5154, 5174, 5174, 168, 168, 0, 5, 22, 22, 83, 15, 58, 1217, 1217, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 58, 58, 20, 20, 13, 13, 4, 4, 4, 17, 23, 1, 4, 5, 7, 10, 9, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Dutch/Latin/Netherlands
+ { 72, 66, 13, 0, 0, 16, 16, 6, 1, 0, 2, 3, 4, 5, 10, 16, 17, 16, 17, 113, 394, 10, 0, 5096, 5096, 5154, 5154, 5174, 5174, 168, 168, 0, 5, 22, 165, 902, 15, 58, 1217, 1227, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 58, 58, 20, 20, 13, 13, 4, 4, 4, 17, 23, 4, 16, 5, 7, 10, 5, {65,87,71}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Dutch/Latin/Aruba
+ { 72, 66, 23, 0, 0, 16, 16, 6, 1, 0, 2, 3, 4, 5, 10, 16, 17, 16, 17, 113, 187, 10, 0, 5096, 5096, 5154, 5154, 5174, 5174, 168, 168, 0, 5, 22, 22, 83, 15, 58, 1232, 1238, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 9, 13, 5, 58, 58, 20, 20, 13, 13, 4, 4, 4, 17, 23, 1, 4, 5, 7, 6, 6, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Dutch/Latin/Belgium
+ { 72, 66, 44, 0, 0, 16, 16, 6, 1, 0, 2, 3, 4, 5, 10, 16, 17, 16, 17, 113, 394, 10, 0, 5096, 5096, 5154, 5154, 5174, 5174, 168, 168, 0, 5, 22, 10, 918, 15, 58, 1217, 1244, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 58, 58, 20, 20, 13, 13, 4, 4, 4, 17, 23, 1, 18, 5, 7, 10, 19, {85,83,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Dutch/Latin/Caribbean Netherlands
+ { 72, 66, 62, 0, 0, 16, 16, 6, 1, 0, 2, 3, 4, 5, 10, 16, 17, 16, 17, 113, 394, 10, 0, 5096, 5096, 5154, 5154, 5174, 5174, 168, 168, 0, 5, 22, 169, 936, 15, 58, 1217, 1263, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 58, 58, 20, 20, 13, 13, 4, 4, 4, 17, 23, 4, 30, 5, 7, 10, 7, {65,78,71}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Dutch/Latin/Curacao
+ { 72, 66, 211, 0, 0, 16, 16, 6, 1, 0, 2, 3, 4, 5, 10, 16, 17, 16, 17, 113, 394, 10, 0, 5096, 5096, 5154, 5154, 5174, 5174, 168, 168, 0, 5, 22, 169, 936, 15, 58, 1217, 1270, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 58, 58, 20, 20, 13, 13, 4, 4, 4, 17, 23, 4, 30, 5, 7, 10, 12, {65,78,71}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Dutch/Latin/Sint Maarten
+ { 72, 66, 223, 0, 0, 16, 16, 6, 1, 0, 2, 3, 4, 5, 10, 16, 17, 16, 17, 113, 394, 10, 0, 5096, 5096, 5154, 5154, 5174, 5174, 168, 168, 0, 5, 22, 10, 966, 15, 58, 1217, 1282, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 58, 58, 20, 20, 13, 13, 4, 4, 4, 17, 23, 1, 17, 5, 7, 10, 8, {83,82,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Dutch/Latin/Suriname
+ { 73, 134, 27, 314, 314, 314, 314, 6, 0, 1, 2, 67, 4, 5, 10, 14, 15, 16, 17, 756, 103, 225, 255, 5187, 5187, 5265, 5265, 5298, 5298, 185, 191, 0, 5, 22, 173, 983, 2, 0, 1290, 1296, 9, 9, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 30, 10, 30, 22, 78, 78, 33, 33, 26, 26, 5, 6, 4, 17, 23, 3, 8, 4, 0, 6, 5, {66,84,78}, 2, 1, 7, 6, 7, 1, 2, 3 }, // Dzongkha/Tibetan/Bhutan
+ { 74, 66, 124, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 5324, 5324, 5387, 5387, 5414, 5414, 190, 197, 0, 5, 22, 176, 991, 2, 9, 1301, 1307, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 63, 63, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 17, 4, 6, 6, 5, {75,69,83}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Embu/Latin/Kenya
+ { 75, 66, 248, 0, 0, 323, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 549, 567, 23, 38, 0, 0, 56, 56, 83, 83, 0, 0, 0, 5, 22, 10, 1008, 2, 9, 1312, 964, 6, 6, 10, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 9, 4, 6, 16, 13, {85,83,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // English/Latin/United States
+ { 75, 28, 248, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 163, 103, 10, 0, 5427, 5427, 5511, 5511, 5559, 5559, 192, 199, 0, 5, 22, 10, 0, 15, 0, 1328, 1338, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 84, 84, 48, 48, 20, 20, 4, 4, 4, 17, 23, 1, 0, 5, 0, 10, 25, {85,83,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // English/Deseret/United States
+ { 75, 66, 5, 0, 0, 323, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 549, 567, 23, 38, 0, 0, 56, 56, 83, 83, 0, 0, 0, 5, 22, 10, 1008, 2, 9, 1321, 1363, 6, 6, 10, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 9, 4, 6, 7, 14, {85,83,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // English/Latin/American Samoa
+ { 75, 66, 8, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 10, 1017, 2, 9, 1321, 1377, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 21, 4, 6, 7, 8, {88,67,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Anguilla
+ { 75, 66, 10, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 10, 1017, 2, 9, 1321, 1385, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 21, 4, 6, 7, 17, {88,67,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // English/Latin/Antigua and Barbuda
+ { 75, 66, 15, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 6, 14, 15, 16, 17, 113, 129, 23, 38, 0, 0, 56, 56, 83, 5579, 82, 203, 0, 5, 22, 10, 1038, 2, 9, 1402, 1402, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 6, 15, 7, 56, 56, 27, 27, 13, 24, 2, 2, 5, 17, 23, 1, 17, 4, 6, 18, 9, {65,85,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Australia
+ { 75, 66, 16, 0, 0, 333, 333, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 22, 83, 15, 0, 1321, 1420, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 4, 5, 0, 7, 7, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Austria
+ { 75, 66, 18, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 10, 1055, 2, 9, 1321, 1427, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 15, 4, 6, 7, 7, {66,83,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // English/Latin/Bahamas
+ { 75, 66, 21, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 10, 1070, 2, 9, 1321, 1434, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 16, 4, 6, 7, 8, {66,66,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Barbados
+ { 75, 66, 23, 0, 0, 333, 333, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 78, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 22, 83, 4, 0, 1321, 1442, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 8, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 4, 5, 0, 7, 7, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Belgium
+ { 75, 66, 24, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 786, 78, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 10, 1086, 2, 9, 1321, 1449, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 13, 4, 6, 7, 6, {66,90,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // English/Latin/Belize
+ { 75, 66, 26, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 10, 1099, 2, 9, 1321, 1455, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 16, 4, 6, 7, 7, {66,77,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Bermuda
+ { 75, 66, 30, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 786, 78, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 153, 1115, 2, 9, 1321, 1462, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 14, 4, 6, 7, 8, {66,87,80}, 2, 1, 7, 6, 7, 1, 3, 3 }, // English/Latin/Botswana
+ { 75, 66, 33, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 179, 1008, 2, 9, 1321, 1470, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 9, 4, 6, 7, 30, {85,83,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/British Indian Ocean Territory
+ { 75, 66, 34, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 179, 1008, 2, 9, 1321, 1500, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 9, 4, 6, 7, 22, {85,83,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/British Virgin Islands
+ { 75, 66, 38, 0, 0, 323, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 549, 567, 10, 0, 0, 0, 56, 56, 83, 83, 0, 0, 0, 5, 22, 182, 1129, 2, 9, 1321, 1522, 6, 6, 10, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 15, 4, 6, 7, 7, {66,73,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // English/Latin/Burundi
+ { 75, 66, 40, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 11, 1144, 2, 9, 1321, 1529, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 4, 25, 4, 6, 7, 8, {88,65,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // English/Latin/Cameroon
+ { 75, 66, 41, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 549, 103, 23, 38, 0, 0, 56, 56, 83, 83, 168, 168, 0, 5, 22, 10, 1169, 2, 9, 1537, 1553, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 10, 15, 7, 56, 56, 27, 27, 13, 13, 4, 4, 5, 17, 23, 1, 15, 4, 6, 16, 6, {67,65,68}, 2, 0, 7, 6, 7, 1, 3, 3 }, // English/Latin/Canada
+ { 75, 66, 45, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 10, 1184, 2, 9, 1321, 1559, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 21, 4, 6, 7, 14, {75,89,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Cayman Islands
+ { 75, 66, 51, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 10, 1038, 2, 9, 1321, 1573, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 17, 4, 6, 7, 16, {65,85,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Christmas Island
+ { 75, 66, 53, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 10, 1038, 2, 9, 1321, 1589, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 17, 4, 6, 7, 23, {65,85,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Cocos Islands
+ { 75, 66, 58, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 10, 1205, 2, 9, 1321, 1612, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 18, 4, 6, 7, 12, {78,90,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Cook Islands
+ { 75, 66, 63, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 22, 83, 2, 9, 1321, 1624, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 4, 4, 6, 7, 6, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Cyprus
+ { 75, 66, 65, 0, 0, 333, 333, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 212, 212, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 160, 1223, 4, 0, 1321, 1630, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 12, 5, 0, 7, 7, {68,75,75}, 2, 0, 1, 6, 7, 1, 3, 3 }, // English/Latin/Denmark
+ { 75, 66, 66, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 179, 1008, 2, 9, 1321, 1637, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 9, 4, 6, 7, 12, {85,83,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Diego Garcia
+ { 75, 66, 68, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 10, 1017, 2, 9, 1321, 1649, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 21, 4, 6, 7, 8, {88,67,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // English/Latin/Dominica
+ { 75, 66, 74, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 6, 1235, 2, 9, 1321, 1657, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 14, 4, 6, 7, 7, {69,82,78}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Eritrea
+ { 75, 66, 76, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 155, 1249, 2, 9, 1321, 1664, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 15, 4, 6, 7, 8, {83,90,76}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Eswatini
+ { 75, 66, 78, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 0, 0, 4, 0, 1321, 1672, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 0, 0, 5, 0, 7, 6, {0,0,0}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Europe
+ { 75, 66, 80, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 94, 1264, 2, 9, 1321, 1678, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 22, 4, 6, 7, 16, {70,75,80}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Falkland Islands
+ { 75, 66, 82, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 10, 1286, 2, 9, 1321, 1694, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 13, 4, 6, 7, 4, {70,74,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Fiji
+ { 75, 66, 83, 0, 0, 333, 333, 6, 1, 9, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 213, 213, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 22, 83, 4, 0, 1321, 1698, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 4, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 4, 5, 0, 7, 7, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Finland
+ { 75, 66, 89, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 185, 1299, 2, 9, 1321, 1705, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 14, 4, 6, 7, 6, {71,77,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Gambia
+ { 75, 66, 91, 0, 0, 333, 333, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 22, 83, 4, 0, 1321, 1711, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 4, 5, 0, 7, 7, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Germany
+ { 75, 66, 92, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 15, 1313, 2, 9, 1321, 1718, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 13, 4, 6, 7, 5, {71,72,83}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Ghana
+ { 75, 66, 93, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 94, 1326, 2, 9, 1321, 1723, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 15, 4, 6, 7, 9, {71,73,80}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Gibraltar
+ { 75, 66, 96, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 10, 1017, 2, 9, 1321, 1732, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 21, 4, 6, 7, 7, {88,67,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Grenada
+ { 75, 66, 98, 0, 0, 323, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 549, 567, 23, 38, 0, 0, 56, 56, 83, 83, 0, 0, 0, 5, 22, 10, 1008, 2, 9, 1321, 1739, 6, 6, 10, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 9, 4, 6, 7, 4, {85,83,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // English/Latin/Guam
+ { 75, 66, 100, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 94, 1341, 2, 9, 1321, 1743, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 8, 4, 6, 7, 8, {71,66,80}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Guernsey
+ { 75, 66, 103, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 10, 1349, 2, 9, 1321, 1751, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 16, 4, 6, 7, 6, {71,89,68}, 2, 0, 1, 6, 7, 1, 3, 3 }, // English/Latin/Guyana
+ { 75, 66, 107, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 129, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 142, 1365, 2, 9, 1321, 1757, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 8, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 16, 4, 6, 7, 19, {72,75,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // English/Latin/Hong Kong
+ { 75, 66, 110, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 804, 78, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 120, 1381, 2, 9, 1321, 1478, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 8, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 12, 4, 6, 7, 5, {73,78,82}, 2, 1, 7, 7, 7, 1, 2, 3 }, // English/Latin/India
+ { 75, 66, 111, 0, 0, 333, 333, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 212, 212, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 186, 1393, 2, 9, 1321, 1776, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 2, 17, 4, 6, 7, 9, {73,68,82}, 2, 0, 7, 6, 7, 1, 3, 3 }, // English/Latin/Indonesia
+ { 75, 66, 114, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 113, 186, 10, 0, 0, 0, 56, 56, 83, 83, 168, 168, 0, 5, 22, 22, 83, 2, 9, 1321, 1785, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 56, 56, 27, 27, 13, 13, 4, 4, 5, 17, 23, 1, 4, 4, 6, 7, 7, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Ireland
+ { 75, 66, 115, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 94, 1341, 2, 9, 1321, 1792, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 8, 4, 6, 7, 11, {71,66,80}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Isle of Man
+ { 75, 66, 116, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 11, 1, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 48, 1410, 2, 9, 1321, 1803, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 4, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 18, 4, 6, 7, 6, {73,76,83}, 2, 1, 7, 5, 6, 1, 3, 3 }, // English/Latin/Israel
+ { 75, 66, 119, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 129, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 10, 1428, 2, 9, 1321, 1809, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 15, 4, 6, 7, 7, {74,77,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // English/Latin/Jamaica
+ { 75, 66, 121, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 94, 1341, 2, 9, 1321, 1816, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 8, 4, 6, 7, 6, {71,66,80}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Jersey
+ { 75, 66, 124, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 176, 1443, 2, 9, 1321, 1307, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 15, 4, 6, 7, 5, {75,69,83}, 2, 1, 7, 6, 7, 1, 3, 3 }, // English/Latin/Kenya
+ { 75, 66, 125, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 10, 1038, 2, 9, 1321, 1822, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 17, 4, 6, 7, 8, {65,85,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Kiribati
+ { 75, 66, 133, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 9, 1458, 2, 9, 1321, 1830, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 18, 4, 6, 7, 7, {90,65,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Lesotho
+ { 75, 66, 134, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 10, 1476, 2, 9, 1321, 1837, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 15, 4, 6, 7, 7, {76,82,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Liberia
+ { 75, 66, 139, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 151, 1491, 2, 9, 1321, 1844, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 4, 15, 4, 6, 7, 15, {77,79,80}, 2, 1, 7, 6, 7, 1, 3, 3 }, // English/Latin/Macao
+ { 75, 66, 141, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 188, 1506, 2, 9, 1321, 1859, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 2, 15, 4, 6, 7, 10, {77,71,65}, 0, 0, 1, 6, 7, 1, 3, 3 }, // English/Latin/Madagascar
+ { 75, 66, 142, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 190, 1521, 2, 9, 1321, 1869, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 2, 15, 4, 6, 7, 6, {77,87,75}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Malawi
+ { 75, 66, 143, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 192, 1536, 2, 9, 1321, 1875, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 2, 17, 4, 6, 7, 8, {77,89,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Malaysia
+ { 75, 66, 144, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 113, 283, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 194, 1553, 15, 0, 1321, 1883, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 6, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 2, 17, 5, 0, 7, 8, {77,86,82}, 2, 1, 5, 6, 7, 1, 3, 3 }, // English/Latin/Maldives
+ { 75, 66, 146, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 22, 83, 2, 9, 1321, 1891, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 4, 4, 6, 7, 5, {69,85,82}, 2, 1, 7, 6, 7, 1, 3, 3 }, // English/Latin/Malta
+ { 75, 66, 147, 0, 0, 323, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 549, 567, 23, 38, 0, 0, 56, 56, 83, 83, 0, 0, 0, 5, 22, 10, 1008, 2, 9, 1321, 1896, 6, 6, 10, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 9, 4, 6, 7, 16, {85,83,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // English/Latin/Marshall Islands
+ { 75, 66, 150, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 196, 1570, 2, 9, 1321, 1912, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 2, 15, 4, 6, 7, 9, {77,85,82}, 2, 0, 1, 6, 7, 1, 3, 3 }, // English/Latin/Mauritius
+ { 75, 66, 153, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 179, 1008, 2, 9, 1321, 1921, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 9, 4, 6, 7, 10, {85,83,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Micronesia
+ { 75, 66, 158, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 10, 1017, 2, 9, 1321, 1931, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 21, 4, 6, 7, 10, {88,67,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Montserrat
+ { 75, 66, 162, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 10, 1585, 2, 9, 1321, 1941, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 15, 4, 6, 7, 7, {78,65,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Namibia
+ { 75, 66, 163, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 10, 1038, 2, 9, 1321, 1948, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 17, 4, 6, 7, 5, {65,85,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Nauru
+ { 75, 66, 165, 0, 0, 333, 333, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 22, 83, 15, 58, 1321, 1953, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 4, 5, 7, 7, 11, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Netherlands
+ { 75, 66, 167, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 10, 1205, 2, 9, 1321, 1964, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 18, 4, 6, 7, 11, {78,90,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/New Zealand
+ { 75, 66, 169, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 124, 1600, 2, 9, 1321, 1975, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 14, 4, 6, 7, 7, {78,71,78}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Nigeria
+ { 75, 66, 171, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 10, 1205, 2, 9, 1321, 1982, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 18, 4, 6, 7, 4, {78,90,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Niue
+ { 75, 66, 172, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 10, 1038, 2, 9, 1321, 1986, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 17, 4, 6, 7, 14, {65,85,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Norfolk Island
+ { 75, 66, 173, 0, 0, 323, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 549, 567, 23, 38, 0, 0, 56, 56, 83, 83, 0, 0, 0, 5, 22, 10, 1008, 2, 9, 1321, 2000, 6, 6, 10, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 9, 4, 6, 7, 24, {85,83,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Northern Mariana Islands
+ { 75, 66, 178, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 196, 1614, 2, 9, 1321, 2024, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 2, 15, 4, 6, 7, 8, {80,75,82}, 2, 0, 7, 6, 7, 1, 3, 3 }, // English/Latin/Pakistan
+ { 75, 66, 179, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 179, 1008, 2, 9, 1321, 2032, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 9, 4, 6, 7, 5, {85,83,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Palau
+ { 75, 66, 182, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 134, 1629, 2, 9, 1321, 2037, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 22, 4, 6, 7, 16, {80,71,75}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Papua New Guinea
+ { 75, 66, 185, 0, 0, 323, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 549, 567, 23, 38, 0, 0, 56, 56, 83, 83, 0, 0, 0, 5, 22, 146, 685, 2, 9, 1321, 2053, 6, 6, 10, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 15, 4, 6, 7, 11, {80,72,80}, 2, 1, 7, 6, 7, 1, 3, 3 }, // English/Latin/Philippines
+ { 75, 66, 186, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 10, 1205, 2, 9, 1321, 2064, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 18, 4, 6, 7, 16, {78,90,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Pitcairn
+ { 75, 66, 189, 0, 0, 323, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 549, 567, 23, 38, 0, 0, 56, 56, 83, 83, 0, 0, 0, 5, 22, 10, 1008, 2, 9, 1321, 2080, 6, 6, 10, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 9, 4, 6, 7, 11, {85,83,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // English/Latin/Puerto Rico
+ { 75, 66, 194, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 198, 1651, 2, 9, 1321, 2091, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 2, 13, 4, 6, 7, 6, {82,87,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // English/Latin/Rwanda
+ { 75, 66, 196, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 94, 1664, 2, 9, 1321, 2097, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 15, 4, 6, 7, 9, {83,72,80}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Saint Helena
+ { 75, 66, 197, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 10, 1017, 2, 9, 1321, 2106, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 21, 4, 6, 7, 16, {88,67,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Saint Kitts and Nevis
+ { 75, 66, 198, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 10, 1017, 2, 9, 1321, 2122, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 21, 4, 6, 7, 8, {88,67,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Saint Lucia
+ { 75, 66, 201, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 10, 1017, 2, 9, 1321, 2130, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 21, 4, 6, 7, 27, {88,67,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Saint Vincent and Grenadines
+ { 75, 66, 202, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 200, 1679, 2, 9, 1321, 1372, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 11, 4, 6, 7, 5, {87,83,84}, 2, 1, 7, 6, 7, 1, 3, 3 }, // English/Latin/Samoa
+ { 75, 66, 208, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 203, 1690, 2, 9, 1321, 2157, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 2, 17, 4, 6, 7, 10, {83,67,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Seychelles
+ { 75, 66, 209, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 18, 1707, 2, 9, 1321, 2167, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 2, 20, 4, 6, 7, 12, {83,76,69}, 2, 0, 1, 6, 7, 1, 3, 3 }, // English/Latin/Sierra Leone
+ { 75, 66, 210, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 129, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 10, 1727, 2, 9, 1321, 2179, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 16, 4, 6, 7, 9, {83,71,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // English/Latin/Singapore
+ { 75, 66, 211, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 169, 1743, 2, 9, 1321, 2188, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 4, 29, 4, 6, 7, 12, {65,78,71}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Sint Maarten
+ { 75, 66, 213, 0, 0, 333, 333, 6, 1, 0, 2, 3, 4, 5, 6, 14, 15, 16, 17, 0, 186, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 22, 83, 4, 20, 1321, 2200, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 4, 5, 7, 7, 8, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Slovenia
+ { 75, 66, 214, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 10, 1772, 2, 9, 1321, 2208, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 22, 4, 6, 7, 15, {83,66,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Solomon Islands
+ { 75, 66, 216, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 786, 821, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 9, 1458, 2, 9, 1321, 2223, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 18, 4, 6, 7, 12, {90,65,82}, 2, 1, 7, 6, 7, 1, 3, 3 }, // English/Latin/South Africa
+ { 75, 66, 219, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 94, 1794, 2, 9, 1321, 2235, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 20, 4, 6, 7, 11, {83,83,80}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/South Sudan
+ { 75, 66, 222, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 0, 1814, 2, 9, 1321, 2246, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 0, 14, 4, 6, 7, 5, {83,68,71}, 2, 1, 6, 5, 6, 1, 3, 3 }, // English/Latin/Sudan
+ { 75, 66, 225, 0, 0, 333, 333, 6, 1, 9, 2, 3, 4, 5, 63, 14, 15, 16, 17, 0, 103, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 160, 1828, 4, 0, 1321, 2251, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 17, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 2, 13, 5, 0, 7, 6, {83,69,75}, 2, 0, 1, 6, 7, 1, 3, 3 }, // English/Latin/Sweden
+ { 75, 66, 226, 0, 0, 333, 333, 6, 0, 17, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 49, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 0, 1841, 15, 65, 1321, 2257, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 0, 11, 5, 5, 7, 11, {67,72,70}, 2, 0, 1, 6, 7, 1, 3, 3 }, // English/Latin/Switzerland
+ { 75, 66, 230, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 121, 1852, 2, 9, 1321, 2268, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 18, 4, 6, 7, 8, {84,90,83}, 2, 0, 1, 6, 7, 1, 3, 3 }, // English/Latin/Tanzania
+ { 75, 66, 234, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 10, 1205, 2, 9, 1321, 2276, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 18, 4, 6, 7, 7, {78,90,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Tokelau
+ { 75, 66, 235, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 205, 1870, 2, 9, 1321, 2283, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 2, 14, 4, 6, 7, 5, {84,79,80}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Tonga
+ { 75, 66, 236, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 10, 1884, 2, 9, 1321, 2288, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 24, 4, 6, 7, 17, {84,84,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // English/Latin/Trinidad and Tobago
+ { 75, 66, 241, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 179, 1008, 2, 9, 1321, 2305, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 9, 4, 6, 7, 22, {85,83,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Turks and Caicos Islands
+ { 75, 66, 242, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 10, 1038, 2, 9, 1321, 2327, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 17, 4, 6, 7, 6, {65,85,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Tuvalu
+ { 75, 66, 243, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 147, 1908, 2, 9, 1321, 983, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 16, 4, 6, 7, 6, {85,71,88}, 0, 0, 1, 7, 7, 1, 3, 3 }, // English/Latin/Uganda
+ { 75, 66, 245, 0, 0, 323, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 0, 0, 0, 5, 22, 0, 1924, 2, 9, 1321, 2333, 6, 6, 10, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 0, 27, 4, 6, 7, 20, {65,69,68}, 2, 1, 6, 6, 7, 1, 3, 3 }, // English/Latin/United Arab Emirates
+ { 75, 66, 246, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 113, 186, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 94, 1951, 2, 9, 2353, 2368, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 13, 4, 6, 15, 14, {71,66,80}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/United Kingdom
+ { 75, 66, 247, 0, 0, 323, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 549, 567, 23, 38, 0, 0, 56, 56, 83, 83, 0, 0, 0, 5, 22, 10, 1008, 2, 9, 1321, 2382, 6, 6, 10, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 9, 4, 6, 7, 21, {85,83,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // English/Latin/United States Outlying Islands
+ { 75, 66, 249, 0, 0, 323, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 549, 567, 23, 38, 0, 0, 56, 56, 83, 83, 0, 0, 0, 5, 22, 10, 1008, 2, 9, 1321, 2403, 6, 6, 10, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 9, 4, 6, 7, 19, {85,83,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // English/Latin/United States Virgin Islands
+ { 75, 66, 252, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 207, 1964, 2, 9, 1321, 2422, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 2, 12, 4, 6, 7, 7, {86,85,86}, 0, 0, 1, 6, 7, 1, 3, 3 }, // English/Latin/Vanuatu
+ { 75, 66, 258, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 0, 0, 2, 9, 1321, 2429, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 0, 0, 4, 6, 7, 5, {0,0,0}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/world
+ { 75, 66, 260, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 134, 1976, 2, 9, 1321, 635, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 14, 4, 6, 7, 6, {90,77,87}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Latin/Zambia
+ { 75, 66, 261, 0, 0, 333, 333, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 786, 129, 10, 0, 0, 0, 56, 56, 83, 83, 82, 203, 0, 5, 22, 179, 1008, 2, 9, 1321, 2434, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 9, 4, 6, 7, 8, {85,83,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // English/Latin/Zimbabwe
+ { 75, 115, 246, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 163, 103, 10, 0, 5603, 5603, 5690, 5690, 5731, 5731, 196, 205, 0, 5, 22, 94, 0, 15, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 87, 87, 41, 41, 20, 20, 4, 4, 4, 17, 23, 1, 0, 5, 0, 0, 0, {71,66,80}, 2, 1, 1, 6, 7, 1, 3, 3 }, // English/Shavian/United Kingdom
+ { 76, 27, 193, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 163, 103, 10, 0, 5751, 5811, 5892, 5892, 83, 83, 0, 0, 0, 5, 22, 133, 0, 15, 0, 2442, 2453, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 60, 81, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 11, 13, {82,85,66}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Erzya/Cyrillic/Russia
+ { 77, 66, 258, 0, 0, 342, 342, 6, 1, 9, 2, 3, 4, 5, 10, 14, 15, 16, 17, 831, 105, 10, 0, 5919, 5919, 5969, 5969, 5989, 5989, 200, 209, 316, 5, 22, 0, 0, 4, 0, 2466, 2475, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 31, 8, 13, 5, 50, 50, 20, 20, 13, 13, 3, 3, 6, 17, 23, 0, 0, 5, 0, 9, 5, {0,0,0}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Esperanto/Latin/world
+ { 78, 66, 75, 0, 0, 351, 351, 6, 1, 9, 2, 3, 48, 5, 63, 13, 14, 18, 16, 404, 49, 10, 0, 6002, 6002, 6064, 6064, 6064, 6064, 0, 0, 322, 5, 22, 22, 405, 4, 20, 2480, 2485, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 18, 8, 13, 5, 62, 62, 13, 13, 13, 13, 2, 2, 6, 17, 23, 1, 4, 5, 7, 5, 5, {69,85,82}, 2, 1, 1, 6, 7, 2, 3, 3 }, // Estonian/Latin/Estonia
+ { 79, 66, 92, 0, 0, 359, 370, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 862, 567, 277, 277, 6077, 6077, 6120, 6120, 6147, 6147, 203, 212, 0, 5, 22, 15, 1990, 2, 9, 2490, 2496, 6, 6, 11, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 6, 20, 12, 43, 43, 27, 27, 13, 13, 3, 5, 4, 17, 23, 3, 10, 4, 6, 6, 12, {71,72,83}, 2, 1, 1, 6, 7, 3, 3, 3 }, // Ewe/Latin/Ghana
+ { 79, 66, 233, 0, 0, 359, 370, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 862, 567, 10, 0, 6077, 6077, 6120, 6120, 6147, 6147, 203, 212, 0, 5, 22, 127, 2000, 2, 9, 2490, 2508, 6, 6, 11, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 6, 13, 5, 43, 43, 27, 27, 13, 13, 3, 5, 4, 17, 23, 5, 33, 4, 6, 6, 11, {88,79,70}, 0, 0, 1, 6, 7, 3, 3, 3 }, // Ewe/Latin/Togo
+ { 80, 66, 40, 0, 0, 0, 0, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 14, 15, 113, 129, 10, 0, 6160, 6160, 6244, 6244, 6273, 6273, 206, 217, 0, 5, 22, 11, 2033, 4, 0, 2519, 2525, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 13, 5, 84, 84, 29, 29, 13, 13, 7, 9, 4, 17, 23, 4, 16, 5, 0, 6, 7, {88,65,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Ewondo/Latin/Cameroon
+ { 81, 66, 81, 0, 0, 380, 289, 6, 1, 0, 2, 3, 48, 5, 10, 14, 15, 16, 17, 404, 49, 10, 0, 6286, 6286, 6359, 6386, 6420, 6420, 0, 0, 328, 5, 22, 160, 2049, 4, 20, 2532, 2540, 6, 6, 9, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 13, 5, 73, 73, 27, 34, 13, 13, 2, 2, 3, 17, 23, 2, 11, 5, 7, 8, 7, {68,75,75}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Faroese/Latin/Faroe Islands
+ { 81, 66, 65, 0, 0, 380, 289, 6, 1, 0, 2, 3, 48, 5, 10, 14, 15, 16, 17, 404, 49, 10, 0, 6286, 6286, 6359, 6386, 6420, 6420, 0, 0, 328, 5, 22, 160, 2049, 4, 20, 2532, 1161, 6, 6, 9, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 13, 5, 73, 73, 27, 34, 13, 13, 2, 2, 3, 17, 23, 3, 11, 5, 7, 8, 7, {68,75,75}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Faroese/Latin/Denmark
+ { 83, 66, 185, 0, 0, 389, 398, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 549, 567, 23, 38, 6433, 6433, 6487, 6487, 6487, 6487, 0, 0, 0, 5, 22, 146, 2060, 2, 9, 2547, 826, 6, 6, 9, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 15, 7, 54, 54, 27, 27, 27, 27, 2, 2, 5, 17, 23, 1, 17, 4, 6, 8, 9, {80,72,80}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Filipino/Latin/Philippines
+ { 84, 66, 83, 0, 0, 351, 351, 6, 1, 9, 2, 3, 48, 5, 10, 15, 15, 17, 17, 698, 885, 213, 213, 6514, 6580, 6660, 6660, 6680, 6680, 213, 226, 331, 336, 353, 22, 405, 4, 0, 2555, 2560, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 8, 12, 4, 66, 80, 20, 20, 13, 13, 3, 3, 5, 17, 23, 1, 4, 5, 0, 5, 5, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Finnish/Latin/Finland
+ { 85, 66, 84, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 10, 0, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 22, 405, 4, 20, 2565, 2573, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 1, 4, 5, 7, 8, 6, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // French/Latin/France
+ { 85, 66, 4, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 23, 38, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 209, 2077, 4, 20, 2565, 2579, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 15, 7, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 2, 14, 5, 7, 8, 7, {68,90,68}, 2, 1, 6, 5, 6, 1, 3, 3 }, // French/Latin/Algeria
+ { 85, 66, 23, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 79, 297, 0, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 22, 405, 4, 20, 2565, 2586, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 7, 26, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 1, 4, 5, 7, 8, 8, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // French/Latin/Belgium
+ { 85, 66, 25, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 10, 0, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 127, 2091, 4, 20, 2565, 2594, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 5, 17, 5, 7, 8, 5, {88,79,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // French/Latin/Benin
+ { 85, 66, 37, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 10, 0, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 127, 2091, 4, 20, 2565, 2599, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 5, 17, 5, 7, 8, 12, {88,79,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // French/Latin/Burkina Faso
+ { 85, 66, 38, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 10, 0, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 182, 2108, 4, 20, 2565, 1522, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 3, 15, 5, 7, 8, 7, {66,73,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // French/Latin/Burundi
+ { 85, 66, 40, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 10, 0, 6693, 6693, 6744, 6744, 6778, 6778, 216, 229, 376, 232, 249, 11, 2123, 4, 20, 2565, 1209, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 51, 51, 34, 34, 13, 13, 5, 4, 6, 17, 23, 4, 16, 5, 7, 8, 8, {88,65,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // French/Latin/Cameroon
+ { 85, 66, 41, 0, 0, 406, 406, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 15, 14, 113, 103, 323, 323, 6693, 6693, 6744, 6744, 6778, 6778, 168, 168, 376, 232, 249, 10, 2139, 4, 20, 2611, 1553, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 27, 9, 51, 51, 34, 34, 13, 13, 4, 4, 6, 17, 23, 1, 15, 5, 7, 17, 6, {67,65,68}, 2, 0, 7, 6, 7, 1, 3, 3 }, // French/Latin/Canada
+ { 85, 66, 46, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 10, 0, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 11, 2123, 4, 20, 2565, 2628, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 4, 16, 5, 7, 8, 25, {88,65,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // French/Latin/Central African Republic
+ { 85, 66, 48, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 23, 38, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 11, 2123, 4, 20, 2565, 2653, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 15, 7, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 4, 16, 5, 7, 8, 5, {88,65,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // French/Latin/Chad
+ { 85, 66, 55, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 10, 0, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 12, 2154, 4, 20, 2565, 2658, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 2, 14, 5, 7, 8, 7, {75,77,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // French/Latin/Comoros
+ { 85, 66, 56, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 10, 0, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 11, 2123, 4, 20, 2565, 2665, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 4, 16, 5, 7, 8, 17, {88,65,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // French/Latin/Congo - Brazzaville
+ { 85, 66, 57, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 10, 0, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 11, 2168, 4, 20, 2565, 2682, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 2, 15, 5, 7, 8, 14, {67,68,70}, 2, 1, 1, 6, 7, 1, 3, 3 }, // French/Latin/Congo - Kinshasa
+ { 85, 66, 67, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 23, 38, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 3, 2183, 4, 20, 2565, 2696, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 15, 7, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 3, 16, 5, 7, 8, 8, {68,74,70}, 0, 0, 6, 6, 7, 1, 3, 3 }, // French/Latin/Djibouti
+ { 85, 66, 73, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 10, 0, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 11, 2123, 4, 20, 2565, 2704, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 4, 16, 5, 7, 8, 18, {88,65,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // French/Latin/Equatorial Guinea
+ { 85, 66, 85, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 10, 0, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 22, 405, 4, 20, 2565, 2722, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 1, 4, 5, 7, 8, 16, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // French/Latin/French Guiana
+ { 85, 66, 86, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 10, 0, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 211, 2199, 4, 20, 2565, 2738, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 4, 9, 5, 7, 8, 19, {88,80,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // French/Latin/French Polynesia
+ { 85, 66, 88, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 10, 0, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 11, 2123, 4, 20, 2565, 2757, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 4, 16, 5, 7, 8, 5, {88,65,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // French/Latin/Gabon
+ { 85, 66, 97, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 10, 0, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 22, 405, 4, 20, 2565, 2762, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 1, 4, 5, 7, 8, 10, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // French/Latin/Guadeloupe
+ { 85, 66, 102, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 10, 0, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 215, 2208, 4, 20, 2565, 2704, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 2, 13, 5, 7, 8, 6, {71,78,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // French/Latin/Guinea
+ { 85, 66, 104, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 10, 0, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 15, 2221, 4, 20, 2565, 2772, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 1, 16, 5, 7, 8, 5, {72,84,71}, 2, 1, 1, 6, 7, 1, 3, 3 }, // French/Latin/Haiti
+ { 85, 66, 118, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 10, 0, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 127, 2091, 4, 20, 2565, 2777, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 5, 17, 5, 7, 8, 13, {88,79,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // French/Latin/Ivory Coast
+ { 85, 66, 138, 0, 0, 406, 406, 6, 1, 0, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 10, 0, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 22, 405, 4, 20, 2565, 2790, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 1, 4, 5, 7, 8, 10, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // French/Latin/Luxembourg
+ { 85, 66, 141, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 10, 0, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 188, 2237, 4, 20, 2565, 1859, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 2, 15, 5, 7, 8, 10, {77,71,65}, 0, 0, 1, 6, 7, 1, 3, 3 }, // French/Latin/Madagascar
+ { 85, 66, 145, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 10, 0, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 127, 2091, 4, 20, 2565, 547, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 5, 17, 5, 7, 8, 4, {88,79,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // French/Latin/Mali
+ { 85, 66, 148, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 10, 0, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 22, 405, 4, 20, 2565, 2800, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 1, 4, 5, 7, 8, 10, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // French/Latin/Martinique
+ { 85, 66, 149, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 23, 38, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 217, 2252, 4, 20, 2565, 2810, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 15, 7, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 2, 19, 5, 7, 8, 10, {77,82,85}, 2, 1, 1, 6, 7, 1, 3, 3 }, // French/Latin/Mauritania
+ { 85, 66, 150, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 10, 0, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 196, 2271, 4, 20, 2565, 2820, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 2, 18, 5, 7, 8, 7, {77,85,82}, 2, 0, 1, 6, 7, 1, 3, 3 }, // French/Latin/Mauritius
+ { 85, 66, 151, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 10, 0, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 22, 405, 4, 20, 2565, 2827, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 1, 4, 5, 7, 8, 7, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // French/Latin/Mayotte
+ { 85, 66, 155, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 10, 0, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 22, 405, 4, 20, 2565, 2834, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 1, 4, 5, 7, 8, 6, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // French/Latin/Monaco
+ { 85, 66, 159, 0, 0, 406, 406, 6, 1, 0, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 10, 0, 6693, 6693, 6744, 6744, 6778, 6778, 168, 168, 376, 232, 249, 0, 2289, 4, 20, 2565, 2840, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 51, 51, 34, 34, 13, 13, 4, 4, 6, 17, 23, 0, 15, 5, 7, 8, 5, {77,65,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // French/Latin/Morocco
+ { 85, 66, 166, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 10, 0, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 211, 2199, 4, 20, 2565, 2845, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 4, 9, 5, 7, 8, 18, {88,80,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // French/Latin/New Caledonia
+ { 85, 66, 170, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 10, 0, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 127, 2091, 4, 20, 2565, 1975, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 5, 17, 5, 7, 8, 5, {88,79,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // French/Latin/Niger
+ { 85, 66, 191, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 10, 0, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 22, 405, 4, 20, 2565, 2863, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 1, 4, 5, 7, 8, 10, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // French/Latin/Reunion
+ { 85, 66, 194, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 10, 0, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 198, 2304, 4, 20, 2565, 2091, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 2, 14, 5, 7, 8, 6, {82,87,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // French/Latin/Rwanda
+ { 85, 66, 195, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 10, 0, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 22, 405, 4, 20, 2565, 2873, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 1, 4, 5, 7, 8, 16, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // French/Latin/Saint Barthelemy
+ { 85, 66, 199, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 10, 0, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 22, 405, 4, 20, 2565, 2889, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 1, 4, 5, 7, 8, 12, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // French/Latin/Saint Martin
+ { 85, 66, 200, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 10, 0, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 22, 405, 4, 20, 2565, 2901, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 1, 4, 5, 7, 8, 24, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // French/Latin/Saint Pierre and Miquelon
+ { 85, 66, 206, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 10, 0, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 127, 2091, 4, 20, 2565, 2925, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 5, 17, 5, 7, 8, 7, {88,79,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // French/Latin/Senegal
+ { 85, 66, 208, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 10, 0, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 203, 2318, 4, 20, 2565, 2157, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 2, 21, 5, 7, 8, 10, {83,67,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // French/Latin/Seychelles
+ { 85, 66, 226, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 19, 20, 0, 49, 350, 0, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 0, 2339, 4, 20, 2932, 2947, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 8, 17, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 0, 12, 5, 7, 15, 6, {67,72,70}, 2, 0, 1, 6, 7, 1, 3, 3 }, // French/Latin/Switzerland
+ { 85, 66, 227, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 23, 38, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 219, 2351, 4, 20, 2565, 2953, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 15, 7, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 2, 14, 5, 7, 8, 5, {83,89,80}, 0, 0, 6, 5, 6, 1, 3, 3 }, // French/Latin/Syria
+ { 85, 66, 233, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 10, 0, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 127, 2091, 4, 20, 2565, 2508, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 5, 17, 5, 7, 8, 4, {88,79,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // French/Latin/Togo
+ { 85, 66, 238, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 23, 38, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 221, 2365, 4, 20, 2565, 2958, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 15, 7, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 2, 14, 5, 7, 8, 7, {84,78,68}, 3, 0, 1, 6, 7, 1, 3, 3 }, // French/Latin/Tunisia
+ { 85, 66, 252, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 23, 38, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 207, 2379, 4, 20, 2565, 2422, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 15, 7, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 2, 14, 5, 7, 8, 7, {86,85,86}, 0, 0, 1, 6, 7, 1, 3, 3 }, // French/Latin/Vanuatu
+ { 85, 66, 256, 0, 0, 406, 406, 6, 1, 68, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 186, 10, 0, 6693, 6693, 6744, 6744, 6778, 6778, 0, 0, 376, 232, 249, 211, 2199, 4, 20, 2565, 2965, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 4, 9, 5, 7, 8, 16, {88,80,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // French/Latin/Wallis and Futuna
+ { 86, 66, 117, 0, 0, 414, 414, 6, 1, 0, 2, 3, 4, 5, 10, 16, 17, 14, 15, 893, 78, 10, 0, 6791, 6791, 6840, 6840, 6778, 6778, 5, 128, 0, 5, 22, 22, 405, 15, 0, 2981, 2987, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 13, 5, 49, 49, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 4, 5, 0, 6, 6, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Friulian/Latin/Italy
+ { 87, 66, 206, 0, 0, 0, 0, 6, 1, 9, 2, 3, 4, 5, 10, 13, 15, 18, 17, 113, 129, 10, 0, 6867, 6867, 6925, 6925, 6952, 6952, 221, 233, 0, 5, 22, 127, 2393, 4, 0, 2993, 2999, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 13, 5, 58, 58, 27, 27, 13, 13, 6, 7, 4, 17, 23, 5, 19, 5, 0, 6, 8, {88,79,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Fulah/Latin/Senegal
+ { 87, 1, 37, 421, 421, 427, 436, 444, 0, 69, 2, 70, 4, 5, 72, 14, 15, 16, 17, 920, 283, 10, 0, 6965, 6965, 7083, 7083, 7135, 7135, 227, 240, 382, 394, 22, 223, 2412, 15, 0, 3007, 3017, 6, 6, 9, 8, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 17, 8, 13, 5,118,118, 52, 52, 22, 22, 4, 4, 12, 27, 23, 6, 51, 5, 0, 10, 25, {88,79,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Fulah/Adlam/Burkina Faso
+ { 87, 1, 40, 421, 421, 427, 436, 444, 0, 69, 2, 70, 4, 5, 72, 14, 15, 16, 17, 920, 283, 10, 0, 6965, 6965, 7083, 7083, 7135, 7135, 227, 240, 382, 394, 22, 229, 2463, 15, 0, 3007, 3042, 6, 6, 9, 8, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 17, 8, 13, 5,118,118, 52, 52, 22, 22, 4, 4, 12, 27, 23, 8, 44, 5, 0, 10, 16, {88,65,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Fulah/Adlam/Cameroon
+ { 87, 1, 89, 421, 421, 427, 436, 444, 0, 69, 2, 70, 4, 5, 72, 14, 15, 16, 17, 920, 283, 61, 76, 6965, 6965, 7083, 7083, 7135, 7135, 227, 240, 382, 394, 22, 185, 2507, 15, 0, 3007, 3058, 6, 6, 9, 8, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 17, 8, 15, 7,118,118, 52, 52, 22, 22, 4, 4, 12, 27, 23, 1, 29, 5, 0, 10, 14, {71,77,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Fulah/Adlam/Gambia
+ { 87, 1, 92, 421, 421, 427, 436, 444, 0, 69, 2, 70, 4, 5, 72, 14, 15, 16, 17, 920, 283, 61, 76, 6965, 6965, 7083, 7083, 7135, 7135, 227, 240, 382, 394, 22, 15, 2536, 15, 0, 3007, 3072, 6, 6, 9, 8, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 17, 8, 15, 7,118,118, 52, 52, 22, 22, 4, 4, 12, 27, 23, 3, 23, 5, 0, 10, 8, {71,72,83}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Fulah/Adlam/Ghana
+ { 87, 1, 101, 421, 421, 427, 436, 444, 0, 69, 2, 70, 4, 5, 72, 14, 15, 16, 17, 920, 283, 10, 0, 6965, 6965, 7083, 7083, 7135, 7135, 227, 240, 382, 394, 22, 223, 2412, 15, 0, 3007, 3080, 6, 6, 9, 8, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 17, 8, 13, 5,118,118, 52, 52, 22, 22, 4, 4, 12, 27, 23, 6, 51, 5, 0, 10, 23, {88,79,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Fulah/Adlam/Guinea-Bissau
+ { 87, 1, 102, 421, 421, 427, 436, 444, 0, 69, 2, 70, 4, 5, 72, 14, 15, 16, 17, 920, 283, 10, 0, 6965, 6965, 7083, 7083, 7135, 7135, 227, 240, 382, 394, 22, 215, 2559, 15, 0, 3007, 3080, 6, 6, 9, 8, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 17, 8, 13, 5,118,118, 52, 52, 22, 22, 4, 4, 12, 27, 23, 2, 25, 5, 0, 10, 8, {71,78,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Fulah/Adlam/Guinea
+ { 87, 1, 134, 421, 421, 427, 436, 444, 0, 69, 2, 70, 4, 5, 72, 14, 15, 16, 17, 920, 283, 61, 76, 6965, 6965, 7083, 7083, 7135, 7135, 227, 240, 382, 394, 22, 10, 2584, 15, 0, 3007, 3103, 6, 6, 9, 8, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 17, 8, 15, 7,118,118, 52, 52, 22, 22, 4, 4, 12, 27, 23, 1, 31, 5, 0, 10, 18, {76,82,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Fulah/Adlam/Liberia
+ { 87, 1, 149, 421, 421, 427, 436, 444, 0, 69, 2, 70, 4, 5, 72, 14, 15, 16, 17, 920, 283, 61, 76, 6965, 6965, 7083, 7083, 7135, 7135, 227, 240, 382, 394, 22, 217, 2615, 15, 0, 3007, 3121, 6, 6, 9, 8, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 17, 8, 15, 7,118,118, 52, 52, 22, 22, 4, 4, 12, 27, 23, 2, 37, 5, 0, 10, 16, {77,82,85}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Fulah/Adlam/Mauritania
+ { 87, 1, 169, 421, 421, 427, 436, 444, 0, 69, 2, 70, 4, 5, 72, 14, 15, 16, 17, 920, 283, 10, 0, 6965, 6965, 7083, 7083, 7135, 7135, 227, 240, 382, 394, 22, 124, 2652, 15, 0, 3007, 3137, 6, 6, 9, 8, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 17, 8, 13, 5,118,118, 52, 52, 22, 22, 4, 4, 12, 27, 23, 1, 33, 5, 0, 10, 18, {78,71,78}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Fulah/Adlam/Nigeria
+ { 87, 1, 170, 421, 421, 427, 436, 444, 0, 69, 2, 70, 4, 5, 72, 14, 15, 16, 17, 920, 283, 10, 0, 6965, 6965, 7083, 7083, 7135, 7135, 227, 240, 382, 394, 22, 223, 2412, 15, 0, 3007, 3155, 6, 6, 9, 8, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 17, 8, 13, 5,118,118, 52, 52, 22, 22, 4, 4, 12, 27, 23, 6, 51, 5, 0, 10, 12, {88,79,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Fulah/Adlam/Niger
+ { 87, 1, 206, 421, 421, 427, 436, 444, 0, 69, 2, 70, 4, 5, 72, 14, 15, 16, 17, 920, 283, 10, 0, 6965, 6965, 7083, 7083, 7135, 7135, 227, 240, 382, 394, 22, 223, 2412, 15, 0, 3007, 3167, 6, 6, 9, 8, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 17, 8, 13, 5,118,118, 52, 52, 22, 22, 4, 4, 12, 27, 23, 6, 51, 5, 0, 10, 16, {88,79,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Fulah/Adlam/Senegal
+ { 87, 1, 209, 421, 421, 427, 436, 444, 0, 69, 2, 70, 4, 5, 72, 14, 15, 16, 17, 920, 283, 61, 76, 6965, 6965, 7083, 7083, 7135, 7135, 227, 240, 382, 394, 22, 18, 2685, 15, 0, 3007, 3183, 6, 6, 9, 8, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 17, 8, 15, 7,118,118, 52, 52, 22, 22, 4, 4, 12, 27, 23, 2, 33, 5, 0, 10, 14, {83,76,69}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Fulah/Adlam/Sierra Leone
+ { 87, 66, 37, 0, 0, 0, 0, 6, 1, 9, 2, 3, 4, 5, 10, 13, 15, 18, 17, 113, 129, 10, 0, 6867, 6867, 6925, 6925, 6952, 6952, 221, 233, 0, 5, 22, 127, 2393, 4, 0, 2993, 3197, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 13, 5, 58, 58, 27, 27, 13, 13, 6, 7, 4, 17, 23, 5, 19, 5, 0, 6, 14, {88,79,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Fulah/Latin/Burkina Faso
+ { 87, 66, 40, 0, 0, 0, 0, 6, 1, 9, 2, 3, 4, 5, 10, 13, 15, 18, 17, 113, 129, 10, 0, 6867, 6867, 6925, 6925, 6952, 6952, 221, 233, 0, 5, 22, 11, 2718, 4, 0, 2993, 3211, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 13, 5, 58, 58, 27, 27, 13, 13, 6, 7, 4, 17, 23, 4, 18, 5, 0, 6, 8, {88,65,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Fulah/Latin/Cameroon
+ { 87, 66, 89, 0, 0, 0, 0, 6, 1, 9, 2, 3, 4, 5, 10, 13, 15, 18, 17, 113, 129, 23, 38, 6867, 6867, 6925, 6925, 6952, 6952, 221, 233, 0, 5, 22, 185, 2736, 4, 0, 2993, 3219, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 15, 7, 58, 58, 27, 27, 13, 13, 6, 7, 4, 17, 23, 1, 13, 5, 0, 6, 6, {71,77,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Fulah/Latin/Gambia
+ { 87, 66, 92, 0, 0, 0, 0, 6, 1, 9, 2, 3, 4, 5, 10, 13, 15, 18, 17, 113, 129, 23, 38, 6867, 6867, 6925, 6925, 6952, 6952, 221, 233, 0, 5, 22, 15, 0, 4, 0, 2993, 3225, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 15, 7, 58, 58, 27, 27, 13, 13, 6, 7, 4, 17, 23, 3, 0, 5, 0, 6, 5, {71,72,83}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Fulah/Latin/Ghana
+ { 87, 66, 101, 0, 0, 0, 0, 6, 1, 9, 2, 3, 4, 5, 10, 13, 15, 18, 17, 113, 129, 10, 0, 6867, 6867, 6925, 6925, 6952, 6952, 221, 233, 0, 5, 22, 127, 2393, 4, 0, 2993, 3230, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 13, 5, 58, 58, 27, 27, 13, 13, 6, 7, 4, 17, 23, 5, 19, 5, 0, 6, 12, {88,79,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Fulah/Latin/Guinea-Bissau
+ { 87, 66, 102, 0, 0, 0, 0, 6, 1, 9, 2, 3, 4, 5, 10, 13, 15, 18, 17, 113, 129, 10, 0, 6867, 6867, 6925, 6925, 6952, 6952, 221, 233, 0, 5, 22, 215, 0, 4, 0, 2993, 3230, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 13, 5, 58, 58, 27, 27, 13, 13, 6, 7, 4, 17, 23, 2, 0, 5, 0, 6, 4, {71,78,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Fulah/Latin/Guinea
+ { 87, 66, 134, 0, 0, 0, 0, 6, 1, 9, 2, 3, 4, 5, 10, 13, 15, 18, 17, 113, 129, 23, 38, 6867, 6867, 6925, 6925, 6952, 6952, 221, 233, 0, 5, 22, 10, 2749, 4, 0, 2993, 3242, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 15, 7, 58, 58, 27, 27, 13, 13, 6, 7, 4, 17, 23, 1, 16, 5, 0, 6, 9, {76,82,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Fulah/Latin/Liberia
+ { 87, 66, 149, 0, 0, 0, 0, 6, 1, 9, 2, 3, 4, 5, 10, 13, 15, 18, 17, 113, 129, 23, 38, 6867, 6867, 6925, 6925, 6952, 6952, 221, 233, 0, 5, 22, 217, 2765, 4, 0, 2993, 3251, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 15, 7, 58, 58, 27, 27, 13, 13, 6, 7, 4, 17, 23, 2, 15, 5, 0, 6, 8, {77,82,85}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Fulah/Latin/Mauritania
+ { 87, 66, 169, 0, 0, 0, 0, 6, 1, 9, 2, 3, 4, 5, 10, 13, 15, 18, 17, 113, 129, 10, 0, 6867, 6867, 6925, 6925, 6952, 6952, 221, 233, 0, 5, 22, 124, 2780, 4, 0, 2993, 3259, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 13, 5, 58, 58, 27, 27, 13, 13, 6, 7, 4, 17, 23, 1, 16, 5, 0, 6, 9, {78,71,78}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Fulah/Latin/Nigeria
+ { 87, 66, 170, 0, 0, 0, 0, 6, 1, 9, 2, 3, 4, 5, 10, 13, 15, 18, 17, 113, 129, 10, 0, 6867, 6867, 6925, 6925, 6952, 6952, 221, 233, 0, 5, 22, 127, 2393, 4, 0, 2993, 3268, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 13, 5, 58, 58, 27, 27, 13, 13, 6, 7, 4, 17, 23, 5, 19, 5, 0, 6, 6, {88,79,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Fulah/Latin/Niger
+ { 87, 66, 209, 0, 0, 0, 0, 6, 1, 9, 2, 3, 4, 5, 10, 13, 15, 18, 17, 113, 129, 23, 38, 6867, 6867, 6925, 6925, 6952, 6952, 221, 233, 0, 5, 22, 18, 2796, 4, 0, 2993, 3274, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 15, 7, 58, 58, 27, 27, 13, 13, 6, 7, 4, 17, 23, 2, 18, 5, 0, 6, 11, {83,76,69}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Fulah/Latin/Sierra Leone
+ { 88, 66, 246, 0, 0, 445, 445, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 937, 186, 10, 0, 7157, 7157, 7225, 7225, 7252, 7252, 3, 135, 421, 5, 22, 94, 2814, 2, 9, 3285, 3293, 6, 6, 10, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 21, 10, 13, 5, 68, 68, 27, 27, 13, 13, 1, 1, 6, 17, 23, 1, 15, 4, 6, 8, 22, {71,66,80}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Gaelic/Latin/United Kingdom
+ { 89, 66, 92, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 549, 567, 23, 38, 7265, 7265, 7297, 7297, 7323, 7323, 0, 0, 0, 5, 22, 15, 50, 2, 9, 3315, 1718, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 15, 7, 32, 32, 26, 26, 13, 13, 2, 2, 4, 17, 23, 3, 10, 4, 6, 2, 5, {71,72,83}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Ga/Latin/Ghana
+ { 90, 66, 220, 0, 0, 414, 414, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 958, 78, 10, 0, 7336, 7336, 7384, 7384, 1185, 7418, 168, 168, 0, 5, 22, 22, 405, 4, 0, 3317, 455, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 13, 5, 48, 48, 34, 34, 13, 20, 4, 4, 5, 17, 23, 1, 4, 5, 0, 6, 6, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Galician/Latin/Spain
+ { 91, 66, 243, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 7438, 7438, 7503, 7503, 7530, 7530, 0, 0, 0, 5, 22, 147, 2829, 0, 0, 3323, 3330, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 65, 65, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 19, 4, 0, 7, 7, {85,71,88}, 0, 0, 1, 7, 7, 1, 3, 3 }, // Ganda/Latin/Uganda
+ { 92, 33, 77, 0, 0, 0, 0, 6, 0, 74, 2, 3, 4, 5, 10, 14, 15, 16, 17, 985, 78, 61, 76, 7543, 7543, 7543, 7543, 7571, 7571, 0, 0, 0, 5, 22, 0, 105, 15, 0, 3337, 143, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 8, 15, 7, 28, 28, 28, 28, 13, 13, 2, 2, 4, 17, 23, 0, 9, 5, 0, 4, 5, {69,84,66}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Geez/Ethiopic/Ethiopia
+ { 92, 33, 74, 0, 0, 0, 0, 6, 0, 74, 2, 3, 4, 5, 10, 14, 15, 16, 17, 985, 78, 61, 76, 7543, 7543, 7543, 7543, 7571, 7571, 0, 0, 0, 5, 22, 6, 0, 15, 0, 3337, 671, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 8, 15, 7, 28, 28, 28, 28, 13, 13, 2, 2, 4, 17, 23, 3, 0, 5, 0, 4, 4, {69,82,78}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Geez/Ethiopic/Eritrea
+ { 93, 35, 90, 0, 0, 455, 455, 6, 1, 9, 2, 3, 4, 5, 10, 13, 14, 11, 12, 1008, 49, 10, 0, 7584, 7584, 7645, 7645, 7672, 7672, 0, 0, 427, 432, 22, 0, 2848, 4, 0, 3341, 3348, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 8, 13, 5, 61, 61, 27, 27, 13, 13, 2, 2, 5, 29, 23, 1, 12, 5, 0, 7, 10, {71,69,76}, 2, 1, 1, 6, 7, 2, 3, 3 }, // Georgian/Georgian/Georgia
+ { 94, 66, 91, 0, 0, 463, 463, 6, 1, 0, 2, 3, 4, 5, 10, 13, 14, 18, 16, 404, 49, 10, 0, 7685, 7685, 7744, 7764, 4510, 4510, 0, 0, 461, 5, 22, 22, 83, 4, 0, 3358, 3365, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 13, 5, 59, 59, 20, 27, 13, 13, 2, 2, 5, 17, 23, 1, 4, 5, 0, 7, 11, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // German/Latin/Germany
+ { 94, 66, 16, 0, 0, 463, 463, 6, 1, 9, 2, 3, 4, 5, 10, 13, 14, 18, 16, 404, 49, 10, 0, 7685, 7685, 7744, 7764, 4510, 4510, 0, 0, 461, 5, 22, 22, 83, 15, 0, 3376, 3376, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 13, 5, 59, 59, 20, 27, 13, 13, 2, 2, 5, 17, 23, 1, 4, 5, 0, 24, 10, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // German/Latin/Austria
+ { 94, 66, 23, 0, 0, 463, 463, 6, 1, 0, 2, 3, 4, 5, 10, 13, 14, 18, 16, 404, 49, 10, 0, 7685, 7685, 7744, 7764, 4510, 4510, 0, 0, 461, 5, 22, 22, 83, 4, 0, 3358, 3400, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 13, 5, 59, 59, 20, 27, 13, 13, 2, 2, 5, 17, 23, 1, 4, 5, 0, 7, 7, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // German/Latin/Belgium
+ { 94, 66, 117, 0, 0, 463, 463, 6, 1, 0, 2, 3, 4, 5, 10, 13, 14, 18, 16, 404, 49, 10, 0, 7685, 7685, 7744, 7764, 4510, 4510, 0, 0, 461, 5, 22, 22, 83, 4, 0, 3358, 3407, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 13, 5, 59, 59, 20, 27, 13, 13, 2, 2, 5, 17, 23, 1, 4, 5, 0, 7, 7, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // German/Latin/Italy
+ { 94, 66, 136, 0, 0, 463, 463, 6, 0, 17, 2, 3, 4, 5, 10, 13, 14, 18, 16, 404, 49, 10, 0, 7685, 7685, 7744, 7764, 4510, 4510, 0, 0, 461, 5, 22, 0, 2860, 15, 0, 3358, 3414, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 13, 5, 59, 59, 20, 27, 13, 13, 2, 2, 5, 17, 23, 0, 17, 5, 0, 7, 13, {67,72,70}, 2, 0, 1, 6, 7, 1, 3, 3 }, // German/Latin/Liechtenstein
+ { 94, 66, 138, 0, 0, 463, 463, 6, 1, 0, 2, 3, 4, 5, 10, 13, 14, 18, 16, 404, 49, 10, 0, 7685, 7685, 7744, 7764, 4510, 4510, 0, 0, 461, 5, 22, 22, 83, 4, 0, 3358, 3427, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 13, 5, 59, 59, 20, 27, 13, 13, 2, 2, 5, 17, 23, 1, 4, 5, 0, 7, 9, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // German/Latin/Luxembourg
+ { 94, 66, 226, 0, 0, 463, 463, 6, 0, 17, 2, 3, 4, 5, 10, 13, 14, 18, 16, 404, 49, 10, 0, 7685, 7685, 7744, 7764, 4510, 4510, 0, 0, 461, 5, 22, 0, 2860, 15, 65, 3436, 3436, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 13, 5, 59, 59, 20, 27, 13, 13, 2, 2, 5, 17, 23, 0, 17, 5, 5, 21, 7, {67,72,70}, 2, 0, 1, 6, 7, 1, 3, 3 }, // German/Latin/Switzerland
+ { 96, 39, 94, 0, 0, 472, 472, 6, 1, 0, 2, 3, 4, 5, 6, 11, 12, 14, 15, 113, 129, 23, 38, 7791, 7791, 7845, 7845, 7872, 7872, 231, 244, 0, 5, 22, 22, 2877, 4, 0, 3457, 3465, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 6, 15, 7, 54, 54, 27, 27, 13, 13, 4, 4, 4, 17, 23, 1, 4, 5, 0, 8, 6, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Greek/Greek/Greece
+ { 96, 39, 63, 0, 0, 472, 472, 6, 1, 0, 2, 3, 4, 5, 6, 11, 12, 14, 15, 113, 129, 23, 38, 7791, 7791, 7845, 7845, 7872, 7872, 231, 244, 0, 5, 22, 22, 2877, 4, 0, 3457, 3471, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 6, 15, 7, 54, 54, 27, 27, 13, 13, 4, 4, 4, 17, 23, 1, 4, 5, 0, 8, 6, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Greek/Greek/Cyprus
+ { 97, 66, 183, 0, 0, 0, 0, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 163, 103, 10, 0, 7885, 7885, 7885, 7885, 83, 83, 0, 0, 0, 5, 22, 237, 0, 15, 0, 3477, 3484, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 53, 53, 53, 53, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 7, 8, {80,89,71}, 0, 0, 7, 6, 7, 1, 3, 3 }, // Guarani/Latin/Paraguay
+ { 98, 40, 110, 0, 0, 481, 481, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 265, 129, 367, 383, 7938, 7938, 7990, 7990, 8021, 8021, 0, 0, 466, 5, 22, 120, 2881, 2, 9, 3492, 3499, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 16, 8, 52, 52, 31, 31, 18, 18, 2, 2, 4, 17, 23, 1, 13, 4, 6, 7, 4, {73,78,82}, 2, 1, 7, 7, 7, 1, 2, 3 }, // Gujarati/Gujarati/India
+ { 99, 66, 124, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 8039, 8039, 8100, 8100, 8127, 8127, 235, 248, 0, 5, 22, 176, 991, 2, 9, 3503, 1307, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 61, 61, 27, 27, 13, 13, 6, 3, 4, 17, 23, 3, 17, 4, 6, 8, 5, {75,69,83}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Gusii/Latin/Kenya
+ { 101, 66, 169, 0, 0, 490, 499, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 804, 129, 10, 0, 8140, 8140, 8191, 8191, 8218, 8218, 241, 251, 0, 470, 511, 124, 2894, 15, 0, 3511, 3259, 6, 6, 9, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 13, 5, 51, 51, 27, 27, 13, 13, 6, 5, 5, 41, 47, 1, 15, 5, 0, 5, 8, {78,71,78}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Hausa/Latin/Nigeria
+ { 101, 4, 169, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 163, 103, 10, 0, 8231, 8231, 8287, 8287, 83, 83, 0, 0, 0, 5, 22, 124, 2909, 15, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 56, 56, 30, 30, 13, 13, 2, 2, 4, 17, 23, 1, 6, 5, 0, 0, 0, {78,71,78}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Hausa/Arabic/Nigeria
+ { 101, 4, 222, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 163, 103, 10, 0, 8231, 8231, 8287, 8287, 83, 83, 0, 0, 0, 5, 22, 0, 0, 15, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 56, 56, 30, 30, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 0, 0, {83,68,71}, 2, 1, 6, 5, 6, 1, 3, 3 }, // Hausa/Arabic/Sudan
+ { 101, 66, 92, 0, 0, 490, 499, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 804, 129, 23, 38, 8140, 8140, 8191, 8191, 8218, 8218, 241, 251, 0, 470, 511, 15, 2915, 15, 0, 3511, 3225, 6, 6, 9, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 15, 7, 51, 51, 27, 27, 13, 13, 6, 5, 5, 41, 47, 3, 13, 5, 0, 5, 4, {71,72,83}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Hausa/Latin/Ghana
+ { 101, 66, 170, 0, 0, 490, 499, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 804, 129, 10, 0, 8140, 8140, 8191, 8191, 8218, 8218, 241, 251, 0, 470, 511, 127, 2928, 15, 0, 3511, 3516, 6, 6, 9, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 13, 5, 51, 51, 27, 27, 13, 13, 6, 5, 5, 41, 47, 5, 29, 5, 0, 5, 5, {88,79,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Hausa/Latin/Niger
+ { 102, 66, 248, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 129, 23, 38, 8317, 8317, 8373, 8373, 83, 83, 0, 0, 0, 5, 22, 10, 0, 2, 9, 3521, 3535, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 15, 7, 56, 56, 20, 20, 13, 13, 2, 2, 4, 17, 23, 1, 0, 4, 6, 14, 19, {85,83,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Hawaiian/Latin/United States
+ { 103, 47, 116, 0, 0, 507, 507, 6, 0, 1, 2, 3, 35, 37, 10, 15, 15, 17, 17, 1027, 885, 11, 1, 8393, 8393, 8457, 8457, 8502, 8502, 247, 256, 558, 5, 22, 48, 2957, 70, 77, 3554, 3559, 6, 6, 6, 6, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 18, 8, 12, 4, 64, 64, 45, 45, 20, 20, 6, 5, 4, 17, 23, 1, 7, 7, 9, 5, 5, {73,76,83}, 2, 1, 7, 5, 6, 1, 3, 3 }, // Hebrew/Hebrew/Israel
+ { 105, 29, 110, 0, 0, 513, 522, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 129, 61, 76, 8522, 8522, 8574, 8574, 8605, 8605, 82, 203, 562, 5, 22, 120, 2964, 2, 0, 3564, 664, 6, 6, 9, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 15, 7, 52, 52, 31, 31, 18, 18, 2, 2, 4, 17, 23, 1, 12, 4, 0, 6, 4, {73,78,82}, 2, 1, 7, 7, 7, 1, 2, 3 }, // Hindi/Devanagari/India
+ { 105, 66, 110, 0, 0, 530, 540, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 804, 186, 23, 38, 8623, 8623, 8689, 8689, 8727, 8727, 0, 0, 0, 5, 22, 120, 1381, 2, 0, 3570, 1478, 6, 6, 10, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 66, 66, 38, 38, 21, 21, 2, 2, 5, 17, 23, 1, 12, 4, 0, 13, 5, {73,78,82}, 2, 1, 7, 7, 7, 1, 2, 3 }, // Hindi/Latin/India
+ { 107, 66, 108, 0, 0, 549, 549, 6, 1, 9, 2, 3, 4, 5, 10, 13, 15, 12, 11, 1045, 1064, 11, 1, 8748, 8748, 8799, 8799, 8817, 8817, 253, 261, 566, 5, 22, 238, 2976, 4, 0, 3583, 3589, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 13, 12, 4, 51, 51, 18, 18, 16, 16, 3, 3, 4, 17, 23, 2, 13, 5, 0, 6, 12, {72,85,70}, 2, 0, 1, 6, 7, 2, 3, 3 }, // Hungarian/Latin/Hungary
+ { 108, 66, 109, 0, 0, 289, 289, 6, 1, 0, 2, 3, 4, 5, 10, 13, 14, 18, 16, 404, 885, 10, 0, 8833, 8833, 8913, 8913, 8947, 8947, 256, 264, 570, 5, 22, 160, 2989, 4, 0, 3601, 3609, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 13, 5, 80, 80, 34, 34, 13, 13, 4, 4, 4, 17, 23, 3, 13, 5, 0, 8, 6, {73,83,75}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Icelandic/Latin/Iceland
+ { 109, 66, 258, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 163, 103, 10, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 0, 0, 15, 0, 3615, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 3, 0, {0,0,0}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Ido/Latin/world
+ { 110, 66, 169, 0, 0, 557, 566, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 129, 10, 0, 8960, 8960, 9013, 9013, 83, 83, 260, 268, 0, 5, 22, 124, 3002, 2, 9, 3618, 3622, 6, 6, 9, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 13, 5, 53, 53, 28, 28, 13, 13, 7, 7, 4, 17, 23, 1, 5, 4, 6, 4, 8, {78,71,78}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Igbo/Latin/Nigeria
+ { 111, 66, 83, 0, 0, 0, 0, 6, 1, 9, 2, 3, 4, 5, 10, 14, 15, 16, 17, 1077, 885, 213, 213, 9041, 9110, 9182, 9182, 83, 9209, 267, 275, 0, 5, 22, 22, 405, 4, 0, 3630, 3641, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 12, 4, 69, 72, 27, 27, 13, 13, 3, 3, 4, 17, 23, 1, 4, 5, 0, 11, 5, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Inari Sami/Latin/Finland
+ { 112, 66, 111, 0, 0, 574, 584, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 786, 78, 212, 212, 9222, 9222, 9264, 9264, 9291, 9291, 0, 0, 0, 5, 22, 186, 3007, 2, 0, 1776, 1776, 6, 6, 10, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 13, 5, 42, 42, 27, 27, 13, 13, 2, 2, 4, 17, 23, 2, 16, 4, 0, 9, 9, {73,68,82}, 2, 0, 7, 6, 7, 1, 3, 3 }, // Indonesian/Latin/Indonesia
+ { 114, 66, 258, 0, 0, 414, 414, 6, 1, 0, 2, 3, 4, 5, 10, 16, 17, 14, 15, 1095, 394, 10, 0, 9304, 9304, 9360, 9360, 9387, 9387, 0, 0, 0, 5, 22, 0, 0, 15, 58, 3646, 3657, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 26, 10, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 0, 0, 5, 7, 11, 5, {0,0,0}, 2, 1, 1, 6, 7, 2, 3, 3 }, // Interlingua/Latin/world
+ { 115, 66, 75, 0, 0, 0, 414, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 14, 15, 113, 180, 10, 0, 9400, 9400, 9451, 9451, 9485, 9485, 270, 278, 574, 232, 249, 22, 405, 15, 86, 3662, 3673, 6, 6, 6, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 6, 13, 5, 51, 51, 34, 34, 13, 13, 9, 8, 7, 17, 23, 1, 4, 5, 6, 11, 7, {69,85,82}, 2, 1, 1, 6, 7, 2, 3, 3 }, // Interlingue/Latin/Estonia
+ { 116, 18, 41, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 549, 1121, 61, 76, 9498, 9498, 9498, 9498, 83, 83, 0, 0, 0, 5, 22, 240, 0, 15, 0, 3680, 3686, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 10, 15, 7, 54, 54, 54, 54, 13, 13, 2, 2, 4, 17, 23, 3, 0, 5, 0, 6, 4, {67,65,68}, 2, 0, 7, 6, 7, 1, 3, 3 }, // Inuktitut/Canadian Aboriginal/Canada
+ { 116, 66, 41, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 163, 103, 10, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 240, 0, 15, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 0, 5, 0, 0, 0, {67,65,68}, 2, 0, 7, 6, 7, 1, 3, 3 }, // Inuktitut/Latin/Canada
+ { 118, 66, 114, 0, 0, 445, 445, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 113, 186, 10, 0, 9552, 9552, 9626, 9626, 9662, 9662, 279, 286, 581, 5, 22, 22, 83, 2, 9, 3690, 3697, 6, 6, 10, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 74, 74, 36, 36, 13, 13, 4, 4, 6, 17, 23, 1, 4, 4, 6, 7, 4, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Irish/Latin/Ireland
+ { 118, 66, 246, 0, 0, 445, 445, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 113, 186, 10, 0, 9552, 9552, 9626, 9626, 9662, 9662, 279, 286, 581, 5, 22, 94, 3023, 2, 9, 3690, 3701, 6, 6, 10, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 74, 74, 36, 36, 13, 13, 4, 4, 6, 17, 23, 1, 14, 4, 6, 7, 19, {71,66,80}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Irish/Latin/United Kingdom
+ { 119, 66, 117, 0, 0, 414, 414, 6, 1, 0, 2, 3, 4, 5, 10, 11, 12, 14, 15, 113, 78, 10, 0, 9675, 9675, 9731, 9731, 4694, 4694, 0, 0, 0, 5, 22, 22, 405, 4, 0, 3720, 3728, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 4, 5, 0, 8, 6, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Italian/Latin/Italy
+ { 119, 66, 203, 0, 0, 414, 414, 6, 1, 0, 2, 3, 4, 5, 10, 11, 12, 14, 15, 113, 78, 10, 0, 9675, 9675, 9731, 9731, 4694, 4694, 0, 0, 0, 5, 22, 22, 405, 4, 0, 3720, 3734, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 4, 5, 0, 8, 10, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Italian/Latin/San Marino
+ { 119, 66, 226, 0, 0, 414, 414, 6, 0, 17, 2, 3, 4, 5, 10, 11, 12, 19, 20, 0, 49, 10, 0, 9675, 9675, 9731, 9731, 4694, 4694, 0, 0, 0, 5, 22, 0, 3037, 15, 65, 3720, 3744, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 8, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 15, 5, 5, 8, 8, {67,72,70}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Italian/Latin/Switzerland
+ { 119, 66, 253, 0, 0, 414, 414, 6, 1, 0, 2, 3, 4, 5, 10, 11, 12, 14, 15, 113, 78, 10, 0, 9675, 9675, 9731, 9731, 4694, 4694, 0, 0, 0, 5, 22, 22, 405, 4, 0, 3720, 3752, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 4, 5, 0, 8, 18, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Italian/Latin/Vatican City
+ { 120, 53, 120, 183, 183, 183, 183, 6, 0, 1, 2, 3, 4, 5, 10, 51, 52, 53, 54, 513, 821, 391, 1, 9758, 9758, 9785, 9785, 9785, 9785, 283, 290, 587, 590, 22, 145, 3052, 2, 9, 3770, 3770, 5, 5, 5, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 13, 10, 13, 4, 27, 27, 13, 13, 13, 13, 2, 2, 3, 17, 23, 1, 3, 4, 6, 3, 2, {74,80,89}, 0, 0, 7, 6, 7, 1, 3, 3 }, // Japanese/Japanese/Japan
+ { 121, 66, 111, 0, 0, 593, 603, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 394, 10, 0, 9798, 9798, 9838, 9838, 9866, 9866, 285, 292, 607, 5, 22, 186, 3007, 15, 0, 3773, 3777, 6, 6, 10, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 40, 40, 28, 28, 13, 13, 4, 5, 4, 17, 23, 2, 16, 5, 0, 4, 9, {73,68,82}, 2, 0, 7, 6, 7, 1, 3, 3 }, // Javanese/Latin/Indonesia
+ { 122, 66, 169, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 137, 155, 10, 0, 9879, 9879, 9922, 9922, 83, 83, 0, 0, 0, 5, 22, 124, 3055, 15, 0, 3786, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 13, 5, 43, 43, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 7, 5, 0, 4, 0, {78,71,78}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Jju/Latin/Nigeria
+ { 123, 66, 206, 0, 0, 0, 0, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 14, 15, 113, 129, 10, 0, 9949, 9949, 9998, 9998,10025,10025, 0, 0, 0, 5, 22, 127, 3062, 4, 0, 3790, 3795, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 13, 5, 49, 49, 27, 27, 13, 13, 2, 2, 4, 17, 23, 5, 16, 5, 0, 5, 7, {88,79,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Jola-Fonyi/Latin/Senegal
+ { 124, 66, 43, 0, 0, 143, 143, 6, 1, 9, 2, 3, 4, 5, 10, 14, 15, 16, 17, 1131, 186, 10, 0,10038,10038,10110,10110,10137,10137, 82, 203, 0, 5, 22, 243, 3078, 4, 20, 3802, 3814, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 10, 13, 5, 72, 72, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 18, 5, 7, 12, 10, {67,86,69}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Kabuverdianu/Latin/Cape Verde
+ { 125, 66, 4, 0, 0, 612, 620, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 14, 15, 113, 129, 23, 38,10150,10183,10233,10260,10289,10302, 289, 297, 611, 618, 22, 209, 3096, 0, 0, 3824, 3833, 6, 6, 8, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 15, 7, 33, 50, 27, 29, 13, 13, 7, 9, 7, 21, 23, 2, 14, 4, 0, 9, 8, {68,90,68}, 2, 1, 6, 5, 6, 1, 3, 3 }, // Kabyle/Latin/Algeria
+ { 126, 66, 40, 0, 0, 0, 0, 6, 1, 0, 2, 3, 4, 5, 10, 11, 12, 19, 20, 86, 1158, 10, 0,10315,10315,10315,10315,10368,10368, 0, 0, 0, 5, 22, 11, 3110, 15, 0, 3841, 3845, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 53, 53, 53, 53, 20, 20, 2, 2, 4, 17, 23, 4, 9, 5, 0, 4, 7, {88,65,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Kako/Latin/Cameroon
+ { 127, 66, 95, 0, 0, 627, 627, 6, 1, 0, 2, 3, 48, 5, 63, 12, 11, 20, 19, 86, 103, 212, 212,10388,10388,10485,10485,10512,10512, 0, 0, 0, 5, 22, 160, 3119, 2, 92, 3852, 3863, 6, 6, 11, 11, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 17, 10, 13, 5, 97, 97, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 19, 4, 5, 11, 16, {68,75,75}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Kalaallisut/Latin/Greenland
+ { 128, 66, 124, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0,10525,10525,10577,10577,10604,10604, 296, 306, 0, 5, 22, 176, 3138, 2, 9, 3879, 3887, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 52, 52, 27, 27, 13, 13, 6, 10, 4, 17, 23, 3, 19, 4, 6, 8, 12, {75,69,83}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Kalenjin/Latin/Kenya
+ { 129, 66, 124, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0,10617,10617,10690,10690,10717,10717, 302, 316, 0, 5, 22, 176, 3157, 2, 9, 3899, 1307, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 73, 73, 27, 27, 13, 13, 9, 7, 4, 17, 23, 3, 16, 4, 6, 7, 5, {75,69,83}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Kamba/Latin/Kenya
+ { 130, 56, 110, 0, 0, 638, 650, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 549, 129, 367, 383,10730,10730,10783,10783,10815,10815, 311, 323, 639, 647, 22, 120, 3173, 2, 9, 3906, 3911, 6, 6, 12, 11, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 16, 8, 53, 53, 32, 32, 19, 19, 9, 7, 8, 35, 23, 1, 13, 4, 6, 5, 4, {73,78,82}, 2, 1, 7, 7, 7, 1, 3, 3 }, // Kannada/Kannada/India
+ { 132, 4, 110, 661, 661, 667, 677, 67, 21, 22, 23, 40, 35, 41, 44, 14, 15, 16, 17, 549, 567, 61, 76,10834,10834,10885,10885,10934,10934, 320, 330, 0, 5, 22, 120, 3186, 2, 0, 3915, 3920, 6, 6, 10, 9, 1, 1, 1, 1, 1, 3, 3, 4, 1, 1, 1, 1, 18, 6, 15, 7, 51, 51, 49, 49, 13, 13, 6, 6, 4, 17, 23, 1, 16, 4, 0, 5, 9, {73,78,82}, 2, 1, 7, 7, 7, 1, 3, 3 }, // Kashmiri/Arabic/India
+ { 132, 29, 110, 0, 0, 686, 695, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 129, 127, 127,10947,10996,10947,11045,11092,11092, 326, 336, 0, 5, 22, 120, 3202, 15, 0, 3929, 3934, 6, 6, 9, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 15, 7, 49, 49, 49, 47, 13, 13, 5, 5, 4, 17, 23, 1, 11, 5, 0, 5, 10, {73,78,82}, 2, 1, 7, 7, 7, 1, 3, 3 }, // Kashmiri/Devanagari/India
+ { 133, 27, 123, 0, 0, 0, 703, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 14, 15, 1168, 49, 10, 0,11105,11105,11160,11160,11180,11180, 0, 0, 196, 682, 699, 244, 3213, 4, 0, 3944, 3954, 6, 6, 6, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 22, 8, 13, 5, 55, 55, 20, 20, 13, 13, 2, 2, 4, 17, 23, 1, 17, 5, 0, 10, 9, {75,90,84}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Kazakh/Cyrillic/Kazakhstan
+ { 134, 66, 40, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 163, 103, 10, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 11, 0, 15, 0, 3963, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 4, 0, 5, 0, 6, 0, {88,65,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Kenyang/Latin/Cameroon
+ { 135, 60, 39, 0, 0, 713, 722, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 113, 129, 61, 76,11193,11238,11284,11284,11323,11323, 0, 0, 722, 5, 22, 245, 3230, 0, 45, 3969, 3974, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 6, 15, 7, 45, 46, 39, 39, 13, 13, 2, 2, 2, 17, 23, 1, 11, 4, 6, 5, 7, {75,72,82}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Khmer/Khmer/Cambodia
+ { 136, 66, 99, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 163, 103, 10, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 246, 0, 15, 0, 3981, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 7, 0, {71,84,81}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Kiche/Latin/Guatemala
+ { 137, 66, 124, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0,11336,11336,11398,11398,11425,11425, 331, 341, 0, 5, 22, 176, 3241, 2, 9, 3988, 1307, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 62, 62, 27, 27, 13, 13, 6, 8, 4, 17, 23, 3, 16, 4, 6, 6, 5, {75,69,83}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Kikuyu/Latin/Kenya
+ { 138, 66, 194, 0, 0, 0, 0, 6, 1, 0, 2, 3, 4, 5, 10, 11, 12, 16, 17, 163, 103, 10, 0,11438,11438,11521,11521, 83, 83, 0, 0, 0, 5, 22, 198, 0, 15, 0, 3994, 4005, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 83, 83, 34, 34, 13, 13, 2, 2, 4, 17, 23, 2, 0, 5, 0, 11, 8, {82,87,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Kinyarwanda/Latin/Rwanda
+ { 141, 29, 110, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 113, 283, 61, 76,11555,11555,11555,11555,11605,11623, 337, 349, 724, 5, 22, 120, 2964, 2, 9, 4013, 664, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 6, 15, 7, 50, 50, 50, 50, 18, 19, 4, 4, 4, 17, 23, 1, 12, 4, 6, 6, 4, {73,78,82}, 2, 1, 7, 7, 7, 1, 3, 3 }, // Konkani/Devanagari/India
+ { 142, 63, 218, 0, 0, 731, 731, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 1190, 1208, 404, 127,11642,11642,11669,11669,11669,11669, 341, 353, 728, 5, 22, 247, 3257, 2, 9, 4019, 4022, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 9, 16, 7, 27, 27, 13, 13, 13, 13, 2, 2, 3, 17, 23, 1, 6, 4, 6, 3, 4, {75,82,87}, 0, 0, 7, 6, 7, 1, 3, 3 }, // Korean/Korean/South Korea
+ { 142, 63, 50, 0, 0, 731, 731, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 1190, 1208, 169, 0,11642,11642,11669,11669,11669,11669, 341, 353, 728, 5, 22, 248, 3263, 2, 9, 4019, 4026, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 9, 13, 5, 27, 27, 13, 13, 13, 13, 2, 2, 3, 17, 23, 3, 6, 4, 6, 3, 2, {67,78,89}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Korean/Korean/China
+ { 142, 63, 174, 0, 0, 731, 731, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 1190, 1208, 404, 127,11642,11642,11669,11669,11669,11669, 341, 353, 728, 5, 22, 247, 3269, 2, 9, 4019, 4028, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 9, 16, 7, 27, 27, 13, 13, 13, 13, 2, 2, 3, 17, 23, 1, 16, 4, 6, 3, 11, {75,80,87}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Korean/Korean/North Korea
+ { 144, 66, 145, 0, 0, 0, 0, 6, 0, 9, 2, 3, 4, 5, 10, 14, 15, 16, 17, 113, 129, 10, 0,11682,11682,11735,11735,11762,11762, 343, 355, 0, 5, 22, 127, 3285, 0, 0, 4039, 4054, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 13, 5, 53, 53, 27, 27, 13, 13, 6, 6, 4, 17, 23, 5, 16, 4, 0, 15, 5, {88,79,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Koyraboro Senni/Latin/Mali
+ { 145, 66, 145, 0, 0, 0, 0, 6, 0, 9, 2, 3, 4, 5, 10, 14, 15, 16, 17, 113, 129, 10, 0,11775,11775,11827,11827,11762,11762, 343, 355, 0, 5, 22, 127, 3285, 0, 0, 4059, 4054, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 13, 5, 52, 52, 27, 27, 13, 13, 6, 6, 4, 17, 23, 5, 16, 4, 0, 11, 5, {88,79,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Koyra Chiini/Latin/Mali
+ { 146, 66, 134, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 163, 103, 23, 38, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 10, 0, 15, 0, 4070, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 6, 0, {76,82,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Kpelle/Latin/Liberia
+ { 146, 66, 102, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 163, 103, 10, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 215, 0, 15, 0, 4070, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 2, 0, 5, 0, 6, 0, {71,78,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Kpelle/Latin/Guinea
+ { 148, 66, 239, 0, 0, 738, 738, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 1217, 49, 10, 0,11854,11854,11896,11896,11923,11923, 349, 361, 0, 5, 22, 126, 3301, 4, 20, 4076, 4092, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 10, 13, 5, 42, 42, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 12, 5, 7, 16, 7, {84,82,89}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Kurdish/Latin/Turkey
+ { 149, 66, 40, 0, 0, 0, 0, 6, 1, 9, 2, 3, 4, 5, 10, 13, 15, 11, 12, 113, 129, 10, 0,11936,11936,12024,12024,12053,12053, 351, 363, 0, 5, 22, 11, 3313, 4, 0, 4099, 4105, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 13, 5, 88, 88, 29, 29, 13, 13, 4, 4, 4, 17, 23, 4, 13, 5, 0, 6, 7, {88,65,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Kwasio/Latin/Cameroon
+ { 150, 27, 128, 0, 0, 745, 745, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 13, 14, 1244, 129, 10, 0,12066,12066,12122,12122,12159,12159, 355, 367, 196, 731, 22, 251, 3326, 4, 0, 4112, 4120, 6, 6, 10, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 6, 13, 5, 56, 56, 37, 37, 13, 13, 5, 14, 4, 18, 23, 3, 15, 5, 0, 8, 10, {75,71,83}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Kyrgyz/Cyrillic/Kyrgyzstan
+ { 151, 66, 248, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 549, 567, 23, 38,12172,12172,12172,12172, 83,12258, 0, 0, 0, 5, 22, 10, 0, 15, 0, 4130, 4142, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 15, 7, 86, 86, 86, 86, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 12, 22, {85,83,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Lakota/Latin/United States
+ { 152, 66, 230, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 15, 15, 17, 17, 0, 186, 10, 0,12271,12271,12333,12333,12368,12368, 360, 381, 0, 5, 22, 121, 3341, 15, 0, 4164, 4172, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 62, 62, 35, 35, 13, 13, 3, 3, 4, 17, 23, 3, 22, 5, 0, 8, 9, {84,90,83}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Langi/Latin/Tanzania
+ { 153, 65, 129, 0, 0, 0, 755, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 1267, 129, 420, 1,12381,12381,12437,12437,12472,12472, 363, 384, 0, 5, 22, 254, 3363, 2, 65, 4181, 4181, 6, 6, 6, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 8, 27, 4, 56, 56, 35, 35, 16, 16, 8, 8, 4, 17, 23, 1, 7, 4, 5, 3, 3, {76,65,75}, 0, 0, 7, 6, 7, 1, 3, 3 }, // Lao/Lao/Laos
+ { 154, 66, 253, 0, 0, 406, 406, 6, 1, 9, 2, 3, 4, 5, 10, 14, 15, 16, 17, 1286, 1309, 10, 0,12488,12488,12572,12572, 83, 83, 0, 0, 0, 5, 22, 22, 83, 15, 0, 4184, 4190, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 8, 13, 5, 84, 84, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 4, 5, 0, 6, 16, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Latin/Latin/Vatican City
+ { 155, 66, 131, 0, 0, 267, 267, 6, 1, 9, 2, 3, 4, 5, 10, 14, 15, 16, 17, 1317, 49, 10, 0,12599,12670,12741,12791,12841,12841, 371, 392, 749, 5, 22, 22, 3370, 4, 0, 4206, 4214, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 26, 8, 13, 5, 71, 71, 50, 50, 13, 13, 14, 11, 5, 17, 23, 1, 4, 5, 0, 8, 7, {69,85,82}, 2, 1, 1, 6, 7, 2, 3, 3 }, // Latvian/Latin/Latvia
+ { 158, 66, 57, 0, 0, 764, 764, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 113, 129, 10, 0,12854,12854,12953,12953,12980,12980, 385, 403, 0, 5, 22, 11, 3374, 4, 0, 4221, 4228, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 13, 5, 99, 99, 27, 27, 13, 13, 8, 6, 4, 17, 23, 2, 16, 5, 0, 7, 30, {67,68,70}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Lingala/Latin/Congo - Kinshasa
+ { 158, 66, 7, 0, 0, 764, 764, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 113, 129, 10, 0,12854,12854,12953,12953,12980,12980, 385, 403, 0, 5, 22, 255, 3390, 4, 0, 4221, 4258, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 13, 5, 99, 99, 27, 27, 13, 13, 8, 6, 4, 17, 23, 2, 16, 5, 0, 7, 6, {65,79,65}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Lingala/Latin/Angola
+ { 158, 66, 46, 0, 0, 764, 764, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 113, 129, 10, 0,12854,12854,12953,12953,12980,12980, 385, 403, 0, 5, 22, 11, 3406, 4, 0, 4221, 4264, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 13, 5, 99, 99, 27, 27, 13, 13, 8, 6, 4, 17, 23, 4, 16, 5, 0, 7, 26, {88,65,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Lingala/Latin/Central African Republic
+ { 158, 66, 56, 0, 0, 764, 764, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 113, 129, 10, 0,12854,12854,12953,12953,12980,12980, 385, 403, 0, 5, 22, 11, 3406, 4, 0, 4221, 4290, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 13, 5, 99, 99, 27, 27, 13, 13, 8, 6, 4, 17, 23, 4, 16, 5, 0, 7, 5, {88,65,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Lingala/Latin/Congo - Brazzaville
+ { 160, 66, 137, 0, 0, 773, 773, 6, 1, 9, 2, 3, 48, 5, 63, 13, 14, 13, 14, 1343, 103, 10, 0,12993,12993,13081,13081,13101,13101, 393, 409, 754, 5, 22, 22, 3422, 4, 0, 4295, 4303, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 27, 10, 13, 5, 88, 88, 20, 20, 13, 13, 9, 6, 6, 17, 23, 1, 5, 5, 0, 8, 7, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Lithuanian/Latin/Lithuania
+ { 161, 66, 258, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 163, 103, 10, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 0, 0, 15, 0, 4310, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 11, 0, {0,0,0}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Lojban/Latin/world
+ { 162, 66, 91, 0, 0, 781, 781, 6, 1, 0, 2, 3, 4, 5, 10, 13, 14, 18, 16, 404, 180, 11, 1,13114,13114,13166,13166,13193,13193, 402, 415, 0, 5, 22, 22, 405, 4, 0, 4321, 4335, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 12, 4, 52, 52, 27, 27, 13, 13, 9, 10, 4, 17, 23, 1, 4, 5, 0, 14, 6, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Lower Sorbian/Latin/Germany
+ { 163, 66, 91, 0, 0, 267, 267, 6, 1, 0, 2, 3, 4, 5, 10, 13, 14, 18, 16, 1370, 50, 447, 469,13206,13206,13270,13270, 4510, 4510, 0, 0, 0, 5, 22, 22, 83, 4, 0, 4341, 4355, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 7, 22, 10, 64, 64, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 4, 5, 0, 14, 11, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Low German/Latin/Germany
+ { 163, 66, 165, 0, 0, 267, 267, 6, 1, 0, 2, 3, 4, 5, 10, 13, 14, 18, 16, 1370, 50, 447, 469,13206,13206,13270,13270, 4510, 4510, 0, 0, 0, 5, 22, 22, 83, 4, 0, 4341, 4366, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 7, 22, 10, 64, 64, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 4, 5, 0, 14, 12, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Low German/Latin/Netherlands
+ { 164, 66, 57, 0, 0, 0, 0, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 113, 129, 10, 0,13297,13297,13346,13346,13373,13373, 411, 425, 0, 5, 22, 11, 3427, 0, 0, 4378, 4386, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 13, 5, 49, 49, 27, 27, 13, 13, 5, 6, 4, 17, 23, 2, 17, 4, 0, 8, 16, {67,68,70}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Luba-Katanga/Latin/Congo - Kinshasa
+ { 165, 66, 225, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 163, 103, 10, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 160, 0, 15, 0, 4402, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 2, 0, 5, 0, 15, 0, {83,69,75}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Lule Sami/Latin/Sweden
+ { 165, 66, 175, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 163, 103, 10, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 160, 0, 15, 0, 4402, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 2, 0, 5, 0, 15, 0, {78,79,75}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Lule Sami/Latin/Norway
+ { 166, 66, 124, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0,13386,13386,13454,13454,13481,13481, 416, 431, 0, 5, 22, 176, 3444, 0, 0, 4417, 1307, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 68, 68, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 16, 4, 0, 6, 5, {75,69,83}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Luo/Latin/Kenya
+ { 167, 66, 138, 0, 0, 788, 788, 6, 1, 0, 2, 3, 4, 5, 10, 13, 14, 18, 16, 404, 49, 10, 0,13494,13494,13558,13585, 4510, 4510, 418, 433, 461, 5, 22, 22, 83, 4, 0, 4423, 4423, 6, 6, 10, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 13, 5, 64, 64, 27, 34, 13, 13, 5, 8, 5, 17, 23, 1, 4, 5, 0, 14, 10, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Luxembourgish/Latin/Luxembourg
+ { 168, 66, 124, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 13, 14, 18, 16, 0, 186, 10, 0,13619,13619,13693,13693, 83, 83, 168, 168, 0, 5, 22, 176, 3460, 2, 97, 4437, 1307, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 74, 74, 20, 20, 13, 13, 4, 4, 4, 17, 23, 3, 16, 4, 6, 7, 5, {75,69,83}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Luyia/Latin/Kenya
+ { 169, 27, 140, 0, 0, 150, 150, 6, 1, 0, 2, 3, 4, 5, 10, 13, 14, 18, 16, 0, 180, 10, 0,13713,13713,13766,13766, 3069, 3069, 423, 441, 760, 5, 22, 257, 3476, 4, 0, 4444, 4454, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 13, 5, 53, 53, 34, 34, 13, 13, 7, 5, 5, 17, 23, 4, 16, 5, 0, 10, 18, {77,75,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Macedonian/Cyrillic/Macedonia
+ { 170, 66, 230, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0,13800,13800,13861,13861, 1284, 1284, 430, 446, 0, 5, 22, 121, 3492, 2, 0, 4472, 2268, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 61, 61, 27, 27, 13, 13, 5, 9, 4, 17, 23, 3, 20, 4, 0, 9, 8, {84,90,83}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Machame/Latin/Tanzania
+ { 171, 29, 110, 0, 0, 513, 522, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 129, 61, 76,13888,13888, 8574, 8574, 8605, 8605, 88, 83, 0, 5, 22, 120, 2964, 15, 0, 4481, 664, 6, 6, 9, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 15, 7, 63, 63, 31, 31, 18, 18, 3, 4, 4, 17, 23, 1, 12, 5, 0, 6, 4, {73,78,82}, 2, 1, 7, 7, 7, 1, 3, 3 }, // Maithili/Devanagari/India
+ { 172, 66, 160, 0, 0, 0, 0, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0,13951,13951,14009,14009,14036,14036, 435, 455, 0, 5, 22, 261, 0, 15, 0, 4487, 4492, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 58, 58, 27, 27, 13, 13, 8, 10, 4, 17, 23, 3, 0, 5, 0, 5, 10, {77,90,78}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Makhuwa-Meetto/Latin/Mozambique
+ { 173, 66, 230, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0,14049,14049,14181,14181,14208,14208, 443, 465, 0, 5, 22, 121, 3492, 2, 9, 4502, 2268, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5,132,132, 27, 27, 13, 13, 4, 5, 4, 17, 23, 3, 20, 4, 6, 10, 8, {84,90,83}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Makonde/Latin/Tanzania
+ { 174, 66, 141, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 11, 12, 14, 15, 113, 103, 10, 0,14221,14221,14280,14280,14313,14313, 0, 0, 0, 5, 22, 188, 1515, 2, 0, 4512, 4520, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 59, 59, 33, 33, 13, 13, 2, 2, 4, 17, 23, 2, 6, 4, 0, 8, 12, {77,71,65}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Malagasy/Latin/Madagascar
+ { 175, 74, 110, 0, 0, 798, 811, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 1393, 129, 61, 76,14326,14402,14477,14477,14517,14538, 0, 0, 765, 771, 22, 120, 3512, 2, 9, 4532, 4538, 6, 6, 13, 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 15, 7, 76, 75, 40, 40, 21, 20, 2, 2, 6, 27, 23, 1, 11, 4, 6, 6, 6, {73,78,82}, 2, 1, 7, 7, 7, 1, 2, 3 }, // Malayalam/Malayalam/India
+ { 176, 66, 143, 0, 0, 584, 584, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 79, 23, 38,14558,14558,14600,14600,14627,14627, 447, 470, 749, 5, 22, 192, 3523, 2, 9, 4544, 1875, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 7, 15, 7, 42, 42, 27, 27, 13, 13, 2, 3, 4, 17, 23, 2, 16, 4, 6, 6, 8, {77,89,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Malay/Latin/Malaysia
+ { 176, 4, 35, 0, 0, 0, 0, 6, 1, 0, 2, 3, 4, 5, 10, 15, 14, 17, 16, 91, 79, 61, 76,14640,14640,14640,14640, 83, 83, 0, 0, 0, 5, 22, 10, 3539, 2, 9, 4550, 4560, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 12, 7, 15, 7, 34, 34, 34, 34, 13, 13, 2, 2, 4, 17, 23, 1, 10, 4, 6, 10, 5, {66,78,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Malay/Arabic/Brunei
+ { 176, 4, 143, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 15, 14, 17, 16, 196, 79, 61, 76,14640,14640,14640,14640, 83, 83, 0, 0, 0, 5, 22, 192, 3549, 2, 9, 4550, 4565, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 7, 15, 7, 34, 34, 34, 34, 13, 13, 2, 2, 4, 17, 23, 2, 13, 4, 6, 10, 6, {77,89,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Malay/Arabic/Malaysia
+ { 176, 66, 35, 0, 0, 584, 584, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 91, 79, 23, 38,14558,14558,14600,14600,14627,14627, 447, 470, 749, 5, 22, 10, 3562, 2, 9, 4544, 4571, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 12, 7, 15, 7, 42, 42, 27, 27, 13, 13, 2, 3, 4, 17, 23, 1, 12, 4, 6, 6, 6, {66,78,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Malay/Latin/Brunei
+ { 176, 66, 111, 0, 0, 584, 584, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 786, 78, 212, 212,14558,14558,14600,14600,14627,14627, 447, 470, 749, 5, 22, 186, 3007, 2, 0, 4544, 1776, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 13, 5, 42, 42, 27, 27, 13, 13, 2, 3, 4, 17, 23, 2, 16, 4, 0, 6, 9, {73,68,82}, 2, 0, 7, 6, 7, 1, 3, 3 }, // Malay/Latin/Indonesia
+ { 176, 66, 210, 0, 0, 584, 584, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 79, 23, 38,14558,14558,14600,14600,14627,14627, 447, 470, 749, 5, 22, 10, 3574, 2, 9, 4544, 4577, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 7, 15, 7, 42, 42, 27, 27, 13, 13, 2, 3, 4, 17, 23, 1, 15, 4, 6, 6, 9, {83,71,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Malay/Latin/Singapore
+ { 177, 66, 146, 0, 0, 823, 831, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 1411, 186, 10, 0,14674,14674,14736,14736,14763,14783, 0, 0, 0, 5, 22, 22, 3589, 2, 0, 4586, 1891, 6, 6, 8, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 10, 13, 5, 62, 62, 27, 27, 20, 19, 2, 2, 4, 17, 23, 1, 4, 4, 0, 5, 5, {69,85,82}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Maltese/Latin/Malta
+ { 179, 9, 110, 0, 0, 838, 838, 6, 0, 1, 2, 39, 4, 5, 10, 14, 15, 16, 17, 1434, 129, 61, 76,14802,14802,14802,14802,14860,14885, 449, 473, 0, 5, 22, 120, 3593, 15, 0, 4591, 4599, 6, 6, 11, 11, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 15, 7, 58, 58, 58, 58, 25, 29, 4, 5, 4, 17, 23, 1, 14, 5, 0, 8, 8, {73,78,82}, 2, 1, 7, 7, 7, 1, 3, 3 }, // Manipuri/Bangla/India
+ { 179, 78, 110, 0, 0, 0, 0, 6, 0, 1, 2, 75, 4, 5, 10, 14, 15, 16, 17, 265, 283, 479, 494, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 120, 0, 15, 0, 4607, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 15, 8, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 7, 0, {73,78,82}, 2, 1, 7, 7, 7, 1, 3, 3 }, // Manipuri/Meitei Mayek/India
+ { 180, 66, 115, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 86, 78, 10, 0,14914,14914,14970,14970, 83, 83, 168, 168, 0, 5, 22, 94, 0, 2, 0, 4614, 4619, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 8, 13, 5, 56, 56, 29, 29, 13, 13, 4, 4, 4, 17, 23, 1, 0, 4, 0, 5, 12, {71,66,80}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Manx/Latin/Isle of Man
+ { 181, 66, 167, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 394, 23, 38,14999,14999,15046,15046,15073,15073, 0, 0, 0, 5, 22, 10, 3607, 15, 0, 4631, 4636, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 47, 47, 27, 27, 15, 15, 2, 2, 4, 17, 23, 1, 15, 5, 0, 5, 8, {78,90,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Maori/Latin/New Zealand
+ { 182, 66, 49, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 163, 103, 10, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 10, 0, 15, 0, 4644, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 10, 0, {67,76,80}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Mapuche/Latin/Chile
+ { 183, 29, 110, 0, 0, 849, 849, 6, 0, 1, 2, 49, 4, 5, 10, 14, 15, 16, 17, 265, 129, 61, 76,15088,15088,15140,15140, 8605, 8605, 0, 0, 562, 5, 22, 120, 2964, 2, 9, 4654, 664, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 15, 7, 52, 52, 31, 31, 18, 18, 2, 2, 4, 17, 23, 1, 12, 4, 6, 5, 4, {73,78,82}, 2, 1, 7, 7, 7, 1, 2, 3 }, // Marathi/Devanagari/India
+ { 185, 66, 124, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0,15171,15171,13861,13861,14208,14208, 453, 478, 0, 5, 22, 176, 3622, 2, 9, 1275, 1307, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 57, 57, 27, 27, 13, 13, 9, 6, 4, 17, 23, 3, 18, 4, 6, 3, 5, {75,69,83}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Masai/Latin/Kenya
+ { 185, 66, 230, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0,15171,15171,13861,13861,14208,14208, 453, 478, 0, 5, 22, 121, 3640, 2, 9, 1275, 4659, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 57, 57, 27, 27, 13, 13, 9, 6, 4, 17, 23, 3, 21, 4, 6, 3, 8, {84,90,83}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Masai/Latin/Tanzania
+ { 186, 4, 112, 0, 0, 0, 0, 67, 21, 22, 23, 40, 35, 41, 44, 11, 12, 19, 20, 163, 103, 10, 0, 56, 56, 56, 56, 83, 83, 0, 0, 798, 802, 22, 0, 3661, 15, 0, 4667, 4674, 6, 6, 6, 6, 1, 1, 1, 1, 1, 3, 3, 4, 1, 1, 1, 1, 17, 10, 13, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 39, 23, 0, 10, 5, 0, 7, 5, {73,82,82}, 0, 0, 6, 5, 5, 1, 3, 3 }, // Mazanderani/Arabic/Iran
+ { 188, 66, 124, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0,15228,15228,15278,15278,15305,15305, 462, 484, 0, 5, 22, 176, 991, 2, 9, 4679, 1307, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 50, 50, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 17, 4, 6, 6, 5, {75,69,83}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Meru/Latin/Kenya
+ { 189, 66, 40, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 137, 103, 10, 0,15318,15318,15318,15318,15366,15366, 0, 0, 0, 5, 22, 11, 3671, 15, 0, 4685, 4690, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 10, 13, 5, 48, 48, 48, 48, 20, 20, 2, 2, 4, 17, 23, 4, 5, 5, 0, 5, 7, {88,65,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Meta/Latin/Cameroon
+ { 190, 66, 41, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 163, 103, 23, 38, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 240, 0, 15, 0, 4697, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 0, 5, 0, 11, 0, {67,65,68}, 2, 0, 7, 6, 7, 1, 3, 3 }, // Mohawk/Latin/Canada
+ { 191, 27, 156, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 1452, 596, 98, 0,15386,15428,15470,15470,15470,15470, 464, 486, 196, 841, 22, 264, 3676, 15, 0, 4708, 4714, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 35, 10, 15, 5, 42, 42, 20, 20, 20, 20, 4, 4, 4, 17, 23, 1, 13, 5, 0, 6, 6, {77,78,84}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Mongolian/Cyrillic/Mongolia
+ { 191, 83, 50, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 163, 103, 10, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 248, 3689, 15, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 4, 5, 0, 0, 0, {67,78,89}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Mongolian/Mongolian/China
+ { 191, 83, 156, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 1487, 596, 98, 0,15490,15490,15532,15555,15578,15578, 468, 490, 0, 5, 22, 264, 3693, 2, 0, 4720, 4720, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 36, 10, 15, 5, 42, 42, 23, 23, 23, 22, 4, 5, 4, 17, 23, 1, 8, 4, 0, 6, 6, {77,78,84}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Mongolian/Mongolian/Mongolia
+ { 192, 66, 150, 0, 0, 0, 0, 6, 0, 9, 2, 3, 4, 5, 10, 14, 15, 16, 17, 113, 129, 10, 0,15601,15601,15648,15648,15674,15674, 0, 0, 0, 5, 22, 196, 3701, 15, 0, 4726, 4740, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 13, 5, 47, 47, 26, 26, 13, 13, 2, 2, 4, 17, 23, 2, 14, 5, 0, 14, 5, {77,85,82}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Morisyen/Latin/Mauritius
+ { 193, 66, 40, 0, 0, 0, 0, 6, 1, 0, 2, 3, 4, 5, 10, 11, 12, 14, 15, 113, 129, 10, 0,15687,15687,15760,15760,15787,15787, 472, 495, 0, 5, 22, 11, 3715, 2, 9, 4745, 4751, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 13, 5, 73, 73, 27, 27, 13, 13, 5, 5, 4, 17, 23, 4, 10, 4, 6, 6, 7, {88,65,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Mundang/Latin/Cameroon
+ { 194, 66, 248, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 549, 567, 23, 38,15800,15800,15800,15800, 83, 83, 0, 0, 0, 5, 22, 10, 0, 15, 0, 4758, 964, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 15, 7,106,106,106,106, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 7, 13, {85,83,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Muscogee/Latin/United States
+ { 195, 66, 162, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38,15906,15906,15997,15997,16019,16019, 477, 500, 0, 5, 22, 10, 3725, 2, 0, 4765, 4778, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 91, 91, 22, 22, 13, 13, 7, 5, 4, 17, 23, 1, 15, 4, 0, 13, 8, {78,65,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Nama/Latin/Namibia
+ { 197, 66, 248, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 163, 103, 10, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 179, 0, 15, 0, 4786, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 0, 5, 0, 11, 0, {85,83,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Navajo/Latin/United States
+ { 199, 29, 164, 858, 0, 863, 863, 6, 0, 1, 2, 49, 4, 5, 10, 14, 15, 16, 17, 163, 344, 10, 0,16032,16032,16085,16085,16117,16117, 484, 505, 562, 858, 22, 265, 3740, 15, 0, 4797, 4797, 5, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 13, 5, 53, 53, 32, 32, 17, 17, 9, 7, 4, 19, 23, 4, 14, 5, 0, 6, 5, {78,80,82}, 2, 1, 7, 6, 7, 1, 2, 3 }, // Nepali/Devanagari/Nepal
+ { 199, 29, 110, 858, 0, 863, 863, 6, 0, 1, 2, 49, 4, 5, 10, 14, 15, 16, 17, 163, 344, 61, 76,16032,16032,16085,16085,16117,16117, 484, 505, 562, 858, 22, 120, 3754, 15, 0, 4797, 664, 5, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 15, 7, 53, 53, 32, 32, 17, 17, 9, 7, 4, 19, 23, 1, 14, 5, 0, 6, 4, {73,78,82}, 2, 1, 7, 7, 7, 1, 2, 3 }, // Nepali/Devanagari/India
+ { 201, 66, 40, 0, 0, 0, 0, 6, 1, 0, 2, 3, 4, 5, 10, 11, 12, 14, 15, 1523, 78, 10, 0,16134,16134,16134,16134, 83, 83, 493, 512, 0, 5, 22, 11, 3768, 15, 0, 4803, 4819, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 32, 8, 13, 5,110,110,110,110, 13, 13, 9, 8, 4, 17, 23, 4, 9, 5, 0, 16, 7, {88,65,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Ngiemboon/Latin/Cameroon
+ { 202, 66, 40, 870, 870, 881, 897, 6, 1, 0, 2, 3, 4, 5, 10, 11, 12, 19, 20, 137, 103, 10, 0,16244,16244,16244,16244,16303,16303, 502, 520, 0, 5, 22, 11, 3777, 15, 0, 4826, 4831, 11, 11, 16, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 10, 13, 5, 59, 59, 59, 59, 24, 24, 8, 13, 4, 17, 23, 4, 5, 5, 0, 5, 7, {88,65,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Ngomba/Latin/Cameroon
+ { 203, 66, 169, 0, 0, 906, 915, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0,16327,16327,16378,16378, 83, 83, 510, 533, 877, 5, 22, 124, 3782, 2, 0, 4838, 4852, 6, 6, 9, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 51, 51, 32, 32, 13, 13, 9, 8, 8, 17, 23, 1, 14, 4, 0, 14, 8, {78,71,78}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Nigerian Pidgin/Latin/Nigeria
+ { 204, 90, 102, 0, 0, 0, 0, 6, 0, 76, 2, 77, 4, 5, 10, 14, 15, 16, 17, 163, 103, 10, 0,16410,16410,16470,16502,16536,16536, 519, 541, 0, 5, 22, 269, 3796, 15, 0, 4860, 4863, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 60, 60, 32, 34, 13, 13, 1, 1, 4, 17, 23, 1, 22, 5, 0, 3, 6, {71,78,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Nko/Nko/Guinea
+ { 205, 4, 112, 0, 0, 0, 0, 67, 21, 22, 23, 40, 35, 41, 44, 14, 15, 16, 17, 163, 103, 10, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 0, 0, 15, 0, 4869, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 3, 3, 4, 1, 1, 1, 1, 17, 10, 13, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 11, 0, {73,82,82}, 0, 0, 6, 5, 5, 1, 3, 3 }, // Northern Luri/Arabic/Iran
+ { 205, 4, 113, 0, 0, 0, 0, 67, 21, 22, 23, 40, 35, 41, 44, 14, 15, 16, 17, 163, 103, 61, 76, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 43, 0, 15, 0, 4869, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 3, 3, 4, 1, 1, 1, 1, 17, 10, 15, 7, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 5, 0, 5, 0, 11, 0, {73,81,68}, 0, 0, 6, 5, 6, 1, 3, 3 }, // Northern Luri/Arabic/Iraq
+ { 206, 66, 175, 0, 0, 351, 351, 6, 1, 9, 2, 3, 48, 5, 78, 15, 15, 17, 17, 163, 103, 10, 0,16549,16549,16623,16623,16655,16655, 520, 542, 0, 5, 22, 160, 3818, 4, 0, 4880, 4895, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 17, 10, 13, 5, 74, 74, 32, 32, 13, 13, 11, 13, 4, 17, 23, 2, 14, 5, 0, 15, 5, {78,79,75}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Northern Sami/Latin/Norway
+ { 206, 66, 83, 0, 0, 351, 351, 6, 1, 9, 2, 3, 48, 5, 78, 15, 15, 17, 17, 113, 49, 10, 0,16668,16668,16737,16737,16757,16757, 531, 185, 0, 5, 22, 22, 405, 4, 0, 4880, 4900, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 16, 10, 13, 5, 69, 69, 20, 20, 13, 13, 2, 2, 4, 17, 23, 1, 4, 5, 0, 15, 6, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Northern Sami/Latin/Finland
+ { 206, 66, 225, 0, 0, 351, 351, 6, 1, 9, 2, 3, 48, 5, 78, 15, 15, 17, 17, 163, 103, 10, 0,16549,16549,16623,16623,16655,16655, 520, 542, 0, 5, 22, 160, 3832, 4, 0, 4880, 4906, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 17, 10, 13, 5, 74, 74, 32, 32, 13, 13, 11, 13, 4, 17, 23, 2, 14, 5, 0, 15, 6, {83,69,75}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Northern Sami/Latin/Sweden
+ { 207, 66, 216, 0, 0, 0, 0, 6, 0, 9, 2, 3, 4, 5, 10, 16, 17, 14, 15, 163, 103, 10, 0,16770,16770,16833,16833,16859,16859, 0, 0, 0, 5, 22, 9, 0, 2, 0, 4912, 4928, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 63, 63, 26, 26, 13, 13, 2, 2, 4, 17, 23, 1, 0, 4, 0, 16, 12, {90,65,82}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Northern Sotho/Latin/South Africa
+ { 208, 66, 261, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0,16872,16872,16921,16921,16948,16948, 0, 0, 0, 5, 22, 179, 3846, 2, 9, 4940, 2434, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 49, 49, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 17, 4, 6, 10, 8, {85,83,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // North Ndebele/Latin/Zimbabwe
+ { 209, 66, 175, 0, 0, 289, 289, 6, 1, 9, 2, 3, 48, 5, 10, 11, 12, 16, 17, 698, 49, 10, 0, 4788, 4788,16961,16961, 4874, 4874, 168, 168, 0, 5, 22, 160, 3863, 15, 58, 4950, 4962, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 50, 50, 34, 34, 13, 13, 4, 4, 4, 17, 23, 2, 13, 5, 7, 12, 5, {78,79,75}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Norwegian Bokmal/Latin/Norway
+ { 209, 66, 224, 0, 0, 289, 289, 6, 1, 9, 2, 3, 48, 5, 10, 11, 12, 16, 17, 698, 49, 10, 0, 4788, 4788,16961,16961, 4874, 4874, 168, 168, 0, 5, 22, 160, 3863, 15, 58, 4950, 4967, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 50, 50, 34, 34, 13, 13, 4, 4, 4, 17, 23, 2, 13, 5, 7, 12, 21, {78,79,75}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Norwegian Bokmal/Latin/Svalbard and Jan Mayen
+ { 210, 66, 175, 0, 0, 289, 289, 6, 1, 9, 2, 3, 48, 5, 10, 11, 12, 16, 17, 698, 49, 502, 0,16995,16995,17045,17072, 4874, 4874, 533, 555, 0, 5, 22, 160, 3863, 4, 0, 4988, 5001, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 19, 5, 50, 50, 27, 27, 13, 13, 4, 4, 4, 17, 23, 2, 13, 5, 0, 13, 5, {78,79,75}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Norwegian Nynorsk/Latin/Norway
+ { 211, 66, 219, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 113, 187, 521, 38,17099,17099,17177,17177,17214,17214, 537, 559, 0, 5, 22, 94, 0, 2, 9, 5006, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 9, 15, 7, 78, 78, 37, 37, 13, 13, 2, 2, 4, 17, 23, 1, 0, 4, 6, 9, 0, {83,83,80}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Nuer/Latin/South Sudan
+ { 212, 66, 142, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 163, 103, 23, 38,17227,17227,17293,17293, 83, 83, 0, 0, 0, 5, 22, 0, 1521, 15, 0, 5015, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 66, 66, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 15, 5, 0, 6, 0, {77,87,75}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Nyanja/Latin/Malawi
+ { 213, 66, 243, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 4053, 4053, 4126, 4126, 4153, 4153, 0, 0, 0, 5, 22, 147, 805, 2, 0, 5021, 983, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 73, 73, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 19, 4, 0, 10, 6, {85,71,88}, 0, 0, 1, 7, 7, 1, 3, 3 }, // Nyankole/Latin/Uganda
+ { 214, 66, 84, 0, 0, 414, 414, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 11, 12, 1555, 79, 10, 536,17320,17320,17320,17320,17376,17376, 0, 0, 376, 232, 249, 22, 405, 0, 45, 5031, 807, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 21, 7, 13, 6, 56, 56, 56, 56, 20, 20, 2, 2, 6, 17, 23, 1, 4, 4, 6, 7, 6, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Occitan/Latin/France
+ { 214, 66, 220, 0, 0, 414, 414, 6, 0, 1, 2, 3, 4, 5, 10, 11, 12, 14, 15, 958, 79, 99, 1,17396,17396,17453,17453,17480,17480, 0, 0, 376, 232, 249, 22, 405, 0, 0, 5031, 5038, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 7, 14, 4, 57, 57, 27, 27, 13, 13, 2, 2, 6, 17, 23, 1, 4, 4, 0, 7, 7, {69,85,82}, 2, 1, 1, 6, 7, 2, 3, 3 }, // Occitan/Latin/Spain
+ { 215, 91, 110, 0, 0, 923, 931, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 549, 567, 61, 76,17493,17493,17546,17546,17578,17578, 0, 0, 885, 5, 22, 120, 3876, 2, 9, 5045, 5050, 6, 6, 8, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 15, 7, 53, 53, 32, 32, 17, 17, 2, 2, 5, 17, 23, 1, 12, 4, 6, 5, 4, {73,78,82}, 2, 1, 7, 7, 7, 1, 2, 3 }, // Odia/Odia/India
+ { 220, 66, 77, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 549, 78, 23, 38,17595,17595,17649,17649, 83, 83, 539, 561, 0, 5, 22, 1, 3888, 2, 0, 5054, 5060, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 15, 7, 54, 54, 27, 27, 13, 13, 2, 2, 4, 17, 23, 2, 17, 4, 0, 6, 10, {69,84,66}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Oromo/Latin/Ethiopia
+ { 220, 66, 124, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 549, 78, 10, 0,17595,17595,17649,17649,17676,17676, 539, 561, 0, 5, 22, 176, 0, 2, 0, 5054, 5070, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 13, 5, 54, 54, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 0, 4, 0, 6, 8, {75,69,83}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Oromo/Latin/Kenya
+ { 221, 101, 248, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 549, 567, 61, 76,17689,17689,17689,17689, 83,17869, 0, 0, 0, 5, 22, 10, 0, 15, 0, 5078, 964, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 15, 7,180,180,180,180, 13, 20, 2, 2, 4, 17, 23, 1, 0, 5, 0, 12, 13, {85,83,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Osage/Osage/United States
+ { 222, 27, 90, 0, 0, 938, 938, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 13, 14, 1576, 49, 10, 0,17889,17949,18009,18036,18063,18063, 541, 563, 0, 5, 22, 0, 3905, 15, 0, 5090, 5094, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 8, 13, 5, 60, 60, 27, 27, 13, 13, 15, 15, 4, 17, 23, 1, 3, 5, 0, 4, 11, {71,69,76}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Ossetic/Cyrillic/Georgia
+ { 222, 27, 193, 0, 0, 938, 938, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 13, 14, 1576, 49, 10, 0,17889,17949,18009,18036,18063,18063, 541, 563, 0, 5, 22, 133, 3908, 15, 0, 5090, 5105, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 8, 13, 5, 60, 60, 27, 27, 13, 13, 15, 15, 4, 17, 23, 1, 3, 5, 0, 4, 6, {82,85,66}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Ossetic/Cyrillic/Russia
+ { 226, 66, 62, 0, 0, 143, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 394, 10, 0,18076,18076,18076,18076,18138,18138, 0, 0, 0, 5, 22, 0, 3911, 15, 0, 5111, 5121, 6, 6, 7, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 62, 62, 62, 62, 20, 20, 2, 2, 4, 17, 23, 0, 6, 5, 0, 10, 6, {65,78,71}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Papiamento/Latin/Curacao
+ { 226, 66, 13, 0, 0, 143, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 394, 10, 0,18076,18076,18076,18076,18138,18138, 0, 0, 0, 5, 22, 0, 3917, 15, 0, 5111, 1227, 6, 6, 7, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 62, 62, 62, 62, 20, 20, 2, 2, 4, 17, 23, 0, 15, 5, 0, 10, 5, {65,87,71}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Papiamento/Latin/Aruba
+ { 227, 4, 1, 661, 661, 947, 956, 67, 21, 22, 23, 40, 35, 41, 44, 14, 15, 16, 17, 1599, 505, 99, 1,18158,18158,18158,18158, 83, 83, 556, 578, 890, 5, 22, 270, 3932, 2, 9, 5127, 5131, 6, 6, 9, 8, 1, 1, 1, 1, 1, 3, 3, 4, 1, 1, 1, 1, 20, 8, 14, 4, 38, 38, 38, 38, 13, 13, 4, 4, 5, 17, 23, 1, 6, 4, 6, 4, 9, {65,70,78}, 0, 0, 6, 4, 5, 1, 3, 3 }, // Pashto/Arabic/Afghanistan
+ { 227, 4, 178, 661, 661, 947, 956, 67, 21, 22, 23, 40, 35, 41, 44, 14, 15, 16, 17, 1599, 505, 61, 76,18158,18158,18158,18158, 83, 83, 556, 578, 890, 5, 22, 196, 3938, 2, 9, 5127, 5140, 6, 6, 9, 8, 1, 1, 1, 1, 1, 3, 3, 4, 1, 1, 1, 1, 20, 8, 15, 7, 38, 38, 38, 38, 13, 13, 4, 4, 5, 17, 23, 2, 15, 4, 6, 4, 7, {80,75,82}, 2, 0, 7, 6, 7, 1, 3, 3 }, // Pashto/Arabic/Pakistan
+ { 228, 4, 112, 964, 964, 971, 979, 67, 21, 22, 23, 40, 82, 37, 44, 11, 12, 19, 20, 113, 505, 99, 1,18196,18196,18196,18196,18244,18244, 560, 582, 798, 5, 22, 271, 3953, 103, 109, 5147, 4674, 7, 7, 8, 7, 1, 1, 1, 1, 1, 2, 2, 4, 1, 1, 1, 1, 16, 8, 14, 4, 48, 48, 48, 48, 13, 13, 9, 8, 4, 17, 23, 4, 10, 6, 8, 5, 5, {73,82,82}, 0, 0, 6, 5, 5, 1, 3, 3 }, // Persian/Arabic/Iran
+ { 228, 4, 1, 964, 964, 971, 979, 67, 21, 22, 23, 40, 82, 37, 44, 11, 12, 19, 20, 113, 505, 99, 1,18196,18196,18196,18196,18244,18244, 560, 582, 798, 5, 22, 270, 3963, 15, 109, 5152, 5131, 7, 7, 8, 7, 1, 1, 1, 1, 1, 2, 2, 4, 1, 1, 1, 1, 16, 8, 14, 4, 48, 48, 48, 48, 13, 13, 9, 8, 4, 17, 23, 1, 16, 5, 8, 3, 9, {65,70,78}, 0, 0, 6, 4, 5, 1, 3, 3 }, // Persian/Arabic/Afghanistan
+ { 230, 66, 187, 0, 0, 143, 143, 6, 1, 9, 2, 3, 4, 5, 10, 13, 15, 11, 12, 0, 50, 10, 0,18257,18257,18315,18315,18348,18361, 0, 0, 311, 5, 22, 275, 3979, 4, 20, 5155, 5161, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 9, 13, 5, 58, 58, 33, 33, 13, 13, 2, 2, 5, 17, 23, 2, 12, 5, 7, 6, 6, {80,76,78}, 2, 1, 1, 6, 7, 2, 3, 3 }, // Polish/Latin/Poland
+ { 231, 66, 32, 0, 0, 414, 414, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 958, 186, 10, 0,18374,18374,18452,18452,18486,18486, 0, 0, 0, 5, 22, 9, 3991, 15, 0, 5167, 5176, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 10, 13, 5, 78, 78, 34, 34, 13, 13, 2, 2, 5, 17, 23, 2, 15, 5, 0, 9, 6, {66,82,76}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Portuguese/Latin/Brazil
+ { 231, 66, 7, 0, 0, 414, 414, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 14, 15, 958, 78, 10, 0,18374,18374,18499,18499,18486,18486, 569, 590, 0, 5, 22, 255, 4006, 4, 20, 5167, 5182, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 13, 5, 78, 78, 48, 48, 13, 13, 8, 8, 5, 17, 23, 2, 15, 5, 7, 9, 6, {65,79,65}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Portuguese/Latin/Angola
+ { 231, 66, 43, 0, 0, 414, 414, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 14, 15, 958, 78, 10, 0,18374,18374,18499,18499,18486,18486, 569, 590, 0, 5, 22, 243, 4021, 4, 20, 5167, 5188, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 13, 5, 78, 78, 48, 48, 13, 13, 8, 8, 5, 17, 23, 1, 20, 5, 7, 9, 10, {67,86,69}, 2, 1, 1, 6, 7, 2, 3, 3 }, // Portuguese/Latin/Cape Verde
+ { 231, 66, 73, 0, 0, 414, 414, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 14, 15, 958, 78, 10, 0,18374,18374,18499,18499,18486,18486, 569, 590, 0, 5, 22, 11, 4041, 4, 20, 5167, 5198, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 13, 5, 78, 78, 48, 48, 13, 13, 8, 8, 5, 17, 23, 4, 17, 5, 7, 9, 16, {88,65,70}, 0, 0, 1, 6, 7, 2, 3, 3 }, // Portuguese/Latin/Equatorial Guinea
+ { 231, 66, 101, 0, 0, 414, 414, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 14, 15, 958, 78, 10, 0,18374,18374,18499,18499,18486,18486, 569, 590, 0, 5, 22, 127, 4058, 4, 20, 5167, 5214, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 13, 5, 78, 78, 48, 48, 13, 13, 8, 8, 5, 17, 23, 5, 18, 5, 7, 9, 12, {88,79,70}, 0, 0, 1, 6, 7, 2, 3, 3 }, // Portuguese/Latin/Guinea-Bissau
+ { 231, 66, 138, 0, 0, 414, 414, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 14, 15, 958, 78, 10, 0,18374,18374,18499,18499,18486,18486, 569, 590, 0, 5, 22, 22, 405, 4, 20, 5167, 5226, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 13, 5, 78, 78, 48, 48, 13, 13, 8, 8, 5, 17, 23, 1, 4, 5, 7, 9, 10, {69,85,82}, 2, 1, 1, 6, 7, 2, 3, 3 }, // Portuguese/Latin/Luxembourg
+ { 231, 66, 139, 0, 0, 414, 414, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 14, 15, 958, 78, 23, 38,18374,18374,18499,18499,18486,18486, 569, 590, 0, 5, 22, 151, 4076, 4, 20, 5167, 5236, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 15, 7, 78, 78, 48, 48, 13, 13, 8, 8, 5, 17, 23, 4, 15, 5, 7, 9, 19, {77,79,80}, 2, 1, 7, 6, 7, 2, 3, 3 }, // Portuguese/Latin/Macao
+ { 231, 66, 160, 0, 0, 414, 414, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 14, 15, 958, 78, 10, 0,18374,18374,18499,18499,18486,18486, 569, 590, 0, 5, 22, 261, 4091, 4, 20, 5167, 5255, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 13, 5, 78, 78, 48, 48, 13, 13, 8, 8, 5, 17, 23, 3, 19, 5, 7, 9, 10, {77,90,78}, 2, 1, 7, 6, 7, 2, 3, 3 }, // Portuguese/Latin/Mozambique
+ { 231, 66, 188, 0, 0, 414, 414, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 14, 15, 958, 78, 10, 0,18374,18374,18499,18499,18486,18486, 569, 590, 0, 5, 22, 22, 405, 4, 20, 5265, 5282, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 13, 5, 78, 78, 48, 48, 13, 13, 8, 8, 5, 17, 23, 1, 4, 5, 7, 17, 8, {69,85,82}, 2, 1, 7, 6, 7, 2, 3, 3 }, // Portuguese/Latin/Portugal
+ { 231, 66, 204, 0, 0, 414, 414, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 14, 15, 958, 78, 10, 0,18374,18374,18499,18499,18486,18486, 569, 590, 0, 5, 22, 277, 4110, 4, 20, 5167, 5290, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 13, 5, 78, 78, 48, 48, 13, 13, 8, 8, 5, 17, 23, 2, 28, 5, 7, 9, 19, {83,84,78}, 2, 1, 1, 6, 7, 2, 3, 3 }, // Portuguese/Latin/Sao Tome and Principe
+ { 231, 66, 226, 0, 0, 414, 414, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 14, 15, 958, 78, 10, 0,18374,18374,18499,18499,18486,18486, 569, 590, 0, 5, 22, 0, 4138, 4, 20, 5167, 5309, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 13, 5, 78, 78, 48, 48, 13, 13, 8, 8, 5, 17, 23, 0, 12, 5, 7, 9, 5, {67,72,70}, 2, 0, 1, 6, 7, 2, 3, 3 }, // Portuguese/Latin/Switzerland
+ { 231, 66, 232, 0, 0, 414, 414, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 14, 15, 958, 78, 10, 0,18374,18374,18499,18499,18486,18486, 569, 590, 0, 5, 22, 179, 4150, 4, 20, 5167, 5314, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 13, 5, 78, 78, 48, 48, 13, 13, 8, 8, 5, 17, 23, 3, 24, 5, 7, 9, 11, {85,83,68}, 2, 1, 1, 6, 7, 2, 3, 3 }, // Portuguese/Latin/Timor-Leste
+ { 232, 66, 187, 0, 0, 986, 986, 6, 1, 9, 2, 3, 4, 5, 10, 13, 14, 13, 14, 1619, 49, 10, 0,18547,18547,18615,18615,18642,18642, 577, 598, 0, 5, 22, 275, 0, 4, 0, 5325, 5334, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 13, 5, 68, 68, 27, 27, 13, 13, 10, 14, 4, 17, 23, 2, 0, 5, 0, 9, 4, {80,76,78}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Prussian/Latin/Poland
+ { 233, 41, 110, 0, 0, 994, 994, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 129, 61, 76,18655,18655,18711,18711,18746,18746, 587, 612, 895, 5, 22, 120, 4174, 15, 0, 5338, 5344, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 15, 7, 56, 56, 35, 35, 22, 22, 6, 6, 4, 17, 23, 1, 11, 5, 0, 6, 4, {73,78,82}, 2, 1, 7, 7, 7, 1, 2, 3 }, // Punjabi/Gurmukhi/India
+ { 233, 4, 178, 0, 0, 0, 0, 67, 21, 22, 23, 40, 35, 41, 44, 14, 15, 16, 17, 786, 186, 61, 76,18768,18768,18768,18768, 83, 83, 0, 0, 0, 5, 22, 78, 4185, 15, 0, 5348, 5140, 6, 6, 6, 6, 1, 1, 1, 1, 1, 3, 3, 4, 1, 1, 1, 1, 18, 10, 15, 7, 36, 36, 36, 36, 13, 13, 2, 2, 4, 17, 23, 1, 6, 5, 0, 6, 7, {80,75,82}, 2, 0, 7, 6, 7, 1, 3, 3 }, // Punjabi/Arabic/Pakistan
+ { 234, 66, 184, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 265, 129, 23, 38,18804,18804,18856,18856,18883,18883, 168, 168, 0, 5, 22, 279, 4191, 15, 0, 5354, 5362, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 15, 7, 52, 52, 27, 27, 13, 13, 4, 4, 4, 17, 23, 2, 11, 5, 0, 8, 4, {80,69,78}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Quechua/Latin/Peru
+ { 234, 66, 28, 0, 0, 0, 0, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 265, 129, 23, 38,18804,18804,18856,18856,18883,18883, 168, 168, 0, 5, 22, 281, 4202, 15, 0, 5354, 5366, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 15, 7, 52, 52, 27, 27, 13, 13, 4, 4, 4, 17, 23, 2, 9, 5, 0, 8, 7, {66,79,66}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Quechua/Latin/Bolivia
+ { 234, 66, 70, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 265, 129, 23, 38,18804,18804,18856,18856,18883,18883, 168, 168, 0, 5, 22, 10, 4211, 15, 0, 5354, 5373, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 15, 7, 52, 52, 27, 27, 13, 13, 4, 4, 4, 17, 23, 1, 15, 5, 0, 8, 7, {85,83,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Quechua/Latin/Ecuador
+ { 235, 66, 192, 0, 0, 1003, 1003, 6, 1, 0, 2, 3, 4, 5, 10, 13, 15, 11, 12, 0, 49, 10, 0,18896,18896,18943,18943, 6778, 6778, 168, 168, 899, 5, 22, 283, 4226, 4, 20, 5380, 5386, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 47, 47, 33, 33, 13, 13, 4, 4, 4, 17, 23, 3, 12, 5, 7, 6, 7, {82,79,78}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Romanian/Latin/Romania
+ { 235, 66, 154, 0, 0, 1003, 1003, 6, 1, 0, 2, 3, 4, 5, 10, 13, 15, 11, 12, 0, 49, 10, 0,18896,18896,18976,18976,19003,19003, 168, 168, 899, 5, 22, 18, 4238, 4, 20, 5380, 5393, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 47, 47, 27, 27, 15, 15, 4, 4, 4, 17, 23, 1, 15, 5, 7, 6, 17, {77,68,76}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Romanian/Latin/Moldova
+ { 236, 66, 226, 0, 0, 414, 414, 6, 0, 17, 2, 3, 48, 5, 10, 11, 12, 19, 20, 1646, 394, 10, 0,19018,19018,19073,19073,19095,19095, 0, 0, 0, 5, 22, 0, 4253, 4, 0, 5410, 5419, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 8, 13, 5, 55, 55, 22, 22, 13, 13, 2, 2, 5, 17, 23, 0, 13, 5, 0, 9, 6, {67,72,70}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Romansh/Latin/Switzerland
+ { 237, 66, 230, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0,19108,19108,19172,19172,14208,14208, 593, 618, 0, 5, 22, 121, 4266, 2, 0, 5425, 2268, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 64, 64, 28, 28, 13, 13, 8, 7, 4, 17, 23, 3, 18, 4, 0, 9, 8, {84,90,83}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Rombo/Latin/Tanzania
+ { 238, 66, 38, 0, 0, 0, 0, 6, 1, 0, 2, 3, 4, 5, 10, 15, 15, 17, 17, 113, 129, 10, 0,19200,19200,19288,19288, 83, 83, 601, 625, 0, 5, 22, 182, 4284, 0, 0, 5434, 5442, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 13, 5, 88, 88, 33, 33, 13, 13, 5, 5, 4, 17, 23, 3, 20, 4, 0, 8, 8, {66,73,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Rundi/Latin/Burundi
+ { 239, 27, 193, 0, 0, 150, 150, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 13, 14, 350, 49, 10, 0,19321,19321,19382,19382,19402,19402, 0, 0, 196, 841, 22, 133, 4304, 4, 0, 5450, 5457, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 22, 10, 13, 5, 61, 61, 20, 20, 13, 13, 2, 2, 5, 17, 23, 1, 16, 5, 0, 7, 6, {82,85,66}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Russian/Cyrillic/Russia
+ { 239, 27, 22, 0, 0, 150, 150, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 13, 14, 350, 49, 10, 0,19321,19321,19382,19382,19402,19402, 0, 0, 196, 841, 22, 1, 4320, 4, 0, 5450, 618, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 22, 10, 13, 5, 61, 61, 20, 20, 13, 13, 2, 2, 5, 17, 23, 2, 17, 5, 0, 7, 8, {66,89,78}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Russian/Cyrillic/Belarus
+ { 239, 27, 123, 0, 0, 150, 150, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 13, 14, 350, 49, 10, 0,19321,19321,19382,19382,19402,19402, 0, 0, 196, 841, 22, 244, 4337, 4, 0, 5450, 5463, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 22, 10, 13, 5, 61, 61, 20, 20, 13, 13, 2, 2, 5, 17, 23, 1, 15, 5, 0, 7, 9, {75,90,84}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Russian/Cyrillic/Kazakhstan
+ { 239, 27, 128, 0, 0, 150, 150, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 13, 14, 350, 49, 10, 0,19321,19321,19382,19382,19402,19402, 0, 0, 196, 841, 22, 251, 4352, 4, 0, 5450, 5472, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 22, 10, 13, 5, 61, 61, 20, 20, 13, 13, 2, 2, 5, 17, 23, 3, 14, 5, 0, 7, 8, {75,71,83}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Russian/Cyrillic/Kyrgyzstan
+ { 239, 27, 154, 0, 0, 150, 150, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 13, 14, 350, 49, 10, 0,19321,19321,19382,19382,19402,19402, 0, 0, 196, 841, 22, 18, 4366, 4, 0, 5450, 5480, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 22, 10, 13, 5, 61, 61, 20, 20, 13, 13, 2, 2, 5, 17, 23, 1, 14, 5, 0, 7, 7, {77,68,76}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Russian/Cyrillic/Moldova
+ { 239, 27, 244, 0, 0, 150, 150, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 13, 14, 350, 49, 10, 0,19321,19321,19382,19382,19402,19402, 0, 0, 196, 841, 22, 286, 4380, 4, 0, 5450, 5487, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 22, 10, 13, 5, 61, 61, 20, 20, 13, 13, 2, 2, 5, 17, 23, 1, 17, 5, 0, 7, 7, {85,65,72}, 2, 1, 1, 6, 7, 2, 3, 3 }, // Russian/Cyrillic/Ukraine
+ { 240, 66, 230, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0,13800,13800,13861,13861, 1284, 1284, 430, 446, 0, 5, 22, 121, 3492, 0, 0, 5494, 2268, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 61, 61, 27, 27, 13, 13, 5, 9, 4, 17, 23, 3, 20, 4, 0, 6, 8, {84,90,83}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Rwa/Latin/Tanzania
+ { 241, 66, 74, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 59, 78, 23, 38,19415,19415,19470,19470,19497,19497, 0, 0, 0, 5, 22, 6, 0, 2, 0, 5500, 34, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 8, 15, 7, 55, 55, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 0, 4, 0, 4, 7, {69,82,78}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Saho/Latin/Eritrea
+ { 242, 27, 193, 0, 0, 1011, 1011, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 13, 14, 1669, 344, 10, 0,19510,19510,19580,19580,19600,19600, 606, 630, 903, 908, 22, 133, 4397, 4, 0, 5504, 5513, 6, 6, 11, 11, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 30, 6, 13, 5, 70, 70, 20, 20, 13, 13, 2, 2, 5, 17, 23, 1, 20, 5, 0, 9, 9, {82,85,66}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Sakha/Cyrillic/Russia
+ { 243, 66, 124, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0,19613,19613,19717,19717,19744,19744, 608, 632, 0, 5, 22, 176, 4417, 2, 9, 5522, 1307, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5,104,104, 27, 27, 13, 13, 7, 5, 4, 17, 23, 3, 18, 4, 6, 8, 5, {75,69,83}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Samburu/Latin/Kenya
+ { 245, 66, 46, 0, 0, 0, 0, 6, 1, 0, 2, 3, 4, 5, 10, 11, 12, 14, 15, 113, 129, 10, 0,19757,19757,19822,19822,19849,19849, 615, 637, 0, 5, 22, 11, 4435, 2, 65, 5530, 5535, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 13, 5, 65, 65, 27, 27, 13, 13, 2, 2, 4, 17, 23, 4, 18, 4, 5, 5, 22, {88,65,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Sango/Latin/Central African Republic
+ { 246, 66, 230, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0,19862,19862,19921,19921,19948,19948, 617, 639, 0, 5, 22, 121, 4453, 0, 0, 5557, 5566, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 59, 59, 27, 27, 13, 13, 9, 9, 4, 17, 23, 3, 18, 4, 0, 9, 9, {84,90,83}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Sangu/Latin/Tanzania
+ { 247, 29, 110, 0, 0, 1022, 1032, 6, 0, 1, 2, 49, 4, 5, 10, 14, 15, 16, 17, 0, 129, 61, 76,19961,19961, 8574, 8574, 8605, 8605, 484, 505, 0, 5, 22, 120, 4471, 15, 0, 5575, 5587, 6, 6, 10, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 15, 7, 66, 66, 31, 31, 18, 18, 9, 7, 4, 17, 23, 1, 15, 5, 0, 12, 5, {73,78,82}, 2, 1, 7, 7, 7, 1, 2, 3 }, // Sanskrit/Devanagari/India
+ { 248, 93, 110, 0, 0, 0, 0, 6, 0, 1, 2, 84, 4, 5, 10, 14, 15, 16, 17, 0, 129, 61, 76,20027,20027,20068,20068,20093,20093, 626, 648, 0, 5, 22, 120, 4486, 15, 0, 5592, 5599, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 15, 7, 41, 41, 25, 25, 13, 13, 5, 5, 4, 17, 23, 1, 16, 5, 0, 7, 6, {73,78,82}, 2, 1, 7, 7, 7, 1, 3, 3 }, // Santali/Ol Chiki/India
+ { 248, 29, 110, 0, 0, 0, 0, 6, 0, 1, 2, 49, 4, 5, 10, 14, 15, 16, 17, 0, 129, 61, 76, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 120, 0, 15, 0, 5605, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 15, 7, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 8, 0, {73,78,82}, 2, 1, 7, 7, 7, 1, 3, 3 }, // Santali/Devanagari/India
+ { 249, 66, 117, 0, 0, 414, 414, 6, 1, 0, 2, 3, 4, 5, 10, 11, 12, 14, 15, 1699, 186, 10, 0,20106,20106,20160,20160,20187,20187, 0, 0, 0, 5, 22, 22, 4502, 4, 0, 5613, 813, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 31, 10, 13, 5, 54, 54, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 4, 5, 0, 5, 6, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Sardinian/Latin/Italy
+ { 251, 66, 160, 0, 0, 0, 0, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 958, 129, 10, 0,20200,20200,20254,20254,20281,20281, 0, 0, 0, 5, 22, 261, 4506, 0, 0, 5618, 5255, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 13, 5, 54, 54, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 21, 4, 0, 4, 10, {77,90,78}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Sena/Latin/Mozambique
+ { 252, 27, 207, 0, 0, 150, 150, 6, 1, 0, 2, 3, 4, 5, 10, 13, 14, 16, 16, 404, 454, 10, 0,20294,20294,20345,20345, 2891, 2891, 0, 0, 925, 5, 22, 0, 4527, 4, 20, 5622, 5628, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 7, 13, 5, 51, 51, 27, 27, 13, 13, 2, 2, 7, 17, 23, 0, 12, 5, 7, 6, 6, {82,83,68}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Serbian/Cyrillic/Serbia
+ { 252, 27, 29, 0, 0, 150, 150, 6, 1, 0, 2, 3, 4, 5, 10, 13, 14, 16, 16, 404, 454, 10, 0, 2809, 2809, 2864, 2864, 2891, 2891, 104, 653, 925, 5, 22, 137, 4539, 4, 20, 5622, 713, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 7, 13, 5, 55, 55, 27, 27, 13, 13, 11, 8, 7, 17, 23, 2, 40, 5, 7, 6, 19, {66,65,77}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Serbian/Cyrillic/Bosnia and Herzegovina
+ { 252, 27, 126, 0, 0, 150, 150, 6, 1, 0, 2, 3, 4, 5, 10, 13, 14, 16, 16, 404, 454, 10, 0,20294,20294,20345,20345, 2891, 2891, 0, 0, 925, 5, 22, 22, 4579, 4, 20, 5622, 5634, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 7, 13, 5, 51, 51, 27, 27, 13, 13, 2, 2, 7, 17, 23, 1, 4, 5, 7, 6, 6, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Serbian/Cyrillic/Kosovo
+ { 252, 27, 157, 0, 0, 150, 150, 6, 1, 0, 2, 3, 4, 5, 10, 13, 14, 16, 16, 404, 454, 10, 0,20372,20372,20345,20345, 2891, 2891, 104, 653, 925, 5, 22, 22, 4579, 4, 20, 5622, 5640, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 7, 13, 5, 54, 54, 27, 27, 13, 13, 11, 8, 7, 17, 23, 1, 4, 5, 7, 6, 9, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Serbian/Cyrillic/Montenegro
+ { 252, 66, 29, 0, 0, 143, 143, 6, 1, 0, 2, 3, 4, 5, 10, 13, 14, 16, 16, 404, 454, 10, 0, 2699, 2699, 2756, 2756, 2783, 2783, 631, 661, 218, 5, 22, 135, 597, 4, 20, 5649, 686, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 7, 13, 5, 57, 57, 27, 27, 13, 13, 11, 8, 7, 17, 23, 2, 40, 5, 7, 6, 19, {66,65,77}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Serbian/Latin/Bosnia and Herzegovina
+ { 252, 66, 126, 0, 0, 143, 143, 6, 1, 0, 2, 3, 4, 5, 10, 13, 14, 16, 16, 404, 454, 10, 0,20426,20426,20479,20479, 2783, 2783, 0, 0, 218, 5, 22, 22, 4583, 4, 20, 5649, 5655, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 7, 13, 5, 53, 53, 27, 27, 13, 13, 2, 2, 7, 17, 23, 1, 4, 5, 7, 6, 6, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Serbian/Latin/Kosovo
+ { 252, 66, 157, 0, 0, 143, 143, 6, 1, 0, 2, 3, 4, 5, 10, 13, 14, 16, 16, 404, 454, 10, 0,20506,20506,20479,20479, 2783, 2783, 631, 661, 218, 5, 22, 22, 4583, 4, 20, 5649, 5661, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 7, 13, 5, 56, 56, 27, 27, 13, 13, 11, 8, 7, 17, 23, 1, 4, 5, 7, 6, 9, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Serbian/Latin/Montenegro
+ { 252, 66, 207, 0, 0, 143, 143, 6, 1, 0, 2, 3, 4, 5, 10, 13, 14, 16, 16, 404, 454, 10, 0,20426,20426,20479,20479, 2783, 2783, 0, 0, 218, 5, 22, 0, 4587, 4, 20, 5649, 5670, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 7, 13, 5, 53, 53, 27, 27, 13, 13, 2, 2, 7, 17, 23, 0, 12, 5, 7, 6, 6, {82,83,68}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Serbian/Latin/Serbia
+ { 253, 66, 230, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0,20562,20562,20624,20624,20651,20651, 642, 669, 0, 5, 22, 121, 4599, 0, 0, 5676, 2268, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 62, 62, 27, 27, 13, 13, 5, 8, 4, 17, 23, 3, 20, 4, 0, 9, 8, {84,90,83}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Shambala/Latin/Tanzania
+ { 254, 66, 261, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 15, 15, 17, 17, 163, 103, 10, 0,20664,20664,20718,20718,20745,20745, 0, 0, 0, 5, 22, 179, 4619, 2, 9, 5685, 2434, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 54, 54, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 15, 4, 6, 8, 8, {85,83,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Shona/Latin/Zimbabwe
+ { 255, 141, 50, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 163, 103, 10, 0,20758,20758,20785,20785,20805,20805, 647, 677, 0, 5, 22, 150, 0, 15, 0, 5693, 5696, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 27, 27, 20, 20, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 3, 2, {67,78,89}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Sichuan Yi/Yi/China
+ { 256, 66, 117, 0, 0, 0, 0, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 163, 103, 10, 0,20818,20818,20818,20818, 83, 83, 0, 0, 0, 5, 22, 22, 0, 15, 0, 5698, 3728, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 62, 62, 62, 62, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 9, 6, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Sicilian/Latin/Italy
+ { 257, 66, 77, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 59, 78, 23, 38,20880,20880,20930,20930,20957,20957, 0, 0, 0, 5, 22, 1, 0, 2, 0, 5707, 5718, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 8, 15, 7, 50, 50, 27, 27, 13, 13, 2, 2, 4, 17, 23, 2, 0, 4, 0, 11, 11, {69,84,66}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Sidamo/Latin/Ethiopia
+ { 258, 66, 187, 0, 0, 143, 143, 6, 1, 9, 2, 3, 4, 5, 10, 13, 15, 12, 11, 0, 49, 10, 0,20970,20970,21030,21030,13193,13193, 649, 679, 311, 5, 22, 275, 0, 15, 0, 5729, 5161, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 60, 60, 27, 27, 13, 13, 11, 11, 5, 17, 23, 2, 0, 5, 0, 7, 6, {80,76,78}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Silesian/Latin/Poland
+ { 259, 4, 178, 0, 0, 1041, 1049, 67, 21, 22, 23, 25, 26, 28, 59, 14, 15, 16, 17, 549, 103, 61, 76,21057,21057,21057,21057,21091,21091, 660, 690, 932, 938, 22, 196, 4634, 4, 0, 5736, 5740, 6, 6, 8, 7, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 18, 10, 15, 7, 34, 34, 34, 34, 30, 30, 11, 11, 6, 25, 23, 2, 12, 5, 0, 4, 7, {80,75,82}, 2, 0, 7, 6, 7, 1, 3, 3 }, // Sindhi/Arabic/Pakistan
+ { 259, 29, 110, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 549, 567, 61, 76,21121,21148,21189,21211,21239,21239, 671, 701, 0, 5, 22, 120, 4646, 15, 0, 5747, 664, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 15, 7, 27, 41, 22, 28, 20, 20, 8, 6, 4, 17, 23, 1, 17, 5, 0, 6, 4, {73,78,82}, 2, 1, 7, 7, 7, 1, 3, 3 }, // Sindhi/Devanagari/India
+ { 260, 119, 221, 0, 0, 1056, 1065, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 163, 103, 212, 212,21259,21259,21320,21320,21358,21358, 679, 707, 963, 968, 22, 287, 4663, 2, 9, 5753, 5758, 6, 6, 9, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 61, 61, 38, 38, 18, 18, 5, 4, 5, 42, 23, 3, 17, 4, 6, 5, 11, {76,75,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Sinhala/Sinhala/Sri Lanka
+ { 261, 66, 83, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 163, 103, 10, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 22, 0, 15, 0, 5769, 5779, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 10, 12, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Skolt Sami/Latin/Finland
+ { 262, 66, 212, 0, 0, 781, 282, 6, 1, 9, 2, 3, 4, 5, 6, 13, 14, 18, 16, 698, 423, 11, 1,21376,21376,21427,21427,21447,21447, 0, 0, 311, 5, 22, 22, 405, 4, 20, 5791, 5801, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 4, 51, 51, 20, 20, 13, 13, 2, 2, 5, 17, 23, 1, 4, 5, 7, 10, 9, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Slovak/Latin/Slovakia
+ { 263, 66, 213, 0, 0, 1073, 1073, 6, 1, 0, 2, 3, 48, 5, 6, 13, 14, 18, 16, 404, 423, 10, 0,21460,21460,21511,21511,21545,21545, 172, 711, 50, 5, 22, 22, 4680, 4, 20, 5810, 5821, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 13, 5, 51, 51, 34, 34, 13, 13, 4, 4, 4, 17, 23, 1, 4, 5, 7, 11, 9, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Slovenian/Latin/Slovenia
+ { 264, 66, 243, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0,21558,21558,21622,21622,21656,21656, 684, 715, 0, 5, 22, 147, 2829, 4, 0, 5830, 3330, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 64, 64, 34, 34, 13, 13, 6, 6, 4, 17, 23, 3, 19, 5, 0, 7, 7, {85,71,88}, 0, 0, 1, 7, 7, 1, 3, 3 }, // Soga/Latin/Uganda
+ { 265, 66, 215, 0, 0, 1081, 1081, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 549, 78, 23, 38,21669,21669,21715,21715,21746,21746, 690, 721, 1010, 1016, 22, 93, 4684, 2, 9, 5837, 5845, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 15, 7, 46, 46, 31, 31, 14, 14, 2, 2, 6, 17, 23, 1, 20, 4, 6, 8, 10, {83,79,83}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Somali/Latin/Somalia
+ { 265, 66, 67, 0, 0, 1081, 1081, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 549, 78, 23, 38,21669,21669,21715,21715,21746,21746, 690, 721, 1010, 1016, 22, 3, 4704, 2, 9, 5837, 5855, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 15, 7, 46, 46, 31, 31, 14, 14, 2, 2, 6, 17, 23, 3, 13, 4, 6, 8, 7, {68,74,70}, 0, 0, 6, 6, 7, 1, 3, 3 }, // Somali/Latin/Djibouti
+ { 265, 66, 77, 0, 0, 1081, 1081, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 549, 78, 23, 38,21669,21669,21715,21715,21746,21746, 690, 721, 1010, 1016, 22, 1, 4717, 2, 9, 5837, 5862, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 15, 7, 46, 46, 31, 31, 14, 14, 2, 2, 6, 17, 23, 2, 15, 4, 6, 8, 8, {69,84,66}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Somali/Latin/Ethiopia
+ { 265, 66, 124, 0, 0, 1081, 1081, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 549, 78, 10, 0,21669,21669,21715,21715,21746,21746, 690, 721, 1010, 1016, 22, 176, 4732, 2, 9, 5837, 1307, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 13, 5, 46, 46, 31, 31, 14, 14, 2, 2, 6, 17, 23, 3, 15, 4, 6, 8, 5, {75,69,83}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Somali/Latin/Kenya
+ { 266, 4, 112, 0, 0, 0, 0, 67, 21, 22, 23, 25, 26, 28, 59, 11, 12, 19, 20, 163, 103, 10, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 0, 0, 4, 0, 5870, 0, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 13, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 11, 0, {73,82,82}, 0, 0, 6, 5, 5, 1, 3, 3 }, // Southern Kurdish/Arabic/Iran
+ { 266, 4, 113, 0, 0, 0, 0, 67, 21, 22, 23, 25, 26, 28, 59, 11, 12, 19, 20, 163, 103, 10, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 0, 0, 4, 0, 5870, 0, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 13, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 11, 0, {73,81,68}, 0, 0, 6, 5, 6, 1, 3, 3 }, // Southern Kurdish/Arabic/Iraq
+ { 267, 66, 225, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 163, 103, 10, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 160, 0, 15, 0, 5881, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 2, 0, 5, 0, 19, 0, {83,69,75}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Southern Sami/Latin/Sweden
+ { 267, 66, 175, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 163, 103, 10, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 160, 0, 15, 0, 5881, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 2, 0, 5, 0, 19, 0, {78,79,75}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Southern Sami/Latin/Norway
+ { 268, 66, 216, 0, 0, 0, 0, 6, 1, 9, 2, 3, 4, 5, 10, 16, 17, 14, 15, 163, 103, 10, 0,21760,21760,21820,21820, 83, 83, 0, 0, 0, 5, 22, 9, 0, 2, 0, 4912, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 60, 60, 26, 26, 13, 13, 2, 2, 4, 17, 23, 1, 0, 4, 0, 7, 0, {90,65,82}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Southern Sotho/Latin/South Africa
+ { 268, 66, 133, 0, 0, 0, 0, 6, 1, 9, 2, 3, 4, 5, 10, 16, 17, 14, 15, 163, 103, 23, 38,21760,21760,21820,21820, 83, 83, 0, 0, 0, 5, 22, 9, 0, 2, 0, 4912, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 60, 60, 26, 26, 13, 13, 2, 2, 4, 17, 23, 1, 0, 4, 0, 7, 0, {90,65,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Southern Sotho/Latin/Lesotho
+ { 269, 66, 216, 0, 0, 0, 0, 6, 1, 9, 2, 3, 4, 5, 10, 16, 17, 14, 15, 163, 103, 10, 0,21846,21846,21911,21911, 83, 83, 0, 0, 0, 5, 22, 9, 0, 2, 0, 4940, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 65, 65, 26, 26, 13, 13, 2, 2, 4, 17, 23, 1, 0, 4, 0, 10, 0, {90,65,82}, 2, 1, 7, 6, 7, 1, 3, 3 }, // South Ndebele/Latin/South Africa
+ { 270, 66, 220, 0, 0, 68, 68, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 958, 129, 99, 1,21937,21937,21989,21989,18883,18883, 132, 128, 0, 5, 22, 22, 405, 4, 0, 5900, 455, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 14, 4, 52, 52, 27, 27, 13, 13, 5, 5, 5, 17, 23, 1, 4, 5, 0, 17, 6, {69,85,82}, 2, 1, 1, 6, 7, 2, 3, 3 }, // Spanish/Latin/Spain
+ { 270, 66, 11, 0, 0, 68, 68, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 958, 129, 23, 38,21937,21937,21989,21989, 6778, 6778, 132, 128, 0, 5, 22, 10, 4747, 15, 58, 5900, 5917, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 15, 7, 52, 52, 27, 27, 13, 13, 5, 5, 5, 17, 23, 1, 14, 5, 7, 7, 9, {65,82,83}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Spanish/Latin/Argentina
+ { 270, 66, 24, 0, 0, 68, 68, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 958, 129, 10, 0,21937,21937,21989,21989, 6778, 6778, 168, 168, 0, 5, 22, 10, 4761, 2, 0, 5900, 5926, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 13, 5, 52, 52, 27, 27, 13, 13, 4, 4, 5, 17, 23, 1, 14, 4, 0, 7, 6, {66,90,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Spanish/Latin/Belize
+ { 270, 66, 28, 0, 0, 68, 68, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 958, 129, 23, 38,21937,21937,21989,21989, 6778, 6778, 132, 128, 0, 5, 22, 281, 4775, 2, 0, 5900, 5366, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 15, 7, 52, 52, 27, 27, 13, 13, 5, 5, 5, 17, 23, 2, 9, 4, 0, 7, 7, {66,79,66}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Spanish/Latin/Bolivia
+ { 270, 66, 32, 0, 0, 68, 68, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 958, 129, 10, 0,21937,21937,21989,21989, 6778, 6778, 168, 168, 0, 5, 22, 9, 4784, 2, 0, 5900, 5176, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 13, 5, 52, 52, 27, 27, 13, 13, 4, 4, 5, 17, 23, 2, 14, 4, 0, 7, 6, {66,82,76}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Spanish/Latin/Brazil
+ { 270, 66, 42, 0, 0, 68, 68, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 958, 129, 99, 1,21937,21937,21989,21989,18883,18883, 132, 128, 0, 5, 22, 22, 405, 4, 0, 5900, 5932, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 14, 4, 52, 52, 27, 27, 13, 13, 5, 5, 5, 17, 23, 1, 4, 5, 0, 7, 8, {69,85,82}, 2, 1, 1, 6, 7, 2, 3, 3 }, // Spanish/Latin/Canary Islands
+ { 270, 66, 47, 0, 0, 68, 68, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 958, 129, 99, 1,21937,21937,21989,21989,18883,18883, 132, 128, 0, 5, 22, 22, 405, 4, 0, 5900, 5940, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 14, 4, 52, 52, 27, 27, 13, 13, 5, 5, 5, 17, 23, 1, 4, 5, 0, 7, 15, {69,85,82}, 2, 1, 1, 6, 7, 2, 3, 3 }, // Spanish/Latin/Ceuta and Melilla
+ { 270, 66, 49, 0, 0, 68, 68, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 958, 394, 23, 38,21937,21937,21989,21989, 6778, 6778, 132, 128, 0, 5, 22, 10, 4798, 2, 65, 5900, 5955, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 15, 7, 52, 52, 27, 27, 13, 13, 5, 5, 5, 17, 23, 1, 12, 4, 5, 7, 5, {67,76,80}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Spanish/Latin/Chile
+ { 270, 66, 54, 0, 0, 68, 68, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 958, 79, 23, 38,21937,21937,21989,21989, 9387,22016, 132, 128, 0, 5, 22, 10, 4810, 15, 0, 5900, 5960, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 7, 15, 7, 52, 52, 27, 27, 13, 13, 5, 5, 5, 17, 23, 1, 15, 5, 0, 7, 8, {67,79,80}, 2, 0, 7, 6, 7, 1, 3, 3 }, // Spanish/Latin/Colombia
+ { 270, 66, 59, 0, 0, 68, 68, 6, 1, 9, 2, 3, 4, 5, 10, 14, 15, 16, 17, 958, 129, 23, 38,21937,21937,21989,21989, 6778, 6778, 132, 128, 0, 5, 22, 290, 4825, 2, 0, 5900, 5968, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 15, 7, 52, 52, 27, 27, 13, 13, 5, 5, 5, 17, 23, 1, 19, 4, 0, 7, 10, {67,82,67}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Spanish/Latin/Costa Rica
+ { 270, 66, 61, 0, 0, 68, 68, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 958, 129, 23, 38,21937,21937,21989,21989, 6778, 6778, 168, 168, 0, 5, 22, 10, 4844, 2, 0, 5900, 5978, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 15, 7, 52, 52, 27, 27, 13, 13, 4, 4, 5, 17, 23, 1, 11, 4, 0, 7, 4, {67,85,80}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Spanish/Latin/Cuba
+ { 270, 66, 69, 0, 0, 68, 68, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 958, 129, 23, 38,21937,21937,21989,21989, 6778, 6778, 132, 128, 0, 5, 22, 291, 4855, 2, 9, 5900, 5982, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 15, 7, 52, 52, 27, 27, 13, 13, 5, 5, 5, 17, 23, 3, 15, 4, 6, 7, 20, {68,79,80}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Spanish/Latin/Dominican Republic
+ { 270, 66, 70, 0, 0, 68, 68, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 958, 129, 23, 38,21937,21937,21989,21989, 6778, 6778, 132, 128, 0, 5, 22, 10, 4870, 2, 65, 5900, 5373, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 15, 7, 52, 52, 27, 27, 13, 13, 5, 5, 5, 17, 23, 1, 20, 4, 5, 7, 7, {85,83,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Spanish/Latin/Ecuador
+ { 270, 66, 72, 0, 0, 68, 68, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 958, 129, 23, 38,21937,21937,21989,21989, 6778, 6778, 132, 128, 0, 5, 22, 10, 4870, 2, 0, 5900, 6002, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 15, 7, 52, 52, 27, 27, 13, 13, 5, 5, 5, 17, 23, 1, 20, 4, 0, 7, 11, {85,83,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Spanish/Latin/El Salvador
+ { 270, 66, 73, 0, 0, 68, 68, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 958, 129, 99, 1,21937,21937,21989,21989,18883,18883, 132, 128, 0, 5, 22, 11, 4890, 2, 0, 5900, 6013, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 14, 4, 52, 52, 27, 27, 13, 13, 5, 5, 5, 17, 23, 4, 28, 4, 0, 7, 17, {88,65,70}, 0, 0, 1, 6, 7, 2, 3, 3 }, // Spanish/Latin/Equatorial Guinea
+ { 270, 66, 99, 0, 0, 68, 68, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 958, 79, 23, 38,21937,21937,21989,21989, 6778, 6778, 132, 128, 0, 5, 22, 246, 4918, 2, 0, 5900, 6030, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 7, 15, 7, 52, 52, 27, 27, 13, 13, 5, 5, 5, 17, 23, 1, 7, 4, 0, 7, 9, {71,84,81}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Spanish/Latin/Guatemala
+ { 270, 66, 106, 0, 0, 68, 68, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 1730, 129, 23, 38,21937,21937,21989,21989, 6778, 6778, 132, 128, 0, 5, 22, 18, 4925, 2, 0, 5900, 6039, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 15, 7, 52, 52, 27, 27, 13, 13, 5, 5, 5, 17, 23, 1, 17, 4, 0, 7, 8, {72,78,76}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Spanish/Latin/Honduras
+ { 270, 66, 130, 0, 0, 68, 68, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 958, 129, 23, 38,21937,21937,21989,21989, 6778, 6778, 168, 168, 0, 5, 22, 0, 0, 2, 0, 6047, 6070, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 15, 7, 52, 52, 27, 27, 13, 13, 4, 4, 5, 17, 23, 0, 0, 4, 0, 23, 13, {0,0,0}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Spanish/Latin/Latin America
+ { 270, 66, 152, 0, 0, 68, 68, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 958, 78, 23, 38,21937,21937,21989,21989, 6778, 6778, 168, 168, 0, 5, 22, 10, 4942, 2, 0, 6083, 6100, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 15, 7, 52, 52, 27, 27, 13, 13, 4, 4, 5, 17, 23, 1, 13, 4, 0, 17, 6, {77,88,78}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Spanish/Latin/Mexico
+ { 270, 66, 168, 0, 0, 68, 68, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 958, 129, 23, 38,21937,21937,21989,21989, 6778, 6778, 132, 128, 0, 5, 22, 294, 4955, 2, 0, 5900, 6106, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 15, 7, 52, 52, 27, 27, 13, 13, 5, 5, 5, 17, 23, 2, 20, 4, 0, 7, 9, {78,73,79}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Spanish/Latin/Nicaragua
+ { 270, 66, 181, 0, 0, 68, 68, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 958, 1121, 23, 38,21937,21937,21989,21989, 6778, 6778, 132, 128, 0, 5, 22, 296, 4975, 2, 0, 5900, 6115, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 15, 7, 52, 52, 27, 27, 13, 13, 5, 5, 5, 17, 23, 3, 15, 4, 0, 7, 6, {80,65,66}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Spanish/Latin/Panama
+ { 270, 66, 183, 0, 0, 68, 68, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 958, 129, 23, 38,21937,21937,21989,21989, 6778, 6778, 132, 128, 0, 5, 22, 299, 4990, 15, 86, 5900, 6121, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 15, 7, 52, 52, 27, 27, 13, 13, 5, 5, 5, 17, 23, 3, 17, 5, 6, 7, 8, {80,89,71}, 0, 0, 7, 6, 7, 1, 3, 3 }, // Spanish/Latin/Paraguay
+ { 270, 66, 184, 0, 0, 68, 68, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 958, 79, 23, 38,21937,21937,21989,21989, 6778, 6778, 132, 128, 0, 5, 22, 279, 5007, 15, 0, 5900, 5362, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 7, 15, 7, 52, 52, 27, 27, 13, 13, 5, 5, 5, 17, 23, 2, 11, 5, 0, 7, 4, {80,69,78}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Spanish/Latin/Peru
+ { 270, 66, 185, 0, 0, 68, 68, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 958, 129, 23, 38,21937,21937,21989,21989,18883,18883, 132, 128, 0, 5, 22, 146, 5018, 4, 0, 5900, 6129, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 15, 7, 52, 52, 27, 27, 13, 13, 5, 5, 5, 17, 23, 1, 13, 5, 0, 7, 9, {80,72,80}, 2, 1, 7, 6, 7, 2, 3, 3 }, // Spanish/Latin/Philippines
+ { 270, 66, 189, 0, 0, 68, 68, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 958, 1121, 23, 38,21937,21937,21989,21989, 6778, 6778, 132, 128, 0, 5, 22, 10, 4870, 2, 0, 5900, 2080, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 15, 7, 52, 52, 27, 27, 13, 13, 5, 5, 5, 17, 23, 1, 20, 4, 0, 7, 11, {85,83,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Spanish/Latin/Puerto Rico
+ { 270, 66, 248, 0, 0, 68, 68, 6, 0, 1, 2, 3, 4, 5, 10, 11, 12, 14, 15, 958, 129, 23, 38,21937,21937,21989,21989, 6778, 6778, 168, 168, 0, 5, 22, 10, 4870, 2, 0, 5900, 6138, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 15, 7, 52, 52, 27, 27, 13, 13, 4, 4, 5, 17, 23, 1, 20, 4, 0, 7, 14, {85,83,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Spanish/Latin/United States
+ { 270, 66, 250, 0, 0, 68, 68, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 958, 129, 23, 38,21937,21937,21989,21989, 6778, 6778, 132, 128, 0, 5, 22, 10, 5031, 15, 58, 5900, 6152, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 15, 7, 52, 52, 27, 27, 13, 13, 5, 5, 5, 17, 23, 1, 13, 5, 7, 7, 7, {85,89,85}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Spanish/Latin/Uruguay
+ { 270, 66, 254, 0, 0, 68, 68, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 958, 129, 23, 38,21937,21937,21989,21989, 6778, 6778, 132, 128, 0, 5, 22, 302, 5044, 2, 65, 5900, 6159, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 15, 7, 52, 52, 27, 27, 13, 13, 5, 5, 5, 17, 23, 4, 16, 4, 5, 7, 9, {86,69,83}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Spanish/Latin/Venezuela
+ { 271, 135, 159, 0, 0, 0, 0, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 13, 15, 113, 129, 10, 0,22029,22029,22076,22076, 83, 83, 692, 723, 0, 5, 22, 0, 5060, 0, 0, 6168, 6176, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 13, 5, 47, 47, 29, 29, 13, 13, 6, 8, 4, 17, 23, 0, 14, 4, 0, 8, 6, {77,65,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Standard Moroccan Tamazight/Tifinagh/Morocco
+ { 272, 66, 111, 0, 0, 1090, 1103, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 129, 213, 213,22105,22105,22148,22148, 9291, 9291, 0, 0, 0, 5, 22, 186, 5074, 2, 0, 6182, 1776, 6, 6, 13, 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 12, 4, 43, 43, 27, 27, 13, 13, 2, 2, 4, 17, 23, 2, 15, 4, 0, 10, 9, {73,68,82}, 2, 0, 7, 6, 7, 1, 3, 3 }, // Sundanese/Latin/Indonesia
+ { 273, 66, 230, 0, 0, 566, 566, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 1198, 1198, 1198, 1198, 83, 83, 0, 0, 749, 1033, 22, 121, 3492, 15, 0, 6192, 2268, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 59, 59, 59, 59, 13, 13, 2, 2, 5, 51, 23, 3, 20, 5, 0, 9, 8, {84,90,83}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Swahili/Latin/Tanzania
+ { 273, 66, 57, 0, 0, 566, 566, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 1198, 1198, 1198, 1198, 83, 83, 0, 0, 749, 1033, 22, 11, 5089, 15, 0, 6192, 6201, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 59, 59, 59, 59, 13, 13, 2, 2, 5, 51, 23, 2, 16, 5, 0, 9, 32, {67,68,70}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Swahili/Latin/Congo - Kinshasa
+ { 273, 66, 124, 0, 0, 566, 566, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 1198, 1198, 1198, 1198, 83, 83, 0, 0, 749, 1033, 22, 176, 991, 15, 0, 6192, 1307, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 59, 59, 59, 59, 13, 13, 2, 2, 5, 51, 23, 3, 17, 5, 0, 9, 5, {75,69,83}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Swahili/Latin/Kenya
+ { 273, 66, 243, 0, 0, 566, 566, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0, 1198, 1198, 1198, 1198, 83, 83, 0, 0, 749, 1033, 22, 147, 5105, 15, 0, 6192, 983, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 59, 59, 59, 59, 13, 13, 2, 2, 5, 51, 23, 3, 18, 5, 0, 9, 6, {85,71,88}, 0, 0, 1, 7, 7, 1, 3, 3 }, // Swahili/Latin/Uganda
+ { 274, 66, 216, 0, 0, 0, 0, 6, 1, 9, 2, 3, 4, 5, 10, 16, 17, 14, 15, 163, 103, 10, 0,22175,22175,22242,22242, 83, 83, 0, 0, 0, 5, 22, 9, 0, 2, 0, 6233, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 67, 67, 26, 26, 13, 13, 2, 2, 4, 17, 23, 1, 0, 4, 0, 7, 0, {90,65,82}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Swati/Latin/South Africa
+ { 274, 66, 76, 0, 0, 0, 0, 6, 1, 9, 2, 3, 4, 5, 10, 16, 17, 14, 15, 163, 103, 23, 38,22175,22175,22242,22242, 83, 83, 0, 0, 0, 5, 22, 155, 0, 2, 0, 6233, 6240, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 67, 67, 26, 26, 13, 13, 2, 2, 4, 17, 23, 1, 0, 4, 0, 7, 8, {83,90,76}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Swati/Latin/Eswatini
+ { 275, 66, 225, 0, 0, 1115, 1115, 6, 1, 9, 2, 3, 48, 5, 63, 15, 15, 17, 17, 113, 103, 10, 0,22268,22268,22317,22317, 4874, 4874, 698, 731, 0, 5, 22, 160, 5123, 4, 0, 6248, 6255, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 16, 10, 13, 5, 49, 49, 28, 28, 13, 13, 2, 2, 4, 17, 23, 2, 12, 5, 0, 7, 7, {83,69,75}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Swedish/Latin/Sweden
+ { 275, 66, 2, 0, 0, 1115, 1115, 6, 1, 9, 2, 3, 48, 5, 63, 15, 15, 17, 17, 113, 103, 10, 0,22268,22268,22317,22317, 4874, 4874, 698, 731, 0, 5, 22, 22, 405, 4, 0, 6248, 6262, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 16, 10, 13, 5, 49, 49, 28, 28, 13, 13, 2, 2, 4, 17, 23, 1, 4, 5, 0, 7, 5, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Swedish/Latin/Aland Islands
+ { 275, 66, 83, 0, 0, 1115, 1115, 6, 1, 9, 2, 3, 48, 5, 63, 15, 15, 17, 17, 113, 103, 10, 0,22268,22268,22317,22317, 4874, 4874, 698, 731, 0, 5, 22, 22, 405, 4, 0, 6248, 1698, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 16, 10, 13, 5, 49, 49, 28, 28, 13, 13, 2, 2, 4, 17, 23, 1, 4, 5, 0, 7, 7, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Swedish/Latin/Finland
+ { 276, 66, 226, 0, 0, 463, 463, 6, 0, 17, 2, 3, 48, 5, 10, 11, 12, 19, 20, 404, 49, 10, 0,22345,22345,22407,22407, 4510, 4510, 700, 733, 0, 5, 22, 0, 5135, 4, 0, 6267, 6267, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 13, 5, 62, 62, 27, 27, 13, 13, 12, 11, 4, 17, 23, 0, 16, 5, 0, 16, 7, {67,72,70}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Swiss German/Latin/Switzerland
+ { 276, 66, 84, 0, 0, 463, 463, 6, 0, 17, 2, 3, 48, 5, 10, 11, 12, 19, 20, 404, 49, 10, 0,22345,22345,22407,22407, 4510, 4510, 700, 733, 0, 5, 22, 22, 83, 4, 0, 6267, 6283, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 13, 5, 62, 62, 27, 27, 13, 13, 12, 11, 4, 17, 23, 1, 4, 5, 0, 16, 10, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Swiss German/Latin/France
+ { 276, 66, 136, 0, 0, 463, 463, 6, 0, 17, 2, 3, 48, 5, 10, 11, 12, 19, 20, 404, 49, 10, 0,22345,22345,22407,22407, 4510, 4510, 700, 733, 0, 5, 22, 0, 5135, 4, 0, 6267, 6293, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 13, 5, 62, 62, 27, 27, 13, 13, 12, 11, 4, 17, 23, 0, 16, 5, 0, 16, 13, {67,72,70}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Swiss German/Latin/Liechtenstein
+ { 277, 123, 113, 1124, 1124, 1124, 1124, 6, 0, 1, 2, 3, 4, 5, 10, 15, 14, 17, 16, 1757, 395, 61, 76,22434,22434,22486,22486,22515,22515, 712, 744, 1084, 5, 22, 0, 0, 15, 0, 6306, 6312, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 9, 15, 7, 52, 52, 29, 29, 13, 13, 4, 4, 4, 17, 23, 0, 0, 5, 0, 6, 4, {73,81,68}, 0, 0, 6, 5, 6, 1, 3, 3 }, // Syriac/Syriac/Iraq
+ { 277, 123, 227, 1124, 1124, 1124, 1124, 6, 0, 1, 2, 3, 4, 5, 10, 15, 14, 17, 16, 1757, 395, 61, 76,22434,22434,22486,22486,22515,22515, 712, 744, 1084, 5, 22, 99, 0, 15, 0, 6306, 6316, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 9, 15, 7, 52, 52, 29, 29, 13, 13, 4, 4, 4, 17, 23, 5, 0, 5, 0, 6, 5, {83,89,80}, 0, 0, 6, 5, 6, 1, 3, 3 }, // Syriac/Syriac/Syria
+ { 278, 135, 159, 0, 0, 0, 0, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 13, 15, 113, 129, 10, 0,22528,22528,22076,22076, 83, 83, 692, 723, 0, 5, 22, 0, 5060, 0, 0, 6321, 6176, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 13, 5, 46, 46, 29, 29, 13, 13, 6, 8, 4, 17, 23, 0, 14, 4, 0, 7, 6, {77,65,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Tachelhit/Tifinagh/Morocco
+ { 278, 66, 159, 0, 0, 0, 0, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 13, 15, 113, 129, 10, 0,22574,22574,22621,22621, 83, 83, 716, 748, 0, 5, 22, 0, 5151, 0, 0, 6328, 6338, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 13, 5, 47, 47, 29, 29, 13, 13, 6, 8, 4, 17, 23, 0, 14, 4, 0, 10, 6, {77,65,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Tachelhit/Latin/Morocco
+ { 280, 127, 255, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 163, 103, 10, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 306, 0, 15, 0, 6344, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 4, 0, {86,78,68}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Tai Dam/Tai Viet/Vietnam
+ { 281, 66, 124, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0,22650,22650,22754,22754,22781,22781, 722, 756, 0, 5, 22, 176, 991, 2, 9, 6348, 1307, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5,104,104, 27, 27, 13, 13, 10, 10, 4, 17, 23, 3, 17, 4, 6, 7, 5, {75,69,83}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Taita/Latin/Kenya
+ { 282, 27, 229, 0, 0, 0, 0, 6, 1, 9, 2, 3, 4, 5, 10, 12, 11, 16, 17, 786, 78, 10, 0,22794,22794,22848,22848,22875,22875, 0, 0, 0, 5, 22, 307, 5165, 4, 0, 6355, 6361, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 13, 5, 54, 54, 27, 27, 13, 13, 2, 2, 4, 17, 23, 4, 6, 5, 0, 6, 10, {84,74,83}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Tajik/Cyrillic/Tajikistan
+ { 283, 129, 110, 0, 0, 1130, 1130, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 265, 129, 127, 127,22888,22888,22936,22936,22974,22974, 0, 766, 1088, 5, 22, 120, 5171, 2, 9, 6371, 6376, 6, 6, 13, 13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 15, 7, 48, 48, 38, 38, 19, 19, 2, 8, 7, 17, 23, 1, 13, 4, 6, 5, 7, {73,78,82}, 2, 1, 7, 7, 7, 1, 2, 3 }, // Tamil/Tamil/India
+ { 283, 129, 143, 0, 0, 1130, 1130, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 265, 129, 127, 127,22888,22888,22936,22936,22974,22974, 0, 766, 1088, 5, 22, 192, 5184, 2, 9, 6371, 6383, 6, 6, 13, 13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 15, 7, 48, 48, 38, 38, 19, 19, 2, 8, 7, 17, 23, 2, 17, 4, 6, 5, 7, {77,89,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Tamil/Tamil/Malaysia
+ { 283, 129, 210, 0, 0, 1130, 1130, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 265, 129, 127, 127,22888,22888,22936,22936,22974,22974, 0, 766, 1088, 5, 22, 10, 5201, 2, 9, 6371, 6390, 6, 6, 13, 13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 15, 7, 48, 48, 38, 38, 19, 19, 2, 8, 7, 17, 23, 1, 17, 4, 6, 5, 11, {83,71,68}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Tamil/Tamil/Singapore
+ { 283, 129, 221, 0, 0, 1130, 1130, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 265, 129, 10, 0,22888,22888,22936,22936,22974,22974, 0, 766, 1088, 5, 22, 311, 5218, 2, 9, 6371, 6401, 6, 6, 13, 13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 13, 5, 48, 48, 38, 38, 19, 19, 2, 8, 7, 17, 23, 3, 13, 4, 6, 5, 6, {76,75,82}, 2, 1, 1, 6, 7, 1, 2, 3 }, // Tamil/Tamil/Sri Lanka
+ { 284, 66, 228, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 137, 103, 23, 38,22993,22993,23164,23164,23191,23191, 0, 0, 0, 5, 22, 314, 5231, 15, 0, 6407, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 10, 15, 7,171,171, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 11, 5, 0, 12, 0, {84,87,68}, 2, 0, 7, 6, 7, 1, 3, 3 }, // Taroko/Latin/Taiwan
+ { 285, 66, 170, 0, 0, 0, 0, 6, 0, 9, 2, 3, 4, 5, 10, 14, 15, 16, 17, 113, 129, 10, 0,11682,11682,11735,11735,11762,11762, 732, 774, 0, 5, 22, 127, 3285, 0, 0, 6419, 6432, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 13, 5, 53, 53, 27, 27, 13, 13, 8, 10, 4, 17, 23, 5, 16, 4, 0, 13, 5, {88,79,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Tasawaq/Latin/Niger
+ { 286, 27, 193, 0, 0, 1143, 1143, 6, 1, 9, 2, 3, 4, 5, 10, 14, 15, 16, 17, 1775, 49, 11, 1,23204,23204,23259,23259,23294,23294, 0, 0, 0, 5, 22, 133, 5242, 4, 0, 6437, 5457, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 10, 12, 4, 55, 55, 35, 35, 13, 13, 2, 2, 4, 17, 23, 1, 11, 5, 0, 5, 6, {82,85,66}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Tatar/Cyrillic/Russia
+ { 287, 131, 110, 0, 0, 1152, 1152, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 1798, 394, 61, 76,23307,23307,23366,23366,23397,23397, 0, 0, 1095, 1102, 22, 120, 5253, 2, 9, 6442, 6448, 6, 6, 11, 11, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 15, 7, 59, 59, 31, 31, 17, 17, 2, 2, 7, 29, 23, 1, 14, 4, 6, 6, 8, {73,78,82}, 2, 1, 7, 7, 7, 1, 2, 3 }, // Telugu/Telugu/India
+ { 288, 66, 243, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0,23414,23414,23482,23482,23509,23509, 740, 784, 0, 5, 22, 147, 5267, 2, 9, 6456, 983, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 68, 68, 27, 27, 13, 13, 9, 6, 4, 17, 23, 3, 21, 4, 6, 6, 6, {85,71,88}, 0, 0, 1, 7, 7, 1, 3, 3 }, // Teso/Latin/Uganda
+ { 288, 66, 124, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0,23414,23414,23482,23482,23509,23509, 740, 784, 0, 5, 22, 176, 5288, 2, 9, 6456, 6462, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 68, 68, 27, 27, 13, 13, 9, 6, 4, 17, 23, 3, 20, 4, 6, 6, 5, {75,69,83}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Teso/Latin/Kenya
+ { 289, 133, 231, 24, 24, 1163, 1171, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 1816, 129, 542, 0,23522,23522,23589,23589,23611,23611, 749, 790, 1131, 5, 22, 317, 5308, 2, 9, 6467, 6467, 5, 5, 8, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 6, 31, 5, 67, 67, 22, 22, 15, 15, 10, 10, 4, 17, 23, 1, 3, 4, 6, 3, 3, {84,72,66}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Thai/Thai/Thailand
+ { 290, 134, 50, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 1835, 103, 10, 0,23626,23626,23704,23704,23754,23754, 759, 800, 0, 5, 22, 150, 5311, 15, 0, 6470, 6478, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 10, 13, 5, 78, 78, 50, 50, 26, 26, 7, 8, 4, 17, 23, 1, 6, 5, 0, 8, 6, {67,78,89}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Tibetan/Tibetan/China
+ { 290, 134, 110, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 1835, 103, 61, 76,23626,23626,23704,23704,23754,23754, 759, 800, 0, 5, 22, 120, 5317, 15, 0, 6470, 6484, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 10, 15, 7, 78, 78, 50, 50, 26, 26, 7, 8, 4, 17, 23, 1, 12, 5, 0, 8, 7, {73,78,82}, 2, 1, 7, 7, 7, 1, 3, 3 }, // Tibetan/Tibetan/India
+ { 291, 33, 74, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 1858, 78, 61, 76,23780,23780,23820,23820,23846,23846, 0, 0, 0, 5, 22, 6, 0, 2, 0, 6491, 671, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 21, 8, 15, 7, 40, 40, 26, 26, 13, 13, 2, 2, 4, 17, 23, 3, 0, 4, 0, 3, 4, {69,82,78}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Tigre/Ethiopic/Eritrea
+ { 292, 33, 77, 38, 38, 1178, 1178, 6, 0, 1, 2, 3, 4, 5, 10, 11, 12, 14, 15, 1879, 78, 61, 76,23859,23859,23887,23887,23907,23907, 766, 808, 0, 5, 22, 1, 112, 2, 0, 6494, 143, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 8, 15, 7, 28, 28, 20, 20, 13, 13, 4, 4, 4, 17, 23, 2, 2, 4, 0, 4, 5, {69,84,66}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Tigrinya/Ethiopic/Ethiopia
+ { 292, 33, 74, 38, 38, 1178, 1178, 6, 0, 1, 2, 3, 4, 5, 10, 16, 17, 14, 15, 1879, 78, 61, 76,23859,23859,23887,23887,23907,23907, 766, 808, 0, 5, 22, 6, 5329, 2, 0, 6494, 671, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 8, 15, 7, 28, 28, 20, 20, 13, 13, 4, 4, 4, 17, 23, 3, 3, 4, 0, 4, 4, {69,82,78}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Tigrinya/Ethiopic/Eritrea
+ { 294, 66, 182, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 787, 78, 573, 589,23920,23920,23964,23964, 83, 83, 0, 0, 0, 5, 22, 0, 0, 4, 0, 6498, 6507, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 8, 16, 8, 44, 44, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 9, 13, {80,71,75}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Tok Pisin/Latin/Papua New Guinea
+ { 295, 66, 235, 1185, 1185, 1185, 1185, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 113, 129, 23, 38,23991,23991,24050,24050,24078,24078, 770, 812, 1135, 1140, 1199, 205, 5332, 15, 0, 6520, 2283, 8, 8, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 6, 15, 7, 59, 59, 28, 28, 13, 13, 10, 6, 5, 59, 65, 2, 17, 5, 0, 13, 5, {84,79,80}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Tongan/Latin/Tonga
+ { 296, 66, 216, 0, 0, 0, 0, 6, 1, 9, 2, 3, 4, 5, 10, 16, 17, 14, 15, 163, 103, 10, 0,24091,24091,24162,24162, 83, 83, 0, 0, 0, 5, 22, 9, 0, 15, 0, 6533, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 71, 71, 26, 26, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 8, 0, {90,65,82}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Tsonga/Latin/South Africa
+ { 297, 66, 216, 0, 0, 0, 0, 6, 0, 9, 2, 3, 4, 5, 10, 16, 17, 14, 15, 163, 103, 10, 0,24188,24188,24251,24251, 83, 83, 0, 0, 0, 5, 22, 9, 0, 2, 0, 6541, 6549, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 63, 63, 31, 31, 13, 13, 2, 2, 4, 17, 23, 1, 0, 4, 0, 8, 13, {90,65,82}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Tswana/Latin/South Africa
+ { 297, 66, 30, 0, 0, 0, 0, 6, 0, 9, 2, 3, 4, 5, 10, 16, 17, 14, 15, 163, 103, 10, 0,24188,24188,24251,24251, 83, 83, 0, 0, 0, 5, 22, 153, 0, 2, 0, 6541, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 63, 63, 31, 31, 13, 13, 2, 2, 4, 17, 23, 1, 0, 4, 0, 8, 0, {66,87,80}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Tswana/Latin/Botswana
+ { 298, 66, 239, 0, 0, 1193, 1193, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 1896, 50, 10, 0,24282,24282,24335,24335,24362,24362, 780, 818, 185, 5, 22, 126, 5349, 2, 9, 6562, 6568, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 9, 13, 5, 53, 53, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 11, 4, 6, 6, 7, {84,82,89}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Turkish/Latin/Turkey
+ { 298, 66, 63, 0, 0, 1193, 1193, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 1896, 50, 23, 38,24282,24282,24335,24335,24362,24362, 780, 818, 185, 5, 22, 22, 83, 2, 9, 6562, 6575, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 9, 15, 7, 53, 53, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 4, 4, 6, 6, 6, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Turkish/Latin/Cyprus
+ { 299, 66, 240, 0, 0, 1201, 1201, 6, 1, 9, 2, 3, 4, 5, 10, 14, 15, 14, 15, 1896, 49, 10, 0,24375,24428,24481,24508,24535,24535, 782, 820, 1264, 5, 22, 0, 5360, 4, 0, 6581, 6593, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 13, 5, 53, 53, 27, 27, 13, 13, 13, 14, 4, 17, 23, 0, 14, 5, 0, 12, 12, {84,77,84}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Turkmen/Latin/Turkmenistan
+ { 301, 66, 169, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 137, 155, 10, 0,24548,24548,24589,24589, 83, 83, 0, 0, 0, 5, 22, 124, 5374, 15, 0, 6605, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 13, 5, 41, 41, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 4, 5, 0, 5, 0, {78,71,78}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Tyap/Latin/Nigeria
+ { 303, 27, 244, 0, 0, 117, 117, 6, 1, 9, 2, 3, 4, 5, 85, 11, 12, 13, 14, 1912, 49, 10, 0,24616,24671, 3049, 3049, 4289, 4289, 795, 834, 1268, 841, 22, 286, 5378, 4, 0, 6610, 6620, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 22, 8, 13, 5, 55, 55, 20, 20, 13, 13, 2, 2, 5, 17, 23, 1, 17, 5, 0, 10, 7, {85,65,72}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Ukrainian/Cyrillic/Ukraine
+ { 304, 66, 91, 0, 0, 781, 781, 6, 1, 0, 2, 3, 4, 5, 10, 13, 14, 18, 16, 404, 180, 11, 597,24726,24726,24778,24778,24805,24805, 402, 836, 1273, 5, 22, 22, 405, 4, 0, 6627, 6642, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 12, 12, 52, 52, 27, 27, 13, 13, 9, 9, 5, 17, 23, 1, 4, 5, 0, 15, 6, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Upper Sorbian/Latin/Germany
+ { 305, 4, 178, 661, 661, 1209, 1219, 6, 0, 1, 2, 3, 35, 37, 10, 15, 14, 17, 16, 1934, 129, 61, 76,24818,24818,24818,24818, 83, 83, 0, 0, 1278, 1282, 22, 196, 5395, 2, 9, 6648, 5140, 6, 6, 10, 9, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 18, 6, 15, 7, 35, 35, 35, 35, 13, 13, 2, 2, 4, 20, 23, 2, 14, 4, 6, 4, 7, {80,75,82}, 2, 0, 7, 6, 7, 1, 3, 3 }, // Urdu/Arabic/Pakistan
+ { 305, 4, 110, 661, 661, 1209, 1219, 6, 21, 22, 2, 40, 35, 41, 44, 15, 14, 17, 16, 1934, 129, 61, 76,24818,24818,24818,24818, 83, 83, 0, 0, 1278, 1282, 22, 120, 5409, 2, 9, 6648, 6652, 6, 6, 10, 9, 1, 1, 1, 1, 1, 3, 3, 4, 1, 1, 1, 1, 18, 6, 15, 7, 35, 35, 35, 35, 13, 13, 2, 2, 4, 20, 23, 1, 12, 4, 6, 4, 5, {73,78,82}, 2, 1, 7, 7, 7, 1, 3, 3 }, // Urdu/Arabic/India
+ { 306, 4, 50, 0, 0, 323, 333, 6, 0, 1, 2, 3, 4, 5, 10, 12, 11, 20, 19, 1952, 103, 10, 0,24853,24853,24907,24907,24927,24927, 797, 845, 0, 5, 22, 145, 5421, 2, 9, 6657, 6665, 6, 6, 10, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 54, 54, 20, 20, 13, 13, 12, 12, 4, 17, 23, 1, 11, 4, 6, 8, 5, {67,78,89}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Uyghur/Arabic/China
+ { 307, 66, 251, 0, 0, 1228, 1228, 6, 1, 9, 2, 3, 4, 5, 10, 14, 15, 17, 16, 1969, 78, 99, 0,24940,24940,25000,25000,25031,25031, 360, 857, 185, 5, 22, 318, 5432, 2, 9, 6670, 6676, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 14, 5, 60, 60, 31, 31, 13, 13, 2, 2, 4, 17, 23, 4, 17, 4, 6, 6, 11, {85,90,83}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Uzbek/Latin/Uzbekistan
+ { 307, 4, 1, 0, 0, 0, 0, 67, 21, 22, 23, 40, 35, 41, 44, 14, 15, 16, 17, 1987, 505, 99, 1,18196,18196,25044,25044, 83, 83, 0, 0, 0, 5, 22, 270, 3963, 4, 0, 6687, 5131, 6, 6, 6, 6, 1, 1, 1, 1, 1, 3, 3, 4, 1, 1, 1, 1, 33, 8, 14, 4, 48, 48, 20, 20, 13, 13, 2, 2, 4, 17, 23, 1, 6, 5, 0, 6, 9, {65,70,78}, 0, 0, 6, 4, 5, 1, 3, 3 }, // Uzbek/Arabic/Afghanistan
+ { 307, 27, 251, 0, 0, 0, 0, 6, 1, 9, 2, 3, 4, 5, 10, 14, 15, 16, 17, 1008, 78, 98, 0,25064,25064,25116,25116,25143,25143, 809, 859, 0, 5, 22, 322, 5449, 4, 0, 6693, 6700, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 8, 15, 5, 52, 52, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 14, 5, 0, 7, 10, {85,90,83}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Uzbek/Cyrillic/Uzbekistan
+ { 308, 139, 134, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 61, 76,25156,25156,25156,25156, 83, 83, 0, 0, 0, 5, 22, 10, 5463, 2, 9, 6710, 6712, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 29, 29, 29, 29, 13, 13, 2, 2, 4, 17, 23, 1, 8, 4, 6, 2, 4, {76,82,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Vai/Vai/Liberia
+ { 308, 66, 134, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38,25185,25185,25185,25185, 83, 83, 0, 0, 0, 5, 22, 10, 5471, 2, 9, 6716, 6719, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 47, 47, 47, 47, 13, 13, 2, 2, 4, 17, 23, 1, 13, 4, 6, 3, 8, {76,82,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Vai/Latin/Liberia
+ { 309, 66, 216, 0, 0, 0, 0, 6, 1, 9, 2, 3, 4, 5, 10, 16, 17, 14, 15, 163, 103, 10, 0,25232,25232,25301,25301, 83, 83, 0, 0, 0, 5, 22, 9, 0, 2, 0, 6727, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 69, 69, 26, 26, 13, 13, 2, 2, 4, 17, 23, 1, 0, 4, 0, 9, 0, {90,65,82}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Venda/Latin/South Africa
+ { 310, 66, 255, 0, 0, 1236, 1236, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 265, 129, 10, 0,25327,25327,25381,25381,25413,25413, 811, 861, 0, 5, 22, 306, 5484, 4, 0, 6736, 6746, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 13, 5, 54, 54, 32, 32, 20, 20, 2, 2, 4, 17, 23, 1, 13, 5, 0, 10, 8, {86,78,68}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Vietnamese/Latin/Vietnam
+ { 311, 66, 258, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 2020, 103, 10, 0,25433,25433,25475,25495,25522,25522, 0, 0, 0, 5, 22, 0, 0, 15, 0, 6754, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 10, 13, 5, 42, 42, 20, 27, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 7, 0, {0,0,0}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Volapuk/Latin/world
+ { 312, 66, 230, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0,13800,13800,13861,13861, 1284, 1284, 430, 446, 0, 5, 22, 121, 3492, 2, 0, 6761, 2268, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 61, 61, 27, 27, 13, 13, 5, 9, 4, 17, 23, 3, 20, 4, 0, 8, 8, {84,90,83}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Vunjo/Latin/Tanzania
+ { 313, 66, 23, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 163, 103, 10, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 22, 0, 15, 0, 6769, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 5, 0, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Walloon/Latin/Belgium
+ { 314, 66, 226, 0, 0, 463, 463, 6, 1, 17, 2, 3, 4, 5, 10, 11, 12, 19, 20, 404, 103, 10, 0,25535,25535,25587,25587,25614,25614, 0, 0, 0, 5, 22, 0, 0, 15, 0, 6774, 6780, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 10, 13, 5, 52, 52, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 6, 6, {67,72,70}, 2, 0, 1, 6, 7, 1, 3, 3 }, // Walser/Latin/Switzerland
+ { 315, 66, 15, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 163, 103, 10, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 241, 0, 15, 0, 6786, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 2, 0, 5, 0, 8, 0, {65,85,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Warlpiri/Latin/Australia
+ { 316, 66, 246, 0, 0, 1244, 1255, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 78, 10, 0,25627,25627,25703,25731,25760,25760, 813, 863, 1302, 5, 22, 94, 5497, 2, 9, 6794, 6801, 6, 6, 11, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 8, 13, 5, 76, 76, 28, 29, 14, 14, 2, 2, 7, 17, 23, 1, 12, 4, 6, 7, 16, {71,66,80}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Welsh/Latin/United Kingdom
+ { 317, 4, 178, 661, 661, 971, 979, 67, 21, 22, 23, 40, 35, 41, 44, 14, 15, 16, 17, 163, 103, 10, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 196, 5509, 15, 0, 6817, 0, 6, 6, 8, 7, 1, 1, 1, 1, 1, 3, 3, 4, 1, 1, 1, 1, 17, 10, 13, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 2, 13, 5, 0, 14, 0, {80,75,82}, 2, 0, 7, 6, 7, 1, 3, 3 }, // Western Balochi/Arabic/Pakistan
+ { 317, 4, 1, 661, 661, 971, 979, 67, 21, 22, 23, 40, 35, 41, 44, 14, 15, 16, 17, 163, 103, 10, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 270, 5522, 15, 0, 6817, 0, 6, 6, 8, 7, 1, 1, 1, 1, 1, 3, 3, 4, 1, 1, 1, 1, 17, 10, 13, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 17, 5, 0, 14, 0, {65,70,78}, 0, 0, 6, 4, 5, 1, 3, 3 }, // Western Balochi/Arabic/Afghanistan
+ { 317, 4, 112, 661, 661, 971, 979, 67, 21, 22, 23, 40, 35, 41, 44, 14, 15, 16, 17, 163, 103, 10, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 271, 5539, 15, 0, 6817, 0, 6, 6, 8, 7, 1, 1, 1, 1, 1, 3, 3, 4, 1, 1, 1, 1, 17, 10, 13, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 4, 11, 5, 0, 14, 0, {73,82,82}, 0, 0, 6, 5, 5, 1, 3, 3 }, // Western Balochi/Arabic/Iran
+ { 317, 4, 176, 661, 661, 971, 979, 67, 21, 22, 23, 40, 35, 41, 44, 14, 15, 16, 17, 163, 103, 10, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 0, 0, 15, 0, 6817, 6831, 6, 6, 8, 7, 1, 1, 1, 1, 1, 3, 3, 4, 1, 1, 1, 1, 17, 10, 13, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 14, 5, {79,77,82}, 3, 0, 6, 5, 6, 1, 3, 3 }, // Western Balochi/Arabic/Oman
+ { 317, 4, 245, 661, 661, 971, 979, 67, 21, 22, 23, 40, 35, 41, 44, 14, 15, 16, 17, 163, 103, 10, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 0, 0, 15, 0, 6817, 6836, 6, 6, 8, 7, 1, 1, 1, 1, 1, 3, 3, 4, 1, 1, 1, 1, 17, 10, 13, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 14, 19, {65,69,68}, 2, 1, 6, 6, 7, 1, 3, 3 }, // Western Balochi/Arabic/United Arab Emirates
+ { 318, 66, 165, 0, 0, 16, 16, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 113, 394, 10, 0,25774,25774,25827,25827, 83, 83, 0, 0, 0, 5, 22, 22, 83, 15, 58, 6855, 6860, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 13, 5, 53, 53, 20, 20, 13, 13, 2, 2, 4, 17, 23, 1, 4, 5, 7, 5, 8, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Western Frisian/Latin/Netherlands
+ { 319, 33, 77, 0, 0, 0, 0, 6, 0, 17, 2, 3, 4, 5, 10, 14, 15, 16, 17, 2043, 78, 61, 76,25847,25847,25847,25847,25873,25873, 0, 0, 0, 5, 22, 1, 105, 2, 0, 6868, 143, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 22, 8, 15, 7, 26, 26, 26, 26, 13, 13, 2, 2, 4, 17, 23, 2, 9, 4, 0, 5, 5, {69,84,66}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Wolaytta/Ethiopic/Ethiopia
+ { 320, 66, 206, 0, 0, 0, 0, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 2065, 394, 10, 0,25886,25886,25935,25935,25935,25935, 732, 865, 0, 5, 22, 127, 5550, 15, 0, 6873, 2999, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 49, 49, 27, 27, 27, 27, 3, 3, 4, 17, 23, 5, 29, 5, 0, 5, 8, {88,79,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Wolof/Latin/Senegal
+ { 321, 66, 216, 0, 0, 0, 0, 6, 0, 9, 2, 3, 4, 5, 10, 14, 15, 16, 17, 549, 567, 10, 0,25962,25962,26022,26049,26078,26098, 0, 0, 0, 5, 22, 9, 5579, 2, 0, 6878, 6886, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 13, 5, 60, 60, 27, 29, 20, 21, 2, 2, 4, 17, 23, 1, 25, 4, 0, 8, 15, {90,65,82}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Xhosa/Latin/South Africa
+ { 322, 66, 40, 0, 0, 0, 0, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 11, 12, 113, 129, 10, 0,26119,26119,26189,26189,26209,26209, 815, 868, 0, 5, 22, 11, 0, 4, 20, 6901, 6907, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 13, 5, 70, 70, 20, 20, 13, 13, 8, 8, 4, 17, 23, 4, 0, 5, 7, 6, 7, {88,65,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Yangben/Latin/Cameroon
+ { 323, 47, 244, 0, 0, 1265, 1265, 6, 0, 1, 2, 3, 4, 5, 10, 15, 15, 17, 17, 2082, 78, 10, 0,26222,26222,26222,26222, 83, 83, 823, 876, 0, 5, 22, 286, 0, 15, 0, 6914, 6920, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 8, 13, 5, 53, 53, 53, 53, 13, 13, 11, 10, 4, 17, 23, 1, 0, 5, 0, 6, 9, {85,65,72}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Yiddish/Hebrew/Ukraine
+ { 324, 66, 169, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 2101, 129, 10, 1,26275,26318,26386,26386,26418,26418, 834, 886, 1309, 1320, 22, 124, 5604, 2, 9, 6929, 6939, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 13, 3, 43, 68, 32, 32, 13, 13, 5, 5, 11, 37, 23, 1, 14, 4, 6, 10, 8, {78,71,78}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Yoruba/Latin/Nigeria
+ { 324, 66, 25, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 2101, 129, 10, 1,26431,26474,26542,26542,26574,26574, 839, 891, 1357, 1320, 22, 127, 5618, 2, 9, 6929, 6947, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 13, 3, 43, 68, 32, 32, 13, 13, 5, 5, 11, 37, 23, 5, 26, 4, 6, 10, 6, {88,79,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Yoruba/Latin/Benin
+ { 325, 66, 170, 0, 0, 0, 0, 6, 0, 9, 2, 3, 4, 5, 10, 14, 15, 16, 17, 113, 129, 10, 0,26587,26587,11735,11735,26639,26639, 732, 774, 0, 5, 22, 127, 3285, 0, 0, 6953, 6432, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 13, 5, 52, 52, 27, 27, 13, 13, 8, 10, 4, 17, 23, 5, 16, 4, 0, 10, 5, {88,79,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Zarma/Latin/Niger
+ { 326, 66, 50, 0, 0, 1274, 1274, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 163, 103, 10, 0,26652,26652,26652,26652, 83, 83, 844, 896, 0, 5, 22, 150, 5644, 15, 0, 6963, 6972, 6, 6, 11, 11, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 89, 89, 89, 89, 13, 13, 7, 12, 4, 17, 23, 1, 10, 5, 0, 9, 8, {67,78,89}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Zhuang/Latin/China
+ { 327, 66, 216, 0, 0, 1285, 1294, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 549, 567, 10, 0,26741,26741,26814,26814,26841,26841, 0, 0, 0, 5, 22, 9, 5654, 2, 9, 6980, 6987, 6, 6, 9, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 13, 5, 73, 73, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 20, 4, 6, 7, 17, {90,65,82}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Zulu/Latin/South Africa
+ { 328, 66, 32, 0, 0, 1302, 1302, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 2117, 186, 10, 0,26854,26854,26940,26940,26974,26974, 0, 0, 1368, 5, 22, 9, 5674, 15, 0, 7004, 7011, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 10, 13, 5, 86, 86, 34, 34, 20, 20, 2, 2, 7, 17, 23, 2, 12, 5, 0, 7, 6, {66,82,76}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Kaingang/Latin/Brazil
+ { 329, 66, 32, 0, 0, 1311, 1311, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 10, 0,26994,26994,27058,27058,27085,27085, 0, 0, 1375, 5, 22, 9, 5686, 15, 0, 7017, 7025, 6, 6, 10, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 64, 64, 27, 27, 13, 13, 2, 2, 8, 17, 23, 2, 15, 5, 0, 8, 6, {66,82,76}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Nheengatu/Latin/Brazil
+ { 329, 66, 54, 0, 0, 1311, 1311, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38,26994,26994,27058,27058,27085,27085, 132, 128, 1375, 5, 22, 10, 5701, 15, 0, 7031, 7038, 6, 6, 10, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 64, 64, 27, 27, 13, 13, 5, 5, 8, 17, 23, 1, 17, 5, 0, 7, 8, {67,79,80}, 2, 0, 7, 6, 7, 1, 3, 3 }, // Nheengatu/Latin/Colombia
+ { 329, 66, 254, 0, 0, 1311, 1311, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 186, 23, 38,26994,26994,27058,27058,27085,27085, 132, 128, 1375, 5, 22, 302, 5718, 15, 0, 7031, 7046, 6, 6, 10, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 64, 64, 27, 27, 13, 13, 5, 5, 8, 17, 23, 4, 22, 5, 0, 7, 9, {86,69,83}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Nheengatu/Latin/Venezuela
+ { 330, 29, 110, 0, 0, 0, 0, 6, 0, 1, 2, 49, 4, 5, 10, 14, 15, 16, 17, 163, 103, 61, 76,27098,27098,27098,27098, 83, 83, 851, 83, 0, 5, 22, 120, 0, 15, 0, 7055, 664, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 54, 54, 54, 54, 13, 13, 4, 4, 4, 17, 23, 1, 0, 5, 0, 8, 4, {73,78,82}, 2, 1, 7, 7, 7, 1, 3, 3 }, // Haryanvi/Devanagari/India
+ { 331, 66, 91, 0, 0, 915, 915, 6, 1, 0, 2, 3, 4, 5, 10, 14, 15, 16, 17, 404, 78, 10, 0,27152,27152,27208,27208, 83, 83, 0, 0, 0, 5, 22, 22, 83, 15, 0, 7063, 7073, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 13, 5, 56, 56, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 4, 5, 0, 10, 9, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Northern Frisian/Latin/Germany
+ { 332, 29, 110, 0, 0, 0, 0, 6, 0, 1, 2, 49, 4, 5, 10, 14, 15, 16, 17, 163, 103, 61, 76, 8522, 8522, 8522, 8522, 83, 83, 855, 908, 0, 5, 22, 120, 0, 15, 0, 7082, 664, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 52, 52, 52, 52, 13, 13, 5, 4, 4, 17, 23, 1, 0, 5, 0, 9, 4, {73,78,82}, 2, 1, 7, 7, 7, 1, 3, 3 }, // Rajasthani/Devanagari/India
+ { 333, 27, 193, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 163, 103, 10, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 133, 0, 15, 0, 7091, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 12, 0, {82,85,66}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Moksha/Cyrillic/Russia
+ { 334, 66, 258, 0, 0, 0, 0, 6, 1, 9, 2, 3, 4, 5, 10, 14, 15, 16, 17, 163, 103, 10, 0,27235,27235,27235,27235, 83, 83, 860, 912, 0, 5, 22, 0, 0, 2, 0, 7103, 7112, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 90, 90, 90, 90, 13, 13, 12, 12, 4, 17, 23, 0, 0, 4, 0, 9, 6, {0,0,0}, 2, 1, 1, 6, 7, 1, 2, 2 }, // Toki Pona/Latin/world
+ { 335, 66, 214, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 163, 103, 10, 0,27325,27325,27325,27325, 83, 83, 0, 0, 0, 5, 22, 10, 0, 15, 0, 7118, 7123, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 46, 46, 46, 46, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 5, 13, {83,66,68}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Pijin/Latin/Solomon Islands
+ { 336, 66, 169, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 163, 103, 10, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 124, 0, 15, 0, 7136, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 5, 0, {78,71,78}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Obolo/Latin/Nigeria
+ { 337, 4, 178, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 265, 129, 367, 383,27371,27371,27417,27417, 83, 83, 0, 0, 0, 5, 22, 196, 5395, 15, 0, 7141, 5140, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 16, 8, 46, 46, 24, 24, 13, 13, 2, 2, 4, 17, 23, 2, 13, 5, 0, 5, 7, {80,75,82}, 2, 0, 7, 6, 7, 1, 3, 3 }, // Baluchi/Arabic/Pakistan
+ { 337, 66, 178, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 265, 129, 573, 589,27441,27441,27511,27511, 83, 83, 0, 0, 0, 5, 22, 196, 5740, 15, 0, 7146, 7153, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 16, 8, 70, 70, 26, 26, 13, 13, 2, 2, 4, 17, 23, 2, 14, 5, 0, 7, 8, {80,75,82}, 2, 0, 7, 6, 7, 1, 3, 3 }, // Baluchi/Latin/Pakistan
+ { 338, 66, 117, 0, 0, 414, 414, 6, 1, 0, 2, 3, 4, 5, 10, 11, 12, 14, 15, 2140, 78, 10, 0,27537,27537,27591,27591,27625,27625, 0, 0, 0, 5, 22, 22, 405, 4, 20, 7161, 3728, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 21, 8, 13, 5, 54, 54, 34, 34, 13, 13, 2, 2, 4, 17, 23, 1, 4, 5, 7, 6, 6, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Ligurian/Latin/Italy
+ { 339, 142, 161, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 163, 103, 10, 1, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 134, 0, 15, 0, 7167, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 13, 4, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 18, 0, {77,77,75}, 0, 0, 7, 6, 7, 1, 3, 3 }, // Rohingya/Hanifi/Myanmar
+ { 339, 142, 20, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 163, 103, 61, 76, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 132, 0, 15, 0, 7167, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 15, 7, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 18, 0, {66,68,84}, 2, 1, 7, 6, 7, 1, 3, 3 }, // Rohingya/Hanifi/Bangladesh
+ { 340, 4, 178, 1321, 1321, 1326, 1335, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 1934, 129, 61, 76,27638,27638,27638,27638,27695,27695, 0, 0, 1278, 1282, 22, 196, 5395, 15, 0, 7185, 5140, 5, 5, 9, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 15, 7, 57, 57, 57, 57, 13, 13, 2, 2, 4, 20, 23, 2, 14, 5, 0, 7, 7, {80,75,82}, 2, 0, 7, 6, 7, 1, 3, 3 }, // Torwali/Arabic/Pakistan
+ { 341, 66, 25, 0, 0, 566, 566, 6, 1, 9, 2, 3, 4, 5, 10, 11, 12, 14, 15, 2161, 2178, 10, 0,27708,27708,27766,27766,27800,27800, 872, 924, 0, 5, 22, 127, 5754, 15, 86, 7192, 7203, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 8, 13, 5, 58, 58, 34, 34, 20, 20, 13, 13, 4, 17, 23, 5, 33, 5, 6, 11, 5, {88,79,70}, 0, 0, 1, 6, 7, 1, 3, 3 }, // Anii/Latin/Benin
+ { 342, 29, 110, 0, 0, 1343, 1353, 6, 0, 1, 2, 3, 4, 5, 10, 14, 15, 16, 17, 0, 129, 61, 76,27820,27820,27872,27872,27905,27905, 885, 937, 0, 5, 22, 120, 5787, 2, 0, 7208, 664, 6, 6, 10, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 15, 7, 52, 52, 33, 33, 18, 18, 6, 11, 4, 17, 23, 1, 14, 4, 0, 7, 4, {73,78,82}, 2, 1, 7, 7, 7, 1, 2, 3 }, // Kangri/Devanagari/India
+ { 343, 66, 117, 0, 0, 414, 414, 6, 1, 68, 2, 3, 4, 5, 10, 14, 15, 16, 17, 113, 78, 10, 0,27923,27923,27967,27967,27625,27625, 0, 0, 0, 5, 22, 155, 405, 117, 0, 7215, 3728, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 13, 5, 44, 44, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 4, 5, 0, 6, 6, {69,85,82}, 2, 1, 1, 6, 7, 1, 3, 3 }, // Venetian/Latin/Italy
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, {0,0,0}, 0, 0, 0, 0, 0, 0, 0, 0 } // trailing zeros
};
-static const char16_t list_pattern_part_data[] = {
-0x25, 0x31, 0x2c, 0x20, 0x25, 0x32, 0x3b, 0x25, 0x31, 0x20, 0x65, 0x6e, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x64, 0x68,
-0x65, 0x20, 0x25, 0x32, 0x25, 0x31, 0x1363, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x12a5, 0x1293, 0x20, 0x25, 0x32, 0x25,
-0x31, 0x20, 0x12a5, 0x1293, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x648, 0x25, 0x32, 0x61b, 0x25, 0x31, 0x20, 0x587, 0x20, 0x25,
-0x32, 0x25, 0x31, 0x20, 0x986, 0x9f0, 0x9c1, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x79, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20,
-0x76, 0x259, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x98f, 0x9ac, 0x982, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x65, 0x74, 0x61,
-0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x456, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x69, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20,
-0x438, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x68, 0x61, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x2d, 0x20, 0x25, 0x32, 0x25,
-0x31, 0x1014, 0x103e, 0x1004, 0x1037, 0x103a, 0x20, 0x25, 0x32, 0x104a, 0x25, 0x31, 0x3001, 0x25, 0x32, 0x25, 0x31, 0x540c, 0x25, 0x32,
-0x25, 0x31, 0x2c, 0x20, 0x75, 0x67, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x75, 0x67, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20,
-0xd804, 0xdd03, 0xd804, 0xdd33, 0xd804, 0xdd03, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x13a0, 0x13b4, 0x20, 0x25, 0x32, 0x25, 0x31,
-0x20, 0x13a0, 0x13b4, 0x20, 0x25, 0x32, 0x25, 0x31, 0x548c, 0x25, 0x32, 0x25, 0x31, 0x53ca, 0x25, 0x32, 0x25, 0x31, 0x20, 0x75,
-0x6e, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x61, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x6f, 0x67, 0x20, 0x25, 0x32, 0x25,
-0x31, 0x2c, 0x20, 0x924, 0x947, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x924, 0x947, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0xf51,
-0xf44, 0xf0b, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x61, 0x6e,
-0x64, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x6b, 0x61, 0x6a, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x6a, 0x61, 0x20, 0x25,
-0x32, 0x25, 0x31, 0x2c, 0x20, 0x6b, 0x70, 0x6c, 0x65, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x6b, 0x70, 0x6c, 0x65, 0x20,
-0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x61, 0x74, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x61, 0x74, 0x20, 0x25, 0x32, 0x25,
-0x31, 0x20, 0x65, 0x74, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x65, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2e41, 0x20, 0x25, 0x32,
-0x25, 0x31, 0x20, 0xd83a, 0xdd2b, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x61, 0x67, 0x75, 0x73, 0x20, 0x25, 0x32, 0x25, 0x31,
-0x20, 0x10d3, 0x10d0, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x75, 0x6e, 0x64, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x3ba, 0x3b1,
-0x3b9, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0xa85, 0xaa8, 0xac7, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x64, 0x61, 0x20,
-0x25, 0x32, 0x25, 0x31, 0x20, 0x64, 0x61, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x5d5, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20,
-0x914, 0x930, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x914, 0x930, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0xe9, 0x73, 0x20, 0x25,
-0x32, 0x25, 0x31, 0x2c, 0x20, 0x6e, 0x61, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x6e, 0x61, 0x20, 0x25, 0x32, 0x25, 0x31,
-0x2c, 0x20, 0x64, 0x61, 0x6e, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x64, 0x61, 0x6e, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c,
-0x20, 0x6c, 0x61, 0x6e, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x6c, 0x61, 0x6e, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20,
-0x64, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x64, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x61, 0x61, 0x6d, 0x6d, 0x61, 0x20,
-0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0xcae, 0xca4, 0xccd, 0xca4, 0xcc1, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0xcae, 0xca4, 0xccd,
-0xca4, 0xcc1, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x436, 0x4d9, 0x43d, 0x435, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x1793, 0x17b7,
-0x1784, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x1793, 0x17b7, 0x1784, 0x200b, 0x25, 0x32, 0x25, 0x31, 0x20, 0xbc0f, 0x20, 0x25, 0x32,
-0x25, 0x31, 0x20, 0xfb, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x436, 0x430, 0x43d, 0x430, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20,
-0xec1, 0xea5, 0xeb0, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x6d, 0x70, 0xe9, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x69, 0x72,
-0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x61, 0x28, 0x6e, 0x29, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x25, 0x32, 0x20,
-0xd0e, 0xd28, 0xd4d, 0xd28, 0xd3f, 0xd35, 0x25, 0x31, 0x20, 0xd15, 0xd42, 0xd1f, 0xd3e, 0xd24, 0xd46, 0x20, 0x25, 0x32, 0x25, 0x31,
-0x2c, 0x20, 0x75, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x75, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x985, 0x9ae, 0x9b8, 0x9c1,
-0x982, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x906, 0x923, 0x93f, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x25, 0x32, 0x25, 0x31,
-0x20, 0x930, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x14b, 0x301, 0x67, 0x25b, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20,
-0x1e3f, 0x62, 0x25b, 0x6e, 0x20, 0x14b, 0x301, 0x67, 0x25b, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x70, 0x254, 0x70, 0x20, 0x25,
-0x32, 0x25, 0x31, 0x2c, 0x20, 0x61, 0x6e, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x61, 0x6e, 0x20, 0x25, 0x32, 0x25, 0x31,
-0x2c, 0x20, 0xb13, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0xb13, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x4d5, 0x43c, 0x4d5, 0x20,
-0x25, 0x32, 0x25, 0x31, 0x60c, 0x20, 0x25, 0x32, 0x25, 0x31, 0x60c, 0x20, 0x627, 0x648, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20,
-0x627, 0x648, 0x20, 0x25, 0x32, 0x25, 0x31, 0x60c, 0x200f, 0x20, 0x25, 0x32, 0x25, 0x31, 0x60c, 0x20, 0x648, 0x20, 0x25, 0x32,
-0x25, 0x31, 0x20, 0x648, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0xa05, 0xa24, 0xa47, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x219,
-0x69, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x443, 0x43e, 0x43d, 0x43d, 0x430, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x924,
-0x925, 0x93e, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x924, 0x925, 0x93e, 0x20, 0x25, 0x32, 0x25, 0x31, 0x60c, 0x20, 0x6fd, 0x20,
-0x25, 0x32, 0x25, 0x31, 0x20, 0x6fd, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0xdc3, 0xdc4, 0x20, 0x25, 0x32, 0x25, 0x31,
-0x20, 0xdc3, 0xdc4, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x61, 0xa0, 0x25, 0x32, 0x25, 0x31, 0x20, 0x69, 0x6e, 0x20, 0x25,
-0x32, 0x25, 0x31, 0x20, 0x69, 0x79, 0x6f, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x73, 0x61, 0x72, 0x65, 0x6e, 0x67,
-0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x73, 0x61, 0x72, 0x65, 0x6e, 0x67, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x6f, 0x63,
-0x68, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0xbae, 0xbb1, 0xbcd, 0xbb1, 0xbc1, 0xbae, 0xbcd, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20,
-0x4bb, 0x4d9, 0x43c, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0xc2e, 0xc30, 0xc3f, 0xc2f, 0xc41, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20,
-0x25, 0x32, 0x25, 0x31, 0x20, 0xe41, 0xe25, 0xe30, 0x25, 0x32, 0x25, 0x31, 0xe41, 0xe25, 0xe30, 0x25, 0x32, 0x25, 0x31, 0x1295,
-0x20, 0x25, 0x32, 0x1295, 0x25, 0x31, 0x20, 0x6d, 0x6f, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x76, 0x65, 0x20, 0x25, 0x32,
-0x25, 0x31, 0x20, 0x77, 0x65, 0x20, 0x25, 0x32, 0x25, 0x31, 0x60c, 0x20, 0x627, 0x648, 0x631, 0x20, 0x25, 0x32, 0x25, 0x31,
-0x20, 0x627, 0x648, 0x631, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x76, 0x61, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x76, 0xe0,
-0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x61, 0x28, 0x63, 0x29, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x61, 0x28, 0x63,
-0x29, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x5d0, 0x5d5, 0x5df, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x6e, 0x65, 0x2d,
-0x25, 0x32, 0x25, 0x31, 0x20, 0x6e, 0x65, 0x2d, 0x25, 0x32, 0x25, 0x31, 0x20, 0x6b, 0x61, 0x72, 0x20, 0x25, 0x32, 0x25,
-0x31, 0x20, 0x61, 0x73, 0x75, 0xed, 0x20, 0x25, 0x32
+static constexpr char16_t list_pattern_part_data[] = {
+0x25, 0x31, 0x2c, 0x20, 0x25, 0x32, 0x3b, 0x25, 0x31, 0x2d, 0x438, 0x20,
+0x25, 0x32, 0x2d, 0x438, 0x25, 0x31, 0x20, 0x65, 0x6e, 0x20, 0x25, 0x32,
+0x25, 0x31, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x64, 0x68, 0x65, 0x20,
+0x25, 0x32, 0x25, 0x31, 0x1363, 0x20, 0x25, 0x32, 0x25, 0x31, 0x1363, 0x20,
+0x12a5, 0x1293, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x12a5, 0x1293, 0x20, 0x25,
+0x32, 0x25, 0x31, 0x20, 0x648, 0x25, 0x32, 0x61b, 0x25, 0x31, 0x20, 0x79,
+0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x587, 0x20, 0x25, 0x32, 0x25, 0x31,
+0x20, 0x986, 0x9f0, 0x9c1, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x76, 0x259,
+0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x98f, 0x9ac, 0x982, 0x20, 0x25, 0x32,
+0x25, 0x31, 0x20, 0x65, 0x74, 0x61, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20,
+0x456, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x906, 0x930, 0x94b, 0x20,
+0x25, 0x32, 0x25, 0x31, 0x20, 0x906, 0x930, 0x94b, 0x20, 0x25, 0x32, 0x25,
+0x31, 0x20, 0x69, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x438, 0x20, 0x25,
+0x32, 0x25, 0x31, 0x20, 0x68, 0x61, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20,
+0x2d, 0x20, 0x25, 0x32, 0x25, 0x31, 0x1014, 0x103e, 0x1004, 0x1037, 0x103a, 0x20,
+0x25, 0x32, 0x104a, 0x25, 0x31, 0x3001, 0x25, 0x32, 0x25, 0x31, 0x540c, 0x25,
+0x32, 0x25, 0x31, 0x2c, 0x20, 0x75, 0x67, 0x20, 0x25, 0x32, 0x25, 0x31,
+0x20, 0x75, 0x67, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0xd804, 0xdd03, 0xd804,
+0xdd33, 0xd804, 0xdd03, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x13a0, 0x13b4,
+0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x13a0, 0x13b4, 0x20, 0x25, 0x32, 0x25,
+0x31, 0x548c, 0x25, 0x32, 0x25, 0x31, 0x53ca, 0x25, 0x32, 0x25, 0x31, 0x20,
+0x438, 0x486, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x442, 0x430, 0x442, 0x430,
+0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x75, 0x6e, 0x20, 0x25, 0x32, 0x25,
+0x31, 0x20, 0xe8, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x61, 0xa0, 0x25,
+0x32, 0x25, 0x31, 0x20, 0x6f, 0x67, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c,
+0x20, 0x924, 0x947, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x924, 0x947, 0x20,
+0x25, 0x32, 0x25, 0x31, 0x20, 0xf51, 0xf44, 0xf0b, 0x20, 0x25, 0x32, 0x25,
+0x31, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20,
+0x61, 0x6e, 0x64, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x6b, 0x61, 0x6a,
+0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x6a, 0x61, 0x20, 0x25, 0x32, 0x25,
+0x31, 0x2c, 0x20, 0x6b, 0x70, 0x6c, 0x65, 0x20, 0x25, 0x32, 0x25, 0x31,
+0x20, 0x6b, 0x70, 0x6c, 0x65, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20,
+0x6f, 0x67, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x61, 0x74, 0x20,
+0x25, 0x32, 0x25, 0x31, 0x20, 0x61, 0x74, 0x20, 0x25, 0x32, 0x25, 0x31,
+0x20, 0x65, 0x74, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x65, 0x20, 0x25,
+0x32, 0x25, 0x31, 0x2e41, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2e41, 0x20, 0xd83a,
+0xdd2b, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0xd83a, 0xdd2b, 0x20, 0x25, 0x32,
+0x204f, 0x25, 0x31, 0x20, 0x61, 0x67, 0x75, 0x73, 0x20, 0x25, 0x32, 0x25,
+0x31, 0x20, 0x10d3, 0x10d0, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x75, 0x6e,
+0x64, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x3ba, 0x3b1, 0x3b9, 0x20, 0x25,
+0x32, 0x25, 0x31, 0x20, 0xa85, 0xaa8, 0xac7, 0x20, 0x25, 0x32, 0x25, 0x31,
+0x2c, 0x20, 0x64, 0x61, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x64, 0x61,
+0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x5d5, 0x25, 0x32, 0x25, 0x31, 0x2c,
+0x20, 0x914, 0x930, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x914, 0x930, 0x20,
+0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x61, 0x75, 0x72, 0x20, 0x25, 0x32,
+0x25, 0x31, 0x20, 0x61, 0x75, 0x72, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20,
+0xe9, 0x73, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x6e, 0x61, 0x20,
+0x25, 0x32, 0x25, 0x31, 0x20, 0x6e, 0x61, 0x20, 0x25, 0x32, 0x25, 0x31,
+0x2c, 0x20, 0x64, 0x61, 0x6e, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x64,
+0x61, 0x6e, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x6c, 0x61, 0x6e,
+0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x6c, 0x61, 0x6e, 0x20, 0x25, 0x32,
+0x25, 0x31, 0x2c, 0x20, 0x64, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x64,
+0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x61, 0x61, 0x6d, 0x6d, 0x61, 0x20,
+0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0xcae, 0xca4, 0xccd, 0xca4, 0xcc1, 0x20,
+0x25, 0x32, 0x25, 0x31, 0x20, 0xcae, 0xca4, 0xccd, 0xca4, 0xcc1, 0x20, 0x25,
+0x32, 0x25, 0x31, 0x60c, 0x20, 0x25, 0x32, 0x25, 0x31, 0x60c, 0x20, 0x62a,
+0x655, 0x6c1, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x62a, 0x655, 0x6c1, 0x20,
+0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x924, 0x93f, 0x20, 0x25, 0x32, 0x25,
+0x31, 0x20, 0x924, 0x93f, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x436, 0x4d9,
+0x43d, 0x435, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x1793, 0x17b7, 0x1784, 0x20,
+0x25, 0x32, 0x25, 0x31, 0x20, 0x1793, 0x17b7, 0x1784, 0x200b, 0x25, 0x32, 0x25,
+0x31, 0x20, 0xbc0f, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0xfb, 0x20, 0x25,
+0x32, 0x25, 0x31, 0x20, 0x436, 0x430, 0x43d, 0x430, 0x20, 0x25, 0x32, 0x25,
+0x31, 0x20, 0xec1, 0xea5, 0xeb0, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x6d,
+0x70, 0xe9, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x69, 0x72, 0x20, 0x25,
+0x32, 0x25, 0x31, 0x20, 0x61, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x61,
+0x28, 0x6e, 0x29, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x25, 0x32,
+0x20, 0xd0e, 0xd28, 0xd4d, 0xd28, 0xd3f, 0xd35, 0x25, 0x31, 0x20, 0xd15, 0xd42,
+0xd1f, 0xd3e, 0xd24, 0xd46, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x75,
+0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x75, 0x20, 0x25, 0x32, 0x25, 0x31,
+0x20, 0x985, 0x9ae, 0x9b8, 0x9c1, 0x982, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20,
+0x906, 0x923, 0x93f, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x25, 0x32, 0x25,
+0x31, 0x20, 0x930, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x14b, 0x301,
+0x67, 0x25b, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x1e3f, 0x62, 0x25b,
+0x6e, 0x20, 0x14b, 0x301, 0x67, 0x25b, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20,
+0x70, 0x254, 0x70, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x61, 0x6e,
+0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x61, 0x6e, 0x20, 0x25, 0x32, 0x25,
+0x31, 0x2c, 0x20, 0xb13, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0xb13, 0x20,
+0x25, 0x32, 0x25, 0x31, 0x20, 0x4d5, 0x43c, 0x4d5, 0x20, 0x25, 0x32, 0x25,
+0x31, 0x60c, 0x20, 0x627, 0x648, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x627,
+0x648, 0x20, 0x25, 0x32, 0x25, 0x31, 0x60c, 0x200f, 0x20, 0x25, 0x32, 0x25,
+0x31, 0x60c, 0x20, 0x648, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x648, 0x20,
+0x25, 0x32, 0x25, 0x31, 0x20, 0x62, 0x65, 0x20, 0x25, 0x32, 0x25, 0x31,
+0x20, 0xa05, 0xa24, 0xa47, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x219, 0x69,
+0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x443, 0x43e, 0x43d, 0x43d, 0x430, 0x20,
+0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x924, 0x925, 0x93e, 0x20, 0x25, 0x32,
+0x25, 0x31, 0x20, 0x924, 0x925, 0x93e, 0x20, 0x25, 0x32, 0x25, 0x31, 0x60c,
+0x20, 0x6fd, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x6fd, 0x20, 0x25, 0x32,
+0x25, 0x31, 0x2c, 0x20, 0xdc3, 0xdc4, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20,
+0xdc3, 0xdc4, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x69, 0x6e, 0x20, 0x25,
+0x32, 0x25, 0x31, 0x20, 0x69, 0x79, 0x6f, 0x20, 0x25, 0x32, 0x25, 0x31,
+0x2c, 0x20, 0x73, 0x61, 0x72, 0x65, 0x6e, 0x67, 0x20, 0x25, 0x32, 0x25,
+0x31, 0x20, 0x73, 0x61, 0x72, 0x65, 0x6e, 0x67, 0x20, 0x25, 0x32, 0x25,
+0x31, 0x20, 0x6f, 0x63, 0x68, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x718,
+0x25, 0x32, 0x25, 0x31, 0x20, 0xbae, 0xbb1, 0xbcd, 0xbb1, 0xbc1, 0xbae, 0xbcd,
+0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x4bb, 0x4d9, 0x43c, 0x20, 0x25, 0x32,
+0x25, 0x31, 0x20, 0xc2e, 0xc30, 0xc3f, 0xc2f, 0xc41, 0x20, 0x25, 0x32, 0x25,
+0x31, 0x20, 0xe41, 0xe25, 0xe30, 0x25, 0x32, 0x25, 0x31, 0xe41, 0xe25, 0xe30,
+0x25, 0x32, 0x25, 0x31, 0x1295, 0x20, 0x25, 0x32, 0x1295, 0x25, 0x31, 0x20,
+0x6d, 0x6f, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x76, 0x65, 0x20, 0x25,
+0x32, 0x25, 0x31, 0x20, 0x77, 0x65, 0x20, 0x25, 0x32, 0x25, 0x31, 0x60c,
+0x20, 0x627, 0x648, 0x631, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x627, 0x648,
+0x631, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x76, 0x61, 0x20, 0x25, 0x32,
+0x25, 0x31, 0x20, 0x76, 0xe0, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20,
+0x61, 0x28, 0x63, 0x29, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x61, 0x28,
+0x63, 0x29, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x5d0, 0x5d5, 0x5df, 0x20,
+0x25, 0x32, 0x25, 0x31, 0x20, 0x63, 0x61, 0x65, 0x75, 0x71, 0x20, 0x25,
+0x32, 0x25, 0x31, 0x2c, 0x20, 0x6e, 0x65, 0x2d, 0x25, 0x32, 0x25, 0x31,
+0x20, 0x6e, 0x65, 0x2d, 0x25, 0x32, 0x25, 0x31, 0x20, 0x6b, 0x61, 0x72,
+0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x61, 0x73, 0x75, 0xed, 0x20, 0x25,
+0x32, 0x25, 0x31, 0x60c, 0x25, 0x32, 0x25, 0x31, 0x20, 0x60c, 0x622, 0x6ba,
+0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x622, 0x6ba, 0x20, 0x25, 0x32, 0x25,
+0x31, 0x2c, 0x20, 0x915, 0x928, 0x947, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20,
+0x915, 0x928, 0x947, 0x20, 0x25, 0x32
};
-static const char16_t single_character_data[] = {
-0x2e, 0x2c, 0x25, 0x30, 0x2d, 0x2b, 0x65, 0x22, 0x27, 0x45, 0x201c, 0x201d, 0x2018, 0x2019, 0xa0, 0x201e, 0x201a, 0xab, 0xbb, 0x2039,
-0x203a, 0x66b, 0x66c, 0x66a, 0x61c, 0x660, 0x61c, 0x2d, 0x61c, 0x2b, 0x627, 0x633, 0x200e, 0x25, 0x200e, 0x200e, 0x2d, 0x200e, 0x2b, 0x9e6,
-0x2212, 0x1040, 0x300c, 0x300d, 0x300e, 0x300f, 0x200f, 0x2d, 0x200f, 0x2b, 0xd804, 0xdd36, 0xd7, 0x31, 0x30, 0x5e, 0xf20, 0x202f, 0x2e41, 0xd83a,
-0xdd50, 0x6f0, 0x200e, 0x2b, 0x200e, 0xd7, 0x6f1, 0x6f0, 0x5e, 0x966, 0xb7, 0x31, 0x30, 0x5e, 0x200e, 0x2212, 0x1c50, 0x415
+static constexpr char16_t single_character_data[] = {
+0x2e, 0x2c, 0x25, 0x30, 0x2d, 0x2b, 0x65, 0x22, 0x27, 0xa0, 0x45, 0xab,
+0xbb, 0x201e, 0x201c, 0x201d, 0x2018, 0x2019, 0x201a, 0x2039, 0x203a, 0x66b, 0x66c, 0x66a,
+0x61c, 0x660, 0x61c, 0x2d, 0x61c, 0x2b, 0x623, 0x633, 0x200e, 0x25, 0x200e, 0x200e,
+0x2d, 0x200e, 0x2b, 0x9e6, 0x6f0, 0x200e, 0x2b, 0x200e, 0xd7, 0x6f1, 0x6f0, 0x5e,
+0x2212, 0x966, 0x1040, 0x300c, 0x300d, 0x300e, 0x300f, 0x200f, 0x2d, 0x200f, 0x2b, 0x627,
+0x633, 0xd804, 0xdd36, 0xd7, 0x31, 0x30, 0x5e, 0xf20, 0x202f, 0x2e41, 0xd83a, 0xdd50,
+0xd83a, 0xdd09, 0x12c8, 0xabf0, 0x60c, 0x7c0, 0xb7, 0x31, 0x30, 0x5e, 0x200e, 0x2212,
+0x1c50, 0x415
};
-static const char16_t date_format_data[] = {
-0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x20, 0x4d,
-0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x64, 0x2c, 0x20,
-0x64, 0x64, 0x64, 0x64, 0x79, 0x79, 0x79, 0x79, 0x2d, 0x4d, 0x4d, 0x2d, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x20, 0x64,
-0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x20, 0x64, 0x20, 0x4d, 0x4d,
-0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x2f, 0x4d, 0x2f, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c,
-0x20, 0x79, 0x79, 0x79, 0x79, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x64, 0x64, 0x79, 0x79, 0x2f, 0x4d, 0x4d, 0x2f, 0x64,
-0x64, 0x64, 0x2e, 0x4d, 0x2e, 0x79, 0x79, 0x64, 0x64, 0x2f, 0x4d, 0x4d, 0x2f, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64,
-0x64, 0x60c, 0x20, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x200f, 0x2f, 0x4d, 0x200f, 0x2f,
-0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x20, 0x569, 0x2e, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x64, 0x2c, 0x20,
-0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x2e, 0x4d, 0x4d, 0x2e, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x20,
-0x4d, 0x4d, 0x4d, 0x4d, 0x2c, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x2d, 0x4d, 0x2d, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64,
-0x64, 0x64, 0x2c, 0x20, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x27, 0x64, 0x65, 0x27, 0x20, 0x79, 0x79, 0x79, 0x79,
-0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x2c, 0x20, 0x64, 0x64, 0x64, 0x64, 0x79, 0x79, 0x79,
-0x79, 0x28, 0x27, 0x65, 0x27, 0x29, 0x27, 0x6b, 0x6f, 0x27, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x27, 0x72, 0x65, 0x6e, 0x27,
-0x20, 0x64, 0x28, 0x27, 0x61, 0x27, 0x29, 0x2c, 0x20, 0x64, 0x64, 0x64, 0x64, 0x79, 0x79, 0x2f, 0x4d, 0x2f, 0x64, 0x64,
-0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x20, 0x27, 0x433, 0x27,
-0x2e, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x64, 0x2c, 0x20, 0x79, 0x79, 0x79, 0x79, 0x4d,
-0x2f, 0x64, 0x2f, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x2e, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79,
-0x79, 0x79, 0x79, 0x2e, 0x64, 0x2e, 0x20, 0x4d, 0x2e, 0x20, 0x79, 0x79, 0x79, 0x79, 0x2e, 0x64, 0x64, 0x64, 0x64, 0x2c,
-0x20, 0x64, 0x64, 0x2e, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x2e, 0x64, 0x2e, 0x4d, 0x2e, 0x79,
-0x79, 0x2e, 0x64, 0x2e, 0x4d, 0x4d, 0x2e, 0x79, 0x79, 0x20, 0x27, 0x433, 0x27, 0x2e, 0x79, 0x79, 0x79, 0x79, 0x2d, 0x20,
-0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x64, 0x2d, 0x20, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x2d, 0x4d, 0x4d, 0x2d, 0x79, 0x79,
-0x79, 0x79, 0x79, 0x79, 0x5e74, 0x4d, 0x6708, 0x64, 0x65e5, 0x20, 0x64, 0x64, 0x64, 0x64, 0x79, 0x79, 0x79, 0x79, 0x2f, 0x4d,
-0x2f, 0x64, 0x79, 0x79, 0x79, 0x79, 0x5e74, 0x4d, 0x6708, 0x64, 0x65e5, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x2c,
-0x20, 0x27, 0x64, 0xe4, 0x27, 0x20, 0x64, 0x2e, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64,
-0x2e, 0x20, 0x4d, 0x4d, 0x2e, 0x20, 0x79, 0x79, 0x79, 0x79, 0x2e, 0x64, 0x2e, 0x20, 0x4d, 0x2e, 0x20, 0x79, 0x79, 0x2e,
-0x64, 0x64, 0x64, 0x64, 0x20, 0x64, 0x2e, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64,
-0x64, 0x20, 0x27, 0x64, 0x65, 0x6e, 0x27, 0x20, 0x64, 0x2e, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79,
-0x64, 0x64, 0x2e, 0x4d, 0x4d, 0x2e, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x2c, 0x20, 0x4d,
-0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf63,
-0xf7c, 0xf0b, 0x79, 0x79, 0x79, 0x79, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0xf5a, 0xf7a, 0xf66, 0xf0b, 0x64, 0x64, 0x64, 0x64,
-0x64, 0x64, 0x2c, 0x20, 0x64, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79,
-0x2f, 0x4d, 0x4d, 0x2f, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x2d, 0x27, 0x61, 0x27, 0x20, 0x27, 0x64,
-0x65, 0x27, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x4d, 0x4d,
-0x4d, 0x4d, 0x20, 0x64, 0x20, 0x27, 0x6c, 0x69, 0x61, 0x27, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x2e, 0x4d, 0x2e, 0x79,
-0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x20, 0x64, 0x20, 0x27, 0x64, 0x69, 0x27, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20,
-0x27, 0x64, 0x61, 0x6c, 0x27, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x20, 0x64, 0x20, 0x4d, 0x4d, 0x4d,
-0x4d, 0x2e41, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x27, 0x6d, 0x68, 0x27, 0x20, 0x4d,
-0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x20, 0x27, 0x64, 0x65, 0x27,
-0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x27, 0x64, 0x65, 0x27, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c,
-0x20, 0x64, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x2c, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x20, 0x64,
-0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x2c, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x20, 0x5d1,
-0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x2e, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20,
-0x64, 0x2e, 0x2c, 0x20, 0x64, 0x64, 0x64, 0x64, 0x79, 0x79, 0x79, 0x79, 0x2e, 0x20, 0x4d, 0x4d, 0x2e, 0x20, 0x64, 0x64,
-0x2e, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x64, 0x2e, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64,
-0x64, 0x64, 0x64, 0x20, 0x27, 0x6c, 0x65, 0x27, 0x20, 0x64, 0x20, 0x27, 0x64, 0x65, 0x27, 0x20, 0x4d, 0x4d, 0x4d, 0x4d,
-0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x20, 0x27, 0x64, 0x69, 0x27, 0x20, 0x4d, 0x4d,
-0x4d, 0x4d, 0x20, 0x27, 0x64, 0x69, 0x27, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x2f, 0x4d, 0x4d, 0x20, 0x79, 0x79,
-0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x20, 0x27, 0x436, 0x27, 0x2e, 0x20, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x2c, 0x20,
-0x64, 0x64, 0x64, 0x64, 0x79, 0x79, 0x79, 0x79, 0xb144, 0x20, 0x4d, 0xc6d4, 0x20, 0x64, 0xc77c, 0x20, 0x64, 0x64, 0x64, 0x64,
-0x79, 0x79, 0x2e, 0x20, 0x4d, 0x2e, 0x20, 0x64, 0x2e, 0x79, 0x79, 0x79, 0x79, 0x2d, 0x27, 0x436, 0x27, 0x2e, 0x2c, 0x20,
-0x64, 0x2d, 0x4d, 0x4d, 0x4d, 0x4d, 0x2c, 0x20, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x20, 0xe97, 0xeb5, 0x20,
-0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x79, 0x79, 0x79,
-0x79, 0x2e, 0x20, 0x27, 0x67, 0x61, 0x64, 0x61, 0x27, 0x20, 0x64, 0x2e, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x79, 0x79, 0x79,
-0x79, 0x20, 0x27, 0x6d, 0x27, 0x2e, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x64, 0x20, 0x27, 0x64, 0x27, 0x2e, 0x2c, 0x20,
-0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x27, 0x64, 0x65, 0x27, 0x20, 0x64, 0x2e, 0x20, 0x4d, 0x4d,
-0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x2c, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x64, 0x2c,
-0x20, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x20, 0x27, 0x74, 0x61, 0x27, 0x2019, 0x20, 0x4d,
-0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x64, 0x2c, 0x20, 0x79, 0x79, 0x79, 0x79,
-0x2c, 0x20, 0x64, 0x64, 0x64, 0x64, 0x79, 0x79, 0x79, 0x79, 0x20, 0x27, 0x43e, 0x43d, 0x44b, 0x27, 0x20, 0x4d, 0x4d, 0x4d,
-0x4d, 0x27, 0x44b, 0x43d, 0x27, 0x20, 0x64, 0x2c, 0x20, 0x64, 0x64, 0x64, 0x64, 0x20, 0x27, 0x433, 0x430, 0x440, 0x430, 0x433,
-0x27, 0x79, 0x79, 0x79, 0x79, 0x2e, 0x4d, 0x4d, 0x2e, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x20, 0x2c, 0x20, 0x27, 0x6c,
-0x79, 0x25b, 0x27, 0x30c, 0x2bc, 0x20, 0x64, 0x20, 0x27, 0x6e, 0x61, 0x27, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x2c, 0x20, 0x79,
-0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x2c, 0x20, 0x79, 0x79, 0x79,
-0x79, 0x20, 0x27, 0x430, 0x437, 0x27, 0x64, 0x64, 0x64, 0x64, 0x20, 0x62f, 0x20, 0x79, 0x79, 0x79, 0x79, 0x20, 0x62f, 0x20,
-0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x64, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x27, 0x69, 0x6c, 0x73, 0x27, 0x20, 0x64, 0x20,
-0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x20, 0x27, 0x441, 0x44b, 0x43b, 0x27, 0x20,
-0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x64, 0x20, 0x27, 0x43a, 0x4af, 0x43d, 0x44d, 0x27, 0x2c, 0x20, 0x64, 0x64, 0x64, 0x64, 0x64,
-0x20, 0x27, 0x64, 0x65, 0x27, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x27, 0x64, 0x65, 0x27, 0x20, 0x27, 0x73, 0x75, 0x27,
-0x20, 0x79, 0x79, 0x79, 0x79, 0x2c, 0x20, 0x27, 0x64, 0x65, 0x27, 0x20, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64,
-0x20, 0x64, 0x64, 0x20, 0x27, 0x64, 0x65, 0x27, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x27, 0x64, 0x65, 0x27, 0x20, 0x79,
-0x79, 0x79, 0x79, 0x4d, 0x4d, 0x2f, 0x64, 0x64, 0x2f, 0x79, 0x79, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x2c, 0x20, 0x79,
-0x79, 0x79, 0x79, 0x20, 0x27, 0x435, 0x43b, 0x27, 0x2c, 0x20, 0x64, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x4d, 0x4d, 0x4d,
-0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x2c, 0x20, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0xe17, 0xe35, 0xe48, 0x20,
-0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x20, 0x4d, 0x4d, 0x4d, 0x4d,
-0xf60, 0xf72, 0xf0b, 0xf5a, 0xf7a, 0xf66, 0xf0b, 0x64, 0x2c, 0x20, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x1363, 0x20,
-0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79,
-0x79, 0x79, 0x20, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20,
-0x79, 0x79, 0x79, 0x79, 0x20, 0x27, 0x440, 0x27, 0x2e, 0x64, 0x64, 0x64, 0x64, 0x60c, 0x20, 0x64, 0x20, 0x4d, 0x4d, 0x4d,
-0x4d, 0x60c, 0x20, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x20, 0x64, 0x2d, 0x4d, 0x4d, 0x4d, 0x4d, 0x60c, 0x20,
-0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x2d, 0x4d, 0x4d, 0x4d, 0x4d, 0x2c, 0x20, 0x79, 0x79,
-0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x20, 0x646, 0x686, 0x6cc, 0x20, 0x6cc, 0x6cc, 0x644, 0x20, 0x64, 0x20, 0x646, 0x686, 0x6cc,
-0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x64, 0x64, 0x64, 0x64, 0x20, 0x6a9, 0x648, 0x646, 0x6cc, 0x64, 0x64, 0x64, 0x64, 0x2c,
-0x20, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x2c, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x5d8,
-0x5df, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x20, 0x4d,
-0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x20, 0x27, 0x6e, 0x65, 0x27, 0x20,
-0x4d, 0x4d, 0x4d, 0x4d, 0x2c, 0x20, 0x79, 0x79, 0x79, 0x79
+static constexpr char16_t date_format_data[] = {
+0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d,
+0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x20, 0x79,
+0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x20, 0x4d,
+0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x20, 0x27, 0x448, 0x27,
+0x2e, 0x64, 0x64, 0x2e, 0x4d, 0x4d, 0x2e, 0x79, 0x79, 0x79, 0x79, 0x64,
+0x64, 0x64, 0x64, 0x2c, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x64, 0x64,
+0x2c, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x2f, 0x4d, 0x4d, 0x2f,
+0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x20, 0x64, 0x64, 0x20, 0x4d, 0x4d,
+0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x2d,
+0x4d, 0x4d, 0x2d, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x20, 0x64, 0x20,
+0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x2f, 0x4d,
+0x2f, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x79,
+0x79, 0x79, 0x79, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x64, 0x64, 0x79,
+0x79, 0x2f, 0x4d, 0x4d, 0x2f, 0x64, 0x64, 0x79, 0x79, 0x79, 0x79, 0x20,
+0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x64, 0x2c, 0x20, 0x64, 0x64, 0x64, 0x64,
+0x64, 0x2e, 0x4d, 0x2e, 0x79, 0x79, 0x64, 0x64, 0x2f, 0x4d, 0x4d, 0x2f,
+0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x60c, 0x20, 0x64, 0x20,
+0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x200f, 0x2f,
+0x4d, 0x200f, 0x2f, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c,
+0x20, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x27, 0x64, 0x65, 0x27,
+0x20, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x20, 0x569, 0x2e,
+0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x64, 0x2c, 0x20, 0x64, 0x64, 0x64,
+0x64, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x20, 0x4d, 0x4d, 0x4d,
+0x4d, 0x2c, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x2d, 0x4d, 0x2d, 0x79,
+0x79, 0x79, 0x79, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79,
+0x79, 0x79, 0x2c, 0x20, 0x64, 0x64, 0x64, 0x64, 0x79, 0x79, 0x79, 0x79,
+0x28, 0x27, 0x65, 0x27, 0x29, 0x27, 0x6b, 0x6f, 0x27, 0x20, 0x4d, 0x4d,
+0x4d, 0x4d, 0x27, 0x72, 0x65, 0x6e, 0x27, 0x20, 0x64, 0x28, 0x27, 0x61,
+0x27, 0x29, 0x2c, 0x20, 0x64, 0x64, 0x64, 0x64, 0x79, 0x79, 0x2f, 0x4d,
+0x2f, 0x64, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x20, 0x4d, 0x4d,
+0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x202f, 0x27, 0x433, 0x27, 0x2e,
+0x64, 0x64, 0x64, 0x64, 0x1361, 0x20, 0x64, 0x64, 0x20, 0x4d, 0x4d, 0x4d,
+0x4d, 0x20, 0x130d, 0x122d, 0x130b, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64,
+0x2d, 0x4d, 0x4d, 0x2d, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64,
+0x2c, 0x20, 0x64, 0x2e, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79,
+0x79, 0x79, 0x2e, 0x64, 0x2e, 0x20, 0x4d, 0x2e, 0x20, 0x79, 0x79, 0x79,
+0x79, 0x2e, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x64, 0x2e, 0x20,
+0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x2e, 0x64, 0x2e,
+0x4d, 0x2e, 0x79, 0x79, 0x2e, 0x64, 0x2e, 0x4d, 0x4d, 0x2e, 0x79, 0x79,
+0x202f, 0x27, 0x433, 0x27, 0x2e, 0x79, 0x79, 0x79, 0x79, 0x104a, 0x20, 0x4d,
+0x4d, 0x4d, 0x4d, 0x20, 0x64, 0x104a, 0x20, 0x64, 0x64, 0x64, 0x64, 0x79,
+0x79, 0x79, 0x79, 0x5e74, 0x4d, 0x6708, 0x64, 0x65e5, 0x20, 0x64, 0x64, 0x64,
+0x64, 0x79, 0x79, 0x79, 0x79, 0x2f, 0x4d, 0x2f, 0x64, 0x79, 0x79, 0x79,
+0x79, 0x5e74, 0x4d, 0x6708, 0x64, 0x65e5, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64,
+0x64, 0x64, 0x2c, 0x20, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x27,
+0x64, 0x65, 0x6c, 0x27, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64,
+0x64, 0x2c, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x64, 0x2c, 0x20, 0x79,
+0x79, 0x79, 0x79, 0x4d, 0x2f, 0x64, 0x2f, 0x79, 0x79, 0x64, 0x64, 0x64,
+0x64, 0x2c, 0x20, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x27, 0x43b,
+0x27, 0x2e, 0x20, 0x79, 0x79, 0x79, 0x79, 0x2e, 0x79, 0x79, 0x79, 0x79,
+0x2e, 0x4d, 0x4d, 0x2e, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20,
+0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x202f,
+0x27, 0x4ab, 0x27, 0x2e, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x27, 0x64,
+0xe4, 0x27, 0x20, 0x64, 0x2e, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79,
+0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x20, 0x64, 0x20, 0x4d, 0x4d,
+0x4d, 0x4d, 0x20, 0x27, 0x64, 0x69, 0x27, 0x20, 0x27, 0x75, 0x27, 0x20,
+0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x2e, 0x20, 0x4d, 0x4d, 0x2e, 0x20,
+0x79, 0x79, 0x79, 0x79, 0x2e, 0x64, 0x2e, 0x20, 0x4d, 0x2e, 0x20, 0x79,
+0x79, 0x2e, 0x64, 0x64, 0x64, 0x64, 0x20, 0x64, 0x2e, 0x20, 0x4d, 0x4d,
+0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x20,
+0x27, 0x64, 0x65, 0x6e, 0x27, 0x20, 0x64, 0x2e, 0x20, 0x4d, 0x4d, 0x4d,
+0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20,
+0x64, 0x2c, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79,
+0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf63,
+0xf7c, 0xf0b, 0x79, 0x79, 0x79, 0x79, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20,
+0xf5a, 0xf7a, 0xf66, 0xf0b, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20,
+0x64, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79,
+0x64, 0x64, 0x64, 0x64, 0x20, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x2c,
+0x20, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x2f, 0x4d, 0x4d,
+0x2f, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x27, 0x6c, 0x61,
+0x27, 0x20, 0x64, 0x2d, 0x27, 0x61, 0x27, 0x20, 0x27, 0x64, 0x65, 0x27,
+0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64,
+0x64, 0x64, 0x2c, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x64, 0x20, 0x27,
+0x6c, 0x69, 0x61, 0x27, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x2e, 0x4d,
+0x2e, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x20, 0x64, 0x20,
+0x27, 0x64, 0x69, 0x27, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x27, 0x64,
+0x61, 0x6c, 0x27, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64,
+0x20, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x2e41, 0x20, 0x79, 0x79, 0x79,
+0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x27, 0x6d, 0x68, 0x27,
+0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64,
+0x64, 0x64, 0x2c, 0x20, 0x64, 0x20, 0x27, 0x64, 0x65, 0x27, 0x20, 0x4d,
+0x4d, 0x4d, 0x4d, 0x20, 0x27, 0x64, 0x65, 0x27, 0x20, 0x79, 0x79, 0x79,
+0x79, 0x64, 0x64, 0x64, 0x64, 0x1365, 0x20, 0x64, 0x64, 0x20, 0x4d, 0x4d,
+0x4d, 0x4d, 0x20, 0x1218, 0x12d3, 0x120d, 0x1275, 0x20, 0x79, 0x79, 0x79, 0x79,
+0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x64, 0x20, 0x4d, 0x4d, 0x4d,
+0x4d, 0x2c, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c,
+0x20, 0x64, 0x20, 0x5d1, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79,
+0x79, 0x79, 0x79, 0x79, 0x79, 0x2e, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20,
+0x64, 0x2e, 0x2c, 0x20, 0x64, 0x64, 0x64, 0x64, 0x79, 0x79, 0x79, 0x79,
+0x2e, 0x20, 0x4d, 0x4d, 0x2e, 0x20, 0x64, 0x64, 0x2e, 0x64, 0x64, 0x64,
+0x64, 0x2c, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x64, 0x2e, 0x20, 0x79,
+0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x20, 0x27, 0x6c, 0x65, 0x27,
+0x20, 0x64, 0x20, 0x27, 0x64, 0x65, 0x27, 0x20, 0x4d, 0x4d, 0x4d, 0x4d,
+0x20, 0x79, 0x79, 0x79, 0x79, 0x4d, 0x4d, 0x2f, 0x64, 0x64, 0x2f, 0x79,
+0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x20, 0x27,
+0x64, 0x69, 0x27, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x27, 0x64, 0x69,
+0x27, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x2f, 0x4d, 0x4d, 0x20,
+0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x202f, 0x27, 0x436, 0x27,
+0x2e, 0x20, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x2c, 0x20, 0x64, 0x64,
+0x64, 0x64, 0x79, 0x79, 0x79, 0x79, 0xb144, 0x20, 0x4d, 0x4d, 0x4d, 0x4d,
+0x20, 0x64, 0xc77c, 0x20, 0x64, 0x64, 0x64, 0x64, 0x79, 0x79, 0x2e, 0x20,
+0x4d, 0x2e, 0x20, 0x64, 0x2e, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64,
+0x27, 0xea, 0x27, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x27, 0x61, 0x27, 0x20,
+0x79, 0x79, 0x79, 0x79, 0x27, 0x61, 0x6e, 0x27, 0x79, 0x79, 0x79, 0x79,
+0x2d, 0x27, 0x436, 0x27, 0x2e, 0x2c, 0x20, 0x64, 0x2d, 0x4d, 0x4d, 0x4d,
+0x4d, 0x2c, 0x20, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x20,
+0xe97, 0xeb5, 0x20, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79,
+0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x27, 0x64, 0x69, 0x65,
+0x27, 0x20, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79,
+0x79, 0x64, 0x20, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64,
+0x64, 0x2c, 0x20, 0x79, 0x79, 0x79, 0x79, 0x2e, 0x20, 0x27, 0x67, 0x61,
+0x64, 0x61, 0x27, 0x20, 0x64, 0x2e, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x79,
+0x79, 0x79, 0x79, 0x20, 0x27, 0x6d, 0x27, 0x2e, 0x20, 0x4d, 0x4d, 0x4d,
+0x4d, 0x20, 0x64, 0x20, 0x27, 0x64, 0x27, 0x2e, 0x2c, 0x20, 0x64, 0x64,
+0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x27, 0x64, 0x65, 0x27,
+0x20, 0x64, 0x2e, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79,
+0x79, 0x79, 0x79, 0x79, 0x79, 0x2c, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20,
+0x64, 0x2c, 0x20, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x2c,
+0x20, 0x64, 0x20, 0x27, 0x74, 0x61, 0x27, 0x2019, 0x20, 0x4d, 0x4d, 0x4d,
+0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x64,
+0x2c, 0x20, 0x79, 0x79, 0x79, 0x79, 0x2c, 0x20, 0x64, 0x64, 0x64, 0x64,
+0x79, 0x79, 0x79, 0x79, 0x202f, 0x27, 0x43e, 0x43d, 0x44b, 0x27, 0x20, 0x4d,
+0x4d, 0x4d, 0x4d, 0x27, 0x44b, 0x43d, 0x27, 0x20, 0x64, 0x2c, 0x20, 0x64,
+0x64, 0x64, 0x64, 0x20, 0x27, 0x433, 0x430, 0x440, 0x430, 0x433, 0x27, 0x79,
+0x79, 0x79, 0x79, 0x20, 0x1823, 0x1828, 0x20, 0x180e, 0x180e, 0x180e, 0x1824, 0x20,
+0x4d, 0x4d, 0x4d, 0x4d, 0x180e, 0x180e, 0x1822, 0x1822, 0x1828, 0x64, 0x2e, 0x20,
+0x64, 0x64, 0x64, 0x64, 0x20, 0x180b, 0x182d, 0x1820, 0x1837, 0x1820, 0x182d, 0x64,
+0x64, 0x64, 0x64, 0x20, 0x2c, 0x20, 0x27, 0x6c, 0x79, 0x25b, 0x27, 0x30c,
+0x2bc, 0x20, 0x64, 0x20, 0x27, 0x6e, 0x61, 0x27, 0x20, 0x4d, 0x4d, 0x4d,
+0x4d, 0x2c, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x20,
+0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x27, 0x64, 0x65, 0x27, 0x20,
+0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x20,
+0x4d, 0x4d, 0x4d, 0x4d, 0x2c, 0x20, 0x79, 0x79, 0x79, 0x79, 0x202f, 0x27,
+0x430, 0x437, 0x27, 0x64, 0x64, 0x64, 0x64, 0x20, 0x62f, 0x20, 0x79, 0x79,
+0x79, 0x79, 0x20, 0x62f, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x64, 0x64,
+0x64, 0x64, 0x64, 0x2c, 0x20, 0x79, 0x79, 0x79, 0x79, 0x20, 0x27, 0x6d,
+0x65, 0x74, 0x74, 0x61, 0x73, 0x27, 0x20, 0x64, 0x2e, 0x20, 0x4d, 0x4d,
+0x4d, 0x4d, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x27, 0x69, 0x6c, 0x73,
+0x27, 0x20, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79,
+0x79, 0x79, 0x79, 0x79, 0x79, 0x202f, 0x27, 0x441, 0x44b, 0x43b, 0x27, 0x20,
+0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x64, 0x20, 0x27, 0x43a, 0x4af, 0x43d, 0x44d,
+0x27, 0x2c, 0x20, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x20,
+0x64, 0x20, 0x27, 0x64, 0x65, 0x27, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20,
+0x27, 0x64, 0x65, 0x27, 0x20, 0x27, 0x73, 0x75, 0x27, 0x20, 0x79, 0x79,
+0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x20, 0x64, 0x64, 0x20, 0x27, 0x64,
+0x65, 0x27, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x27, 0x64, 0x65, 0x27,
+0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x60c, 0x20, 0x64,
+0x20, 0x712, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64,
+0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x2c, 0x20, 0x79, 0x79, 0x79, 0x79, 0x202f,
+0x27, 0x435, 0x43b, 0x27, 0x2c, 0x20, 0x64, 0x64, 0x64, 0x64, 0x64, 0x2c,
+0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x2c, 0x20,
+0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0xe17, 0xe35, 0xe48, 0x20,
+0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x79,
+0x79, 0x79, 0x79, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0xf60, 0xf72, 0xf0b, 0xf5a,
+0xf7a, 0xf66, 0xf0b, 0x64, 0x2c, 0x20, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64,
+0x64, 0x64, 0x1361, 0x20, 0x64, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20,
+0x12ee, 0x121d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x1363,
+0x20, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79,
+0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x20,
+0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x20,
+0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x202f, 0x27, 0x440,
+0x27, 0x2e, 0x64, 0x64, 0x64, 0x64, 0x60c, 0x20, 0x64, 0x20, 0x4d, 0x4d,
+0x4d, 0x4d, 0x60c, 0x20, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79,
+0x20, 0x64, 0x2d, 0x4d, 0x4d, 0x4d, 0x4d, 0x60c, 0x20, 0x64, 0x64, 0x64,
+0x64, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x2d, 0x4d, 0x4d, 0x4d,
+0x4d, 0x2c, 0x20, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x20,
+0x646, 0x686, 0x6cc, 0x20, 0x6cc, 0x6cc, 0x644, 0x20, 0x64, 0x20, 0x646, 0x686,
+0x6cc, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x64, 0x64, 0x64, 0x64, 0x20,
+0x6a9, 0x648, 0x646, 0x6cc, 0x79, 0x79, 0x79, 0x79, 0x20, 0x4d, 0x4d, 0x4d,
+0x4d, 0x27, 0x61, 0x27, 0x20, 0x27, 0x64, 0x27, 0x2e, 0x20, 0x64, 0x27,
+0x69, 0x64, 0x27, 0x64, 0x64, 0x64, 0x64, 0x1365, 0x20, 0x64, 0x64, 0x20,
+0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x130b, 0x120b, 0x1233, 0x20, 0x79, 0x79, 0x79,
+0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x20, 0x4d, 0x4d, 0x4d,
+0x2c, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20,
+0x64, 0x5d8, 0x5df, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79,
+0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x20, 0x4d, 0x4d, 0x4d,
+0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64,
+0x20, 0x27, 0x6e, 0x65, 0x27, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x2c, 0x20,
+0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x20, 0x64, 0x20, 0x4d,
+0x4d, 0x4d, 0x4d, 0x20, 0x27, 0x64, 0x6f, 0x27, 0x20, 0x79, 0x79, 0x79,
+0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20,
+0x64, 0x20, 0x79, 0x79, 0x79, 0x79, 0x4d, 0x2f, 0x64, 0x2f, 0x79, 0x79,
+0x79, 0x79
};
-static const char16_t time_format_data[] = {
-0x48, 0x48, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x20, 0x74, 0x68, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x20, 0x41, 0x50,
-0x20, 0x74, 0x68, 0x3a, 0x6d, 0x6d, 0x20, 0x41, 0x50, 0x68, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x20, 0x41, 0x50, 0x2c,
-0x20, 0x74, 0x41, 0x50, 0x20, 0x68, 0x2e, 0x6d, 0x6d, 0x2e, 0x73, 0x73, 0x20, 0x74, 0x48, 0x48, 0x3a, 0x6d, 0x6d, 0x3a,
-0x73, 0x73, 0x20, 0x28, 0x74, 0x29, 0x48, 0x48, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x2c, 0x20, 0x74, 0x48, 0x3a, 0x6d,
-0x6d, 0x3a, 0x73, 0x73, 0x20, 0x27, 0x447, 0x27, 0x2e, 0x20, 0x74, 0x48, 0x3a, 0x6d, 0x6d, 0x20, 0x27, 0x447, 0x27, 0x2e,
-0x74, 0x20, 0x48, 0x48, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x41, 0x50, 0x68, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x20,
-0x5b, 0x74, 0x5d, 0x74, 0x20, 0x41, 0x50, 0x68, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x42, 0x68, 0x3a, 0x6d, 0x6d, 0x3a,
-0x73, 0x73, 0x20, 0x5b, 0x74, 0x5d, 0x48, 0x48, 0x2e, 0x6d, 0x6d, 0x2e, 0x73, 0x73, 0x20, 0x74, 0xf46, 0xf74, 0xf0b, 0xf5a,
-0xf7c, 0xf51, 0xf0b, 0x20, 0x68, 0x20, 0xf66, 0xf90, 0xf62, 0xf0b, 0xf58, 0xf0b, 0x20, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x20, 0x41,
-0x50, 0x20, 0x74, 0xf46, 0xf74, 0xf0b, 0xf5a, 0xf7c, 0xf51, 0xf0b, 0x20, 0x68, 0x20, 0xf66, 0xf90, 0xf62, 0xf0b, 0xf58, 0xf0b, 0x20,
-0x6d, 0x6d, 0x20, 0x41, 0x50, 0x48, 0x2d, 0x27, 0x61, 0x27, 0x20, 0x27, 0x68, 0x6f, 0x72, 0x6f, 0x27, 0x20, 0x27, 0x6b,
-0x61, 0x6a, 0x27, 0x20, 0x6d, 0x3a, 0x73, 0x73, 0x20, 0x74, 0x41, 0x50, 0x20, 0x27, 0x67, 0x61, 0x27, 0x20, 0x68, 0x3a,
-0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x20, 0x74, 0x48, 0x20, 0x27, 0x68, 0x27, 0x20, 0x6d, 0x6d, 0x20, 0x27, 0x6d, 0x69, 0x6e,
-0x27, 0x20, 0x73, 0x73, 0x20, 0x27, 0x73, 0x27, 0x20, 0x74, 0x48, 0x48, 0x20, 0x27, 0x68, 0x27, 0x20, 0x6d, 0x6d, 0x20,
-0x27, 0x6d, 0x69, 0x6e, 0x27, 0x20, 0x73, 0x73, 0x20, 0x27, 0x73, 0x27, 0x20, 0x74, 0x48, 0x48, 0x2e, 0x6d, 0x6d, 0x3a,
-0x73, 0x73, 0x20, 0x27, 0x68, 0x27, 0x20, 0x74, 0x68, 0x68, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x20, 0x41, 0x50, 0x20,
-0x74, 0x68, 0x68, 0x3a, 0x6d, 0x6d, 0x20, 0x41, 0x50, 0x48, 0x6642, 0x6d, 0x6d, 0x5206, 0x73, 0x73, 0x79d2, 0x20, 0x74, 0x41,
-0x50, 0x20, 0x68, 0xc2dc, 0x20, 0x6d, 0xbd84, 0x20, 0x73, 0xcd08, 0x20, 0x74, 0x41, 0x50, 0x20, 0x68, 0x3a, 0x6d, 0x6d, 0x48,
-0x20, 0xec2, 0xea1, 0xe87, 0x20, 0x6d, 0x20, 0xe99, 0xeb2, 0xe97, 0xeb5, 0x20, 0x73, 0x73, 0x20, 0xea7, 0xeb4, 0xe99, 0xeb2, 0xe97,
-0xeb5, 0x20, 0x74, 0x27, 0x4b, 0x6c, 0x6f, 0x63, 0x6b, 0x27, 0x20, 0x48, 0x2e, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x20, 0x28,
-0x74, 0x29, 0x27, 0x4b, 0x6c, 0x27, 0x2e, 0x20, 0x48, 0x2e, 0x6d, 0x6d, 0x27, 0x6b, 0x6c, 0x27, 0x2e, 0x20, 0x48, 0x48,
-0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x20, 0x74, 0x74, 0x20, 0x68, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x20, 0x41, 0x50,
-0x41, 0x50, 0x20, 0x68, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x20, 0x74, 0x48, 0x20, 0xe19, 0xe32, 0xe2c, 0xe34, 0xe01, 0xe32,
-0x20, 0x6d, 0x6d, 0x20, 0xe19, 0xe32, 0xe17, 0xe35, 0x20, 0x73, 0x73, 0x20, 0xe27, 0xe34, 0xe19, 0xe32, 0xe17, 0xe35, 0x20, 0x74,
-0x48, 0x3a, 0x6d, 0x6d, 0x20, 0x27, 0x68, 0x6f, 0x64, 0x17a, 0x27, 0x2e
+static constexpr char16_t time_format_data[] = {
+0x48, 0x48, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x20, 0x74, 0x48, 0x48,
+0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x20, 0x74, 0x74, 0x74, 0x74, 0x68,
+0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x202f, 0x41, 0x70, 0x20, 0x74, 0x74,
+0x74, 0x74, 0x68, 0x3a, 0x6d, 0x6d, 0x202f, 0x41, 0x70, 0x68, 0x3a, 0x6d,
+0x6d, 0x3a, 0x73, 0x73, 0x202f, 0x41, 0x70, 0x2c, 0x20, 0x74, 0x74, 0x74,
+0x74, 0x68, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x20, 0x41, 0x70, 0x20,
+0x74, 0x74, 0x74, 0x74, 0x68, 0x3a, 0x6d, 0x6d, 0x20, 0x41, 0x70, 0x41,
+0x70, 0x20, 0x68, 0x2e, 0x6d, 0x6d, 0x2e, 0x73, 0x73, 0x20, 0x74, 0x74,
+0x74, 0x74, 0x48, 0x48, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x20, 0x28,
+0x74, 0x74, 0x74, 0x74, 0x29, 0x48, 0x48, 0x3a, 0x6d, 0x6d, 0x3a, 0x73,
+0x73, 0x2c, 0x20, 0x74, 0x74, 0x74, 0x74, 0x41, 0x70, 0x20, 0x68, 0x3a,
+0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x20, 0x74, 0x74, 0x74, 0x74, 0x41, 0x70,
+0x20, 0x928, 0x93f, 0x20, 0x68, 0x3a, 0x6d, 0x6d, 0x48, 0x3a, 0x6d, 0x6d,
+0x3a, 0x73, 0x73, 0x20, 0x27, 0x447, 0x27, 0x2e, 0x20, 0x74, 0x74, 0x74,
+0x74, 0x74, 0x74, 0x74, 0x74, 0x20, 0x48, 0x48, 0x3a, 0x6d, 0x6d, 0x3a,
+0x73, 0x73, 0x41, 0x70, 0x68, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x20,
+0x5b, 0x74, 0x74, 0x74, 0x74, 0x5d, 0x74, 0x74, 0x74, 0x74, 0x20, 0x41,
+0x70, 0x68, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x48, 0x48, 0x2e, 0x6d,
+0x6d, 0x2e, 0x73, 0x73, 0x20, 0x74, 0x74, 0x74, 0x74, 0xf46, 0xf74, 0xf0b,
+0xf5a, 0xf7c, 0xf51, 0xf0b, 0x20, 0x68, 0x20, 0xf66, 0xf90, 0xf62, 0xf0b, 0xf58,
+0xf0b, 0x20, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x20, 0x41, 0x70, 0x20, 0x74,
+0x74, 0x74, 0x74, 0xf46, 0xf74, 0xf0b, 0xf5a, 0xf7c, 0xf51, 0xf0b, 0x20, 0x68,
+0x20, 0xf66, 0xf90, 0xf62, 0xf0b, 0xf58, 0xf0b, 0x20, 0x6d, 0x6d, 0x20, 0x41,
+0x70, 0x41, 0x70, 0x20, 0x27, 0x67, 0x61, 0x27, 0x20, 0x68, 0x3a, 0x6d,
+0x6d, 0x3a, 0x73, 0x73, 0x20, 0x74, 0x74, 0x74, 0x74, 0x48, 0x20, 0x27,
+0x68, 0x27, 0x20, 0x6d, 0x6d, 0x20, 0x27, 0x6d, 0x69, 0x6e, 0x27, 0x20,
+0x73, 0x73, 0x20, 0x27, 0x73, 0x27, 0x20, 0x74, 0x74, 0x74, 0x74, 0x48,
+0x48, 0x20, 0x27, 0x68, 0x27, 0x20, 0x6d, 0x6d, 0x20, 0x27, 0x6d, 0x69,
+0x6e, 0x27, 0x20, 0x73, 0x73, 0x20, 0x27, 0x73, 0x27, 0x20, 0x74, 0x74,
+0x74, 0x74, 0x48, 0x48, 0x2e, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x20, 0x27,
+0x68, 0x27, 0x20, 0x74, 0x74, 0x74, 0x74, 0x68, 0x68, 0x3a, 0x6d, 0x6d,
+0x3a, 0x73, 0x73, 0x20, 0x41, 0x70, 0x20, 0x74, 0x74, 0x74, 0x74, 0x68,
+0x68, 0x3a, 0x6d, 0x6d, 0x20, 0x41, 0x70, 0x48, 0x6642, 0x6d, 0x6d, 0x5206,
+0x73, 0x73, 0x79d2, 0x20, 0x74, 0x74, 0x74, 0x74, 0x41, 0x70, 0x20, 0x68,
+0xc2dc, 0x20, 0x6d, 0xbd84, 0x20, 0x73, 0xcd08, 0x20, 0x74, 0x74, 0x74, 0x74,
+0x48, 0x20, 0xec2, 0xea1, 0xe87, 0x20, 0x6d, 0x20, 0xe99, 0xeb2, 0xe97, 0xeb5,
+0x20, 0x73, 0x73, 0x20, 0xea7, 0xeb4, 0xe99, 0xeb2, 0xe97, 0xeb5, 0x20, 0x74,
+0x74, 0x74, 0x74, 0x27, 0x4b, 0x6c, 0x6f, 0x63, 0x6b, 0x27, 0x20, 0x48,
+0x2e, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x20, 0x28, 0x74, 0x74, 0x74, 0x74,
+0x29, 0x27, 0x4b, 0x6c, 0x27, 0x2e, 0x20, 0x48, 0x2e, 0x6d, 0x6d, 0x68,
+0x2e, 0x6d, 0x6d, 0x2e, 0x73, 0x73, 0x20, 0x41, 0x70, 0x20, 0x74, 0x74,
+0x74, 0x74, 0x68, 0x2e, 0x6d, 0x6d, 0x2e, 0x20, 0x41, 0x70, 0x27, 0x6b,
+0x6c, 0x27, 0x2e, 0x20, 0x48, 0x48, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73,
+0x20, 0x74, 0x74, 0x74, 0x74, 0x74, 0x74, 0x74, 0x74, 0x20, 0x68, 0x3a,
+0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x202f, 0x41, 0x70, 0x48, 0x27, 0x68, 0x27,
+0x6d, 0x6d, 0x48, 0x20, 0xe19, 0xe32, 0xe2c, 0xe34, 0xe01, 0xe32, 0x20, 0x6d,
+0x6d, 0x20, 0xe19, 0xe32, 0xe17, 0xe35, 0x20, 0x73, 0x73, 0x20, 0xe27, 0xe34,
+0xe19, 0xe32, 0xe17, 0xe35, 0x20, 0x74, 0x74, 0x74, 0x74, 0x68, 0x68, 0x3a,
+0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x202f, 0x41, 0x70, 0x20, 0x74, 0x74, 0x74,
+0x74, 0x68, 0x68, 0x3a, 0x6d, 0x6d, 0x202f, 0x41, 0x70, 0x48, 0x3a, 0x6d,
+0x6d, 0x20, 0x27, 0x68, 0x6f, 0x64, 0x17a, 0x27, 0x2e
};
-static const char16_t days_data[] = {
-0x53, 0x75, 0x6e, 0x64, 0x61, 0x79, 0x3b, 0x4d, 0x6f, 0x6e, 0x64, 0x61, 0x79, 0x3b, 0x54, 0x75, 0x65, 0x73, 0x64, 0x61,
-0x79, 0x3b, 0x57, 0x65, 0x64, 0x6e, 0x65, 0x73, 0x64, 0x61, 0x79, 0x3b, 0x54, 0x68, 0x75, 0x72, 0x73, 0x64, 0x61, 0x79,
-0x3b, 0x46, 0x72, 0x69, 0x64, 0x61, 0x79, 0x3b, 0x53, 0x61, 0x74, 0x75, 0x72, 0x64, 0x61, 0x79, 0x53, 0x75, 0x6e, 0x3b,
-0x4d, 0x6f, 0x6e, 0x3b, 0x54, 0x75, 0x65, 0x3b, 0x57, 0x65, 0x64, 0x3b, 0x54, 0x68, 0x75, 0x3b, 0x46, 0x72, 0x69, 0x3b,
-0x53, 0x61, 0x74, 0x53, 0x3b, 0x4d, 0x3b, 0x54, 0x3b, 0x57, 0x3b, 0x54, 0x3b, 0x46, 0x3b, 0x53, 0x37, 0x3b, 0x31, 0x3b,
-0x32, 0x3b, 0x33, 0x3b, 0x34, 0x3b, 0x35, 0x3b, 0x36, 0x53, 0x6f, 0x6e, 0x64, 0x61, 0x67, 0x3b, 0x4d, 0x61, 0x61, 0x6e,
-0x64, 0x61, 0x67, 0x3b, 0x44, 0x69, 0x6e, 0x73, 0x64, 0x61, 0x67, 0x3b, 0x57, 0x6f, 0x65, 0x6e, 0x73, 0x64, 0x61, 0x67,
-0x3b, 0x44, 0x6f, 0x6e, 0x64, 0x65, 0x72, 0x64, 0x61, 0x67, 0x3b, 0x56, 0x72, 0x79, 0x64, 0x61, 0x67, 0x3b, 0x53, 0x61,
-0x74, 0x65, 0x72, 0x64, 0x61, 0x67, 0x53, 0x6f, 0x2e, 0x3b, 0x4d, 0x61, 0x2e, 0x3b, 0x44, 0x69, 0x2e, 0x3b, 0x57, 0x6f,
-0x2e, 0x3b, 0x44, 0x6f, 0x2e, 0x3b, 0x56, 0x72, 0x2e, 0x3b, 0x53, 0x61, 0x2e, 0x53, 0x3b, 0x4d, 0x3b, 0x44, 0x3b, 0x57,
-0x3b, 0x44, 0x3b, 0x56, 0x3b, 0x53, 0x74, 0x73, 0x75, 0x294, 0x6e, 0x74, 0x73, 0x268, 0x3b, 0x74, 0x73, 0x75, 0x294, 0x75,
-0x6b, 0x70, 0xe0, 0x3b, 0x74, 0x73, 0x75, 0x294, 0x75, 0x67, 0x68, 0x254, 0x65, 0x3b, 0x74, 0x73, 0x75, 0x294, 0x75, 0x74,
-0x254, 0x300, 0x6d, 0x6c, 0xf2, 0x3b, 0x74, 0x73, 0x75, 0x294, 0x75, 0x6d, 0xe8, 0x3b, 0x74, 0x73, 0x75, 0x294, 0x75, 0x67,
-0x68, 0x268, 0x302, 0x6d, 0x3b, 0x74, 0x73, 0x75, 0x294, 0x6e, 0x64, 0x7a, 0x268, 0x6b, 0x254, 0x294, 0x254, 0x6e, 0x74, 0x73,
-0x3b, 0x6b, 0x70, 0x61, 0x3b, 0x67, 0x68, 0x254, 0x3b, 0x74, 0x254, 0x6d, 0x3b, 0x75, 0x6d, 0x65, 0x3b, 0x67, 0x68, 0x268,
-0x3b, 0x64, 0x7a, 0x6b, 0x6e, 0x3b, 0x6b, 0x3b, 0x67, 0x3b, 0x74, 0x3b, 0x75, 0x3b, 0x67, 0x3b, 0x64, 0x4b, 0x77, 0x65,
-0x73, 0x69, 0x64, 0x61, 0x3b, 0x44, 0x77, 0x6f, 0x77, 0x64, 0x61, 0x3b, 0x42, 0x65, 0x6e, 0x61, 0x64, 0x61, 0x3b, 0x57,
-0x75, 0x6b, 0x75, 0x64, 0x61, 0x3b, 0x59, 0x61, 0x77, 0x64, 0x61, 0x3b, 0x46, 0x69, 0x64, 0x61, 0x3b, 0x4d, 0x65, 0x6d,
-0x65, 0x6e, 0x65, 0x64, 0x61, 0x4b, 0x77, 0x65, 0x3b, 0x44, 0x77, 0x6f, 0x3b, 0x42, 0x65, 0x6e, 0x3b, 0x57, 0x75, 0x6b,
-0x3b, 0x59, 0x61, 0x77, 0x3b, 0x46, 0x69, 0x61, 0x3b, 0x4d, 0x65, 0x6d, 0x4b, 0x3b, 0x44, 0x3b, 0x42, 0x3b, 0x57, 0x3b,
-0x59, 0x3b, 0x46, 0x3b, 0x4d, 0x65, 0x20, 0x64, 0x69, 0x65, 0x6c, 0x3b, 0x65, 0x20, 0x68, 0xeb, 0x6e, 0xeb, 0x3b, 0x65,
-0x20, 0x6d, 0x61, 0x72, 0x74, 0xeb, 0x3b, 0x65, 0x20, 0x6d, 0xeb, 0x72, 0x6b, 0x75, 0x72, 0xeb, 0x3b, 0x65, 0x20, 0x65,
-0x6e, 0x6a, 0x74, 0x65, 0x3b, 0x65, 0x20, 0x70, 0x72, 0x65, 0x6d, 0x74, 0x65, 0x3b, 0x65, 0x20, 0x73, 0x68, 0x74, 0x75,
-0x6e, 0xeb, 0x64, 0x69, 0x65, 0x3b, 0x68, 0xeb, 0x6e, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x6d, 0xeb, 0x72, 0x3b, 0x65, 0x6e,
-0x6a, 0x3b, 0x70, 0x72, 0x65, 0x3b, 0x73, 0x68, 0x74, 0x44, 0x69, 0x65, 0x3b, 0x48, 0xeb, 0x6e, 0x3b, 0x4d, 0x61, 0x72,
-0x3b, 0x4d, 0xeb, 0x72, 0x3b, 0x45, 0x6e, 0x6a, 0x3b, 0x50, 0x72, 0x65, 0x3b, 0x53, 0x68, 0x74, 0x64, 0x3b, 0x68, 0x3b,
-0x6d, 0x3b, 0x6d, 0x3b, 0x65, 0x3b, 0x70, 0x3b, 0x73, 0x68, 0x12a5, 0x1211, 0x12f5, 0x3b, 0x1230, 0x129e, 0x3b, 0x121b, 0x12ad, 0x1230,
-0x129e, 0x3b, 0x1228, 0x1261, 0x12d5, 0x3b, 0x1210, 0x1219, 0x1235, 0x3b, 0x12d3, 0x122d, 0x1265, 0x3b, 0x1245, 0x12f3, 0x121c, 0x12a5, 0x1211, 0x12f5,
-0x3b, 0x1230, 0x129e, 0x3b, 0x121b, 0x12ad, 0x1230, 0x3b, 0x1228, 0x1261, 0x12d5, 0x3b, 0x1210, 0x1219, 0x1235, 0x3b, 0x12d3, 0x122d, 0x1265, 0x3b,
-0x1245, 0x12f3, 0x121c, 0x12a5, 0x3b, 0x1230, 0x3b, 0x121b, 0x3b, 0x1228, 0x3b, 0x1210, 0x3b, 0x12d3, 0x3b, 0x1245, 0x627, 0x644, 0x623, 0x62d,
-0x62f, 0x3b, 0x627, 0x644, 0x627, 0x62b, 0x646, 0x64a, 0x646, 0x3b, 0x627, 0x644, 0x62b, 0x644, 0x627, 0x62b, 0x627, 0x621, 0x3b, 0x627,
-0x644, 0x623, 0x631, 0x628, 0x639, 0x627, 0x621, 0x3b, 0x627, 0x644, 0x62e, 0x645, 0x64a, 0x633, 0x3b, 0x627, 0x644, 0x62c, 0x645, 0x639,
-0x629, 0x3b, 0x627, 0x644, 0x633, 0x628, 0x62a, 0x62d, 0x3b, 0x646, 0x3b, 0x62b, 0x3b, 0x631, 0x3b, 0x62e, 0x3b, 0x62c, 0x3b, 0x633,
-0x56f, 0x56b, 0x580, 0x561, 0x56f, 0x56b, 0x3b, 0x565, 0x580, 0x56f, 0x578, 0x582, 0x577, 0x561, 0x562, 0x569, 0x56b, 0x3b, 0x565, 0x580,
-0x565, 0x584, 0x577, 0x561, 0x562, 0x569, 0x56b, 0x3b, 0x579, 0x578, 0x580, 0x565, 0x584, 0x577, 0x561, 0x562, 0x569, 0x56b, 0x3b, 0x570,
-0x56b, 0x576, 0x563, 0x577, 0x561, 0x562, 0x569, 0x56b, 0x3b, 0x578, 0x582, 0x580, 0x562, 0x561, 0x569, 0x3b, 0x577, 0x561, 0x562, 0x561,
-0x569, 0x56f, 0x56b, 0x580, 0x3b, 0x565, 0x580, 0x56f, 0x3b, 0x565, 0x580, 0x584, 0x3b, 0x579, 0x580, 0x584, 0x3b, 0x570, 0x576, 0x563,
-0x3b, 0x578, 0x582, 0x580, 0x3b, 0x577, 0x562, 0x569, 0x53f, 0x3b, 0x535, 0x3b, 0x535, 0x3b, 0x549, 0x3b, 0x540, 0x3b, 0x548, 0x3b,
-0x547, 0x9a6, 0x9c7, 0x993, 0x9ac, 0x9be, 0x9f0, 0x3b, 0x9b8, 0x9cb, 0x9ae, 0x9ac, 0x9be, 0x9f0, 0x3b, 0x9ae, 0x999, 0x9cd, 0x997, 0x9b2,
-0x9ac, 0x9be, 0x9f0, 0x3b, 0x9ac, 0x9c1, 0x9a7, 0x9ac, 0x9be, 0x9f0, 0x3b, 0x9ac, 0x9c3, 0x9b9, 0x9b8, 0x9cd, 0x9aa, 0x9a4, 0x9bf, 0x9ac,
-0x9be, 0x9f0, 0x3b, 0x9b6, 0x9c1, 0x995, 0x9cd, 0x9f0, 0x9ac, 0x9be, 0x9f0, 0x3b, 0x9b6, 0x9a8, 0x9bf, 0x9ac, 0x9be, 0x9f0, 0x9a6, 0x9c7,
-0x993, 0x3b, 0x9b8, 0x9cb, 0x9ae, 0x3b, 0x9ae, 0x999, 0x9cd, 0x997, 0x9b2, 0x3b, 0x9ac, 0x9c1, 0x9a7, 0x3b, 0x9ac, 0x9c3, 0x9b9, 0x3b,
-0x9b6, 0x9c1, 0x995, 0x9cd, 0x9f0, 0x3b, 0x9b6, 0x9a8, 0x9bf, 0x9a6, 0x3b, 0x9b8, 0x3b, 0x9ae, 0x3b, 0x9ac, 0x3b, 0x9ac, 0x3b, 0x9b6,
-0x3b, 0x9b6, 0x64, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x75, 0x3b, 0x6c, 0x6c, 0x75, 0x6e, 0x65, 0x73, 0x3b, 0x6d, 0x61, 0x72,
-0x74, 0x65, 0x73, 0x3b, 0x6d, 0x69, 0xe9, 0x72, 0x63, 0x6f, 0x6c, 0x65, 0x73, 0x3b, 0x78, 0x75, 0x65, 0x76, 0x65, 0x73,
-0x3b, 0x76, 0x69, 0x65, 0x6e, 0x72, 0x65, 0x73, 0x3b, 0x73, 0xe1, 0x62, 0x61, 0x64, 0x75, 0x64, 0x6f, 0x6d, 0x3b, 0x6c,
-0x6c, 0x75, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x6d, 0x69, 0xe9, 0x3b, 0x78, 0x75, 0x65, 0x3b, 0x76, 0x69, 0x65, 0x3b, 0x73,
-0xe1, 0x62, 0x44, 0x3b, 0x4c, 0x3b, 0x4d, 0x3b, 0x4d, 0x3b, 0x58, 0x3b, 0x56, 0x3b, 0x53, 0x4a, 0x75, 0x6d, 0x61, 0x70,
-0x69, 0x6c, 0x69, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x6e, 0x6e, 0x65,
-0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x41, 0x6c, 0x68, 0x61, 0x6d, 0x69, 0x73, 0x69, 0x3b, 0x49,
-0x6a, 0x75, 0x6d, 0x61, 0x61, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x6d, 0x6f, 0x73, 0x69, 0x4a, 0x70, 0x69, 0x3b, 0x4a, 0x74,
-0x74, 0x3b, 0x4a, 0x6e, 0x6e, 0x3b, 0x4a, 0x74, 0x6e, 0x3b, 0x41, 0x6c, 0x68, 0x3b, 0x49, 0x6a, 0x6d, 0x3b, 0x4a, 0x6d,
-0x6f, 0x4a, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0x41, 0x3b, 0x49, 0x3b, 0x4a, 0x62, 0x61, 0x7a, 0x61, 0x72, 0x3b,
-0x62, 0x61, 0x7a, 0x61, 0x72, 0x20, 0x65, 0x72, 0x74, 0x259, 0x73, 0x69, 0x3b, 0xe7, 0x259, 0x72, 0x15f, 0x259, 0x6e, 0x62,
-0x259, 0x20, 0x61, 0x78, 0x15f, 0x61, 0x6d, 0x131, 0x3b, 0xe7, 0x259, 0x72, 0x15f, 0x259, 0x6e, 0x62, 0x259, 0x3b, 0x63, 0xfc,
-0x6d, 0x259, 0x20, 0x61, 0x78, 0x15f, 0x61, 0x6d, 0x131, 0x3b, 0x63, 0xfc, 0x6d, 0x259, 0x3b, 0x15f, 0x259, 0x6e, 0x62, 0x259,
-0x42, 0x2e, 0x3b, 0x42, 0x2e, 0x45, 0x2e, 0x3b, 0xc7, 0x2e, 0x41, 0x2e, 0x3b, 0xc7, 0x2e, 0x3b, 0x43, 0x2e, 0x41, 0x2e,
-0x3b, 0x43, 0x2e, 0x3b, 0x15e, 0x2e, 0x42, 0x2e, 0x3b, 0x42, 0x2e, 0x65, 0x2e, 0x3b, 0xc7, 0x2e, 0x61, 0x2e, 0x3b, 0xc7,
-0x2e, 0x3b, 0x43, 0x2e, 0x61, 0x2e, 0x3b, 0x43, 0x2e, 0x3b, 0x15e, 0x2e, 0x431, 0x430, 0x437, 0x430, 0x440, 0x3b, 0x431, 0x430,
-0x437, 0x430, 0x440, 0x20, 0x435, 0x440, 0x442, 0x4d9, 0x441, 0x438, 0x3b, 0x447, 0x4d9, 0x440, 0x448, 0x4d9, 0x43d, 0x431, 0x4d9, 0x20,
-0x430, 0x445, 0x448, 0x430, 0x43c, 0x44b, 0x3b, 0x447, 0x4d9, 0x440, 0x448, 0x4d9, 0x43d, 0x431, 0x4d9, 0x3b, 0x4b9, 0x4af, 0x43c, 0x4d9,
-0x20, 0x430, 0x445, 0x448, 0x430, 0x43c, 0x44b, 0x3b, 0x4b9, 0x4af, 0x43c, 0x4d9, 0x3b, 0x448, 0x4d9, 0x43d, 0x431, 0x4d9, 0x411, 0x2e,
-0x3b, 0x411, 0x2e, 0x415, 0x2e, 0x3b, 0x427, 0x2e, 0x410, 0x2e, 0x3b, 0x427, 0x2e, 0x3b, 0x4b8, 0x2e, 0x410, 0x2e, 0x3b, 0x4b8,
-0x2e, 0x3b, 0x428, 0x2e, 0x73, 0x254, 0x301, 0x6e, 0x64, 0x1dd, 0x3b, 0x6c, 0x1dd, 0x6e, 0x64, 0xed, 0x3b, 0x6d, 0x61, 0x61,
-0x64, 0xed, 0x3b, 0x6d, 0x25b, 0x6b, 0x72, 0x25b, 0x64, 0xed, 0x3b, 0x6a, 0x1dd, 0x1dd, 0x64, 0xed, 0x3b, 0x6a, 0xfa, 0x6d,
-0x62, 0xe1, 0x3b, 0x73, 0x61, 0x6d, 0x64, 0xed, 0x73, 0x254, 0x301, 0x6e, 0x3b, 0x6c, 0x1dd, 0x6e, 0x3b, 0x6d, 0x61, 0x61,
-0x3b, 0x6d, 0x25b, 0x6b, 0x3b, 0x6a, 0x1dd, 0x1dd, 0x3b, 0x6a, 0xfa, 0x6d, 0x3b, 0x73, 0x61, 0x6d, 0x73, 0x3b, 0x6c, 0x3b,
-0x6d, 0x3b, 0x6d, 0x3b, 0x6a, 0x3b, 0x6a, 0x3b, 0x73, 0x6b, 0x61, 0x72, 0x69, 0x3b, 0x6e, 0x74, 0x25b, 0x6e, 0x25b, 0x3b,
-0x74, 0x61, 0x72, 0x61, 0x74, 0x61, 0x3b, 0x61, 0x72, 0x61, 0x62, 0x61, 0x3b, 0x61, 0x6c, 0x61, 0x6d, 0x69, 0x73, 0x61,
-0x3b, 0x6a, 0x75, 0x6d, 0x61, 0x3b, 0x73, 0x69, 0x62, 0x69, 0x72, 0x69, 0x6b, 0x61, 0x72, 0x3b, 0x6e, 0x74, 0x25b, 0x3b,
-0x74, 0x61, 0x72, 0x3b, 0x61, 0x72, 0x61, 0x3b, 0x61, 0x6c, 0x61, 0x3b, 0x6a, 0x75, 0x6d, 0x3b, 0x73, 0x69, 0x62, 0x4b,
-0x3b, 0x4e, 0x3b, 0x54, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x4a, 0x3b, 0x53, 0x9b0, 0x9ac, 0x9bf, 0x9ac, 0x9be, 0x9b0, 0x3b, 0x9b8,
-0x9cb, 0x9ae, 0x9ac, 0x9be, 0x9b0, 0x3b, 0x9ae, 0x999, 0x9cd, 0x997, 0x9b2, 0x9ac, 0x9be, 0x9b0, 0x3b, 0x9ac, 0x9c1, 0x9a7, 0x9ac, 0x9be,
-0x9b0, 0x3b, 0x9ac, 0x9c3, 0x9b9, 0x9b8, 0x9cd, 0x9aa, 0x9a4, 0x9bf, 0x9ac, 0x9be, 0x9b0, 0x3b, 0x9b6, 0x9c1, 0x995, 0x9cd, 0x9b0, 0x9ac,
-0x9be, 0x9b0, 0x3b, 0x9b6, 0x9a8, 0x9bf, 0x9ac, 0x9be, 0x9b0, 0x9b0, 0x9ac, 0x9bf, 0x3b, 0x9b8, 0x9cb, 0x9ae, 0x3b, 0x9ae, 0x999, 0x9cd,
-0x997, 0x9b2, 0x3b, 0x9ac, 0x9c1, 0x9a7, 0x3b, 0x9ac, 0x9c3, 0x9b9, 0x9b8, 0x9cd, 0x9aa, 0x9a4, 0x9bf, 0x3b, 0x9b6, 0x9c1, 0x995, 0x9cd,
-0x9b0, 0x3b, 0x9b6, 0x9a8, 0x9bf, 0x9b0, 0x3b, 0x9b8, 0x9cb, 0x3b, 0x9ae, 0x3b, 0x9ac, 0x9c1, 0x3b, 0x9ac, 0x9c3, 0x3b, 0x9b6, 0x9c1,
-0x3b, 0x9b6, 0x14b, 0x67, 0x77, 0xe0, 0x20, 0x6e, 0x254, 0x302, 0x79, 0x3b, 0x14b, 0x67, 0x77, 0xe0, 0x20, 0x6e, 0x6a, 0x61,
-0x14b, 0x67, 0x75, 0x6d, 0x62, 0x61, 0x3b, 0x14b, 0x67, 0x77, 0xe0, 0x20, 0xfb, 0x6d, 0x3b, 0x14b, 0x67, 0x77, 0xe0, 0x20,
-0x14b, 0x67, 0xea, 0x3b, 0x14b, 0x67, 0x77, 0xe0, 0x20, 0x6d, 0x62, 0x254, 0x6b, 0x3b, 0x14b, 0x67, 0x77, 0xe0, 0x20, 0x6b,
-0x254, 0x254, 0x3b, 0x14b, 0x67, 0x77, 0xe0, 0x20, 0x6a, 0xf4, 0x6e, 0x6e, 0x254, 0x79, 0x3b, 0x6e, 0x6a, 0x61, 0x3b, 0x75,
-0x75, 0x6d, 0x3b, 0x14b, 0x67, 0x65, 0x3b, 0x6d, 0x62, 0x254, 0x3b, 0x6b, 0x254, 0x254, 0x3b, 0x6a, 0x6f, 0x6e, 0x6e, 0x3b,
-0x6e, 0x3b, 0x75, 0x3b, 0x14b, 0x3b, 0x6d, 0x3b, 0x6b, 0x3b, 0x6a, 0x69, 0x67, 0x61, 0x6e, 0x64, 0x65, 0x61, 0x3b, 0x61,
-0x73, 0x74, 0x65, 0x6c, 0x65, 0x68, 0x65, 0x6e, 0x61, 0x3b, 0x61, 0x73, 0x74, 0x65, 0x61, 0x72, 0x74, 0x65, 0x61, 0x3b,
-0x61, 0x73, 0x74, 0x65, 0x61, 0x7a, 0x6b, 0x65, 0x6e, 0x61, 0x3b, 0x6f, 0x73, 0x74, 0x65, 0x67, 0x75, 0x6e, 0x61, 0x3b,
-0x6f, 0x73, 0x74, 0x69, 0x72, 0x61, 0x6c, 0x61, 0x3b, 0x6c, 0x61, 0x72, 0x75, 0x6e, 0x62, 0x61, 0x74, 0x61, 0x69, 0x67,
-0x2e, 0x3b, 0x61, 0x6c, 0x2e, 0x3b, 0x61, 0x72, 0x2e, 0x3b, 0x61, 0x7a, 0x2e, 0x3b, 0x6f, 0x67, 0x2e, 0x3b, 0x6f, 0x72,
-0x2e, 0x3b, 0x6c, 0x72, 0x2e, 0x49, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x4f, 0x3b, 0x4f, 0x3b, 0x4c, 0x43d, 0x44f,
-0x434, 0x437, 0x435, 0x43b, 0x44f, 0x3b, 0x43f, 0x430, 0x43d, 0x44f, 0x434, 0x437, 0x435, 0x43b, 0x430, 0x43a, 0x3b, 0x430, 0x45e, 0x442,
-0x43e, 0x440, 0x430, 0x43a, 0x3b, 0x441, 0x435, 0x440, 0x430, 0x434, 0x430, 0x3b, 0x447, 0x430, 0x446, 0x432, 0x435, 0x440, 0x3b, 0x43f,
-0x44f, 0x442, 0x43d, 0x456, 0x446, 0x430, 0x3b, 0x441, 0x443, 0x431, 0x43e, 0x442, 0x430, 0x43d, 0x434, 0x3b, 0x43f, 0x43d, 0x3b, 0x430,
-0x45e, 0x3b, 0x441, 0x440, 0x3b, 0x447, 0x446, 0x3b, 0x43f, 0x442, 0x3b, 0x441, 0x431, 0x43d, 0x3b, 0x43f, 0x3b, 0x430, 0x3b, 0x441,
-0x3b, 0x447, 0x3b, 0x43f, 0x3b, 0x441, 0x50, 0x61, 0x20, 0x4d, 0x75, 0x6c, 0x75, 0x6e, 0x67, 0x75, 0x3b, 0x50, 0x61, 0x6c,
-0x69, 0x63, 0x68, 0x69, 0x6d, 0x6f, 0x3b, 0x50, 0x61, 0x6c, 0x69, 0x63, 0x68, 0x69, 0x62, 0x75, 0x6c, 0x69, 0x3b, 0x50,
-0x61, 0x6c, 0x69, 0x63, 0x68, 0x69, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x50, 0x61, 0x6c, 0x69, 0x63, 0x68, 0x69, 0x6e, 0x65,
-0x3b, 0x50, 0x61, 0x6c, 0x69, 0x63, 0x68, 0x69, 0x73, 0x61, 0x6e, 0x6f, 0x3b, 0x50, 0x61, 0x63, 0x68, 0x69, 0x62, 0x65,
-0x6c, 0x75, 0x73, 0x68, 0x69, 0x70, 0x61, 0x20, 0x6d, 0x75, 0x6c, 0x75, 0x6e, 0x67, 0x75, 0x3b, 0x70, 0x61, 0x20, 0x73,
-0x68, 0x61, 0x68, 0x75, 0x76, 0x69, 0x6c, 0x75, 0x68, 0x61, 0x3b, 0x70, 0x61, 0x20, 0x68, 0x69, 0x76, 0x69, 0x6c, 0x69,
-0x3b, 0x70, 0x61, 0x20, 0x68, 0x69, 0x64, 0x61, 0x74, 0x75, 0x3b, 0x70, 0x61, 0x20, 0x68, 0x69, 0x74, 0x61, 0x79, 0x69,
-0x3b, 0x70, 0x61, 0x20, 0x68, 0x69, 0x68, 0x61, 0x6e, 0x75, 0x3b, 0x70, 0x61, 0x20, 0x73, 0x68, 0x61, 0x68, 0x75, 0x6c,
-0x65, 0x6d, 0x62, 0x65, 0x6c, 0x61, 0x4d, 0x75, 0x6c, 0x3b, 0x56, 0x69, 0x6c, 0x3b, 0x48, 0x69, 0x76, 0x3b, 0x48, 0x69,
-0x64, 0x3b, 0x48, 0x69, 0x74, 0x3b, 0x48, 0x69, 0x68, 0x3b, 0x4c, 0x65, 0x6d, 0x4d, 0x3b, 0x4a, 0x3b, 0x48, 0x3b, 0x48,
-0x3b, 0x48, 0x3b, 0x57, 0x3b, 0x4a, 0x930, 0x92c, 0x93f, 0x92c, 0x93e, 0x930, 0x3b, 0x938, 0x92e, 0x92c, 0x93e, 0x930, 0x3b, 0x92e,
-0x902, 0x917, 0x932, 0x92c, 0x93e, 0x930, 0x3b, 0x92c, 0x941, 0x926, 0x92c, 0x93e, 0x930, 0x3b, 0x92c, 0x93f, 0x938, 0x925, 0x93f, 0x92c,
-0x93e, 0x930, 0x3b, 0x938, 0x941, 0x916, 0x941, 0x930, 0x92c, 0x93e, 0x930, 0x3b, 0x938, 0x941, 0x928, 0x93f, 0x92c, 0x93e, 0x930, 0x930,
-0x92c, 0x93f, 0x3b, 0x938, 0x92e, 0x3b, 0x92e, 0x902, 0x917, 0x932, 0x3b, 0x92c, 0x941, 0x926, 0x3b, 0x92c, 0x93f, 0x938, 0x925, 0x93f,
-0x3b, 0x938, 0x941, 0x916, 0x941, 0x930, 0x3b, 0x938, 0x941, 0x928, 0x93f, 0x930, 0x3b, 0x938, 0x3b, 0x92e, 0x902, 0x3b, 0x92c, 0x941,
-0x3b, 0x92c, 0x93f, 0x3b, 0x938, 0x941, 0x3b, 0x938, 0x941, 0x6e, 0x65, 0x64, 0x6a, 0x65, 0x6c, 0x6a, 0x61, 0x3b, 0x70, 0x6f,
-0x6e, 0x65, 0x64, 0x6a, 0x65, 0x6c, 0x6a, 0x61, 0x6b, 0x3b, 0x75, 0x74, 0x6f, 0x72, 0x61, 0x6b, 0x3b, 0x73, 0x72, 0x69,
-0x6a, 0x65, 0x64, 0x61, 0x3b, 0x10d, 0x65, 0x74, 0x76, 0x72, 0x74, 0x61, 0x6b, 0x3b, 0x70, 0x65, 0x74, 0x61, 0x6b, 0x3b,
-0x73, 0x75, 0x62, 0x6f, 0x74, 0x61, 0x6e, 0x65, 0x64, 0x3b, 0x70, 0x6f, 0x6e, 0x3b, 0x75, 0x74, 0x6f, 0x3b, 0x73, 0x72,
-0x69, 0x3b, 0x10d, 0x65, 0x74, 0x3b, 0x70, 0x65, 0x74, 0x3b, 0x73, 0x75, 0x62, 0x6e, 0x3b, 0x70, 0x3b, 0x75, 0x3b, 0x73,
-0x3b, 0x10d, 0x3b, 0x70, 0x3b, 0x73, 0x4e, 0x3b, 0x50, 0x3b, 0x55, 0x3b, 0x53, 0x3b, 0x10c, 0x3b, 0x50, 0x3b, 0x53, 0x43d,
-0x435, 0x434, 0x458, 0x435, 0x459, 0x430, 0x3b, 0x43f, 0x43e, 0x43d, 0x435, 0x434, 0x458, 0x435, 0x459, 0x430, 0x43a, 0x3b, 0x443, 0x442,
-0x43e, 0x440, 0x430, 0x43a, 0x3b, 0x441, 0x440, 0x438, 0x458, 0x435, 0x434, 0x430, 0x3b, 0x447, 0x435, 0x442, 0x432, 0x440, 0x442, 0x430,
-0x43a, 0x3b, 0x43f, 0x435, 0x442, 0x430, 0x43a, 0x3b, 0x441, 0x443, 0x431, 0x43e, 0x442, 0x430, 0x43d, 0x435, 0x434, 0x3b, 0x43f, 0x43e,
-0x43d, 0x3b, 0x443, 0x442, 0x43e, 0x3b, 0x441, 0x440, 0x438, 0x3b, 0x447, 0x435, 0x442, 0x3b, 0x43f, 0x435, 0x442, 0x3b, 0x441, 0x443,
-0x431, 0x43d, 0x3b, 0x43f, 0x3b, 0x443, 0x3b, 0x441, 0x3b, 0x447, 0x3b, 0x43f, 0x3b, 0x441, 0x53, 0x75, 0x6c, 0x3b, 0x4c, 0x75,
-0x6e, 0x3b, 0x4d, 0x65, 0x75, 0x72, 0x7a, 0x68, 0x3b, 0x4d, 0x65, 0x72, 0x63, 0x2bc, 0x68, 0x65, 0x72, 0x3b, 0x59, 0x61,
-0x6f, 0x75, 0x3b, 0x47, 0x77, 0x65, 0x6e, 0x65, 0x72, 0x3b, 0x53, 0x61, 0x64, 0x6f, 0x72, 0x6e, 0x53, 0x75, 0x6c, 0x3b,
-0x4c, 0x75, 0x6e, 0x3b, 0x4d, 0x65, 0x75, 0x2e, 0x3b, 0x4d, 0x65, 0x72, 0x2e, 0x3b, 0x59, 0x61, 0x6f, 0x75, 0x3b, 0x47,
-0x77, 0x65, 0x2e, 0x3b, 0x53, 0x61, 0x64, 0x2e, 0x53, 0x75, 0x3b, 0x4c, 0x3b, 0x4d, 0x7a, 0x3b, 0x4d, 0x63, 0x3b, 0x59,
-0x3b, 0x47, 0x3b, 0x53, 0x61, 0x43d, 0x435, 0x434, 0x435, 0x43b, 0x44f, 0x3b, 0x43f, 0x43e, 0x43d, 0x435, 0x434, 0x435, 0x43b, 0x43d,
-0x438, 0x43a, 0x3b, 0x432, 0x442, 0x43e, 0x440, 0x43d, 0x438, 0x43a, 0x3b, 0x441, 0x440, 0x44f, 0x434, 0x430, 0x3b, 0x447, 0x435, 0x442,
-0x432, 0x44a, 0x440, 0x442, 0x44a, 0x43a, 0x3b, 0x43f, 0x435, 0x442, 0x44a, 0x43a, 0x3b, 0x441, 0x44a, 0x431, 0x43e, 0x442, 0x430, 0x43d,
-0x434, 0x3b, 0x43f, 0x43d, 0x3b, 0x432, 0x442, 0x3b, 0x441, 0x440, 0x3b, 0x447, 0x442, 0x3b, 0x43f, 0x442, 0x3b, 0x441, 0x431, 0x43d,
-0x3b, 0x43f, 0x3b, 0x432, 0x3b, 0x441, 0x3b, 0x447, 0x3b, 0x43f, 0x3b, 0x441, 0x1010, 0x1014, 0x1004, 0x103a, 0x1039, 0x1002, 0x1014, 0x103d,
-0x1031, 0x3b, 0x1010, 0x1014, 0x1004, 0x103a, 0x1039, 0x101c, 0x102c, 0x3b, 0x1021, 0x1004, 0x103a, 0x1039, 0x1002, 0x102b, 0x3b, 0x1017, 0x102f, 0x1012,
-0x1039, 0x1013, 0x101f, 0x1030, 0x1038, 0x3b, 0x1000, 0x103c, 0x102c, 0x101e, 0x1015, 0x1010, 0x1031, 0x1038, 0x3b, 0x101e, 0x1031, 0x102c, 0x1000, 0x103c,
-0x102c, 0x3b, 0x1005, 0x1014, 0x1031, 0x1010, 0x3b, 0x1010, 0x3b, 0x1021, 0x3b, 0x1017, 0x3b, 0x1000, 0x3b, 0x101e, 0x3b, 0x1005, 0x661f, 0x671f,
-0x65e5, 0x3b, 0x661f, 0x671f, 0x4e00, 0x3b, 0x661f, 0x671f, 0x4e8c, 0x3b, 0x661f, 0x671f, 0x4e09, 0x3b, 0x661f, 0x671f, 0x56db, 0x3b, 0x661f, 0x671f,
-0x4e94, 0x3b, 0x661f, 0x671f, 0x516d, 0x65e5, 0x3b, 0x4e00, 0x3b, 0x4e8c, 0x3b, 0x4e09, 0x3b, 0x56db, 0x3b, 0x4e94, 0x3b, 0x516d, 0x5468, 0x65e5,
-0x3b, 0x5468, 0x4e00, 0x3b, 0x5468, 0x4e8c, 0x3b, 0x5468, 0x4e09, 0x3b, 0x5468, 0x56db, 0x3b, 0x5468, 0x4e94, 0x3b, 0x5468, 0x516d, 0x64, 0x69,
-0x75, 0x6d, 0x65, 0x6e, 0x67, 0x65, 0x3b, 0x64, 0x69, 0x6c, 0x6c, 0x75, 0x6e, 0x73, 0x3b, 0x64, 0x69, 0x6d, 0x61, 0x72,
-0x74, 0x73, 0x3b, 0x64, 0x69, 0x6d, 0x65, 0x63, 0x72, 0x65, 0x73, 0x3b, 0x64, 0x69, 0x6a, 0x6f, 0x75, 0x73, 0x3b, 0x64,
-0x69, 0x76, 0x65, 0x6e, 0x64, 0x72, 0x65, 0x73, 0x3b, 0x64, 0x69, 0x73, 0x73, 0x61, 0x62, 0x74, 0x65, 0x64, 0x67, 0x2e,
-0x3b, 0x64, 0x6c, 0x2e, 0x3b, 0x64, 0x74, 0x2e, 0x3b, 0x64, 0x63, 0x2e, 0x3b, 0x64, 0x6a, 0x2e, 0x3b, 0x64, 0x76, 0x2e,
-0x3b, 0x64, 0x73, 0x2e, 0x64, 0x67, 0x3b, 0x64, 0x6c, 0x3b, 0x64, 0x74, 0x3b, 0x64, 0x63, 0x3b, 0x64, 0x6a, 0x3b, 0x64,
-0x76, 0x3b, 0x64, 0x73, 0x44, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x6f, 0x3b, 0x4c, 0x75, 0x6e, 0x65, 0x73, 0x3b, 0x4d, 0x61,
-0x72, 0x74, 0x65, 0x73, 0x3b, 0x4d, 0x69, 0x79, 0x65, 0x72, 0x6b, 0x75, 0x6c, 0x65, 0x73, 0x3b, 0x48, 0x75, 0x77, 0x65,
-0x62, 0x65, 0x73, 0x3b, 0x42, 0x69, 0x79, 0x65, 0x72, 0x6e, 0x65, 0x73, 0x3b, 0x53, 0x61, 0x62, 0x61, 0x64, 0x6f, 0x44,
-0x6f, 0x6d, 0x3b, 0x4c, 0x75, 0x6e, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x4d, 0x69, 0x79, 0x3b, 0x48, 0x75, 0x77, 0x3b, 0x42,
-0x69, 0x79, 0x3b, 0x53, 0x61, 0x62, 0x44, 0x3b, 0x4c, 0x3b, 0x4d, 0x3b, 0x4d, 0x3b, 0x48, 0x3b, 0x42, 0x3b, 0x53, 0x41,
-0x73, 0x61, 0x6d, 0x61, 0x73, 0x3b, 0x41, 0x79, 0x6e, 0x61, 0x73, 0x3b, 0x41, 0x73, 0x69, 0x6e, 0x61, 0x73, 0x3b, 0x41,
-0x6b, 0x72, 0x61, 0x73, 0x3b, 0x41, 0x6b, 0x77, 0x61, 0x73, 0x3b, 0x41, 0x73, 0x69, 0x6d, 0x77, 0x61, 0x73, 0x3b, 0x41,
-0x73, 0x69, 0x1e0d, 0x79, 0x61, 0x73, 0x41, 0x73, 0x61, 0x3b, 0x41, 0x79, 0x6e, 0x3b, 0x41, 0x73, 0x6e, 0x3b, 0x41, 0x6b,
-0x72, 0x3b, 0x41, 0x6b, 0x77, 0x3b, 0x41, 0x73, 0x6d, 0x3b, 0x41, 0x73, 0x1e0d, 0x41, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x41,
-0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x41, 0x6cc, 0x6d5, 0x6a9, 0x634, 0x6d5, 0x645, 0x645, 0x6d5, 0x3b, 0x62f, 0x648, 0x648, 0x634, 0x6d5,
-0x645, 0x645, 0x6d5, 0x3b, 0x633, 0x6ce, 0x634, 0x6d5, 0x645, 0x645, 0x6d5, 0x3b, 0x686, 0x648, 0x627, 0x631, 0x634, 0x6d5, 0x645, 0x645,
-0x6d5, 0x3b, 0x67e, 0x6ce, 0x646, 0x62c, 0x634, 0x6d5, 0x645, 0x645, 0x6d5, 0x3b, 0x6be, 0x6d5, 0x6cc, 0x646, 0x6cc, 0x3b, 0x634, 0x6d5,
-0x645, 0x645, 0x6d5, 0x6cc, 0x3b, 0x62f, 0x3b, 0x633, 0x3b, 0x686, 0x3b, 0x67e, 0x3b, 0x6be, 0x3b, 0x634, 0xd804, 0xdd22, 0xd804, 0xdd27,
-0xd804, 0xdd1d, 0xd804, 0xdd28, 0xd804, 0xdd1d, 0xd804, 0xdd22, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd25, 0xd804, 0xdd27, 0xd804, 0xdd1f, 0xd804, 0xdd34, 0xd804,
-0xdd1d, 0xd804, 0xdd22, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd1f, 0xd804, 0xdd27, 0xd804, 0xdd01, 0xd804, 0xdd09, 0xd804, 0xdd27, 0xd804, 0xdd23, 0xd804, 0xdd34,
-0xd804, 0xdd1d, 0xd804, 0xdd22, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd1d, 0xd804, 0xdd2a, 0xd804, 0xdd16, 0xd804, 0xdd34, 0xd804, 0xdd1d, 0xd804, 0xdd22, 0xd804,
-0xdd34, 0x3b, 0xd804, 0xdd1d, 0xd804, 0xdd33, 0xd804, 0xdd22, 0xd804, 0xdd28, 0xd804, 0xdd25, 0xd804, 0xdd2a, 0xd804, 0xdd1b, 0xd804, 0xdd34, 0xd804, 0xdd1d,
-0xd804, 0xdd22, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd25, 0xd804, 0xdd2a, 0xd804, 0xdd07, 0xd804, 0xdd34, 0xd804, 0xdd07, 0xd804, 0xdd2e, 0xd804, 0xdd22, 0xd804,
-0xdd34, 0xd804, 0xdd1d, 0xd804, 0xdd22, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd25, 0xd804, 0xdd27, 0xd804, 0xdd1a, 0xd804, 0xdd28, 0xd804, 0xdd1d, 0xd804, 0xdd22,
-0xd804, 0xdd34, 0xd804, 0xdd22, 0xd804, 0xdd27, 0xd804, 0xdd1d, 0xd804, 0xdd28, 0x3b, 0xd804, 0xdd25, 0xd804, 0xdd27, 0xd804, 0xdd1f, 0xd804, 0xdd34, 0x3b,
-0xd804, 0xdd1f, 0xd804, 0xdd27, 0xd804, 0xdd01, 0xd804, 0xdd09, 0xd804, 0xdd27, 0xd804, 0xdd23, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd1d, 0xd804, 0xdd2a, 0xd804,
-0xdd16, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd1d, 0xd804, 0xdd33, 0xd804, 0xdd22, 0xd804, 0xdd28, 0xd804, 0xdd25, 0xd804, 0xdd2a, 0xd804, 0xdd1b, 0xd804, 0xdd34,
-0x3b, 0xd804, 0xdd25, 0xd804, 0xdd2a, 0xd804, 0xdd07, 0xd804, 0xdd34, 0xd804, 0xdd07, 0xd804, 0xdd2e, 0xd804, 0xdd22, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd25,
-0xd804, 0xdd27, 0xd804, 0xdd1a, 0xd804, 0xdd28, 0xd804, 0xdd22, 0xd804, 0xdd27, 0x3b, 0xd804, 0xdd25, 0xd804, 0xdd27, 0x3b, 0xd804, 0xdd1f, 0xd804, 0xdd27,
-0x3b, 0xd804, 0xdd1d, 0xd804, 0xdd2a, 0x3b, 0xd804, 0xdd1d, 0xd804, 0xdd33, 0xd804, 0xdd22, 0xd804, 0xdd28, 0x3b, 0xd804, 0xdd25, 0xd804, 0xdd2a, 0x3b,
-0xd804, 0xdd25, 0xd804, 0xdd27, 0x43a, 0x4c0, 0x438, 0x440, 0x430, 0x3b, 0x43e, 0x440, 0x448, 0x43e, 0x442, 0x3b, 0x448, 0x438, 0x43d, 0x430,
-0x440, 0x430, 0x3b, 0x43a, 0x445, 0x430, 0x430, 0x440, 0x430, 0x3b, 0x435, 0x430, 0x440, 0x430, 0x3b, 0x43f, 0x4c0, 0x435, 0x440, 0x430,
-0x441, 0x43a, 0x430, 0x3b, 0x448, 0x443, 0x43e, 0x442, 0x43a, 0x4c0, 0x438, 0x3b, 0x43e, 0x440, 0x3b, 0x448, 0x438, 0x3b, 0x43a, 0x445,
-0x430, 0x3b, 0x435, 0x430, 0x3b, 0x43f, 0x4c0, 0x435, 0x3b, 0x448, 0x443, 0x43e, 0x43a, 0x4c0, 0x3b, 0x43e, 0x3b, 0x448, 0x3b, 0x43a,
-0x445, 0x3b, 0x435, 0x3b, 0x43f, 0x4c0, 0x3b, 0x448, 0x13a4, 0x13be, 0x13d9, 0x13d3, 0x13c6, 0x13cd, 0x13ac, 0x3b, 0x13a4, 0x13be, 0x13d9, 0x13d3,
-0x13c9, 0x13c5, 0x13af, 0x3b, 0x13d4, 0x13b5, 0x13c1, 0x13a2, 0x13a6, 0x3b, 0x13e6, 0x13a2, 0x13c1, 0x13a2, 0x13a6, 0x3b, 0x13c5, 0x13a9, 0x13c1, 0x13a2,
-0x13a6, 0x3b, 0x13e7, 0x13be, 0x13a9, 0x13b6, 0x13cd, 0x13d7, 0x3b, 0x13a4, 0x13be, 0x13d9, 0x13d3, 0x13c8, 0x13d5, 0x13be, 0x13c6, 0x13cd, 0x13ac, 0x3b,
-0x13c9, 0x13c5, 0x13af, 0x3b, 0x13d4, 0x13b5, 0x13c1, 0x3b, 0x13e6, 0x13a2, 0x13c1, 0x3b, 0x13c5, 0x13a9, 0x13c1, 0x3b, 0x13e7, 0x13be, 0x13a9, 0x3b,
-0x13c8, 0x13d5, 0x13be, 0x13c6, 0x3b, 0x13c9, 0x3b, 0x13d4, 0x3b, 0x13e6, 0x3b, 0x13c5, 0x3b, 0x13e7, 0x3b, 0x13a4, 0x53, 0x61, 0x6e, 0x64,
-0x65, 0x3b, 0x4f, 0x72, 0x77, 0x6f, 0x6b, 0x75, 0x62, 0x61, 0x6e, 0x7a, 0x61, 0x3b, 0x4f, 0x72, 0x77, 0x61, 0x6b, 0x61,
-0x62, 0x69, 0x72, 0x69, 0x3b, 0x4f, 0x72, 0x77, 0x61, 0x6b, 0x61, 0x73, 0x68, 0x61, 0x74, 0x75, 0x3b, 0x4f, 0x72, 0x77,
-0x61, 0x6b, 0x61, 0x6e, 0x61, 0x3b, 0x4f, 0x72, 0x77, 0x61, 0x6b, 0x61, 0x74, 0x61, 0x61, 0x6e, 0x6f, 0x3b, 0x4f, 0x72,
-0x77, 0x61, 0x6d, 0x75, 0x6b, 0x61, 0x61, 0x67, 0x61, 0x53, 0x41, 0x4e, 0x3b, 0x4f, 0x52, 0x4b, 0x3b, 0x4f, 0x4b, 0x42,
-0x3b, 0x4f, 0x4b, 0x53, 0x3b, 0x4f, 0x4b, 0x4e, 0x3b, 0x4f, 0x4b, 0x54, 0x3b, 0x4f, 0x4d, 0x4b, 0x53, 0x3b, 0x4b, 0x3b,
-0x52, 0x3b, 0x53, 0x3b, 0x4e, 0x3b, 0x54, 0x3b, 0x4d, 0x9031, 0x65e5, 0x3b, 0x9031, 0x4e00, 0x3b, 0x9031, 0x4e8c, 0x3b, 0x9031, 0x4e09,
-0x3b, 0x9031, 0x56db, 0x3b, 0x9031, 0x4e94, 0x3b, 0x9031, 0x516d, 0x53, 0x75, 0x6e, 0x6e, 0x64, 0x61, 0x61, 0x63, 0x68, 0x3b, 0x4d,
-0x6f, 0x68, 0x6e, 0x64, 0x61, 0x61, 0x63, 0x68, 0x3b, 0x44, 0x69, 0x6e, 0x6e, 0x73, 0x64, 0x61, 0x61, 0x63, 0x68, 0x3b,
-0x4d, 0x65, 0x74, 0x77, 0x6f, 0x63, 0x68, 0x3b, 0x44, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x73, 0x64, 0x61, 0x61, 0x63, 0x68,
-0x3b, 0x46, 0x72, 0x69, 0x69, 0x64, 0x61, 0x61, 0x63, 0x68, 0x3b, 0x53, 0x61, 0x6d, 0x73, 0x64, 0x61, 0x61, 0x63, 0x68,
-0x53, 0x75, 0x2e, 0x3b, 0x4d, 0x6f, 0x2e, 0x3b, 0x44, 0x69, 0x2e, 0x3b, 0x4d, 0x65, 0x2e, 0x3b, 0x44, 0x75, 0x2e, 0x3b,
-0x46, 0x72, 0x2e, 0x3b, 0x53, 0x61, 0x2e, 0x53, 0x3b, 0x4d, 0x3b, 0x44, 0x3b, 0x4d, 0x3b, 0x44, 0x3b, 0x46, 0x3b, 0x53,
-0x64, 0x79, 0x20, 0x53, 0x75, 0x6c, 0x3b, 0x64, 0x79, 0x20, 0x4c, 0x75, 0x6e, 0x3b, 0x64, 0x79, 0x20, 0x4d, 0x65, 0x75,
-0x72, 0x74, 0x68, 0x3b, 0x64, 0x79, 0x20, 0x4d, 0x65, 0x72, 0x68, 0x65, 0x72, 0x3b, 0x64, 0x79, 0x20, 0x59, 0x6f, 0x77,
-0x3b, 0x64, 0x79, 0x20, 0x47, 0x77, 0x65, 0x6e, 0x65, 0x72, 0x3b, 0x64, 0x79, 0x20, 0x53, 0x61, 0x64, 0x6f, 0x72, 0x6e,
-0x53, 0x75, 0x6c, 0x3b, 0x4c, 0x75, 0x6e, 0x3b, 0x4d, 0x74, 0x68, 0x3b, 0x4d, 0x68, 0x72, 0x3b, 0x59, 0x6f, 0x77, 0x3b,
-0x47, 0x77, 0x65, 0x3b, 0x53, 0x61, 0x64, 0x6e, 0x65, 0x64, 0x11b, 0x6c, 0x65, 0x3b, 0x70, 0x6f, 0x6e, 0x64, 0x11b, 0x6c,
-0xed, 0x3b, 0xfa, 0x74, 0x65, 0x72, 0xfd, 0x3b, 0x73, 0x74, 0x159, 0x65, 0x64, 0x61, 0x3b, 0x10d, 0x74, 0x76, 0x72, 0x74,
-0x65, 0x6b, 0x3b, 0x70, 0xe1, 0x74, 0x65, 0x6b, 0x3b, 0x73, 0x6f, 0x62, 0x6f, 0x74, 0x61, 0x6e, 0x65, 0x3b, 0x70, 0x6f,
-0x3b, 0xfa, 0x74, 0x3b, 0x73, 0x74, 0x3b, 0x10d, 0x74, 0x3b, 0x70, 0xe1, 0x3b, 0x73, 0x6f, 0x4e, 0x3b, 0x50, 0x3b, 0xda,
-0x3b, 0x53, 0x3b, 0x10c, 0x3b, 0x50, 0x3b, 0x53, 0x73, 0xf8, 0x6e, 0x64, 0x61, 0x67, 0x3b, 0x6d, 0x61, 0x6e, 0x64, 0x61,
-0x67, 0x3b, 0x74, 0x69, 0x72, 0x73, 0x64, 0x61, 0x67, 0x3b, 0x6f, 0x6e, 0x73, 0x64, 0x61, 0x67, 0x3b, 0x74, 0x6f, 0x72,
-0x73, 0x64, 0x61, 0x67, 0x3b, 0x66, 0x72, 0x65, 0x64, 0x61, 0x67, 0x3b, 0x6c, 0xf8, 0x72, 0x64, 0x61, 0x67, 0x73, 0xf8,
-0x6e, 0x3b, 0x6d, 0x61, 0x6e, 0x3b, 0x74, 0x69, 0x72, 0x3b, 0x6f, 0x6e, 0x73, 0x3b, 0x74, 0x6f, 0x72, 0x3b, 0x66, 0x72,
-0x65, 0x3b, 0x6c, 0xf8, 0x72, 0x73, 0xf8, 0x6e, 0x2e, 0x3b, 0x6d, 0x61, 0x6e, 0x2e, 0x3b, 0x74, 0x69, 0x72, 0x2e, 0x3b,
-0x6f, 0x6e, 0x73, 0x2e, 0x3b, 0x74, 0x6f, 0x72, 0x2e, 0x3b, 0x66, 0x72, 0x65, 0x2e, 0x3b, 0x6c, 0xf8, 0x72, 0x2e, 0x53,
-0x3b, 0x4d, 0x3b, 0x54, 0x3b, 0x4f, 0x3b, 0x54, 0x3b, 0x46, 0x3b, 0x4c, 0x910, 0x924, 0x92c, 0x93e, 0x930, 0x3b, 0x938, 0x94b,
-0x92e, 0x92c, 0x93e, 0x930, 0x3b, 0x92e, 0x902, 0x917, 0x932, 0x92c, 0x93e, 0x930, 0x3b, 0x92c, 0x941, 0x927, 0x92c, 0x93e, 0x930, 0x3b,
-0x92c, 0x940, 0x930, 0x92c, 0x93e, 0x930, 0x3b, 0x936, 0x941, 0x915, 0x94d, 0x930, 0x92c, 0x93e, 0x930, 0x3b, 0x936, 0x928, 0x93f, 0x92c,
-0x93e, 0x930, 0x910, 0x924, 0x92c, 0x93e, 0x930, 0x3b, 0x938, 0x94b, 0x92e, 0x92c, 0x93e, 0x930, 0x3b, 0x92e, 0x902, 0x917, 0x932, 0x92c,
-0x93e, 0x930, 0x3b, 0x92c, 0x941, 0x927, 0x92c, 0x93e, 0x930, 0x3b, 0x92c, 0x940, 0x930, 0x92c, 0x93e, 0x930, 0x3b, 0x936, 0x941, 0x915,
-0x94d, 0x930, 0x92c, 0x93e, 0x930, 0x3b, 0x936, 0x928, 0x940, 0x92c, 0x93e, 0x930, 0x910, 0x924, 0x3b, 0x938, 0x94b, 0x92e, 0x3b, 0x92e,
-0x902, 0x917, 0x932, 0x3b, 0x92c, 0x941, 0x927, 0x3b, 0x92c, 0x940, 0x930, 0x3b, 0x936, 0x941, 0x915, 0x94d, 0x930, 0x3b, 0x936, 0x928,
-0x93f, 0x910, 0x3b, 0x938, 0x94b, 0x3b, 0x92e, 0x2e, 0x3b, 0x92c, 0x941, 0x2e, 0x3b, 0x92c, 0x940, 0x2e, 0x3b, 0x936, 0x941, 0x2e,
-0x3b, 0x936, 0x2e, 0x910, 0x2e, 0x3b, 0x938, 0x94b, 0x2e, 0x3b, 0x92e, 0x2e, 0x3b, 0x92c, 0x941, 0x2e, 0x3b, 0x92c, 0x940, 0x2e,
-0x3b, 0x936, 0x941, 0x2e, 0x3b, 0x936, 0x2e, 0xe9, 0x74, 0x69, 0x3b, 0x6d, 0x254, 0x301, 0x73, 0xfa, 0x3b, 0x6b, 0x77, 0x61,
-0x73, 0xfa, 0x3b, 0x6d, 0x75, 0x6b, 0x254, 0x301, 0x73, 0xfa, 0x3b, 0x14b, 0x67, 0x69, 0x73, 0xfa, 0x3b, 0x257, 0xf3, 0x6e,
-0x25b, 0x73, 0xfa, 0x3b, 0x65, 0x73, 0x61, 0x253, 0x61, 0x73, 0xfa, 0xe9, 0x74, 0x3b, 0x6d, 0x254, 0x301, 0x73, 0x3b, 0x6b,
-0x77, 0x61, 0x3b, 0x6d, 0x75, 0x6b, 0x3b, 0x14b, 0x67, 0x69, 0x3b, 0x257, 0xf3, 0x6e, 0x3b, 0x65, 0x73, 0x61, 0x65, 0x3b,
-0x6d, 0x3b, 0x6b, 0x3b, 0x6d, 0x3b, 0x14b, 0x3b, 0x257, 0x3b, 0x65, 0x7a, 0x6f, 0x6e, 0x64, 0x61, 0x67, 0x3b, 0x6d, 0x61,
-0x61, 0x6e, 0x64, 0x61, 0x67, 0x3b, 0x64, 0x69, 0x6e, 0x73, 0x64, 0x61, 0x67, 0x3b, 0x77, 0x6f, 0x65, 0x6e, 0x73, 0x64,
-0x61, 0x67, 0x3b, 0x64, 0x6f, 0x6e, 0x64, 0x65, 0x72, 0x64, 0x61, 0x67, 0x3b, 0x76, 0x72, 0x69, 0x6a, 0x64, 0x61, 0x67,
-0x3b, 0x7a, 0x61, 0x74, 0x65, 0x72, 0x64, 0x61, 0x67, 0x7a, 0x6f, 0x3b, 0x6d, 0x61, 0x3b, 0x64, 0x69, 0x3b, 0x77, 0x6f,
-0x3b, 0x64, 0x6f, 0x3b, 0x76, 0x72, 0x3b, 0x7a, 0x61, 0x5a, 0x3b, 0x4d, 0x3b, 0x44, 0x3b, 0x57, 0x3b, 0x44, 0x3b, 0x56,
-0x3b, 0x5a, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf58, 0xf72, 0xf42, 0xf0b,
-0xf51, 0xf58, 0xf62, 0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf63, 0xfb7, 0xf42, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b,
-0xf55, 0xf74, 0xf62, 0xf0b, 0xf56, 0xf74, 0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf54, 0xf0b, 0xf66, 0xf44, 0xf66, 0xf0b, 0x3b, 0xf42,
-0xf5f, 0xf60, 0xf0b, 0xf66, 0xfa4, 0xf7a, 0xf53, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf49, 0xf72, 0xf0b, 0xf58, 0xf0b,
-0xf5f, 0xfb3, 0xf0b, 0x3b, 0xf58, 0xf72, 0xf62, 0xf0b, 0x3b, 0xf63, 0xfb7, 0xf42, 0xf0b, 0x3b, 0xf55, 0xf74, 0xf62, 0xf0b, 0x3b, 0xf66,
-0xf44, 0xf66, 0xf0b, 0x3b, 0xf66, 0xfa4, 0xf7a, 0xf53, 0xf0b, 0x3b, 0xf49, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0x3b, 0xf58, 0xf72, 0xf62, 0x3b,
-0xf63, 0xfb7, 0xf42, 0x3b, 0xf55, 0xf74, 0xf62, 0x3b, 0xf66, 0xf44, 0xfb6, 0x3b, 0xf66, 0xfa4, 0xf7a, 0xf53, 0x3b, 0xf49, 0xf72, 0x4b,
-0x69, 0x75, 0x6d, 0x69, 0x61, 0x3b, 0x4e, 0x6a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x4e, 0x6a, 0x75, 0x6d,
-0x61, 0x69, 0x6e, 0x65, 0x3b, 0x4e, 0x6a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x41, 0x72, 0x61, 0x6d, 0x69,
-0x74, 0x68, 0x69, 0x3b, 0x4e, 0x6a, 0x75, 0x6d, 0x61, 0x61, 0x3b, 0x4e, 0x4a, 0x75, 0x6d, 0x61, 0x6d, 0x6f, 0x74, 0x68,
-0x69, 0x69, 0x4b, 0x6d, 0x61, 0x3b, 0x54, 0x61, 0x74, 0x3b, 0x49, 0x6e, 0x65, 0x3b, 0x54, 0x61, 0x6e, 0x3b, 0x41, 0x72,
-0x6d, 0x3b, 0x4d, 0x61, 0x61, 0x3b, 0x4e, 0x4d, 0x4d, 0x4b, 0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x41, 0x3b, 0x4d,
-0x3b, 0x4e, 0x53, 0x75, 0x2e, 0x3b, 0x4d, 0x2e, 0x3b, 0x54, 0x75, 0x2e, 0x3b, 0x57, 0x2e, 0x3b, 0x54, 0x68, 0x2e, 0x3b,
-0x46, 0x2e, 0x3b, 0x53, 0x61, 0x2e, 0x64, 0x69, 0x6d, 0x61, 0x6e, 0x109, 0x6f, 0x3b, 0x6c, 0x75, 0x6e, 0x64, 0x6f, 0x3b,
-0x6d, 0x61, 0x72, 0x64, 0x6f, 0x3b, 0x6d, 0x65, 0x72, 0x6b, 0x72, 0x65, 0x64, 0x6f, 0x3b, 0x135, 0x61, 0x16d, 0x64, 0x6f,
-0x3b, 0x76, 0x65, 0x6e, 0x64, 0x72, 0x65, 0x64, 0x6f, 0x3b, 0x73, 0x61, 0x62, 0x61, 0x74, 0x6f, 0x64, 0x69, 0x3b, 0x6c,
-0x75, 0x3b, 0x6d, 0x61, 0x3b, 0x6d, 0x65, 0x3b, 0x135, 0x61, 0x3b, 0x76, 0x65, 0x3b, 0x73, 0x61, 0x44, 0x3b, 0x4c, 0x3b,
-0x4d, 0x3b, 0x4d, 0x3b, 0x134, 0x3b, 0x56, 0x3b, 0x53, 0x50, 0xfc, 0x68, 0x61, 0x70, 0xe4, 0x65, 0x76, 0x3b, 0x45, 0x73,
-0x6d, 0x61, 0x73, 0x70, 0xe4, 0x65, 0x76, 0x3b, 0x54, 0x65, 0x69, 0x73, 0x69, 0x70, 0xe4, 0x65, 0x76, 0x3b, 0x4b, 0x6f,
-0x6c, 0x6d, 0x61, 0x70, 0xe4, 0x65, 0x76, 0x3b, 0x4e, 0x65, 0x6c, 0x6a, 0x61, 0x70, 0xe4, 0x65, 0x76, 0x3b, 0x52, 0x65,
-0x65, 0x64, 0x65, 0x3b, 0x4c, 0x61, 0x75, 0x70, 0xe4, 0x65, 0x76, 0x50, 0x3b, 0x45, 0x3b, 0x54, 0x3b, 0x4b, 0x3b, 0x4e,
-0x3b, 0x52, 0x3b, 0x4c, 0x6b, 0x254, 0x73, 0x69, 0x256, 0x61, 0x3b, 0x64, 0x7a, 0x6f, 0x256, 0x61, 0x3b, 0x62, 0x6c, 0x61,
-0x256, 0x61, 0x3b, 0x6b, 0x75, 0x256, 0x61, 0x3b, 0x79, 0x61, 0x77, 0x6f, 0x256, 0x61, 0x3b, 0x66, 0x69, 0x256, 0x61, 0x3b,
-0x6d, 0x65, 0x6d, 0x6c, 0x65, 0x256, 0x61, 0x6b, 0x254, 0x73, 0x3b, 0x64, 0x7a, 0x6f, 0x3b, 0x62, 0x6c, 0x61, 0x3b, 0x6b,
-0x75, 0x256, 0x3b, 0x79, 0x61, 0x77, 0x3b, 0x66, 0x69, 0x256, 0x3b, 0x6d, 0x65, 0x6d, 0x6b, 0x3b, 0x64, 0x3b, 0x62, 0x3b,
-0x6b, 0x3b, 0x79, 0x3b, 0x66, 0x3b, 0x6d, 0x73, 0x254, 0x301, 0x6e, 0x64, 0x254, 0x3b, 0x6d, 0x254, 0x301, 0x6e, 0x64, 0x69,
-0x3b, 0x73, 0x254, 0x301, 0x6e, 0x64, 0x254, 0x20, 0x6d, 0x259, 0x6c, 0xfa, 0x20, 0x6d, 0x259, 0x301, 0x62, 0x25b, 0x30c, 0x3b,
-0x73, 0x254, 0x301, 0x6e, 0x64, 0x254, 0x20, 0x6d, 0x259, 0x6c, 0xfa, 0x20, 0x6d, 0x259, 0x301, 0x6c, 0x25b, 0x301, 0x3b, 0x73,
-0x254, 0x301, 0x6e, 0x64, 0x254, 0x20, 0x6d, 0x259, 0x6c, 0xfa, 0x20, 0x6d, 0x259, 0x301, 0x6e, 0x79, 0x69, 0x3b, 0x66, 0xfa,
-0x6c, 0x61, 0x64, 0xe9, 0x3b, 0x73, 0xe9, 0x72, 0x61, 0x64, 0xe9, 0x73, 0x254, 0x301, 0x6e, 0x3b, 0x6d, 0x254, 0x301, 0x6e,
-0x3b, 0x73, 0x6d, 0x62, 0x3b, 0x73, 0x6d, 0x6c, 0x3b, 0x73, 0x6d, 0x6e, 0x3b, 0x66, 0xfa, 0x6c, 0x3b, 0x73, 0xe9, 0x72,
-0x73, 0x3b, 0x6d, 0x3b, 0x73, 0x3b, 0x73, 0x3b, 0x73, 0x3b, 0x66, 0x3b, 0x73, 0x73, 0x75, 0x6e, 0x6e, 0x75, 0x64, 0x61,
-0x67, 0x75, 0x72, 0x3b, 0x6d, 0xe1, 0x6e, 0x61, 0x64, 0x61, 0x67, 0x75, 0x72, 0x3b, 0x74, 0xfd, 0x73, 0x64, 0x61, 0x67,
-0x75, 0x72, 0x3b, 0x6d, 0x69, 0x6b, 0x75, 0x64, 0x61, 0x67, 0x75, 0x72, 0x3b, 0x68, 0xf3, 0x73, 0x64, 0x61, 0x67, 0x75,
-0x72, 0x3b, 0x66, 0x72, 0xed, 0x67, 0x67, 0x6a, 0x61, 0x64, 0x61, 0x67, 0x75, 0x72, 0x3b, 0x6c, 0x65, 0x79, 0x67, 0x61,
-0x72, 0x64, 0x61, 0x67, 0x75, 0x72, 0x73, 0x75, 0x6e, 0x3b, 0x6d, 0xe1, 0x6e, 0x3b, 0x74, 0xfd, 0x73, 0x3b, 0x6d, 0x69,
-0x6b, 0x3b, 0x68, 0xf3, 0x73, 0x3b, 0x66, 0x72, 0xed, 0x3b, 0x6c, 0x65, 0x79, 0x73, 0x75, 0x6e, 0x2e, 0x3b, 0x6d, 0xe1,
-0x6e, 0x2e, 0x3b, 0x74, 0xfd, 0x73, 0x2e, 0x3b, 0x6d, 0x69, 0x6b, 0x2e, 0x3b, 0x68, 0xf3, 0x73, 0x2e, 0x3b, 0x66, 0x72,
-0xed, 0x2e, 0x3b, 0x6c, 0x65, 0x79, 0x2e, 0x53, 0x3b, 0x4d, 0x3b, 0x54, 0x3b, 0x4d, 0x3b, 0x48, 0x3b, 0x46, 0x3b, 0x4c,
-0x4c, 0x69, 0x6e, 0x67, 0x67, 0x6f, 0x3b, 0x4c, 0x75, 0x6e, 0x65, 0x73, 0x3b, 0x4d, 0x61, 0x72, 0x74, 0x65, 0x73, 0x3b,
-0x4d, 0x69, 0x79, 0x65, 0x72, 0x6b, 0x75, 0x6c, 0x65, 0x73, 0x3b, 0x48, 0x75, 0x77, 0x65, 0x62, 0x65, 0x73, 0x3b, 0x42,
-0x69, 0x79, 0x65, 0x72, 0x6e, 0x65, 0x73, 0x3b, 0x53, 0x61, 0x62, 0x61, 0x64, 0x6f, 0x4c, 0x69, 0x6e, 0x3b, 0x4c, 0x75,
-0x6e, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x4d, 0x69, 0x79, 0x3b, 0x48, 0x75, 0x77, 0x3b, 0x42, 0x69, 0x79, 0x3b, 0x53, 0x61,
-0x62, 0x73, 0x75, 0x6e, 0x6e, 0x75, 0x6e, 0x74, 0x61, 0x69, 0x3b, 0x6d, 0x61, 0x61, 0x6e, 0x61, 0x6e, 0x74, 0x61, 0x69,
-0x3b, 0x74, 0x69, 0x69, 0x73, 0x74, 0x61, 0x69, 0x3b, 0x6b, 0x65, 0x73, 0x6b, 0x69, 0x76, 0x69, 0x69, 0x6b, 0x6b, 0x6f,
-0x3b, 0x74, 0x6f, 0x72, 0x73, 0x74, 0x61, 0x69, 0x3b, 0x70, 0x65, 0x72, 0x6a, 0x61, 0x6e, 0x74, 0x61, 0x69, 0x3b, 0x6c,
-0x61, 0x75, 0x61, 0x6e, 0x74, 0x61, 0x69, 0x73, 0x75, 0x6e, 0x6e, 0x75, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x61, 0x3b, 0x6d,
-0x61, 0x61, 0x6e, 0x61, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x61, 0x3b, 0x74, 0x69, 0x69, 0x73, 0x74, 0x61, 0x69, 0x6e, 0x61,
-0x3b, 0x6b, 0x65, 0x73, 0x6b, 0x69, 0x76, 0x69, 0x69, 0x6b, 0x6b, 0x6f, 0x6e, 0x61, 0x3b, 0x74, 0x6f, 0x72, 0x73, 0x74,
-0x61, 0x69, 0x6e, 0x61, 0x3b, 0x70, 0x65, 0x72, 0x6a, 0x61, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x61, 0x3b, 0x6c, 0x61, 0x75,
-0x61, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x61, 0x73, 0x75, 0x3b, 0x6d, 0x61, 0x3b, 0x74, 0x69, 0x3b, 0x6b, 0x65, 0x3b, 0x74,
-0x6f, 0x3b, 0x70, 0x65, 0x3b, 0x6c, 0x61, 0x53, 0x3b, 0x4d, 0x3b, 0x54, 0x3b, 0x4b, 0x3b, 0x54, 0x3b, 0x50, 0x3b, 0x4c,
-0x64, 0x69, 0x6d, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x3b, 0x6c, 0x75, 0x6e, 0x64, 0x69, 0x3b, 0x6d, 0x61, 0x72, 0x64, 0x69,
-0x3b, 0x6d, 0x65, 0x72, 0x63, 0x72, 0x65, 0x64, 0x69, 0x3b, 0x6a, 0x65, 0x75, 0x64, 0x69, 0x3b, 0x76, 0x65, 0x6e, 0x64,
-0x72, 0x65, 0x64, 0x69, 0x3b, 0x73, 0x61, 0x6d, 0x65, 0x64, 0x69, 0x64, 0x69, 0x6d, 0x2e, 0x3b, 0x6c, 0x75, 0x6e, 0x2e,
-0x3b, 0x6d, 0x61, 0x72, 0x2e, 0x3b, 0x6d, 0x65, 0x72, 0x2e, 0x3b, 0x6a, 0x65, 0x75, 0x2e, 0x3b, 0x76, 0x65, 0x6e, 0x2e,
-0x3b, 0x73, 0x61, 0x6d, 0x2e, 0x44, 0x3b, 0x4c, 0x3b, 0x4d, 0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x56, 0x3b, 0x53, 0x64, 0x6f,
-0x6d, 0x65, 0x6e, 0x69, 0x65, 0x3b, 0x6c, 0x75, 0x6e, 0x69, 0x73, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x61, 0x72, 0x73, 0x3b,
-0x6d, 0x69, 0x65, 0x72, 0x63, 0x75, 0x73, 0x3b, 0x6a, 0x6f, 0x69, 0x62, 0x65, 0x3b, 0x76, 0x69, 0x6e, 0x61, 0x72, 0x73,
-0x3b, 0x73, 0x61, 0x62, 0x69, 0x64, 0x65, 0x64, 0x6f, 0x6d, 0x3b, 0x6c, 0x75, 0x6e, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x6d,
-0x69, 0x65, 0x3b, 0x6a, 0x6f, 0x69, 0x3b, 0x76, 0x69, 0x6e, 0x3b, 0x73, 0x61, 0x62, 0x64, 0x65, 0x77, 0x6f, 0x3b, 0x61,
-0x61, 0x253, 0x6e, 0x64, 0x65, 0x3b, 0x6d, 0x61, 0x77, 0x62, 0x61, 0x61, 0x72, 0x65, 0x3b, 0x6e, 0x6a, 0x65, 0x73, 0x6c,
-0x61, 0x61, 0x72, 0x65, 0x3b, 0x6e, 0x61, 0x61, 0x73, 0x61, 0x61, 0x6e, 0x64, 0x65, 0x3b, 0x6d, 0x61, 0x77, 0x6e, 0x64,
-0x65, 0x3b, 0x68, 0x6f, 0x6f, 0x72, 0x65, 0x2d, 0x62, 0x69, 0x69, 0x72, 0x64, 0x65, 0x77, 0x3b, 0x61, 0x61, 0x253, 0x3b,
-0x6d, 0x61, 0x77, 0x3b, 0x6e, 0x6a, 0x65, 0x3b, 0x6e, 0x61, 0x61, 0x3b, 0x6d, 0x77, 0x64, 0x3b, 0x68, 0x62, 0x69, 0x64,
-0x3b, 0x61, 0x3b, 0x6d, 0x3b, 0x6e, 0x3b, 0x6e, 0x3b, 0x6d, 0x3b, 0x68, 0xd83a, 0xdd08, 0xd83a, 0xdd2b, 0xd83a, 0xdd2c, 0xd83a, 0xdd26,
-0xd83a, 0xdd2d, 0xd83a, 0xdd2a, 0xd83a, 0xdd46, 0xd83a, 0xdd2b, 0x3b, 0xd83a, 0xdd00, 0xd83a, 0xdd44, 0xd83a, 0xdd29, 0xd83a, 0xdd35, 0xd83a, 0xdd32, 0xd83a,
-0xdd4b, 0xd83a, 0xdd23, 0xd83a, 0xdd2b, 0x3b, 0xd83a, 0xdd03, 0xd83a, 0xdd22, 0xd83a, 0xdd31, 0xd83a, 0xdd26, 0xd83a, 0xdd22, 0xd83a, 0xdd44, 0xd83a, 0xdd2a,
-0xd83a, 0xdd2b, 0x3b, 0xd83a, 0xdd10, 0xd83a, 0xdd36, 0xd83a, 0xdd2b, 0xd83a, 0xdd27, 0xd83a, 0xdd24, 0xd83a, 0xdd22, 0xd83a, 0xdd44, 0xd83a, 0xdd2a, 0xd83a,
-0xdd2b, 0x3b, 0xd83a, 0xdd10, 0xd83a, 0xdd22, 0xd83a, 0xdd44, 0xd83a, 0xdd27, 0xd83a, 0xdd22, 0xd83a, 0xdd44, 0xd83a, 0xdd32, 0xd83a, 0xdd23, 0xd83a, 0xdd2b,
-0x3b, 0xd83a, 0xdd03, 0xd83a, 0xdd22, 0xd83a, 0xdd31, 0xd83a, 0xdd32, 0xd83a, 0xdd23, 0xd83a, 0xdd2b, 0x3b, 0xd83a, 0xdd16, 0xd83a, 0xdd2e, 0xd83a, 0xdd2a,
-0xd83a, 0xdd26, 0xd83a, 0xdd2d, 0xd83a, 0xdd2a, 0xd83a, 0xdd46, 0xd83a, 0xdd2b, 0xd83a, 0xdd08, 0xd83a, 0xdd2b, 0xd83a, 0xdd2c, 0x3b, 0xd83a, 0xdd00, 0xd83a,
-0xdd44, 0xd83a, 0xdd29, 0xd83a, 0xdd35, 0x3b, 0xd83a, 0xdd03, 0xd83a, 0xdd22, 0xd83a, 0xdd26, 0x3b, 0xd83a, 0xdd14, 0xd83a, 0xdd2b, 0xd83a, 0xdd27, 0x3b,
-0xd83a, 0xdd10, 0xd83a, 0xdd22, 0xd83a, 0xdd44, 0xd83a, 0xdd27, 0x3b, 0xd83a, 0xdd03, 0xd83a, 0xdd22, 0xd83a, 0xdd23, 0x3b, 0xd83a, 0xdd16, 0xd83a, 0xdd2e,
-0xd83a, 0xdd2a, 0xd83a, 0xdd08, 0x3b, 0xd83a, 0xdd00, 0xd83a, 0xdd44, 0x3b, 0xd83a, 0xdd03, 0x3b, 0xd83a, 0xdd14, 0x3b, 0xd83a, 0xdd10, 0x3b, 0xd83a,
-0xdd03, 0x3b, 0xd83a, 0xdd16, 0x44, 0x69, 0x44, 0xf2, 0x6d, 0x68, 0x6e, 0x61, 0x69, 0x63, 0x68, 0x3b, 0x44, 0x69, 0x4c, 0x75,
-0x61, 0x69, 0x6e, 0x3b, 0x44, 0x69, 0x4d, 0xe0, 0x69, 0x72, 0x74, 0x3b, 0x44, 0x69, 0x43, 0x69, 0x61, 0x64, 0x61, 0x69,
-0x6e, 0x3b, 0x44, 0x69, 0x61, 0x72, 0x44, 0x61, 0x6f, 0x69, 0x6e, 0x3b, 0x44, 0x69, 0x68, 0x41, 0x6f, 0x69, 0x6e, 0x65,
-0x3b, 0x44, 0x69, 0x53, 0x61, 0x74, 0x68, 0x61, 0x69, 0x72, 0x6e, 0x65, 0x44, 0x69, 0x44, 0x3b, 0x44, 0x69, 0x4c, 0x3b,
-0x44, 0x69, 0x4d, 0x3b, 0x44, 0x69, 0x43, 0x3b, 0x44, 0x69, 0x61, 0x3b, 0x44, 0x69, 0x68, 0x3b, 0x44, 0x69, 0x53, 0x44,
-0x3b, 0x4c, 0x3b, 0x4d, 0x3b, 0x43, 0x3b, 0x41, 0x3b, 0x48, 0x3b, 0x53, 0x44, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x6f, 0x3b,
-0x4c, 0x75, 0x6e, 0x73, 0x3b, 0x4d, 0x61, 0x72, 0x74, 0x65, 0x73, 0x3b, 0x4d, 0xe9, 0x72, 0x63, 0x6f, 0x72, 0x65, 0x73,
-0x3b, 0x58, 0x6f, 0x76, 0x65, 0x73, 0x3b, 0x56, 0x65, 0x6e, 0x72, 0x65, 0x73, 0x3b, 0x53, 0xe1, 0x62, 0x61, 0x64, 0x6f,
-0x64, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x6f, 0x3b, 0x6c, 0x75, 0x6e, 0x73, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x65, 0x73, 0x3b,
-0x6d, 0xe9, 0x72, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x3b, 0x78, 0x6f, 0x76, 0x65, 0x73, 0x3b, 0x76, 0x65, 0x6e, 0x72, 0x65,
-0x73, 0x3b, 0x73, 0xe1, 0x62, 0x61, 0x64, 0x6f, 0x44, 0x6f, 0x6d, 0x2e, 0x3b, 0x4c, 0x75, 0x6e, 0x73, 0x3b, 0x4d, 0x61,
-0x72, 0x2e, 0x3b, 0x4d, 0xe9, 0x72, 0x2e, 0x3b, 0x58, 0x6f, 0x76, 0x2e, 0x3b, 0x56, 0x65, 0x6e, 0x2e, 0x3b, 0x53, 0xe1,
-0x62, 0x2e, 0x64, 0x6f, 0x6d, 0x2e, 0x3b, 0x6c, 0x75, 0x6e, 0x73, 0x3b, 0x6d, 0x61, 0x72, 0x2e, 0x3b, 0x6d, 0xe9, 0x72,
-0x2e, 0x3b, 0x78, 0x6f, 0x76, 0x2e, 0x3b, 0x76, 0x65, 0x6e, 0x2e, 0x3b, 0x73, 0xe1, 0x62, 0x2e, 0x64, 0x2e, 0x3b, 0x6c,
-0x2e, 0x3b, 0x6d, 0x2e, 0x3b, 0x6d, 0x2e, 0x3b, 0x78, 0x2e, 0x3b, 0x76, 0x2e, 0x3b, 0x73, 0x2e, 0x53, 0x61, 0x62, 0x62,
-0x69, 0x69, 0x74, 0x69, 0x3b, 0x42, 0x61, 0x6c, 0x61, 0x7a, 0x61, 0x3b, 0x4c, 0x77, 0x61, 0x6b, 0x75, 0x62, 0x69, 0x72,
-0x69, 0x3b, 0x4c, 0x77, 0x61, 0x6b, 0x75, 0x73, 0x61, 0x74, 0x75, 0x3b, 0x4c, 0x77, 0x61, 0x6b, 0x75, 0x6e, 0x61, 0x3b,
-0x4c, 0x77, 0x61, 0x6b, 0x75, 0x74, 0x61, 0x61, 0x6e, 0x6f, 0x3b, 0x4c, 0x77, 0x61, 0x6d, 0x75, 0x6b, 0x61, 0x61, 0x67,
-0x61, 0x53, 0x61, 0x62, 0x3b, 0x42, 0x61, 0x6c, 0x3b, 0x4c, 0x77, 0x32, 0x3b, 0x4c, 0x77, 0x33, 0x3b, 0x4c, 0x77, 0x34,
-0x3b, 0x4c, 0x77, 0x35, 0x3b, 0x4c, 0x77, 0x36, 0x53, 0x3b, 0x42, 0x3b, 0x4c, 0x3b, 0x4c, 0x3b, 0x4c, 0x3b, 0x4c, 0x3b,
-0x4c, 0x10d9, 0x10d5, 0x10d8, 0x10e0, 0x10d0, 0x3b, 0x10dd, 0x10e0, 0x10e8, 0x10d0, 0x10d1, 0x10d0, 0x10d7, 0x10d8, 0x3b, 0x10e1, 0x10d0, 0x10db, 0x10e8,
-0x10d0, 0x10d1, 0x10d0, 0x10d7, 0x10d8, 0x3b, 0x10dd, 0x10d7, 0x10ee, 0x10e8, 0x10d0, 0x10d1, 0x10d0, 0x10d7, 0x10d8, 0x3b, 0x10ee, 0x10e3, 0x10d7, 0x10e8,
-0x10d0, 0x10d1, 0x10d0, 0x10d7, 0x10d8, 0x3b, 0x10de, 0x10d0, 0x10e0, 0x10d0, 0x10e1, 0x10d9, 0x10d4, 0x10d5, 0x10d8, 0x3b, 0x10e8, 0x10d0, 0x10d1, 0x10d0,
-0x10d7, 0x10d8, 0x10d9, 0x10d5, 0x10d8, 0x3b, 0x10dd, 0x10e0, 0x10e8, 0x3b, 0x10e1, 0x10d0, 0x10db, 0x3b, 0x10dd, 0x10d7, 0x10ee, 0x3b, 0x10ee, 0x10e3,
-0x10d7, 0x3b, 0x10de, 0x10d0, 0x10e0, 0x3b, 0x10e8, 0x10d0, 0x10d1, 0x10d9, 0x3b, 0x10dd, 0x3b, 0x10e1, 0x3b, 0x10dd, 0x3b, 0x10ee, 0x3b, 0x10de,
-0x3b, 0x10e8, 0x53, 0x6f, 0x6e, 0x6e, 0x74, 0x61, 0x67, 0x3b, 0x4d, 0x6f, 0x6e, 0x74, 0x61, 0x67, 0x3b, 0x44, 0x69, 0x65,
-0x6e, 0x73, 0x74, 0x61, 0x67, 0x3b, 0x4d, 0x69, 0x74, 0x74, 0x77, 0x6f, 0x63, 0x68, 0x3b, 0x44, 0x6f, 0x6e, 0x6e, 0x65,
-0x72, 0x73, 0x74, 0x61, 0x67, 0x3b, 0x46, 0x72, 0x65, 0x69, 0x74, 0x61, 0x67, 0x3b, 0x53, 0x61, 0x6d, 0x73, 0x74, 0x61,
-0x67, 0x53, 0x6f, 0x3b, 0x4d, 0x6f, 0x3b, 0x44, 0x69, 0x3b, 0x4d, 0x69, 0x3b, 0x44, 0x6f, 0x3b, 0x46, 0x72, 0x3b, 0x53,
-0x61, 0x53, 0x6f, 0x2e, 0x3b, 0x4d, 0x6f, 0x2e, 0x3b, 0x44, 0x69, 0x2e, 0x3b, 0x4d, 0x69, 0x2e, 0x3b, 0x44, 0x6f, 0x2e,
-0x3b, 0x46, 0x72, 0x2e, 0x3b, 0x53, 0x61, 0x2e, 0x39a, 0x3c5, 0x3c1, 0x3b9, 0x3b1, 0x3ba, 0x3ae, 0x3b, 0x394, 0x3b5, 0x3c5, 0x3c4,
-0x3ad, 0x3c1, 0x3b1, 0x3b, 0x3a4, 0x3c1, 0x3af, 0x3c4, 0x3b7, 0x3b, 0x3a4, 0x3b5, 0x3c4, 0x3ac, 0x3c1, 0x3c4, 0x3b7, 0x3b, 0x3a0, 0x3ad,
-0x3bc, 0x3c0, 0x3c4, 0x3b7, 0x3b, 0x3a0, 0x3b1, 0x3c1, 0x3b1, 0x3c3, 0x3ba, 0x3b5, 0x3c5, 0x3ae, 0x3b, 0x3a3, 0x3ac, 0x3b2, 0x3b2, 0x3b1,
-0x3c4, 0x3bf, 0x39a, 0x3c5, 0x3c1, 0x3b, 0x394, 0x3b5, 0x3c5, 0x3b, 0x3a4, 0x3c1, 0x3af, 0x3b, 0x3a4, 0x3b5, 0x3c4, 0x3b, 0x3a0, 0x3ad,
-0x3bc, 0x3b, 0x3a0, 0x3b1, 0x3c1, 0x3b, 0x3a3, 0x3ac, 0x3b2, 0x39a, 0x3b, 0x394, 0x3b, 0x3a4, 0x3b, 0x3a4, 0x3b, 0x3a0, 0x3b, 0x3a0,
-0x3b, 0x3a3, 0xab0, 0xab5, 0xabf, 0xab5, 0xabe, 0xab0, 0x3b, 0xab8, 0xacb, 0xaae, 0xab5, 0xabe, 0xab0, 0x3b, 0xaae, 0xa82, 0xa97, 0xab3,
-0xab5, 0xabe, 0xab0, 0x3b, 0xaac, 0xac1, 0xaa7, 0xab5, 0xabe, 0xab0, 0x3b, 0xa97, 0xac1, 0xab0, 0xac1, 0xab5, 0xabe, 0xab0, 0x3b, 0xab6,
-0xac1, 0xa95, 0xacd, 0xab0, 0xab5, 0xabe, 0xab0, 0x3b, 0xab6, 0xaa8, 0xabf, 0xab5, 0xabe, 0xab0, 0xab0, 0xab5, 0xabf, 0x3b, 0xab8, 0xacb,
-0xaae, 0x3b, 0xaae, 0xa82, 0xa97, 0xab3, 0x3b, 0xaac, 0xac1, 0xaa7, 0x3b, 0xa97, 0xac1, 0xab0, 0xac1, 0x3b, 0xab6, 0xac1, 0xa95, 0xacd,
-0xab0, 0x3b, 0xab6, 0xaa8, 0xabf, 0xab0, 0x3b, 0xab8, 0xacb, 0x3b, 0xaae, 0xa82, 0x3b, 0xaac, 0xac1, 0x3b, 0xa97, 0xac1, 0x3b, 0xab6,
-0xac1, 0x3b, 0xab6, 0x43, 0x68, 0x75, 0x6d, 0x61, 0x70, 0x69, 0x72, 0x69, 0x3b, 0x43, 0x68, 0x75, 0x6d, 0x61, 0x74, 0x61,
-0x74, 0x6f, 0x3b, 0x43, 0x68, 0x75, 0x6d, 0x61, 0x69, 0x6e, 0x65, 0x3b, 0x43, 0x68, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x6e,
-0x6f, 0x3b, 0x41, 0x72, 0x61, 0x6d, 0x69, 0x73, 0x69, 0x3b, 0x49, 0x63, 0x68, 0x75, 0x6d, 0x61, 0x3b, 0x45, 0x73, 0x61,
-0x62, 0x61, 0x74, 0x6f, 0x43, 0x70, 0x72, 0x3b, 0x43, 0x74, 0x74, 0x3b, 0x43, 0x6d, 0x6e, 0x3b, 0x43, 0x6d, 0x74, 0x3b,
-0x41, 0x72, 0x73, 0x3b, 0x49, 0x63, 0x6d, 0x3b, 0x45, 0x73, 0x74, 0x43, 0x3b, 0x43, 0x3b, 0x43, 0x3b, 0x43, 0x3b, 0x41,
-0x3b, 0x49, 0x3b, 0x45, 0x4c, 0x61, 0x68, 0x61, 0x64, 0x69, 0x3b, 0x4c, 0x69, 0x74, 0x69, 0x6e, 0x69, 0x6e, 0x3b, 0x54,
-0x61, 0x6c, 0x61, 0x74, 0x61, 0x3b, 0x4c, 0x61, 0x72, 0x61, 0x62, 0x61, 0x3b, 0x41, 0x6c, 0x68, 0x61, 0x6d, 0x69, 0x73,
-0x3b, 0x4a, 0x75, 0x6d, 0x6d, 0x61, 0x2bc, 0x61, 0x3b, 0x41, 0x73, 0x61, 0x62, 0x61, 0x72, 0x4c, 0x61, 0x68, 0x3b, 0x4c,
-0x69, 0x74, 0x3b, 0x54, 0x61, 0x6c, 0x3b, 0x4c, 0x61, 0x72, 0x3b, 0x41, 0x6c, 0x68, 0x3b, 0x4a, 0x75, 0x6d, 0x3b, 0x41,
-0x73, 0x61, 0x4c, 0x3b, 0x4c, 0x3b, 0x54, 0x3b, 0x4c, 0x3b, 0x41, 0x3b, 0x4a, 0x3b, 0x41, 0x4c, 0x101, 0x70, 0x75, 0x6c,
-0x65, 0x3b, 0x50, 0x6f, 0x2bb, 0x61, 0x6b, 0x61, 0x68, 0x69, 0x3b, 0x50, 0x6f, 0x2bb, 0x61, 0x6c, 0x75, 0x61, 0x3b, 0x50,
-0x6f, 0x2bb, 0x61, 0x6b, 0x6f, 0x6c, 0x75, 0x3b, 0x50, 0x6f, 0x2bb, 0x61, 0x68, 0x101, 0x3b, 0x50, 0x6f, 0x2bb, 0x61, 0x6c,
-0x69, 0x6d, 0x61, 0x3b, 0x50, 0x6f, 0x2bb, 0x61, 0x6f, 0x6e, 0x6f, 0x4c, 0x50, 0x3b, 0x50, 0x31, 0x3b, 0x50, 0x32, 0x3b,
-0x50, 0x33, 0x3b, 0x50, 0x34, 0x3b, 0x50, 0x35, 0x3b, 0x50, 0x36, 0x5d9, 0x5d5, 0x5dd, 0x20, 0x5e8, 0x5d0, 0x5e9, 0x5d5, 0x5df,
-0x3b, 0x5d9, 0x5d5, 0x5dd, 0x20, 0x5e9, 0x5e0, 0x5d9, 0x3b, 0x5d9, 0x5d5, 0x5dd, 0x20, 0x5e9, 0x5dc, 0x5d9, 0x5e9, 0x5d9, 0x3b, 0x5d9,
-0x5d5, 0x5dd, 0x20, 0x5e8, 0x5d1, 0x5d9, 0x5e2, 0x5d9, 0x3b, 0x5d9, 0x5d5, 0x5dd, 0x20, 0x5d7, 0x5de, 0x5d9, 0x5e9, 0x5d9, 0x3b, 0x5d9,
-0x5d5, 0x5dd, 0x20, 0x5e9, 0x5d9, 0x5e9, 0x5d9, 0x3b, 0x5d9, 0x5d5, 0x5dd, 0x20, 0x5e9, 0x5d1, 0x5ea, 0x5d9, 0x5d5, 0x5dd, 0x20, 0x5d0,
-0x5f3, 0x3b, 0x5d9, 0x5d5, 0x5dd, 0x20, 0x5d1, 0x5f3, 0x3b, 0x5d9, 0x5d5, 0x5dd, 0x20, 0x5d2, 0x5f3, 0x3b, 0x5d9, 0x5d5, 0x5dd, 0x20,
-0x5d3, 0x5f3, 0x3b, 0x5d9, 0x5d5, 0x5dd, 0x20, 0x5d4, 0x5f3, 0x3b, 0x5d9, 0x5d5, 0x5dd, 0x20, 0x5d5, 0x5f3, 0x3b, 0x5e9, 0x5d1, 0x5ea,
-0x5d0, 0x5f3, 0x3b, 0x5d1, 0x5f3, 0x3b, 0x5d2, 0x5f3, 0x3b, 0x5d3, 0x5f3, 0x3b, 0x5d4, 0x5f3, 0x3b, 0x5d5, 0x5f3, 0x3b, 0x5e9, 0x5f3,
-0x930, 0x935, 0x93f, 0x935, 0x93e, 0x930, 0x3b, 0x938, 0x94b, 0x92e, 0x935, 0x93e, 0x930, 0x3b, 0x92e, 0x902, 0x917, 0x932, 0x935, 0x93e,
-0x930, 0x3b, 0x92c, 0x941, 0x927, 0x935, 0x93e, 0x930, 0x3b, 0x917, 0x941, 0x930, 0x941, 0x935, 0x93e, 0x930, 0x3b, 0x936, 0x941, 0x915,
-0x94d, 0x930, 0x935, 0x93e, 0x930, 0x3b, 0x936, 0x928, 0x93f, 0x935, 0x93e, 0x930, 0x930, 0x935, 0x93f, 0x3b, 0x938, 0x94b, 0x92e, 0x3b,
-0x92e, 0x902, 0x917, 0x932, 0x3b, 0x92c, 0x941, 0x927, 0x3b, 0x917, 0x941, 0x930, 0x941, 0x3b, 0x936, 0x941, 0x915, 0x94d, 0x930, 0x3b,
-0x936, 0x928, 0x93f, 0x930, 0x3b, 0x938, 0x94b, 0x3b, 0x92e, 0x902, 0x3b, 0x92c, 0x941, 0x3b, 0x917, 0x941, 0x3b, 0x936, 0x941, 0x3b,
-0x936, 0x76, 0x61, 0x73, 0xe1, 0x72, 0x6e, 0x61, 0x70, 0x3b, 0x68, 0xe9, 0x74, 0x66, 0x151, 0x3b, 0x6b, 0x65, 0x64, 0x64,
-0x3b, 0x73, 0x7a, 0x65, 0x72, 0x64, 0x61, 0x3b, 0x63, 0x73, 0xfc, 0x74, 0xf6, 0x72, 0x74, 0xf6, 0x6b, 0x3b, 0x70, 0xe9,
-0x6e, 0x74, 0x65, 0x6b, 0x3b, 0x73, 0x7a, 0x6f, 0x6d, 0x62, 0x61, 0x74, 0x56, 0x3b, 0x48, 0x3b, 0x4b, 0x3b, 0x53, 0x7a,
-0x65, 0x3b, 0x43, 0x73, 0x3b, 0x50, 0x3b, 0x53, 0x7a, 0x6f, 0x56, 0x3b, 0x48, 0x3b, 0x4b, 0x3b, 0x53, 0x7a, 0x3b, 0x43,
-0x73, 0x3b, 0x50, 0x3b, 0x53, 0x7a, 0x73, 0x75, 0x6e, 0x6e, 0x75, 0x64, 0x61, 0x67, 0x75, 0x72, 0x3b, 0x6d, 0xe1, 0x6e,
-0x75, 0x64, 0x61, 0x67, 0x75, 0x72, 0x3b, 0xfe, 0x72, 0x69, 0xf0, 0x6a, 0x75, 0x64, 0x61, 0x67, 0x75, 0x72, 0x3b, 0x6d,
-0x69, 0xf0, 0x76, 0x69, 0x6b, 0x75, 0x64, 0x61, 0x67, 0x75, 0x72, 0x3b, 0x66, 0x69, 0x6d, 0x6d, 0x74, 0x75, 0x64, 0x61,
-0x67, 0x75, 0x72, 0x3b, 0x66, 0xf6, 0x73, 0x74, 0x75, 0x64, 0x61, 0x67, 0x75, 0x72, 0x3b, 0x6c, 0x61, 0x75, 0x67, 0x61,
-0x72, 0x64, 0x61, 0x67, 0x75, 0x72, 0x73, 0x75, 0x6e, 0x2e, 0x3b, 0x6d, 0xe1, 0x6e, 0x2e, 0x3b, 0xfe, 0x72, 0x69, 0x2e,
-0x3b, 0x6d, 0x69, 0xf0, 0x2e, 0x3b, 0x66, 0x69, 0x6d, 0x2e, 0x3b, 0x66, 0xf6, 0x73, 0x2e, 0x3b, 0x6c, 0x61, 0x75, 0x2e,
-0x53, 0x3b, 0x4d, 0x3b, 0xde, 0x3b, 0x4d, 0x3b, 0x46, 0x3b, 0x46, 0x3b, 0x4c, 0x53, 0x1ecd, 0x6e, 0x64, 0x65, 0x65, 0x3b,
-0x4d, 0x1ecd, 0x6e, 0x64, 0x65, 0x3b, 0x54, 0x69, 0x75, 0x7a, 0x64, 0x65, 0x65, 0x3b, 0x57, 0x65, 0x6e, 0x65, 0x7a, 0x64,
-0x65, 0x65, 0x3b, 0x54, 0x1ecd, 0x1ecd, 0x7a, 0x64, 0x65, 0x65, 0x3b, 0x46, 0x72, 0x61, 0x1ecb, 0x64, 0x65, 0x65, 0x3b, 0x53,
-0x61, 0x74, 0x1ecd, 0x64, 0x65, 0x65, 0x53, 0x1ecd, 0x6e, 0x3b, 0x4d, 0x1ecd, 0x6e, 0x3b, 0x54, 0x69, 0x75, 0x3b, 0x57, 0x65,
-0x6e, 0x3b, 0x54, 0x1ecd, 0x1ecd, 0x3b, 0x46, 0x72, 0x61, 0x1ecb, 0x3b, 0x53, 0x61, 0x74, 0x70, 0x61, 0x73, 0x65, 0x70, 0x65,
-0x69, 0x76, 0x69, 0x3b, 0x76, 0x75, 0x6f, 0x73, 0x73, 0x61, 0x72, 0x67, 0xe2, 0x3b, 0x6d, 0x61, 0x6a, 0x65, 0x62, 0x61,
-0x72, 0x67, 0xe2, 0x3b, 0x6b, 0x6f, 0x73, 0x6b, 0x6f, 0x6b, 0x6b, 0x6f, 0x3b, 0x74, 0x75, 0x6f, 0x72, 0xe2, 0x73, 0x74,
-0xe2, 0x68, 0x3b, 0x76, 0xe1, 0x73, 0x74, 0x75, 0x70, 0x70, 0x65, 0x69, 0x76, 0x69, 0x3b, 0x6c, 0xe1, 0x76, 0x75, 0x72,
-0x64, 0xe2, 0x68, 0x70, 0x61, 0x73, 0x65, 0x70, 0x65, 0x65, 0x69, 0x76, 0x69, 0x3b, 0x76, 0x75, 0x6f, 0x73, 0x73, 0x61,
-0x61, 0x72, 0x67, 0xe2, 0x3b, 0x6d, 0x61, 0x6a, 0x65, 0x62, 0x61, 0x61, 0x72, 0x67, 0xe2, 0x3b, 0x6b, 0x6f, 0x73, 0x6b,
-0x6f, 0x68, 0x6f, 0x3b, 0x74, 0x75, 0x6f, 0x72, 0xe2, 0x73, 0x74, 0x75, 0x76, 0x3b, 0x76, 0xe1, 0x73, 0x74, 0x75, 0x70,
-0x70, 0x65, 0x65, 0x69, 0x76, 0x69, 0x3b, 0x6c, 0xe1, 0x76, 0x75, 0x72, 0x64, 0x75, 0x76, 0x70, 0x61, 0x73, 0x3b, 0x76,
-0x75, 0x6f, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x6b, 0x6f, 0x73, 0x3b, 0x74, 0x75, 0x6f, 0x3b, 0x76, 0xe1, 0x73, 0x3b, 0x6c,
-0xe1, 0x76, 0x70, 0x3b, 0x56, 0x3b, 0x4d, 0x3b, 0x4b, 0x3b, 0x54, 0x3b, 0x56, 0x3b, 0x4c, 0x4d, 0x69, 0x6e, 0x67, 0x67,
-0x75, 0x3b, 0x53, 0x65, 0x6e, 0x69, 0x6e, 0x3b, 0x53, 0x65, 0x6c, 0x61, 0x73, 0x61, 0x3b, 0x52, 0x61, 0x62, 0x75, 0x3b,
-0x4b, 0x61, 0x6d, 0x69, 0x73, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74, 0x3b, 0x53, 0x61, 0x62, 0x74, 0x75, 0x4d, 0x69, 0x6e,
-0x3b, 0x53, 0x65, 0x6e, 0x3b, 0x53, 0x65, 0x6c, 0x3b, 0x52, 0x61, 0x62, 0x3b, 0x4b, 0x61, 0x6d, 0x3b, 0x4a, 0x75, 0x6d,
-0x3b, 0x53, 0x61, 0x62, 0x4d, 0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x52, 0x3b, 0x4b, 0x3b, 0x4a, 0x3b, 0x53, 0x64, 0x6f, 0x6d,
-0x69, 0x6e, 0x69, 0x63, 0x61, 0x3b, 0x6c, 0x75, 0x6e, 0x65, 0x64, 0x69, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x65, 0x64, 0x69,
-0x3b, 0x6d, 0x65, 0x72, 0x63, 0x75, 0x72, 0x69, 0x64, 0x69, 0x3b, 0x6a, 0x6f, 0x76, 0x65, 0x64, 0x69, 0x3b, 0x76, 0x65,
-0x6e, 0x65, 0x72, 0x64, 0x69, 0x3b, 0x73, 0x61, 0x62, 0x62, 0x61, 0x74, 0x6f, 0x64, 0x6f, 0x6d, 0x3b, 0x6c, 0x75, 0x6e,
-0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x6d, 0x65, 0x72, 0x3b, 0x6a, 0x6f, 0x76, 0x3b, 0x76, 0x65, 0x6e, 0x3b, 0x73, 0x61, 0x62,
-0x64, 0x3b, 0x6c, 0x3b, 0x6d, 0x3b, 0x6d, 0x3b, 0x6a, 0x3b, 0x76, 0x3b, 0x73, 0x44, 0xe9, 0x20, 0x44, 0x6f, 0x6d, 0x68,
-0x6e, 0x61, 0x69, 0x67, 0x68, 0x3b, 0x44, 0xe9, 0x20, 0x4c, 0x75, 0x61, 0x69, 0x6e, 0x3b, 0x44, 0xe9, 0x20, 0x4d, 0xe1,
-0x69, 0x72, 0x74, 0x3b, 0x44, 0xe9, 0x20, 0x43, 0xe9, 0x61, 0x64, 0x61, 0x6f, 0x69, 0x6e, 0x3b, 0x44, 0xe9, 0x61, 0x72,
-0x64, 0x61, 0x6f, 0x69, 0x6e, 0x3b, 0x44, 0xe9, 0x20, 0x68, 0x41, 0x6f, 0x69, 0x6e, 0x65, 0x3b, 0x44, 0xe9, 0x20, 0x53,
-0x61, 0x74, 0x68, 0x61, 0x69, 0x72, 0x6e, 0x44, 0x6f, 0x6d, 0x68, 0x3b, 0x4c, 0x75, 0x61, 0x6e, 0x3b, 0x4d, 0xe1, 0x69,
-0x72, 0x74, 0x3b, 0x43, 0xe9, 0x61, 0x64, 0x3b, 0x44, 0xe9, 0x61, 0x72, 0x3b, 0x41, 0x6f, 0x69, 0x6e, 0x65, 0x3b, 0x53,
-0x61, 0x74, 0x68, 0x44, 0x3b, 0x4c, 0x3b, 0x4d, 0x3b, 0x43, 0x3b, 0x44, 0x3b, 0x41, 0x3b, 0x53, 0x64, 0x6f, 0x6d, 0x65,
-0x6e, 0x69, 0x63, 0x61, 0x3b, 0x6c, 0x75, 0x6e, 0x65, 0x64, 0xec, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x65, 0x64, 0xec, 0x3b,
-0x6d, 0x65, 0x72, 0x63, 0x6f, 0x6c, 0x65, 0x64, 0xec, 0x3b, 0x67, 0x69, 0x6f, 0x76, 0x65, 0x64, 0xec, 0x3b, 0x76, 0x65,
-0x6e, 0x65, 0x72, 0x64, 0xec, 0x3b, 0x73, 0x61, 0x62, 0x61, 0x74, 0x6f, 0x64, 0x6f, 0x6d, 0x3b, 0x6c, 0x75, 0x6e, 0x3b,
-0x6d, 0x61, 0x72, 0x3b, 0x6d, 0x65, 0x72, 0x3b, 0x67, 0x69, 0x6f, 0x3b, 0x76, 0x65, 0x6e, 0x3b, 0x73, 0x61, 0x62, 0x44,
-0x3b, 0x4c, 0x3b, 0x4d, 0x3b, 0x4d, 0x3b, 0x47, 0x3b, 0x56, 0x3b, 0x53, 0x65e5, 0x66dc, 0x65e5, 0x3b, 0x6708, 0x66dc, 0x65e5, 0x3b,
-0x706b, 0x66dc, 0x65e5, 0x3b, 0x6c34, 0x66dc, 0x65e5, 0x3b, 0x6728, 0x66dc, 0x65e5, 0x3b, 0x91d1, 0x66dc, 0x65e5, 0x3b, 0x571f, 0x66dc, 0x65e5, 0x65e5,
-0x3b, 0x6708, 0x3b, 0x706b, 0x3b, 0x6c34, 0x3b, 0x6728, 0x3b, 0x91d1, 0x3b, 0x571f, 0x41, 0x68, 0x61, 0x64, 0x3b, 0x53, 0x65, 0x6e,
-0x69, 0x6e, 0x3b, 0x53, 0x65, 0x6c, 0x61, 0x73, 0x61, 0x3b, 0x52, 0x61, 0x62, 0x75, 0x3b, 0x4b, 0x61, 0x6d, 0x69, 0x73,
-0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74, 0x3b, 0x53, 0x61, 0x62, 0x74, 0x75, 0x41, 0x68, 0x61, 0x64, 0x3b, 0x53, 0x65, 0x6e,
-0x3b, 0x53, 0x65, 0x6c, 0x3b, 0x52, 0x61, 0x62, 0x3b, 0x4b, 0x61, 0x6d, 0x3b, 0x4a, 0x75, 0x6d, 0x3b, 0x53, 0x61, 0x62,
-0x41, 0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x52, 0x3b, 0x4b, 0x3b, 0x4a, 0x3b, 0x53, 0x44, 0x69, 0x6d, 0x61, 0x73, 0x3b, 0x54,
-0x65, 0x6e, 0x65, 0x14b, 0x3b, 0x54, 0x61, 0x6c, 0x61, 0x74, 0x61, 0x3b, 0x41, 0x6c, 0x61, 0x72, 0x62, 0x61, 0x79, 0x3b,
-0x41, 0x72, 0x61, 0x6d, 0x69, 0x73, 0x61, 0x79, 0x3b, 0x41, 0x72, 0x6a, 0x75, 0x6d, 0x61, 0x3b, 0x53, 0x69, 0x62, 0x69,
-0x74, 0x69, 0x44, 0x69, 0x6d, 0x3b, 0x54, 0x65, 0x6e, 0x3b, 0x54, 0x61, 0x6c, 0x3b, 0x41, 0x6c, 0x61, 0x3b, 0x41, 0x72,
-0x61, 0x3b, 0x41, 0x72, 0x6a, 0x3b, 0x53, 0x69, 0x62, 0x44, 0x3b, 0x54, 0x3b, 0x54, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x41,
-0x3b, 0x53, 0x64, 0x75, 0x6d, 0x69, 0x6e, 0x67, 0x75, 0x3b, 0x73, 0x69, 0x67, 0x75, 0x6e, 0x64, 0x61, 0x2d, 0x66, 0x65,
-0x72, 0x61, 0x3b, 0x74, 0x65, 0x72, 0x73, 0x61, 0x2d, 0x66, 0x65, 0x72, 0x61, 0x3b, 0x6b, 0x75, 0x61, 0x72, 0x74, 0x61,
-0x2d, 0x66, 0x65, 0x72, 0x61, 0x3b, 0x6b, 0x69, 0x6e, 0x74, 0x61, 0x2d, 0x66, 0x65, 0x72, 0x61, 0x3b, 0x73, 0x65, 0x73,
-0x74, 0x61, 0x2d, 0x66, 0x65, 0x72, 0x61, 0x3b, 0x73, 0xe1, 0x62, 0x61, 0x64, 0x75, 0x64, 0x75, 0x6d, 0x3b, 0x73, 0x69,
-0x67, 0x3b, 0x74, 0x65, 0x72, 0x3b, 0x6b, 0x75, 0x61, 0x3b, 0x6b, 0x69, 0x6e, 0x3b, 0x73, 0x65, 0x73, 0x3b, 0x73, 0x61,
-0x62, 0x44, 0x3b, 0x53, 0x3b, 0x54, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x53, 0x3b, 0x53, 0x41, 0x63, 0x65, 0x72, 0x3b, 0x41,
-0x72, 0x69, 0x6d, 0x3b, 0x41, 0x72, 0x61, 0x6d, 0x3b, 0x41, 0x68, 0x61, 0x64, 0x3b, 0x41, 0x6d, 0x68, 0x61, 0x64, 0x3b,
-0x53, 0x65, 0x6d, 0x3b, 0x53, 0x65, 0x64, 0x59, 0x61, 0x6e, 0x61, 0x73, 0x73, 0x3b, 0x53, 0x61, 0x6e, 0x61, 0x73, 0x73,
-0x3b, 0x4b, 0x72, 0x61, 0x1e0d, 0x61, 0x73, 0x73, 0x3b, 0x4b, 0x75, 0x1e93, 0x61, 0x73, 0x73, 0x3b, 0x53, 0x61, 0x6d, 0x61,
-0x73, 0x73, 0x3b, 0x53, 0x1e0d, 0x69, 0x73, 0x61, 0x73, 0x73, 0x3b, 0x53, 0x61, 0x79, 0x61, 0x73, 0x73, 0x59, 0x61, 0x6e,
-0x3b, 0x53, 0x61, 0x6e, 0x3b, 0x4b, 0x72, 0x61, 0x1e0d, 0x3b, 0x4b, 0x75, 0x1e93, 0x3b, 0x53, 0x61, 0x6d, 0x3b, 0x53, 0x1e0d,
-0x69, 0x73, 0x3b, 0x53, 0x61, 0x79, 0x59, 0x3b, 0x53, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x53, 0x43,
-0x3b, 0x52, 0x3b, 0x52, 0x3b, 0x48, 0x3b, 0x4d, 0x3b, 0x53, 0x3b, 0x53, 0x73, 0x254, 0x6e, 0x64, 0x69, 0x3b, 0x6c, 0x75,
-0x6e, 0x64, 0x69, 0x3b, 0x6d, 0x61, 0x72, 0x64, 0x69, 0x3b, 0x6d, 0x25b, 0x72, 0x6b, 0x25b, 0x72, 0x25b, 0x64, 0x69, 0x3b,
-0x79, 0x65, 0x64, 0x69, 0x3b, 0x76, 0x61, 0x14b, 0x64, 0x25b, 0x72, 0x25b, 0x64, 0x69, 0x3b, 0x6d, 0x254, 0x6e, 0x254, 0x20,
-0x73, 0x254, 0x6e, 0x64, 0x69, 0x73, 0x6f, 0x3b, 0x6c, 0x75, 0x3b, 0x6d, 0x61, 0x3b, 0x6d, 0x25b, 0x3b, 0x79, 0x65, 0x3b,
-0x76, 0x61, 0x3b, 0x6d, 0x73, 0x73, 0x61, 0x70, 0x61, 0x61, 0x74, 0x3b, 0x61, 0x74, 0x61, 0x61, 0x73, 0x69, 0x6e, 0x6e,
-0x67, 0x6f, 0x72, 0x6e, 0x65, 0x71, 0x3b, 0x6d, 0x61, 0x72, 0x6c, 0x75, 0x6e, 0x6e, 0x67, 0x6f, 0x72, 0x6e, 0x65, 0x71,
-0x3b, 0x70, 0x69, 0x6e, 0x67, 0x61, 0x73, 0x75, 0x6e, 0x6e, 0x67, 0x6f, 0x72, 0x6e, 0x65, 0x71, 0x3b, 0x73, 0x69, 0x73,
-0x61, 0x6d, 0x61, 0x6e, 0x6e, 0x67, 0x6f, 0x72, 0x6e, 0x65, 0x71, 0x3b, 0x74, 0x61, 0x6c, 0x6c, 0x69, 0x6d, 0x61, 0x6e,
-0x6e, 0x67, 0x6f, 0x72, 0x6e, 0x65, 0x71, 0x3b, 0x61, 0x72, 0x66, 0x69, 0x6e, 0x69, 0x6e, 0x6e, 0x67, 0x6f, 0x72, 0x6e,
-0x65, 0x71, 0x73, 0x61, 0x70, 0x3b, 0x61, 0x74, 0x61, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x70, 0x69, 0x6e, 0x3b, 0x73, 0x69,
-0x73, 0x3b, 0x74, 0x61, 0x6c, 0x3b, 0x61, 0x72, 0x66, 0x53, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x50, 0x3b, 0x53, 0x3b, 0x54,
-0x3b, 0x41, 0x4b, 0x6f, 0x74, 0x69, 0x73, 0x61, 0x70, 0x3b, 0x4b, 0x6f, 0x74, 0x61, 0x61, 0x69, 0x3b, 0x4b, 0x6f, 0x61,
-0x65, 0x6e, 0x67, 0x2019, 0x3b, 0x4b, 0x6f, 0x73, 0x6f, 0x6d, 0x6f, 0x6b, 0x3b, 0x4b, 0x6f, 0x61, 0x6e, 0x67, 0x2019, 0x77,
-0x61, 0x6e, 0x3b, 0x4b, 0x6f, 0x6d, 0x75, 0x75, 0x74, 0x3b, 0x4b, 0x6f, 0x6c, 0x6f, 0x4b, 0x74, 0x73, 0x3b, 0x4b, 0x6f,
-0x74, 0x3b, 0x4b, 0x6f, 0x6f, 0x3b, 0x4b, 0x6f, 0x73, 0x3b, 0x4b, 0x6f, 0x61, 0x3b, 0x4b, 0x6f, 0x6d, 0x3b, 0x4b, 0x6f,
-0x6c, 0x54, 0x3b, 0x54, 0x3b, 0x4f, 0x3b, 0x53, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x4c, 0x57, 0x61, 0x20, 0x6b, 0x79, 0x75,
-0x6d, 0x77, 0x61, 0x3b, 0x57, 0x61, 0x20, 0x6b, 0x77, 0x61, 0x6d, 0x62, 0x129, 0x6c, 0x129, 0x6c, 0x79, 0x61, 0x3b, 0x57,
-0x61, 0x20, 0x6b, 0x65, 0x6c, 0x129, 0x3b, 0x57, 0x61, 0x20, 0x6b, 0x61, 0x74, 0x61, 0x74, 0x169, 0x3b, 0x57, 0x61, 0x20,
-0x6b, 0x61, 0x6e, 0x61, 0x3b, 0x57, 0x61, 0x20, 0x6b, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x57, 0x61, 0x20, 0x74, 0x68,
-0x61, 0x6e, 0x74, 0x68, 0x61, 0x74, 0x169, 0x57, 0x6b, 0x79, 0x3b, 0x57, 0x6b, 0x77, 0x3b, 0x57, 0x6b, 0x6c, 0x3b, 0x57,
-0x74, 0x169, 0x3b, 0x57, 0x6b, 0x6e, 0x3b, 0x57, 0x74, 0x6e, 0x3b, 0x57, 0x74, 0x68, 0x59, 0x3b, 0x57, 0x3b, 0x45, 0x3b,
-0x41, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x41, 0xcad, 0xcbe, 0xca8, 0xcc1, 0xcb5, 0xcbe, 0xcb0, 0x3b, 0xcb8, 0xccb, 0xcae, 0xcb5, 0xcbe,
-0xcb0, 0x3b, 0xcae, 0xc82, 0xc97, 0xcb3, 0xcb5, 0xcbe, 0xcb0, 0x3b, 0xcac, 0xcc1, 0xca7, 0xcb5, 0xcbe, 0xcb0, 0x3b, 0xc97, 0xcc1, 0xcb0,
-0xcc1, 0xcb5, 0xcbe, 0xcb0, 0x3b, 0xcb6, 0xcc1, 0xc95, 0xccd, 0xcb0, 0xcb5, 0xcbe, 0xcb0, 0x3b, 0xcb6, 0xca8, 0xcbf, 0xcb5, 0xcbe, 0xcb0,
-0xcad, 0xcbe, 0xca8, 0xcc1, 0x3b, 0xcb8, 0xccb, 0xcae, 0x3b, 0xcae, 0xc82, 0xc97, 0xcb3, 0x3b, 0xcac, 0xcc1, 0xca7, 0x3b, 0xc97, 0xcc1,
-0xcb0, 0xcc1, 0x3b, 0xcb6, 0xcc1, 0xc95, 0xccd, 0xcb0, 0x3b, 0xcb6, 0xca8, 0xcbf, 0xcad, 0xcbe, 0x3b, 0xcb8, 0xccb, 0x3b, 0xcae, 0xc82,
-0x3b, 0xcac, 0xcc1, 0x3b, 0xc97, 0xcc1, 0x3b, 0xcb6, 0xcc1, 0x3b, 0xcb6, 0x627, 0x64e, 0x62a, 0x6be, 0x648, 0x627, 0x631, 0x3b, 0x698,
-0x654, 0x646, 0x62f, 0x631, 0x655, 0x631, 0x648, 0x627, 0x631, 0x3b, 0x628, 0x6c6, 0x645, 0x648, 0x627, 0x631, 0x3b, 0x628, 0x648, 0x62f,
-0x648, 0x627, 0x631, 0x3b, 0x628, 0x631, 0x620, 0x633, 0x648, 0x627, 0x631, 0x3b, 0x62c, 0x64f, 0x645, 0x6c1, 0x3b, 0x628, 0x679, 0x648,
-0x627, 0x631, 0x622, 0x62a, 0x6be, 0x648, 0x627, 0x631, 0x3b, 0x698, 0x654, 0x646, 0x62f, 0x655, 0x631, 0x648, 0x627, 0x631, 0x3b, 0x628,
-0x6c6, 0x645, 0x648, 0x627, 0x631, 0x3b, 0x628, 0x648, 0x62f, 0x648, 0x627, 0x631, 0x3b, 0x628, 0x631, 0x620, 0x633, 0x648, 0x627, 0x631,
-0x3b, 0x62c, 0x64f, 0x645, 0x6c1, 0x3b, 0x628, 0x679, 0x648, 0x627, 0x631, 0x627, 0x3b, 0x698, 0x3b, 0x628, 0x3b, 0x628, 0x3b, 0x628,
-0x3b, 0x62c, 0x3b, 0x628, 0x436, 0x435, 0x43a, 0x441, 0x435, 0x43d, 0x431, 0x456, 0x3b, 0x434, 0x4af, 0x439, 0x441, 0x435, 0x43d, 0x431,
-0x456, 0x3b, 0x441, 0x435, 0x439, 0x441, 0x435, 0x43d, 0x431, 0x456, 0x3b, 0x441, 0x4d9, 0x440, 0x441, 0x435, 0x43d, 0x431, 0x456, 0x3b,
-0x431, 0x435, 0x439, 0x441, 0x435, 0x43d, 0x431, 0x456, 0x3b, 0x436, 0x4b1, 0x43c, 0x430, 0x3b, 0x441, 0x435, 0x43d, 0x431, 0x456, 0x436,
-0x441, 0x3b, 0x434, 0x441, 0x3b, 0x441, 0x441, 0x3b, 0x441, 0x440, 0x3b, 0x431, 0x441, 0x3b, 0x436, 0x43c, 0x3b, 0x441, 0x431, 0x416,
-0x3b, 0x414, 0x3b, 0x421, 0x3b, 0x421, 0x3b, 0x411, 0x3b, 0x416, 0x3b, 0x421, 0x17a2, 0x17b6, 0x1791, 0x17b7, 0x178f, 0x17d2, 0x1799, 0x3b,
-0x1785, 0x1793, 0x17d2, 0x1791, 0x3b, 0x17a2, 0x1784, 0x17d2, 0x1782, 0x17b6, 0x179a, 0x3b, 0x1796, 0x17bb, 0x1792, 0x3b, 0x1796, 0x17d2, 0x179a, 0x17a0,
-0x179f, 0x17d2, 0x1794, 0x178f, 0x17b7, 0x17cd, 0x3b, 0x179f, 0x17bb, 0x1780, 0x17d2, 0x179a, 0x3b, 0x179f, 0x17c5, 0x179a, 0x17cd, 0x17a2, 0x17b6, 0x1791,
-0x17b7, 0x178f, 0x17d2, 0x1799, 0x3b, 0x1785, 0x17d0, 0x1793, 0x17d2, 0x1791, 0x3b, 0x17a2, 0x1784, 0x17d2, 0x1782, 0x17b6, 0x179a, 0x3b, 0x1796, 0x17bb,
-0x1792, 0x3b, 0x1796, 0x17d2, 0x179a, 0x17a0, 0x179f, 0x17d2, 0x1794, 0x178f, 0x17b7, 0x17cd, 0x3b, 0x179f, 0x17bb, 0x1780, 0x17d2, 0x179a, 0x3b, 0x179f,
-0x17c5, 0x179a, 0x17cd, 0x17a2, 0x17b6, 0x1791, 0x17b7, 0x178f, 0x17d2, 0x1799, 0x3b, 0x1785, 0x1793, 0x17d2, 0x1791, 0x3b, 0x17a2, 0x1784, 0x17d2, 0x1782,
-0x17b6, 0x179a, 0x3b, 0x1796, 0x17bb, 0x1792, 0x3b, 0x1796, 0x17d2, 0x179a, 0x17a0, 0x3b, 0x179f, 0x17bb, 0x1780, 0x17d2, 0x179a, 0x3b, 0x179f, 0x17c5,
-0x179a, 0x17cd, 0x17a2, 0x3b, 0x1785, 0x3b, 0x17a2, 0x3b, 0x1796, 0x3b, 0x1796, 0x3b, 0x179f, 0x3b, 0x179f, 0x4b, 0x69, 0x75, 0x6d, 0x69,
-0x61, 0x3b, 0x4e, 0x6a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x74, 0x169, 0x3b, 0x4e, 0x6a, 0x75, 0x6d, 0x61, 0x69, 0x6e, 0x65,
-0x3b, 0x4e, 0x6a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x6e, 0x61, 0x3b, 0x41, 0x72, 0x61, 0x6d, 0x69, 0x74, 0x68, 0x69, 0x3b,
-0x4e, 0x6a, 0x75, 0x6d, 0x61, 0x61, 0x3b, 0x4e, 0x6a, 0x75, 0x6d, 0x61, 0x6d, 0x6f, 0x74, 0x68, 0x69, 0x4b, 0x4d, 0x41,
-0x3b, 0x4e, 0x54, 0x54, 0x3b, 0x4e, 0x4d, 0x4e, 0x3b, 0x4e, 0x4d, 0x54, 0x3b, 0x41, 0x52, 0x54, 0x3b, 0x4e, 0x4d, 0x41,
-0x3b, 0x4e, 0x4d, 0x4d, 0x4b, 0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x41, 0x3b, 0x4e, 0x3b, 0x4e, 0x4b, 0x75, 0x20,
-0x63, 0x79, 0x75, 0x6d, 0x77, 0x65, 0x72, 0x75, 0x3b, 0x4b, 0x75, 0x77, 0x61, 0x20, 0x6d, 0x62, 0x65, 0x72, 0x65, 0x3b,
-0x4b, 0x75, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x62, 0x69, 0x72, 0x69, 0x3b, 0x4b, 0x75, 0x77, 0x61, 0x20, 0x67, 0x61, 0x74,
-0x61, 0x74, 0x75, 0x3b, 0x4b, 0x75, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x6e, 0x65, 0x3b, 0x4b, 0x75, 0x77, 0x61, 0x20, 0x67,
-0x61, 0x74, 0x61, 0x6e, 0x75, 0x3b, 0x4b, 0x75, 0x77, 0x61, 0x20, 0x67, 0x61, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x74, 0x75,
-0x63, 0x79, 0x75, 0x2e, 0x3b, 0x6d, 0x62, 0x65, 0x2e, 0x3b, 0x6b, 0x61, 0x62, 0x2e, 0x3b, 0x67, 0x74, 0x75, 0x2e, 0x3b,
-0x6b, 0x61, 0x6e, 0x2e, 0x3b, 0x67, 0x6e, 0x75, 0x2e, 0x3b, 0x67, 0x6e, 0x64, 0x2e, 0x906, 0x92f, 0x924, 0x93e, 0x930, 0x3b,
-0x938, 0x94b, 0x92e, 0x93e, 0x930, 0x3b, 0x92e, 0x902, 0x917, 0x933, 0x93e, 0x930, 0x3b, 0x92c, 0x941, 0x927, 0x935, 0x93e, 0x930, 0x3b,
-0x92c, 0x93f, 0x930, 0x947, 0x938, 0x94d, 0x924, 0x93e, 0x930, 0x3b, 0x936, 0x941, 0x915, 0x94d, 0x930, 0x93e, 0x930, 0x3b, 0x936, 0x947,
-0x928, 0x935, 0x93e, 0x930, 0x906, 0x3b, 0x938, 0x94b, 0x3b, 0x92e, 0x902, 0x3b, 0x92c, 0x941, 0x3b, 0x92c, 0x3b, 0x936, 0x941, 0x3b,
-0x936, 0x947, 0x906, 0x3b, 0x938, 0x94b, 0x3b, 0x92e, 0x902, 0x3b, 0x92c, 0x941, 0x3b, 0x92c, 0x93f, 0x3b, 0x936, 0x941, 0x3b, 0x936,
-0x947, 0xc77c, 0xc694, 0xc77c, 0x3b, 0xc6d4, 0xc694, 0xc77c, 0x3b, 0xd654, 0xc694, 0xc77c, 0x3b, 0xc218, 0xc694, 0xc77c, 0x3b, 0xbaa9, 0xc694, 0xc77c,
-0x3b, 0xae08, 0xc694, 0xc77c, 0x3b, 0xd1a0, 0xc694, 0xc77c, 0xc77c, 0x3b, 0xc6d4, 0x3b, 0xd654, 0x3b, 0xc218, 0x3b, 0xbaa9, 0x3b, 0xae08, 0x3b,
-0xd1a0, 0x41, 0x6c, 0x68, 0x61, 0x64, 0x69, 0x3b, 0x41, 0x74, 0x69, 0x6e, 0x6e, 0x69, 0x3b, 0x41, 0x74, 0x61, 0x6c, 0x61,
-0x61, 0x74, 0x61, 0x3b, 0x41, 0x6c, 0x61, 0x72, 0x62, 0x61, 0x3b, 0x41, 0x6c, 0x68, 0x61, 0x6d, 0x69, 0x69, 0x73, 0x61,
-0x3b, 0x41, 0x6c, 0x7a, 0x75, 0x6d, 0x61, 0x3b, 0x41, 0x73, 0x69, 0x62, 0x74, 0x69, 0x41, 0x6c, 0x68, 0x3b, 0x41, 0x74,
-0x69, 0x3b, 0x41, 0x74, 0x61, 0x3b, 0x41, 0x6c, 0x61, 0x3b, 0x41, 0x6c, 0x6d, 0x3b, 0x41, 0x6c, 0x7a, 0x3b, 0x41, 0x73,
-0x69, 0x48, 0x3b, 0x54, 0x3b, 0x54, 0x3b, 0x4c, 0x3b, 0x4c, 0x3b, 0x4c, 0x3b, 0x53, 0x41, 0x6c, 0x68, 0x61, 0x64, 0x69,
-0x3b, 0x41, 0x74, 0x69, 0x6e, 0x69, 0x3b, 0x41, 0x74, 0x61, 0x6c, 0x61, 0x74, 0x61, 0x3b, 0x41, 0x6c, 0x61, 0x72, 0x62,
-0x61, 0x3b, 0x41, 0x6c, 0x68, 0x61, 0x6d, 0x69, 0x69, 0x73, 0x61, 0x3b, 0x41, 0x6c, 0x6a, 0x75, 0x6d, 0x61, 0x3b, 0x41,
-0x73, 0x73, 0x61, 0x62, 0x64, 0x75, 0x41, 0x6c, 0x68, 0x3b, 0x41, 0x74, 0x69, 0x3b, 0x41, 0x74, 0x61, 0x3b, 0x41, 0x6c,
-0x61, 0x3b, 0x41, 0x6c, 0x6d, 0x3b, 0x41, 0x6c, 0x6a, 0x3b, 0x41, 0x73, 0x73, 0x79, 0x65, 0x6b, 0x15f, 0x65, 0x6d, 0x3b,
-0x64, 0x75, 0x15f, 0x65, 0x6d, 0x3b, 0x73, 0xea, 0x15f, 0x65, 0x6d, 0x3b, 0xe7, 0x61, 0x72, 0x15f, 0x65, 0x6d, 0x3b, 0x70,
-0xea, 0x6e, 0x63, 0x15f, 0x65, 0x6d, 0x3b, 0xee, 0x6e, 0x3b, 0x15f, 0x65, 0x6d, 0xee, 0x79, 0x15f, 0x3b, 0x64, 0x15f, 0x3b,
-0x73, 0x15f, 0x3b, 0xe7, 0x15f, 0x3b, 0x70, 0x15f, 0x3b, 0xee, 0x6e, 0x3b, 0x15f, 0x59, 0x3b, 0x44, 0x3b, 0x53, 0x3b, 0xc7,
-0x3b, 0x50, 0x3b, 0xce, 0x3b, 0x15e, 0x73, 0x254, 0x301, 0x6e, 0x64, 0x254, 0x3b, 0x6d, 0x254, 0x301, 0x6e, 0x64, 0x254, 0x3b,
-0x73, 0x254, 0x301, 0x6e, 0x64, 0x254, 0x20, 0x6d, 0x61, 0x66, 0xfa, 0x20, 0x6d, 0xe1, 0x62, 0x61, 0x3b, 0x73, 0x254, 0x301,
-0x6e, 0x64, 0x254, 0x20, 0x6d, 0x61, 0x66, 0xfa, 0x20, 0x6d, 0xe1, 0x6c, 0x61, 0x6c, 0x3b, 0x73, 0x254, 0x301, 0x6e, 0x64,
-0x254, 0x20, 0x6d, 0x61, 0x66, 0xfa, 0x20, 0x6d, 0xe1, 0x6e, 0x61, 0x3b, 0x6d, 0x61, 0x62, 0xe1, 0x67, 0xe1, 0x20, 0x6d,
-0xe1, 0x20, 0x73, 0x75, 0x6b, 0x75, 0x6c, 0x3b, 0x73, 0xe1, 0x73, 0x61, 0x64, 0x69, 0x73, 0x254, 0x301, 0x6e, 0x3b, 0x6d,
-0x254, 0x301, 0x6e, 0x3b, 0x73, 0x6d, 0x62, 0x3b, 0x73, 0x6d, 0x6c, 0x3b, 0x73, 0x6d, 0x6e, 0x3b, 0x6d, 0x62, 0x73, 0x3b,
-0x73, 0x61, 0x73, 0x73, 0x3b, 0x6d, 0x3b, 0x73, 0x3b, 0x73, 0x3b, 0x73, 0x3b, 0x6d, 0x3b, 0x73, 0x436, 0x435, 0x43a, 0x448,
-0x435, 0x43c, 0x431, 0x438, 0x3b, 0x434, 0x4af, 0x439, 0x448, 0x4e9, 0x43c, 0x431, 0x4af, 0x3b, 0x448, 0x435, 0x439, 0x448, 0x435, 0x43c,
-0x431, 0x438, 0x3b, 0x448, 0x430, 0x440, 0x448, 0x435, 0x43c, 0x431, 0x438, 0x3b, 0x431, 0x435, 0x439, 0x448, 0x435, 0x43c, 0x431, 0x438,
-0x3b, 0x436, 0x443, 0x43c, 0x430, 0x3b, 0x438, 0x448, 0x435, 0x43c, 0x431, 0x438, 0x436, 0x435, 0x43a, 0x2e, 0x3b, 0x434, 0x4af, 0x439,
-0x2e, 0x3b, 0x448, 0x435, 0x439, 0x448, 0x2e, 0x3b, 0x448, 0x430, 0x440, 0x448, 0x2e, 0x3b, 0x431, 0x435, 0x439, 0x448, 0x2e, 0x3b,
-0x436, 0x443, 0x43c, 0x430, 0x3b, 0x438, 0x448, 0x43c, 0x2e, 0x416, 0x3b, 0x414, 0x3b, 0x428, 0x3b, 0x428, 0x3b, 0x411, 0x3b, 0x416,
-0x3b, 0x418, 0x41, 0x14b, 0x70, 0xe9, 0x74, 0x75, 0x77, 0x61, 0x6b, 0x21f, 0x61, 0x14b, 0x3b, 0x41, 0x14b, 0x70, 0xe9, 0x74,
-0x75, 0x77, 0x61, 0x14b, 0x17e, 0x69, 0x3b, 0x41, 0x14b, 0x70, 0xe9, 0x74, 0x75, 0x6e, 0x75, 0x14b, 0x70, 0x61, 0x3b, 0x41,
-0x14b, 0x70, 0xe9, 0x74, 0x75, 0x79, 0x61, 0x6d, 0x6e, 0x69, 0x3b, 0x41, 0x14b, 0x70, 0xe9, 0x74, 0x75, 0x74, 0x6f, 0x70,
-0x61, 0x3b, 0x41, 0x14b, 0x70, 0xe9, 0x74, 0x75, 0x7a, 0x61, 0x70, 0x74, 0x61, 0x14b, 0x3b, 0x4f, 0x77, 0xe1, 0x14b, 0x67,
-0x79, 0x75, 0x17e, 0x61, 0x17e, 0x61, 0x70, 0x69, 0x41, 0x3b, 0x57, 0x3b, 0x4e, 0x3b, 0x59, 0x3b, 0x54, 0x3b, 0x5a, 0x3b,
-0x4f, 0x4a, 0x75, 0x6d, 0x61, 0x70, 0xed, 0x69, 0x72, 0x69, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74, 0xe1, 0x74, 0x75, 0x3b,
-0x4a, 0x75, 0x6d, 0x61, 0xed, 0x6e, 0x65, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74, 0xe1, 0x61, 0x6e, 0x6f, 0x3b, 0x41, 0x6c,
-0x61, 0x6d, 0xed, 0x69, 0x73, 0x69, 0x3b, 0x49, 0x6a, 0x75, 0x6d, 0xe1, 0x61, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x6d, 0xf3,
-0x6f, 0x73, 0x69, 0x50, 0xed, 0x69, 0x6c, 0x69, 0x3b, 0x54, 0xe1, 0x61, 0x74, 0x75, 0x3b, 0xcd, 0x6e, 0x65, 0x3b, 0x54,
-0xe1, 0x61, 0x6e, 0x6f, 0x3b, 0x41, 0x6c, 0x68, 0x3b, 0x49, 0x6a, 0x6d, 0x3b, 0x4d, 0xf3, 0x6f, 0x73, 0x69, 0x50, 0x3b,
-0x54, 0x3b, 0x45, 0x3b, 0x4f, 0x3b, 0x41, 0x3b, 0x49, 0x3b, 0x4d, 0xea7, 0xeb1, 0xe99, 0xead, 0xeb2, 0xe97, 0xeb4, 0xe94, 0x3b,
-0xea7, 0xeb1, 0xe99, 0xe88, 0xeb1, 0xe99, 0x3b, 0xea7, 0xeb1, 0xe99, 0xead, 0xeb1, 0xe87, 0xe84, 0xeb2, 0xe99, 0x3b, 0xea7, 0xeb1, 0xe99,
-0xe9e, 0xeb8, 0xe94, 0x3b, 0xea7, 0xeb1, 0xe99, 0xe9e, 0xeb0, 0xeab, 0xeb1, 0xe94, 0x3b, 0xea7, 0xeb1, 0xe99, 0xeaa, 0xeb8, 0xe81, 0x3b,
-0xea7, 0xeb1, 0xe99, 0xec0, 0xeaa, 0xebb, 0xeb2, 0xead, 0xeb2, 0xe97, 0xeb4, 0xe94, 0x3b, 0xe88, 0xeb1, 0xe99, 0x3b, 0xead, 0xeb1, 0xe87,
-0xe84, 0xeb2, 0xe99, 0x3b, 0xe9e, 0xeb8, 0xe94, 0x3b, 0xe9e, 0xeb0, 0xeab, 0xeb1, 0xe94, 0x3b, 0xeaa, 0xeb8, 0xe81, 0x3b, 0xec0, 0xeaa,
-0xebb, 0xeb2, 0xead, 0xeb2, 0x3b, 0xe88, 0x3b, 0xead, 0x3b, 0xe9e, 0x3b, 0xe9e, 0xeab, 0x3b, 0xeaa, 0xeb8, 0x3b, 0xeaa, 0x53, 0x76,
-0x113, 0x74, 0x64, 0x69, 0x65, 0x6e, 0x61, 0x3b, 0x50, 0x69, 0x72, 0x6d, 0x64, 0x69, 0x65, 0x6e, 0x61, 0x3b, 0x4f, 0x74,
-0x72, 0x64, 0x69, 0x65, 0x6e, 0x61, 0x3b, 0x54, 0x72, 0x65, 0x161, 0x64, 0x69, 0x65, 0x6e, 0x61, 0x3b, 0x43, 0x65, 0x74,
-0x75, 0x72, 0x74, 0x64, 0x69, 0x65, 0x6e, 0x61, 0x3b, 0x50, 0x69, 0x65, 0x6b, 0x74, 0x64, 0x69, 0x65, 0x6e, 0x61, 0x3b,
-0x53, 0x65, 0x73, 0x74, 0x64, 0x69, 0x65, 0x6e, 0x61, 0x73, 0x76, 0x113, 0x74, 0x64, 0x69, 0x65, 0x6e, 0x61, 0x3b, 0x70,
-0x69, 0x72, 0x6d, 0x64, 0x69, 0x65, 0x6e, 0x61, 0x3b, 0x6f, 0x74, 0x72, 0x64, 0x69, 0x65, 0x6e, 0x61, 0x3b, 0x74, 0x72,
-0x65, 0x161, 0x64, 0x69, 0x65, 0x6e, 0x61, 0x3b, 0x63, 0x65, 0x74, 0x75, 0x72, 0x74, 0x64, 0x69, 0x65, 0x6e, 0x61, 0x3b,
-0x70, 0x69, 0x65, 0x6b, 0x74, 0x64, 0x69, 0x65, 0x6e, 0x61, 0x3b, 0x73, 0x65, 0x73, 0x74, 0x64, 0x69, 0x65, 0x6e, 0x61,
-0x53, 0x76, 0x113, 0x74, 0x64, 0x2e, 0x3b, 0x50, 0x69, 0x72, 0x6d, 0x64, 0x2e, 0x3b, 0x4f, 0x74, 0x72, 0x64, 0x2e, 0x3b,
-0x54, 0x72, 0x65, 0x161, 0x64, 0x2e, 0x3b, 0x43, 0x65, 0x74, 0x75, 0x72, 0x74, 0x64, 0x2e, 0x3b, 0x50, 0x69, 0x65, 0x6b,
-0x74, 0x64, 0x2e, 0x3b, 0x53, 0x65, 0x73, 0x74, 0x64, 0x2e, 0x73, 0x76, 0x113, 0x74, 0x64, 0x2e, 0x3b, 0x70, 0x69, 0x72,
-0x6d, 0x64, 0x2e, 0x3b, 0x6f, 0x74, 0x72, 0x64, 0x2e, 0x3b, 0x74, 0x72, 0x65, 0x161, 0x64, 0x2e, 0x3b, 0x63, 0x65, 0x74,
-0x75, 0x72, 0x74, 0x64, 0x2e, 0x3b, 0x70, 0x69, 0x65, 0x6b, 0x74, 0x64, 0x2e, 0x3b, 0x73, 0x65, 0x73, 0x74, 0x64, 0x2e,
-0x53, 0x3b, 0x50, 0x3b, 0x4f, 0x3b, 0x54, 0x3b, 0x43, 0x3b, 0x50, 0x3b, 0x53, 0x65, 0x79, 0x65, 0x6e, 0x67, 0x61, 0x3b,
-0x6d, 0x6f, 0x6b, 0x254, 0x6c, 0x254, 0x20, 0x6d, 0x77, 0x61, 0x20, 0x79, 0x61, 0x6d, 0x62, 0x6f, 0x3b, 0x6d, 0x6f, 0x6b,
-0x254, 0x6c, 0x254, 0x20, 0x6d, 0x77, 0x61, 0x20, 0x6d, 0xed, 0x62, 0x61, 0x6c, 0xe9, 0x3b, 0x6d, 0x6f, 0x6b, 0x254, 0x6c,
-0x254, 0x20, 0x6d, 0x77, 0x61, 0x20, 0x6d, 0xed, 0x73, 0xe1, 0x74, 0x6f, 0x3b, 0x6d, 0x6f, 0x6b, 0x254, 0x6c, 0x254, 0x20,
-0x79, 0x61, 0x20, 0x6d, 0xed, 0x6e, 0xe9, 0x69, 0x3b, 0x6d, 0x6f, 0x6b, 0x254, 0x6c, 0x254, 0x20, 0x79, 0x61, 0x20, 0x6d,
-0xed, 0x74, 0xe1, 0x6e, 0x6f, 0x3b, 0x6d, 0x70, 0x254, 0x301, 0x73, 0x254, 0x65, 0x79, 0x65, 0x3b, 0x79, 0x62, 0x6f, 0x3b,
-0x6d, 0x62, 0x6c, 0x3b, 0x6d, 0x73, 0x74, 0x3b, 0x6d, 0x69, 0x6e, 0x3b, 0x6d, 0x74, 0x6e, 0x3b, 0x6d, 0x70, 0x73, 0x65,
-0x3b, 0x79, 0x3b, 0x6d, 0x3b, 0x6d, 0x3b, 0x6d, 0x3b, 0x6d, 0x3b, 0x70, 0x73, 0x65, 0x6b, 0x6d, 0x61, 0x64, 0x69, 0x65,
-0x6e, 0x69, 0x73, 0x3b, 0x70, 0x69, 0x72, 0x6d, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x69, 0x73, 0x3b, 0x61, 0x6e, 0x74, 0x72,
-0x61, 0x64, 0x69, 0x65, 0x6e, 0x69, 0x73, 0x3b, 0x74, 0x72, 0x65, 0x10d, 0x69, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x69, 0x73,
-0x3b, 0x6b, 0x65, 0x74, 0x76, 0x69, 0x72, 0x74, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x69, 0x73, 0x3b, 0x70, 0x65, 0x6e, 0x6b,
-0x74, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x69, 0x73, 0x3b, 0x161, 0x65, 0x161, 0x74, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x69, 0x73,
-0x73, 0x6b, 0x3b, 0x70, 0x72, 0x3b, 0x61, 0x6e, 0x3b, 0x74, 0x72, 0x3b, 0x6b, 0x74, 0x3b, 0x70, 0x6e, 0x3b, 0x161, 0x74,
-0x53, 0x3b, 0x50, 0x3b, 0x41, 0x3b, 0x54, 0x3b, 0x4b, 0x3b, 0x50, 0x3b, 0x160, 0x6e, 0x6a, 0x65, 0x17a, 0x65, 0x6c, 0x61,
-0x3b, 0x70, 0xf3, 0x6e, 0x6a, 0x65, 0x17a, 0x65, 0x6c, 0x65, 0x3b, 0x77, 0x61, 0x142, 0x74, 0x6f, 0x72, 0x61, 0x3b, 0x73,
-0x72, 0x6a, 0x6f, 0x64, 0x61, 0x3b, 0x73, 0x74, 0x77, 0xf3, 0x72, 0x74, 0x6b, 0x3b, 0x70, 0x11b, 0x74, 0x6b, 0x3b, 0x73,
-0x6f, 0x62, 0x6f, 0x74, 0x61, 0x6e, 0x6a, 0x65, 0x3b, 0x70, 0xf3, 0x6e, 0x3b, 0x77, 0x61, 0x142, 0x3b, 0x73, 0x72, 0x6a,
-0x3b, 0x73, 0x74, 0x77, 0x3b, 0x70, 0x11b, 0x74, 0x3b, 0x73, 0x6f, 0x62, 0x6e, 0x3b, 0x70, 0x3b, 0x77, 0x3b, 0x73, 0x3b,
-0x73, 0x3b, 0x70, 0x3b, 0x73, 0x53, 0xfc, 0x6e, 0x6e, 0x64, 0x61, 0x67, 0x3b, 0x4d, 0x61, 0x61, 0x6e, 0x64, 0x61, 0x67,
-0x3b, 0x44, 0x69, 0x6e, 0x67, 0x73, 0x64, 0x61, 0x67, 0x3b, 0x4d, 0x69, 0x64, 0x64, 0x65, 0x77, 0x65, 0x6b, 0x65, 0x6e,
-0x3b, 0x44, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x73, 0x64, 0x61, 0x67, 0x3b, 0x46, 0x72, 0x65, 0x65, 0x64, 0x61, 0x67, 0x3b,
-0x53, 0xfc, 0x6e, 0x6e, 0x61, 0x76, 0x65, 0x6e, 0x64, 0x53, 0xfc, 0x2e, 0x3b, 0x4d, 0x61, 0x2e, 0x3b, 0x44, 0x69, 0x2e,
-0x3b, 0x4d, 0x69, 0x2e, 0x3b, 0x44, 0x75, 0x2e, 0x3b, 0x46, 0x72, 0x2e, 0x3b, 0x53, 0x61, 0x2e, 0x4c, 0x75, 0x6d, 0x69,
-0x6e, 0x67, 0x75, 0x3b, 0x4e, 0x6b, 0x6f, 0x64, 0x79, 0x61, 0x3b, 0x4e, 0x64, 0xe0, 0x61, 0x79, 0xe0, 0x3b, 0x4e, 0x64,
-0x61, 0x6e, 0x67, 0xf9, 0x3b, 0x4e, 0x6a, 0xf2, 0x77, 0x61, 0x3b, 0x4e, 0x67, 0xf2, 0x76, 0x79, 0x61, 0x3b, 0x4c, 0x75,
-0x62, 0x69, 0x6e, 0x67, 0x75, 0x4c, 0x75, 0x6d, 0x3b, 0x4e, 0x6b, 0x6f, 0x3b, 0x4e, 0x64, 0x79, 0x3b, 0x4e, 0x64, 0x67,
-0x3b, 0x4e, 0x6a, 0x77, 0x3b, 0x4e, 0x67, 0x76, 0x3b, 0x4c, 0x75, 0x62, 0x4c, 0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x4e, 0x3b,
-0x4e, 0x3b, 0x4e, 0x3b, 0x4c, 0x4a, 0x75, 0x6d, 0x61, 0x70, 0x69, 0x6c, 0x3b, 0x57, 0x75, 0x6f, 0x6b, 0x20, 0x54, 0x69,
-0x63, 0x68, 0x3b, 0x54, 0x69, 0x63, 0x68, 0x20, 0x41, 0x72, 0x69, 0x79, 0x6f, 0x3b, 0x54, 0x69, 0x63, 0x68, 0x20, 0x41,
-0x64, 0x65, 0x6b, 0x3b, 0x54, 0x69, 0x63, 0x68, 0x20, 0x41, 0x6e, 0x67, 0x2019, 0x77, 0x65, 0x6e, 0x3b, 0x54, 0x69, 0x63,
-0x68, 0x20, 0x41, 0x62, 0x69, 0x63, 0x68, 0x3b, 0x4e, 0x67, 0x65, 0x73, 0x6f, 0x4a, 0x4d, 0x50, 0x3b, 0x57, 0x55, 0x54,
-0x3b, 0x54, 0x41, 0x52, 0x3b, 0x54, 0x41, 0x44, 0x3b, 0x54, 0x41, 0x4e, 0x3b, 0x54, 0x41, 0x42, 0x3b, 0x4e, 0x47, 0x53,
-0x4a, 0x3b, 0x57, 0x3b, 0x54, 0x3b, 0x54, 0x3b, 0x54, 0x3b, 0x54, 0x3b, 0x4e, 0x53, 0x6f, 0x6e, 0x6e, 0x64, 0x65, 0x67,
-0x3b, 0x4d, 0xe9, 0x69, 0x6e, 0x64, 0x65, 0x67, 0x3b, 0x44, 0xeb, 0x6e, 0x73, 0x63, 0x68, 0x64, 0x65, 0x67, 0x3b, 0x4d,
-0xeb, 0x74, 0x74, 0x77, 0x6f, 0x63, 0x68, 0x3b, 0x44, 0x6f, 0x6e, 0x6e, 0x65, 0x73, 0x63, 0x68, 0x64, 0x65, 0x67, 0x3b,
-0x46, 0x72, 0x65, 0x69, 0x64, 0x65, 0x67, 0x3b, 0x53, 0x61, 0x6d, 0x73, 0x63, 0x68, 0x64, 0x65, 0x67, 0x53, 0x6f, 0x6e,
-0x3b, 0x4d, 0xe9, 0x69, 0x3b, 0x44, 0xeb, 0x6e, 0x3b, 0x4d, 0xeb, 0x74, 0x3b, 0x44, 0x6f, 0x6e, 0x3b, 0x46, 0x72, 0x65,
-0x3b, 0x53, 0x61, 0x6d, 0x53, 0x6f, 0x6e, 0x2e, 0x3b, 0x4d, 0xe9, 0x69, 0x2e, 0x3b, 0x44, 0xeb, 0x6e, 0x2e, 0x3b, 0x4d,
-0xeb, 0x74, 0x2e, 0x3b, 0x44, 0x6f, 0x6e, 0x2e, 0x3b, 0x46, 0x72, 0x65, 0x2e, 0x3b, 0x53, 0x61, 0x6d, 0x2e, 0x4a, 0x75,
-0x6d, 0x61, 0x70, 0x69, 0x72, 0x69, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x4a, 0x75, 0x6d, 0x61,
-0x6e, 0x6e, 0x65, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x4d, 0x75, 0x72, 0x77, 0x61, 0x20, 0x77,
-0x61, 0x20, 0x4b, 0x61, 0x6e, 0x6e, 0x65, 0x3b, 0x4d, 0x75, 0x72, 0x77, 0x61, 0x20, 0x77, 0x61, 0x20, 0x4b, 0x61, 0x74,
-0x61, 0x6e, 0x6f, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x6d, 0x6f, 0x73, 0x69, 0x4a, 0x32, 0x3b, 0x4a, 0x33, 0x3b, 0x4a, 0x34,
-0x3b, 0x4a, 0x35, 0x3b, 0x41, 0x6c, 0x3b, 0x49, 0x6a, 0x3b, 0x4a, 0x31, 0x43d, 0x435, 0x434, 0x435, 0x43b, 0x430, 0x3b, 0x43f,
-0x43e, 0x43d, 0x435, 0x434, 0x435, 0x43b, 0x43d, 0x438, 0x43a, 0x3b, 0x432, 0x442, 0x43e, 0x440, 0x43d, 0x438, 0x43a, 0x3b, 0x441, 0x440,
-0x435, 0x434, 0x430, 0x3b, 0x447, 0x435, 0x442, 0x432, 0x440, 0x442, 0x43e, 0x43a, 0x3b, 0x43f, 0x435, 0x442, 0x43e, 0x43a, 0x3b, 0x441,
-0x430, 0x431, 0x43e, 0x442, 0x430, 0x43d, 0x435, 0x434, 0x2e, 0x3b, 0x43f, 0x43e, 0x43d, 0x2e, 0x3b, 0x432, 0x442, 0x43e, 0x2e, 0x3b,
-0x441, 0x440, 0x435, 0x2e, 0x3b, 0x447, 0x435, 0x442, 0x2e, 0x3b, 0x43f, 0x435, 0x442, 0x2e, 0x3b, 0x441, 0x430, 0x431, 0x2e, 0x4a,
-0x75, 0x6d, 0x61, 0x70, 0x69, 0x6c, 0x79, 0x69, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x74, 0x75, 0x75, 0x3b, 0x4a,
-0x75, 0x6d, 0x61, 0x6e, 0x6e, 0x65, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x6e, 0x75, 0x3b, 0x41, 0x6c, 0x68, 0x61,
-0x6d, 0x69, 0x73, 0x69, 0x3b, 0x49, 0x6a, 0x75, 0x6d, 0x61, 0x61, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x6d, 0x6f, 0x73, 0x69,
-0x4a, 0x70, 0x69, 0x3b, 0x4a, 0x74, 0x74, 0x3b, 0x4a, 0x6e, 0x6e, 0x3b, 0x4a, 0x74, 0x6e, 0x3b, 0x41, 0x6c, 0x68, 0x3b,
-0x49, 0x6a, 0x75, 0x3b, 0x4a, 0x6d, 0x6f, 0x930, 0x935, 0x93f, 0x20, 0x926, 0x93f, 0x928, 0x3b, 0x938, 0x94b, 0x92e, 0x20, 0x926,
-0x93f, 0x928, 0x3b, 0x92e, 0x902, 0x917, 0x932, 0x20, 0x926, 0x93f, 0x928, 0x3b, 0x92c, 0x941, 0x927, 0x20, 0x926, 0x93f, 0x928, 0x3b,
-0x92c, 0x943, 0x939, 0x938, 0x94d, 0x92a, 0x924, 0x93f, 0x20, 0x926, 0x93f, 0x928, 0x3b, 0x936, 0x941, 0x915, 0x94d, 0x930, 0x20, 0x926,
-0x93f, 0x928, 0x3b, 0x936, 0x928, 0x93f, 0x20, 0x926, 0x93f, 0x928, 0x53, 0x61, 0x62, 0x61, 0x74, 0x6f, 0x3b, 0x4a, 0x75, 0x6d,
-0x61, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x6e, 0x6e, 0x65, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74, 0x61,
-0x6e, 0x6f, 0x3b, 0x41, 0x72, 0x61, 0x68, 0x61, 0x6d, 0x69, 0x73, 0x69, 0x3b, 0x49, 0x6a, 0x75, 0x6d, 0x61, 0x61, 0x3b,
-0x4a, 0x75, 0x6d, 0x61, 0x6d, 0x6f, 0x73, 0x69, 0x53, 0x61, 0x62, 0x3b, 0x4a, 0x74, 0x74, 0x3b, 0x4a, 0x6e, 0x6e, 0x3b,
-0x4a, 0x74, 0x6e, 0x3b, 0x41, 0x72, 0x61, 0x3b, 0x49, 0x6a, 0x75, 0x3b, 0x4a, 0x6d, 0x6f, 0x53, 0x3b, 0x4a, 0x3b, 0x4a,
-0x3b, 0x4a, 0x3b, 0x41, 0x3b, 0x49, 0x3b, 0x4a, 0x4c, 0x69, 0x64, 0x75, 0x76, 0x61, 0x20, 0x6c, 0x79, 0x61, 0x70, 0x69,
-0x6c, 0x69, 0x3b, 0x4c, 0x69, 0x64, 0x75, 0x76, 0x61, 0x20, 0x6c, 0x79, 0x61, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x4c, 0x69,
-0x64, 0x75, 0x76, 0x61, 0x20, 0x6c, 0x79, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x63, 0x68, 0x69, 0x3b, 0x4c, 0x69, 0x64, 0x75,
-0x76, 0x61, 0x20, 0x6c, 0x79, 0x61, 0x6e, 0x6e, 0x79, 0x61, 0x6e, 0x6f, 0x3b, 0x4c, 0x69, 0x64, 0x75, 0x76, 0x61, 0x20,
-0x6c, 0x79, 0x61, 0x6e, 0x6e, 0x79, 0x61, 0x6e, 0x6f, 0x20, 0x6e, 0x61, 0x20, 0x6c, 0x69, 0x6e, 0x6a, 0x69, 0x3b, 0x4c,
-0x69, 0x64, 0x75, 0x76, 0x61, 0x20, 0x6c, 0x79, 0x61, 0x6e, 0x6e, 0x79, 0x61, 0x6e, 0x6f, 0x20, 0x6e, 0x61, 0x20, 0x6d,
-0x61, 0x76, 0x69, 0x6c, 0x69, 0x3b, 0x4c, 0x69, 0x64, 0x75, 0x76, 0x61, 0x20, 0x6c, 0x69, 0x74, 0x61, 0x6e, 0x64, 0x69,
-0x4c, 0x6c, 0x32, 0x3b, 0x4c, 0x6c, 0x33, 0x3b, 0x4c, 0x6c, 0x34, 0x3b, 0x4c, 0x6c, 0x35, 0x3b, 0x4c, 0x6c, 0x36, 0x3b,
-0x4c, 0x6c, 0x37, 0x3b, 0x4c, 0x6c, 0x31, 0x32, 0x3b, 0x33, 0x3b, 0x34, 0x3b, 0x35, 0x3b, 0x36, 0x3b, 0x37, 0x3b, 0x31,
-0x41, 0x6c, 0x61, 0x68, 0x61, 0x64, 0x79, 0x3b, 0x41, 0x6c, 0x61, 0x74, 0x73, 0x69, 0x6e, 0x61, 0x69, 0x6e, 0x79, 0x3b,
-0x54, 0x61, 0x6c, 0x61, 0x74, 0x61, 0x3b, 0x41, 0x6c, 0x61, 0x72, 0x6f, 0x62, 0x69, 0x61, 0x3b, 0x41, 0x6c, 0x61, 0x6b,
-0x61, 0x6d, 0x69, 0x73, 0x79, 0x3b, 0x5a, 0x6f, 0x6d, 0x61, 0x3b, 0x41, 0x73, 0x61, 0x62, 0x6f, 0x74, 0x73, 0x79, 0x41,
-0x6c, 0x61, 0x68, 0x3b, 0x41, 0x6c, 0x61, 0x74, 0x73, 0x3b, 0x54, 0x61, 0x6c, 0x3b, 0x41, 0x6c, 0x61, 0x72, 0x3b, 0x41,
-0x6c, 0x61, 0x6b, 0x3b, 0x5a, 0x6f, 0x6d, 0x3b, 0x41, 0x73, 0x61, 0x62, 0x41, 0x3b, 0x41, 0x3b, 0x54, 0x3b, 0x41, 0x3b,
-0x41, 0x3b, 0x5a, 0x3b, 0x41, 0xd1e, 0xd3e, 0xd2f, 0xd31, 0xd3e, 0xd34, 0xd4d, 0x200c, 0xd1a, 0x3b, 0xd24, 0xd3f, 0xd19, 0xd4d, 0xd15,
-0xd33, 0xd3e, 0xd34, 0xd4d, 0x200c, 0xd1a, 0x3b, 0xd1a, 0xd4a, 0xd35, 0xd4d, 0xd35, 0xd3e, 0xd34, 0xd4d, 0x200c, 0xd1a, 0x3b, 0xd2c, 0xd41,
-0xd27, 0xd28, 0xd3e, 0xd34, 0xd4d, 0x200c, 0xd1a, 0x3b, 0xd35, 0xd4d, 0xd2f, 0xd3e, 0xd34, 0xd3e, 0xd34, 0xd4d, 0x200c, 0xd1a, 0x3b, 0xd35,
-0xd46, 0xd33, 0xd4d, 0xd33, 0xd3f, 0xd2f, 0xd3e, 0xd34, 0xd4d, 0x200c, 0xd1a, 0x3b, 0xd36, 0xd28, 0xd3f, 0xd2f, 0xd3e, 0xd34, 0xd4d, 0x200c,
-0xd1a, 0xd1e, 0xd3e, 0xd2f, 0xd31, 0xd3e, 0xd34, 0xd4d, 0x200c, 0xd1a, 0x3b, 0xd24, 0xd3f, 0xd19, 0xd4d, 0xd15, 0xd33, 0xd3e, 0xd34, 0xd4d,
-0x200c, 0xd1a, 0x3b, 0xd1a, 0xd4a, 0xd35, 0xd4d, 0xd35, 0xd3e, 0xd34, 0xd4d, 0xd1a, 0x3b, 0xd2c, 0xd41, 0xd27, 0xd28, 0xd3e, 0xd34, 0xd4d,
-0x200c, 0xd1a, 0x3b, 0xd35, 0xd4d, 0xd2f, 0xd3e, 0xd34, 0xd3e, 0xd34, 0xd4d, 0x200c, 0xd1a, 0x3b, 0xd35, 0xd46, 0xd33, 0xd4d, 0xd33, 0xd3f,
-0xd2f, 0xd3e, 0xd34, 0xd4d, 0x200c, 0xd1a, 0x3b, 0xd36, 0xd28, 0xd3f, 0xd2f, 0xd3e, 0xd34, 0xd4d, 0x200c, 0xd1a, 0xd1e, 0xd3e, 0xd2f, 0xd7c,
-0x3b, 0xd24, 0xd3f, 0xd19, 0xd4d, 0xd15, 0xd7e, 0x3b, 0xd1a, 0xd4a, 0xd35, 0xd4d, 0xd35, 0x3b, 0xd2c, 0xd41, 0xd27, 0xd7b, 0x3b, 0xd35,
-0xd4d, 0xd2f, 0xd3e, 0xd34, 0xd02, 0x3b, 0xd35, 0xd46, 0xd33, 0xd4d, 0xd33, 0xd3f, 0x3b, 0xd36, 0xd28, 0xd3f, 0xd1e, 0xd3e, 0x3b, 0xd24,
-0xd3f, 0x3b, 0xd1a, 0xd4a, 0x3b, 0xd2c, 0xd41, 0x3b, 0xd35, 0xd4d, 0xd2f, 0xd3e, 0x3b, 0xd35, 0xd46, 0x3b, 0xd36, 0xd1e, 0x3b, 0xd24,
-0xd3f, 0x3b, 0xd1a, 0xd4a, 0x3b, 0xd2c, 0xd41, 0x3b, 0xd35, 0xd4d, 0xd2f, 0xd3e, 0x3b, 0xd35, 0xd46, 0x3b, 0xd36, 0x41, 0x68, 0x61,
-0x64, 0x3b, 0x49, 0x73, 0x6e, 0x69, 0x6e, 0x3b, 0x53, 0x65, 0x6c, 0x61, 0x73, 0x61, 0x3b, 0x52, 0x61, 0x62, 0x75, 0x3b,
-0x4b, 0x68, 0x61, 0x6d, 0x69, 0x73, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x61, 0x74, 0x3b, 0x53, 0x61, 0x62, 0x74, 0x75, 0x41,
-0x68, 0x64, 0x3b, 0x49, 0x73, 0x6e, 0x3b, 0x53, 0x65, 0x6c, 0x3b, 0x52, 0x61, 0x62, 0x3b, 0x4b, 0x68, 0x61, 0x3b, 0x4a,
-0x75, 0x6d, 0x3b, 0x53, 0x61, 0x62, 0x41, 0x3b, 0x49, 0x3b, 0x53, 0x3b, 0x52, 0x3b, 0x4b, 0x3b, 0x4a, 0x3b, 0x53, 0x49,
-0x6c, 0x2d, 0x126, 0x61, 0x64, 0x64, 0x3b, 0x49, 0x74, 0x2d, 0x54, 0x6e, 0x65, 0x6a, 0x6e, 0x3b, 0x49, 0x74, 0x2d, 0x54,
-0x6c, 0x69, 0x65, 0x74, 0x61, 0x3b, 0x4c, 0x2d, 0x45, 0x72, 0x62, 0x67, 0x127, 0x61, 0x3b, 0x49, 0x6c, 0x2d, 0x126, 0x61,
-0x6d, 0x69, 0x73, 0x3b, 0x49, 0x6c, 0x2d, 0x120, 0x69, 0x6d, 0x67, 0x127, 0x61, 0x3b, 0x49, 0x73, 0x2d, 0x53, 0x69, 0x62,
-0x74, 0x126, 0x61, 0x64, 0x3b, 0x54, 0x6e, 0x65, 0x3b, 0x54, 0x6c, 0x69, 0x3b, 0x45, 0x72, 0x62, 0x3b, 0x126, 0x61, 0x6d,
-0x3b, 0x120, 0x69, 0x6d, 0x3b, 0x53, 0x69, 0x62, 0x126, 0x64, 0x3b, 0x54, 0x6e, 0x3b, 0x54, 0x6c, 0x3b, 0x45, 0x72, 0x3b,
-0x126, 0x6d, 0x3b, 0x120, 0x6d, 0x3b, 0x53, 0x62, 0x126, 0x64, 0x3b, 0x54, 0x3b, 0x54, 0x6c, 0x3b, 0x45, 0x72, 0x3b, 0x126,
-0x6d, 0x3b, 0x120, 0x6d, 0x3b, 0x53, 0x62, 0x9a8, 0x9cb, 0x982, 0x9ae, 0x9be, 0x987, 0x99c, 0x9bf, 0x982, 0x3b, 0x9a8, 0x9bf, 0x982,
-0x9a5, 0x9cc, 0x995, 0x9be, 0x9ac, 0x9be, 0x3b, 0x9b2, 0x9c8, 0x9ac, 0x9be, 0x995, 0x9aa, 0x9cb, 0x995, 0x9aa, 0x9be, 0x3b, 0x9af, 0x9bc,
-0x9c1, 0x9ae, 0x9b6, 0x995, 0x9c8, 0x9b6, 0x9be, 0x3b, 0x9b6, 0x997, 0x9cb, 0x9b2, 0x9b6, 0x9c7, 0x9a8, 0x3b, 0x987, 0x9b0, 0x9be, 0x987,
-0x3b, 0x9a5, 0x9be, 0x982, 0x99c, 0x9a8, 0x9cb, 0x3b, 0x9a8, 0x9bf, 0x982, 0x3b, 0x9b2, 0x9c8, 0x3b, 0x9af, 0x9bc, 0x9c1, 0x9ae, 0x3b,
-0x9b6, 0x997, 0x3b, 0x987, 0x9b0, 0x9be, 0x3b, 0x9a5, 0x9be, 0x982, 0x9a8, 0x9cb, 0x982, 0x3b, 0x9a8, 0x9bf, 0x982, 0x3b, 0x9b2, 0x9c8,
-0x9ac, 0x9be, 0x3b, 0x9af, 0x9bc, 0x9c1, 0x9ae, 0x3b, 0x9b6, 0x997, 0x9cb, 0x3b, 0x987, 0x9b0, 0x9be, 0x3b, 0x9a5, 0x9be, 0x982, 0x4a,
-0x65, 0x64, 0x6f, 0x6f, 0x6e, 0x65, 0x65, 0x3b, 0x4a, 0x65, 0x6c, 0x68, 0x65, 0x69, 0x6e, 0x3b, 0x4a, 0x65, 0x6d, 0x61,
-0x79, 0x72, 0x74, 0x3b, 0x4a, 0x65, 0x72, 0x63, 0x65, 0x61, 0x6e, 0x3b, 0x4a, 0x65, 0x72, 0x64, 0x65, 0x69, 0x6e, 0x3b,
-0x4a, 0x65, 0x68, 0x65, 0x69, 0x6e, 0x65, 0x79, 0x3b, 0x4a, 0x65, 0x73, 0x61, 0x72, 0x6e, 0x4a, 0x65, 0x64, 0x3b, 0x4a,
-0x65, 0x6c, 0x3b, 0x4a, 0x65, 0x6d, 0x3b, 0x4a, 0x65, 0x72, 0x63, 0x3b, 0x4a, 0x65, 0x72, 0x64, 0x3b, 0x4a, 0x65, 0x68,
-0x3b, 0x4a, 0x65, 0x73, 0x52, 0x101, 0x74, 0x61, 0x70, 0x75, 0x3b, 0x52, 0x101, 0x68, 0x69, 0x6e, 0x61, 0x3b, 0x52, 0x101,
-0x74, 0x16b, 0x3b, 0x52, 0x101, 0x61, 0x70, 0x61, 0x3b, 0x52, 0x101, 0x70, 0x61, 0x72, 0x65, 0x3b, 0x52, 0x101, 0x6d, 0x65,
-0x72, 0x65, 0x3b, 0x52, 0x101, 0x68, 0x6f, 0x72, 0x6f, 0x69, 0x54, 0x61, 0x70, 0x3b, 0x48, 0x69, 0x6e, 0x3b, 0x54, 0x16b,
-0x3b, 0x41, 0x70, 0x61, 0x3b, 0x50, 0x61, 0x72, 0x3b, 0x4d, 0x65, 0x72, 0x3b, 0x48, 0x6f, 0x72, 0x54, 0x3b, 0x48, 0x3b,
-0x54, 0x3b, 0x41, 0x3b, 0x50, 0x3b, 0x4d, 0x3b, 0x48, 0x930, 0x935, 0x93f, 0x935, 0x93e, 0x930, 0x3b, 0x938, 0x94b, 0x92e, 0x935,
-0x93e, 0x930, 0x3b, 0x92e, 0x902, 0x917, 0x933, 0x935, 0x93e, 0x930, 0x3b, 0x92c, 0x941, 0x927, 0x935, 0x93e, 0x930, 0x3b, 0x917, 0x941,
-0x930, 0x941, 0x935, 0x93e, 0x930, 0x3b, 0x936, 0x941, 0x915, 0x94d, 0x930, 0x935, 0x93e, 0x930, 0x3b, 0x936, 0x928, 0x93f, 0x935, 0x93e,
-0x930, 0x930, 0x935, 0x93f, 0x3b, 0x938, 0x94b, 0x92e, 0x3b, 0x92e, 0x902, 0x917, 0x933, 0x3b, 0x92c, 0x941, 0x927, 0x3b, 0x917, 0x941,
-0x930, 0x941, 0x3b, 0x936, 0x941, 0x915, 0x94d, 0x930, 0x3b, 0x936, 0x928, 0x93f, 0x4a, 0x75, 0x6d, 0x61, 0x70, 0xed, 0x6c, 0xed,
-0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74, 0xe1, 0x74, 0x75, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x6e, 0x65, 0x3b, 0x4a, 0x75, 0x6d,
-0x61, 0x74, 0xe1, 0x6e, 0x254, 0x3b, 0x41, 0x6c, 0x61, 0xe1, 0x6d, 0x69, 0x73, 0x69, 0x3b, 0x4a, 0x75, 0x6d, 0xe1, 0x61,
-0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x6d, 0xf3, 0x73, 0x69, 0x4b, 0x69, 0x75, 0x6d, 0x69, 0x61, 0x3b, 0x4d, 0x75, 0x72, 0x61,
-0x6d, 0x75, 0x6b, 0x6f, 0x3b, 0x57, 0x61, 0x69, 0x72, 0x69, 0x3b, 0x57, 0x65, 0x74, 0x68, 0x61, 0x74, 0x75, 0x3b, 0x57,
-0x65, 0x6e, 0x61, 0x3b, 0x57, 0x65, 0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x6d, 0x6f, 0x73, 0x69, 0x4b,
-0x49, 0x55, 0x3b, 0x4d, 0x52, 0x41, 0x3b, 0x57, 0x41, 0x49, 0x3b, 0x57, 0x45, 0x54, 0x3b, 0x57, 0x45, 0x4e, 0x3b, 0x57,
-0x54, 0x4e, 0x3b, 0x4a, 0x55, 0x4d, 0x4b, 0x3b, 0x4d, 0x3b, 0x57, 0x3b, 0x57, 0x3b, 0x57, 0x3b, 0x57, 0x3b, 0x4a, 0x41,
-0x6e, 0x65, 0x67, 0x20, 0x31, 0x3b, 0x41, 0x6e, 0x65, 0x67, 0x20, 0x32, 0x3b, 0x41, 0x6e, 0x65, 0x67, 0x20, 0x33, 0x3b,
-0x41, 0x6e, 0x65, 0x67, 0x20, 0x34, 0x3b, 0x41, 0x6e, 0x65, 0x67, 0x20, 0x35, 0x3b, 0x41, 0x6e, 0x65, 0x67, 0x20, 0x36,
-0x3b, 0x41, 0x6e, 0x65, 0x67, 0x20, 0x37, 0x41, 0x31, 0x3b, 0x41, 0x32, 0x3b, 0x41, 0x33, 0x3b, 0x41, 0x34, 0x3b, 0x41,
-0x35, 0x3b, 0x41, 0x36, 0x3b, 0x41, 0x37, 0x41d, 0x44f, 0x43c, 0x3b, 0x414, 0x430, 0x432, 0x430, 0x430, 0x3b, 0x41c, 0x44f, 0x433,
-0x43c, 0x430, 0x440, 0x3b, 0x41b, 0x445, 0x430, 0x433, 0x432, 0x430, 0x3b, 0x41f, 0x4af, 0x440, 0x44d, 0x432, 0x3b, 0x411, 0x430, 0x430,
-0x441, 0x430, 0x43d, 0x3b, 0x411, 0x44f, 0x43c, 0x431, 0x430, 0x43d, 0x44f, 0x43c, 0x3b, 0x434, 0x430, 0x432, 0x430, 0x430, 0x3b, 0x43c,
-0x44f, 0x433, 0x43c, 0x430, 0x440, 0x3b, 0x43b, 0x445, 0x430, 0x433, 0x432, 0x430, 0x3b, 0x43f, 0x4af, 0x440, 0x44d, 0x432, 0x3b, 0x431,
-0x430, 0x430, 0x441, 0x430, 0x43d, 0x3b, 0x431, 0x44f, 0x43c, 0x431, 0x430, 0x41d, 0x44f, 0x3b, 0x414, 0x430, 0x3b, 0x41c, 0x44f, 0x3b,
-0x41b, 0x445, 0x3b, 0x41f, 0x4af, 0x3b, 0x411, 0x430, 0x3b, 0x411, 0x44f, 0x64, 0x69, 0x6d, 0x61, 0x6e, 0x73, 0x3b, 0x6c, 0x69,
-0x6e, 0x64, 0x69, 0x3b, 0x6d, 0x61, 0x72, 0x64, 0x69, 0x3b, 0x6d, 0x65, 0x72, 0x6b, 0x72, 0x65, 0x64, 0x69, 0x3b, 0x7a,
-0x65, 0x64, 0x69, 0x3b, 0x76, 0x61, 0x6e, 0x64, 0x72, 0x65, 0x64, 0x69, 0x3b, 0x73, 0x61, 0x6d, 0x64, 0x69, 0x64, 0x69,
-0x6d, 0x3b, 0x6c, 0x69, 0x6e, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x6d, 0x65, 0x72, 0x3b, 0x7a, 0x65, 0x3b, 0x76, 0x61, 0x6e,
-0x3b, 0x73, 0x61, 0x6d, 0x64, 0x3b, 0x6c, 0x3b, 0x6d, 0x3b, 0x6d, 0x3b, 0x7a, 0x3b, 0x76, 0x3b, 0x73, 0x43, 0x6f, 0x6d,
-0x2019, 0x79, 0x61, 0x6b, 0x6b, 0x65, 0x3b, 0x43, 0x6f, 0x6d, 0x6c, 0x61, 0x61, 0x257, 0x69, 0x69, 0x3b, 0x43, 0x6f, 0x6d,
-0x7a, 0x79, 0x69, 0x69, 0x257, 0x69, 0x69, 0x3b, 0x43, 0x6f, 0x6d, 0x6b, 0x6f, 0x6c, 0x6c, 0x65, 0x3b, 0x43, 0x6f, 0x6d,
-0x6b, 0x61, 0x6c, 0x64, 0x1dd, 0x253, 0x6c, 0x69, 0x69, 0x3b, 0x43, 0x6f, 0x6d, 0x67, 0x61, 0x69, 0x73, 0x75, 0x75, 0x3b,
-0x43, 0x6f, 0x6d, 0x7a, 0x79, 0x65, 0x253, 0x73, 0x75, 0x75, 0x43, 0x79, 0x61, 0x3b, 0x43, 0x6c, 0x61, 0x3b, 0x43, 0x7a,
-0x69, 0x3b, 0x43, 0x6b, 0x6f, 0x3b, 0x43, 0x6b, 0x61, 0x3b, 0x43, 0x67, 0x61, 0x3b, 0x43, 0x7a, 0x65, 0x59, 0x3b, 0x4c,
-0x3b, 0x5a, 0x3b, 0x4f, 0x3b, 0x41, 0x3b, 0x47, 0x3b, 0x45, 0x53, 0x6f, 0x6e, 0x74, 0x61, 0x78, 0x74, 0x73, 0x65, 0x65,
-0x73, 0x3b, 0x4d, 0x61, 0x6e, 0x74, 0x61, 0x78, 0x74, 0x73, 0x65, 0x65, 0x73, 0x3b, 0x44, 0x65, 0x6e, 0x73, 0x74, 0x61,
-0x78, 0x74, 0x73, 0x65, 0x65, 0x73, 0x3b, 0x57, 0x75, 0x6e, 0x73, 0x74, 0x61, 0x78, 0x74, 0x73, 0x65, 0x65, 0x73, 0x3b,
-0x44, 0x6f, 0x6e, 0x64, 0x65, 0x72, 0x74, 0x61, 0x78, 0x74, 0x73, 0x65, 0x65, 0x73, 0x3b, 0x46, 0x72, 0x61, 0x69, 0x74,
-0x61, 0x78, 0x74, 0x73, 0x65, 0x65, 0x73, 0x3b, 0x53, 0x61, 0x74, 0x65, 0x72, 0x74, 0x61, 0x78, 0x74, 0x73, 0x65, 0x65,
-0x73, 0x53, 0x6f, 0x6e, 0x3b, 0x4d, 0x61, 0x3b, 0x44, 0x65, 0x3b, 0x57, 0x75, 0x3b, 0x44, 0x6f, 0x3b, 0x46, 0x72, 0x3b,
-0x53, 0x61, 0x74, 0x53, 0x3b, 0x4d, 0x3b, 0x45, 0x3b, 0x57, 0x3b, 0x44, 0x3b, 0x46, 0x3b, 0x41, 0x906, 0x907, 0x924, 0x92c,
-0x93e, 0x930, 0x3b, 0x938, 0x94b, 0x92e, 0x92c, 0x93e, 0x930, 0x3b, 0x92e, 0x919, 0x94d, 0x917, 0x932, 0x92c, 0x93e, 0x930, 0x3b, 0x92c,
-0x941, 0x927, 0x92c, 0x93e, 0x930, 0x3b, 0x92c, 0x93f, 0x939, 0x93f, 0x92c, 0x93e, 0x930, 0x3b, 0x936, 0x941, 0x915, 0x94d, 0x930, 0x92c,
-0x93e, 0x930, 0x3b, 0x936, 0x928, 0x93f, 0x92c, 0x93e, 0x930, 0x906, 0x907, 0x924, 0x3b, 0x938, 0x94b, 0x92e, 0x3b, 0x92e, 0x919, 0x94d,
-0x917, 0x932, 0x3b, 0x92c, 0x941, 0x927, 0x3b, 0x92c, 0x93f, 0x939, 0x93f, 0x3b, 0x936, 0x941, 0x915, 0x94d, 0x930, 0x3b, 0x936, 0x928,
-0x93f, 0x906, 0x3b, 0x938, 0x94b, 0x3b, 0x92e, 0x3b, 0x92c, 0x941, 0x3b, 0x92c, 0x93f, 0x3b, 0x936, 0x941, 0x3b, 0x936, 0x6c, 0x79,
-0x25b, 0x2bc, 0x25b, 0x301, 0x20, 0x73, 0x1e85, 0xed, 0x14b, 0x74, 0xe8, 0x3b, 0x6d, 0x76, 0x66, 0xf2, 0x20, 0x6c, 0x79, 0x25b,
-0x30c, 0x2bc, 0x3b, 0x6d, 0x62, 0x254, 0x301, 0x254, 0x6e, 0x74, 0xe8, 0x20, 0x6d, 0x76, 0x66, 0xf2, 0x20, 0x6c, 0x79, 0x25b,
-0x30c, 0x2bc, 0x3b, 0x74, 0x73, 0xe8, 0x74, 0x73, 0x25b, 0x300, 0x25b, 0x20, 0x6c, 0x79, 0x25b, 0x30c, 0x2bc, 0x3b, 0x6d, 0x62,
-0x254, 0x301, 0x254, 0x6e, 0x74, 0xe8, 0x20, 0x74, 0x73, 0x65, 0x74, 0x73, 0x25b, 0x300, 0x25b, 0x20, 0x6c, 0x79, 0x25b, 0x30c,
-0x2bc, 0x3b, 0x6d, 0x76, 0x66, 0xf2, 0x20, 0x6d, 0xe0, 0x67, 0x61, 0x20, 0x6c, 0x79, 0x25b, 0x30c, 0x2bc, 0x3b, 0x6d, 0xe0,
-0x67, 0x61, 0x20, 0x6c, 0x79, 0x25b, 0x30c, 0x2bc, 0x53, 0x254, 0x301, 0x6e, 0x64, 0x69, 0x3b, 0x4d, 0x254, 0x301, 0x6e, 0x64,
-0x69, 0x3b, 0xc1, 0x70, 0x74, 0x61, 0x20, 0x4d, 0x254, 0x301, 0x6e, 0x64, 0x69, 0x3b, 0x57, 0x25b, 0x301, 0x6e, 0x25b, 0x73,
-0x25b, 0x64, 0x25b, 0x3b, 0x54, 0x254, 0x301, 0x73, 0x25b, 0x64, 0x25b, 0x3b, 0x46, 0x25b, 0x6c, 0xe2, 0x79, 0x25b, 0x64, 0x25b,
-0x3b, 0x53, 0xe1, 0x73, 0x69, 0x64, 0x25b, 0x53, 0x254, 0x301, 0x3b, 0x4d, 0x254, 0x301, 0x3b, 0xc1, 0x4d, 0x3b, 0x57, 0x25b,
-0x301, 0x3b, 0x54, 0x254, 0x301, 0x3b, 0x46, 0x25b, 0x3b, 0x53, 0xe1, 0x53, 0x1ecd, 0x301, 0x6e, 0x64, 0xe8, 0x3b, 0x4d, 0x1ecd,
-0x301, 0x6e, 0x64, 0xe8, 0x3b, 0x54, 0x69, 0xfa, 0x7a, 0x64, 0xe8, 0x3b, 0x57, 0x1eb9, 0x301, 0x6e, 0x1eb9, 0x301, 0x7a, 0x64,
-0xe8, 0x3b, 0x54, 0x1ecd, 0x301, 0x7a, 0x64, 0xe8, 0x3b, 0x46, 0x72, 0x61, 0xed, 0x64, 0xe8, 0x3b, 0x53, 0xe1, 0x74, 0x1ecd,
-0x64, 0xe8, 0x53, 0x1ecd, 0x301, 0x6e, 0x3b, 0x4d, 0x1ecd, 0x301, 0x6e, 0x3b, 0x54, 0x69, 0xfa, 0x3b, 0x57, 0x1eb9, 0x301, 0x6e,
-0x3b, 0x54, 0x1ecd, 0x301, 0x7a, 0x3b, 0x46, 0x72, 0x61, 0xed, 0x3b, 0x53, 0xe1, 0x74, 0x73, 0x6f, 0x74, 0x6e, 0x61, 0x62,
-0x65, 0x61, 0x69, 0x76, 0x69, 0x3b, 0x76, 0x75, 0x6f, 0x73, 0x73, 0xe1, 0x72, 0x67, 0x61, 0x3b, 0x6d, 0x61, 0x14b, 0x14b,
-0x65, 0x62, 0xe1, 0x72, 0x67, 0x61, 0x3b, 0x67, 0x61, 0x73, 0x6b, 0x61, 0x76, 0x61, 0x68, 0x6b, 0x6b, 0x75, 0x3b, 0x64,
-0x75, 0x6f, 0x72, 0x61, 0x73, 0x64, 0x61, 0x74, 0x3b, 0x62, 0x65, 0x61, 0x72, 0x6a, 0x61, 0x64, 0x61, 0x74, 0x3b, 0x6c,
-0xe1, 0x76, 0x76, 0x61, 0x72, 0x64, 0x61, 0x74, 0x73, 0x6f, 0x74, 0x6e, 0x3b, 0x76, 0x75, 0x6f, 0x73, 0x3b, 0x6d, 0x61,
-0x14b, 0x3b, 0x67, 0x61, 0x73, 0x6b, 0x3b, 0x64, 0x75, 0x6f, 0x72, 0x3b, 0x62, 0x65, 0x61, 0x72, 0x3b, 0x6c, 0xe1, 0x76,
-0x53, 0x3b, 0x56, 0x3b, 0x4d, 0x3b, 0x47, 0x3b, 0x44, 0x3b, 0x42, 0x3b, 0x4c, 0x73, 0x6f, 0x74, 0x6e, 0x61, 0x62, 0x65,
-0x61, 0x69, 0x76, 0x69, 0x3b, 0x6d, 0xe1, 0x6e, 0x6e, 0x6f, 0x64, 0x61, 0x74, 0x3b, 0x64, 0x69, 0x73, 0x64, 0x61, 0x74,
-0x3b, 0x67, 0x61, 0x73, 0x6b, 0x61, 0x76, 0x61, 0x68, 0x6b, 0x6b, 0x75, 0x3b, 0x64, 0x75, 0x6f, 0x72, 0x61, 0x73, 0x74,
-0x61, 0x74, 0x3b, 0x62, 0x65, 0x61, 0x72, 0x6a, 0x61, 0x64, 0x61, 0x74, 0x3b, 0x6c, 0xe1, 0x76, 0x76, 0x6f, 0x72, 0x64,
-0x61, 0x74, 0x73, 0x6f, 0x3b, 0x6d, 0xe1, 0x3b, 0x64, 0x69, 0x3b, 0x67, 0x61, 0x3b, 0x64, 0x75, 0x3b, 0x62, 0x65, 0x3b,
-0x6c, 0xe1, 0x53, 0x3b, 0x4d, 0x3b, 0x44, 0x3b, 0x47, 0x3b, 0x44, 0x3b, 0x42, 0x3b, 0x4c, 0x53, 0x6f, 0x6e, 0x74, 0x6f,
-0x3b, 0x4d, 0x76, 0x75, 0x6c, 0x6f, 0x3b, 0x53, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x3b, 0x53, 0x69, 0x74, 0x68, 0x61, 0x74,
-0x68, 0x75, 0x3b, 0x53, 0x69, 0x6e, 0x65, 0x3b, 0x53, 0x69, 0x68, 0x6c, 0x61, 0x6e, 0x75, 0x3b, 0x4d, 0x67, 0x71, 0x69,
-0x62, 0x65, 0x6c, 0x6f, 0x53, 0x6f, 0x6e, 0x3b, 0x4d, 0x76, 0x75, 0x3b, 0x53, 0x69, 0x62, 0x3b, 0x53, 0x69, 0x74, 0x3b,
-0x53, 0x69, 0x6e, 0x3b, 0x53, 0x69, 0x68, 0x3b, 0x4d, 0x67, 0x71, 0x53, 0x3b, 0x4d, 0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x53,
-0x3b, 0x53, 0x3b, 0x4d, 0x73, 0xf8, 0x6e, 0x64, 0x61, 0x67, 0x3b, 0x6d, 0xe5, 0x6e, 0x64, 0x61, 0x67, 0x3b, 0x74, 0x79,
-0x73, 0x64, 0x61, 0x67, 0x3b, 0x6f, 0x6e, 0x73, 0x64, 0x61, 0x67, 0x3b, 0x74, 0x6f, 0x72, 0x73, 0x64, 0x61, 0x67, 0x3b,
-0x66, 0x72, 0x65, 0x64, 0x61, 0x67, 0x3b, 0x6c, 0x61, 0x75, 0x72, 0x64, 0x61, 0x67, 0x73, 0xf8, 0x6e, 0x3b, 0x6d, 0xe5,
-0x6e, 0x3b, 0x74, 0x79, 0x73, 0x3b, 0x6f, 0x6e, 0x73, 0x3b, 0x74, 0x6f, 0x72, 0x3b, 0x66, 0x72, 0x65, 0x3b, 0x6c, 0x61,
-0x75, 0x73, 0xf8, 0x2e, 0x3b, 0x6d, 0xe5, 0x2e, 0x3b, 0x74, 0x79, 0x2e, 0x3b, 0x6f, 0x6e, 0x2e, 0x3b, 0x74, 0x6f, 0x2e,
-0x3b, 0x66, 0x72, 0x2e, 0x3b, 0x6c, 0x61, 0x2e, 0x43, 0xe4, 0x14b, 0x20, 0x6b, 0x75, 0x254, 0x74, 0x68, 0x3b, 0x4a, 0x69,
-0x65, 0x63, 0x20, 0x6c, 0x61, 0x331, 0x74, 0x3b, 0x52, 0x25b, 0x77, 0x20, 0x6c, 0xe4, 0x74, 0x6e, 0x69, 0x3b, 0x44, 0x69,
-0x254, 0x331, 0x6b, 0x20, 0x6c, 0xe4, 0x74, 0x6e, 0x69, 0x3b, 0x14a, 0x75, 0x61, 0x61, 0x6e, 0x20, 0x6c, 0xe4, 0x74, 0x6e,
-0x69, 0x3b, 0x44, 0x68, 0x69, 0x65, 0x65, 0x63, 0x20, 0x6c, 0xe4, 0x74, 0x6e, 0x69, 0x3b, 0x42, 0xe4, 0x6b, 0x25b, 0x6c,
-0x20, 0x6c, 0xe4, 0x74, 0x6e, 0x69, 0x43, 0xe4, 0x14b, 0x3b, 0x4a, 0x69, 0x65, 0x63, 0x3b, 0x52, 0x25b, 0x77, 0x3b, 0x44,
-0x69, 0x254, 0x331, 0x6b, 0x3b, 0x14a, 0x75, 0x61, 0x61, 0x6e, 0x3b, 0x44, 0x68, 0x69, 0x65, 0x65, 0x63, 0x3b, 0x42, 0xe4,
-0x6b, 0x25b, 0x6c, 0x43, 0x3b, 0x4a, 0x3b, 0x52, 0x3b, 0x44, 0x3b, 0x14a, 0x3b, 0x44, 0x3b, 0x42, 0xb30, 0xb2c, 0xb3f, 0xb2c,
-0xb3e, 0xb30, 0x3b, 0xb38, 0xb4b, 0xb2e, 0xb2c, 0xb3e, 0xb30, 0x3b, 0xb2e, 0xb19, 0xb4d, 0xb17, 0xb33, 0xb2c, 0xb3e, 0xb30, 0x3b, 0xb2c,
-0xb41, 0xb27, 0xb2c, 0xb3e, 0xb30, 0x3b, 0xb17, 0xb41, 0xb30, 0xb41, 0xb2c, 0xb3e, 0xb30, 0x3b, 0xb36, 0xb41, 0xb15, 0xb4d, 0xb30, 0xb2c,
-0xb3e, 0xb30, 0x3b, 0xb36, 0xb28, 0xb3f, 0xb2c, 0xb3e, 0xb30, 0xb30, 0xb2c, 0xb3f, 0x3b, 0xb38, 0xb4b, 0xb2e, 0x3b, 0xb2e, 0xb19, 0xb4d,
-0xb17, 0xb33, 0x3b, 0xb2c, 0xb41, 0xb27, 0x3b, 0xb17, 0xb41, 0xb30, 0xb41, 0x3b, 0xb36, 0xb41, 0xb15, 0xb4d, 0xb30, 0x3b, 0xb36, 0xb28,
-0xb3f, 0xb30, 0x3b, 0xb38, 0xb4b, 0x3b, 0xb2e, 0x3b, 0xb2c, 0xb41, 0x3b, 0xb17, 0xb41, 0x3b, 0xb36, 0xb41, 0x3b, 0xb36, 0x44, 0x69,
-0x6c, 0x62, 0x61, 0x74, 0x61, 0x3b, 0x57, 0x69, 0x69, 0x78, 0x61, 0x74, 0x61, 0x3b, 0x51, 0x69, 0x62, 0x78, 0x61, 0x74,
-0x61, 0x3b, 0x52, 0x6f, 0x6f, 0x62, 0x69, 0x69, 0x3b, 0x4b, 0x61, 0x6d, 0x69, 0x69, 0x73, 0x61, 0x3b, 0x4a, 0x69, 0x6d,
-0x61, 0x61, 0x74, 0x61, 0x3b, 0x53, 0x61, 0x6e, 0x62, 0x61, 0x74, 0x61, 0x44, 0x69, 0x6c, 0x3b, 0x57, 0x69, 0x78, 0x3b,
-0x51, 0x69, 0x62, 0x3b, 0x52, 0x6f, 0x62, 0x3b, 0x4b, 0x61, 0x6d, 0x3b, 0x4a, 0x69, 0x6d, 0x3b, 0x53, 0x61, 0x6e, 0x44,
-0x3b, 0x57, 0x3b, 0x51, 0x3b, 0x52, 0x3b, 0x4b, 0x3b, 0x4a, 0x3b, 0x53, 0x425, 0x443, 0x44b, 0x446, 0x430, 0x443, 0x431, 0x43e,
-0x43d, 0x3b, 0x41a, 0x44a, 0x443, 0x44b, 0x440, 0x438, 0x441, 0x4d5, 0x440, 0x3b, 0x414, 0x44b, 0x446, 0x446, 0x4d5, 0x433, 0x3b, 0x4d4,
-0x440, 0x442, 0x44b, 0x446, 0x446, 0x4d5, 0x433, 0x3b, 0x426, 0x44b, 0x43f, 0x43f, 0x4d5, 0x440, 0x4d5, 0x43c, 0x3b, 0x41c, 0x430, 0x439,
-0x440, 0x4d5, 0x43c, 0x431, 0x43e, 0x43d, 0x3b, 0x421, 0x430, 0x431, 0x430, 0x442, 0x445, 0x443, 0x44b, 0x446, 0x430, 0x443, 0x431, 0x43e,
-0x43d, 0x3b, 0x43a, 0x44a, 0x443, 0x44b, 0x440, 0x438, 0x441, 0x4d5, 0x440, 0x3b, 0x434, 0x44b, 0x446, 0x446, 0x4d5, 0x433, 0x3b, 0x4d5,
-0x440, 0x442, 0x44b, 0x446, 0x446, 0x4d5, 0x433, 0x3b, 0x446, 0x44b, 0x43f, 0x43f, 0x4d5, 0x440, 0x4d5, 0x43c, 0x3b, 0x43c, 0x430, 0x439,
-0x440, 0x4d5, 0x43c, 0x431, 0x43e, 0x43d, 0x3b, 0x441, 0x430, 0x431, 0x430, 0x442, 0x425, 0x446, 0x431, 0x3b, 0x41a, 0x440, 0x441, 0x3b,
-0x414, 0x446, 0x433, 0x3b, 0x4d4, 0x440, 0x442, 0x3b, 0x426, 0x43f, 0x440, 0x3b, 0x41c, 0x440, 0x431, 0x3b, 0x421, 0x431, 0x442, 0x445,
-0x446, 0x431, 0x3b, 0x43a, 0x440, 0x441, 0x3b, 0x434, 0x446, 0x433, 0x3b, 0x4d5, 0x440, 0x442, 0x3b, 0x446, 0x43f, 0x440, 0x3b, 0x43c,
-0x440, 0x431, 0x3b, 0x441, 0x431, 0x442, 0x425, 0x3b, 0x41a, 0x3b, 0x414, 0x3b, 0x4d4, 0x3b, 0x426, 0x3b, 0x41c, 0x3b, 0x421, 0x64a,
-0x648, 0x646, 0x6cd, 0x3b, 0x62f, 0x648, 0x646, 0x6cd, 0x3b, 0x62f, 0x631, 0x6d0, 0x646, 0x6cd, 0x3b, 0x685, 0x644, 0x631, 0x646, 0x6cd,
-0x3b, 0x67e, 0x64a, 0x646, 0x681, 0x646, 0x6cd, 0x3b, 0x62c, 0x645, 0x639, 0x647, 0x3b, 0x627, 0x648, 0x646, 0x6cd, 0x6cc, 0x6a9, 0x634,
-0x646, 0x628, 0x647, 0x3b, 0x62f, 0x648, 0x634, 0x646, 0x628, 0x647, 0x3b, 0x633, 0x647, 0x200c, 0x634, 0x646, 0x628, 0x647, 0x3b, 0x686,
-0x647, 0x627, 0x631, 0x634, 0x646, 0x628, 0x647, 0x3b, 0x67e, 0x646, 0x62c, 0x634, 0x646, 0x628, 0x647, 0x3b, 0x62c, 0x645, 0x639, 0x647,
-0x3b, 0x634, 0x646, 0x628, 0x647, 0x6cc, 0x3b, 0x62f, 0x3b, 0x633, 0x3b, 0x686, 0x3b, 0x67e, 0x3b, 0x62c, 0x3b, 0x634, 0x6e, 0x69,
-0x65, 0x64, 0x7a, 0x69, 0x65, 0x6c, 0x61, 0x3b, 0x70, 0x6f, 0x6e, 0x69, 0x65, 0x64, 0x7a, 0x69, 0x61, 0x142, 0x65, 0x6b,
-0x3b, 0x77, 0x74, 0x6f, 0x72, 0x65, 0x6b, 0x3b, 0x15b, 0x72, 0x6f, 0x64, 0x61, 0x3b, 0x63, 0x7a, 0x77, 0x61, 0x72, 0x74,
-0x65, 0x6b, 0x3b, 0x70, 0x69, 0x105, 0x74, 0x65, 0x6b, 0x3b, 0x73, 0x6f, 0x62, 0x6f, 0x74, 0x61, 0x6e, 0x69, 0x65, 0x64,
-0x7a, 0x2e, 0x3b, 0x70, 0x6f, 0x6e, 0x2e, 0x3b, 0x77, 0x74, 0x2e, 0x3b, 0x15b, 0x72, 0x2e, 0x3b, 0x63, 0x7a, 0x77, 0x2e,
-0x3b, 0x70, 0x74, 0x2e, 0x3b, 0x73, 0x6f, 0x62, 0x2e, 0x4e, 0x3b, 0x50, 0x3b, 0x57, 0x3b, 0x15a, 0x3b, 0x43, 0x3b, 0x50,
-0x3b, 0x53, 0x6e, 0x3b, 0x70, 0x3b, 0x77, 0x3b, 0x15b, 0x3b, 0x63, 0x3b, 0x70, 0x3b, 0x73, 0x64, 0x6f, 0x6d, 0x69, 0x6e,
-0x67, 0x6f, 0x3b, 0x73, 0x65, 0x67, 0x75, 0x6e, 0x64, 0x61, 0x2d, 0x66, 0x65, 0x69, 0x72, 0x61, 0x3b, 0x74, 0x65, 0x72,
-0xe7, 0x61, 0x2d, 0x66, 0x65, 0x69, 0x72, 0x61, 0x3b, 0x71, 0x75, 0x61, 0x72, 0x74, 0x61, 0x2d, 0x66, 0x65, 0x69, 0x72,
-0x61, 0x3b, 0x71, 0x75, 0x69, 0x6e, 0x74, 0x61, 0x2d, 0x66, 0x65, 0x69, 0x72, 0x61, 0x3b, 0x73, 0x65, 0x78, 0x74, 0x61,
-0x2d, 0x66, 0x65, 0x69, 0x72, 0x61, 0x3b, 0x73, 0xe1, 0x62, 0x61, 0x64, 0x6f, 0x64, 0x6f, 0x6d, 0x2e, 0x3b, 0x73, 0x65,
-0x67, 0x2e, 0x3b, 0x74, 0x65, 0x72, 0x2e, 0x3b, 0x71, 0x75, 0x61, 0x2e, 0x3b, 0x71, 0x75, 0x69, 0x2e, 0x3b, 0x73, 0x65,
-0x78, 0x2e, 0x3b, 0x73, 0xe1, 0x62, 0x2e, 0x44, 0x3b, 0x53, 0x3b, 0x54, 0x3b, 0x51, 0x3b, 0x51, 0x3b, 0x53, 0x3b, 0x53,
-0x64, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x6f, 0x3b, 0x73, 0x65, 0x67, 0x75, 0x6e, 0x64, 0x61, 0x3b, 0x74, 0x65, 0x72, 0xe7,
-0x61, 0x3b, 0x71, 0x75, 0x61, 0x72, 0x74, 0x61, 0x3b, 0x71, 0x75, 0x69, 0x6e, 0x74, 0x61, 0x3b, 0x73, 0x65, 0x78, 0x74,
-0x61, 0x3b, 0x73, 0xe1, 0x62, 0x61, 0x64, 0x6f, 0xa10, 0xa24, 0xa35, 0xa3e, 0xa30, 0x3b, 0xa38, 0xa4b, 0xa2e, 0xa35, 0xa3e, 0xa30,
-0x3b, 0xa2e, 0xa70, 0xa17, 0xa32, 0xa35, 0xa3e, 0xa30, 0x3b, 0xa2c, 0xa41, 0xa71, 0xa27, 0xa35, 0xa3e, 0xa30, 0x3b, 0xa35, 0xa40, 0xa30,
-0xa35, 0xa3e, 0xa30, 0x3b, 0xa38, 0xa3c, 0xa41, 0xa71, 0xa15, 0xa30, 0xa35, 0xa3e, 0xa30, 0x3b, 0xa38, 0xa3c, 0xa28, 0xa3f, 0xa71, 0xa1a,
-0xa30, 0xa35, 0xa3e, 0xa30, 0xa10, 0xa24, 0x3b, 0xa38, 0xa4b, 0xa2e, 0x3b, 0xa2e, 0xa70, 0xa17, 0xa32, 0x3b, 0xa2c, 0xa41, 0xa71, 0xa27,
-0x3b, 0xa35, 0xa40, 0xa30, 0x3b, 0xa38, 0xa3c, 0xa41, 0xa71, 0xa15, 0xa30, 0x3b, 0xa38, 0xa3c, 0xa28, 0xa3f, 0xa71, 0xa1a, 0xa30, 0xa10,
-0x3b, 0xa38, 0xa4b, 0x3b, 0xa2e, 0xa70, 0x3b, 0xa2c, 0xa41, 0xa71, 0x3b, 0xa35, 0xa40, 0x3b, 0xa38, 0xa3c, 0xa41, 0xa71, 0x3b, 0xa38,
-0xa3c, 0x627, 0x62a, 0x648, 0x627, 0x631, 0x3b, 0x67e, 0x6cc, 0x631, 0x3b, 0x645, 0x646, 0x6af, 0x644, 0x3b, 0x628, 0x64f, 0x62f, 0x6be,
-0x3b, 0x62c, 0x645, 0x639, 0x631, 0x627, 0x62a, 0x3b, 0x62c, 0x645, 0x639, 0x6c1, 0x3b, 0x6c1, 0x641, 0x62a, 0x6c1, 0x44, 0x6f, 0x6d,
-0x69, 0x6e, 0x67, 0x6f, 0x3b, 0x4c, 0x75, 0x6e, 0x65, 0x73, 0x3b, 0x4d, 0x61, 0x72, 0x74, 0x65, 0x73, 0x3b, 0x4d, 0x69,
-0xe9, 0x72, 0x63, 0x6f, 0x6c, 0x65, 0x73, 0x3b, 0x4a, 0x75, 0x65, 0x76, 0x65, 0x73, 0x3b, 0x56, 0x69, 0x65, 0x72, 0x6e,
-0x65, 0x73, 0x3b, 0x53, 0xe1, 0x62, 0x61, 0x64, 0x6f, 0x44, 0x6f, 0x6d, 0x3b, 0x4c, 0x75, 0x6e, 0x3b, 0x4d, 0x61, 0x72,
-0x3b, 0x4d, 0x69, 0xe9, 0x3b, 0x4a, 0x75, 0x65, 0x3b, 0x56, 0x69, 0x65, 0x3b, 0x53, 0x61, 0x62, 0x44, 0x3b, 0x4c, 0x3b,
-0x4d, 0x3b, 0x58, 0x3b, 0x4a, 0x3b, 0x56, 0x3b, 0x53, 0x64, 0x75, 0x6d, 0x69, 0x6e, 0x69, 0x63, 0x103, 0x3b, 0x6c, 0x75,
-0x6e, 0x69, 0x3b, 0x6d, 0x61, 0x72, 0x21b, 0x69, 0x3b, 0x6d, 0x69, 0x65, 0x72, 0x63, 0x75, 0x72, 0x69, 0x3b, 0x6a, 0x6f,
-0x69, 0x3b, 0x76, 0x69, 0x6e, 0x65, 0x72, 0x69, 0x3b, 0x73, 0xe2, 0x6d, 0x62, 0x103, 0x74, 0x103, 0x64, 0x75, 0x6d, 0x2e,
-0x3b, 0x6c, 0x75, 0x6e, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x2e, 0x3b, 0x6d, 0x69, 0x65, 0x2e, 0x3b, 0x6a, 0x6f, 0x69, 0x3b,
-0x76, 0x69, 0x6e, 0x2e, 0x3b, 0x73, 0xe2, 0x6d, 0x2e, 0x44, 0x75, 0x6d, 0x3b, 0x4c, 0x75, 0x6e, 0x3b, 0x4d, 0x61, 0x72,
-0x3b, 0x4d, 0x69, 0x65, 0x3b, 0x4a, 0x6f, 0x69, 0x3b, 0x56, 0x69, 0x6e, 0x3b, 0x53, 0xe2, 0x6d, 0x44, 0x3b, 0x4c, 0x3b,
-0x4d, 0x61, 0x3b, 0x4d, 0x69, 0x3b, 0x4a, 0x3b, 0x56, 0x3b, 0x53, 0x64, 0x75, 0x6d, 0x65, 0x6e, 0x67, 0x69, 0x61, 0x3b,
-0x67, 0x6c, 0x69, 0x6e, 0x64, 0x65, 0x73, 0x64, 0x69, 0x3b, 0x6d, 0x61, 0x72, 0x64, 0x69, 0x3b, 0x6d, 0x65, 0x73, 0x65,
-0x6d, 0x6e, 0x61, 0x3b, 0x67, 0x69, 0x65, 0x76, 0x67, 0x69, 0x61, 0x3b, 0x76, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x64, 0x69,
-0x3b, 0x73, 0x6f, 0x6e, 0x64, 0x61, 0x64, 0x75, 0x3b, 0x67, 0x6c, 0x69, 0x3b, 0x6d, 0x61, 0x3b, 0x6d, 0x65, 0x3b, 0x67,
-0x69, 0x65, 0x3b, 0x76, 0x65, 0x3b, 0x73, 0x6f, 0x44, 0x3b, 0x47, 0x3b, 0x4d, 0x3b, 0x4d, 0x3b, 0x47, 0x3b, 0x56, 0x3b,
-0x53, 0x49, 0x6a, 0x75, 0x6d, 0x61, 0x70, 0x69, 0x6c, 0x69, 0x3b, 0x49, 0x6a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x74, 0x75,
-0x3b, 0x49, 0x6a, 0x75, 0x6d, 0x61, 0x6e, 0x6e, 0x65, 0x3b, 0x49, 0x6a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x3b,
-0x41, 0x6c, 0x68, 0x61, 0x6d, 0x69, 0x73, 0x69, 0x3b, 0x49, 0x6a, 0x75, 0x6d, 0x61, 0x61, 0x3b, 0x49, 0x6a, 0x75, 0x6d,
-0x61, 0x6d, 0x6f, 0x73, 0x69, 0x49, 0x6a, 0x70, 0x3b, 0x49, 0x6a, 0x74, 0x3b, 0x49, 0x6a, 0x6e, 0x3b, 0x49, 0x6a, 0x74,
-0x6e, 0x3b, 0x41, 0x6c, 0x68, 0x3b, 0x49, 0x6a, 0x75, 0x3b, 0x49, 0x6a, 0x6d, 0x4b, 0x75, 0x20, 0x77, 0x2019, 0x69, 0x6e,
-0x64, 0x77, 0x69, 0x3b, 0x4b, 0x75, 0x20, 0x77, 0x61, 0x20, 0x6d, 0x62, 0x65, 0x72, 0x65, 0x3b, 0x4b, 0x75, 0x20, 0x77,
-0x61, 0x20, 0x6b, 0x61, 0x62, 0x69, 0x72, 0x69, 0x3b, 0x4b, 0x75, 0x20, 0x77, 0x61, 0x20, 0x67, 0x61, 0x74, 0x61, 0x74,
-0x75, 0x3b, 0x4b, 0x75, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x6e, 0x65, 0x3b, 0x4b, 0x75, 0x20, 0x77, 0x61, 0x20, 0x67,
-0x61, 0x74, 0x61, 0x6e, 0x75, 0x3b, 0x4b, 0x75, 0x20, 0x77, 0x61, 0x20, 0x67, 0x61, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x74,
-0x75, 0x63, 0x75, 0x2e, 0x3b, 0x6d, 0x62, 0x65, 0x2e, 0x3b, 0x6b, 0x61, 0x62, 0x2e, 0x3b, 0x67, 0x74, 0x75, 0x2e, 0x3b,
-0x6b, 0x61, 0x6e, 0x2e, 0x3b, 0x67, 0x6e, 0x75, 0x2e, 0x3b, 0x67, 0x6e, 0x64, 0x2e, 0x432, 0x43e, 0x441, 0x43a, 0x440, 0x435,
-0x441, 0x435, 0x43d, 0x44c, 0x435, 0x3b, 0x43f, 0x43e, 0x43d, 0x435, 0x434, 0x435, 0x43b, 0x44c, 0x43d, 0x438, 0x43a, 0x3b, 0x432, 0x442,
-0x43e, 0x440, 0x43d, 0x438, 0x43a, 0x3b, 0x441, 0x440, 0x435, 0x434, 0x430, 0x3b, 0x447, 0x435, 0x442, 0x432, 0x435, 0x440, 0x433, 0x3b,
-0x43f, 0x44f, 0x442, 0x43d, 0x438, 0x446, 0x430, 0x3b, 0x441, 0x443, 0x431, 0x431, 0x43e, 0x442, 0x430, 0x432, 0x441, 0x3b, 0x43f, 0x43d,
-0x3b, 0x432, 0x442, 0x3b, 0x441, 0x440, 0x3b, 0x447, 0x442, 0x3b, 0x43f, 0x442, 0x3b, 0x441, 0x431, 0x412, 0x3b, 0x41f, 0x3b, 0x412,
-0x3b, 0x421, 0x3b, 0x427, 0x3b, 0x41f, 0x3b, 0x421, 0x431, 0x430, 0x441, 0x43a, 0x44b, 0x4bb, 0x44b, 0x430, 0x43d, 0x43d, 0x44c, 0x430,
-0x3b, 0x431, 0x44d, 0x43d, 0x438, 0x434, 0x438, 0x44d, 0x43d, 0x43d, 0x44c, 0x438, 0x43a, 0x3b, 0x43e, 0x43f, 0x442, 0x443, 0x43e, 0x440,
-0x443, 0x43d, 0x43d, 0x44c, 0x443, 0x43a, 0x3b, 0x441, 0x44d, 0x440, 0x44d, 0x434, 0x44d, 0x3b, 0x447, 0x44d, 0x43f, 0x43f, 0x438, 0x44d,
-0x440, 0x3b, 0x411, 0x44d, 0x44d, 0x442, 0x438, 0x4a5, 0x441, 0x44d, 0x3b, 0x441, 0x443, 0x431, 0x443, 0x43e, 0x442, 0x430, 0x431, 0x441,
-0x3b, 0x431, 0x43d, 0x3b, 0x43e, 0x43f, 0x3b, 0x441, 0x44d, 0x3b, 0x447, 0x43f, 0x3b, 0x431, 0x44d, 0x3b, 0x441, 0x431, 0x411, 0x3b,
-0x411, 0x3b, 0x41e, 0x3b, 0x421, 0x3b, 0x427, 0x3b, 0x411, 0x3b, 0x421, 0x4d, 0x64, 0x65, 0x72, 0x6f, 0x74, 0x20, 0x65, 0x65,
-0x20, 0x61, 0x72, 0x65, 0x3b, 0x4d, 0x64, 0x65, 0x72, 0x6f, 0x74, 0x20, 0x65, 0x65, 0x20, 0x6b, 0x75, 0x6e, 0x69, 0x3b,
-0x4d, 0x64, 0x65, 0x72, 0x6f, 0x74, 0x20, 0x65, 0x65, 0x20, 0x6f, 0x6e, 0x67, 0x2019, 0x77, 0x61, 0x6e, 0x3b, 0x4d, 0x64,
-0x65, 0x72, 0x6f, 0x74, 0x20, 0x65, 0x65, 0x20, 0x69, 0x6e, 0x65, 0x74, 0x3b, 0x4d, 0x64, 0x65, 0x72, 0x6f, 0x74, 0x20,
-0x65, 0x65, 0x20, 0x69, 0x6c, 0x65, 0x3b, 0x4d, 0x64, 0x65, 0x72, 0x6f, 0x74, 0x20, 0x65, 0x65, 0x20, 0x73, 0x61, 0x70,
-0x61, 0x3b, 0x4d, 0x64, 0x65, 0x72, 0x6f, 0x74, 0x20, 0x65, 0x65, 0x20, 0x6b, 0x77, 0x65, 0x41, 0x72, 0x65, 0x3b, 0x4b,
-0x75, 0x6e, 0x3b, 0x4f, 0x6e, 0x67, 0x3b, 0x49, 0x6e, 0x65, 0x3b, 0x49, 0x6c, 0x65, 0x3b, 0x53, 0x61, 0x70, 0x3b, 0x4b,
-0x77, 0x65, 0x41, 0x3b, 0x4b, 0x3b, 0x4f, 0x3b, 0x49, 0x3b, 0x49, 0x3b, 0x53, 0x3b, 0x4b, 0x42, 0x69, 0x6b, 0x75, 0x61,
-0x2d, 0xf4, 0x6b, 0x6f, 0x3b, 0x42, 0xef, 0x6b, 0x75, 0x61, 0x2d, 0xfb, 0x73, 0x65, 0x3b, 0x42, 0xef, 0x6b, 0x75, 0x61,
-0x2d, 0x70, 0x74, 0xe2, 0x3b, 0x42, 0xef, 0x6b, 0x75, 0x61, 0x2d, 0x75, 0x73, 0xef, 0xf6, 0x3b, 0x42, 0xef, 0x6b, 0x75,
-0x61, 0x2d, 0x6f, 0x6b, 0xfc, 0x3b, 0x4c, 0xe2, 0x70, 0xf4, 0x73, 0xf6, 0x3b, 0x4c, 0xe2, 0x79, 0x65, 0x6e, 0x67, 0x61,
-0x42, 0x6b, 0x31, 0x3b, 0x42, 0x6b, 0x32, 0x3b, 0x42, 0x6b, 0x33, 0x3b, 0x42, 0x6b, 0x34, 0x3b, 0x42, 0x6b, 0x35, 0x3b,
-0x4c, 0xe2, 0x70, 0x3b, 0x4c, 0xe2, 0x79, 0x4b, 0x3b, 0x53, 0x3b, 0x54, 0x3b, 0x53, 0x3b, 0x4b, 0x3b, 0x50, 0x3b, 0x59,
-0x4d, 0x75, 0x6c, 0x75, 0x6e, 0x67, 0x75, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x4a, 0x75, 0x6d,
-0x61, 0x6e, 0x6e, 0x65, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x41, 0x6c, 0x61, 0x68, 0x61, 0x6d,
-0x69, 0x73, 0x69, 0x3b, 0x49, 0x6a, 0x75, 0x6d, 0x61, 0x61, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x6d, 0x6f, 0x73, 0x69, 0x4d,
-0x75, 0x6c, 0x3b, 0x4a, 0x74, 0x74, 0x3b, 0x4a, 0x6e, 0x6e, 0x3b, 0x4a, 0x74, 0x6e, 0x3b, 0x41, 0x6c, 0x68, 0x3b, 0x49,
-0x6a, 0x75, 0x3b, 0x4a, 0x6d, 0x6f, 0x4d, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0x41, 0x3b, 0x49, 0x3b, 0x4a, 0x930,
-0x935, 0x93f, 0x935, 0x93e, 0x938, 0x930, 0x903, 0x3b, 0x938, 0x94b, 0x92e, 0x935, 0x93e, 0x938, 0x930, 0x903, 0x3b, 0x92e, 0x902, 0x917,
-0x932, 0x935, 0x93e, 0x938, 0x930, 0x903, 0x3b, 0x92c, 0x941, 0x927, 0x935, 0x93e, 0x938, 0x930, 0x903, 0x3b, 0x917, 0x941, 0x930, 0x941,
-0x935, 0x93e, 0x938, 0x930, 0x3a, 0x3b, 0x936, 0x941, 0x915, 0x94d, 0x930, 0x935, 0x93e, 0x938, 0x930, 0x903, 0x3b, 0x936, 0x928, 0x93f,
-0x935, 0x93e, 0x938, 0x930, 0x903, 0x1c65, 0x1c64, 0x1c78, 0x1c5c, 0x1c6e, 0x3b, 0x1c5a, 0x1c5b, 0x1c6e, 0x3b, 0x1c75, 0x1c5f, 0x1c5e, 0x1c6e, 0x3b,
-0x1c65, 0x1c5f, 0x1c79, 0x1c5c, 0x1c69, 0x1c71, 0x3b, 0x1c65, 0x1c5f, 0x1c79, 0x1c68, 0x1c6b, 0x1c64, 0x3b, 0x1c61, 0x1c5f, 0x1c79, 0x1c68, 0x1c69, 0x1c62,
-0x3b, 0x1c67, 0x1c69, 0x1c66, 0x1c69, 0x1c62, 0x1c65, 0x1c64, 0x1c78, 0x3b, 0x1c5a, 0x1c5b, 0x3b, 0x1c75, 0x1c5f, 0x3b, 0x1c65, 0x1c5f, 0x1c79, 0x3b,
-0x1c65, 0x1c5f, 0x1c79, 0x1c68, 0x3b, 0x1c61, 0x1c5f, 0x1c79, 0x3b, 0x1c67, 0x1c69, 0x1c65, 0x3b, 0x1c5a, 0x3b, 0x1c75, 0x3b, 0x1c65, 0x3b, 0x1c65,
-0x3b, 0x1c61, 0x3b, 0x1c67, 0x64, 0x6f, 0x6d, 0xec, 0x6e, 0x69, 0x67, 0x61, 0x3b, 0x6c, 0x75, 0x6e, 0x69, 0x73, 0x3b, 0x6d,
-0x61, 0x72, 0x74, 0x69, 0x73, 0x3b, 0x6d, 0xe8, 0x72, 0x63, 0x75, 0x72, 0x69, 0x73, 0x3b, 0x67, 0x69, 0xf2, 0x62, 0x69,
-0x61, 0x3b, 0x63, 0x68, 0x65, 0x6e, 0xe0, 0x62, 0x75, 0x72, 0x61, 0x3b, 0x73, 0xe0, 0x62, 0x61, 0x64, 0x75, 0x64, 0x6f,
-0x6d, 0x3b, 0x6c, 0x75, 0x6e, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x6d, 0xe8, 0x72, 0x3b, 0x67, 0x69, 0xf2, 0x3b, 0x63, 0x68,
-0x65, 0x3b, 0x73, 0xe0, 0x62, 0x44, 0x3b, 0x4c, 0x3b, 0x4d, 0x3b, 0x4d, 0x3b, 0x47, 0x3b, 0x43, 0x3b, 0x53, 0x44, 0x69,
-0x6d, 0x69, 0x6e, 0x67, 0x75, 0x3b, 0x43, 0x68, 0x69, 0x70, 0x6f, 0x73, 0x69, 0x3b, 0x43, 0x68, 0x69, 0x70, 0x69, 0x72,
-0x69, 0x3b, 0x43, 0x68, 0x69, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x43, 0x68, 0x69, 0x6e, 0x61, 0x69, 0x3b, 0x43, 0x68, 0x69,
-0x73, 0x68, 0x61, 0x6e, 0x75, 0x3b, 0x53, 0x61, 0x62, 0x75, 0x64, 0x75, 0x44, 0x69, 0x6d, 0x3b, 0x50, 0x6f, 0x73, 0x3b,
-0x50, 0x69, 0x72, 0x3b, 0x54, 0x61, 0x74, 0x3b, 0x4e, 0x61, 0x69, 0x3b, 0x53, 0x68, 0x61, 0x3b, 0x53, 0x61, 0x62, 0x44,
-0x3b, 0x50, 0x3b, 0x43, 0x3b, 0x54, 0x3b, 0x4e, 0x3b, 0x53, 0x3b, 0x53, 0x43d, 0x435, 0x434, 0x435, 0x459, 0x430, 0x3b, 0x43f,
-0x43e, 0x43d, 0x435, 0x434, 0x435, 0x459, 0x430, 0x43a, 0x3b, 0x443, 0x442, 0x43e, 0x440, 0x430, 0x43a, 0x3b, 0x441, 0x440, 0x435, 0x434,
-0x430, 0x3b, 0x447, 0x435, 0x442, 0x432, 0x440, 0x442, 0x430, 0x43a, 0x3b, 0x43f, 0x435, 0x442, 0x430, 0x43a, 0x3b, 0x441, 0x443, 0x431,
-0x43e, 0x442, 0x430, 0x43d, 0x435, 0x434, 0x3b, 0x43f, 0x43e, 0x43d, 0x3b, 0x443, 0x442, 0x43e, 0x3b, 0x441, 0x440, 0x435, 0x3b, 0x447,
-0x435, 0x442, 0x3b, 0x43f, 0x435, 0x442, 0x3b, 0x441, 0x443, 0x431, 0x43d, 0x435, 0x434, 0x458, 0x435, 0x459, 0x430, 0x3b, 0x43f, 0x43e,
-0x43d, 0x435, 0x434, 0x435, 0x459, 0x430, 0x43a, 0x3b, 0x443, 0x442, 0x43e, 0x440, 0x430, 0x43a, 0x3b, 0x441, 0x440, 0x438, 0x458, 0x435,
-0x434, 0x430, 0x3b, 0x447, 0x435, 0x442, 0x432, 0x440, 0x442, 0x430, 0x43a, 0x3b, 0x43f, 0x435, 0x442, 0x430, 0x43a, 0x3b, 0x441, 0x443,
-0x431, 0x43e, 0x442, 0x430, 0x6e, 0x65, 0x64, 0x3b, 0x70, 0x6f, 0x6e, 0x3b, 0x75, 0x74, 0x6f, 0x3b, 0x73, 0x72, 0x65, 0x3b,
-0x10d, 0x65, 0x74, 0x3b, 0x70, 0x65, 0x74, 0x3b, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x64, 0x65, 0x6c, 0x6a, 0x61, 0x3b, 0x70,
-0x6f, 0x6e, 0x65, 0x64, 0x65, 0x6c, 0x6a, 0x61, 0x6b, 0x3b, 0x75, 0x74, 0x6f, 0x72, 0x61, 0x6b, 0x3b, 0x73, 0x72, 0x65,
-0x64, 0x61, 0x3b, 0x10d, 0x65, 0x74, 0x76, 0x72, 0x74, 0x61, 0x6b, 0x3b, 0x70, 0x65, 0x74, 0x61, 0x6b, 0x3b, 0x73, 0x75,
-0x62, 0x6f, 0x74, 0x61, 0x6e, 0x65, 0x64, 0x6a, 0x65, 0x6c, 0x6a, 0x61, 0x3b, 0x70, 0x6f, 0x6e, 0x65, 0x64, 0x65, 0x6c,
-0x6a, 0x61, 0x6b, 0x3b, 0x75, 0x74, 0x6f, 0x72, 0x61, 0x6b, 0x3b, 0x73, 0x72, 0x69, 0x6a, 0x65, 0x64, 0x61, 0x3b, 0x10d,
-0x65, 0x74, 0x76, 0x72, 0x74, 0x61, 0x6b, 0x3b, 0x70, 0x65, 0x74, 0x61, 0x6b, 0x3b, 0x73, 0x75, 0x62, 0x6f, 0x74, 0x61,
-0x4a, 0x75, 0x6d, 0x61, 0x61, 0x70, 0x69, 0x69, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x61, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x4a,
-0x75, 0x6d, 0x61, 0x61, 0x6e, 0x65, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x41, 0x6c, 0x68,
-0x61, 0x6d, 0x69, 0x73, 0x69, 0x3b, 0x49, 0x6a, 0x75, 0x6d, 0x61, 0x61, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x61, 0x6d, 0x6f,
-0x73, 0x69, 0x4a, 0x70, 0x69, 0x3b, 0x4a, 0x74, 0x74, 0x3b, 0x4a, 0x6d, 0x6e, 0x3b, 0x4a, 0x74, 0x6e, 0x3b, 0x41, 0x6c,
-0x68, 0x3b, 0x49, 0x6a, 0x75, 0x3b, 0x4a, 0x6d, 0x6f, 0x32, 0x3b, 0x33, 0x3b, 0x34, 0x3b, 0x35, 0x3b, 0x41, 0x3b, 0x49,
-0x3b, 0x31, 0x53, 0x76, 0x6f, 0x6e, 0x64, 0x6f, 0x3b, 0x4d, 0x75, 0x76, 0x68, 0x75, 0x72, 0x6f, 0x3b, 0x43, 0x68, 0x69,
-0x70, 0x69, 0x72, 0x69, 0x3b, 0x43, 0x68, 0x69, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x43, 0x68, 0x69, 0x6e, 0x61, 0x3b, 0x43,
-0x68, 0x69, 0x73, 0x68, 0x61, 0x6e, 0x75, 0x3b, 0x4d, 0x75, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x53, 0x76, 0x6f, 0x3b,
-0x4d, 0x75, 0x76, 0x3b, 0x43, 0x68, 0x70, 0x3b, 0x43, 0x68, 0x74, 0x3b, 0x43, 0x68, 0x6e, 0x3b, 0x43, 0x68, 0x73, 0x3b,
-0x4d, 0x75, 0x67, 0x53, 0x3b, 0x4d, 0x3b, 0x43, 0x3b, 0x43, 0x3b, 0x43, 0x3b, 0x43, 0x3b, 0x4d, 0xa46d, 0xa18f, 0xa44d, 0x3b,
-0xa18f, 0xa282, 0xa2cd, 0x3b, 0xa18f, 0xa282, 0xa44d, 0x3b, 0xa18f, 0xa282, 0xa315, 0x3b, 0xa18f, 0xa282, 0xa1d6, 0x3b, 0xa18f, 0xa282, 0xa26c, 0x3b,
-0xa18f, 0xa282, 0xa0d8, 0xa46d, 0xa18f, 0x3b, 0xa18f, 0xa2cd, 0x3b, 0xa18f, 0xa44d, 0x3b, 0xa18f, 0xa315, 0x3b, 0xa18f, 0xa1d6, 0x3b, 0xa18f, 0xa26c,
-0x3b, 0xa18f, 0xa0d8, 0xa18f, 0x3b, 0xa2cd, 0x3b, 0xa44d, 0x3b, 0xa315, 0x3b, 0xa1d6, 0x3b, 0xa26c, 0x3b, 0xa0d8, 0x622, 0x686, 0x631, 0x3b,
-0x633, 0x648, 0x645, 0x631, 0x3b, 0x627, 0x6b1, 0x627, 0x631, 0x648, 0x3b, 0x627, 0x631, 0x628, 0x639, 0x3b, 0x62e, 0x645, 0x64a, 0x633,
-0x3b, 0x62c, 0x645, 0x639, 0x648, 0x3b, 0x687, 0x646, 0x687, 0x631, 0x622, 0x686, 0x631, 0x3b, 0x633, 0x648, 0x3b, 0x627, 0x6b1, 0x627,
-0x631, 0x648, 0x3b, 0x627, 0x631, 0x628, 0x639, 0x3b, 0x62e, 0x645, 0x3b, 0x62c, 0x645, 0x639, 0x648, 0x3b, 0x687, 0x646, 0x687, 0x631,
-0x906, 0x930, 0x94d, 0x924, 0x3b, 0x938, 0x942, 0x3b, 0x92e, 0x902, 0x3b, 0x92c, 0x941, 0x952, 0x927, 0x3b, 0x935, 0x93f, 0x938, 0x3b,
-0x91c, 0x941, 0x92e, 0x3b, 0x91b, 0x902, 0x91b, 0x906, 0x930, 0x94d, 0x924, 0x935, 0x93e, 0x930, 0x3b, 0x938, 0x942, 0x92e, 0x930, 0x3b,
-0x92e, 0x902, 0x917, 0x932, 0x941, 0x3b, 0x92c, 0x941, 0x952, 0x927, 0x930, 0x3b, 0x935, 0x93f, 0x938, 0x94d, 0x92a, 0x924, 0x3b, 0x91c,
-0x941, 0x92e, 0x94b, 0x3b, 0x91b, 0x902, 0x91b, 0x930, 0x906, 0x3b, 0x938, 0x942, 0x3b, 0x92e, 0x902, 0x3b, 0x92c, 0x941, 0x927, 0x3b,
-0x935, 0x93f, 0x938, 0x3b, 0x91c, 0x941, 0x3b, 0x91b, 0x902, 0x91b, 0x906, 0x930, 0x94d, 0x924, 0x3b, 0x938, 0x942, 0x3b, 0x92e, 0x902,
-0x917, 0x3b, 0x92c, 0x941, 0x952, 0x927, 0x3b, 0x935, 0x93f, 0x938, 0x3b, 0x91c, 0x941, 0x92e, 0x3b, 0x91b, 0x902, 0x91b, 0x906, 0x3b,
-0x938, 0x942, 0x3b, 0x92e, 0x902, 0x3b, 0x92c, 0x941, 0x952, 0x3b, 0x935, 0x93f, 0x3b, 0x91c, 0x941, 0x3b, 0x91b, 0x902, 0xd89, 0xdbb,
-0xdd2, 0xdaf, 0xdcf, 0x3b, 0xdc3, 0xdb3, 0xdd4, 0xdaf, 0xdcf, 0x3b, 0xd85, 0xd9f, 0xdc4, 0xdbb, 0xdd4, 0xdc0, 0xdcf, 0xdaf, 0xdcf, 0x3b,
-0xdb6, 0xdaf, 0xdcf, 0xdaf, 0xdcf, 0x3b, 0xdb6, 0xdca, 0x200d, 0xdbb, 0xdc4, 0xdc3, 0xdca, 0xdb4, 0xdad, 0xdd2, 0xdb1, 0xdca, 0xdaf, 0xdcf,
-0x3b, 0xdc3, 0xdd2, 0xd9a, 0xdd4, 0xdbb, 0xdcf, 0xdaf, 0xdcf, 0x3b, 0xdc3, 0xdd9, 0xdb1, 0xdc3, 0xdd4, 0xdbb, 0xdcf, 0xdaf, 0xdcf, 0xd89,
-0xdbb, 0xdd2, 0xdaf, 0xdcf, 0x3b, 0xdc3, 0xdb3, 0xdd4, 0xdaf, 0xdcf, 0x3b, 0xd85, 0xd9f, 0xdc4, 0x3b, 0xdb6, 0xdaf, 0xdcf, 0xdaf, 0xdcf,
-0x3b, 0xdb6, 0xdca, 0x200d, 0xdbb, 0xdc4, 0xdc3, 0xdca, 0x3b, 0xdc3, 0xdd2, 0xd9a, 0xdd4, 0x3b, 0xdc3, 0xdd9, 0xdb1, 0xd89, 0x3b, 0xdc3,
-0x3b, 0xd85, 0x3b, 0xdb6, 0x3b, 0xdb6, 0xdca, 0x200d, 0xdbb, 0x3b, 0xdc3, 0xdd2, 0x3b, 0xdc3, 0xdd9, 0x6e, 0x65, 0x64, 0x65, 0x13e,
-0x61, 0x3b, 0x70, 0x6f, 0x6e, 0x64, 0x65, 0x6c, 0x6f, 0x6b, 0x3b, 0x75, 0x74, 0x6f, 0x72, 0x6f, 0x6b, 0x3b, 0x73, 0x74,
-0x72, 0x65, 0x64, 0x61, 0x3b, 0x161, 0x74, 0x76, 0x72, 0x74, 0x6f, 0x6b, 0x3b, 0x70, 0x69, 0x61, 0x74, 0x6f, 0x6b, 0x3b,
-0x73, 0x6f, 0x62, 0x6f, 0x74, 0x61, 0x6e, 0x65, 0x3b, 0x70, 0x6f, 0x3b, 0x75, 0x74, 0x3b, 0x73, 0x74, 0x3b, 0x161, 0x74,
-0x3b, 0x70, 0x69, 0x3b, 0x73, 0x6f, 0x6e, 0x3b, 0x70, 0x3b, 0x75, 0x3b, 0x73, 0x3b, 0x161, 0x3b, 0x70, 0x3b, 0x73, 0x6e,
-0x65, 0x64, 0x65, 0x6c, 0x6a, 0x61, 0x3b, 0x70, 0x6f, 0x6e, 0x65, 0x64, 0x65, 0x6c, 0x6a, 0x65, 0x6b, 0x3b, 0x74, 0x6f,
-0x72, 0x65, 0x6b, 0x3b, 0x73, 0x72, 0x65, 0x64, 0x61, 0x3b, 0x10d, 0x65, 0x74, 0x72, 0x74, 0x65, 0x6b, 0x3b, 0x70, 0x65,
-0x74, 0x65, 0x6b, 0x3b, 0x73, 0x6f, 0x62, 0x6f, 0x74, 0x61, 0x6e, 0x65, 0x64, 0x2e, 0x3b, 0x70, 0x6f, 0x6e, 0x2e, 0x3b,
-0x74, 0x6f, 0x72, 0x2e, 0x3b, 0x73, 0x72, 0x65, 0x2e, 0x3b, 0x10d, 0x65, 0x74, 0x2e, 0x3b, 0x70, 0x65, 0x74, 0x2e, 0x3b,
-0x73, 0x6f, 0x62, 0x2e, 0x6e, 0x3b, 0x70, 0x3b, 0x74, 0x3b, 0x73, 0x3b, 0x10d, 0x3b, 0x70, 0x3b, 0x73, 0x53, 0x61, 0x62,
-0x69, 0x69, 0x74, 0x69, 0x3b, 0x42, 0x61, 0x6c, 0x61, 0x7a, 0x61, 0x3b, 0x4f, 0x77, 0x6f, 0x6b, 0x75, 0x62, 0x69, 0x6c,
-0x69, 0x3b, 0x4f, 0x77, 0x6f, 0x6b, 0x75, 0x73, 0x61, 0x74, 0x75, 0x3b, 0x4f, 0x6c, 0x6f, 0x6b, 0x75, 0x6e, 0x61, 0x3b,
-0x4f, 0x6c, 0x6f, 0x6b, 0x75, 0x74, 0x61, 0x61, 0x6e, 0x75, 0x3b, 0x4f, 0x6c, 0x6f, 0x6d, 0x75, 0x6b, 0x61, 0x61, 0x67,
-0x61, 0x53, 0x61, 0x62, 0x69, 0x3b, 0x42, 0x61, 0x6c, 0x61, 0x3b, 0x4b, 0x75, 0x62, 0x69, 0x3b, 0x4b, 0x75, 0x73, 0x61,
-0x3b, 0x4b, 0x75, 0x6e, 0x61, 0x3b, 0x4b, 0x75, 0x74, 0x61, 0x3b, 0x4d, 0x75, 0x6b, 0x61, 0x53, 0x3b, 0x42, 0x3b, 0x42,
-0x3b, 0x53, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4d, 0x41, 0x78, 0x61, 0x64, 0x3b, 0x49, 0x73, 0x6e, 0x69, 0x69, 0x6e, 0x3b,
-0x54, 0x61, 0x6c, 0x61, 0x61, 0x64, 0x6f, 0x3b, 0x41, 0x72, 0x62, 0x61, 0x63, 0x6f, 0x3b, 0x4b, 0x68, 0x61, 0x6d, 0x69,
-0x69, 0x73, 0x3b, 0x4a, 0x69, 0x6d, 0x63, 0x6f, 0x3b, 0x53, 0x61, 0x62, 0x74, 0x69, 0x41, 0x78, 0x64, 0x3b, 0x49, 0x73,
-0x6e, 0x3b, 0x54, 0x6c, 0x64, 0x6f, 0x3b, 0x41, 0x72, 0x62, 0x63, 0x3b, 0x4b, 0x68, 0x6d, 0x73, 0x3b, 0x4a, 0x6d, 0x63,
-0x3b, 0x53, 0x62, 0x74, 0x69, 0x41, 0x3b, 0x49, 0x3b, 0x54, 0x3b, 0x41, 0x3b, 0x4b, 0x68, 0x3b, 0x4a, 0x3b, 0x53, 0x64,
-0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x6f, 0x3b, 0x6c, 0x75, 0x6e, 0x65, 0x73, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x65, 0x73, 0x3b,
-0x6d, 0x69, 0xe9, 0x72, 0x63, 0x6f, 0x6c, 0x65, 0x73, 0x3b, 0x6a, 0x75, 0x65, 0x76, 0x65, 0x73, 0x3b, 0x76, 0x69, 0x65,
-0x72, 0x6e, 0x65, 0x73, 0x3b, 0x73, 0xe1, 0x62, 0x61, 0x64, 0x6f, 0x64, 0x6f, 0x6d, 0x3b, 0x6c, 0x75, 0x6e, 0x3b, 0x6d,
-0x61, 0x72, 0x3b, 0x6d, 0x69, 0xe9, 0x3b, 0x6a, 0x75, 0x65, 0x3b, 0x76, 0x69, 0x65, 0x3b, 0x73, 0xe1, 0x62, 0x2d30, 0x2d59,
-0x2d30, 0x2d4e, 0x2d30, 0x2d59, 0x3b, 0x2d30, 0x2d62, 0x2d4f, 0x2d30, 0x2d59, 0x3b, 0x2d30, 0x2d59, 0x2d49, 0x2d4f, 0x2d30, 0x2d59, 0x3b, 0x2d30, 0x2d3d,
-0x2d55, 0x2d30, 0x2d59, 0x3b, 0x2d30, 0x2d3d, 0x2d61, 0x2d30, 0x2d59, 0x3b, 0x2d30, 0x2d59, 0x2d49, 0x2d4e, 0x2d61, 0x2d30, 0x2d59, 0x3b, 0x2d30, 0x2d59,
-0x2d49, 0x2d39, 0x2d62, 0x2d30, 0x2d59, 0x2d30, 0x2d59, 0x2d30, 0x3b, 0x2d30, 0x2d62, 0x2d4f, 0x3b, 0x2d30, 0x2d59, 0x2d49, 0x3b, 0x2d30, 0x2d3d, 0x2d55,
-0x3b, 0x2d30, 0x2d3d, 0x2d61, 0x3b, 0x2d30, 0x2d59, 0x2d49, 0x2d4e, 0x3b, 0x2d30, 0x2d59, 0x2d49, 0x2d39, 0x4d, 0x69, 0x6e, 0x67, 0x67, 0x75,
-0x3b, 0x53, 0x65, 0x6e, 0xe9, 0x6e, 0x3b, 0x53, 0x61, 0x6c, 0x61, 0x73, 0x61, 0x3b, 0x52, 0x65, 0x62, 0x6f, 0x3b, 0x4b,
-0x65, 0x6d, 0x69, 0x73, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x61, 0x68, 0x3b, 0x53, 0x61, 0x70, 0x74, 0x75, 0x4d, 0x6e, 0x67,
-0x3b, 0x53, 0x65, 0x6e, 0x3b, 0x53, 0x61, 0x6c, 0x3b, 0x52, 0x65, 0x62, 0x3b, 0x4b, 0x65, 0x6d, 0x3b, 0x4a, 0x75, 0x6d,
-0x3b, 0x53, 0x61, 0x70, 0x73, 0xf6, 0x6e, 0x64, 0x61, 0x67, 0x3b, 0x6d, 0xe5, 0x6e, 0x64, 0x61, 0x67, 0x3b, 0x74, 0x69,
-0x73, 0x64, 0x61, 0x67, 0x3b, 0x6f, 0x6e, 0x73, 0x64, 0x61, 0x67, 0x3b, 0x74, 0x6f, 0x72, 0x73, 0x64, 0x61, 0x67, 0x3b,
-0x66, 0x72, 0x65, 0x64, 0x61, 0x67, 0x3b, 0x6c, 0xf6, 0x72, 0x64, 0x61, 0x67, 0x73, 0xf6, 0x6e, 0x3b, 0x6d, 0xe5, 0x6e,
-0x3b, 0x74, 0x69, 0x73, 0x3b, 0x6f, 0x6e, 0x73, 0x3b, 0x74, 0x6f, 0x72, 0x73, 0x3b, 0x66, 0x72, 0x65, 0x3b, 0x6c, 0xf6,
-0x72, 0x53, 0x75, 0x6e, 0x6e, 0x74, 0x69, 0x67, 0x3b, 0x4d, 0xe4, 0xe4, 0x6e, 0x74, 0x69, 0x67, 0x3b, 0x5a, 0x69, 0x69,
-0x73, 0x63, 0x68, 0x74, 0x69, 0x67, 0x3b, 0x4d, 0x69, 0x74, 0x74, 0x77, 0x75, 0x63, 0x68, 0x3b, 0x44, 0x75, 0x6e, 0x73,
-0x63, 0x68, 0x74, 0x69, 0x67, 0x3b, 0x46, 0x72, 0x69, 0x69, 0x74, 0x69, 0x67, 0x3b, 0x53, 0x61, 0x6d, 0x73, 0x63, 0x68,
-0x74, 0x69, 0x67, 0x53, 0x75, 0x2e, 0x3b, 0x4d, 0xe4, 0x2e, 0x3b, 0x5a, 0x69, 0x2e, 0x3b, 0x4d, 0x69, 0x2e, 0x3b, 0x44,
-0x75, 0x2e, 0x3b, 0x46, 0x72, 0x2e, 0x3b, 0x53, 0x61, 0x2e, 0x2d30, 0x2d59, 0x2d30, 0x2d4e, 0x2d30, 0x2d59, 0x3b, 0x2d30, 0x2d62, 0x2d4f,
-0x2d30, 0x2d59, 0x3b, 0x2d30, 0x2d59, 0x2d49, 0x2d4f, 0x2d30, 0x2d59, 0x3b, 0x2d30, 0x2d3d, 0x2d55, 0x2d30, 0x2d59, 0x3b, 0x2d30, 0x2d3d, 0x2d61, 0x2d30,
-0x2d59, 0x3b, 0x2d59, 0x2d49, 0x2d4e, 0x2d61, 0x2d30, 0x2d59, 0x3b, 0x2d30, 0x2d59, 0x2d49, 0x2d39, 0x2d62, 0x2d30, 0x2d59, 0x61, 0x73, 0x61, 0x6d,
-0x61, 0x73, 0x3b, 0x61, 0x79, 0x6e, 0x61, 0x73, 0x3b, 0x61, 0x73, 0x69, 0x6e, 0x61, 0x73, 0x3b, 0x61, 0x6b, 0x1e5b, 0x61,
-0x73, 0x3b, 0x61, 0x6b, 0x77, 0x61, 0x73, 0x3b, 0x61, 0x73, 0x69, 0x6d, 0x77, 0x61, 0x73, 0x3b, 0x61, 0x73, 0x69, 0x1e0d,
-0x79, 0x61, 0x73, 0x61, 0x73, 0x61, 0x3b, 0x61, 0x79, 0x6e, 0x3b, 0x61, 0x73, 0x69, 0x3b, 0x61, 0x6b, 0x1e5b, 0x3b, 0x61,
-0x6b, 0x77, 0x3b, 0x61, 0x73, 0x69, 0x6d, 0x3b, 0x61, 0x73, 0x69, 0x1e0d, 0x49, 0x74, 0x75, 0x6b, 0x75, 0x20, 0x6a, 0x61,
-0x20, 0x6a, 0x75, 0x6d, 0x77, 0x61, 0x3b, 0x4b, 0x75, 0x72, 0x61, 0x6d, 0x75, 0x6b, 0x61, 0x20, 0x6a, 0x69, 0x6d, 0x77,
-0x65, 0x72, 0x69, 0x3b, 0x4b, 0x75, 0x72, 0x61, 0x6d, 0x75, 0x6b, 0x61, 0x20, 0x6b, 0x61, 0x77, 0x69, 0x3b, 0x4b, 0x75,
-0x72, 0x61, 0x6d, 0x75, 0x6b, 0x61, 0x20, 0x6b, 0x61, 0x64, 0x61, 0x64, 0x75, 0x3b, 0x4b, 0x75, 0x72, 0x61, 0x6d, 0x75,
-0x6b, 0x61, 0x20, 0x6b, 0x61, 0x6e, 0x61, 0x3b, 0x4b, 0x75, 0x72, 0x61, 0x6d, 0x75, 0x6b, 0x61, 0x20, 0x6b, 0x61, 0x73,
-0x61, 0x6e, 0x75, 0x3b, 0x4b, 0x69, 0x66, 0x75, 0x6c, 0x61, 0x20, 0x6e, 0x67, 0x75, 0x77, 0x6f, 0x4a, 0x75, 0x6d, 0x3b,
-0x4a, 0x69, 0x6d, 0x3b, 0x4b, 0x61, 0x77, 0x3b, 0x4b, 0x61, 0x64, 0x3b, 0x4b, 0x61, 0x6e, 0x3b, 0x4b, 0x61, 0x73, 0x3b,
-0x4e, 0x67, 0x75, 0x4a, 0x3b, 0x4a, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4e, 0x42f, 0x43a, 0x448, 0x430,
-0x43d, 0x431, 0x435, 0x3b, 0x414, 0x443, 0x448, 0x430, 0x43d, 0x431, 0x435, 0x3b, 0x421, 0x435, 0x448, 0x430, 0x43d, 0x431, 0x435, 0x3b,
-0x427, 0x43e, 0x440, 0x448, 0x430, 0x43d, 0x431, 0x435, 0x3b, 0x41f, 0x430, 0x43d, 0x4b7, 0x448, 0x430, 0x43d, 0x431, 0x435, 0x3b, 0x4b6,
-0x443, 0x43c, 0x44a, 0x430, 0x3b, 0x428, 0x430, 0x43d, 0x431, 0x435, 0x42f, 0x448, 0x431, 0x3b, 0x414, 0x448, 0x431, 0x3b, 0x421, 0x448,
-0x431, 0x3b, 0x427, 0x448, 0x431, 0x3b, 0x41f, 0x448, 0x431, 0x3b, 0x4b6, 0x43c, 0x44a, 0x3b, 0x428, 0x43d, 0x431, 0x42f, 0x3b, 0x414,
-0x3b, 0x421, 0x3b, 0x427, 0x3b, 0x41f, 0x3b, 0x4b6, 0x3b, 0x428, 0xb9e, 0xbbe, 0xbaf, 0xbbf, 0xbb1, 0xbc1, 0x3b, 0xba4, 0xbbf, 0xb99,
-0xbcd, 0xb95, 0xbb3, 0xbcd, 0x3b, 0xb9a, 0xbc6, 0xbb5, 0xbcd, 0xbb5, 0xbbe, 0xbaf, 0xbcd, 0x3b, 0xbaa, 0xbc1, 0xba4, 0xba9, 0xbcd, 0x3b,
-0xbb5, 0xbbf, 0xbaf, 0xbbe, 0xbb4, 0xba9, 0xbcd, 0x3b, 0xbb5, 0xbc6, 0xbb3, 0xbcd, 0xbb3, 0xbbf, 0x3b, 0xb9a, 0xba9, 0xbbf, 0xb9e, 0xbbe,
-0xbaf, 0xbbf, 0x2e, 0x3b, 0xba4, 0xbbf, 0xb99, 0xbcd, 0x2e, 0x3b, 0xb9a, 0xbc6, 0xbb5, 0xbcd, 0x2e, 0x3b, 0xbaa, 0xbc1, 0xba4, 0x2e,
-0x3b, 0xbb5, 0xbbf, 0xbaf, 0xbbe, 0x2e, 0x3b, 0xbb5, 0xbc6, 0xbb3, 0xbcd, 0x2e, 0x3b, 0xb9a, 0xba9, 0xbbf, 0xb9e, 0xbbe, 0x3b, 0xba4,
-0xbbf, 0x3b, 0xb9a, 0xbc6, 0x3b, 0xbaa, 0xbc1, 0x3b, 0xbb5, 0xbbf, 0x3b, 0xbb5, 0xbc6, 0x3b, 0xb9a, 0x44f, 0x43a, 0x448, 0x4d9, 0x43c,
-0x431, 0x435, 0x3b, 0x434, 0x4af, 0x448, 0x4d9, 0x43c, 0x431, 0x435, 0x3b, 0x441, 0x438, 0x448, 0x4d9, 0x43c, 0x431, 0x435, 0x3b, 0x447,
-0x4d9, 0x440, 0x448, 0x4d9, 0x43c, 0x431, 0x435, 0x3b, 0x43f, 0x4d9, 0x43d, 0x497, 0x435, 0x448, 0x4d9, 0x43c, 0x431, 0x435, 0x3b, 0x497,
-0x43e, 0x43c, 0x433, 0x430, 0x3b, 0x448, 0x438, 0x43c, 0x431, 0x4d9, 0x44f, 0x43a, 0x448, 0x2e, 0x3b, 0x434, 0x4af, 0x448, 0x2e, 0x3b,
-0x441, 0x438, 0x448, 0x2e, 0x3b, 0x447, 0x4d9, 0x440, 0x2e, 0x3b, 0x43f, 0x4d9, 0x43d, 0x497, 0x2e, 0x3b, 0x497, 0x43e, 0x43c, 0x2e,
-0x3b, 0x448, 0x438, 0x43c, 0x2e, 0x42f, 0x3b, 0x414, 0x3b, 0x421, 0x3b, 0x427, 0x3b, 0x41f, 0x3b, 0x496, 0x3b, 0x428, 0xc06, 0xc26,
-0xc3f, 0xc35, 0xc3e, 0xc30, 0xc02, 0x3b, 0xc38, 0xc4b, 0xc2e, 0xc35, 0xc3e, 0xc30, 0xc02, 0x3b, 0xc2e, 0xc02, 0xc17, 0xc33, 0xc35, 0xc3e,
-0xc30, 0xc02, 0x3b, 0xc2c, 0xc41, 0xc27, 0xc35, 0xc3e, 0xc30, 0xc02, 0x3b, 0xc17, 0xc41, 0xc30, 0xc41, 0xc35, 0xc3e, 0xc30, 0xc02, 0x3b,
-0xc36, 0xc41, 0xc15, 0xc4d, 0xc30, 0xc35, 0xc3e, 0xc30, 0xc02, 0x3b, 0xc36, 0xc28, 0xc3f, 0xc35, 0xc3e, 0xc30, 0xc02, 0xc06, 0xc26, 0xc3f,
-0x3b, 0xc38, 0xc4b, 0xc2e, 0x3b, 0xc2e, 0xc02, 0xc17, 0xc33, 0x3b, 0xc2c, 0xc41, 0xc27, 0x3b, 0xc17, 0xc41, 0xc30, 0xc41, 0x3b, 0xc36,
-0xc41, 0xc15, 0xc4d, 0xc30, 0x3b, 0xc36, 0xc28, 0xc3f, 0xc06, 0x3b, 0xc38, 0xc4b, 0x3b, 0xc2e, 0x3b, 0xc2c, 0xc41, 0x3b, 0xc17, 0xc41,
-0x3b, 0xc36, 0xc41, 0x3b, 0xc36, 0x4e, 0x61, 0x6b, 0x61, 0x65, 0x6a, 0x75, 0x6d, 0x61, 0x3b, 0x4e, 0x61, 0x6b, 0x61, 0x65,
-0x62, 0x61, 0x72, 0x61, 0x73, 0x61, 0x3b, 0x4e, 0x61, 0x6b, 0x61, 0x61, 0x72, 0x65, 0x3b, 0x4e, 0x61, 0x6b, 0x61, 0x75,
-0x6e, 0x69, 0x3b, 0x4e, 0x61, 0x6b, 0x61, 0x75, 0x6e, 0x67, 0x2019, 0x6f, 0x6e, 0x3b, 0x4e, 0x61, 0x6b, 0x61, 0x6b, 0x61,
-0x6e, 0x79, 0x3b, 0x4e, 0x61, 0x6b, 0x61, 0x73, 0x61, 0x62, 0x69, 0x74, 0x69, 0x4a, 0x75, 0x6d, 0x3b, 0x42, 0x61, 0x72,
-0x3b, 0x41, 0x61, 0x72, 0x3b, 0x55, 0x6e, 0x69, 0x3b, 0x55, 0x6e, 0x67, 0x3b, 0x4b, 0x61, 0x6e, 0x3b, 0x53, 0x61, 0x62,
-0x4a, 0x3b, 0x42, 0x3b, 0x41, 0x3b, 0x55, 0x3b, 0x55, 0x3b, 0x4b, 0x3b, 0x53, 0xe27, 0xe31, 0xe19, 0xe2d, 0xe32, 0xe17, 0xe34,
-0xe15, 0xe22, 0xe4c, 0x3b, 0xe27, 0xe31, 0xe19, 0xe08, 0xe31, 0xe19, 0xe17, 0xe23, 0xe4c, 0x3b, 0xe27, 0xe31, 0xe19, 0xe2d, 0xe31, 0xe07,
-0xe04, 0xe32, 0xe23, 0x3b, 0xe27, 0xe31, 0xe19, 0xe1e, 0xe38, 0xe18, 0x3b, 0xe27, 0xe31, 0xe19, 0xe1e, 0xe24, 0xe2b, 0xe31, 0xe2a, 0xe1a,
-0xe14, 0xe35, 0x3b, 0xe27, 0xe31, 0xe19, 0xe28, 0xe38, 0xe01, 0xe23, 0xe4c, 0x3b, 0xe27, 0xe31, 0xe19, 0xe40, 0xe2a, 0xe32, 0xe23, 0xe4c,
-0xe2d, 0xe32, 0x2e, 0x3b, 0xe08, 0x2e, 0x3b, 0xe2d, 0x2e, 0x3b, 0xe1e, 0x2e, 0x3b, 0xe1e, 0xe24, 0x2e, 0x3b, 0xe28, 0x2e, 0x3b,
-0xe2a, 0x2e, 0xe2d, 0xe32, 0x3b, 0xe08, 0x3b, 0xe2d, 0x3b, 0xe1e, 0x3b, 0xe1e, 0xe24, 0x3b, 0xe28, 0x3b, 0xe2a, 0xf42, 0xf5f, 0xf60,
-0xf0b, 0xf49, 0xf72, 0xf0b, 0xf58, 0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60,
-0xf0b, 0xf58, 0xf72, 0xf42, 0xf0b, 0xf51, 0xf58, 0xf62, 0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf63, 0xfb7, 0xf42, 0xf0b, 0xf54, 0xf0b,
-0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf55, 0xf74, 0xf62, 0xf0b, 0xf56, 0xf74, 0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf54, 0xf0b, 0xf66,
-0xf44, 0xf66, 0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf66, 0xfa4, 0xf7a, 0xf53, 0xf0b, 0xf54, 0xf0b, 0xf49, 0xf72, 0xf0b, 0xf58, 0xf0b,
-0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0x3b, 0xf58, 0xf72, 0xf42, 0xf0b, 0xf51, 0xf58, 0xf62, 0xf0b, 0x3b, 0xf63, 0xfb7, 0xf42, 0xf0b,
-0xf54, 0xf0b, 0x3b, 0xf55, 0xf74, 0xf62, 0xf0b, 0xf56, 0xf74, 0xf0b, 0x3b, 0xf54, 0xf0b, 0xf66, 0xf44, 0xf66, 0xf0b, 0x3b, 0xf66, 0xfa4,
-0xf7a, 0xf53, 0xf0b, 0xf54, 0xf0b, 0xf49, 0xf72, 0x3b, 0xf5f, 0xfb3, 0x3b, 0xf58, 0xf72, 0xf42, 0x3b, 0xf63, 0xfb7, 0xf42, 0x3b, 0xf55,
-0xf74, 0xf62, 0x3b, 0xf66, 0xf44, 0xf66, 0x3b, 0xf66, 0xfa4, 0xf7a, 0xf53, 0x1230, 0x1295, 0x1260, 0x1275, 0x3b, 0x1230, 0x1291, 0x12ed, 0x3b,
-0x1230, 0x1209, 0x1235, 0x3b, 0x1228, 0x1261, 0x12d5, 0x3b, 0x1213, 0x1219, 0x1235, 0x3b, 0x12d3, 0x122d, 0x1262, 0x3b, 0x1240, 0x12f3, 0x121d, 0x1230,
-0x1295, 0x3b, 0x1230, 0x1291, 0x3b, 0x1230, 0x1209, 0x3b, 0x1228, 0x1261, 0x3b, 0x1213, 0x1219, 0x3b, 0x12d3, 0x122d, 0x3b, 0x1240, 0x12f3, 0x1230,
-0x3b, 0x1230, 0x3b, 0x1230, 0x3b, 0x1228, 0x3b, 0x1213, 0x3b, 0x12d3, 0x3b, 0x1240, 0x53, 0x101, 0x70, 0x61, 0x74, 0x65, 0x3b, 0x4d,
-0x14d, 0x6e, 0x69, 0x74, 0x65, 0x3b, 0x54, 0x16b, 0x73, 0x69, 0x74, 0x65, 0x3b, 0x50, 0x75, 0x6c, 0x65, 0x6c, 0x75, 0x6c,
-0x75, 0x3b, 0x54, 0x75, 0x2bb, 0x61, 0x70, 0x75, 0x6c, 0x65, 0x6c, 0x75, 0x6c, 0x75, 0x3b, 0x46, 0x61, 0x6c, 0x61, 0x69,
-0x74, 0x65, 0x3b, 0x54, 0x6f, 0x6b, 0x6f, 0x6e, 0x61, 0x6b, 0x69, 0x53, 0x101, 0x70, 0x3b, 0x4d, 0x14d, 0x6e, 0x3b, 0x54,
-0x16b, 0x73, 0x3b, 0x50, 0x75, 0x6c, 0x3b, 0x54, 0x75, 0x2bb, 0x61, 0x3b, 0x46, 0x61, 0x6c, 0x3b, 0x54, 0x6f, 0x6b, 0x53,
-0x3b, 0x4d, 0x3b, 0x54, 0x3b, 0x50, 0x3b, 0x54, 0x3b, 0x46, 0x3b, 0x54, 0x50, 0x61, 0x7a, 0x61, 0x72, 0x3b, 0x50, 0x61,
-0x7a, 0x61, 0x72, 0x74, 0x65, 0x73, 0x69, 0x3b, 0x53, 0x61, 0x6c, 0x131, 0x3b, 0xc7, 0x61, 0x72, 0x15f, 0x61, 0x6d, 0x62,
-0x61, 0x3b, 0x50, 0x65, 0x72, 0x15f, 0x65, 0x6d, 0x62, 0x65, 0x3b, 0x43, 0x75, 0x6d, 0x61, 0x3b, 0x43, 0x75, 0x6d, 0x61,
-0x72, 0x74, 0x65, 0x73, 0x69, 0x50, 0x61, 0x7a, 0x3b, 0x50, 0x7a, 0x74, 0x3b, 0x53, 0x61, 0x6c, 0x3b, 0xc7, 0x61, 0x72,
-0x3b, 0x50, 0x65, 0x72, 0x3b, 0x43, 0x75, 0x6d, 0x3b, 0x43, 0x6d, 0x74, 0x50, 0x3b, 0x50, 0x3b, 0x53, 0x3b, 0xc7, 0x3b,
-0x50, 0x3b, 0x43, 0x3b, 0x43, 0xdd, 0x65, 0x6b, 0x15f, 0x65, 0x6e, 0x62, 0x65, 0x3b, 0x44, 0x75, 0x15f, 0x65, 0x6e, 0x62,
-0x65, 0x3b, 0x53, 0x69, 0x15f, 0x65, 0x6e, 0x62, 0x65, 0x3b, 0xc7, 0x61, 0x72, 0x15f, 0x65, 0x6e, 0x62, 0x65, 0x3b, 0x50,
-0x65, 0x6e, 0x15f, 0x65, 0x6e, 0x62, 0x65, 0x3b, 0x41, 0x6e, 0x6e, 0x61, 0x3b, 0x15e, 0x65, 0x6e, 0x62, 0x65, 0xfd, 0x65,
-0x6b, 0x15f, 0x65, 0x6e, 0x62, 0x65, 0x3b, 0x64, 0x75, 0x15f, 0x65, 0x6e, 0x62, 0x65, 0x3b, 0x73, 0x69, 0x15f, 0x65, 0x6e,
-0x62, 0x65, 0x3b, 0xe7, 0x61, 0x72, 0x15f, 0x65, 0x6e, 0x62, 0x65, 0x3b, 0x70, 0x65, 0x6e, 0x15f, 0x65, 0x6e, 0x62, 0x65,
-0x3b, 0x61, 0x6e, 0x6e, 0x61, 0x3b, 0x15f, 0x65, 0x6e, 0x62, 0x65, 0xdd, 0x65, 0x6b, 0x3b, 0x44, 0x75, 0x15f, 0x3b, 0x53,
-0x69, 0x15f, 0x3b, 0xc7, 0x61, 0x72, 0x3b, 0x50, 0x65, 0x6e, 0x3b, 0x41, 0x6e, 0x6e, 0x3b, 0x15e, 0x65, 0x6e, 0xfd, 0x65,
-0x6b, 0x3b, 0x64, 0x75, 0x15f, 0x3b, 0x73, 0x69, 0x15f, 0x3b, 0xe7, 0x61, 0x72, 0x3b, 0x70, 0x65, 0x6e, 0x3b, 0x61, 0x6e,
-0x6e, 0x3b, 0x15f, 0x65, 0x6e, 0xdd, 0x3b, 0x44, 0x3b, 0x53, 0x3b, 0xc7, 0x3b, 0x50, 0x3b, 0x41, 0x3b, 0x15e, 0x43d, 0x435,
-0x434, 0x456, 0x43b, 0x44f, 0x3b, 0x43f, 0x43e, 0x43d, 0x435, 0x434, 0x456, 0x43b, 0x43e, 0x43a, 0x3b, 0x432, 0x456, 0x432, 0x442, 0x43e,
-0x440, 0x43e, 0x43a, 0x3b, 0x441, 0x435, 0x440, 0x435, 0x434, 0x430, 0x3b, 0x447, 0x435, 0x442, 0x432, 0x435, 0x440, 0x3b, 0x43f, 0x2bc,
-0x44f, 0x442, 0x43d, 0x438, 0x446, 0x44f, 0x3b, 0x441, 0x443, 0x431, 0x43e, 0x442, 0x430, 0x41d, 0x3b, 0x41f, 0x3b, 0x412, 0x3b, 0x421,
-0x3b, 0x427, 0x3b, 0x41f, 0x3b, 0x421, 0x6e, 0x6a, 0x65, 0x64, 0x17a, 0x65, 0x6c, 0x61, 0x3b, 0x70, 0xf3, 0x6e, 0x64, 0x17a,
-0x65, 0x6c, 0x61, 0x3b, 0x77, 0x75, 0x74, 0x6f, 0x72, 0x61, 0x3b, 0x73, 0x72, 0x6a, 0x65, 0x64, 0x61, 0x3b, 0x161, 0x74,
-0x77, 0xf3, 0x72, 0x74, 0x6b, 0x3b, 0x70, 0x6a, 0x61, 0x74, 0x6b, 0x3b, 0x73, 0x6f, 0x62, 0x6f, 0x74, 0x61, 0x6e, 0x6a,
-0x65, 0x3b, 0x70, 0xf3, 0x6e, 0x3b, 0x77, 0x75, 0x74, 0x3b, 0x73, 0x72, 0x6a, 0x3b, 0x161, 0x74, 0x77, 0x3b, 0x70, 0x6a,
-0x61, 0x3b, 0x73, 0x6f, 0x62, 0x6e, 0x3b, 0x70, 0x3b, 0x77, 0x3b, 0x73, 0x3b, 0x161, 0x3b, 0x70, 0x3b, 0x73, 0x627, 0x62a,
-0x648, 0x627, 0x631, 0x3b, 0x67e, 0x6cc, 0x631, 0x3b, 0x645, 0x646, 0x6af, 0x644, 0x3b, 0x628, 0x62f, 0x6be, 0x3b, 0x62c, 0x645, 0x639,
-0x631, 0x627, 0x62a, 0x3b, 0x62c, 0x645, 0x639, 0x6c1, 0x3b, 0x6c1, 0x641, 0x62a, 0x6c1, 0x64a, 0x6d5, 0x643, 0x634, 0x6d5, 0x646, 0x628,
-0x6d5, 0x3b, 0x62f, 0x6c8, 0x634, 0x6d5, 0x646, 0x628, 0x6d5, 0x3b, 0x633, 0x6d5, 0x64a, 0x634, 0x6d5, 0x646, 0x628, 0x6d5, 0x3b, 0x686,
-0x627, 0x631, 0x634, 0x6d5, 0x646, 0x628, 0x6d5, 0x3b, 0x67e, 0x6d5, 0x64a, 0x634, 0x6d5, 0x646, 0x628, 0x6d5, 0x3b, 0x62c, 0x6c8, 0x645,
-0x6d5, 0x3b, 0x634, 0x6d5, 0x646, 0x628, 0x6d5, 0x64a, 0x6d5, 0x3b, 0x62f, 0x6c8, 0x3b, 0x633, 0x6d5, 0x3b, 0x686, 0x627, 0x3b, 0x67e,
-0x6d5, 0x3b, 0x62c, 0x6c8, 0x3b, 0x634, 0x6d5, 0x64a, 0x3b, 0x62f, 0x3b, 0x633, 0x3b, 0x686, 0x3b, 0x67e, 0x3b, 0x62c, 0x3b, 0x634,
-0x79, 0x61, 0x6b, 0x73, 0x68, 0x61, 0x6e, 0x62, 0x61, 0x3b, 0x64, 0x75, 0x73, 0x68, 0x61, 0x6e, 0x62, 0x61, 0x3b, 0x73,
-0x65, 0x73, 0x68, 0x61, 0x6e, 0x62, 0x61, 0x3b, 0x63, 0x68, 0x6f, 0x72, 0x73, 0x68, 0x61, 0x6e, 0x62, 0x61, 0x3b, 0x70,
-0x61, 0x79, 0x73, 0x68, 0x61, 0x6e, 0x62, 0x61, 0x3b, 0x6a, 0x75, 0x6d, 0x61, 0x3b, 0x73, 0x68, 0x61, 0x6e, 0x62, 0x61,
-0x59, 0x61, 0x6b, 0x3b, 0x44, 0x75, 0x73, 0x68, 0x3b, 0x53, 0x65, 0x73, 0x68, 0x3b, 0x43, 0x68, 0x6f, 0x72, 0x3b, 0x50,
-0x61, 0x79, 0x3b, 0x4a, 0x75, 0x6d, 0x3b, 0x53, 0x68, 0x61, 0x6e, 0x59, 0x3b, 0x44, 0x3b, 0x53, 0x3b, 0x43, 0x3b, 0x50,
-0x3b, 0x4a, 0x3b, 0x53, 0x6cc, 0x2e, 0x3b, 0x62f, 0x2e, 0x3b, 0x633, 0x2e, 0x3b, 0x686, 0x2e, 0x3b, 0x67e, 0x2e, 0x3b, 0x62c,
-0x2e, 0x3b, 0x634, 0x2e, 0x44f, 0x43a, 0x448, 0x430, 0x43d, 0x431, 0x430, 0x3b, 0x434, 0x443, 0x448, 0x430, 0x43d, 0x431, 0x430, 0x3b,
-0x441, 0x435, 0x448, 0x430, 0x43d, 0x431, 0x430, 0x3b, 0x447, 0x43e, 0x440, 0x448, 0x430, 0x43d, 0x431, 0x430, 0x3b, 0x43f, 0x430, 0x439,
-0x448, 0x430, 0x43d, 0x431, 0x430, 0x3b, 0x436, 0x443, 0x43c, 0x430, 0x3b, 0x448, 0x430, 0x43d, 0x431, 0x430, 0x44f, 0x43a, 0x448, 0x3b,
-0x434, 0x443, 0x448, 0x3b, 0x441, 0x435, 0x448, 0x3b, 0x447, 0x43e, 0x440, 0x3b, 0x43f, 0x430, 0x439, 0x3b, 0x436, 0x443, 0x43c, 0x3b,
-0x448, 0x430, 0x43d, 0x42f, 0x3b, 0x414, 0x3b, 0x421, 0x3b, 0x427, 0x3b, 0x41f, 0x3b, 0x416, 0x3b, 0x428, 0xa55e, 0xa54c, 0xa535, 0x3b,
-0xa5f3, 0xa5e1, 0xa609, 0x3b, 0xa55a, 0xa55e, 0xa55a, 0x3b, 0xa549, 0xa55e, 0xa552, 0x3b, 0xa549, 0xa524, 0xa546, 0xa562, 0x3b, 0xa549, 0xa524, 0xa540,
-0xa56e, 0x3b, 0xa53b, 0xa52c, 0xa533, 0x6c, 0x61, 0x68, 0x61, 0x64, 0x69, 0x3b, 0x74, 0x25b, 0x25b, 0x6e, 0x25b, 0x25b, 0x3b, 0x74,
-0x61, 0x6c, 0x61, 0x74, 0x61, 0x3b, 0x61, 0x6c, 0x61, 0x62, 0x61, 0x3b, 0x61, 0x69, 0x6d, 0x69, 0x73, 0x61, 0x3b, 0x61,
-0x69, 0x6a, 0x69, 0x6d, 0x61, 0x3b, 0x73, 0x69, 0x253, 0x69, 0x74, 0x69, 0x43, 0x68, 0x1ee7, 0x20, 0x4e, 0x68, 0x1ead, 0x74,
-0x3b, 0x54, 0x68, 0x1ee9, 0x20, 0x48, 0x61, 0x69, 0x3b, 0x54, 0x68, 0x1ee9, 0x20, 0x42, 0x61, 0x3b, 0x54, 0x68, 0x1ee9, 0x20,
-0x54, 0x1b0, 0x3b, 0x54, 0x68, 0x1ee9, 0x20, 0x4e, 0x103, 0x6d, 0x3b, 0x54, 0x68, 0x1ee9, 0x20, 0x53, 0xe1, 0x75, 0x3b, 0x54,
-0x68, 0x1ee9, 0x20, 0x42, 0x1ea3, 0x79, 0x43, 0x4e, 0x3b, 0x54, 0x68, 0x20, 0x32, 0x3b, 0x54, 0x68, 0x20, 0x33, 0x3b, 0x54,
-0x68, 0x20, 0x34, 0x3b, 0x54, 0x68, 0x20, 0x35, 0x3b, 0x54, 0x68, 0x20, 0x36, 0x3b, 0x54, 0x68, 0x20, 0x37, 0x43, 0x4e,
-0x3b, 0x54, 0x32, 0x3b, 0x54, 0x33, 0x3b, 0x54, 0x34, 0x3b, 0x54, 0x35, 0x3b, 0x54, 0x36, 0x3b, 0x54, 0x37, 0x53, 0x75,
-0x6e, 0x6e, 0x74, 0x61, 0x67, 0x3b, 0x4d, 0xe4, 0x6e, 0x74, 0x61, 0x67, 0x3b, 0x5a, 0x69, 0x161, 0x74, 0x61, 0x67, 0x3b,
-0x4d, 0x69, 0x74, 0x74, 0x77, 0x75, 0x10d, 0x3b, 0x46, 0x72, 0xf3, 0x6e, 0x74, 0x61, 0x67, 0x3b, 0x46, 0x72, 0x69, 0x74,
-0x61, 0x67, 0x3b, 0x53, 0x61, 0x6d, 0x161, 0x74, 0x61, 0x67, 0x53, 0x75, 0x6e, 0x3b, 0x4d, 0xe4, 0x6e, 0x3b, 0x5a, 0x69,
-0x161, 0x3b, 0x4d, 0x69, 0x74, 0x3b, 0x46, 0x72, 0xf3, 0x3b, 0x46, 0x72, 0x69, 0x3b, 0x53, 0x61, 0x6d, 0x53, 0x3b, 0x4d,
-0x3b, 0x5a, 0x3b, 0x4d, 0x3b, 0x46, 0x3b, 0x46, 0x3b, 0x53, 0x44, 0x79, 0x64, 0x64, 0x20, 0x53, 0x75, 0x6c, 0x3b, 0x44,
-0x79, 0x64, 0x64, 0x20, 0x4c, 0x6c, 0x75, 0x6e, 0x3b, 0x44, 0x79, 0x64, 0x64, 0x20, 0x4d, 0x61, 0x77, 0x72, 0x74, 0x68,
-0x3b, 0x44, 0x79, 0x64, 0x64, 0x20, 0x4d, 0x65, 0x72, 0x63, 0x68, 0x65, 0x72, 0x3b, 0x44, 0x79, 0x64, 0x64, 0x20, 0x49,
-0x61, 0x75, 0x3b, 0x44, 0x79, 0x64, 0x64, 0x20, 0x47, 0x77, 0x65, 0x6e, 0x65, 0x72, 0x3b, 0x44, 0x79, 0x64, 0x64, 0x20,
-0x53, 0x61, 0x64, 0x77, 0x72, 0x6e, 0x53, 0x75, 0x6c, 0x3b, 0x4c, 0x6c, 0x75, 0x6e, 0x3b, 0x4d, 0x61, 0x77, 0x3b, 0x4d,
-0x65, 0x72, 0x3b, 0x49, 0x61, 0x75, 0x3b, 0x47, 0x77, 0x65, 0x3b, 0x53, 0x61, 0x64, 0x53, 0x75, 0x6c, 0x3b, 0x4c, 0x6c,
-0x75, 0x6e, 0x3b, 0x4d, 0x61, 0x77, 0x3b, 0x4d, 0x65, 0x72, 0x3b, 0x49, 0x61, 0x75, 0x3b, 0x47, 0x77, 0x65, 0x6e, 0x3b,
-0x53, 0x61, 0x64, 0x53, 0x3b, 0x4c, 0x6c, 0x3b, 0x4d, 0x3b, 0x4d, 0x3b, 0x49, 0x3b, 0x47, 0x3b, 0x53, 0x73, 0x6e, 0x65,
-0x69, 0x6e, 0x3b, 0x6d, 0x6f, 0x61, 0x6e, 0x64, 0x65, 0x69, 0x3b, 0x74, 0x69, 0x69, 0x73, 0x64, 0x65, 0x69, 0x3b, 0x77,
-0x6f, 0x61, 0x6e, 0x73, 0x64, 0x65, 0x69, 0x3b, 0x74, 0x6f, 0x6e, 0x67, 0x65, 0x72, 0x73, 0x64, 0x65, 0x69, 0x3b, 0x66,
-0x72, 0x65, 0x65, 0x64, 0x3b, 0x73, 0x6e, 0x65, 0x6f, 0x6e, 0x73, 0x69, 0x3b, 0x6d, 0x6f, 0x3b, 0x74, 0x69, 0x3b, 0x77,
-0x6f, 0x3b, 0x74, 0x6f, 0x3b, 0x66, 0x72, 0x3b, 0x73, 0x6f, 0x44, 0x69, 0x62, 0xe9, 0x65, 0x72, 0x3b, 0x41, 0x6c, 0x74,
-0x69, 0x6e, 0x65, 0x3b, 0x54, 0x61, 0x6c, 0x61, 0x61, 0x74, 0x61, 0x3b, 0xc0, 0x6c, 0x61, 0x72, 0x62, 0x61, 0x3b, 0x41,
-0x6c, 0x78, 0x61, 0x6d, 0x69, 0x73, 0x3b, 0xc0, 0x6a, 0x6a, 0x75, 0x6d, 0x61, 0x3b, 0x41, 0x73, 0x65, 0x65, 0x72, 0x44,
-0x69, 0x62, 0x3b, 0x41, 0x6c, 0x74, 0x3b, 0x54, 0x61, 0x6c, 0x3b, 0xc0, 0x6c, 0x61, 0x3b, 0x41, 0x6c, 0x78, 0x3b, 0xc0,
-0x6a, 0x6a, 0x3b, 0x41, 0x73, 0x65, 0x43, 0x61, 0x77, 0x65, 0x3b, 0x4d, 0x76, 0x75, 0x6c, 0x6f, 0x3b, 0x4c, 0x77, 0x65,
-0x73, 0x69, 0x62, 0x69, 0x6e, 0x69, 0x3b, 0x4c, 0x77, 0x65, 0x73, 0x69, 0x74, 0x68, 0x61, 0x74, 0x68, 0x75, 0x3b, 0x4c,
-0x77, 0x65, 0x73, 0x69, 0x6e, 0x65, 0x3b, 0x4c, 0x77, 0x65, 0x73, 0x69, 0x68, 0x6c, 0x61, 0x6e, 0x75, 0x3b, 0x4d, 0x67,
-0x71, 0x69, 0x62, 0x65, 0x6c, 0x6f, 0x43, 0x61, 0x77, 0x3b, 0x4d, 0x76, 0x75, 0x3b, 0x42, 0x69, 0x6e, 0x3b, 0x54, 0x68,
-0x61, 0x3b, 0x53, 0x69, 0x6e, 0x3b, 0x48, 0x6c, 0x61, 0x3b, 0x4d, 0x67, 0x71, 0x73, 0x254, 0x301, 0x6e, 0x64, 0x69, 0x25b,
-0x3b, 0x6d, 0xf3, 0x6e, 0x64, 0x69, 0x65, 0x3b, 0x6d, 0x75, 0xe1, 0x6e, 0x79, 0xe1, 0x14b, 0x6d, 0xf3, 0x6e, 0x64, 0x69,
-0x65, 0x3b, 0x6d, 0x65, 0x74, 0xfa, 0x6b, 0x70, 0xed, 0xe1, 0x70, 0x25b, 0x3b, 0x6b, 0xfa, 0x70, 0xe9, 0x6c, 0x69, 0x6d,
-0x65, 0x74, 0xfa, 0x6b, 0x70, 0x69, 0x61, 0x70, 0x25b, 0x3b, 0x66, 0x65, 0x6c, 0xe9, 0x74, 0x65, 0x3b, 0x73, 0xe9, 0x73,
-0x65, 0x6c, 0xe9, 0x73, 0x64, 0x3b, 0x6d, 0x64, 0x3b, 0x6d, 0x77, 0x3b, 0x65, 0x74, 0x3b, 0x6b, 0x6c, 0x3b, 0x66, 0x6c,
-0x3b, 0x73, 0x73, 0x73, 0x3b, 0x6d, 0x3b, 0x6d, 0x3b, 0x65, 0x3b, 0x6b, 0x3b, 0x66, 0x3b, 0x73, 0x5d6, 0x5d5, 0x5e0, 0x5d8,
-0x5d9, 0x5e7, 0x3b, 0x5de, 0x5d0, 0x5b8, 0x5e0, 0x5d8, 0x5d9, 0x5e7, 0x3b, 0x5d3, 0x5d9, 0x5e0, 0x5e1, 0x5d8, 0x5d9, 0x5e7, 0x3b, 0x5de,
-0x5d9, 0x5d8, 0x5d5, 0x5d5, 0x5d0, 0x5da, 0x3b, 0x5d3, 0x5d0, 0x5e0, 0x5e2, 0x5e8, 0x5e9, 0x5d8, 0x5d9, 0x5e7, 0x3b, 0x5e4, 0x5bf, 0x5e8,
-0x5f2, 0x5b7, 0x5d8, 0x5d9, 0x5e7, 0x3b, 0x5e9, 0x5d1, 0x5ea, 0xc0, 0xec, 0x6b, 0xfa, 0x3b, 0x41, 0x6a, 0xe9, 0x3b, 0xcc, 0x73,
-0x1eb9, 0x301, 0x67, 0x75, 0x6e, 0x3b, 0x1ecc, 0x6a, 0x1ecd, 0x301, 0x72, 0xfa, 0x3b, 0x1ecc, 0x6a, 0x1ecd, 0x301, 0x62, 0x1ecd, 0x3b,
-0x1eb8, 0x74, 0xec, 0x3b, 0xc0, 0x62, 0xe1, 0x6d, 0x1eb9, 0x301, 0x74, 0x61, 0x1ecc, 0x6a, 0x1ecd, 0x301, 0x20, 0xc0, 0xec, 0x6b,
-0xfa, 0x3b, 0x1ecc, 0x6a, 0x1ecd, 0x301, 0x20, 0x41, 0x6a, 0xe9, 0x3b, 0x1ecc, 0x6a, 0x1ecd, 0x301, 0x20, 0xcc, 0x73, 0x1eb9, 0x301,
-0x67, 0x75, 0x6e, 0x3b, 0x1ecc, 0x6a, 0x1ecd, 0x301, 0x72, 0xfa, 0x3b, 0x1ecc, 0x6a, 0x1ecd, 0x301, 0x62, 0x1ecd, 0x3b, 0x1ecc, 0x6a,
-0x1ecd, 0x301, 0x20, 0x1eb8, 0x74, 0xec, 0x3b, 0x1ecc, 0x6a, 0x1ecd, 0x301, 0x20, 0xc0, 0x62, 0xe1, 0x6d, 0x1eb9, 0x301, 0x74, 0x61,
-0xc0, 0xec, 0x6b, 0x3b, 0x41, 0x6a, 0x3b, 0xcc, 0x73, 0x1eb9, 0x301, 0x67, 0x3b, 0x1ecc, 0x6a, 0x1ecd, 0x301, 0x72, 0x3b, 0x1ecc,
-0x6a, 0x1ecd, 0x301, 0x62, 0x3b, 0x1eb8, 0x74, 0x3b, 0xc0, 0x62, 0xe1, 0x6d, 0xc0, 0x3b, 0x41, 0x3b, 0xcc, 0x3b, 0x1ecc, 0x3b,
-0x1ecc, 0x3b, 0x1eb8, 0x3b, 0xc0, 0xc0, 0xec, 0x6b, 0xfa, 0x3b, 0x41, 0x6a, 0xe9, 0x3b, 0xcc, 0x73, 0x25b, 0x301, 0x67, 0x75,
-0x6e, 0x3b, 0x186, 0x6a, 0x254, 0x301, 0x72, 0xfa, 0x3b, 0x186, 0x6a, 0x254, 0x301, 0x62, 0x254, 0x3b, 0x190, 0x74, 0xec, 0x3b,
-0xc0, 0x62, 0xe1, 0x6d, 0x25b, 0x301, 0x74, 0x61, 0x186, 0x6a, 0x254, 0x301, 0x20, 0xc0, 0xec, 0x6b, 0xfa, 0x3b, 0x186, 0x6a,
-0x254, 0x301, 0x20, 0x41, 0x6a, 0xe9, 0x3b, 0x186, 0x6a, 0x254, 0x301, 0x20, 0xcc, 0x73, 0x25b, 0x301, 0x67, 0x75, 0x6e, 0x3b,
-0x186, 0x6a, 0x254, 0x301, 0x72, 0xfa, 0x3b, 0x186, 0x6a, 0x254, 0x301, 0x62, 0x254, 0x3b, 0x186, 0x6a, 0x254, 0x301, 0x20, 0x190,
-0x74, 0xec, 0x3b, 0x186, 0x6a, 0x254, 0x301, 0x20, 0xc0, 0x62, 0xe1, 0x6d, 0x25b, 0x301, 0x74, 0x61, 0xc0, 0xec, 0x6b, 0x3b,
-0x41, 0x6a, 0x3b, 0xcc, 0x73, 0x25b, 0x301, 0x67, 0x3b, 0x186, 0x6a, 0x254, 0x301, 0x72, 0x3b, 0x186, 0x6a, 0x254, 0x301, 0x62,
-0x3b, 0x190, 0x74, 0x3b, 0xc0, 0x62, 0xe1, 0x6d, 0xc0, 0x3b, 0x41, 0x3b, 0xcc, 0x3b, 0x186, 0x3b, 0x186, 0x3b, 0x190, 0x3b,
-0xc0, 0x41, 0x6c, 0x68, 0x61, 0x64, 0x69, 0x3b, 0x41, 0x74, 0x69, 0x6e, 0x6e, 0x69, 0x3b, 0x41, 0x74, 0x61, 0x6c, 0x61,
-0x61, 0x74, 0x61, 0x3b, 0x41, 0x6c, 0x61, 0x72, 0x62, 0x61, 0x3b, 0x41, 0x6c, 0x68, 0x61, 0x6d, 0x69, 0x73, 0x69, 0x3b,
-0x41, 0x6c, 0x7a, 0x75, 0x6d, 0x61, 0x3b, 0x41, 0x73, 0x69, 0x62, 0x74, 0x69, 0x48, 0x3b, 0x54, 0x3b, 0x54, 0x3b, 0x4c,
-0x3b, 0x4d, 0x3b, 0x5a, 0x3b, 0x53, 0x49, 0x53, 0x6f, 0x6e, 0x74, 0x6f, 0x3b, 0x55, 0x4d, 0x73, 0x6f, 0x6d, 0x62, 0x75,
-0x6c, 0x75, 0x6b, 0x6f, 0x3b, 0x55, 0x4c, 0x77, 0x65, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x3b, 0x55, 0x4c, 0x77, 0x65,
-0x73, 0x69, 0x74, 0x68, 0x61, 0x74, 0x68, 0x75, 0x3b, 0x55, 0x4c, 0x77, 0x65, 0x73, 0x69, 0x6e, 0x65, 0x3b, 0x55, 0x4c,
-0x77, 0x65, 0x73, 0x69, 0x68, 0x6c, 0x61, 0x6e, 0x75, 0x3b, 0x55, 0x4d, 0x67, 0x71, 0x69, 0x62, 0x65, 0x6c, 0x6f, 0x53,
-0x6f, 0x6e, 0x3b, 0x4d, 0x73, 0x6f, 0x3b, 0x42, 0x69, 0x6c, 0x3b, 0x54, 0x68, 0x61, 0x3b, 0x53, 0x69, 0x6e, 0x3b, 0x48,
-0x6c, 0x61, 0x3b, 0x4d, 0x67, 0x71, 0x53, 0x3b, 0x4d, 0x3b, 0x42, 0x3b, 0x54, 0x3b, 0x53, 0x3b, 0x48, 0x3b, 0x4d, 0x6e,
-0x75, 0x6d, 0x129, 0x67, 0x67, 0x75, 0x3b, 0x70, 0x69, 0x72, 0x2d, 0x6b, 0x75, 0x72, 0xe3, 0x2d, 0x68, 0xe1, 0x3b, 0x72,
-0xe9, 0x67, 0x72, 0x65, 0x2d, 0x6b, 0x75, 0x72, 0xe3, 0x2d, 0x68, 0xe1, 0x3b, 0x74, 0x1ebd, 0x67, 0x74, 0x169, 0x2d, 0x6b,
-0x75, 0x72, 0xe3, 0x2d, 0x68, 0xe1, 0x3b, 0x76, 0x1ebd, 0x6e, 0x68, 0x6b, 0xe3, 0x67, 0x72, 0x61, 0x2d, 0x6b, 0x75, 0x72,
-0xe3, 0x2d, 0x68, 0xe1, 0x3b, 0x70, 0xe9, 0x6e, 0x6b, 0x61, 0x72, 0x2d, 0x6b, 0x75, 0x72, 0xe3, 0x2d, 0x68, 0xe1, 0x3b,
-0x73, 0x61, 0x76, 0x6e, 0x75, 0x6e, 0x75, 0x6d, 0x2e, 0x3b, 0x70, 0x69, 0x72, 0x2e, 0x3b, 0x72, 0xe9, 0x67, 0x2e, 0x3b,
-0x74, 0x1ebd, 0x67, 0x2e, 0x3b, 0x76, 0x1ebd, 0x6e, 0x2e, 0x3b, 0x70, 0xe9, 0x6e, 0x2e, 0x3b, 0x73, 0x61, 0x76, 0x2e, 0x4e,
-0x2e, 0x3b, 0x50, 0x2e, 0x3b, 0x52, 0x2e, 0x3b, 0x54, 0x2e, 0x3b, 0x56, 0x2e, 0x3b, 0x50, 0x2e, 0x3b, 0x53, 0x2e, 0x6d,
-0x69, 0x74, 0x75, 0xfa, 0x3b, 0x6d, 0x75, 0x72, 0x61, 0x6b, 0x69, 0x70, 0xed, 0x3b, 0x6d, 0x75, 0x72, 0x61, 0x6b, 0xed,
-0x2d, 0x6d, 0x75, 0x6b, 0x169, 0x69, 0x3b, 0x6d, 0x75, 0x72, 0x61, 0x6b, 0xed, 0x2d, 0x6d, 0x75, 0x73, 0x61, 0x70, 0xed,
-0x72, 0x69, 0x3b, 0x73, 0x75, 0x70, 0x61, 0x70, 0xe1, 0x3b, 0x79, 0x75, 0x6b, 0x75, 0x61, 0x6b, 0xfa, 0x3b, 0x73, 0x61,
-0x75, 0x72, 0xfa, 0x6d, 0x69, 0x74, 0x3b, 0x6d, 0x75, 0x72, 0x3b, 0x6d, 0x6d, 0x6b, 0x3b, 0x6d, 0x6d, 0x73, 0x3b, 0x73,
-0x75, 0x70, 0x3b, 0x79, 0x75, 0x6b, 0x3b, 0x73, 0x61, 0x75, 0x4d, 0x3b, 0x4d, 0x3b, 0x4d, 0x3b, 0x4d, 0x3b, 0x53, 0x3b,
-0x59, 0x3b, 0x53
+static constexpr char16_t days_data[] = {
+0x53, 0x75, 0x6e, 0x64, 0x61, 0x79, 0x3b, 0x4d, 0x6f, 0x6e, 0x64, 0x61,
+0x79, 0x3b, 0x54, 0x75, 0x65, 0x73, 0x64, 0x61, 0x79, 0x3b, 0x57, 0x65,
+0x64, 0x6e, 0x65, 0x73, 0x64, 0x61, 0x79, 0x3b, 0x54, 0x68, 0x75, 0x72,
+0x73, 0x64, 0x61, 0x79, 0x3b, 0x46, 0x72, 0x69, 0x64, 0x61, 0x79, 0x3b,
+0x53, 0x61, 0x74, 0x75, 0x72, 0x64, 0x61, 0x79, 0x53, 0x75, 0x6e, 0x3b,
+0x4d, 0x6f, 0x6e, 0x3b, 0x54, 0x75, 0x65, 0x3b, 0x57, 0x65, 0x64, 0x3b,
+0x54, 0x68, 0x75, 0x3b, 0x46, 0x72, 0x69, 0x3b, 0x53, 0x61, 0x74, 0x53,
+0x3b, 0x4d, 0x3b, 0x54, 0x3b, 0x57, 0x3b, 0x54, 0x3b, 0x46, 0x3b, 0x53,
+0x37, 0x3b, 0x31, 0x3b, 0x32, 0x3b, 0x33, 0x3b, 0x34, 0x3b, 0x35, 0x3b,
+0x36, 0x410, 0x43c, 0x4bd, 0x44b, 0x448, 0x430, 0x3b, 0x410, 0x448, 0x4d9, 0x430,
+0x445, 0x44c, 0x430, 0x3b, 0x410, 0x4a9, 0x430, 0x448, 0x430, 0x3b, 0x410, 0x445,
+0x430, 0x448, 0x430, 0x3b, 0x410, 0x525, 0x448, 0x44c, 0x430, 0x448, 0x430, 0x3b,
+0x410, 0x445, 0x4d9, 0x430, 0x448, 0x430, 0x3b, 0x410, 0x441, 0x430, 0x431, 0x448,
+0x430, 0x410, 0x43c, 0x3b, 0x410, 0x448, 0x4d9, 0x3b, 0x410, 0x4a9, 0x3b, 0x410,
+0x445, 0x3b, 0x410, 0x525, 0x3b, 0x410, 0x445, 0x4d9, 0x3b, 0x410, 0x441, 0x41c,
+0x3b, 0x428, 0x4d9, 0x3b, 0x4a8, 0x3b, 0x425, 0x3b, 0x524, 0x3b, 0x425, 0x4d9,
+0x3b, 0x421, 0x41, 0x63, 0x61, 0x61, 0x64, 0x61, 0x3b, 0x45, 0x74, 0x6c,
+0x65, 0x65, 0x6e, 0x69, 0x3b, 0x54, 0x61, 0x6c, 0x61, 0x61, 0x74, 0x61,
+0x3b, 0x41, 0x72, 0x62, 0x61, 0x71, 0x61, 0x3b, 0x4b, 0x61, 0x6d, 0x69,
+0x69, 0x73, 0x69, 0x3b, 0x47, 0x75, 0x6d, 0x71, 0x61, 0x74, 0x61, 0x3b,
+0x53, 0x61, 0x62, 0x74, 0x69, 0x41, 0x63, 0x61, 0x3b, 0x45, 0x74, 0x6c,
+0x3b, 0x54, 0x61, 0x6c, 0x3b, 0x41, 0x72, 0x62, 0x3b, 0x4b, 0x61, 0x6d,
+0x3b, 0x47, 0x75, 0x6d, 0x3b, 0x53, 0x61, 0x62, 0x41, 0x3b, 0x45, 0x3b,
+0x54, 0x3b, 0x41, 0x3b, 0x4b, 0x3b, 0x47, 0x3b, 0x53, 0x53, 0x6f, 0x6e,
+0x64, 0x61, 0x67, 0x3b, 0x4d, 0x61, 0x61, 0x6e, 0x64, 0x61, 0x67, 0x3b,
+0x44, 0x69, 0x6e, 0x73, 0x64, 0x61, 0x67, 0x3b, 0x57, 0x6f, 0x65, 0x6e,
+0x73, 0x64, 0x61, 0x67, 0x3b, 0x44, 0x6f, 0x6e, 0x64, 0x65, 0x72, 0x64,
+0x61, 0x67, 0x3b, 0x56, 0x72, 0x79, 0x64, 0x61, 0x67, 0x3b, 0x53, 0x61,
+0x74, 0x65, 0x72, 0x64, 0x61, 0x67, 0x53, 0x6f, 0x2e, 0x3b, 0x4d, 0x61,
+0x2e, 0x3b, 0x44, 0x69, 0x2e, 0x3b, 0x57, 0x6f, 0x2e, 0x3b, 0x44, 0x6f,
+0x2e, 0x3b, 0x56, 0x72, 0x2e, 0x3b, 0x53, 0x61, 0x2e, 0x53, 0x3b, 0x4d,
+0x3b, 0x44, 0x3b, 0x57, 0x3b, 0x44, 0x3b, 0x56, 0x3b, 0x53, 0x74, 0x73,
+0x75, 0x294, 0x6e, 0x74, 0x73, 0x268, 0x3b, 0x74, 0x73, 0x75, 0x294, 0x75,
+0x6b, 0x70, 0xe0, 0x3b, 0x74, 0x73, 0x75, 0x294, 0x75, 0x67, 0x68, 0x254,
+0x65, 0x3b, 0x74, 0x73, 0x75, 0x294, 0x75, 0x74, 0x254, 0x300, 0x6d, 0x6c,
+0xf2, 0x3b, 0x74, 0x73, 0x75, 0x294, 0x75, 0x6d, 0xe8, 0x3b, 0x74, 0x73,
+0x75, 0x294, 0x75, 0x67, 0x68, 0x268, 0x302, 0x6d, 0x3b, 0x74, 0x73, 0x75,
+0x294, 0x6e, 0x64, 0x7a, 0x268, 0x6b, 0x254, 0x294, 0x254, 0x6e, 0x74, 0x73,
+0x3b, 0x6b, 0x70, 0x61, 0x3b, 0x67, 0x68, 0x254, 0x3b, 0x74, 0x254, 0x6d,
+0x3b, 0x75, 0x6d, 0x65, 0x3b, 0x67, 0x68, 0x268, 0x3b, 0x64, 0x7a, 0x6b,
+0x6e, 0x3b, 0x6b, 0x3b, 0x67, 0x3b, 0x74, 0x3b, 0x75, 0x3b, 0x67, 0x3b,
+0x64, 0x4b, 0x77, 0x65, 0x73, 0x69, 0x64, 0x61, 0x3b, 0x44, 0x77, 0x6f,
+0x77, 0x64, 0x61, 0x3b, 0x42, 0x65, 0x6e, 0x61, 0x64, 0x61, 0x3b, 0x57,
+0x75, 0x6b, 0x75, 0x64, 0x61, 0x3b, 0x59, 0x61, 0x77, 0x64, 0x61, 0x3b,
+0x46, 0x69, 0x64, 0x61, 0x3b, 0x4d, 0x65, 0x6d, 0x65, 0x6e, 0x65, 0x64,
+0x61, 0x4b, 0x77, 0x65, 0x3b, 0x44, 0x77, 0x6f, 0x3b, 0x42, 0x65, 0x6e,
+0x3b, 0x57, 0x75, 0x6b, 0x3b, 0x59, 0x61, 0x77, 0x3b, 0x46, 0x69, 0x61,
+0x3b, 0x4d, 0x65, 0x6d, 0x4b, 0x3b, 0x44, 0x3b, 0x42, 0x3b, 0x57, 0x3b,
+0x59, 0x3b, 0x46, 0x3b, 0x4d, 0x65, 0x20, 0x64, 0x69, 0x65, 0x6c, 0x3b,
+0x65, 0x20, 0x68, 0xeb, 0x6e, 0xeb, 0x3b, 0x65, 0x20, 0x6d, 0x61, 0x72,
+0x74, 0xeb, 0x3b, 0x65, 0x20, 0x6d, 0xeb, 0x72, 0x6b, 0x75, 0x72, 0xeb,
+0x3b, 0x65, 0x20, 0x65, 0x6e, 0x6a, 0x74, 0x65, 0x3b, 0x65, 0x20, 0x70,
+0x72, 0x65, 0x6d, 0x74, 0x65, 0x3b, 0x65, 0x20, 0x73, 0x68, 0x74, 0x75,
+0x6e, 0xeb, 0x64, 0x69, 0x65, 0x3b, 0x68, 0xeb, 0x6e, 0x3b, 0x6d, 0x61,
+0x72, 0x3b, 0x6d, 0xeb, 0x72, 0x3b, 0x65, 0x6e, 0x6a, 0x3b, 0x70, 0x72,
+0x65, 0x3b, 0x73, 0x68, 0x74, 0x64, 0x3b, 0x68, 0x3b, 0x6d, 0x3b, 0x6d,
+0x3b, 0x65, 0x3b, 0x70, 0x3b, 0x73, 0x68, 0x12a5, 0x1211, 0x12f5, 0x3b, 0x1230,
+0x129e, 0x3b, 0x121b, 0x12ad, 0x1230, 0x129e, 0x3b, 0x1228, 0x1261, 0x12d5, 0x3b, 0x1210,
+0x1219, 0x1235, 0x3b, 0x12d3, 0x122d, 0x1265, 0x3b, 0x1245, 0x12f3, 0x121c, 0x12a5, 0x1211,
+0x12f5, 0x3b, 0x1230, 0x129e, 0x3b, 0x121b, 0x12ad, 0x1230, 0x3b, 0x1228, 0x1261, 0x12d5,
+0x3b, 0x1210, 0x1219, 0x1235, 0x3b, 0x12d3, 0x122d, 0x1265, 0x3b, 0x1245, 0x12f3, 0x121c,
+0x12a5, 0x3b, 0x1230, 0x3b, 0x121b, 0x3b, 0x1228, 0x3b, 0x1210, 0x3b, 0x12d3, 0x3b,
+0x1245, 0x627, 0x644, 0x623, 0x62d, 0x62f, 0x3b, 0x627, 0x644, 0x627, 0x62b, 0x646,
+0x64a, 0x646, 0x3b, 0x627, 0x644, 0x62b, 0x644, 0x627, 0x62b, 0x627, 0x621, 0x3b,
+0x627, 0x644, 0x623, 0x631, 0x628, 0x639, 0x627, 0x621, 0x3b, 0x627, 0x644, 0x62e,
+0x645, 0x64a, 0x633, 0x3b, 0x627, 0x644, 0x62c, 0x645, 0x639, 0x629, 0x3b, 0x627,
+0x644, 0x633, 0x628, 0x62a, 0x62d, 0x3b, 0x646, 0x3b, 0x62b, 0x3b, 0x631, 0x3b,
+0x62e, 0x3b, 0x62c, 0x3b, 0x633, 0x64, 0x6f, 0x6d, 0x69, 0x6e, 0x63, 0x68,
+0x65, 0x3b, 0x6c, 0x75, 0x6e, 0x73, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x7a,
+0x3b, 0x6d, 0x69, 0x65, 0x72, 0x63, 0x72, 0x65, 0x73, 0x3b, 0x63, 0x68,
+0x75, 0x65, 0x76, 0x65, 0x73, 0x3b, 0x76, 0x69, 0x65, 0x72, 0x6e, 0x65,
+0x73, 0x3b, 0x73, 0x61, 0x62, 0x61, 0x64, 0x6f, 0x64, 0x6f, 0x6d, 0x3b,
+0x6c, 0x75, 0x6e, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x6d, 0x69, 0x65, 0x3b,
+0x63, 0x68, 0x75, 0x3b, 0x76, 0x69, 0x65, 0x3b, 0x73, 0x61, 0x62, 0x44,
+0x3b, 0x4c, 0x3b, 0x4d, 0x61, 0x3b, 0x4d, 0x69, 0x3b, 0x43, 0x68, 0x3b,
+0x56, 0x3b, 0x53, 0x56f, 0x56b, 0x580, 0x561, 0x56f, 0x56b, 0x3b, 0x565, 0x580,
+0x56f, 0x578, 0x582, 0x577, 0x561, 0x562, 0x569, 0x56b, 0x3b, 0x565, 0x580, 0x565,
+0x584, 0x577, 0x561, 0x562, 0x569, 0x56b, 0x3b, 0x579, 0x578, 0x580, 0x565, 0x584,
+0x577, 0x561, 0x562, 0x569, 0x56b, 0x3b, 0x570, 0x56b, 0x576, 0x563, 0x577, 0x561,
+0x562, 0x569, 0x56b, 0x3b, 0x578, 0x582, 0x580, 0x562, 0x561, 0x569, 0x3b, 0x577,
+0x561, 0x562, 0x561, 0x569, 0x56f, 0x56b, 0x580, 0x3b, 0x565, 0x580, 0x56f, 0x3b,
+0x565, 0x580, 0x584, 0x3b, 0x579, 0x580, 0x584, 0x3b, 0x570, 0x576, 0x563, 0x3b,
+0x578, 0x582, 0x580, 0x3b, 0x577, 0x562, 0x569, 0x53f, 0x3b, 0x535, 0x3b, 0x535,
+0x3b, 0x549, 0x3b, 0x540, 0x3b, 0x548, 0x3b, 0x547, 0x9a6, 0x9c7, 0x993, 0x9ac,
+0x9be, 0x9f0, 0x3b, 0x9b8, 0x9cb, 0x9ae, 0x9ac, 0x9be, 0x9f0, 0x3b, 0x9ae, 0x999,
+0x9cd, 0x997, 0x9b2, 0x9ac, 0x9be, 0x9f0, 0x3b, 0x9ac, 0x9c1, 0x9a7, 0x9ac, 0x9be,
+0x9f0, 0x3b, 0x9ac, 0x9c3, 0x9b9, 0x9b8, 0x9cd, 0x9aa, 0x9a4, 0x9bf, 0x9ac, 0x9be,
+0x9f0, 0x3b, 0x9b6, 0x9c1, 0x995, 0x9cd, 0x9f0, 0x9ac, 0x9be, 0x9f0, 0x3b, 0x9b6,
+0x9a8, 0x9bf, 0x9ac, 0x9be, 0x9f0, 0x9a6, 0x9c7, 0x993, 0x3b, 0x9b8, 0x9cb, 0x9ae,
+0x3b, 0x9ae, 0x999, 0x9cd, 0x997, 0x9b2, 0x3b, 0x9ac, 0x9c1, 0x9a7, 0x3b, 0x9ac,
+0x9c3, 0x9b9, 0x3b, 0x9b6, 0x9c1, 0x995, 0x9cd, 0x9f0, 0x3b, 0x9b6, 0x9a8, 0x9bf,
+0x9a6, 0x3b, 0x9b8, 0x3b, 0x9ae, 0x3b, 0x9ac, 0x3b, 0x9ac, 0x3b, 0x9b6, 0x3b,
+0x9b6, 0x64, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x75, 0x3b, 0x6c, 0x6c, 0x75,
+0x6e, 0x65, 0x73, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x65, 0x73, 0x3b, 0x6d,
+0x69, 0xe9, 0x72, 0x63, 0x6f, 0x6c, 0x65, 0x73, 0x3b, 0x78, 0x75, 0x65,
+0x76, 0x65, 0x73, 0x3b, 0x76, 0x69, 0x65, 0x6e, 0x72, 0x65, 0x73, 0x3b,
+0x73, 0xe1, 0x62, 0x61, 0x64, 0x75, 0x64, 0x6f, 0x6d, 0x3b, 0x6c, 0x6c,
+0x75, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x6d, 0x69, 0xe9, 0x3b, 0x78, 0x75,
+0x65, 0x3b, 0x76, 0x69, 0x65, 0x3b, 0x73, 0xe1, 0x62, 0x44, 0x3b, 0x4c,
+0x3b, 0x4d, 0x3b, 0x4d, 0x3b, 0x58, 0x3b, 0x56, 0x3b, 0x53, 0x4a, 0x75,
+0x6d, 0x61, 0x70, 0x69, 0x6c, 0x69, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74,
+0x61, 0x74, 0x75, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x6e, 0x6e, 0x65, 0x3b,
+0x4a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x41, 0x6c, 0x68,
+0x61, 0x6d, 0x69, 0x73, 0x69, 0x3b, 0x49, 0x6a, 0x75, 0x6d, 0x61, 0x61,
+0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x6d, 0x6f, 0x73, 0x69, 0x4a, 0x70, 0x69,
+0x3b, 0x4a, 0x74, 0x74, 0x3b, 0x4a, 0x6e, 0x6e, 0x3b, 0x4a, 0x74, 0x6e,
+0x3b, 0x41, 0x6c, 0x68, 0x3b, 0x49, 0x6a, 0x6d, 0x3b, 0x4a, 0x6d, 0x6f,
+0x4a, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0x41, 0x3b, 0x49, 0x3b,
+0x4a, 0x57, 0x61, 0x69, 0x20, 0x59, 0x6f, 0x6b, 0x61, 0x20, 0x42, 0x61,
+0x77, 0x61, 0x69, 0x3b, 0x57, 0x61, 0x69, 0x20, 0x54, 0x75, 0x6e, 0x67,
+0x61, 0x3b, 0x54, 0x6f, 0x6b, 0x69, 0x20, 0x47, 0x69, 0x74, 0x75, 0x6e,
+0x67, 0x3b, 0x54, 0x73, 0x61, 0x6d, 0x20, 0x4b, 0x61, 0x73, 0x75, 0x77,
+0x61, 0x3b, 0x57, 0x61, 0x69, 0x20, 0x4e, 0x61, 0x20, 0x4e, 0x61, 0x73,
+0x3b, 0x57, 0x61, 0x69, 0x20, 0x4e, 0x61, 0x20, 0x54, 0x69, 0x79, 0x6f,
+0x6e, 0x3b, 0x57, 0x61, 0x69, 0x20, 0x4e, 0x61, 0x20, 0x43, 0x68, 0x69,
+0x72, 0x69, 0x6d, 0x59, 0x6f, 0x6b, 0x3b, 0x54, 0x75, 0x6e, 0x67, 0x3b,
+0x47, 0x69, 0x74, 0x75, 0x6e, 0x67, 0x3b, 0x54, 0x73, 0x61, 0x6e, 0x3b,
+0x4e, 0x61, 0x73, 0x3b, 0x4e, 0x61, 0x74, 0x3b, 0x43, 0x68, 0x69, 0x72,
+0x62, 0x61, 0x7a, 0x61, 0x72, 0x3b, 0x62, 0x61, 0x7a, 0x61, 0x72, 0x20,
+0x65, 0x72, 0x74, 0x259, 0x73, 0x69, 0x3b, 0xe7, 0x259, 0x72, 0x15f, 0x259,
+0x6e, 0x62, 0x259, 0x20, 0x61, 0x78, 0x15f, 0x61, 0x6d, 0x131, 0x3b, 0xe7,
+0x259, 0x72, 0x15f, 0x259, 0x6e, 0x62, 0x259, 0x3b, 0x63, 0xfc, 0x6d, 0x259,
+0x20, 0x61, 0x78, 0x15f, 0x61, 0x6d, 0x131, 0x3b, 0x63, 0xfc, 0x6d, 0x259,
+0x3b, 0x15f, 0x259, 0x6e, 0x62, 0x259, 0x42, 0x2e, 0x3b, 0x42, 0x2e, 0x45,
+0x2e, 0x3b, 0xc7, 0x2e, 0x41, 0x2e, 0x3b, 0xc7, 0x2e, 0x3b, 0x43, 0x2e,
+0x41, 0x2e, 0x3b, 0x43, 0x2e, 0x3b, 0x15e, 0x2e, 0x42, 0x2e, 0x3b, 0x42,
+0x2e, 0x65, 0x2e, 0x3b, 0xc7, 0x2e, 0x61, 0x2e, 0x3b, 0xc7, 0x2e, 0x3b,
+0x43, 0x2e, 0x61, 0x2e, 0x3b, 0x43, 0x2e, 0x3b, 0x15e, 0x2e, 0x431, 0x430,
+0x437, 0x430, 0x440, 0x3b, 0x431, 0x430, 0x437, 0x430, 0x440, 0x20, 0x435, 0x440,
+0x442, 0x4d9, 0x441, 0x438, 0x3b, 0x447, 0x4d9, 0x440, 0x448, 0x4d9, 0x43d, 0x431,
+0x4d9, 0x20, 0x430, 0x445, 0x448, 0x430, 0x43c, 0x44b, 0x3b, 0x447, 0x4d9, 0x440,
+0x448, 0x4d9, 0x43d, 0x431, 0x4d9, 0x3b, 0x4b9, 0x4af, 0x43c, 0x4d9, 0x20, 0x430,
+0x445, 0x448, 0x430, 0x43c, 0x44b, 0x3b, 0x4b9, 0x4af, 0x43c, 0x4d9, 0x3b, 0x448,
+0x4d9, 0x43d, 0x431, 0x4d9, 0x411, 0x2e, 0x3b, 0x411, 0x2e, 0x415, 0x2e, 0x3b,
+0x427, 0x2e, 0x410, 0x2e, 0x3b, 0x427, 0x2e, 0x3b, 0x4b8, 0x2e, 0x410, 0x2e,
+0x3b, 0x4b8, 0x2e, 0x3b, 0x428, 0x2e, 0x73, 0x254, 0x301, 0x6e, 0x64, 0x1dd,
+0x3b, 0x6c, 0x1dd, 0x6e, 0x64, 0xed, 0x3b, 0x6d, 0x61, 0x61, 0x64, 0xed,
+0x3b, 0x6d, 0x25b, 0x6b, 0x72, 0x25b, 0x64, 0xed, 0x3b, 0x6a, 0x1dd, 0x1dd,
+0x64, 0xed, 0x3b, 0x6a, 0xfa, 0x6d, 0x62, 0xe1, 0x3b, 0x73, 0x61, 0x6d,
+0x64, 0xed, 0x73, 0x254, 0x301, 0x6e, 0x3b, 0x6c, 0x1dd, 0x6e, 0x3b, 0x6d,
+0x61, 0x61, 0x3b, 0x6d, 0x25b, 0x6b, 0x3b, 0x6a, 0x1dd, 0x1dd, 0x3b, 0x6a,
+0xfa, 0x6d, 0x3b, 0x73, 0x61, 0x6d, 0x73, 0x3b, 0x6c, 0x3b, 0x6d, 0x3b,
+0x6d, 0x3b, 0x6a, 0x3b, 0x6a, 0x3b, 0x73, 0x6b, 0x61, 0x72, 0x69, 0x3b,
+0x6e, 0x74, 0x25b, 0x6e, 0x25b, 0x3b, 0x74, 0x61, 0x72, 0x61, 0x74, 0x61,
+0x3b, 0x61, 0x72, 0x61, 0x62, 0x61, 0x3b, 0x61, 0x6c, 0x61, 0x6d, 0x69,
+0x73, 0x61, 0x3b, 0x6a, 0x75, 0x6d, 0x61, 0x3b, 0x73, 0x69, 0x62, 0x69,
+0x72, 0x69, 0x6b, 0x61, 0x72, 0x3b, 0x6e, 0x74, 0x25b, 0x3b, 0x74, 0x61,
+0x72, 0x3b, 0x61, 0x72, 0x61, 0x3b, 0x61, 0x6c, 0x61, 0x3b, 0x6a, 0x75,
+0x6d, 0x3b, 0x73, 0x69, 0x62, 0x4b, 0x3b, 0x4e, 0x3b, 0x54, 0x3b, 0x41,
+0x3b, 0x41, 0x3b, 0x4a, 0x3b, 0x53, 0x9b0, 0x9ac, 0x9bf, 0x9ac, 0x9be, 0x9b0,
+0x3b, 0x9b8, 0x9cb, 0x9ae, 0x9ac, 0x9be, 0x9b0, 0x3b, 0x9ae, 0x999, 0x9cd, 0x997,
+0x9b2, 0x9ac, 0x9be, 0x9b0, 0x3b, 0x9ac, 0x9c1, 0x9a7, 0x9ac, 0x9be, 0x9b0, 0x3b,
+0x9ac, 0x9c3, 0x9b9, 0x9b8, 0x9cd, 0x9aa, 0x9a4, 0x9bf, 0x9ac, 0x9be, 0x9b0, 0x3b,
+0x9b6, 0x9c1, 0x995, 0x9cd, 0x9b0, 0x9ac, 0x9be, 0x9b0, 0x3b, 0x9b6, 0x9a8, 0x9bf,
+0x9ac, 0x9be, 0x9b0, 0x9b0, 0x9ac, 0x9bf, 0x3b, 0x9b8, 0x9cb, 0x9ae, 0x3b, 0x9ae,
+0x999, 0x9cd, 0x997, 0x9b2, 0x3b, 0x9ac, 0x9c1, 0x9a7, 0x3b, 0x9ac, 0x9c3, 0x9b9,
+0x9b8, 0x9cd, 0x9aa, 0x9a4, 0x9bf, 0x3b, 0x9b6, 0x9c1, 0x995, 0x9cd, 0x9b0, 0x3b,
+0x9b6, 0x9a8, 0x9bf, 0x9b0, 0x3b, 0x9b8, 0x9cb, 0x3b, 0x9ae, 0x3b, 0x9ac, 0x9c1,
+0x3b, 0x9ac, 0x9c3, 0x3b, 0x9b6, 0x9c1, 0x3b, 0x9b6, 0x14b, 0x67, 0x77, 0xe0,
+0x20, 0x6e, 0x254, 0x302, 0x79, 0x3b, 0x14b, 0x67, 0x77, 0xe0, 0x20, 0x6e,
+0x6a, 0x61, 0x14b, 0x67, 0x75, 0x6d, 0x62, 0x61, 0x3b, 0x14b, 0x67, 0x77,
+0xe0, 0x20, 0xfb, 0x6d, 0x3b, 0x14b, 0x67, 0x77, 0xe0, 0x20, 0x14b, 0x67,
+0xea, 0x3b, 0x14b, 0x67, 0x77, 0xe0, 0x20, 0x6d, 0x62, 0x254, 0x6b, 0x3b,
+0x14b, 0x67, 0x77, 0xe0, 0x20, 0x6b, 0x254, 0x254, 0x3b, 0x14b, 0x67, 0x77,
+0xe0, 0x20, 0x6a, 0xf4, 0x6e, 0x6e, 0x254, 0x79, 0x3b, 0x6e, 0x6a, 0x61,
+0x3b, 0x75, 0x75, 0x6d, 0x3b, 0x14b, 0x67, 0x65, 0x3b, 0x6d, 0x62, 0x254,
+0x3b, 0x6b, 0x254, 0x254, 0x3b, 0x6a, 0x6f, 0x6e, 0x6e, 0x3b, 0x6e, 0x3b,
+0x75, 0x3b, 0x14b, 0x3b, 0x6d, 0x3b, 0x6b, 0x3b, 0x6a, 0x69, 0x67, 0x61,
+0x6e, 0x64, 0x65, 0x61, 0x3b, 0x61, 0x73, 0x74, 0x65, 0x6c, 0x65, 0x68,
+0x65, 0x6e, 0x61, 0x3b, 0x61, 0x73, 0x74, 0x65, 0x61, 0x72, 0x74, 0x65,
+0x61, 0x3b, 0x61, 0x73, 0x74, 0x65, 0x61, 0x7a, 0x6b, 0x65, 0x6e, 0x61,
+0x3b, 0x6f, 0x73, 0x74, 0x65, 0x67, 0x75, 0x6e, 0x61, 0x3b, 0x6f, 0x73,
+0x74, 0x69, 0x72, 0x61, 0x6c, 0x61, 0x3b, 0x6c, 0x61, 0x72, 0x75, 0x6e,
+0x62, 0x61, 0x74, 0x61, 0x69, 0x67, 0x2e, 0x3b, 0x61, 0x6c, 0x2e, 0x3b,
+0x61, 0x72, 0x2e, 0x3b, 0x61, 0x7a, 0x2e, 0x3b, 0x6f, 0x67, 0x2e, 0x3b,
+0x6f, 0x72, 0x2e, 0x3b, 0x6c, 0x72, 0x2e, 0x49, 0x3b, 0x41, 0x3b, 0x41,
+0x3b, 0x41, 0x3b, 0x4f, 0x3b, 0x4f, 0x3b, 0x4c, 0x43d, 0x44f, 0x434, 0x437,
+0x435, 0x43b, 0x44f, 0x3b, 0x43f, 0x430, 0x43d, 0x44f, 0x434, 0x437, 0x435, 0x43b,
+0x430, 0x43a, 0x3b, 0x430, 0x45e, 0x442, 0x43e, 0x440, 0x430, 0x43a, 0x3b, 0x441,
+0x435, 0x440, 0x430, 0x434, 0x430, 0x3b, 0x447, 0x430, 0x446, 0x432, 0x435, 0x440,
+0x3b, 0x43f, 0x44f, 0x442, 0x43d, 0x456, 0x446, 0x430, 0x3b, 0x441, 0x443, 0x431,
+0x43e, 0x442, 0x430, 0x43d, 0x434, 0x3b, 0x43f, 0x43d, 0x3b, 0x430, 0x45e, 0x3b,
+0x441, 0x440, 0x3b, 0x447, 0x446, 0x3b, 0x43f, 0x442, 0x3b, 0x441, 0x431, 0x43d,
+0x3b, 0x43f, 0x3b, 0x430, 0x3b, 0x441, 0x3b, 0x447, 0x3b, 0x43f, 0x3b, 0x441,
+0x50, 0x61, 0x20, 0x4d, 0x75, 0x6c, 0x75, 0x6e, 0x67, 0x75, 0x3b, 0x50,
+0x61, 0x6c, 0x69, 0x63, 0x68, 0x69, 0x6d, 0x6f, 0x3b, 0x50, 0x61, 0x6c,
+0x69, 0x63, 0x68, 0x69, 0x62, 0x75, 0x6c, 0x69, 0x3b, 0x50, 0x61, 0x6c,
+0x69, 0x63, 0x68, 0x69, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x50, 0x61, 0x6c,
+0x69, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x3b, 0x50, 0x61, 0x6c, 0x69, 0x63,
+0x68, 0x69, 0x73, 0x61, 0x6e, 0x6f, 0x3b, 0x50, 0x61, 0x63, 0x68, 0x69,
+0x62, 0x65, 0x6c, 0x75, 0x73, 0x68, 0x69, 0x70, 0x61, 0x20, 0x6d, 0x75,
+0x6c, 0x75, 0x6e, 0x67, 0x75, 0x3b, 0x70, 0x61, 0x20, 0x73, 0x68, 0x61,
+0x68, 0x75, 0x76, 0x69, 0x6c, 0x75, 0x68, 0x61, 0x3b, 0x70, 0x61, 0x20,
+0x68, 0x69, 0x76, 0x69, 0x6c, 0x69, 0x3b, 0x70, 0x61, 0x20, 0x68, 0x69,
+0x64, 0x61, 0x74, 0x75, 0x3b, 0x70, 0x61, 0x20, 0x68, 0x69, 0x74, 0x61,
+0x79, 0x69, 0x3b, 0x70, 0x61, 0x20, 0x68, 0x69, 0x68, 0x61, 0x6e, 0x75,
+0x3b, 0x70, 0x61, 0x20, 0x73, 0x68, 0x61, 0x68, 0x75, 0x6c, 0x65, 0x6d,
+0x62, 0x65, 0x6c, 0x61, 0x4d, 0x75, 0x6c, 0x3b, 0x56, 0x69, 0x6c, 0x3b,
+0x48, 0x69, 0x76, 0x3b, 0x48, 0x69, 0x64, 0x3b, 0x48, 0x69, 0x74, 0x3b,
+0x48, 0x69, 0x68, 0x3b, 0x4c, 0x65, 0x6d, 0x4d, 0x3b, 0x4a, 0x3b, 0x48,
+0x3b, 0x48, 0x3b, 0x48, 0x3b, 0x57, 0x3b, 0x4a, 0x930, 0x92c, 0x940, 0x92c,
+0x93e, 0x930, 0x3b, 0x938, 0x94b, 0x92e, 0x92c, 0x93e, 0x930, 0x3b, 0x92e, 0x902,
+0x917, 0x932, 0x92c, 0x93e, 0x930, 0x3b, 0x92c, 0x941, 0x927, 0x92c, 0x93e, 0x930,
+0x3b, 0x92c, 0x943, 0x939, 0x938, 0x94d, 0x92a, 0x924, 0x93f, 0x92c, 0x93e, 0x930,
+0x3b, 0x936, 0x941, 0x915, 0x94d, 0x930, 0x92c, 0x93e, 0x930, 0x3b, 0x938, 0x928,
+0x940, 0x91a, 0x930, 0x1230, 0x1295, 0x1260, 0x122d, 0x20, 0x1245, 0x12f3, 0x12c5, 0x3b,
+0x1230, 0x1291, 0x3b, 0x1230, 0x120a, 0x131d, 0x3b, 0x1208, 0x1313, 0x20, 0x12c8, 0x122a,
+0x20, 0x1208, 0x1265, 0x12cb, 0x3b, 0x12a3, 0x121d, 0x12f5, 0x3b, 0x12a3, 0x122d, 0x1265,
+0x3b, 0x1230, 0x1295, 0x1260, 0x122d, 0x20, 0x123d, 0x1313, 0x12c5, 0x1230, 0x2f, 0x1245,
+0x3b, 0x1230, 0x1291, 0x3b, 0x1230, 0x120a, 0x131d, 0x3b, 0x1208, 0x1313, 0x3b, 0x12a3,
+0x121d, 0x12f5, 0x3b, 0x12a3, 0x122d, 0x1265, 0x3b, 0x1230, 0x2f, 0x123d, 0x1230, 0x3b,
+0x1230, 0x3b, 0x1230, 0x3b, 0x1208, 0x3b, 0x12a3, 0x3b, 0x12a3, 0x3b, 0x1230, 0x930,
+0x92c, 0x93f, 0x92c, 0x93e, 0x930, 0x3b, 0x938, 0x92e, 0x92c, 0x93e, 0x930, 0x3b,
+0x92e, 0x902, 0x917, 0x932, 0x92c, 0x93e, 0x930, 0x3b, 0x92c, 0x941, 0x927, 0x92c,
+0x93e, 0x930, 0x3b, 0x92c, 0x93f, 0x938, 0x94d, 0x925, 0x93f, 0x92c, 0x93e, 0x930,
+0x3b, 0x938, 0x941, 0x941, 0x916, 0x941, 0x930, 0x92c, 0x93e, 0x930, 0x3b, 0x938,
+0x928, 0x93f, 0x92c, 0x93e, 0x930, 0x930, 0x92c, 0x93f, 0x92c, 0x93e, 0x930, 0x3b,
+0x938, 0x92e, 0x92c, 0x93e, 0x930, 0x3b, 0x92e, 0x902, 0x917, 0x932, 0x92c, 0x93e,
+0x930, 0x3b, 0x92c, 0x941, 0x927, 0x92c, 0x93e, 0x930, 0x3b, 0x92c, 0x93f, 0x938,
+0x94d, 0x925, 0x93f, 0x92c, 0x93e, 0x930, 0x3b, 0x938, 0x941, 0x916, 0x941, 0x930,
+0x92c, 0x93e, 0x930, 0x3b, 0x938, 0x928, 0x93f, 0x92c, 0x93e, 0x930, 0x930, 0x92c,
+0x93f, 0x3b, 0x938, 0x92e, 0x3b, 0x92e, 0x902, 0x917, 0x932, 0x3b, 0x92c, 0x941,
+0x927, 0x3b, 0x92c, 0x93f, 0x938, 0x94d, 0x925, 0x93f, 0x3b, 0x938, 0x941, 0x916,
+0x941, 0x930, 0x3b, 0x938, 0x928, 0x93f, 0x930, 0x3b, 0x938, 0x3b, 0x92e, 0x902,
+0x3b, 0x92c, 0x941, 0x3b, 0x92c, 0x93f, 0x3b, 0x938, 0x941, 0x3b, 0x938, 0x6e,
+0x65, 0x64, 0x6a, 0x65, 0x6c, 0x6a, 0x61, 0x3b, 0x70, 0x6f, 0x6e, 0x65,
+0x64, 0x6a, 0x65, 0x6c, 0x6a, 0x61, 0x6b, 0x3b, 0x75, 0x74, 0x6f, 0x72,
+0x61, 0x6b, 0x3b, 0x73, 0x72, 0x69, 0x6a, 0x65, 0x64, 0x61, 0x3b, 0x10d,
+0x65, 0x74, 0x76, 0x72, 0x74, 0x61, 0x6b, 0x3b, 0x70, 0x65, 0x74, 0x61,
+0x6b, 0x3b, 0x73, 0x75, 0x62, 0x6f, 0x74, 0x61, 0x6e, 0x65, 0x64, 0x3b,
+0x70, 0x6f, 0x6e, 0x3b, 0x75, 0x74, 0x6f, 0x3b, 0x73, 0x72, 0x69, 0x3b,
+0x10d, 0x65, 0x74, 0x3b, 0x70, 0x65, 0x74, 0x3b, 0x73, 0x75, 0x62, 0x6e,
+0x3b, 0x70, 0x3b, 0x75, 0x3b, 0x73, 0x3b, 0x10d, 0x3b, 0x70, 0x3b, 0x73,
+0x4e, 0x3b, 0x50, 0x3b, 0x55, 0x3b, 0x53, 0x3b, 0x10c, 0x3b, 0x50, 0x3b,
+0x53, 0x43d, 0x435, 0x434, 0x458, 0x435, 0x459, 0x430, 0x3b, 0x43f, 0x43e, 0x43d,
+0x435, 0x434, 0x458, 0x435, 0x459, 0x430, 0x43a, 0x3b, 0x443, 0x442, 0x43e, 0x440,
+0x430, 0x43a, 0x3b, 0x441, 0x440, 0x438, 0x458, 0x435, 0x434, 0x430, 0x3b, 0x447,
+0x435, 0x442, 0x432, 0x440, 0x442, 0x430, 0x43a, 0x3b, 0x43f, 0x435, 0x442, 0x430,
+0x43a, 0x3b, 0x441, 0x443, 0x431, 0x43e, 0x442, 0x430, 0x43d, 0x435, 0x434, 0x3b,
+0x43f, 0x43e, 0x43d, 0x3b, 0x443, 0x442, 0x43e, 0x3b, 0x441, 0x440, 0x438, 0x3b,
+0x447, 0x435, 0x442, 0x3b, 0x43f, 0x435, 0x442, 0x3b, 0x441, 0x443, 0x431, 0x43d,
+0x3b, 0x43f, 0x3b, 0x443, 0x3b, 0x441, 0x3b, 0x447, 0x3b, 0x43f, 0x3b, 0x441,
+0x53, 0x75, 0x6c, 0x3b, 0x4c, 0x75, 0x6e, 0x3b, 0x4d, 0x65, 0x75, 0x72,
+0x7a, 0x68, 0x3b, 0x4d, 0x65, 0x72, 0x63, 0x2bc, 0x68, 0x65, 0x72, 0x3b,
+0x59, 0x61, 0x6f, 0x75, 0x3b, 0x47, 0x77, 0x65, 0x6e, 0x65, 0x72, 0x3b,
+0x53, 0x61, 0x64, 0x6f, 0x72, 0x6e, 0x53, 0x75, 0x6c, 0x3b, 0x4c, 0x75,
+0x6e, 0x3b, 0x4d, 0x65, 0x75, 0x2e, 0x3b, 0x4d, 0x65, 0x72, 0x2e, 0x3b,
+0x59, 0x61, 0x6f, 0x75, 0x3b, 0x47, 0x77, 0x65, 0x2e, 0x3b, 0x53, 0x61,
+0x64, 0x2e, 0x53, 0x75, 0x3b, 0x4c, 0x3b, 0x4d, 0x7a, 0x3b, 0x4d, 0x63,
+0x3b, 0x59, 0x3b, 0x47, 0x3b, 0x53, 0x61, 0x43d, 0x435, 0x434, 0x435, 0x43b,
+0x44f, 0x3b, 0x43f, 0x43e, 0x43d, 0x435, 0x434, 0x435, 0x43b, 0x43d, 0x438, 0x43a,
+0x3b, 0x432, 0x442, 0x43e, 0x440, 0x43d, 0x438, 0x43a, 0x3b, 0x441, 0x440, 0x44f,
+0x434, 0x430, 0x3b, 0x447, 0x435, 0x442, 0x432, 0x44a, 0x440, 0x442, 0x44a, 0x43a,
+0x3b, 0x43f, 0x435, 0x442, 0x44a, 0x43a, 0x3b, 0x441, 0x44a, 0x431, 0x43e, 0x442,
+0x430, 0x43d, 0x434, 0x3b, 0x43f, 0x43d, 0x3b, 0x432, 0x442, 0x3b, 0x441, 0x440,
+0x3b, 0x447, 0x442, 0x3b, 0x43f, 0x442, 0x3b, 0x441, 0x431, 0x43d, 0x3b, 0x43f,
+0x3b, 0x432, 0x3b, 0x441, 0x3b, 0x447, 0x3b, 0x43f, 0x3b, 0x441, 0x1010, 0x1014,
+0x1004, 0x103a, 0x1039, 0x1002, 0x1014, 0x103d, 0x1031, 0x3b, 0x1010, 0x1014, 0x1004, 0x103a,
+0x1039, 0x101c, 0x102c, 0x3b, 0x1021, 0x1004, 0x103a, 0x1039, 0x1002, 0x102b, 0x3b, 0x1017,
+0x102f, 0x1012, 0x1039, 0x1013, 0x101f, 0x1030, 0x1038, 0x3b, 0x1000, 0x103c, 0x102c, 0x101e,
+0x1015, 0x1010, 0x1031, 0x1038, 0x3b, 0x101e, 0x1031, 0x102c, 0x1000, 0x103c, 0x102c, 0x3b,
+0x1005, 0x1014, 0x1031, 0x1010, 0x3b, 0x1010, 0x3b, 0x1021, 0x3b, 0x1017, 0x3b, 0x1000,
+0x3b, 0x101e, 0x3b, 0x1005, 0x661f, 0x671f, 0x65e5, 0x3b, 0x661f, 0x671f, 0x4e00, 0x3b,
+0x661f, 0x671f, 0x4e8c, 0x3b, 0x661f, 0x671f, 0x4e09, 0x3b, 0x661f, 0x671f, 0x56db, 0x3b,
+0x661f, 0x671f, 0x4e94, 0x3b, 0x661f, 0x671f, 0x516d, 0x65e5, 0x3b, 0x4e00, 0x3b, 0x4e8c,
+0x3b, 0x4e09, 0x3b, 0x56db, 0x3b, 0x4e94, 0x3b, 0x516d, 0x5468, 0x65e5, 0x3b, 0x5468,
+0x4e00, 0x3b, 0x5468, 0x4e8c, 0x3b, 0x5468, 0x4e09, 0x3b, 0x5468, 0x56db, 0x3b, 0x5468,
+0x4e94, 0x3b, 0x5468, 0x516d, 0x64, 0x69, 0x75, 0x6d, 0x65, 0x6e, 0x67, 0x65,
+0x3b, 0x64, 0x69, 0x6c, 0x6c, 0x75, 0x6e, 0x73, 0x3b, 0x64, 0x69, 0x6d,
+0x61, 0x72, 0x74, 0x73, 0x3b, 0x64, 0x69, 0x6d, 0x65, 0x63, 0x72, 0x65,
+0x73, 0x3b, 0x64, 0x69, 0x6a, 0x6f, 0x75, 0x73, 0x3b, 0x64, 0x69, 0x76,
+0x65, 0x6e, 0x64, 0x72, 0x65, 0x73, 0x3b, 0x64, 0x69, 0x73, 0x73, 0x61,
+0x62, 0x74, 0x65, 0x64, 0x67, 0x2e, 0x3b, 0x64, 0x6c, 0x2e, 0x3b, 0x64,
+0x74, 0x2e, 0x3b, 0x64, 0x63, 0x2e, 0x3b, 0x64, 0x6a, 0x2e, 0x3b, 0x64,
+0x76, 0x2e, 0x3b, 0x64, 0x73, 0x2e, 0x44, 0x6f, 0x6d, 0x69, 0x6e, 0x67,
+0x6f, 0x3b, 0x4c, 0x75, 0x6e, 0x65, 0x73, 0x3b, 0x4d, 0x61, 0x72, 0x74,
+0x65, 0x73, 0x3b, 0x4d, 0x69, 0x79, 0x65, 0x72, 0x6b, 0x75, 0x6c, 0x65,
+0x73, 0x3b, 0x48, 0x75, 0x77, 0x65, 0x62, 0x65, 0x73, 0x3b, 0x42, 0x69,
+0x79, 0x65, 0x72, 0x6e, 0x65, 0x73, 0x3b, 0x53, 0x61, 0x62, 0x61, 0x64,
+0x6f, 0x44, 0x6f, 0x6d, 0x3b, 0x4c, 0x75, 0x6e, 0x3b, 0x4d, 0x61, 0x72,
+0x3b, 0x4d, 0x69, 0x79, 0x3b, 0x48, 0x75, 0x77, 0x3b, 0x42, 0x69, 0x79,
+0x3b, 0x53, 0x61, 0x62, 0x44, 0x3b, 0x4c, 0x3b, 0x4d, 0x3b, 0x4d, 0x3b,
+0x48, 0x3b, 0x42, 0x3b, 0x53, 0x41, 0x73, 0x61, 0x6d, 0x61, 0x73, 0x3b,
+0x41, 0x79, 0x6e, 0x61, 0x73, 0x3b, 0x41, 0x73, 0x69, 0x6e, 0x61, 0x73,
+0x3b, 0x41, 0x6b, 0x72, 0x61, 0x73, 0x3b, 0x41, 0x6b, 0x77, 0x61, 0x73,
+0x3b, 0x41, 0x73, 0x69, 0x6d, 0x77, 0x61, 0x73, 0x3b, 0x41, 0x73, 0x69,
+0x1e0d, 0x79, 0x61, 0x73, 0x41, 0x73, 0x61, 0x3b, 0x41, 0x79, 0x6e, 0x3b,
+0x41, 0x73, 0x6e, 0x3b, 0x41, 0x6b, 0x72, 0x3b, 0x41, 0x6b, 0x77, 0x3b,
+0x41, 0x73, 0x6d, 0x3b, 0x41, 0x73, 0x1e0d, 0x41, 0x3b, 0x41, 0x3b, 0x41,
+0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x41, 0x6cc, 0x6d5, 0x6a9, 0x634,
+0x6d5, 0x645, 0x645, 0x6d5, 0x3b, 0x62f, 0x648, 0x648, 0x634, 0x6d5, 0x645, 0x645,
+0x6d5, 0x3b, 0x633, 0x6ce, 0x634, 0x6d5, 0x645, 0x645, 0x6d5, 0x3b, 0x686, 0x648,
+0x627, 0x631, 0x634, 0x6d5, 0x645, 0x645, 0x6d5, 0x3b, 0x67e, 0x6ce, 0x646, 0x62c,
+0x634, 0x6d5, 0x645, 0x645, 0x6d5, 0x3b, 0x6be, 0x6d5, 0x6cc, 0x646, 0x6cc, 0x3b,
+0x634, 0x6d5, 0x645, 0x645, 0x6d5, 0x6cc, 0x3b, 0x62f, 0x3b, 0x633, 0x3b, 0x686,
+0x3b, 0x67e, 0x3b, 0x6be, 0x3b, 0x634, 0xd804, 0xdd22, 0xd804, 0xdd27, 0xd804, 0xdd1d,
+0xd804, 0xdd28, 0xd804, 0xdd1d, 0xd804, 0xdd22, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd25, 0xd804,
+0xdd27, 0xd804, 0xdd1f, 0xd804, 0xdd34, 0xd804, 0xdd1d, 0xd804, 0xdd22, 0xd804, 0xdd34, 0x3b,
+0xd804, 0xdd1f, 0xd804, 0xdd27, 0xd804, 0xdd01, 0xd804, 0xdd09, 0xd804, 0xdd27, 0xd804, 0xdd23,
+0xd804, 0xdd34, 0xd804, 0xdd1d, 0xd804, 0xdd22, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd1d, 0xd804,
+0xdd2a, 0xd804, 0xdd16, 0xd804, 0xdd34, 0xd804, 0xdd1d, 0xd804, 0xdd22, 0xd804, 0xdd34, 0x3b,
+0xd804, 0xdd1d, 0xd804, 0xdd33, 0xd804, 0xdd22, 0xd804, 0xdd28, 0xd804, 0xdd25, 0xd804, 0xdd2a,
+0xd804, 0xdd1b, 0xd804, 0xdd34, 0xd804, 0xdd1d, 0xd804, 0xdd22, 0xd804, 0xdd34, 0x3b, 0xd804,
+0xdd25, 0xd804, 0xdd2a, 0xd804, 0xdd07, 0xd804, 0xdd34, 0xd804, 0xdd07, 0xd804, 0xdd2e, 0xd804,
+0xdd22, 0xd804, 0xdd34, 0xd804, 0xdd1d, 0xd804, 0xdd22, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd25,
+0xd804, 0xdd27, 0xd804, 0xdd1a, 0xd804, 0xdd28, 0xd804, 0xdd1d, 0xd804, 0xdd22, 0xd804, 0xdd34,
+0xd804, 0xdd22, 0xd804, 0xdd27, 0xd804, 0xdd1d, 0xd804, 0xdd28, 0x3b, 0xd804, 0xdd25, 0xd804,
+0xdd27, 0xd804, 0xdd1f, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd1f, 0xd804, 0xdd27, 0xd804, 0xdd01,
+0xd804, 0xdd09, 0xd804, 0xdd27, 0xd804, 0xdd23, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd1d, 0xd804,
+0xdd2a, 0xd804, 0xdd16, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd1d, 0xd804, 0xdd33, 0xd804, 0xdd22,
+0xd804, 0xdd28, 0xd804, 0xdd25, 0xd804, 0xdd2a, 0xd804, 0xdd1b, 0xd804, 0xdd34, 0x3b, 0xd804,
+0xdd25, 0xd804, 0xdd2a, 0xd804, 0xdd07, 0xd804, 0xdd34, 0xd804, 0xdd07, 0xd804, 0xdd2e, 0xd804,
+0xdd22, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd25, 0xd804, 0xdd27, 0xd804, 0xdd1a, 0xd804, 0xdd28,
+0xd804, 0xdd22, 0xd804, 0xdd27, 0x3b, 0xd804, 0xdd25, 0xd804, 0xdd27, 0x3b, 0xd804, 0xdd1f,
+0xd804, 0xdd27, 0x3b, 0xd804, 0xdd1d, 0xd804, 0xdd2a, 0x3b, 0xd804, 0xdd1d, 0xd804, 0xdd33,
+0xd804, 0xdd22, 0xd804, 0xdd28, 0x3b, 0xd804, 0xdd25, 0xd804, 0xdd2a, 0x3b, 0xd804, 0xdd25,
+0xd804, 0xdd27, 0x43a, 0x4c0, 0x438, 0x440, 0x430, 0x3b, 0x43e, 0x440, 0x448, 0x43e,
+0x442, 0x3b, 0x448, 0x438, 0x43d, 0x430, 0x440, 0x430, 0x3b, 0x43a, 0x445, 0x430,
+0x430, 0x440, 0x430, 0x3b, 0x435, 0x430, 0x440, 0x430, 0x3b, 0x43f, 0x4c0, 0x435,
+0x440, 0x430, 0x441, 0x43a, 0x430, 0x3b, 0x448, 0x443, 0x43e, 0x442, 0x43a, 0x4c0,
+0x438, 0x3b, 0x43e, 0x440, 0x3b, 0x448, 0x438, 0x3b, 0x43a, 0x445, 0x430, 0x3b,
+0x435, 0x430, 0x3b, 0x43f, 0x4c0, 0x435, 0x3b, 0x448, 0x443, 0x43e, 0x43a, 0x4c0,
+0x3b, 0x43e, 0x3b, 0x448, 0x3b, 0x43a, 0x445, 0x3b, 0x435, 0x3b, 0x43f, 0x4c0,
+0x3b, 0x448, 0x13a4, 0x13be, 0x13d9, 0x13d3, 0x13c6, 0x13cd, 0x13ac, 0x3b, 0x13a4, 0x13be,
+0x13d9, 0x13d3, 0x13c9, 0x13c5, 0x13af, 0x3b, 0x13d4, 0x13b5, 0x13c1, 0x13a2, 0x13a6, 0x3b,
+0x13e6, 0x13a2, 0x13c1, 0x13a2, 0x13a6, 0x3b, 0x13c5, 0x13a9, 0x13c1, 0x13a2, 0x13a6, 0x3b,
+0x13e7, 0x13be, 0x13a9, 0x13b6, 0x13cd, 0x13d7, 0x3b, 0x13a4, 0x13be, 0x13d9, 0x13d3, 0x13c8,
+0x13d5, 0x13be, 0x13c6, 0x13cd, 0x13ac, 0x3b, 0x13c9, 0x13c5, 0x13af, 0x3b, 0x13d4, 0x13b5,
+0x13c1, 0x3b, 0x13e6, 0x13a2, 0x13c1, 0x3b, 0x13c5, 0x13a9, 0x13c1, 0x3b, 0x13e7, 0x13be,
+0x13a9, 0x3b, 0x13c8, 0x13d5, 0x13be, 0x13c6, 0x3b, 0x13c9, 0x3b, 0x13d4, 0x3b, 0x13e6,
+0x3b, 0x13c5, 0x3b, 0x13e7, 0x3b, 0x13a4, 0x4e, 0x69, 0x74, 0x74, 0x61, 0x6b,
+0x20, 0x48, 0x6f, 0x6c, 0x6c, 0x6f, 0x2bc, 0x3b, 0x4d, 0x61, 0x6e, 0x74,
+0x69, 0x2bc, 0x3b, 0x43, 0x68, 0x6f, 0x73, 0x74, 0x69, 0x2bc, 0x3b, 0x57,
+0x69, 0x6e, 0x73, 0x74, 0x69, 0x2bc, 0x3b, 0x53, 0x6f, 0x69, 0x73, 0x74,
+0x69, 0x2bc, 0x3b, 0x4e, 0x61, 0x6e, 0x6e, 0x61, 0x6c, 0x68, 0x63, 0x68,
+0x69, 0x66, 0x61, 0x2bc, 0x20, 0x4e, 0x69, 0x74, 0x74, 0x61, 0x6b, 0x3b,
+0x4e, 0x69, 0x74, 0x74, 0x61, 0x6b, 0x20, 0x48, 0x6f, 0x6c, 0x6c, 0x6f,
+0x2bc, 0x20, 0x4e, 0x61, 0x6b, 0x66, 0x69, 0x73, 0x68, 0x53, 0x61, 0x6e,
+0x64, 0x65, 0x3b, 0x4f, 0x72, 0x77, 0x6f, 0x6b, 0x75, 0x62, 0x61, 0x6e,
+0x7a, 0x61, 0x3b, 0x4f, 0x72, 0x77, 0x61, 0x6b, 0x61, 0x62, 0x69, 0x72,
+0x69, 0x3b, 0x4f, 0x72, 0x77, 0x61, 0x6b, 0x61, 0x73, 0x68, 0x61, 0x74,
+0x75, 0x3b, 0x4f, 0x72, 0x77, 0x61, 0x6b, 0x61, 0x6e, 0x61, 0x3b, 0x4f,
+0x72, 0x77, 0x61, 0x6b, 0x61, 0x74, 0x61, 0x61, 0x6e, 0x6f, 0x3b, 0x4f,
+0x72, 0x77, 0x61, 0x6d, 0x75, 0x6b, 0x61, 0x61, 0x67, 0x61, 0x53, 0x41,
+0x4e, 0x3b, 0x4f, 0x52, 0x4b, 0x3b, 0x4f, 0x4b, 0x42, 0x3b, 0x4f, 0x4b,
+0x53, 0x3b, 0x4f, 0x4b, 0x4e, 0x3b, 0x4f, 0x4b, 0x54, 0x3b, 0x4f, 0x4d,
+0x4b, 0x53, 0x3b, 0x4b, 0x3b, 0x52, 0x3b, 0x53, 0x3b, 0x4e, 0x3b, 0x54,
+0x3b, 0x4d, 0x9031, 0x65e5, 0x3b, 0x9031, 0x4e00, 0x3b, 0x9031, 0x4e8c, 0x3b, 0x9031,
+0x4e09, 0x3b, 0x9031, 0x56db, 0x3b, 0x9031, 0x4e94, 0x3b, 0x9031, 0x516d, 0x43d, 0x435,
+0x434, 0x463, 0x301, 0x43b, 0x467, 0x3b, 0x43f, 0x43e, 0x43d, 0x435, 0x434, 0x463,
+0x301, 0x43b, 0x44c, 0x43d, 0x438, 0x43a, 0x44a, 0x3b, 0x432, 0x442, 0x43e, 0x301,
+0x440, 0x43d, 0x438, 0x43a, 0x44a, 0x3b, 0x441, 0x440, 0x435, 0x434, 0x430, 0x300,
+0x3b, 0x447, 0x435, 0x442, 0x432, 0x435, 0x440, 0x442, 0x43e, 0x301, 0x43a, 0x44a,
+0x3b, 0x43f, 0x467, 0x442, 0x43e, 0x301, 0x43a, 0x44a, 0x3b, 0x441, 0xa64b, 0x431,
+0x431, 0x461, 0x301, 0x442, 0x430, 0x43d, 0x434, 0x2de7, 0x487, 0x467, 0x3b, 0x43f,
+0x43d, 0x2de3, 0x435, 0x3b, 0x432, 0x442, 0x43e, 0x2dec, 0x487, 0x3b, 0x441, 0x440,
+0x2de3, 0x435, 0x3b, 0x447, 0x435, 0x2de6, 0x487, 0x3b, 0x43f, 0x467, 0x2de6, 0x487,
+0x3b, 0x441, 0xa64b, 0x2de0, 0x487, 0x41d, 0x3b, 0x41f, 0x3b, 0x412, 0x3b, 0x421,
+0x3b, 0x427, 0x3b, 0x41f, 0x3b, 0x421, 0x432, 0x44b, 0x440, 0x441, 0x430, 0x440,
+0x43d, 0x438, 0x43a, 0x443, 0x43d, 0x3b, 0x442, 0x443, 0x43d, 0x442, 0x438, 0x43a,
+0x443, 0x43d, 0x3b, 0x44b, 0x442, 0x43b, 0x430, 0x440, 0x438, 0x43a, 0x443, 0x43d,
+0x3b, 0x44e, 0x43d, 0x43a, 0x443, 0x43d, 0x3b, 0x43a, 0x4d7, 0x4ab, 0x43d, 0x435,
+0x440, 0x43d, 0x438, 0x43a, 0x443, 0x43d, 0x3b, 0x44d, 0x440, 0x43d, 0x435, 0x43a,
+0x443, 0x43d, 0x3b, 0x448, 0x4d1, 0x43c, 0x430, 0x442, 0x43a, 0x443, 0x43d, 0x432,
+0x44b, 0x440, 0x2e, 0x3b, 0x442, 0x443, 0x43d, 0x2e, 0x3b, 0x44b, 0x442, 0x43b,
+0x2e, 0x3b, 0x44e, 0x43d, 0x2e, 0x3b, 0x43a, 0x4d7, 0x4ab, 0x2e, 0x3b, 0x44d,
+0x440, 0x2e, 0x3b, 0x448, 0x4d1, 0x43c, 0x2e, 0x412, 0x3b, 0x422, 0x3b, 0x42b,
+0x3b, 0x42e, 0x3b, 0x41a, 0x3b, 0x42d, 0x3b, 0x428, 0x53, 0x75, 0x6e, 0x6e,
+0x64, 0x61, 0x61, 0x63, 0x68, 0x3b, 0x4d, 0x6f, 0x68, 0x6e, 0x64, 0x61,
+0x61, 0x63, 0x68, 0x3b, 0x44, 0x69, 0x6e, 0x6e, 0x73, 0x64, 0x61, 0x61,
+0x63, 0x68, 0x3b, 0x4d, 0x65, 0x74, 0x77, 0x6f, 0x63, 0x68, 0x3b, 0x44,
+0x75, 0x6e, 0x6e, 0x65, 0x72, 0x73, 0x64, 0x61, 0x61, 0x63, 0x68, 0x3b,
+0x46, 0x72, 0x69, 0x69, 0x64, 0x61, 0x61, 0x63, 0x68, 0x3b, 0x53, 0x61,
+0x6d, 0x73, 0x64, 0x61, 0x61, 0x63, 0x68, 0x53, 0x75, 0x2e, 0x3b, 0x4d,
+0x6f, 0x2e, 0x3b, 0x44, 0x69, 0x2e, 0x3b, 0x4d, 0x65, 0x2e, 0x3b, 0x44,
+0x75, 0x2e, 0x3b, 0x46, 0x72, 0x2e, 0x3b, 0x53, 0x61, 0x2e, 0x53, 0x3b,
+0x4d, 0x3b, 0x44, 0x3b, 0x4d, 0x3b, 0x44, 0x3b, 0x46, 0x3b, 0x53, 0x64,
+0x79, 0x20, 0x53, 0x75, 0x6c, 0x3b, 0x64, 0x79, 0x20, 0x4c, 0x75, 0x6e,
+0x3b, 0x64, 0x79, 0x20, 0x4d, 0x65, 0x75, 0x72, 0x74, 0x68, 0x3b, 0x64,
+0x79, 0x20, 0x4d, 0x65, 0x72, 0x68, 0x65, 0x72, 0x3b, 0x64, 0x79, 0x20,
+0x59, 0x6f, 0x77, 0x3b, 0x64, 0x79, 0x20, 0x47, 0x77, 0x65, 0x6e, 0x65,
+0x72, 0x3b, 0x64, 0x79, 0x20, 0x53, 0x61, 0x64, 0x6f, 0x72, 0x6e, 0x53,
+0x75, 0x6c, 0x3b, 0x4c, 0x75, 0x6e, 0x3b, 0x4d, 0x74, 0x68, 0x3b, 0x4d,
+0x68, 0x72, 0x3b, 0x59, 0x6f, 0x77, 0x3b, 0x47, 0x77, 0x65, 0x3b, 0x53,
+0x61, 0x64, 0x64, 0x75, 0x6d, 0x65, 0x6e, 0x69, 0x63, 0x61, 0x3b, 0x6c,
+0x75, 0x6e, 0x69, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x69, 0x3b, 0x6d, 0x65,
+0x72, 0x63, 0x75, 0x72, 0x69, 0x3b, 0x67, 0x68, 0x6a, 0x6f, 0x76, 0x69,
+0x3b, 0x76, 0x65, 0x6e, 0x6e, 0x65, 0x72, 0x69, 0x3b, 0x73, 0x61, 0x62,
+0x62, 0x61, 0x74, 0x75, 0x64, 0x75, 0x6d, 0x2e, 0x3b, 0x6c, 0x75, 0x6e,
+0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x2e, 0x3b, 0x6d, 0x65, 0x72, 0x2e, 0x3b,
+0x67, 0x68, 0x6a, 0x2e, 0x3b, 0x76, 0x65, 0x6e, 0x2e, 0x3b, 0x73, 0x61,
+0x62, 0x2e, 0x44, 0x3b, 0x4c, 0x3b, 0x4d, 0x3b, 0x4d, 0x3b, 0x47, 0x3b,
+0x56, 0x3b, 0x53, 0x6e, 0x65, 0x64, 0x11b, 0x6c, 0x65, 0x3b, 0x70, 0x6f,
+0x6e, 0x64, 0x11b, 0x6c, 0xed, 0x3b, 0xfa, 0x74, 0x65, 0x72, 0xfd, 0x3b,
+0x73, 0x74, 0x159, 0x65, 0x64, 0x61, 0x3b, 0x10d, 0x74, 0x76, 0x72, 0x74,
+0x65, 0x6b, 0x3b, 0x70, 0xe1, 0x74, 0x65, 0x6b, 0x3b, 0x73, 0x6f, 0x62,
+0x6f, 0x74, 0x61, 0x6e, 0x65, 0x3b, 0x70, 0x6f, 0x3b, 0xfa, 0x74, 0x3b,
+0x73, 0x74, 0x3b, 0x10d, 0x74, 0x3b, 0x70, 0xe1, 0x3b, 0x73, 0x6f, 0x4e,
+0x3b, 0x50, 0x3b, 0xda, 0x3b, 0x53, 0x3b, 0x10c, 0x3b, 0x50, 0x3b, 0x53,
+0x73, 0xf8, 0x6e, 0x64, 0x61, 0x67, 0x3b, 0x6d, 0x61, 0x6e, 0x64, 0x61,
+0x67, 0x3b, 0x74, 0x69, 0x72, 0x73, 0x64, 0x61, 0x67, 0x3b, 0x6f, 0x6e,
+0x73, 0x64, 0x61, 0x67, 0x3b, 0x74, 0x6f, 0x72, 0x73, 0x64, 0x61, 0x67,
+0x3b, 0x66, 0x72, 0x65, 0x64, 0x61, 0x67, 0x3b, 0x6c, 0xf8, 0x72, 0x64,
+0x61, 0x67, 0x73, 0xf8, 0x6e, 0x2e, 0x3b, 0x6d, 0x61, 0x6e, 0x2e, 0x3b,
+0x74, 0x69, 0x72, 0x73, 0x2e, 0x3b, 0x6f, 0x6e, 0x73, 0x2e, 0x3b, 0x74,
+0x6f, 0x72, 0x73, 0x2e, 0x3b, 0x66, 0x72, 0x65, 0x2e, 0x3b, 0x6c, 0xf8,
+0x72, 0x2e, 0x53, 0x3b, 0x4d, 0x3b, 0x54, 0x3b, 0x4f, 0x3b, 0x54, 0x3b,
+0x46, 0x3b, 0x4c, 0x910, 0x924, 0x92c, 0x93e, 0x930, 0x3b, 0x938, 0x94b, 0x92e,
+0x92c, 0x93e, 0x930, 0x3b, 0x92e, 0x902, 0x917, 0x932, 0x92c, 0x93e, 0x930, 0x3b,
+0x92c, 0x941, 0x927, 0x92c, 0x93e, 0x930, 0x3b, 0x92c, 0x940, 0x930, 0x92c, 0x93e,
+0x930, 0x3b, 0x936, 0x941, 0x915, 0x94d, 0x930, 0x92c, 0x93e, 0x930, 0x3b, 0x936,
+0x928, 0x93f, 0x92c, 0x93e, 0x930, 0x910, 0x924, 0x3b, 0x938, 0x94b, 0x92e, 0x3b,
+0x92e, 0x902, 0x917, 0x932, 0x3b, 0x92c, 0x941, 0x927, 0x3b, 0x92c, 0x940, 0x930,
+0x3b, 0x936, 0x941, 0x915, 0x94d, 0x930, 0x3b, 0x936, 0x928, 0x93f, 0x910, 0x3b,
+0x938, 0x94b, 0x3b, 0x92e, 0x2e, 0x3b, 0x92c, 0x941, 0x2e, 0x3b, 0x92c, 0x940,
+0x2e, 0x3b, 0x936, 0x941, 0x2e, 0x3b, 0x936, 0x2e, 0x910, 0x2e, 0x3b, 0x938,
+0x94b, 0x2e, 0x3b, 0x92e, 0x2e, 0x3b, 0x92c, 0x941, 0x2e, 0x3b, 0x92c, 0x940,
+0x2e, 0x3b, 0x936, 0x941, 0x2e, 0x3b, 0x936, 0x2e, 0xe9, 0x74, 0x69, 0x3b,
+0x6d, 0x254, 0x301, 0x73, 0xfa, 0x3b, 0x6b, 0x77, 0x61, 0x73, 0xfa, 0x3b,
+0x6d, 0x75, 0x6b, 0x254, 0x301, 0x73, 0xfa, 0x3b, 0x14b, 0x67, 0x69, 0x73,
+0xfa, 0x3b, 0x257, 0xf3, 0x6e, 0x25b, 0x73, 0xfa, 0x3b, 0x65, 0x73, 0x61,
+0x253, 0x61, 0x73, 0xfa, 0xe9, 0x74, 0x3b, 0x6d, 0x254, 0x301, 0x73, 0x3b,
+0x6b, 0x77, 0x61, 0x3b, 0x6d, 0x75, 0x6b, 0x3b, 0x14b, 0x67, 0x69, 0x3b,
+0x257, 0xf3, 0x6e, 0x3b, 0x65, 0x73, 0x61, 0x65, 0x3b, 0x6d, 0x3b, 0x6b,
+0x3b, 0x6d, 0x3b, 0x14b, 0x3b, 0x257, 0x3b, 0x65, 0x7a, 0x6f, 0x6e, 0x64,
+0x61, 0x67, 0x3b, 0x6d, 0x61, 0x61, 0x6e, 0x64, 0x61, 0x67, 0x3b, 0x64,
+0x69, 0x6e, 0x73, 0x64, 0x61, 0x67, 0x3b, 0x77, 0x6f, 0x65, 0x6e, 0x73,
+0x64, 0x61, 0x67, 0x3b, 0x64, 0x6f, 0x6e, 0x64, 0x65, 0x72, 0x64, 0x61,
+0x67, 0x3b, 0x76, 0x72, 0x69, 0x6a, 0x64, 0x61, 0x67, 0x3b, 0x7a, 0x61,
+0x74, 0x65, 0x72, 0x64, 0x61, 0x67, 0x7a, 0x6f, 0x3b, 0x6d, 0x61, 0x3b,
+0x64, 0x69, 0x3b, 0x77, 0x6f, 0x3b, 0x64, 0x6f, 0x3b, 0x76, 0x72, 0x3b,
+0x7a, 0x61, 0x5a, 0x3b, 0x4d, 0x3b, 0x44, 0x3b, 0x57, 0x3b, 0x44, 0x3b,
+0x56, 0x3b, 0x5a, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b,
+0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf58, 0xf72, 0xf42, 0xf0b, 0xf51, 0xf58, 0xf62,
+0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf63, 0xfb7, 0xf42, 0xf0b, 0xf54, 0xf0b,
+0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf55, 0xf74, 0xf62, 0xf0b, 0xf56, 0xf74, 0xf0b,
+0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf54, 0xf0b, 0xf66, 0xf44, 0xf66, 0xf0b, 0x3b,
+0xf42, 0xf5f, 0xf60, 0xf0b, 0xf66, 0xfa4, 0xf7a, 0xf53, 0xf0b, 0xf54, 0xf0b, 0x3b,
+0xf42, 0xf5f, 0xf60, 0xf0b, 0xf49, 0xf72, 0xf0b, 0xf58, 0xf0b, 0xf5f, 0xfb3, 0xf0b,
+0x3b, 0xf58, 0xf72, 0xf62, 0xf0b, 0x3b, 0xf63, 0xfb7, 0xf42, 0xf0b, 0x3b, 0xf55,
+0xf74, 0xf62, 0xf0b, 0x3b, 0xf66, 0xf44, 0xf66, 0xf0b, 0x3b, 0xf66, 0xfa4, 0xf7a,
+0xf53, 0xf0b, 0x3b, 0xf49, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0x3b, 0xf58, 0xf72, 0xf62,
+0x3b, 0xf63, 0xfb7, 0xf42, 0x3b, 0xf55, 0xf74, 0xf62, 0x3b, 0xf66, 0xf44, 0xfb6,
+0x3b, 0xf66, 0xfa4, 0xf7a, 0xf53, 0x3b, 0xf49, 0xf72, 0x4b, 0x69, 0x75, 0x6d,
+0x69, 0x61, 0x3b, 0x4e, 0x6a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x74, 0x75,
+0x3b, 0x4e, 0x6a, 0x75, 0x6d, 0x61, 0x69, 0x6e, 0x65, 0x3b, 0x4e, 0x6a,
+0x75, 0x6d, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x41, 0x72, 0x61, 0x6d,
+0x69, 0x74, 0x68, 0x69, 0x3b, 0x4e, 0x6a, 0x75, 0x6d, 0x61, 0x61, 0x3b,
+0x4e, 0x4a, 0x75, 0x6d, 0x61, 0x6d, 0x6f, 0x74, 0x68, 0x69, 0x69, 0x4b,
+0x6d, 0x61, 0x3b, 0x54, 0x61, 0x74, 0x3b, 0x49, 0x6e, 0x65, 0x3b, 0x54,
+0x61, 0x6e, 0x3b, 0x41, 0x72, 0x6d, 0x3b, 0x4d, 0x61, 0x61, 0x3b, 0x4e,
+0x4d, 0x4d, 0x4b, 0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x41, 0x3b,
+0x4d, 0x3b, 0x4e, 0xd801, 0xdc1d, 0xd801, 0xdc32, 0xd801, 0xdc4c, 0xd801, 0xdc3c, 0xd801,
+0xdc29, 0x3b, 0xd801, 0xdc23, 0xd801, 0xdc32, 0xd801, 0xdc4c, 0xd801, 0xdc3c, 0xd801, 0xdc29,
+0x3b, 0xd801, 0xdc13, 0xd801, 0xdc2d, 0xd801, 0xdc46, 0xd801, 0xdc3c, 0xd801, 0xdc29, 0x3b,
+0xd801, 0xdc0e, 0xd801, 0xdc2f, 0xd801, 0xdc4c, 0xd801, 0xdc46, 0xd801, 0xdc3c, 0xd801, 0xdc29,
+0x3b, 0xd801, 0xdc1b, 0xd801, 0xdc32, 0xd801, 0xdc49, 0xd801, 0xdc46, 0xd801, 0xdc3c, 0xd801,
+0xdc29, 0x3b, 0xd801, 0xdc19, 0xd801, 0xdc49, 0xd801, 0xdc34, 0xd801, 0xdc3c, 0xd801, 0xdc29,
+0x3b, 0xd801, 0xdc1d, 0xd801, 0xdc30, 0xd801, 0xdc3b, 0xd801, 0xdc32, 0xd801, 0xdc49, 0xd801,
+0xdc3c, 0xd801, 0xdc29, 0xd801, 0xdc1d, 0xd801, 0xdc32, 0xd801, 0xdc4c, 0x3b, 0xd801, 0xdc23,
+0xd801, 0xdc32, 0xd801, 0xdc4c, 0x3b, 0xd801, 0xdc13, 0xd801, 0xdc2d, 0xd801, 0xdc46, 0x3b,
+0xd801, 0xdc0e, 0xd801, 0xdc2f, 0xd801, 0xdc4c, 0x3b, 0xd801, 0xdc1b, 0xd801, 0xdc32, 0xd801,
+0xdc49, 0x3b, 0xd801, 0xdc19, 0xd801, 0xdc49, 0xd801, 0xdc34, 0x3b, 0xd801, 0xdc1d, 0xd801,
+0xdc30, 0xd801, 0xdc3b, 0xd801, 0xdc1d, 0x3b, 0xd801, 0xdc23, 0x3b, 0xd801, 0xdc13, 0x3b,
+0xd801, 0xdc0e, 0x3b, 0xd801, 0xdc1b, 0x3b, 0xd801, 0xdc19, 0x3b, 0xd801, 0xdc1d, 0x53,
+0x75, 0x2e, 0x3b, 0x4d, 0x2e, 0x3b, 0x54, 0x75, 0x2e, 0x3b, 0x57, 0x2e,
+0x3b, 0x54, 0x68, 0x2e, 0x3b, 0x46, 0x2e, 0x3b, 0x53, 0x61, 0x2e, 0xb7,
+0xd801, 0xdc55, 0xd801, 0xdc6d, 0xd801, 0xdc59, 0xd801, 0xdc5b, 0xd801, 0xdc71, 0x3b, 0xb7,
+0xd801, 0xdc65, 0xd801, 0xdc6d, 0xd801, 0xdc59, 0xd801, 0xdc5b, 0xd801, 0xdc71, 0x3b, 0xb7,
+0xd801, 0xdc51, 0xd801, 0xdc75, 0xd801, 0xdc5f, 0xd801, 0xdc5b, 0xd801, 0xdc71, 0x3b, 0xb7,
+0xd801, 0xdc62, 0xd801, 0xdc67, 0xd801, 0xdc59, 0xd801, 0xdc5f, 0xd801, 0xdc5b, 0xd801, 0xdc71,
+0x3b, 0xb7, 0xd801, 0xdc54, 0xd801, 0xdc7b, 0xd801, 0xdc5f, 0xd801, 0xdc5b, 0xd801, 0xdc71,
+0x3b, 0xb7, 0xd801, 0xdc53, 0xd801, 0xdc6e, 0xd801, 0xdc72, 0xd801, 0xdc5b, 0xd801, 0xdc71,
+0x3b, 0xb7, 0xd801, 0xdc55, 0xd801, 0xdc68, 0xd801, 0xdc5b, 0xd801, 0xdc7b, 0xd801, 0xdc5b,
+0xd801, 0xdc71, 0xb7, 0xd801, 0xdc55, 0xd801, 0xdc6d, 0x3b, 0xb7, 0xd801, 0xdc65, 0xd801,
+0xdc6d, 0x3b, 0xb7, 0xd801, 0xdc51, 0xd801, 0xdc75, 0x3b, 0xb7, 0xd801, 0xdc62, 0xd801,
+0xdc67, 0x3b, 0xb7, 0xd801, 0xdc54, 0xd801, 0xdc7b, 0x3b, 0xb7, 0xd801, 0xdc53, 0xd801,
+0xdc6e, 0x3b, 0xb7, 0xd801, 0xdc55, 0xd801, 0xdc68, 0xd801, 0xdc55, 0x3b, 0xd801, 0xdc65,
+0x3b, 0xd801, 0xdc51, 0x3b, 0xd801, 0xdc62, 0x3b, 0xd801, 0xdc54, 0x3b, 0xd801, 0xdc53,
+0x3b, 0xd801, 0xdc55, 0x442, 0x430, 0x440, 0x433, 0x43e, 0x447, 0x438, 0x3b, 0x430,
+0x442, 0x44f, 0x43d, 0x44c, 0x447, 0x438, 0x3b, 0x432, 0x430, 0x441, 0x442, 0x430,
+0x43d, 0x44c, 0x447, 0x438, 0x3b, 0x43a, 0x443, 0x43d, 0x448, 0x43a, 0x430, 0x447,
+0x438, 0x3b, 0x43a, 0x430, 0x43b, 0x43e, 0x43d, 0x44c, 0x447, 0x438, 0x3b, 0x441,
+0x44e, 0x43a, 0x43e, 0x43d, 0x44c, 0x447, 0x438, 0x3b, 0x448, 0x43b, 0x44f, 0x43c,
+0x43e, 0x447, 0x438, 0x442, 0x430, 0x440, 0x433, 0x43e, 0x447, 0x438, 0x441, 0x442,
+0x44d, 0x3b, 0x430, 0x442, 0x44f, 0x43d, 0x44c, 0x447, 0x438, 0x441, 0x442, 0x44d,
+0x3b, 0x432, 0x430, 0x441, 0x442, 0x430, 0x43d, 0x44c, 0x447, 0x438, 0x441, 0x442,
+0x44d, 0x3b, 0x43a, 0x443, 0x43d, 0x448, 0x43a, 0x430, 0x447, 0x438, 0x441, 0x442,
+0x44d, 0x3b, 0x43a, 0x430, 0x43b, 0x43e, 0x43d, 0x44c, 0x447, 0x438, 0x441, 0x442,
+0x44d, 0x3b, 0x441, 0x44e, 0x43a, 0x43e, 0x43d, 0x44c, 0x447, 0x438, 0x441, 0x442,
+0x44d, 0x3b, 0x448, 0x43b, 0x44f, 0x43c, 0x43e, 0x447, 0x438, 0x441, 0x442, 0x44d,
+0x442, 0x430, 0x440, 0x3b, 0x430, 0x442, 0x44f, 0x3b, 0x432, 0x430, 0x441, 0x3b,
+0x43a, 0x443, 0x43d, 0x3b, 0x43a, 0x430, 0x43b, 0x3b, 0x441, 0x44e, 0x43a, 0x3b,
+0x448, 0x43b, 0x44f, 0x64, 0x69, 0x6d, 0x61, 0x6e, 0x109, 0x6f, 0x3b, 0x6c,
+0x75, 0x6e, 0x64, 0x6f, 0x3b, 0x6d, 0x61, 0x72, 0x64, 0x6f, 0x3b, 0x6d,
+0x65, 0x72, 0x6b, 0x72, 0x65, 0x64, 0x6f, 0x3b, 0x135, 0x61, 0x16d, 0x64,
+0x6f, 0x3b, 0x76, 0x65, 0x6e, 0x64, 0x72, 0x65, 0x64, 0x6f, 0x3b, 0x73,
+0x61, 0x62, 0x61, 0x74, 0x6f, 0x64, 0x69, 0x3b, 0x6c, 0x75, 0x3b, 0x6d,
+0x61, 0x3b, 0x6d, 0x65, 0x3b, 0x135, 0x61, 0x3b, 0x76, 0x65, 0x3b, 0x73,
+0x61, 0x64, 0x3b, 0x6c, 0x3b, 0x6d, 0x3b, 0x6d, 0x3b, 0x135, 0x3b, 0x76,
+0x3b, 0x73, 0x70, 0xfc, 0x68, 0x61, 0x70, 0xe4, 0x65, 0x76, 0x3b, 0x65,
+0x73, 0x6d, 0x61, 0x73, 0x70, 0xe4, 0x65, 0x76, 0x3b, 0x74, 0x65, 0x69,
+0x73, 0x69, 0x70, 0xe4, 0x65, 0x76, 0x3b, 0x6b, 0x6f, 0x6c, 0x6d, 0x61,
+0x70, 0xe4, 0x65, 0x76, 0x3b, 0x6e, 0x65, 0x6c, 0x6a, 0x61, 0x70, 0xe4,
+0x65, 0x76, 0x3b, 0x72, 0x65, 0x65, 0x64, 0x65, 0x3b, 0x6c, 0x61, 0x75,
+0x70, 0xe4, 0x65, 0x76, 0x50, 0x3b, 0x45, 0x3b, 0x54, 0x3b, 0x4b, 0x3b,
+0x4e, 0x3b, 0x52, 0x3b, 0x4c, 0x6b, 0x254, 0x73, 0x69, 0x256, 0x61, 0x3b,
+0x64, 0x7a, 0x6f, 0x256, 0x61, 0x3b, 0x62, 0x6c, 0x61, 0x256, 0x61, 0x3b,
+0x6b, 0x75, 0x256, 0x61, 0x3b, 0x79, 0x61, 0x77, 0x6f, 0x256, 0x61, 0x3b,
+0x66, 0x69, 0x256, 0x61, 0x3b, 0x6d, 0x65, 0x6d, 0x6c, 0x65, 0x256, 0x61,
+0x6b, 0x254, 0x73, 0x3b, 0x64, 0x7a, 0x6f, 0x3b, 0x62, 0x6c, 0x61, 0x3b,
+0x6b, 0x75, 0x256, 0x3b, 0x79, 0x61, 0x77, 0x3b, 0x66, 0x69, 0x256, 0x3b,
+0x6d, 0x65, 0x6d, 0x6b, 0x3b, 0x64, 0x3b, 0x62, 0x3b, 0x6b, 0x3b, 0x79,
+0x3b, 0x66, 0x3b, 0x6d, 0x73, 0x254, 0x301, 0x6e, 0x64, 0x254, 0x3b, 0x6d,
+0x254, 0x301, 0x6e, 0x64, 0x69, 0x3b, 0x73, 0x254, 0x301, 0x6e, 0x64, 0x254,
+0x20, 0x6d, 0x259, 0x6c, 0xfa, 0x20, 0x6d, 0x259, 0x301, 0x62, 0x25b, 0x30c,
+0x3b, 0x73, 0x254, 0x301, 0x6e, 0x64, 0x254, 0x20, 0x6d, 0x259, 0x6c, 0xfa,
+0x20, 0x6d, 0x259, 0x301, 0x6c, 0x25b, 0x301, 0x3b, 0x73, 0x254, 0x301, 0x6e,
+0x64, 0x254, 0x20, 0x6d, 0x259, 0x6c, 0xfa, 0x20, 0x6d, 0x259, 0x301, 0x6e,
+0x79, 0x69, 0x3b, 0x66, 0xfa, 0x6c, 0x61, 0x64, 0xe9, 0x3b, 0x73, 0xe9,
+0x72, 0x61, 0x64, 0xe9, 0x73, 0x254, 0x301, 0x6e, 0x3b, 0x6d, 0x254, 0x301,
+0x6e, 0x3b, 0x73, 0x6d, 0x62, 0x3b, 0x73, 0x6d, 0x6c, 0x3b, 0x73, 0x6d,
+0x6e, 0x3b, 0x66, 0xfa, 0x6c, 0x3b, 0x73, 0xe9, 0x72, 0x73, 0x3b, 0x6d,
+0x3b, 0x73, 0x3b, 0x73, 0x3b, 0x73, 0x3b, 0x66, 0x3b, 0x73, 0x73, 0x75,
+0x6e, 0x6e, 0x75, 0x64, 0x61, 0x67, 0x75, 0x72, 0x3b, 0x6d, 0xe1, 0x6e,
+0x61, 0x64, 0x61, 0x67, 0x75, 0x72, 0x3b, 0x74, 0xfd, 0x73, 0x64, 0x61,
+0x67, 0x75, 0x72, 0x3b, 0x6d, 0x69, 0x6b, 0x75, 0x64, 0x61, 0x67, 0x75,
+0x72, 0x3b, 0x68, 0xf3, 0x73, 0x64, 0x61, 0x67, 0x75, 0x72, 0x3b, 0x66,
+0x72, 0xed, 0x67, 0x67, 0x6a, 0x61, 0x64, 0x61, 0x67, 0x75, 0x72, 0x3b,
+0x6c, 0x65, 0x79, 0x67, 0x61, 0x72, 0x64, 0x61, 0x67, 0x75, 0x72, 0x73,
+0x75, 0x6e, 0x3b, 0x6d, 0xe1, 0x6e, 0x3b, 0x74, 0xfd, 0x73, 0x3b, 0x6d,
+0x69, 0x6b, 0x3b, 0x68, 0xf3, 0x73, 0x3b, 0x66, 0x72, 0xed, 0x3b, 0x6c,
+0x65, 0x79, 0x73, 0x75, 0x6e, 0x2e, 0x3b, 0x6d, 0xe1, 0x6e, 0x2e, 0x3b,
+0x74, 0xfd, 0x73, 0x2e, 0x3b, 0x6d, 0x69, 0x6b, 0x2e, 0x3b, 0x68, 0xf3,
+0x73, 0x2e, 0x3b, 0x66, 0x72, 0xed, 0x2e, 0x3b, 0x6c, 0x65, 0x79, 0x2e,
+0x53, 0x3b, 0x4d, 0x3b, 0x54, 0x3b, 0x4d, 0x3b, 0x48, 0x3b, 0x46, 0x3b,
+0x4c, 0x4c, 0x69, 0x6e, 0x67, 0x67, 0x6f, 0x3b, 0x4c, 0x75, 0x6e, 0x65,
+0x73, 0x3b, 0x4d, 0x61, 0x72, 0x74, 0x65, 0x73, 0x3b, 0x4d, 0x69, 0x79,
+0x65, 0x72, 0x6b, 0x75, 0x6c, 0x65, 0x73, 0x3b, 0x48, 0x75, 0x77, 0x65,
+0x62, 0x65, 0x73, 0x3b, 0x42, 0x69, 0x79, 0x65, 0x72, 0x6e, 0x65, 0x73,
+0x3b, 0x53, 0x61, 0x62, 0x61, 0x64, 0x6f, 0x4c, 0x69, 0x6e, 0x3b, 0x4c,
+0x75, 0x6e, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x4d, 0x69, 0x79, 0x3b, 0x48,
+0x75, 0x77, 0x3b, 0x42, 0x69, 0x79, 0x3b, 0x53, 0x61, 0x62, 0x73, 0x75,
+0x6e, 0x6e, 0x75, 0x6e, 0x74, 0x61, 0x69, 0x3b, 0x6d, 0x61, 0x61, 0x6e,
+0x61, 0x6e, 0x74, 0x61, 0x69, 0x3b, 0x74, 0x69, 0x69, 0x73, 0x74, 0x61,
+0x69, 0x3b, 0x6b, 0x65, 0x73, 0x6b, 0x69, 0x76, 0x69, 0x69, 0x6b, 0x6b,
+0x6f, 0x3b, 0x74, 0x6f, 0x72, 0x73, 0x74, 0x61, 0x69, 0x3b, 0x70, 0x65,
+0x72, 0x6a, 0x61, 0x6e, 0x74, 0x61, 0x69, 0x3b, 0x6c, 0x61, 0x75, 0x61,
+0x6e, 0x74, 0x61, 0x69, 0x73, 0x75, 0x6e, 0x6e, 0x75, 0x6e, 0x74, 0x61,
+0x69, 0x6e, 0x61, 0x3b, 0x6d, 0x61, 0x61, 0x6e, 0x61, 0x6e, 0x74, 0x61,
+0x69, 0x6e, 0x61, 0x3b, 0x74, 0x69, 0x69, 0x73, 0x74, 0x61, 0x69, 0x6e,
+0x61, 0x3b, 0x6b, 0x65, 0x73, 0x6b, 0x69, 0x76, 0x69, 0x69, 0x6b, 0x6b,
+0x6f, 0x6e, 0x61, 0x3b, 0x74, 0x6f, 0x72, 0x73, 0x74, 0x61, 0x69, 0x6e,
+0x61, 0x3b, 0x70, 0x65, 0x72, 0x6a, 0x61, 0x6e, 0x74, 0x61, 0x69, 0x6e,
+0x61, 0x3b, 0x6c, 0x61, 0x75, 0x61, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x61,
+0x73, 0x75, 0x3b, 0x6d, 0x61, 0x3b, 0x74, 0x69, 0x3b, 0x6b, 0x65, 0x3b,
+0x74, 0x6f, 0x3b, 0x70, 0x65, 0x3b, 0x6c, 0x61, 0x53, 0x3b, 0x4d, 0x3b,
+0x54, 0x3b, 0x4b, 0x3b, 0x54, 0x3b, 0x50, 0x3b, 0x4c, 0x64, 0x69, 0x6d,
+0x61, 0x6e, 0x63, 0x68, 0x65, 0x3b, 0x6c, 0x75, 0x6e, 0x64, 0x69, 0x3b,
+0x6d, 0x61, 0x72, 0x64, 0x69, 0x3b, 0x6d, 0x65, 0x72, 0x63, 0x72, 0x65,
+0x64, 0x69, 0x3b, 0x6a, 0x65, 0x75, 0x64, 0x69, 0x3b, 0x76, 0x65, 0x6e,
+0x64, 0x72, 0x65, 0x64, 0x69, 0x3b, 0x73, 0x61, 0x6d, 0x65, 0x64, 0x69,
+0x64, 0x69, 0x6d, 0x2e, 0x3b, 0x6c, 0x75, 0x6e, 0x2e, 0x3b, 0x6d, 0x61,
+0x72, 0x2e, 0x3b, 0x6d, 0x65, 0x72, 0x2e, 0x3b, 0x6a, 0x65, 0x75, 0x2e,
+0x3b, 0x76, 0x65, 0x6e, 0x2e, 0x3b, 0x73, 0x61, 0x6d, 0x2e, 0x44, 0x3b,
+0x4c, 0x3b, 0x4d, 0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x56, 0x3b, 0x53, 0x64,
+0x6f, 0x6d, 0x65, 0x6e, 0x69, 0x65, 0x3b, 0x6c, 0x75, 0x6e, 0x69, 0x73,
+0x3b, 0x6d, 0x61, 0x72, 0x74, 0x61, 0x72, 0x73, 0x3b, 0x6d, 0x69, 0x65,
+0x72, 0x63, 0x75, 0x73, 0x3b, 0x6a, 0x6f, 0x69, 0x62, 0x65, 0x3b, 0x76,
+0x69, 0x6e, 0x61, 0x72, 0x73, 0x3b, 0x73, 0x61, 0x62, 0x69, 0x64, 0x65,
+0x64, 0x6f, 0x6d, 0x3b, 0x6c, 0x75, 0x6e, 0x3b, 0x6d, 0x61, 0x72, 0x3b,
+0x6d, 0x69, 0x65, 0x3b, 0x6a, 0x6f, 0x69, 0x3b, 0x76, 0x69, 0x6e, 0x3b,
+0x73, 0x61, 0x62, 0x64, 0x65, 0x77, 0x6f, 0x3b, 0x61, 0x61, 0x253, 0x6e,
+0x64, 0x65, 0x3b, 0x6d, 0x61, 0x77, 0x62, 0x61, 0x61, 0x72, 0x65, 0x3b,
+0x6e, 0x6a, 0x65, 0x73, 0x6c, 0x61, 0x61, 0x72, 0x65, 0x3b, 0x6e, 0x61,
+0x61, 0x73, 0x61, 0x61, 0x6e, 0x64, 0x65, 0x3b, 0x6d, 0x61, 0x77, 0x6e,
+0x64, 0x65, 0x3b, 0x68, 0x6f, 0x6f, 0x72, 0x65, 0x2d, 0x62, 0x69, 0x69,
+0x72, 0x64, 0x65, 0x77, 0x3b, 0x61, 0x61, 0x253, 0x3b, 0x6d, 0x61, 0x77,
+0x3b, 0x6e, 0x6a, 0x65, 0x3b, 0x6e, 0x61, 0x61, 0x3b, 0x6d, 0x77, 0x64,
+0x3b, 0x68, 0x62, 0x69, 0x64, 0x3b, 0x61, 0x3b, 0x6d, 0x3b, 0x6e, 0x3b,
+0x6e, 0x3b, 0x6d, 0x3b, 0x68, 0xd83a, 0xdd08, 0xd83a, 0xdd2b, 0xd83a, 0xdd2c, 0xd83a,
+0xdd26, 0xd83a, 0xdd2d, 0xd83a, 0xdd2a, 0xd83a, 0xdd46, 0xd83a, 0xdd2b, 0x3b, 0xd83a, 0xdd00,
+0xd83a, 0xdd44, 0xd83a, 0xdd29, 0xd83a, 0xdd35, 0xd83a, 0xdd32, 0xd83a, 0xdd4b, 0xd83a, 0xdd23,
+0xd83a, 0xdd2b, 0x3b, 0xd83a, 0xdd03, 0xd83a, 0xdd22, 0xd83a, 0xdd31, 0xd83a, 0xdd26, 0xd83a,
+0xdd22, 0xd83a, 0xdd44, 0xd83a, 0xdd2a, 0xd83a, 0xdd2b, 0x3b, 0xd83a, 0xdd10, 0xd83a, 0xdd36,
+0xd83a, 0xdd2b, 0xd83a, 0xdd27, 0xd83a, 0xdd24, 0xd83a, 0xdd22, 0xd83a, 0xdd44, 0xd83a, 0xdd2a,
+0xd83a, 0xdd2b, 0x3b, 0xd83a, 0xdd10, 0xd83a, 0xdd22, 0xd83a, 0xdd44, 0xd83a, 0xdd27, 0xd83a,
+0xdd22, 0xd83a, 0xdd44, 0xd83a, 0xdd32, 0xd83a, 0xdd23, 0xd83a, 0xdd2b, 0x3b, 0xd83a, 0xdd03,
+0xd83a, 0xdd22, 0xd83a, 0xdd31, 0xd83a, 0xdd32, 0xd83a, 0xdd23, 0xd83a, 0xdd2b, 0x3b, 0xd83a,
+0xdd16, 0xd83a, 0xdd2e, 0xd83a, 0xdd2a, 0xd83a, 0xdd26, 0xd83a, 0xdd2d, 0xd83a, 0xdd2a, 0xd83a,
+0xdd46, 0xd83a, 0xdd2b, 0xd83a, 0xdd08, 0xd83a, 0xdd2b, 0xd83a, 0xdd2c, 0x3b, 0xd83a, 0xdd00,
+0xd83a, 0xdd44, 0xd83a, 0xdd29, 0xd83a, 0xdd35, 0x3b, 0xd83a, 0xdd03, 0xd83a, 0xdd22, 0xd83a,
+0xdd26, 0x3b, 0xd83a, 0xdd14, 0xd83a, 0xdd2b, 0xd83a, 0xdd27, 0x3b, 0xd83a, 0xdd10, 0xd83a,
+0xdd22, 0xd83a, 0xdd44, 0xd83a, 0xdd27, 0x3b, 0xd83a, 0xdd03, 0xd83a, 0xdd22, 0xd83a, 0xdd23,
+0x3b, 0xd83a, 0xdd16, 0xd83a, 0xdd2e, 0xd83a, 0xdd2a, 0xd83a, 0xdd08, 0x3b, 0xd83a, 0xdd00,
+0xd83a, 0xdd44, 0x3b, 0xd83a, 0xdd03, 0x3b, 0xd83a, 0xdd14, 0x3b, 0xd83a, 0xdd10, 0x3b,
+0xd83a, 0xdd03, 0x3b, 0xd83a, 0xdd16, 0x44, 0x69, 0x44, 0xf2, 0x6d, 0x68, 0x6e,
+0x61, 0x69, 0x63, 0x68, 0x3b, 0x44, 0x69, 0x4c, 0x75, 0x61, 0x69, 0x6e,
+0x3b, 0x44, 0x69, 0x4d, 0xe0, 0x69, 0x72, 0x74, 0x3b, 0x44, 0x69, 0x43,
+0x69, 0x61, 0x64, 0x61, 0x69, 0x6e, 0x3b, 0x44, 0x69, 0x61, 0x72, 0x44,
+0x61, 0x6f, 0x69, 0x6e, 0x3b, 0x44, 0x69, 0x68, 0x41, 0x6f, 0x69, 0x6e,
+0x65, 0x3b, 0x44, 0x69, 0x53, 0x61, 0x74, 0x68, 0x61, 0x69, 0x72, 0x6e,
+0x65, 0x44, 0x69, 0x44, 0x3b, 0x44, 0x69, 0x4c, 0x3b, 0x44, 0x69, 0x4d,
+0x3b, 0x44, 0x69, 0x43, 0x3b, 0x44, 0x69, 0x61, 0x3b, 0x44, 0x69, 0x68,
+0x3b, 0x44, 0x69, 0x53, 0x44, 0x3b, 0x4c, 0x3b, 0x4d, 0x3b, 0x43, 0x3b,
+0x41, 0x3b, 0x48, 0x3b, 0x53, 0x48, 0x254, 0x67, 0x62, 0x61, 0x61, 0x3b,
+0x4a, 0x75, 0x3b, 0x4a, 0x75, 0x66, 0x254, 0x3b, 0x53, 0x68, 0x254, 0x3b,
+0x53, 0x6f, 0x6f, 0x3b, 0x53, 0x6f, 0x68, 0x61, 0x61, 0x3b, 0x48, 0x254,
+0x254, 0x48, 0x254, 0x67, 0x3b, 0x4a, 0x75, 0x3b, 0x4a, 0x75, 0x66, 0x3b,
+0x53, 0x68, 0x254, 0x3b, 0x53, 0x6f, 0x6f, 0x3b, 0x53, 0x6f, 0x68, 0x3b,
+0x48, 0x254, 0x254, 0x48, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0x53, 0x3b, 0x53,
+0x3b, 0x53, 0x3b, 0x48, 0x64, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x6f, 0x3b,
+0x6c, 0x75, 0x6e, 0x73, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x65, 0x73, 0x3b,
+0x6d, 0xe9, 0x72, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x3b, 0x78, 0x6f, 0x76,
+0x65, 0x73, 0x3b, 0x76, 0x65, 0x6e, 0x72, 0x65, 0x73, 0x3b, 0x73, 0xe1,
+0x62, 0x61, 0x64, 0x6f, 0x64, 0x6f, 0x6d, 0x2e, 0x3b, 0x6c, 0x75, 0x6e,
+0x73, 0x3b, 0x6d, 0x61, 0x72, 0x2e, 0x3b, 0x6d, 0xe9, 0x72, 0x2e, 0x3b,
+0x78, 0x6f, 0x76, 0x2e, 0x3b, 0x76, 0x65, 0x6e, 0x2e, 0x3b, 0x73, 0xe1,
+0x62, 0x2e, 0x64, 0x2e, 0x3b, 0x6c, 0x2e, 0x3b, 0x6d, 0x2e, 0x3b, 0x6d,
+0x2e, 0x3b, 0x78, 0x2e, 0x3b, 0x76, 0x2e, 0x3b, 0x73, 0x2e, 0x53, 0x61,
+0x62, 0x62, 0x69, 0x69, 0x74, 0x69, 0x3b, 0x42, 0x61, 0x6c, 0x61, 0x7a,
+0x61, 0x3b, 0x4c, 0x77, 0x61, 0x6b, 0x75, 0x62, 0x69, 0x72, 0x69, 0x3b,
+0x4c, 0x77, 0x61, 0x6b, 0x75, 0x73, 0x61, 0x74, 0x75, 0x3b, 0x4c, 0x77,
+0x61, 0x6b, 0x75, 0x6e, 0x61, 0x3b, 0x4c, 0x77, 0x61, 0x6b, 0x75, 0x74,
+0x61, 0x61, 0x6e, 0x6f, 0x3b, 0x4c, 0x77, 0x61, 0x6d, 0x75, 0x6b, 0x61,
+0x61, 0x67, 0x61, 0x53, 0x61, 0x62, 0x3b, 0x42, 0x61, 0x6c, 0x3b, 0x4c,
+0x77, 0x32, 0x3b, 0x4c, 0x77, 0x33, 0x3b, 0x4c, 0x77, 0x34, 0x3b, 0x4c,
+0x77, 0x35, 0x3b, 0x4c, 0x77, 0x36, 0x53, 0x3b, 0x42, 0x3b, 0x4c, 0x3b,
+0x4c, 0x3b, 0x4c, 0x3b, 0x4c, 0x3b, 0x4c, 0x12a5, 0x1281, 0x12f5, 0x3b, 0x1230,
+0x1291, 0x12ed, 0x3b, 0x1220, 0x1209, 0x1235, 0x3b, 0x122b, 0x1265, 0x12d5, 0x3b, 0x1210,
+0x1219, 0x1235, 0x3b, 0x12d3, 0x122d, 0x1260, 0x3b, 0x1240, 0x12f3, 0x121a, 0x1275, 0x12a5,
+0x3b, 0x1230, 0x3b, 0x1220, 0x3b, 0x122b, 0x3b, 0x1210, 0x3b, 0x12d3, 0x3b, 0x1240,
+0x10d9, 0x10d5, 0x10d8, 0x10e0, 0x10d0, 0x3b, 0x10dd, 0x10e0, 0x10e8, 0x10d0, 0x10d1, 0x10d0,
+0x10d7, 0x10d8, 0x3b, 0x10e1, 0x10d0, 0x10db, 0x10e8, 0x10d0, 0x10d1, 0x10d0, 0x10d7, 0x10d8,
+0x3b, 0x10dd, 0x10d7, 0x10ee, 0x10e8, 0x10d0, 0x10d1, 0x10d0, 0x10d7, 0x10d8, 0x3b, 0x10ee,
+0x10e3, 0x10d7, 0x10e8, 0x10d0, 0x10d1, 0x10d0, 0x10d7, 0x10d8, 0x3b, 0x10de, 0x10d0, 0x10e0,
+0x10d0, 0x10e1, 0x10d9, 0x10d4, 0x10d5, 0x10d8, 0x3b, 0x10e8, 0x10d0, 0x10d1, 0x10d0, 0x10d7,
+0x10d8, 0x10d9, 0x10d5, 0x10d8, 0x3b, 0x10dd, 0x10e0, 0x10e8, 0x3b, 0x10e1, 0x10d0, 0x10db,
+0x3b, 0x10dd, 0x10d7, 0x10ee, 0x3b, 0x10ee, 0x10e3, 0x10d7, 0x3b, 0x10de, 0x10d0, 0x10e0,
+0x3b, 0x10e8, 0x10d0, 0x10d1, 0x10d9, 0x3b, 0x10dd, 0x3b, 0x10e1, 0x3b, 0x10dd, 0x3b,
+0x10ee, 0x3b, 0x10de, 0x3b, 0x10e8, 0x53, 0x6f, 0x6e, 0x6e, 0x74, 0x61, 0x67,
+0x3b, 0x4d, 0x6f, 0x6e, 0x74, 0x61, 0x67, 0x3b, 0x44, 0x69, 0x65, 0x6e,
+0x73, 0x74, 0x61, 0x67, 0x3b, 0x4d, 0x69, 0x74, 0x74, 0x77, 0x6f, 0x63,
+0x68, 0x3b, 0x44, 0x6f, 0x6e, 0x6e, 0x65, 0x72, 0x73, 0x74, 0x61, 0x67,
+0x3b, 0x46, 0x72, 0x65, 0x69, 0x74, 0x61, 0x67, 0x3b, 0x53, 0x61, 0x6d,
+0x73, 0x74, 0x61, 0x67, 0x53, 0x6f, 0x3b, 0x4d, 0x6f, 0x3b, 0x44, 0x69,
+0x3b, 0x4d, 0x69, 0x3b, 0x44, 0x6f, 0x3b, 0x46, 0x72, 0x3b, 0x53, 0x61,
+0x53, 0x6f, 0x2e, 0x3b, 0x4d, 0x6f, 0x2e, 0x3b, 0x44, 0x69, 0x2e, 0x3b,
+0x4d, 0x69, 0x2e, 0x3b, 0x44, 0x6f, 0x2e, 0x3b, 0x46, 0x72, 0x2e, 0x3b,
+0x53, 0x61, 0x2e, 0x39a, 0x3c5, 0x3c1, 0x3b9, 0x3b1, 0x3ba, 0x3ae, 0x3b, 0x394,
+0x3b5, 0x3c5, 0x3c4, 0x3ad, 0x3c1, 0x3b1, 0x3b, 0x3a4, 0x3c1, 0x3af, 0x3c4, 0x3b7,
+0x3b, 0x3a4, 0x3b5, 0x3c4, 0x3ac, 0x3c1, 0x3c4, 0x3b7, 0x3b, 0x3a0, 0x3ad, 0x3bc,
+0x3c0, 0x3c4, 0x3b7, 0x3b, 0x3a0, 0x3b1, 0x3c1, 0x3b1, 0x3c3, 0x3ba, 0x3b5, 0x3c5,
+0x3ae, 0x3b, 0x3a3, 0x3ac, 0x3b2, 0x3b2, 0x3b1, 0x3c4, 0x3bf, 0x39a, 0x3c5, 0x3c1,
+0x3b, 0x394, 0x3b5, 0x3c5, 0x3b, 0x3a4, 0x3c1, 0x3af, 0x3b, 0x3a4, 0x3b5, 0x3c4,
+0x3b, 0x3a0, 0x3ad, 0x3bc, 0x3b, 0x3a0, 0x3b1, 0x3c1, 0x3b, 0x3a3, 0x3ac, 0x3b2,
+0x39a, 0x3b, 0x394, 0x3b, 0x3a4, 0x3b, 0x3a4, 0x3b, 0x3a0, 0x3b, 0x3a0, 0x3b,
+0x3a3, 0x41, 0x72, 0x61, 0x74, 0x65, 0x129, 0x3b, 0x41, 0x72, 0x61, 0x6b,
+0xf5, 0x69, 0x3b, 0x41, 0x72, 0x61, 0x61, 0x70, 0x79, 0x3b, 0x41, 0x72,
+0x61, 0x72, 0x75, 0x6e, 0x64, 0x79, 0x3b, 0x41, 0x72, 0x61, 0x70, 0x6f,
+0x3b, 0x41, 0x72, 0x61, 0x70, 0x6f, 0x74, 0x65, 0x129, 0x3b, 0x41, 0x72,
+0x61, 0x70, 0x6f, 0x6b, 0xf5, 0x69, 0xab0, 0xab5, 0xabf, 0xab5, 0xabe, 0xab0,
+0x3b, 0xab8, 0xacb, 0xaae, 0xab5, 0xabe, 0xab0, 0x3b, 0xaae, 0xa82, 0xa97, 0xab3,
+0xab5, 0xabe, 0xab0, 0x3b, 0xaac, 0xac1, 0xaa7, 0xab5, 0xabe, 0xab0, 0x3b, 0xa97,
+0xac1, 0xab0, 0xac1, 0xab5, 0xabe, 0xab0, 0x3b, 0xab6, 0xac1, 0xa95, 0xacd, 0xab0,
+0xab5, 0xabe, 0xab0, 0x3b, 0xab6, 0xaa8, 0xabf, 0xab5, 0xabe, 0xab0, 0xab0, 0xab5,
+0xabf, 0x3b, 0xab8, 0xacb, 0xaae, 0x3b, 0xaae, 0xa82, 0xa97, 0xab3, 0x3b, 0xaac,
+0xac1, 0xaa7, 0x3b, 0xa97, 0xac1, 0xab0, 0xac1, 0x3b, 0xab6, 0xac1, 0xa95, 0xacd,
+0xab0, 0x3b, 0xab6, 0xaa8, 0xabf, 0xab0, 0x3b, 0xab8, 0xacb, 0x3b, 0xaae, 0xa82,
+0x3b, 0xaac, 0xac1, 0x3b, 0xa97, 0xac1, 0x3b, 0xab6, 0xac1, 0x3b, 0xab6, 0x43,
+0x68, 0x75, 0x6d, 0x61, 0x70, 0x69, 0x72, 0x69, 0x3b, 0x43, 0x68, 0x75,
+0x6d, 0x61, 0x74, 0x61, 0x74, 0x6f, 0x3b, 0x43, 0x68, 0x75, 0x6d, 0x61,
+0x69, 0x6e, 0x65, 0x3b, 0x43, 0x68, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x6e,
+0x6f, 0x3b, 0x41, 0x72, 0x61, 0x6d, 0x69, 0x73, 0x69, 0x3b, 0x49, 0x63,
+0x68, 0x75, 0x6d, 0x61, 0x3b, 0x45, 0x73, 0x61, 0x62, 0x61, 0x74, 0x6f,
+0x43, 0x70, 0x72, 0x3b, 0x43, 0x74, 0x74, 0x3b, 0x43, 0x6d, 0x6e, 0x3b,
+0x43, 0x6d, 0x74, 0x3b, 0x41, 0x72, 0x73, 0x3b, 0x49, 0x63, 0x6d, 0x3b,
+0x45, 0x73, 0x74, 0x43, 0x3b, 0x43, 0x3b, 0x43, 0x3b, 0x43, 0x3b, 0x41,
+0x3b, 0x49, 0x3b, 0x45, 0x4c, 0x61, 0x68, 0x61, 0x64, 0x69, 0x3b, 0x4c,
+0x69, 0x74, 0x69, 0x6e, 0x69, 0x6e, 0x3b, 0x54, 0x61, 0x6c, 0x61, 0x74,
+0x61, 0x3b, 0x4c, 0x61, 0x72, 0x61, 0x62, 0x61, 0x3b, 0x41, 0x6c, 0x68,
+0x61, 0x6d, 0x69, 0x73, 0x3b, 0x4a, 0x75, 0x6d, 0x6d, 0x61, 0x2bc, 0x61,
+0x3b, 0x41, 0x73, 0x61, 0x62, 0x61, 0x72, 0x4c, 0x61, 0x68, 0x3b, 0x4c,
+0x69, 0x74, 0x3b, 0x54, 0x61, 0x6c, 0x3b, 0x4c, 0x61, 0x72, 0x3b, 0x41,
+0x6c, 0x68, 0x3b, 0x4a, 0x75, 0x6d, 0x3b, 0x41, 0x73, 0x61, 0x4c, 0x3b,
+0x4c, 0x3b, 0x54, 0x3b, 0x4c, 0x3b, 0x41, 0x3b, 0x4a, 0x3b, 0x41, 0x644,
+0x64e, 0x62d, 0x64e, 0x62f, 0x650, 0x3b, 0x644, 0x650, 0x62a, 0x650, 0x646, 0x650,
+0x646, 0x652, 0x3b, 0x62a, 0x64e, 0x644, 0x64e, 0x62a, 0x64e, 0x3b, 0x644, 0x64e,
+0x631, 0x64e, 0x628, 0x64e, 0x3b, 0x623, 0x64e, 0x644, 0x652, 0x62d, 0x64e, 0x645,
+0x650, 0x633, 0x652, 0x3b, 0x62c, 0x64f, 0x645, 0x64e, 0x639, 0x64e, 0x3b, 0x623,
+0x64e, 0x633, 0x64e, 0x628, 0x64e, 0x631, 0x652, 0x644, 0x64e, 0x62d, 0x3b, 0x644,
+0x650, 0x62a, 0x3b, 0x62a, 0x64e, 0x644, 0x3b, 0x644, 0x64e, 0x631, 0x3b, 0x623,
+0x64e, 0x644, 0x652, 0x62d, 0x3b, 0x62c, 0x64f, 0x645, 0x3b, 0x623, 0x64e, 0x633,
+0x64e, 0x4c, 0x101, 0x70, 0x75, 0x6c, 0x65, 0x3b, 0x50, 0x6f, 0x2bb, 0x61,
+0x6b, 0x61, 0x68, 0x69, 0x3b, 0x50, 0x6f, 0x2bb, 0x61, 0x6c, 0x75, 0x61,
+0x3b, 0x50, 0x6f, 0x2bb, 0x61, 0x6b, 0x6f, 0x6c, 0x75, 0x3b, 0x50, 0x6f,
+0x2bb, 0x61, 0x68, 0x101, 0x3b, 0x50, 0x6f, 0x2bb, 0x61, 0x6c, 0x69, 0x6d,
+0x61, 0x3b, 0x50, 0x6f, 0x2bb, 0x61, 0x6f, 0x6e, 0x6f, 0x4c, 0x50, 0x3b,
+0x50, 0x31, 0x3b, 0x50, 0x32, 0x3b, 0x50, 0x33, 0x3b, 0x50, 0x34, 0x3b,
+0x50, 0x35, 0x3b, 0x50, 0x36, 0x5d9, 0x5d5, 0x5dd, 0x20, 0x5e8, 0x5d0, 0x5e9,
+0x5d5, 0x5df, 0x3b, 0x5d9, 0x5d5, 0x5dd, 0x20, 0x5e9, 0x5e0, 0x5d9, 0x3b, 0x5d9,
+0x5d5, 0x5dd, 0x20, 0x5e9, 0x5dc, 0x5d9, 0x5e9, 0x5d9, 0x3b, 0x5d9, 0x5d5, 0x5dd,
+0x20, 0x5e8, 0x5d1, 0x5d9, 0x5e2, 0x5d9, 0x3b, 0x5d9, 0x5d5, 0x5dd, 0x20, 0x5d7,
+0x5de, 0x5d9, 0x5e9, 0x5d9, 0x3b, 0x5d9, 0x5d5, 0x5dd, 0x20, 0x5e9, 0x5d9, 0x5e9,
+0x5d9, 0x3b, 0x5d9, 0x5d5, 0x5dd, 0x20, 0x5e9, 0x5d1, 0x5ea, 0x5d9, 0x5d5, 0x5dd,
+0x20, 0x5d0, 0x5f3, 0x3b, 0x5d9, 0x5d5, 0x5dd, 0x20, 0x5d1, 0x5f3, 0x3b, 0x5d9,
+0x5d5, 0x5dd, 0x20, 0x5d2, 0x5f3, 0x3b, 0x5d9, 0x5d5, 0x5dd, 0x20, 0x5d3, 0x5f3,
+0x3b, 0x5d9, 0x5d5, 0x5dd, 0x20, 0x5d4, 0x5f3, 0x3b, 0x5d9, 0x5d5, 0x5dd, 0x20,
+0x5d5, 0x5f3, 0x3b, 0x5e9, 0x5d1, 0x5ea, 0x5d0, 0x5f3, 0x3b, 0x5d1, 0x5f3, 0x3b,
+0x5d2, 0x5f3, 0x3b, 0x5d3, 0x5f3, 0x3b, 0x5d4, 0x5f3, 0x3b, 0x5d5, 0x5f3, 0x3b,
+0x5e9, 0x5f3, 0x930, 0x935, 0x93f, 0x935, 0x93e, 0x930, 0x3b, 0x938, 0x94b, 0x92e,
+0x935, 0x93e, 0x930, 0x3b, 0x92e, 0x902, 0x917, 0x932, 0x935, 0x93e, 0x930, 0x3b,
+0x92c, 0x941, 0x927, 0x935, 0x93e, 0x930, 0x3b, 0x917, 0x941, 0x930, 0x941, 0x935,
+0x93e, 0x930, 0x3b, 0x936, 0x941, 0x915, 0x94d, 0x930, 0x935, 0x93e, 0x930, 0x3b,
+0x936, 0x928, 0x93f, 0x935, 0x93e, 0x930, 0x930, 0x935, 0x93f, 0x3b, 0x938, 0x94b,
+0x92e, 0x3b, 0x92e, 0x902, 0x917, 0x932, 0x3b, 0x92c, 0x941, 0x927, 0x3b, 0x917,
+0x941, 0x930, 0x941, 0x3b, 0x936, 0x941, 0x915, 0x94d, 0x930, 0x3b, 0x936, 0x928,
+0x93f, 0x930, 0x3b, 0x938, 0x94b, 0x3b, 0x92e, 0x902, 0x3b, 0x92c, 0x941, 0x3b,
+0x917, 0x941, 0x3b, 0x936, 0x941, 0x3b, 0x936, 0x52, 0x61, 0x76, 0x69, 0x77,
+0x61, 0x61, 0x72, 0x3b, 0x53, 0x6f, 0x6d, 0x77, 0x61, 0x61, 0x72, 0x3b,
+0x4d, 0x61, 0x6e, 0x67, 0x61, 0x6c, 0x77, 0x61, 0x61, 0x72, 0x3b, 0x42,
+0x75, 0x64, 0x68, 0x77, 0x61, 0x61, 0x72, 0x3b, 0x47, 0x75, 0x72, 0x75,
+0x77, 0x61, 0x61, 0x72, 0x3b, 0x53, 0x68, 0x75, 0x6b, 0x72, 0x61, 0x77,
+0x61, 0x61, 0x72, 0x3b, 0x53, 0x68, 0x61, 0x6e, 0x69, 0x77, 0x61, 0x61,
+0x72, 0x52, 0x61, 0x76, 0x69, 0x3b, 0x53, 0x6f, 0x6d, 0x3b, 0x4d, 0x61,
+0x6e, 0x67, 0x61, 0x6c, 0x3b, 0x42, 0x75, 0x64, 0x68, 0x3b, 0x47, 0x75,
+0x72, 0x75, 0x3b, 0x53, 0x68, 0x75, 0x6b, 0x72, 0x61, 0x3b, 0x53, 0x68,
+0x61, 0x6e, 0x69, 0x52, 0x61, 0x3b, 0x53, 0x6f, 0x3b, 0x4d, 0x61, 0x3b,
+0x42, 0x75, 0x3b, 0x47, 0x75, 0x3b, 0x53, 0x68, 0x3b, 0x53, 0x68, 0x61,
+0x76, 0x61, 0x73, 0xe1, 0x72, 0x6e, 0x61, 0x70, 0x3b, 0x68, 0xe9, 0x74,
+0x66, 0x151, 0x3b, 0x6b, 0x65, 0x64, 0x64, 0x3b, 0x73, 0x7a, 0x65, 0x72,
+0x64, 0x61, 0x3b, 0x63, 0x73, 0xfc, 0x74, 0xf6, 0x72, 0x74, 0xf6, 0x6b,
+0x3b, 0x70, 0xe9, 0x6e, 0x74, 0x65, 0x6b, 0x3b, 0x73, 0x7a, 0x6f, 0x6d,
+0x62, 0x61, 0x74, 0x56, 0x3b, 0x48, 0x3b, 0x4b, 0x3b, 0x53, 0x7a, 0x65,
+0x3b, 0x43, 0x73, 0x3b, 0x50, 0x3b, 0x53, 0x7a, 0x6f, 0x56, 0x3b, 0x48,
+0x3b, 0x4b, 0x3b, 0x53, 0x7a, 0x3b, 0x43, 0x73, 0x3b, 0x50, 0x3b, 0x53,
+0x7a, 0x73, 0x75, 0x6e, 0x6e, 0x75, 0x64, 0x61, 0x67, 0x75, 0x72, 0x3b,
+0x6d, 0xe1, 0x6e, 0x75, 0x64, 0x61, 0x67, 0x75, 0x72, 0x3b, 0xfe, 0x72,
+0x69, 0xf0, 0x6a, 0x75, 0x64, 0x61, 0x67, 0x75, 0x72, 0x3b, 0x6d, 0x69,
+0xf0, 0x76, 0x69, 0x6b, 0x75, 0x64, 0x61, 0x67, 0x75, 0x72, 0x3b, 0x66,
+0x69, 0x6d, 0x6d, 0x74, 0x75, 0x64, 0x61, 0x67, 0x75, 0x72, 0x3b, 0x66,
+0xf6, 0x73, 0x74, 0x75, 0x64, 0x61, 0x67, 0x75, 0x72, 0x3b, 0x6c, 0x61,
+0x75, 0x67, 0x61, 0x72, 0x64, 0x61, 0x67, 0x75, 0x72, 0x73, 0x75, 0x6e,
+0x2e, 0x3b, 0x6d, 0xe1, 0x6e, 0x2e, 0x3b, 0xfe, 0x72, 0x69, 0x2e, 0x3b,
+0x6d, 0x69, 0xf0, 0x2e, 0x3b, 0x66, 0x69, 0x6d, 0x2e, 0x3b, 0x66, 0xf6,
+0x73, 0x2e, 0x3b, 0x6c, 0x61, 0x75, 0x2e, 0x53, 0x3b, 0x4d, 0x3b, 0xde,
+0x3b, 0x4d, 0x3b, 0x46, 0x3b, 0x46, 0x3b, 0x4c, 0x53, 0x1ecd, 0x6e, 0x64,
+0x65, 0x65, 0x3b, 0x4d, 0x1ecd, 0x6e, 0x64, 0x65, 0x3b, 0x54, 0x69, 0x75,
+0x7a, 0x64, 0x65, 0x65, 0x3b, 0x57, 0x65, 0x6e, 0x65, 0x7a, 0x64, 0x65,
+0x65, 0x3b, 0x54, 0x1ecd, 0x1ecd, 0x7a, 0x64, 0x65, 0x65, 0x3b, 0x46, 0x72,
+0x61, 0x1ecb, 0x64, 0x65, 0x65, 0x3b, 0x53, 0x61, 0x74, 0x1ecd, 0x64, 0x65,
+0x65, 0x53, 0x1ecd, 0x6e, 0x3b, 0x4d, 0x1ecd, 0x6e, 0x3b, 0x54, 0x69, 0x75,
+0x3b, 0x57, 0x65, 0x6e, 0x3b, 0x54, 0x1ecd, 0x1ecd, 0x3b, 0x46, 0x72, 0x61,
+0x1ecb, 0x3b, 0x53, 0x61, 0x74, 0x70, 0x61, 0x73, 0x65, 0x70, 0x65, 0x69,
+0x76, 0x69, 0x3b, 0x76, 0x75, 0x6f, 0x73, 0x73, 0x61, 0x72, 0x67, 0xe2,
+0x3b, 0x6d, 0x61, 0x6a, 0x65, 0x62, 0x61, 0x72, 0x67, 0xe2, 0x3b, 0x6b,
+0x6f, 0x73, 0x6b, 0x6f, 0x6b, 0x6b, 0x6f, 0x3b, 0x74, 0x75, 0x6f, 0x72,
+0xe2, 0x73, 0x74, 0xe2, 0x68, 0x3b, 0x76, 0xe1, 0x73, 0x74, 0x75, 0x70,
+0x70, 0x65, 0x69, 0x76, 0x69, 0x3b, 0x6c, 0xe1, 0x76, 0x75, 0x72, 0x64,
+0xe2, 0x68, 0x70, 0x61, 0x73, 0x65, 0x70, 0x65, 0x65, 0x69, 0x76, 0x69,
+0x3b, 0x76, 0x75, 0x6f, 0x73, 0x73, 0x61, 0x61, 0x72, 0x67, 0xe2, 0x3b,
+0x6d, 0x61, 0x6a, 0x65, 0x62, 0x61, 0x61, 0x72, 0x67, 0xe2, 0x3b, 0x6b,
+0x6f, 0x73, 0x6b, 0x6f, 0x68, 0x6f, 0x3b, 0x74, 0x75, 0x6f, 0x72, 0xe2,
+0x73, 0x74, 0x75, 0x76, 0x3b, 0x76, 0xe1, 0x73, 0x74, 0x75, 0x70, 0x70,
+0x65, 0x65, 0x69, 0x76, 0x69, 0x3b, 0x6c, 0xe1, 0x76, 0x75, 0x72, 0x64,
+0x75, 0x76, 0x70, 0x61, 0x73, 0x3b, 0x76, 0x75, 0x6f, 0x3b, 0x6d, 0x61,
+0x6a, 0x3b, 0x6b, 0x6f, 0x73, 0x3b, 0x74, 0x75, 0x6f, 0x3b, 0x76, 0xe1,
+0x73, 0x3b, 0x6c, 0xe1, 0x76, 0x70, 0x3b, 0x56, 0x3b, 0x4d, 0x3b, 0x4b,
+0x3b, 0x54, 0x3b, 0x56, 0x3b, 0x4c, 0x4d, 0x69, 0x6e, 0x67, 0x67, 0x75,
+0x3b, 0x53, 0x65, 0x6e, 0x69, 0x6e, 0x3b, 0x53, 0x65, 0x6c, 0x61, 0x73,
+0x61, 0x3b, 0x52, 0x61, 0x62, 0x75, 0x3b, 0x4b, 0x61, 0x6d, 0x69, 0x73,
+0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74, 0x3b, 0x53, 0x61, 0x62, 0x74, 0x75,
+0x4d, 0x69, 0x6e, 0x3b, 0x53, 0x65, 0x6e, 0x3b, 0x53, 0x65, 0x6c, 0x3b,
+0x52, 0x61, 0x62, 0x3b, 0x4b, 0x61, 0x6d, 0x3b, 0x4a, 0x75, 0x6d, 0x3b,
+0x53, 0x61, 0x62, 0x4d, 0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x52, 0x3b, 0x4b,
+0x3b, 0x4a, 0x3b, 0x53, 0x64, 0x6f, 0x6d, 0x69, 0x6e, 0x69, 0x63, 0x61,
+0x3b, 0x6c, 0x75, 0x6e, 0x65, 0x64, 0x69, 0x3b, 0x6d, 0x61, 0x72, 0x74,
+0x65, 0x64, 0x69, 0x3b, 0x6d, 0x65, 0x72, 0x63, 0x75, 0x72, 0x69, 0x64,
+0x69, 0x3b, 0x6a, 0x6f, 0x76, 0x65, 0x64, 0x69, 0x3b, 0x76, 0x65, 0x6e,
+0x65, 0x72, 0x64, 0x69, 0x3b, 0x73, 0x61, 0x62, 0x62, 0x61, 0x74, 0x6f,
+0x64, 0x6f, 0x6d, 0x3b, 0x6c, 0x75, 0x6e, 0x3b, 0x6d, 0x61, 0x72, 0x3b,
+0x6d, 0x65, 0x72, 0x3b, 0x6a, 0x6f, 0x76, 0x3b, 0x76, 0x65, 0x6e, 0x3b,
+0x73, 0x61, 0x62, 0x64, 0x3b, 0x6c, 0x3b, 0x6d, 0x3b, 0x6d, 0x3b, 0x6a,
+0x3b, 0x76, 0x3b, 0x73, 0x73, 0x6f, 0x6c, 0x65, 0x64, 0xed, 0x3b, 0x6c,
+0x75, 0x6e, 0x65, 0x64, 0xed, 0x3b, 0x6d, 0x61, 0x72, 0x64, 0xed, 0x3b,
+0x6d, 0x65, 0x72, 0x63, 0x75, 0x72, 0x64, 0xed, 0x3b, 0x6a, 0x6f, 0x76,
+0x65, 0x64, 0xed, 0x3b, 0x76, 0x65, 0x6e, 0x65, 0x72, 0x64, 0xed, 0x3b,
+0x73, 0x61, 0x74, 0x75, 0x72, 0x64, 0xed, 0x73, 0x6f, 0x6c, 0x2e, 0x3b,
+0x6c, 0x75, 0x6e, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x2e, 0x3b, 0x6d, 0x65,
+0x72, 0x2e, 0x3b, 0x6a, 0x6f, 0x76, 0x2e, 0x3b, 0x76, 0x65, 0x6e, 0x2e,
+0x3b, 0x73, 0x61, 0x74, 0x2e, 0x53, 0x3b, 0x4c, 0x3b, 0x4d, 0x3b, 0x4d,
+0x3b, 0x4a, 0x3b, 0x56, 0x3b, 0x53, 0x14c8, 0x1466, 0x144f, 0x1591, 0x152d, 0x1585,
+0x3b, 0x14c7, 0x14a1, 0x1490, 0x153e, 0x152d, 0x1405, 0x3b, 0x14c7, 0x14a1, 0x1490, 0x153e,
+0x152d, 0x1405, 0x14d5, 0x1585, 0x146d, 0x3b, 0x1431, 0x1593, 0x1466, 0x14ef, 0x1585, 0x3b,
+0x14ef, 0x1455, 0x14bb, 0x14a5, 0x1585, 0x3b, 0x1455, 0x14ea, 0x14d5, 0x14bb, 0x14a5, 0x1405,
+0x1466, 0x3b, 0x14c8, 0x1466, 0x14f0, 0x1591, 0x152d, 0x14db, 0x1550, 0x14c2, 0x140a, 0x1585,
+0x44, 0xe9, 0x20, 0x44, 0x6f, 0x6d, 0x68, 0x6e, 0x61, 0x69, 0x67, 0x68,
+0x3b, 0x44, 0xe9, 0x20, 0x4c, 0x75, 0x61, 0x69, 0x6e, 0x3b, 0x44, 0xe9,
+0x20, 0x4d, 0xe1, 0x69, 0x72, 0x74, 0x3b, 0x44, 0xe9, 0x20, 0x43, 0xe9,
+0x61, 0x64, 0x61, 0x6f, 0x69, 0x6e, 0x3b, 0x44, 0xe9, 0x61, 0x72, 0x64,
+0x61, 0x6f, 0x69, 0x6e, 0x3b, 0x44, 0xe9, 0x20, 0x68, 0x41, 0x6f, 0x69,
+0x6e, 0x65, 0x3b, 0x44, 0xe9, 0x20, 0x53, 0x61, 0x74, 0x68, 0x61, 0x69,
+0x72, 0x6e, 0x44, 0x6f, 0x6d, 0x68, 0x3b, 0x4c, 0x75, 0x61, 0x6e, 0x3b,
+0x4d, 0xe1, 0x69, 0x72, 0x74, 0x3b, 0x43, 0xe9, 0x61, 0x64, 0x3b, 0x44,
+0xe9, 0x61, 0x72, 0x3b, 0x41, 0x6f, 0x69, 0x6e, 0x65, 0x3b, 0x53, 0x61,
+0x74, 0x68, 0x44, 0x3b, 0x4c, 0x3b, 0x4d, 0x3b, 0x43, 0x3b, 0x44, 0x3b,
+0x41, 0x3b, 0x53, 0x64, 0x6f, 0x6d, 0x65, 0x6e, 0x69, 0x63, 0x61, 0x3b,
+0x6c, 0x75, 0x6e, 0x65, 0x64, 0xec, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x65,
+0x64, 0xec, 0x3b, 0x6d, 0x65, 0x72, 0x63, 0x6f, 0x6c, 0x65, 0x64, 0xec,
+0x3b, 0x67, 0x69, 0x6f, 0x76, 0x65, 0x64, 0xec, 0x3b, 0x76, 0x65, 0x6e,
+0x65, 0x72, 0x64, 0xec, 0x3b, 0x73, 0x61, 0x62, 0x61, 0x74, 0x6f, 0x64,
+0x6f, 0x6d, 0x3b, 0x6c, 0x75, 0x6e, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x6d,
+0x65, 0x72, 0x3b, 0x67, 0x69, 0x6f, 0x3b, 0x76, 0x65, 0x6e, 0x3b, 0x73,
+0x61, 0x62, 0x65e5, 0x66dc, 0x65e5, 0x3b, 0x6708, 0x66dc, 0x65e5, 0x3b, 0x706b, 0x66dc,
+0x65e5, 0x3b, 0x6c34, 0x66dc, 0x65e5, 0x3b, 0x6728, 0x66dc, 0x65e5, 0x3b, 0x91d1, 0x66dc,
+0x65e5, 0x3b, 0x571f, 0x66dc, 0x65e5, 0x65e5, 0x3b, 0x6708, 0x3b, 0x706b, 0x3b, 0x6c34,
+0x3b, 0x6728, 0x3b, 0x91d1, 0x3b, 0x571f, 0x41, 0x68, 0x61, 0x64, 0x3b, 0x53,
+0x65, 0x6e, 0x69, 0x6e, 0x3b, 0x53, 0x65, 0x6c, 0x61, 0x73, 0x61, 0x3b,
+0x52, 0x61, 0x62, 0x75, 0x3b, 0x4b, 0x61, 0x6d, 0x69, 0x73, 0x3b, 0x4a,
+0x75, 0x6d, 0x61, 0x74, 0x3b, 0x53, 0x61, 0x62, 0x74, 0x75, 0x41, 0x68,
+0x61, 0x64, 0x3b, 0x53, 0x65, 0x6e, 0x3b, 0x53, 0x65, 0x6c, 0x3b, 0x52,
+0x61, 0x62, 0x3b, 0x4b, 0x61, 0x6d, 0x3b, 0x4a, 0x75, 0x6d, 0x3b, 0x53,
+0x61, 0x62, 0x41, 0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x52, 0x3b, 0x4b, 0x3b,
+0x4a, 0x3b, 0x53, 0x4c, 0x61, 0x64, 0x69, 0x3b, 0x4c, 0x69, 0x6e, 0x74,
+0x61, 0x6e, 0x69, 0x3b, 0x54, 0x61, 0x6c, 0x61, 0x74, 0x61, 0x3b, 0x4c,
+0x61, 0x72, 0x62, 0x61, 0x3b, 0x4c, 0x61, 0x6d, 0x69, 0x74, 0x3b, 0x4a,
+0x75, 0x6d, 0x61, 0x3b, 0x41, 0x73, 0x61, 0x62, 0x61, 0x72, 0x4c, 0x61,
+0x64, 0x3b, 0x4c, 0x69, 0x6e, 0x3b, 0x54, 0x61, 0x6c, 0x3b, 0x4c, 0x61,
+0x72, 0x3b, 0x4c, 0x61, 0x6d, 0x3b, 0x4a, 0x75, 0x6d, 0x3b, 0x41, 0x73,
+0x61, 0x44, 0x69, 0x6d, 0x61, 0x73, 0x3b, 0x54, 0x65, 0x6e, 0x65, 0x14b,
+0x3b, 0x54, 0x61, 0x6c, 0x61, 0x74, 0x61, 0x3b, 0x41, 0x6c, 0x61, 0x72,
+0x62, 0x61, 0x79, 0x3b, 0x41, 0x72, 0x61, 0x6d, 0x69, 0x73, 0x61, 0x79,
+0x3b, 0x41, 0x72, 0x6a, 0x75, 0x6d, 0x61, 0x3b, 0x53, 0x69, 0x62, 0x69,
+0x74, 0x69, 0x44, 0x69, 0x6d, 0x3b, 0x54, 0x65, 0x6e, 0x3b, 0x54, 0x61,
+0x6c, 0x3b, 0x41, 0x6c, 0x61, 0x3b, 0x41, 0x72, 0x61, 0x3b, 0x41, 0x72,
+0x6a, 0x3b, 0x53, 0x69, 0x62, 0x44, 0x3b, 0x54, 0x3b, 0x54, 0x3b, 0x41,
+0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x53, 0x64, 0x75, 0x6d, 0x69, 0x6e, 0x67,
+0x75, 0x3b, 0x73, 0x69, 0x67, 0x75, 0x6e, 0x64, 0x61, 0x2d, 0x66, 0x65,
+0x72, 0x61, 0x3b, 0x74, 0x65, 0x72, 0x73, 0x61, 0x2d, 0x66, 0x65, 0x72,
+0x61, 0x3b, 0x6b, 0x75, 0x61, 0x72, 0x74, 0x61, 0x2d, 0x66, 0x65, 0x72,
+0x61, 0x3b, 0x6b, 0x69, 0x6e, 0x74, 0x61, 0x2d, 0x66, 0x65, 0x72, 0x61,
+0x3b, 0x73, 0x65, 0x73, 0x74, 0x61, 0x2d, 0x66, 0x65, 0x72, 0x61, 0x3b,
+0x73, 0xe1, 0x62, 0x61, 0x64, 0x75, 0x64, 0x75, 0x6d, 0x3b, 0x73, 0x69,
+0x67, 0x3b, 0x74, 0x65, 0x72, 0x3b, 0x6b, 0x75, 0x61, 0x3b, 0x6b, 0x69,
+0x6e, 0x3b, 0x73, 0x65, 0x73, 0x3b, 0x73, 0x61, 0x62, 0x44, 0x3b, 0x53,
+0x3b, 0x54, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x53, 0x3b, 0x53, 0x41, 0x63,
+0x65, 0x72, 0x3b, 0x41, 0x72, 0x69, 0x6d, 0x3b, 0x41, 0x72, 0x61, 0x6d,
+0x3b, 0x41, 0x68, 0x61, 0x64, 0x3b, 0x41, 0x6d, 0x68, 0x61, 0x64, 0x3b,
+0x53, 0x65, 0x6d, 0x3b, 0x53, 0x65, 0x64, 0x59, 0x61, 0x6e, 0x61, 0x73,
+0x73, 0x3b, 0x53, 0x61, 0x6e, 0x61, 0x73, 0x73, 0x3b, 0x4b, 0x72, 0x61,
+0x1e0d, 0x61, 0x73, 0x73, 0x3b, 0x4b, 0x75, 0x1e93, 0x61, 0x73, 0x73, 0x3b,
+0x53, 0x61, 0x6d, 0x61, 0x73, 0x73, 0x3b, 0x53, 0x1e0d, 0x69, 0x73, 0x61,
+0x73, 0x73, 0x3b, 0x53, 0x61, 0x79, 0x61, 0x73, 0x73, 0x41, 0x63, 0x65,
+0x3b, 0x41, 0x72, 0x69, 0x3b, 0x41, 0x72, 0x61, 0x3b, 0x41, 0x68, 0x61,
+0x3b, 0x41, 0x6d, 0x68, 0x3b, 0x53, 0x65, 0x6d, 0x3b, 0x53, 0x65, 0x64,
+0x59, 0x61, 0x6e, 0x3b, 0x53, 0x61, 0x6e, 0x3b, 0x4b, 0x72, 0x61, 0x1e0d,
+0x3b, 0x4b, 0x75, 0x1e93, 0x3b, 0x53, 0x61, 0x6d, 0x3b, 0x53, 0x1e0d, 0x69,
+0x73, 0x3b, 0x53, 0x61, 0x79, 0x59, 0x3b, 0x53, 0x3b, 0x4b, 0x3b, 0x4b,
+0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x53, 0x43, 0x3b, 0x52, 0x3b, 0x52, 0x3b,
+0x48, 0x3b, 0x4d, 0x3b, 0x53, 0x3b, 0x53, 0x73, 0x254, 0x6e, 0x64, 0x69,
+0x3b, 0x6c, 0x75, 0x6e, 0x64, 0x69, 0x3b, 0x6d, 0x61, 0x72, 0x64, 0x69,
+0x3b, 0x6d, 0x25b, 0x72, 0x6b, 0x25b, 0x72, 0x25b, 0x64, 0x69, 0x3b, 0x79,
+0x65, 0x64, 0x69, 0x3b, 0x76, 0x61, 0x14b, 0x64, 0x25b, 0x72, 0x25b, 0x64,
+0x69, 0x3b, 0x6d, 0x254, 0x6e, 0x254, 0x20, 0x73, 0x254, 0x6e, 0x64, 0x69,
+0x73, 0x6f, 0x3b, 0x6c, 0x75, 0x3b, 0x6d, 0x61, 0x3b, 0x6d, 0x25b, 0x3b,
+0x79, 0x65, 0x3b, 0x76, 0x61, 0x3b, 0x6d, 0x73, 0x73, 0x61, 0x70, 0x61,
+0x61, 0x74, 0x3b, 0x61, 0x74, 0x61, 0x61, 0x73, 0x69, 0x6e, 0x6e, 0x67,
+0x6f, 0x72, 0x6e, 0x65, 0x71, 0x3b, 0x6d, 0x61, 0x72, 0x6c, 0x75, 0x6e,
+0x6e, 0x67, 0x6f, 0x72, 0x6e, 0x65, 0x71, 0x3b, 0x70, 0x69, 0x6e, 0x67,
+0x61, 0x73, 0x75, 0x6e, 0x6e, 0x67, 0x6f, 0x72, 0x6e, 0x65, 0x71, 0x3b,
+0x73, 0x69, 0x73, 0x61, 0x6d, 0x61, 0x6e, 0x6e, 0x67, 0x6f, 0x72, 0x6e,
+0x65, 0x71, 0x3b, 0x74, 0x61, 0x6c, 0x6c, 0x69, 0x6d, 0x61, 0x6e, 0x6e,
+0x67, 0x6f, 0x72, 0x6e, 0x65, 0x71, 0x3b, 0x61, 0x72, 0x66, 0x69, 0x6e,
+0x69, 0x6e, 0x6e, 0x67, 0x6f, 0x72, 0x6e, 0x65, 0x71, 0x73, 0x61, 0x70,
+0x3b, 0x61, 0x74, 0x61, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x70, 0x69, 0x6e,
+0x3b, 0x73, 0x69, 0x73, 0x3b, 0x74, 0x61, 0x6c, 0x3b, 0x61, 0x72, 0x66,
+0x53, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x50, 0x3b, 0x53, 0x3b, 0x54, 0x3b,
+0x41, 0x4b, 0x6f, 0x74, 0x69, 0x73, 0x61, 0x70, 0x3b, 0x4b, 0x6f, 0x74,
+0x61, 0x61, 0x69, 0x3b, 0x4b, 0x6f, 0x61, 0x65, 0x6e, 0x67, 0x2019, 0x3b,
+0x4b, 0x6f, 0x73, 0x6f, 0x6d, 0x6f, 0x6b, 0x3b, 0x4b, 0x6f, 0x61, 0x6e,
+0x67, 0x2019, 0x77, 0x61, 0x6e, 0x3b, 0x4b, 0x6f, 0x6d, 0x75, 0x75, 0x74,
+0x3b, 0x4b, 0x6f, 0x6c, 0x6f, 0x4b, 0x74, 0x73, 0x3b, 0x4b, 0x6f, 0x74,
+0x3b, 0x4b, 0x6f, 0x6f, 0x3b, 0x4b, 0x6f, 0x73, 0x3b, 0x4b, 0x6f, 0x61,
+0x3b, 0x4b, 0x6f, 0x6d, 0x3b, 0x4b, 0x6f, 0x6c, 0x54, 0x3b, 0x54, 0x3b,
+0x4f, 0x3b, 0x53, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x4c, 0x57, 0x61, 0x20,
+0x6b, 0x79, 0x75, 0x6d, 0x77, 0x61, 0x3b, 0x57, 0x61, 0x20, 0x6b, 0x77,
+0x61, 0x6d, 0x62, 0x129, 0x6c, 0x129, 0x6c, 0x79, 0x61, 0x3b, 0x57, 0x61,
+0x20, 0x6b, 0x65, 0x6c, 0x129, 0x3b, 0x57, 0x61, 0x20, 0x6b, 0x61, 0x74,
+0x61, 0x74, 0x169, 0x3b, 0x57, 0x61, 0x20, 0x6b, 0x61, 0x6e, 0x61, 0x3b,
+0x57, 0x61, 0x20, 0x6b, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x57, 0x61,
+0x20, 0x74, 0x68, 0x61, 0x6e, 0x74, 0x68, 0x61, 0x74, 0x169, 0x57, 0x6b,
+0x79, 0x3b, 0x57, 0x6b, 0x77, 0x3b, 0x57, 0x6b, 0x6c, 0x3b, 0x57, 0x74,
+0x169, 0x3b, 0x57, 0x6b, 0x6e, 0x3b, 0x57, 0x74, 0x6e, 0x3b, 0x57, 0x74,
+0x68, 0x59, 0x3b, 0x57, 0x3b, 0x45, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x41,
+0x3b, 0x41, 0xcad, 0xcbe, 0xca8, 0xcc1, 0xcb5, 0xcbe, 0xcb0, 0x3b, 0xcb8, 0xccb,
+0xcae, 0xcb5, 0xcbe, 0xcb0, 0x3b, 0xcae, 0xc82, 0xc97, 0xcb3, 0xcb5, 0xcbe, 0xcb0,
+0x3b, 0xcac, 0xcc1, 0xca7, 0xcb5, 0xcbe, 0xcb0, 0x3b, 0xc97, 0xcc1, 0xcb0, 0xcc1,
+0xcb5, 0xcbe, 0xcb0, 0x3b, 0xcb6, 0xcc1, 0xc95, 0xccd, 0xcb0, 0xcb5, 0xcbe, 0xcb0,
+0x3b, 0xcb6, 0xca8, 0xcbf, 0xcb5, 0xcbe, 0xcb0, 0xcad, 0xcbe, 0xca8, 0xcc1, 0x3b,
+0xcb8, 0xccb, 0xcae, 0x3b, 0xcae, 0xc82, 0xc97, 0xcb3, 0x3b, 0xcac, 0xcc1, 0xca7,
+0x3b, 0xc97, 0xcc1, 0xcb0, 0xcc1, 0x3b, 0xcb6, 0xcc1, 0xc95, 0xccd, 0xcb0, 0x3b,
+0xcb6, 0xca8, 0xcbf, 0xcad, 0xcbe, 0x3b, 0xcb8, 0xccb, 0x3b, 0xcae, 0xc82, 0x3b,
+0xcac, 0xcc1, 0x3b, 0xc97, 0xcc1, 0x3b, 0xcb6, 0xcc1, 0x3b, 0xcb6, 0x627, 0x64e,
+0x62a, 0x6be, 0x648, 0x627, 0x631, 0x3b, 0x698, 0x654, 0x646, 0x62f, 0x631, 0x655,
+0x631, 0x648, 0x627, 0x631, 0x3b, 0x628, 0x6c6, 0x645, 0x648, 0x627, 0x631, 0x3b,
+0x628, 0x648, 0x62f, 0x648, 0x627, 0x631, 0x3b, 0x628, 0x631, 0x620, 0x633, 0x648,
+0x627, 0x631, 0x3b, 0x62c, 0x64f, 0x645, 0x6c1, 0x3b, 0x628, 0x679, 0x648, 0x627,
+0x631, 0x622, 0x62a, 0x6be, 0x648, 0x627, 0x631, 0x3b, 0x698, 0x654, 0x646, 0x62f,
+0x655, 0x631, 0x648, 0x627, 0x631, 0x3b, 0x628, 0x6c6, 0x645, 0x648, 0x627, 0x631,
+0x3b, 0x628, 0x648, 0x62f, 0x648, 0x627, 0x631, 0x3b, 0x628, 0x631, 0x620, 0x633,
+0x648, 0x627, 0x631, 0x3b, 0x62c, 0x64f, 0x645, 0x6c1, 0x3b, 0x628, 0x679, 0x648,
+0x627, 0x631, 0x627, 0x3b, 0x698, 0x3b, 0x628, 0x3b, 0x628, 0x3b, 0x628, 0x3b,
+0x62c, 0x3b, 0x628, 0x906, 0x925, 0x935, 0x93e, 0x930, 0x3b, 0x91a, 0x902, 0x926,
+0x93f, 0x930, 0x935, 0x93e, 0x930, 0x3b, 0x92c, 0x941, 0x935, 0x93e, 0x930, 0x3b,
+0x92c, 0x94b, 0x926, 0x935, 0x93e, 0x930, 0x3b, 0x92c, 0x94d, 0x930, 0x947, 0x938,
+0x935, 0x93e, 0x930, 0x3b, 0x91c, 0x941, 0x92e, 0x94d, 0x92e, 0x93e, 0x3b, 0x92c,
+0x91f, 0x935, 0x93e, 0x930, 0x906, 0x925, 0x935, 0x93e, 0x930, 0x3b, 0x91a, 0x93c,
+0x902, 0x926, 0x93f, 0x930, 0x935, 0x93e, 0x930, 0x3b, 0x92c, 0x94b, 0x92e, 0x935,
+0x93e, 0x930, 0x3b, 0x92c, 0x94b, 0x926, 0x935, 0x93e, 0x930, 0x3b, 0x92c, 0x94d,
+0x930, 0x947, 0x938, 0x935, 0x93e, 0x930, 0x3b, 0x91c, 0x941, 0x92e, 0x93e, 0x3b,
+0x92c, 0x91f, 0x935, 0x93e, 0x930, 0x906, 0x925, 0x935, 0x93e, 0x930, 0x3b, 0x91a,
+0x902, 0x926, 0x93f, 0x930, 0x935, 0x93e, 0x930, 0x3b, 0x92c, 0x941, 0x935, 0x93e,
+0x930, 0x3b, 0x92c, 0x94b, 0x926, 0x935, 0x93e, 0x930, 0x3b, 0x92c, 0x94d, 0x930,
+0x947, 0x938, 0x935, 0x93e, 0x930, 0x3b, 0x91c, 0x941, 0x92e, 0x93e, 0x3b, 0x92c,
+0x91f, 0x935, 0x93e, 0x930, 0x905, 0x3b, 0x91a, 0x3b, 0x92c, 0x3b, 0x92c, 0x3b,
+0x92c, 0x3b, 0x91c, 0x3b, 0x92c, 0x436, 0x435, 0x43a, 0x441, 0x435, 0x43d, 0x431,
+0x456, 0x3b, 0x434, 0x4af, 0x439, 0x441, 0x435, 0x43d, 0x431, 0x456, 0x3b, 0x441,
+0x435, 0x439, 0x441, 0x435, 0x43d, 0x431, 0x456, 0x3b, 0x441, 0x4d9, 0x440, 0x441,
+0x435, 0x43d, 0x431, 0x456, 0x3b, 0x431, 0x435, 0x439, 0x441, 0x435, 0x43d, 0x431,
+0x456, 0x3b, 0x436, 0x4b1, 0x43c, 0x430, 0x3b, 0x441, 0x435, 0x43d, 0x431, 0x456,
+0x436, 0x441, 0x3b, 0x434, 0x441, 0x3b, 0x441, 0x441, 0x3b, 0x441, 0x440, 0x3b,
+0x431, 0x441, 0x3b, 0x436, 0x43c, 0x3b, 0x441, 0x431, 0x416, 0x3b, 0x414, 0x3b,
+0x421, 0x3b, 0x421, 0x3b, 0x411, 0x3b, 0x416, 0x3b, 0x421, 0x17a2, 0x17b6, 0x1791,
+0x17b7, 0x178f, 0x17d2, 0x1799, 0x3b, 0x1785, 0x1793, 0x17d2, 0x1791, 0x3b, 0x17a2, 0x1784,
+0x17d2, 0x1782, 0x17b6, 0x179a, 0x3b, 0x1796, 0x17bb, 0x1792, 0x3b, 0x1796, 0x17d2, 0x179a,
+0x17a0, 0x179f, 0x17d2, 0x1794, 0x178f, 0x17b7, 0x17cd, 0x3b, 0x179f, 0x17bb, 0x1780, 0x17d2,
+0x179a, 0x3b, 0x179f, 0x17c5, 0x179a, 0x17cd, 0x17a2, 0x17b6, 0x1791, 0x17b7, 0x178f, 0x17d2,
+0x1799, 0x3b, 0x1785, 0x17d0, 0x1793, 0x17d2, 0x1791, 0x3b, 0x17a2, 0x1784, 0x17d2, 0x1782,
+0x17b6, 0x179a, 0x3b, 0x1796, 0x17bb, 0x1792, 0x3b, 0x1796, 0x17d2, 0x179a, 0x17a0, 0x179f,
+0x17d2, 0x1794, 0x178f, 0x17b7, 0x17cd, 0x3b, 0x179f, 0x17bb, 0x1780, 0x17d2, 0x179a, 0x3b,
+0x179f, 0x17c5, 0x179a, 0x17cd, 0x17a2, 0x17b6, 0x1791, 0x17b7, 0x178f, 0x17d2, 0x1799, 0x3b,
+0x1785, 0x1793, 0x17d2, 0x1791, 0x3b, 0x17a2, 0x1784, 0x17d2, 0x1782, 0x17b6, 0x179a, 0x3b,
+0x1796, 0x17bb, 0x1792, 0x3b, 0x1796, 0x17d2, 0x179a, 0x17a0, 0x3b, 0x179f, 0x17bb, 0x1780,
+0x17d2, 0x179a, 0x3b, 0x179f, 0x17c5, 0x179a, 0x17cd, 0x17a2, 0x3b, 0x1785, 0x3b, 0x17a2,
+0x3b, 0x1796, 0x3b, 0x1796, 0x3b, 0x179f, 0x3b, 0x179f, 0x4b, 0x69, 0x75, 0x6d,
+0x69, 0x61, 0x3b, 0x4e, 0x6a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x74, 0x169,
+0x3b, 0x4e, 0x6a, 0x75, 0x6d, 0x61, 0x69, 0x6e, 0x65, 0x3b, 0x4e, 0x6a,
+0x75, 0x6d, 0x61, 0x74, 0x61, 0x6e, 0x61, 0x3b, 0x41, 0x72, 0x61, 0x6d,
+0x69, 0x74, 0x68, 0x69, 0x3b, 0x4e, 0x6a, 0x75, 0x6d, 0x61, 0x61, 0x3b,
+0x4e, 0x6a, 0x75, 0x6d, 0x61, 0x6d, 0x6f, 0x74, 0x68, 0x69, 0x4b, 0x4d,
+0x41, 0x3b, 0x4e, 0x54, 0x54, 0x3b, 0x4e, 0x4d, 0x4e, 0x3b, 0x4e, 0x4d,
+0x54, 0x3b, 0x41, 0x52, 0x54, 0x3b, 0x4e, 0x4d, 0x41, 0x3b, 0x4e, 0x4d,
+0x4d, 0x4b, 0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x41, 0x3b, 0x4e,
+0x3b, 0x4e, 0x4b, 0x75, 0x20, 0x63, 0x79, 0x75, 0x6d, 0x77, 0x65, 0x72,
+0x75, 0x3b, 0x4b, 0x75, 0x77, 0x61, 0x20, 0x6d, 0x62, 0x65, 0x72, 0x65,
+0x3b, 0x4b, 0x75, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x62, 0x69, 0x72, 0x69,
+0x3b, 0x4b, 0x75, 0x77, 0x61, 0x20, 0x67, 0x61, 0x74, 0x61, 0x74, 0x75,
+0x3b, 0x4b, 0x75, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x6e, 0x65, 0x3b, 0x4b,
+0x75, 0x77, 0x61, 0x20, 0x67, 0x61, 0x74, 0x61, 0x6e, 0x75, 0x3b, 0x4b,
+0x75, 0x77, 0x61, 0x20, 0x67, 0x61, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x74,
+0x75, 0x63, 0x79, 0x75, 0x2e, 0x3b, 0x6d, 0x62, 0x65, 0x2e, 0x3b, 0x6b,
+0x61, 0x62, 0x2e, 0x3b, 0x67, 0x74, 0x75, 0x2e, 0x3b, 0x6b, 0x61, 0x6e,
+0x2e, 0x3b, 0x67, 0x6e, 0x75, 0x2e, 0x3b, 0x67, 0x6e, 0x64, 0x2e, 0x906,
+0x92f, 0x924, 0x93e, 0x930, 0x3b, 0x938, 0x94b, 0x92e, 0x93e, 0x930, 0x3b, 0x92e,
+0x902, 0x917, 0x933, 0x93e, 0x930, 0x3b, 0x92c, 0x941, 0x927, 0x935, 0x93e, 0x930,
+0x3b, 0x92c, 0x93f, 0x930, 0x947, 0x938, 0x94d, 0x924, 0x93e, 0x930, 0x3b, 0x936,
+0x941, 0x915, 0x94d, 0x930, 0x93e, 0x930, 0x3b, 0x936, 0x947, 0x928, 0x935, 0x93e,
+0x930, 0x906, 0x3b, 0x938, 0x94b, 0x3b, 0x92e, 0x902, 0x3b, 0x92c, 0x941, 0x3b,
+0x92c, 0x3b, 0x936, 0x941, 0x3b, 0x936, 0x947, 0x906, 0x3b, 0x938, 0x94b, 0x3b,
+0x92e, 0x902, 0x3b, 0x92c, 0x941, 0x3b, 0x92c, 0x93f, 0x3b, 0x936, 0x941, 0x3b,
+0x936, 0x947, 0xc77c, 0xc694, 0xc77c, 0x3b, 0xc6d4, 0xc694, 0xc77c, 0x3b, 0xd654, 0xc694,
+0xc77c, 0x3b, 0xc218, 0xc694, 0xc77c, 0x3b, 0xbaa9, 0xc694, 0xc77c, 0x3b, 0xae08, 0xc694,
+0xc77c, 0x3b, 0xd1a0, 0xc694, 0xc77c, 0xc77c, 0x3b, 0xc6d4, 0x3b, 0xd654, 0x3b, 0xc218,
+0x3b, 0xbaa9, 0x3b, 0xae08, 0x3b, 0xd1a0, 0x41, 0x6c, 0x68, 0x61, 0x64, 0x69,
+0x3b, 0x41, 0x74, 0x69, 0x6e, 0x6e, 0x69, 0x3b, 0x41, 0x74, 0x61, 0x6c,
+0x61, 0x61, 0x74, 0x61, 0x3b, 0x41, 0x6c, 0x61, 0x72, 0x62, 0x61, 0x3b,
+0x41, 0x6c, 0x68, 0x61, 0x6d, 0x69, 0x69, 0x73, 0x61, 0x3b, 0x41, 0x6c,
+0x7a, 0x75, 0x6d, 0x61, 0x3b, 0x41, 0x73, 0x69, 0x62, 0x74, 0x69, 0x41,
+0x6c, 0x68, 0x3b, 0x41, 0x74, 0x69, 0x3b, 0x41, 0x74, 0x61, 0x3b, 0x41,
+0x6c, 0x61, 0x3b, 0x41, 0x6c, 0x6d, 0x3b, 0x41, 0x6c, 0x7a, 0x3b, 0x41,
+0x73, 0x69, 0x48, 0x3b, 0x54, 0x3b, 0x54, 0x3b, 0x4c, 0x3b, 0x4c, 0x3b,
+0x4c, 0x3b, 0x53, 0x41, 0x6c, 0x68, 0x61, 0x64, 0x69, 0x3b, 0x41, 0x74,
+0x69, 0x6e, 0x69, 0x3b, 0x41, 0x74, 0x61, 0x6c, 0x61, 0x74, 0x61, 0x3b,
+0x41, 0x6c, 0x61, 0x72, 0x62, 0x61, 0x3b, 0x41, 0x6c, 0x68, 0x61, 0x6d,
+0x69, 0x69, 0x73, 0x61, 0x3b, 0x41, 0x6c, 0x6a, 0x75, 0x6d, 0x61, 0x3b,
+0x41, 0x73, 0x73, 0x61, 0x62, 0x64, 0x75, 0x41, 0x6c, 0x68, 0x3b, 0x41,
+0x74, 0x69, 0x3b, 0x41, 0x74, 0x61, 0x3b, 0x41, 0x6c, 0x61, 0x3b, 0x41,
+0x6c, 0x6d, 0x3b, 0x41, 0x6c, 0x6a, 0x3b, 0x41, 0x73, 0x73, 0x79, 0x65,
+0x6b, 0x15f, 0x65, 0x6d, 0x3b, 0x64, 0x75, 0x15f, 0x65, 0x6d, 0x3b, 0x73,
+0xea, 0x15f, 0x65, 0x6d, 0x3b, 0xe7, 0x61, 0x72, 0x15f, 0x65, 0x6d, 0x3b,
+0x70, 0xea, 0x6e, 0x63, 0x15f, 0x65, 0x6d, 0x3b, 0xee, 0x6e, 0xee, 0x3b,
+0x15f, 0x65, 0x6d, 0xee, 0x79, 0x15f, 0x6d, 0x3b, 0x64, 0x15f, 0x6d, 0x3b,
+0x73, 0x15f, 0x6d, 0x3b, 0xe7, 0x15f, 0x6d, 0x3b, 0x70, 0x15f, 0x6d, 0x3b,
+0xee, 0x6e, 0xee, 0x3b, 0x15f, 0x65, 0x6d, 0x59, 0x3b, 0x44, 0x3b, 0x53,
+0x3b, 0xc7, 0x3b, 0x50, 0x3b, 0xce, 0x3b, 0x15e, 0x73, 0x254, 0x301, 0x6e,
+0x64, 0x254, 0x3b, 0x6d, 0x254, 0x301, 0x6e, 0x64, 0x254, 0x3b, 0x73, 0x254,
+0x301, 0x6e, 0x64, 0x254, 0x20, 0x6d, 0x61, 0x66, 0xfa, 0x20, 0x6d, 0xe1,
+0x62, 0x61, 0x3b, 0x73, 0x254, 0x301, 0x6e, 0x64, 0x254, 0x20, 0x6d, 0x61,
+0x66, 0xfa, 0x20, 0x6d, 0xe1, 0x6c, 0x61, 0x6c, 0x3b, 0x73, 0x254, 0x301,
+0x6e, 0x64, 0x254, 0x20, 0x6d, 0x61, 0x66, 0xfa, 0x20, 0x6d, 0xe1, 0x6e,
+0x61, 0x3b, 0x6d, 0x61, 0x62, 0xe1, 0x67, 0xe1, 0x20, 0x6d, 0xe1, 0x20,
+0x73, 0x75, 0x6b, 0x75, 0x6c, 0x3b, 0x73, 0xe1, 0x73, 0x61, 0x64, 0x69,
+0x73, 0x254, 0x301, 0x6e, 0x3b, 0x6d, 0x254, 0x301, 0x6e, 0x3b, 0x73, 0x6d,
+0x62, 0x3b, 0x73, 0x6d, 0x6c, 0x3b, 0x73, 0x6d, 0x6e, 0x3b, 0x6d, 0x62,
+0x73, 0x3b, 0x73, 0x61, 0x73, 0x73, 0x3b, 0x6d, 0x3b, 0x73, 0x3b, 0x73,
+0x3b, 0x73, 0x3b, 0x6d, 0x3b, 0x73, 0x436, 0x435, 0x43a, 0x448, 0x435, 0x43c,
+0x431, 0x438, 0x3b, 0x434, 0x4af, 0x439, 0x448, 0x4e9, 0x43c, 0x431, 0x4af, 0x3b,
+0x448, 0x435, 0x439, 0x448, 0x435, 0x43c, 0x431, 0x438, 0x3b, 0x448, 0x430, 0x440,
+0x448, 0x435, 0x43c, 0x431, 0x438, 0x3b, 0x431, 0x435, 0x439, 0x448, 0x435, 0x43c,
+0x431, 0x438, 0x3b, 0x436, 0x443, 0x43c, 0x430, 0x3b, 0x438, 0x448, 0x435, 0x43c,
+0x431, 0x438, 0x436, 0x435, 0x43a, 0x2e, 0x3b, 0x434, 0x4af, 0x439, 0x2e, 0x3b,
+0x448, 0x435, 0x439, 0x448, 0x2e, 0x3b, 0x448, 0x430, 0x440, 0x448, 0x2e, 0x3b,
+0x431, 0x435, 0x439, 0x448, 0x2e, 0x3b, 0x436, 0x443, 0x43c, 0x430, 0x3b, 0x438,
+0x448, 0x43c, 0x2e, 0x416, 0x3b, 0x414, 0x3b, 0x428, 0x3b, 0x428, 0x3b, 0x411,
+0x3b, 0x416, 0x3b, 0x418, 0x41, 0x14b, 0x70, 0xe9, 0x74, 0x75, 0x77, 0x61,
+0x6b, 0x21f, 0x61, 0x14b, 0x3b, 0x41, 0x14b, 0x70, 0xe9, 0x74, 0x75, 0x77,
+0x61, 0x14b, 0x17e, 0x69, 0x3b, 0x41, 0x14b, 0x70, 0xe9, 0x74, 0x75, 0x6e,
+0x75, 0x14b, 0x70, 0x61, 0x3b, 0x41, 0x14b, 0x70, 0xe9, 0x74, 0x75, 0x79,
+0x61, 0x6d, 0x6e, 0x69, 0x3b, 0x41, 0x14b, 0x70, 0xe9, 0x74, 0x75, 0x74,
+0x6f, 0x70, 0x61, 0x3b, 0x41, 0x14b, 0x70, 0xe9, 0x74, 0x75, 0x7a, 0x61,
+0x70, 0x74, 0x61, 0x14b, 0x3b, 0x4f, 0x77, 0xe1, 0x14b, 0x67, 0x79, 0x75,
+0x17e, 0x61, 0x17e, 0x61, 0x70, 0x69, 0x41, 0x3b, 0x57, 0x3b, 0x4e, 0x3b,
+0x59, 0x3b, 0x54, 0x3b, 0x5a, 0x3b, 0x4f, 0x4a, 0x75, 0x6d, 0x61, 0x70,
+0xed, 0x69, 0x72, 0x69, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74, 0xe1, 0x74,
+0x75, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0xed, 0x6e, 0x65, 0x3b, 0x4a, 0x75,
+0x6d, 0x61, 0x74, 0xe1, 0x61, 0x6e, 0x6f, 0x3b, 0x41, 0x6c, 0x61, 0x6d,
+0xed, 0x69, 0x73, 0x69, 0x3b, 0x49, 0x6a, 0x75, 0x6d, 0xe1, 0x61, 0x3b,
+0x4a, 0x75, 0x6d, 0x61, 0x6d, 0xf3, 0x6f, 0x73, 0x69, 0x50, 0xed, 0x69,
+0x6c, 0x69, 0x3b, 0x54, 0xe1, 0x61, 0x74, 0x75, 0x3b, 0xcd, 0x6e, 0x65,
+0x3b, 0x54, 0xe1, 0x61, 0x6e, 0x6f, 0x3b, 0x41, 0x6c, 0x68, 0x3b, 0x49,
+0x6a, 0x6d, 0x3b, 0x4d, 0xf3, 0x6f, 0x73, 0x69, 0x50, 0x3b, 0x54, 0x3b,
+0x45, 0x3b, 0x4f, 0x3b, 0x41, 0x3b, 0x49, 0x3b, 0x4d, 0xea7, 0xeb1, 0xe99,
+0xead, 0xeb2, 0xe97, 0xeb4, 0xe94, 0x3b, 0xea7, 0xeb1, 0xe99, 0xe88, 0xeb1, 0xe99,
+0x3b, 0xea7, 0xeb1, 0xe99, 0xead, 0xeb1, 0xe87, 0xe84, 0xeb2, 0xe99, 0x3b, 0xea7,
+0xeb1, 0xe99, 0xe9e, 0xeb8, 0xe94, 0x3b, 0xea7, 0xeb1, 0xe99, 0xe9e, 0xeb0, 0xeab,
+0xeb1, 0xe94, 0x3b, 0xea7, 0xeb1, 0xe99, 0xeaa, 0xeb8, 0xe81, 0x3b, 0xea7, 0xeb1,
+0xe99, 0xec0, 0xeaa, 0xebb, 0xeb2, 0xead, 0xeb2, 0xe97, 0xeb4, 0xe94, 0x3b, 0xe88,
+0xeb1, 0xe99, 0x3b, 0xead, 0xeb1, 0xe87, 0xe84, 0xeb2, 0xe99, 0x3b, 0xe9e, 0xeb8,
+0xe94, 0x3b, 0xe9e, 0xeb0, 0xeab, 0xeb1, 0xe94, 0x3b, 0xeaa, 0xeb8, 0xe81, 0x3b,
+0xec0, 0xeaa, 0xebb, 0xeb2, 0xead, 0xeb2, 0x3b, 0xe88, 0x3b, 0xead, 0x3b, 0xe9e,
+0x3b, 0xe9e, 0xeab, 0x3b, 0xeaa, 0xeb8, 0x3b, 0xeaa, 0x64, 0x69, 0x65, 0x73,
+0x20, 0x53, 0x6f, 0x6c, 0x69, 0x73, 0x3b, 0x64, 0x69, 0x65, 0x73, 0x20,
+0x4c, 0x75, 0x6e, 0x61, 0x65, 0x3b, 0x64, 0x69, 0x65, 0x73, 0x20, 0x4d,
+0x61, 0x72, 0x74, 0x69, 0x73, 0x3b, 0x64, 0x69, 0x65, 0x73, 0x20, 0x4d,
+0x65, 0x72, 0x63, 0x75, 0x72, 0x69, 0x69, 0x3b, 0x64, 0x69, 0x65, 0x73,
+0x20, 0x49, 0x6f, 0x76, 0x69, 0x73, 0x3b, 0x64, 0x69, 0x65, 0x73, 0x20,
+0x56, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x73, 0x3b, 0x64, 0x69, 0x65, 0x73,
+0x20, 0x53, 0x61, 0x74, 0x75, 0x72, 0x6e, 0x69, 0x53, 0x6f, 0x6c, 0x3b,
+0x4c, 0x75, 0x6e, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x4d, 0x65, 0x72, 0x3b,
+0x49, 0x6f, 0x76, 0x3b, 0x56, 0x65, 0x6e, 0x3b, 0x53, 0x61, 0x74, 0x53,
+0x76, 0x113, 0x74, 0x64, 0x69, 0x65, 0x6e, 0x61, 0x3b, 0x50, 0x69, 0x72,
+0x6d, 0x64, 0x69, 0x65, 0x6e, 0x61, 0x3b, 0x4f, 0x74, 0x72, 0x64, 0x69,
+0x65, 0x6e, 0x61, 0x3b, 0x54, 0x72, 0x65, 0x161, 0x64, 0x69, 0x65, 0x6e,
+0x61, 0x3b, 0x43, 0x65, 0x74, 0x75, 0x72, 0x74, 0x64, 0x69, 0x65, 0x6e,
+0x61, 0x3b, 0x50, 0x69, 0x65, 0x6b, 0x74, 0x64, 0x69, 0x65, 0x6e, 0x61,
+0x3b, 0x53, 0x65, 0x73, 0x74, 0x64, 0x69, 0x65, 0x6e, 0x61, 0x73, 0x76,
+0x113, 0x74, 0x64, 0x69, 0x65, 0x6e, 0x61, 0x3b, 0x70, 0x69, 0x72, 0x6d,
+0x64, 0x69, 0x65, 0x6e, 0x61, 0x3b, 0x6f, 0x74, 0x72, 0x64, 0x69, 0x65,
+0x6e, 0x61, 0x3b, 0x74, 0x72, 0x65, 0x161, 0x64, 0x69, 0x65, 0x6e, 0x61,
+0x3b, 0x63, 0x65, 0x74, 0x75, 0x72, 0x74, 0x64, 0x69, 0x65, 0x6e, 0x61,
+0x3b, 0x70, 0x69, 0x65, 0x6b, 0x74, 0x64, 0x69, 0x65, 0x6e, 0x61, 0x3b,
+0x73, 0x65, 0x73, 0x74, 0x64, 0x69, 0x65, 0x6e, 0x61, 0x53, 0x76, 0x113,
+0x74, 0x64, 0x2e, 0x3b, 0x50, 0x69, 0x72, 0x6d, 0x64, 0x2e, 0x3b, 0x4f,
+0x74, 0x72, 0x64, 0x2e, 0x3b, 0x54, 0x72, 0x65, 0x161, 0x64, 0x2e, 0x3b,
+0x43, 0x65, 0x74, 0x75, 0x72, 0x74, 0x64, 0x2e, 0x3b, 0x50, 0x69, 0x65,
+0x6b, 0x74, 0x64, 0x2e, 0x3b, 0x53, 0x65, 0x73, 0x74, 0x64, 0x2e, 0x73,
+0x76, 0x113, 0x74, 0x64, 0x2e, 0x3b, 0x70, 0x69, 0x72, 0x6d, 0x64, 0x2e,
+0x3b, 0x6f, 0x74, 0x72, 0x64, 0x2e, 0x3b, 0x74, 0x72, 0x65, 0x161, 0x64,
+0x2e, 0x3b, 0x63, 0x65, 0x74, 0x75, 0x72, 0x74, 0x64, 0x2e, 0x3b, 0x70,
+0x69, 0x65, 0x6b, 0x74, 0x64, 0x2e, 0x3b, 0x73, 0x65, 0x73, 0x74, 0x64,
+0x2e, 0x53, 0x3b, 0x50, 0x3b, 0x4f, 0x3b, 0x54, 0x3b, 0x43, 0x3b, 0x50,
+0x3b, 0x53, 0x65, 0x79, 0x65, 0x6e, 0x67, 0x61, 0x3b, 0x6d, 0x6f, 0x6b,
+0x254, 0x6c, 0x254, 0x20, 0x6d, 0x77, 0x61, 0x20, 0x79, 0x61, 0x6d, 0x62,
+0x6f, 0x3b, 0x6d, 0x6f, 0x6b, 0x254, 0x6c, 0x254, 0x20, 0x6d, 0x77, 0x61,
+0x20, 0x6d, 0xed, 0x62, 0x61, 0x6c, 0xe9, 0x3b, 0x6d, 0x6f, 0x6b, 0x254,
+0x6c, 0x254, 0x20, 0x6d, 0x77, 0x61, 0x20, 0x6d, 0xed, 0x73, 0xe1, 0x74,
+0x6f, 0x3b, 0x6d, 0x6f, 0x6b, 0x254, 0x6c, 0x254, 0x20, 0x79, 0x61, 0x20,
+0x6d, 0xed, 0x6e, 0xe9, 0x69, 0x3b, 0x6d, 0x6f, 0x6b, 0x254, 0x6c, 0x254,
+0x20, 0x79, 0x61, 0x20, 0x6d, 0xed, 0x74, 0xe1, 0x6e, 0x6f, 0x3b, 0x6d,
+0x70, 0x254, 0x301, 0x73, 0x254, 0x65, 0x79, 0x65, 0x3b, 0x79, 0x62, 0x6f,
+0x3b, 0x6d, 0x62, 0x6c, 0x3b, 0x6d, 0x73, 0x74, 0x3b, 0x6d, 0x69, 0x6e,
+0x3b, 0x6d, 0x74, 0x6e, 0x3b, 0x6d, 0x70, 0x73, 0x65, 0x3b, 0x79, 0x3b,
+0x6d, 0x3b, 0x6d, 0x3b, 0x6d, 0x3b, 0x6d, 0x3b, 0x70, 0x73, 0x65, 0x6b,
+0x6d, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x69, 0x73, 0x3b, 0x70, 0x69, 0x72,
+0x6d, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x69, 0x73, 0x3b, 0x61, 0x6e, 0x74,
+0x72, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x69, 0x73, 0x3b, 0x74, 0x72, 0x65,
+0x10d, 0x69, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x69, 0x73, 0x3b, 0x6b, 0x65,
+0x74, 0x76, 0x69, 0x72, 0x74, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x69, 0x73,
+0x3b, 0x70, 0x65, 0x6e, 0x6b, 0x74, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x69,
+0x73, 0x3b, 0x161, 0x65, 0x161, 0x74, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x69,
+0x73, 0x73, 0x6b, 0x3b, 0x70, 0x72, 0x3b, 0x61, 0x6e, 0x3b, 0x74, 0x72,
+0x3b, 0x6b, 0x74, 0x3b, 0x70, 0x6e, 0x3b, 0x161, 0x74, 0x53, 0x3b, 0x50,
+0x3b, 0x41, 0x3b, 0x54, 0x3b, 0x4b, 0x3b, 0x50, 0x3b, 0x160, 0x6e, 0x6a,
+0x65, 0x17a, 0x65, 0x6c, 0x61, 0x3b, 0x70, 0xf3, 0x6e, 0x6a, 0x65, 0x17a,
+0x65, 0x6c, 0x65, 0x3b, 0x77, 0x61, 0x142, 0x74, 0x6f, 0x72, 0x61, 0x3b,
+0x73, 0x72, 0x6a, 0x6f, 0x64, 0x61, 0x3b, 0x73, 0x74, 0x77, 0xf3, 0x72,
+0x74, 0x6b, 0x3b, 0x70, 0x11b, 0x74, 0x6b, 0x3b, 0x73, 0x6f, 0x62, 0x6f,
+0x74, 0x61, 0x6e, 0x6a, 0x65, 0x3b, 0x70, 0xf3, 0x6e, 0x3b, 0x77, 0x61,
+0x142, 0x3b, 0x73, 0x72, 0x6a, 0x3b, 0x73, 0x74, 0x77, 0x3b, 0x70, 0x11b,
+0x74, 0x3b, 0x73, 0x6f, 0x62, 0x6e, 0x3b, 0x70, 0x3b, 0x77, 0x3b, 0x73,
+0x3b, 0x73, 0x3b, 0x70, 0x3b, 0x73, 0x53, 0xfc, 0x6e, 0x6e, 0x64, 0x61,
+0x67, 0x3b, 0x4d, 0x61, 0x61, 0x6e, 0x64, 0x61, 0x67, 0x3b, 0x44, 0x69,
+0x6e, 0x67, 0x73, 0x64, 0x61, 0x67, 0x3b, 0x4d, 0x69, 0x64, 0x64, 0x65,
+0x77, 0x65, 0x6b, 0x65, 0x6e, 0x3b, 0x44, 0x75, 0x6e, 0x6e, 0x65, 0x72,
+0x73, 0x64, 0x61, 0x67, 0x3b, 0x46, 0x72, 0x65, 0x65, 0x64, 0x61, 0x67,
+0x3b, 0x53, 0xfc, 0x6e, 0x6e, 0x61, 0x76, 0x65, 0x6e, 0x64, 0x53, 0xfc,
+0x2e, 0x3b, 0x4d, 0x61, 0x2e, 0x3b, 0x44, 0x69, 0x2e, 0x3b, 0x4d, 0x69,
+0x2e, 0x3b, 0x44, 0x75, 0x2e, 0x3b, 0x46, 0x72, 0x2e, 0x3b, 0x53, 0x61,
+0x2e, 0x4c, 0x75, 0x6d, 0x69, 0x6e, 0x67, 0x75, 0x3b, 0x4e, 0x6b, 0x6f,
+0x64, 0x79, 0x61, 0x3b, 0x4e, 0x64, 0xe0, 0x61, 0x79, 0xe0, 0x3b, 0x4e,
+0x64, 0x61, 0x6e, 0x67, 0xf9, 0x3b, 0x4e, 0x6a, 0xf2, 0x77, 0x61, 0x3b,
+0x4e, 0x67, 0xf2, 0x76, 0x79, 0x61, 0x3b, 0x4c, 0x75, 0x62, 0x69, 0x6e,
+0x67, 0x75, 0x4c, 0x75, 0x6d, 0x3b, 0x4e, 0x6b, 0x6f, 0x3b, 0x4e, 0x64,
+0x79, 0x3b, 0x4e, 0x64, 0x67, 0x3b, 0x4e, 0x6a, 0x77, 0x3b, 0x4e, 0x67,
+0x76, 0x3b, 0x4c, 0x75, 0x62, 0x4c, 0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x4e,
+0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x4c, 0x4a, 0x75, 0x6d, 0x61, 0x70, 0x69,
+0x6c, 0x3b, 0x57, 0x75, 0x6f, 0x6b, 0x20, 0x54, 0x69, 0x63, 0x68, 0x3b,
+0x54, 0x69, 0x63, 0x68, 0x20, 0x41, 0x72, 0x69, 0x79, 0x6f, 0x3b, 0x54,
+0x69, 0x63, 0x68, 0x20, 0x41, 0x64, 0x65, 0x6b, 0x3b, 0x54, 0x69, 0x63,
+0x68, 0x20, 0x41, 0x6e, 0x67, 0x2019, 0x77, 0x65, 0x6e, 0x3b, 0x54, 0x69,
+0x63, 0x68, 0x20, 0x41, 0x62, 0x69, 0x63, 0x68, 0x3b, 0x4e, 0x67, 0x65,
+0x73, 0x6f, 0x4a, 0x4d, 0x50, 0x3b, 0x57, 0x55, 0x54, 0x3b, 0x54, 0x41,
+0x52, 0x3b, 0x54, 0x41, 0x44, 0x3b, 0x54, 0x41, 0x4e, 0x3b, 0x54, 0x41,
+0x42, 0x3b, 0x4e, 0x47, 0x53, 0x4a, 0x3b, 0x57, 0x3b, 0x54, 0x3b, 0x54,
+0x3b, 0x54, 0x3b, 0x54, 0x3b, 0x4e, 0x53, 0x6f, 0x6e, 0x6e, 0x64, 0x65,
+0x67, 0x3b, 0x4d, 0xe9, 0x69, 0x6e, 0x64, 0x65, 0x67, 0x3b, 0x44, 0xeb,
+0x6e, 0x73, 0x63, 0x68, 0x64, 0x65, 0x67, 0x3b, 0x4d, 0xeb, 0x74, 0x74,
+0x77, 0x6f, 0x63, 0x68, 0x3b, 0x44, 0x6f, 0x6e, 0x6e, 0x65, 0x73, 0x63,
+0x68, 0x64, 0x65, 0x67, 0x3b, 0x46, 0x72, 0x65, 0x69, 0x64, 0x65, 0x67,
+0x3b, 0x53, 0x61, 0x6d, 0x73, 0x63, 0x68, 0x64, 0x65, 0x67, 0x53, 0x6f,
+0x6e, 0x3b, 0x4d, 0xe9, 0x69, 0x3b, 0x44, 0xeb, 0x6e, 0x3b, 0x4d, 0xeb,
+0x74, 0x3b, 0x44, 0x6f, 0x6e, 0x3b, 0x46, 0x72, 0x65, 0x3b, 0x53, 0x61,
+0x6d, 0x53, 0x6f, 0x6e, 0x2e, 0x3b, 0x4d, 0xe9, 0x69, 0x2e, 0x3b, 0x44,
+0xeb, 0x6e, 0x2e, 0x3b, 0x4d, 0xeb, 0x74, 0x2e, 0x3b, 0x44, 0x6f, 0x6e,
+0x2e, 0x3b, 0x46, 0x72, 0x65, 0x2e, 0x3b, 0x53, 0x61, 0x6d, 0x2e, 0x4a,
+0x75, 0x6d, 0x61, 0x70, 0x69, 0x72, 0x69, 0x3b, 0x4a, 0x75, 0x6d, 0x61,
+0x74, 0x61, 0x74, 0x75, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x6e, 0x6e, 0x65,
+0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x4d, 0x75,
+0x72, 0x77, 0x61, 0x20, 0x77, 0x61, 0x20, 0x4b, 0x61, 0x6e, 0x6e, 0x65,
+0x3b, 0x4d, 0x75, 0x72, 0x77, 0x61, 0x20, 0x77, 0x61, 0x20, 0x4b, 0x61,
+0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x6d, 0x6f, 0x73,
+0x69, 0x4a, 0x32, 0x3b, 0x4a, 0x33, 0x3b, 0x4a, 0x34, 0x3b, 0x4a, 0x35,
+0x3b, 0x41, 0x6c, 0x3b, 0x49, 0x6a, 0x3b, 0x4a, 0x31, 0x43d, 0x435, 0x434,
+0x435, 0x43b, 0x430, 0x3b, 0x43f, 0x43e, 0x43d, 0x435, 0x434, 0x435, 0x43b, 0x43d,
+0x438, 0x43a, 0x3b, 0x432, 0x442, 0x43e, 0x440, 0x43d, 0x438, 0x43a, 0x3b, 0x441,
+0x440, 0x435, 0x434, 0x430, 0x3b, 0x447, 0x435, 0x442, 0x432, 0x440, 0x442, 0x43e,
+0x43a, 0x3b, 0x43f, 0x435, 0x442, 0x43e, 0x43a, 0x3b, 0x441, 0x430, 0x431, 0x43e,
+0x442, 0x430, 0x43d, 0x435, 0x434, 0x2e, 0x3b, 0x43f, 0x43e, 0x43d, 0x2e, 0x3b,
+0x432, 0x442, 0x43e, 0x2e, 0x3b, 0x441, 0x440, 0x435, 0x2e, 0x3b, 0x447, 0x435,
+0x442, 0x2e, 0x3b, 0x43f, 0x435, 0x442, 0x2e, 0x3b, 0x441, 0x430, 0x431, 0x2e,
+0x4a, 0x75, 0x6d, 0x61, 0x70, 0x69, 0x6c, 0x79, 0x69, 0x3b, 0x4a, 0x75,
+0x6d, 0x61, 0x74, 0x61, 0x74, 0x75, 0x75, 0x3b, 0x4a, 0x75, 0x6d, 0x61,
+0x6e, 0x6e, 0x65, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x6e, 0x75,
+0x3b, 0x41, 0x6c, 0x68, 0x61, 0x6d, 0x69, 0x73, 0x69, 0x3b, 0x49, 0x6a,
+0x75, 0x6d, 0x61, 0x61, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x6d, 0x6f, 0x73,
+0x69, 0x4a, 0x70, 0x69, 0x3b, 0x4a, 0x74, 0x74, 0x3b, 0x4a, 0x6e, 0x6e,
+0x3b, 0x4a, 0x74, 0x6e, 0x3b, 0x41, 0x6c, 0x68, 0x3b, 0x49, 0x6a, 0x75,
+0x3b, 0x4a, 0x6d, 0x6f, 0x930, 0x935, 0x93f, 0x20, 0x926, 0x93f, 0x928, 0x3b,
+0x938, 0x94b, 0x92e, 0x20, 0x926, 0x93f, 0x928, 0x3b, 0x92e, 0x902, 0x917, 0x932,
+0x20, 0x926, 0x93f, 0x928, 0x3b, 0x92c, 0x941, 0x927, 0x20, 0x926, 0x93f, 0x928,
+0x3b, 0x92c, 0x943, 0x939, 0x938, 0x94d, 0x92a, 0x924, 0x93f, 0x20, 0x926, 0x93f,
+0x928, 0x3b, 0x936, 0x941, 0x915, 0x94d, 0x930, 0x20, 0x926, 0x93f, 0x928, 0x3b,
+0x936, 0x928, 0x93f, 0x20, 0x926, 0x93f, 0x928, 0x53, 0x61, 0x62, 0x61, 0x74,
+0x6f, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x4a,
+0x75, 0x6d, 0x61, 0x6e, 0x6e, 0x65, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74,
+0x61, 0x6e, 0x6f, 0x3b, 0x41, 0x72, 0x61, 0x68, 0x61, 0x6d, 0x69, 0x73,
+0x69, 0x3b, 0x49, 0x6a, 0x75, 0x6d, 0x61, 0x61, 0x3b, 0x4a, 0x75, 0x6d,
+0x61, 0x6d, 0x6f, 0x73, 0x69, 0x53, 0x61, 0x62, 0x3b, 0x4a, 0x74, 0x74,
+0x3b, 0x4a, 0x6e, 0x6e, 0x3b, 0x4a, 0x74, 0x6e, 0x3b, 0x41, 0x72, 0x61,
+0x3b, 0x49, 0x6a, 0x75, 0x3b, 0x4a, 0x6d, 0x6f, 0x53, 0x3b, 0x4a, 0x3b,
+0x4a, 0x3b, 0x4a, 0x3b, 0x41, 0x3b, 0x49, 0x3b, 0x4a, 0x4c, 0x69, 0x64,
+0x75, 0x76, 0x61, 0x20, 0x6c, 0x79, 0x61, 0x70, 0x69, 0x6c, 0x69, 0x3b,
+0x4c, 0x69, 0x64, 0x75, 0x76, 0x61, 0x20, 0x6c, 0x79, 0x61, 0x74, 0x61,
+0x74, 0x75, 0x3b, 0x4c, 0x69, 0x64, 0x75, 0x76, 0x61, 0x20, 0x6c, 0x79,
+0x61, 0x6e, 0x63, 0x68, 0x65, 0x63, 0x68, 0x69, 0x3b, 0x4c, 0x69, 0x64,
+0x75, 0x76, 0x61, 0x20, 0x6c, 0x79, 0x61, 0x6e, 0x6e, 0x79, 0x61, 0x6e,
+0x6f, 0x3b, 0x4c, 0x69, 0x64, 0x75, 0x76, 0x61, 0x20, 0x6c, 0x79, 0x61,
+0x6e, 0x6e, 0x79, 0x61, 0x6e, 0x6f, 0x20, 0x6e, 0x61, 0x20, 0x6c, 0x69,
+0x6e, 0x6a, 0x69, 0x3b, 0x4c, 0x69, 0x64, 0x75, 0x76, 0x61, 0x20, 0x6c,
+0x79, 0x61, 0x6e, 0x6e, 0x79, 0x61, 0x6e, 0x6f, 0x20, 0x6e, 0x61, 0x20,
+0x6d, 0x61, 0x76, 0x69, 0x6c, 0x69, 0x3b, 0x4c, 0x69, 0x64, 0x75, 0x76,
+0x61, 0x20, 0x6c, 0x69, 0x74, 0x61, 0x6e, 0x64, 0x69, 0x4c, 0x6c, 0x32,
+0x3b, 0x4c, 0x6c, 0x33, 0x3b, 0x4c, 0x6c, 0x34, 0x3b, 0x4c, 0x6c, 0x35,
+0x3b, 0x4c, 0x6c, 0x36, 0x3b, 0x4c, 0x6c, 0x37, 0x3b, 0x4c, 0x6c, 0x31,
+0x32, 0x3b, 0x33, 0x3b, 0x34, 0x3b, 0x35, 0x3b, 0x36, 0x3b, 0x37, 0x3b,
+0x31, 0x41, 0x6c, 0x61, 0x68, 0x61, 0x64, 0x79, 0x3b, 0x41, 0x6c, 0x61,
+0x74, 0x73, 0x69, 0x6e, 0x61, 0x69, 0x6e, 0x79, 0x3b, 0x54, 0x61, 0x6c,
+0x61, 0x74, 0x61, 0x3b, 0x41, 0x6c, 0x61, 0x72, 0x6f, 0x62, 0x69, 0x61,
+0x3b, 0x41, 0x6c, 0x61, 0x6b, 0x61, 0x6d, 0x69, 0x73, 0x79, 0x3b, 0x5a,
+0x6f, 0x6d, 0x61, 0x3b, 0x41, 0x73, 0x61, 0x62, 0x6f, 0x74, 0x73, 0x79,
+0x41, 0x6c, 0x61, 0x68, 0x3b, 0x41, 0x6c, 0x61, 0x74, 0x73, 0x3b, 0x54,
+0x61, 0x6c, 0x3b, 0x41, 0x6c, 0x61, 0x72, 0x3b, 0x41, 0x6c, 0x61, 0x6b,
+0x3b, 0x5a, 0x6f, 0x6d, 0x3b, 0x41, 0x73, 0x61, 0x62, 0x41, 0x3b, 0x41,
+0x3b, 0x54, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x5a, 0x3b, 0x41, 0xd1e, 0xd3e,
+0xd2f, 0xd31, 0xd3e, 0xd34, 0xd4d, 0x200c, 0xd1a, 0x3b, 0xd24, 0xd3f, 0xd19, 0xd4d,
+0xd15, 0xd33, 0xd3e, 0xd34, 0xd4d, 0x200c, 0xd1a, 0x3b, 0xd1a, 0xd4a, 0xd35, 0xd4d,
+0xd35, 0xd3e, 0xd34, 0xd4d, 0x200c, 0xd1a, 0x3b, 0xd2c, 0xd41, 0xd27, 0xd28, 0xd3e,
+0xd34, 0xd4d, 0x200c, 0xd1a, 0x3b, 0xd35, 0xd4d, 0xd2f, 0xd3e, 0xd34, 0xd3e, 0xd34,
+0xd4d, 0x200c, 0xd1a, 0x3b, 0xd35, 0xd46, 0xd33, 0xd4d, 0xd33, 0xd3f, 0xd2f, 0xd3e,
+0xd34, 0xd4d, 0x200c, 0xd1a, 0x3b, 0xd36, 0xd28, 0xd3f, 0xd2f, 0xd3e, 0xd34, 0xd4d,
+0x200c, 0xd1a, 0xd1e, 0xd3e, 0xd2f, 0xd31, 0xd3e, 0xd34, 0xd4d, 0x200c, 0xd1a, 0x3b,
+0xd24, 0xd3f, 0xd19, 0xd4d, 0xd15, 0xd33, 0xd3e, 0xd34, 0xd4d, 0x200c, 0xd1a, 0x3b,
+0xd1a, 0xd4a, 0xd35, 0xd4d, 0xd35, 0xd3e, 0xd34, 0xd4d, 0xd1a, 0x3b, 0xd2c, 0xd41,
+0xd27, 0xd28, 0xd3e, 0xd34, 0xd4d, 0x200c, 0xd1a, 0x3b, 0xd35, 0xd4d, 0xd2f, 0xd3e,
+0xd34, 0xd3e, 0xd34, 0xd4d, 0x200c, 0xd1a, 0x3b, 0xd35, 0xd46, 0xd33, 0xd4d, 0xd33,
+0xd3f, 0xd2f, 0xd3e, 0xd34, 0xd4d, 0x200c, 0xd1a, 0x3b, 0xd36, 0xd28, 0xd3f, 0xd2f,
+0xd3e, 0xd34, 0xd4d, 0x200c, 0xd1a, 0xd1e, 0xd3e, 0xd2f, 0xd7c, 0x3b, 0xd24, 0xd3f,
+0xd19, 0xd4d, 0xd15, 0xd7e, 0x3b, 0xd1a, 0xd4a, 0xd35, 0xd4d, 0xd35, 0x3b, 0xd2c,
+0xd41, 0xd27, 0xd7b, 0x3b, 0xd35, 0xd4d, 0xd2f, 0xd3e, 0xd34, 0xd02, 0x3b, 0xd35,
+0xd46, 0xd33, 0xd4d, 0xd33, 0xd3f, 0x3b, 0xd36, 0xd28, 0xd3f, 0xd1e, 0xd3e, 0x3b,
+0xd24, 0xd3f, 0x3b, 0xd1a, 0xd4a, 0x3b, 0xd2c, 0xd41, 0x3b, 0xd35, 0xd4d, 0xd2f,
+0xd3e, 0x3b, 0xd35, 0xd46, 0x3b, 0xd36, 0xd1e, 0x3b, 0xd24, 0xd3f, 0x3b, 0xd1a,
+0xd4a, 0x3b, 0xd2c, 0xd41, 0x3b, 0xd35, 0xd4d, 0xd2f, 0xd3e, 0x3b, 0xd35, 0xd46,
+0x3b, 0xd36, 0x41, 0x68, 0x61, 0x64, 0x3b, 0x49, 0x73, 0x6e, 0x69, 0x6e,
+0x3b, 0x53, 0x65, 0x6c, 0x61, 0x73, 0x61, 0x3b, 0x52, 0x61, 0x62, 0x75,
+0x3b, 0x4b, 0x68, 0x61, 0x6d, 0x69, 0x73, 0x3b, 0x4a, 0x75, 0x6d, 0x61,
+0x61, 0x74, 0x3b, 0x53, 0x61, 0x62, 0x74, 0x75, 0x41, 0x68, 0x64, 0x3b,
+0x49, 0x73, 0x6e, 0x3b, 0x53, 0x65, 0x6c, 0x3b, 0x52, 0x61, 0x62, 0x3b,
+0x4b, 0x68, 0x61, 0x3b, 0x4a, 0x75, 0x6d, 0x3b, 0x53, 0x61, 0x62, 0x41,
+0x3b, 0x49, 0x3b, 0x53, 0x3b, 0x52, 0x3b, 0x4b, 0x3b, 0x4a, 0x3b, 0x53,
+0x627, 0x62d, 0x62f, 0x3b, 0x627, 0x62b, 0x646, 0x64a, 0x646, 0x3b, 0x62b, 0x644,
+0x627, 0x62b, 0x3b, 0x631, 0x627, 0x628, 0x648, 0x3b, 0x62e, 0x645, 0x64a, 0x633,
+0x3b, 0x62c, 0x645, 0x639, 0x629, 0x3b, 0x633, 0x628, 0x62a, 0x648, 0x49, 0x6c,
+0x2d, 0x126, 0x61, 0x64, 0x64, 0x3b, 0x49, 0x74, 0x2d, 0x54, 0x6e, 0x65,
+0x6a, 0x6e, 0x3b, 0x49, 0x74, 0x2d, 0x54, 0x6c, 0x69, 0x65, 0x74, 0x61,
+0x3b, 0x4c, 0x2d, 0x45, 0x72, 0x62, 0x67, 0x127, 0x61, 0x3b, 0x49, 0x6c,
+0x2d, 0x126, 0x61, 0x6d, 0x69, 0x73, 0x3b, 0x49, 0x6c, 0x2d, 0x120, 0x69,
+0x6d, 0x67, 0x127, 0x61, 0x3b, 0x49, 0x73, 0x2d, 0x53, 0x69, 0x62, 0x74,
+0x126, 0x61, 0x64, 0x3b, 0x54, 0x6e, 0x65, 0x3b, 0x54, 0x6c, 0x69, 0x3b,
+0x45, 0x72, 0x62, 0x3b, 0x126, 0x61, 0x6d, 0x3b, 0x120, 0x69, 0x6d, 0x3b,
+0x53, 0x69, 0x62, 0x126, 0x64, 0x3b, 0x54, 0x6e, 0x3b, 0x54, 0x6c, 0x3b,
+0x45, 0x72, 0x3b, 0x126, 0x6d, 0x3b, 0x120, 0x6d, 0x3b, 0x53, 0x62, 0x126,
+0x64, 0x3b, 0x54, 0x3b, 0x54, 0x6c, 0x3b, 0x45, 0x72, 0x3b, 0x126, 0x6d,
+0x3b, 0x120, 0x6d, 0x3b, 0x53, 0x62, 0x9a8, 0x9cb, 0x982, 0x9ae, 0x9be, 0x987,
+0x99c, 0x9bf, 0x982, 0x3b, 0x9a8, 0x9bf, 0x982, 0x9a5, 0x9cc, 0x995, 0x9be, 0x9ac,
+0x9be, 0x3b, 0x9b2, 0x9c8, 0x9ac, 0x9be, 0x995, 0x9aa, 0x9cb, 0x995, 0x9aa, 0x9be,
+0x3b, 0x9af, 0x9bc, 0x9c1, 0x9ae, 0x9b6, 0x995, 0x9c8, 0x9b6, 0x9be, 0x3b, 0x9b6,
+0x997, 0x9cb, 0x9b2, 0x9b6, 0x9c7, 0x9a8, 0x3b, 0x987, 0x9b0, 0x9be, 0x987, 0x3b,
+0x9a5, 0x9be, 0x982, 0x99c, 0x9a8, 0x9cb, 0x3b, 0x9a8, 0x9bf, 0x982, 0x3b, 0x9b2,
+0x9c8, 0x3b, 0x9af, 0x9bc, 0x9c1, 0x9ae, 0x3b, 0x9b6, 0x997, 0x3b, 0x987, 0x9b0,
+0x9be, 0x3b, 0x9a5, 0x9be, 0x982, 0x9a8, 0x9cb, 0x982, 0x3b, 0x9a8, 0x9bf, 0x982,
+0x3b, 0x9b2, 0x9c8, 0x9ac, 0x9be, 0x3b, 0x9af, 0x9bc, 0x9c1, 0x9ae, 0x3b, 0x9b6,
+0x997, 0x9cb, 0x3b, 0x987, 0x9b0, 0x9be, 0x3b, 0x9a5, 0x9be, 0x982, 0x4a, 0x65,
+0x64, 0x6f, 0x6f, 0x6e, 0x65, 0x65, 0x3b, 0x4a, 0x65, 0x6c, 0x68, 0x65,
+0x69, 0x6e, 0x3b, 0x4a, 0x65, 0x6d, 0x61, 0x79, 0x72, 0x74, 0x3b, 0x4a,
+0x65, 0x72, 0x63, 0x65, 0x61, 0x6e, 0x3b, 0x4a, 0x65, 0x72, 0x64, 0x65,
+0x69, 0x6e, 0x3b, 0x4a, 0x65, 0x68, 0x65, 0x69, 0x6e, 0x65, 0x79, 0x3b,
+0x4a, 0x65, 0x73, 0x61, 0x72, 0x6e, 0x4a, 0x65, 0x64, 0x3b, 0x4a, 0x65,
+0x6c, 0x3b, 0x4a, 0x65, 0x6d, 0x3b, 0x4a, 0x65, 0x72, 0x63, 0x3b, 0x4a,
+0x65, 0x72, 0x64, 0x3b, 0x4a, 0x65, 0x68, 0x3b, 0x4a, 0x65, 0x73, 0x52,
+0x101, 0x74, 0x61, 0x70, 0x75, 0x3b, 0x4d, 0x61, 0x6e, 0x65, 0x3b, 0x54,
+0x16b, 0x72, 0x65, 0x69, 0x3b, 0x57, 0x65, 0x6e, 0x65, 0x72, 0x65, 0x69,
+0x3b, 0x54, 0x101, 0x69, 0x74, 0x65, 0x3b, 0x50, 0x61, 0x72, 0x61, 0x69,
+0x72, 0x65, 0x3b, 0x52, 0x101, 0x68, 0x6f, 0x72, 0x6f, 0x69, 0x52, 0x101,
+0x74, 0x3b, 0x4d, 0x61, 0x6e, 0x3b, 0x54, 0x16b, 0x72, 0x3b, 0x57, 0x65,
+0x6e, 0x3b, 0x54, 0x101, 0x69, 0x3b, 0x50, 0x61, 0x72, 0x3b, 0x52, 0x101,
+0x68, 0x52, 0x74, 0x3b, 0x4d, 0x3b, 0x54, 0x3b, 0x57, 0x3b, 0x54, 0x3b,
+0x50, 0x3b, 0x52, 0x68, 0x930, 0x935, 0x93f, 0x935, 0x93e, 0x930, 0x3b, 0x938,
+0x94b, 0x92e, 0x935, 0x93e, 0x930, 0x3b, 0x92e, 0x902, 0x917, 0x933, 0x935, 0x93e,
+0x930, 0x3b, 0x92c, 0x941, 0x927, 0x935, 0x93e, 0x930, 0x3b, 0x917, 0x941, 0x930,
+0x941, 0x935, 0x93e, 0x930, 0x3b, 0x936, 0x941, 0x915, 0x94d, 0x930, 0x935, 0x93e,
+0x930, 0x3b, 0x936, 0x928, 0x93f, 0x935, 0x93e, 0x930, 0x930, 0x935, 0x93f, 0x3b,
+0x938, 0x94b, 0x92e, 0x3b, 0x92e, 0x902, 0x917, 0x933, 0x3b, 0x92c, 0x941, 0x927,
+0x3b, 0x917, 0x941, 0x930, 0x941, 0x3b, 0x936, 0x941, 0x915, 0x94d, 0x930, 0x3b,
+0x936, 0x928, 0x93f, 0x4a, 0x75, 0x6d, 0x61, 0x70, 0xed, 0x6c, 0xed, 0x3b,
+0x4a, 0x75, 0x6d, 0x61, 0x74, 0xe1, 0x74, 0x75, 0x3b, 0x4a, 0x75, 0x6d,
+0x61, 0x6e, 0x65, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74, 0xe1, 0x6e, 0x254,
+0x3b, 0x41, 0x6c, 0x61, 0xe1, 0x6d, 0x69, 0x73, 0x69, 0x3b, 0x4a, 0x75,
+0x6d, 0xe1, 0x61, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x6d, 0xf3, 0x73, 0x69,
+0x4b, 0x69, 0x75, 0x6d, 0x69, 0x61, 0x3b, 0x4d, 0x75, 0x72, 0x61, 0x6d,
+0x75, 0x6b, 0x6f, 0x3b, 0x57, 0x61, 0x69, 0x72, 0x69, 0x3b, 0x57, 0x65,
+0x74, 0x68, 0x61, 0x74, 0x75, 0x3b, 0x57, 0x65, 0x6e, 0x61, 0x3b, 0x57,
+0x65, 0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x6d, 0x6f,
+0x73, 0x69, 0x4b, 0x49, 0x55, 0x3b, 0x4d, 0x52, 0x41, 0x3b, 0x57, 0x41,
+0x49, 0x3b, 0x57, 0x45, 0x54, 0x3b, 0x57, 0x45, 0x4e, 0x3b, 0x57, 0x54,
+0x4e, 0x3b, 0x4a, 0x55, 0x4d, 0x4b, 0x3b, 0x4d, 0x3b, 0x57, 0x3b, 0x57,
+0x3b, 0x57, 0x3b, 0x57, 0x3b, 0x4a, 0x41, 0x6e, 0x65, 0x67, 0x20, 0x31,
+0x3b, 0x41, 0x6e, 0x65, 0x67, 0x20, 0x32, 0x3b, 0x41, 0x6e, 0x65, 0x67,
+0x20, 0x33, 0x3b, 0x41, 0x6e, 0x65, 0x67, 0x20, 0x34, 0x3b, 0x41, 0x6e,
+0x65, 0x67, 0x20, 0x35, 0x3b, 0x41, 0x6e, 0x65, 0x67, 0x20, 0x36, 0x3b,
+0x41, 0x6e, 0x65, 0x67, 0x20, 0x37, 0x41, 0x31, 0x3b, 0x41, 0x32, 0x3b,
+0x41, 0x33, 0x3b, 0x41, 0x34, 0x3b, 0x41, 0x35, 0x3b, 0x41, 0x36, 0x3b,
+0x41, 0x37, 0x41d, 0x44f, 0x43c, 0x3b, 0x414, 0x430, 0x432, 0x430, 0x430, 0x3b,
+0x41c, 0x44f, 0x433, 0x43c, 0x430, 0x440, 0x3b, 0x41b, 0x445, 0x430, 0x433, 0x432,
+0x430, 0x3b, 0x41f, 0x4af, 0x440, 0x44d, 0x432, 0x3b, 0x411, 0x430, 0x430, 0x441,
+0x430, 0x43d, 0x3b, 0x411, 0x44f, 0x43c, 0x431, 0x430, 0x43d, 0x44f, 0x43c, 0x3b,
+0x434, 0x430, 0x432, 0x430, 0x430, 0x3b, 0x43c, 0x44f, 0x433, 0x43c, 0x430, 0x440,
+0x3b, 0x43b, 0x445, 0x430, 0x433, 0x432, 0x430, 0x3b, 0x43f, 0x4af, 0x440, 0x44d,
+0x432, 0x3b, 0x431, 0x430, 0x430, 0x441, 0x430, 0x43d, 0x3b, 0x431, 0x44f, 0x43c,
+0x431, 0x430, 0x41d, 0x44f, 0x3b, 0x414, 0x430, 0x3b, 0x41c, 0x44f, 0x3b, 0x41b,
+0x445, 0x3b, 0x41f, 0x4af, 0x3b, 0x411, 0x430, 0x3b, 0x411, 0x44f, 0x1828, 0x1822,
+0x182e, 0x180e, 0x1820, 0x3b, 0x1833, 0x1820, 0x1838, 0x1820, 0x3b, 0x182e, 0x1822, 0x1820,
+0x1820, 0x182e, 0x1820, 0x1837, 0x3b, 0x1840, 0x1820, 0x182d, 0x182a, 0x1820, 0x3b, 0x182b,
+0x1826, 0x1837, 0x182a, 0x1826, 0x3b, 0x182a, 0x1820, 0x1830, 0x1820, 0x1829, 0x3b, 0x182a,
+0x1822, 0x182e, 0x182a, 0x1820, 0x1828, 0x1822, 0x3b, 0x1833, 0x1820, 0x3b, 0x182e, 0x1822,
+0x182d, 0x3b, 0x1840, 0x1820, 0x3b, 0x182b, 0x1826, 0x1837, 0x3b, 0x182a, 0x1820, 0x3b,
+0x182a, 0x1822, 0x182e, 0x1828, 0x1822, 0x3b, 0x1832, 0x1820, 0x3b, 0x182e, 0x1822, 0x182d,
+0x3b, 0x1840, 0x1820, 0x3b, 0x182b, 0x1825, 0x1837, 0x3b, 0x182a, 0x1820, 0x3b, 0x182a,
+0x1822, 0x182e, 0x1828, 0x1822, 0x3b, 0x1833, 0x1820, 0x3b, 0x182e, 0x1822, 0x182d, 0x3b,
+0x1840, 0x1820, 0x3b, 0x182b, 0x1825, 0x1837, 0x3b, 0x182a, 0x1820, 0x3b, 0x182a, 0x1822,
+0x182e, 0x64, 0x69, 0x6d, 0x61, 0x6e, 0x73, 0x3b, 0x6c, 0x69, 0x6e, 0x64,
+0x69, 0x3b, 0x6d, 0x61, 0x72, 0x64, 0x69, 0x3b, 0x6d, 0x65, 0x72, 0x6b,
+0x72, 0x65, 0x64, 0x69, 0x3b, 0x7a, 0x65, 0x64, 0x69, 0x3b, 0x76, 0x61,
+0x6e, 0x64, 0x72, 0x65, 0x64, 0x69, 0x3b, 0x73, 0x61, 0x6d, 0x64, 0x69,
+0x64, 0x69, 0x6d, 0x3b, 0x6c, 0x69, 0x6e, 0x3b, 0x6d, 0x61, 0x72, 0x3b,
+0x6d, 0x65, 0x72, 0x3b, 0x7a, 0x65, 0x3b, 0x76, 0x61, 0x6e, 0x3b, 0x73,
+0x61, 0x6d, 0x64, 0x3b, 0x6c, 0x3b, 0x6d, 0x3b, 0x6d, 0x3b, 0x7a, 0x3b,
+0x76, 0x3b, 0x73, 0x43, 0x6f, 0x6d, 0x2019, 0x79, 0x61, 0x6b, 0x6b, 0x65,
+0x3b, 0x43, 0x6f, 0x6d, 0x6c, 0x61, 0x61, 0x257, 0x69, 0x69, 0x3b, 0x43,
+0x6f, 0x6d, 0x7a, 0x79, 0x69, 0x69, 0x257, 0x69, 0x69, 0x3b, 0x43, 0x6f,
+0x6d, 0x6b, 0x6f, 0x6c, 0x6c, 0x65, 0x3b, 0x43, 0x6f, 0x6d, 0x6b, 0x61,
+0x6c, 0x64, 0x1dd, 0x253, 0x6c, 0x69, 0x69, 0x3b, 0x43, 0x6f, 0x6d, 0x67,
+0x61, 0x69, 0x73, 0x75, 0x75, 0x3b, 0x43, 0x6f, 0x6d, 0x7a, 0x79, 0x65,
+0x253, 0x73, 0x75, 0x75, 0x43, 0x79, 0x61, 0x3b, 0x43, 0x6c, 0x61, 0x3b,
+0x43, 0x7a, 0x69, 0x3b, 0x43, 0x6b, 0x6f, 0x3b, 0x43, 0x6b, 0x61, 0x3b,
+0x43, 0x67, 0x61, 0x3b, 0x43, 0x7a, 0x65, 0x59, 0x3b, 0x4c, 0x3b, 0x5a,
+0x3b, 0x4f, 0x3b, 0x41, 0x3b, 0x47, 0x3b, 0x45, 0x4e, 0x65, 0x74, 0x74,
+0x76, 0x20, 0x43, 0x61, 0x6b, 0x6f, 0x3b, 0x45, 0x6e, 0x68, 0x76, 0x74,
+0x65, 0x63, 0x65, 0x73, 0x6b, 0x76, 0x3b, 0x45, 0x6e, 0x68, 0x76, 0x74,
+0x65, 0x63, 0x65, 0x73, 0x6b, 0x76, 0x20, 0x45, 0x6e, 0x68, 0x76, 0x79,
+0x76, 0x74, 0x6b, 0x65, 0x3b, 0x45, 0x6e, 0x6e, 0x76, 0x72, 0x6b, 0x76,
+0x70, 0x76, 0x3b, 0x45, 0x6e, 0x6e, 0x76, 0x72, 0x6b, 0x76, 0x70, 0x76,
+0x20, 0x45, 0x6e, 0x68, 0x76, 0x79, 0x76, 0x74, 0x6b, 0x65, 0x3b, 0x4e,
+0x61, 0x6b, 0x20, 0x4f, 0x6b, 0x6b, 0x6f, 0x73, 0x6b, 0x76, 0x20, 0x4e,
+0x65, 0x74, 0x74, 0x76, 0x3b, 0x4e, 0x65, 0x74, 0x74, 0x76, 0x20, 0x43,
+0x61, 0x6b, 0x63, 0x75, 0x73, 0x65, 0x53, 0x6f, 0x6e, 0x74, 0x61, 0x78,
+0x74, 0x73, 0x65, 0x65, 0x73, 0x3b, 0x4d, 0x61, 0x6e, 0x74, 0x61, 0x78,
+0x74, 0x73, 0x65, 0x65, 0x73, 0x3b, 0x44, 0x65, 0x6e, 0x73, 0x74, 0x61,
+0x78, 0x74, 0x73, 0x65, 0x65, 0x73, 0x3b, 0x57, 0x75, 0x6e, 0x73, 0x74,
+0x61, 0x78, 0x74, 0x73, 0x65, 0x65, 0x73, 0x3b, 0x44, 0x6f, 0x6e, 0x64,
+0x65, 0x72, 0x74, 0x61, 0x78, 0x74, 0x73, 0x65, 0x65, 0x73, 0x3b, 0x46,
+0x72, 0x61, 0x69, 0x74, 0x61, 0x78, 0x74, 0x73, 0x65, 0x65, 0x73, 0x3b,
+0x53, 0x61, 0x74, 0x65, 0x72, 0x74, 0x61, 0x78, 0x74, 0x73, 0x65, 0x65,
+0x73, 0x53, 0x6f, 0x6e, 0x3b, 0x4d, 0x61, 0x3b, 0x44, 0x65, 0x3b, 0x57,
+0x75, 0x3b, 0x44, 0x6f, 0x3b, 0x46, 0x72, 0x3b, 0x53, 0x61, 0x74, 0x53,
+0x3b, 0x4d, 0x3b, 0x45, 0x3b, 0x57, 0x3b, 0x44, 0x3b, 0x46, 0x3b, 0x41,
+0x906, 0x907, 0x924, 0x92c, 0x93e, 0x930, 0x3b, 0x938, 0x94b, 0x92e, 0x92c, 0x93e,
+0x930, 0x3b, 0x92e, 0x919, 0x94d, 0x917, 0x932, 0x92c, 0x93e, 0x930, 0x3b, 0x92c,
+0x941, 0x927, 0x92c, 0x93e, 0x930, 0x3b, 0x92c, 0x93f, 0x939, 0x93f, 0x92c, 0x93e,
+0x930, 0x3b, 0x936, 0x941, 0x915, 0x94d, 0x930, 0x92c, 0x93e, 0x930, 0x3b, 0x936,
+0x928, 0x93f, 0x92c, 0x93e, 0x930, 0x906, 0x907, 0x924, 0x3b, 0x938, 0x94b, 0x92e,
+0x3b, 0x92e, 0x919, 0x94d, 0x917, 0x932, 0x3b, 0x92c, 0x941, 0x927, 0x3b, 0x92c,
+0x93f, 0x939, 0x93f, 0x3b, 0x936, 0x941, 0x915, 0x94d, 0x930, 0x3b, 0x936, 0x928,
+0x93f, 0x906, 0x3b, 0x938, 0x94b, 0x3b, 0x92e, 0x3b, 0x92c, 0x941, 0x3b, 0x92c,
+0x93f, 0x3b, 0x936, 0x941, 0x3b, 0x936, 0x6c, 0x79, 0x25b, 0x2bc, 0x25b, 0x301,
+0x20, 0x73, 0x1e85, 0xed, 0x14b, 0x74, 0xe8, 0x3b, 0x6d, 0x76, 0x66, 0xf2,
+0x20, 0x6c, 0x79, 0x25b, 0x30c, 0x2bc, 0x3b, 0x6d, 0x62, 0x254, 0x301, 0x254,
+0x6e, 0x74, 0xe8, 0x20, 0x6d, 0x76, 0x66, 0xf2, 0x20, 0x6c, 0x79, 0x25b,
+0x30c, 0x2bc, 0x3b, 0x74, 0x73, 0xe8, 0x74, 0x73, 0x25b, 0x300, 0x25b, 0x20,
+0x6c, 0x79, 0x25b, 0x30c, 0x2bc, 0x3b, 0x6d, 0x62, 0x254, 0x301, 0x254, 0x6e,
+0x74, 0xe8, 0x20, 0x74, 0x73, 0x65, 0x74, 0x73, 0x25b, 0x300, 0x25b, 0x20,
+0x6c, 0x79, 0x25b, 0x30c, 0x2bc, 0x3b, 0x6d, 0x76, 0x66, 0xf2, 0x20, 0x6d,
+0xe0, 0x67, 0x61, 0x20, 0x6c, 0x79, 0x25b, 0x30c, 0x2bc, 0x3b, 0x6d, 0xe0,
+0x67, 0x61, 0x20, 0x6c, 0x79, 0x25b, 0x30c, 0x2bc, 0x53, 0x254, 0x301, 0x6e,
+0x64, 0x69, 0x3b, 0x4d, 0x254, 0x301, 0x6e, 0x64, 0x69, 0x3b, 0xc1, 0x70,
+0x74, 0x61, 0x20, 0x4d, 0x254, 0x301, 0x6e, 0x64, 0x69, 0x3b, 0x57, 0x25b,
+0x301, 0x6e, 0x25b, 0x73, 0x25b, 0x64, 0x25b, 0x3b, 0x54, 0x254, 0x301, 0x73,
+0x25b, 0x64, 0x25b, 0x3b, 0x46, 0x25b, 0x6c, 0xe2, 0x79, 0x25b, 0x64, 0x25b,
+0x3b, 0x53, 0xe1, 0x73, 0x69, 0x64, 0x25b, 0x53, 0x254, 0x301, 0x3b, 0x4d,
+0x254, 0x301, 0x3b, 0xc1, 0x4d, 0x3b, 0x57, 0x25b, 0x301, 0x3b, 0x54, 0x254,
+0x301, 0x3b, 0x46, 0x25b, 0x3b, 0x53, 0xe1, 0x53, 0x1ecd, 0x301, 0x6e, 0x64,
+0xe8, 0x3b, 0x4d, 0x1ecd, 0x301, 0x6e, 0x64, 0xe8, 0x3b, 0x54, 0x69, 0xfa,
+0x7a, 0x64, 0xe8, 0x3b, 0x57, 0x1eb9, 0x301, 0x6e, 0x1eb9, 0x301, 0x7a, 0x64,
+0xe8, 0x3b, 0x54, 0x1ecd, 0x301, 0x7a, 0x64, 0xe8, 0x3b, 0x46, 0x72, 0x61,
+0xed, 0x64, 0xe8, 0x3b, 0x53, 0xe1, 0x74, 0x1ecd, 0x64, 0xe8, 0x53, 0x1ecd,
+0x301, 0x6e, 0x3b, 0x4d, 0x1ecd, 0x301, 0x6e, 0x3b, 0x54, 0x69, 0xfa, 0x3b,
+0x57, 0x1eb9, 0x301, 0x6e, 0x3b, 0x54, 0x1ecd, 0x301, 0x7a, 0x3b, 0x46, 0x72,
+0x61, 0xed, 0x3b, 0x53, 0xe1, 0x74, 0x7de, 0x7ca, 0x7ef, 0x7d9, 0x7cc, 0x7df,
+0x7cf, 0x7f2, 0x3b, 0x7de, 0x7d0, 0x7ec, 0x7d3, 0x7ca, 0x7ec, 0x7df, 0x7cf, 0x7f2,
+0x3b, 0x7de, 0x7d0, 0x7ec, 0x7df, 0x7cf, 0x7f2, 0x3b, 0x7de, 0x7ce, 0x7e3, 0x7ce,
+0x7f2, 0x7df, 0x7cf, 0x7f2, 0x3b, 0x7d3, 0x7cc, 0x7df, 0x7cf, 0x7f2, 0x3b, 0x7db,
+0x7cc, 0x7ec, 0x7e3, 0x7cc, 0x7f2, 0x7ec, 0x7df, 0x7cf, 0x7f2, 0x3b, 0x7de, 0x7cd,
+0x7f2, 0x7d8, 0x7cd, 0x7df, 0x7cf, 0x7f2, 0x7de, 0x7ca, 0x7ef, 0x7d9, 0x3b, 0x7de,
+0x7d0, 0x7ec, 0x7d3, 0x3b, 0x7de, 0x7d0, 0x7ec, 0x7df, 0x3b, 0x7de, 0x7ce, 0x7e3,
+0x3b, 0x7d3, 0x7cc, 0x7df, 0x3b, 0x7db, 0x7cc, 0x7ec, 0x7e3, 0x3b, 0x7de, 0x7cd,
+0x7f2, 0x7d8, 0x7de, 0x7ca, 0x7ef, 0x7d9, 0x3b, 0x7de, 0x7d0, 0x7ec, 0x7d3, 0x3b,
+0x7de, 0x7d0, 0x7ec, 0x7df, 0x7cf, 0x7f2, 0x3b, 0x7de, 0x7ce, 0x7e3, 0x3b, 0x7d3,
+0x7cc, 0x7df, 0x3b, 0x7db, 0x7cc, 0x7ec, 0x7e3, 0x3b, 0x7de, 0x7cd, 0x7f2, 0x7d8,
+0x7de, 0x3b, 0x7de, 0x3b, 0x7de, 0x3b, 0x7de, 0x3b, 0x7d3, 0x3b, 0x7db, 0x3b,
+0x7de, 0x73, 0x6f, 0x74, 0x6e, 0x61, 0x62, 0x65, 0x61, 0x69, 0x76, 0x69,
+0x3b, 0x76, 0x75, 0x6f, 0x73, 0x73, 0xe1, 0x72, 0x67, 0x61, 0x3b, 0x6d,
+0x61, 0x14b, 0x14b, 0x65, 0x62, 0xe1, 0x72, 0x67, 0x61, 0x3b, 0x67, 0x61,
+0x73, 0x6b, 0x61, 0x76, 0x61, 0x68, 0x6b, 0x6b, 0x75, 0x3b, 0x64, 0x75,
+0x6f, 0x72, 0x61, 0x73, 0x64, 0x61, 0x74, 0x3b, 0x62, 0x65, 0x61, 0x72,
+0x6a, 0x61, 0x64, 0x61, 0x74, 0x3b, 0x6c, 0xe1, 0x76, 0x76, 0x61, 0x72,
+0x64, 0x61, 0x74, 0x73, 0x6f, 0x74, 0x6e, 0x3b, 0x76, 0x75, 0x6f, 0x73,
+0x3b, 0x6d, 0x61, 0x14b, 0x3b, 0x67, 0x61, 0x73, 0x6b, 0x3b, 0x64, 0x75,
+0x6f, 0x72, 0x3b, 0x62, 0x65, 0x61, 0x72, 0x3b, 0x6c, 0xe1, 0x76, 0x53,
+0x3b, 0x56, 0x3b, 0x4d, 0x3b, 0x47, 0x3b, 0x44, 0x3b, 0x42, 0x3b, 0x4c,
+0x73, 0x6f, 0x74, 0x6e, 0x61, 0x62, 0x65, 0x61, 0x69, 0x76, 0x69, 0x3b,
+0x6d, 0xe1, 0x6e, 0x6e, 0x6f, 0x64, 0x61, 0x74, 0x3b, 0x64, 0x69, 0x73,
+0x64, 0x61, 0x74, 0x3b, 0x67, 0x61, 0x73, 0x6b, 0x61, 0x76, 0x61, 0x68,
+0x6b, 0x6b, 0x75, 0x3b, 0x64, 0x75, 0x6f, 0x72, 0x61, 0x73, 0x74, 0x61,
+0x74, 0x3b, 0x62, 0x65, 0x61, 0x72, 0x6a, 0x61, 0x64, 0x61, 0x74, 0x3b,
+0x6c, 0xe1, 0x76, 0x76, 0x6f, 0x72, 0x64, 0x61, 0x74, 0x73, 0x6f, 0x3b,
+0x6d, 0xe1, 0x3b, 0x64, 0x69, 0x3b, 0x67, 0x61, 0x3b, 0x64, 0x75, 0x3b,
+0x62, 0x65, 0x3b, 0x6c, 0xe1, 0x53, 0x3b, 0x4d, 0x3b, 0x44, 0x3b, 0x47,
+0x3b, 0x44, 0x3b, 0x42, 0x3b, 0x4c, 0x4c, 0x61, 0x6d, 0x6f, 0x72, 0x65,
+0x6e, 0x61, 0x3b, 0x4d, 0x75, 0x73, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67,
+0x6f, 0x3b, 0x4c, 0x61, 0x62, 0x6f, 0x62, 0x65, 0x64, 0x69, 0x3b, 0x4c,
+0x61, 0x62, 0x6f, 0x72, 0x61, 0x72, 0x6f, 0x3b, 0x4c, 0x61, 0x62, 0x6f,
+0x6e, 0x65, 0x3b, 0x4c, 0x61, 0x62, 0x6f, 0x68, 0x6c, 0x61, 0x6e, 0x6f,
+0x3b, 0x4d, 0x6f, 0x6b, 0x69, 0x62, 0x65, 0x6c, 0x6f, 0x4c, 0x61, 0x6d,
+0x3b, 0x4d, 0x6f, 0x73, 0x3b, 0x42, 0x65, 0x64, 0x3b, 0x52, 0x61, 0x72,
+0x3b, 0x4e, 0x65, 0x3b, 0x48, 0x6c, 0x61, 0x3b, 0x4d, 0x6f, 0x6b, 0x4c,
+0x3b, 0x4d, 0x3b, 0x42, 0x3b, 0x52, 0x3b, 0x4e, 0x3b, 0x48, 0x3b, 0x4d,
+0x53, 0x6f, 0x6e, 0x74, 0x6f, 0x3b, 0x4d, 0x76, 0x75, 0x6c, 0x6f, 0x3b,
+0x53, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x3b, 0x53, 0x69, 0x74, 0x68, 0x61,
+0x74, 0x68, 0x75, 0x3b, 0x53, 0x69, 0x6e, 0x65, 0x3b, 0x53, 0x69, 0x68,
+0x6c, 0x61, 0x6e, 0x75, 0x3b, 0x4d, 0x67, 0x71, 0x69, 0x62, 0x65, 0x6c,
+0x6f, 0x53, 0x6f, 0x6e, 0x3b, 0x4d, 0x76, 0x75, 0x3b, 0x53, 0x69, 0x62,
+0x3b, 0x53, 0x69, 0x74, 0x3b, 0x53, 0x69, 0x6e, 0x3b, 0x53, 0x69, 0x68,
+0x3b, 0x4d, 0x67, 0x71, 0x53, 0x3b, 0x4d, 0x3b, 0x53, 0x3b, 0x53, 0x3b,
+0x53, 0x3b, 0x53, 0x3b, 0x4d, 0x73, 0xf8, 0x6e, 0x2e, 0x3b, 0x6d, 0x61,
+0x6e, 0x2e, 0x3b, 0x74, 0x69, 0x72, 0x2e, 0x3b, 0x6f, 0x6e, 0x73, 0x2e,
+0x3b, 0x74, 0x6f, 0x72, 0x2e, 0x3b, 0x66, 0x72, 0x65, 0x2e, 0x3b, 0x6c,
+0xf8, 0x72, 0x2e, 0x73, 0xf8, 0x6e, 0x64, 0x61, 0x67, 0x3b, 0x6d, 0xe5,
+0x6e, 0x64, 0x61, 0x67, 0x3b, 0x74, 0x79, 0x73, 0x64, 0x61, 0x67, 0x3b,
+0x6f, 0x6e, 0x73, 0x64, 0x61, 0x67, 0x3b, 0x74, 0x6f, 0x72, 0x73, 0x64,
+0x61, 0x67, 0x3b, 0x66, 0x72, 0x65, 0x64, 0x61, 0x67, 0x3b, 0x6c, 0x61,
+0x75, 0x72, 0x64, 0x61, 0x67, 0x73, 0xf8, 0x6e, 0x3b, 0x6d, 0xe5, 0x6e,
+0x3b, 0x74, 0x79, 0x73, 0x3b, 0x6f, 0x6e, 0x73, 0x3b, 0x74, 0x6f, 0x72,
+0x3b, 0x66, 0x72, 0x65, 0x3b, 0x6c, 0x61, 0x75, 0x73, 0xf8, 0x2e, 0x3b,
+0x6d, 0xe5, 0x2e, 0x3b, 0x74, 0x79, 0x2e, 0x3b, 0x6f, 0x6e, 0x2e, 0x3b,
+0x74, 0x6f, 0x2e, 0x3b, 0x66, 0x72, 0x2e, 0x3b, 0x6c, 0x61, 0x2e, 0x43,
+0xe4, 0x14b, 0x20, 0x6b, 0x75, 0x254, 0x74, 0x68, 0x3b, 0x4a, 0x69, 0x65,
+0x63, 0x20, 0x6c, 0x61, 0x331, 0x74, 0x3b, 0x52, 0x25b, 0x77, 0x20, 0x6c,
+0xe4, 0x74, 0x6e, 0x69, 0x3b, 0x44, 0x69, 0x254, 0x331, 0x6b, 0x20, 0x6c,
+0xe4, 0x74, 0x6e, 0x69, 0x3b, 0x14a, 0x75, 0x61, 0x61, 0x6e, 0x20, 0x6c,
+0xe4, 0x74, 0x6e, 0x69, 0x3b, 0x44, 0x68, 0x69, 0x65, 0x65, 0x63, 0x20,
+0x6c, 0xe4, 0x74, 0x6e, 0x69, 0x3b, 0x42, 0xe4, 0x6b, 0x25b, 0x6c, 0x20,
+0x6c, 0xe4, 0x74, 0x6e, 0x69, 0x43, 0xe4, 0x14b, 0x3b, 0x4a, 0x69, 0x65,
+0x63, 0x3b, 0x52, 0x25b, 0x77, 0x3b, 0x44, 0x69, 0x254, 0x331, 0x6b, 0x3b,
+0x14a, 0x75, 0x61, 0x61, 0x6e, 0x3b, 0x44, 0x68, 0x69, 0x65, 0x65, 0x63,
+0x3b, 0x42, 0xe4, 0x6b, 0x25b, 0x6c, 0x43, 0x3b, 0x4a, 0x3b, 0x52, 0x3b,
+0x44, 0x3b, 0x14a, 0x3b, 0x44, 0x3b, 0x42, 0x4c, 0x61, 0x6d, 0x75, 0x6c,
+0x75, 0x6e, 0x67, 0x75, 0x3b, 0x4c, 0x6f, 0x6c, 0x65, 0x6d, 0x62, 0x61,
+0x3b, 0x4c, 0x61, 0x63, 0x68, 0x69, 0x77, 0x69, 0x72, 0x69, 0x3b, 0x4c,
+0x61, 0x63, 0x68, 0x69, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x4c, 0x61, 0x63,
+0x68, 0x69, 0x6e, 0x61, 0x79, 0x69, 0x3b, 0x4c, 0x61, 0x63, 0x68, 0x69,
+0x73, 0x61, 0x6e, 0x75, 0x3b, 0x4c, 0x6f, 0x77, 0x65, 0x72, 0x75, 0x6b,
+0x61, 0x4d, 0x75, 0x6c, 0x3b, 0x4c, 0x65, 0x6d, 0x3b, 0x57, 0x69, 0x72,
+0x3b, 0x54, 0x61, 0x74, 0x3b, 0x4e, 0x61, 0x69, 0x3b, 0x53, 0x61, 0x6e,
+0x3b, 0x57, 0x65, 0x72, 0x64, 0x69, 0x6d, 0x65, 0x6e, 0x67, 0x65, 0x3b,
+0x64, 0x69, 0x6c, 0x75, 0x6e, 0x73, 0x3b, 0x64, 0x69, 0x6d, 0x61, 0x72,
+0x73, 0x3b, 0x64, 0x69, 0x6d, 0xe8, 0x63, 0x72, 0x65, 0x73, 0x3b, 0x64,
+0x69, 0x6a, 0xf2, 0x75, 0x73, 0x3b, 0x64, 0x69, 0x76, 0x65, 0x6e, 0x64,
+0x72, 0x65, 0x73, 0x3b, 0x64, 0x69, 0x73, 0x73, 0x61, 0x62, 0x74, 0x65,
+0x44, 0x67, 0x3b, 0x44, 0x6c, 0x3b, 0x44, 0x6d, 0x3b, 0x44, 0x63, 0x3b,
+0x44, 0x6a, 0x3b, 0x44, 0x76, 0x3b, 0x44, 0x73, 0x64, 0x69, 0x6d, 0x65,
+0x6e, 0x67, 0x65, 0x3b, 0x64, 0x65, 0x6c, 0x75, 0x6e, 0x73, 0x3b, 0x64,
+0x69, 0x6d, 0x61, 0x72, 0x73, 0x3b, 0x64, 0x69, 0x6d, 0xe8, 0x72, 0x63,
+0x6c, 0x65, 0x73, 0x3b, 0x64, 0x69, 0x6a, 0x61, 0x75, 0x73, 0x3b, 0x64,
+0x69, 0x75, 0x65, 0x6e, 0x64, 0x72, 0x65, 0x73, 0x3b, 0x64, 0x69, 0x73,
+0x73, 0x61, 0x62, 0x74, 0x65, 0x64, 0x69, 0x6d, 0x3b, 0x64, 0x65, 0x6c,
+0x3b, 0x64, 0x6d, 0x61, 0x3b, 0x64, 0x6d, 0xe8, 0x3b, 0x64, 0x69, 0x6a,
+0x3b, 0x64, 0x69, 0x75, 0x3b, 0x64, 0x69, 0x73, 0x44, 0x3b, 0x4c, 0x3b,
+0x4d, 0x3b, 0x58, 0x3b, 0x4a, 0x3b, 0x55, 0x3b, 0x53, 0xb30, 0xb2c, 0xb3f,
+0xb2c, 0xb3e, 0xb30, 0x3b, 0xb38, 0xb4b, 0xb2e, 0xb2c, 0xb3e, 0xb30, 0x3b, 0xb2e,
+0xb19, 0xb4d, 0xb17, 0xb33, 0xb2c, 0xb3e, 0xb30, 0x3b, 0xb2c, 0xb41, 0xb27, 0xb2c,
+0xb3e, 0xb30, 0x3b, 0xb17, 0xb41, 0xb30, 0xb41, 0xb2c, 0xb3e, 0xb30, 0x3b, 0xb36,
+0xb41, 0xb15, 0xb4d, 0xb30, 0xb2c, 0xb3e, 0xb30, 0x3b, 0xb36, 0xb28, 0xb3f, 0xb2c,
+0xb3e, 0xb30, 0xb30, 0xb2c, 0xb3f, 0x3b, 0xb38, 0xb4b, 0xb2e, 0x3b, 0xb2e, 0xb19,
+0xb4d, 0xb17, 0xb33, 0x3b, 0xb2c, 0xb41, 0xb27, 0x3b, 0xb17, 0xb41, 0xb30, 0xb41,
+0x3b, 0xb36, 0xb41, 0xb15, 0xb4d, 0xb30, 0x3b, 0xb36, 0xb28, 0xb3f, 0xb30, 0x3b,
+0xb38, 0xb4b, 0x3b, 0xb2e, 0x3b, 0xb2c, 0xb41, 0x3b, 0xb17, 0xb41, 0x3b, 0xb36,
+0xb41, 0x3b, 0xb36, 0x44, 0x69, 0x6c, 0x62, 0x61, 0x74, 0x61, 0x3b, 0x57,
+0x69, 0x69, 0x78, 0x61, 0x74, 0x61, 0x3b, 0x51, 0x69, 0x62, 0x78, 0x61,
+0x74, 0x61, 0x3b, 0x52, 0x6f, 0x6f, 0x62, 0x69, 0x69, 0x3b, 0x4b, 0x61,
+0x6d, 0x69, 0x69, 0x73, 0x61, 0x3b, 0x4a, 0x69, 0x6d, 0x61, 0x61, 0x74,
+0x61, 0x3b, 0x53, 0x61, 0x6e, 0x62, 0x61, 0x74, 0x61, 0x44, 0x69, 0x6c,
+0x3b, 0x57, 0x69, 0x78, 0x3b, 0x51, 0x69, 0x62, 0x3b, 0x52, 0x6f, 0x62,
+0x3b, 0x4b, 0x61, 0x6d, 0x3b, 0x4a, 0x69, 0x6d, 0x3b, 0x53, 0x61, 0x6e,
+0x44, 0x3b, 0x57, 0x3b, 0x51, 0x3b, 0x52, 0x3b, 0x4b, 0x3b, 0x4a, 0x3b,
+0x53, 0xd801, 0xdcb9, 0xd801, 0xdcd8, 0x358, 0xd801, 0xdcec, 0xd801, 0xdcd8, 0x20, 0xd801,
+0xdccf, 0xd801, 0xdcd8, 0xd801, 0xdce4, 0xd801, 0xdcd8, 0x358, 0xd801, 0xdcf0, 0xd801, 0xdcd8,
+0xd801, 0xdce4, 0xd801, 0xdce3, 0x3b, 0xd801, 0xdcb9, 0xd801, 0xdcd8, 0x358, 0xd801, 0xdcec,
+0xd801, 0xdcd8, 0x20, 0xd801, 0xdcc4, 0xd801, 0xdcd8, 0xd801, 0xdce1, 0xd801, 0xdcdb, 0x358,
+0xd801, 0xdce7, 0xd801, 0xdce3, 0x3b, 0xd801, 0xdcb9, 0xd801, 0xdcd8, 0x358, 0xd801, 0xdcec,
+0xd801, 0xdcd8, 0x20, 0xd801, 0xdccf, 0xd801, 0xdcdf, 0xd801, 0xdcf5, 0xd801, 0xdcea, 0x358,
+0xd801, 0xdcec, 0xd801, 0xdcd8, 0x3b, 0xd801, 0xdcb9, 0xd801, 0xdcd8, 0x358, 0xd801, 0xdcec,
+0xd801, 0xdcd8, 0x20, 0xd801, 0xdccf, 0xd801, 0xdcdf, 0xd801, 0xdcf5, 0xd801, 0xdcd8, 0xd801,
+0xdcdc, 0xd801, 0xdce3, 0x3b, 0xd801, 0xdcb9, 0xd801, 0xdcd8, 0x358, 0xd801, 0xdcec, 0xd801,
+0xdcd8, 0x20, 0xd801, 0xdccf, 0xd801, 0xdcdf, 0xd801, 0xdcf0, 0xd801, 0xdcea, 0xd801, 0xdcec,
+0xd801, 0xdcd8, 0x3b, 0xd801, 0xdcb9, 0xd801, 0xdcd8, 0x358, 0xd801, 0xdcec, 0xd801, 0xdcd8,
+0x20, 0xd801, 0xdcc8, 0xd801, 0xdcd8, 0x20, 0xd801, 0xdcf5, 0xd801, 0xdcd8, 0xd801, 0xdcf2,
+0xd801, 0xdcd8, 0x20, 0xd801, 0xdcfb, 0xd801, 0xdce3, 0x358, 0x3b, 0xd801, 0xdcb9, 0xd801,
+0xdcd8, 0x358, 0xd801, 0xdcec, 0xd801, 0xdcd8, 0x20, 0xd801, 0xdcc2, 0xd801, 0xdce4, 0xd801,
+0xdcd8, 0xd801, 0xdcf8, 0xd801, 0xdcdf, 0x20, 0xd801, 0xdce3, 0x358, 0xd801, 0xdce4, 0xd801,
+0xdcdf, 0xd801, 0xdccf, 0x3b, 0xd801, 0xdcc4, 0x3b, 0xd801, 0xdccd, 0x3b, 0xd801, 0xdcb4,
+0x3b, 0xd801, 0xdcc8, 0x3b, 0xd801, 0xdcca, 0x3b, 0xd801, 0xdcf8, 0x425, 0x443, 0x44b,
+0x446, 0x430, 0x443, 0x431, 0x43e, 0x43d, 0x3b, 0x41a, 0x44a, 0x443, 0x44b, 0x440,
+0x438, 0x441, 0x4d5, 0x440, 0x3b, 0x414, 0x44b, 0x446, 0x446, 0x4d5, 0x433, 0x3b,
+0x4d4, 0x440, 0x442, 0x44b, 0x446, 0x446, 0x4d5, 0x433, 0x3b, 0x426, 0x44b, 0x43f,
+0x43f, 0x4d5, 0x440, 0x4d5, 0x43c, 0x3b, 0x41c, 0x430, 0x439, 0x440, 0x4d5, 0x43c,
+0x431, 0x43e, 0x43d, 0x3b, 0x421, 0x430, 0x431, 0x430, 0x442, 0x445, 0x443, 0x44b,
+0x446, 0x430, 0x443, 0x431, 0x43e, 0x43d, 0x3b, 0x43a, 0x44a, 0x443, 0x44b, 0x440,
+0x438, 0x441, 0x4d5, 0x440, 0x3b, 0x434, 0x44b, 0x446, 0x446, 0x4d5, 0x433, 0x3b,
+0x4d5, 0x440, 0x442, 0x44b, 0x446, 0x446, 0x4d5, 0x433, 0x3b, 0x446, 0x44b, 0x43f,
+0x43f, 0x4d5, 0x440, 0x4d5, 0x43c, 0x3b, 0x43c, 0x430, 0x439, 0x440, 0x4d5, 0x43c,
+0x431, 0x43e, 0x43d, 0x3b, 0x441, 0x430, 0x431, 0x430, 0x442, 0x425, 0x446, 0x431,
+0x3b, 0x41a, 0x440, 0x441, 0x3b, 0x414, 0x446, 0x433, 0x3b, 0x4d4, 0x440, 0x442,
+0x3b, 0x426, 0x43f, 0x440, 0x3b, 0x41c, 0x440, 0x431, 0x3b, 0x421, 0x431, 0x442,
+0x445, 0x446, 0x431, 0x3b, 0x43a, 0x440, 0x441, 0x3b, 0x434, 0x446, 0x433, 0x3b,
+0x4d5, 0x440, 0x442, 0x3b, 0x446, 0x43f, 0x440, 0x3b, 0x43c, 0x440, 0x431, 0x3b,
+0x441, 0x431, 0x442, 0x425, 0x3b, 0x41a, 0x3b, 0x414, 0x3b, 0x4d4, 0x3b, 0x426,
+0x3b, 0x41c, 0x3b, 0x421, 0x64, 0x6a, 0x61, 0x64, 0x75, 0x6d, 0x69, 0x6e,
+0x67, 0x75, 0x3b, 0x64, 0x6a, 0x61, 0x6c, 0x75, 0x6e, 0x61, 0x3b, 0x64,
+0x6a, 0x61, 0x6d, 0x61, 0x72, 0x73, 0x3b, 0x64, 0x6a, 0x61, 0x72, 0x61,
+0x73, 0x6f, 0x6e, 0x3b, 0x64, 0x6a, 0x61, 0x77, 0x65, 0x70, 0x73, 0x3b,
+0x64, 0x6a, 0x61, 0x62, 0x69, 0xe8, 0x72, 0x6e, 0xe8, 0x3b, 0x64, 0x6a,
+0x61, 0x73, 0x61, 0x62, 0x72, 0x61, 0x64, 0x64, 0x3b, 0x64, 0x6c, 0x3b,
+0x64, 0x6d, 0x3b, 0x64, 0x72, 0x3b, 0x64, 0x77, 0x3b, 0x64, 0x62, 0x3b,
+0x64, 0x73, 0x64a, 0x648, 0x646, 0x6cd, 0x3b, 0x62f, 0x648, 0x646, 0x6cd, 0x3b,
+0x62f, 0x631, 0x6d0, 0x646, 0x6cd, 0x3b, 0x685, 0x644, 0x631, 0x646, 0x6cd, 0x3b,
+0x67e, 0x64a, 0x646, 0x681, 0x646, 0x6cd, 0x3b, 0x62c, 0x645, 0x639, 0x647, 0x3b,
+0x627, 0x648, 0x646, 0x6cd, 0x6cc, 0x6a9, 0x634, 0x646, 0x628, 0x647, 0x3b, 0x62f,
+0x648, 0x634, 0x646, 0x628, 0x647, 0x3b, 0x633, 0x647, 0x200c, 0x634, 0x646, 0x628,
+0x647, 0x3b, 0x686, 0x647, 0x627, 0x631, 0x634, 0x646, 0x628, 0x647, 0x3b, 0x67e,
+0x646, 0x62c, 0x634, 0x646, 0x628, 0x647, 0x3b, 0x62c, 0x645, 0x639, 0x647, 0x3b,
+0x634, 0x646, 0x628, 0x647, 0x6cc, 0x3b, 0x62f, 0x3b, 0x633, 0x3b, 0x686, 0x3b,
+0x67e, 0x3b, 0x62c, 0x3b, 0x634, 0x6e, 0x69, 0x65, 0x64, 0x7a, 0x69, 0x65,
+0x6c, 0x61, 0x3b, 0x70, 0x6f, 0x6e, 0x69, 0x65, 0x64, 0x7a, 0x69, 0x61,
+0x142, 0x65, 0x6b, 0x3b, 0x77, 0x74, 0x6f, 0x72, 0x65, 0x6b, 0x3b, 0x15b,
+0x72, 0x6f, 0x64, 0x61, 0x3b, 0x63, 0x7a, 0x77, 0x61, 0x72, 0x74, 0x65,
+0x6b, 0x3b, 0x70, 0x69, 0x105, 0x74, 0x65, 0x6b, 0x3b, 0x73, 0x6f, 0x62,
+0x6f, 0x74, 0x61, 0x6e, 0x69, 0x65, 0x64, 0x7a, 0x2e, 0x3b, 0x70, 0x6f,
+0x6e, 0x2e, 0x3b, 0x77, 0x74, 0x2e, 0x3b, 0x15b, 0x72, 0x2e, 0x3b, 0x63,
+0x7a, 0x77, 0x2e, 0x3b, 0x70, 0x74, 0x2e, 0x3b, 0x73, 0x6f, 0x62, 0x2e,
+0x4e, 0x3b, 0x50, 0x3b, 0x57, 0x3b, 0x15a, 0x3b, 0x43, 0x3b, 0x50, 0x3b,
+0x53, 0x6e, 0x3b, 0x70, 0x3b, 0x77, 0x3b, 0x15b, 0x3b, 0x63, 0x3b, 0x70,
+0x3b, 0x73, 0x64, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x6f, 0x3b, 0x73, 0x65,
+0x67, 0x75, 0x6e, 0x64, 0x61, 0x2d, 0x66, 0x65, 0x69, 0x72, 0x61, 0x3b,
+0x74, 0x65, 0x72, 0xe7, 0x61, 0x2d, 0x66, 0x65, 0x69, 0x72, 0x61, 0x3b,
+0x71, 0x75, 0x61, 0x72, 0x74, 0x61, 0x2d, 0x66, 0x65, 0x69, 0x72, 0x61,
+0x3b, 0x71, 0x75, 0x69, 0x6e, 0x74, 0x61, 0x2d, 0x66, 0x65, 0x69, 0x72,
+0x61, 0x3b, 0x73, 0x65, 0x78, 0x74, 0x61, 0x2d, 0x66, 0x65, 0x69, 0x72,
+0x61, 0x3b, 0x73, 0xe1, 0x62, 0x61, 0x64, 0x6f, 0x64, 0x6f, 0x6d, 0x2e,
+0x3b, 0x73, 0x65, 0x67, 0x2e, 0x3b, 0x74, 0x65, 0x72, 0x2e, 0x3b, 0x71,
+0x75, 0x61, 0x2e, 0x3b, 0x71, 0x75, 0x69, 0x2e, 0x3b, 0x73, 0x65, 0x78,
+0x2e, 0x3b, 0x73, 0xe1, 0x62, 0x2e, 0x44, 0x3b, 0x53, 0x3b, 0x54, 0x3b,
+0x51, 0x3b, 0x51, 0x3b, 0x53, 0x3b, 0x53, 0x64, 0x6f, 0x6d, 0x69, 0x6e,
+0x67, 0x6f, 0x3b, 0x73, 0x65, 0x67, 0x75, 0x6e, 0x64, 0x61, 0x3b, 0x74,
+0x65, 0x72, 0xe7, 0x61, 0x3b, 0x71, 0x75, 0x61, 0x72, 0x74, 0x61, 0x3b,
+0x71, 0x75, 0x69, 0x6e, 0x74, 0x61, 0x3b, 0x73, 0x65, 0x78, 0x74, 0x61,
+0x3b, 0x73, 0xe1, 0x62, 0x61, 0x64, 0x6f, 0x6e, 0x61, 0x64, 0x12b, 0x6c,
+0x69, 0x3b, 0x70, 0x61, 0x6e, 0x61, 0x64, 0x12b, 0x6c, 0x69, 0x3b, 0x77,
+0x69, 0x73, 0x61, 0x73, 0x12b, 0x64, 0x69, 0x73, 0x3b, 0x70, 0x75, 0x73,
+0x73, 0x69, 0x73, 0x61, 0x77, 0x61, 0x69, 0x74, 0x69, 0x3b, 0x6b, 0x65,
+0x74, 0x77, 0x69, 0x72, 0x74, 0x69, 0x6b, 0x73, 0x3b, 0x70, 0x113, 0x6e,
+0x74, 0x6e, 0x69, 0x6b, 0x73, 0x3b, 0x73, 0x61, 0x62, 0x61, 0x74, 0x74,
+0x69, 0x6b, 0x61, 0x6e, 0x61, 0x64, 0x3b, 0x70, 0x61, 0x6e, 0x3b, 0x77,
+0x69, 0x73, 0x3b, 0x70, 0x75, 0x73, 0x3b, 0x6b, 0x65, 0x74, 0x3b, 0x70,
+0x113, 0x6e, 0x3b, 0x73, 0x61, 0x62, 0x4e, 0x3b, 0x50, 0x3b, 0x57, 0x3b,
+0x50, 0x3b, 0x4b, 0x3b, 0x50, 0x3b, 0x53, 0xa10, 0xa24, 0xa35, 0xa3e, 0xa30,
+0x3b, 0xa38, 0xa4b, 0xa2e, 0xa35, 0xa3e, 0xa30, 0x3b, 0xa2e, 0xa70, 0xa17, 0xa32,
+0xa35, 0xa3e, 0xa30, 0x3b, 0xa2c, 0xa41, 0xa71, 0xa27, 0xa35, 0xa3e, 0xa30, 0x3b,
+0xa35, 0xa40, 0xa30, 0xa35, 0xa3e, 0xa30, 0x3b, 0xa38, 0xa3c, 0xa41, 0xa71, 0xa15,
+0xa30, 0xa35, 0xa3e, 0xa30, 0x3b, 0xa38, 0xa3c, 0xa28, 0xa3f, 0xa71, 0xa1a, 0xa30,
+0xa35, 0xa3e, 0xa30, 0xa10, 0xa24, 0x3b, 0xa38, 0xa4b, 0xa2e, 0x3b, 0xa2e, 0xa70,
+0xa17, 0xa32, 0x3b, 0xa2c, 0xa41, 0xa71, 0xa27, 0x3b, 0xa35, 0xa40, 0xa30, 0x3b,
+0xa38, 0xa3c, 0xa41, 0xa71, 0xa15, 0xa30, 0x3b, 0xa38, 0xa3c, 0xa28, 0xa3f, 0xa71,
+0xa1a, 0xa30, 0xa10, 0x3b, 0xa38, 0xa4b, 0x3b, 0xa2e, 0xa70, 0x3b, 0xa2c, 0xa41,
+0xa71, 0x3b, 0xa35, 0xa40, 0x3b, 0xa38, 0xa3c, 0xa41, 0xa71, 0x3b, 0xa38, 0xa3c,
+0x627, 0x62a, 0x648, 0x627, 0x631, 0x3b, 0x67e, 0x6cc, 0x631, 0x3b, 0x645, 0x646,
+0x6af, 0x644, 0x3b, 0x628, 0x64f, 0x62f, 0x6be, 0x3b, 0x62c, 0x645, 0x639, 0x631,
+0x627, 0x62a, 0x3b, 0x62c, 0x645, 0x639, 0x6c1, 0x3b, 0x6c1, 0x641, 0x62a, 0x6c1,
+0x44, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x6f, 0x3b, 0x4c, 0x75, 0x6e, 0x65,
+0x73, 0x3b, 0x4d, 0x61, 0x72, 0x74, 0x65, 0x73, 0x3b, 0x4d, 0x69, 0xe9,
+0x72, 0x63, 0x6f, 0x6c, 0x65, 0x73, 0x3b, 0x4a, 0x75, 0x65, 0x76, 0x65,
+0x73, 0x3b, 0x56, 0x69, 0x65, 0x72, 0x6e, 0x65, 0x73, 0x3b, 0x53, 0xe1,
+0x62, 0x61, 0x64, 0x6f, 0x44, 0x6f, 0x6d, 0x3b, 0x4c, 0x75, 0x6e, 0x3b,
+0x4d, 0x61, 0x72, 0x3b, 0x4d, 0x69, 0xe9, 0x3b, 0x4a, 0x75, 0x65, 0x3b,
+0x56, 0x69, 0x65, 0x3b, 0x53, 0x61, 0x62, 0x44, 0x3b, 0x4c, 0x3b, 0x4d,
+0x3b, 0x58, 0x3b, 0x4a, 0x3b, 0x56, 0x3b, 0x53, 0x64, 0x75, 0x6d, 0x69,
+0x6e, 0x69, 0x63, 0x103, 0x3b, 0x6c, 0x75, 0x6e, 0x69, 0x3b, 0x6d, 0x61,
+0x72, 0x21b, 0x69, 0x3b, 0x6d, 0x69, 0x65, 0x72, 0x63, 0x75, 0x72, 0x69,
+0x3b, 0x6a, 0x6f, 0x69, 0x3b, 0x76, 0x69, 0x6e, 0x65, 0x72, 0x69, 0x3b,
+0x73, 0xe2, 0x6d, 0x62, 0x103, 0x74, 0x103, 0x64, 0x75, 0x6d, 0x2e, 0x3b,
+0x6c, 0x75, 0x6e, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x2e, 0x3b, 0x6d, 0x69,
+0x65, 0x2e, 0x3b, 0x6a, 0x6f, 0x69, 0x3b, 0x76, 0x69, 0x6e, 0x2e, 0x3b,
+0x73, 0xe2, 0x6d, 0x2e, 0x44, 0x75, 0x6d, 0x3b, 0x4c, 0x75, 0x6e, 0x3b,
+0x4d, 0x61, 0x72, 0x3b, 0x4d, 0x69, 0x65, 0x3b, 0x4a, 0x6f, 0x69, 0x3b,
+0x56, 0x69, 0x6e, 0x3b, 0x53, 0xe2, 0x6d, 0x44, 0x3b, 0x4c, 0x3b, 0x4d,
+0x61, 0x3b, 0x4d, 0x69, 0x3b, 0x4a, 0x3b, 0x56, 0x3b, 0x53, 0x64, 0x75,
+0x6d, 0x65, 0x6e, 0x67, 0x69, 0x61, 0x3b, 0x67, 0x6c, 0x69, 0x6e, 0x64,
+0x65, 0x73, 0x64, 0x69, 0x3b, 0x6d, 0x61, 0x72, 0x64, 0x69, 0x3b, 0x6d,
+0x65, 0x73, 0x65, 0x6d, 0x6e, 0x61, 0x3b, 0x67, 0x69, 0x65, 0x76, 0x67,
+0x69, 0x61, 0x3b, 0x76, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x64, 0x69, 0x3b,
+0x73, 0x6f, 0x6e, 0x64, 0x61, 0x64, 0x75, 0x3b, 0x67, 0x6c, 0x69, 0x3b,
+0x6d, 0x61, 0x3b, 0x6d, 0x65, 0x3b, 0x67, 0x69, 0x65, 0x3b, 0x76, 0x65,
+0x3b, 0x73, 0x6f, 0x44, 0x3b, 0x47, 0x3b, 0x4d, 0x3b, 0x4d, 0x3b, 0x47,
+0x3b, 0x56, 0x3b, 0x53, 0x49, 0x6a, 0x75, 0x6d, 0x61, 0x70, 0x69, 0x6c,
+0x69, 0x3b, 0x49, 0x6a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x74, 0x75, 0x3b,
+0x49, 0x6a, 0x75, 0x6d, 0x61, 0x6e, 0x6e, 0x65, 0x3b, 0x49, 0x6a, 0x75,
+0x6d, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x41, 0x6c, 0x68, 0x61, 0x6d,
+0x69, 0x73, 0x69, 0x3b, 0x49, 0x6a, 0x75, 0x6d, 0x61, 0x61, 0x3b, 0x49,
+0x6a, 0x75, 0x6d, 0x61, 0x6d, 0x6f, 0x73, 0x69, 0x49, 0x6a, 0x70, 0x3b,
+0x49, 0x6a, 0x74, 0x3b, 0x49, 0x6a, 0x6e, 0x3b, 0x49, 0x6a, 0x74, 0x6e,
+0x3b, 0x41, 0x6c, 0x68, 0x3b, 0x49, 0x6a, 0x75, 0x3b, 0x49, 0x6a, 0x6d,
+0x4b, 0x75, 0x20, 0x77, 0x2019, 0x69, 0x6e, 0x64, 0x77, 0x69, 0x3b, 0x4b,
+0x75, 0x20, 0x77, 0x61, 0x20, 0x6d, 0x62, 0x65, 0x72, 0x65, 0x3b, 0x4b,
+0x75, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x62, 0x69, 0x72, 0x69, 0x3b,
+0x4b, 0x75, 0x20, 0x77, 0x61, 0x20, 0x67, 0x61, 0x74, 0x61, 0x74, 0x75,
+0x3b, 0x4b, 0x75, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x6e, 0x65, 0x3b,
+0x4b, 0x75, 0x20, 0x77, 0x61, 0x20, 0x67, 0x61, 0x74, 0x61, 0x6e, 0x75,
+0x3b, 0x4b, 0x75, 0x20, 0x77, 0x61, 0x20, 0x67, 0x61, 0x74, 0x61, 0x6e,
+0x64, 0x61, 0x74, 0x75, 0x63, 0x75, 0x2e, 0x3b, 0x6d, 0x62, 0x65, 0x2e,
+0x3b, 0x6b, 0x61, 0x62, 0x2e, 0x3b, 0x67, 0x74, 0x75, 0x2e, 0x3b, 0x6b,
+0x61, 0x6e, 0x2e, 0x3b, 0x67, 0x6e, 0x75, 0x2e, 0x3b, 0x67, 0x6e, 0x64,
+0x2e, 0x432, 0x43e, 0x441, 0x43a, 0x440, 0x435, 0x441, 0x435, 0x43d, 0x44c, 0x435,
+0x3b, 0x43f, 0x43e, 0x43d, 0x435, 0x434, 0x435, 0x43b, 0x44c, 0x43d, 0x438, 0x43a,
+0x3b, 0x432, 0x442, 0x43e, 0x440, 0x43d, 0x438, 0x43a, 0x3b, 0x441, 0x440, 0x435,
+0x434, 0x430, 0x3b, 0x447, 0x435, 0x442, 0x432, 0x435, 0x440, 0x433, 0x3b, 0x43f,
+0x44f, 0x442, 0x43d, 0x438, 0x446, 0x430, 0x3b, 0x441, 0x443, 0x431, 0x431, 0x43e,
+0x442, 0x430, 0x432, 0x441, 0x3b, 0x43f, 0x43d, 0x3b, 0x432, 0x442, 0x3b, 0x441,
+0x440, 0x3b, 0x447, 0x442, 0x3b, 0x43f, 0x442, 0x3b, 0x441, 0x431, 0x412, 0x3b,
+0x41f, 0x3b, 0x412, 0x3b, 0x421, 0x3b, 0x427, 0x3b, 0x41f, 0x3b, 0x421, 0x4e,
+0x61, 0x62, 0x61, 0x20, 0x53, 0x61, 0x6d, 0x62, 0x61, 0x74, 0x3b, 0x53,
+0x61, 0x6e, 0x69, 0x3b, 0x53, 0x61, 0x6c, 0x75, 0x73, 0x3b, 0x52, 0x61,
+0x62, 0x75, 0x71, 0x3b, 0x43, 0x61, 0x6d, 0x75, 0x73, 0x3b, 0x4a, 0x75,
+0x6d, 0x71, 0x61, 0x74, 0x61, 0x3b, 0x51, 0x75, 0x6e, 0x78, 0x61, 0x20,
+0x53, 0x61, 0x6d, 0x62, 0x61, 0x74, 0x4e, 0x61, 0x62, 0x3b, 0x53, 0x61,
+0x6e, 0x3b, 0x53, 0x61, 0x6c, 0x3b, 0x52, 0x61, 0x62, 0x3b, 0x43, 0x61,
+0x6d, 0x3b, 0x4a, 0x75, 0x6d, 0x3b, 0x51, 0x75, 0x6e, 0x4e, 0x3b, 0x53,
+0x3b, 0x53, 0x3b, 0x52, 0x3b, 0x43, 0x3b, 0x4a, 0x3b, 0x51, 0x431, 0x430,
+0x441, 0x43a, 0x44b, 0x4bb, 0x44b, 0x430, 0x43d, 0x43d, 0x44c, 0x430, 0x3b, 0x431,
+0x44d, 0x43d, 0x438, 0x434, 0x438, 0x44d, 0x43d, 0x43d, 0x44c, 0x438, 0x43a, 0x3b,
+0x43e, 0x43f, 0x442, 0x443, 0x43e, 0x440, 0x443, 0x43d, 0x43d, 0x44c, 0x443, 0x43a,
+0x3b, 0x441, 0x44d, 0x440, 0x44d, 0x434, 0x44d, 0x3b, 0x447, 0x44d, 0x43f, 0x43f,
+0x438, 0x44d, 0x440, 0x3b, 0x411, 0x44d, 0x44d, 0x442, 0x438, 0x4a5, 0x441, 0x44d,
+0x3b, 0x441, 0x443, 0x431, 0x443, 0x43e, 0x442, 0x430, 0x431, 0x441, 0x3b, 0x431,
+0x43d, 0x3b, 0x43e, 0x43f, 0x3b, 0x441, 0x44d, 0x3b, 0x447, 0x43f, 0x3b, 0x431,
+0x44d, 0x3b, 0x441, 0x431, 0x411, 0x3b, 0x411, 0x3b, 0x41e, 0x3b, 0x421, 0x3b,
+0x427, 0x3b, 0x411, 0x3b, 0x421, 0x4d, 0x64, 0x65, 0x72, 0x6f, 0x74, 0x20,
+0x65, 0x65, 0x20, 0x61, 0x72, 0x65, 0x3b, 0x4d, 0x64, 0x65, 0x72, 0x6f,
+0x74, 0x20, 0x65, 0x65, 0x20, 0x6b, 0x75, 0x6e, 0x69, 0x3b, 0x4d, 0x64,
+0x65, 0x72, 0x6f, 0x74, 0x20, 0x65, 0x65, 0x20, 0x6f, 0x6e, 0x67, 0x2019,
+0x77, 0x61, 0x6e, 0x3b, 0x4d, 0x64, 0x65, 0x72, 0x6f, 0x74, 0x20, 0x65,
+0x65, 0x20, 0x69, 0x6e, 0x65, 0x74, 0x3b, 0x4d, 0x64, 0x65, 0x72, 0x6f,
+0x74, 0x20, 0x65, 0x65, 0x20, 0x69, 0x6c, 0x65, 0x3b, 0x4d, 0x64, 0x65,
+0x72, 0x6f, 0x74, 0x20, 0x65, 0x65, 0x20, 0x73, 0x61, 0x70, 0x61, 0x3b,
+0x4d, 0x64, 0x65, 0x72, 0x6f, 0x74, 0x20, 0x65, 0x65, 0x20, 0x6b, 0x77,
+0x65, 0x41, 0x72, 0x65, 0x3b, 0x4b, 0x75, 0x6e, 0x3b, 0x4f, 0x6e, 0x67,
+0x3b, 0x49, 0x6e, 0x65, 0x3b, 0x49, 0x6c, 0x65, 0x3b, 0x53, 0x61, 0x70,
+0x3b, 0x4b, 0x77, 0x65, 0x41, 0x3b, 0x4b, 0x3b, 0x4f, 0x3b, 0x49, 0x3b,
+0x49, 0x3b, 0x53, 0x3b, 0x4b, 0x42, 0x69, 0x6b, 0x75, 0x61, 0x2d, 0xf4,
+0x6b, 0x6f, 0x3b, 0x42, 0xef, 0x6b, 0x75, 0x61, 0x2d, 0xfb, 0x73, 0x65,
+0x3b, 0x42, 0xef, 0x6b, 0x75, 0x61, 0x2d, 0x70, 0x74, 0xe2, 0x3b, 0x42,
+0xef, 0x6b, 0x75, 0x61, 0x2d, 0x75, 0x73, 0xef, 0xf6, 0x3b, 0x42, 0xef,
+0x6b, 0x75, 0x61, 0x2d, 0x6f, 0x6b, 0xfc, 0x3b, 0x4c, 0xe2, 0x70, 0xf4,
+0x73, 0xf6, 0x3b, 0x4c, 0xe2, 0x79, 0x65, 0x6e, 0x67, 0x61, 0x42, 0x6b,
+0x31, 0x3b, 0x42, 0x6b, 0x32, 0x3b, 0x42, 0x6b, 0x33, 0x3b, 0x42, 0x6b,
+0x34, 0x3b, 0x42, 0x6b, 0x35, 0x3b, 0x4c, 0xe2, 0x70, 0x3b, 0x4c, 0xe2,
+0x79, 0x4b, 0x3b, 0x53, 0x3b, 0x54, 0x3b, 0x53, 0x3b, 0x4b, 0x3b, 0x50,
+0x3b, 0x59, 0x4d, 0x75, 0x6c, 0x75, 0x6e, 0x67, 0x75, 0x3b, 0x4a, 0x75,
+0x6d, 0x61, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x6e,
+0x6e, 0x65, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x3b,
+0x41, 0x6c, 0x61, 0x68, 0x61, 0x6d, 0x69, 0x73, 0x69, 0x3b, 0x49, 0x6a,
+0x75, 0x6d, 0x61, 0x61, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x6d, 0x6f, 0x73,
+0x69, 0x4d, 0x75, 0x6c, 0x3b, 0x4a, 0x74, 0x74, 0x3b, 0x4a, 0x6e, 0x6e,
+0x3b, 0x4a, 0x74, 0x6e, 0x3b, 0x41, 0x6c, 0x68, 0x3b, 0x49, 0x6a, 0x75,
+0x3b, 0x4a, 0x6d, 0x6f, 0x4d, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b,
+0x41, 0x3b, 0x49, 0x3b, 0x4a, 0x930, 0x935, 0x93f, 0x935, 0x93e, 0x938, 0x930,
+0x903, 0x3b, 0x938, 0x94b, 0x92e, 0x935, 0x93e, 0x938, 0x930, 0x903, 0x3b, 0x92e,
+0x902, 0x917, 0x932, 0x935, 0x93e, 0x938, 0x930, 0x903, 0x3b, 0x92c, 0x941, 0x927,
+0x935, 0x93e, 0x938, 0x930, 0x903, 0x3b, 0x917, 0x941, 0x930, 0x941, 0x935, 0x93e,
+0x938, 0x930, 0x3a, 0x3b, 0x936, 0x941, 0x915, 0x94d, 0x930, 0x935, 0x93e, 0x938,
+0x930, 0x903, 0x3b, 0x936, 0x928, 0x93f, 0x935, 0x93e, 0x938, 0x930, 0x903, 0x1c65,
+0x1c64, 0x1c78, 0x1c5c, 0x1c6e, 0x3b, 0x1c5a, 0x1c5b, 0x1c6e, 0x3b, 0x1c75, 0x1c5f, 0x1c5e,
+0x1c6e, 0x3b, 0x1c65, 0x1c5f, 0x1c79, 0x1c5c, 0x1c69, 0x1c71, 0x3b, 0x1c65, 0x1c5f, 0x1c79,
+0x1c68, 0x1c6b, 0x1c64, 0x3b, 0x1c61, 0x1c5f, 0x1c79, 0x1c68, 0x1c69, 0x1c62, 0x3b, 0x1c67,
+0x1c69, 0x1c66, 0x1c69, 0x1c62, 0x1c65, 0x1c64, 0x1c78, 0x3b, 0x1c5a, 0x1c5b, 0x3b, 0x1c75,
+0x1c5f, 0x3b, 0x1c65, 0x1c5f, 0x1c79, 0x3b, 0x1c65, 0x1c5f, 0x1c79, 0x1c68, 0x3b, 0x1c61,
+0x1c5f, 0x1c79, 0x3b, 0x1c67, 0x1c69, 0x1c65, 0x3b, 0x1c5a, 0x3b, 0x1c75, 0x3b, 0x1c65,
+0x3b, 0x1c65, 0x3b, 0x1c61, 0x3b, 0x1c67, 0x64, 0x6f, 0x6d, 0xec, 0x6e, 0x69,
+0x67, 0x61, 0x3b, 0x6c, 0x75, 0x6e, 0x69, 0x73, 0x3b, 0x6d, 0x61, 0x72,
+0x74, 0x69, 0x73, 0x3b, 0x6d, 0xe8, 0x72, 0x63, 0x75, 0x72, 0x69, 0x73,
+0x3b, 0x67, 0x69, 0xf2, 0x62, 0x69, 0x61, 0x3b, 0x63, 0x68, 0x65, 0x6e,
+0xe0, 0x62, 0x75, 0x72, 0x61, 0x3b, 0x73, 0xe0, 0x62, 0x61, 0x64, 0x75,
+0x64, 0x6f, 0x6d, 0x3b, 0x6c, 0x75, 0x6e, 0x3b, 0x6d, 0x61, 0x72, 0x3b,
+0x6d, 0xe8, 0x72, 0x3b, 0x67, 0x69, 0xf2, 0x3b, 0x63, 0x68, 0x65, 0x3b,
+0x73, 0xe0, 0x62, 0x44, 0x3b, 0x4c, 0x3b, 0x4d, 0x3b, 0x4d, 0x3b, 0x47,
+0x3b, 0x43, 0x3b, 0x53, 0x44, 0x69, 0x6d, 0x69, 0x6e, 0x67, 0x75, 0x3b,
+0x43, 0x68, 0x69, 0x70, 0x6f, 0x73, 0x69, 0x3b, 0x43, 0x68, 0x69, 0x70,
+0x69, 0x72, 0x69, 0x3b, 0x43, 0x68, 0x69, 0x74, 0x61, 0x74, 0x75, 0x3b,
+0x43, 0x68, 0x69, 0x6e, 0x61, 0x69, 0x3b, 0x43, 0x68, 0x69, 0x73, 0x68,
+0x61, 0x6e, 0x75, 0x3b, 0x53, 0x61, 0x62, 0x75, 0x64, 0x75, 0x44, 0x69,
+0x6d, 0x3b, 0x50, 0x6f, 0x73, 0x3b, 0x50, 0x69, 0x72, 0x3b, 0x54, 0x61,
+0x74, 0x3b, 0x4e, 0x61, 0x69, 0x3b, 0x53, 0x68, 0x61, 0x3b, 0x53, 0x61,
+0x62, 0x44, 0x3b, 0x50, 0x3b, 0x43, 0x3b, 0x54, 0x3b, 0x4e, 0x3b, 0x53,
+0x3b, 0x53, 0x43d, 0x435, 0x434, 0x435, 0x459, 0x430, 0x3b, 0x43f, 0x43e, 0x43d,
+0x435, 0x434, 0x435, 0x459, 0x430, 0x43a, 0x3b, 0x443, 0x442, 0x43e, 0x440, 0x430,
+0x43a, 0x3b, 0x441, 0x440, 0x435, 0x434, 0x430, 0x3b, 0x447, 0x435, 0x442, 0x432,
+0x440, 0x442, 0x430, 0x43a, 0x3b, 0x43f, 0x435, 0x442, 0x430, 0x43a, 0x3b, 0x441,
+0x443, 0x431, 0x43e, 0x442, 0x430, 0x43d, 0x435, 0x434, 0x3b, 0x43f, 0x43e, 0x43d,
+0x3b, 0x443, 0x442, 0x43e, 0x3b, 0x441, 0x440, 0x435, 0x3b, 0x447, 0x435, 0x442,
+0x3b, 0x43f, 0x435, 0x442, 0x3b, 0x441, 0x443, 0x431, 0x43d, 0x435, 0x434, 0x458,
+0x435, 0x459, 0x430, 0x3b, 0x43f, 0x43e, 0x43d, 0x435, 0x434, 0x435, 0x459, 0x430,
+0x43a, 0x3b, 0x443, 0x442, 0x43e, 0x440, 0x430, 0x43a, 0x3b, 0x441, 0x440, 0x438,
+0x458, 0x435, 0x434, 0x430, 0x3b, 0x447, 0x435, 0x442, 0x432, 0x440, 0x442, 0x430,
+0x43a, 0x3b, 0x43f, 0x435, 0x442, 0x430, 0x43a, 0x3b, 0x441, 0x443, 0x431, 0x43e,
+0x442, 0x430, 0x6e, 0x65, 0x64, 0x65, 0x6c, 0x6a, 0x61, 0x3b, 0x70, 0x6f,
+0x6e, 0x65, 0x64, 0x65, 0x6c, 0x6a, 0x61, 0x6b, 0x3b, 0x75, 0x74, 0x6f,
+0x72, 0x61, 0x6b, 0x3b, 0x73, 0x72, 0x65, 0x64, 0x61, 0x3b, 0x10d, 0x65,
+0x74, 0x76, 0x72, 0x74, 0x61, 0x6b, 0x3b, 0x70, 0x65, 0x74, 0x61, 0x6b,
+0x3b, 0x73, 0x75, 0x62, 0x6f, 0x74, 0x61, 0x6e, 0x65, 0x64, 0x3b, 0x70,
+0x6f, 0x6e, 0x3b, 0x75, 0x74, 0x6f, 0x3b, 0x73, 0x72, 0x65, 0x3b, 0x10d,
+0x65, 0x74, 0x3b, 0x70, 0x65, 0x74, 0x3b, 0x73, 0x75, 0x62, 0x6e, 0x65,
+0x64, 0x6a, 0x65, 0x6c, 0x6a, 0x61, 0x3b, 0x70, 0x6f, 0x6e, 0x65, 0x64,
+0x65, 0x6c, 0x6a, 0x61, 0x6b, 0x3b, 0x75, 0x74, 0x6f, 0x72, 0x61, 0x6b,
+0x3b, 0x73, 0x72, 0x69, 0x6a, 0x65, 0x64, 0x61, 0x3b, 0x10d, 0x65, 0x74,
+0x76, 0x72, 0x74, 0x61, 0x6b, 0x3b, 0x70, 0x65, 0x74, 0x61, 0x6b, 0x3b,
+0x73, 0x75, 0x62, 0x6f, 0x74, 0x61, 0x4a, 0x75, 0x6d, 0x61, 0x61, 0x70,
+0x69, 0x69, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x61, 0x74, 0x61, 0x74, 0x75,
+0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x61, 0x6e, 0x65, 0x3b, 0x4a, 0x75, 0x6d,
+0x61, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x41, 0x6c, 0x68, 0x61, 0x6d,
+0x69, 0x73, 0x69, 0x3b, 0x49, 0x6a, 0x75, 0x6d, 0x61, 0x61, 0x3b, 0x4a,
+0x75, 0x6d, 0x61, 0x61, 0x6d, 0x6f, 0x73, 0x69, 0x4a, 0x70, 0x69, 0x3b,
+0x4a, 0x74, 0x74, 0x3b, 0x4a, 0x6d, 0x6e, 0x3b, 0x4a, 0x74, 0x6e, 0x3b,
+0x41, 0x6c, 0x68, 0x3b, 0x49, 0x6a, 0x75, 0x3b, 0x4a, 0x6d, 0x6f, 0x32,
+0x3b, 0x33, 0x3b, 0x34, 0x3b, 0x35, 0x3b, 0x41, 0x3b, 0x49, 0x3b, 0x31,
+0x53, 0x76, 0x6f, 0x6e, 0x64, 0x6f, 0x3b, 0x4d, 0x75, 0x76, 0x68, 0x75,
+0x72, 0x6f, 0x3b, 0x43, 0x68, 0x69, 0x70, 0x69, 0x72, 0x69, 0x3b, 0x43,
+0x68, 0x69, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x43, 0x68, 0x69, 0x6e, 0x61,
+0x3b, 0x43, 0x68, 0x69, 0x73, 0x68, 0x61, 0x6e, 0x75, 0x3b, 0x4d, 0x75,
+0x67, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x53, 0x76, 0x6f, 0x3b, 0x4d, 0x75,
+0x76, 0x3b, 0x43, 0x68, 0x70, 0x3b, 0x43, 0x68, 0x74, 0x3b, 0x43, 0x68,
+0x6e, 0x3b, 0x43, 0x68, 0x73, 0x3b, 0x4d, 0x75, 0x67, 0x53, 0x3b, 0x4d,
+0x3b, 0x43, 0x3b, 0x43, 0x3b, 0x43, 0x3b, 0x43, 0x3b, 0x4d, 0xa46d, 0xa18f,
+0xa44d, 0x3b, 0xa18f, 0xa282, 0xa2cd, 0x3b, 0xa18f, 0xa282, 0xa44d, 0x3b, 0xa18f, 0xa282,
+0xa315, 0x3b, 0xa18f, 0xa282, 0xa1d6, 0x3b, 0xa18f, 0xa282, 0xa26c, 0x3b, 0xa18f, 0xa282,
+0xa0d8, 0xa46d, 0xa18f, 0x3b, 0xa18f, 0xa2cd, 0x3b, 0xa18f, 0xa44d, 0x3b, 0xa18f, 0xa315,
+0x3b, 0xa18f, 0xa1d6, 0x3b, 0xa18f, 0xa26c, 0x3b, 0xa18f, 0xa0d8, 0xa18f, 0x3b, 0xa2cd,
+0x3b, 0xa44d, 0x3b, 0xa315, 0x3b, 0xa1d6, 0x3b, 0xa26c, 0x3b, 0xa0d8, 0x64, 0x75,
+0x6d, 0xec, 0x6e, 0x69, 0x63, 0x61, 0x3b, 0x6c, 0x75, 0x6e, 0x6e, 0x69,
+0x64, 0xec, 0x61, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x69, 0x64, 0xec, 0x61,
+0x3b, 0x6d, 0x65, 0x72, 0x63, 0x75, 0x72, 0x69, 0x64, 0xec, 0x61, 0x3b,
+0x6a, 0x6f, 0x76, 0x69, 0x64, 0xec, 0x61, 0x3b, 0x76, 0x65, 0x6e, 0x6e,
+0x69, 0x64, 0xec, 0x61, 0x3b, 0x73, 0xe0, 0x62, 0x62, 0x61, 0x74, 0x75,
+0x53, 0x61, 0x6d, 0x62, 0x61, 0x74, 0x61, 0x3b, 0x53, 0x61, 0x6e, 0x79,
+0x6f, 0x3b, 0x4d, 0x61, 0x61, 0x6b, 0x69, 0x73, 0x61, 0x6e, 0x79, 0x6f,
+0x3b, 0x52, 0x6f, 0x6f, 0x77, 0x65, 0x3b, 0x48, 0x61, 0x6d, 0x75, 0x73,
+0x65, 0x3b, 0x41, 0x72, 0x62, 0x65, 0x3b, 0x51, 0x69, 0x64, 0x61, 0x61,
+0x6d, 0x65, 0x53, 0x61, 0x6d, 0x3b, 0x53, 0x61, 0x6e, 0x3b, 0x4d, 0x61,
+0x6b, 0x3b, 0x52, 0x6f, 0x77, 0x3b, 0x48, 0x61, 0x6d, 0x3b, 0x41, 0x72,
+0x62, 0x3b, 0x51, 0x69, 0x64, 0x53, 0x3b, 0x53, 0x3b, 0x4d, 0x3b, 0x52,
+0x3b, 0x48, 0x3b, 0x41, 0x3b, 0x51, 0x6e, 0x69, 0x79, 0x64, 0x7a, 0x69,
+0x65, 0x6c, 0x61, 0x3b, 0x70, 0x79, 0x144, 0x64, 0x7a, 0x69, 0x61, 0x142,
+0x65, 0x6b, 0x3b, 0x77, 0x74, 0x6f, 0x72, 0x65, 0x6b, 0x3b, 0x73, 0x74,
+0x72, 0x7a, 0x6f, 0x64, 0x61, 0x3b, 0x73, 0x7a, 0x74, 0x77, 0x6f, 0x72,
+0x74, 0x65, 0x6b, 0x3b, 0x70, 0x69, 0x14d, 0x6e, 0x74, 0x65, 0x6b, 0x3b,
+0x73, 0x6f, 0x62, 0x6f, 0x74, 0x61, 0x6e, 0x69, 0x79, 0x3b, 0x70, 0x79,
+0x144, 0x3b, 0x77, 0x74, 0x6f, 0x3b, 0x73, 0x74, 0x72, 0x3b, 0x73, 0x7a,
+0x74, 0x3b, 0x70, 0x69, 0x14d, 0x3b, 0x73, 0x6f, 0x62, 0x622, 0x686, 0x631,
+0x3b, 0x633, 0x648, 0x645, 0x631, 0x3b, 0x627, 0x6b1, 0x627, 0x631, 0x648, 0x3b,
+0x627, 0x631, 0x628, 0x639, 0x3b, 0x62e, 0x645, 0x64a, 0x633, 0x3b, 0x62c, 0x645,
+0x639, 0x648, 0x3b, 0x687, 0x646, 0x687, 0x631, 0x622, 0x686, 0x631, 0x3b, 0x633,
+0x648, 0x3b, 0x627, 0x6b1, 0x627, 0x631, 0x648, 0x3b, 0x627, 0x631, 0x628, 0x639,
+0x3b, 0x62e, 0x645, 0x3b, 0x62c, 0x645, 0x639, 0x648, 0x3b, 0x687, 0x646, 0x687,
+0x631, 0x906, 0x930, 0x94d, 0x924, 0x3b, 0x938, 0x942, 0x3b, 0x92e, 0x902, 0x3b,
+0x92c, 0x941, 0x952, 0x927, 0x3b, 0x935, 0x93f, 0x938, 0x3b, 0x91c, 0x941, 0x92e,
+0x3b, 0x91b, 0x902, 0x91b, 0x906, 0x930, 0x94d, 0x924, 0x935, 0x93e, 0x930, 0x3b,
+0x938, 0x942, 0x92e, 0x930, 0x3b, 0x92e, 0x902, 0x917, 0x932, 0x941, 0x3b, 0x92c,
+0x941, 0x952, 0x927, 0x930, 0x3b, 0x935, 0x93f, 0x938, 0x94d, 0x92a, 0x924, 0x3b,
+0x91c, 0x941, 0x92e, 0x94b, 0x3b, 0x91b, 0x902, 0x91b, 0x930, 0x906, 0x3b, 0x938,
+0x942, 0x3b, 0x92e, 0x902, 0x3b, 0x92c, 0x941, 0x927, 0x3b, 0x935, 0x93f, 0x938,
+0x3b, 0x91c, 0x941, 0x3b, 0x91b, 0x902, 0x91b, 0x906, 0x930, 0x94d, 0x924, 0x3b,
+0x938, 0x942, 0x3b, 0x92e, 0x902, 0x917, 0x3b, 0x92c, 0x941, 0x952, 0x927, 0x3b,
+0x935, 0x93f, 0x938, 0x3b, 0x91c, 0x941, 0x92e, 0x3b, 0x91b, 0x902, 0x91b, 0x906,
+0x3b, 0x938, 0x942, 0x3b, 0x92e, 0x902, 0x3b, 0x92c, 0x941, 0x952, 0x3b, 0x935,
+0x93f, 0x3b, 0x91c, 0x941, 0x3b, 0x91b, 0x902, 0xd89, 0xdbb, 0xdd2, 0xdaf, 0xdcf,
+0x3b, 0xdc3, 0xdb3, 0xdd4, 0xdaf, 0xdcf, 0x3b, 0xd85, 0xd9f, 0xdc4, 0xdbb, 0xdd4,
+0xdc0, 0xdcf, 0xdaf, 0xdcf, 0x3b, 0xdb6, 0xdaf, 0xdcf, 0xdaf, 0xdcf, 0x3b, 0xdb6,
+0xdca, 0x200d, 0xdbb, 0xdc4, 0xdc3, 0xdca, 0xdb4, 0xdad, 0xdd2, 0xdb1, 0xdca, 0xdaf,
+0xdcf, 0x3b, 0xdc3, 0xdd2, 0xd9a, 0xdd4, 0xdbb, 0xdcf, 0xdaf, 0xdcf, 0x3b, 0xdc3,
+0xdd9, 0xdb1, 0xdc3, 0xdd4, 0xdbb, 0xdcf, 0xdaf, 0xdcf, 0xd89, 0xdbb, 0xdd2, 0xdaf,
+0xdcf, 0x3b, 0xdc3, 0xdb3, 0xdd4, 0xdaf, 0xdcf, 0x3b, 0xd85, 0xd9f, 0xdc4, 0x3b,
+0xdb6, 0xdaf, 0xdcf, 0xdaf, 0xdcf, 0x3b, 0xdb6, 0xdca, 0x200d, 0xdbb, 0xdc4, 0xdc3,
+0xdca, 0x3b, 0xdc3, 0xdd2, 0xd9a, 0xdd4, 0x3b, 0xdc3, 0xdd9, 0xdb1, 0xd89, 0x3b,
+0xdc3, 0x3b, 0xd85, 0x3b, 0xdb6, 0x3b, 0xdb6, 0xdca, 0x200d, 0xdbb, 0x3b, 0xdc3,
+0xdd2, 0x3b, 0xdc3, 0xdd9, 0x6e, 0x65, 0x64, 0x65, 0x13e, 0x61, 0x3b, 0x70,
+0x6f, 0x6e, 0x64, 0x65, 0x6c, 0x6f, 0x6b, 0x3b, 0x75, 0x74, 0x6f, 0x72,
+0x6f, 0x6b, 0x3b, 0x73, 0x74, 0x72, 0x65, 0x64, 0x61, 0x3b, 0x161, 0x74,
+0x76, 0x72, 0x74, 0x6f, 0x6b, 0x3b, 0x70, 0x69, 0x61, 0x74, 0x6f, 0x6b,
+0x3b, 0x73, 0x6f, 0x62, 0x6f, 0x74, 0x61, 0x6e, 0x65, 0x3b, 0x70, 0x6f,
+0x3b, 0x75, 0x74, 0x3b, 0x73, 0x74, 0x3b, 0x161, 0x74, 0x3b, 0x70, 0x69,
+0x3b, 0x73, 0x6f, 0x6e, 0x3b, 0x70, 0x3b, 0x75, 0x3b, 0x73, 0x3b, 0x161,
+0x3b, 0x70, 0x3b, 0x73, 0x6e, 0x65, 0x64, 0x65, 0x6c, 0x6a, 0x61, 0x3b,
+0x70, 0x6f, 0x6e, 0x65, 0x64, 0x65, 0x6c, 0x6a, 0x65, 0x6b, 0x3b, 0x74,
+0x6f, 0x72, 0x65, 0x6b, 0x3b, 0x73, 0x72, 0x65, 0x64, 0x61, 0x3b, 0x10d,
+0x65, 0x74, 0x72, 0x74, 0x65, 0x6b, 0x3b, 0x70, 0x65, 0x74, 0x65, 0x6b,
+0x3b, 0x73, 0x6f, 0x62, 0x6f, 0x74, 0x61, 0x6e, 0x65, 0x64, 0x2e, 0x3b,
+0x70, 0x6f, 0x6e, 0x2e, 0x3b, 0x74, 0x6f, 0x72, 0x2e, 0x3b, 0x73, 0x72,
+0x65, 0x2e, 0x3b, 0x10d, 0x65, 0x74, 0x2e, 0x3b, 0x70, 0x65, 0x74, 0x2e,
+0x3b, 0x73, 0x6f, 0x62, 0x2e, 0x6e, 0x3b, 0x70, 0x3b, 0x74, 0x3b, 0x73,
+0x3b, 0x10d, 0x3b, 0x70, 0x3b, 0x73, 0x53, 0x61, 0x62, 0x69, 0x69, 0x74,
+0x69, 0x3b, 0x42, 0x61, 0x6c, 0x61, 0x7a, 0x61, 0x3b, 0x4f, 0x77, 0x6f,
+0x6b, 0x75, 0x62, 0x69, 0x6c, 0x69, 0x3b, 0x4f, 0x77, 0x6f, 0x6b, 0x75,
+0x73, 0x61, 0x74, 0x75, 0x3b, 0x4f, 0x6c, 0x6f, 0x6b, 0x75, 0x6e, 0x61,
+0x3b, 0x4f, 0x6c, 0x6f, 0x6b, 0x75, 0x74, 0x61, 0x61, 0x6e, 0x75, 0x3b,
+0x4f, 0x6c, 0x6f, 0x6d, 0x75, 0x6b, 0x61, 0x61, 0x67, 0x61, 0x53, 0x61,
+0x62, 0x69, 0x3b, 0x42, 0x61, 0x6c, 0x61, 0x3b, 0x4b, 0x75, 0x62, 0x69,
+0x3b, 0x4b, 0x75, 0x73, 0x61, 0x3b, 0x4b, 0x75, 0x6e, 0x61, 0x3b, 0x4b,
+0x75, 0x74, 0x61, 0x3b, 0x4d, 0x75, 0x6b, 0x61, 0x53, 0x3b, 0x42, 0x3b,
+0x42, 0x3b, 0x53, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4d, 0x41, 0x78, 0x61,
+0x64, 0x3b, 0x49, 0x73, 0x6e, 0x69, 0x69, 0x6e, 0x3b, 0x54, 0x61, 0x6c,
+0x61, 0x61, 0x64, 0x6f, 0x3b, 0x41, 0x72, 0x62, 0x61, 0x63, 0x6f, 0x3b,
+0x4b, 0x68, 0x61, 0x6d, 0x69, 0x69, 0x73, 0x3b, 0x4a, 0x69, 0x6d, 0x63,
+0x6f, 0x3b, 0x53, 0x61, 0x62, 0x74, 0x69, 0x41, 0x78, 0x64, 0x3b, 0x49,
+0x73, 0x6e, 0x3b, 0x54, 0x6c, 0x64, 0x6f, 0x3b, 0x41, 0x72, 0x62, 0x63,
+0x3b, 0x4b, 0x68, 0x6d, 0x73, 0x3b, 0x4a, 0x6d, 0x63, 0x3b, 0x53, 0x62,
+0x74, 0x69, 0x41, 0x3b, 0x49, 0x3b, 0x54, 0x3b, 0x41, 0x3b, 0x4b, 0x68,
+0x3b, 0x4a, 0x3b, 0x53, 0x53, 0x6f, 0x6e, 0x74, 0x61, 0x68, 0x61, 0x3b,
+0x4d, 0x6d, 0x61, 0x6e, 0x74, 0x61, 0x68, 0x61, 0x3b, 0x4c, 0x61, 0x62,
+0x6f, 0x62, 0x65, 0x64, 0x69, 0x3b, 0x4c, 0x61, 0x62, 0x6f, 0x72, 0x61,
+0x72, 0x75, 0x3b, 0x4c, 0x61, 0x62, 0x6f, 0x6e, 0x65, 0x3b, 0x4c, 0x61,
+0x62, 0x6f, 0x68, 0x6c, 0x61, 0x6e, 0x65, 0x3b, 0x4d, 0x6f, 0x71, 0x65,
+0x62, 0x65, 0x6c, 0x6f, 0x53, 0x6f, 0x6e, 0x3b, 0x4d, 0x6d, 0x61, 0x3b,
+0x42, 0x65, 0x64, 0x3b, 0x52, 0x61, 0x72, 0x3b, 0x4e, 0x65, 0x3b, 0x48,
+0x6c, 0x61, 0x3b, 0x4d, 0x6f, 0x71, 0x75, 0x53, 0x6f, 0x6e, 0x74, 0x6f,
+0x3b, 0x75, 0x4d, 0x76, 0x75, 0x6c, 0x6f, 0x3b, 0x75, 0x4c, 0x65, 0x73,
+0x69, 0x62, 0x69, 0x6c, 0x69, 0x3b, 0x4c, 0x65, 0x73, 0x69, 0x74, 0x68,
+0x61, 0x74, 0x68, 0x75, 0x3b, 0x75, 0x4c, 0x65, 0x73, 0x69, 0x6e, 0x65,
+0x3b, 0x6e, 0x67, 0x6f, 0x4c, 0x65, 0x73, 0x69, 0x68, 0x6c, 0x61, 0x6e,
+0x75, 0x3b, 0x75, 0x6d, 0x47, 0x71, 0x69, 0x62, 0x65, 0x6c, 0x6f, 0x53,
+0x6f, 0x6e, 0x3b, 0x4d, 0x76, 0x75, 0x3b, 0x42, 0x69, 0x6c, 0x3b, 0x54,
+0x68, 0x61, 0x3b, 0x4e, 0x65, 0x3b, 0x48, 0x6c, 0x61, 0x3b, 0x47, 0x71,
+0x69, 0x64, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x6f, 0x3b, 0x6c, 0x75, 0x6e,
+0x65, 0x73, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x65, 0x73, 0x3b, 0x6d, 0x69,
+0xe9, 0x72, 0x63, 0x6f, 0x6c, 0x65, 0x73, 0x3b, 0x6a, 0x75, 0x65, 0x76,
+0x65, 0x73, 0x3b, 0x76, 0x69, 0x65, 0x72, 0x6e, 0x65, 0x73, 0x3b, 0x73,
+0xe1, 0x62, 0x61, 0x64, 0x6f, 0x64, 0x6f, 0x6d, 0x3b, 0x6c, 0x75, 0x6e,
+0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x6d, 0x69, 0xe9, 0x3b, 0x6a, 0x75, 0x65,
+0x3b, 0x76, 0x69, 0x65, 0x3b, 0x73, 0xe1, 0x62, 0x44, 0x3b, 0x4c, 0x3b,
+0x4d, 0x3b, 0x6d, 0x3b, 0x4a, 0x3b, 0x56, 0x3b, 0x53, 0x2d30, 0x2d59, 0x2d30,
+0x2d4e, 0x2d30, 0x2d59, 0x3b, 0x2d30, 0x2d62, 0x2d4f, 0x2d30, 0x2d59, 0x3b, 0x2d30, 0x2d59,
+0x2d49, 0x2d4f, 0x2d30, 0x2d59, 0x3b, 0x2d30, 0x2d3d, 0x2d55, 0x2d30, 0x2d59, 0x3b, 0x2d30,
+0x2d3d, 0x2d61, 0x2d30, 0x2d59, 0x3b, 0x2d30, 0x2d59, 0x2d49, 0x2d4e, 0x2d61, 0x2d30, 0x2d59,
+0x3b, 0x2d30, 0x2d59, 0x2d49, 0x2d39, 0x2d62, 0x2d30, 0x2d59, 0x2d30, 0x2d59, 0x2d30, 0x3b,
+0x2d30, 0x2d62, 0x2d4f, 0x3b, 0x2d30, 0x2d59, 0x2d49, 0x3b, 0x2d30, 0x2d3d, 0x2d55, 0x3b,
+0x2d30, 0x2d3d, 0x2d61, 0x3b, 0x2d30, 0x2d59, 0x2d49, 0x2d4e, 0x3b, 0x2d30, 0x2d59, 0x2d49,
+0x2d39, 0x4d, 0x69, 0x6e, 0x67, 0x67, 0x75, 0x3b, 0x53, 0x65, 0x6e, 0xe9,
+0x6e, 0x3b, 0x53, 0x61, 0x6c, 0x61, 0x73, 0x61, 0x3b, 0x52, 0x65, 0x62,
+0x6f, 0x3b, 0x4b, 0x65, 0x6d, 0x69, 0x73, 0x3b, 0x4a, 0x75, 0x6d, 0x61,
+0x61, 0x68, 0x3b, 0x53, 0x61, 0x70, 0x74, 0x75, 0x4d, 0x6e, 0x67, 0x3b,
+0x53, 0x65, 0x6e, 0x3b, 0x53, 0x61, 0x6c, 0x3b, 0x52, 0x65, 0x62, 0x3b,
+0x4b, 0x65, 0x6d, 0x3b, 0x4a, 0x75, 0x6d, 0x3b, 0x53, 0x61, 0x70, 0x4c,
+0x69, 0x73, 0x6f, 0x6e, 0x74, 0x66, 0x6f, 0x3b, 0x75, 0x4d, 0x73, 0x6f,
+0x6d, 0x62, 0x75, 0x6c, 0x75, 0x6b, 0x6f, 0x3b, 0x4c, 0x65, 0x73, 0x69,
+0x62, 0x69, 0x6c, 0x69, 0x3b, 0x4c, 0x65, 0x73, 0x69, 0x74, 0x73, 0x61,
+0x74, 0x66, 0x75, 0x3b, 0x4c, 0x65, 0x73, 0x69, 0x6e, 0x65, 0x3b, 0x4c,
+0x65, 0x73, 0x69, 0x68, 0x6c, 0x61, 0x6e, 0x75, 0x3b, 0x75, 0x4d, 0x67,
+0x63, 0x69, 0x62, 0x65, 0x6c, 0x6f, 0x53, 0x6f, 0x6e, 0x3b, 0x4d, 0x73,
+0x6f, 0x3b, 0x42, 0x69, 0x6c, 0x3b, 0x54, 0x73, 0x61, 0x3b, 0x4e, 0x65,
+0x3b, 0x48, 0x6c, 0x61, 0x3b, 0x4d, 0x67, 0x63, 0x73, 0xf6, 0x6e, 0x64,
+0x61, 0x67, 0x3b, 0x6d, 0xe5, 0x6e, 0x64, 0x61, 0x67, 0x3b, 0x74, 0x69,
+0x73, 0x64, 0x61, 0x67, 0x3b, 0x6f, 0x6e, 0x73, 0x64, 0x61, 0x67, 0x3b,
+0x74, 0x6f, 0x72, 0x73, 0x64, 0x61, 0x67, 0x3b, 0x66, 0x72, 0x65, 0x64,
+0x61, 0x67, 0x3b, 0x6c, 0xf6, 0x72, 0x64, 0x61, 0x67, 0x73, 0xf6, 0x6e,
+0x3b, 0x6d, 0xe5, 0x6e, 0x3b, 0x74, 0x69, 0x73, 0x3b, 0x6f, 0x6e, 0x73,
+0x3b, 0x74, 0x6f, 0x72, 0x73, 0x3b, 0x66, 0x72, 0x65, 0x3b, 0x6c, 0xf6,
+0x72, 0x53, 0x75, 0x6e, 0x6e, 0x74, 0x69, 0x67, 0x3b, 0x4d, 0xe4, 0xe4,
+0x6e, 0x74, 0x69, 0x67, 0x3b, 0x5a, 0x69, 0x69, 0x73, 0x63, 0x68, 0x74,
+0x69, 0x67, 0x3b, 0x4d, 0x69, 0x74, 0x74, 0x77, 0x75, 0x63, 0x68, 0x3b,
+0x44, 0x75, 0x6e, 0x73, 0x63, 0x68, 0x74, 0x69, 0x67, 0x3b, 0x46, 0x72,
+0x69, 0x69, 0x74, 0x69, 0x67, 0x3b, 0x53, 0x61, 0x6d, 0x73, 0x63, 0x68,
+0x74, 0x69, 0x67, 0x53, 0x75, 0x2e, 0x3b, 0x4d, 0xe4, 0x2e, 0x3b, 0x5a,
+0x69, 0x2e, 0x3b, 0x4d, 0x69, 0x2e, 0x3b, 0x44, 0x75, 0x2e, 0x3b, 0x46,
+0x72, 0x2e, 0x3b, 0x53, 0x61, 0x2e, 0x71a, 0x715, 0x712, 0x72b, 0x712, 0x710,
+0x3b, 0x72c, 0x72a, 0x71d, 0x722, 0x712, 0x72b, 0x712, 0x710, 0x3b, 0x72c, 0x720,
+0x72c, 0x712, 0x72b, 0x712, 0x710, 0x3b, 0x710, 0x72a, 0x712, 0x725, 0x712, 0x72b,
+0x712, 0x710, 0x3b, 0x71a, 0x721, 0x72b, 0x712, 0x72b, 0x712, 0x710, 0x3b, 0x725,
+0x72a, 0x718, 0x712, 0x72c, 0x710, 0x3b, 0x72b, 0x712, 0x72c, 0x710, 0x71a, 0x715,
+0x3b, 0x72c, 0x72a, 0x71d, 0x722, 0x3b, 0x72c, 0x720, 0x72c, 0x3b, 0x710, 0x72a,
+0x712, 0x725, 0x3b, 0x71a, 0x721, 0x72b, 0x3b, 0x725, 0x72a, 0x718, 0x3b, 0x72b,
+0x712, 0x72c, 0x710, 0x71a, 0x3b, 0x72c, 0x3b, 0x72c, 0x3b, 0x710, 0x3b, 0x71a,
+0x3b, 0x725, 0x3b, 0x72b, 0x2d30, 0x2d59, 0x2d30, 0x2d4e, 0x2d30, 0x2d59, 0x3b, 0x2d30,
+0x2d62, 0x2d4f, 0x2d30, 0x2d59, 0x3b, 0x2d30, 0x2d59, 0x2d49, 0x2d4f, 0x2d30, 0x2d59, 0x3b,
+0x2d30, 0x2d3d, 0x2d55, 0x2d30, 0x2d59, 0x3b, 0x2d30, 0x2d3d, 0x2d61, 0x2d30, 0x2d59, 0x3b,
+0x2d59, 0x2d49, 0x2d4e, 0x2d61, 0x2d30, 0x2d59, 0x3b, 0x2d30, 0x2d59, 0x2d49, 0x2d39, 0x2d62,
+0x2d30, 0x2d59, 0x61, 0x73, 0x61, 0x6d, 0x61, 0x73, 0x3b, 0x61, 0x79, 0x6e,
+0x61, 0x73, 0x3b, 0x61, 0x73, 0x69, 0x6e, 0x61, 0x73, 0x3b, 0x61, 0x6b,
+0x1e5b, 0x61, 0x73, 0x3b, 0x61, 0x6b, 0x77, 0x61, 0x73, 0x3b, 0x61, 0x73,
+0x69, 0x6d, 0x77, 0x61, 0x73, 0x3b, 0x61, 0x73, 0x69, 0x1e0d, 0x79, 0x61,
+0x73, 0x61, 0x73, 0x61, 0x3b, 0x61, 0x79, 0x6e, 0x3b, 0x61, 0x73, 0x69,
+0x3b, 0x61, 0x6b, 0x1e5b, 0x3b, 0x61, 0x6b, 0x77, 0x3b, 0x61, 0x73, 0x69,
+0x6d, 0x3b, 0x61, 0x73, 0x69, 0x1e0d, 0x49, 0x74, 0x75, 0x6b, 0x75, 0x20,
+0x6a, 0x61, 0x20, 0x6a, 0x75, 0x6d, 0x77, 0x61, 0x3b, 0x4b, 0x75, 0x72,
+0x61, 0x6d, 0x75, 0x6b, 0x61, 0x20, 0x6a, 0x69, 0x6d, 0x77, 0x65, 0x72,
+0x69, 0x3b, 0x4b, 0x75, 0x72, 0x61, 0x6d, 0x75, 0x6b, 0x61, 0x20, 0x6b,
+0x61, 0x77, 0x69, 0x3b, 0x4b, 0x75, 0x72, 0x61, 0x6d, 0x75, 0x6b, 0x61,
+0x20, 0x6b, 0x61, 0x64, 0x61, 0x64, 0x75, 0x3b, 0x4b, 0x75, 0x72, 0x61,
+0x6d, 0x75, 0x6b, 0x61, 0x20, 0x6b, 0x61, 0x6e, 0x61, 0x3b, 0x4b, 0x75,
+0x72, 0x61, 0x6d, 0x75, 0x6b, 0x61, 0x20, 0x6b, 0x61, 0x73, 0x61, 0x6e,
+0x75, 0x3b, 0x4b, 0x69, 0x66, 0x75, 0x6c, 0x61, 0x20, 0x6e, 0x67, 0x75,
+0x77, 0x6f, 0x4a, 0x75, 0x6d, 0x3b, 0x4a, 0x69, 0x6d, 0x3b, 0x4b, 0x61,
+0x77, 0x3b, 0x4b, 0x61, 0x64, 0x3b, 0x4b, 0x61, 0x6e, 0x3b, 0x4b, 0x61,
+0x73, 0x3b, 0x4e, 0x67, 0x75, 0x4a, 0x3b, 0x4a, 0x3b, 0x4b, 0x3b, 0x4b,
+0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4e, 0x42f, 0x43a, 0x448, 0x430, 0x43d, 0x431,
+0x435, 0x3b, 0x414, 0x443, 0x448, 0x430, 0x43d, 0x431, 0x435, 0x3b, 0x421, 0x435,
+0x448, 0x430, 0x43d, 0x431, 0x435, 0x3b, 0x427, 0x43e, 0x440, 0x448, 0x430, 0x43d,
+0x431, 0x435, 0x3b, 0x41f, 0x430, 0x43d, 0x4b7, 0x448, 0x430, 0x43d, 0x431, 0x435,
+0x3b, 0x4b6, 0x443, 0x43c, 0x44a, 0x430, 0x3b, 0x428, 0x430, 0x43d, 0x431, 0x435,
+0x42f, 0x448, 0x431, 0x3b, 0x414, 0x448, 0x431, 0x3b, 0x421, 0x448, 0x431, 0x3b,
+0x427, 0x448, 0x431, 0x3b, 0x41f, 0x448, 0x431, 0x3b, 0x4b6, 0x43c, 0x44a, 0x3b,
+0x428, 0x43d, 0x431, 0x42f, 0x3b, 0x414, 0x3b, 0x421, 0x3b, 0x427, 0x3b, 0x41f,
+0x3b, 0x4b6, 0x3b, 0x428, 0xb9e, 0xbbe, 0xbaf, 0xbbf, 0xbb1, 0xbc1, 0x3b, 0xba4,
+0xbbf, 0xb99, 0xbcd, 0xb95, 0xbb3, 0xbcd, 0x3b, 0xb9a, 0xbc6, 0xbb5, 0xbcd, 0xbb5,
+0xbbe, 0xbaf, 0xbcd, 0x3b, 0xbaa, 0xbc1, 0xba4, 0xba9, 0xbcd, 0x3b, 0xbb5, 0xbbf,
+0xbaf, 0xbbe, 0xbb4, 0xba9, 0xbcd, 0x3b, 0xbb5, 0xbc6, 0xbb3, 0xbcd, 0xbb3, 0xbbf,
+0x3b, 0xb9a, 0xba9, 0xbbf, 0xb9e, 0xbbe, 0xbaf, 0xbbf, 0x2e, 0x3b, 0xba4, 0xbbf,
+0xb99, 0xbcd, 0x2e, 0x3b, 0xb9a, 0xbc6, 0xbb5, 0xbcd, 0x2e, 0x3b, 0xbaa, 0xbc1,
+0xba4, 0x2e, 0x3b, 0xbb5, 0xbbf, 0xbaf, 0xbbe, 0x2e, 0x3b, 0xbb5, 0xbc6, 0xbb3,
+0xbcd, 0x2e, 0x3b, 0xb9a, 0xba9, 0xbbf, 0xb9e, 0xbbe, 0x3b, 0xba4, 0xbbf, 0x3b,
+0xb9a, 0xbc6, 0x3b, 0xbaa, 0xbc1, 0x3b, 0xbb5, 0xbbf, 0x3b, 0xbb5, 0xbc6, 0x3b,
+0xb9a, 0x4a, 0x69, 0x79, 0x61, 0x78, 0x20, 0x73, 0x6e, 0x67, 0x61, 0x79,
+0x61, 0x6e, 0x3b, 0x74, 0x67, 0x4b, 0x69, 0x6e, 0x67, 0x61, 0x6c, 0x20,
+0x6a, 0x69, 0x79, 0x61, 0x78, 0x20, 0x69, 0x79, 0x61, 0x78, 0x20, 0x73,
+0x6e, 0x67, 0x61, 0x79, 0x61, 0x6e, 0x3b, 0x74, 0x67, 0x44, 0x68, 0x61,
+0x20, 0x6a, 0x69, 0x79, 0x61, 0x78, 0x20, 0x69, 0x79, 0x61, 0x78, 0x20,
+0x73, 0x6e, 0x67, 0x61, 0x79, 0x61, 0x6e, 0x3b, 0x74, 0x67, 0x54, 0x72,
+0x75, 0x20, 0x6a, 0x69, 0x79, 0x61, 0x78, 0x20, 0x69, 0x79, 0x61, 0x78,
+0x20, 0x73, 0x6e, 0x67, 0x61, 0x79, 0x61, 0x6e, 0x3b, 0x74, 0x67, 0x53,
+0x70, 0x61, 0x63, 0x20, 0x6a, 0x69, 0x79, 0x61, 0x78, 0x20, 0x69, 0x79,
+0x61, 0x78, 0x20, 0x73, 0x6e, 0x67, 0x61, 0x79, 0x61, 0x6e, 0x3b, 0x74,
+0x67, 0x52, 0x69, 0x6d, 0x61, 0x20, 0x6a, 0x69, 0x79, 0x61, 0x78, 0x20,
+0x69, 0x79, 0x61, 0x78, 0x20, 0x73, 0x6e, 0x67, 0x61, 0x79, 0x61, 0x6e,
+0x3b, 0x74, 0x67, 0x4d, 0x61, 0x74, 0x61, 0x72, 0x75, 0x20, 0x6a, 0x69,
+0x79, 0x61, 0x78, 0x20, 0x69, 0x79, 0x61, 0x78, 0x20, 0x73, 0x6e, 0x67,
+0x61, 0x79, 0x61, 0x6e, 0x45, 0x6d, 0x70, 0x3b, 0x4b, 0x69, 0x6e, 0x3b,
+0x44, 0x68, 0x61, 0x3b, 0x54, 0x72, 0x75, 0x3b, 0x53, 0x70, 0x61, 0x3b,
+0x52, 0x69, 0x6d, 0x3b, 0x4d, 0x61, 0x74, 0x45, 0x3b, 0x4b, 0x3b, 0x44,
+0x3b, 0x54, 0x3b, 0x53, 0x3b, 0x52, 0x3b, 0x4d, 0x44f, 0x43a, 0x448, 0x4d9,
+0x43c, 0x431, 0x435, 0x3b, 0x434, 0x4af, 0x448, 0x4d9, 0x43c, 0x431, 0x435, 0x3b,
+0x441, 0x438, 0x448, 0x4d9, 0x43c, 0x431, 0x435, 0x3b, 0x447, 0x4d9, 0x440, 0x448,
+0x4d9, 0x43c, 0x431, 0x435, 0x3b, 0x43f, 0x4d9, 0x43d, 0x497, 0x435, 0x448, 0x4d9,
+0x43c, 0x431, 0x435, 0x3b, 0x497, 0x43e, 0x43c, 0x433, 0x430, 0x3b, 0x448, 0x438,
+0x43c, 0x431, 0x4d9, 0x44f, 0x43a, 0x448, 0x2e, 0x3b, 0x434, 0x4af, 0x448, 0x2e,
+0x3b, 0x441, 0x438, 0x448, 0x2e, 0x3b, 0x447, 0x4d9, 0x440, 0x2e, 0x3b, 0x43f,
+0x4d9, 0x43d, 0x497, 0x2e, 0x3b, 0x497, 0x43e, 0x43c, 0x2e, 0x3b, 0x448, 0x438,
+0x43c, 0x2e, 0x42f, 0x3b, 0x414, 0x3b, 0x421, 0x3b, 0x427, 0x3b, 0x41f, 0x3b,
+0x496, 0x3b, 0x428, 0xc06, 0xc26, 0xc3f, 0xc35, 0xc3e, 0xc30, 0xc02, 0x3b, 0xc38,
+0xc4b, 0xc2e, 0xc35, 0xc3e, 0xc30, 0xc02, 0x3b, 0xc2e, 0xc02, 0xc17, 0xc33, 0xc35,
+0xc3e, 0xc30, 0xc02, 0x3b, 0xc2c, 0xc41, 0xc27, 0xc35, 0xc3e, 0xc30, 0xc02, 0x3b,
+0xc17, 0xc41, 0xc30, 0xc41, 0xc35, 0xc3e, 0xc30, 0xc02, 0x3b, 0xc36, 0xc41, 0xc15,
+0xc4d, 0xc30, 0xc35, 0xc3e, 0xc30, 0xc02, 0x3b, 0xc36, 0xc28, 0xc3f, 0xc35, 0xc3e,
+0xc30, 0xc02, 0xc06, 0xc26, 0xc3f, 0x3b, 0xc38, 0xc4b, 0xc2e, 0x3b, 0xc2e, 0xc02,
+0xc17, 0xc33, 0x3b, 0xc2c, 0xc41, 0xc27, 0x3b, 0xc17, 0xc41, 0xc30, 0xc41, 0x3b,
+0xc36, 0xc41, 0xc15, 0xc4d, 0xc30, 0x3b, 0xc36, 0xc28, 0xc3f, 0xc06, 0x3b, 0xc38,
+0xc4b, 0x3b, 0xc2e, 0x3b, 0xc2c, 0xc41, 0x3b, 0xc17, 0xc41, 0x3b, 0xc36, 0xc41,
+0x3b, 0xc36, 0x4e, 0x61, 0x6b, 0x61, 0x65, 0x6a, 0x75, 0x6d, 0x61, 0x3b,
+0x4e, 0x61, 0x6b, 0x61, 0x65, 0x62, 0x61, 0x72, 0x61, 0x73, 0x61, 0x3b,
+0x4e, 0x61, 0x6b, 0x61, 0x61, 0x72, 0x65, 0x3b, 0x4e, 0x61, 0x6b, 0x61,
+0x75, 0x6e, 0x69, 0x3b, 0x4e, 0x61, 0x6b, 0x61, 0x75, 0x6e, 0x67, 0x2019,
+0x6f, 0x6e, 0x3b, 0x4e, 0x61, 0x6b, 0x61, 0x6b, 0x61, 0x6e, 0x79, 0x3b,
+0x4e, 0x61, 0x6b, 0x61, 0x73, 0x61, 0x62, 0x69, 0x74, 0x69, 0x4a, 0x75,
+0x6d, 0x3b, 0x42, 0x61, 0x72, 0x3b, 0x41, 0x61, 0x72, 0x3b, 0x55, 0x6e,
+0x69, 0x3b, 0x55, 0x6e, 0x67, 0x3b, 0x4b, 0x61, 0x6e, 0x3b, 0x53, 0x61,
+0x62, 0x4a, 0x3b, 0x42, 0x3b, 0x41, 0x3b, 0x55, 0x3b, 0x55, 0x3b, 0x4b,
+0x3b, 0x53, 0xe27, 0xe31, 0xe19, 0xe2d, 0xe32, 0xe17, 0xe34, 0xe15, 0xe22, 0xe4c,
+0x3b, 0xe27, 0xe31, 0xe19, 0xe08, 0xe31, 0xe19, 0xe17, 0xe23, 0xe4c, 0x3b, 0xe27,
+0xe31, 0xe19, 0xe2d, 0xe31, 0xe07, 0xe04, 0xe32, 0xe23, 0x3b, 0xe27, 0xe31, 0xe19,
+0xe1e, 0xe38, 0xe18, 0x3b, 0xe27, 0xe31, 0xe19, 0xe1e, 0xe24, 0xe2b, 0xe31, 0xe2a,
+0xe1a, 0xe14, 0xe35, 0x3b, 0xe27, 0xe31, 0xe19, 0xe28, 0xe38, 0xe01, 0xe23, 0xe4c,
+0x3b, 0xe27, 0xe31, 0xe19, 0xe40, 0xe2a, 0xe32, 0xe23, 0xe4c, 0xe2d, 0xe32, 0x2e,
+0x3b, 0xe08, 0x2e, 0x3b, 0xe2d, 0x2e, 0x3b, 0xe1e, 0x2e, 0x3b, 0xe1e, 0xe24,
+0x2e, 0x3b, 0xe28, 0x2e, 0x3b, 0xe2a, 0x2e, 0xe2d, 0xe32, 0x3b, 0xe08, 0x3b,
+0xe2d, 0x3b, 0xe1e, 0x3b, 0xe1e, 0xe24, 0x3b, 0xe28, 0x3b, 0xe2a, 0xf42, 0xf5f,
+0xf60, 0xf0b, 0xf49, 0xf72, 0xf0b, 0xf58, 0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b,
+0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf58, 0xf72,
+0xf42, 0xf0b, 0xf51, 0xf58, 0xf62, 0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf63,
+0xfb7, 0xf42, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf55, 0xf74,
+0xf62, 0xf0b, 0xf56, 0xf74, 0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf54, 0xf0b,
+0xf66, 0xf44, 0xf66, 0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf66, 0xfa4, 0xf7a,
+0xf53, 0xf0b, 0xf54, 0xf0b, 0xf49, 0xf72, 0xf0b, 0xf58, 0xf0b, 0x3b, 0xf5f, 0xfb3,
+0xf0b, 0xf56, 0xf0b, 0x3b, 0xf58, 0xf72, 0xf42, 0xf0b, 0xf51, 0xf58, 0xf62, 0xf0b,
+0x3b, 0xf63, 0xfb7, 0xf42, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf55, 0xf74, 0xf62, 0xf0b,
+0xf56, 0xf74, 0xf0b, 0x3b, 0xf54, 0xf0b, 0xf66, 0xf44, 0xf66, 0xf0b, 0x3b, 0xf66,
+0xfa4, 0xf7a, 0xf53, 0xf0b, 0xf54, 0xf0b, 0xf49, 0xf72, 0x3b, 0xf5f, 0xfb3, 0x3b,
+0xf58, 0xf72, 0xf42, 0x3b, 0xf63, 0xfb7, 0xf42, 0x3b, 0xf55, 0xf74, 0xf62, 0x3b,
+0xf66, 0xf44, 0xf66, 0x3b, 0xf66, 0xfa4, 0xf7a, 0xf53, 0x1230, 0x1295, 0x1260, 0x1275,
+0x20, 0x12d3, 0x1263, 0x12ed, 0x3b, 0x1230, 0x1296, 0x3b, 0x1273, 0x120b, 0x1238, 0x1296,
+0x3b, 0x12a3, 0x1228, 0x122d, 0x1263, 0x12d3, 0x3b, 0x12a8, 0x121a, 0x123d, 0x3b, 0x1305,
+0x121d, 0x12d3, 0x1275, 0x3b, 0x1230, 0x1295, 0x1260, 0x1275, 0x20, 0x1295, 0x12a2, 0x123d,
+0x1230, 0x2f, 0x12d3, 0x3b, 0x1230, 0x1296, 0x3b, 0x1273, 0x120b, 0x1238, 0x3b, 0x12a3,
+0x1228, 0x122d, 0x3b, 0x12a8, 0x121a, 0x123d, 0x3b, 0x1305, 0x121d, 0x12d3, 0x3b, 0x1230,
+0x2f, 0x1295, 0x1230, 0x3b, 0x1230, 0x3b, 0x1273, 0x3b, 0x12a3, 0x3b, 0x12a8, 0x3b,
+0x1305, 0x3b, 0x1230, 0x1230, 0x1295, 0x1260, 0x1275, 0x3b, 0x1230, 0x1291, 0x12ed, 0x3b,
+0x1230, 0x1209, 0x1235, 0x3b, 0x1228, 0x1261, 0x12d5, 0x3b, 0x1213, 0x1219, 0x1235, 0x3b,
+0x12d3, 0x122d, 0x1262, 0x3b, 0x1240, 0x12f3, 0x121d, 0x1230, 0x1295, 0x3b, 0x1230, 0x1291,
+0x3b, 0x1230, 0x1209, 0x3b, 0x1228, 0x1261, 0x3b, 0x1213, 0x1219, 0x3b, 0x12d3, 0x122d,
+0x3b, 0x1240, 0x12f3, 0x1230, 0x3b, 0x1230, 0x3b, 0x1230, 0x3b, 0x1228, 0x3b, 0x1213,
+0x3b, 0x12d3, 0x3b, 0x1240, 0x53, 0x61, 0x6e, 0x64, 0x65, 0x3b, 0x4d, 0x61,
+0x6e, 0x64, 0x65, 0x3b, 0x54, 0x75, 0x6e, 0x64, 0x65, 0x3b, 0x54, 0x72,
+0x69, 0x6e, 0x64, 0x65, 0x3b, 0x46, 0x6f, 0x6e, 0x64, 0x65, 0x3b, 0x46,
+0x72, 0x61, 0x69, 0x64, 0x65, 0x3b, 0x53, 0x61, 0x72, 0x65, 0x72, 0x65,
+0x53, 0x61, 0x6e, 0x3b, 0x4d, 0x61, 0x6e, 0x3b, 0x54, 0x75, 0x6e, 0x3b,
+0x54, 0x72, 0x69, 0x3b, 0x46, 0x6f, 0x6e, 0x3b, 0x46, 0x72, 0x61, 0x3b,
+0x53, 0x61, 0x72, 0x53, 0x101, 0x70, 0x61, 0x74, 0x65, 0x3b, 0x4d, 0x14d,
+0x6e, 0x69, 0x74, 0x65, 0x3b, 0x54, 0x16b, 0x73, 0x69, 0x74, 0x65, 0x3b,
+0x50, 0x75, 0x6c, 0x65, 0x6c, 0x75, 0x6c, 0x75, 0x3b, 0x54, 0x75, 0x2bb,
+0x61, 0x70, 0x75, 0x6c, 0x65, 0x6c, 0x75, 0x6c, 0x75, 0x3b, 0x46, 0x61,
+0x6c, 0x61, 0x69, 0x74, 0x65, 0x3b, 0x54, 0x6f, 0x6b, 0x6f, 0x6e, 0x61,
+0x6b, 0x69, 0x53, 0x101, 0x70, 0x3b, 0x4d, 0x14d, 0x6e, 0x3b, 0x54, 0x16b,
+0x73, 0x3b, 0x50, 0x75, 0x6c, 0x3b, 0x54, 0x75, 0x2bb, 0x61, 0x3b, 0x46,
+0x61, 0x6c, 0x3b, 0x54, 0x6f, 0x6b, 0x53, 0x3b, 0x4d, 0x3b, 0x54, 0x3b,
+0x50, 0x3b, 0x54, 0x3b, 0x46, 0x3b, 0x54, 0x53, 0x6f, 0x6e, 0x74, 0x61,
+0x3b, 0x4d, 0x75, 0x73, 0x75, 0x6d, 0x62, 0x68, 0x75, 0x6e, 0x75, 0x6b,
+0x75, 0x3b, 0x52, 0x61, 0x76, 0x75, 0x6d, 0x62, 0x69, 0x72, 0x68, 0x69,
+0x3b, 0x52, 0x61, 0x76, 0x75, 0x6e, 0x68, 0x61, 0x72, 0x68, 0x75, 0x3b,
+0x52, 0x61, 0x76, 0x75, 0x6d, 0x75, 0x6e, 0x65, 0x3b, 0x52, 0x61, 0x76,
+0x75, 0x6e, 0x74, 0x6c, 0x68, 0x61, 0x6e, 0x75, 0x3b, 0x4d, 0x75, 0x67,
+0x71, 0x69, 0x76, 0x65, 0x6c, 0x61, 0x53, 0x6f, 0x6e, 0x3b, 0x4d, 0x75,
+0x73, 0x3b, 0x42, 0x69, 0x72, 0x3b, 0x48, 0x61, 0x72, 0x3b, 0x4e, 0x65,
+0x3b, 0x54, 0x6c, 0x68, 0x3b, 0x4d, 0x75, 0x67, 0x54, 0x73, 0x68, 0x69,
+0x70, 0x69, 0x3b, 0x4d, 0x6f, 0x73, 0x6f, 0x70, 0x75, 0x6c, 0x6f, 0x67,
+0x6f, 0x3b, 0x4c, 0x61, 0x62, 0x6f, 0x62, 0x65, 0x64, 0x69, 0x3b, 0x4c,
+0x61, 0x62, 0x6f, 0x72, 0x61, 0x72, 0x6f, 0x3b, 0x4c, 0x61, 0x62, 0x6f,
+0x6e, 0x65, 0x3b, 0x4c, 0x61, 0x62, 0x6f, 0x74, 0x6c, 0x68, 0x61, 0x6e,
+0x6f, 0x3b, 0x4d, 0x61, 0x74, 0x6c, 0x68, 0x61, 0x74, 0x73, 0x6f, 0x54,
+0x73, 0x68, 0x3b, 0x4d, 0x6f, 0x73, 0x3b, 0x4c, 0x61, 0x62, 0x62, 0x3b,
+0x4c, 0x61, 0x62, 0x72, 0x3b, 0x4c, 0x61, 0x62, 0x6e, 0x3b, 0x4c, 0x61,
+0x62, 0x74, 0x3b, 0x4d, 0x61, 0x74, 0x50, 0x61, 0x7a, 0x61, 0x72, 0x3b,
+0x50, 0x61, 0x7a, 0x61, 0x72, 0x74, 0x65, 0x73, 0x69, 0x3b, 0x53, 0x61,
+0x6c, 0x131, 0x3b, 0xc7, 0x61, 0x72, 0x15f, 0x61, 0x6d, 0x62, 0x61, 0x3b,
+0x50, 0x65, 0x72, 0x15f, 0x65, 0x6d, 0x62, 0x65, 0x3b, 0x43, 0x75, 0x6d,
+0x61, 0x3b, 0x43, 0x75, 0x6d, 0x61, 0x72, 0x74, 0x65, 0x73, 0x69, 0x50,
+0x61, 0x7a, 0x3b, 0x50, 0x7a, 0x74, 0x3b, 0x53, 0x61, 0x6c, 0x3b, 0xc7,
+0x61, 0x72, 0x3b, 0x50, 0x65, 0x72, 0x3b, 0x43, 0x75, 0x6d, 0x3b, 0x43,
+0x6d, 0x74, 0x50, 0x3b, 0x50, 0x3b, 0x53, 0x3b, 0xc7, 0x3b, 0x50, 0x3b,
+0x43, 0x3b, 0x43, 0xdd, 0x65, 0x6b, 0x15f, 0x65, 0x6e, 0x62, 0x65, 0x3b,
+0x44, 0x75, 0x15f, 0x65, 0x6e, 0x62, 0x65, 0x3b, 0x53, 0x69, 0x15f, 0x65,
+0x6e, 0x62, 0x65, 0x3b, 0xc7, 0x61, 0x72, 0x15f, 0x65, 0x6e, 0x62, 0x65,
+0x3b, 0x50, 0x65, 0x6e, 0x15f, 0x65, 0x6e, 0x62, 0x65, 0x3b, 0x41, 0x6e,
+0x6e, 0x61, 0x3b, 0x15e, 0x65, 0x6e, 0x62, 0x65, 0xfd, 0x65, 0x6b, 0x15f,
+0x65, 0x6e, 0x62, 0x65, 0x3b, 0x64, 0x75, 0x15f, 0x65, 0x6e, 0x62, 0x65,
+0x3b, 0x73, 0x69, 0x15f, 0x65, 0x6e, 0x62, 0x65, 0x3b, 0xe7, 0x61, 0x72,
+0x15f, 0x65, 0x6e, 0x62, 0x65, 0x3b, 0x70, 0x65, 0x6e, 0x15f, 0x65, 0x6e,
+0x62, 0x65, 0x3b, 0x61, 0x6e, 0x6e, 0x61, 0x3b, 0x15f, 0x65, 0x6e, 0x62,
+0x65, 0xdd, 0x65, 0x6b, 0x3b, 0x44, 0x75, 0x15f, 0x3b, 0x53, 0x69, 0x15f,
+0x3b, 0xc7, 0x61, 0x72, 0x3b, 0x50, 0x65, 0x6e, 0x3b, 0x41, 0x6e, 0x6e,
+0x3b, 0x15e, 0x65, 0x6e, 0xfd, 0x65, 0x6b, 0x3b, 0x64, 0x75, 0x15f, 0x3b,
+0x73, 0x69, 0x15f, 0x3b, 0xe7, 0x61, 0x72, 0x3b, 0x70, 0x65, 0x6e, 0x3b,
+0x61, 0x6e, 0x6e, 0x3b, 0x15f, 0x65, 0x6e, 0xdd, 0x3b, 0x44, 0x3b, 0x53,
+0x3b, 0xc7, 0x3b, 0x50, 0x3b, 0x41, 0x3b, 0x15e, 0x4c, 0x61, 0x64, 0x69,
+0x3b, 0x54, 0x61, 0x6e, 0x69, 0x69, 0x3b, 0x54, 0x61, 0x6c, 0x61, 0x74,
+0x61, 0x3b, 0x4c, 0x61, 0x72, 0x62, 0x61, 0x3b, 0x4c, 0x61, 0x6d, 0x69,
+0x74, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x3b, 0x41, 0x73, 0x61, 0x62, 0x61,
+0x74, 0x4c, 0x61, 0x64, 0x3b, 0x54, 0x61, 0x6e, 0x3b, 0x54, 0x61, 0x6c,
+0x3b, 0x4c, 0x61, 0x72, 0x3b, 0x4c, 0x61, 0x6d, 0x3b, 0x4a, 0x75, 0x6d,
+0x3b, 0x41, 0x73, 0x61, 0x43d, 0x435, 0x434, 0x456, 0x43b, 0x44f, 0x3b, 0x43f,
+0x43e, 0x43d, 0x435, 0x434, 0x456, 0x43b, 0x43e, 0x43a, 0x3b, 0x432, 0x456, 0x432,
+0x442, 0x43e, 0x440, 0x43e, 0x43a, 0x3b, 0x441, 0x435, 0x440, 0x435, 0x434, 0x430,
+0x3b, 0x447, 0x435, 0x442, 0x432, 0x435, 0x440, 0x3b, 0x43f, 0x2bc, 0x44f, 0x442,
+0x43d, 0x438, 0x446, 0x44f, 0x3b, 0x441, 0x443, 0x431, 0x43e, 0x442, 0x430, 0x43d,
+0x435, 0x434, 0x456, 0x43b, 0x44e, 0x3b, 0x43f, 0x43e, 0x43d, 0x435, 0x434, 0x456,
+0x43b, 0x43e, 0x43a, 0x3b, 0x432, 0x456, 0x432, 0x442, 0x43e, 0x440, 0x43e, 0x43a,
+0x3b, 0x441, 0x435, 0x440, 0x435, 0x434, 0x443, 0x3b, 0x447, 0x435, 0x442, 0x432,
+0x435, 0x440, 0x3b, 0x43f, 0x2bc, 0x44f, 0x442, 0x43d, 0x438, 0x446, 0x44e, 0x3b,
+0x441, 0x443, 0x431, 0x43e, 0x442, 0x443, 0x6e, 0x6a, 0x65, 0x64, 0x17a, 0x65,
+0x6c, 0x61, 0x3b, 0x70, 0xf3, 0x6e, 0x64, 0x17a, 0x65, 0x6c, 0x61, 0x3b,
+0x77, 0x75, 0x74, 0x6f, 0x72, 0x61, 0x3b, 0x73, 0x72, 0x6a, 0x65, 0x64,
+0x61, 0x3b, 0x161, 0x74, 0x77, 0xf3, 0x72, 0x74, 0x6b, 0x3b, 0x70, 0x6a,
+0x61, 0x74, 0x6b, 0x3b, 0x73, 0x6f, 0x62, 0x6f, 0x74, 0x61, 0x6e, 0x6a,
+0x65, 0x3b, 0x70, 0xf3, 0x6e, 0x3b, 0x77, 0x75, 0x74, 0x3b, 0x73, 0x72,
+0x6a, 0x3b, 0x161, 0x74, 0x77, 0x3b, 0x70, 0x6a, 0x61, 0x3b, 0x73, 0x6f,
+0x62, 0x6e, 0x3b, 0x70, 0x3b, 0x77, 0x3b, 0x73, 0x3b, 0x161, 0x3b, 0x70,
+0x3b, 0x73, 0x627, 0x62a, 0x648, 0x627, 0x631, 0x3b, 0x67e, 0x6cc, 0x631, 0x3b,
+0x645, 0x646, 0x6af, 0x644, 0x3b, 0x628, 0x62f, 0x6be, 0x3b, 0x62c, 0x645, 0x639,
+0x631, 0x627, 0x62a, 0x3b, 0x62c, 0x645, 0x639, 0x6c1, 0x3b, 0x6c1, 0x641, 0x62a,
+0x6c1, 0x64a, 0x6d5, 0x643, 0x634, 0x6d5, 0x646, 0x628, 0x6d5, 0x3b, 0x62f, 0x6c8,
+0x634, 0x6d5, 0x646, 0x628, 0x6d5, 0x3b, 0x633, 0x6d5, 0x64a, 0x634, 0x6d5, 0x646,
+0x628, 0x6d5, 0x3b, 0x686, 0x627, 0x631, 0x634, 0x6d5, 0x646, 0x628, 0x6d5, 0x3b,
+0x67e, 0x6d5, 0x64a, 0x634, 0x6d5, 0x646, 0x628, 0x6d5, 0x3b, 0x62c, 0x6c8, 0x645,
+0x6d5, 0x3b, 0x634, 0x6d5, 0x646, 0x628, 0x6d5, 0x64a, 0x6d5, 0x3b, 0x62f, 0x6c8,
+0x3b, 0x633, 0x6d5, 0x3b, 0x686, 0x627, 0x3b, 0x67e, 0x6d5, 0x3b, 0x62c, 0x6c8,
+0x3b, 0x634, 0x6d5, 0x64a, 0x3b, 0x62f, 0x3b, 0x633, 0x3b, 0x686, 0x3b, 0x67e,
+0x3b, 0x62c, 0x3b, 0x634, 0x79, 0x61, 0x6b, 0x73, 0x68, 0x61, 0x6e, 0x62,
+0x61, 0x3b, 0x64, 0x75, 0x73, 0x68, 0x61, 0x6e, 0x62, 0x61, 0x3b, 0x73,
+0x65, 0x73, 0x68, 0x61, 0x6e, 0x62, 0x61, 0x3b, 0x63, 0x68, 0x6f, 0x72,
+0x73, 0x68, 0x61, 0x6e, 0x62, 0x61, 0x3b, 0x70, 0x61, 0x79, 0x73, 0x68,
+0x61, 0x6e, 0x62, 0x61, 0x3b, 0x6a, 0x75, 0x6d, 0x61, 0x3b, 0x73, 0x68,
+0x61, 0x6e, 0x62, 0x61, 0x59, 0x61, 0x6b, 0x3b, 0x44, 0x75, 0x73, 0x68,
+0x3b, 0x53, 0x65, 0x73, 0x68, 0x3b, 0x43, 0x68, 0x6f, 0x72, 0x3b, 0x50,
+0x61, 0x79, 0x3b, 0x4a, 0x75, 0x6d, 0x3b, 0x53, 0x68, 0x61, 0x6e, 0x59,
+0x3b, 0x44, 0x3b, 0x53, 0x3b, 0x43, 0x3b, 0x50, 0x3b, 0x4a, 0x3b, 0x53,
+0x6cc, 0x2e, 0x3b, 0x62f, 0x2e, 0x3b, 0x633, 0x2e, 0x3b, 0x686, 0x2e, 0x3b,
+0x67e, 0x2e, 0x3b, 0x62c, 0x2e, 0x3b, 0x634, 0x2e, 0x44f, 0x43a, 0x448, 0x430,
+0x43d, 0x431, 0x430, 0x3b, 0x434, 0x443, 0x448, 0x430, 0x43d, 0x431, 0x430, 0x3b,
+0x441, 0x435, 0x448, 0x430, 0x43d, 0x431, 0x430, 0x3b, 0x447, 0x43e, 0x440, 0x448,
+0x430, 0x43d, 0x431, 0x430, 0x3b, 0x43f, 0x430, 0x439, 0x448, 0x430, 0x43d, 0x431,
+0x430, 0x3b, 0x436, 0x443, 0x43c, 0x430, 0x3b, 0x448, 0x430, 0x43d, 0x431, 0x430,
+0x44f, 0x43a, 0x448, 0x3b, 0x434, 0x443, 0x448, 0x3b, 0x441, 0x435, 0x448, 0x3b,
+0x447, 0x43e, 0x440, 0x3b, 0x43f, 0x430, 0x439, 0x3b, 0x436, 0x443, 0x43c, 0x3b,
+0x448, 0x430, 0x43d, 0x42f, 0x3b, 0x414, 0x3b, 0x421, 0x3b, 0x427, 0x3b, 0x41f,
+0x3b, 0x416, 0x3b, 0x428, 0xa55e, 0xa54c, 0xa535, 0x3b, 0xa5f3, 0xa5e1, 0xa609, 0x3b,
+0xa55a, 0xa55e, 0xa55a, 0x3b, 0xa549, 0xa55e, 0xa552, 0x3b, 0xa549, 0xa524, 0xa546, 0xa562,
+0x3b, 0xa549, 0xa524, 0xa540, 0xa56e, 0x3b, 0xa53b, 0xa52c, 0xa533, 0x6c, 0x61, 0x68,
+0x61, 0x64, 0x69, 0x3b, 0x74, 0x25b, 0x25b, 0x6e, 0x25b, 0x25b, 0x3b, 0x74,
+0x61, 0x6c, 0x61, 0x74, 0x61, 0x3b, 0x61, 0x6c, 0x61, 0x62, 0x61, 0x3b,
+0x61, 0x69, 0x6d, 0x69, 0x73, 0x61, 0x3b, 0x61, 0x69, 0x6a, 0x69, 0x6d,
+0x61, 0x3b, 0x73, 0x69, 0x253, 0x69, 0x74, 0x69, 0x53, 0x77, 0x6f, 0x6e,
+0x64, 0x61, 0x68, 0x61, 0x3b, 0x4d, 0x75, 0x73, 0x75, 0x6d, 0x62, 0x75,
+0x6c, 0x75, 0x77, 0x6f, 0x3b, 0x1e3c, 0x61, 0x76, 0x68, 0x75, 0x76, 0x68,
+0x69, 0x6c, 0x69, 0x3b, 0x1e3c, 0x61, 0x76, 0x68, 0x75, 0x72, 0x61, 0x72,
+0x75, 0x3b, 0x1e3c, 0x61, 0x76, 0x68, 0x75, 0x1e4b, 0x61, 0x3b, 0x1e3c, 0x61,
+0x76, 0x68, 0x75, 0x1e71, 0x61, 0x6e, 0x75, 0x3b, 0x4d, 0x75, 0x67, 0x69,
+0x76, 0x68, 0x65, 0x6c, 0x61, 0x53, 0x77, 0x6f, 0x3b, 0x4d, 0x75, 0x73,
+0x3b, 0x56, 0x68, 0x69, 0x3b, 0x52, 0x61, 0x72, 0x3b, 0x1e4a, 0x61, 0x3b,
+0x1e70, 0x61, 0x6e, 0x3b, 0x4d, 0x75, 0x67, 0x43, 0x68, 0x1ee7, 0x20, 0x4e,
+0x68, 0x1ead, 0x74, 0x3b, 0x54, 0x68, 0x1ee9, 0x20, 0x48, 0x61, 0x69, 0x3b,
+0x54, 0x68, 0x1ee9, 0x20, 0x42, 0x61, 0x3b, 0x54, 0x68, 0x1ee9, 0x20, 0x54,
+0x1b0, 0x3b, 0x54, 0x68, 0x1ee9, 0x20, 0x4e, 0x103, 0x6d, 0x3b, 0x54, 0x68,
+0x1ee9, 0x20, 0x53, 0xe1, 0x75, 0x3b, 0x54, 0x68, 0x1ee9, 0x20, 0x42, 0x1ea3,
+0x79, 0x43, 0x4e, 0x3b, 0x54, 0x68, 0x20, 0x32, 0x3b, 0x54, 0x68, 0x20,
+0x33, 0x3b, 0x54, 0x68, 0x20, 0x34, 0x3b, 0x54, 0x68, 0x20, 0x35, 0x3b,
+0x54, 0x68, 0x20, 0x36, 0x3b, 0x54, 0x68, 0x20, 0x37, 0x43, 0x4e, 0x3b,
+0x54, 0x32, 0x3b, 0x54, 0x33, 0x3b, 0x54, 0x34, 0x3b, 0x54, 0x35, 0x3b,
+0x54, 0x36, 0x3b, 0x54, 0x37, 0x73, 0x75, 0x64, 0x65, 0x6c, 0x3b, 0x6d,
+0x75, 0x64, 0x65, 0x6c, 0x3b, 0x74, 0x75, 0x64, 0x65, 0x6c, 0x3b, 0x76,
+0x65, 0x64, 0x65, 0x6c, 0x3b, 0x64, 0xf6, 0x64, 0x65, 0x6c, 0x3b, 0x66,
+0x72, 0x69, 0x64, 0x65, 0x6c, 0x3b, 0x7a, 0xe4, 0x64, 0x65, 0x6c, 0x53,
+0x75, 0x3b, 0x4d, 0x75, 0x3b, 0x54, 0x75, 0x3b, 0x56, 0x65, 0x3b, 0x44,
+0xf6, 0x3b, 0x46, 0x72, 0x3b, 0x5a, 0xe4, 0x73, 0x75, 0x2e, 0x3b, 0x6d,
+0x75, 0x2e, 0x3b, 0x74, 0x75, 0x2e, 0x3b, 0x76, 0x65, 0x2e, 0x3b, 0x64,
+0xf6, 0x2e, 0x3b, 0x66, 0x72, 0x2e, 0x3b, 0x7a, 0xe4, 0x2e, 0x53, 0x3b,
+0x4d, 0x3b, 0x54, 0x3b, 0x56, 0x3b, 0x44, 0x3b, 0x46, 0x3b, 0x5a, 0x53,
+0x75, 0x6e, 0x6e, 0x74, 0x61, 0x67, 0x3b, 0x4d, 0xe4, 0x6e, 0x74, 0x61,
+0x67, 0x3b, 0x5a, 0x69, 0x161, 0x74, 0x61, 0x67, 0x3b, 0x4d, 0x69, 0x74,
+0x74, 0x77, 0x75, 0x10d, 0x3b, 0x46, 0x72, 0xf3, 0x6e, 0x74, 0x61, 0x67,
+0x3b, 0x46, 0x72, 0x69, 0x74, 0x61, 0x67, 0x3b, 0x53, 0x61, 0x6d, 0x161,
+0x74, 0x61, 0x67, 0x53, 0x75, 0x6e, 0x3b, 0x4d, 0xe4, 0x6e, 0x3b, 0x5a,
+0x69, 0x161, 0x3b, 0x4d, 0x69, 0x74, 0x3b, 0x46, 0x72, 0xf3, 0x3b, 0x46,
+0x72, 0x69, 0x3b, 0x53, 0x61, 0x6d, 0x53, 0x3b, 0x4d, 0x3b, 0x5a, 0x3b,
+0x4d, 0x3b, 0x46, 0x3b, 0x46, 0x3b, 0x53, 0x44, 0x79, 0x64, 0x64, 0x20,
+0x53, 0x75, 0x6c, 0x3b, 0x44, 0x79, 0x64, 0x64, 0x20, 0x4c, 0x6c, 0x75,
+0x6e, 0x3b, 0x44, 0x79, 0x64, 0x64, 0x20, 0x4d, 0x61, 0x77, 0x72, 0x74,
+0x68, 0x3b, 0x44, 0x79, 0x64, 0x64, 0x20, 0x4d, 0x65, 0x72, 0x63, 0x68,
+0x65, 0x72, 0x3b, 0x44, 0x79, 0x64, 0x64, 0x20, 0x49, 0x61, 0x75, 0x3b,
+0x44, 0x79, 0x64, 0x64, 0x20, 0x47, 0x77, 0x65, 0x6e, 0x65, 0x72, 0x3b,
+0x44, 0x79, 0x64, 0x64, 0x20, 0x53, 0x61, 0x64, 0x77, 0x72, 0x6e, 0x53,
+0x75, 0x6c, 0x3b, 0x4c, 0x6c, 0x75, 0x6e, 0x3b, 0x4d, 0x61, 0x77, 0x3b,
+0x4d, 0x65, 0x72, 0x3b, 0x49, 0x61, 0x75, 0x3b, 0x47, 0x77, 0x65, 0x3b,
+0x53, 0x61, 0x64, 0x53, 0x75, 0x6c, 0x3b, 0x4c, 0x6c, 0x75, 0x6e, 0x3b,
+0x4d, 0x61, 0x77, 0x3b, 0x4d, 0x65, 0x72, 0x3b, 0x49, 0x61, 0x75, 0x3b,
+0x47, 0x77, 0x65, 0x6e, 0x3b, 0x53, 0x61, 0x64, 0x53, 0x3b, 0x4c, 0x6c,
+0x3b, 0x4d, 0x3b, 0x4d, 0x3b, 0x49, 0x3b, 0x47, 0x3b, 0x53, 0x73, 0x6e,
+0x65, 0x69, 0x6e, 0x3b, 0x6d, 0x6f, 0x61, 0x6e, 0x64, 0x65, 0x69, 0x3b,
+0x74, 0x69, 0x69, 0x73, 0x64, 0x65, 0x69, 0x3b, 0x77, 0x6f, 0x61, 0x6e,
+0x73, 0x64, 0x65, 0x69, 0x3b, 0x74, 0x6f, 0x6e, 0x67, 0x65, 0x72, 0x73,
+0x64, 0x65, 0x69, 0x3b, 0x66, 0x72, 0x65, 0x65, 0x64, 0x3b, 0x73, 0x6e,
+0x65, 0x6f, 0x6e, 0x73, 0x69, 0x3b, 0x6d, 0x6f, 0x3b, 0x74, 0x69, 0x3b,
+0x77, 0x6f, 0x3b, 0x74, 0x6f, 0x3b, 0x66, 0x72, 0x3b, 0x73, 0x6f, 0x12c8,
+0x130b, 0x3b, 0x1233, 0x12ed, 0x1296, 0x3b, 0x121b, 0x1246, 0x1233, 0x129b, 0x3b, 0x12a0,
+0x1229, 0x12cb, 0x3b, 0x1203, 0x1219, 0x1233, 0x3b, 0x12a0, 0x122d, 0x1263, 0x3b, 0x1244,
+0x122b, 0x12c8, 0x3b, 0x1233, 0x3b, 0x121b, 0x3b, 0x12a0, 0x3b, 0x1203, 0x3b, 0x12a0,
+0x3b, 0x1244, 0x44, 0x69, 0x62, 0xe9, 0x65, 0x72, 0x3b, 0x41, 0x6c, 0x74,
+0x69, 0x6e, 0x65, 0x3b, 0x54, 0x61, 0x6c, 0x61, 0x61, 0x74, 0x61, 0x3b,
+0xc0, 0x6c, 0x61, 0x72, 0x62, 0x61, 0x3b, 0x41, 0x6c, 0x78, 0x61, 0x6d,
+0x69, 0x73, 0x3b, 0xc0, 0x6a, 0x6a, 0x75, 0x6d, 0x61, 0x3b, 0x41, 0x73,
+0x65, 0x65, 0x72, 0x44, 0x69, 0x62, 0x3b, 0x41, 0x6c, 0x74, 0x3b, 0x54,
+0x61, 0x6c, 0x3b, 0xc0, 0x6c, 0x61, 0x3b, 0x41, 0x6c, 0x78, 0x3b, 0xc0,
+0x6a, 0x6a, 0x3b, 0x41, 0x73, 0x65, 0x43, 0x61, 0x77, 0x65, 0x3b, 0x4d,
+0x76, 0x75, 0x6c, 0x6f, 0x3b, 0x4c, 0x77, 0x65, 0x73, 0x69, 0x62, 0x69,
+0x6e, 0x69, 0x3b, 0x4c, 0x77, 0x65, 0x73, 0x69, 0x74, 0x68, 0x61, 0x74,
+0x68, 0x75, 0x3b, 0x4c, 0x77, 0x65, 0x73, 0x69, 0x6e, 0x65, 0x3b, 0x4c,
+0x77, 0x65, 0x73, 0x69, 0x68, 0x6c, 0x61, 0x6e, 0x75, 0x3b, 0x4d, 0x67,
+0x71, 0x69, 0x62, 0x65, 0x6c, 0x6f, 0x43, 0x61, 0x77, 0x3b, 0x4d, 0x76,
+0x75, 0x3b, 0x42, 0x69, 0x6e, 0x3b, 0x54, 0x68, 0x61, 0x3b, 0x53, 0x69,
+0x6e, 0x3b, 0x48, 0x6c, 0x61, 0x3b, 0x4d, 0x67, 0x71, 0x43, 0x61, 0x77,
+0x3b, 0x4d, 0x76, 0x75, 0x3b, 0x4c, 0x77, 0x65, 0x73, 0x62, 0x3b, 0x54,
+0x68, 0x61, 0x3b, 0x53, 0x69, 0x6e, 0x3b, 0x48, 0x6c, 0x61, 0x3b, 0x4d,
+0x67, 0x71, 0x43, 0x3b, 0x4d, 0x3b, 0x53, 0x62, 0x3b, 0x53, 0x74, 0x3b,
+0x53, 0x69, 0x6e, 0x3b, 0x48, 0x6c, 0x3b, 0x4d, 0x67, 0x71, 0x43, 0x3b,
+0x4d, 0x3b, 0x53, 0x62, 0x3b, 0x54, 0x68, 0x74, 0x3b, 0x53, 0x69, 0x6e,
+0x3b, 0x48, 0x6c, 0x3b, 0x4d, 0x67, 0x71, 0x73, 0x254, 0x301, 0x6e, 0x64,
+0x69, 0x25b, 0x3b, 0x6d, 0xf3, 0x6e, 0x64, 0x69, 0x65, 0x3b, 0x6d, 0x75,
+0xe1, 0x6e, 0x79, 0xe1, 0x14b, 0x6d, 0xf3, 0x6e, 0x64, 0x69, 0x65, 0x3b,
+0x6d, 0x65, 0x74, 0xfa, 0x6b, 0x70, 0xed, 0xe1, 0x70, 0x25b, 0x3b, 0x6b,
+0xfa, 0x70, 0xe9, 0x6c, 0x69, 0x6d, 0x65, 0x74, 0xfa, 0x6b, 0x70, 0x69,
+0x61, 0x70, 0x25b, 0x3b, 0x66, 0x65, 0x6c, 0xe9, 0x74, 0x65, 0x3b, 0x73,
+0xe9, 0x73, 0x65, 0x6c, 0xe9, 0x73, 0x64, 0x3b, 0x6d, 0x64, 0x3b, 0x6d,
+0x77, 0x3b, 0x65, 0x74, 0x3b, 0x6b, 0x6c, 0x3b, 0x66, 0x6c, 0x3b, 0x73,
+0x73, 0x73, 0x3b, 0x6d, 0x3b, 0x6d, 0x3b, 0x65, 0x3b, 0x6b, 0x3b, 0x66,
+0x3b, 0x73, 0x5d6, 0x5d5, 0x5e0, 0x5d8, 0x5d9, 0x5e7, 0x3b, 0x5de, 0x5d0, 0x5b8,
+0x5e0, 0x5d8, 0x5d9, 0x5e7, 0x3b, 0x5d3, 0x5d9, 0x5e0, 0x5e1, 0x5d8, 0x5d9, 0x5e7,
+0x3b, 0x5de, 0x5d9, 0x5d8, 0x5d5, 0x5d5, 0x5d0, 0x5da, 0x3b, 0x5d3, 0x5d0, 0x5e0,
+0x5e2, 0x5e8, 0x5e9, 0x5d8, 0x5d9, 0x5e7, 0x3b, 0x5e4, 0x5bf, 0x5e8, 0x5f2, 0x5b7,
+0x5d8, 0x5d9, 0x5e7, 0x3b, 0x5e9, 0x5d1, 0x5ea, 0xc0, 0xec, 0x6b, 0xfa, 0x3b,
+0x41, 0x6a, 0xe9, 0x3b, 0xcc, 0x73, 0x1eb9, 0x301, 0x67, 0x75, 0x6e, 0x3b,
+0x1ecc, 0x6a, 0x1ecd, 0x301, 0x72, 0xfa, 0x3b, 0x1ecc, 0x6a, 0x1ecd, 0x301, 0x62,
+0x1ecd, 0x3b, 0x1eb8, 0x74, 0xec, 0x3b, 0xc0, 0x62, 0xe1, 0x6d, 0x1eb9, 0x301,
+0x74, 0x61, 0x1ecc, 0x6a, 0x1ecd, 0x301, 0x20, 0xc0, 0xec, 0x6b, 0xfa, 0x3b,
+0x1ecc, 0x6a, 0x1ecd, 0x301, 0x20, 0x41, 0x6a, 0xe9, 0x3b, 0x1ecc, 0x6a, 0x1ecd,
+0x301, 0x20, 0xcc, 0x73, 0x1eb9, 0x301, 0x67, 0x75, 0x6e, 0x3b, 0x1ecc, 0x6a,
+0x1ecd, 0x301, 0x72, 0xfa, 0x3b, 0x1ecc, 0x6a, 0x1ecd, 0x301, 0x62, 0x1ecd, 0x3b,
+0x1ecc, 0x6a, 0x1ecd, 0x301, 0x20, 0x1eb8, 0x74, 0xec, 0x3b, 0x1ecc, 0x6a, 0x1ecd,
+0x301, 0x20, 0xc0, 0x62, 0xe1, 0x6d, 0x1eb9, 0x301, 0x74, 0x61, 0xc0, 0xec,
+0x6b, 0x3b, 0x41, 0x6a, 0x3b, 0xcc, 0x73, 0x1eb9, 0x301, 0x67, 0x3b, 0x1ecc,
+0x6a, 0x1ecd, 0x301, 0x72, 0x3b, 0x1ecc, 0x6a, 0x1ecd, 0x301, 0x62, 0x3b, 0x1eb8,
+0x74, 0x3b, 0xc0, 0x62, 0xe1, 0x6d, 0xc0, 0x3b, 0x41, 0x3b, 0xcc, 0x3b,
+0x1ecc, 0x3b, 0x1ecc, 0x3b, 0x1eb8, 0x3b, 0xc0, 0xc0, 0xec, 0x6b, 0xfa, 0x3b,
+0x41, 0x6a, 0xe9, 0x3b, 0xcc, 0x73, 0x25b, 0x301, 0x67, 0x75, 0x6e, 0x3b,
+0x186, 0x6a, 0x254, 0x301, 0x72, 0xfa, 0x3b, 0x186, 0x6a, 0x254, 0x301, 0x62,
+0x254, 0x3b, 0x190, 0x74, 0xec, 0x3b, 0xc0, 0x62, 0xe1, 0x6d, 0x25b, 0x301,
+0x74, 0x61, 0x186, 0x6a, 0x254, 0x301, 0x20, 0xc0, 0xec, 0x6b, 0xfa, 0x3b,
+0x186, 0x6a, 0x254, 0x301, 0x20, 0x41, 0x6a, 0xe9, 0x3b, 0x186, 0x6a, 0x254,
+0x301, 0x20, 0xcc, 0x73, 0x25b, 0x301, 0x67, 0x75, 0x6e, 0x3b, 0x186, 0x6a,
+0x254, 0x301, 0x72, 0xfa, 0x3b, 0x186, 0x6a, 0x254, 0x301, 0x62, 0x254, 0x3b,
+0x186, 0x6a, 0x254, 0x301, 0x20, 0x190, 0x74, 0xec, 0x3b, 0x186, 0x6a, 0x254,
+0x301, 0x20, 0xc0, 0x62, 0xe1, 0x6d, 0x25b, 0x301, 0x74, 0x61, 0xc0, 0xec,
+0x6b, 0x3b, 0x41, 0x6a, 0x3b, 0xcc, 0x73, 0x25b, 0x301, 0x67, 0x3b, 0x186,
+0x6a, 0x254, 0x301, 0x72, 0x3b, 0x186, 0x6a, 0x254, 0x301, 0x62, 0x3b, 0x190,
+0x74, 0x3b, 0xc0, 0x62, 0xe1, 0x6d, 0xc0, 0x3b, 0x41, 0x3b, 0xcc, 0x3b,
+0x186, 0x3b, 0x186, 0x3b, 0x190, 0x3b, 0xc0, 0x41, 0x6c, 0x68, 0x61, 0x64,
+0x69, 0x3b, 0x41, 0x74, 0x69, 0x6e, 0x6e, 0x69, 0x3b, 0x41, 0x74, 0x61,
+0x6c, 0x61, 0x61, 0x74, 0x61, 0x3b, 0x41, 0x6c, 0x61, 0x72, 0x62, 0x61,
+0x3b, 0x41, 0x6c, 0x68, 0x61, 0x6d, 0x69, 0x73, 0x69, 0x3b, 0x41, 0x6c,
+0x7a, 0x75, 0x6d, 0x61, 0x3b, 0x41, 0x73, 0x69, 0x62, 0x74, 0x69, 0x48,
+0x3b, 0x54, 0x3b, 0x54, 0x3b, 0x4c, 0x3b, 0x4d, 0x3b, 0x5a, 0x3b, 0x53,
+0x6e, 0x67, 0x6f, 0x65, 0x6e, 0x7a, 0x73, 0x69, 0x6e, 0x67, 0x68, 0x67,
+0x69, 0x7a, 0x3b, 0x73, 0x69, 0x6e, 0x67, 0x68, 0x67, 0x69, 0x7a, 0x69,
+0x74, 0x3b, 0x73, 0x69, 0x6e, 0x67, 0x68, 0x67, 0x69, 0x7a, 0x6e, 0x67,
+0x65, 0x69, 0x68, 0x3b, 0x73, 0x69, 0x6e, 0x67, 0x68, 0x67, 0x69, 0x7a,
+0x73, 0x61, 0x6d, 0x3b, 0x73, 0x69, 0x6e, 0x67, 0x68, 0x67, 0x69, 0x7a,
+0x73, 0x65, 0x69, 0x71, 0x3b, 0x73, 0x69, 0x6e, 0x67, 0x68, 0x67, 0x69,
+0x7a, 0x68, 0x61, 0x6a, 0x3b, 0x73, 0x69, 0x6e, 0x67, 0x68, 0x67, 0x69,
+0x7a, 0x72, 0x6f, 0x65, 0x6b, 0x49, 0x53, 0x6f, 0x6e, 0x74, 0x6f, 0x3b,
+0x55, 0x4d, 0x73, 0x6f, 0x6d, 0x62, 0x75, 0x6c, 0x75, 0x6b, 0x6f, 0x3b,
+0x55, 0x4c, 0x77, 0x65, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x3b, 0x55,
+0x4c, 0x77, 0x65, 0x73, 0x69, 0x74, 0x68, 0x61, 0x74, 0x68, 0x75, 0x3b,
+0x55, 0x4c, 0x77, 0x65, 0x73, 0x69, 0x6e, 0x65, 0x3b, 0x55, 0x4c, 0x77,
+0x65, 0x73, 0x69, 0x68, 0x6c, 0x61, 0x6e, 0x75, 0x3b, 0x55, 0x4d, 0x67,
+0x71, 0x69, 0x62, 0x65, 0x6c, 0x6f, 0x53, 0x6f, 0x6e, 0x3b, 0x4d, 0x73,
+0x6f, 0x3b, 0x42, 0x69, 0x6c, 0x3b, 0x54, 0x68, 0x61, 0x3b, 0x53, 0x69,
+0x6e, 0x3b, 0x48, 0x6c, 0x61, 0x3b, 0x4d, 0x67, 0x71, 0x53, 0x3b, 0x4d,
+0x3b, 0x42, 0x3b, 0x54, 0x3b, 0x53, 0x3b, 0x48, 0x3b, 0x4d, 0x6e, 0x75,
+0x6d, 0x129, 0x67, 0x67, 0x75, 0x3b, 0x70, 0x69, 0x72, 0x2d, 0x6b, 0x75,
+0x72, 0xe3, 0x2d, 0x68, 0xe1, 0x3b, 0x72, 0xe9, 0x67, 0x72, 0x65, 0x2d,
+0x6b, 0x75, 0x72, 0xe3, 0x2d, 0x68, 0xe1, 0x3b, 0x74, 0x1ebd, 0x67, 0x74,
+0x169, 0x2d, 0x6b, 0x75, 0x72, 0xe3, 0x2d, 0x68, 0xe1, 0x3b, 0x76, 0x1ebd,
+0x6e, 0x68, 0x6b, 0xe3, 0x67, 0x72, 0x61, 0x2d, 0x6b, 0x75, 0x72, 0xe3,
+0x2d, 0x68, 0xe1, 0x3b, 0x70, 0xe9, 0x6e, 0x6b, 0x61, 0x72, 0x2d, 0x6b,
+0x75, 0x72, 0xe3, 0x2d, 0x68, 0xe1, 0x3b, 0x73, 0x61, 0x76, 0x6e, 0x75,
+0x6e, 0x75, 0x6d, 0x2e, 0x3b, 0x70, 0x69, 0x72, 0x2e, 0x3b, 0x72, 0xe9,
+0x67, 0x2e, 0x3b, 0x74, 0x1ebd, 0x67, 0x2e, 0x3b, 0x76, 0x1ebd, 0x6e, 0x2e,
+0x3b, 0x70, 0xe9, 0x6e, 0x2e, 0x3b, 0x73, 0x61, 0x76, 0x2e, 0x4e, 0x2e,
+0x3b, 0x50, 0x2e, 0x3b, 0x52, 0x2e, 0x3b, 0x54, 0x2e, 0x3b, 0x56, 0x2e,
+0x3b, 0x50, 0x2e, 0x3b, 0x53, 0x2e, 0x6d, 0x69, 0x74, 0x75, 0xfa, 0x3b,
+0x6d, 0x75, 0x72, 0x61, 0x6b, 0x69, 0x70, 0xed, 0x3b, 0x6d, 0x75, 0x72,
+0x61, 0x6b, 0xed, 0x2d, 0x6d, 0x75, 0x6b, 0x169, 0x69, 0x3b, 0x6d, 0x75,
+0x72, 0x61, 0x6b, 0xed, 0x2d, 0x6d, 0x75, 0x73, 0x61, 0x70, 0xed, 0x72,
+0x69, 0x3b, 0x73, 0x75, 0x70, 0x61, 0x70, 0xe1, 0x3b, 0x79, 0x75, 0x6b,
+0x75, 0x61, 0x6b, 0xfa, 0x3b, 0x73, 0x61, 0x75, 0x72, 0xfa, 0x6d, 0x69,
+0x74, 0x3b, 0x6d, 0x75, 0x72, 0x3b, 0x6d, 0x6d, 0x6b, 0x3b, 0x6d, 0x6d,
+0x73, 0x3b, 0x73, 0x75, 0x70, 0x3b, 0x79, 0x75, 0x6b, 0x3b, 0x73, 0x61,
+0x75, 0x4d, 0x3b, 0x4d, 0x3b, 0x4d, 0x3b, 0x4d, 0x3b, 0x53, 0x3b, 0x59,
+0x3b, 0x53, 0x910, 0x924, 0x935, 0x93e, 0x930, 0x3b, 0x938, 0x94b, 0x92e, 0x935,
+0x93e, 0x930, 0x3b, 0x92e, 0x902, 0x917, 0x932, 0x935, 0x93e, 0x930, 0x3b, 0x92c,
+0x941, 0x927, 0x935, 0x93e, 0x930, 0x3b, 0x92c, 0x943, 0x939, 0x938, 0x94d, 0x92a,
+0x924, 0x935, 0x93e, 0x930, 0x3b, 0x936, 0x941, 0x915, 0x94d, 0x930, 0x935, 0x93e,
+0x930, 0x3b, 0x936, 0x928, 0x93f, 0x935, 0x93e, 0x930, 0x53, 0xf6, 0x6e, 0x64,
+0x61, 0x69, 0x3b, 0x4d, 0x75, 0x6e, 0x64, 0x61, 0x69, 0x3b, 0x54, 0x65,
+0x69, 0x73, 0x64, 0x61, 0x69, 0x3b, 0x57, 0x65, 0x65, 0x64, 0x65, 0x6e,
+0x73, 0x64, 0x61, 0x69, 0x3b, 0x54, 0xfc, 0xfc, 0x72, 0x73, 0x64, 0x61,
+0x69, 0x3b, 0x46, 0x72, 0x65, 0x69, 0x64, 0x61, 0x69, 0x3b, 0x53, 0x61,
+0x6e, 0x69, 0x6e, 0x6a, 0x53, 0xf6, 0x6e, 0x3b, 0x4d, 0x75, 0x6e, 0x3b,
+0x54, 0x65, 0x69, 0x3b, 0x57, 0x65, 0x64, 0x3b, 0x54, 0xfc, 0x72, 0x3b,
+0x46, 0x72, 0x65, 0x3b, 0x53, 0x61, 0x6e, 0x73, 0x75, 0x6e, 0x6f, 0x20,
+0x65, 0x73, 0x75, 0x6e, 0x20, 0x23, 0x37, 0x3b, 0x73, 0x75, 0x6e, 0x6f,
+0x20, 0x65, 0x73, 0x75, 0x6e, 0x20, 0x23, 0x31, 0x3b, 0x73, 0x75, 0x6e,
+0x6f, 0x20, 0x65, 0x73, 0x75, 0x6e, 0x20, 0x23, 0x32, 0x3b, 0x73, 0x75,
+0x6e, 0x6f, 0x20, 0x65, 0x73, 0x75, 0x6e, 0x20, 0x23, 0x33, 0x3b, 0x73,
+0x75, 0x6e, 0x6f, 0x20, 0x65, 0x73, 0x75, 0x6e, 0x20, 0x23, 0x34, 0x3b,
+0x73, 0x75, 0x6e, 0x6f, 0x20, 0x65, 0x73, 0x75, 0x6e, 0x20, 0x23, 0x35,
+0x3b, 0x73, 0x75, 0x6e, 0x6f, 0x20, 0x65, 0x73, 0x75, 0x6e, 0x20, 0x23,
+0x36, 0x53, 0x61, 0x6e, 0x64, 0x65, 0x3b, 0x4d, 0x61, 0x6e, 0x64, 0x65,
+0x3b, 0x54, 0x69, 0x75, 0x73, 0x64, 0x65, 0x3b, 0x57, 0x65, 0x6e, 0x65,
+0x73, 0x64, 0x65, 0x3b, 0x54, 0x6f, 0x73, 0x64, 0x65, 0x3b, 0x46, 0x72,
+0x61, 0x65, 0x64, 0x65, 0x3b, 0x53, 0x61, 0x74, 0x61, 0x64, 0x65, 0x6cc,
+0x6a9, 0x634, 0x645, 0x628, 0x647, 0x3b, 0x62f, 0x648, 0x634, 0x645, 0x628, 0x647,
+0x3b, 0x633, 0x626, 0x6cc, 0x634, 0x645, 0x628, 0x647, 0x3b, 0x686, 0x627, 0x631,
+0x634, 0x645, 0x628, 0x647, 0x3b, 0x67e, 0x646, 0x686, 0x634, 0x645, 0x628, 0x647,
+0x3b, 0x62c, 0x645, 0x647, 0x3b, 0x634, 0x645, 0x628, 0x647, 0x6cc, 0x6a9, 0x3b,
+0x62f, 0x648, 0x3b, 0x633, 0x626, 0x6d2, 0x3b, 0x686, 0x627, 0x631, 0x3b, 0x67e,
+0x646, 0x686, 0x3b, 0x62c, 0x645, 0x647, 0x3b, 0x634, 0x645, 0x59, 0x61, 0x6b,
+0x73, 0x68, 0x61, 0x6d, 0x62, 0x65, 0x68, 0x3b, 0x44, 0x6f, 0x73, 0x68,
+0x61, 0x6d, 0x62, 0x65, 0x68, 0x3b, 0x53, 0x61, 0x79, 0x73, 0x68, 0x61,
+0x6d, 0x62, 0x65, 0x68, 0x3b, 0x43, 0x68, 0xe1, 0x72, 0x73, 0x68, 0x61,
+0x6d, 0x62, 0x65, 0x68, 0x3b, 0x50, 0x61, 0x6e, 0x63, 0x68, 0x73, 0x68,
+0x61, 0x6d, 0x62, 0x65, 0x68, 0x3b, 0x4a, 0x6f, 0x6d, 0x61, 0x68, 0x3b,
+0x53, 0x68, 0x61, 0x6d, 0x62, 0x65, 0x68, 0x59, 0x61, 0x6b, 0x3b, 0x44,
+0x6f, 0x3b, 0x53, 0x61, 0x79, 0x3b, 0x43, 0x68, 0xe1, 0x3b, 0x50, 0x61,
+0x6e, 0x3b, 0x4a, 0x6f, 0x6d, 0x3b, 0x53, 0x68, 0x61, 0x64, 0x6f, 0x6d,
+0x65, 0x6e, 0x65, 0x67, 0x61, 0x3b, 0x6c, 0x75, 0x6e, 0x65, 0x73, 0x64,
+0xec, 0x3b, 0x6d, 0xe4, 0x74, 0x65, 0x73, 0x64, 0xec, 0x3b, 0x6d, 0xe4,
+0x63, 0x6f, 0x72, 0x64, 0xec, 0x3b, 0x7a, 0x65, 0x75, 0x67, 0x67, 0x69,
+0x61, 0x3b, 0x76, 0x65, 0x6e, 0x61, 0x72, 0x64, 0xec, 0x3b, 0x73, 0x61,
+0x62, 0x62, 0x6f, 0x64, 0x6f, 0x6d, 0x2e, 0x3b, 0x6c, 0x75, 0x6e, 0x2e,
+0x3b, 0x6d, 0xe4, 0x74, 0x2e, 0x3b, 0x6d, 0xe4, 0x63, 0x2e, 0x3b, 0x7a,
+0x65, 0x75, 0x2e, 0x3b, 0x76, 0x65, 0x6e, 0x2e, 0x3b, 0x73, 0x61, 0x62,
+0x2e, 0x44, 0x3b, 0x4c, 0x3b, 0x4d, 0x3b, 0x4d, 0x3b, 0x5a, 0x3b, 0x56,
+0x3b, 0x53, 0x627, 0x6cc, 0x6a9, 0x634, 0x6cc, 0x645, 0x6d2, 0x3b, 0x62f, 0x64f,
+0x648, 0x634, 0x6cc, 0x645, 0x6d2, 0x3b, 0x6af, 0x6be, 0x646, 0x20, 0x622, 0x646,
+0x6af, 0x627, 0x3b, 0x686, 0x627, 0x631, 0x634, 0x6cc, 0x645, 0x6d2, 0x3b, 0x67e,
+0x64e, 0x626, 0x20, 0x634, 0x6cc, 0x645, 0x6d2, 0x3b, 0x634, 0x64f, 0x648, 0x6af,
+0x627, 0x631, 0x3b, 0x644, 0x64e, 0x648, 0x20, 0x622, 0x646, 0x6af, 0x627, 0x627,
+0x3b, 0x62f, 0x3b, 0x6af, 0x3b, 0x686, 0x3b, 0x67e, 0x3b, 0x634, 0x3b, 0x644,
+0x61, 0x6c, 0x61, 0x68, 0x61, 0x256, 0x269, 0x3b, 0x61, 0x256, 0x269, 0x74,
+0x25b, 0x6e, 0x25b, 0x25b, 0x3b, 0x61, 0x74, 0x61, 0x6c, 0x61, 0x61, 0x74,
+0x61, 0x3b, 0x61, 0x6c, 0x61, 0x61, 0x72, 0x62, 0x61, 0x3b, 0x61, 0x6c,
+0x61, 0x61, 0x6d, 0x269, 0x73, 0x68, 0x269, 0x3b, 0x61, 0x72, 0x269, 0x73,
+0x1dd, 0x6d, 0x61, 0x3b, 0x61, 0x73, 0x69, 0x69, 0x62, 0x69, 0x61, 0x6c,
+0x61, 0x68, 0x3b, 0x61, 0x256, 0x269, 0x74, 0x3b, 0x61, 0x74, 0x61, 0x6c,
+0x3b, 0x61, 0x6c, 0x61, 0x72, 0x3b, 0x61, 0x6c, 0x61, 0x6d, 0x3b, 0x61,
+0x72, 0x269, 0x73, 0x3b, 0x61, 0x73, 0x69, 0x62, 0x6c, 0x68, 0x3b, 0x256,
+0x74, 0x3b, 0x74, 0x6c, 0x3b, 0x6c, 0x72, 0x3b, 0x6c, 0x6d, 0x3b, 0x72,
+0x73, 0x3b, 0x73, 0x62, 0x924, 0x94b, 0x906, 0x930, 0x3b, 0x938, 0x94b, 0x906,
+0x930, 0x3b, 0x92e, 0x902, 0x917, 0x932, 0x935, 0x93e, 0x930, 0x3b, 0x92c, 0x941,
+0x927, 0x935, 0x93e, 0x930, 0x3b, 0x935, 0x940, 0x930, 0x935, 0x93e, 0x930, 0x3b,
+0x936, 0x941, 0x915, 0x94d, 0x915, 0x930, 0x935, 0x93e, 0x930, 0x3b, 0x936, 0x928,
+0x93f, 0x91a, 0x94d, 0x91a, 0x930, 0x935, 0x93e, 0x930, 0x924, 0x94b, 0x906, 0x930,
+0x3b, 0x938, 0x94b, 0x906, 0x930, 0x3b, 0x92e, 0x902, 0x917, 0x932, 0x3b, 0x92c,
+0x941, 0x927, 0x3b, 0x935, 0x940, 0x930, 0x3b, 0x936, 0x941, 0x915, 0x94d, 0x915,
+0x930, 0x3b, 0x936, 0x928, 0x93f, 0x924, 0x3b, 0x938, 0x94b, 0x3b, 0x92e, 0x902,
+0x3b, 0x92c, 0x941, 0x3b, 0x935, 0x940, 0x3b, 0x936, 0x941, 0x3b, 0x936, 0x64,
+0x6f, 0x6d, 0xe9, 0x6e, 0x65, 0x67, 0x61, 0x3b, 0x6c, 0x75, 0x6e, 0x69,
+0x3b, 0x6d, 0x61, 0x72, 0x74, 0x69, 0x3b, 0x6d, 0xe8, 0x72, 0x63, 0x6f,
+0x72, 0x65, 0x3b, 0x7a, 0x6f, 0x62, 0x61, 0x3b, 0x76, 0xe8, 0x6e, 0x61,
+0x72, 0x65, 0x3b, 0x73, 0x61, 0x62, 0x6f, 0x64, 0x6f, 0x6d, 0x3b, 0x6c,
+0x75, 0x6e, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x6d, 0x65, 0x72, 0x3b, 0x7a,
+0x6f, 0x62, 0x3b, 0x76, 0xe8, 0x6e, 0x3b, 0x73, 0x61, 0x62
};
-static const char16_t byte_unit_data[] = {
-0x62, 0x79, 0x74, 0x65, 0x73, 0x6b, 0x42, 0x3b, 0x4d, 0x42, 0x3b, 0x47, 0x42, 0x3b, 0x54, 0x42, 0x3b, 0x50, 0x42, 0x3b,
-0x45, 0x42, 0x4b, 0x69, 0x42, 0x3b, 0x4d, 0x69, 0x42, 0x3b, 0x47, 0x69, 0x42, 0x3b, 0x54, 0x69, 0x42, 0x3b, 0x50, 0x69,
-0x42, 0x3b, 0x45, 0x69, 0x42, 0x67, 0x72, 0x65, 0x65, 0x70, 0x62, 0x61, 0x6a, 0x74, 0x1263, 0x12ed, 0x1275, 0x12aa, 0x1263, 0x3b,
-0x121c, 0x130b, 0x1263, 0x12ed, 0x1275, 0x3b, 0x130a, 0x1263, 0x3b, 0x1274, 0x122b, 0x1263, 0x12ed, 0x1275, 0x3b, 0x1354, 0x1263, 0x3b, 0x45, 0x42,
-0x628, 0x627, 0x64a, 0x62a, 0x643, 0x64a, 0x644, 0x648, 0x628, 0x627, 0x64a, 0x62a, 0x3b, 0x645, 0x2e, 0x628, 0x3b, 0x63a, 0x2e, 0x628,
-0x3b, 0x62a, 0x64a, 0x631, 0x627, 0x628, 0x627, 0x64a, 0x62a, 0x3b, 0x628, 0x64a, 0x62a, 0x627, 0x628, 0x627, 0x64a, 0x62a, 0x3b, 0x45,
-0x42, 0x562, 0x561, 0x575, 0x569, 0x565, 0x580, 0x56f, 0x532, 0x3b, 0x544, 0x532, 0x3b, 0x533, 0x532, 0x3b, 0x54f, 0x532, 0x3b, 0x54a,
-0x532, 0x3b, 0x45, 0x42, 0x9ac, 0x9be, 0x987, 0x99f, 0x995, 0x9bf, 0x983, 0x20, 0x9ac, 0x9be, 0x983, 0x3b, 0x9ae, 0x9c7, 0x983, 0x20,
-0x9ac, 0x9be, 0x983, 0x3b, 0x997, 0x9bf, 0x983, 0x20, 0x9ac, 0x9be, 0x983, 0x3b, 0x99f, 0x9c7, 0x983, 0x20, 0x9ac, 0x9be, 0x983, 0x3b,
-0x50, 0x42, 0x3b, 0x45, 0x42, 0x62, 0x61, 0x79, 0x74, 0x62, 0x79, 0x74, 0x65, 0x2d, 0x61, 0x6b, 0x431, 0x430, 0x439, 0x442,
-0x44b, 0x41a, 0x411, 0x3b, 0x41c, 0x411, 0x3b, 0x413, 0x411, 0x3b, 0x422, 0x411, 0x3b, 0x41f, 0x411, 0x3b, 0x45, 0x42, 0x62, 0x61,
-0x6a, 0x74, 0x6f, 0x76, 0x69, 0x6f, 0x6b, 0x74, 0x65, 0x64, 0x6f, 0xf9, 0x6b, 0x6f, 0x3b, 0x4d, 0x6f, 0x3b, 0x47, 0x6f,
-0x3b, 0x54, 0x6f, 0x3b, 0x50, 0x6f, 0x3b, 0x45, 0x6f, 0x4b, 0x69, 0x6f, 0x3b, 0x4d, 0x69, 0x6f, 0x3b, 0x47, 0x69, 0x6f,
-0x3b, 0x54, 0x69, 0x6f, 0x3b, 0x50, 0x69, 0x6f, 0x3b, 0x45, 0x69, 0x6f, 0x431, 0x430, 0x439, 0x442, 0x43e, 0x432, 0x435, 0x1018,
-0x102d, 0x102f, 0x1000, 0x103a, 0x6d, 0x67, 0x61, 0x20, 0x62, 0x79, 0x74, 0x65, 0xd804, 0xdd1d, 0xd804, 0xdd2d, 0xd804, 0xdd16, 0xd804, 0xdd34,
-0x13d7, 0x13d3, 0x13cd, 0x13a6, 0x13b5, 0x13a9, 0x5b57, 0x8282, 0x4f4d, 0x5143, 0x7d44, 0x62, 0x61, 0x6a, 0x74, 0x79, 0x62, 0x61, 0x6a, 0x74,
-0x6f, 0x6a, 0x62, 0x61, 0x69, 0x64, 0x69, 0x64, 0x62, 0xfd, 0x74, 0x74, 0x61, 0x76, 0x75, 0x74, 0x6b, 0x74, 0x3b, 0x4d,
-0x74, 0x3b, 0x47, 0x74, 0x3b, 0x54, 0x74, 0x3b, 0x50, 0x74, 0x3b, 0x45, 0x74, 0x4b, 0x69, 0x74, 0x3b, 0x4d, 0x69, 0x74,
-0x3b, 0x47, 0x69, 0x74, 0x3b, 0x54, 0x69, 0x74, 0x3b, 0x50, 0x69, 0x74, 0x3b, 0x45, 0x69, 0x74, 0x6f, 0x63, 0x74, 0x65,
-0x74, 0x73, 0xd83a, 0xdd36, 0xd83a, 0xdd2b, 0xd83a, 0xdd45, 0xd83a, 0xdd3c, 0xd83a, 0xdd46, 0xd83a, 0xdd2d, 0xd83a, 0xdd33, 0xd83a, 0xdd14, 0x3b, 0xd83a,
-0xdd03, 0xd83a, 0xdd14, 0x3b, 0xd83a, 0xdd18, 0xd83a, 0xdd14, 0x3b, 0xd83a, 0xdd1a, 0xd83a, 0xdd14, 0x3b, 0xd83a, 0xdd06, 0xd83a, 0xdd14, 0x3b, 0x45,
-0x42, 0x62, 0x61, 0x69, 0x64, 0x68, 0x74, 0x10d1, 0x10d0, 0x10d8, 0x10e2, 0x10d8, 0x10d9, 0x10d1, 0x10d0, 0x10d8, 0x10e2, 0x10d8, 0x3b, 0x4d,
-0x42, 0x3b, 0x47, 0x42, 0x3b, 0x10e2, 0x10d1, 0x10d0, 0x10d8, 0x10e2, 0x10d8, 0x3b, 0x10de, 0x10d1, 0x10d0, 0x10d8, 0x10e2, 0x10d8, 0x3b, 0x45,
-0x42, 0x42, 0x79, 0x74, 0x65, 0x73, 0xaac, 0xabe, 0xa87, 0xa9f, 0x6b, 0x42, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x4d, 0x42, 0x20,
-0x7b, 0x30, 0x7d, 0x3b, 0x47, 0x42, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x54, 0x42, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x50, 0x42,
-0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x45, 0x42, 0x20, 0x7b, 0x30, 0x7d, 0x4b, 0x69, 0x42, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x4d,
-0x69, 0x42, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x47, 0x69, 0x42, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x54, 0x69, 0x42, 0x20, 0x7b,
-0x30, 0x7d, 0x3b, 0x50, 0x69, 0x42, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x45, 0x69, 0x42, 0x20, 0x7b, 0x30, 0x7d, 0x5d1, 0x5d9,
-0x5d9, 0x5d8, 0x92c, 0x93e, 0x907, 0x91f, 0x62, 0xe1, 0x6a, 0x74, 0x62, 0xe6, 0x74, 0x69, 0x62, 0x65, 0x61, 0x72, 0x74, 0x61,
-0x30d0, 0x30a4, 0x30c8, 0x4b, 0x42, 0x3b, 0x4d, 0x42, 0x3b, 0x47, 0x42, 0x3b, 0x54, 0x42, 0x3b, 0x50, 0x42, 0x3b, 0x45, 0x42,
-0x62, 0x69, 0x74, 0x65, 0x61, 0x1e6d, 0x61, 0x6d, 0x1e0d, 0x61, 0x6e, 0x6b, 0x41, 0x1e6c, 0x3b, 0x4d, 0x41, 0x1e6c, 0x3b, 0x47,
-0x41, 0x1e6c, 0x3b, 0x54, 0x41, 0x1e6c, 0x3b, 0x50, 0x42, 0x3b, 0x45, 0x42, 0xcac, 0xcc8, 0xc9f, 0xccd, 0x200c, 0xc97, 0xcb3, 0xcc1,
-0xc95, 0xcbf, 0x2e, 0xcac, 0xcc8, 0x2e, 0x3b, 0xcae, 0xcc6, 0x2e, 0xcac, 0xcc8, 0x2e, 0x3b, 0xc97, 0xcbf, 0x2e, 0xcac, 0xcc8, 0x2e,
-0x3b, 0xc9f, 0xcc6, 0x2e, 0xcac, 0xcc8, 0x2e, 0x3b, 0xcaa, 0xcc6, 0xcac, 0xcc8, 0x3b, 0x45, 0x42, 0x43a, 0x411, 0x3b, 0x4d, 0x411,
-0x3b, 0x413, 0x411, 0x3b, 0x54, 0x411, 0x3b, 0x41f, 0x411, 0x3b, 0x45, 0x411, 0x4b, 0x69, 0x411, 0x3b, 0x4d, 0x69, 0x411, 0x3b,
-0x47, 0x69, 0x411, 0x3b, 0x54, 0x69, 0x411, 0x3b, 0x50, 0x69, 0x411, 0x3b, 0x45, 0x69, 0x411, 0x1794, 0x17c3, 0x92c, 0x93e, 0x92f,
-0x91f, 0xbc14, 0xc774, 0xd2b8, 0x43a, 0x411, 0x3b, 0x41c, 0x411, 0x3b, 0x413, 0x411, 0x3b, 0x422, 0x411, 0x3b, 0x41f, 0x442, 0x431, 0x3b,
-0x45, 0x42, 0x62, 0x61, 0x69, 0x74, 0x69, 0x62, 0x61, 0x69, 0x74, 0x61, 0x69, 0x431, 0x430, 0x458, 0x442, 0x438, 0xd2c, 0xd48,
-0xd31, 0xd4d, 0xd31, 0xd4d, 0xd15, 0xd46, 0xd2c, 0xd3f, 0x3b, 0xd0e, 0xd02, 0xd2c, 0xd3f, 0x3b, 0xd1c, 0xd3f, 0xd2c, 0xd3f, 0x3b, 0xd1f,
-0xd3f, 0xd2c, 0xd3f, 0x3b, 0xd2a, 0xd3f, 0xd2c, 0xd3f, 0x3b, 0x45, 0x42, 0x628, 0x627, 0x6cc, 0x62a, 0x6a9, 0x6cc, 0x644, 0x648, 0x628,
-0x627, 0x6cc, 0x62a, 0x3b, 0x645, 0x6af, 0x627, 0x628, 0x627, 0x6cc, 0x62a, 0x3b, 0x6af, 0x6cc, 0x6af, 0x627, 0x628, 0x627, 0x6cc, 0x62a,
-0x3b, 0x62a, 0x631, 0x627, 0x628, 0x627, 0x6cc, 0x62a, 0x3b, 0x50, 0x42, 0x3b, 0x45, 0x42, 0x43a, 0x411, 0x3b, 0x41c, 0x411, 0x3b,
-0x413, 0x411, 0x3b, 0x422, 0x411, 0x3b, 0x41f, 0x411, 0x3b, 0x45, 0x42, 0x6b, 0x42, 0x3b, 0x4d, 0x42, 0x3b, 0x47, 0x42, 0x3b,
-0x54, 0x42, 0x3b, 0x92a, 0x93f, 0x91f, 0x93e, 0x3b, 0x45, 0x42, 0x42, 0x61, 0x69, 0x74, 0x2d, 0x64, 0x1eb9, 0x6d, 0xb2c, 0xb3e,
-0xb07, 0xb1f, 0xb4d, 0x628, 0x627, 0x64a, 0x67c, 0x633, 0xa2c, 0xa3e, 0xa07, 0xa1f, 0x62, 0x79, 0x21b, 0x69, 0x431, 0x430, 0x430, 0x439,
-0x442, 0x43a, 0x411, 0x3b, 0x41c, 0x411, 0x3b, 0x47, 0x42, 0x3b, 0x54, 0x42, 0x3b, 0x50, 0x42, 0x3b, 0x45, 0x42, 0x431, 0x430,
-0x458, 0x442, 0x43e, 0x432, 0x438, 0x628, 0x627, 0x626, 0x64a, 0x67d, 0x632, 0x6aa, 0x644, 0x648, 0x20, 0x628, 0x627, 0x626, 0x64a, 0x67d,
-0x632, 0x3b, 0x4d, 0x42, 0x3b, 0x47, 0x42, 0x3b, 0x54, 0x42, 0x3b, 0x50, 0x42, 0x3b, 0x45, 0x42, 0xdb6, 0xdba, 0xdd2, 0xda7,
-0xdca, 0xd9a, 0xdd2, 0xdb6, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0xdb8, 0xdd9, 0xdb6, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0xd9c, 0xdd2, 0xdb6,
-0x20, 0x7b, 0x30, 0x7d, 0x3b, 0xda7, 0xdd9, 0xdb6, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0xdb4, 0xdd9, 0xdb6, 0x20, 0x7b, 0x30, 0x7d,
-0x3b, 0x45, 0x42, 0x62, 0x65, 0x79, 0x74, 0x69, 0x73, 0x6b, 0x42, 0x3b, 0x4d, 0x42, 0x3b, 0x47, 0x42, 0x3b, 0x54, 0x42,
-0x3b, 0x42, 0x42, 0x3b, 0x45, 0x42, 0x6b, 0x69, 0x6c, 0x6f, 0x62, 0x61, 0x69, 0x74, 0x69, 0x20, 0x7b, 0x30, 0x7d, 0x3b,
-0x4d, 0x42, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x47, 0x42, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x74, 0x65, 0x72, 0x61, 0x62, 0x61,
-0x69, 0x74, 0x69, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x50, 0x42, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x45, 0x42, 0xbaa, 0xbc8, 0xb9f,
-0xbcd, 0xb95, 0xbb3, 0xbcd, 0xc2c, 0xc48, 0xc1f, 0xc4d, 0x200c, 0xc32, 0xc41, 0xc15, 0xc47, 0xc2c, 0xc40, 0x3b, 0xc0e, 0xc2e, 0xc4d, 0x200c,
-0xc2c, 0xc3f, 0x3b, 0xc1c, 0xc40, 0xc2c, 0xc40, 0x3b, 0xc1f, 0xc40, 0xc2c, 0xc40, 0x3b, 0xc2a, 0xc40, 0xc2c, 0xc40, 0x3b, 0x45, 0x42,
-0xe44, 0xe1a, 0xe15, 0xe4c, 0x70, 0x61, 0x69, 0x74, 0x69, 0x6b, 0x42, 0x20, 0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x4d,
-0x42, 0x20, 0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x47, 0x42, 0x20, 0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x54,
-0x42, 0x20, 0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x50, 0x42, 0x20, 0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x45,
-0x42, 0x20, 0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x4b, 0x69, 0x42, 0x20, 0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x4d,
-0x69, 0x42, 0x20, 0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x47, 0x69, 0x42, 0x20, 0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d,
-0x3b, 0x54, 0x69, 0x42, 0x20, 0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x50, 0x69, 0x42, 0x20, 0x2bb, 0x65, 0x20, 0x7b,
-0x30, 0x7d, 0x3b, 0x45, 0x69, 0x42, 0x20, 0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x62, 0x61, 0xfd, 0x74, 0x431, 0x430, 0x439,
-0x442, 0x438, 0x62, 0x79, 0x74, 0x65, 0x79, 0x628, 0x627, 0x626, 0x679, 0x6b, 0x42, 0x3b, 0x4d, 0x42, 0x3b, 0x47, 0x42, 0x3b,
-0x54, 0x42, 0x3b, 0x67e, 0x6cc, 0x20, 0x628, 0x6cc, 0x3b, 0x45, 0x42, 0x62, 0x65, 0x69, 0x74, 0x69, 0x61, 0x75, 0xe0, 0x77,
-0x1ecd, 0x301, 0x6e, 0x20, 0x62, 0xe1, 0xec, 0x74, 0xec, 0x6b, 0xe9, 0x62, 0xe1, 0xec, 0x74, 0xec, 0x3b, 0x4d, 0x42, 0x3b,
-0x6a, 0xed, 0x62, 0xe1, 0xec, 0x74, 0xec, 0x3b, 0x54, 0xed, 0x62, 0xe1, 0xec, 0x74, 0xec, 0x3b, 0x50, 0xed, 0x62, 0xe1,
-0xec, 0x74, 0xec, 0x3b, 0x45, 0x42, 0xe0, 0x77, 0x254, 0x301, 0x6e, 0x20, 0x62, 0xe1, 0xec, 0x74, 0xec, 0x62, 0x79, 0x74,
-0x65, 0x20, 0x61, 0x67, 0x62, 0x79, 0x74, 0x65, 0x2d, 0x69, 0x74, 0x61
+static constexpr char16_t byte_unit_data[] = {
+0x62, 0x79, 0x74, 0x65, 0x73, 0x6b, 0x42, 0x3b, 0x4d, 0x42, 0x3b, 0x47,
+0x42, 0x3b, 0x54, 0x42, 0x3b, 0x50, 0x42, 0x3b, 0x45, 0x42, 0x4b, 0x69,
+0x42, 0x3b, 0x4d, 0x69, 0x42, 0x3b, 0x47, 0x69, 0x42, 0x3b, 0x54, 0x69,
+0x42, 0x3b, 0x50, 0x69, 0x42, 0x3b, 0x45, 0x69, 0x42, 0x67, 0x72, 0x65,
+0x65, 0x70, 0x62, 0x61, 0x6a, 0x74, 0x1263, 0x12ed, 0x1275, 0x12aa, 0x1263, 0x3b,
+0x121c, 0x130b, 0x1263, 0x12ed, 0x1275, 0x3b, 0x130a, 0x1263, 0x3b, 0x1274, 0x122b, 0x1263,
+0x12ed, 0x1275, 0x3b, 0x1354, 0x1263, 0x3b, 0x45, 0x42, 0x628, 0x627, 0x64a, 0x62a,
+0x643, 0x64a, 0x644, 0x648, 0x628, 0x627, 0x64a, 0x62a, 0x3b, 0x645, 0x2e, 0x628,
+0x3b, 0x63a, 0x2e, 0x628, 0x3b, 0x62a, 0x64a, 0x631, 0x627, 0x628, 0x627, 0x64a,
+0x62a, 0x3b, 0x628, 0x64a, 0x62a, 0x627, 0x628, 0x627, 0x64a, 0x62a, 0x3b, 0x45,
+0x42, 0x562, 0x561, 0x575, 0x569, 0x565, 0x580, 0x56f, 0x532, 0x3b, 0x544, 0x532,
+0x3b, 0x533, 0x532, 0x3b, 0x54f, 0x532, 0x3b, 0x54a, 0x532, 0x3b, 0x45, 0x42,
+0x9ac, 0x9be, 0x987, 0x99f, 0x995, 0x9bf, 0x983, 0x20, 0x9ac, 0x9be, 0x983, 0x3b,
+0x9ae, 0x9c7, 0x983, 0x20, 0x9ac, 0x9be, 0x983, 0x3b, 0x997, 0x9bf, 0x983, 0x20,
+0x9ac, 0x9be, 0x983, 0x3b, 0x99f, 0x9c7, 0x983, 0x20, 0x9ac, 0x9be, 0x983, 0x3b,
+0x50, 0x42, 0x3b, 0x45, 0x42, 0x62, 0x61, 0x79, 0x74, 0x62, 0x79, 0x74,
+0x65, 0x2d, 0x61, 0x6b, 0x431, 0x430, 0x439, 0x442, 0x44b, 0x41a, 0x411, 0x3b,
+0x41c, 0x411, 0x3b, 0x413, 0x411, 0x3b, 0x422, 0x411, 0x3b, 0x41f, 0x411, 0x3b,
+0x45, 0x42, 0x62, 0x61, 0x6a, 0x74, 0x6f, 0x76, 0x69, 0x6f, 0x6b, 0x74,
+0x65, 0x64, 0x6f, 0xf9, 0x6b, 0x6f, 0x3b, 0x4d, 0x6f, 0x3b, 0x47, 0x6f,
+0x3b, 0x54, 0x6f, 0x3b, 0x50, 0x6f, 0x3b, 0x45, 0x6f, 0x4b, 0x69, 0x6f,
+0x3b, 0x4d, 0x69, 0x6f, 0x3b, 0x47, 0x69, 0x6f, 0x3b, 0x54, 0x69, 0x6f,
+0x3b, 0x50, 0x69, 0x6f, 0x3b, 0x45, 0x69, 0x6f, 0x431, 0x430, 0x439, 0x442,
+0x43e, 0x432, 0x435, 0x1018, 0x102d, 0x102f, 0x1000, 0x103a, 0x6d, 0x67, 0x61, 0x20,
+0x62, 0x79, 0x74, 0x65, 0xd804, 0xdd1d, 0xd804, 0xdd2d, 0xd804, 0xdd16, 0xd804, 0xdd34,
+0x13d7, 0x13d3, 0x13cd, 0x13a6, 0x13b5, 0x13a9, 0x5b57, 0x8282, 0x4f4d, 0x5143, 0x7d44, 0x62,
+0x61, 0x6a, 0x74, 0x79, 0x62, 0x61, 0x6a, 0x74, 0x6f, 0x6a, 0x62, 0x61,
+0x69, 0x64, 0x69, 0x64, 0x62, 0xfd, 0x74, 0x74, 0x61, 0x76, 0x75, 0x74,
+0x6b, 0x74, 0x3b, 0x4d, 0x74, 0x3b, 0x47, 0x74, 0x3b, 0x54, 0x74, 0x3b,
+0x50, 0x74, 0x3b, 0x45, 0x74, 0x4b, 0x69, 0x74, 0x3b, 0x4d, 0x69, 0x74,
+0x3b, 0x47, 0x69, 0x74, 0x3b, 0x54, 0x69, 0x74, 0x3b, 0x50, 0x69, 0x74,
+0x3b, 0x45, 0x69, 0x74, 0x6f, 0x63, 0x74, 0x65, 0x74, 0x73, 0xd83a, 0xdd36,
+0xd83a, 0xdd2b, 0xd83a, 0xdd45, 0xd83a, 0xdd3c, 0xd83a, 0xdd46, 0xd83a, 0xdd2d, 0xd83a, 0xdd33,
+0xd83a, 0xdd14, 0x3b, 0xd83a, 0xdd03, 0xd83a, 0xdd14, 0x3b, 0xd83a, 0xdd18, 0xd83a, 0xdd14,
+0x3b, 0xd83a, 0xdd1a, 0xd83a, 0xdd14, 0x3b, 0xd83a, 0xdd06, 0xd83a, 0xdd14, 0x3b, 0x45,
+0x42, 0x62, 0x61, 0x69, 0x64, 0x68, 0x74, 0x10d1, 0x10d0, 0x10d8, 0x10e2, 0x10d8,
+0x10d9, 0x10d1, 0x10d0, 0x10d8, 0x10e2, 0x10d8, 0x3b, 0x4d, 0x42, 0x3b, 0x47, 0x42,
+0x3b, 0x10e2, 0x10d1, 0x10d0, 0x10d8, 0x10e2, 0x10d8, 0x3b, 0x10de, 0x10d1, 0x10d0, 0x10d8,
+0x10e2, 0x10d8, 0x3b, 0x45, 0x42, 0x42, 0x79, 0x74, 0x65, 0x73, 0xaac, 0xabe,
+0xa87, 0xa9f, 0x6b, 0x42, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x4d, 0x42, 0x20,
+0x7b, 0x30, 0x7d, 0x3b, 0x47, 0x42, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x54,
+0x42, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x50, 0x42, 0x20, 0x7b, 0x30, 0x7d,
+0x3b, 0x45, 0x42, 0x20, 0x7b, 0x30, 0x7d, 0x4b, 0x69, 0x42, 0x20, 0x7b,
+0x30, 0x7d, 0x3b, 0x4d, 0x69, 0x42, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x47,
+0x69, 0x42, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x54, 0x69, 0x42, 0x20, 0x7b,
+0x30, 0x7d, 0x3b, 0x50, 0x69, 0x42, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x45,
+0x69, 0x42, 0x20, 0x7b, 0x30, 0x7d, 0x5d1, 0x5d9, 0x5d9, 0x5d8, 0x92c, 0x93e,
+0x907, 0x91f, 0x62, 0xe1, 0x6a, 0x74, 0x62, 0xe6, 0x74, 0x69, 0x6f, 0x63,
+0x74, 0x65, 0x74, 0x65, 0x73, 0x62, 0x65, 0x61, 0x72, 0x74, 0x61, 0x30d0,
+0x30a4, 0x30c8, 0x4b, 0x42, 0x3b, 0x4d, 0x42, 0x3b, 0x47, 0x42, 0x3b, 0x54,
+0x42, 0x3b, 0x50, 0x42, 0x3b, 0x45, 0x42, 0x62, 0x69, 0x74, 0x65, 0x61,
+0x1e6d, 0x61, 0x6d, 0x1e0d, 0x61, 0x6e, 0x6b, 0x41, 0x1e6c, 0x3b, 0x4d, 0x41,
+0x1e6c, 0x3b, 0x47, 0x41, 0x1e6c, 0x3b, 0x54, 0x41, 0x1e6c, 0x3b, 0x50, 0x42,
+0x3b, 0x45, 0x42, 0xcac, 0xcc8, 0xc9f, 0xccd, 0x200c, 0xc97, 0xcb3, 0xcc1, 0xc95,
+0xcbf, 0x2e, 0xcac, 0xcc8, 0x2e, 0x3b, 0xcae, 0xcc6, 0x2e, 0xcac, 0xcc8, 0x2e,
+0x3b, 0xc97, 0xcbf, 0x2e, 0xcac, 0xcc8, 0x2e, 0x3b, 0xc9f, 0xcc6, 0x2e, 0xcac,
+0xcc8, 0x2e, 0x3b, 0xcaa, 0xcc6, 0xcac, 0xcc8, 0x3b, 0x45, 0x42, 0x43a, 0x411,
+0x3b, 0x4d, 0x411, 0x3b, 0x413, 0x411, 0x3b, 0x54, 0x411, 0x3b, 0x41f, 0x411,
+0x3b, 0x45, 0x411, 0x4b, 0x69, 0x411, 0x3b, 0x4d, 0x69, 0x411, 0x3b, 0x47,
+0x69, 0x411, 0x3b, 0x54, 0x69, 0x411, 0x3b, 0x50, 0x69, 0x411, 0x3b, 0x45,
+0x69, 0x411, 0x1794, 0x17c3, 0x92c, 0x93e, 0x92f, 0x91f, 0xbc14, 0xc774, 0xd2b8, 0x43a,
+0x411, 0x3b, 0x41c, 0x411, 0x3b, 0x413, 0x411, 0x3b, 0x422, 0x411, 0x3b, 0x41f,
+0x442, 0x431, 0x3b, 0x45, 0x42, 0x62, 0x61, 0x69, 0x74, 0x69, 0x62, 0x61,
+0x69, 0x74, 0x61, 0x69, 0x431, 0x430, 0x458, 0x442, 0x438, 0xd2c, 0xd48, 0xd31,
+0xd4d, 0xd31, 0xd4d, 0xd15, 0xd46, 0xd2c, 0xd3f, 0x3b, 0xd0e, 0xd02, 0xd2c, 0xd3f,
+0x3b, 0xd1c, 0xd3f, 0xd2c, 0xd3f, 0x3b, 0xd1f, 0xd3f, 0xd2c, 0xd3f, 0x3b, 0xd2a,
+0xd3f, 0xd2c, 0xd3f, 0x3b, 0x45, 0x42, 0x628, 0x627, 0x6cc, 0x62a, 0x6a9, 0x6cc,
+0x644, 0x648, 0x628, 0x627, 0x6cc, 0x62a, 0x3b, 0x645, 0x6af, 0x627, 0x628, 0x627,
+0x6cc, 0x62a, 0x3b, 0x6af, 0x6cc, 0x6af, 0x627, 0x628, 0x627, 0x6cc, 0x62a, 0x3b,
+0x62a, 0x631, 0x627, 0x628, 0x627, 0x6cc, 0x62a, 0x3b, 0x50, 0x42, 0x3b, 0x45,
+0x42, 0x43a, 0x411, 0x3b, 0x41c, 0x411, 0x3b, 0x413, 0x411, 0x3b, 0x422, 0x411,
+0x3b, 0x41f, 0x411, 0x3b, 0x45, 0x42, 0x6b, 0x42, 0x3b, 0x4d, 0x42, 0x3b,
+0x47, 0x42, 0x3b, 0x54, 0x42, 0x3b, 0x92a, 0x93f, 0x91f, 0x93e, 0x3b, 0x45,
+0x42, 0x42, 0x61, 0x69, 0x74, 0x2d, 0x64, 0x1eb9, 0x6d, 0xb2c, 0xb3e, 0xb07,
+0xb1f, 0xb4d, 0x628, 0x627, 0x64a, 0x67c, 0x633, 0xa2c, 0xa3e, 0xa07, 0xa1f, 0x62,
+0x79, 0x21b, 0x69, 0x431, 0x430, 0x430, 0x439, 0x442, 0x43a, 0x411, 0x3b, 0x41c,
+0x411, 0x3b, 0x47, 0x42, 0x3b, 0x54, 0x42, 0x3b, 0x50, 0x42, 0x3b, 0x45,
+0x42, 0x431, 0x430, 0x458, 0x442, 0x43e, 0x432, 0x438, 0x628, 0x627, 0x626, 0x64a,
+0x67d, 0x632, 0x6aa, 0x644, 0x648, 0x20, 0x628, 0x627, 0x626, 0x64a, 0x67d, 0x632,
+0x3b, 0x4d, 0x42, 0x3b, 0x47, 0x42, 0x3b, 0x54, 0x42, 0x3b, 0x50, 0x42,
+0x3b, 0x45, 0x42, 0xdb6, 0xdba, 0xdd2, 0xda7, 0xdca, 0xd9a, 0xdd2, 0xdb6, 0x20,
+0x7b, 0x30, 0x7d, 0x3b, 0xdb8, 0xdd9, 0xdb6, 0x20, 0x7b, 0x30, 0x7d, 0x3b,
+0xd9c, 0xdd2, 0xdb6, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0xda7, 0xdd9, 0xdb6, 0x20,
+0x7b, 0x30, 0x7d, 0x3b, 0xdb4, 0xdd9, 0xdb6, 0x20, 0x7b, 0x30, 0x7d, 0x3b,
+0x45, 0x42, 0x62, 0x65, 0x79, 0x74, 0x69, 0x73, 0x6b, 0x42, 0x3b, 0x4d,
+0x42, 0x3b, 0x47, 0x42, 0x3b, 0x54, 0x42, 0x3b, 0x42, 0x42, 0x3b, 0x45,
+0x42, 0x6b, 0x69, 0x6c, 0x6f, 0x62, 0x61, 0x69, 0x74, 0x69, 0x20, 0x7b,
+0x30, 0x7d, 0x3b, 0x4d, 0x42, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x47, 0x42,
+0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x74, 0x65, 0x72, 0x61, 0x62, 0x61, 0x69,
+0x74, 0x69, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x50, 0x42, 0x20, 0x7b, 0x30,
+0x7d, 0x3b, 0x45, 0x42, 0x712, 0x710, 0x71d, 0x72c, 0xbaa, 0xbc8, 0xb9f, 0xbcd,
+0xb95, 0xbb3, 0xbcd, 0xc2c, 0xc48, 0xc1f, 0xc4d, 0x200c, 0xc32, 0xc41, 0xc15, 0xc47,
+0xc2c, 0xc40, 0x3b, 0xc0e, 0xc2e, 0xc4d, 0x200c, 0xc2c, 0xc3f, 0x3b, 0xc1c, 0xc40,
+0xc2c, 0xc40, 0x3b, 0xc1f, 0xc40, 0xc2c, 0xc40, 0x3b, 0xc2a, 0xc40, 0xc2c, 0xc40,
+0x3b, 0x45, 0x42, 0xe44, 0xe1a, 0xe15, 0xe4c, 0x70, 0x61, 0x69, 0x74, 0x69,
+0x6b, 0x42, 0x20, 0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x4d, 0x42,
+0x20, 0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x47, 0x42, 0x20, 0x2bb,
+0x65, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x54, 0x42, 0x20, 0x2bb, 0x65, 0x20,
+0x7b, 0x30, 0x7d, 0x3b, 0x50, 0x42, 0x20, 0x2bb, 0x65, 0x20, 0x7b, 0x30,
+0x7d, 0x3b, 0x45, 0x42, 0x20, 0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x4b,
+0x69, 0x42, 0x20, 0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x4d, 0x69,
+0x42, 0x20, 0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x47, 0x69, 0x42,
+0x20, 0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x54, 0x69, 0x42, 0x20,
+0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x50, 0x69, 0x42, 0x20, 0x2bb,
+0x65, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x45, 0x69, 0x42, 0x20, 0x2bb, 0x65,
+0x20, 0x7b, 0x30, 0x7d, 0x62, 0x61, 0xfd, 0x74, 0x431, 0x430, 0x439, 0x442,
+0x438, 0x62, 0x79, 0x74, 0x65, 0x79, 0x628, 0x627, 0x626, 0x679, 0x6b, 0x42,
+0x3b, 0x4d, 0x42, 0x3b, 0x47, 0x42, 0x3b, 0x54, 0x42, 0x3b, 0x67e, 0x6cc,
+0x20, 0x628, 0x6cc, 0x3b, 0x45, 0x42, 0x62, 0x65, 0x69, 0x74, 0x69, 0x61,
+0x75, 0xe0, 0x77, 0x1ecd, 0x301, 0x6e, 0x20, 0x62, 0xe1, 0xec, 0x74, 0xec,
+0x6b, 0xe9, 0x62, 0xe1, 0xec, 0x74, 0xec, 0x3b, 0x4d, 0x42, 0x3b, 0x6a,
+0xed, 0x62, 0xe1, 0xec, 0x74, 0xec, 0x3b, 0x54, 0xed, 0x62, 0xe1, 0xec,
+0x74, 0xec, 0x3b, 0x50, 0xed, 0x62, 0xe1, 0xec, 0x74, 0xec, 0x3b, 0x45,
+0x42, 0xe0, 0x77, 0x254, 0x301, 0x6e, 0x20, 0x62, 0xe1, 0xec, 0x74, 0xec,
+0x62, 0x79, 0x74, 0x65, 0x20, 0x61, 0x67, 0x62, 0x79, 0x74, 0x65, 0x2d,
+0x69, 0x74, 0x61
};
-static const char16_t am_data[] = {
-0x41, 0x4d, 0x76, 0x6d, 0x2e, 0x61, 0x2e, 0x67, 0x41, 0x4e, 0x65, 0x20, 0x70, 0x61, 0x72, 0x61, 0x64, 0x69, 0x74, 0x65,
-0x73, 0x1325, 0x12cb, 0x1275, 0x635, 0x9aa, 0x9c2, 0x9f0, 0x9cd, 0x9ac, 0x9be, 0x9b9, 0x9cd, 0x9a8, 0x64, 0x65, 0x20, 0x6c, 0x61, 0x20,
-0x6d, 0x61, 0xf1, 0x61, 0x6e, 0x61, 0x69, 0x63, 0x68, 0x65, 0x68, 0x65, 0x61, 0x76, 0x6f, 0x410, 0x41c, 0x73, 0xe1, 0x72,
-0xfa, 0x77, 0xe1, 0x49, 0x20, 0x62, 0x69, 0x6b, 0x25b, 0x302, 0x67, 0x6c, 0xe0, 0x75, 0x6c, 0x75, 0x63, 0x68, 0x65, 0x6c,
-0x6f, 0x70, 0x61, 0x6d, 0x69, 0x6c, 0x61, 0x75, 0x92b, 0x941, 0x902, 0x70, 0x72, 0x69, 0x6a, 0x65, 0x70, 0x6f, 0x64, 0x6e,
-0x65, 0x43f, 0x440, 0x438, 0x458, 0x435, 0x20, 0x43f, 0x43e, 0x434, 0x43d, 0x435, 0x41, 0x2e, 0x4d, 0x2e, 0x43f, 0x440, 0x2e, 0x43e,
-0x431, 0x2e, 0x1014, 0x1036, 0x1014, 0x1000, 0x103a, 0x4e0a, 0x5348, 0x61, 0x2e, 0xa0, 0x6d, 0x2e, 0x5a, 0x64, 0x61, 0x74, 0x20, 0x61,
-0x7a, 0x61, 0x6c, 0x628, 0x2e, 0x646, 0x13cc, 0x13be, 0x13b4, 0x55, 0x68, 0x72, 0x20, 0x76, 0xf6, 0x72, 0x6d, 0x69, 0x64, 0x64,
-0x61, 0x61, 0x63, 0x68, 0x73, 0x61, 0x2e, 0x6d, 0x2e, 0x64, 0x6f, 0x70, 0x2e, 0x938, 0x935, 0x947, 0x930, 0x69, 0x64, 0x69,
-0x253, 0x61, 0xf66, 0xf94, 0xf0b, 0xf46, 0xf0b, 0x4b, 0x49, 0x61, 0x74, 0x6d, 0x14b, 0x64, 0x69, 0x6b, 0xed, 0x6b, 0xed, 0x72,
-0xed, 0x67, 0x61, 0x70, 0x2e, 0x6d, 0x61, 0x74, 0x69, 0x6e, 0x73, 0x75, 0x62, 0x61, 0x6b, 0x61, 0xd83a, 0xdd00, 0xd83a, 0xdd0e,
-0x3c0, 0x2e, 0x3bc, 0x2e, 0x4d, 0x61, 0x6d, 0x62, 0x69, 0x61, 0x53, 0x61, 0x66, 0x69, 0x79, 0x61, 0x5dc, 0x5e4, 0x5e0, 0x5d4,
-0x5f4, 0x5e6, 0x64, 0x65, 0x2e, 0x66, 0x2e, 0x68, 0x2e, 0x4e, 0x2019, 0x1ee5, 0x74, 0x1ee5, 0x74, 0x1ee5, 0x69, 0x70, 0x2e, 0x72,
-0x2e, 0x6e, 0x2e, 0x5348, 0x524d, 0x49, 0x73, 0x75, 0x6b, 0x6e, 0x20, 0x74, 0x75, 0x66, 0x61, 0x74, 0x6b, 0x61, 0x72, 0x6f,
-0x6f, 0x6e, 0x128, 0x79, 0x61, 0x6b, 0x77, 0x61, 0x6b, 0x79, 0x61, 0xcaa, 0xcc2, 0xcb0, 0xccd, 0xcb5, 0xcbe, 0xcb9, 0xccd, 0xca8,
-0x4b, 0x69, 0x72, 0x6f, 0x6b, 0x6f, 0xc624, 0xc804, 0x41, 0x64, 0x64, 0x75, 0x68, 0x61, 0x42, 0x4e, 0x6d, 0x61, 0x6e, 0xe1,
-0x442, 0x430, 0x4a3, 0x43a, 0x44b, 0x54, 0x4f, 0x4f, 0xe81, 0xec8, 0xead, 0xe99, 0xe97, 0xec8, 0xebd, 0xe87, 0x70, 0x72, 0x69, 0x65,
-0x6b, 0x161, 0x70, 0x75, 0x73, 0x64, 0x69, 0x65, 0x6e, 0x101, 0x6e, 0x74, 0x254, 0x301, 0x6e, 0x67, 0x254, 0x301, 0x70, 0x72,
-0x69, 0x65, 0x161, 0x70, 0x69, 0x65, 0x74, 0x64, 0x6f, 0x70, 0x6f, 0x142, 0x64, 0x6e, 0x6a, 0x61, 0x44, 0x69, 0x6e, 0x64,
-0x61, 0x4f, 0x44, 0x6d, 0x6f, 0x69, 0x65, 0x73, 0x43f, 0x440, 0x435, 0x442, 0x43f, 0x43b, 0x430, 0x434, 0x43d, 0x435, 0x75, 0x74,
-0x75, 0x6b, 0x6f, 0x92d, 0x94b, 0x930, 0x77, 0x69, 0x63, 0x68, 0x69, 0x73, 0x68, 0x75, 0x4d, 0x75, 0x68, 0x69, 0x50, 0x47,
-0x98f, 0x20, 0x98f, 0x9ae, 0x190, 0x6e, 0x6b, 0x61, 0x6b, 0x25b, 0x6e, 0x79, 0xe1, 0x52, 0x168, 0x4af, 0x2e, 0x4e9, 0x2e, 0x63,
-0x6f, 0x6d, 0x6d, 0x65, 0x1c1, 0x67, 0x6f, 0x61, 0x67, 0x61, 0x73, 0x92a, 0x942, 0x930, 0x94d, 0x935, 0x93e, 0x939, 0x94d, 0x928,
-0x6d, 0x62, 0x61, 0x2bc, 0xe1, 0x6d, 0x62, 0x61, 0x2bc, 0x6d, 0x62, 0x61, 0xa78c, 0x6d, 0x62, 0x61, 0xa78c, 0x46, 0x1ecd, 0x20,
-0x6d, 0x1ecd, 0x301, 0x6e, 0x69, 0x6e, 0x69, 0x111, 0x69, 0x74, 0x62, 0x65, 0x61, 0x69, 0x76, 0x65, 0x74, 0x69, 0x62, 0x52,
-0x57, 0x57, 0x44, 0x4d5, 0x43c, 0x431, 0x438, 0x441, 0x431, 0x43e, 0x43d, 0x44b, 0x20, 0x440, 0x430, 0x437, 0x43c, 0x4d5, 0x63a, 0x2e,
-0x645, 0x2e, 0x642, 0x628, 0x644, 0x200c, 0x627, 0x632, 0x638, 0x647, 0x631, 0x64, 0x61, 0x20, 0x6d, 0x61, 0x6e, 0x68, 0xe3, 0xa2a,
-0xa42, 0x2e, 0xa26, 0xa41, 0x2e, 0x6b, 0x61, 0x6e, 0x67, 0x2019, 0x61, 0x6d, 0x61, 0x5a, 0x2e, 0x4d, 0x55, 0x2e, 0x42d, 0x418,
-0x54, 0x65, 0x73, 0x69, 0x72, 0x61, 0x6e, 0x4e, 0x44, 0x4c, 0x77, 0x61, 0x6d, 0x69, 0x6c, 0x61, 0x77, 0x75, 0x1c65, 0x1c6e,
-0x1c5b, 0x1c5f, 0x1c5c, 0x70, 0x72, 0x69, 0x6a, 0x65, 0x20, 0x70, 0x6f, 0x64, 0x6e, 0x65, 0x6d, 0x61, 0x6b, 0x65, 0x6f, 0xa3b8,
-0xa111, 0x635, 0x628, 0x62d, 0x60c, 0x20, 0x645, 0x646, 0x62c, 0x647, 0x646, 0x62f, 0x92e, 0x902, 0x91d, 0x902, 0x926, 0x93f, 0x20, 0x916,
-0x93e, 0x902, 0x20, 0x92a, 0x939, 0x93f, 0x902, 0x930, 0x93f, 0x92f, 0x94b, 0x902, 0xdb4, 0xdd9, 0x2e, 0xdc0, 0x2e, 0x4d, 0x75, 0x6e,
-0x6b, 0x79, 0x6f, 0x47, 0x48, 0x2d5c, 0x2d49, 0x2d3c, 0x2d30, 0x2d61, 0x2d5c, 0x66, 0x6d, 0x61, 0x6d, 0x20, 0x56, 0x6f, 0x72, 0x6d,
-0x69, 0x74, 0x74, 0x61, 0x67, 0x74, 0x69, 0x66, 0x61, 0x77, 0x74, 0x4c, 0x75, 0x6d, 0x61, 0x20, 0x6c, 0x77, 0x61, 0x20,
-0x4b, 0xbae, 0xbc1, 0xbb1, 0xbcd, 0xbaa, 0xb95, 0xbb2, 0xbcd, 0x53, 0x75, 0x62, 0x62, 0x61, 0x61, 0x68, 0x69, 0x54, 0x61, 0x70,
-0x61, 0x72, 0x61, 0x63, 0x68, 0x75, 0xe01, 0xe48, 0xe2d, 0xe19, 0xe40, 0xe17, 0xe35, 0xe48, 0xe22, 0xe07, 0xf66, 0xf94, 0xf0b, 0xf51,
-0xfb2, 0xf7c, 0xf0b, 0x1245, 0x2e, 0x1240, 0x2e, 0x68, 0x65, 0x6e, 0x67, 0x69, 0x68, 0x65, 0x6e, 0x67, 0x69, 0xd6, 0xd6, 0x67,
-0xfc, 0x6e, 0x6f, 0x72, 0x74, 0x61, 0x64, 0x61, 0x6e, 0x20, 0xf6, 0x148, 0x434, 0x43f, 0x686, 0x6c8, 0x634, 0x62a, 0x649, 0x646,
-0x20, 0x628, 0x6c7, 0x631, 0x6c7, 0x646, 0x422, 0x41e, 0x53, 0x41, 0x79, 0x62, 0x6b, 0x69, 0x25b, 0x6d, 0x25b, 0x301, 0x25b, 0x6d,
-0x5e4, 0x5bf, 0x5d0, 0x5b7, 0x5e8, 0x5de, 0x5d9, 0x5d8, 0x5d0, 0x5b8, 0x5d2, 0xc0, 0xe1, 0x72, 0x1ecd, 0x300, 0xc0, 0xe1, 0x72, 0x254,
-0x300
+static constexpr char16_t am_data[] = {
+0x41, 0x4d, 0x76, 0x6d, 0x2e, 0x61, 0x2e, 0x67, 0x41, 0x4e, 0x65, 0x20,
+0x70, 0x61, 0x72, 0x61, 0x64, 0x69, 0x74, 0x65, 0x73, 0x1325, 0x12cb, 0x1275,
+0x635, 0x9aa, 0x9c2, 0x9f0, 0x9cd, 0x9ac, 0x9be, 0x9b9, 0x9cd, 0x9a8, 0x64, 0x65,
+0x20, 0x6c, 0x61, 0x20, 0x6d, 0x61, 0xf1, 0x61, 0x6e, 0x61, 0x69, 0x63,
+0x68, 0x65, 0x68, 0x65, 0x61, 0x76, 0x6f, 0x410, 0x41c, 0x73, 0xe1, 0x72,
+0xfa, 0x77, 0xe1, 0x49, 0x20, 0x62, 0x69, 0x6b, 0x25b, 0x302, 0x67, 0x6c,
+0xe0, 0x75, 0x6c, 0x75, 0x63, 0x68, 0x65, 0x6c, 0x6f, 0x70, 0x61, 0x6d,
+0x69, 0x6c, 0x61, 0x75, 0x92d, 0x94b, 0x930, 0x92b, 0x941, 0x902, 0x70, 0x72,
+0x69, 0x6a, 0x65, 0x70, 0x6f, 0x64, 0x6e, 0x65, 0x43f, 0x440, 0x438, 0x458,
+0x435, 0x20, 0x43f, 0x43e, 0x434, 0x43d, 0x435, 0x41, 0x2e, 0x4d, 0x2e, 0x43f,
+0x440, 0x2e, 0x43e, 0x431, 0x2e, 0x1014, 0x1036, 0x1014, 0x1000, 0x103a, 0x4e0a, 0x5348,
+0x61, 0x2e, 0xa0, 0x6d, 0x2e, 0x5a, 0x64, 0x61, 0x74, 0x20, 0x61, 0x7a,
+0x61, 0x6c, 0x628, 0x2e, 0x646, 0x13cc, 0x13be, 0x13b4, 0x55, 0x68, 0x72, 0x20,
+0x76, 0xf6, 0x72, 0x6d, 0x69, 0x64, 0x64, 0x61, 0x61, 0x63, 0x68, 0x73,
+0x61, 0x2e, 0x6d, 0x2e, 0x64, 0x6f, 0x70, 0x2e, 0x938, 0x935, 0x947, 0x930,
+0x69, 0x64, 0x69, 0x253, 0x61, 0xf66, 0xf94, 0xf0b, 0xf46, 0xf0b, 0x4b, 0x49,
+0xd801, 0xdc08, 0xd801, 0xdc23, 0xd801, 0xdc68, 0xd801, 0xdc65, 0x61, 0x74, 0x6d, 0x14b,
+0x64, 0x69, 0x6b, 0xed, 0x6b, 0xed, 0x72, 0xed, 0x67, 0x61, 0x70, 0x2e,
+0x6d, 0x61, 0x74, 0x69, 0x6e, 0x73, 0x75, 0x62, 0x61, 0x6b, 0x61, 0xd83a,
+0xdd00, 0xd83a, 0xdd0e, 0x3c0, 0x2e, 0x3bc, 0x2e, 0x4d, 0x61, 0x6d, 0x62, 0x69,
+0x61, 0x53, 0x61, 0x66, 0x69, 0x79, 0x61, 0x5dc, 0x5e4, 0x5e0, 0x5d4, 0x5f4,
+0x5e6, 0x64, 0x65, 0x2e, 0x66, 0x2e, 0x68, 0x2e, 0x4e, 0x2019, 0x1ee5, 0x74,
+0x1ee5, 0x74, 0x1ee5, 0x69, 0x70, 0x2e, 0x61, 0x6e, 0x74, 0x65, 0x20, 0x6d,
+0x69, 0x64, 0xed, 0x72, 0x2e, 0x6e, 0x2e, 0x5348, 0x524d, 0x49, 0x73, 0x75,
+0x6b, 0x6e, 0x20, 0x74, 0x75, 0x66, 0x61, 0x74, 0x6b, 0x61, 0x72, 0x6f,
+0x6f, 0x6e, 0x128, 0x79, 0x61, 0x6b, 0x77, 0x61, 0x6b, 0x79, 0x61, 0xcaa,
+0xcc2, 0xcb0, 0xccd, 0xcb5, 0xcbe, 0xcb9, 0xccd, 0xca8, 0x627, 0x6d2, 0x20, 0x627,
+0x6cc, 0x645, 0x92f, 0x947, 0x20, 0x90f, 0x92e, 0x4b, 0x69, 0x72, 0x6f, 0x6b,
+0x6f, 0x938, 0x915, 0x93e, 0x933, 0xc624, 0xc804, 0x41, 0x64, 0x64, 0x75, 0x68,
+0x61, 0x42, 0x4e, 0x6d, 0x61, 0x6e, 0xe1, 0x442, 0x430, 0x4a3, 0x43a, 0x44b,
+0x54, 0x4f, 0x4f, 0xe81, 0xec8, 0xead, 0xe99, 0xe97, 0xec8, 0xebd, 0xe87, 0x70,
+0x72, 0x69, 0x65, 0x6b, 0x161, 0x70, 0x75, 0x73, 0x64, 0x69, 0x65, 0x6e,
+0x101, 0x6e, 0x74, 0x254, 0x301, 0x6e, 0x67, 0x254, 0x301, 0x70, 0x72, 0x69,
+0x65, 0x161, 0x70, 0x69, 0x65, 0x74, 0x64, 0x6f, 0x70, 0x6f, 0x142, 0x64,
+0x6e, 0x6a, 0x61, 0x44, 0x69, 0x6e, 0x64, 0x61, 0x4f, 0x44, 0x6d, 0x6f,
+0x69, 0x65, 0x73, 0x43f, 0x440, 0x435, 0x442, 0x43f, 0x43b, 0x2e, 0x75, 0x74,
+0x75, 0x6b, 0x6f, 0x77, 0x69, 0x63, 0x68, 0x69, 0x73, 0x68, 0x75, 0x4d,
+0x75, 0x68, 0x69, 0x50, 0x47, 0x98f, 0x20, 0x98f, 0x9ae, 0x190, 0x6e, 0x6b,
+0x61, 0x6b, 0x25b, 0x6e, 0x79, 0xe1, 0x52, 0x168, 0x4af, 0x2e, 0x4e9, 0x2e,
+0x1826, 0x1802, 0x20, 0x1825, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x1c1, 0x67, 0x6f,
+0x61, 0x67, 0x61, 0x73, 0x92a, 0x942, 0x930, 0x94d, 0x935, 0x93e, 0x939, 0x94d,
+0x928, 0x6d, 0x62, 0x61, 0x2bc, 0xe1, 0x6d, 0x62, 0x61, 0x2bc, 0x6d, 0x62,
+0x61, 0xa78c, 0x6d, 0x62, 0x61, 0xa78c, 0x46, 0x1ecd, 0x20, 0x6d, 0x1ecd, 0x301,
+0x6e, 0x69, 0x6e, 0x7db, 0x69, 0x111, 0x69, 0x74, 0x62, 0x65, 0x61, 0x69,
+0x76, 0x65, 0x74, 0x69, 0x62, 0x66, 0x2e, 0x6d, 0x2e, 0x52, 0x57, 0x57,
+0x44, 0x4d5, 0x43c, 0x431, 0x438, 0x441, 0x431, 0x43e, 0x43d, 0x44b, 0x20, 0x440,
+0x430, 0x437, 0x43c, 0x4d5, 0x63a, 0x2e, 0x645, 0x2e, 0x642, 0x628, 0x644, 0x200c,
+0x627, 0x632, 0x638, 0x647, 0x631, 0x64, 0x61, 0x20, 0x6d, 0x61, 0x6e, 0x68,
+0xe3, 0x61, 0x6e, 0x6b, 0x73, 0x74, 0x101, 0x69, 0x6e, 0x61, 0x6e, 0xa2a,
+0xa42, 0x2e, 0xa26, 0xa41, 0x2e, 0x6b, 0x61, 0x6e, 0x67, 0x2019, 0x61, 0x6d,
+0x61, 0x5a, 0x2e, 0x4d, 0x55, 0x2e, 0x42d, 0x418, 0x54, 0x65, 0x73, 0x69,
+0x72, 0x61, 0x6e, 0x4e, 0x44, 0x4c, 0x77, 0x61, 0x6d, 0x69, 0x6c, 0x61,
+0x77, 0x75, 0x1c65, 0x1c6e, 0x1c5b, 0x1c5f, 0x1c5c, 0x70, 0x72, 0x69, 0x6a, 0x65,
+0x20, 0x70, 0x6f, 0x64, 0x6e, 0x65, 0x6d, 0x61, 0x6b, 0x65, 0x6f, 0xa3b8,
+0xa111, 0x64, 0x6f, 0x20, 0x70, 0x6f, 0x142, 0x65, 0x64, 0x6e, 0x69, 0x14f,
+0x635, 0x628, 0x62d, 0x60c, 0x20, 0x645, 0x646, 0x62c, 0x647, 0x646, 0x62f, 0x938,
+0x941, 0x92c, 0x941, 0x939, 0x20, 0x91c, 0x93e, 0xdb4, 0xdd9, 0x2e, 0xdc0, 0x2e,
+0x4d, 0x75, 0x6e, 0x6b, 0x79, 0x6f, 0x47, 0x48, 0x2d5c, 0x2d49, 0x2d3c, 0x2d30,
+0x2d61, 0x2d5c, 0x66, 0x6d, 0x61, 0x6d, 0x20, 0x56, 0x6f, 0x72, 0x6d, 0x69,
+0x74, 0x74, 0x61, 0x67, 0x70f, 0x729, 0x71b, 0x200c, 0x74, 0x69, 0x66, 0x61,
+0x77, 0x74, 0x4c, 0x75, 0x6d, 0x61, 0x20, 0x6c, 0x77, 0x61, 0x20, 0x4b,
+0x53, 0x75, 0x62, 0x62, 0x61, 0x61, 0x68, 0x69, 0x54, 0x61, 0x70, 0x61,
+0x72, 0x61, 0x63, 0x68, 0x75, 0xe01, 0xe48, 0xe2d, 0xe19, 0xe40, 0xe17, 0xe35,
+0xe48, 0xe22, 0xe07, 0xf66, 0xf94, 0xf0b, 0xf51, 0xfb2, 0xf7c, 0xf0b, 0x1245, 0x2e,
+0x1240, 0x2e, 0x68, 0x65, 0x6e, 0x67, 0x69, 0x68, 0x65, 0x6e, 0x67, 0x69,
+0xd6, 0xd6, 0x67, 0xfc, 0x6e, 0x6f, 0x72, 0x74, 0x61, 0x64, 0x61, 0x6e,
+0x20, 0xf6, 0x148, 0x434, 0x43f, 0x686, 0x6c8, 0x634, 0x62a, 0x649, 0x646, 0x20,
+0x628, 0x6c7, 0x631, 0x6c7, 0x646, 0x422, 0x41e, 0x53, 0x41, 0x79, 0x62, 0x6b,
+0x69, 0x25b, 0x6d, 0x25b, 0x301, 0x25b, 0x6d, 0x5e4, 0x5bf, 0x5d0, 0x5b7, 0x5e8,
+0x5de, 0x5d9, 0x5d8, 0x5d0, 0x5b8, 0x5d2, 0xc0, 0xe1, 0x72, 0x1ecd, 0x300, 0xc0,
+0xe1, 0x72, 0x254, 0x300, 0x62, 0x61, 0x6e, 0x68, 0x61, 0x65, 0x74, 0x924,
+0x921, 0x915, 0x947, 0x938, 0x92c, 0x947, 0x930, 0x947, 0x70, 0x69, 0x20, 0x6f,
+0x70, 0x65, 0x6e, 0x20, 0x73, 0x75, 0x6e, 0x6f, 0x28a, 0x73, 0x68, 0x69,
+0x6c, 0xe8, 0x20, 0x6b, 0x28a, 0x62, 0x6f, 0x256, 0x75, 0x92d, 0x94d, 0x92f,
+0x93e, 0x917, 0x93e
};
-static const char16_t pm_data[] = {
-0x50, 0x4d, 0x6e, 0x6d, 0x2e, 0x61, 0x2e, 0x6b, 0x45, 0x57, 0x65, 0x20, 0x70, 0x61, 0x73, 0x64, 0x69, 0x74, 0x65, 0x73,
-0x12a8, 0x1230, 0x12d3, 0x1275, 0x645, 0x985, 0x9aa, 0x9f0, 0x9be, 0x9b9, 0x9cd, 0x9a8, 0x64, 0x65, 0x20, 0x6c, 0x61, 0x20, 0x74, 0x61,
-0x72, 0x64, 0x65, 0x69, 0x63, 0x68, 0x61, 0x6d, 0x74, 0x68, 0x69, 0x41f, 0x41c, 0x63, 0x25b, 0x25b, 0x301, 0x6e, 0x6b, 0x6f,
-0x49, 0x20, 0x253, 0x75, 0x67, 0x61, 0x6a, 0x254, 0x70, 0x61, 0x6b, 0x61, 0x73, 0x75, 0x62, 0x61, 0x70, 0x61, 0x6d, 0x75,
-0x6e, 0x79, 0x69, 0x92c, 0x947, 0x932, 0x93e, 0x938, 0x947, 0x70, 0x6f, 0x70, 0x6f, 0x64, 0x6e, 0x65, 0x43f, 0x43e, 0x441, 0x43b,
-0x438, 0x458, 0x435, 0x20, 0x43f, 0x43e, 0x434, 0x43d, 0x435, 0x47, 0x2e, 0x4d, 0x2e, 0x441, 0x43b, 0x2e, 0x43e, 0x431, 0x2e, 0x100a,
-0x1014, 0x1031, 0x4e0b, 0x5348, 0x70, 0x2e, 0xa0, 0x6d, 0x2e, 0x1e0c, 0x65, 0x66, 0x66, 0x69, 0x72, 0x20, 0x61, 0x7a, 0x61, 0x62f,
-0x2e, 0x646, 0x13d2, 0x13af, 0x13f1, 0x13a2, 0x13d7, 0x13e2, 0x55, 0x68, 0x72, 0x20, 0x6e, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61,
-0x61, 0x63, 0x68, 0x73, 0x70, 0x2e, 0x6d, 0x2e, 0x6f, 0x64, 0x70, 0x2e, 0x92c, 0x93e, 0x926, 0x20, 0x926, 0x92a, 0x948, 0x939,
-0x930, 0x65, 0x62, 0x79, 0xe1, 0x6d, 0x75, 0xf55, 0xfb1, 0xf72, 0xf0b, 0xf46, 0xf0b, 0x55, 0x54, 0x70, 0x6d, 0x70, 0x74, 0x6d,
-0x263, 0x65, 0x74, 0x72, 0x254, 0x6e, 0x67, 0x259, 0x67, 0xf3, 0x67, 0x259, 0x6c, 0x65, 0x69, 0x70, 0x2e, 0x73, 0x6f, 0x69,
-0x72, 0x6b, 0x69, 0x6b, 0x69, 0x69, 0x257, 0x65, 0xd83a, 0xdd07, 0xd83a, 0xdd0e, 0x3bc, 0x2e, 0x3bc, 0x2e, 0x4d, 0x6f, 0x67, 0x59,
-0x61, 0x6d, 0x6d, 0x61, 0x5d0, 0x5d7, 0x5d4, 0x5f4, 0x5e6, 0x64, 0x75, 0x2e, 0x65, 0x2e, 0x68, 0x2e, 0x4e, 0x2019, 0x61, 0x62,
-0x61, 0x6c, 0x69, 0x65, 0x70, 0x2e, 0x69, 0x2e, 0x6e, 0x2e, 0x5348, 0x5f8c, 0x57, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x20, 0x74,
-0x6d, 0x65, 0x64, 0x64, 0x69, 0x74, 0x6b, 0x6f, 0x6f, 0x73, 0x6b, 0x6f, 0x6c, 0x69, 0x6e, 0x79, 0x128, 0x79, 0x61, 0x77,
-0x129, 0x6f, 0x6f, 0xc85, 0xcaa, 0xcb0, 0xcbe, 0xcb9, 0xccd, 0xca8, 0x48, 0x77, 0x61, 0x129, 0x2d, 0x69, 0x6e, 0x129, 0xc624, 0xd6c4,
-0x41, 0x6c, 0x75, 0x75, 0x6c, 0x61, 0x50, 0x4e, 0x6b, 0x75, 0x67, 0xfa, 0x442, 0x4af, 0x448, 0x442, 0x4e9, 0x43d, 0x20, 0x43a,
-0x438, 0x439, 0x438, 0x43d, 0x43a, 0x438, 0x4d, 0x55, 0x55, 0xeab, 0xebc, 0xeb1, 0xe87, 0xe97, 0xec8, 0xebd, 0xe87, 0x70, 0x113, 0x63,
-0x70, 0x75, 0x73, 0x64, 0x69, 0x65, 0x6e, 0x101, 0x6d, 0x70, 0xf3, 0x6b, 0x77, 0x61, 0x70, 0x6f, 0x70, 0x69, 0x65, 0x74,
-0x77, 0xf3, 0x74, 0x70, 0x6f, 0x142, 0x64, 0x6e, 0x6a, 0x61, 0x44, 0x69, 0x6c, 0x6f, 0x6c, 0x6f, 0x4f, 0x54, 0x6e, 0x6f,
-0x6d, 0xeb, 0x74, 0x74, 0x65, 0x73, 0x43f, 0x43e, 0x43f, 0x43b, 0x430, 0x434, 0x43d, 0x435, 0x6b, 0x79, 0x69, 0x75, 0x6b, 0x6f,
-0x6e, 0x79, 0x69, 0x938, 0x93e, 0x902, 0x91d, 0x6d, 0x63, 0x68, 0x6f, 0x63, 0x68, 0x69, 0x6c, 0x2019, 0x6c, 0x43, 0x68, 0x69,
-0x6c, 0x6f, 0x50, 0x54, 0x47, 0x9aa, 0x9bf, 0x20, 0x98f, 0x9ae, 0x190, 0x6e, 0x64, 0xe1, 0x6d, 0xe2, 0x168, 0x47, 0x4af, 0x2e,
-0x445, 0x2e, 0x6c, 0x69, 0x6c, 0x6c, 0x69, 0x1c3, 0x75, 0x69, 0x61, 0x73, 0x905, 0x92a, 0x930, 0x93e, 0x939, 0x94d, 0x928, 0x6e,
-0x63, 0x77, 0xf2, 0x6e, 0x7a, 0xe9, 0x6d, 0x14b, 0x6b, 0x61, 0x20, 0x6d, 0x62, 0x254, 0x301, 0x74, 0x20, 0x6e, 0x6a, 0x69,
-0x46, 0x1ecd, 0x20, 0xed, 0x76, 0x6e, 0x69, 0x6e, 0x65, 0x61, 0x68, 0x6b, 0x65, 0x74, 0x62, 0x65, 0x61, 0x69, 0x76, 0x65,
-0x74, 0x54, 0x14a, 0x57, 0x42, 0x4d5, 0x43c, 0x431, 0x438, 0x441, 0x431, 0x43e, 0x43d, 0x44b, 0x20, 0x444, 0x4d5, 0x441, 0x442, 0x4d5,
-0x63a, 0x2e, 0x648, 0x2e, 0x628, 0x639, 0x62f, 0x627, 0x632, 0x638, 0x647, 0x631, 0x64, 0x61, 0x20, 0x74, 0x61, 0x72, 0x64, 0x65,
-0xa2c, 0xa3e, 0x2e, 0xa26, 0xa41, 0x2e, 0x6b, 0x69, 0x6e, 0x67, 0x6f, 0x74, 0x6f, 0x5a, 0x2e, 0x4d, 0x57, 0x2e, 0x42d, 0x41a,
-0x54, 0x65, 0x69, 0x70, 0x61, 0x4c, 0x4b, 0x50, 0x61, 0x73, 0x68, 0x61, 0x6d, 0x69, 0x68, 0x65, 0x1c67, 0x1c64, 0x1c6b, 0x1c5f,
-0x1c79, 0x43f, 0x43e, 0x20, 0x43f, 0x43e, 0x434, 0x43d, 0x435, 0x70, 0x6f, 0x20, 0x70, 0x6f, 0x64, 0x6e, 0x65, 0x6e, 0x79, 0x69,
-0x61, 0x67, 0x68, 0x75, 0x6f, 0xa06f, 0xa2d2, 0x645, 0x646, 0x62c, 0x647, 0x646, 0x62f, 0x60c, 0x20, 0x634, 0x627, 0x645, 0x92e, 0x902,
-0x91d, 0x902, 0x926, 0x93f, 0x20, 0x916, 0x93e, 0x902, 0x20, 0x92a, 0x94b, 0x907, 0xdb4, 0x2e, 0xdc0, 0x2e, 0x70, 0x6f, 0x70, 0x2e,
-0x45, 0x69, 0x67, 0x75, 0x6c, 0x6f, 0x47, 0x44, 0x2d5c, 0x2d30, 0x2d37, 0x2d33, 0x2d33, 0x2d6f, 0x2d30, 0x2d5c, 0x65, 0x6d, 0x61, 0x6d,
-0x20, 0x4e, 0x61, 0x6d, 0x69, 0x74, 0x74, 0x61, 0x67, 0x74, 0x61, 0x64, 0x67, 0x67, 0x2b7, 0x61, 0x74, 0x6c, 0x75, 0x6d,
-0x61, 0x20, 0x6c, 0x77, 0x61, 0x20, 0x70, 0xbaa, 0xbbf, 0xbb1, 0xbcd, 0xbaa, 0xb95, 0xbb2, 0xbcd, 0x5a, 0x61, 0x61, 0x72, 0x69,
-0x6b, 0x61, 0x79, 0x20, 0x62, 0x45, 0x62, 0x6f, 0x6e, 0x67, 0x69, 0xe2b, 0xe25, 0xe31, 0xe07, 0xe40, 0xe17, 0xe35, 0xe48, 0xe22,
-0xe07, 0xf55, 0xfb1, 0xf72, 0xf0b, 0xf51, 0xfb2, 0xf7c, 0xf0b, 0x12f5, 0x2e, 0x1240, 0x2e, 0x65, 0x66, 0x69, 0x61, 0x66, 0x69, 0xd6,
-0x53, 0x67, 0xfc, 0x6e, 0x6f, 0x72, 0x74, 0x61, 0x64, 0x61, 0x6e, 0x20, 0x73, 0x6f, 0x148, 0x43f, 0x43f, 0x70, 0x6f, 0x70,
-0x6f, 0x142, 0x64, 0x6e, 0x6a, 0x75, 0x686, 0x6c8, 0x634, 0x62a, 0x649, 0x646, 0x20, 0x643, 0x6d0, 0x64a, 0x649, 0x646, 0x54, 0x4b,
-0x422, 0x41a, 0x43, 0x48, 0x79, 0x68, 0x4e, 0x67, 0x6f, 0x6b, 0x69, 0x73, 0x25b, 0x301, 0x6e, 0x64, 0x25b, 0x5e0, 0x5d0, 0x5b8,
-0x5db, 0x5de, 0x5d9, 0x5d8, 0x5d0, 0x5b8, 0x5d2, 0x1ecc, 0x300, 0x73, 0xe1, 0x6e, 0x186, 0x300, 0x73, 0xe1, 0x6e
+static constexpr char16_t pm_data[] = {
+0x50, 0x4d, 0x6e, 0x6d, 0x2e, 0x61, 0x2e, 0x6b, 0x45, 0x57, 0x65, 0x20,
+0x70, 0x61, 0x73, 0x64, 0x69, 0x74, 0x65, 0x73, 0x12a8, 0x1230, 0x12d3, 0x1275,
+0x645, 0x985, 0x9aa, 0x9f0, 0x9be, 0x9b9, 0x9cd, 0x9a8, 0x64, 0x65, 0x20, 0x6c,
+0x61, 0x20, 0x74, 0x61, 0x72, 0x64, 0x65, 0x69, 0x63, 0x68, 0x61, 0x6d,
+0x74, 0x68, 0x69, 0x41f, 0x41c, 0x63, 0x25b, 0x25b, 0x301, 0x6e, 0x6b, 0x6f,
+0x49, 0x20, 0x253, 0x75, 0x67, 0x61, 0x6a, 0x254, 0x70, 0x61, 0x6b, 0x61,
+0x73, 0x75, 0x62, 0x61, 0x70, 0x61, 0x6d, 0x75, 0x6e, 0x79, 0x69, 0x938,
+0x93e, 0x902, 0x91d, 0x92c, 0x947, 0x932, 0x93e, 0x938, 0x947, 0x70, 0x6f, 0x70,
+0x6f, 0x64, 0x6e, 0x65, 0x43f, 0x43e, 0x441, 0x43b, 0x438, 0x458, 0x435, 0x20,
+0x43f, 0x43e, 0x434, 0x43d, 0x435, 0x47, 0x2e, 0x4d, 0x2e, 0x441, 0x43b, 0x2e,
+0x43e, 0x431, 0x2e, 0x100a, 0x1014, 0x1031, 0x4e0b, 0x5348, 0x70, 0x2e, 0xa0, 0x6d,
+0x2e, 0x1e0c, 0x65, 0x66, 0x66, 0x69, 0x72, 0x20, 0x61, 0x7a, 0x61, 0x62f,
+0x2e, 0x646, 0x13d2, 0x13af, 0x13f1, 0x13a2, 0x13d7, 0x13e2, 0x55, 0x68, 0x72, 0x20,
+0x6e, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x61, 0x63, 0x68, 0x73,
+0x70, 0x2e, 0x6d, 0x2e, 0x6f, 0x64, 0x70, 0x2e, 0x926, 0x92a, 0x948, 0x939,
+0x930, 0x20, 0x92c, 0x93e, 0x926, 0x65, 0x62, 0x79, 0xe1, 0x6d, 0x75, 0xf55,
+0xfb1, 0xf72, 0xf0b, 0xf46, 0xf0b, 0x55, 0x54, 0xd801, 0xdc11, 0xd801, 0xdc23, 0x70,
+0x6d, 0xd801, 0xdc50, 0xd801, 0xdc65, 0x70, 0x74, 0x6d, 0x263, 0x65, 0x74, 0x72,
+0x254, 0x6e, 0x67, 0x259, 0x67, 0xf3, 0x67, 0x259, 0x6c, 0x65, 0x69, 0x70,
+0x2e, 0x73, 0x6f, 0x69, 0x72, 0x6b, 0x69, 0x6b, 0x69, 0x69, 0x257, 0x65,
+0xd83a, 0xdd07, 0xd83a, 0xdd0e, 0x3bc, 0x2e, 0x3bc, 0x2e, 0x4d, 0x6f, 0x67, 0x59,
+0x61, 0x6d, 0x6d, 0x61, 0x5d0, 0x5d7, 0x5d4, 0x5f4, 0x5e6, 0x64, 0x75, 0x2e,
+0x65, 0x2e, 0x68, 0x2e, 0x4e, 0x2019, 0x61, 0x62, 0x61, 0x6c, 0x69, 0x65,
+0x70, 0x2e, 0x70, 0x6f, 0x73, 0x20, 0x6d, 0x69, 0x64, 0xed, 0x69, 0x2e,
+0x6e, 0x2e, 0x5348, 0x5f8c, 0x57, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x20, 0x74,
+0x6d, 0x65, 0x64, 0x64, 0x69, 0x74, 0x6b, 0x6f, 0x6f, 0x73, 0x6b, 0x6f,
+0x6c, 0x69, 0x6e, 0x79, 0x128, 0x79, 0x61, 0x77, 0x129, 0x6f, 0x6f, 0xc85,
+0xcaa, 0xcb0, 0xcbe, 0xcb9, 0xccd, 0xca8, 0x67e, 0x6cc, 0x20, 0x627, 0x6cc, 0x645,
+0x92a, 0x940, 0x20, 0x90f, 0x92e, 0x48, 0x77, 0x61, 0x129, 0x2d, 0x69, 0x6e,
+0x129, 0x938, 0x93e, 0x902, 0x91c, 0xc624, 0xd6c4, 0x41, 0x6c, 0x75, 0x75, 0x6c,
+0x61, 0x50, 0x4e, 0x6b, 0x75, 0x67, 0xfa, 0x442, 0x4af, 0x448, 0x442, 0x4e9,
+0x43d, 0x20, 0x43a, 0x438, 0x439, 0x438, 0x43d, 0x43a, 0x438, 0x4d, 0x55, 0x55,
+0xeab, 0xebc, 0xeb1, 0xe87, 0xe97, 0xec8, 0xebd, 0xe87, 0x70, 0x113, 0x63, 0x70,
+0x75, 0x73, 0x64, 0x69, 0x65, 0x6e, 0x101, 0x6d, 0x70, 0xf3, 0x6b, 0x77,
+0x61, 0x70, 0x6f, 0x70, 0x69, 0x65, 0x74, 0x77, 0xf3, 0x74, 0x70, 0x6f,
+0x142, 0x64, 0x6e, 0x6a, 0x61, 0x44, 0x69, 0x6c, 0x6f, 0x6c, 0x6f, 0x4f,
+0x54, 0x6e, 0x6f, 0x6d, 0xeb, 0x74, 0x74, 0x65, 0x73, 0x43f, 0x43e, 0x43f,
+0x43b, 0x2e, 0x6b, 0x79, 0x69, 0x75, 0x6b, 0x6f, 0x6e, 0x79, 0x69, 0x6d,
+0x63, 0x68, 0x6f, 0x63, 0x68, 0x69, 0x6c, 0x2019, 0x6c, 0x43, 0x68, 0x69,
+0x6c, 0x6f, 0x50, 0x54, 0x47, 0x9aa, 0x9bf, 0x20, 0x98f, 0x9ae, 0x190, 0x6e,
+0x64, 0xe1, 0x6d, 0xe2, 0x168, 0x47, 0x4af, 0x2e, 0x445, 0x2e, 0x1826, 0x1802,
+0x20, 0x182c, 0x1823, 0x6c, 0x69, 0x6c, 0x6c, 0x69, 0x1c3, 0x75, 0x69, 0x61,
+0x73, 0x905, 0x92a, 0x930, 0x93e, 0x939, 0x94d, 0x928, 0x6e, 0x63, 0x77, 0xf2,
+0x6e, 0x7a, 0xe9, 0x6d, 0x14b, 0x6b, 0x61, 0x20, 0x6d, 0x62, 0x254, 0x301,
+0x74, 0x20, 0x6e, 0x6a, 0x69, 0x46, 0x1ecd, 0x20, 0xed, 0x76, 0x6e, 0x69,
+0x6e, 0x7e5, 0x65, 0x61, 0x68, 0x6b, 0x65, 0x74, 0x62, 0x65, 0x61, 0x69,
+0x76, 0x65, 0x74, 0x65, 0x2e, 0x6d, 0x2e, 0x54, 0x14a, 0x57, 0x42, 0x4d5,
+0x43c, 0x431, 0x438, 0x441, 0x431, 0x43e, 0x43d, 0x44b, 0x20, 0x444, 0x4d5, 0x441,
+0x442, 0x4d5, 0x63a, 0x2e, 0x648, 0x2e, 0x628, 0x639, 0x62f, 0x627, 0x632, 0x638,
+0x647, 0x631, 0x64, 0x61, 0x20, 0x74, 0x61, 0x72, 0x64, 0x65, 0x70, 0x61,
+0x20, 0x70, 0x75, 0x73, 0x73, 0x69, 0x64, 0x65, 0x69, 0x6e, 0x61, 0x6e,
+0xa2c, 0xa3e, 0x2e, 0xa26, 0xa41, 0x2e, 0x6b, 0x69, 0x6e, 0x67, 0x6f, 0x74,
+0x6f, 0x5a, 0x2e, 0x4d, 0x57, 0x2e, 0x42d, 0x41a, 0x54, 0x65, 0x69, 0x70,
+0x61, 0x4c, 0x4b, 0x50, 0x61, 0x73, 0x68, 0x61, 0x6d, 0x69, 0x68, 0x65,
+0x1c67, 0x1c64, 0x1c6b, 0x1c5f, 0x1c79, 0x43f, 0x43e, 0x20, 0x43f, 0x43e, 0x434, 0x43d,
+0x435, 0x70, 0x6f, 0x20, 0x70, 0x6f, 0x64, 0x6e, 0x65, 0x6e, 0x79, 0x69,
+0x61, 0x67, 0x68, 0x75, 0x6f, 0xa06f, 0xa2d2, 0x70, 0x6f, 0x20, 0x70, 0x6f,
+0x142, 0x65, 0x64, 0x6e, 0x69, 0x75, 0x645, 0x646, 0x62c, 0x647, 0x646, 0x62f,
+0x60c, 0x20, 0x634, 0x627, 0x645, 0x936, 0x93e, 0x92e, 0x20, 0x91c, 0x93e, 0xdb4,
+0x2e, 0xdc0, 0x2e, 0x70, 0x6f, 0x70, 0x2e, 0x45, 0x69, 0x67, 0x75, 0x6c,
+0x6f, 0x47, 0x44, 0x2d5c, 0x2d30, 0x2d37, 0x2d33, 0x2d33, 0x2d6f, 0x2d30, 0x2d5c, 0x65,
+0x6d, 0x61, 0x6d, 0x20, 0x4e, 0x61, 0x6d, 0x69, 0x74, 0x74, 0x61, 0x67,
+0x70f, 0x712, 0x71b, 0x200c, 0x74, 0x61, 0x64, 0x67, 0x67, 0x2b7, 0x61, 0x74,
+0x6c, 0x75, 0x6d, 0x61, 0x20, 0x6c, 0x77, 0x61, 0x20, 0x70, 0xbaa, 0xbbf,
+0xbb1, 0xbcd, 0xbaa, 0xb95, 0xbb2, 0xbcd, 0x5a, 0x61, 0x61, 0x72, 0x69, 0x6b,
+0x61, 0x79, 0x20, 0x62, 0x45, 0x62, 0x6f, 0x6e, 0x67, 0x69, 0xe2b, 0xe25,
+0xe31, 0xe07, 0xe40, 0xe17, 0xe35, 0xe48, 0xe22, 0xe07, 0xf55, 0xfb1, 0xf72, 0xf0b,
+0xf51, 0xfb2, 0xf7c, 0xf0b, 0x12f5, 0x2e, 0x1240, 0x2e, 0x65, 0x66, 0x69, 0x61,
+0x66, 0x69, 0xd6, 0x53, 0x67, 0xfc, 0x6e, 0x6f, 0x72, 0x74, 0x61, 0x64,
+0x61, 0x6e, 0x20, 0x73, 0x6f, 0x148, 0x43f, 0x43f, 0x70, 0x6f, 0x70, 0x6f,
+0x142, 0x64, 0x6e, 0x6a, 0x75, 0x686, 0x6c8, 0x634, 0x62a, 0x649, 0x646, 0x20,
+0x643, 0x6d0, 0x64a, 0x649, 0x646, 0x54, 0x4b, 0x422, 0x41a, 0x43, 0x48, 0x79,
+0x68, 0x4e, 0x67, 0x6f, 0x6b, 0x69, 0x73, 0x25b, 0x301, 0x6e, 0x64, 0x25b,
+0x5e0, 0x5d0, 0x5b8, 0x5db, 0x5de, 0x5d9, 0x5d8, 0x5d0, 0x5b8, 0x5d2, 0x1ecc, 0x300,
+0x73, 0xe1, 0x6e, 0x186, 0x300, 0x73, 0xe1, 0x6e, 0x62, 0x61, 0x6e, 0x72,
+0x69, 0x6e, 0x67, 0x7a, 0x67, 0x76, 0x61, 0x71, 0x938, 0x93e, 0x902, 0x92e,
+0x70, 0x69, 0x20, 0x70, 0x69, 0x6e, 0x69, 0x20, 0x73, 0x75, 0x6e, 0x6f,
+0x28a, 0x73, 0x68, 0x69, 0x6c, 0xe8, 0x20, 0x6b, 0x28a, 0x73, 0x61, 0x73,
+0x28a, 0x926, 0x92a, 0x947, 0x939, 0x930, 0x93e, 0x2f, 0x938, 0x902, 0x91c, 0x93e
};
-static const char16_t currency_symbol_data[] = {
-0x20be, 0x52, 0x24, 0x46, 0x43, 0x46, 0x41, 0x47, 0x48, 0x20b5, 0x4c, 0x65, 0x6b, 0xeb, 0x20ac, 0x64, 0x65, 0x6e, 0x1265, 0x122d,
-0x62c, 0x2e, 0x645, 0x2e, 0x200f, 0x62f, 0x2e, 0x62c, 0x2e, 0x200f, 0x62f, 0x2e, 0x628, 0x2e, 0x200f, 0x46, 0x64, 0x6a, 0x4e, 0x66,
-0x6b, 0x62f, 0x2e, 0x639, 0x2e, 0x200f, 0x20aa, 0x62f, 0x2e, 0x623, 0x2e, 0x200f, 0x62f, 0x2e, 0x643, 0x2e, 0x200f, 0x644, 0x2e, 0x644,
-0x2e, 0x200f, 0x62f, 0x2e, 0x644, 0x2e, 0x200f, 0x623, 0x2e, 0x645, 0x2e, 0x62f, 0x2e, 0x645, 0x2e, 0x200f, 0x631, 0x2e, 0x639, 0x2e,
-0x200f, 0x631, 0x2e, 0x642, 0x2e, 0x200f, 0x631, 0x2e, 0x633, 0x2e, 0x200f, 0x53, 0xa3, 0x62c, 0x2e, 0x633, 0x2e, 0x644, 0x2e, 0x633,
-0x2e, 0x200f, 0x62f, 0x2e, 0x62a, 0x2e, 0x200f, 0x62f, 0x2e, 0x625, 0x2e, 0x200f, 0x631, 0x2e, 0x64a, 0x2e, 0x200f, 0x58f, 0x20b9, 0x54,
-0x53, 0x68, 0x20a6, 0x20bc, 0x46, 0x202f, 0x43, 0x46, 0x41, 0x9f3, 0x20bd, 0x42, 0x72, 0x4b, 0x4b, 0x4d, 0x41a, 0x41c, 0x43b, 0x432,
-0x2e, 0x48, 0x4b, 0x24, 0xffe5, 0x20b1, 0x55, 0x53, 0x24, 0x55, 0x53, 0x68, 0xa5, 0x4d, 0x4f, 0x50, 0x24, 0x6b, 0x6e, 0x4b,
-0x10d, 0x6b, 0x72, 0x2e, 0x41, 0x66, 0x6c, 0x2e, 0x4e, 0x41, 0x66, 0x2e, 0x4e, 0x75, 0x2e, 0x4b, 0x73, 0x68, 0x46, 0x42,
-0x75, 0x45, 0x44, 0x41, 0x72, 0x4d, 0x4b, 0x52, 0x4d, 0x52, 0x73, 0x52, 0x46, 0x57, 0x53, 0x24, 0x53, 0x52, 0x54, 0x24,
-0x41, 0x45, 0x44, 0x56, 0x54, 0x46, 0x43, 0x46, 0x50, 0x46, 0x47, 0x55, 0x4d, 0x4d, 0x41, 0x44, 0x43, 0x48, 0x46, 0x4c,
-0x53, 0x44, 0x54, 0xd83a, 0xdd05, 0xd83a, 0xdd0a, 0xd83a, 0xdd00, 0xd83a, 0xdd0a, 0xd83a, 0xdd05, 0xd83a, 0xdd0a, 0xd83a, 0xdd00, 0x20b2, 0x46, 0x74,
-0x49, 0x53, 0x4b, 0x52, 0x70, 0x43, 0x41, 0x24, 0x200b, 0x20b8, 0x17db, 0x51, 0x20a9, 0x4b, 0x50, 0x57, 0x20ba, 0x441, 0x43e, 0x43c,
-0x20ad, 0x4b, 0x7a, 0x434, 0x435, 0x43d, 0x2e, 0x4d, 0x54, 0x6e, 0x49, 0x52, 0x52, 0x20ae, 0x43, 0x4e, 0xa5, 0x928, 0x947, 0x930,
-0x942, 0x60b, 0x631, 0x6cc, 0x627, 0x644, 0x7a, 0x142, 0x44, 0x62, 0x53, 0x2f, 0x42, 0x73, 0x52, 0x4f, 0x4e, 0x20b4, 0x52, 0x53,
-0x44, 0xdbb, 0xdd4, 0x2e, 0x20a1, 0x52, 0x44, 0x24, 0x43, 0x24, 0x42, 0x2f, 0x2e, 0x47, 0x73, 0x2e, 0x42, 0x73, 0x2e, 0x53,
-0x20ab, 0x441, 0x43e, 0x43c, 0x2e, 0x52, 0x73, 0x2e, 0x4e, 0x54, 0x24, 0xe3f, 0x54, 0x4d, 0x54, 0x73, 0x6f, 0x2bb, 0x6d, 0x441,
-0x45e, 0x43c
+static constexpr char16_t currency_symbol_data[] = {
+0x20be, 0x42, 0x72, 0x46, 0x64, 0x6a, 0x4e, 0x66, 0x6b, 0x52, 0x24, 0x46,
+0x43, 0x46, 0x41, 0x47, 0x48, 0x20b5, 0x4c, 0x65, 0x6b, 0xeb, 0x20ac, 0x64,
+0x65, 0x6e, 0x1265, 0x122d, 0x62c, 0x2e, 0x645, 0x2e, 0x200f, 0x62f, 0x2e, 0x62c,
+0x2e, 0x200f, 0x62f, 0x2e, 0x628, 0x2e, 0x200f, 0x62f, 0x2e, 0x639, 0x2e, 0x200f,
+0x20aa, 0x62f, 0x2e, 0x623, 0x2e, 0x200f, 0x62f, 0x2e, 0x643, 0x2e, 0x200f, 0x644,
+0x2e, 0x644, 0x2e, 0x200f, 0x62f, 0x2e, 0x644, 0x2e, 0x200f, 0x623, 0x2e, 0x645,
+0x2e, 0x62f, 0x2e, 0x645, 0x2e, 0x200f, 0x631, 0x2e, 0x639, 0x2e, 0x200f, 0x631,
+0x2e, 0x642, 0x2e, 0x200f, 0x631, 0x2e, 0x633, 0x2e, 0x200f, 0x53, 0xa3, 0x62c,
+0x2e, 0x633, 0x2e, 0x644, 0x2e, 0x633, 0x2e, 0x200f, 0x62f, 0x2e, 0x62a, 0x2e,
+0x200f, 0x62f, 0x2e, 0x625, 0x2e, 0x200f, 0x631, 0x2e, 0x64a, 0x2e, 0x200f, 0x58f,
+0x20b9, 0x54, 0x53, 0x68, 0x20a6, 0x20bc, 0x20ba, 0x46, 0x202f, 0x43, 0x46, 0x41,
+0x9f3, 0x20bd, 0x4b, 0x4b, 0x4d, 0x41a, 0x41c, 0x43b, 0x432, 0x2e, 0x48, 0x4b,
+0x24, 0xffe5, 0x20b1, 0x55, 0x53, 0x68, 0xa5, 0x4d, 0x4f, 0x50, 0x24, 0x45,
+0x55, 0x52, 0x4b, 0x10d, 0x6b, 0x72, 0x2e, 0x783, 0x2e, 0x41, 0x66, 0x6c,
+0x2e, 0x4e, 0x41, 0x66, 0x2e, 0x4e, 0x75, 0x2e, 0x4b, 0x73, 0x68, 0x55,
+0x53, 0x24, 0x46, 0x42, 0x75, 0x44, 0x52, 0x70, 0x41, 0x72, 0x4d, 0x4b,
+0x52, 0x4d, 0x52, 0x66, 0x52, 0x73, 0x52, 0x46, 0x57, 0x53, 0x24, 0x53,
+0x52, 0x54, 0x24, 0x56, 0x54, 0x44, 0x41, 0x46, 0x43, 0x46, 0x50, 0x46,
+0x47, 0x55, 0x4d, 0x4c, 0x53, 0x44, 0x54, 0xd83a, 0xdd05, 0xd83a, 0xdd0a, 0xd83a,
+0xdd00, 0xd83a, 0xdd0a, 0xd83a, 0xdd05, 0xd83a, 0xdd0a, 0xd83a, 0xdd00, 0x20b2, 0x46, 0x74,
+0x43, 0x41, 0x24, 0x200b, 0x20b8, 0x17db, 0x51, 0x20a9, 0x43, 0x4e, 0xa5, 0x441,
+0x43e, 0x43c, 0x20ad, 0x4b, 0x7a, 0x434, 0x435, 0x43d, 0x2e, 0x4d, 0x54, 0x6e,
+0x20ae, 0x928, 0x947, 0x930, 0x942, 0x7ff, 0x60b, 0x631, 0x6cc, 0x627, 0x644, 0x7a,
+0x142, 0x44, 0x62, 0x53, 0x2f, 0x42, 0x73, 0x6c, 0x65, 0x69, 0x20b4, 0xdbb,
+0xdd4, 0x2e, 0x20a1, 0x52, 0x44, 0x24, 0x43, 0x24, 0x42, 0x2f, 0x2e, 0x47,
+0x73, 0x2e, 0x42, 0x73, 0x2e, 0x53, 0x20ab, 0x441, 0x43e, 0x43c, 0x2e, 0x52,
+0x73, 0x2e, 0x4e, 0x54, 0x24, 0xe3f, 0x73, 0x6f, 0x2bb, 0x6d, 0x441, 0x45e,
+0x43c
};
-static const char16_t currency_display_name_data[] = {
-0x53, 0x75, 0x69, 0x64, 0x2d, 0x41, 0x66, 0x72, 0x69, 0x6b, 0x61, 0x61, 0x6e, 0x73, 0x65, 0x20, 0x72, 0x61, 0x6e, 0x64,
-0x4e, 0x61, 0x6d, 0x69, 0x62, 0x69, 0x65, 0x73, 0x65, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x43, 0x46, 0x41, 0x20,
-0x46, 0xe0, 0x6c, 0xe2, 0x14b, 0x20, 0x42, 0x45, 0x41, 0x43, 0x47, 0x68, 0x61, 0x6e, 0x61, 0x20, 0x53, 0x69, 0x64, 0x69,
-0x4c, 0x65, 0x6b, 0x75, 0x20, 0x73, 0x68, 0x71, 0x69, 0x70, 0x74, 0x61, 0x72, 0x45, 0x75, 0x72, 0x6f, 0x6a, 0x61, 0x44,
-0x65, 0x6e, 0x61, 0x72, 0x69, 0x20, 0x6d, 0x61, 0x71, 0x65, 0x64, 0x6f, 0x6e, 0x61, 0x73, 0x12e8, 0x12a2, 0x1275, 0x12ee, 0x1335,
-0x12eb, 0x20, 0x1265, 0x122d, 0x62c, 0x646, 0x64a, 0x647, 0x20, 0x645, 0x635, 0x631, 0x64a, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x62c,
-0x632, 0x627, 0x626, 0x631, 0x64a, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x628, 0x62d, 0x631, 0x64a, 0x646, 0x64a, 0x641, 0x631, 0x646,
-0x643, 0x20, 0x648, 0x633, 0x637, 0x20, 0x623, 0x641, 0x631, 0x64a, 0x642, 0x64a, 0x641, 0x631, 0x646, 0x643, 0x20, 0x62c, 0x632, 0x631,
-0x20, 0x627, 0x644, 0x642, 0x645, 0x631, 0x641, 0x631, 0x646, 0x643, 0x20, 0x62c, 0x64a, 0x628, 0x648, 0x62a, 0x64a, 0x646, 0x627, 0x643,
-0x641, 0x627, 0x20, 0x623, 0x631, 0x64a, 0x62a, 0x631, 0x64a, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x639, 0x631, 0x627, 0x642, 0x64a,
-0x634, 0x64a, 0x643, 0x644, 0x20, 0x625, 0x633, 0x631, 0x627, 0x626, 0x64a, 0x644, 0x64a, 0x20, 0x62c, 0x62f, 0x64a, 0x62f, 0x62f, 0x64a,
-0x646, 0x627, 0x631, 0x20, 0x623, 0x631, 0x62f, 0x646, 0x64a, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x643, 0x648, 0x64a, 0x62a, 0x64a,
-0x62c, 0x646, 0x64a, 0x647, 0x20, 0x644, 0x628, 0x646, 0x627, 0x646, 0x64a, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x644, 0x64a, 0x628,
-0x64a, 0x623, 0x648, 0x642, 0x64a, 0x629, 0x20, 0x645, 0x648, 0x631, 0x64a, 0x62a, 0x627, 0x646, 0x64a, 0x629, 0x62f, 0x631, 0x647, 0x645,
-0x20, 0x645, 0x63a, 0x631, 0x628, 0x64a, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x639, 0x645, 0x627, 0x646, 0x64a, 0x631, 0x64a, 0x627, 0x644,
-0x20, 0x642, 0x637, 0x631, 0x64a, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x633, 0x639, 0x648, 0x62f, 0x64a, 0x634, 0x644, 0x646, 0x20, 0x635,
-0x648, 0x645, 0x627, 0x644, 0x64a, 0x62c, 0x646, 0x64a, 0x647, 0x20, 0x62c, 0x646, 0x648, 0x628, 0x20, 0x627, 0x644, 0x633, 0x648, 0x62f,
-0x627, 0x646, 0x62c, 0x646, 0x64a, 0x647, 0x20, 0x633, 0x648, 0x62f, 0x627, 0x646, 0x64a, 0x644, 0x64a, 0x631, 0x629, 0x20, 0x633, 0x648,
-0x631, 0x64a, 0x629, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x62a, 0x648, 0x646, 0x633, 0x64a, 0x62f, 0x631, 0x647, 0x645, 0x20, 0x625,
-0x645, 0x627, 0x631, 0x627, 0x62a, 0x64a, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x64a, 0x645, 0x646, 0x64a, 0x570, 0x561, 0x575, 0x56f, 0x561,
-0x56f, 0x561, 0x576, 0x20, 0x564, 0x580, 0x561, 0x574, 0x9ad, 0x9be, 0x9f0, 0x9a4, 0x9c0, 0x9af, 0x9bc, 0x20, 0x9f0, 0x9c1, 0x9aa, 0x9c0,
-0x65, 0x75, 0x72, 0x6f, 0x73, 0x68, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x79, 0x61, 0x20, 0x54, 0x61, 0x6e, 0x64,
-0x68, 0x61, 0x6e, 0x69, 0x61, 0x41, 0x7a, 0x259, 0x72, 0x62, 0x61, 0x79, 0x63, 0x61, 0x6e, 0x20, 0x4d, 0x61, 0x6e, 0x61,
-0x74, 0x131, 0x43c, 0x430, 0x43d, 0x430, 0x442, 0x66, 0x72, 0xe1, 0x14b, 0x73, 0x65, 0x66, 0x61, 0x20, 0x46, 0x72, 0x61, 0x14b,
-0x20, 0x28, 0x42, 0x43, 0x45, 0x41, 0x4f, 0x29, 0x9ac, 0x9be, 0x982, 0x9b2, 0x9be, 0x9a6, 0x9c7, 0x9b6, 0x9c0, 0x20, 0x99f, 0x9be,
-0x995, 0x9be, 0x9ad, 0x9be, 0x9b0, 0x9a4, 0x9c0, 0x9af, 0x9bc, 0x20, 0x9b0, 0x9c1, 0x9aa, 0x9bf, 0x46, 0x72, 0x1ce, 0x14b, 0x20, 0x43,
-0x46, 0x41, 0x20, 0x28, 0x42, 0x45, 0x41, 0x43, 0x29, 0x65, 0x75, 0x72, 0x6f, 0x61, 0x431, 0x435, 0x43b, 0x430, 0x440, 0x443,
-0x441, 0x43a, 0x456, 0x20, 0x440, 0x443, 0x431, 0x435, 0x43b, 0x44c, 0x53, 0x68, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x79,
-0x61, 0x20, 0x48, 0x75, 0x74, 0x61, 0x6e, 0x7a, 0x61, 0x6e, 0x69, 0x61, 0x930, 0x93e, 0x902, 0x42, 0x6f, 0x73, 0x61, 0x6e,
-0x73, 0x6b, 0x6f, 0x68, 0x65, 0x72, 0x63, 0x65, 0x67, 0x6f, 0x76, 0x61, 0x10d, 0x6b, 0x61, 0x20, 0x6b, 0x6f, 0x6e, 0x76,
-0x65, 0x72, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x6e, 0x61, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x61, 0x41a, 0x43e, 0x43d, 0x432, 0x435,
-0x440, 0x442, 0x438, 0x431, 0x438, 0x43b, 0x43d, 0x430, 0x20, 0x43c, 0x430, 0x440, 0x43a, 0x430, 0x411, 0x44a, 0x43b, 0x433, 0x430, 0x440,
-0x441, 0x43a, 0x438, 0x20, 0x43b, 0x435, 0x432, 0x1019, 0x103c, 0x1014, 0x103a, 0x1019, 0x102c, 0x20, 0x1000, 0x103b, 0x1015, 0x103a, 0x6e2f, 0x5e63,
-0x4eba, 0x6c11, 0x5e01, 0x50, 0x68, 0x69, 0x6c, 0x69, 0x70, 0x70, 0x69, 0x6e, 0x65, 0x20, 0x50, 0x69, 0x73, 0x6f, 0x44, 0x65,
-0x72, 0x68, 0x65, 0x6d, 0x20, 0x55, 0x6d, 0x65, 0x1e5b, 0x1e5b, 0x75, 0x6b, 0x69, 0x62f, 0x6cc, 0x646, 0x627, 0x631, 0x6cc, 0x20,
-0x639, 0x6ce, 0x631, 0x627, 0x642, 0x6cc, 0x695, 0x6cc, 0x627, 0x6b5, 0x6cc, 0x20, 0x626, 0x6ce, 0x631, 0x627, 0x646, 0x6cc, 0xd804, 0xdd1d,
-0xd804, 0xdd01, 0xd804, 0xdd23, 0xd804, 0xdd18, 0xd804, 0xdd2c, 0xd804, 0xdd25, 0xd804, 0xdd28, 0x20, 0xd804, 0xdd11, 0xd804, 0xdd2c, 0xd804, 0xdd0b, 0xd804,
-0xdd03, 0xd804, 0xdd28, 0xd804, 0xdd1a, 0xd804, 0xdd34, 0xd804, 0xdd18, 0xd804, 0xdd28, 0xd804, 0xdd20, 0xd804, 0xdd1a, 0xd804, 0xdd34, 0x20, 0xd804, 0xdd22,
-0xd804, 0xdd2a, 0xd804, 0xdd1b, 0xd804, 0xdd28, 0x420, 0x43e, 0x441, 0x441, 0x438, 0x439, 0x43d, 0x20, 0x441, 0x43e, 0x43c, 0x55, 0x53, 0x20,
-0x13a0, 0x13d5, 0x13b3, 0x45, 0x73, 0x68, 0x69, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x79, 0x61, 0x20, 0x55, 0x67, 0x61, 0x6e,
-0x64, 0x61, 0x6e2f, 0x5143, 0x6fb3, 0x95e8, 0x5e01, 0x65b0, 0x52a0, 0x5761, 0x5143, 0x6fb3, 0x9580, 0x5143, 0x65b0, 0x53f0, 0x5e63, 0x68, 0x72, 0x76,
-0x61, 0x74, 0x73, 0x6b, 0x61, 0x20, 0x6b, 0x75, 0x6e, 0x61, 0x10d, 0x65, 0x73, 0x6b, 0xe1, 0x20, 0x6b, 0x6f, 0x72, 0x75,
-0x6e, 0x61, 0x64, 0x61, 0x6e, 0x73, 0x6b, 0x20, 0x6b, 0x72, 0x6f, 0x6e, 0x65, 0x92d, 0x93e, 0x930, 0x924, 0x940, 0x20, 0x930,
-0x92a, 0x947, 0x93d, 0x41, 0x72, 0x75, 0x62, 0x61, 0x61, 0x6e, 0x73, 0x65, 0x20, 0x67, 0x75, 0x6c, 0x64, 0x65, 0x6e, 0x41,
-0x6d, 0x65, 0x72, 0x69, 0x6b, 0x61, 0x61, 0x6e, 0x73, 0x65, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x4e, 0x65, 0x64,
-0x65, 0x72, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x2d, 0x41, 0x6e, 0x74, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x61, 0x6e, 0x73, 0x65,
-0x20, 0x67, 0x75, 0x6c, 0x64, 0x65, 0x6e, 0x53, 0x75, 0x72, 0x69, 0x6e, 0x61, 0x61, 0x6d, 0x73, 0x65, 0x20, 0x64, 0x6f,
-0x6c, 0x6c, 0x61, 0x72, 0xf51, 0xf44, 0xf74, 0xf63, 0xf0b, 0xf40, 0xfb2, 0xf58, 0x53, 0x68, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69,
-0x20, 0x79, 0x61, 0x20, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x55, 0x53, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x45, 0x61,
-0x73, 0x74, 0x20, 0x43, 0x61, 0x72, 0x69, 0x62, 0x62, 0x65, 0x61, 0x6e, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x41,
-0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x6e, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x42, 0x61, 0x68, 0x61,
-0x6d, 0x69, 0x61, 0x6e, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x42, 0x61, 0x72, 0x62, 0x61, 0x64, 0x69, 0x61, 0x6e,
-0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x42, 0x65, 0x6c, 0x69, 0x7a, 0x65, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72,
-0x42, 0x65, 0x72, 0x6d, 0x75, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x42, 0x6f, 0x74, 0x73,
-0x77, 0x61, 0x6e, 0x61, 0x6e, 0x20, 0x50, 0x75, 0x6c, 0x61, 0x42, 0x75, 0x72, 0x75, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x20,
-0x46, 0x72, 0x61, 0x6e, 0x63, 0x43, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x20, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x6e,
-0x20, 0x43, 0x46, 0x41, 0x20, 0x46, 0x72, 0x61, 0x6e, 0x63, 0x43, 0x61, 0x6e, 0x61, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x44,
-0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x43, 0x61, 0x79, 0x6d, 0x61, 0x6e, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x20,
-0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x4e, 0x65, 0x77, 0x20, 0x5a, 0x65, 0x61, 0x6c, 0x61, 0x6e, 0x64, 0x20, 0x44, 0x6f,
-0x6c, 0x6c, 0x61, 0x72, 0x44, 0x61, 0x6e, 0x69, 0x73, 0x68, 0x20, 0x4b, 0x72, 0x6f, 0x6e, 0x65, 0x45, 0x72, 0x69, 0x74,
-0x72, 0x65, 0x61, 0x6e, 0x20, 0x4e, 0x61, 0x6b, 0x66, 0x61, 0x53, 0x77, 0x61, 0x7a, 0x69, 0x20, 0x4c, 0x69, 0x6c, 0x61,
-0x6e, 0x67, 0x65, 0x6e, 0x69, 0x46, 0x61, 0x6c, 0x6b, 0x6c, 0x61, 0x6e, 0x64, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64,
-0x73, 0x20, 0x50, 0x6f, 0x75, 0x6e, 0x64, 0x46, 0x69, 0x6a, 0x69, 0x61, 0x6e, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72,
-0x47, 0x61, 0x6d, 0x62, 0x69, 0x61, 0x6e, 0x20, 0x44, 0x61, 0x6c, 0x61, 0x73, 0x69, 0x47, 0x68, 0x61, 0x6e, 0x61, 0x69,
-0x61, 0x6e, 0x20, 0x43, 0x65, 0x64, 0x69, 0x47, 0x69, 0x62, 0x72, 0x61, 0x6c, 0x74, 0x61, 0x72, 0x20, 0x50, 0x6f, 0x75,
-0x6e, 0x64, 0x55, 0x4b, 0x20, 0x50, 0x6f, 0x75, 0x6e, 0x64, 0x47, 0x75, 0x79, 0x61, 0x6e, 0x61, 0x65, 0x73, 0x65, 0x20,
-0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x48, 0x6f, 0x6e, 0x67, 0x20, 0x4b, 0x6f, 0x6e, 0x67, 0x20, 0x44, 0x6f, 0x6c, 0x6c,
-0x61, 0x72, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x52, 0x75, 0x70, 0x65, 0x65, 0x49, 0x73, 0x72, 0x61, 0x65, 0x6c,
-0x69, 0x20, 0x4e, 0x65, 0x77, 0x20, 0x53, 0x68, 0x65, 0x6b, 0x65, 0x6c, 0x4a, 0x61, 0x6d, 0x61, 0x69, 0x63, 0x61, 0x6e,
-0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x6e, 0x20, 0x53, 0x68, 0x69, 0x6c, 0x6c, 0x69,
-0x6e, 0x67, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x20, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x6e, 0x20, 0x52, 0x61, 0x6e, 0x64,
-0x4c, 0x69, 0x62, 0x65, 0x72, 0x69, 0x61, 0x6e, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x4d, 0x61, 0x63, 0x61, 0x6e,
-0x65, 0x73, 0x65, 0x20, 0x50, 0x61, 0x74, 0x61, 0x63, 0x61, 0x4d, 0x61, 0x6c, 0x61, 0x67, 0x61, 0x73, 0x79, 0x20, 0x41,
-0x72, 0x69, 0x61, 0x72, 0x79, 0x4d, 0x61, 0x6c, 0x61, 0x77, 0x69, 0x61, 0x6e, 0x20, 0x4b, 0x77, 0x61, 0x63, 0x68, 0x61,
-0x4d, 0x61, 0x6c, 0x61, 0x79, 0x73, 0x69, 0x61, 0x6e, 0x20, 0x52, 0x69, 0x6e, 0x67, 0x67, 0x69, 0x74, 0x4d, 0x61, 0x75,
-0x72, 0x69, 0x74, 0x69, 0x61, 0x6e, 0x20, 0x52, 0x75, 0x70, 0x65, 0x65, 0x4e, 0x61, 0x6d, 0x69, 0x62, 0x69, 0x61, 0x6e,
-0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x4e, 0x69, 0x67, 0x65, 0x72, 0x69, 0x61, 0x6e, 0x20, 0x4e, 0x61, 0x69, 0x72,
-0x61, 0x50, 0x61, 0x6b, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x69, 0x20, 0x52, 0x75, 0x70, 0x65, 0x65, 0x50, 0x61, 0x70, 0x75,
-0x61, 0x20, 0x4e, 0x65, 0x77, 0x20, 0x47, 0x75, 0x69, 0x6e, 0x65, 0x61, 0x6e, 0x20, 0x4b, 0x69, 0x6e, 0x61, 0x52, 0x77,
-0x61, 0x6e, 0x64, 0x61, 0x6e, 0x20, 0x46, 0x72, 0x61, 0x6e, 0x63, 0x53, 0x74, 0x20, 0x48, 0x65, 0x6c, 0x65, 0x6e, 0x61,
-0x20, 0x50, 0x6f, 0x75, 0x6e, 0x64, 0x53, 0x61, 0x6d, 0x6f, 0x61, 0x6e, 0x20, 0x54, 0x61, 0x6c, 0x61, 0x53, 0x65, 0x79,
-0x63, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x69, 0x73, 0x20, 0x52, 0x75, 0x70, 0x65, 0x65, 0x53, 0x69, 0x65, 0x72, 0x72, 0x61,
-0x20, 0x4c, 0x65, 0x6f, 0x6e, 0x65, 0x61, 0x6e, 0x20, 0x4c, 0x65, 0x6f, 0x6e, 0x65, 0x53, 0x69, 0x6e, 0x67, 0x61, 0x70,
-0x6f, 0x72, 0x65, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x4e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x6c, 0x61, 0x6e, 0x64,
-0x73, 0x20, 0x41, 0x6e, 0x74, 0x69, 0x6c, 0x6c, 0x65, 0x61, 0x6e, 0x20, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x53,
-0x6f, 0x6c, 0x6f, 0x6d, 0x6f, 0x6e, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61,
-0x72, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x20, 0x53, 0x75, 0x64, 0x61, 0x6e, 0x65, 0x73, 0x65, 0x20, 0x50, 0x6f, 0x75, 0x6e,
-0x64, 0x53, 0x75, 0x64, 0x61, 0x6e, 0x65, 0x73, 0x65, 0x20, 0x50, 0x6f, 0x75, 0x6e, 0x64, 0x53, 0x77, 0x65, 0x64, 0x69,
-0x73, 0x68, 0x20, 0x4b, 0x72, 0x6f, 0x6e, 0x61, 0x53, 0x77, 0x69, 0x73, 0x73, 0x20, 0x46, 0x72, 0x61, 0x6e, 0x63, 0x54,
-0x61, 0x6e, 0x7a, 0x61, 0x6e, 0x69, 0x61, 0x6e, 0x20, 0x53, 0x68, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x6e,
-0x67, 0x61, 0x6e, 0x20, 0x50, 0x61, 0x2bb, 0x61, 0x6e, 0x67, 0x61, 0x54, 0x72, 0x69, 0x6e, 0x69, 0x64, 0x61, 0x64, 0x20,
-0x26, 0x20, 0x54, 0x6f, 0x62, 0x61, 0x67, 0x6f, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x55, 0x67, 0x61, 0x6e, 0x64,
-0x61, 0x6e, 0x20, 0x53, 0x68, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x69, 0x74, 0x65, 0x64, 0x20, 0x41, 0x72,
-0x61, 0x62, 0x20, 0x45, 0x6d, 0x69, 0x72, 0x61, 0x74, 0x65, 0x73, 0x20, 0x44, 0x69, 0x72, 0x68, 0x61, 0x6d, 0x42, 0x72,
-0x69, 0x74, 0x69, 0x73, 0x68, 0x20, 0x50, 0x6f, 0x75, 0x6e, 0x64, 0x56, 0x61, 0x6e, 0x75, 0x61, 0x74, 0x75, 0x20, 0x56,
-0x61, 0x74, 0x75, 0x5a, 0x61, 0x6d, 0x62, 0x69, 0x61, 0x6e, 0x20, 0x4b, 0x77, 0x61, 0x63, 0x68, 0x61, 0x67, 0x68, 0x61,
-0x6e, 0x61, 0x20, 0x73, 0x69, 0x256, 0x69, 0x263, 0x65, 0x74, 0x6f, 0x256, 0x6f, 0x66, 0x65, 0x20, 0x61, 0x66, 0x72, 0x69,
-0x6b, 0x61, 0x67, 0x61, 0x20, 0x43, 0x46, 0x41, 0x20, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x42, 0x43, 0x45, 0x41, 0x4f,
-0x46, 0x259, 0x6c, 0xe1, 0x14b, 0x20, 0x43, 0x46, 0x41, 0x20, 0x28, 0x42, 0x45, 0x41, 0x43, 0x29, 0x64, 0x6f, 0x6e, 0x73,
-0x6b, 0x20, 0x6b, 0x72, 0xf3, 0x6e, 0x61, 0x50, 0x69, 0x73, 0x6f, 0x20, 0x6e, 0x67, 0x20, 0x50, 0x69, 0x6c, 0x69, 0x70,
-0x69, 0x6e, 0x61, 0x73, 0x64, 0x69, 0x6e, 0x61, 0x72, 0x20, 0x61, 0x6c, 0x67, 0xe9, 0x72, 0x69, 0x65, 0x6e, 0x66, 0x72,
-0x61, 0x6e, 0x63, 0x20, 0x43, 0x46, 0x41, 0x20, 0x28, 0x42, 0x43, 0x45, 0x41, 0x4f, 0x29, 0x66, 0x72, 0x61, 0x6e, 0x63,
-0x20, 0x62, 0x75, 0x72, 0x75, 0x6e, 0x64, 0x61, 0x69, 0x73, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x43, 0x46, 0x41, 0x20,
-0x28, 0x42, 0x45, 0x41, 0x43, 0x29, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x20, 0x63, 0x61, 0x6e, 0x61, 0x64, 0x69, 0x65,
-0x6e, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x63, 0x6f, 0x6d, 0x6f, 0x72, 0x69, 0x65, 0x6e, 0x66, 0x72, 0x61, 0x6e, 0x63,
-0x20, 0x63, 0x6f, 0x6e, 0x67, 0x6f, 0x6c, 0x61, 0x69, 0x73, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x64, 0x6a, 0x69, 0x62,
-0x6f, 0x75, 0x74, 0x69, 0x65, 0x6e, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x43, 0x46, 0x50, 0x66, 0x72, 0x61, 0x6e, 0x63,
-0x20, 0x67, 0x75, 0x69, 0x6e, 0xe9, 0x65, 0x6e, 0x67, 0x6f, 0x75, 0x72, 0x64, 0x65, 0x20, 0x68, 0x61, 0xef, 0x74, 0x69,
-0x65, 0x6e, 0x6e, 0x65, 0x61, 0x72, 0x69, 0x61, 0x72, 0x79, 0x20, 0x6d, 0x61, 0x6c, 0x67, 0x61, 0x63, 0x68, 0x65, 0x6f,
-0x75, 0x67, 0x75, 0x69, 0x79, 0x61, 0x20, 0x6d, 0x61, 0x75, 0x72, 0x69, 0x74, 0x61, 0x6e, 0x69, 0x65, 0x6e, 0x72, 0x6f,
-0x75, 0x70, 0x69, 0x65, 0x20, 0x6d, 0x61, 0x75, 0x72, 0x69, 0x63, 0x69, 0x65, 0x6e, 0x6e, 0x65, 0x64, 0x69, 0x72, 0x68,
-0x61, 0x6d, 0x20, 0x6d, 0x61, 0x72, 0x6f, 0x63, 0x61, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x72, 0x77, 0x61,
-0x6e, 0x64, 0x61, 0x69, 0x73, 0x72, 0x6f, 0x75, 0x70, 0x69, 0x65, 0x20, 0x64, 0x65, 0x73, 0x20, 0x53, 0x65, 0x79, 0x63,
-0x68, 0x65, 0x6c, 0x6c, 0x65, 0x73, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x73, 0x75, 0x69, 0x73, 0x73, 0x65, 0x6c, 0x69,
-0x76, 0x72, 0x65, 0x20, 0x73, 0x79, 0x72, 0x69, 0x65, 0x6e, 0x6e, 0x65, 0x64, 0x69, 0x6e, 0x61, 0x72, 0x20, 0x74, 0x75,
-0x6e, 0x69, 0x73, 0x69, 0x65, 0x6e, 0x76, 0x61, 0x74, 0x75, 0x20, 0x76, 0x61, 0x6e, 0x75, 0x61, 0x74, 0x75, 0x61, 0x6e,
-0x4d, 0x62, 0x75, 0x75, 0x257, 0x75, 0x20, 0x53, 0x65, 0x65, 0x66, 0x61, 0x61, 0x20, 0x42, 0x43, 0x45, 0x41, 0x4f, 0xd83a,
-0xdd0a, 0xd83a, 0xdd22, 0xd83a, 0xdd2a, 0xd83a, 0xdd22, 0xd83a, 0xdd32, 0x20, 0xd83a, 0xdd05, 0xd83a, 0xdd0a, 0xd83a, 0xdd00, 0x20, 0xd83a, 0xdd16, 0xd83a,
-0xdd2d, 0xd83a, 0xdd45, 0xd83a, 0xdd2a, 0xd83a, 0xdd32, 0xd83a, 0xdd22, 0xd83a, 0xdd44, 0xd83a, 0xdd32, 0xd83a, 0xdd3a, 0xd83a, 0xdd2b, 0x20, 0xd83a, 0xdd00,
-0xd83a, 0xdd2c, 0xd83a, 0xdd2a, 0xd83a, 0xdd2d, 0xd83a, 0xdd33, 0xd83a, 0xdd22, 0xd83a, 0xdd0a, 0xd83a, 0xdd22, 0xd83a, 0xdd2a, 0xd83a, 0xdd22, 0xd83a, 0xdd32,
-0x20, 0xd83a, 0xdd1a, 0xd83a, 0xdd35, 0xd83a, 0xdd26, 0xd83a, 0xdd2e, 0xd83a, 0xdd45, 0xd83a, 0xdd2a, 0xd83a, 0xdd2d, 0x20, 0xd83a, 0xdd00, 0xd83a, 0xdd2c,
-0xd83a, 0xdd2a, 0xd83a, 0xdd2d, 0xd83a, 0xdd33, 0xd83a, 0xdd2d, 0xd83a, 0xdd32, 0xd83a, 0xdd33, 0xd83a, 0xdd2e, 0xd83a, 0xdd01, 0xd83a, 0xdd22, 0xd83a, 0xdd24,
-0xd83a, 0xdd22, 0xd83a, 0xdd27, 0xd83a, 0xdd2d, 0x20, 0xd83a, 0xdd18, 0xd83a, 0xdd22, 0xd83a, 0xdd25, 0xd83a, 0xdd26, 0xd83a, 0xdd2d, 0xd83a, 0xdd32, 0xd83a,
-0xdd33, 0xd83a, 0xdd2e, 0xd83a, 0xdd05, 0xd83a, 0xdd2d, 0xd83a, 0xdd23, 0xd83a, 0xdd2d, 0x20, 0xd83a, 0xdd18, 0xd83a, 0xdd22, 0xd83a, 0xdd32, 0xd83a, 0xdd22,
-0xd83a, 0xdd32, 0xd83a, 0xdd33, 0xd83a, 0xdd2e, 0xd83a, 0xdd0a, 0xd83a, 0xdd22, 0xd83a, 0xdd2a, 0xd83a, 0xdd22, 0xd83a, 0xdd32, 0x20, 0xd83a, 0xdd18, 0xd83a,
-0xdd2d, 0xd83a, 0xdd32, 0xd83a, 0xdd2b, 0xd83a, 0xdd32, 0xd83a, 0xdd33, 0xd83a, 0xdd2e, 0xd83a, 0xdd01, 0xd83a, 0xdd22, 0xd83a, 0xdd24, 0xd83a, 0xdd22, 0x20,
-0xd83a, 0xdd02, 0xd83a, 0xdd2d, 0xd83a, 0xdd26, 0xd83a, 0xdd2b, 0xd83a, 0xdd2a, 0xd83a, 0xdd2d, 0xd83a, 0xdd34, 0xd83a, 0xdd22, 0xd83a, 0xdd32, 0xd83a, 0xdd33,
-0xd83a, 0xdd2e, 0xd83a, 0xdd13, 0xd83a, 0xdd3a, 0xd83a, 0xdd2d, 0xd83a, 0xdd34, 0xd83a, 0xdd22, 0x20, 0xd83a, 0xdd03, 0xd83a, 0xdd2e, 0xd83a, 0xdd2a, 0xd83a,
-0xdd2d, 0xd83a, 0xdd3c, 0xd83a, 0xdd22, 0xd83a, 0xdd32, 0xd83a, 0xdd2d, 0xd83a, 0xdd34, 0xd83a, 0xdd22, 0xd83a, 0xdd32, 0xd83a, 0xdd33, 0xd83a, 0xdd2e, 0xd83a,
-0xdd10, 0xd83a, 0xdd22, 0xd83a, 0xdd34, 0xd83a, 0xdd2a, 0xd83a, 0xdd22, 0x20, 0xd83a, 0xdd10, 0xd83a, 0xdd22, 0xd83a, 0xdd36, 0xd83a, 0xdd2d, 0xd83a, 0xdd2a,
-0xd83a, 0xdd22, 0xd83a, 0xdd34, 0xd83a, 0xdd22, 0xd83a, 0xdd32, 0xd83a, 0xdd33, 0xd83a, 0xdd2e, 0xd83a, 0xdd02, 0xd83a, 0xdd2b, 0xd83a, 0xdd34, 0xd83a, 0xdd2e,
-0xd83a, 0xdd32, 0x20, 0xd83a, 0xdd05, 0xd83a, 0xdd2b, 0xd83a, 0xdd2a, 0xd83a, 0xdd22, 0xd83a, 0xdd24, 0xd83a, 0xdd2d, 0xd83a, 0xdd34, 0xd83a, 0xdd22, 0xd83a,
-0xdd32, 0xd83a, 0xdd33, 0xd83a, 0xdd2e, 0x4d, 0x62, 0x75, 0x75, 0x257, 0x69, 0x20, 0x53, 0x65, 0x65, 0x66, 0x61, 0x61, 0x20, 0x42,
-0x45, 0x41, 0x43, 0x44, 0x61, 0x6c, 0x61, 0x73, 0x69, 0x20, 0x47, 0x61, 0x6d, 0x6d, 0x62, 0x69, 0x44, 0x6f, 0x6c, 0x61,
-0x61, 0x72, 0x20, 0x4c, 0x69, 0x62, 0x65, 0x72, 0x69, 0x79, 0x61, 0x61, 0x55, 0x67, 0x69, 0x79, 0x79, 0x61, 0x20, 0x4d,
-0x75, 0x72, 0x69, 0x74, 0x61, 0x6e, 0x69, 0x4e, 0x61, 0x79, 0x72, 0x61, 0x61, 0x20, 0x4e, 0x69, 0x6a, 0x65, 0x72, 0x69,
-0x79, 0x61, 0x61, 0x4c, 0x65, 0x77, 0x6f, 0x6f, 0x6e, 0x20, 0x53, 0x65, 0x72, 0x61, 0x61, 0x20, 0x4c, 0x69, 0x79, 0x6f,
-0x6e, 0x50, 0x75, 0x6e, 0x6e, 0x64, 0x20, 0x53, 0x61, 0x73, 0x61, 0x6e, 0x6e, 0x61, 0x63, 0x68, 0x53, 0x69, 0x6c, 0x69,
-0x6e, 0x67, 0x69, 0x20, 0x65, 0x79, 0x61, 0x20, 0x59, 0x75, 0x67, 0x61, 0x6e, 0x64, 0x61, 0x10e5, 0x10d0, 0x10e0, 0x10d7, 0x10e3,
-0x10da, 0x10d8, 0x20, 0x10da, 0x10d0, 0x10e0, 0x10d8, 0x53, 0x63, 0x68, 0x77, 0x65, 0x69, 0x7a, 0x65, 0x72, 0x20, 0x46, 0x72, 0x61,
-0x6e, 0x6b, 0x65, 0x6e, 0x395, 0x3c5, 0x3c1, 0x3ce, 0xaad, 0xabe, 0xab0, 0xaa4, 0xac0, 0xaaf, 0x20, 0xab0, 0xac2, 0xaaa, 0xabf, 0xaaf,
-0xabe, 0x4e, 0x61, 0x69, 0x72, 0x61, 0x72, 0x20, 0x4e, 0x61, 0x6a, 0x65, 0x72, 0x69, 0x79, 0x61, 0x53, 0x69, 0x64, 0x69,
-0x20, 0x6e, 0x61, 0x20, 0x47, 0x68, 0x61, 0x6e, 0x61, 0x4b, 0x75, 0x257, 0x69, 0x6e, 0x20, 0x53, 0x65, 0x66, 0x61, 0x20,
-0x6e, 0x61, 0x20, 0x41, 0x66, 0x69, 0x72, 0x6b, 0x61, 0x20, 0x54, 0x61, 0x20, 0x59, 0x61, 0x6d, 0x6d, 0x61, 0x5e9, 0x5e7,
-0x5dc, 0x20, 0x5d7, 0x5d3, 0x5e9, 0x92d, 0x93e, 0x930, 0x924, 0x940, 0x92f, 0x20, 0x930, 0x941, 0x92a, 0x92f, 0x93e, 0x6d, 0x61, 0x67,
-0x79, 0x61, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x69, 0x6e, 0x74, 0xed, 0x73, 0x6c, 0x65, 0x6e, 0x73, 0x6b, 0x20, 0x6b, 0x72,
-0xf3, 0x6e, 0x61, 0x4e, 0x61, 0x1ecb, 0x72, 0x61, 0x52, 0x75, 0x70, 0x69, 0x61, 0x68, 0x20, 0x49, 0x6e, 0x64, 0x6f, 0x6e,
-0x65, 0x73, 0x69, 0x61, 0x50, 0x75, 0x6e, 0x74, 0x20, 0x53, 0x74, 0x65, 0x69, 0x72, 0x6c, 0x69, 0x6e, 0x67, 0x66, 0x72,
-0x61, 0x6e, 0x63, 0x6f, 0x20, 0x73, 0x76, 0x69, 0x7a, 0x7a, 0x65, 0x72, 0x6f, 0x65e5, 0x672c, 0x5186, 0x73, 0x65, 0x65, 0x66,
-0x61, 0x20, 0x79, 0x61, 0x74, 0x69, 0x20, 0x42, 0x43, 0x45, 0x41, 0x4f, 0x53, 0x6b, 0x75, 0x64, 0x75, 0x20, 0x4b, 0x61,
-0x62, 0x75, 0x76, 0x65, 0x72, 0x64, 0x69, 0x61, 0x6e, 0x75, 0x41, 0x64, 0x69, 0x6e, 0x61, 0x72, 0x20, 0x41, 0x7a, 0x7a,
-0x61, 0x79, 0x72, 0x69, 0x46, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x43, 0x46, 0x41, 0x64, 0x61, 0x6e, 0x6d, 0x61, 0x72, 0x6b,
-0x69, 0x6d, 0x75, 0x74, 0x20, 0x6b, 0x6f, 0x72, 0x75, 0x75, 0x6e, 0x69, 0x53, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69, 0x74,
-0x61, 0x62, 0x20, 0x79, 0x61, 0x20, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x53, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x79,
-0x61, 0x20, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0xcad, 0xcbe, 0xcb0, 0xca4, 0xcc0, 0xcaf, 0x20, 0xcb0, 0xcc2, 0xcaa, 0xcbe, 0xcaf, 0xcbf,
-0x6c1, 0x650, 0x646, 0x62f, 0x64f, 0x633, 0x62a, 0x672, 0x646, 0x6cd, 0x20, 0x631, 0x6c4, 0x67e, 0x64e, 0x6d2, 0x49a, 0x430, 0x437, 0x430,
-0x49b, 0x441, 0x442, 0x430, 0x43d, 0x20, 0x442, 0x435, 0x4a3, 0x433, 0x435, 0x441, 0x456, 0x179a, 0x17c0, 0x179b, 0x200b, 0x1780, 0x1798, 0x17d2,
-0x1796, 0x17bb, 0x1787, 0x17b6, 0x43, 0x69, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x79, 0x61, 0x20, 0x4b, 0x65, 0x6e, 0x79, 0x61,
-0xb300, 0xd55c, 0xbbfc, 0xad6d, 0x20, 0xc6d0, 0xc870, 0xc120, 0x20, 0xbbfc, 0xc8fc, 0xc8fc, 0xc758, 0x20, 0xc778, 0xbbfc, 0x20, 0xacf5, 0xd654, 0xad6d,
-0x20, 0xc6d0, 0x43, 0x46, 0x41, 0x20, 0x46, 0x72, 0x61, 0x14b, 0x20, 0x28, 0x42, 0x43, 0x45, 0x41, 0x4f, 0x29, 0x46, 0x72,
-0x61, 0x14b, 0x20, 0x43, 0x46, 0x41, 0x20, 0x42, 0x45, 0x41, 0x43, 0x41a, 0x44b, 0x440, 0x433, 0x44b, 0x437, 0x441, 0x442, 0x430,
-0x43d, 0x20, 0x441, 0x43e, 0x43c, 0x443, 0x53, 0x68, 0x69, 0x6c, 0xed, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x79, 0x61, 0x20, 0x54,
-0x61, 0x61, 0x6e, 0x73, 0x61, 0x6e, 0xed, 0x61, 0xea5, 0xeb2, 0xea7, 0x20, 0xe81, 0xeb5, 0xe9a, 0x65, 0x69, 0x72, 0x6f, 0x46,
-0x61, 0x6c, 0xe1, 0x6e, 0x67, 0x61, 0x20, 0x79, 0x61, 0x20, 0x4b, 0x6f, 0x6e, 0x67, 0xf3, 0x4b, 0x77, 0x61, 0x6e, 0x7a,
-0x61, 0x20, 0x79, 0x61, 0x20, 0x41, 0x6e, 0x67, 0xf3, 0x6c, 0x61, 0x46, 0x61, 0x6c, 0xe1, 0x6e, 0x67, 0x61, 0x20, 0x43,
-0x46, 0x41, 0x20, 0x42, 0x45, 0x41, 0x43, 0x45, 0x75, 0x72, 0x61, 0x73, 0x4e, 0x66, 0x61, 0x6c, 0x61, 0x6e, 0x67, 0x61,
-0x20, 0x77, 0x61, 0x20, 0x4b, 0x6f, 0x6e, 0x67, 0x75, 0x53, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x6d, 0x61, 0x72, 0x20,
-0x4b, 0x65, 0x6e, 0x79, 0x61, 0x53, 0x69, 0x72, 0x69, 0x6e, 0x6a, 0x69, 0x20, 0x79, 0x61, 0x20, 0x4b, 0x65, 0x6e, 0x79,
-0x61, 0x41c, 0x430, 0x43a, 0x435, 0x434, 0x43e, 0x43d, 0x441, 0x43a, 0x438, 0x20, 0x434, 0x435, 0x43d, 0x430, 0x440, 0x53, 0x68, 0x69,
-0x6c, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x79, 0x61, 0x20, 0x54, 0x61, 0x6e, 0x7a, 0x61, 0x6e, 0x69, 0x61, 0xd07, 0xd28, 0xd4d,
-0xd24, 0xd4d, 0xd2f, 0xd7b, 0x20, 0xd30, 0xd42, 0xd2a, 0x52, 0x69, 0x6e, 0x67, 0x67, 0x69, 0x74, 0x20, 0x4d, 0x61, 0x6c, 0x61,
-0x79, 0x73, 0x69, 0x61, 0x44, 0x6f, 0x6c, 0x61, 0x72, 0x20, 0x42, 0x72, 0x75, 0x6e, 0x65, 0x69, 0x44, 0x6f, 0x6c, 0x61,
-0x72, 0x20, 0x53, 0x69, 0x6e, 0x67, 0x61, 0x70, 0x75, 0x72, 0x61, 0x65, 0x77, 0x72, 0x6f, 0x987, 0x9a8, 0x9cd, 0x9a6, 0x9bf,
-0x9af, 0x9bc, 0x9be, 0x9a8, 0x20, 0x9b0, 0x9c1, 0x9aa, 0x9c0, 0x54, 0x101, 0x72, 0x61, 0x20, 0x6f, 0x20, 0x41, 0x6f, 0x74, 0x65,
-0x61, 0x72, 0x6f, 0x61, 0x49, 0x72, 0x6f, 0x70, 0x69, 0x79, 0x69, 0x61, 0x6e, 0xed, 0x20, 0x65, 0x20, 0x4b, 0x65, 0x6e,
-0x79, 0x61, 0x49, 0x72, 0x6f, 0x70, 0x69, 0x79, 0x69, 0x61, 0x6e, 0xed, 0x20, 0x65, 0x20, 0x54, 0x61, 0x6e, 0x7a, 0x61,
-0x6e, 0x69, 0x61, 0x627, 0x6cc, 0x631, 0x627, 0x646, 0x20, 0x631, 0x6cc, 0x627, 0x644, 0x73, 0x68, 0x69, 0x72, 0xe8, 0x41c, 0x43e,
-0x43d, 0x433, 0x43e, 0x43b, 0x20, 0x442, 0x4e9, 0x433, 0x440, 0x4e9, 0x433, 0x72, 0x6f, 0x75, 0x70, 0x69, 0x20, 0x6d, 0x6f, 0x72,
-0x69, 0x73, 0x69, 0x65, 0x6e, 0x73, 0x6f, 0x6c, 0x61, 0x69, 0x20, 0x42, 0x45, 0x41, 0x43, 0x4e, 0x61, 0x6d, 0x69, 0x62,
-0x69, 0x61, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x69, 0x928, 0x947, 0x92a, 0x93e, 0x932, 0x940, 0x20, 0x930, 0x942, 0x92a,
-0x948, 0x92f, 0x93e, 0x901, 0x92d, 0x93e, 0x930, 0x924, 0x940, 0x92f, 0x20, 0x930, 0x942, 0x92a, 0x93f, 0x901, 0x92f, 0x93e, 0x66, 0x65,
-0x6c, 0xe1, 0x14b, 0x20, 0x43, 0x46, 0x41, 0x46, 0x25b, 0x6c, 0xe2, 0x14b, 0x4e, 0x61, 0x69, 0x6a, 0xed, 0x72, 0x69, 0xe1,
-0x20, 0x4e, 0x61, 0xed, 0x72, 0x61, 0x6e, 0x6f, 0x72, 0x67, 0x67, 0x61, 0x20, 0x6b, 0x72, 0x75, 0x76, 0x64, 0x6e, 0x6f,
-0x72, 0x75, 0x6f, 0x167, 0x167, 0x61, 0x20, 0x6b, 0x72, 0x75, 0x76, 0x64, 0x6e, 0x6f, 0x44, 0x6f, 0x6c, 0x61, 0x20, 0x79,
-0x61, 0x73, 0x65, 0x20, 0x41, 0x6d, 0x65, 0x6c, 0x69, 0x6b, 0x61, 0x6e, 0x6f, 0x72, 0x73, 0x6b, 0x65, 0x20, 0x6b, 0x72,
-0x6f, 0x6e, 0x65, 0x72, 0xb2d, 0xb3e, 0xb30, 0xb24, 0xb40, 0xb5f, 0x20, 0xb1f, 0xb19, 0xb4d, 0xb15, 0xb3e, 0x49, 0x74, 0x6f, 0x6f,
-0x70, 0x68, 0x69, 0x79, 0x61, 0x61, 0x20, 0x42, 0x69, 0x72, 0x72, 0x69, 0x69, 0x41b, 0x430, 0x440, 0x421, 0x43e, 0x43c, 0x627,
-0x641, 0x63a, 0x627, 0x646, 0x6cd, 0x67e, 0x627, 0x6a9, 0x633, 0x62a, 0x627, 0x646, 0x6cd, 0x20, 0x6a9, 0x644, 0x62f, 0x627, 0x631, 0x647,
-0x631, 0x6cc, 0x627, 0x644, 0x20, 0x627, 0x6cc, 0x631, 0x627, 0x646, 0x627, 0x641, 0x63a, 0x627, 0x646, 0x6cc, 0x20, 0x627, 0x641, 0x63a,
-0x627, 0x646, 0x633, 0x62a, 0x627, 0x646, 0x7a, 0x142, 0x6f, 0x74, 0x79, 0x20, 0x70, 0x6f, 0x6c, 0x73, 0x6b, 0x69, 0x52, 0x65,
-0x61, 0x6c, 0x20, 0x62, 0x72, 0x61, 0x73, 0x69, 0x6c, 0x65, 0x69, 0x72, 0x6f, 0x6b, 0x77, 0x61, 0x6e, 0x7a, 0x61, 0x20,
-0x61, 0x6e, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x6f, 0x65, 0x73, 0x63, 0x75, 0x64, 0x6f, 0x20, 0x63, 0x61, 0x62, 0x6f, 0x2d,
-0x76, 0x65, 0x72, 0x64, 0x69, 0x61, 0x6e, 0x6f, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x6f, 0x20, 0x43, 0x46, 0x41, 0x20, 0x28,
-0x42, 0x45, 0x41, 0x43, 0x29, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x6f, 0x20, 0x43, 0x46, 0x41, 0x20, 0x28, 0x42, 0x43, 0x45,
-0x41, 0x4f, 0x29, 0x70, 0x61, 0x74, 0x61, 0x63, 0x61, 0x20, 0x6d, 0x61, 0x63, 0x61, 0x65, 0x6e, 0x73, 0x65, 0x6d, 0x65,
-0x74, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x6f, 0xe7, 0x61, 0x6d, 0x62, 0x69, 0x63, 0x61, 0x6e, 0x6f, 0x64, 0x6f, 0x62,
-0x72, 0x61, 0x20, 0x64, 0x65, 0x20, 0x53, 0xe3, 0x6f, 0x20, 0x54, 0x6f, 0x6d, 0xe9, 0x20, 0x65, 0x20, 0x50, 0x72, 0xed,
-0x6e, 0x63, 0x69, 0x70, 0x65, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x6f, 0x20, 0x73, 0x75, 0xed, 0xe7, 0x6f, 0x64, 0xf3, 0x6c,
-0x61, 0x72, 0x20, 0x64, 0x6f, 0x73, 0x20, 0x45, 0x73, 0x74, 0x61, 0x64, 0x6f, 0x73, 0x20, 0x55, 0x6e, 0x69, 0x64, 0x6f,
-0x73, 0xa2d, 0xa3e, 0xa30, 0xa24, 0xa40, 0x20, 0xa30, 0xa41, 0xa2a, 0xa07, 0xa06, 0x631, 0x648, 0x67e, 0x626, 0x6cc, 0x6c1, 0x53, 0x6f,
-0x6c, 0x20, 0x50, 0x65, 0x72, 0x75, 0x61, 0x6e, 0x6f, 0x42, 0x6f, 0x6c, 0x69, 0x76, 0x69, 0x61, 0x6e, 0x6f, 0x44, 0xf3,
-0x6c, 0x61, 0x72, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6e, 0x6f, 0x6c, 0x65, 0x75, 0x20, 0x72, 0x6f, 0x6d,
-0xe2, 0x6e, 0x65, 0x73, 0x63, 0x6c, 0x65, 0x75, 0x20, 0x6d, 0x6f, 0x6c, 0x64, 0x6f, 0x76, 0x65, 0x6e, 0x65, 0x73, 0x63,
-0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x73, 0x76, 0x69, 0x7a, 0x7a, 0x65, 0x72, 0x68, 0x65, 0x6c, 0x65, 0x72, 0x69, 0x20,
-0x73, 0x61, 0x20, 0x54, 0x61, 0x6e, 0x7a, 0x61, 0x6e, 0x69, 0x61, 0x49, 0x66, 0x61, 0x72, 0x61, 0x6e, 0x67, 0x61, 0x20,
-0x72, 0x79, 0x2019, 0x55, 0x62, 0x75, 0x72, 0x75, 0x6e, 0x64, 0x69, 0x440, 0x43e, 0x441, 0x441, 0x438, 0x439, 0x441, 0x43a, 0x438,
-0x439, 0x20, 0x440, 0x443, 0x431, 0x43b, 0x44c, 0x431, 0x435, 0x43b, 0x43e, 0x440, 0x443, 0x441, 0x441, 0x43a, 0x438, 0x439, 0x20, 0x440,
-0x443, 0x431, 0x43b, 0x44c, 0x43a, 0x430, 0x437, 0x430, 0x445, 0x441, 0x43a, 0x438, 0x439, 0x20, 0x442, 0x435, 0x43d, 0x433, 0x435, 0x43a,
-0x438, 0x440, 0x433, 0x438, 0x437, 0x441, 0x43a, 0x438, 0x439, 0x20, 0x441, 0x43e, 0x43c, 0x43c, 0x43e, 0x43b, 0x434, 0x430, 0x432, 0x441,
-0x43a, 0x438, 0x439, 0x20, 0x43b, 0x435, 0x439, 0x443, 0x43a, 0x440, 0x430, 0x438, 0x43d, 0x441, 0x43a, 0x430, 0x44f, 0x20, 0x433, 0x440,
-0x438, 0x432, 0x43d, 0x430, 0x410, 0x440, 0x430, 0x441, 0x441, 0x44b, 0x44b, 0x439, 0x430, 0x20, 0x441, 0x43e, 0x43b, 0x43a, 0x443, 0x43e,
-0x431, 0x430, 0x439, 0x430, 0x4e, 0x6a, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x65, 0x65, 0x6c, 0x20, 0x4b, 0x65, 0x6e,
-0x79, 0x61, 0x66, 0x61, 0x72, 0xe2, 0x6e, 0x67, 0x61, 0x20, 0x43, 0x46, 0x41, 0x20, 0x28, 0x42, 0x45, 0x41, 0x43, 0x29,
-0x49, 0x68, 0x65, 0x6c, 0x61, 0x20, 0x79, 0x61, 0x20, 0x54, 0x61, 0x6e, 0x73, 0x61, 0x6e, 0x69, 0x79, 0x61, 0x92d, 0x93e,
-0x930, 0x924, 0x940, 0x92f, 0x20, 0x930, 0x942, 0x92a, 0x94d, 0x92f, 0x915, 0x92e, 0x94d, 0x1c65, 0x1c64, 0x1c67, 0x1c5a, 0x1c5b, 0x20, 0x1c68,
-0x1c6e, 0x1c71, 0x1c5f, 0x1c5c, 0x20, 0x1c74, 0x1c5f, 0x1c60, 0x1c5f, 0xe8, 0x75, 0x72, 0x6f, 0x4d, 0x65, 0x74, 0x69, 0x63, 0x61, 0x6c,
-0x20, 0x64, 0x65, 0x20, 0x4d, 0x6f, 0xe7, 0x61, 0x6d, 0x62, 0x69, 0x71, 0x75, 0x65, 0x441, 0x440, 0x43f, 0x441, 0x43a, 0x438,
-0x20, 0x434, 0x438, 0x43d, 0x430, 0x440, 0x411, 0x43e, 0x441, 0x430, 0x43d, 0x441, 0x43a, 0x43e, 0x445, 0x435, 0x440, 0x446, 0x435, 0x433,
-0x43e, 0x432, 0x430, 0x447, 0x43a, 0x430, 0x20, 0x43a, 0x43e, 0x43d, 0x432, 0x435, 0x440, 0x442, 0x438, 0x431, 0x438, 0x43b, 0x43d, 0x430,
-0x20, 0x43c, 0x430, 0x440, 0x43a, 0x430, 0x415, 0x432, 0x440, 0x43e, 0x45, 0x76, 0x72, 0x6f, 0x73, 0x72, 0x70, 0x73, 0x6b, 0x69,
-0x20, 0x64, 0x69, 0x6e, 0x61, 0x72, 0x73, 0x68, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x79, 0x61, 0x20, 0x54, 0x61,
-0x6e, 0x7a, 0x61, 0x6e, 0x69, 0x61, 0x44, 0x6f, 0x72, 0x61, 0x20, 0x72, 0x65, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x6b,
-0x61, 0x67e, 0x627, 0x6aa, 0x633, 0x62a, 0x627, 0x646, 0x64a, 0x20, 0x631, 0x67e, 0x64a, 0x939, 0x93f, 0x902, 0x926, 0x941, 0x938, 0x94d,
-0x924, 0x93e, 0x928, 0x940, 0x20, 0x930, 0x941, 0x92a, 0x92f, 0x94b, 0xdc1, 0xdca, 0x200d, 0xdbb, 0xdd3, 0x20, 0xdbd, 0xd82, 0xd9a, 0xdcf,
-0x20, 0xdbb, 0xdd4, 0xdb4, 0xdd2, 0xdba, 0xdbd, 0x65, 0x76, 0x72, 0x6f, 0x53, 0x68, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x6b, 0x61,
-0x20, 0x53, 0x6f, 0x6f, 0x6d, 0x61, 0x61, 0x6c, 0x69, 0x79, 0x61, 0x46, 0x61, 0x72, 0x61, 0x6e, 0x20, 0x4a, 0x61, 0x62,
-0x75, 0x75, 0x74, 0x69, 0x42, 0x69, 0x72, 0x74, 0x61, 0x20, 0x49, 0x74, 0x6f, 0x6f, 0x62, 0x62, 0x69, 0x79, 0x61, 0x53,
-0x68, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x6b, 0x61, 0x20, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x70, 0x65, 0x73, 0x6f, 0x20, 0x61,
-0x72, 0x67, 0x65, 0x6e, 0x74, 0x69, 0x6e, 0x6f, 0x64, 0xf3, 0x6c, 0x61, 0x72, 0x20, 0x62, 0x65, 0x6c, 0x69, 0x63, 0x65,
-0xf1, 0x6f, 0x62, 0x6f, 0x6c, 0x69, 0x76, 0x69, 0x61, 0x6e, 0x6f, 0x72, 0x65, 0x61, 0x6c, 0x20, 0x62, 0x72, 0x61, 0x73,
-0x69, 0x6c, 0x65, 0xf1, 0x6f, 0x50, 0x65, 0x73, 0x6f, 0x20, 0x63, 0x68, 0x69, 0x6c, 0x65, 0x6e, 0x6f, 0x70, 0x65, 0x73,
-0x6f, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x6d, 0x62, 0x69, 0x61, 0x6e, 0x6f, 0x63, 0x6f, 0x6c, 0xf3, 0x6e, 0x20, 0x63, 0x6f,
-0x73, 0x74, 0x61, 0x72, 0x72, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x70, 0x65, 0x73, 0x6f, 0x20, 0x63, 0x75, 0x62, 0x61,
-0x6e, 0x6f, 0x70, 0x65, 0x73, 0x6f, 0x20, 0x64, 0x6f, 0x6d, 0x69, 0x6e, 0x69, 0x63, 0x61, 0x6e, 0x6f, 0x64, 0xf3, 0x6c,
-0x61, 0x72, 0x20, 0x65, 0x73, 0x74, 0x61, 0x64, 0x6f, 0x75, 0x6e, 0x69, 0x64, 0x65, 0x6e, 0x73, 0x65, 0x66, 0x72, 0x61,
-0x6e, 0x63, 0x6f, 0x20, 0x43, 0x46, 0x41, 0x20, 0x64, 0x65, 0x20, 0xc1, 0x66, 0x72, 0x69, 0x63, 0x61, 0x20, 0x43, 0x65,
-0x6e, 0x74, 0x72, 0x61, 0x6c, 0x71, 0x75, 0x65, 0x74, 0x7a, 0x61, 0x6c, 0x6c, 0x65, 0x6d, 0x70, 0x69, 0x72, 0x61, 0x20,
-0x68, 0x6f, 0x6e, 0x64, 0x75, 0x72, 0x65, 0xf1, 0x6f, 0x70, 0x65, 0x73, 0x6f, 0x20, 0x6d, 0x65, 0x78, 0x69, 0x63, 0x61,
-0x6e, 0x6f, 0x63, 0xf3, 0x72, 0x64, 0x6f, 0x62, 0x61, 0x20, 0x6e, 0x69, 0x63, 0x61, 0x72, 0x61, 0x67, 0xfc, 0x65, 0x6e,
-0x73, 0x65, 0x62, 0x61, 0x6c, 0x62, 0x6f, 0x61, 0x20, 0x70, 0x61, 0x6e, 0x61, 0x6d, 0x65, 0xf1, 0x6f, 0x67, 0x75, 0x61,
-0x72, 0x61, 0x6e, 0xed, 0x20, 0x70, 0x61, 0x72, 0x61, 0x67, 0x75, 0x61, 0x79, 0x6f, 0x73, 0x6f, 0x6c, 0x20, 0x70, 0x65,
-0x72, 0x75, 0x61, 0x6e, 0x6f, 0x70, 0x65, 0x73, 0x6f, 0x20, 0x66, 0x69, 0x6c, 0x69, 0x70, 0x69, 0x6e, 0x6f, 0x70, 0x65,
-0x73, 0x6f, 0x20, 0x75, 0x72, 0x75, 0x67, 0x75, 0x61, 0x79, 0x6f, 0x62, 0x6f, 0x6c, 0xed, 0x76, 0x61, 0x72, 0x20, 0x73,
-0x6f, 0x62, 0x65, 0x72, 0x61, 0x6e, 0x6f, 0x2d30, 0x2d37, 0x2d54, 0x2d49, 0x2d4e, 0x20, 0x2d4f, 0x20, 0x2d4d, 0x2d4e, 0x2d56, 0x2d54, 0x2d49,
-0x2d31, 0x52, 0x75, 0x70, 0x65, 0x65, 0x20, 0x49, 0x6e, 0x64, 0x6f, 0x6e, 0xe9, 0x73, 0x69, 0x61, 0x46, 0x61, 0x72, 0x61,
-0x6e, 0x67, 0x61, 0x20, 0x79, 0x61, 0x20, 0x4b, 0x6f, 0x6e, 0x67, 0x6f, 0x53, 0x68, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69,
-0x20, 0x79, 0x61, 0x20, 0x55, 0x67, 0x61, 0x6e, 0x64, 0x61, 0x73, 0x76, 0x65, 0x6e, 0x73, 0x6b, 0x20, 0x6b, 0x72, 0x6f,
-0x6e, 0x61, 0x53, 0x63, 0x68, 0x77, 0x69, 0x69, 0x7a, 0x65, 0x72, 0x20, 0x46, 0x72, 0x61, 0x6e, 0x6b, 0x65, 0x61, 0x64,
-0x72, 0x69, 0x6d, 0x20, 0x6e, 0x20, 0x6c, 0x6d, 0x263, 0x72, 0x69, 0x62, 0x421, 0x43e, 0x43c, 0x43e, 0x43d, 0x4e3, 0xb87, 0xba8,
-0xbcd, 0xba4, 0xbbf, 0xbaf, 0x20, 0xbb0, 0xbc2, 0xbaa, 0xbbe, 0xbaf, 0xbcd, 0xbae, 0xbb2, 0xbc7, 0xbb7, 0xbbf, 0xbaf, 0xba9, 0xbcd, 0x20,
-0xbb0, 0xbbf, 0xb99, 0xbcd, 0xb95, 0xbbf, 0xb9f, 0xbcd, 0xb9a, 0xbbf, 0xb99, 0xbcd, 0xb95, 0xbaa, 0xbcd, 0xbaa, 0xbc2, 0xbb0, 0xbcd, 0x20,
-0xb9f, 0xbbe, 0xbb2, 0xbb0, 0xbcd, 0xb87, 0xbb2, 0xb99, 0xbcd, 0xb95, 0xbc8, 0x20, 0xbb0, 0xbc2, 0xbaa, 0xbbe, 0xbaf, 0xbcd, 0x420, 0x43e,
-0x441, 0x441, 0x438, 0x44f, 0x20, 0x441, 0x443, 0x43c, 0x44b, 0xc2d, 0xc3e, 0xc30, 0xc24, 0xc26, 0xc47, 0xc36, 0x20, 0xc30, 0xc42, 0xc2a,
-0xc3e, 0xc2f, 0xc3f, 0x41, 0x6e, 0x67, 0x6f, 0x2019, 0x6f, 0x74, 0x6f, 0x6c, 0x20, 0x6c, 0x6f, 0x6b, 0x2019, 0x20, 0x55, 0x67,
-0x61, 0x6e, 0x64, 0x61, 0x41, 0x6e, 0x67, 0x6f, 0x2019, 0x6f, 0x74, 0x6f, 0x6c, 0x20, 0x6c, 0x6f, 0x6b, 0x2019, 0x20, 0x4b,
-0x65, 0x6e, 0x79, 0x61, 0xe1a, 0xe32, 0xe17, 0xf61, 0xf74, 0xf0b, 0xf68, 0xf53, 0xf0b, 0xf62, 0xf92, 0xfb1, 0xf0b, 0xf42, 0xf62, 0xf0b,
-0xf66, 0xf92, 0xf7c, 0xf62, 0xf0b, 0x1293, 0x1255, 0x134b, 0x50, 0x61, 0x2bb, 0x61, 0x6e, 0x67, 0x61, 0x20, 0x66, 0x61, 0x6b, 0x61,
-0x74, 0x6f, 0x6e, 0x67, 0x61, 0x54, 0xfc, 0x72, 0x6b, 0x20, 0x4c, 0x69, 0x72, 0x61, 0x73, 0x131, 0x54, 0xfc, 0x72, 0x6b,
-0x6d, 0x65, 0x6e, 0x20, 0x6d, 0x61, 0x6e, 0x61, 0x64, 0x79, 0x443, 0x43a, 0x440, 0x430, 0x457, 0x43d, 0x441, 0x44c, 0x43a, 0x430,
-0x20, 0x433, 0x440, 0x438, 0x432, 0x43d, 0x44f, 0x67e, 0x627, 0x6a9, 0x633, 0x62a, 0x627, 0x646, 0x6cc, 0x20, 0x631, 0x648, 0x67e, 0x6cc,
-0x6c1, 0x628, 0x6be, 0x627, 0x631, 0x62a, 0x6cc, 0x20, 0x631, 0x648, 0x67e, 0x6cc, 0x6c1, 0x62c, 0x6c7, 0x6ad, 0x6af, 0x648, 0x20, 0x64a,
-0x6c8, 0x6d5, 0x646, 0x649, 0x4f, 0x2018, 0x7a, 0x62, 0x65, 0x6b, 0x69, 0x73, 0x74, 0x6f, 0x6e, 0x20, 0x73, 0x6f, 0x2018, 0x6d,
-0x69, 0x40e, 0x437, 0x431, 0x435, 0x43a, 0x438, 0x441, 0x442, 0x43e, 0x43d, 0x20, 0x441, 0x45e, 0x43c, 0xa55e, 0xa524, 0xa52b, 0xa569, 0x20,
-0xa55c, 0xa55e, 0xa54c, 0x4c, 0x61, 0x69, 0x62, 0x68, 0x69, 0x79, 0x61, 0x20, 0x44, 0x61, 0x6c, 0x61, 0x110, 0x1ed3, 0x6e, 0x67,
-0x20, 0x56, 0x69, 0x1ec7, 0x74, 0x20, 0x4e, 0x61, 0x6d, 0x50, 0x75, 0x6e, 0x74, 0x20, 0x50, 0x72, 0x79, 0x64, 0x61, 0x69,
-0x6e, 0x46, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x43, 0x46, 0x41, 0x20, 0x62, 0x75, 0x20, 0x41, 0x66, 0x72, 0x69, 0x6b, 0x20,
-0x53, 0x6f, 0x77, 0x77, 0x75, 0x2d, 0x6a, 0x61, 0x6e, 0x74, 0x69, 0x52, 0x61, 0x6e, 0x64, 0x69, 0x20, 0x79, 0x61, 0x73,
-0x65, 0x4d, 0x7a, 0x61, 0x6e, 0x7a, 0x69, 0x20, 0x41, 0x66, 0x72, 0x69, 0x6b, 0x61, 0x4e, 0xe1, 0xed, 0x72, 0xe0, 0x20,
-0x4e, 0xe0, 0xec, 0x6a, 0xed, 0x72, 0xed, 0xe0, 0x46, 0x61, 0x72, 0x61, 0x6e, 0x73, 0xec, 0x20, 0xec, 0x77, 0x254, 0x300,
-0x2d, 0x6f, 0x6f, 0x72, 0xf9, 0x6e, 0x20, 0x41, 0x66, 0xed, 0x72, 0xed, 0x6b, 0xe0, 0x69, 0x2d, 0x53, 0x6f, 0x75, 0x74,
-0x68, 0x20, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x6e, 0x20, 0x52, 0x61, 0x6e, 0x64, 0x4d, 0x72, 0x61, 0x73, 0x69, 0x72,
-0x20, 0x52, 0x65, 0x6a, 0x61, 0x72, 0x52, 0x65, 0x61, 0x75, 0x20, 0x42, 0x72, 0x61, 0x73, 0x69, 0x75, 0x77, 0x61, 0x72,
-0x61, 0x50, 0x65, 0x73, 0x6f, 0x20, 0x4b, 0x75, 0x72, 0x169, 0x62, 0x69, 0x79, 0x61, 0x77, 0x61, 0x72, 0x61, 0x42, 0x75,
-0x72, 0x69, 0x77, 0x61, 0x72, 0x69, 0x20, 0x57, 0x65, 0x6e, 0x65, 0x73, 0x75, 0x65, 0x72, 0x61, 0x77, 0x61, 0x72, 0x61
+static constexpr char16_t currency_display_name_data[] = {
+0x53, 0x75, 0x69, 0x64, 0x2d, 0x41, 0x66, 0x72, 0x69, 0x6b, 0x61, 0x61,
+0x6e, 0x73, 0x65, 0x20, 0x72, 0x61, 0x6e, 0x64, 0x4e, 0x61, 0x6d, 0x69,
+0x62, 0x69, 0x65, 0x73, 0x65, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72,
+0x43, 0x46, 0x41, 0x20, 0x46, 0xe0, 0x6c, 0xe2, 0x14b, 0x20, 0x42, 0x45,
+0x41, 0x43, 0x47, 0x68, 0x61, 0x6e, 0x61, 0x20, 0x53, 0x69, 0x64, 0x69,
+0x46, 0x72, 0xe2, 0x6e, 0x6b, 0x65, 0x20, 0x43, 0x46, 0x41, 0x4c, 0x65,
+0x6b, 0x75, 0x20, 0x73, 0x68, 0x71, 0x69, 0x70, 0x74, 0x61, 0x72, 0x45,
+0x75, 0x72, 0x6f, 0x6a, 0x61, 0x44, 0x65, 0x6e, 0x61, 0x72, 0x69, 0x20,
+0x6d, 0x61, 0x71, 0x65, 0x64, 0x6f, 0x6e, 0x61, 0x73, 0x12e8, 0x12a2, 0x1275,
+0x12ee, 0x1335, 0x12eb, 0x20, 0x1265, 0x122d, 0x62c, 0x646, 0x64a, 0x647, 0x20, 0x645,
+0x635, 0x631, 0x64a, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x62c, 0x632, 0x627,
+0x626, 0x631, 0x64a, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x628, 0x62d, 0x631,
+0x64a, 0x646, 0x64a, 0x641, 0x631, 0x646, 0x643, 0x20, 0x648, 0x633, 0x637, 0x20,
+0x623, 0x641, 0x631, 0x64a, 0x642, 0x64a, 0x641, 0x631, 0x646, 0x643, 0x20, 0x62c,
+0x632, 0x631, 0x20, 0x627, 0x644, 0x642, 0x645, 0x631, 0x641, 0x631, 0x646, 0x643,
+0x20, 0x62c, 0x64a, 0x628, 0x648, 0x62a, 0x64a, 0x646, 0x627, 0x643, 0x641, 0x627,
+0x20, 0x623, 0x631, 0x64a, 0x62a, 0x631, 0x64a, 0x62f, 0x64a, 0x646, 0x627, 0x631,
+0x20, 0x639, 0x631, 0x627, 0x642, 0x64a, 0x634, 0x64a, 0x643, 0x644, 0x20, 0x625,
+0x633, 0x631, 0x627, 0x626, 0x64a, 0x644, 0x64a, 0x20, 0x62c, 0x62f, 0x64a, 0x62f,
+0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x623, 0x631, 0x62f, 0x646, 0x64a, 0x62f,
+0x64a, 0x646, 0x627, 0x631, 0x20, 0x643, 0x648, 0x64a, 0x62a, 0x64a, 0x62c, 0x646,
+0x64a, 0x647, 0x20, 0x644, 0x628, 0x646, 0x627, 0x646, 0x64a, 0x62f, 0x64a, 0x646,
+0x627, 0x631, 0x20, 0x644, 0x64a, 0x628, 0x64a, 0x623, 0x648, 0x642, 0x64a, 0x629,
+0x20, 0x645, 0x648, 0x631, 0x64a, 0x62a, 0x627, 0x646, 0x64a, 0x629, 0x62f, 0x631,
+0x647, 0x645, 0x20, 0x645, 0x63a, 0x631, 0x628, 0x64a, 0x631, 0x64a, 0x627, 0x644,
+0x20, 0x639, 0x645, 0x627, 0x646, 0x64a, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x642,
+0x637, 0x631, 0x64a, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x633, 0x639, 0x648, 0x62f,
+0x64a, 0x634, 0x644, 0x646, 0x20, 0x635, 0x648, 0x645, 0x627, 0x644, 0x64a, 0x62c,
+0x646, 0x64a, 0x647, 0x20, 0x62c, 0x646, 0x648, 0x628, 0x20, 0x627, 0x644, 0x633,
+0x648, 0x62f, 0x627, 0x646, 0x62c, 0x646, 0x64a, 0x647, 0x20, 0x633, 0x648, 0x62f,
+0x627, 0x646, 0x64a, 0x644, 0x64a, 0x631, 0x629, 0x20, 0x633, 0x648, 0x631, 0x64a,
+0x629, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x62a, 0x648, 0x646, 0x633, 0x64a,
+0x62f, 0x631, 0x647, 0x645, 0x20, 0x625, 0x645, 0x627, 0x631, 0x627, 0x62a, 0x64a,
+0x631, 0x64a, 0x627, 0x644, 0x20, 0x64a, 0x645, 0x646, 0x64a, 0x65, 0x75, 0x72,
+0x6f, 0x570, 0x561, 0x575, 0x56f, 0x561, 0x56f, 0x561, 0x576, 0x20, 0x564, 0x580,
+0x561, 0x574, 0x9ad, 0x9be, 0x9f0, 0x9a4, 0x9c0, 0x9af, 0x9bc, 0x20, 0x9f0, 0x9c1,
+0x9aa, 0x9c0, 0x73, 0x68, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x79,
+0x61, 0x20, 0x54, 0x61, 0x6e, 0x64, 0x68, 0x61, 0x6e, 0x69, 0x61, 0x41,
+0x6d, 0x61, 0x6e, 0x41, 0x7a, 0x259, 0x72, 0x62, 0x61, 0x79, 0x63, 0x61,
+0x6e, 0x20, 0x4d, 0x61, 0x6e, 0x61, 0x74, 0x131, 0x43c, 0x430, 0x43d, 0x430,
+0x442, 0x66, 0x72, 0xe1, 0x14b, 0x73, 0x65, 0x66, 0x61, 0x20, 0x46, 0x72,
+0x61, 0x14b, 0x20, 0x28, 0x42, 0x43, 0x45, 0x41, 0x4f, 0x29, 0x9ac, 0x9be,
+0x982, 0x9b2, 0x9be, 0x9a6, 0x9c7, 0x9b6, 0x9c0, 0x20, 0x99f, 0x9be, 0x995, 0x9be,
+0x9ad, 0x9be, 0x9b0, 0x9a4, 0x9c0, 0x9af, 0x9bc, 0x20, 0x9b0, 0x9c1, 0x9aa, 0x9bf,
+0x46, 0x72, 0x1ce, 0x14b, 0x20, 0x43, 0x46, 0x41, 0x20, 0x28, 0x42, 0x45,
+0x41, 0x43, 0x29, 0x65, 0x75, 0x72, 0x6f, 0x61, 0x431, 0x435, 0x43b, 0x430,
+0x440, 0x443, 0x441, 0x43a, 0x456, 0x20, 0x440, 0x443, 0x431, 0x435, 0x43b, 0x44c,
+0x53, 0x68, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x79, 0x61, 0x20,
+0x48, 0x75, 0x74, 0x61, 0x6e, 0x7a, 0x61, 0x6e, 0x69, 0x61, 0x92d, 0x93e,
+0x930, 0x924, 0x928, 0x93f, 0x20, 0x930, 0x941, 0x92a, 0x940, 0x42, 0x6f, 0x73,
+0x61, 0x6e, 0x73, 0x6b, 0x6f, 0x68, 0x65, 0x72, 0x63, 0x65, 0x67, 0x6f,
+0x76, 0x61, 0x10d, 0x6b, 0x61, 0x20, 0x6b, 0x6f, 0x6e, 0x76, 0x65, 0x72,
+0x74, 0x69, 0x62, 0x69, 0x6c, 0x6e, 0x61, 0x20, 0x6d, 0x61, 0x72, 0x6b,
+0x61, 0x41a, 0x43e, 0x43d, 0x432, 0x435, 0x440, 0x442, 0x438, 0x431, 0x438, 0x43b,
+0x43d, 0x430, 0x20, 0x43c, 0x430, 0x440, 0x43a, 0x430, 0x411, 0x44a, 0x43b, 0x433,
+0x430, 0x440, 0x441, 0x43a, 0x438, 0x20, 0x43b, 0x435, 0x432, 0x1019, 0x103c, 0x1014,
+0x103a, 0x1019, 0x102c, 0x20, 0x1000, 0x103b, 0x1015, 0x103a, 0x6e2f, 0x5e63, 0x4eba, 0x6c11,
+0x5e01, 0x50, 0x68, 0x69, 0x6c, 0x69, 0x70, 0x70, 0x69, 0x6e, 0x65, 0x20,
+0x50, 0x65, 0x73, 0x6f, 0x44, 0x65, 0x72, 0x68, 0x65, 0x6d, 0x20, 0x55,
+0x6d, 0x65, 0x1e5b, 0x1e5b, 0x75, 0x6b, 0x69, 0x62f, 0x6cc, 0x646, 0x627, 0x631,
+0x6cc, 0x20, 0x639, 0x6ce, 0x631, 0x627, 0x642, 0x6cc, 0x695, 0x6cc, 0x627, 0x6b5,
+0x6cc, 0x20, 0x626, 0x6ce, 0x631, 0x627, 0x646, 0x6cc, 0xd804, 0xdd1d, 0xd804, 0xdd01,
+0xd804, 0xdd23, 0xd804, 0xdd18, 0xd804, 0xdd2c, 0xd804, 0xdd25, 0xd804, 0xdd28, 0x20, 0xd804,
+0xdd11, 0xd804, 0xdd2c, 0xd804, 0xdd0b, 0xd804, 0xdd03, 0xd804, 0xdd28, 0xd804, 0xdd1a, 0xd804,
+0xdd34, 0xd804, 0xdd18, 0xd804, 0xdd28, 0xd804, 0xdd20, 0xd804, 0xdd1a, 0xd804, 0xdd34, 0x20,
+0xd804, 0xdd22, 0xd804, 0xdd2a, 0xd804, 0xdd1b, 0xd804, 0xdd28, 0x420, 0x43e, 0x441, 0x441,
+0x438, 0x439, 0x43d, 0x20, 0x441, 0x43e, 0x43c, 0x55, 0x53, 0x20, 0x13a0, 0x13d5,
+0x13b3, 0x45, 0x73, 0x68, 0x69, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x79,
+0x61, 0x20, 0x55, 0x67, 0x61, 0x6e, 0x64, 0x61, 0x6e2f, 0x5143, 0x6fb3, 0x95e8,
+0x5e01, 0x65b0, 0x52a0, 0x5761, 0x5143, 0x6fb3, 0x9580, 0x5143, 0x65b0, 0x53f0, 0x5e63, 0x440,
+0x461, 0x441, 0x441, 0x456, 0x301, 0x439, 0x441, 0x43a, 0x457, 0x439, 0x20, 0x440,
+0xa64b, 0x301, 0x431, 0x43b, 0x44c, 0x420, 0x430, 0x4ab, 0x4ab, 0x435, 0x439, 0x20,
+0x442, 0x435, 0x43d, 0x43a, 0x4d7, 0x10d, 0x65, 0x73, 0x6b, 0xe1, 0x20, 0x6b,
+0x6f, 0x72, 0x75, 0x6e, 0x61, 0x64, 0x61, 0x6e, 0x73, 0x6b, 0x20, 0x6b,
+0x72, 0x6f, 0x6e, 0x65, 0x92d, 0x93e, 0x930, 0x924, 0x940, 0x20, 0x930, 0x92a,
+0x947, 0x93d, 0x41, 0x72, 0x75, 0x62, 0x61, 0x61, 0x6e, 0x73, 0x65, 0x20,
+0x67, 0x75, 0x6c, 0x64, 0x65, 0x6e, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x6b,
+0x61, 0x61, 0x6e, 0x73, 0x65, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72,
+0x4e, 0x65, 0x64, 0x65, 0x72, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x2d, 0x41,
+0x6e, 0x74, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x61, 0x6e, 0x73, 0x65, 0x20,
+0x67, 0x75, 0x6c, 0x64, 0x65, 0x6e, 0x53, 0x75, 0x72, 0x69, 0x6e, 0x61,
+0x61, 0x6d, 0x73, 0x65, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0xf51,
+0xf44, 0xf74, 0xf63, 0xf0b, 0xf40, 0xfb2, 0xf58, 0x53, 0x68, 0x69, 0x6c, 0x69,
+0x6e, 0x67, 0x69, 0x20, 0x79, 0x61, 0x20, 0x4b, 0x65, 0x6e, 0x79, 0x61,
+0x55, 0x53, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x45, 0x61, 0x73,
+0x74, 0x20, 0x43, 0x61, 0x72, 0x69, 0x62, 0x62, 0x65, 0x61, 0x6e, 0x20,
+0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61,
+0x6c, 0x69, 0x61, 0x6e, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x42,
+0x61, 0x68, 0x61, 0x6d, 0x69, 0x61, 0x6e, 0x20, 0x44, 0x6f, 0x6c, 0x6c,
+0x61, 0x72, 0x42, 0x61, 0x72, 0x62, 0x61, 0x64, 0x69, 0x61, 0x6e, 0x20,
+0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x42, 0x65, 0x6c, 0x69, 0x7a, 0x65,
+0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x42, 0x65, 0x72, 0x6d, 0x75,
+0x64, 0x69, 0x61, 0x6e, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x42,
+0x6f, 0x74, 0x73, 0x77, 0x61, 0x6e, 0x61, 0x6e, 0x20, 0x50, 0x75, 0x6c,
+0x61, 0x42, 0x75, 0x72, 0x75, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x46,
+0x72, 0x61, 0x6e, 0x63, 0x43, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x20,
+0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x6e, 0x20, 0x43, 0x46, 0x41, 0x20,
+0x46, 0x72, 0x61, 0x6e, 0x63, 0x43, 0x61, 0x6e, 0x61, 0x64, 0x69, 0x61,
+0x6e, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x43, 0x61, 0x79, 0x6d,
+0x61, 0x6e, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x20, 0x44,
+0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x4e, 0x65, 0x77, 0x20, 0x5a, 0x65, 0x61,
+0x6c, 0x61, 0x6e, 0x64, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x44,
+0x61, 0x6e, 0x69, 0x73, 0x68, 0x20, 0x4b, 0x72, 0x6f, 0x6e, 0x65, 0x45,
+0x72, 0x69, 0x74, 0x72, 0x65, 0x61, 0x6e, 0x20, 0x4e, 0x61, 0x6b, 0x66,
+0x61, 0x53, 0x77, 0x61, 0x7a, 0x69, 0x20, 0x4c, 0x69, 0x6c, 0x61, 0x6e,
+0x67, 0x65, 0x6e, 0x69, 0x46, 0x61, 0x6c, 0x6b, 0x6c, 0x61, 0x6e, 0x64,
+0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x20, 0x50, 0x6f, 0x75,
+0x6e, 0x64, 0x46, 0x69, 0x6a, 0x69, 0x61, 0x6e, 0x20, 0x44, 0x6f, 0x6c,
+0x6c, 0x61, 0x72, 0x47, 0x61, 0x6d, 0x62, 0x69, 0x61, 0x6e, 0x20, 0x44,
+0x61, 0x6c, 0x61, 0x73, 0x69, 0x47, 0x68, 0x61, 0x6e, 0x61, 0x69, 0x61,
+0x6e, 0x20, 0x43, 0x65, 0x64, 0x69, 0x47, 0x69, 0x62, 0x72, 0x61, 0x6c,
+0x74, 0x61, 0x72, 0x20, 0x50, 0x6f, 0x75, 0x6e, 0x64, 0x55, 0x4b, 0x20,
+0x50, 0x6f, 0x75, 0x6e, 0x64, 0x47, 0x75, 0x79, 0x61, 0x6e, 0x61, 0x65,
+0x73, 0x65, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x48, 0x6f, 0x6e,
+0x67, 0x20, 0x4b, 0x6f, 0x6e, 0x67, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61,
+0x72, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x52, 0x75, 0x70, 0x65,
+0x65, 0x49, 0x6e, 0x64, 0x6f, 0x6e, 0x65, 0x73, 0x69, 0x61, 0x6e, 0x20,
+0x52, 0x75, 0x70, 0x69, 0x61, 0x68, 0x49, 0x73, 0x72, 0x61, 0x65, 0x6c,
+0x69, 0x20, 0x4e, 0x65, 0x77, 0x20, 0x53, 0x68, 0x65, 0x6b, 0x65, 0x6c,
+0x4a, 0x61, 0x6d, 0x61, 0x69, 0x63, 0x61, 0x6e, 0x20, 0x44, 0x6f, 0x6c,
+0x6c, 0x61, 0x72, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x6e, 0x20, 0x53, 0x68,
+0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x20,
+0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x6e, 0x20, 0x52, 0x61, 0x6e, 0x64,
+0x4c, 0x69, 0x62, 0x65, 0x72, 0x69, 0x61, 0x6e, 0x20, 0x44, 0x6f, 0x6c,
+0x6c, 0x61, 0x72, 0x4d, 0x61, 0x63, 0x61, 0x6e, 0x65, 0x73, 0x65, 0x20,
+0x50, 0x61, 0x74, 0x61, 0x63, 0x61, 0x4d, 0x61, 0x6c, 0x61, 0x67, 0x61,
+0x73, 0x79, 0x20, 0x41, 0x72, 0x69, 0x61, 0x72, 0x79, 0x4d, 0x61, 0x6c,
+0x61, 0x77, 0x69, 0x61, 0x6e, 0x20, 0x4b, 0x77, 0x61, 0x63, 0x68, 0x61,
+0x4d, 0x61, 0x6c, 0x61, 0x79, 0x73, 0x69, 0x61, 0x6e, 0x20, 0x52, 0x69,
+0x6e, 0x67, 0x67, 0x69, 0x74, 0x4d, 0x61, 0x6c, 0x64, 0x69, 0x76, 0x69,
+0x61, 0x6e, 0x20, 0x52, 0x75, 0x66, 0x69, 0x79, 0x61, 0x61, 0x4d, 0x61,
+0x75, 0x72, 0x69, 0x74, 0x69, 0x61, 0x6e, 0x20, 0x52, 0x75, 0x70, 0x65,
+0x65, 0x4e, 0x61, 0x6d, 0x69, 0x62, 0x69, 0x61, 0x6e, 0x20, 0x44, 0x6f,
+0x6c, 0x6c, 0x61, 0x72, 0x4e, 0x69, 0x67, 0x65, 0x72, 0x69, 0x61, 0x6e,
+0x20, 0x4e, 0x61, 0x69, 0x72, 0x61, 0x50, 0x61, 0x6b, 0x69, 0x73, 0x74,
+0x61, 0x6e, 0x69, 0x20, 0x52, 0x75, 0x70, 0x65, 0x65, 0x50, 0x61, 0x70,
+0x75, 0x61, 0x20, 0x4e, 0x65, 0x77, 0x20, 0x47, 0x75, 0x69, 0x6e, 0x65,
+0x61, 0x6e, 0x20, 0x4b, 0x69, 0x6e, 0x61, 0x52, 0x77, 0x61, 0x6e, 0x64,
+0x61, 0x6e, 0x20, 0x46, 0x72, 0x61, 0x6e, 0x63, 0x53, 0x74, 0x20, 0x48,
+0x65, 0x6c, 0x65, 0x6e, 0x61, 0x20, 0x50, 0x6f, 0x75, 0x6e, 0x64, 0x53,
+0x61, 0x6d, 0x6f, 0x61, 0x6e, 0x20, 0x54, 0x61, 0x6c, 0x61, 0x53, 0x65,
+0x79, 0x63, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x69, 0x73, 0x20, 0x52, 0x75,
+0x70, 0x65, 0x65, 0x53, 0x69, 0x65, 0x72, 0x72, 0x61, 0x20, 0x4c, 0x65,
+0x6f, 0x6e, 0x65, 0x61, 0x6e, 0x20, 0x4c, 0x65, 0x6f, 0x6e, 0x65, 0x53,
+0x69, 0x6e, 0x67, 0x61, 0x70, 0x6f, 0x72, 0x65, 0x20, 0x44, 0x6f, 0x6c,
+0x6c, 0x61, 0x72, 0x4e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x6c, 0x61, 0x6e,
+0x64, 0x73, 0x20, 0x41, 0x6e, 0x74, 0x69, 0x6c, 0x6c, 0x65, 0x61, 0x6e,
+0x20, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x53, 0x6f, 0x6c, 0x6f,
+0x6d, 0x6f, 0x6e, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x20,
+0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x20,
+0x53, 0x75, 0x64, 0x61, 0x6e, 0x65, 0x73, 0x65, 0x20, 0x50, 0x6f, 0x75,
+0x6e, 0x64, 0x53, 0x75, 0x64, 0x61, 0x6e, 0x65, 0x73, 0x65, 0x20, 0x50,
+0x6f, 0x75, 0x6e, 0x64, 0x53, 0x77, 0x65, 0x64, 0x69, 0x73, 0x68, 0x20,
+0x4b, 0x72, 0x6f, 0x6e, 0x61, 0x53, 0x77, 0x69, 0x73, 0x73, 0x20, 0x46,
+0x72, 0x61, 0x6e, 0x63, 0x54, 0x61, 0x6e, 0x7a, 0x61, 0x6e, 0x69, 0x61,
+0x6e, 0x20, 0x53, 0x68, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x54, 0x6f,
+0x6e, 0x67, 0x61, 0x6e, 0x20, 0x50, 0x61, 0x2bb, 0x61, 0x6e, 0x67, 0x61,
+0x54, 0x72, 0x69, 0x6e, 0x69, 0x64, 0x61, 0x64, 0x20, 0x26, 0x20, 0x54,
+0x6f, 0x62, 0x61, 0x67, 0x6f, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72,
+0x55, 0x67, 0x61, 0x6e, 0x64, 0x61, 0x6e, 0x20, 0x53, 0x68, 0x69, 0x6c,
+0x6c, 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x69, 0x74, 0x65, 0x64, 0x20, 0x41,
+0x72, 0x61, 0x62, 0x20, 0x45, 0x6d, 0x69, 0x72, 0x61, 0x74, 0x65, 0x73,
+0x20, 0x44, 0x69, 0x72, 0x68, 0x61, 0x6d, 0x42, 0x72, 0x69, 0x74, 0x69,
+0x73, 0x68, 0x20, 0x50, 0x6f, 0x75, 0x6e, 0x64, 0x56, 0x61, 0x6e, 0x75,
+0x61, 0x74, 0x75, 0x20, 0x56, 0x61, 0x74, 0x75, 0x5a, 0x61, 0x6d, 0x62,
+0x69, 0x61, 0x6e, 0x20, 0x4b, 0x77, 0x61, 0x63, 0x68, 0x61, 0x67, 0x68,
+0x61, 0x6e, 0x61, 0x20, 0x73, 0x69, 0x256, 0x69, 0x263, 0x65, 0x74, 0x6f,
+0x256, 0x6f, 0x66, 0x65, 0x20, 0x61, 0x66, 0x72, 0x69, 0x6b, 0x61, 0x67,
+0x61, 0x20, 0x43, 0x46, 0x41, 0x20, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20,
+0x42, 0x43, 0x45, 0x41, 0x4f, 0x46, 0x259, 0x6c, 0xe1, 0x14b, 0x20, 0x43,
+0x46, 0x41, 0x20, 0x28, 0x42, 0x45, 0x41, 0x43, 0x29, 0x64, 0x6f, 0x6e,
+0x73, 0x6b, 0x20, 0x6b, 0x72, 0xf3, 0x6e, 0x61, 0x50, 0x69, 0x73, 0x6f,
+0x20, 0x6e, 0x67, 0x20, 0x50, 0x69, 0x6c, 0x69, 0x70, 0x69, 0x6e, 0x61,
+0x73, 0x64, 0x69, 0x6e, 0x61, 0x72, 0x20, 0x61, 0x6c, 0x67, 0xe9, 0x72,
+0x69, 0x65, 0x6e, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x43, 0x46, 0x41,
+0x20, 0x28, 0x42, 0x43, 0x45, 0x41, 0x4f, 0x29, 0x66, 0x72, 0x61, 0x6e,
+0x63, 0x20, 0x62, 0x75, 0x72, 0x75, 0x6e, 0x64, 0x61, 0x69, 0x73, 0x66,
+0x72, 0x61, 0x6e, 0x63, 0x20, 0x43, 0x46, 0x41, 0x20, 0x28, 0x42, 0x45,
+0x41, 0x43, 0x29, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x20, 0x63, 0x61,
+0x6e, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20,
+0x63, 0x6f, 0x6d, 0x6f, 0x72, 0x69, 0x65, 0x6e, 0x66, 0x72, 0x61, 0x6e,
+0x63, 0x20, 0x63, 0x6f, 0x6e, 0x67, 0x6f, 0x6c, 0x61, 0x69, 0x73, 0x66,
+0x72, 0x61, 0x6e, 0x63, 0x20, 0x64, 0x6a, 0x69, 0x62, 0x6f, 0x75, 0x74,
+0x69, 0x65, 0x6e, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x43, 0x46, 0x50,
+0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x67, 0x75, 0x69, 0x6e, 0xe9, 0x65,
+0x6e, 0x67, 0x6f, 0x75, 0x72, 0x64, 0x65, 0x20, 0x68, 0x61, 0xef, 0x74,
+0x69, 0x65, 0x6e, 0x6e, 0x65, 0x61, 0x72, 0x69, 0x61, 0x72, 0x79, 0x20,
+0x6d, 0x61, 0x6c, 0x67, 0x61, 0x63, 0x68, 0x65, 0x6f, 0x75, 0x67, 0x75,
+0x69, 0x79, 0x61, 0x20, 0x6d, 0x61, 0x75, 0x72, 0x69, 0x74, 0x61, 0x6e,
+0x69, 0x65, 0x6e, 0x72, 0x6f, 0x75, 0x70, 0x69, 0x65, 0x20, 0x6d, 0x61,
+0x75, 0x72, 0x69, 0x63, 0x69, 0x65, 0x6e, 0x6e, 0x65, 0x64, 0x69, 0x72,
+0x68, 0x61, 0x6d, 0x20, 0x6d, 0x61, 0x72, 0x6f, 0x63, 0x61, 0x69, 0x6e,
+0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x72, 0x77, 0x61, 0x6e, 0x64, 0x61,
+0x69, 0x73, 0x72, 0x6f, 0x75, 0x70, 0x69, 0x65, 0x20, 0x64, 0x65, 0x73,
+0x20, 0x53, 0x65, 0x79, 0x63, 0x68, 0x65, 0x6c, 0x6c, 0x65, 0x73, 0x66,
+0x72, 0x61, 0x6e, 0x63, 0x20, 0x73, 0x75, 0x69, 0x73, 0x73, 0x65, 0x6c,
+0x69, 0x76, 0x72, 0x65, 0x20, 0x73, 0x79, 0x72, 0x69, 0x65, 0x6e, 0x6e,
+0x65, 0x64, 0x69, 0x6e, 0x61, 0x72, 0x20, 0x74, 0x75, 0x6e, 0x69, 0x73,
+0x69, 0x65, 0x6e, 0x76, 0x61, 0x74, 0x75, 0x20, 0x76, 0x61, 0x6e, 0x75,
+0x61, 0x74, 0x75, 0x61, 0x6e, 0x4d, 0x62, 0x75, 0x75, 0x257, 0x75, 0x20,
+0x53, 0x65, 0x65, 0x66, 0x61, 0x61, 0x20, 0x42, 0x43, 0x45, 0x41, 0x4f,
+0xd83a, 0xdd0a, 0xd83a, 0xdd22, 0xd83a, 0xdd2a, 0xd83a, 0xdd22, 0xd83a, 0xdd32, 0x20, 0xd83a,
+0xdd05, 0xd83a, 0xdd0a, 0xd83a, 0xdd00, 0x20, 0xd83a, 0xdd16, 0xd83a, 0xdd2d, 0xd83a, 0xdd45,
+0xd83a, 0xdd2a, 0xd83a, 0xdd32, 0xd83a, 0xdd22, 0xd83a, 0xdd44, 0xd83a, 0xdd32, 0xd83a, 0xdd3a,
+0xd83a, 0xdd2b, 0x20, 0xd83a, 0xdd00, 0xd83a, 0xdd2c, 0xd83a, 0xdd2a, 0xd83a, 0xdd2d, 0xd83a,
+0xdd33, 0xd83a, 0xdd22, 0xd83a, 0xdd0a, 0xd83a, 0xdd22, 0xd83a, 0xdd2a, 0xd83a, 0xdd22, 0xd83a,
+0xdd32, 0x20, 0xd83a, 0xdd1a, 0xd83a, 0xdd35, 0xd83a, 0xdd26, 0xd83a, 0xdd2e, 0xd83a, 0xdd45,
+0xd83a, 0xdd2a, 0xd83a, 0xdd2d, 0x20, 0xd83a, 0xdd00, 0xd83a, 0xdd2c, 0xd83a, 0xdd2a, 0xd83a,
+0xdd2d, 0xd83a, 0xdd33, 0xd83a, 0xdd2d, 0xd83a, 0xdd32, 0xd83a, 0xdd33, 0xd83a, 0xdd2e, 0xd83a,
+0xdd01, 0xd83a, 0xdd22, 0xd83a, 0xdd24, 0xd83a, 0xdd22, 0xd83a, 0xdd27, 0xd83a, 0xdd2d, 0x20,
+0xd83a, 0xdd18, 0xd83a, 0xdd22, 0xd83a, 0xdd25, 0xd83a, 0xdd26, 0xd83a, 0xdd2d, 0xd83a, 0xdd32,
+0xd83a, 0xdd33, 0xd83a, 0xdd2e, 0xd83a, 0xdd05, 0xd83a, 0xdd2d, 0xd83a, 0xdd23, 0xd83a, 0xdd2d,
+0x20, 0xd83a, 0xdd18, 0xd83a, 0xdd22, 0xd83a, 0xdd32, 0xd83a, 0xdd22, 0xd83a, 0xdd32, 0xd83a,
+0xdd33, 0xd83a, 0xdd2e, 0xd83a, 0xdd0a, 0xd83a, 0xdd22, 0xd83a, 0xdd2a, 0xd83a, 0xdd22, 0xd83a,
+0xdd32, 0x20, 0xd83a, 0xdd18, 0xd83a, 0xdd2d, 0xd83a, 0xdd32, 0xd83a, 0xdd2b, 0xd83a, 0xdd32,
+0xd83a, 0xdd33, 0xd83a, 0xdd2e, 0xd83a, 0xdd01, 0xd83a, 0xdd22, 0xd83a, 0xdd24, 0xd83a, 0xdd22,
+0x20, 0xd83a, 0xdd02, 0xd83a, 0xdd2d, 0xd83a, 0xdd26, 0xd83a, 0xdd2b, 0xd83a, 0xdd2a, 0xd83a,
+0xdd2d, 0xd83a, 0xdd34, 0xd83a, 0xdd22, 0xd83a, 0xdd32, 0xd83a, 0xdd33, 0xd83a, 0xdd2e, 0xd83a,
+0xdd13, 0xd83a, 0xdd3a, 0xd83a, 0xdd2d, 0xd83a, 0xdd34, 0xd83a, 0xdd22, 0x20, 0xd83a, 0xdd03,
+0xd83a, 0xdd2e, 0xd83a, 0xdd2a, 0xd83a, 0xdd2d, 0xd83a, 0xdd3c, 0xd83a, 0xdd22, 0xd83a, 0xdd32,
+0xd83a, 0xdd2d, 0xd83a, 0xdd34, 0xd83a, 0xdd22, 0xd83a, 0xdd32, 0xd83a, 0xdd33, 0xd83a, 0xdd2e,
+0xd83a, 0xdd10, 0xd83a, 0xdd22, 0xd83a, 0xdd34, 0xd83a, 0xdd2a, 0xd83a, 0xdd22, 0x20, 0xd83a,
+0xdd10, 0xd83a, 0xdd22, 0xd83a, 0xdd36, 0xd83a, 0xdd2d, 0xd83a, 0xdd2a, 0xd83a, 0xdd22, 0xd83a,
+0xdd34, 0xd83a, 0xdd22, 0xd83a, 0xdd32, 0xd83a, 0xdd33, 0xd83a, 0xdd2e, 0xd83a, 0xdd02, 0xd83a,
+0xdd2b, 0xd83a, 0xdd34, 0xd83a, 0xdd2e, 0xd83a, 0xdd32, 0x20, 0xd83a, 0xdd05, 0xd83a, 0xdd2b,
+0xd83a, 0xdd2a, 0xd83a, 0xdd22, 0xd83a, 0xdd24, 0xd83a, 0xdd2d, 0xd83a, 0xdd34, 0xd83a, 0xdd22,
+0xd83a, 0xdd32, 0xd83a, 0xdd33, 0xd83a, 0xdd2e, 0x4d, 0x62, 0x75, 0x75, 0x257, 0x69,
+0x20, 0x53, 0x65, 0x65, 0x66, 0x61, 0x61, 0x20, 0x42, 0x45, 0x41, 0x43,
+0x44, 0x61, 0x6c, 0x61, 0x73, 0x69, 0x20, 0x47, 0x61, 0x6d, 0x6d, 0x62,
+0x69, 0x44, 0x6f, 0x6c, 0x61, 0x61, 0x72, 0x20, 0x4c, 0x69, 0x62, 0x65,
+0x72, 0x69, 0x79, 0x61, 0x61, 0x55, 0x67, 0x69, 0x79, 0x79, 0x61, 0x20,
+0x4d, 0x75, 0x72, 0x69, 0x74, 0x61, 0x6e, 0x69, 0x4e, 0x61, 0x79, 0x72,
+0x61, 0x61, 0x20, 0x4e, 0x69, 0x6a, 0x65, 0x72, 0x69, 0x79, 0x61, 0x61,
+0x4c, 0x65, 0x77, 0x6f, 0x6f, 0x6e, 0x20, 0x53, 0x65, 0x72, 0x61, 0x61,
+0x20, 0x4c, 0x69, 0x79, 0x6f, 0x6e, 0x50, 0x75, 0x6e, 0x6e, 0x64, 0x20,
+0x53, 0x61, 0x73, 0x61, 0x6e, 0x6e, 0x61, 0x63, 0x68, 0x53, 0x69, 0x6c,
+0x69, 0x6e, 0x67, 0x69, 0x20, 0x65, 0x79, 0x61, 0x20, 0x59, 0x75, 0x67,
+0x61, 0x6e, 0x64, 0x61, 0x10e5, 0x10d0, 0x10e0, 0x10d7, 0x10e3, 0x10da, 0x10d8, 0x20,
+0x10da, 0x10d0, 0x10e0, 0x10d8, 0x53, 0x63, 0x68, 0x77, 0x65, 0x69, 0x7a, 0x65,
+0x72, 0x20, 0x46, 0x72, 0x61, 0x6e, 0x6b, 0x65, 0x6e, 0x395, 0x3c5, 0x3c1,
+0x3ce, 0xaad, 0xabe, 0xab0, 0xaa4, 0xac0, 0xaaf, 0x20, 0xab0, 0xac2, 0xaaa, 0xabf,
+0xaaf, 0xabe, 0x4e, 0x61, 0x69, 0x72, 0x61, 0x72, 0x20, 0x4e, 0x61, 0x6a,
+0x65, 0x72, 0x69, 0x79, 0x61, 0x646, 0x64e, 0x64a, 0x652, 0x631, 0x64e, 0x53,
+0x69, 0x64, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x47, 0x68, 0x61, 0x6e, 0x61,
+0x4b, 0x75, 0x257, 0x69, 0x6e, 0x20, 0x53, 0x65, 0x66, 0x61, 0x20, 0x6e,
+0x61, 0x20, 0x41, 0x66, 0x69, 0x72, 0x6b, 0x61, 0x20, 0x54, 0x61, 0x20,
+0x59, 0x61, 0x6d, 0x6d, 0x61, 0x5e9, 0x5e7, 0x5dc, 0x20, 0x5d7, 0x5d3, 0x5e9,
+0x92d, 0x93e, 0x930, 0x924, 0x940, 0x92f, 0x20, 0x930, 0x941, 0x92a, 0x92f, 0x93e,
+0x6d, 0x61, 0x67, 0x79, 0x61, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x69, 0x6e,
+0x74, 0xed, 0x73, 0x6c, 0x65, 0x6e, 0x73, 0x6b, 0x20, 0x6b, 0x72, 0xf3,
+0x6e, 0x61, 0x4e, 0x61, 0x1ecb, 0x72, 0x61, 0x52, 0x75, 0x70, 0x69, 0x61,
+0x68, 0x20, 0x49, 0x6e, 0x64, 0x6f, 0x6e, 0x65, 0x73, 0x69, 0x61, 0x50,
+0x75, 0x6e, 0x74, 0x20, 0x53, 0x74, 0x65, 0x69, 0x72, 0x6c, 0x69, 0x6e,
+0x67, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x6f, 0x20, 0x73, 0x76, 0x69, 0x7a,
+0x7a, 0x65, 0x72, 0x6f, 0x65e5, 0x672c, 0x5186, 0x41, 0x331, 0x6e, 0x61, 0x69,
+0x72, 0x61, 0x73, 0x65, 0x65, 0x66, 0x61, 0x20, 0x79, 0x61, 0x74, 0x69,
+0x20, 0x42, 0x43, 0x45, 0x41, 0x4f, 0x53, 0x6b, 0x75, 0x64, 0x75, 0x20,
+0x4b, 0x61, 0x62, 0x75, 0x76, 0x65, 0x72, 0x64, 0x69, 0x61, 0x6e, 0x75,
+0x41, 0x64, 0x69, 0x6e, 0x61, 0x72, 0x20, 0x41, 0x7a, 0x7a, 0x61, 0x79,
+0x72, 0x69, 0x46, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x43, 0x46, 0x41, 0x64,
+0x61, 0x6e, 0x6d, 0x61, 0x72, 0x6b, 0x69, 0x6d, 0x75, 0x74, 0x20, 0x6b,
+0x6f, 0x72, 0x75, 0x75, 0x6e, 0x69, 0x53, 0x69, 0x6c, 0x69, 0x6e, 0x67,
+0x69, 0x74, 0x61, 0x62, 0x20, 0x79, 0x61, 0x20, 0x4b, 0x65, 0x6e, 0x79,
+0x61, 0x53, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x79, 0x61, 0x20,
+0x4b, 0x65, 0x6e, 0x79, 0x61, 0xcad, 0xcbe, 0xcb0, 0xca4, 0xcc0, 0xcaf, 0x20,
+0xcb0, 0xcc2, 0xcaa, 0xcbe, 0xcaf, 0xcbf, 0x6c1, 0x650, 0x646, 0x62f, 0x64f, 0x633,
+0x62a, 0x672, 0x646, 0x6cd, 0x20, 0x631, 0x6c4, 0x67e, 0x64e, 0x6d2, 0x907, 0x902,
+0x921, 0x93f, 0x92f, 0x928, 0x20, 0x930, 0x942, 0x92a, 0x940, 0x49a, 0x430, 0x437,
+0x430, 0x49b, 0x441, 0x442, 0x430, 0x43d, 0x20, 0x442, 0x435, 0x4a3, 0x433, 0x435,
+0x441, 0x456, 0x179a, 0x17c0, 0x179b, 0x200b, 0x1780, 0x1798, 0x17d2, 0x1796, 0x17bb, 0x1787,
+0x17b6, 0x43, 0x69, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x79, 0x61, 0x20,
+0x4b, 0x65, 0x6e, 0x79, 0x61, 0xb300, 0xd55c, 0xbbfc, 0xad6d, 0x20, 0xc6d0, 0xc911,
+0xad6d, 0x20, 0xc704, 0xc548, 0xd654, 0xc870, 0xc120, 0x20, 0xbbfc, 0xc8fc, 0xc8fc, 0xc758,
+0x20, 0xc778, 0xbbfc, 0x20, 0xacf5, 0xd654, 0xad6d, 0x20, 0xc6d0, 0x43, 0x46, 0x41,
+0x20, 0x46, 0x72, 0x61, 0x14b, 0x20, 0x28, 0x42, 0x43, 0x45, 0x41, 0x4f,
+0x29, 0x6c, 0xee, 0x72, 0x65, 0x79, 0xea, 0x20, 0x74, 0x69, 0x72, 0x6b,
+0xee, 0x46, 0x72, 0x61, 0x14b, 0x20, 0x43, 0x46, 0x41, 0x20, 0x42, 0x45,
+0x41, 0x43, 0x41a, 0x44b, 0x440, 0x433, 0x44b, 0x437, 0x441, 0x442, 0x430, 0x43d,
+0x20, 0x441, 0x43e, 0x43c, 0x443, 0x53, 0x68, 0x69, 0x6c, 0xed, 0x69, 0x6e,
+0x67, 0x69, 0x20, 0x79, 0x61, 0x20, 0x54, 0x61, 0x61, 0x6e, 0x73, 0x61,
+0x6e, 0xed, 0x61, 0xea5, 0xeb2, 0xea7, 0x20, 0xe81, 0xeb5, 0xe9a, 0x65, 0x69,
+0x72, 0x6f, 0x46, 0x61, 0x6c, 0xe1, 0x6e, 0x67, 0x61, 0x20, 0x79, 0x61,
+0x20, 0x4b, 0x6f, 0x6e, 0x67, 0xf3, 0x4b, 0x77, 0x61, 0x6e, 0x7a, 0x61,
+0x20, 0x79, 0x61, 0x20, 0x41, 0x6e, 0x67, 0xf3, 0x6c, 0x61, 0x46, 0x61,
+0x6c, 0xe1, 0x6e, 0x67, 0x61, 0x20, 0x43, 0x46, 0x41, 0x20, 0x42, 0x45,
+0x41, 0x43, 0x45, 0x75, 0x72, 0x61, 0x73, 0x4e, 0x66, 0x61, 0x6c, 0x61,
+0x6e, 0x67, 0x61, 0x20, 0x77, 0x61, 0x20, 0x4b, 0x6f, 0x6e, 0x67, 0x75,
+0x53, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x6d, 0x61, 0x72, 0x20, 0x4b,
+0x65, 0x6e, 0x79, 0x61, 0x53, 0x69, 0x72, 0x69, 0x6e, 0x6a, 0x69, 0x20,
+0x79, 0x61, 0x20, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x41c, 0x430, 0x43a, 0x435,
+0x434, 0x43e, 0x43d, 0x441, 0x43a, 0x438, 0x20, 0x434, 0x435, 0x43d, 0x430, 0x440,
+0x53, 0x68, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x79, 0x61, 0x20,
+0x54, 0x61, 0x6e, 0x7a, 0x61, 0x6e, 0x69, 0x61, 0xd07, 0xd28, 0xd4d, 0xd24,
+0xd4d, 0xd2f, 0xd7b, 0x20, 0xd30, 0xd42, 0xd2a, 0x52, 0x69, 0x6e, 0x67, 0x67,
+0x69, 0x74, 0x20, 0x4d, 0x61, 0x6c, 0x61, 0x79, 0x73, 0x69, 0x61, 0x62f,
+0x648, 0x644, 0x631, 0x20, 0x628, 0x631, 0x648, 0x646, 0x64a, 0x631, 0x64a, 0x6a0,
+0x762, 0x64a, 0x62a, 0x20, 0x645, 0x644, 0x64a, 0x633, 0x64a, 0x627, 0x44, 0x6f,
+0x6c, 0x61, 0x72, 0x20, 0x42, 0x72, 0x75, 0x6e, 0x65, 0x69, 0x44, 0x6f,
+0x6c, 0x61, 0x72, 0x20, 0x53, 0x69, 0x6e, 0x67, 0x61, 0x70, 0x75, 0x72,
+0x61, 0x65, 0x77, 0x72, 0x6f, 0x987, 0x9a8, 0x9cd, 0x9a6, 0x9bf, 0x9af, 0x9bc,
+0x9be, 0x9a8, 0x20, 0x9b0, 0x9c1, 0x9aa, 0x9c0, 0x54, 0x101, 0x72, 0x61, 0x20,
+0x6f, 0x20, 0x41, 0x6f, 0x74, 0x65, 0x61, 0x72, 0x6f, 0x61, 0x49, 0x72,
+0x6f, 0x70, 0x69, 0x79, 0x69, 0x61, 0x6e, 0xed, 0x20, 0x65, 0x20, 0x4b,
+0x65, 0x6e, 0x79, 0x61, 0x49, 0x72, 0x6f, 0x70, 0x69, 0x79, 0x69, 0x61,
+0x6e, 0xed, 0x20, 0x65, 0x20, 0x54, 0x61, 0x6e, 0x7a, 0x61, 0x6e, 0x69,
+0x61, 0x627, 0x6cc, 0x631, 0x627, 0x646, 0x20, 0x631, 0x6cc, 0x627, 0x644, 0x73,
+0x68, 0x69, 0x72, 0xe8, 0x41c, 0x43e, 0x43d, 0x433, 0x43e, 0x43b, 0x20, 0x442,
+0x4e9, 0x433, 0x440, 0x4e9, 0x433, 0x44e, 0x430, 0x43d, 0x44c, 0x1833, 0x1825, 0x182c,
+0x1825, 0x1837, 0x1822, 0x182d, 0x180c, 0x72, 0x6f, 0x75, 0x70, 0x69, 0x20, 0x6d,
+0x6f, 0x72, 0x69, 0x73, 0x69, 0x65, 0x6e, 0x73, 0x6f, 0x6c, 0x61, 0x69,
+0x20, 0x42, 0x45, 0x41, 0x43, 0x4e, 0x61, 0x6d, 0x69, 0x62, 0x69, 0x61,
+0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x69, 0x928, 0x947, 0x92a, 0x93e,
+0x932, 0x940, 0x20, 0x930, 0x942, 0x92a, 0x948, 0x92f, 0x93e, 0x901, 0x92d, 0x93e,
+0x930, 0x924, 0x940, 0x92f, 0x20, 0x930, 0x942, 0x92a, 0x93f, 0x901, 0x92f, 0x93e,
+0x66, 0x65, 0x6c, 0xe1, 0x14b, 0x20, 0x43, 0x46, 0x41, 0x46, 0x25b, 0x6c,
+0xe2, 0x14b, 0x4e, 0x61, 0x69, 0x6a, 0xed, 0x72, 0x69, 0xe1, 0x20, 0x4e,
+0x61, 0xed, 0x72, 0x61, 0x7d6, 0x7cc, 0x7ec, 0x7e3, 0x7cd, 0x7ec, 0x7de, 0x7ca,
+0x20, 0x7df, 0x7ce, 0x7ec, 0x20, 0x7df, 0x7ca, 0x7eb, 0x20, 0x7dd, 0x7ca, 0x7d9,
+0x7ca, 0x7f2, 0x6e, 0x6f, 0x72, 0x67, 0x67, 0x61, 0x20, 0x6b, 0x72, 0x75,
+0x76, 0x64, 0x6e, 0x6f, 0x72, 0x75, 0x6f, 0x167, 0x167, 0x61, 0x20, 0x6b,
+0x72, 0x75, 0x76, 0x64, 0x6e, 0x6f, 0x44, 0x6f, 0x6c, 0x61, 0x20, 0x79,
+0x61, 0x73, 0x65, 0x20, 0x41, 0x6d, 0x65, 0x6c, 0x69, 0x6b, 0x61, 0x6e,
+0x6f, 0x72, 0x73, 0x6b, 0x65, 0x20, 0x6b, 0x72, 0x6f, 0x6e, 0x65, 0x72,
+0xb2d, 0xb3e, 0xb30, 0xb24, 0xb40, 0xb5f, 0x20, 0xb1f, 0xb19, 0xb4d, 0xb15, 0xb3e,
+0x49, 0x74, 0x6f, 0x6f, 0x70, 0x68, 0x69, 0x79, 0x61, 0x61, 0x20, 0x42,
+0x69, 0x72, 0x72, 0x69, 0x69, 0x41b, 0x430, 0x440, 0x421, 0x43e, 0x43c, 0x46,
+0x6c, 0x6f, 0x72, 0x69, 0x6e, 0x46, 0x6c, 0x6f, 0x72, 0x69, 0x6e, 0x20,
+0x64, 0x69, 0x20, 0x41, 0x72, 0x75, 0x62, 0x61, 0x627, 0x641, 0x63a, 0x627,
+0x646, 0x6cd, 0x67e, 0x627, 0x6a9, 0x633, 0x62a, 0x627, 0x646, 0x6cd, 0x20, 0x6a9,
+0x644, 0x62f, 0x627, 0x631, 0x647, 0x631, 0x6cc, 0x627, 0x644, 0x20, 0x627, 0x6cc,
+0x631, 0x627, 0x646, 0x627, 0x641, 0x63a, 0x627, 0x646, 0x6cc, 0x20, 0x627, 0x641,
+0x63a, 0x627, 0x646, 0x633, 0x62a, 0x627, 0x646, 0x7a, 0x142, 0x6f, 0x74, 0x79,
+0x20, 0x70, 0x6f, 0x6c, 0x73, 0x6b, 0x69, 0x52, 0x65, 0x61, 0x6c, 0x20,
+0x62, 0x72, 0x61, 0x73, 0x69, 0x6c, 0x65, 0x69, 0x72, 0x6f, 0x6b, 0x77,
+0x61, 0x6e, 0x7a, 0x61, 0x20, 0x61, 0x6e, 0x67, 0x6f, 0x6c, 0x61, 0x6e,
+0x6f, 0x65, 0x73, 0x63, 0x75, 0x64, 0x6f, 0x20, 0x63, 0x61, 0x62, 0x6f,
+0x2d, 0x76, 0x65, 0x72, 0x64, 0x69, 0x61, 0x6e, 0x6f, 0x66, 0x72, 0x61,
+0x6e, 0x63, 0x6f, 0x20, 0x43, 0x46, 0x41, 0x20, 0x28, 0x42, 0x45, 0x41,
+0x43, 0x29, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x6f, 0x20, 0x43, 0x46, 0x41,
+0x20, 0x28, 0x42, 0x43, 0x45, 0x41, 0x4f, 0x29, 0x70, 0x61, 0x74, 0x61,
+0x63, 0x61, 0x20, 0x6d, 0x61, 0x63, 0x61, 0x65, 0x6e, 0x73, 0x65, 0x6d,
+0x65, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x6f, 0xe7, 0x61, 0x6d,
+0x62, 0x69, 0x63, 0x61, 0x6e, 0x6f, 0x64, 0x6f, 0x62, 0x72, 0x61, 0x20,
+0x64, 0x65, 0x20, 0x53, 0xe3, 0x6f, 0x20, 0x54, 0x6f, 0x6d, 0xe9, 0x20,
+0x65, 0x20, 0x50, 0x72, 0xed, 0x6e, 0x63, 0x69, 0x70, 0x65, 0x66, 0x72,
+0x61, 0x6e, 0x63, 0x6f, 0x20, 0x73, 0x75, 0xed, 0xe7, 0x6f, 0x64, 0xf3,
+0x6c, 0x61, 0x72, 0x20, 0x64, 0x6f, 0x73, 0x20, 0x45, 0x73, 0x74, 0x61,
+0x64, 0x6f, 0x73, 0x20, 0x55, 0x6e, 0x69, 0x64, 0x6f, 0x73, 0xa2d, 0xa3e,
+0xa30, 0xa24, 0xa40, 0x20, 0xa30, 0xa41, 0xa2a, 0xa07, 0xa06, 0x631, 0x648, 0x67e,
+0x626, 0x6cc, 0x6c1, 0x53, 0x6f, 0x6c, 0x20, 0x50, 0x65, 0x72, 0x75, 0x61,
+0x6e, 0x6f, 0x42, 0x6f, 0x6c, 0x69, 0x76, 0x69, 0x61, 0x6e, 0x6f, 0x44,
+0xf3, 0x6c, 0x61, 0x72, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61,
+0x6e, 0x6f, 0x6c, 0x65, 0x75, 0x20, 0x72, 0x6f, 0x6d, 0xe2, 0x6e, 0x65,
+0x73, 0x63, 0x6c, 0x65, 0x75, 0x20, 0x6d, 0x6f, 0x6c, 0x64, 0x6f, 0x76,
+0x65, 0x6e, 0x65, 0x73, 0x63, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x73,
+0x76, 0x69, 0x7a, 0x7a, 0x65, 0x72, 0x68, 0x65, 0x6c, 0x65, 0x72, 0x69,
+0x20, 0x73, 0x61, 0x20, 0x54, 0x61, 0x6e, 0x7a, 0x61, 0x6e, 0x69, 0x61,
+0x49, 0x66, 0x61, 0x72, 0x61, 0x6e, 0x67, 0x61, 0x20, 0x72, 0x79, 0x2019,
+0x55, 0x62, 0x75, 0x72, 0x75, 0x6e, 0x64, 0x69, 0x440, 0x43e, 0x441, 0x441,
+0x438, 0x439, 0x441, 0x43a, 0x438, 0x439, 0x20, 0x440, 0x443, 0x431, 0x43b, 0x44c,
+0x431, 0x435, 0x43b, 0x43e, 0x440, 0x443, 0x441, 0x441, 0x43a, 0x438, 0x439, 0x20,
+0x440, 0x443, 0x431, 0x43b, 0x44c, 0x43a, 0x430, 0x437, 0x430, 0x445, 0x441, 0x43a,
+0x438, 0x439, 0x20, 0x442, 0x435, 0x43d, 0x433, 0x435, 0x43a, 0x438, 0x440, 0x433,
+0x438, 0x437, 0x441, 0x43a, 0x438, 0x439, 0x20, 0x441, 0x43e, 0x43c, 0x43c, 0x43e,
+0x43b, 0x434, 0x430, 0x432, 0x441, 0x43a, 0x438, 0x439, 0x20, 0x43b, 0x435, 0x439,
+0x443, 0x43a, 0x440, 0x430, 0x438, 0x43d, 0x441, 0x43a, 0x430, 0x44f, 0x20, 0x433,
+0x440, 0x438, 0x432, 0x43d, 0x430, 0x410, 0x440, 0x430, 0x441, 0x441, 0x44b, 0x44b,
+0x439, 0x430, 0x20, 0x441, 0x43e, 0x43b, 0x43a, 0x443, 0x43e, 0x431, 0x430, 0x439,
+0x430, 0x4e, 0x6a, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x65, 0x65,
+0x6c, 0x20, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x66, 0x61, 0x72, 0xe2, 0x6e,
+0x67, 0x61, 0x20, 0x43, 0x46, 0x41, 0x20, 0x28, 0x42, 0x45, 0x41, 0x43,
+0x29, 0x49, 0x68, 0x65, 0x6c, 0x61, 0x20, 0x79, 0x61, 0x20, 0x54, 0x61,
+0x6e, 0x73, 0x61, 0x6e, 0x69, 0x79, 0x61, 0x92d, 0x93e, 0x930, 0x924, 0x940,
+0x92f, 0x20, 0x930, 0x942, 0x92a, 0x94d, 0x92f, 0x915, 0x92e, 0x94d, 0x1c65, 0x1c64,
+0x1c67, 0x1c5a, 0x1c5b, 0x20, 0x1c68, 0x1c6e, 0x1c71, 0x1c5f, 0x1c5c, 0x20, 0x1c74, 0x1c5f,
+0x1c60, 0x1c5f, 0xe8, 0x75, 0x72, 0x6f, 0x4d, 0x65, 0x74, 0x69, 0x63, 0x61,
+0x6c, 0x20, 0x64, 0x65, 0x20, 0x4d, 0x6f, 0xe7, 0x61, 0x6d, 0x62, 0x69,
+0x71, 0x75, 0x65, 0x441, 0x440, 0x43f, 0x441, 0x43a, 0x438, 0x20, 0x434, 0x438,
+0x43d, 0x430, 0x440, 0x411, 0x43e, 0x441, 0x430, 0x43d, 0x441, 0x43a, 0x43e, 0x445,
+0x435, 0x440, 0x446, 0x435, 0x433, 0x43e, 0x432, 0x430, 0x447, 0x43a, 0x430, 0x20,
+0x43a, 0x43e, 0x43d, 0x432, 0x435, 0x440, 0x442, 0x438, 0x431, 0x438, 0x43b, 0x43d,
+0x430, 0x20, 0x43c, 0x430, 0x440, 0x43a, 0x430, 0x415, 0x432, 0x440, 0x43e, 0x45,
+0x76, 0x72, 0x6f, 0x73, 0x72, 0x70, 0x73, 0x6b, 0x69, 0x20, 0x64, 0x69,
+0x6e, 0x61, 0x72, 0x73, 0x68, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69, 0x20,
+0x79, 0x61, 0x20, 0x54, 0x61, 0x6e, 0x7a, 0x61, 0x6e, 0x69, 0x61, 0x44,
+0x6f, 0x72, 0x61, 0x20, 0x72, 0x65, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69,
+0x6b, 0x61, 0x67e, 0x627, 0x6aa, 0x633, 0x62a, 0x627, 0x646, 0x64a, 0x20, 0x631,
+0x67e, 0x64a, 0x939, 0x93f, 0x902, 0x926, 0x941, 0x938, 0x94d, 0x924, 0x93e, 0x928,
+0x940, 0x20, 0x930, 0x941, 0x92a, 0x92f, 0x94b, 0xdc1, 0xdca, 0x200d, 0xdbb, 0xdd3,
+0x20, 0xdbd, 0xd82, 0xd9a, 0xdcf, 0x20, 0xdbb, 0xdd4, 0xdb4, 0xdd2, 0xdba, 0xdbd,
+0x65, 0x76, 0x72, 0x6f, 0x53, 0x68, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x6b,
+0x61, 0x20, 0x53, 0x6f, 0x6f, 0x6d, 0x61, 0x61, 0x6c, 0x69, 0x79, 0x61,
+0x46, 0x61, 0x72, 0x61, 0x6e, 0x20, 0x4a, 0x61, 0x62, 0x75, 0x75, 0x74,
+0x69, 0x42, 0x69, 0x72, 0x74, 0x61, 0x20, 0x49, 0x74, 0x6f, 0x6f, 0x62,
+0x62, 0x69, 0x79, 0x61, 0x53, 0x68, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x6b,
+0x61, 0x20, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x70, 0x65, 0x73, 0x6f, 0x20,
+0x61, 0x72, 0x67, 0x65, 0x6e, 0x74, 0x69, 0x6e, 0x6f, 0x64, 0xf3, 0x6c,
+0x61, 0x72, 0x20, 0x62, 0x65, 0x6c, 0x69, 0x63, 0x65, 0xf1, 0x6f, 0x62,
+0x6f, 0x6c, 0x69, 0x76, 0x69, 0x61, 0x6e, 0x6f, 0x72, 0x65, 0x61, 0x6c,
+0x20, 0x62, 0x72, 0x61, 0x73, 0x69, 0x6c, 0x65, 0xf1, 0x6f, 0x50, 0x65,
+0x73, 0x6f, 0x20, 0x63, 0x68, 0x69, 0x6c, 0x65, 0x6e, 0x6f, 0x70, 0x65,
+0x73, 0x6f, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x6d, 0x62, 0x69, 0x61, 0x6e,
+0x6f, 0x63, 0x6f, 0x6c, 0xf3, 0x6e, 0x20, 0x63, 0x6f, 0x73, 0x74, 0x61,
+0x72, 0x72, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x70, 0x65, 0x73, 0x6f,
+0x20, 0x63, 0x75, 0x62, 0x61, 0x6e, 0x6f, 0x70, 0x65, 0x73, 0x6f, 0x20,
+0x64, 0x6f, 0x6d, 0x69, 0x6e, 0x69, 0x63, 0x61, 0x6e, 0x6f, 0x64, 0xf3,
+0x6c, 0x61, 0x72, 0x20, 0x65, 0x73, 0x74, 0x61, 0x64, 0x6f, 0x75, 0x6e,
+0x69, 0x64, 0x65, 0x6e, 0x73, 0x65, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x6f,
+0x20, 0x43, 0x46, 0x41, 0x20, 0x64, 0x65, 0x20, 0xc1, 0x66, 0x72, 0x69,
+0x63, 0x61, 0x20, 0x43, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x71, 0x75,
+0x65, 0x74, 0x7a, 0x61, 0x6c, 0x6c, 0x65, 0x6d, 0x70, 0x69, 0x72, 0x61,
+0x20, 0x68, 0x6f, 0x6e, 0x64, 0x75, 0x72, 0x65, 0xf1, 0x6f, 0x70, 0x65,
+0x73, 0x6f, 0x20, 0x6d, 0x65, 0x78, 0x69, 0x63, 0x61, 0x6e, 0x6f, 0x63,
+0xf3, 0x72, 0x64, 0x6f, 0x62, 0x61, 0x20, 0x6e, 0x69, 0x63, 0x61, 0x72,
+0x61, 0x67, 0xfc, 0x65, 0x6e, 0x73, 0x65, 0x62, 0x61, 0x6c, 0x62, 0x6f,
+0x61, 0x20, 0x70, 0x61, 0x6e, 0x61, 0x6d, 0x65, 0xf1, 0x6f, 0x67, 0x75,
+0x61, 0x72, 0x61, 0x6e, 0xed, 0x20, 0x70, 0x61, 0x72, 0x61, 0x67, 0x75,
+0x61, 0x79, 0x6f, 0x73, 0x6f, 0x6c, 0x20, 0x70, 0x65, 0x72, 0x75, 0x61,
+0x6e, 0x6f, 0x70, 0x65, 0x73, 0x6f, 0x20, 0x66, 0x69, 0x6c, 0x69, 0x70,
+0x69, 0x6e, 0x6f, 0x70, 0x65, 0x73, 0x6f, 0x20, 0x75, 0x72, 0x75, 0x67,
+0x75, 0x61, 0x79, 0x6f, 0x62, 0x6f, 0x6c, 0xed, 0x76, 0x61, 0x72, 0x20,
+0x73, 0x6f, 0x62, 0x65, 0x72, 0x61, 0x6e, 0x6f, 0x2d30, 0x2d37, 0x2d54, 0x2d49,
+0x2d4e, 0x20, 0x2d4f, 0x20, 0x2d4d, 0x2d4e, 0x2d56, 0x2d54, 0x2d49, 0x2d31, 0x52, 0x75,
+0x70, 0x65, 0x65, 0x20, 0x49, 0x6e, 0x64, 0x6f, 0x6e, 0xe9, 0x73, 0x69,
+0x61, 0x46, 0x61, 0x72, 0x61, 0x6e, 0x67, 0x61, 0x20, 0x79, 0x61, 0x20,
+0x4b, 0x6f, 0x6e, 0x67, 0x6f, 0x53, 0x68, 0x69, 0x6c, 0x69, 0x6e, 0x67,
+0x69, 0x20, 0x79, 0x61, 0x20, 0x55, 0x67, 0x61, 0x6e, 0x64, 0x61, 0x73,
+0x76, 0x65, 0x6e, 0x73, 0x6b, 0x20, 0x6b, 0x72, 0x6f, 0x6e, 0x61, 0x53,
+0x63, 0x68, 0x77, 0x69, 0x69, 0x7a, 0x65, 0x72, 0x20, 0x46, 0x72, 0x61,
+0x6e, 0x6b, 0x65, 0x61, 0x64, 0x72, 0x69, 0x6d, 0x20, 0x6e, 0x20, 0x6c,
+0x6d, 0x263, 0x72, 0x69, 0x62, 0x421, 0x43e, 0x43c, 0x43e, 0x43d, 0x4e3, 0xb87,
+0xba8, 0xbcd, 0xba4, 0xbbf, 0xbaf, 0x20, 0xbb0, 0xbc2, 0xbaa, 0xbbe, 0xbaf, 0xbcd,
+0xbae, 0xbb2, 0xbc7, 0xbb7, 0xbbf, 0xbaf, 0xba9, 0xbcd, 0x20, 0xbb0, 0xbbf, 0xb99,
+0xbcd, 0xb95, 0xbbf, 0xb9f, 0xbcd, 0xb9a, 0xbbf, 0xb99, 0xbcd, 0xb95, 0xbaa, 0xbcd,
+0xbaa, 0xbc2, 0xbb0, 0xbcd, 0x20, 0xb9f, 0xbbe, 0xbb2, 0xbb0, 0xbcd, 0xb87, 0xbb2,
+0xb99, 0xbcd, 0xb95, 0xbc8, 0x20, 0xbb0, 0xbc2, 0xbaa, 0xbbe, 0xbaf, 0xbcd, 0x70,
+0x69, 0x6c, 0x61, 0x20, 0x54, 0x61, 0x69, 0x77, 0x61, 0x6e, 0x420, 0x43e,
+0x441, 0x441, 0x438, 0x44f, 0x20, 0x441, 0x443, 0x43c, 0x44b, 0xc2d, 0xc3e, 0xc30,
+0xc24, 0xc26, 0xc47, 0xc36, 0x20, 0xc30, 0xc42, 0xc2a, 0xc3e, 0xc2f, 0xc3f, 0x41,
+0x6e, 0x67, 0x6f, 0x2019, 0x6f, 0x74, 0x6f, 0x6c, 0x20, 0x6c, 0x6f, 0x6b,
+0x2019, 0x20, 0x55, 0x67, 0x61, 0x6e, 0x64, 0x61, 0x41, 0x6e, 0x67, 0x6f,
+0x2019, 0x6f, 0x74, 0x6f, 0x6c, 0x20, 0x6c, 0x6f, 0x6b, 0x2019, 0x20, 0x4b,
+0x65, 0x6e, 0x79, 0x61, 0xe1a, 0xe32, 0xe17, 0xf61, 0xf74, 0xf0b, 0xf68, 0xf53,
+0xf0b, 0xf62, 0xf92, 0xfb1, 0xf0b, 0xf42, 0xf62, 0xf0b, 0xf66, 0xf92, 0xf7c, 0xf62,
+0xf0b, 0x1293, 0x1255, 0x134b, 0x50, 0x61, 0x2bb, 0x61, 0x6e, 0x67, 0x61, 0x20,
+0x66, 0x61, 0x6b, 0x61, 0x74, 0x6f, 0x6e, 0x67, 0x61, 0x54, 0xfc, 0x72,
+0x6b, 0x20, 0x6c, 0x69, 0x72, 0x61, 0x73, 0x131, 0x54, 0xfc, 0x72, 0x6b,
+0x6d, 0x65, 0x6e, 0x20, 0x6d, 0x61, 0x6e, 0x61, 0x64, 0x79, 0x4e, 0x65,
+0x72, 0x61, 0x443, 0x43a, 0x440, 0x430, 0x457, 0x43d, 0x441, 0x44c, 0x43a, 0x430,
+0x20, 0x433, 0x440, 0x438, 0x432, 0x43d, 0x44f, 0x67e, 0x627, 0x6a9, 0x633, 0x62a,
+0x627, 0x646, 0x6cc, 0x20, 0x631, 0x648, 0x67e, 0x6cc, 0x6c1, 0x628, 0x6be, 0x627,
+0x631, 0x62a, 0x6cc, 0x20, 0x631, 0x648, 0x67e, 0x6cc, 0x6c1, 0x62c, 0x6c7, 0x6ad,
+0x6af, 0x648, 0x20, 0x64a, 0x6c8, 0x6d5, 0x646, 0x649, 0x4f, 0x2018, 0x7a, 0x62,
+0x65, 0x6b, 0x69, 0x73, 0x74, 0x6f, 0x6e, 0x20, 0x73, 0x6f, 0x2018, 0x6d,
+0x69, 0x40e, 0x437, 0x431, 0x435, 0x43a, 0x438, 0x441, 0x442, 0x43e, 0x43d, 0x20,
+0x441, 0x45e, 0x43c, 0xa55e, 0xa524, 0xa52b, 0xa569, 0x20, 0xa55c, 0xa55e, 0xa54c, 0x4c,
+0x61, 0x69, 0x62, 0x68, 0x69, 0x79, 0x61, 0x20, 0x44, 0x61, 0x6c, 0x61,
+0x110, 0x1ed3, 0x6e, 0x67, 0x20, 0x56, 0x69, 0x1ec7, 0x74, 0x20, 0x4e, 0x61,
+0x6d, 0x50, 0x75, 0x6e, 0x74, 0x20, 0x50, 0x72, 0x79, 0x64, 0x61, 0x69,
+0x6e, 0x67e, 0x627, 0x6a9, 0x633, 0x62a, 0x627, 0x646, 0x626, 0x20, 0x631, 0x648,
+0x67e, 0x6cc, 0x627, 0x648, 0x6af, 0x627, 0x646, 0x633, 0x62a, 0x627, 0x646, 0x626,
+0x20, 0x627, 0x648, 0x6af, 0x627, 0x646, 0x6cc, 0x627, 0x6cc, 0x631, 0x627, 0x646,
+0x626, 0x20, 0x631, 0x6cc, 0x627, 0x644, 0x46, 0x72, 0x61, 0x6e, 0x63, 0x20,
+0x43, 0x46, 0x41, 0x20, 0x62, 0x75, 0x20, 0x41, 0x66, 0x72, 0x69, 0x6b,
+0x20, 0x53, 0x6f, 0x77, 0x77, 0x75, 0x2d, 0x6a, 0x61, 0x6e, 0x74, 0x49,
+0x52, 0x61, 0x6e, 0x64, 0x69, 0x20, 0x79, 0x61, 0x73, 0x65, 0x4d, 0x7a,
+0x61, 0x6e, 0x74, 0x73, 0x69, 0x20, 0x41, 0x66, 0x72, 0x69, 0x6b, 0x61,
+0x4e, 0xe1, 0xed, 0x72, 0xe0, 0x20, 0x4e, 0xe0, 0xec, 0x6a, 0xed, 0x72,
+0xed, 0xe0, 0x46, 0x61, 0x72, 0x61, 0x6e, 0x73, 0xec, 0x20, 0xec, 0x77,
+0x254, 0x300, 0x2d, 0x6f, 0x6f, 0x72, 0xf9, 0x6e, 0x20, 0x41, 0x66, 0xed,
+0x72, 0xed, 0x6b, 0xe0, 0x79, 0x69, 0x6e, 0x7a, 0x6d, 0x69, 0x6e, 0x7a,
+0x62, 0x69, 0x69, 0x2d, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x20, 0x41, 0x66,
+0x72, 0x69, 0x63, 0x61, 0x6e, 0x20, 0x52, 0x61, 0x6e, 0x64, 0x4d, 0x72,
+0x61, 0x73, 0x69, 0x72, 0x20, 0x52, 0x65, 0x6a, 0x61, 0x72, 0x52, 0x65,
+0x61, 0x75, 0x20, 0x42, 0x72, 0x61, 0x73, 0x69, 0x75, 0x77, 0x61, 0x72,
+0x61, 0x50, 0x65, 0x73, 0x6f, 0x20, 0x4b, 0x75, 0x72, 0x169, 0x62, 0x69,
+0x79, 0x61, 0x77, 0x61, 0x72, 0x61, 0x42, 0x75, 0x72, 0x69, 0x77, 0x61,
+0x72, 0x69, 0x20, 0x57, 0x65, 0x6e, 0x65, 0x73, 0x75, 0x65, 0x72, 0x61,
+0x77, 0x61, 0x72, 0x61, 0x50, 0xe1, 0x6b, 0x65, 0x73, 0x74, 0xe1, 0x6e,
+0x69, 0x20, 0x72, 0x75, 0x70, 0x69, 0x47, 0x61, 0x72, 0x269, 0x256, 0x6f,
+0x6e, 0x74, 0x1dd, 0x6e, 0x61, 0x20, 0x67, 0x269, 0x74, 0x65, 0x14b, 0x73,
+0x68, 0x69, 0x6c, 0x65, 0x6c, 0x61, 0x14b, 0x20, 0x6b, 0x61, 0x73, 0x25b,
+0x25b, 0x66, 0x61, 0x92d, 0x93e, 0x930, 0x924, 0x947, 0x20, 0x926, 0x93e, 0x20,
+0x930, 0x941, 0x92a, 0x92f, 0x93e
};
-static const char16_t currency_format_data[] = {
-0x25, 0x31, 0x25, 0x32, 0x25, 0x32, 0xa0, 0x25, 0x31, 0x25, 0x32, 0x25, 0x31, 0x28, 0x25, 0x32, 0x25, 0x31, 0x29, 0x25,
-0x31, 0xa0, 0x25, 0x32, 0x28, 0x25, 0x31, 0xa0, 0x25, 0x32, 0x29, 0x28, 0x25, 0x31, 0x25, 0x32, 0x29, 0x28, 0x25, 0x32,
-0xa0, 0x25, 0x31, 0x29, 0x25, 0x32, 0x2d, 0x25, 0x31, 0x25, 0x32, 0x2212, 0x25, 0x31, 0x25, 0x32, 0x2d, 0xa0, 0x25, 0x31,
-0x200e, 0x25, 0x32, 0xa0, 0x25, 0x31, 0x200e, 0x28, 0x25, 0x32, 0xa0, 0x25, 0x31, 0x29
+static constexpr char16_t currency_format_data[] = {
+0x25, 0x31, 0x25, 0x32, 0x25, 0x31, 0xa0, 0x25, 0x32, 0x28, 0x25, 0x32,
+0x25, 0x31, 0x29, 0x25, 0x32, 0xa0, 0x25, 0x31, 0x28, 0x25, 0x31, 0xa0,
+0x25, 0x32, 0x29, 0x200f, 0x25, 0x31, 0xa0, 0x25, 0x32, 0x61c, 0x25, 0x31,
+0x25, 0x32, 0x28, 0x61c, 0x25, 0x31, 0x25, 0x32, 0x29, 0x28, 0x25, 0x31,
+0x25, 0x32, 0x29, 0x28, 0x25, 0x31, 0x29, 0xa0, 0x25, 0x32, 0x28, 0x25,
+0x32, 0xa0, 0x25, 0x31, 0x29, 0x25, 0x32, 0x2d, 0x25, 0x31, 0x200f, 0x25,
+0x31, 0xa0, 0x200f, 0x25, 0x32, 0x200f, 0x200e, 0x2d, 0x25, 0x31, 0xa0, 0x200f,
+0x25, 0x32, 0x25, 0x32, 0xa0, 0x2d, 0x25, 0x31, 0x25, 0x32, 0x2212, 0x25,
+0x31, 0x25, 0x32, 0x2d, 0xa0, 0x25, 0x31, 0x200e, 0x25, 0x32, 0xa0, 0x25,
+0x31, 0x200e, 0x28, 0x25, 0x32, 0xa0, 0x25, 0x31, 0x29, 0x25, 0x31, 0x202f,
+0x25, 0x32
};
-static const char16_t endonyms_data[] = {
-0x41, 0x66, 0x72, 0x69, 0x6b, 0x61, 0x61, 0x6e, 0x73, 0x53, 0x75, 0x69, 0x64, 0x2d, 0x41, 0x66, 0x72, 0x69, 0x6b, 0x61,
-0x4e, 0x61, 0x6d, 0x69, 0x62, 0x69, 0xeb, 0x41, 0x67, 0x68, 0x65, 0x6d, 0x4b, 0xe0, 0x6d, 0xe0, 0x6c, 0xfb, 0x14b, 0x41,
-0x6b, 0x61, 0x6e, 0x47, 0x61, 0x61, 0x6e, 0x61, 0x73, 0x68, 0x71, 0x69, 0x70, 0x53, 0x68, 0x71, 0x69, 0x70, 0xeb, 0x72,
-0x69, 0x4b, 0x6f, 0x73, 0x6f, 0x76, 0xeb, 0x4d, 0x61, 0x71, 0x65, 0x64, 0x6f, 0x6e, 0x69, 0x61, 0x20, 0x65, 0x20, 0x56,
-0x65, 0x72, 0x69, 0x75, 0x74, 0x12a0, 0x121b, 0x122d, 0x129b, 0x12a2, 0x1275, 0x12ee, 0x1335, 0x12eb, 0x627, 0x644, 0x639, 0x631, 0x628, 0x64a,
-0x629, 0x645, 0x635, 0x631, 0x627, 0x644, 0x62c, 0x632, 0x627, 0x626, 0x631, 0x627, 0x644, 0x628, 0x62d, 0x631, 0x64a, 0x646, 0x62a, 0x634,
-0x627, 0x62f, 0x62c, 0x632, 0x631, 0x20, 0x627, 0x644, 0x642, 0x645, 0x631, 0x62c, 0x64a, 0x628, 0x648, 0x62a, 0x64a, 0x625, 0x631, 0x64a,
-0x62a, 0x631, 0x64a, 0x627, 0x627, 0x644, 0x639, 0x631, 0x627, 0x642, 0x625, 0x633, 0x631, 0x627, 0x626, 0x64a, 0x644, 0x627, 0x644, 0x623,
-0x631, 0x62f, 0x646, 0x627, 0x644, 0x643, 0x648, 0x64a, 0x62a, 0x644, 0x628, 0x646, 0x627, 0x646, 0x644, 0x64a, 0x628, 0x64a, 0x627, 0x645,
-0x648, 0x631, 0x64a, 0x62a, 0x627, 0x646, 0x64a, 0x627, 0x627, 0x644, 0x645, 0x63a, 0x631, 0x628, 0x639, 0x64f, 0x645, 0x627, 0x646, 0x627,
-0x644, 0x623, 0x631, 0x627, 0x636, 0x64a, 0x20, 0x627, 0x644, 0x641, 0x644, 0x633, 0x637, 0x64a, 0x646, 0x64a, 0x629, 0x642, 0x637, 0x631,
-0x627, 0x644, 0x645, 0x645, 0x644, 0x643, 0x629, 0x20, 0x627, 0x644, 0x639, 0x631, 0x628, 0x64a, 0x629, 0x20, 0x627, 0x644, 0x633, 0x639,
-0x648, 0x62f, 0x64a, 0x629, 0x627, 0x644, 0x635, 0x648, 0x645, 0x627, 0x644, 0x62c, 0x646, 0x648, 0x628, 0x20, 0x627, 0x644, 0x633, 0x648,
-0x62f, 0x627, 0x646, 0x627, 0x644, 0x633, 0x648, 0x62f, 0x627, 0x646, 0x633, 0x648, 0x631, 0x64a, 0x627, 0x62a, 0x648, 0x646, 0x633, 0x627,
-0x644, 0x625, 0x645, 0x627, 0x631, 0x627, 0x62a, 0x20, 0x627, 0x644, 0x639, 0x631, 0x628, 0x64a, 0x629, 0x20, 0x627, 0x644, 0x645, 0x62a,
-0x62d, 0x62f, 0x629, 0x627, 0x644, 0x635, 0x62d, 0x631, 0x627, 0x621, 0x20, 0x627, 0x644, 0x63a, 0x631, 0x628, 0x64a, 0x629, 0x627, 0x644,
-0x639, 0x631, 0x628, 0x64a, 0x629, 0x20, 0x627, 0x644, 0x641, 0x635, 0x62d, 0x649, 0x20, 0x627, 0x644, 0x62d, 0x62f, 0x64a, 0x62b, 0x629,
-0x627, 0x644, 0x639, 0x627, 0x644, 0x645, 0x627, 0x644, 0x64a, 0x645, 0x646, 0x570, 0x561, 0x575, 0x565, 0x580, 0x565, 0x576, 0x540, 0x561,
-0x575, 0x561, 0x57d, 0x57f, 0x561, 0x576, 0x985, 0x9b8, 0x9ae, 0x9c0, 0x9af, 0x9bc, 0x9be, 0x9ad, 0x9be, 0x9f0, 0x9a4, 0x61, 0x73, 0x74,
-0x75, 0x72, 0x69, 0x61, 0x6e, 0x75, 0x45, 0x73, 0x70, 0x61, 0xf1, 0x61, 0x4b, 0x69, 0x70, 0x61, 0x72, 0x65, 0x54, 0x61,
-0x64, 0x68, 0x61, 0x6e, 0x69, 0x61, 0x61, 0x7a, 0x259, 0x72, 0x62, 0x61, 0x79, 0x63, 0x61, 0x6e, 0x41, 0x7a, 0x259, 0x72,
-0x62, 0x61, 0x79, 0x63, 0x61, 0x6e, 0x430, 0x437, 0x4d9, 0x440, 0x431, 0x430, 0x458, 0x4b9, 0x430, 0x43d, 0x410, 0x437, 0x4d9, 0x440,
-0x431, 0x430, 0x458, 0x4b9, 0x430, 0x43d, 0x72, 0x69, 0x6b, 0x70, 0x61, 0x6b, 0x61, 0x6d, 0x25b, 0x72, 0xfa, 0x6e, 0x62, 0x61,
-0x6d, 0x61, 0x6e, 0x61, 0x6b, 0x61, 0x6e, 0x4d, 0x61, 0x6c, 0x69, 0x9ac, 0x9be, 0x982, 0x9b2, 0x9be, 0x9ac, 0x9be, 0x982, 0x9b2,
-0x9be, 0x9a6, 0x9c7, 0x9b6, 0x9ad, 0x9be, 0x9b0, 0x9a4, 0x181, 0xe0, 0x73, 0xe0, 0x61, 0x4b, 0xe0, 0x6d, 0x25b, 0x300, 0x72, 0xfb,
-0x6e, 0x65, 0x75, 0x73, 0x6b, 0x61, 0x72, 0x61, 0x45, 0x73, 0x70, 0x61, 0x69, 0x6e, 0x69, 0x61, 0x431, 0x435, 0x43b, 0x430,
-0x440, 0x443, 0x441, 0x43a, 0x430, 0x44f, 0x411, 0x435, 0x43b, 0x430, 0x440, 0x443, 0x441, 0x44c, 0x49, 0x63, 0x68, 0x69, 0x62, 0x65,
-0x6d, 0x62, 0x61, 0x5a, 0x61, 0x6d, 0x62, 0x69, 0x61, 0x48, 0x69, 0x62, 0x65, 0x6e, 0x61, 0x48, 0x75, 0x74, 0x61, 0x6e,
-0x7a, 0x61, 0x6e, 0x69, 0x61, 0x92c, 0x921, 0x93c, 0x94b, 0x92d, 0x93e, 0x930, 0x924, 0x62, 0x6f, 0x73, 0x61, 0x6e, 0x73, 0x6b,
-0x69, 0x42, 0x6f, 0x73, 0x6e, 0x61, 0x20, 0x69, 0x20, 0x48, 0x65, 0x72, 0x63, 0x65, 0x67, 0x6f, 0x76, 0x69, 0x6e, 0x61,
-0x431, 0x43e, 0x441, 0x430, 0x43d, 0x441, 0x43a, 0x438, 0x411, 0x43e, 0x441, 0x43d, 0x430, 0x20, 0x438, 0x20, 0x425, 0x435, 0x440, 0x446,
-0x435, 0x433, 0x43e, 0x432, 0x438, 0x43d, 0x430, 0x62, 0x72, 0x65, 0x7a, 0x68, 0x6f, 0x6e, 0x65, 0x67, 0x46, 0x72, 0x61, 0xf1,
-0x73, 0x431, 0x44a, 0x43b, 0x433, 0x430, 0x440, 0x441, 0x43a, 0x438, 0x411, 0x44a, 0x43b, 0x433, 0x430, 0x440, 0x438, 0x44f, 0x1019, 0x103c,
-0x1014, 0x103a, 0x1019, 0x102c, 0x7cb5, 0x8a9e, 0x4e2d, 0x83ef, 0x4eba, 0x6c11, 0x5171, 0x548c, 0x570b, 0x9999, 0x6e2f, 0x7279, 0x5225, 0x884c, 0x653f, 0x5340,
-0x7ca4, 0x8bed, 0x4e2d, 0x534e, 0x4eba, 0x6c11, 0x5171, 0x548c, 0x56fd, 0x63, 0x61, 0x74, 0x61, 0x6c, 0xe0, 0x45, 0x73, 0x70, 0x61, 0x6e,
-0x79, 0x61, 0x41, 0x6e, 0x64, 0x6f, 0x72, 0x72, 0x61, 0x46, 0x72, 0x61, 0x6e, 0xe7, 0x61, 0x49, 0x74, 0xe0, 0x6c, 0x69,
-0x61, 0x42, 0x69, 0x6e, 0x69, 0x73, 0x61, 0x79, 0x61, 0x50, 0x69, 0x6c, 0x69, 0x70, 0x69, 0x6e, 0x61, 0x73, 0x54, 0x61,
-0x6d, 0x61, 0x7a, 0x69, 0x263, 0x74, 0x20, 0x6e, 0x20, 0x6c, 0x61, 0x1e6d, 0x6c, 0x61, 0x1e63, 0x4d, 0x65, 0x1e5b, 0x1e5b, 0x75,
-0x6b, 0x6a9, 0x648, 0x631, 0x62f, 0x6cc, 0x6cc, 0x20, 0x646, 0x627, 0x648, 0x6d5, 0x646, 0x62f, 0x6cc, 0x639, 0x6ce, 0x631, 0x627, 0x642,
-0x626, 0x6ce, 0x631, 0x627, 0x646, 0xd804, 0xdd0c, 0xd804, 0xdd0b, 0xd804, 0xdd34, 0xd804, 0xdd1f, 0xd804, 0xdd33, 0xd804, 0xdd26, 0xd804, 0xdd1d, 0xd804,
-0xdd01, 0xd804, 0xdd23, 0xd804, 0xdd18, 0xd804, 0xdd2c, 0xd804, 0xdd0c, 0xd804, 0xdd34, 0xd804, 0xdd1e, 0xd804, 0xdd22, 0xd804, 0xdd27, 0xd804, 0xdd16, 0xd804,
-0xdd34, 0x43d, 0x43e, 0x445, 0x447, 0x438, 0x439, 0x43d, 0x420, 0x43e, 0x441, 0x441, 0x438, 0x13e3, 0x13b3, 0x13a9, 0x13cc, 0x13ca, 0x20, 0x13a2,
-0x13f3, 0x13be, 0x13b5, 0x13cd, 0x13d4, 0x13c5, 0x20, 0x13cd, 0x13a6, 0x13da, 0x13a9, 0x52, 0x75, 0x6b, 0x69, 0x67, 0x61, 0x55, 0x67, 0x61,
-0x6e, 0x64, 0x61, 0x7b80, 0x4f53, 0x4e2d, 0x6587, 0x4e2d, 0x56fd, 0x4e2d, 0x56fd, 0x9999, 0x6e2f, 0x7279, 0x522b, 0x884c, 0x653f, 0x533a, 0x4e2d, 0x56fd,
-0x6fb3, 0x95e8, 0x7279, 0x522b, 0x884c, 0x653f, 0x533a, 0x65b0, 0x52a0, 0x5761, 0x7e41, 0x9ad4, 0x4e2d, 0x6587, 0x4e2d, 0x570b, 0x9999, 0x6e2f, 0x7279, 0x5225,
-0x884c, 0x653f, 0x5340, 0x4e2d, 0x570b, 0x6fb3, 0x9580, 0x7279, 0x5225, 0x884c, 0x653f, 0x5340, 0x53f0, 0x7063, 0x4b, 0xf6, 0x6c, 0x73, 0x63, 0x68,
-0x44, 0x6f, 0xfc, 0x74, 0x73, 0x63, 0x68, 0x6c, 0x61, 0x6e, 0x64, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x77, 0x65, 0x6b, 0x52,
-0x79, 0x77, 0x76, 0x61, 0x6e, 0x65, 0x74, 0x68, 0x20, 0x55, 0x6e, 0x79, 0x73, 0x68, 0x72, 0x76, 0x61, 0x74, 0x73, 0x6b,
-0x69, 0x48, 0x72, 0x76, 0x61, 0x74, 0x73, 0x6b, 0x61, 0x10d, 0x65, 0x161, 0x74, 0x69, 0x6e, 0x61, 0x10c, 0x65, 0x73, 0x6b,
-0x6f, 0x64, 0x61, 0x6e, 0x73, 0x6b, 0x44, 0x61, 0x6e, 0x6d, 0x61, 0x72, 0x6b, 0x47, 0x72, 0xf8, 0x6e, 0x6c, 0x61, 0x6e,
-0x64, 0x921, 0x94b, 0x917, 0x930, 0x940, 0x64, 0x75, 0xe1, 0x6c, 0xe1, 0x43, 0x61, 0x6d, 0x65, 0x72, 0x6f, 0x75, 0x6e, 0x4e,
-0x65, 0x64, 0x65, 0x72, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x41, 0x72, 0x75, 0x62, 0x61, 0x56, 0x6c, 0x61, 0x61, 0x6d, 0x73,
-0x42, 0x65, 0x6c, 0x67, 0x69, 0xeb, 0x43, 0x61, 0x72, 0x69, 0x62, 0x69, 0x73, 0x63, 0x68, 0x20, 0x4e, 0x65, 0x64, 0x65,
-0x72, 0x6c, 0x61, 0x6e, 0x64, 0x43, 0x75, 0x72, 0x61, 0xe7, 0x61, 0x6f, 0x53, 0x69, 0x6e, 0x74, 0x2d, 0x4d, 0x61, 0x61,
-0x72, 0x74, 0x65, 0x6e, 0x53, 0x75, 0x72, 0x69, 0x6e, 0x61, 0x6d, 0x65, 0xf62, 0xfab, 0xf7c, 0xf44, 0xf0b, 0xf41, 0xf60, 0xf56,
-0xfb2, 0xf74, 0xf42, 0x4b, 0x129, 0x65, 0x6d, 0x62, 0x75, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63,
-0x61, 0x6e, 0x20, 0x45, 0x6e, 0x67, 0x6c, 0x69, 0x73, 0x68, 0x55, 0x6e, 0x69, 0x74, 0x65, 0x64, 0x20, 0x53, 0x74, 0x61,
-0x74, 0x65, 0x73, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6e, 0x20, 0x53, 0x61, 0x6d, 0x6f, 0x61, 0x41, 0x6e, 0x67,
-0x75, 0x69, 0x6c, 0x6c, 0x61, 0x41, 0x6e, 0x74, 0x69, 0x67, 0x75, 0x61, 0x20, 0x26, 0x20, 0x42, 0x61, 0x72, 0x62, 0x75,
-0x64, 0x61, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x6e, 0x20, 0x45, 0x6e, 0x67, 0x6c, 0x69, 0x73, 0x68,
-0x41, 0x75, 0x73, 0x74, 0x72, 0x69, 0x61, 0x42, 0x61, 0x68, 0x61, 0x6d, 0x61, 0x73, 0x42, 0x61, 0x72, 0x62, 0x61, 0x64,
-0x6f, 0x73, 0x42, 0x65, 0x6c, 0x67, 0x69, 0x75, 0x6d, 0x42, 0x65, 0x6c, 0x69, 0x7a, 0x65, 0x42, 0x65, 0x72, 0x6d, 0x75,
-0x64, 0x61, 0x42, 0x6f, 0x74, 0x73, 0x77, 0x61, 0x6e, 0x61, 0x42, 0x72, 0x69, 0x74, 0x69, 0x73, 0x68, 0x20, 0x49, 0x6e,
-0x64, 0x69, 0x61, 0x6e, 0x20, 0x4f, 0x63, 0x65, 0x61, 0x6e, 0x20, 0x54, 0x65, 0x72, 0x72, 0x69, 0x74, 0x6f, 0x72, 0x79,
-0x42, 0x72, 0x69, 0x74, 0x69, 0x73, 0x68, 0x20, 0x56, 0x69, 0x72, 0x67, 0x69, 0x6e, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e,
-0x64, 0x73, 0x42, 0x75, 0x72, 0x75, 0x6e, 0x64, 0x69, 0x43, 0x61, 0x6d, 0x65, 0x72, 0x6f, 0x6f, 0x6e, 0x43, 0x61, 0x6e,
-0x61, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x45, 0x6e, 0x67, 0x6c, 0x69, 0x73, 0x68, 0x43, 0x61, 0x6e, 0x61, 0x64, 0x61, 0x43,
-0x61, 0x79, 0x6d, 0x61, 0x6e, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x43, 0x68, 0x72, 0x69, 0x73, 0x74, 0x6d,
-0x61, 0x73, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x43, 0x6f, 0x63, 0x6f, 0x73, 0x20, 0x28, 0x4b, 0x65, 0x65, 0x6c,
-0x69, 0x6e, 0x67, 0x29, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x43, 0x6f, 0x6f, 0x6b, 0x20, 0x49, 0x73, 0x6c,
-0x61, 0x6e, 0x64, 0x73, 0x43, 0x79, 0x70, 0x72, 0x75, 0x73, 0x44, 0x65, 0x6e, 0x6d, 0x61, 0x72, 0x6b, 0x44, 0x69, 0x65,
-0x67, 0x6f, 0x20, 0x47, 0x61, 0x72, 0x63, 0x69, 0x61, 0x44, 0x6f, 0x6d, 0x69, 0x6e, 0x69, 0x63, 0x61, 0x45, 0x72, 0x69,
-0x74, 0x72, 0x65, 0x61, 0x45, 0x73, 0x77, 0x61, 0x74, 0x69, 0x6e, 0x69, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x46, 0x61,
-0x6c, 0x6b, 0x6c, 0x61, 0x6e, 0x64, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x46, 0x69, 0x6a, 0x69, 0x46, 0x69,
-0x6e, 0x6c, 0x61, 0x6e, 0x64, 0x47, 0x61, 0x6d, 0x62, 0x69, 0x61, 0x47, 0x65, 0x72, 0x6d, 0x61, 0x6e, 0x79, 0x47, 0x68,
-0x61, 0x6e, 0x61, 0x47, 0x69, 0x62, 0x72, 0x61, 0x6c, 0x74, 0x61, 0x72, 0x47, 0x72, 0x65, 0x6e, 0x61, 0x64, 0x61, 0x47,
-0x75, 0x61, 0x6d, 0x47, 0x75, 0x65, 0x72, 0x6e, 0x73, 0x65, 0x79, 0x47, 0x75, 0x79, 0x61, 0x6e, 0x61, 0x48, 0x6f, 0x6e,
-0x67, 0x20, 0x4b, 0x6f, 0x6e, 0x67, 0x20, 0x53, 0x41, 0x52, 0x20, 0x43, 0x68, 0x69, 0x6e, 0x61, 0x49, 0x72, 0x65, 0x6c,
-0x61, 0x6e, 0x64, 0x49, 0x73, 0x6c, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x4d, 0x61, 0x6e, 0x49, 0x73, 0x72, 0x61, 0x65, 0x6c,
-0x4a, 0x61, 0x6d, 0x61, 0x69, 0x63, 0x61, 0x4a, 0x65, 0x72, 0x73, 0x65, 0x79, 0x4b, 0x69, 0x72, 0x69, 0x62, 0x61, 0x74,
-0x69, 0x4c, 0x65, 0x73, 0x6f, 0x74, 0x68, 0x6f, 0x4c, 0x69, 0x62, 0x65, 0x72, 0x69, 0x61, 0x4d, 0x61, 0x63, 0x61, 0x6f,
-0x20, 0x53, 0x41, 0x52, 0x20, 0x43, 0x68, 0x69, 0x6e, 0x61, 0x4d, 0x61, 0x64, 0x61, 0x67, 0x61, 0x73, 0x63, 0x61, 0x72,
-0x4d, 0x61, 0x6c, 0x61, 0x77, 0x69, 0x4d, 0x61, 0x6c, 0x61, 0x79, 0x73, 0x69, 0x61, 0x4d, 0x61, 0x6c, 0x74, 0x61, 0x4d,
-0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, 0x6c, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x4d, 0x61, 0x75, 0x72, 0x69,
-0x74, 0x69, 0x75, 0x73, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x6e, 0x65, 0x73, 0x69, 0x61, 0x4d, 0x6f, 0x6e, 0x74, 0x73, 0x65,
-0x72, 0x72, 0x61, 0x74, 0x4e, 0x61, 0x6d, 0x69, 0x62, 0x69, 0x61, 0x4e, 0x61, 0x75, 0x72, 0x75, 0x4e, 0x65, 0x74, 0x68,
-0x65, 0x72, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x4e, 0x65, 0x77, 0x20, 0x5a, 0x65, 0x61, 0x6c, 0x61, 0x6e, 0x64, 0x4e, 0x69,
-0x67, 0x65, 0x72, 0x69, 0x61, 0x4e, 0x69, 0x75, 0x65, 0x4e, 0x6f, 0x72, 0x66, 0x6f, 0x6c, 0x6b, 0x20, 0x49, 0x73, 0x6c,
-0x61, 0x6e, 0x64, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x65, 0x72, 0x6e, 0x20, 0x4d, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x61, 0x20,
-0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x50, 0x61, 0x6b, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x50, 0x61, 0x6c, 0x61, 0x75,
-0x50, 0x61, 0x70, 0x75, 0x61, 0x20, 0x4e, 0x65, 0x77, 0x20, 0x47, 0x75, 0x69, 0x6e, 0x65, 0x61, 0x50, 0x68, 0x69, 0x6c,
-0x69, 0x70, 0x70, 0x69, 0x6e, 0x65, 0x73, 0x50, 0x69, 0x74, 0x63, 0x61, 0x69, 0x72, 0x6e, 0x20, 0x49, 0x73, 0x6c, 0x61,
-0x6e, 0x64, 0x73, 0x50, 0x75, 0x65, 0x72, 0x74, 0x6f, 0x20, 0x52, 0x69, 0x63, 0x6f, 0x52, 0x77, 0x61, 0x6e, 0x64, 0x61,
-0x53, 0x74, 0x2e, 0x20, 0x48, 0x65, 0x6c, 0x65, 0x6e, 0x61, 0x53, 0x74, 0x2e, 0x20, 0x4b, 0x69, 0x74, 0x74, 0x73, 0x20,
-0x26, 0x20, 0x4e, 0x65, 0x76, 0x69, 0x73, 0x53, 0x74, 0x2e, 0x20, 0x4c, 0x75, 0x63, 0x69, 0x61, 0x53, 0x74, 0x2e, 0x20,
-0x56, 0x69, 0x6e, 0x63, 0x65, 0x6e, 0x74, 0x20, 0x26, 0x20, 0x47, 0x72, 0x65, 0x6e, 0x61, 0x64, 0x69, 0x6e, 0x65, 0x73,
-0x53, 0x65, 0x79, 0x63, 0x68, 0x65, 0x6c, 0x6c, 0x65, 0x73, 0x53, 0x69, 0x65, 0x72, 0x72, 0x61, 0x20, 0x4c, 0x65, 0x6f,
-0x6e, 0x65, 0x53, 0x69, 0x6e, 0x67, 0x61, 0x70, 0x6f, 0x72, 0x65, 0x53, 0x69, 0x6e, 0x74, 0x20, 0x4d, 0x61, 0x61, 0x72,
-0x74, 0x65, 0x6e, 0x53, 0x6c, 0x6f, 0x76, 0x65, 0x6e, 0x69, 0x61, 0x53, 0x6f, 0x6c, 0x6f, 0x6d, 0x6f, 0x6e, 0x20, 0x49,
-0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x20, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x53, 0x6f,
-0x75, 0x74, 0x68, 0x20, 0x53, 0x75, 0x64, 0x61, 0x6e, 0x53, 0x75, 0x64, 0x61, 0x6e, 0x53, 0x77, 0x65, 0x64, 0x65, 0x6e,
-0x53, 0x77, 0x69, 0x74, 0x7a, 0x65, 0x72, 0x6c, 0x61, 0x6e, 0x64, 0x54, 0x61, 0x6e, 0x7a, 0x61, 0x6e, 0x69, 0x61, 0x54,
-0x6f, 0x6b, 0x65, 0x6c, 0x61, 0x75, 0x54, 0x6f, 0x6e, 0x67, 0x61, 0x54, 0x72, 0x69, 0x6e, 0x69, 0x64, 0x61, 0x64, 0x20,
-0x26, 0x20, 0x54, 0x6f, 0x62, 0x61, 0x67, 0x6f, 0x54, 0x75, 0x72, 0x6b, 0x73, 0x20, 0x26, 0x20, 0x43, 0x61, 0x69, 0x63,
-0x6f, 0x73, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x54, 0x75, 0x76, 0x61, 0x6c, 0x75, 0x55, 0x6e, 0x69, 0x74,
-0x65, 0x64, 0x20, 0x41, 0x72, 0x61, 0x62, 0x20, 0x45, 0x6d, 0x69, 0x72, 0x61, 0x74, 0x65, 0x73, 0x42, 0x72, 0x69, 0x74,
-0x69, 0x73, 0x68, 0x20, 0x45, 0x6e, 0x67, 0x6c, 0x69, 0x73, 0x68, 0x55, 0x6e, 0x69, 0x74, 0x65, 0x64, 0x20, 0x4b, 0x69,
-0x6e, 0x67, 0x64, 0x6f, 0x6d, 0x55, 0x2e, 0x53, 0x2e, 0x20, 0x4f, 0x75, 0x74, 0x6c, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x49,
-0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x55, 0x2e, 0x53, 0x2e, 0x20, 0x56, 0x69, 0x72, 0x67, 0x69, 0x6e, 0x20, 0x49, 0x73,
-0x6c, 0x61, 0x6e, 0x64, 0x73, 0x56, 0x61, 0x6e, 0x75, 0x61, 0x74, 0x75, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x5a, 0x69, 0x6d,
-0x62, 0x61, 0x62, 0x77, 0x65, 0x65, 0x73, 0x70, 0x65, 0x72, 0x61, 0x6e, 0x74, 0x6f, 0x4d, 0x6f, 0x6e, 0x64, 0x6f, 0x65,
-0x65, 0x73, 0x74, 0x69, 0x45, 0x65, 0x73, 0x74, 0x69, 0x45, 0x28b, 0x65, 0x67, 0x62, 0x65, 0x47, 0x68, 0x61, 0x6e, 0x61,
-0x20, 0x6e, 0x75, 0x74, 0x6f, 0x6d, 0x65, 0x54, 0x6f, 0x67, 0x6f, 0x20, 0x6e, 0x75, 0x74, 0x6f, 0x6d, 0x65, 0x65, 0x77,
-0x6f, 0x6e, 0x64, 0x6f, 0x4b, 0x61, 0x6d, 0x259, 0x72, 0xfa, 0x6e, 0x66, 0xf8, 0x72, 0x6f, 0x79, 0x73, 0x6b, 0x74, 0x46,
-0xf8, 0x72, 0x6f, 0x79, 0x61, 0x72, 0x46, 0x69, 0x6c, 0x69, 0x70, 0x69, 0x6e, 0x6f, 0x73, 0x75, 0x6f, 0x6d, 0x69, 0x53,
-0x75, 0x6f, 0x6d, 0x69, 0x66, 0x72, 0x61, 0x6e, 0xe7, 0x61, 0x69, 0x73, 0x46, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x41, 0x6c,
-0x67, 0xe9, 0x72, 0x69, 0x65, 0x42, 0x65, 0x6c, 0x67, 0x69, 0x71, 0x75, 0x65, 0x42, 0xe9, 0x6e, 0x69, 0x6e, 0x42, 0x75,
-0x72, 0x6b, 0x69, 0x6e, 0x61, 0x20, 0x46, 0x61, 0x73, 0x6f, 0x66, 0x72, 0x61, 0x6e, 0xe7, 0x61, 0x69, 0x73, 0x20, 0x63,
-0x61, 0x6e, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x52, 0xe9, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x71, 0x75, 0x65, 0x20, 0x63, 0x65,
-0x6e, 0x74, 0x72, 0x61, 0x66, 0x72, 0x69, 0x63, 0x61, 0x69, 0x6e, 0x65, 0x54, 0x63, 0x68, 0x61, 0x64, 0x43, 0x6f, 0x6d,
-0x6f, 0x72, 0x65, 0x73, 0x43, 0x6f, 0x6e, 0x67, 0x6f, 0x2d, 0x42, 0x72, 0x61, 0x7a, 0x7a, 0x61, 0x76, 0x69, 0x6c, 0x6c,
-0x65, 0x43, 0x6f, 0x6e, 0x67, 0x6f, 0x2d, 0x4b, 0x69, 0x6e, 0x73, 0x68, 0x61, 0x73, 0x61, 0x44, 0x6a, 0x69, 0x62, 0x6f,
-0x75, 0x74, 0x69, 0x47, 0x75, 0x69, 0x6e, 0xe9, 0x65, 0x20, 0xe9, 0x71, 0x75, 0x61, 0x74, 0x6f, 0x72, 0x69, 0x61, 0x6c,
-0x65, 0x47, 0x75, 0x79, 0x61, 0x6e, 0x65, 0x20, 0x66, 0x72, 0x61, 0x6e, 0xe7, 0x61, 0x69, 0x73, 0x65, 0x50, 0x6f, 0x6c,
-0x79, 0x6e, 0xe9, 0x73, 0x69, 0x65, 0x20, 0x66, 0x72, 0x61, 0x6e, 0xe7, 0x61, 0x69, 0x73, 0x65, 0x47, 0x61, 0x62, 0x6f,
-0x6e, 0x47, 0x75, 0x61, 0x64, 0x65, 0x6c, 0x6f, 0x75, 0x70, 0x65, 0x48, 0x61, 0xef, 0x74, 0x69, 0x43, 0xf4, 0x74, 0x65,
-0x20, 0x64, 0x2019, 0x49, 0x76, 0x6f, 0x69, 0x72, 0x65, 0x4c, 0x75, 0x78, 0x65, 0x6d, 0x62, 0x6f, 0x75, 0x72, 0x67, 0x4d,
-0x61, 0x72, 0x74, 0x69, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x4d, 0x61, 0x75, 0x72, 0x69, 0x74, 0x61, 0x6e, 0x69, 0x65, 0x4d,
-0x61, 0x75, 0x72, 0x69, 0x63, 0x65, 0x4d, 0x61, 0x79, 0x6f, 0x74, 0x74, 0x65, 0x4d, 0x6f, 0x6e, 0x61, 0x63, 0x6f, 0x4d,
-0x61, 0x72, 0x6f, 0x63, 0x4e, 0x6f, 0x75, 0x76, 0x65, 0x6c, 0x6c, 0x65, 0x2d, 0x43, 0x61, 0x6c, 0xe9, 0x64, 0x6f, 0x6e,
-0x69, 0x65, 0x4c, 0x61, 0x20, 0x52, 0xe9, 0x75, 0x6e, 0x69, 0x6f, 0x6e, 0x53, 0x61, 0x69, 0x6e, 0x74, 0x2d, 0x42, 0x61,
-0x72, 0x74, 0x68, 0xe9, 0x6c, 0x65, 0x6d, 0x79, 0x53, 0x61, 0x69, 0x6e, 0x74, 0x2d, 0x4d, 0x61, 0x72, 0x74, 0x69, 0x6e,
-0x53, 0x61, 0x69, 0x6e, 0x74, 0x2d, 0x50, 0x69, 0x65, 0x72, 0x72, 0x65, 0x2d, 0x65, 0x74, 0x2d, 0x4d, 0x69, 0x71, 0x75,
-0x65, 0x6c, 0x6f, 0x6e, 0x53, 0xe9, 0x6e, 0xe9, 0x67, 0x61, 0x6c, 0x66, 0x72, 0x61, 0x6e, 0xe7, 0x61, 0x69, 0x73, 0x20,
-0x73, 0x75, 0x69, 0x73, 0x73, 0x65, 0x53, 0x75, 0x69, 0x73, 0x73, 0x65, 0x53, 0x79, 0x72, 0x69, 0x65, 0x54, 0x75, 0x6e,
-0x69, 0x73, 0x69, 0x65, 0x57, 0x61, 0x6c, 0x6c, 0x69, 0x73, 0x2d, 0x65, 0x74, 0x2d, 0x46, 0x75, 0x74, 0x75, 0x6e, 0x61,
-0x66, 0x75, 0x72, 0x6c, 0x61, 0x6e, 0x49, 0x74, 0x61, 0x6c, 0x69, 0x65, 0x50, 0x75, 0x6c, 0x61, 0x61, 0x72, 0x53, 0x65,
-0x6e, 0x65, 0x67, 0x61, 0x61, 0x6c, 0xd83a, 0xdd06, 0xd83a, 0xdd35, 0xd83a, 0xdd24, 0xd83a, 0xdd22, 0xd83a, 0xdd2a, 0xd83a, 0xdd04, 0xd83a, 0xdd35,
-0xd83a, 0xdd2a, 0xd83a, 0xdd33, 0xd83a, 0xdd2d, 0xd83a, 0xdd32, 0xd83a, 0xdd22, 0x20, 0xd83a, 0xdd0a, 0xd83a, 0xdd22, 0xd83a, 0xdd27, 0xd83a, 0xdd2e, 0xd83a,
-0xdd45, 0xd83a, 0xdd11, 0xd83a, 0xdd22, 0xd83a, 0xdd25, 0xd83a, 0xdd22, 0xd83a, 0xdd2a, 0xd83a, 0xdd35, 0xd83a, 0xdd45, 0xd83a, 0xdd32, 0xd83a, 0xdd18, 0xd83a,
-0xdd22, 0xd83a, 0xdd25, 0xd83a, 0xdd26, 0xd83a, 0xdd2d, 0xd83a, 0xdd34, 0xd83a, 0xdd22, 0xd83a, 0xdd18, 0xd83a, 0xdd22, 0xd83a, 0xdd32, 0xd83a, 0xdd22, 0xd83a,
-0xdd18, 0xd83a, 0xdd2d, 0xd83a, 0xdd32, 0xd83a, 0xdd2b, 0x2d, 0xd83a, 0xdd04, 0xd83a, 0xdd2d, 0xd83a, 0xdd27, 0xd83a, 0xdd22, 0xd83a, 0xdd31, 0xd83a, 0xdd2e,
-0xd83a, 0xdd45, 0xd83a, 0xdd02, 0xd83a, 0xdd22, 0xd83a, 0xdd26, 0xd83a, 0xdd2d, 0xd83a, 0xdd2a, 0xd83a, 0xdd2d, 0xd83a, 0xdd34, 0xd83a, 0xdd22, 0xd83a, 0xdd44,
-0xd83a, 0xdd03, 0xd83a, 0xdd2e, 0xd83a, 0xdd2a, 0xd83a, 0xdd3c, 0xd83a, 0xdd22, 0xd83a, 0xdd32, 0xd83a, 0xdd2d, 0xd83a, 0xdd45, 0xd83a, 0xdd10, 0xd83a, 0xdd22,
-0xd83a, 0xdd36, 0xd83a, 0xdd2b, 0xd83a, 0xdd2a, 0xd83a, 0xdd2d, 0xd83a, 0xdd34, 0xd83a, 0xdd22, 0xd83a, 0xdd44, 0xd83a, 0xdd10, 0xd83a, 0xdd2d, 0xd83a, 0xdd45,
-0xd83a, 0xdd36, 0xd83a, 0xdd2b, 0xd83a, 0xdd2a, 0xd83a, 0xdd05, 0xd83a, 0xdd2b, 0xd83a, 0xdd32, 0xd83a, 0xdd2b, 0xd83a, 0xdd3a, 0xd83a, 0xdd22, 0xd83a, 0xdd44,
-0xd83a, 0xdd24, 0xd83a, 0xdd05, 0xd83a, 0xdd22, 0xd83a, 0xdd2a, 0xd83a, 0xdd22, 0xd83a, 0xdd24, 0xd83a, 0xdd2e, 0xd83a, 0xdd32, 0x42, 0x75, 0x72, 0x6b,
-0x69, 0x62, 0x61, 0x61, 0x20, 0x46, 0x61, 0x61, 0x73, 0x6f, 0x4b, 0x61, 0x6d, 0x65, 0x72, 0x75, 0x75, 0x6e, 0x47, 0x61,
-0x6d, 0x6d, 0x62, 0x69, 0x47, 0x61, 0x6e, 0x61, 0x61, 0x47, 0x69, 0x6e, 0x65, 0x2d, 0x42, 0x69, 0x73, 0x61, 0x61, 0x77,
-0x6f, 0x4c, 0x69, 0x62, 0x65, 0x72, 0x69, 0x79, 0x61, 0x61, 0x4d, 0x75, 0x72, 0x69, 0x74, 0x61, 0x6e, 0x69, 0x4e, 0x69,
-0x6a, 0x65, 0x72, 0x69, 0x79, 0x61, 0x61, 0x4e, 0x69, 0x6a, 0x65, 0x65, 0x72, 0x53, 0x65, 0x72, 0x61, 0x61, 0x20, 0x6c,
-0x69, 0x79, 0x6f, 0x6e, 0x47, 0xe0, 0x69, 0x64, 0x68, 0x6c, 0x69, 0x67, 0x41, 0x6e, 0x20, 0x52, 0xec, 0x6f, 0x67, 0x68,
-0x61, 0x63, 0x68, 0x64, 0x20, 0x41, 0x6f, 0x6e, 0x61, 0x69, 0x63, 0x68, 0x74, 0x65, 0x67, 0x61, 0x6c, 0x65, 0x67, 0x6f,
-0x4c, 0x75, 0x67, 0x61, 0x6e, 0x64, 0x61, 0x59, 0x75, 0x67, 0x61, 0x6e, 0x64, 0x61, 0x10e5, 0x10d0, 0x10e0, 0x10d7, 0x10e3, 0x10da,
-0x10d8, 0x10e1, 0x10d0, 0x10e5, 0x10d0, 0x10e0, 0x10d7, 0x10d5, 0x10d4, 0x10da, 0x10dd, 0x44, 0x65, 0x75, 0x74, 0x73, 0x63, 0x68, 0x44, 0x65,
-0x75, 0x74, 0x73, 0x63, 0x68, 0x6c, 0x61, 0x6e, 0x64, 0xd6, 0x73, 0x74, 0x65, 0x72, 0x72, 0x65, 0x69, 0x63, 0x68, 0x69,
-0x73, 0x63, 0x68, 0x65, 0x73, 0x20, 0x44, 0x65, 0x75, 0x74, 0x73, 0x63, 0x68, 0x42, 0x65, 0x6c, 0x67, 0x69, 0x65, 0x6e,
-0x49, 0x74, 0x61, 0x6c, 0x69, 0x65, 0x6e, 0x4c, 0x69, 0x65, 0x63, 0x68, 0x74, 0x65, 0x6e, 0x73, 0x74, 0x65, 0x69, 0x6e,
-0x4c, 0x75, 0x78, 0x65, 0x6d, 0x62, 0x75, 0x72, 0x67, 0x53, 0x63, 0x68, 0x77, 0x65, 0x69, 0x7a, 0x65, 0x72, 0x20, 0x48,
-0x6f, 0x63, 0x68, 0x64, 0x65, 0x75, 0x74, 0x73, 0x63, 0x68, 0x395, 0x3bb, 0x3bb, 0x3b7, 0x3bd, 0x3b9, 0x3ba, 0x3ac, 0x395, 0x3bb,
-0x3bb, 0x3ac, 0x3b4, 0x3b1, 0x39a, 0x3cd, 0x3c0, 0x3c1, 0x3bf, 0x3c2, 0xa97, 0xac1, 0xa9c, 0xab0, 0xabe, 0xaa4, 0xac0, 0xaad, 0xabe, 0xab0,
-0xaa4, 0x45, 0x6b, 0x65, 0x67, 0x75, 0x73, 0x69, 0x69, 0x48, 0x61, 0x75, 0x73, 0x61, 0x4e, 0x61, 0x6a, 0x65, 0x72, 0x69,
-0x79, 0x61, 0x4e, 0x69, 0x6a, 0x61, 0x72, 0x2bb, 0x14c, 0x6c, 0x65, 0x6c, 0x6f, 0x20, 0x48, 0x61, 0x77, 0x61, 0x69, 0x2bb,
-0x69, 0x2bb, 0x41, 0x6d, 0x65, 0x6c, 0x69, 0x6b, 0x61, 0x20, 0x48, 0x75, 0x69, 0x20, 0x50, 0x16b, 0x20, 0x2bb, 0x49, 0x61,
-0x5e2, 0x5d1, 0x5e8, 0x5d9, 0x5ea, 0x5d9, 0x5e9, 0x5e8, 0x5d0, 0x5dc, 0x939, 0x93f, 0x928, 0x94d, 0x926, 0x940, 0x6d, 0x61, 0x67, 0x79,
-0x61, 0x72, 0x4d, 0x61, 0x67, 0x79, 0x61, 0x72, 0x6f, 0x72, 0x73, 0x7a, 0xe1, 0x67, 0xed, 0x73, 0x6c, 0x65, 0x6e, 0x73,
-0x6b, 0x61, 0xcd, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x49, 0x67, 0x62, 0x6f, 0x4e, 0x61, 0x1ecb, 0x6a, 0x1ecb, 0x72, 0x1ecb, 0x61,
-0x61, 0x6e, 0x61, 0x72, 0xe2, 0x161, 0x6b, 0x69, 0x65, 0x6c, 0xe2, 0x53, 0x75, 0x6f, 0x6d, 0xe2, 0x49, 0x6e, 0x64, 0x6f,
-0x6e, 0x65, 0x73, 0x69, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6c, 0x69, 0x6e, 0x67, 0x75, 0x61, 0x4d, 0x75, 0x6e, 0x64,
-0x6f, 0x47, 0x61, 0x65, 0x69, 0x6c, 0x67, 0x65, 0xc9, 0x69, 0x72, 0x65, 0x61, 0x6e, 0x20, 0x52, 0xed, 0x6f, 0x63, 0x68,
-0x74, 0x20, 0x41, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x74, 0x68, 0x65, 0x69, 0x74, 0x61, 0x6c, 0x69, 0x61, 0x6e, 0x6f, 0x49,
-0x74, 0x61, 0x6c, 0x69, 0x61, 0x53, 0x61, 0x6e, 0x20, 0x4d, 0x61, 0x72, 0x69, 0x6e, 0x6f, 0x53, 0x76, 0x69, 0x7a, 0x7a,
-0x65, 0x72, 0x61, 0x43, 0x69, 0x74, 0x74, 0xe0, 0x20, 0x64, 0x65, 0x6c, 0x20, 0x56, 0x61, 0x74, 0x69, 0x63, 0x61, 0x6e,
-0x6f, 0x65e5, 0x672c, 0x8a9e, 0x4a, 0x61, 0x77, 0x61, 0x49, 0x6e, 0x64, 0x6f, 0x6e, 0xe9, 0x73, 0x69, 0x61, 0x6a, 0x6f, 0x6f,
-0x6c, 0x61, 0x53, 0x65, 0x6e, 0x65, 0x67, 0x61, 0x6c, 0x6b, 0x61, 0x62, 0x75, 0x76, 0x65, 0x72, 0x64, 0x69, 0x61, 0x6e,
-0x75, 0x4b, 0x61, 0x62, 0x75, 0x20, 0x56, 0x65, 0x72, 0x64, 0x69, 0x54, 0x61, 0x71, 0x62, 0x61, 0x79, 0x6c, 0x69, 0x74,
-0x4c, 0x65, 0x7a, 0x7a, 0x61, 0x79, 0x65, 0x72, 0x6b, 0x61, 0x6b, 0x254, 0x4b, 0x61, 0x6d, 0x25b, 0x72, 0x75, 0x6e, 0x6b,
-0x61, 0x6c, 0x61, 0x61, 0x6c, 0x6c, 0x69, 0x73, 0x75, 0x74, 0x4b, 0x61, 0x6c, 0x61, 0x61, 0x6c, 0x6c, 0x69, 0x74, 0x20,
-0x4e, 0x75, 0x6e, 0x61, 0x61, 0x74, 0x4b, 0x61, 0x6c, 0x65, 0x6e, 0x6a, 0x69, 0x6e, 0x45, 0x6d, 0x65, 0x74, 0x61, 0x62,
-0x20, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x4b, 0x69, 0x6b, 0x61, 0x6d, 0x62, 0x61, 0xc95, 0xca8, 0xccd, 0xca8, 0xca1, 0xcad, 0xcbe,
-0xcb0, 0xca4, 0x6a9, 0x672, 0x634, 0x64f, 0x631, 0x6c1, 0x650, 0x646, 0x62f, 0x648, 0x633, 0x62a, 0x627, 0x646, 0x49b, 0x430, 0x437, 0x430,
-0x49b, 0x20, 0x442, 0x456, 0x43b, 0x456, 0x49a, 0x430, 0x437, 0x430, 0x49b, 0x441, 0x442, 0x430, 0x43d, 0x1781, 0x17d2, 0x1798, 0x17c2, 0x179a,
-0x1780, 0x1798, 0x17d2, 0x1796, 0x17bb, 0x1787, 0x17b6, 0x47, 0x69, 0x6b, 0x75, 0x79, 0x75, 0x4b, 0x69, 0x6e, 0x79, 0x61, 0x72, 0x77,
-0x61, 0x6e, 0x64, 0x61, 0x55, 0x20, 0x52, 0x77, 0x61, 0x6e, 0x64, 0x61, 0x915, 0x94b, 0x902, 0x915, 0x923, 0x940, 0xd55c, 0xad6d,
-0xc5b4, 0xb300, 0xd55c, 0xbbfc, 0xad6d, 0xc870, 0xc120, 0xbbfc, 0xc8fc, 0xc8fc, 0xc758, 0xc778, 0xbbfc, 0xacf5, 0xd654, 0xad6d, 0x4b, 0x6f, 0x79, 0x72,
-0x61, 0x62, 0x6f, 0x72, 0x6f, 0x20, 0x73, 0x65, 0x6e, 0x6e, 0x69, 0x4d, 0x61, 0x61, 0x6c, 0x69, 0x4b, 0x6f, 0x79, 0x72,
-0x61, 0x20, 0x63, 0x69, 0x69, 0x6e, 0x69, 0x6b, 0x75, 0x72, 0x64, 0xee, 0x54, 0x69, 0x72, 0x6b, 0x69, 0x79, 0x65, 0x4b,
-0x77, 0x61, 0x73, 0x69, 0x6f, 0x4b, 0x61, 0x6d, 0x65, 0x72, 0x75, 0x6e, 0x43a, 0x44b, 0x440, 0x433, 0x44b, 0x437, 0x447, 0x430,
-0x41a, 0x44b, 0x440, 0x433, 0x44b, 0x437, 0x441, 0x442, 0x430, 0x43d, 0x4c, 0x61, 0x6b, 0x21f, 0xf3, 0x6c, 0x2bc, 0x69, 0x79, 0x61,
-0x70, 0x69, 0x4d, 0xed, 0x6c, 0x61, 0x68, 0x61, 0x14b, 0x73, 0x6b, 0x61, 0x20, 0x54, 0x21f, 0x61, 0x6d, 0xe1, 0x6b, 0x21f,
-0x6f, 0x10d, 0x68, 0x65, 0x4b, 0x268, 0x6c, 0x61, 0x61, 0x6e, 0x67, 0x69, 0x54, 0x61, 0x61, 0x6e, 0x73, 0x61, 0x6e, 0xed,
-0x61, 0xea5, 0xeb2, 0xea7, 0x6c, 0x61, 0x74, 0x76, 0x69, 0x65, 0x161, 0x75, 0x4c, 0x61, 0x74, 0x76, 0x69, 0x6a, 0x61, 0x6c,
-0x69, 0x6e, 0x67, 0xe1, 0x6c, 0x61, 0x52, 0x65, 0x70, 0x75, 0x62, 0x6c, 0xed, 0x6b, 0x69, 0x20, 0x79, 0x61, 0x20, 0x4b,
-0x6f, 0x6e, 0x67, 0xf3, 0x20, 0x44, 0x65, 0x6d, 0x6f, 0x6b, 0x72, 0x61, 0x74, 0xed, 0x6b, 0x69, 0x41, 0x6e, 0x67, 0xf3,
-0x6c, 0x61, 0x52, 0x65, 0x70, 0x69, 0x62, 0x69, 0x6b, 0x69, 0x20, 0x79, 0x61, 0x20, 0x41, 0x66, 0x72, 0xed, 0x6b, 0x61,
-0x20, 0x79, 0x61, 0x20, 0x4b, 0xe1, 0x74, 0x69, 0x4b, 0x6f, 0x6e, 0x67, 0x6f, 0x6c, 0x69, 0x65, 0x74, 0x75, 0x76, 0x69,
-0x173, 0x4c, 0x69, 0x65, 0x74, 0x75, 0x76, 0x61, 0x64, 0x6f, 0x6c, 0x6e, 0x6f, 0x73, 0x65, 0x72, 0x62, 0x161, 0x107, 0x69,
-0x6e, 0x61, 0x4e, 0x69, 0x6d, 0x73, 0x6b, 0x61, 0x4e, 0x65, 0x64, 0x64, 0x65, 0x72, 0x73, 0x61, 0x73, 0x73, 0x2019, 0x73,
-0x63, 0x68, 0x44, 0xfc, 0xfc, 0x74, 0x73, 0x63, 0x68, 0x6c, 0x61, 0x6e, 0x64, 0x4e, 0x65, 0x64, 0x64, 0x65, 0x72, 0x6c,
-0x61, 0x6e, 0x6e, 0x65, 0x6e, 0x54, 0x73, 0x68, 0x69, 0x6c, 0x75, 0x62, 0x61, 0x44, 0x69, 0x74, 0x75, 0x6e, 0x67, 0x61,
-0x20, 0x77, 0x61, 0x20, 0x4b, 0x6f, 0x6e, 0x67, 0x75, 0x44, 0x68, 0x6f, 0x6c, 0x75, 0x6f, 0x4c, 0xeb, 0x74, 0x7a, 0x65,
-0x62, 0x75, 0x65, 0x72, 0x67, 0x65, 0x73, 0x63, 0x68, 0x4c, 0x75, 0x6c, 0x75, 0x68, 0x69, 0x61, 0x43c, 0x430, 0x43a, 0x435,
-0x434, 0x43e, 0x43d, 0x441, 0x43a, 0x438, 0x421, 0x435, 0x432, 0x435, 0x440, 0x43d, 0x430, 0x20, 0x41c, 0x430, 0x43a, 0x435, 0x434, 0x43e,
-0x43d, 0x438, 0x458, 0x430, 0x4b, 0x69, 0x6d, 0x61, 0x63, 0x68, 0x61, 0x6d, 0x65, 0x92e, 0x948, 0x925, 0x93f, 0x932, 0x940, 0x4d,
-0x61, 0x6b, 0x75, 0x61, 0x55, 0x6d, 0x6f, 0x7a, 0x61, 0x6d, 0x62, 0x69, 0x6b, 0x69, 0x43, 0x68, 0x69, 0x6d, 0x61, 0x6b,
-0x6f, 0x6e, 0x64, 0x65, 0x4d, 0x61, 0x6c, 0x61, 0x67, 0x61, 0x73, 0x79, 0x4d, 0x61, 0x64, 0x61, 0x67, 0x61, 0x73, 0x69,
-0x6b, 0x61, 0x72, 0x61, 0xd2e, 0xd32, 0xd2f, 0xd3e, 0xd33, 0xd02, 0xd07, 0xd28, 0xd4d, 0xd24, 0xd4d, 0xd2f, 0x4d, 0x65, 0x6c, 0x61,
-0x79, 0x75, 0x42, 0x72, 0x75, 0x6e, 0x65, 0x69, 0x53, 0x69, 0x6e, 0x67, 0x61, 0x70, 0x75, 0x72, 0x61, 0x4d, 0x61, 0x6c,
-0x74, 0x69, 0x9ae, 0x9c8, 0x9a4, 0x9c8, 0x9b2, 0x9cb, 0x9a8, 0x9cd, 0x987, 0x9a8, 0x9cd, 0x9a6, 0x9bf, 0x9af, 0x9bc, 0x9be, 0x47, 0x61,
-0x65, 0x6c, 0x67, 0x45, 0x6c, 0x6c, 0x61, 0x6e, 0x20, 0x56, 0x61, 0x6e, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x20, 0x72, 0x65,
-0x6f, 0x20, 0x4d, 0x101, 0x6f, 0x72, 0x69, 0x41, 0x6f, 0x74, 0x65, 0x61, 0x72, 0x6f, 0x61, 0x92e, 0x930, 0x93e, 0x920, 0x940,
-0x54, 0x61, 0x6e, 0x73, 0x61, 0x6e, 0x69, 0x61, 0x645, 0x627, 0x632, 0x631, 0x648, 0x646, 0x6cc, 0x627, 0x6cc, 0x631, 0x627, 0x646,
-0x4b, 0x129, 0x6d, 0x129, 0x72, 0x169, 0x6d, 0x65, 0x74, 0x61, 0x2bc, 0x4b, 0x61, 0x6d, 0x61, 0x6c, 0x75, 0x6e, 0x43c, 0x43e,
-0x43d, 0x433, 0x43e, 0x43b, 0x41c, 0x43e, 0x43d, 0x433, 0x43e, 0x43b, 0x6b, 0x72, 0x65, 0x6f, 0x6c, 0x20, 0x6d, 0x6f, 0x72, 0x69,
-0x73, 0x69, 0x65, 0x6e, 0x4d, 0x6f, 0x72, 0x69, 0x73, 0x4d, 0x55, 0x4e, 0x44, 0x41, 0x14a, 0x6b, 0x61, 0x6d, 0x65, 0x72,
-0x75, 0x14b, 0x4b, 0x68, 0x6f, 0x65, 0x6b, 0x68, 0x6f, 0x65, 0x67, 0x6f, 0x77, 0x61, 0x62, 0x4e, 0x61, 0x6d, 0x69, 0x62,
-0x69, 0x61, 0x62, 0x928, 0x947, 0x92a, 0x93e, 0x932, 0x940, 0x53, 0x68, 0x77, 0xf3, 0x14b, 0xf2, 0x20, 0x6e, 0x67, 0x69, 0x65,
-0x6d, 0x62, 0x254, 0x254, 0x6e, 0x4b, 0xe0, 0x6d, 0x61, 0x6c, 0xfb, 0x6d, 0x4e, 0x64, 0x61, 0xa78c, 0x61, 0x4b, 0x61, 0x6d,
-0x25b, 0x6c, 0xfb, 0x6e, 0x4e, 0x61, 0x69, 0x6a, 0xed, 0x72, 0x69, 0xe1, 0x20, 0x50, 0xed, 0x6a, 0x69, 0x6e, 0x4e, 0x61,
-0x69, 0x6a, 0xed, 0x72, 0x69, 0x61, 0x644, 0x6ca, 0x631, 0x6cc, 0x20, 0x634, 0x648, 0x645, 0x627, 0x644, 0x6cc, 0x64, 0x61, 0x76,
-0x76, 0x69, 0x73, 0xe1, 0x6d, 0x65, 0x67, 0x69, 0x65, 0x6c, 0x6c, 0x61, 0x4e, 0x6f, 0x72, 0x67, 0x61, 0x53, 0x75, 0x6f,
-0x70, 0x6d, 0x61, 0x52, 0x75, 0x6f, 0x167, 0x167, 0x61, 0x69, 0x73, 0x69, 0x4e, 0x64, 0x65, 0x62, 0x65, 0x6c, 0x65, 0x6e,
-0x6f, 0x72, 0x73, 0x6b, 0x20, 0x62, 0x6f, 0x6b, 0x6d, 0xe5, 0x6c, 0x4e, 0x6f, 0x72, 0x67, 0x65, 0x53, 0x76, 0x61, 0x6c,
-0x62, 0x61, 0x72, 0x64, 0x20, 0x6f, 0x67, 0x20, 0x4a, 0x61, 0x6e, 0x20, 0x4d, 0x61, 0x79, 0x65, 0x6e, 0x6e, 0x6f, 0x72,
-0x73, 0x6b, 0x20, 0x6e, 0x79, 0x6e, 0x6f, 0x72, 0x73, 0x6b, 0x4e, 0x6f, 0x72, 0x65, 0x67, 0x54, 0x68, 0x6f, 0x6b, 0x20,
-0x4e, 0x61, 0x74, 0x68, 0x52, 0x75, 0x6e, 0x79, 0x61, 0x6e, 0x6b, 0x6f, 0x72, 0x65, 0xb13, 0xb21, 0xb3c, 0xb3f, 0xb06, 0xb2d,
-0xb3e, 0xb30, 0xb24, 0x4f, 0x72, 0x6f, 0x6d, 0x6f, 0x6f, 0x49, 0x74, 0x6f, 0x6f, 0x70, 0x68, 0x69, 0x79, 0x61, 0x61, 0x4b,
-0x65, 0x65, 0x6e, 0x69, 0x79, 0x61, 0x61, 0x438, 0x440, 0x43e, 0x43d, 0x413, 0x443, 0x44b, 0x440, 0x434, 0x437, 0x44b, 0x441, 0x442,
-0x43e, 0x43d, 0x423, 0x4d5, 0x440, 0x4d5, 0x441, 0x435, 0x67e, 0x69a, 0x62a, 0x648, 0x627, 0x641, 0x63a, 0x627, 0x646, 0x633, 0x62a, 0x627,
-0x646, 0x67e, 0x627, 0x6a9, 0x633, 0x62a, 0x627, 0x646, 0x641, 0x627, 0x631, 0x633, 0x6cc, 0x62f, 0x631, 0x6cc, 0x70, 0x6f, 0x6c, 0x73,
-0x6b, 0x69, 0x50, 0x6f, 0x6c, 0x73, 0x6b, 0x61, 0x70, 0x6f, 0x72, 0x74, 0x75, 0x67, 0x75, 0xea, 0x73, 0x42, 0x72, 0x61,
-0x73, 0x69, 0x6c, 0x41, 0x6e, 0x67, 0x6f, 0x6c, 0x61, 0x43, 0x61, 0x62, 0x6f, 0x20, 0x56, 0x65, 0x72, 0x64, 0x65, 0x47,
-0x75, 0x69, 0x6e, 0xe9, 0x20, 0x45, 0x71, 0x75, 0x61, 0x74, 0x6f, 0x72, 0x69, 0x61, 0x6c, 0x47, 0x75, 0x69, 0x6e, 0xe9,
-0x2d, 0x42, 0x69, 0x73, 0x73, 0x61, 0x75, 0x4c, 0x75, 0x78, 0x65, 0x6d, 0x62, 0x75, 0x72, 0x67, 0x6f, 0x4d, 0x61, 0x63,
-0x61, 0x75, 0x2c, 0x20, 0x52, 0x41, 0x45, 0x20, 0x64, 0x61, 0x20, 0x43, 0x68, 0x69, 0x6e, 0x61, 0x4d, 0x6f, 0xe7, 0x61,
-0x6d, 0x62, 0x69, 0x71, 0x75, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x75, 0x67, 0x75, 0xea, 0x73, 0x20, 0x65, 0x75, 0x72, 0x6f,
-0x70, 0x65, 0x75, 0x50, 0x6f, 0x72, 0x74, 0x75, 0x67, 0x61, 0x6c, 0x53, 0xe3, 0x6f, 0x20, 0x54, 0x6f, 0x6d, 0xe9, 0x20,
-0x65, 0x20, 0x50, 0x72, 0xed, 0x6e, 0x63, 0x69, 0x70, 0x65, 0x53, 0x75, 0xed, 0xe7, 0x61, 0x54, 0x69, 0x6d, 0x6f, 0x72,
-0x2d, 0x4c, 0x65, 0x73, 0x74, 0x65, 0xa2a, 0xa70, 0xa1c, 0xa3e, 0xa2c, 0xa40, 0xa2d, 0xa3e, 0xa30, 0xa24, 0x67e, 0x646, 0x62c, 0x627,
-0x628, 0x6cc, 0x52, 0x75, 0x6e, 0x61, 0x73, 0x69, 0x6d, 0x69, 0x50, 0x65, 0x72, 0xfa, 0x42, 0x6f, 0x6c, 0x69, 0x76, 0x69,
-0x61, 0x45, 0x63, 0x75, 0x61, 0x64, 0x6f, 0x72, 0x72, 0x6f, 0x6d, 0xe2, 0x6e, 0x103, 0x52, 0x6f, 0x6d, 0xe2, 0x6e, 0x69,
-0x61, 0x52, 0x65, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x61, 0x20, 0x4d, 0x6f, 0x6c, 0x64, 0x6f, 0x76, 0x61, 0x72, 0x75,
-0x6d, 0x61, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x53, 0x76, 0x69, 0x7a, 0x72, 0x61, 0x4b, 0x69, 0x68, 0x6f, 0x72, 0x6f, 0x6d,
-0x62, 0x6f, 0x49, 0x6b, 0x69, 0x72, 0x75, 0x6e, 0x64, 0x69, 0x55, 0x62, 0x75, 0x72, 0x75, 0x6e, 0x64, 0x69, 0x440, 0x443,
-0x441, 0x441, 0x43a, 0x438, 0x439, 0x420, 0x43e, 0x441, 0x441, 0x438, 0x44f, 0x41a, 0x430, 0x437, 0x430, 0x445, 0x441, 0x442, 0x430, 0x43d,
-0x41a, 0x438, 0x440, 0x433, 0x438, 0x437, 0x438, 0x44f, 0x41c, 0x43e, 0x43b, 0x434, 0x43e, 0x432, 0x430, 0x423, 0x43a, 0x440, 0x430, 0x438,
-0x43d, 0x430, 0x4b, 0x69, 0x72, 0x75, 0x77, 0x61, 0x441, 0x430, 0x445, 0x430, 0x20, 0x442, 0x44b, 0x43b, 0x430, 0x410, 0x440, 0x430,
-0x441, 0x441, 0x44b, 0x44b, 0x439, 0x430, 0x4b, 0x69, 0x73, 0x61, 0x6d, 0x70, 0x75, 0x72, 0x53, 0xe4, 0x6e, 0x67, 0xf6, 0x4b,
-0xf6, 0x64, 0xf6, 0x72, 0xf6, 0x73, 0xea, 0x73, 0x65, 0x20, 0x74, 0xee, 0x20, 0x42, 0xea, 0x61, 0x66, 0x72, 0xee, 0x6b,
-0x61, 0x49, 0x73, 0x68, 0x69, 0x73, 0x61, 0x6e, 0x67, 0x75, 0x54, 0x61, 0x6e, 0x73, 0x61, 0x6e, 0x69, 0x79, 0x61, 0x938,
-0x902, 0x938, 0x94d, 0x915, 0x943, 0x924, 0x20, 0x92d, 0x93e, 0x937, 0x93e, 0x92d, 0x93e, 0x930, 0x924, 0x903, 0x1c65, 0x1c5f, 0x1c71, 0x1c5b,
-0x1c5f, 0x1c72, 0x1c64, 0x1c64, 0x1c71, 0x1c70, 0x1c64, 0x1c6d, 0x1c5f, 0x73, 0x61, 0x72, 0x64, 0x75, 0x73, 0x65, 0x6e, 0x61, 0x441, 0x440,
-0x43f, 0x441, 0x43a, 0x438, 0x421, 0x440, 0x431, 0x438, 0x458, 0x430, 0x41a, 0x43e, 0x441, 0x43e, 0x432, 0x43e, 0x426, 0x440, 0x43d, 0x430,
-0x20, 0x413, 0x43e, 0x440, 0x430, 0x73, 0x72, 0x70, 0x73, 0x6b, 0x69, 0x4b, 0x6f, 0x73, 0x6f, 0x76, 0x6f, 0x43, 0x72, 0x6e,
-0x61, 0x20, 0x47, 0x6f, 0x72, 0x61, 0x53, 0x72, 0x62, 0x69, 0x6a, 0x61, 0x4b, 0x69, 0x73, 0x68, 0x61, 0x6d, 0x62, 0x61,
-0x61, 0x63, 0x68, 0x69, 0x53, 0x68, 0x6f, 0x6e, 0x61, 0xa188, 0xa320, 0xa259, 0xa34f, 0xa1e9, 0x633, 0x646, 0x68c, 0x64a, 0x67e, 0x627,
-0x6aa, 0x633, 0x62a, 0x627, 0x646, 0x938, 0x93f, 0x928, 0x94d, 0x927, 0x940, 0xdc3, 0xdd2, 0xd82, 0xdc4, 0xdbd, 0xdc1, 0xdca, 0x200d, 0xdbb,
-0xdd3, 0x20, 0xdbd, 0xd82, 0xd9a, 0xdcf, 0xdc0, 0x73, 0x6c, 0x6f, 0x76, 0x65, 0x6e, 0x10d, 0x69, 0x6e, 0x61, 0x53, 0x6c, 0x6f,
-0x76, 0x65, 0x6e, 0x73, 0x6b, 0x6f, 0x73, 0x6c, 0x6f, 0x76, 0x65, 0x6e, 0x161, 0x10d, 0x69, 0x6e, 0x61, 0x53, 0x6c, 0x6f,
-0x76, 0x65, 0x6e, 0x69, 0x6a, 0x61, 0x4f, 0x6c, 0x75, 0x73, 0x6f, 0x67, 0x61, 0x53, 0x6f, 0x6f, 0x6d, 0x61, 0x61, 0x6c,
-0x69, 0x53, 0x6f, 0x6f, 0x6d, 0x61, 0x61, 0x6c, 0x69, 0x79, 0x61, 0x4a, 0x61, 0x62, 0x75, 0x75, 0x74, 0x69, 0x49, 0x74,
-0x6f, 0x6f, 0x62, 0x69, 0x79, 0x61, 0x65, 0x73, 0x70, 0x61, 0xf1, 0x6f, 0x6c, 0x20, 0x64, 0x65, 0x20, 0x45, 0x73, 0x70,
-0x61, 0xf1, 0x61, 0x41, 0x72, 0x67, 0x65, 0x6e, 0x74, 0x69, 0x6e, 0x61, 0x42, 0x65, 0x6c, 0x69, 0x63, 0x65, 0x43, 0x61,
-0x6e, 0x61, 0x72, 0x69, 0x61, 0x73, 0x43, 0x65, 0x75, 0x74, 0x61, 0x20, 0x79, 0x20, 0x4d, 0x65, 0x6c, 0x69, 0x6c, 0x6c,
-0x61, 0x43, 0x68, 0x69, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x6d, 0x62, 0x69, 0x61, 0x43, 0x6f, 0x73, 0x74, 0x61, 0x20,
-0x52, 0x69, 0x63, 0x61, 0x43, 0x75, 0x62, 0x61, 0x52, 0x65, 0x70, 0xfa, 0x62, 0x6c, 0x69, 0x63, 0x61, 0x20, 0x44, 0x6f,
-0x6d, 0x69, 0x6e, 0x69, 0x63, 0x61, 0x6e, 0x61, 0x45, 0x6c, 0x20, 0x53, 0x61, 0x6c, 0x76, 0x61, 0x64, 0x6f, 0x72, 0x47,
-0x75, 0x69, 0x6e, 0x65, 0x61, 0x20, 0x45, 0x63, 0x75, 0x61, 0x74, 0x6f, 0x72, 0x69, 0x61, 0x6c, 0x47, 0x75, 0x61, 0x74,
-0x65, 0x6d, 0x61, 0x6c, 0x61, 0x48, 0x6f, 0x6e, 0x64, 0x75, 0x72, 0x61, 0x73, 0x65, 0x73, 0x70, 0x61, 0xf1, 0x6f, 0x6c,
-0x20, 0x6c, 0x61, 0x74, 0x69, 0x6e, 0x6f, 0x61, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6e, 0x6f, 0x4c, 0x61, 0x74, 0x69,
-0x6e, 0x6f, 0x61, 0x6d, 0xe9, 0x72, 0x69, 0x63, 0x61, 0x65, 0x73, 0x70, 0x61, 0xf1, 0x6f, 0x6c, 0x20, 0x64, 0x65, 0x20,
-0x4d, 0xe9, 0x78, 0x69, 0x63, 0x6f, 0x4d, 0xe9, 0x78, 0x69, 0x63, 0x6f, 0x4e, 0x69, 0x63, 0x61, 0x72, 0x61, 0x67, 0x75,
-0x61, 0x50, 0x61, 0x6e, 0x61, 0x6d, 0xe1, 0x50, 0x61, 0x72, 0x61, 0x67, 0x75, 0x61, 0x79, 0x46, 0x69, 0x6c, 0x69, 0x70,
-0x69, 0x6e, 0x61, 0x73, 0x45, 0x73, 0x74, 0x61, 0x64, 0x6f, 0x73, 0x20, 0x55, 0x6e, 0x69, 0x64, 0x6f, 0x73, 0x55, 0x72,
-0x75, 0x67, 0x75, 0x61, 0x79, 0x56, 0x65, 0x6e, 0x65, 0x7a, 0x75, 0x65, 0x6c, 0x61, 0x2d5c, 0x2d30, 0x2d4e, 0x2d30, 0x2d63, 0x2d49,
-0x2d56, 0x2d5c, 0x2d4d, 0x2d4e, 0x2d56, 0x2d54, 0x2d49, 0x2d31, 0x42, 0x61, 0x73, 0x61, 0x20, 0x53, 0x75, 0x6e, 0x64, 0x61, 0x4b, 0x69,
-0x73, 0x77, 0x61, 0x68, 0x69, 0x6c, 0x69, 0x4a, 0x61, 0x6d, 0x68, 0x75, 0x72, 0x69, 0x20, 0x79, 0x61, 0x20, 0x4b, 0x69,
-0x64, 0x65, 0x6d, 0x6f, 0x6b, 0x72, 0x61, 0x73, 0x69, 0x61, 0x20, 0x79, 0x61, 0x20, 0x4b, 0x6f, 0x6e, 0x67, 0x6f, 0x73,
-0x76, 0x65, 0x6e, 0x73, 0x6b, 0x61, 0x53, 0x76, 0x65, 0x72, 0x69, 0x67, 0x65, 0xc5, 0x6c, 0x61, 0x6e, 0x64, 0x53, 0x63,
-0x68, 0x77, 0x69, 0x69, 0x7a, 0x65, 0x72, 0x74, 0xfc, 0xfc, 0x74, 0x73, 0x63, 0x68, 0x46, 0x72, 0x61, 0x6e, 0x6b, 0x72,
-0x69, 0x69, 0x63, 0x68, 0x4c, 0x69, 0xe4, 0x63, 0x68, 0x74, 0x65, 0x73, 0x63, 0x68, 0x74, 0xe4, 0x69, 0x2d5c, 0x2d30, 0x2d5b,
-0x2d4d, 0x2d43, 0x2d49, 0x2d5c, 0x54, 0x61, 0x73, 0x68, 0x65, 0x6c, 0x1e25, 0x69, 0x79, 0x74, 0x6c, 0x6d, 0x263, 0x72, 0x69, 0x62,
-0x4b, 0x69, 0x74, 0x61, 0x69, 0x74, 0x61, 0x442, 0x43e, 0x4b7, 0x438, 0x43a, 0x4e3, 0x422, 0x43e, 0x4b7, 0x438, 0x43a, 0x438, 0x441,
-0x442, 0x43e, 0x43d, 0xba4, 0xbae, 0xbbf, 0xbb4, 0xbcd, 0xb87, 0xba8, 0xbcd, 0xba4, 0xbbf, 0xbaf, 0xbbe, 0xbae, 0xbb2, 0xbc7, 0xb9a, 0xbbf,
-0xbaf, 0xbbe, 0xb9a, 0xbbf, 0xb99, 0xbcd, 0xb95, 0xbaa, 0xbcd, 0xbaa, 0xbc2, 0xbb0, 0xbcd, 0xb87, 0xbb2, 0xb99, 0xbcd, 0xb95, 0xbc8, 0x54,
-0x61, 0x73, 0x61, 0x77, 0x61, 0x71, 0x20, 0x73, 0x65, 0x6e, 0x6e, 0x69, 0x4e, 0x69, 0x17e, 0x65, 0x72, 0x442, 0x430, 0x442,
-0x430, 0x440, 0xc24, 0xc46, 0xc32, 0xc41, 0xc17, 0xc41, 0xc2d, 0xc3e, 0xc30, 0xc24, 0xc26, 0xc47, 0xc36, 0xc02, 0x4b, 0x69, 0x74, 0x65,
-0x73, 0x6f, 0x4b, 0x65, 0x6e, 0x69, 0x61, 0xe44, 0xe17, 0xe22, 0xf56, 0xf7c, 0xf51, 0xf0b, 0xf66, 0xf90, 0xf51, 0xf0b, 0xf62, 0xf92,
-0xfb1, 0xf0b, 0xf53, 0xf42, 0xf62, 0xf92, 0xfb1, 0xf0b, 0xf42, 0xf62, 0xf0b, 0x1275, 0x130d, 0x122d, 0x129b, 0x12a4, 0x122d, 0x1275, 0x122b, 0x6c,
-0x65, 0x61, 0x20, 0x66, 0x61, 0x6b, 0x61, 0x74, 0x6f, 0x6e, 0x67, 0x61, 0x54, 0xfc, 0x72, 0x6b, 0xe7, 0x65, 0x54, 0xfc,
-0x72, 0x6b, 0x69, 0x79, 0x65, 0x4b, 0x131, 0x62, 0x72, 0x131, 0x73, 0x74, 0xfc, 0x72, 0x6b, 0x6d, 0x65, 0x6e, 0x20, 0x64,
-0x69, 0x6c, 0x69, 0x54, 0xfc, 0x72, 0x6b, 0x6d, 0x65, 0x6e, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x443, 0x43a, 0x440, 0x430, 0x457,
-0x43d, 0x441, 0x44c, 0x43a, 0x430, 0x423, 0x43a, 0x440, 0x430, 0x457, 0x43d, 0x430, 0x68, 0x6f, 0x72, 0x6e, 0x6a, 0x6f, 0x73, 0x65,
-0x72, 0x62, 0x161, 0x107, 0x69, 0x6e, 0x61, 0x4e, 0x11b, 0x6d, 0x73, 0x6b, 0x61, 0x627, 0x631, 0x62f, 0x648, 0x628, 0x6be, 0x627,
-0x631, 0x62a, 0x626, 0x6c7, 0x64a, 0x63a, 0x6c7, 0x631, 0x686, 0x6d5, 0x62c, 0x6c7, 0x6ad, 0x6af, 0x648, 0x6f, 0x2018, 0x7a, 0x62, 0x65,
-0x6b, 0x4f, 0x2bb, 0x7a, 0x62, 0x65, 0x6b, 0x69, 0x73, 0x74, 0x6f, 0x6e, 0x627, 0x648, 0x632, 0x628, 0x6cc, 0x6a9, 0x45e, 0x437,
-0x431, 0x435, 0x43a, 0x447, 0x430, 0x40e, 0x437, 0x431, 0x435, 0x43a, 0x438, 0x441, 0x442, 0x43e, 0x43d, 0xa559, 0xa524, 0xa55e, 0xa524, 0xa52b,
-0xa569, 0x56, 0x61, 0x69, 0x4c, 0x61, 0x69, 0x62, 0x68, 0x69, 0x79, 0x61, 0x54, 0x69, 0x1ebf, 0x6e, 0x67, 0x20, 0x56, 0x69,
-0x1ec7, 0x74, 0x56, 0x69, 0x1ec7, 0x74, 0x20, 0x4e, 0x61, 0x6d, 0x4b, 0x79, 0x69, 0x76, 0x75, 0x6e, 0x6a, 0x6f, 0x57, 0x61,
-0x6c, 0x73, 0x65, 0x72, 0x53, 0x63, 0x68, 0x77, 0x69, 0x7a, 0x43, 0x79, 0x6d, 0x72, 0x61, 0x65, 0x67, 0x59, 0x20, 0x44,
-0x65, 0x79, 0x72, 0x6e, 0x61, 0x73, 0x20, 0x55, 0x6e, 0x65, 0x64, 0x69, 0x67, 0x46, 0x72, 0x79, 0x73, 0x6b, 0x4e, 0x65,
-0x64, 0x65, 0x72, 0x6c, 0xe2, 0x6e, 0x57, 0x6f, 0x6c, 0x6f, 0x66, 0x69, 0x73, 0x69, 0x58, 0x68, 0x6f, 0x73, 0x61, 0x65,
-0x4d, 0x7a, 0x61, 0x6e, 0x74, 0x73, 0x69, 0x20, 0x41, 0x66, 0x72, 0x69, 0x6b, 0x61, 0x6e, 0x75, 0x61, 0x73, 0x75, 0x65,
-0x4b, 0x65, 0x6d, 0x65, 0x6c, 0xfa, 0x6e, 0x5d9, 0x5d9, 0x5b4, 0x5d3, 0x5d9, 0x5e9, 0x5d5, 0x5d5, 0x5e2, 0x5dc, 0x5d8, 0xc8, 0x64,
-0xe8, 0x20, 0x59, 0x6f, 0x72, 0xf9, 0x62, 0xe1, 0x4e, 0xe0, 0xec, 0x6a, 0xed, 0x72, 0xed, 0xe0, 0x42, 0x25b, 0x300, 0x6e,
-0x25b, 0x300, 0x5a, 0x61, 0x72, 0x6d, 0x61, 0x63, 0x69, 0x69, 0x6e, 0x65, 0x69, 0x73, 0x69, 0x5a, 0x75, 0x6c, 0x75, 0x69,
-0x4e, 0x69, 0x6e, 0x67, 0x69, 0x7a, 0x69, 0x6d, 0x75, 0x20, 0x41, 0x66, 0x72, 0x69, 0x6b, 0x61, 0x6b, 0x61, 0x6e, 0x68,
-0x67, 0xe1, 0x67, 0x4d, 0x72, 0x61, 0x73, 0x69, 0x72, 0x6e, 0x68, 0x65, 0x1ebd, 0x67, 0x61, 0x74, 0x75, 0x42, 0x72, 0x61,
-0x73, 0x69, 0x75, 0xf1, 0x65, 0x6e, 0x67, 0x61, 0x74, 0xfa, 0x4b, 0x75, 0x72, 0x169, 0x62, 0x69, 0x79, 0x61, 0x57, 0x65,
-0x6e, 0x65, 0x73, 0x75, 0x65, 0x72, 0x61
+static constexpr char16_t endonyms_data[] = {
+0x410, 0x525, 0x441, 0x448, 0x4d9, 0x430, 0x49a, 0x44b, 0x440, 0x4ad, 0x442, 0x4d9,
+0x44b, 0x43b, 0x430, 0x51, 0x61, 0x66, 0x61, 0x72, 0x4f, 0x74, 0x6f, 0x62,
+0x62, 0x69, 0x61, 0x59, 0x61, 0x62, 0x75, 0x75, 0x74, 0x69, 0x45, 0x72,
+0x65, 0x74, 0x72, 0x69, 0x61, 0x41, 0x66, 0x72, 0x69, 0x6b, 0x61, 0x61,
+0x6e, 0x73, 0x53, 0x75, 0x69, 0x64, 0x2d, 0x41, 0x66, 0x72, 0x69, 0x6b,
+0x61, 0x4e, 0x61, 0x6d, 0x69, 0x62, 0x69, 0xeb, 0x41, 0x67, 0x68, 0x65,
+0x6d, 0x4b, 0xe0, 0x6d, 0xe0, 0x6c, 0xfb, 0x14b, 0x41, 0x6b, 0x61, 0x6e,
+0x47, 0x61, 0x61, 0x6e, 0x61, 0x41, 0x6b, 0x6f, 0x6f, 0x73, 0x65, 0x4b,
+0x61, 0x6d, 0x65, 0x72, 0xfb, 0x6e, 0x73, 0x68, 0x71, 0x69, 0x70, 0x53,
+0x68, 0x71, 0x69, 0x70, 0xeb, 0x72, 0x69, 0x4b, 0x6f, 0x73, 0x6f, 0x76,
+0xeb, 0x4d, 0x61, 0x71, 0x65, 0x64, 0x6f, 0x6e, 0x69, 0x61, 0x20, 0x65,
+0x20, 0x56, 0x65, 0x72, 0x69, 0x75, 0x74, 0x12a0, 0x121b, 0x122d, 0x129b, 0x12a2,
+0x1275, 0x12ee, 0x1335, 0x12eb, 0x627, 0x644, 0x639, 0x631, 0x628, 0x64a, 0x629, 0x645,
+0x635, 0x631, 0x627, 0x644, 0x62c, 0x632, 0x627, 0x626, 0x631, 0x627, 0x644, 0x628,
+0x62d, 0x631, 0x64a, 0x646, 0x62a, 0x634, 0x627, 0x62f, 0x62c, 0x632, 0x631, 0x20,
+0x627, 0x644, 0x642, 0x645, 0x631, 0x62c, 0x64a, 0x628, 0x648, 0x62a, 0x64a, 0x625,
+0x631, 0x64a, 0x62a, 0x631, 0x64a, 0x627, 0x627, 0x644, 0x639, 0x631, 0x627, 0x642,
+0x625, 0x633, 0x631, 0x627, 0x626, 0x64a, 0x644, 0x627, 0x644, 0x623, 0x631, 0x62f,
+0x646, 0x627, 0x644, 0x643, 0x648, 0x64a, 0x62a, 0x644, 0x628, 0x646, 0x627, 0x646,
+0x644, 0x64a, 0x628, 0x64a, 0x627, 0x645, 0x648, 0x631, 0x64a, 0x62a, 0x627, 0x646,
+0x64a, 0x627, 0x627, 0x644, 0x645, 0x63a, 0x631, 0x628, 0x639, 0x64f, 0x645, 0x627,
+0x646, 0x627, 0x644, 0x623, 0x631, 0x627, 0x636, 0x64a, 0x20, 0x627, 0x644, 0x641,
+0x644, 0x633, 0x637, 0x64a, 0x646, 0x64a, 0x629, 0x642, 0x637, 0x631, 0x627, 0x644,
+0x645, 0x645, 0x644, 0x643, 0x629, 0x20, 0x627, 0x644, 0x639, 0x631, 0x628, 0x64a,
+0x629, 0x20, 0x627, 0x644, 0x633, 0x639, 0x648, 0x62f, 0x64a, 0x629, 0x627, 0x644,
+0x635, 0x648, 0x645, 0x627, 0x644, 0x62c, 0x646, 0x648, 0x628, 0x20, 0x627, 0x644,
+0x633, 0x648, 0x62f, 0x627, 0x646, 0x627, 0x644, 0x633, 0x648, 0x62f, 0x627, 0x646,
+0x633, 0x648, 0x631, 0x64a, 0x627, 0x62a, 0x648, 0x646, 0x633, 0x627, 0x644, 0x625,
+0x645, 0x627, 0x631, 0x627, 0x62a, 0x20, 0x627, 0x644, 0x639, 0x631, 0x628, 0x64a,
+0x629, 0x20, 0x627, 0x644, 0x645, 0x62a, 0x62d, 0x62f, 0x629, 0x627, 0x644, 0x635,
+0x62d, 0x631, 0x627, 0x621, 0x20, 0x627, 0x644, 0x63a, 0x631, 0x628, 0x64a, 0x629,
+0x627, 0x644, 0x639, 0x631, 0x628, 0x64a, 0x629, 0x20, 0x627, 0x644, 0x641, 0x635,
+0x62d, 0x649, 0x20, 0x627, 0x644, 0x62d, 0x62f, 0x64a, 0x62b, 0x629, 0x627, 0x644,
+0x639, 0x627, 0x644, 0x645, 0x627, 0x644, 0x64a, 0x645, 0x646, 0x61, 0x72, 0x61,
+0x67, 0x6f, 0x6e, 0xe9, 0x73, 0x45, 0x73, 0x70, 0x61, 0x6e, 0x79, 0x61,
+0x570, 0x561, 0x575, 0x565, 0x580, 0x565, 0x576, 0x540, 0x561, 0x575, 0x561, 0x57d,
+0x57f, 0x561, 0x576, 0x985, 0x9b8, 0x9ae, 0x9c0, 0x9af, 0x9bc, 0x9be, 0x9ad, 0x9be,
+0x9f0, 0x9a4, 0x61, 0x73, 0x74, 0x75, 0x72, 0x69, 0x61, 0x6e, 0x75, 0x45,
+0x73, 0x70, 0x61, 0xf1, 0x61, 0x4b, 0x69, 0x70, 0x61, 0x72, 0x65, 0x54,
+0x61, 0x64, 0x68, 0x61, 0x6e, 0x69, 0x61, 0x41, 0x74, 0x73, 0x61, 0x6d,
+0x61, 0x7a, 0x259, 0x72, 0x62, 0x61, 0x79, 0x63, 0x61, 0x6e, 0x41, 0x7a,
+0x259, 0x72, 0x62, 0x61, 0x79, 0x63, 0x61, 0x6e, 0x62a, 0x6c6, 0x631, 0x6a9,
+0x62c, 0x647, 0x430, 0x437, 0x4d9, 0x440, 0x431, 0x430, 0x458, 0x4b9, 0x430, 0x43d,
+0x410, 0x437, 0x4d9, 0x440, 0x431, 0x430, 0x458, 0x4b9, 0x430, 0x43d, 0x72, 0x69,
+0x6b, 0x70, 0x61, 0x6b, 0x61, 0x6d, 0x25b, 0x72, 0xfa, 0x6e, 0x62, 0x61,
+0x6d, 0x61, 0x6e, 0x61, 0x6b, 0x61, 0x6e, 0x4d, 0x61, 0x6c, 0x69, 0x9ac,
+0x9be, 0x982, 0x9b2, 0x9be, 0x9ac, 0x9be, 0x982, 0x9b2, 0x9be, 0x9a6, 0x9c7, 0x9b6,
+0x9ad, 0x9be, 0x9b0, 0x9a4, 0x181, 0xe0, 0x73, 0xe0, 0x61, 0x4b, 0xe0, 0x6d,
+0x25b, 0x300, 0x72, 0xfb, 0x6e, 0x431, 0x430, 0x448, 0x4a1, 0x43e, 0x440, 0x442,
+0x20, 0x442, 0x435, 0x43b, 0x435, 0x65, 0x75, 0x73, 0x6b, 0x61, 0x72, 0x61,
+0x45, 0x73, 0x70, 0x61, 0x69, 0x6e, 0x69, 0x61, 0x431, 0x435, 0x43b, 0x430,
+0x440, 0x443, 0x441, 0x43a, 0x430, 0x44f, 0x411, 0x435, 0x43b, 0x430, 0x440, 0x443,
+0x441, 0x44c, 0x49, 0x63, 0x68, 0x69, 0x62, 0x65, 0x6d, 0x62, 0x61, 0x5a,
+0x61, 0x6d, 0x62, 0x69, 0x61, 0x48, 0x69, 0x62, 0x65, 0x6e, 0x61, 0x48,
+0x75, 0x74, 0x61, 0x6e, 0x7a, 0x61, 0x6e, 0x69, 0x61, 0x92d, 0x94b, 0x91c,
+0x92a, 0x941, 0x930, 0x940, 0x92d, 0x93e, 0x930, 0x924, 0x1265, 0x120a, 0x1295, 0x12a4,
+0x122d, 0x1275, 0x122b, 0x92c, 0x930, 0x2019, 0x62, 0x6f, 0x73, 0x61, 0x6e, 0x73,
+0x6b, 0x69, 0x42, 0x6f, 0x73, 0x6e, 0x61, 0x20, 0x69, 0x20, 0x48, 0x65,
+0x72, 0x63, 0x65, 0x67, 0x6f, 0x76, 0x69, 0x6e, 0x61, 0x431, 0x43e, 0x441,
+0x430, 0x43d, 0x441, 0x43a, 0x438, 0x411, 0x43e, 0x441, 0x43d, 0x430, 0x20, 0x438,
+0x20, 0x425, 0x435, 0x440, 0x446, 0x435, 0x433, 0x43e, 0x432, 0x438, 0x43d, 0x430,
+0x62, 0x72, 0x65, 0x7a, 0x68, 0x6f, 0x6e, 0x65, 0x67, 0x46, 0x72, 0x61,
+0xf1, 0x73, 0x431, 0x44a, 0x43b, 0x433, 0x430, 0x440, 0x441, 0x43a, 0x438, 0x411,
+0x44a, 0x43b, 0x433, 0x430, 0x440, 0x438, 0x44f, 0x1019, 0x103c, 0x1014, 0x103a, 0x1019,
+0x102c, 0x7cb5, 0x8a9e, 0x4e2d, 0x83ef, 0x4eba, 0x6c11, 0x5171, 0x548c, 0x570b, 0x9999, 0x6e2f,
+0x7279, 0x5225, 0x884c, 0x653f, 0x5340, 0x7ca4, 0x8bed, 0x4e2d, 0x534e, 0x4eba, 0x6c11, 0x5171,
+0x548c, 0x56fd, 0x63, 0x61, 0x74, 0x61, 0x6c, 0xe0, 0x41, 0x6e, 0x64, 0x6f,
+0x72, 0x72, 0x61, 0x46, 0x72, 0x61, 0x6e, 0xe7, 0x61, 0x49, 0x74, 0xe0,
+0x6c, 0x69, 0x61, 0x43, 0x65, 0x62, 0x75, 0x61, 0x6e, 0x6f, 0x50, 0x69,
+0x6c, 0x69, 0x70, 0x69, 0x6e, 0x61, 0x73, 0x54, 0x61, 0x6d, 0x61, 0x7a,
+0x69, 0x263, 0x74, 0x20, 0x6e, 0x20, 0x6c, 0x61, 0x1e6d, 0x6c, 0x61, 0x1e63,
+0x4d, 0x65, 0x1e5b, 0x1e5b, 0x75, 0x6b, 0x6a9, 0x648, 0x631, 0x62f, 0x6cc, 0x6cc,
+0x20, 0x646, 0x627, 0x648, 0x6d5, 0x646, 0x62f, 0x6cc, 0x639, 0x6ce, 0x631, 0x627,
+0x642, 0x626, 0x6ce, 0x631, 0x627, 0x646, 0xd804, 0xdd0c, 0xd804, 0xdd0b, 0xd804, 0xdd34,
+0xd804, 0xdd1f, 0xd804, 0xdd33, 0xd804, 0xdd26, 0xd804, 0xdd1d, 0xd804, 0xdd01, 0xd804, 0xdd23,
+0xd804, 0xdd18, 0xd804, 0xdd2c, 0xd804, 0xdd0c, 0xd804, 0xdd34, 0xd804, 0xdd1e, 0xd804, 0xdd22,
+0xd804, 0xdd27, 0xd804, 0xdd16, 0xd804, 0xdd34, 0x43d, 0x43e, 0x445, 0x447, 0x438, 0x439,
+0x43d, 0x420, 0x43e, 0x441, 0x441, 0x438, 0x13e3, 0x13b3, 0x13a9, 0x13cc, 0x13ca, 0x20,
+0x13a2, 0x13f3, 0x13be, 0x13b5, 0x13cd, 0x13d4, 0x13c5, 0x20, 0x13cd, 0x13a6, 0x13da, 0x13a9,
+0x43, 0x68, 0x69, 0x6b, 0x61, 0x73, 0x68, 0x73, 0x68, 0x61, 0x6e, 0x6f,
+0x6d, 0x70, 0x61, 0x2bc, 0x55, 0x6e, 0x69, 0x74, 0x65, 0x64, 0x20, 0x53,
+0x74, 0x61, 0x74, 0x65, 0x73, 0x52, 0x75, 0x6b, 0x69, 0x67, 0x61, 0x55,
+0x67, 0x61, 0x6e, 0x64, 0x61, 0x7b80, 0x4f53, 0x4e2d, 0x6587, 0x4e2d, 0x56fd, 0x4e2d,
+0x56fd, 0x9999, 0x6e2f, 0x7279, 0x522b, 0x884c, 0x653f, 0x533a, 0x4e2d, 0x56fd, 0x6fb3, 0x95e8,
+0x7279, 0x522b, 0x884c, 0x653f, 0x533a, 0x65b0, 0x52a0, 0x5761, 0x7e41, 0x9ad4, 0x4e2d, 0x6587,
+0x4e2d, 0x570b, 0x9999, 0x6e2f, 0x7279, 0x5225, 0x884c, 0x653f, 0x5340, 0x4e2d, 0x570b, 0x6fb3,
+0x9580, 0x7279, 0x5225, 0x884c, 0x653f, 0x5340, 0x53f0, 0x7063, 0x446, 0x435, 0x440, 0x43a,
+0x43e, 0x432, 0x43d, 0x43e, 0x441, 0x43b, 0x43e, 0x432, 0x435, 0x301, 0x43d, 0x441,
+0x43a, 0x457, 0x439, 0x440, 0x461, 0x441, 0x441, 0x456, 0x301, 0x430, 0x447, 0x4d1,
+0x432, 0x430, 0x448, 0x420, 0x430, 0x4ab, 0x4ab, 0x435, 0x439, 0x4b, 0xf6, 0x6c,
+0x73, 0x63, 0x68, 0x44, 0x6f, 0xfc, 0x74, 0x73, 0x63, 0x68, 0x6c, 0x61,
+0x6e, 0x64, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x77, 0x65, 0x6b, 0x52, 0x79,
+0x77, 0x76, 0x61, 0x6e, 0x65, 0x74, 0x68, 0x20, 0x55, 0x6e, 0x79, 0x73,
+0x63, 0x6f, 0x72, 0x73, 0x75, 0x46, 0x72, 0x61, 0x6e, 0x63, 0x69, 0x61,
+0x68, 0x72, 0x76, 0x61, 0x74, 0x73, 0x6b, 0x69, 0x48, 0x72, 0x76, 0x61,
+0x74, 0x73, 0x6b, 0x61, 0x10d, 0x65, 0x161, 0x74, 0x69, 0x6e, 0x61, 0x10c,
+0x65, 0x73, 0x6b, 0x6f, 0x64, 0x61, 0x6e, 0x73, 0x6b, 0x44, 0x61, 0x6e,
+0x6d, 0x61, 0x72, 0x6b, 0x47, 0x72, 0xf8, 0x6e, 0x6c, 0x61, 0x6e, 0x64,
+0x78b, 0x7a8, 0x788, 0x7ac, 0x780, 0x7a8, 0x784, 0x7a6, 0x790, 0x7b0, 0x78b, 0x7a8,
+0x788, 0x7ac, 0x780, 0x7a8, 0x20, 0x783, 0x7a7, 0x787, 0x7b0, 0x796, 0x7ac, 0x921,
+0x94b, 0x917, 0x930, 0x940, 0x64, 0x75, 0xe1, 0x6c, 0xe1, 0x43, 0x61, 0x6d,
+0x65, 0x72, 0x6f, 0x75, 0x6e, 0x4e, 0x65, 0x64, 0x65, 0x72, 0x6c, 0x61,
+0x6e, 0x64, 0x73, 0x41, 0x72, 0x75, 0x62, 0x61, 0x56, 0x6c, 0x61, 0x61,
+0x6d, 0x73, 0x42, 0x65, 0x6c, 0x67, 0x69, 0xeb, 0x43, 0x61, 0x72, 0x69,
+0x62, 0x69, 0x73, 0x63, 0x68, 0x20, 0x4e, 0x65, 0x64, 0x65, 0x72, 0x6c,
+0x61, 0x6e, 0x64, 0x43, 0x75, 0x72, 0x61, 0xe7, 0x61, 0x6f, 0x53, 0x69,
+0x6e, 0x74, 0x2d, 0x4d, 0x61, 0x61, 0x72, 0x74, 0x65, 0x6e, 0x53, 0x75,
+0x72, 0x69, 0x6e, 0x61, 0x6d, 0x65, 0xf62, 0xfab, 0xf7c, 0xf44, 0xf0b, 0xf41,
+0xf60, 0xf56, 0xfb2, 0xf74, 0xf42, 0x4b, 0x129, 0x65, 0x6d, 0x62, 0x75, 0x4b,
+0x65, 0x6e, 0x79, 0x61, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6e,
+0x20, 0x45, 0x6e, 0x67, 0x6c, 0x69, 0x73, 0x68, 0xd801, 0xdc00, 0xd801, 0xdc4d,
+0xd801, 0xdc4a, 0xd801, 0xdc2e, 0xd801, 0xdc47, 0xd801, 0xdc0f, 0xd801, 0xdc2d, 0xd801, 0xdc4c,
+0xd801, 0xdc34, 0xd801, 0xdc3b, 0xd801, 0xdc32, 0xd801, 0xdc3c, 0x20, 0xd801, 0xdc1d, 0xd801,
+0xdc3b, 0xd801, 0xdc29, 0xd801, 0xdc3b, 0xd801, 0xdc45, 0x41, 0x6d, 0x65, 0x72, 0x69,
+0x63, 0x61, 0x6e, 0x20, 0x53, 0x61, 0x6d, 0x6f, 0x61, 0x41, 0x6e, 0x67,
+0x75, 0x69, 0x6c, 0x6c, 0x61, 0x41, 0x6e, 0x74, 0x69, 0x67, 0x75, 0x61,
+0x20, 0x26, 0x20, 0x42, 0x61, 0x72, 0x62, 0x75, 0x64, 0x61, 0x41, 0x75,
+0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x6e, 0x20, 0x45, 0x6e, 0x67,
+0x6c, 0x69, 0x73, 0x68, 0x41, 0x75, 0x73, 0x74, 0x72, 0x69, 0x61, 0x42,
+0x61, 0x68, 0x61, 0x6d, 0x61, 0x73, 0x42, 0x61, 0x72, 0x62, 0x61, 0x64,
+0x6f, 0x73, 0x42, 0x65, 0x6c, 0x67, 0x69, 0x75, 0x6d, 0x42, 0x65, 0x6c,
+0x69, 0x7a, 0x65, 0x42, 0x65, 0x72, 0x6d, 0x75, 0x64, 0x61, 0x42, 0x6f,
+0x74, 0x73, 0x77, 0x61, 0x6e, 0x61, 0x42, 0x72, 0x69, 0x74, 0x69, 0x73,
+0x68, 0x20, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x4f, 0x63, 0x65,
+0x61, 0x6e, 0x20, 0x54, 0x65, 0x72, 0x72, 0x69, 0x74, 0x6f, 0x72, 0x79,
+0x42, 0x72, 0x69, 0x74, 0x69, 0x73, 0x68, 0x20, 0x56, 0x69, 0x72, 0x67,
+0x69, 0x6e, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x42, 0x75,
+0x72, 0x75, 0x6e, 0x64, 0x69, 0x43, 0x61, 0x6d, 0x65, 0x72, 0x6f, 0x6f,
+0x6e, 0x43, 0x61, 0x6e, 0x61, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x45, 0x6e,
+0x67, 0x6c, 0x69, 0x73, 0x68, 0x43, 0x61, 0x6e, 0x61, 0x64, 0x61, 0x43,
+0x61, 0x79, 0x6d, 0x61, 0x6e, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64,
+0x73, 0x43, 0x68, 0x72, 0x69, 0x73, 0x74, 0x6d, 0x61, 0x73, 0x20, 0x49,
+0x73, 0x6c, 0x61, 0x6e, 0x64, 0x43, 0x6f, 0x63, 0x6f, 0x73, 0x20, 0x28,
+0x4b, 0x65, 0x65, 0x6c, 0x69, 0x6e, 0x67, 0x29, 0x20, 0x49, 0x73, 0x6c,
+0x61, 0x6e, 0x64, 0x73, 0x43, 0x6f, 0x6f, 0x6b, 0x20, 0x49, 0x73, 0x6c,
+0x61, 0x6e, 0x64, 0x73, 0x43, 0x79, 0x70, 0x72, 0x75, 0x73, 0x44, 0x65,
+0x6e, 0x6d, 0x61, 0x72, 0x6b, 0x44, 0x69, 0x65, 0x67, 0x6f, 0x20, 0x47,
+0x61, 0x72, 0x63, 0x69, 0x61, 0x44, 0x6f, 0x6d, 0x69, 0x6e, 0x69, 0x63,
+0x61, 0x45, 0x72, 0x69, 0x74, 0x72, 0x65, 0x61, 0x45, 0x73, 0x77, 0x61,
+0x74, 0x69, 0x6e, 0x69, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x46, 0x61,
+0x6c, 0x6b, 0x6c, 0x61, 0x6e, 0x64, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e,
+0x64, 0x73, 0x46, 0x69, 0x6a, 0x69, 0x46, 0x69, 0x6e, 0x6c, 0x61, 0x6e,
+0x64, 0x47, 0x61, 0x6d, 0x62, 0x69, 0x61, 0x47, 0x65, 0x72, 0x6d, 0x61,
+0x6e, 0x79, 0x47, 0x68, 0x61, 0x6e, 0x61, 0x47, 0x69, 0x62, 0x72, 0x61,
+0x6c, 0x74, 0x61, 0x72, 0x47, 0x72, 0x65, 0x6e, 0x61, 0x64, 0x61, 0x47,
+0x75, 0x61, 0x6d, 0x47, 0x75, 0x65, 0x72, 0x6e, 0x73, 0x65, 0x79, 0x47,
+0x75, 0x79, 0x61, 0x6e, 0x61, 0x48, 0x6f, 0x6e, 0x67, 0x20, 0x4b, 0x6f,
+0x6e, 0x67, 0x20, 0x53, 0x41, 0x52, 0x20, 0x43, 0x68, 0x69, 0x6e, 0x61,
+0x49, 0x6e, 0x64, 0x6f, 0x6e, 0x65, 0x73, 0x69, 0x61, 0x49, 0x72, 0x65,
+0x6c, 0x61, 0x6e, 0x64, 0x49, 0x73, 0x6c, 0x65, 0x20, 0x6f, 0x66, 0x20,
+0x4d, 0x61, 0x6e, 0x49, 0x73, 0x72, 0x61, 0x65, 0x6c, 0x4a, 0x61, 0x6d,
+0x61, 0x69, 0x63, 0x61, 0x4a, 0x65, 0x72, 0x73, 0x65, 0x79, 0x4b, 0x69,
+0x72, 0x69, 0x62, 0x61, 0x74, 0x69, 0x4c, 0x65, 0x73, 0x6f, 0x74, 0x68,
+0x6f, 0x4c, 0x69, 0x62, 0x65, 0x72, 0x69, 0x61, 0x4d, 0x61, 0x63, 0x61,
+0x6f, 0x20, 0x53, 0x41, 0x52, 0x20, 0x43, 0x68, 0x69, 0x6e, 0x61, 0x4d,
+0x61, 0x64, 0x61, 0x67, 0x61, 0x73, 0x63, 0x61, 0x72, 0x4d, 0x61, 0x6c,
+0x61, 0x77, 0x69, 0x4d, 0x61, 0x6c, 0x61, 0x79, 0x73, 0x69, 0x61, 0x4d,
+0x61, 0x6c, 0x64, 0x69, 0x76, 0x65, 0x73, 0x4d, 0x61, 0x6c, 0x74, 0x61,
+0x4d, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, 0x6c, 0x20, 0x49, 0x73, 0x6c,
+0x61, 0x6e, 0x64, 0x73, 0x4d, 0x61, 0x75, 0x72, 0x69, 0x74, 0x69, 0x75,
+0x73, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x6e, 0x65, 0x73, 0x69, 0x61, 0x4d,
+0x6f, 0x6e, 0x74, 0x73, 0x65, 0x72, 0x72, 0x61, 0x74, 0x4e, 0x61, 0x6d,
+0x69, 0x62, 0x69, 0x61, 0x4e, 0x61, 0x75, 0x72, 0x75, 0x4e, 0x65, 0x74,
+0x68, 0x65, 0x72, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x4e, 0x65, 0x77, 0x20,
+0x5a, 0x65, 0x61, 0x6c, 0x61, 0x6e, 0x64, 0x4e, 0x69, 0x67, 0x65, 0x72,
+0x69, 0x61, 0x4e, 0x69, 0x75, 0x65, 0x4e, 0x6f, 0x72, 0x66, 0x6f, 0x6c,
+0x6b, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x4e, 0x6f, 0x72, 0x74,
+0x68, 0x65, 0x72, 0x6e, 0x20, 0x4d, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x61,
+0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x50, 0x61, 0x6b, 0x69,
+0x73, 0x74, 0x61, 0x6e, 0x50, 0x61, 0x6c, 0x61, 0x75, 0x50, 0x61, 0x70,
+0x75, 0x61, 0x20, 0x4e, 0x65, 0x77, 0x20, 0x47, 0x75, 0x69, 0x6e, 0x65,
+0x61, 0x50, 0x68, 0x69, 0x6c, 0x69, 0x70, 0x70, 0x69, 0x6e, 0x65, 0x73,
+0x50, 0x69, 0x74, 0x63, 0x61, 0x69, 0x72, 0x6e, 0x20, 0x49, 0x73, 0x6c,
+0x61, 0x6e, 0x64, 0x73, 0x50, 0x75, 0x65, 0x72, 0x74, 0x6f, 0x20, 0x52,
+0x69, 0x63, 0x6f, 0x52, 0x77, 0x61, 0x6e, 0x64, 0x61, 0x53, 0x74, 0x20,
+0x48, 0x65, 0x6c, 0x65, 0x6e, 0x61, 0x53, 0x74, 0x20, 0x4b, 0x69, 0x74,
+0x74, 0x73, 0x20, 0x26, 0x20, 0x4e, 0x65, 0x76, 0x69, 0x73, 0x53, 0x74,
+0x20, 0x4c, 0x75, 0x63, 0x69, 0x61, 0x53, 0x74, 0x20, 0x56, 0x69, 0x6e,
+0x63, 0x65, 0x6e, 0x74, 0x20, 0x26, 0x20, 0x74, 0x68, 0x65, 0x20, 0x47,
+0x72, 0x65, 0x6e, 0x61, 0x64, 0x69, 0x6e, 0x65, 0x73, 0x53, 0x65, 0x79,
+0x63, 0x68, 0x65, 0x6c, 0x6c, 0x65, 0x73, 0x53, 0x69, 0x65, 0x72, 0x72,
+0x61, 0x20, 0x4c, 0x65, 0x6f, 0x6e, 0x65, 0x53, 0x69, 0x6e, 0x67, 0x61,
+0x70, 0x6f, 0x72, 0x65, 0x53, 0x69, 0x6e, 0x74, 0x20, 0x4d, 0x61, 0x61,
+0x72, 0x74, 0x65, 0x6e, 0x53, 0x6c, 0x6f, 0x76, 0x65, 0x6e, 0x69, 0x61,
+0x53, 0x6f, 0x6c, 0x6f, 0x6d, 0x6f, 0x6e, 0x20, 0x49, 0x73, 0x6c, 0x61,
+0x6e, 0x64, 0x73, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x20, 0x41, 0x66, 0x72,
+0x69, 0x63, 0x61, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x20, 0x53, 0x75, 0x64,
+0x61, 0x6e, 0x53, 0x75, 0x64, 0x61, 0x6e, 0x53, 0x77, 0x65, 0x64, 0x65,
+0x6e, 0x53, 0x77, 0x69, 0x74, 0x7a, 0x65, 0x72, 0x6c, 0x61, 0x6e, 0x64,
+0x54, 0x61, 0x6e, 0x7a, 0x61, 0x6e, 0x69, 0x61, 0x54, 0x6f, 0x6b, 0x65,
+0x6c, 0x61, 0x75, 0x54, 0x6f, 0x6e, 0x67, 0x61, 0x54, 0x72, 0x69, 0x6e,
+0x69, 0x64, 0x61, 0x64, 0x20, 0x26, 0x20, 0x54, 0x6f, 0x62, 0x61, 0x67,
+0x6f, 0x54, 0x75, 0x72, 0x6b, 0x73, 0x20, 0x26, 0x20, 0x43, 0x61, 0x69,
+0x63, 0x6f, 0x73, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x54,
+0x75, 0x76, 0x61, 0x6c, 0x75, 0x55, 0x6e, 0x69, 0x74, 0x65, 0x64, 0x20,
+0x41, 0x72, 0x61, 0x62, 0x20, 0x45, 0x6d, 0x69, 0x72, 0x61, 0x74, 0x65,
+0x73, 0x42, 0x72, 0x69, 0x74, 0x69, 0x73, 0x68, 0x20, 0x45, 0x6e, 0x67,
+0x6c, 0x69, 0x73, 0x68, 0x55, 0x6e, 0x69, 0x74, 0x65, 0x64, 0x20, 0x4b,
+0x69, 0x6e, 0x67, 0x64, 0x6f, 0x6d, 0x55, 0x2e, 0x53, 0x2e, 0x20, 0x4f,
+0x75, 0x74, 0x6c, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x49, 0x73, 0x6c, 0x61,
+0x6e, 0x64, 0x73, 0x55, 0x2e, 0x53, 0x2e, 0x20, 0x56, 0x69, 0x72, 0x67,
+0x69, 0x6e, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x56, 0x61,
+0x6e, 0x75, 0x61, 0x74, 0x75, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x5a, 0x69,
+0x6d, 0x62, 0x61, 0x62, 0x77, 0x65, 0x44d, 0x440, 0x437, 0x44f, 0x43d, 0x44c,
+0x20, 0x43a, 0x435, 0x43b, 0x44c, 0x420, 0x443, 0x437, 0x43e, 0x43d, 0x44c, 0x20,
+0x43c, 0x430, 0x441, 0x442, 0x43e, 0x440, 0x45, 0x73, 0x70, 0x65, 0x72, 0x61,
+0x6e, 0x74, 0x6f, 0x6d, 0x6f, 0x6e, 0x64, 0x6f, 0x65, 0x65, 0x73, 0x74,
+0x69, 0x45, 0x65, 0x73, 0x74, 0x69, 0x45, 0x28b, 0x65, 0x67, 0x62, 0x65,
+0x47, 0x68, 0x61, 0x6e, 0x61, 0x20, 0x6e, 0x75, 0x74, 0x6f, 0x6d, 0x65,
+0x54, 0x6f, 0x67, 0x6f, 0x20, 0x6e, 0x75, 0x74, 0x6f, 0x6d, 0x65, 0x65,
+0x77, 0x6f, 0x6e, 0x64, 0x6f, 0x4b, 0x61, 0x6d, 0x259, 0x72, 0xfa, 0x6e,
+0x66, 0xf8, 0x72, 0x6f, 0x79, 0x73, 0x6b, 0x74, 0x46, 0xf8, 0x72, 0x6f,
+0x79, 0x61, 0x72, 0x46, 0x69, 0x6c, 0x69, 0x70, 0x69, 0x6e, 0x6f, 0x73,
+0x75, 0x6f, 0x6d, 0x69, 0x53, 0x75, 0x6f, 0x6d, 0x69, 0x66, 0x72, 0x61,
+0x6e, 0xe7, 0x61, 0x69, 0x73, 0x46, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x41,
+0x6c, 0x67, 0xe9, 0x72, 0x69, 0x65, 0x42, 0x65, 0x6c, 0x67, 0x69, 0x71,
+0x75, 0x65, 0x42, 0xe9, 0x6e, 0x69, 0x6e, 0x42, 0x75, 0x72, 0x6b, 0x69,
+0x6e, 0x61, 0x20, 0x46, 0x61, 0x73, 0x6f, 0x66, 0x72, 0x61, 0x6e, 0xe7,
+0x61, 0x69, 0x73, 0x20, 0x63, 0x61, 0x6e, 0x61, 0x64, 0x69, 0x65, 0x6e,
+0x52, 0xe9, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x71, 0x75, 0x65, 0x20, 0x63,
+0x65, 0x6e, 0x74, 0x72, 0x61, 0x66, 0x72, 0x69, 0x63, 0x61, 0x69, 0x6e,
+0x65, 0x54, 0x63, 0x68, 0x61, 0x64, 0x43, 0x6f, 0x6d, 0x6f, 0x72, 0x65,
+0x73, 0x43, 0x6f, 0x6e, 0x67, 0x6f, 0x2d, 0x42, 0x72, 0x61, 0x7a, 0x7a,
+0x61, 0x76, 0x69, 0x6c, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x67, 0x6f, 0x2d,
+0x4b, 0x69, 0x6e, 0x73, 0x68, 0x61, 0x73, 0x61, 0x44, 0x6a, 0x69, 0x62,
+0x6f, 0x75, 0x74, 0x69, 0x47, 0x75, 0x69, 0x6e, 0xe9, 0x65, 0x20, 0xe9,
+0x71, 0x75, 0x61, 0x74, 0x6f, 0x72, 0x69, 0x61, 0x6c, 0x65, 0x47, 0x75,
+0x79, 0x61, 0x6e, 0x65, 0x20, 0x66, 0x72, 0x61, 0x6e, 0xe7, 0x61, 0x69,
+0x73, 0x65, 0x50, 0x6f, 0x6c, 0x79, 0x6e, 0xe9, 0x73, 0x69, 0x65, 0x20,
+0x66, 0x72, 0x61, 0x6e, 0xe7, 0x61, 0x69, 0x73, 0x65, 0x47, 0x61, 0x62,
+0x6f, 0x6e, 0x47, 0x75, 0x61, 0x64, 0x65, 0x6c, 0x6f, 0x75, 0x70, 0x65,
+0x48, 0x61, 0xef, 0x74, 0x69, 0x43, 0xf4, 0x74, 0x65, 0x20, 0x64, 0x2019,
+0x49, 0x76, 0x6f, 0x69, 0x72, 0x65, 0x4c, 0x75, 0x78, 0x65, 0x6d, 0x62,
+0x6f, 0x75, 0x72, 0x67, 0x4d, 0x61, 0x72, 0x74, 0x69, 0x6e, 0x69, 0x71,
+0x75, 0x65, 0x4d, 0x61, 0x75, 0x72, 0x69, 0x74, 0x61, 0x6e, 0x69, 0x65,
+0x4d, 0x61, 0x75, 0x72, 0x69, 0x63, 0x65, 0x4d, 0x61, 0x79, 0x6f, 0x74,
+0x74, 0x65, 0x4d, 0x6f, 0x6e, 0x61, 0x63, 0x6f, 0x4d, 0x61, 0x72, 0x6f,
+0x63, 0x4e, 0x6f, 0x75, 0x76, 0x65, 0x6c, 0x6c, 0x65, 0x2d, 0x43, 0x61,
+0x6c, 0xe9, 0x64, 0x6f, 0x6e, 0x69, 0x65, 0x4c, 0x61, 0x20, 0x52, 0xe9,
+0x75, 0x6e, 0x69, 0x6f, 0x6e, 0x53, 0x61, 0x69, 0x6e, 0x74, 0x2d, 0x42,
+0x61, 0x72, 0x74, 0x68, 0xe9, 0x6c, 0x65, 0x6d, 0x79, 0x53, 0x61, 0x69,
+0x6e, 0x74, 0x2d, 0x4d, 0x61, 0x72, 0x74, 0x69, 0x6e, 0x53, 0x61, 0x69,
+0x6e, 0x74, 0x2d, 0x50, 0x69, 0x65, 0x72, 0x72, 0x65, 0x2d, 0x65, 0x74,
+0x2d, 0x4d, 0x69, 0x71, 0x75, 0x65, 0x6c, 0x6f, 0x6e, 0x53, 0xe9, 0x6e,
+0xe9, 0x67, 0x61, 0x6c, 0x66, 0x72, 0x61, 0x6e, 0xe7, 0x61, 0x69, 0x73,
+0x20, 0x73, 0x75, 0x69, 0x73, 0x73, 0x65, 0x53, 0x75, 0x69, 0x73, 0x73,
+0x65, 0x53, 0x79, 0x72, 0x69, 0x65, 0x54, 0x75, 0x6e, 0x69, 0x73, 0x69,
+0x65, 0x57, 0x61, 0x6c, 0x6c, 0x69, 0x73, 0x2d, 0x65, 0x74, 0x2d, 0x46,
+0x75, 0x74, 0x75, 0x6e, 0x61, 0x66, 0x75, 0x72, 0x6c, 0x61, 0x6e, 0x49,
+0x74, 0x61, 0x6c, 0x69, 0x65, 0x50, 0x75, 0x6c, 0x61, 0x61, 0x72, 0x53,
+0x65, 0x6e, 0x65, 0x67, 0x61, 0x61, 0x6c, 0xd83a, 0xdd06, 0xd83a, 0xdd35, 0xd83a,
+0xdd24, 0xd83a, 0xdd22, 0xd83a, 0xdd2a, 0xd83a, 0xdd04, 0xd83a, 0xdd35, 0xd83a, 0xdd2a, 0xd83a,
+0xdd33, 0xd83a, 0xdd2d, 0xd83a, 0xdd32, 0xd83a, 0xdd22, 0x20, 0xd83a, 0xdd0a, 0xd83a, 0xdd22,
+0xd83a, 0xdd27, 0xd83a, 0xdd2e, 0xd83a, 0xdd45, 0xd83a, 0xdd11, 0xd83a, 0xdd22, 0xd83a, 0xdd25,
+0xd83a, 0xdd22, 0xd83a, 0xdd2a, 0xd83a, 0xdd35, 0xd83a, 0xdd45, 0xd83a, 0xdd32, 0xd83a, 0xdd18,
+0xd83a, 0xdd22, 0xd83a, 0xdd25, 0xd83a, 0xdd26, 0xd83a, 0xdd2d, 0xd83a, 0xdd34, 0xd83a, 0xdd22,
+0xd83a, 0xdd18, 0xd83a, 0xdd22, 0xd83a, 0xdd32, 0xd83a, 0xdd22, 0xd83a, 0xdd18, 0xd83a, 0xdd2d,
+0xd83a, 0xdd32, 0xd83a, 0xdd2b, 0x2d, 0xd83a, 0xdd04, 0xd83a, 0xdd2d, 0xd83a, 0xdd27, 0xd83a,
+0xdd22, 0xd83a, 0xdd31, 0xd83a, 0xdd2e, 0xd83a, 0xdd45, 0xd83a, 0xdd02, 0xd83a, 0xdd22, 0xd83a,
+0xdd26, 0xd83a, 0xdd2d, 0xd83a, 0xdd2a, 0xd83a, 0xdd2d, 0xd83a, 0xdd34, 0xd83a, 0xdd22, 0xd83a,
+0xdd44, 0xd83a, 0xdd03, 0xd83a, 0xdd2e, 0xd83a, 0xdd2a, 0xd83a, 0xdd3c, 0xd83a, 0xdd22, 0xd83a,
+0xdd32, 0xd83a, 0xdd2d, 0xd83a, 0xdd45, 0xd83a, 0xdd10, 0xd83a, 0xdd22, 0xd83a, 0xdd36, 0xd83a,
+0xdd2b, 0xd83a, 0xdd2a, 0xd83a, 0xdd2d, 0xd83a, 0xdd34, 0xd83a, 0xdd22, 0xd83a, 0xdd44, 0xd83a,
+0xdd10, 0xd83a, 0xdd2d, 0xd83a, 0xdd45, 0xd83a, 0xdd36, 0xd83a, 0xdd2b, 0xd83a, 0xdd2a, 0xd83a,
+0xdd05, 0xd83a, 0xdd2b, 0xd83a, 0xdd32, 0xd83a, 0xdd2b, 0xd83a, 0xdd3a, 0xd83a, 0xdd22, 0xd83a,
+0xdd44, 0xd83a, 0xdd24, 0xd83a, 0xdd05, 0xd83a, 0xdd22, 0xd83a, 0xdd2a, 0xd83a, 0xdd22, 0xd83a,
+0xdd24, 0xd83a, 0xdd2e, 0xd83a, 0xdd32, 0x42, 0x75, 0x72, 0x6b, 0x69, 0x62, 0x61,
+0x61, 0x20, 0x46, 0x61, 0x61, 0x73, 0x6f, 0x4b, 0x61, 0x6d, 0x65, 0x72,
+0x75, 0x75, 0x6e, 0x47, 0x61, 0x6d, 0x6d, 0x62, 0x69, 0x47, 0x61, 0x6e,
+0x61, 0x61, 0x47, 0x69, 0x6e, 0x65, 0x2d, 0x42, 0x69, 0x73, 0x61, 0x61,
+0x77, 0x6f, 0x4c, 0x69, 0x62, 0x65, 0x72, 0x69, 0x79, 0x61, 0x61, 0x4d,
+0x75, 0x72, 0x69, 0x74, 0x61, 0x6e, 0x69, 0x4e, 0x69, 0x6a, 0x65, 0x72,
+0x69, 0x79, 0x61, 0x61, 0x4e, 0x69, 0x6a, 0x65, 0x65, 0x72, 0x53, 0x65,
+0x72, 0x61, 0x61, 0x20, 0x6c, 0x69, 0x79, 0x6f, 0x6e, 0x47, 0xe0, 0x69,
+0x64, 0x68, 0x6c, 0x69, 0x67, 0x41, 0x6e, 0x20, 0x52, 0xec, 0x6f, 0x67,
+0x68, 0x61, 0x63, 0x68, 0x64, 0x20, 0x41, 0x6f, 0x6e, 0x61, 0x69, 0x63,
+0x68, 0x74, 0x65, 0x47, 0xe3, 0x67, 0x61, 0x6c, 0x65, 0x67, 0x6f, 0x4c,
+0x75, 0x67, 0x61, 0x6e, 0x64, 0x61, 0x59, 0x75, 0x67, 0x61, 0x6e, 0x64,
+0x61, 0x130d, 0x12d5, 0x12dd, 0x129b, 0x10e5, 0x10d0, 0x10e0, 0x10d7, 0x10e3, 0x10da, 0x10d8,
+0x10e1, 0x10d0, 0x10e5, 0x10d0, 0x10e0, 0x10d7, 0x10d5, 0x10d4, 0x10da, 0x10dd, 0x44, 0x65,
+0x75, 0x74, 0x73, 0x63, 0x68, 0x44, 0x65, 0x75, 0x74, 0x73, 0x63, 0x68,
+0x6c, 0x61, 0x6e, 0x64, 0xd6, 0x73, 0x74, 0x65, 0x72, 0x72, 0x65, 0x69,
+0x63, 0x68, 0x69, 0x73, 0x63, 0x68, 0x65, 0x73, 0x20, 0x44, 0x65, 0x75,
+0x74, 0x73, 0x63, 0x68, 0x42, 0x65, 0x6c, 0x67, 0x69, 0x65, 0x6e, 0x49,
+0x74, 0x61, 0x6c, 0x69, 0x65, 0x6e, 0x4c, 0x69, 0x65, 0x63, 0x68, 0x74,
+0x65, 0x6e, 0x73, 0x74, 0x65, 0x69, 0x6e, 0x4c, 0x75, 0x78, 0x65, 0x6d,
+0x62, 0x75, 0x72, 0x67, 0x53, 0x63, 0x68, 0x77, 0x65, 0x69, 0x7a, 0x65,
+0x72, 0x20, 0x48, 0x6f, 0x63, 0x68, 0x64, 0x65, 0x75, 0x74, 0x73, 0x63,
+0x68, 0x395, 0x3bb, 0x3bb, 0x3b7, 0x3bd, 0x3b9, 0x3ba, 0x3ac, 0x395, 0x3bb, 0x3bb,
+0x3ac, 0x3b4, 0x3b1, 0x39a, 0x3cd, 0x3c0, 0x3c1, 0x3bf, 0x3c2, 0x61, 0x76, 0x61,
+0xf1, 0x65, 0x2019, 0x1ebd, 0x50, 0x61, 0x72, 0x61, 0x67, 0x75, 0x61, 0x69,
+0xa97, 0xac1, 0xa9c, 0xab0, 0xabe, 0xaa4, 0xac0, 0xaad, 0xabe, 0xab0, 0xaa4, 0x45,
+0x6b, 0x65, 0x67, 0x75, 0x73, 0x69, 0x69, 0x48, 0x61, 0x75, 0x73, 0x61,
+0x4e, 0x69, 0x6a, 0x61, 0x72, 0x2bb, 0x14c, 0x6c, 0x65, 0x6c, 0x6f, 0x20,
+0x48, 0x61, 0x77, 0x61, 0x69, 0x2bb, 0x69, 0x2bb, 0x41, 0x6d, 0x65, 0x6c,
+0x69, 0x6b, 0x61, 0x20, 0x48, 0x75, 0x69, 0x20, 0x50, 0x16b, 0x20, 0x2bb,
+0x49, 0x61, 0x5e2, 0x5d1, 0x5e8, 0x5d9, 0x5ea, 0x5d9, 0x5e9, 0x5e8, 0x5d0, 0x5dc,
+0x939, 0x93f, 0x928, 0x94d, 0x926, 0x940, 0x48, 0x69, 0x6e, 0x64, 0x69, 0x20,
+0x28, 0x4c, 0x61, 0x74, 0x69, 0x6e, 0x29, 0x6d, 0x61, 0x67, 0x79, 0x61,
+0x72, 0x4d, 0x61, 0x67, 0x79, 0x61, 0x72, 0x6f, 0x72, 0x73, 0x7a, 0xe1,
+0x67, 0xed, 0x73, 0x6c, 0x65, 0x6e, 0x73, 0x6b, 0x61, 0xcd, 0x73, 0x6c,
+0x61, 0x6e, 0x64, 0x49, 0x64, 0x6f, 0x49, 0x67, 0x62, 0x6f, 0x4e, 0x61,
+0x1ecb, 0x6a, 0x1ecb, 0x72, 0x1ecb, 0x61, 0x61, 0x6e, 0x61, 0x72, 0xe2, 0x161,
+0x6b, 0x69, 0x65, 0x6c, 0xe2, 0x53, 0x75, 0x6f, 0x6d, 0xe2, 0x69, 0x6e,
+0x74, 0x65, 0x72, 0x6c, 0x69, 0x6e, 0x67, 0x75, 0x61, 0x4d, 0x75, 0x6e,
+0x64, 0x6f, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6c, 0x69, 0x6e, 0x67, 0x75,
+0x65, 0x45, 0x73, 0x74, 0x6f, 0x6e, 0x69, 0x61, 0x1403, 0x14c4, 0x1483, 0x144e,
+0x1450, 0x1466, 0x1472, 0x14c7, 0x1455, 0x14a5, 0x47, 0x61, 0x65, 0x69, 0x6c, 0x67,
+0x65, 0xc9, 0x69, 0x72, 0x65, 0x61, 0x6e, 0x20, 0x52, 0xed, 0x6f, 0x63,
+0x68, 0x74, 0x20, 0x41, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x74, 0x68, 0x65,
+0x69, 0x74, 0x61, 0x6c, 0x69, 0x61, 0x6e, 0x6f, 0x49, 0x74, 0x61, 0x6c,
+0x69, 0x61, 0x53, 0x61, 0x6e, 0x20, 0x4d, 0x61, 0x72, 0x69, 0x6e, 0x6f,
+0x53, 0x76, 0x69, 0x7a, 0x7a, 0x65, 0x72, 0x61, 0x43, 0x69, 0x74, 0x74,
+0xe0, 0x20, 0x64, 0x65, 0x6c, 0x20, 0x56, 0x61, 0x74, 0x69, 0x63, 0x61,
+0x6e, 0x6f, 0x65e5, 0x672c, 0x8a9e, 0x4a, 0x61, 0x77, 0x61, 0x49, 0x6e, 0x64,
+0x6f, 0x6e, 0xe9, 0x73, 0x69, 0x61, 0x4b, 0x61, 0x6a, 0x65, 0x6a, 0x6f,
+0x6f, 0x6c, 0x61, 0x53, 0x65, 0x6e, 0x65, 0x67, 0x61, 0x6c, 0x6b, 0x61,
+0x62, 0x75, 0x76, 0x65, 0x72, 0x64, 0x69, 0x61, 0x6e, 0x75, 0x4b, 0x61,
+0x62, 0x75, 0x20, 0x56, 0x65, 0x72, 0x64, 0x69, 0x54, 0x61, 0x71, 0x62,
+0x61, 0x79, 0x6c, 0x69, 0x74, 0x4c, 0x65, 0x7a, 0x7a, 0x61, 0x79, 0x65,
+0x72, 0x6b, 0x61, 0x6b, 0x254, 0x4b, 0x61, 0x6d, 0x25b, 0x72, 0x75, 0x6e,
+0x6b, 0x61, 0x6c, 0x61, 0x61, 0x6c, 0x6c, 0x69, 0x73, 0x75, 0x74, 0x4b,
+0x61, 0x6c, 0x61, 0x61, 0x6c, 0x6c, 0x69, 0x74, 0x20, 0x4e, 0x75, 0x6e,
+0x61, 0x61, 0x74, 0x4b, 0x61, 0x6c, 0x65, 0x6e, 0x6a, 0x69, 0x6e, 0x45,
+0x6d, 0x65, 0x74, 0x61, 0x62, 0x20, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x4b,
+0x69, 0x6b, 0x61, 0x6d, 0x62, 0x61, 0xc95, 0xca8, 0xccd, 0xca8, 0xca1, 0xcad,
+0xcbe, 0xcb0, 0xca4, 0x6a9, 0x672, 0x634, 0x64f, 0x631, 0x6c1, 0x650, 0x646, 0x62f,
+0x648, 0x633, 0x62a, 0x627, 0x646, 0x915, 0x949, 0x936, 0x941, 0x930, 0x939, 0x93f,
+0x902, 0x926, 0x94b, 0x938, 0x94d, 0x924, 0x93e, 0x928, 0x49b, 0x430, 0x437, 0x430,
+0x49b, 0x20, 0x442, 0x456, 0x43b, 0x456, 0x49a, 0x430, 0x437, 0x430, 0x49b, 0x441,
+0x442, 0x430, 0x43d, 0x4b, 0x25b, 0x6e, 0x79, 0x61, 0x14b, 0x1781, 0x17d2, 0x1798,
+0x17c2, 0x179a, 0x1780, 0x1798, 0x17d2, 0x1796, 0x17bb, 0x1787, 0x17b6, 0x4b, 0x2bc, 0x69,
+0x63, 0x68, 0x65, 0x2bc, 0x47, 0x69, 0x6b, 0x75, 0x79, 0x75, 0x4b, 0x69,
+0x6e, 0x79, 0x61, 0x72, 0x77, 0x61, 0x6e, 0x64, 0x61, 0x55, 0x20, 0x52,
+0x77, 0x61, 0x6e, 0x64, 0x61, 0x915, 0x94b, 0x902, 0x915, 0x923, 0x940, 0xd55c,
+0xad6d, 0xc5b4, 0xb300, 0xd55c, 0xbbfc, 0xad6d, 0xc911, 0xad6d, 0xc870, 0xc120, 0xbbfc, 0xc8fc,
+0xc8fc, 0xc758, 0xc778, 0xbbfc, 0xacf5, 0xd654, 0xad6d, 0x4b, 0x6f, 0x79, 0x72, 0x61,
+0x62, 0x6f, 0x72, 0x6f, 0x20, 0x73, 0x65, 0x6e, 0x6e, 0x69, 0x4d, 0x61,
+0x61, 0x6c, 0x69, 0x4b, 0x6f, 0x79, 0x72, 0x61, 0x20, 0x63, 0x69, 0x69,
+0x6e, 0x69, 0x4b, 0x70, 0x25b, 0x6c, 0x25b, 0x25b, 0x6b, 0x75, 0x72, 0x64,
+0xee, 0x20, 0x28, 0x6b, 0x75, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0xee, 0x29,
+0x54, 0x69, 0x72, 0x6b, 0x69, 0x79, 0x65, 0x4b, 0x77, 0x61, 0x73, 0x69,
+0x6f, 0x4b, 0x61, 0x6d, 0x65, 0x72, 0x75, 0x6e, 0x43a, 0x44b, 0x440, 0x433,
+0x44b, 0x437, 0x447, 0x430, 0x41a, 0x44b, 0x440, 0x433, 0x44b, 0x437, 0x441, 0x442,
+0x430, 0x43d, 0x4c, 0x61, 0x6b, 0x21f, 0xf3, 0x6c, 0x2bc, 0x69, 0x79, 0x61,
+0x70, 0x69, 0x4d, 0xed, 0x6c, 0x61, 0x68, 0x61, 0x14b, 0x73, 0x6b, 0x61,
+0x20, 0x54, 0x21f, 0x61, 0x6d, 0xe1, 0x6b, 0x21f, 0x6f, 0x10d, 0x68, 0x65,
+0x4b, 0x268, 0x6c, 0x61, 0x61, 0x6e, 0x67, 0x69, 0x54, 0x61, 0x61, 0x6e,
+0x73, 0x61, 0x6e, 0xed, 0x61, 0xea5, 0xeb2, 0xea7, 0x4c, 0x61, 0x74, 0x69,
+0x6e, 0x61, 0x43, 0x69, 0x76, 0x69, 0x74, 0x61, 0x73, 0x20, 0x56, 0x61,
+0x74, 0x69, 0x63, 0x61, 0x6e, 0x61, 0x6c, 0x61, 0x74, 0x76, 0x69, 0x65,
+0x161, 0x75, 0x4c, 0x61, 0x74, 0x76, 0x69, 0x6a, 0x61, 0x6c, 0x69, 0x6e,
+0x67, 0xe1, 0x6c, 0x61, 0x52, 0x65, 0x70, 0x75, 0x62, 0x6c, 0xed, 0x6b,
+0x69, 0x20, 0x79, 0x61, 0x20, 0x4b, 0x6f, 0x6e, 0x67, 0xf3, 0x20, 0x44,
+0x65, 0x6d, 0x6f, 0x6b, 0x72, 0x61, 0x74, 0xed, 0x6b, 0x69, 0x41, 0x6e,
+0x67, 0xf3, 0x6c, 0x61, 0x52, 0x65, 0x70, 0x69, 0x62, 0x69, 0x6b, 0x69,
+0x20, 0x79, 0x61, 0x20, 0x41, 0x66, 0x72, 0xed, 0x6b, 0x61, 0x20, 0x79,
+0x61, 0x20, 0x4b, 0xe1, 0x74, 0x69, 0x4b, 0x6f, 0x6e, 0x67, 0x6f, 0x6c,
+0x69, 0x65, 0x74, 0x75, 0x76, 0x69, 0x173, 0x4c, 0x69, 0x65, 0x74, 0x75,
+0x76, 0x61, 0x6c, 0x61, 0x20, 0x2e, 0x6c, 0x6f, 0x6a, 0x62, 0x61, 0x6e,
+0x2e, 0x64, 0x6f, 0x6c, 0x6e, 0x6f, 0x73, 0x65, 0x72, 0x62, 0x161, 0x107,
+0x69, 0x6e, 0x61, 0x4e, 0x69, 0x6d, 0x73, 0x6b, 0x61, 0x4e, 0x65, 0x64,
+0x64, 0x65, 0x72, 0x73, 0x61, 0x73, 0x73, 0x2019, 0x73, 0x63, 0x68, 0x44,
+0xfc, 0xfc, 0x74, 0x73, 0x63, 0x68, 0x6c, 0x61, 0x6e, 0x64, 0x4e, 0x65,
+0x64, 0x64, 0x65, 0x72, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x6e, 0x54, 0x73,
+0x68, 0x69, 0x6c, 0x75, 0x62, 0x61, 0x44, 0x69, 0x74, 0x75, 0x6e, 0x67,
+0x61, 0x20, 0x77, 0x61, 0x20, 0x4b, 0x6f, 0x6e, 0x67, 0x75, 0x6a, 0x75,
+0x6c, 0x65, 0x76, 0x73, 0xe1, 0x6d, 0x65, 0x67, 0x69, 0x65, 0x6c, 0x6c,
+0x61, 0x44, 0x68, 0x6f, 0x6c, 0x75, 0x6f, 0x4c, 0xeb, 0x74, 0x7a, 0x65,
+0x62, 0x75, 0x65, 0x72, 0x67, 0x65, 0x73, 0x63, 0x68, 0x4c, 0x75, 0x6c,
+0x75, 0x68, 0x69, 0x61, 0x43c, 0x430, 0x43a, 0x435, 0x434, 0x43e, 0x43d, 0x441,
+0x43a, 0x438, 0x421, 0x435, 0x432, 0x435, 0x440, 0x43d, 0x430, 0x20, 0x41c, 0x430,
+0x43a, 0x435, 0x434, 0x43e, 0x43d, 0x438, 0x458, 0x430, 0x4b, 0x69, 0x6d, 0x61,
+0x63, 0x68, 0x61, 0x6d, 0x65, 0x92e, 0x948, 0x925, 0x93f, 0x932, 0x940, 0x4d,
+0x61, 0x6b, 0x75, 0x61, 0x55, 0x6d, 0x6f, 0x7a, 0x61, 0x6d, 0x62, 0x69,
+0x6b, 0x69, 0x43, 0x68, 0x69, 0x6d, 0x61, 0x6b, 0x6f, 0x6e, 0x64, 0x65,
+0x4d, 0x61, 0x6c, 0x61, 0x67, 0x61, 0x73, 0x79, 0x4d, 0x61, 0x64, 0x61,
+0x67, 0x61, 0x73, 0x69, 0x6b, 0x61, 0x72, 0x61, 0xd2e, 0xd32, 0xd2f, 0xd3e,
+0xd33, 0xd02, 0xd07, 0xd28, 0xd4d, 0xd24, 0xd4d, 0xd2f, 0x4d, 0x65, 0x6c, 0x61,
+0x79, 0x75, 0x628, 0x647, 0x627, 0x633, 0x20, 0x645, 0x644, 0x627, 0x64a, 0x648,
+0x628, 0x631, 0x648, 0x646, 0x64a, 0x645, 0x644, 0x64a, 0x633, 0x64a, 0x627, 0x42,
+0x72, 0x75, 0x6e, 0x65, 0x69, 0x53, 0x69, 0x6e, 0x67, 0x61, 0x70, 0x75,
+0x72, 0x61, 0x4d, 0x61, 0x6c, 0x74, 0x69, 0x9ae, 0x9c8, 0x9a4, 0x9c8, 0x9b2,
+0x9cb, 0x9a8, 0x9cd, 0x987, 0x9a8, 0x9cd, 0x9a6, 0x9bf, 0x9af, 0x9bc, 0x9be, 0xabc3,
+0xabe4, 0xabc7, 0xabe9, 0xabc2, 0xabe3, 0xabdf, 0x47, 0x61, 0x65, 0x6c, 0x67, 0x45,
+0x6c, 0x6c, 0x61, 0x6e, 0x20, 0x56, 0x61, 0x6e, 0x6e, 0x69, 0x6e, 0x4d,
+0x101, 0x6f, 0x72, 0x69, 0x41, 0x6f, 0x74, 0x65, 0x61, 0x72, 0x6f, 0x61,
+0x4d, 0x61, 0x70, 0x75, 0x64, 0x75, 0x6e, 0x67, 0x75, 0x6e, 0x92e, 0x930,
+0x93e, 0x920, 0x940, 0x54, 0x61, 0x6e, 0x73, 0x61, 0x6e, 0x69, 0x61, 0x645,
+0x627, 0x632, 0x631, 0x648, 0x646, 0x6cc, 0x627, 0x6cc, 0x631, 0x627, 0x646, 0x4b,
+0x129, 0x6d, 0x129, 0x72, 0x169, 0x6d, 0x65, 0x74, 0x61, 0x2bc, 0x4b, 0x61,
+0x6d, 0x61, 0x6c, 0x75, 0x6e, 0x4b, 0x61, 0x6e, 0x69, 0x65, 0x6e, 0x2bc,
+0x6b, 0xe9, 0x68, 0x61, 0x43c, 0x43e, 0x43d, 0x433, 0x43e, 0x43b, 0x41c, 0x43e,
+0x43d, 0x433, 0x43e, 0x43b, 0x182e, 0x1823, 0x1829, 0x182d, 0x1823, 0x182f, 0x6b, 0x72,
+0x65, 0x6f, 0x6c, 0x20, 0x6d, 0x6f, 0x72, 0x69, 0x73, 0x69, 0x65, 0x6e,
+0x4d, 0x6f, 0x72, 0x69, 0x73, 0x4d, 0x55, 0x4e, 0x44, 0x41, 0x14a, 0x6b,
+0x61, 0x6d, 0x65, 0x72, 0x75, 0x14b, 0x4d, 0x76, 0x73, 0x6b, 0x6f, 0x6b,
+0x65, 0x4b, 0x68, 0x6f, 0x65, 0x6b, 0x68, 0x6f, 0x65, 0x67, 0x6f, 0x77,
+0x61, 0x62, 0x4e, 0x61, 0x6d, 0x69, 0x62, 0x69, 0x61, 0x62, 0x44, 0x69,
+0x6e, 0xe9, 0x20, 0x42, 0x69, 0x7a, 0x61, 0x61, 0x64, 0x928, 0x947, 0x92a,
+0x93e, 0x932, 0x940, 0x53, 0x68, 0x77, 0xf3, 0x14b, 0xf2, 0x20, 0x6e, 0x67,
+0x69, 0x65, 0x6d, 0x62, 0x254, 0x254, 0x6e, 0x4b, 0xe0, 0x6d, 0x61, 0x6c,
+0xfb, 0x6d, 0x4e, 0x64, 0x61, 0xa78c, 0x61, 0x4b, 0x61, 0x6d, 0x25b, 0x6c,
+0xfb, 0x6e, 0x4e, 0x61, 0x69, 0x6a, 0xed, 0x72, 0x69, 0xe1, 0x20, 0x50,
+0xed, 0x6a, 0x69, 0x6e, 0x4e, 0x61, 0x69, 0x6a, 0xed, 0x72, 0x69, 0x61,
+0x7d2, 0x7de, 0x7cf, 0x7d6, 0x7cc, 0x7ec, 0x7e3, 0x7cd, 0x7eb, 0x644, 0x6ca, 0x631,
+0x6cc, 0x20, 0x634, 0x648, 0x645, 0x627, 0x644, 0x6cc, 0x64, 0x61, 0x76, 0x76,
+0x69, 0x73, 0xe1, 0x6d, 0x65, 0x67, 0x69, 0x65, 0x6c, 0x6c, 0x61, 0x4e,
+0x6f, 0x72, 0x67, 0x61, 0x53, 0x75, 0x6f, 0x70, 0x6d, 0x61, 0x52, 0x75,
+0x6f, 0x167, 0x167, 0x61, 0x53, 0x65, 0x73, 0x6f, 0x74, 0x68, 0x6f, 0x20,
+0x73, 0x61, 0x20, 0x4c, 0x65, 0x62, 0x6f, 0x61, 0x41, 0x66, 0x72, 0x69,
+0x6b, 0x61, 0x20, 0x42, 0x6f, 0x72, 0x77, 0x61, 0x69, 0x73, 0x69, 0x4e,
+0x64, 0x65, 0x62, 0x65, 0x6c, 0x65, 0x6e, 0x6f, 0x72, 0x73, 0x6b, 0x20,
+0x62, 0x6f, 0x6b, 0x6d, 0xe5, 0x6c, 0x4e, 0x6f, 0x72, 0x67, 0x65, 0x53,
+0x76, 0x61, 0x6c, 0x62, 0x61, 0x72, 0x64, 0x20, 0x6f, 0x67, 0x20, 0x4a,
+0x61, 0x6e, 0x20, 0x4d, 0x61, 0x79, 0x65, 0x6e, 0x6e, 0x6f, 0x72, 0x73,
+0x6b, 0x20, 0x6e, 0x79, 0x6e, 0x6f, 0x72, 0x73, 0x6b, 0x4e, 0x6f, 0x72,
+0x65, 0x67, 0x54, 0x68, 0x6f, 0x6b, 0x20, 0x4e, 0x61, 0x74, 0x68, 0x4e,
+0x79, 0x61, 0x6e, 0x6a, 0x61, 0x52, 0x75, 0x6e, 0x79, 0x61, 0x6e, 0x6b,
+0x6f, 0x72, 0x65, 0x6f, 0x63, 0x63, 0x69, 0x74, 0x61, 0x6e, 0x45, 0x73,
+0x70, 0x61, 0x6e, 0x68, 0x61, 0xb13, 0xb21, 0xb3c, 0xb3f, 0xb06, 0xb2d, 0xb3e,
+0xb30, 0xb24, 0x4f, 0x72, 0x6f, 0x6d, 0x6f, 0x6f, 0x49, 0x74, 0x6f, 0x6f,
+0x70, 0x68, 0x69, 0x79, 0x61, 0x61, 0x4b, 0x65, 0x65, 0x6e, 0x69, 0x79,
+0x61, 0x61, 0xd801, 0xdccf, 0xd801, 0xdcd8, 0xd801, 0xdcfb, 0xd801, 0xdcd8, 0xd801, 0xdcfb,
+0xd801, 0xdcdf, 0x438, 0x440, 0x43e, 0x43d, 0x413, 0x443, 0x44b, 0x440, 0x434, 0x437,
+0x44b, 0x441, 0x442, 0x43e, 0x43d, 0x423, 0x4d5, 0x440, 0x4d5, 0x441, 0x435, 0x50,
+0x61, 0x70, 0x69, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x75, 0x4b, 0xf2, 0x72,
+0x73, 0x6f, 0x75, 0x67e, 0x69a, 0x62a, 0x648, 0x627, 0x641, 0x63a, 0x627, 0x646,
+0x633, 0x62a, 0x627, 0x646, 0x67e, 0x627, 0x6a9, 0x633, 0x62a, 0x627, 0x646, 0x641,
+0x627, 0x631, 0x633, 0x6cc, 0x62f, 0x631, 0x6cc, 0x70, 0x6f, 0x6c, 0x73, 0x6b,
+0x69, 0x50, 0x6f, 0x6c, 0x73, 0x6b, 0x61, 0x70, 0x6f, 0x72, 0x74, 0x75,
+0x67, 0x75, 0xea, 0x73, 0x42, 0x72, 0x61, 0x73, 0x69, 0x6c, 0x41, 0x6e,
+0x67, 0x6f, 0x6c, 0x61, 0x43, 0x61, 0x62, 0x6f, 0x20, 0x56, 0x65, 0x72,
+0x64, 0x65, 0x47, 0x75, 0x69, 0x6e, 0xe9, 0x20, 0x45, 0x71, 0x75, 0x61,
+0x74, 0x6f, 0x72, 0x69, 0x61, 0x6c, 0x47, 0x75, 0x69, 0x6e, 0xe9, 0x2d,
+0x42, 0x69, 0x73, 0x73, 0x61, 0x75, 0x4c, 0x75, 0x78, 0x65, 0x6d, 0x62,
+0x75, 0x72, 0x67, 0x6f, 0x4d, 0x61, 0x63, 0x61, 0x75, 0x2c, 0x20, 0x52,
+0x41, 0x45, 0x20, 0x64, 0x61, 0x20, 0x43, 0x68, 0x69, 0x6e, 0x61, 0x4d,
+0x6f, 0xe7, 0x61, 0x6d, 0x62, 0x69, 0x71, 0x75, 0x65, 0x70, 0x6f, 0x72,
+0x74, 0x75, 0x67, 0x75, 0xea, 0x73, 0x20, 0x65, 0x75, 0x72, 0x6f, 0x70,
+0x65, 0x75, 0x50, 0x6f, 0x72, 0x74, 0x75, 0x67, 0x61, 0x6c, 0x53, 0xe3,
+0x6f, 0x20, 0x54, 0x6f, 0x6d, 0xe9, 0x20, 0x65, 0x20, 0x50, 0x72, 0xed,
+0x6e, 0x63, 0x69, 0x70, 0x65, 0x53, 0x75, 0xed, 0xe7, 0x61, 0x54, 0x69,
+0x6d, 0x6f, 0x72, 0x2d, 0x4c, 0x65, 0x73, 0x74, 0x65, 0x70, 0x72, 0x16b,
+0x73, 0x69, 0x73, 0x6b, 0x61, 0x6e, 0x50, 0x14d, 0x6c, 0x69, 0xa2a, 0xa70,
+0xa1c, 0xa3e, 0xa2c, 0xa40, 0xa2d, 0xa3e, 0xa30, 0xa24, 0x67e, 0x646, 0x62c, 0x627,
+0x628, 0x6cc, 0x52, 0x75, 0x6e, 0x61, 0x73, 0x69, 0x6d, 0x69, 0x50, 0x65,
+0x72, 0xfa, 0x42, 0x6f, 0x6c, 0x69, 0x76, 0x69, 0x61, 0x45, 0x63, 0x75,
+0x61, 0x64, 0x6f, 0x72, 0x72, 0x6f, 0x6d, 0xe2, 0x6e, 0x103, 0x52, 0x6f,
+0x6d, 0xe2, 0x6e, 0x69, 0x61, 0x52, 0x65, 0x70, 0x75, 0x62, 0x6c, 0x69,
+0x63, 0x61, 0x20, 0x4d, 0x6f, 0x6c, 0x64, 0x6f, 0x76, 0x61, 0x72, 0x75,
+0x6d, 0x61, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x53, 0x76, 0x69, 0x7a, 0x72,
+0x61, 0x4b, 0x69, 0x68, 0x6f, 0x72, 0x6f, 0x6d, 0x62, 0x6f, 0x49, 0x6b,
+0x69, 0x72, 0x75, 0x6e, 0x64, 0x69, 0x55, 0x62, 0x75, 0x72, 0x75, 0x6e,
+0x64, 0x69, 0x440, 0x443, 0x441, 0x441, 0x43a, 0x438, 0x439, 0x420, 0x43e, 0x441,
+0x441, 0x438, 0x44f, 0x41a, 0x430, 0x437, 0x430, 0x445, 0x441, 0x442, 0x430, 0x43d,
+0x41a, 0x438, 0x440, 0x433, 0x438, 0x437, 0x438, 0x44f, 0x41c, 0x43e, 0x43b, 0x434,
+0x43e, 0x432, 0x430, 0x423, 0x43a, 0x440, 0x430, 0x438, 0x43d, 0x430, 0x4b, 0x69,
+0x72, 0x75, 0x77, 0x61, 0x53, 0x61, 0x68, 0x6f, 0x441, 0x430, 0x445, 0x430,
+0x20, 0x442, 0x44b, 0x43b, 0x430, 0x410, 0x440, 0x430, 0x441, 0x441, 0x44b, 0x44b,
+0x439, 0x430, 0x4b, 0x69, 0x73, 0x61, 0x6d, 0x70, 0x75, 0x72, 0x53, 0xe4,
+0x6e, 0x67, 0xf6, 0x4b, 0xf6, 0x64, 0xf6, 0x72, 0xf6, 0x73, 0xea, 0x73,
+0x65, 0x20, 0x74, 0xee, 0x20, 0x42, 0xea, 0x61, 0x66, 0x72, 0xee, 0x6b,
+0x61, 0x49, 0x73, 0x68, 0x69, 0x73, 0x61, 0x6e, 0x67, 0x75, 0x54, 0x61,
+0x6e, 0x73, 0x61, 0x6e, 0x69, 0x79, 0x61, 0x938, 0x902, 0x938, 0x94d, 0x915,
+0x943, 0x924, 0x20, 0x92d, 0x93e, 0x937, 0x93e, 0x92d, 0x93e, 0x930, 0x924, 0x903,
+0x1c65, 0x1c5f, 0x1c71, 0x1c5b, 0x1c5f, 0x1c72, 0x1c64, 0x1c64, 0x1c71, 0x1c70, 0x1c64, 0x1c6d,
+0x1c5f, 0x938, 0x93e, 0x928, 0x924, 0x93e, 0x921, 0x93c, 0x940, 0x73, 0x61, 0x72,
+0x64, 0x75, 0x73, 0x65, 0x6e, 0x61, 0x441, 0x440, 0x43f, 0x441, 0x43a, 0x438,
+0x421, 0x440, 0x431, 0x438, 0x458, 0x430, 0x41a, 0x43e, 0x441, 0x43e, 0x432, 0x43e,
+0x426, 0x440, 0x43d, 0x430, 0x20, 0x413, 0x43e, 0x440, 0x430, 0x73, 0x72, 0x70,
+0x73, 0x6b, 0x69, 0x4b, 0x6f, 0x73, 0x6f, 0x76, 0x6f, 0x43, 0x72, 0x6e,
+0x61, 0x20, 0x47, 0x6f, 0x72, 0x61, 0x53, 0x72, 0x62, 0x69, 0x6a, 0x61,
+0x4b, 0x69, 0x73, 0x68, 0x61, 0x6d, 0x62, 0x61, 0x61, 0x63, 0x68, 0x69,
+0x53, 0x68, 0x6f, 0x6e, 0x61, 0xa188, 0xa320, 0xa259, 0xa34f, 0xa1e9, 0x73, 0x69,
+0x63, 0x69, 0x6c, 0x69, 0x61, 0x6e, 0x75, 0x53, 0x69, 0x64, 0x61, 0x61,
+0x6d, 0x75, 0x20, 0x41, 0x66, 0x6f, 0x49, 0x74, 0x69, 0x79, 0x6f, 0x6f,
+0x70, 0x68, 0x69, 0x79, 0x61, 0x15b, 0x6c, 0x14d, 0x6e, 0x73, 0x6b, 0x69,
+0x633, 0x646, 0x68c, 0x64a, 0x67e, 0x627, 0x6aa, 0x633, 0x62a, 0x627, 0x646, 0x938,
+0x93f, 0x928, 0x94d, 0x927, 0x940, 0xdc3, 0xdd2, 0xd82, 0xdc4, 0xdbd, 0xdc1, 0xdca,
+0x200d, 0xdbb, 0xdd3, 0x20, 0xdbd, 0xd82, 0xd9a, 0xdcf, 0xdc0, 0x73, 0xe4, 0xe4,
+0x2b9, 0x6d, 0x1e9, 0x69, 0xf5, 0x6c, 0x6c, 0x4c, 0xe4, 0xe4, 0x2b9, 0x64,
+0x64, 0x6a, 0xe2, 0x6e, 0x6e, 0x61, 0x6d, 0x73, 0x6c, 0x6f, 0x76, 0x65,
+0x6e, 0x10d, 0x69, 0x6e, 0x61, 0x53, 0x6c, 0x6f, 0x76, 0x65, 0x6e, 0x73,
+0x6b, 0x6f, 0x73, 0x6c, 0x6f, 0x76, 0x65, 0x6e, 0x161, 0x10d, 0x69, 0x6e,
+0x61, 0x53, 0x6c, 0x6f, 0x76, 0x65, 0x6e, 0x69, 0x6a, 0x61, 0x4f, 0x6c,
+0x75, 0x73, 0x6f, 0x67, 0x61, 0x53, 0x6f, 0x6f, 0x6d, 0x61, 0x61, 0x6c,
+0x69, 0x53, 0x6f, 0x6f, 0x6d, 0x61, 0x61, 0x6c, 0x69, 0x79, 0x61, 0x4a,
+0x61, 0x62, 0x75, 0x75, 0x74, 0x69, 0x49, 0x74, 0x6f, 0x6f, 0x62, 0x69,
+0x79, 0x61, 0x6a9, 0x648, 0x631, 0x62f, 0x6cc, 0x20, 0x62e, 0x648, 0x627, 0x631,
+0x6af, 0xc5, 0x61, 0x72, 0x6a, 0x65, 0x6c, 0x73, 0x61, 0x65, 0x6d, 0x69,
+0x65, 0x6e, 0x20, 0x67, 0xef, 0x65, 0x6c, 0x65, 0x65, 0x73, 0x70, 0x61,
+0xf1, 0x6f, 0x6c, 0x20, 0x64, 0x65, 0x20, 0x45, 0x73, 0x70, 0x61, 0xf1,
+0x61, 0x41, 0x72, 0x67, 0x65, 0x6e, 0x74, 0x69, 0x6e, 0x61, 0x42, 0x65,
+0x6c, 0x69, 0x63, 0x65, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x69, 0x61, 0x73,
+0x43, 0x65, 0x75, 0x74, 0x61, 0x20, 0x79, 0x20, 0x4d, 0x65, 0x6c, 0x69,
+0x6c, 0x6c, 0x61, 0x43, 0x68, 0x69, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x6f,
+0x6d, 0x62, 0x69, 0x61, 0x43, 0x6f, 0x73, 0x74, 0x61, 0x20, 0x52, 0x69,
+0x63, 0x61, 0x43, 0x75, 0x62, 0x61, 0x52, 0x65, 0x70, 0xfa, 0x62, 0x6c,
+0x69, 0x63, 0x61, 0x20, 0x44, 0x6f, 0x6d, 0x69, 0x6e, 0x69, 0x63, 0x61,
+0x6e, 0x61, 0x45, 0x6c, 0x20, 0x53, 0x61, 0x6c, 0x76, 0x61, 0x64, 0x6f,
+0x72, 0x47, 0x75, 0x69, 0x6e, 0x65, 0x61, 0x20, 0x45, 0x63, 0x75, 0x61,
+0x74, 0x6f, 0x72, 0x69, 0x61, 0x6c, 0x47, 0x75, 0x61, 0x74, 0x65, 0x6d,
+0x61, 0x6c, 0x61, 0x48, 0x6f, 0x6e, 0x64, 0x75, 0x72, 0x61, 0x73, 0x65,
+0x73, 0x70, 0x61, 0xf1, 0x6f, 0x6c, 0x20, 0x6c, 0x61, 0x74, 0x69, 0x6e,
+0x6f, 0x61, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6e, 0x6f, 0x4c, 0x61,
+0x74, 0x69, 0x6e, 0x6f, 0x61, 0x6d, 0xe9, 0x72, 0x69, 0x63, 0x61, 0x65,
+0x73, 0x70, 0x61, 0xf1, 0x6f, 0x6c, 0x20, 0x64, 0x65, 0x20, 0x4d, 0xe9,
+0x78, 0x69, 0x63, 0x6f, 0x4d, 0xe9, 0x78, 0x69, 0x63, 0x6f, 0x4e, 0x69,
+0x63, 0x61, 0x72, 0x61, 0x67, 0x75, 0x61, 0x50, 0x61, 0x6e, 0x61, 0x6d,
+0xe1, 0x50, 0x61, 0x72, 0x61, 0x67, 0x75, 0x61, 0x79, 0x46, 0x69, 0x6c,
+0x69, 0x70, 0x69, 0x6e, 0x61, 0x73, 0x45, 0x73, 0x74, 0x61, 0x64, 0x6f,
+0x73, 0x20, 0x55, 0x6e, 0x69, 0x64, 0x6f, 0x73, 0x55, 0x72, 0x75, 0x67,
+0x75, 0x61, 0x79, 0x56, 0x65, 0x6e, 0x65, 0x7a, 0x75, 0x65, 0x6c, 0x61,
+0x2d5c, 0x2d30, 0x2d4e, 0x2d30, 0x2d63, 0x2d49, 0x2d56, 0x2d5c, 0x2d4d, 0x2d4e, 0x2d56, 0x2d54,
+0x2d49, 0x2d31, 0x42, 0x61, 0x73, 0x61, 0x20, 0x53, 0x75, 0x6e, 0x64, 0x61,
+0x4b, 0x69, 0x73, 0x77, 0x61, 0x68, 0x69, 0x6c, 0x69, 0x4a, 0x61, 0x6d,
+0x68, 0x75, 0x72, 0x69, 0x20, 0x79, 0x61, 0x20, 0x4b, 0x69, 0x64, 0x65,
+0x6d, 0x6f, 0x6b, 0x72, 0x61, 0x73, 0x69, 0x61, 0x20, 0x79, 0x61, 0x20,
+0x4b, 0x6f, 0x6e, 0x67, 0x6f, 0x73, 0x69, 0x53, 0x77, 0x61, 0x74, 0x69,
+0x65, 0x53, 0x77, 0x61, 0x74, 0x69, 0x6e, 0x69, 0x73, 0x76, 0x65, 0x6e,
+0x73, 0x6b, 0x61, 0x53, 0x76, 0x65, 0x72, 0x69, 0x67, 0x65, 0xc5, 0x6c,
+0x61, 0x6e, 0x64, 0x53, 0x63, 0x68, 0x77, 0x69, 0x69, 0x7a, 0x65, 0x72,
+0x74, 0xfc, 0xfc, 0x74, 0x73, 0x63, 0x68, 0x46, 0x72, 0x61, 0x6e, 0x6b,
+0x72, 0x69, 0x69, 0x63, 0x68, 0x4c, 0x69, 0xe4, 0x63, 0x68, 0x74, 0x65,
+0x73, 0x63, 0x68, 0x74, 0xe4, 0x69, 0x723, 0x718, 0x72a, 0x71d, 0x71d, 0x710,
+0x725, 0x71d, 0x72a, 0x729, 0x723, 0x718, 0x72a, 0x71d, 0x710, 0x2d5c, 0x2d30, 0x2d5b,
+0x2d4d, 0x2d43, 0x2d49, 0x2d5c, 0x54, 0x61, 0x73, 0x68, 0x65, 0x6c, 0x1e25, 0x69,
+0x79, 0x74, 0x6c, 0x6d, 0x263, 0x72, 0x69, 0x62, 0xaabc, 0xaa95, 0xaa92, 0xaabe,
+0x4b, 0x69, 0x74, 0x61, 0x69, 0x74, 0x61, 0x442, 0x43e, 0x4b7, 0x438, 0x43a,
+0x4e3, 0x422, 0x43e, 0x4b7, 0x438, 0x43a, 0x438, 0x441, 0x442, 0x43e, 0x43d, 0xba4,
+0xbae, 0xbbf, 0xbb4, 0xbcd, 0xb87, 0xba8, 0xbcd, 0xba4, 0xbbf, 0xbaf, 0xbbe, 0xbae,
+0xbb2, 0xbc7, 0xb9a, 0xbbf, 0xbaf, 0xbbe, 0xb9a, 0xbbf, 0xb99, 0xbcd, 0xb95, 0xbaa,
+0xbcd, 0xbaa, 0xbc2, 0xbb0, 0xbcd, 0xb87, 0xbb2, 0xb99, 0xbcd, 0xb95, 0xbc8, 0x70,
+0x61, 0x74, 0x61, 0x73, 0x20, 0x54, 0x61, 0x72, 0x6f, 0x6b, 0x6f, 0x54,
+0x61, 0x73, 0x61, 0x77, 0x61, 0x71, 0x20, 0x73, 0x65, 0x6e, 0x6e, 0x69,
+0x4e, 0x69, 0x17e, 0x65, 0x72, 0x442, 0x430, 0x442, 0x430, 0x440, 0xc24, 0xc46,
+0xc32, 0xc41, 0xc17, 0xc41, 0xc2d, 0xc3e, 0xc30, 0xc24, 0xc26, 0xc47, 0xc36, 0xc02,
+0x4b, 0x69, 0x74, 0x65, 0x73, 0x6f, 0x4b, 0x65, 0x6e, 0x69, 0x61, 0xe44,
+0xe17, 0xe22, 0xf56, 0xf7c, 0xf51, 0xf0b, 0xf66, 0xf90, 0xf51, 0xf0b, 0xf62, 0xf92,
+0xfb1, 0xf0b, 0xf53, 0xf42, 0xf62, 0xf92, 0xfb1, 0xf0b, 0xf42, 0xf62, 0xf0b, 0x1275,
+0x130d, 0x1228, 0x1275, 0x130d, 0x122d, 0x129b, 0x54, 0x6f, 0x6b, 0x20, 0x50, 0x69,
+0x73, 0x69, 0x6e, 0x50, 0x61, 0x70, 0x75, 0x61, 0x20, 0x4e, 0x69, 0x75,
+0x67, 0x69, 0x6e, 0x69, 0x6c, 0x65, 0x61, 0x20, 0x66, 0x61, 0x6b, 0x61,
+0x74, 0x6f, 0x6e, 0x67, 0x61, 0x58, 0x69, 0x74, 0x73, 0x6f, 0x6e, 0x67,
+0x61, 0x53, 0x65, 0x74, 0x73, 0x77, 0x61, 0x6e, 0x61, 0x41, 0x66, 0x6f,
+0x72, 0x69, 0x6b, 0x61, 0x20, 0x42, 0x6f, 0x72, 0x77, 0x61, 0x54, 0xfc,
+0x72, 0x6b, 0xe7, 0x65, 0x54, 0xfc, 0x72, 0x6b, 0x69, 0x79, 0x65, 0x4b,
+0x131, 0x62, 0x72, 0x131, 0x73, 0x74, 0xfc, 0x72, 0x6b, 0x6d, 0x65, 0x6e,
+0x20, 0x64, 0x69, 0x6c, 0x69, 0x54, 0xfc, 0x72, 0x6b, 0x6d, 0x65, 0x6e,
+0x69, 0x73, 0x74, 0x61, 0x6e, 0x4b, 0x61, 0x74, 0x61, 0x62, 0x443, 0x43a,
+0x440, 0x430, 0x457, 0x43d, 0x441, 0x44c, 0x43a, 0x430, 0x423, 0x43a, 0x440, 0x430,
+0x457, 0x43d, 0x430, 0x68, 0x6f, 0x72, 0x6e, 0x6a, 0x6f, 0x73, 0x65, 0x72,
+0x62, 0x161, 0x107, 0x69, 0x6e, 0x61, 0x4e, 0x11b, 0x6d, 0x73, 0x6b, 0x61,
+0x627, 0x631, 0x62f, 0x648, 0x628, 0x6be, 0x627, 0x631, 0x62a, 0x626, 0x6c7, 0x64a,
+0x63a, 0x6c7, 0x631, 0x686, 0x6d5, 0x62c, 0x6c7, 0x6ad, 0x6af, 0x648, 0x6f, 0x2018,
+0x7a, 0x62, 0x65, 0x6b, 0x4f, 0x2bb, 0x7a, 0x62, 0x65, 0x6b, 0x69, 0x73,
+0x74, 0x6f, 0x6e, 0x627, 0x648, 0x632, 0x628, 0x6cc, 0x6a9, 0x45e, 0x437, 0x431,
+0x435, 0x43a, 0x447, 0x430, 0x40e, 0x437, 0x431, 0x435, 0x43a, 0x438, 0x441, 0x442,
+0x43e, 0x43d, 0xa559, 0xa524, 0xa55e, 0xa524, 0xa52b, 0xa569, 0x56, 0x61, 0x69, 0x4c,
+0x61, 0x69, 0x62, 0x68, 0x69, 0x79, 0x61, 0x54, 0x73, 0x68, 0x69, 0x76,
+0x65, 0x6e, 0x1e13, 0x61, 0x54, 0x69, 0x1ebf, 0x6e, 0x67, 0x20, 0x56, 0x69,
+0x1ec7, 0x74, 0x56, 0x69, 0x1ec7, 0x74, 0x20, 0x4e, 0x61, 0x6d, 0x56, 0x6f,
+0x6c, 0x61, 0x70, 0xfc, 0x6b, 0x4b, 0x79, 0x69, 0x76, 0x75, 0x6e, 0x6a,
+0x6f, 0x77, 0x61, 0x6c, 0x6f, 0x6e, 0x57, 0x61, 0x6c, 0x73, 0x65, 0x72,
+0x53, 0x63, 0x68, 0x77, 0x69, 0x7a, 0x57, 0x61, 0x72, 0x6c, 0x70, 0x69,
+0x72, 0x69, 0x43, 0x79, 0x6d, 0x72, 0x61, 0x65, 0x67, 0x59, 0x20, 0x44,
+0x65, 0x79, 0x72, 0x6e, 0x61, 0x73, 0x20, 0x55, 0x6e, 0x65, 0x64, 0x69,
+0x67, 0x628, 0x644, 0x648, 0x686, 0x6cc, 0x20, 0x28, 0x631, 0x62e, 0x634, 0x627,
+0x646, 0x6cc, 0x29, 0x626, 0x648, 0x645, 0x627, 0x646, 0x645, 0x62a, 0x62d, 0x62f,
+0x6cc, 0x646, 0x20, 0x639, 0x631, 0x628, 0x6cc, 0x646, 0x20, 0x627, 0x645, 0x627,
+0x631, 0x627, 0x62a, 0x46, 0x72, 0x79, 0x73, 0x6b, 0x4e, 0x65, 0x64, 0x65,
+0x72, 0x6c, 0xe2, 0x6e, 0x12c8, 0x120b, 0x12ed, 0x1273, 0x1271, 0x57, 0x6f, 0x6c,
+0x6f, 0x66, 0x49, 0x73, 0x69, 0x58, 0x68, 0x6f, 0x73, 0x61, 0x45, 0x4d,
+0x7a, 0x61, 0x6e, 0x74, 0x73, 0x69, 0x20, 0x41, 0x66, 0x72, 0x69, 0x6b,
+0x61, 0x6e, 0x75, 0x61, 0x73, 0x75, 0x65, 0x4b, 0x65, 0x6d, 0x65, 0x6c,
+0xfa, 0x6e, 0x5d9, 0x5d9, 0x5b4, 0x5d3, 0x5d9, 0x5e9, 0x5d0, 0x5d5, 0x5e7, 0x5e8,
+0x5d0, 0x5b7, 0x5d9, 0x5e0, 0x5e2, 0xc8, 0x64, 0xe8, 0x20, 0x59, 0x6f, 0x72,
+0xf9, 0x62, 0xe1, 0x4e, 0xe0, 0xec, 0x6a, 0xed, 0x72, 0xed, 0xe0, 0x42,
+0x25b, 0x300, 0x6e, 0x25b, 0x300, 0x5a, 0x61, 0x72, 0x6d, 0x61, 0x63, 0x69,
+0x69, 0x6e, 0x65, 0x56, 0x61, 0x68, 0x63, 0x75, 0x65, 0x6e, 0x67, 0x68,
+0x43, 0x75, 0x6e, 0x67, 0x68, 0x67, 0x6f, 0x7a, 0x69, 0x73, 0x69, 0x5a,
+0x75, 0x6c, 0x75, 0x69, 0x4e, 0x69, 0x6e, 0x67, 0x69, 0x7a, 0x69, 0x6d,
+0x75, 0x20, 0x41, 0x66, 0x72, 0x69, 0x6b, 0x61, 0x6b, 0x61, 0x6e, 0x68,
+0x67, 0xe1, 0x67, 0x4d, 0x72, 0x61, 0x73, 0x69, 0x72, 0x6e, 0x68, 0x65,
+0x1ebd, 0x67, 0x61, 0x74, 0x75, 0x42, 0x72, 0x61, 0x73, 0x69, 0x75, 0xf1,
+0x65, 0x6e, 0x67, 0x61, 0x74, 0xfa, 0x4b, 0x75, 0x72, 0x169, 0x62, 0x69,
+0x79, 0x61, 0x57, 0x65, 0x6e, 0x65, 0x73, 0x75, 0x65, 0x72, 0x61, 0x939,
+0x930, 0x93f, 0x92f, 0x93e, 0x923, 0x935, 0x940, 0x4e, 0x6f, 0x72, 0x64, 0x66,
+0x72, 0x69, 0x69, 0x73, 0x6b, 0x54, 0x6a, 0x69, 0x69, 0x73, 0x6b, 0x6c,
+0x75, 0x6e, 0x930, 0x93e, 0x91c, 0x938, 0x94d, 0x925, 0x93e, 0x928, 0x940, 0x43c,
+0x43e, 0x43a, 0x448, 0x435, 0x43d, 0x44c, 0x20, 0x43a, 0x44f, 0x43b, 0x44c, 0x74,
+0x6f, 0x6b, 0x69, 0x20, 0x70, 0x6f, 0x6e, 0x61, 0x6d, 0x61, 0x20, 0x61,
+0x6c, 0x65, 0x50, 0x69, 0x6a, 0x69, 0x6e, 0x53, 0x6f, 0x6c, 0x6f, 0x6d,
+0x6f, 0x6e, 0x20, 0x41, 0x65, 0x6c, 0x61, 0x6e, 0x4f, 0x62, 0x6f, 0x6c,
+0x6f, 0x628, 0x644, 0x6c6, 0x686, 0x6cc, 0x42, 0x61, 0x6c, 0xf3, 0x63, 0x68,
+0x69, 0x50, 0xe1, 0x6b, 0x65, 0x73, 0x74, 0xe1, 0x6e, 0x6c, 0x69, 0x67,
+0x75, 0x72, 0x65, 0xd803, 0xdd0c, 0xd803, 0xdd17, 0xd803, 0xdd25, 0xd803, 0xdd1d, 0xd803,
+0xdd19, 0xd803, 0xdd1a, 0xd803, 0xdd12, 0xd803, 0xdd19, 0xd803, 0xdd1d, 0x62a, 0x648, 0x631,
+0x648, 0x627, 0x644, 0x6cc, 0x61, 0x6e, 0x69, 0x69, 0x20, 0x6b, 0x61, 0x67,
+0x269, 0x6a, 0x61, 0x42, 0x65, 0x6e, 0x25b, 0x25b, 0x915, 0x93e, 0x902, 0x917,
+0x921, 0x93c, 0x940, 0x76, 0x65, 0x6e, 0x65, 0x74, 0x6f
};
-static const char language_name_list[] =
+static constexpr char language_name_list[] =
"Default\0"
"C\0"
"Abkhazian\0"
@@ -3911,7 +6253,7 @@ static const char language_name_list[] =
"Chickasaw\0"
"Chiga\0"
"Chinese\0"
-"Church\0"
+"Church Slavic\0"
"Chuvash\0"
"Colognian\0"
"Coptic\0"
@@ -3939,8 +6281,8 @@ static const char language_name_list[] =
"Finnish\0"
"French\0"
"Friulian\0"
-"Fulah\0"
-"Gaelic\0"
+"Fula\0" // Fulah
+"Scottish Gaelic\0"
"Ga\0"
"Galician\0"
"Ganda\0"
@@ -3952,7 +6294,7 @@ static const char language_name_list[] =
"Guarani\0"
"Gujarati\0"
"Gusii\0"
-"Haitian\0"
+"Haitian Creole\0"
"Hausa\0"
"Hawaiian\0"
"Hebrew\0"
@@ -3975,7 +6317,7 @@ static const char language_name_list[] =
"Japanese\0"
"Javanese\0"
"Jju\0"
-"Jola Fonyi\0"
+"Jola-Fonyi\0"
"Kabuverdianu\0"
"Kabyle\0"
"Kako\0"
@@ -3988,7 +6330,7 @@ static const char language_name_list[] =
"Kazakh\0"
"Kenyang\0"
"Khmer\0"
-"Kiche\0"
+"Kʼicheʼ\0"
"Kikuyu\0"
"Kinyarwanda\0"
"Komi\0"
@@ -4016,7 +6358,7 @@ static const char language_name_list[] =
"Lojban\0"
"Lower Sorbian\0"
"Low German\0"
-"Luba Katanga\0"
+"Luba-Katanga\0"
"Lule Sami\0"
"Luo\0"
"Luxembourgish\0"
@@ -4024,7 +6366,7 @@ static const char language_name_list[] =
"Macedonian\0"
"Machame\0"
"Maithili\0"
-"Makhuwa Meetto\0"
+"Makhuwa-Meetto\0"
"Makonde\0"
"Malagasy\0"
"Malayalam\0"
@@ -4033,7 +6375,7 @@ static const char language_name_list[] =
"Mandingo\0"
"Manipuri\0"
"Manx\0"
-"Maori\0"
+"Māori\0"
"Mapuche\0"
"Marathi\0"
"Marshallese\0"
@@ -4041,7 +6383,7 @@ static const char language_name_list[] =
"Mazanderani\0"
"Mende\0"
"Meru\0"
-"Meta\0"
+"Metaʼ\0"
"Mohawk\0"
"Mongolian\0"
"Morisyen\0"
@@ -4056,12 +6398,12 @@ static const char language_name_list[] =
"Ngiemboon\0"
"Ngomba\0"
"Nigerian Pidgin\0"
-"Nko\0"
+"N’Ko\0"
"Northern Luri\0"
"Northern Sami\0"
"Northern Sotho\0"
"North Ndebele\0"
-"Norwegian Bokmal\0"
+"Norwegian Bokmål\0"
"Norwegian Nynorsk\0"
"Nuer\0"
"Nyanja\0"
@@ -4094,7 +6436,7 @@ static const char language_name_list[] =
"Russian\0"
"Rwa\0"
"Saho\0"
-"Sakha\0"
+"Yakut\0" // Sakha
"Samburu\0"
"Samoan\0"
"Sango\0"
@@ -4163,7 +6505,7 @@ static const char language_name_list[] =
"Vai\0"
"Venda\0"
"Vietnamese\0"
-"Volapuk\0"
+"Volapük\0"
"Vunjo\0"
"Walloon\0"
"Walser\0"
@@ -4182,9 +6524,23 @@ static const char language_name_list[] =
"Zulu\0"
"Kaingang\0"
"Nheengatu\0"
+"Haryanvi\0"
+"Northern Frisian\0"
+"Rajasthani\0"
+"Moksha\0"
+"Toki Pona\0"
+"Pijin\0"
+"Obolo\0"
+"Baluchi\0"
+"Ligurian\0"
+"Rohingya\0"
+"Torwali\0"
+"Anii\0"
+"Kangri\0"
+"Venetian\0"
;
-static const quint16 language_name_index[] = {
+static constexpr quint16 language_name_index[] = {
0, // AnyLanguage
8, // C
10, // Abkhazian
@@ -4245,279 +6601,293 @@ static const quint16 language_name_index[] = {
497, // Chiga
503, // Chinese
511, // Church
- 518, // Chuvash
- 526, // Colognian
- 536, // Coptic
- 543, // Cornish
- 551, // Corsican
- 560, // Cree
- 565, // Croatian
- 574, // Czech
- 580, // Danish
- 587, // Divehi
- 594, // Dogri
- 600, // Duala
- 606, // Dutch
- 612, // Dzongkha
- 621, // Embu
- 626, // English
- 634, // Erzya
- 640, // Esperanto
- 650, // Estonian
- 659, // Ewe
- 663, // Ewondo
- 670, // Faroese
- 678, // Fijian
- 685, // Filipino
- 694, // Finnish
- 702, // French
- 709, // Friulian
- 718, // Fulah
- 724, // Gaelic
- 731, // Ga
- 734, // Galician
- 743, // Ganda
- 749, // Geez
- 754, // Georgian
- 763, // German
- 770, // Gothic
- 777, // Greek
- 783, // Guarani
- 791, // Gujarati
- 800, // Gusii
- 806, // Haitian
- 814, // Hausa
- 820, // Hawaiian
- 829, // Hebrew
- 836, // Herero
- 843, // Hindi
- 849, // Hiri Motu
- 859, // Hungarian
- 869, // Icelandic
- 879, // Ido
- 883, // Igbo
- 888, // Inari Sami
- 899, // Indonesian
- 910, // Ingush
- 917, // Interlingua
- 929, // Interlingue
- 941, // Inuktitut
- 951, // Inupiaq
- 959, // Irish
- 965, // Italian
- 973, // Japanese
- 982, // Javanese
- 991, // Jju
- 995, // Jola Fonyi
- 1006, // Kabuverdianu
- 1019, // Kabyle
- 1026, // Kako
- 1031, // Kalaallisut
- 1043, // Kalenjin
- 1052, // Kamba
- 1058, // Kannada
- 1066, // Kanuri
- 1073, // Kashmiri
- 1082, // Kazakh
- 1089, // Kenyang
- 1097, // Khmer
- 1103, // Kiche
- 1109, // Kikuyu
- 1116, // Kinyarwanda
- 1128, // Komi
- 1133, // Kongo
- 1139, // Konkani
- 1147, // Korean
- 1154, // Koro
- 1159, // Koyraboro Senni
- 1175, // Koyra Chiini
- 1188, // Kpelle
- 1195, // Kuanyama
- 1204, // Kurdish
- 1212, // Kwasio
- 1219, // Kyrgyz
- 1226, // Lakota
- 1233, // Langi
- 1239, // Lao
- 1243, // Latin
- 1249, // Latvian
- 1257, // Lezghian
- 1266, // Limburgish
- 1277, // Lingala
- 1285, // Literary Chinese
- 1302, // Lithuanian
- 1313, // Lojban
- 1320, // Lower Sorbian
- 1334, // Low German
- 1345, // Luba Katanga
- 1358, // Lule Sami
- 1368, // Luo
- 1372, // Luxembourgish
- 1386, // Luyia
- 1392, // Macedonian
- 1403, // Machame
- 1411, // Maithili
- 1420, // Makhuwa Meetto
- 1435, // Makonde
- 1443, // Malagasy
- 1452, // Malayalam
- 1462, // Malay
- 1468, // Maltese
- 1476, // Mandingo
- 1485, // Manipuri
- 1494, // Manx
- 1499, // Maori
- 1505, // Mapuche
- 1513, // Marathi
- 1521, // Marshallese
- 1533, // Masai
- 1539, // Mazanderani
- 1551, // Mende
- 1557, // Meru
- 1562, // Meta
- 1567, // Mohawk
- 1574, // Mongolian
- 1584, // Morisyen
- 1593, // Mundang
- 1601, // Muscogee
- 1610, // Nama
- 1615, // Nauru
- 1621, // Navajo
- 1628, // Ndonga
- 1635, // Nepali
- 1642, // Newari
- 1649, // Ngiemboon
- 1659, // Ngomba
- 1666, // Nigerian Pidgin
- 1682, // Nko
- 1686, // Northern Luri
- 1700, // Northern Sami
- 1714, // Northern Sotho
- 1729, // North Ndebele
- 1743, // Norwegian Bokmal
- 1760, // Norwegian Nynorsk
- 1778, // Nuer
- 1783, // Nyanja
- 1790, // Nyankole
- 1799, // Occitan
- 1807, // Odia
- 1812, // Ojibwa
- 1819, // Old Irish
- 1829, // Old Norse
- 1839, // Old Persian
- 1851, // Oromo
- 1857, // Osage
- 1863, // Ossetic
- 1871, // Pahlavi
- 1879, // Palauan
- 1887, // Pali
- 1892, // Papiamento
- 1903, // Pashto
- 1910, // Persian
- 1918, // Phoenician
- 1929, // Polish
- 1936, // Portuguese
- 1947, // Prussian
- 1956, // Punjabi
- 1964, // Quechua
- 1972, // Romanian
- 1981, // Romansh
- 1989, // Rombo
- 1995, // Rundi
- 2001, // Russian
- 2009, // Rwa
- 2013, // Saho
- 2018, // Sakha
- 2024, // Samburu
- 2032, // Samoan
- 2039, // Sango
- 2045, // Sangu
- 2051, // Sanskrit
- 2060, // Santali
- 2068, // Sardinian
- 2078, // Saurashtra
- 2089, // Sena
- 2094, // Serbian
- 2102, // Shambala
- 2111, // Shona
- 2117, // Sichuan Yi
- 2128, // Sicilian
- 2137, // Sidamo
- 2144, // Silesian
- 2153, // Sindhi
- 2160, // Sinhala
- 2168, // Skolt Sami
- 2179, // Slovak
- 2186, // Slovenian
- 2196, // Soga
- 2201, // Somali
- 2208, // Southern Kurdish
- 2225, // Southern Sami
- 2239, // Southern Sotho
- 2254, // South Ndebele
- 2268, // Spanish
- 2276, // Standard Moroccan Tamazight
- 2304, // Sundanese
- 2314, // Swahili
- 2322, // Swati
- 2328, // Swedish
- 2336, // Swiss German
- 2349, // Syriac
- 2356, // Tachelhit
- 2366, // Tahitian
- 2375, // Tai Dam
- 2383, // Taita
- 2389, // Tajik
- 2395, // Tamil
- 2401, // Taroko
- 2408, // Tasawaq
- 2416, // Tatar
- 2422, // Telugu
- 2429, // Teso
- 2434, // Thai
- 2439, // Tibetan
- 2447, // Tigre
- 2453, // Tigrinya
- 2462, // Tokelau
- 2470, // Tok Pisin
- 2480, // Tongan
- 2487, // Tsonga
- 2494, // Tswana
- 2501, // Turkish
- 2509, // Turkmen
- 2517, // Tuvalu
- 2524, // Tyap
- 2529, // Ugaritic
- 2538, // Ukrainian
- 2548, // Upper Sorbian
- 2562, // Urdu
- 2567, // Uyghur
- 2574, // Uzbek
- 2580, // Vai
- 2584, // Venda
- 2590, // Vietnamese
- 2601, // Volapuk
- 2609, // Vunjo
- 2615, // Walloon
- 2623, // Walser
- 2630, // Warlpiri
- 2639, // Welsh
- 2645, // Western Balochi
- 2661, // Western Frisian
- 2677, // Wolaytta
- 2686, // Wolof
- 2692, // Xhosa
- 2698, // Yangben
- 2706, // Yiddish
- 2714, // Yoruba
- 2721, // Zarma
- 2727, // Zhuang
- 2734, // Zulu
- 2739, // Kaingang
- 2748, // Nheengatu
+ 525, // Chuvash
+ 533, // Colognian
+ 543, // Coptic
+ 550, // Cornish
+ 558, // Corsican
+ 567, // Cree
+ 572, // Croatian
+ 581, // Czech
+ 587, // Danish
+ 594, // Divehi
+ 601, // Dogri
+ 607, // Duala
+ 613, // Dutch
+ 619, // Dzongkha
+ 628, // Embu
+ 633, // English
+ 641, // Erzya
+ 647, // Esperanto
+ 657, // Estonian
+ 666, // Ewe
+ 670, // Ewondo
+ 677, // Faroese
+ 685, // Fijian
+ 692, // Filipino
+ 701, // Finnish
+ 709, // French
+ 716, // Friulian
+ 725, // Fulah
+ 730, // Gaelic
+ 746, // Ga
+ 749, // Galician
+ 758, // Ganda
+ 764, // Geez
+ 769, // Georgian
+ 778, // German
+ 785, // Gothic
+ 792, // Greek
+ 798, // Guarani
+ 806, // Gujarati
+ 815, // Gusii
+ 821, // Haitian
+ 836, // Hausa
+ 842, // Hawaiian
+ 851, // Hebrew
+ 858, // Herero
+ 865, // Hindi
+ 871, // Hiri Motu
+ 881, // Hungarian
+ 891, // Icelandic
+ 901, // Ido
+ 905, // Igbo
+ 910, // Inari Sami
+ 921, // Indonesian
+ 932, // Ingush
+ 939, // Interlingua
+ 951, // Interlingue
+ 963, // Inuktitut
+ 973, // Inupiaq
+ 981, // Irish
+ 987, // Italian
+ 995, // Japanese
+ 1004, // Javanese
+ 1013, // Jju
+ 1017, // Jola-Fonyi
+ 1028, // Kabuverdianu
+ 1041, // Kabyle
+ 1048, // Kako
+ 1053, // Kalaallisut
+ 1065, // Kalenjin
+ 1074, // Kamba
+ 1080, // Kannada
+ 1088, // Kanuri
+ 1095, // Kashmiri
+ 1104, // Kazakh
+ 1111, // Kenyang
+ 1119, // Khmer
+ 1125, // Kiche
+ 1135, // Kikuyu
+ 1142, // Kinyarwanda
+ 1154, // Komi
+ 1159, // Kongo
+ 1165, // Konkani
+ 1173, // Korean
+ 1180, // Koro
+ 1185, // Koyraboro Senni
+ 1201, // Koyra Chiini
+ 1214, // Kpelle
+ 1221, // Kuanyama
+ 1230, // Kurdish
+ 1238, // Kwasio
+ 1245, // Kyrgyz
+ 1252, // Lakota
+ 1259, // Langi
+ 1265, // Lao
+ 1269, // Latin
+ 1275, // Latvian
+ 1283, // Lezghian
+ 1292, // Limburgish
+ 1303, // Lingala
+ 1311, // Literary Chinese
+ 1328, // Lithuanian
+ 1339, // Lojban
+ 1346, // Lower Sorbian
+ 1360, // Low German
+ 1371, // Luba-Katanga
+ 1384, // Lule Sami
+ 1394, // Luo
+ 1398, // Luxembourgish
+ 1412, // Luyia
+ 1418, // Macedonian
+ 1429, // Machame
+ 1437, // Maithili
+ 1446, // Makhuwa-Meetto
+ 1461, // Makonde
+ 1469, // Malagasy
+ 1478, // Malayalam
+ 1488, // Malay
+ 1494, // Maltese
+ 1502, // Mandingo
+ 1511, // Manipuri
+ 1520, // Manx
+ 1525, // Maori
+ 1532, // Mapuche
+ 1540, // Marathi
+ 1548, // Marshallese
+ 1560, // Masai
+ 1566, // Mazanderani
+ 1578, // Mende
+ 1584, // Meru
+ 1589, // Meta
+ 1596, // Mohawk
+ 1603, // Mongolian
+ 1613, // Morisyen
+ 1622, // Mundang
+ 1630, // Muscogee
+ 1639, // Nama
+ 1644, // Nauru
+ 1650, // Navajo
+ 1657, // Ndonga
+ 1664, // Nepali
+ 1671, // Newari
+ 1678, // Ngiemboon
+ 1688, // Ngomba
+ 1695, // Nigerian Pidgin
+ 1711, // Nko
+ 1718, // Northern Luri
+ 1732, // Northern Sami
+ 1746, // Northern Sotho
+ 1761, // North Ndebele
+ 1775, // Norwegian Bokmal
+ 1793, // Norwegian Nynorsk
+ 1811, // Nuer
+ 1816, // Nyanja
+ 1823, // Nyankole
+ 1832, // Occitan
+ 1840, // Odia
+ 1845, // Ojibwa
+ 1852, // Old Irish
+ 1862, // Old Norse
+ 1872, // Old Persian
+ 1884, // Oromo
+ 1890, // Osage
+ 1896, // Ossetic
+ 1904, // Pahlavi
+ 1912, // Palauan
+ 1920, // Pali
+ 1925, // Papiamento
+ 1936, // Pashto
+ 1943, // Persian
+ 1951, // Phoenician
+ 1962, // Polish
+ 1969, // Portuguese
+ 1980, // Prussian
+ 1989, // Punjabi
+ 1997, // Quechua
+ 2005, // Romanian
+ 2014, // Romansh
+ 2022, // Rombo
+ 2028, // Rundi
+ 2034, // Russian
+ 2042, // Rwa
+ 2046, // Saho
+ 2051, // Sakha
+ 2057, // Samburu
+ 2065, // Samoan
+ 2072, // Sango
+ 2078, // Sangu
+ 2084, // Sanskrit
+ 2093, // Santali
+ 2101, // Sardinian
+ 2111, // Saurashtra
+ 2122, // Sena
+ 2127, // Serbian
+ 2135, // Shambala
+ 2144, // Shona
+ 2150, // Sichuan Yi
+ 2161, // Sicilian
+ 2170, // Sidamo
+ 2177, // Silesian
+ 2186, // Sindhi
+ 2193, // Sinhala
+ 2201, // Skolt Sami
+ 2212, // Slovak
+ 2219, // Slovenian
+ 2229, // Soga
+ 2234, // Somali
+ 2241, // Southern Kurdish
+ 2258, // Southern Sami
+ 2272, // Southern Sotho
+ 2287, // South Ndebele
+ 2301, // Spanish
+ 2309, // Standard Moroccan Tamazight
+ 2337, // Sundanese
+ 2347, // Swahili
+ 2355, // Swati
+ 2361, // Swedish
+ 2369, // Swiss German
+ 2382, // Syriac
+ 2389, // Tachelhit
+ 2399, // Tahitian
+ 2408, // Tai Dam
+ 2416, // Taita
+ 2422, // Tajik
+ 2428, // Tamil
+ 2434, // Taroko
+ 2441, // Tasawaq
+ 2449, // Tatar
+ 2455, // Telugu
+ 2462, // Teso
+ 2467, // Thai
+ 2472, // Tibetan
+ 2480, // Tigre
+ 2486, // Tigrinya
+ 2495, // Tokelau
+ 2503, // Tok Pisin
+ 2513, // Tongan
+ 2520, // Tsonga
+ 2527, // Tswana
+ 2534, // Turkish
+ 2542, // Turkmen
+ 2550, // Tuvalu
+ 2557, // Tyap
+ 2562, // Ugaritic
+ 2571, // Ukrainian
+ 2581, // Upper Sorbian
+ 2595, // Urdu
+ 2600, // Uyghur
+ 2607, // Uzbek
+ 2613, // Vai
+ 2617, // Venda
+ 2623, // Vietnamese
+ 2634, // Volapuk
+ 2643, // Vunjo
+ 2649, // Walloon
+ 2657, // Walser
+ 2664, // Warlpiri
+ 2673, // Welsh
+ 2679, // Western Balochi
+ 2695, // Western Frisian
+ 2711, // Wolaytta
+ 2720, // Wolof
+ 2726, // Xhosa
+ 2732, // Yangben
+ 2740, // Yiddish
+ 2748, // Yoruba
+ 2755, // Zarma
+ 2761, // Zhuang
+ 2768, // Zulu
+ 2773, // Kaingang
+ 2782, // Nheengatu
+ 2792, // Haryanvi
+ 2801, // Northern Frisian
+ 2818, // Rajasthani
+ 2829, // Moksha
+ 2836, // Toki Pona
+ 2846, // Pijin
+ 2852, // Obolo
+ 2858, // Baluchi
+ 2866, // Ligurian
+ 2875, // Rohingya
+ 2884, // Torwali
+ 2892, // Anii
+ 2897, // Kangri
+ 2904, // Venetian
};
-static const char script_name_list[] =
+static constexpr char script_name_list[] =
"Default\0"
"Adlam\0"
"Ahom\0"
@@ -4536,20 +6906,20 @@ static const char script_name_list[] =
"Braille\0"
"Buginese\0"
"Buhid\0"
-"Canadian Aboriginal\0"
+"Unified Canadian Aboriginal Syllabics\0"
"Carian\0"
"Caucasian Albanian\0"
"Chakma\0"
"Cham\0"
"Cherokee\0"
"Coptic\0"
-"Cuneiform\0"
+"Sumero-Akkadian Cuneiform\0"
"Cypriot\0"
"Cyrillic\0"
"Deseret\0"
"Devanagari\0"
-"Duployan\0"
-"Egyptian Hieroglyphs\0"
+"Duployan shorthand\0"
+"Egyptian hieroglyphs\0"
"Elbasan\0"
"Ethiopic\0"
"Fraser\0"
@@ -4608,7 +6978,7 @@ static const char script_name_list[] =
"Nabataean\0"
"Newa\0"
"New Tai Lue\0"
-"Nko\0"
+"N’Ko\0"
"Odia\0"
"Ogham\0"
"Ol Chiki\0"
@@ -4624,7 +6994,7 @@ static const char script_name_list[] =
"Pahawh Hmong\0"
"Palmyrene\0"
"Pau Cin Hau\0"
-"Phags Pa\0"
+"Phags-pa\0"
"Phoenician\0"
"Pollard Phonetic\0"
"Psalter Pahlavi\0"
@@ -4635,7 +7005,7 @@ static const char script_name_list[] =
"Sharada\0"
"Shavian\0"
"Siddham\0"
-"Sign Writing\0"
+"SignWriting\0"
"Simplified Han\0"
"Sinhala\0"
"Sora Sompeng\0"
@@ -4660,9 +7030,10 @@ static const char script_name_list[] =
"Vai\0"
"Varang Kshiti\0"
"Yi\0"
+"Hanifi Rohingya\0"
;
-static const quint16 script_name_index[] = {
+static constexpr quint16 script_name_index[] = {
0, // AnyScript
8, // Adlam
14, // Ahom
@@ -4682,135 +7053,136 @@ static const quint16 script_name_index[] = {
137, // Buginese
146, // Buhid
152, // Canadian Aboriginal
- 172, // Carian
- 179, // Caucasian Albanian
- 198, // Chakma
- 205, // Cham
- 210, // Cherokee
- 219, // Coptic
- 226, // Cuneiform
- 236, // Cypriot
- 244, // Cyrillic
- 253, // Deseret
- 261, // Devanagari
- 272, // Duployan
- 281, // Egyptian Hieroglyphs
- 302, // Elbasan
- 310, // Ethiopic
- 319, // Fraser
- 326, // Georgian
- 335, // Glagolitic
- 346, // Gothic
- 353, // Grantha
- 361, // Greek
- 367, // Gujarati
- 376, // Gurmukhi
- 385, // Hangul
- 392, // Han
- 396, // Hanunoo
- 404, // Han with Bopomofo
- 422, // Hatran
- 429, // Hebrew
- 436, // Hiragana
- 445, // Imperial Aramaic
- 462, // Inscriptional Pahlavi
- 484, // Inscriptional Parthian
- 507, // Jamo
- 512, // Japanese
- 521, // Javanese
- 530, // Kaithi
- 537, // Kannada
- 545, // Katakana
- 554, // Kayah Li
- 563, // Kharoshthi
- 574, // Khmer
- 580, // Khojki
- 587, // Khudawadi
- 597, // Korean
- 604, // Lanna
- 610, // Lao
- 614, // Latin
- 620, // Lepcha
- 627, // Limbu
- 633, // Linear A
- 642, // Linear B
- 651, // Lycian
- 658, // Lydian
- 665, // Mahajani
- 674, // Malayalam
- 684, // Mandaean
- 693, // Manichaean
- 704, // Marchen
- 712, // Meitei Mayek
- 725, // Mende
- 731, // Meroitic Cursive
- 748, // Meroitic
- 757, // Modi
- 762, // Mongolian
- 772, // Mro
- 776, // Multani
- 784, // Myanmar
- 792, // Nabataean
- 802, // Newa
- 807, // New Tai Lue
- 819, // Nko
- 823, // Odia
- 828, // Ogham
- 834, // Ol Chiki
- 843, // Old Hungarian
- 857, // Old Italic
- 868, // Old North Arabian
- 886, // Old Permic
- 897, // Old Persian
- 909, // Old South Arabian
- 927, // Orkhon
- 934, // Osage
- 940, // Osmanya
- 948, // Pahawh Hmong
- 961, // Palmyrene
- 971, // Pau Cin Hau
- 983, // Phags Pa
- 992, // Phoenician
- 1003, // Pollard Phonetic
- 1020, // Psalter Pahlavi
- 1036, // Rejang
- 1043, // Runic
- 1049, // Samaritan
- 1059, // Saurashtra
- 1070, // Sharada
- 1078, // Shavian
- 1086, // Siddham
- 1094, // Sign Writing
- 1107, // Simplified Han
- 1122, // Sinhala
- 1130, // Sora Sompeng
- 1143, // Sundanese
- 1153, // Syloti Nagri
- 1166, // Syriac
- 1173, // Tagalog
- 1181, // Tagbanwa
- 1190, // Tai Le
- 1197, // Tai Viet
- 1206, // Takri
- 1212, // Tamil
- 1218, // Tangut
- 1225, // Telugu
- 1232, // Thaana
- 1239, // Thai
- 1244, // Tibetan
- 1252, // Tifinagh
- 1261, // Tirhuta
- 1269, // Traditional Han
- 1285, // Ugaritic
- 1294, // Vai
- 1298, // Varang Kshiti
- 1312, // Yi
+ 190, // Carian
+ 197, // Caucasian Albanian
+ 216, // Chakma
+ 223, // Cham
+ 228, // Cherokee
+ 237, // Coptic
+ 244, // Cuneiform
+ 270, // Cypriot
+ 278, // Cyrillic
+ 287, // Deseret
+ 295, // Devanagari
+ 306, // Duployan
+ 325, // Egyptian hieroglyphs
+ 346, // Elbasan
+ 354, // Ethiopic
+ 363, // Fraser
+ 370, // Georgian
+ 379, // Glagolitic
+ 390, // Gothic
+ 397, // Grantha
+ 405, // Greek
+ 411, // Gujarati
+ 420, // Gurmukhi
+ 429, // Hangul
+ 436, // Han
+ 440, // Hanunoo
+ 448, // Han with Bopomofo
+ 466, // Hatran
+ 473, // Hebrew
+ 480, // Hiragana
+ 489, // Imperial Aramaic
+ 506, // Inscriptional Pahlavi
+ 528, // Inscriptional Parthian
+ 551, // Jamo
+ 556, // Japanese
+ 565, // Javanese
+ 574, // Kaithi
+ 581, // Kannada
+ 589, // Katakana
+ 598, // Kayah Li
+ 607, // Kharoshthi
+ 618, // Khmer
+ 624, // Khojki
+ 631, // Khudawadi
+ 641, // Korean
+ 648, // Lanna
+ 654, // Lao
+ 658, // Latin
+ 664, // Lepcha
+ 671, // Limbu
+ 677, // Linear A
+ 686, // Linear B
+ 695, // Lycian
+ 702, // Lydian
+ 709, // Mahajani
+ 718, // Malayalam
+ 728, // Mandaean
+ 737, // Manichaean
+ 748, // Marchen
+ 756, // Meitei Mayek
+ 769, // Mende
+ 775, // Meroitic Cursive
+ 792, // Meroitic
+ 801, // Modi
+ 806, // Mongolian
+ 816, // Mro
+ 820, // Multani
+ 828, // Myanmar
+ 836, // Nabataean
+ 846, // Newa
+ 851, // New Tai Lue
+ 863, // Nko
+ 870, // Odia
+ 875, // Ogham
+ 881, // Ol Chiki
+ 890, // Old Hungarian
+ 904, // Old Italic
+ 915, // Old North Arabian
+ 933, // Old Permic
+ 944, // Old Persian
+ 956, // Old South Arabian
+ 974, // Orkhon
+ 981, // Osage
+ 987, // Osmanya
+ 995, // Pahawh Hmong
+ 1008, // Palmyrene
+ 1018, // Pau Cin Hau
+ 1030, // Phags-pa
+ 1039, // Phoenician
+ 1050, // Pollard Phonetic
+ 1067, // Psalter Pahlavi
+ 1083, // Rejang
+ 1090, // Runic
+ 1096, // Samaritan
+ 1106, // Saurashtra
+ 1117, // Sharada
+ 1125, // Shavian
+ 1133, // Siddham
+ 1141, // SignWriting
+ 1153, // Simplified Han
+ 1168, // Sinhala
+ 1176, // Sora Sompeng
+ 1189, // Sundanese
+ 1199, // Syloti Nagri
+ 1212, // Syriac
+ 1219, // Tagalog
+ 1227, // Tagbanwa
+ 1236, // Tai Le
+ 1243, // Tai Viet
+ 1252, // Takri
+ 1258, // Tamil
+ 1264, // Tangut
+ 1271, // Telugu
+ 1278, // Thaana
+ 1285, // Thai
+ 1290, // Tibetan
+ 1298, // Tifinagh
+ 1307, // Tirhuta
+ 1315, // Traditional Han
+ 1331, // Ugaritic
+ 1340, // Vai
+ 1344, // Varang Kshiti
+ 1358, // Yi
+ 1361, // Hanifi
};
-static const char territory_name_list[] =
+static constexpr char territory_name_list[] =
"Default\0"
"Afghanistan\0"
-"Aland Islands\0"
+"Åland Islands\0"
"Albania\0"
"Algeria\0"
"American Samoa\0"
@@ -4818,7 +7190,7 @@ static const char territory_name_list[] =
"Angola\0"
"Anguilla\0"
"Antarctica\0"
-"Antigua And Barbuda\0"
+"Antigua & Barbuda\0"
"Argentina\0"
"Armenia\0"
"Aruba\0"
@@ -4837,7 +7209,7 @@ static const char territory_name_list[] =
"Bermuda\0"
"Bhutan\0"
"Bolivia\0"
-"Bosnia And Herzegovina\0"
+"Bosnia & Herzegovina\0"
"Botswana\0"
"Bouvet Island\0"
"Brazil\0"
@@ -4855,22 +7227,22 @@ static const char territory_name_list[] =
"Caribbean Netherlands\0"
"Cayman Islands\0"
"Central African Republic\0"
-"Ceuta And Melilla\0"
+"Ceuta & Melilla\0"
"Chad\0"
"Chile\0"
"China\0"
"Christmas Island\0"
"Clipperton Island\0"
-"Cocos Islands\0"
+"Cocos (Keeling) Islands\0"
"Colombia\0"
"Comoros\0"
-"Congo Brazzaville\0"
-"Congo Kinshasa\0"
+"Congo - Brazzaville\0"
+"Congo - Kinshasa\0"
"Cook Islands\0"
"Costa Rica\0"
"Croatia\0"
"Cuba\0"
-"Curacao\0"
+"Curaçao\0"
"Cyprus\0"
"Czechia\0"
"Denmark\0"
@@ -4909,13 +7281,13 @@ static const char territory_name_list[] =
"Guam\0"
"Guatemala\0"
"Guernsey\0"
-"Guinea Bissau\0"
+"Guinea-Bissau\0"
"Guinea\0"
"Guyana\0"
"Haiti\0"
-"Heard And McDonald Islands\0"
+"Heard & McDonald Islands\0"
"Honduras\0"
-"Hong Kong\0"
+"Hong Kong SAR China\0"
"Hungary\0"
"Iceland\0"
"India\0"
@@ -4923,10 +7295,10 @@ static const char territory_name_list[] =
"Iran\0"
"Iraq\0"
"Ireland\0"
-"Isle Of Man\0"
+"Isle of Man\0"
"Israel\0"
"Italy\0"
-"Ivory Coast\0"
+"Côte d’Ivoire\0" // Ivory Coast
"Jamaica\0"
"Japan\0"
"Jersey\0"
@@ -4947,8 +7319,8 @@ static const char territory_name_list[] =
"Liechtenstein\0"
"Lithuania\0"
"Luxembourg\0"
-"Macao\0"
-"Macedonia\0"
+"Macao SAR China\0"
+"North Macedonia\0"
"Madagascar\0"
"Malawi\0"
"Malaysia\0"
@@ -4969,7 +7341,7 @@ static const char territory_name_list[] =
"Montserrat\0"
"Morocco\0"
"Mozambique\0"
-"Myanmar\0"
+"Myanmar (Burma)\0"
"Namibia\0"
"Nauru\0"
"Nepal\0"
@@ -4994,25 +7366,25 @@ static const char territory_name_list[] =
"Paraguay\0"
"Peru\0"
"Philippines\0"
-"Pitcairn\0"
+"Pitcairn Islands\0"
"Poland\0"
"Portugal\0"
"Puerto Rico\0"
"Qatar\0"
-"Reunion\0"
+"Réunion\0"
"Romania\0"
"Russia\0"
"Rwanda\0"
-"Saint Barthelemy\0"
-"Saint Helena\0"
-"Saint Kitts And Nevis\0"
-"Saint Lucia\0"
-"Saint Martin\0"
-"Saint Pierre And Miquelon\0"
-"Saint Vincent And Grenadines\0"
+"St. Barthélemy\0"
+"St. Helena\0"
+"St. Kitts & Nevis\0"
+"St. Lucia\0"
+"St. Martin\0"
+"St. Pierre & Miquelon\0"
+"St. Vincent & Grenadines\0"
"Samoa\0"
"San Marino\0"
-"Sao Tome And Principe\0"
+"São Tomé & Príncipe\0"
"Saudi Arabia\0"
"Senegal\0"
"Serbia\0"
@@ -5025,14 +7397,14 @@ static const char territory_name_list[] =
"Solomon Islands\0"
"Somalia\0"
"South Africa\0"
-"South Georgia And South Sandwich Islands\0"
+"South Georgia & South Sandwich Islands\0"
"South Korea\0"
"South Sudan\0"
"Spain\0"
"Sri Lanka\0"
"Sudan\0"
"Suriname\0"
-"Svalbard And Jan Mayen\0"
+"Svalbard & Jan Mayen\0"
"Sweden\0"
"Switzerland\0"
"Syria\0"
@@ -5044,633 +7416,647 @@ static const char territory_name_list[] =
"Togo\0"
"Tokelau\0"
"Tonga\0"
-"Trinidad And Tobago\0"
-"Tristan Da Cunha\0"
+"Trinidad & Tobago\0"
+"Tristan da Cunha\0"
"Tunisia\0"
-"Turkey\0"
+"Türkiye\0" // Turkey
"Turkmenistan\0"
-"Turks And Caicos Islands\0"
+"Turks & Caicos Islands\0"
"Tuvalu\0"
"Uganda\0"
"Ukraine\0"
"United Arab Emirates\0"
"United Kingdom\0"
-"United States Outlying Islands\0"
+"U.S. Outlying Islands\0"
"United States\0"
-"United States Virgin Islands\0"
+"U.S. Virgin Islands\0"
"Uruguay\0"
"Uzbekistan\0"
"Vanuatu\0"
"Vatican City\0"
"Venezuela\0"
"Vietnam\0"
-"Wallis And Futuna\0"
+"Wallis & Futuna\0"
"Western Sahara\0"
-"World\0"
+"world\0"
"Yemen\0"
"Zambia\0"
"Zimbabwe\0"
;
-static const quint16 territory_name_index[] = {
+static constexpr quint16 territory_name_index[] = {
0, // AnyTerritory
8, // Afghanistan
20, // Aland Islands
- 34, // Albania
- 42, // Algeria
- 50, // American Samoa
- 65, // Andorra
- 73, // Angola
- 80, // Anguilla
- 89, // Antarctica
- 100, // Antigua And Barbuda
- 120, // Argentina
- 130, // Armenia
- 138, // Aruba
- 144, // Ascension Island
- 161, // Australia
- 171, // Austria
- 179, // Azerbaijan
- 190, // Bahamas
- 198, // Bahrain
- 206, // Bangladesh
- 217, // Barbados
- 226, // Belarus
- 234, // Belgium
- 242, // Belize
- 249, // Benin
- 255, // Bermuda
- 263, // Bhutan
- 270, // Bolivia
- 278, // Bosnia And Herzegovina
- 301, // Botswana
- 310, // Bouvet Island
- 324, // Brazil
- 331, // British Indian Ocean Territory
- 362, // British Virgin Islands
- 385, // Brunei
- 392, // Bulgaria
- 401, // Burkina Faso
- 414, // Burundi
- 422, // Cambodia
- 431, // Cameroon
- 440, // Canada
- 447, // Canary Islands
- 462, // Cape Verde
- 473, // Caribbean Netherlands
- 495, // Cayman Islands
- 510, // Central African Republic
- 535, // Ceuta And Melilla
- 553, // Chad
- 558, // Chile
- 564, // China
- 570, // Christmas Island
- 587, // Clipperton Island
- 605, // Cocos Islands
- 619, // Colombia
- 628, // Comoros
- 636, // Congo Brazzaville
- 654, // Congo Kinshasa
- 669, // Cook Islands
- 682, // Costa Rica
- 693, // Croatia
- 701, // Cuba
- 706, // Curacao
- 714, // Cyprus
- 721, // Czechia
- 729, // Denmark
- 737, // Diego Garcia
- 750, // Djibouti
- 759, // Dominica
- 768, // Dominican Republic
- 787, // Ecuador
- 795, // Egypt
- 801, // El Salvador
- 813, // Equatorial Guinea
- 831, // Eritrea
- 839, // Estonia
- 847, // Eswatini
- 856, // Ethiopia
- 865, // Europe
- 872, // European Union
- 887, // Falkland Islands
- 904, // Faroe Islands
- 918, // Fiji
- 923, // Finland
- 931, // France
- 938, // French Guiana
- 952, // French Polynesia
- 969, // French Southern Territories
- 997, // Gabon
- 1003, // Gambia
- 1010, // Georgia
- 1018, // Germany
- 1026, // Ghana
- 1032, // Gibraltar
- 1042, // Greece
- 1049, // Greenland
- 1059, // Grenada
- 1067, // Guadeloupe
- 1078, // Guam
- 1083, // Guatemala
- 1093, // Guernsey
- 1102, // Guinea Bissau
- 1116, // Guinea
- 1123, // Guyana
- 1130, // Haiti
- 1136, // Heard And McDonald Islands
- 1163, // Honduras
- 1172, // Hong Kong
- 1182, // Hungary
- 1190, // Iceland
- 1198, // India
- 1204, // Indonesia
- 1214, // Iran
- 1219, // Iraq
- 1224, // Ireland
- 1232, // Isle Of Man
- 1244, // Israel
- 1251, // Italy
- 1257, // Ivory Coast
- 1269, // Jamaica
- 1277, // Japan
- 1283, // Jersey
- 1290, // Jordan
- 1297, // Kazakhstan
- 1308, // Kenya
- 1314, // Kiribati
- 1323, // Kosovo
- 1330, // Kuwait
- 1337, // Kyrgyzstan
- 1348, // Laos
- 1353, // Latin America
- 1367, // Latvia
- 1374, // Lebanon
- 1382, // Lesotho
- 1390, // Liberia
- 1398, // Libya
- 1404, // Liechtenstein
- 1418, // Lithuania
- 1428, // Luxembourg
- 1439, // Macao
- 1445, // Macedonia
- 1455, // Madagascar
- 1466, // Malawi
- 1473, // Malaysia
- 1482, // Maldives
- 1491, // Mali
- 1496, // Malta
- 1502, // Marshall Islands
- 1519, // Martinique
- 1530, // Mauritania
- 1541, // Mauritius
- 1551, // Mayotte
- 1559, // Mexico
- 1566, // Micronesia
- 1577, // Moldova
- 1585, // Monaco
- 1592, // Mongolia
- 1601, // Montenegro
- 1612, // Montserrat
- 1623, // Morocco
- 1631, // Mozambique
- 1642, // Myanmar
- 1650, // Namibia
- 1658, // Nauru
- 1664, // Nepal
- 1670, // Netherlands
- 1682, // New Caledonia
- 1696, // New Zealand
- 1708, // Nicaragua
- 1718, // Nigeria
- 1726, // Niger
- 1732, // Niue
- 1737, // Norfolk Island
- 1752, // Northern Mariana Islands
- 1777, // North Korea
- 1789, // Norway
- 1796, // Oman
- 1801, // Outlying Oceania
- 1818, // Pakistan
- 1827, // Palau
- 1833, // Palestinian Territories
- 1857, // Panama
- 1864, // Papua New Guinea
- 1881, // Paraguay
- 1890, // Peru
- 1895, // Philippines
- 1907, // Pitcairn
- 1916, // Poland
- 1923, // Portugal
- 1932, // Puerto Rico
- 1944, // Qatar
- 1950, // Reunion
- 1958, // Romania
- 1966, // Russia
- 1973, // Rwanda
- 1980, // Saint Barthelemy
- 1997, // Saint Helena
- 2010, // Saint Kitts And Nevis
- 2032, // Saint Lucia
- 2044, // Saint Martin
- 2057, // Saint Pierre And Miquelon
- 2083, // Saint Vincent And Grenadines
- 2112, // Samoa
- 2118, // San Marino
- 2129, // Sao Tome And Principe
- 2151, // Saudi Arabia
- 2164, // Senegal
- 2172, // Serbia
- 2179, // Seychelles
- 2190, // Sierra Leone
- 2203, // Singapore
- 2213, // Sint Maarten
- 2226, // Slovakia
- 2235, // Slovenia
- 2244, // Solomon Islands
- 2260, // Somalia
- 2268, // South Africa
- 2281, // South Georgia And South Sandwich Islands
- 2322, // South Korea
- 2334, // South Sudan
- 2346, // Spain
- 2352, // Sri Lanka
- 2362, // Sudan
- 2368, // Suriname
- 2377, // Svalbard And Jan Mayen
- 2400, // Sweden
- 2407, // Switzerland
- 2419, // Syria
- 2425, // Taiwan
- 2432, // Tajikistan
- 2443, // Tanzania
- 2452, // Thailand
- 2461, // Timor-Leste
- 2473, // Togo
- 2478, // Tokelau
- 2486, // Tonga
- 2492, // Trinidad And Tobago
- 2512, // Tristan Da Cunha
- 2529, // Tunisia
- 2537, // Turkey
- 2544, // Turkmenistan
- 2557, // Turks And Caicos Islands
- 2582, // Tuvalu
- 2589, // Uganda
- 2596, // Ukraine
- 2604, // United Arab Emirates
- 2625, // United Kingdom
- 2640, // United States Outlying Islands
- 2671, // United States
- 2685, // United States Virgin Islands
- 2714, // Uruguay
- 2722, // Uzbekistan
- 2733, // Vanuatu
- 2741, // Vatican City
- 2754, // Venezuela
- 2764, // Vietnam
- 2772, // Wallis And Futuna
- 2790, // Western Sahara
- 2805, // World
- 2811, // Yemen
- 2817, // Zambia
- 2824, // Zimbabwe
+ 35, // Albania
+ 43, // Algeria
+ 51, // American Samoa
+ 66, // Andorra
+ 74, // Angola
+ 81, // Anguilla
+ 90, // Antarctica
+ 101, // Antigua and Barbuda
+ 119, // Argentina
+ 129, // Armenia
+ 137, // Aruba
+ 143, // Ascension Island
+ 160, // Australia
+ 170, // Austria
+ 178, // Azerbaijan
+ 189, // Bahamas
+ 197, // Bahrain
+ 205, // Bangladesh
+ 216, // Barbados
+ 225, // Belarus
+ 233, // Belgium
+ 241, // Belize
+ 248, // Benin
+ 254, // Bermuda
+ 262, // Bhutan
+ 269, // Bolivia
+ 277, // Bosnia and Herzegovina
+ 298, // Botswana
+ 307, // Bouvet Island
+ 321, // Brazil
+ 328, // British Indian Ocean Territory
+ 359, // British Virgin Islands
+ 382, // Brunei
+ 389, // Bulgaria
+ 398, // Burkina Faso
+ 411, // Burundi
+ 419, // Cambodia
+ 428, // Cameroon
+ 437, // Canada
+ 444, // Canary Islands
+ 459, // Cape Verde
+ 470, // Caribbean Netherlands
+ 492, // Cayman Islands
+ 507, // Central African Republic
+ 532, // Ceuta and Melilla
+ 548, // Chad
+ 553, // Chile
+ 559, // China
+ 565, // Christmas Island
+ 582, // Clipperton Island
+ 600, // Cocos Islands
+ 624, // Colombia
+ 633, // Comoros
+ 641, // Congo - Brazzaville
+ 661, // Congo - Kinshasa
+ 678, // Cook Islands
+ 691, // Costa Rica
+ 702, // Croatia
+ 710, // Cuba
+ 715, // Curacao
+ 724, // Cyprus
+ 731, // Czechia
+ 739, // Denmark
+ 747, // Diego Garcia
+ 760, // Djibouti
+ 769, // Dominica
+ 778, // Dominican Republic
+ 797, // Ecuador
+ 805, // Egypt
+ 811, // El Salvador
+ 823, // Equatorial Guinea
+ 841, // Eritrea
+ 849, // Estonia
+ 857, // Eswatini
+ 866, // Ethiopia
+ 875, // Europe
+ 882, // European Union
+ 897, // Falkland Islands
+ 914, // Faroe Islands
+ 928, // Fiji
+ 933, // Finland
+ 941, // France
+ 948, // French Guiana
+ 962, // French Polynesia
+ 979, // French Southern Territories
+ 1007, // Gabon
+ 1013, // Gambia
+ 1020, // Georgia
+ 1028, // Germany
+ 1036, // Ghana
+ 1042, // Gibraltar
+ 1052, // Greece
+ 1059, // Greenland
+ 1069, // Grenada
+ 1077, // Guadeloupe
+ 1088, // Guam
+ 1093, // Guatemala
+ 1103, // Guernsey
+ 1112, // Guinea-Bissau
+ 1126, // Guinea
+ 1133, // Guyana
+ 1140, // Haiti
+ 1146, // Heard and McDonald Islands
+ 1171, // Honduras
+ 1180, // Hong Kong
+ 1200, // Hungary
+ 1208, // Iceland
+ 1216, // India
+ 1222, // Indonesia
+ 1232, // Iran
+ 1237, // Iraq
+ 1242, // Ireland
+ 1250, // Isle of Man
+ 1262, // Israel
+ 1269, // Italy
+ 1275, // Ivory Coast
+ 1292, // Jamaica
+ 1300, // Japan
+ 1306, // Jersey
+ 1313, // Jordan
+ 1320, // Kazakhstan
+ 1331, // Kenya
+ 1337, // Kiribati
+ 1346, // Kosovo
+ 1353, // Kuwait
+ 1360, // Kyrgyzstan
+ 1371, // Laos
+ 1376, // Latin America
+ 1390, // Latvia
+ 1397, // Lebanon
+ 1405, // Lesotho
+ 1413, // Liberia
+ 1421, // Libya
+ 1427, // Liechtenstein
+ 1441, // Lithuania
+ 1451, // Luxembourg
+ 1462, // Macao
+ 1478, // Macedonia
+ 1494, // Madagascar
+ 1505, // Malawi
+ 1512, // Malaysia
+ 1521, // Maldives
+ 1530, // Mali
+ 1535, // Malta
+ 1541, // Marshall Islands
+ 1558, // Martinique
+ 1569, // Mauritania
+ 1580, // Mauritius
+ 1590, // Mayotte
+ 1598, // Mexico
+ 1605, // Micronesia
+ 1616, // Moldova
+ 1624, // Monaco
+ 1631, // Mongolia
+ 1640, // Montenegro
+ 1651, // Montserrat
+ 1662, // Morocco
+ 1670, // Mozambique
+ 1681, // Myanmar
+ 1697, // Namibia
+ 1705, // Nauru
+ 1711, // Nepal
+ 1717, // Netherlands
+ 1729, // New Caledonia
+ 1743, // New Zealand
+ 1755, // Nicaragua
+ 1765, // Nigeria
+ 1773, // Niger
+ 1779, // Niue
+ 1784, // Norfolk Island
+ 1799, // Northern Mariana Islands
+ 1824, // North Korea
+ 1836, // Norway
+ 1843, // Oman
+ 1848, // Outlying Oceania
+ 1865, // Pakistan
+ 1874, // Palau
+ 1880, // Palestinian Territories
+ 1904, // Panama
+ 1911, // Papua New Guinea
+ 1928, // Paraguay
+ 1937, // Peru
+ 1942, // Philippines
+ 1954, // Pitcairn
+ 1971, // Poland
+ 1978, // Portugal
+ 1987, // Puerto Rico
+ 1999, // Qatar
+ 2005, // Reunion
+ 2014, // Romania
+ 2022, // Russia
+ 2029, // Rwanda
+ 2036, // Saint Barthelemy
+ 2052, // Saint Helena
+ 2063, // Saint Kitts and Nevis
+ 2081, // Saint Lucia
+ 2091, // Saint Martin
+ 2102, // Saint Pierre and Miquelon
+ 2124, // Saint Vincent and Grenadines
+ 2149, // Samoa
+ 2155, // San Marino
+ 2166, // Sao Tome and Principe
+ 2189, // Saudi Arabia
+ 2202, // Senegal
+ 2210, // Serbia
+ 2217, // Seychelles
+ 2228, // Sierra Leone
+ 2241, // Singapore
+ 2251, // Sint Maarten
+ 2264, // Slovakia
+ 2273, // Slovenia
+ 2282, // Solomon Islands
+ 2298, // Somalia
+ 2306, // South Africa
+ 2319, // South Georgia and South Sandwich Islands
+ 2358, // South Korea
+ 2370, // South Sudan
+ 2382, // Spain
+ 2388, // Sri Lanka
+ 2398, // Sudan
+ 2404, // Suriname
+ 2413, // Svalbard and Jan Mayen
+ 2434, // Sweden
+ 2441, // Switzerland
+ 2453, // Syria
+ 2459, // Taiwan
+ 2466, // Tajikistan
+ 2477, // Tanzania
+ 2486, // Thailand
+ 2495, // Timor-Leste
+ 2507, // Togo
+ 2512, // Tokelau
+ 2520, // Tonga
+ 2526, // Trinidad and Tobago
+ 2544, // Tristan da Cunha
+ 2561, // Tunisia
+ 2569, // Turkey
+ 2578, // Turkmenistan
+ 2591, // Turks and Caicos Islands
+ 2614, // Tuvalu
+ 2621, // Uganda
+ 2628, // Ukraine
+ 2636, // United Arab Emirates
+ 2657, // United Kingdom
+ 2672, // United States Outlying Islands
+ 2694, // United States
+ 2708, // United States Virgin Islands
+ 2728, // Uruguay
+ 2736, // Uzbekistan
+ 2747, // Vanuatu
+ 2755, // Vatican City
+ 2768, // Venezuela
+ 2778, // Vietnam
+ 2786, // Wallis and Futuna
+ 2802, // Western Sahara
+ 2817, // world
+ 2823, // Yemen
+ 2829, // Zambia
+ 2836, // Zimbabwe
};
-static const unsigned char language_code_list[] =
-" \0" // AnyLanguage
-" \0" // C
-"ab\0" // Abkhazian
-"aa\0" // Afar
-"af\0" // Afrikaans
-"agq" // Aghem
-"ak\0" // Akan
-"akk" // Akkadian
-"bss" // Akoose
-"sq\0" // Albanian
-"ase" // American Sign Language
-"am\0" // Amharic
-"egy" // Ancient Egyptian
-"grc" // Ancient Greek
-"ar\0" // Arabic
-"an\0" // Aragonese
-"arc" // Aramaic
-"hy\0" // Armenian
-"as\0" // Assamese
-"ast" // Asturian
-"asa" // Asu
-"cch" // Atsam
-"av\0" // Avaric
-"ae\0" // Avestan
-"ay\0" // Aymara
-"az\0" // Azerbaijani
-"ksf" // Bafia
-"ban" // Balinese
-"bm\0" // Bambara
-"bax" // Bamun
-"bn\0" // Bangla
-"bas" // Basaa
-"ba\0" // Bashkir
-"eu\0" // Basque
-"bbc" // Batak Toba
-"be\0" // Belarusian
-"bem" // Bemba
-"bez" // Bena
-"bho" // Bhojpuri
-"bi\0" // Bislama
-"byn" // Blin
-"brx" // Bodo
-"bs\0" // Bosnian
-"br\0" // Breton
-"bug" // Buginese
-"bg\0" // Bulgarian
-"my\0" // Burmese
-"yue" // Cantonese
-"ca\0" // Catalan
-"ceb" // Cebuano
-"tzm" // Central Atlas Tamazight
-"ckb" // Central Kurdish
-"ccp" // Chakma
-"ch\0" // Chamorro
-"ce\0" // Chechen
-"chr" // Cherokee
-"cic" // Chickasaw
-"cgg" // Chiga
-"zh\0" // Chinese
-"cu\0" // Church
-"cv\0" // Chuvash
-"ksh" // Colognian
-"cop" // Coptic
-"kw\0" // Cornish
-"co\0" // Corsican
-"cr\0" // Cree
-"hr\0" // Croatian
-"cs\0" // Czech
-"da\0" // Danish
-"dv\0" // Divehi
-"doi" // Dogri
-"dua" // Duala
-"nl\0" // Dutch
-"dz\0" // Dzongkha
-"ebu" // Embu
-"en\0" // English
-"myv" // Erzya
-"eo\0" // Esperanto
-"et\0" // Estonian
-"ee\0" // Ewe
-"ewo" // Ewondo
-"fo\0" // Faroese
-"fj\0" // Fijian
-"fil" // Filipino
-"fi\0" // Finnish
-"fr\0" // French
-"fur" // Friulian
-"ff\0" // Fulah
-"gd\0" // Gaelic
-"gaa" // Ga
-"gl\0" // Galician
-"lg\0" // Ganda
-"gez" // Geez
-"ka\0" // Georgian
-"de\0" // German
-"got" // Gothic
-"el\0" // Greek
-"gn\0" // Guarani
-"gu\0" // Gujarati
-"guz" // Gusii
-"ht\0" // Haitian
-"ha\0" // Hausa
-"haw" // Hawaiian
-"he\0" // Hebrew
-"hz\0" // Herero
-"hi\0" // Hindi
-"ho\0" // Hiri Motu
-"hu\0" // Hungarian
-"is\0" // Icelandic
-"io\0" // Ido
-"ig\0" // Igbo
-"smn" // Inari Sami
-"id\0" // Indonesian
-"inh" // Ingush
-"ia\0" // Interlingua
-"ie\0" // Interlingue
-"iu\0" // Inuktitut
-"ik\0" // Inupiaq
-"ga\0" // Irish
-"it\0" // Italian
-"ja\0" // Japanese
-"jv\0" // Javanese
-"kaj" // Jju
-"dyo" // Jola Fonyi
-"kea" // Kabuverdianu
-"kab" // Kabyle
-"kkj" // Kako
-"kl\0" // Kalaallisut
-"kln" // Kalenjin
-"kam" // Kamba
-"kn\0" // Kannada
-"kr\0" // Kanuri
-"ks\0" // Kashmiri
-"kk\0" // Kazakh
-"ken" // Kenyang
-"km\0" // Khmer
-"quc" // Kiche
-"ki\0" // Kikuyu
-"rw\0" // Kinyarwanda
-"kv\0" // Komi
-"kg\0" // Kongo
-"kok" // Konkani
-"ko\0" // Korean
-"kfo" // Koro
-"ses" // Koyraboro Senni
-"khq" // Koyra Chiini
-"kpe" // Kpelle
-"kj\0" // Kuanyama
-"ku\0" // Kurdish
-"nmg" // Kwasio
-"ky\0" // Kyrgyz
-"lkt" // Lakota
-"lag" // Langi
-"lo\0" // Lao
-"la\0" // Latin
-"lv\0" // Latvian
-"lez" // Lezghian
-"li\0" // Limburgish
-"ln\0" // Lingala
-"lzh" // Literary Chinese
-"lt\0" // Lithuanian
-"jbo" // Lojban
-"dsb" // Lower Sorbian
-"nds" // Low German
-"lu\0" // Luba Katanga
-"smj" // Lule Sami
-"luo" // Luo
-"lb\0" // Luxembourgish
-"luy" // Luyia
-"mk\0" // Macedonian
-"jmc" // Machame
-"mai" // Maithili
-"mgh" // Makhuwa Meetto
-"kde" // Makonde
-"mg\0" // Malagasy
-"ml\0" // Malayalam
-"ms\0" // Malay
-"mt\0" // Maltese
-"man" // Mandingo
-"mni" // Manipuri
-"gv\0" // Manx
-"mi\0" // Maori
-"arn" // Mapuche
-"mr\0" // Marathi
-"mh\0" // Marshallese
-"mas" // Masai
-"mzn" // Mazanderani
-"men" // Mende
-"mer" // Meru
-"mgo" // Meta
-"moh" // Mohawk
-"mn\0" // Mongolian
-"mfe" // Morisyen
-"mua" // Mundang
-"mus" // Muscogee
-"naq" // Nama
-"na\0" // Nauru
-"nv\0" // Navajo
-"ng\0" // Ndonga
-"ne\0" // Nepali
-"new" // Newari
-"nnh" // Ngiemboon
-"jgo" // Ngomba
-"pcm" // Nigerian Pidgin
-"nqo" // Nko
-"lrc" // Northern Luri
-"se\0" // Northern Sami
-"nso" // Northern Sotho
-"nd\0" // North Ndebele
-"nb\0" // Norwegian Bokmal
-"nn\0" // Norwegian Nynorsk
-"nus" // Nuer
-"ny\0" // Nyanja
-"nyn" // Nyankole
-"oc\0" // Occitan
-"or\0" // Odia
-"oj\0" // Ojibwa
-"sga" // Old Irish
-"non" // Old Norse
-"peo" // Old Persian
-"om\0" // Oromo
-"osa" // Osage
-"os\0" // Ossetic
-"pal" // Pahlavi
-"pau" // Palauan
-"pi\0" // Pali
-"pap" // Papiamento
-"ps\0" // Pashto
-"fa\0" // Persian
-"phn" // Phoenician
-"pl\0" // Polish
-"pt\0" // Portuguese
-"prg" // Prussian
-"pa\0" // Punjabi
-"qu\0" // Quechua
-"ro\0" // Romanian
-"rm\0" // Romansh
-"rof" // Rombo
-"rn\0" // Rundi
-"ru\0" // Russian
-"rwk" // Rwa
-"ssy" // Saho
-"sah" // Sakha
-"saq" // Samburu
-"sm\0" // Samoan
-"sg\0" // Sango
-"sbp" // Sangu
-"sa\0" // Sanskrit
-"sat" // Santali
-"sc\0" // Sardinian
-"saz" // Saurashtra
-"seh" // Sena
-"sr\0" // Serbian
-"ksb" // Shambala
-"sn\0" // Shona
-"ii\0" // Sichuan Yi
-"scn" // Sicilian
-"sid" // Sidamo
-"szl" // Silesian
-"sd\0" // Sindhi
-"si\0" // Sinhala
-"sms" // Skolt Sami
-"sk\0" // Slovak
-"sl\0" // Slovenian
-"xog" // Soga
-"so\0" // Somali
-"sdh" // Southern Kurdish
-"sma" // Southern Sami
-"st\0" // Southern Sotho
-"nr\0" // South Ndebele
-"es\0" // Spanish
-"zgh" // Standard Moroccan Tamazight
-"su\0" // Sundanese
-"sw\0" // Swahili
-"ss\0" // Swati
-"sv\0" // Swedish
-"gsw" // Swiss German
-"syr" // Syriac
-"shi" // Tachelhit
-"ty\0" // Tahitian
-"blt" // Tai Dam
-"dav" // Taita
-"tg\0" // Tajik
-"ta\0" // Tamil
-"trv" // Taroko
-"twq" // Tasawaq
-"tt\0" // Tatar
-"te\0" // Telugu
-"teo" // Teso
-"th\0" // Thai
-"bo\0" // Tibetan
-"tig" // Tigre
-"ti\0" // Tigrinya
-"tkl" // Tokelau
-"tpi" // Tok Pisin
-"to\0" // Tongan
-"ts\0" // Tsonga
-"tn\0" // Tswana
-"tr\0" // Turkish
-"tk\0" // Turkmen
-"tvl" // Tuvalu
-"kcg" // Tyap
-"uga" // Ugaritic
-"uk\0" // Ukrainian
-"hsb" // Upper Sorbian
-"ur\0" // Urdu
-"ug\0" // Uyghur
-"uz\0" // Uzbek
-"vai" // Vai
-"ve\0" // Venda
-"vi\0" // Vietnamese
-"vo\0" // Volapuk
-"vun" // Vunjo
-"wa\0" // Walloon
-"wae" // Walser
-"wbp" // Warlpiri
-"cy\0" // Welsh
-"bgn" // Western Balochi
-"fy\0" // Western Frisian
-"wal" // Wolaytta
-"wo\0" // Wolof
-"xh\0" // Xhosa
-"yav" // Yangben
-"yi\0" // Yiddish
-"yo\0" // Yoruba
-"dje" // Zarma
-"za\0" // Zhuang
-"zu\0" // Zulu
-"kgp" // Kaingang
-"yrl" // Nheengatu
-;
+constexpr std::array<LanguageCodeEntry, 344> languageCodeList {
+ LanguageCodeEntry {{}, {'u', 'n', 'd'}, {'u', 'n', 'd'}, {'u', 'n', 'd'}}, // AnyLanguage
+ LanguageCodeEntry {{}, {'u', 'n', 'd'}, {'u', 'n', 'd'}, {'u', 'n', 'd'}}, // C
+ LanguageCodeEntry {{'a', 'b'}, {'a', 'b', 'k'}, {'a', 'b', 'k'}, {'a', 'b', 'k'}}, // Abkhazian
+ LanguageCodeEntry {{'a', 'a'}, {'a', 'a', 'r'}, {'a', 'a', 'r'}, {'a', 'a', 'r'}}, // Afar
+ LanguageCodeEntry {{'a', 'f'}, {'a', 'f', 'r'}, {'a', 'f', 'r'}, {'a', 'f', 'r'}}, // Afrikaans
+ LanguageCodeEntry {{}, {}, {}, {'a', 'g', 'q'}}, // Aghem
+ LanguageCodeEntry {{'a', 'k'}, {'a', 'k', 'a'}, {'a', 'k', 'a'}, {'a', 'k', 'a'}}, // Akan
+ LanguageCodeEntry {{}, {'a', 'k', 'k'}, {'a', 'k', 'k'}, {'a', 'k', 'k'}}, // Akkadian
+ LanguageCodeEntry {{}, {}, {}, {'b', 's', 's'}}, // Akoose
+ LanguageCodeEntry {{'s', 'q'}, {'a', 'l', 'b'}, {'s', 'q', 'i'}, {'s', 'q', 'i'}}, // Albanian
+ LanguageCodeEntry {{}, {}, {}, {'a', 's', 'e'}}, // American Sign Language
+ LanguageCodeEntry {{'a', 'm'}, {'a', 'm', 'h'}, {'a', 'm', 'h'}, {'a', 'm', 'h'}}, // Amharic
+ LanguageCodeEntry {{}, {'e', 'g', 'y'}, {'e', 'g', 'y'}, {'e', 'g', 'y'}}, // Ancient Egyptian
+ LanguageCodeEntry {{}, {'g', 'r', 'c'}, {'g', 'r', 'c'}, {'g', 'r', 'c'}}, // Ancient Greek
+ LanguageCodeEntry {{'a', 'r'}, {'a', 'r', 'a'}, {'a', 'r', 'a'}, {'a', 'r', 'a'}}, // Arabic
+ LanguageCodeEntry {{'a', 'n'}, {'a', 'r', 'g'}, {'a', 'r', 'g'}, {'a', 'r', 'g'}}, // Aragonese
+ LanguageCodeEntry {{}, {'a', 'r', 'c'}, {'a', 'r', 'c'}, {'a', 'r', 'c'}}, // Aramaic
+ LanguageCodeEntry {{'h', 'y'}, {'a', 'r', 'm'}, {'h', 'y', 'e'}, {'h', 'y', 'e'}}, // Armenian
+ LanguageCodeEntry {{'a', 's'}, {'a', 's', 'm'}, {'a', 's', 'm'}, {'a', 's', 'm'}}, // Assamese
+ LanguageCodeEntry {{}, {'a', 's', 't'}, {'a', 's', 't'}, {'a', 's', 't'}}, // Asturian
+ LanguageCodeEntry {{}, {}, {}, {'a', 's', 'a'}}, // Asu
+ LanguageCodeEntry {{}, {}, {}, {'c', 'c', 'h'}}, // Atsam
+ LanguageCodeEntry {{'a', 'v'}, {'a', 'v', 'a'}, {'a', 'v', 'a'}, {'a', 'v', 'a'}}, // Avaric
+ LanguageCodeEntry {{'a', 'e'}, {'a', 'v', 'e'}, {'a', 'v', 'e'}, {'a', 'v', 'e'}}, // Avestan
+ LanguageCodeEntry {{'a', 'y'}, {'a', 'y', 'm'}, {'a', 'y', 'm'}, {'a', 'y', 'm'}}, // Aymara
+ LanguageCodeEntry {{'a', 'z'}, {'a', 'z', 'e'}, {'a', 'z', 'e'}, {'a', 'z', 'e'}}, // Azerbaijani
+ LanguageCodeEntry {{}, {}, {}, {'k', 's', 'f'}}, // Bafia
+ LanguageCodeEntry {{}, {'b', 'a', 'n'}, {'b', 'a', 'n'}, {'b', 'a', 'n'}}, // Balinese
+ LanguageCodeEntry {{'b', 'm'}, {'b', 'a', 'm'}, {'b', 'a', 'm'}, {'b', 'a', 'm'}}, // Bambara
+ LanguageCodeEntry {{}, {}, {}, {'b', 'a', 'x'}}, // Bamun
+ LanguageCodeEntry {{'b', 'n'}, {'b', 'e', 'n'}, {'b', 'e', 'n'}, {'b', 'e', 'n'}}, // Bangla
+ LanguageCodeEntry {{}, {'b', 'a', 's'}, {'b', 'a', 's'}, {'b', 'a', 's'}}, // Basaa
+ LanguageCodeEntry {{'b', 'a'}, {'b', 'a', 'k'}, {'b', 'a', 'k'}, {'b', 'a', 'k'}}, // Bashkir
+ LanguageCodeEntry {{'e', 'u'}, {'b', 'a', 'q'}, {'e', 'u', 's'}, {'e', 'u', 's'}}, // Basque
+ LanguageCodeEntry {{}, {}, {}, {'b', 'b', 'c'}}, // Batak Toba
+ LanguageCodeEntry {{'b', 'e'}, {'b', 'e', 'l'}, {'b', 'e', 'l'}, {'b', 'e', 'l'}}, // Belarusian
+ LanguageCodeEntry {{}, {'b', 'e', 'm'}, {'b', 'e', 'm'}, {'b', 'e', 'm'}}, // Bemba
+ LanguageCodeEntry {{}, {}, {}, {'b', 'e', 'z'}}, // Bena
+ LanguageCodeEntry {{}, {'b', 'h', 'o'}, {'b', 'h', 'o'}, {'b', 'h', 'o'}}, // Bhojpuri
+ LanguageCodeEntry {{'b', 'i'}, {'b', 'i', 's'}, {'b', 'i', 's'}, {'b', 'i', 's'}}, // Bislama
+ LanguageCodeEntry {{}, {'b', 'y', 'n'}, {'b', 'y', 'n'}, {'b', 'y', 'n'}}, // Blin
+ LanguageCodeEntry {{}, {}, {}, {'b', 'r', 'x'}}, // Bodo
+ LanguageCodeEntry {{'b', 's'}, {'b', 'o', 's'}, {'b', 'o', 's'}, {'b', 'o', 's'}}, // Bosnian
+ LanguageCodeEntry {{'b', 'r'}, {'b', 'r', 'e'}, {'b', 'r', 'e'}, {'b', 'r', 'e'}}, // Breton
+ LanguageCodeEntry {{}, {'b', 'u', 'g'}, {'b', 'u', 'g'}, {'b', 'u', 'g'}}, // Buginese
+ LanguageCodeEntry {{'b', 'g'}, {'b', 'u', 'l'}, {'b', 'u', 'l'}, {'b', 'u', 'l'}}, // Bulgarian
+ LanguageCodeEntry {{'m', 'y'}, {'b', 'u', 'r'}, {'m', 'y', 'a'}, {'m', 'y', 'a'}}, // Burmese
+ LanguageCodeEntry {{}, {}, {}, {'y', 'u', 'e'}}, // Cantonese
+ LanguageCodeEntry {{'c', 'a'}, {'c', 'a', 't'}, {'c', 'a', 't'}, {'c', 'a', 't'}}, // Catalan
+ LanguageCodeEntry {{}, {'c', 'e', 'b'}, {'c', 'e', 'b'}, {'c', 'e', 'b'}}, // Cebuano
+ LanguageCodeEntry {{}, {}, {}, {'t', 'z', 'm'}}, // Central Atlas Tamazight
+ LanguageCodeEntry {{}, {}, {}, {'c', 'k', 'b'}}, // Central Kurdish
+ LanguageCodeEntry {{}, {}, {}, {'c', 'c', 'p'}}, // Chakma
+ LanguageCodeEntry {{'c', 'h'}, {'c', 'h', 'a'}, {'c', 'h', 'a'}, {'c', 'h', 'a'}}, // Chamorro
+ LanguageCodeEntry {{'c', 'e'}, {'c', 'h', 'e'}, {'c', 'h', 'e'}, {'c', 'h', 'e'}}, // Chechen
+ LanguageCodeEntry {{}, {'c', 'h', 'r'}, {'c', 'h', 'r'}, {'c', 'h', 'r'}}, // Cherokee
+ LanguageCodeEntry {{}, {}, {}, {'c', 'i', 'c'}}, // Chickasaw
+ LanguageCodeEntry {{}, {}, {}, {'c', 'g', 'g'}}, // Chiga
+ LanguageCodeEntry {{'z', 'h'}, {'c', 'h', 'i'}, {'z', 'h', 'o'}, {'z', 'h', 'o'}}, // Chinese
+ LanguageCodeEntry {{'c', 'u'}, {'c', 'h', 'u'}, {'c', 'h', 'u'}, {'c', 'h', 'u'}}, // Church
+ LanguageCodeEntry {{'c', 'v'}, {'c', 'h', 'v'}, {'c', 'h', 'v'}, {'c', 'h', 'v'}}, // Chuvash
+ LanguageCodeEntry {{}, {}, {}, {'k', 's', 'h'}}, // Colognian
+ LanguageCodeEntry {{}, {'c', 'o', 'p'}, {'c', 'o', 'p'}, {'c', 'o', 'p'}}, // Coptic
+ LanguageCodeEntry {{'k', 'w'}, {'c', 'o', 'r'}, {'c', 'o', 'r'}, {'c', 'o', 'r'}}, // Cornish
+ LanguageCodeEntry {{'c', 'o'}, {'c', 'o', 's'}, {'c', 'o', 's'}, {'c', 'o', 's'}}, // Corsican
+ LanguageCodeEntry {{'c', 'r'}, {'c', 'r', 'e'}, {'c', 'r', 'e'}, {'c', 'r', 'e'}}, // Cree
+ LanguageCodeEntry {{'h', 'r'}, {'h', 'r', 'v'}, {'h', 'r', 'v'}, {'h', 'r', 'v'}}, // Croatian
+ LanguageCodeEntry {{'c', 's'}, {'c', 'z', 'e'}, {'c', 'e', 's'}, {'c', 'e', 's'}}, // Czech
+ LanguageCodeEntry {{'d', 'a'}, {'d', 'a', 'n'}, {'d', 'a', 'n'}, {'d', 'a', 'n'}}, // Danish
+ LanguageCodeEntry {{'d', 'v'}, {'d', 'i', 'v'}, {'d', 'i', 'v'}, {'d', 'i', 'v'}}, // Divehi
+ LanguageCodeEntry {{}, {'d', 'o', 'i'}, {'d', 'o', 'i'}, {'d', 'o', 'i'}}, // Dogri
+ LanguageCodeEntry {{}, {'d', 'u', 'a'}, {'d', 'u', 'a'}, {'d', 'u', 'a'}}, // Duala
+ LanguageCodeEntry {{'n', 'l'}, {'d', 'u', 't'}, {'n', 'l', 'd'}, {'n', 'l', 'd'}}, // Dutch
+ LanguageCodeEntry {{'d', 'z'}, {'d', 'z', 'o'}, {'d', 'z', 'o'}, {'d', 'z', 'o'}}, // Dzongkha
+ LanguageCodeEntry {{}, {}, {}, {'e', 'b', 'u'}}, // Embu
+ LanguageCodeEntry {{'e', 'n'}, {'e', 'n', 'g'}, {'e', 'n', 'g'}, {'e', 'n', 'g'}}, // English
+ LanguageCodeEntry {{}, {'m', 'y', 'v'}, {'m', 'y', 'v'}, {'m', 'y', 'v'}}, // Erzya
+ LanguageCodeEntry {{'e', 'o'}, {'e', 'p', 'o'}, {'e', 'p', 'o'}, {'e', 'p', 'o'}}, // Esperanto
+ LanguageCodeEntry {{'e', 't'}, {'e', 's', 't'}, {'e', 's', 't'}, {'e', 's', 't'}}, // Estonian
+ LanguageCodeEntry {{'e', 'e'}, {'e', 'w', 'e'}, {'e', 'w', 'e'}, {'e', 'w', 'e'}}, // Ewe
+ LanguageCodeEntry {{}, {'e', 'w', 'o'}, {'e', 'w', 'o'}, {'e', 'w', 'o'}}, // Ewondo
+ LanguageCodeEntry {{'f', 'o'}, {'f', 'a', 'o'}, {'f', 'a', 'o'}, {'f', 'a', 'o'}}, // Faroese
+ LanguageCodeEntry {{'f', 'j'}, {'f', 'i', 'j'}, {'f', 'i', 'j'}, {'f', 'i', 'j'}}, // Fijian
+ LanguageCodeEntry {{}, {'f', 'i', 'l'}, {'f', 'i', 'l'}, {'f', 'i', 'l'}}, // Filipino
+ LanguageCodeEntry {{'f', 'i'}, {'f', 'i', 'n'}, {'f', 'i', 'n'}, {'f', 'i', 'n'}}, // Finnish
+ LanguageCodeEntry {{'f', 'r'}, {'f', 'r', 'e'}, {'f', 'r', 'a'}, {'f', 'r', 'a'}}, // French
+ LanguageCodeEntry {{}, {'f', 'u', 'r'}, {'f', 'u', 'r'}, {'f', 'u', 'r'}}, // Friulian
+ LanguageCodeEntry {{'f', 'f'}, {'f', 'u', 'l'}, {'f', 'u', 'l'}, {'f', 'u', 'l'}}, // Fulah
+ LanguageCodeEntry {{'g', 'd'}, {'g', 'l', 'a'}, {'g', 'l', 'a'}, {'g', 'l', 'a'}}, // Gaelic
+ LanguageCodeEntry {{}, {'g', 'a', 'a'}, {'g', 'a', 'a'}, {'g', 'a', 'a'}}, // Ga
+ LanguageCodeEntry {{'g', 'l'}, {'g', 'l', 'g'}, {'g', 'l', 'g'}, {'g', 'l', 'g'}}, // Galician
+ LanguageCodeEntry {{'l', 'g'}, {'l', 'u', 'g'}, {'l', 'u', 'g'}, {'l', 'u', 'g'}}, // Ganda
+ LanguageCodeEntry {{}, {'g', 'e', 'z'}, {'g', 'e', 'z'}, {'g', 'e', 'z'}}, // Geez
+ LanguageCodeEntry {{'k', 'a'}, {'g', 'e', 'o'}, {'k', 'a', 't'}, {'k', 'a', 't'}}, // Georgian
+ LanguageCodeEntry {{'d', 'e'}, {'g', 'e', 'r'}, {'d', 'e', 'u'}, {'d', 'e', 'u'}}, // German
+ LanguageCodeEntry {{}, {'g', 'o', 't'}, {'g', 'o', 't'}, {'g', 'o', 't'}}, // Gothic
+ LanguageCodeEntry {{'e', 'l'}, {'g', 'r', 'e'}, {'e', 'l', 'l'}, {'e', 'l', 'l'}}, // Greek
+ LanguageCodeEntry {{'g', 'n'}, {'g', 'r', 'n'}, {'g', 'r', 'n'}, {'g', 'r', 'n'}}, // Guarani
+ LanguageCodeEntry {{'g', 'u'}, {'g', 'u', 'j'}, {'g', 'u', 'j'}, {'g', 'u', 'j'}}, // Gujarati
+ LanguageCodeEntry {{}, {}, {}, {'g', 'u', 'z'}}, // Gusii
+ LanguageCodeEntry {{'h', 't'}, {'h', 'a', 't'}, {'h', 'a', 't'}, {'h', 'a', 't'}}, // Haitian
+ LanguageCodeEntry {{'h', 'a'}, {'h', 'a', 'u'}, {'h', 'a', 'u'}, {'h', 'a', 'u'}}, // Hausa
+ LanguageCodeEntry {{}, {'h', 'a', 'w'}, {'h', 'a', 'w'}, {'h', 'a', 'w'}}, // Hawaiian
+ LanguageCodeEntry {{'h', 'e'}, {'h', 'e', 'b'}, {'h', 'e', 'b'}, {'h', 'e', 'b'}}, // Hebrew
+ LanguageCodeEntry {{'h', 'z'}, {'h', 'e', 'r'}, {'h', 'e', 'r'}, {'h', 'e', 'r'}}, // Herero
+ LanguageCodeEntry {{'h', 'i'}, {'h', 'i', 'n'}, {'h', 'i', 'n'}, {'h', 'i', 'n'}}, // Hindi
+ LanguageCodeEntry {{'h', 'o'}, {'h', 'm', 'o'}, {'h', 'm', 'o'}, {'h', 'm', 'o'}}, // Hiri Motu
+ LanguageCodeEntry {{'h', 'u'}, {'h', 'u', 'n'}, {'h', 'u', 'n'}, {'h', 'u', 'n'}}, // Hungarian
+ LanguageCodeEntry {{'i', 's'}, {'i', 'c', 'e'}, {'i', 's', 'l'}, {'i', 's', 'l'}}, // Icelandic
+ LanguageCodeEntry {{'i', 'o'}, {'i', 'd', 'o'}, {'i', 'd', 'o'}, {'i', 'd', 'o'}}, // Ido
+ LanguageCodeEntry {{'i', 'g'}, {'i', 'b', 'o'}, {'i', 'b', 'o'}, {'i', 'b', 'o'}}, // Igbo
+ LanguageCodeEntry {{}, {'s', 'm', 'n'}, {'s', 'm', 'n'}, {'s', 'm', 'n'}}, // Inari Sami
+ LanguageCodeEntry {{'i', 'd'}, {'i', 'n', 'd'}, {'i', 'n', 'd'}, {'i', 'n', 'd'}}, // Indonesian
+ LanguageCodeEntry {{}, {'i', 'n', 'h'}, {'i', 'n', 'h'}, {'i', 'n', 'h'}}, // Ingush
+ LanguageCodeEntry {{'i', 'a'}, {'i', 'n', 'a'}, {'i', 'n', 'a'}, {'i', 'n', 'a'}}, // Interlingua
+ LanguageCodeEntry {{'i', 'e'}, {'i', 'l', 'e'}, {'i', 'l', 'e'}, {'i', 'l', 'e'}}, // Interlingue
+ LanguageCodeEntry {{'i', 'u'}, {'i', 'k', 'u'}, {'i', 'k', 'u'}, {'i', 'k', 'u'}}, // Inuktitut
+ LanguageCodeEntry {{'i', 'k'}, {'i', 'p', 'k'}, {'i', 'p', 'k'}, {'i', 'p', 'k'}}, // Inupiaq
+ LanguageCodeEntry {{'g', 'a'}, {'g', 'l', 'e'}, {'g', 'l', 'e'}, {'g', 'l', 'e'}}, // Irish
+ LanguageCodeEntry {{'i', 't'}, {'i', 't', 'a'}, {'i', 't', 'a'}, {'i', 't', 'a'}}, // Italian
+ LanguageCodeEntry {{'j', 'a'}, {'j', 'p', 'n'}, {'j', 'p', 'n'}, {'j', 'p', 'n'}}, // Japanese
+ LanguageCodeEntry {{'j', 'v'}, {'j', 'a', 'v'}, {'j', 'a', 'v'}, {'j', 'a', 'v'}}, // Javanese
+ LanguageCodeEntry {{}, {}, {}, {'k', 'a', 'j'}}, // Jju
+ LanguageCodeEntry {{}, {}, {}, {'d', 'y', 'o'}}, // Jola-Fonyi
+ LanguageCodeEntry {{}, {}, {}, {'k', 'e', 'a'}}, // Kabuverdianu
+ LanguageCodeEntry {{}, {'k', 'a', 'b'}, {'k', 'a', 'b'}, {'k', 'a', 'b'}}, // Kabyle
+ LanguageCodeEntry {{}, {}, {}, {'k', 'k', 'j'}}, // Kako
+ LanguageCodeEntry {{'k', 'l'}, {'k', 'a', 'l'}, {'k', 'a', 'l'}, {'k', 'a', 'l'}}, // Kalaallisut
+ LanguageCodeEntry {{}, {}, {}, {'k', 'l', 'n'}}, // Kalenjin
+ LanguageCodeEntry {{}, {'k', 'a', 'm'}, {'k', 'a', 'm'}, {'k', 'a', 'm'}}, // Kamba
+ LanguageCodeEntry {{'k', 'n'}, {'k', 'a', 'n'}, {'k', 'a', 'n'}, {'k', 'a', 'n'}}, // Kannada
+ LanguageCodeEntry {{'k', 'r'}, {'k', 'a', 'u'}, {'k', 'a', 'u'}, {'k', 'a', 'u'}}, // Kanuri
+ LanguageCodeEntry {{'k', 's'}, {'k', 'a', 's'}, {'k', 'a', 's'}, {'k', 'a', 's'}}, // Kashmiri
+ LanguageCodeEntry {{'k', 'k'}, {'k', 'a', 'z'}, {'k', 'a', 'z'}, {'k', 'a', 'z'}}, // Kazakh
+ LanguageCodeEntry {{}, {}, {}, {'k', 'e', 'n'}}, // Kenyang
+ LanguageCodeEntry {{'k', 'm'}, {'k', 'h', 'm'}, {'k', 'h', 'm'}, {'k', 'h', 'm'}}, // Khmer
+ LanguageCodeEntry {{}, {}, {}, {'q', 'u', 'c'}}, // Kiche
+ LanguageCodeEntry {{'k', 'i'}, {'k', 'i', 'k'}, {'k', 'i', 'k'}, {'k', 'i', 'k'}}, // Kikuyu
+ LanguageCodeEntry {{'r', 'w'}, {'k', 'i', 'n'}, {'k', 'i', 'n'}, {'k', 'i', 'n'}}, // Kinyarwanda
+ LanguageCodeEntry {{'k', 'v'}, {'k', 'o', 'm'}, {'k', 'o', 'm'}, {'k', 'o', 'm'}}, // Komi
+ LanguageCodeEntry {{'k', 'g'}, {'k', 'o', 'n'}, {'k', 'o', 'n'}, {'k', 'o', 'n'}}, // Kongo
+ LanguageCodeEntry {{}, {'k', 'o', 'k'}, {'k', 'o', 'k'}, {'k', 'o', 'k'}}, // Konkani
+ LanguageCodeEntry {{'k', 'o'}, {'k', 'o', 'r'}, {'k', 'o', 'r'}, {'k', 'o', 'r'}}, // Korean
+ LanguageCodeEntry {{}, {}, {}, {'k', 'f', 'o'}}, // Koro
+ LanguageCodeEntry {{}, {}, {}, {'s', 'e', 's'}}, // Koyraboro Senni
+ LanguageCodeEntry {{}, {}, {}, {'k', 'h', 'q'}}, // Koyra Chiini
+ LanguageCodeEntry {{}, {'k', 'p', 'e'}, {'k', 'p', 'e'}, {'k', 'p', 'e'}}, // Kpelle
+ LanguageCodeEntry {{'k', 'j'}, {'k', 'u', 'a'}, {'k', 'u', 'a'}, {'k', 'u', 'a'}}, // Kuanyama
+ LanguageCodeEntry {{'k', 'u'}, {'k', 'u', 'r'}, {'k', 'u', 'r'}, {'k', 'u', 'r'}}, // Kurdish
+ LanguageCodeEntry {{}, {}, {}, {'n', 'm', 'g'}}, // Kwasio
+ LanguageCodeEntry {{'k', 'y'}, {'k', 'i', 'r'}, {'k', 'i', 'r'}, {'k', 'i', 'r'}}, // Kyrgyz
+ LanguageCodeEntry {{}, {}, {}, {'l', 'k', 't'}}, // Lakota
+ LanguageCodeEntry {{}, {}, {}, {'l', 'a', 'g'}}, // Langi
+ LanguageCodeEntry {{'l', 'o'}, {'l', 'a', 'o'}, {'l', 'a', 'o'}, {'l', 'a', 'o'}}, // Lao
+ LanguageCodeEntry {{'l', 'a'}, {'l', 'a', 't'}, {'l', 'a', 't'}, {'l', 'a', 't'}}, // Latin
+ LanguageCodeEntry {{'l', 'v'}, {'l', 'a', 'v'}, {'l', 'a', 'v'}, {'l', 'a', 'v'}}, // Latvian
+ LanguageCodeEntry {{}, {'l', 'e', 'z'}, {'l', 'e', 'z'}, {'l', 'e', 'z'}}, // Lezghian
+ LanguageCodeEntry {{'l', 'i'}, {'l', 'i', 'm'}, {'l', 'i', 'm'}, {'l', 'i', 'm'}}, // Limburgish
+ LanguageCodeEntry {{'l', 'n'}, {'l', 'i', 'n'}, {'l', 'i', 'n'}, {'l', 'i', 'n'}}, // Lingala
+ LanguageCodeEntry {{}, {}, {}, {'l', 'z', 'h'}}, // Literary Chinese
+ LanguageCodeEntry {{'l', 't'}, {'l', 'i', 't'}, {'l', 'i', 't'}, {'l', 'i', 't'}}, // Lithuanian
+ LanguageCodeEntry {{}, {'j', 'b', 'o'}, {'j', 'b', 'o'}, {'j', 'b', 'o'}}, // Lojban
+ LanguageCodeEntry {{}, {'d', 's', 'b'}, {'d', 's', 'b'}, {'d', 's', 'b'}}, // Lower Sorbian
+ LanguageCodeEntry {{}, {'n', 'd', 's'}, {'n', 'd', 's'}, {'n', 'd', 's'}}, // Low German
+ LanguageCodeEntry {{'l', 'u'}, {'l', 'u', 'b'}, {'l', 'u', 'b'}, {'l', 'u', 'b'}}, // Luba-Katanga
+ LanguageCodeEntry {{}, {'s', 'm', 'j'}, {'s', 'm', 'j'}, {'s', 'm', 'j'}}, // Lule Sami
+ LanguageCodeEntry {{}, {'l', 'u', 'o'}, {'l', 'u', 'o'}, {'l', 'u', 'o'}}, // Luo
+ LanguageCodeEntry {{'l', 'b'}, {'l', 't', 'z'}, {'l', 't', 'z'}, {'l', 't', 'z'}}, // Luxembourgish
+ LanguageCodeEntry {{}, {}, {}, {'l', 'u', 'y'}}, // Luyia
+ LanguageCodeEntry {{'m', 'k'}, {'m', 'a', 'c'}, {'m', 'k', 'd'}, {'m', 'k', 'd'}}, // Macedonian
+ LanguageCodeEntry {{}, {}, {}, {'j', 'm', 'c'}}, // Machame
+ LanguageCodeEntry {{}, {'m', 'a', 'i'}, {'m', 'a', 'i'}, {'m', 'a', 'i'}}, // Maithili
+ LanguageCodeEntry {{}, {}, {}, {'m', 'g', 'h'}}, // Makhuwa-Meetto
+ LanguageCodeEntry {{}, {}, {}, {'k', 'd', 'e'}}, // Makonde
+ LanguageCodeEntry {{'m', 'g'}, {'m', 'l', 'g'}, {'m', 'l', 'g'}, {'m', 'l', 'g'}}, // Malagasy
+ LanguageCodeEntry {{'m', 'l'}, {'m', 'a', 'l'}, {'m', 'a', 'l'}, {'m', 'a', 'l'}}, // Malayalam
+ LanguageCodeEntry {{'m', 's'}, {'m', 'a', 'y'}, {'m', 's', 'a'}, {'m', 's', 'a'}}, // Malay
+ LanguageCodeEntry {{'m', 't'}, {'m', 'l', 't'}, {'m', 'l', 't'}, {'m', 'l', 't'}}, // Maltese
+ LanguageCodeEntry {{}, {'m', 'a', 'n'}, {'m', 'a', 'n'}, {'m', 'a', 'n'}}, // Mandingo
+ LanguageCodeEntry {{}, {'m', 'n', 'i'}, {'m', 'n', 'i'}, {'m', 'n', 'i'}}, // Manipuri
+ LanguageCodeEntry {{'g', 'v'}, {'g', 'l', 'v'}, {'g', 'l', 'v'}, {'g', 'l', 'v'}}, // Manx
+ LanguageCodeEntry {{'m', 'i'}, {'m', 'a', 'o'}, {'m', 'r', 'i'}, {'m', 'r', 'i'}}, // Maori
+ LanguageCodeEntry {{}, {'a', 'r', 'n'}, {'a', 'r', 'n'}, {'a', 'r', 'n'}}, // Mapuche
+ LanguageCodeEntry {{'m', 'r'}, {'m', 'a', 'r'}, {'m', 'a', 'r'}, {'m', 'a', 'r'}}, // Marathi
+ LanguageCodeEntry {{'m', 'h'}, {'m', 'a', 'h'}, {'m', 'a', 'h'}, {'m', 'a', 'h'}}, // Marshallese
+ LanguageCodeEntry {{}, {'m', 'a', 's'}, {'m', 'a', 's'}, {'m', 'a', 's'}}, // Masai
+ LanguageCodeEntry {{}, {}, {}, {'m', 'z', 'n'}}, // Mazanderani
+ LanguageCodeEntry {{}, {'m', 'e', 'n'}, {'m', 'e', 'n'}, {'m', 'e', 'n'}}, // Mende
+ LanguageCodeEntry {{}, {}, {}, {'m', 'e', 'r'}}, // Meru
+ LanguageCodeEntry {{}, {}, {}, {'m', 'g', 'o'}}, // Meta
+ LanguageCodeEntry {{}, {'m', 'o', 'h'}, {'m', 'o', 'h'}, {'m', 'o', 'h'}}, // Mohawk
+ LanguageCodeEntry {{'m', 'n'}, {'m', 'o', 'n'}, {'m', 'o', 'n'}, {'m', 'o', 'n'}}, // Mongolian
+ LanguageCodeEntry {{}, {}, {}, {'m', 'f', 'e'}}, // Morisyen
+ LanguageCodeEntry {{}, {}, {}, {'m', 'u', 'a'}}, // Mundang
+ LanguageCodeEntry {{}, {'m', 'u', 's'}, {'m', 'u', 's'}, {'m', 'u', 's'}}, // Muscogee
+ LanguageCodeEntry {{}, {}, {}, {'n', 'a', 'q'}}, // Nama
+ LanguageCodeEntry {{'n', 'a'}, {'n', 'a', 'u'}, {'n', 'a', 'u'}, {'n', 'a', 'u'}}, // Nauru
+ LanguageCodeEntry {{'n', 'v'}, {'n', 'a', 'v'}, {'n', 'a', 'v'}, {'n', 'a', 'v'}}, // Navajo
+ LanguageCodeEntry {{'n', 'g'}, {'n', 'd', 'o'}, {'n', 'd', 'o'}, {'n', 'd', 'o'}}, // Ndonga
+ LanguageCodeEntry {{'n', 'e'}, {'n', 'e', 'p'}, {'n', 'e', 'p'}, {'n', 'e', 'p'}}, // Nepali
+ LanguageCodeEntry {{}, {'n', 'e', 'w'}, {'n', 'e', 'w'}, {'n', 'e', 'w'}}, // Newari
+ LanguageCodeEntry {{}, {}, {}, {'n', 'n', 'h'}}, // Ngiemboon
+ LanguageCodeEntry {{}, {}, {}, {'j', 'g', 'o'}}, // Ngomba
+ LanguageCodeEntry {{}, {}, {}, {'p', 'c', 'm'}}, // Nigerian Pidgin
+ LanguageCodeEntry {{}, {'n', 'q', 'o'}, {'n', 'q', 'o'}, {'n', 'q', 'o'}}, // Nko
+ LanguageCodeEntry {{}, {}, {}, {'l', 'r', 'c'}}, // Northern Luri
+ LanguageCodeEntry {{'s', 'e'}, {'s', 'm', 'e'}, {'s', 'm', 'e'}, {'s', 'm', 'e'}}, // Northern Sami
+ LanguageCodeEntry {{}, {'n', 's', 'o'}, {'n', 's', 'o'}, {'n', 's', 'o'}}, // Northern Sotho
+ LanguageCodeEntry {{'n', 'd'}, {'n', 'd', 'e'}, {'n', 'd', 'e'}, {'n', 'd', 'e'}}, // North Ndebele
+ LanguageCodeEntry {{'n', 'b'}, {'n', 'o', 'b'}, {'n', 'o', 'b'}, {'n', 'o', 'b'}}, // Norwegian Bokmal
+ LanguageCodeEntry {{'n', 'n'}, {'n', 'n', 'o'}, {'n', 'n', 'o'}, {'n', 'n', 'o'}}, // Norwegian Nynorsk
+ LanguageCodeEntry {{}, {}, {}, {'n', 'u', 's'}}, // Nuer
+ LanguageCodeEntry {{'n', 'y'}, {'n', 'y', 'a'}, {'n', 'y', 'a'}, {'n', 'y', 'a'}}, // Nyanja
+ LanguageCodeEntry {{}, {'n', 'y', 'n'}, {'n', 'y', 'n'}, {'n', 'y', 'n'}}, // Nyankole
+ LanguageCodeEntry {{'o', 'c'}, {'o', 'c', 'i'}, {'o', 'c', 'i'}, {'o', 'c', 'i'}}, // Occitan
+ LanguageCodeEntry {{'o', 'r'}, {'o', 'r', 'i'}, {'o', 'r', 'i'}, {'o', 'r', 'i'}}, // Odia
+ LanguageCodeEntry {{'o', 'j'}, {'o', 'j', 'i'}, {'o', 'j', 'i'}, {'o', 'j', 'i'}}, // Ojibwa
+ LanguageCodeEntry {{}, {'s', 'g', 'a'}, {'s', 'g', 'a'}, {'s', 'g', 'a'}}, // Old Irish
+ LanguageCodeEntry {{}, {'n', 'o', 'n'}, {'n', 'o', 'n'}, {'n', 'o', 'n'}}, // Old Norse
+ LanguageCodeEntry {{}, {'p', 'e', 'o'}, {'p', 'e', 'o'}, {'p', 'e', 'o'}}, // Old Persian
+ LanguageCodeEntry {{'o', 'm'}, {'o', 'r', 'm'}, {'o', 'r', 'm'}, {'o', 'r', 'm'}}, // Oromo
+ LanguageCodeEntry {{}, {'o', 's', 'a'}, {'o', 's', 'a'}, {'o', 's', 'a'}}, // Osage
+ LanguageCodeEntry {{'o', 's'}, {'o', 's', 's'}, {'o', 's', 's'}, {'o', 's', 's'}}, // Ossetic
+ LanguageCodeEntry {{}, {'p', 'a', 'l'}, {'p', 'a', 'l'}, {'p', 'a', 'l'}}, // Pahlavi
+ LanguageCodeEntry {{}, {'p', 'a', 'u'}, {'p', 'a', 'u'}, {'p', 'a', 'u'}}, // Palauan
+ LanguageCodeEntry {{'p', 'i'}, {'p', 'l', 'i'}, {'p', 'l', 'i'}, {'p', 'l', 'i'}}, // Pali
+ LanguageCodeEntry {{}, {'p', 'a', 'p'}, {'p', 'a', 'p'}, {'p', 'a', 'p'}}, // Papiamento
+ LanguageCodeEntry {{'p', 's'}, {'p', 'u', 's'}, {'p', 'u', 's'}, {'p', 'u', 's'}}, // Pashto
+ LanguageCodeEntry {{'f', 'a'}, {'p', 'e', 'r'}, {'f', 'a', 's'}, {'f', 'a', 's'}}, // Persian
+ LanguageCodeEntry {{}, {'p', 'h', 'n'}, {'p', 'h', 'n'}, {'p', 'h', 'n'}}, // Phoenician
+ LanguageCodeEntry {{'p', 'l'}, {'p', 'o', 'l'}, {'p', 'o', 'l'}, {'p', 'o', 'l'}}, // Polish
+ LanguageCodeEntry {{'p', 't'}, {'p', 'o', 'r'}, {'p', 'o', 'r'}, {'p', 'o', 'r'}}, // Portuguese
+ LanguageCodeEntry {{}, {}, {}, {'p', 'r', 'g'}}, // Prussian
+ LanguageCodeEntry {{'p', 'a'}, {'p', 'a', 'n'}, {'p', 'a', 'n'}, {'p', 'a', 'n'}}, // Punjabi
+ LanguageCodeEntry {{'q', 'u'}, {'q', 'u', 'e'}, {'q', 'u', 'e'}, {'q', 'u', 'e'}}, // Quechua
+ LanguageCodeEntry {{'r', 'o'}, {'r', 'u', 'm'}, {'r', 'o', 'n'}, {'r', 'o', 'n'}}, // Romanian
+ LanguageCodeEntry {{'r', 'm'}, {'r', 'o', 'h'}, {'r', 'o', 'h'}, {'r', 'o', 'h'}}, // Romansh
+ LanguageCodeEntry {{}, {}, {}, {'r', 'o', 'f'}}, // Rombo
+ LanguageCodeEntry {{'r', 'n'}, {'r', 'u', 'n'}, {'r', 'u', 'n'}, {'r', 'u', 'n'}}, // Rundi
+ LanguageCodeEntry {{'r', 'u'}, {'r', 'u', 's'}, {'r', 'u', 's'}, {'r', 'u', 's'}}, // Russian
+ LanguageCodeEntry {{}, {}, {}, {'r', 'w', 'k'}}, // Rwa
+ LanguageCodeEntry {{}, {}, {}, {'s', 's', 'y'}}, // Saho
+ LanguageCodeEntry {{}, {'s', 'a', 'h'}, {'s', 'a', 'h'}, {'s', 'a', 'h'}}, // Sakha
+ LanguageCodeEntry {{}, {}, {}, {'s', 'a', 'q'}}, // Samburu
+ LanguageCodeEntry {{'s', 'm'}, {'s', 'm', 'o'}, {'s', 'm', 'o'}, {'s', 'm', 'o'}}, // Samoan
+ LanguageCodeEntry {{'s', 'g'}, {'s', 'a', 'g'}, {'s', 'a', 'g'}, {'s', 'a', 'g'}}, // Sango
+ LanguageCodeEntry {{}, {}, {}, {'s', 'b', 'p'}}, // Sangu
+ LanguageCodeEntry {{'s', 'a'}, {'s', 'a', 'n'}, {'s', 'a', 'n'}, {'s', 'a', 'n'}}, // Sanskrit
+ LanguageCodeEntry {{}, {'s', 'a', 't'}, {'s', 'a', 't'}, {'s', 'a', 't'}}, // Santali
+ LanguageCodeEntry {{'s', 'c'}, {'s', 'r', 'd'}, {'s', 'r', 'd'}, {'s', 'r', 'd'}}, // Sardinian
+ LanguageCodeEntry {{}, {}, {}, {'s', 'a', 'z'}}, // Saurashtra
+ LanguageCodeEntry {{}, {}, {}, {'s', 'e', 'h'}}, // Sena
+ LanguageCodeEntry {{'s', 'r'}, {'s', 'r', 'p'}, {'s', 'r', 'p'}, {'s', 'r', 'p'}}, // Serbian
+ LanguageCodeEntry {{}, {}, {}, {'k', 's', 'b'}}, // Shambala
+ LanguageCodeEntry {{'s', 'n'}, {'s', 'n', 'a'}, {'s', 'n', 'a'}, {'s', 'n', 'a'}}, // Shona
+ LanguageCodeEntry {{'i', 'i'}, {'i', 'i', 'i'}, {'i', 'i', 'i'}, {'i', 'i', 'i'}}, // Sichuan Yi
+ LanguageCodeEntry {{}, {'s', 'c', 'n'}, {'s', 'c', 'n'}, {'s', 'c', 'n'}}, // Sicilian
+ LanguageCodeEntry {{}, {'s', 'i', 'd'}, {'s', 'i', 'd'}, {'s', 'i', 'd'}}, // Sidamo
+ LanguageCodeEntry {{}, {}, {}, {'s', 'z', 'l'}}, // Silesian
+ LanguageCodeEntry {{'s', 'd'}, {'s', 'n', 'd'}, {'s', 'n', 'd'}, {'s', 'n', 'd'}}, // Sindhi
+ LanguageCodeEntry {{'s', 'i'}, {'s', 'i', 'n'}, {'s', 'i', 'n'}, {'s', 'i', 'n'}}, // Sinhala
+ LanguageCodeEntry {{}, {'s', 'm', 's'}, {'s', 'm', 's'}, {'s', 'm', 's'}}, // Skolt Sami
+ LanguageCodeEntry {{'s', 'k'}, {'s', 'l', 'o'}, {'s', 'l', 'k'}, {'s', 'l', 'k'}}, // Slovak
+ LanguageCodeEntry {{'s', 'l'}, {'s', 'l', 'v'}, {'s', 'l', 'v'}, {'s', 'l', 'v'}}, // Slovenian
+ LanguageCodeEntry {{}, {}, {}, {'x', 'o', 'g'}}, // Soga
+ LanguageCodeEntry {{'s', 'o'}, {'s', 'o', 'm'}, {'s', 'o', 'm'}, {'s', 'o', 'm'}}, // Somali
+ LanguageCodeEntry {{}, {}, {}, {'s', 'd', 'h'}}, // Southern Kurdish
+ LanguageCodeEntry {{}, {'s', 'm', 'a'}, {'s', 'm', 'a'}, {'s', 'm', 'a'}}, // Southern Sami
+ LanguageCodeEntry {{'s', 't'}, {'s', 'o', 't'}, {'s', 'o', 't'}, {'s', 'o', 't'}}, // Southern Sotho
+ LanguageCodeEntry {{'n', 'r'}, {'n', 'b', 'l'}, {'n', 'b', 'l'}, {'n', 'b', 'l'}}, // South Ndebele
+ LanguageCodeEntry {{'e', 's'}, {'s', 'p', 'a'}, {'s', 'p', 'a'}, {'s', 'p', 'a'}}, // Spanish
+ LanguageCodeEntry {{}, {'z', 'g', 'h'}, {'z', 'g', 'h'}, {'z', 'g', 'h'}}, // Standard Moroccan Tamazight
+ LanguageCodeEntry {{'s', 'u'}, {'s', 'u', 'n'}, {'s', 'u', 'n'}, {'s', 'u', 'n'}}, // Sundanese
+ LanguageCodeEntry {{'s', 'w'}, {'s', 'w', 'a'}, {'s', 'w', 'a'}, {'s', 'w', 'a'}}, // Swahili
+ LanguageCodeEntry {{'s', 's'}, {'s', 's', 'w'}, {'s', 's', 'w'}, {'s', 's', 'w'}}, // Swati
+ LanguageCodeEntry {{'s', 'v'}, {'s', 'w', 'e'}, {'s', 'w', 'e'}, {'s', 'w', 'e'}}, // Swedish
+ LanguageCodeEntry {{}, {'g', 's', 'w'}, {'g', 's', 'w'}, {'g', 's', 'w'}}, // Swiss German
+ LanguageCodeEntry {{}, {'s', 'y', 'r'}, {'s', 'y', 'r'}, {'s', 'y', 'r'}}, // Syriac
+ LanguageCodeEntry {{}, {}, {}, {'s', 'h', 'i'}}, // Tachelhit
+ LanguageCodeEntry {{'t', 'y'}, {'t', 'a', 'h'}, {'t', 'a', 'h'}, {'t', 'a', 'h'}}, // Tahitian
+ LanguageCodeEntry {{}, {}, {}, {'b', 'l', 't'}}, // Tai Dam
+ LanguageCodeEntry {{}, {}, {}, {'d', 'a', 'v'}}, // Taita
+ LanguageCodeEntry {{'t', 'g'}, {'t', 'g', 'k'}, {'t', 'g', 'k'}, {'t', 'g', 'k'}}, // Tajik
+ LanguageCodeEntry {{'t', 'a'}, {'t', 'a', 'm'}, {'t', 'a', 'm'}, {'t', 'a', 'm'}}, // Tamil
+ LanguageCodeEntry {{}, {}, {}, {'t', 'r', 'v'}}, // Taroko
+ LanguageCodeEntry {{}, {}, {}, {'t', 'w', 'q'}}, // Tasawaq
+ LanguageCodeEntry {{'t', 't'}, {'t', 'a', 't'}, {'t', 'a', 't'}, {'t', 'a', 't'}}, // Tatar
+ LanguageCodeEntry {{'t', 'e'}, {'t', 'e', 'l'}, {'t', 'e', 'l'}, {'t', 'e', 'l'}}, // Telugu
+ LanguageCodeEntry {{}, {}, {}, {'t', 'e', 'o'}}, // Teso
+ LanguageCodeEntry {{'t', 'h'}, {'t', 'h', 'a'}, {'t', 'h', 'a'}, {'t', 'h', 'a'}}, // Thai
+ LanguageCodeEntry {{'b', 'o'}, {'t', 'i', 'b'}, {'b', 'o', 'd'}, {'b', 'o', 'd'}}, // Tibetan
+ LanguageCodeEntry {{}, {'t', 'i', 'g'}, {'t', 'i', 'g'}, {'t', 'i', 'g'}}, // Tigre
+ LanguageCodeEntry {{'t', 'i'}, {'t', 'i', 'r'}, {'t', 'i', 'r'}, {'t', 'i', 'r'}}, // Tigrinya
+ LanguageCodeEntry {{}, {'t', 'k', 'l'}, {'t', 'k', 'l'}, {'t', 'k', 'l'}}, // Tokelau
+ LanguageCodeEntry {{}, {'t', 'p', 'i'}, {'t', 'p', 'i'}, {'t', 'p', 'i'}}, // Tok Pisin
+ LanguageCodeEntry {{'t', 'o'}, {'t', 'o', 'n'}, {'t', 'o', 'n'}, {'t', 'o', 'n'}}, // Tongan
+ LanguageCodeEntry {{'t', 's'}, {'t', 's', 'o'}, {'t', 's', 'o'}, {'t', 's', 'o'}}, // Tsonga
+ LanguageCodeEntry {{'t', 'n'}, {'t', 's', 'n'}, {'t', 's', 'n'}, {'t', 's', 'n'}}, // Tswana
+ LanguageCodeEntry {{'t', 'r'}, {'t', 'u', 'r'}, {'t', 'u', 'r'}, {'t', 'u', 'r'}}, // Turkish
+ LanguageCodeEntry {{'t', 'k'}, {'t', 'u', 'k'}, {'t', 'u', 'k'}, {'t', 'u', 'k'}}, // Turkmen
+ LanguageCodeEntry {{}, {'t', 'v', 'l'}, {'t', 'v', 'l'}, {'t', 'v', 'l'}}, // Tuvalu
+ LanguageCodeEntry {{}, {}, {}, {'k', 'c', 'g'}}, // Tyap
+ LanguageCodeEntry {{}, {'u', 'g', 'a'}, {'u', 'g', 'a'}, {'u', 'g', 'a'}}, // Ugaritic
+ LanguageCodeEntry {{'u', 'k'}, {'u', 'k', 'r'}, {'u', 'k', 'r'}, {'u', 'k', 'r'}}, // Ukrainian
+ LanguageCodeEntry {{}, {'h', 's', 'b'}, {'h', 's', 'b'}, {'h', 's', 'b'}}, // Upper Sorbian
+ LanguageCodeEntry {{'u', 'r'}, {'u', 'r', 'd'}, {'u', 'r', 'd'}, {'u', 'r', 'd'}}, // Urdu
+ LanguageCodeEntry {{'u', 'g'}, {'u', 'i', 'g'}, {'u', 'i', 'g'}, {'u', 'i', 'g'}}, // Uyghur
+ LanguageCodeEntry {{'u', 'z'}, {'u', 'z', 'b'}, {'u', 'z', 'b'}, {'u', 'z', 'b'}}, // Uzbek
+ LanguageCodeEntry {{}, {'v', 'a', 'i'}, {'v', 'a', 'i'}, {'v', 'a', 'i'}}, // Vai
+ LanguageCodeEntry {{'v', 'e'}, {'v', 'e', 'n'}, {'v', 'e', 'n'}, {'v', 'e', 'n'}}, // Venda
+ LanguageCodeEntry {{'v', 'i'}, {'v', 'i', 'e'}, {'v', 'i', 'e'}, {'v', 'i', 'e'}}, // Vietnamese
+ LanguageCodeEntry {{'v', 'o'}, {'v', 'o', 'l'}, {'v', 'o', 'l'}, {'v', 'o', 'l'}}, // Volapuk
+ LanguageCodeEntry {{}, {}, {}, {'v', 'u', 'n'}}, // Vunjo
+ LanguageCodeEntry {{'w', 'a'}, {'w', 'l', 'n'}, {'w', 'l', 'n'}, {'w', 'l', 'n'}}, // Walloon
+ LanguageCodeEntry {{}, {}, {}, {'w', 'a', 'e'}}, // Walser
+ LanguageCodeEntry {{}, {}, {}, {'w', 'b', 'p'}}, // Warlpiri
+ LanguageCodeEntry {{'c', 'y'}, {'w', 'e', 'l'}, {'c', 'y', 'm'}, {'c', 'y', 'm'}}, // Welsh
+ LanguageCodeEntry {{}, {}, {}, {'b', 'g', 'n'}}, // Western Balochi
+ LanguageCodeEntry {{'f', 'y'}, {'f', 'r', 'y'}, {'f', 'r', 'y'}, {'f', 'r', 'y'}}, // Western Frisian
+ LanguageCodeEntry {{}, {'w', 'a', 'l'}, {'w', 'a', 'l'}, {'w', 'a', 'l'}}, // Wolaytta
+ LanguageCodeEntry {{'w', 'o'}, {'w', 'o', 'l'}, {'w', 'o', 'l'}, {'w', 'o', 'l'}}, // Wolof
+ LanguageCodeEntry {{'x', 'h'}, {'x', 'h', 'o'}, {'x', 'h', 'o'}, {'x', 'h', 'o'}}, // Xhosa
+ LanguageCodeEntry {{}, {}, {}, {'y', 'a', 'v'}}, // Yangben
+ LanguageCodeEntry {{'y', 'i'}, {'y', 'i', 'd'}, {'y', 'i', 'd'}, {'y', 'i', 'd'}}, // Yiddish
+ LanguageCodeEntry {{'y', 'o'}, {'y', 'o', 'r'}, {'y', 'o', 'r'}, {'y', 'o', 'r'}}, // Yoruba
+ LanguageCodeEntry {{}, {}, {}, {'d', 'j', 'e'}}, // Zarma
+ LanguageCodeEntry {{'z', 'a'}, {'z', 'h', 'a'}, {'z', 'h', 'a'}, {'z', 'h', 'a'}}, // Zhuang
+ LanguageCodeEntry {{'z', 'u'}, {'z', 'u', 'l'}, {'z', 'u', 'l'}, {'z', 'u', 'l'}}, // Zulu
+ LanguageCodeEntry {{}, {}, {}, {'k', 'g', 'p'}}, // Kaingang
+ LanguageCodeEntry {{}, {}, {}, {'y', 'r', 'l'}}, // Nheengatu
+ LanguageCodeEntry {{}, {}, {}, {'b', 'g', 'c'}}, // Haryanvi
+ LanguageCodeEntry {{}, {'f', 'r', 'r'}, {'f', 'r', 'r'}, {'f', 'r', 'r'}}, // Northern Frisian
+ LanguageCodeEntry {{}, {'r', 'a', 'j'}, {'r', 'a', 'j'}, {'r', 'a', 'j'}}, // Rajasthani
+ LanguageCodeEntry {{}, {'m', 'd', 'f'}, {'m', 'd', 'f'}, {'m', 'd', 'f'}}, // Moksha
+ LanguageCodeEntry {{}, {}, {}, {'t', 'o', 'k'}}, // Toki Pona
+ LanguageCodeEntry {{}, {}, {}, {'p', 'i', 's'}}, // Pijin
+ LanguageCodeEntry {{}, {}, {}, {'a', 'n', 'n'}}, // Obolo
+ LanguageCodeEntry {{}, {'b', 'a', 'l'}, {'b', 'a', 'l'}, {'b', 'a', 'l'}}, // Baluchi
+ LanguageCodeEntry {{}, {}, {}, {'l', 'i', 'j'}}, // Ligurian
+ LanguageCodeEntry {{}, {}, {}, {'r', 'h', 'g'}}, // Rohingya
+ LanguageCodeEntry {{}, {}, {}, {'t', 'r', 'w'}}, // Torwali
+ LanguageCodeEntry {{}, {}, {}, {'b', 'l', 'o'}}, // Anii
+ LanguageCodeEntry {{}, {}, {}, {'x', 'n', 'r'}}, // Kangri
+ LanguageCodeEntry {{}, {}, {}, {'v', 'e', 'c'}}, // Venetian
+};
-static const unsigned char script_code_list[] =
+static constexpr unsigned char script_code_list[] =
"Zzzz" // AnyScript
"Adlm" // Adlam
"Ahom" // Ahom
@@ -5702,7 +8088,7 @@ static const unsigned char script_code_list[] =
"Dsrt" // Deseret
"Deva" // Devanagari
"Dupl" // Duployan
-"Egyp" // Egyptian Hieroglyphs
+"Egyp" // Egyptian hieroglyphs
"Elba" // Elbasan
"Ethi" // Ethiopic
"Lisu" // Fraser
@@ -5777,7 +8163,7 @@ static const unsigned char script_code_list[] =
"Hmng" // Pahawh Hmong
"Palm" // Palmyrene
"Pauc" // Pau Cin Hau
-"Phag" // Phags Pa
+"Phag" // Phags-pa
"Phnx" // Phoenician
"Plrd" // Pollard Phonetic
"Phlp" // Psalter Pahlavi
@@ -5788,7 +8174,7 @@ static const unsigned char script_code_list[] =
"Shrd" // Sharada
"Shaw" // Shavian
"Sidd" // Siddham
-"Sgnw" // Sign Writing
+"Sgnw" // SignWriting
"Hans" // Simplified Han
"Sinh" // Sinhala
"Sora" // Sora Sompeng
@@ -5813,9 +8199,10 @@ static const unsigned char script_code_list[] =
"Vaii" // Vai
"Wara" // Varang Kshiti
"Yiii" // Yi
+"Rohg" // Hanifi
;
-static const unsigned char territory_code_list[] =
+static constexpr unsigned char territory_code_list[] =
"ZZ\0" // AnyTerritory
"AF\0" // Afghanistan
"AX\0" // Aland Islands
@@ -5826,7 +8213,7 @@ static const unsigned char territory_code_list[] =
"AO\0" // Angola
"AI\0" // Anguilla
"AQ\0" // Antarctica
-"AG\0" // Antigua And Barbuda
+"AG\0" // Antigua and Barbuda
"AR\0" // Argentina
"AM\0" // Armenia
"AW\0" // Aruba
@@ -5845,7 +8232,7 @@ static const unsigned char territory_code_list[] =
"BM\0" // Bermuda
"BT\0" // Bhutan
"BO\0" // Bolivia
-"BA\0" // Bosnia And Herzegovina
+"BA\0" // Bosnia and Herzegovina
"BW\0" // Botswana
"BV\0" // Bouvet Island
"BR\0" // Brazil
@@ -5863,7 +8250,7 @@ static const unsigned char territory_code_list[] =
"BQ\0" // Caribbean Netherlands
"KY\0" // Cayman Islands
"CF\0" // Central African Republic
-"EA\0" // Ceuta And Melilla
+"EA\0" // Ceuta and Melilla
"TD\0" // Chad
"CL\0" // Chile
"CN\0" // China
@@ -5872,8 +8259,8 @@ static const unsigned char territory_code_list[] =
"CC\0" // Cocos Islands
"CO\0" // Colombia
"KM\0" // Comoros
-"CG\0" // Congo Brazzaville
-"CD\0" // Congo Kinshasa
+"CG\0" // Congo - Brazzaville
+"CD\0" // Congo - Kinshasa
"CK\0" // Cook Islands
"CR\0" // Costa Rica
"HR\0" // Croatia
@@ -5917,11 +8304,11 @@ static const unsigned char territory_code_list[] =
"GU\0" // Guam
"GT\0" // Guatemala
"GG\0" // Guernsey
-"GW\0" // Guinea Bissau
+"GW\0" // Guinea-Bissau
"GN\0" // Guinea
"GY\0" // Guyana
"HT\0" // Haiti
-"HM\0" // Heard And McDonald Islands
+"HM\0" // Heard and McDonald Islands
"HN\0" // Honduras
"HK\0" // Hong Kong
"HU\0" // Hungary
@@ -5931,7 +8318,7 @@ static const unsigned char territory_code_list[] =
"IR\0" // Iran
"IQ\0" // Iraq
"IE\0" // Ireland
-"IM\0" // Isle Of Man
+"IM\0" // Isle of Man
"IL\0" // Israel
"IT\0" // Italy
"CI\0" // Ivory Coast
@@ -6013,14 +8400,14 @@ static const unsigned char territory_code_list[] =
"RW\0" // Rwanda
"BL\0" // Saint Barthelemy
"SH\0" // Saint Helena
-"KN\0" // Saint Kitts And Nevis
+"KN\0" // Saint Kitts and Nevis
"LC\0" // Saint Lucia
"MF\0" // Saint Martin
-"PM\0" // Saint Pierre And Miquelon
-"VC\0" // Saint Vincent And Grenadines
+"PM\0" // Saint Pierre and Miquelon
+"VC\0" // Saint Vincent and Grenadines
"WS\0" // Samoa
"SM\0" // San Marino
-"ST\0" // Sao Tome And Principe
+"ST\0" // Sao Tome and Principe
"SA\0" // Saudi Arabia
"SN\0" // Senegal
"RS\0" // Serbia
@@ -6033,14 +8420,14 @@ static const unsigned char territory_code_list[] =
"SB\0" // Solomon Islands
"SO\0" // Somalia
"ZA\0" // South Africa
-"GS\0" // South Georgia And South Sandwich Islands
+"GS\0" // South Georgia and South Sandwich Islands
"KR\0" // South Korea
"SS\0" // South Sudan
"ES\0" // Spain
"LK\0" // Sri Lanka
"SD\0" // Sudan
"SR\0" // Suriname
-"SJ\0" // Svalbard And Jan Mayen
+"SJ\0" // Svalbard and Jan Mayen
"SE\0" // Sweden
"CH\0" // Switzerland
"SY\0" // Syria
@@ -6052,12 +8439,12 @@ static const unsigned char territory_code_list[] =
"TG\0" // Togo
"TK\0" // Tokelau
"TO\0" // Tonga
-"TT\0" // Trinidad And Tobago
-"TA\0" // Tristan Da Cunha
+"TT\0" // Trinidad and Tobago
+"TA\0" // Tristan da Cunha
"TN\0" // Tunisia
"TR\0" // Turkey
"TM\0" // Turkmenistan
-"TC\0" // Turks And Caicos Islands
+"TC\0" // Turks and Caicos Islands
"TV\0" // Tuvalu
"UG\0" // Uganda
"UA\0" // Ukraine
@@ -6072,9 +8459,9 @@ static const unsigned char territory_code_list[] =
"VA\0" // Vatican City
"VE\0" // Venezuela
"VN\0" // Vietnam
-"WF\0" // Wallis And Futuna
+"WF\0" // Wallis and Futuna
"EH\0" // Western Sahara
-"001" // World
+"001" // world
"YE\0" // Yemen
"ZM\0" // Zambia
"ZW\0" // Zimbabwe
diff --git a/src/corelib/text/qlocale_icu.cpp b/src/corelib/text/qlocale_icu.cpp
index afe0aae583..55231286a0 100644
--- a/src/corelib/text/qlocale_icu.cpp
+++ b/src/corelib/text/qlocale_icu.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qglobal.h"
#include "qdebug.h"
diff --git a/src/corelib/text/qlocale_mac.mm b/src/corelib/text/qlocale_mac.mm
index ef9d1d24a3..89339be2eb 100644
--- a/src/corelib/text/qlocale_mac.mm
+++ b/src/corelib/text/qlocale_mac.mm
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qlocale_p.h"
@@ -50,12 +14,52 @@
#include <CoreFoundation/CoreFoundation.h>
#endif
+#include <QtCore/qloggingcategory.h>
+#include <QtCore/qcoreapplication.h>
+
QT_BEGIN_NAMESPACE
+using namespace Qt::StringLiterals;
+
/******************************************************************************
** Wrappers for Mac locale system functions
*/
+Q_LOGGING_CATEGORY(lcLocale, "qt.core.locale")
+
+static void printLocalizationInformation()
+{
+ if (!lcLocale().isDebugEnabled())
+ return;
+
+#if defined(Q_OS_MACOS)
+ // Trigger initialization of standard user defaults, so that Foundation picks
+ // up -AppleLanguages and -AppleLocale passed on the command line.
+ Q_UNUSED(NSUserDefaults.standardUserDefaults);
+#endif
+
+ auto singleLineDescription = [](NSArray *array) {
+ NSString *str = [array description];
+ str = [str stringByReplacingOccurrencesOfString:@"\n" withString:@""];
+ return [str stringByReplacingOccurrencesOfString:@" " withString:@""];
+ };
+
+ bool allowMixedLocalizations = [NSBundle.mainBundle.infoDictionary[@"CFBundleAllowMixedLocalizations"] boolValue];
+
+ NSBundle *foundation = [NSBundle bundleForClass:NSBundle.class];
+ qCDebug(lcLocale).nospace() << "Launched with locale \"" << NSLocale.currentLocale.localeIdentifier
+ << "\" based on user's preferred languages " << singleLineDescription(NSLocale.preferredLanguages)
+ << ", main bundle localizations " << singleLineDescription(NSBundle.mainBundle.localizations)
+ << ", and allowing mixed localizations " << allowMixedLocalizations
+ << "; resulting in main bundle preferred localizations "
+ << singleLineDescription(NSBundle.mainBundle.preferredLocalizations)
+ << " and Foundation preferred localizations "
+ << singleLineDescription(foundation.preferredLocalizations);
+ qCDebug(lcLocale) << "Reflected by Qt as system locale"
+ << QLocale::system() << "with UI languges " << QLocale::system().uiLanguages();
+}
+Q_COREAPP_STARTUP_FUNCTION(printLocalizationInformation);
+
static QString getMacLocaleName()
{
QCFType<CFLocaleRef> l = CFLocaleCopyCurrent();
@@ -152,23 +156,35 @@ static QVariant macDayName(int day, QSystemLocale::QueryType type)
static QString macZeroDigit()
{
- QCFType<CFLocaleRef> locale = CFLocaleCopyCurrent();
- QCFType<CFNumberFormatterRef> numberFormatter =
- CFNumberFormatterCreate(nullptr, locale, kCFNumberFormatterNoStyle);
- const int zeroDigit = 0;
- QCFType<CFStringRef> value
- = CFNumberFormatterCreateStringWithValue(nullptr, numberFormatter,
- kCFNumberIntType, &zeroDigit);
- return QString::fromCFString(value);
+ static QString cachedZeroDigit;
+
+ if (cachedZeroDigit.isNull()) {
+ QCFType<CFLocaleRef> locale = CFLocaleCopyCurrent();
+ QCFType<CFNumberFormatterRef> numberFormatter =
+ CFNumberFormatterCreate(nullptr, locale, kCFNumberFormatterNoStyle);
+ const int zeroDigit = 0;
+ QCFType<CFStringRef> value
+ = CFNumberFormatterCreateStringWithValue(nullptr, numberFormatter,
+ kCFNumberIntType, &zeroDigit);
+ cachedZeroDigit = QString::fromCFString(value);
+ }
+
+ static QMacNotificationObserver localeChangeObserver = QMacNotificationObserver(
+ nil, NSCurrentLocaleDidChangeNotification, [&] {
+ qCDebug(lcLocale) << "System locale changed";
+ cachedZeroDigit = QString();
+ });
+
+ return cachedZeroDigit;
}
-static QString zeroPad(QString &&number, int minDigits, const QString &zero)
+static QString zeroPad(QString &&number, qsizetype minDigits, const QString &zero)
{
// Need to pad with zeros, possibly after a sign.
- int insert = -1, digits = 0;
+ qsizetype insert = -1, digits = 0;
auto it = QStringIterator(number);
while (it.hasNext()) {
- int here = it.index();
+ qsizetype here = it.index();
if (QChar::isDigit(it.next())) {
if (insert < 0)
insert = here;
@@ -188,10 +204,10 @@ static QString trimTwoDigits(QString &&number)
// Retain any sign, but remove all but the last two digits.
// We know number has at least four digits - it came from fourDigitYear().
// Note that each digit might be a surrogate pair.
- int first = -1, prev = -1, last = -1;
+ qsizetype first = -1, prev = -1, last = -1;
auto it = QStringIterator(number);
while (it.hasNext()) {
- int here = it.index();
+ qsizetype here = it.index();
if (QChar::isDigit(it.next())) {
if (first == -1)
last = first = here;
@@ -222,12 +238,16 @@ static QString fourDigitYear(int year, const QString &zero)
static QString macDateToStringImpl(QDate date, CFDateFormatterStyle style)
{
- QCFType<CFDateRef> myDate = date.startOfDay().toCFDate();
+ // Use noon on the given date, to avoid complications that can arise for
+ // dates before 1900 (see QTBUG-54955) using different UTC offset than
+ // QDateTime extrapolates backwards from time_t functions that only work
+ // back to 1900. (Alaska and Phillipines may still be borked, though.)
+ QCFType<CFDateRef> myDate = QDateTime(date, QTime(12, 0)).toCFDate();
QCFType<CFLocaleRef> mylocale = CFLocaleCopyCurrent();
QCFType<CFDateFormatterRef> myFormatter
= CFDateFormatterCreate(kCFAllocatorDefault, mylocale, style,
kCFDateFormatterNoStyle);
- QCFType<CFStringRef> text = CFDateFormatterCreateStringWithDate(0, myFormatter, myDate);
+ QCFType<CFStringRef> text = CFDateFormatterCreateStringWithDate(nullptr, myFormatter, myDate);
return QString::fromCFString(text);
}
@@ -235,12 +255,14 @@ static QVariant macDateToString(QDate date, bool short_format)
{
const int year = date.year();
QString fakeYear, trueYear;
- if (year < 0) {
+ if (year < 1583) {
// System API (in macOS 11.0, at least) discards sign :-(
// Simply negating the year won't do as the resulting year typically has
// a different pattern of week-days.
+ // Furthermore (see QTBUG-54955), Darwin uses the Julian calendar for
+ // dates before 1582-10-15, leading to discrepancies.
int matcher = QGregorianCalendar::yearSharingWeekDays(date);
- Q_ASSERT(matcher > 0);
+ Q_ASSERT(matcher >= 1583);
Q_ASSERT(matcher % 100 != date.month());
Q_ASSERT(matcher % 100 != date.day());
// i.e. there can't be any confusion between the two-digit year and
@@ -253,7 +275,7 @@ static QVariant macDateToString(QDate date, bool short_format)
QString text = macDateToStringImpl(date, short_format
? kCFDateFormatterShortStyle
: kCFDateFormatterLongStyle);
- if (year < 0) {
+ if (year < 1583) {
if (text.contains(fakeYear))
return std::move(text).replace(fakeYear, trueYear);
// Cope with two-digit year:
@@ -288,114 +310,120 @@ static QVariant macTimeToString(QTime time, bool short_format)
static QVariant macToQtFormat(QStringView sys_fmt)
{
QString result;
- int i = 0;
+ qsizetype i = 0;
while (i < sys_fmt.size()) {
if (sys_fmt.at(i).unicode() == '\'') {
QString text = qt_readEscapedFormatString(sys_fmt, &i);
- if (text == QLatin1String("'"))
- result += QLatin1String("''");
+ if (text == "'"_L1)
+ result += "''"_L1;
else
- result += QLatin1Char('\'') + text + QLatin1Char('\'');
+ result += u'\'' + text + u'\'';
continue;
}
QChar c = sys_fmt.at(i);
- int repeat = qt_repeatCount(sys_fmt.mid(i));
+ qsizetype repeat = qt_repeatCount(sys_fmt.sliced(i));
switch (c.unicode()) {
// Qt does not support the following options
- case 'G': // Era (1..5): 4 = long, 1..3 = short, 5 = narrow
- case 'Y': // Year of Week (1..n): 1..n = padded number
- case 'U': // Cyclic Year Name (1..5): 4 = long, 1..3 = short, 5 = narrow
- case 'Q': // Quarter (1..4): 4 = long, 3 = short, 1..2 = padded number
- case 'q': // Standalone Quarter (1..4): 4 = long, 3 = short, 1..2 = padded number
- case 'w': // Week of Year (1..2): 1..2 = padded number
- case 'W': // Week of Month (1): 1 = number
- case 'D': // Day of Year (1..3): 1..3 = padded number
- case 'F': // Day of Week in Month (1): 1 = number
- case 'g': // Modified Julian Day (1..n): 1..n = padded number
- case 'A': // Milliseconds in Day (1..n): 1..n = padded number
- break;
-
- case 'y': // Year (1..n): 2 = short year, 1 & 3..n = padded number
- case 'u': // Extended Year (1..n): 2 = short year, 1 & 3..n = padded number
- // Qt only supports long (4) or short (2) year, use long for all others
- if (repeat == 2)
- result += QLatin1String("yy");
- else
- result += QLatin1String("yyyy");
- break;
- case 'M': // Month (1..5): 4 = long, 3 = short, 1..2 = number, 5 = narrow
- case 'L': // Standalone Month (1..5): 4 = long, 3 = short, 1..2 = number, 5 = narrow
- // Qt only supports long, short and number, use short for narrow
- if (repeat == 5)
- result += QLatin1String("MMM");
- else
- result += QString(repeat, QLatin1Char('M'));
- break;
- case 'd': // Day of Month (1..2): 1..2 padded number
- result += QString(repeat, c);
- break;
- case 'E': // Day of Week (1..6): 4 = long, 1..3 = short, 5..6 = narrow
- // Qt only supports long, short and padded number, use short for narrow
- if (repeat == 4)
- result += QLatin1String("dddd");
- else
- result += QLatin1String("ddd");
- break;
- case 'e': // Local Day of Week (1..6): 4 = long, 3 = short, 5..6 = narrow, 1..2 padded number
- case 'c': // Standalone Local Day of Week (1..6): 4 = long, 3 = short, 5..6 = narrow, 1..2 padded number
- // Qt only supports long, short and padded number, use short for narrow
- if (repeat >= 5)
- result += QLatin1String("ddd");
- else
- result += QString(repeat, QLatin1Char('d'));
- break;
- case 'a': // AM/PM (1): 1 = short
- // Translate to Qt uppercase AM/PM
- result += QLatin1String("AP");
- break;
- case 'h': // Hour [1..12] (1..2): 1..2 = padded number
- case 'K': // Hour [0..11] (1..2): 1..2 = padded number
- case 'j': // Local Hour [12 or 24] (1..2): 1..2 = padded number
- // Qt h is local hour
- result += QString(repeat, QLatin1Char('h'));
- break;
- case 'H': // Hour [0..23] (1..2): 1..2 = padded number
- case 'k': // Hour [1..24] (1..2): 1..2 = padded number
- // Qt H is 0..23 hour
- result += QString(repeat, QLatin1Char('H'));
- break;
- case 'm': // Minutes (1..2): 1..2 = padded number
- case 's': // Seconds (1..2): 1..2 = padded number
+ case 'A': // Milliseconds in Day (1..n): 1..n = padded number
+ case 'C': // Input skeleton symbol.
+ case 'D': // Day of Year (1..3): 1..3 = padded number
+ case 'F': // Day of Week in Month (1): 1 = number
+ case 'g': // Modified Julian Day (1..n): 1..n = padded number
+ case 'G': // Era (1..5): 4 = long, 1..3 = short, 5 = narrow
+ case 'j': // Input skeleton symbol.
+ case 'J': // Input skeleton symbol.
+ case 'l': // Deprecated Chinese leap month indicator.
+ case 'q': // Standalone Quarter (1..4): 4 = long, 3 = short, 1,2 = padded number
+ case 'Q': // Quarter (1..4): 4 = long, 3 = short, 1,2 = padded number
+ case 'U': // Cyclic Year Name (1..5): 4 = long, 1..3 = short, 5 = narrow
+ case 'w': // Week of Year (1,2): 1,2 = padded number
+ case 'W': // Week of Month (1): 1 = number
+ case 'Y': // Year for Week-of-year calendars (1..n): 1..n = padded number
+ break;
+
+ case 'u': // Extended Year (1..n), padded number.
+ // Explicitly has no special case for 'uu' as only the last two digits.
+ result += "yyyy"_L1;
+ break;
+ case 'y': // Year (1..n): 2 = short year, 1 & 3..n = padded number
+ // Qt only supports long (4) or short (2) year, use long for all others
+ if (repeat == 2)
+ result += "yy"_L1;
+ else
+ result += "yyyy"_L1;
+ break;
+ case 'L': // Standalone Month (1..5): 4 = long, 3 = short, 1,2 = number, 5 = narrow
+ case 'M': // Month (1..5): 4 = long, 3 = short, 1,2 = number, 5 = narrow
+ // Qt only supports long, short and number, use short for narrow
+ if (repeat == 5)
+ result += "MMM"_L1;
+ else
+ result += QString(repeat, u'M');
+ break;
+ case 'd': // Day of Month (1,2): 1,2 padded number
+ result += QString(repeat, c);
+ break;
+ case 'c': // Standalone version of 'e'
+ case 'e': // Local Day of Week (1..6): 4 = long, 3 = short, 5,6 = narrow, 1,2 padded number
+ // "Local" only affects numeric form: depends on locale's start-day of the week.
+ case 'E': // Day of Week (1..6): 4 = long, 1..3 = short, 5,6 = narrow
+ // Qt only supports long, short: use short for narrow and padded number.
+ if (repeat == 4)
+ result += "dddd"_L1;
+ else
+ result += "ddd"_L1;
+ break;
+ case 'a': // AM/PM (1..n): Qt supports no distinctions
+ case 'b': // Like a, but also distinguishing noon, midnight (ignore difference).
+ case 'B': // Flexible day period (at night, &c.)
+ // Translate to Qt AM/PM, using locale-appropriate case:
+ result += "Ap"_L1;
+ break;
+ case 'h': // Hour [1..12] (1,2): 1,2 = padded number
+ case 'K': // Hour [0..11] (1,2): 1,2 = padded number
+ result += QString(repeat, 'h'_L1);
+ break;
+ case 'H': // Hour [0..23] (1,2): 1,2 = padded number
+ case 'k': // Hour [1..24] (1,2): 1,2 = padded number
+ // Qt H is 0..23 hour
+ result += QString(repeat, 'H'_L1);
+ break;
+ case 'm': // Minutes (1,2): 1,2 = padded number
+ case 's': // Seconds (1,2): 1,2 = padded number
+ result += QString(repeat, c);
+ break;
+ case 'S': // Fractional second (1..n): 1..n = truncates to decimal places
+ // Qt uses msecs either unpadded or padded to 3 places
+ if (repeat < 3)
+ result += u'z';
+ else
+ result += "zzz"_L1;
+ break;
+ case 'O': // Time Zone (1, 4)
+ result += u't';
+ break;
+ case 'v': // Time Zone (1, 4)
+ case 'V': // Time Zone (1..4)
+ result += "tttt"_L1;
+ break;
+ case 'x': // Time Zone (1..5)
+ case 'X': // Time Zone (1..5)
+ result += (repeat > 1 && (repeat & 1)) ? "ttt"_L1 : "tt"_L1;
+ break;
+ case 'z': // Time Zone (1..4)
+ case 'Z': // Time Zone (1..5)
+ result += repeat < 4 ? "tt"_L1 : repeat > 4 ? "ttt"_L1 : "t"_L1;
+ break;
+ default:
+ // a..z and A..Z are reserved for format codes, so any occurrence of these not
+ // already processed are not known and so unsupported formats to be ignored.
+ // All other chars are allowed as literals.
+ if (c < u'A' || c > u'z' || (c > u'Z' && c < u'a'))
result += QString(repeat, c);
- break;
- case 'S': // Fractional second (1..n): 1..n = truncates to decimal places
- // Qt uses msecs either unpadded or padded to 3 places
- if (repeat < 3)
- result += QLatin1Char('z');
- else
- result += QLatin1String("zzz");
- break;
- case 'z': // Time Zone (1..4)
- case 'Z': // Time Zone (1..5)
- case 'O': // Time Zone (1, 4)
- case 'v': // Time Zone (1, 4)
- case 'V': // Time Zone (1..4)
- case 'X': // Time Zone (1..5)
- case 'x': // Time Zone (1..5)
- result += QLatin1Char('t');
- break;
- default:
- // a..z and A..Z are reserved for format codes, so any occurrence of these not
- // already processed are not known and so unsupported formats to be ignored.
- // All other chars are allowed as literals.
- if (c < QLatin1Char('A') || c > QLatin1Char('z') ||
- (c > QLatin1Char('Z') && c < QLatin1Char('a'))) {
- result += QString(repeat, c);
- }
- break;
+ break;
}
i += repeat;
@@ -433,7 +461,7 @@ static QVariant macMeasurementSystem()
{
QCFType<CFLocaleRef> locale = CFLocaleCopyCurrent();
CFStringRef system = static_cast<CFStringRef>(CFLocaleGetValue(locale, kCFLocaleMeasurementSystem));
- if (QString::fromCFString(system) == QLatin1String("Metric")) {
+ if (QString::fromCFString(system) == "Metric"_L1) {
return QLocale::MetricSystem;
} else {
return QLocale::ImperialSystem;
@@ -548,12 +576,18 @@ static QVariant getLocaleValue(CFStringRef key)
return QVariant();
}
-QVariant QSystemLocale::query(QueryType type, QVariant in) const
+static QLocale::Language codeToLanguage(QStringView s)
+{
+ return QLocalePrivate::codeToLanguage(s);
+}
+
+QVariant QSystemLocale::query(QueryType type, QVariant &&in) const
{
QMacAutoReleasePool pool;
+
switch(type) {
case LanguageId:
- return getLocaleValue<QLocalePrivate::codeToLanguage>(kCFLocaleLanguageCode);
+ return getLocaleValue<codeToLanguage>(kCFLocaleLanguageCode);
case TerritoryId:
return getLocaleValue<QLocalePrivate::codeToTerritory>(kCFLocaleCountryCode);
case ScriptId:
@@ -615,13 +649,13 @@ QVariant QSystemLocale::query(QueryType type, QVariant in) const
case CurrencySymbol:
return macCurrencySymbol(QLocale::CurrencySymbolFormat(in.toUInt()));
case CurrencyToString:
- return macFormatCurrency(in.value<QSystemLocale::CurrencyToStringArgument>());
+ return macFormatCurrency(in.value<CurrencyToStringArgument>());
case UILanguages: {
QStringList result;
QCFType<CFArrayRef> languages = CFLocaleCopyPreferredLanguages();
- const int cnt = CFArrayGetCount(languages);
+ const CFIndex cnt = CFArrayGetCount(languages);
result.reserve(cnt);
- for (int i = 0; i < cnt; ++i) {
+ for (CFIndex i = 0; i < cnt; ++i) {
const QString lang = QString::fromCFString(
static_cast<CFStringRef>(CFArrayGetValueAtIndex(languages, i)));
result.append(lang);
diff --git a/src/corelib/text/qlocale_p.h b/src/corelib/text/qlocale_p.h
index 60bc78db04..3044d137b9 100644
--- a/src/corelib/text/qlocale_p.h
+++ b/src/corelib/text/qlocale_p.h
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// Copyright (C) 2016 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QLOCALE_P_H
#define QLOCALE_P_H
@@ -52,25 +16,98 @@
// We mean it.
//
-#include <QtCore/private/qglobal_p.h>
-#include "QtCore/qstring.h"
-#include "QtCore/qvarlengtharray.h"
-#include "QtCore/qvariant.h"
-#include "QtCore/qnumeric.h"
-#include <QtCore/qcalendar.h>
-
#include "qlocale.h"
+#include <QtCore/qcalendar.h>
+#include <QtCore/qlist.h>
+#include <QtCore/qnumeric.h>
+#include <QtCore/private/qnumeric_p.h>
+#include <QtCore/qstring.h>
+#include <QtCore/qvariant.h>
+#include <QtCore/qvarlengtharray.h>
+#ifdef Q_OS_WASM
+#include <private/qstdweb_p.h>
+#endif
+
#include <limits>
#include <cmath>
+#include <string_view>
QT_BEGIN_NAMESPACE
-#ifndef QT_NO_SYSTEMLOCALE
+template <typename T> struct QSimpleParsedNumber
+{
+ T result;
+ // When used < 0, -used is how much was used, but it was an error.
+ qsizetype used;
+ bool ok() const { return used > 0; }
+};
+
+template <typename MaskType, uchar Lowest> struct QCharacterSetMatch
+{
+ static constexpr int MaxRange = std::numeric_limits<MaskType>::digits;
+ MaskType mask;
+
+ constexpr QCharacterSetMatch(std::string_view set)
+ : mask(0)
+ {
+ for (char c : set) {
+ int idx = uchar(c) - Lowest;
+ mask |= MaskType(1) << idx;
+ }
+ }
+
+ constexpr bool matches(uchar c) const
+ {
+ unsigned idx = c - Lowest;
+ if (idx >= MaxRange)
+ return false;
+ return (mask >> idx) & 1;
+ }
+};
+
+namespace QtPrivate {
+inline constexpr char ascii_space_chars[] =
+ "\t" // 9: HT - horizontal tab
+ "\n" // 10: LF - line feed
+ "\v" // 11: VT - vertical tab
+ "\f" // 12: FF - form feed
+ "\r" // 13: CR - carriage return
+ " "; // 32: space
+
+template <const char *Set, int ForcedLowest = -1>
+inline constexpr auto makeCharacterSetMatch()
+{
+ constexpr auto view = std::string_view(Set);
+ constexpr uchar MinElement = *std::min_element(view.begin(), view.end());
+ constexpr uchar MaxElement = *std::max_element(view.begin(), view.end());
+ constexpr int Range = MaxElement - MinElement;
+ static_assert(Range < 64, "Characters in the set are 64 or more values apart");
+
+ if constexpr (ForcedLowest >= 0) {
+ // use the force
+ static_assert(ForcedLowest <= int(MinElement), "The force is not with you");
+ using MaskType = std::conditional_t<MaxElement - ForcedLowest < 32, quint32, quint64>;
+ return QCharacterSetMatch<MaskType, ForcedLowest>(view);
+ } else if constexpr (MaxElement < std::numeric_limits<qregisteruint>::digits) {
+ // if we can use a Lowest of zero, we can remove a subtraction
+ // from the matches() code at runtime
+ using MaskType = std::conditional_t<(MaxElement < 32), quint32, qregisteruint>;
+ return QCharacterSetMatch<MaskType, 0>(view);
+ } else {
+ using MaskType = std::conditional_t<(Range < 32), quint32, quint64>;
+ return QCharacterSetMatch<MaskType, MinElement>(view);
+ }
+}
+} // QtPrivate
+
struct QLocaleData;
// Subclassed by Android platform plugin:
class Q_CORE_EXPORT QSystemLocale
{
+ Q_DISABLE_COPY_MOVE(QSystemLocale)
+ QSystemLocale *next = nullptr; // Maintains a stack.
+
public:
QSystemLocale();
virtual ~QSystemLocale();
@@ -133,17 +170,13 @@ public:
StandaloneDayNameShort, // QString, in: int
StandaloneDayNameNarrow // QString, in: int
};
- virtual QVariant query(QueryType type, QVariant in = QVariant()) const;
+ virtual QVariant query(QueryType type, QVariant &&in = QVariant()) const;
virtual QLocale fallbackLocale() const;
- inline uint fallbackLocaleIndex() const;
-private:
- QSystemLocale(bool);
- friend class QSystemLocaleSingleton;
+ inline qsizetype fallbackLocaleIndex() const;
};
Q_DECLARE_TYPEINFO(QSystemLocale::QueryType, Q_PRIMITIVE_TYPE);
Q_DECLARE_TYPEINFO(QSystemLocale::CurrencyToStringArgument, Q_RELOCATABLE_TYPE);
-#endif
#if QT_CONFIG(icu)
namespace QIcu {
@@ -155,7 +188,7 @@ namespace QIcu {
struct QLocaleId
{
- [[nodiscard]] static QLocaleId fromName(QStringView name);
+ [[nodiscard]] Q_AUTOTEST_EXPORT static QLocaleId fromName(QStringView name);
[[nodiscard]] inline bool operator==(QLocaleId other) const
{ return language_id == other.language_id && script_id == other.script_id && territory_id == other.territory_id; }
[[nodiscard]] inline bool operator!=(QLocaleId other) const
@@ -191,12 +224,27 @@ struct QLocaleId
};
Q_DECLARE_TYPEINFO(QLocaleId, Q_PRIMITIVE_TYPE);
+
+using CharBuff = QVarLengthArray<char, 256>;
+
+struct ParsingResult
+{
+ enum State { // A duplicate of QValidator::State
+ Invalid,
+ Intermediate,
+ Acceptable
+ };
+
+ State state = Invalid;
+ CharBuff buff;
+};
+
struct QLocaleData
{
public:
// Having an index for each locale enables us to have diverse sources of
// data, e.g. calendar locales, as well as the main CLDR-derived data.
- [[nodiscard]] static int findLocaleIndex(QLocaleId localeId);
+ [[nodiscard]] static qsizetype findLocaleIndex(QLocaleId localeId);
[[nodiscard]] static const QLocaleData *c();
enum DoubleForm {
@@ -224,8 +272,6 @@ public:
enum NumberMode { IntegerMode, DoubleStandardMode, DoubleScientificMode };
- typedef QVarLengthArray<char, 256> CharBuff;
-
private:
enum PrecisionMode {
PMDecimalDigits = 0x01,
@@ -259,45 +305,82 @@ public:
unsigned flags = NoFlags) const;
// this function is meant to be called with the result of stringToDouble or bytearrayToDouble
+ // so *ok must have been properly set (if not null)
[[nodiscard]] static float convertDoubleToFloat(double d, bool *ok)
{
- if (qIsInf(d))
- return float(d);
- if (std::fabs(d) > std::numeric_limits<float>::max()) {
- if (ok)
- *ok = false;
- const float huge = std::numeric_limits<float>::infinity();
- return d < 0 ? -huge : huge;
- }
- if (d != 0 && float(d) == 0) {
- // Values that underflow double already failed. Match them:
- if (ok)
- *ok = false;
- return 0;
- }
- return float(d);
+ float result;
+ bool b = convertDoubleTo<float>(d, &result);
+ if (ok && *ok)
+ *ok = b;
+ return result;
}
[[nodiscard]] double stringToDouble(QStringView str, bool *ok,
QLocale::NumberOptions options) const;
- [[nodiscard]] qint64 stringToLongLong(QStringView str, int base, bool *ok,
- QLocale::NumberOptions options) const;
- [[nodiscard]] quint64 stringToUnsLongLong(QStringView str, int base, bool *ok,
- QLocale::NumberOptions options) const;
+ [[nodiscard]] QSimpleParsedNumber<qint64>
+ stringToLongLong(QStringView str, int base, QLocale::NumberOptions options) const;
+ [[nodiscard]] QSimpleParsedNumber<quint64>
+ stringToUnsLongLong(QStringView str, int base, QLocale::NumberOptions options) const;
// this function is used in QIntValidator (QtGui)
- [[nodiscard]] Q_CORE_EXPORT static qint64 bytearrayToLongLong(QByteArrayView num, int base,
- bool *ok);
- [[nodiscard]] static quint64 bytearrayToUnsLongLong(QByteArrayView num, int base, bool *ok);
+ [[nodiscard]] Q_CORE_EXPORT
+ static QSimpleParsedNumber<qint64> bytearrayToLongLong(QByteArrayView num, int base);
+ [[nodiscard]] static QSimpleParsedNumber<quint64>
+ bytearrayToUnsLongLong(QByteArrayView num, int base);
[[nodiscard]] bool numberToCLocale(QStringView s, QLocale::NumberOptions number_options,
- CharBuff *result) const;
- [[nodiscard]] inline char numericToCLocale(QStringView in) const;
+ NumberMode mode, CharBuff *result) const;
+
+ struct NumericData
+ {
+#ifndef QT_NO_SYSTEMLOCALE
+ // Only used for the system locale, to store data for the view to look at:
+ QString sysDecimal, sysGroup, sysMinus, sysPlus;
+#endif
+ QStringView decimal, group, minus, plus, exponent;
+ char32_t zeroUcs = 0;
+ qint8 zeroLen = 0;
+ bool isC = false; // C locale sets this and nothing else.
+ bool exponentCyrillic = false; // True only for floating-point parsing of Cyrillic.
+ void setZero(QStringView zero)
+ {
+ // No known locale has digits that are more than one Unicode
+ // code-point, so we can safely deal with digits as plain char32_t.
+ switch (zero.size()) {
+ case 1:
+ Q_ASSERT(!zero.at(0).isSurrogate());
+ zeroUcs = zero.at(0).unicode();
+ zeroLen = 1;
+ break;
+ case 2:
+ Q_ASSERT(zero.at(0).isHighSurrogate());
+ zeroUcs = QChar::surrogateToUcs4(zero.at(0), zero.at(1));
+ zeroLen = 2;
+ break;
+ default:
+ Q_ASSERT(zero.size() == 0); // i.e. we got no value to use
+ break;
+ }
+ }
+ [[nodiscard]] bool isValid(NumberMode mode) const // Asserted as a sanity check.
+ {
+ if (isC)
+ return true;
+ if (exponentCyrillic && exponent != u"E" && exponent != u"\u0415")
+ return false;
+ return (zeroLen == 1 || zeroLen == 2) && zeroUcs > 0
+ && (mode == IntegerMode || !decimal.isEmpty())
+ // group may be empty (user config in system locale)
+ && !minus.isEmpty() && !plus.isEmpty()
+ && (mode != DoubleScientificMode || !exponent.isEmpty());
+ }
+ };
+ [[nodiscard]] inline NumericData numericData(NumberMode mode) const;
// this function is used in QIntValidator (QtGui)
- [[nodiscard]] Q_CORE_EXPORT bool validateChars(
- QStringView str, NumberMode numMode, QByteArray *buff, int decDigits = -1,
- QLocale::NumberOptions number_options = QLocale::DefaultNumberOptions) const;
+ [[nodiscard]] Q_CORE_EXPORT ParsingResult
+ validateChars(QStringView str, NumberMode numMode, int decDigits = -1,
+ QLocale::NumberOptions number_options = QLocale::DefaultNumberOptions) const;
// Access to assorted data members:
[[nodiscard]] QLocaleId id() const
@@ -327,11 +410,11 @@ public:
{
return { reinterpret_cast<const QChar *>(table + offset), size };
}
- [[nodiscard]] QString getListEntry(const char16_t *table, int index) const
+ [[nodiscard]] QString getListEntry(const char16_t *table, qsizetype index) const
{
return listEntry(table, index).getData(table);
}
- [[nodiscard]] QStringView viewListEntry(const char16_t *table, int index) const
+ [[nodiscard]] QStringView viewListEntry(const char16_t *table, qsizetype index) const
{
return listEntry(table, index).viewData(table);
}
@@ -344,7 +427,7 @@ public:
return 0;
}
private:
- [[nodiscard]] DataRange listEntry(const char16_t *table, int index) const
+ [[nodiscard]] DataRange listEntry(const char16_t *table, qsizetype index) const
{
const char16_t separator = ';';
quint16 i = 0;
@@ -399,7 +482,7 @@ public:
quint8 m_first_day_of_week : 3;
quint8 m_weekend_start : 3;
quint8 m_weekend_end : 3;
- quint8 m_grouping_top : 2; // Must have this many before the first grouping separator
+ quint8 m_grouping_top : 2; // Don't group until more significant group has this many digits.
quint8 m_grouping_higher : 3; // Number of digits between grouping separators
quint8 m_grouping_least : 3; // Number of digits after last grouping separator (before decimal).
};
@@ -407,7 +490,7 @@ public:
class QLocalePrivate
{
public:
- constexpr QLocalePrivate(const QLocaleData *data, const uint index,
+ constexpr QLocalePrivate(const QLocaleData *data, qsizetype index,
QLocale::NumberOptions numberOptions = QLocale::DefaultNumberOptions,
int refs = 0)
: m_data(data), ref Q_BASIC_ATOMIC_INITIALIZER(refs),
@@ -418,18 +501,25 @@ public:
[[nodiscard]] QByteArray bcp47Name(char separator = '-') const;
- [[nodiscard]] inline QLatin1String languageCode() const
- { return languageToCode(QLocale::Language(m_data->m_language_id)); }
- [[nodiscard]] inline QLatin1String scriptCode() const
+ [[nodiscard]] inline std::array<char, 4>
+ languageCode(QLocale::LanguageCodeTypes codeTypes = QLocale::AnyLanguageCode) const
+ {
+ return languageToCode(QLocale::Language(m_data->m_language_id), codeTypes);
+ }
+ [[nodiscard]] inline QLatin1StringView scriptCode() const
{ return scriptToCode(QLocale::Script(m_data->m_script_id)); }
- [[nodiscard]] inline QLatin1String territoryCode() const
+ [[nodiscard]] inline QLatin1StringView territoryCode() const
{ return territoryToCode(QLocale::Territory(m_data->m_territory_id)); }
[[nodiscard]] static const QLocalePrivate *get(const QLocale &l) { return l.d; }
- [[nodiscard]] static QLatin1String languageToCode(QLocale::Language language);
- [[nodiscard]] static QLatin1String scriptToCode(QLocale::Script script);
- [[nodiscard]] static QLatin1String territoryToCode(QLocale::Territory territory);
- [[nodiscard]] static QLocale::Language codeToLanguage(QStringView code) noexcept;
+ [[nodiscard]] static std::array<char, 4>
+ languageToCode(QLocale::Language language,
+ QLocale::LanguageCodeTypes codeTypes = QLocale::AnyLanguageCode);
+ [[nodiscard]] static QLatin1StringView scriptToCode(QLocale::Script script);
+ [[nodiscard]] static QLatin1StringView territoryToCode(QLocale::Territory territory);
+ [[nodiscard]] static QLocale::Language
+ codeToLanguage(QStringView code,
+ QLocale::LanguageCodeTypes codeTypes = QLocale::AnyLanguageCode) noexcept;
[[nodiscard]] static QLocale::Script codeToScript(QStringView code) noexcept;
[[nodiscard]] static QLocale::Territory codeToTerritory(QStringView code) noexcept;
@@ -438,14 +528,14 @@ public:
// System locale has an m_data all its own; all others have m_data = locale_data + m_index
const QLocaleData *const m_data;
QBasicAtomicInt ref;
- const uint m_index;
+ qsizetype m_index; // System locale needs this updated when m_data->id() changes.
QLocale::NumberOptions m_numberOptions;
static QBasicAtomicInt s_generation;
};
#ifndef QT_NO_SYSTEMLOCALE
-uint QSystemLocale::fallbackLocaleIndex() const { return fallbackLocale().d->m_index; }
+qsizetype QSystemLocale::fallbackLocaleIndex() const { return fallbackLocale().d->m_index; }
#endif
template <>
@@ -456,90 +546,26 @@ inline QLocalePrivate *QSharedDataPointer<QLocalePrivate>::clone()
return new QLocalePrivate(d->m_data, d->m_index, d->m_numberOptions);
}
-inline char QLocaleData::numericToCLocale(QStringView in) const
-{
- Q_ASSERT(in.size() == 1 || (in.size() == 2 && in.at(0).isHighSurrogate()));
-
- if (in == positiveSign() || in == u"+")
- return '+';
-
- if (in == negativeSign() || in == u"-" || in == u"\x2212")
- return '-';
-
- if (in == decimalPoint())
- return '.';
-
- if (in.compare(exponentSeparator(), Qt::CaseInsensitive) == 0)
- return 'e';
-
- const QString group = groupSeparator();
- if (in == group)
- return ',';
-
- // In several languages group() is a non-breaking space (U+00A0) or its thin
- // version (U+202f), which look like spaces. People (and thus some of our
- // tests) use a regular space instead and complain if it doesn't work.
- // Should this be extended generally to any case where group is a space ?
- if ((group == u"\xa0" || group == u"\x202f") && in == u" ")
- return ',';
-
- const char32_t inUcs4 = in.size() == 2
- ? QChar::surrogateToUcs4(in.at(0), in.at(1)) : in.at(0).unicode();
- const char32_t zeroUcs4 = zeroUcs();
- // Must match qlocale_tools.h's unicodeForDigit()
- if (zeroUcs4 == u'\u3007') {
- // QTBUG-85409: Suzhou's digits aren't contiguous !
- if (inUcs4 == zeroUcs4)
- return '0';
- if (inUcs4 > u'\u3020' && inUcs4 <= u'\u3029')
- return inUcs4 - u'\u3020';
- } else if (zeroUcs4 <= inUcs4 && inUcs4 < zeroUcs4 + 10) {
- return '0' + inUcs4 - zeroUcs4;
- }
- if ('0' <= inUcs4 && inUcs4 <= '9')
- return inUcs4;
-
- return 0;
-}
-
// Also used to merely skip over an escape in a format string, advancint idx to
// point after it (so not [[nodiscard]]):
-QString qt_readEscapedFormatString(QStringView format, int *idx);
+QString qt_readEscapedFormatString(QStringView format, qsizetype *idx);
[[nodiscard]] bool qt_splitLocaleName(QStringView name, QStringView *lang = nullptr,
QStringView *script = nullptr, QStringView *cntry = nullptr);
-[[nodiscard]] int qt_repeatCount(QStringView s);
-
-enum { AsciiSpaceMask = (1u << (' ' - 1)) |
- (1u << ('\t' - 1)) | // 9: HT - horizontal tab
- (1u << ('\n' - 1)) | // 10: LF - line feed
- (1u << ('\v' - 1)) | // 11: VT - vertical tab
- (1u << ('\f' - 1)) | // 12: FF - form feed
- (1u << ('\r' - 1)) }; // 13: CR - carriage return
+[[nodiscard]] qsizetype qt_repeatCount(QStringView s);
+
[[nodiscard]] constexpr inline bool ascii_isspace(uchar c)
{
- return c >= 1u && c <= 32u && (AsciiSpaceMask >> uint(c - 1)) & 1u;
+ constexpr auto matcher = QtPrivate::makeCharacterSetMatch<QtPrivate::ascii_space_chars>();
+ return matcher.matches(c);
}
-static_assert(ascii_isspace(' '));
-static_assert(ascii_isspace('\t'));
-static_assert(ascii_isspace('\n'));
-static_assert(ascii_isspace('\v'));
-static_assert(ascii_isspace('\f'));
-static_assert(ascii_isspace('\r'));
-static_assert(!ascii_isspace('\0'));
-static_assert(!ascii_isspace('\a'));
-static_assert(!ascii_isspace('a'));
-static_assert(!ascii_isspace('\177'));
-static_assert(!ascii_isspace(uchar('\200')));
-static_assert(!ascii_isspace(uchar('\xA0')));
-static_assert(!ascii_isspace(uchar('\377')));
-
QT_END_NAMESPACE
-Q_DECLARE_METATYPE(QStringView)
-Q_DECLARE_METATYPE(QList<Qt::DayOfWeek>)
+// ### move to qnamespace.h
+QT_DECL_METATYPE_EXTERN_TAGGED(QList<Qt::DayOfWeek>, QList_Qt__DayOfWeek, Q_CORE_EXPORT)
#ifndef QT_NO_SYSTEMLOCALE
-Q_DECLARE_METATYPE(QSystemLocale::CurrencyToStringArgument)
+QT_DECL_METATYPE_EXTERN_TAGGED(QSystemLocale::CurrencyToStringArgument,
+ QSystemLocale__CurrencyToStringArgument, Q_CORE_EXPORT)
#endif
#endif // QLOCALE_P_H
diff --git a/src/corelib/text/qlocale_tools.cpp b/src/corelib/text/qlocale_tools.cpp
index c133a028c0..b6639bcb71 100644
--- a/src/corelib/text/qlocale_tools.cpp
+++ b/src/corelib/text/qlocale_tools.cpp
@@ -1,48 +1,13 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// Copyright (C) 2016 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qlocale_tools_p.h"
#include "qdoublescanprint_p.h"
#include "qlocale_p.h"
#include "qstring.h"
+#include <private/qtools_p.h>
#include <private/qnumeric_p.h>
#include <ctype.h>
@@ -73,9 +38,12 @@
QT_BEGIN_NAMESPACE
+using namespace QtMiscUtils;
+
QT_CLOCALE_HOLDER
-void qt_doubleToAscii(double d, QLocaleData::DoubleForm form, int precision, char *buf, int bufSize,
+void qt_doubleToAscii(double d, QLocaleData::DoubleForm form, int precision,
+ char *buf, qsizetype bufSize,
bool &sign, int &length, int &decpt)
{
if (bufSize == 0) {
@@ -129,7 +97,12 @@ void qt_doubleToAscii(double d, QLocaleData::DoubleForm form, int precision, cha
} else {
mode = double_conversion::DoubleToStringConverter::FIXED;
}
- double_conversion::DoubleToStringConverter::DoubleToAscii(d, mode, precision, buf, bufSize,
+ // libDoubleConversion is limited to 32-bit lengths. It's ok to cap the buffer size,
+ // though, because the library will never write 2GiB of chars as output
+ // (the length out-parameter is just an int, too).
+ const auto boundedBufferSize = static_cast<int>((std::min)(bufSize, qsizetype(INT_MAX)));
+ double_conversion::DoubleToStringConverter::DoubleToAscii(d, mode, precision, buf,
+ boundedBufferSize,
&sign, &length, &decpt);
#else // QT_NO_DOUBLECONVERSION || QT_BOOTSTRAPPED
@@ -221,11 +194,10 @@ void qt_doubleToAscii(double d, QLocaleData::DoubleForm form, int precision, cha
// which case the missing digits are zeroes. In the 'e' case decptInTarget is always 1,
// as variants of snprintf always generate numbers with one digit before the '.' then.
// This is why the final decimal point is offset by 1, relative to the number after 'e'.
- bool ok;
- const char *endptr;
- decpt = qstrntoll(target.data() + eSign + 1, length - eSign - 1, &endptr, 10, &ok) + 1;
- Q_ASSERT(ok);
- Q_ASSERT(endptr - target.data() <= length);
+ auto r = qstrntoll(target.data() + eSign + 1, length - eSign - 1, 10);
+ decpt = r.result + 1;
+ Q_ASSERT(r.ok());
+ Q_ASSERT(r.used + eSign + 1 <= length);
} else {
// No 'e' found, so it's the 'f' form. Variants of snprintf generate numbers with
// potentially multiple digits before the '.', but without decimal exponent then. So we
@@ -278,48 +250,50 @@ void qt_doubleToAscii(double d, QLocaleData::DoubleForm form, int precision, cha
--length;
}
-double qt_asciiToDouble(const char *num, qsizetype numLen, bool &ok, int &processed,
- StrayCharacterMode strayCharMode)
+QSimpleParsedNumber<double> qt_asciiToDouble(const char *num, qsizetype numLen,
+ StrayCharacterMode strayCharMode)
{
- auto string_equals = [](const char *needle, const char *haystack, qsizetype haystackLen) {
- qsizetype needleLen = strlen(needle);
- return needleLen == haystackLen && memcmp(needle, haystack, haystackLen) == 0;
- };
-
- if (numLen == 0) {
- ok = false;
- processed = 0;
- return 0.0;
- }
-
- ok = true;
+ if (numLen <= 0)
+ return {};
// We have to catch NaN before because we need NaN as marker for "garbage" in the
// libdouble-conversion case and, in contrast to libdouble-conversion or sscanf, we don't allow
// "-nan" or "+nan"
- if (string_equals("nan", num, numLen)) {
- processed = 3;
- return qt_qnan();
- } else if (string_equals("+nan", num, numLen) || string_equals("-nan", num, numLen)) {
- processed = 0;
- ok = false;
- return 0.0;
- }
+ if (char c = *num; numLen >= 3
+ && (c == '-' || c == '+' || c == 'I' || c == 'i' || c == 'N' || c == 'n')) {
+ bool negative = (c == '-');
+ bool hasSign = negative || (c == '+');
+ qptrdiff offset = 0;
+ if (hasSign) {
+ offset = 1;
+ c = num[offset];
+ }
- // Infinity values are implementation defined in the sscanf case. In the libdouble-conversion
- // case we need infinity as overflow marker.
- if (string_equals("+inf", num, numLen)) {
- processed = 4;
- return qt_inf();
- } else if (string_equals("inf", num, numLen)) {
- processed = 3;
- return qt_inf();
- } else if (string_equals("-inf", num, numLen)) {
- processed = 4;
- return -qt_inf();
+ if (c > '9') {
+ auto lowered = [](char c) {
+ // this will mangle non-letters, but none can become a letter
+ return c | 0x20;
+ };
+
+ // Found a non-digit, so this MUST be either "inf", "+inf", "-inf"
+ // or "nan". Anything else is an invalid parse and we don't need to
+ // feed it to the converter below.
+ if (numLen != offset + 3)
+ return {};
+
+ c = lowered(c);
+ char c2 = lowered(num[offset + 1]);
+ char c3 = lowered(num[offset + 2]);
+ if (c == 'i' && c2 == 'n' && c3 == 'f')
+ return { negative ? -qt_inf() : qt_inf(), offset + 3 };
+ else if (c == 'n' && c2 == 'a' && c3 == 'n' && !hasSign)
+ return { qt_qnan(), 3 };
+ return {};
+ }
}
double d = 0.0;
+ int processed;
#if !defined(QT_NO_DOUBLECONVERSION) && !defined(QT_BOOTSTRAPPED)
int conv_flags = double_conversion::StringToDoubleConverter::NO_FLAGS;
if (strayCharMode == TrailingJunkAllowed) {
@@ -331,64 +305,47 @@ double qt_asciiToDouble(const char *num, qsizetype numLen, bool &ok, int &proces
double_conversion::StringToDoubleConverter conv(conv_flags, 0.0, qt_qnan(), nullptr, nullptr);
if (int(numLen) != numLen) {
// a number over 2 GB in length is silly, just assume it isn't valid
- ok = false;
- processed = 0;
- return 0.0;
+ return {};
} else {
- d = conv.StringToDouble(num, numLen, &processed);
+ d = conv.StringToDouble(num, int(numLen), &processed);
}
- if (!qIsFinite(d)) {
- ok = false;
- if (qIsNaN(d)) {
+ if (!qt_is_finite(d)) {
+ if (qt_is_nan(d)) {
// Garbage found. We don't accept it and return 0.
- processed = 0;
- return 0.0;
+ return {};
} else {
// Overflow. That's not OK, but we still return infinity.
- return d;
+ return { d, -processed };
}
}
#else
- // need to ensure that our input is null-terminated for sscanf
- // (this is a QVarLengthArray<char, 128> but this code here is too low-level for QVLA)
- char reasonableBuffer[128];
- char *buffer;
- if (numLen < qsizetype(sizeof(reasonableBuffer)) - 1)
- buffer = reasonableBuffer;
- else
- buffer = static_cast<char *>(malloc(numLen + 1));
- Q_CHECK_PTR(buffer);
- memcpy(buffer, num, numLen);
- buffer[numLen] = '\0';
-
- if (qDoubleSscanf(buffer, QT_CLOCALE, "%lf%n", &d, &processed) < 1)
- processed = 0;
+ // ::digits10 is 19, but ::max() is 18'446'744'073'709'551'615ULL - go, figure...
+ constexpr auto maxDigitsForULongLong = 1 + std::numeric_limits<unsigned long long>::digits10;
+ // need to ensure that we don't read more than numLen of input:
+ char fmt[1 + maxDigitsForULongLong + 4 + 1];
+ qsnprintf(fmt, sizeof fmt, "%s%llu%s", "%", static_cast<unsigned long long>(numLen), "lf%n");
- if (buffer != reasonableBuffer)
- free(buffer);
+ if (qDoubleSscanf(num, QT_CLOCALE, fmt, &d, &processed) < 1)
+ processed = 0;
- if ((strayCharMode == TrailingJunkProhibited && processed != numLen) || qIsNaN(d)) {
+ if ((strayCharMode == TrailingJunkProhibited && processed != numLen) || qt_is_nan(d)) {
// Implementation defined nan symbol or garbage found. We don't accept it.
- processed = 0;
- ok = false;
- return 0.0;
+ return {};
}
- if (!qIsFinite(d)) {
+ if (!qt_is_finite(d)) {
// Overflow. Check for implementation-defined infinity symbols and reject them.
// We assume that any infinity symbol has to contain a character that cannot be part of a
// "normal" number (that is 0-9, ., -, +, e).
- ok = false;
for (int i = 0; i < processed; ++i) {
char c = num[i];
if ((c < '0' || c > '9') && c != '.' && c != '-' && c != '+' && c != 'e' && c != 'E') {
// Garbage found
- processed = 0;
- return 0.0;
+ return {};
}
}
- return d;
+ return { d, -processed };
}
#endif // !defined(QT_NO_DOUBLECONVERSION) && !defined(QT_BOOTSTRAPPED)
@@ -400,40 +357,51 @@ double qt_asciiToDouble(const char *num, qsizetype numLen, bool &ok, int &proces
for (int i = 0; i < processed; ++i) {
if (num[i] >= '1' && num[i] <= '9') {
// if a digit before any 'e' is not 0, then a non-zero number was intended.
- ok = false;
- return 0.0;
+ return {d, -processed};
} else if (num[i] == 'e' || num[i] == 'E') {
break;
}
}
}
- return d;
+ return { d, processed };
}
-/* Detect base if 0 and, if base is hex, skip over 0x prefix */
+/* Detect base if 0 and, if base is hex or bin, skip over 0x/0b prefixes */
static auto scanPrefix(const char *p, const char *stop, int base)
{
- if (p < stop && *p >= '0' && *p <= '9') {
+ struct R
+ {
+ const char *next;
+ int base;
+ };
+ if (p < stop && isAsciiDigit(*p)) {
if (*p == '0') {
- const char *x = p + 1;
- if (x < stop && (*x == 'x' || *x == 'X')) {
- if (base == 0)
- base = 16;
- if (base == 16)
- p += 2;
- } else if (base == 0) {
- base = 8;
+ const char *x_or_b = p + 1;
+ if (x_or_b < stop) {
+ switch (*x_or_b) {
+ case 'b':
+ case 'B':
+ if (base == 0)
+ base = 2;
+ if (base == 2)
+ p += 2;
+ return R{p, base};
+ case 'x':
+ case 'X':
+ if (base == 0)
+ base = 16;
+ if (base == 16)
+ p += 2;
+ return R{p, base};
+ }
}
+ if (base == 0)
+ base = 8;
} else if (base == 0) {
base = 10;
}
Q_ASSERT(base);
}
- struct R
- {
- const char *next;
- int base;
- };
return R{p, base};
}
@@ -450,36 +418,25 @@ static bool isDigitForBase(char d, int base)
return false;
}
-unsigned long long
-qstrntoull(const char *begin, qsizetype size, const char **endptr, int base, bool *ok)
+QSimpleParsedNumber<qulonglong> qstrntoull(const char *begin, qsizetype size, int base)
{
const char *p = begin, *const stop = begin + size;
while (p < stop && ascii_isspace(*p))
++p;
unsigned long long result = 0;
- if (p >= stop || *p == '-') {
- *ok = false;
- if (endptr)
- *endptr = begin;
- return result;
- }
+ if (p >= stop || *p == '-')
+ return { };
const auto prefix = scanPrefix(*p == '+' ? p + 1 : p, stop, base);
- if (!prefix.base || prefix.next >= stop) {
- if (endptr)
- *endptr = begin;
- *ok = false;
- return 0;
- }
+ if (!prefix.base || prefix.next >= stop)
+ return { };
const auto res = std::from_chars(prefix.next, stop, result, prefix.base);
- *ok = res.ec == std::errc{};
- if (endptr)
- *endptr = res.ptr == prefix.next ? begin : res.ptr;
- return result;
+ if (res.ec != std::errc{})
+ return { };
+ return { result, res.ptr == prefix.next ? 0 : res.ptr - begin };
}
-long long
-qstrntoll(const char *begin, qsizetype size, const char **endptr, int base, bool *ok)
+QSimpleParsedNumber<qlonglong> qstrntoll(const char *begin, qsizetype size, int base)
{
const char *p = begin, *const stop = begin + size;
while (p < stop && ascii_isspace(*p))
@@ -494,30 +451,22 @@ qstrntoll(const char *begin, qsizetype size, const char **endptr, int base, bool
const auto prefix = scanPrefix(p, stop, base);
// Must check for digit, as from_chars() will accept a sign, which would be
// a second sign, that we should reject.
- if (!prefix.base || prefix.next >= stop || !isDigitForBase(*prefix.next, prefix.base)) {
- if (endptr)
- *endptr = begin;
- *ok = false;
- return 0;
- }
+ if (!prefix.base || prefix.next >= stop || !isDigitForBase(*prefix.next, prefix.base))
+ return { };
long long result = 0;
auto res = std::from_chars(prefix.next, stop, result, prefix.base);
- *ok = res.ec == std::errc{};
if (negate && res.ec == std::errc::result_out_of_range) {
// Maybe LLONG_MIN:
unsigned long long check = 0;
res = std::from_chars(prefix.next, stop, check, prefix.base);
- if (res.ec == std::errc{} && check + std::numeric_limits<long long>::min() == 0) {
- *ok = true;
- if (endptr)
- *endptr = res.ptr;
- return std::numeric_limits<long long>::min();
- }
+ if (res.ec == std::errc{} && check + std::numeric_limits<long long>::min() == 0)
+ return { std::numeric_limits<long long>::min(), res.ptr - begin };
+ return { };
}
- if (endptr)
- *endptr = res.ptr == prefix.next ? begin : res.ptr;
- return negate && *ok ? -result : result;
+ if (res.ec != std::errc{})
+ return { };
+ return { negate ? -result : result, res.ptr - begin };
}
template <typename Char>
@@ -597,8 +546,7 @@ QString qulltoa(qulonglong number, int base, const QStringView zero)
number /= base;
}
} else { // zero should always be either a non-surrogate or a surrogate pair:
- Q_UNREACHABLE();
- return QString();
+ Q_UNREACHABLE_RETURN(QString());
}
return QString(reinterpret_cast<QChar *>(p), end - p);
@@ -607,18 +555,18 @@ QString qulltoa(qulonglong number, int base, const QStringView zero)
/*!
\internal
- Converts the initial portion of the string pointed to by \a s00 to a double, using the 'C' locale.
+ Converts the initial portion of the string pointed to by \a s00 to a double,
+ using the 'C' locale. The function sets the pointer pointed to by \a se to
+ point to the character past the last character converted.
*/
double qstrntod(const char *s00, qsizetype len, const char **se, bool *ok)
{
- int processed = 0;
- bool nonNullOk = false;
- double d = qt_asciiToDouble(s00, len, nonNullOk, processed, TrailingJunkAllowed);
+ auto r = qt_asciiToDouble(s00, len, TrailingJunkAllowed);
if (se)
- *se = s00 + processed;
+ *se = s00 + (r.used < 0 ? -r.used : r.used);
if (ok)
- *ok = nonNullOk;
- return d;
+ *ok = r.ok();
+ return r.result;
}
QString qdtoa(qreal d, int *decpt, int *sign)
@@ -628,7 +576,7 @@ QString qdtoa(qreal d, int *decpt, int *sign)
int length = 0;
// Some versions of libdouble-conversion like an extra digit, probably for '\0'
- constexpr int digits = std::numeric_limits<double>::max_digits10 + 1;
+ constexpr qsizetype digits = std::numeric_limits<double>::max_digits10 + 1;
char result[digits];
qt_doubleToAscii(d, QLocaleData::DFSignificantDigits, QLocale::FloatingPointShortest,
result, digits, nonNullSign, length, nonNullDecpt);
@@ -638,7 +586,7 @@ QString qdtoa(qreal d, int *decpt, int *sign)
if (decpt)
*decpt = nonNullDecpt;
- return QLatin1String(result, length);
+ return QLatin1StringView(result, length);
}
static QLocaleData::DoubleForm resolveFormat(int precision, int decpt, qsizetype length)
@@ -703,7 +651,7 @@ static T dtoString(double d, QLocaleData::DoubleForm form, int precision, bool u
int bufSize = 1;
if (precision == QLocale::FloatingPointShortest)
bufSize += D::max_digits10;
- else if (form == QLocaleData::DFDecimal && qIsFinite(d))
+ else if (form == QLocaleData::DFDecimal && qt_is_finite(d))
bufSize += wholePartSpace(qAbs(d)) + precision;
else // Add extra digit due to different interpretations of precision.
bufSize += qMax(2, precision) + 1; // Must also be big enough for "nan" or "inf"
@@ -714,11 +662,11 @@ static T dtoString(double d, QLocaleData::DoubleForm form, int precision, bool u
bool negative = false;
int length = 0;
int decpt = 0;
- qt_doubleToAscii(d, form, precision, buffer.data(), buffer.length(), negative, length, decpt);
- QLatin1String view(buffer.data(), buffer.data() + length);
+ qt_doubleToAscii(d, form, precision, buffer.data(), buffer.size(), negative, length, decpt);
+ QLatin1StringView view(buffer.data(), length);
const bool succinct = form == QLocaleData::DFSignificantDigits;
qsizetype total = (negative ? 1 : 0) + length;
- if (qIsFinite(d)) {
+ if (qt_is_finite(d)) {
if (succinct)
form = resolveFormat(precision, decpt, view.size());
@@ -760,7 +708,7 @@ static T dtoString(double d, QLocaleData::DoubleForm form, int precision, bool u
if (negative && !isZero(d)) // We don't return "-0"
result.append(Char('-'));
- if (!qIsFinite(d)) {
+ if (!qt_is_finite(d)) {
result.append(view);
if (uppercase)
result = std::move(result).toUpper();
@@ -781,7 +729,7 @@ static T dtoString(double d, QLocaleData::DoubleForm form, int precision, bool u
result.append(Char(uppercase ? 'E' : 'e'));
result.append(Char(exponent < 0 ? '-' : '+'));
exponent = std::abs(exponent);
- Q_ASSUME(exponent <= D::max_exponent10 + D::max_digits10);
+ Q_ASSERT(exponent <= D::max_exponent10 + D::max_digits10);
int exponentDigits = digits(exponent);
// C's printf guarantees a two-digit exponent, and so do we:
if (exponentDigits == 1)
diff --git a/src/corelib/text/qlocale_tools_p.h b/src/corelib/text/qlocale_tools_p.h
index a4dbcf209b..9b02403ea4 100644
--- a/src/corelib/text/qlocale_tools_p.h
+++ b/src/corelib/text/qlocale_tools_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QLOCALE_TOOLS_P_H
#define QLOCALE_TOOLS_P_H
@@ -63,9 +27,11 @@ enum StrayCharacterMode {
};
// API note: this function can't process a number with more than 2.1 billion digits
-[[nodiscard]] double qt_asciiToDouble(const char *num, qsizetype numLen, bool &ok, int &processed,
- StrayCharacterMode strayCharMode = TrailingJunkProhibited);
-void qt_doubleToAscii(double d, QLocaleData::DoubleForm form, int precision, char *buf, int bufSize,
+[[nodiscard]] QSimpleParsedNumber<double>
+qt_asciiToDouble(const char *num, qsizetype numLen,
+ StrayCharacterMode strayCharMode = TrailingJunkProhibited);
+void qt_doubleToAscii(double d, QLocaleData::DoubleForm form, int precision,
+ char *buf, qsizetype bufSize,
bool &sign, int &length, int &decpt);
[[nodiscard]] QString qulltoBasicLatin(qulonglong l, int base, bool negative);
@@ -94,7 +60,7 @@ void qt_doubleToAscii(double d, QLocaleData::DoubleForm form, int precision, cha
template <typename UcsInt>
[[nodiscard]] inline UcsInt unicodeForDigit(uint digit, UcsInt zero)
{
- // Must match QLocaleData::numericToCLocale()'s digit-digestion.
+ // Must match qlocale.cpp's NumberTokenizer's digit-digestion.
Q_ASSERT(digit < 10);
if (!digit)
return zero;
@@ -116,10 +82,9 @@ template <typename UcsInt>
return qstrntod(s00, len, se, ok);
}
-[[nodiscard]] qlonglong qstrntoll(const char *nptr, qsizetype size, const char **endptr,
- int base, bool *ok);
-[[nodiscard]] qulonglong qstrntoull(const char *nptr, qsizetype size, const char **endptr,
- int base, bool *ok);
+[[nodiscard]] Q_AUTOTEST_EXPORT
+QSimpleParsedNumber<qlonglong> qstrntoll(const char *nptr, qsizetype size, int base);
+[[nodiscard]] QSimpleParsedNumber<qulonglong> qstrntoull(const char *nptr, qsizetype size, int base);
QT_END_NAMESPACE
diff --git a/src/corelib/text/qlocale_unix.cpp b/src/corelib/text/qlocale_unix.cpp
index 84afaa377c..a934f24c01 100644
--- a/src/corelib/text/qlocale_unix.cpp
+++ b/src/corelib/text/qlocale_unix.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qlocale_p.h"
@@ -47,6 +11,8 @@
QT_BEGIN_NAMESPACE
+using namespace Qt::StringLiterals;
+
#ifndef QT_NO_SYSTEMLOCALE
struct QSystemLocaleData
{
@@ -144,12 +110,12 @@ QLocale QSystemLocale::fallbackLocale() const
if (lang.isEmpty())
lang = qEnvironmentVariable("LANG");
// if the locale is the "C" locale, then we can return the language we found here:
- if (lang.isEmpty() || lang == QLatin1String("C") || lang == QLatin1String("POSIX"))
+ if (lang.isEmpty() || lang == "C"_L1 || lang == "POSIX"_L1)
return QLocale(lang);
// ... otherwise, if the first part of LANGUAGE says more than or
// contradicts what we have, use that:
- for (const auto &language : qEnvironmentVariable("LANGUAGE").tokenize(QLatin1Char(':'))) {
+ for (const auto &language : qEnvironmentVariable("LANGUAGE").tokenize(u':')) {
if (contradicts(language, lang))
return QLocale(language);
break; // We only look at the first entry.
@@ -158,7 +124,7 @@ QLocale QSystemLocale::fallbackLocale() const
return QLocale(lang);
}
-QVariant QSystemLocale::query(QueryType type, QVariant in) const
+QVariant QSystemLocale::query(QueryType type, QVariant &&in) const
{
QSystemLocaleData *d = qSystemLocaleData();
@@ -260,9 +226,9 @@ QVariant QSystemLocale::query(QueryType type, QVariant in) const
}
case MeasurementSystem: {
const QString meas_locale = QString::fromLatin1(d->lc_measurement_var);
- if (meas_locale.compare(QLatin1String("Metric"), Qt::CaseInsensitive) == 0)
+ if (meas_locale.compare("Metric"_L1, Qt::CaseInsensitive) == 0)
return QLocale::MetricSystem;
- if (meas_locale.compare(QLatin1String("Other"), Qt::CaseInsensitive) == 0)
+ if (meas_locale.compare("Other"_L1, Qt::CaseInsensitive) == 0)
return QLocale::MetricSystem;
return QVariant((int)QLocale(meas_locale).measurementSystem());
}
@@ -276,28 +242,31 @@ QVariant QSystemLocale::query(QueryType type, QVariant in) const
if (languages.isEmpty())
lst.append(QString::fromLatin1(d->lc_messages_var));
else
- lst = languages.split(QLatin1Char(':'));
+ lst = languages.split(u':');
- // Inadequate for various cases of a language that's written in more
- // than one script in the same country, e.g. Sindhi in India.
- // However, can clients of the UILanguage query cope if we include script ?
- for (int i = 0; i < lst.size(); ++i) {
- QStringView lang, cntry;
- if (qt_splitLocaleName(lst.at(i), &lang, nullptr, &cntry)) {
- d->uiLanguages.append(
- cntry.size() ? lang % QLatin1Char('-') % cntry : lang.toString());
+ for (const QString &e : std::as_const(lst)) {
+ QStringView language, script, territory;
+ if (qt_splitLocaleName(e, &language, &script, &territory)) {
+ QString joined = language.isEmpty() ? u"und"_s : language.toString();
+ if (!script.isEmpty())
+ joined += u'-' + script;
+ if (!territory.isEmpty())
+ joined += u'-' + territory;
+ d->uiLanguages.append(joined);
}
}
return d->uiLanguages.isEmpty() ? QVariant() : QVariant(d->uiLanguages);
}
case StringToStandardQuotation:
- return lc_messages.quoteString(qvariant_cast<QStringView>(in));
+ return lc_messages.quoteString(qvariant_cast<QStringView>(std::move(in)));
case StringToAlternateQuotation:
- return lc_messages.quoteString(qvariant_cast<QStringView>(in), QLocale::AlternateQuotation);
+ return lc_messages.quoteString(qvariant_cast<QStringView>(std::move(in)),
+ QLocale::AlternateQuotation);
case ListToSeparatedString:
return lc_messages.createSeparatedList(in.toStringList());
case LocaleChanged:
Q_ASSERT(false);
+ [[fallthrough]];
default:
break;
}
diff --git a/src/corelib/text/qlocale_wasm.cpp b/src/corelib/text/qlocale_wasm.cpp
new file mode 100644
index 0000000000..6b011af4a7
--- /dev/null
+++ b/src/corelib/text/qlocale_wasm.cpp
@@ -0,0 +1,54 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#include "qlocale_p.h"
+
+#include <emscripten/val.h>
+
+#include <string>
+#include <vector>
+
+QT_BEGIN_NAMESPACE
+
+#ifndef QT_NO_SYSTEMLOCALE
+
+namespace {
+
+QStringList navigatorLanguages()
+{
+ using emscripten::val;
+ const val navigator = val::global("navigator");
+ const auto languages = emscripten::vecFromJSArray<std::string>(navigator["languages"]);
+ QStringList qtLanguages;
+ for (const std::string& language : languages)
+ qtLanguages.append(QString::fromStdString(language));
+ return qtLanguages;
+}
+
+}
+
+QVariant QSystemLocale::query(QueryType query, QVariant &&in) const
+{
+ Q_UNUSED(in);
+
+ switch (query) {
+ case QSystemLocale::UILanguages:
+ return QVariant(navigatorLanguages());
+ default:
+ break;
+ }
+
+ return QVariant();
+}
+
+QLocale QSystemLocale::fallbackLocale() const
+{
+ const QStringList languages = navigatorLanguages();
+ if (languages.isEmpty())
+ return QLocale(u"en-US");
+ return QLocale(languages[0]);
+}
+
+#endif // QT_NO_SYSTEMLOCALE
+
+QT_END_NAMESPACE
diff --git a/src/corelib/text/qlocale_win.cpp b/src/corelib/text/qlocale_win.cpp
index dafe441ee0..9fdb46a4c9 100644
--- a/src/corelib/text/qlocale_win.cpp
+++ b/src/corelib/text/qlocale_win.cpp
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// Copyright (C) 2016 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qlocale_p.h"
#include "qlocale_tools_p.h"
@@ -48,30 +12,60 @@
#include "QtCore/private/qgregoriancalendar_p.h" // for yearSharingWeekDays()
-#ifdef Q_OS_WIN
-# include <qt_windows.h>
-# include <time.h>
-#endif
+#include <q20algorithm.h>
+
+// TODO QTBUG-121193: port away from the use of LCID to always use names.
+#include <qt_windows.h>
+#include <time.h>
+
+#if QT_CONFIG(cpp_winrt)
+# include <QtCore/private/qt_winrtbase_p.h>
-#if defined(Q_CC_MSVC) && !defined(Q_CC_CLANG)
-# include <winrt/base.h>
-// Workaround for Windows SDK bug.
-// See https://github.com/microsoft/Windows.UI.Composition-Win32-Samples/issues/47
-namespace winrt::impl
-{
- template <typename Async>
- auto wait_for(Async const& async, Windows::Foundation::TimeSpan const& timeout);
-}
# include <winrt/Windows.Foundation.h>
# include <winrt/Windows.Foundation.Collections.h>
# include <winrt/Windows.System.UserProfile.h>
-#endif // defined(Q_CC_MSVC) && !defined(Q_CC_CLANG)
+#endif // QT_CONFIG(cpp_winrt)
QT_BEGIN_NAMESPACE
+using namespace Qt::StringLiterals;
+
+// Shared interpretation of %LANG%
+static auto scanLangEnv()
+{
+ struct R
+ {
+ QByteArray name; // empty means unknown; lookup from id may work
+ LCID id = 0; // 0 means unknown; lookup from name may work
+ } result;
+ const QByteArray lang = qgetenv("LANG");
+ if (lang.size() && (lang == "C" || qt_splitLocaleName(QString::fromLocal8Bit(lang)))) {
+ // See if we have a Windows locale code instead of a locale name:
+ const auto [id, used] = qstrntoll(lang.data(), lang.size(), 0);
+ if (used > 0 && id && INT_MIN <= id && id <= INT_MAX)
+ return R {QByteArray(), static_cast<LCID>(id)};
+ return R {lang, 0};
+ }
+ return R{};
+}
+
+static auto getDefaultWinId()
+{
+ const auto [name, id] = scanLangEnv();
+ if (id)
+ return id;
+
+ if (!name.isEmpty()) {
+ LCID id = LocaleNameToLCID(static_cast<LPCWSTR>(
+ QString::fromUtf8(name).toStdWString().data()), 0);
+ if (id)
+ return id;
+ }
+
+ return GetUserDefaultLCID();
+}
+
static QByteArray getWinLocaleName(LCID id = LOCALE_USER_DEFAULT);
-static QString winIso639LangName(LCID id = LOCALE_USER_DEFAULT);
-static QString winIso3116CtryName(LCID id = LOCALE_USER_DEFAULT);
#ifndef QT_NO_SYSTEMLOCALE
@@ -97,6 +91,17 @@ static QString winIso3116CtryName(LCID id = LOCALE_USER_DEFAULT);
# define LOCALE_SSHORTTIME 0x00000079
#endif
+namespace {
+template <typename T>
+static QVariant nullIfEmpty(T &&value)
+{
+ // For use where we should fall back to CLDR if we got an empty value.
+ if (value.isEmpty())
+ return {};
+ return std::move(value);
+}
+}
+
struct QSystemLocalePrivate
{
QSystemLocalePrivate();
@@ -138,7 +143,7 @@ private:
// cached values:
LCID lcid;
- SubstitutionType substitutionType;
+ SubstitutionType substitutionType = SUnknown;
QString zero; // cached value for zeroDigit()
int getLocaleInfo(LCTYPE type, LPWSTR data, int size);
@@ -151,6 +156,7 @@ private:
SubstitutionType substitution();
QString substituteDigits(QString &&string);
+ QString correctDigits(QString &&string);
QString yearFix(int year, int fakeYear, QString &&formatted);
static QString winToQtFormat(QStringView sys_fmt);
@@ -159,9 +165,8 @@ private:
Q_GLOBAL_STATIC(QSystemLocalePrivate, systemLocalePrivate)
QSystemLocalePrivate::QSystemLocalePrivate()
- : substitutionType(SUnknown)
+ : lcid(getDefaultWinId())
{
- lcid = GetUserDefaultLCID();
}
inline int QSystemLocalePrivate::getCurrencyFormat(DWORD flags, LPCWSTR value, const CURRENCYFMTW *format, LPWSTR data, int size)
@@ -213,10 +218,11 @@ QVariant QSystemLocalePrivate::getLocaleInfo(LCTYPE type)
int QSystemLocalePrivate::getLocaleInfo_int(LCTYPE type)
{
- const QString str = getLocaleInfo(type).toString();
- bool ok = false;
- const int v = str.toInt(&ok);
- return ok ? v : 0;
+ DWORD value;
+ int r = GetLocaleInfo(lcid, type | LOCALE_RETURN_NUMBER,
+ reinterpret_cast<wchar_t *>(&value),
+ sizeof(value) / sizeof(wchar_t));
+ return r == sizeof(value) / sizeof(wchar_t) ? value : 0;
}
QSystemLocalePrivate::SubstitutionType QSystemLocalePrivate::substitution()
@@ -224,25 +230,25 @@ QSystemLocalePrivate::SubstitutionType QSystemLocalePrivate::substitution()
if (substitutionType == SUnknown) {
wchar_t buf[8];
if (!getLocaleInfo(LOCALE_IDIGITSUBSTITUTION, buf, 8)) {
- substitutionType = QSystemLocalePrivate::SNever;
+ substitutionType = SNever;
return substitutionType;
}
if (buf[0] == '1')
- substitutionType = QSystemLocalePrivate::SNever;
+ substitutionType = SNever;
else if (buf[0] == '0')
- substitutionType = QSystemLocalePrivate::SContext;
+ substitutionType = SContext;
else if (buf[0] == '2')
- substitutionType = QSystemLocalePrivate::SAlways;
+ substitutionType = SAlways;
else {
wchar_t digits[11]; // See zeroDigit() for why 11.
if (!getLocaleInfo(LOCALE_SNATIVEDIGITS, digits, 11)) {
- substitutionType = QSystemLocalePrivate::SNever;
+ substitutionType = SNever;
return substitutionType;
}
if (buf[0] == digits[0] + 2)
- substitutionType = QSystemLocalePrivate::SAlways;
+ substitutionType = SAlways;
else
- substitutionType = QSystemLocalePrivate::SNever;
+ substitutionType = SNever;
}
}
return substitutionType;
@@ -258,7 +264,7 @@ QString QSystemLocalePrivate::substituteDigits(QString &&string)
break;
Q_ASSERT(z > '9');
ushort *const qch = reinterpret_cast<ushort *>(string.data());
- for (int i = 0, stop = string.size(); i < stop; ++i) {
+ for (qsizetype i = 0, stop = string.size(); i < stop; ++i) {
ushort &ch = qch[i];
if (ch >= '0' && ch <= '9')
ch = unicodeForDigit(ch - '0', z);
@@ -283,6 +289,11 @@ QString QSystemLocalePrivate::substituteDigits(QString &&string)
return std::move(string);
}
+QString QSystemLocalePrivate::correctDigits(QString &&string)
+{
+ return substitution() == SAlways ? substituteDigits(std::move(string)) : std::move(string);
+}
+
QVariant QSystemLocalePrivate::zeroDigit()
{
if (zero.isEmpty()) {
@@ -300,36 +311,36 @@ QVariant QSystemLocalePrivate::zeroDigit()
zero = QString::fromWCharArray(digits, 1);
}
}
- return zero;
+ return nullIfEmpty(zero); // Do not std::move().
}
QVariant QSystemLocalePrivate::decimalPoint()
{
- return getLocaleInfo(LOCALE_SDECIMAL);
+ return nullIfEmpty(getLocaleInfo(LOCALE_SDECIMAL).toString());
}
QVariant QSystemLocalePrivate::groupSeparator()
{
- return getLocaleInfo(LOCALE_STHOUSAND);
+ return getLocaleInfo(LOCALE_STHOUSAND); // Empty means don't group digits.
}
QVariant QSystemLocalePrivate::negativeSign()
{
- return getLocaleInfo(LOCALE_SNEGATIVESIGN);
+ return nullIfEmpty(getLocaleInfo(LOCALE_SNEGATIVESIGN).toString());
}
QVariant QSystemLocalePrivate::positiveSign()
{
- return getLocaleInfo(LOCALE_SPOSITIVESIGN);
+ return nullIfEmpty(getLocaleInfo(LOCALE_SPOSITIVESIGN).toString());
}
QVariant QSystemLocalePrivate::dateFormat(QLocale::FormatType type)
{
switch (type) {
case QLocale::ShortFormat:
- return winToQtFormat(getLocaleInfo(LOCALE_SSHORTDATE).toString());
+ return nullIfEmpty(winToQtFormat(getLocaleInfo(LOCALE_SSHORTDATE).toString()));
case QLocale::LongFormat:
- return winToQtFormat(getLocaleInfo(LOCALE_SLONGDATE).toString());
+ return nullIfEmpty(winToQtFormat(getLocaleInfo(LOCALE_SLONGDATE).toString()));
case QLocale::NarrowFormat:
break;
}
@@ -340,9 +351,9 @@ QVariant QSystemLocalePrivate::timeFormat(QLocale::FormatType type)
{
switch (type) {
case QLocale::ShortFormat:
- return winToQtFormat(getLocaleInfo(LOCALE_SSHORTTIME).toString());
+ return nullIfEmpty(winToQtFormat(getLocaleInfo(LOCALE_SSHORTTIME).toString()));
case QLocale::LongFormat:
- return winToQtFormat(getLocaleInfo(LOCALE_STIMEFORMAT).toString());
+ return nullIfEmpty(winToQtFormat(getLocaleInfo(LOCALE_STIMEFORMAT).toString()));
case QLocale::NarrowFormat:
break;
}
@@ -351,48 +362,48 @@ QVariant QSystemLocalePrivate::timeFormat(QLocale::FormatType type)
QVariant QSystemLocalePrivate::dateTimeFormat(QLocale::FormatType type)
{
- return QString(dateFormat(type).toString() + QLatin1Char(' ') + timeFormat(type).toString());
+ QVariant d = dateFormat(type), t = timeFormat(type);
+ if (d.typeId() == QMetaType::QString && t.typeId() == QMetaType::QString)
+ return QString(d.toString() + u' ' + t.toString());
+ return {};
}
QVariant QSystemLocalePrivate::dayName(int day, QLocale::FormatType type)
{
if (day < 1 || day > 7)
- return QString();
+ return {};
- static const LCTYPE short_day_map[]
+ static constexpr LCTYPE short_day_map[]
= { LOCALE_SABBREVDAYNAME1, LOCALE_SABBREVDAYNAME2,
LOCALE_SABBREVDAYNAME3, LOCALE_SABBREVDAYNAME4, LOCALE_SABBREVDAYNAME5,
LOCALE_SABBREVDAYNAME6, LOCALE_SABBREVDAYNAME7 };
- static const LCTYPE long_day_map[]
+ static constexpr LCTYPE long_day_map[]
= { LOCALE_SDAYNAME1, LOCALE_SDAYNAME2,
LOCALE_SDAYNAME3, LOCALE_SDAYNAME4, LOCALE_SDAYNAME5,
LOCALE_SDAYNAME6, LOCALE_SDAYNAME7 };
- static const LCTYPE narrow_day_map[]
+ static constexpr LCTYPE narrow_day_map[]
= { LOCALE_SSHORTESTDAYNAME1, LOCALE_SSHORTESTDAYNAME2,
LOCALE_SSHORTESTDAYNAME3, LOCALE_SSHORTESTDAYNAME4,
LOCALE_SSHORTESTDAYNAME5, LOCALE_SSHORTESTDAYNAME6,
LOCALE_SSHORTESTDAYNAME7 };
- day -= 1;
-
- if (type == QLocale::LongFormat)
- return getLocaleInfo(long_day_map[day]);
- if (type == QLocale::NarrowFormat)
- return getLocaleInfo(narrow_day_map[day]);
- return getLocaleInfo(short_day_map[day]);
+ return nullIfEmpty(getLocaleInfo(
+ (type == QLocale::LongFormat ? long_day_map
+ : type == QLocale::NarrowFormat ? narrow_day_map
+ : short_day_map)[day - 1]).toString());
}
QVariant QSystemLocalePrivate::standaloneMonthName(int month, QLocale::FormatType type)
{
- static const LCTYPE short_month_map[]
+ static constexpr LCTYPE short_month_map[]
= { LOCALE_SABBREVMONTHNAME1, LOCALE_SABBREVMONTHNAME2, LOCALE_SABBREVMONTHNAME3,
LOCALE_SABBREVMONTHNAME4, LOCALE_SABBREVMONTHNAME5, LOCALE_SABBREVMONTHNAME6,
LOCALE_SABBREVMONTHNAME7, LOCALE_SABBREVMONTHNAME8, LOCALE_SABBREVMONTHNAME9,
LOCALE_SABBREVMONTHNAME10, LOCALE_SABBREVMONTHNAME11, LOCALE_SABBREVMONTHNAME12 };
- static const LCTYPE long_month_map[]
+ static constexpr LCTYPE long_month_map[]
= { LOCALE_SMONTHNAME1, LOCALE_SMONTHNAME2, LOCALE_SMONTHNAME3,
LOCALE_SMONTHNAME4, LOCALE_SMONTHNAME5, LOCALE_SMONTHNAME6,
LOCALE_SMONTHNAME7, LOCALE_SMONTHNAME8, LOCALE_SMONTHNAME9,
@@ -402,8 +413,8 @@ QVariant QSystemLocalePrivate::standaloneMonthName(int month, QLocale::FormatTyp
return {};
// Month is Jan = 1, ... Dec = 12; adjust by 1 to match array indexing from 0:
- return getLocaleInfo(
- (type == QLocale::LongFormat ? long_month_map : short_month_map)[month - 1]);
+ return nullIfEmpty(getLocaleInfo(
+ (type == QLocale::LongFormat ? long_month_map : short_month_map)[month - 1]).toString());
}
QVariant QSystemLocalePrivate::monthName(int month, QLocale::FormatType type)
@@ -422,10 +433,7 @@ QVariant QSystemLocalePrivate::monthName(int month, QLocale::FormatType type)
wchar_t buf[255];
if (getDateFormat(flags, &st, format, buf, 255) > 2) {
// Elide the two digits of day number
- QString text = QString::fromWCharArray(buf + 2);
- if (substitution() == SAlways)
- text = substituteDigits(std::move(text));
- return text;
+ return nullIfEmpty(correctDigits(QString::fromWCharArray(buf + 2)));
}
return {};
}
@@ -444,7 +452,7 @@ QString QSystemLocalePrivate::yearFix(int year, int fakeYear, QString &&formatte
Q_ASSERT(fakeYear >= 1970 && fakeYear <= 2400);
const bool matchTwo = year >= 0 && year % 100 == fakeYear % 100;
auto yearUsed = fourDigitYear(fakeYear);
- QString sign(year < 0 ? 1 : 0, QLatin1Char('-'));
+ QString sign(year < 0 ? 1 : 0, u'-');
auto trueYear = fourDigitYear(year < 0 ? -year : year);
if (formatted.contains(yearUsed))
return std::move(formatted).replace(yearUsed, sign + trueYear);
@@ -457,7 +465,7 @@ QString QSystemLocalePrivate::yearFix(int year, int fakeYear, QString &&formatte
return std::move(formatted).replace(tail.toString(), sign + trueYear.last(2));
}
- // Localized digits, perhaps ?
+ // Localized digits (regardless of SAlways), perhaps ?
// First call to substituteDigits() ensures zero is initialized:
trueYear = substituteDigits(std::move(trueYear));
if (zero != u'0') {
@@ -468,7 +476,7 @@ QString QSystemLocalePrivate::yearFix(int year, int fakeYear, QString &&formatte
if (formatted.contains(yearUsed))
return std::move(formatted).replace(yearUsed, sign + trueYear);
- const int twoDigits = 2 * zero.size();
+ const qsizetype twoDigits = 2 * zero.size();
tail = QStringView{yearUsed}.last(twoDigits);
if (formatted.contains(tail)) {
if (matchTwo)
@@ -502,9 +510,7 @@ QVariant QSystemLocalePrivate::toString(QDate date, QLocale::FormatType type)
QString text = QString::fromWCharArray(buf);
if (fixup)
text = yearFix(year, st.wYear, std::move(text));
- if (substitution() == SAlways)
- text = substituteDigits(std::move(text));
- return text;
+ return nullIfEmpty(correctDigits(std::move(text)));
}
return {};
}
@@ -519,22 +525,23 @@ QVariant QSystemLocalePrivate::toString(QTime time, QLocale::FormatType type)
DWORD flags = 0;
// keep the same conditional as timeFormat() above
- if (type == QLocale::ShortFormat)
- flags = TIME_NOSECONDS;
+ const QString format = type == QLocale::ShortFormat
+ ? getLocaleInfo(LOCALE_SSHORTTIME).toString()
+ : QString();
+ auto formatStr = reinterpret_cast<const wchar_t *>(format.isEmpty() ? nullptr : format.utf16());
wchar_t buf[255];
- if (getTimeFormat(flags, &st, NULL, buf, 255)) {
- QString text = QString::fromWCharArray(buf);
- if (substitution() == SAlways)
- text = substituteDigits(std::move(text));
- return text;
- }
+ if (getTimeFormat(flags, &st, formatStr, buf, int(std::size(buf))))
+ return nullIfEmpty(correctDigits(QString::fromWCharArray(buf)));
return {};
}
QVariant QSystemLocalePrivate::toString(const QDateTime &dt, QLocale::FormatType type)
{
- return QString(toString(dt.date(), type).toString() + QLatin1Char(' ') + toString(dt.time(), type).toString());
+ QVariant d = toString(dt.date(), type), t = toString(dt.time(), type);
+ if (d.typeId() == QMetaType::QString && t.typeId() == QMetaType::QString)
+ return QString(d.toString() + u' ' + t.toString());
+ return {};
}
QVariant QSystemLocalePrivate::measurementSystem()
@@ -542,10 +549,8 @@ QVariant QSystemLocalePrivate::measurementSystem()
wchar_t output[2];
if (getLocaleInfo(LOCALE_IMEASURE, output, 2)) {
- QString iMeasure = QString::fromWCharArray(output);
- if (iMeasure == QLatin1String("1")) {
+ if (output[0] == L'1' && !output[1])
return QLocale::ImperialSystem;
- }
}
return QLocale::MetricSystem;
@@ -561,7 +566,7 @@ QVariant QSystemLocalePrivate::amText()
wchar_t output[15]; // maximum length including terminating zero character for Win2003+
if (getLocaleInfo(LOCALE_S1159, output, 15))
- return QString::fromWCharArray(output);
+ return nullIfEmpty(QString::fromWCharArray(output));
return QVariant();
}
@@ -571,7 +576,7 @@ QVariant QSystemLocalePrivate::pmText()
wchar_t output[15]; // maximum length including terminating zero character for Win2003+
if (getLocaleInfo(LOCALE_S2359, output, 15))
- return QString::fromWCharArray(output);
+ return nullIfEmpty(QString::fromWCharArray(output));
return QVariant();
}
@@ -591,12 +596,14 @@ QVariant QSystemLocalePrivate::currencySymbol(QLocale::CurrencySymbolFormat form
wchar_t buf[13];
switch (format) {
case QLocale::CurrencySymbol:
+ // Some locales do have empty currency symbol. All the same, fall back
+ // to CLDR for confirmation if MS claims that applies.
if (getLocaleInfo(LOCALE_SCURRENCY, buf, 13))
- return QString::fromWCharArray(buf);
+ return nullIfEmpty(QString::fromWCharArray(buf));
break;
case QLocale::CurrencyIsoCode:
if (getLocaleInfo(LOCALE_SINTLSYMBOL, buf, 9))
- return QString::fromWCharArray(buf);
+ return nullIfEmpty(QString::fromWCharArray(buf));
break;
case QLocale::CurrencyDisplayName: {
QVarLengthArray<wchar_t, 64> buf(64);
@@ -607,7 +614,7 @@ QVariant QSystemLocalePrivate::currencySymbol(QLocale::CurrencySymbolFormat form
if (!getLocaleInfo(LOCALE_SNATIVECURRNAME, buf.data(), buf.size()))
break;
}
- return QString::fromWCharArray(buf.data());
+ return nullIfEmpty(QString::fromWCharArray(buf.data()));
}
default:
break;
@@ -667,7 +674,7 @@ QVariant QSystemLocalePrivate::toCurrencyString(const QSystemLocale::CurrencyToS
// int(32) == "12,34,56,789.00" == string("3;2;0")
// int(320)== "1234,56,789.00" == string("3;2")
QString groupingStr = getLocaleInfo(LOCALE_SMONGROUPING).toString();
- format.Grouping = groupingStr.remove(QLatin1Char(';')).toInt();
+ format.Grouping = groupingStr.remove(u';').toInt();
if (format.Grouping % 10 == 0) // magic
format.Grouping /= 10;
else
@@ -685,25 +692,25 @@ QVariant QSystemLocalePrivate::toCurrencyString(const QSystemLocale::CurrencyToS
pformat, out.data(), out.size());
}
- value = QString::fromWCharArray(out.data());
- if (substitution() == SAlways)
- value = substituteDigits(std::move(value));
- return value;
+ return nullIfEmpty(correctDigits(QString::fromWCharArray(out.data())));
}
QVariant QSystemLocalePrivate::uiLanguages()
{
QStringList result;
-#if defined(Q_CC_MSVC) && !defined(Q_CC_CLANG) // msvc supports WinRT calls
+#if QT_CONFIG(cpp_winrt)
using namespace winrt;
- using namespace Windows::Foundation;
using namespace Windows::System::UserProfile;
- auto languages = GlobalizationPreferences::Languages();
- for (const auto &lang : languages)
- result << QString::fromStdString(winrt::to_string(lang));
+ QT_TRY {
+ auto languages = GlobalizationPreferences::Languages();
+ for (const auto &lang : languages)
+ result << QString::fromStdString(winrt::to_string(lang));
+ } QT_CATCH(...) {
+ // pass, just fall back to WIN32 API implementation
+ }
if (!result.isEmpty())
return result; // else just fall back to WIN32 API implementation
-#endif // defined(Q_CC_MSVC) && !defined(Q_CC_CLANG)
+#endif // QT_CONFIG(cpp_winrt)
// mingw and clang still have to use Win32 API
unsigned long cnt = 0;
QVarLengthArray<wchar_t, 64> buf(64);
@@ -715,7 +722,7 @@ QVariant QSystemLocalePrivate::uiLanguages()
GetUserPreferredUILanguages(MUI_LANGUAGE_NAME, &cnt, NULL, &size)) {
buf.resize(size);
if (!GetUserPreferredUILanguages(MUI_LANGUAGE_NAME, &cnt, buf.data(), &size))
- return QStringList();
+ return {};
}
}
# endif // !QT_BOOTSTRAPPED
@@ -728,7 +735,7 @@ QVariant QSystemLocalePrivate::uiLanguages()
result.append(s);
str += s.size() + 1;
}
- return result;
+ return nullIfEmpty(std::move(result));
}
QVariant QSystemLocalePrivate::nativeLanguageName()
@@ -744,7 +751,7 @@ QVariant QSystemLocalePrivate::nativeTerritoryName()
void QSystemLocalePrivate::update()
{
- lcid = GetUserDefaultLCID();
+ lcid = getDefaultWinId();
substitutionType = SUnknown;
zero.resize(0);
}
@@ -752,20 +759,20 @@ void QSystemLocalePrivate::update()
QString QSystemLocalePrivate::winToQtFormat(QStringView sys_fmt)
{
QString result;
- int i = 0;
+ qsizetype i = 0;
while (i < sys_fmt.size()) {
- if (sys_fmt.at(i).unicode() == QLatin1Char('\'')) {
+ if (sys_fmt.at(i).unicode() == u'\'') {
QString text = qt_readEscapedFormatString(sys_fmt, &i);
- if (text == QLatin1String("'"))
- result += QLatin1String("''");
+ if (text == "'"_L1)
+ result += "''"_L1;
else
- result += QLatin1Char('\'') + text + QLatin1Char('\'');
+ result += u'\'' + text + u'\'';
continue;
}
QChar c = sys_fmt.at(i);
- int repeat = qt_repeatCount(sys_fmt.mid(i));
+ qsizetype repeat = qt_repeatCount(sys_fmt.mid(i));
switch (c.unicode()) {
// Date
@@ -776,13 +783,13 @@ QString QSystemLocalePrivate::winToQtFormat(QStringView sys_fmt)
repeat = 2;
switch (repeat) {
case 1:
- result += QLatin1String("yy"); // "y" unsupported by Qt, use "yy"
+ result += "yy"_L1; // "y" unsupported by Qt, use "yy"
break;
case 5:
- result += QLatin1String("yyyy"); // "yyyyy" same as "yyyy" on Windows
+ result += "yyyy"_L1; // "yyyyy" same as "yyyy" on Windows
break;
default:
- result += QString(repeat, QLatin1Char('y'));
+ result += QString(repeat, u'y');
break;
}
break;
@@ -793,14 +800,14 @@ QString QSystemLocalePrivate::winToQtFormat(QStringView sys_fmt)
case 2:
break; // no equivalent of "gg" in Qt
default:
- result += QLatin1Char('g');
+ result += u'g';
break;
}
break;
case 't':
if (repeat > 2)
repeat = 2;
- result += QLatin1String("AP"); // "t" unsupported, use "AP"
+ result += "AP"_L1; // "t" unsupported, use "AP"
break;
default:
result += QString(repeat, c);
@@ -818,7 +825,7 @@ QLocale QSystemLocale::fallbackLocale() const
return QLocale(QString::fromLatin1(getWinLocaleName()));
}
-QVariant QSystemLocale::query(QueryType type, QVariant in) const
+QVariant QSystemLocale::query(QueryType type, QVariant &&in) const
{
QSystemLocalePrivate *d = systemLocalePrivate();
switch(type) {
@@ -902,7 +909,7 @@ QVariant QSystemLocale::query(QueryType type, QVariant in) const
case CurrencySymbol:
return d->currencySymbol(QLocale::CurrencySymbolFormat(in.toUInt()));
case CurrencyToString:
- return d->toCurrencyString(in.value<QSystemLocale::CurrencyToStringArgument>());
+ return d->toCurrencyString(in.value<CurrencyToStringArgument>());
case UILanguages:
return d->uiLanguages();
case LocaleChanged:
@@ -924,8 +931,18 @@ struct WindowsToISOListElt {
char iso_name[6];
};
-/* NOTE: This array should be sorted by the first column! */
-static const WindowsToISOListElt windows_to_iso_list[] = {
+namespace {
+struct ByWindowsCode {
+ constexpr bool operator()(int lhs, WindowsToISOListElt rhs) const noexcept
+ { return lhs < int(rhs.windows_code); }
+ constexpr bool operator()(WindowsToISOListElt lhs, int rhs) const noexcept
+ { return int(lhs.windows_code) < rhs; }
+ constexpr bool operator()(WindowsToISOListElt lhs, WindowsToISOListElt rhs) const noexcept
+ { return lhs.windows_code < rhs.windows_code; }
+};
+} // unnamed namespace
+
+static constexpr WindowsToISOListElt windows_to_iso_list[] = {
{ 0x0401, "ar_SA" },
{ 0x0402, "bg\0 " },
{ 0x0403, "ca\0 " },
@@ -1036,40 +1053,33 @@ static const WindowsToISOListElt windows_to_iso_list[] = {
{ 0x500a, "es_PR" }
};
-static const int windows_to_iso_count
- = sizeof(windows_to_iso_list)/sizeof(WindowsToISOListElt);
+static_assert(q20::is_sorted(std::begin(windows_to_iso_list), std::end(windows_to_iso_list),
+ ByWindowsCode{}));
static const char *winLangCodeToIsoName(int code)
{
int cmp = code - windows_to_iso_list[0].windows_code;
if (cmp < 0)
- return 0;
+ return nullptr;
if (cmp == 0)
return windows_to_iso_list[0].iso_name;
- int begin = 0;
- int end = windows_to_iso_count;
-
- while (end - begin > 1) {
- uint mid = (begin + end)/2;
-
- const WindowsToISOListElt *elt = windows_to_iso_list + mid;
- int cmp = code - elt->windows_code;
- if (cmp < 0)
- end = mid;
- else if (cmp > 0)
- begin = mid;
- else
- return elt->iso_name;
- }
+ const auto it = std::lower_bound(std::begin(windows_to_iso_list),
+ std::end(windows_to_iso_list),
+ code,
+ ByWindowsCode{});
+ if (it != std::end(windows_to_iso_list) && !ByWindowsCode{}(code, *it))
+ return it->iso_name;
- return 0;
+ return nullptr;
}
LCID qt_inIsoNametoLCID(const char *name)
{
+ if (!name)
+ return LOCALE_USER_DEFAULT;
// handle norwegian manually, the list above will fail
if (!strncmp(name, "nb", 2))
return 0x0414;
@@ -1106,14 +1116,12 @@ static QString winIso639LangName(LCID id)
lang_code = QString::fromWCharArray(out);
if (!lang_code.isEmpty()) {
- const char *endptr;
- bool ok;
- QByteArray latin1_lang_code = std::move(lang_code).toLatin1();
- int i = qstrntoull(latin1_lang_code.data(), latin1_lang_code.size(), &endptr, 16, &ok);
- if (ok && *endptr == '\0') {
+ const QByteArray latin1 = std::move(lang_code).toLatin1();
+ const auto [i, used] = qstrntoull(latin1.data(), latin1.size(), 16);
+ if (used >= latin1.size() || (used > 0 && latin1[used] == '\0')) {
switch (i) {
case 0x814:
- result = QLatin1String("nn"); // Nynorsk
+ result = u"nn"_s; // Nynorsk
break;
default:
break;
@@ -1146,28 +1154,24 @@ static QByteArray getWinLocaleName(LCID id)
{
QByteArray result;
if (id == LOCALE_USER_DEFAULT) {
- static const QByteArray langEnvVar = qgetenv("LANG");
- result = langEnvVar;
- if (result == "C"
- || (!result.isEmpty() && qt_splitLocaleName(QString::fromLocal8Bit(result)))) {
- bool ok = false; // See if we have a Windows locale code instead of a locale name:
- long id = qstrntoll(result.data(), result.size(), 0, 0, &ok);
- if (!ok || id == 0 || id < INT_MIN || id > INT_MAX) // Assume real locale name
- return result;
- return winLangCodeToIsoName(int(id));
- }
- }
+ const auto [name, lcid] = scanLangEnv();
+ if (!name.isEmpty())
+ return name;
+ if (lcid)
+ return winLangCodeToIsoName(lcid);
- if (id == LOCALE_USER_DEFAULT)
id = GetUserDefaultLCID();
+ }
+
QString resultusage = winIso639LangName(id);
QString country = winIso3116CtryName(id);
if (!country.isEmpty())
- resultusage += QLatin1Char('_') + country;
+ resultusage += u'_' + country;
return std::move(resultusage).toLatin1();
}
+// Helper for plugins/platforms/windows/
Q_CORE_EXPORT QLocale qt_localeFromLCID(LCID id)
{
return QLocale(QString::fromLatin1(getWinLocaleName(id)));
diff --git a/src/corelib/text/qregularexpression.cpp b/src/corelib/text/qregularexpression.cpp
index 1db27fc4e4..67c422568b 100644
--- a/src/corelib/text/qregularexpression.cpp
+++ b/src/corelib/text/qregularexpression.cpp
@@ -1,43 +1,7 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 Giuseppe D'Angelo <dangelog@gmail.com>.
-** Copyright (C) 2020 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
-** Copyright (C) 2021 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 Giuseppe D'Angelo <dangelog@gmail.com>.
+// Copyright (C) 2020 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qregularexpression.h"
@@ -47,7 +11,6 @@
#include <QtCore/qmutex.h>
#include <QtCore/qstringlist.h>
#include <QtCore/qdebug.h>
-#include <QtCore/qthreadstorage.h>
#include <QtCore/qglobal.h>
#include <QtCore/qatomic.h>
#include <QtCore/qdatastream.h>
@@ -62,6 +25,8 @@
QT_BEGIN_NAMESPACE
+using namespace Qt::StringLiterals;
+
/*!
\class QRegularExpression
\inmodule QtCore
@@ -756,7 +721,7 @@ struct QRegularExpressionPrivate : QSharedData
CheckSubjectStringOption checkSubjectStringOption = CheckSubjectString,
const QRegularExpressionMatchPrivate *previous = nullptr) const;
- int captureIndexForName(QStringView name) const;
+ int captureIndexForName(QAnyStringView name) const;
// sizeof(QSharedData) == 4, so start our members with an enum
QRegularExpression::PatternOptions patternOptions;
@@ -826,6 +791,24 @@ struct QRegularExpressionMatchIteratorPrivate : QSharedData
/*!
\internal
+
+ Used to centralize the warning about using an invalid QRegularExpression.
+ In case the pattern is an illegal UTF-16 string, we can't pass print it
+ (pass it to qUtf16Printable, etc.), so we need to check for that.
+*/
+Q_DECL_COLD_FUNCTION
+void qtWarnAboutInvalidRegularExpression(const QString &pattern, const char *where)
+{
+ if (pattern.isValidUtf16()) {
+ qWarning("%s(): called on an invalid QRegularExpression object "
+ "(pattern is '%ls')", where, qUtf16Printable(pattern));
+ } else {
+ qWarning("%s(): called on an invalid QRegularExpression object", where);
+ }
+}
+
+/*!
+ \internal
*/
QRegularExpression::QRegularExpression(QRegularExpressionPrivate &dd)
: d(&dd)
@@ -911,7 +894,7 @@ void QRegularExpressionPrivate::compilePattern()
PCRE2_SIZE patternErrorOffset;
compiledPattern = pcre2_compile_16(reinterpret_cast<PCRE2_SPTR16>(pattern.constData()),
- pattern.length(),
+ pattern.size(),
options,
&errorCode,
&patternErrorOffset,
@@ -962,43 +945,24 @@ void QRegularExpressionPrivate::getPatternInfo()
Simple "smartpointer" wrapper around a pcre2_jit_stack_16, to be used with
QThreadStorage.
*/
-class QPcreJitStackPointer
+namespace {
+struct PcreJitStackFree
{
- Q_DISABLE_COPY(QPcreJitStackPointer)
-
-public:
- /*!
- \internal
- */
- QPcreJitStackPointer()
- {
- // The default JIT stack size in PCRE is 32K,
- // we allocate from 32K up to 512K.
- stack = pcre2_jit_stack_create_16(32 * 1024, 512 * 1024, nullptr);
- }
- /*!
- \internal
- */
- ~QPcreJitStackPointer()
+ void operator()(pcre2_jit_stack_16 *stack)
{
if (stack)
pcre2_jit_stack_free_16(stack);
}
-
- pcre2_jit_stack_16 *stack;
};
-
-Q_GLOBAL_STATIC(QThreadStorage<QPcreJitStackPointer *>, jitStacks)
+Q_CONSTINIT static thread_local std::unique_ptr<pcre2_jit_stack_16, PcreJitStackFree> jitStacks;
+}
/*!
\internal
*/
static pcre2_jit_stack_16 *qtPcreCallback(void *)
{
- if (jitStacks()->hasLocalData())
- return jitStacks()->localData()->stack;
-
- return nullptr;
+ return jitStacks.get();
}
/*!
@@ -1049,7 +1013,7 @@ void QRegularExpressionPrivate::optimizePattern()
Returns the capturing group number for the given name. Duplicated names for
capturing groups are not supported.
*/
-int QRegularExpressionPrivate::captureIndexForName(QStringView name) const
+int QRegularExpressionPrivate::captureIndexForName(QAnyStringView name) const
{
Q_ASSERT(!name.isEmpty());
@@ -1094,9 +1058,10 @@ static int safe_pcre2_match_16(const pcre2_code_16 *code,
int result = pcre2_match_16(code, subject, length,
startOffset, options, matchData, matchContext);
- if (result == PCRE2_ERROR_JIT_STACKLIMIT && !jitStacks()->hasLocalData()) {
- QPcreJitStackPointer *p = new QPcreJitStackPointer;
- jitStacks()->setLocalData(p);
+ if (result == PCRE2_ERROR_JIT_STACKLIMIT && !jitStacks) {
+ // The default JIT stack size in PCRE is 32K,
+ // we allocate from 32K up to 512K.
+ jitStacks.reset(pcre2_jit_stack_create_16(32 * 1024, 512 * 1024, NULL));
result = pcre2_match_16(code, subject, length,
startOffset, options, matchData, matchContext);
@@ -1139,7 +1104,7 @@ void QRegularExpressionPrivate::doMatch(QRegularExpressionMatchPrivate *priv,
const QRegularExpressionMatchPrivate *previous) const
{
Q_ASSERT(priv);
- Q_ASSUME(priv != previous);
+ Q_ASSERT(priv != previous);
const qsizetype subjectLength = priv->subject.size();
@@ -1150,7 +1115,7 @@ void QRegularExpressionPrivate::doMatch(QRegularExpressionMatchPrivate *priv,
return;
if (Q_UNLIKELY(!compiledPattern)) {
- qWarning("QRegularExpressionPrivate::doMatch(): called on an invalid QRegularExpression object");
+ qtWarnAboutInvalidRegularExpression(pattern, "QRegularExpressionPrivate::doMatch");
return;
}
@@ -1212,8 +1177,8 @@ void QRegularExpressionPrivate::doMatch(QRegularExpressionMatchPrivate *priv,
if (usingCrLfNewlines
&& offset < subjectLength
- && subjectUtf16[offset - 1] == QLatin1Char('\r')
- && subjectUtf16[offset] == QLatin1Char('\n')) {
+ && subjectUtf16[offset - 1] == u'\r'
+ && subjectUtf16[offset] == u'\n') {
++offset;
} else if (offset < subjectLength
&& QChar::isLowSurrogate(subjectUtf16[offset])) {
@@ -1389,10 +1354,7 @@ QRegularExpression::QRegularExpression(const QString &pattern, PatternOptions op
\sa operator=()
*/
-QRegularExpression::QRegularExpression(const QRegularExpression &re)
- : d(re.d)
-{
-}
+QRegularExpression::QRegularExpression(const QRegularExpression &re) noexcept = default;
/*!
\fn QRegularExpression::QRegularExpression(QRegularExpression &&re)
@@ -1421,11 +1383,7 @@ QT_DEFINE_QESDP_SPECIALIZATION_DTOR(QRegularExpressionPrivate)
Assigns the regular expression \a re to this object, and returns a reference
to the copy. Both the pattern and the pattern options are copied.
*/
-QRegularExpression &QRegularExpression::operator=(const QRegularExpression &re)
-{
- d = re.d;
- return *this;
-}
+QRegularExpression &QRegularExpression::operator=(const QRegularExpression &re) noexcept = default;
/*!
\fn void QRegularExpression::swap(QRegularExpression &other)
@@ -1550,7 +1508,7 @@ QStringList QRegularExpression::namedCaptureGroups() const
reinterpret_cast<const char16_t *>(namedCapturingTable) + namedCapturingTableEntrySize * i;
const int index = *currentNamedCapturingTableRow;
- result[index] = QString::fromUtf16(currentNamedCapturingTableRow + 1);
+ result[index] = QStringView(currentNamedCapturingTableRow + 1).toString();
}
return result;
@@ -1582,10 +1540,10 @@ QString QRegularExpression::errorString() const
QString errorString;
int errorStringLength;
do {
- errorString.resize(errorString.length() + 64);
+ errorString.resize(errorString.size() + 64);
errorStringLength = pcre2_get_error_message_16(d->errorCode,
reinterpret_cast<ushort *>(errorString.data()),
- errorString.length());
+ errorString.size());
} while (errorStringLength < 0);
errorString.resize(errorStringLength);
@@ -1596,7 +1554,7 @@ QString QRegularExpression::errorString() const
#endif
}
#ifdef QT_NO_TRANSLATION
- return QLatin1String("no error");
+ return u"no error"_s;
#else
return QCoreApplication::translate("QRegularExpression", "no error");
#endif
@@ -1623,11 +1581,6 @@ qsizetype QRegularExpression::patternErrorOffset() const
The returned QRegularExpressionMatch object contains the results of the
match.
- \note The data referenced by \a subject should remain valid as long
- as there are QRegularExpressionMatch objects using it. At the moment
- Qt makes a (shallow) copy of the data, but this behavior may change
- in a future version of Qt.
-
\sa QRegularExpressionMatch, {normal matching}
*/
QRegularExpressionMatch QRegularExpression::match(const QString &subject,
@@ -1645,9 +1598,26 @@ QRegularExpressionMatch QRegularExpression::match(const QString &subject,
return QRegularExpressionMatch(*priv);
}
+#if QT_DEPRECATED_SINCE(6, 8)
/*!
\since 6.0
\overload
+ \obsolete
+
+ Use matchView() instead.
+*/
+QRegularExpressionMatch QRegularExpression::match(QStringView subjectView,
+ qsizetype offset,
+ MatchType matchType,
+ MatchOptions matchOptions) const
+{
+ return matchView(subjectView, offset, matchType, matchOptions);
+}
+#endif // QT_DEPRECATED_SINCE(6, 8)
+
+/*!
+ \since 6.5
+ \overload
Attempts to match the regular expression against the given \a subjectView
string view, starting at the position \a offset inside the subject, using a
@@ -1661,10 +1631,10 @@ QRegularExpressionMatch QRegularExpression::match(const QString &subject,
\sa QRegularExpressionMatch, {normal matching}
*/
-QRegularExpressionMatch QRegularExpression::match(QStringView subjectView,
- qsizetype offset,
- MatchType matchType,
- MatchOptions matchOptions) const
+QRegularExpressionMatch QRegularExpression::matchView(QStringView subjectView,
+ qsizetype offset,
+ MatchType matchType,
+ MatchOptions matchOptions) const
{
d.data()->compilePattern();
auto priv = new QRegularExpressionMatchPrivate(*this,
@@ -1685,11 +1655,6 @@ QRegularExpressionMatch QRegularExpression::match(QStringView subjectView,
The returned QRegularExpressionMatchIterator is positioned before the
first match result (if any).
- \note The data referenced by \a subject should remain valid as long
- as there are QRegularExpressionMatch objects using it. At the moment
- Qt makes a (shallow) copy of the data, but this behavior may change
- in a future version of Qt.
-
\sa QRegularExpressionMatchIterator, {global matching}
*/
QRegularExpressionMatchIterator QRegularExpression::globalMatch(const QString &subject,
@@ -1706,9 +1671,26 @@ QRegularExpressionMatchIterator QRegularExpression::globalMatch(const QString &s
return QRegularExpressionMatchIterator(*priv);
}
+#if QT_DEPRECATED_SINCE(6, 8)
/*!
\since 6.0
\overload
+ \obsolete
+
+ Use globalMatchView() instead.
+*/
+QRegularExpressionMatchIterator QRegularExpression::globalMatch(QStringView subjectView,
+ qsizetype offset,
+ MatchType matchType,
+ MatchOptions matchOptions) const
+{
+ return globalMatchView(subjectView, offset, matchType, matchOptions);
+}
+#endif // QT_DEPRECATED_SINCE(6, 8)
+
+/*!
+ \since 6.5
+ \overload
Attempts to perform a global match of the regular expression against the
given \a subjectView string view, starting at the position \a offset inside the
@@ -1724,16 +1706,16 @@ QRegularExpressionMatchIterator QRegularExpression::globalMatch(const QString &s
\sa QRegularExpressionMatchIterator, {global matching}
*/
-QRegularExpressionMatchIterator QRegularExpression::globalMatch(QStringView subjectView,
- qsizetype offset,
- MatchType matchType,
- MatchOptions matchOptions) const
+QRegularExpressionMatchIterator QRegularExpression::globalMatchView(QStringView subjectView,
+ qsizetype offset,
+ MatchType matchType,
+ MatchOptions matchOptions) const
{
QRegularExpressionMatchIteratorPrivate *priv =
new QRegularExpressionMatchIteratorPrivate(*this,
matchType,
matchOptions,
- match(subjectView, offset, matchType, matchOptions));
+ matchView(subjectView, offset, matchType, matchOptions));
return QRegularExpressionMatchIterator(*priv);
}
@@ -1796,12 +1778,10 @@ size_t qHash(const QRegularExpression &key, size_t seed) noexcept
return qHashMulti(seed, key.d->pattern, key.d->patternOptions);
}
-#if QT_STRINGVIEW_LEVEL < 2
/*!
\fn QString QRegularExpression::escape(const QString &str)
\overload
*/
-#endif // QT_STRINGVIEW_LEVEL < 2
/*!
\since 5.15
@@ -1838,14 +1818,13 @@ QString QRegularExpression::escape(QStringView str)
// unlike Perl, a literal NUL must be escaped with
// "\\0" (backslash + 0) and not "\\\0" (backslash + NUL),
// because pcre16_compile uses a NUL-terminated string
- result.append(QLatin1Char('\\'));
- result.append(QLatin1Char('0'));
- } else if ( (current < QLatin1Char('a') || current > QLatin1Char('z')) &&
- (current < QLatin1Char('A') || current > QLatin1Char('Z')) &&
- (current < QLatin1Char('0') || current > QLatin1Char('9')) &&
- current != QLatin1Char('_') )
- {
- result.append(QLatin1Char('\\'));
+ result.append(u'\\');
+ result.append(u'0');
+ } else if ((current < u'a' || current > u'z') &&
+ (current < u'A' || current > u'Z') &&
+ (current < u'0' || current > u'9') &&
+ current != u'_') {
+ result.append(u'\\');
result.append(current);
if (current.isHighSurrogate() && i < (count - 1))
result.append(str.at(++i));
@@ -1858,13 +1837,11 @@ QString QRegularExpression::escape(QStringView str)
return result;
}
-#if QT_STRINGVIEW_LEVEL < 2
/*!
\since 5.12
\fn QString QRegularExpression::wildcardToRegularExpression(const QString &pattern, WildcardConversionOptions options)
\overload
*/
-#endif // QT_STRINGVIEW_LEVEL < 2
/*!
\since 6.0
@@ -1879,22 +1856,30 @@ QString QRegularExpression::escape(QStringView str)
\value UnanchoredWildcardConversion
The conversion will not anchor the pattern. This allows for partial string matches of
wildcard expressions.
+
+ \value [since 6.6] NonPathWildcardConversion
+ The conversion will \e{not} interpret the pattern as filepath globbing.
+
+ \sa QRegularExpression::wildcardToRegularExpression
*/
/*!
\since 5.15
Returns a regular expression representation of the given glob \a pattern.
- The transformation is targeting file path globbing, which means in particular
- that path separators receive special treatment. This implies that it is not
- just a basic translation from "*" to ".*".
+
+ There are two transformations possible, one that targets file path
+ globbing, and another one which is more generic.
+
+ By default, the transformation is targeting file path globbing,
+ which means in particular that path separators receive special
+ treatment. This implies that it is not just a basic translation
+ from "*" to ".*" and similar.
\snippet code/src_corelib_text_qregularexpression.cpp 31
- By default, the returned regular expression is fully anchored. In other
- words, there is no need of calling anchoredPattern() again on the
- result. To get an a regular expression that is not anchored, pass
- UnanchoredWildcardConversion as the conversion \a options.
+ The more generic globbing transformation is available by passing
+ \c NonPathWildcardConversion in the conversion \a options.
This implementation follows closely the definition
of wildcard for glob patterns:
@@ -1903,10 +1888,12 @@ QString QRegularExpression::escape(QStringView str)
\li Any character represents itself apart from those mentioned
below. Thus \b{c} matches the character \e c.
\row \li \b{?}
- \li Matches any single character. It is the same as
- \b{.} in full regexps.
+ \li Matches any single character, except for a path separator
+ (in case file path globbing has been selected). It is the
+ same as b{.} in full regexps.
\row \li \b{*}
- \li Matches zero or more of any characters. It is the
+ \li Matches zero or more of any characters, except for path
+ separators (in case file path globbing has been selected). It is the
same as \b{.*} in full regexps.
\row \li \b{[abc]}
\li Matches one character given in the bracket.
@@ -1920,9 +1907,10 @@ QString QRegularExpression::escape(QStringView str)
bracket. It is the same as \b{[^a-c]} in full regexp.
\endtable
- \note The backslash (\\) character is \e not an escape char in this context.
- In order to match one of the special characters, place it in square brackets
- (for example, \c{[?]}).
+ \note For historical reasons, a backslash (\\) character is \e not
+ an escape char in this context. In order to match one of the
+ special characters, place it in square brackets (for example,
+ \c{[?]}).
More information about the implementation can be found in:
\list
@@ -1930,6 +1918,11 @@ QString QRegularExpression::escape(QStringView str)
\li \c {man 7 glob}
\endlist
+ By default, the returned regular expression is fully anchored. In other
+ words, there is no need of calling anchoredPattern() again on the
+ result. To get a regular expression that is not anchored, pass
+ UnanchoredWildcardConversion in the conversion \a options.
+
\sa escape()
*/
QString QRegularExpression::wildcardToRegularExpression(QStringView pattern, WildcardConversionOptions options)
@@ -1940,29 +1933,51 @@ QString QRegularExpression::wildcardToRegularExpression(QStringView pattern, Wil
qsizetype i = 0;
const QChar *wc = pattern.data();
+ struct GlobSettings {
+ char16_t nativePathSeparator;
+ QStringView starEscape;
+ QStringView questionMarkEscape;
+ };
+
+ const GlobSettings settings = [options]() {
+ if (options.testFlag(NonPathWildcardConversion)) {
+ // using [\d\D] to mean "match everything";
+ // dot doesn't match newlines, unless in /s mode
+ return GlobSettings{ u'\0', u"[\\d\\D]*", u"[\\d\\D]" };
+ } else {
#ifdef Q_OS_WIN
- const QLatin1Char nativePathSeparator('\\');
- const QLatin1String starEscape("[^/\\\\]*");
- const QLatin1String questionMarkEscape("[^/\\\\]");
+ return GlobSettings{ u'\\', u"[^/\\\\]*", u"[^/\\\\]" };
#else
- const QLatin1Char nativePathSeparator('/');
- const QLatin1String starEscape("[^/]*");
- const QLatin1String questionMarkEscape("[^/]");
+ return GlobSettings{ u'/', u"[^/]*", u"[^/]" };
#endif
+ }
+ }();
while (i < wclen) {
const QChar c = wc[i++];
switch (c.unicode()) {
case '*':
- rx += starEscape;
+ rx += settings.starEscape;
break;
case '?':
- rx += questionMarkEscape;
+ rx += settings.questionMarkEscape;
break;
+ // When not using filepath globbing: \ is escaped, / is itself
+ // When using filepath globbing:
+ // * Unix: \ gets escaped. / is itself
+ // * Windows: \ and / can match each other -- they become [/\\] in regexp
case '\\':
#ifdef Q_OS_WIN
+ if (options.testFlag(NonPathWildcardConversion))
+ rx += u"\\\\";
+ else
+ rx += u"[/\\\\]";
+ break;
case '/':
- rx += QLatin1String("[/\\\\]");
+ if (options.testFlag(NonPathWildcardConversion))
+ rx += u'/';
+ else
+ rx += u"[/\\\\]";
break;
#endif
case '$':
@@ -1974,29 +1989,31 @@ QString QRegularExpression::wildcardToRegularExpression(QStringView pattern, Wil
case '{':
case '|':
case '}':
- rx += QLatin1Char('\\');
+ rx += u'\\';
rx += c;
break;
case '[':
rx += c;
// Support for the [!abc] or [!a-c] syntax
if (i < wclen) {
- if (wc[i] == QLatin1Char('!')) {
- rx += QLatin1Char('^');
+ if (wc[i] == u'!') {
+ rx += u'^';
++i;
}
- if (i < wclen && wc[i] == QLatin1Char(']'))
+ if (i < wclen && wc[i] == u']')
rx += wc[i++];
- while (i < wclen && wc[i] != QLatin1Char(']')) {
- // The '/' appearing in a character class invalidates the
- // regular expression parsing. It also concerns '\\' on
- // Windows OS types.
- if (wc[i] == QLatin1Char('/') || wc[i] == nativePathSeparator)
- return rx;
- if (wc[i] == QLatin1Char('\\'))
- rx += QLatin1Char('\\');
+ while (i < wclen && wc[i] != u']') {
+ if (!options.testFlag(NonPathWildcardConversion)) {
+ // The '/' appearing in a character class invalidates the
+ // regular expression parsing. It also concerns '\\' on
+ // Windows OS types.
+ if (wc[i] == u'/' || wc[i] == settings.nativePathSeparator)
+ return rx;
+ }
+ if (wc[i] == u'\\')
+ rx += u'\\';
rx += wc[i++];
}
}
@@ -2034,13 +2051,11 @@ QRegularExpression QRegularExpression::fromWildcard(QStringView pattern, Qt::Cas
return QRegularExpression(wildcardToRegularExpression(pattern, options), reOptions);
}
-#if QT_STRINGVIEW_LEVEL < 2
/*!
\fn QRegularExpression::anchoredPattern(const QString &expression)
\since 5.12
\overload
*/
-#endif // QT_STRINGVIEW_LEVEL < 2
/*!
\since 5.15
@@ -2051,9 +2066,9 @@ QRegularExpression QRegularExpression::fromWildcard(QStringView pattern, Qt::Cas
QString QRegularExpression::anchoredPattern(QStringView expression)
{
return QString()
- + QLatin1String("\\A(?:")
+ + "\\A(?:"_L1
+ expression
- + QLatin1String(")\\z");
+ + ")\\z"_L1;
}
/*!
@@ -2202,8 +2217,7 @@ int QRegularExpressionMatch::lastCapturedIndex() const
}
/*!
- \fn bool QRegularExpressionMatch::hasCaptured(const QString &name) const
- \fn bool QRegularExpressionMatch::hasCaptured(QStringView name) const
+ \fn bool QRegularExpressionMatch::hasCaptured(QAnyStringView name) const
\since 6.3
Returns true if the capturing group named \a name captured something
@@ -2220,9 +2234,12 @@ int QRegularExpressionMatch::lastCapturedIndex() const
Similarly, a capturing group may capture a substring of length 0;
this function will return \c{true} for such a capturing group.
+ \note In Qt versions prior to 6.8, this function took QString or
+ QStringView, not QAnyStringView.
+
\sa captured(), hasMatch()
*/
-bool QRegularExpressionMatch::hasCaptured(QStringView name) const
+bool QRegularExpressionMatch::hasCaptured(QAnyStringView name) const
{
const int nth = d->regularExpression.d->captureIndexForName(name);
return hasCaptured(nth);
@@ -2302,19 +2319,6 @@ QStringView QRegularExpressionMatch::capturedView(int nth) const
return d->subject.mid(start, capturedLength(nth));
}
-#if QT_STRINGVIEW_LEVEL < 2
-/*! \fn QString QRegularExpressionMatch::captured(const QString &name) const
-
- Returns the substring captured by the capturing group named \a name.
-
- If the named capturing group \a name did not capture a string, or if
- there is no capturing group named \a name, returns a null QString.
-
- \sa capturedView(), capturedStart(), capturedEnd(), capturedLength(),
- QString::isNull()
-*/
-#endif // QT_STRINGVIEW_LEVEL < 2
-
/*!
\since 5.10
@@ -2323,10 +2327,13 @@ QStringView QRegularExpressionMatch::capturedView(int nth) const
If the named capturing group \a name did not capture a string, or if
there is no capturing group named \a name, returns a null QString.
+ \note In Qt versions prior to 6.8, this function took QString or
+ QStringView, not QAnyStringView.
+
\sa capturedView(), capturedStart(), capturedEnd(), capturedLength(),
QString::isNull()
*/
-QString QRegularExpressionMatch::captured(QStringView name) const
+QString QRegularExpressionMatch::captured(QAnyStringView name) const
{
if (name.isEmpty()) {
qWarning("QRegularExpressionMatch::captured: empty capturing group name passed");
@@ -2345,10 +2352,13 @@ QString QRegularExpressionMatch::captured(QStringView name) const
If the named capturing group \a name did not capture a string, or if
there is no capturing group named \a name, returns a null QStringView.
+ \note In Qt versions prior to 6.8, this function took QString or
+ QStringView, not QAnyStringView.
+
\sa captured(), capturedStart(), capturedEnd(), capturedLength(),
QStringView::isNull()
*/
-QStringView QRegularExpressionMatch::capturedView(QStringView name) const
+QStringView QRegularExpressionMatch::capturedView(QAnyStringView name) const
{
if (name.isEmpty()) {
qWarning("QRegularExpressionMatch::capturedView: empty capturing group name passed");
@@ -2420,39 +2430,6 @@ qsizetype QRegularExpressionMatch::capturedEnd(int nth) const
return d->capturedOffsets.at(nth * 2 + 1);
}
-#if QT_STRINGVIEW_LEVEL < 2
-/*! \fn qsizetype QRegularExpressionMatch::capturedStart(const QString &name) const
-
- Returns the offset inside the subject string corresponding to the starting
- position of the substring captured by the capturing group named \a name.
- If the capturing group named \a name did not capture a string or doesn't
- exist, returns -1.
-
- \sa capturedEnd(), capturedLength(), captured()
-*/
-
-/*! \fn qsizetype QRegularExpressionMatch::capturedLength(const QString &name) const
-
- Returns the length of the substring captured by the capturing group named
- \a name.
-
- \note This function returns 0 if the capturing group named \a name did not
- capture a string or doesn't exist.
-
- \sa capturedStart(), capturedEnd(), captured()
-*/
-
-/*! \fn qsizetype QRegularExpressionMatch::capturedEnd(const QString &name) const
-
- Returns the offset inside the subject string immediately after the ending
- position of the substring captured by the capturing group named \a name. If
- the capturing group named \a name did not capture a string or doesn't
- exist, returns -1.
-
- \sa capturedStart(), capturedLength(), captured()
-*/
-#endif // QT_STRINGVIEW_LEVEL < 2
-
/*!
\since 5.10
@@ -2461,9 +2438,12 @@ qsizetype QRegularExpressionMatch::capturedEnd(int nth) const
If the capturing group named \a name did not capture a string or doesn't
exist, returns -1.
+ \note In Qt versions prior to 6.8, this function took QString or
+ QStringView, not QAnyStringView.
+
\sa capturedEnd(), capturedLength(), captured()
*/
-qsizetype QRegularExpressionMatch::capturedStart(QStringView name) const
+qsizetype QRegularExpressionMatch::capturedStart(QAnyStringView name) const
{
if (name.isEmpty()) {
qWarning("QRegularExpressionMatch::capturedStart: empty capturing group name passed");
@@ -2484,9 +2464,12 @@ qsizetype QRegularExpressionMatch::capturedStart(QStringView name) const
\note This function returns 0 if the capturing group named \a name did not
capture a string or doesn't exist.
+ \note In Qt versions prior to 6.8, this function took QString or
+ QStringView, not QAnyStringView.
+
\sa capturedStart(), capturedEnd(), captured()
*/
-qsizetype QRegularExpressionMatch::capturedLength(QStringView name) const
+qsizetype QRegularExpressionMatch::capturedLength(QAnyStringView name) const
{
if (name.isEmpty()) {
qWarning("QRegularExpressionMatch::capturedLength: empty capturing group name passed");
@@ -2506,9 +2489,12 @@ qsizetype QRegularExpressionMatch::capturedLength(QStringView name) const
the capturing group named \a name did not capture a string or doesn't
exist, returns -1.
+ \note In Qt versions prior to 6.8, this function took QString or
+ QStringView, not QAnyStringView.
+
\sa capturedStart(), capturedLength(), captured()
*/
-qsizetype QRegularExpressionMatch::capturedEnd(QStringView name) const
+qsizetype QRegularExpressionMatch::capturedEnd(QAnyStringView name) const
{
if (name.isEmpty()) {
qWarning("QRegularExpressionMatch::capturedEnd: empty capturing group name passed");
@@ -2700,7 +2686,7 @@ QRegularExpressionMatch QRegularExpressionMatchIterator::next()
}
d.detach();
- return qExchange(d->next, d->next.d.constData()->nextMatch());
+ return std::exchange(d->next, d->next.d.constData()->nextMatch());
}
/*!
@@ -3089,7 +3075,8 @@ static const char *pcreCompileErrorCodes[] =
QT_TRANSLATE_NOOP("QRegularExpression", "heap limit exceeded"),
QT_TRANSLATE_NOOP("QRegularExpression", "invalid syntax"),
QT_TRANSLATE_NOOP("QRegularExpression", "internal error - duplicate substitution match"),
- QT_TRANSLATE_NOOP("QRegularExpression", "PCRE2_MATCH_INVALID_UTF is not supported for DFA matching")
+ QT_TRANSLATE_NOOP("QRegularExpression", "PCRE2_MATCH_INVALID_UTF is not supported for DFA matching"),
+ QT_TRANSLATE_NOOP("QRegularExpression", "INTERNAL ERROR: invalid substring offset")
};
#endif // #if 0
diff --git a/src/corelib/text/qregularexpression.h b/src/corelib/text/qregularexpression.h
index 2d81d0c254..2b51b94b15 100644
--- a/src/corelib/text/qregularexpression.h
+++ b/src/corelib/text/qregularexpression.h
@@ -1,43 +1,7 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 Giuseppe D'Angelo <dangelog@gmail.com>.
-** Copyright (C) 2020 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
-** Copyright (C) 2021 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 Giuseppe D'Angelo <dangelog@gmail.com>.
+// Copyright (C) 2020 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QREGULAREXPRESSION_H
#define QREGULAREXPRESSION_H
@@ -54,8 +18,6 @@ QT_REQUIRE_CONFIG(regularexpression);
QT_BEGIN_NAMESPACE
-class QLatin1String;
-
class QRegularExpressionMatch;
class QRegularExpressionMatchIterator;
struct QRegularExpressionPrivate;
@@ -88,10 +50,10 @@ public:
QRegularExpression();
explicit QRegularExpression(const QString &pattern, PatternOptions options = NoPatternOption);
- QRegularExpression(const QRegularExpression &re);
+ QRegularExpression(const QRegularExpression &re) noexcept;
QRegularExpression(QRegularExpression &&re) = default;
~QRegularExpression();
- QRegularExpression &operator=(const QRegularExpression &re);
+ QRegularExpression &operator=(const QRegularExpression &re) noexcept;
QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_PURE_SWAP(QRegularExpression)
void swap(QRegularExpression &other) noexcept { d.swap(other.d); }
@@ -129,11 +91,20 @@ public:
MatchType matchType = NormalMatch,
MatchOptions matchOptions = NoMatchOption) const;
+#if QT_DEPRECATED_SINCE(6, 8)
[[nodiscard]]
+ QT_DEPRECATED_VERSION_X_6_8("Use matchView instead.")
QRegularExpressionMatch match(QStringView subjectView,
qsizetype offset = 0,
MatchType matchType = NormalMatch,
MatchOptions matchOptions = NoMatchOption) const;
+#endif
+
+ [[nodiscard]]
+ QRegularExpressionMatch matchView(QStringView subjectView,
+ qsizetype offset = 0,
+ MatchType matchType = NormalMatch,
+ MatchOptions matchOptions = NoMatchOption) const;
[[nodiscard]]
QRegularExpressionMatchIterator globalMatch(const QString &subject,
@@ -141,21 +112,30 @@ public:
MatchType matchType = NormalMatch,
MatchOptions matchOptions = NoMatchOption) const;
+#if QT_DEPRECATED_SINCE(6, 8)
[[nodiscard]]
+ QT_DEPRECATED_VERSION_X_6_8("Use globalMatchView instead.")
QRegularExpressionMatchIterator globalMatch(QStringView subjectView,
qsizetype offset = 0,
MatchType matchType = NormalMatch,
MatchOptions matchOptions = NoMatchOption) const;
+#endif
+
+ [[nodiscard]]
+ QRegularExpressionMatchIterator globalMatchView(QStringView subjectView,
+ qsizetype offset = 0,
+ MatchType matchType = NormalMatch,
+ MatchOptions matchOptions = NoMatchOption) const;
void optimize() const;
enum WildcardConversionOption {
DefaultWildcardConversion = 0x0,
- UnanchoredWildcardConversion = 0x1
+ UnanchoredWildcardConversion = 0x1,
+ NonPathWildcardConversion = 0x2,
};
Q_DECLARE_FLAGS(WildcardConversionOptions, WildcardConversionOption)
-#if QT_STRINGVIEW_LEVEL < 2
static QString escape(const QString &str)
{
return escape(qToStringViewIgnoringNull(str));
@@ -170,7 +150,6 @@ public:
{
return anchoredPattern(qToStringViewIgnoringNull(expression));
}
-#endif
static QString escape(QStringView str);
static QString wildcardToRegularExpression(QStringView str, WildcardConversionOptions options = DefaultWildcardConversion);
@@ -196,6 +175,7 @@ private:
Q_DECLARE_SHARED(QRegularExpression)
Q_DECLARE_OPERATORS_FOR_FLAGS(QRegularExpression::PatternOptions)
Q_DECLARE_OPERATORS_FOR_FLAGS(QRegularExpression::MatchOptions)
+Q_DECLARE_OPERATORS_FOR_FLAGS(QRegularExpression::WildcardConversionOptions)
#ifndef QT_NO_DATASTREAM
Q_CORE_EXPORT QDataStream &operator<<(QDataStream &out, const QRegularExpression &re);
@@ -233,23 +213,26 @@ public:
int lastCapturedIndex() const;
-#if QT_STRINGVIEW_LEVEL < 2
+#if QT_CORE_REMOVED_SINCE(6, 8)
bool hasCaptured(const QString &name) const
- { return hasCaptured(QStringView(name)); }
-#endif
+ { return hasCaptured(qToAnyStringViewIgnoringNull(name)); }
bool hasCaptured(QStringView name) const;
+#endif
+ bool hasCaptured(QAnyStringView name) const;
bool hasCaptured(int nth) const;
QString captured(int nth = 0) const;
QStringView capturedView(int nth = 0) const;
-#if QT_STRINGVIEW_LEVEL < 2
+#if QT_CORE_REMOVED_SINCE(6, 8)
QString captured(const QString &name) const
- { return captured(QStringView(name)); }
-#endif
+ { return captured(qToAnyStringViewIgnoringNull(name)); }
QString captured(QStringView name) const;
QStringView capturedView(QStringView name) const;
+#endif
+ QString captured(QAnyStringView name) const;
+ QStringView capturedView(QAnyStringView name) const;
QStringList capturedTexts() const;
@@ -257,18 +240,21 @@ public:
qsizetype capturedLength(int nth = 0) const;
qsizetype capturedEnd(int nth = 0) const;
-#if QT_STRINGVIEW_LEVEL < 2
+#if QT_CORE_REMOVED_SINCE(6, 8)
qsizetype capturedStart(const QString &name) const
- { return capturedStart(QStringView(name)); }
+ { return capturedStart(qToAnyStringViewIgnoringNull(name)); }
qsizetype capturedLength(const QString &name) const
- { return capturedLength(QStringView(name)); }
+ { return capturedLength(qToAnyStringViewIgnoringNull(name)); }
qsizetype capturedEnd(const QString &name) const
- { return capturedEnd(QStringView(name)); }
-#endif
+ { return capturedEnd(qToAnyStringViewIgnoringNull(name)); }
qsizetype capturedStart(QStringView name) const;
qsizetype capturedLength(QStringView name) const;
qsizetype capturedEnd(QStringView name) const;
+#endif
+ qsizetype capturedStart(QAnyStringView name) const;
+ qsizetype capturedLength(QAnyStringView name) const;
+ qsizetype capturedEnd(QAnyStringView name) const;
private:
friend class QRegularExpression;
diff --git a/src/corelib/text/qstaticlatin1stringmatcher.h b/src/corelib/text/qstaticlatin1stringmatcher.h
new file mode 100644
index 0000000000..d80ebd8547
--- /dev/null
+++ b/src/corelib/text/qstaticlatin1stringmatcher.h
@@ -0,0 +1,140 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QSTATICLATIN1STRINGMATCHER_H
+#define QSTATICLATIN1STRINGMATCHER_H
+
+#include <functional>
+#include <iterator>
+#include <limits>
+
+#include <QtCore/q20algorithm.h>
+#include <QtCore/qlatin1stringmatcher.h>
+#include <QtCore/qstring.h>
+
+QT_BEGIN_NAMESPACE
+
+#ifdef Q_CC_GHS
+# define QT_STATIC_BOYER_MOORE_NOT_SUPPORTED
+#else
+namespace QtPrivate {
+template <class RandomIt1,
+ class Hash = std::hash<typename std::iterator_traits<RandomIt1>::value_type>,
+ class BinaryPredicate = std::equal_to<>>
+class q_boyer_moore_searcher
+{
+public:
+ constexpr q_boyer_moore_searcher(RandomIt1 pat_first, RandomIt1 pat_last) : m_skiptable{}
+ {
+ const size_t n = std::distance(pat_first, pat_last);
+ constexpr auto uchar_max = (std::numeric_limits<uchar>::max)();
+ uchar max = n > uchar_max ? uchar_max : uchar(n);
+ q20::fill(std::begin(m_skiptable), std::end(m_skiptable), max);
+ Hash hf;
+ RandomIt1 pattern = std::next(pat_first, n - max);
+ while (max--)
+ m_skiptable[hf(*pattern++)] = max;
+ }
+
+ template <class RandomIt2>
+ constexpr auto operator()(RandomIt2 first, RandomIt2 last, RandomIt1 pat_first,
+ RandomIt1 pat_last) const
+ {
+ struct R
+ {
+ RandomIt2 begin, end;
+ };
+ Hash hf;
+ BinaryPredicate pred;
+ auto pat_length = std::distance(pat_first, pat_last);
+ if (pat_length == 0)
+ return R{ first, first };
+
+ auto haystack_length = std::distance(first, last);
+ if (haystack_length < pat_length)
+ return R{ last, last };
+
+ const qsizetype pl_minus_one = qsizetype(pat_length - 1);
+ RandomIt2 current = first + pl_minus_one;
+
+ qsizetype skip = 0;
+ while (current < last - skip) {
+ current += skip;
+ skip = m_skiptable[hf(*current)];
+ if (!skip) {
+ // possible match
+ while (skip < pat_length) {
+ if (!pred(hf(*(current - skip)), hf(pat_first[pl_minus_one - skip])))
+ break;
+ skip++;
+ }
+ if (skip > pl_minus_one) { // we have a match
+ auto match = current + 1 - skip;
+ return R{ match, match + pat_length };
+ }
+
+ // If we don't have a match we are a bit inefficient as we only skip by one
+ // when we have the non matching char in the string.
+ if (m_skiptable[hf(*(current - skip))] == pat_length)
+ skip = pat_length - skip;
+ else
+ skip = 1;
+ }
+ }
+
+ return R{ last, last };
+ }
+
+private:
+ alignas(16) uchar m_skiptable[256];
+};
+} // namespace QtPrivate
+
+template <Qt::CaseSensitivity CS, size_t N>
+class QStaticLatin1StringMatcher
+{
+ static_assert(N > 2,
+ "QStaticLatin1StringMatcher makes no sense for finding a single-char pattern");
+
+ QLatin1StringView m_pattern;
+ using Hasher = std::conditional_t<CS == Qt::CaseSensitive, QtPrivate::QCaseSensitiveLatin1Hash,
+ QtPrivate::QCaseInsensitiveLatin1Hash>;
+ QtPrivate::q_boyer_moore_searcher<const char *, Hasher> m_searcher;
+
+public:
+ explicit constexpr QStaticLatin1StringMatcher(QLatin1StringView patternToMatch) noexcept
+ : m_pattern(patternToMatch),
+ m_searcher(patternToMatch.begin(), patternToMatch.begin() + N - 1)
+ {
+ }
+
+ constexpr qsizetype indexIn(QLatin1StringView haystack, qsizetype from = 0) const noexcept
+ {
+ if (from >= haystack.size())
+ return -1;
+ const char *begin = haystack.begin() + from;
+ const char *end = haystack.end();
+ const auto r = m_searcher(begin, end, m_pattern.begin(), m_pattern.end());
+ return r.begin == end ? -1 : std::distance(haystack.begin(), r.begin);
+ }
+};
+
+template <size_t N>
+constexpr auto qMakeStaticCaseSensitiveLatin1StringMatcher(const char (&patternToMatch)[N]) noexcept
+{
+ return QStaticLatin1StringMatcher<Qt::CaseSensitive, N>(
+ QLatin1StringView(patternToMatch, qsizetype(N) - 1));
+}
+
+template <size_t N>
+constexpr auto
+qMakeStaticCaseInsensitiveLatin1StringMatcher(const char (&patternToMatch)[N]) noexcept
+{
+ return QStaticLatin1StringMatcher<Qt::CaseInsensitive, N>(
+ QLatin1StringView(patternToMatch, qsizetype(N) - 1));
+}
+#endif
+
+QT_END_NAMESPACE
+
+#endif // QSTATICLATIN1STRINGMATCHER_H
diff --git a/src/corelib/text/qstaticlatin1stringmatcher.qdoc b/src/corelib/text/qstaticlatin1stringmatcher.qdoc
new file mode 100644
index 0000000000..6577f985b2
--- /dev/null
+++ b/src/corelib/text/qstaticlatin1stringmatcher.qdoc
@@ -0,0 +1,86 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
+
+/*! \class QStaticLatin1StringMatcher
+ \inmodule QtCore
+ \brief The QStaticLatin1StringMatcher class is a compile-time version
+ of QLatin1StringMatcher.
+
+ \since 6.7
+ \ingroup tools
+ \ingroup string-processing
+
+ This class is useful when your code needs to search efficiently
+ in Latin-1 strings for a substring that's known at compile-time.
+ This is common, for example, in parsers. Using a matcher
+ object's indexIn() is faster than using the indexOf() member method of
+ the string you are searching in, especially when the string to
+ be found will be searched for repeatedly or within a large
+ Latin-1 string that may contain many matches to prefixes of the
+ substring to be found.
+
+ Unlike QLatin1StringMatcher, this class calculates the internal
+ representation at \e{compile-time}, so it can be beneficial even if you
+ are doing one-off Latin-1 string matches.
+
+ Create the QStaticLatin1StringMatcher by calling
+ qMakeStaticCaseSensitiveLatin1StringMatcher() or
+ qMakeStaticCaseInsensitiveLatin1StringMatcher() passing the Latin-1
+ string to search for as a C string literal. Store the return value of
+ that function in a \c{static constexpr auto} variable, so you don't
+ need to pass the \c{N} template parameter explicitly.
+
+ Then call indexIn() on the QLatin1StringView in which you want to search,
+ just like with QLatin1StringMatcher.
+
+ Since this class is designed to do all the up-front calculations at
+ compile-time, it does not offer setPattern() or setCaseSensitivity()
+ methods.
+
+ \note INTEGRITY operating system is currently not supported.
+
+ \sa QLatin1StringMatcher, QStaticByteArrayMatcher, QByteArrayMatcher
+*/
+
+/*!
+ \fn template<Qt::CaseSensitivity CS, size_t N> constexpr qsizetype QStaticLatin1StringMatcher<CS, N>::indexIn(QLatin1StringView haystack, qsizetype from) const
+
+ Searches the QLatin1StringView \a haystack, from byte position \a from
+ (default 0, i.e. from the first byte), for QLatin1StringView pattern()
+ that was set in the constructor. Using the case sensitivity that was also
+ set in the constructor.
+
+ Returns the position where the pattern() matched in \a haystack, or -1 if no match was found.
+*/
+
+/*!
+ \fn template<size_t N> constexpr auto qMakeStaticCaseSensitiveLatin1StringMatcher(const char
+ (&patternToMatch)[N])
+
+ \since 6.7
+ \relates QStaticLatin1StringMatcher
+
+ Return a QStaticLatin1StringMatcher with the correct \c{N} determined
+ automatically from the \a patternToMatch passed, and with case sensitivity.
+
+ To take full advantage of this function, assign the result to a
+ \c{static constexpr auto} variable:
+
+ \snippet code/src_corelib_text_qstaticlatin1stringmatcher.cpp 0
+*/
+
+/*!
+ \fn template<size_t N> constexpr auto qMakeStaticCaseInsensitiveLatin1StringMatcher(const char
+ (&patternToMatch)[N])
+
+ \since 6.7
+ \relates QStaticLatin1StringMatcher
+
+ Return a QStaticLatin1StringMatcher with the correct \c{N} determined
+ automatically from the \a patternToMatch passed, and without case sensitivity.
+
+ To take full advantage of this function, assign the result to a
+ \c{static constexpr auto} variable:
+
+ \snippet code/src_corelib_text_qstaticlatin1stringmatcher.cpp 1
+*/
diff --git a/src/corelib/text/qstring.cpp b/src/corelib/text/qstring.cpp
index a00383b304..f0bf0c50a3 100644
--- a/src/corelib/text/qstring.cpp
+++ b/src/corelib/text/qstring.cpp
@@ -1,43 +1,7 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Copyright (C) 2020 Intel Corporation.
-** Copyright (C) 2019 Mail.ru Group.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// Copyright (C) 2022 Intel Corporation.
+// Copyright (C) 2019 Mail.ru Group.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qstringlist.h"
#if QT_CONFIG(regularexpression)
@@ -45,6 +9,7 @@
#endif
#include "qunicodetables_p.h"
#include <private/qstringconverter_p.h>
+#include <private/qtools_p.h>
#include "qlocale_tools_p.h"
#include "private/qsimd_p.h"
#include <qnumeric.h>
@@ -52,14 +17,16 @@
#include <qlist.h>
#include "qlocale.h"
#include "qlocale_p.h"
+#include "qspan.h"
#include "qstringbuilder.h"
#include "qstringmatcher.h"
#include "qvarlengtharray.h"
#include "qdebug.h"
#include "qendian.h"
#include "qcollator.h"
+#include "qttypetraits.h"
-#ifdef Q_OS_MAC
+#ifdef Q_OS_DARWIN
#include <private/qcore_mac_p.h>
#endif
@@ -73,40 +40,287 @@
#include <wchar.h>
#include "qchar.cpp"
+#include "qlatin1stringmatcher.h"
#include "qstringmatcher.cpp"
#include "qstringiterator_p.h"
#include "qstringalgorithms_p.h"
#include "qthreadstorage.h"
-#include "qbytearraymatcher.h" // Helper for comparison of QLatin1String
-
#include <algorithm>
#include <functional>
#ifdef Q_OS_WIN
# include <qt_windows.h>
+# if !defined(QT_BOOTSTRAPPED) && (defined(QT_NO_CAST_FROM_ASCII) || defined(QT_NO_CAST_TO_ASCII))
+// MSVC requires this, but let's apply it to MinGW compilers too, just in case
+# error "This file cannot be compiled with QT_NO_CAST_{TO,FROM}_ASCII, " \
+ "otherwise some QString functions will not get exported."
+# endif
#endif
#ifdef truncate
# undef truncate
#endif
-#ifndef LLONG_MAX
-#define LLONG_MAX qint64_C(9223372036854775807)
-#endif
-#ifndef LLONG_MIN
-#define LLONG_MIN (-LLONG_MAX - qint64_C(1))
-#endif
-#ifndef ULLONG_MAX
-#define ULLONG_MAX quint64_C(18446744073709551615)
-#endif
-
-#define IS_RAW_DATA(d) ((d.d)->flags & QArrayData::RawDataType)
+#define REHASH(a) \
+ if (sl_minus_1 < sizeof(std::size_t) * CHAR_BIT) \
+ hashHaystack -= std::size_t(a) << sl_minus_1; \
+ hashHaystack <<= 1
QT_BEGIN_NAMESPACE
+using namespace Qt::StringLiterals;
+using namespace QtMiscUtils;
+
const char16_t QString::_empty = 0;
+// in qstringmatcher.cpp
+qsizetype qFindStringBoyerMoore(QStringView haystack, qsizetype from, QStringView needle, Qt::CaseSensitivity cs);
+
+namespace {
+enum StringComparisonMode {
+ CompareStringsForEquality,
+ CompareStringsForOrdering
+};
+
+template <typename Pointer>
+char32_t foldCaseHelper(Pointer ch, Pointer start) = delete;
+
+template <>
+char32_t foldCaseHelper<const QChar*>(const QChar* ch, const QChar* start)
+{
+ return foldCase(reinterpret_cast<const char16_t*>(ch),
+ reinterpret_cast<const char16_t*>(start));
+}
+
+template <>
+char32_t foldCaseHelper<const char*>(const char* ch, const char*)
+{
+ return foldCase(char16_t(uchar(*ch)));
+}
+
+template <typename T>
+char16_t valueTypeToUtf16(T t) = delete;
+
+template <>
+char16_t valueTypeToUtf16<QChar>(QChar t)
+{
+ return t.unicode();
+}
+
+template <>
+char16_t valueTypeToUtf16<char>(char t)
+{
+ return char16_t{uchar(t)};
+}
+
+template <typename T>
+static inline bool foldAndCompare(const T a, const T b)
+{
+ return foldCase(a) == b;
+}
+
+/*!
+ \internal
+
+ Returns the index position of the first occurrence of the
+ character \a ch in the string given by \a str and \a len,
+ searching forward from index
+ position \a from. Returns -1 if \a ch could not be found.
+*/
+template <typename Haystack>
+static inline qsizetype qLastIndexOf(Haystack haystack, QChar needle,
+ qsizetype from, Qt::CaseSensitivity cs) noexcept
+{
+ if (haystack.size() == 0)
+ return -1;
+ if (from < 0)
+ from += haystack.size();
+ else if (std::size_t(from) > std::size_t(haystack.size()))
+ from = haystack.size() - 1;
+ if (from >= 0) {
+ char16_t c = needle.unicode();
+ const auto b = haystack.data();
+ auto n = b + from;
+ if (cs == Qt::CaseSensitive) {
+ for (; n >= b; --n)
+ if (valueTypeToUtf16(*n) == c)
+ return n - b;
+ } else {
+ c = foldCase(c);
+ for (; n >= b; --n)
+ if (foldCase(valueTypeToUtf16(*n)) == c)
+ return n - b;
+ }
+ }
+ return -1;
+}
+template <> qsizetype
+qLastIndexOf(QString, QChar, qsizetype, Qt::CaseSensitivity) noexcept = delete; // unwanted, would detach
+
+template<typename Haystack, typename Needle>
+static qsizetype qLastIndexOf(Haystack haystack0, qsizetype from,
+ Needle needle0, Qt::CaseSensitivity cs) noexcept
+{
+ const qsizetype sl = needle0.size();
+ if (sl == 1)
+ return qLastIndexOf(haystack0, needle0.front(), from, cs);
+
+ const qsizetype l = haystack0.size();
+ if (from < 0)
+ from += l;
+ if (from == l && sl == 0)
+ return from;
+ const qsizetype delta = l - sl;
+ if (std::size_t(from) > std::size_t(l) || delta < 0)
+ return -1;
+ if (from > delta)
+ from = delta;
+
+ auto sv = [sl](const typename Haystack::value_type *v) { return Haystack(v, sl); };
+
+ auto haystack = haystack0.data();
+ const auto needle = needle0.data();
+ const auto *end = haystack;
+ haystack += from;
+ const std::size_t sl_minus_1 = sl ? sl - 1 : 0;
+ const auto *n = needle + sl_minus_1;
+ const auto *h = haystack + sl_minus_1;
+ std::size_t hashNeedle = 0, hashHaystack = 0;
+
+ if (cs == Qt::CaseSensitive) {
+ for (qsizetype idx = 0; idx < sl; ++idx) {
+ hashNeedle = (hashNeedle << 1) + valueTypeToUtf16(*(n - idx));
+ hashHaystack = (hashHaystack << 1) + valueTypeToUtf16(*(h - idx));
+ }
+ hashHaystack -= valueTypeToUtf16(*haystack);
+
+ while (haystack >= end) {
+ hashHaystack += valueTypeToUtf16(*haystack);
+ if (hashHaystack == hashNeedle
+ && QtPrivate::compareStrings(needle0, sv(haystack), Qt::CaseSensitive) == 0)
+ return haystack - end;
+ --haystack;
+ REHASH(valueTypeToUtf16(haystack[sl]));
+ }
+ } else {
+ for (qsizetype idx = 0; idx < sl; ++idx) {
+ hashNeedle = (hashNeedle << 1) + foldCaseHelper(n - idx, needle);
+ hashHaystack = (hashHaystack << 1) + foldCaseHelper(h - idx, end);
+ }
+ hashHaystack -= foldCaseHelper(haystack, end);
+
+ while (haystack >= end) {
+ hashHaystack += foldCaseHelper(haystack, end);
+ if (hashHaystack == hashNeedle
+ && QtPrivate::compareStrings(sv(haystack), needle0, Qt::CaseInsensitive) == 0)
+ return haystack - end;
+ --haystack;
+ REHASH(foldCaseHelper(haystack + sl, end));
+ }
+ }
+ return -1;
+}
+
+template <typename Haystack, typename Needle>
+bool qt_starts_with_impl(Haystack haystack, Needle needle, Qt::CaseSensitivity cs) noexcept
+{
+ if (haystack.isNull())
+ return needle.isNull();
+ const auto haystackLen = haystack.size();
+ const auto needleLen = needle.size();
+ if (haystackLen == 0)
+ return needleLen == 0;
+ if (needleLen > haystackLen)
+ return false;
+
+ return QtPrivate::compareStrings(haystack.first(needleLen), needle, cs) == 0;
+}
+
+template <typename Haystack, typename Needle>
+bool qt_ends_with_impl(Haystack haystack, Needle needle, Qt::CaseSensitivity cs) noexcept
+{
+ if (haystack.isNull())
+ return needle.isNull();
+ const auto haystackLen = haystack.size();
+ const auto needleLen = needle.size();
+ if (haystackLen == 0)
+ return needleLen == 0;
+ if (haystackLen < needleLen)
+ return false;
+
+ return QtPrivate::compareStrings(haystack.last(needleLen), needle, cs) == 0;
+}
+
+template <typename T>
+static void append_helper(QString &self, T view)
+{
+ const auto strData = view.data();
+ const qsizetype strSize = view.size();
+ auto &d = self.data_ptr();
+ if (strData && strSize > 0) {
+ // the number of UTF-8 code units is always at a minimum equal to the number
+ // of equivalent UTF-16 code units
+ d.detachAndGrow(QArrayData::GrowsAtEnd, strSize, nullptr, nullptr);
+ Q_CHECK_PTR(d.data());
+ Q_ASSERT(strSize <= d.freeSpaceAtEnd());
+
+ auto dst = std::next(d.data(), d.size);
+ if constexpr (std::is_same_v<T, QUtf8StringView>) {
+ dst = QUtf8::convertToUnicode(dst, view);
+ } else if constexpr (std::is_same_v<T, QLatin1StringView>) {
+ QLatin1::convertToUnicode(dst, view);
+ dst += strSize;
+ } else {
+ static_assert(QtPrivate::type_dependent_false<T>(),
+ "Can only operate on UTF-8 and Latin-1");
+ }
+ self.resize(std::distance(d.begin(), dst));
+ } else if (d.isNull() && !view.isNull()) { // special case
+ self = QLatin1StringView("");
+ }
+}
+
+template <uint MaxCount> struct UnrollTailLoop
+{
+ template <typename RetType, typename Functor1, typename Functor2, typename Number>
+ static inline RetType exec(Number count, RetType returnIfExited, Functor1 loopCheck, Functor2 returnIfFailed, Number i = 0)
+ {
+ /* equivalent to:
+ * while (count--) {
+ * if (loopCheck(i))
+ * return returnIfFailed(i);
+ * }
+ * return returnIfExited;
+ */
+
+ if (!count)
+ return returnIfExited;
+
+ bool check = loopCheck(i);
+ if (check)
+ return returnIfFailed(i);
+
+ return UnrollTailLoop<MaxCount - 1>::exec(count - 1, returnIfExited, loopCheck, returnIfFailed, i + 1);
+ }
+
+ template <typename Functor, typename Number>
+ static inline void exec(Number count, Functor code)
+ {
+ /* equivalent to:
+ * for (Number i = 0; i < count; ++i)
+ * code(i);
+ */
+ exec(count, 0, [=](Number i) -> bool { code(i); return false; }, [](Number) { return 0; });
+ }
+};
+template <> template <typename RetType, typename Functor1, typename Functor2, typename Number>
+inline RetType UnrollTailLoop<0>::exec(Number, RetType returnIfExited, Functor1, Functor2, Number)
+{
+ return returnIfExited;
+}
+} // unnamed namespace
+
/*
* Note on the use of SIMD in qstring.cpp:
*
@@ -144,39 +358,38 @@ extern "C" void qt_fromlatin1_mips_asm_unroll8 (char16_t*, const char*, uint);
extern "C" void qt_toLatin1_mips_dsp_asm(uchar *dst, const char16_t *src, int length);
#endif
-// internal
-qsizetype qFindStringBoyerMoore(QStringView haystack, qsizetype from, QStringView needle, Qt::CaseSensitivity cs);
-static inline qsizetype qFindChar(QStringView str, QChar ch, qsizetype from, Qt::CaseSensitivity cs) noexcept;
-template <typename Haystack>
-static inline qsizetype qLastIndexOf(Haystack haystack, QChar needle, qsizetype from, Qt::CaseSensitivity cs) noexcept;
-template <>
-inline qsizetype qLastIndexOf(QString haystack, QChar needle,
- qsizetype from, Qt::CaseSensitivity cs) noexcept = delete; // unwanted, would detach
-
-static inline bool qt_starts_with(QStringView haystack, QStringView needle, Qt::CaseSensitivity cs);
-static inline bool qt_starts_with(QStringView haystack, QLatin1String needle, Qt::CaseSensitivity cs);
-static inline bool qt_starts_with(QStringView haystack, QChar needle, Qt::CaseSensitivity cs);
-static inline bool qt_ends_with(QStringView haystack, QStringView needle, Qt::CaseSensitivity cs);
-static inline bool qt_ends_with(QStringView haystack, QLatin1String needle, Qt::CaseSensitivity cs);
-static inline bool qt_ends_with(QStringView haystack, QChar needle, Qt::CaseSensitivity cs);
-
-#if defined(__SSE2__) && defined(Q_CC_GNU) && !defined(Q_CC_INTEL)
-# if defined(__SANITIZE_ADDRESS__) && Q_CC_GNU < 800 && !defined(Q_CC_CLANG)
-# warning "The __attribute__ on below will likely cause a build failure with your GCC version. Your choices are:"
-# warning "1) disable ASan;"
-# warning "2) disable the optimized code in qustrlen (change __SSE2__ to anything else);"
-# warning "3) upgrade your compiler (preferred)."
-# endif
-
+#if defined(__SSE2__) && defined(Q_CC_GNU)
// We may overrun the buffer, but that's a false positive:
// this won't crash nor produce incorrect results
-__attribute__((__no_sanitize_address__))
+# define ATTRIBUTE_NO_SANITIZE __attribute__((__no_sanitize_address__))
+#else
+# define ATTRIBUTE_NO_SANITIZE
#endif
-qsizetype QtPrivate::qustrlen(const char16_t *str) noexcept
+
+#ifdef __SSE2__
+static constexpr bool UseSse4_1 = bool(qCompilerCpuFeatures & CpuFeatureSSE4_1);
+static constexpr bool UseAvx2 = UseSse4_1 &&
+ (qCompilerCpuFeatures & CpuFeatureArchHaswell) == CpuFeatureArchHaswell;
+
+[[maybe_unused]]
+static Q_ALWAYS_INLINE __m128i mm_load8_zero_extend(const void *ptr)
{
- qsizetype result = 0;
+ const __m128i *dataptr = static_cast<const __m128i *>(ptr);
+ if constexpr (UseSse4_1) {
+ // use a MOVQ followed by PMOVZXBW
+ // if AVX2 is present, these should combine into a single VPMOVZXBW instruction
+ __m128i data = _mm_loadl_epi64(dataptr);
+ return _mm_cvtepu8_epi16(data);
+ }
-#if defined(__SSE2__) && !(defined(__SANITIZE_ADDRESS__) || __has_feature(address_sanitizer))
+ // use MOVQ followed by PUNPCKLBW
+ __m128i data = _mm_loadl_epi64(dataptr);
+ return _mm_unpacklo_epi8(data, _mm_setzero_si128());
+}
+
+[[maybe_unused]] ATTRIBUTE_NO_SANITIZE
+static qsizetype qustrlen_sse2(const char16_t *str) noexcept
+{
// find the 16-byte alignment immediately prior or equal to str
quintptr misalignment = quintptr(str) & 0xf;
Q_ASSERT((misalignment & 1) == 0);
@@ -187,7 +400,7 @@ qsizetype QtPrivate::qustrlen(const char16_t *str) noexcept
const __m128i zeroes = _mm_setzero_si128();
__m128i data = _mm_load_si128(reinterpret_cast<const __m128i *>(ptr));
__m128i comparison = _mm_cmpeq_epi16(data, zeroes);
- quint32 mask = _mm_movemask_epi8(comparison);
+ uint mask = _mm_movemask_epi8(comparison);
// ignore the result prior to the beginning of str
mask >>= misalignment;
@@ -195,71 +408,272 @@ qsizetype QtPrivate::qustrlen(const char16_t *str) noexcept
// Have we found something in the first block? Need to handle it now
// because of the left shift above.
if (mask)
- return qCountTrailingZeroBits(quint32(mask)) / 2;
+ return qCountTrailingZeroBits(mask) / sizeof(char16_t);
+
+ constexpr qsizetype Step = sizeof(__m128i) / sizeof(char16_t);
+ qsizetype size = Step - misalignment / sizeof(char16_t);
+ size -= Step;
do {
- ptr += 8;
- data = _mm_load_si128(reinterpret_cast<const __m128i *>(ptr));
+ size += Step;
+ data = _mm_load_si128(reinterpret_cast<const __m128i *>(str + size));
comparison = _mm_cmpeq_epi16(data, zeroes);
mask = _mm_movemask_epi8(comparison);
} while (mask == 0);
// found a null
- uint idx = qCountTrailingZeroBits(quint32(mask));
- return ptr - str + idx / 2;
-#endif
+ return size + qCountTrailingZeroBits(mask) / sizeof(char16_t);
+}
- if (sizeof(wchar_t) == sizeof(char16_t))
- return wcslen(reinterpret_cast<const wchar_t *>(str));
+// Scans from \a ptr to \a end until \a maskval is non-zero. Returns true if
+// the no non-zero was found. Returns false and updates \a ptr to point to the
+// first 16-bit word that has any bit set (note: if the input is 8-bit, \a ptr
+// may be updated to one byte short).
+static bool simdTestMask(const char *&ptr, const char *end, quint32 maskval)
+{
+ auto updatePtr = [&](uint result) {
+ // found a character matching the mask
+ uint idx = qCountTrailingZeroBits(~result);
+ ptr += idx;
+ return false;
+ };
- while (*str++)
- ++result;
- return result;
+ if constexpr (UseSse4_1) {
+# ifndef Q_OS_QNX // compiler fails in the code below
+ __m128i mask;
+ auto updatePtrSimd = [&](__m128i data) -> bool {
+ __m128i masked = _mm_and_si128(mask, data);
+ __m128i comparison = _mm_cmpeq_epi16(masked, _mm_setzero_si128());
+ uint result = _mm_movemask_epi8(comparison);
+ return updatePtr(result);
+ };
+
+ if constexpr (UseAvx2) {
+ // AVX2 implementation: test 32 bytes at a time
+ const __m256i mask256 = _mm256_broadcastd_epi32(_mm_cvtsi32_si128(maskval));
+ while (ptr + 32 <= end) {
+ __m256i data = _mm256_loadu_si256(reinterpret_cast<const __m256i *>(ptr));
+ if (!_mm256_testz_si256(mask256, data)) {
+ // found a character matching the mask
+ __m256i masked256 = _mm256_and_si256(mask256, data);
+ __m256i comparison256 = _mm256_cmpeq_epi16(masked256, _mm256_setzero_si256());
+ return updatePtr(_mm256_movemask_epi8(comparison256));
+ }
+ ptr += 32;
+ }
+
+ mask = _mm256_castsi256_si128(mask256);
+ } else {
+ // SSE 4.1 implementation: test 32 bytes at a time (two 16-byte
+ // comparisons, unrolled)
+ mask = _mm_set1_epi32(maskval);
+ while (ptr + 32 <= end) {
+ __m128i data1 = _mm_loadu_si128(reinterpret_cast<const __m128i *>(ptr));
+ __m128i data2 = _mm_loadu_si128(reinterpret_cast<const __m128i *>(ptr + 16));
+ if (!_mm_testz_si128(mask, data1))
+ return updatePtrSimd(data1);
+
+ ptr += 16;
+ if (!_mm_testz_si128(mask, data2))
+ return updatePtrSimd(data2);
+ ptr += 16;
+ }
+ }
+
+ // AVX2 and SSE4.1: final 16-byte comparison
+ if (ptr + 16 <= end) {
+ __m128i data1 = _mm_loadu_si128(reinterpret_cast<const __m128i *>(ptr));
+ if (!_mm_testz_si128(mask, data1))
+ return updatePtrSimd(data1);
+ ptr += 16;
+ }
+
+ // and final 8-byte comparison
+ if (ptr + 8 <= end) {
+ __m128i data1 = _mm_loadl_epi64(reinterpret_cast<const __m128i *>(ptr));
+ if (!_mm_testz_si128(mask, data1))
+ return updatePtrSimd(data1);
+ ptr += 8;
+ }
+
+ return true;
+# endif // QNX
+ }
+
+ // SSE2 implementation: test 16 bytes at a time.
+ const __m128i mask = _mm_set1_epi32(maskval);
+ while (ptr + 16 <= end) {
+ __m128i data = _mm_loadu_si128(reinterpret_cast<const __m128i *>(ptr));
+ __m128i masked = _mm_and_si128(mask, data);
+ __m128i comparison = _mm_cmpeq_epi16(masked, _mm_setzero_si128());
+ quint16 result = _mm_movemask_epi8(comparison);
+ if (result != 0xffff)
+ return updatePtr(result);
+ ptr += 16;
+ }
+
+ // and one 8-byte comparison
+ if (ptr + 8 <= end) {
+ __m128i data = _mm_loadl_epi64(reinterpret_cast<const __m128i *>(ptr));
+ __m128i masked = _mm_and_si128(mask, data);
+ __m128i comparison = _mm_cmpeq_epi16(masked, _mm_setzero_si128());
+ quint8 result = _mm_movemask_epi8(comparison);
+ if (result != 0xff)
+ return updatePtr(result);
+ ptr += 8;
+ }
+
+ return true;
}
-#if !defined(__OPTIMIZE_SIZE__)
-namespace {
-template <uint MaxCount> struct UnrollTailLoop
+template <StringComparisonMode Mode, typename Char> [[maybe_unused]]
+static int ucstrncmp_sse2(const char16_t *a, const Char *b, size_t l)
{
- template <typename RetType, typename Functor1, typename Functor2, typename Number>
- static inline RetType exec(Number count, RetType returnIfExited, Functor1 loopCheck, Functor2 returnIfFailed, Number i = 0)
- {
- /* equivalent to:
- * while (count--) {
- * if (loopCheck(i))
- * return returnIfFailed(i);
- * }
- * return returnIfExited;
- */
+ static_assert(std::is_unsigned_v<Char>);
- if (!count)
- return returnIfExited;
+ // Using the PMOVMSKB instruction, we get two bits for each UTF-16 character
+ // we compare. This lambda helps extract the code unit.
+ static const auto codeUnitAt = [](const auto *n, qptrdiff idx) -> int {
+ constexpr int Stride = 2;
+ // this is the same as:
+ // return n[idx / Stride];
+ // but using pointer arithmetic to avoid the compiler dividing by two
+ // and multiplying by two in the case of char16_t (we know idx is even,
+ // but the compiler does not). This is not UB.
- bool check = loopCheck(i);
- if (check)
- return returnIfFailed(i);
+ auto ptr = reinterpret_cast<const uchar *>(n);
+ ptr += idx / (Stride / sizeof(*n));
+ return *reinterpret_cast<decltype(n)>(ptr);
+ };
+ auto difference = [a, b](uint mask, qptrdiff offset) {
+ if (Mode == CompareStringsForEquality)
+ return 1;
+ uint idx = qCountTrailingZeroBits(mask);
+ return codeUnitAt(a + offset, idx) - codeUnitAt(b + offset, idx);
+ };
- return UnrollTailLoop<MaxCount - 1>::exec(count - 1, returnIfExited, loopCheck, returnIfFailed, i + 1);
- }
+ static const auto load8Chars = [](const auto *ptr) {
+ if (sizeof(*ptr) == 2)
+ return _mm_loadu_si128(reinterpret_cast<const __m128i *>(ptr));
+ __m128i chunk = _mm_loadl_epi64(reinterpret_cast<const __m128i *>(ptr));
+ return _mm_unpacklo_epi8(chunk, _mm_setzero_si128());
+ };
+ static const auto load4Chars = [](const auto *ptr) {
+ if (sizeof(*ptr) == 2)
+ return _mm_loadl_epi64(reinterpret_cast<const __m128i *>(ptr));
+ __m128i chunk = _mm_cvtsi32_si128(qFromUnaligned<quint32>(ptr));
+ return _mm_unpacklo_epi8(chunk, _mm_setzero_si128());
+ };
- template <typename Functor, typename Number>
- static inline void exec(Number count, Functor code)
- {
- /* equivalent to:
- * for (Number i = 0; i < count; ++i)
- * code(i);
- */
- exec(count, 0, [=](Number i) -> bool { code(i); return false; }, [](Number) { return 0; });
+ // we're going to read a[0..15] and b[0..15] (32 bytes)
+ auto processChunk16Chars = [a, b](qptrdiff offset) -> uint {
+ if constexpr (UseAvx2) {
+ __m256i a_data = _mm256_loadu_si256(reinterpret_cast<const __m256i *>(a + offset));
+ __m256i b_data;
+ if (sizeof(Char) == 1) {
+ // expand to UTF-16 via zero-extension
+ __m128i chunk = _mm_loadu_si128(reinterpret_cast<const __m128i *>(b + offset));
+ b_data = _mm256_cvtepu8_epi16(chunk);
+ } else {
+ b_data = _mm256_loadu_si256(reinterpret_cast<const __m256i *>(b + offset));
+ }
+ __m256i result = _mm256_cmpeq_epi16(a_data, b_data);
+ return _mm256_movemask_epi8(result);
+ }
+
+ __m128i a_data1 = load8Chars(a + offset);
+ __m128i a_data2 = load8Chars(a + offset + 8);
+ __m128i b_data1, b_data2;
+ if (sizeof(Char) == 1) {
+ // expand to UTF-16 via unpacking
+ __m128i b_data = _mm_loadu_si128(reinterpret_cast<const __m128i *>(b + offset));
+ b_data1 = _mm_unpacklo_epi8(b_data, _mm_setzero_si128());
+ b_data2 = _mm_unpackhi_epi8(b_data, _mm_setzero_si128());
+ } else {
+ b_data1 = load8Chars(b + offset);
+ b_data2 = load8Chars(b + offset + 8);
+ }
+ __m128i result1 = _mm_cmpeq_epi16(a_data1, b_data1);
+ __m128i result2 = _mm_cmpeq_epi16(a_data2, b_data2);
+ return _mm_movemask_epi8(result1) | _mm_movemask_epi8(result2) << 16;
+ };
+
+ if (l >= sizeof(__m256i) / sizeof(char16_t)) {
+ qptrdiff offset = 0;
+ for ( ; l >= offset + sizeof(__m256i) / sizeof(char16_t); offset += sizeof(__m256i) / sizeof(char16_t)) {
+ uint mask = ~processChunk16Chars(offset);
+ if (mask)
+ return difference(mask, offset);
+ }
+
+ // maybe overlap the last 32 bytes
+ if (size_t(offset) < l) {
+ offset = l - sizeof(__m256i) / sizeof(char16_t);
+ uint mask = ~processChunk16Chars(offset);
+ return mask ? difference(mask, offset) : 0;
+ }
+ } else if (l >= 4) {
+ __m128i a_data1, b_data1;
+ __m128i a_data2, b_data2;
+ int width;
+ if (l >= 8) {
+ width = 8;
+ a_data1 = load8Chars(a);
+ b_data1 = load8Chars(b);
+ a_data2 = load8Chars(a + l - width);
+ b_data2 = load8Chars(b + l - width);
+ } else {
+ // we're going to read a[0..3] and b[0..3] (8 bytes)
+ width = 4;
+ a_data1 = load4Chars(a);
+ b_data1 = load4Chars(b);
+ a_data2 = load4Chars(a + l - width);
+ b_data2 = load4Chars(b + l - width);
+ }
+
+ __m128i result = _mm_cmpeq_epi16(a_data1, b_data1);
+ ushort mask = ~_mm_movemask_epi8(result);
+ if (mask)
+ return difference(mask, 0);
+
+ result = _mm_cmpeq_epi16(a_data2, b_data2);
+ mask = ~_mm_movemask_epi8(result);
+ if (mask)
+ return difference(mask, l - width);
+ } else {
+ // reset l
+ l &= 3;
+
+ const auto lambda = [=](size_t i) -> int {
+ return a[i] - b[i];
+ };
+ return UnrollTailLoop<3>::exec(l, 0, lambda, lambda);
}
-};
-template <> template <typename RetType, typename Functor1, typename Functor2, typename Number>
-inline RetType UnrollTailLoop<0>::exec(Number, RetType returnIfExited, Functor1, Functor2, Number)
+ return 0;
+}
+#endif
+
+Q_NEVER_INLINE
+qsizetype QtPrivate::qustrlen(const char16_t *str) noexcept
{
- return returnIfExited;
+#if defined(__SSE2__) && !(defined(__SANITIZE_ADDRESS__) || __has_feature(address_sanitizer))
+ return qustrlen_sse2(str);
+#endif
+
+ if (sizeof(wchar_t) == sizeof(char16_t))
+ return wcslen(reinterpret_cast<const wchar_t *>(str));
+
+ qsizetype result = 0;
+ while (*str++)
+ ++result;
+ return result;
}
+
+qsizetype QtPrivate::qustrnlen(const char16_t *str, qsizetype maxlen) noexcept
+{
+ return qustrchr({ str, maxlen }, u'\0') - str;
}
-#endif
/*!
* \internal
@@ -269,6 +683,7 @@ inline RetType UnrollTailLoop<0>::exec(Number, RetType returnIfExited, Functor1,
* character is not found, this function returns a pointer to the end of the
* string -- that is, \c{str.end()}.
*/
+Q_NEVER_INLINE
const char16_t *QtPrivate::qustrchr(QStringView str, char16_t c) noexcept
{
const char16_t *n = str.utf16();
@@ -278,23 +693,24 @@ const char16_t *QtPrivate::qustrchr(QStringView str, char16_t c) noexcept
bool loops = true;
// Using the PMOVMSKB instruction, we get two bits for each character
// we compare.
-# if defined(__AVX2__) && !defined(__OPTIMIZE_SIZE__)
- // we're going to read n[0..15] (32 bytes)
- __m256i mch256 = _mm256_set1_epi32(c | (c << 16));
- for (const char16_t *next = n + 16; next <= e; n = next, next += 16) {
- __m256i data = _mm256_loadu_si256(reinterpret_cast<const __m256i *>(n));
- __m256i result = _mm256_cmpeq_epi16(data, mch256);
- uint mask = uint(_mm256_movemask_epi8(result));
- if (mask) {
- uint idx = qCountTrailingZeroBits(mask);
- return n + idx / 2;
+ __m128i mch;
+ if constexpr (UseAvx2) {
+ // we're going to read n[0..15] (32 bytes)
+ __m256i mch256 = _mm256_set1_epi32(c | (c << 16));
+ for (const char16_t *next = n + 16; next <= e; n = next, next += 16) {
+ __m256i data = _mm256_loadu_si256(reinterpret_cast<const __m256i *>(n));
+ __m256i result = _mm256_cmpeq_epi16(data, mch256);
+ uint mask = uint(_mm256_movemask_epi8(result));
+ if (mask) {
+ uint idx = qCountTrailingZeroBits(mask);
+ return n + idx / 2;
+ }
}
+ loops = false;
+ mch = _mm256_castsi256_si128(mch256);
+ } else {
+ mch = _mm_set1_epi32(c | (c << 16));
}
- loops = false;
- __m128i mch = _mm256_castsi256_si128(mch256);
-# else
- __m128i mch = _mm_set1_epi32(c | (c << 16));
-# endif
auto hasMatch = [mch, &n](__m128i data, ushort validityMask) {
__m128i result = _mm_cmpeq_epi16(data, mch);
@@ -329,8 +745,8 @@ const char16_t *QtPrivate::qustrchr(QStringView str, char16_t c) noexcept
}
return UnrollTailLoop<3>::exec(e - n, e,
- [=](int i) { return n[i] == c; },
- [=](int i) { return n + i; });
+ [=](qsizetype i) { return n[i] == c; },
+ [=](qsizetype i) { return n + i; });
# endif
#elif defined(__ARM_NEON__)
const uint16x8_t vmask = { 1, 1 << 1, 1 << 2, 1 << 3, 1 << 4, 1 << 5, 1 << 6, 1 << 7 };
@@ -345,128 +761,25 @@ const char16_t *QtPrivate::qustrchr(QStringView str, char16_t c) noexcept
}
#endif // aarch64
- --n;
- while (++n != e)
- if (*n == c)
- return n;
-
- return n;
+ return std::find(n, e, c);
}
-#ifdef __SSE2__
-// Scans from \a ptr to \a end until \a maskval is non-zero. Returns true if
-// the no non-zero was found. Returns false and updates \a ptr to point to the
-// first 16-bit word that has any bit set (note: if the input is 8-bit, \a ptr
-// may be updated to one byte short).
-static bool simdTestMask(const char *&ptr, const char *end, quint32 maskval)
-{
- auto updatePtr = [&](uint result) {
- // found a character matching the mask
- uint idx = qCountTrailingZeroBits(~result);
- ptr += idx;
- return false;
- };
-
-# if defined(__SSE4_1__)
- __m128i mask;
- auto updatePtrSimd = [&](__m128i data) {
- __m128i masked = _mm_and_si128(mask, data);
- __m128i comparison = _mm_cmpeq_epi16(masked, _mm_setzero_si128());
- uint result = _mm_movemask_epi8(comparison);
- return updatePtr(result);
- };
-
-# if defined(__AVX2__)
- // AVX2 implementation: test 32 bytes at a time
- const __m256i mask256 = _mm256_broadcastd_epi32(_mm_cvtsi32_si128(maskval));
- while (ptr + 32 <= end) {
- __m256i data = _mm256_loadu_si256(reinterpret_cast<const __m256i *>(ptr));
- if (!_mm256_testz_si256(mask256, data)) {
- // found a character matching the mask
- __m256i masked256 = _mm256_and_si256(mask256, data);
- __m256i comparison256 = _mm256_cmpeq_epi16(masked256, _mm256_setzero_si256());
- return updatePtr(_mm256_movemask_epi8(comparison256));
- }
- ptr += 32;
- }
-
- mask = _mm256_castsi256_si128(mask256);
-# else
- // SSE 4.1 implementation: test 32 bytes at a time (two 16-byte
- // comparisons, unrolled)
- mask = _mm_set1_epi32(maskval);
- while (ptr + 32 <= end) {
- __m128i data1 = _mm_loadu_si128(reinterpret_cast<const __m128i *>(ptr));
- __m128i data2 = _mm_loadu_si128(reinterpret_cast<const __m128i *>(ptr + 16));
- if (!_mm_testz_si128(mask, data1))
- return updatePtrSimd(data1);
-
- ptr += 16;
- if (!_mm_testz_si128(mask, data2))
- return updatePtrSimd(data2);
- ptr += 16;
- }
-# endif
-
- // AVX2 and SSE4.1: final 16-byte comparison
- if (ptr + 16 <= end) {
- __m128i data1 = _mm_loadu_si128(reinterpret_cast<const __m128i *>(ptr));
- if (!_mm_testz_si128(mask, data1))
- return updatePtrSimd(data1);
- ptr += 16;
- }
-
- // and final 8-byte comparison
- if (ptr + 8 <= end) {
- __m128i data1 = _mm_loadl_epi64(reinterpret_cast<const __m128i *>(ptr));
- if (!_mm_testz_si128(mask, data1))
- return updatePtrSimd(data1);
- ptr += 8;
- }
-
-# else
- // SSE2 implementation: test 16 bytes at a time.
- const __m128i mask = _mm_set1_epi32(maskval);
- while (ptr + 16 <= end) {
- __m128i data = _mm_loadu_si128(reinterpret_cast<const __m128i *>(ptr));
- __m128i masked = _mm_and_si128(mask, data);
- __m128i comparison = _mm_cmpeq_epi16(masked, _mm_setzero_si128());
- quint16 result = _mm_movemask_epi8(comparison);
- if (result != 0xffff)
- return updatePtr(result);
- ptr += 16;
- }
-
- // and one 8-byte comparison
- if (ptr + 8 <= end) {
- __m128i data = _mm_loadl_epi64(reinterpret_cast<const __m128i *>(ptr));
- __m128i masked = _mm_and_si128(mask, data);
- __m128i comparison = _mm_cmpeq_epi16(masked, _mm_setzero_si128());
- quint8 result = _mm_movemask_epi8(comparison);
- if (result != 0xff)
- return updatePtr(result);
- ptr += 8;
- }
-# endif
-
- return true;
-}
-
-static Q_ALWAYS_INLINE __m128i mm_load8_zero_extend(const void *ptr)
+/*!
+ * \internal
+ *
+ * Searches case-insensitively for character \a c in the string \a str and
+ * returns a pointer to it. Iif the character is not found, this function
+ * returns a pointer to the end of the string -- that is, \c{str.end()}.
+ */
+Q_NEVER_INLINE
+const char16_t *QtPrivate::qustrcasechr(QStringView str, char16_t c) noexcept
{
- const __m128i *dataptr = static_cast<const __m128i *>(ptr);
-#if defined(__SSE4_1__)
- // use a MOVQ followed by PMOVZXBW
- // if AVX2 is present, these should combine into a single VPMOVZXBW instruction
- __m128i data = _mm_loadl_epi64(dataptr);
- return _mm_cvtepu8_epi16(data);
-# else
- // use MOVQ followed by PUNPCKLBW
- __m128i data = _mm_loadl_epi64(dataptr);
- return _mm_unpacklo_epi8(data, _mm_setzero_si128());
-# endif
+ const QChar *n = str.begin();
+ const QChar *e = str.end();
+ c = foldCase(c);
+ auto it = std::find_if(n, e, [c](auto ch) { return foldAndCompare(ch, QChar(c)); });
+ return reinterpret_cast<const char16_t *>(it);
}
-#endif
// Note: ptr on output may be off by one and point to a preceding US-ASCII
// character. Usually harmless.
@@ -474,18 +787,21 @@ bool qt_is_ascii(const char *&ptr, const char *end) noexcept
{
#if defined(__SSE2__)
// Testing for the high bit can be done efficiently with just PMOVMSKB
-# if defined(__AVX2__)
- while (ptr + 32 <= end) {
- __m256i data = _mm256_loadu_si256(reinterpret_cast<const __m256i *>(ptr));
- quint32 mask = _mm256_movemask_epi8(data);
- if (mask) {
- uint idx = qCountTrailingZeroBits(mask);
- ptr += idx;
- return false;
+ bool loops = true;
+ if constexpr (UseAvx2) {
+ while (ptr + 32 <= end) {
+ __m256i data = _mm256_loadu_si256(reinterpret_cast<const __m256i *>(ptr));
+ quint32 mask = _mm256_movemask_epi8(data);
+ if (mask) {
+ uint idx = qCountTrailingZeroBits(mask);
+ ptr += idx;
+ return false;
+ }
+ ptr += 32;
}
- ptr += 32;
+ loops = false;
}
-# endif
+
while (ptr + 16 <= end) {
__m128i data = _mm_loadu_si128(reinterpret_cast<const __m128i *>(ptr));
quint32 mask = _mm_movemask_epi8(data);
@@ -495,6 +811,9 @@ bool qt_is_ascii(const char *&ptr, const char *end) noexcept
return false;
}
ptr += 16;
+
+ if (!loops)
+ break;
}
if (ptr + 8 <= end) {
__m128i data = _mm_loadl_epi64(reinterpret_cast<const __m128i *>(ptr));
@@ -511,11 +830,9 @@ bool qt_is_ascii(const char *&ptr, const char *end) noexcept
while (ptr + 4 <= end) {
quint32 data = qFromUnaligned<quint32>(ptr);
if (data &= 0x80808080U) {
-#if Q_BYTE_ORDER == Q_BIG_ENDIAN
- uint idx = qCountLeadingZeroBits(data);
-#else
- uint idx = qCountTrailingZeroBits(data);
-#endif
+ uint idx = QSysInfo::ByteOrder == QSysInfo::BigEndian
+ ? qCountLeadingZeroBits(data)
+ : qCountTrailingZeroBits(data);
ptr += idx / 8;
return false;
}
@@ -530,7 +847,7 @@ bool qt_is_ascii(const char *&ptr, const char *end) noexcept
return true;
}
-bool QtPrivate::isAscii(QLatin1String s) noexcept
+bool QtPrivate::isAscii(QLatin1StringView s) noexcept
{
const char *ptr = s.begin();
const char *end = s.end();
@@ -538,19 +855,19 @@ bool QtPrivate::isAscii(QLatin1String s) noexcept
return qt_is_ascii(ptr, end);
}
-static bool isAscii(const QChar *&ptr, const QChar *end)
+static bool isAscii_helper(const char16_t *&ptr, const char16_t *end)
{
#ifdef __SSE2__
const char *ptr8 = reinterpret_cast<const char *>(ptr);
const char *end8 = reinterpret_cast<const char *>(end);
bool ok = simdTestMask(ptr8, end8, 0xff80ff80);
- ptr = reinterpret_cast<const QChar *>(ptr8);
+ ptr = reinterpret_cast<const char16_t *>(ptr8);
if (!ok)
return false;
#endif
while (ptr != end) {
- if (ptr->unicode() & 0xff80)
+ if (*ptr & 0xff80)
return false;
++ptr;
}
@@ -559,27 +876,27 @@ static bool isAscii(const QChar *&ptr, const QChar *end)
bool QtPrivate::isAscii(QStringView s) noexcept
{
- const QChar *ptr = s.begin();
- const QChar *end = s.end();
+ const char16_t *ptr = s.utf16();
+ const char16_t *end = ptr + s.size();
- return isAscii(ptr, end);
+ return isAscii_helper(ptr, end);
}
bool QtPrivate::isLatin1(QStringView s) noexcept
{
- const QChar *ptr = s.begin();
- const QChar *end = s.end();
+ const char16_t *ptr = s.utf16();
+ const char16_t *end = ptr + s.size();
#ifdef __SSE2__
const char *ptr8 = reinterpret_cast<const char *>(ptr);
const char *end8 = reinterpret_cast<const char *>(end);
if (!simdTestMask(ptr8, end8, 0xff00ff00))
return false;
- ptr = reinterpret_cast<const QChar *>(ptr8);
+ ptr = reinterpret_cast<const char16_t *>(ptr8);
#endif
while (ptr != end) {
- if ((*ptr++).unicode() > 0xff)
+ if (*ptr++ > 0xff)
return false;
}
return true;
@@ -608,46 +925,63 @@ Q_CORE_EXPORT void qt_from_latin1(char16_t *dst, const char *str, size_t size) n
* itself in exactly the same way as one would do it with intrinsics.
*/
#if defined(__SSE2__)
- const char *e = str + size;
- qptrdiff offset = 0;
-
// we're going to read str[offset..offset+15] (16 bytes)
- for ( ; str + offset + 15 < e; offset += 16) {
+ const __m128i nullMask = _mm_setzero_si128();
+ auto processOneChunk = [=](qptrdiff offset) {
const __m128i chunk = _mm_loadu_si128((const __m128i*)(str + offset)); // load
-#ifdef __AVX2__
- // zero extend to an YMM register
- const __m256i extended = _mm256_cvtepu8_epi16(chunk);
+ if constexpr (UseAvx2) {
+ // zero extend to an YMM register
+ const __m256i extended = _mm256_cvtepu8_epi16(chunk);
- // store
- _mm256_storeu_si256((__m256i*)(dst + offset), extended);
-#else
- const __m128i nullMask = _mm_set1_epi32(0);
-
- // unpack the first 8 bytes, padding with zeros
- const __m128i firstHalf = _mm_unpacklo_epi8(chunk, nullMask);
- _mm_storeu_si128((__m128i*)(dst + offset), firstHalf); // store
+ // store
+ _mm256_storeu_si256((__m256i*)(dst + offset), extended);
+ } else {
+ // unpack the first 8 bytes, padding with zeros
+ const __m128i firstHalf = _mm_unpacklo_epi8(chunk, nullMask);
+ _mm_storeu_si128((__m128i*)(dst + offset), firstHalf); // store
- // unpack the last 8 bytes, padding with zeros
- const __m128i secondHalf = _mm_unpackhi_epi8 (chunk, nullMask);
- _mm_storeu_si128((__m128i*)(dst + offset + 8), secondHalf); // store
-#endif
- }
+ // unpack the last 8 bytes, padding with zeros
+ const __m128i secondHalf = _mm_unpackhi_epi8 (chunk, nullMask);
+ _mm_storeu_si128((__m128i*)(dst + offset + 8), secondHalf); // store
+ }
+ };
- // we're going to read str[offset..offset+7] (8 bytes)
- if (str + offset + 7 < e) {
- const __m128i unpacked = mm_load8_zero_extend(str + offset);
- _mm_storeu_si128(reinterpret_cast<__m128i *>(dst + offset), unpacked);
- offset += 8;
+ const char *e = str + size;
+ if (size >= sizeof(__m128i)) {
+ qptrdiff offset = 0;
+ for ( ; str + offset + sizeof(__m128i) <= e; offset += sizeof(__m128i))
+ processOneChunk(offset);
+ if (str + offset < e)
+ processOneChunk(size - sizeof(__m128i));
+ return;
}
- size = size % 8;
- dst += offset;
- str += offset;
# if !defined(__OPTIMIZE_SIZE__)
- return UnrollTailLoop<7>::exec(int(size), [=](int i) { dst[i] = (uchar)str[i]; });
+ if (size >= 4) {
+ // two overlapped loads & stores, of either 64-bit or of 32-bit
+ if (size >= 8) {
+ const __m128i unpacked1 = mm_load8_zero_extend(str);
+ const __m128i unpacked2 = mm_load8_zero_extend(str + size - 8);
+ _mm_storeu_si128(reinterpret_cast<__m128i *>(dst), unpacked1);
+ _mm_storeu_si128(reinterpret_cast<__m128i *>(dst + size - 8), unpacked2);
+ } else {
+ const __m128i chunk1 = _mm_cvtsi32_si128(qFromUnaligned<quint32>(str));
+ const __m128i chunk2 = _mm_cvtsi32_si128(qFromUnaligned<quint32>(str + size - 4));
+ const __m128i unpacked1 = _mm_unpacklo_epi8(chunk1, nullMask);
+ const __m128i unpacked2 = _mm_unpacklo_epi8(chunk2, nullMask);
+ _mm_storel_epi64(reinterpret_cast<__m128i *>(dst), unpacked1);
+ _mm_storel_epi64(reinterpret_cast<__m128i *>(dst + size - 4), unpacked2);
+ }
+ return;
+ } else {
+ size = size % 4;
+ return UnrollTailLoop<3>::exec(qsizetype(size), [=](qsizetype i) { dst[i] = uchar(str[i]); });
+ }
# endif
#endif
#if defined(__mips_dsp)
+ static_assert(sizeof(qsizetype) == sizeof(int),
+ "oops, the assembler implementation needs to be called in a loop");
if (size > 20)
qt_fromlatin1_mips_asm_unroll8(dst, str, size);
else
@@ -658,31 +992,51 @@ Q_CORE_EXPORT void qt_from_latin1(char16_t *dst, const char *str, size_t size) n
#endif
}
+static QVarLengthArray<char16_t> qt_from_latin1_to_qvla(QLatin1StringView str)
+{
+ const qsizetype len = str.size();
+ QVarLengthArray<char16_t> arr(len);
+ qt_from_latin1(arr.data(), str.data(), len);
+ return arr;
+}
+
template <bool Checked>
static void qt_to_latin1_internal(uchar *dst, const char16_t *src, qsizetype length)
{
#if defined(__SSE2__)
- uchar *e = dst + length;
- qptrdiff offset = 0;
-
-# ifdef __AVX2__
- const __m256i questionMark256 = _mm256_broadcastw_epi16(_mm_cvtsi32_si128('?'));
- const __m256i outOfRange256 = _mm256_broadcastw_epi16(_mm_cvtsi32_si128(0x100));
- const __m128i questionMark = _mm256_castsi256_si128(questionMark256);
- const __m128i outOfRange = _mm256_castsi256_si128(outOfRange256);
-# else
- const __m128i questionMark = _mm_set1_epi16('?');
- const __m128i outOfRange = _mm_set1_epi16(0x100);
-# endif
+ auto questionMark256 = []() {
+ if constexpr (UseAvx2)
+ return _mm256_broadcastw_epi16(_mm_cvtsi32_si128('?'));
+ else
+ return 0;
+ }();
+ auto outOfRange256 = []() {
+ if constexpr (UseAvx2)
+ return _mm256_broadcastw_epi16(_mm_cvtsi32_si128(0x100));
+ else
+ return 0;
+ }();
+ __m128i questionMark, outOfRange;
+ if constexpr (UseAvx2) {
+ questionMark = _mm256_castsi256_si128(questionMark256);
+ outOfRange = _mm256_castsi256_si128(outOfRange256);
+ } else {
+ questionMark = _mm_set1_epi16('?');
+ outOfRange = _mm_set1_epi16(0x100);
+ }
auto mergeQuestionMarks = [=](__m128i chunk) {
+ if (!Checked)
+ return chunk;
+
// SSE has no compare instruction for unsigned comparison.
-# ifdef __SSE4_1__
- // We use an unsigned uc = qMin(uc, 0x100) and then compare for equality.
- chunk = _mm_min_epu16(chunk, outOfRange);
- const __m128i offLimitMask = _mm_cmpeq_epi16(chunk, outOfRange);
- chunk = _mm_blendv_epi8(chunk, questionMark, offLimitMask);
-# else
+ if constexpr (UseSse4_1) {
+ // We use an unsigned uc = qMin(uc, 0x100) and then compare for equality.
+ chunk = _mm_min_epu16(chunk, outOfRange);
+ const __m128i offLimitMask = _mm_cmpeq_epi16(chunk, outOfRange);
+ chunk = _mm_blendv_epi8(chunk, questionMark, offLimitMask);
+ return chunk;
+ }
// The variables must be shiffted + 0x8000 to be compared
const __m128i signedBitOffset = _mm_set1_epi16(short(0x8000));
const __m128i thresholdMask = _mm_set1_epi16(short(0xff + 0x8000));
@@ -702,90 +1056,99 @@ static void qt_to_latin1_internal(uchar *dst, const char16_t *src, qsizetype len
chunk = _mm_or_si128(correctBytes, offLimitQuestionMark);
Q_UNUSED(outOfRange);
-# endif
return chunk;
};
- // we're going to write to dst[offset..offset+15] (16 bytes)
- for ( ; dst + offset + 15 < e; offset += 16) {
-# if defined(__AVX2__)
- __m256i chunk = _mm256_loadu_si256(reinterpret_cast<const __m256i *>(src + offset));
- if (Checked) {
- // See mergeQuestionMarks lambda above for details
- chunk = _mm256_min_epu16(chunk, outOfRange256);
- const __m256i offLimitMask = _mm256_cmpeq_epi16(chunk, outOfRange256);
- chunk = _mm256_blendv_epi8(chunk, questionMark256, offLimitMask);
- }
+ // we're going to read to src[offset..offset+15] (16 bytes)
+ auto loadChunkAt = [=](qptrdiff offset) {
+ __m128i chunk1, chunk2;
+ if constexpr (UseAvx2) {
+ __m256i chunk = _mm256_loadu_si256(reinterpret_cast<const __m256i *>(src + offset));
+ if (Checked) {
+ // See mergeQuestionMarks lambda above for details
+ chunk = _mm256_min_epu16(chunk, outOfRange256);
+ const __m256i offLimitMask = _mm256_cmpeq_epi16(chunk, outOfRange256);
+ chunk = _mm256_blendv_epi8(chunk, questionMark256, offLimitMask);
+ }
- const __m128i chunk2 = _mm256_extracti128_si256(chunk, 1);
- const __m128i chunk1 = _mm256_castsi256_si128(chunk);
-# else
- __m128i chunk1 = _mm_loadu_si128((const __m128i*)(src + offset)); // load
- if (Checked)
+ chunk2 = _mm256_extracti128_si256(chunk, 1);
+ chunk1 = _mm256_castsi256_si128(chunk);
+ } else {
+ chunk1 = _mm_loadu_si128((const __m128i*)(src + offset)); // load
chunk1 = mergeQuestionMarks(chunk1);
- __m128i chunk2 = _mm_loadu_si128((const __m128i*)(src + offset + 8)); // load
- if (Checked)
+ chunk2 = _mm_loadu_si128((const __m128i*)(src + offset + 8)); // load
chunk2 = mergeQuestionMarks(chunk2);
-# endif
+ }
// pack the two vector to 16 x 8bits elements
- const __m128i result = _mm_packus_epi16(chunk1, chunk2);
- _mm_storeu_si128((__m128i*)(dst + offset), result); // store
+ return _mm_packus_epi16(chunk1, chunk2);
+ };
+
+ if (size_t(length) >= sizeof(__m128i)) {
+ // because of possible overlapping, we won't process the last chunk in the loop
+ qptrdiff offset = 0;
+ for ( ; offset + 2 * sizeof(__m128i) < size_t(length); offset += sizeof(__m128i))
+ _mm_storeu_si128(reinterpret_cast<__m128i *>(dst + offset), loadChunkAt(offset));
+
+ // overlapped conversion of the last full chunk and the tail
+ __m128i last1 = loadChunkAt(offset);
+ __m128i last2 = loadChunkAt(length - sizeof(__m128i));
+ _mm_storeu_si128(reinterpret_cast<__m128i *>(dst + offset), last1);
+ _mm_storeu_si128(reinterpret_cast<__m128i *>(dst + length - sizeof(__m128i)), last2);
+ return;
}
# if !defined(__OPTIMIZE_SIZE__)
- // we're going to write to dst[offset..offset+7] (8 bytes)
- if (dst + offset + 7 < e) {
- __m128i chunk = _mm_loadu_si128(reinterpret_cast<const __m128i *>(src + offset));
- if (Checked)
- chunk = mergeQuestionMarks(chunk);
-
- // pack, where the upper half is ignored
- const __m128i result = _mm_packus_epi16(chunk, chunk);
- _mm_storel_epi64(reinterpret_cast<__m128i *>(dst + offset), result);
- offset += 8;
- }
+ if (length >= 4) {
+ // this code is fine even for in-place conversion because we load both
+ // before any store
+ if (length >= 8) {
+ __m128i chunk1 = _mm_loadu_si128(reinterpret_cast<const __m128i *>(src));
+ __m128i chunk2 = _mm_loadu_si128(reinterpret_cast<const __m128i *>(src + length - 8));
+ chunk1 = mergeQuestionMarks(chunk1);
+ chunk2 = mergeQuestionMarks(chunk2);
- // we're going to write to dst[offset..offset+3] (4 bytes)
- if (dst + offset + 3 < e) {
- __m128i chunk = _mm_loadl_epi64(reinterpret_cast<const __m128i *>(src + offset));
- if (Checked)
- chunk = mergeQuestionMarks(chunk);
+ // pack, where the upper half is ignored
+ const __m128i result1 = _mm_packus_epi16(chunk1, chunk1);
+ const __m128i result2 = _mm_packus_epi16(chunk2, chunk2);
+ _mm_storel_epi64(reinterpret_cast<__m128i *>(dst), result1);
+ _mm_storel_epi64(reinterpret_cast<__m128i *>(dst + length - 8), result2);
+ } else {
+ __m128i chunk1 = _mm_loadl_epi64(reinterpret_cast<const __m128i *>(src));
+ __m128i chunk2 = _mm_loadl_epi64(reinterpret_cast<const __m128i *>(src + length - 4));
+ chunk1 = mergeQuestionMarks(chunk1);
+ chunk2 = mergeQuestionMarks(chunk2);
- // pack, we'll the upper three quarters
- const __m128i result = _mm_packus_epi16(chunk, chunk);
- qToUnaligned(_mm_cvtsi128_si32(result), dst + offset);
- offset += 4;
+ // pack, we'll zero the upper three quarters
+ const __m128i result1 = _mm_packus_epi16(chunk1, chunk1);
+ const __m128i result2 = _mm_packus_epi16(chunk2, chunk2);
+ qToUnaligned(_mm_cvtsi128_si32(result1), dst);
+ qToUnaligned(_mm_cvtsi128_si32(result2), dst + length - 4);
+ }
+ return;
}
length = length % 4;
-# else
- length = length % 16;
-# endif // optimize size
-
- // advance dst, src for tail processing
- dst += offset;
- src += offset;
-
-# if !defined(__OPTIMIZE_SIZE__)
- return UnrollTailLoop<3>::exec(length, [=](int i) {
+ return UnrollTailLoop<3>::exec(length, [=](qsizetype i) {
if (Checked)
dst[i] = (src[i]>0xff) ? '?' : (uchar) src[i];
else
dst[i] = src[i];
});
-# endif
+# else
+ length = length % 16;
+# endif // optimize size
#elif defined(__ARM_NEON__)
// Refer to the documentation of the SSE2 implementation.
// This uses exactly the same method as for SSE except:
// 1) neon has unsigned comparison
// 2) packing is done to 64 bits (8 x 8bits component).
if (length >= 16) {
- const int chunkCount = length >> 3; // divided by 8
+ const qsizetype chunkCount = length >> 3; // divided by 8
const uint16x8_t questionMark = vdupq_n_u16('?'); // set
const uint16x8_t thresholdMask = vdupq_n_u16(0xff); // set
- for (int i = 0; i < chunkCount; ++i) {
+ for (qsizetype i = 0; i < chunkCount; ++i) {
uint16x8_t chunk = vld1q_u16((uint16_t *)src); // load
src += 8;
@@ -803,6 +1166,8 @@ static void qt_to_latin1_internal(uchar *dst, const char16_t *src, qsizetype len
}
#endif
#if defined(__mips_dsp)
+ static_assert(sizeof(qsizetype) == sizeof(int),
+ "oops, the assembler implementation needs to be called in a loop");
qt_toLatin1_mips_dsp_asm(dst, src, length);
#else
while (length--) {
@@ -815,7 +1180,7 @@ static void qt_to_latin1_internal(uchar *dst, const char16_t *src, qsizetype len
#endif
}
-static void qt_to_latin1(uchar *dst, const char16_t *src, qsizetype length)
+void qt_to_latin1(uchar *dst, const char16_t *src, qsizetype length)
{
qt_to_latin1_internal<true>(dst, src, length);
}
@@ -825,52 +1190,45 @@ void qt_to_latin1_unchecked(uchar *dst, const char16_t *src, qsizetype length)
qt_to_latin1_internal<false>(dst, src, length);
}
-// Unicode case-insensitive comparison
-static int ucstricmp(const QChar *a, const QChar *ae, const QChar *b, const QChar *be)
+// Unicode case-insensitive comparison (argument order matches QStringView)
+Q_NEVER_INLINE static int ucstricmp(qsizetype alen, const char16_t *a, qsizetype blen, const char16_t *b)
{
if (a == b)
- return (ae - be);
-
- const QChar *e = ae;
- if (be - b < ae - a)
- e = a + (be - b);
+ return qt_lencmp(alen, blen);
char32_t alast = 0;
char32_t blast = 0;
- while (a < e) {
+ qsizetype l = qMin(alen, blen);
+ qsizetype i;
+ for (i = 0; i < l; ++i) {
// qDebug() << Qt::hex << alast << blast;
// qDebug() << Qt::hex << "*a=" << *a << "alast=" << alast << "folded=" << foldCase (*a, alast);
// qDebug() << Qt::hex << "*b=" << *b << "blast=" << blast << "folded=" << foldCase (*b, blast);
- int diff = foldCase(a->unicode(), alast) - foldCase(b->unicode(), blast);
+ int diff = foldCase(a[i], alast) - foldCase(b[i], blast);
if ((diff))
return diff;
- ++a;
- ++b;
}
- if (a == ae) {
- if (b == be)
+ if (i == alen) {
+ if (i == blen)
return 0;
return -1;
}
return 1;
}
-// Case-insensitive comparison between a Unicode string and a QLatin1String
-static int ucstricmp(const QChar *a, const QChar *ae, const char *b, const char *be)
+// Case-insensitive comparison between a QStringView and a QLatin1StringView
+// (argument order matches those types)
+Q_NEVER_INLINE static int ucstricmp(qsizetype alen, const char16_t *a, qsizetype blen, const char *b)
{
- auto e = ae;
- if (be - b < ae - a)
- e = a + (be - b);
-
- while (a < e) {
- int diff = foldCase(a->unicode()) - foldCase(char16_t{uchar(*b)});
+ qsizetype l = qMin(alen, blen);
+ qsizetype i;
+ for (i = 0; i < l; ++i) {
+ int diff = foldCase(a[i]) - foldCase(char16_t{uchar(b[i])});
if ((diff))
return diff;
- ++a;
- ++b;
}
- if (a == ae) {
- if (b == be)
+ if (i == alen) {
+ if (i == blen)
return 0;
return -1;
}
@@ -878,7 +1236,7 @@ static int ucstricmp(const QChar *a, const QChar *ae, const char *b, const char
}
// Case-insensitive comparison between a Unicode string and a UTF-8 string
-static int ucstricmp8(const char *utf8, const char *utf8end, const QChar *utf16, const QChar *utf16end)
+Q_NEVER_INLINE static int ucstricmp8(const char *utf8, const char *utf8end, const QChar *utf16, const QChar *utf16end)
{
auto src1 = reinterpret_cast<const uchar *>(utf8);
auto end1 = reinterpret_cast<const uchar *>(utf8end);
@@ -888,7 +1246,7 @@ static int ucstricmp8(const char *utf8, const char *utf8end, const QChar *utf16,
char32_t uc1 = 0;
char32_t *output = &uc1;
uchar b = *src1++;
- int res = QUtf8Functions::fromUtf8<QUtf8BaseTraits>(b, output, src1, end1);
+ const qsizetype res = QUtf8Functions::fromUtf8<QUtf8BaseTraits>(b, output, src1, end1);
if (res < 0) {
// decoding error
uc1 = QChar::ReplacementCharacter;
@@ -914,98 +1272,24 @@ extern "C" int qt_ucstrncmp_mips_dsp_asm(const char16_t *a,
#endif
// Unicode case-sensitive compare two same-sized strings
-static int ucstrncmp(const QChar *a, const QChar *b, size_t l)
+template <StringComparisonMode Mode>
+static int ucstrncmp(const char16_t *a, const char16_t *b, size_t l)
{
-#ifdef __OPTIMIZE_SIZE__
- const QChar *end = a + l;
- while (a < end) {
- if (int diff = (int)a->unicode() - (int)b->unicode())
- return diff;
- ++a;
- ++b;
- }
- return 0;
-#else
-#if defined(__mips_dsp)
+ // This function isn't memcmp() because that can return the wrong sorting
+ // result in little-endian architectures: 0x00ff must sort before 0x0100,
+ // but the bytes in memory are FF 00 and 00 01.
+
+#ifndef __OPTIMIZE_SIZE__
+# if defined(__mips_dsp)
static_assert(sizeof(uint) == sizeof(size_t));
if (l >= 8) {
- return qt_ucstrncmp_mips_dsp_asm(reinterpret_cast<const char16_t*>(a),
- reinterpret_cast<const char16_t*>(b),
- l);
- }
-#endif // __mips_dsp
-#ifdef __SSE2__
- const QChar *end = a + l;
- qptrdiff offset = 0;
-
- // Using the PMOVMSKB instruction, we get two bits for each character
- // we compare.
- int retval;
- auto isDifferent = [a, b, &offset, &retval](__m128i a_data, __m128i b_data) {
- __m128i result = _mm_cmpeq_epi16(a_data, b_data);
- uint mask = ~uint(_mm_movemask_epi8(result));
- if (ushort(mask) == 0)
- return false;
- uint idx = qCountTrailingZeroBits(mask);
- retval = a[offset + idx / 2].unicode() - b[offset + idx / 2].unicode();
- return true;
- };
-
- // we're going to read a[0..15] and b[0..15] (32 bytes)
- for ( ; end - a >= offset + 16; offset += 16) {
-#ifdef __AVX2__
- __m256i a_data = _mm256_loadu_si256(reinterpret_cast<const __m256i *>(a + offset));
- __m256i b_data = _mm256_loadu_si256(reinterpret_cast<const __m256i *>(b + offset));
- __m256i result = _mm256_cmpeq_epi16(a_data, b_data);
- uint mask = _mm256_movemask_epi8(result);
-#else
- __m128i a_data1 = _mm_loadu_si128(reinterpret_cast<const __m128i *>(a + offset));
- __m128i a_data2 = _mm_loadu_si128(reinterpret_cast<const __m128i *>(a + offset + 8));
- __m128i b_data1 = _mm_loadu_si128(reinterpret_cast<const __m128i *>(b + offset));
- __m128i b_data2 = _mm_loadu_si128(reinterpret_cast<const __m128i *>(b + offset + 8));
- __m128i result1 = _mm_cmpeq_epi16(a_data1, b_data1);
- __m128i result2 = _mm_cmpeq_epi16(a_data2, b_data2);
- uint mask = _mm_movemask_epi8(result1) | (_mm_movemask_epi8(result2) << 16);
-#endif
- mask = ~mask;
- if (mask) {
- // found a different character
- uint idx = qCountTrailingZeroBits(mask);
- return a[offset + idx / 2].unicode() - b[offset + idx / 2].unicode();
- }
+ return qt_ucstrncmp_mips_dsp_asm(a, b, l);
}
-
- // we're going to read a[0..7] and b[0..7] (16 bytes)
- if (end - a >= offset + 8) {
- __m128i a_data = _mm_loadu_si128(reinterpret_cast<const __m128i *>(a + offset));
- __m128i b_data = _mm_loadu_si128(reinterpret_cast<const __m128i *>(b + offset));
- if (isDifferent(a_data, b_data))
- return retval;
-
- offset += 8;
- }
-
- // we're going to read a[0..3] and b[0..3] (8 bytes)
- if (end - a >= offset + 4) {
- __m128i a_data = _mm_loadl_epi64(reinterpret_cast<const __m128i *>(a + offset));
- __m128i b_data = _mm_loadl_epi64(reinterpret_cast<const __m128i *>(b + offset));
- if (isDifferent(a_data, b_data))
- return retval;
-
- offset += 4;
- }
-
- // reset l
- l &= 3;
-
- const auto lambda = [=](size_t i) -> int {
- return a[offset + i].unicode() - b[offset + i].unicode();
- };
- return UnrollTailLoop<3>::exec(l, 0, lambda, lambda);
-#endif
-#ifdef __ARM_NEON__
+# elif defined(__SSE2__)
+ return ucstrncmp_sse2<Mode>(a, b, l);
+# elif defined(__ARM_NEON__)
if (l >= 8) {
- const QChar *end = a + l;
+ const char16_t *end = a + l;
const uint16x8_t mask = { 1, 1 << 1, 1 << 2, 1 << 3, 1 << 4, 1 << 5, 1 << 6, 1 << 7 };
while (end - a > 7) {
uint16x8_t da = vld1q_u16(reinterpret_cast<const uint16_t *>(a));
@@ -1014,8 +1298,10 @@ static int ucstrncmp(const QChar *a, const QChar *b, size_t l)
uint8_t r = ~(uint8_t)vaddvq_u16(vandq_u16(vceqq_u16(da, db), mask));
if (r) {
// found a different QChar
+ if (Mode == CompareStringsForEquality)
+ return 1;
uint idx = qCountTrailingZeroBits(r);
- return (int)a[idx].unicode() - (int)b[idx].unicode();
+ return a[idx] - b[idx];
}
a += 8;
b += 8;
@@ -1023,156 +1309,31 @@ static int ucstrncmp(const QChar *a, const QChar *b, size_t l)
l &= 7;
}
const auto lambda = [=](size_t i) -> int {
- return a[i].unicode() - b[i].unicode();
+ return a[i] - b[i];
};
return UnrollTailLoop<7>::exec(l, 0, lambda, lambda);
-#endif // __ARM_NEON__
- if (!l)
- return 0;
+# endif // MIPS DSP or __SSE2__ or __ARM_NEON__
+#endif // __OPTIMIZE_SIZE__
- // check alignment
- if ((reinterpret_cast<quintptr>(a) & 2) == (reinterpret_cast<quintptr>(b) & 2)) {
- // both addresses have the same alignment
- if (reinterpret_cast<quintptr>(a) & 2) {
- // both addresses are not aligned to 4-bytes boundaries
- // compare the first character
- if (*a != *b)
- return a->unicode() - b->unicode();
- --l;
- ++a;
- ++b;
-
- // now both addresses are 4-bytes aligned
- }
-
- // both addresses are 4-bytes aligned
- // do a fast 32-bit comparison
- const quint32 *da = reinterpret_cast<const quint32 *>(a);
- const quint32 *db = reinterpret_cast<const quint32 *>(b);
- const quint32 *e = da + (l >> 1);
- for ( ; da != e; ++da, ++db) {
- if (*da != *db) {
- a = reinterpret_cast<const QChar *>(da);
- b = reinterpret_cast<const QChar *>(db);
- if (*a != *b)
- return a->unicode() - b->unicode();
- return a[1].unicode() - b[1].unicode();
- }
- }
+ if (Mode == CompareStringsForEquality || QSysInfo::ByteOrder == QSysInfo::BigEndian)
+ return memcmp(a, b, l * sizeof(char16_t));
- // do we have a tail?
- a = reinterpret_cast<const QChar *>(da);
- b = reinterpret_cast<const QChar *>(db);
- return (l & 1) ? a->unicode() - b->unicode() : 0;
- } else {
- // one of the addresses isn't 4-byte aligned but the other is
- const QChar *e = a + l;
- for ( ; a != e; ++a, ++b) {
- if (*a != *b)
- return a->unicode() - b->unicode();
- }
+ for (size_t i = 0; i < l; ++i) {
+ if (int diff = a[i] - b[i])
+ return diff;
}
return 0;
-#endif
}
-static int ucstrncmp(const QChar *a, const uchar *c, size_t l)
+template <StringComparisonMode Mode>
+static int ucstrncmp(const char16_t *a, const char *b, size_t l)
{
- const char16_t *uc = reinterpret_cast<const char16_t *>(a);
+ const uchar *c = reinterpret_cast<const uchar *>(b);
+ const char16_t *uc = a;
const char16_t *e = uc + l;
-#ifdef __SSE2__
- __m128i nullmask = _mm_setzero_si128();
- qptrdiff offset = 0;
-
-# if !defined(__OPTIMIZE_SIZE__)
- // Using the PMOVMSKB instruction, we get two bits for each character
- // we compare.
- int retval;
- auto isDifferent = [uc, c, &offset, &retval](__m128i a_data, __m128i b_data) {
- __m128i result = _mm_cmpeq_epi16(a_data, b_data);
- uint mask = ~uint(_mm_movemask_epi8(result));
- if (ushort(mask) == 0)
- return false;
- uint idx = qCountTrailingZeroBits(mask);
- retval = uc[offset + idx / 2] - c[offset + idx / 2];
- return true;
- };
-# endif
-
- // we're going to read uc[offset..offset+15] (32 bytes)
- // and c[offset..offset+15] (16 bytes)
- for ( ; uc + offset + 15 < e; offset += 16) {
- // similar to fromLatin1_helper:
- // load 16 bytes of Latin 1 data
- __m128i chunk = _mm_loadu_si128((const __m128i*)(c + offset));
-
-# ifdef __AVX2__
- // expand Latin 1 data via zero extension
- __m256i ldata = _mm256_cvtepu8_epi16(chunk);
-
- // load UTF-16 data and compare
- __m256i ucdata = _mm256_loadu_si256((const __m256i*)(uc + offset));
- __m256i result = _mm256_cmpeq_epi16(ldata, ucdata);
-
- uint mask = ~_mm256_movemask_epi8(result);
-# else
- // expand via unpacking
- __m128i firstHalf = _mm_unpacklo_epi8(chunk, nullmask);
- __m128i secondHalf = _mm_unpackhi_epi8(chunk, nullmask);
-
- // load UTF-16 data and compare
- __m128i ucdata1 = _mm_loadu_si128((const __m128i*)(uc + offset));
- __m128i ucdata2 = _mm_loadu_si128((const __m128i*)(uc + offset + 8));
- __m128i result1 = _mm_cmpeq_epi16(firstHalf, ucdata1);
- __m128i result2 = _mm_cmpeq_epi16(secondHalf, ucdata2);
-
- uint mask = ~(_mm_movemask_epi8(result1) | _mm_movemask_epi8(result2) << 16);
-# endif
- if (mask) {
- // found a different character
- uint idx = qCountTrailingZeroBits(mask);
- return uc[offset + idx / 2] - c[offset + idx / 2];
- }
- }
-
-# if !defined(__OPTIMIZE_SIZE__)
- // we'll read uc[offset..offset+7] (16 bytes) and c[offset..offset+7] (8 bytes)
- if (uc + offset + 7 < e) {
- // same, but we're using an 8-byte load
- __m128i secondHalf = mm_load8_zero_extend(c + offset);
-
- __m128i ucdata = _mm_loadu_si128((const __m128i*)(uc + offset));
- if (isDifferent(ucdata, secondHalf))
- return retval;
-
- // still matched
- offset += 8;
- }
-
- enum { MaxTailLength = 3 };
- // we'll read uc[offset..offset+3] (8 bytes) and c[offset..offset+3] (4 bytes)
- if (uc + offset + 3 < e) {
- __m128i chunk = _mm_cvtsi32_si128(qFromUnaligned<int>(c + offset));
- __m128i secondHalf = _mm_unpacklo_epi8(chunk, nullmask);
-
- __m128i ucdata = _mm_loadl_epi64(reinterpret_cast<const __m128i *>(uc + offset));
- if (isDifferent(ucdata, secondHalf))
- return retval;
-
- // still matched
- offset += 4;
- }
-# endif // optimize size
-
- // reset uc and c
- uc += offset;
- c += offset;
-
-# if !defined(__OPTIMIZE_SIZE__)
- const auto lambda = [=](size_t i) { return uc[i] - char16_t(c[i]); };
- return UnrollTailLoop<MaxTailLength>::exec(e - uc, 0, lambda, lambda);
-# endif
+#if defined(__SSE2__) && !defined(__OPTIMIZE_SIZE__)
+ return ucstrncmp_sse2<Mode>(uc, c, l);
#endif
while (uc < e) {
@@ -1185,52 +1346,35 @@ static int ucstrncmp(const QChar *a, const uchar *c, size_t l)
return 0;
}
-constexpr int lencmp(qsizetype lhs, qsizetype rhs) noexcept
+// Unicode case-sensitive equality
+template <typename Char2>
+static bool ucstreq(const char16_t *a, size_t alen, const Char2 *b)
{
- return lhs == rhs ? 0 :
- lhs > rhs ? 1 :
- /* else */ -1 ;
+ if constexpr (std::is_same_v<decltype(a), decltype(b)>) {
+ if (a == b)
+ return true;
+ }
+ return ucstrncmp<CompareStringsForEquality>(a, b, alen) == 0;
}
// Unicode case-sensitive comparison
-static int ucstrcmp(const QChar *a, size_t alen, const QChar *b, size_t blen)
+template <typename Char2>
+static int ucstrcmp(const char16_t *a, size_t alen, const Char2 *b, size_t blen)
{
- if (a == b && alen == blen)
- return 0;
+ if constexpr (std::is_same_v<decltype(a), decltype(b)>) {
+ if (a == b && alen == blen)
+ return 0;
+ }
const size_t l = qMin(alen, blen);
- int cmp = ucstrncmp(a, b, l);
- return cmp ? cmp : lencmp(alen, blen);
+ int cmp = ucstrncmp<CompareStringsForOrdering>(a, b, l);
+ return cmp ? cmp : qt_lencmp(alen, blen);
}
-static int ucstrcmp(const QChar *a, size_t alen, const char *b, size_t blen)
-{
- const size_t l = qMin(alen, blen);
- const int cmp = ucstrncmp(a, reinterpret_cast<const uchar*>(b), l);
- return cmp ? cmp : lencmp(alen, blen);
-}
-
-static constexpr uchar latin1Lower[256] = {
- 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
- 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,
- 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,
- 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
- 0x40,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f,
- 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x5b,0x5c,0x5d,0x5e,0x5f,
- 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f,
- 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x7b,0x7c,0x7d,0x7e,0x7f,
- 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,
- 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f,
- 0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf,
- 0xb0,0xb1,0xb2,0xb3,0xb4,0xb5,0xb6,0xb7,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,0xbe,0xbf,
- // 0xd7 (multiplication sign) and 0xdf (sz ligature) complicate life
- 0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,0xeb,0xec,0xed,0xee,0xef,
- 0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xd7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xdf,
- 0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,0xeb,0xec,0xed,0xee,0xef,
- 0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff
-};
+using CaseInsensitiveL1 = QtPrivate::QCaseInsensitiveLatin1Hash;
+
static int latin1nicmp(const char *lhsChar, qsizetype lSize, const char *rhsChar, qsizetype rSize)
{
- // We're called with QLatin1String's .data() and .size():
+ // We're called with QLatin1StringView's .data() and .size():
Q_ASSERT(lSize >= 0 && rSize >= 0);
if (!lSize)
return rSize ? -1 : 0;
@@ -1238,33 +1382,35 @@ static int latin1nicmp(const char *lhsChar, qsizetype lSize, const char *rhsChar
return 1;
const qsizetype size = std::min(lSize, rSize);
- const uchar *lhs = reinterpret_cast<const uchar *>(lhsChar);
- const uchar *rhs = reinterpret_cast<const uchar *>(rhsChar);
- Q_ASSERT(lhs && rhs); // since both lSize and rSize are positive
+ Q_ASSERT(lhsChar && rhsChar); // since both lSize and rSize are positive
for (qsizetype i = 0; i < size; i++) {
- if (int res = latin1Lower[lhs[i]] - latin1Lower[rhs[i]])
+ if (int res = CaseInsensitiveL1::difference(lhsChar[i], rhsChar[i]))
return res;
}
- return lencmp(lSize, rSize);
+ return qt_lencmp(lSize, rSize);
}
+
bool QtPrivate::equalStrings(QStringView lhs, QStringView rhs) noexcept
{
- return ucstrcmp(lhs.begin(), lhs.size(), rhs.begin(), rhs.size()) == 0;
+ Q_ASSERT(lhs.size() == rhs.size());
+ return ucstreq(lhs.utf16(), lhs.size(), rhs.utf16());
}
-bool QtPrivate::equalStrings(QStringView lhs, QLatin1String rhs) noexcept
+bool QtPrivate::equalStrings(QStringView lhs, QLatin1StringView rhs) noexcept
{
- return ucstrcmp(lhs.begin(), lhs.size(), rhs.begin(), rhs.size()) == 0;
+ Q_ASSERT(lhs.size() == rhs.size());
+ return ucstreq(lhs.utf16(), lhs.size(), rhs.latin1());
}
-bool QtPrivate::equalStrings(QLatin1String lhs, QStringView rhs) noexcept
+bool QtPrivate::equalStrings(QLatin1StringView lhs, QStringView rhs) noexcept
{
return QtPrivate::equalStrings(rhs, lhs);
}
-bool QtPrivate::equalStrings(QLatin1String lhs, QLatin1String rhs) noexcept
+bool QtPrivate::equalStrings(QLatin1StringView lhs, QLatin1StringView rhs) noexcept
{
- return lhs.size() == rhs.size() && (!lhs.size() || qstrncmp(lhs.data(), rhs.data(), lhs.size()) == 0);
+ Q_ASSERT(lhs.size() == rhs.size());
+ return (!lhs.size() || memcmp(lhs.data(), rhs.data(), lhs.size()) == 0);
}
bool QtPrivate::equalStrings(QBasicUtf8StringView<false> lhs, QStringView rhs) noexcept
@@ -1277,20 +1423,26 @@ bool QtPrivate::equalStrings(QStringView lhs, QBasicUtf8StringView<false> rhs) n
return QtPrivate::equalStrings(rhs, lhs);
}
-bool QtPrivate::equalStrings(QLatin1String lhs, QBasicUtf8StringView<false> rhs) noexcept
+bool QtPrivate::equalStrings(QLatin1StringView lhs, QBasicUtf8StringView<false> rhs) noexcept
{
- QString r = rhs.toString();
- return QtPrivate::equalStrings(lhs, r); // ### optimize!
+ return QUtf8::compareUtf8(QByteArrayView(rhs), lhs) == 0;
}
-bool QtPrivate::equalStrings(QBasicUtf8StringView<false> lhs, QLatin1String rhs) noexcept
+bool QtPrivate::equalStrings(QBasicUtf8StringView<false> lhs, QLatin1StringView rhs) noexcept
{
return QtPrivate::equalStrings(rhs, lhs);
}
bool QtPrivate::equalStrings(QBasicUtf8StringView<false> lhs, QBasicUtf8StringView<false> rhs) noexcept
{
- return lhs.size() == rhs.size() && (!lhs.size() || qstrncmp(lhs.data(), rhs.data(), lhs.size()) == 0);
+#if QT_VERSION >= QT_VERSION_CHECK(7, 0, 0) || defined(QT_BOOTSTRAPPED) || defined(QT_STATIC)
+ Q_ASSERT(lhs.size() == rhs.size());
+#else
+ // operator== didn't enforce size prior to Qt 6.2
+ if (lhs.size() != rhs.size())
+ return false;
+#endif
+ return (!lhs.size() || memcmp(lhs.data(), rhs.data(), lhs.size()) == 0);
}
bool QAnyStringView::equal(QAnyStringView lhs, QAnyStringView rhs) noexcept
@@ -1311,8 +1463,7 @@ bool QAnyStringView::equal(QAnyStringView lhs, QAnyStringView rhs) noexcept
Returns an integer that compares to 0 as \a lhs compares to \a rhs.
- If \a cs is Qt::CaseSensitive (the default), the comparison is case-sensitive;
- otherwise the comparison is case-insensitive.
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {comparison}
Case-sensitive comparison is based exclusively on the numeric Unicode values
of the characters and is very fast, but is not what a human would expect.
@@ -1323,8 +1474,8 @@ bool QAnyStringView::equal(QAnyStringView lhs, QAnyStringView rhs) noexcept
int QtPrivate::compareStrings(QStringView lhs, QStringView rhs, Qt::CaseSensitivity cs) noexcept
{
if (cs == Qt::CaseSensitive)
- return ucstrcmp(lhs.begin(), lhs.size(), rhs.begin(), rhs.size());
- return ucstricmp(lhs.begin(), lhs.end(), rhs.begin(), rhs.end());
+ return ucstrcmp(lhs.utf16(), lhs.size(), rhs.utf16(), rhs.size());
+ return ucstricmp(lhs.size(), lhs.utf16(), rhs.size(), rhs.utf16());
}
/*!
@@ -1335,8 +1486,7 @@ int QtPrivate::compareStrings(QStringView lhs, QStringView rhs, Qt::CaseSensitiv
Returns an integer that compares to 0 as \a lhs compares to \a rhs.
- If \a cs is Qt::CaseSensitive (the default), the comparison is case-sensitive;
- otherwise the comparison is case-insensitive.
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {comparison}
Case-sensitive comparison is based exclusively on the numeric Unicode values
of the characters and is very fast, but is not what a human would expect.
@@ -1344,11 +1494,11 @@ int QtPrivate::compareStrings(QStringView lhs, QStringView rhs, Qt::CaseSensitiv
\sa {Comparing Strings}
*/
-int QtPrivate::compareStrings(QStringView lhs, QLatin1String rhs, Qt::CaseSensitivity cs) noexcept
+int QtPrivate::compareStrings(QStringView lhs, QLatin1StringView rhs, Qt::CaseSensitivity cs) noexcept
{
if (cs == Qt::CaseSensitive)
- return ucstrcmp(lhs.begin(), lhs.size(), rhs.begin(), rhs.size());
- return ucstricmp(lhs.begin(), lhs.end(), rhs.begin(), rhs.end());
+ return ucstrcmp(lhs.utf16(), lhs.size(), rhs.latin1(), rhs.size());
+ return ucstricmp(lhs.size(), lhs.utf16(), rhs.size(), rhs.latin1());
}
/*!
@@ -1368,7 +1518,7 @@ int QtPrivate::compareStrings(QStringView lhs, QBasicUtf8StringView<false> rhs,
\since 5.10
\overload
*/
-int QtPrivate::compareStrings(QLatin1String lhs, QStringView rhs, Qt::CaseSensitivity cs) noexcept
+int QtPrivate::compareStrings(QLatin1StringView lhs, QStringView rhs, Qt::CaseSensitivity cs) noexcept
{
return -compareStrings(rhs, lhs, cs);
}
@@ -1381,8 +1531,7 @@ int QtPrivate::compareStrings(QLatin1String lhs, QStringView rhs, Qt::CaseSensit
Returns an integer that compares to 0 as \a lhs compares to \a rhs.
- If \a cs is Qt::CaseSensitive (the default), the comparison is case-sensitive;
- otherwise the comparison is case-insensitive.
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {comparison}
Case-sensitive comparison is based exclusively on the numeric Latin-1 values
of the characters and is very fast, but is not what a human would expect.
@@ -1390,15 +1539,15 @@ int QtPrivate::compareStrings(QLatin1String lhs, QStringView rhs, Qt::CaseSensit
\sa {Comparing Strings}
*/
-int QtPrivate::compareStrings(QLatin1String lhs, QLatin1String rhs, Qt::CaseSensitivity cs) noexcept
+int QtPrivate::compareStrings(QLatin1StringView lhs, QLatin1StringView rhs, Qt::CaseSensitivity cs) noexcept
{
if (lhs.isEmpty())
- return lencmp(qsizetype(0), rhs.size());
+ return qt_lencmp(qsizetype(0), rhs.size());
if (cs == Qt::CaseInsensitive)
return latin1nicmp(lhs.data(), lhs.size(), rhs.data(), rhs.size());
const auto l = std::min(lhs.size(), rhs.size());
- int r = qstrncmp(lhs.data(), rhs.data(), l);
- return r ? r : lencmp(lhs.size(), rhs.size());
+ int r = memcmp(lhs.data(), rhs.data(), l);
+ return r ? r : qt_lencmp(lhs.size(), rhs.size());
}
/*!
@@ -1407,9 +1556,9 @@ int QtPrivate::compareStrings(QLatin1String lhs, QLatin1String rhs, Qt::CaseSens
\since 6.0
\overload
*/
-int QtPrivate::compareStrings(QLatin1String lhs, QBasicUtf8StringView<false> rhs, Qt::CaseSensitivity cs) noexcept
+int QtPrivate::compareStrings(QLatin1StringView lhs, QBasicUtf8StringView<false> rhs, Qt::CaseSensitivity cs) noexcept
{
- return compareStrings(lhs, rhs.toString(), cs); // ### optimize!
+ return -QUtf8::compareUtf8(QByteArrayView(rhs), lhs, cs);
}
/*!
@@ -1431,7 +1580,7 @@ int QtPrivate::compareStrings(QBasicUtf8StringView<false> lhs, QStringView rhs,
\since 6.0
\overload
*/
-int QtPrivate::compareStrings(QBasicUtf8StringView<false> lhs, QLatin1String rhs, Qt::CaseSensitivity cs) noexcept
+int QtPrivate::compareStrings(QBasicUtf8StringView<false> lhs, QLatin1StringView rhs, Qt::CaseSensitivity cs) noexcept
{
return -compareStrings(rhs, lhs, cs);
}
@@ -1444,13 +1593,7 @@ int QtPrivate::compareStrings(QBasicUtf8StringView<false> lhs, QLatin1String rhs
*/
int QtPrivate::compareStrings(QBasicUtf8StringView<false> lhs, QBasicUtf8StringView<false> rhs, Qt::CaseSensitivity cs) noexcept
{
- if (lhs.isEmpty())
- return lencmp(0, rhs.size());
- if (cs == Qt::CaseInsensitive)
- return compareStrings(lhs.toString(), rhs.toString(), cs); // ### optimize!
- const auto l = std::min(lhs.size(), rhs.size());
- int r = qstrncmp(lhs.data(), rhs.data(), l);
- return r ? r : lencmp(lhs.size(), rhs.size());
+ return QUtf8::compareUtf8(QByteArrayView(lhs), QByteArrayView(rhs), cs);
}
int QAnyStringView::compare(QAnyStringView lhs, QAnyStringView rhs, Qt::CaseSensitivity cs) noexcept
@@ -1462,32 +1605,9 @@ int QAnyStringView::compare(QAnyStringView lhs, QAnyStringView rhs, Qt::CaseSens
});
}
-#define REHASH(a) \
- if (sl_minus_1 < sizeof(std::size_t) * CHAR_BIT) \
- hashHaystack -= std::size_t(a) << sl_minus_1; \
- hashHaystack <<= 1
-
-inline bool qIsUpper(char ch)
-{
- return ch >= 'A' && ch <= 'Z';
-}
-
-inline bool qIsDigit(char ch)
-{
- return ch >= '0' && ch <= '9';
-}
-
-inline char qToLower(char ch)
-{
- if (ch >= 'A' && ch <= 'Z')
- return ch - 'A' + 'a';
- else
- return ch;
-}
-
// ### Qt 7: do not allow anything but ASCII digits
// in arg()'s replacements.
-#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0)
+#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0) && !defined(QT_BOOTSTRAPPED)
static bool supportUnicodeDigitValuesInArg()
{
static const bool result = []() {
@@ -1510,7 +1630,7 @@ static bool supportUnicodeDigitValuesInArg()
static int qArgDigitValue(QChar ch) noexcept
{
-#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0)
+#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0) && !defined(QT_BOOTSTRAPPED)
if (supportUnicodeDigitValuesInArg())
return ch.digitValue();
#endif
@@ -1519,6 +1639,10 @@ static int qArgDigitValue(QChar ch) noexcept
return -1;
}
+#if QT_CONFIG(regularexpression)
+Q_DECL_COLD_FUNCTION
+void qtWarnAboutInvalidRegularExpression(const QString &pattern, const char *where);
+#endif
/*!
\macro QT_RESTRICTED_CAST_FROM_ASCII
@@ -1530,7 +1654,7 @@ static int qArgDigitValue(QChar ch) noexcept
and the \c{QString::operator=(const char (&ch)[N])} assignment operator.
This gives most of the type-safety benefits of \l QT_NO_CAST_FROM_ASCII
but does not require user code to wrap character and string literals
- with QLatin1Char, QLatin1String or similar.
+ with QLatin1Char, QLatin1StringView or similar.
Using this macro together with source strings outside the 7-bit range,
non-literals, or literals with embedded NUL characters is undefined.
@@ -1586,10 +1710,18 @@ static int qArgDigitValue(QChar ch) noexcept
\ingroup shared
\ingroup string-processing
+ \compares strong
+ \compareswith strong QChar QLatin1StringView {const char16_t *} \
+ QStringView QUtf8StringView
+ \endcompareswith
+ \compareswith strong QByteArray QByteArrayView {const char *}
+ When comparing with byte arrays, their content is interpreted as utf-8.
+ \endcompareswith
+
QString stores a string of 16-bit \l{QChar}s, where each QChar
corresponds to one UTF-16 code unit. (Unicode characters
with code values above 65535 are stored using surrogate pairs,
- i.e., two consecutive \l{QChar}s.)
+ that is, two consecutive \l{QChar}s.)
\l{Unicode} is an international standard that supports most of the
writing systems in use today. It is a superset of US-ASCII (ANSI
@@ -1605,17 +1737,15 @@ static int qArgDigitValue(QChar ch) noexcept
store raw bytes and traditional 8-bit '\\0'-terminated strings.
For most purposes, QString is the class you want to use. It is
used throughout the Qt API, and the Unicode support ensures that
- your applications will be easy to translate if you want to expand
- your application's market at some point. The two main cases where
- QByteArray is appropriate are when you need to store raw binary
- data, and when memory conservation is critical (like in embedded
- systems).
-
- \tableofcontents
+ your applications are easy to translate if you want to expand
+ your application's market at some point. Two prominent cases
+ where QByteArray is appropriate are when you need to store raw
+ binary data, and when memory conservation is critical (like in
+ embedded systems).
- \section1 Initializing a String
+ \section1 Initializing a string
- One way to initialize a QString is simply to pass a \c{const char
+ One way to initialize a QString is to pass a \c{const char
*} to its constructor. For example, the following code creates a
QString of size 5 containing the data "Hello":
@@ -1626,17 +1756,18 @@ static int qArgDigitValue(QChar ch) noexcept
In all of the QString functions that take \c{const char *}
parameters, the \c{const char *} is interpreted as a classic
- C-style '\\0'-terminated string encoded in UTF-8. It is legal for
- the \c{const char *} parameter to be \nullptr.
+ C-style \c{'\\0'}-terminated string. Except where the function's
+ name overtly indicates some other encoding, such \c{const char *}
+ parameters are assumed to be encoded in UTF-8.
You can also provide string data as an array of \l{QChar}s:
\snippet qstring/main.cpp 1
QString makes a deep copy of the QChar data, so you can modify it
- later without experiencing side effects. (If for performance
- reasons you don't want to take a deep copy of the character data,
- use QString::fromRawData() instead.)
+ later without experiencing side effects. You can avoid taking a
+ deep copy of the character data by using QStringView or
+ QString::fromRawData() instead.
Another approach is to set the size of the string using resize()
and to initialize the data character per character. QString uses
@@ -1653,7 +1784,7 @@ static int qArgDigitValue(QChar ch) noexcept
\snippet qstring/main.cpp 3
- The at() function can be faster than \l operator[](), because it
+ The at() function can be faster than \l operator[]() because it
never causes a \l{deep copy} to occur. Alternatively, use the
first(), last(), or sliced() functions to extract several characters
at a time.
@@ -1675,11 +1806,11 @@ static int qArgDigitValue(QChar ch) noexcept
You can also pass string literals to functions that take QStrings
as arguments, invoking the QString(const char *)
constructor. Similarly, you can pass a QString to a function that
- takes a \c{const char *} argument using the \l qPrintable() macro
+ takes a \c{const char *} argument using the \l qPrintable() macro,
which returns the given QString as a \c{const char *}. This is
equivalent to calling <QString>.toLocal8Bit().constData().
- \section1 Manipulating String Data
+ \section1 Manipulating string data
QString provides the following basic functions for modifying the
character data: append(), prepend(), insert(), replace(), and
@@ -1687,19 +1818,19 @@ static int qArgDigitValue(QChar ch) noexcept
\snippet qstring/main.cpp 5
- In the above example the replace() function's first two arguments are the
+ In the above example, the replace() function's first two arguments are the
position from which to start replacing and the number of characters that
should be replaced.
When data-modifying functions increase the size of the string,
- they may lead to reallocation of memory for the QString object. When
+ QString may reallocate the memory in which it holds its data. When
this happens, QString expands by more than it immediately needs so as
to have space for further expansion without reallocation until the size
- of the string has greatly increased.
+ of the string has significantly increased.
- The insert(), remove() and, when replacing a sub-string with one of
+ The insert(), remove(), and, when replacing a sub-string with one of
different size, replace() functions can be slow (\l{linear time}) for
- large strings, because they require moving many characters in the string
+ large strings because they require moving many characters in the string
by at least one position in memory.
If you are building a QString gradually and know in advance
@@ -1717,32 +1848,32 @@ static int qArgDigitValue(QChar ch) noexcept
method of the QString is called. Accessing such an iterator or reference
after the call to a non-\c{const} method leads to undefined behavior. When
stability for iterator-like functionality is required, you should use
- indexes instead of iterators as they are not tied to QString's internal
+ indexes instead of iterators, as they are not tied to QString's internal
state and thus do not get invalidated.
\note Due to \l{implicit sharing}, the first non-\c{const} operator or
- function used on a given QString may cause it to, internally, perform a deep
+ function used on a given QString may cause it to internally perform a deep
copy of its data. This invalidates all iterators over the string and
- references to individual characters within it. After the first non-\c{const}
- operator, operations that modify QString may completely (in case of
- reallocation) or partially invalidate iterators and references, but other
- methods (such as begin() or end()) will not. Accessing an iterator or
- reference after it has been invalidated leads to undefined behavior.
-
- A frequent requirement is to remove whitespace characters from a
- string ('\\n', '\\t', ' ', etc.). If you want to remove whitespace
- from both ends of a QString, use the trimmed() function. If you
- want to remove whitespace from both ends and replace multiple
- consecutive whitespaces with a single space character within the
- string, use simplified().
+ references to individual characters within it. Do not call non-const
+ functions while keeping iterators. Accessing an iterator or reference
+ after it has been invalidated leads to undefined behavior. See the
+ \l{Implicit sharing iterator problem} section for more information.
+
+ A frequent requirement is to remove or simplify the spacing between
+ visible characters in a string. The characters that make up that spacing
+ are those for which \l {QChar::}{isSpace()} returns \c true, such as
+ the simple space \c{' '}, the horizontal tab \c{'\\t'} and the newline \c{'\\n'}.
+ To obtain a copy of a string leaving out any spacing from its start and end,
+ use \l trimmed(). To also replace each sequence of spacing characters within
+ the string with a simple space, \c{' '}, use \l simplified().
If you want to find all occurrences of a particular character or
substring in a QString, use the indexOf() or lastIndexOf()
- functions. The former searches forward starting from a given index
- position, the latter searches backward. Both return the index
- position of the character or substring if they find it; otherwise,
- they return -1. For example, here is a typical loop that finds all
- occurrences of a particular substring:
+ functions.The former searches forward, the latter searches backward.
+ Either can be told an index position from which to start their search.
+ Each returns the index position of the character or substring if they
+ find it; otherwise, they return -1. For example, here is a typical loop
+ that finds all occurrences of a particular substring:
\snippet qstring/main.cpp 6
@@ -1751,52 +1882,57 @@ static int qArgDigitValue(QChar ch) noexcept
setNum() functions, the number() static functions, and the
toInt(), toDouble(), and similar functions.
- To get an upper- or lowercase version of a string use toUpper() or
+ To get an uppercase or lowercase version of a string, use toUpper() or
toLower().
Lists of strings are handled by the QStringList class. You can
split a string into a list of strings using the split() function,
and join a list of strings into a single string with an optional
- separator using QStringList::join(). You can obtain a list of
- strings from a string list that contain a particular substring or
- that match a particular QRegularExpression using the QStringList::filter()
- function.
+ separator using QStringList::join(). You can obtain a filtered list
+ from a string list by selecting the entries in it that contain a
+ particular substring or match a particular QRegularExpression.
+ See QStringList::filter() for details.
- \section1 Querying String Data
+ \section1 Querying string data
- If you want to see if a QString starts or ends with a particular
- substring use startsWith() or endsWith(). If you simply want to
- check whether a QString contains a particular character or
- substring, use the contains() function. If you want to find out
- how many times a particular character or substring occurs in the
- string, use count().
+ To see if a QString starts or ends with a particular substring, use
+ startsWith() or endsWith(). To check whether a QString contains a
+ specific character or substring, use the contains() function. To
+ find out how many times a particular character or substring occurs
+ in a string, use count().
To obtain a pointer to the actual character data, call data() or
constData(). These functions return a pointer to the beginning of
the QChar data. The pointer is guaranteed to remain valid until a
non-\c{const} function is called on the QString.
- \section2 Comparing Strings
+ \section2 Comparing strings
QStrings can be compared using overloaded operators such as \l
operator<(), \l operator<=(), \l operator==(), \l operator>=(),
- and so on. Note that the comparison is based exclusively on the
- numeric Unicode values of the characters. It is very fast, but is
- not what a human would expect; the QString::localeAwareCompare()
- function is usually a better choice for sorting user-interface
- strings, when such a comparison is available.
-
- On Unix-like platforms (including Linux, \macos and iOS), when Qt
- is linked with the ICU library (which it usually is), its
- locale-aware sorting is used. Otherwise, on \macos and iOS, \l
- localeAwareCompare() compares according the "Order for sorted
- lists" setting in the International preferences panel. On other
- Unix-like systems without ICU, the comparison falls back to the
- system library's \c strcoll(),
-
- \section1 Converting Between Encoded Strings Data and QString
-
- QString provides the following three functions that return a
+ and so on. The comparison is based exclusively on the lexicographical
+ order of the two strings, seen as sequences of UTF-16 code units.
+ It is very fast but is not what a human would expect; the
+ QString::localeAwareCompare() function is usually a better choice for
+ sorting user-interface strings, when such a comparison is available.
+
+ When Qt is linked with the ICU library (which it usually is), its
+ locale-aware sorting is used. Otherwise, platform-specific solutions
+ are used:
+ \list
+ \li On Windows, localeAwareCompare() uses the current user locale,
+ as set in the \uicontrol{regional} and \uicontrol{language}
+ options portion of \uicontrol{Control Panel}.
+ \li On \macos and iOS, \l localeAwareCompare() compares according
+ to the \uicontrol{Order for sorted lists} setting in the
+ \uicontrol{International preferences} panel.
+ \li On other Unix-like systems, the comparison falls back to the
+ system library's \c strcoll().
+ \endlist
+
+ \section1 Converting between encoded string data and QString
+
+ QString provides the following functions that return a
\c{const char *} version of the string as QByteArray: toUtf8(),
toLatin1(), and toLocal8Bit().
@@ -1827,7 +1963,7 @@ static int qArgDigitValue(QChar ch) noexcept
\li \l QT_NO_CAST_FROM_ASCII disables automatic conversions from
C string literals and pointers to Unicode.
\li \l QT_RESTRICTED_CAST_FROM_ASCII allows automatic conversions
- from C characters and character arrays, but disables automatic
+ from C characters and character arrays but disables automatic
conversions from character pointers to Unicode.
\li \l QT_NO_CAST_TO_ASCII disables automatic conversion from QString
to C strings.
@@ -1835,7 +1971,7 @@ static int qArgDigitValue(QChar ch) noexcept
You then need to explicitly call fromUtf8(), fromLatin1(),
or fromLocal8Bit() to construct a QString from an
- 8-bit string, or use the lightweight QLatin1String class, for
+ 8-bit string, or use the lightweight QLatin1StringView class. For
example:
\snippet code/src_corelib_text_qstring.cpp 1
@@ -1856,7 +1992,7 @@ static int qArgDigitValue(QChar ch) noexcept
\snippet qstring/main.cpp 7
- The \c result variable, is a normal variable allocated on the
+ The \c result variable is a normal variable allocated on the
stack. When \c return is called, and because we're returning by
value, the copy constructor is called and a copy of the string is
returned. No actual copying takes place thanks to the implicit
@@ -1864,12 +2000,12 @@ static int qArgDigitValue(QChar ch) noexcept
\endtable
- \section1 Distinction Between Null and Empty Strings
+ \section1 Distinction between null and empty strings
- For historical reasons, QString distinguishes between a null
- string and an empty string. A \e null string is a string that is
+ For historical reasons, QString distinguishes between null
+ and empty strings. A \e null string is a string that is
initialized using QString's default constructor or by passing
- (\c{const char *})0 to the constructor. An \e empty string is any
+ \nullptr to the constructor. An \e empty string is any
string with size 0. A null string is always empty, but an empty
string isn't necessarily null:
@@ -1877,10 +2013,10 @@ static int qArgDigitValue(QChar ch) noexcept
All functions except isNull() treat null strings the same as empty
strings. For example, toUtf8().constData() returns a valid pointer
- (\e not nullptr) to a '\\0' character for a null string. We
+ (not \nullptr) to a '\\0' character for a null string. We
recommend that you always use the isEmpty() function and avoid isNull().
- \section1 Number Formats
+ \section1 Number formats
When a QString::arg() \c{'%'} format specifier includes the \c{'L'} locale
qualifier, and the base is ten (its default), the default locale is
@@ -1890,16 +2026,16 @@ static int qArgDigitValue(QChar ch) noexcept
C locale's representation of numbers.
When QString::arg() applies left-padding to numbers, the fill character
- \c{'0'} is treated specially. If the number is negative, its minus sign will
- appear before the zero-padding. If the field is localized, the
+ \c{'0'} is treated specially. If the number is negative, its minus sign
+ appears before the zero-padding. If the field is localized, the
locale-appropriate zero character is used in place of \c{'0'}. For
floating-point numbers, this special treatment only applies if the number is
finite.
- \section2 Floating-point Formats
+ \section2 Floating-point formats
- In member functions (e.g., arg(), number()) that represent floating-point
- numbers (\c float or \c double) as strings, the form of display can be
+ In member functions (for example, arg() and number()) that format floating-point
+ numbers (\c float or \c double) as strings, the representation used can be
controlled by a choice of \e format and \e precision, whose meanings are as
for \l {QLocale::toString(double, char, int)}.
@@ -1908,19 +2044,15 @@ static int qArgDigitValue(QChar ch) noexcept
the exponent shows its sign and includes at least two digits, left-padding
with zero if needed.
- \section1 More Efficient String Construction
-
- Many strings are known at compile time. But the trivial
- constructor QString("Hello"), will copy the contents of the string,
- treating the contents as Latin-1. To avoid this one can use the
- QStringLiteral macro to directly create the required data at compile
- time. Constructing a QString out of the literal does then not cause
- any overhead at runtime.
+ \section1 More efficient string construction
- A slightly less efficient way is to use QLatin1String. This class wraps
- a C string literal, precalculates it length at compile time and can
- then be used for faster comparison with QStrings and conversion to
- QStrings than a regular C string literal.
+ Many strings are known at compile time. The QString constructor from
+ C++ string literals will copy the contents of the string,
+ treating the contents as UTF-8. This requires memory allocation and
+ re-encoding string data, operations that will happen at runtime.
+ If the string data is known at compile time, you can use the QStringLiteral
+ macro or similarly \c{operator""_s} to create QString's payload at compile
+ time instead.
Using the QString \c{'+'} operator, it is easy to construct a
complex string from multiple substrings. You will often write code
@@ -1929,16 +2061,15 @@ static int qArgDigitValue(QChar ch) noexcept
\snippet qstring/stringbuilder.cpp 0
There is nothing wrong with either of these string constructions,
- but there are a few hidden inefficiencies. Beginning with Qt 4.6,
- you can eliminate them.
+ but there are a few hidden inefficiencies:
- First, multiple uses of the \c{'+'} operator usually means
+ First, repeated use of the \c{'+'} operator may lead to
multiple memory allocations. When concatenating \e{n} substrings,
where \e{n > 2}, there can be as many as \e{n - 1} calls to the
memory allocator.
- In 4.6, an internal template class \c{QStringBuilder} has been
- added along with a few helper functions. This class is marked
+ These allocations can be optimized by an internal class
+ \c{QStringBuilder}. This class is marked
internal and does not appear in the documentation, because you
aren't meant to instantiate it in your code. Its use will be
automatic, as described below. The class is found in
@@ -1954,49 +2085,59 @@ static int qArgDigitValue(QChar ch) noexcept
then called \e{once} to get the required space, and the substrings
are copied into it one by one.
- Additional efficiency is gained by inlining and reduced reference
- counting (the QString created from a \c{QStringBuilder} typically
+ Additional efficiency is gained by inlining and reducing reference
+ counting (the QString created from a \c{QStringBuilder}
has a ref count of 1, whereas QString::append() needs an extra
test).
There are two ways you can access this improved method of string
construction. The straightforward way is to include
- \c{QStringBuilder} wherever you want to use it, and use the
+ \c{QStringBuilder} wherever you want to use it and use the
\c{'%'} operator instead of \c{'+'} when concatenating strings:
\snippet qstring/stringbuilder.cpp 5
- A more global approach which is the most convenient but
- not entirely source compatible, is to this define in your
- .pro file:
+ A more global approach, which is more convenient but not entirely
+ source-compatible, is to define \c QT_USE_QSTRINGBUILDER (by adding
+ it to the compiler flags) at build time. This will make concatenating
+ strings with \c{'+'} work the same way as \c{QStringBuilder's} \c{'%'}.
+
+ \note Using automatic type deduction (for example, by using the \c
+ auto keyword) with the result of string concatenation when QStringBuilder
+ is enabled will show that the concatenation is indeed an object of a
+ QStringBuilder specialization:
+
+ \snippet qstring/stringbuilder.cpp 6
- \snippet qstring/stringbuilder.cpp 3
+ This does not cause any harm, as QStringBuilder will implicitly convert to
+ QString when required. If this is undesirable, then one should specify
+ the necessary types instead of having the compiler deduce them:
- and the \c{'+'} will automatically be performed as the
- \c{QStringBuilder} \c{'%'} everywhere.
+ \snippet qstring/stringbuilder.cpp 7
- \section1 Maximum Size and Out-of-memory Conditions
+ \section1 Maximum size and out-of-memory conditions
The maximum size of QString depends on the architecture. Most 64-bit
systems can allocate more than 2 GB of memory, with a typical limit
of 2^63 bytes. The actual value also depends on the overhead required for
- managing the data block. As a result, you can expect the maximum size
- of 2 GB minus overhead on 32-bit platforms, and 2^63 bytes minus overhead
+ managing the data block. As a result, you can expect a maximum size
+ of 2 GB minus overhead on 32-bit platforms and 2^63 bytes minus overhead
on 64-bit platforms. The number of elements that can be stored in a
QString is this maximum size divided by the size of QChar.
When memory allocation fails, QString throws a \c std::bad_alloc
exception if the application was compiled with exception support.
- Out of memory conditions in Qt containers are the only case where Qt
+ Out-of-memory conditions in Qt containers are the only cases where Qt
will throw exceptions. If exceptions are disabled, then running out of
memory is undefined behavior.
- Note that the operating system may impose further limits on applications
- holding a lot of allocated memory, especially large, contiguous blocks.
- Such considerations, the configuration of such behavior or any mitigation
- are outside the scope of the Qt API.
+ \note Target operating systems may impose limits on how much memory an
+ application can allocate, in total, or on the size of individual allocations.
+ This may further restrict the size of string a QString can hold.
+ Mitigating or controlling the behavior these limits cause is beyond the
+ scope of the Qt API.
- \sa fromRawData(), QChar, QStringView, QLatin1String, QByteArray
+ \sa fromRawData(), QChar, QStringView, QLatin1StringView, QByteArray
*/
/*! \typedef QString::ConstIterator
@@ -2195,9 +2336,9 @@ static int qArgDigitValue(QChar ch) noexcept
/*!
\fn QString::QString()
- Constructs a null string. Null strings are also empty.
+ Constructs a null string. Null strings are also considered empty.
- \sa isEmpty()
+ \sa isEmpty(), isNull(), {Distinction Between Null and Empty Strings}
*/
/*!
@@ -2239,10 +2380,16 @@ static int qArgDigitValue(QChar ch) noexcept
\sa fromLatin1(), fromLocal8Bit(), fromUtf8()
*/
+/*
+//! [from-std-string]
+Returns a copy of the \a str string. The given string is assumed to be
+encoded in \1, and is converted to QString using the \2 function.
+//! [from-std-string]
+*/
+
/*! \fn QString QString::fromStdString(const std::string &str)
- Returns a copy of the \a str string. The given string is converted
- to Unicode using the fromUtf8() function.
+ \include qstring.cpp {from-std-string} {UTF-8} {fromUtf8()}
\sa fromLatin1(), fromLocal8Bit(), fromUtf8(), QByteArray::fromStdString()
*/
@@ -2274,8 +2421,8 @@ static int qArgDigitValue(QChar ch) noexcept
/*! \fn std::wstring QString::toStdWString() const
Returns a std::wstring object with the data contained in this
- QString. The std::wstring is encoded in utf16 on platforms where
- wchar_t is 2 bytes wide (e.g. windows) and in ucs4 on platforms
+ QString. The std::wstring is encoded in UTF-16 on platforms where
+ wchar_t is 2 bytes wide (for example, Windows) and in UTF-32 on platforms
where wchar_t is 4 bytes wide (most Unix systems).
This method is mostly useful to pass a QString to a function
@@ -2285,7 +2432,7 @@ static int qArgDigitValue(QChar ch) noexcept
toStdU32String()
*/
-qsizetype QString::toUcs4_helper(const ushort *uc, qsizetype length, uint *out)
+qsizetype QString::toUcs4_helper(const char16_t *uc, qsizetype length, char32_t *out)
{
qsizetype count = 0;
@@ -2348,15 +2495,12 @@ QString::QString(const QChar *unicode, qsizetype size)
if (!unicode) {
d.clear();
} else {
- if (size < 0) {
- size = 0;
- while (!unicode[size].isNull())
- ++size;
- }
+ if (size < 0)
+ size = QtPrivate::qustrlen(reinterpret_cast<const char16_t *>(unicode));
if (!size) {
d = DataPointer::fromRawData(&_empty, 0);
} else {
- d = DataPointer(Data::allocate(size), size);
+ d = DataPointer(size, size);
Q_CHECK_PTR(d.data());
memcpy(d.data(), unicode, size * sizeof(QChar));
d.data()[size] = '\0';
@@ -2375,14 +2519,13 @@ QString::QString(qsizetype size, QChar ch)
if (size <= 0) {
d = DataPointer::fromRawData(&_empty, 0);
} else {
- d = DataPointer(Data::allocate(size), size);
+ d = DataPointer(size, size);
Q_CHECK_PTR(d.data());
d.data()[size] = '\0';
- char16_t *i = d.data() + size;
char16_t *b = d.data();
+ char16_t *e = d.data() + size;
const char16_t value = ch.unicode();
- while (i != b)
- *--i = value;
+ std::fill(b, e, value);
}
}
@@ -2397,15 +2540,15 @@ QString::QString(qsizetype size, Qt::Initialization)
if (size <= 0) {
d = DataPointer::fromRawData(&_empty, 0);
} else {
- d = DataPointer(Data::allocate(size), size);
+ d = DataPointer(size, size);
Q_CHECK_PTR(d.data());
d.data()[size] = '\0';
}
}
-/*! \fn QString::QString(QLatin1String str)
+/*! \fn QString::QString(QLatin1StringView str)
- Constructs a copy of the Latin-1 string \a str.
+ Constructs a copy of the Latin-1 string viewed by \a str.
\sa fromLatin1()
*/
@@ -2415,7 +2558,7 @@ QString::QString(qsizetype size, Qt::Initialization)
*/
QString::QString(QChar ch)
{
- d = DataPointer(Data::allocate(1), 1);
+ d = DataPointer(1, 1);
Q_CHECK_PTR(d.data());
d.data()[0] = ch.unicode();
d.data()[1] = '\0';
@@ -2431,7 +2574,7 @@ QString::QString(QChar ch)
can be useful if you want to ensure that all user-visible strings
go through QObject::tr(), for example.
- \note: any null ('\\0') bytes in the byte array will be included in this
+ \note Any null ('\\0') bytes in the byte array will be included in this
string, converted to Unicode null characters (U+0000). This behavior is
different from Qt 5.x.
@@ -2479,6 +2622,18 @@ QString::QString(QChar ch)
\internal
*/
+/*! \fn QString::operator std::u16string_view() const
+ \since 6.7
+
+ Converts this QString object to a \c{std::u16string_view} object.
+*/
+
+static bool needsReallocate(const QString &str, qsizetype newSize)
+{
+ const auto capacityAtEnd = str.capacity() - str.data_ptr().freeSpaceAtBegin();
+ return newSize > capacityAtEnd;
+}
+
/*!
Sets the size of the string to \a size characters.
@@ -2515,12 +2670,11 @@ void QString::resize(qsizetype size)
if (size < 0)
size = 0;
- const auto capacityAtEnd = capacity() - d.freeSpaceAtBegin();
- if (d->needsDetach() || size > capacityAtEnd)
+ if (d->needsDetach() || needsReallocate(*this, size))
reallocData(size, QArrayData::Grow);
d.size = size;
if (d->allocatedCapacity())
- d.data()[size] = 0;
+ d.data()[size] = u'\0';
}
/*!
@@ -2533,15 +2687,33 @@ void QString::resize(qsizetype size)
\snippet qstring/main.cpp 46
*/
-void QString::resize(qsizetype size, QChar fillChar)
+void QString::resize(qsizetype newSize, QChar fillChar)
{
- const qsizetype oldSize = length();
- resize(size);
- const qsizetype difference = length() - oldSize;
+ const qsizetype oldSize = size();
+ resize(newSize);
+ const qsizetype difference = size() - oldSize;
if (difference > 0)
std::fill_n(d.data() + oldSize, difference, fillChar.unicode());
}
+
+/*!
+ \since 6.8
+
+ Sets the size of the string to \a size characters. If the size of
+ the string grows, the new characters are uninitialized.
+
+ The behavior is identical to \c{resize(size)}.
+
+ \sa resize()
+*/
+
+void QString::resizeForOverwrite(qsizetype size)
+{
+ resize(size);
+}
+
+
/*! \fn qsizetype QString::capacity() const
Returns the maximum number of characters that can be stored in
@@ -2567,20 +2739,20 @@ void QString::resize(qsizetype size, QChar fillChar)
Ensures the string has space for at least \a size characters.
- If you know in advance how large the string will be, you can call this
- function to save repeated reallocation in the course of building it.
+ If you know in advance how large a string will be, you can call this
+ function to save repeated reallocation while building it.
This can improve performance when building a string incrementally.
A long sequence of operations that add to a string may trigger several
reallocations, the last of which may leave you with significantly more
- space than you really need, which is less efficient than doing a single
+ space than you need. This is less efficient than doing a single
allocation of the right size at the start.
If in doubt about how much space shall be needed, it is usually better to
use an upper bound as \a size, or a high estimate of the most likely size,
if a strict upper bound would be much bigger than this. If \a size is an
underestimate, the string will grow as needed once the reserved size is
- exceeded, which may lead to a larger allocation than your best overestimate
- would have and will slow the operation that triggers it.
+ exceeded, which may lead to a larger allocation than your best
+ overestimate would have and will slow the operation that triggers it.
\warning reserve() reserves memory but does not change the size of the
string. Accessing data beyond the end of the string is undefined behavior.
@@ -2622,7 +2794,7 @@ void QString::reallocData(qsizetype alloc, QArrayData::AllocationOption option)
const bool cannotUseReallocate = d.freeSpaceAtBegin() > 0;
if (d->needsDetach() || cannotUseReallocate) {
- DataPointer dd(Data::allocate(alloc, option), qMin(alloc, d.size));
+ DataPointer dd(alloc, qMin(alloc, d.size), option);
Q_CHECK_PTR(dd.data());
if (dd.size > 0)
::memcpy(dd.data(), d.data(), dd.size * sizeof(QChar));
@@ -2676,13 +2848,13 @@ QString &QString::operator=(const QString &other) noexcept
\since 5.2
*/
-/*! \fn QString &QString::operator=(QLatin1String str)
+/*! \fn QString &QString::operator=(QLatin1StringView str)
\overload operator=()
- Assigns the Latin-1 string \a str to this string.
+ Assigns the Latin-1 string viewed by \a str to this string.
*/
-QString &QString::operator=(QLatin1String other)
+QString &QString::operator=(QLatin1StringView other)
{
const qsizetype capacityAtEnd = capacity() - d.freeSpaceAtBegin();
if (isDetached() && other.size() <= capacityAtEnd) { // assumes d->alloc == 0 -> !isDetached() (sharedNull)
@@ -2728,16 +2900,7 @@ QString &QString::operator=(QLatin1String other)
*/
QString &QString::operator=(QChar ch)
{
- const qsizetype capacityAtEnd = capacity() - d.freeSpaceAtBegin();
- if (isDetached() && capacityAtEnd >= 1) { // assumes d->alloc == 0 -> !isDetached() (sharedNull)
- // re-use existing capacity:
- d.data()[0] = ch.unicode();
- d.data()[1] = 0;
- d.size = 1;
- } else {
- operator=(QString(ch));
- }
- return *this;
+ return assign(1, ch);
}
/*!
@@ -2785,7 +2948,6 @@ QString &QString::operator=(QChar ch)
defined.
*/
-
/*!
\fn QString& QString::insert(qsizetype position, const QByteArray &str)
\since 5.5
@@ -2801,32 +2963,130 @@ QString &QString::operator=(QChar ch)
defined.
*/
+/*! \internal
+ T is a view or a container on/of QChar, char16_t, or char
+*/
+template <typename T>
+static void insert_helper(QString &str, qsizetype i, const T &toInsert)
+{
+ auto &str_d = str.data_ptr();
+ qsizetype difference = 0;
+ if (Q_UNLIKELY(i > str_d.size))
+ difference = i - str_d.size;
+ const qsizetype oldSize = str_d.size;
+ const qsizetype insert_size = toInsert.size();
+ const qsizetype newSize = str_d.size + difference + insert_size;
+ const auto side = i == 0 ? QArrayData::GrowsAtBeginning : QArrayData::GrowsAtEnd;
+
+ if (str_d.needsDetach() || needsReallocate(str, newSize)) {
+ const auto cbegin = str.cbegin();
+ const auto cend = str.cend();
+ const auto insert_start = difference == 0 ? std::next(cbegin, i) : cend;
+ QString other;
+ // Using detachAndGrow() so that prepend optimization works and QStringBuilder
+ // unittests pass
+ other.data_ptr().detachAndGrow(side, newSize, nullptr, nullptr);
+ other.append(QStringView(cbegin, insert_start));
+ other.resize(i, u' ');
+ other.append(toInsert);
+ other.append(QStringView(insert_start, cend));
+ str.swap(other);
+ return;
+ }
+
+ str_d.detachAndGrow(side, difference + insert_size, nullptr, nullptr);
+ Q_CHECK_PTR(str_d.data());
+ str.resize(newSize);
+
+ auto begin = str_d.begin();
+ auto old_end = std::next(begin, oldSize);
+ std::fill_n(old_end, difference, u' ');
+ auto insert_start = std::next(begin, i);
+ if (difference == 0)
+ std::move_backward(insert_start, old_end, str_d.end());
+
+ using Char = std::remove_cv_t<typename T::value_type>;
+ if constexpr(std::is_same_v<Char, QChar>)
+ std::copy_n(reinterpret_cast<const char16_t *>(toInsert.data()), insert_size, insert_start);
+ else if constexpr (std::is_same_v<Char, char16_t>)
+ std::copy_n(toInsert.data(), insert_size, insert_start);
+ else if constexpr (std::is_same_v<Char, char>)
+ qt_from_latin1(insert_start, toInsert.data(), insert_size);
+}
+
/*!
- \fn QString &QString::insert(qsizetype position, QLatin1String str)
+ \fn QString &QString::insert(qsizetype position, QLatin1StringView str)
\overload insert()
- Inserts the Latin-1 string \a str at the given index \a position.
+ Inserts the Latin-1 string viewed by \a str at the given index \a position.
\include qstring.cpp string-grow-at-insertion
*/
-QString &QString::insert(qsizetype i, QLatin1String str)
+QString &QString::insert(qsizetype i, QLatin1StringView str)
{
const char *s = str.latin1();
if (i < 0 || !s || !(*s))
return *this;
- qsizetype len = str.size();
+ insert_helper(*this, i, str);
+ return *this;
+}
+
+/*!
+ \fn QString &QString::insert(qsizetype position, QUtf8StringView str)
+ \overload insert()
+ \since 6.5
+
+ Inserts the UTF-8 string view \a str at the given index \a position.
+
+ \note Inserting variable-width UTF-8-encoded string data is conceptually slower
+ than inserting fixed-width string data such as UTF-16 (QStringView) or Latin-1
+ (QLatin1StringView) and should thus be used sparingly.
+
+ \include qstring.cpp string-grow-at-insertion
+*/
+QString &QString::insert(qsizetype i, QUtf8StringView s)
+{
+ auto insert_size = s.size();
+ if (i < 0 || insert_size <= 0)
+ return *this;
+
qsizetype difference = 0;
- if (Q_UNLIKELY(i > size()))
- difference = i - size();
- d.detachAndGrow(Data::GrowsAtEnd, difference + len, nullptr, nullptr);
- Q_CHECK_PTR(d.data());
- d->copyAppend(difference, u' ');
- d.size += len;
+ if (Q_UNLIKELY(i > d.size))
+ difference = i - d.size;
+
+ const qsizetype newSize = d.size + difference + insert_size;
+
+ if (d.needsDetach() || needsReallocate(*this, newSize)) {
+ const auto cbegin = this->cbegin();
+ const auto insert_start = difference == 0 ? std::next(cbegin, i) : cend();
+ QString other;
+ other.reserve(newSize);
+ other.append(QStringView(cbegin, insert_start));
+ if (difference > 0)
+ other.resize(i, u' ');
+ other.append(s);
+ other.append(QStringView(insert_start, cend()));
+ swap(other);
+ return *this;
+ }
+
+ if (i >= d.size) {
+ d.detachAndGrow(QArrayData::GrowsAtEnd, difference + insert_size, nullptr, nullptr);
+ Q_CHECK_PTR(d.data());
+
+ if (difference > 0)
+ resize(i, u' ');
+ append(s);
+ } else {
+ // Optimal insertion of Utf8 data is at the end, anywhere else could
+ // potentially lead to moving characters twice if Utf8 data size
+ // (variable-width) is less than the equivalent Utf16 data size
+ QVarLengthArray<char16_t> buffer(insert_size); // ### optimize (QTBUG-108546)
+ char16_t *b = QUtf8::convertToUnicode(buffer.data(), s);
+ insert_helper(*this, i, QStringView(buffer.data(), b));
+ }
- ::memmove(d.data() + i + len, d.data() + i, (d.size - i - len) * sizeof(QChar));
- qt_from_latin1(d.data() + i, s, size_t(len));
- d.data()[d.size] = u'\0';
return *this;
}
@@ -2847,28 +3107,14 @@ QString& QString::insert(qsizetype i, const QChar *unicode, qsizetype size)
if (i < 0 || size <= 0)
return *this;
- const char16_t *s = reinterpret_cast<const char16_t *>(unicode);
-
- // handle this specially, as QArrayDataOps::insert() doesn't handle out of
- // bounds positions
- if (i >= d->size) {
- // In case when data points into the range or is == *this, we need to
- // defer a call to free() so that it comes after we copied the data from
- // the old memory:
- DataPointer detached{}; // construction is free
- d.detachAndGrow(Data::GrowsAtEnd, (i - d.size) + size, &s, &detached);
- Q_CHECK_PTR(d.data());
- d->copyAppend(i - d->size, u' ');
- d->copyAppend(s, s + size);
- d.data()[d.size] = u'\0';
- return *this;
+ // In case when data points into "this"
+ if (!d->needsDetach() && QtPrivate::q_points_into_range(unicode, *this)) {
+ QVarLengthArray copy(unicode, unicode + size);
+ insert(i, copy.data(), size);
+ } else {
+ insert_helper(*this, i, QStringView(unicode, size));
}
- if (!d->needsDetach() && QtPrivate::q_points_into_range(s, d.data(), d.data() + d.size))
- return insert(i, QStringView{QVarLengthArray(s, s + size)});
-
- d->insert(i, s, size);
- d.data()[d.size] = u'\0';
return *this;
}
@@ -2912,7 +3158,10 @@ QString &QString::append(const QString &str)
{
if (!str.isNull()) {
if (isNull()) {
- operator=(str);
+ if (Q_UNLIKELY(!str.d.isMutable()))
+ assign(str); // fromRawData, so we do a deep copy
+ else
+ operator=(str);
} else if (str.size()) {
append(str.constData(), str.size());
}
@@ -2921,6 +3170,14 @@ QString &QString::append(const QString &str)
}
/*!
+ \fn QString &QString::append(QStringView v)
+ \overload append()
+ \since 6.0
+
+ Appends the given string view \a v to this string and returns the result.
+*/
+
+/*!
\overload append()
\since 5.0
@@ -2941,23 +3198,23 @@ QString &QString::append(const QChar *str, qsizetype len)
/*!
\overload append()
- Appends the Latin-1 string \a str to this string.
+ Appends the Latin-1 string viewed by \a str to this string.
*/
-QString &QString::append(QLatin1String str)
+QString &QString::append(QLatin1StringView str)
{
- const char *s = str.latin1();
- const qsizetype len = str.size();
- if (s && len > 0) {
- d.detachAndGrow(Data::GrowsAtEnd, len, nullptr, nullptr);
- Q_CHECK_PTR(d.data());
- Q_ASSERT(len <= d->freeSpaceAtEnd());
- char16_t *i = d.data() + d.size;
- qt_from_latin1(i, s, size_t(len));
- d.size += len;
- d.data()[d.size] = '\0';
- } else if (d.isNull() && !str.isNull()) { // special case
- d = DataPointer::fromRawData(&_empty, 0);
- }
+ append_helper(*this, str);
+ return *this;
+}
+
+/*!
+ \overload append()
+ \since 6.5
+
+ Appends the UTF-8 string view \a str to this string.
+*/
+QString &QString::append(QUtf8StringView str)
+{
+ append_helper(*this, str);
return *this;
}
@@ -3016,11 +3273,18 @@ QString &QString::append(QChar ch)
\sa append(), insert()
*/
-/*! \fn QString &QString::prepend(QLatin1String str)
+/*! \fn QString &QString::prepend(QLatin1StringView str)
+
+ \overload prepend()
+
+ Prepends the Latin-1 string viewed by \a str to this string.
+*/
+/*! \fn QString &QString::prepend(QUtf8StringView str)
+ \since 6.5
\overload prepend()
- Prepends the Latin-1 string \a str to this string.
+ Prepends the UTF-8 string view \a str to this string.
*/
/*! \fn QString &QString::prepend(const QChar *str, qsizetype len)
@@ -3073,6 +3337,111 @@ QString &QString::append(QChar ch)
*/
/*!
+ \fn QString &QString::assign(QAnyStringView v)
+ \since 6.6
+
+ Replaces the contents of this string with a copy of \a v and returns a
+ reference to this string.
+
+ The size of this string will be equal to the size of \a v, converted to
+ UTF-16 as if by \c{v.toString()}. Unlike QAnyStringView::toString(), however,
+ this function only allocates memory if the estimated size exceeds the capacity
+ of this string or this string is shared.
+
+ \sa QAnyStringView::toString()
+*/
+
+/*!
+ \fn QString &QString::assign(qsizetype n, QChar c)
+ \since 6.6
+
+ Replaces the contents of this string with \a n copies of \a c and
+ returns a reference to this string.
+
+ The size of this string will be equal to \a n, which has to be non-negative.
+
+ This function will only allocate memory if \a n exceeds the capacity of this
+ string or this string is shared.
+
+ \sa fill()
+*/
+
+/*!
+ \fn template <typename InputIterator, QString::if_compatible_iterator<InputIterator>> QString &QString::assign(InputIterator first, InputIterator last)
+ \since 6.6
+
+ Replaces the contents of this string with a copy of the elements in the
+ iterator range [\a first, \a last) and returns a reference to this string.
+
+ The size of this string will be equal to the decoded length of the elements
+ in the range [\a first, \a last), which need not be the same as the length of
+ the range itself, because this function transparently recodes the input
+ character set to UTF-16.
+
+ This function will only allocate memory if the number of elements in the
+ range, or, for non-UTF-16-encoded input, the maximum possible size of the
+ resulting string, exceeds the capacity of this string, or if this string is
+ shared.
+
+ \note This function overload only participates in overload resolution if
+ \c InputIterator meets the requirements of a
+ \l {https://en.cppreference.com/w/cpp/named_req/InputIterator} {LegacyInputIterator}
+ and the \c{value_type} of \c InputIterator is one of the following character types:
+ \list
+ \li QChar
+ \li QLatin1Char
+ \li \c {char}
+ \li \c {unsigned char}
+ \li \c {signed char}
+ \li \c {char8_t}
+ \li \c char16_t
+ \li (on platforms, such as Windows, where it is a 16-bit type) \c wchar_t
+ \li \c char32_t
+ \endlist
+
+ \note The behavior is undefined if either argument is an iterator into *this or
+ [\a first, \a last) is not a valid range.
+*/
+
+QString &QString::assign(QAnyStringView s)
+{
+ if (s.size() <= capacity() && isDetached()) {
+ const auto offset = d.freeSpaceAtBegin();
+ if (offset)
+ d.setBegin(d.begin() - offset);
+ resize(0);
+ s.visit([this](auto input) {
+ this->append(input);
+ });
+ } else {
+ *this = s.toString();
+ }
+ return *this;
+}
+
+#ifndef QT_BOOTSTRAPPED
+QString &QString::assign_helper(const char32_t *data, qsizetype len)
+{
+ // worst case: each char32_t requires a surrogate pair, so
+ const auto requiredCapacity = len * 2;
+ if (requiredCapacity <= capacity() && isDetached()) {
+ const auto offset = d.freeSpaceAtBegin();
+ if (offset)
+ d.setBegin(d.begin() - offset);
+ auto begin = reinterpret_cast<QChar *>(d.begin());
+ auto ba = QByteArrayView(reinterpret_cast<const std::byte*>(data), len * sizeof(char32_t));
+ QStringConverter::State state;
+ const auto end = QUtf32::convertToUnicode(begin, ba, &state, DetectEndianness);
+ d.size = end - begin;
+ d.data()[d.size] = u'\0';
+ } else {
+ *this = QString::fromUcs4(data, len);
+ }
+ return *this;
+}
+#endif
+
+/*!
\fn QString &QString::remove(qsizetype position, qsizetype n)
Removes \a n characters from the string, starting at the given \a
@@ -3082,6 +3451,8 @@ QString &QString::append(QChar ch)
position + \a n is beyond the end of the string, the string is
truncated at the specified \a position.
+ If \a n is <= 0 nothing is changed.
+
\snippet qstring/main.cpp 37
//! [shrinking-erase]
@@ -3096,14 +3467,26 @@ QString &QString::remove(qsizetype pos, qsizetype len)
{
if (pos < 0) // count from end of string
pos += size();
- if (size_t(pos) >= size_t(size())) {
- // range problems
- } else if (len >= size() - pos) {
- resize(pos); // truncate
- } else if (len > 0) {
- detach();
+
+ if (size_t(pos) >= size_t(size()) || len <= 0)
+ return *this;
+
+ len = std::min(len, size() - pos);
+
+ if (!d->isShared()) {
d->erase(d.begin() + pos, len);
d.data()[d.size] = u'\0';
+ } else {
+ // TODO: either reserve "size()", which is bigger than needed, or
+ // modify the shrinking-erase docs of this method (since the size
+ // of "copy" won't have any extra capacity any more)
+ const qsizetype sz = size() - len;
+ QString copy{sz, Qt::Uninitialized};
+ auto begin = d.begin();
+ auto toRemove_start = d.begin() + pos;
+ copy.d->copyRanges({{begin, toRemove_start},
+ {toRemove_start + len, d.end()}});
+ swap(copy);
}
return *this;
}
@@ -3120,29 +3503,40 @@ static void removeStringImpl(QString &s, const T &needle, Qt::CaseSensitivity cs
if (i < 0)
return;
- const auto beg = s.begin(); // detaches
- auto dst = beg + i;
- auto src = beg + i + needleSize;
- const auto end = s.end();
- // loop invariant: [beg, dst[ is partial result
- // [src, end[ still to be checked for needles
- while (src < end) {
- const auto i = s.indexOf(needle, src - beg, cs);
- const auto hit = i == -1 ? end : beg + i;
- const auto skipped = hit - src;
- memmove(dst, src, skipped * sizeof(QChar));
- dst += skipped;
- src = hit + needleSize;
+ QString::DataPointer &dptr = s.data_ptr();
+ auto begin = dptr.begin();
+ auto end = dptr.end();
+
+ auto copyFunc = [&](auto &dst) {
+ auto src = begin + i + needleSize;
+ while (src < end) {
+ i = s.indexOf(needle, std::distance(begin, src), cs);
+ auto hit = i == -1 ? end : begin + i;
+ dst = std::copy(src, hit, dst);
+ src = hit + needleSize;
+ }
+ return dst;
+ };
+
+ if (!dptr->needsDetach()) {
+ auto dst = begin + i;
+ dst = copyFunc(dst);
+ s.truncate(std::distance(begin, dst));
+ } else {
+ QString copy{s.size(), Qt::Uninitialized};
+ auto copy_begin = copy.begin();
+ auto dst = std::copy(begin, begin + i, copy_begin); // Chunk before the first hit
+ dst = copyFunc(dst);
+ copy.resize(std::distance(copy_begin, dst));
+ s.swap(copy);
}
- s.truncate(dst - beg);
}
/*!
Removes every occurrence of the given \a str string in this
string, and returns a reference to this string.
- If \a cs is Qt::CaseSensitive (default), the search is
- case sensitive; otherwise the search is case insensitive.
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
This is the same as \c replace(str, "", cs).
@@ -3153,7 +3547,7 @@ static void removeStringImpl(QString &s, const T &needle, Qt::CaseSensitivity cs
QString &QString::remove(const QString &str, Qt::CaseSensitivity cs)
{
const auto s = str.d.data();
- if (QtPrivate::q_points_into_range(s, d.data(), d.data() + d.size))
+ if (QtPrivate::q_points_into_range(s, d))
removeStringImpl(*this, QStringView{QVarLengthArray(s, s + str.size())}, cs);
else
removeStringImpl(*this, qToStringViewIgnoringNull(str), cs);
@@ -3164,11 +3558,10 @@ QString &QString::remove(const QString &str, Qt::CaseSensitivity cs)
\since 5.11
\overload
- Removes every occurrence of the given \a str string in this
- string, and returns a reference to this string.
+ Removes every occurrence of the given Latin-1 string viewed by \a str
+ from this string, and returns a reference to this string.
- If \a cs is Qt::CaseSensitive (default), the search is
- case sensitive; otherwise the search is case insensitive.
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
This is the same as \c replace(str, "", cs).
@@ -3176,18 +3569,50 @@ QString &QString::remove(const QString &str, Qt::CaseSensitivity cs)
\sa replace()
*/
-QString &QString::remove(QLatin1String str, Qt::CaseSensitivity cs)
+QString &QString::remove(QLatin1StringView str, Qt::CaseSensitivity cs)
{
removeStringImpl(*this, str, cs);
return *this;
}
/*!
+ \fn QString &QString::removeAt(qsizetype pos)
+
+ \since 6.5
+
+ Removes the character at index \a pos. If \a pos is out of bounds
+ (i.e. \a pos >= size()), this function does nothing.
+
+ \sa remove()
+*/
+
+/*!
+ \fn QString &QString::removeFirst()
+
+ \since 6.5
+
+ Removes the first character in this string. If the string is empty,
+ this function does nothing.
+
+ \sa remove()
+*/
+
+/*!
+ \fn QString &QString::removeLast()
+
+ \since 6.5
+
+ Removes the last character in this string. If the string is empty,
+ this function does nothing.
+
+ \sa remove()
+*/
+
+/*!
Removes every occurrence of the character \a ch in this string, and
returns a reference to this string.
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
Example:
@@ -3202,19 +3627,34 @@ QString &QString::remove(QLatin1String str, Qt::CaseSensitivity cs)
QString &QString::remove(QChar ch, Qt::CaseSensitivity cs)
{
const qsizetype idx = indexOf(ch, 0, cs);
- if (idx != -1) {
- const auto first = begin(); // implicit detach()
- auto last = end();
- if (cs == Qt::CaseSensitive) {
- last = std::remove(first + idx, last, ch);
- } else {
- const QChar c = ch.toCaseFolded();
- auto caseInsensEqual = [c](QChar x) {
- return c == x.toCaseFolded();
- };
- last = std::remove_if(first + idx, last, caseInsensEqual);
- }
- resize(last - first);
+ if (idx == -1)
+ return *this;
+
+ const bool isCase = cs == Qt::CaseSensitive;
+ ch = isCase ? ch : ch.toCaseFolded();
+ auto match = [ch, isCase](QChar x) {
+ return ch == (isCase ? x : x.toCaseFolded());
+ };
+
+
+ auto begin = d.begin();
+ auto first_match = begin + idx;
+ auto end = d.end();
+ if (!d->isShared()) {
+ auto it = std::remove_if(first_match, end, match);
+ d->erase(it, std::distance(it, end));
+ d.data()[d.size] = u'\0';
+ } else {
+ // Instead of detaching, create a new string and copy all characters except for
+ // the ones we're removing
+ // TODO: size() is more than the needed since "copy" would be shorter
+ QString copy{size(), Qt::Uninitialized};
+ auto dst = copy.d.begin();
+ auto it = std::copy(begin, first_match, dst); // Chunk before idx
+ it = std::remove_copy_if(first_match + 1, end, it, match);
+ copy.d.size = std::distance(dst, it);
+ copy.d.data()[copy.d.size] = u'\0';
+ *this = std::move(copy);
}
return *this;
}
@@ -3243,6 +3683,97 @@ QString &QString::remove(QChar ch, Qt::CaseSensitivity cs)
\sa remove()
*/
+
+/*! \internal
+ Instead of detaching, or reallocating if "before" is shorter than "after"
+ and there isn't enough capacity, create a new string, copy characters to it
+ as needed, then swap it with "str".
+*/
+static void replace_with_copy(QString &str, QSpan<size_t> indices, qsizetype blen,
+ QStringView after)
+{
+ const qsizetype alen = after.size();
+ const char16_t *after_b = after.utf16();
+
+ const QString::DataPointer &str_d = str.data_ptr();
+ auto src_start = str_d.begin();
+ const qsizetype newSize = str_d.size + indices.size() * (alen - blen);
+ QString copy{ newSize, Qt::Uninitialized };
+ QString::DataPointer &copy_d = copy.data_ptr();
+ auto dst = copy_d.begin();
+ for (size_t index : indices) {
+ auto hit = str_d.begin() + index;
+ dst = std::copy(src_start, hit, dst);
+ dst = std::copy_n(after_b, alen, dst);
+ src_start = hit + blen;
+ }
+ dst = std::copy(src_start, str_d.end(), dst);
+ str.swap(copy);
+}
+
+// No detaching or reallocation is needed
+static void replace_in_place(QString &str, QSpan<size_t> indices,
+ qsizetype blen, QStringView after)
+{
+ const qsizetype alen = after.size();
+ const char16_t *after_b = after.utf16();
+ const char16_t *after_e = after.utf16() + after.size();
+
+ if (blen == alen) { // Replace in place
+ for (size_t index : indices)
+ std::copy_n(after_b, alen, str.data_ptr().begin() + index);
+ } else if (blen > alen) { // Replace from front
+ char16_t *begin = str.data_ptr().begin();
+ char16_t *hit = begin + indices.front();
+ char16_t *to = hit;
+ to = std::copy_n(after_b, alen, to);
+ char16_t *movestart = hit + blen;
+ for (size_t index : indices.sliced(1)) {
+ hit = begin + index;
+ to = std::move(movestart, hit, to);
+ to = std::copy_n(after_b, alen, to);
+ movestart = hit + blen;
+ }
+ to = std::move(movestart, str.data_ptr().end(), to);
+ str.resize(std::distance(begin, to));
+ } else { // blen < alen, Replace from back
+ const qsizetype oldSize = str.data_ptr().size;
+ const qsizetype adjust = indices.size() * (alen - blen);
+ const qsizetype newSize = oldSize + adjust;
+
+ str.resize(newSize);
+ char16_t *begin = str.data_ptr().begin();
+ char16_t *moveend = begin + oldSize;
+ char16_t *to = str.data_ptr().end();
+
+ for (auto it = indices.rbegin(), end = indices.rend(); it != end; ++it) {
+ char16_t *hit = begin + *it;
+ char16_t *movestart = hit + blen;
+ to = std::move_backward(movestart, moveend, to);
+ to = std::copy_backward(after_b, after_e, to);
+ moveend = hit;
+ }
+ }
+}
+
+static void replace_helper(QString &str, QSpan<size_t> indices, qsizetype blen, QStringView after)
+{
+ const qsizetype oldSize = str.data_ptr().size;
+ const qsizetype adjust = indices.size() * (after.size() - blen);
+ const qsizetype newSize = oldSize + adjust;
+ if (str.data_ptr().needsDetach() || needsReallocate(str, newSize)) {
+ replace_with_copy(str, indices, blen, after);
+ return;
+ }
+
+ if (QtPrivate::q_points_into_range(after.begin(), str))
+ // Copy after if it lies inside our own d.b area (which we could
+ // possibly invalidate via a realloc or modify by replacement)
+ replace_in_place(str, indices, blen, QVarLengthArray(after.begin(), after.end()));
+ else
+ replace_in_place(str, indices, blen, after);
+}
+
/*!
\fn QString &QString::replace(qsizetype position, qsizetype n, const QString &after)
@@ -3261,17 +3792,17 @@ QString &QString::remove(QChar ch, Qt::CaseSensitivity cs)
*/
QString &QString::replace(qsizetype pos, qsizetype len, const QString &after)
{
- return replace(pos, len, after.constData(), after.length());
+ return replace(pos, len, after.constData(), after.size());
}
/*!
- \fn QString &QString::replace(qsizetype position, qsizetype n, const QChar *unicode, qsizetype size)
+ \fn QString &QString::replace(qsizetype position, qsizetype n, const QChar *after, qsizetype alen)
\overload replace()
Replaces \a n characters beginning at index \a position with the
- first \a size characters of the QChar array \a unicode and returns a
+ first \a alen characters of the QChar array \a after and returns a
reference to this string.
*/
-QString &QString::replace(qsizetype pos, qsizetype len, const QChar *unicode, qsizetype size)
+QString &QString::replace(qsizetype pos, qsizetype len, const QChar *after, qsizetype alen)
{
if (size_t(pos) > size_t(this->size()))
return *this;
@@ -3279,7 +3810,7 @@ QString &QString::replace(qsizetype pos, qsizetype len, const QChar *unicode, qs
len = this->size() - pos;
size_t index = pos;
- replace_helper(&index, 1, len, unicode, size);
+ replace_helper(*this, QSpan(&index, 1), len, QStringView{after, alen});
return *this;
}
@@ -3300,8 +3831,7 @@ QString &QString::replace(qsizetype pos, qsizetype len, QChar after)
Replaces every occurrence of the string \a before with the string \a
after and returns a reference to this string.
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
Example:
@@ -3318,90 +3848,6 @@ QString &QString::replace(const QString &before, const QString &after, Qt::CaseS
return replace(before.constData(), before.size(), after.constData(), after.size(), cs);
}
-namespace { // helpers for replace and its helper:
-QChar *textCopy(const QChar *start, qsizetype len)
-{
- const size_t size = len * sizeof(QChar);
- QChar *const copy = static_cast<QChar *>(::malloc(size));
- Q_CHECK_PTR(copy);
- ::memcpy(copy, start, size);
- return copy;
-}
-
-static bool pointsIntoRange(const QChar *ptr, const char16_t *base, qsizetype len)
-{
- const QChar *const start = reinterpret_cast<const QChar *>(base);
- const std::less<const QChar *> less;
- return !less(ptr, start) && less(ptr, start + len);
-}
-} // end namespace
-
-/*!
- \internal
- */
-void QString::replace_helper(size_t *indices, qsizetype nIndices, qsizetype blen, const QChar *after, qsizetype alen)
-{
- // Copy after if it lies inside our own d.b area (which we could
- // possibly invalidate via a realloc or modify by replacement).
- QChar *afterBuffer = nullptr;
- if (pointsIntoRange(after, d.data(), d.size)) // Use copy in place of vulnerable original:
- after = afterBuffer = textCopy(after, alen);
-
- QT_TRY {
- if (blen == alen) {
- // replace in place
- detach();
- for (qsizetype i = 0; i < nIndices; ++i)
- memcpy(d.data() + indices[i], after, alen * sizeof(QChar));
- } else if (alen < blen) {
- // replace from front
- detach();
- size_t to = indices[0];
- if (alen)
- memcpy(d.data()+to, after, alen*sizeof(QChar));
- to += alen;
- size_t movestart = indices[0] + blen;
- for (qsizetype i = 1; i < nIndices; ++i) {
- qsizetype msize = indices[i] - movestart;
- if (msize > 0) {
- memmove(d.data() + to, d.data() + movestart, msize * sizeof(QChar));
- to += msize;
- }
- if (alen) {
- memcpy(d.data() + to, after, alen * sizeof(QChar));
- to += alen;
- }
- movestart = indices[i] + blen;
- }
- qsizetype msize = d.size - movestart;
- if (msize > 0)
- memmove(d.data() + to, d.data() + movestart, msize * sizeof(QChar));
- resize(d.size - nIndices*(blen-alen));
- } else {
- // replace from back
- qsizetype adjust = nIndices*(alen-blen);
- qsizetype newLen = d.size + adjust;
- qsizetype moveend = d.size;
- resize(newLen);
-
- while (nIndices) {
- --nIndices;
- qsizetype movestart = indices[nIndices] + blen;
- qsizetype insertstart = indices[nIndices] + nIndices*(alen-blen);
- qsizetype moveto = insertstart + alen;
- memmove(d.data() + moveto, d.data() + movestart,
- (moveend - movestart)*sizeof(QChar));
- memcpy(d.data() + insertstart, after, alen * sizeof(QChar));
- moveend = movestart-blen;
- }
- }
- } QT_CATCH(const std::bad_alloc &) {
- ::free(afterBuffer);
- QT_RETHROW;
- }
- ::free(afterBuffer);
-}
-
/*!
\since 4.5
\overload replace()
@@ -3410,8 +3856,7 @@ void QString::replace_helper(size_t *indices, qsizetype nIndices, qsizetype blen
characters of \a before with the first \a alen characters of \a
after and returns a reference to this string.
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
*/
QString &QString::replace(const QChar *before, qsizetype blen,
const QChar *after, qsizetype alen,
@@ -3426,51 +3871,25 @@ QString &QString::replace(const QChar *before, qsizetype blen,
}
if (alen == 0 && blen == 0)
return *this;
+ if (alen == 1 && blen == 1)
+ return replace(*before, *after, cs);
QStringMatcher matcher(before, blen, cs);
- QChar *beforeBuffer = nullptr, *afterBuffer = nullptr;
qsizetype index = 0;
- while (1) {
- size_t indices[1024];
- size_t pos = 0;
- while (pos < 1024) {
- index = matcher.indexIn(*this, index);
- if (index == -1)
- break;
- indices[pos++] = index;
- if (blen) // Step over before:
- index += blen;
- else // Only count one instance of empty between any two characters:
- index++;
- }
- if (!pos) // Nothing to replace
- break;
-
- if (Q_UNLIKELY(index != -1)) {
- /*
- We're about to change data, that before and after might point
- into, and we'll need that data for our next batch of indices.
- */
- if (!afterBuffer && pointsIntoRange(after, d.data(), d.size))
- after = afterBuffer = textCopy(after, alen);
-
- if (!beforeBuffer && pointsIntoRange(before, d.data(), d.size)) {
- beforeBuffer = textCopy(before, blen);
- matcher = QStringMatcher(beforeBuffer, blen, cs);
- }
- }
-
- replace_helper(indices, pos, blen, after, alen);
- if (Q_LIKELY(index == -1)) // Nothing left to replace
- break;
- // The call to replace_helper just moved what index points at:
- index += pos*(alen-blen);
+ QVarLengthArray<size_t> indices;
+ while ((index = matcher.indexIn(*this, index)) != -1) {
+ indices.push_back(index);
+ if (blen) // Step over before:
+ index += blen;
+ else // Only count one instance of empty between any two characters:
+ index++;
}
- ::free(afterBuffer);
- ::free(beforeBuffer);
+ if (indices.isEmpty())
+ return *this;
+ replace_helper(*this, indices, blen, QStringView{after, alen});
return *this;
}
@@ -3479,8 +3898,7 @@ QString &QString::replace(const QChar *before, qsizetype blen,
Replaces every occurrence of the character \a ch in the string with
\a after and returns a reference to this string.
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
*/
QString& QString::replace(QChar ch, const QString &after, Qt::CaseSensitivity cs)
{
@@ -3493,35 +3911,27 @@ QString& QString::replace(QChar ch, const QString &after, Qt::CaseSensitivity cs
if (size() == 0)
return *this;
- char16_t cc = (cs == Qt::CaseSensitive ? ch.unicode() : ch.toCaseFolded().unicode());
+ const char16_t cc = (cs == Qt::CaseSensitive ? ch.unicode() : ch.toCaseFolded().unicode());
- qsizetype index = 0;
- while (1) {
- size_t indices[1024];
- size_t pos = 0;
- if (cs == Qt::CaseSensitive) {
- while (pos < 1024 && index < size()) {
- if (d.data()[index] == cc)
- indices[pos++] = index;
- index++;
- }
- } else {
- while (pos < 1024 && index < size()) {
- if (QChar::toCaseFolded(d.data()[index]) == cc)
- indices[pos++] = index;
- index++;
- }
+ QVarLengthArray<size_t> indices;
+ if (cs == Qt::CaseSensitive) {
+ const char16_t *begin = d.begin();
+ const char16_t *end = d.end();
+ QStringView view(begin, end);
+ const char16_t *hit = nullptr;
+ while ((hit = QtPrivate::qustrchr(view, cc)) != end) {
+ indices.push_back(std::distance(begin, hit));
+ view = QStringView(std::next(hit), end);
}
- if (!pos) // Nothing to replace
- break;
-
- replace_helper(indices, pos, 1, after.constData(), after.size());
-
- if (Q_LIKELY(index == size())) // Nothing left to replace
- break;
- // The call to replace_helper just moved what index points at:
- index += pos*(after.size() - 1);
+ } else {
+ for (qsizetype i = 0; i < d.size; ++i)
+ if (QChar::toCaseFolded(d.data()[i]) == cc)
+ indices.push_back(i);
}
+ if (indices.isEmpty())
+ return *this;
+
+ replace_helper(*this, indices, 1, after);
return *this;
}
@@ -3530,34 +3940,43 @@ QString& QString::replace(QChar ch, const QString &after, Qt::CaseSensitivity cs
Replaces every occurrence of the character \a before with the
character \a after and returns a reference to this string.
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
*/
QString& QString::replace(QChar before, QChar after, Qt::CaseSensitivity cs)
{
- if (d.size) {
- const qsizetype idx = indexOf(before, 0, cs);
- if (idx != -1) {
- detach();
- const char16_t a = after.unicode();
- char16_t *i = d.data();
- char16_t *const e = i + d.size;
- i += idx;
- *i = a;
- if (cs == Qt::CaseSensitive) {
- const char16_t b = before.unicode();
- while (++i != e) {
- if (*i == b)
- *i = a;
- }
- } else {
- const char16_t b = foldCase(before.unicode());
- while (++i != e) {
- if (foldCase(*i) == b)
- *i = a;
- }
- }
+ const qsizetype idx = indexOf(before, 0, cs);
+ if (idx == -1)
+ return *this;
+
+ const char16_t achar = after.unicode();
+ char16_t bchar = before.unicode();
+
+ auto matchesCIS = [](char16_t beforeChar) {
+ return [beforeChar](char16_t ch) { return foldAndCompare(ch, beforeChar); };
+ };
+
+ auto hit = d.begin() + idx;
+ if (!d.needsDetach()) {
+ *hit++ = achar;
+ if (cs == Qt::CaseSensitive) {
+ std::replace(hit, d.end(), bchar, achar);
+ } else {
+ bchar = foldCase(bchar);
+ std::replace_if(hit, d.end(), matchesCIS(bchar), achar);
+ }
+ } else {
+ QString other{ d.size, Qt::Uninitialized };
+ auto dest = std::copy(d.begin(), hit, other.d.begin());
+ *dest++ = achar;
+ ++hit;
+ if (cs == Qt::CaseSensitive) {
+ std::replace_copy(hit, d.end(), dest, bchar, achar);
+ } else {
+ bchar = foldCase(bchar);
+ std::replace_copy_if(hit, d.end(), dest, matchesCIS(bchar), achar);
}
+
+ swap(other);
}
return *this;
}
@@ -3566,22 +3985,23 @@ QString& QString::replace(QChar before, QChar after, Qt::CaseSensitivity cs)
\since 4.5
\overload replace()
- Replaces every occurrence of the string \a before with the string \a
- after and returns a reference to this string.
+ Replaces every occurrence in this string of the Latin-1 string viewed
+ by \a before with the Latin-1 string viewed by \a after, and returns a
+ reference to this string.
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
\note The text is not rescanned after a replacement.
*/
-QString &QString::replace(QLatin1String before, QLatin1String after, Qt::CaseSensitivity cs)
+QString &QString::replace(QLatin1StringView before, QLatin1StringView after, Qt::CaseSensitivity cs)
{
- qsizetype alen = after.size();
- qsizetype blen = before.size();
- QVarLengthArray<char16_t> a(alen);
- QVarLengthArray<char16_t> b(blen);
- qt_from_latin1(a.data(), after.latin1(), alen);
- qt_from_latin1(b.data(), before.latin1(), blen);
+ const qsizetype alen = after.size();
+ const qsizetype blen = before.size();
+ if (blen == 1 && alen == 1)
+ return replace(before.front(), after.front(), cs);
+
+ QVarLengthArray<char16_t> a = qt_from_latin1_to_qvla(after);
+ QVarLengthArray<char16_t> b = qt_from_latin1_to_qvla(before);
return replace((const QChar *)b.data(), blen, (const QChar *)a.data(), alen, cs);
}
@@ -3589,19 +4009,21 @@ QString &QString::replace(QLatin1String before, QLatin1String after, Qt::CaseSen
\since 4.5
\overload replace()
- Replaces every occurrence of the string \a before with the string \a
- after and returns a reference to this string.
+ Replaces every occurrence in this string of the Latin-1 string viewed
+ by \a before with the string \a after, and returns a reference to this
+ string.
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
\note The text is not rescanned after a replacement.
*/
-QString &QString::replace(QLatin1String before, const QString &after, Qt::CaseSensitivity cs)
+QString &QString::replace(QLatin1StringView before, const QString &after, Qt::CaseSensitivity cs)
{
- qsizetype blen = before.size();
- QVarLengthArray<char16_t> b(blen);
- qt_from_latin1(b.data(), before.latin1(), blen);
+ const qsizetype blen = before.size();
+ if (blen == 1 && after.size() == 1)
+ return replace(before.front(), after.front(), cs);
+
+ QVarLengthArray<char16_t> b = qt_from_latin1_to_qvla(before);
return replace((const QChar *)b.data(), blen, after.constData(), after.d.size, cs);
}
@@ -3612,16 +4034,17 @@ QString &QString::replace(QLatin1String before, const QString &after, Qt::CaseSe
Replaces every occurrence of the string \a before with the string \a
after and returns a reference to this string.
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
\note The text is not rescanned after a replacement.
*/
-QString &QString::replace(const QString &before, QLatin1String after, Qt::CaseSensitivity cs)
+QString &QString::replace(const QString &before, QLatin1StringView after, Qt::CaseSensitivity cs)
{
- qsizetype alen = after.size();
- QVarLengthArray<char16_t> a(alen);
- qt_from_latin1(a.data(), after.latin1(), alen);
+ const qsizetype alen = after.size();
+ if (before.size() == 1 && alen == 1)
+ return replace(before.front(), after.front(), cs);
+
+ QVarLengthArray<char16_t> a = qt_from_latin1_to_qvla(after);
return replace(before.constData(), before.d.size, (const QChar *)a.data(), alen, cs);
}
@@ -3632,70 +4055,70 @@ QString &QString::replace(const QString &before, QLatin1String after, Qt::CaseSe
Replaces every occurrence of the character \a c with the string \a
after and returns a reference to this string.
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
\note The text is not rescanned after a replacement.
*/
-QString &QString::replace(QChar c, QLatin1String after, Qt::CaseSensitivity cs)
+QString &QString::replace(QChar c, QLatin1StringView after, Qt::CaseSensitivity cs)
{
- qsizetype alen = after.size();
- QVarLengthArray<char16_t> a(alen);
- qt_from_latin1(a.data(), after.latin1(), alen);
+ const qsizetype alen = after.size();
+ if (alen == 1)
+ return replace(c, after.front(), cs);
+
+ QVarLengthArray<char16_t> a = qt_from_latin1_to_qvla(after);
return replace(&c, 1, (const QChar *)a.data(), alen, cs);
}
-
/*!
- \fn bool QString::operator==(const QString &s1, const QString &s2)
+ \fn bool QString::operator==(const QString &lhs, const QString &rhs)
\overload operator==()
- Returns \c true if string \a s1 is equal to string \a s2; otherwise
+ Returns \c true if string \a lhs is equal to string \a rhs; otherwise
returns \c false.
+ \include qstring.cpp compare-isNull-vs-isEmpty
+
\sa {Comparing Strings}
*/
/*!
- \fn bool QString::operator==(const QString &s1, QLatin1String s2)
+ \fn bool QString::operator==(const QString &lhs, const QLatin1StringView &rhs)
\overload operator==()
- Returns \c true if \a s1 is equal to \a s2; otherwise
+ Returns \c true if \a lhs is equal to \a rhs; otherwise
returns \c false.
*/
/*!
- \fn bool QString::operator==(QLatin1String s1, const QString &s2)
+ \fn bool QString::operator==(const QLatin1StringView &lhs, const QString &rhs)
\overload operator==()
- Returns \c true if \a s1 is equal to \a s2; otherwise
+ Returns \c true if \a lhs is equal to \a rhs; otherwise
returns \c false.
*/
-/*! \fn bool QString::operator==(const QByteArray &other) const
+/*! \fn bool QString::operator==(const QString &lhs, const QByteArray &rhs)
\overload operator==()
- The \a other byte array is converted to a QString using the
- fromUtf8() function.
+ The \a rhs byte array is converted to a QUtf8StringView.
You can disable this operator by defining
\l QT_NO_CAST_FROM_ASCII when you compile your applications. This
can be useful if you want to ensure that all user-visible strings
go through QObject::tr(), for example.
- Returns \c true if this string is lexically equal to the parameter
- string \a other. Otherwise returns \c false.
+ Returns \c true if string \a lhs is lexically equal to \a rhs.
+ Otherwise returns \c false.
*/
-/*! \fn bool QString::operator==(const char *other) const
+/*! \fn bool QString::operator==(const QString &lhs, const char * const &rhs)
\overload operator==()
- The \a other const char pointer is converted to a QString using
- the fromUtf8() function.
+ The \a rhs const char pointer is converted to a QUtf8StringView.
You can disable this operator by defining
\l QT_NO_CAST_FROM_ASCII when you compile your applications. This
@@ -3704,41 +4127,41 @@ QString &QString::replace(QChar c, QLatin1String after, Qt::CaseSensitivity cs)
*/
/*!
- \fn bool QString::operator<(const QString &s1, const QString &s2)
+ \fn bool QString::operator<(const QString &lhs, const QString &rhs)
\overload operator<()
- Returns \c true if string \a s1 is lexically less than string
- \a s2; otherwise returns \c false.
+ Returns \c true if string \a lhs is lexically less than string
+ \a rhs; otherwise returns \c false.
\sa {Comparing Strings}
*/
/*!
- \fn bool QString::operator<(const QString &s1, QLatin1String s2)
+ \fn bool QString::operator<(const QString &lhs, const QLatin1StringView &rhs)
\overload operator<()
- Returns \c true if \a s1 is lexically less than \a s2;
+ Returns \c true if \a lhs is lexically less than \a rhs;
otherwise returns \c false.
*/
/*!
- \fn bool QString::operator<(QLatin1String s1, const QString &s2)
+ \fn bool QString::operator<(const QLatin1StringView &lhs, const QString &rhs)
\overload operator<()
- Returns \c true if \a s1 is lexically less than \a s2;
+ Returns \c true if \a lhs is lexically less than \a rhs;
otherwise returns \c false.
*/
-/*! \fn bool QString::operator<(const QByteArray &other) const
+/*! \fn bool QString::operator<(const QString &lhs, const QByteArray &rhs)
\overload operator<()
- The \a other byte array is converted to a QString using the
- fromUtf8() function. If any NUL characters ('\\0') are embedded
- in the byte array, they will be included in the transformation.
+ The \a rhs byte array is converted to a QUtf8StringView.
+ If any NUL characters ('\\0') are embedded in the byte array, they will be
+ included in the transformation.
You can disable this operator
\l QT_NO_CAST_FROM_ASCII when you compile your applications. This
@@ -3746,15 +4169,14 @@ QString &QString::replace(QChar c, QLatin1String after, Qt::CaseSensitivity cs)
go through QObject::tr(), for example.
*/
-/*! \fn bool QString::operator<(const char *other) const
+/*! \fn bool QString::operator<(const QString &lhs, const char * const &rhs)
- Returns \c true if this string is lexically less than string \a other.
+ Returns \c true if string \a lhs is lexically less than string \a rhs.
Otherwise returns \c false.
\overload operator<()
- The \a other const char pointer is converted to a QString using
- the fromUtf8() function.
+ The \a rhs const char pointer is converted to a QUtf8StringView.
You can disable this operator by defining
\l QT_NO_CAST_FROM_ASCII when you compile your applications. This
@@ -3762,39 +4184,39 @@ QString &QString::replace(QChar c, QLatin1String after, Qt::CaseSensitivity cs)
go through QObject::tr(), for example.
*/
-/*! \fn bool QString::operator<=(const QString &s1, const QString &s2)
+/*! \fn bool QString::operator<=(const QString &lhs, const QString &rhs)
- Returns \c true if string \a s1 is lexically less than or equal to
- string \a s2; otherwise returns \c false.
+ Returns \c true if string \a lhs is lexically less than or equal to
+ string \a rhs; otherwise returns \c false.
\sa {Comparing Strings}
*/
/*!
- \fn bool QString::operator<=(const QString &s1, QLatin1String s2)
+ \fn bool QString::operator<=(const QString &lhs, const QLatin1StringView &rhs)
\overload operator<=()
- Returns \c true if \a s1 is lexically less than or equal to \a s2;
+ Returns \c true if \a lhs is lexically less than or equal to \a rhs;
otherwise returns \c false.
*/
/*!
- \fn bool QString::operator<=(QLatin1String s1, const QString &s2)
+ \fn bool QString::operator<=(const QLatin1StringView &lhs, const QString &rhs)
\overload operator<=()
- Returns \c true if \a s1 is lexically less than or equal to \a s2;
+ Returns \c true if \a lhs is lexically less than or equal to \a rhs;
otherwise returns \c false.
*/
-/*! \fn bool QString::operator<=(const QByteArray &other) const
+/*! \fn bool QString::operator<=(const QString &lhs, const QByteArray &rhs)
\overload operator<=()
- The \a other byte array is converted to a QString using the
- fromUtf8() function. If any NUL characters ('\\0') are embedded
- in the byte array, they will be included in the transformation.
+ The \a rhs byte array is converted to a QUtf8StringView.
+ If any NUL characters ('\\0') are embedded in the byte array, they will be
+ included in the transformation.
You can disable this operator by defining
\l QT_NO_CAST_FROM_ASCII when you compile your applications. This
@@ -3802,12 +4224,11 @@ QString &QString::replace(QChar c, QLatin1String after, Qt::CaseSensitivity cs)
go through QObject::tr(), for example.
*/
-/*! \fn bool QString::operator<=(const char *other) const
+/*! \fn bool QString::operator<=(const QString &lhs, const char * const &rhs)
\overload operator<=()
- The \a other const char pointer is converted to a QString using
- the fromUtf8() function.
+ The \a rhs const char pointer is converted to a QUtf8StringView.
You can disable this operator by defining
\l QT_NO_CAST_FROM_ASCII when you compile your applications. This
@@ -3815,39 +4236,39 @@ QString &QString::replace(QChar c, QLatin1String after, Qt::CaseSensitivity cs)
go through QObject::tr(), for example.
*/
-/*! \fn bool QString::operator>(const QString &s1, const QString &s2)
+/*! \fn bool QString::operator>(const QString &lhs, const QString &rhs)
- Returns \c true if string \a s1 is lexically greater than string \a s2;
+ Returns \c true if string \a lhs is lexically greater than string \a rhs;
otherwise returns \c false.
\sa {Comparing Strings}
*/
/*!
- \fn bool QString::operator>(const QString &s1, QLatin1String s2)
+ \fn bool QString::operator>(const QString &lhs, const QLatin1StringView &rhs)
\overload operator>()
- Returns \c true if \a s1 is lexically greater than \a s2;
+ Returns \c true if \a lhs is lexically greater than \a rhs;
otherwise returns \c false.
*/
/*!
- \fn bool QString::operator>(QLatin1String s1, const QString &s2)
+ \fn bool QString::operator>(const QLatin1StringView &lhs, const QString &rhs)
\overload operator>()
- Returns \c true if \a s1 is lexically greater than \a s2;
+ Returns \c true if \a lhs is lexically greater than \a rhs;
otherwise returns \c false.
*/
-/*! \fn bool QString::operator>(const QByteArray &other) const
+/*! \fn bool QString::operator>(const QString &lhs, const QByteArray &rhs)
\overload operator>()
- The \a other byte array is converted to a QString using the
- fromUtf8() function. If any NUL characters ('\\0') are embedded
- in the byte array, they will be included in the transformation.
+ The \a rhs byte array is converted to a QUtf8StringView.
+ If any NUL characters ('\\0') are embedded in the byte array, they will be
+ included in the transformation.
You can disable this operator by defining
\l QT_NO_CAST_FROM_ASCII when you compile your applications. This
@@ -3855,12 +4276,11 @@ QString &QString::replace(QChar c, QLatin1String after, Qt::CaseSensitivity cs)
go through QObject::tr(), for example.
*/
-/*! \fn bool QString::operator>(const char *other) const
+/*! \fn bool QString::operator>(const QString &lhs, const char * const &rhs)
\overload operator>()
- The \a other const char pointer is converted to a QString using
- the fromUtf8() function.
+ The \a rhs const char pointer is converted to a QUtf8StringView.
You can disable this operator by defining \l QT_NO_CAST_FROM_ASCII
when you compile your applications. This can be useful if you want
@@ -3868,39 +4288,39 @@ QString &QString::replace(QChar c, QLatin1String after, Qt::CaseSensitivity cs)
for example.
*/
-/*! \fn bool QString::operator>=(const QString &s1, const QString &s2)
+/*! \fn bool QString::operator>=(const QString &lhs, const QString &rhs)
- Returns \c true if string \a s1 is lexically greater than or equal to
- string \a s2; otherwise returns \c false.
+ Returns \c true if string \a lhs is lexically greater than or equal to
+ string \a rhs; otherwise returns \c false.
\sa {Comparing Strings}
*/
/*!
- \fn bool QString::operator>=(const QString &s1, QLatin1String s2)
+ \fn bool QString::operator>=(const QString &lhs, const QLatin1StringView &rhs)
\overload operator>=()
- Returns \c true if \a s1 is lexically greater than or equal to \a s2;
+ Returns \c true if \a lhs is lexically greater than or equal to \a rhs;
otherwise returns \c false.
*/
/*!
- \fn bool QString::operator>=(QLatin1String s1, const QString &s2)
+ \fn bool QString::operator>=(const QLatin1StringView &lhs, const QString &rhs)
\overload operator>=()
- Returns \c true if \a s1 is lexically greater than or equal to \a s2;
+ Returns \c true if \a lhs is lexically greater than or equal to \a rhs;
otherwise returns \c false.
*/
-/*! \fn bool QString::operator>=(const QByteArray &other) const
+/*! \fn bool QString::operator>=(const QString &lhs, const QByteArray &rhs)
\overload operator>=()
- The \a other byte array is converted to a QString using the
- fromUtf8() function. If any NUL characters ('\\0') are embedded in
- the byte array, they will be included in the transformation.
+ The \a rhs byte array is converted to a QUtf8StringView.
+ If any NUL characters ('\\0') are embedded in the byte array, they will be
+ included in the transformation.
You can disable this operator by defining \l QT_NO_CAST_FROM_ASCII
when you compile your applications. This can be useful if you want
@@ -3908,12 +4328,11 @@ QString &QString::replace(QChar c, QLatin1String after, Qt::CaseSensitivity cs)
for example.
*/
-/*! \fn bool QString::operator>=(const char *other) const
+/*! \fn bool QString::operator>=(const QString &lhs, const char * const &rhs)
\overload operator>=()
- The \a other const char pointer is converted to a QString using
- the fromUtf8() function.
+ The \a rhs const char pointer is converted to a QUtf8StringView.
You can disable this operator by defining \l QT_NO_CAST_FROM_ASCII
when you compile your applications. This can be useful if you want
@@ -3921,29 +4340,29 @@ QString &QString::replace(QChar c, QLatin1String after, Qt::CaseSensitivity cs)
for example.
*/
-/*! \fn bool QString::operator!=(const QString &s1, const QString &s2)
+/*! \fn bool QString::operator!=(const QString &lhs, const QString &rhs)
- Returns \c true if string \a s1 is not equal to string \a s2;
+ Returns \c true if string \a lhs is not equal to string \a rhs;
otherwise returns \c false.
\sa {Comparing Strings}
*/
-/*! \fn bool QString::operator!=(const QString &s1, QLatin1String s2)
+/*! \fn bool QString::operator!=(const QString &lhs, const QLatin1StringView &rhs)
- Returns \c true if string \a s1 is not equal to string \a s2.
+ Returns \c true if string \a lhs is not equal to string \a rhs.
Otherwise returns \c false.
\overload operator!=()
*/
-/*! \fn bool QString::operator!=(const QByteArray &other) const
+/*! \fn bool QString::operator!=(const QString &lhs, const QByteArray &rhs)
\overload operator!=()
- The \a other byte array is converted to a QString using the
- fromUtf8() function. If any NUL characters ('\\0') are embedded
- in the byte array, they will be included in the transformation.
+ The \a rhs byte array is converted to a QUtf8StringView.
+ If any NUL characters ('\\0') are embedded in the byte array, they will be
+ included in the transformation.
You can disable this operator by defining \l QT_NO_CAST_FROM_ASCII
when you compile your applications. This can be useful if you want
@@ -3951,12 +4370,11 @@ QString &QString::replace(QChar c, QLatin1String after, Qt::CaseSensitivity cs)
for example.
*/
-/*! \fn bool QString::operator!=(const char *other) const
+/*! \fn bool QString::operator!=(const QString &lhs, const char * const &rhs)
\overload operator!=()
- The \a other const char pointer is converted to a QString using
- the fromUtf8() function.
+ The \a rhs const char pointer is converted to a QUtf8StringView.
You can disable this operator by defining
\l QT_NO_CAST_FROM_ASCII when you compile your applications. This
@@ -3964,94 +4382,158 @@ QString &QString::replace(QChar c, QLatin1String after, Qt::CaseSensitivity cs)
go through QObject::tr(), for example.
*/
-#if QT_STRINGVIEW_LEVEL < 2
+/*! \fn bool QString::operator==(const QByteArray &lhs, const QString &rhs)
+
+ Returns \c true if byte array \a lhs is equal to the UTF-8 encoding of
+ \a rhs; otherwise returns \c false.
+
+ The comparison is case sensitive.
+
+ You can disable this operator by defining \c
+ QT_NO_CAST_FROM_ASCII when you compile your applications. You
+ then need to call QString::fromUtf8(), QString::fromLatin1(),
+ or QString::fromLocal8Bit() explicitly if you want to convert the byte
+ array to a QString before doing the comparison.
+*/
+
+/*! \fn bool QString::operator!=(const QByteArray &lhs, const QString &rhs)
+
+ Returns \c true if byte array \a lhs is not equal to the UTF-8 encoding of
+ \a rhs; otherwise returns \c false.
+
+ The comparison is case sensitive.
+
+ You can disable this operator by defining \c
+ QT_NO_CAST_FROM_ASCII when you compile your applications. You
+ then need to call QString::fromUtf8(), QString::fromLatin1(),
+ or QString::fromLocal8Bit() explicitly if you want to convert the byte
+ array to a QString before doing the comparison.
+*/
+
+/*! \fn bool QString::operator<(const QByteArray &lhs, const QString &rhs)
+
+ Returns \c true if byte array \a lhs is lexically less than the UTF-8 encoding
+ of \a rhs; otherwise returns \c false.
+
+ The comparison is case sensitive.
+
+ You can disable this operator by defining \c
+ QT_NO_CAST_FROM_ASCII when you compile your applications. You
+ then need to call QString::fromUtf8(), QString::fromLatin1(),
+ or QString::fromLocal8Bit() explicitly if you want to convert the byte
+ array to a QString before doing the comparison.
+*/
+
+/*! \fn bool QString::operator>(const QByteArray &lhs, const QString &rhs)
+
+ Returns \c true if byte array \a lhs is lexically greater than the UTF-8
+ encoding of \a rhs; otherwise returns \c false.
+
+ The comparison is case sensitive.
+
+ You can disable this operator by defining \c
+ QT_NO_CAST_FROM_ASCII when you compile your applications. You
+ then need to call QString::fromUtf8(), QString::fromLatin1(),
+ or QString::fromLocal8Bit() explicitly if you want to convert the byte
+ array to a QString before doing the comparison.
+*/
+
+/*! \fn bool QString::operator<=(const QByteArray &lhs, const QString &rhs)
+
+ Returns \c true if byte array \a lhs is lexically less than or equal to the
+ UTF-8 encoding of \a rhs; otherwise returns \c false.
+
+ The comparison is case sensitive.
+
+ You can disable this operator by defining \c
+ QT_NO_CAST_FROM_ASCII when you compile your applications. You
+ then need to call QString::fromUtf8(), QString::fromLatin1(),
+ or QString::fromLocal8Bit() explicitly if you want to convert the byte
+ array to a QString before doing the comparison.
+*/
+
+/*! \fn bool QString::operator>=(const QByteArray &lhs, const QString &rhs)
+
+ Returns \c true if byte array \a lhs is greater than or equal to the UTF-8
+ encoding of \a rhs; otherwise returns \c false.
+
+ The comparison is case sensitive.
+
+ You can disable this operator by defining \c
+ QT_NO_CAST_FROM_ASCII when you compile your applications. You
+ then need to call QString::fromUtf8(), QString::fromLatin1(),
+ or QString::fromLocal8Bit() explicitly if you want to convert the byte
+ array to a QString before doing the comparison.
+*/
+
/*!
- Returns the index position of the first occurrence of the string \a
- str in this string, searching forward from index position \a
- from. Returns -1 if \a str is not found.
+ \include qstring.qdocinc {qstring-first-index-of} {string} {str}
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
Example:
\snippet qstring/main.cpp 24
- If \a from is -1, the search starts at the last character; if it is
- -2, at the next to last character and so on.
+ \include qstring.qdocinc negative-index-start-search-from-end
\sa lastIndexOf(), contains(), count()
*/
qsizetype QString::indexOf(const QString &str, qsizetype from, Qt::CaseSensitivity cs) const
{
- return QtPrivate::findString(QStringView(unicode(), length()), from, QStringView(str.unicode(), str.length()), cs);
+ return QtPrivate::findString(QStringView(unicode(), size()), from, QStringView(str.unicode(), str.size()), cs);
}
-#endif // QT_STRINGVIEW_LEVEL < 2
/*!
\fn qsizetype QString::indexOf(QStringView str, qsizetype from, Qt::CaseSensitivity cs) const
\since 5.14
\overload indexOf()
- Returns the index position of the first occurrence of the string view \a str
- in this string, searching forward from index position \a from.
- Returns -1 if \a str is not found.
+ \include qstring.qdocinc {qstring-first-index-of} {string view} {str}
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
- If \a from is -1, the search starts at the last character; if it is
- -2, at the next to last character and so on.
+ \include qstring.qdocinc negative-index-start-search-from-end
\sa QStringView::indexOf(), lastIndexOf(), contains(), count()
*/
/*!
\since 4.5
- Returns the index position of the first occurrence of the string \a
- str in this string, searching forward from index position \a
- from. Returns -1 if \a str is not found.
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
+ \include {qstring.qdocinc} {qstring-first-index-of} {Latin-1 string viewed by} {str}
+
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
Example:
\snippet qstring/main.cpp 24
- If \a from is -1, the search starts at the last character; if it is
- -2, at the next to last character and so on.
+ \include qstring.qdocinc negative-index-start-search-from-end
\sa lastIndexOf(), contains(), count()
*/
-qsizetype QString::indexOf(QLatin1String str, qsizetype from, Qt::CaseSensitivity cs) const
+qsizetype QString::indexOf(QLatin1StringView str, qsizetype from, Qt::CaseSensitivity cs) const
{
return QtPrivate::findString(QStringView(unicode(), size()), from, str, cs);
}
/*!
+ \fn qsizetype QString::indexOf(QChar ch, qsizetype from, Qt::CaseSensitivity cs) const
\overload indexOf()
- Returns the index position of the first occurrence of the
- character \a ch in the string, searching forward from index
- position \a from. Returns -1 if \a ch could not be found.
+ \include qstring.qdocinc {qstring-first-index-of} {character} {ch}
*/
-qsizetype QString::indexOf(QChar ch, qsizetype from, Qt::CaseSensitivity cs) const
-{
- return qFindChar(QStringView(unicode(), length()), ch, from, cs);
-}
-#if QT_STRINGVIEW_LEVEL < 2
/*!
- Returns the index position of the last occurrence of the string \a
- str in this string, searching backward from index position \a
- from. If \a from is -1, the search starts at the last
- character; if \a from is -2, at the next to last character and so
- on. Returns -1 if \a str is not found.
+ \include qstring.qdocinc {qstring-last-index-of} {string} {str}
+
+ \include qstring.qdocinc negative-index-start-search-from-end
+
+ Returns -1 if \a str is not found.
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
Example:
@@ -4079,8 +4561,7 @@ qsizetype QString::lastIndexOf(const QString &str, qsizetype from, Qt::CaseSensi
Returns the index position of the last occurrence of the string \a
str in this string. Returns -1 if \a str is not found.
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
Example:
@@ -4089,20 +4570,18 @@ qsizetype QString::lastIndexOf(const QString &str, qsizetype from, Qt::CaseSensi
\sa indexOf(), contains(), count()
*/
-#endif // QT_STRINGVIEW_LEVEL < 2
/*!
\since 4.5
\overload lastIndexOf()
- Returns the index position of the last occurrence of the string \a
- str in this string, searching backward from index position \a
- from. If \a from is -1, the search starts at the last
- character; if \a from is -2, at the next to last character and so
- on. Returns -1 if \a str is not found.
+ \include qstring.qdocinc {qstring-last-index-of} {Latin-1 string viewed by} {str}
+
+ \include qstring.qdocinc negative-index-start-search-from-end
+
+ Returns -1 if \a str is not found.
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
Example:
@@ -4117,21 +4596,20 @@ qsizetype QString::lastIndexOf(const QString &str, qsizetype from, Qt::CaseSensi
\sa indexOf(), contains(), count()
*/
-qsizetype QString::lastIndexOf(QLatin1String str, qsizetype from, Qt::CaseSensitivity cs) const
+qsizetype QString::lastIndexOf(QLatin1StringView str, qsizetype from, Qt::CaseSensitivity cs) const
{
return QtPrivate::lastIndexOf(*this, from, str, cs);
}
/*!
- \fn qsizetype QString::lastIndexOf(QLatin1String str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
+ \fn qsizetype QString::lastIndexOf(QLatin1StringView str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
\since 6.2
\overload lastIndexOf()
Returns the index position of the last occurrence of the string \a
str in this string. Returns -1 if \a str is not found.
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
Example:
@@ -4141,15 +4619,11 @@ qsizetype QString::lastIndexOf(QLatin1String str, qsizetype from, Qt::CaseSensit
*/
/*!
+ \fn qsizetype QString::lastIndexOf(QChar ch, qsizetype from, Qt::CaseSensitivity cs) const
\overload lastIndexOf()
- Returns the index position of the last occurrence of the character
- \a ch, searching backward from position \a from.
+ \include qstring.qdocinc {qstring-last-index-of} {character} {ch}
*/
-qsizetype QString::lastIndexOf(QChar ch, qsizetype from, Qt::CaseSensitivity cs) const
-{
- return qLastIndexOf(QStringView(*this), ch, from, cs);
-}
/*!
\fn QString::lastIndexOf(QChar ch, Qt::CaseSensitivity) const
@@ -4162,14 +4636,13 @@ qsizetype QString::lastIndexOf(QChar ch, qsizetype from, Qt::CaseSensitivity cs)
\since 5.14
\overload lastIndexOf()
- Returns the index position of the last occurrence of the string view \a
- str in this string, searching backward from index position \a
- from. If \a from is -1, the search starts at the last
- character; if \a from is -2, at the next to last character and so
- on. Returns -1 if \a str is not found.
+ \include qstring.qdocinc {qstring-last-index-of} {string view} {str}
+
+ \include qstring.qdocinc negative-index-start-search-from-end
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
+ Returns -1 if \a str is not found.
+
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
\note When searching for a 0-length \a str, the match at the end of
the data is excluded from the search by a negative \a from, even
@@ -4189,8 +4662,7 @@ qsizetype QString::lastIndexOf(QChar ch, qsizetype from, Qt::CaseSensitivity cs)
Returns the index position of the last occurrence of the string view \a
str in this string. Returns -1 if \a str is not found.
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
\sa indexOf(), contains(), count()
*/
@@ -4225,7 +4697,7 @@ Q_DECLARE_TYPEINFO(QStringCapture, Q_PRIMITIVE_TYPE);
QString &QString::replace(const QRegularExpression &re, const QString &after)
{
if (!re.isValid()) {
- qWarning("QString::replace: invalid QRegularExpression object");
+ qtWarnAboutInvalidRegularExpression(re.pattern(), "QString::replace");
return *this;
}
@@ -4240,12 +4712,12 @@ QString &QString::replace(const QRegularExpression &re, const QString &after)
// 1. build the backreferences list, holding where the backreferences
// are in the replacement string
- QList<QStringCapture> backReferences;
- const qsizetype al = after.length();
+ QVarLengthArray<QStringCapture> backReferences;
+ const qsizetype al = after.size();
const QChar *ac = after.unicode();
for (qsizetype i = 0; i < al - 1; i++) {
- if (ac[i] == QLatin1Char('\\')) {
+ if (ac[i] == u'\\') {
int no = ac[i + 1].digitValue();
if (no > 0 && no <= numCaptures) {
QStringCapture backReference;
@@ -4272,7 +4744,7 @@ QString &QString::replace(const QRegularExpression &re, const QString &after)
qsizetype newLength = 0; // length of the new string, with all the replacements
qsizetype lastEnd = 0;
- QList<QStringView> chunks;
+ QVarLengthArray<QStringView> chunks;
const QStringView copyView{ copy }, afterView{ after };
while (iterator.hasNext()) {
QRegularExpressionMatch match = iterator.next();
@@ -4286,7 +4758,7 @@ QString &QString::replace(const QRegularExpression &re, const QString &after)
lastEnd = 0;
// add the after string, with replacements for the backreferences
- for (const QStringCapture &backReference : qAsConst(backReferences)) {
+ for (const QStringCapture &backReference : std::as_const(backReferences)) {
// part of "after" before the backreference
len = backReference.pos - lastEnd;
if (len > 0) {
@@ -4305,7 +4777,7 @@ QString &QString::replace(const QRegularExpression &re, const QString &after)
}
// add the last part of the after string
- len = afterView.length() - lastEnd;
+ len = afterView.size() - lastEnd;
if (len > 0) {
chunks << afterView.mid(lastEnd, len);
newLength += len;
@@ -4315,17 +4787,17 @@ QString &QString::replace(const QRegularExpression &re, const QString &after)
}
// 3. trailing string after the last match
- if (copyView.length() > lastEnd) {
+ if (copyView.size() > lastEnd) {
chunks << copyView.mid(lastEnd);
- newLength += copyView.length() - lastEnd;
+ newLength += copyView.size() - lastEnd;
}
// 4. assemble the chunks together
resize(newLength);
qsizetype i = 0;
QChar *uc = data();
- for (const QStringView &chunk : qAsConst(chunks)) {
- qsizetype len = chunk.length();
+ for (const QStringView &chunk : std::as_const(chunks)) {
+ qsizetype len = chunk.size();
memcpy(uc + i, chunk.constData(), len * sizeof(QChar));
i += len;
}
@@ -4338,8 +4810,7 @@ QString &QString::replace(const QRegularExpression &re, const QString &after)
Returns the number of (potentially overlapping) occurrences of
the string \a str in this string.
- If \a cs is Qt::CaseSensitive (default), the search is
- case sensitive; otherwise the search is case insensitive.
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
\sa contains(), indexOf()
*/
@@ -4354,8 +4825,7 @@ qsizetype QString::count(const QString &str, Qt::CaseSensitivity cs) const
Returns the number of occurrences of character \a ch in the string.
- If \a cs is Qt::CaseSensitive (default), the search is
- case sensitive; otherwise the search is case insensitive.
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
\sa contains(), indexOf()
*/
@@ -4371,8 +4841,7 @@ qsizetype QString::count(QChar ch, Qt::CaseSensitivity cs) const
Returns the number of (potentially overlapping) occurrences of the
string view \a str in this string.
- If \a cs is Qt::CaseSensitive (default), the search is
- case sensitive; otherwise the search is case insensitive.
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
\sa contains(), indexOf()
*/
@@ -4381,23 +4850,20 @@ qsizetype QString::count(QStringView str, Qt::CaseSensitivity cs) const
return QtPrivate::count(*this, str, cs);
}
-#if QT_STRINGVIEW_LEVEL < 2
/*! \fn bool QString::contains(const QString &str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
Returns \c true if this string contains an occurrence of the string
\a str; otherwise returns \c false.
- If \a cs is Qt::CaseSensitive (default), the search is
- case sensitive; otherwise the search is case insensitive.
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
Example:
\snippet qstring/main.cpp 17
\sa indexOf(), count()
*/
-#endif // QT_STRINGVIEW_LEVEL < 2
-/*! \fn bool QString::contains(QLatin1String str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
+/*! \fn bool QString::contains(QLatin1StringView str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
\since 5.3
\overload contains()
@@ -4421,8 +4887,7 @@ qsizetype QString::count(QStringView str, Qt::CaseSensitivity cs) const
Returns \c true if this string contains an occurrence of the string view
\a str; otherwise returns \c false.
- If \a cs is Qt::CaseSensitive (default), the search is
- case sensitive; otherwise the search is case insensitive.
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
\sa indexOf(), count()
*/
@@ -4445,7 +4910,7 @@ qsizetype QString::count(QStringView str, Qt::CaseSensitivity cs) const
*/
qsizetype QString::indexOf(const QRegularExpression &re, qsizetype from, QRegularExpressionMatch *rmatch) const
{
- return QtPrivate::indexOf(QStringView(*this), re, from, rmatch);
+ return QtPrivate::indexOf(QStringView(*this), this, re, from, rmatch);
}
/*!
@@ -4453,9 +4918,11 @@ qsizetype QString::indexOf(const QRegularExpression &re, qsizetype from, QRegula
Returns the index position of the last match of the regular
expression \a re in the string, which starts before the index
- position \a from. If \a from is -1, the search starts at the last
- character; if \a from is -2, at the next to last character and so
- on. Returns -1 if \a re didn't match anywhere.
+ position \a from.
+
+ \include qstring.qdocinc negative-index-start-search-from-end
+
+ Returns -1 if \a re didn't match anywhere.
If the match is successful and \a rmatch is not \nullptr, it also
writes the results of the match into the QRegularExpressionMatch object
@@ -4479,7 +4946,7 @@ qsizetype QString::indexOf(const QRegularExpression &re, qsizetype from, QRegula
*/
qsizetype QString::lastIndexOf(const QRegularExpression &re, qsizetype from, QRegularExpressionMatch *rmatch) const
{
- return QtPrivate::lastIndexOf(QStringView(*this), re, from, rmatch);
+ return QtPrivate::lastIndexOf(QStringView(*this), this, re, from, rmatch);
}
/*!
@@ -4518,7 +4985,7 @@ qsizetype QString::lastIndexOf(const QRegularExpression &re, qsizetype from, QRe
bool QString::contains(const QRegularExpression &re, QRegularExpressionMatch *rmatch) const
{
- return QtPrivate::contains(QStringView(*this), re, rmatch);
+ return QtPrivate::contains(QStringView(*this), this, re, rmatch);
}
/*!
@@ -4545,13 +5012,14 @@ qsizetype QString::count(const QRegularExpression &re) const
}
#endif // QT_CONFIG(regularexpression)
+#if QT_DEPRECATED_SINCE(6, 4)
/*! \fn qsizetype QString::count() const
-
+ \deprecated [6.4] Use size() or length() instead.
\overload count()
Same as size().
*/
-
+#endif
/*!
\enum QString::SectionFlag
@@ -4675,7 +5143,7 @@ public:
};
Q_DECLARE_TYPEINFO(qt_section_chunk, Q_RELOCATABLE_TYPE);
-static QString extractSections(const QList<qt_section_chunk> &sections, qsizetype start, qsizetype end,
+static QString extractSections(QSpan<qt_section_chunk> sections, qsizetype start, qsizetype end,
QString::SectionFlags flags)
{
const qsizetype sectionsSize = sections.size();
@@ -4688,8 +5156,8 @@ static QString extractSections(const QList<qt_section_chunk> &sections, qsizetyp
} else {
qsizetype skip = 0;
for (qsizetype k = 0; k < sectionsSize; ++k) {
- const qt_section_chunk &section = sections.at(k);
- if (section.length == section.string.length())
+ const qt_section_chunk &section = sections[k];
+ if (section.length == section.string.size())
skip++;
}
if (start < 0)
@@ -4704,8 +5172,8 @@ static QString extractSections(const QList<qt_section_chunk> &sections, qsizetyp
qsizetype x = 0;
qsizetype first_i = start, last_i = end;
for (qsizetype i = 0; x <= end && i < sectionsSize; ++i) {
- const qt_section_chunk &section = sections.at(i);
- const bool empty = (section.length == section.string.length());
+ const qt_section_chunk &section = sections[i];
+ const bool empty = (section.length == section.string.size());
if (x >= start) {
if (x == start)
first_i = i;
@@ -4721,13 +5189,13 @@ static QString extractSections(const QList<qt_section_chunk> &sections, qsizetyp
}
if ((flags & QString::SectionIncludeLeadingSep) && first_i >= 0) {
- const qt_section_chunk &section = sections.at(first_i);
+ const qt_section_chunk &section = sections[first_i];
ret.prepend(section.string.left(section.length));
}
if ((flags & QString::SectionIncludeTrailingSep)
&& last_i < sectionsSize - 1) {
- const qt_section_chunk &section = sections.at(last_i+1);
+ const qt_section_chunk &section = sections[last_i + 1];
ret += section.string.left(section.length);
}
@@ -4751,7 +5219,7 @@ static QString extractSections(const QList<qt_section_chunk> &sections, qsizetyp
QString QString::section(const QRegularExpression &re, qsizetype start, qsizetype end, SectionFlags flags) const
{
if (!re.isValid()) {
- qWarning("QString::section: invalid QRegularExpression object");
+ qtWarnAboutInvalidRegularExpression(re.pattern(), "QString::section");
return QString();
}
@@ -4763,8 +5231,8 @@ QString QString::section(const QRegularExpression &re, qsizetype start, qsizetyp
if (flags & SectionCaseInsensitiveSeps)
sep.setPatternOptions(sep.patternOptions() | QRegularExpression::CaseInsensitiveOption);
- QList<qt_section_chunk> sections;
- qsizetype n = length(), m = 0, last_m = 0, last_len = 0;
+ QVarLengthArray<qt_section_chunk> sections;
+ qsizetype n = size(), m = 0, last_m = 0, last_len = 0;
QRegularExpressionMatchIterator iterator = sep.globalMatch(*this);
while (iterator.hasNext()) {
QRegularExpressionMatch match = iterator.next();
@@ -4780,6 +5248,9 @@ QString QString::section(const QRegularExpression &re, qsizetype start, qsizetyp
#endif // QT_CONFIG(regularexpression)
/*!
+ \fn QString QString::left(qsizetype n) const &
+ \fn QString QString::left(qsizetype n) &&
+
Returns a substring that contains the \a n leftmost characters
of the string.
@@ -4791,14 +5262,11 @@ QString QString::section(const QRegularExpression &re, qsizetype start, qsizetyp
\sa first(), last(), startsWith(), chopped(), chop(), truncate()
*/
-QString QString::left(qsizetype n) const
-{
- if (size_t(n) >= size_t(size()))
- return *this;
- return QString((const QChar*) d.data(), n);
-}
/*!
+ \fn QString QString::right(qsizetype n) const &
+ \fn QString QString::right(qsizetype n) &&
+
Returns a substring that contains the \a n rightmost characters
of the string.
@@ -4808,16 +5276,13 @@ QString QString::left(qsizetype n) const
The entire string is returned if \a n is greater than or equal
to size(), or less than zero.
- \sa endsWith(), last(), first(), sliced(), chopped(), chop(), truncate()
+ \sa endsWith(), last(), first(), sliced(), chopped(), chop(), truncate(), slice()
*/
-QString QString::right(qsizetype n) const
-{
- if (size_t(n) >= size_t(size()))
- return *this;
- return QString(constData() + size() - n, n);
-}
/*!
+ \fn QString QString::mid(qsizetype position, qsizetype n) const &
+ \fn QString QString::mid(qsizetype position, qsizetype n) &&
+
Returns a string that contains \a n characters of this string,
starting at the specified \a position index.
@@ -4830,11 +5295,9 @@ QString QString::right(qsizetype n) const
\a n is -1 (default), the function returns all characters that
are available from the specified \a position.
-
- \sa first(), last(), sliced(), chopped(), chop(), truncate()
+ \sa first(), last(), sliced(), chopped(), chop(), truncate(), slice()
*/
-
-QString QString::mid(qsizetype position, qsizetype n) const
+QString QString::mid(qsizetype position, qsizetype n) const &
{
qsizetype p = position;
qsizetype l = n;
@@ -4847,14 +5310,33 @@ QString QString::mid(qsizetype position, qsizetype n) const
case QContainerImplHelper::Full:
return *this;
case QContainerImplHelper::Subset:
- return QString(constData() + p, l);
+ return sliced(p, l);
+ }
+ Q_UNREACHABLE_RETURN(QString());
+}
+
+QString QString::mid(qsizetype position, qsizetype n) &&
+{
+ qsizetype p = position;
+ qsizetype l = n;
+ using namespace QtPrivate;
+ switch (QContainerImplHelper::mid(size(), &p, &l)) {
+ case QContainerImplHelper::Null:
+ return QString();
+ case QContainerImplHelper::Empty:
+ resize(0); // keep capacity if we've reserve()d
+ [[fallthrough]];
+ case QContainerImplHelper::Full:
+ return std::move(*this);
+ case QContainerImplHelper::Subset:
+ return std::move(*this).sliced(p, l);
}
- Q_UNREACHABLE();
- return QString();
+ Q_UNREACHABLE_RETURN(QString());
}
/*!
- \fn QString QString::first(qsizetype n) const
+ \fn QString QString::first(qsizetype n) const &
+ \fn QString QString::first(qsizetype n) &&
\since 6.0
Returns a string that contains the first \a n characters
@@ -4864,11 +5346,12 @@ QString QString::mid(qsizetype position, qsizetype n) const
\snippet qstring/main.cpp 31
- \sa last(), sliced(), startsWith(), chopped(), chop(), truncate()
+ \sa last(), sliced(), startsWith(), chopped(), chop(), truncate(), slice()
*/
/*!
- \fn QString QString::last(qsizetype n) const
+ \fn QString QString::last(qsizetype n) const &
+ \fn QString QString::last(qsizetype n) &&
\since 6.0
Returns the string that contains the last \a n characters of this string.
@@ -4877,11 +5360,12 @@ QString QString::mid(qsizetype position, qsizetype n) const
\snippet qstring/main.cpp 48
- \sa first(), sliced(), endsWith(), chopped(), chop(), truncate()
+ \sa first(), sliced(), endsWith(), chopped(), chop(), truncate(), slice()
*/
/*!
- \fn QString QString::sliced(qsizetype pos, qsizetype n) const
+ \fn QString QString::sliced(qsizetype pos, qsizetype n) const &
+ \fn QString QString::sliced(qsizetype pos, qsizetype n) &&
\since 6.0
Returns a string that contains \a n characters of this string,
@@ -4892,11 +5376,20 @@ QString QString::mid(qsizetype position, qsizetype n) const
\snippet qstring/main.cpp 34
- \sa first(), last(), chopped(), chop(), truncate()
+ \sa first(), last(), chopped(), chop(), truncate(), slice()
*/
+QString QString::sliced_helper(QString &str, qsizetype pos, qsizetype n)
+{
+ if (n == 0)
+ return QString(DataPointer::fromRawData(&_empty, 0));
+ DataPointer d = std::move(str.d).sliced(pos, n);
+ d.data()[n] = 0;
+ return QString(std::move(d));
+}
/*!
- \fn QString QString::sliced(qsizetype pos) const
+ \fn QString QString::sliced(qsizetype pos) const &
+ \fn QString QString::sliced(qsizetype pos) &&
\since 6.0
\overload
@@ -4905,11 +5398,40 @@ QString QString::mid(qsizetype position, qsizetype n) const
\note The behavior is undefined when \a pos < 0 or \a pos > size().
- \sa first(), last(), sliced(), chopped(), chop(), truncate()
+ \sa first(), last(), chopped(), chop(), truncate(), slice()
*/
/*!
- \fn QString QString::chopped(qsizetype len) const
+ \fn QString &QString::slice(qsizetype pos, qsizetype n)
+ \since 6.8
+
+ Modifies this string to start at position \a pos, extending for \a n
+ characters (code points), and returns a reference to this string.
+
+ \note The behavior is undefined if \a pos < 0, \a n < 0,
+ or \a pos + \a n > size().
+
+ \snippet qstring/main.cpp 86
+
+ \sa sliced(), first(), last(), chopped(), chop(), truncate()
+*/
+
+/*!
+ \fn QString &QString::slice(qsizetype pos)
+ \since 6.8
+ \overload
+
+ Modifies this string to start at position \a pos and extending to its end,
+ and returns a reference to this string.
+
+ \note The behavior is undefined if \a pos < 0 or \a pos > size().
+
+ \sa sliced(), first(), last(), chopped(), chop(), truncate()
+*/
+
+/*!
+ \fn QString QString::chopped(qsizetype len) const &
+ \fn QString QString::chopped(qsizetype len) &&
\since 5.10
Returns a string that contains the size() - \a len leftmost characters
@@ -4917,16 +5439,14 @@ QString QString::mid(qsizetype position, qsizetype n) const
\note The behavior is undefined if \a len is negative or greater than size().
- \sa endsWith(), first(), last(), sliced(), chop(), truncate()
+ \sa endsWith(), first(), last(), sliced(), chop(), truncate(), slice()
*/
-#if QT_STRINGVIEW_LEVEL < 2
/*!
Returns \c true if the string starts with \a s; otherwise returns
\c false.
- If \a cs is Qt::CaseSensitive (default), the search is
- case sensitive; otherwise the search is case insensitive.
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
\snippet qstring/main.cpp 65
@@ -4934,16 +5454,15 @@ QString QString::mid(qsizetype position, qsizetype n) const
*/
bool QString::startsWith(const QString& s, Qt::CaseSensitivity cs) const
{
- return qt_starts_with(*this, s, cs);
+ return qt_starts_with_impl(QStringView(*this), QStringView(s), cs);
}
-#endif
/*!
\overload startsWith()
*/
-bool QString::startsWith(QLatin1String s, Qt::CaseSensitivity cs) const
+bool QString::startsWith(QLatin1StringView s, Qt::CaseSensitivity cs) const
{
- return qt_starts_with(*this, s, cs);
+ return qt_starts_with_impl(QStringView(*this), s, cs);
}
/*!
@@ -4954,7 +5473,11 @@ bool QString::startsWith(QLatin1String s, Qt::CaseSensitivity cs) const
*/
bool QString::startsWith(QChar c, Qt::CaseSensitivity cs) const
{
- return qt_starts_with(*this, c, cs);
+ if (!size())
+ return false;
+ if (cs == Qt::CaseSensitive)
+ return at(0) == c;
+ return foldCase(at(0)) == foldCase(c);
}
/*!
@@ -4965,19 +5488,16 @@ bool QString::startsWith(QChar c, Qt::CaseSensitivity cs) const
Returns \c true if the string starts with the string view \a str;
otherwise returns \c false.
- If \a cs is Qt::CaseSensitive (default), the search is case-sensitive;
- otherwise the search is case insensitive.
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
\sa endsWith()
*/
-#if QT_STRINGVIEW_LEVEL < 2
/*!
Returns \c true if the string ends with \a s; otherwise returns
\c false.
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
\snippet qstring/main.cpp 20
@@ -4985,9 +5505,8 @@ bool QString::startsWith(QChar c, Qt::CaseSensitivity cs) const
*/
bool QString::endsWith(const QString &s, Qt::CaseSensitivity cs) const
{
- return qt_ends_with(*this, s, cs);
+ return qt_ends_with_impl(QStringView(*this), QStringView(s), cs);
}
-#endif // QT_STRINGVIEW_LEVEL < 2
/*!
\fn bool QString::endsWith(QStringView str, Qt::CaseSensitivity cs) const
@@ -4996,8 +5515,7 @@ bool QString::endsWith(const QString &s, Qt::CaseSensitivity cs) const
Returns \c true if the string ends with the string view \a str;
otherwise returns \c false.
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
\sa startsWith()
*/
@@ -5005,9 +5523,9 @@ bool QString::endsWith(const QString &s, Qt::CaseSensitivity cs) const
/*!
\overload endsWith()
*/
-bool QString::endsWith(QLatin1String s, Qt::CaseSensitivity cs) const
+bool QString::endsWith(QLatin1StringView s, Qt::CaseSensitivity cs) const
{
- return qt_ends_with(*this, s, cs);
+ return qt_ends_with_impl(QStringView(*this), s, cs);
}
/*!
@@ -5018,7 +5536,32 @@ bool QString::endsWith(QLatin1String s, Qt::CaseSensitivity cs) const
*/
bool QString::endsWith(QChar c, Qt::CaseSensitivity cs) const
{
- return qt_ends_with(*this, c, cs);
+ if (!size())
+ return false;
+ if (cs == Qt::CaseSensitive)
+ return at(size() - 1) == c;
+ return foldCase(at(size() - 1)) == foldCase(c);
+}
+
+static bool checkCase(QStringView s, QUnicodeTables::Case c) noexcept
+{
+ QStringIterator it(s);
+ while (it.hasNext()) {
+ const char32_t uc = it.next();
+ if (qGetProp(uc)->cases[c].diff)
+ return false;
+ }
+ return true;
+}
+
+bool QtPrivate::isLower(QStringView s) noexcept
+{
+ return checkCase(s, QUnicodeTables::LowerCase);
+}
+
+bool QtPrivate::isUpper(QStringView s) noexcept
+{
+ return checkCase(s, QUnicodeTables::UpperCase);
}
/*!
@@ -5036,15 +5579,7 @@ bool QString::endsWith(QChar c, Qt::CaseSensitivity cs) const
*/
bool QString::isUpper() const
{
- QStringIterator it(*this);
-
- while (it.hasNext()) {
- const char32_t uc = it.next();
- if (qGetProp(uc)->cases[QUnicodeTables::UpperCase].diff)
- return false;
- }
-
- return true;
+ return QtPrivate::isUpper(qToStringViewIgnoringNull(*this));
}
/*!
@@ -5062,15 +5597,7 @@ bool QString::isUpper() const
*/
bool QString::isLower() const
{
- QStringIterator it(*this);
-
- while (it.hasNext()) {
- const char32_t uc = it.next();
- if (qGetProp(uc)->cases[QUnicodeTables::LowerCase].diff)
- return false;
- }
-
- return true;
+ return QtPrivate::isLower(qToStringViewIgnoringNull(*this));
}
static QByteArray qt_convert_to_latin1(QStringView string);
@@ -5112,12 +5639,13 @@ QByteArray QtPrivate::convertToLatin1(QStringView string)
return qt_convert_to_latin1(string);
}
+Q_NEVER_INLINE
static QByteArray qt_convert_to_latin1(QStringView string)
{
if (Q_UNLIKELY(string.isNull()))
return QByteArray();
- QByteArray ba(string.length(), Qt::Uninitialized);
+ QByteArray ba(string.size(), Qt::Uninitialized);
// since we own the only copy, we're going to const_cast the constData;
// that avoids an unnecessary call to detach() and expansion code that will never get used
@@ -5133,27 +5661,41 @@ QByteArray QString::toLatin1_helper_inplace(QString &s)
// We can return our own buffer to the caller.
// Conversion to Latin-1 always shrinks the buffer by half.
- const char16_t *data = s.d.data();
- qsizetype length = s.d.size;
+ // This relies on the fact that we use QArrayData for everything behind the scenes
- // Move the d pointer over to the bytearray.
+ // First, do the in-place conversion. Since isDetached() == true, the data
+ // was allocated by QArrayData, so the null terminator must be there.
+ qsizetype length = s.size();
+ char16_t *sdata = s.d->data();
+ Q_ASSERT(sdata[length] == u'\0');
+ qt_to_latin1(reinterpret_cast<uchar *>(sdata), sdata, length + 1);
+
+ // Move the internals over to the byte array.
// Kids, avert your eyes. Don't try this at home.
+ auto ba_d = std::move(s.d).reinterpreted<char>();
- // this relies on the fact that we use QArrayData for everything behind the scenes which has the same layout
- static_assert(sizeof(QByteArray::DataPointer) == sizeof(QString::DataPointer), "sizes have to be equal");
- QByteArray::DataPointer ba_d(reinterpret_cast<QByteArray::Data *>(s.d.d_ptr()), reinterpret_cast<char *>(s.d.data()), length);
- ba_d.ref();
- s.clear();
+ // Some sanity checks
+ Q_ASSERT(ba_d.d->allocatedCapacity() >= ba_d.size);
+ Q_ASSERT(s.isNull());
+ Q_ASSERT(s.isEmpty());
+ Q_ASSERT(s.constData() == QString().constData());
- char *ddata = ba_d.data();
+ return QByteArray(std::move(ba_d));
+}
- // multiply the allocated capacity by sizeof(char16_t)
- ba_d.d_ptr()->alloc *= sizeof(char16_t);
+// QLatin1 methods that use helpers from qstring.cpp
+char16_t *QLatin1::convertToUnicode(char16_t *out, QLatin1StringView in) noexcept
+{
+ const qsizetype len = in.size();
+ qt_from_latin1(out, in.data(), len);
+ return std::next(out, len);
+}
- // do the in-place conversion
- qt_to_latin1(reinterpret_cast<uchar *>(ddata), data, length);
- ddata[length] = '\0';
- return QByteArray(ba_d);
+char *QLatin1::convertFromUnicode(char *out, QStringView in) noexcept
+{
+ const qsizetype len = in.size();
+ qt_to_latin1(reinterpret_cast<uchar *>(out), in.utf16(), len);
+ return out + len;
}
/*!
@@ -5174,15 +5716,13 @@ static QByteArray qt_convert_to_local_8bit(QStringView string);
\fn QByteArray QString::toLocal8Bit() const
Returns the local 8-bit representation of the string as a
- QByteArray. The returned byte array is undefined if the string
- contains characters not supported by the local 8-bit encoding.
+ QByteArray.
- On Unix systems this is equivalen to toUtf8(), on Windows the systems
- current code page is being used.
+ \include qstring.qdocinc {qstring-local-8-bit-equivalent} {toUtf8}
If this string contains any characters that cannot be encoded in the
- locale, the returned byte array is undefined. Those characters may be
- suppressed or replaced by another.
+ local 8-bit encoding, the returned byte array is undefined. Those
+ characters may be suppressed or replaced by another.
\sa fromLocal8Bit(), toLatin1(), toUtf8(), QStringEncoder
*/
@@ -5207,7 +5747,7 @@ static QByteArray qt_convert_to_local_8bit(QStringView string)
Returns a local 8-bit representation of \a string as a QByteArray.
- On Unix systems this is equivalen to toUtf8(), on Windows the systems
+ On Unix systems this is equivalent to toUtf8(), on Windows the systems
current code page is being used.
The behavior is undefined if \a string contains characters not
@@ -5287,7 +5827,7 @@ QList<uint> QString::toUcs4() const
static QList<uint> qt_convert_to_ucs4(QStringView string)
{
- QList<uint> v(string.length());
+ QList<uint> v(string.size());
uint *a = const_cast<uint*>(v.constData());
QStringIterator it(string);
while (it.hasNext())
@@ -5336,7 +5876,7 @@ QString QString::fromLatin1(QByteArrayView ba)
} else if (ba.size() == 0) {
d = DataPointer::fromRawData(&_empty, 0);
} else {
- d = DataPointer(Data::allocate(ba.size()), ba.size());
+ d = DataPointer(ba.size(), ba.size());
Q_CHECK_PTR(d.data());
d.data()[ba.size()] = '\0';
char16_t *dst = d.data();
@@ -5375,8 +5915,7 @@ QString QString::fromLatin1(QByteArrayView ba)
If \a size is \c{-1}, \c{strlen(str)} is used instead.
- On Unix systems this is equivalen to fromUtf8(), on Windows the systems
- current code page is being used.
+ \include qstring.qdocinc {qstring-local-8-bit-equivalent} {fromUtf8}
\sa toLocal8Bit(), fromLatin1(), fromUtf8()
*/
@@ -5388,6 +5927,8 @@ QString QString::fromLatin1(QByteArrayView ba)
Returns a QString initialized with the 8-bit string \a str.
+ \include qstring.qdocinc {qstring-local-8-bit-equivalent} {fromUtf8}
+
\note: any null ('\\0') bytes in the byte array will be included in this
string, converted to Unicode null characters (U+0000). This behavior is
different from Qt 5.x.
@@ -5400,6 +5941,8 @@ QString QString::fromLatin1(QByteArrayView ba)
Returns a QString initialized with the 8-bit string \a str.
+ \include qstring.qdocinc {qstring-local-8-bit-equivalent} {fromUtf8}
+
\note: any null ('\\0') bytes in the byte array will be included in this
string, converted to Unicode null characters (U+0000).
*/
@@ -5481,6 +6024,7 @@ QString QString::fromUtf8(QByteArrayView ba)
return QUtf8::convertToUnicode(ba);
}
+#ifndef QT_BOOTSTRAPPED
/*!
\since 5.3
Returns a QString initialized with the first \a size characters
@@ -5492,7 +6036,7 @@ QString QString::fromUtf8(QByteArrayView ba)
host byte order is assumed.
This function is slow compared to the other Unicode conversions.
- Use QString(const QChar *, int) or QString(const QChar *) if possible.
+ Use QString(const QChar *, qsizetype) or QString(const QChar *) if possible.
QString makes a deep copy of the Unicode data.
@@ -5542,7 +6086,7 @@ QString QString::fromUcs4(const char32_t *unicode, qsizetype size)
QStringDecoder toUtf16(QStringDecoder::Utf32, QStringDecoder::Flag::Stateless);
return toUtf16(QByteArrayView(reinterpret_cast<const char *>(unicode), size * 4));
}
-
+#endif // !QT_BOOTSTRAPPED
/*!
Resizes the string to \a size characters and copies \a unicode
@@ -5607,16 +6151,14 @@ namespace {
template <typename StringView>
StringView qt_trimmed(StringView s) noexcept
{
- auto begin = s.begin();
- auto end = s.end();
- QStringAlgorithms<const StringView>::trimmed_helper_positions(begin, end);
+ const auto [begin, end] = QStringAlgorithms<const StringView>::trimmed_helper_positions(s);
return StringView{begin, end};
}
}
/*!
\fn QStringView QtPrivate::trimmed(QStringView s)
- \fn QLatin1String QtPrivate::trimmed(QLatin1String s)
+ \fn QLatin1StringView QtPrivate::trimmed(QLatin1StringView s)
\internal
\relates QStringView
\since 5.10
@@ -5627,14 +6169,14 @@ namespace {
\c true. This includes the ASCII characters '\\t', '\\n', '\\v',
'\\f', '\\r', and ' '.
- \sa QString::trimmed(), QStringView::trimmed(), QLatin1String::trimmed()
+ \sa QString::trimmed(), QStringView::trimmed(), QLatin1StringView::trimmed()
*/
QStringView QtPrivate::trimmed(QStringView s) noexcept
{
return qt_trimmed(s);
}
-QLatin1String QtPrivate::trimmed(QLatin1String s) noexcept
+QLatin1StringView QtPrivate::trimmed(QLatin1StringView s) noexcept
{
return qt_trimmed(s);
}
@@ -5816,12 +6358,8 @@ void QString::chop(qsizetype n)
QString& QString::fill(QChar ch, qsizetype size)
{
resize(size < 0 ? d.size : size);
- if (d.size) {
- QChar *i = (QChar*)d.data() + d.size;
- QChar *b = (QChar*)d.data();
- while (i != b)
- *--i = ch;
- }
+ if (d.size)
+ std::fill(d.data(), d.data() + d.size, ch.unicode());
return *this;
}
@@ -5847,6 +6385,16 @@ QString& QString::fill(QChar ch, qsizetype size)
\sa isEmpty(), resize()
*/
+/*!
+ \fn qsizetype QString::max_size()
+ \since 6.8
+
+ This function is provided for STL compatibility.
+ It returns the maximum number of elements that the string can
+ theoretically hold. In practice, the number can be much smaller,
+ limited by the amount of memory available to the system.
+*/
+
/*! \fn bool QString::isNull() const
Returns \c true if this string is null; otherwise returns \c false.
@@ -5892,11 +6440,18 @@ QString& QString::fill(QChar ch, qsizetype size)
\sa append(), prepend()
*/
-/*! \fn QString &QString::operator+=(QLatin1String str)
+/*! \fn QString &QString::operator+=(QLatin1StringView str)
+
+ \overload operator+=()
+
+ Appends the Latin-1 string viewed by \a str to this string.
+*/
+/*! \fn QString &QString::operator+=(QUtf8StringView str)
+ \since 6.5
\overload operator+=()
- Appends the Latin-1 string \a str to this string.
+ Appends the UTF-8 string view \a str to this string.
*/
/*! \fn QString &QString::operator+=(const QByteArray &ba)
@@ -5942,67 +6497,68 @@ QString& QString::fill(QChar ch, qsizetype size)
*/
/*!
- \fn bool QString::operator==(const char *s1, const QString &s2)
+ \fn bool QString::operator==(const char * const &lhs, const QString &rhs)
\overload operator==()
- Returns \c true if \a s1 is equal to \a s2; otherwise returns \c false.
- Note that no string is equal to \a s1 being 0.
+ Returns \c true if \a lhs is equal to \a rhs; otherwise returns \c false.
+ Note that no string is equal to \a lhs being 0.
- Equivalent to \c {s1 != 0 && compare(s1, s2) == 0}.
+ Equivalent to \c {lhs != 0 && compare(lhs, rhs) == 0}.
*/
/*!
- \fn bool QString::operator!=(const char *s1, const QString &s2)
+ \fn bool QString::operator!=(const char * const &lhs, const QString &rhs)
- Returns \c true if \a s1 is not equal to \a s2; otherwise returns
+ Returns \c true if \a lhs is not equal to \a rhs; otherwise returns
\c false.
- For \a s1 != 0, this is equivalent to \c {compare(} \a s1, \a s2
- \c {) != 0}. Note that no string is equal to \a s1 being 0.
+ For \a lhs != 0, this is equivalent to \c {compare(} \a lhs, \a rhs
+ \c {) != 0}. Note that no string is equal to \a lhs being 0.
*/
/*!
- \fn bool QString::operator<(const char *s1, const QString &s2)
+ \fn bool QString::operator<(const char * const &lhs, const QString &rhs)
- Returns \c true if \a s1 is lexically less than \a s2; otherwise
- returns \c false. For \a s1 != 0, this is equivalent to \c
- {compare(s1, s2) < 0}.
+ Returns \c true if \a lhs is lexically less than \a rhs; otherwise
+ returns \c false. For \a lhs != 0, this is equivalent to \c
+ {compare(lhs, rhs) < 0}.
\sa {Comparing Strings}
*/
/*!
- \fn bool QString::operator<=(const char *s1, const QString &s2)
+ \fn bool QString::operator<=(const char * const &lhs, const QString &rhs)
- Returns \c true if \a s1 is lexically less than or equal to \a s2;
- otherwise returns \c false. For \a s1 != 0, this is equivalent to \c
- {compare(s1, s2) <= 0}.
+ Returns \c true if \a lhs is lexically less than or equal to \a rhs;
+ otherwise returns \c false. For \a lhs != 0, this is equivalent to \c
+ {compare(lhs, rhs) <= 0}.
\sa {Comparing Strings}
*/
/*!
- \fn bool QString::operator>(const char *s1, const QString &s2)
+ \fn bool QString::operator>(const char * const &lhs, const QString &rhs)
- Returns \c true if \a s1 is lexically greater than \a s2; otherwise
- returns \c false. Equivalent to \c {compare(s1, s2) > 0}.
+ Returns \c true if \a lhs is lexically greater than \a rhs; otherwise
+ returns \c false. Equivalent to \c {compare(lhs, rhs) > 0}.
\sa {Comparing Strings}
*/
/*!
- \fn bool QString::operator>=(const char *s1, const QString &s2)
+ \fn bool QString::operator>=(const char * const &lhs, const QString &rhs)
- Returns \c true if \a s1 is lexically greater than or equal to \a s2;
- otherwise returns \c false. For \a s1 != 0, this is equivalent to \c
- {compare(s1, s2) >= 0}.
+ Returns \c true if \a lhs is lexically greater than or equal to \a rhs;
+ otherwise returns \c false. For \a lhs != 0, this is equivalent to \c
+ {compare(lhs, rhs) >= 0}.
\sa {Comparing Strings}
*/
/*!
- \fn const QString operator+(const QString &s1, const QString &s2)
+ \fn QString operator+(const QString &s1, const QString &s2)
+ \fn QString operator+(QString &&s1, const QString &s2)
\relates QString
Returns a string which is the result of concatenating \a s1 and \a
@@ -6010,7 +6566,7 @@ QString& QString::fill(QChar ch, qsizetype size)
*/
/*!
- \fn const QString operator+(const QString &s1, const char *s2)
+ \fn QString operator+(const QString &s1, const char *s2)
\relates QString
Returns a string which is the result of concatenating \a s1 and \a
@@ -6021,7 +6577,7 @@ QString& QString::fill(QChar ch, qsizetype size)
*/
/*!
- \fn const QString operator+(const char *s1, const QString &s2)
+ \fn QString operator+(const char *s1, const QString &s2)
\relates QString
Returns a string which is the result of concatenating \a s1 and \a
@@ -6035,12 +6591,11 @@ QString& QString::fill(QChar ch, qsizetype size)
\fn int QString::compare(const QString &s1, const QString &s2, Qt::CaseSensitivity cs)
\since 4.2
- Compares \a s1 with \a s2 and returns an integer less than, equal
- to, or greater than zero if \a s1 is less than, equal to, or
- greater than \a s2.
+ Compares the string \a s1 with the string \a s2 and returns a negative integer
+ if \a s1 is less than \a s2, a positive integer if it is greater than \a s2,
+ and zero if they are equal.
- If \a cs is Qt::CaseSensitive, the comparison is case sensitive;
- otherwise the comparison is case insensitive.
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {comparison}
Case sensitive comparison is based exclusively on the numeric
Unicode values of the characters and is very fast, but is not what
@@ -6049,11 +6604,16 @@ QString& QString::fill(QChar ch, qsizetype size)
\snippet qstring/main.cpp 16
+//! [compare-isNull-vs-isEmpty]
+ \note This function treats null strings the same as empty strings,
+ for more details see \l {Distinction Between Null and Empty Strings}.
+//! [compare-isNull-vs-isEmpty]
+
\sa operator==(), operator<(), operator>(), {Comparing Strings}
*/
/*!
- \fn int QString::compare(const QString &s1, QLatin1String s2, Qt::CaseSensitivity cs)
+ \fn int QString::compare(const QString &s1, QLatin1StringView s2, Qt::CaseSensitivity cs)
\since 4.2
\overload compare()
@@ -6062,7 +6622,7 @@ QString& QString::fill(QChar ch, qsizetype size)
*/
/*!
- \fn int QString::compare(QLatin1String s1, const QString &s2, Qt::CaseSensitivity cs = Qt::CaseSensitive)
+ \fn int QString::compare(QLatin1StringView s1, const QString &s2, Qt::CaseSensitivity cs = Qt::CaseSensitive)
\since 4.2
\overload compare()
@@ -6091,15 +6651,13 @@ QString& QString::fill(QChar ch, qsizetype size)
sensitivity setting \a cs.
*/
-#if QT_STRINGVIEW_LEVEL < 2
/*!
\overload compare()
\since 4.2
- Lexically compares this string with the \a other string and
- returns an integer less than, equal to, or greater than zero if
- this string is less than, equal to, or greater than the other
- string.
+ Lexically compares this string with the string \a other and returns
+ a negative integer if this string is less than \a other, a positive
+ integer if it is greater than \a other, and zero if they are equal.
Same as compare(*this, \a other, \a cs).
*/
@@ -6107,7 +6665,6 @@ int QString::compare(const QString &other, Qt::CaseSensitivity cs) const noexcep
{
return QtPrivate::compareStrings(*this, other, cs);
}
-#endif
/*!
\internal
@@ -6129,7 +6686,7 @@ int QString::compare_helper(const QChar *data1, qsizetype length1, const QChar *
Same as compare(*this, \a other, \a cs).
*/
-int QString::compare(QLatin1String other, Qt::CaseSensitivity cs) const noexcept
+int QString::compare(QLatin1StringView other, Qt::CaseSensitivity cs) const noexcept
{
return QtPrivate::compareStrings(*this, other, cs);
}
@@ -6139,19 +6696,16 @@ int QString::compare(QLatin1String other, Qt::CaseSensitivity cs) const noexcept
\since 5.0
*/
int QString::compare_helper(const QChar *data1, qsizetype length1, const char *data2, qsizetype length2,
- Qt::CaseSensitivity cs)
+ Qt::CaseSensitivity cs) noexcept
{
Q_ASSERT(length1 >= 0);
Q_ASSERT(data1 || length1 == 0);
if (!data2)
- return length1;
+ return qt_lencmp(length1, 0);
if (Q_UNLIKELY(length2 < 0))
length2 = qsizetype(strlen(data2));
- // ### make me nothrow in all cases
- QVarLengthArray<ushort> s2(length2);
- const auto beg = reinterpret_cast<QChar *>(s2.data());
- const auto end = QUtf8::convertToUnicode(beg, QByteArrayView(data2, length2));
- return QtPrivate::compareStrings(QStringView(data1, length1), QStringView(beg, end - beg), cs);
+ return QtPrivate::compareStrings(QStringView(data1, length1),
+ QUtf8StringView(data2, length2), cs);
}
/*!
@@ -6164,12 +6718,116 @@ int QString::compare_helper(const QChar *data1, qsizetype length1, const char *d
\overload compare()
*/
+bool comparesEqual(const QByteArrayView &lhs, const QChar &rhs) noexcept
+{
+ return QtPrivate::equalStrings(QUtf8StringView(lhs), QStringView(&rhs, 1));
+}
+
+Qt::strong_ordering compareThreeWay(const QByteArrayView &lhs, const QChar &rhs) noexcept
+{
+ const int res = QtPrivate::compareStrings(QUtf8StringView(lhs), QStringView(&rhs, 1));
+ return Qt::compareThreeWay(res, 0);
+}
+
+bool comparesEqual(const QByteArrayView &lhs, char16_t rhs) noexcept
+{
+ return QtPrivate::equalStrings(QUtf8StringView(lhs), QStringView(&rhs, 1));
+}
+
+Qt::strong_ordering compareThreeWay(const QByteArrayView &lhs, char16_t rhs) noexcept
+{
+ const int res = QtPrivate::compareStrings(QUtf8StringView(lhs), QStringView(&rhs, 1));
+ return Qt::compareThreeWay(res, 0);
+}
+
+bool comparesEqual(const QByteArray &lhs, const QChar &rhs) noexcept
+{
+ return QtPrivate::equalStrings(QUtf8StringView(lhs), QStringView(&rhs, 1));
+}
+
+Qt::strong_ordering compareThreeWay(const QByteArray &lhs, const QChar &rhs) noexcept
+{
+ const int res = QtPrivate::compareStrings(QUtf8StringView(lhs), QStringView(&rhs, 1));
+ return Qt::compareThreeWay(res, 0);
+}
+
+bool comparesEqual(const QByteArray &lhs, char16_t rhs) noexcept
+{
+ return QtPrivate::equalStrings(QUtf8StringView(lhs), QStringView(&rhs, 1));
+}
+
+Qt::strong_ordering compareThreeWay(const QByteArray &lhs, char16_t rhs) noexcept
+{
+ const int res = QtPrivate::compareStrings(QUtf8StringView(lhs), QStringView(&rhs, 1));
+ return Qt::compareThreeWay(res, 0);
+}
+
+/*!
+ \internal
+ \since 6.8
+*/
+bool QT_FASTCALL QChar::equal_helper(QChar lhs, const char *rhs) noexcept
+{
+ return QtPrivate::equalStrings(QStringView(&lhs, 1), QUtf8StringView(rhs));
+}
+
+int QT_FASTCALL QChar::compare_helper(QChar lhs, const char *rhs) noexcept
+{
+ return QtPrivate::compareStrings(QStringView(&lhs, 1), QUtf8StringView(rhs));
+}
+
+/*!
+ \internal
+ \since 6.8
+*/
+bool QStringView::equal_helper(QStringView sv, const char *data, qsizetype len)
+{
+ Q_ASSERT(len >= 0);
+ Q_ASSERT(data || len == 0);
+ return QtPrivate::equalStrings(sv, QUtf8StringView(data, len));
+}
+
+/*!
+ \internal
+ \since 6.8
+*/
+int QStringView::compare_helper(QStringView sv, const char *data, qsizetype len)
+{
+ Q_ASSERT(len >= 0);
+ Q_ASSERT(data || len == 0);
+ return QtPrivate::compareStrings(sv, QUtf8StringView(data, len));
+}
+
+/*!
+ \internal
+ \since 6.8
+*/
+bool QLatin1StringView::equal_helper(QLatin1StringView s1, const char *s2, qsizetype len) noexcept
+{
+ // because qlatin1stringview.h can't include qutf8stringview.h
+ Q_ASSERT(len >= 0);
+ Q_ASSERT(s2 || len == 0);
+ return QtPrivate::equalStrings(s1, QUtf8StringView(s2, len));
+}
+
+/*!
+ \internal
+ \since 6.6
+*/
+int QLatin1StringView::compare_helper(const QLatin1StringView &s1, const char *s2, qsizetype len) noexcept
+{
+ // because qlatin1stringview.h can't include qutf8stringview.h
+ Q_ASSERT(len >= 0);
+ Q_ASSERT(s2 || len == 0);
+ return QtPrivate::compareStrings(s1, QUtf8StringView(s2, len));
+}
+
/*!
\internal
\since 4.5
*/
-int QLatin1String::compare_helper(const QChar *data1, qsizetype length1, QLatin1String s2,
- Qt::CaseSensitivity cs) noexcept
+int QLatin1StringView::compare_helper(const QChar *data1, qsizetype length1, QLatin1StringView s2,
+ Qt::CaseSensitivity cs) noexcept
{
Q_ASSERT(length1 >= 0);
Q_ASSERT(data1 || length1 == 0);
@@ -6248,7 +6906,7 @@ int QLatin1String::compare_helper(const QChar *data1, qsizetype length1, QLatin1
*/
int QString::localeAwareCompare(const QString &other) const
{
- return localeAwareCompare_helper(constData(), length(), other.constData(), other.length());
+ return localeAwareCompare_helper(constData(), size(), other.constData(), other.size());
}
/*!
@@ -6364,7 +7022,7 @@ const ushort *QString::utf16() const
QString QString::leftJustified(qsizetype width, QChar fill, bool truncate) const
{
QString result;
- qsizetype len = length();
+ qsizetype len = size();
qsizetype padlen = width - len;
if (padlen > 0) {
result.resize(len+padlen);
@@ -6403,7 +7061,7 @@ QString QString::leftJustified(qsizetype width, QChar fill, bool truncate) const
QString QString::rightJustified(qsizetype width, QChar fill, bool truncate) const
{
QString result;
- qsizetype len = length();
+ qsizetype len = size();
qsizetype padlen = width - len;
if (padlen > 0) {
result.resize(len+padlen);
@@ -6611,9 +7269,9 @@ QString QString::asprintf(const char *cformat, ...)
return s;
}
-static void append_utf8(QString &qs, const char *cs, int len)
+static void append_utf8(QString &qs, const char *cs, qsizetype len)
{
- const int oldSize = qs.size();
+ const qsizetype oldSize = qs.size();
qs.resize(oldSize + len);
const QChar *newEnd = QUtf8::convertToUnicode(qs.data() + oldSize, QByteArrayView(cs, len));
qs.resize(newEnd - qs.constData());
@@ -6641,19 +7299,19 @@ static uint parse_flag_characters(const char * &c) noexcept
static int parse_field_width(const char *&c, qsizetype size)
{
- Q_ASSERT(qIsDigit(*c));
+ Q_ASSERT(isAsciiDigit(*c));
const char *const stop = c + size;
// can't be negative - started with a digit
// contains at least one digit
- const char *endp;
- bool ok;
- const qulonglong result = qstrntoull(c, size, &endp, 10, &ok);
- c = endp;
+ auto [result, used] = qstrntoull(c, size, 10);
+ c += used;
+ if (used <= 0)
+ return false;
// preserve Qt 5.5 behavior of consuming all digits, no matter how many
- while (c < stop && qIsDigit(*c))
+ while (c < stop && isAsciiDigit(*c))
++c;
- return ok && result < qulonglong(std::numeric_limits<int>::max()) ? int(result) : 0;
+ return result < qulonglong(std::numeric_limits<int>::max()) ? int(result) : 0;
}
enum LengthMod { lm_none, lm_hh, lm_h, lm_l, lm_ll, lm_L, lm_j, lm_z, lm_t };
@@ -6723,11 +7381,11 @@ QString QString::vasprintf(const char *cformat, va_list ap)
++c;
if (*c == '\0') {
- result.append(QLatin1Char('%')); // a % at the end of the string - treat as non-escape text
+ result.append(u'%'); // a % at the end of the string - treat as non-escape text
break;
}
if (*c == '%') {
- result.append(QLatin1Char('%')); // %%
+ result.append(u'%'); // %%
++c;
continue;
}
@@ -6735,13 +7393,13 @@ QString QString::vasprintf(const char *cformat, va_list ap)
uint flags = parse_flag_characters(c);
if (*c == '\0') {
- result.append(QLatin1String(escape_start)); // incomplete escape, treat as non-escape text
+ result.append(QLatin1StringView(escape_start)); // incomplete escape, treat as non-escape text
break;
}
// Parse field width
int width = -1; // -1 means unspecified
- if (qIsDigit(*c)) {
+ if (isAsciiDigit(*c)) {
width = parse_field_width(c, formatEnd - c);
} else if (*c == '*') { // can't parse this in another function, not portably, at least
width = va_arg(ap, int);
@@ -6751,7 +7409,7 @@ QString QString::vasprintf(const char *cformat, va_list ap)
}
if (*c == '\0') {
- result.append(QLatin1String(escape_start)); // incomplete escape, treat as non-escape text
+ result.append(QLatin1StringView(escape_start)); // incomplete escape, treat as non-escape text
break;
}
@@ -6759,7 +7417,8 @@ QString QString::vasprintf(const char *cformat, va_list ap)
int precision = -1; // -1 means unspecified
if (*c == '.') {
++c;
- if (qIsDigit(*c)) {
+ precision = 0;
+ if (isAsciiDigit(*c)) {
precision = parse_field_width(c, formatEnd - c);
} else if (*c == '*') { // can't parse this in another function, not portably, at least
precision = va_arg(ap, int);
@@ -6770,14 +7429,14 @@ QString QString::vasprintf(const char *cformat, va_list ap)
}
if (*c == '\0') {
- result.append(QLatin1String(escape_start)); // incomplete escape, treat as non-escape text
+ result.append(QLatin1StringView(escape_start)); // incomplete escape, treat as non-escape text
break;
}
const LengthMod length_mod = parse_length_modifier(c);
if (*c == '\0') {
- result.append(QLatin1String(escape_start)); // incomplete escape, treat as non-escape text
+ result.append(QLatin1StringView(escape_start)); // incomplete escape, treat as non-escape text
break;
}
@@ -6820,11 +7479,11 @@ QString QString::vasprintf(const char *cformat, va_list ap)
default: u = 0; break;
}
- if (qIsUpper(*c))
+ if (isAsciiUpper(*c))
flags |= QLocaleData::CapitalEorX;
int base = 10;
- switch (qToLower(*c)) {
+ switch (QtMiscUtils::toAsciiLower(*c)) {
case 'o':
base = 8; break;
case 'u':
@@ -6851,11 +7510,11 @@ QString QString::vasprintf(const char *cformat, va_list ap)
else
d = va_arg(ap, double);
- if (qIsUpper(*c))
+ if (isAsciiUpper(*c))
flags |= QLocaleData::CapitalEorX;
QLocaleData::DoubleForm form = QLocaleData::DFDecimal;
- switch (qToLower(*c)) {
+ switch (QtMiscUtils::toAsciiLower(*c)) {
case 'e': form = QLocaleData::DFExponent; break;
case 'a': // not supported - decimal form used instead
case 'f': form = QLocaleData::DFDecimal; break;
@@ -6904,27 +7563,27 @@ QString QString::vasprintf(const char *cformat, va_list ap)
switch (length_mod) {
case lm_hh: {
signed char *n = va_arg(ap, signed char*);
- *n = result.length();
+ *n = result.size();
break;
}
case lm_h: {
short int *n = va_arg(ap, short int*);
- *n = result.length();
+ *n = result.size();
break;
}
case lm_l: {
long int *n = va_arg(ap, long int*);
- *n = result.length();
+ *n = result.size();
break;
}
case lm_ll: {
qint64 *n = va_arg(ap, qint64*);
- *n = result.length();
+ *n = result.size();
break;
}
default: {
int *n = va_arg(ap, int*);
- *n = result.length();
+ *n = int(result.size());
break;
}
}
@@ -6947,6 +7606,8 @@ QString QString::vasprintf(const char *cformat, va_list ap)
}
/*!
+ \fn QString::toLongLong(bool *ok, int base) const
+
Returns the string converted to a \c{long long} using base \a
base, which is 10 by default and must be between 2 and 36, or 0.
Returns 0 if the conversion fails.
@@ -6954,9 +7615,10 @@ QString QString::vasprintf(const char *cformat, va_list ap)
If \a ok is not \nullptr, failure is reported by setting *\a{ok}
to \c false, and success by setting *\a{ok} to \c true.
- If \a base is 0, the C language convention is used: if the string
- begins with "0x", base 16 is used; otherwise, if the string begins with "0",
- base 8 is used; otherwise, base 10 is used.
+ If \a base is 0, the C language convention is used: if the string begins
+ with "0x", base 16 is used; otherwise, if the string begins with "0b", base
+ 2 is used; otherwise, if the string begins with "0", base 8 is used;
+ otherwise, base 10 is used.
The string conversion will always happen in the 'C' locale. For
locale-dependent conversion use QLocale::toLongLong()
@@ -6967,28 +7629,41 @@ QString QString::vasprintf(const char *cformat, va_list ap)
This function ignores leading and trailing whitespace.
+ \note Support for the "0b" prefix was added in Qt 6.4.
+
\sa number(), toULongLong(), toInt(), QLocale::toLongLong()
*/
-qint64 QString::toLongLong(bool *ok, int base) const
-{
- return toIntegral_helper<qlonglong>(*this, ok, base);
-}
-
-qlonglong QString::toIntegral_helper(QStringView string, bool *ok, int base)
+template <typename Int>
+static Int toIntegral(QStringView string, bool *ok, int base)
{
#if defined(QT_CHECK_RANGE)
if (base != 0 && (base < 2 || base > 36)) {
- qWarning("QString::toULongLong: Invalid base (%d)", base);
+ qWarning("QString::toIntegral: Invalid base (%d)", base);
base = 10;
}
#endif
- return QLocaleData::c()->stringToLongLong(string, base, ok, QLocale::RejectGroupSeparator);
+ QVarLengthArray<uchar> latin1(string.size());
+ qt_to_latin1(latin1.data(), string.utf16(), string.size());
+ QSimpleParsedNumber<Int> r;
+ if constexpr (std::is_signed_v<Int>)
+ r = QLocaleData::bytearrayToLongLong(latin1, base);
+ else
+ r = QLocaleData::bytearrayToUnsLongLong(latin1, base);
+ if (ok)
+ *ok = r.ok();
+ return r.result;
}
+qlonglong QString::toIntegral_helper(QStringView string, bool *ok, int base)
+{
+ return toIntegral<qlonglong>(string, ok, base);
+}
/*!
+ \fn QString::toULongLong(bool *ok, int base) const
+
Returns the string converted to an \c{unsigned long long} using base \a
base, which is 10 by default and must be between 2 and 36, or 0.
Returns 0 if the conversion fails.
@@ -6996,9 +7671,10 @@ qlonglong QString::toIntegral_helper(QStringView string, bool *ok, int base)
If \a ok is not \nullptr, failure is reported by setting *\a{ok}
to \c false, and success by setting *\a{ok} to \c true.
- If \a base is 0, the C language convention is used: if the string
- begins with "0x", base 16 is used; otherwise, if the string begins with "0",
- base 8 is used; otherwise, base 10 is used.
+ If \a base is 0, the C language convention is used: if the string begins
+ with "0x", base 16 is used; otherwise, if the string begins with "0b", base
+ 2 is used; otherwise, if the string begins with "0", base 8 is used;
+ otherwise, base 10 is used.
The string conversion will always happen in the 'C' locale. For
locale-dependent conversion use QLocale::toULongLong()
@@ -7009,24 +7685,14 @@ qlonglong QString::toIntegral_helper(QStringView string, bool *ok, int base)
This function ignores leading and trailing whitespace.
+ \note Support for the "0b" prefix was added in Qt 6.4.
+
\sa number(), toLongLong(), QLocale::toULongLong()
*/
-quint64 QString::toULongLong(bool *ok, int base) const
-{
- return toIntegral_helper<qulonglong>(*this, ok, base);
-}
-
qulonglong QString::toIntegral_helper(QStringView string, bool *ok, uint base)
{
-#if defined(QT_CHECK_RANGE)
- if (base != 0 && (base < 2 || base > 36)) {
- qWarning("QString::toULongLong: Invalid base (%d)", base);
- base = 10;
- }
-#endif
-
- return QLocaleData::c()->stringToUnsLongLong(string, base, ok, QLocale::RejectGroupSeparator);
+ return toIntegral<qulonglong>(string, ok, base);
}
/*!
@@ -7039,9 +7705,10 @@ qulonglong QString::toIntegral_helper(QStringView string, bool *ok, uint base)
If \a ok is not \nullptr, failure is reported by setting *\a{ok}
to \c false, and success by setting *\a{ok} to \c true.
- If \a base is 0, the C language convention is used: if the string
- begins with "0x", base 16 is used; otherwise, if the string begins with "0",
- base 8 is used; otherwise, base 10 is used.
+ If \a base is 0, the C language convention is used: if the string begins
+ with "0x", base 16 is used; otherwise, if the string begins with "0b", base
+ 2 is used; otherwise, if the string begins with "0", base 8 is used;
+ otherwise, base 10 is used.
The string conversion will always happen in the 'C' locale. For
locale-dependent conversion use QLocale::toLongLong()
@@ -7052,6 +7719,8 @@ qulonglong QString::toIntegral_helper(QStringView string, bool *ok, uint base)
This function ignores leading and trailing whitespace.
+ \note Support for the "0b" prefix was added in Qt 6.4.
+
\sa number(), toULong(), toInt(), QLocale::toInt()
*/
@@ -7065,9 +7734,10 @@ qulonglong QString::toIntegral_helper(QStringView string, bool *ok, uint base)
If \a ok is not \nullptr, failure is reported by setting *\a{ok}
to \c false, and success by setting *\a{ok} to \c true.
- If \a base is 0, the C language convention is used: if the string
- begins with "0x", base 16 is used; otherwise, if the string begins with "0",
- base 8 is used; otherwise, base 10 is used.
+ If \a base is 0, the C language convention is used: if the string begins
+ with "0x", base 16 is used; otherwise, if the string begins with "0b", base
+ 2 is used; otherwise, if the string begins with "0", base 8 is used;
+ otherwise, base 10 is used.
The string conversion will always happen in the 'C' locale. For
locale-dependent conversion use QLocale::toULongLong()
@@ -7078,6 +7748,8 @@ qulonglong QString::toIntegral_helper(QStringView string, bool *ok, uint base)
This function ignores leading and trailing whitespace.
+ \note Support for the "0b" prefix was added in Qt 6.4.
+
\sa number(), QLocale::toUInt()
*/
@@ -7090,9 +7762,10 @@ qulonglong QString::toIntegral_helper(QStringView string, bool *ok, uint base)
If \a ok is not \nullptr, failure is reported by setting *\a{ok}
to \c false, and success by setting *\a{ok} to \c true.
- If \a base is 0, the C language convention is used: if the string
- begins with "0x", base 16 is used; otherwise, if the string begins with "0",
- base 8 is used; otherwise, base 10 is used.
+ If \a base is 0, the C language convention is used: if the string begins
+ with "0x", base 16 is used; otherwise, if the string begins with "0b", base
+ 2 is used; otherwise, if the string begins with "0", base 8 is used;
+ otherwise, base 10 is used.
The string conversion will always happen in the 'C' locale. For
locale-dependent conversion use QLocale::toInt()
@@ -7103,6 +7776,8 @@ qulonglong QString::toIntegral_helper(QStringView string, bool *ok, uint base)
This function ignores leading and trailing whitespace.
+ \note Support for the "0b" prefix was added in Qt 6.4.
+
\sa number(), toUInt(), toDouble(), QLocale::toInt()
*/
@@ -7115,9 +7790,10 @@ qulonglong QString::toIntegral_helper(QStringView string, bool *ok, uint base)
If \a ok is not \nullptr, failure is reported by setting *\a{ok}
to \c false, and success by setting *\a{ok} to \c true.
- If \a base is 0, the C language convention is used: if the string
- begins with "0x", base 16 is used; otherwise, if the string begins with "0",
- base 8 is used; otherwise, base 10 is used.
+ If \a base is 0, the C language convention is used: if the string begins
+ with "0x", base 16 is used; otherwise, if the string begins with "0b", base
+ 2 is used; otherwise, if the string begins with "0", base 8 is used;
+ otherwise, base 10 is used.
The string conversion will always happen in the 'C' locale. For
locale-dependent conversion use QLocale::toUInt()
@@ -7128,6 +7804,8 @@ qulonglong QString::toIntegral_helper(QStringView string, bool *ok, uint base)
This function ignores leading and trailing whitespace.
+ \note Support for the "0b" prefix was added in Qt 6.4.
+
\sa number(), toInt(), QLocale::toUInt()
*/
@@ -7141,9 +7819,10 @@ qulonglong QString::toIntegral_helper(QStringView string, bool *ok, uint base)
If \a ok is not \nullptr, failure is reported by setting *\a{ok}
to \c false, and success by setting *\a{ok} to \c true.
- If \a base is 0, the C language convention is used: if the string
- begins with "0x", base 16 is used; otherwise, if the string begins with "0",
- base 8 is used; otherwise, base 10 is used.
+ If \a base is 0, the C language convention is used: if the string begins
+ with "0x", base 16 is used; otherwise, if the string begins with "0b", base
+ 2 is used; otherwise, if the string begins with "0", base 8 is used;
+ otherwise, base 10 is used.
The string conversion will always happen in the 'C' locale. For
locale-dependent conversion use QLocale::toShort()
@@ -7154,6 +7833,8 @@ qulonglong QString::toIntegral_helper(QStringView string, bool *ok, uint base)
This function ignores leading and trailing whitespace.
+ \note Support for the "0b" prefix was added in Qt 6.4.
+
\sa number(), toUShort(), toInt(), QLocale::toShort()
*/
@@ -7167,9 +7848,10 @@ qulonglong QString::toIntegral_helper(QStringView string, bool *ok, uint base)
If \a ok is not \nullptr, failure is reported by setting *\a{ok}
to \c false, and success by setting *\a{ok} to \c true.
- If \a base is 0, the C language convention is used: if the string
- begins with "0x", base 16 is used; if the string begins with "0",
- base 8 is used; otherwise, base 10 is used.
+ If \a base is 0, the C language convention is used: if the string begins
+ with "0x", base 16 is used; otherwise, if the string begins with "0b", base
+ 2 is used; otherwise, if the string begins with "0", base 8 is used;
+ otherwise, base 10 is used.
The string conversion will always happen in the 'C' locale. For
locale-dependent conversion use QLocale::toUShort()
@@ -7180,6 +7862,8 @@ qulonglong QString::toIntegral_helper(QStringView string, bool *ok, uint base)
This function ignores leading and trailing whitespace.
+ \note Support for the "0b" prefix was added in Qt 6.4.
+
\sa number(), toShort(), QLocale::toUShort()
*/
@@ -7219,7 +7903,18 @@ qulonglong QString::toIntegral_helper(QStringView string, bool *ok, uint base)
double QString::toDouble(bool *ok) const
{
- return QLocaleData::c()->stringToDouble(*this, ok, QLocale::RejectGroupSeparator);
+ return QStringView(*this).toDouble(ok);
+}
+
+double QStringView::toDouble(bool *ok) const
+{
+ QStringView string = qt_trimmed(*this);
+ QVarLengthArray<uchar> latin1(string.size());
+ qt_to_latin1(latin1.data(), string.utf16(), string.size());
+ auto r = qt_asciiToDouble(reinterpret_cast<const char *>(latin1.data()), string.size());
+ if (ok != nullptr)
+ *ok = r.ok();
+ return r.result;
}
/*!
@@ -7257,6 +7952,11 @@ float QString::toFloat(bool *ok) const
return QLocaleData::convertDoubleToFloat(toDouble(ok), ok);
}
+float QStringView::toFloat(bool *ok) const
+{
+ return QLocaleData::convertDoubleToFloat(toDouble(ok), ok);
+}
+
/*! \fn QString &QString::setNum(int n, int base)
Sets the string to the printed value of \a n in the specified \a
@@ -7443,7 +8143,7 @@ QString QString::number(double n, char format, int precision)
{
QLocaleData::DoubleForm form = QLocaleData::DFDecimal;
- switch (qToLower(format)) {
+ switch (QtMiscUtils::toAsciiLower(format)) {
case 'f':
form = QLocaleData::DFDecimal;
break;
@@ -7460,7 +8160,7 @@ QString QString::number(double n, char format, int precision)
break;
}
- return qdtoBasicLatin(n, form, precision, qIsUpper(format));
+ return qdtoBasicLatin(n, form, precision, isAsciiUpper(format));
}
namespace {
@@ -7534,14 +8234,15 @@ QStringList QString::split(QChar sep, Qt::SplitBehavior behavior, Qt::CaseSensit
\fn QList<QStringView> QStringView::split(QStringView sep, Qt::SplitBehavior behavior, Qt::CaseSensitivity cs) const
- Splits the string into substring views wherever \a sep occurs, and
+ Splits the view into substring views wherever \a sep occurs, and
returns the list of those string views.
See QString::split() for how \a sep, \a behavior and \a cs interact to form
the result.
- \note All views are valid as long as this string is. Destroying this
- string will cause all views to be dangling pointers.
+ \note All the returned views are valid as long as the data referenced by
+ this string view is valid. Destroying the data will cause all views to
+ become dangling.
\since 6.0
*/
@@ -7557,19 +8258,20 @@ QList<QStringView> QStringView::split(QChar sep, Qt::SplitBehavior behavior, Qt:
#if QT_CONFIG(regularexpression)
namespace {
-template<class ResultList, typename String>
+template<class ResultList, typename String, typename MatchingFunction>
static ResultList splitString(const String &source, const QRegularExpression &re,
+ MatchingFunction matchingFunction,
Qt::SplitBehavior behavior)
{
ResultList list;
if (!re.isValid()) {
- qWarning("QString::split: invalid QRegularExpression object");
+ qtWarnAboutInvalidRegularExpression(re.pattern(), "QString::split");
return list;
}
qsizetype start = 0;
qsizetype end = 0;
- QRegularExpressionMatchIterator iterator = re.globalMatch(source);
+ QRegularExpressionMatchIterator iterator = (re.*matchingFunction)(source, 0, QRegularExpression::NormalMatch, QRegularExpression::NoMatchOption);
while (iterator.hasNext()) {
QRegularExpressionMatch match = iterator.next();
end = match.capturedStart();
@@ -7614,10 +8316,19 @@ static ResultList splitString(const String &source, const QRegularExpression &re
*/
QStringList QString::split(const QRegularExpression &re, Qt::SplitBehavior behavior) const
{
- return splitString<QStringList>(*this, re, behavior);
+#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0)
+ const auto matchingFunction = qOverload<const QString &, qsizetype, QRegularExpression::MatchType, QRegularExpression::MatchOptions>(&QRegularExpression::globalMatch);
+#else
+ const auto matchingFunction = &QRegularExpression::globalMatch;
+#endif
+ return splitString<QStringList>(*this,
+ re,
+ matchingFunction,
+ behavior);
}
/*!
+ \overload
\since 6.0
Splits the string into substring views wherever the regular expression \a re
@@ -7631,7 +8342,7 @@ QStringList QString::split(const QRegularExpression &re, Qt::SplitBehavior behav
*/
QList<QStringView> QStringView::split(const QRegularExpression &re, Qt::SplitBehavior behavior) const
{
- return splitString<QList<QStringView>>(*this, re, behavior);
+ return splitString<QList<QStringView>>(*this, re, &QRegularExpression::globalMatchView, behavior);
}
#endif // QT_CONFIG(regularexpression)
@@ -7698,19 +8409,22 @@ QString QString::repeated(qsizetype times) const
void qt_string_normalize(QString *data, QString::NormalizationForm mode, QChar::UnicodeVersion version, qsizetype from)
{
- const QChar *p = data->constData() + from;
- if (isAscii(p, p + data->length() - from))
- return;
- if (p > data->constData() + from)
- from = p - data->constData() - 1; // need one before the non-ASCII to perform NFC
+ {
+ // check if it's fully ASCII first, because then we have no work
+ auto start = reinterpret_cast<const char16_t *>(data->constData());
+ const char16_t *p = start + from;
+ if (isAscii_helper(p, p + data->size() - from))
+ return;
+ if (p > start + from)
+ from = p - start - 1; // need one before the non-ASCII to perform NFC
+ }
if (version == QChar::Unicode_Unassigned) {
version = QChar::currentUnicodeVersion();
} else if (int(version) <= NormalizationCorrectionsVersionMax) {
const QString &s = *data;
QChar *d = nullptr;
- for (int i = 0; i < NumNormalizationCorrections; ++i) {
- const NormalizationCorrection &n = uc_normalization_corrections[i];
+ for (const NormalizationCorrection &n : uc_normalization_corrections) {
if (n.version > version) {
qsizetype pos = from;
if (QChar::requiresSurrogates(n.ucs4)) {
@@ -7718,7 +8432,7 @@ void qt_string_normalize(QString *data, QString::NormalizationForm mode, QChar::
char16_t ucs4Low = QChar::lowSurrogate(n.ucs4);
char16_t oldHigh = QChar::highSurrogate(n.old_mapping);
char16_t oldLow = QChar::lowSurrogate(n.old_mapping);
- while (pos < s.length() - 1) {
+ while (pos < s.size() - 1) {
if (s.at(pos).unicode() == ucs4High && s.at(pos + 1).unicode() == ucs4Low) {
if (!d)
d = data->data();
@@ -7728,7 +8442,7 @@ void qt_string_normalize(QString *data, QString::NormalizationForm mode, QChar::
++pos;
}
} else {
- while (pos < s.length()) {
+ while (pos < s.size()) {
if (s.at(pos).unicode() == n.ucs4) {
if (!d)
d = data->data();
@@ -7765,7 +8479,7 @@ QString QString::normalized(QString::NormalizationForm mode, QChar::UnicodeVersi
return copy;
}
-#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0)
+#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0) && !defined(QT_BOOTSTRAPPED)
static void checkArgEscape(QStringView s)
{
// If we're in here, it means that qArgDigitValue has accepted the
@@ -7797,10 +8511,10 @@ static void checkArgEscape(QStringView s)
struct ArgEscapeData
{
int min_escape; // lowest escape sequence number
- int occurrences; // number of occurrences of the lowest escape sequence number
- int locale_occurrences; // number of occurrences of the lowest escape sequence number that
- // contain 'L'
- int escape_len; // total length of escape sequences which will be replaced
+ qsizetype occurrences; // number of occurrences of the lowest escape sequence number
+ qsizetype locale_occurrences; // number of occurrences of the lowest escape sequence number that
+ // contain 'L'
+ qsizetype escape_len; // total length of escape sequences which will be replaced
};
static ArgEscapeData findArgEscapes(QStringView s)
@@ -7839,7 +8553,7 @@ static ArgEscapeData findArgEscapes(QStringView s)
// ### Qt 7: do not allow anything but ASCII digits
// in arg()'s replacements.
-#if QT_VERSION <= QT_VERSION_CHECK(7, 0, 0)
+#if QT_VERSION <= QT_VERSION_CHECK(7, 0, 0) && !defined(QT_BOOTSTRAPPED)
const QChar *escapeBegin = c;
const QChar *escapeEnd = escapeBegin + 1;
#endif
@@ -7851,13 +8565,13 @@ static ArgEscapeData findArgEscapes(QStringView s)
if (next_escape != -1) {
escape = (10 * escape) + next_escape;
++c;
-#if QT_VERSION <= QT_VERSION_CHECK(7, 0, 0)
+#if QT_VERSION <= QT_VERSION_CHECK(7, 0, 0) && !defined(QT_BOOTSTRAPPED)
++escapeEnd;
#endif
}
}
-#if QT_VERSION <= QT_VERSION_CHECK(7, 0, 0)
+#if QT_VERSION <= QT_VERSION_CHECK(7, 0, 0) && !defined(QT_BOOTSTRAPPED)
checkArgEscape(QStringView(escapeBegin, escapeEnd));
#endif
@@ -7885,14 +8599,14 @@ static QString replaceArgEscapes(QStringView s, const ArgEscapeData &d, qsizetyp
// Negative field-width for right-padding, positive for left-padding:
const qsizetype abs_field_width = qAbs(field_width);
const qsizetype result_len =
- s.length() - d.escape_len
- + (d.occurrences - d.locale_occurrences) * qMax(abs_field_width, arg.length())
- + d.locale_occurrences * qMax(abs_field_width, larg.length());
+ s.size() - d.escape_len
+ + (d.occurrences - d.locale_occurrences) * qMax(abs_field_width, arg.size())
+ + d.locale_occurrences * qMax(abs_field_width, larg.size());
QString result(result_len, Qt::Uninitialized);
QChar *rc = const_cast<QChar *>(result.unicode());
QChar *const result_end = rc + result_len;
- int repl_cnt = 0;
+ qsizetype repl_cnt = 0;
const QChar *c = s.begin();
const QChar *const uc_end = s.end();
@@ -7930,20 +8644,19 @@ static QString replaceArgEscapes(QStringView s, const ArgEscapeData &d, qsizetyp
rc += escape_start - text_start;
const QStringView use = localize ? larg : arg;
- const qsizetype pad_chars = abs_field_width - use.length();
+ const qsizetype pad_chars = abs_field_width - use.size();
// (If negative, relevant loops are no-ops: no need to check.)
if (field_width > 0) { // left padded
- for (qsizetype i = 0; i < pad_chars; ++i)
- *rc++ = fillChar;
+ rc = std::fill_n(rc, pad_chars, fillChar);
}
- memcpy(rc, use.data(), use.length() * sizeof(QChar));
- rc += use.length();
+ if (use.size())
+ memcpy(rc, use.data(), use.size() * sizeof(QChar));
+ rc += use.size();
if (field_width < 0) { // right padded
- for (qsizetype i = 0; i < pad_chars; ++i)
- *rc++ = fillChar;
+ rc = std::fill_n(rc, pad_chars, fillChar);
}
if (++repl_cnt == d.occurrences) {
@@ -7959,7 +8672,6 @@ static QString replaceArgEscapes(QStringView s, const ArgEscapeData &d, qsizetyp
return result;
}
-#if QT_STRINGVIEW_LEVEL < 2
/*!
Returns a copy of this string with the lowest numbered place marker
replaced by string \a a, i.e., \c %1, \c %2, ..., \c %99.
@@ -7993,7 +8705,6 @@ QString QString::arg(const QString &a, int fieldWidth, QChar fillChar) const
{
return arg(qToStringViewIgnoringNull(a), fieldWidth, fillChar);
}
-#endif // QT_STRINGVIEW_LEVEL < 2
/*!
\overload
@@ -8044,7 +8755,7 @@ QString QString::arg(QStringView a, int fieldWidth, QChar fillChar) const
\since 5.10
Returns a copy of this string with the lowest-numbered place-marker
- replaced by string \a a, i.e., \c %1, \c %2, ..., \c %99.
+ replaced by the Latin-1 string viewed by \a a, i.e., \c %1, \c %2, ..., \c %99.
\a fieldWidth specifies the minimum amount of space that \a a
shall occupy. If \a a requires less space than \a fieldWidth, it
@@ -8063,10 +8774,9 @@ QString QString::arg(QStringView a, int fieldWidth, QChar fillChar) const
is printed and the result is undefined. Place-marker numbers must be
in the range 1 to 99.
*/
-QString QString::arg(QLatin1String a, int fieldWidth, QChar fillChar) const
+QString QString::arg(QLatin1StringView a, int fieldWidth, QChar fillChar) const
{
- QVarLengthArray<char16_t> utf16(a.size());
- qt_from_latin1(utf16.data(), a.data(), a.size());
+ QVarLengthArray<char16_t> utf16 = qt_from_latin1_to_qvla(a);
return arg(QStringView(utf16.data(), utf16.size()), fieldWidth, fillChar);
}
@@ -8168,14 +8878,13 @@ QString QString::arg(qlonglong a, int fieldWidth, int base, QChar fillChar) cons
unsigned flags = QLocaleData::NoFlags;
// ZeroPadded sorts out left-padding when the fill is zero, to the right of sign:
- if (fillChar == QLatin1Char('0'))
+ if (fillChar == u'0')
flags = QLocaleData::ZeroPadded;
QString arg;
if (d.occurrences > d.locale_occurrences) {
arg = QLocaleData::c()->longLongToString(a, -1, base, fieldWidth, flags);
- Q_ASSERT(fillChar != QLatin1Char('0') || !qIsFinite(a)
- || fieldWidth <= arg.length());
+ Q_ASSERT(fillChar != u'0' || fieldWidth <= arg.size());
}
QString localeArg;
@@ -8184,8 +8893,7 @@ QString QString::arg(qlonglong a, int fieldWidth, int base, QChar fillChar) cons
if (!(locale.numberOptions() & QLocale::OmitGroupSeparator))
flags |= QLocaleData::GroupDigits;
localeArg = locale.d->m_data->longLongToString(a, -1, base, fieldWidth, flags);
- Q_ASSERT(fillChar != QLatin1Char('0') || !qIsFinite(a)
- || fieldWidth <= localeArg.length());
+ Q_ASSERT(fillChar != u'0' || fieldWidth <= localeArg.size());
}
return replaceArgEscapes(*this, d, fieldWidth, arg, localeArg, fillChar);
@@ -8216,14 +8924,13 @@ QString QString::arg(qulonglong a, int fieldWidth, int base, QChar fillChar) con
unsigned flags = QLocaleData::NoFlags;
// ZeroPadded sorts out left-padding when the fill is zero, to the right of sign:
- if (fillChar == QLatin1Char('0'))
+ if (fillChar == u'0')
flags = QLocaleData::ZeroPadded;
QString arg;
if (d.occurrences > d.locale_occurrences) {
arg = QLocaleData::c()->unsLongLongToString(a, -1, base, fieldWidth, flags);
- Q_ASSERT(fillChar != QLatin1Char('0') || !qIsFinite(a)
- || fieldWidth <= arg.length());
+ Q_ASSERT(fillChar != u'0' || fieldWidth <= arg.size());
}
QString localeArg;
@@ -8232,8 +8939,7 @@ QString QString::arg(qulonglong a, int fieldWidth, int base, QChar fillChar) con
if (!(locale.numberOptions() & QLocale::OmitGroupSeparator))
flags |= QLocaleData::GroupDigits;
localeArg = locale.d->m_data->unsLongLongToString(a, -1, base, fieldWidth, flags);
- Q_ASSERT(fillChar != QLatin1Char('0') || !qIsFinite(a)
- || fieldWidth <= localeArg.length());
+ Q_ASSERT(fillChar != u'0' || fieldWidth <= localeArg.size());
}
return replaceArgEscapes(*this, d, fieldWidth, arg, localeArg, fillChar);
@@ -8316,14 +9022,14 @@ QString QString::arg(double a, int fieldWidth, char format, int precision, QChar
unsigned flags = QLocaleData::NoFlags;
// ZeroPadded sorts out left-padding when the fill is zero, to the right of sign:
- if (fillChar == QLatin1Char('0'))
+ if (fillChar == u'0')
flags |= QLocaleData::ZeroPadded;
- if (qIsUpper(format))
+ if (isAsciiUpper(format))
flags |= QLocaleData::CapitalEorX;
QLocaleData::DoubleForm form = QLocaleData::DFDecimal;
- switch (qToLower(format)) {
+ switch (QtMiscUtils::toAsciiLower(format)) {
case 'f':
form = QLocaleData::DFDecimal;
break;
@@ -8344,8 +9050,8 @@ QString QString::arg(double a, int fieldWidth, char format, int precision, QChar
if (d.occurrences > d.locale_occurrences) {
arg = QLocaleData::c()->doubleToString(a, precision, form, fieldWidth,
flags | QLocaleData::ZeroPadExponent);
- Q_ASSERT(fillChar != QLatin1Char('0') || !qIsFinite(a)
- || fieldWidth <= arg.length());
+ Q_ASSERT(fillChar != u'0' || !qt_is_finite(a)
+ || fieldWidth <= arg.size());
}
QString localeArg;
@@ -8360,8 +9066,8 @@ QString QString::arg(double a, int fieldWidth, char format, int precision, QChar
if (numberOptions & QLocale::IncludeTrailingZeroesAfterDot)
flags |= QLocaleData::AddTrailingZeroes;
localeArg = locale.d->m_data->doubleToString(a, precision, form, fieldWidth, flags);
- Q_ASSERT(fillChar != QLatin1Char('0') || !qIsFinite(a)
- || fieldWidth <= localeArg.length());
+ Q_ASSERT(fillChar != u'0' || !qt_is_finite(a)
+ || fieldWidth <= localeArg.size());
}
return replaceArgEscapes(*this, d, fieldWidth, arg, localeArg, fillChar);
@@ -8371,28 +9077,27 @@ static inline char16_t to_unicode(const QChar c) { return c.unicode(); }
static inline char16_t to_unicode(const char c) { return QLatin1Char{c}.unicode(); }
template <typename Char>
-static int getEscape(const Char *uc, qsizetype *pos, qsizetype len, int maxNumber = 999)
+static int getEscape(const Char *uc, qsizetype *pos, qsizetype len)
{
- int i = *pos;
+ qsizetype i = *pos;
++i;
- if (i < len && uc[i] == QLatin1Char('L'))
+ if (i < len && uc[i] == u'L')
++i;
if (i < len) {
int escape = to_unicode(uc[i]) - '0';
if (uint(escape) >= 10U)
return -1;
++i;
- while (i < len) {
+ if (i < len) {
+ // there's a second digit
int digit = to_unicode(uc[i]) - '0';
- if (uint(digit) >= 10U)
- break;
- escape = (escape * 10) + digit;
- ++i;
- }
- if (escape <= maxNumber) {
- *pos = i;
- return escape;
+ if (uint(digit) < 10U) {
+ escape = (escape * 10) + digit;
+ ++i;
+ }
}
+ *pos = i;
+ return escape;
}
return -1;
}
@@ -8437,11 +9142,11 @@ struct Part
Part() = default; // for QVarLengthArray; do not use
constexpr Part(QStringView s, int num = -1)
: tag{QtPrivate::ArgBase::U16}, number{num}, data{s.utf16()}, size{s.size()} {}
- constexpr Part(QLatin1String s, int num = -1)
+ constexpr Part(QLatin1StringView s, int num = -1)
: tag{QtPrivate::ArgBase::L1}, number{num}, data{s.data()}, size{s.size()} {}
void reset(QStringView s) noexcept { *this = {s, number}; }
- void reset(QLatin1String s) noexcept { *this = {s, number}; }
+ void reset(QLatin1StringView s) noexcept { *this = {s, number}; }
QtPrivate::ArgBase::Tag tag;
int number;
@@ -8471,7 +9176,7 @@ static ParseResult parseMultiArgFormatString(StringView s)
qsizetype last = 0;
while (i < end) {
- if (uc[i] == QLatin1Char('%')) {
+ if (uc[i] == u'%') {
qsizetype percent = i;
int number = getEscape(uc, &i, len);
if (number != -1) {
@@ -8495,7 +9200,7 @@ static ArgIndexToPlaceholderMap makeArgIndexToPlaceholderMap(const ParseResult &
{
ArgIndexToPlaceholderMap result;
- for (Part part : parts) {
+ for (const Part &part : parts) {
if (part.number >= 0)
result.push_back(part.number);
}
@@ -8536,7 +9241,7 @@ static qsizetype resolveStringRefsAndReturnTotalSize(ParseResult &parts, const A
} // unnamed namespace
-Q_ALWAYS_INLINE QString to_string(QLatin1String s) noexcept { return s; }
+Q_ALWAYS_INLINE QString to_string(QLatin1StringView s) noexcept { return s; }
Q_ALWAYS_INLINE QString to_string(QStringView s) noexcept { return s.toString(); }
template <typename StringView>
@@ -8561,7 +9266,7 @@ static QString argToQStringImpl(StringView pattern, size_t numArgs, const QtPriv
QString result(totalSize, Qt::Uninitialized);
auto out = const_cast<QChar*>(result.constData());
- for (Part part : parts) {
+ for (const Part &part : parts) {
switch (part.tag) {
case QtPrivate::ArgBase::L1:
if (part.size) {
@@ -8588,31 +9293,11 @@ QString QtPrivate::argToQString(QStringView pattern, size_t n, const ArgBase **a
return argToQStringImpl(pattern, n, args);
}
-QString QtPrivate::argToQString(QLatin1String pattern, size_t n, const ArgBase **args)
+QString QtPrivate::argToQString(QLatin1StringView pattern, size_t n, const ArgBase **args)
{
return argToQStringImpl(pattern, n, args);
}
-/*! \fn bool QString::isSimpleText() const
-
- \internal
-*/
-bool QString::isSimpleText() const
-{
- const char16_t *p = d.data();
- const char16_t * const end = p + d.size;
- while (p < end) {
- char16_t uc = *p;
- // sort out regions of complex text formatting
- if (uc > 0x058f && (uc < 0x1100 || uc > 0xfb0f)) {
- return false;
- }
- p++;
- }
-
- return true;
-}
-
/*! \fn bool QString::isRightToLeft() const
Returns \c true if the string is read right to left.
@@ -8720,7 +9405,8 @@ bool QString::isRightToLeft() const
Removes from the string the characters in the half-open range
[ \a first , \a last ). Returns an iterator to the character
- referred to by \a last before the erase.
+ immediately after the last erased character (i.e. the character
+ referred to by \a last before the erase).
*/
QString::iterator QString::erase(QString::const_iterator first, QString::const_iterator last)
{
@@ -8730,6 +9416,22 @@ QString::iterator QString::erase(QString::const_iterator first, QString::const_i
return begin() + start;
}
+/*!
+ \fn QString::iterator QString::erase(QString::const_iterator it)
+
+ \overload
+ \since 6.5
+
+ Removes the character denoted by \c it from the string.
+ Returns an iterator to the character immediately after the
+ erased character.
+
+ \code
+ QString c = "abcdefg";
+ auto it = c.erase(c.cbegin()); // c is now "bcdefg"; "it" points to "b"
+ \endcode
+*/
+
/*! \fn void QString::shrink_to_fit()
\since 5.10
@@ -8808,8 +9510,7 @@ QString &QString::setRawData(const QChar *unicode, qsizetype size)
/*! \fn QString QString::fromStdU16String(const std::u16string &str)
\since 5.5
- Returns a copy of the \a str string. The given string is assumed
- to be encoded in UTF-16.
+ \include qstring.cpp {from-std-string} {UTF-16} {fromUtf16()}
\sa fromUtf16(), fromStdWString(), fromStdU32String()
*/
@@ -8828,8 +9529,7 @@ QString &QString::setRawData(const QChar *unicode, qsizetype size)
/*! \fn QString QString::fromStdU32String(const std::u32string &str)
\since 5.5
- Returns a copy of the \a str string. The given string is assumed
- to be encoded in UCS-4.
+ \include qstring.cpp {from-std-string} {UCS-4} {fromUcs4()}
\sa fromUcs4(), fromStdWString(), fromStdU16String()
*/
@@ -8845,1106 +9545,7 @@ QString &QString::setRawData(const QChar *unicode, qsizetype size)
\sa toUcs4(), toStdWString(), toStdU16String()
*/
-/*! \class QLatin1String
- \inmodule QtCore
- \brief The QLatin1String class provides a thin wrapper around an US-ASCII/Latin-1 encoded string literal.
-
- \ingroup string-processing
- \reentrant
-
- Many of QString's member functions are overloaded to accept
- \c{const char *} instead of QString. This includes the copy
- constructor, the assignment operator, the comparison operators,
- and various other functions such as \l{QString::insert()}{insert()},
- \l{QString::replace()}{replace()}, and \l{QString::indexOf()}{indexOf()}.
- These functions are usually optimized to avoid constructing a
- QString object for the \c{const char *} data. For example,
- assuming \c str is a QString,
-
- \snippet code/src_corelib_text_qstring.cpp 3
-
- is much faster than
-
- \snippet code/src_corelib_text_qstring.cpp 4
-
- because it doesn't construct four temporary QString objects and
- make a deep copy of the character data.
-
- Applications that define \l QT_NO_CAST_FROM_ASCII (as explained
- in the QString documentation) don't have access to QString's
- \c{const char *} API. To provide an efficient way of specifying
- constant Latin-1 strings, Qt provides the QLatin1String, which is
- just a very thin wrapper around a \c{const char *}. Using
- QLatin1String, the example code above becomes
-
- \snippet code/src_corelib_text_qstring.cpp 5
-
- This is a bit longer to type, but it provides exactly the same
- benefits as the first version of the code, and is faster than
- converting the Latin-1 strings using QString::fromLatin1().
-
- Thanks to the QString(QLatin1String) constructor,
- QLatin1String can be used everywhere a QString is expected. For
- example:
-
- \snippet code/src_corelib_text_qstring.cpp 6
-
- \note If the function you're calling with a QLatin1String
- argument isn't actually overloaded to take QLatin1String, the
- implicit conversion to QString will trigger a memory allocation,
- which is usually what you want to avoid by using QLatin1String
- in the first place. In those cases, using QStringLiteral may be
- the better option.
-
- \sa QString, QLatin1Char, {QStringLiteral()}{QStringLiteral},
- QT_NO_CAST_FROM_ASCII
-*/
-
-/*!
- \typedef QLatin1String::value_type
- \since 5.10
-
- Alias for \c{const char}. Provided for compatibility with the STL.
-*/
-
-/*!
- \typedef QLatin1String::difference_type
- \since 5.10
-
- Alias for \c{qsizetype}. Provided for compatibility with the STL.
-*/
-
-/*!
- \typedef QLatin1String::size_type
- \since 5.10
-
- Alias for \c{qsizetype}. Provided for compatibility with the STL.
-
- \note In version prior to Qt 6, this was an alias for \c{int},
- restricting the amount of data that could be held in a QLatin1String
- on 64-bit architectures.
-*/
-
-/*!
- \typedef QLatin1String::reference
- \since 5.10
-
- Alias for \c{value_type &}. Provided for compatibility with the STL.
-*/
-
-/*!
- \typedef QLatin1String::const_reference
- \since 5.11
-
- Alias for \c{reference}. Provided for compatibility with the STL.
-*/
-
-/*!
- \typedef QLatin1String::iterator
- \since 5.10
-
- QLatin1String does not support mutable iterators, so this is the same
- as const_iterator.
-
- \sa const_iterator, reverse_iterator
-*/
-
-/*!
- \typedef QLatin1String::const_iterator
- \since 5.10
-
- \sa iterator, const_reverse_iterator
-*/
-
-/*!
- \typedef QLatin1String::reverse_iterator
- \since 5.10
-
- QLatin1String does not support mutable reverse iterators, so this is the
- same as const_reverse_iterator.
-
- \sa const_reverse_iterator, iterator
-*/
-
-/*!
- \typedef QLatin1String::const_reverse_iterator
- \since 5.10
-
- \sa reverse_iterator, const_iterator
-*/
-
-/*! \fn QLatin1String::QLatin1String()
- \since 5.6
-
- Constructs a QLatin1String object that stores a nullptr.
-*/
-
-/*! \fn QLatin1String::QLatin1String(const char *str)
-
- Constructs a QLatin1String object that stores \a str.
-
- The string data is \e not copied. The caller must be able to
- guarantee that \a str will not be deleted or modified as long as
- the QLatin1String object exists.
-
- \sa latin1()
-*/
-
-/*! \fn QLatin1String::QLatin1String(const char *str, qsizetype size)
-
- Constructs a QLatin1String object that stores \a str with \a size.
-
- The string data is \e not copied. The caller must be able to
- guarantee that \a str will not be deleted or modified as long as
- the QLatin1String object exists.
-
- \note: any null ('\\0') bytes in the byte array will be included in this
- string, which will be converted to Unicode null characters (U+0000) if this
- string is used by QString. This behavior is different from Qt 5.x.
-
- \sa latin1()
-*/
-
-/*!
- \fn QLatin1String::QLatin1String(const char *first, const char *last)
- \since 5.10
-
- Constructs a QLatin1String object that stores \a first with length
- (\a last - \a first).
-
- The range \c{[first,last)} must remain valid for the lifetime of
- this Latin-1 string object.
-
- Passing \nullptr as \a first is safe if \a last is \nullptr,
- too, and results in a null Latin-1 string.
-
- The behavior is undefined if \a last precedes \a first, \a first
- is \nullptr and \a last is not, or if \c{last - first >
- INT_MAX}.
-*/
-
-/*! \fn QLatin1String::QLatin1String(const QByteArray &str)
-
- Constructs a QLatin1String object that stores \a str.
-
- The string data is \e not copied. The caller must be able to
- guarantee that \a str will not be deleted or modified as long as
- the QLatin1String object exists.
-
- \sa latin1()
-*/
-
-/*! \fn QLatin1String::QLatin1String(QByteArrayView str)
- \since 6.3
-
- Constructs a QLatin1String object that stores \a str.
-
- The string data is \e not copied. The caller must be able to
- guarantee that the data which \a str is pointing to will not
- be deleted or modified as long as the QLatin1String object
- exists. The size is obtained from \a str as-is, without checking
- for a null-terminator.
-
- \note: any null ('\\0') bytes in the byte array will be included in this
- string, which will be converted to Unicode null characters (U+0000) if this
- string is used by QString.
-
- \sa latin1()
-*/
-
-/*!
- \fn QString QLatin1String::toString() const
- \since 6.0
-
- Converts this Latin-1 string into a QString. Equivalent to
- \code
- return QString(*this);
- \endcode
-*/
-
-/*! \fn const char *QLatin1String::latin1() const
-
- Returns the Latin-1 string stored in this object.
-*/
-
-/*! \fn const char *QLatin1String::data() const
-
- Returns the Latin-1 string stored in this object.
-*/
-
-/*! \fn qsizetype QLatin1String::size() const
-
- Returns the size of the Latin-1 string stored in this object.
-
- \note In version prior to Qt 6, this function returned \c{int},
- restricting the amount of data that could be held in a QLatin1String
- on 64-bit architectures.
-*/
-
-/*! \fn bool QLatin1String::isNull() const
- \since 5.10
-
- Returns whether the Latin-1 string stored in this object is null
- (\c{data() == nullptr}) or not.
-
- \sa isEmpty(), data()
-*/
-
-/*! \fn bool QLatin1String::isEmpty() const
- \since 5.10
-
- Returns whether the Latin-1 string stored in this object is empty
- (\c{size() == 0}) or not.
-
- \sa isNull(), size()
-*/
-
-/*! \fn QLatin1Char QLatin1String::at(qsizetype pos) const
- \since 5.8
-
- Returns the character at position \a pos in this object.
-
- \note This function performs no error checking.
- The behavior is undefined when \a pos < 0 or \a pos >= size().
-
- \sa operator[]()
-*/
-
-/*! \fn QLatin1Char QLatin1String::operator[](qsizetype pos) const
- \since 5.8
-
- Returns the character at position \a pos in this object.
-
- \note This function performs no error checking.
- The behavior is undefined when \a pos < 0 or \a pos >= size().
-
- \sa at()
-*/
-
-/*!
- \fn QLatin1Char QLatin1String::front() const
- \since 5.10
-
- Returns the first character in the string.
- Same as \c{at(0)}.
-
- This function is provided for STL compatibility.
-
- \warning Calling this function on an empty string constitutes
- undefined behavior.
-
- \sa back(), at(), operator[]()
-*/
-
-/*!
- \fn QLatin1Char QLatin1String::back() const
- \since 5.10
-
- Returns the last character in the string.
- Same as \c{at(size() - 1)}.
-
- This function is provided for STL compatibility.
-
- \warning Calling this function on an empty string constitutes
- undefined behavior.
-
- \sa front(), at(), operator[]()
-*/
-
-/*!
- \fn int QLatin1String::compare(QStringView str, Qt::CaseSensitivity cs) const
- \fn int QLatin1String::compare(QLatin1String l1, Qt::CaseSensitivity cs) const
- \fn int QLatin1String::compare(QChar ch) const
- \fn int QLatin1String::compare(QChar ch, Qt::CaseSensitivity cs) const
- \since 5.14
-
- Returns an integer that compares to zero as this Latin-1 string compares to the
- string-view \a str, Latin-1 string \a l1, or character \a ch, respectively.
-
- If \a cs is Qt::CaseSensitive (the default), the comparison is case sensitive;
- otherwise the comparison is case-insensitive.
-
- \sa operator==(), operator<(), operator>()
-*/
-
-/*!
- \fn int QLatin1String::compare(QLatin1Char ch, Qt::CaseSensitivity cs) const
- \since 6.3
- \overload
-*/
-
-
-/*!
- \fn bool QLatin1String::startsWith(QStringView str, Qt::CaseSensitivity cs) const
- \since 5.10
- \fn bool QLatin1String::startsWith(QLatin1String l1, Qt::CaseSensitivity cs) const
- \since 5.10
- \fn bool QLatin1String::startsWith(QChar ch) const
- \since 5.10
- \fn bool QLatin1String::startsWith(QChar ch, Qt::CaseSensitivity cs) const
- \since 5.10
-
- Returns \c true if this Latin-1 string starts with string-view \a str,
- Latin-1 string \a l1, or character \a ch, respectively;
- otherwise returns \c false.
-
- If \a cs is Qt::CaseSensitive (the default), the search is case-sensitive;
- otherwise the search is case-insensitive.
-
- \sa endsWith()
-*/
-
-/*!
- \fn bool QLatin1String::startsWith(QLatin1Char ch, Qt::CaseSensitivity cs) const
- \since 6.3
- \overload
-*/
-
-/*!
- \fn bool QLatin1String::endsWith(QStringView str, Qt::CaseSensitivity cs) const
- \since 5.10
- \fn bool QLatin1String::endsWith(QLatin1String l1, Qt::CaseSensitivity cs) const
- \since 5.10
- \fn bool QLatin1String::endsWith(QChar ch) const
- \since 5.10
- \fn bool QLatin1String::endsWith(QChar ch, Qt::CaseSensitivity cs) const
- \since 5.10
-
- Returns \c true if this Latin-1 string ends with string-view \a str,
- Latin-1 string \a l1, or character \a ch, respectively;
- otherwise returns \c false.
-
- If \a cs is Qt::CaseSensitive (the default), the search is case-sensitive;
- otherwise the search is case-insensitive.
-
- \sa startsWith()
-*/
-
-/*!
- \fn bool QLatin1String::endsWith(QLatin1Char ch, Qt::CaseSensitivity cs) const
- \since 6.3
- \overload
-*/
-
-/*!
- \fn qsizetype QLatin1String::indexOf(QStringView str, qsizetype from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
- \fn qsizetype QLatin1String::indexOf(QLatin1String l1, qsizetype from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
- \fn qsizetype QLatin1String::indexOf(QChar c, qsizetype from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
- \since 5.14
-
- Returns the index position of the first occurrence of the string-view
- \a str, Latin-1 string \a l1, or character \a ch, respectively, in this
- Latin-1 string, searching forward from index position \a from.
- Returns -1 if \a str is not found.
-
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
-
- If \a from is -1, the search starts at the last character; if it is
- -2, at the next to last character and so on.
-
- \sa QString::indexOf()
-*/
-
-/*!
- \fn qsizetype QLatin1String::indexOf(QLatin1Char ch, qsizetype from, Qt::CaseSensitivity cs) const
- \since 6.3
- \overload
-*/
-
-/*!
- \fn bool QLatin1String::contains(QStringView str, Qt::CaseSensitivity cs) const
- \fn bool QLatin1String::contains(QLatin1String l1, Qt::CaseSensitivity cs) const
- \fn bool QLatin1String::contains(QChar c, Qt::CaseSensitivity cs) const
- \since 5.14
-
- Returns \c true if this Latin-1 string contains an occurrence of the
- string-view \a str, Latin-1 string \a l1, or character \a ch;
- otherwise returns \c false.
-
- If \a cs is Qt::CaseSensitive (the default), the search is
- case-sensitive; otherwise the search is case-insensitive.
-
- \sa indexOf(), QStringView::contains(), QStringView::indexOf(),
- QString::indexOf()
-*/
-
-/*!
- \fn bool QLatin1String::contains(QLatin1Char ch, Qt::CaseSensitivity cs) const
- \since 6.3
- \overload
-*/
-
-/*!
- \fn qsizetype QLatin1String::lastIndexOf(QStringView str, qsizetype from, Qt::CaseSensitivity cs) const
- \fn qsizetype QLatin1String::lastIndexOf(QLatin1String l1, qsizetype from, Qt::CaseSensitivity cs) const
- \fn qsizetype QLatin1String::lastIndexOf(QChar c, qsizetype from, Qt::CaseSensitivity cs) const
- \since 5.14
-
- Returns the index position of the last occurrence of the string-view \a str,
- Latin-1 string \a l1, or character \a ch, respectively, in this Latin-1
- string, searching backward from index position \a from.
- Returns -1 if \a str is not found.
-
- If \a from is -1, the search starts at the last character;
- if \a from is -2, at the next to last character and so on.
-
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
-
- \note When searching for a 0-length \a str or \a l1, the match at
- the end of the data is excluded from the search by a negative \a
- from, even though \c{-1} is normally thought of as searching from
- the end of the string: the match at the end is \e after the last
- character, so it is excluded. To include such a final empty match,
- either give a positive value for \a from or omit the \a from
- parameter entirely.
-
- \sa indexOf(), QStringView::lastIndexOf(), QStringView::indexOf(),
- QString::indexOf()
-*/
-
-/*!
- \fn qsizetype QLatin1String::lastIndexOf(QStringView str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
- \fn qsizetype QLatin1String::lastIndexOf(QLatin1String l1, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
- \since 6.2
- \overload lastIndexOf()
-
- Returns the index position of the last occurrence of the
- string-view \a str or Latin-1 string \a l1, respectively, in this
- Latin-1 string. Returns -1 if \a str is not found.
-
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
-*/
-
-/*!
- \fn qsizetype QLatin1String::lastIndexOf(QChar ch, Qt::CaseSensitivity cs) const
- \fn qsizetype QLatin1String::lastIndexOf(QLatin1Char ch, qsizetype from, Qt::CaseSensitivity cs) const
- \since 6.3
- \overload
-*/
-
-/*!
- \fn QLatin1String::const_iterator QLatin1String::begin() const
- \since 5.10
-
- Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the
- first character in the string.
-
- This function is provided for STL compatibility.
-
- \sa end(), cbegin(), rbegin(), data()
-*/
-
-/*!
- \fn QLatin1String::const_iterator QLatin1String::cbegin() const
- \since 5.10
-
- Same as begin().
-
- This function is provided for STL compatibility.
-
- \sa cend(), begin(), crbegin(), data()
-*/
-
-/*!
- \fn QLatin1String::const_iterator QLatin1String::end() const
- \since 5.10
-
- Returns a const \l{STL-style iterators}{STL-style iterator} pointing just
- after the last character in the string.
-
- This function is provided for STL compatibility.
-
- \sa begin(), cend(), rend()
-*/
-
-/*! \fn QLatin1String::const_iterator QLatin1String::cend() const
- \since 5.10
-
- Same as end().
-
- This function is provided for STL compatibility.
-
- \sa cbegin(), end(), crend()
-*/
-
-/*!
- \fn QLatin1String::const_reverse_iterator QLatin1String::rbegin() const
- \since 5.10
-
- Returns a const \l{STL-style iterators}{STL-style} reverse iterator pointing
- to the first character in the string, in reverse order.
-
- This function is provided for STL compatibility.
-
- \sa rend(), crbegin(), begin()
-*/
-
-/*!
- \fn QLatin1String::const_reverse_iterator QLatin1String::crbegin() const
- \since 5.10
-
- Same as rbegin().
-
- This function is provided for STL compatibility.
-
- \sa crend(), rbegin(), cbegin()
-*/
-
-/*!
- \fn QLatin1String::const_reverse_iterator QLatin1String::rend() const
- \since 5.10
-
- Returns a \l{STL-style iterators}{STL-style} reverse iterator pointing just
- after the last character in the string, in reverse order.
-
- This function is provided for STL compatibility.
-
- \sa rbegin(), crend(), end()
-*/
-
-/*!
- \fn QLatin1String::const_reverse_iterator QLatin1String::crend() const
- \since 5.10
-
- Same as rend().
-
- This function is provided for STL compatibility.
-
- \sa crbegin(), rend(), cend()
-*/
-
-/*!
- \fn QLatin1String QLatin1String::mid(qsizetype start, qsizetype length) const
- \since 5.8
-
- Returns the substring of length \a length starting at position
- \a start in this Latin-1 string.
-
- If you know that \a start and \a length cannot be out of bounds, use
- sliced() instead in new code, because it is faster.
-
- Returns an empty Latin-1 string if \a start exceeds the
- length of this Latin-1 string. If there are less than \a length characters
- available in this Latin-1 string starting at \a start, or if
- \a length is negative (default), the function returns all characters that
- are available from \a start.
-
- \sa first(), last(), sliced(), chopped(), chop(), truncate()
-*/
-
-/*!
- \fn QLatin1String QLatin1String::left(qsizetype length) const
- \since 5.8
-
- If you know that \a length cannot be out of bounds, use first() instead in
- new code, because it is faster.
-
- Returns the substring of length \a length starting at position
- 0 in this Latin-1 string.
-
- The entire Latin-1 string is returned if \a length is greater than or equal
- to size(), or less than zero.
-
- \sa first(), last(), sliced(), startsWith(), chopped(), chop(), truncate()
-*/
-
-/*!
- \fn QLatin1String QLatin1String::right(qsizetype length) const
- \since 5.8
-
- If you know that \a length cannot be out of bounds, use last() instead in
- new code, because it is faster.
-
- Returns the substring of length \a length starting at position
- size() - \a length in this Latin-1 string.
-
- The entire Latin-1 string is returned if \a length is greater than or equal
- to size(), or less than zero.
-
- \sa first(), last(), sliced(), endsWith(), chopped(), chop(), truncate()
-*/
-
-/*!
- \fn QLatin1String QLatin1String::first(qsizetype n) const
- \since 6.0
-
- Returns a Latin-1 string that contains the first \a n characters
- of this Latin-1 string.
-
- \note The behavior is undefined when \a n < 0 or \a n > size().
-
- \sa last(), startsWith(), chopped(), chop(), truncate()
-*/
-
-/*!
- \fn QLatin1String QLatin1String::last(qsizetype n) const
- \since 6.0
-
- Returns a Latin-1 string that contains the last \a n characters
- of this Latin-1 string.
-
- \note The behavior is undefined when \a n < 0 or \a n > size().
-
- \sa first(), endsWith(), chopped(), chop(), truncate()
-*/
-
-/*!
- \fn QLatin1String QLatin1String::sliced(qsizetype pos, qsizetype n) const
- \since 6.0
-
- Returns a Latin-1 string that points to \a n characters of this
- Latin-1 string, starting at position \a pos.
-
- \note The behavior is undefined when \a pos < 0, \a n < 0,
- or \c{pos + n > size()}.
-
- \sa first(), last(), chopped(), chop(), truncate()
-*/
-
-/*!
- \fn QLatin1String QLatin1String::sliced(qsizetype pos) const
- \since 6.0
-
- Returns a Latin-1 string starting at position \a pos in this
- Latin-1 string, and extending to its end.
-
- \note The behavior is undefined when \a pos < 0 or \a pos > size().
-
- \sa first(), last(), chopped(), chop(), truncate()
-*/
-
-/*!
- \fn QLatin1String QLatin1String::chopped(qsizetype length) const
- \since 5.10
-
- Returns the substring of length size() - \a length starting at the
- beginning of this object.
-
- Same as \c{left(size() - length)}.
-
- \note The behavior is undefined when \a length < 0 or \a length > size().
-
- \sa sliced(), first(), last(), chop(), truncate()
-*/
-
-/*!
- \fn void QLatin1String::truncate(qsizetype length)
- \since 5.10
-
- Truncates this string to length \a length.
-
- Same as \c{*this = left(length)}.
-
- \note The behavior is undefined when \a length < 0 or \a length > size().
-
- \sa sliced(), first(), last(), chopped(), chop()
-*/
-
-/*!
- \fn void QLatin1String::chop(qsizetype length)
- \since 5.10
-
- Truncates this string by \a length characters.
-
- Same as \c{*this = left(size() - length)}.
-
- \note The behavior is undefined when \a length < 0 or \a length > size().
-
- \sa sliced(), first(), last(), chopped(), truncate()
-*/
-
-/*!
- \fn QLatin1String QLatin1String::trimmed() const
- \since 5.10
-
- Strips leading and trailing whitespace and returns the result.
-
- Whitespace means any character for which QChar::isSpace() returns
- \c true. This includes the ASCII characters '\\t', '\\n', '\\v',
- '\\f', '\\r', and ' '.
-*/
-
-/*!
- \fn bool QLatin1String::operator==(const char *other) const
- \since 4.3
-
- Returns \c true if the string is equal to const char pointer \a other;
- otherwise returns \c false.
-
- The \a other const char pointer is converted to a QString using
- the QString::fromUtf8() function.
-
- You can disable this operator by defining
- \l QT_NO_CAST_FROM_ASCII when you compile your applications. This
- can be useful if you want to ensure that all user-visible strings
- go through QObject::tr(), for example.
-
- \sa {Comparing Strings}
-*/
-
-/*!
- \fn bool QLatin1String::operator==(const QByteArray &other) const
- \since 5.0
- \overload
-
- The \a other byte array is converted to a QString using
- the QString::fromUtf8() function.
-
- You can disable this operator by defining
- \l QT_NO_CAST_FROM_ASCII when you compile your applications. This
- can be useful if you want to ensure that all user-visible strings
- go through QObject::tr(), for example.
-*/
-
-/*!
- \fn bool QLatin1String::operator!=(const char *other) const
- \since 4.3
-
- Returns \c true if this string is not equal to const char pointer \a other;
- otherwise returns \c false.
-
- The \a other const char pointer is converted to a QString using
- the QString::fromUtf8() function.
-
- You can disable this operator by defining
- \l QT_NO_CAST_FROM_ASCII when you compile your applications. This
- can be useful if you want to ensure that all user-visible strings
- go through QObject::tr(), for example.
-
- \sa {Comparing Strings}
-*/
-
-/*!
- \fn bool QLatin1String::operator!=(const QByteArray &other) const
- \since 5.0
- \overload operator!=()
-
- The \a other byte array is converted to a QString using
- the QString::fromUtf8() function.
-
- You can disable this operator by defining
- \l QT_NO_CAST_FROM_ASCII when you compile your applications. This
- can be useful if you want to ensure that all user-visible strings
- go through QObject::tr(), for example.
-*/
-
-/*!
- \fn bool QLatin1String::operator>(const char *other) const
- \since 4.3
-
- Returns \c true if this string is lexically greater than const char pointer
- \a other; otherwise returns \c false.
-
- The \a other const char pointer is converted to a QString using
- the QString::fromUtf8() function.
-
- You can disable this operator by defining \l QT_NO_CAST_FROM_ASCII
- when you compile your applications. This can be useful if you want
- to ensure that all user-visible strings go through QObject::tr(),
- for example.
-
- \sa {Comparing Strings}
-*/
-
-/*!
- \fn bool QLatin1String::operator>(const QByteArray &other) const
- \since 5.0
- \overload
-
- The \a other byte array is converted to a QString using
- the QString::fromUtf8() function.
-
- You can disable this operator by defining \l QT_NO_CAST_FROM_ASCII
- when you compile your applications. This can be useful if you want
- to ensure that all user-visible strings go through QObject::tr(),
- for example.
-*/
-
-/*!
- \fn bool QLatin1String::operator<(const char *other) const
- \since 4.3
-
- Returns \c true if this string is lexically less than const char pointer
- \a other; otherwise returns \c false.
-
- The \a other const char pointer is converted to a QString using
- the QString::fromUtf8() function.
-
- You can disable this operator by defining
- \l QT_NO_CAST_FROM_ASCII when you compile your applications. This
- can be useful if you want to ensure that all user-visible strings
- go through QObject::tr(), for example.
-
- \sa {Comparing Strings}
-*/
-
-/*!
- \fn bool QLatin1String::operator<(const QByteArray &other) const
- \since 5.0
- \overload
-
- The \a other byte array is converted to a QString using
- the QString::fromUtf8() function.
-
- You can disable this operator by defining
- \l QT_NO_CAST_FROM_ASCII when you compile your applications. This
- can be useful if you want to ensure that all user-visible strings
- go through QObject::tr(), for example.
-*/
-
-/*!
- \fn bool QLatin1String::operator>=(const char *other) const
- \since 4.3
-
- Returns \c true if this string is lexically greater than or equal to
- const char pointer \a other; otherwise returns \c false.
-
- The \a other const char pointer is converted to a QString using
- the QString::fromUtf8() function.
-
- You can disable this operator by defining
- \l QT_NO_CAST_FROM_ASCII when you compile your applications. This
- can be useful if you want to ensure that all user-visible strings
- go through QObject::tr(), for example.
-
- \sa {Comparing Strings}
-*/
-
-/*!
- \fn bool QLatin1String::operator>=(const QByteArray &other) const
- \since 5.0
- \overload
-
- The \a other byte array is converted to a QString using
- the QString::fromUtf8() function.
-
- You can disable this operator by defining
- \l QT_NO_CAST_FROM_ASCII when you compile your applications. This
- can be useful if you want to ensure that all user-visible strings
- go through QObject::tr(), for example.
-*/
-
-/*!
- \fn bool QLatin1String::operator<=(const char *other) const
- \since 4.3
-
- Returns \c true if this string is lexically less than or equal to
- const char pointer \a other; otherwise returns \c false.
-
- The \a other const char pointer is converted to a QString using
- the QString::fromUtf8() function.
-
- You can disable this operator by defining
- \l QT_NO_CAST_FROM_ASCII when you compile your applications. This
- can be useful if you want to ensure that all user-visible strings
- go through QObject::tr(), for example.
-
- \sa {Comparing Strings}
-*/
-
-/*!
- \fn bool QLatin1String::operator<=(const QByteArray &other) const
- \since 5.0
- \overload
-
- The \a other byte array is converted to a QString using
- the QString::fromUtf8() function.
-
- You can disable this operator by defining
- \l QT_NO_CAST_FROM_ASCII when you compile your applications. This
- can be useful if you want to ensure that all user-visible strings
- go through QObject::tr(), for example.
-*/
-
-/*! \fn bool QLatin1String::operator==(QLatin1String s1, QLatin1String s2)
-
- Returns \c true if string \a s1 is lexically equal to string \a s2;
- otherwise returns \c false.
-*/
-/*! \fn bool QLatin1String::operator!=(QLatin1String s1, QLatin1String s2)
-
- Returns \c true if string \a s1 is lexically not equal to string \a s2;
- otherwise returns \c false.
-*/
-/*! \fn bool QLatin1String::operator<(QLatin1String s1, QLatin1String s2)
-
- Returns \c true if string \a s1 is lexically less than string \a s2;
- otherwise returns \c false.
-*/
-/*! \fn bool QLatin1String::operator<=(QLatin1String s1, QLatin1String s2)
-
- Returns \c true if string \a s1 is lexically less than or equal to
- string \a s2; otherwise returns \c false.
-*/
-/*! \fn bool QLatin1String::operator>(QLatin1String s1, QLatin1String s2)
-
- Returns \c true if string \a s1 is lexically greater than string \a s2;
- otherwise returns \c false.
-*/
-/*! \fn bool QLatin1String::operator>=(QLatin1String s1, QLatin1String s2)
-
- Returns \c true if string \a s1 is lexically greater than or equal
- to string \a s2; otherwise returns \c false.
-*/
-
-/*! \fn bool QLatin1String::operator==(QChar ch, QLatin1String s)
-
- Returns \c true if char \a ch is lexically equal to string \a s;
- otherwise returns \c false.
-*/
-/*! \fn bool QLatin1String::operator<(QChar ch, QLatin1String s)
-
- Returns \c true if char \a ch is lexically less than string \a s;
- otherwise returns \c false.
-*/
-/*! \fn bool QLatin1String::operator>(QChar ch, QLatin1String s)
- Returns \c true if char \a ch is lexically greater than string \a s;
- otherwise returns \c false.
-*/
-/*! \fn bool QLatin1String::operator!=(QChar ch, QLatin1String s)
-
- Returns \c true if char \a ch is lexically not equal to string \a s;
- otherwise returns \c false.
-*/
-/*! \fn bool QLatin1String::operator<=(QChar ch, QLatin1String s)
-
- Returns \c true if char \a ch is lexically less than or equal to
- string \a s; otherwise returns \c false.
-*/
-/*! \fn bool QLatin1String::operator>=(QChar ch, QLatin1String s)
-
- Returns \c true if char \a ch is lexically greater than or equal to
- string \a s; otherwise returns \c false.
-*/
-
-/*! \fn bool QLatin1String::operator==(QLatin1String s, QChar ch)
-
- Returns \c true if string \a s is lexically equal to char \a ch;
- otherwise returns \c false.
-*/
-/*! \fn bool QLatin1String::operator<(QLatin1String s, QChar ch)
-
- Returns \c true if string \a s is lexically less than char \a ch;
- otherwise returns \c false.
-*/
-/*! \fn bool QLatin1String::operator>(QLatin1String s, QChar ch)
-
- Returns \c true if string \a s is lexically greater than char \a ch;
- otherwise returns \c false.
-*/
-/*! \fn bool QLatin1String::operator!=(QLatin1String s, QChar ch)
-
- Returns \c true if string \a s is lexically not equal to char \a ch;
- otherwise returns \c false.
-*/
-/*! \fn bool QLatin1String::operator<=(QLatin1String s, QChar ch)
-
- Returns \c true if string \a s is lexically less than or equal to
- char \a ch; otherwise returns \c false.
-*/
-/*! \fn bool QLatin1String::operator>=(QLatin1String s, QChar ch)
-
- Returns \c true if string \a s is lexically greater than or equal to
- char \a ch; otherwise returns \c false.
-*/
-
-/*! \fn bool QLatin1String::operator==(QStringView s1, QLatin1String s2)
-
- Returns \c true if string view \a s1 is lexically equal to string \a s2;
- otherwise returns \c false.
-*/
-/*! \fn bool QLatin1String::operator<(QStringView s1, QLatin1String s2)
-
- Returns \c true if string view \a s1 is lexically less than string \a s2;
- otherwise returns \c false.
-*/
-/*! \fn bool QLatin1String::operator>(QStringView s1, QLatin1String s2)
-
- Returns \c true if string view \a s1 is lexically greater than string \a s2;
- otherwise returns \c false.
-*/
-/*! \fn bool QLatin1String::operator!=(QStringView s1, QLatin1String s2)
-
- Returns \c true if string view \a s1 is lexically not equal to string \a s2;
- otherwise returns \c false.
-*/
-/*! \fn bool QLatin1String::operator<=(QStringView s1, QLatin1String s2)
-
- Returns \c true if string view \a s1 is lexically less than or equal to
- string \a s2; otherwise returns \c false.
-*/
-/*! \fn bool QLatin1String::operator>=(QStringView s1, QLatin1String s2)
-
- Returns \c true if string view \a s1 is lexically greater than or equal to
- string \a s2; otherwise returns \c false.
-*/
-
-/*! \fn bool QLatin1String::operator==(QLatin1String s1, QStringView s2)
-
- Returns \c true if string \a s1 is lexically equal to string view \a s2;
- otherwise returns \c false.
-*/
-/*! \fn bool QLatin1String::operator<(QLatin1String s1, QStringView s2)
-
- Returns \c true if string \a s1 is lexically less than string view \a s2;
- otherwise returns \c false.
-*/
-/*! \fn bool QLatin1String::operator>(QLatin1String s1, QStringView s2)
-
- Returns \c true if string \a s1 is lexically greater than string view \a s2;
- otherwise returns \c false.
-*/
-/*! \fn bool QLatin1String::operator!=(QLatin1String s1, QStringView s2)
-
- Returns \c true if string \a s1 is lexically not equal to string view \a s2;
- otherwise returns \c false.
-*/
-/*! \fn bool QLatin1String::operator<=(QLatin1String s1, QStringView s2)
-
- Returns \c true if string \a s1 is lexically less than or equal to
- string view \a s2; otherwise returns \c false.
-*/
-/*! \fn bool QLatin1String::operator>=(QLatin1String s1, QStringView s2)
-
- Returns \c true if string \a s1 is lexically greater than or equal to
- string view \a s2; otherwise returns \c false.
-*/
-
-/*! \fn bool QLatin1String::operator==(const char *s1, QLatin1String s2)
-
- Returns \c true if const char pointer \a s1 is lexically equal to
- string \a s2; otherwise returns \c false.
-*/
-/*! \fn bool QLatin1String::operator<(const char *s1, QLatin1String s2)
-
- Returns \c true if const char pointer \a s1 is lexically less than
- string \a s2; otherwise returns \c false.
-*/
-/*! \fn bool QLatin1String::operator>(const char *s1, QLatin1String s2)
-
- Returns \c true if const char pointer \a s1 is lexically greater than
- string \a s2; otherwise returns \c false.
-*/
-/*! \fn bool QLatin1String::operator!=(const char *s1, QLatin1String s2)
-
- Returns \c true if const char pointer \a s1 is lexically not equal to
- string \a s2; otherwise returns \c false.
-*/
-/*! \fn bool QLatin1String::operator<=(const char *s1, QLatin1String s2)
-
- Returns \c true if const char pointer \a s1 is lexically less than or
- equal to string \a s2; otherwise returns \c false.
-*/
-/*! \fn bool QLatin1String::operator>=(const char *s1, QLatin1String s2)
-
- Returns \c true if const char pointer \a s1 is lexically greater than or
- equal to string \a s2; otherwise returns \c false.
-*/
-
-#if !defined(QT_NO_DATASTREAM) || defined(QT_BOOTSTRAPPED)
+#if !defined(QT_NO_DATASTREAM)
/*!
\fn QDataStream &operator<<(QDataStream &stream, const QString &string)
\relates QString
@@ -9962,16 +9563,15 @@ QDataStream &operator<<(QDataStream &out, const QString &str)
if (!str.isNull() || out.version() < 3) {
if ((out.byteOrder() == QDataStream::BigEndian) == (QSysInfo::ByteOrder == QSysInfo::BigEndian)) {
out.writeBytes(reinterpret_cast<const char *>(str.unicode()),
- static_cast<uint>(sizeof(QChar) * str.length()));
+ static_cast<qsizetype>(sizeof(QChar) * str.size()));
} else {
- QVarLengthArray<char16_t> buffer(str.length());
- qbswap<sizeof(char16_t)>(str.constData(), str.length(), buffer.data());
+ QVarLengthArray<char16_t> buffer(str.size());
+ qbswap<sizeof(char16_t)>(str.constData(), str.size(), buffer.data());
out.writeBytes(reinterpret_cast<const char *>(buffer.data()),
- static_cast<uint>(sizeof(char16_t) * buffer.size()));
+ static_cast<qsizetype>(sizeof(char16_t) * buffer.size()));
}
} else {
- // write null marker
- out << (quint32)0xffffffff;
+ QDataStream::writeQSizeType(out, -1); // write null marker
}
}
return out;
@@ -9993,20 +9593,25 @@ QDataStream &operator>>(QDataStream &in, QString &str)
in >> l;
str = QString::fromLatin1(l);
} else {
- quint32 bytes = 0;
- in >> bytes; // read size of string
- if (bytes == 0xffffffff) { // null string
+ qint64 size = QDataStream::readQSizeType(in);
+ qsizetype bytes = size;
+ if (size != bytes || size < -1) {
str.clear();
- } else if (bytes > 0) { // not empty
+ in.setStatus(QDataStream::SizeLimitExceeded);
+ return in;
+ }
+ if (bytes == -1) { // null string
+ str = QString();
+ } else if (bytes > 0) {
if (bytes & 0x1) {
str.clear();
in.setStatus(QDataStream::ReadCorruptData);
return in;
}
- const quint32 Step = 1024 * 1024;
- quint32 len = bytes / 2;
- quint32 allocated = 0;
+ const qsizetype Step = 1024 * 1024;
+ qsizetype len = bytes / 2;
+ qsizetype allocated = 0;
while (allocated < len) {
int blockSize = qMin(Step, len - allocated);
@@ -10026,7 +9631,7 @@ QDataStream &operator>>(QDataStream &in, QString &str)
qbswap<sizeof(*data)>(data, len, data);
}
} else {
- str = QString(QLatin1String(""));
+ str = QString(QLatin1StringView(""));
}
}
return in;
@@ -10120,64 +9725,81 @@ qsizetype QtPrivate::count(QStringView haystack, QStringView needle, Qt::CaseSen
return num;
}
-qsizetype QtPrivate::count(QStringView haystack, QChar ch, Qt::CaseSensitivity cs) noexcept
+qsizetype QtPrivate::count(QStringView haystack, QChar needle, Qt::CaseSensitivity cs) noexcept
{
- qsizetype num = 0;
- if (cs == Qt::CaseSensitive) {
- for (QChar c : haystack) {
- if (c == ch)
- ++num;
- }
- } else {
- ch = foldCase(ch);
- for (QChar c : haystack) {
- if (foldCase(c) == ch)
- ++num;
- }
- }
- return num;
+ if (cs == Qt::CaseSensitive)
+ return std::count(haystack.cbegin(), haystack.cend(), needle);
+
+ needle = foldCase(needle);
+ return std::count_if(haystack.cbegin(), haystack.cend(),
+ [needle](const QChar c) { return foldAndCompare(c, needle); });
}
-template <typename Haystack, typename Needle>
-bool qt_starts_with_impl(Haystack haystack, Needle needle, Qt::CaseSensitivity cs) noexcept
+qsizetype QtPrivate::count(QLatin1StringView haystack, QLatin1StringView needle, Qt::CaseSensitivity cs)
{
- if (haystack.isNull())
- return needle.isNull();
- const auto haystackLen = haystack.size();
- const auto needleLen = needle.size();
- if (haystackLen == 0)
- return needleLen == 0;
- if (needleLen > haystackLen)
- return false;
+ qsizetype num = 0;
+ qsizetype i = -1;
+
+ QLatin1StringMatcher matcher(needle, cs);
+ while ((i = matcher.indexIn(haystack, i + 1)) != -1)
+ ++num;
- return QtPrivate::compareStrings(haystack.left(needleLen), needle, cs) == 0;
+ return num;
}
-static inline bool qt_starts_with(QStringView haystack, QStringView needle, Qt::CaseSensitivity cs)
+qsizetype QtPrivate::count(QLatin1StringView haystack, QStringView needle, Qt::CaseSensitivity cs)
{
- return qt_starts_with_impl(haystack, needle, cs);
+ if (haystack.size() < needle.size())
+ return 0;
+
+ if (!QtPrivate::isLatin1(needle)) // won't find non-L1 UTF-16 needles in a L1 haystack!
+ return 0;
+
+ qsizetype num = 0;
+ qsizetype i = -1;
+
+ QVarLengthArray<uchar> s(needle.size());
+ qt_to_latin1_unchecked(s.data(), needle.utf16(), needle.size());
+
+ QLatin1StringMatcher matcher(QLatin1StringView(reinterpret_cast<char *>(s.data()), s.size()),
+ cs);
+ while ((i = matcher.indexIn(haystack, i + 1)) != -1)
+ ++num;
+
+ return num;
}
-static inline bool qt_starts_with(QStringView haystack, QLatin1String needle, Qt::CaseSensitivity cs)
+qsizetype QtPrivate::count(QStringView haystack, QLatin1StringView needle, Qt::CaseSensitivity cs)
{
- return qt_starts_with_impl(haystack, needle, cs);
+ if (haystack.size() < needle.size())
+ return -1;
+
+ QVarLengthArray<char16_t> s = qt_from_latin1_to_qvla(needle);
+ return QtPrivate::count(haystack, QStringView(s.data(), s.size()), cs);
}
-static inline bool qt_starts_with(QStringView haystack, QChar needle, Qt::CaseSensitivity cs)
+qsizetype QtPrivate::count(QLatin1StringView haystack, QChar needle, Qt::CaseSensitivity cs) noexcept
{
- return haystack.size()
- && (cs == Qt::CaseSensitive ? haystack.front() == needle
- : foldCase(haystack.front()) == foldCase(needle));
+ // non-L1 needles cannot possibly match in L1-only haystacks
+ if (needle.unicode() > 0xff)
+ return 0;
+
+ if (cs == Qt::CaseSensitive) {
+ return std::count(haystack.cbegin(), haystack.cend(), needle.toLatin1());
+ } else {
+ return std::count_if(haystack.cbegin(), haystack.cend(),
+ CaseInsensitiveL1::matcher(needle.toLatin1()));
+ }
}
/*!
\fn bool QtPrivate::startsWith(QStringView haystack, QStringView needle, Qt::CaseSensitivity cs)
\since 5.10
- \fn bool QtPrivate::startsWith(QStringView haystack, QLatin1String needle, Qt::CaseSensitivity cs)
+ \fn bool QtPrivate::startsWith(QStringView haystack, QLatin1StringView needle, Qt::CaseSensitivity cs)
\since 5.10
- \fn bool QtPrivate::startsWith(QLatin1String haystack, QStringView needle, Qt::CaseSensitivity cs)
+ \fn bool QtPrivate::startsWith(QLatin1StringView haystack, QStringView needle, Qt::CaseSensitivity cs)
\since 5.10
- \fn bool QtPrivate::startsWith(QLatin1String haystack, QLatin1String needle, Qt::CaseSensitivity cs)
+ \fn bool QtPrivate::startsWith(QLatin1StringView haystack, QLatin1StringView needle, Qt::CaseSensitivity cs)
\since 5.10
\internal
\relates QStringView
@@ -10185,10 +9807,9 @@ static inline bool qt_starts_with(QStringView haystack, QChar needle, Qt::CaseSe
Returns \c true if \a haystack starts with \a needle,
otherwise returns \c false.
- If \a cs is Qt::CaseSensitive (the default), the search is case-sensitive;
- otherwise the search is case-insensitive.
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
- \sa QtPrivate::endsWith(), QString::endsWith(), QStringView::endsWith(), QLatin1String::endsWith()
+ \sa QtPrivate::endsWith(), QString::endsWith(), QStringView::endsWith(), QLatin1StringView::endsWith()
*/
bool QtPrivate::startsWith(QStringView haystack, QStringView needle, Qt::CaseSensitivity cs) noexcept
@@ -10196,61 +9817,29 @@ bool QtPrivate::startsWith(QStringView haystack, QStringView needle, Qt::CaseSen
return qt_starts_with_impl(haystack, needle, cs);
}
-bool QtPrivate::startsWith(QStringView haystack, QLatin1String needle, Qt::CaseSensitivity cs) noexcept
+bool QtPrivate::startsWith(QStringView haystack, QLatin1StringView needle, Qt::CaseSensitivity cs) noexcept
{
return qt_starts_with_impl(haystack, needle, cs);
}
-bool QtPrivate::startsWith(QLatin1String haystack, QStringView needle, Qt::CaseSensitivity cs) noexcept
+bool QtPrivate::startsWith(QLatin1StringView haystack, QStringView needle, Qt::CaseSensitivity cs) noexcept
{
return qt_starts_with_impl(haystack, needle, cs);
}
-bool QtPrivate::startsWith(QLatin1String haystack, QLatin1String needle, Qt::CaseSensitivity cs) noexcept
+bool QtPrivate::startsWith(QLatin1StringView haystack, QLatin1StringView needle, Qt::CaseSensitivity cs) noexcept
{
return qt_starts_with_impl(haystack, needle, cs);
}
-template <typename Haystack, typename Needle>
-bool qt_ends_with_impl(Haystack haystack, Needle needle, Qt::CaseSensitivity cs) noexcept
-{
- if (haystack.isNull())
- return needle.isNull();
- const auto haystackLen = haystack.size();
- const auto needleLen = needle.size();
- if (haystackLen == 0)
- return needleLen == 0;
- if (haystackLen < needleLen)
- return false;
-
- return QtPrivate::compareStrings(haystack.right(needleLen), needle, cs) == 0;
-}
-
-static inline bool qt_ends_with(QStringView haystack, QStringView needle, Qt::CaseSensitivity cs)
-{
- return qt_ends_with_impl(haystack, needle, cs);
-}
-
-static inline bool qt_ends_with(QStringView haystack, QLatin1String needle, Qt::CaseSensitivity cs)
-{
- return qt_ends_with_impl(haystack, needle, cs);
-}
-
-static inline bool qt_ends_with(QStringView haystack, QChar needle, Qt::CaseSensitivity cs)
-{
- return haystack.size()
- && (cs == Qt::CaseSensitive ? haystack.back() == needle
- : foldCase(haystack.back()) == foldCase(needle));
-}
-
/*!
\fn bool QtPrivate::endsWith(QStringView haystack, QStringView needle, Qt::CaseSensitivity cs)
\since 5.10
- \fn bool QtPrivate::endsWith(QStringView haystack, QLatin1String needle, Qt::CaseSensitivity cs)
+ \fn bool QtPrivate::endsWith(QStringView haystack, QLatin1StringView needle, Qt::CaseSensitivity cs)
\since 5.10
- \fn bool QtPrivate::endsWith(QLatin1String haystack, QStringView needle, Qt::CaseSensitivity cs)
+ \fn bool QtPrivate::endsWith(QLatin1StringView haystack, QStringView needle, Qt::CaseSensitivity cs)
\since 5.10
- \fn bool QtPrivate::endsWith(QLatin1String haystack, QLatin1String needle, Qt::CaseSensitivity cs)
+ \fn bool QtPrivate::endsWith(QLatin1StringView haystack, QLatin1StringView needle, Qt::CaseSensitivity cs)
\since 5.10
\internal
\relates QStringView
@@ -10258,10 +9847,9 @@ static inline bool qt_ends_with(QStringView haystack, QChar needle, Qt::CaseSens
Returns \c true if \a haystack ends with \a needle,
otherwise returns \c false.
- If \a cs is Qt::CaseSensitive (the default), the search is case-sensitive;
- otherwise the search is case-insensitive.
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
- \sa QtPrivate::startsWith(), QString::endsWith(), QStringView::endsWith(), QLatin1String::endsWith()
+ \sa QtPrivate::startsWith(), QString::endsWith(), QStringView::endsWith(), QLatin1StringView::endsWith()
*/
bool QtPrivate::endsWith(QStringView haystack, QStringView needle, Qt::CaseSensitivity cs) noexcept
@@ -10269,93 +9857,27 @@ bool QtPrivate::endsWith(QStringView haystack, QStringView needle, Qt::CaseSensi
return qt_ends_with_impl(haystack, needle, cs);
}
-bool QtPrivate::endsWith(QStringView haystack, QLatin1String needle, Qt::CaseSensitivity cs) noexcept
+bool QtPrivate::endsWith(QStringView haystack, QLatin1StringView needle, Qt::CaseSensitivity cs) noexcept
{
return qt_ends_with_impl(haystack, needle, cs);
}
-bool QtPrivate::endsWith(QLatin1String haystack, QStringView needle, Qt::CaseSensitivity cs) noexcept
+bool QtPrivate::endsWith(QLatin1StringView haystack, QStringView needle, Qt::CaseSensitivity cs) noexcept
{
return qt_ends_with_impl(haystack, needle, cs);
}
-bool QtPrivate::endsWith(QLatin1String haystack, QLatin1String needle, Qt::CaseSensitivity cs) noexcept
+bool QtPrivate::endsWith(QLatin1StringView haystack, QLatin1StringView needle, Qt::CaseSensitivity cs) noexcept
{
return qt_ends_with_impl(haystack, needle, cs);
}
-namespace {
-template <typename Pointer>
-char32_t foldCaseHelper(Pointer ch, Pointer start) = delete;
-
-template <>
-char32_t foldCaseHelper<const QChar*>(const QChar* ch, const QChar* start)
-{
- return foldCase(reinterpret_cast<const char16_t*>(ch),
- reinterpret_cast<const char16_t*>(start));
-}
-
-template <>
-char32_t foldCaseHelper<const char*>(const char* ch, const char*)
-{
- return foldCase(char16_t(uchar(*ch)));
-}
-
-template <typename T>
-char16_t valueTypeToUtf16(T t) = delete;
-
-template <>
-char16_t valueTypeToUtf16<QChar>(QChar t)
-{
- return t.unicode();
-}
-
-template <>
-char16_t valueTypeToUtf16<char>(char t)
-{
- return char16_t{uchar(t)};
-}
-}
-
-/*!
- \internal
-
- Returns the index position of the first occurrence of the
- character \a ch in the string given by \a str and \a len,
- searching forward from index
- position \a from. Returns -1 if \a ch could not be found.
-*/
-
-static inline qsizetype qFindChar(QStringView str, QChar ch, qsizetype from, Qt::CaseSensitivity cs) noexcept
-{
- if (-from > str.size())
- return -1;
- if (from < 0)
- from = qMax(from + str.size(), qsizetype(0));
- if (from < str.size()) {
- const char16_t *s = str.utf16();
- char16_t c = ch.unicode();
- const char16_t *n = s + from;
- const char16_t *e = s + str.size();
- if (cs == Qt::CaseSensitive) {
- n = QtPrivate::qustrchr(QStringView(n, e), c);
- if (n != e)
- return n - s;
- } else {
- c = foldCase(c);
- --n;
- while (++n != e)
- if (foldCase(*n) == c)
- return n - s;
- }
- }
- return -1;
-}
-
qsizetype QtPrivate::findString(QStringView haystack0, qsizetype from, QStringView needle0, Qt::CaseSensitivity cs) noexcept
{
const qsizetype l = haystack0.size();
const qsizetype sl = needle0.size();
+ if (sl == 1)
+ return findString(haystack0, from, needle0[0], cs);
if (from < 0)
from += l;
if (std::size_t(sl + from) > std::size_t(l))
@@ -10365,9 +9887,6 @@ qsizetype QtPrivate::findString(QStringView haystack0, qsizetype from, QStringVi
if (!l)
return -1;
- if (sl == 1)
- return qFindChar(haystack0, needle0[0], from, cs);
-
/*
We use the Boyer-Moore algorithm in cases where the overhead
for the skip table should pay off, otherwise we use a simple
@@ -10427,120 +9946,34 @@ qsizetype QtPrivate::findString(QStringView haystack0, qsizetype from, QStringVi
return -1;
}
-template <typename Haystack>
-static inline qsizetype qLastIndexOf(Haystack haystack, QChar needle,
- qsizetype from, Qt::CaseSensitivity cs) noexcept
-{
- if (haystack.size() == 0)
- return -1;
- if (from < 0)
- from += haystack.size();
- else if (std::size_t(from) > std::size_t(haystack.size()))
- from = haystack.size() - 1;
- if (from >= 0) {
- char16_t c = needle.unicode();
- const auto b = haystack.data();
- auto n = b + from;
- if (cs == Qt::CaseSensitive) {
- for (; n >= b; --n)
- if (valueTypeToUtf16(*n) == c)
- return n - b;
- } else {
- c = foldCase(c);
- for (; n >= b; --n)
- if (foldCase(valueTypeToUtf16(*n)) == c)
- return n - b;
- }
- }
- return -1;
-}
-
-template<typename Haystack, typename Needle>
-static qsizetype qLastIndexOf(Haystack haystack0, qsizetype from,
- Needle needle0, Qt::CaseSensitivity cs) noexcept
-{
- const qsizetype sl = needle0.size();
- if (sl == 1)
- return qLastIndexOf(haystack0, needle0.front(), from, cs);
-
- const qsizetype l = haystack0.size();
- if (from < 0)
- from += l;
- if (from == l && sl == 0)
- return from;
- const qsizetype delta = l - sl;
- if (std::size_t(from) > std::size_t(l) || delta < 0)
- return -1;
- if (from > delta)
- from = delta;
-
- auto sv = [sl](const typename Haystack::value_type *v) { return Haystack(v, sl); };
-
- auto haystack = haystack0.data();
- const auto needle = needle0.data();
- const auto *end = haystack;
- haystack += from;
- const std::size_t sl_minus_1 = sl - 1;
- const auto *n = needle + sl_minus_1;
- const auto *h = haystack + sl_minus_1;
- std::size_t hashNeedle = 0, hashHaystack = 0;
- qsizetype idx;
-
- if (cs == Qt::CaseSensitive) {
- for (idx = 0; idx < sl; ++idx) {
- hashNeedle = (hashNeedle << 1) + valueTypeToUtf16(*(n - idx));
- hashHaystack = (hashHaystack << 1) + valueTypeToUtf16(*(h - idx));
- }
- hashHaystack -= valueTypeToUtf16(*haystack);
-
- while (haystack >= end) {
- hashHaystack += valueTypeToUtf16(*haystack);
- if (hashHaystack == hashNeedle
- && QtPrivate::compareStrings(needle0, sv(haystack), Qt::CaseSensitive) == 0)
- return haystack - end;
- --haystack;
- REHASH(valueTypeToUtf16(haystack[sl]));
- }
- } else {
- for (idx = 0; idx < sl; ++idx) {
- hashNeedle = (hashNeedle << 1) + foldCaseHelper(n - idx, needle);
- hashHaystack = (hashHaystack << 1) + foldCaseHelper(h - idx, end);
- }
- hashHaystack -= foldCaseHelper(haystack, end);
-
- while (haystack >= end) {
- hashHaystack += foldCaseHelper(haystack, end);
- if (hashHaystack == hashNeedle
- && QtPrivate::compareStrings(sv(haystack), needle0, Qt::CaseInsensitive) == 0)
- return haystack - end;
- --haystack;
- REHASH(foldCaseHelper(haystack + sl, end));
- }
- }
- return -1;
-}
-
-qsizetype QtPrivate::findString(QStringView haystack, qsizetype from, QLatin1String needle, Qt::CaseSensitivity cs) noexcept
+qsizetype QtPrivate::findString(QStringView haystack, qsizetype from, QLatin1StringView needle, Qt::CaseSensitivity cs) noexcept
{
if (haystack.size() < needle.size())
return -1;
- QVarLengthArray<char16_t> s(needle.size());
- qt_from_latin1(s.data(), needle.latin1(), needle.size());
+ QVarLengthArray<char16_t> s = qt_from_latin1_to_qvla(needle);
return QtPrivate::findString(haystack, from, QStringView(reinterpret_cast<const QChar*>(s.constData()), s.size()), cs);
}
-qsizetype QtPrivate::findString(QLatin1String haystack, qsizetype from, QStringView needle, Qt::CaseSensitivity cs) noexcept
+qsizetype QtPrivate::findString(QLatin1StringView haystack, qsizetype from, QStringView needle, Qt::CaseSensitivity cs) noexcept
{
if (haystack.size() < needle.size())
return -1;
- QVarLengthArray<char16_t> s(haystack.size());
- qt_from_latin1(s.data(), haystack.latin1(), haystack.size());
- return QtPrivate::findString(QStringView(reinterpret_cast<const QChar*>(s.constData()), s.size()), from, needle, cs);
+ if (!QtPrivate::isLatin1(needle)) // won't find non-L1 UTF-16 needles in a L1 haystack!
+ return -1;
+
+ if (needle.size() == 1) {
+ const char n = needle.front().toLatin1();
+ return QtPrivate::findString(haystack, from, QLatin1StringView(&n, 1), cs);
+ }
+
+ QVarLengthArray<char> s(needle.size());
+ qt_to_latin1_unchecked(reinterpret_cast<uchar *>(s.data()), needle.utf16(), needle.size());
+ return QtPrivate::findString(haystack, from, QLatin1StringView(s.data(), s.size()), cs);
}
-qsizetype QtPrivate::findString(QLatin1String haystack, qsizetype from, QLatin1String needle, Qt::CaseSensitivity cs) noexcept
+qsizetype QtPrivate::findString(QLatin1StringView haystack, qsizetype from, QLatin1StringView needle, Qt::CaseSensitivity cs) noexcept
{
if (from < 0)
from += haystack.size();
@@ -10553,8 +9986,16 @@ qsizetype QtPrivate::findString(QLatin1String haystack, qsizetype from, QLatin1S
return from;
if (cs == Qt::CaseSensitive) {
- const QByteArrayMatcher matcher(needle.data(), needle.size());
- return matcher.indexIn(haystack.data(), haystack.size(), from);
+
+ if (needle.size() == 1) {
+ Q_ASSERT(haystack.data() != nullptr); // see size check above
+ if (auto it = memchr(haystack.data() + from, needle.front().toLatin1(), adjustedSize))
+ return static_cast<const char *>(it) - haystack.data();
+ return -1;
+ }
+
+ const QLatin1StringMatcher matcher(needle, Qt::CaseSensitivity::CaseSensitive);
+ return matcher.indexIn(haystack, from);
}
// If the needle is sufficiently small we simply iteratively search through
@@ -10574,41 +10015,24 @@ qsizetype QtPrivate::findString(QLatin1String haystack, qsizetype from, QLatin1S
if (needle.size() <= threshold) {
const auto begin = haystack.begin();
const auto end = haystack.end() - needle.size() + 1;
- const uchar needle1 = latin1Lower[uchar(needle[0].toLatin1())];
- auto ciMatch = [needle1](const char ch) {
- return latin1Lower[uchar(ch)] == needle1;
- };
+ auto ciMatch = CaseInsensitiveL1::matcher(needle[0].toLatin1());
const qsizetype nlen1 = needle.size() - 1;
- for (auto it = std::find_if(begin + from, end, ciMatch); it < end;
+ for (auto it = std::find_if(begin + from, end, ciMatch); it != end;
it = std::find_if(it + 1, end, ciMatch)) {
// In this comparison we skip the first character because we know it's a match
- if (!nlen1 || QLatin1String(it + 1, nlen1).compare(needle.sliced(1), cs) == 0)
+ if (!nlen1 || QLatin1StringView(it + 1, nlen1).compare(needle.sliced(1), cs) == 0)
return std::distance(begin, it);
}
return -1;
}
-#if QT_CONFIG(cxx17_bm_searcher)
- const auto ciHasher = [](char a) { return latin1Lower[uchar(a)]; };
- const auto ciEqual = [](char a, char b) {
- return latin1Lower[uchar(a)] == latin1Lower[uchar(b)];
- };
- const auto it =
- std::search(haystack.begin() + from, haystack.end(),
- std::boyer_moore_searcher(needle.begin(), needle.end(), ciHasher, ciEqual));
- return it == haystack.end() ? -1 : std::distance(haystack.begin(), it);
-#else
- QVarLengthArray<char16_t> h(adjustedSize);
- const auto begin = haystack.end() - adjustedSize;
- qt_from_latin1(h.data(), begin, adjustedSize);
- QVarLengthArray<char16_t> n(needle.size());
- qt_from_latin1(n.data(), needle.latin1(), needle.size());
- qsizetype res = QtPrivate::findString(QStringView(h.constData(), h.size()), 0,
- QStringView(n.constData(), n.size()), cs);
- if (res == -1)
- return -1;
- return res + std::distance(haystack.begin(), begin);
-#endif
+ QLatin1StringMatcher matcher(needle, Qt::CaseSensitivity::CaseInsensitive);
+ return matcher.indexIn(haystack, from);
+}
+
+qsizetype QtPrivate::lastIndexOf(QStringView haystack, qsizetype from, char16_t needle, Qt::CaseSensitivity cs) noexcept
+{
+ return qLastIndexOf(haystack, QChar(needle), from, cs);
}
qsizetype QtPrivate::lastIndexOf(QStringView haystack, qsizetype from, QStringView needle, Qt::CaseSensitivity cs) noexcept
@@ -10616,30 +10040,32 @@ qsizetype QtPrivate::lastIndexOf(QStringView haystack, qsizetype from, QStringVi
return qLastIndexOf(haystack, from, needle, cs);
}
-qsizetype QtPrivate::lastIndexOf(QStringView haystack, qsizetype from, QLatin1String needle, Qt::CaseSensitivity cs) noexcept
+qsizetype QtPrivate::lastIndexOf(QStringView haystack, qsizetype from, QLatin1StringView needle, Qt::CaseSensitivity cs) noexcept
{
return qLastIndexOf(haystack, from, needle, cs);
}
-qsizetype QtPrivate::lastIndexOf(QLatin1String haystack, qsizetype from, QStringView needle, Qt::CaseSensitivity cs) noexcept
+qsizetype QtPrivate::lastIndexOf(QLatin1StringView haystack, qsizetype from, QStringView needle, Qt::CaseSensitivity cs) noexcept
{
return qLastIndexOf(haystack, from, needle, cs);
}
-qsizetype QtPrivate::lastIndexOf(QLatin1String haystack, qsizetype from, QLatin1String needle, Qt::CaseSensitivity cs) noexcept
+qsizetype QtPrivate::lastIndexOf(QLatin1StringView haystack, qsizetype from, QLatin1StringView needle, Qt::CaseSensitivity cs) noexcept
{
return qLastIndexOf(haystack, from, needle, cs);
}
#if QT_CONFIG(regularexpression)
-qsizetype QtPrivate::indexOf(QStringView haystack, const QRegularExpression &re, qsizetype from, QRegularExpressionMatch *rmatch)
+qsizetype QtPrivate::indexOf(QStringView viewHaystack, const QString *stringHaystack, const QRegularExpression &re, qsizetype from, QRegularExpressionMatch *rmatch)
{
if (!re.isValid()) {
- qWarning("QString(View)::indexOf: invalid QRegularExpression object");
+ qtWarnAboutInvalidRegularExpression(re.pattern(), "QString(View)::indexOf");
return -1;
}
- QRegularExpressionMatch match = re.match(haystack, from);
+ QRegularExpressionMatch match = stringHaystack
+ ? re.match(*stringHaystack, from)
+ : re.matchView(viewHaystack, from);
if (match.hasMatch()) {
const qsizetype ret = match.capturedStart();
if (rmatch)
@@ -10650,15 +10076,22 @@ qsizetype QtPrivate::indexOf(QStringView haystack, const QRegularExpression &re,
return -1;
}
-qsizetype QtPrivate::lastIndexOf(QStringView haystack, const QRegularExpression &re, qsizetype from, QRegularExpressionMatch *rmatch)
+qsizetype QtPrivate::indexOf(QStringView haystack, const QRegularExpression &re, qsizetype from, QRegularExpressionMatch *rmatch)
+{
+ return indexOf(haystack, nullptr, re, from, rmatch);
+}
+
+qsizetype QtPrivate::lastIndexOf(QStringView viewHaystack, const QString *stringHaystack, const QRegularExpression &re, qsizetype from, QRegularExpressionMatch *rmatch)
{
if (!re.isValid()) {
- qWarning("QString(View)::lastIndexOf: invalid QRegularExpression object");
+ qtWarnAboutInvalidRegularExpression(re.pattern(), "QString(View)::lastIndexOf");
return -1;
}
- qsizetype endpos = (from < 0) ? (haystack.size() + from + 1) : (from + 1);
- QRegularExpressionMatchIterator iterator = re.globalMatch(haystack);
+ qsizetype endpos = (from < 0) ? (viewHaystack.size() + from + 1) : (from + 1);
+ QRegularExpressionMatchIterator iterator = stringHaystack
+ ? re.globalMatch(*stringHaystack)
+ : re.globalMatchView(viewHaystack);
qsizetype lastIndex = -1;
while (iterator.hasNext()) {
QRegularExpressionMatch match = iterator.next();
@@ -10675,34 +10108,52 @@ qsizetype QtPrivate::lastIndexOf(QStringView haystack, const QRegularExpression
return lastIndex;
}
-bool QtPrivate::contains(QStringView haystack, const QRegularExpression &re, QRegularExpressionMatch *rmatch)
+qsizetype QtPrivate::lastIndexOf(QStringView haystack, const QRegularExpression &re, qsizetype from, QRegularExpressionMatch *rmatch)
+{
+ return lastIndexOf(haystack, nullptr, re, from, rmatch);
+}
+
+bool QtPrivate::contains(QStringView viewHaystack, const QString *stringHaystack, const QRegularExpression &re, QRegularExpressionMatch *rmatch)
{
if (!re.isValid()) {
- qWarning("QString(View)::contains: invalid QRegularExpression object");
+ qtWarnAboutInvalidRegularExpression(re.pattern(), "QString(View)::contains");
return false;
}
- QRegularExpressionMatch m = re.match(haystack);
+ QRegularExpressionMatch m = stringHaystack
+ ? re.match(*stringHaystack)
+ : re.matchView(viewHaystack);
bool hasMatch = m.hasMatch();
if (hasMatch && rmatch)
*rmatch = std::move(m);
return hasMatch;
}
+bool QtPrivate::contains(QStringView haystack, const QRegularExpression &re, QRegularExpressionMatch *rmatch)
+{
+ return contains(haystack, nullptr, re, rmatch);
+}
+
qsizetype QtPrivate::count(QStringView haystack, const QRegularExpression &re)
{
if (!re.isValid()) {
- qWarning("QString(View)::count: invalid QRegularExpression object");
+ qtWarnAboutInvalidRegularExpression(re.pattern(), "QString(View)::count");
return 0;
}
qsizetype count = 0;
qsizetype index = -1;
- qsizetype len = haystack.length();
+ qsizetype len = haystack.size();
while (index <= len - 1) {
- QRegularExpressionMatch match = re.match(haystack, index + 1);
+ QRegularExpressionMatch match = re.matchView(haystack, index + 1);
if (!match.hasMatch())
break;
- index = match.capturedStart();
count++;
+
+ // Search again, from the next character after the beginning of this
+ // capture. If the capture starts with a surrogate pair, both together
+ // count as "one character".
+ index = match.capturedStart();
+ if (index < len && haystack[index].isHighSurrogate())
+ ++index;
}
return count;
}
@@ -10722,20 +10173,24 @@ qsizetype QtPrivate::count(QStringView haystack, const QRegularExpression &re)
*/
QString QString::toHtmlEscaped() const
{
+ const auto pos = std::u16string_view(*this).find_first_of(u"<>&\"");
+ if (pos == std::u16string_view::npos)
+ return *this;
QString rich;
- const int len = length();
+ const qsizetype len = size();
rich.reserve(qsizetype(len * 1.1));
- for (int i = 0; i < len; ++i) {
- if (at(i) == QLatin1Char('<'))
- rich += QLatin1String("&lt;");
- else if (at(i) == QLatin1Char('>'))
- rich += QLatin1String("&gt;");
- else if (at(i) == QLatin1Char('&'))
- rich += QLatin1String("&amp;");
- else if (at(i) == QLatin1Char('"'))
- rich += QLatin1String("&quot;");
+ rich += qToStringViewIgnoringNull(*this).first(pos);
+ for (auto ch : qToStringViewIgnoringNull(*this).sliced(pos)) {
+ if (ch == u'<')
+ rich += "&lt;"_L1;
+ else if (ch == u'>')
+ rich += "&gt;"_L1;
+ else if (ch == u'&')
+ rich += "&amp;"_L1;
+ else if (ch == u'"')
+ rich += "&quot;"_L1;
else
- rich += at(i);
+ rich += ch;
}
rich.squeeze();
return rich;
@@ -10770,10 +10225,10 @@ QString QString::toHtmlEscaped() const
significantly speed up creation of QString instances from data known at
compile time.
- \note QLatin1String can still be more efficient than QStringLiteral
+ \note QLatin1StringView can still be more efficient than QStringLiteral
when the string is passed to a function that has an overload taking
- QLatin1String and this overload avoids conversion to QString. For
- instance, QString::operator==() can compare to a QLatin1String
+ QLatin1StringView and this overload avoids conversion to QString. For
+ instance, QString::operator==() can compare to a QLatin1StringView
directly:
\snippet code/src_corelib_text_qstring.cpp 11
@@ -10785,11 +10240,13 @@ QString QString::toHtmlEscaped() const
\sa QByteArrayLiteral
*/
+#if QT_DEPRECATED_SINCE(6, 8)
/*!
\fn QtLiterals::operator""_qs(const char16_t *str, size_t size)
\relates QString
\since 6.2
+ \deprecated [6.8] Use \c _s from Qt::StringLiterals namespace instead.
Literal operator that creates a QString out of the first \a size characters in
the char16_t string literal \a str.
@@ -10807,25 +10264,41 @@ QString QString::toHtmlEscaped() const
\sa QStringLiteral, QtLiterals::operator""_qba(const char *str, size_t size)
*/
+#endif // QT_DEPRECATED_SINCE(6, 8)
+
+/*!
+ \fn Qt::Literals::StringLiterals::operator""_s(const char16_t *str, size_t size)
+
+ \relates QString
+ \since 6.4
+
+ Literal operator that creates a QString out of the first \a size characters in
+ the char16_t string literal \a str.
+
+ The QString is created at compile time, and the generated string data is stored
+ in the read-only segment of the compiled object file. Duplicate literals may
+ share the same read-only memory. This functionality is interchangeable with
+ QStringLiteral, but saves typing when many string literals are present in the
+ code.
+
+ The following code creates a QString:
+ \code
+ using namespace Qt::Literals::StringLiterals;
+
+ auto str = u"hello"_s;
+ \endcode
+
+ \sa Qt::Literals::StringLiterals
+*/
/*!
\internal
*/
-void QAbstractConcatenable::appendLatin1To(QLatin1String in, QChar *out) noexcept
+void QAbstractConcatenable::appendLatin1To(QLatin1StringView in, QChar *out) noexcept
{
qt_from_latin1(reinterpret_cast<char16_t *>(out), in.data(), size_t(in.size()));
}
-double QStringView::toDouble(bool *ok) const
-{
- return QLocaleData::c()->stringToDouble(*this, ok, QLocale::RejectGroupSeparator);
-}
-
-float QStringView::toFloat(bool *ok) const
-{
- return QLocaleData::convertDoubleToFloat(toDouble(ok), ok);
-}
-
/*!
\fn template <typename T> qsizetype erase(QString &s, const T &t)
\relates QString
@@ -10849,4 +10322,67 @@ float QStringView::toFloat(bool *ok) const
\sa erase
*/
+/*!
+ \macro const char *qPrintable(const QString &str)
+ \relates QString
+
+ Returns \a str as a \c{const char *}. This is equivalent to
+ \a{str}.toLocal8Bit().constData().
+
+ The char pointer will be invalid after the statement in which
+ qPrintable() is used. This is because the array returned by
+ QString::toLocal8Bit() will fall out of scope.
+
+ \note qDebug(), qInfo(), qWarning(), qCritical(), qFatal() expect
+ %s arguments to be UTF-8 encoded, while qPrintable() converts to
+ local 8-bit encoding. Therefore qUtf8Printable() should be used
+ for logging strings instead of qPrintable().
+
+ \sa qUtf8Printable()
+*/
+
+/*!
+ \macro const char *qUtf8Printable(const QString &str)
+ \relates QString
+ \since 5.4
+
+ Returns \a str as a \c{const char *}. This is equivalent to
+ \a{str}.toUtf8().constData().
+
+ The char pointer will be invalid after the statement in which
+ qUtf8Printable() is used. This is because the array returned by
+ QString::toUtf8() will fall out of scope.
+
+ Example:
+
+ \snippet code/src_corelib_text_qstring.cpp qUtf8Printable
+
+ \sa qPrintable(), qDebug(), qInfo(), qWarning(), qCritical(), qFatal()
+*/
+
+/*!
+ \macro const wchar_t *qUtf16Printable(const QString &str)
+ \relates QString
+ \since 5.7
+
+ Returns \a str as a \c{const ushort *}, but cast to a \c{const wchar_t *}
+ to avoid warnings. This is equivalent to \a{str}.utf16() plus some casting.
+
+ The only useful thing you can do with the return value of this macro is to
+ pass it to QString::asprintf() for use in a \c{%ls} conversion. In particular,
+ the return value is \e{not} a valid \c{const wchar_t*}!
+
+ In general, the pointer will be invalid after the statement in which
+ qUtf16Printable() is used. This is because the pointer may have been
+ obtained from a temporary expression, which will fall out of scope.
+
+ Example:
+
+ \snippet code/src_corelib_text_qstring.cpp qUtf16Printable
+
+ \sa qPrintable(), qDebug(), qInfo(), qWarning(), qCritical(), qFatal()
+*/
+
QT_END_NAMESPACE
+
+#undef REHASH
diff --git a/src/corelib/text/qstring.h b/src/corelib/text/qstring.h
index f53cb869c5..895ec4b5c0 100644
--- a/src/corelib/text/qstring.h
+++ b/src/corelib/text/qstring.h
@@ -1,44 +1,8 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Copyright (C) 2019 Intel Corporation.
-** Copyright (C) 2019 Mail.ru Group.
-** Copyright (C) 2020 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// Copyright (C) 2019 Intel Corporation.
+// Copyright (C) 2019 Mail.ru Group.
+// Copyright (C) 2020 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QSTRING_H
#define QSTRING_H
@@ -48,8 +12,11 @@
#endif
#include <QtCore/qchar.h>
+#include <QtCore/qcompare.h>
#include <QtCore/qbytearray.h>
+#include <QtCore/qbytearrayview.h>
#include <QtCore/qarraydata.h>
+#include <QtCore/qlatin1stringview.h>
#include <QtCore/qnamespace.h>
#include <QtCore/qstringliteral.h>
#include <QtCore/qstringalgorithms.h>
@@ -58,6 +25,8 @@
#include <string>
#include <iterator>
+#include <QtCore/q20memory.h>
+#include <string_view>
#include <stdarg.h>
@@ -70,6 +39,8 @@ Q_FORWARD_DECLARE_CF_TYPE(CFString);
Q_FORWARD_DECLARE_OBJC_CLASS(NSString);
#endif
+class tst_QString;
+
QT_BEGIN_NAMESPACE
class QRegularExpression;
@@ -78,301 +49,57 @@ class QString;
namespace QtPrivate {
template <bool...B> class BoolList;
-}
-
-class QLatin1String
-{
-public:
- constexpr inline QLatin1String() noexcept : m_size(0), m_data(nullptr) {}
- constexpr inline explicit QLatin1String(const char *s) noexcept : m_size(s ? qsizetype(strlen(s)) : 0), m_data(s) {}
- constexpr explicit QLatin1String(const char *f, const char *l)
- : QLatin1String(f, qsizetype(l - f)) {}
- constexpr inline explicit QLatin1String(const char *s, qsizetype sz) noexcept : m_size(sz), m_data(s) {}
- explicit QLatin1String(const QByteArray &s) noexcept : m_size(s.size()), m_data(s.constData()) {}
- constexpr explicit QLatin1String(QByteArrayView s) noexcept : m_size(s.size()), m_data(s.data()) {}
-
- inline QString toString() const;
-
- constexpr const char *latin1() const noexcept { return m_data; }
- constexpr qsizetype size() const noexcept { return m_size; }
- constexpr const char *data() const noexcept { return m_data; }
-
- constexpr bool isNull() const noexcept { return !data(); }
- constexpr bool isEmpty() const noexcept { return !size(); }
-
- template <typename...Args>
- [[nodiscard]] inline QString arg(Args &&...args) const;
-
- [[nodiscard]] constexpr QLatin1Char at(qsizetype i) const
- { return Q_ASSERT(i >= 0), Q_ASSERT(i < size()), QLatin1Char(m_data[i]); }
- [[nodiscard]] constexpr QLatin1Char operator[](qsizetype i) const { return at(i); }
-
- [[nodiscard]] constexpr QLatin1Char front() const { return at(0); }
- [[nodiscard]] constexpr QLatin1Char back() const { return at(size() - 1); }
-
- [[nodiscard]] int compare(QStringView other, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
- { return QtPrivate::compareStrings(*this, other, cs); }
- [[nodiscard]] int compare(QLatin1String other, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
- { return QtPrivate::compareStrings(*this, other, cs); }
- [[nodiscard]] constexpr int compare(QChar c) const noexcept
- { return isEmpty() || front() == c ? size() - 1 : uchar(m_data[0]) - c.unicode() ; }
- [[nodiscard]] int compare(QChar c, Qt::CaseSensitivity cs) const noexcept
- { return QtPrivate::compareStrings(*this, QStringView(&c, 1), cs); }
- [[nodiscard]] int compare(QLatin1Char c, Qt::CaseSensitivity cs) const noexcept
- { char ch = c.toLatin1(); return QtPrivate::compareStrings(*this, QLatin1String(&ch, 1), cs); }
-
- [[nodiscard]] bool startsWith(QStringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
- { return QtPrivate::startsWith(*this, s, cs); }
- [[nodiscard]] bool startsWith(QLatin1String s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
- { return QtPrivate::startsWith(*this, s, cs); }
- [[nodiscard]] constexpr bool startsWith(QChar c) const noexcept
- { return !isEmpty() && front() == c; }
- [[nodiscard]] inline bool startsWith(QChar c, Qt::CaseSensitivity cs) const noexcept
- { return QtPrivate::startsWith(*this, QStringView(&c, 1), cs); }
- [[nodiscard]] inline bool startsWith(QLatin1Char c, Qt::CaseSensitivity cs) const noexcept
- { char ch = c.toLatin1(); return QtPrivate::startsWith(*this, QLatin1String(&ch, 1), cs); }
-
- [[nodiscard]] bool endsWith(QStringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
- { return QtPrivate::endsWith(*this, s, cs); }
- [[nodiscard]] bool endsWith(QLatin1String s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
- { return QtPrivate::endsWith(*this, s, cs); }
- [[nodiscard]] constexpr bool endsWith(QChar c) const noexcept
- { return !isEmpty() && back() == c; }
- [[nodiscard]] inline bool endsWith(QChar c, Qt::CaseSensitivity cs) const noexcept
- { return QtPrivate::endsWith(*this, QStringView(&c, 1), cs); }
- [[nodiscard]] inline bool endsWith(QLatin1Char c, Qt::CaseSensitivity cs) const noexcept
- { char ch = c.toLatin1(); return QtPrivate::endsWith(*this, QLatin1String(&ch, 1), cs); }
-
- [[nodiscard]] qsizetype indexOf(QStringView s, qsizetype from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
- { return QtPrivate::findString(*this, from, s, cs); }
- [[nodiscard]] qsizetype indexOf(QLatin1String s, qsizetype from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
- { return QtPrivate::findString(*this, from, s, cs); }
- [[nodiscard]] qsizetype indexOf(QChar c, qsizetype from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
- { return QtPrivate::findString(*this, from, QStringView(&c, 1), cs); }
- [[nodiscard]] qsizetype indexOf(QLatin1Char c, qsizetype from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
- { char ch = c.toLatin1(); return QtPrivate::findString(*this, from, QLatin1String(&ch, 1), cs); }
-
- [[nodiscard]] bool contains(QStringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
- { return indexOf(s, 0, cs) != -1; }
- [[nodiscard]] bool contains(QLatin1String s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
- { return indexOf(s, 0, cs) != -1; }
- [[nodiscard]] inline bool contains(QChar c, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
- { return indexOf(QStringView(&c, 1), 0, cs) != -1; }
- [[nodiscard]] inline bool contains(QLatin1Char c, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
- { char ch = c.toLatin1(); return indexOf(QLatin1String(&ch, 1), 0, cs) != -1; }
-
- [[nodiscard]] qsizetype lastIndexOf(QStringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
- { return lastIndexOf(s, size(), cs); }
- [[nodiscard]] qsizetype lastIndexOf(QStringView s, qsizetype from, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
- { return QtPrivate::lastIndexOf(*this, from, s, cs); }
- [[nodiscard]] qsizetype lastIndexOf(QLatin1String s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
- { return lastIndexOf(s, size(), cs); }
- [[nodiscard]] qsizetype lastIndexOf(QLatin1String s, qsizetype from, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
- { return QtPrivate::lastIndexOf(*this, from, s, cs); }
- [[nodiscard]] qsizetype lastIndexOf(QChar c, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
- { return lastIndexOf(c, -1, cs); }
- [[nodiscard]] qsizetype lastIndexOf(QChar c, qsizetype from, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
- { return QtPrivate::lastIndexOf(*this, from, QStringView(&c, 1), cs); }
- [[nodiscard]] qsizetype lastIndexOf(QLatin1Char c, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
- { return lastIndexOf(c, -1, cs); }
- [[nodiscard]] qsizetype lastIndexOf(QLatin1Char c, qsizetype from, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
- { char ch = c.toLatin1(); return QtPrivate::lastIndexOf(*this, from, QLatin1String(&ch, 1), cs); }
-
- using value_type = const char;
- using reference = value_type&;
- using const_reference = reference;
- using iterator = value_type*;
- using const_iterator = iterator;
- using difference_type = qsizetype; // violates Container concept requirements
- using size_type = qsizetype; // violates Container concept requirements
-
- constexpr const_iterator begin() const noexcept { return data(); }
- constexpr const_iterator cbegin() const noexcept { return data(); }
- constexpr const_iterator end() const noexcept { return data() + size(); }
- constexpr const_iterator cend() const noexcept { return data() + size(); }
-
- using reverse_iterator = std::reverse_iterator<iterator>;
- using const_reverse_iterator = reverse_iterator;
-
- const_reverse_iterator rbegin() const noexcept { return const_reverse_iterator(end()); }
- const_reverse_iterator crbegin() const noexcept { return const_reverse_iterator(end()); }
- const_reverse_iterator rend() const noexcept { return const_reverse_iterator(begin()); }
- const_reverse_iterator crend() const noexcept { return const_reverse_iterator(begin()); }
-
- [[nodiscard]] constexpr QLatin1String mid(qsizetype pos, qsizetype n = -1) const
- {
- using namespace QtPrivate;
- auto result = QContainerImplHelper::mid(size(), &pos, &n);
- return result == QContainerImplHelper::Null ? QLatin1String() : QLatin1String(m_data + pos, n);
- }
- [[nodiscard]] constexpr QLatin1String left(qsizetype n) const
- {
- if (size_t(n) >= size_t(size()))
- n = size();
- return QLatin1String(m_data, n);
- }
- [[nodiscard]] constexpr QLatin1String right(qsizetype n) const
- {
- if (size_t(n) >= size_t(size()))
- n = size();
- return QLatin1String(m_data + m_size - n, n);
- }
-
- [[nodiscard]] constexpr QLatin1String sliced(qsizetype pos) const
- { verify(pos); return QLatin1String(m_data + pos, m_size - pos); }
- [[nodiscard]] constexpr QLatin1String sliced(qsizetype pos, qsizetype n) const
- { verify(pos, n); return QLatin1String(m_data + pos, n); }
- [[nodiscard]] constexpr QLatin1String first(qsizetype n) const
- { verify(n); return QLatin1String(m_data, n); }
- [[nodiscard]] constexpr QLatin1String last(qsizetype n) const
- { verify(n); return QLatin1String(m_data + size() - n, n); }
- [[nodiscard]] constexpr QLatin1String chopped(qsizetype n) const
- { verify(n); return QLatin1String(m_data, size() - n); }
-
- constexpr void chop(qsizetype n)
- { verify(n); m_size -= n; }
- constexpr void truncate(qsizetype n)
- { verify(n); m_size = n; }
-
- [[nodiscard]] QLatin1String trimmed() const noexcept { return QtPrivate::trimmed(*this); }
-
- template <typename Needle, typename...Flags>
- [[nodiscard]] inline constexpr auto tokenize(Needle &&needle, Flags...flags) const
- noexcept(noexcept(qTokenize(std::declval<const QLatin1String &>(), std::forward<Needle>(needle), flags...)))
- -> decltype(qTokenize(*this, std::forward<Needle>(needle), flags...))
- { return qTokenize(*this, std::forward<Needle>(needle), flags...); }
-
- friend inline bool operator==(QLatin1String s1, QLatin1String s2) noexcept
- { return s1.size() == s2.size() && (!s1.size() || !memcmp(s1.latin1(), s2.latin1(), s1.size())); }
- friend inline bool operator!=(QLatin1String s1, QLatin1String s2) noexcept
- { return !(s1 == s2); }
- friend inline bool operator<(QLatin1String s1, QLatin1String s2) noexcept
- {
- const qsizetype len = qMin(s1.size(), s2.size());
- const int r = len ? memcmp(s1.latin1(), s2.latin1(), len) : 0;
- return r < 0 || (r == 0 && s1.size() < s2.size());
- }
- friend inline bool operator>(QLatin1String s1, QLatin1String s2) noexcept
- { return s2 < s1; }
- friend inline bool operator<=(QLatin1String s1, QLatin1String s2) noexcept
- { return !(s1 > s2); }
- friend inline bool operator>=(QLatin1String s1, QLatin1String s2) noexcept
- { return !(s1 < s2); }
-
- // QChar <> QLatin1String
- friend inline bool operator==(QChar lhs, QLatin1String rhs) noexcept { return rhs.size() == 1 && lhs == rhs.front(); }
- friend inline bool operator< (QChar lhs, QLatin1String rhs) noexcept { return compare_helper(&lhs, 1, rhs) < 0; }
- friend inline bool operator> (QChar lhs, QLatin1String rhs) noexcept { return compare_helper(&lhs, 1, rhs) > 0; }
- friend inline bool operator!=(QChar lhs, QLatin1String rhs) noexcept { return !(lhs == rhs); }
- friend inline bool operator<=(QChar lhs, QLatin1String rhs) noexcept { return !(lhs > rhs); }
- friend inline bool operator>=(QChar lhs, QLatin1String rhs) noexcept { return !(lhs < rhs); }
-
- friend inline bool operator==(QLatin1String lhs, QChar rhs) noexcept { return rhs == lhs; }
- friend inline bool operator!=(QLatin1String lhs, QChar rhs) noexcept { return !(rhs == lhs); }
- friend inline bool operator< (QLatin1String lhs, QChar rhs) noexcept { return rhs > lhs; }
- friend inline bool operator> (QLatin1String lhs, QChar rhs) noexcept { return rhs < lhs; }
- friend inline bool operator<=(QLatin1String lhs, QChar rhs) noexcept { return !(rhs < lhs); }
- friend inline bool operator>=(QLatin1String lhs, QChar rhs) noexcept { return !(rhs > lhs); }
-
- // QStringView <> QLatin1String
- friend inline bool operator==(QStringView lhs, QLatin1String rhs) noexcept
- { return lhs.size() == rhs.size() && QtPrivate::equalStrings(lhs, rhs); }
- friend inline bool operator!=(QStringView lhs, QLatin1String rhs) noexcept { return !(lhs == rhs); }
- friend inline bool operator< (QStringView lhs, QLatin1String rhs) noexcept { return QtPrivate::compareStrings(lhs, rhs) < 0; }
- friend inline bool operator<=(QStringView lhs, QLatin1String rhs) noexcept { return QtPrivate::compareStrings(lhs, rhs) <= 0; }
- friend inline bool operator> (QStringView lhs, QLatin1String rhs) noexcept { return QtPrivate::compareStrings(lhs, rhs) > 0; }
- friend inline bool operator>=(QStringView lhs, QLatin1String rhs) noexcept { return QtPrivate::compareStrings(lhs, rhs) >= 0; }
-
- friend inline bool operator==(QLatin1String lhs, QStringView rhs) noexcept
- { return lhs.size() == rhs.size() && QtPrivate::equalStrings(lhs, rhs); }
- friend inline bool operator!=(QLatin1String lhs, QStringView rhs) noexcept { return !(lhs == rhs); }
- friend inline bool operator< (QLatin1String lhs, QStringView rhs) noexcept { return QtPrivate::compareStrings(lhs, rhs) < 0; }
- friend inline bool operator<=(QLatin1String lhs, QStringView rhs) noexcept { return QtPrivate::compareStrings(lhs, rhs) <= 0; }
- friend inline bool operator> (QLatin1String lhs, QStringView rhs) noexcept { return QtPrivate::compareStrings(lhs, rhs) > 0; }
- friend inline bool operator>=(QLatin1String lhs, QStringView rhs) noexcept { return QtPrivate::compareStrings(lhs, rhs) >= 0; }
-
-
-#if !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII)
- QT_ASCII_CAST_WARN inline bool operator==(const char *s) const;
- QT_ASCII_CAST_WARN inline bool operator!=(const char *s) const;
- QT_ASCII_CAST_WARN inline bool operator<(const char *s) const;
- QT_ASCII_CAST_WARN inline bool operator>(const char *s) const;
- QT_ASCII_CAST_WARN inline bool operator<=(const char *s) const;
- QT_ASCII_CAST_WARN inline bool operator>=(const char *s) const;
-
- QT_ASCII_CAST_WARN inline bool operator==(const QByteArray &s) const;
- QT_ASCII_CAST_WARN inline bool operator!=(const QByteArray &s) const;
- QT_ASCII_CAST_WARN inline bool operator<(const QByteArray &s) const;
- QT_ASCII_CAST_WARN inline bool operator>(const QByteArray &s) const;
- QT_ASCII_CAST_WARN inline bool operator<=(const QByteArray &s) const;
- QT_ASCII_CAST_WARN inline bool operator>=(const QByteArray &s) const;
-
- QT_ASCII_CAST_WARN friend bool operator==(const char *s1, QLatin1String s2) { return compare_helper(s2, s1) == 0; }
- QT_ASCII_CAST_WARN friend bool operator!=(const char *s1, QLatin1String s2) { return compare_helper(s2, s1) != 0; }
- QT_ASCII_CAST_WARN friend bool operator< (const char *s1, QLatin1String s2) { return compare_helper(s2, s1) > 0; }
- QT_ASCII_CAST_WARN friend bool operator> (const char *s1, QLatin1String s2) { return compare_helper(s2, s1) < 0; }
- QT_ASCII_CAST_WARN friend bool operator<=(const char *s1, QLatin1String s2) { return compare_helper(s2, s1) >= 0; }
- QT_ASCII_CAST_WARN friend bool operator>=(const char *s1, QLatin1String s2) { return compare_helper(s2, s1) <= 0; }
-#endif // !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII)
-private:
-#if !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII)
- static inline int compare_helper(const QLatin1String &s1, const char *s2);
-#endif
- Q_ALWAYS_INLINE constexpr void verify(qsizetype pos, qsizetype n = 0) const
- {
- Q_ASSERT(pos >= 0);
- Q_ASSERT(pos <= size());
- Q_ASSERT(n >= 0);
- Q_ASSERT(n <= size() - pos);
- }
- Q_CORE_EXPORT static int compare_helper(const QChar *data1, qsizetype length1,
- QLatin1String s2,
- Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
- qsizetype m_size;
- const char *m_data;
-};
-Q_DECLARE_TYPEINFO(QLatin1String, Q_RELOCATABLE_TYPE);
+template <typename Char>
+using IsCompatibleChar32TypeHelper =
+ std::is_same<Char, char32_t>;
+template <typename Char>
+using IsCompatibleChar32Type
+ = IsCompatibleChar32TypeHelper<q20::remove_cvref_t<Char>>;
+}
// Qt 4.x compatibility
//
-// QLatin1String inline implementations
+// QLatin1StringView inline implementations
//
-constexpr bool QtPrivate::isLatin1(QLatin1String) noexcept
+constexpr bool QtPrivate::isLatin1(QLatin1StringView) noexcept
{ return true; }
//
-// QStringView members that require QLatin1String:
+// QStringView members that require QLatin1StringView:
//
-int QStringView::compare(QLatin1String s, Qt::CaseSensitivity cs) const noexcept
+int QStringView::compare(QLatin1StringView s, Qt::CaseSensitivity cs) const noexcept
{ return QtPrivate::compareStrings(*this, s, cs); }
-bool QStringView::startsWith(QLatin1String s, Qt::CaseSensitivity cs) const noexcept
+bool QStringView::startsWith(QLatin1StringView s, Qt::CaseSensitivity cs) const noexcept
{ return QtPrivate::startsWith(*this, s, cs); }
-bool QStringView::endsWith(QLatin1String s, Qt::CaseSensitivity cs) const noexcept
+bool QStringView::endsWith(QLatin1StringView s, Qt::CaseSensitivity cs) const noexcept
{ return QtPrivate::endsWith(*this, s, cs); }
-qsizetype QStringView::indexOf(QLatin1String s, qsizetype from, Qt::CaseSensitivity cs) const noexcept
+qsizetype QStringView::indexOf(QLatin1StringView s, qsizetype from, Qt::CaseSensitivity cs) const noexcept
{ return QtPrivate::findString(*this, from, s, cs); }
-bool QStringView::contains(QLatin1String s, Qt::CaseSensitivity cs) const noexcept
+bool QStringView::contains(QLatin1StringView s, Qt::CaseSensitivity cs) const noexcept
{ return indexOf(s, 0, cs) != qsizetype(-1); }
-qsizetype QStringView::lastIndexOf(QLatin1String s, Qt::CaseSensitivity cs) const noexcept
+qsizetype QStringView::lastIndexOf(QLatin1StringView s, Qt::CaseSensitivity cs) const noexcept
{ return QtPrivate::lastIndexOf(*this, size(), s, cs); }
-qsizetype QStringView::lastIndexOf(QLatin1String s, qsizetype from, Qt::CaseSensitivity cs) const noexcept
+qsizetype QStringView::lastIndexOf(QLatin1StringView s, qsizetype from, Qt::CaseSensitivity cs) const noexcept
{ return QtPrivate::lastIndexOf(*this, from, s, cs); }
+qsizetype QStringView::count(QLatin1StringView s, Qt::CaseSensitivity cs) const
+{ return QtPrivate::count(*this, s, cs); }
//
-// QAnyStringView members that require QLatin1String
+// QAnyStringView members that require QLatin1StringView
//
-constexpr QAnyStringView::QAnyStringView(QLatin1String str) noexcept
- : m_data{str.data()}, m_size{size_t(str.size()) | Tag::Latin1} {}
+constexpr QAnyStringView::QAnyStringView(QLatin1StringView str) noexcept
+ : m_data{str.data()}, m_size{size_t(str.size() << SizeShift) | Tag::Latin1} {}
-constexpr QLatin1String QAnyStringView::asLatin1StringView() const
+constexpr QLatin1StringView QAnyStringView::asLatin1StringView() const
{
Q_ASSERT(isLatin1());
- return QLatin1String{m_data_utf8, int(size())};
+ return {m_data_utf8, size()};
}
+
template <typename Visitor>
constexpr decltype(auto) QAnyStringView::visit(Visitor &&v) const
{
@@ -401,15 +128,47 @@ constexpr QChar QAnyStringView::back() const
class Q_CORE_EXPORT QString
{
typedef QTypedArrayData<char16_t> Data;
+
+ friend class ::tst_QString;
+
+ template <typename Iterator>
+ static constexpr bool is_contiguous_iterator_v =
+ // Can't use contiguous_iterator_tag here, as STL impls can't agree on feature macro.
+ // To avoid differences in C++20 and C++17 builds, treat only pointers as contiguous
+ // for now:
+ // std::contiguous_iterator<Iterator>;
+ std::is_pointer_v<Iterator>;
+
+ template <typename Char>
+ using is_compatible_char_helper = std::disjunction<
+ QtPrivate::IsCompatibleCharType<Char>,
+ QtPrivate::IsCompatibleChar32Type<Char>,
+ QtPrivate::IsCompatibleChar8Type<Char>,
+ std::is_same<Char, QLatin1Char> // special case
+ >;
+
+ template <typename Iterator>
+ static constexpr bool is_compatible_iterator_v = std::conjunction_v<
+ std::is_convertible<
+ typename std::iterator_traits<Iterator>::iterator_category,
+ std::input_iterator_tag
+ >,
+ is_compatible_char_helper<typename std::iterator_traits<Iterator>::value_type>
+ >;
+
+ template <typename Iterator>
+ using if_compatible_iterator = std::enable_if_t<is_compatible_iterator_v<Iterator>, bool>;
+
public:
typedef QStringPrivate DataPointer;
- inline constexpr QString() noexcept;
+ constexpr QString() noexcept;
explicit QString(const QChar *unicode, qsizetype size = -1);
QString(QChar c);
QString(qsizetype size, QChar c);
- inline QString(QLatin1String latin1);
-#if defined(__cpp_char8_t) || defined(Q_CLANG_QDOC)
+ inline QString(QLatin1StringView latin1);
+ explicit QString(QStringView sv) : QString(sv.data(), sv.size()) {}
+#if defined(__cpp_char8_t) || defined(Q_QDOC)
Q_WEAK_OVERLOAD
inline QString(const char8_t *str)
: QString(fromUtf8(str))
@@ -419,22 +178,37 @@ public:
inline ~QString();
QString &operator=(QChar c);
QString &operator=(const QString &) noexcept;
- QString &operator=(QLatin1String latin1);
+ QString &operator=(QLatin1StringView latin1);
inline QString(QString &&other) noexcept
- { qSwap(d, other.d); }
+ = default;
QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_PURE_SWAP(QString)
- inline void swap(QString &other) noexcept { qSwap(d, other.d); }
- inline qsizetype size() const { return d.size; }
+ void swap(QString &other) noexcept { d.swap(other.d); }
+ inline qsizetype size() const noexcept { return d.size; }
+#if QT_DEPRECATED_SINCE(6, 4)
+ QT_DEPRECATED_VERSION_X_6_4("Use size() or length() instead.")
inline qsizetype count() const { return d.size; }
- inline qsizetype length() const { return d.size; }
- inline bool isEmpty() const;
+#endif
+ inline qsizetype length() const noexcept { return d.size; }
+ inline bool isEmpty() const noexcept { return d.size == 0; }
void resize(qsizetype size);
void resize(qsizetype size, QChar fillChar);
+ void resizeForOverwrite(qsizetype size);
QString &fill(QChar c, qsizetype size = -1);
void truncate(qsizetype pos);
void chop(qsizetype n);
+ QString &slice(qsizetype pos)
+ { verify(pos, 0); return remove(0, pos); }
+ QString &slice(qsizetype pos, qsizetype n)
+ {
+ verify(pos, n);
+ if (isNull())
+ return *this;
+ resize(pos + n);
+ return remove(0, pos);
+ }
+
inline qsizetype capacity() const;
inline void reserve(qsizetype size);
inline void squeeze();
@@ -447,11 +221,11 @@ public:
inline void detach();
inline bool isDetached() const;
inline bool isSharedWith(const QString &other) const { return d.isSharedWith(other.d); }
- void clear();
+ inline void clear();
inline const QChar at(qsizetype i) const;
- const QChar operator[](qsizetype i) const;
- [[nodiscard]] QChar &operator[](qsizetype i);
+ inline const QChar operator[](qsizetype i) const;
+ [[nodiscard]] inline QChar &operator[](qsizetype i);
[[nodiscard]] inline QChar front() const { return at(0); }
[[nodiscard]] inline QChar &front();
@@ -459,49 +233,44 @@ public:
[[nodiscard]] inline QChar &back();
[[nodiscard]] QString arg(qlonglong a, int fieldwidth=0, int base=10,
- QChar fillChar = QLatin1Char(' ')) const;
+ QChar fillChar = u' ') const;
[[nodiscard]] QString arg(qulonglong a, int fieldwidth=0, int base=10,
- QChar fillChar = QLatin1Char(' ')) const;
- [[nodiscard]] QString arg(long a, int fieldwidth=0, int base=10,
- QChar fillChar = QLatin1Char(' ')) const;
- [[nodiscard]] QString arg(ulong a, int fieldwidth=0, int base=10,
- QChar fillChar = QLatin1Char(' ')) const;
- [[nodiscard]] QString arg(int a, int fieldWidth = 0, int base = 10,
- QChar fillChar = QLatin1Char(' ')) const;
- [[nodiscard]] QString arg(uint a, int fieldWidth = 0, int base = 10,
- QChar fillChar = QLatin1Char(' ')) const;
- [[nodiscard]] QString arg(short a, int fieldWidth = 0, int base = 10,
- QChar fillChar = QLatin1Char(' ')) const;
- [[nodiscard]] QString arg(ushort a, int fieldWidth = 0, int base = 10,
- QChar fillChar = QLatin1Char(' ')) const;
+ QChar fillChar = u' ') const;
+ [[nodiscard]] inline QString arg(long a, int fieldwidth=0, int base=10,
+ QChar fillChar = u' ') const;
+ [[nodiscard]] inline QString arg(ulong a, int fieldwidth=0, int base=10,
+ QChar fillChar = u' ') const;
+ [[nodiscard]] inline QString arg(int a, int fieldWidth = 0, int base = 10,
+ QChar fillChar = u' ') const;
+ [[nodiscard]] inline QString arg(uint a, int fieldWidth = 0, int base = 10,
+ QChar fillChar = u' ') const;
+ [[nodiscard]] inline QString arg(short a, int fieldWidth = 0, int base = 10,
+ QChar fillChar = u' ') const;
+ [[nodiscard]] inline QString arg(ushort a, int fieldWidth = 0, int base = 10,
+ QChar fillChar = u' ') const;
[[nodiscard]] QString arg(double a, int fieldWidth = 0, char format = 'g', int precision = -1,
- QChar fillChar = QLatin1Char(' ')) const;
+ QChar fillChar = u' ') const;
[[nodiscard]] QString arg(char a, int fieldWidth = 0,
- QChar fillChar = QLatin1Char(' ')) const;
+ QChar fillChar = u' ') const;
[[nodiscard]] QString arg(QChar a, int fieldWidth = 0,
- QChar fillChar = QLatin1Char(' ')) const;
-#if QT_STRINGVIEW_LEVEL < 2
+ QChar fillChar = u' ') const;
[[nodiscard]] QString arg(const QString &a, int fieldWidth = 0,
- QChar fillChar = QLatin1Char(' ')) const;
-#endif
+ QChar fillChar = u' ') const;
[[nodiscard]] QString arg(QStringView a, int fieldWidth = 0,
- QChar fillChar = QLatin1Char(' ')) const;
- [[nodiscard]] QString arg(QLatin1String a, int fieldWidth = 0,
- QChar fillChar = QLatin1Char(' ')) const;
+ QChar fillChar = u' ') const;
+ [[nodiscard]] QString arg(QLatin1StringView a, int fieldWidth = 0,
+ QChar fillChar = u' ') const;
private:
template <typename T>
- struct is_convertible_to_view_or_qstring_helper
- : std::integral_constant<bool,
- std::is_convertible<T, QString>::value ||
- std::is_convertible<T, QStringView>::value ||
- std::is_convertible<T, QLatin1String>::value> {};
- template <typename T>
- struct is_convertible_to_view_or_qstring
- : is_convertible_to_view_or_qstring_helper<typename std::decay<T>::type> {};
+ using is_convertible_to_view_or_qstring = std::disjunction<
+ std::is_convertible<T, QString>,
+ std::is_convertible<T, QStringView>,
+ std::is_convertible<T, QLatin1StringView>
+ >;
public:
template <typename...Args>
[[nodiscard]]
-#ifdef Q_CLANG_QDOC
+#ifdef Q_QDOC
QString
#else
typename std::enable_if<
@@ -518,24 +287,22 @@ public:
static QString vasprintf(const char *format, va_list ap) Q_ATTRIBUTE_FORMAT_PRINTF(1, 0);
static QString asprintf(const char *format, ...) Q_ATTRIBUTE_FORMAT_PRINTF(1, 2);
- [[nodiscard]] qsizetype indexOf(QChar c, qsizetype from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
- [[nodiscard]] qsizetype indexOf(QLatin1String s, qsizetype from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
-#if QT_STRINGVIEW_LEVEL < 2
+ [[nodiscard]] QT_CORE_INLINE_SINCE(6, 7)
+ qsizetype indexOf(QChar c, qsizetype from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
+ [[nodiscard]] qsizetype indexOf(QLatin1StringView s, qsizetype from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
[[nodiscard]] qsizetype indexOf(const QString &s, qsizetype from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
-#endif
[[nodiscard]] qsizetype indexOf(QStringView s, qsizetype from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
{ return QtPrivate::findString(*this, from, s, cs); }
[[nodiscard]] qsizetype lastIndexOf(QChar c, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
{ return lastIndexOf(c, -1, cs); }
- [[nodiscard]] qsizetype lastIndexOf(QChar c, qsizetype from, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
- [[nodiscard]] qsizetype lastIndexOf(QLatin1String s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
+ [[nodiscard]] QT_CORE_INLINE_SINCE(6, 7)
+ qsizetype lastIndexOf(QChar c, qsizetype from, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
+ [[nodiscard]] qsizetype lastIndexOf(QLatin1StringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
{ return lastIndexOf(s, size(), cs); }
- [[nodiscard]] qsizetype lastIndexOf(QLatin1String s, qsizetype from, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
-#if QT_STRINGVIEW_LEVEL < 2
+ [[nodiscard]] qsizetype lastIndexOf(QLatin1StringView s, qsizetype from, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
[[nodiscard]] qsizetype lastIndexOf(const QString &s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
{ return lastIndexOf(s, size(), cs); }
[[nodiscard]] qsizetype lastIndexOf(const QString &s, qsizetype from, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
-#endif
[[nodiscard]] qsizetype lastIndexOf(QStringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
{ return lastIndexOf(s, size(), cs); }
@@ -543,10 +310,8 @@ public:
{ return QtPrivate::lastIndexOf(*this, from, s, cs); }
[[nodiscard]] inline bool contains(QChar c, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
-#if QT_STRINGVIEW_LEVEL < 2
[[nodiscard]] inline bool contains(const QString &s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
-#endif
- [[nodiscard]] inline bool contains(QLatin1String s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
+ [[nodiscard]] inline bool contains(QLatin1StringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
[[nodiscard]] inline bool contains(QStringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept;
[[nodiscard]] qsizetype count(QChar c, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
[[nodiscard]] qsizetype count(const QString &s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
@@ -578,50 +343,95 @@ public:
};
Q_DECLARE_FLAGS(SectionFlags, SectionFlag)
- [[nodiscard]] QString section(QChar sep, qsizetype start, qsizetype end = -1, SectionFlags flags = SectionDefault) const;
+ [[nodiscard]] inline QString section(QChar sep, qsizetype start, qsizetype end = -1, SectionFlags flags = SectionDefault) const;
[[nodiscard]] QString section(const QString &in_sep, qsizetype start, qsizetype end = -1, SectionFlags flags = SectionDefault) const;
#if QT_CONFIG(regularexpression)
[[nodiscard]] QString section(const QRegularExpression &re, qsizetype start, qsizetype end = -1, SectionFlags flags = SectionDefault) const;
#endif
- [[nodiscard]] QString left(qsizetype n) const;
- [[nodiscard]] QString right(qsizetype n) const;
- [[nodiscard]] QString mid(qsizetype position, qsizetype n = -1) const;
-
- [[nodiscard]] QString first(qsizetype n) const
- { Q_ASSERT(n >= 0); Q_ASSERT(n <= size()); return QString(data(), n); }
- [[nodiscard]] QString last(qsizetype n) const
- { Q_ASSERT(n >= 0); Q_ASSERT(n <= size()); return QString(data() + size() - n, n); }
- [[nodiscard]] QString sliced(qsizetype pos) const
- { Q_ASSERT(pos >= 0); Q_ASSERT(pos <= size()); return QString(data() + pos, size() - pos); }
- [[nodiscard]] QString sliced(qsizetype pos, qsizetype n) const
- { Q_ASSERT(pos >= 0); Q_ASSERT(n >= 0); Q_ASSERT(size_t(pos) + size_t(n) <= size_t(size())); return QString(data() + pos, n); }
- [[nodiscard]] QString chopped(qsizetype n) const
- { Q_ASSERT(n >= 0); Q_ASSERT(n <= size()); return first(size() - n); }
-
-
-#if QT_STRINGVIEW_LEVEL < 2
- bool startsWith(const QString &s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
+
+#if QT_CORE_REMOVED_SINCE(6, 7)
+ QString left(qsizetype n) const;
+ QString right(qsizetype n) const;
+ QString mid(qsizetype position, qsizetype n = -1) const;
+
+ QString first(qsizetype n) const;
+ QString last(qsizetype n) const;
+ QString sliced(qsizetype pos) const;
+ QString sliced(qsizetype pos, qsizetype n) const;
+ QString chopped(qsizetype n) const;
+#else
+ [[nodiscard]] QString left(qsizetype n) const &
+ {
+ if (size_t(n) >= size_t(size()))
+ return *this;
+ return first(n);
+ }
+ [[nodiscard]] QString left(qsizetype n) &&
+ {
+ if (size_t(n) >= size_t(size()))
+ return std::move(*this);
+ return std::move(*this).first(n);
+ }
+ [[nodiscard]] QString right(qsizetype n) const &
+ {
+ if (size_t(n) >= size_t(size()))
+ return *this;
+ return last(n);
+ }
+ [[nodiscard]] QString right(qsizetype n) &&
+ {
+ if (size_t(n) >= size_t(size()))
+ return std::move(*this);
+ return std::move(*this).last(n);
+ }
+ [[nodiscard]] QString mid(qsizetype position, qsizetype n = -1) const &;
+ [[nodiscard]] QString mid(qsizetype position, qsizetype n = -1) &&;
+
+ [[nodiscard]] QString first(qsizetype n) const &
+ { verify(0, n); return sliced(0, n); }
+ [[nodiscard]] QString last(qsizetype n) const &
+ { verify(0, n); return sliced(size() - n, n); }
+ [[nodiscard]] QString sliced(qsizetype pos) const &
+ { verify(pos, 0); return sliced(pos, size() - pos); }
+ [[nodiscard]] QString sliced(qsizetype pos, qsizetype n) const &
+ { verify(pos, n); return QString(begin() + pos, n); }
+ [[nodiscard]] QString chopped(qsizetype n) const &
+ { verify(0, n); return sliced(0, size() - n); }
+
+ [[nodiscard]] QString first(qsizetype n) &&
+ {
+ verify(0, n);
+ resize(n); // may detach and allocate memory
+ return std::move(*this);
+ }
+ [[nodiscard]] QString last(qsizetype n) &&
+ { verify(0, n); return sliced_helper(*this, size() - n, n); }
+ [[nodiscard]] QString sliced(qsizetype pos) &&
+ { verify(pos, 0); return sliced_helper(*this, pos, size() - pos); }
+ [[nodiscard]] QString sliced(qsizetype pos, qsizetype n) &&
+ { verify(pos, n); return sliced_helper(*this, pos, n); }
+ [[nodiscard]] QString chopped(qsizetype n) &&
+ { verify(0, n); return std::move(*this).first(size() - n); }
#endif
+ bool startsWith(const QString &s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
[[nodiscard]] bool startsWith(QStringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
{ return QtPrivate::startsWith(*this, s, cs); }
- bool startsWith(QLatin1String s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
+ bool startsWith(QLatin1StringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
bool startsWith(QChar c, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
-#if QT_STRINGVIEW_LEVEL < 2
bool endsWith(const QString &s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
-#endif
[[nodiscard]] bool endsWith(QStringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
{ return QtPrivate::endsWith(*this, s, cs); }
- bool endsWith(QLatin1String s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
+ bool endsWith(QLatin1StringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
bool endsWith(QChar c, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
bool isUpper() const;
bool isLower() const;
- [[nodiscard]] QString leftJustified(qsizetype width, QChar fill = QLatin1Char(' '), bool trunc = false) const;
- [[nodiscard]] QString rightJustified(qsizetype width, QChar fill = QLatin1Char(' '), bool trunc = false) const;
+ [[nodiscard]] QString leftJustified(qsizetype width, QChar fill = u' ', bool trunc = false) const;
+ [[nodiscard]] QString rightJustified(qsizetype width, QChar fill = u' ', bool trunc = false) const;
-#if !defined(Q_CLANG_QDOC)
+#if !defined(Q_QDOC)
[[nodiscard]] QString toLower() const &
{ return toLower_helper(*this); }
[[nodiscard]] QString toLower() &&
@@ -653,58 +463,119 @@ public:
QString &insert(qsizetype i, QChar c);
QString &insert(qsizetype i, const QChar *uc, qsizetype len);
-#if QT_STRINGVIEW_LEVEL < 2
- inline QString &insert(qsizetype i, const QString &s) { return insert(i, s.constData(), s.length()); }
-#endif
- inline QString &insert(qsizetype i, QStringView v) { return insert(i, v.data(), v.length()); }
- QString &insert(qsizetype i, QLatin1String s);
+ inline QString &insert(qsizetype i, const QString &s) { return insert(i, s.constData(), s.size()); }
+ inline QString &insert(qsizetype i, QStringView v) { return insert(i, v.data(), v.size()); }
+ QString &insert(qsizetype i, QLatin1StringView s);
+ QString &insert(qsizetype i, QUtf8StringView s);
QString &append(QChar c);
QString &append(const QChar *uc, qsizetype len);
-#if QT_STRINGVIEW_LEVEL < 2
QString &append(const QString &s);
-#endif
- inline QString &append(QStringView v) { return append(v.data(), v.length()); }
- QString &append(QLatin1String s);
+ inline QString &append(QStringView v) { return append(v.data(), v.size()); }
+ QString &append(QLatin1StringView s);
+ QString &append(QUtf8StringView s);
inline QString &prepend(QChar c) { return insert(0, c); }
inline QString &prepend(const QChar *uc, qsizetype len) { return insert(0, uc, len); }
-#if QT_STRINGVIEW_LEVEL < 2
inline QString &prepend(const QString &s) { return insert(0, s); }
-#endif
- inline QString &prepend(QStringView v) { return prepend(v.data(), v.length()); }
- inline QString &prepend(QLatin1String s) { return insert(0, s); }
+ inline QString &prepend(QStringView v) { return prepend(v.data(), v.size()); }
+ inline QString &prepend(QLatin1StringView s) { return insert(0, s); }
+ QString &prepend(QUtf8StringView s) { return insert(0, s); }
+
+ QString &assign(QAnyStringView s);
+ inline QString &assign(qsizetype n, QChar c)
+ {
+ Q_ASSERT(n >= 0);
+ return fill(c, n);
+ }
+ template <typename InputIterator, if_compatible_iterator<InputIterator> = true>
+ QString &assign(InputIterator first, InputIterator last)
+ {
+ using V = typename std::iterator_traits<InputIterator>::value_type;
+ constexpr bool IsL1C = std::is_same_v<std::remove_cv_t<V>, QLatin1Char>;
+ constexpr bool IsFwdIt = std::is_convertible_v<
+ typename std::iterator_traits<InputIterator>::iterator_category,
+ std::forward_iterator_tag
+ >;
+
+ if constexpr (is_contiguous_iterator_v<InputIterator>) {
+ const auto p = q20::to_address(first);
+ const auto len = qsizetype(last - first);
+ if constexpr (IsL1C)
+ return assign(QLatin1StringView(reinterpret_cast<const char*>(p), len));
+ else if constexpr (sizeof(V) == 4)
+ return assign_helper(p, len);
+ else
+ return assign(QAnyStringView(p, len));
+ } else if constexpr (sizeof(V) == 4) { // non-contiguous iterator, feed data piecemeal
+ resize(0);
+ if constexpr (IsFwdIt) {
+ const qsizetype requiredCapacity = 2 * std::distance(first, last);
+ reserve(requiredCapacity);
+ }
+ while (first != last) {
+ append(QChar::fromUcs4(*first));
+ ++first;
+ }
+ return *this;
+ } else if constexpr (QtPrivate::IsCompatibleChar8Type<V>::value) {
+ assign_helper_char8(first, last);
+ d.data()[d.size] = u'\0';
+ return *this;
+ } else {
+ d.assign(first, last, [](QChar ch) -> char16_t { return ch.unicode(); });
+ d.data()[d.size] = u'\0';
+ return *this;
+ }
+ }
inline QString &operator+=(QChar c) { return append(c); }
-#if QT_STRINGVIEW_LEVEL < 2
inline QString &operator+=(const QString &s) { return append(s); }
-#endif
inline QString &operator+=(QStringView v) { return append(v); }
- inline QString &operator+=(QLatin1String s) { return append(s); }
+ inline QString &operator+=(QLatin1StringView s) { return append(s); }
+ QString &operator+=(QUtf8StringView s) { return append(s); }
+
+#if defined(QT_RESTRICTED_CAST_FROM_ASCII)
+ template <qsizetype N>
+ QString &insert(qsizetype i, const char (&ch)[N]) { return insert(i, QUtf8StringView(ch)); }
+ template <qsizetype N>
+ QString &append(const char (&ch)[N]) { return append(QUtf8StringView(ch)); }
+ template <qsizetype N>
+ QString &prepend(const char (&ch)[N]) { return prepend(QUtf8StringView(ch)); }
+ template <qsizetype N>
+ QString &operator+=(const char (&ch)[N]) { return append(QUtf8StringView(ch)); }
+#endif
QString &remove(qsizetype i, qsizetype len);
QString &remove(QChar c, Qt::CaseSensitivity cs = Qt::CaseSensitive);
- QString &remove(QLatin1String s, Qt::CaseSensitivity cs = Qt::CaseSensitive);
+ QString &remove(QLatin1StringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive);
QString &remove(const QString &s, Qt::CaseSensitivity cs = Qt::CaseSensitive);
+
+ QString &removeAt(qsizetype pos)
+ { return size_t(pos) < size_t(size()) ? remove(pos, 1) : *this; }
+ QString &removeFirst() { return !isEmpty() ? remove(0, 1) : *this; }
+ QString &removeLast() { return !isEmpty() ? remove(size() - 1, 1) : *this; }
+
template <typename Predicate>
QString &removeIf(Predicate pred)
{
- QtPrivate::sequential_erase_if(*this, pred);
+ removeIf_helper(pred);
return *this;
}
+
QString &replace(qsizetype i, qsizetype len, QChar after);
QString &replace(qsizetype i, qsizetype len, const QChar *s, qsizetype slen);
QString &replace(qsizetype i, qsizetype len, const QString &after);
QString &replace(QChar before, QChar after, Qt::CaseSensitivity cs = Qt::CaseSensitive);
QString &replace(const QChar *before, qsizetype blen, const QChar *after, qsizetype alen, Qt::CaseSensitivity cs = Qt::CaseSensitive);
- QString &replace(QLatin1String before, QLatin1String after, Qt::CaseSensitivity cs = Qt::CaseSensitive);
- QString &replace(QLatin1String before, const QString &after, Qt::CaseSensitivity cs = Qt::CaseSensitive);
- QString &replace(const QString &before, QLatin1String after, Qt::CaseSensitivity cs = Qt::CaseSensitive);
+ QString &replace(QLatin1StringView before, QLatin1StringView after, Qt::CaseSensitivity cs = Qt::CaseSensitive);
+ QString &replace(QLatin1StringView before, const QString &after, Qt::CaseSensitivity cs = Qt::CaseSensitive);
+ QString &replace(const QString &before, QLatin1StringView after, Qt::CaseSensitivity cs = Qt::CaseSensitive);
QString &replace(const QString &before, const QString &after,
Qt::CaseSensitivity cs = Qt::CaseSensitive);
QString &replace(QChar c, const QString &after, Qt::CaseSensitivity cs = Qt::CaseSensitive);
- QString &replace(QChar c, QLatin1String after, Qt::CaseSensitivity cs = Qt::CaseSensitive);
+ QString &replace(QChar c, QLatin1StringView after, Qt::CaseSensitivity cs = Qt::CaseSensitive);
#if QT_CONFIG(regularexpression)
QString &replace(const QRegularExpression &re, const QString &after);
inline QString &remove(const QRegularExpression &re)
@@ -755,7 +626,7 @@ public:
const ushort *utf16() const; // ### Qt 7 char16_t
-#if !defined(Q_CLANG_QDOC)
+#if !defined(Q_QDOC)
[[nodiscard]] QByteArray toLatin1() const &
{ return toLatin1_helper(*this); }
[[nodiscard]] QByteArray toLatin1() &&
@@ -790,7 +661,7 @@ public:
{
return fromUtf8(QByteArrayView(utf8, !utf8 || size < 0 ? qstrlen(utf8) : size));
}
-#if defined(__cpp_char8_t) || defined(Q_CLANG_QDOC)
+#if defined(__cpp_char8_t) || defined(Q_QDOC)
Q_WEAK_OVERLOAD
static inline QString fromUtf8(const char8_t *str)
{ return fromUtf8(reinterpret_cast<const char *>(str)); }
@@ -825,10 +696,8 @@ public:
QString &setUnicode(const QChar *unicode, qsizetype size);
inline QString &setUtf16(const ushort *utf16, qsizetype size); // ### Qt 7 char16_t
-#if QT_STRINGVIEW_LEVEL < 2
int compare(const QString &s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept;
-#endif
- int compare(QLatin1String other, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept;
+ int compare(QLatin1StringView other, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept;
inline int compare(QStringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept;
int compare(QChar ch, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
{ return compare(QStringView{&ch, 1}, cs); }
@@ -837,10 +706,10 @@ public:
Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept
{ return s1.compare(s2, cs); }
- static inline int compare(const QString &s1, QLatin1String s2,
+ static inline int compare(const QString &s1, QLatin1StringView s2,
Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept
{ return s1.compare(s2, cs); }
- static inline int compare(QLatin1String s1, const QString &s2,
+ static inline int compare(QLatin1StringView s1, const QString &s2,
Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept
{ return -s2.compare(s1, cs); }
static int compare(const QString &s1, QStringView s2, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept
@@ -849,11 +718,11 @@ public:
{ return -s2.compare(s1, cs); }
int localeAwareCompare(const QString& s) const;
- int localeAwareCompare(QStringView s) const;
+ inline int localeAwareCompare(QStringView s) const;
static int localeAwareCompare(const QString& s1, const QString& s2)
{ return s1.localeAwareCompare(s2); }
- static int localeAwareCompare(QStringView s1, QStringView s2);
+ static inline int localeAwareCompare(QStringView s1, QStringView s2);
short toShort(bool *ok=nullptr, int base=10) const
{ return toIntegral_helper<short>(*this, ok, base); }
@@ -867,20 +736,22 @@ public:
{ return toIntegral_helper<long>(*this, ok, base); }
ulong toULong(bool *ok=nullptr, int base=10) const
{ return toIntegral_helper<ulong>(*this, ok, base); }
+ QT_CORE_INLINE_SINCE(6, 5)
qlonglong toLongLong(bool *ok=nullptr, int base=10) const;
+ QT_CORE_INLINE_SINCE(6, 5)
qulonglong toULongLong(bool *ok=nullptr, int base=10) const;
float toFloat(bool *ok=nullptr) const;
double toDouble(bool *ok=nullptr) const;
- QString &setNum(short, int base=10);
- QString &setNum(ushort, int base=10);
- QString &setNum(int, int base=10);
- QString &setNum(uint, int base=10);
- QString &setNum(long, int base=10);
- QString &setNum(ulong, int base=10);
+ inline QString &setNum(short, int base=10);
+ inline QString &setNum(ushort, int base=10);
+ inline QString &setNum(int, int base=10);
+ inline QString &setNum(uint, int base=10);
+ inline QString &setNum(long, int base=10);
+ inline QString &setNum(ulong, int base=10);
QString &setNum(qlonglong, int base=10);
QString &setNum(qulonglong, int base=10);
- QString &setNum(float, char format='g', int precision=6);
+ inline QString &setNum(float, char format='g', int precision=6);
QString &setNum(double, char format='g', int precision=6);
static QString number(int, int base=10);
@@ -891,78 +762,63 @@ public:
static QString number(qulonglong, int base=10);
static QString number(double, char format='g', int precision=6);
- friend bool operator==(const QString &s1, const QString &s2) noexcept
- { return (s1.size() == s2.size()) && QtPrivate::compareStrings(s1, s2, Qt::CaseSensitive) == 0; }
- friend bool operator< (const QString &s1, const QString &s2) noexcept
- { return QtPrivate::compareStrings(s1, s2, Qt::CaseSensitive) < 0; }
- friend bool operator> (const QString &s1, const QString &s2) noexcept { return s2 < s1; }
- friend bool operator!=(const QString &s1, const QString &s2) noexcept { return !(s1 == s2); }
- friend bool operator<=(const QString &s1, const QString &s2) noexcept { return !(s1 > s2); }
- friend bool operator>=(const QString &s1, const QString &s2) noexcept { return !(s1 < s2); }
-
- friend bool operator==(const QString &s1, QLatin1String s2) noexcept
- { return (s1.size() == s2.size()) && QtPrivate::compareStrings(s1, s2, Qt::CaseSensitive) == 0; }
- friend bool operator< (const QString &s1, QLatin1String s2) noexcept
- { return QtPrivate::compareStrings(s1, s2, Qt::CaseSensitive) < 0; }
- friend bool operator> (const QString &s1, QLatin1String s2) noexcept
- { return QtPrivate::compareStrings(s1, s2, Qt::CaseSensitive) > 0; }
- friend bool operator!=(const QString &s1, QLatin1String s2) noexcept { return !(s1 == s2); }
- friend bool operator<=(const QString &s1, QLatin1String s2) noexcept { return !(s1 > s2); }
- friend bool operator>=(const QString &s1, QLatin1String s2) noexcept { return !(s1 < s2); }
-
- friend bool operator==(QLatin1String s1, const QString &s2) noexcept { return s2 == s1; }
- friend bool operator< (QLatin1String s1, const QString &s2) noexcept { return s2 > s1; }
- friend bool operator> (QLatin1String s1, const QString &s2) noexcept { return s2 < s1; }
- friend bool operator!=(QLatin1String s1, const QString &s2) noexcept { return s2 != s1; }
- friend bool operator<=(QLatin1String s1, const QString &s2) noexcept { return s2 >= s1; }
- friend bool operator>=(QLatin1String s1, const QString &s2) noexcept { return s2 <= s1; }
+ friend bool comparesEqual(const QString &s1, const QString &s2) noexcept
+ { return comparesEqual(QStringView(s1), QStringView(s2)); }
+ friend Qt::strong_ordering compareThreeWay(const QString &s1, const QString &s2) noexcept
+ { return compareThreeWay(QStringView(s1), QStringView(s2)); }
+ Q_DECLARE_STRONGLY_ORDERED(QString)
+
+ Q_WEAK_OVERLOAD
+ friend bool comparesEqual(const QString &s1, QUtf8StringView s2) noexcept
+ { return QtPrivate::equalStrings(s1, s2); }
+ Q_WEAK_OVERLOAD
+ friend Qt::strong_ordering compareThreeWay(const QString &s1, QUtf8StringView s2) noexcept
+ {
+ const int res = QtPrivate::compareStrings(s1, s2, Qt::CaseSensitive);
+ return Qt::compareThreeWay(res, 0);
+ }
+ Q_DECLARE_STRONGLY_ORDERED(QString, QUtf8StringView, Q_WEAK_OVERLOAD)
+
+#ifdef __cpp_char8_t
+ friend bool comparesEqual(const QString &s1, const char8_t *s2) noexcept
+ { return comparesEqual(s1, QUtf8StringView(s2)); }
+ friend Qt::strong_ordering compareThreeWay(const QString &s1, const char8_t *s2) noexcept
+ { return compareThreeWay(s1, QUtf8StringView(s2)); }
+ Q_DECLARE_STRONGLY_ORDERED(QString, const char8_t *)
+#endif // __cpp_char8_t
+
+ friend bool comparesEqual(const QString &s1, QLatin1StringView s2) noexcept
+ { return (s1.size() == s2.size()) && QtPrivate::equalStrings(s1, s2); }
+ friend Qt::strong_ordering
+ compareThreeWay(const QString &s1, QLatin1StringView s2) noexcept
+ {
+ const int res = QtPrivate::compareStrings(s1, s2, Qt::CaseSensitive);
+ return Qt::compareThreeWay(res, 0);
+ }
+ Q_DECLARE_STRONGLY_ORDERED(QString, QLatin1StringView)
// Check isEmpty() instead of isNull() for backwards compatibility.
- friend bool operator==(const QString &s1, std::nullptr_t) noexcept { return s1.isEmpty(); }
- friend bool operator!=(const QString &s1, std::nullptr_t) noexcept { return !s1.isEmpty(); }
- friend bool operator< (const QString & , std::nullptr_t) noexcept { return false; }
- friend bool operator> (const QString &s1, std::nullptr_t) noexcept { return !s1.isEmpty(); }
- friend bool operator<=(const QString &s1, std::nullptr_t) noexcept { return s1.isEmpty(); }
- friend bool operator>=(const QString & , std::nullptr_t) noexcept { return true; }
- friend bool operator==(std::nullptr_t, const QString &s2) noexcept { return s2 == nullptr; }
- friend bool operator!=(std::nullptr_t, const QString &s2) noexcept { return s2 != nullptr; }
- friend bool operator< (std::nullptr_t, const QString &s2) noexcept { return s2 > nullptr; }
- friend bool operator> (std::nullptr_t, const QString &s2) noexcept { return s2 < nullptr; }
- friend bool operator<=(std::nullptr_t, const QString &s2) noexcept { return s2 >= nullptr; }
- friend bool operator>=(std::nullptr_t, const QString &s2) noexcept { return s2 <= nullptr; }
-
- friend bool operator==(const QString &s1, const char16_t *s2) noexcept { return s1 == QStringView(s2); }
- friend bool operator!=(const QString &s1, const char16_t *s2) noexcept { return s1 != QStringView(s2); }
- friend bool operator< (const QString &s1, const char16_t *s2) noexcept { return s1 < QStringView(s2); }
- friend bool operator> (const QString &s1, const char16_t *s2) noexcept { return s1 > QStringView(s2); }
- friend bool operator<=(const QString &s1, const char16_t *s2) noexcept { return s1 <= QStringView(s2); }
- friend bool operator>=(const QString &s1, const char16_t *s2) noexcept { return s1 >= QStringView(s2); }
-
- friend bool operator==(const char16_t *s1, const QString &s2) noexcept { return s2 == s1; }
- friend bool operator!=(const char16_t *s1, const QString &s2) noexcept { return s2 != s1; }
- friend bool operator< (const char16_t *s1, const QString &s2) noexcept { return s2 > s1; }
- friend bool operator> (const char16_t *s1, const QString &s2) noexcept { return s2 < s1; }
- friend bool operator<=(const char16_t *s1, const QString &s2) noexcept { return s2 >= s1; }
- friend bool operator>=(const char16_t *s1, const QString &s2) noexcept { return s2 <= s1; }
+ friend bool comparesEqual(const QString &s1, std::nullptr_t) noexcept
+ { return s1.isEmpty(); }
+ friend Qt::strong_ordering compareThreeWay(const QString &s1, std::nullptr_t) noexcept
+ { return s1.isEmpty() ? Qt::strong_ordering::equivalent : Qt::strong_ordering::greater; }
+ Q_DECLARE_STRONGLY_ORDERED(QString, std::nullptr_t)
+
+ friend bool comparesEqual(const QString &s1, const char16_t *s2) noexcept
+ { return comparesEqual(s1, QStringView(s2)); }
+ friend Qt::strong_ordering compareThreeWay(const QString &s1, const char16_t *s2) noexcept
+ { return compareThreeWay(s1, QStringView(s2)); }
+ Q_DECLARE_STRONGLY_ORDERED(QString, const char16_t *)
// QChar <> QString
- friend inline bool operator==(QChar lhs, const QString &rhs) noexcept
- { return rhs.size() == 1 && lhs == rhs.front(); }
- friend inline bool operator< (QChar lhs, const QString &rhs) noexcept
- { return compare_helper(&lhs, 1, rhs.data(), rhs.size()) < 0; }
- friend inline bool operator> (QChar lhs, const QString &rhs) noexcept
- { return compare_helper(&lhs, 1, rhs.data(), rhs.size()) > 0; }
-
- friend inline bool operator!=(QChar lhs, const QString &rhs) noexcept { return !(lhs == rhs); }
- friend inline bool operator<=(QChar lhs, const QString &rhs) noexcept { return !(lhs > rhs); }
- friend inline bool operator>=(QChar lhs, const QString &rhs) noexcept { return !(lhs < rhs); }
-
- friend inline bool operator==(const QString &lhs, QChar rhs) noexcept { return rhs == lhs; }
- friend inline bool operator!=(const QString &lhs, QChar rhs) noexcept { return !(rhs == lhs); }
- friend inline bool operator< (const QString &lhs, QChar rhs) noexcept { return rhs > lhs; }
- friend inline bool operator> (const QString &lhs, QChar rhs) noexcept { return rhs < lhs; }
- friend inline bool operator<=(const QString &lhs, QChar rhs) noexcept { return !(rhs < lhs); }
- friend inline bool operator>=(const QString &lhs, QChar rhs) noexcept { return !(rhs > lhs); }
+ friend bool comparesEqual(const QString &lhs, QChar rhs) noexcept
+ { return lhs.size() == 1 && rhs == lhs.front(); }
+ friend Qt::strong_ordering compareThreeWay(const QString &lhs, QChar rhs) noexcept
+ {
+ const int res = compare_helper(lhs.data(), lhs.size(), &rhs, 1);
+ return Qt::compareThreeWay(res, 0);
+ }
+ Q_DECLARE_STRONGLY_ORDERED(QString, QChar)
// ASCII compatibility
#if defined(QT_RESTRICTED_CAST_FROM_ASCII)
@@ -986,28 +842,40 @@ public:
: QString(fromUtf8(a))
{}
QT_ASCII_CAST_WARN inline QString &operator=(const char *ch)
- { return (*this = fromUtf8(ch)); }
+ {
+ if (!ch) {
+ clear();
+ return *this;
+ }
+ return assign(ch);
+ }
QT_ASCII_CAST_WARN inline QString &operator=(const QByteArray &a)
- { return (*this = fromUtf8(a)); }
-
+ {
+ if (a.isNull()) {
+ clear();
+ return *this;
+ }
+ return assign(a);
+ }
// these are needed, so it compiles with STL support enabled
QT_ASCII_CAST_WARN inline QString &prepend(const char *s)
- { return prepend(QString::fromUtf8(s)); }
+ { return prepend(QUtf8StringView(s)); }
QT_ASCII_CAST_WARN inline QString &prepend(const QByteArray &s)
- { return prepend(QString::fromUtf8(s)); }
+ { return prepend(QUtf8StringView(s)); }
QT_ASCII_CAST_WARN inline QString &append(const char *s)
- { return append(QString::fromUtf8(s)); }
+ { return append(QUtf8StringView(s)); }
QT_ASCII_CAST_WARN inline QString &append(const QByteArray &s)
- { return append(QString::fromUtf8(s)); }
+ { return append(QUtf8StringView(s)); }
QT_ASCII_CAST_WARN inline QString &insert(qsizetype i, const char *s)
- { return insert(i, QString::fromUtf8(s)); }
+ { return insert(i, QUtf8StringView(s)); }
QT_ASCII_CAST_WARN inline QString &insert(qsizetype i, const QByteArray &s)
- { return insert(i, QString::fromUtf8(s)); }
+ { return insert(i, QUtf8StringView(s)); }
QT_ASCII_CAST_WARN inline QString &operator+=(const char *s)
- { return append(QString::fromUtf8(s)); }
+ { return append(QUtf8StringView(s)); }
QT_ASCII_CAST_WARN inline QString &operator+=(const QByteArray &s)
- { return append(QString::fromUtf8(s)); }
+ { return append(QUtf8StringView(s)); }
+#if QT_CORE_REMOVED_SINCE(6, 8)
QT_ASCII_CAST_WARN inline bool operator==(const char *s) const;
QT_ASCII_CAST_WARN inline bool operator!=(const char *s) const;
QT_ASCII_CAST_WARN inline bool operator<(const char *s) const;
@@ -1021,20 +889,41 @@ public:
QT_ASCII_CAST_WARN inline bool operator>(const QByteArray &s) const;
QT_ASCII_CAST_WARN inline bool operator<=(const QByteArray &s) const;
QT_ASCII_CAST_WARN inline bool operator>=(const QByteArray &s) const;
+#else
+ friend bool comparesEqual(const QString &lhs, QByteArrayView rhs) noexcept
+ {
+ return QString::compare_helper(lhs.constData(), lhs.size(),
+ rhs.constData(), rhs.size()) == 0;
+ }
+ friend Qt::strong_ordering
+ compareThreeWay(const QString &lhs, QByteArrayView rhs) noexcept
+ {
+ const int res = QString::compare_helper(lhs.constData(), lhs.size(),
+ rhs.constData(), rhs.size());
+ return Qt::compareThreeWay(res, 0);
+ }
+ Q_DECLARE_STRONGLY_ORDERED(QString, QByteArrayView, QT_ASCII_CAST_WARN)
- QT_ASCII_CAST_WARN friend bool operator==(const char *s1, const QString &s2)
- { return QString::compare_helper(s2.constData(), s2.size(), s1, -1) == 0; }
- QT_ASCII_CAST_WARN friend bool operator!=(const char *s1, const QString &s2)
- { return QString::compare_helper(s2.constData(), s2.size(), s1, -1) != 0; }
- QT_ASCII_CAST_WARN friend bool operator< (const char *s1, const QString &s2)
- { return QString::compare_helper(s2.constData(), s2.size(), s1, -1) > 0; }
- QT_ASCII_CAST_WARN friend bool operator> (const char *s1, const QString &s2)
- { return QString::compare_helper(s2.constData(), s2.size(), s1, -1) < 0; }
- QT_ASCII_CAST_WARN friend bool operator<=(const char *s1, const QString &s2)
- { return QString::compare_helper(s2.constData(), s2.size(), s1, -1) >= 0; }
- QT_ASCII_CAST_WARN friend bool operator>=(const char *s1, const QString &s2)
- { return QString::compare_helper(s2.constData(), s2.size(), s1, -1) <= 0; }
-#endif
+ friend bool comparesEqual(const QString &lhs, const QByteArray &rhs) noexcept
+ { return comparesEqual(lhs, QByteArrayView(rhs)); }
+ friend Qt::strong_ordering
+ compareThreeWay(const QString &lhs, const QByteArray &rhs) noexcept
+ {
+ return compareThreeWay(lhs, QByteArrayView(rhs));
+ }
+ Q_DECLARE_STRONGLY_ORDERED(QString, QByteArray, QT_ASCII_CAST_WARN)
+
+ friend bool comparesEqual(const QString &lhs, const char *rhs) noexcept
+ { return comparesEqual(lhs, QByteArrayView(rhs)); }
+ friend Qt::strong_ordering
+ compareThreeWay(const QString &lhs, const char *rhs) noexcept
+ {
+ return compareThreeWay(lhs, QByteArrayView(rhs));
+ }
+ Q_DECLARE_STRONGLY_ORDERED(QString, const char *, QT_ASCII_CAST_WARN)
+#endif // QT_CORE_REMOVED_SINCE(6, 8)
+
+#endif // !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII)
typedef QChar *iterator;
typedef const QChar *const_iterator;
@@ -1071,6 +960,12 @@ public:
inline void push_front(const QString &s) { prepend(s); }
void shrink_to_fit() { squeeze(); }
iterator erase(const_iterator first, const_iterator last);
+ inline iterator erase(const_iterator it) { return erase(it, it + 1); }
+ static constexpr qsizetype max_size() noexcept
+ {
+ // -1 to deal with the NUL terminator
+ return Data::max_size() - 1;
+ }
static inline QString fromStdString(const std::string &s);
inline std::string toStdString() const;
@@ -1082,6 +977,8 @@ public:
static inline QString fromStdU32String(const std::u32string &s);
inline std::u32string toStdU32String() const;
+ Q_IMPLICIT inline operator std::u16string_view() const noexcept;
+
#if defined(Q_OS_DARWIN) || defined(Q_QDOC)
static QString fromCFString(CFStringRef string);
CFStringRef toCFString() const Q_DECL_CF_RETURNS_RETAINED;
@@ -1089,10 +986,13 @@ public:
NSString *toNSString() const Q_DECL_NS_RETURNS_AUTORELEASED;
#endif
- inline bool isNull() const { return d->isNull(); }
+#if defined(Q_OS_WASM) || defined(Q_QDOC)
+ static QString fromEcmaString(emscripten::val jsString);
+ emscripten::val toEcmaString() const;
+#endif
+ inline bool isNull() const { return d->isNull(); }
- bool isSimpleText() const;
bool isRightToLeft() const;
[[nodiscard]] bool isValidUtf16() const noexcept
{ return QStringView(*this).isValidUtf16(); }
@@ -1115,14 +1015,20 @@ private:
void reallocData(qsizetype alloc, QArrayData::AllocationOption option);
void reallocGrowData(qsizetype n);
+ // ### remove once QAnyStringView supports UTF-32:
+ QString &assign_helper(const char32_t *data, qsizetype len);
+ // Defined in qstringconverter.h
+ template <typename InputIterator>
+ void assign_helper_char8(InputIterator first, InputIterator last);
static int compare_helper(const QChar *data1, qsizetype length1,
const QChar *data2, qsizetype length2,
Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
static int compare_helper(const QChar *data1, qsizetype length1,
const char *data2, qsizetype length2,
- Qt::CaseSensitivity cs = Qt::CaseSensitive);
+ Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
static int localeAwareCompare_helper(const QChar *data1, qsizetype length1,
const QChar *data2, qsizetype length2);
+ static QString sliced_helper(QString &str, qsizetype pos, qsizetype n);
static QString toLower_helper(const QString &str);
static QString toLower_helper(QString &str);
static QString toUpper_helper(const QString &str);
@@ -1137,14 +1043,26 @@ private:
static QByteArray toLatin1_helper_inplace(QString &);
static QByteArray toUtf8_helper(const QString &);
static QByteArray toLocal8Bit_helper(const QChar *data, qsizetype size);
- static qsizetype toUcs4_helper(const ushort *uc, qsizetype length, uint *out); // ### Qt 7 char16_t
+#if QT_CORE_REMOVED_SINCE(6, 6)
+ static qsizetype toUcs4_helper(const ushort *uc, qsizetype length, uint *out);
+#endif
+ static qsizetype toUcs4_helper(const char16_t *uc, qsizetype length, char32_t *out);
static qlonglong toIntegral_helper(QStringView string, bool *ok, int base);
static qulonglong toIntegral_helper(QStringView string, bool *ok, uint base);
- void replace_helper(size_t *indices, qsizetype nIndices, qsizetype blen, const QChar *after, qsizetype alen);
+ template <typename Predicate>
+ qsizetype removeIf_helper(Predicate pred)
+ {
+ const qsizetype result = d->eraseIf(pred);
+ if (result > 0)
+ d.data()[d.size] = u'\0';
+ return result;
+ }
+
friend class QStringView;
friend class QByteArray;
- friend class QCollator;
friend struct QAbstractConcatenable;
+ template <typename T> friend qsizetype erase(QString &s, const T &t);
+ template <typename Predicate> friend qsizetype erase_if(QString &s, Predicate pred);
template <typename T> static
T toIntegral_helper(QStringView string, bool *ok, int base)
@@ -1162,23 +1080,46 @@ private:
return T(val);
}
+ Q_ALWAYS_INLINE constexpr void verify([[maybe_unused]] qsizetype pos = 0,
+ [[maybe_unused]] qsizetype n = 1) const
+ {
+ Q_ASSERT(pos >= 0);
+ Q_ASSERT(pos <= d.size);
+ Q_ASSERT(n >= 0);
+ Q_ASSERT(n <= d.size - pos);
+ }
+
public:
inline DataPointer &data_ptr() { return d; }
inline const DataPointer &data_ptr() const { return d; }
};
//
-// QLatin1String inline members that require QString:
+// QLatin1StringView inline members that require QUtf8StringView:
+//
+
+int QLatin1StringView::compare(QUtf8StringView other, Qt::CaseSensitivity cs) const noexcept
+{ return QtPrivate::compareStrings(*this, other, cs); }
+
+//
+// QLatin1StringView inline members that require QString:
+//
+
+QString QLatin1StringView::toString() const { return *this; }
+
+//
+// QStringView inline members that require QUtf8StringView:
//
-QString QLatin1String::toString() const { return *this; }
+int QStringView::compare(QUtf8StringView other, Qt::CaseSensitivity cs) const noexcept
+{ return QtPrivate::compareStrings(*this, other, cs); }
//
// QStringView inline members that require QString:
//
QString QStringView::toString() const
-{ return Q_ASSERT(size() == length()), QString(data(), length()); }
+{ return QString(*this); }
qint64 QStringView::toLongLong(bool *ok, int base) const
{ return QString::toIntegral_helper<qint64>(*this, ok, base); }
@@ -1198,14 +1139,71 @@ ushort QStringView::toUShort(bool *ok, int base) const
{ return QString::toIntegral_helper<ushort>(*this, ok, base); }
//
-// QUtf8StringView inline members that require QString:
+// QUtf8StringView inline members that require QStringView:
+//
+
+template <bool UseChar8T>
+int QBasicUtf8StringView<UseChar8T>::compare(QChar other, Qt::CaseSensitivity cs) const noexcept
+{
+ return QtPrivate::compareStrings(*this, QStringView(&other, 1), cs);
+}
+
+template <bool UseChar8T>
+int QBasicUtf8StringView<UseChar8T>::compare(QStringView other, Qt::CaseSensitivity cs) const noexcept
+{
+ return QtPrivate::compareStrings(*this, other, cs);
+}
+
+template <bool UseChar8T>
+[[nodiscard]] bool QBasicUtf8StringView<UseChar8T>::equal(QChar other) const noexcept
+{
+ return QtPrivate::equalStrings(*this, QStringView(&other, 1));
+}
+
+template <bool UseChar8T>
+[[nodiscard]] bool QBasicUtf8StringView<UseChar8T>::equal(QStringView other) const noexcept
+{
+ return QtPrivate::equalStrings(*this, other);
+}
+
+//
+// QUtf8StringView inline members that require QString, QL1SV or QBA:
//
template <bool UseChar8T>
QString QBasicUtf8StringView<UseChar8T>::toString() const
{
- Q_ASSERT(size() == int(size()));
- return QString::fromUtf8(data(), int(size()));
+ return QString::fromUtf8(data(), size());
+}
+
+template<bool UseChar8T>
+[[nodiscard]] int QBasicUtf8StringView<UseChar8T>::compare(QLatin1StringView other,
+ Qt::CaseSensitivity cs) const noexcept
+{
+ return QtPrivate::compareStrings(*this, other, cs);
+}
+
+template<bool UseChar8T>
+[[nodiscard]] int QBasicUtf8StringView<UseChar8T>::compare(const QByteArray &other,
+ Qt::CaseSensitivity cs) const noexcept
+{
+ return QtPrivate::compareStrings(*this,
+ QBasicUtf8StringView<UseChar8T>(other.data(), other.size()),
+ cs);
+}
+
+template <bool UseChar8T>
+[[nodiscard]] bool QBasicUtf8StringView<UseChar8T>::equal(QLatin1StringView other) const noexcept
+{
+ return QtPrivate::equalStrings(*this, other);
+}
+
+template <bool UseChar8T>
+[[nodiscard]] bool QBasicUtf8StringView<UseChar8T>::equal(const QByteArray &other) const noexcept
+{
+ return size() == other.size()
+ && QtPrivate::equalStrings(*this, QBasicUtf8StringView<UseChar8T>(other.data(),
+ other.size()));
}
//
@@ -1223,17 +1221,15 @@ QString QAnyStringView::toString() const
//
// QString inline members
//
-inline QString::QString(QLatin1String latin1)
+QString::QString(QLatin1StringView latin1)
{ *this = QString::fromLatin1(latin1.data(), latin1.size()); }
-inline const QChar QString::at(qsizetype i) const
-{ Q_ASSERT(size_t(i) < size_t(size())); return QChar(d.data()[i]); }
-inline const QChar QString::operator[](qsizetype i) const
-{ Q_ASSERT(size_t(i) < size_t(size())); return QChar(d.data()[i]); }
-inline bool QString::isEmpty() const
-{ return d.size == 0; }
-inline const QChar *QString::unicode() const
+const QChar QString::at(qsizetype i) const
+{ verify(i, 1); return QChar(d.data()[i]); }
+const QChar QString::operator[](qsizetype i) const
+{ verify(i, 1); return QChar(d.data()[i]); }
+const QChar *QString::unicode() const
{ return data(); }
-inline const QChar *QString::data() const
+const QChar *QString::data() const
{
#if QT5_NULL_STRINGS == 1
return reinterpret_cast<const QChar *>(d.data() ? d.data() : &_empty);
@@ -1241,58 +1237,58 @@ inline const QChar *QString::data() const
return reinterpret_cast<const QChar *>(d.data());
#endif
}
-inline QChar *QString::data()
+QChar *QString::data()
{
detach();
Q_ASSERT(d.data());
return reinterpret_cast<QChar *>(d.data());
}
-inline const QChar *QString::constData() const
+const QChar *QString::constData() const
{ return data(); }
-inline void QString::detach()
+void QString::detach()
{ if (d->needsDetach()) reallocData(d.size, QArrayData::KeepSize); }
-inline bool QString::isDetached() const
+bool QString::isDetached() const
{ return !d->isShared(); }
-inline void QString::clear()
+void QString::clear()
{ if (!isNull()) *this = QString(); }
-inline QString::QString(const QString &other) noexcept : d(other.d)
+QString::QString(const QString &other) noexcept : d(other.d)
{ }
-inline qsizetype QString::capacity() const { return qsizetype(d->constAllocatedCapacity()); }
-inline QString &QString::setNum(short n, int base)
+qsizetype QString::capacity() const { return qsizetype(d->constAllocatedCapacity()); }
+QString &QString::setNum(short n, int base)
{ return setNum(qlonglong(n), base); }
-inline QString &QString::setNum(ushort n, int base)
+QString &QString::setNum(ushort n, int base)
{ return setNum(qulonglong(n), base); }
-inline QString &QString::setNum(int n, int base)
+QString &QString::setNum(int n, int base)
{ return setNum(qlonglong(n), base); }
-inline QString &QString::setNum(uint n, int base)
+QString &QString::setNum(uint n, int base)
{ return setNum(qulonglong(n), base); }
-inline QString &QString::setNum(long n, int base)
+QString &QString::setNum(long n, int base)
{ return setNum(qlonglong(n), base); }
-inline QString &QString::setNum(ulong n, int base)
+QString &QString::setNum(ulong n, int base)
{ return setNum(qulonglong(n), base); }
-inline QString &QString::setNum(float n, char f, int prec)
+QString &QString::setNum(float n, char f, int prec)
{ return setNum(double(n),f,prec); }
-inline QString QString::arg(int a, int fieldWidth, int base, QChar fillChar) const
+QString QString::arg(int a, int fieldWidth, int base, QChar fillChar) const
{ return arg(qlonglong(a), fieldWidth, base, fillChar); }
-inline QString QString::arg(uint a, int fieldWidth, int base, QChar fillChar) const
+QString QString::arg(uint a, int fieldWidth, int base, QChar fillChar) const
{ return arg(qulonglong(a), fieldWidth, base, fillChar); }
-inline QString QString::arg(long a, int fieldWidth, int base, QChar fillChar) const
+QString QString::arg(long a, int fieldWidth, int base, QChar fillChar) const
{ return arg(qlonglong(a), fieldWidth, base, fillChar); }
-inline QString QString::arg(ulong a, int fieldWidth, int base, QChar fillChar) const
+QString QString::arg(ulong a, int fieldWidth, int base, QChar fillChar) const
{ return arg(qulonglong(a), fieldWidth, base, fillChar); }
-inline QString QString::arg(short a, int fieldWidth, int base, QChar fillChar) const
+QString QString::arg(short a, int fieldWidth, int base, QChar fillChar) const
{ return arg(qlonglong(a), fieldWidth, base, fillChar); }
-inline QString QString::arg(ushort a, int fieldWidth, int base, QChar fillChar) const
+QString QString::arg(ushort a, int fieldWidth, int base, QChar fillChar) const
{ return arg(qulonglong(a), fieldWidth, base, fillChar); }
-inline QString QString::section(QChar asep, qsizetype astart, qsizetype aend, SectionFlags aflags) const
+QString QString::section(QChar asep, qsizetype astart, qsizetype aend, SectionFlags aflags) const
{ return section(QString(asep), astart, aend, aflags); }
QT_WARNING_PUSH
QT_WARNING_DISABLE_MSVC(4127) // "conditional expression is constant"
QT_WARNING_DISABLE_INTEL(111) // "statement is unreachable"
-inline qsizetype QString::toWCharArray(wchar_t *array) const
+qsizetype QString::toWCharArray(wchar_t *array) const
{
return qToStringViewIgnoringNull(*this).toWCharArray(array);
}
@@ -1304,23 +1300,29 @@ qsizetype QStringView::toWCharArray(wchar_t *array) const
memcpy(array, src, sizeof(QChar) * size());
return size();
} else {
- return QString::toUcs4_helper(reinterpret_cast<const ushort *>(data()), size(),
- reinterpret_cast<uint *>(array));
+ return QString::toUcs4_helper(utf16(), size(), reinterpret_cast<char32_t *>(array));
}
}
QT_WARNING_POP
-inline QString QString::fromWCharArray(const wchar_t *string, qsizetype size)
+QString QString::fromWCharArray(const wchar_t *string, qsizetype size)
{
- return sizeof(wchar_t) == sizeof(QChar) ? fromUtf16(reinterpret_cast<const char16_t *>(string), size)
- : fromUcs4(reinterpret_cast<const char32_t *>(string), size);
+ if constexpr (sizeof(wchar_t) == sizeof(QChar)) {
+ return QString(reinterpret_cast<const QChar *>(string), size);
+ } else {
+#ifdef QT_BOOTSTRAPPED
+ Q_UNREACHABLE_RETURN(QString());
+#else
+ return fromUcs4(reinterpret_cast<const char32_t *>(string), size);
+#endif
+ }
}
-inline constexpr QString::QString() noexcept {}
-inline QString::~QString() {}
+constexpr QString::QString() noexcept {}
+QString::~QString() {}
-inline void QString::reserve(qsizetype asize)
+void QString::reserve(qsizetype asize)
{
if (d->needsDetach() || asize >= capacity() - d.freeSpaceAtBegin())
reallocData(qMax(asize, size()), QArrayData::KeepSize);
@@ -1328,7 +1330,7 @@ inline void QString::reserve(qsizetype asize)
d->setFlag(Data::CapacityReserved);
}
-inline void QString::squeeze()
+void QString::squeeze()
{
if (!d.isMutable())
return;
@@ -1338,165 +1340,147 @@ inline void QString::squeeze()
d->clearFlag(Data::CapacityReserved);
}
-inline QString &QString::setUtf16(const ushort *autf16, qsizetype asize)
+QString &QString::setUtf16(const ushort *autf16, qsizetype asize)
{ return setUnicode(reinterpret_cast<const QChar *>(autf16), asize); }
-inline QChar &QString::operator[](qsizetype i)
-{ Q_ASSERT(i >= 0 && i < size()); return data()[i]; }
-inline QChar &QString::front() { return operator[](0); }
-inline QChar &QString::back() { return operator[](size() - 1); }
-inline QString::iterator QString::begin()
+QChar &QString::operator[](qsizetype i)
+{ verify(i, 1); return data()[i]; }
+QChar &QString::front() { return operator[](0); }
+QChar &QString::back() { return operator[](size() - 1); }
+QString::iterator QString::begin()
{ detach(); return reinterpret_cast<QChar*>(d.data()); }
-inline QString::const_iterator QString::begin() const
+QString::const_iterator QString::begin() const
{ return reinterpret_cast<const QChar*>(d.data()); }
-inline QString::const_iterator QString::cbegin() const
+QString::const_iterator QString::cbegin() const
{ return reinterpret_cast<const QChar*>(d.data()); }
-inline QString::const_iterator QString::constBegin() const
+QString::const_iterator QString::constBegin() const
{ return reinterpret_cast<const QChar*>(d.data()); }
-inline QString::iterator QString::end()
+QString::iterator QString::end()
{ detach(); return reinterpret_cast<QChar*>(d.data() + d.size); }
-inline QString::const_iterator QString::end() const
+QString::const_iterator QString::end() const
{ return reinterpret_cast<const QChar*>(d.data() + d.size); }
-inline QString::const_iterator QString::cend() const
+QString::const_iterator QString::cend() const
{ return reinterpret_cast<const QChar*>(d.data() + d.size); }
-inline QString::const_iterator QString::constEnd() const
+QString::const_iterator QString::constEnd() const
{ return reinterpret_cast<const QChar*>(d.data() + d.size); }
-#if QT_STRINGVIEW_LEVEL < 2
-inline bool QString::contains(const QString &s, Qt::CaseSensitivity cs) const
+bool QString::contains(const QString &s, Qt::CaseSensitivity cs) const
{ return indexOf(s, 0, cs) != -1; }
-#endif
-inline bool QString::contains(QLatin1String s, Qt::CaseSensitivity cs) const
+bool QString::contains(QLatin1StringView s, Qt::CaseSensitivity cs) const
{ return indexOf(s, 0, cs) != -1; }
-inline bool QString::contains(QChar c, Qt::CaseSensitivity cs) const
+bool QString::contains(QChar c, Qt::CaseSensitivity cs) const
{ return indexOf(c, 0, cs) != -1; }
-inline bool QString::contains(QStringView s, Qt::CaseSensitivity cs) const noexcept
+bool QString::contains(QStringView s, Qt::CaseSensitivity cs) const noexcept
{ return indexOf(s, 0, cs) != -1; }
#if !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII)
-inline bool QString::operator==(const char *s) const
+#if QT_CORE_REMOVED_SINCE(6, 8)
+bool QString::operator==(const char *s) const
{ return QString::compare_helper(constData(), size(), s, -1) == 0; }
-inline bool QString::operator!=(const char *s) const
+bool QString::operator!=(const char *s) const
{ return QString::compare_helper(constData(), size(), s, -1) != 0; }
-inline bool QString::operator<(const char *s) const
+bool QString::operator<(const char *s) const
{ return QString::compare_helper(constData(), size(), s, -1) < 0; }
-inline bool QString::operator>(const char *s) const
+bool QString::operator>(const char *s) const
{ return QString::compare_helper(constData(), size(), s, -1) > 0; }
-inline bool QString::operator<=(const char *s) const
+bool QString::operator<=(const char *s) const
{ return QString::compare_helper(constData(), size(), s, -1) <= 0; }
-inline bool QString::operator>=(const char *s) const
+bool QString::operator>=(const char *s) const
{ return QString::compare_helper(constData(), size(), s, -1) >= 0; }
-QT_ASCII_CAST_WARN inline bool QLatin1String::operator==(const char *s) const
-{ return QString::fromUtf8(s) == *this; }
-QT_ASCII_CAST_WARN inline bool QLatin1String::operator!=(const char *s) const
-{ return QString::fromUtf8(s) != *this; }
-QT_ASCII_CAST_WARN inline bool QLatin1String::operator<(const char *s) const
-{ return QString::fromUtf8(s) > *this; }
-QT_ASCII_CAST_WARN inline bool QLatin1String::operator>(const char *s) const
-{ return QString::fromUtf8(s) < *this; }
-QT_ASCII_CAST_WARN inline bool QLatin1String::operator<=(const char *s) const
-{ return QString::fromUtf8(s) >= *this; }
-QT_ASCII_CAST_WARN inline bool QLatin1String::operator>=(const char *s) const
-{ return QString::fromUtf8(s) <= *this; }
-
-QT_ASCII_CAST_WARN inline bool QLatin1String::operator==(const QByteArray &s) const
-{ return QString::fromUtf8(s) == *this; }
-QT_ASCII_CAST_WARN inline bool QLatin1String::operator!=(const QByteArray &s) const
-{ return QString::fromUtf8(s) != *this; }
-QT_ASCII_CAST_WARN inline bool QLatin1String::operator<(const QByteArray &s) const
-{ return QString::fromUtf8(s) > *this; }
-QT_ASCII_CAST_WARN inline bool QLatin1String::operator>(const QByteArray &s) const
-{ return QString::fromUtf8(s) < *this; }
-QT_ASCII_CAST_WARN inline bool QLatin1String::operator<=(const QByteArray &s) const
-{ return QString::fromUtf8(s) >= *this; }
-QT_ASCII_CAST_WARN inline bool QLatin1String::operator>=(const QByteArray &s) const
-{ return QString::fromUtf8(s) <= *this; }
-
-inline int QLatin1String::compare_helper(const QLatin1String &s1, const char *s2)
-{
- return QString::compare(s1, QString::fromUtf8(s2));
-}
-
-QT_ASCII_CAST_WARN inline bool QString::operator==(const QByteArray &s) const
+QT_ASCII_CAST_WARN bool QString::operator==(const QByteArray &s) const
{ return QString::compare_helper(constData(), size(), s.constData(), s.size()) == 0; }
-QT_ASCII_CAST_WARN inline bool QString::operator!=(const QByteArray &s) const
+QT_ASCII_CAST_WARN bool QString::operator!=(const QByteArray &s) const
{ return QString::compare_helper(constData(), size(), s.constData(), s.size()) != 0; }
-QT_ASCII_CAST_WARN inline bool QString::operator<(const QByteArray &s) const
+QT_ASCII_CAST_WARN bool QString::operator<(const QByteArray &s) const
{ return QString::compare_helper(constData(), size(), s.constData(), s.size()) < 0; }
-QT_ASCII_CAST_WARN inline bool QString::operator>(const QByteArray &s) const
+QT_ASCII_CAST_WARN bool QString::operator>(const QByteArray &s) const
{ return QString::compare_helper(constData(), size(), s.constData(), s.size()) > 0; }
-QT_ASCII_CAST_WARN inline bool QString::operator<=(const QByteArray &s) const
+QT_ASCII_CAST_WARN bool QString::operator<=(const QByteArray &s) const
{ return QString::compare_helper(constData(), size(), s.constData(), s.size()) <= 0; }
-QT_ASCII_CAST_WARN inline bool QString::operator>=(const QByteArray &s) const
+QT_ASCII_CAST_WARN bool QString::operator>=(const QByteArray &s) const
{ return QString::compare_helper(constData(), size(), s.constData(), s.size()) >= 0; }
-inline bool QByteArray::operator==(const QString &s) const
+bool QByteArray::operator==(const QString &s) const
{ return QString::compare_helper(s.constData(), s.size(), constData(), size()) == 0; }
-inline bool QByteArray::operator!=(const QString &s) const
+bool QByteArray::operator!=(const QString &s) const
{ return QString::compare_helper(s.constData(), s.size(), constData(), size()) != 0; }
-inline bool QByteArray::operator<(const QString &s) const
+bool QByteArray::operator<(const QString &s) const
{ return QString::compare_helper(s.constData(), s.size(), constData(), size()) > 0; }
-inline bool QByteArray::operator>(const QString &s) const
+bool QByteArray::operator>(const QString &s) const
{ return QString::compare_helper(s.constData(), s.size(), constData(), size()) < 0; }
-inline bool QByteArray::operator<=(const QString &s) const
+bool QByteArray::operator<=(const QString &s) const
{ return QString::compare_helper(s.constData(), s.size(), constData(), size()) >= 0; }
-inline bool QByteArray::operator>=(const QString &s) const
+bool QByteArray::operator>=(const QString &s) const
{ return QString::compare_helper(s.constData(), s.size(), constData(), size()) <= 0; }
+#endif // QT_CORE_REMOVED_SINCE(6, 8)
#endif // !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII)
#if !defined(QT_USE_FAST_OPERATOR_PLUS) && !defined(QT_USE_QSTRINGBUILDER)
-inline const QString operator+(const QString &s1, const QString &s2)
+inline QString operator+(const QString &s1, const QString &s2)
{ QString t(s1); t += s2; return t; }
-inline const QString operator+(const QString &s1, QChar s2)
+inline QString operator+(QString &&lhs, const QString &rhs)
+{ return std::move(lhs += rhs); }
+inline QString operator+(const QString &s1, QChar s2)
{ QString t(s1); t += s2; return t; }
-inline const QString operator+(QChar s1, const QString &s2)
+inline QString operator+(QString &&lhs, QChar rhs)
+{ return std::move(lhs += rhs); }
+inline QString operator+(QChar s1, const QString &s2)
{ QString t(s1); t += s2; return t; }
# if !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII)
-QT_ASCII_CAST_WARN inline const QString operator+(const QString &s1, const char *s2)
-{ QString t(s1); t += QString::fromUtf8(s2); return t; }
-QT_ASCII_CAST_WARN inline const QString operator+(const char *s1, const QString &s2)
+QT_ASCII_CAST_WARN inline QString operator+(const QString &s1, const char *s2)
+{ QString t(s1); t += QUtf8StringView(s2); return t; }
+QT_ASCII_CAST_WARN inline QString operator+(QString &&lhs, const char *rhs)
+{ QT_IGNORE_DEPRECATIONS(return std::move(lhs += rhs);) }
+QT_ASCII_CAST_WARN inline QString operator+(const char *s1, const QString &s2)
{ QString t = QString::fromUtf8(s1); t += s2; return t; }
-QT_ASCII_CAST_WARN inline const QString operator+(const QByteArray &ba, const QString &s)
+QT_ASCII_CAST_WARN inline QString operator+(const QByteArray &ba, const QString &s)
{ QString t = QString::fromUtf8(ba); t += s; return t; }
-QT_ASCII_CAST_WARN inline const QString operator+(const QString &s, const QByteArray &ba)
-{ QString t(s); t += QString::fromUtf8(ba); return t; }
+QT_ASCII_CAST_WARN inline QString operator+(const QString &s, const QByteArray &ba)
+{ QString t(s); t += QUtf8StringView(ba); return t; }
+QT_ASCII_CAST_WARN inline QString operator+(QString &&lhs, const QByteArray &rhs)
+{ QT_IGNORE_DEPRECATIONS(return std::move(lhs += rhs);) }
# endif // QT_NO_CAST_FROM_ASCII
#endif // QT_USE_QSTRINGBUILDER
-inline std::string QString::toStdString() const
+std::string QString::toStdString() const
{ return toUtf8().toStdString(); }
-inline QString QString::fromStdString(const std::string &s)
-{ return fromUtf8(s.data(), int(s.size())); }
+QString QString::fromStdString(const std::string &s)
+{ return fromUtf8(s.data(), qsizetype(s.size())); }
-inline std::wstring QString::toStdWString() const
+std::wstring QString::toStdWString() const
{
std::wstring str;
- str.resize(length());
+ str.resize(size());
str.resize(toWCharArray(str.data()));
return str;
}
-inline QString QString::fromStdWString(const std::wstring &s)
-{ return fromWCharArray(s.data(), int(s.size())); }
+QString QString::fromStdWString(const std::wstring &s)
+{ return fromWCharArray(s.data(), qsizetype(s.size())); }
-inline QString QString::fromStdU16String(const std::u16string &s)
-{ return fromUtf16(s.data(), int(s.size())); }
+QString QString::fromStdU16String(const std::u16string &s)
+{ return fromUtf16(s.data(), qsizetype(s.size())); }
-inline std::u16string QString::toStdU16String() const
-{ return std::u16string(reinterpret_cast<const char16_t*>(utf16()), length()); }
+std::u16string QString::toStdU16String() const
+{ return std::u16string(reinterpret_cast<const char16_t*>(data()), size()); }
-inline QString QString::fromStdU32String(const std::u32string &s)
-{ return fromUcs4(s.data(), int(s.size())); }
+QString QString::fromStdU32String(const std::u32string &s)
+{ return fromUcs4(s.data(), qsizetype(s.size())); }
-inline std::u32string QString::toStdU32String() const
+std::u32string QString::toStdU32String() const
{
- std::u32string u32str(length(), char32_t(0));
- qsizetype len = toUcs4_helper(reinterpret_cast<const ushort *>(constData()),
- length(), reinterpret_cast<uint*>(&u32str[0]));
+ std::u32string u32str(size(), char32_t(0));
+ const qsizetype len = toUcs4_helper(reinterpret_cast<const char16_t *>(data()),
+ size(), u32str.data());
u32str.resize(len);
return u32str;
}
+QString::operator std::u16string_view() const noexcept
+{
+ return std::u16string_view(d.data(), size_t(d.size));
+}
+
#if !defined(QT_NO_DATASTREAM) || defined(QT_BOOTSTRAPPED)
Q_CORE_EXPORT QDataStream &operator<<(QDataStream &, const QString &);
Q_CORE_EXPORT QDataStream &operator>>(QDataStream &, QString &);
@@ -1505,13 +1489,37 @@ Q_CORE_EXPORT QDataStream &operator>>(QDataStream &, QString &);
Q_DECLARE_SHARED(QString)
Q_DECLARE_OPERATORS_FOR_FLAGS(QString::SectionFlags)
-inline int QString::compare(QStringView s, Qt::CaseSensitivity cs) const noexcept
+int QString::compare(QStringView s, Qt::CaseSensitivity cs) const noexcept
{ return -s.compare(*this, cs); }
-inline int QString::localeAwareCompare(QStringView s) const
-{ return localeAwareCompare_helper(constData(), length(), s.constData(), s.length()); }
-inline int QString::localeAwareCompare(QStringView s1, QStringView s2)
-{ return localeAwareCompare_helper(s1.constData(), s1.length(), s2.constData(), s2.length()); }
+int QString::localeAwareCompare(QStringView s) const
+{ return localeAwareCompare_helper(constData(), size(), s.constData(), s.size()); }
+int QString::localeAwareCompare(QStringView s1, QStringView s2)
+{ return localeAwareCompare_helper(s1.constData(), s1.size(), s2.constData(), s2.size()); }
+int QStringView::localeAwareCompare(QStringView other) const
+{ return QString::localeAwareCompare(*this, other); }
+
+#if QT_CORE_INLINE_IMPL_SINCE(6, 5)
+qint64 QString::toLongLong(bool *ok, int base) const
+{
+ return toIntegral_helper<qlonglong>(*this, ok, base);
+}
+
+quint64 QString::toULongLong(bool *ok, int base) const
+{
+ return toIntegral_helper<qulonglong>(*this, ok, base);
+}
+#endif
+#if QT_CORE_INLINE_IMPL_SINCE(6, 7)
+qsizetype QString::indexOf(QChar ch, qsizetype from, Qt::CaseSensitivity cs) const
+{
+ return qToStringViewIgnoringNull(*this).indexOf(ch, from, cs);
+}
+qsizetype QString::lastIndexOf(QChar ch, qsizetype from, Qt::CaseSensitivity cs) const
+{
+ return qToStringViewIgnoringNull(*this).lastIndexOf(ch, from, cs);
+}
+#endif
namespace QtPrivate {
// used by qPrintable() and qUtf8Printable() macros
@@ -1519,6 +1527,23 @@ inline const QString &asString(const QString &s) { return s; }
inline QString &&asString(QString &&s) { return std::move(s); }
}
+#ifndef qPrintable
+# define qPrintable(string) QtPrivate::asString(string).toLocal8Bit().constData()
+#endif
+
+#ifndef qUtf8Printable
+# define qUtf8Printable(string) QtPrivate::asString(string).toUtf8().constData()
+#endif
+
+/*
+ Wrap QString::utf16() with enough casts to allow passing it
+ to QString::asprintf("%ls") without warnings.
+*/
+#ifndef qUtf16Printable
+# define qUtf16Printable(string) \
+ static_cast<const wchar_t*>(static_cast<const void*>(QtPrivate::asString(string).utf16()))
+#endif
+
//
// QStringView::arg() implementation
//
@@ -1536,13 +1561,13 @@ struct QStringViewArg : ArgBase {
};
struct QLatin1StringArg : ArgBase {
- QLatin1String string;
+ QLatin1StringView string;
QLatin1StringArg() = default;
- constexpr explicit QLatin1StringArg(QLatin1String v) noexcept : ArgBase{L1}, string{v} {}
+ constexpr explicit QLatin1StringArg(QLatin1StringView v) noexcept : ArgBase{L1}, string{v} {}
};
[[nodiscard]] Q_CORE_EXPORT QString argToQString(QStringView pattern, size_t n, const ArgBase **args);
-[[nodiscard]] Q_CORE_EXPORT QString argToQString(QLatin1String pattern, size_t n, const ArgBase **args);
+[[nodiscard]] Q_CORE_EXPORT QString argToQString(QLatin1StringView pattern, size_t n, const ArgBase **args);
template <typename StringView, typename...Args>
[[nodiscard]] Q_ALWAYS_INLINE QString argToQStringDispatch(StringView pattern, const Args &...args)
@@ -1554,7 +1579,7 @@ template <typename StringView, typename...Args>
inline QStringViewArg qStringLikeToArg(const QString &s) noexcept { return QStringViewArg{qToStringViewIgnoringNull(s)}; }
constexpr inline QStringViewArg qStringLikeToArg(QStringView s) noexcept { return QStringViewArg{s}; }
inline QStringViewArg qStringLikeToArg(const QChar &c) noexcept { return QStringViewArg{QStringView{&c, 1}}; }
-constexpr inline QLatin1StringArg qStringLikeToArg(QLatin1String s) noexcept { return QLatin1StringArg{s}; }
+constexpr inline QLatin1StringArg qStringLikeToArg(QLatin1StringView s) noexcept { return QLatin1StringArg{s}; }
} // namespace QtPrivate
@@ -1567,7 +1592,7 @@ QString QStringView::arg(Args &&...args) const
template <typename...Args>
Q_ALWAYS_INLINE
-QString QLatin1String::arg(Args &&...args) const
+QString QLatin1StringView::arg(Args &&...args) const
{
return QtPrivate::argToQStringDispatch(*this, QtPrivate::qStringLikeToArg(args)...);
}
@@ -1575,26 +1600,46 @@ QString QLatin1String::arg(Args &&...args) const
template <typename T>
qsizetype erase(QString &s, const T &t)
{
- return QtPrivate::sequential_erase(s, t);
+ return s.removeIf_helper([&t](const auto &e) { return t == e; });
}
template <typename Predicate>
qsizetype erase_if(QString &s, Predicate pred)
{
- return QtPrivate::sequential_erase_if(s, pred);
+ return s.removeIf_helper(pred);
}
-inline namespace QtLiterals {
-inline QString operator"" _qs(const char16_t *str, size_t size) noexcept
+namespace Qt {
+inline namespace Literals {
+inline namespace StringLiterals {
+inline QString operator""_s(const char16_t *str, size_t size) noexcept
{
return QString(QStringPrivate(nullptr, const_cast<char16_t *>(str), qsizetype(size)));
}
+
+} // StringLiterals
+} // Literals
+} // Qt
+
+inline namespace QtLiterals {
+#if QT_DEPRECATED_SINCE(6, 8)
+
+QT_DEPRECATED_VERSION_X_6_8("Use _s from Qt::StringLiterals namespace instead.")
+inline QString operator""_qs(const char16_t *str, size_t size) noexcept
+{
+ return Qt::StringLiterals::operator""_s(str, size);
+}
+
+#endif // QT_DEPRECATED_SINCE(6, 8)
} // QtLiterals
QT_END_NAMESPACE
-#if defined(QT_USE_FAST_OPERATOR_PLUS) || defined(QT_USE_QSTRINGBUILDER)
#include <QtCore/qstringbuilder.h>
+#include <QtCore/qstringconverter.h>
+
+#ifdef Q_L1S_VIEW_IS_PRIMARY
+# undef Q_L1S_VIEW_IS_PRIMARY
#endif
#endif // QSTRING_H
diff --git a/src/corelib/text/qstring_mips_dsp_asm.S b/src/corelib/text/qstring_mips_dsp_asm.S
index 202f322310..da764b2e9a 100644
--- a/src/corelib/text/qstring_mips_dsp_asm.S
+++ b/src/corelib/text/qstring_mips_dsp_asm.S
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 Imagination Technologies Limited, www.imgtec.com
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2013 Imagination Technologies Limited, www.imgtec.com
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "../../gui/painting/qt_mips_asm_dsp_p.h"
diff --git a/src/corelib/text/qstringalgorithms.h b/src/corelib/text/qstringalgorithms.h
index 68d47b2893..71a1dbd526 100644
--- a/src/corelib/text/qstringalgorithms.h
+++ b/src/corelib/text/qstringalgorithms.h
@@ -1,138 +1,112 @@
-/****************************************************************************
-**
-** Copyright (C) 2017 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2017 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QSTRINGALGORITHMS_H
#define QSTRINGALGORITHMS_H
-#include <QtCore/qnamespace.h>
+#include <QtCore/qbytearrayalgorithms.h>
#include <QtCore/qcontainerfwd.h>
+#include <QtCore/qnamespace.h>
+#include <QtCore/qstringfwd.h>
#if 0
#pragma qt_class(QStringAlgorithms)
#endif
-QT_BEGIN_NAMESPACE
+#include <algorithm> // std::find
+#include <iterator> // std::size
-#if QT_VERSION >= QT_VERSION_CHECK(7, 0, 0)
-# define QT_BEGIN_HAS_CHAR8_T_NAMESPACE inline namespace q_has_char8_t {
-# define QT_BEGIN_NO_CHAR8_T_NAMESPACE namespace q_no_char8_t {
-#else
-# define QT_BEGIN_HAS_CHAR8_T_NAMESPACE namespace q_has_char8_t {
-# define QT_BEGIN_NO_CHAR8_T_NAMESPACE inline namespace q_no_char8_t {
-#endif
-#define QT_END_HAS_CHAR8_T_NAMESPACE }
-#define QT_END_NO_CHAR8_T_NAMESPACE }
-
-// declare namespaces:
-QT_BEGIN_HAS_CHAR8_T_NAMESPACE
-QT_END_HAS_CHAR8_T_NAMESPACE
-QT_BEGIN_NO_CHAR8_T_NAMESPACE
-QT_END_NO_CHAR8_T_NAMESPACE
-
-class QByteArray;
-class QLatin1String;
-class QStringView;
-template <bool> class QBasicUtf8StringView;
-class QAnyStringView;
-class QChar;
-class QRegularExpression;
-class QRegularExpressionMatch;
+#include <QtCore/q20type_traits.h> // q20::is_constant_evaluated
+
+QT_BEGIN_NAMESPACE
namespace QtPrivate {
[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION qsizetype qustrlen(const char16_t *str) noexcept;
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION qsizetype qustrnlen(const char16_t *str, qsizetype maxlen) noexcept;
[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION const char16_t *qustrchr(QStringView str, char16_t ch) noexcept;
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION const char16_t *qustrcasechr(QStringView str, char16_t ch) noexcept;
[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION int compareStrings(QStringView lhs, QStringView rhs, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
-[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION int compareStrings(QStringView lhs, QLatin1String rhs, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION int compareStrings(QStringView lhs, QLatin1StringView rhs, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION int compareStrings(QStringView lhs, QBasicUtf8StringView<false> rhs, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
-[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION int compareStrings(QLatin1String lhs, QStringView rhs, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
-[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION int compareStrings(QLatin1String lhs, QLatin1String rhs, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
-[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION int compareStrings(QLatin1String lhs, QBasicUtf8StringView<false> rhs, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION int compareStrings(QLatin1StringView lhs, QStringView rhs, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION int compareStrings(QLatin1StringView lhs, QLatin1StringView rhs, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION int compareStrings(QLatin1StringView lhs, QBasicUtf8StringView<false> rhs, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION int compareStrings(QBasicUtf8StringView<false> lhs, QStringView rhs, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
-[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION int compareStrings(QBasicUtf8StringView<false> lhs, QLatin1String rhs, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION int compareStrings(QBasicUtf8StringView<false> lhs, QLatin1StringView rhs, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION int compareStrings(QBasicUtf8StringView<false> lhs, QBasicUtf8StringView<false> rhs, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool equalStrings(QStringView lhs, QStringView rhs) noexcept;
-[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool equalStrings(QStringView lhs, QLatin1String rhs) noexcept;
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool equalStrings(QStringView lhs, QLatin1StringView rhs) noexcept;
[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool equalStrings(QStringView lhs, QBasicUtf8StringView<false> rhs) noexcept;
-[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool equalStrings(QLatin1String lhs, QStringView rhs) noexcept;
-[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool equalStrings(QLatin1String lhs, QLatin1String rhs) noexcept;
-[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool equalStrings(QLatin1String lhs, QBasicUtf8StringView<false> rhs) noexcept;
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool equalStrings(QLatin1StringView lhs, QStringView rhs) noexcept;
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool equalStrings(QLatin1StringView lhs, QLatin1StringView rhs) noexcept;
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool equalStrings(QLatin1StringView lhs, QBasicUtf8StringView<false> rhs) noexcept;
[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool equalStrings(QBasicUtf8StringView<false> lhs, QStringView rhs) noexcept;
-[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool equalStrings(QBasicUtf8StringView<false> lhs, QLatin1String rhs) noexcept;
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool equalStrings(QBasicUtf8StringView<false> lhs, QLatin1StringView rhs) noexcept;
[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool equalStrings(QBasicUtf8StringView<false> lhs, QBasicUtf8StringView<false> rhs) noexcept;
[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool startsWith(QStringView haystack, QStringView needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
-[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool startsWith(QStringView haystack, QLatin1String needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
-[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool startsWith(QLatin1String haystack, QStringView needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
-[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool startsWith(QLatin1String haystack, QLatin1String needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool startsWith(QStringView haystack, QLatin1StringView needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool startsWith(QLatin1StringView haystack, QStringView needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool startsWith(QLatin1StringView haystack, QLatin1StringView needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool endsWith(QStringView haystack, QStringView needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
-[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool endsWith(QStringView haystack, QLatin1String needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
-[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool endsWith(QLatin1String haystack, QStringView needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
-[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool endsWith(QLatin1String haystack, QLatin1String needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool endsWith(QStringView haystack, QLatin1StringView needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool endsWith(QLatin1StringView haystack, QStringView needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool endsWith(QLatin1StringView haystack, QLatin1StringView needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION qsizetype findStringInsensitive(QStringView haystack, qsizetype from, char16_t needle) noexcept;
+[[nodiscard]] inline qsizetype findString(QStringView str, qsizetype from, QChar needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION qsizetype findString(QStringView haystack, qsizetype from, QStringView needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
-[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION qsizetype findString(QStringView haystack, qsizetype from, QLatin1String needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
-[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION qsizetype findString(QLatin1String haystack, qsizetype from, QStringView needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
-[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION qsizetype findString(QLatin1String haystack, qsizetype from, QLatin1String needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION qsizetype findString(QStringView haystack, qsizetype from, QLatin1StringView needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION qsizetype findString(QLatin1StringView haystack, qsizetype from, QStringView needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION qsizetype findString(QLatin1StringView haystack, qsizetype from, QLatin1StringView needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION qsizetype lastIndexOf(QStringView haystack, qsizetype from, char16_t needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION qsizetype lastIndexOf(QStringView haystack, qsizetype from, QStringView needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
-[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION qsizetype lastIndexOf(QStringView haystack, qsizetype from, QLatin1String needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
-[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION qsizetype lastIndexOf(QLatin1String haystack, qsizetype from, QStringView needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
-[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION qsizetype lastIndexOf(QLatin1String haystack, qsizetype from, QLatin1String needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION qsizetype lastIndexOf(QStringView haystack, qsizetype from, QLatin1StringView needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION qsizetype lastIndexOf(QLatin1StringView haystack, qsizetype from, QStringView needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION qsizetype lastIndexOf(QLatin1StringView haystack, qsizetype from, QLatin1StringView needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION QStringView trimmed(QStringView s) noexcept;
-[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION QLatin1String trimmed(QLatin1String s) noexcept;
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION QLatin1StringView trimmed(QLatin1StringView s) noexcept;
+
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool isLower(QStringView s) noexcept;
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool isUpper(QStringView s) noexcept;
[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION qsizetype count(QStringView haystack, QChar needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION qsizetype count(QStringView haystack, QStringView needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION qsizetype count(QStringView haystack, QLatin1StringView needle, Qt::CaseSensitivity cs = Qt::CaseSensitive);
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION qsizetype count(QLatin1StringView haystack, QLatin1StringView needle, Qt::CaseSensitivity cs = Qt::CaseSensitive);
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION qsizetype count(QLatin1StringView haystack, QStringView needle, Qt::CaseSensitivity cs = Qt::CaseSensitive);
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION qsizetype count(QLatin1StringView haystack, QChar needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
#if QT_CONFIG(regularexpression)
+// ### Qt 7: unify these overloads;
+// remove the ones taking only a QStringView, export the others, adjust callers
+[[nodiscard]] qsizetype indexOf(QStringView viewHaystack,
+ const QString *stringHaystack,
+ const QRegularExpression &re,
+ qsizetype from = 0,
+ QRegularExpressionMatch *rmatch = nullptr);
[[nodiscard]] Q_CORE_EXPORT qsizetype indexOf(QStringView haystack,
const QRegularExpression &re,
qsizetype from = 0,
QRegularExpressionMatch *rmatch = nullptr);
+[[nodiscard]] qsizetype lastIndexOf(QStringView viewHaystack,
+ const QString *stringHaystack,
+ const QRegularExpression &re,
+ qsizetype from = -1,
+ QRegularExpressionMatch *rmatch = nullptr);
[[nodiscard]] Q_CORE_EXPORT qsizetype lastIndexOf(QStringView haystack,
const QRegularExpression &re,
qsizetype from = -1,
QRegularExpressionMatch *rmatch = nullptr);
+[[nodiscard]] bool contains(QStringView viewHaystack,
+ const QString *stringHaystack,
+ const QRegularExpression &re,
+ QRegularExpressionMatch *rmatch = nullptr);
[[nodiscard]] Q_CORE_EXPORT bool contains(QStringView haystack,
const QRegularExpression &re,
QRegularExpressionMatch *rmatch = nullptr);
@@ -148,13 +122,88 @@ namespace QtPrivate {
[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool isRightToLeft(QStringView string) noexcept;
-[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool isAscii(QLatin1String s) noexcept;
+[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool isAscii(QLatin1StringView s) noexcept;
[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool isAscii(QStringView s) noexcept;
-[[nodiscard]] constexpr inline bool isLatin1(QLatin1String s) noexcept;
+[[nodiscard]] constexpr inline bool isLatin1(QLatin1StringView s) noexcept;
[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool isLatin1(QStringView s) noexcept;
[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool isValidUtf16(QStringView s) noexcept;
-} // namespace QtPRivate
+template <typename Char, size_t N> [[nodiscard]] constexpr Q_ALWAYS_INLINE
+qsizetype lengthHelperContainerLoop(const Char (&str)[N])
+{
+#if defined(__cpp_lib_constexpr_algorithms) && defined(Q_CC_GNU_ONLY)
+ // libstdc++'s std::find / std::find_if manages to execute more steps
+ // than the loop below
+ const auto it = std::find(str, str + N, Char(0));
+ return it - str;
+#else
+ // std::char_traits<C> is deprecated for C not one of the standard char
+ // types, so we have to roll out our own loop.
+ for (size_t i = 0; i < N; ++i) {
+ if (str[i] == Char(0))
+ return qsizetype(i);
+ }
+ return qsizetype(N);
+#endif
+}
+
+template <typename Char, size_t N> [[nodiscard]] constexpr Q_ALWAYS_INLINE
+std::enable_if_t<sizeof(Char) == sizeof(char16_t), qsizetype>
+lengthHelperContainer(const Char (&str)[N])
+{
+ // The following values were empirically determined to detect the threshold
+ // at which the compiler gives up pre-calculating the std::find() below and
+ // instead inserts code to be executed at runtime.
+ constexpr size_t RuntimeThreshold =
+#if defined(Q_CC_CLANG)
+ // tested on Clang 15, 16 & 17
+ 1023
+#elif defined(Q_CC_GNU)
+ // tested through GCC 13.1 at -O3 compilation level
+ // note: at -O2, GCC always generates a loop!
+ __cplusplus >= 202002L ? 39 : 17
+#else
+ 0
+#endif
+ ;
+ if constexpr (N == 1) {
+ return str[0] == Char(0) ? 0 : 1;
+ } else if constexpr (N > RuntimeThreshold) {
+#ifdef QT_SUPPORTS_IS_CONSTANT_EVALUATED
+ if (!q20::is_constant_evaluated())
+ return QtPrivate::qustrnlen(reinterpret_cast<const char16_t *>(str), N);
+#endif
+ }
+
+ return lengthHelperContainerLoop(str);
+}
+
+inline qsizetype qstrnlen_helper(const char *str, size_t maxlen)
+{
+#if !defined(Q_COMPILER_SLOW_QSTRNLEN_COMPILATION)
+ return qstrnlen(str, maxlen);
+#else
+ return strnlen_s(str, maxlen);
+#endif
+}
+
+template <typename Char, size_t N> [[nodiscard]] constexpr inline
+std::enable_if_t<sizeof(Char) == 1, qsizetype> lengthHelperContainer(const Char (&str)[N])
+{
+#ifdef QT_SUPPORTS_IS_CONSTANT_EVALUATED
+ if (!q20::is_constant_evaluated())
+ return qstrnlen_helper(reinterpret_cast<const char *>(str), N);
+#endif
+
+ return lengthHelperContainerLoop(str);
+}
+
+template <typename Container>
+constexpr qsizetype lengthHelperContainer(const Container &c) noexcept
+{
+ return qsizetype(std::size(c));
+}
+} // namespace QtPrivate
QT_END_NAMESPACE
diff --git a/src/corelib/text/qstringalgorithms_p.h b/src/corelib/text/qstringalgorithms_p.h
index 64d9f2e676..f34acb01e8 100644
--- a/src/corelib/text/qstringalgorithms_p.h
+++ b/src/corelib/text/qstringalgorithms_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QSTRINGALGORITHMS_P_H
#define QSTRINGALGORITHMS_P_H
@@ -83,26 +47,34 @@ template <typename StringType> struct QStringAlgorithms
static inline StringType trimmed_helper_inplace(const NakedStringType &, const Char *, const Char *)
{
// can't happen
- Q_UNREACHABLE();
- return StringType();
+ Q_UNREACHABLE_RETURN(StringType());
}
- static inline void trimmed_helper_positions(const Char *&begin, const Char *&end)
+ struct TrimPositions {
+ const Char *begin;
+ const Char *end;
+ };
+ // Returns {begin, end} where:
+ // - "begin" refers to the first non-space character
+ // - if there is a sequence of one or more space chacaters at the end,
+ // "end" refers to the first character in that sequence, otherwise
+ // "end" is str.cend()
+ [[nodiscard]] static TrimPositions trimmed_helper_positions(const StringType &str)
{
+ const Char *begin = str.cbegin();
+ const Char *end = str.cend();
// skip white space from end
while (begin < end && isSpace(end[-1]))
--end;
// skip white space from start
while (begin < end && isSpace(*begin))
begin++;
+ return {begin, end};
}
static inline StringType trimmed_helper(StringType &str)
{
- const Char *begin = str.cbegin();
- const Char *end = str.cend();
- trimmed_helper_positions(begin, end);
-
+ const auto [begin, end] = trimmed_helper_positions(str);
if (begin == str.cbegin() && end == str.cend())
return str;
if (!isConst && str.isDetached())
@@ -137,7 +109,7 @@ template <typename StringType> struct QStringAlgorithms
if (ptr != dst && ptr[-1] == QChar::Space)
--ptr;
- int newlen = ptr - dst;
+ qsizetype newlen = ptr - dst;
if (isConst && newlen == str.size() && unmodified) {
// nothing happened, return the original
return str;
diff --git a/src/corelib/text/qstringbuilder.cpp b/src/corelib/text/qstringbuilder.cpp
index dcb3644fb0..738ce833ef 100644
--- a/src/corelib/text/qstringbuilder.cpp
+++ b/src/corelib/text/qstringbuilder.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qstringbuilder.h"
#include <private/qstringconverter_p.h>
@@ -74,7 +38,7 @@ QT_BEGIN_NAMESPACE
\list
\li QString, (since 5.10:) QStringView
\li QChar, QLatin1Char, (since 5.10:) \c char16_t,
- \li QLatin1String,
+ \li QLatin1StringView,
\li (since 5.10:) \c{const char16_t[]} (\c{u"foo"}),
\li QByteArray, \c char, \c{const char[]}.
\endlist
@@ -93,36 +57,57 @@ QT_BEGIN_NAMESPACE
if there are three or more of them, and performs equally well in other
cases.
- \sa QLatin1String, QString
+ \note Defining \c QT_USE_QSTRINGBUILDER at build time (this is the
+ default when building Qt libraries and tools), will make using \c {'+'}
+ when concatenating strings work the same way as \c operator%().
+
+ \sa QLatin1StringView, QString
*/
-/*! \fn template <typename A, typename B> QStringBuilder<A, B>::QStringBuilder(const A &a, const B &b)
- Constructs a QStringBuilder from \a a and \a b.
+/*!
+ \internal
+ \fn template <typename A, typename B> QStringBuilder<A, B>::QStringBuilder(const A &a, const B &b)
+
+ Constructs a QStringBuilder from \a a and \a b.
*/
-/* \fn template <typename A, typename B> QStringBuilder<A, B>::operator%(const A &a, const B &b)
+/*!
+ \internal
+ \fn template <typename A, typename B> QStringBuilder<A, B>::operator%(const A &a, const B &b)
Returns a \c QStringBuilder object that is converted to a QString object
when assigned to a variable of QString type or passed to a function that
takes a QString parameter.
- This function is usable with arguments of type \c QString,
- \c QLatin1String,
- \c QChar, \c QLatin1Char, and \c char.
+ This function is usable with arguments of any of the following types:
+ \list
+ \li \c QAnyStringView,
+ \li \c QString, \c QStringView
+ \li \c QByteArray, \c QByteArrayView, \c QLatin1StringView
+ \li \c QChar, \c QLatin1Char, \c char, (since 5.10:) \c char16_t
+ \li (since 5.10:) \c{const char16_t[]} (\c{u"foo"}),
+ \endlist
*/
-/* \fn template <typename A, typename B> QByteArray QStringBuilder<A, B>::toLatin1() const
- Returns a Latin-1 representation of the string as a QByteArray. The
- returned byte array is undefined if the string contains non-Latin1
- characters.
- */
-/* \fn template <typename A, typename B> QByteArray QStringBuilder<A, B>::toUtf8() const
- Returns a UTF-8 representation of the string as a QByteArray.
+/*!
+ \internal
+ \fn template <typename A, typename B> QByteArray QStringBuilder<A, B>::toLatin1() const
+
+ Returns a Latin-1 representation of the string as a QByteArray. It
+ is undefined behavior if the string contains non-Latin1 characters.
*/
+/*!
+ \internal
+ \fn template <typename A, typename B> QByteArray QStringBuilder<A, B>::toUtf8() const
+
+ Returns a UTF-8 representation of the string as a QByteArray.
+ */
/*!
\internal
+ Converts the UTF-8 string viewed by \a in to UTF-16 and writes the result
+ to the buffer starting at \a out.
*/
void QAbstractConcatenable::convertFromUtf8(QByteArrayView in, QChar *&out) noexcept
{
diff --git a/src/corelib/text/qstringbuilder.h b/src/corelib/text/qstringbuilder.h
index f3cbba26dd..853033b2d9 100644
--- a/src/corelib/text/qstringbuilder.h
+++ b/src/corelib/text/qstringbuilder.h
@@ -1,41 +1,7 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#include <QtCore/qstring.h>
#ifndef QSTRINGBUILDER_H
#define QSTRINGBUILDER_H
@@ -47,7 +13,6 @@
#pragma qt_sync_stop_processing
#endif
-#include <QtCore/qstring.h>
#include <QtCore/qbytearray.h>
#include <string.h>
@@ -63,16 +28,28 @@ protected:
{
*out++ = QLatin1Char(a);
}
- static void appendLatin1To(QLatin1String in, QChar *out) noexcept;
+ static void appendLatin1To(QLatin1StringView in, QChar *out) noexcept;
};
-template <typename T> struct QConcatenable {};
+template <typename T> struct QConcatenable;
+
+template <typename T>
+using QConcatenableEx = QConcatenable<q20::remove_cvref_t<T>>;
namespace QtStringBuilder {
template <typename A, typename B> struct ConvertToTypeHelper
{ typedef A ConvertTo; };
template <typename T> struct ConvertToTypeHelper<T, QString>
{ typedef QString ConvertTo; };
+
+ template <typename T> using HasIsNull = decltype(std::declval<const T &>().isNull());
+ template <typename T> bool isNull(const T &t)
+ {
+ if constexpr (qxp::is_detected_v<HasIsNull, T>)
+ return t.isNull();
+ else
+ return false;
+ }
}
template<typename Builder, typename T>
@@ -99,28 +76,50 @@ struct QStringBuilderBase<Builder, QString> : public QStringBuilderCommon<Builde
};
template <typename A, typename B>
-class QStringBuilder : public QStringBuilderBase<QStringBuilder<A, B>, typename QtStringBuilder::ConvertToTypeHelper<typename QConcatenable<A>::ConvertTo, typename QConcatenable<B>::ConvertTo>::ConvertTo>
+class QStringBuilder : public QStringBuilderBase<QStringBuilder<A, B>,
+ typename QtStringBuilder::ConvertToTypeHelper<
+ typename QConcatenableEx<A>::ConvertTo,
+ typename QConcatenableEx<B>::ConvertTo
+ >::ConvertTo
+ >
{
public:
- QStringBuilder(const A &a_, const B &b_) : a(a_), b(b_) {}
+ QStringBuilder(A &&a_, B &&b_) : a(std::forward<A>(a_)), b(std::forward<B>(b_)) {}
+
+ QStringBuilder(QStringBuilder &&) = default;
+ QStringBuilder(const QStringBuilder &) = default;
+ ~QStringBuilder() = default;
+
private:
friend class QByteArray;
friend class QString;
template <typename T> T convertTo() const
{
- const qsizetype len = QConcatenable< QStringBuilder<A, B> >::size(*this);
- T s(len, Qt::Uninitialized);
+ if (isNull()) {
+ // appending two null strings must give back a null string,
+ // so we're special casing this one out, QTBUG-114206
+ return T();
+ }
- // we abuse const_cast / constData here because we know we've just
- // allocated the data and we're the only reference count
- typename T::iterator d = const_cast<typename T::iterator>(s.constData());
- typename T::const_iterator const start = d;
- QConcatenable< QStringBuilder<A, B> >::appendTo(*this, d);
+ const qsizetype len = Concatenable::size(*this);
+ T s(len, Qt::Uninitialized);
- if (!QConcatenable< QStringBuilder<A, B> >::ExactSize && len != d - start) {
- // this resize is necessary since we allocate a bit too much
- // when dealing with variable sized 8-bit encodings
- s.resize(d - start);
+ // Using data_ptr() here (private API) so we can bypass the
+ // isDetached() and the replacement of a null pointer with _empty in
+ // both QString and QByteArray's data() and constData(). The result is
+ // the same if len != 0.
+ auto d = reinterpret_cast<typename T::iterator>(s.data_ptr().data());
+ const auto start = d;
+ Concatenable::appendTo(*this, d);
+
+ if constexpr (Concatenable::ExactSize) {
+ Q_UNUSED(start)
+ } else {
+ if (len != d - start) {
+ // this resize is necessary since we allocate a bit too much
+ // when dealing with variable sized 8-bit encodings
+ s.resize(d - start);
+ }
}
return s;
}
@@ -132,45 +131,19 @@ public:
qsizetype size() const { return Concatenable::size(*this); }
- const A &a;
- const B &b;
-};
-
-template <>
-class QStringBuilder <QString, QString> : public QStringBuilderBase<QStringBuilder<QString, QString>, QString>
-{
- public:
- QStringBuilder(const QString &a_, const QString &b_) : a(a_), b(b_) {}
- QStringBuilder(const QStringBuilder &other) : a(other.a), b(other.b) {}
-
- operator QString() const
- { QString r(a); r += b; return r; }
-
- const QString &a;
- const QString &b;
-
- private:
- QStringBuilder &operator=(const QStringBuilder &) = delete;
-};
-
-template <>
-class QStringBuilder <QByteArray, QByteArray> : public QStringBuilderBase<QStringBuilder<QByteArray, QByteArray>, QByteArray>
-{
- public:
- QStringBuilder(const QByteArray &a_, const QByteArray &b_) : a(a_), b(b_) {}
- QStringBuilder(const QStringBuilder &other) : a(other.a), b(other.b) {}
-
- operator QByteArray() const
- { QByteArray r(a); r += b; return r; }
+ bool isNull() const
+ {
+ return QtStringBuilder::isNull(a) && QtStringBuilder::isNull(b);
+ }
- const QByteArray &a;
- const QByteArray &b;
+ A a;
+ B b;
- private:
- QStringBuilder &operator=(const QStringBuilder &) = delete;
+private:
+ QStringBuilder &operator=(QStringBuilder &&) = delete;
+ QStringBuilder &operator=(const QStringBuilder &) = delete;
};
-
template <> struct QConcatenable<char> : private QAbstractConcatenable
{
typedef char type;
@@ -250,18 +223,18 @@ template <> struct QConcatenable<QChar::SpecialCharacter> : private QAbstractCon
{ *out++ = c; }
};
-template <> struct QConcatenable<QLatin1String> : private QAbstractConcatenable
+template <> struct QConcatenable<QLatin1StringView> : private QAbstractConcatenable
{
- typedef QLatin1String type;
+ typedef QLatin1StringView type;
typedef QString ConvertTo;
enum { ExactSize = true };
- static qsizetype size(const QLatin1String a) { return a.size(); }
- static inline void appendTo(const QLatin1String a, QChar *&out)
+ static qsizetype size(const QLatin1StringView a) { return a.size(); }
+ static inline void appendTo(const QLatin1StringView a, QChar *&out)
{
appendLatin1To(a, out);
out += a.size();
}
- static inline void appendTo(const QLatin1String a, char *&out)
+ static inline void appendTo(const QLatin1StringView a, char *&out)
{
if (const char *data = a.data()) {
memcpy(out, data, a.size());
@@ -400,10 +373,10 @@ template <> struct QConcatenable<QByteArray> : private QAbstractConcatenable
#endif
static inline void appendTo(const QByteArray &ba, char *&out)
{
- const char *a = ba.constData();
- const char * const end = ba.end();
- while (a != end)
- *out++ = *a++;
+ const qsizetype n = ba.size();
+ if (n)
+ memcpy(out, ba.begin(), n);
+ out += n;
}
};
@@ -412,34 +385,37 @@ template <typename A, typename B>
struct QConcatenable< QStringBuilder<A, B> >
{
typedef QStringBuilder<A, B> type;
- typedef typename QtStringBuilder::ConvertToTypeHelper<typename QConcatenable<A>::ConvertTo, typename QConcatenable<B>::ConvertTo>::ConvertTo ConvertTo;
- enum { ExactSize = QConcatenable<A>::ExactSize && QConcatenable<B>::ExactSize };
+ using ConvertTo = typename QtStringBuilder::ConvertToTypeHelper<
+ typename QConcatenableEx<A>::ConvertTo,
+ typename QConcatenableEx<B>::ConvertTo
+ >::ConvertTo;
+ enum { ExactSize = QConcatenableEx<A>::ExactSize && QConcatenableEx<B>::ExactSize };
static qsizetype size(const type &p)
{
- return QConcatenable<A>::size(p.a) + QConcatenable<B>::size(p.b);
+ return QConcatenableEx<A>::size(p.a) + QConcatenableEx<B>::size(p.b);
}
template<typename T> static inline void appendTo(const type &p, T *&out)
{
- QConcatenable<A>::appendTo(p.a, out);
- QConcatenable<B>::appendTo(p.b, out);
+ QConcatenableEx<A>::appendTo(p.a, out);
+ QConcatenableEx<B>::appendTo(p.b, out);
}
};
-template <typename A, typename B>
-QStringBuilder<typename QConcatenable<A>::type, typename QConcatenable<B>::type>
-operator%(const A &a, const B &b)
+template <typename A, typename B,
+ typename = std::void_t<typename QConcatenableEx<A>::type, typename QConcatenableEx<B>::type>>
+auto operator%(A &&a, B &&b)
{
- return QStringBuilder<typename QConcatenable<A>::type, typename QConcatenable<B>::type>(a, b);
+ return QStringBuilder<A, B>(std::forward<A>(a), std::forward<B>(b));
}
// QT_USE_FAST_OPERATOR_PLUS was introduced in 4.7, QT_USE_QSTRINGBUILDER is to be used from 4.8 onwards
// QT_USE_FAST_OPERATOR_PLUS does not remove the normal operator+ for QByteArray
#if defined(QT_USE_FAST_OPERATOR_PLUS) || defined(QT_USE_QSTRINGBUILDER)
-template <typename A, typename B>
-QStringBuilder<typename QConcatenable<A>::type, typename QConcatenable<B>::type>
-operator+(const A &a, const B &b)
+template <typename A, typename B,
+ typename = std::void_t<typename QConcatenableEx<A>::type, typename QConcatenableEx<B>::type>>
+auto operator+(A &&a, B &&b)
{
- return QStringBuilder<typename QConcatenable<A>::type, typename QConcatenable<B>::type>(a, b);
+ return std::forward<A>(a) % std::forward<B>(b);
}
#endif
@@ -449,7 +425,9 @@ QByteArray &appendToByteArray(QByteArray &a, const QStringBuilder<A, B> &b, char
{
// append 8-bit data to a byte array
qsizetype len = a.size() + QConcatenable< QStringBuilder<A, B> >::size(b);
- a.reserve(len);
+ a.detach(); // a detach() in a.data() could reset a.capacity() to a.size()
+ if (len > a.data_ptr().freeSpaceAtEnd()) // capacity() was broken when prepend()-optimization landed
+ a.reserve(qMax(len, 2 * a.capacity()));
char *it = a.data() + a.size();
QConcatenable< QStringBuilder<A, B> >::appendTo(b, it);
a.resize(len); //we need to resize after the appendTo for the case str+=foo+str
@@ -476,22 +454,16 @@ template <typename A, typename B>
QString &operator+=(QString &a, const QStringBuilder<A, B> &b)
{
qsizetype len = a.size() + QConcatenable< QStringBuilder<A, B> >::size(b);
- a.reserve(len);
+ a.detach(); // a detach() in a.data() could reset a.capacity() to a.size()
+ if (len > a.data_ptr().freeSpaceAtEnd()) // capacity() was broken when prepend()-optimization landed
+ a.reserve(qMax(len, 2 * a.capacity()));
QChar *it = a.data() + a.size();
QConcatenable< QStringBuilder<A, B> >::appendTo(b, it);
+ // we need to resize after the appendTo for the case str+=foo+str
a.resize(it - a.constData()); //may be smaller than len if there was conversion from utf8
return a;
}
-//
-// inline QAnyStringView members requiring QStringBuilder:
-//
-
-template <typename A, typename B>
-QAnyStringView::QAnyStringView(const QStringBuilder<A, B> &expr,
- typename QConcatenable<QStringBuilder<A, B>>::ConvertTo &&capacity)
- : QAnyStringView(capacity = expr) {}
-
QT_END_NAMESPACE
#endif // QSTRINGBUILDER_H
diff --git a/src/corelib/text/qstringconverter.cpp b/src/corelib/text/qstringconverter.cpp
index 0a42ec7964..67c75d708e 100644
--- a/src/corelib/text/qstringconverter.cpp
+++ b/src/corelib/text/qstringconverter.cpp
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Copyright (C) 2020 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// Copyright (C) 2020 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include <qstringconverter.h>
#include <private/qstringconverter_p.h>
@@ -44,24 +8,47 @@
#include "private/qsimd_p.h"
#include "private/qstringiterator_p.h"
+#include "private/qtools_p.h"
#include "qbytearraymatcher.h"
+#include "qcontainertools_impl.h"
+#include <QtCore/qbytearraylist.h>
+
+#if QT_CONFIG(icu)
+#include <unicode/ucnv.h>
+#include <unicode/ucnv_cb.h>
+#include <unicode/ucnv_err.h>
+#include <unicode/ustring.h>
+#endif
#ifdef Q_OS_WIN
#include <qt_windows.h>
+#ifndef QT_BOOTSTRAPPED
+#include <QtCore/qvarlengtharray.h>
+#include <QtCore/q20iterator.h>
+#include <QtCore/private/qnumeric_p.h>
+#endif // !QT_BOOTSTRAPPED
#endif
+#include <array>
+
#if __has_include(<bit>) && __cplusplus > 201703L
#include <bit>
#endif
QT_BEGIN_NAMESPACE
+using namespace QtMiscUtils;
+
+static_assert(std::is_nothrow_move_constructible_v<QStringEncoder>);
+static_assert(std::is_nothrow_move_assignable_v<QStringEncoder>);
+static_assert(std::is_nothrow_move_constructible_v<QStringDecoder>);
+static_assert(std::is_nothrow_move_assignable_v<QStringDecoder>);
+
enum { Endian = 0, Data = 1 };
static const uchar utf8bom[] = { 0xef, 0xbb, 0xbf };
-#if (defined(__SSE2__) && defined(QT_COMPILER_SUPPORTS_SSE2)) \
- || defined(__ARM_NEON__)
+#if defined(__SSE2__) || defined(__ARM_NEON__)
static Q_ALWAYS_INLINE uint qBitScanReverse(unsigned v) noexcept
{
#if defined(__cpp_lib_int_pow2) && __cpp_lib_int_pow2 >= 202002L
@@ -77,7 +64,7 @@ static Q_ALWAYS_INLINE uint qBitScanReverse(unsigned v) noexcept
}
#endif
-#if defined(__SSE2__) && defined(QT_COMPILER_SUPPORTS_SSE2)
+#if defined(__SSE2__)
static inline bool simdEncodeAscii(uchar *&dst, const char16_t *&nextAscii, const char16_t *&src, const char16_t *end)
{
// do sixteen characters at a time
@@ -214,14 +201,14 @@ static inline const uchar *simdFindNonAscii(const uchar *src, const uchar *end,
#ifdef __AVX2__
// do 32 characters at a time
// (this is similar to simdTestMask in qstring.cpp)
- const __m256i mask = _mm256_set1_epi8(0x80);
+ const __m256i mask = _mm256_set1_epi8(char(0x80));
for ( ; end - src >= 32; src += 32) {
__m256i data = _mm256_loadu_si256(reinterpret_cast<const __m256i *>(src));
if (_mm256_testz_si256(mask, data))
continue;
uint n = _mm256_movemask_epi8(data);
- Q_ASSUME(n);
+ Q_ASSERT(n);
// find the next probable ASCII character
// we don't want to load 32 bytes again in this loop if we know there are non-ASCII
@@ -271,7 +258,7 @@ static inline const uchar *simdFindNonAscii(const uchar *src, const uchar *end,
// Compare only the US-ASCII beginning of [src8, end8) and [src16, end16)
// and advance src8 and src16 to the first character that could not be compared
-static void simdCompareAscii(const char8_t *&src8, const char8_t *end8, const char16_t *&src16, const char16_t *end16)
+static void simdCompareAscii(const qchar8_t *&src8, const qchar8_t *end8, const char16_t *&src16, const char16_t *end16)
{
int bitSpacing = 1;
qptrdiff len = qMin(end8 - src8, end16 - src16);
@@ -457,7 +444,7 @@ static inline const uchar *simdFindNonAscii(const uchar *src, const uchar *end,
return src;
}
-static void simdCompareAscii(const char8_t *&, const char8_t *, const char16_t *&, const char16_t *)
+static void simdCompareAscii(const qchar8_t *&, const qchar8_t *, const char16_t *&, const char16_t *)
{
}
#else
@@ -477,7 +464,7 @@ static inline const uchar *simdFindNonAscii(const uchar *src, const uchar *end,
return src;
}
-static void simdCompareAscii(const char8_t *&, const char8_t *, const char16_t *&, const char16_t *)
+static void simdCompareAscii(const qchar8_t *&, const qchar8_t *, const char16_t *&, const char16_t *)
{
}
#endif
@@ -524,8 +511,7 @@ QByteArray QUtf8::convertFromUnicode(QStringView in, QStringConverterBase::State
char *QUtf8::convertFromUnicode(char *out, QStringView in, QStringConverter::State *state)
{
Q_ASSERT(state);
- const QChar *uc = in.data();
- qsizetype len = in.length();
+ qsizetype len = in.size();
if (!len)
return out;
@@ -542,7 +528,7 @@ char *QUtf8::convertFromUnicode(char *out, QStringView in, QStringConverter::Sta
};
uchar *cursor = reinterpret_cast<uchar *>(out);
- const char16_t *src = reinterpret_cast<const char16_t *>(uc);
+ const char16_t *src = in.utf16();
const char16_t *const end = src + len;
if (!(state->flags & QStringDecoder::Flag::Stateless)) {
@@ -592,6 +578,21 @@ char *QUtf8::convertFromUnicode(char *out, QStringView in, QStringConverter::Sta
return reinterpret_cast<char *>(cursor);
}
+char *QUtf8::convertFromLatin1(char *out, QLatin1StringView in)
+{
+ // ### SIMD-optimize:
+ for (uchar ch : in) {
+ if (ch < 128) {
+ *out++ = ch;
+ } else {
+ // as per https://en.wikipedia.org/wiki/UTF-8#Encoding, 2nd row
+ *out++ = 0b110'0'0000u | (ch >> 6);
+ *out++ = 0b10'00'0000u | (ch & 0b0011'1111);
+ }
+ }
+ return out;
+}
+
QString QUtf8::convertToUnicode(QByteArrayView in)
{
// UTF-8 to UTF-16 always needs the exact same number of words or less:
@@ -613,14 +614,14 @@ QString QUtf8::convertToUnicode(QByteArrayView in)
return result;
}
-/*!
- \since 5.7
+/*! \internal
+ \since 6.6
\overload
Converts the UTF-8 sequence of bytes viewed by \a in to a sequence of
- QChar starting at \a buffer. The buffer is expected to be large enough
- to hold the result. An upper bound for the size of the buffer is
- \c in.size() QChars.
+ QChar starting at \a dst in the destination buffer. The buffer is expected
+ to be large enough to hold the result. An upper bound for the size of the
+ buffer is \c in.size() QChars.
If, during decoding, an error occurs, a QChar::ReplacementCharacter is
written.
@@ -628,11 +629,12 @@ QString QUtf8::convertToUnicode(QByteArrayView in)
Returns a pointer to one past the last QChar written.
This function never throws.
-*/
-QChar *QUtf8::convertToUnicode(QChar *buffer, QByteArrayView in) noexcept
+ For QChar buffers, instead of casting manually, you can use the static
+ QUtf8::convertToUnicode(QChar *, QByteArrayView) directly.
+*/
+char16_t *QUtf8::convertToUnicode(char16_t *dst, QByteArrayView in) noexcept
{
- char16_t *dst = reinterpret_cast<char16_t *>(buffer);
const uchar *const start = reinterpret_cast<const uchar *>(in.data());
const uchar *src = start;
const uchar *end = src + in.size();
@@ -655,7 +657,7 @@ QChar *QUtf8::convertToUnicode(QChar *buffer, QByteArrayView in) noexcept
do {
uchar b = *src++;
- int res = QUtf8Functions::fromUtf8<QUtf8BaseTraits>(b, dst, src, end);
+ const qsizetype res = QUtf8Functions::fromUtf8<QUtf8BaseTraits>(b, dst, src, end);
if (res < 0) {
// decoding error
*dst++ = QChar::ReplacementCharacter;
@@ -664,7 +666,7 @@ QChar *QUtf8::convertToUnicode(QChar *buffer, QByteArrayView in) noexcept
}
}
- return reinterpret_cast<QChar *>(dst);
+ return dst;
}
QString QUtf8::convertToUnicode(QByteArrayView in, QStringConverter::State *state)
@@ -685,23 +687,22 @@ QString QUtf8::convertToUnicode(QByteArrayView in, QStringConverter::State *stat
return result;
}
-QChar *QUtf8::convertToUnicode(QChar *out, QByteArrayView in, QStringConverter::State *state)
+char16_t *QUtf8::convertToUnicode(char16_t *dst, QByteArrayView in, QStringConverter::State *state)
{
qsizetype len = in.size();
Q_ASSERT(state);
if (!len)
- return out;
+ return dst;
char16_t replacement = QChar::ReplacementCharacter;
if (state->flags & QStringConverter::Flag::ConvertInvalidToNull)
replacement = QChar::Null;
- int res;
+ qsizetype res;
uchar ch = 0;
- char16_t *dst = reinterpret_cast<char16_t *>(out);
const uchar *src = reinterpret_cast<const uchar *>(in.data());
const uchar *end = src + len;
@@ -729,7 +730,7 @@ QChar *QUtf8::convertToUnicode(QChar *out, QByteArrayView in, QStringConverter::
// copy to our state and return
state->remainingChars = remainingCharsCount + newCharsToCopy;
memcpy(&state->state_data[0], remainingCharsData, state->remainingChars);
- return out;
+ return dst;
} else if (!headerdone) {
// eat the UTF-8 BOM
if (dst[-1] == 0xfeff)
@@ -785,7 +786,7 @@ QChar *QUtf8::convertToUnicode(QChar *out, QByteArrayView in, QStringConverter::
state->remainingChars = 0;
}
- return reinterpret_cast<QChar *>(dst);
+ return dst;
}
struct QUtf8NoOutputTraits : public QUtf8BaseTraitsNoAscii
@@ -815,7 +816,7 @@ QUtf8::ValidUtf8Result QUtf8::isValidUtf8(QByteArrayView in)
isValidAscii = false;
QUtf8NoOutputTraits::NoOutput output;
- int res = QUtf8Functions::fromUtf8<QUtf8NoOutputTraits>(b, output, src, end);
+ const qsizetype res = QUtf8Functions::fromUtf8<QUtf8NoOutputTraits>(b, output, src, end);
if (res < 0) {
// decoding error
return { false, false };
@@ -826,9 +827,9 @@ QUtf8::ValidUtf8Result QUtf8::isValidUtf8(QByteArrayView in)
return { true, isValidAscii };
}
-int QUtf8::compareUtf8(QByteArrayView utf8, QStringView utf16) noexcept
+int QUtf8::compareUtf8(QByteArrayView utf8, QStringView utf16, Qt::CaseSensitivity cs) noexcept
{
- auto src1 = reinterpret_cast<const char8_t *>(utf8.data());
+ auto src1 = reinterpret_cast<const qchar8_t *>(utf8.data());
auto end1 = src1 + utf8.size();
auto src2 = reinterpret_cast<const char16_t *>(utf16.data());
auto end2 = src2 + utf16.size();
@@ -842,7 +843,7 @@ int QUtf8::compareUtf8(QByteArrayView utf8, QStringView utf16) noexcept
if (uc1 >= 0x80) {
char32_t *output = &uc1;
- int res = QUtf8Functions::fromUtf8<QUtf8BaseTraitsNoAscii>(uc1, output, src1, end1);
+ qsizetype res = QUtf8Functions::fromUtf8<QUtf8BaseTraitsNoAscii>(uc1, output, src1, end1);
if (res < 0) {
// decoding error
uc1 = QChar::ReplacementCharacter;
@@ -853,7 +854,10 @@ int QUtf8::compareUtf8(QByteArrayView utf8, QStringView utf16) noexcept
if (QChar::isHighSurrogate(uc2) && src2 < end2 && QChar::isLowSurrogate(*src2))
uc2 = QChar::surrogateToUcs4(uc2, *src2++);
}
-
+ if (cs == Qt::CaseInsensitive) {
+ uc1 = QChar::toCaseFolded(uc1);
+ uc2 = QChar::toCaseFolded(uc2);
+ }
if (uc1 != uc2)
return int(uc1) - int(uc2);
}
@@ -863,7 +867,7 @@ int QUtf8::compareUtf8(QByteArrayView utf8, QStringView utf16) noexcept
return (end1 > src1) - int(end2 > src2);
}
-int QUtf8::compareUtf8(QByteArrayView utf8, QLatin1String s)
+int QUtf8::compareUtf8(QByteArrayView utf8, QLatin1StringView s, Qt::CaseSensitivity cs)
{
char32_t uc1 = QChar::Null;
auto src1 = reinterpret_cast<const uchar *>(utf8.data());
@@ -874,13 +878,17 @@ int QUtf8::compareUtf8(QByteArrayView utf8, QLatin1String s)
while (src1 < end1 && src2 < end2) {
uchar b = *src1++;
char32_t *output = &uc1;
- int res = QUtf8Functions::fromUtf8<QUtf8BaseTraits>(b, output, src1, end1);
+ const qsizetype res = QUtf8Functions::fromUtf8<QUtf8BaseTraits>(b, output, src1, end1);
if (res < 0) {
// decoding error
uc1 = QChar::ReplacementCharacter;
}
char32_t uc2 = *src2++;
+ if (cs == Qt::CaseInsensitive) {
+ uc1 = QChar::toCaseFolded(uc1);
+ uc2 = QChar::toCaseFolded(uc2);
+ }
if (uc1 != uc2)
return int(uc1) - int(uc2);
}
@@ -889,6 +897,52 @@ int QUtf8::compareUtf8(QByteArrayView utf8, QLatin1String s)
return (end1 > src1) - (end2 > src2);
}
+int QUtf8::compareUtf8(QByteArrayView lhs, QByteArrayView rhs, Qt::CaseSensitivity cs) noexcept
+{
+ if (lhs.isEmpty())
+ return qt_lencmp(0, rhs.size());
+
+ if (cs == Qt::CaseSensitive) {
+ const auto l = std::min(lhs.size(), rhs.size());
+ int r = memcmp(lhs.data(), rhs.data(), l);
+ return r ? r : qt_lencmp(lhs.size(), rhs.size());
+ }
+
+ char32_t uc1 = QChar::Null;
+ auto src1 = reinterpret_cast<const uchar *>(lhs.data());
+ auto end1 = src1 + lhs.size();
+ char32_t uc2 = QChar::Null;
+ auto src2 = reinterpret_cast<const uchar *>(rhs.data());
+ auto end2 = src2 + rhs.size();
+
+ while (src1 < end1 && src2 < end2) {
+ uchar b = *src1++;
+ char32_t *output = &uc1;
+ qsizetype res = QUtf8Functions::fromUtf8<QUtf8BaseTraits>(b, output, src1, end1);
+ if (res < 0) {
+ // decoding error
+ uc1 = QChar::ReplacementCharacter;
+ }
+
+ b = *src2++;
+ output = &uc2;
+ res = QUtf8Functions::fromUtf8<QUtf8BaseTraits>(b, output, src2, end2);
+ if (res < 0) {
+ // decoding error
+ uc2 = QChar::ReplacementCharacter;
+ }
+
+ uc1 = QChar::toCaseFolded(uc1);
+ uc2 = QChar::toCaseFolded(uc2);
+ if (uc1 != uc2)
+ return int(uc1) - int(uc2);
+ }
+
+ // the shorter string sorts first
+ return (end1 > src1) - (end2 > src2);
+}
+
+#ifndef QT_BOOTSTRAPPED
QByteArray QUtf16::convertFromUnicode(QStringView in, QStringConverter::State *state, DataEndianness endian)
{
bool writeBom = !(state->internalState & HeaderDone) && state->flags & QStringConverter::Flag::WriteBom;
@@ -898,7 +952,7 @@ QByteArray QUtf16::convertFromUnicode(QStringView in, QStringConverter::State *s
QByteArray d(length, Qt::Uninitialized);
char *end = convertFromUnicode(d.data(), in, state, endian);
- Q_ASSERT(end - d.constData() == d.length());
+ Q_ASSERT(end - d.constData() == d.size());
Q_UNUSED(end);
return d;
}
@@ -921,13 +975,13 @@ char *QUtf16::convertFromUnicode(char *out, QStringView in, QStringConverter::St
out += 2;
}
if (endian == BigEndianness)
- qToBigEndian<char16_t>(in.data(), in.length(), out);
+ qToBigEndian<char16_t>(in.data(), in.size(), out);
else
- qToLittleEndian<char16_t>(in.data(), in.length(), out);
+ qToLittleEndian<char16_t>(in.data(), in.size(), out);
state->remainingChars = 0;
state->internalState |= HeaderDone;
- return out + 2*in.length();
+ return out + 2*in.size();
}
QString QUtf16::convertToUnicode(QByteArrayView in, QStringConverter::State *state, DataEndianness endian)
@@ -996,7 +1050,7 @@ QChar *QUtf16::convertToUnicode(QChar *out, QByteArrayView in, QStringConverter:
endian = (QSysInfo::ByteOrder == QSysInfo::BigEndian) ? BigEndianness : LittleEndianness;
}
- int nPairs = (end - chars) >> 1;
+ qsizetype nPairs = (end - chars) >> 1;
if (endian == BigEndianness)
qFromBigEndian<char16_t>(chars, nPairs, out);
else
@@ -1022,7 +1076,7 @@ QChar *QUtf16::convertToUnicode(QChar *out, QByteArrayView in, QStringConverter:
QByteArray QUtf32::convertFromUnicode(QStringView in, QStringConverter::State *state, DataEndianness endian)
{
bool writeBom = !(state->internalState & HeaderDone) && state->flags & QStringConverter::Flag::WriteBom;
- int length = 4*in.size();
+ qsizetype length = 4*in.size();
if (writeBom)
length += 4;
QByteArray ba(length, Qt::Uninitialized);
@@ -1057,7 +1111,7 @@ char *QUtf32::convertFromUnicode(char *out, QStringView in, QStringConverter::St
}
const QChar *uc = in.data();
- const QChar *end = in.data() + in.length();
+ const QChar *end = in.data() + in.size();
QChar ch;
char32_t ucs4;
if (state->remainingChars == 1) {
@@ -1142,7 +1196,7 @@ QChar *QUtf32::convertToUnicode(QChar *out, QByteArrayView in, QStringConverter:
if (state->flags & QStringConverter::Flag::ConvertInitialBom)
headerdone = true;
- int num = state->remainingChars;
+ qsizetype num = state->remainingChars;
state->remainingChars = 0;
if (!headerdone || endian == DetectEndianness || num) {
@@ -1198,193 +1252,378 @@ QChar *QUtf32::convertToUnicode(QChar *out, QByteArrayView in, QStringConverter:
return out;
}
+#endif // !QT_BOOTSTRAPPED
#if defined(Q_OS_WIN) && !defined(QT_BOOTSTRAPPED)
-static QString convertToUnicodeCharByChar(QByteArrayView in, QStringConverter::State *state)
+int QLocal8Bit::checkUtf8()
{
- qsizetype length = in.size();
- const char *chars = in.data();
-
- Q_ASSERT(state);
- if (state->flags & QStringConverter::Flag::Stateless) // temporary
- state = nullptr;
-
- if (!chars || !length)
- return QString();
-
- int copyLocation = 0;
- int extra = 2;
- if (state && state->remainingChars) {
- copyLocation = state->remainingChars;
- extra += copyLocation;
- }
- qsizetype newLength = length + extra;
- char *mbcs = new char[newLength];
- //ensure that we have a NULL terminated string
- mbcs[newLength-1] = 0;
- mbcs[newLength-2] = 0;
- memcpy(&(mbcs[copyLocation]), chars, length);
- if (copyLocation) {
- //copy the last character from the state
- mbcs[0] = (char)state->state_data[0];
- state->remainingChars = 0;
- }
- const char *mb = mbcs;
- const char *next = 0;
- QString s;
- while ((next = CharNextExA(CP_ACP, mb, 0)) != mb) {
- wchar_t wc[2] ={0};
- int charlength = next - mb;
- int len = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED|MB_ERR_INVALID_CHARS, mb, charlength, wc, 2);
- if (len>0) {
- s.append(QChar(wc[0]));
- } else {
- int r = GetLastError();
- //check if the character being dropped is the last character
- if (r == ERROR_NO_UNICODE_TRANSLATION && mb == (mbcs+newLength -3) && state) {
- state->remainingChars = 1;
- state->state_data[0] = (char)*mb;
- }
- }
- mb = next;
- }
- delete [] mbcs;
- return s;
+ return GetACP() == CP_UTF8 ? 1 : -1;
}
-
-QString QLocal8Bit::convertToUnicode(QByteArrayView in, QStringConverter::State *state)
+QString QLocal8Bit::convertToUnicode_sys(QByteArrayView in, QStringConverter::State *state)
{
- qsizetype length = in.size();
+ return convertToUnicode_sys(in, CP_ACP, state);
+}
- Q_ASSERT(length < INT_MAX); // ### FIXME
+QString QLocal8Bit::convertToUnicode_sys(QByteArrayView in, quint32 codePage,
+ QStringConverter::State *state)
+{
const char *mb = in.data();
- int mblen = length;
+ qsizetype mblen = in.size();
+
+ Q_ASSERT(state);
+ qsizetype &invalidChars = state->invalidChars;
+ using Flag = QStringConverter::Flag;
+ const bool useNullForReplacement = !!(state->flags & Flag::ConvertInvalidToNull);
+ const char16_t replacementCharacter = useNullForReplacement ? QChar::Null
+ : QChar::ReplacementCharacter;
+ if (state->flags & Flag::Stateless) {
+ Q_ASSERT(state->remainingChars == 0);
+ state = nullptr;
+ }
if (!mb || !mblen)
return QString();
- QVarLengthArray<wchar_t, 4096> wc(4096);
- int len;
+ // Use a local stack-buffer at first to allow us a decently large container
+ // to avoid a lot of resizing, without also returning an overallocated
+ // QString to the user for small strings.
+ // Then we can be fast for small strings and take the hit of extra resizes
+ // and measuring how much storage is needed for large strings.
+ std::array<wchar_t, 4096> buf;
+ wchar_t *out = buf.data();
+ qsizetype outlen = buf.size();
+
QString sp;
- bool prepend = false;
- char state_data = 0;
- int remainingChars = 0;
-
- //save the current state information
- if (state) {
- state_data = (char)state->state_data[0];
- remainingChars = state->remainingChars;
- }
- //convert the pending character (if available)
- if (state && remainingChars) {
- char prev[3] = {0};
- prev[0] = state_data;
- prev[1] = mb[0];
- remainingChars = 0;
- len = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED,
- prev, 2, wc.data(), wc.length());
- if (len) {
- sp.append(QChar(wc[0]));
- if (mblen == 1) {
- state->remainingChars = 0;
- return sp;
- }
- prepend = true;
- mb++;
- mblen--;
- wc[0] = 0;
+ // Return a pointer to storage where we have enough space for `size`
+ const auto growOut = [&](qsizetype size) -> std::tuple<wchar_t *, qsizetype> {
+ if (outlen >= size)
+ return {out, outlen};
+ const bool wasStackBuffer = sp.isEmpty();
+ const auto begin = wasStackBuffer ? buf.data() : reinterpret_cast<wchar_t *>(sp.data());
+ const qsizetype offset = qsizetype(std::distance(begin, out));
+ qsizetype newSize = 0;
+ if (Q_UNLIKELY(qAddOverflow(offset, size, &newSize))) {
+ Q_CHECK_PTR(false);
+ return {nullptr, 0};
+ }
+ sp.resize(newSize);
+ auto it = reinterpret_cast<wchar_t *>(sp.data());
+ if (wasStackBuffer)
+ it = std::copy_n(buf.data(), offset, it);
+ else
+ it += offset;
+ return {it, size};
+ };
+
+ // Convert the pending characters (if available)
+ while (state && state->remainingChars && mblen) {
+ QStringConverter::State localState;
+ localState.flags = state->flags;
+ // Use at most 6 characters as a guess for the longest encoded character
+ // in any multibyte encoding.
+ // Even with a total of 2 bytes of overhead that would leave around
+ // 2^(4 * 8) possible characters
+ std::array<char, 6> prev = {0};
+ Q_ASSERT(state->remainingChars <= q20::ssize(state->state_data));
+ qsizetype index = 0;
+ for (; index < state->remainingChars; ++index)
+ prev[index] = state->state_data[index];
+ const qsizetype toCopy = std::min(q20::ssize(prev) - index, mblen);
+ for (qsizetype i = 0; i < toCopy; ++i, ++index)
+ prev[index] = mb[i];
+ mb += toCopy;
+ mblen -= toCopy;
+
+ // Recursing:
+ // Since we are using a clean local state it will try to decode what was
+ // stored in our state + some extra octets from input (`prev`). If some
+ // part fails we will have those characters stored in the local state's
+ // storage, and we can extract those. It may also output some
+ // replacement characters, which we'll count in the invalidChars.
+ // In the best case we only do this once, but we will loop until we have
+ // resolved all the remaining characters or we have run out of new input
+ // in which case we may still have remaining characters.
+ const QString tmp = convertToUnicode_sys(QByteArrayView(prev.data(), index), codePage,
+ &localState);
+ std::tie(out, outlen) = growOut(tmp.size());
+ if (!out)
+ return {};
+ out = std::copy_n(reinterpret_cast<const wchar_t *>(tmp.constData()), tmp.size(), out);
+ outlen -= tmp.size();
+ const qsizetype tail = toCopy - localState.remainingChars;
+ if (tail >= 0) {
+ // Everything left to process comes from `in`, so we can stop
+ // looping. Adjust the window for `in` and unset remainingChars to
+ // signal that we're done.
+ mb -= localState.remainingChars;
+ mblen += localState.remainingChars;
+ localState.remainingChars = 0;
}
+ state->remainingChars = localState.remainingChars;
+ state->invalidChars += localState.invalidChars;
+ std::copy_n(localState.state_data, state->remainingChars, state->state_data);
}
- while (!(len=MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED|MB_ERR_INVALID_CHARS,
- mb, mblen, wc.data(), wc.length()))) {
- int r = GetLastError();
- if (r == ERROR_INSUFFICIENT_BUFFER) {
- const int wclen = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED,
- mb, mblen, 0, 0);
- wc.resize(wclen);
- } else if (r == ERROR_NO_UNICODE_TRANSLATION) {
- //find the last non NULL character
- while (mblen > 1 && !(mb[mblen-1]))
- mblen--;
- //check whether, we hit an invalid character in the middle
- if ((mblen <= 1) || (remainingChars && state_data))
- return convertToUnicodeCharByChar(in, state);
- //Remove the last character and try again...
- state_data = mb[mblen-1];
- remainingChars = 1;
- mblen--;
+ Q_ASSERT(!state || state->remainingChars == 0 || mblen == 0);
+
+ // Need it in this scope, since we try to decrease our window size if we
+ // encounter an error
+ int nextIn = qt_saturate<int>(mblen);
+ while (mblen > 0) {
+ std::tie(out, outlen) = growOut(1); // Need space for at least one character
+ if (!out)
+ return {};
+ const int nextOut = qt_saturate<int>(outlen);
+ int len = MultiByteToWideChar(codePage, MB_ERR_INVALID_CHARS, mb, nextIn, out, nextOut);
+ if (len) {
+ mb += nextIn;
+ mblen -= nextIn;
+ out += len;
+ outlen -= len;
} else {
- // Fail.
- qWarning("MultiByteToWideChar: Cannot convert multibyte text");
- break;
+ int r = GetLastError();
+ if (r == ERROR_INSUFFICIENT_BUFFER) {
+ const int wclen = MultiByteToWideChar(codePage, 0, mb, nextIn, 0, 0);
+ std::tie(out, outlen) = growOut(wclen);
+ if (!out)
+ return {};
+ } else if (r == ERROR_NO_UNICODE_TRANSLATION) {
+ // Can't decode the current window, so either store the state,
+ // reduce window size or output a replacement character.
+
+ // Check if we can store all remaining characters in the state
+ // to be used next time we're called:
+ if (state && mblen <= q20::ssize(state->state_data)) {
+ state->remainingChars = mblen;
+ std::copy_n(mb, mblen, state->state_data);
+ mb += mblen;
+ mblen = 0;
+ break;
+ }
+
+ // .. if not, try to find the last valid character in the window
+ // and try again with a shrunken window:
+ if (nextIn > 1) {
+ // There may be some incomplete data at the end of our current
+ // window, so decrease the window size and try again.
+ // In the worst case scenario there is gigs of undecodable
+ // garbage, but what are we supposed to do about that?
+ const auto it = CharPrevExA(codePage, mb, mb + nextIn, 0);
+ if (it != mb)
+ nextIn = int(it - mb);
+ else
+ --nextIn;
+ continue;
+ }
+
+ // Finally, we are forced to output a replacement character for
+ // the first byte in the window:
+ std::tie(out, outlen) = growOut(1);
+ if (!out)
+ return {};
+ *out = replacementCharacter;
+ ++invalidChars;
+ ++out;
+ --outlen;
+ ++mb;
+ --mblen;
+ } else {
+ // Fail.
+ qWarning("MultiByteToWideChar: Cannot convert multibyte text");
+ break;
+ }
}
+ nextIn = qt_saturate<int>(mblen);
}
- if (len <= 0)
- return QString();
+ if (sp.isEmpty()) {
+ // We must have only used the stack buffer
+ if (out != buf.data()) // else: we return null-string
+ sp = QStringView(buf.data(), out).toString();
+ } else{
+ const auto begin = reinterpret_cast<wchar_t *>(sp.data());
+ sp.truncate(std::distance(begin, out));
+ }
- if (wc[len-1] == 0) // len - 1: we don't want terminator
- --len;
+ if (sp.size() && sp.back().isNull())
+ sp.chop(1);
- //save the new state information
- if (state) {
- state->state_data[0] = (char)state_data;
- state->remainingChars = remainingChars;
- }
- QString s((QChar*)wc.data(), len);
- if (prepend) {
- return sp+s;
+ if (!state && mblen > 0) {
+ // We have trailing character(s) that could not be converted, and
+ // nowhere to cache them
+ sp.resize(sp.size() + mblen, replacementCharacter);
+ invalidChars += mblen;
}
- return s;
+ return sp;
}
-QByteArray QLocal8Bit::convertFromUnicode(QStringView in, QStringConverter::State *state)
+QByteArray QLocal8Bit::convertFromUnicode_sys(QStringView in, QStringConverter::State *state)
{
- const QChar *ch = in.data();
+ return convertFromUnicode_sys(in, CP_ACP, state);
+}
+
+QByteArray QLocal8Bit::convertFromUnicode_sys(QStringView in, quint32 codePage,
+ QStringConverter::State *state)
+{
+ const wchar_t *ch = reinterpret_cast<const wchar_t *>(in.data());
qsizetype uclen = in.size();
- Q_ASSERT(uclen < INT_MAX); // ### FIXME
Q_ASSERT(state);
- Q_UNUSED(state); // ### Fixme
- if (state->flags & QStringConverter::Flag::Stateless) // temporary
+ // The Windows API has a *boolean* out-parameter that says if a replacement
+ // character was used, but it gives us no way to know _how many_ were used.
+ // Since we cannot simply scan the string for replacement characters
+ // (which is potentially a question mark, and thus a valid character),
+ // we simply do not track the number of invalid characters here.
+ // auto &invalidChars = state->invalidChars;
+
+ using Flag = QStringConverter::Flag;
+ if (state->flags & Flag::Stateless) { // temporary
+ Q_ASSERT(state->remainingChars == 0);
state = nullptr;
+ }
if (!ch)
return QByteArray();
if (uclen == 0)
return QByteArray("");
- BOOL used_def;
- QByteArray mb(4096, 0);
- int len;
- while (!(len=WideCharToMultiByte(CP_ACP, 0, (const wchar_t*)ch, uclen,
- mb.data(), mb.size()-1, 0, &used_def)))
- {
- int r = GetLastError();
- if (r == ERROR_INSUFFICIENT_BUFFER) {
- mb.resize(1+WideCharToMultiByte(CP_ACP, 0,
- (const wchar_t*)ch, uclen,
- 0, 0, 0, &used_def));
- // and try again...
+
+ // Use a local stack-buffer at first to allow us a decently large container
+ // to avoid a lot of resizing, without also returning an overallocated
+ // QByteArray to the user for small strings.
+ // Then we can be fast for small strings and take the hit of extra resizes
+ // and measuring how much storage is needed for large strings.
+ std::array<char, 4096> buf;
+ char *out = buf.data();
+ qsizetype outlen = buf.size();
+ QByteArray mb;
+
+ if (state && state->remainingChars > 0) {
+ Q_ASSERT(state->remainingChars == 1);
+ // Let's try to decode the pending character
+ wchar_t wc[2] = { wchar_t(state->state_data[0]), ch[0] };
+ // Check if the second character is a valid low surrogate,
+ // otherwise we'll just decode the first character, for which windows
+ // will output a replacement character.
+ const bool validCodePoint = QChar::isLowSurrogate(wc[1]);
+ int len = WideCharToMultiByte(codePage, 0, wc, validCodePoint ? 2 : 1, out, outlen, nullptr,
+ nullptr);
+ if (!len)
+ return {}; // Cannot recover, and I refuse to believe it was a size limitation
+ out += len;
+ outlen -= len;
+ if (validCodePoint) {
+ ++ch;
+ --uclen;
+ }
+ state->remainingChars = 0;
+ state->state_data[0] = 0;
+ if (uclen == 0)
+ return QByteArrayView(buf.data(), len).toByteArray();
+ }
+
+ if (state && QChar::isHighSurrogate(ch[uclen - 1])) {
+ // We can handle a missing low surrogate at the end of the string,
+ // so if there is one, exclude it now and store it in the state.
+ state->remainingChars = 1;
+ state->state_data[0] = ch[uclen - 1];
+ --uclen;
+ if (uclen == 0)
+ return QByteArray();
+ }
+
+ Q_ASSERT(uclen > 0);
+
+ // Return a pointer to storage where we have enough space for `size`
+ const auto growOut = [&](qsizetype size) -> std::tuple<char *, qsizetype> {
+ if (outlen >= size)
+ return {out, outlen};
+ const bool wasStackBuffer = mb.isEmpty();
+ const auto begin = wasStackBuffer ? buf.data() : mb.data();
+ const qsizetype offset = qsizetype(std::distance(begin, out));
+ qsizetype newSize = 0;
+ if (Q_UNLIKELY(qAddOverflow(offset, size, &newSize))) {
+ Q_CHECK_PTR(false);
+ return {nullptr, 0};
+ }
+ mb.resize(newSize);
+ auto it = mb.data();
+ if (wasStackBuffer)
+ it = std::copy_n(buf.data(), offset, it);
+ else
+ it += offset;
+ return {it, size};
+ };
+
+ const auto getNextWindowSize = [&]() {
+ int nextIn = qt_saturate<int>(uclen);
+ // The Windows API has some issues if the current window ends in the
+ // middle of a surrogate pair, so we avoid that:
+ if (nextIn > 1 && QChar::isHighSurrogate(ch[nextIn - 1]))
+ --nextIn;
+ return nextIn;
+ };
+
+ int len = 0;
+ while (uclen > 0) {
+ const int nextIn = getNextWindowSize();
+ std::tie(out, outlen) = growOut(1); // We need at least one byte
+ if (!out)
+ return {};
+ const int nextOut = qt_saturate<int>(outlen);
+ len = WideCharToMultiByte(codePage, 0, ch, nextIn, out, nextOut, nullptr, nullptr);
+ if (len > 0) {
+ ch += nextIn;
+ uclen -= nextIn;
+ out += len;
+ outlen -= len;
} else {
- // Fail. Probably can't happen in fact (dwFlags is 0).
+ int r = GetLastError();
+ if (r == ERROR_INSUFFICIENT_BUFFER) {
+ int neededLength = WideCharToMultiByte(codePage, 0, ch, nextIn, nullptr, 0,
+ nullptr, nullptr);
+ if (neededLength <= 0) {
+ // Fail. Observed with UTF8 where the input window was max int and ended in an
+ // incomplete sequence, probably a Windows bug. We try to avoid that from
+ // happening by reducing the window size in that case. But let's keep this
+ // branch just in case of other bugs.
#ifndef QT_NO_DEBUG
- // Can't use qWarning(), as it'll recurse to handle %ls
- fprintf(stderr,
- "WideCharToMultiByte: Cannot convert multibyte text (error %d): %ls\n",
- r, reinterpret_cast<const wchar_t*>(QString(ch, uclen).utf16()));
+ r = GetLastError();
+ fprintf(stderr,
+ "WideCharToMultiByte: Cannot convert multibyte text (error %d)\n", r);
+#endif // !QT_NO_DEBUG
+ break;
+ }
+ std::tie(out, outlen) = growOut(neededLength);
+ if (!out)
+ return {};
+ // and try again...
+ } else {
+ // Fail. Probably can't happen in fact (dwFlags is 0).
+#ifndef QT_NO_DEBUG
+ // Can't use qWarning(), as it'll recurse to handle %ls
+ fprintf(stderr,
+ "WideCharToMultiByte: Cannot convert multibyte text (error %d): %ls\n", r,
+ reinterpret_cast<const wchar_t *>(
+ QStringView(ch, uclen).left(100).toString().utf16()));
#endif
- break;
+ break;
+ }
}
}
- mb.resize(len);
+ if (mb.isEmpty()) {
+ // We must have only used the stack buffer
+ if (out != buf.data()) // else: we return null-array
+ mb = QByteArrayView(buf.data(), out).toByteArray();
+ } else {
+ mb.truncate(std::distance(mb.data(), out));
+ }
return mb;
}
#endif
-void QStringConverter::State::clear()
+void QStringConverter::State::clear() noexcept
{
if (clearFn)
clearFn(this);
@@ -1395,6 +1634,22 @@ void QStringConverter::State::clear()
internalState = 0;
}
+void QStringConverter::State::reset() noexcept
+{
+ if (flags & Flag::UsesIcu) {
+#if QT_CONFIG(icu)
+ UConverter *converter = static_cast<UConverter *>(d[0]);
+ if (converter)
+ ucnv_reset(converter);
+#else
+ Q_UNREACHABLE();
+#endif
+ } else {
+ clear();
+ }
+}
+
+#ifndef QT_BOOTSTRAPPED
static QChar *fromUtf16(QChar *out, QByteArrayView in, QStringConverter::State *state)
{
return QUtf16::convertToUnicode(out, in, state, DetectEndianness);
@@ -1454,28 +1709,17 @@ static char *toUtf32LE(char *out, QStringView in, QStringConverter::State *state
{
return QUtf32::convertFromUnicode(out, in, state, LittleEndianness);
}
+#endif // !QT_BOOTSTRAPPED
-void qt_from_latin1(char16_t *dst, const char *str, size_t size) noexcept;
-
-static QChar *fromLatin1(QChar *out, QByteArrayView in, QStringConverter::State *state)
-{
- Q_ASSERT(state);
- Q_UNUSED(state);
-
- qt_from_latin1(reinterpret_cast<char16_t *>(out), in.data(), size_t(in.size()));
- return out + in.size();
-}
-
-
-static char *toLatin1(char *out, QStringView in, QStringConverter::State *state)
+char *QLatin1::convertFromUnicode(char *out, QStringView in, QStringConverter::State *state) noexcept
{
Q_ASSERT(state);
if (state->flags & QStringConverter::Flag::Stateless) // temporary
state = nullptr;
const char replacement = (state && state->flags & QStringConverter::Flag::ConvertInvalidToNull) ? 0 : '?';
- int invalid = 0;
- for (qsizetype i = 0; i < in.length(); ++i) {
+ qsizetype invalid = 0;
+ for (qsizetype i = 0; i < in.size(); ++i) {
if (in[i] > QChar(0xff)) {
*out = replacement;
++invalid;
@@ -1492,26 +1736,28 @@ static char *toLatin1(char *out, QStringView in, QStringConverter::State *state)
static QChar *fromLocal8Bit(QChar *out, QByteArrayView in, QStringConverter::State *state)
{
QString s = QLocal8Bit::convertToUnicode(in, state);
- memcpy(out, s.constData(), s.length()*sizeof(QChar));
- return out + s.length();
+ memcpy(out, s.constData(), s.size()*sizeof(QChar));
+ return out + s.size();
}
static char *toLocal8Bit(char *out, QStringView in, QStringConverter::State *state)
{
QByteArray s = QLocal8Bit::convertFromUnicode(in, state);
- memcpy(out, s.constData(), s.length());
- return out + s.length();
+ memcpy(out, s.constData(), s.size());
+ return out + s.size();
}
static qsizetype fromUtf8Len(qsizetype l) { return l + 1; }
static qsizetype toUtf8Len(qsizetype l) { return 3*(l + 1); }
+#ifndef QT_BOOTSTRAPPED
static qsizetype fromUtf16Len(qsizetype l) { return l/2 + 2; }
static qsizetype toUtf16Len(qsizetype l) { return 2*(l + 1); }
static qsizetype fromUtf32Len(qsizetype l) { return l/2 + 2; }
static qsizetype toUtf32Len(qsizetype l) { return 4*(l + 1); }
+#endif
static qsizetype fromLatin1Len(qsizetype l) { return l + 1; }
static qsizetype toLatin1Len(qsizetype l) { return l + 1; }
@@ -1544,7 +1790,7 @@ static qsizetype toLatin1Len(qsizetype l) { return l + 1; }
operation, encoding UTF-16 encoded data (usually in the form of a QString) to
the requested encoding.
- The supported encodings are:
+ The following encodings are always supported:
\list
\li UTF-8
@@ -1558,6 +1804,10 @@ static qsizetype toLatin1Len(qsizetype l) { return l + 1; }
\li The system encoding
\endlist
+ QStringConverter may support more encodings depending on how Qt was
+ compiled. If more codecs are supported, they can be listed using
+ availableCodecs().
+
\l {QStringConverter}s can be used as follows to convert some encoded
string to and from UTF-16.
@@ -1616,6 +1866,7 @@ static qsizetype toLatin1Len(qsizetype l) { return l + 1; }
\value Stateless Ignore possible converter states between different function calls
to encode or decode strings. This will also cause the QStringConverter to raise an error if an incomplete
sequence of data is encountered.
+ \omitvalue UsesIcu
*/
/*!
@@ -1646,34 +1897,31 @@ static qsizetype toLatin1Len(qsizetype l) { return l + 1; }
const QStringConverter::Interface QStringConverter::encodingInterfaces[QStringConverter::LastEncoding + 1] =
{
{ "UTF-8", QUtf8::convertToUnicode, fromUtf8Len, QUtf8::convertFromUnicode, toUtf8Len },
+#ifndef QT_BOOTSTRAPPED
{ "UTF-16", fromUtf16, fromUtf16Len, toUtf16, toUtf16Len },
{ "UTF-16LE", fromUtf16LE, fromUtf16Len, toUtf16LE, toUtf16Len },
{ "UTF-16BE", fromUtf16BE, fromUtf16Len, toUtf16BE, toUtf16Len },
{ "UTF-32", fromUtf32, fromUtf32Len, toUtf32, toUtf32Len },
{ "UTF-32LE", fromUtf32LE, fromUtf32Len, toUtf32LE, toUtf32Len },
{ "UTF-32BE", fromUtf32BE, fromUtf32Len, toUtf32BE, toUtf32Len },
- { "ISO-8859-1", fromLatin1, fromLatin1Len, toLatin1, toLatin1Len },
+#endif
+ { "ISO-8859-1", QLatin1::convertToUnicode, fromLatin1Len, QLatin1::convertFromUnicode, toLatin1Len },
{ "Locale", fromLocal8Bit, fromUtf8Len, toLocal8Bit, toUtf8Len }
};
// match names case insensitive and skipping '-' and '_'
static bool nameMatch(const char *a, const char *b)
{
- while (*a && *b) {
- if (*a == '-' || *a == '_') {
+ do {
+ while (*a == '-' || *a == '_')
++a;
- continue;
- }
- if (*b == '-' || *b == '_') {
+ while (*b == '-' || *b == '_')
++b;
- continue;
- }
- if (toupper(*a) != toupper(*b))
- return false;
- ++a;
- ++b;
- }
- return !*a && !*b;
+ if (!*a && !*b) // end of both strings
+ return true;
+ } while (QtMiscUtils::toAsciiLower(*a++) == QtMiscUtils::toAsciiLower(*b++));
+
+ return false;
}
@@ -1687,6 +1935,234 @@ static bool nameMatch(const char *a, const char *b)
\internal
*/
+
+#if QT_CONFIG(icu)
+// only derives from QStringConverter to get access to protected types
+struct QStringConverterICU : QStringConverter
+{
+ static void clear_function(QStringConverterBase::State *state) noexcept
+ {
+ ucnv_close(static_cast<UConverter *>(state->d[0]));
+ state->d[0] = nullptr;
+ }
+
+ static void ensureConverter(QStringConverter::State *state)
+ {
+ // old code might reset the state via clear instead of reset
+ // in that case, the converter has been closed, and we have to reopen it
+ if (state->d[0] == nullptr)
+ state->d[0] = createConverterForName(static_cast<const char *>(state->d[1]), state);
+ }
+
+ static QChar *toUtf16(QChar *out, QByteArrayView in, QStringConverter::State *state)
+ {
+ ensureConverter(state);
+
+ auto icu_conv = static_cast<UConverter *>(state->d[0]);
+ UErrorCode err = U_ZERO_ERROR;
+ auto source = in.data();
+ auto sourceLimit = in.data() + in.size();
+
+ qsizetype length = toLen(in.size());
+
+ UChar *target = reinterpret_cast<UChar *>(out);
+ auto targetLimit = target + length;
+ // We explicitly clean up anyway, so no need to set flush to true,
+ // which would just reset the converter.
+ UBool flush = false;
+
+ // If the QStringConverter was moved, the state that we used as a context is stale now.
+ UConverterToUCallback action;
+ const void *context;
+ ucnv_getToUCallBack(icu_conv, &action, &context);
+ if (context != state)
+ ucnv_setToUCallBack(icu_conv, action, state, nullptr, nullptr, &err);
+
+ ucnv_toUnicode(icu_conv, &target, targetLimit, &source, sourceLimit, nullptr, flush, &err);
+ // We did reserve enough space:
+ Q_ASSERT(err != U_BUFFER_OVERFLOW_ERROR);
+ if (state->flags.testFlag(QStringConverter::Flag::Stateless)) {
+ if (auto leftOver = ucnv_toUCountPending(icu_conv, &err)) {
+ ucnv_reset(icu_conv);
+ state->invalidChars += leftOver;
+ }
+ }
+ return reinterpret_cast<QChar *>(target);
+ }
+
+ static char *fromUtf16(char *out, QStringView in, QStringConverter::State *state)
+ {
+ ensureConverter(state);
+ auto icu_conv = static_cast<UConverter *>(state->d[0]);
+ UErrorCode err = U_ZERO_ERROR;
+ auto source = reinterpret_cast<const UChar *>(in.data());
+ auto sourceLimit = reinterpret_cast<const UChar *>(in.data() + in.size());
+
+ qsizetype length = UCNV_GET_MAX_BYTES_FOR_STRING(in.size(), ucnv_getMaxCharSize(icu_conv));
+
+ char *target = out;
+ char *targetLimit = out + length;
+ UBool flush = false;
+
+ // If the QStringConverter was moved, the state that we used as a context is stale now.
+ UConverterFromUCallback action;
+ const void *context;
+ ucnv_getFromUCallBack(icu_conv, &action, &context);
+ if (context != state)
+ ucnv_setFromUCallBack(icu_conv, action, state, nullptr, nullptr, &err);
+
+ ucnv_fromUnicode(icu_conv, &target, targetLimit, &source, sourceLimit, nullptr, flush, &err);
+ // We did reserve enough space:
+ Q_ASSERT(err != U_BUFFER_OVERFLOW_ERROR);
+ if (state->flags.testFlag(QStringConverter::Flag::Stateless)) {
+ if (auto leftOver = ucnv_fromUCountPending(icu_conv, &err)) {
+ ucnv_reset(icu_conv);
+ state->invalidChars += leftOver;
+ }
+ }
+ return target;
+ }
+
+ Q_DISABLE_COPY_MOVE(QStringConverterICU)
+
+ template<qsizetype X>
+ static qsizetype fromLen(qsizetype inLength)
+ {
+ return X * inLength * sizeof(UChar);
+ }
+
+ static qsizetype toLen(qsizetype inLength)
+ {
+
+ /* Assumption: each input char might map to a different codepoint
+ Each codepoint can take up to 4 bytes == 2 QChar
+ We can ignore reserving space for a BOM, as only UTF encodings use one
+ and those are not handled by the ICU converter.
+ */
+ return 2 * inLength;
+ }
+
+ static constexpr QStringConverter::Interface forLength[] = {
+ {"icu, recompile if you see this", QStringConverterICU::toUtf16, QStringConverterICU::toLen, QStringConverterICU::fromUtf16, QStringConverterICU::fromLen<1>},
+ {"icu, recompile if you see this", QStringConverterICU::toUtf16, QStringConverterICU::toLen, QStringConverterICU::fromUtf16, QStringConverterICU::fromLen<2>},
+ {"icu, recompile if you see this", QStringConverterICU::toUtf16, QStringConverterICU::toLen, QStringConverterICU::fromUtf16, QStringConverterICU::fromLen<3>},
+ {"icu, recompile if you see this", QStringConverterICU::toUtf16, QStringConverterICU::toLen, QStringConverterICU::fromUtf16, QStringConverterICU::fromLen<4>},
+ {"icu, recompile if you see this", QStringConverterICU::toUtf16, QStringConverterICU::toLen, QStringConverterICU::fromUtf16, QStringConverterICU::fromLen<5>},
+ {"icu, recompile if you see this", QStringConverterICU::toUtf16, QStringConverterICU::toLen, QStringConverterICU::fromUtf16, QStringConverterICU::fromLen<6>},
+ {"icu, recompile if you see this", QStringConverterICU::toUtf16, QStringConverterICU::toLen, QStringConverterICU::fromUtf16, QStringConverterICU::fromLen<7>},
+ {"icu, recompile if you see this", QStringConverterICU::toUtf16, QStringConverterICU::toLen, QStringConverterICU::fromUtf16, QStringConverterICU::fromLen<8>}
+ };
+
+ static UConverter *createConverterForName(const char *name, const State *state)
+ {
+ Q_ASSERT(name);
+ Q_ASSERT(state);
+ UErrorCode status = U_ZERO_ERROR;
+ UConverter *conv = ucnv_open(name, &status);
+ if (status != U_ZERO_ERROR && status != U_AMBIGUOUS_ALIAS_WARNING) {
+ ucnv_close(conv);
+ return nullptr;
+ }
+
+ if (state->flags.testFlag(Flag::ConvertInvalidToNull)) {
+ UErrorCode error = U_ZERO_ERROR;
+
+ auto nullToSubstituter = [](const void *context, UConverterToUnicodeArgs *toUArgs,
+ const char *, int32_t length,
+ UConverterCallbackReason reason, UErrorCode *err) {
+ if (reason <= UCNV_IRREGULAR) {
+ *err = U_ZERO_ERROR;
+ UChar c = '\0';
+ ucnv_cbToUWriteUChars(toUArgs, &c, 1, 0, err);
+ // Recover outer scope's state (which isn't const) from context:
+ auto state = const_cast<State *>(static_cast<const State *>(context));
+ state->invalidChars += length;
+ }
+ };
+ ucnv_setToUCallBack(conv, nullToSubstituter, state, nullptr, nullptr, &error);
+
+ auto nullFromSubstituter = [](const void *context, UConverterFromUnicodeArgs *fromUArgs,
+ const UChar *, int32_t length,
+ UChar32, UConverterCallbackReason reason, UErrorCode *err) {
+ if (reason <= UCNV_IRREGULAR) {
+ *err = U_ZERO_ERROR;
+ const UChar replacement[] = { 0 };
+ const UChar *stringBegin = std::begin(replacement);
+ ucnv_cbFromUWriteUChars(fromUArgs, &stringBegin, std::end(replacement), 0, err);
+ // Recover outer scope's state (which isn't const) from context:
+ auto state = const_cast<State *>(static_cast<const State *>(context));
+ state->invalidChars += length;
+ }
+ };
+ ucnv_setFromUCallBack(conv, nullFromSubstituter, state, nullptr, nullptr, &error);
+ } else {
+ UErrorCode error = U_ZERO_ERROR;
+
+ auto qmarkToSubstituter = [](const void *context, UConverterToUnicodeArgs *toUArgs,
+ const char *codeUnits,int32_t length,
+ UConverterCallbackReason reason, UErrorCode *err) {
+ if (reason <= UCNV_IRREGULAR) {
+ // Recover outer scope's state (which isn't const) from context:
+ auto state = const_cast<State *>(static_cast<const State *>(context));
+ state->invalidChars += length;
+ }
+ // use existing ICU callback for logic
+ UCNV_TO_U_CALLBACK_SUBSTITUTE(nullptr, toUArgs, codeUnits, length, reason, err);
+
+ };
+ ucnv_setToUCallBack(conv, qmarkToSubstituter, state, nullptr, nullptr, &error);
+
+ auto qmarkFromSubstituter = [](const void *context, UConverterFromUnicodeArgs *fromUArgs,
+ const UChar *codeUnits, int32_t length,
+ UChar32 codePoint, UConverterCallbackReason reason, UErrorCode *err) {
+ if (reason <= UCNV_IRREGULAR) {
+ // Recover outer scope's state (which isn't const) from context:
+ auto state = const_cast<State *>(static_cast<const State *>(context));
+ state->invalidChars += length;
+ }
+ // use existing ICU callback for logic
+ UCNV_FROM_U_CALLBACK_SUBSTITUTE(nullptr, fromUArgs, codeUnits, length,
+ codePoint, reason, err);
+ };
+ ucnv_setFromUCallBack(conv, qmarkFromSubstituter, state, nullptr, nullptr, &error);
+ }
+ return conv;
+ }
+
+ static const QStringConverter::Interface *make_icu_converter(
+ QStringConverterBase::State *state,
+ const char *name)
+ {
+ UErrorCode status = U_ZERO_ERROR;
+ UConverter *conv = createConverterForName(name, state);
+ if (!conv)
+ return nullptr;
+
+ const char *icuName = ucnv_getName(conv, &status);
+ // ucnv_getStandardName returns a name which is owned by the library
+ // we can thus store it in the state without worrying aobut its lifetime
+ const char *persistentName = ucnv_getStandardName(icuName, "MIME", &status);
+ if (U_FAILURE(status) || !persistentName) {
+ status = U_ZERO_ERROR;
+ persistentName = ucnv_getStandardName(icuName, "IANA", &status);
+ }
+ state->d[1] = const_cast<char *>(persistentName);
+ state->d[0] = conv;
+ state->flags |= QStringConverterBase::Flag::UsesIcu;
+ qsizetype maxCharSize = ucnv_getMaxCharSize(conv);
+ state->clearFn = QStringConverterICU::clear_function;
+ if (maxCharSize > 8 || maxCharSize < 1) {
+ qWarning("Encountered unexpected codec \"%s\" which requires >8x space", name);
+ return nullptr;
+ } else {
+ return &forLength[maxCharSize - 1];
+ }
+
+ }
+
+};
+#endif
+
/*!
\internal
*/
@@ -1695,7 +2171,27 @@ QStringConverter::QStringConverter(const char *name, Flags f)
{
auto e = encodingForName(name);
if (e)
- iface = encodingInterfaces + int(e.value());
+ iface = encodingInterfaces + int(*e);
+#if QT_CONFIG(icu)
+ else
+ iface = QStringConverterICU::make_icu_converter(&state, name);
+#endif
+}
+
+
+const char *QStringConverter::name() const noexcept
+{
+ if (!iface)
+ return nullptr;
+ if (state.flags & QStringConverter::Flag::UsesIcu) {
+#if QT_CONFIG(icu)
+ return static_cast<const char*>(state.d[1]);
+#else
+ return nullptr;
+#endif
+ } else {
+ return iface->name;
+ }
}
/*!
@@ -1728,17 +2224,26 @@ QStringConverter::QStringConverter(const char *name, Flags f)
Returns the canonical name of the encoding this QStringConverter can encode or decode.
Returns a nullptr if the converter is not valid.
+ The returned name is UTF-8 encoded.
\sa isValid()
*/
/*!
- Returns an optional encoding for \a name. The optional is empty if the name could
- not get converted to a valid encoding.
+ Convert \a name to the corresponding \l Encoding member, if there is one.
+
+ If the \a name is not the name of a codec listed in the Encoding enumeration,
+ \c{std::nullopt} is returned. Such a name may, none the less, be accepted by
+ the QStringConverter constructor when Qt is built with ICU, if ICU provides a
+ converter with the given name.
+
+ \a name is expected to be UTF-8 encoded.
*/
-std::optional<QStringConverter::Encoding> QStringConverter::encodingForName(const char *name)
+std::optional<QStringConverter::Encoding> QStringConverter::encodingForName(const char *name) noexcept
{
- for (int i = 0; i < LastEncoding + 1; ++i) {
+ if (!name)
+ return std::nullopt;
+ for (qsizetype i = 0; i < LastEncoding + 1; ++i) {
if (nameMatch(encodingInterfaces[i].name, name))
return QStringConverter::Encoding(i);
}
@@ -1747,6 +2252,7 @@ std::optional<QStringConverter::Encoding> QStringConverter::encodingForName(cons
return std::nullopt;
}
+#ifndef QT_BOOTSTRAPPED
/*!
Returns the encoding for the content of \a data if it can be determined.
\a expectedFirstCharacter can be passed as an additional hint to help determine
@@ -1754,7 +2260,8 @@ std::optional<QStringConverter::Encoding> QStringConverter::encodingForName(cons
The returned optional is empty, if the encoding is unclear.
*/
-std::optional<QStringConverter::Encoding> QStringConverter::encodingForData(QByteArrayView data, char16_t expectedFirstCharacter)
+std::optional<QStringConverter::Encoding>
+QStringConverter::encodingForData(QByteArrayView data, char16_t expectedFirstCharacter) noexcept
{
// someone set us up the BOM?
qsizetype arraySize = data.size();
@@ -1795,51 +2302,147 @@ std::optional<QStringConverter::Encoding> QStringConverter::encodingForData(QByt
return std::nullopt;
}
-/*!
- Tries to determine the encoding of the HTML in \a data by looking at leading byte
- order marks or a charset specifier in the HTML meta tag. If the optional is empty,
- the encoding specified is not supported by QStringConverter. If no encoding is
- detected, the method returns Utf8.
-*/
-std::optional<QStringConverter::Encoding> QStringConverter::encodingForHtml(QByteArrayView data)
+static QByteArray parseHtmlMetaForEncoding(QByteArrayView data)
{
- // determine charset
- auto encoding = encodingForData(data);
- if (encoding)
- // trust the initial BOM
- return encoding;
+ static constexpr auto metaSearcher = qMakeStaticByteArrayMatcher("meta ");
+ static constexpr auto charsetSearcher = qMakeStaticByteArrayMatcher("charset=");
QByteArray header = data.first(qMin(data.size(), qsizetype(1024))).toByteArray().toLower();
- int pos = header.indexOf("meta ");
+ qsizetype pos = metaSearcher.indexIn(header);
if (pos != -1) {
- pos = header.indexOf("charset=", pos);
+ pos = charsetSearcher.indexIn(header, pos);
if (pos != -1) {
- pos += int(qstrlen("charset="));
+ pos += qstrlen("charset=");
if (pos < header.size() && (header.at(pos) == '\"' || header.at(pos) == '\''))
++pos;
- int pos2 = pos;
+ qsizetype pos2 = pos;
// The attribute can be closed with either """, "'", ">" or "/",
// none of which are valid charset characters.
while (++pos2 < header.size()) {
char ch = header.at(pos2);
if (ch == '\"' || ch == '\'' || ch == '>' || ch == '/') {
QByteArray name = header.mid(pos, pos2 - pos);
- int colon = name.indexOf(':');
+ qsizetype colon = name.indexOf(':');
if (colon > 0)
name = name.left(colon);
name = name.simplified();
if (name == "unicode") // QTBUG-41998, ICU will return UTF-16.
name = QByteArrayLiteral("UTF-8");
if (!name.isEmpty())
- return encodingForName(name);
+ return name;
}
}
}
}
+ return QByteArray();
+}
+
+/*!
+ Tries to determine the encoding of the HTML in \a data by looking at leading byte
+ order marks or a charset specifier in the HTML meta tag. If the optional is empty,
+ the encoding specified is not supported by QStringConverter. If no encoding is
+ detected, the method returns Utf8.
+
+ \sa QStringDecoder::decoderForHtml()
+*/
+std::optional<QStringConverter::Encoding> QStringConverter::encodingForHtml(QByteArrayView data)
+{
+ // determine charset
+ std::optional<QStringConverter::Encoding> encoding = encodingForData(data);
+ if (encoding)
+ // trust the initial BOM
+ return encoding;
+
+ QByteArray encodingTag = parseHtmlMetaForEncoding(data);
+ if (!encodingTag.isEmpty())
+ return encodingForName(encodingTag);
+
return Utf8;
}
+static qsizetype availableCodecCount()
+{
+#if !QT_CONFIG(icu)
+ return QStringConverter::Encoding::LastEncoding;
+#else
+ /* icu contains also the names of what Qt provides
+ except for the special Locale one (so add one for it)
+ */
+ return 1 + ucnv_countAvailable();
+#endif
+}
+
+/*!
+ Returns a list of names of supported codecs. The names returned
+ by this function can be passed to QStringEncoder's and
+ QStringDecoder's constructor to create a en- or decoder for
+ the given codec.
+
+ This function may be used to obtain a listing of additional codecs beyond
+ the standard ones. Support for additional codecs requires Qt be compiled
+ with support for the ICU library.
+
+ \note The order of codecs is an internal implementation detail
+ and not guaranteed to be stable.
+ */
+QStringList QStringConverter::availableCodecs()
+{
+ auto availableCodec = [](qsizetype index) -> QString
+ {
+ #if !QT_CONFIG(icu)
+ return QString::fromLatin1(encodingInterfaces[index].name);
+ #else
+ if (index == 0) // "Locale", not provided by icu
+ return QString::fromLatin1(
+ encodingInterfaces[QStringConverter::Encoding::System].name);
+ // this mirrors the setup we do to set a converters name
+ UErrorCode status = U_ZERO_ERROR;
+ auto icuName = ucnv_getAvailableName(int32_t(index - 1));
+ const char *standardName = ucnv_getStandardName(icuName, "MIME", &status);
+ if (U_FAILURE(status) || !standardName) {
+ status = U_ZERO_ERROR;
+ standardName = ucnv_getStandardName(icuName, "IANA", &status);
+ }
+ if (!standardName)
+ standardName = icuName;
+ return QString::fromLatin1(standardName);
+ #endif
+ };
+
+ qsizetype codecCount = availableCodecCount();
+ QStringList result;
+ result.reserve(codecCount);
+ for (qsizetype i = 0; i < codecCount; ++i)
+ result.push_back(availableCodec(i));
+ return result;
+}
+
+/*!
+ Tries to determine the encoding of the HTML in \a data by looking at leading byte
+ order marks or a charset specifier in the HTML meta tag and returns a QStringDecoder
+ matching the encoding. If the returned decoder is not valid,
+ the encoding specified is not supported by QStringConverter. If no encoding is
+ detected, the method returns a decoder for Utf8.
+
+ \sa isValid()
+*/
+QStringDecoder QStringDecoder::decoderForHtml(QByteArrayView data)
+{
+ // determine charset
+ std::optional<QStringConverter::Encoding> encoding = encodingForData(data);
+ if (encoding)
+ // trust the initial BOM
+ return QStringDecoder(encoding.value());
+
+ QByteArray encodingTag = parseHtmlMetaForEncoding(data);
+ if (!encodingTag.isEmpty())
+ return QStringDecoder(encodingTag);
+
+ return QStringDecoder(Utf8);
+}
+#endif // !QT_BOOTSTRAPPED
+
/*!
Returns the canonical name for encoding \a e.
*/
@@ -1907,12 +2510,24 @@ const char *QStringConverter::nameForEncoding(QStringConverter::Encoding e)
*/
/*!
- \fn QByteArray QStringEncoder::encode(const QString &in)
- \fn QByteArray QStringEncoder::encode(QStringView in)
- \fn QByteArray QStringEncoder::operator()(const QString &in)
- \fn QByteArray QStringEncoder::operator()(QStringView in)
+ \fn constexpr QStringEncoder::QStringEncoder(const QString &name, Flags flags = Flag::Default)
+ \since 6.8
+
+ Creates an encoder object using \a name and \a flags.
+ If \a name is not the name of a known encoding an invalid converter will get created.
+
+ \sa isValid()
+*/
+
+/*!
+ \fn QStringEncoder::DecodedData<const QString &> QStringEncoder::encode(const QString &in)
+ \fn QStringEncoder::DecodedData<QStringView> QStringEncoder::encode(QStringView in)
+ \fn QStringEncoder::DecodedData<const QString &> QStringEncoder::operator()(const QString &in)
+ \fn QStringEncoder::DecodedData<QStringView> QStringEncoder::operator()(QStringView in)
- Converts \a in and returns the data as a byte array.
+ Converts \a in and returns a struct that is implicitly convertible to QByteArray.
+
+ \snippet code/src_corelib_text_qstringconverter.cpp 5
*/
/*!
@@ -1996,12 +2611,25 @@ const char *QStringConverter::nameForEncoding(QStringConverter::Encoding e)
*/
/*!
- \fn QString QStringDecoder::operator()(const QByteArray &ba)
- \fn QString QStringDecoder::decode(const QByteArray &ba)
- \fn QString QStringDecoder::operator()(QByteArrayView ba)
- \fn QString QStringDecoder::decode(QByteArrayView ba)
+ \fn constexpr QStringDecoder::QStringDecoder(const QString &name, Flags flags = Flag::Default)
+ \since 6.8
+
+ Creates an decoder object using \a name and \a flags.
+ If \a name is not the name of a known encoding an invalid converter will get created.
+
+ \sa isValid()
+*/
+
+/*!
+ \fn QStringDecoder::EncodedData<const QByteArray &> QStringDecoder::operator()(const QByteArray &ba)
+ \fn QStringDecoder::EncodedData<const QByteArray &> QStringDecoder::decode(const QByteArray &ba)
+ \fn QStringDecoder::EncodedData<QByteArrayView> QStringDecoder::operator()(QByteArrayView ba)
+ \fn QStringDecoder::EncodedData<QByteArrayView> QStringDecoder::decode(QByteArrayView ba)
+
+ Converts \a ba and returns a struct that is implicitly convertible to QString.
+
- Converts \a ba and returns the data as a QString.
+ \snippet code/src_corelib_text_qstringconverter.cpp 4
*/
/*!
@@ -2026,4 +2654,10 @@ const char *QStringConverter::nameForEncoding(QStringConverter::Encoding e)
\sa requiredSpace
*/
+/*!
+ \fn char16_t *QStringDecoder::appendToBuffer(char16_t *out, QByteArrayView in)
+ \since 6.6
+ \overload
+*/
+
QT_END_NAMESPACE
diff --git a/src/corelib/text/qstringconverter.h b/src/corelib/text/qstringconverter.h
index 829b19d568..40791f8e26 100644
--- a/src/corelib/text/qstringconverter.h
+++ b/src/corelib/text/qstringconverter.h
@@ -1,216 +1,42 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#if 0
+// keep existing syncqt header working after the move of the class
+// into qstringconverter_base
+#pragma qt_class(QStringConverter)
+#pragma qt_class(QStringConverterBase)
+#endif
#ifndef QSTRINGCONVERTER_H
#define QSTRINGCONVERTER_H
+#include <QtCore/qstringconverter_base.h>
#include <QtCore/qstring.h>
-#if defined(QT_USE_FAST_OPERATOR_PLUS) || defined(QT_USE_QSTRINGBUILDER)
#include <QtCore/qstringbuilder.h>
-#endif
-
-#include <optional>
QT_BEGIN_NAMESPACE
-// work around a compiler bug in GCC 7
-#if (defined(Q_CC_GNU) && __GNUC__ == 7) || defined(Q_QDOC)
-#define QSTRINGCONVERTER_CONSTEXPR
-#else
-#define QSTRINGCONVERTER_CONSTEXPR constexpr
-#endif
-
-class QStringConverterBase
-{
-public:
- enum class Flag {
- Default = 0,
- Stateless = 0x1,
- ConvertInvalidToNull = 0x2,
- WriteBom = 0x4,
- ConvertInitialBom = 0x8
- };
- Q_DECLARE_FLAGS(Flags, Flag)
-
- struct State {
- constexpr State(Flags f = Flag::Default)
- : flags(f), state_data{0, 0, 0, 0} {}
- ~State() { clear(); }
- State(State &&other)
- : flags(other.flags),
- remainingChars(other.remainingChars),
- invalidChars(other.invalidChars),
- d{other.d[0], other.d[1]},
- clearFn(other.clearFn)
- { other.clearFn = nullptr; }
- State &operator=(State &&other)
- {
- clear();
- flags = other.flags;
- remainingChars = other.remainingChars;
- invalidChars = other.invalidChars;
- d[0] = other.d[0];
- d[1] = other.d[1];
- clearFn = other.clearFn;
- other.clearFn = nullptr;
- return *this;
- }
- Q_CORE_EXPORT void clear();
-
- Flags flags;
- int internalState = 0;
- qsizetype remainingChars = 0;
- qsizetype invalidChars = 0;
-
- union {
- uint state_data[4];
- void *d[2];
- };
- using ClearDataFn = void (*)(State *);
- ClearDataFn clearFn = nullptr;
- private:
- Q_DISABLE_COPY(State)
- };
-};
-Q_DECLARE_OPERATORS_FOR_FLAGS(QStringConverterBase::Flags)
-
-class QStringConverter : public QStringConverterBase
-{
-public:
-
- enum Encoding {
- Utf8,
- Utf16,
- Utf16LE,
- Utf16BE,
- Utf32,
- Utf32LE,
- Utf32BE,
- Latin1,
- System,
- LastEncoding = System
- };
-#ifdef Q_QDOC
- // document the flags here
- enum class Flag {
- Default = 0,
- Stateless = 0x1,
- ConvertInvalidToNull = 0x2,
- WriteBom = 0x4,
- ConvertInitialBom = 0x8
- };
- Q_DECLARE_FLAGS(Flags, Flag)
-#endif
-
-protected:
-
- struct Interface
- {
- using DecoderFn = QChar * (*)(QChar *out, QByteArrayView in, State *state);
- using LengthFn = qsizetype (*)(qsizetype inLength);
- using EncoderFn = char * (*)(char *out, QStringView in, State *state);
- const char *name = nullptr;
- DecoderFn toUtf16 = nullptr;
- LengthFn toUtf16Len = nullptr;
- EncoderFn fromUtf16 = nullptr;
- LengthFn fromUtf16Len = nullptr;
- };
-
- QSTRINGCONVERTER_CONSTEXPR QStringConverter()
- : iface(nullptr)
- {}
- QSTRINGCONVERTER_CONSTEXPR QStringConverter(Encoding encoding, Flags f)
- : iface(&encodingInterfaces[int(encoding)]), state(f)
- {}
- QSTRINGCONVERTER_CONSTEXPR QStringConverter(const Interface *i)
- : iface(i)
- {}
- Q_CORE_EXPORT QStringConverter(const char *name, Flags f);
-
-
-public:
- bool isValid() const { return iface != nullptr; }
-
- void resetState()
- {
- state.clear();
- }
- bool hasError() const { return state.invalidChars != 0; }
-
- const char *name() const
- { return isValid() ? iface->name : nullptr; }
-
- Q_CORE_EXPORT static std::optional<Encoding> encodingForName(const char *name);
- Q_CORE_EXPORT static const char *nameForEncoding(Encoding e);
- Q_CORE_EXPORT static std::optional<Encoding> encodingForData(QByteArrayView data, char16_t expectedFirstCharacter = 0);
- Q_CORE_EXPORT static std::optional<Encoding> encodingForHtml(QByteArrayView data);
-
-protected:
- const Interface *iface;
- State state;
-private:
- Q_CORE_EXPORT static const Interface encodingInterfaces[Encoding::LastEncoding + 1];
-};
-
class QStringEncoder : public QStringConverter
{
protected:
- QSTRINGCONVERTER_CONSTEXPR QStringEncoder(const Interface *i)
+ constexpr explicit QStringEncoder(const Interface *i) noexcept
: QStringConverter(i)
{}
public:
- QSTRINGCONVERTER_CONSTEXPR QStringEncoder()
+ constexpr QStringEncoder() noexcept
: QStringConverter()
{}
- QSTRINGCONVERTER_CONSTEXPR QStringEncoder(Encoding encoding, Flags flags = Flag::Default)
+ constexpr explicit QStringEncoder(Encoding encoding, Flags flags = Flag::Default)
: QStringConverter(encoding, flags)
{}
- QStringEncoder(const char *name, Flags flags = Flag::Default)
+ explicit QStringEncoder(const char *name, Flags flags = Flag::Default)
: QStringConverter(name, flags)
{}
+ Q_WEAK_OVERLOAD explicit QStringEncoder(const QString &name, Flags flags = Flag::Default)
+ : QStringEncoder(name.toLatin1().constData(), flags)
+ {}
-#if defined(Q_QDOC)
- QByteArray operator()(const QString &in);
- QByteArray operator()(QStringView in);
- QByteArray encode(const QString &in);
- QByteArray encode(QStringView in);
-#else
template<typename T>
struct DecodedData
{
@@ -228,15 +54,25 @@ public:
{ return DecodedData<const QString &>{this, str}; }
DecodedData<QStringView> encode(QStringView in)
{ return DecodedData<QStringView>{this, in}; }
-#endif
qsizetype requiredSpace(qsizetype inputLength) const
- { return iface->fromUtf16Len(inputLength); }
+ { return iface ? iface->fromUtf16Len(inputLength) : 0; }
char *appendToBuffer(char *out, QStringView in)
- { return iface->fromUtf16(out, in, &state); }
+ {
+ if (!iface) {
+ state.invalidChars = 1;
+ return out;
+ }
+ return iface->fromUtf16(out, in, &state);
+ }
private:
QByteArray encodeAsByteArray(QStringView in)
{
+ if (!iface) {
+ // ensure that hasError returns true
+ state.invalidChars = 1;
+ return {};
+ }
QByteArray result(iface->fromUtf16Len(in.size()), Qt::Uninitialized);
char *out = result.data();
out = iface->fromUtf16(out, in, &state);
@@ -249,26 +85,23 @@ private:
class QStringDecoder : public QStringConverter
{
protected:
- QSTRINGCONVERTER_CONSTEXPR QStringDecoder(const Interface *i)
+ constexpr explicit QStringDecoder(const Interface *i) noexcept
: QStringConverter(i)
{}
public:
- QSTRINGCONVERTER_CONSTEXPR QStringDecoder(Encoding encoding, Flags flags = Flag::Default)
+ constexpr explicit QStringDecoder(Encoding encoding, Flags flags = Flag::Default)
: QStringConverter(encoding, flags)
{}
- QSTRINGCONVERTER_CONSTEXPR QStringDecoder()
+ constexpr QStringDecoder() noexcept
: QStringConverter()
{}
- QStringDecoder(const char *name, Flags f = Flag::Default)
+ explicit QStringDecoder(const char *name, Flags f = Flag::Default)
: QStringConverter(name, f)
{}
+ Q_WEAK_OVERLOAD explicit QStringDecoder(const QString &name, Flags f = Flag::Default)
+ : QStringDecoder(name.toLatin1().constData(), f)
+ {}
-#if defined(Q_QDOC)
- QString operator()(const QByteArray &ba);
- QString operator()(QByteArrayView ba);
- QString decode(const QByteArray &ba);
- QString decode(QByteArrayView ba);
-#else
template<typename T>
struct EncodedData
{
@@ -286,15 +119,30 @@ public:
{ return EncodedData<const QByteArray &>{this, ba}; }
EncodedData<QByteArrayView> decode(QByteArrayView ba)
{ return EncodedData<QByteArrayView>{this, ba}; }
-#endif
qsizetype requiredSpace(qsizetype inputLength) const
- { return iface->toUtf16Len(inputLength); }
+ { return iface ? iface->toUtf16Len(inputLength) : 0; }
QChar *appendToBuffer(QChar *out, QByteArrayView ba)
- { return iface->toUtf16(out, ba, &state); }
+ {
+ if (!iface) {
+ state.invalidChars = 1;
+ return out;
+ }
+ return iface->toUtf16(out, ba, &state);
+ }
+ char16_t *appendToBuffer(char16_t *out, QByteArrayView ba)
+ { return reinterpret_cast<char16_t *>(appendToBuffer(reinterpret_cast<QChar *>(out), ba)); }
+
+ Q_CORE_EXPORT static QStringDecoder decoderForHtml(QByteArrayView data);
+
private:
QString decodeAsString(QByteArrayView in)
{
+ if (!iface) {
+ // ensure that hasError returns true
+ state.invalidChars = 1;
+ return {};
+ }
QString result(iface->toUtf16Len(in.size()), Qt::Uninitialized);
const QChar *out = iface->toUtf16(result.data(), in, &state);
result.truncate(out - result.constData());
@@ -355,8 +203,66 @@ QByteArray &operator+=(QByteArray &a, const QStringEncoder::DecodedData<T> &b)
}
#endif
-QT_END_NAMESPACE
+template <typename InputIterator>
+void QString::assign_helper_char8(InputIterator first, InputIterator last)
+{
+ static_assert(!QString::is_contiguous_iterator_v<InputIterator>,
+ "Internal error: Should have been handed over to the QAnyStringView overload."
+ );
+
+ using ValueType = typename std::iterator_traits<InputIterator>::value_type;
+ constexpr bool IsFwdIt = std::is_convertible_v<
+ typename std::iterator_traits<InputIterator>::iterator_category,
+ std::forward_iterator_tag
+ >;
+
+ resize(0);
+ // In case of not being shared, there is the possibility of having free space at begin
+ // even after the resize to zero.
+ if (const auto offset = d.freeSpaceAtBegin())
+ d.setBegin(d.begin() - offset);
+
+ if constexpr (IsFwdIt)
+ reserve(static_cast<qsizetype>(std::distance(first, last)));
+
+ auto toUtf16 = QStringDecoder(QStringDecoder::Utf8);
+ auto availableCapacity = d.constAllocatedCapacity();
+ auto *dst = d.data();
+ auto *dend = d.data() + availableCapacity;
+
+ while (true) {
+ if (first == last) { // ran out of input elements
+ Q_ASSERT(!std::less<>{}(dend, dst));
+ d.size = dst - d.begin();
+ return;
+ }
+ const ValueType next = *first; // decays proxies, if any
+ const auto chunk = QUtf8StringView(&next, 1);
+ // UTF-8 characters can have a maximum size of 4 bytes and may result in a surrogate
+ // pair of UTF-16 code units. In the input-iterator case, we don't know the size
+ // and would need to always reserve space for 2 code units. To keep our promise
+ // of 'not allocating if it fits', we have to pre-check this condition.
+ // We know that it fits in the forward-iterator case.
+ if constexpr (!IsFwdIt) {
+ constexpr qsizetype Pair = 2;
+ char16_t buf[Pair];
+ const qptrdiff n = toUtf16.appendToBuffer(buf, chunk) - buf;
+ if (dend - dst < n) { // ran out of allocated memory
+ const auto offset = dst - d.begin();
+ reallocData(d.constAllocatedCapacity() + Pair, QArrayData::Grow);
+ // update the pointers since we've re-allocated
+ availableCapacity = d.constAllocatedCapacity();
+ dst = d.data() + offset;
+ dend = d.data() + availableCapacity;
+ }
+ dst = std::copy_n(buf, n, dst);
+ } else { // take the fast path
+ dst = toUtf16.appendToBuffer(dst, chunk);
+ }
+ ++first;
+ }
+}
-#undef QSTRINGCONVERTER_CONSTEXPR
+QT_END_NAMESPACE
#endif
diff --git a/src/corelib/text/qstringconverter_base.h b/src/corelib/text/qstringconverter_base.h
new file mode 100644
index 0000000000..d6b6fcb484
--- /dev/null
+++ b/src/corelib/text/qstringconverter_base.h
@@ -0,0 +1,176 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QSTRINGCONVERTER_BASE_H
+#define QSTRINGCONVERTER_BASE_H
+
+#if 0
+// QStringConverter(Base) class are handled in qstringconverter
+#pragma qt_sync_stop_processing
+#endif
+
+#include <optional>
+
+#include <QtCore/qglobal.h> // QT_{BEGIN,END}_NAMESPACE
+#include <QtCore/qflags.h> // Q_DECLARE_FLAGS
+#include <QtCore/qcontainerfwd.h>
+
+#include <cstring>
+
+QT_BEGIN_NAMESPACE
+
+class QByteArrayView;
+class QChar;
+class QByteArrayView;
+class QStringView;
+
+class QStringConverterBase
+{
+public:
+ enum class Flag {
+ Default = 0,
+ Stateless = 0x1,
+ ConvertInvalidToNull = 0x2,
+ WriteBom = 0x4,
+ ConvertInitialBom = 0x8,
+ UsesIcu = 0x10,
+ };
+ Q_DECLARE_FLAGS(Flags, Flag)
+
+ struct State {
+ constexpr State(Flags f = Flag::Default) noexcept
+ : flags(f), state_data{0, 0, 0, 0} {}
+ ~State() { clear(); }
+
+ State(State &&other) noexcept
+ : flags(other.flags),
+ remainingChars(other.remainingChars),
+ invalidChars(other.invalidChars),
+ state_data{other.state_data[0], other.state_data[1],
+ other.state_data[2], other.state_data[3]},
+ clearFn(other.clearFn)
+ { other.clearFn = nullptr; }
+ State &operator=(State &&other) noexcept
+ {
+ clear();
+ flags = other.flags;
+ remainingChars = other.remainingChars;
+ invalidChars = other.invalidChars;
+ std::memmove(state_data, other.state_data, sizeof state_data); // self-assignment-safe
+ clearFn = other.clearFn;
+ other.clearFn = nullptr;
+ return *this;
+ }
+ Q_CORE_EXPORT void clear() noexcept;
+ Q_CORE_EXPORT void reset() noexcept;
+
+ Flags flags;
+ int internalState = 0;
+ qsizetype remainingChars = 0;
+ qsizetype invalidChars = 0;
+
+ union {
+ uint state_data[4];
+ void *d[2];
+ };
+ using ClearDataFn = void (*)(State *) noexcept;
+ ClearDataFn clearFn = nullptr;
+ private:
+ Q_DISABLE_COPY(State)
+ };
+protected:
+ ~QStringConverterBase() = default;
+};
+Q_DECLARE_OPERATORS_FOR_FLAGS(QStringConverterBase::Flags)
+
+class QStringConverter : public QStringConverterBase
+{
+public:
+
+ enum Encoding {
+ Utf8,
+#ifndef QT_BOOTSTRAPPED
+ Utf16,
+ Utf16LE,
+ Utf16BE,
+ Utf32,
+ Utf32LE,
+ Utf32BE,
+#endif
+ Latin1,
+ System,
+ LastEncoding = System
+ };
+#ifdef Q_QDOC
+ // document the flags here
+ enum class Flag {
+ Default = 0,
+ Stateless = 0x1,
+ ConvertInvalidToNull = 0x2,
+ WriteBom = 0x4,
+ ConvertInitialBom = 0x8,
+ UsesIcu = 0x10,
+ };
+ Q_DECLARE_FLAGS(Flags, Flag)
+#endif
+
+protected:
+
+ struct Interface
+ {
+ using DecoderFn = QChar * (*)(QChar *out, QByteArrayView in, State *state);
+ using LengthFn = qsizetype (*)(qsizetype inLength);
+ using EncoderFn = char * (*)(char *out, QStringView in, State *state);
+ const char *name = nullptr;
+ DecoderFn toUtf16 = nullptr;
+ LengthFn toUtf16Len = nullptr;
+ EncoderFn fromUtf16 = nullptr;
+ LengthFn fromUtf16Len = nullptr;
+ };
+
+ constexpr QStringConverter() noexcept
+ : iface(nullptr)
+ {}
+ constexpr explicit QStringConverter(Encoding encoding, Flags f)
+ : iface(&encodingInterfaces[qsizetype(encoding)]), state(f)
+ {}
+ constexpr explicit QStringConverter(const Interface *i) noexcept
+ : iface(i)
+ {}
+ Q_CORE_EXPORT explicit QStringConverter(const char *name, Flags f);
+
+
+ ~QStringConverter() = default;
+
+public:
+ QStringConverter(QStringConverter &&) = default;
+ QStringConverter &operator=(QStringConverter &&) = default;
+
+ bool isValid() const noexcept { return iface != nullptr; }
+
+ void resetState() noexcept
+ {
+ state.reset();
+ }
+ bool hasError() const noexcept { return state.invalidChars != 0; }
+
+ Q_CORE_EXPORT const char *name() const noexcept;
+
+ Q_CORE_EXPORT static std::optional<Encoding> encodingForName(const char *name) noexcept;
+ Q_CORE_EXPORT static const char *nameForEncoding(Encoding e);
+ Q_CORE_EXPORT static std::optional<Encoding>
+ encodingForData(QByteArrayView data, char16_t expectedFirstCharacter = 0) noexcept;
+ Q_CORE_EXPORT static std::optional<Encoding> encodingForHtml(QByteArrayView data);
+
+ Q_CORE_EXPORT static QStringList availableCodecs();
+
+protected:
+ const Interface *iface;
+ State state;
+private:
+ Q_CORE_EXPORT static const Interface encodingInterfaces[Encoding::LastEncoding + 1];
+};
+
+QT_END_NAMESPACE
+
+#endif
diff --git a/src/corelib/text/qstringconverter_p.h b/src/corelib/text/qstringconverter_p.h
index 2ad59af23c..e68ffb2bb0 100644
--- a/src/corelib/text/qstringconverter_p.h
+++ b/src/corelib/text/qstringconverter_p.h
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Copyright (C) 2020 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// Copyright (C) 2020 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QSTRINGCONVERTER_P_H
#define QSTRINGCONVERTER_P_H
@@ -55,13 +19,42 @@
#include <QtCore/qstring.h>
#include <QtCore/qendian.h>
#include <QtCore/qstringconverter.h>
+#include <QtCore/private/qglobal_p.h>
QT_BEGIN_NAMESPACE
#ifndef __cpp_char8_t
-enum char8_t : uchar {};
+enum qchar8_t : uchar {};
+#else
+using qchar8_t = char8_t;
#endif
+struct QLatin1
+{
+ // Defined in qstring.cpp
+ static char16_t *convertToUnicode(char16_t *dst, QLatin1StringView in) noexcept;
+
+ static QChar *convertToUnicode(QChar *buffer, QLatin1StringView in) noexcept
+ {
+ char16_t *dst = reinterpret_cast<char16_t *>(buffer);
+ dst = convertToUnicode(dst, in);
+ return reinterpret_cast<QChar *>(dst);
+ }
+
+ static QChar *convertToUnicode(QChar *dst, QByteArrayView in,
+ [[maybe_unused]] QStringConverterBase::State *state) noexcept
+ {
+ Q_ASSERT(state);
+
+ return convertToUnicode(dst, QLatin1StringView(in.data(), in.size()));
+ }
+
+ static char *convertFromUnicode(char *out, QStringView in, QStringConverter::State *state) noexcept;
+
+ // Defined in qstring.cpp
+ static char *convertFromUnicode(char *out, QStringView in) noexcept;
+};
+
struct QUtf8BaseTraits
{
static const bool isTrusted = false;
@@ -73,25 +66,34 @@ struct QUtf8BaseTraits
static void appendByte(uchar *&ptr, uchar b)
{ *ptr++ = b; }
- static void appendByte(char8_t *&ptr, char8_t b)
+ static void appendByte(qchar8_t *&ptr, qchar8_t b)
{ *ptr++ = b; }
+ static uchar peekByte(const char *ptr, qsizetype n = 0)
+ { return ptr[n]; }
+
static uchar peekByte(const uchar *ptr, qsizetype n = 0)
{ return ptr[n]; }
- static uchar peekByte(const char8_t *ptr, int n = 0)
+ static uchar peekByte(const qchar8_t *ptr, qsizetype n = 0)
{ return ptr[n]; }
+ static qptrdiff availableBytes(const char *ptr, const char *end)
+ { return end - ptr; }
+
static qptrdiff availableBytes(const uchar *ptr, const uchar *end)
{ return end - ptr; }
- static qptrdiff availableBytes(const char8_t *ptr, const char8_t *end)
+ static qptrdiff availableBytes(const qchar8_t *ptr, const qchar8_t *end)
{ return end - ptr; }
+ static void advanceByte(const char *&ptr, qsizetype n = 1)
+ { ptr += n; }
+
static void advanceByte(const uchar *&ptr, qsizetype n = 1)
{ ptr += n; }
- static void advanceByte(const char8_t *&ptr, int n = 1)
+ static void advanceByte(const qchar8_t *&ptr, qsizetype n = 1)
{ ptr += n; }
static void appendUtf16(char16_t *&ptr, char16_t uc)
@@ -296,20 +298,41 @@ enum DataEndianness
struct QUtf8
{
- Q_CORE_EXPORT static QChar *convertToUnicode(QChar *buffer, QByteArrayView in) noexcept;
+ static QChar *convertToUnicode(QChar *buffer, QByteArrayView in) noexcept
+ {
+ char16_t *dst = reinterpret_cast<char16_t *>(buffer);
+ dst = QUtf8::convertToUnicode(dst, in);
+ return reinterpret_cast<QChar *>(dst);
+ }
+
+ Q_CORE_EXPORT static char16_t* convertToUnicode(char16_t *dst, QByteArrayView in) noexcept;
static QString convertToUnicode(QByteArrayView in);
Q_CORE_EXPORT static QString convertToUnicode(QByteArrayView in, QStringConverter::State *state);
- static QChar *convertToUnicode(QChar *out, QByteArrayView in, QStringConverter::State *state);
+
+ static QChar *convertToUnicode(QChar *out, QByteArrayView in, QStringConverter::State *state)
+ {
+ char16_t *buffer = reinterpret_cast<char16_t *>(out);
+ buffer = convertToUnicode(buffer, in, state);
+ return reinterpret_cast<QChar *>(buffer);
+ }
+
+ static char16_t *convertToUnicode(char16_t *dst, QByteArrayView in, QStringConverter::State *state);
+
Q_CORE_EXPORT static QByteArray convertFromUnicode(QStringView in);
Q_CORE_EXPORT static QByteArray convertFromUnicode(QStringView in, QStringConverterBase::State *state);
static char *convertFromUnicode(char *out, QStringView in, QStringConverter::State *state);
+ Q_CORE_EXPORT static char *convertFromLatin1(char *out, QLatin1StringView in);
struct ValidUtf8Result {
bool isValidUtf8;
bool isValidAscii;
};
static ValidUtf8Result isValidUtf8(QByteArrayView in);
- static int compareUtf8(QByteArrayView utf8, QStringView utf16) noexcept;
- static int compareUtf8(QByteArrayView utf8, QLatin1String s);
+ static int compareUtf8(QByteArrayView utf8, QStringView utf16,
+ Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
+ static int compareUtf8(QByteArrayView utf8, QLatin1StringView s,
+ Qt::CaseSensitivity cs = Qt::CaseSensitive);
+ static int compareUtf8(QByteArrayView lhs, QByteArrayView rhs,
+ Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
};
struct QUtf16
@@ -336,8 +359,34 @@ struct Q_CORE_EXPORT QLocal8Bit
static QByteArray convertFromUnicode(QStringView in, QStringConverter::State *state)
{ return QUtf8::convertFromUnicode(in, state); }
#else
- static QString convertToUnicode(QByteArrayView, QStringConverter::State *);
- static QByteArray convertFromUnicode(QStringView, QStringConverter::State *);
+ static int checkUtf8();
+ static bool isUtf8()
+ {
+ Q_CONSTINIT
+ static QBasicAtomicInteger<qint8> result = { 0 };
+ int r = result.loadRelaxed();
+ if (r == 0) {
+ r = checkUtf8();
+ result.storeRelaxed(r);
+ }
+ return r > 0;
+ }
+ static QString convertToUnicode_sys(QByteArrayView, quint32, QStringConverter::State *);
+ static QString convertToUnicode_sys(QByteArrayView, QStringConverter::State *);
+ static QString convertToUnicode(QByteArrayView in, QStringConverter::State *state)
+ {
+ if (isUtf8())
+ return QUtf8::convertToUnicode(in, state);
+ return convertToUnicode_sys(in, state);
+ }
+ static QByteArray convertFromUnicode_sys(QStringView, quint32, QStringConverter::State *);
+ static QByteArray convertFromUnicode_sys(QStringView, QStringConverter::State *);
+ static QByteArray convertFromUnicode(QStringView in, QStringConverter::State *state)
+ {
+ if (isUtf8())
+ return QUtf8::convertFromUnicode(in, state);
+ return convertFromUnicode_sys(in, state);
+ }
#endif
};
diff --git a/src/corelib/text/qstringfwd.h b/src/corelib/text/qstringfwd.h
new file mode 100644
index 0000000000..2e3c9e8248
--- /dev/null
+++ b/src/corelib/text/qstringfwd.h
@@ -0,0 +1,56 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#include <QtCore/qglobal.h>
+
+#ifndef QSTRINGFWD_H
+#define QSTRINGFWD_H
+
+QT_BEGIN_NAMESPACE
+
+#if QT_VERSION >= QT_VERSION_CHECK(7, 0, 0)
+# define QT_BEGIN_HAS_CHAR8_T_NAMESPACE inline namespace q_has_char8_t {
+# define QT_BEGIN_NO_CHAR8_T_NAMESPACE namespace q_no_char8_t {
+#else
+# define QT_BEGIN_HAS_CHAR8_T_NAMESPACE namespace q_has_char8_t {
+# define QT_BEGIN_NO_CHAR8_T_NAMESPACE inline namespace q_no_char8_t {
+#endif
+#define QT_END_HAS_CHAR8_T_NAMESPACE }
+#define QT_END_NO_CHAR8_T_NAMESPACE }
+
+// declare namespaces:
+QT_BEGIN_HAS_CHAR8_T_NAMESPACE
+QT_END_HAS_CHAR8_T_NAMESPACE
+QT_BEGIN_NO_CHAR8_T_NAMESPACE
+QT_END_NO_CHAR8_T_NAMESPACE
+
+class QByteArray;
+class QByteArrayView;
+#if QT_VERSION >= QT_VERSION_CHECK(7, 0, 0) || defined(QT_BOOTSTRAPPED) || defined(Q_QDOC)
+class QLatin1StringView;
+using QLatin1String = QLatin1StringView;
+#else
+class QLatin1String;
+using QLatin1StringView = QLatin1String;
+#endif
+class QStringView;
+template <bool> class QBasicUtf8StringView;
+class QAnyStringView;
+class QChar;
+class QRegularExpression;
+class QRegularExpressionMatch;
+
+#ifndef Q_QDOC
+// ### Qt 7: remove the non-char8_t version of QUtf8StringView
+QT_BEGIN_NO_CHAR8_T_NAMESPACE
+using QUtf8StringView = QBasicUtf8StringView<false>;
+QT_END_NO_CHAR8_T_NAMESPACE
+
+QT_BEGIN_HAS_CHAR8_T_NAMESPACE
+using QUtf8StringView = QBasicUtf8StringView<true>;
+QT_END_HAS_CHAR8_T_NAMESPACE
+#endif // Q_QDOC
+
+QT_END_NAMESPACE
+
+#endif // QSTRINGFWD_H
diff --git a/src/corelib/text/qstringiterator.qdoc b/src/corelib/text/qstringiterator.qdoc
index 9be610161f..9b1e43163e 100644
--- a/src/corelib/text/qstringiterator.qdoc
+++ b/src/corelib/text/qstringiterator.qdoc
@@ -1,29 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2014 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2014 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
\class QStringIterator
diff --git a/src/corelib/text/qstringiterator_p.h b/src/corelib/text/qstringiterator_p.h
index e7e4166c6f..bb1a861637 100644
--- a/src/corelib/text/qstringiterator_p.h
+++ b/src/corelib/text/qstringiterator_p.h
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2014 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2014 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QSTRINGITERATOR_H
#define QSTRINGITERATOR_H
@@ -61,6 +25,8 @@ class QStringIterator
{
QString::const_iterator i, pos, e;
static_assert((std::is_same<QString::const_iterator, const QChar *>::value));
+ static bool less(const QChar *lhs, const QChar *rhs) noexcept
+ { return std::less{}(lhs, rhs); }
public:
explicit QStringIterator(QStringView string, qsizetype idx = 0)
: i(string.begin()),
@@ -76,7 +42,7 @@ public:
{
}
- inline explicit QStringIterator(const QChar *begin, int idx, const QChar *end)
+ explicit QStringIterator(const QChar *begin, qsizetype idx, const QChar *end)
: i(begin),
pos(begin + idx),
e(end)
@@ -88,14 +54,15 @@ public:
return pos;
}
- inline int index() const
+ qsizetype index() const
{
- return int(pos - i);
+ return pos - i;
}
inline void setPosition(QString::const_iterator position)
{
- Q_ASSERT_X(i <= position && position <= e, Q_FUNC_INFO, "position out of bounds");
+ Q_ASSERT_X(!less(position, i) && !less(e, position),
+ Q_FUNC_INFO, "position out of bounds");
pos = position;
}
@@ -103,7 +70,7 @@ public:
inline bool hasNext() const
{
- return pos < e;
+ return less(pos, e);
}
inline void advance()
@@ -121,7 +88,7 @@ public:
Q_ASSERT_X(hasNext(), Q_FUNC_INFO, "iterator hasn't a next item");
if (Q_UNLIKELY((pos++)->isHighSurrogate())) {
- Q_ASSERT(pos < e && pos->isLowSurrogate());
+ Q_ASSERT(hasNext() && pos->isLowSurrogate());
++pos;
}
}
@@ -131,7 +98,7 @@ public:
Q_ASSERT_X(hasNext(), Q_FUNC_INFO, "iterator hasn't a next item");
if (Q_UNLIKELY(pos->isHighSurrogate())) {
- Q_ASSERT(pos + 1 < e && pos[1].isLowSurrogate());
+ Q_ASSERT(less(pos + 1, e) && pos[1].isLowSurrogate());
return QChar::surrogateToUcs4(pos[0], pos[1]);
}
@@ -160,7 +127,7 @@ public:
const QChar cur = *pos++;
if (Q_UNLIKELY(cur.isHighSurrogate())) {
- Q_ASSERT(pos < e && pos->isLowSurrogate());
+ Q_ASSERT(hasNext() && pos->isLowSurrogate());
return QChar::surrogateToUcs4(cur, *pos++);
}
return cur.unicode();
@@ -172,7 +139,7 @@ public:
const QChar uc = *pos++;
if (Q_UNLIKELY(uc.isSurrogate())) {
- if (Q_LIKELY(uc.isHighSurrogate() && pos < e && pos->isLowSurrogate()))
+ if (Q_LIKELY(uc.isHighSurrogate() && hasNext() && pos->isLowSurrogate()))
return QChar::surrogateToUcs4(uc, *pos++);
return invalidAs;
}
@@ -184,7 +151,7 @@ public:
inline bool hasPrevious() const
{
- return pos > i;
+ return less(i, pos);
}
inline void recede()
@@ -203,7 +170,7 @@ public:
Q_ASSERT_X(hasPrevious(), Q_FUNC_INFO, "iterator hasn't a previous item");
if (Q_UNLIKELY((--pos)->isLowSurrogate())) {
- Q_ASSERT(pos > i && pos[-1].isHighSurrogate());
+ Q_ASSERT(hasPrevious() && pos[-1].isHighSurrogate());
--pos;
}
}
@@ -213,7 +180,7 @@ public:
Q_ASSERT_X(hasPrevious(), Q_FUNC_INFO, "iterator hasn't a previous item");
if (Q_UNLIKELY(pos[-1].isLowSurrogate())) {
- Q_ASSERT(pos > i + 1 && pos[-2].isHighSurrogate());
+ Q_ASSERT(less(i + 1, pos) && pos[-2].isHighSurrogate());
return QChar::surrogateToUcs4(pos[-2], pos[-1]);
}
return pos[-1].unicode();
@@ -241,7 +208,7 @@ public:
const QChar cur = *--pos;
if (Q_UNLIKELY(cur.isLowSurrogate())) {
- Q_ASSERT(pos > i && pos[-1].isHighSurrogate());
+ Q_ASSERT(hasPrevious() && pos[-1].isHighSurrogate());
return QChar::surrogateToUcs4(*--pos, cur);
}
return cur.unicode();
@@ -253,7 +220,7 @@ public:
const QChar uc = *--pos;
if (Q_UNLIKELY(uc.isSurrogate())) {
- if (Q_LIKELY(uc.isLowSurrogate() && pos > i && pos[-1].isHighSurrogate()))
+ if (Q_LIKELY(uc.isLowSurrogate() && hasPrevious() && pos[-1].isHighSurrogate()))
return QChar::surrogateToUcs4(*--pos, uc);
return invalidAs;
}
diff --git a/src/corelib/text/qstringlist.cpp b/src/corelib/text/qstringlist.cpp
index 687c83b8ab..61923e0b3f 100644
--- a/src/corelib/text/qstringlist.cpp
+++ b/src/corelib/text/qstringlist.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include <qstringlist.h>
#include <qset.h>
@@ -120,25 +84,7 @@ QT_BEGIN_NAMESPACE
\section1 Iterating Over the Strings
- To iterate over a list, you can either use index positions or
- QList's Java-style and STL-style iterator types:
-
- Indexing:
-
- \snippet qstringlist/main.cpp 1
-
- Java-style iterator:
-
- \snippet qstringlist/main.cpp 2
-
- STL-style iterator:
-
- \snippet qstringlist/main.cpp 3
-
- The QStringListIterator class is simply a type definition for
- QListIterator<QString>. QStringList also provide the
- QMutableStringListIterator class which is a type definition for
- QMutableListIterator<QString>.
+ See \l {Iterating over Containers}.
\section1 Manipulating the Strings
@@ -243,8 +189,11 @@ QT_BEGIN_NAMESPACE
\fn void QStringList::sort(Qt::CaseSensitivity cs)
Sorts the list of strings in ascending order.
+
+//! [comparison-case-sensitivity]
If \a cs is \l Qt::CaseSensitive (the default), the string comparison
is case sensitive; otherwise the comparison is case insensitive.
+//! [comparison-case-sensitivity]
Sorting is performed using the STL's std::sort() algorithm,
which averages \l{linear-logarithmic time}, i.e. O(\e{n} log \e{n}).
@@ -257,34 +206,25 @@ QT_BEGIN_NAMESPACE
integer index.
*/
-namespace {
-struct CaseInsensitiveLessThan {
- typedef bool result_type;
- result_type operator()(const QString &s1, const QString &s2) const
- {
- return s1.compare(s2, Qt::CaseInsensitive) < 0;
- }
-};
-}
-
void QtPrivate::QStringList_sort(QStringList *that, Qt::CaseSensitivity cs)
{
- if (cs == Qt::CaseSensitive)
+ if (cs == Qt::CaseSensitive) {
std::sort(that->begin(), that->end());
- else
- std::sort(that->begin(), that->end(), CaseInsensitiveLessThan());
+ } else {
+ auto CISCompare = [](const auto &s1, const auto &s2) {
+ return s1.compare(s2, Qt::CaseInsensitive) < 0;
+ };
+ std::sort(that->begin(), that->end(), CISCompare);
+ }
}
-#if QT_STRINGVIEW_LEVEL < 2
/*!
\fn QStringList QStringList::filter(const QString &str, Qt::CaseSensitivity cs) const
Returns a list of all the strings containing the substring \a str.
- If \a cs is \l Qt::CaseSensitive (the default), the string
- comparison is case sensitive; otherwise the comparison is case
- insensitive.
+ \include qstringlist.cpp comparison-case-sensitivity
\snippet qstringlist/main.cpp 5
\snippet qstringlist/main.cpp 10
@@ -296,7 +236,17 @@ void QtPrivate::QStringList_sort(QStringList *that, Qt::CaseSensitivity cs)
\sa contains()
*/
-#endif
+
+template <typename String>
+static QStringList filter_helper(const QStringList &that, const String &needle, Qt::CaseSensitivity cs)
+{
+ QStringList res;
+ for (const auto &s : that) {
+ if (s.contains(needle, cs))
+ res.append(s);
+ }
+ return res;
+}
/*!
\fn QStringList QStringList::filter(QStringView str, Qt::CaseSensitivity cs) const
@@ -306,14 +256,48 @@ void QtPrivate::QStringList_sort(QStringList *that, Qt::CaseSensitivity cs)
QStringList QtPrivate::QStringList_filter(const QStringList *that, QStringView str,
Qt::CaseSensitivity cs)
{
- QStringMatcher matcher(str, cs);
+ return filter_helper(*that, str, cs);
+}
+
+/*!
+ \fn QStringList QStringList::filter(const QStringMatcher &matcher) const
+ \since 6.7
+ \overload
+
+ Returns a list of all the strings matched by \a matcher (i.e. for which
+ \c matcher.indexIn() returns an index >= 0).
+
+ Using a QStringMatcher may be faster when searching in large lists and/or
+ in lists with long strings (the best way to find out is benchmarking).
+
+ For example:
+ \snippet qstringlist/main.cpp 18
+
+ \sa contains()
+*/
+
+QStringList QtPrivate::QStringList_filter(const QStringList &that, const QStringMatcher &matcher)
+{
QStringList res;
- for (qsizetype i = 0; i < that->size(); ++i)
- if (matcher.indexIn(that->at(i)) != -1)
- res << that->at(i);
+ for (const auto &s : that) {
+ if (matcher.indexIn(s) != -1)
+ res.append(s);
+ }
return res;
}
+/*!
+ \fn QStringList QStringList::filter(QLatin1StringView str, Qt::CaseSensitivity cs) const
+ \since 6.7
+ \overload
+*/
+
+QStringList QtPrivate::QStringList_filter(const QStringList &that, QLatin1StringView needle,
+ Qt::CaseSensitivity cs)
+{
+ return filter_helper(that, needle, cs);
+}
+
template<typename T>
static bool stringList_contains(const QStringList &stringList, const T &str, Qt::CaseSensitivity cs)
{
@@ -325,17 +309,16 @@ static bool stringList_contains(const QStringList &stringList, const T &str, Qt:
}
-#if QT_STRINGVIEW_LEVEL < 2
/*!
\fn bool QStringList::contains(const QString &str, Qt::CaseSensitivity cs) const
Returns \c true if the list contains the string \a str; otherwise
- returns \c false. The search is case insensitive if \a cs is
- Qt::CaseInsensitive; the search is case sensitive by default.
+ returns \c false.
+
+ \include qstringlist.cpp comparison-case-sensitivity
\sa indexOf(), lastIndexOf(), QString::contains()
*/
-#endif
/*!
\fn bool QStringList::contains(QStringView str, Qt::CaseSensitivity cs) const
@@ -343,8 +326,9 @@ static bool stringList_contains(const QStringList &stringList, const T &str, Qt:
\since 5.12
Returns \c true if the list contains the string \a str; otherwise
- returns \c false. The search is case insensitive if \a cs is
- Qt::CaseInsensitive; the search is case sensitive by default.
+ returns \c false.
+
+ \include qstringlist.cpp comparison-case-sensitivity
*/
bool QtPrivate::QStringList_contains(const QStringList *that, QStringView str,
Qt::CaseSensitivity cs)
@@ -353,17 +337,18 @@ bool QtPrivate::QStringList_contains(const QStringList *that, QStringView str,
}
/*!
- \fn bool QStringList::contains(QLatin1String str, Qt::CaseSensitivity cs) const
+ \fn bool QStringList::contains(QLatin1StringView str, Qt::CaseSensitivity cs) const
\overload
\since 5.10
- Returns \c true if the list contains the string \a str; otherwise
- returns \c false. The search is case insensitive if \a cs is
- Qt::CaseInsensitive; the search is case sensitive by default.
+ Returns \c true if the list contains the Latin-1 string viewed by \a str; otherwise
+ returns \c false.
+
+ \include qstringlist.cpp comparison-case-sensitivity
\sa indexOf(), lastIndexOf(), QString::contains()
*/
-bool QtPrivate::QStringList_contains(const QStringList *that, QLatin1String str,
+bool QtPrivate::QStringList_contains(const QStringList *that, QLatin1StringView str,
Qt::CaseSensitivity cs)
{
return stringList_contains(*that, str, cs);
@@ -382,22 +367,22 @@ bool QtPrivate::QStringList_contains(const QStringList *that, QLatin1String str,
QStringList QtPrivate::QStringList_filter(const QStringList *that, const QRegularExpression &re)
{
QStringList res;
- for (qsizetype i = 0; i < that->size(); ++i) {
- if (that->at(i).contains(re))
- res << that->at(i);
+ for (const auto &str : *that) {
+ if (str.contains(re))
+ res.append(str);
}
return res;
}
#endif // QT_CONFIG(regularexpression)
-#if QT_STRINGVIEW_LEVEL < 2
/*!
\fn QStringList &QStringList::replaceInStrings(const QString &before, const QString &after, Qt::CaseSensitivity cs)
Returns a string list where every string has had the \a before
text replaced with the \a after text wherever the \a before text
- is found. The \a before text is matched case-sensitively or not
- depending on the \a cs flag.
+ is found.
+
+ \include qstringlist.cpp comparison-case-sensitivity
For example:
@@ -418,7 +403,6 @@ QStringList QtPrivate::QStringList_filter(const QStringList *that, const QRegula
\overload
\since 5.14
*/
-#endif
/*!
\fn QStringList &QStringList::replaceInStrings(QStringView before, QStringView after, Qt::CaseSensitivity cs)
@@ -428,8 +412,19 @@ QStringList QtPrivate::QStringList_filter(const QStringList *that, const QRegula
void QtPrivate::QStringList_replaceInStrings(QStringList *that, QStringView before,
QStringView after, Qt::CaseSensitivity cs)
{
- for (qsizetype i = 0; i < that->size(); ++i)
- (*that)[i].replace(before.data(), before.length(), after.data(), after.length(), cs);
+ // Before potentially detaching "that" list, check if any string contains "before"
+ qsizetype i = -1;
+ for (qsizetype j = 0; j < that->size(); ++j) {
+ if (that->at(j).contains(before, cs)) {
+ i = j;
+ break;
+ }
+ }
+ if (i == -1)
+ return;
+
+ for (; i < that->size(); ++i)
+ (*that)[i].replace(before.data(), before.size(), after.data(), after.size(), cs);
}
#if QT_CONFIG(regularexpression)
@@ -456,9 +451,21 @@ void QtPrivate::QStringList_replaceInStrings(QStringList *that, QStringView befo
\snippet qstringlist/main.cpp 5
\snippet qstringlist/main.cpp 17
*/
-void QtPrivate::QStringList_replaceInStrings(QStringList *that, const QRegularExpression &re, const QString &after)
+void QtPrivate::QStringList_replaceInStrings(QStringList *that, const QRegularExpression &re,
+ const QString &after)
{
- for (qsizetype i = 0; i < that->size(); ++i)
+ // Before potentially detaching "that" list, check if any string contains "before"
+ qsizetype i = -1;
+ for (qsizetype j = 0; j < that->size(); ++j) {
+ if (that->at(j).contains(re)) {
+ i = j;
+ break;
+ }
+ }
+ if (i == -1)
+ return;
+
+ for (; i < that->size(); ++i)
(*that)[i].replace(re, after);
}
#endif // QT_CONFIG(regularexpression)
@@ -474,7 +481,6 @@ static qsizetype accumulatedSize(const QStringList &list, qsizetype seplen)
return result;
}
-#if QT_STRINGVIEW_LEVEL < 2
/*!
\fn QString QStringList::join(const QString &separator) const
@@ -484,7 +490,6 @@ static qsizetype accumulatedSize(const QStringList &list, qsizetype seplen)
\sa QString::split()
*/
-#endif
/*!
\fn QString QStringList::join(QChar separator) const
@@ -509,11 +514,11 @@ QString QtPrivate::QStringList_join(const QStringList *that, const QChar *sep, q
}
/*!
- \fn QString QStringList::join(QLatin1String separator) const
+ \fn QString QStringList::join(QLatin1StringView separator) const
\since 5.8
\overload join()
*/
-QString QtPrivate::QStringList_join(const QStringList &list, QLatin1String sep)
+QString QtPrivate::QStringList_join(const QStringList &list, QLatin1StringView sep)
{
QString result;
if (!list.isEmpty()) {
@@ -536,7 +541,7 @@ QString QtPrivate::QStringList_join(const QStringList &list, QLatin1String sep)
*/
QString QtPrivate::QStringList_join(const QStringList *that, QStringView sep)
{
- return QStringList_join(that, sep.data(), sep.length());
+ return QStringList_join(that, sep.data(), sep.size());
}
/*!
@@ -576,6 +581,102 @@ QString QtPrivate::QStringList_join(const QStringList *that, QStringView sep)
the latter string list.
*/
+/*!
+ \fn qsizetype QStringList::indexOf(const QString &str, qsizetype from, Qt::CaseSensitivity cs) const
+ \fn qsizetype QStringList::indexOf(QStringView str, qsizetype from, Qt::CaseSensitivity cs) const
+ \fn qsizetype QStringList::indexOf(QLatin1StringView str, qsizetype from, Qt::CaseSensitivity cs) const
+
+ Returns the index position of the first match of \a str in the list,
+ searching forward from index position \a from. Returns -1 if no item
+ matched.
+
+ \include qstringlist.cpp comparison-case-sensitivity
+
+//! [overloading-base-class-methods]
+ \note The \a cs parameter was added in Qt 6.7, i.e. these methods now overload
+ the methods inherited from the base class. Prior to that these methods only
+ had two parameters. This change is source compatible and existing code should
+ continue to work.
+//! [overloading-base-class-methods]
+
+ \sa lastIndexOf()
+*/
+
+template <typename String>
+qsizetype indexOf_helper(const QStringList &that, String needle, qsizetype from,
+ Qt::CaseSensitivity cs)
+{
+ if (from < 0) // Historical behavior
+ from = qMax(from + that.size(), 0);
+
+ if (from >= that.size())
+ return -1;
+
+ for (qsizetype i = from; i < that.size(); ++i) {
+ if (needle.compare(that.at(i), cs) == 0)
+ return i;
+ }
+ return -1;
+}
+
+qsizetype QtPrivate::QStringList_indexOf(const QStringList &that, QStringView needle,
+ qsizetype from, Qt::CaseSensitivity cs)
+{
+ return indexOf_helper(that, needle, from, cs);
+}
+
+qsizetype QtPrivate::QStringList_indexOf(const QStringList &that, QLatin1StringView needle,
+ qsizetype from, Qt::CaseSensitivity cs)
+{
+ return indexOf_helper(that, needle, from, cs);
+}
+
+/*!
+ \fn qsizetype QStringList::lastIndexOf(const QString &str, qsizetype from, Qt::CaseSensitivity cs) const
+ \fn qsizetype QStringList::lastIndexOf(QStringView str, qsizetype from, Qt::CaseSensitivity cs) const
+ \fn qsizetype QStringList::lastIndexOf(QLatin1StringView str, qsizetype from, Qt::CaseSensitivity cs) const
+
+ Returns the index position of the last match of \a str in the list,
+ searching backward from index position \a from. If \a from is -1 (the
+ default), the search starts at the last item. Returns -1 if no item
+ matched.
+
+ \include qstringlist.cpp comparison-case-sensitivity
+
+ \include qstringlist.cpp overloading-base-class-methods
+
+ \sa indexOf()
+*/
+
+template <typename String>
+qsizetype lastIndexof_helper(const QStringList &that, String needle, qsizetype from,
+ Qt::CaseSensitivity cs)
+{
+ if (from < 0)
+ from += that.size();
+ else if (from >= that.size())
+ from = that.size() - 1;
+
+ for (qsizetype i = from; i >= 0; --i) {
+ if (needle.compare(that.at(i), cs) == 0)
+ return i;
+ }
+
+ return -1;
+}
+
+qsizetype QtPrivate::QStringList_lastIndexOf(const QStringList &that, QLatin1StringView needle,
+ qsizetype from, Qt::CaseSensitivity cs)
+{
+ return lastIndexof_helper(that, needle, from, cs);
+}
+
+qsizetype QtPrivate::QStringList_lastIndexOf(const QStringList &that, QStringView needle,
+ qsizetype from, Qt::CaseSensitivity cs)
+{
+ return lastIndexof_helper(that, needle, from, cs);
+}
+
#if QT_CONFIG(regularexpression)
/*!
\fn qsizetype QStringList::indexOf(const QRegularExpression &re, qsizetype from) const
diff --git a/src/corelib/text/qstringlist.h b/src/corelib/text/qstringlist.h
index 5ec95036be..fc5c49bfe1 100644
--- a/src/corelib/text/qstringlist.h
+++ b/src/corelib/text/qstringlist.h
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// Copyright (C) 2016 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include <QtCore/qlist.h>
@@ -63,14 +27,29 @@ namespace QtPrivate {
qsizetype Q_CORE_EXPORT QStringList_removeDuplicates(QStringList *that);
QString Q_CORE_EXPORT QStringList_join(const QStringList *that, QStringView sep);
QString Q_CORE_EXPORT QStringList_join(const QStringList *that, const QChar *sep, qsizetype seplen);
- Q_CORE_EXPORT QString QStringList_join(const QStringList &list, QLatin1String sep);
+ Q_CORE_EXPORT QString QStringList_join(const QStringList &list, QLatin1StringView sep);
QStringList Q_CORE_EXPORT QStringList_filter(const QStringList *that, QStringView str,
Qt::CaseSensitivity cs);
+ Q_CORE_EXPORT QStringList QStringList_filter(const QStringList &that, QLatin1StringView needle,
+ Qt::CaseSensitivity cs);
+ Q_CORE_EXPORT QStringList QStringList_filter(const QStringList &that,
+ const QStringMatcher &matcher);
+
bool Q_CORE_EXPORT QStringList_contains(const QStringList *that, QStringView str, Qt::CaseSensitivity cs);
- bool Q_CORE_EXPORT QStringList_contains(const QStringList *that, QLatin1String str, Qt::CaseSensitivity cs);
+ bool Q_CORE_EXPORT QStringList_contains(const QStringList *that, QLatin1StringView str, Qt::CaseSensitivity cs);
void Q_CORE_EXPORT QStringList_replaceInStrings(QStringList *that, QStringView before, QStringView after,
Qt::CaseSensitivity cs);
+ qsizetype Q_CORE_EXPORT QStringList_indexOf(const QStringList &that, QStringView str,
+ qsizetype from, Qt::CaseSensitivity cs);
+ qsizetype Q_CORE_EXPORT QStringList_indexOf(const QStringList &that, QLatin1StringView str,
+ qsizetype from, Qt::CaseSensitivity cs);
+
+ Q_CORE_EXPORT qsizetype QStringList_lastIndexOf(const QStringList &that, QStringView str,
+ qsizetype from, Qt::CaseSensitivity cs);
+ Q_CORE_EXPORT qsizetype QStringList_lastIndexOf(const QStringList &that, QLatin1StringView str,
+ qsizetype from, Qt::CaseSensitivity cs);
+
#if QT_CONFIG(regularexpression)
void Q_CORE_EXPORT QStringList_replaceInStrings(QStringList *that, const QRegularExpression &rx, const QString &after);
QStringList Q_CORE_EXPORT QStringList_filter(const QStringList *that, const QRegularExpression &re);
@@ -109,11 +88,15 @@ public:
inline QString join(QStringView sep) const
{ return QtPrivate::QStringList_join(self(), sep); }
- inline QString join(QLatin1String sep) const
+ inline QString join(QLatin1StringView sep) const
{ return QtPrivate::QStringList_join(*self(), sep); }
inline QString join(QChar sep) const
{ return QtPrivate::QStringList_join(self(), &sep, 1); }
+ QStringList filter(const QStringMatcher &matcher) const
+ { return QtPrivate::QStringList_filter(*self(), matcher); }
+ QStringList filter(QLatin1StringView needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
+ { return QtPrivate::QStringList_filter(*self(), needle, cs); }
inline QStringList filter(QStringView str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
{ return QtPrivate::QStringList_filter(self(), str, cs); }
inline QStringList &replaceInStrings(QStringView before, QStringView after, Qt::CaseSensitivity cs = Qt::CaseSensitive)
@@ -122,9 +105,8 @@ public:
return *self();
}
-#if QT_STRINGVIEW_LEVEL < 2
inline QString join(const QString &sep) const
- { return QtPrivate::QStringList_join(self(), sep.constData(), sep.length()); }
+ { return QtPrivate::QStringList_join(self(), sep.constData(), sep.size()); }
inline QStringList filter(const QString &str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
{ return QtPrivate::QStringList_filter(self(), str, cs); }
inline QStringList &replaceInStrings(const QString &before, const QString &after, Qt::CaseSensitivity cs = Qt::CaseSensitive)
@@ -142,24 +124,37 @@ public:
QtPrivate::QStringList_replaceInStrings(self(), before, after, cs);
return *self();
}
-#endif
using QListSpecialMethodsBase<QString>::contains;
using QListSpecialMethodsBase<QString>::indexOf;
using QListSpecialMethodsBase<QString>::lastIndexOf;
- inline bool contains(QLatin1String str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
+ inline bool contains(QLatin1StringView str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
{ return QtPrivate::QStringList_contains(self(), str, cs); }
inline bool contains(QStringView str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
{ return QtPrivate::QStringList_contains(self(), str, cs); }
-#if QT_STRINGVIEW_LEVEL < 2
inline bool contains(const QString &str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
{ return QtPrivate::QStringList_contains(self(), str, cs); }
- qsizetype indexOf(const QString &str, qsizetype from = 0) const noexcept
- { return indexOf(QStringView(str), from); }
- qsizetype lastIndexOf(const QString &str, qsizetype from = -1) const noexcept
- { return lastIndexOf(QStringView(str), from); }
-#endif
+
+ qsizetype indexOf(const QString &str, qsizetype from = 0,
+ Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
+ { return indexOf(QStringView(str), from, cs); }
+ qsizetype indexOf(QStringView needle, qsizetype from = 0,
+ Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
+ { return QtPrivate::QStringList_indexOf(*self(), needle, from, cs); }
+ qsizetype indexOf(QLatin1StringView needle, qsizetype from = 0,
+ Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
+ { return QtPrivate::QStringList_indexOf(*self(), needle, from, cs); }
+
+ qsizetype lastIndexOf(const QString &str, qsizetype from = -1,
+ Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
+ { return lastIndexOf(QStringView(str), from, cs); }
+ qsizetype lastIndexOf(QStringView str, qsizetype from = -1,
+ Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
+ { return QtPrivate::QStringList_lastIndexOf(*self(), str, from, cs); }
+ qsizetype lastIndexOf(QLatin1StringView needle, qsizetype from = -1,
+ Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
+ { return QtPrivate::QStringList_lastIndexOf(*self(), needle, from, cs); }
#if QT_CONFIG(regularexpression)
inline QStringList filter(const QRegularExpression &re) const
diff --git a/src/corelib/text/qstringliteral.h b/src/corelib/text/qstringliteral.h
index d9804b31d6..429d9c02ad 100644
--- a/src/corelib/text/qstringliteral.h
+++ b/src/corelib/text/qstringliteral.h
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2020 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2020 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QSTRINGLITERAL_H
#define QSTRINGLITERAL_H
diff --git a/src/corelib/text/qstringmatcher.cpp b/src/corelib/text/qstringmatcher.cpp
index 2fba8daa88..379d555e54 100644
--- a/src/corelib/text/qstringmatcher.cpp
+++ b/src/corelib/text/qstringmatcher.cpp
@@ -1,52 +1,19 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Copyright (C) 2019 Mail.ru Group.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// Copyright (C) 2019 Mail.ru Group.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qstringmatcher.h"
QT_BEGIN_NAMESPACE
+static constexpr qsizetype FoldBufferCapacity = 256;
+
static void bm_init_skiptable(QStringView needle, uchar *skiptable, Qt::CaseSensitivity cs)
{
const char16_t *uc = needle.utf16();
- const qsizetype len = needle.size();
- qsizetype l = qMin(len, qsizetype(255));
+ const qsizetype len =
+ cs == Qt::CaseSensitive ? needle.size() : qMin(needle.size(), FoldBufferCapacity);
+ int l = qMin(int(len), 255);
memset(skiptable, l, 256 * sizeof(uchar));
uc += len - l;
if (cs == Qt::CaseSensitive) {
@@ -73,11 +40,12 @@ static inline qsizetype bm_find(QStringView haystack, qsizetype index, QStringVi
if (pl == 0)
return index > l ? -1 : index;
- const qsizetype pl_minus_one = pl - 1;
- const char16_t *current = uc + index + pl_minus_one;
- const char16_t *end = uc + l;
if (cs == Qt::CaseSensitive) {
+ const qsizetype pl_minus_one = pl - 1;
+ const char16_t *current = uc + index + pl_minus_one;
+ const char16_t *end = uc + l;
+
while (current < end) {
qsizetype skip = skiptable[*current & 0xff];
if (!skip) {
@@ -102,21 +70,38 @@ static inline qsizetype bm_find(QStringView haystack, qsizetype index, QStringVi
current += skip;
}
} else {
+ char16_t foldBuffer[FoldBufferCapacity];
+ const qsizetype foldBufferLength = qMin(FoldBufferCapacity, pl);
+ const char16_t *start = puc;
+ for (qsizetype i = 0; i < foldBufferLength; ++i)
+ foldBuffer[i] = foldCase(&puc[i], start);
+ QStringView restNeedle = needle.sliced(foldBufferLength);
+ const qsizetype foldBufferEnd = foldBufferLength - 1;
+ const char16_t *current = uc + index + foldBufferEnd;
+ const char16_t *end = uc + l;
+
while (current < end) {
qsizetype skip = skiptable[foldCase(current, uc) & 0xff];
if (!skip) {
// possible match
- while (skip < pl) {
- if (foldCase(current - skip, uc) != foldCase(puc + pl_minus_one - skip, puc))
+ while (skip < foldBufferLength) {
+ if (foldCase(current - skip, uc) != foldBuffer[foldBufferEnd - skip])
break;
++skip;
}
- if (skip > pl_minus_one) // we have a match
- return (current - uc) - pl_minus_one;
+ if (skip > foldBufferEnd) { // Matching foldBuffer
+ qsizetype candidatePos = (current - uc) - foldBufferEnd;
+ QStringView restHaystack =
+ haystack.sliced(qMin(haystack.size(), candidatePos + foldBufferLength));
+ if (restNeedle.size() == 0
+ || restHaystack.startsWith(
+ restNeedle, Qt::CaseInsensitive)) // Check the rest of the string
+ return candidatePos;
+ }
// in case we don't have a match we are a bit inefficient as we only skip by one
// when we have the non matching char in the string.
- if (skiptable[foldCase(current - skip, uc) & 0xff] == pl)
- skip = pl - skip;
+ if (skiptable[foldCase(current - skip, uc) & 0xff] == foldBufferLength)
+ skip = foldBufferLength - skip;
else
skip = 1;
}
@@ -258,6 +243,15 @@ QString QStringMatcher::pattern() const
}
/*!
+ \fn QStringView QStringMatcher::patternView() const noexcept
+ \since 6.7
+
+ Returns a string view of the pattern that this string matcher will search for.
+
+ \sa setPattern()
+*/
+
+/*!
Sets the case sensitivity setting of this string matcher to \a
cs.
diff --git a/src/corelib/text/qstringmatcher.h b/src/corelib/text/qstringmatcher.h
index 39cb877151..937f17df0a 100644
--- a/src/corelib/text/qstringmatcher.h
+++ b/src/corelib/text/qstringmatcher.h
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Copyright (C) 2019 Mail.ru Group.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// Copyright (C) 2019 Mail.ru Group.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QSTRINGMATCHER_H
#define QSTRINGMATCHER_H
@@ -76,6 +40,9 @@ public:
{ return indexIn(QStringView(str, length), from); }
qsizetype indexIn(QStringView str, qsizetype from = 0) const;
QString pattern() const;
+ QStringView patternView() const noexcept
+ { return q_sv; }
+
inline Qt::CaseSensitivity caseSensitivity() const { return q_cs; }
private:
diff --git a/src/corelib/text/qstringtokenizer.cpp b/src/corelib/text/qstringtokenizer.cpp
index cad70c6718..fc6faed27f 100644
--- a/src/corelib/text/qstringtokenizer.cpp
+++ b/src/corelib/text/qstringtokenizer.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qstringtokenizer.h"
#include "qstringalgorithms.h"
@@ -73,7 +37,7 @@ QT_BEGIN_NAMESPACE
Argument Deduction (CTAD), you may write
\c{QStringTokenizer{string, separator}} (without template
arguments). If you can't use C++17 CTAD, you must use the
- QStringView::split() or QLatin1String::split() member functions
+ QStringView::split() or QLatin1StringView::split() member functions
and store the return value only in \c{auto} variables:
\code
@@ -149,7 +113,7 @@ QT_BEGIN_NAMESPACE
/*!
\typealias QStringTokenizer::value_type
- Alias for \c{const QStringView} or \c{const QLatin1String},
+ Alias for \c{const QStringView} or \c{const QLatin1StringView},
depending on the tokenizer's \c Haystack template argument.
*/
diff --git a/src/corelib/text/qstringtokenizer.h b/src/corelib/text/qstringtokenizer.h
index d14099ffbb..7a627b4508 100644
--- a/src/corelib/text/qstringtokenizer.h
+++ b/src/corelib/text/qstringtokenizer.h
@@ -1,46 +1,11 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QSTRINGTOKENIZER_H
#define QSTRINGTOKENIZER_H
#include <QtCore/qnamespace.h>
#include <QtCore/qcontainerfwd.h>
+#include <iterator>
QT_BEGIN_NAMESPACE
@@ -168,7 +133,7 @@ namespace Tok {
template <typename String> struct ViewForImpl {};
template <> struct ViewForImpl<QStringView> { using type = QStringView; };
- template <> struct ViewForImpl<QLatin1String> { using type = QLatin1String; };
+ template <> struct ViewForImpl<QLatin1StringView> { using type = QLatin1StringView; };
template <> struct ViewForImpl<QChar> { using type = QChar; };
template <> struct ViewForImpl<QString> : ViewForImpl<QStringView> {};
template <> struct ViewForImpl<QLatin1Char> : ViewForImpl<QChar> {};
@@ -185,7 +150,7 @@ namespace Tok {
#endif
// This metafunction maps a StringLike to a View (currently, QChar,
- // QStringView, QLatin1String). This is what QStringTokenizerBase
+ // QStringView, QLatin1StringView). This is what QStringTokenizerBase
// operates on. QStringTokenizer adds pinning to keep rvalues alive
// for the duration of the algorithm.
template <typename String>
@@ -292,7 +257,7 @@ class QStringTokenizer
using if_haystack_not_pinned = typename if_haystack_not_pinned_impl<Container, HPin>::type;
template <typename Container, typename Iterator = decltype(std::begin(std::declval<Container>()))>
using if_compatible_container = typename std::enable_if<
- std::is_same<
+ std::is_convertible<
typename Base::value_type,
typename std::iterator_traits<Iterator>::value_type
>::value,
diff --git a/src/corelib/text/qstringview.cpp b/src/corelib/text/qstringview.cpp
index faaed16044..29b83ffe8f 100644
--- a/src/corelib/text/qstringview.cpp
+++ b/src/corelib/text/qstringview.cpp
@@ -1,45 +1,7 @@
-/****************************************************************************
-**
-** Copyright (C) 2017 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2017 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qstringview.h"
-#include "qstring.h"
-#include "qlocale_p.h"
QT_BEGIN_NAMESPACE
@@ -70,7 +32,7 @@ QT_BEGIN_NAMESPACE
When used as an interface type, QStringView allows a single function to accept
a wide variety of UTF-16 string data sources. One function accepting QStringView
thus replaces three function overloads (taking QString and
- \c{(const QChar*, int)}), while at the same time enabling even more string data
+ \c{(const QChar*, qsizetype)}), while at the same time enabling even more string data
sources to be passed to the function, such as \c{u"Hello World"}, a \c char16_t
string literal.
@@ -87,11 +49,11 @@ QT_BEGIN_NAMESPACE
QChar constructor by itself.
\li \e QString: if you store an unmodified copy of the string and thus would
like to take advantage of QString's implicit sharing.
- \li QLatin1String: if you can implement the function without converting the
- QLatin1String to UTF-16 first; users expect a function overloaded on
- QLatin1String to perform strictly less memory allocations than the
+ \li QLatin1StringView: if you can implement the function without converting the
+ QLatin1StringView to UTF-16 first; users expect a function overloaded on
+ QLatin1StringView to perform strictly less memory allocations than the
semantically equivalent call of the QStringView version, involving
- construction of a QString from the QLatin1String.
+ construction of a QString from the QLatin1StringView.
\endlist
QStringView can also be used as the return value of a function. If you call a
@@ -217,7 +179,7 @@ QT_BEGIN_NAMESPACE
*/
/*!
- \fn template <typename Char> QStringView::QStringView(const Char *str, qsizetype len)
+ \fn template <typename Char, QStringView::if_compatible_char<Char> = true> QStringView::QStringView(const Char *str, qsizetype len)
Constructs a string view on \a str with length \a len.
@@ -233,7 +195,7 @@ QT_BEGIN_NAMESPACE
*/
/*!
- \fn template <typename Char> QStringView::QStringView(const Char *first, const Char *last)
+ \fn template <typename Char, QStringView::if_compatible_char<Char> = true> QStringView::QStringView(const Char *first, const Char *last)
Constructs a string view on \a first with length (\a last - \a first).
@@ -300,26 +262,26 @@ QT_BEGIN_NAMESPACE
*/
/*!
- \fn template <typename Container, if_compatible_container<Container>> QStringView::QStringView(const Container &str)
+ \fn template <typename Container, QStringView::if_compatible_container<Container>> QStringView::QStringView(const Container &str)
- Constructs a string view on \a str. The length is taken from \c{str.size()}.
+ Constructs a string view on \a str. The length is taken from \c{std::size(str)}.
- \c{str.data()} must remain valid for the lifetime of this string view object.
+ \c{std::data(str)} must remain valid for the lifetime of this string view object.
- This constructor only participates in overload resolution if \c StdBasicString is an
- instantiation of \c std::basic_string with a compatible character type. The
+ This constructor only participates in overload resolution if \c Container is a
+ container with a compatible character type as \c{value_type}. The
compatible character types are: \c QChar, \c ushort, \c char16_t and
(on platforms, such as Windows, where it is a 16-bit type) \c wchar_t.
- The string view will be empty if and only if \c{str.empty()}. It is unspecified
- whether this constructor can result in a null string view (\c{str.data()} would
+ The string view will be empty if and only if \c{std::size(str) == 0}. It is unspecified
+ whether this constructor can result in a null string view (\c{std::data(str)} would
have to return \nullptr for this).
\sa isNull(), isEmpty()
*/
/*!
- \fn template <typename Char, size_t Size> static QStringView QStringView::fromArray(const Char (&string)[Size]) noexcept
+ \fn template <typename Char, size_t Size, QStringView::if_compatible_char<Char> = true> static QStringView QStringView::fromArray(const Char (&string)[Size]) noexcept
Constructs a string view on the full character string literal \a string,
including any trailing \c{Char(0)}. If you don't want the
@@ -343,18 +305,16 @@ QT_BEGIN_NAMESPACE
Returns a deep copy of this string view's data as a QString.
The return value will be the null QString if and only if this string view is null.
-
- \warning QStringView can store strings with more than 2\sup{30} characters
- while QString cannot. Calling this function on a string view for which size()
- returns a value greater than \c{INT_MAX / 2} constitutes undefined behavior.
*/
/*!
\fn const QChar *QStringView::data() const
+//! [const-pointer-to-first-ch]
Returns a const pointer to the first character in the string view.
\note The character array represented by the return value is \e not null-terminated.
+//! [const-pointer-to-first-ch]
\sa begin(), end(), utf16()
*/
@@ -363,9 +323,7 @@ QT_BEGIN_NAMESPACE
\fn const QChar *QStringView::constData() const
\since 6.0
- Returns a const pointer to the first character in the string view.
-
- \note The character array represented by the return value is \e not null-terminated.
+ \include qstringview.cpp const-pointer-to-first-ch
\sa data(), begin(), end(), utf16()
*/
@@ -373,12 +331,10 @@ QT_BEGIN_NAMESPACE
/*!
\fn const storage_type *QStringView::utf16() const
- Returns a const pointer to the first character in the string view.
+ \include qstringview.cpp const-pointer-to-first-ch
\c{storage_type} is \c{char16_t}.
- \note The character array represented by the return value is \e not null-terminated.
-
\sa begin(), end(), data()
*/
@@ -515,7 +471,7 @@ QT_BEGIN_NAMESPACE
/*!
\fn qsizetype QStringView::size() const
- Returns the size of this string view, in UTF-16 code points (that is,
+ Returns the size of this string view, in UTF-16 code units (that is,
surrogate pairs count as two for the purposes of this function, the same
as in QString).
@@ -523,7 +479,7 @@ QT_BEGIN_NAMESPACE
*/
/*!
- \fn int QStringView::length() const
+ \fn QStringView::length() const
Same as size().
@@ -554,7 +510,7 @@ QT_BEGIN_NAMESPACE
/*!
\fn template <typename...Args> QString QStringView::arg(Args &&...args) const
- \fn template <typename...Args> QString QLatin1String::arg(Args &&...args) const
+ \fn template <typename...Args> QString QLatin1StringView::arg(Args &&...args) const
\fn template <typename...Args> QString QString::arg(Args &&...args) const
\since 5.14
@@ -564,7 +520,7 @@ QT_BEGIN_NAMESPACE
second of the \a args the \c{%N} with the next-lowest \c{N} etc.
\c Args can consist of anything that implicitly converts to QString,
- QStringView or QLatin1String.
+ QStringView or QLatin1StringView.
In addition, the following types are also supported: QChar, QLatin1Char.
@@ -578,8 +534,10 @@ QT_BEGIN_NAMESPACE
This function is provided for STL compatibility.
+//! [calling-on-empty-is-UB]
\warning Calling this function on an empty string view constitutes
undefined behavior.
+//! [calling-on-empty-is-UB]
\sa back(), first(), last()
*/
@@ -591,8 +549,7 @@ QT_BEGIN_NAMESPACE
This function is provided for STL compatibility.
- \warning Calling this function on an empty string view constitutes
- undefined behavior.
+ \include qstringview.cpp calling-on-empty-is-UB
\sa front(), first(), last()
*/
@@ -604,8 +561,7 @@ QT_BEGIN_NAMESPACE
This function is provided for compatibility with other Qt containers.
- \warning Calling this function on an empty string view constitutes
- undefined behavior.
+ \include qstringview.cpp calling-on-empty-is-UB
\sa front(), back(), last()
*/
@@ -617,8 +573,7 @@ QT_BEGIN_NAMESPACE
This function is provided for compatibility with other Qt containers.
- \warning Calling this function on an empty string view constitutes
- undefined behavior.
+ \include qstringview.cpp calling-on-empty-is-UB
\sa back(), front(), first()
*/
@@ -699,8 +654,10 @@ QT_BEGIN_NAMESPACE
Returns a string view that points to \a n characters of this string view,
starting at position \a pos.
+//! [UB-sliced-index-length]
\note The behavior is undefined when \a pos < 0, \a n < 0,
or \a pos + \a n > size().
+//! [UB-sliced-index-length]
\sa first(), last(), chopped(), chop(), truncate()
*/
@@ -713,7 +670,9 @@ QT_BEGIN_NAMESPACE
Returns a string view starting at position \a pos in this object,
and extending to its end.
+//! [UB-sliced-index-only]
\note The behavior is undefined when \a pos < 0 or \a pos > size().
+//! [UB-sliced-index-only]
\sa first(), last(), chopped(), chop(), truncate()
*/
@@ -769,37 +728,50 @@ QT_BEGIN_NAMESPACE
\fn int QStringView::compare(QStringView str, Qt::CaseSensitivity cs) const
\since 5.12
- Returns an integer that compares to zero as this string view compares to the
- string view \a str.
+ Compares this string view with string view \a str and returns a negative integer if
+ this string view is less than \a str, a positive integer if it is greater than
+ \a str, and zero if they are equal.
- If \a cs is Qt::CaseSensitive (the default), the comparison is case sensitive;
- otherwise the comparison is case-insensitive.
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {comparison}
\sa operator==(), operator<(), operator>()
*/
/*!
- \fn int QStringView::compare(QLatin1String l1, Qt::CaseSensitivity cs) const
+ \fn int QStringView::compare(QUtf8StringView str, Qt::CaseSensitivity cs) const
+ \since 6.5
+
+ Compares this string view with QUtf8StringView \a str and returns a negative integer if
+ this string view is less than \a str, a positive integer if it is greater than
+ \a str, and zero if they are equal.
+
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {comparison}
+
+ \sa operator==(), operator<(), operator>()
+*/
+
+/*!
+ \fn int QStringView::compare(QLatin1StringView l1, Qt::CaseSensitivity cs) const
\fn int QStringView::compare(QChar ch) const
\fn int QStringView::compare(QChar ch, Qt::CaseSensitivity cs) const
\since 5.15
- Returns an integer that compares to zero as this string view compares to the
- Latin-1 string \a l1, or character \a ch, respectively.
+ Compares this string view to the Latin-1 string view \a l1, or the character \a ch.
+ Returns a negative integer if this string view is less than \a l1 or \a ch,
+ a positive integer if it is greater than \a l1 or \a ch, and zero if they are equal.
- If \a cs is Qt::CaseSensitive (the default), the comparison is case sensitive;
- otherwise the comparison is case-insensitive.
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {comparison}
\sa operator==(), operator<(), operator>()
*/
/*!
- \fn QStringView::operator==(QStringView lhs, QStringView rhs)
- \fn QStringView::operator!=(QStringView lhs, QStringView rhs)
- \fn QStringView::operator< (QStringView lhs, QStringView rhs)
- \fn QStringView::operator<=(QStringView lhs, QStringView rhs)
- \fn QStringView::operator> (QStringView lhs, QStringView rhs)
- \fn QStringView::operator>=(QStringView lhs, QStringView rhs)
+ \fn QStringView::operator==(const QStringView &lhs, const QStringView &rhs)
+ \fn QStringView::operator!=(const QStringView &lhs, const QStringView &rhs)
+ \fn QStringView::operator< (const QStringView &lhs, const QStringView &rhs)
+ \fn QStringView::operator<=(const QStringView &lhs, const QStringView &rhs)
+ \fn QStringView::operator> (const QStringView &lhs, const QStringView &rhs)
+ \fn QStringView::operator>=(const QStringView &lhs, const QStringView &rhs)
Operators for comparing \a lhs to \a rhs.
@@ -807,85 +779,106 @@ QT_BEGIN_NAMESPACE
*/
/*!
+ \fn int QStringView::localeAwareCompare(QStringView other) const
+ \since 6.4
+
+ Compares this string view with the \a other string view and returns
+ an integer less than, equal to, or greater than zero if this string
+ view is less than, equal to, or greater than the \a other string view.
+
+ The comparison is performed in a locale- and also platform-dependent
+ manner. Use this function to present sorted lists of strings to the
+ user.
+
+ \sa {Comparing Strings}
+*/
+
+/*
+//! [utf16-or-latin1-or-ch]
+the UTF-16 string viewed by \a str, the Latin-1 string viewed by \a l1,
+or the character \a ch
+//! [utf16-or-latin1-or-ch]
+*/
+
+/*!
\fn bool QStringView::startsWith(QStringView str, Qt::CaseSensitivity cs) const
- \fn bool QStringView::startsWith(QLatin1String l1, Qt::CaseSensitivity cs) const
+ \fn bool QStringView::startsWith(QLatin1StringView l1, Qt::CaseSensitivity cs) const
\fn bool QStringView::startsWith(QChar ch) const
\fn bool QStringView::startsWith(QChar ch, Qt::CaseSensitivity cs) const
- Returns \c true if this string view starts with string view \a str,
- Latin-1 string \a l1, or character \a ch, respectively;
- otherwise returns \c false.
+ Returns \c true if this string view starts with
+ \include qstringview.cpp utf16-or-latin1-or-ch
+ respectively; otherwise returns \c false.
- If \a cs is Qt::CaseSensitive (the default), the search is case-sensitive;
- otherwise the search is case-insensitive.
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
\sa endsWith()
*/
/*!
\fn bool QStringView::endsWith(QStringView str, Qt::CaseSensitivity cs) const
- \fn bool QStringView::endsWith(QLatin1String l1, Qt::CaseSensitivity cs) const
+ \fn bool QStringView::endsWith(QLatin1StringView l1, Qt::CaseSensitivity cs) const
\fn bool QStringView::endsWith(QChar ch) const
\fn bool QStringView::endsWith(QChar ch, Qt::CaseSensitivity cs) const
- Returns \c true if this string view ends with string view \a str,
- Latin-1 string \a l1, or character \a ch, respectively;
- otherwise returns \c false.
+ Returns \c true if this string view ends with
+ \include qstringview.cpp utf16-or-latin1-or-ch
+ respectively; otherwise returns \c false.
- If \a cs is Qt::CaseSensitive (the default), the search is case-sensitive;
- otherwise the search is case-insensitive.
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
\sa startsWith()
*/
/*!
\fn qsizetype QStringView::indexOf(QStringView str, qsizetype from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
- \fn qsizetype QStringView::indexOf(QLatin1String l1, qsizetype from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
+ \fn qsizetype QStringView::indexOf(QLatin1StringView l1, qsizetype from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
\fn qsizetype QStringView::indexOf(QChar c, qsizetype from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
\since 5.14
- Returns the index position of the first occurrence of the string view \a str,
- Latin-1 string \a l1, or character \a ch, respectively, in this string view,
- searching forward from index position \a from. Returns -1 if \a str is not found.
+ Returns the index position of the first occurrence of
+ \include qstringview.cpp utf16-or-latin1-or-ch
+ respectively, in this string view, searching forward from index position
+ \a from. Returns -1 if \a str, \a l1 or \a ch is not found, respectively.
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
- If \a from is -1, the search starts at the last character; if it is
- -2, at the next to last character and so on.
+ \include qstring.qdocinc negative-index-start-search-from-end
\sa QString::indexOf()
*/
/*!
\fn bool QStringView::contains(QStringView str, Qt::CaseSensitivity cs) const
- \fn bool QStringView::contains(QLatin1String l1, Qt::CaseSensitivity cs) const
+ \fn bool QStringView::contains(QLatin1StringView l1, Qt::CaseSensitivity cs) const
\fn bool QStringView::contains(QChar c, Qt::CaseSensitivity cs) const
\since 5.14
- Returns \c true if this string view contains an occurrence of the string view
- \a str, Latin-1 string \a l1, or character \a ch; otherwise returns \c false.
+ Returns \c true if this string view contains an occurrence of
+ \include qstringview.cpp utf16-or-latin1-or-ch
+ respectively; otherwise returns \c false.
- If \a cs is Qt::CaseSensitive (the default), the search is
- case-sensitive; otherwise the search is case-insensitive.
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
\sa indexOf()
*/
/*!
\fn qsizetype QStringView::lastIndexOf(QStringView str, qsizetype from, Qt::CaseSensitivity cs) const
- \fn qsizetype QStringView::lastIndexOf(QLatin1String l1, qsizetype from, Qt::CaseSensitivity cs) const
+ \fn qsizetype QStringView::lastIndexOf(QLatin1StringView l1, qsizetype from, Qt::CaseSensitivity cs) const
\fn qsizetype QStringView::lastIndexOf(QChar c, qsizetype from, Qt::CaseSensitivity cs) const
\since 5.14
- Returns the index position of the last occurrence of the string view \a str,
- Latin-1 string \a l1, or character \a ch, respectively, in this string view,
- searching backward from index position \a from. If \a from is -1,
- the search starts at the last character; if \a from is -2, at the next to last
- character and so on. Returns -1 if \a str is not found.
+ Returns the index position of the last occurrence of
+ \include qstringview.cpp utf16-or-latin1-or-ch
+ respectively, in this string view, searching backward from index
+ position \a from.
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
+ \include qstring.qdocinc negative-index-start-search-from-end
+
+ Returns -1 if \a str, \a l1 or \a c is not found, respectively.
+
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
\note When searching for a 0-length \a str or \a l1, the match at
the end of the data is excluded from the search by a negative \a
@@ -900,17 +893,16 @@ QT_BEGIN_NAMESPACE
/*!
\fn qsizetype QStringView::lastIndexOf(QStringView str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
- \fn qsizetype QStringView::lastIndexOf(QLatin1String l1, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
+ \fn qsizetype QStringView::lastIndexOf(QLatin1StringView l1, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
\since 6.2
\overload lastIndexOf()
- Returns the index position of the last occurrence of the string view \a str
- or Latin-1 string \a l1, respectively, in this string view,
- searching backward from the last character of this string view.
- Returns -1 if \a str is not found.
+ Returns the index position of the last occurrence of the UTF-16 string viewed
+ by \a str or the Latin-1 string viewed by \a l1 respectively, in this string
+ view searching backward from the last character of this string view. Returns
+ -1 if \a str or \a l1 is not found, respectively.
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
\sa QString::lastIndexOf()
*/
@@ -945,9 +937,11 @@ QT_BEGIN_NAMESPACE
Returns the index position of the last match of the regular
expression \a re in the string view, which starts before the index
- position \a from. If \a from is -1, the search starts at the last
- character; if \a from is -2, at the next to last character and so
- on. Returns -1 if \a re didn't match anywhere.
+ position \a from.
+
+ \include qstring.qdocinc negative-index-start-search-from-end
+
+ Returns -1 if \a re didn't match anywhere.
If the match is successful and \a rmatch is not \nullptr, it also
writes the results of the match into the QRegularExpressionMatch object
@@ -1103,6 +1097,32 @@ QT_BEGIN_NAMESPACE
*/
/*!
+ \fn bool QStringView::isLower() const
+ \since 6.7
+ Returns \c true if this view is identical to its lowercase folding.
+
+ Note that this does \e not mean that the string view does not contain
+ uppercase letters (some uppercase letters do not have a lowercase
+ folding; they are left unchanged by toString().toLower()).
+ For more information, refer to the Unicode standard, section 3.13.
+
+ \sa QChar::toLower(), isUpper()
+*/
+
+/*!
+ \fn bool QStringView::isUpper() const
+ \since 6.7
+ Returns \c true if this view is identical to its uppercase folding.
+
+ Note that this does \e not mean that the the string view does not contain
+ lowercase letters (some lowercase letters do not have a uppercase
+ folding; they are left unchanged by toString().toUpper()).
+ For more information, refer to the Unicode standard, section 3.13.
+
+ \sa QChar::toUpper(), isLower()
+*/
+
+/*!
\fn QStringView::toWCharArray(wchar_t *array) const
\since 5.14
@@ -1131,8 +1151,7 @@ QT_BEGIN_NAMESPACE
Returns the number of occurrences of the character \a ch in the
string view.
- If \a cs is Qt::CaseSensitive (default), the search is
- case sensitive; otherwise the search is case insensitive.
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
\sa QString::count(), contains(), indexOf()
*/
@@ -1146,8 +1165,21 @@ QT_BEGIN_NAMESPACE
Returns the number of (potentially overlapping) occurrences of the
string view \a str in this string view.
- If \a cs is Qt::CaseSensitive (default), the search is
- case sensitive; otherwise the search is case insensitive.
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
+
+ \sa QString::count(), contains(), indexOf()
+*/
+
+/*!
+ \fn qsizetype QStringView::count(QLatin1StringView l1, Qt::CaseSensitivity cs) const noexcept
+
+ \since 6.4
+ \overload count()
+
+ Returns the number of (potentially overlapping) occurrences of the
+ Latin-1 string viewed by \a l1 in this string view.
+
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
\sa QString::count(), contains(), indexOf()
*/
@@ -1373,7 +1405,7 @@ QT_BEGIN_NAMESPACE
/*!
\fn template <typename Needle, typename...Flags> auto QStringView::tokenize(Needle &&sep, Flags...flags) const
- \fn template <typename Needle, typename...Flags> auto QLatin1String::tokenize(Needle &&sep, Flags...flags) const
+ \fn template <typename Needle, typename...Flags> auto QLatin1StringView::tokenize(Needle &&sep, Flags...flags) const
\fn template <typename Needle, typename...Flags> auto QString::tokenize(Needle &&sep, Flags...flags) const &
\fn template <typename Needle, typename...Flags> auto QString::tokenize(Needle &&sep, Flags...flags) const &&
\fn template <typename Needle, typename...Flags> auto QString::tokenize(Needle &&sep, Flags...flags) &&
@@ -1412,4 +1444,13 @@ QT_BEGIN_NAMESPACE
\sa QStringTokenizer, qTokenize()
*/
+/*!
+ \fn QStringView::operator std::u16string_view() const
+ \since 6.7
+
+ Converts this QStringView object to a \c{std::u16string_view} object.
+ The returned view will have the same data pointer and length of
+ this view.
+*/
+
QT_END_NAMESPACE
diff --git a/src/corelib/text/qstringview.h b/src/corelib/text/qstringview.h
index 5d05dd6edd..ab97d834d3 100644
--- a/src/corelib/text/qstringview.h
+++ b/src/corelib/text/qstringview.h
@@ -1,65 +1,18 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>
-** Copyright (C) 2019 Mail.ru Group.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>
+// Copyright (C) 2019 Mail.ru Group.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QSTRINGVIEW_H
#define QSTRINGVIEW_H
-/*
- This macro enables three "levels" of QStringView support:
-
- 1. offer QStringView, overload some functions taking QString with
- QStringView
-
- 2. Obsolete: QStringRef and its overloads have been removed.
-
- 3. like 2, but replace functions taking QString, too.
-*/
-#ifndef QT_STRINGVIEW_LEVEL
-# define QT_STRINGVIEW_LEVEL 1
-#endif
-
#include <QtCore/qchar.h>
+#include <QtCore/qcompare.h>
#include <QtCore/qbytearray.h>
#include <QtCore/qstringliteral.h>
#include <QtCore/qstringalgorithms.h>
#include <string>
+#include <string_view>
+#include <QtCore/q20type_traits.h>
#if defined(Q_OS_DARWIN) || defined(Q_QDOC)
Q_FORWARD_DECLARE_CF_TYPE(CFString);
@@ -72,6 +25,9 @@ class QString;
class QStringView;
class QRegularExpression;
class QRegularExpressionMatch;
+#ifdef Q_QDOC
+class QUtf8StringView;
+#endif
namespace QtPrivate {
template <typename Char>
@@ -83,7 +39,7 @@ struct IsCompatibleCharTypeHelper
(std::is_same<Char, wchar_t>::value && sizeof(wchar_t) == sizeof(QChar))> {};
template <typename Char>
struct IsCompatibleCharType
- : IsCompatibleCharTypeHelper<typename std::remove_cv<typename std::remove_reference<Char>::type>::type> {};
+ : IsCompatibleCharTypeHelper<q20::remove_cvref_t<Char>> {};
template <typename Pointer>
struct IsCompatiblePointerHelper : std::false_type {};
@@ -92,7 +48,7 @@ struct IsCompatiblePointerHelper<Char*>
: IsCompatibleCharType<Char> {};
template <typename Pointer>
struct IsCompatiblePointer
- : IsCompatiblePointerHelper<typename std::remove_cv<typename std::remove_reference<Pointer>::type>::type> {};
+ : IsCompatiblePointerHelper<q20::remove_cvref_t<Pointer>> {};
template <typename T, typename Enable = void>
struct IsContainerCompatibleWithQStringView : std::false_type {};
@@ -149,15 +105,10 @@ private:
using if_compatible_container = typename std::enable_if<QtPrivate::IsContainerCompatibleWithQStringView<T>::value, bool>::type;
template <typename Char>
- static qsizetype lengthHelperPointer(const Char *str) noexcept
+ static constexpr qsizetype lengthHelperPointer(const Char *str) noexcept
{
-#if defined(__cpp_lib_is_constant_evaluated)
- if (std::is_constant_evaluated())
- return std::char_traits<Char>::length(str);
-#elif defined(Q_CC_GNU) && !defined(Q_CC_CLANG) && !defined(Q_CC_INTEL)
- if (__builtin_constant_p(*str))
+ if (q20::is_constant_evaluated())
return std::char_traits<Char>::length(str);
-#endif
return QtPrivate::qustrlen(reinterpret_cast<const char16_t *>(str));
}
static qsizetype lengthHelperPointer(const QChar *str) noexcept
@@ -165,20 +116,6 @@ private:
return QtPrivate::qustrlen(reinterpret_cast<const char16_t *>(str));
}
- template <typename Container>
- static constexpr qsizetype lengthHelperContainer(const Container &c) noexcept
- {
- return qsizetype(std::size(c));
- }
-
- template <typename Char, size_t N>
- static constexpr qsizetype lengthHelperContainer(const Char (&str)[N]) noexcept
- {
- const auto it = std::char_traits<Char>::find(str, N, Char(0));
- const auto end = it ? it : std::end(str);
- return qsizetype(std::distance(str, end));
- }
-
template <typename Char>
static const storage_type *castHelper(const Char *str) noexcept
{ return reinterpret_cast<const storage_type*>(str); }
@@ -186,21 +123,26 @@ private:
{ return str; }
public:
- constexpr QStringView() noexcept
- : m_size(0), m_data(nullptr) {}
+ constexpr QStringView() noexcept {}
constexpr QStringView(std::nullptr_t) noexcept
: QStringView() {}
template <typename Char, if_compatible_char<Char> = true>
constexpr QStringView(const Char *str, qsizetype len)
+#if QT_VERSION >= QT_VERSION_CHECK(7, 0, 0) || defined(QT_BOOTSTRAPPED)
+ : m_data(castHelper(str)),
+ m_size((Q_ASSERT(len >= 0), Q_ASSERT(str || !len), len))
+#else
: m_size((Q_ASSERT(len >= 0), Q_ASSERT(str || !len), len)),
- m_data(castHelper(str)) {}
+ m_data(castHelper(str))
+#endif
+ {}
template <typename Char, if_compatible_char<Char> = true>
constexpr QStringView(const Char *f, const Char *l)
: QStringView(f, l - f) {}
-#ifdef Q_CLANG_QDOC
+#ifdef Q_QDOC
template <typename Char, size_t N>
constexpr QStringView(const Char (&array)[N]) noexcept;
@@ -213,7 +155,7 @@ public:
: QStringView(str, str ? lengthHelperPointer(str) : 0) {}
#endif
-#ifdef Q_CLANG_QDOC
+#ifdef Q_QDOC
QStringView(const QString &str) noexcept;
#else
template <typename String, if_compatible_qstring_like<String> = true>
@@ -222,8 +164,8 @@ public:
#endif
template <typename Container, if_compatible_container<Container> = true>
- constexpr QStringView(const Container &c) noexcept
- : QStringView(std::data(c), lengthHelperContainer(c)) {}
+ constexpr Q_ALWAYS_INLINE QStringView(const Container &c) noexcept
+ : QStringView(std::data(c), QtPrivate::lengthHelperContainer(c)) {}
template <typename Char, size_t Size, if_compatible_char<Char> = true>
[[nodiscard]] constexpr static QStringView fromArray(const Char (&string)[Size]) noexcept
@@ -242,7 +184,7 @@ public:
[[nodiscard]] constexpr const storage_type *utf16() const noexcept { return m_data; }
[[nodiscard]] constexpr QChar operator[](qsizetype n) const
- { return Q_ASSERT(n >= 0), Q_ASSERT(n < size()), QChar(m_data[n]); }
+ { verify(n, 1); return QChar(m_data[n]); }
//
// QString API
@@ -278,20 +220,20 @@ public:
}
[[nodiscard]] constexpr QStringView first(qsizetype n) const noexcept
- { Q_ASSERT(n >= 0); Q_ASSERT(n <= size()); return QStringView(m_data, n); }
+ { verify(0, n); return sliced(0, n); }
[[nodiscard]] constexpr QStringView last(qsizetype n) const noexcept
- { Q_ASSERT(n >= 0); Q_ASSERT(n <= size()); return QStringView(m_data + size() - n, n); }
+ { verify(0, n); return sliced(size() - n, n); }
[[nodiscard]] constexpr QStringView sliced(qsizetype pos) const noexcept
- { Q_ASSERT(pos >= 0); Q_ASSERT(pos <= size()); return QStringView(m_data + pos, size() - pos); }
+ { verify(pos, 0); return QStringView(m_data + pos, size() - pos); }
[[nodiscard]] constexpr QStringView sliced(qsizetype pos, qsizetype n) const noexcept
- { Q_ASSERT(pos >= 0); Q_ASSERT(n >= 0); Q_ASSERT(size_t(pos) + size_t(n) <= size_t(size())); return QStringView(m_data + pos, n); }
+ { verify(pos, n); return QStringView(m_data + pos, n); }
[[nodiscard]] constexpr QStringView chopped(qsizetype n) const noexcept
- { return Q_ASSERT(n >= 0), Q_ASSERT(n <= size()), QStringView(m_data, m_size - n); }
+ { verify(0, n); return sliced(0, m_size - n); }
constexpr void truncate(qsizetype n) noexcept
- { Q_ASSERT(n >= 0); Q_ASSERT(n <= size()); m_size = n; }
+ { verify(0, n); ; m_size = n; }
constexpr void chop(qsizetype n) noexcept
- { Q_ASSERT(n >= 0); Q_ASSERT(n <= size()); m_size -= n; }
+ { verify(0, n); m_size -= n; }
[[nodiscard]] QStringView trimmed() const noexcept { return QtPrivate::trimmed(*this); }
@@ -303,15 +245,18 @@ public:
[[nodiscard]] int compare(QStringView other, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
{ return QtPrivate::compareStrings(*this, other, cs); }
- [[nodiscard]] inline int compare(QLatin1String other, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept;
+ [[nodiscard]] inline int compare(QLatin1StringView other, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept;
+ [[nodiscard]] inline int compare(QUtf8StringView other, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept;
[[nodiscard]] constexpr int compare(QChar c) const noexcept
{ return size() >= 1 ? compare_single_char_helper(*utf16() - c.unicode()) : -1; }
[[nodiscard]] int compare(QChar c, Qt::CaseSensitivity cs) const noexcept
{ return QtPrivate::compareStrings(*this, QStringView(&c, 1), cs); }
+ [[nodiscard]] inline int localeAwareCompare(QStringView other) const;
+
[[nodiscard]] bool startsWith(QStringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
{ return QtPrivate::startsWith(*this, s, cs); }
- [[nodiscard]] inline bool startsWith(QLatin1String s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept;
+ [[nodiscard]] inline bool startsWith(QLatin1StringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept;
[[nodiscard]] bool startsWith(QChar c) const noexcept
{ return !empty() && front() == c; }
[[nodiscard]] bool startsWith(QChar c, Qt::CaseSensitivity cs) const noexcept
@@ -319,39 +264,40 @@ public:
[[nodiscard]] bool endsWith(QStringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
{ return QtPrivate::endsWith(*this, s, cs); }
- [[nodiscard]] inline bool endsWith(QLatin1String s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept;
+ [[nodiscard]] inline bool endsWith(QLatin1StringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept;
[[nodiscard]] bool endsWith(QChar c) const noexcept
{ return !empty() && back() == c; }
[[nodiscard]] bool endsWith(QChar c, Qt::CaseSensitivity cs) const noexcept
{ return QtPrivate::endsWith(*this, QStringView(&c, 1), cs); }
[[nodiscard]] qsizetype indexOf(QChar c, qsizetype from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
- { return QtPrivate::findString(*this, from, QStringView(&c, 1), cs); }
+ { return QtPrivate::findString(*this, from, c.unicode(), cs); }
[[nodiscard]] qsizetype indexOf(QStringView s, qsizetype from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
{ return QtPrivate::findString(*this, from, s, cs); }
- [[nodiscard]] inline qsizetype indexOf(QLatin1String s, qsizetype from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept;
+ [[nodiscard]] inline qsizetype indexOf(QLatin1StringView s, qsizetype from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept;
[[nodiscard]] bool contains(QChar c, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
{ return indexOf(QStringView(&c, 1), 0, cs) != qsizetype(-1); }
[[nodiscard]] bool contains(QStringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
{ return indexOf(s, 0, cs) != qsizetype(-1); }
- [[nodiscard]] inline bool contains(QLatin1String s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept;
+ [[nodiscard]] inline bool contains(QLatin1StringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept;
[[nodiscard]] qsizetype count(QChar c, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
{ return QtPrivate::count(*this, c, cs); }
[[nodiscard]] qsizetype count(QStringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
{ return QtPrivate::count(*this, s, cs); }
+ [[nodiscard]] inline qsizetype count(QLatin1StringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
[[nodiscard]] qsizetype lastIndexOf(QChar c, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
{ return lastIndexOf(c, -1, cs); }
[[nodiscard]] qsizetype lastIndexOf(QChar c, qsizetype from, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
- { return QtPrivate::lastIndexOf(*this, from, QStringView(&c, 1), cs); }
+ { return QtPrivate::lastIndexOf(*this, from, c.unicode(), cs); }
[[nodiscard]] qsizetype lastIndexOf(QStringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
{ return lastIndexOf(s, size(), cs); }
[[nodiscard]] qsizetype lastIndexOf(QStringView s, qsizetype from, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
{ return QtPrivate::lastIndexOf(*this, from, s, cs); }
- [[nodiscard]] inline qsizetype lastIndexOf(QLatin1String s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept;
- [[nodiscard]] inline qsizetype lastIndexOf(QLatin1String s, qsizetype from, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept;
+ [[nodiscard]] inline qsizetype lastIndexOf(QLatin1StringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept;
+ [[nodiscard]] inline qsizetype lastIndexOf(QLatin1StringView s, qsizetype from, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept;
#if QT_CONFIG(regularexpression)
[[nodiscard]] qsizetype indexOf(const QRegularExpression &re, qsizetype from = 0, QRegularExpressionMatch *rmatch = nullptr) const
@@ -387,6 +333,11 @@ public:
[[nodiscard]] bool isValidUtf16() const noexcept
{ return QtPrivate::isValidUtf16(*this); }
+ [[nodiscard]] bool isUpper() const noexcept
+ { return QtPrivate::isUpper(*this); }
+ [[nodiscard]] bool isLower() const noexcept
+ { return QtPrivate::isLower(*this); }
+
[[nodiscard]] inline short toShort(bool *ok = nullptr, int base = 10) const;
[[nodiscard]] inline ushort toUShort(bool *ok = nullptr, int base = 10) const;
[[nodiscard]] inline int toInt(bool *ok = nullptr, int base = 10) const;
@@ -416,27 +367,22 @@ public:
#endif
// QStringView <> QStringView
- friend bool operator==(QStringView lhs, QStringView rhs) noexcept { return lhs.size() == rhs.size() && QtPrivate::equalStrings(lhs, rhs); }
- friend bool operator!=(QStringView lhs, QStringView rhs) noexcept { return !(lhs == rhs); }
- friend bool operator< (QStringView lhs, QStringView rhs) noexcept { return QtPrivate::compareStrings(lhs, rhs) < 0; }
- friend bool operator<=(QStringView lhs, QStringView rhs) noexcept { return QtPrivate::compareStrings(lhs, rhs) <= 0; }
- friend bool operator> (QStringView lhs, QStringView rhs) noexcept { return QtPrivate::compareStrings(lhs, rhs) > 0; }
- friend bool operator>=(QStringView lhs, QStringView rhs) noexcept { return QtPrivate::compareStrings(lhs, rhs) >= 0; }
+ friend bool comparesEqual(const QStringView &lhs, const QStringView &rhs) noexcept
+ { return lhs.size() == rhs.size() && QtPrivate::equalStrings(lhs, rhs); }
+ friend Qt::strong_ordering
+ compareThreeWay(const QStringView &lhs, const QStringView &rhs) noexcept
+ {
+ const int res = QtPrivate::compareStrings(lhs, rhs);
+ return Qt::compareThreeWay(res, 0);
+ }
+ Q_DECLARE_STRONGLY_ORDERED(QStringView)
// QStringView <> QChar
- friend bool operator==(QStringView lhs, QChar rhs) noexcept { return lhs == QStringView(&rhs, 1); }
- friend bool operator!=(QStringView lhs, QChar rhs) noexcept { return lhs != QStringView(&rhs, 1); }
- friend bool operator< (QStringView lhs, QChar rhs) noexcept { return lhs < QStringView(&rhs, 1); }
- friend bool operator<=(QStringView lhs, QChar rhs) noexcept { return lhs <= QStringView(&rhs, 1); }
- friend bool operator> (QStringView lhs, QChar rhs) noexcept { return lhs > QStringView(&rhs, 1); }
- friend bool operator>=(QStringView lhs, QChar rhs) noexcept { return lhs >= QStringView(&rhs, 1); }
-
- friend bool operator==(QChar lhs, QStringView rhs) noexcept { return QStringView(&lhs, 1) == rhs; }
- friend bool operator!=(QChar lhs, QStringView rhs) noexcept { return QStringView(&lhs, 1) != rhs; }
- friend bool operator< (QChar lhs, QStringView rhs) noexcept { return QStringView(&lhs, 1) < rhs; }
- friend bool operator<=(QChar lhs, QStringView rhs) noexcept { return QStringView(&lhs, 1) <= rhs; }
- friend bool operator> (QChar lhs, QStringView rhs) noexcept { return QStringView(&lhs, 1) > rhs; }
- friend bool operator>=(QChar lhs, QStringView rhs) noexcept { return QStringView(&lhs, 1) >= rhs; }
+ friend bool comparesEqual(const QStringView &lhs, QChar rhs) noexcept
+ { return lhs.size() == 1 && lhs[0] == rhs; }
+ friend Qt::strong_ordering compareThreeWay(const QStringView &lhs, QChar rhs) noexcept
+ { return compareThreeWay(lhs, QStringView(&rhs, 1)); }
+ Q_DECLARE_STRONGLY_ORDERED(QStringView, QChar)
//
// STL compatibility API:
@@ -454,6 +400,9 @@ public:
[[nodiscard]] constexpr QChar front() const { return Q_ASSERT(!empty()), QChar(m_data[0]); }
[[nodiscard]] constexpr QChar back() const { return Q_ASSERT(!empty()), QChar(m_data[m_size - 1]); }
+ [[nodiscard]] Q_IMPLICIT operator std::u16string_view() const noexcept
+ { return std::u16string_view(m_data, size_t(m_size)); }
+
//
// Qt compatibility API:
//
@@ -466,11 +415,42 @@ public:
[[nodiscard]] constexpr QChar first() const { return front(); }
[[nodiscard]] constexpr QChar last() const { return back(); }
private:
- qsizetype m_size;
- const storage_type *m_data;
+#if QT_VERSION >= QT_VERSION_CHECK(7, 0, 0) || defined(QT_BOOTSTRAPPED)
+ const storage_type *m_data = nullptr;
+ qsizetype m_size = 0;
+#else
+ qsizetype m_size = 0;
+ const storage_type *m_data = nullptr;
+#endif
+
+ Q_ALWAYS_INLINE constexpr void verify([[maybe_unused]] qsizetype pos = 0,
+ [[maybe_unused]] qsizetype n = 1) const
+ {
+ Q_ASSERT(pos >= 0);
+ Q_ASSERT(pos <= size());
+ Q_ASSERT(n >= 0);
+ Q_ASSERT(n <= size() - pos);
+ }
constexpr int compare_single_char_helper(int diff) const noexcept
{ return diff ? diff : size() > 1 ? 1 : 0; }
+
+ Q_CORE_EXPORT static bool equal_helper(QStringView sv, const char *data, qsizetype len);
+ Q_CORE_EXPORT static int compare_helper(QStringView sv, const char *data, qsizetype len);
+
+#if !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII)
+ friend bool comparesEqual(const QStringView &lhs, const QByteArrayView &rhs) noexcept
+ { return equal_helper(lhs, rhs.data(), rhs.size()); }
+ friend Qt::strong_ordering
+ compareThreeWay(const QStringView &lhs, const QByteArrayView &rhs) noexcept
+ {
+ const int res = compare_helper(lhs, rhs.data(), rhs.size());
+ return Qt::compareThreeWay(res, 0);
+ }
+ Q_DECLARE_STRONGLY_ORDERED(QStringView, QByteArrayView, QT_ASCII_CAST_WARN)
+ Q_DECLARE_STRONGLY_ORDERED(QStringView, QByteArray, QT_ASCII_CAST_WARN)
+ Q_DECLARE_STRONGLY_ORDERED(QStringView, const char *, QT_ASCII_CAST_WARN)
+#endif // !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII)
};
Q_DECLARE_TYPEINFO(QStringView, Q_PRIMITIVE_TYPE);
@@ -478,7 +458,7 @@ template <typename QStringLike, typename std::enable_if<
std::is_same<QStringLike, QString>::value,
bool>::type = true>
inline QStringView qToStringViewIgnoringNull(const QStringLike &s) noexcept
-{ return QStringView(s.data(), s.size()); }
+{ return QStringView(s.begin(), s.size()); }
// QChar inline functions:
@@ -496,6 +476,27 @@ inline QStringView qToStringViewIgnoringNull(const QStringLike &s) noexcept
R{{char16_t(c), u'\0'}} ;
}
+qsizetype QtPrivate::findString(QStringView str, qsizetype from, QChar ch, Qt::CaseSensitivity cs) noexcept
+{
+ if (from < -str.size()) // from < 0 && abs(from) > str.size(), avoiding overflow
+ return -1;
+ if (from < 0)
+ from = qMax(from + str.size(), qsizetype(0));
+ if (from < str.size()) {
+ const char16_t *s = str.utf16();
+ char16_t c = ch.unicode();
+ const char16_t *n = s + from;
+ const char16_t *e = s + str.size();
+ if (cs == Qt::CaseSensitive)
+ n = qustrchr(QStringView(n, e), c);
+ else
+ n = qustrcasechr(QStringView(n, e), c);
+ if (n != e)
+ return n - s;
+ }
+ return -1;
+}
+
QT_END_NAMESPACE
#endif /* QSTRINGVIEW_H */
diff --git a/src/corelib/text/qt_attribution.json b/src/corelib/text/qt_attribution.json
index 7e36e624cb..6235ec5c16 100644
--- a/src/corelib/text/qt_attribution.json
+++ b/src/corelib/text/qt_attribution.json
@@ -4,37 +4,41 @@
"Name": "Unicode Character Database (UCD)",
"QDocModule": "qtcore",
"QtUsage": "Qt Core uses data obtained from UCD files for working with characters and strings.",
- "Files": "For update, see qtbase/util/unicode/README",
- "Files": "qunicodetables_p.h qunicodetables.cpp",
+ "Comment": { "Files": "For update, see qtbase/util/unicode/README" },
+ "Files": [ "qunicodetables_p.h", "qunicodetables.cpp" ],
"Description": "The Unicode Character Database (UCD) is a set of files that
define the Unicode character properties and internal mappings.",
"Homepage": "https://www.unicode.org/ucd/",
- "Version": "Don't use the Unicode standard version;
- UCD has its own 'Revision' numbers, see the 'UAX #44, UCD' page (https://www.unicode.org/reports/tr44/)",
- "Version": "28",
+ "Comment": {
+ "Version": [ "Don't use the Unicode standard version;",
+ "UCD has its own 'Revision' numbers",
+ "see the 'UAX #44, UCD' page (https://www.unicode.org/reports/tr44/)" ],
+ "License": [ "Will change to Unicode-3.0 on next update",
+ "util/unicode/main.cpp is updated to do that already",
+ "Please update the following and delete this note when that happens" ] },
+ "Version": "30",
"License": "Unicode License Agreement - Data Files and Software (2016)",
"LicenseId": "Unicode-DFS-2016",
- "LicenseFile": "UNICODE_LICENSE.txt",
- "Copyright": "Copyright (C) 1991-2021 Unicode, Inc."
+ "Copyright": "Copyright (C) 1991-2022 Unicode, Inc."
},
{
"Id": "unicode-cldr",
"Name": "Unicode Common Locale Data Repository (CLDR)",
"QDocModule": "qtcore",
"QtUsage": "Used in Qt Core (QTimeZone, QLocale).",
- "Files": "For update, see qtbase/util/locale_database/cldr2qlocalexml.py",
- "Files": "qlocale_data_p.h qtimezoneprivate_data_p.h",
+ "Comment": { "Files": "For update, see qtbase/util/locale_database/cldr2qlocalexml.py" },
+ "Files": [ "qlocale_data_p.h",
+ "../time/qtimezoneprivate_data_p.h", "../time/qhijricalendar_data_p.h",
+ "../time/qjalalicalendar_data_p.h", "../time/qromancalendar_data_p.h" ],
"Description": "The Unicode CLDR provides key building blocks for software to support the
world's languages, with the largest and most extensive standard repository of locale data
available.",
"Homepage": "https://cldr.unicode.org/",
- "Version": "v40",
- "License": "// as specified in https://spdx.org/licenses/Unicode-DFS-2016.html",
- "License": "Unicode License Agreement - Data Files and Software (2016)",
- "LicenseId": "Unicode-DFS-2016",
- "LicenseFile": "UNICODE_LICENSE.txt",
- "Copyright": "Copyright (C) 1991-2021 Unicode, Inc."
+ "Version": "v44.1",
+ "License": "Unicode License v3",
+ "LicenseId": "Unicode-3.0",
+ "Copyright": "Copyright (C) 2004-2023 Unicode, Inc."
}
]
diff --git a/src/corelib/text/qtextboundaryfinder.cpp b/src/corelib/text/qtextboundaryfinder.cpp
index 0ac2cec3ff..21d4c5153e 100644
--- a/src/corelib/text/qtextboundaryfinder.cpp
+++ b/src/corelib/text/qtextboundaryfinder.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include <QtCore/qtextboundaryfinder.h>
#include <QtCore/qvarlengtharray.h>
@@ -56,7 +20,7 @@ static void init(QTextBoundaryFinder::BoundaryType type, QStringView str, QCharA
case QTextBoundaryFinder::Line: options |= QUnicodeTools::LineBreaks; break;
default: break;
}
- QUnicodeTools::initCharAttributes(str, scriptItems.data(), scriptItems.count(), attributes, options);
+ QUnicodeTools::initCharAttributes(str, scriptItems.data(), scriptItems.size(), attributes, options);
}
/*!
@@ -123,11 +87,11 @@ static void init(QTextBoundaryFinder::BoundaryType type, QStringView str, QCharA
Such a break opportunity might also be an item boundary
(either StartOfItem, EndOfItem, or combination of both),
a mandatory line break, or a soft hyphen.
- \value StartOfItem Since 5.0. The boundary finder is at the start of
+ \value [since 5.0] StartOfItem The boundary finder is at the start of
a grapheme, a word, a sentence, or a line.
- \value EndOfItem Since 5.0. The boundary finder is at the end of
+ \value [since 5.0] EndOfItem The boundary finder is at the end of
a grapheme, a word, a sentence, or a line.
- \value MandatoryBreak Since 5.0. The boundary finder is at the end of line
+ \value [since 5.0] MandatoryBreak The boundary finder is at the end of line
(can occur for a Line boundary type only).
\value SoftHyphen The boundary finder is at the soft hyphen
(can occur for a Line boundary type only).
@@ -209,9 +173,7 @@ QTextBoundaryFinder::QTextBoundaryFinder(BoundaryType type, const QString &strin
: t(type)
, s(string)
, sv(s)
- , pos(0)
, freeBuffer(true)
- , attributes(nullptr)
{
if (sv.size() > 0) {
attributes = (QCharAttributes *) malloc((sv.size() + 1) * sizeof(QCharAttributes));
@@ -244,12 +206,10 @@ QTextBoundaryFinder::QTextBoundaryFinder(BoundaryType type, const QString &strin
QTextBoundaryFinder::QTextBoundaryFinder(BoundaryType type, QStringView string, unsigned char *buffer, qsizetype bufferSize)
: t(type)
, sv(string)
- , pos(0)
, freeBuffer(true)
- , attributes(nullptr)
{
if (!sv.isEmpty()) {
- if (buffer && (uint)bufferSize >= (sv.size() + 1) * sizeof(QCharAttributes)) {
+ if (buffer && bufferSize / int(sizeof(QCharAttributes)) >= sv.size() + 1) {
attributes = reinterpret_cast<QCharAttributes *>(buffer);
freeBuffer = false;
} else {
diff --git a/src/corelib/text/qtextboundaryfinder.h b/src/corelib/text/qtextboundaryfinder.h
index 0b1c910728..04e64fd69b 100644
--- a/src/corelib/text/qtextboundaryfinder.h
+++ b/src/corelib/text/qtextboundaryfinder.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QTEXTBOUNDARYFINDER_H
#define QTEXTBOUNDARYFINDER_H
@@ -99,7 +63,7 @@ private:
BoundaryType t = Grapheme;
QString s;
QStringView sv;
- qsizetype pos;
+ qsizetype pos = 0;
uint freeBuffer : 1;
uint unused : 31;
QCharAttributes *attributes = nullptr;
diff --git a/src/corelib/text/qtliterals.qdoc b/src/corelib/text/qtliterals.qdoc
index d5875c3e08..d108aeb615 100644
--- a/src/corelib/text/qtliterals.qdoc
+++ b/src/corelib/text/qtliterals.qdoc
@@ -1,29 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
\namespace QtLiterals
@@ -31,3 +7,38 @@
\brief The QtLiterals namespace declares literal operators for Qt types.
*/
+
+/*!
+ \namespace Qt::Literals
+ \inmodule QtCore
+ \inheaderfile QString
+
+ \brief The Literals inline namespace declares literal operators for Qt types.
+*/
+
+/*!
+ \namespace Qt::Literals::StringLiterals
+ \inmodule QtCore
+ \inheaderfile QString
+
+ \brief The StringLiterals namespace declares string literal operators
+ for Qt types.
+
+ The inline Qt::Literals::StringLiterals namespace declares string literal
+ operators for Qt types. Because both \c Literals and \c StringLiterals
+ namespaces are declared as inline, the symbols from this namespace can be
+ accessed by adding one of the following to your code:
+
+ \code
+ // Makes visible only the literal operators declared in StringLiterals
+ using namespace Qt::Literals::StringLiterals;
+
+ // Makes visible literal operators declared in all inline namespaces
+ // inside Literals
+ using namespace Qt::Literals;
+
+ // Makes visible all symbols (including all literal operators) declared
+ // in the Qt namespace
+ using namespace Qt;
+ \endcode
+*/
diff --git a/src/corelib/text/qunicodetables.cpp b/src/corelib/text/qunicodetables.cpp
index 34367cdb15..dc93b99668 100644
--- a/src/corelib/text/qunicodetables.cpp
+++ b/src/corelib/text/qunicodetables.cpp
@@ -1,43 +1,7 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/* This file is autogenerated from the Unicode 14.0 database. Do not edit */
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: Unicode-DFS-2016
+
+/* This file is autogenerated from the Unicode 15.1 database. Do not edit */
#include "qunicodetables_p.h"
@@ -45,7 +9,7 @@ QT_BEGIN_NAMESPACE
namespace QUnicodeTables {
-static const unsigned short uc_property_trie[] = {
+static constexpr unsigned short uc_property_trie[] = {
// [0x0..0x11000)
6256, 6288, 6320, 6352, 6384, 6416, 6448, 6480,
@@ -87,107 +51,22 @@ static const unsigned short uc_property_trie[] = {
14032, 14064, 14096, 14128, 14160, 14192, 14224, 14256,
14288, 14320, 14352, 14384, 14416, 14448, 14480, 14512,
14544, 14576, 14608, 14640, 14672, 14704, 14736, 14768,
- 14544, 14544, 14544, 14544, 14800, 14832, 14864, 14896,
- 14928, 14960, 14992, 15024, 15056, 15088, 15120, 15152,
- 15184, 15216, 15248, 15280, 15312, 15344, 15376, 15408,
- 15440, 15440, 15440, 15440, 15440, 15440, 15440, 15440,
- 15472, 15504, 15472, 15472, 15536, 15568, 15600, 15632,
- 15664, 15696, 15472, 15728, 15760, 15792, 15824, 15856,
- 15888, 15920, 15952, 15984, 16016, 16048, 16080, 16112,
- 16144, 16176, 16208, 16240, 16272, 16272, 16272, 16304,
- 16336, 16368, 16400, 16432, 16464, 16496, 16496, 16528,
- 16560, 16592, 16624, 9936, 16656, 16688, 16688, 16720,
- 16752, 16752, 16752, 16752, 16752, 16752, 16784, 16816,
-
- 16848, 16880, 16912, 16944, 16976, 17008, 17040, 17072,
- 17104, 17136, 17168, 17200, 17232, 17264, 17296, 17328,
- 17360, 17392, 17424, 17456, 17488, 17520, 17552, 17584,
- 17616, 17616, 17648, 17680, 17712, 17712, 17744, 17776,
- 17808, 17808, 17808, 17808, 17808, 17808, 17808, 17808,
- 17808, 17808, 17808, 17808, 17808, 17808, 17808, 17808,
- 17808, 17808, 17808, 17808, 17808, 17808, 17808, 17808,
- 17808, 17808, 17808, 17808, 17808, 17808, 17808, 17808,
- 17808, 17808, 17808, 17808, 17808, 17808, 17808, 17808,
- 17808, 17808, 17808, 17808, 17808, 17808, 17808, 17808,
- 17808, 17808, 17808, 17808, 17808, 17808, 17808, 17808,
- 17808, 17808, 17808, 17808, 17808, 17808, 17808, 17808,
- 17808, 17808, 17808, 17808, 17808, 17808, 17808, 17808,
- 17808, 17808, 17808, 17808, 17808, 17808, 17808, 17808,
- 17808, 17808, 17808, 17808, 17808, 17808, 17808, 17808,
- 17808, 17808, 17808, 17808, 17808, 17808, 17808, 17808,
-
- 17808, 17808, 17808, 17808, 17808, 17808, 17808, 17808,
- 17808, 17808, 17808, 17808, 17808, 17808, 17808, 17808,
- 17808, 17808, 17808, 17808, 17808, 17808, 17808, 17808,
- 17808, 17808, 17808, 17808, 17808, 17808, 17808, 17808,
- 17808, 17808, 17808, 17808, 17808, 17808, 17808, 17808,
- 17808, 17808, 17808, 17808, 17808, 17808, 17808, 17808,
- 17808, 17808, 17808, 17808, 17808, 17808, 17808, 17808,
- 17808, 17808, 17808, 17808, 17808, 17808, 17808, 17808,
- 17808, 17808, 17808, 17808, 17808, 17808, 17808, 17808,
- 17808, 17808, 17808, 17808, 17808, 17808, 17808, 17808,
- 17808, 17808, 17808, 17808, 17808, 17808, 17808, 17808,
- 17808, 17808, 17808, 17808, 17808, 17808, 17808, 17808,
- 17808, 17808, 17808, 17808, 17808, 17808, 17808, 17808,
- 17808, 17808, 17808, 17808, 17808, 17840, 17872, 17872,
- 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
- 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
-
- 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
- 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
- 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
- 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
- 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
- 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
- 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
- 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
- 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
- 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
- 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
- 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
- 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
- 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
- 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
- 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
-
- 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
- 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
- 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
- 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
- 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
- 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
- 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
- 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
- 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
- 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
- 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
- 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
- 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
- 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
- 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
- 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
-
- 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
- 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
- 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
- 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
- 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
- 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
- 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
- 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
- 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
- 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
- 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
- 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
- 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
- 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
- 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
- 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
-
- 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
- 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
- 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
- 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
+ 14800, 14800, 14832, 14864, 14896, 14928, 14960, 14992,
+ 15024, 15056, 15088, 15120, 15152, 15184, 15216, 15248,
+ 15280, 15312, 15344, 15376, 15408, 15440, 15472, 15504,
+ 15536, 15536, 15536, 15536, 15536, 15536, 15536, 15536,
+ 15568, 15600, 15568, 15568, 15632, 15664, 15696, 15728,
+ 15760, 15792, 15568, 15824, 15856, 15888, 15920, 15952,
+ 15984, 16016, 16048, 16080, 16112, 16144, 16176, 16208,
+ 16240, 16272, 16304, 16336, 16368, 16368, 16368, 16400,
+ 16432, 16464, 16496, 16528, 16560, 16592, 16592, 16624,
+ 16656, 16688, 16720, 9936, 16752, 16784, 16784, 16816,
+ 16848, 16848, 16848, 16848, 16848, 16848, 16880, 16912,
+
+ 16944, 16976, 17008, 17040, 17072, 17104, 17136, 17168,
+ 17200, 17232, 17264, 17296, 17328, 17360, 17392, 17424,
+ 17456, 17488, 17520, 17552, 17584, 17616, 17648, 17680,
+ 17712, 17712, 17744, 17776, 17808, 17808, 17840, 17872,
17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
@@ -214,657 +93,742 @@ static const unsigned short uc_property_trie[] = {
17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
- 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
- 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
- 17904, 17904, 17904, 17904, 17904, 17936, 17968, 18000,
-
- 18032, 18064, 18064, 18064, 18064, 18064, 18064, 18064,
- 18064, 18064, 18064, 18064, 18064, 18064, 18064, 18064,
- 18064, 18064, 18064, 18064, 18064, 18064, 18064, 18064,
- 18064, 18064, 18064, 18064, 18064, 18064, 18064, 18064,
- 18064, 18064, 18064, 18064, 18096, 18128, 18160, 18192,
- 18224, 18224, 18224, 18224, 18224, 18224, 18224, 18224,
- 18256, 18288, 18320, 18352, 18384, 18416, 18416, 18448,
- 18480, 18512, 18544, 18576, 18608, 18640, 18672, 18704,
- 18736, 18768, 18800, 18832, 18864, 18896, 18928, 18960,
- 18992, 19024, 19056, 19088, 19120, 19152, 19184, 19216,
- 19248, 19280, 19312, 19344, 19376, 19408, 19440, 19472,
- 19504, 19536, 19568, 19600, 19632, 19664, 19696, 19728,
- 19760, 19792, 19824, 19856, 19888, 19920, 19952, 19760,
- 19792, 19824, 19856, 19888, 19920, 19952, 19760, 19792,
- 19824, 19856, 19888, 19920, 19952, 19760, 19792, 19824,
- 19856, 19888, 19920, 19952, 19760, 19792, 19824, 19856,
-
- 19888, 19920, 19952, 19760, 19792, 19824, 19856, 19888,
- 19920, 19952, 19760, 19792, 19824, 19856, 19888, 19920,
- 19952, 19760, 19792, 19824, 19856, 19888, 19920, 19952,
- 19760, 19792, 19824, 19856, 19888, 19920, 19952, 19760,
- 19792, 19824, 19856, 19888, 19920, 19952, 19760, 19792,
- 19824, 19856, 19888, 19920, 19952, 19760, 19792, 19824,
- 19856, 19888, 19920, 19952, 19760, 19792, 19824, 19856,
- 19888, 19920, 19952, 19760, 19792, 19824, 19856, 19888,
- 19920, 19952, 19760, 19792, 19824, 19856, 19888, 19920,
- 19952, 19760, 19792, 19824, 19856, 19888, 19920, 19952,
- 19760, 19792, 19824, 19856, 19888, 19920, 19952, 19760,
- 19792, 19824, 19856, 19888, 19920, 19952, 19760, 19792,
- 19824, 19856, 19888, 19920, 19952, 19760, 19792, 19824,
- 19856, 19888, 19920, 19952, 19760, 19792, 19824, 19856,
- 19888, 19920, 19952, 19760, 19792, 19824, 19856, 19888,
- 19920, 19952, 19760, 19792, 19824, 19856, 19888, 19920,
-
- 19952, 19760, 19792, 19824, 19856, 19888, 19920, 19952,
- 19760, 19792, 19824, 19856, 19888, 19920, 19952, 19760,
- 19792, 19824, 19856, 19888, 19920, 19952, 19760, 19792,
- 19824, 19856, 19888, 19920, 19952, 19760, 19792, 19824,
- 19856, 19888, 19920, 19952, 19760, 19792, 19824, 19856,
- 19888, 19920, 19952, 19760, 19792, 19824, 19856, 19888,
- 19920, 19952, 19760, 19792, 19824, 19856, 19888, 19920,
- 19952, 19760, 19792, 19824, 19856, 19888, 19920, 19952,
- 19760, 19792, 19824, 19856, 19888, 19920, 19952, 19760,
- 19792, 19824, 19856, 19888, 19920, 19952, 19760, 19792,
- 19824, 19856, 19888, 19920, 19952, 19760, 19792, 19824,
- 19856, 19888, 19920, 19952, 19760, 19792, 19824, 19856,
- 19888, 19920, 19952, 19760, 19792, 19824, 19856, 19888,
- 19920, 19952, 19760, 19792, 19824, 19856, 19888, 19920,
- 19952, 19760, 19792, 19824, 19856, 19888, 19920, 19952,
- 19760, 19792, 19824, 19856, 19888, 19920, 19952, 19760,
-
- 19792, 19824, 19856, 19888, 19920, 19952, 19760, 19792,
- 19824, 19856, 19888, 19920, 19952, 19760, 19792, 19824,
- 19856, 19888, 19920, 19952, 19760, 19792, 19824, 19856,
- 19888, 19920, 19952, 19760, 19792, 19824, 19856, 19888,
- 19920, 19952, 19760, 19792, 19824, 19856, 19888, 19920,
- 19952, 19760, 19792, 19824, 19856, 19888, 19920, 19952,
- 19760, 19792, 19824, 19856, 19888, 19920, 19952, 19760,
- 19792, 19824, 19856, 19888, 19920, 19984, 20016, 20048,
- 20080, 20080, 20080, 20080, 20080, 20080, 20080, 20080,
- 20080, 20080, 20080, 20080, 20080, 20080, 20080, 20080,
- 20080, 20080, 20080, 20080, 20080, 20080, 20080, 20080,
- 20080, 20080, 20080, 20080, 20080, 20080, 20080, 20080,
- 20080, 20080, 20080, 20080, 20080, 20080, 20080, 20080,
- 20080, 20080, 20080, 20080, 20080, 20080, 20080, 20080,
- 20080, 20080, 20080, 20080, 20080, 20080, 20080, 20080,
- 20080, 20080, 20080, 20080, 20080, 20080, 20080, 20080,
-
- 20112, 20112, 20112, 20112, 20112, 20112, 20112, 20112,
- 20112, 20112, 20112, 20112, 20112, 20112, 20112, 20112,
- 20112, 20112, 20112, 20112, 20112, 20112, 20112, 20112,
- 20112, 20112, 20112, 20112, 20112, 20112, 20112, 20112,
- 20112, 20112, 20112, 20112, 20112, 20112, 20112, 20112,
- 20112, 20112, 20112, 20112, 20112, 20112, 20112, 20112,
- 20112, 20112, 20112, 20112, 20112, 20112, 20112, 20112,
- 20112, 20112, 20112, 20112, 20112, 20112, 20112, 20112,
- 20112, 20112, 20112, 20112, 20112, 20112, 20112, 20112,
- 20112, 20112, 20112, 20112, 20112, 20112, 20112, 20112,
- 20112, 20112, 20112, 20112, 20112, 20112, 20112, 20112,
- 20112, 20112, 20112, 20112, 20112, 20112, 20112, 20112,
- 20112, 20112, 20112, 20112, 20112, 20112, 20112, 20112,
- 20112, 20112, 20112, 20112, 20112, 20112, 20112, 20112,
- 20112, 20112, 20112, 20112, 20112, 20112, 20112, 20112,
- 20112, 20112, 20112, 20112, 20112, 20112, 20112, 20112,
-
- 20112, 20112, 20112, 20112, 20112, 20112, 20112, 20112,
- 20112, 20112, 20112, 20112, 20112, 20112, 20112, 20112,
- 20112, 20112, 20112, 20112, 20112, 20112, 20112, 20112,
- 20112, 20112, 20112, 20112, 20112, 20112, 20112, 20112,
- 20112, 20112, 20112, 20112, 20112, 20112, 20112, 20112,
- 20112, 20112, 20112, 20112, 20112, 20112, 20112, 20112,
- 20112, 20112, 20112, 20112, 20112, 20112, 20112, 20112,
- 20112, 20112, 20112, 20112, 20112, 20112, 20112, 20112,
- 20112, 20112, 20112, 20112, 20112, 20112, 20112, 20112,
- 20144, 20144, 20144, 20144, 20144, 20144, 20144, 20144,
- 20176, 20208, 20240, 20272, 20304, 20304, 20336, 20368,
- 20400, 20432, 20464, 20496, 20496, 20528, 20560, 20496,
- 20496, 20496, 20592, 20624, 20496, 20496, 20496, 20496,
- 20496, 20656, 20688, 20496, 20720, 20496, 20752, 20784,
- 20816, 20848, 20880, 20912, 20496, 20496, 20496, 20944,
- 20976, 21008, 21040, 21072, 21104, 21136, 21168, 21200,
-
- 21232, 21264, 21296, 9936, 21328, 21328, 21328, 21360,
- 21392, 21424, 21456, 21488, 21520, 21552, 21584, 21616,
- 9936, 9936, 9936, 9936, 21648, 21680, 21712, 21744,
- 21776, 21808, 21840, 21872, 21904, 21936, 21968, 9936,
- 22000, 22032, 22064, 22096, 22128, 22160, 22192, 22224,
- 22256, 22288, 22320, 22352, 22384, 22416, 9936, 9936,
- 22448, 22448, 22448, 22448, 22448, 22448, 22448, 22448,
- 22448, 22480, 22512, 22544, 22576, 22608, 9936, 9936,
- 22640, 22672, 22704, 22736, 22768, 22800, 22832, 22864,
- 22896, 22928, 22832, 22832, 22960, 22992, 23024, 23056,
- 23088, 23120, 23152, 23184, 23216, 22832, 23248, 23280,
- 23312, 23344, 23376, 23408, 23440, 23472, 22832, 22832,
- 23504, 23504, 23536, 22832, 23568, 23600, 23632, 23664,
- 23696, 23728, 22832, 22832, 22832, 22832, 22832, 22832,
- 22832, 22832, 22832, 23760, 23792, 23824, 22832, 22832,
- 23856, 23888, 23920, 23952, 23984, 24016, 24048, 24080,
+ 17904, 17904, 17904, 17904, 17904, 17936, 17968, 17968,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18000, 18000, 18000,
+ 18000, 18000, 18000, 18000, 18000, 18032, 18064, 18096,
+
+ 18128, 18160, 18160, 18160, 18160, 18160, 18160, 18160,
+ 18160, 18160, 18160, 18160, 18160, 18160, 18160, 18160,
+ 18160, 18160, 18160, 18160, 18160, 18160, 18160, 18160,
+ 18160, 18160, 18160, 18160, 18160, 18160, 18160, 18160,
+ 18160, 18160, 18160, 18160, 18192, 18224, 18256, 18288,
+ 18320, 18320, 18320, 18320, 18320, 18320, 18320, 18320,
+ 18352, 18384, 18416, 18448, 18480, 18512, 18512, 18544,
+ 18576, 18608, 18640, 18672, 18704, 18736, 18768, 18800,
+ 18832, 18864, 18896, 18928, 18960, 18992, 19024, 19056,
+ 19088, 19120, 19152, 19184, 19216, 19248, 19280, 19312,
+ 19344, 19376, 19408, 19440, 19472, 19504, 19536, 19568,
+ 19600, 19632, 19664, 19696, 19728, 19760, 19792, 19824,
+ 19856, 19888, 19920, 19952, 19984, 20016, 20048, 19856,
+ 19888, 19920, 19952, 19984, 20016, 20048, 19856, 19888,
+ 19920, 19952, 19984, 20016, 20048, 19856, 19888, 19920,
+ 19952, 19984, 20016, 20048, 19856, 19888, 19920, 19952,
+
+ 19984, 20016, 20048, 19856, 19888, 19920, 19952, 19984,
+ 20016, 20048, 19856, 19888, 19920, 19952, 19984, 20016,
+ 20048, 19856, 19888, 19920, 19952, 19984, 20016, 20048,
+ 19856, 19888, 19920, 19952, 19984, 20016, 20048, 19856,
+ 19888, 19920, 19952, 19984, 20016, 20048, 19856, 19888,
+ 19920, 19952, 19984, 20016, 20048, 19856, 19888, 19920,
+ 19952, 19984, 20016, 20048, 19856, 19888, 19920, 19952,
+ 19984, 20016, 20048, 19856, 19888, 19920, 19952, 19984,
+ 20016, 20048, 19856, 19888, 19920, 19952, 19984, 20016,
+ 20048, 19856, 19888, 19920, 19952, 19984, 20016, 20048,
+ 19856, 19888, 19920, 19952, 19984, 20016, 20048, 19856,
+ 19888, 19920, 19952, 19984, 20016, 20048, 19856, 19888,
+ 19920, 19952, 19984, 20016, 20048, 19856, 19888, 19920,
+ 19952, 19984, 20016, 20048, 19856, 19888, 19920, 19952,
+ 19984, 20016, 20048, 19856, 19888, 19920, 19952, 19984,
+ 20016, 20048, 19856, 19888, 19920, 19952, 19984, 20016,
+
+ 20048, 19856, 19888, 19920, 19952, 19984, 20016, 20048,
+ 19856, 19888, 19920, 19952, 19984, 20016, 20048, 19856,
+ 19888, 19920, 19952, 19984, 20016, 20048, 19856, 19888,
+ 19920, 19952, 19984, 20016, 20048, 19856, 19888, 19920,
+ 19952, 19984, 20016, 20048, 19856, 19888, 19920, 19952,
+ 19984, 20016, 20048, 19856, 19888, 19920, 19952, 19984,
+ 20016, 20048, 19856, 19888, 19920, 19952, 19984, 20016,
+ 20048, 19856, 19888, 19920, 19952, 19984, 20016, 20048,
+ 19856, 19888, 19920, 19952, 19984, 20016, 20048, 19856,
+ 19888, 19920, 19952, 19984, 20016, 20048, 19856, 19888,
+ 19920, 19952, 19984, 20016, 20048, 19856, 19888, 19920,
+ 19952, 19984, 20016, 20048, 19856, 19888, 19920, 19952,
+ 19984, 20016, 20048, 19856, 19888, 19920, 19952, 19984,
+ 20016, 20048, 19856, 19888, 19920, 19952, 19984, 20016,
+ 20048, 19856, 19888, 19920, 19952, 19984, 20016, 20048,
+ 19856, 19888, 19920, 19952, 19984, 20016, 20048, 19856,
+
+ 19888, 19920, 19952, 19984, 20016, 20048, 19856, 19888,
+ 19920, 19952, 19984, 20016, 20048, 19856, 19888, 19920,
+ 19952, 19984, 20016, 20048, 19856, 19888, 19920, 19952,
+ 19984, 20016, 20048, 19856, 19888, 19920, 19952, 19984,
+ 20016, 20048, 19856, 19888, 19920, 19952, 19984, 20016,
+ 20048, 19856, 19888, 19920, 19952, 19984, 20016, 20048,
+ 19856, 19888, 19920, 19952, 19984, 20016, 20048, 19856,
+ 19888, 19920, 19952, 19984, 20016, 20080, 20112, 20144,
+ 20176, 20176, 20176, 20176, 20176, 20176, 20176, 20176,
+ 20176, 20176, 20176, 20176, 20176, 20176, 20176, 20176,
+ 20176, 20176, 20176, 20176, 20176, 20176, 20176, 20176,
+ 20176, 20176, 20176, 20176, 20176, 20176, 20176, 20176,
+ 20176, 20176, 20176, 20176, 20176, 20176, 20176, 20176,
+ 20176, 20176, 20176, 20176, 20176, 20176, 20176, 20176,
+ 20176, 20176, 20176, 20176, 20176, 20176, 20176, 20176,
+ 20176, 20176, 20176, 20176, 20176, 20176, 20176, 20176,
+
+ 20208, 20208, 20208, 20208, 20208, 20208, 20208, 20208,
+ 20208, 20208, 20208, 20208, 20208, 20208, 20208, 20208,
+ 20208, 20208, 20208, 20208, 20208, 20208, 20208, 20208,
+ 20208, 20208, 20208, 20208, 20208, 20208, 20208, 20208,
+ 20208, 20208, 20208, 20208, 20208, 20208, 20208, 20208,
+ 20208, 20208, 20208, 20208, 20208, 20208, 20208, 20208,
+ 20208, 20208, 20208, 20208, 20208, 20208, 20208, 20208,
+ 20208, 20208, 20208, 20208, 20208, 20208, 20208, 20208,
+ 20208, 20208, 20208, 20208, 20208, 20208, 20208, 20208,
+ 20208, 20208, 20208, 20208, 20208, 20208, 20208, 20208,
+ 20208, 20208, 20208, 20208, 20208, 20208, 20208, 20208,
+ 20208, 20208, 20208, 20208, 20208, 20208, 20208, 20208,
+ 20208, 20208, 20208, 20208, 20208, 20208, 20208, 20208,
+ 20208, 20208, 20208, 20208, 20208, 20208, 20208, 20208,
+ 20208, 20208, 20208, 20208, 20208, 20208, 20208, 20208,
+ 20208, 20208, 20208, 20208, 20208, 20208, 20208, 20208,
+
+ 20208, 20208, 20208, 20208, 20208, 20208, 20208, 20208,
+ 20208, 20208, 20208, 20208, 20208, 20208, 20208, 20208,
+ 20208, 20208, 20208, 20208, 20208, 20208, 20208, 20208,
+ 20208, 20208, 20208, 20208, 20208, 20208, 20208, 20208,
+ 20208, 20208, 20208, 20208, 20208, 20208, 20208, 20208,
+ 20208, 20208, 20208, 20208, 20208, 20208, 20208, 20208,
+ 20208, 20208, 20208, 20208, 20208, 20208, 20208, 20208,
+ 20208, 20208, 20208, 20208, 20208, 20208, 20208, 20208,
+ 20208, 20208, 20208, 20208, 20208, 20208, 20208, 20208,
+ 20240, 20240, 20240, 20240, 20240, 20240, 20240, 20240,
+ 20272, 20304, 20336, 20368, 20400, 20400, 20432, 20464,
+ 20496, 20528, 20560, 20592, 20592, 20624, 20656, 20592,
+ 20592, 20592, 20688, 20720, 20592, 20592, 20592, 20592,
+ 20592, 20752, 20784, 20592, 20816, 20592, 20848, 20880,
+ 20912, 20944, 20976, 21008, 20592, 20592, 20592, 21040,
+ 21072, 21104, 21136, 21168, 21200, 21232, 21264, 21296,
+
+ 21328, 21360, 21392, 9936, 21424, 21424, 21424, 21456,
+ 21488, 21520, 21552, 21584, 21616, 21648, 21680, 21712,
+ 9936, 9936, 9936, 9936, 21744, 21776, 21808, 21840,
+ 21872, 21904, 21936, 21968, 22000, 22032, 22064, 9936,
+ 22096, 22128, 22160, 22192, 22224, 22256, 22288, 22320,
+ 22352, 22384, 22416, 22448, 22480, 22512, 9936, 9936,
+ 22544, 22544, 22544, 22544, 22544, 22544, 22544, 22544,
+ 22544, 22576, 22608, 22640, 22672, 22704, 9936, 9936,
+ 22736, 22768, 22800, 22832, 22864, 22896, 22928, 22960,
+ 22992, 23024, 22928, 22928, 23056, 23088, 23120, 23152,
+ 23184, 23216, 23248, 23280, 23312, 22928, 23344, 23376,
+ 23408, 23440, 23472, 23504, 23536, 23568, 22928, 22928,
+ 23600, 23600, 23632, 22928, 23664, 23696, 23728, 23760,
+ 23792, 23824, 22928, 22928, 22928, 22928, 22928, 22928,
+ 22928, 22928, 22928, 23856, 23888, 23920, 22928, 23952,
+ 23984, 24016, 24048, 24080, 24112, 24144, 24176, 24208,
// [0x11000..0x110000)
- 24112, 24368, 24624, 24880, 25136, 25392, 25648, 25904,
- 26160, 26416, 26672, 26928, 27184, 27440, 27696, 27952,
- 28208, 28208, 28208, 28464, 28720, 28976, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 29232,
- 29488, 29488, 29744, 30000, 30256, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 30512, 30768, 31024, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 31280, 31280, 31536, 31792, 26928, 26928, 32048, 32304,
- 32560, 32560, 32560, 32560, 32560, 32560, 32560, 32560,
- 32560, 32560, 32560, 32560, 32560, 32560, 32560, 32560,
- 32560, 32560, 32560, 32560, 32560, 32560, 32560, 32816,
- 32560, 32560, 33072, 33328, 33584, 33840, 26928, 26928,
-
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 34096,
- 34352, 34608, 34864, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 35120, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 35376,
- 35632, 35888, 36144, 36400, 36656, 36912, 37168, 37424,
- 37680, 37680, 37936, 26928, 26928, 26928, 26928, 38192,
- 38448, 38704, 38960, 26928, 26928, 26928, 26928, 39216,
- 39472, 39728, 39984, 39984, 40240, 40496, 40752, 39984,
- 41008, 41264, 41520, 41776, 42032, 42288, 42544, 42800,
- 43056, 43312, 43568, 43824, 44080, 44080, 44080, 44336,
- 44592, 44592, 44592, 44592, 44592, 44592, 44592, 44592,
- 44592, 44592, 44592, 44592, 44592, 44592, 44592, 44592,
- 44592, 44592, 44592, 44592, 44592, 44592, 44592, 44592,
- 44592, 44592, 44592, 44592, 44592, 44592, 44592, 44592,
- 44592, 44592, 44592, 44592, 44592, 44592, 44592, 44592,
- 44592, 44592, 44592, 44592, 44592, 44592, 44592, 44592,
- 44592, 44592, 44592, 44592, 44592, 44592, 44592, 44592,
- 44592, 44592, 44592, 44592, 44592, 44592, 44592, 44592,
- 44592, 44592, 44592, 44592, 44592, 44592, 44592, 44592,
- 44592, 44592, 44592, 44592, 44592, 44592, 44592, 44592,
- 44592, 44592, 44592, 44592, 44592, 44592, 44592, 44592,
- 44592, 44592, 44592, 44592, 44592, 44592, 44592, 44592,
- 44592, 44592, 44592, 44592, 44592, 44592, 44592, 44592,
- 44592, 44592, 44592, 44592, 44592, 44592, 44592, 44592,
- 44592, 44592, 44592, 44592, 44592, 44592, 44592, 44592,
- 44592, 44592, 44592, 44592, 44592, 44592, 44592, 44592,
- 44592, 44592, 44592, 44592, 44592, 44592, 44592, 44592,
- 44592, 44592, 44592, 44592, 44592, 44592, 44592, 44592,
-
- 44592, 44592, 44592, 44592, 44592, 44592, 44592, 44592,
- 44592, 44592, 44592, 44592, 44592, 44592, 44592, 44592,
- 44592, 44592, 44592, 44592, 44592, 44592, 44848, 45104,
- 45104, 45104, 45104, 45104, 45104, 45104, 45104, 45104,
- 45104, 45104, 45104, 45104, 45104, 45104, 45104, 45360,
- 45616, 45872, 45872, 45872, 45872, 45872, 45872, 45872,
- 45872, 45872, 45872, 45872, 45872, 45872, 45872, 45872,
- 45872, 45872, 45872, 45872, 45872, 45872, 46128, 46384,
- 46384, 46384, 46384, 46384, 46384, 46384, 46384, 46384,
- 46384, 46384, 46384, 46384, 46384, 46384, 46384, 46384,
- 46384, 46384, 46384, 46384, 46384, 46384, 46384, 46384,
- 46384, 46384, 46384, 46640, 46896, 46896, 46896, 46896,
- 46896, 46896, 46896, 46896, 46896, 46896, 46896, 46896,
- 47152, 47408, 47664, 46896, 46896, 46896, 46896, 47920,
- 48176, 48176, 48176, 48176, 48176, 48176, 48176, 48176,
- 48176, 48176, 48176, 48176, 48176, 48176, 48176, 48176,
- 48176, 48176, 48176, 48432, 46896, 46896, 46896, 46896,
- 46896, 46896, 46896, 46896, 46896, 46896, 46896, 46896,
- 46896, 46896, 46896, 46896, 46896, 46896, 46896, 46896,
- 46896, 46896, 46896, 46896, 46896, 46896, 46896, 46896,
- 46896, 46896, 46896, 46896, 46896, 46896, 46896, 46896,
- 46896, 46896, 46896, 46896, 46896, 46896, 46896, 46896,
- 46896, 46896, 46896, 46896, 46896, 46896, 46896, 46896,
- 46896, 46896, 46896, 46896, 46896, 46896, 46896, 46896,
- 46896, 46896, 46896, 46896, 46896, 46896, 46896, 46896,
- 46896, 46896, 46896, 46896, 46896, 46896, 46896, 46896,
- 46896, 46896, 46896, 46896, 46896, 46896, 46896, 46896,
- 46896, 46896, 46896, 46896, 46896, 46896, 46896, 46896,
- 46896, 46896, 46896, 46896, 46896, 46896, 46896, 46896,
- 46896, 46896, 46896, 46896, 46896, 46896, 46896, 46896,
- 46896, 46896, 46896, 46896, 46896, 46896, 46896, 46896,
- 46896, 46896, 46896, 46896, 46896, 46896, 46896, 46896,
-
- 46896, 46896, 46896, 46896, 46896, 46896, 46896, 46896,
- 46896, 46896, 46896, 46896, 46896, 46896, 46896, 46896,
- 46896, 46896, 46896, 46896, 46896, 46896, 46896, 46896,
- 46896, 46896, 46896, 46896, 46896, 46896, 46896, 46896,
- 46896, 46896, 46896, 46896, 46896, 46896, 46896, 46896,
- 46896, 46896, 46896, 46896, 46896, 46896, 46896, 46896,
- 46896, 46896, 46896, 46896, 46896, 46896, 46896, 46896,
- 46896, 46896, 46896, 46896, 46896, 46896, 46896, 46896,
- 46896, 46896, 46896, 46896, 46896, 46896, 46896, 46896,
- 46896, 46896, 46896, 46896, 46896, 46896, 46896, 46896,
- 46896, 46896, 46896, 46896, 46896, 46896, 46896, 46896,
- 46896, 46896, 46896, 46896, 46896, 46896, 46896, 46896,
- 46896, 46896, 46896, 46896, 46896, 46896, 46896, 46896,
- 46896, 46896, 46896, 46896, 46896, 46896, 46896, 47920,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
-
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 48688,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
-
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 48688,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
-
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 48688,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
-
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 48688,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
-
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 48688,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
-
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 48688,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
-
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 48688,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
-
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 48688,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
-
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 48688,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
-
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 48688,
- 48944, 49200, 49456, 49456, 49456, 49456, 49456, 49456,
- 49456, 49456, 49456, 49456, 49456, 49456, 49456, 49456,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
-
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 26928,
- 26928, 26928, 26928, 26928, 26928, 26928, 26928, 48688,
- 49712, 49712, 49712, 49712, 49712, 49712, 49712, 49712,
- 49712, 49712, 49712, 49712, 49712, 49712, 49712, 49712,
- 49712, 49712, 49712, 49712, 49712, 49712, 49712, 49712,
- 49712, 49712, 49712, 49712, 49712, 49712, 49712, 49712,
- 49712, 49712, 49712, 49712, 49712, 49712, 49712, 49712,
- 49712, 49712, 49712, 49712, 49712, 49712, 49712, 49712,
- 49712, 49712, 49712, 49712, 49712, 49712, 49712, 49712,
- 49712, 49712, 49712, 49712, 49712, 49712, 49712, 49712,
- 49712, 49712, 49712, 49712, 49712, 49712, 49712, 49712,
- 49712, 49712, 49712, 49712, 49712, 49712, 49712, 49712,
- 49712, 49712, 49712, 49712, 49712, 49712, 49712, 49712,
- 49712, 49712, 49712, 49712, 49712, 49712, 49712, 49712,
- 49712, 49712, 49712, 49712, 49712, 49712, 49712, 49712,
- 49712, 49712, 49712, 49712, 49712, 49712, 49712, 49712,
- 49712, 49712, 49712, 49712, 49712, 49712, 49712, 49712,
- 49712, 49712, 49712, 49712, 49712, 49712, 49712, 49712,
- 49712, 49712, 49712, 49712, 49712, 49712, 49712, 49712,
- 49712, 49712, 49712, 49712, 49712, 49712, 49712, 49712,
-
- 49712, 49712, 49712, 49712, 49712, 49712, 49712, 49712,
- 49712, 49712, 49712, 49712, 49712, 49712, 49712, 49712,
- 49712, 49712, 49712, 49712, 49712, 49712, 49712, 49712,
- 49712, 49712, 49712, 49712, 49712, 49712, 49712, 49712,
- 49712, 49712, 49712, 49712, 49712, 49712, 49712, 49712,
- 49712, 49712, 49712, 49712, 49712, 49712, 49712, 49712,
- 49712, 49712, 49712, 49712, 49712, 49712, 49712, 49712,
- 49712, 49712, 49712, 49712, 49712, 49712, 49712, 49712,
- 49712, 49712, 49712, 49712, 49712, 49712, 49712, 49712,
- 49712, 49712, 49712, 49712, 49712, 49712, 49712, 49712,
- 49712, 49712, 49712, 49712, 49712, 49712, 49712, 49712,
- 49712, 49712, 49712, 49712, 49712, 49712, 49712, 49712,
- 49712, 49712, 49712, 49712, 49712, 49712, 49712, 49712,
- 49712, 49712, 49712, 49712, 49712, 49712, 49712, 49968,
- 49712, 49712, 49712, 49712, 49712, 49712, 49712, 49712,
- 49712, 49712, 49712, 49712, 49712, 49712, 49712, 49712,
- 49712, 49712, 49712, 49712, 49712, 49712, 49712, 49712,
- 49712, 49712, 49712, 49712, 49712, 49712, 49712, 49712,
- 49712, 49712, 49712, 49712, 49712, 49712, 49712, 49712,
- 49712, 49712, 49712, 49712, 49712, 49712, 49712, 49712,
- 49712, 49712, 49712, 49712, 49712, 49712, 49712, 49712,
- 49712, 49712, 49712, 49712, 49712, 49712, 49712, 49712,
- 49712, 49712, 49712, 49712, 49712, 49712, 49712, 49712,
- 49712, 49712, 49712, 49712, 49712, 49712, 49712, 49712,
- 49712, 49712, 49712, 49712, 49712, 49712, 49712, 49712,
- 49712, 49712, 49712, 49712, 49712, 49712, 49712, 49712,
- 49712, 49712, 49712, 49712, 49712, 49712, 49712, 49712,
- 49712, 49712, 49712, 49712, 49712, 49712, 49712, 49712,
- 49712, 49712, 49712, 49712, 49712, 49712, 49712, 49712,
- 49712, 49712, 49712, 49712, 49712, 49712, 49712, 49712,
- 49712, 49712, 49712, 49712, 49712, 49712, 49712, 49712,
- 49712, 49712, 49712, 49712, 49712, 49712, 49712, 49712,
-
- 49712, 49712, 49712, 49712, 49712, 49712, 49712, 49712,
- 49712, 49712, 49712, 49712, 49712, 49712, 49712, 49712,
- 49712, 49712, 49712, 49712, 49712, 49712, 49712, 49712,
- 49712, 49712, 49712, 49712, 49712, 49712, 49712, 49712,
- 49712, 49712, 49712, 49712, 49712, 49712, 49712, 49712,
- 49712, 49712, 49712, 49712, 49712, 49712, 49712, 49712,
- 49712, 49712, 49712, 49712, 49712, 49712, 49712, 49712,
- 49712, 49712, 49712, 49712, 49712, 49712, 49712, 49712,
- 49712, 49712, 49712, 49712, 49712, 49712, 49712, 49712,
- 49712, 49712, 49712, 49712, 49712, 49712, 49712, 49712,
- 49712, 49712, 49712, 49712, 49712, 49712, 49712, 49712,
- 49712, 49712, 49712, 49712, 49712, 49712, 49712, 49712,
- 49712, 49712, 49712, 49712, 49712, 49712, 49712, 49712,
- 49712, 49712, 49712, 49712, 49712, 49712, 49712, 49968,
+ 24240, 24496, 24752, 25008, 25264, 25520, 25776, 26032,
+ 26288, 26544, 26800, 27056, 27312, 27568, 27824, 28080,
+ 28336, 28336, 28336, 28592, 28848, 29104, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29616,
+ 29872, 29872, 30128, 30384, 30640, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 30896, 31152, 31408, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 31664, 31664, 31920, 32176, 29360, 29360, 32432, 32688,
+ 32944, 32944, 32944, 32944, 32944, 32944, 32944, 32944,
+ 32944, 32944, 32944, 32944, 32944, 32944, 32944, 32944,
+ 32944, 32944, 32944, 32944, 32944, 32944, 32944, 33200,
+ 32944, 32944, 33456, 33712, 33968, 34224, 29360, 29360,
+
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 34480,
+ 34736, 34992, 35248, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 35504, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 35760,
+ 36016, 36272, 36528, 36784, 37040, 37296, 37552, 37808,
+ 38064, 38064, 38320, 29360, 29360, 29360, 29360, 38576,
+ 38832, 39088, 39344, 29360, 39600, 29360, 29360, 39856,
+ 40112, 40368, 40624, 40624, 40880, 41136, 41392, 40624,
+ 41648, 41904, 42160, 42416, 42672, 42928, 43184, 43440,
+ 43696, 43952, 44208, 44464, 44720, 44720, 44720, 44976,
+ 45232, 45232, 45232, 45232, 45232, 45232, 45232, 45232,
+ 45232, 45232, 45232, 45232, 45232, 45232, 45232, 45232,
+ 45232, 45232, 45232, 45232, 45232, 45232, 45232, 45232,
+ 45232, 45232, 45232, 45232, 45232, 45232, 45232, 45232,
+ 45232, 45232, 45232, 45232, 45232, 45232, 45232, 45232,
+ 45232, 45232, 45232, 45232, 45232, 45232, 45232, 45232,
+ 45232, 45232, 45232, 45232, 45232, 45232, 45232, 45232,
+ 45232, 45232, 45232, 45232, 45232, 45232, 45232, 45232,
+ 45232, 45232, 45232, 45232, 45232, 45232, 45232, 45232,
+ 45232, 45232, 45232, 45232, 45232, 45232, 45232, 45232,
+ 45232, 45232, 45232, 45232, 45232, 45232, 45232, 45232,
+ 45232, 45232, 45232, 45232, 45232, 45232, 45232, 45232,
+ 45232, 45232, 45232, 45232, 45232, 45232, 45232, 45232,
+ 45232, 45232, 45232, 45232, 45232, 45232, 45232, 45232,
+ 45232, 45232, 45232, 45232, 45232, 45232, 45232, 45232,
+ 45232, 45232, 45232, 45232, 45232, 45232, 45232, 45232,
+ 45232, 45232, 45232, 45232, 45232, 45232, 45232, 45232,
+ 45232, 45232, 45232, 45232, 45232, 45232, 45232, 45232,
+
+ 45232, 45232, 45232, 45232, 45232, 45232, 45232, 45232,
+ 45232, 45232, 45232, 45232, 45232, 45232, 45232, 45232,
+ 45232, 45232, 45232, 45232, 45232, 45232, 45488, 45744,
+ 45744, 45744, 45744, 45744, 45744, 45744, 45744, 45744,
+ 45744, 45744, 45744, 45744, 45744, 45744, 45744, 46000,
+ 46256, 46512, 46512, 46512, 46512, 46512, 46512, 46512,
+ 46512, 46512, 46512, 46512, 46512, 46512, 46512, 46512,
+ 46512, 46512, 46512, 46512, 46512, 46512, 46768, 47024,
+ 47024, 47024, 47024, 47024, 47024, 47024, 47024, 47024,
+ 47024, 47024, 47024, 47024, 47024, 47024, 47024, 47024,
+ 47024, 47024, 47024, 47024, 47024, 47024, 47024, 47024,
+ 47024, 47024, 47024, 47280, 47536, 47536, 47792, 48048,
+ 48048, 48048, 48048, 48048, 48048, 48048, 48048, 48048,
+ 48304, 48560, 48816, 48048, 48048, 48048, 48048, 49072,
+ 49328, 49328, 49328, 49328, 49328, 49328, 49328, 49328,
+ 49328, 49328, 49328, 49328, 49328, 49328, 49328, 49328,
+ 49328, 49328, 49328, 49584, 49840, 49840, 49840, 49840,
+ 49840, 49840, 49840, 49840, 49840, 49840, 49840, 49840,
+ 49840, 49840, 49840, 50096, 48048, 48048, 48048, 48048,
+ 48048, 48048, 48048, 48048, 48048, 48048, 48048, 48048,
+ 48048, 48048, 48048, 48048, 48048, 48048, 48048, 48048,
+ 48048, 48048, 48048, 48048, 48048, 48048, 48048, 48048,
+ 48048, 48048, 48048, 48048, 48048, 48048, 48048, 48048,
+ 48048, 48048, 48048, 48048, 48048, 48048, 48048, 48048,
+ 48048, 48048, 48048, 48048, 48048, 48048, 48048, 48048,
+ 48048, 48048, 48048, 48048, 48048, 48048, 48048, 48048,
+ 48048, 48048, 48048, 48048, 48048, 48048, 48048, 48048,
+ 48048, 48048, 48048, 48048, 48048, 48048, 48048, 48048,
+ 48048, 48048, 48048, 48048, 48048, 48048, 48048, 48048,
+ 48048, 48048, 48048, 48048, 48048, 48048, 48048, 48048,
+ 48048, 48048, 48048, 48048, 48048, 48048, 48048, 48048,
+ 48048, 48048, 48048, 48048, 48048, 48048, 48048, 48048,
+
+ 48048, 48048, 48048, 48048, 48048, 48048, 48048, 48048,
+ 48048, 48048, 48048, 48048, 48048, 48048, 48048, 48048,
+ 48048, 48048, 48048, 48048, 48048, 48048, 48048, 48048,
+ 48048, 48048, 48048, 48048, 48048, 48048, 48048, 48048,
+ 48048, 48048, 48048, 48048, 48048, 48048, 48048, 48048,
+ 48048, 48048, 48048, 48048, 48048, 48048, 48048, 48048,
+ 48048, 48048, 48048, 48048, 48048, 48048, 48048, 48048,
+ 48048, 48048, 48048, 48048, 48048, 48048, 48048, 48048,
+ 48048, 48048, 48048, 48048, 48048, 48048, 48048, 48048,
+ 48048, 48048, 48048, 48048, 48048, 48048, 48048, 48048,
+ 48048, 48048, 48048, 48048, 48048, 48048, 48048, 48048,
+ 48048, 48048, 48048, 48048, 48048, 48048, 48048, 48048,
+ 48048, 48048, 48048, 48048, 48048, 48048, 48048, 48048,
+ 48048, 48048, 48048, 48048, 48048, 48048, 48048, 49072,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 50352,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 50352,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 50352,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 50352,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 50352,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 50352,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 50352,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 50352,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 50352,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 50352,
+ 50608, 50864, 51120, 51120, 51120, 51120, 51120, 51120,
+ 51120, 51120, 51120, 51120, 51120, 51120, 51120, 51120,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 29360,
+ 29360, 29360, 29360, 29360, 29360, 29360, 29360, 50352,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51632,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51376,
+ 51376, 51376, 51376, 51376, 51376, 51376, 51376, 51632,
0, 0, 0, 0, 0, 0, 0, 0,
@@ -892,5278 +856,4308 @@ static const unsigned short uc_property_trie[] = {
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
- 48, 49, 50, 51, 51, 51, 52, 53,
- 54, 55, 56, 57, 58, 59, 55, 54,
- 60, 61, 62, 63, 64, 65, 53, 66,
- 54, 67, 56, 68, 69, 69, 69, 49,
-
- 70, 70, 70, 70, 70, 70, 38, 70,
- 70, 70, 70, 70, 70, 70, 70, 70,
- 38, 70, 70, 70, 70, 70, 70, 58,
- 38, 70, 70, 70, 70, 70, 38, 71,
-
- 72, 72, 72, 72, 72, 72, 44, 72,
- 72, 72, 72, 72, 72, 72, 72, 72,
- 44, 72, 72, 72, 72, 72, 72, 58,
- 44, 72, 72, 72, 72, 72, 44, 73,
-
- 74, 75, 74, 75, 74, 75, 74, 75,
- 74, 75, 74, 75, 74, 75, 74, 75,
- 76, 77, 74, 75, 74, 75, 74, 75,
- 74, 75, 74, 75, 74, 75, 74, 75,
-
- 74, 75, 74, 75, 74, 75, 76, 77,
- 74, 75, 74, 75, 74, 75, 74, 75,
- 78, 79, 80, 81, 74, 75, 74, 75,
- 82, 74, 75, 74, 75, 74, 75, 80,
-
- 81, 76, 77, 74, 75, 74, 75, 74,
- 75, 83, 76, 77, 74, 75, 74, 75,
- 74, 75, 76, 77, 74, 75, 74, 75,
- 74, 75, 74, 75, 74, 75, 74, 75,
-
- 74, 75, 74, 75, 74, 75, 76, 77,
- 74, 75, 74, 75, 74, 75, 74, 75,
- 74, 75, 74, 75, 74, 75, 74, 75,
- 84, 74, 75, 74, 75, 74, 75, 85,
-
- 86, 87, 76, 77, 76, 77, 88, 76,
- 77, 89, 89, 76, 77, 82, 90, 91,
- 92, 76, 77, 89, 93, 94, 95, 96,
- 76, 77, 97, 82, 95, 98, 99, 100,
-
- 74, 75, 76, 77, 76, 77, 101, 76,
- 77, 101, 82, 82, 76, 77, 101, 74,
- 75, 102, 102, 76, 77, 76, 77, 103,
- 76, 77, 82, 104, 76, 77, 82, 105,
-
- 104, 104, 104, 104, 106, 107, 108, 106,
- 107, 108, 106, 107, 108, 74, 75, 74,
- 75, 74, 75, 74, 75, 74, 75, 74,
- 75, 74, 75, 74, 75, 109, 74, 75,
-
- 74, 75, 74, 75, 76, 77, 74, 75,
- 74, 75, 74, 75, 74, 75, 74, 75,
- 110, 106, 107, 108, 74, 75, 111, 112,
- 113, 114, 74, 75, 74, 75, 74, 75,
-
- 74, 75, 74, 75, 74, 75, 74, 75,
- 74, 75, 74, 75, 74, 75, 74, 75,
- 74, 75, 74, 75, 74, 75, 74, 75,
- 113, 114, 113, 114, 115, 116, 113, 114,
-
- 117, 118, 115, 116, 115, 116, 113, 114,
- 113, 114, 113, 114, 113, 114, 113, 114,
- 113, 114, 113, 114, 118, 118, 118, 119,
- 119, 119, 120, 121, 122, 123, 124, 125,
-
- 126, 121, 127, 128, 129, 130, 131, 127,
- 131, 127, 131, 127, 131, 127, 131, 127,
- 132, 133, 134, 135, 136, 82, 137, 137,
- 82, 138, 82, 139, 140, 82, 82, 82,
-
- 137, 141, 82, 142, 82, 143, 144, 82,
- 145, 146, 147, 148, 149, 82, 82, 146,
- 82, 150, 151, 82, 82, 152, 82, 82,
- 82, 82, 82, 82, 82, 153, 82, 82,
-
- 154, 82, 155, 154, 82, 82, 82, 156,
- 154, 157, 158, 158, 159, 82, 82, 82,
- 82, 82, 160, 82, 104, 82, 82, 82,
- 82, 82, 82, 82, 82, 161, 162, 82,
-
- 82, 82, 82, 82, 82, 82, 82, 82,
- 82, 163, 163, 163, 163, 163, 118, 118,
- 164, 164, 164, 164, 164, 164, 164, 164,
- 164, 165, 165, 166, 166, 166, 166, 166,
-
- 167, 167, 168, 168, 168, 168, 165, 165,
- 169, 165, 165, 165, 169, 165, 165, 165,
- 166, 166, 168, 168, 168, 168, 168, 168,
- 54, 54, 54, 54, 54, 54, 168, 170,
-
- 164, 164, 164, 164, 164, 168, 168, 168,
- 168, 168, 171, 171, 172, 173, 174, 175,
- 175, 175, 175, 175, 175, 175, 175, 175,
+ 48, 49, 50, 51, 52, 51, 53, 54,
+ 55, 56, 57, 58, 59, 60, 61, 62,
+ 63, 64, 65, 66, 67, 68, 54, 69,
+ 55, 70, 57, 71, 72, 72, 72, 49,
+
+ 73, 73, 73, 73, 73, 73, 74, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73,
+ 74, 73, 73, 73, 73, 73, 73, 75,
+ 74, 73, 73, 73, 73, 73, 74, 76,
+
+ 77, 77, 78, 78, 78, 78, 79, 78,
+ 77, 77, 77, 78, 77, 77, 78, 78,
+ 79, 78, 77, 77, 78, 78, 78, 75,
+ 79, 77, 77, 78, 77, 78, 79, 80,
+
+ 81, 82, 81, 83, 81, 83, 81, 83,
+ 81, 83, 81, 83, 81, 83, 81, 83,
+ 84, 85, 81, 82, 81, 83, 81, 83,
+ 81, 83, 81, 82, 81, 83, 81, 83,
+
+ 81, 83, 81, 83, 81, 83, 86, 85,
+ 81, 83, 81, 82, 81, 83, 81, 83,
+ 87, 88, 89, 90, 81, 83, 81, 83,
+ 91, 81, 83, 81, 83, 81, 83, 89,
+
+ 90, 86, 85, 81, 82, 81, 83, 81,
+ 82, 92, 86, 85, 81, 82, 81, 83,
+ 81, 83, 86, 85, 81, 83, 81, 83,
+ 81, 83, 81, 83, 81, 83, 81, 83,
+
+ 81, 83, 81, 83, 81, 83, 86, 85,
+ 81, 83, 81, 82, 81, 83, 81, 83,
+ 81, 83, 81, 83, 81, 83, 81, 83,
+ 93, 81, 83, 81, 83, 81, 83, 94,
+
+ 95, 96, 84, 97, 84, 97, 98, 84,
+ 97, 99, 99, 84, 97, 100, 101, 102,
+ 103, 84, 97, 99, 104, 105, 106, 107,
+ 84, 97, 108, 100, 106, 109, 110, 111,
+
+ 81, 83, 84, 97, 84, 97, 112, 84,
+ 97, 112, 100, 100, 84, 97, 112, 81,
+ 83, 113, 113, 84, 97, 84, 97, 114,
+ 84, 97, 100, 115, 84, 97, 100, 116,
+
+ 115, 115, 115, 115, 117, 118, 119, 117,
+ 118, 119, 117, 118, 119, 81, 82, 81,
+ 82, 81, 82, 81, 82, 81, 82, 81,
+ 82, 81, 82, 81, 82, 120, 81, 83,
+
+ 81, 83, 81, 83, 84, 97, 81, 83,
+ 81, 83, 81, 83, 81, 83, 81, 83,
+ 121, 117, 118, 119, 81, 83, 122, 123,
+ 124, 125, 81, 83, 81, 83, 81, 83,
+
+ 81, 83, 81, 83, 81, 83, 81, 83,
+ 81, 83, 81, 83, 81, 83, 81, 83,
+ 81, 83, 81, 83, 81, 83, 81, 83,
+ 124, 125, 124, 125, 126, 127, 124, 125,
+
+ 128, 129, 126, 127, 126, 127, 124, 125,
+ 124, 125, 124, 125, 124, 125, 124, 125,
+ 124, 125, 124, 125, 129, 129, 129, 130,
+ 130, 130, 131, 132, 133, 134, 135, 136,
+
+ 137, 132, 138, 139, 140, 141, 142, 138,
+ 142, 138, 142, 138, 142, 138, 142, 138,
+ 143, 144, 145, 146, 147, 100, 148, 148,
+ 100, 149, 100, 150, 151, 100, 100, 100,
+
+ 148, 152, 100, 153, 100, 154, 155, 100,
+ 156, 157, 158, 159, 160, 100, 100, 157,
+ 100, 161, 162, 100, 100, 163, 100, 100,
+ 100, 100, 100, 100, 100, 164, 100, 100,
+
+ 165, 100, 166, 165, 100, 100, 100, 167,
+ 165, 168, 169, 169, 170, 100, 100, 100,
+ 100, 100, 171, 100, 115, 100, 100, 100,
+ 100, 100, 100, 100, 100, 172, 173, 100,
+
+ 100, 100, 100, 100, 100, 100, 100, 100,
+ 100, 174, 174, 174, 174, 174, 129, 129,
175, 175, 175, 175, 175, 175, 175, 175,
+ 175, 176, 176, 177, 177, 177, 177, 177,
+
+ 178, 178, 179, 179, 180, 179, 176, 181,
+ 182, 181, 181, 181, 182, 181, 176, 176,
+ 183, 177, 179, 179, 179, 179, 179, 179,
+ 55, 55, 55, 55, 184, 55, 179, 185,
+
+ 175, 175, 175, 175, 175, 179, 179, 179,
+ 179, 179, 186, 186, 187, 188, 189, 190,
+ 190, 190, 190, 190, 190, 190, 190, 190,
+ 190, 190, 190, 190, 190, 190, 190, 190,
+
+ 191, 191, 191, 191, 191, 192, 191, 191,
+ 191, 191, 191, 191, 191, 192, 192, 191,
+ 192, 191, 192, 191, 191, 193, 194, 194,
+ 194, 194, 193, 195, 194, 194, 194, 194,
+
+ 194, 196, 196, 197, 197, 197, 197, 198,
+ 198, 194, 194, 194, 194, 197, 197, 194,
+ 197, 197, 194, 194, 199, 199, 199, 199,
+ 200, 194, 194, 194, 194, 192, 192, 192,
+
+ 201, 201, 191, 201, 201, 202, 203, 204,
+ 204, 204, 203, 203, 203, 204, 204, 205,
+ 206, 206, 206, 207, 207, 207, 207, 206,
+ 208, 209, 209, 210, 211, 212, 212, 213,
+
+ 214, 214, 215, 216, 216, 216, 216, 216,
+ 216, 216, 216, 216, 216, 216, 216, 216,
+ 217, 218, 217, 218, 219, 220, 217, 218,
+ 221, 221, 222, 223, 223, 223, 224, 225,
+
+ 221, 221, 221, 221, 226, 227, 228, 229,
+ 230, 230, 230, 221, 231, 221, 232, 232,
+ 233, 234, 234, 234, 234, 234, 234, 234,
+ 234, 234, 234, 234, 234, 234, 234, 234,
+
+ 234, 234, 221, 234, 234, 234, 234, 234,
+ 234, 234, 235, 235, 236, 237, 237, 237,
+ 238, 239, 239, 239, 239, 239, 239, 239,
+ 239, 239, 239, 239, 239, 239, 239, 239,
+
+ 239, 239, 240, 239, 239, 239, 239, 239,
+ 239, 239, 241, 241, 242, 243, 243, 244,
+ 245, 246, 247, 248, 248, 249, 250, 251,
+ 252, 253, 254, 255, 254, 255, 254, 255,
+
+ 254, 255, 256, 257, 256, 257, 256, 257,
+ 256, 257, 256, 257, 256, 257, 256, 257,
+ 258, 259, 260, 261, 262, 263, 264, 265,
+ 266, 267, 265, 266, 268, 269, 269, 269,
+
+ 270, 271, 272, 273, 272, 272, 272, 273,
+ 272, 272, 272, 272, 273, 270, 273, 272,
+ 274, 274, 274, 274, 274, 274, 274, 274,
+ 274, 275, 274, 274, 274, 274, 274, 274,
+
+ 274, 274, 274, 274, 274, 274, 274, 274,
+ 274, 274, 274, 274, 274, 274, 274, 274,
+ 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 277, 276, 276, 276, 276, 276, 276,
+
+ 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276,
+ 278, 279, 280, 281, 280, 280, 280, 281,
+ 280, 280, 280, 280, 281, 278, 281, 280,
+
+ 282, 283, 282, 283, 282, 283, 282, 283,
+ 282, 283, 282, 283, 282, 283, 282, 283,
+ 282, 283, 282, 283, 282, 283, 284, 285,
+ 282, 283, 282, 283, 282, 283, 282, 283,
+
+ 282, 283, 286, 287, 287, 288, 288, 289,
+ 290, 290, 291, 292, 293, 294, 293, 294,
+ 282, 283, 282, 283, 282, 283, 282, 283,
+ 282, 283, 282, 283, 282, 283, 282, 283,
+
+ 282, 283, 282, 283, 282, 283, 282, 283,
+ 282, 283, 282, 283, 282, 283, 282, 283,
+ 282, 283, 282, 283, 282, 283, 282, 283,
+ 282, 283, 282, 283, 282, 283, 282, 283,
+
+ 295, 284, 285, 282, 283, 291, 292, 282,
+ 283, 291, 292, 282, 283, 291, 292, 296,
+ 284, 285, 284, 285, 282, 283, 284, 285,
+ 282, 283, 284, 285, 284, 285, 284, 285,
+
+ 282, 283, 284, 285, 284, 285, 284, 285,
+ 282, 283, 284, 285, 297, 298, 284, 285,
+ 284, 285, 284, 285, 284, 285, 299, 300,
+ 284, 285, 301, 302, 301, 302, 301, 302,
- 176, 176, 176, 176, 176, 177, 176, 176,
- 176, 176, 176, 176, 176, 177, 177, 176,
- 177, 176, 177, 176, 176, 178, 179, 179,
- 179, 179, 178, 180, 179, 179, 179, 179,
-
- 179, 181, 181, 182, 182, 182, 182, 183,
- 183, 179, 179, 179, 179, 182, 182, 179,
- 182, 182, 179, 179, 184, 184, 184, 184,
- 185, 179, 179, 179, 179, 177, 177, 177,
-
- 186, 186, 176, 186, 186, 187, 188, 189,
- 189, 189, 188, 188, 188, 189, 189, 190,
- 191, 191, 191, 192, 192, 192, 192, 191,
- 193, 194, 194, 195, 196, 197, 197, 198,
-
- 199, 199, 200, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 202, 203, 202, 203, 204, 205, 202, 203,
- 206, 206, 207, 208, 208, 208, 209, 210,
-
- 206, 206, 206, 206, 211, 212, 213, 214,
- 215, 215, 215, 206, 216, 206, 217, 217,
- 218, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219,
-
- 219, 219, 206, 219, 219, 219, 219, 219,
- 219, 219, 220, 220, 221, 222, 222, 222,
- 223, 224, 224, 224, 224, 224, 224, 224,
- 224, 224, 224, 224, 224, 224, 224, 224,
-
- 224, 224, 225, 224, 224, 224, 224, 224,
- 224, 224, 226, 226, 227, 228, 228, 229,
- 230, 231, 232, 233, 233, 234, 235, 236,
- 237, 238, 239, 240, 239, 240, 239, 240,
-
- 239, 240, 241, 242, 241, 242, 241, 242,
- 241, 242, 241, 242, 241, 242, 241, 242,
- 243, 244, 245, 246, 247, 248, 249, 250,
- 251, 252, 250, 251, 253, 254, 254, 254,
-
- 255, 256, 257, 256, 257, 257, 257, 256,
- 257, 257, 257, 257, 256, 255, 256, 257,
- 258, 258, 258, 258, 258, 258, 258, 258,
- 258, 259, 258, 258, 258, 258, 258, 258,
-
- 258, 258, 258, 258, 258, 258, 258, 258,
- 258, 258, 258, 258, 258, 258, 258, 258,
- 260, 260, 260, 260, 260, 260, 260, 260,
- 260, 261, 260, 260, 260, 260, 260, 260,
-
- 260, 260, 260, 260, 260, 260, 260, 260,
- 260, 260, 260, 260, 260, 260, 260, 260,
- 262, 263, 264, 263, 264, 264, 264, 263,
- 264, 264, 264, 264, 263, 262, 263, 264,
-
- 265, 266, 265, 266, 265, 266, 265, 266,
- 265, 266, 265, 266, 265, 266, 265, 266,
- 265, 266, 265, 266, 265, 266, 267, 268,
- 265, 266, 265, 266, 265, 266, 265, 266,
-
- 265, 266, 269, 270, 270, 177, 177, 271,
- 272, 272, 273, 274, 275, 276, 275, 276,
- 265, 266, 265, 266, 265, 266, 265, 266,
- 265, 266, 265, 266, 265, 266, 265, 266,
-
- 265, 266, 265, 266, 265, 266, 265, 266,
- 265, 266, 265, 266, 265, 266, 265, 266,
- 265, 266, 265, 266, 265, 266, 265, 266,
- 265, 266, 265, 266, 265, 266, 265, 266,
-
- 277, 267, 268, 265, 266, 273, 274, 265,
- 266, 273, 274, 265, 266, 273, 274, 278,
- 267, 268, 267, 268, 265, 266, 267, 268,
- 265, 266, 267, 268, 267, 268, 267, 268,
-
- 265, 266, 267, 268, 267, 268, 267, 268,
- 265, 266, 267, 268, 279, 280, 267, 268,
- 267, 268, 267, 268, 267, 268, 281, 282,
- 267, 268, 283, 284, 283, 284, 283, 284,
-
- 273, 274, 273, 274, 273, 274, 273, 274,
- 273, 274, 273, 274, 273, 274, 273, 274,
- 283, 284, 283, 284, 285, 286, 285, 286,
- 285, 286, 285, 286, 285, 286, 285, 286,
-
- 285, 286, 285, 286, 287, 288, 289, 290,
291, 292, 291, 292, 291, 292, 291, 292,
- 206, 293, 293, 293, 293, 293, 293, 293,
- 293, 293, 293, 293, 293, 293, 293, 293,
-
- 293, 293, 293, 293, 293, 293, 293, 293,
- 293, 293, 293, 293, 293, 293, 293, 293,
- 293, 293, 293, 293, 293, 293, 293, 206,
- 206, 294, 295, 295, 295, 296, 295, 297,
-
- 298, 299, 299, 299, 299, 299, 299, 299,
- 299, 299, 299, 299, 299, 299, 299, 299,
- 299, 299, 299, 299, 299, 299, 299, 299,
- 299, 299, 299, 299, 299, 299, 299, 299,
-
- 299, 299, 299, 299, 299, 299, 299, 300,
- 298, 301, 302, 206, 206, 303, 303, 304,
- 305, 306, 307, 307, 307, 307, 306, 307,
- 307, 307, 308, 306, 307, 307, 307, 307,
-
- 307, 307, 309, 306, 306, 306, 306, 306,
- 307, 307, 306, 307, 307, 308, 310, 307,
- 311, 312, 313, 314, 315, 316, 317, 318,
- 319, 320, 321, 322, 323, 324, 325, 326,
-
- 327, 328, 329, 327, 307, 309, 330, 331,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 332, 332, 332, 332, 332, 332, 332, 332,
- 332, 332, 332, 332, 332, 332, 332, 332,
-
- 332, 332, 332, 332, 332, 332, 332, 332,
- 332, 332, 332, 305, 305, 305, 305, 333,
- 332, 332, 332, 334, 335, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
-
- 336, 336, 336, 336, 337, 338, 339, 339,
- 340, 341, 341, 342, 343, 344, 345, 345,
- 346, 346, 346, 346, 346, 346, 347, 347,
- 348, 349, 350, 351, 352, 353, 354, 355,
-
- 356, 357, 358, 358, 358, 358, 359, 360,
- 361, 360, 361, 361, 361, 361, 361, 360,
- 360, 360, 360, 361, 361, 361, 361, 361,
- 361, 361, 361, 362, 362, 362, 362, 362,
-
- 363, 361, 361, 361, 361, 361, 361, 361,
- 360, 361, 361, 364, 365, 366, 367, 368,
- 369, 370, 371, 372, 372, 373, 374, 346,
- 346, 375, 375, 375, 376, 375, 375, 377,
-
- 378, 379, 380, 381, 382, 383, 384, 385,
- 386, 387, 388, 389, 390, 391, 392, 392,
- 393, 360, 360, 360, 357, 394, 394, 394,
- 395, 361, 361, 361, 361, 361, 361, 361,
-
- 361, 361, 361, 361, 361, 361, 361, 361,
- 360, 360, 360, 360, 360, 360, 360, 360,
- 360, 360, 360, 360, 360, 360, 360, 360,
- 360, 360, 361, 361, 361, 361, 361, 361,
-
- 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361,
- 396, 396, 361, 361, 361, 361, 361, 396,
-
- 358, 361, 359, 360, 360, 360, 360, 360,
- 360, 360, 360, 360, 361, 360, 361, 397,
- 361, 361, 360, 358, 398, 360, 399, 399,
- 399, 399, 399, 399, 399, 400, 401, 399,
-
- 399, 399, 399, 402, 399, 403, 403, 399,
- 399, 401, 402, 399, 399, 402, 404, 404,
- 405, 406, 407, 408, 409, 410, 411, 412,
- 413, 414, 396, 396, 396, 415, 415, 416,
-
- 417, 417, 417, 418, 418, 418, 418, 418,
- 418, 418, 418, 418, 418, 418, 419, 420,
- 421, 422, 423, 423, 423, 421, 421, 421,
- 421, 421, 423, 423, 423, 423, 421, 423,
-
- 423, 423, 423, 423, 423, 423, 423, 423,
- 421, 423, 421, 423, 421, 424, 424, 425,
- 426, 427, 426, 426, 427, 426, 426, 427,
- 427, 427, 426, 427, 427, 426, 427, 426,
-
- 426, 426, 427, 426, 427, 426, 427, 426,
- 427, 426, 426, 419, 419, 425, 424, 424,
- 428, 428, 428, 428, 428, 428, 428, 428,
- 428, 429, 429, 429, 428, 428, 428, 428,
-
- 428, 428, 428, 428, 428, 428, 428, 428,
- 428, 428, 428, 429, 429, 428, 362, 362,
- 362, 430, 362, 430, 430, 362, 362, 362,
- 430, 430, 362, 362, 362, 362, 362, 362,
-
- 431, 431, 431, 431, 431, 431, 431, 431,
- 431, 431, 431, 431, 431, 431, 431, 431,
- 431, 431, 431, 431, 431, 431, 431, 431,
- 431, 431, 431, 431, 431, 431, 431, 431,
-
- 431, 431, 431, 431, 431, 431, 432, 432,
- 432, 432, 432, 432, 432, 432, 432, 432,
- 432, 433, 419, 419, 419, 419, 419, 419,
- 419, 419, 419, 419, 419, 419, 419, 419,
-
- 434, 435, 436, 437, 438, 439, 440, 441,
- 442, 443, 444, 444, 444, 444, 444, 444,
- 444, 444, 444, 444, 444, 444, 444, 444,
- 444, 444, 444, 444, 444, 444, 444, 444,
-
- 444, 444, 444, 444, 444, 444, 444, 444,
- 444, 444, 444, 445, 445, 445, 445, 445,
- 445, 445, 446, 445, 447, 447, 448, 449,
- 450, 451, 452, 305, 305, 453, 454, 454,
-
- 455, 455, 455, 455, 455, 455, 455, 455,
- 455, 455, 455, 455, 455, 455, 455, 455,
- 455, 455, 455, 455, 455, 455, 456, 456,
- 456, 456, 457, 456, 456, 456, 456, 456,
-
- 456, 456, 456, 456, 457, 456, 456, 456,
- 457, 456, 456, 456, 456, 456, 305, 305,
- 458, 458, 458, 458, 458, 458, 458, 459,
- 458, 459, 458, 458, 458, 459, 459, 305,
-
- 460, 461, 461, 461, 461, 461, 460, 460,
- 461, 460, 461, 461, 461, 461, 461, 461,
- 461, 461, 461, 461, 460, 461, 460, 460,
- 460, 462, 462, 462, 305, 305, 463, 305,
-
- 464, 465, 464, 464, 464, 464, 465, 466,
- 464, 466, 466, 305, 305, 305, 305, 305,
- 467, 467, 467, 467, 467, 467, 467, 467,
- 467, 467, 467, 467, 467, 467, 467, 467,
-
- 467, 467, 467, 468, 468, 468, 469, 470,
- 471, 469, 469, 469, 469, 469, 467, 305,
- 472, 472, 305, 305, 305, 305, 305, 305,
- 473, 474, 474, 474, 473, 473, 473, 473,
-
- 475, 476, 475, 475, 475, 475, 475, 475,
- 475, 475, 477, 477, 477, 478, 479, 476,
- 476, 479, 479, 480, 480, 469, 481, 481,
- 481, 482, 481, 481, 481, 481, 483, 483,
-
- 483, 483, 483, 483, 483, 483, 483, 483,
- 469, 484, 473, 473, 473, 473, 473, 474,
- 474, 474, 474, 485, 486, 486, 486, 486,
- 486, 486, 486, 486, 486, 486, 486, 486,
-
- 486, 486, 487, 488, 489, 489, 490, 489,
- 489, 490, 489, 489, 489, 490, 490, 490,
- 491, 492, 493, 489, 489, 489, 490, 489,
- 489, 490, 490, 489, 489, 489, 489, 494,
-
- 495, 496, 496, 497, 498, 499, 499, 499,
- 499, 499, 499, 499, 499, 499, 499, 499,
- 499, 499, 499, 499, 499, 499, 499, 499,
- 499, 499, 499, 499, 499, 499, 499, 499,
-
- 499, 499, 499, 499, 499, 499, 499, 499,
- 499, 500, 499, 499, 499, 499, 499, 499,
- 499, 500, 499, 499, 500, 499, 499, 499,
- 499, 499, 501, 502, 503, 499, 497, 497,
-
- 497, 496, 496, 496, 496, 496, 496, 496,
- 496, 497, 497, 497, 497, 504, 505, 502,
- 499, 177, 179, 177, 177, 495, 501, 501,
- 506, 506, 506, 506, 506, 506, 506, 506,
-
- 499, 499, 496, 496, 507, 507, 508, 509,
- 510, 511, 512, 513, 514, 515, 516, 517,
- 518, 519, 520, 521, 521, 521, 521, 521,
- 522, 523, 523, 524, 524, 525, 524, 524,
-
- 526, 527, 528, 528, 206, 529, 529, 529,
- 529, 529, 529, 529, 529, 206, 206, 529,
- 529, 206, 206, 529, 529, 529, 529, 529,
- 529, 529, 529, 529, 529, 529, 529, 529,
-
- 529, 529, 529, 529, 529, 529, 529, 529,
- 529, 206, 529, 529, 529, 529, 529, 529,
- 529, 206, 529, 206, 206, 206, 529, 529,
- 529, 529, 206, 206, 530, 531, 532, 528,
-
- 528, 527, 527, 527, 527, 206, 206, 528,
- 528, 206, 206, 533, 533, 534, 535, 206,
- 206, 206, 206, 206, 206, 206, 206, 532,
- 206, 206, 206, 206, 536, 536, 206, 536,
-
- 529, 529, 527, 527, 206, 206, 537, 538,
- 539, 540, 541, 542, 543, 544, 545, 546,
- 529, 529, 547, 547, 548, 548, 548, 548,
- 548, 549, 550, 551, 552, 553, 554, 206,
-
- 206, 555, 556, 557, 206, 558, 558, 558,
- 558, 558, 558, 206, 206, 206, 206, 558,
- 558, 206, 206, 558, 558, 558, 558, 558,
- 558, 558, 558, 558, 558, 558, 558, 558,
-
- 558, 558, 558, 558, 558, 558, 558, 558,
- 558, 206, 558, 558, 558, 558, 558, 558,
- 558, 206, 558, 559, 206, 558, 559, 206,
- 558, 558, 206, 206, 560, 206, 561, 561,
-
- 561, 556, 556, 206, 206, 206, 206, 556,
- 556, 206, 206, 556, 556, 562, 206, 206,
- 206, 563, 206, 206, 206, 206, 206, 206,
- 206, 559, 559, 559, 558, 206, 559, 206,
-
- 206, 206, 206, 206, 206, 206, 564, 565,
- 566, 567, 568, 569, 570, 571, 572, 573,
- 556, 556, 558, 558, 558, 563, 574, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
-
- 206, 575, 575, 576, 206, 577, 577, 577,
- 577, 577, 577, 577, 578, 577, 206, 577,
- 577, 577, 206, 577, 577, 577, 577, 577,
+ 291, 292, 291, 292, 291, 292, 291, 292,
+ 301, 302, 301, 302, 303, 304, 303, 304,
+ 303, 304, 303, 304, 303, 304, 303, 304,
+
+ 303, 304, 303, 304, 305, 306, 307, 308,
+ 309, 310, 309, 310, 309, 310, 309, 310,
+ 221, 311, 311, 311, 311, 311, 311, 311,
+ 311, 311, 311, 311, 311, 311, 311, 311,
+
+ 311, 311, 311, 311, 311, 311, 311, 311,
+ 311, 311, 311, 311, 311, 311, 311, 311,
+ 311, 311, 311, 311, 311, 311, 311, 221,
+ 221, 312, 313, 313, 313, 314, 313, 315,
+
+ 316, 317, 317, 317, 317, 317, 317, 317,
+ 317, 317, 317, 317, 317, 317, 317, 317,
+ 317, 317, 317, 317, 317, 317, 317, 317,
+ 317, 317, 317, 317, 317, 317, 317, 317,
+
+ 317, 317, 317, 317, 317, 317, 317, 318,
+ 316, 319, 320, 221, 221, 321, 321, 322,
+ 323, 324, 325, 325, 325, 325, 324, 325,
+ 325, 325, 326, 324, 325, 325, 325, 325,
+
+ 325, 325, 327, 324, 324, 324, 324, 324,
+ 325, 325, 324, 325, 325, 326, 328, 325,
+ 329, 330, 331, 332, 333, 334, 335, 336,
+ 337, 338, 339, 340, 341, 342, 343, 344,
+
+ 345, 346, 347, 345, 325, 327, 348, 349,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 350, 350, 350, 350, 350, 350, 350, 350,
+ 350, 350, 350, 350, 350, 350, 350, 350,
+
+ 350, 350, 350, 350, 350, 350, 350, 350,
+ 350, 350, 350, 323, 323, 323, 323, 351,
+ 350, 350, 350, 352, 353, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+
+ 354, 354, 354, 354, 355, 356, 357, 357,
+ 358, 359, 359, 360, 361, 362, 363, 363,
+ 364, 364, 364, 364, 364, 364, 365, 365,
+ 366, 367, 368, 369, 370, 371, 372, 373,
+
+ 374, 375, 376, 376, 376, 376, 377, 378,
+ 379, 378, 379, 379, 379, 379, 379, 378,
+ 378, 378, 378, 379, 379, 379, 379, 379,
+ 379, 379, 379, 380, 380, 380, 380, 380,
+
+ 381, 379, 379, 379, 379, 379, 379, 379,
+ 378, 379, 379, 382, 383, 384, 385, 386,
+ 387, 388, 389, 390, 390, 391, 392, 364,
+ 364, 393, 393, 393, 394, 393, 393, 395,
+
+ 396, 397, 398, 399, 400, 401, 402, 403,
+ 404, 405, 406, 407, 408, 409, 410, 410,
+ 411, 378, 378, 378, 375, 412, 412, 412,
+ 413, 379, 379, 379, 379, 379, 379, 379,
+
+ 379, 379, 379, 379, 379, 379, 379, 379,
+ 378, 378, 378, 378, 378, 378, 378, 378,
+ 378, 378, 378, 378, 378, 378, 378, 378,
+ 378, 378, 379, 379, 379, 379, 379, 379,
+
+ 379, 379, 379, 379, 379, 379, 379, 379,
+ 379, 379, 379, 379, 379, 379, 379, 379,
+ 379, 379, 379, 379, 379, 379, 379, 379,
+ 414, 414, 379, 379, 379, 379, 379, 414,
+
+ 376, 379, 377, 378, 378, 378, 378, 378,
+ 378, 378, 378, 378, 379, 378, 379, 415,
+ 379, 379, 378, 376, 416, 378, 417, 417,
+ 417, 417, 417, 417, 417, 418, 419, 417,
+
+ 417, 417, 417, 420, 417, 421, 421, 417,
+ 417, 419, 420, 417, 417, 420, 422, 422,
+ 423, 424, 425, 426, 427, 428, 429, 430,
+ 431, 432, 414, 414, 414, 433, 433, 434,
+
+ 435, 435, 435, 436, 436, 436, 436, 436,
+ 436, 436, 436, 436, 436, 436, 437, 438,
+ 439, 440, 441, 441, 441, 439, 439, 439,
+ 439, 439, 441, 441, 441, 441, 439, 441,
+
+ 441, 441, 441, 441, 441, 441, 441, 441,
+ 439, 441, 439, 441, 439, 442, 442, 443,
+ 444, 445, 444, 444, 445, 444, 444, 445,
+ 445, 445, 444, 445, 445, 444, 445, 444,
+
+ 444, 444, 445, 444, 445, 444, 445, 444,
+ 445, 444, 444, 437, 437, 443, 442, 442,
+ 446, 446, 446, 446, 446, 446, 446, 446,
+ 446, 447, 447, 447, 446, 446, 446, 446,
+
+ 446, 446, 446, 446, 446, 446, 446, 446,
+ 446, 446, 446, 447, 447, 446, 380, 380,
+ 380, 448, 380, 448, 448, 380, 380, 380,
+ 448, 448, 380, 380, 380, 380, 380, 380,
+
+ 449, 449, 449, 449, 449, 449, 449, 449,
+ 449, 449, 449, 449, 449, 449, 449, 449,
+ 449, 449, 449, 449, 449, 449, 449, 449,
+ 449, 449, 449, 449, 449, 449, 449, 449,
+
+ 449, 449, 449, 449, 449, 449, 450, 450,
+ 450, 450, 450, 450, 450, 450, 450, 450,
+ 450, 451, 437, 437, 437, 437, 437, 437,
+ 437, 437, 437, 437, 437, 437, 437, 437,
+
+ 452, 453, 454, 455, 456, 457, 458, 459,
+ 460, 461, 462, 462, 462, 462, 462, 462,
+ 462, 462, 462, 462, 462, 462, 462, 462,
+ 462, 462, 462, 462, 462, 462, 462, 462,
+
+ 462, 462, 462, 462, 462, 462, 462, 462,
+ 462, 462, 462, 463, 463, 463, 463, 463,
+ 463, 463, 464, 463, 465, 465, 466, 467,
+ 468, 469, 470, 323, 323, 471, 472, 472,
+
+ 473, 473, 473, 473, 473, 473, 473, 473,
+ 473, 473, 473, 473, 473, 473, 473, 473,
+ 473, 473, 473, 473, 473, 473, 474, 474,
+ 474, 474, 475, 474, 474, 474, 474, 474,
+
+ 474, 474, 474, 474, 475, 474, 474, 474,
+ 475, 474, 474, 474, 474, 474, 323, 323,
+ 476, 476, 476, 476, 476, 476, 476, 477,
+ 476, 477, 476, 476, 476, 477, 477, 323,
+
+ 478, 479, 479, 479, 479, 479, 478, 478,
+ 479, 478, 479, 479, 479, 479, 479, 479,
+ 479, 479, 479, 479, 478, 479, 478, 478,
+ 478, 480, 480, 480, 323, 323, 481, 323,
+
+ 482, 483, 482, 482, 482, 482, 483, 484,
+ 482, 484, 484, 323, 323, 323, 323, 323,
+ 485, 485, 485, 485, 485, 485, 485, 485,
+ 485, 485, 485, 485, 485, 485, 485, 485,
+
+ 485, 485, 485, 486, 486, 486, 487, 488,
+ 489, 487, 487, 487, 487, 487, 485, 323,
+ 490, 490, 323, 323, 323, 323, 323, 323,
+ 491, 492, 492, 492, 491, 491, 491, 491,
+
+ 493, 494, 493, 493, 493, 493, 493, 493,
+ 493, 493, 495, 495, 495, 496, 497, 494,
+ 494, 497, 497, 498, 498, 487, 499, 499,
+ 499, 500, 499, 499, 499, 499, 501, 501,
+
+ 501, 501, 501, 501, 501, 501, 501, 501,
+ 487, 502, 491, 491, 491, 491, 491, 492,
+ 492, 492, 492, 503, 504, 504, 504, 504,
+ 504, 504, 504, 504, 504, 504, 504, 504,
+
+ 504, 504, 505, 506, 507, 507, 508, 507,
+ 507, 508, 507, 507, 507, 508, 508, 508,
+ 509, 510, 511, 507, 507, 507, 508, 507,
+ 507, 508, 508, 507, 507, 507, 507, 512,
+
+ 513, 514, 514, 515, 516, 517, 517, 517,
+ 517, 517, 517, 517, 517, 517, 517, 517,
+ 517, 517, 517, 517, 517, 517, 517, 517,
+ 517, 517, 517, 517, 517, 517, 517, 517,
+
+ 517, 517, 517, 517, 517, 517, 517, 517,
+ 517, 518, 517, 517, 517, 517, 517, 517,
+ 517, 518, 517, 517, 518, 517, 517, 517,
+ 517, 517, 519, 520, 521, 517, 515, 515,
+
+ 515, 514, 514, 514, 514, 514, 514, 514,
+ 514, 515, 515, 515, 515, 522, 523, 520,
+ 517, 288, 524, 288, 288, 513, 519, 519,
+ 525, 525, 525, 525, 525, 525, 525, 525,
+
+ 517, 517, 514, 514, 526, 526, 527, 528,
+ 529, 530, 531, 532, 533, 534, 535, 536,
+ 537, 538, 539, 540, 540, 540, 540, 540,
+ 541, 542, 542, 543, 543, 544, 543, 543,
+
+ 545, 546, 547, 547, 221, 548, 548, 548,
+ 548, 548, 548, 548, 548, 221, 221, 548,
+ 548, 221, 221, 548, 548, 548, 548, 548,
+ 548, 548, 548, 548, 548, 548, 548, 548,
+
+ 548, 548, 548, 548, 548, 548, 548, 548,
+ 548, 221, 548, 548, 548, 548, 548, 548,
+ 548, 221, 548, 221, 221, 221, 548, 548,
+ 548, 548, 221, 221, 549, 550, 551, 547,
+
+ 547, 546, 546, 546, 546, 221, 221, 547,
+ 547, 221, 221, 552, 552, 553, 554, 221,
+ 221, 221, 221, 221, 221, 221, 221, 551,
+ 221, 221, 221, 221, 555, 555, 221, 555,
+
+ 548, 548, 546, 546, 221, 221, 556, 557,
+ 558, 559, 560, 561, 562, 563, 564, 565,
+ 548, 548, 566, 566, 567, 567, 567, 567,
+ 567, 568, 569, 570, 571, 572, 573, 221,
+
+ 221, 574, 575, 576, 221, 577, 577, 577,
+ 577, 577, 577, 221, 221, 221, 221, 577,
+ 577, 221, 221, 577, 577, 577, 577, 577,
577, 577, 577, 577, 577, 577, 577, 577,
577, 577, 577, 577, 577, 577, 577, 577,
- 577, 206, 577, 577, 577, 577, 577, 577,
- 577, 206, 577, 577, 206, 577, 577, 577,
- 577, 577, 206, 206, 579, 577, 576, 576,
-
- 576, 575, 575, 575, 575, 575, 206, 575,
- 575, 576, 206, 576, 576, 580, 206, 206,
- 577, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
-
- 577, 578, 581, 581, 206, 206, 582, 583,
- 584, 585, 586, 587, 588, 589, 590, 591,
- 592, 593, 206, 206, 206, 206, 206, 206,
- 206, 594, 595, 595, 595, 595, 595, 595,
-
- 206, 596, 597, 597, 206, 598, 598, 598,
- 598, 598, 598, 598, 598, 206, 206, 598,
- 598, 206, 206, 598, 598, 598, 598, 598,
- 598, 598, 598, 598, 598, 598, 598, 598,
-
- 598, 598, 598, 598, 598, 598, 598, 598,
- 598, 206, 598, 598, 598, 598, 598, 598,
- 598, 206, 598, 598, 206, 599, 598, 598,
- 598, 598, 206, 206, 600, 598, 601, 596,
-
- 597, 596, 596, 596, 602, 206, 206, 597,
- 603, 206, 206, 603, 603, 604, 206, 206,
- 206, 206, 206, 206, 206, 605, 606, 601,
- 206, 206, 206, 206, 607, 607, 206, 598,
-
- 598, 598, 602, 602, 206, 206, 608, 609,
- 610, 611, 612, 613, 614, 615, 616, 617,
- 618, 599, 619, 619, 619, 619, 619, 619,
- 206, 206, 206, 206, 206, 206, 206, 206,
-
- 206, 206, 620, 621, 206, 621, 621, 621,
- 621, 621, 621, 206, 206, 206, 621, 621,
- 621, 206, 621, 621, 622, 621, 206, 206,
- 206, 621, 621, 206, 621, 206, 621, 621,
-
- 206, 206, 206, 621, 621, 206, 206, 206,
- 621, 621, 621, 206, 206, 206, 621, 621,
- 621, 621, 621, 621, 621, 621, 623, 621,
- 621, 621, 206, 206, 206, 206, 624, 625,
-
- 620, 625, 625, 206, 206, 206, 625, 625,
- 625, 206, 626, 626, 626, 627, 206, 206,
- 628, 206, 206, 206, 206, 206, 206, 624,
- 206, 206, 206, 206, 206, 206, 206, 206,
-
- 206, 206, 206, 206, 206, 206, 629, 630,
- 631, 632, 633, 634, 635, 636, 637, 638,
- 639, 639, 639, 640, 640, 640, 640, 640,
- 640, 641, 640, 206, 206, 206, 206, 206,
-
- 642, 643, 643, 643, 644, 645, 645, 645,
- 645, 645, 645, 645, 645, 206, 645, 645,
- 645, 206, 645, 645, 645, 645, 645, 645,
- 645, 645, 645, 645, 645, 645, 645, 645,
-
- 645, 645, 645, 645, 645, 645, 645, 645,
- 645, 206, 645, 645, 645, 645, 645, 645,
- 645, 645, 645, 645, 646, 645, 645, 645,
- 645, 645, 206, 206, 647, 648, 649, 649,
-
- 649, 643, 643, 643, 643, 206, 649, 649,
- 650, 206, 649, 649, 649, 651, 206, 206,
- 206, 206, 206, 206, 206, 652, 653, 206,
- 648, 648, 654, 206, 206, 655, 206, 206,
-
- 645, 645, 656, 656, 206, 206, 657, 658,
- 659, 660, 661, 662, 663, 664, 665, 666,
- 206, 206, 206, 206, 206, 206, 206, 667,
- 668, 668, 668, 668, 668, 668, 668, 669,
-
- 670, 671, 672, 672, 673, 674, 674, 674,
- 674, 674, 674, 674, 674, 206, 674, 674,
- 674, 206, 674, 674, 674, 674, 674, 674,
- 674, 674, 674, 674, 674, 674, 674, 674,
-
- 674, 674, 674, 674, 674, 674, 674, 674,
- 674, 206, 674, 674, 674, 674, 674, 674,
- 674, 674, 674, 674, 206, 674, 674, 674,
- 674, 674, 206, 206, 675, 676, 672, 677,
-
- 678, 672, 679, 672, 672, 206, 677, 678,
- 678, 206, 678, 678, 680, 681, 206, 206,
- 206, 206, 206, 206, 206, 679, 679, 206,
- 206, 206, 206, 206, 206, 682, 674, 206,
-
- 674, 674, 683, 683, 206, 206, 684, 685,
- 686, 687, 688, 689, 690, 691, 692, 693,
- 206, 694, 694, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
-
- 695, 696, 697, 697, 698, 699, 699, 699,
- 699, 699, 699, 699, 699, 206, 699, 699,
- 699, 206, 699, 699, 699, 699, 699, 699,
- 699, 699, 699, 699, 699, 699, 699, 699,
-
- 699, 699, 699, 699, 699, 699, 699, 699,
- 699, 700, 699, 699, 699, 699, 699, 699,
- 699, 699, 699, 699, 699, 699, 699, 699,
- 699, 699, 700, 701, 701, 702, 703, 697,
-
- 697, 704, 704, 704, 705, 206, 697, 697,
- 697, 206, 706, 706, 706, 707, 708, 709,
- 206, 206, 206, 206, 710, 710, 710, 703,
- 711, 711, 711, 711, 711, 711, 711, 712,
-
- 699, 699, 705, 705, 206, 206, 713, 714,
- 715, 716, 717, 718, 719, 720, 721, 722,
- 723, 723, 723, 723, 723, 723, 711, 711,
- 711, 724, 702, 702, 702, 702, 702, 702,
-
- 206, 725, 726, 726, 206, 727, 727, 727,
- 727, 727, 727, 727, 727, 727, 727, 727,
- 727, 727, 727, 727, 727, 727, 727, 206,
- 206, 206, 727, 727, 727, 727, 727, 727,
-
- 727, 727, 727, 727, 727, 727, 727, 727,
- 727, 727, 727, 727, 727, 727, 727, 727,
- 727, 727, 206, 727, 727, 727, 727, 727,
- 727, 727, 727, 727, 206, 727, 206, 206,
-
- 727, 727, 727, 727, 727, 727, 727, 206,
- 206, 206, 728, 206, 206, 206, 206, 729,
- 726, 726, 730, 730, 730, 206, 730, 206,
- 726, 726, 731, 726, 731, 731, 731, 729,
-
- 206, 206, 206, 206, 206, 206, 732, 733,
- 734, 735, 736, 737, 738, 739, 740, 741,
- 206, 206, 726, 726, 742, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
-
- 206, 743, 743, 743, 743, 743, 743, 743,
- 743, 743, 743, 743, 743, 743, 743, 743,
- 743, 743, 743, 743, 743, 743, 743, 743,
- 743, 743, 743, 743, 743, 743, 743, 743,
-
- 743, 743, 743, 743, 743, 743, 743, 743,
- 743, 743, 743, 743, 743, 743, 743, 743,
- 743, 744, 743, 745, 744, 744, 744, 744,
- 746, 746, 747, 206, 206, 206, 206, 51,
-
- 743, 743, 743, 743, 743, 743, 748, 744,
- 749, 749, 749, 749, 744, 744, 744, 750,
- 751, 752, 753, 754, 755, 756, 757, 758,
- 759, 760, 761, 761, 206, 206, 206, 206,
-
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
-
- 206, 762, 762, 206, 762, 206, 763, 762,
- 762, 763, 762, 206, 763, 762, 763, 763,
- 763, 763, 763, 763, 762, 762, 762, 762,
- 763, 762, 762, 762, 762, 762, 762, 762,
-
- 763, 762, 762, 762, 206, 762, 206, 762,
- 763, 763, 762, 762, 763, 762, 762, 762,
- 762, 764, 762, 765, 764, 764, 764, 764,
- 766, 766, 767, 764, 764, 762, 206, 206,
-
- 762, 762, 762, 762, 762, 206, 768, 206,
- 769, 769, 769, 769, 764, 764, 206, 206,
- 770, 771, 772, 773, 774, 775, 776, 777,
- 778, 779, 206, 206, 780, 780, 781, 781,
-
- 782, 783, 783, 783, 784, 785, 784, 784,
- 786, 784, 784, 787, 788, 789, 789, 789,
- 789, 789, 786, 790, 789, 790, 790, 790,
- 791, 791, 790, 790, 790, 790, 790, 790,
-
+ 577, 221, 577, 577, 577, 577, 577, 577,
+ 577, 221, 577, 578, 221, 577, 578, 221,
+ 577, 577, 221, 221, 579, 221, 580, 580,
+
+ 580, 575, 575, 221, 221, 221, 221, 575,
+ 575, 221, 221, 575, 575, 581, 221, 221,
+ 221, 582, 221, 221, 221, 221, 221, 221,
+ 221, 578, 578, 578, 577, 221, 578, 221,
+
+ 221, 221, 221, 221, 221, 221, 583, 584,
+ 585, 586, 587, 588, 589, 590, 591, 592,
+ 575, 575, 577, 577, 577, 582, 593, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 221, 594, 594, 595, 221, 596, 596, 596,
+ 596, 596, 596, 596, 597, 596, 221, 596,
+ 596, 596, 221, 596, 596, 596, 596, 596,
+ 596, 596, 596, 596, 596, 596, 596, 596,
+
+ 596, 596, 596, 596, 596, 596, 596, 596,
+ 596, 221, 596, 596, 596, 596, 596, 596,
+ 596, 221, 596, 596, 221, 596, 596, 596,
+ 596, 596, 221, 221, 598, 596, 595, 595,
+
+ 595, 594, 594, 594, 594, 594, 221, 594,
+ 594, 595, 221, 595, 595, 599, 221, 221,
+ 596, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 596, 597, 600, 600, 221, 221, 601, 602,
+ 603, 604, 605, 606, 607, 608, 609, 610,
+ 611, 612, 221, 221, 221, 221, 221, 221,
+ 221, 613, 614, 614, 614, 614, 614, 614,
+
+ 221, 615, 616, 616, 221, 617, 617, 617,
+ 617, 617, 617, 617, 617, 221, 221, 617,
+ 617, 221, 221, 617, 617, 617, 617, 617,
+ 617, 617, 617, 617, 617, 617, 617, 617,
+
+ 617, 617, 617, 617, 617, 617, 617, 617,
+ 617, 221, 617, 617, 617, 617, 617, 617,
+ 617, 221, 617, 617, 221, 618, 617, 617,
+ 617, 617, 221, 221, 619, 617, 620, 615,
+
+ 616, 615, 615, 615, 621, 221, 221, 616,
+ 622, 221, 221, 622, 622, 623, 221, 221,
+ 221, 221, 221, 221, 221, 624, 625, 620,
+ 221, 221, 221, 221, 626, 626, 221, 617,
+
+ 617, 617, 621, 621, 221, 221, 627, 628,
+ 629, 630, 631, 632, 633, 634, 635, 636,
+ 637, 618, 638, 638, 638, 638, 638, 638,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 221, 221, 639, 640, 221, 640, 640, 640,
+ 640, 640, 640, 221, 221, 221, 640, 640,
+ 640, 221, 640, 640, 641, 640, 221, 221,
+ 221, 640, 640, 221, 640, 221, 640, 640,
+
+ 221, 221, 221, 640, 640, 221, 221, 221,
+ 640, 640, 640, 221, 221, 221, 640, 640,
+ 640, 640, 640, 640, 640, 640, 642, 640,
+ 640, 640, 221, 221, 221, 221, 643, 644,
+
+ 639, 644, 644, 221, 221, 221, 644, 644,
+ 644, 221, 645, 645, 645, 646, 221, 221,
+ 647, 221, 221, 221, 221, 221, 221, 643,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 221, 221, 221, 221, 221, 221, 648, 649,
+ 650, 651, 652, 653, 654, 655, 656, 657,
+ 658, 658, 658, 659, 659, 659, 659, 659,
+ 659, 660, 659, 221, 221, 221, 221, 221,
+
+ 661, 662, 662, 662, 663, 664, 664, 664,
+ 664, 664, 664, 664, 664, 221, 664, 664,
+ 664, 221, 664, 664, 664, 664, 664, 664,
+ 664, 664, 664, 664, 664, 664, 664, 664,
+
+ 664, 664, 664, 664, 664, 664, 664, 664,
+ 664, 221, 664, 664, 664, 664, 664, 664,
+ 664, 664, 664, 664, 665, 664, 664, 664,
+ 664, 664, 221, 221, 666, 667, 668, 668,
+
+ 668, 662, 662, 662, 662, 221, 668, 668,
+ 669, 221, 668, 668, 668, 670, 221, 221,
+ 221, 221, 221, 221, 221, 671, 672, 221,
+ 667, 667, 673, 221, 221, 674, 221, 221,
+
+ 664, 664, 675, 675, 221, 221, 676, 677,
+ 678, 679, 680, 681, 682, 683, 684, 685,
+ 221, 221, 221, 221, 221, 221, 221, 686,
+ 687, 687, 687, 687, 687, 687, 687, 688,
+
+ 689, 690, 691, 691, 692, 693, 693, 693,
+ 693, 693, 693, 693, 693, 221, 693, 693,
+ 693, 221, 693, 693, 693, 693, 693, 693,
+ 693, 693, 693, 693, 693, 693, 693, 693,
+
+ 693, 693, 693, 693, 693, 693, 693, 693,
+ 693, 221, 693, 693, 693, 693, 693, 693,
+ 693, 693, 693, 693, 221, 693, 693, 693,
+ 693, 693, 221, 221, 694, 695, 691, 696,
+
+ 697, 691, 698, 691, 691, 221, 696, 697,
+ 697, 221, 697, 697, 699, 700, 221, 221,
+ 221, 221, 221, 221, 221, 698, 698, 221,
+ 221, 221, 221, 221, 221, 701, 693, 221,
+
+ 693, 693, 702, 702, 221, 221, 703, 704,
+ 705, 706, 707, 708, 709, 710, 711, 712,
+ 221, 713, 713, 714, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 715, 716, 717, 717, 718, 719, 719, 719,
+ 719, 719, 719, 719, 719, 221, 719, 719,
+ 719, 221, 719, 719, 719, 719, 719, 719,
+ 719, 719, 719, 719, 719, 719, 719, 719,
+
+ 719, 719, 719, 719, 719, 719, 719, 719,
+ 719, 720, 719, 719, 719, 719, 719, 719,
+ 719, 719, 719, 719, 719, 719, 719, 719,
+ 719, 719, 720, 721, 721, 722, 723, 717,
+
+ 717, 724, 724, 724, 725, 221, 717, 717,
+ 717, 221, 726, 726, 726, 727, 728, 729,
+ 221, 221, 221, 221, 730, 730, 730, 723,
+ 731, 731, 731, 731, 731, 731, 731, 732,
+
+ 719, 719, 725, 725, 221, 221, 733, 734,
+ 735, 736, 737, 738, 739, 740, 741, 742,
+ 743, 743, 743, 743, 743, 743, 731, 731,
+ 731, 744, 722, 722, 722, 722, 722, 722,
+
+ 221, 745, 746, 746, 221, 747, 747, 747,
+ 747, 747, 747, 747, 747, 747, 747, 747,
+ 747, 747, 747, 747, 747, 747, 747, 221,
+ 221, 221, 747, 747, 747, 747, 747, 747,
+
+ 747, 747, 747, 747, 747, 747, 747, 747,
+ 747, 747, 747, 747, 747, 747, 747, 747,
+ 747, 747, 221, 747, 747, 747, 747, 747,
+ 747, 747, 747, 747, 221, 747, 221, 221,
+
+ 747, 747, 747, 747, 747, 747, 747, 221,
+ 221, 221, 748, 221, 221, 221, 221, 749,
+ 746, 746, 750, 750, 750, 221, 750, 221,
+ 746, 746, 751, 746, 751, 751, 751, 749,
+
+ 221, 221, 221, 221, 221, 221, 752, 753,
+ 754, 755, 756, 757, 758, 759, 760, 761,
+ 221, 221, 746, 746, 762, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 221, 763, 763, 763, 763, 763, 763, 763,
+ 763, 763, 763, 763, 763, 763, 763, 763,
+ 763, 763, 763, 763, 763, 763, 763, 763,
+ 763, 763, 763, 763, 763, 763, 763, 763,
+
+ 763, 763, 763, 763, 763, 763, 763, 763,
+ 763, 763, 763, 763, 763, 763, 763, 763,
+ 763, 764, 763, 765, 764, 764, 764, 764,
+ 766, 766, 767, 221, 221, 221, 221, 768,
+
+ 763, 763, 763, 763, 763, 763, 769, 764,
+ 770, 770, 770, 770, 764, 764, 764, 771,
+ 772, 773, 774, 775, 776, 777, 778, 779,
+ 780, 781, 782, 782, 221, 221, 221, 221,
+
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 221, 783, 783, 221, 783, 221, 784, 783,
+ 783, 784, 783, 221, 784, 783, 784, 784,
+ 784, 784, 784, 784, 783, 783, 783, 783,
+ 784, 783, 783, 783, 783, 783, 783, 783,
+
+ 784, 783, 783, 783, 221, 783, 221, 783,
+ 784, 784, 783, 783, 784, 783, 783, 783,
+ 783, 785, 783, 786, 785, 785, 785, 785,
+ 787, 787, 788, 785, 785, 783, 221, 221,
+
+ 783, 783, 783, 783, 783, 221, 789, 221,
+ 790, 790, 790, 790, 785, 785, 791, 221,
792, 793, 794, 795, 796, 797, 798, 799,
- 800, 801, 802, 802, 802, 802, 802, 802,
- 802, 802, 802, 802, 803, 791, 790, 791,
- 790, 804, 805, 806, 805, 806, 807, 807,
-
- 782, 782, 782, 808, 782, 782, 782, 782,
- 206, 782, 782, 782, 782, 808, 782, 782,
- 782, 782, 808, 782, 782, 782, 782, 808,
- 782, 782, 782, 782, 808, 782, 782, 782,
-
- 782, 782, 782, 782, 782, 782, 782, 782,
- 782, 808, 809, 810, 810, 206, 206, 206,
- 206, 811, 812, 813, 814, 813, 813, 815,
- 813, 815, 812, 812, 812, 812, 816, 817,
-
- 812, 813, 818, 818, 819, 787, 818, 818,
- 782, 782, 782, 782, 820, 821, 821, 821,
- 816, 816, 816, 813, 816, 816, 822, 816,
- 206, 816, 816, 816, 816, 813, 816, 816,
-
- 816, 816, 813, 816, 816, 816, 816, 813,
- 816, 816, 816, 816, 813, 816, 822, 822,
- 822, 816, 816, 816, 816, 816, 816, 816,
- 822, 813, 822, 822, 822, 206, 823, 823,
-
- 824, 824, 824, 824, 824, 824, 825, 824,
- 824, 824, 824, 824, 824, 206, 826, 824,
- 827, 827, 828, 829, 830, 831, 831, 831,
- 831, 832, 832, 206, 206, 206, 206, 206,
-
- 833, 833, 833, 833, 833, 833, 833, 833,
- 833, 833, 833, 833, 833, 833, 833, 833,
- 833, 833, 833, 833, 833, 833, 833, 833,
- 833, 833, 833, 833, 833, 833, 833, 833,
-
- 833, 833, 834, 833, 833, 833, 835, 833,
- 834, 833, 833, 836, 837, 838, 839, 838,
- 838, 840, 838, 841, 841, 841, 838, 842,
- 837, 843, 844, 845, 845, 841, 841, 834,
-
- 846, 847, 848, 849, 850, 851, 852, 853,
- 854, 855, 856, 856, 857, 857, 857, 857,
- 833, 833, 833, 833, 833, 833, 840, 840,
- 838, 838, 834, 834, 834, 834, 841, 841,
-
- 841, 834, 836, 836, 836, 834, 834, 836,
- 836, 836, 836, 836, 836, 836, 834, 834,
- 834, 841, 841, 841, 841, 834, 834, 834,
- 834, 834, 834, 834, 834, 834, 834, 834,
-
- 834, 834, 841, 836, 845, 841, 841, 836,
- 836, 836, 836, 836, 836, 858, 834, 836,
- 859, 860, 861, 862, 863, 864, 865, 866,
- 867, 868, 869, 869, 869, 870, 871, 871,
-
- 872, 872, 872, 872, 872, 872, 872, 872,
- 872, 872, 872, 872, 872, 872, 872, 872,
- 872, 872, 872, 872, 872, 872, 872, 872,
- 872, 872, 872, 872, 872, 872, 872, 872,
-
- 872, 872, 872, 872, 872, 872, 206, 873,
- 206, 206, 206, 206, 206, 873, 206, 206,
- 874, 874, 874, 874, 874, 874, 874, 874,
- 874, 874, 874, 874, 874, 874, 874, 874,
-
- 874, 874, 874, 874, 874, 874, 874, 874,
- 874, 874, 874, 874, 874, 874, 874, 874,
- 874, 874, 874, 874, 874, 874, 874, 875,
- 875, 876, 876, 877, 878, 879, 879, 879,
-
- 880, 880, 880, 880, 880, 880, 880, 880,
- 880, 880, 880, 880, 880, 880, 880, 880,
- 880, 880, 880, 880, 880, 880, 880, 880,
- 880, 880, 880, 880, 880, 880, 880, 880,
-
- 880, 880, 880, 880, 880, 880, 880, 880,
- 880, 880, 880, 880, 880, 880, 880, 880,
- 880, 880, 880, 880, 880, 880, 880, 880,
- 880, 880, 881, 881, 881, 881, 881, 882,
-
- 883, 884, 884, 884, 884, 884, 884, 884,
- 884, 884, 884, 884, 884, 884, 884, 884,
- 884, 884, 884, 884, 884, 884, 885, 885,
- 885, 885, 885, 885, 885, 885, 885, 885,
-
- 885, 885, 885, 885, 885, 885, 885, 885,
- 885, 885, 885, 885, 885, 885, 885, 885,
- 885, 885, 885, 885, 885, 885, 885, 885,
- 885, 885, 885, 885, 885, 885, 885, 885,
-
- 885, 885, 885, 886, 886, 886, 886, 886,
- 887, 887, 887, 887, 887, 887, 887, 887,
- 887, 887, 887, 887, 887, 887, 887, 887,
- 887, 887, 887, 887, 887, 887, 887, 887,
-
- 887, 887, 887, 888, 888, 888, 888, 888,
- 888, 888, 888, 888, 888, 888, 888, 888,
- 888, 888, 888, 888, 888, 888, 888, 888,
- 888, 888, 888, 888, 888, 888, 888, 888,
-
- 888, 888, 888, 888, 888, 888, 888, 888,
- 888, 888, 888, 888, 888, 888, 888, 888,
- 888, 888, 888, 888, 888, 888, 888, 888,
- 888, 888, 889, 889, 889, 889, 889, 889,
-
- 890, 890, 890, 890, 890, 890, 890, 891,
- 890, 890, 890, 890, 890, 890, 890, 890,
- 890, 890, 890, 890, 890, 890, 890, 890,
- 890, 890, 890, 890, 890, 890, 890, 890,
-
- 890, 890, 890, 890, 890, 890, 890, 890,
- 890, 890, 890, 890, 890, 890, 890, 890,
- 890, 890, 890, 890, 890, 890, 890, 890,
- 890, 890, 890, 890, 890, 890, 890, 890,
-
- 890, 890, 890, 890, 890, 890, 890, 891,
- 890, 206, 890, 890, 890, 890, 206, 206,
- 890, 890, 890, 890, 890, 890, 890, 206,
- 890, 206, 890, 890, 890, 890, 206, 206,
-
- 890, 890, 890, 890, 890, 890, 890, 891,
- 890, 206, 890, 890, 890, 890, 206, 206,
- 890, 890, 890, 890, 890, 890, 890, 890,
- 890, 890, 890, 890, 890, 890, 890, 890,
-
- 890, 890, 890, 890, 890, 890, 890, 890,
- 890, 890, 890, 890, 890, 890, 890, 891,
- 890, 206, 890, 890, 890, 890, 206, 206,
- 890, 890, 890, 890, 890, 890, 890, 206,
-
- 890, 206, 890, 890, 890, 890, 206, 206,
- 890, 890, 890, 890, 890, 890, 890, 891,
- 890, 890, 890, 890, 890, 890, 890, 206,
- 890, 890, 890, 890, 890, 890, 890, 890,
-
- 890, 890, 890, 890, 890, 890, 890, 890,
- 890, 890, 890, 890, 890, 890, 890, 891,
- 890, 890, 890, 890, 890, 890, 890, 890,
- 890, 890, 890, 890, 890, 890, 890, 890,
-
- 890, 890, 890, 890, 890, 890, 890, 890,
- 890, 890, 890, 890, 890, 890, 890, 891,
- 890, 206, 890, 890, 890, 890, 206, 206,
- 890, 890, 890, 890, 890, 890, 890, 891,
-
- 890, 890, 890, 890, 890, 890, 890, 891,
- 890, 890, 890, 890, 890, 890, 890, 890,
- 890, 890, 890, 890, 890, 890, 890, 890,
- 890, 890, 890, 206, 206, 892, 892, 893,
-
- 894, 895, 896, 897, 897, 897, 897, 896,
- 896, 898, 899, 900, 901, 902, 903, 904,
- 905, 906, 907, 907, 907, 907, 907, 907,
- 907, 907, 907, 907, 907, 206, 206, 206,
-
- 891, 891, 891, 891, 891, 891, 891, 891,
- 891, 891, 891, 891, 891, 891, 891, 891,
- 908, 908, 908, 908, 908, 908, 908, 908,
- 908, 908, 206, 206, 206, 206, 206, 206,
-
- 909, 910, 911, 912, 913, 914, 915, 916,
- 917, 918, 919, 920, 921, 922, 923, 924,
- 925, 926, 927, 928, 929, 930, 931, 932,
- 933, 934, 935, 936, 937, 938, 939, 940,
-
- 941, 942, 943, 944, 945, 946, 947, 948,
- 949, 950, 951, 952, 953, 954, 955, 956,
- 957, 958, 959, 960, 961, 962, 963, 964,
- 965, 966, 967, 968, 969, 970, 971, 972,
-
- 973, 974, 975, 976, 977, 978, 979, 980,
- 981, 982, 983, 984, 985, 986, 987, 988,
- 989, 989, 989, 989, 989, 990, 206, 206,
- 991, 991, 991, 991, 991, 991, 206, 206,
-
- 992, 993, 993, 993, 993, 993, 993, 993,
- 993, 993, 993, 993, 993, 993, 993, 993,
- 993, 993, 993, 993, 993, 993, 993, 993,
- 993, 993, 993, 993, 993, 993, 993, 993,
-
- 993, 993, 993, 993, 993, 993, 993, 993,
- 993, 993, 993, 993, 993, 993, 993, 993,
- 993, 993, 993, 993, 993, 993, 993, 993,
- 993, 993, 993, 993, 993, 993, 993, 993,
-
- 993, 993, 993, 993, 993, 993, 993, 993,
- 993, 993, 993, 993, 993, 994, 995, 993,
- 993, 993, 993, 993, 993, 993, 993, 996,
- 996, 996, 996, 996, 996, 996, 996, 996,
-
- 997, 998, 998, 998, 998, 998, 998, 998,
- 998, 998, 998, 998, 998, 998, 998, 998,
- 998, 998, 998, 998, 998, 998, 998, 998,
- 998, 998, 998, 999, 1000, 206, 206, 206,
-
- 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001,
- 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001,
- 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001,
- 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001,
-
- 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001,
- 1001, 1001, 1001, 1002, 1002, 1002, 1003, 1003,
- 1003, 1004, 1004, 1004, 1004, 1004, 1004, 1004,
- 1004, 206, 206, 206, 206, 206, 206, 206,
-
- 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005,
- 1005, 1005, 1005, 1005, 1005, 1006, 1005, 1005,
- 1005, 1005, 1007, 1007, 1008, 1009, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 1006,
-
- 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010,
- 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010,
- 1010, 1010, 1011, 1011, 1012, 1013, 1013, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
-
- 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014,
- 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014,
- 1014, 1014, 1015, 1015, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
-
- 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016,
- 1016, 1016, 1016, 1016, 1016, 206, 1016, 1016,
- 1016, 206, 1017, 1017, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
+ 800, 801, 221, 221, 802, 802, 803, 803,
+
+ 804, 805, 805, 805, 806, 807, 806, 806,
+ 808, 806, 806, 809, 810, 811, 811, 811,
+ 811, 811, 808, 812, 811, 812, 812, 812,
+ 813, 813, 812, 812, 812, 812, 812, 812,
+
+ 814, 815, 816, 817, 818, 819, 820, 821,
+ 822, 823, 824, 824, 824, 824, 824, 824,
+ 824, 824, 824, 824, 825, 813, 812, 813,
+ 812, 826, 827, 828, 827, 828, 829, 829,
+
+ 804, 804, 804, 830, 804, 804, 804, 804,
+ 221, 804, 804, 804, 804, 830, 804, 804,
+ 804, 804, 830, 804, 804, 804, 804, 830,
+ 804, 804, 804, 804, 830, 804, 804, 804,
+
+ 804, 804, 804, 804, 804, 804, 804, 804,
+ 804, 830, 831, 832, 832, 221, 221, 221,
+ 221, 833, 834, 835, 836, 835, 835, 837,
+ 835, 837, 834, 834, 834, 834, 838, 839,
+
+ 834, 835, 840, 840, 841, 809, 840, 840,
+ 804, 804, 804, 804, 842, 843, 843, 843,
+ 838, 838, 838, 835, 838, 838, 844, 838,
+ 221, 838, 838, 838, 838, 835, 838, 838,
+
+ 838, 838, 835, 838, 838, 838, 838, 835,
+ 838, 838, 838, 838, 835, 838, 844, 844,
+ 844, 838, 838, 838, 838, 838, 838, 838,
+ 844, 835, 844, 844, 844, 221, 845, 845,
+
+ 846, 846, 846, 846, 846, 846, 847, 846,
+ 846, 846, 846, 846, 846, 221, 848, 846,
+ 849, 849, 850, 851, 852, 853, 853, 853,
+ 853, 854, 854, 221, 221, 221, 221, 221,
+
+ 855, 855, 855, 855, 855, 855, 855, 855,
+ 855, 855, 855, 855, 855, 855, 855, 855,
+ 855, 855, 855, 855, 855, 855, 855, 855,
+ 855, 855, 855, 855, 855, 855, 855, 855,
+
+ 855, 855, 856, 855, 855, 855, 857, 855,
+ 856, 855, 855, 858, 859, 860, 861, 860,
+ 860, 862, 860, 863, 863, 863, 860, 864,
+ 859, 865, 866, 867, 867, 863, 863, 856,
+
+ 868, 869, 870, 871, 872, 873, 874, 875,
+ 876, 877, 878, 878, 879, 879, 879, 879,
+ 855, 855, 855, 855, 855, 855, 862, 862,
+ 860, 860, 856, 856, 856, 856, 863, 863,
+
+ 863, 856, 858, 858, 858, 856, 856, 858,
+ 858, 858, 858, 858, 858, 858, 856, 856,
+ 856, 863, 863, 863, 863, 856, 856, 856,
+ 856, 856, 856, 856, 856, 856, 856, 856,
+
+ 856, 856, 863, 858, 867, 863, 863, 858,
+ 858, 858, 858, 858, 858, 880, 856, 858,
+ 881, 882, 883, 884, 885, 886, 887, 888,
+ 889, 890, 891, 891, 891, 892, 893, 893,
+
+ 894, 894, 894, 894, 894, 894, 894, 894,
+ 894, 894, 894, 894, 894, 894, 894, 894,
+ 894, 894, 894, 894, 894, 894, 894, 894,
+ 894, 894, 894, 894, 894, 894, 894, 894,
+
+ 894, 894, 894, 894, 894, 894, 221, 895,
+ 221, 221, 221, 221, 221, 895, 221, 221,
+ 896, 896, 896, 896, 896, 896, 896, 896,
+ 896, 896, 896, 896, 896, 896, 896, 896,
+
+ 896, 896, 896, 896, 896, 896, 896, 896,
+ 896, 896, 896, 896, 896, 896, 896, 896,
+ 896, 896, 896, 896, 896, 896, 896, 897,
+ 897, 898, 898, 899, 900, 901, 901, 901,
+
+ 902, 902, 902, 902, 902, 902, 902, 902,
+ 902, 902, 902, 902, 902, 902, 902, 902,
+ 902, 902, 902, 902, 902, 902, 902, 902,
+ 902, 902, 902, 902, 902, 902, 902, 902,
+
+ 902, 902, 902, 902, 902, 902, 902, 902,
+ 902, 902, 902, 902, 902, 902, 902, 902,
+ 902, 902, 902, 902, 902, 902, 902, 902,
+ 902, 902, 903, 903, 903, 903, 903, 904,
+
+ 905, 906, 906, 906, 906, 906, 906, 906,
+ 906, 906, 906, 906, 906, 906, 906, 906,
+ 906, 906, 906, 906, 906, 906, 907, 907,
+ 907, 907, 907, 907, 907, 907, 907, 907,
+
+ 907, 907, 907, 907, 907, 907, 907, 907,
+ 907, 907, 907, 907, 907, 907, 907, 907,
+ 907, 907, 907, 907, 907, 907, 907, 907,
+ 907, 907, 907, 907, 907, 907, 907, 907,
+
+ 907, 907, 907, 908, 908, 908, 908, 908,
+ 909, 909, 909, 909, 909, 909, 909, 909,
+ 909, 909, 909, 909, 909, 909, 909, 909,
+ 909, 909, 909, 909, 909, 909, 909, 909,
+
+ 909, 909, 909, 910, 910, 910, 910, 910,
+ 910, 910, 910, 910, 910, 910, 910, 910,
+ 910, 910, 910, 910, 910, 910, 910, 910,
+ 910, 910, 910, 910, 910, 910, 910, 910,
+
+ 910, 910, 910, 910, 910, 910, 910, 910,
+ 910, 910, 910, 910, 910, 910, 910, 910,
+ 910, 910, 910, 910, 910, 910, 910, 910,
+ 910, 910, 911, 911, 911, 911, 911, 911,
+
+ 912, 912, 912, 912, 912, 912, 912, 913,
+ 912, 912, 912, 912, 912, 912, 912, 912,
+ 912, 912, 912, 912, 912, 912, 912, 912,
+ 912, 912, 912, 912, 912, 912, 912, 912,
+
+ 912, 912, 912, 912, 912, 912, 912, 912,
+ 912, 912, 912, 912, 912, 912, 912, 912,
+ 912, 912, 912, 912, 912, 912, 912, 912,
+ 912, 912, 912, 912, 912, 912, 912, 912,
+
+ 912, 912, 912, 912, 912, 912, 912, 913,
+ 912, 221, 912, 912, 912, 912, 221, 221,
+ 912, 912, 912, 912, 912, 912, 912, 221,
+ 912, 221, 912, 912, 912, 912, 221, 221,
+
+ 912, 912, 912, 912, 912, 912, 912, 913,
+ 912, 221, 912, 912, 912, 912, 221, 221,
+ 912, 912, 912, 912, 912, 912, 912, 912,
+ 912, 912, 912, 912, 912, 912, 912, 912,
+
+ 912, 912, 912, 912, 912, 912, 912, 912,
+ 912, 912, 912, 912, 912, 912, 912, 913,
+ 912, 221, 912, 912, 912, 912, 221, 221,
+ 912, 912, 912, 912, 912, 912, 912, 221,
+
+ 912, 221, 912, 912, 912, 912, 221, 221,
+ 912, 912, 912, 912, 912, 912, 912, 913,
+ 912, 912, 912, 912, 912, 912, 912, 221,
+ 912, 912, 912, 912, 912, 912, 912, 912,
+
+ 912, 912, 912, 912, 912, 912, 912, 912,
+ 912, 912, 912, 912, 912, 912, 912, 913,
+ 912, 912, 912, 912, 912, 912, 912, 912,
+ 912, 912, 912, 912, 912, 912, 912, 912,
+
+ 912, 912, 912, 912, 912, 912, 912, 912,
+ 912, 912, 912, 912, 912, 912, 912, 913,
+ 912, 221, 912, 912, 912, 912, 221, 221,
+ 912, 912, 912, 912, 912, 912, 912, 913,
+
+ 912, 912, 912, 912, 912, 912, 912, 913,
+ 912, 912, 912, 912, 912, 912, 912, 912,
+ 912, 912, 912, 912, 912, 912, 912, 912,
+ 912, 912, 912, 221, 221, 914, 914, 915,
+
+ 916, 917, 918, 919, 919, 919, 919, 918,
+ 918, 920, 921, 922, 923, 924, 925, 926,
+ 927, 928, 929, 929, 929, 929, 929, 929,
+ 929, 929, 929, 929, 929, 221, 221, 221,
+
+ 913, 913, 913, 913, 913, 913, 913, 913,
+ 913, 913, 913, 913, 913, 913, 913, 913,
+ 930, 930, 930, 930, 930, 930, 930, 930,
+ 930, 930, 221, 221, 221, 221, 221, 221,
+
+ 931, 932, 933, 934, 935, 936, 937, 938,
+ 939, 940, 941, 942, 943, 944, 945, 946,
+ 947, 948, 949, 950, 951, 952, 953, 954,
+ 955, 956, 957, 958, 959, 960, 961, 962,
+
+ 963, 964, 965, 966, 967, 968, 969, 970,
+ 971, 972, 973, 974, 975, 976, 977, 978,
+ 979, 980, 981, 982, 983, 984, 985, 986,
+ 987, 988, 989, 990, 991, 992, 993, 994,
+
+ 995, 996, 997, 998, 999, 1000, 1001, 1002,
+ 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010,
+ 1011, 1011, 1011, 1011, 1011, 1012, 221, 221,
+ 1013, 1013, 1013, 1013, 1013, 1013, 221, 221,
+
+ 1014, 1015, 1015, 1015, 1015, 1015, 1015, 1015,
+ 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015,
+ 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015,
+ 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015,
+
+ 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015,
+ 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015,
+ 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015,
+ 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015,
+
+ 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015,
+ 1015, 1015, 1015, 1015, 1015, 1016, 1017, 1015,
+ 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1018,
+ 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018,
+ 1019, 1020, 1020, 1020, 1020, 1020, 1020, 1020,
+ 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020,
+ 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020,
+ 1020, 1020, 1020, 1021, 1022, 221, 221, 221,
+
+ 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023,
+ 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023,
+ 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023,
+ 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023,
+
+ 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023,
+ 1023, 1023, 1023, 1024, 1024, 1024, 1025, 1025,
+ 1025, 1026, 1026, 1026, 1026, 1026, 1026, 1026,
+ 1026, 221, 221, 221, 221, 221, 221, 221,
+
+ 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027,
+ 1027, 1027, 1027, 1027, 1027, 1028, 1027, 1027,
+ 1027, 1027, 1029, 1029, 1030, 1031, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 1028,
+
+ 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032,
+ 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032,
+ 1032, 1032, 1033, 1033, 1034, 1035, 1035, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036,
+ 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036,
+ 1036, 1036, 1037, 1037, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038,
+ 1038, 1038, 1038, 1038, 1038, 221, 1038, 1038,
+ 1038, 221, 1039, 1039, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040,
+ 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040,
+ 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040,
+ 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040,
+
+ 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040,
+ 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040,
+ 1040, 1040, 1040, 1040, 1041, 1041, 1042, 1043,
+ 1043, 1043, 1043, 1043, 1043, 1043, 1042, 1042,
+
+ 1042, 1042, 1042, 1042, 1042, 1042, 1043, 1042,
+ 1042, 1043, 1043, 1043, 1043, 1043, 1043, 1043,
+ 1043, 1043, 1044, 1043, 1045, 1045, 1046, 1047,
+ 1048, 1049, 1048, 1050, 1040, 1051, 221, 221,
+
+ 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1059,
+ 1060, 1061, 221, 221, 221, 221, 221, 221,
+ 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062,
+ 1062, 1062, 221, 221, 221, 221, 221, 221,
+
+ 1063, 1063, 1064, 1065, 1066, 1067, 1068, 1069,
+ 1070, 1071, 1072, 1073, 1073, 1073, 1074, 1075,
+ 1076, 1077, 1078, 1079, 1080, 1081, 1082, 1083,
+ 1084, 1085, 221, 221, 221, 221, 221, 221,
+
+ 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086,
+ 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086,
+ 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086,
+ 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086,
+
+ 1086, 1086, 1086, 1087, 1086, 1086, 1086, 1086,
+ 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086,
+ 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086,
+ 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086,
+
+ 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086,
+ 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086,
+ 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086,
+ 1088, 221, 221, 221, 221, 221, 221, 221,
+
+ 1089, 1089, 1089, 1089, 1089, 1090, 1090, 1086,
+ 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086,
+ 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086,
+ 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086,
+
+ 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086,
+ 1086, 1091, 1092, 221, 221, 221, 221, 221,
1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018,
1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018,
+
1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018,
1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018,
-
1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018,
1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018,
- 1018, 1018, 1018, 1018, 1019, 1019, 1020, 1021,
- 1021, 1021, 1021, 1021, 1021, 1021, 1020, 1020,
-
- 1020, 1020, 1020, 1020, 1020, 1020, 1021, 1020,
- 1020, 1021, 1021, 1021, 1021, 1021, 1021, 1021,
- 1021, 1021, 1022, 1021, 1023, 1023, 1024, 1025,
- 1023, 1026, 1023, 1027, 1018, 1028, 206, 206,
-
- 1029, 1030, 1031, 1032, 1033, 1034, 1035, 1036,
- 1037, 1038, 206, 206, 206, 206, 206, 206,
- 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039,
- 1039, 1039, 206, 206, 206, 206, 206, 206,
-
- 1040, 1040, 1041, 1042, 1043, 1044, 1045, 1046,
- 1047, 1048, 1049, 1050, 1050, 1050, 1051, 1052,
- 1053, 1054, 1055, 1056, 1057, 1058, 1059, 1060,
- 1061, 1062, 206, 206, 206, 206, 206, 206,
-
- 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063,
- 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063,
- 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063,
- 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063,
-
- 1063, 1063, 1063, 1064, 1063, 1063, 1063, 1063,
- 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063,
- 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063,
- 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063,
-
- 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063,
- 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063,
- 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063,
- 1065, 206, 206, 206, 206, 206, 206, 206,
-
- 1066, 1066, 1066, 1066, 1066, 1067, 1067, 1063,
- 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063,
- 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063,
- 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063,
-
- 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063,
- 1063, 1068, 1069, 206, 206, 206, 206, 206,
- 996, 996, 996, 996, 996, 996, 996, 996,
- 996, 996, 996, 996, 996, 996, 996, 996,
-
- 996, 996, 996, 996, 996, 996, 996, 996,
- 996, 996, 996, 996, 996, 996, 996, 996,
- 996, 996, 996, 996, 996, 996, 996, 996,
- 996, 996, 996, 996, 996, 996, 996, 996,
-
- 996, 996, 996, 996, 996, 996, 996, 996,
- 996, 996, 996, 996, 996, 996, 996, 996,
- 996, 996, 996, 996, 996, 996, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
-
- 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070,
- 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070,
- 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070,
- 1070, 1070, 1070, 1070, 1070, 1071, 1071, 206,
-
- 1072, 1072, 1072, 1073, 1073, 1073, 1073, 1072,
- 1072, 1073, 1073, 1073, 206, 206, 206, 206,
- 1073, 1073, 1072, 1073, 1073, 1073, 1073, 1073,
- 1073, 1074, 1075, 1076, 206, 206, 206, 206,
-
- 1077, 206, 206, 206, 1078, 1078, 1079, 1080,
- 1081, 1082, 1083, 1084, 1085, 1086, 1087, 1088,
- 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089,
- 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089,
-
- 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089,
- 1089, 1089, 1089, 1089, 1089, 1089, 206, 206,
- 1089, 1089, 1089, 1089, 1089, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
-
- 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090,
- 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090,
- 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090,
- 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090,
-
- 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090,
- 1090, 1090, 1091, 1091, 206, 206, 206, 206,
- 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090,
- 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090,
-
- 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090,
- 1090, 1090, 206, 206, 206, 206, 206, 206,
- 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099,
- 1100, 1101, 1102, 206, 206, 206, 1103, 1103,
-
- 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104,
- 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104,
- 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104,
- 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104,
-
- 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105,
- 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105,
- 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1106,
- 1107, 1108, 1108, 1109, 206, 206, 1110, 1110,
-
- 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111,
- 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111,
- 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111,
- 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111,
-
- 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111,
- 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111,
- 1111, 1111, 1111, 1111, 1111, 1112, 1113, 1112,
- 1113, 1113, 1113, 1113, 1113, 1113, 1113, 206,
-
- 1114, 1115, 1113, 1115, 1115, 1113, 1113, 1113,
- 1113, 1113, 1113, 1113, 1113, 1112, 1112, 1112,
- 1112, 1112, 1112, 1113, 1113, 1116, 1116, 1116,
- 1116, 1116, 1116, 1116, 1116, 206, 206, 1117,
-
- 1118, 1119, 1120, 1121, 1122, 1123, 1124, 1125,
- 1126, 1127, 206, 206, 206, 206, 206, 206,
- 1118, 1119, 1120, 1121, 1122, 1123, 1124, 1125,
- 1126, 1127, 206, 206, 206, 206, 206, 206,
+ 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018,
+ 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018,
+ 1018, 1018, 1018, 1018, 1018, 1018, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093,
+ 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093,
+ 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093,
+ 1093, 1093, 1093, 1093, 1093, 1094, 1094, 221,
+
+ 1095, 1095, 1095, 1096, 1096, 1096, 1096, 1095,
+ 1095, 1096, 1096, 1096, 221, 221, 221, 221,
+ 1096, 1096, 1095, 1096, 1096, 1096, 1096, 1096,
+ 1096, 1097, 1098, 1099, 221, 221, 221, 221,
+
+ 1100, 221, 221, 221, 1101, 1101, 1102, 1103,
+ 1104, 1105, 1106, 1107, 1108, 1109, 1110, 1111,
+ 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112,
+ 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112,
+
+ 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112,
+ 1112, 1112, 1112, 1112, 1112, 1112, 221, 221,
+ 1112, 1112, 1112, 1112, 1112, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113,
+ 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113,
+ 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113,
+ 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113,
+
+ 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113,
+ 1113, 1113, 1114, 1114, 221, 221, 221, 221,
+ 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113,
+ 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113,
+
+ 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113,
+ 1113, 1113, 221, 221, 221, 221, 221, 221,
+ 1115, 1116, 1117, 1118, 1119, 1120, 1121, 1122,
+ 1123, 1124, 1125, 221, 221, 221, 1126, 1126,
+
+ 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127,
+ 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127,
+ 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127,
+ 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127,
+
+ 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128,
+ 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128,
1128, 1128, 1128, 1128, 1128, 1128, 1128, 1129,
- 1130, 1130, 1130, 1130, 1128, 1128, 206, 206,
- 1131, 1131, 1131, 1131, 1131, 1132, 1132, 1132,
- 1132, 1132, 1132, 1131, 1131, 1132, 1133, 1134,
-
- 1134, 1135, 1135, 1136, 1136, 1135, 1135, 1135,
- 1135, 1135, 1136, 1135, 1135, 1135, 1135, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
-
- 1137, 1137, 1137, 1137, 1138, 1139, 1140, 1139,
- 1140, 1139, 1140, 1139, 1140, 1139, 1140, 1139,
- 1139, 1139, 1140, 1139, 1139, 1139, 1139, 1139,
- 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139,
-
- 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139,
- 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139,
- 1139, 1139, 1139, 1139, 1141, 1142, 1137, 1137,
- 1137, 1137, 1137, 1143, 1137, 1143, 1138, 1138,
-
- 1143, 1143, 1137, 1143, 1144, 1139, 1139, 1139,
- 1139, 1139, 1139, 1139, 1145, 206, 206, 206,
- 1146, 1147, 1148, 1149, 1150, 1151, 1152, 1153,
- 1154, 1155, 1156, 1156, 1157, 1158, 1156, 1156,
-
- 1158, 1159, 1159, 1159, 1159, 1159, 1159, 1159,
- 1159, 1159, 1159, 1160, 1161, 1160, 1160, 1160,
- 1160, 1160, 1160, 1160, 1159, 1159, 1159, 1159,
- 1159, 1159, 1159, 1159, 1159, 1162, 1162, 206,
-
- 1163, 1163, 1164, 1165, 1165, 1165, 1165, 1165,
- 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165,
- 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165,
- 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165,
-
- 1165, 1164, 1163, 1163, 1163, 1163, 1164, 1164,
- 1163, 1163, 1166, 1167, 1168, 1168, 1165, 1165,
+ 1130, 1131, 1131, 1132, 221, 221, 1133, 1133,
+
+ 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134,
+ 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134,
+ 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134,
+ 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134,
+
+ 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134,
+ 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134,
+ 1134, 1134, 1134, 1134, 1134, 1135, 1136, 1135,
+ 1136, 1136, 1136, 1136, 1136, 1136, 1136, 221,
+
+ 1137, 1138, 1136, 1138, 1138, 1136, 1136, 1136,
+ 1136, 1136, 1136, 1136, 1136, 1135, 1135, 1135,
+ 1135, 1135, 1135, 1136, 1136, 1139, 1139, 1139,
+ 1139, 1139, 1139, 1139, 1139, 221, 221, 1140,
+
+ 1141, 1142, 1143, 1144, 1145, 1146, 1147, 1148,
+ 1149, 1150, 221, 221, 221, 221, 221, 221,
+ 1141, 1142, 1143, 1144, 1145, 1146, 1147, 1148,
+ 1149, 1150, 221, 221, 221, 221, 221, 221,
+
+ 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1152,
+ 1153, 1153, 1153, 1153, 1151, 1151, 221, 221,
+ 1154, 1154, 1154, 1154, 1154, 1155, 1155, 1155,
+ 1155, 1155, 1155, 1154, 1154, 1155, 1156, 1157,
+
+ 1157, 1158, 1158, 1159, 1159, 1158, 1158, 1158,
+ 1158, 1158, 1159, 1158, 1158, 1158, 1158, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 1160, 1160, 1160, 1160, 1161, 1162, 1163, 1162,
+ 1163, 1162, 1163, 1162, 1163, 1162, 1163, 1162,
+ 1162, 1162, 1163, 1162, 1162, 1162, 1162, 1162,
+ 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162,
+
+ 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162,
+ 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162,
+ 1162, 1162, 1162, 1162, 1164, 1165, 1160, 1160,
+ 1160, 1160, 1160, 1166, 1160, 1166, 1161, 1161,
+
+ 1166, 1166, 1160, 1166, 1167, 1162, 1162, 1162,
+ 1162, 1162, 1162, 1162, 1168, 221, 221, 221,
1169, 1170, 1171, 1172, 1173, 1174, 1175, 1176,
- 1177, 1178, 1179, 1179, 1179, 1179, 1179, 1179,
-
- 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180,
- 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180,
- 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180,
- 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180,
+ 1177, 1178, 1179, 1179, 1180, 1181, 1179, 1179,
- 1180, 1180, 1180, 1180, 1180, 1180, 1181, 1182,
- 1183, 1183, 1182, 1182, 1182, 1183, 1182, 1183,
- 1183, 1183, 1184, 1184, 206, 206, 206, 206,
- 206, 206, 206, 206, 1185, 1185, 1185, 1185,
+ 1181, 1182, 1182, 1182, 1182, 1182, 1182, 1182,
+ 1182, 1182, 1182, 1183, 1184, 1183, 1183, 1183,
+ 1183, 1183, 1183, 1183, 1182, 1182, 1182, 1182,
+ 1182, 1182, 1182, 1182, 1182, 1185, 1185, 221,
- 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186,
- 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186,
- 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186,
- 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186,
-
- 1186, 1186, 1186, 1186, 1187, 1187, 1187, 1187,
- 1187, 1187, 1187, 1187, 1188, 1188, 1188, 1188,
- 1188, 1188, 1188, 1188, 1187, 1187, 1188, 1189,
- 206, 206, 206, 1190, 1190, 1191, 1191, 1191,
+ 1186, 1186, 1187, 1188, 1188, 1188, 1188, 1188,
+ 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188,
+ 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188,
+ 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188,
+ 1188, 1187, 1186, 1186, 1186, 1186, 1187, 1187,
+ 1186, 1186, 1189, 1190, 1191, 1191, 1188, 1188,
1192, 1193, 1194, 1195, 1196, 1197, 1198, 1199,
- 1200, 1201, 206, 206, 206, 1186, 1186, 1186,
- 1202, 1203, 1204, 1205, 1206, 1207, 1208, 1209,
- 1210, 1211, 1212, 1212, 1212, 1212, 1212, 1212,
-
- 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212,
- 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212,
- 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212,
- 1213, 1213, 1213, 1213, 1213, 1213, 1214, 1214,
-
- 1215, 1216, 1217, 1218, 1218, 1219, 1220, 1221,
- 1222, 206, 206, 206, 206, 206, 206, 206,
- 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223,
- 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223,
-
- 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223,
- 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223,
- 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223,
- 1223, 1223, 1223, 206, 206, 1223, 1223, 1223,
-
- 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 1225, 1225, 1225, 1226, 1227, 1228, 1228, 1228,
- 1228, 1228, 1225, 1225, 1228, 1228, 1228, 1228,
-
- 1225, 1229, 1227, 1227, 1227, 1227, 1227, 1227,
- 1227, 1230, 1230, 1230, 1230, 1228, 1230, 1230,
- 1230, 1230, 1230, 1231, 1232, 1231, 1231, 1233,
- 1131, 1131, 1234, 206, 206, 206, 206, 206,
-
- 118, 118, 118, 118, 118, 118, 118, 118,
- 118, 118, 118, 118, 118, 118, 118, 118,
- 118, 118, 118, 118, 118, 118, 118, 118,
- 118, 118, 118, 118, 118, 118, 118, 118,
-
- 118, 118, 118, 118, 118, 118, 1235, 1235,
- 1235, 1235, 1235, 1236, 1237, 1237, 1237, 1238,
- 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237,
- 1237, 1237, 1237, 1238, 1237, 1237, 1237, 1237,
-
- 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237,
- 1237, 1237, 1237, 1237, 1237, 1237, 1238, 1237,
- 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237,
- 1237, 1237, 1237, 1237, 1237, 1239, 1239, 1239,
-
- 1239, 1239, 1237, 1237, 1237, 1237, 1239, 1239,
- 1239, 1239, 1239, 118, 119, 119, 119, 119,
- 119, 119, 119, 119, 119, 119, 119, 119,
- 1240, 1241, 119, 119, 119, 1242, 119, 119,
-
- 119, 119, 119, 119, 119, 119, 119, 119,
- 119, 119, 119, 119, 119, 119, 1243, 119,
- 119, 119, 119, 119, 119, 119, 119, 119,
- 119, 119, 119, 1244, 1244, 1244, 1244, 1244,
-
- 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244,
- 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244,
- 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244,
- 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1245,
-
- 195, 195, 194, 195, 1246, 1246, 1246, 1246,
- 1246, 1246, 1247, 1248, 1248, 1249, 1250, 1251,
- 1252, 1248, 1248, 1248, 1248, 1248, 1248, 1248,
- 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248,
-
- 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1131,
- 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131,
- 1131, 1131, 1131, 1131, 1131, 1131, 1253, 1254,
- 1254, 1255, 1256, 1257, 1258, 1228, 1246, 1247,
-
- 74, 75, 74, 75, 74, 75, 74, 75,
- 74, 75, 74, 75, 74, 75, 74, 75,
- 74, 75, 74, 75, 74, 75, 74, 75,
- 74, 75, 74, 75, 74, 75, 74, 75,
-
- 74, 75, 74, 75, 74, 75, 74, 75,
- 74, 75, 74, 75, 74, 75, 74, 75,
- 74, 75, 74, 75, 74, 75, 1259, 1260,
- 1261, 1262, 1263, 1264, 1265, 1265, 1266, 1265,
-
- 74, 75, 74, 75, 74, 75, 74, 75,
- 74, 75, 74, 75, 74, 75, 74, 75,
- 74, 75, 74, 75, 74, 75, 74, 75,
- 74, 75, 1267, 1268, 1267, 1268, 1267, 1268,
-
- 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269,
- 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270,
- 1269, 1269, 1269, 1269, 1269, 1269, 206, 206,
- 1270, 1270, 1270, 1270, 1270, 1270, 206, 206,
-
- 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269,
- 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270,
- 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269,
- 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270,
-
- 1269, 1269, 1269, 1269, 1269, 1269, 206, 206,
- 1270, 1270, 1270, 1270, 1270, 1270, 206, 206,
- 1271, 1269, 1272, 1269, 1273, 1269, 1274, 1269,
- 206, 1270, 206, 1270, 206, 1270, 206, 1270,
-
- 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269,
- 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270,
- 1275, 1276, 1277, 1278, 1277, 1278, 1279, 1280,
- 1281, 1282, 1283, 1284, 1285, 1286, 206, 206,
-
- 1287, 1288, 1289, 1290, 1291, 1292, 1293, 1294,
- 1295, 1296, 1297, 1298, 1299, 1300, 1301, 1302,
- 1303, 1304, 1305, 1306, 1307, 1308, 1309, 1310,
- 1311, 1312, 1313, 1314, 1315, 1316, 1317, 1318,
-
- 1319, 1320, 1321, 1322, 1323, 1324, 1325, 1326,
- 1327, 1328, 1329, 1330, 1331, 1332, 1333, 1334,
- 1269, 1269, 1335, 1336, 1337, 206, 1338, 1339,
- 1270, 1270, 1340, 1341, 1342, 211, 1343, 211,
-
- 211, 1344, 1345, 1346, 1347, 206, 1348, 1349,
- 1350, 1351, 1350, 1351, 1352, 1344, 1344, 1344,
- 1269, 1269, 1353, 1354, 206, 206, 1355, 1356,
- 1270, 1270, 1357, 1358, 206, 1344, 1344, 1344,
-
- 1269, 1269, 1359, 1360, 1361, 1362, 1363, 1364,
- 1270, 1270, 1365, 1366, 1367, 1344, 1368, 1368,
- 206, 206, 1369, 1370, 1371, 206, 1372, 1373,
- 1374, 1375, 1376, 1377, 1378, 1379, 211, 206,
-
- 1380, 1380, 1381, 1381, 1381, 1381, 1381, 1382,
- 1381, 1381, 1381, 1383, 1384, 1385, 1386, 1387,
- 1388, 1389, 1388, 1390, 1391, 1392, 53, 1393,
- 1394, 1395, 1396, 1397, 1397, 1398, 1396, 1397,
-
- 53, 53, 53, 53, 1399, 1400, 1400, 1401,
- 1402, 1403, 1404, 1405, 1406, 1407, 1408, 1409,
- 1410, 1410, 1410, 1411, 1411, 1412, 1413, 1413,
- 53, 1414, 1415, 53, 1416, 1417, 1393, 43,
-
- 43, 53, 53, 53, 1418, 1419, 1420, 1421,
- 1422, 1423, 1424, 1424, 1424, 1424, 1425, 1425,
- 1425, 1425, 1426, 1427, 1428, 1429, 1430, 1431,
- 1430, 1430, 1430, 1430, 1429, 1430, 1430, 1432,
-
- 1433, 1434, 1434, 1434, 1435, 1436, 1437, 1438,
- 1439, 1440, 1441, 1441, 1441, 1441, 1441, 1441,
- 1442, 1443, 206, 206, 1444, 1445, 1446, 1447,
- 1448, 1449, 1450, 1451, 1452, 1453, 1454, 164,
-
- 1442, 67, 62, 63, 1444, 1445, 1446, 1447,
- 1448, 1449, 1450, 1451, 1452, 1453, 1454, 206,
- 1244, 1244, 1244, 1244, 1244, 1455, 1455, 1455,
- 1455, 1455, 1455, 1455, 1455, 206, 206, 206,
-
- 51, 51, 51, 51, 51, 51, 51, 50,
- 1456, 51, 51, 1457, 1458, 1459, 1459, 1459,
- 1460, 1460, 1461, 1461, 1461, 1461, 1462, 1463,
- 1463, 1464, 1465, 1466, 1467, 1467, 1468, 1469,
-
- 1470, 1471, 1471, 1471, 1471, 1471, 1471, 1471,
- 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471,
- 177, 177, 184, 184, 177, 177, 177, 177,
- 184, 184, 184, 177, 177, 1472, 1472, 1472,
-
- 1472, 177, 1473, 1473, 1474, 1475, 1475, 201,
- 1476, 201, 1475, 1477, 1247, 1247, 1247, 1247,
- 1248, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
-
- 1478, 1478, 1479, 1480, 52, 1478, 1478, 1479,
- 52, 1480, 1481, 1479, 1479, 1479, 1481, 1481,
- 1479, 1479, 1479, 1481, 52, 1479, 1482, 52,
- 58, 1479, 1479, 1479, 1479, 1479, 52, 52,
-
- 1483, 1483, 1484, 52, 1479, 52, 1485, 52,
- 1479, 52, 1486, 1487, 1479, 1479, 1488, 1481,
- 1479, 1479, 1489, 1479, 1481, 1490, 1490, 1490,
- 1490, 1491, 1492, 1493, 1494, 1495, 1496, 1496,
-
- 1497, 1426, 1426, 1426, 1426, 1496, 1495, 1495,
- 1495, 1495, 1498, 1426, 1499, 1500, 1501, 1502,
- 1503, 1503, 1503, 69, 69, 69, 69, 69,
- 69, 69, 69, 69, 69, 69, 69, 69,
-
- 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504,
- 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504,
- 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505,
- 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505,
-
- 1506, 1506, 1506, 1507, 127, 1508, 1508, 1508,
- 1508, 1503, 1509, 1509, 206, 206, 206, 206,
- 58, 58, 58, 58, 1510, 55, 55, 55,
- 55, 55, 1511, 1511, 52, 52, 52, 52,
-
- 58, 52, 52, 58, 52, 52, 58, 52,
- 52, 55, 55, 52, 52, 52, 1511, 52,
- 52, 52, 52, 52, 52, 52, 52, 52,
- 52, 52, 52, 52, 52, 52, 52, 52,
-
- 52, 52, 52, 52, 52, 52, 52, 52,
- 52, 52, 52, 52, 52, 1512, 1511, 1511,
- 52, 52, 58, 52, 58, 52, 52, 52,
- 52, 52, 52, 52, 52, 52, 52, 52,
-
- 52, 52, 52, 52, 52, 52, 52, 52,
- 52, 52, 52, 1492, 1492, 1492, 1492, 1492,
- 1492, 1492, 1492, 1492, 1426, 1426, 1426, 1426,
- 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426,
-
- 58, 58, 58, 58, 1511, 58, 58, 58,
- 1513, 1514, 1513, 1515, 1516, 1515, 58, 58,
- 58, 58, 1517, 61, 58, 1518, 58, 58,
- 58, 58, 58, 58, 58, 58, 58, 1519,
-
- 1520, 1521, 1522, 58, 1523, 58, 1511, 58,
- 58, 58, 58, 58, 1524, 1524, 58, 1524,
- 1524, 58, 58, 58, 58, 58, 58, 58,
- 58, 58, 58, 58, 1525, 1526, 58, 58,
-
- 58, 1511, 58, 1527, 1511, 1528, 58, 1511,
- 58, 1511, 58, 58, 1529, 58, 58, 58,
- 58, 58, 1525, 1526, 1525, 1526, 58, 58,
- 58, 58, 58, 58, 58, 58, 58, 58,
-
- 1530, 58, 1511, 58, 1525, 1526, 1525, 1526,
- 1525, 1526, 1525, 1526, 58, 1511, 1531, 1532,
- 1533, 1534, 1525, 1526, 1533, 1534, 1525, 1526,
- 1533, 1534, 1525, 1526, 1525, 1526, 1525, 1526,
-
- 1533, 1534, 1525, 1526, 1533, 1534, 1525, 1526,
- 1533, 1534, 1525, 1526, 58, 58, 58, 1525,
- 1526, 1525, 1526, 58, 58, 58, 58, 58,
- 1535, 58, 58, 58, 58, 58, 58, 58,
-
- 58, 58, 1525, 1526, 58, 58, 1536, 58,
- 1537, 1538, 58, 1538, 1511, 1511, 1511, 1511,
- 1525, 1526, 1525, 1526, 1525, 1526, 1525, 1526,
- 1539, 58, 58, 58, 58, 58, 58, 58,
-
- 58, 58, 58, 58, 58, 58, 58, 58,
- 58, 1525, 1526, 1525, 1526, 1540, 58, 58,
- 1525, 1526, 58, 58, 58, 58, 1525, 1526,
- 1525, 1526, 1525, 1526, 1525, 1526, 1525, 1526,
-
- 1533, 1534, 1533, 1534, 1525, 1526, 1525, 1526,
- 1525, 1526, 1533, 1534, 1533, 1534, 58, 1541,
- 1525, 1526, 1542, 1542, 1542, 1426, 1543, 1543,
- 1426, 1426, 1544, 1544, 1544, 1545, 1545, 1426,
-
- 52, 1492, 52, 52, 52, 52, 52, 52,
- 1419, 1420, 1419, 1420, 52, 52, 52, 52,
- 52, 52, 52, 52, 52, 52, 52, 52,
- 52, 52, 1546, 1546, 52, 52, 52, 52,
-
- 58, 58, 52, 52, 52, 52, 52, 52,
- 55, 1547, 1548, 52, 52, 52, 52, 52,
- 52, 52, 52, 52, 52, 52, 1549, 1549,
- 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549,
-
- 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549,
- 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549,
- 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549,
+ 1200, 1201, 1202, 1202, 1202, 1202, 1202, 1202,
+
+ 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203,
+ 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203,
+ 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203,
+ 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203,
+
+ 1203, 1203, 1203, 1203, 1203, 1203, 1204, 1205,
+ 1206, 1206, 1205, 1205, 1205, 1206, 1205, 1206,
+ 1206, 1206, 1207, 1207, 221, 221, 221, 221,
+ 221, 221, 221, 221, 1208, 1208, 1208, 1208,
+
+ 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209,
+ 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209,
+ 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209,
+ 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209,
+
+ 1209, 1209, 1209, 1209, 1210, 1210, 1210, 1210,
+ 1210, 1210, 1210, 1210, 1211, 1211, 1211, 1211,
+ 1211, 1211, 1211, 1211, 1210, 1210, 1211, 1212,
+ 221, 221, 221, 1213, 1213, 1214, 1214, 1214,
+
+ 1215, 1216, 1217, 1218, 1219, 1220, 1221, 1222,
+ 1223, 1224, 221, 221, 221, 1209, 1209, 1209,
+ 1225, 1226, 1227, 1228, 1229, 1230, 1231, 1232,
+ 1233, 1234, 1235, 1235, 1235, 1235, 1235, 1235,
+
+ 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235,
+ 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235,
+ 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235,
+ 1236, 1236, 1236, 1236, 1236, 1236, 1237, 1237,
+
+ 1238, 1239, 1240, 1241, 1241, 1242, 1243, 1244,
+ 1245, 221, 221, 221, 221, 221, 221, 221,
+ 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246,
+ 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246,
+
+ 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246,
+ 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246,
+ 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246,
+ 1246, 1246, 1246, 221, 221, 1246, 1246, 1246,
+
+ 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 1248, 1248, 1248, 1249, 1250, 1251, 1251, 1251,
+ 1251, 1251, 1248, 1248, 1251, 1251, 1251, 1251,
+
+ 1248, 1252, 1250, 1250, 1250, 1250, 1250, 1250,
+ 1250, 1253, 1253, 1253, 1253, 1251, 1253, 1253,
+ 1253, 1253, 1253, 1254, 1255, 1254, 1254, 1256,
+ 1154, 1154, 1257, 221, 221, 221, 221, 221,
+
+ 129, 129, 129, 129, 129, 129, 129, 129,
+ 129, 129, 129, 129, 129, 129, 129, 129,
+ 129, 129, 129, 129, 129, 129, 129, 129,
+ 129, 129, 129, 129, 129, 129, 129, 129,
+
+ 129, 129, 129, 129, 129, 129, 1258, 1258,
+ 1258, 1258, 1258, 1259, 1260, 1260, 1260, 1261,
+ 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260,
+ 1260, 1260, 1260, 1261, 1260, 1260, 1260, 1260,
+
+ 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260,
+ 1260, 1260, 1260, 1260, 1260, 1260, 1261, 1260,
+ 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260,
+ 1260, 1260, 1260, 1260, 1260, 1262, 1262, 1262,
+
+ 1262, 1262, 1260, 1260, 1260, 1260, 1262, 1262,
+ 1262, 1262, 1262, 129, 130, 130, 130, 130,
+ 130, 130, 130, 130, 130, 130, 130, 130,
+ 1263, 1264, 130, 130, 130, 1265, 130, 130,
+
+ 130, 130, 130, 130, 130, 130, 130, 130,
+ 130, 130, 130, 130, 130, 130, 1266, 130,
+ 130, 130, 130, 130, 130, 130, 130, 130,
+ 130, 130, 130, 1267, 1267, 1267, 1267, 1267,
+
+ 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267,
+ 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267,
+ 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267,
+ 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1268,
+
+ 1269, 1269, 1270, 1269, 1271, 1271, 1271, 1271,
+ 1271, 1271, 1272, 1273, 1273, 1274, 1275, 1276,
+ 1277, 1273, 1273, 1273, 1273, 1273, 1273, 1273,
+ 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273,
+
+ 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1154,
+ 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154,
+ 1154, 1154, 1154, 1154, 1154, 1154, 1278, 1279,
+ 1279, 1280, 1281, 1282, 1283, 1251, 1271, 1272,
+
+ 81, 83, 81, 83, 81, 83, 81, 83,
+ 81, 83, 81, 83, 81, 83, 81, 83,
+ 81, 83, 81, 83, 81, 83, 81, 83,
+ 81, 83, 81, 83, 81, 83, 81, 83,
+
+ 81, 83, 81, 83, 81, 83, 81, 83,
+ 81, 83, 81, 83, 81, 83, 81, 83,
+ 81, 83, 81, 83, 81, 83, 1284, 1285,
+ 1286, 1287, 1288, 1289, 1290, 1290, 1291, 1290,
+
+ 81, 83, 81, 83, 81, 83, 81, 83,
+ 81, 83, 81, 83, 81, 83, 81, 83,
+ 81, 83, 81, 83, 81, 83, 81, 83,
+ 81, 83, 1292, 1293, 1292, 1293, 1292, 1293,
+
+ 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294,
+ 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295,
+ 1294, 1294, 1294, 1294, 1294, 1294, 221, 221,
+ 1295, 1295, 1295, 1295, 1295, 1295, 221, 221,
+
+ 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294,
+ 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295,
+ 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294,
+ 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295,
+
+ 1294, 1294, 1294, 1294, 1294, 1294, 221, 221,
+ 1295, 1295, 1295, 1295, 1295, 1295, 221, 221,
+ 1296, 1294, 1297, 1294, 1298, 1294, 1299, 1294,
+ 221, 1295, 221, 1295, 221, 1295, 221, 1295,
+
+ 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294,
+ 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295,
+ 1300, 1301, 1302, 1303, 1302, 1303, 1304, 1305,
+ 1306, 1307, 1308, 1309, 1310, 1311, 221, 221,
+
+ 1312, 1313, 1314, 1315, 1316, 1317, 1318, 1319,
+ 1320, 1321, 1322, 1323, 1324, 1325, 1326, 1327,
+ 1328, 1329, 1330, 1331, 1332, 1333, 1334, 1335,
+ 1336, 1337, 1338, 1339, 1340, 1341, 1342, 1343,
+
+ 1344, 1345, 1346, 1347, 1348, 1349, 1350, 1351,
+ 1352, 1353, 1354, 1355, 1356, 1357, 1358, 1359,
+ 1294, 1294, 1360, 1361, 1362, 221, 1363, 1364,
+ 1295, 1295, 1365, 1366, 1367, 226, 1368, 226,
+
+ 226, 1369, 1370, 1371, 1372, 221, 1373, 1374,
+ 1375, 1376, 1375, 1376, 1377, 1369, 1369, 1369,
+ 1294, 1294, 1378, 1379, 221, 221, 1380, 1381,
+ 1295, 1295, 1382, 1383, 221, 1369, 1369, 1369,
+
+ 1294, 1294, 1384, 1385, 1386, 1387, 1388, 1389,
+ 1295, 1295, 1390, 1391, 1392, 1369, 1393, 1393,
+ 221, 221, 1394, 1395, 1396, 221, 1397, 1398,
+ 1399, 1400, 1401, 1402, 1403, 1404, 226, 221,
+
+ 1405, 1405, 1406, 1406, 1406, 1406, 1406, 1407,
+ 1406, 1406, 1406, 1408, 1409, 1410, 1411, 1412,
+ 1413, 1414, 1415, 1416, 1417, 1418, 54, 1419,
+ 1420, 1421, 1422, 1423, 1424, 1425, 1422, 1423,
+
+ 54, 54, 54, 1426, 1427, 1428, 1428, 1429,
+ 1430, 1431, 1432, 1433, 1434, 1435, 1436, 1437,
+ 1438, 1439, 1438, 1440, 1441, 1442, 1443, 1443,
+ 1426, 1444, 1445, 54, 1446, 1447, 1448, 1449,
+
+ 1449, 1426, 1426, 1426, 1450, 1451, 1452, 1453,
+ 1454, 1455, 1456, 1456, 1456, 1456, 1457, 1457,
+ 1457, 1457, 1458, 1459, 1460, 1461, 1462, 1463,
+ 1462, 1462, 1462, 1462, 1461, 1462, 1462, 1464,
+
+ 1465, 1466, 1466, 1466, 1467, 1468, 1469, 1470,
+ 1471, 1472, 1473, 1473, 1473, 1473, 1473, 1473,
+ 1474, 1475, 221, 221, 1476, 1477, 1478, 1479,
+ 1480, 1481, 1482, 1483, 1484, 1485, 1486, 1487,
+
+ 1474, 70, 65, 66, 1476, 1477, 1478, 1479,
+ 1480, 1481, 1482, 1483, 1484, 1485, 1486, 221,
+ 1267, 1267, 1267, 1267, 1267, 1488, 1488, 1488,
+ 1488, 1488, 1488, 1488, 1488, 221, 221, 221,
+
+ 768, 768, 768, 768, 768, 768, 768, 1489,
+ 1490, 1491, 768, 1492, 1493, 1494, 1494, 1494,
+ 1495, 1495, 1496, 1496, 1496, 1496, 1497, 1498,
+ 1498, 1499, 1500, 1501, 1502, 1502, 1503, 1504,
+
+ 1505, 1506, 1506, 1506, 1506, 1506, 1506, 1506,
+ 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506,
+ 288, 288, 1507, 1507, 288, 288, 288, 288,
+ 1507, 1507, 1507, 288, 288, 1508, 1508, 1508,
+
+ 1508, 288, 1509, 1509, 1510, 1511, 1511, 1512,
+ 1513, 1512, 1511, 1514, 1272, 1272, 1272, 1272,
+ 1273, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 1515, 1515, 1516, 1517, 1518, 1519, 1515, 1516,
+ 1518, 1517, 1520, 1516, 1516, 1516, 1520, 1520,
+ 1516, 1516, 1516, 1521, 1518, 1516, 1522, 1518,
+ 1523, 1516, 1516, 1516, 1516, 1516, 1518, 1518,
+
+ 1524, 1525, 1526, 1518, 1516, 1518, 1527, 1518,
+ 1516, 1518, 1528, 1529, 1516, 1516, 1530, 1520,
+ 1516, 1516, 1531, 1516, 1520, 1532, 1532, 1532,
+ 1532, 1533, 1534, 1535, 1536, 1537, 1538, 1538,
+
+ 1539, 1458, 1458, 1458, 1458, 1538, 1537, 1537,
+ 1537, 1537, 1540, 1458, 1541, 1542, 1543, 1544,
+ 1545, 1545, 1545, 72, 72, 1546, 1546, 1546,
+ 1546, 1546, 1546, 72, 72, 72, 72, 1546,
+
+ 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547,
+ 1547, 1547, 1547, 1547, 1548, 1548, 1548, 1548,
1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549,
+ 1549, 1549, 1550, 1550, 1550, 1550, 1550, 1550,
+
+ 1551, 1551, 1551, 1552, 138, 1553, 1553, 1553,
+ 1553, 1554, 1555, 1555, 221, 221, 221, 221,
+ 75, 75, 75, 75, 1556, 61, 61, 61,
+ 61, 61, 1557, 1557, 1518, 1518, 1518, 1518,
+
+ 1523, 1518, 1518, 1523, 1518, 1518, 1523, 1518,
+ 1518, 56, 56, 1518, 1518, 1518, 1557, 1518,
+ 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518,
+ 1558, 1558, 1518, 1518, 1518, 1518, 1518, 1518,
+
+ 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518,
+ 1518, 1518, 1518, 1518, 1518, 1559, 1557, 1557,
+ 1518, 1518, 75, 1518, 75, 1518, 1518, 1518,
+ 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518,
+
+ 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1558,
+ 1518, 1518, 1518, 1534, 1534, 1534, 1534, 1534,
+ 1534, 1534, 1534, 1534, 1458, 1458, 1458, 1458,
+ 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+
+ 75, 1523, 75, 75, 1557, 1523, 1523, 75,
+ 1560, 1561, 1562, 1563, 1564, 1565, 1523, 75,
+ 1523, 75, 1566, 1567, 1523, 1568, 1523, 1523,
+ 1523, 1523, 75, 1523, 1523, 75, 75, 1569,
+
+ 1570, 1571, 1572, 75, 1573, 75, 1557, 75,
+ 75, 75, 75, 75, 1574, 1575, 75, 1575,
+ 1575, 1523, 1523, 1523, 75, 75, 75, 75,
+ 1523, 1523, 1523, 1523, 1576, 1577, 1523, 1523,
+
+ 1523, 1557, 1523, 1578, 1557, 1579, 1523, 1557,
+ 75, 1557, 1523, 1523, 1580, 1523, 1523, 1523,
+ 1523, 1523, 1576, 1581, 1582, 1581, 1523, 1523,
+ 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523,
+
+ 1583, 75, 1557, 1523, 1576, 1577, 1576, 1577,
+ 1582, 1581, 1576, 1577, 1523, 1557, 1584, 1585,
+ 1586, 1587, 1582, 1581, 1586, 1587, 1582, 1581,
+ 1586, 1587, 1582, 1581, 1582, 1581, 1582, 1581,
+
+ 1586, 1587, 1576, 1577, 1586, 1587, 1576, 1577,
+ 1586, 1587, 1582, 1581, 1523, 1523, 1523, 1582,
+ 1581, 1582, 1581, 1523, 1523, 75, 1523, 1523,
+ 1588, 75, 1523, 1523, 1523, 1523, 1523, 1523,
+
+ 1523, 1523, 1582, 1581, 1523, 75, 1589, 1523,
+ 1590, 1591, 1523, 1591, 1557, 1557, 1557, 1557,
+ 1582, 1581, 1582, 1581, 1582, 1581, 1582, 1581,
+ 1592, 1523, 1523, 1523, 1523, 1523, 1523, 75,
+
+ 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523,
+ 1523, 1582, 1581, 1582, 1581, 1593, 1523, 1523,
+ 1582, 1581, 1523, 1523, 1523, 1523, 1582, 1581,
+ 1582, 1581, 1582, 1581, 1582, 1581, 1582, 1581,
+
+ 1586, 1587, 1586, 1587, 1582, 1581, 1582, 1581,
+ 1582, 1581, 1586, 1587, 1586, 1587, 1523, 1594,
+ 1582, 1581, 1595, 1595, 1595, 1458, 1596, 1596,
+ 1458, 1458, 1597, 1597, 1597, 1598, 1598, 1458,
+
+ 1518, 1534, 1518, 1518, 1518, 1518, 1518, 1518,
+ 1451, 1452, 1451, 1452, 1518, 1518, 1518, 1518,
+ 1518, 1518, 1558, 1518, 1518, 1518, 1518, 1518,
+ 1518, 1518, 1599, 1599, 1518, 1518, 1518, 1518,
+
+ 1523, 1523, 1518, 1518, 1518, 1518, 1518, 1518,
+ 56, 1600, 1601, 1518, 1518, 1518, 1518, 1518,
+ 1518, 1518, 1518, 1518, 1518, 1518, 1602, 1602,
+ 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602,
+
+ 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602,
+ 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602,
+ 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602,
+ 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602,
+
+ 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602,
+ 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602,
+ 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602,
+ 1602, 1602, 1602, 1534, 1458, 1534, 1534, 1534,
+
+ 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534,
+ 1603, 1534, 1534, 1534, 1534, 1534, 1534, 1534,
+ 1534, 1534, 1534, 1534, 1534, 1604, 1534, 1534,
+ 1534, 1534, 1534, 1458, 1458, 1458, 1458, 1458,
+
+ 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+ 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+ 1458, 1458, 1458, 1458, 1540, 1540, 1540, 1540,
+ 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540,
+
+ 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540,
+ 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1605,
+ 1606, 1541, 1541, 1541, 1541, 1541, 1541, 1541,
+ 1541, 1541, 1541, 1541, 1607, 1607, 1607, 1607,
+
+ 1607, 1607, 1542, 1542, 1542, 1542, 1542, 1542,
+ 1608, 1609, 1609, 1609, 1609, 1610, 1610, 1610,
+ 1611, 1612, 1612, 1611, 1613, 1613, 1613, 1613,
+ 1614, 1614, 1614, 1615, 1615, 1615, 1615, 1616,
+
+ 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518,
+ 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518,
+ 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518,
+ 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518,
+
+ 1518, 1518, 1518, 1518, 1518, 1534, 1534, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518,
+ 1518, 1518, 1518, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 1617, 1618, 1619, 1620, 1621, 1622, 1623, 1624,
+ 1625, 72, 72, 72, 72, 72, 72, 72,
+ 72, 72, 72, 72, 1626, 1627, 1628, 1629,
+ 1630, 1631, 1632, 1633, 1634, 1635, 1635, 1635,
+
+ 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635,
+ 1636, 1637, 1638, 1639, 1640, 1641, 1642, 1643,
+ 1644, 1645, 1645, 1645, 1645, 1645, 1645, 1645,
+ 1645, 1645, 1645, 1645, 1646, 1646, 1646, 1646,
- 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549,
- 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549,
- 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549,
- 1549, 1549, 1549, 1492, 1426, 1492, 1492, 1492,
-
- 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492,
- 1550, 1492, 1492, 1492, 1492, 1492, 1492, 1492,
- 1492, 1492, 1492, 1492, 1492, 1551, 1492, 1492,
- 1492, 1492, 1492, 1426, 1426, 1426, 1426, 1426,
-
- 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426,
- 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426,
- 1426, 1426, 1426, 1426, 1498, 1498, 1498, 1498,
- 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498,
-
- 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498,
- 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1552,
- 1553, 1499, 1499, 1499, 1499, 1499, 1499, 1499,
- 1499, 1499, 1499, 1499, 1554, 1554, 1554, 1554,
-
- 1554, 1554, 1500, 1500, 1500, 1500, 1500, 1500,
- 1555, 1556, 1556, 1556, 1556, 1556, 1556, 1556,
- 1557, 1557, 1557, 1557, 1558, 1558, 1558, 1558,
- 1559, 1559, 1559, 1560, 1560, 1560, 1560, 1561,
-
- 52, 52, 52, 52, 52, 52, 52, 52,
- 52, 52, 52, 52, 52, 52, 52, 52,
- 52, 52, 52, 52, 52, 52, 52, 52,
- 52, 52, 52, 52, 52, 52, 52, 52,
-
- 52, 52, 52, 52, 52, 1492, 1492, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
-
- 52, 52, 52, 52, 52, 52, 52, 52,
- 52, 52, 52, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
-
- 1562, 1563, 1564, 1565, 1566, 1567, 1568, 1569,
- 1570, 69, 69, 69, 69, 69, 69, 69,
- 69, 69, 69, 69, 1571, 1572, 1573, 1574,
- 1575, 1576, 1577, 1578, 1579, 1580, 1580, 1580,
-
- 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580,
- 1581, 1582, 1583, 1584, 1585, 1586, 1587, 1588,
- 1589, 1590, 1590, 1590, 1590, 1590, 1590, 1590,
- 1590, 1590, 1590, 1590, 1591, 1591, 1591, 1591,
-
- 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591,
- 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591,
- 1591, 1591, 1591, 1591, 1591, 1591, 1592, 1592,
- 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592,
-
- 1592, 1592, 1593, 1592, 1592, 1592, 1592, 1592,
- 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592,
- 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594,
- 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594,
-
- 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594,
- 1594, 1594, 1595, 1596, 1596, 1596, 1596, 1596,
- 1596, 1596, 1596, 1596, 1596, 1597, 1598, 1599,
- 1600, 1601, 1602, 1603, 1604, 1605, 1596, 1606,
-
- 52, 52, 52, 52, 52, 52, 52, 52,
- 52, 52, 52, 52, 52, 52, 52, 52,
- 52, 52, 52, 52, 52, 52, 1498, 1498,
- 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498,
-
- 52, 52, 52, 52, 52, 52, 52, 52,
- 52, 52, 55, 55, 52, 52, 52, 52,
- 52, 52, 52, 52, 52, 52, 55, 58,
- 52, 52, 52, 52, 52, 52, 52, 52,
-
- 55, 58, 52, 52, 52, 52, 52, 52,
- 52, 52, 52, 52, 52, 52, 52, 52,
- 52, 52, 52, 52, 52, 52, 52, 52,
- 52, 52, 52, 52, 52, 52, 52, 52,
-
- 52, 52, 52, 52, 52, 52, 52, 52,
- 52, 52, 52, 52, 52, 52, 52, 52,
- 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492,
- 1426, 1426, 1426, 1607, 1607, 1607, 1607, 1426,
-
- 1546, 1546, 1546, 1546, 55, 55, 52, 55,
- 55, 55, 55, 55, 55, 55, 55, 55,
- 55, 55, 55, 52, 1608, 1608, 1609, 1609,
- 1610, 1550, 1546, 1546, 1546, 1611, 1546, 1546,
-
- 55, 55, 55, 55, 55, 55, 55, 55,
- 55, 55, 55, 55, 55, 55, 55, 55,
- 55, 55, 55, 55, 55, 55, 55, 55,
- 55, 1546, 1546, 1546, 55, 55, 55, 55,
-
- 55, 55, 55, 55, 55, 55, 55, 55,
- 55, 55, 55, 55, 55, 55, 55, 55,
- 55, 55, 55, 55, 55, 55, 55, 55,
- 55, 55, 55, 55, 55, 55, 55, 55,
-
- 55, 55, 55, 55, 55, 55, 55, 55,
- 1546, 55, 55, 55, 55, 55, 55, 1510,
- 1550, 1550, 1609, 1609, 1609, 1609, 1609, 1609,
- 1609, 1609, 1609, 1609, 1609, 1609, 1612, 1610,
-
- 1609, 1609, 1609, 1609, 1609, 1609, 1498, 1498,
- 1498, 1498, 1553, 1553, 1553, 1553, 1553, 1553,
- 1552, 1552, 1612, 1612, 1612, 1612, 1612, 1612,
- 1612, 1612, 1612, 1612, 1612, 1613, 1614, 1614,
-
- 1552, 1552, 1612, 1612, 1612, 1612, 1612, 1612,
- 1612, 1612, 1612, 1612, 1615, 1612, 1612, 1612,
- 1612, 1612, 1616, 1613, 1613, 1613, 1613, 1613,
- 1613, 1613, 1613, 1613, 1613, 1617, 1617, 1617,
-
- 1618, 1618, 1618, 1618, 1617, 1617, 1617, 1617,
- 1617, 1614, 1614, 1614, 1614, 1617, 1556, 1617,
- 1617, 1617, 1614, 1617, 1617, 1614, 1614, 1614,
- 1617, 1617, 1614, 1614, 1617, 1614, 1614, 1617,
-
- 1617, 1617, 1556, 1614, 1556, 1556, 1556, 1556,
- 1614, 1614, 1617, 1614, 1614, 1614, 1614, 1614,
- 1614, 1617, 1617, 1617, 1617, 1617, 1614, 1617,
- 1617, 1619, 1617, 1614, 1614, 1617, 1617, 1617,
-
- 1620, 1546, 1546, 1546, 1546, 1556, 52, 52,
- 1546, 1546, 1621, 1621, 1611, 1611, 55, 55,
- 55, 55, 55, 52, 55, 52, 55, 52,
- 52, 52, 52, 52, 52, 55, 52, 52,
-
- 52, 55, 52, 52, 52, 52, 52, 52,
- 1556, 52, 52, 52, 52, 52, 52, 52,
- 52, 52, 52, 55, 55, 52, 52, 52,
- 52, 52, 52, 52, 52, 52, 52, 52,
-
- 52, 52, 52, 52, 55, 52, 52, 55,
- 52, 52, 52, 52, 1556, 52, 1556, 52,
- 52, 52, 52, 1556, 1556, 1556, 52, 1614,
- 52, 52, 52, 1622, 1622, 1622, 1622, 1623,
-
- 1623, 52, 1624, 1625, 1546, 55, 55, 55,
- 1626, 1627, 1626, 1627, 1626, 1627, 1626, 1627,
- 1626, 1627, 1626, 1627, 1626, 1627, 1628, 1629,
- 1630, 1631, 1632, 1633, 1634, 1635, 1636, 1637,
-
- 1628, 1629, 1630, 1631, 1632, 1633, 1634, 1635,
- 1636, 1637, 1628, 1629, 1630, 1631, 1632, 1633,
- 1634, 1635, 1636, 1637, 52, 1556, 1556, 1556,
- 52, 52, 52, 52, 52, 52, 52, 52,
-
- 52, 55, 52, 52, 52, 52, 52, 52,
- 52, 52, 52, 52, 52, 52, 52, 52,
- 1556, 52, 52, 52, 52, 52, 52, 52,
- 52, 52, 52, 52, 52, 52, 52, 1556,
-
- 1638, 1638, 1638, 1639, 1640, 1641, 1642, 1554,
- 1643, 1644, 1554, 1645, 1646, 1647, 1648, 1648,
- 1426, 1426, 1426, 1426, 1426, 1649, 1650, 1426,
- 1426, 1426, 1426, 1426, 1651, 1649, 1650, 1426,
-
- 1426, 1426, 1649, 1650, 1649, 1650, 1626, 1627,
- 1626, 1627, 1626, 1627, 1652, 1653, 1652, 1653,
- 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426,
- 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426,
-
- 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654,
- 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654,
- 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654,
- 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654,
-
- 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426,
- 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426,
- 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426,
- 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426,
-
- 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426,
- 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426,
- 1426, 1426, 1426, 1426, 1607, 1607, 1426, 1426,
- 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426,
-
- 1426, 1426, 1426, 1626, 1627, 1626, 1627, 1626,
- 1627, 1626, 1627, 1626, 1627, 1655, 1656, 1657,
- 1658, 1626, 1627, 1626, 1627, 1626, 1627, 1626,
- 1627, 1426, 1426, 1659, 1426, 1426, 1426, 1426,
-
- 1660, 1426, 1426, 1661, 1649, 1650, 1426, 1426,
- 1649, 1650, 1649, 1650, 1649, 1650, 1649, 1650,
- 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426,
- 1662, 1426, 1426, 1426, 1426, 1426, 1426, 1426,
-
- 1649, 1650, 1426, 1426, 1649, 1650, 1426, 1426,
- 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1649,
- 1650, 1649, 1650, 1426, 1649, 1650, 1426, 1426,
- 1626, 1627, 1626, 1627, 1426, 1426, 1426, 1426,
-
- 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426,
- 1649, 1650, 1426, 1426, 1426, 1426, 1426, 1426,
- 1426, 1426, 1426, 1426, 1426, 1663, 1426, 1426,
- 1649, 1650, 1426, 1426, 1626, 1627, 1426, 1426,
-
- 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426,
- 1426, 1426, 1426, 1426, 1497, 1426, 1426, 1426,
- 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426,
- 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426,
-
- 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426,
- 1426, 1426, 1426, 1649, 1650, 1649, 1650, 1426,
- 1426, 1426, 1426, 1426, 1649, 1650, 1426, 1426,
- 1426, 1426, 1426, 1426, 1649, 1650, 1426, 1426,
-
- 1426, 1426, 1426, 1426, 1649, 1650, 1426, 1426,
- 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426,
- 1426, 1426, 1426, 1426, 1664, 1664, 1664, 1426,
- 1426, 1649, 1650, 1649, 1650, 1649, 1650, 1649,
-
- 1650, 1649, 1650, 1649, 1650, 1649, 1650, 1649,
- 1650, 1649, 1650, 1649, 1650, 1649, 1650, 1649,
- 1650, 1649, 1650, 1649, 1650, 1649, 1650, 1649,
- 1650, 1649, 1650, 1649, 1650, 1649, 1650, 1649,
-
- 1650, 1649, 1650, 1426, 1426, 1426, 1649, 1650,
- 1649, 1650, 1649, 1650, 1649, 1650, 1426, 1649,
- 1650, 1649, 1650, 1649, 1650, 1649, 1650, 1649,
- 1650, 1649, 1650, 1649, 1650, 1649, 1650, 1649,
-
- 1650, 1649, 1650, 1649, 1650, 1649, 1650, 1649,
- 1650, 1649, 1650, 1649, 1650, 1649, 1650, 1649,
- 1650, 1649, 1650, 1649, 1650, 1649, 1650, 1426,
- 1426, 1426, 1426, 1426, 1665, 1426, 1666, 1426,
-
- 1426, 1426, 1426, 1667, 1668, 1667, 1426, 1426,
- 1426, 1426, 1426, 1426, 1649, 1650, 1669, 1426,
- 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1649,
- 1650, 1649, 1650, 1426, 1426, 1426, 1426, 1426,
-
- 1553, 1553, 1553, 1553, 1553, 1552, 1552, 1552,
- 1553, 1553, 1553, 1553, 1553, 1553, 1499, 1499,
- 1499, 1499, 1499, 1499, 1500, 1500, 1500, 1500,
- 1500, 1500, 1500, 1613, 1613, 1670, 1670, 1670,
-
- 1500, 1500, 1500, 1500, 1670, 1670, 1670, 1670,
- 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670,
1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646,
1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646,
+ 1646, 1646, 1646, 1646, 1646, 1646, 1647, 1647,
+ 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647,
+
+ 1647, 1647, 1648, 1647, 1647, 1647, 1647, 1647,
+ 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647,
+ 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649,
+ 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649,
- 1646, 1646, 1646, 1646, 1646, 1670, 1670, 1646,
- 1646, 1646, 1646, 1646, 1646, 1558, 1558, 1558,
- 1613, 1670, 1670, 1670, 1670, 1614, 1555, 1555,
- 1555, 1555, 1558, 1558, 1558, 1558, 1558, 1558,
+ 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649,
+ 1649, 1649, 1650, 1651, 1651, 1651, 1651, 1651,
+ 1651, 1651, 1651, 1651, 1651, 1652, 1653, 1654,
+ 1655, 1656, 1657, 1658, 1659, 1660, 1651, 1661,
1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558,
1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558,
- 1558, 1558, 1558, 1558, 206, 206, 1558, 1558,
+ 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558,
1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558,
1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558,
+ 1558, 1558, 1558, 1558, 1518, 1518, 1518, 1518,
1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558,
- 1558, 1558, 1558, 1558, 1558, 1558, 206, 1671,
1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558,
1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558,
1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558,
- 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558,
- 1558, 1558, 1672, 1672, 1672, 1558, 1558, 1558,
+ 1558, 1558, 1558, 1558, 1518, 1518, 1518, 1518,
+ 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518,
1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558,
- 1558, 1673, 1558, 1558, 1558, 1558, 1558, 1558,
- 1558, 1558, 1561, 1672, 1672, 1672, 1672, 1672,
- 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672,
-
- 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672,
- 1672, 1672, 1672, 1672, 1509, 1509, 1509, 1509,
- 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672,
- 1672, 1672, 1672, 1672, 1672, 1672, 1674, 1673,
-
- 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675,
- 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675,
- 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675,
- 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675,
-
- 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675,
- 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1676,
- 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677,
- 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677,
-
- 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677,
- 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677,
- 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677,
- 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1678,
-
- 131, 127, 1679, 1680, 1681, 1682, 1683, 131,
- 127, 131, 127, 131, 127, 1684, 1685, 1686,
- 1687, 1265, 1267, 1268, 1688, 131, 127, 1688,
- 1265, 1265, 1265, 1265, 1689, 1689, 1690, 1691,
-
- 1692, 1693, 1692, 1693, 1692, 1693, 1692, 1693,
- 1692, 1693, 1692, 1693, 1692, 1693, 1692, 1693,
- 1692, 1693, 1692, 1693, 1692, 1693, 1692, 1693,
- 1692, 1693, 1692, 1693, 1692, 1693, 1692, 1693,
-
- 1692, 1693, 1692, 1693, 1694, 1695, 1695, 1695,
- 1695, 1695, 1695, 1696, 1697, 1696, 1697, 1698,
- 1698, 1698, 1699, 1700, 206, 206, 206, 206,
- 206, 1701, 1702, 1702, 1702, 1703, 1701, 1702,
-
- 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704,
- 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704,
- 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704,
- 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704,
-
- 1704, 1704, 1704, 1704, 1704, 1704, 206, 1705,
- 206, 206, 206, 206, 206, 1705, 206, 206,
- 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706,
- 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706,
-
- 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706,
- 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706,
- 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706,
- 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706,
-
- 1706, 1706, 1706, 1706, 1706, 1706, 1707, 1707,
- 206, 206, 206, 206, 206, 206, 206, 1708,
- 1709, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 1710,
-
- 891, 891, 891, 891, 891, 891, 891, 891,
- 891, 891, 891, 891, 891, 891, 891, 891,
- 891, 891, 891, 891, 891, 891, 891, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
-
- 891, 891, 891, 891, 891, 891, 891, 206,
- 891, 891, 891, 891, 891, 891, 891, 206,
- 891, 891, 891, 891, 891, 891, 891, 206,
- 891, 891, 891, 891, 891, 891, 891, 206,
-
- 271, 271, 271, 271, 271, 271, 271, 271,
- 271, 271, 271, 271, 271, 271, 271, 271,
- 271, 271, 271, 271, 271, 271, 271, 271,
- 271, 271, 271, 271, 271, 271, 271, 271,
-
- 1711, 1711, 1712, 1713, 1712, 1713, 1711, 1711,
- 1711, 1712, 1713, 1711, 1712, 1713, 1430, 1430,
- 1430, 1430, 1430, 1430, 1430, 1430, 1429, 1714,
- 1715, 1716, 1717, 1718, 1712, 1713, 1718, 1718,
-
- 1719, 1720, 1652, 1653, 1652, 1653, 1652, 1653,
- 1652, 1653, 1716, 1716, 1716, 1716, 1721, 1722,
- 1716, 1723, 1724, 1725, 1725, 1724, 1724, 1724,
- 1724, 1724, 1726, 1726, 1727, 1728, 1728, 1729,
-
- 1730, 1728, 1731, 1732, 1732, 1733, 1733, 1733,
- 1733, 1733, 1734, 1735, 1734, 1735, 1734, 1736,
- 1671, 1671, 1737, 1738, 1738, 1739, 1740, 1739,
- 1740, 1739, 1740, 1739, 1740, 1741, 206, 206,
-
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 206, 1742, 1742, 1742, 1742, 1743,
-
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
-
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1743, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
-
- 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743,
- 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743,
- 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743,
- 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743,
-
- 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743,
- 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743,
- 1743, 1743, 1743, 1743, 1743, 1743, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
-
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744,
- 1744, 1744, 1744, 1744, 206, 206, 206, 206,
-
- 1381, 1745, 1746, 1747, 1748, 1749, 1750, 1751,
- 1419, 1420, 1419, 1420, 1419, 1420, 1419, 1420,
- 1419, 1420, 1748, 1748, 1419, 1420, 1419, 1420,
- 1419, 1420, 1419, 1420, 1752, 1396, 1753, 1753,
-
- 1748, 1751, 1751, 1751, 1751, 1751, 1751, 1751,
- 1751, 1751, 1754, 1755, 178, 1756, 1757, 1757,
- 1758, 1759, 1759, 1759, 1759, 1760, 1761, 1748,
- 1762, 1762, 1762, 1763, 1764, 1765, 1766, 1748,
-
- 206, 1767, 1768, 1767, 1768, 1767, 1768, 1767,
- 1768, 1767, 1768, 1768, 1769, 1768, 1769, 1768,
- 1769, 1768, 1769, 1768, 1769, 1768, 1769, 1768,
- 1769, 1768, 1769, 1768, 1769, 1768, 1769, 1768,
-
- 1769, 1768, 1769, 1767, 1768, 1769, 1768, 1769,
- 1768, 1769, 1768, 1768, 1768, 1768, 1768, 1768,
- 1769, 1769, 1768, 1769, 1769, 1768, 1769, 1769,
- 1768, 1769, 1769, 1768, 1769, 1769, 1768, 1768,
-
- 1768, 1768, 1768, 1767, 1768, 1767, 1768, 1767,
- 1768, 1768, 1768, 1768, 1768, 1768, 1767, 1768,
- 1768, 1768, 1768, 1768, 1769, 1770, 1770, 206,
- 206, 1771, 1771, 1772, 1772, 1773, 1774, 1775,
-
- 1776, 1777, 1778, 1777, 1778, 1777, 1778, 1777,
- 1778, 1777, 1778, 1778, 1779, 1778, 1779, 1778,
- 1779, 1778, 1779, 1778, 1779, 1778, 1779, 1778,
- 1779, 1778, 1779, 1778, 1779, 1778, 1779, 1778,
-
- 1779, 1778, 1779, 1777, 1778, 1779, 1778, 1779,
- 1778, 1779, 1778, 1778, 1778, 1778, 1778, 1778,
- 1779, 1779, 1778, 1779, 1779, 1778, 1779, 1779,
- 1778, 1779, 1779, 1778, 1779, 1779, 1778, 1778,
-
- 1778, 1778, 1778, 1777, 1778, 1777, 1778, 1777,
- 1778, 1778, 1778, 1778, 1778, 1778, 1777, 1778,
- 1778, 1778, 1778, 1778, 1779, 1777, 1777, 1779,
- 1779, 1779, 1779, 1780, 1781, 1782, 1783, 1784,
-
- 206, 206, 206, 206, 206, 1785, 1785, 1785,
- 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785,
- 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785,
- 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785,
-
- 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785,
- 1785, 1785, 1785, 1785, 1785, 1786, 1787, 1788,
- 206, 1789, 1789, 1789, 1789, 1789, 1789, 1789,
- 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789,
-
- 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789,
- 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789,
- 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789,
- 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789,
-
- 1789, 1789, 1789, 1789, 1790, 1789, 1789, 1789,
- 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789,
- 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789,
- 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789,
-
- 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789,
- 1789, 1789, 1789, 1789, 1789, 1789, 1789, 206,
- 1791, 1791, 1792, 1792, 1792, 1792, 1793, 1793,
- 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793,
-
- 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794,
- 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794,
- 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794,
- 1795, 1795, 1795, 1796, 1796, 1796, 1796, 1796,
-
- 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797,
- 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797,
- 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798,
- 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798,
-
- 1798, 1798, 1798, 1798, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799,
- 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799,
-
- 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800,
- 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800,
- 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800,
- 1800, 1800, 1800, 1800, 1800, 1801, 1801, 206,
-
- 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802,
- 1802, 1802, 1803, 1803, 1803, 1803, 1803, 1803,
- 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803,
- 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803,
-
- 1803, 1803, 1803, 1803, 1804, 1804, 1804, 1804,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1806, 1807, 1807, 1807, 1807, 1807, 1807, 1807,
- 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807,
-
- 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808,
- 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808,
- 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808,
- 1808, 1808, 1808, 1808, 1809, 1809, 1810, 1791,
-
- 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792,
- 1792, 1792, 1793, 1793, 1793, 1793, 1793, 1793,
- 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1811,
- 1793, 1811, 1793, 1793, 1793, 1793, 1793, 1793,
-
- 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793,
- 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793,
- 1793, 1807, 1807, 1807, 1807, 1807, 1807, 1807,
- 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807,
-
- 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793,
- 1793, 1793, 1793, 1793, 1806, 1806, 1806, 1806,
- 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812,
- 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812,
-
- 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812,
- 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812,
- 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812,
- 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1813,
-
- 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812,
- 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812,
- 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812,
- 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812,
-
- 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812,
- 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812,
- 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812,
- 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793,
-
- 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793,
- 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793,
- 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1806,
- 1806, 1806, 1806, 1793, 1793, 1793, 1793, 1793,
-
- 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793,
- 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793,
- 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793,
- 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793,
-
- 1793, 1793, 1803, 1793, 1793, 1793, 1793, 1803,
- 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793,
- 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793,
- 1803, 1793, 1793, 1793, 1793, 1793, 1806, 1806,
-
- 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793,
- 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793,
- 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793,
- 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1806,
-
- 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814,
- 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814,
- 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814,
- 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814,
-
- 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814,
- 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814,
- 1814, 1814, 1814, 1814, 1814, 1814, 1815, 1815,
- 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815,
-
- 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553,
- 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553,
- 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553,
- 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553,
-
- 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816,
- 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816,
- 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816,
- 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816,
-
- 1816, 1816, 1816, 1816, 1816, 1816, 1817, 1817,
- 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817,
- 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817,
- 1817, 1817, 1817, 1817, 1818, 1818, 1818, 1818,
-
- 1818, 1818, 1818, 1818, 1819, 1819, 1819, 1819,
- 1819, 1819, 1819, 1819, 1820, 1821, 1821, 1821,
- 1821, 1821, 1821, 1821, 1821, 1821, 1822, 1822,
+ 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558,
+ 1518, 1518, 1558, 1558, 1558, 1558, 1540, 1540,
+ 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540,
+
+ 1558, 1558, 1518, 1558, 1558, 1558, 1558, 1558,
+ 1558, 1558, 56, 56, 1518, 1518, 1518, 1518,
+ 1518, 1518, 1558, 1558, 1518, 1518, 61, 75,
+ 1518, 1518, 1518, 1518, 1558, 1558, 1518, 1518,
+
+ 61, 75, 1518, 1518, 1518, 1518, 1558, 1558,
+ 1558, 1518, 1518, 1558, 1518, 1518, 1558, 1558,
+ 1558, 1558, 1518, 1518, 1518, 1518, 1518, 1518,
+ 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518,
+
+ 1518, 1518, 1558, 1558, 1558, 1558, 1518, 1518,
+ 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1558,
+ 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534,
+ 1458, 1458, 1458, 1662, 1662, 1663, 1663, 1458,
+
+ 1664, 1664, 1664, 1664, 56, 61, 1558, 56,
+ 56, 61, 56, 56, 56, 56, 61, 61,
+ 56, 56, 56, 1518, 1665, 1665, 1666, 1666,
+ 1667, 1603, 1664, 1664, 1668, 1669, 1668, 1664,
+
+ 56, 56, 56, 56, 56, 56, 56, 56,
+ 56, 56, 56, 56, 56, 56, 56, 56,
+ 56, 56, 56, 56, 56, 56, 56, 56,
+ 56, 1664, 1664, 1664, 56, 56, 56, 56,
+
+ 61, 56, 61, 56, 56, 56, 56, 56,
+ 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670,
+ 1670, 1670, 1670, 1670, 56, 56, 56, 56,
+ 56, 56, 56, 56, 56, 56, 56, 56,
+
+ 61, 61, 56, 61, 61, 61, 56, 61,
+ 1668, 61, 61, 56, 61, 61, 56, 1556,
+ 1603, 1603, 1666, 1666, 1666, 1666, 1666, 1666,
+ 1666, 1666, 1666, 1666, 1666, 1666, 1671, 1672,
+
+ 1666, 1666, 1666, 1666, 1666, 1666, 1540, 1540,
+ 1540, 1540, 1606, 1606, 1606, 1606, 1606, 1606,
+ 1605, 1605, 1671, 1673, 1671, 1671, 1671, 1671,
+ 1671, 1671, 1671, 1671, 1671, 1674, 1675, 1675,
+
+ 1605, 1676, 1671, 1671, 1671, 1671, 1671, 1671,
+ 1671, 1671, 1673, 1673, 1677, 1671, 1671, 1671,
+ 1671, 1671, 1678, 1674, 1674, 1674, 1674, 1674,
+ 1674, 1674, 1674, 1674, 1674, 1679, 1679, 1680,
+
+ 1681, 1681, 1681, 1681, 1679, 1679, 1680, 1680,
+ 1680, 1675, 1675, 1675, 1675, 1680, 1609, 1680,
+ 1680, 1680, 1675, 1680, 1679, 1675, 1675, 1675,
+ 1680, 1680, 1675, 1675, 1680, 1675, 1675, 1680,
+
+ 1680, 1680, 1610, 1675, 1610, 1610, 1610, 1610,
+ 1675, 1675, 1679, 1675, 1675, 1675, 1675, 1675,
+ 1675, 1680, 1679, 1679, 1680, 1679, 1675, 1680,
+ 1680, 1682, 1679, 1675, 1675, 1679, 1680, 1680,
+
+ 1683, 1664, 1664, 1664, 1664, 1609, 1518, 1518,
+ 1664, 1664, 1684, 1684, 1669, 1669, 56, 56,
+ 56, 56, 56, 1518, 56, 1518, 56, 1518,
+ 1518, 1518, 1518, 1518, 1518, 56, 1518, 1518,
+
+ 1518, 56, 1518, 1518, 1518, 1518, 1518, 1518,
+ 1609, 1518, 1518, 1518, 1518, 1518, 1518, 1518,
+ 1518, 1518, 1518, 56, 56, 1518, 1518, 1518,
+ 1518, 1518, 1518, 1518, 1518, 1558, 1518, 1518,
+
+ 1518, 1518, 1518, 1518, 56, 1518, 1518, 56,
+ 1518, 1518, 1518, 1518, 1609, 1518, 1609, 1518,
+ 1518, 1518, 1518, 1609, 1609, 1609, 1518, 1685,
+ 1518, 1518, 1518, 1686, 1686, 1686, 1686, 1687,
+
+ 1687, 1518, 1688, 1689, 1664, 56, 56, 56,
+ 1690, 1691, 1690, 1691, 1690, 1691, 1690, 1691,
+ 1690, 1691, 1690, 1691, 1690, 1691, 1692, 1693,
+ 1694, 1695, 1696, 1697, 1698, 1699, 1700, 1701,
+
+ 1702, 1703, 1704, 1705, 1706, 1707, 1708, 1709,
+ 1710, 1711, 1702, 1703, 1704, 1705, 1706, 1707,
+ 1708, 1709, 1710, 1711, 1518, 1609, 1609, 1609,
+ 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518,
+
+ 1518, 56, 1518, 1518, 1518, 1518, 1518, 1518,
+ 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518,
+ 1609, 1518, 1518, 1518, 1518, 1518, 1518, 1518,
+ 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1609,
+
+ 1712, 1712, 1712, 1713, 1714, 1715, 1716, 1607,
+ 1717, 1718, 1607, 1719, 1720, 1721, 1722, 1722,
+ 1458, 1458, 1458, 1458, 1458, 1723, 1724, 1458,
+ 1458, 1458, 1458, 1458, 1725, 1723, 1724, 1458,
+
+ 1458, 1458, 1723, 1724, 1723, 1724, 1726, 1727,
+ 1726, 1727, 1726, 1727, 1728, 1729, 1730, 1731,
+ 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+ 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+
+ 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732,
+ 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732,
+ 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732,
+ 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732,
+
+ 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+ 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+ 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+ 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+
+ 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+ 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+ 1458, 1458, 1458, 1458, 1662, 1662, 1458, 1458,
+ 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+
+ 1458, 1458, 1458, 1690, 1691, 1726, 1727, 1690,
+ 1691, 1690, 1691, 1690, 1691, 1733, 1734, 1735,
+ 1736, 1690, 1691, 1690, 1691, 1690, 1691, 1690,
+ 1691, 1458, 1458, 1737, 1458, 1458, 1458, 1458,
+
+ 1738, 1458, 1458, 1739, 1723, 1724, 1458, 1458,
+ 1723, 1724, 1723, 1724, 1723, 1724, 1723, 1724,
+ 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+ 1740, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+
+ 1723, 1724, 1458, 1458, 1723, 1724, 1458, 1458,
+ 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1723,
+ 1724, 1723, 1724, 1458, 1723, 1724, 1458, 1458,
+ 1690, 1691, 1690, 1691, 1458, 1458, 1458, 1458,
+
+ 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+ 1723, 1724, 1458, 1458, 1458, 1458, 1458, 1458,
+ 1458, 1458, 1458, 1458, 1458, 1741, 1458, 1458,
+ 1723, 1724, 1458, 1458, 1690, 1691, 1458, 1458,
+
+ 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+ 1458, 1458, 1458, 1458, 1539, 1458, 1458, 1458,
+ 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+ 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+
+ 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+ 1458, 1458, 1458, 1723, 1724, 1723, 1724, 1458,
+ 1458, 1458, 1458, 1458, 1723, 1724, 1458, 1458,
+ 1458, 1458, 1458, 1458, 1723, 1724, 1458, 1458,
+
+ 1458, 1458, 1458, 1458, 1723, 1724, 1458, 1458,
+ 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+ 1458, 1458, 1458, 1458, 1742, 1742, 1742, 1458,
+ 1458, 1723, 1724, 1723, 1724, 1723, 1724, 1723,
+
+ 1724, 1723, 1724, 1723, 1724, 1723, 1724, 1723,
+ 1724, 1723, 1724, 1723, 1724, 1723, 1724, 1723,
+ 1724, 1723, 1724, 1723, 1724, 1723, 1724, 1723,
+ 1724, 1723, 1724, 1723, 1724, 1723, 1724, 1723,
+
+ 1724, 1723, 1724, 1458, 1458, 1458, 1723, 1724,
+ 1723, 1724, 1723, 1724, 1723, 1724, 1458, 1723,
+ 1724, 1723, 1724, 1723, 1724, 1723, 1724, 1723,
+ 1724, 1723, 1724, 1723, 1724, 1723, 1724, 1723,
+
+ 1724, 1723, 1724, 1723, 1724, 1723, 1724, 1723,
+ 1724, 1723, 1724, 1723, 1724, 1723, 1724, 1723,
+ 1724, 1723, 1724, 1723, 1724, 1723, 1724, 1458,
+ 1458, 1458, 1458, 1458, 1743, 1458, 1744, 1458,
+
+ 1458, 1458, 1458, 1745, 1746, 1745, 1458, 1458,
+ 1458, 1458, 1458, 1458, 1723, 1724, 1747, 1458,
+ 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1723,
+ 1724, 1723, 1724, 1458, 1458, 1458, 1458, 1458,
+
+ 1606, 1606, 1606, 1606, 1606, 1605, 1605, 1605,
+ 1606, 1606, 1606, 1606, 1606, 1606, 1541, 1541,
+ 1541, 1541, 1541, 1541, 1542, 1542, 1542, 1542,
+ 1542, 1542, 1542, 1748, 1748, 1749, 1749, 1749,
+
+ 1542, 1542, 1542, 1542, 1749, 1749, 1749, 1749,
+ 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749,
+ 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720,
+ 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720,
+
+ 1720, 1720, 1720, 1720, 1720, 1749, 1749, 1720,
+ 1720, 1720, 1720, 1720, 1720, 1613, 1613, 1613,
+ 1748, 1749, 1749, 1749, 1749, 1685, 1750, 1750,
+ 1750, 1750, 1613, 1613, 1613, 1613, 1613, 1613,
+
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 1613, 1613, 1613, 1613, 221, 221, 1613, 1613,
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 1613, 1613, 1613, 1613, 1613, 1613, 221, 1751,
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 1613, 1613, 1752, 1752, 1752, 1613, 1613, 1613,
+
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 1613, 1753, 1613, 1613, 1613, 1613, 1613, 1613,
+ 1613, 1613, 1616, 1752, 1752, 1752, 1752, 1752,
+ 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752,
+
+ 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752,
+ 1752, 1752, 1752, 1752, 1555, 1555, 1555, 1555,
+ 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752,
+ 1752, 1752, 1752, 1752, 1752, 1752, 1754, 1753,
+
+ 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755,
+ 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755,
+ 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755,
+ 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755,
+
+ 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755,
+ 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1756,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1758,
+
+ 142, 138, 1759, 1760, 1761, 1762, 1763, 142,
+ 138, 142, 138, 142, 138, 1764, 1765, 1766,
+ 1767, 1290, 1292, 1293, 1768, 142, 138, 1768,
+ 1290, 1290, 1290, 1290, 1769, 1769, 1770, 1771,
+
+ 1772, 1773, 1772, 1773, 1772, 1773, 1772, 1773,
+ 1772, 1773, 1772, 1773, 1772, 1773, 1772, 1773,
+ 1772, 1773, 1772, 1773, 1772, 1773, 1772, 1773,
+ 1772, 1773, 1772, 1773, 1772, 1773, 1772, 1773,
+
+ 1772, 1773, 1772, 1773, 1774, 1775, 1775, 1775,
+ 1775, 1775, 1775, 1776, 1777, 1776, 1777, 1778,
+ 1778, 1778, 1779, 1780, 221, 221, 221, 221,
+ 221, 1781, 1782, 1782, 1782, 1783, 1781, 1782,
+
+ 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784,
+ 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784,
+ 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784,
+ 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784,
+
+ 1784, 1784, 1784, 1784, 1784, 1784, 221, 1785,
+ 221, 221, 221, 221, 221, 1785, 221, 221,
+ 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786,
+ 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786,
+
+ 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786,
+ 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786,
+ 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786,
+ 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786,
+
+ 1786, 1786, 1786, 1786, 1786, 1786, 1787, 1787,
+ 221, 221, 221, 221, 221, 221, 221, 1788,
+ 1789, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 1790,
+
+ 913, 913, 913, 913, 913, 913, 913, 913,
+ 913, 913, 913, 913, 913, 913, 913, 913,
+ 913, 913, 913, 913, 913, 913, 913, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 913, 913, 913, 913, 913, 913, 913, 221,
+ 913, 913, 913, 913, 913, 913, 913, 221,
+ 913, 913, 913, 913, 913, 913, 913, 221,
+ 913, 913, 913, 913, 913, 913, 913, 221,
+
+ 289, 289, 289, 289, 289, 289, 289, 289,
+ 289, 289, 289, 289, 289, 289, 289, 289,
+ 289, 289, 289, 289, 289, 289, 289, 289,
+ 289, 289, 289, 289, 289, 289, 289, 289,
+
+ 1791, 1791, 1792, 1793, 1792, 1793, 1791, 1791,
+ 1791, 1792, 1793, 1791, 1792, 1793, 1462, 1462,
+ 1462, 1462, 1462, 1462, 1462, 1462, 1461, 1794,
+ 1795, 1796, 1797, 1798, 1792, 1793, 1798, 1798,
+
+ 1799, 1800, 1730, 1731, 1730, 1731, 1730, 1731,
+ 1730, 1731, 1796, 1796, 1796, 1796, 1801, 1802,
+ 1796, 1803, 1804, 1805, 1805, 1804, 1804, 1804,
+ 1804, 1804, 1806, 1806, 1807, 1808, 1808, 1809,
+
+ 1810, 1808, 1811, 1812, 1812, 1813, 1813, 1813,
+ 1813, 1813, 1814, 1815, 1814, 1815, 1814, 1816,
+ 1751, 1751, 1817, 1818, 1818, 1819, 1820, 1819,
+ 1820, 1819, 1820, 1819, 1820, 1821, 221, 221,
+
1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
+ 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
+ 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
+ 1822, 1822, 221, 1822, 1822, 1822, 1822, 1823,
1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
- 1822, 1822, 1822, 1823, 1823, 1823, 1823, 1823,
- 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815,
- 1815, 1815, 1815, 1815, 1815, 1824, 1824, 1824,
-
- 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825,
- 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825,
- 1825, 1825, 1825, 1825, 1825, 1826, 1825, 1825,
- 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825,
-
- 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825,
- 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825,
- 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825,
- 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825,
-
- 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825,
- 1825, 1825, 1825, 1825, 1825, 206, 206, 206,
- 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827,
- 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827,
-
- 1827, 1827, 1828, 1828, 1827, 1827, 1827, 1827,
- 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827,
- 1827, 1827, 1827, 1827, 1828, 1827, 1827, 1827,
- 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827,
-
- 1827, 1828, 1827, 1827, 1827, 1828, 1827, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829,
- 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829,
-
- 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829,
- 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829,
- 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829,
- 1830, 1830, 1830, 1830, 1830, 1830, 1831, 1832,
-
- 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833,
- 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833,
- 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833,
- 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833,
-
- 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833,
- 1833, 1833, 1833, 1833, 1834, 1835, 1836, 1837,
- 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833,
- 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833,
-
- 1838, 1839, 1840, 1841, 1842, 1843, 1844, 1845,
- 1846, 1847, 1833, 1833, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
-
- 285, 286, 285, 286, 285, 286, 285, 286,
- 285, 286, 285, 286, 285, 286, 285, 286,
- 285, 286, 285, 286, 285, 286, 285, 286,
- 285, 286, 285, 286, 285, 286, 285, 286,
-
- 289, 290, 285, 286, 285, 286, 285, 286,
- 285, 286, 285, 286, 285, 286, 1848, 271,
- 1849, 1849, 1849, 1850, 1851, 1851, 1851, 1851,
- 1851, 1851, 1851, 1851, 271, 271, 1850, 1852,
-
- 285, 286, 285, 286, 285, 286, 285, 286,
- 285, 286, 285, 286, 285, 286, 285, 286,
- 285, 286, 285, 286, 285, 286, 285, 286,
- 291, 292, 291, 292, 1853, 1853, 1854, 1851,
-
- 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855,
- 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855,
- 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855,
- 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855,
-
- 1855, 1855, 1855, 1855, 1855, 1855, 1856, 1856,
- 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856,
- 1857, 1857, 1858, 1859, 1860, 1860, 1860, 1859,
- 206, 206, 206, 206, 206, 206, 206, 206,
-
- 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861,
- 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862,
- 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1863,
- 1863, 1863, 1863, 1722, 1722, 1722, 1722, 1722,
-
- 1864, 1864, 1267, 1268, 1267, 1268, 1267, 1268,
- 1267, 1268, 1267, 1268, 1267, 1268, 1267, 1268,
- 1265, 1265, 1267, 1268, 1267, 1268, 1267, 1268,
- 1267, 1268, 1267, 1268, 1267, 1268, 1267, 1268,
-
- 1267, 1268, 1267, 1268, 1267, 1268, 1267, 1268,
- 1267, 1268, 1267, 1268, 1267, 1268, 1267, 1268,
- 1267, 1268, 1267, 1268, 1267, 1268, 1267, 1268,
- 1267, 1268, 1267, 1268, 1267, 1268, 1267, 1268,
-
- 1267, 1268, 1267, 1268, 1267, 1268, 1267, 1268,
- 1267, 1268, 1267, 1268, 1267, 1268, 1267, 1268,
- 1689, 1265, 1265, 1265, 1265, 1265, 1265, 1265,
- 1265, 1267, 1268, 1267, 1268, 1865, 1267, 1268,
-
- 1267, 1268, 1267, 1268, 1267, 1268, 1267, 1268,
- 1722, 1866, 1866, 1267, 1268, 1867, 1868, 1869,
- 1870, 1871, 1872, 1873, 1874, 1875, 1876, 1877,
- 1876, 1877, 1876, 1877, 1876, 1877, 1876, 1877,
-
- 1870, 1871, 1870, 1871, 1870, 1871, 1870, 1871,
- 1870, 1871, 1878, 1879, 1880, 1881, 1882, 1883,
- 1884, 1885, 1886, 1887, 1888, 1889, 1888, 1889,
- 1890, 1891, 1892, 1893, 1892, 1893, 1892, 1893,
-
- 1894, 1895, 1892, 1893, 1896, 1897, 1898, 1899,
- 1900, 1899, 1900, 206, 206, 206, 206, 206,
- 1894, 1895, 206, 1901, 206, 1901, 1894, 1895,
- 1894, 1895, 206, 206, 206, 206, 206, 206,
-
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 1902, 1902, 1902, 1899, 1900, 1903,
- 1904, 1904, 1868, 1905, 1905, 1905, 1905, 1905,
-
- 1906, 1906, 1907, 1906, 1906, 1906, 1908, 1906,
- 1906, 1906, 1906, 1907, 1906, 1906, 1906, 1906,
- 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
- 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
+ 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
+ 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
- 1906, 1906, 1906, 1909, 1909, 1907, 1907, 1909,
- 1910, 1910, 1910, 1910, 1911, 206, 206, 206,
- 1805, 1805, 1805, 1805, 1805, 1805, 831, 831,
- 1462, 1912, 206, 206, 206, 206, 206, 206,
-
- 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913,
- 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913,
- 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913,
- 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913,
-
- 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913,
- 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913,
- 1913, 1913, 1914, 1915, 1916, 1916, 1917, 1917,
- 206, 206, 206, 206, 206, 206, 206, 206,
-
- 1918, 1918, 1919, 1919, 1919, 1919, 1919, 1919,
- 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919,
- 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919,
- 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919,
-
- 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919,
- 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919,
- 1919, 1919, 1919, 1919, 1918, 1918, 1918, 1918,
- 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918,
-
- 1918, 1918, 1918, 1918, 1920, 1921, 206, 206,
- 206, 206, 206, 206, 206, 206, 1922, 1922,
- 1923, 1924, 1925, 1926, 1927, 1928, 1929, 1930,
- 1931, 1932, 206, 206, 206, 206, 206, 206,
-
- 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933,
- 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933,
- 1933, 1933, 523, 523, 523, 523, 523, 523,
- 1934, 1934, 1934, 523, 1935, 1936, 1937, 1938,
-
- 1939, 1940, 1941, 1942, 1943, 1944, 1945, 1946,
- 1947, 1948, 1949, 1949, 1949, 1949, 1949, 1949,
- 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949,
- 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949,
+ 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
+ 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
+ 1822, 1822, 1822, 1823, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823,
+ 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823,
+ 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823,
+ 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823,
+
+ 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823,
+ 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823,
+ 1823, 1823, 1823, 1823, 1823, 1823, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824,
+ 1824, 1824, 1824, 1824, 1825, 1825, 1825, 1825,
+
+ 1826, 1827, 1828, 1829, 1830, 1831, 1832, 1833,
+ 1834, 1835, 1834, 1835, 1834, 1835, 1834, 1835,
+ 1834, 1835, 1830, 1830, 1834, 1835, 1834, 1835,
+ 1834, 1835, 1834, 1835, 1836, 1837, 1838, 1838,
+
+ 1830, 1833, 1833, 1833, 1833, 1833, 1833, 1833,
+ 1833, 1833, 1839, 1840, 1841, 1842, 1843, 1843,
+ 1844, 1845, 1845, 1845, 1845, 1846, 1847, 1830,
+ 1848, 1848, 1848, 1849, 1850, 1851, 1852, 1853,
+
+ 221, 1854, 1855, 1854, 1855, 1854, 1855, 1854,
+ 1855, 1854, 1855, 1855, 1856, 1855, 1856, 1855,
+ 1856, 1855, 1856, 1855, 1856, 1855, 1856, 1855,
+ 1856, 1855, 1856, 1855, 1856, 1855, 1856, 1855,
+
+ 1856, 1855, 1856, 1854, 1855, 1856, 1855, 1856,
+ 1855, 1856, 1855, 1855, 1855, 1855, 1855, 1855,
+ 1856, 1856, 1855, 1856, 1856, 1855, 1856, 1856,
+ 1855, 1856, 1856, 1855, 1856, 1856, 1855, 1855,
+
+ 1855, 1855, 1855, 1854, 1855, 1854, 1855, 1854,
+ 1855, 1855, 1855, 1855, 1855, 1855, 1854, 1855,
+ 1855, 1855, 1855, 1855, 1856, 1857, 1857, 221,
+ 221, 1858, 1858, 1859, 1859, 1860, 1861, 1862,
+
+ 1863, 1864, 1865, 1864, 1865, 1864, 1865, 1864,
+ 1865, 1864, 1865, 1865, 1866, 1865, 1866, 1865,
+ 1866, 1865, 1866, 1865, 1866, 1865, 1866, 1865,
+ 1866, 1865, 1866, 1865, 1866, 1865, 1866, 1865,
+
+ 1866, 1865, 1866, 1864, 1865, 1866, 1865, 1866,
+ 1865, 1866, 1865, 1865, 1865, 1865, 1865, 1865,
+ 1866, 1866, 1865, 1866, 1866, 1865, 1866, 1866,
+ 1865, 1866, 1866, 1865, 1866, 1866, 1865, 1865,
+
+ 1865, 1865, 1865, 1864, 1865, 1864, 1865, 1864,
+ 1865, 1865, 1865, 1865, 1865, 1865, 1864, 1865,
+ 1865, 1865, 1865, 1865, 1866, 1864, 1864, 1866,
+ 1866, 1866, 1866, 1867, 1868, 1869, 1870, 1871,
+
+ 221, 221, 221, 221, 221, 1872, 1872, 1872,
+ 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872,
+ 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872,
+ 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872,
+
+ 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872,
+ 1872, 1872, 1872, 1872, 1872, 1873, 1874, 1875,
+ 221, 1876, 1876, 1876, 1876, 1876, 1876, 1876,
+ 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876,
+
+ 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876,
+ 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876,
+ 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876,
+ 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876,
+
+ 1876, 1876, 1876, 1876, 1877, 1876, 1876, 1876,
+ 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876,
+ 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876,
+ 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876,
+
+ 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876,
+ 1876, 1876, 1876, 1876, 1876, 1876, 1876, 221,
+ 1878, 1878, 1879, 1879, 1879, 1879, 1880, 1880,
+ 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880,
+
+ 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881,
+ 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881,
+ 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881,
+ 1882, 1882, 1882, 1883, 1883, 1883, 1883, 1883,
+
+ 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884,
+ 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884,
+ 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
+ 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
+
+ 1885, 1885, 1885, 1885, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 1825,
+ 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886,
+ 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886,
+
+ 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887,
+ 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887,
+ 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887,
+ 1887, 1887, 1887, 1887, 1887, 1888, 1888, 221,
+
+ 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889,
+ 1889, 1889, 1890, 1890, 1890, 1890, 1890, 1890,
+ 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890,
+ 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890,
+
+ 1890, 1890, 1890, 1890, 1891, 1891, 1891, 1891,
+ 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892,
+ 1893, 1894, 1894, 1894, 1894, 1894, 1894, 1894,
+ 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894,
+
+ 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895,
+ 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895,
+ 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895,
+ 1895, 1895, 1895, 1895, 1896, 1896, 1897, 1878,
+
+ 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879,
+ 1879, 1879, 1880, 1880, 1880, 1880, 1880, 1880,
+ 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1898,
+ 1880, 1898, 1880, 1880, 1880, 1880, 1880, 1880,
+
+ 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880,
+ 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880,
+ 1880, 1894, 1894, 1894, 1894, 1894, 1894, 1894,
+ 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894,
+
+ 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880,
+ 1880, 1880, 1880, 1880, 1893, 1893, 1893, 1893,
+ 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899,
+ 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899,
+
+ 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899,
+ 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899,
+ 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899,
+ 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1900,
+
+ 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899,
+ 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899,
+ 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899,
+ 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899,
+
+ 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899,
+ 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899,
+ 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899,
+ 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880,
+
+ 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880,
+ 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880,
+ 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1893,
+ 1893, 1893, 1893, 1880, 1880, 1880, 1880, 1880,
+
+ 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880,
+ 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880,
+ 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880,
+ 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880,
+
+ 1880, 1880, 1890, 1880, 1880, 1880, 1880, 1890,
+ 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880,
+ 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880,
+ 1890, 1880, 1880, 1880, 1880, 1880, 1893, 1893,
+
+ 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880,
+ 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880,
+ 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880,
+ 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1893,
- 1949, 1949, 1949, 1949, 1949, 1949, 1950, 1950,
- 1950, 1950, 1950, 1951, 1951, 1951, 1952, 1953,
- 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954,
- 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954,
-
- 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1955,
- 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955,
- 1955, 1955, 1956, 1957, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 1958,
-
- 881, 881, 881, 881, 881, 881, 881, 881,
- 881, 881, 881, 881, 881, 881, 881, 881,
- 881, 881, 881, 881, 881, 881, 881, 881,
- 881, 881, 881, 881, 881, 206, 206, 206,
-
- 1959, 1959, 1959, 1960, 1961, 1961, 1961, 1961,
- 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
- 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
- 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
-
- 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
- 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
- 1961, 1961, 1961, 1962, 1960, 1960, 1959, 1959,
- 1959, 1959, 1960, 1960, 1959, 1959, 1960, 1960,
-
- 1963, 1964, 1964, 1964, 1964, 1964, 1964, 1965,
- 1966, 1966, 1964, 1964, 1964, 1964, 206, 1967,
- 1968, 1969, 1970, 1971, 1972, 1973, 1974, 1975,
- 1976, 1977, 206, 206, 206, 206, 1964, 1964,
-
- 1978, 1978, 1978, 1978, 1978, 1979, 1980, 1978,
- 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978,
- 1981, 1982, 1983, 1984, 1985, 1986, 1987, 1988,
- 1989, 1990, 1978, 1978, 1978, 1978, 1978, 206,
-
- 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991,
- 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991,
- 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991,
- 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991,
-
- 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991,
- 1991, 1992, 1992, 1992, 1992, 1992, 1992, 1993,
- 1993, 1992, 1992, 1993, 1993, 1992, 1992, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
-
- 1991, 1991, 1991, 1992, 1991, 1991, 1991, 1991,
- 1991, 1991, 1991, 1991, 1992, 1993, 206, 206,
- 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
- 2002, 2003, 206, 206, 2004, 2005, 2005, 2005,
+ 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901,
+ 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901,
+ 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901,
+ 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901,
+ 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901,
+ 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901,
+ 1901, 1901, 1901, 1901, 1901, 1901, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+
+ 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606,
+ 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606,
+ 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606,
+ 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606,
+
+ 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903,
+ 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903,
+ 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903,
+ 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903,
+
+ 1903, 1903, 1903, 1903, 1903, 1903, 1904, 1904,
+ 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904,
+ 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904,
+ 1904, 1904, 1904, 1904, 1905, 1905, 1905, 1905,
+
+ 1905, 1905, 1905, 1905, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1907, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1910, 1910, 1910, 1910, 1910,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1911, 1911, 1911,
+
+ 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912,
+ 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912,
+ 1912, 1912, 1912, 1912, 1912, 1913, 1912, 1912,
+ 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912,
+
+ 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912,
+ 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912,
+ 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912,
+ 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912,
+
+ 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912,
+ 1912, 1912, 1912, 1912, 1912, 221, 221, 221,
+ 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914,
+ 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914,
+
+ 1914, 1914, 1915, 1915, 1914, 1914, 1914, 1914,
+ 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914,
+ 1914, 1914, 1914, 1914, 1915, 1914, 1914, 1914,
+ 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914,
+
+ 1914, 1915, 1914, 1914, 1914, 1915, 1914, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916,
+ 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916,
+
+ 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916,
+ 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916,
+ 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916,
+ 1917, 1917, 1917, 1917, 1917, 1917, 1918, 1919,
+
+ 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920,
+ 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920,
+ 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920,
+ 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920,
+
+ 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920,
+ 1920, 1920, 1920, 1920, 1921, 1922, 1923, 1924,
+ 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920,
+ 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920,
+
+ 1925, 1926, 1927, 1928, 1929, 1930, 1931, 1932,
+ 1933, 1934, 1920, 1920, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 303, 304, 303, 304, 303, 304, 303, 304,
+ 303, 304, 303, 304, 303, 304, 303, 304,
+ 303, 304, 303, 304, 303, 304, 303, 304,
+ 303, 304, 303, 304, 303, 304, 303, 304,
+
+ 307, 308, 303, 304, 303, 304, 303, 304,
+ 303, 304, 303, 304, 303, 304, 1935, 289,
+ 1936, 1936, 1936, 1937, 1938, 1938, 1938, 1938,
+ 1938, 1938, 1938, 1938, 289, 289, 1937, 1939,
+
+ 303, 304, 303, 304, 303, 304, 303, 304,
+ 303, 304, 303, 304, 303, 304, 303, 304,
+ 303, 304, 303, 304, 303, 304, 303, 304,
+ 309, 310, 309, 310, 1940, 1940, 1941, 1938,
+
+ 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942,
+ 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942,
+ 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942,
+ 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942,
+
+ 1942, 1942, 1942, 1942, 1942, 1942, 1943, 1943,
+ 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943,
+ 1944, 1944, 1945, 1946, 1947, 1947, 1947, 1946,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948,
+ 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949,
+ 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1950,
+ 1950, 1950, 1950, 1802, 1802, 1802, 1802, 1802,
+
+ 1951, 1951, 1292, 1293, 1292, 1293, 1292, 1293,
+ 1292, 1293, 1292, 1293, 1292, 1293, 1292, 1293,
+ 1290, 1290, 1292, 1293, 1292, 1293, 1292, 1293,
+ 1292, 1293, 1292, 1293, 1292, 1293, 1292, 1293,
+
+ 1292, 1293, 1292, 1293, 1292, 1293, 1292, 1293,
+ 1292, 1293, 1292, 1293, 1292, 1293, 1292, 1293,
+ 1292, 1293, 1292, 1293, 1292, 1293, 1292, 1293,
+ 1292, 1293, 1292, 1293, 1292, 1293, 1292, 1293,
+
+ 1292, 1293, 1292, 1293, 1292, 1293, 1292, 1293,
+ 1292, 1293, 1292, 1293, 1292, 1293, 1292, 1293,
+ 1769, 1290, 1290, 1290, 1290, 1290, 1290, 1290,
+ 1290, 1292, 1293, 1292, 1293, 1952, 1292, 1293,
+
+ 1292, 1293, 1292, 1293, 1292, 1293, 1292, 1293,
+ 1802, 1953, 1953, 1292, 1293, 1954, 1955, 1956,
+ 1957, 1958, 1959, 1960, 1961, 1962, 1963, 1964,
+ 1963, 1964, 1963, 1964, 1963, 1964, 1963, 1964,
+
+ 1957, 1958, 1957, 1958, 1957, 1958, 1957, 1958,
+ 1957, 1958, 1965, 1966, 1967, 1968, 1969, 1970,
+ 1971, 1972, 1973, 1974, 1975, 1976, 1975, 1976,
+ 1977, 1978, 1979, 1980, 1979, 1980, 1979, 1980,
+
+ 1981, 1982, 1979, 1980, 1983, 1984, 1985, 1986,
+ 1987, 1986, 1987, 221, 221, 221, 221, 221,
+ 1981, 1982, 221, 1988, 221, 1988, 1981, 1982,
+ 1981, 1982, 221, 221, 221, 221, 221, 221,
+
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 1989, 1989, 1989, 1986, 1987, 1990,
+ 1991, 1991, 1955, 1992, 1992, 1992, 1992, 1992,
+
+ 1993, 1993, 1994, 1993, 1993, 1993, 1995, 1993,
+ 1993, 1993, 1993, 1994, 1993, 1993, 1993, 1993,
+ 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993,
+ 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993,
+
+ 1993, 1993, 1993, 1996, 1996, 1994, 1994, 1996,
+ 1997, 1997, 1997, 1997, 1998, 221, 221, 221,
+ 1999, 1999, 1999, 1999, 1999, 1999, 853, 853,
+ 1497, 2000, 221, 221, 221, 221, 221, 221,
+
+ 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001,
+ 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001,
+ 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001,
+ 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001,
+
+ 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001,
+ 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001,
+ 2001, 2001, 2002, 2003, 2004, 2004, 2005, 2005,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 2006, 2006, 2007, 2007, 2007, 2007, 2007, 2007,
+ 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007,
+ 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007,
+ 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007,
+
+ 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007,
+ 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007,
+ 2007, 2007, 2007, 2007, 2006, 2006, 2006, 2006,
2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006,
- 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006,
- 2007, 2006, 2006, 2006, 2006, 2006, 2006, 2008,
- 2008, 2008, 2006, 869, 1979, 2009, 1978, 1978,
-
- 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010,
- 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010,
- 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010,
- 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010,
-
- 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010,
- 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010,
- 2011, 2010, 2011, 2011, 2012, 2010, 2010, 2011,
- 2011, 2010, 2010, 2010, 2010, 2010, 2011, 2011,
-
- 2010, 2011, 2010, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 2010, 2010, 2013, 2014, 2014,
-
- 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015,
- 2015, 2015, 2015, 2016, 2017, 2017, 2016, 2016,
- 2018, 2018, 2015, 2019, 2019, 2016, 2020, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
-
- 206, 2021, 2021, 2021, 2021, 2021, 2021, 206,
- 206, 2021, 2021, 2021, 2021, 2021, 2021, 206,
- 206, 2021, 2021, 2021, 2021, 2021, 2021, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
-
- 2021, 2021, 2021, 2021, 2021, 2021, 2021, 206,
- 2021, 2021, 2021, 2021, 2021, 2021, 2021, 206,
- 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875,
- 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875,
-
- 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875,
- 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875,
- 1875, 1875, 1875, 2022, 1875, 1875, 1875, 1875,
- 1875, 1875, 1875, 2023, 2024, 2024, 2024, 2024,
-
- 2025, 2025, 2025, 2025, 1875, 2026, 2027, 2027,
- 2028, 2029, 2030, 2030, 206, 206, 206, 206,
- 2031, 2032, 2033, 2034, 2035, 2036, 2037, 2038,
- 2039, 2040, 2041, 2042, 2043, 2044, 2045, 2046,
-
- 2047, 2048, 2049, 2050, 2051, 2052, 2053, 2054,
- 2055, 2056, 2057, 2058, 2059, 2060, 2061, 2062,
- 2063, 2064, 2065, 2066, 2067, 2068, 2069, 2070,
- 2071, 2072, 2073, 2074, 2075, 2076, 2077, 2078,
-
- 2079, 2080, 2081, 2082, 2083, 2084, 2085, 2086,
- 2087, 2088, 2089, 2090, 2091, 2092, 2093, 2094,
- 2095, 2096, 2097, 2098, 2099, 2100, 2101, 2102,
- 2103, 2104, 2105, 2106, 2107, 2108, 2109, 2110,
-
- 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111,
- 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111,
- 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111,
- 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111,
-
- 2111, 2111, 2111, 2112, 2112, 2113, 2112, 2112,
- 2113, 2112, 2112, 2114, 2112, 2115, 206, 206,
- 2116, 2117, 2118, 2119, 2120, 2121, 2122, 2123,
- 2124, 2125, 206, 206, 206, 206, 206, 206,
-
- 2126, 2127, 2127, 2127, 2127, 2127, 2127, 2127,
- 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127,
- 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127,
- 2127, 2127, 2127, 2127, 2126, 2127, 2127, 2127,
-
- 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127,
- 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127,
- 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127,
- 2126, 2127, 2127, 2127, 2127, 2127, 2127, 2127,
-
- 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127,
- 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127,
- 2127, 2127, 2127, 2127, 2126, 2127, 2127, 2127,
- 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127,
-
- 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127,
- 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127,
- 2126, 2127, 2127, 2127, 2127, 2127, 2127, 2127,
- 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127,
-
- 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127,
- 2127, 2127, 2127, 2127, 2126, 2127, 2127, 2127,
- 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127,
- 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127,
-
- 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127,
- 2126, 2127, 2127, 2127, 2127, 2127, 2127, 2127,
- 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127,
- 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127,
-
- 2127, 2127, 2127, 2127, 2126, 2127, 2127, 2127,
- 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127,
- 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127,
- 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127,
-
- 2127, 2127, 2127, 2127, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 886, 886, 886, 886, 886, 886, 886, 886,
- 886, 886, 886, 886, 886, 886, 886, 886,
-
- 886, 886, 886, 886, 886, 886, 886, 206,
- 206, 206, 206, 889, 889, 889, 889, 889,
- 889, 889, 889, 889, 889, 889, 889, 889,
- 889, 889, 889, 889, 889, 889, 889, 889,
-
- 889, 889, 889, 889, 889, 889, 889, 889,
- 889, 889, 889, 889, 889, 889, 889, 889,
- 889, 889, 889, 889, 889, 889, 889, 889,
- 889, 889, 889, 889, 206, 206, 206, 206,
-
- 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128,
- 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128,
- 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128,
- 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128,
-
- 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129,
- 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129,
- 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129,
- 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129,
-
- 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130,
- 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130,
- 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130,
- 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130,
-
- 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130,
- 2130, 2130, 2130, 2130, 2130, 2130, 1816, 1816,
- 2130, 1816, 2130, 1816, 1816, 2130, 2130, 2130,
- 2130, 2130, 2130, 2130, 2130, 2130, 2130, 1816,
-
- 2130, 1816, 2130, 1816, 1816, 2130, 2130, 1816,
- 1816, 1816, 2130, 2130, 2130, 2130, 2131, 2131,
- 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132,
- 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132,
-
- 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132,
- 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132,
- 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132,
- 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132,
-
- 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132,
- 2132, 2132, 2132, 2133, 2133, 2133, 2134, 2134,
- 2135, 2135, 2135, 2135, 2135, 2135, 2135, 2135,
- 2135, 2135, 2135, 2135, 2135, 2135, 2135, 2135,
-
- 2135, 2135, 2135, 2135, 2135, 2135, 2135, 2135,
- 2135, 2135, 2135, 2135, 2135, 2135, 2135, 2135,
- 2135, 2135, 2135, 2135, 2135, 2135, 2135, 2135,
- 2135, 2135, 2135, 2135, 2135, 2135, 2135, 2135,
-
- 2135, 2135, 2135, 2135, 2135, 2135, 2135, 2135,
- 2135, 2135, 2135, 2135, 2135, 2135, 2135, 2135,
- 2135, 2135, 2135, 2135, 2135, 2135, 2135, 2135,
- 2135, 2135, 2134, 2134, 2134, 2134, 2134, 2134,
-
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
-
- 2136, 2137, 2138, 2139, 2140, 2141, 2141, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 2142, 2143, 2144, 2145, 2146,
- 206, 206, 206, 206, 206, 2147, 2148, 2149,
-
- 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150,
- 2150, 2151, 2149, 2149, 2149, 2149, 2149, 2149,
- 2149, 2149, 2149, 2149, 2149, 2149, 2149, 305,
- 2149, 2149, 2149, 2149, 2149, 305, 2149, 305,
-
- 2149, 2149, 305, 2149, 2149, 305, 2149, 2149,
- 2149, 2149, 2149, 2149, 2149, 2149, 2149, 2150,
- 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152,
- 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152,
-
- 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152,
- 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152,
- 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152,
- 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152,
-
- 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152,
- 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152,
- 2152, 2152, 2153, 2153, 2153, 2153, 2153, 2153,
- 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153,
-
- 2153, 2153, 471, 419, 419, 419, 419, 419,
- 419, 419, 419, 419, 419, 419, 419, 419,
- 419, 419, 419, 2152, 2152, 2152, 2152, 2152,
- 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152,
-
- 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152,
- 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152,
- 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152,
- 2152, 2152, 2152, 2152, 2152, 2152, 2154, 2154,
-
- 2154, 2154, 2154, 2154, 2152, 2152, 2152, 2152,
- 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152,
- 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152,
- 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152,
-
- 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152,
- 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152,
- 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152,
- 2152, 2152, 2152, 2152, 2152, 2152, 1753, 1396,
-
- 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155,
- 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155,
- 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152,
- 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152,
-
- 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152,
- 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152,
- 419, 419, 2152, 2152, 2152, 2152, 2152, 2152,
- 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152,
-
- 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152,
- 419, 419, 419, 419, 419, 419, 419, 2155,
- 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156,
- 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156,
-
- 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156,
- 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156,
- 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152,
- 2152, 2152, 2154, 2154, 2157, 345, 2155, 2155,
-
- 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158,
- 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158,
- 2159, 2160, 2161, 2162, 2163, 2164, 2164, 2165,
- 2166, 2167, 206, 206, 206, 206, 206, 206,
-
- 177, 177, 177, 177, 1248, 1248, 1248, 1132,
- 1132, 1132, 1132, 1132, 1132, 1132, 1854, 1854,
- 2168, 2169, 2169, 2170, 2170, 2171, 2172, 2171,
- 2172, 2173, 2174, 2173, 2174, 2173, 2174, 2173,
-
- 2174, 2173, 2174, 2173, 2174, 2175, 2175, 2176,
- 2177, 2168, 2168, 2168, 2168, 2170, 2170, 2170,
- 2178, 2179, 2180, 206, 2181, 2182, 2183, 2183,
- 2169, 1453, 1454, 1453, 1454, 2184, 2185, 2186,
-
- 2168, 2168, 2187, 2188, 2189, 2190, 2191, 206,
- 2168, 2192, 2193, 2168, 206, 206, 206, 206,
- 2154, 2152, 2154, 2194, 2154, 419, 2154, 2152,
- 2154, 2152, 2154, 2152, 2154, 2152, 2154, 2152,
-
- 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152,
- 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152,
- 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152,
- 2152, 2152, 2152, 2152, 2152, 419, 419, 2195,
-
- 206, 2183, 2168, 2186, 2192, 2193, 2168, 2196,
- 1453, 1454, 2168, 2187, 2178, 2188, 2197, 2198,
- 2199, 2200, 2201, 2202, 2203, 2204, 2205, 2206,
- 2207, 2208, 2182, 2181, 2209, 2191, 2210, 2183,
-
- 2168, 2211, 2211, 2211, 2211, 2211, 2211, 2211,
- 2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211,
- 2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211,
- 2211, 2211, 2211, 2212, 2168, 2213, 2214, 2170,
-
- 2214, 2215, 2215, 2215, 2215, 2215, 2215, 2215,
- 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215,
- 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215,
- 2215, 2215, 2215, 2212, 2191, 2213, 2191, 2216,
-
- 2217, 2218, 2184, 2185, 2219, 2220, 2221, 2222,
- 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222,
- 2223, 2221, 2221, 2221, 2221, 2221, 2221, 2221,
+
+ 2006, 2006, 2006, 2006, 2008, 2009, 221, 221,
+ 221, 221, 221, 221, 221, 221, 2010, 2010,
+ 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018,
+ 2019, 2020, 221, 221, 221, 221, 221, 221,
+
+ 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021,
+ 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021,
+ 2021, 2021, 542, 542, 542, 542, 542, 542,
+ 2022, 2022, 2022, 542, 2023, 2024, 2025, 2026,
+
+ 2027, 2028, 2029, 2030, 2031, 2032, 2033, 2034,
+ 2035, 2036, 2037, 2037, 2037, 2037, 2037, 2037,
+ 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037,
+ 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037,
+
+ 2037, 2037, 2037, 2037, 2037, 2037, 2038, 2038,
+ 2038, 2038, 2038, 2039, 2039, 2039, 2040, 2041,
+ 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042,
+ 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042,
+
+ 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2043,
+ 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043,
+ 2043, 2043, 2044, 2045, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 2046,
+
+ 903, 903, 903, 903, 903, 903, 903, 903,
+ 903, 903, 903, 903, 903, 903, 903, 903,
+ 903, 903, 903, 903, 903, 903, 903, 903,
+ 903, 903, 903, 903, 903, 221, 221, 221,
+
+ 2047, 2047, 2047, 2048, 2049, 2049, 2049, 2049,
+ 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049,
+ 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049,
+ 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049,
+
+ 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049,
+ 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049,
+ 2049, 2049, 2049, 2050, 2048, 2048, 2047, 2047,
+ 2047, 2047, 2048, 2048, 2047, 2047, 2048, 2048,
+
+ 2051, 2052, 2052, 2052, 2052, 2052, 2052, 2053,
+ 2054, 2054, 2052, 2052, 2052, 2052, 221, 2055,
+ 2056, 2057, 2058, 2059, 2060, 2061, 2062, 2063,
+ 2064, 2065, 221, 221, 221, 221, 2052, 2052,
+
+ 2066, 2066, 2066, 2066, 2066, 2067, 2068, 2066,
+ 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066,
+ 2069, 2070, 2071, 2072, 2073, 2074, 2075, 2076,
+ 2077, 2078, 2066, 2066, 2066, 2066, 2066, 221,
+
+ 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079,
+ 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079,
+ 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079,
+ 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079,
+
+ 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079,
+ 2079, 2080, 2080, 2080, 2080, 2080, 2080, 2081,
+ 2081, 2080, 2080, 2081, 2081, 2080, 2080, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 2082, 2082, 2082, 2080, 2082, 2082, 2082, 2082,
+ 2082, 2082, 2082, 2082, 2080, 2081, 221, 221,
+ 2083, 2084, 2085, 2086, 2087, 2088, 2089, 2090,
+ 2091, 2092, 221, 221, 2093, 2094, 2094, 2094,
+
+ 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095,
+ 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095,
+ 2096, 2095, 2095, 2095, 2095, 2095, 2095, 2097,
+ 2097, 2097, 2095, 891, 2067, 2098, 2066, 2066,
+
+ 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099,
+ 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099,
+ 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099,
+ 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099,
+
+ 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099,
+ 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099,
+ 2100, 2099, 2100, 2100, 2101, 2099, 2099, 2100,
+ 2100, 2099, 2099, 2099, 2099, 2099, 2100, 2100,
+
+ 2099, 2100, 2099, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 2099, 2099, 2102, 2103, 2103,
+
+ 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104,
+ 2104, 2104, 2104, 2105, 2106, 2106, 2105, 2105,
+ 2107, 2107, 2104, 2108, 2108, 2105, 2109, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 221, 2110, 2110, 2110, 2110, 2110, 2110, 221,
+ 221, 2110, 2110, 2110, 2110, 2110, 2110, 221,
+ 221, 2110, 2110, 2110, 2110, 2110, 2110, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 2110, 2110, 2110, 2110, 2110, 2110, 2110, 221,
+ 2110, 2110, 2110, 2110, 2110, 2110, 2110, 221,
+ 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962,
+ 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962,
+
+ 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962,
+ 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962,
+ 1962, 1962, 1962, 2111, 1962, 1962, 1962, 1962,
+ 1962, 1962, 1962, 2112, 2113, 2113, 2113, 2113,
+
+ 2114, 2114, 2114, 2114, 1962, 2115, 2116, 2116,
+ 2117, 2118, 2119, 2119, 221, 221, 221, 221,
+ 2120, 2121, 2122, 2123, 2124, 2125, 2126, 2127,
+ 2128, 2129, 2130, 2131, 2132, 2133, 2134, 2135,
+
+ 2136, 2137, 2138, 2139, 2140, 2141, 2142, 2143,
+ 2144, 2145, 2146, 2147, 2148, 2149, 2150, 2151,
+ 2152, 2153, 2154, 2155, 2156, 2157, 2158, 2159,
+ 2160, 2161, 2162, 2163, 2164, 2165, 2166, 2167,
+
+ 2168, 2169, 2170, 2171, 2172, 2173, 2174, 2175,
+ 2176, 2177, 2178, 2179, 2180, 2181, 2182, 2183,
+ 2184, 2185, 2186, 2187, 2188, 2189, 2190, 2191,
+ 2192, 2193, 2194, 2195, 2196, 2197, 2198, 2199,
+
+ 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200,
+ 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200,
+ 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200,
+ 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200,
+
+ 2200, 2200, 2200, 2201, 2201, 2202, 2201, 2201,
+ 2202, 2201, 2201, 2203, 2201, 2204, 221, 221,
+ 2205, 2206, 2207, 2208, 2209, 2210, 2211, 2212,
+ 2213, 2214, 221, 221, 221, 221, 221, 221,
+
+ 2215, 2216, 2216, 2216, 2216, 2216, 2216, 2216,
+ 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216,
+ 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216,
+ 2216, 2216, 2216, 2216, 2215, 2216, 2216, 2216,
+
+ 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216,
+ 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216,
+ 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216,
+ 2215, 2216, 2216, 2216, 2216, 2216, 2216, 2216,
+
+ 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216,
+ 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216,
+ 2216, 2216, 2216, 2216, 2215, 2216, 2216, 2216,
+ 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216,
+
+ 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216,
+ 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216,
+ 2215, 2216, 2216, 2216, 2216, 2216, 2216, 2216,
+ 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216,
+
+ 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216,
+ 2216, 2216, 2216, 2216, 2215, 2216, 2216, 2216,
+ 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216,
+ 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216,
+
+ 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216,
+ 2215, 2216, 2216, 2216, 2216, 2216, 2216, 2216,
+ 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216,
+ 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216,
+
+ 2216, 2216, 2216, 2216, 2215, 2216, 2216, 2216,
+ 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216,
+ 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216,
+ 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216,
+
+ 2216, 2216, 2216, 2216, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 908, 908, 908, 908, 908, 908, 908, 908,
+ 908, 908, 908, 908, 908, 908, 908, 908,
+
+ 908, 908, 908, 908, 908, 908, 908, 221,
+ 221, 221, 221, 911, 911, 911, 911, 911,
+ 911, 911, 911, 911, 911, 911, 911, 911,
+ 911, 911, 911, 911, 911, 911, 911, 911,
+
+ 911, 911, 911, 911, 911, 911, 911, 911,
+ 911, 911, 911, 911, 911, 911, 911, 911,
+ 911, 911, 911, 911, 911, 911, 911, 911,
+ 911, 911, 911, 911, 221, 221, 221, 221,
+
+ 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217,
+ 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217,
+ 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217,
+ 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217,
+
+ 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218,
+ 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218,
+ 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218,
+ 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218,
+
+ 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219,
+ 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219,
+ 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219,
+ 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219,
+
+ 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219,
+ 2219, 2219, 2219, 2219, 2219, 2219, 1903, 1903,
+ 2219, 1903, 2219, 1903, 1903, 2219, 2219, 2219,
+ 2219, 2219, 2219, 2219, 2219, 2219, 2219, 1903,
+
+ 2219, 1903, 2219, 1903, 1903, 2219, 2219, 1903,
+ 1903, 1903, 2219, 2219, 2219, 2219, 2220, 2220,
+ 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221,
2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221,
2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221,
2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221,
2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221,
- 2221, 2221, 2221, 2221, 2221, 2221, 2224, 2224,
-
- 1790, 1789, 1789, 1789, 1789, 1789, 1789, 1789,
- 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789,
- 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789,
- 1789, 1789, 1789, 1789, 1789, 1789, 1789, 206,
-
- 206, 206, 1789, 1789, 1789, 1789, 1789, 1789,
- 206, 206, 1789, 1789, 1789, 1789, 1789, 1789,
- 206, 206, 1789, 1789, 1789, 1789, 1789, 1789,
- 206, 206, 1789, 1789, 1789, 206, 206, 206,
-
- 2225, 1456, 2226, 2214, 1761, 1456, 1456, 206,
- 1483, 1524, 1524, 1524, 1524, 1483, 1483, 206,
- 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436,
- 1436, 2227, 2227, 2227, 2228, 2229, 2230, 2230,
-
- 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231,
- 2231, 2231, 2231, 2231, 206, 2231, 2231, 2231,
- 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231,
- 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231,
-
- 2231, 2231, 2231, 2231, 2231, 2231, 2231, 206,
- 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231,
- 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231,
- 2231, 2231, 2231, 206, 2231, 2231, 206, 2231,
-
- 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231,
- 2231, 2231, 2231, 2231, 2231, 2231, 206, 206,
- 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231,
- 2231, 2231, 2231, 2231, 2231, 2231, 206, 206,
-
- 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231,
- 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231,
- 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231,
- 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231,
-
- 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231,
- 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231,
- 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231,
- 2231, 2231, 2231, 206, 206, 206, 206, 206,
-
- 2232, 2233, 2232, 206, 206, 206, 206, 2234,
- 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234,
- 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234,
- 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234,
-
- 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234,
- 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234,
- 2234, 2234, 2234, 2234, 206, 206, 206, 2235,
- 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235,
-
- 2236, 2236, 2236, 2236, 2236, 2236, 2236, 2236,
- 2236, 2236, 2236, 2236, 2236, 2236, 2236, 2236,
- 2236, 2236, 2236, 2236, 2236, 2236, 2236, 2236,
- 2236, 2236, 2236, 2236, 2236, 2236, 2236, 2236,
-
- 2236, 2236, 2236, 2236, 2236, 2236, 2236, 2236,
- 2236, 2236, 2236, 2236, 2236, 2236, 2236, 2236,
- 2236, 2236, 2236, 2236, 2236, 2237, 2237, 2237,
- 2237, 2238, 2238, 2238, 2238, 2238, 2238, 2238,
-
- 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238,
- 2238, 2238, 2237, 2239, 2240, 2241, 2241, 206,
- 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670,
- 1670, 1670, 1670, 1670, 1671, 206, 206, 206,
+ 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221,
+
+ 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221,
+ 2221, 2221, 2221, 2222, 2222, 2222, 2223, 2223,
+ 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224,
+ 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224,
+
+ 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224,
+ 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224,
+ 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224,
+ 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224,
+
+ 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224,
+ 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224,
+ 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224,
+ 2224, 2224, 2223, 2223, 2223, 2223, 2223, 2223,
+
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+
+ 2225, 2226, 2227, 2228, 2229, 2230, 2231, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 2232, 2233, 2234, 2235, 2236,
+ 221, 221, 221, 221, 221, 2237, 2238, 2239,
+
+ 2240, 2240, 2240, 2240, 2240, 2240, 2240, 2240,
+ 2240, 2241, 2239, 2239, 2239, 2239, 2239, 2239,
+ 2239, 2239, 2239, 2239, 2239, 2239, 2239, 323,
+ 2239, 2239, 2239, 2239, 2239, 323, 2239, 323,
+
+ 2239, 2239, 323, 2239, 2239, 323, 2239, 2239,
+ 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2240,
+ 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242,
+ 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242,
- 2240, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
+ 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242,
+ 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242,
+ 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242,
+ 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502,
- 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502,
+ 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242,
+ 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242,
+ 2242, 2242, 2243, 2243, 2243, 2243, 2243, 2243,
+ 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243,
- 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502,
- 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502,
- 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502,
- 1502, 1502, 1502, 1502, 1502, 1251, 206, 206,
+ 2243, 2243, 489, 437, 437, 437, 437, 437,
+ 437, 437, 437, 437, 437, 437, 437, 437,
+ 437, 437, 437, 2242, 2242, 2242, 2242, 2242,
+ 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242,
2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242,
2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242,
2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242,
- 2242, 2242, 2242, 2242, 2242, 206, 206, 206,
+ 2242, 2242, 2242, 2242, 2242, 2242, 2244, 2244,
- 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243,
- 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243,
- 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243,
- 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243,
+ 2244, 2244, 2244, 2244, 2242, 2242, 2242, 2242,
+ 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242,
+ 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242,
+ 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242,
- 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243,
- 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243,
- 2243, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
+ 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242,
+ 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242,
+ 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242,
+ 2242, 2242, 2242, 2242, 2242, 2242, 2245, 1422,
- 1132, 2244, 2244, 2244, 2244, 2244, 2244, 2244,
- 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244,
- 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244,
- 2244, 2244, 2244, 2244, 206, 206, 206, 206,
+ 2246, 2246, 2246, 2246, 2246, 2246, 2246, 2246,
+ 2246, 2246, 2246, 2246, 2246, 2246, 2246, 2246,
+ 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242,
+ 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242,
+
+ 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242,
+ 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242,
+ 437, 437, 2242, 2242, 2242, 2242, 2242, 2242,
+ 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242,
+
+ 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242,
+ 437, 437, 437, 437, 437, 437, 437, 2246,
+ 2247, 2247, 2247, 2247, 2247, 2247, 2247, 2247,
+ 2247, 2247, 2247, 2247, 2247, 2247, 2247, 2247,
- 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245,
- 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245,
- 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245,
- 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2246,
+ 2247, 2247, 2247, 2247, 2247, 2247, 2247, 2247,
+ 2247, 2247, 2247, 2247, 2247, 2247, 2247, 2247,
+ 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242,
+ 2242, 2242, 2244, 2244, 2248, 363, 2246, 2246,
- 2247, 2247, 2247, 2247, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 2248, 2248, 2248,
2249, 2249, 2249, 2249, 2249, 2249, 2249, 2249,
2249, 2249, 2249, 2249, 2249, 2249, 2249, 2249,
+ 2250, 2251, 2252, 2253, 2254, 2255, 2255, 2256,
+ 2257, 2258, 221, 221, 221, 221, 221, 221,
- 2249, 2250, 2249, 2249, 2249, 2249, 2249, 2249,
- 2249, 2249, 2250, 206, 206, 206, 206, 206,
- 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251,
- 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251,
-
- 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251,
- 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251,
- 2251, 2251, 2251, 2251, 2251, 2251, 2252, 2252,
- 2252, 2252, 2252, 206, 206, 206, 206, 206,
-
- 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253,
- 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253,
- 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253,
- 2253, 2253, 2253, 2253, 2253, 2253, 206, 2254,
-
- 2255, 2255, 2255, 2255, 2255, 2255, 2255, 2255,
- 2255, 2255, 2255, 2255, 2255, 2255, 2255, 2255,
- 2255, 2255, 2255, 2255, 2255, 2255, 2255, 2255,
- 2255, 2255, 2255, 2255, 2255, 2255, 2255, 2255,
-
- 2255, 2255, 2255, 2255, 206, 206, 206, 206,
- 2255, 2255, 2255, 2255, 2255, 2255, 2255, 2255,
- 2256, 2257, 2257, 2257, 2257, 2257, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
-
- 2258, 2258, 2258, 2258, 2258, 2258, 2258, 2258,
- 2258, 2258, 2258, 2258, 2258, 2258, 2258, 2258,
- 2258, 2258, 2258, 2258, 2258, 2258, 2258, 2258,
- 2258, 2258, 2258, 2258, 2258, 2258, 2258, 2258,
-
- 2258, 2258, 2258, 2258, 2258, 2258, 2259, 2259,
- 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260,
- 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260,
- 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260,
-
- 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260,
- 2260, 2260, 2260, 2260, 2260, 2260, 2261, 2261,
- 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262,
- 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262,
-
- 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262,
- 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262,
- 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262,
- 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262,
-
- 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263,
- 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263,
- 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263,
- 2263, 2263, 2263, 2263, 2263, 2263, 206, 206,
-
- 2264, 2265, 2266, 2267, 2268, 2269, 2270, 2271,
- 2272, 2273, 206, 206, 206, 206, 206, 206,
- 2274, 2274, 2274, 2274, 2274, 2274, 2274, 2274,
- 2274, 2274, 2274, 2274, 2274, 2274, 2274, 2274,
-
- 2274, 2274, 2274, 2274, 2274, 2274, 2274, 2274,
- 2274, 2274, 2274, 2274, 2274, 2274, 2274, 2274,
- 2274, 2274, 2274, 2274, 206, 206, 206, 206,
- 2275, 2275, 2275, 2275, 2275, 2275, 2275, 2275,
-
- 2275, 2275, 2275, 2275, 2275, 2275, 2275, 2275,
- 2275, 2275, 2275, 2275, 2275, 2275, 2275, 2275,
- 2275, 2275, 2275, 2275, 2275, 2275, 2275, 2275,
- 2275, 2275, 2275, 2275, 206, 206, 206, 206,
-
- 2276, 2276, 2276, 2276, 2276, 2276, 2276, 2276,
- 2276, 2276, 2276, 2276, 2276, 2276, 2276, 2276,
- 2276, 2276, 2276, 2276, 2276, 2276, 2276, 2276,
- 2276, 2276, 2276, 2276, 2276, 2276, 2276, 2276,
-
- 2276, 2276, 2276, 2276, 2276, 2276, 2276, 2276,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 2277, 2277, 2277, 2277, 2277, 2277, 2277, 2277,
- 2277, 2277, 2277, 2277, 2277, 2277, 2277, 2277,
-
- 2277, 2277, 2277, 2277, 2277, 2277, 2277, 2277,
- 2277, 2277, 2277, 2277, 2277, 2277, 2277, 2277,
- 2277, 2277, 2277, 2277, 2277, 2277, 2277, 2277,
- 2277, 2277, 2277, 2277, 2277, 2277, 2277, 2277,
-
- 2277, 2277, 2277, 2277, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 2278,
- 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279,
- 2279, 2279, 2279, 206, 2279, 2279, 2279, 2279,
-
- 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279,
- 2279, 2279, 2279, 206, 2279, 2279, 2279, 2279,
- 2279, 2279, 2279, 206, 2279, 2279, 206, 2280,
- 2280, 2280, 2280, 2280, 2280, 2280, 2280, 2280,
-
- 2280, 2280, 206, 2280, 2280, 2280, 2280, 2280,
- 2280, 2280, 2280, 2280, 2280, 2280, 2280, 2280,
- 2280, 2280, 206, 2280, 2280, 2280, 2280, 2280,
- 2280, 2280, 206, 2280, 2280, 206, 206, 206,
-
- 2281, 2281, 2281, 2281, 2281, 2281, 2281, 2281,
- 2281, 2281, 2281, 2281, 2281, 2281, 2281, 2281,
- 2281, 2281, 2281, 2281, 2281, 2281, 2281, 2281,
- 2281, 2281, 2281, 2281, 2281, 2281, 2281, 2281,
-
- 2281, 2281, 2281, 2281, 2281, 2281, 2281, 2281,
- 2281, 2281, 2281, 2281, 2281, 2281, 2281, 2281,
- 2281, 2281, 2281, 2281, 2281, 2281, 2281, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
-
- 2281, 2281, 2281, 2281, 2281, 2281, 2281, 2281,
- 2281, 2281, 2281, 2281, 2281, 2281, 2281, 2281,
- 2281, 2281, 2281, 2281, 2281, 2281, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
-
- 2281, 2281, 2281, 2281, 2281, 2281, 2281, 2281,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
-
- 2282, 1902, 1902, 2283, 2283, 2283, 206, 2283,
- 2283, 2283, 2283, 2283, 2283, 2283, 2283, 2283,
- 2283, 2283, 2283, 2283, 2283, 2283, 2283, 2283,
- 2283, 2283, 2283, 2283, 2283, 2283, 2283, 2283,
-
- 2283, 2283, 2283, 2283, 2283, 2283, 2283, 2283,
- 2283, 2283, 2283, 2283, 2283, 2283, 2283, 2283,
- 2283, 206, 2283, 2283, 2283, 2283, 2283, 2283,
- 2283, 2283, 2283, 206, 206, 206, 206, 206,
-
- 2284, 2284, 2284, 2284, 2284, 2284, 305, 305,
- 2284, 305, 2284, 2284, 2284, 2284, 2284, 2284,
- 2284, 2284, 2284, 2284, 2284, 2284, 2284, 2284,
- 2284, 2284, 2284, 2284, 2284, 2284, 2284, 2284,
-
- 2284, 2284, 2284, 2284, 2284, 2284, 2284, 2284,
- 2284, 2284, 2284, 2284, 2284, 2284, 2284, 2284,
- 2284, 2284, 2284, 2284, 2284, 2284, 305, 2284,
- 2284, 305, 305, 305, 2284, 305, 305, 2284,
-
- 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285,
- 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285,
- 2285, 2285, 2285, 2285, 2285, 2285, 305, 2286,
- 2287, 2287, 2287, 2287, 2287, 2287, 2287, 2287,
-
- 2288, 2288, 2288, 2288, 2288, 2288, 2288, 2288,
- 2288, 2288, 2288, 2288, 2288, 2288, 2288, 2288,
- 2288, 2288, 2288, 2288, 2288, 2288, 2288, 2289,
- 2289, 2290, 2290, 2290, 2290, 2290, 2290, 2290,
-
- 2291, 2291, 2291, 2291, 2291, 2291, 2291, 2291,
- 2291, 2291, 2291, 2291, 2291, 2291, 2291, 2291,
- 2291, 2291, 2291, 2291, 2291, 2291, 2291, 2291,
- 2291, 2291, 2291, 2291, 2291, 2291, 2291, 305,
-
- 305, 305, 305, 305, 305, 305, 305, 2292,
- 2292, 2292, 2292, 2292, 2292, 2292, 2292, 2292,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
-
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
-
- 2293, 2293, 2293, 2293, 2293, 2293, 2293, 2293,
- 2293, 2293, 2293, 2293, 2293, 2293, 2293, 2293,
- 2293, 2293, 2293, 305, 2293, 2293, 305, 305,
- 305, 305, 305, 2294, 2294, 2294, 2294, 2294,
-
- 2295, 2295, 2295, 2295, 2295, 2295, 2295, 2295,
- 2295, 2295, 2295, 2295, 2295, 2295, 2295, 2295,
- 2295, 2295, 2295, 2295, 2295, 2295, 2296, 2296,
- 2296, 2296, 2297, 2297, 305, 305, 305, 2298,
-
- 2299, 2299, 2299, 2299, 2299, 2299, 2299, 2299,
- 2299, 2299, 2299, 2299, 2299, 2299, 2299, 2299,
- 2299, 2299, 2299, 2299, 2299, 2299, 2299, 2299,
- 2299, 2299, 305, 305, 305, 305, 305, 2300,
-
- 2301, 2301, 2301, 2301, 2301, 2301, 2301, 2301,
- 2301, 2301, 2301, 2301, 2301, 2301, 2301, 2301,
- 2301, 2301, 2301, 2301, 2301, 2301, 2301, 2301,
- 2301, 2301, 2301, 2301, 2301, 2301, 2301, 2301,
-
- 2302, 2302, 2302, 2302, 2302, 2302, 2302, 2302,
- 2302, 2302, 2302, 2302, 2302, 2302, 2302, 2302,
- 2302, 2302, 2302, 2302, 2302, 2302, 2302, 2302,
- 305, 305, 305, 305, 2303, 2303, 2302, 2302,
-
- 2303, 2303, 2303, 2303, 2303, 2303, 2303, 2303,
- 2303, 2303, 2303, 2303, 2303, 2303, 2303, 2303,
- 305, 305, 2303, 2303, 2303, 2303, 2303, 2303,
- 2303, 2303, 2303, 2303, 2303, 2303, 2303, 2303,
-
- 2303, 2303, 2303, 2303, 2303, 2303, 2303, 2303,
- 2303, 2303, 2303, 2303, 2303, 2303, 2303, 2303,
- 2303, 2303, 2303, 2303, 2303, 2303, 2303, 2303,
- 2303, 2303, 2303, 2303, 2303, 2303, 2303, 2303,
-
- 2304, 2305, 2305, 2305, 305, 2305, 2305, 305,
- 305, 305, 305, 305, 2305, 2306, 2305, 2307,
- 2304, 2304, 2304, 2304, 305, 2304, 2304, 2304,
- 305, 2304, 2304, 2304, 2304, 2304, 2304, 2304,
-
- 2304, 2304, 2304, 2304, 2304, 2304, 2304, 2304,
- 2304, 2304, 2304, 2304, 2304, 2304, 2304, 2304,
- 2304, 2304, 2304, 2304, 2308, 2308, 305, 305,
- 2307, 2309, 2306, 305, 305, 305, 305, 2310,
-
- 2311, 2312, 2313, 2314, 2315, 2315, 2315, 2315,
- 2316, 305, 305, 305, 305, 305, 305, 305,
- 2317, 2317, 2317, 2317, 2317, 2317, 2318, 2318,
- 2319, 305, 305, 305, 305, 305, 305, 305,
-
- 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320,
- 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320,
- 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320,
- 2320, 2320, 2320, 2320, 2320, 2321, 2321, 2322,
-
- 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323,
- 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323,
- 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323,
- 2323, 2323, 2323, 2323, 2323, 2324, 2324, 2324,
-
- 2325, 2325, 2325, 2325, 2325, 2326, 2327, 2326,
- 2328, 2326, 2326, 2327, 2327, 2329, 2326, 2326,
- 2326, 2326, 2326, 2325, 2325, 2325, 2325, 2329,
- 2325, 2325, 2325, 2325, 2325, 2326, 2325, 2325,
-
- 2325, 2326, 2327, 2327, 2326, 2330, 2331, 305,
- 305, 305, 305, 2332, 2332, 2332, 2332, 2333,
- 2334, 2334, 2334, 2334, 2334, 2334, 2335, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
-
- 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336,
- 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336,
- 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336,
- 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336,
-
- 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336,
- 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336,
- 2336, 2336, 2336, 2336, 2336, 2336, 305, 305,
- 305, 2337, 2337, 2337, 2337, 2337, 2337, 2337,
-
- 2338, 2338, 2338, 2338, 2338, 2338, 2338, 2338,
- 2338, 2338, 2338, 2338, 2338, 2338, 2338, 2338,
- 2338, 2338, 2338, 2338, 2338, 2338, 305, 305,
- 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339,
-
- 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340,
- 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340,
- 2340, 2340, 2340, 305, 305, 305, 305, 305,
- 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341,
-
- 2342, 2343, 2342, 2343, 2343, 2343, 2342, 2342,
- 2342, 2343, 2342, 2342, 2343, 2342, 2343, 2343,
- 2342, 2343, 305, 305, 305, 305, 305, 305,
- 305, 2344, 2344, 2344, 2344, 305, 305, 305,
-
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 2345, 2345, 2345, 2345, 2346, 2346, 2347,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
-
- 2348, 2348, 2348, 2348, 2348, 2348, 2348, 2348,
- 2348, 2348, 2348, 2348, 2348, 2348, 2348, 2348,
- 2348, 2348, 2348, 2348, 2348, 2348, 2348, 2348,
- 2348, 2348, 2348, 2348, 2348, 2348, 2348, 2348,
-
- 2348, 2348, 2348, 2348, 2348, 2348, 2348, 2348,
- 2348, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
+ 288, 288, 288, 288, 1273, 1273, 1273, 1155,
+ 1155, 1155, 1155, 1155, 1155, 1155, 1941, 1941,
+ 2259, 2260, 2260, 2261, 2261, 2262, 2263, 2262,
+ 2263, 2264, 2265, 2264, 2265, 2264, 2265, 2264,
- 2349, 2349, 2349, 2349, 2349, 2349, 2349, 2349,
+ 2265, 2264, 2265, 2264, 2265, 2266, 2266, 2267,
+ 2268, 2259, 2259, 2259, 2259, 2261, 2261, 2261,
+ 2269, 2270, 2271, 221, 2272, 2273, 2274, 2274,
+ 2260, 2275, 2276, 2275, 2276, 2277, 2278, 2279,
+
+ 2259, 2259, 2280, 2281, 2282, 2283, 2284, 221,
+ 2259, 2285, 2286, 2259, 221, 221, 221, 221,
+ 2244, 2242, 2244, 2287, 2244, 437, 2244, 2242,
+ 2244, 2242, 2244, 2242, 2244, 2242, 2244, 2242,
+
+ 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242,
+ 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242,
+ 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242,
+ 2242, 2242, 2242, 2242, 2242, 437, 437, 2288,
+
+ 221, 2289, 2290, 2291, 2292, 2293, 2290, 2294,
+ 2295, 2296, 2290, 2297, 2298, 2299, 2300, 2301,
+ 2302, 2303, 2304, 2305, 2306, 2307, 2308, 2309,
+ 2310, 2311, 2312, 2313, 2314, 2315, 2316, 2289,
+
+ 2290, 2317, 2317, 2317, 2317, 2317, 2317, 2317,
+ 2317, 2317, 2317, 2317, 2317, 2317, 2317, 2317,
+ 2317, 2317, 2317, 2317, 2317, 2317, 2317, 2317,
+ 2317, 2317, 2317, 2318, 2290, 2319, 2320, 2321,
+
+ 2320, 2322, 2322, 2322, 2322, 2322, 2322, 2322,
+ 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322,
+ 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322,
+ 2322, 2322, 2322, 2318, 2315, 2319, 2315, 2323,
+
+ 2324, 2325, 2326, 2327, 2328, 2329, 2330, 2331,
+ 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331,
+ 2332, 2330, 2330, 2330, 2330, 2330, 2330, 2330,
+ 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330,
+
+ 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330,
+ 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330,
+ 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330,
+ 2330, 2330, 2330, 2330, 2330, 2330, 2333, 2333,
+
+ 2334, 2335, 2335, 2335, 2335, 2335, 2335, 2335,
+ 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335,
+ 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335,
+ 2335, 2335, 2335, 2335, 2335, 2335, 2335, 221,
+
+ 221, 221, 2335, 2335, 2335, 2335, 2335, 2335,
+ 221, 221, 2335, 2335, 2335, 2335, 2335, 2335,
+ 221, 221, 2335, 2335, 2335, 2335, 2335, 2335,
+ 221, 221, 2335, 2335, 2335, 221, 221, 221,
+
+ 2336, 2337, 2338, 2320, 2339, 2337, 2337, 221,
+ 2340, 2341, 2341, 2341, 2341, 2340, 2340, 221,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 2342, 2342, 2342, 2343, 2344, 2345, 2345,
+
+ 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346,
+ 2346, 2346, 2346, 2346, 221, 2346, 2346, 2346,
+ 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346,
+ 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346,
+
+ 2346, 2346, 2346, 2346, 2346, 2346, 2346, 221,
+ 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346,
+ 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346,
+ 2346, 2346, 2346, 221, 2346, 2346, 221, 2346,
+
+ 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346,
+ 2346, 2346, 2346, 2346, 2346, 2346, 221, 221,
+ 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346,
+ 2346, 2346, 2346, 2346, 2346, 2346, 221, 221,
+
+ 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346,
+ 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346,
+ 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346,
+ 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346,
+
+ 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346,
+ 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346,
+ 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346,
+ 2346, 2346, 2346, 221, 221, 221, 221, 221,
+
+ 2347, 2348, 2347, 221, 221, 221, 221, 2349,
2349, 2349, 2349, 2349, 2349, 2349, 2349, 2349,
2349, 2349, 2349, 2349, 2349, 2349, 2349, 2349,
2349, 2349, 2349, 2349, 2349, 2349, 2349, 2349,
2349, 2349, 2349, 2349, 2349, 2349, 2349, 2349,
2349, 2349, 2349, 2349, 2349, 2349, 2349, 2349,
- 2349, 2349, 2349, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
-
- 2350, 2350, 2350, 2350, 2350, 2350, 2350, 2350,
- 2350, 2350, 2350, 2350, 2350, 2350, 2350, 2350,
- 2350, 2350, 2350, 2350, 2350, 2350, 2350, 2350,
+ 2349, 2349, 2349, 2349, 221, 221, 221, 2350,
2350, 2350, 2350, 2350, 2350, 2350, 2350, 2350,
- 2350, 2350, 2350, 2350, 2350, 2350, 2350, 2350,
- 2350, 2350, 2350, 2350, 2350, 2350, 2350, 2350,
- 2350, 2350, 2350, 305, 305, 305, 305, 305,
- 305, 305, 2351, 2351, 2351, 2351, 2351, 2351,
+ 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351,
+ 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351,
+ 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351,
+ 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351,
+ 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351,
+ 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351,
+ 2351, 2351, 2351, 2351, 2351, 2352, 2352, 2352,
2352, 2353, 2353, 2353, 2353, 2353, 2353, 2353,
- 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353,
- 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353,
- 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353,
- 2353, 2353, 2354, 2353, 2355, 2355, 2355, 2355,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 2356, 2357, 2358, 2359, 2360, 2361, 2362, 2363,
- 2364, 2365, 305, 305, 305, 305, 305, 305,
+ 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353,
+ 2353, 2353, 2352, 2354, 2355, 2356, 2356, 221,
+ 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749,
+ 1749, 1749, 1749, 1749, 1751, 221, 221, 221,
+
+ 2355, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544,
+ 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544,
+
+ 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544,
+ 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544,
+ 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544,
+ 1544, 1544, 1544, 1544, 1544, 1276, 221, 221,
+
+ 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357,
+ 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357,
+ 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357,
+ 2357, 2357, 2357, 2357, 2357, 221, 221, 221,
+
+ 2358, 2358, 2358, 2358, 2358, 2358, 2358, 2358,
+ 2358, 2358, 2358, 2358, 2358, 2358, 2358, 2358,
+ 2358, 2358, 2358, 2358, 2358, 2358, 2358, 2358,
+ 2358, 2358, 2358, 2358, 2358, 2358, 2358, 2358,
+
+ 2358, 2358, 2358, 2358, 2358, 2358, 2358, 2358,
+ 2358, 2358, 2358, 2358, 2358, 2358, 2358, 2358,
+ 2358, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 1155, 2359, 2359, 2359, 2359, 2359, 2359, 2359,
+ 2359, 2359, 2359, 2359, 2359, 2359, 2359, 2359,
+ 2359, 2359, 2359, 2359, 2359, 2359, 2359, 2359,
+ 2359, 2359, 2359, 2359, 221, 221, 221, 221,
+
+ 2360, 2360, 2360, 2360, 2360, 2360, 2360, 2360,
+ 2360, 2360, 2360, 2360, 2360, 2360, 2360, 2360,
+ 2360, 2360, 2360, 2360, 2360, 2360, 2360, 2360,
+ 2360, 2360, 2360, 2360, 2360, 2360, 2360, 2361,
+
+ 2362, 2362, 2362, 2362, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 2363, 2363, 2363,
+ 2364, 2364, 2364, 2364, 2364, 2364, 2364, 2364,
+ 2364, 2364, 2364, 2364, 2364, 2364, 2364, 2364,
+
+ 2364, 2365, 2364, 2364, 2364, 2364, 2364, 2364,
+ 2364, 2364, 2365, 221, 221, 221, 221, 221,
+ 2366, 2366, 2366, 2366, 2366, 2366, 2366, 2366,
+ 2366, 2366, 2366, 2366, 2366, 2366, 2366, 2366,
+
+ 2366, 2366, 2366, 2366, 2366, 2366, 2366, 2366,
+ 2366, 2366, 2366, 2366, 2366, 2366, 2366, 2366,
+ 2366, 2366, 2366, 2366, 2366, 2366, 2367, 2367,
+ 2367, 2367, 2367, 221, 221, 221, 221, 221,
+
+ 2368, 2368, 2368, 2368, 2368, 2368, 2368, 2368,
+ 2368, 2368, 2368, 2368, 2368, 2368, 2368, 2368,
+ 2368, 2368, 2368, 2368, 2368, 2368, 2368, 2368,
+ 2368, 2368, 2368, 2368, 2368, 2368, 221, 2369,
+
+ 2370, 2370, 2370, 2370, 2370, 2370, 2370, 2370,
+ 2370, 2370, 2370, 2370, 2370, 2370, 2370, 2370,
+ 2370, 2370, 2370, 2370, 2370, 2370, 2370, 2370,
+ 2370, 2370, 2370, 2370, 2370, 2370, 2370, 2370,
+
+ 2370, 2370, 2370, 2370, 221, 221, 221, 221,
+ 2370, 2370, 2370, 2370, 2370, 2370, 2370, 2370,
+ 2371, 2372, 2372, 2372, 2372, 2372, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 2373, 2373, 2373, 2373, 2373, 2373, 2373, 2373,
+ 2373, 2373, 2373, 2373, 2373, 2373, 2373, 2373,
+ 2373, 2373, 2373, 2373, 2373, 2373, 2373, 2373,
+ 2373, 2373, 2373, 2373, 2373, 2373, 2373, 2373,
+
+ 2373, 2373, 2373, 2373, 2373, 2373, 2374, 2374,
+ 2375, 2375, 2375, 2375, 2375, 2375, 2375, 2375,
+ 2375, 2375, 2375, 2375, 2375, 2375, 2375, 2375,
+ 2375, 2375, 2375, 2375, 2375, 2375, 2375, 2375,
- 2366, 2367, 2368, 2369, 2370, 2371, 2372, 2373,
- 2374, 2375, 2375, 2375, 2375, 2375, 2375, 2375,
2375, 2375, 2375, 2375, 2375, 2375, 2375, 2375,
- 2375, 2375, 2375, 2375, 2375, 2375, 2375, 305,
-
- 2376, 2376, 2376, 2376, 2376, 2376, 2376, 2376,
- 2376, 2376, 2376, 2376, 2376, 2376, 2376, 2376,
- 2376, 2376, 2376, 2376, 2376, 2376, 2376, 2376,
- 2376, 2376, 2376, 2376, 2376, 2376, 2376, 2376,
-
- 2376, 2376, 2376, 2376, 2376, 2376, 2376, 2376,
- 2376, 2376, 305, 2377, 2377, 2378, 305, 305,
- 2376, 2376, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
-
- 2379, 2379, 2379, 2379, 2379, 2379, 2379, 2379,
- 2379, 2379, 2379, 2379, 2379, 2379, 2379, 2379,
- 2379, 2379, 2379, 2379, 2379, 2379, 2379, 2379,
- 2379, 2379, 2379, 2379, 2379, 2380, 2380, 2380,
-
- 2380, 2380, 2380, 2380, 2380, 2380, 2380, 2379,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 2381, 2381, 2381, 2382, 2381, 2381, 2381, 2381,
- 2381, 2381, 2381, 2381, 2381, 2381, 2381, 2381,
-
- 2381, 2381, 2381, 2381, 2381, 2383, 2384, 2384,
- 2385, 2385, 2385, 2384, 2385, 2384, 2384, 2384,
- 2384, 2386, 2386, 2386, 2387, 2388, 2388, 2388,
- 2388, 2388, 305, 305, 305, 305, 305, 305,
-
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 2389, 2389, 2389, 2389, 2390, 2390, 2389, 2389,
+ 2375, 2375, 2375, 2375, 2375, 2375, 2376, 2376,
+ 2377, 2377, 2377, 2377, 2377, 2377, 2377, 2377,
+ 2377, 2377, 2377, 2377, 2377, 2377, 2377, 2377,
+
+ 2377, 2377, 2377, 2377, 2377, 2377, 2377, 2377,
+ 2377, 2377, 2377, 2377, 2377, 2377, 2377, 2377,
+ 2377, 2377, 2377, 2377, 2377, 2377, 2377, 2377,
+ 2377, 2377, 2377, 2377, 2377, 2377, 2377, 2377,
+
+ 2378, 2378, 2378, 2378, 2378, 2378, 2378, 2378,
+ 2378, 2378, 2378, 2378, 2378, 2378, 2378, 2378,
+ 2378, 2378, 2378, 2378, 2378, 2378, 2378, 2378,
+ 2378, 2378, 2378, 2378, 2378, 2378, 221, 221,
+
+ 2379, 2380, 2381, 2382, 2383, 2384, 2385, 2386,
+ 2387, 2388, 221, 221, 221, 221, 221, 221,
2389, 2389, 2389, 2389, 2389, 2389, 2389, 2389,
+ 2389, 2389, 2389, 2389, 2389, 2389, 2389, 2389,
+
+ 2389, 2389, 2389, 2389, 2389, 2389, 2389, 2389,
+ 2389, 2389, 2389, 2389, 2389, 2389, 2389, 2389,
+ 2389, 2389, 2389, 2389, 221, 221, 221, 221,
+ 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390,
+
+ 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390,
+ 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390,
+ 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390,
+ 2390, 2390, 2390, 2390, 221, 221, 221, 221,
+
+ 2391, 2391, 2391, 2391, 2391, 2391, 2391, 2391,
+ 2391, 2391, 2391, 2391, 2391, 2391, 2391, 2391,
+ 2391, 2391, 2391, 2391, 2391, 2391, 2391, 2391,
+ 2391, 2391, 2391, 2391, 2391, 2391, 2391, 2391,
+
+ 2391, 2391, 2391, 2391, 2391, 2391, 2391, 2391,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392,
+ 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392,
+
+ 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392,
+ 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392,
+ 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392,
+ 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392,
+
+ 2392, 2392, 2392, 2392, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 2393,
+ 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394,
+ 2394, 2394, 2394, 221, 2394, 2394, 2394, 2394,
+
+ 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394,
+ 2394, 2394, 2394, 221, 2394, 2394, 2394, 2394,
+ 2394, 2394, 2394, 221, 2394, 2394, 221, 2395,
+ 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395,
+
+ 2395, 2395, 221, 2395, 2395, 2395, 2395, 2395,
+ 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395,
+ 2395, 2395, 221, 2395, 2395, 2395, 2395, 2395,
+ 2395, 2395, 221, 2395, 2395, 221, 221, 221,
+
+ 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396,
+ 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396,
+ 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396,
+ 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396,
+
+ 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396,
+ 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396,
+ 2396, 2396, 2396, 2396, 2396, 2396, 2396, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396,
+ 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396,
+ 2396, 2396, 2396, 2396, 2396, 2396, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 2397, 2398, 2398, 1989, 1989, 1989, 221, 1989,
+ 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989,
+ 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989,
+ 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989,
+
+ 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989,
+ 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989,
+ 1989, 221, 1989, 1989, 1989, 1989, 1989, 1989,
+ 1989, 1989, 1989, 221, 221, 221, 221, 221,
+
+ 2399, 2399, 2399, 2399, 2399, 2399, 323, 323,
+ 2399, 323, 2399, 2399, 2399, 2399, 2399, 2399,
+ 2399, 2399, 2399, 2399, 2399, 2399, 2399, 2399,
+ 2399, 2399, 2399, 2399, 2399, 2399, 2399, 2399,
+
+ 2399, 2399, 2399, 2399, 2399, 2399, 2399, 2399,
+ 2399, 2399, 2399, 2399, 2399, 2399, 2399, 2399,
+ 2399, 2399, 2399, 2399, 2399, 2399, 323, 2399,
+ 2399, 323, 323, 323, 2399, 323, 323, 2399,
+
+ 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400,
+ 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400,
+ 2400, 2400, 2400, 2400, 2400, 2400, 323, 2401,
+ 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402,
- 2389, 2389, 2391, 2392, 2391, 2392, 2393, 2393,
- 2393, 2393, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
-
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 2394, 2395, 2394, 2394, 2396, 2396, 2396, 2395,
- 2394, 2396, 2396, 2394, 2394, 2396, 2394, 2394,
-
- 2395, 2394, 2396, 2396, 2394, 2397, 2397, 2397,
- 2397, 2398, 2399, 2400, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
-
- 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401,
- 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401,
- 2401, 2401, 2401, 2401, 2401, 2401, 2401, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
-
- 2402, 2403, 2402, 2404, 2404, 2404, 2404, 2404,
- 2404, 2404, 2404, 2404, 2404, 2404, 2404, 2404,
- 2404, 2404, 2404, 2404, 2404, 2404, 2404, 2404,
- 2404, 2404, 2404, 2404, 2404, 2404, 2404, 2404,
- 2404, 2404, 2404, 2404, 2404, 2404, 2404, 2404,
- 2404, 2404, 2404, 2404, 2404, 2404, 2404, 2404,
- 2404, 2404, 2404, 2404, 2404, 2404, 2404, 2404,
2403, 2403, 2403, 2403, 2403, 2403, 2403, 2403,
- 2403, 2403, 2403, 2403, 2403, 2403, 2405, 2406,
- 2406, 2407, 2407, 2407, 2407, 2407, 206, 206,
- 206, 206, 2408, 2409, 2410, 2411, 2412, 2413,
- 2414, 2415, 2416, 2417, 2417, 2417, 2417, 2417,
- 2417, 2417, 2417, 2417, 2417, 2417, 2418, 2419,
- 2420, 2421, 2422, 2423, 2424, 2425, 2426, 2427,
- 2428, 2429, 2429, 2430, 2430, 2429, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 2431,
- 2432, 2432, 2433, 2434, 2434, 2434, 2434, 2434,
- 2434, 2434, 2434, 2434, 2434, 2434, 2434, 2434,
- 2434, 2434, 2434, 2434, 2434, 2434, 2434, 2434,
- 2434, 2434, 2435, 2434, 2435, 2434, 2434, 2434,
- 2434, 2434, 2434, 2434, 2434, 2434, 2434, 2434,
- 2434, 2434, 2434, 2435, 2434, 2434, 2434, 2434,
- 2433, 2433, 2433, 2432, 2432, 2432, 2432, 2433,
- 2433, 2436, 2437, 2438, 2438, 2439, 2440, 2440,
- 2440, 2440, 2441, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 2442, 206, 206,
- 2443, 2443, 2443, 2443, 2443, 2443, 2443, 2443,
- 2443, 2443, 2443, 2443, 2443, 2443, 2443, 2443,
- 2443, 2443, 2443, 2443, 2443, 2443, 2443, 2443,
- 2443, 206, 206, 206, 206, 206, 206, 206,
- 2444, 2445, 2446, 2447, 2448, 2449, 2450, 2451,
- 2452, 2453, 206, 206, 206, 206, 206, 206,
-
- 2454, 2454, 2454, 2455, 2455, 2455, 2455, 2455,
- 2455, 2455, 2455, 2455, 2455, 2455, 2455, 2455,
+ 2403, 2403, 2403, 2403, 2403, 2403, 2403, 2403,
+ 2403, 2403, 2403, 2403, 2403, 2403, 2403, 2404,
+ 2404, 2405, 2405, 2405, 2405, 2405, 2405, 2405,
+
+ 2406, 2406, 2406, 2406, 2406, 2406, 2406, 2406,
+ 2406, 2406, 2406, 2406, 2406, 2406, 2406, 2406,
+ 2406, 2406, 2406, 2406, 2406, 2406, 2406, 2406,
+ 2406, 2406, 2406, 2406, 2406, 2406, 2406, 323,
+
+ 323, 323, 323, 323, 323, 323, 323, 2407,
+ 2407, 2407, 2407, 2407, 2407, 2407, 2407, 2407,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+
+ 2408, 2408, 2408, 2408, 2408, 2408, 2408, 2408,
+ 2408, 2408, 2408, 2408, 2408, 2408, 2408, 2408,
+ 2408, 2408, 2408, 323, 2408, 2408, 323, 323,
+ 323, 323, 323, 2409, 2409, 2409, 2409, 2409,
+
+ 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410,
+ 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410,
+ 2410, 2410, 2410, 2410, 2410, 2410, 2411, 2411,
+ 2411, 2411, 2412, 2412, 323, 323, 323, 2413,
+
+ 2414, 2414, 2414, 2414, 2414, 2414, 2414, 2414,
+ 2414, 2414, 2414, 2414, 2414, 2414, 2414, 2414,
+ 2414, 2414, 2414, 2414, 2414, 2414, 2414, 2414,
+ 2414, 2414, 323, 323, 323, 323, 323, 2415,
+
+ 2416, 2416, 2416, 2416, 2416, 2416, 2416, 2416,
+ 2416, 2416, 2416, 2416, 2416, 2416, 2416, 2416,
+ 2416, 2416, 2416, 2416, 2416, 2416, 2416, 2416,
+ 2416, 2416, 2416, 2416, 2416, 2416, 2416, 2416,
+
+ 2417, 2417, 2417, 2417, 2417, 2417, 2417, 2417,
+ 2417, 2417, 2417, 2417, 2417, 2417, 2417, 2417,
+ 2417, 2417, 2417, 2417, 2417, 2417, 2417, 2417,
+ 323, 323, 323, 323, 2418, 2418, 2417, 2417,
+
+ 2418, 2418, 2418, 2418, 2418, 2418, 2418, 2418,
+ 2418, 2418, 2418, 2418, 2418, 2418, 2418, 2418,
+ 323, 323, 2418, 2418, 2418, 2418, 2418, 2418,
+ 2418, 2418, 2418, 2418, 2418, 2418, 2418, 2418,
+
+ 2418, 2418, 2418, 2418, 2418, 2418, 2418, 2418,
+ 2418, 2418, 2418, 2418, 2418, 2418, 2418, 2418,
+ 2418, 2418, 2418, 2418, 2418, 2418, 2418, 2418,
+ 2418, 2418, 2418, 2418, 2418, 2418, 2418, 2418,
+
+ 2419, 2420, 2420, 2420, 323, 2420, 2420, 323,
+ 323, 323, 323, 323, 2420, 2421, 2420, 2422,
+ 2419, 2419, 2419, 2419, 323, 2419, 2419, 2419,
+ 323, 2419, 2419, 2419, 2419, 2419, 2419, 2419,
+
+ 2419, 2419, 2419, 2419, 2419, 2419, 2419, 2419,
+ 2419, 2419, 2419, 2419, 2419, 2419, 2419, 2419,
+ 2419, 2419, 2419, 2419, 2423, 2423, 323, 323,
+ 2422, 2424, 2421, 323, 323, 323, 323, 2425,
+
+ 2426, 2427, 2428, 2429, 2430, 2430, 2430, 2430,
+ 2431, 323, 323, 323, 323, 323, 323, 323,
+ 2432, 2432, 2432, 2432, 2432, 2432, 2433, 2433,
+ 2434, 323, 323, 323, 323, 323, 323, 323,
+
+ 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435,
+ 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435,
+ 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435,
+ 2435, 2435, 2435, 2435, 2435, 2436, 2436, 2437,
+
+ 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438,
+ 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438,
+ 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438,
+ 2438, 2438, 2438, 2438, 2438, 2439, 2439, 2439,
+
+ 2440, 2440, 2440, 2440, 2440, 2441, 2442, 2441,
+ 2443, 2441, 2441, 2442, 2442, 2444, 2441, 2441,
+ 2441, 2441, 2441, 2440, 2440, 2440, 2440, 2444,
+ 2440, 2440, 2440, 2440, 2440, 2441, 2440, 2440,
+
+ 2440, 2441, 2442, 2442, 2441, 2445, 2446, 323,
+ 323, 323, 323, 2447, 2447, 2447, 2447, 2448,
+ 2449, 2449, 2449, 2449, 2449, 2449, 2450, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+
+ 2451, 2451, 2451, 2451, 2451, 2451, 2451, 2451,
+ 2451, 2451, 2451, 2451, 2451, 2451, 2451, 2451,
+ 2451, 2451, 2451, 2451, 2451, 2451, 2451, 2451,
+ 2451, 2451, 2451, 2451, 2451, 2451, 2451, 2451,
+
+ 2451, 2451, 2451, 2451, 2451, 2451, 2451, 2451,
+ 2451, 2451, 2451, 2451, 2451, 2451, 2451, 2451,
+ 2451, 2451, 2451, 2451, 2451, 2451, 323, 323,
+ 323, 2452, 2452, 2452, 2452, 2452, 2452, 2452,
+
+ 2453, 2453, 2453, 2453, 2453, 2453, 2453, 2453,
+ 2453, 2453, 2453, 2453, 2453, 2453, 2453, 2453,
+ 2453, 2453, 2453, 2453, 2453, 2453, 323, 323,
+ 2454, 2454, 2454, 2454, 2454, 2454, 2454, 2454,
+
2455, 2455, 2455, 2455, 2455, 2455, 2455, 2455,
2455, 2455, 2455, 2455, 2455, 2455, 2455, 2455,
- 2455, 2455, 2455, 2455, 2455, 2455, 2455, 2456,
- 2457, 2457, 2457, 2457, 2458, 2457, 2459, 2459,
- 2457, 2457, 2457, 2460, 2460, 206, 2461, 2462,
- 2463, 2464, 2465, 2466, 2467, 2468, 2469, 2470,
- 2471, 2472, 2472, 2472, 2473, 2474, 2474, 2475,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 2476, 2476, 2476, 2476, 2476, 2476, 2476, 2476,
- 2476, 2476, 2476, 2476, 2476, 2476, 2476, 2476,
- 2476, 2476, 2476, 2476, 2476, 2476, 2476, 2476,
- 2476, 2476, 2476, 2476, 2476, 2476, 2476, 2476,
- 2476, 2476, 2476, 2477, 2478, 2479, 2476, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 2480, 2480, 2481, 2482, 2482, 2482, 2482, 2482,
- 2482, 2482, 2482, 2482, 2482, 2482, 2482, 2482,
- 2482, 2482, 2482, 2482, 2482, 2482, 2482, 2482,
- 2482, 2482, 2482, 2482, 2482, 2482, 2482, 2482,
- 2482, 2482, 2482, 2482, 2482, 2482, 2482, 2482,
- 2482, 2482, 2482, 2482, 2482, 2482, 2482, 2482,
- 2482, 2482, 2482, 2481, 2481, 2481, 2480, 2480,
- 2480, 2480, 2480, 2480, 2480, 2480, 2480, 2481,
- 2483, 2482, 2484, 2484, 2482, 2485, 2485, 2486,
- 2487, 2488, 2489, 2488, 2488, 2490, 2491, 2492,
- 2493, 2494, 2495, 2496, 2497, 2498, 2499, 2500,
- 2501, 2502, 2503, 2504, 2505, 2506, 2507, 2507,
- 206, 2508, 2508, 2508, 2508, 2508, 2508, 2508,
- 2508, 2508, 2508, 2508, 2508, 2508, 2508, 2508,
- 2508, 2508, 2508, 2508, 2508, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
-
- 2509, 2509, 2509, 2509, 2509, 2509, 2509, 2509,
- 2509, 2509, 2509, 2509, 2509, 2509, 2509, 2509,
- 2509, 2509, 206, 2509, 2509, 2509, 2509, 2509,
- 2509, 2509, 2509, 2509, 2509, 2509, 2509, 2509,
- 2509, 2509, 2509, 2509, 2509, 2509, 2509, 2509,
- 2509, 2509, 2509, 2509, 2510, 2510, 2510, 2511,
- 2511, 2511, 2510, 2510, 2511, 2512, 2513, 2511,
- 2514, 2514, 2515, 2514, 2514, 2515, 2516, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 2517, 2517, 2517, 2517, 2517, 2517, 2517, 206,
- 2517, 206, 2517, 2517, 2517, 2517, 206, 2517,
+ 2455, 2455, 2455, 323, 323, 323, 323, 323,
+ 2456, 2456, 2456, 2456, 2456, 2456, 2456, 2456,
+
+ 2457, 2458, 2457, 2458, 2458, 2458, 2457, 2457,
+ 2457, 2458, 2457, 2457, 2458, 2457, 2458, 2458,
+ 2457, 2458, 323, 323, 323, 323, 323, 323,
+ 323, 2459, 2459, 2459, 2459, 323, 323, 323,
+
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 2460, 2460, 2460, 2460, 2461, 2461, 2462,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+
+ 2463, 2463, 2463, 2463, 2463, 2463, 2463, 2463,
+ 2463, 2463, 2463, 2463, 2463, 2463, 2463, 2463,
+ 2463, 2463, 2463, 2463, 2463, 2463, 2463, 2463,
+ 2463, 2463, 2463, 2463, 2463, 2463, 2463, 2463,
+
+ 2463, 2463, 2463, 2463, 2463, 2463, 2463, 2463,
+ 2463, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+
+ 2464, 2464, 2464, 2464, 2464, 2464, 2464, 2464,
+ 2464, 2464, 2464, 2464, 2464, 2464, 2464, 2464,
+ 2464, 2464, 2464, 2464, 2464, 2464, 2464, 2464,
+ 2464, 2464, 2464, 2464, 2464, 2464, 2464, 2464,
+
+ 2464, 2464, 2464, 2464, 2464, 2464, 2464, 2464,
+ 2464, 2464, 2464, 2464, 2464, 2464, 2464, 2464,
+ 2464, 2464, 2464, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+
+ 2465, 2465, 2465, 2465, 2465, 2465, 2465, 2465,
+ 2465, 2465, 2465, 2465, 2465, 2465, 2465, 2465,
+ 2465, 2465, 2465, 2465, 2465, 2465, 2465, 2465,
+ 2465, 2465, 2465, 2465, 2465, 2465, 2465, 2465,
+
+ 2465, 2465, 2465, 2465, 2465, 2465, 2465, 2465,
+ 2465, 2465, 2465, 2465, 2465, 2465, 2465, 2465,
+ 2465, 2465, 2465, 323, 323, 323, 323, 323,
+ 323, 323, 2466, 2466, 2466, 2466, 2466, 2466,
+
+ 2467, 2468, 2468, 2468, 2468, 2468, 2468, 2468,
+ 2468, 2468, 2468, 2468, 2468, 2468, 2468, 2468,
+ 2468, 2468, 2468, 2468, 2468, 2468, 2468, 2468,
+ 2468, 2468, 2468, 2468, 2468, 2468, 2468, 2468,
+
+ 2468, 2468, 2469, 2468, 2470, 2470, 2470, 2470,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 2471, 2472, 2473, 2474, 2475, 2476, 2477, 2478,
+ 2479, 2480, 323, 323, 323, 323, 323, 323,
+
+ 2481, 2482, 2483, 2484, 2485, 2486, 2487, 2488,
+ 2489, 2490, 2490, 2490, 2490, 2490, 2490, 2490,
+ 2490, 2490, 2490, 2490, 2490, 2490, 2490, 2490,
+ 2490, 2490, 2490, 2490, 2490, 2490, 2490, 323,
+
+ 2491, 2491, 2491, 2491, 2491, 2491, 2491, 2491,
+ 2491, 2491, 2491, 2491, 2491, 2491, 2491, 2491,
+ 2491, 2491, 2491, 2491, 2491, 2491, 2491, 2491,
+ 2491, 2491, 2491, 2491, 2491, 2491, 2491, 2491,
+
+ 2491, 2491, 2491, 2491, 2491, 2491, 2491, 2491,
+ 2491, 2491, 323, 2492, 2492, 2493, 323, 323,
+ 2491, 2491, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 2494, 2494, 2494,
+
+ 2495, 2495, 2495, 2495, 2495, 2495, 2495, 2495,
+ 2495, 2495, 2495, 2495, 2495, 2495, 2495, 2495,
+ 2495, 2495, 2495, 2495, 2495, 2495, 2495, 2495,
+ 2495, 2495, 2495, 2495, 2495, 2496, 2496, 2496,
+
+ 2496, 2496, 2496, 2496, 2496, 2496, 2496, 2495,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 2497, 2497, 2497, 2498, 2497, 2497, 2497, 2497,
+ 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
+
+ 2497, 2497, 2497, 2497, 2497, 2499, 2500, 2500,
+ 2501, 2501, 2501, 2500, 2501, 2500, 2500, 2500,
+ 2500, 2502, 2502, 2502, 2503, 2504, 2504, 2504,
+ 2504, 2504, 323, 323, 323, 323, 323, 323,
+
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 2505, 2505, 2505, 2505, 2506, 2506, 2505, 2505,
+ 2505, 2505, 2505, 2505, 2505, 2505, 2505, 2505,
+
+ 2505, 2505, 2507, 2508, 2507, 2508, 2509, 2509,
+ 2509, 2509, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 2510, 2511, 2510, 2510, 2512, 2512, 2512, 2511,
+ 2510, 2512, 2512, 2510, 2510, 2512, 2510, 2510,
+
+ 2511, 2510, 2512, 2512, 2510, 2513, 2513, 2513,
+ 2513, 2514, 2515, 2516, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+
2517, 2517, 2517, 2517, 2517, 2517, 2517, 2517,
- 2517, 2517, 2517, 2517, 2517, 2517, 206, 2517,
2517, 2517, 2517, 2517, 2517, 2517, 2517, 2517,
- 2517, 2518, 206, 206, 206, 206, 206, 206,
- 2519, 2519, 2519, 2519, 2519, 2519, 2519, 2519,
- 2519, 2519, 2519, 2519, 2519, 2519, 2519, 2519,
- 2519, 2519, 2519, 2519, 2519, 2519, 2519, 2519,
+ 2517, 2517, 2517, 2517, 2517, 2517, 2517, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+
+ 2518, 2519, 2518, 2520, 2520, 2520, 2520, 2520,
+ 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520,
+ 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520,
+ 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520,
+ 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520,
+ 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520,
+ 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520,
2519, 2519, 2519, 2519, 2519, 2519, 2519, 2519,
- 2519, 2519, 2519, 2519, 2519, 2519, 2519, 2519,
- 2519, 2519, 2519, 2519, 2519, 2519, 2519, 2520,
- 2521, 2521, 2521, 2520, 2520, 2520, 2520, 2520,
- 2520, 2522, 2523, 206, 206, 206, 206, 206,
- 2524, 2525, 2526, 2527, 2528, 2529, 2530, 2531,
- 2532, 2533, 206, 206, 206, 206, 206, 206,
-
- 2534, 2535, 2536, 2536, 206, 2537, 2537, 2537,
- 2537, 2537, 2537, 2537, 2537, 206, 206, 2537,
- 2537, 206, 206, 2537, 2537, 2537, 2537, 2537,
- 2537, 2537, 2537, 2537, 2537, 2537, 2537, 2537,
- 2537, 2537, 2537, 2537, 2537, 2537, 2537, 2537,
- 2537, 206, 2537, 2537, 2537, 2537, 2537, 2537,
- 2537, 206, 2537, 2537, 206, 2537, 2537, 2537,
- 2537, 2537, 206, 2538, 2539, 2537, 2540, 2536,
- 2535, 2536, 2536, 2536, 2536, 206, 206, 2536,
- 2536, 206, 206, 2541, 2541, 2542, 206, 206,
- 2543, 206, 206, 206, 206, 206, 206, 2540,
- 206, 206, 206, 206, 206, 2537, 2537, 2537,
- 2537, 2537, 2536, 2536, 206, 206, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 206, 206, 206,
- 2544, 2544, 2544, 2544, 2544, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
-
- 2545, 2545, 2545, 2545, 2545, 2545, 2545, 2545,
- 2545, 2545, 2545, 2545, 2545, 2545, 2545, 2545,
- 2545, 2545, 2545, 2545, 2545, 2545, 2545, 2545,
- 2545, 2545, 2545, 2545, 2545, 2545, 2545, 2545,
- 2545, 2545, 2545, 2545, 2545, 2545, 2545, 2545,
- 2545, 2545, 2545, 2545, 2545, 2545, 2545, 2545,
- 2545, 2545, 2545, 2545, 2545, 2546, 2546, 2546,
- 2547, 2547, 2547, 2547, 2547, 2547, 2547, 2547,
- 2546, 2546, 2548, 2547, 2547, 2546, 2549, 2545,
- 2545, 2545, 2545, 2550, 2550, 2551, 2551, 2552,
- 2553, 2554, 2555, 2556, 2557, 2558, 2559, 2560,
- 2561, 2562, 2563, 2551, 206, 2552, 2564, 2565,
- 2566, 2566, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 2567, 2567, 2567, 2567, 2567, 2567, 2567, 2567,
- 2567, 2567, 2567, 2567, 2567, 2567, 2567, 2567,
- 2567, 2567, 2567, 2567, 2567, 2567, 2567, 2567,
- 2567, 2567, 2567, 2567, 2567, 2567, 2567, 2567,
- 2567, 2567, 2567, 2567, 2567, 2567, 2567, 2567,
- 2567, 2567, 2567, 2567, 2567, 2567, 2567, 2567,
- 2568, 2569, 2569, 2570, 2570, 2570, 2570, 2570,
- 2570, 2569, 2571, 2572, 2572, 2568, 2572, 2570,
- 2570, 2569, 2573, 2574, 2567, 2567, 2575, 2567,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 2576, 2577, 2578, 2579, 2580, 2581, 2582, 2583,
- 2584, 2585, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
-
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586,
- 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586,
- 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586,
- 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586,
- 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586,
- 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2587,
- 2588, 2588, 2589, 2589, 2589, 2589, 206, 206,
- 2588, 2588, 2590, 2590, 2589, 2589, 2588, 2591,
- 2592, 2593, 2594, 2594, 2595, 2595, 2596, 2596,
- 2596, 2594, 2597, 2597, 2597, 2597, 2597, 2597,
- 2597, 2597, 2597, 2597, 2597, 2597, 2597, 2597,
- 2598, 2598, 2598, 2598, 2599, 2599, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
-
- 2600, 2600, 2600, 2600, 2600, 2600, 2600, 2600,
- 2600, 2600, 2600, 2600, 2600, 2600, 2600, 2600,
- 2600, 2600, 2600, 2600, 2600, 2600, 2600, 2600,
- 2600, 2600, 2600, 2600, 2600, 2600, 2600, 2600,
- 2600, 2600, 2600, 2600, 2600, 2600, 2600, 2600,
- 2600, 2600, 2600, 2600, 2600, 2600, 2600, 2600,
- 2601, 2601, 2601, 2602, 2602, 2602, 2602, 2602,
- 2602, 2602, 2602, 2601, 2601, 2602, 2601, 2603,
- 2602, 2604, 2604, 2605, 2600, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 2606, 2607, 2608, 2609, 2610, 2611, 2612, 2613,
- 2614, 2615, 206, 206, 206, 206, 206, 206,
- 2616, 2616, 2616, 2616, 2616, 2616, 2616, 2616,
- 2616, 2616, 2616, 2616, 2616, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 2617, 2617, 2617, 2617, 2617, 2617, 2617, 2617,
- 2617, 2617, 2617, 2617, 2617, 2617, 2617, 2617,
- 2617, 2617, 2617, 2617, 2617, 2617, 2617, 2617,
- 2617, 2617, 2617, 2617, 2617, 2617, 2617, 2617,
- 2617, 2617, 2617, 2617, 2617, 2617, 2617, 2617,
- 2617, 2617, 2617, 2618, 2619, 2618, 2619, 2619,
- 2618, 2618, 2618, 2618, 2618, 2618, 2620, 2621,
- 2622, 2623, 206, 206, 206, 206, 206, 206,
- 2624, 2625, 2626, 2627, 2628, 2629, 2630, 2631,
- 2632, 2633, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
-
- 2634, 2634, 2634, 2634, 2634, 2634, 2634, 2634,
- 2634, 2634, 2634, 2634, 2634, 2634, 2634, 2634,
- 2634, 2634, 2634, 2634, 2634, 2634, 2634, 2634,
- 2634, 2634, 2635, 206, 206, 2636, 2636, 2636,
- 2637, 2637, 2636, 2636, 2636, 2636, 2638, 2636,
- 2636, 2636, 2636, 2639, 206, 206, 206, 206,
- 2640, 2641, 2642, 2643, 2644, 2645, 2646, 2647,
- 2648, 2649, 2650, 2650, 2651, 2651, 2651, 2652,
- 2653, 2653, 2653, 2653, 2653, 2653, 2653, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
-
- 2654, 2654, 2654, 2654, 2654, 2654, 2654, 2654,
- 2654, 2654, 2654, 2654, 2654, 2654, 2654, 2654,
- 2654, 2654, 2654, 2654, 2654, 2654, 2654, 2654,
- 2654, 2654, 2654, 2654, 2654, 2654, 2654, 2654,
- 2654, 2654, 2654, 2654, 2654, 2654, 2654, 2654,
- 2654, 2654, 2654, 2654, 2655, 2655, 2655, 2656,
- 2656, 2656, 2656, 2656, 2656, 2656, 2656, 2656,
- 2655, 2657, 2658, 2659, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 2660, 2660, 2660, 2660, 2660, 2660, 2660, 2660,
- 2660, 2660, 2660, 2660, 2660, 2660, 2660, 2660,
- 2660, 2660, 2660, 2660, 2660, 2660, 2660, 2660,
- 2660, 2660, 2660, 2660, 2660, 2660, 2660, 2660,
- 2661, 2661, 2661, 2661, 2661, 2661, 2661, 2661,
- 2661, 2661, 2661, 2661, 2661, 2661, 2661, 2661,
- 2661, 2661, 2661, 2661, 2661, 2661, 2661, 2661,
- 2661, 2661, 2661, 2661, 2661, 2661, 2661, 2661,
- 2662, 2663, 2664, 2665, 2666, 2667, 2668, 2669,
- 2670, 2671, 2672, 2672, 2672, 2672, 2672, 2672,
- 2672, 2672, 2672, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 2673,
-
- 2674, 2674, 2674, 2674, 2674, 2674, 2674, 206,
- 206, 2674, 206, 206, 2674, 2674, 2674, 2674,
- 2674, 2674, 2674, 2674, 206, 2674, 2674, 206,
- 2674, 2674, 2674, 2674, 2674, 2674, 2674, 2674,
- 2674, 2674, 2674, 2674, 2674, 2674, 2674, 2674,
- 2674, 2674, 2674, 2674, 2674, 2674, 2674, 2674,
- 2675, 2676, 2676, 2676, 2676, 2676, 206, 2676,
- 2677, 206, 206, 2678, 2678, 2679, 2680, 2681,
- 2676, 2681, 2676, 2682, 2683, 2684, 2683, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 2685, 2686, 2687, 2688, 2689, 2690, 2691, 2692,
- 2693, 2694, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 2695, 2695, 2695, 2695, 2695, 2695, 2695, 2695,
- 206, 206, 2695, 2695, 2695, 2695, 2695, 2695,
- 2695, 2695, 2695, 2695, 2695, 2695, 2695, 2695,
- 2695, 2695, 2695, 2695, 2695, 2695, 2695, 2695,
- 2695, 2695, 2695, 2695, 2695, 2695, 2695, 2695,
- 2695, 2695, 2695, 2695, 2695, 2695, 2695, 2695,
- 2695, 2696, 2696, 2696, 2697, 2697, 2697, 2697,
- 206, 206, 2697, 2697, 2696, 2696, 2696, 2696,
- 2698, 2695, 2699, 2695, 2696, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
-
- 2700, 2701, 2701, 2701, 2701, 2701, 2701, 2702,
- 2702, 2701, 2701, 2700, 2700, 2700, 2700, 2700,
- 2700, 2700, 2700, 2700, 2700, 2700, 2700, 2700,
- 2700, 2700, 2700, 2700, 2700, 2700, 2700, 2700,
- 2700, 2700, 2700, 2700, 2700, 2700, 2700, 2700,
- 2700, 2700, 2700, 2700, 2700, 2700, 2700, 2700,
- 2700, 2700, 2700, 2701, 2703, 2701, 2701, 2701,
- 2701, 2704, 2705, 2701, 2701, 2701, 2701, 2706,
- 2707, 2708, 2709, 2709, 2708, 2706, 2707, 2703,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 2710, 2711, 2711, 2711, 2711, 2711, 2711, 2712,
- 2712, 2711, 2711, 2711, 2710, 2710, 2710, 2710,
- 2710, 2710, 2710, 2710, 2710, 2710, 2710, 2710,
- 2710, 2710, 2710, 2710, 2710, 2710, 2710, 2710,
- 2710, 2710, 2710, 2710, 2710, 2710, 2710, 2710,
- 2710, 2710, 2710, 2710, 2710, 2710, 2710, 2710,
- 2710, 2710, 2710, 2710, 2713, 2713, 2714, 2714,
- 2714, 2714, 2711, 2711, 2711, 2711, 2711, 2711,
- 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2712,
- 2711, 2715, 2716, 2717, 2717, 2718, 2719, 2719,
- 2719, 2716, 2716, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720,
- 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720,
- 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721,
- 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721,
- 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721,
- 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721,
- 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721,
- 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721,
- 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721,
- 2721, 206, 206, 206, 206, 206, 206, 206,
-
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
-
- 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722,
- 2722, 206, 2722, 2722, 2722, 2722, 2722, 2722,
- 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722,
- 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722,
- 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722,
- 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2723,
- 2724, 2724, 2724, 2724, 2724, 2724, 2724, 206,
- 2724, 2724, 2724, 2724, 2724, 2724, 2723, 2725,
- 2722, 2726, 2726, 2727, 2727, 2727, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 2728, 2729, 2730, 2731, 2732, 2733, 2734, 2735,
- 2736, 2737, 2738, 2738, 2738, 2738, 2738, 2738,
- 2738, 2738, 2738, 2738, 2738, 2738, 2738, 2738,
- 2738, 2738, 2738, 2738, 2738, 206, 206, 206,
- 2739, 2740, 2741, 2741, 2741, 2741, 2741, 2741,
- 2741, 2741, 2741, 2741, 2741, 2741, 2741, 2741,
- 2741, 2741, 2741, 2741, 2741, 2741, 2741, 2741,
- 2741, 2741, 2741, 2741, 2741, 2741, 2741, 2741,
- 206, 206, 2742, 2742, 2742, 2742, 2742, 2742,
- 2742, 2742, 2742, 2742, 2742, 2742, 2742, 2742,
- 2742, 2742, 2742, 2742, 2742, 2742, 2742, 2742,
- 206, 2743, 2742, 2742, 2742, 2742, 2742, 2742,
- 2742, 2743, 2742, 2742, 2743, 2742, 2742, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
-
- 2744, 2744, 2744, 2744, 2744, 2744, 2744, 206,
- 2744, 2744, 206, 2744, 2744, 2744, 2744, 2744,
- 2744, 2744, 2744, 2744, 2744, 2744, 2744, 2744,
- 2744, 2744, 2744, 2744, 2744, 2744, 2744, 2744,
- 2744, 2744, 2744, 2744, 2744, 2744, 2744, 2744,
- 2744, 2744, 2744, 2744, 2744, 2744, 2744, 2744,
- 2744, 2745, 2745, 2745, 2745, 2745, 2745, 206,
- 206, 206, 2745, 206, 2745, 2745, 206, 2745,
- 2745, 2745, 2746, 2745, 2747, 2747, 2748, 2745,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 2749, 2750, 2751, 2752, 2753, 2754, 2755, 2756,
- 2757, 2758, 206, 206, 206, 206, 206, 206,
- 2759, 2759, 2759, 2759, 2759, 2759, 206, 2759,
- 2759, 206, 2759, 2759, 2759, 2759, 2759, 2759,
- 2759, 2759, 2759, 2759, 2759, 2759, 2759, 2759,
- 2759, 2759, 2759, 2759, 2759, 2759, 2759, 2759,
- 2759, 2759, 2759, 2759, 2759, 2759, 2759, 2759,
- 2759, 2759, 2760, 2760, 2760, 2760, 2760, 206,
- 2761, 2761, 206, 2760, 2760, 2761, 2760, 2762,
- 2759, 206, 206, 206, 206, 206, 206, 206,
- 2763, 2764, 2765, 2766, 2767, 2768, 2769, 2770,
- 2771, 2772, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
-
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
+ 2519, 2519, 2519, 2519, 2519, 2519, 2521, 2522,
+ 2522, 2523, 2523, 2523, 2523, 2523, 221, 221,
+ 221, 221, 2524, 2525, 2526, 2527, 2528, 2529,
+ 2530, 2531, 2532, 2533, 2533, 2533, 2533, 2533,
+ 2533, 2533, 2533, 2533, 2533, 2533, 2534, 2535,
+ 2536, 2537, 2538, 2539, 2540, 2541, 2542, 2543,
+ 2544, 2545, 2545, 2546, 2546, 2545, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 2547,
+ 2548, 2548, 2549, 2550, 2550, 2550, 2550, 2550,
+ 2550, 2550, 2550, 2550, 2550, 2550, 2550, 2550,
+ 2550, 2550, 2550, 2550, 2550, 2550, 2550, 2550,
+ 2550, 2550, 2551, 2550, 2551, 2550, 2550, 2550,
+ 2550, 2550, 2550, 2550, 2550, 2550, 2550, 2550,
+ 2550, 2550, 2550, 2551, 2550, 2550, 2550, 2550,
+ 2549, 2549, 2549, 2548, 2548, 2548, 2548, 2549,
+ 2549, 2552, 2553, 2554, 2554, 2555, 2556, 2556,
+ 2556, 2556, 2557, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 2558, 221, 221,
+ 2559, 2559, 2559, 2559, 2559, 2559, 2559, 2559,
+ 2559, 2559, 2559, 2559, 2559, 2559, 2559, 2559,
+ 2559, 2559, 2559, 2559, 2559, 2559, 2559, 2559,
+ 2559, 221, 221, 221, 221, 221, 221, 221,
+ 2560, 2561, 2562, 2563, 2564, 2565, 2566, 2567,
+ 2568, 2569, 221, 221, 221, 221, 221, 221,
+
+ 2570, 2570, 2570, 2571, 2571, 2571, 2571, 2571,
+ 2571, 2571, 2571, 2571, 2571, 2571, 2571, 2571,
+ 2571, 2571, 2571, 2571, 2571, 2571, 2571, 2571,
+ 2571, 2571, 2571, 2571, 2571, 2571, 2571, 2571,
+ 2571, 2571, 2571, 2571, 2571, 2571, 2571, 2572,
+ 2573, 2573, 2573, 2573, 2574, 2573, 2575, 2575,
+ 2573, 2573, 2573, 2576, 2576, 221, 2577, 2578,
+ 2579, 2580, 2581, 2582, 2583, 2584, 2585, 2586,
+ 2587, 2588, 2588, 2588, 2589, 2590, 2590, 2591,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 2592, 2592, 2592, 2592, 2592, 2592, 2592, 2592,
+ 2592, 2592, 2592, 2592, 2592, 2592, 2592, 2592,
+ 2592, 2592, 2592, 2592, 2592, 2592, 2592, 2592,
+ 2592, 2592, 2592, 2592, 2592, 2592, 2592, 2592,
+ 2592, 2592, 2592, 2593, 2594, 2595, 2592, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 2596, 2596, 2597, 2598, 2598, 2598, 2598, 2598,
+ 2598, 2598, 2598, 2598, 2598, 2598, 2598, 2598,
+ 2598, 2598, 2598, 2598, 2598, 2598, 2598, 2598,
+ 2598, 2598, 2598, 2598, 2598, 2598, 2598, 2598,
+ 2598, 2598, 2598, 2598, 2598, 2598, 2598, 2598,
+ 2598, 2598, 2598, 2598, 2598, 2598, 2598, 2598,
+ 2598, 2598, 2598, 2597, 2597, 2597, 2596, 2596,
+ 2596, 2596, 2596, 2596, 2596, 2596, 2596, 2597,
+ 2599, 2598, 2600, 2600, 2598, 2601, 2601, 2602,
+ 2603, 2604, 2605, 2604, 2604, 2606, 2607, 2608,
+ 2609, 2610, 2611, 2612, 2613, 2614, 2615, 2616,
+ 2617, 2618, 2619, 2620, 2621, 2622, 2623, 2623,
+ 221, 2624, 2624, 2624, 2624, 2624, 2624, 2624,
+ 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624,
+ 2624, 2624, 2624, 2624, 2624, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625,
+ 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625,
+ 2625, 2625, 221, 2625, 2625, 2625, 2625, 2625,
+ 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625,
+ 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625,
+ 2625, 2625, 2625, 2625, 2626, 2626, 2626, 2627,
+ 2627, 2627, 2626, 2626, 2627, 2628, 2629, 2627,
+ 2630, 2630, 2631, 2630, 2630, 2631, 2632, 2633,
+ 2633, 2634, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 2635, 2635, 2635, 2635, 2635, 2635, 2635, 221,
+ 2635, 221, 2635, 2635, 2635, 2635, 221, 2635,
+ 2635, 2635, 2635, 2635, 2635, 2635, 2635, 2635,
+ 2635, 2635, 2635, 2635, 2635, 2635, 221, 2635,
+ 2635, 2635, 2635, 2635, 2635, 2635, 2635, 2635,
+ 2635, 2636, 221, 221, 221, 221, 221, 221,
+ 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
+ 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
+ 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
+ 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
+ 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
+ 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2638,
+ 2639, 2639, 2639, 2638, 2638, 2638, 2638, 2638,
+ 2638, 2640, 2641, 221, 221, 221, 221, 221,
+ 2642, 2643, 2644, 2645, 2646, 2647, 2648, 2649,
+ 2650, 2651, 221, 221, 221, 221, 221, 221,
+
+ 2652, 2653, 2654, 2654, 221, 2655, 2655, 2655,
+ 2655, 2655, 2655, 2655, 2655, 221, 221, 2655,
+ 2655, 221, 221, 2655, 2655, 2655, 2655, 2655,
+ 2655, 2655, 2655, 2655, 2655, 2655, 2655, 2655,
+ 2655, 2655, 2655, 2655, 2655, 2655, 2655, 2655,
+ 2655, 221, 2655, 2655, 2655, 2655, 2655, 2655,
+ 2655, 221, 2655, 2655, 221, 2655, 2655, 2655,
+ 2655, 2655, 221, 2656, 2657, 2658, 2659, 2654,
+ 2653, 2654, 2654, 2654, 2654, 221, 221, 2654,
+ 2654, 221, 221, 2660, 2660, 2661, 221, 221,
+ 2662, 221, 221, 221, 221, 221, 221, 2659,
+ 221, 221, 221, 221, 221, 2658, 2655, 2655,
+ 2655, 2655, 2654, 2654, 221, 221, 2663, 2663,
+ 2663, 2663, 2663, 2663, 2663, 221, 221, 221,
+ 2663, 2663, 2663, 2663, 2663, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
+ 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
+ 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
+ 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
+ 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
+ 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
+ 2664, 2664, 2664, 2664, 2664, 2665, 2665, 2665,
+ 2666, 2666, 2666, 2666, 2666, 2666, 2666, 2666,
+ 2665, 2665, 2667, 2666, 2666, 2665, 2668, 2664,
+ 2664, 2664, 2664, 2669, 2669, 2670, 2670, 2671,
+ 2672, 2673, 2674, 2675, 2676, 2677, 2678, 2679,
+ 2680, 2681, 2682, 2670, 221, 2671, 2683, 2684,
+ 2685, 2685, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 2686, 2686, 2686, 2686, 2686, 2686, 2686, 2686,
+ 2686, 2686, 2686, 2686, 2686, 2686, 2686, 2686,
+ 2686, 2686, 2686, 2686, 2686, 2686, 2686, 2686,
+ 2686, 2686, 2686, 2686, 2686, 2686, 2686, 2686,
+ 2686, 2686, 2686, 2686, 2686, 2686, 2686, 2686,
+ 2686, 2686, 2686, 2686, 2686, 2686, 2686, 2686,
+ 2687, 2688, 2688, 2689, 2689, 2689, 2689, 2689,
+ 2689, 2688, 2690, 2691, 2691, 2687, 2691, 2689,
+ 2689, 2688, 2692, 2693, 2686, 2686, 2694, 2686,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 2695, 2696, 2697, 2698, 2699, 2700, 2701, 2702,
+ 2703, 2704, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 2705, 2705, 2705, 2705, 2705, 2705, 2705, 2705,
+ 2705, 2705, 2705, 2705, 2705, 2705, 2705, 2705,
+ 2705, 2705, 2705, 2705, 2705, 2705, 2705, 2705,
+ 2705, 2705, 2705, 2705, 2705, 2705, 2705, 2705,
+ 2705, 2705, 2705, 2705, 2705, 2705, 2705, 2705,
+ 2705, 2705, 2705, 2705, 2705, 2705, 2705, 2706,
+ 2707, 2707, 2708, 2708, 2708, 2708, 221, 221,
+ 2707, 2707, 2709, 2709, 2708, 2708, 2707, 2710,
+ 2711, 2712, 2713, 2713, 2714, 2714, 2715, 2715,
+ 2715, 2713, 2716, 2716, 2716, 2716, 2716, 2716,
+ 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716,
+ 2717, 2717, 2717, 2717, 2718, 2718, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719,
+ 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719,
+ 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719,
+ 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719,
+ 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719,
+ 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719,
+ 2720, 2720, 2720, 2721, 2721, 2721, 2721, 2721,
+ 2721, 2721, 2721, 2720, 2720, 2721, 2720, 2722,
+ 2721, 2723, 2723, 2724, 2719, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 2725, 2726, 2727, 2728, 2729, 2730, 2731, 2732,
+ 2733, 2734, 221, 221, 221, 221, 221, 221,
+ 2735, 2735, 2735, 2735, 2735, 2735, 2735, 2735,
+ 2735, 2735, 2735, 2735, 2735, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736,
+ 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736,
+ 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736,
+ 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736,
+ 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736,
+ 2736, 2736, 2736, 2737, 2738, 2737, 2738, 2738,
+ 2737, 2737, 2737, 2737, 2737, 2737, 2739, 2740,
+ 2741, 2742, 221, 221, 221, 221, 221, 221,
+ 2743, 2744, 2745, 2746, 2747, 2748, 2749, 2750,
+ 2751, 2752, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 2753, 2753, 2753, 2753, 2753, 2753, 2753, 2753,
+ 2753, 2753, 2753, 2753, 2753, 2753, 2753, 2753,
+ 2753, 2753, 2753, 2753, 2753, 2753, 2753, 2753,
+ 2753, 2753, 2754, 221, 221, 2755, 2755, 2755,
+ 2756, 2756, 2755, 2755, 2755, 2755, 2757, 2755,
+ 2755, 2755, 2755, 2758, 221, 221, 221, 221,
+ 2759, 2760, 2761, 2762, 2763, 2764, 2765, 2766,
+ 2767, 2768, 2769, 2769, 2770, 2770, 2770, 2771,
+ 2772, 2772, 2772, 2772, 2772, 2772, 2772, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 2773, 2773, 2773, 2773, 2773, 2773, 2773, 2773,
2773, 2773, 2773, 2773, 2773, 2773, 2773, 2773,
2773, 2773, 2773, 2773, 2773, 2773, 2773, 2773,
- 2773, 2773, 2773, 2774, 2774, 2775, 2775, 2776,
- 2776, 206, 206, 206, 206, 206, 206, 206,
-
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 2777, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 2778, 2778, 2778, 2778, 2778, 2778, 2778, 2778,
- 2778, 2778, 2778, 2778, 2778, 2778, 2778, 2778,
- 2778, 2778, 2778, 2778, 2778, 2779, 2779, 2779,
- 2779, 2779, 2779, 2779, 2779, 2780, 2780, 2780,
- 2780, 2779, 2779, 2779, 2779, 2779, 2779, 2779,
+ 2773, 2773, 2773, 2773, 2773, 2773, 2773, 2773,
+ 2773, 2773, 2773, 2773, 2773, 2773, 2773, 2773,
+ 2773, 2773, 2773, 2773, 2774, 2774, 2774, 2775,
+ 2775, 2775, 2775, 2775, 2775, 2775, 2775, 2775,
+ 2774, 2776, 2777, 2778, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
2779, 2779, 2779, 2779, 2779, 2779, 2779, 2779,
- 2779, 2779, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 2781,
-
- 2782, 2782, 2782, 2782, 2782, 2782, 2782, 2782,
- 2782, 2782, 2782, 2782, 2782, 2782, 2782, 2782,
- 2782, 2782, 2782, 2782, 2782, 2782, 2782, 2782,
- 2782, 2782, 2782, 2782, 2782, 2782, 2782, 2782,
- 2782, 2782, 2782, 2782, 2782, 2782, 2782, 2782,
- 2782, 2782, 2782, 2782, 2782, 2782, 2782, 2782,
- 2782, 2782, 2782, 2782, 2782, 2782, 2782, 2782,
- 2782, 2782, 2782, 2782, 2782, 2782, 2782, 2782,
- 2782, 2782, 2782, 2782, 2782, 2782, 2782, 2782,
- 2782, 2782, 2782, 2782, 2782, 2782, 2782, 2782,
- 2782, 2782, 2782, 2782, 2782, 2782, 2782, 2782,
- 2782, 2782, 2782, 2782, 2782, 2782, 2782, 2782,
- 2782, 2782, 2782, 2782, 2782, 2782, 2782, 2782,
- 2782, 2782, 2782, 2782, 2782, 2782, 2782, 2782,
- 2782, 2782, 2782, 2782, 2782, 2782, 2782, 2782,
- 2782, 2782, 2782, 2782, 2782, 2782, 2782, 2782,
- 2782, 2782, 2782, 2782, 2782, 2782, 2782, 2782,
- 2782, 2782, 2782, 2782, 2782, 2782, 2782, 2782,
- 2782, 2782, 2782, 2782, 2782, 2782, 2782, 2782,
- 2782, 2782, 2782, 2782, 2782, 2782, 2782, 2782,
- 2782, 2782, 2782, 2782, 2782, 2782, 2782, 2782,
- 2782, 2782, 2782, 2782, 2782, 2782, 2782, 2782,
- 2782, 2782, 2782, 2782, 2782, 2782, 2782, 2782,
- 2782, 2782, 2782, 2782, 2782, 2782, 2782, 2782,
- 2782, 2782, 2782, 2782, 2782, 2782, 2782, 2782,
- 2782, 2782, 2782, 2782, 2782, 2782, 2782, 2782,
- 2782, 2782, 2782, 2782, 2782, 2782, 2782, 2782,
- 2782, 2782, 2782, 2782, 2782, 2782, 2782, 2782,
- 2782, 2782, 2782, 2782, 2782, 2782, 2782, 2782,
- 2782, 2782, 2782, 2782, 2782, 2782, 2782, 2782,
- 2782, 2782, 2782, 2782, 2782, 2782, 2782, 2782,
- 2782, 2782, 2782, 2782, 2782, 2782, 2782, 2782,
-
- 2782, 2782, 2782, 2782, 2782, 2782, 2782, 2782,
- 2782, 2782, 2782, 2782, 2782, 2782, 2782, 2782,
- 2782, 2782, 2782, 2782, 2782, 2782, 2782, 2782,
- 2782, 2782, 2782, 2782, 2782, 2782, 2782, 2782,
- 2782, 2782, 2782, 2782, 2782, 2782, 2782, 2782,
- 2782, 2782, 2782, 2782, 2782, 2782, 2782, 2782,
- 2782, 2782, 2782, 2782, 2782, 2782, 2782, 2782,
- 2782, 2782, 2782, 2782, 2782, 2782, 2782, 2782,
- 2782, 2782, 2782, 2782, 2782, 2782, 2782, 2782,
- 2782, 2782, 2782, 2782, 2782, 2782, 2782, 2782,
- 2782, 2782, 2782, 2782, 2782, 2782, 2782, 2782,
- 2782, 2782, 2782, 2782, 2782, 2782, 2782, 2782,
- 2782, 2782, 2782, 2782, 2782, 2782, 2782, 2782,
- 2782, 2782, 2782, 2782, 2782, 2782, 2782, 2783,
- 2783, 2783, 2783, 2783, 2783, 2783, 2783, 2783,
- 2783, 2783, 2783, 2783, 2783, 2783, 2783, 2783,
- 2783, 2783, 2783, 2783, 2783, 2783, 2783, 2783,
- 2783, 2783, 2783, 2783, 2783, 2783, 2783, 2783,
- 2783, 2783, 2783, 2783, 2783, 2783, 2783, 2783,
- 2783, 2784, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
-
- 2785, 2785, 2785, 2785, 2785, 2785, 2785, 2785,
- 2785, 2785, 2785, 2785, 2785, 2785, 2785, 2785,
- 2785, 2785, 2785, 2785, 2785, 2785, 2785, 2785,
- 2785, 2785, 2785, 2785, 2785, 2785, 2785, 2785,
- 2785, 2785, 2785, 2785, 2785, 2785, 2785, 2785,
- 2785, 2785, 2785, 2785, 2785, 2785, 2785, 2785,
- 2785, 2785, 2785, 2785, 2785, 2785, 2785, 2785,
- 2785, 2785, 2785, 2785, 2785, 2785, 2785, 2785,
- 2785, 2785, 2785, 2785, 2785, 2785, 2785, 2785,
- 2785, 2785, 2785, 2785, 2785, 2785, 2785, 2785,
- 2785, 2785, 2785, 2785, 2785, 2785, 2785, 2785,
- 2785, 2785, 2785, 2785, 2785, 2785, 2785, 2785,
- 2785, 2785, 2785, 2786, 2786, 2786, 2786, 2786,
- 2786, 2786, 2786, 2786, 2786, 2786, 2786, 206,
- 2787, 2787, 2787, 2787, 2788, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 2784, 2784, 2784, 2784, 2784, 2784, 2784, 2784,
- 2784, 2784, 2784, 2784, 2784, 2784, 2784, 2784,
- 2784, 2784, 2784, 2784, 2784, 2784, 2784, 2784,
- 2784, 2784, 2784, 2784, 2784, 2784, 2784, 2784,
- 2784, 2784, 2784, 2784, 2784, 2784, 2784, 2784,
- 2784, 2784, 2784, 2784, 2784, 2784, 2784, 2784,
- 2784, 2784, 2784, 2784, 2784, 2784, 2784, 2784,
- 2784, 2784, 2784, 2784, 2784, 2784, 2784, 2784,
- 2784, 2784, 2784, 2784, 2784, 2784, 2784, 2784,
- 2784, 2784, 2784, 2784, 2784, 2784, 2784, 2784,
- 2784, 2784, 2784, 2784, 2784, 2784, 2784, 2784,
- 2784, 2784, 2784, 2784, 2784, 2784, 2784, 2784,
- 2784, 2784, 2784, 2784, 2784, 2784, 2784, 2784,
- 2784, 2784, 2784, 2784, 2784, 2784, 2784, 2784,
- 2784, 2784, 2784, 2784, 2784, 2784, 2784, 2784,
- 2784, 2784, 2784, 2784, 2784, 2784, 2784, 2784,
-
- 2784, 2784, 2784, 2784, 2784, 2784, 2784, 2784,
- 2784, 2784, 2784, 2784, 2784, 2784, 2784, 2784,
- 2784, 2784, 2784, 2784, 2784, 2784, 2784, 2784,
- 2784, 2784, 2784, 2784, 2784, 2784, 2784, 2784,
- 2784, 2784, 2784, 2784, 2784, 2784, 2784, 2784,
- 2784, 2784, 2784, 2784, 2784, 2784, 2784, 2784,
- 2784, 2784, 2784, 2784, 2784, 2784, 2784, 2784,
- 2784, 2784, 2784, 2784, 2784, 2784, 2784, 2784,
- 2784, 2784, 2784, 2784, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
-
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 2789, 2789, 2789, 2789, 2789, 2789, 2789, 2789,
- 2789, 2789, 2789, 2789, 2789, 2789, 2789, 2789,
- 2789, 2789, 2789, 2789, 2789, 2789, 2789, 2789,
- 2789, 2789, 2789, 2789, 2789, 2789, 2789, 2789,
- 2789, 2789, 2789, 2789, 2789, 2789, 2789, 2789,
- 2789, 2789, 2789, 2789, 2789, 2789, 2789, 2789,
- 2789, 2789, 2789, 2789, 2789, 2789, 2789, 2789,
- 2789, 2789, 2789, 2789, 2789, 2789, 2789, 2789,
- 2789, 2789, 2789, 2789, 2789, 2789, 2789, 2789,
- 2789, 2789, 2789, 2789, 2789, 2789, 2789, 2789,
- 2789, 2789, 2789, 2789, 2789, 2789, 2789, 2789,
- 2789, 2789, 2789, 2789, 2789, 2789, 2789, 2789,
- 2789, 2790, 2790, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
-
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
-
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2792, 2792, 2792, 2793, 2793, 2793, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2793, 2791, 2791, 2791, 2792, 2793,
- 2792, 2793, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
-
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2792, 2793, 2793, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
-
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
- 2791, 2791, 2791, 2791, 2791, 2791, 2791, 206,
- 2794, 2794, 2794, 2794, 2794, 2794, 2794, 2795,
- 2796, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
-
- 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797,
- 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797,
- 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797,
- 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797,
- 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797,
- 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797,
- 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797,
- 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797,
- 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797,
- 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797,
- 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797,
- 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797,
- 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797,
- 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797,
- 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797,
- 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797,
- 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797,
- 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797,
- 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797,
- 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797,
- 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797,
- 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797,
- 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797,
- 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797,
- 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797,
- 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797,
- 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797,
- 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797,
- 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797,
- 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797,
- 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797,
- 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797,
-
- 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797,
- 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797,
- 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797,
- 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797,
- 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797,
- 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797,
- 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797,
- 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797,
- 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797,
- 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797,
- 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797,
- 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797,
- 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797,
- 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797,
- 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797,
- 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797,
- 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797,
- 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797,
- 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797,
- 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797,
- 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797,
- 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797,
- 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797,
- 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797,
- 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797,
- 2797, 2797, 2797, 2797, 2797, 2797, 2798, 2799,
- 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797,
- 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797,
- 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797,
- 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797,
- 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797,
- 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797,
-
- 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797,
- 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797,
- 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797,
- 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797,
- 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797,
- 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797,
- 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797,
- 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797,
- 2797, 2797, 2797, 2797, 2797, 2797, 2797, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
-
- 2800, 2800, 2800, 2800, 2800, 2800, 2800, 2800,
- 2800, 2800, 2800, 2800, 2800, 2800, 2800, 2800,
- 2800, 2800, 2800, 2800, 2800, 2800, 2800, 2800,
- 2800, 2800, 2800, 2800, 2800, 2800, 2800, 2800,
- 2800, 2800, 2800, 2800, 2800, 2800, 2800, 2800,
- 2800, 2800, 2800, 2800, 2800, 2800, 2800, 2800,
- 2800, 2800, 2800, 2800, 2800, 2800, 2800, 2800,
- 2800, 2800, 2800, 2800, 2800, 2800, 2800, 2800,
- 2800, 2800, 2800, 2800, 2800, 2800, 2800, 2800,
- 2800, 2800, 2800, 2800, 2800, 2800, 2800, 2800,
- 2800, 2800, 2800, 2800, 2800, 2800, 2800, 2800,
- 2800, 2800, 2800, 2800, 2800, 2800, 2800, 2800,
- 2800, 2800, 2800, 2800, 2800, 2800, 2800, 2800,
- 2800, 2800, 2800, 2800, 2800, 2800, 2800, 2800,
- 2800, 2800, 2800, 2800, 2800, 2800, 2800, 2800,
- 2800, 2800, 2800, 2800, 2800, 2800, 2800, 2800,
- 2800, 2800, 2800, 2800, 2800, 2800, 2800, 2800,
- 2800, 2800, 2800, 2800, 2800, 2800, 2800, 2800,
- 2800, 2800, 2800, 2800, 2800, 2800, 2800, 2800,
- 2800, 2800, 2800, 2800, 2800, 2800, 2800, 2800,
- 2800, 2800, 2800, 2800, 2800, 2800, 2800, 2800,
- 2800, 2800, 2800, 2800, 2800, 2800, 2800, 2800,
- 2800, 2800, 2800, 2800, 2800, 2800, 2800, 2800,
- 2800, 2800, 2800, 2800, 2800, 2800, 2800, 2800,
- 2800, 2800, 2800, 2800, 2800, 2800, 2800, 2800,
- 2800, 2800, 2800, 2800, 2800, 2800, 2800, 2800,
- 2800, 2800, 2800, 2800, 2800, 2800, 2800, 2800,
- 2800, 2800, 2800, 2800, 2800, 2800, 2800, 2800,
- 2800, 2800, 2800, 2800, 2800, 2800, 2800, 2800,
- 2800, 2800, 2800, 2800, 2800, 2800, 2800, 2800,
- 2800, 2800, 2800, 2800, 2800, 2800, 2800, 2800,
- 2800, 2800, 2800, 2800, 2800, 2800, 2800, 2800,
-
- 2800, 2800, 2800, 2800, 2800, 2800, 2800, 2800,
- 2800, 2800, 2800, 2800, 2800, 2800, 2800, 2800,
- 2800, 2800, 2800, 2800, 2800, 2800, 2800, 2800,
- 2800, 2800, 2800, 2800, 2800, 2800, 2800, 2800,
- 2800, 2800, 2800, 2800, 2800, 2800, 2800, 2800,
- 2800, 2800, 2800, 2800, 2800, 2800, 2800, 2800,
- 2800, 2800, 2800, 2800, 2800, 2800, 2800, 2800,
- 2800, 206, 206, 206, 206, 206, 206, 206,
- 2801, 2801, 2801, 2801, 2801, 2801, 2801, 2801,
- 2801, 2801, 2801, 2801, 2801, 2801, 2801, 2801,
- 2801, 2801, 2801, 2801, 2801, 2801, 2801, 2801,
- 2801, 2801, 2801, 2801, 2801, 2801, 2801, 206,
- 2802, 2803, 2804, 2805, 2806, 2807, 2808, 2809,
- 2810, 2811, 206, 206, 206, 206, 2812, 2812,
- 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
- 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
- 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
- 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
- 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
- 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
- 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
- 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
- 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
- 2813, 2813, 2813, 2813, 2813, 2813, 2813, 206,
- 2814, 2815, 2816, 2817, 2818, 2819, 2820, 2821,
- 2822, 2823, 206, 206, 206, 206, 206, 206,
- 2824, 2824, 2824, 2824, 2824, 2824, 2824, 2824,
- 2824, 2824, 2824, 2824, 2824, 2824, 2824, 2824,
- 2824, 2824, 2824, 2824, 2824, 2824, 2824, 2824,
- 2824, 2824, 2824, 2824, 2824, 2824, 206, 206,
- 2825, 2825, 2825, 2825, 2825, 2826, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
-
- 2827, 2827, 2827, 2827, 2827, 2827, 2827, 2827,
- 2827, 2827, 2827, 2827, 2827, 2827, 2827, 2827,
- 2827, 2827, 2827, 2827, 2827, 2827, 2827, 2827,
- 2827, 2827, 2827, 2827, 2827, 2827, 2827, 2827,
- 2827, 2827, 2827, 2827, 2827, 2827, 2827, 2827,
- 2827, 2827, 2827, 2827, 2827, 2827, 2827, 2827,
- 2828, 2828, 2828, 2828, 2828, 2828, 2828, 2829,
- 2829, 2830, 2831, 2831, 2832, 2832, 2832, 2832,
- 2833, 2833, 2833, 2833, 2829, 2832, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 2834, 2835, 2836, 2837, 2838, 2839, 2840, 2841,
- 2842, 2843, 206, 2844, 2844, 2844, 2844, 2844,
- 2844, 2844, 206, 2827, 2827, 2827, 2827, 2827,
- 2827, 2827, 2827, 2827, 2827, 2827, 2827, 2827,
- 2827, 2827, 2827, 2827, 2827, 2827, 2827, 2827,
- 206, 206, 206, 206, 206, 2827, 2827, 2827,
- 2827, 2827, 2827, 2827, 2827, 2827, 2827, 2827,
- 2827, 2827, 2827, 2827, 2827, 2827, 2827, 2827,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
-
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 2845, 2845, 2845, 2845, 2845, 2845, 2845, 2845,
- 2845, 2845, 2845, 2845, 2845, 2845, 2845, 2845,
- 2845, 2845, 2845, 2845, 2845, 2845, 2845, 2845,
- 2845, 2845, 2845, 2845, 2845, 2845, 2845, 2845,
- 2846, 2846, 2846, 2846, 2846, 2846, 2846, 2846,
- 2846, 2846, 2846, 2846, 2846, 2846, 2846, 2846,
- 2846, 2846, 2846, 2846, 2846, 2846, 2846, 2846,
- 2846, 2846, 2846, 2846, 2846, 2846, 2846, 2846,
- 2847, 2847, 2847, 2847, 2847, 2847, 2847, 2847,
- 2847, 2847, 2847, 2847, 2847, 2847, 2847, 2847,
- 2847, 2847, 2847, 2847, 2847, 2847, 2847, 2848,
- 2849, 2850, 2850, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
-
- 2851, 2851, 2851, 2851, 2851, 2851, 2851, 2851,
- 2851, 2851, 2851, 2851, 2851, 2851, 2851, 2851,
- 2851, 2851, 2851, 2851, 2851, 2851, 2851, 2851,
- 2851, 2851, 2851, 2851, 2851, 2851, 2851, 2851,
- 2851, 2851, 2851, 2851, 2851, 2851, 2851, 2851,
- 2851, 2851, 2851, 2851, 2851, 2851, 2851, 2851,
- 2851, 2851, 2851, 2851, 2851, 2851, 2851, 2851,
- 2851, 2851, 2851, 2851, 2851, 2851, 2851, 2851,
- 2851, 2851, 2851, 2851, 2851, 2852, 2852, 2852,
- 2852, 2852, 2852, 206, 206, 206, 206, 2853,
- 2851, 2854, 2854, 2854, 2854, 2854, 2854, 2854,
- 2854, 2854, 2854, 2854, 2854, 2854, 2854, 2854,
- 2854, 2854, 2854, 2854, 2854, 2854, 2854, 2854,
- 2854, 2854, 2854, 2854, 2854, 2854, 2854, 2854,
- 2854, 2854, 2854, 2854, 2854, 2854, 2854, 2854,
- 2854, 2854, 2854, 2854, 2854, 2854, 2854, 2855,
- 2855, 2855, 2855, 2855, 2855, 2855, 2855, 2855,
- 206, 206, 206, 206, 206, 206, 206, 2856,
- 2856, 2856, 2856, 2857, 2857, 2857, 2857, 2857,
- 2857, 2857, 2857, 2857, 2857, 2857, 2857, 2857,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 2858, 2859, 2860, 2861, 2862, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 2863, 2863, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
-
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
-
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2865, 2865, 2865,
- 2865, 2865, 2866, 2866, 2866, 2866, 2866, 2866,
- 206, 206, 206, 206, 206, 206, 206, 206,
-
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
+ 2779, 2779, 2779, 2779, 2779, 2779, 2779, 2779,
+ 2779, 2779, 2779, 2779, 2779, 2779, 2779, 2779,
+ 2779, 2779, 2779, 2779, 2779, 2779, 2779, 2779,
+ 2780, 2780, 2780, 2780, 2780, 2780, 2780, 2780,
+ 2780, 2780, 2780, 2780, 2780, 2780, 2780, 2780,
+ 2780, 2780, 2780, 2780, 2780, 2780, 2780, 2780,
+ 2780, 2780, 2780, 2780, 2780, 2780, 2780, 2780,
+ 2781, 2782, 2783, 2784, 2785, 2786, 2787, 2788,
+ 2789, 2790, 2791, 2791, 2791, 2791, 2791, 2791,
+ 2791, 2791, 2791, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 2792,
+
+ 2793, 2793, 2793, 2793, 2793, 2793, 2793, 221,
+ 221, 2793, 221, 221, 2793, 2793, 2793, 2793,
+ 2793, 2793, 2793, 2793, 221, 2793, 2793, 221,
+ 2793, 2793, 2793, 2793, 2793, 2793, 2793, 2793,
+ 2793, 2793, 2793, 2793, 2793, 2793, 2793, 2793,
+ 2793, 2793, 2793, 2793, 2793, 2793, 2793, 2793,
+ 2794, 2795, 2795, 2795, 2795, 2795, 221, 2795,
+ 2796, 221, 221, 2797, 2797, 2798, 2799, 2800,
+ 2795, 2800, 2795, 2801, 2802, 2803, 2802, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 2804, 2805, 2806, 2807, 2808, 2809, 2810, 2811,
+ 2812, 2813, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 2814, 2814, 2814, 2814, 2814, 2814, 2814, 2814,
+ 221, 221, 2814, 2814, 2814, 2814, 2814, 2814,
+ 2814, 2814, 2814, 2814, 2814, 2814, 2814, 2814,
+ 2814, 2814, 2814, 2814, 2814, 2814, 2814, 2814,
+ 2814, 2814, 2814, 2814, 2814, 2814, 2814, 2814,
+ 2814, 2814, 2814, 2814, 2814, 2814, 2814, 2814,
+ 2814, 2815, 2815, 2815, 2816, 2816, 2816, 2816,
+ 221, 221, 2816, 2816, 2815, 2815, 2815, 2815,
+ 2817, 2814, 2818, 2814, 2815, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 2819, 2820, 2820, 2820, 2820, 2820, 2820, 2821,
+ 2821, 2820, 2820, 2819, 2819, 2819, 2819, 2819,
+ 2819, 2819, 2819, 2819, 2819, 2819, 2819, 2819,
+ 2819, 2819, 2819, 2819, 2819, 2819, 2819, 2819,
+ 2819, 2819, 2819, 2819, 2819, 2819, 2819, 2819,
+ 2819, 2819, 2819, 2819, 2819, 2819, 2819, 2819,
+ 2819, 2819, 2819, 2820, 2822, 2820, 2820, 2820,
+ 2820, 2823, 2824, 2820, 2820, 2820, 2820, 2825,
+ 2826, 2827, 2828, 2828, 2827, 2825, 2826, 2822,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 2829, 2830, 2830, 2830, 2830, 2830, 2830, 2831,
+ 2831, 2830, 2830, 2830, 2829, 2829, 2829, 2829,
+ 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829,
+ 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829,
+ 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829,
+ 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829,
+ 2829, 2829, 2829, 2829, 2832, 2832, 2833, 2833,
+ 2833, 2833, 2830, 2830, 2830, 2830, 2830, 2830,
+ 2830, 2830, 2830, 2830, 2830, 2830, 2830, 2831,
+ 2830, 2834, 2835, 2836, 2836, 2837, 2838, 2838,
+ 2838, 2835, 2835, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 2839, 2839, 2839, 2839, 2839, 2839, 2839, 2839,
+ 2839, 2839, 2839, 2839, 2839, 2839, 2839, 2839,
+ 2840, 2840, 2840, 2840, 2840, 2840, 2840, 2840,
+ 2840, 2840, 2840, 2840, 2840, 2840, 2840, 2840,
+ 2840, 2840, 2840, 2840, 2840, 2840, 2840, 2840,
+ 2840, 2840, 2840, 2840, 2840, 2840, 2840, 2840,
+ 2840, 2840, 2840, 2840, 2840, 2840, 2840, 2840,
+ 2840, 2840, 2840, 2840, 2840, 2840, 2840, 2840,
+ 2840, 2840, 2840, 2840, 2840, 2840, 2840, 2840,
+ 2840, 221, 221, 221, 221, 221, 221, 221,
+
+ 2841, 2841, 2841, 2841, 2841, 2841, 2841, 2841,
+ 2841, 2841, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 2842, 2842, 2842, 2842, 2842, 2842, 2842, 2842,
+ 2842, 221, 2842, 2842, 2842, 2842, 2842, 2842,
+ 2842, 2842, 2842, 2842, 2842, 2842, 2842, 2842,
+ 2842, 2842, 2842, 2842, 2842, 2842, 2842, 2842,
+ 2842, 2842, 2842, 2842, 2842, 2842, 2842, 2842,
+ 2842, 2842, 2842, 2842, 2842, 2842, 2842, 2843,
+ 2844, 2844, 2844, 2844, 2844, 2844, 2844, 221,
+ 2844, 2844, 2844, 2844, 2844, 2844, 2843, 2845,
+ 2842, 2846, 2846, 2847, 2847, 2847, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 2848, 2849, 2850, 2851, 2852, 2853, 2854, 2855,
+ 2856, 2857, 2858, 2858, 2858, 2858, 2858, 2858,
+ 2858, 2858, 2858, 2858, 2858, 2858, 2858, 2858,
+ 2858, 2858, 2858, 2858, 2858, 221, 221, 221,
+ 2859, 2860, 2861, 2861, 2861, 2861, 2861, 2861,
+ 2861, 2861, 2861, 2861, 2861, 2861, 2861, 2861,
+ 2861, 2861, 2861, 2861, 2861, 2861, 2861, 2861,
+ 2861, 2861, 2861, 2861, 2861, 2861, 2861, 2861,
+ 221, 221, 2862, 2862, 2862, 2862, 2862, 2862,
+ 2862, 2862, 2862, 2862, 2862, 2862, 2862, 2862,
+ 2862, 2862, 2862, 2862, 2862, 2862, 2862, 2862,
+ 221, 2863, 2862, 2862, 2862, 2862, 2862, 2862,
+ 2862, 2863, 2862, 2862, 2863, 2862, 2862, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 2864, 2864, 2864, 2864, 2864, 2864, 2864, 221,
+ 2864, 2864, 221, 2864, 2864, 2864, 2864, 2864,
2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,
- 2864, 2864, 2864, 2867, 2867, 2867, 2867, 2867,
- 2867, 2867, 2867, 2867, 2867, 2867, 2867, 2867,
-
- 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868,
- 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868,
- 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868,
- 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868,
- 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868,
- 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868,
- 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868,
- 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868,
- 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868,
- 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868,
- 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868,
- 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868,
- 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868,
- 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868,
- 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868,
- 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868,
- 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868,
- 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868,
- 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868,
- 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868,
- 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868,
- 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868,
- 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868,
- 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868,
- 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868,
- 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868,
- 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868,
- 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868,
- 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868,
- 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868,
- 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868,
- 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868,
-
- 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868,
- 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868,
- 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868,
- 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868,
- 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868,
- 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868,
- 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868,
- 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868,
- 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868,
- 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868,
- 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868,
- 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868,
- 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868,
- 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868,
- 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868,
- 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868,
- 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868,
- 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868,
- 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868,
- 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868,
- 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868,
- 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868,
- 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868,
- 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868,
- 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868,
- 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868,
- 2868, 2868, 2868, 2868, 2868, 2868, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
-
- 2867, 2867, 2867, 2867, 2867, 2867, 2867, 2867,
- 2867, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
-
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 2869, 2869, 2869, 2869, 206, 2869, 2869, 2869,
- 2869, 2869, 2869, 2869, 206, 2869, 2869, 206,
-
- 2870, 2871, 2872, 2872, 2872, 2872, 2872, 2872,
- 2872, 2872, 2872, 2872, 2872, 2872, 2872, 2872,
- 2872, 2872, 2872, 2872, 2872, 2872, 2872, 2872,
- 2872, 2872, 2872, 2872, 2872, 2872, 2872, 2872,
- 2872, 2872, 2872, 2872, 2872, 2872, 2872, 2872,
- 2872, 2872, 2872, 2872, 2872, 2872, 2872, 2872,
- 2872, 2872, 2872, 2872, 2872, 2872, 2872, 2872,
- 2872, 2872, 2872, 2872, 2872, 2872, 2872, 2872,
- 2872, 2872, 2872, 2872, 2872, 2872, 2872, 2872,
- 2872, 2872, 2872, 2872, 2872, 2872, 2872, 2872,
- 2872, 2872, 2872, 2872, 2872, 2872, 2872, 2872,
- 2872, 2872, 2872, 2872, 2872, 2872, 2872, 2872,
- 2872, 2872, 2872, 2872, 2872, 2872, 2872, 2872,
- 2872, 2872, 2872, 2872, 2872, 2872, 2872, 2872,
- 2872, 2872, 2872, 2872, 2872, 2872, 2872, 2872,
- 2872, 2872, 2872, 2872, 2872, 2872, 2872, 2872,
- 2872, 2872, 2872, 2872, 2872, 2872, 2872, 2872,
- 2872, 2872, 2872, 2872, 2872, 2872, 2872, 2872,
- 2872, 2872, 2872, 2872, 2872, 2872, 2872, 2872,
- 2872, 2872, 2872, 2872, 2872, 2872, 2872, 2872,
- 2872, 2872, 2872, 2872, 2872, 2872, 2872, 2872,
- 2872, 2872, 2872, 2872, 2872, 2872, 2872, 2872,
- 2872, 2872, 2872, 2872, 2872, 2872, 2872, 2872,
- 2872, 2872, 2872, 2872, 2872, 2872, 2872, 2872,
- 2872, 2872, 2872, 2872, 2872, 2872, 2872, 2872,
- 2872, 2872, 2872, 2872, 2872, 2872, 2872, 2872,
- 2872, 2872, 2872, 2872, 2872, 2872, 2872, 2872,
- 2872, 2872, 2872, 2872, 2872, 2872, 2872, 2872,
- 2872, 2872, 2872, 2872, 2872, 2872, 2872, 2872,
- 2872, 2872, 2872, 2872, 2872, 2872, 2872, 2872,
- 2872, 2872, 2872, 2872, 2872, 2872, 2872, 2872,
- 2872, 2872, 2872, 2872, 2872, 2872, 2872, 2872,
-
- 2872, 2872, 2872, 2872, 2872, 2872, 2872, 2872,
- 2872, 2872, 2872, 2872, 2872, 2872, 2872, 2872,
- 2872, 2872, 2872, 2872, 2872, 2872, 2872, 2872,
- 2872, 2872, 2872, 2872, 2872, 2872, 2872, 2873,
- 2874, 2874, 2874, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 2875, 2875, 2875, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 2876, 2876, 2876, 2876,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 2877, 2877, 2877, 2877, 2877, 2877, 2877, 2877,
- 2877, 2877, 2877, 2877, 2877, 2877, 2877, 2877,
- 2877, 2877, 2877, 2877, 2877, 2877, 2877, 2877,
- 2877, 2877, 2877, 2877, 2877, 2877, 2877, 2877,
- 2877, 2877, 2877, 2877, 2877, 2877, 2877, 2877,
- 2877, 2877, 2877, 2877, 2877, 2877, 2877, 2877,
- 2877, 2877, 2877, 2877, 2877, 2877, 2877, 2877,
- 2877, 2877, 2877, 2877, 2877, 2877, 2877, 2877,
- 2877, 2877, 2877, 2877, 2877, 2877, 2877, 2877,
- 2877, 2877, 2877, 2877, 2877, 2877, 2877, 2877,
- 2877, 2877, 2877, 2877, 2877, 2877, 2877, 2877,
- 2877, 2877, 2877, 2877, 2877, 2877, 2877, 2877,
- 2877, 2877, 2877, 2877, 2877, 2877, 2877, 2877,
- 2877, 2877, 2877, 2877, 2877, 2877, 2877, 2877,
- 2877, 2877, 2877, 2877, 2877, 2877, 2877, 2877,
- 2877, 2877, 2877, 2877, 2877, 2877, 2877, 2877,
- 2877, 2877, 2877, 2877, 2877, 2877, 2877, 2877,
- 2877, 2877, 2877, 2877, 2877, 2877, 2877, 2877,
-
- 2877, 2877, 2877, 2877, 2877, 2877, 2877, 2877,
- 2877, 2877, 2877, 2877, 2877, 2877, 2877, 2877,
- 2877, 2877, 2877, 2877, 2877, 2877, 2877, 2877,
- 2877, 2877, 2877, 2877, 2877, 2877, 2877, 2877,
- 2877, 2877, 2877, 2877, 2877, 2877, 2877, 2877,
- 2877, 2877, 2877, 2877, 2877, 2877, 2877, 2877,
- 2877, 2877, 2877, 2877, 2877, 2877, 2877, 2877,
- 2877, 2877, 2877, 2877, 2877, 2877, 2877, 2877,
- 2877, 2877, 2877, 2877, 2877, 2877, 2877, 2877,
- 2877, 2877, 2877, 2877, 2877, 2877, 2877, 2877,
- 2877, 2877, 2877, 2877, 2877, 2877, 2877, 2877,
- 2877, 2877, 2877, 2877, 2877, 2877, 2877, 2877,
- 2877, 2877, 2877, 2877, 2877, 2877, 2877, 2877,
- 2877, 2877, 2877, 2877, 2877, 2877, 2877, 2877,
- 2877, 2877, 2877, 2877, 2877, 2877, 2877, 2877,
- 2877, 2877, 2877, 2877, 2877, 2877, 2877, 2877,
- 2877, 2877, 2877, 2877, 2877, 2877, 2877, 2877,
- 2877, 2877, 2877, 2877, 2877, 2877, 2877, 2877,
- 2877, 2877, 2877, 2877, 2877, 2877, 2877, 2877,
- 2877, 2877, 2877, 2877, 2877, 2877, 2877, 2877,
- 2877, 2877, 2877, 2877, 2877, 2877, 2877, 2877,
- 2877, 2877, 2877, 2877, 2877, 2877, 2877, 2877,
- 2877, 2877, 2877, 2877, 2877, 2877, 2877, 2877,
- 2877, 2877, 2877, 2877, 2877, 2877, 2877, 2877,
- 2877, 2877, 2877, 2877, 2877, 2877, 2877, 2877,
- 2877, 2877, 2877, 2877, 2877, 2877, 2877, 2877,
- 2877, 2877, 2877, 2877, 2877, 2877, 2877, 2877,
- 2877, 2877, 2877, 2877, 2877, 2877, 2877, 2877,
- 2877, 2877, 2877, 2877, 2877, 2877, 2877, 2877,
- 2877, 2877, 2877, 2877, 2877, 2877, 2877, 2877,
- 2877, 2877, 2877, 2877, 2877, 2877, 2877, 2877,
- 2877, 2877, 2877, 2877, 206, 206, 206, 206,
-
- 2878, 2878, 2878, 2878, 2878, 2878, 2878, 2878,
- 2878, 2878, 2878, 2878, 2878, 2878, 2878, 2878,
- 2878, 2878, 2878, 2878, 2878, 2878, 2878, 2878,
- 2878, 2878, 2878, 2878, 2878, 2878, 2878, 2878,
- 2878, 2878, 2878, 2878, 2878, 2878, 2878, 2878,
- 2878, 2878, 2878, 2878, 2878, 2878, 2878, 2878,
- 2878, 2878, 2878, 2878, 2878, 2878, 2878, 2878,
- 2878, 2878, 2878, 2878, 2878, 2878, 2878, 2878,
- 2878, 2878, 2878, 2878, 2878, 2878, 2878, 2878,
- 2878, 2878, 2878, 2878, 2878, 2878, 2878, 2878,
- 2878, 2878, 2878, 2878, 2878, 2878, 2878, 2878,
- 2878, 2878, 2878, 2878, 2878, 2878, 2878, 2878,
- 2878, 2878, 2878, 2878, 2878, 2878, 2878, 2878,
- 2878, 2878, 2878, 206, 206, 206, 206, 206,
- 2878, 2878, 2878, 2878, 2878, 2878, 2878, 2878,
- 2878, 2878, 2878, 2878, 2878, 206, 206, 206,
- 2878, 2878, 2878, 2878, 2878, 2878, 2878, 2878,
- 2878, 206, 206, 206, 206, 206, 206, 206,
- 2878, 2878, 2878, 2878, 2878, 2878, 2878, 2878,
- 2878, 2878, 206, 206, 2879, 2880, 2881, 2882,
- 2883, 2883, 2883, 2883, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
-
- 2884, 2884, 2884, 2884, 2884, 2884, 2884, 2884,
- 2884, 2884, 2884, 2884, 2884, 2884, 2884, 2884,
- 2884, 2884, 2884, 2884, 2884, 2884, 2884, 2884,
- 2884, 2884, 2884, 2884, 2884, 2884, 2884, 2884,
- 2884, 2884, 2884, 2884, 2884, 2884, 2884, 2884,
- 2884, 2884, 2884, 2884, 2884, 2884, 206, 206,
- 2884, 2884, 2884, 2884, 2884, 2884, 2884, 2884,
- 2884, 2884, 2884, 2884, 2884, 2884, 2884, 2884,
- 2884, 2884, 2884, 2884, 2884, 2884, 2884, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 2885, 2885, 2885, 2885, 2885, 2885, 2885, 2885,
- 2885, 2885, 2885, 2885, 2885, 2885, 2885, 2885,
- 2885, 2885, 2885, 2885, 2885, 2885, 2885, 2885,
- 2885, 2885, 2885, 2885, 2885, 2885, 2885, 2885,
- 2885, 2885, 2885, 2885, 2885, 2885, 2885, 2885,
- 2885, 2885, 2885, 2885, 2885, 2885, 2885, 2885,
- 2885, 2885, 2885, 2885, 2885, 2885, 2885, 2885,
- 2885, 2885, 2885, 2885, 2885, 2885, 2885, 2885,
- 2885, 2885, 2885, 2885, 2885, 2885, 2885, 2885,
- 2885, 2885, 2885, 2885, 2885, 2885, 2885, 2885,
- 2885, 2885, 2885, 2885, 2885, 2885, 2885, 2885,
- 2885, 2885, 2885, 2885, 2885, 2885, 2885, 2885,
- 2885, 2885, 2885, 2885, 2885, 2885, 2885, 2885,
- 2885, 2885, 2885, 2885, 2885, 2885, 2885, 2885,
- 2885, 2885, 2885, 2885, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
-
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
-
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 206,
- 206, 1502, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2887, 2887,
- 2887, 2887, 2887, 2887, 2887, 2888, 2889, 2890,
- 2890, 2890, 2886, 2886, 2886, 2891, 2888, 2888,
- 2888, 2888, 2888, 2892, 2892, 2892, 2892, 2892,
- 2892, 2892, 2892, 2893, 2893, 2893, 2893, 2893,
- 2893, 2893, 2893, 2886, 2886, 2894, 2894, 2894,
- 2894, 2894, 2893, 2893, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2894, 2894, 2894, 2894, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2887, 2887, 2887, 2887, 2887,
- 2887, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2886, 2886, 2886, 2886, 2886, 2895, 2895,
- 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895,
- 2895, 2896, 2896, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
-
- 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238,
- 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238,
- 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238,
- 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238,
- 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238,
- 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238,
- 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238,
- 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238,
- 2238, 2238, 2897, 2897, 2897, 2238, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 2898, 2898, 2898, 2898, 2898, 2898, 2898, 2898,
- 2898, 2898, 2898, 2898, 2898, 2898, 2898, 2898,
- 2898, 2898, 2898, 2898, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
-
- 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553,
- 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553,
- 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553,
- 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553,
- 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553,
- 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553,
- 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553,
- 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553,
- 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553,
- 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553,
- 1553, 1553, 1553, 1553, 1553, 1553, 1553, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 2899, 2899, 2899, 2899, 2899, 2899, 2899, 2899,
- 2899, 2899, 2899, 2899, 2899, 2899, 2899, 2899,
- 2899, 2899, 2898, 2898, 2898, 2898, 2898, 2898,
- 2898, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
-
- 2900, 2900, 2900, 2900, 2900, 2900, 2900, 2900,
- 2900, 2900, 2900, 2900, 2900, 2900, 2900, 2900,
- 2900, 2900, 2900, 2900, 2900, 2900, 2900, 2900,
- 2900, 2900, 2901, 2901, 2901, 2901, 2901, 2901,
+ 2864, 2865, 2865, 2865, 2865, 2865, 2865, 221,
+ 221, 221, 2865, 221, 2865, 2865, 221, 2865,
+ 2865, 2865, 2866, 2865, 2867, 2867, 2868, 2865,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 2869, 2870, 2871, 2872, 2873, 2874, 2875, 2876,
+ 2877, 2878, 221, 221, 221, 221, 221, 221,
+ 2879, 2879, 2879, 2879, 2879, 2879, 221, 2879,
+ 2879, 221, 2879, 2879, 2879, 2879, 2879, 2879,
+ 2879, 2879, 2879, 2879, 2879, 2879, 2879, 2879,
+ 2879, 2879, 2879, 2879, 2879, 2879, 2879, 2879,
+ 2879, 2879, 2879, 2879, 2879, 2879, 2879, 2879,
+ 2879, 2879, 2880, 2880, 2880, 2880, 2880, 221,
+ 2881, 2881, 221, 2880, 2880, 2881, 2880, 2882,
+ 2879, 221, 221, 221, 221, 221, 221, 221,
+ 2883, 2884, 2885, 2886, 2887, 2888, 2889, 2890,
+ 2891, 2892, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 2893, 2893, 2893, 2893, 2893, 2893, 2893, 2893,
+ 2893, 2893, 2893, 2893, 2893, 2893, 2893, 2893,
+ 2893, 2893, 2894, 2895, 2895, 2896, 2896, 2897,
+ 2897, 221, 221, 221, 221, 221, 221, 221,
+
+ 2898, 2898, 2899, 2900, 2901, 2901, 2901, 2901,
2901, 2901, 2901, 2901, 2901, 2901, 2901, 2901,
+ 2901, 221, 2901, 2901, 2901, 2901, 2901, 2901,
2901, 2901, 2901, 2901, 2901, 2901, 2901, 2901,
- 2901, 2901, 2901, 2901, 2900, 2900, 2900, 2900,
- 2900, 2900, 2900, 2900, 2900, 2900, 2900, 2900,
- 2900, 2900, 2900, 2900, 2900, 2900, 2900, 2900,
- 2900, 2900, 2900, 2900, 2900, 2900, 2901, 2901,
- 2901, 2901, 2901, 2901, 2901, 206, 2901, 2901,
2901, 2901, 2901, 2901, 2901, 2901, 2901, 2901,
2901, 2901, 2901, 2901, 2901, 2901, 2901, 2901,
- 2900, 2900, 2900, 2900, 2900, 2900, 2900, 2900,
- 2900, 2900, 2900, 2900, 2900, 2900, 2900, 2900,
- 2900, 2900, 2900, 2900, 2900, 2900, 2900, 2900,
- 2900, 2900, 2901, 2901, 2901, 2901, 2901, 2901,
- 2901, 2901, 2901, 2901, 2901, 2901, 2901, 2901,
- 2901, 2901, 2901, 2901, 2901, 2901, 2901, 2901,
- 2901, 2901, 2901, 2901, 2900, 206, 2900, 2900,
- 206, 206, 2900, 206, 206, 2900, 2900, 206,
- 206, 2900, 2900, 2900, 2900, 206, 2900, 2900,
- 2900, 2900, 2900, 2900, 2900, 2900, 2901, 2901,
- 2901, 2901, 206, 2901, 206, 2901, 2901, 2901,
- 2901, 2902, 2901, 2901, 206, 2901, 2901, 2901,
- 2901, 2901, 2901, 2901, 2901, 2901, 2901, 2901,
- 2900, 2900, 2900, 2900, 2900, 2900, 2900, 2900,
- 2900, 2900, 2900, 2900, 2900, 2900, 2900, 2900,
- 2900, 2900, 2900, 2900, 2900, 2900, 2900, 2900,
- 2900, 2900, 2901, 2901, 2901, 2901, 2901, 2901,
- 2901, 2901, 2901, 2901, 2901, 2901, 2901, 2901,
- 2901, 2901, 2901, 2901, 2901, 2901, 2901, 2901,
-
- 2901, 2901, 2901, 2901, 2900, 2900, 206, 2900,
- 2900, 2900, 2900, 206, 206, 2900, 2900, 2900,
- 2900, 2900, 2900, 2900, 2900, 206, 2900, 2900,
- 2900, 2900, 2900, 2900, 2900, 206, 2901, 2901,
- 2901, 2901, 2901, 2901, 2901, 2901, 2901, 2901,
- 2901, 2901, 2901, 2901, 2901, 2901, 2901, 2901,
- 2901, 2901, 2901, 2901, 2901, 2901, 2901, 2901,
- 2900, 2900, 206, 2900, 2900, 2900, 2900, 206,
- 2900, 2900, 2900, 2900, 2900, 206, 2900, 206,
- 206, 206, 2900, 2900, 2900, 2900, 2900, 2900,
- 2900, 206, 2901, 2901, 2901, 2901, 2901, 2901,
- 2901, 2901, 2901, 2901, 2901, 2901, 2901, 2901,
- 2901, 2901, 2901, 2901, 2901, 2901, 2901, 2901,
- 2901, 2901, 2901, 2901, 2900, 2900, 2900, 2900,
- 2900, 2900, 2900, 2900, 2900, 2900, 2900, 2900,
- 2900, 2900, 2900, 2900, 2900, 2900, 2900, 2900,
- 2900, 2900, 2900, 2900, 2900, 2900, 2901, 2901,
- 2901, 2901, 2901, 2901, 2901, 2901, 2901, 2901,
- 2901, 2901, 2901, 2901, 2901, 2901, 2901, 2901,
- 2901, 2901, 2901, 2901, 2901, 2901, 2901, 2901,
- 2900, 2900, 2900, 2900, 2900, 2900, 2900, 2900,
- 2900, 2900, 2900, 2900, 2900, 2900, 2900, 2900,
- 2900, 2900, 2900, 2900, 2900, 2900, 2900, 2900,
- 2900, 2900, 2901, 2901, 2901, 2901, 2901, 2901,
- 2901, 2901, 2901, 2901, 2901, 2901, 2901, 2901,
- 2901, 2901, 2901, 2901, 2901, 2901, 2901, 2901,
- 2901, 2901, 2901, 2901, 2900, 2900, 2900, 2900,
- 2900, 2900, 2900, 2900, 2900, 2900, 2900, 2900,
- 2900, 2900, 2900, 2900, 2900, 2900, 2900, 2900,
- 2900, 2900, 2900, 2900, 2900, 2900, 2901, 2901,
- 2901, 2901, 2901, 2901, 2901, 2901, 2901, 2901,
- 2901, 2901, 2901, 2901, 2901, 2901, 2901, 2901,
-
- 2901, 2901, 2901, 2901, 2901, 2901, 2901, 2901,
- 2900, 2900, 2900, 2900, 2900, 2900, 2900, 2900,
- 2900, 2900, 2900, 2900, 2900, 2900, 2900, 2900,
- 2900, 2900, 2900, 2900, 2900, 2900, 2900, 2900,
- 2900, 2900, 2901, 2901, 2901, 2901, 2901, 2901,
- 2901, 2901, 2901, 2901, 2901, 2901, 2901, 2901,
- 2901, 2901, 2901, 2901, 2901, 2901, 2901, 2901,
- 2901, 2901, 2901, 2901, 2900, 2900, 2900, 2900,
- 2900, 2900, 2900, 2900, 2900, 2900, 2900, 2900,
- 2900, 2900, 2900, 2900, 2900, 2900, 2900, 2900,
- 2900, 2900, 2900, 2900, 2900, 2900, 2901, 2901,
- 2901, 2901, 2901, 2901, 2901, 2901, 2901, 2901,
- 2901, 2901, 2901, 2901, 2901, 2901, 2901, 2901,
- 2901, 2901, 2901, 2901, 2901, 2901, 2901, 2901,
- 2900, 2900, 2900, 2900, 2900, 2900, 2900, 2900,
- 2900, 2900, 2900, 2900, 2900, 2900, 2900, 2900,
- 2900, 2900, 2900, 2900, 2900, 2900, 2900, 2900,
- 2900, 2900, 2901, 2901, 2901, 2901, 2901, 2901,
- 2901, 2901, 2901, 2901, 2901, 2901, 2901, 2901,
- 2901, 2901, 2901, 2901, 2901, 2901, 2901, 2901,
- 2901, 2901, 2901, 2901, 1494, 1494, 206, 206,
- 2900, 2900, 2900, 2900, 2900, 2900, 2900, 2900,
- 2900, 2900, 2900, 2900, 2900, 2900, 2900, 2900,
- 2900, 2900, 2900, 2900, 2900, 2900, 2900, 2900,
- 2900, 2903, 2901, 2901, 2901, 2901, 2901, 2901,
- 2901, 2901, 2901, 2901, 2901, 2901, 2901, 2901,
- 2901, 2901, 2901, 2901, 2901, 2901, 2901, 2901,
- 2901, 2901, 2901, 2904, 2901, 2901, 2901, 2901,
- 2901, 2901, 2900, 2900, 2900, 2900, 2900, 2900,
- 2900, 2900, 2900, 2900, 2900, 2900, 2900, 2900,
- 2900, 2900, 2900, 2900, 2900, 2900, 2900, 2900,
- 2900, 2900, 2900, 2903, 2901, 2901, 2901, 2901,
-
- 2901, 2901, 2901, 2901, 2901, 2901, 2901, 2901,
- 2901, 2901, 2901, 2901, 2901, 2901, 2901, 2901,
- 2901, 2901, 2901, 2901, 2901, 2904, 2901, 2901,
- 2901, 2901, 2901, 2901, 2900, 2900, 2900, 2900,
- 2900, 2900, 2900, 2900, 2900, 2900, 2900, 2900,
- 2900, 2900, 2900, 2900, 2900, 2900, 2900, 2900,
- 2900, 2900, 2900, 2900, 2900, 2903, 2901, 2901,
- 2901, 2901, 2901, 2901, 2901, 2901, 2901, 2901,
- 2901, 2901, 2901, 2901, 2901, 2901, 2901, 2901,
- 2901, 2901, 2901, 2901, 2901, 2901, 2901, 2904,
- 2901, 2901, 2901, 2901, 2901, 2901, 2900, 2900,
- 2900, 2900, 2900, 2900, 2900, 2900, 2900, 2900,
- 2900, 2900, 2900, 2900, 2900, 2900, 2900, 2900,
- 2900, 2900, 2900, 2900, 2900, 2900, 2900, 2903,
- 2901, 2901, 2901, 2901, 2901, 2901, 2901, 2901,
- 2901, 2901, 2901, 2901, 2901, 2901, 2901, 2901,
- 2901, 2901, 2901, 2901, 2901, 2901, 2901, 2901,
- 2901, 2904, 2901, 2901, 2901, 2901, 2901, 2901,
- 2900, 2900, 2900, 2900, 2900, 2900, 2900, 2900,
- 2900, 2900, 2900, 2900, 2900, 2900, 2900, 2900,
- 2900, 2900, 2900, 2900, 2900, 2900, 2900, 2900,
- 2900, 2903, 2901, 2901, 2901, 2901, 2901, 2901,
- 2901, 2901, 2901, 2901, 2901, 2901, 2901, 2901,
- 2901, 2901, 2901, 2901, 2901, 2901, 2901, 2901,
- 2901, 2901, 2901, 2904, 2901, 2901, 2901, 2901,
- 2901, 2901, 2905, 2906, 206, 206, 2907, 2908,
- 2909, 2910, 2911, 2912, 2913, 2914, 2915, 2916,
- 2907, 2908, 2909, 2910, 2911, 2912, 2913, 2914,
- 2915, 2916, 2907, 2908, 2909, 2910, 2911, 2912,
- 2913, 2914, 2915, 2916, 2907, 2908, 2909, 2910,
- 2911, 2912, 2913, 2914, 2915, 2916, 2907, 2908,
- 2909, 2910, 2911, 2912, 2913, 2914, 2915, 2916,
-
- 2917, 2917, 2917, 2917, 2917, 2917, 2917, 2917,
- 2917, 2917, 2917, 2917, 2917, 2917, 2917, 2917,
- 2917, 2917, 2917, 2917, 2917, 2917, 2917, 2917,
- 2917, 2917, 2917, 2917, 2917, 2917, 2917, 2917,
- 2917, 2917, 2917, 2917, 2917, 2917, 2917, 2917,
- 2917, 2917, 2917, 2917, 2917, 2917, 2917, 2917,
- 2917, 2917, 2917, 2917, 2917, 2917, 2917, 2917,
- 2917, 2917, 2917, 2917, 2917, 2917, 2917, 2917,
- 2917, 2917, 2917, 2917, 2917, 2917, 2917, 2917,
- 2917, 2917, 2917, 2917, 2917, 2917, 2917, 2917,
- 2917, 2917, 2917, 2917, 2917, 2917, 2917, 2917,
- 2917, 2917, 2917, 2917, 2917, 2917, 2917, 2917,
- 2917, 2917, 2917, 2917, 2917, 2917, 2917, 2917,
- 2917, 2917, 2917, 2917, 2917, 2917, 2917, 2917,
+ 2901, 2901, 2901, 2901, 2900, 2900, 2898, 2898,
+ 2898, 2898, 2898, 221, 221, 221, 2900, 2900,
+ 2898, 2902, 2903, 2904, 2904, 2905, 2905, 2905,
+ 2905, 2905, 2905, 2905, 2905, 2905, 2905, 2905,
+ 2906, 2907, 2908, 2909, 2910, 2911, 2912, 2913,
+ 2914, 2915, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 2916, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
2917, 2917, 2917, 2917, 2917, 2917, 2917, 2917,
2917, 2917, 2917, 2917, 2917, 2917, 2917, 2917,
- 2917, 2917, 2917, 2917, 2917, 2917, 2917, 2917,
- 2917, 2917, 2917, 2917, 2917, 2917, 2917, 2917,
- 2917, 2917, 2917, 2917, 2917, 2917, 2917, 2917,
- 2917, 2917, 2917, 2917, 2917, 2917, 2917, 2917,
- 2917, 2917, 2917, 2917, 2917, 2917, 2917, 2917,
- 2917, 2917, 2917, 2917, 2917, 2917, 2917, 2917,
- 2917, 2917, 2917, 2917, 2917, 2917, 2917, 2917,
- 2917, 2917, 2917, 2917, 2917, 2917, 2917, 2917,
- 2917, 2917, 2917, 2917, 2917, 2917, 2917, 2917,
- 2917, 2917, 2917, 2917, 2917, 2917, 2917, 2917,
- 2917, 2917, 2917, 2917, 2917, 2917, 2917, 2917,
- 2917, 2917, 2917, 2917, 2917, 2917, 2917, 2917,
- 2917, 2917, 2917, 2917, 2917, 2917, 2917, 2917,
- 2917, 2917, 2917, 2917, 2917, 2917, 2917, 2917,
- 2917, 2917, 2917, 2917, 2917, 2917, 2917, 2917,
- 2917, 2917, 2917, 2917, 2917, 2917, 2917, 2917,
-
- 2918, 2918, 2918, 2918, 2918, 2918, 2918, 2918,
- 2918, 2918, 2918, 2918, 2918, 2918, 2918, 2918,
- 2918, 2918, 2918, 2918, 2918, 2918, 2918, 2918,
- 2918, 2918, 2918, 2918, 2918, 2918, 2918, 2918,
+ 2917, 2917, 2917, 2917, 2917, 2918, 2918, 2918,
+ 2918, 2918, 2918, 2918, 2918, 2919, 2919, 2919,
+ 2919, 2918, 2918, 2918, 2918, 2918, 2918, 2918,
2918, 2918, 2918, 2918, 2918, 2918, 2918, 2918,
- 2918, 2918, 2918, 2918, 2918, 2918, 2918, 2918,
- 2918, 2918, 2918, 2918, 2918, 2918, 2918, 2917,
- 2917, 2917, 2917, 2918, 2918, 2918, 2918, 2918,
- 2918, 2918, 2918, 2918, 2918, 2918, 2918, 2918,
- 2918, 2918, 2918, 2918, 2918, 2918, 2918, 2918,
- 2918, 2918, 2918, 2918, 2918, 2918, 2918, 2918,
- 2918, 2918, 2918, 2918, 2918, 2918, 2918, 2918,
- 2918, 2918, 2918, 2918, 2918, 2918, 2918, 2918,
- 2918, 2918, 2918, 2918, 2918, 2917, 2917, 2917,
- 2917, 2917, 2917, 2917, 2917, 2918, 2917, 2917,
- 2917, 2917, 2917, 2917, 2917, 2917, 2917, 2917,
- 2917, 2917, 2917, 2917, 2918, 2917, 2917, 2919,
- 2920, 2919, 2919, 2921, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 2918, 2918, 2918, 2918, 2918,
- 206, 2918, 2918, 2918, 2918, 2918, 2918, 2918,
- 2918, 2918, 2918, 2918, 2918, 2918, 2918, 2918,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
-
- 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901,
- 1901, 1901, 2922, 1901, 1901, 1901, 1901, 1901,
- 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901,
- 1901, 1901, 1901, 1901, 1901, 1901, 1901, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
-
- 2923, 2923, 2923, 2923, 2923, 2923, 2923, 206,
- 2923, 2923, 2923, 2923, 2923, 2923, 2923, 2923,
- 2923, 2923, 2923, 2923, 2923, 2923, 2923, 2923,
- 2923, 206, 206, 2923, 2923, 2923, 2923, 2923,
- 2923, 2923, 206, 2923, 2923, 206, 2923, 2923,
- 2923, 2923, 2923, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
+ 2918, 2918, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 2920,
+
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2922,
+ 2922, 2922, 2922, 2922, 2922, 2922, 2922, 2922,
+ 2922, 2922, 2922, 2922, 2922, 2922, 2922, 2922,
+ 2922, 2922, 2922, 2922, 2922, 2922, 2922, 2922,
+ 2922, 2922, 2922, 2922, 2922, 2922, 2922, 2922,
+ 2922, 2922, 2922, 2922, 2922, 2922, 2922, 2922,
+ 2922, 2923, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
2924, 2924, 2924, 2924, 2924, 2924, 2924, 2924,
2924, 2924, 2924, 2924, 2924, 2924, 2924, 2924,
2924, 2924, 2924, 2924, 2924, 2924, 2924, 2924,
2924, 2924, 2924, 2924, 2924, 2924, 2924, 2924,
2924, 2924, 2924, 2924, 2924, 2924, 2924, 2924,
- 2924, 2924, 2924, 2924, 2924, 206, 206, 206,
- 2925, 2925, 2925, 2925, 2925, 2925, 2925, 2926,
- 2926, 2926, 2926, 2926, 2926, 2926, 206, 206,
- 2927, 2928, 2929, 2930, 2931, 2932, 2933, 2934,
- 2935, 2936, 206, 206, 206, 206, 2924, 2937,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
-
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 2938, 2938, 2938, 2938, 2938, 2938, 2938, 2938,
- 2938, 2938, 2938, 2938, 2938, 2938, 2938, 2938,
- 2938, 2938, 2938, 2938, 2938, 2938, 2938, 2938,
- 2938, 2938, 2938, 2938, 2938, 2938, 2939, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 2940, 2940, 2940, 2940, 2940, 2940, 2940, 2940,
- 2940, 2940, 2940, 2940, 2940, 2940, 2940, 2940,
- 2940, 2940, 2940, 2940, 2940, 2940, 2940, 2940,
- 2940, 2940, 2940, 2940, 2940, 2940, 2940, 2940,
+ 2924, 2924, 2924, 2924, 2924, 2924, 2924, 2924,
+ 2924, 2924, 2924, 2924, 2924, 2924, 2924, 2924,
+ 2924, 2924, 2924, 2924, 2924, 2924, 2924, 2924,
+ 2924, 2924, 2924, 2924, 2924, 2924, 2924, 2924,
+ 2924, 2924, 2924, 2924, 2924, 2924, 2924, 2924,
+ 2924, 2924, 2924, 2924, 2924, 2924, 2924, 2924,
+ 2924, 2924, 2924, 2924, 2924, 2924, 2924, 2924,
+ 2924, 2924, 2924, 2925, 2925, 2925, 2925, 2925,
+ 2925, 2925, 2925, 2925, 2925, 2925, 2925, 221,
+ 2926, 2926, 2926, 2926, 2927, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 2923, 2923, 2923, 2923, 2923, 2923, 2923, 2923,
+ 2923, 2923, 2923, 2923, 2923, 2923, 2923, 2923,
+ 2923, 2923, 2923, 2923, 2923, 2923, 2923, 2923,
+ 2923, 2923, 2923, 2923, 2923, 2923, 2923, 2923,
+ 2923, 2923, 2923, 2923, 2923, 2923, 2923, 2923,
+ 2923, 2923, 2923, 2923, 2923, 2923, 2923, 2923,
+ 2923, 2923, 2923, 2923, 2923, 2923, 2923, 2923,
+ 2923, 2923, 2923, 2923, 2923, 2923, 2923, 2923,
+ 2923, 2923, 2923, 2923, 2923, 2923, 2923, 2923,
+ 2923, 2923, 2923, 2923, 2923, 2923, 2923, 2923,
+ 2923, 2923, 2923, 2923, 2923, 2923, 2923, 2923,
+ 2923, 2923, 2923, 2923, 2923, 2923, 2923, 2923,
+ 2923, 2923, 2923, 2923, 2923, 2923, 2923, 2923,
+ 2923, 2923, 2923, 2923, 2923, 2923, 2923, 2923,
+ 2923, 2923, 2923, 2923, 2923, 2923, 2923, 2923,
+ 2923, 2923, 2923, 2923, 2923, 2923, 2923, 2923,
+
+ 2923, 2923, 2923, 2923, 2923, 2923, 2923, 2923,
+ 2923, 2923, 2923, 2923, 2923, 2923, 2923, 2923,
+ 2923, 2923, 2923, 2923, 2923, 2923, 2923, 2923,
+ 2923, 2923, 2923, 2923, 2923, 2923, 2923, 2923,
+ 2923, 2923, 2923, 2923, 2923, 2923, 2923, 2923,
+ 2923, 2923, 2923, 2923, 2923, 2923, 2923, 2923,
+ 2923, 2923, 2923, 2923, 2923, 2923, 2923, 2923,
+ 2923, 2923, 2923, 2923, 2923, 2923, 2923, 2923,
+ 2923, 2923, 2923, 2923, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 2928, 2928, 2928, 2928, 2928, 2928, 2928, 2928,
+ 2928, 2928, 2928, 2928, 2928, 2928, 2928, 2928,
+ 2928, 2928, 2928, 2928, 2928, 2928, 2928, 2928,
+ 2928, 2928, 2928, 2928, 2928, 2928, 2928, 2928,
+ 2928, 2928, 2928, 2928, 2928, 2928, 2928, 2928,
+ 2928, 2928, 2928, 2928, 2928, 2928, 2928, 2928,
+ 2928, 2928, 2928, 2928, 2928, 2928, 2928, 2928,
+ 2928, 2928, 2928, 2928, 2928, 2928, 2928, 2928,
+ 2928, 2928, 2928, 2928, 2928, 2928, 2928, 2928,
+ 2928, 2928, 2928, 2928, 2928, 2928, 2928, 2928,
+ 2928, 2928, 2928, 2928, 2928, 2928, 2928, 2928,
+ 2928, 2928, 2928, 2928, 2928, 2928, 2928, 2928,
+ 2928, 2929, 2929, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2931, 2931, 2931, 2932, 2932, 2932, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2932, 2930, 2930, 2930, 2931, 2932,
+ 2931, 2932, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2931, 2932, 2932, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2930, 2933,
+ 2934, 2934, 2934, 2934, 2934, 2934, 2934, 2935,
+ 2936, 2937, 2937, 2937, 2938, 2939, 2938, 2939,
+ 2940, 2941, 2941, 2941, 2941, 2941, 2941, 2940,
2940, 2940, 2940, 2940, 2940, 2940, 2940, 2940,
- 2940, 2940, 2940, 2940, 2941, 2941, 2941, 2941,
- 2942, 2943, 2944, 2945, 2946, 2947, 2948, 2949,
- 2950, 2951, 206, 206, 206, 206, 206, 2952,
-
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 2953, 2953, 2953, 2953, 2953, 2953, 2953, 206,
- 2953, 2953, 2953, 2953, 206, 2953, 2953, 206,
- 2953, 2953, 2953, 2953, 2953, 2953, 2953, 2953,
- 2953, 2953, 2953, 2953, 2953, 2953, 2953, 206,
-
- 2954, 2954, 2954, 2954, 2954, 2954, 2954, 2954,
- 2954, 2954, 2954, 2954, 2954, 2954, 2954, 2954,
- 2954, 2954, 2954, 2954, 2954, 2954, 2954, 2954,
- 2954, 2954, 2954, 2954, 2954, 2954, 2954, 2954,
- 2954, 2954, 2954, 2954, 2954, 2954, 2954, 2954,
- 2954, 2954, 2954, 2954, 2954, 2954, 2954, 2954,
- 2954, 2954, 2954, 2954, 2954, 2954, 2954, 2954,
- 2954, 2954, 2954, 2954, 2954, 2954, 2954, 2954,
- 2954, 2954, 2954, 2954, 2954, 2954, 2954, 2954,
- 2954, 2954, 2954, 2954, 2954, 2954, 2954, 2954,
- 2954, 2954, 2954, 2954, 2954, 2954, 2954, 2954,
- 2954, 2954, 2954, 2954, 2954, 2954, 2954, 2954,
- 2954, 2954, 2954, 2954, 2954, 2954, 2954, 2954,
- 2954, 2954, 2954, 2954, 2954, 2954, 2954, 2954,
- 2954, 2954, 2954, 2954, 2954, 2954, 2954, 2954,
- 2954, 2954, 2954, 2954, 2954, 2954, 2954, 2954,
- 2954, 2954, 2954, 2954, 2954, 2954, 2954, 2954,
- 2954, 2954, 2954, 2954, 2954, 2954, 2954, 2954,
- 2954, 2954, 2954, 2954, 2954, 2954, 2954, 2954,
- 2954, 2954, 2954, 2954, 2954, 2954, 2954, 2954,
- 2954, 2954, 2954, 2954, 2954, 2954, 2954, 2954,
- 2954, 2954, 2954, 2954, 2954, 2954, 2954, 2954,
- 2954, 2954, 2954, 2954, 2954, 2954, 2954, 2954,
- 2954, 2954, 2954, 2954, 2954, 2954, 2954, 2954,
- 2954, 2954, 2954, 2954, 2954, 305, 305, 2955,
- 2955, 2955, 2955, 2955, 2955, 2955, 2955, 2955,
- 2956, 2956, 2956, 2956, 2956, 2956, 2956, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
-
- 2957, 2957, 2957, 2957, 2957, 2957, 2957, 2957,
- 2957, 2957, 2957, 2957, 2957, 2957, 2957, 2957,
- 2957, 2957, 2957, 2957, 2957, 2957, 2957, 2957,
- 2957, 2957, 2957, 2957, 2957, 2957, 2957, 2957,
- 2957, 2957, 2958, 2958, 2958, 2958, 2958, 2958,
+ 2940, 2940, 2940, 2940, 2940, 2940, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2943, 2944,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+ 2945, 221, 221, 221, 221, 221, 221, 221,
+ 2946, 2946, 2946, 2946, 2946, 2946, 2946, 2946,
+ 2946, 2946, 2946, 2946, 2946, 2946, 2946, 2946,
+ 2946, 2946, 2946, 2946, 2946, 2946, 2946, 2946,
+ 2946, 2946, 2946, 2946, 2946, 2946, 2946, 221,
+ 2947, 2948, 2949, 2950, 2951, 2952, 2953, 2954,
+ 2955, 2956, 221, 221, 221, 221, 2957, 2957,
2958, 2958, 2958, 2958, 2958, 2958, 2958, 2958,
2958, 2958, 2958, 2958, 2958, 2958, 2958, 2958,
2958, 2958, 2958, 2958, 2958, 2958, 2958, 2958,
- 2958, 2958, 2958, 2958, 2959, 2959, 2959, 2959,
- 2959, 2959, 2960, 2961, 305, 305, 305, 305,
- 2962, 2963, 2964, 2965, 2966, 2967, 2968, 2969,
- 2970, 2971, 305, 305, 305, 305, 2972, 2972,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
-
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
-
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 2973, 2973, 2973, 2973, 2973, 2973, 2973,
- 2973, 2973, 2973, 2973, 2973, 2973, 2973, 2973,
- 2973, 2973, 2973, 2973, 2973, 2973, 2973, 2973,
- 2973, 2973, 2973, 2973, 2973, 2973, 2973, 2973,
- 2973, 2973, 2973, 2973, 2973, 2973, 2973, 2973,
- 2973, 2973, 2973, 2973, 2973, 2973, 2973, 2973,
- 2973, 2973, 2973, 2973, 2973, 2973, 2973, 2973,
- 2973, 2973, 2973, 2973, 2974, 2973, 2973, 2973,
- 2975, 2973, 2973, 2973, 2973, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
-
- 305, 2976, 2976, 2976, 2976, 2976, 2976, 2976,
- 2976, 2976, 2976, 2976, 2976, 2976, 2976, 2976,
- 2976, 2976, 2976, 2976, 2976, 2976, 2976, 2976,
- 2976, 2976, 2976, 2976, 2976, 2976, 2976, 2976,
- 2976, 2976, 2976, 2976, 2976, 2976, 2976, 2976,
- 2976, 2976, 2976, 2976, 2976, 2976, 2977, 2976,
- 2976, 2976, 2976, 2976, 2976, 2976, 2976, 2976,
- 2976, 2976, 2976, 2976, 2976, 2976, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 305, 305,
-
- 2978, 2978, 2978, 2978, 419, 2978, 2978, 2978,
- 2978, 2978, 2978, 2978, 2978, 2978, 2978, 2978,
- 2978, 2978, 2978, 2978, 2978, 2978, 2978, 2978,
- 2978, 2978, 2978, 2978, 2978, 2978, 2978, 2978,
- 419, 2978, 2978, 419, 2978, 419, 419, 2978,
- 419, 2978, 2978, 2978, 2978, 2978, 2978, 2978,
- 2978, 2978, 2978, 419, 2978, 2978, 2978, 2978,
- 419, 2978, 419, 2978, 419, 419, 419, 419,
- 419, 419, 2978, 419, 419, 419, 419, 2978,
- 419, 2978, 419, 2978, 419, 2978, 2978, 2978,
- 419, 2978, 2978, 419, 2978, 419, 419, 2978,
- 419, 2978, 419, 2978, 419, 2978, 419, 2978,
- 419, 2978, 2978, 419, 2978, 419, 419, 2978,
- 2978, 2978, 2978, 419, 2978, 2978, 2978, 2978,
- 2978, 2978, 2978, 419, 2978, 2978, 2978, 2978,
- 419, 2978, 2978, 2978, 2978, 419, 2978, 419,
- 2978, 2978, 2978, 2978, 2978, 2978, 2978, 2978,
- 2978, 2978, 419, 2978, 2978, 2978, 2978, 2978,
- 2978, 2978, 2978, 2978, 2978, 2978, 2978, 2978,
- 2978, 2978, 2978, 2978, 419, 419, 419, 419,
- 419, 2978, 2978, 2978, 419, 2978, 2978, 2978,
- 2978, 2978, 419, 2978, 2978, 2978, 2978, 2978,
- 2978, 2978, 2978, 2978, 2978, 2978, 2978, 2978,
- 2978, 2978, 2978, 2978, 419, 419, 419, 419,
- 419, 419, 419, 419, 419, 419, 419, 419,
- 419, 419, 419, 419, 419, 419, 419, 419,
- 419, 419, 419, 419, 419, 419, 419, 419,
- 419, 419, 419, 419, 419, 419, 419, 419,
- 419, 419, 419, 419, 419, 419, 419, 419,
- 419, 419, 419, 419, 419, 419, 419, 419,
- 2979, 2979, 419, 419, 419, 419, 419, 419,
- 419, 419, 419, 419, 419, 419, 419, 419,
-
- 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618,
- 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618,
- 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618,
- 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618,
- 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618,
- 1618, 1618, 1618, 1618, 2980, 2980, 2980, 2980,
- 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618,
- 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618,
- 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618,
- 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618,
- 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618,
- 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618,
- 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618,
- 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618,
- 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618,
- 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618,
- 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618,
- 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618,
- 1618, 1618, 1618, 1618, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557,
- 1557, 1557, 1557, 1557, 1557, 1557, 1557, 2980,
- 2980, 1557, 1557, 1557, 1557, 1557, 1557, 1557,
- 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1620,
- 2980, 1557, 1557, 1557, 1557, 1557, 1557, 1557,
- 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557,
- 2980, 1557, 1557, 1557, 1557, 1557, 1557, 1557,
- 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557,
- 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620,
- 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620,
- 1620, 1620, 1620, 1620, 1620, 1620, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
-
- 2981, 2981, 2982, 2983, 2984, 2985, 2986, 2987,
- 2988, 2989, 2990, 2991, 2991, 2992, 2992, 2992,
- 2993, 2993, 2993, 2993, 2993, 2993, 2993, 2993,
- 2993, 2993, 2993, 2993, 2993, 2993, 2993, 2993,
- 2993, 2993, 2993, 2993, 2993, 2993, 2993, 2993,
- 2993, 2993, 2994, 2994, 2994, 2994, 2994, 2995,
- 2996, 2997, 2996, 2996, 2996, 2996, 2996, 2996,
- 2996, 2996, 2996, 2996, 2996, 2997, 2996, 2997,
- 2996, 2996, 2997, 2996, 2996, 2996, 2997, 2996,
- 2996, 2996, 2994, 2994, 2994, 2994, 2994, 2998,
- 2999, 2999, 2999, 2999, 2999, 2999, 2999, 3000,
- 2999, 2999, 2999, 2999, 2999, 2999, 2999, 3000,
+ 2958, 2958, 2958, 2958, 2958, 2958, 2958, 2958,
+ 2958, 2958, 2958, 2958, 2958, 2958, 2958, 2958,
+ 2958, 2958, 2958, 2958, 2958, 2958, 2958, 2958,
+ 2958, 2958, 2958, 2958, 2958, 2958, 2958, 2958,
+ 2958, 2958, 2958, 2958, 2958, 2958, 2958, 2958,
+ 2958, 2958, 2958, 2958, 2958, 2958, 2958, 2958,
+ 2958, 2958, 2958, 2958, 2958, 2958, 2958, 221,
+ 2959, 2960, 2961, 2962, 2963, 2964, 2965, 2966,
+ 2967, 2968, 221, 221, 221, 221, 221, 221,
+ 2969, 2969, 2969, 2969, 2969, 2969, 2969, 2969,
+ 2969, 2969, 2969, 2969, 2969, 2969, 2969, 2969,
+ 2969, 2969, 2969, 2969, 2969, 2969, 2969, 2969,
+ 2969, 2969, 2969, 2969, 2969, 2969, 221, 221,
+ 2970, 2970, 2970, 2970, 2970, 2971, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 2972, 2972, 2972, 2972, 2972, 2972, 2972, 2972,
+ 2972, 2972, 2972, 2972, 2972, 2972, 2972, 2972,
+ 2972, 2972, 2972, 2972, 2972, 2972, 2972, 2972,
+ 2972, 2972, 2972, 2972, 2972, 2972, 2972, 2972,
+ 2972, 2972, 2972, 2972, 2972, 2972, 2972, 2972,
+ 2972, 2972, 2972, 2972, 2972, 2972, 2972, 2972,
+ 2973, 2973, 2973, 2973, 2973, 2973, 2973, 2974,
+ 2974, 2975, 2976, 2976, 2977, 2977, 2977, 2977,
+ 2978, 2978, 2978, 2978, 2974, 2977, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 2979, 2980, 2981, 2982, 2983, 2984, 2985, 2986,
+ 2987, 2988, 221, 2989, 2989, 2989, 2989, 2989,
+ 2989, 2989, 221, 2972, 2972, 2972, 2972, 2972,
+ 2972, 2972, 2972, 2972, 2972, 2972, 2972, 2972,
+ 2972, 2972, 2972, 2972, 2972, 2972, 2972, 2972,
+ 221, 221, 221, 221, 221, 2972, 2972, 2972,
+ 2972, 2972, 2972, 2972, 2972, 2972, 2972, 2972,
+ 2972, 2972, 2972, 2972, 2972, 2972, 2972, 2972,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 2990, 2990, 2990, 2990, 2990, 2990, 2990, 2990,
+ 2990, 2990, 2990, 2990, 2990, 2990, 2990, 2990,
+ 2990, 2990, 2990, 2990, 2990, 2990, 2990, 2990,
+ 2990, 2990, 2990, 2990, 2990, 2990, 2990, 2990,
+ 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+ 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+ 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+ 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+ 2992, 2992, 2992, 2992, 2992, 2992, 2992, 2992,
+ 2992, 2992, 2992, 2992, 2992, 2992, 2992, 2992,
+ 2992, 2992, 2992, 2992, 2992, 2992, 2992, 2993,
+ 2994, 2995, 2995, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 2996, 2996, 2996, 2996, 2996, 2996, 2996, 2996,
+ 2996, 2996, 2996, 2996, 2996, 2996, 2996, 2996,
+ 2996, 2996, 2996, 2996, 2996, 2996, 2996, 2996,
+ 2996, 2996, 2996, 2996, 2996, 2996, 2996, 2996,
+ 2996, 2996, 2996, 2996, 2996, 2996, 2996, 2996,
+ 2996, 2996, 2996, 2996, 2996, 2996, 2996, 2996,
+ 2996, 2996, 2996, 2996, 2996, 2996, 2996, 2996,
+ 2996, 2996, 2996, 2996, 2996, 2996, 2996, 2996,
+ 2996, 2996, 2996, 2996, 2996, 2997, 2997, 2997,
+ 2997, 2997, 2997, 221, 221, 221, 221, 2998,
+ 2996, 2999, 2999, 2999, 2999, 2999, 2999, 2999,
2999, 2999, 2999, 2999, 2999, 2999, 2999, 2999,
- 2999, 2999, 3001, 3001, 3002, 2992, 2992, 2992,
- 3003, 3003, 2999, 2999, 2999, 2999, 2999, 2999,
- 2999, 3000, 2999, 3000, 3000, 2999, 3003, 3004,
2999, 2999, 2999, 2999, 2999, 2999, 2999, 2999,
- 2999, 2999, 831, 831, 831, 831, 3005, 3006,
- 2994, 3005, 3005, 3005, 3005, 3005, 3005, 3005,
- 3005, 3005, 3005, 3007, 3007, 3007, 3007, 3007,
- 3007, 3007, 3007, 3007, 3007, 3007, 3007, 3007,
- 3007, 3007, 3007, 3007, 3007, 2992, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 3008, 3008,
- 3008, 3008, 3008, 3008, 3008, 3008, 3008, 3008,
- 3008, 3008, 3008, 3008, 3008, 3008, 3008, 3008,
- 3008, 3008, 3008, 3008, 3008, 3008, 3008, 3008,
-
- 3009, 3010, 3010, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804,
- 1804, 1804, 3011, 1804, 1804, 1804, 1804, 1804,
- 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804,
- 1804, 1804, 1804, 1804, 1804, 1804, 1804, 3011,
- 1804, 1804, 3010, 3010, 3010, 3010, 3010, 3010,
- 3010, 3010, 3010, 3012, 2980, 2980, 2980, 2980,
- 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804,
- 1804, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 3010, 3010, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 3013, 3013, 3013, 3013, 3013, 3013, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
-
- 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557,
- 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557,
- 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557,
- 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557,
- 1557, 1620, 1620, 1620, 1620, 1620, 1620, 1620,
- 1620, 1620, 1620, 1620, 1620, 3014, 3014, 3014,
- 1557, 1557, 1557, 1557, 1557, 1557, 1620, 1557,
- 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557,
- 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557,
- 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557,
- 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557,
- 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557,
- 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557,
- 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557,
- 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557,
- 1557, 1557, 1557, 1557, 1557, 1620, 3014, 3014,
- 1557, 1557, 1557, 1557, 1557, 1621, 1557, 1557,
- 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557,
- 1557, 1557, 1557, 1557, 1620, 1620, 1620, 1620,
- 1620, 1620, 1620, 1620, 1559, 1559, 1620, 1620,
- 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557,
- 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557,
- 1557, 1557, 1557, 1557, 1557, 1556, 1556, 1557,
- 1557, 1557, 1557, 1557, 1556, 1557, 1557, 1557,
- 1557, 1557, 1621, 1621, 1621, 1620, 1557, 1621,
- 1557, 1557, 1621, 3015, 3015, 1620, 1620, 3014,
- 3014, 3014, 3014, 3014, 1620, 1620, 1620, 1620,
- 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620,
- 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557,
- 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557,
- 1557, 1620, 1620, 1620, 1620, 1620, 1620, 1620,
- 3014, 3014, 3014, 3016, 3016, 3016, 3016, 3016,
-
- 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557,
- 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557,
- 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557,
- 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557,
- 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557,
- 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557,
- 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557,
- 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1620,
- 1557, 1620, 1621, 1621, 1557, 1557, 1621, 1621,
- 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621,
- 1621, 1557, 1557, 1557, 1557, 1557, 1557, 1557,
- 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557,
- 1557, 1557, 1557, 1557, 1557, 1557, 1621, 1621,
- 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621,
- 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621,
- 1621, 1557, 1557, 1557, 1621, 1557, 1557, 1557,
- 1557, 1621, 1621, 1621, 1557, 1621, 1621, 1621,
- 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1621,
- 1557, 1621, 1557, 1557, 1557, 1557, 1557, 1557,
- 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557,
- 1556, 1557, 1556, 1557, 1556, 1557, 1557, 1557,
- 1557, 1557, 1621, 1557, 1557, 1557, 1557, 1556,
- 1557, 1556, 1556, 1557, 1557, 1557, 1557, 1557,
- 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557,
- 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557,
- 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557,
- 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557,
- 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557,
- 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557,
- 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557,
- 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557,
- 1620, 1557, 1557, 1557, 1557, 1620, 1620, 3014,
-
- 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1557,
- 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557,
- 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1556,
- 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556,
- 1556, 1556, 1556, 1556, 1556, 1557, 1557, 1557,
- 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557,
- 1557, 1557, 1556, 1556, 1556, 1556, 1556, 1556,
- 1556, 1556, 1556, 1556, 1556, 1556, 1558, 1558,
- 3017, 3017, 3017, 3017, 1558, 1558, 1559, 1559,
- 1559, 1559, 1620, 3014, 3014, 3014, 3014, 3014,
- 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557,
- 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557,
- 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557,
- 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620,
- 1620, 1620, 1620, 1620, 3015, 3015, 1620, 1620,
- 1620, 1620, 3018, 1620, 1620, 1620, 1620, 1620,
- 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620,
- 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620,
- 3015, 1620, 1620, 1620, 1620, 3015, 3015, 1620,
- 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620,
- 1620, 1620, 1620, 1620, 3019, 1620, 1620, 1620,
- 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620,
- 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620,
- 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620,
- 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620,
- 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620,
- 1620, 1620, 1620, 1620, 1559, 1559, 1559, 1559,
- 1559, 1559, 1559, 1559, 1620, 1620, 1620, 1620,
- 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620,
- 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620,
- 1620, 1620, 1620, 1620, 1559, 1559, 1559, 1559,
- 1559, 1559, 1620, 1557, 1557, 1557, 1557, 1557,
-
- 3020, 1557, 1557, 1557, 1557, 1557, 1557, 1557,
- 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557,
- 1557, 3020, 1557, 1557, 1557, 3020, 1557, 3020,
- 1557, 3020, 1557, 3020, 1557, 1557, 1557, 3020,
- 1557, 1557, 1557, 1557, 1557, 1557, 3020, 3020,
- 1557, 1557, 1557, 1557, 3020, 1557, 3020, 3020,
- 1557, 1557, 1557, 1557, 3020, 1557, 1557, 1557,
- 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557,
- 1557, 1620, 1620, 3014, 3014, 1621, 1621, 1621,
- 1557, 1557, 1557, 1621, 1621, 1621, 1621, 1621,
- 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558,
- 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558,
- 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558,
- 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558,
- 1558, 1558, 1558, 1558, 1558, 1558, 3021, 3021,
- 3021, 3022, 3022, 3022, 1558, 1558, 1558, 1558,
- 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557,
- 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557,
- 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557,
- 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557,
- 1557, 1557, 1557, 1621, 1557, 1557, 1557, 1557,
- 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557,
- 1557, 1557, 1557, 1557, 1621, 1621, 1621, 1557,
- 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557,
- 1621, 1557, 1557, 1557, 1557, 1557, 1620, 1620,
- 1620, 1620, 1620, 1620, 3015, 1620, 1620, 1620,
- 3014, 3019, 3019, 3013, 3013, 3023, 2992, 2992,
- 2980, 2980, 2980, 2980, 2980, 3024, 3024, 3024,
- 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620,
- 1620, 1620, 1620, 1620, 1620, 2980, 2980, 2980,
- 1620, 1620, 1620, 1620, 3019, 3019, 3019, 3013,
- 3013, 3025, 3023, 2992, 2992, 2980, 2980, 2980,
-
- 3026, 3026, 3026, 3026, 3026, 3026, 3026, 3026,
- 3026, 3026, 3026, 3026, 3026, 3026, 3026, 3026,
- 3026, 3026, 3026, 3026, 3026, 3026, 3026, 3026,
- 3026, 3026, 3026, 3026, 3026, 3026, 3026, 3026,
- 3026, 3026, 3026, 3026, 3026, 3026, 3026, 3026,
- 3026, 3026, 3026, 3026, 3026, 3026, 3026, 3026,
- 3026, 3026, 3026, 3026, 3026, 3026, 3026, 3026,
- 3026, 3026, 3026, 3026, 3026, 3026, 3026, 3026,
- 3026, 3026, 3026, 3026, 3026, 3026, 3026, 3026,
- 3026, 3026, 3026, 3026, 3026, 3026, 3026, 3026,
- 3026, 3026, 3026, 3026, 3026, 3026, 3026, 3026,
- 3026, 3026, 3026, 3026, 3026, 3026, 3026, 3026,
- 3026, 3026, 3026, 3026, 3026, 3026, 3026, 3026,
- 3026, 3026, 3026, 3026, 3026, 3026, 3026, 3026,
- 3026, 3026, 3026, 3026, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558,
- 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558,
- 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558,
- 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558,
- 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558,
- 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558,
- 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558,
- 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558,
- 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558,
- 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558,
- 1558, 1558, 1558, 1558, 1558, 3025, 3025, 3025,
- 3025, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 3023, 3023, 3023, 3023, 3023, 3023, 3023, 3023,
- 3023, 3023, 3023, 3023, 2980, 2980, 2980, 2980,
- 3024, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
+ 2999, 2999, 2999, 2999, 2999, 2999, 2999, 2999,
+ 2999, 2999, 2999, 2999, 2999, 2999, 2999, 2999,
+ 2999, 2999, 2999, 2999, 2999, 2999, 2999, 3000,
+ 3000, 3000, 3000, 3000, 3000, 3000, 3000, 3000,
+ 221, 221, 221, 221, 221, 221, 221, 3001,
+ 3001, 3001, 3001, 3002, 3002, 3002, 3002, 3002,
+ 3002, 3002, 3002, 3002, 3002, 3002, 3002, 3002,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 3003, 3004, 3005, 3006, 3007, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 3008, 3008, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3010, 3010, 3010,
+ 3010, 3010, 3011, 3011, 3011, 3011, 3011, 3011,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3012, 3012, 3012, 3012, 3012,
+ 3012, 3012, 3012, 3012, 3012, 3012, 3012, 3012,
- 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558,
- 1558, 1558, 1558, 1558, 2980, 2980, 2980, 2980,
- 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558,
- 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558,
- 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558,
- 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558,
- 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558,
- 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558,
- 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558,
- 1558, 1558, 2980, 2980, 2980, 2980, 2980, 2980,
- 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558,
- 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558,
- 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558,
- 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558,
- 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558,
- 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558,
- 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558,
- 1558, 1558, 1558, 1558, 1558, 1558, 2980, 2980,
- 2992, 2992, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
-
- 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561,
- 1561, 1561, 1561, 1561, 3027, 3023, 3023, 3028,
- 3014, 3014, 3014, 3014, 3014, 3014, 3014, 3014,
- 3029, 3018, 3018, 3018, 3018, 3018, 3018, 3030,
- 3019, 3019, 3019, 3019, 3019, 3019, 3018, 3019,
3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
- 3018, 3030, 3030, 3018, 3018, 3018, 3018, 3018,
- 3018, 3018, 3019, 3031, 3018, 3018, 3018, 3023,
- 3019, 3019, 3019, 3019, 3019, 3019, 3031, 3019,
- 3019, 3019, 3019, 3019, 3013, 3025, 3025, 3025,
- 3019, 3019, 3019, 3019, 3019, 3019, 3019, 3019,
- 3019, 3019, 3019, 3019, 3019, 3019, 3019, 3013,
3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
- 3013, 3013, 3013, 3013, 3025, 3025, 3025, 3025,
- 3025, 3023, 2992, 3025, 3025, 3025, 3025, 3027,
- 2992, 3024, 3025, 3023, 3025, 3025, 3025, 3025,
- 3014, 3014, 3014, 3014, 3014, 3019, 3019, 3019,
- 3019, 3019, 3019, 3019, 3019, 3019, 3019, 3019,
- 3019, 3019, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 3012, 3012, 3012, 3012, 3012, 3012, 3012, 3012,
+ 3012, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 3014, 3014, 3014, 3014, 221, 3014, 3014, 3014,
+ 3014, 3014, 3014, 3014, 221, 3014, 3014, 221,
+
+ 3015, 3016, 3017, 3017, 3017, 3017, 3017, 3017,
+ 3017, 3017, 3017, 3017, 3017, 3017, 3017, 3017,
+ 3017, 3017, 3017, 3017, 3017, 3017, 3017, 3017,
+ 3017, 3017, 3017, 3017, 3017, 3017, 3017, 3017,
+ 3017, 3017, 3017, 3017, 3017, 3017, 3017, 3017,
+ 3017, 3017, 3017, 3017, 3017, 3017, 3017, 3017,
+ 3017, 3017, 3017, 3017, 3017, 3017, 3017, 3017,
+ 3017, 3017, 3017, 3017, 3017, 3017, 3017, 3017,
+ 3017, 3017, 3017, 3017, 3017, 3017, 3017, 3017,
+ 3017, 3017, 3017, 3017, 3017, 3017, 3017, 3017,
+ 3017, 3017, 3017, 3017, 3017, 3017, 3017, 3017,
+ 3017, 3017, 3017, 3017, 3017, 3017, 3017, 3017,
+ 3017, 3017, 3017, 3017, 3017, 3017, 3017, 3017,
+ 3017, 3017, 3017, 3017, 3017, 3017, 3017, 3017,
+ 3017, 3017, 3017, 3017, 3017, 3017, 3017, 3017,
+ 3017, 3017, 3017, 3017, 3017, 3017, 3017, 3017,
+ 3017, 3017, 3017, 3017, 3017, 3017, 3017, 3017,
+ 3017, 3017, 3017, 3017, 3017, 3017, 3017, 3017,
+ 3017, 3017, 3017, 3017, 3017, 3017, 3017, 3017,
+ 3017, 3017, 3017, 3017, 3017, 3017, 3017, 3017,
+ 3017, 3017, 3017, 3017, 3017, 3017, 3017, 3017,
+ 3017, 3017, 3017, 3017, 3017, 3017, 3017, 3017,
+ 3017, 3017, 3017, 3017, 3017, 3017, 3017, 3017,
+ 3017, 3017, 3017, 3017, 3017, 3017, 3017, 3017,
+ 3017, 3017, 3017, 3017, 3017, 3017, 3017, 3017,
+ 3017, 3017, 3017, 3017, 3017, 3017, 3017, 3017,
+ 3017, 3017, 3017, 3017, 3017, 3017, 3017, 3017,
+ 3017, 3017, 3017, 3017, 3017, 3017, 3017, 3017,
+ 3017, 3017, 3017, 3017, 3017, 3017, 3017, 3017,
+ 3017, 3017, 3017, 3017, 3017, 3017, 3017, 3017,
+ 3017, 3017, 3017, 3017, 3017, 3017, 3017, 3017,
+ 3017, 3017, 3017, 3017, 3017, 3017, 3017, 3017,
+
+ 3017, 3017, 3017, 3017, 3017, 3017, 3017, 3017,
+ 3017, 3017, 3017, 3017, 3017, 3017, 3017, 3017,
+ 3017, 3017, 3017, 3017, 3017, 3017, 3017, 3017,
+ 3017, 3017, 3017, 3017, 3017, 3017, 3017, 3018,
+ 3019, 3019, 3019, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 3020, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 3021, 3021, 3021, 221, 221, 3022, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 3023, 3023, 3023, 3023,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 221, 221, 221, 221,
+
+ 3025, 3025, 3025, 3025, 3025, 3025, 3025, 3025,
+ 3025, 3025, 3025, 3025, 3025, 3025, 3025, 3025,
+ 3025, 3025, 3025, 3025, 3025, 3025, 3025, 3025,
+ 3025, 3025, 3025, 3025, 3025, 3025, 3025, 3025,
+ 3025, 3025, 3025, 3025, 3025, 3025, 3025, 3025,
+ 3025, 3025, 3025, 3025, 3025, 3025, 3025, 3025,
+ 3025, 3025, 3025, 3025, 3025, 3025, 3025, 3025,
+ 3025, 3025, 3025, 3025, 3025, 3025, 3025, 3025,
+ 3025, 3025, 3025, 3025, 3025, 3025, 3025, 3025,
+ 3025, 3025, 3025, 3025, 3025, 3025, 3025, 3025,
+ 3025, 3025, 3025, 3025, 3025, 3025, 3025, 3025,
3025, 3025, 3025, 3025, 3025, 3025, 3025, 3025,
- 3025, 3025, 3025, 2992, 2992, 3023, 3023, 3023,
- 3023, 3023, 3023, 2992, 2992, 2992, 3023, 3023,
- 3025, 3025, 3025, 3025, 3025, 3032, 3032, 3025,
- 3032, 3032, 3023, 3028, 3023, 3023, 3023, 3023,
- 3014, 3025, 3025, 3023, 3023, 3023, 3023, 3023,
- 3023, 3023, 3023, 2992, 3024, 3028, 3028, 3028,
- 3013, 3030, 3030, 3030, 3030, 3030, 3030, 3030,
- 3030, 3030, 3030, 3030, 3030, 3030, 3013, 3013,
- 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3025,
3025, 3025, 3025, 3025, 3025, 3025, 3025, 3025,
+ 3025, 3025, 3025, 221, 221, 221, 221, 221,
3025, 3025, 3025, 3025, 3025, 3025, 3025, 3025,
+ 3025, 3025, 3025, 3025, 3025, 221, 221, 221,
3025, 3025, 3025, 3025, 3025, 3025, 3025, 3025,
+ 3025, 221, 221, 221, 221, 221, 221, 221,
+ 3025, 3025, 3025, 3025, 3025, 3025, 3025, 3025,
+ 3025, 3025, 221, 221, 3026, 3027, 3028, 3029,
+ 3030, 3030, 3030, 3030, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 3031, 3031, 3031, 3031, 3031, 3031, 3031, 3031,
+ 3031, 3031, 3031, 3031, 3031, 3031, 3031, 3031,
+ 3031, 3031, 3031, 3031, 3031, 3031, 3031, 3031,
+ 3031, 3031, 3031, 3031, 3031, 3031, 3031, 3031,
+ 3031, 3031, 3031, 3031, 3031, 3031, 3031, 3031,
+ 3031, 3031, 3031, 3031, 3031, 3031, 221, 221,
+ 3031, 3031, 3031, 3031, 3031, 3031, 3031, 3031,
+ 3031, 3031, 3031, 3031, 3031, 3031, 3031, 3031,
+ 3031, 3031, 3031, 3031, 3031, 3031, 3031, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 3032, 3032, 3032, 3032, 3032, 3032, 3032, 3032,
+ 3032, 3032, 3032, 3032, 3032, 3032, 3032, 3032,
+ 3032, 3032, 3032, 3032, 3032, 3032, 3032, 3032,
+ 3032, 3032, 3032, 3032, 3032, 3032, 3032, 3032,
+ 3032, 3032, 3032, 3032, 3032, 3032, 3032, 3032,
+ 3032, 3032, 3032, 3032, 3032, 3032, 3032, 3032,
+ 3032, 3032, 3032, 3032, 3032, 3032, 3032, 3032,
+ 3032, 3032, 3032, 3032, 3032, 3032, 3032, 3032,
+ 3032, 3032, 3032, 3032, 3032, 3032, 3032, 3032,
+ 3032, 3032, 3032, 3032, 3032, 3032, 3032, 3032,
+ 3032, 3032, 3032, 3032, 3032, 3032, 3032, 3032,
+ 3032, 3032, 3032, 3032, 3032, 3032, 3032, 3032,
+ 3032, 3032, 3032, 3032, 3032, 3032, 3032, 3032,
+ 3032, 3032, 3032, 3032, 3032, 3032, 3032, 3032,
+ 3032, 3032, 3032, 3032, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
@@ -6175,3909 +5169,5277 @@ static const unsigned short uc_property_trie[] = {
3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
- 3033, 3033, 3033, 3033, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 3025, 3025, 3025, 3025, 3025, 3025, 3025, 3025,
- 3025, 3025, 3025, 3025, 3025, 3025, 2980, 2980,
- 3023, 3023, 3023, 3023, 2992, 2980, 2980, 2980,
- 3023, 3023, 3023, 3024, 3024, 2980, 2980, 2980,
- 3023, 3023, 3023, 2992, 2992, 2992, 2992, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 3023, 3023, 3023, 3023, 3023, 3023, 2992, 2992,
- 2992, 2992, 2992, 2992, 2992, 2992, 2992, 2992,
- 2992, 2992, 2992, 2992, 2992, 2992, 2992, 2992,
- 2992, 3024, 3024, 3024, 3024, 2980, 2980, 2980,
- 2992, 2992, 2992, 2992, 2992, 2992, 2992, 3024,
- 3024, 3024, 3024, 2980, 2980, 2980, 2980, 2980,
- 2992, 2992, 2992, 3034, 3034, 3034, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2992, 2992, 2992, 2992, 2992, 2992, 2992, 3024,
- 3024, 3024, 2980, 2980, 2980, 2980, 2980, 2980,
- 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 3034, 3034, 3034, 3034, 3034, 3034, 3034, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
-
- 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671,
- 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671,
- 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671,
- 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671,
- 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671,
- 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671,
- 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671,
- 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671,
- 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671,
- 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671,
- 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671,
- 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671,
- 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671,
- 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671,
- 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671,
- 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671,
- 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671,
- 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671,
- 1671, 1671, 1671, 206, 1671, 1671, 1671, 1671,
- 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671,
- 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671,
- 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671,
- 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671,
- 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671,
- 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671,
- 1671, 1671, 1671, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 3035, 3036, 3037, 3038, 3039, 3040, 3041, 3042,
- 3043, 3044, 206, 206, 206, 206, 206, 206,
-
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
-
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
- 2980, 2980, 2980, 2980, 2980, 2980, 3045, 3045,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
- 3046, 3046, 3046, 3046, 3046, 3046, 3046, 3046,
- 3046, 3046, 3046, 3046, 3046, 3046, 3046, 3046,
- 3046, 3046, 3046, 3046, 3046, 3046, 3046, 3046,
- 3046, 3046, 3046, 3046, 3046, 3046, 3046, 3046,
- 3046, 3046, 3046, 3046, 3046, 3046, 3046, 3046,
- 3046, 3046, 3046, 3046, 3046, 3046, 3046, 3046,
- 3046, 3046, 3046, 3046, 3046, 3046, 3046, 3046,
- 3046, 3046, 3046, 3046, 3046, 3046, 3046, 3046,
- 3046, 3046, 3046, 3046, 3046, 3046, 3046, 3046,
- 3046, 3046, 3046, 3046, 3046, 3046, 3046, 3046,
- 3046, 3046, 3046, 3046, 3046, 3046, 3046, 3046,
- 3046, 3046, 3046, 3046, 3046, 3046, 3046, 3046,
- 3046, 3046, 3046, 3046, 3046, 3046, 3046, 3046,
- 3046, 3046, 3046, 3046, 3046, 3046, 3046, 3046,
- 3046, 3046, 3046, 3046, 3046, 3046, 3046, 3046,
- 3046, 3046, 3046, 3046, 3046, 3046, 3046, 3046,
- 3046, 3046, 3046, 3046, 3046, 3046, 3046, 3046,
- 3046, 3046, 3046, 3046, 3046, 3046, 3046, 3046,
- 3046, 3046, 3046, 3046, 3046, 3046, 3046, 3046,
- 3046, 3046, 3046, 3046, 3046, 3046, 3046, 3046,
- 3046, 3046, 3046, 3046, 3046, 3046, 3046, 3046,
- 3046, 3046, 3046, 3046, 3046, 3046, 3046, 3046,
- 3046, 3046, 3046, 3046, 3046, 3046, 3046, 3046,
- 3046, 3046, 3046, 3046, 3046, 3046, 3046, 3046,
- 3046, 3046, 3046, 3046, 3046, 3046, 3046, 3046,
- 3046, 3046, 3046, 3046, 3046, 3046, 3046, 3046,
- 3046, 3046, 3046, 3046, 3046, 3046, 3046, 3046,
- 3046, 3046, 3046, 3046, 3046, 3046, 3046, 3046,
- 3046, 3046, 3046, 3046, 3046, 3046, 3046, 3046,
- 3046, 3046, 3046, 3046, 3046, 3046, 3046, 3046,
- 3046, 3046, 3046, 3046, 3046, 3046, 3046, 3046,
- 3046, 3046, 3046, 3046, 3046, 3046, 3046, 3046,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 221,
+ 221, 1544, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3034, 3034,
+ 3034, 3034, 3034, 3034, 3034, 3035, 3036, 3037,
+ 3037, 3037, 3033, 3033, 3033, 3038, 3035, 3035,
+ 3035, 3035, 3035, 3039, 3039, 3039, 3039, 3039,
+ 3039, 3039, 3039, 3040, 3040, 3040, 3040, 3040,
+ 3040, 3040, 3040, 3033, 3033, 3041, 3041, 3041,
+ 3041, 3041, 3040, 3040, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3041, 3041, 3041, 3041, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3034, 3034, 3034, 3034, 3034,
+ 3034, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3042, 3042,
+ 3042, 3042, 3042, 3042, 3042, 3042, 3042, 3042,
+ 3042, 3043, 3043, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353,
+ 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353,
+ 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353,
+ 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353,
+ 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353,
+ 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353,
+ 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353,
+ 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353,
+ 2353, 2353, 3044, 3044, 3044, 2353, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 3045, 3045, 3045, 3045, 3045, 3045, 3045, 3045,
+ 3045, 3045, 3045, 3045, 3045, 3045, 3045, 3045,
+ 3045, 3045, 3045, 3045, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
3046, 3046, 3046, 3046, 3046, 3046, 3046, 3046,
3046, 3046, 3046, 3046, 3046, 3046, 3046, 3046,
- 3046, 3046, 3046, 3046, 3046, 3046, 3046, 3046,
- 3046, 3046, 3046, 3046, 3046, 3046, 3046, 3046,
- 3046, 3046, 3046, 3046, 3046, 3046, 3046, 3046,
- 3046, 3046, 3046, 3046, 3046, 3046, 3046, 3046,
- 3046, 3046, 3046, 3046, 3046, 3046, 3046, 3046,
- 3046, 3046, 3046, 3046, 3046, 3046, 3046, 3046,
- 3046, 3046, 3046, 3046, 3046, 3046, 3046, 3046,
- 3046, 3046, 3046, 3046, 3046, 3046, 3046, 3046,
- 3046, 3046, 3046, 3046, 3046, 3046, 3046, 3046,
- 3046, 3046, 3046, 3046, 3046, 3046, 3046, 3046,
- 3046, 3046, 3046, 3046, 3046, 3046, 3046, 3046,
- 3046, 3046, 3046, 3046, 3046, 3046, 3046, 3046,
- 3046, 3046, 3046, 3046, 3046, 3046, 3046, 3046,
- 3046, 3046, 3046, 3046, 3046, 3046, 3046, 3046,
- 3046, 3046, 3046, 3046, 3046, 3046, 3046, 3046,
- 3046, 3046, 3046, 3046, 3046, 3046, 3046, 3046,
- 3046, 3046, 3046, 3046, 3046, 3046, 3046, 3046,
- 3046, 3046, 3046, 3046, 3046, 3046, 3046, 3046,
- 3046, 3046, 3046, 3046, 3046, 3046, 3046, 3046,
- 3046, 3046, 3046, 3046, 3046, 3046, 3046, 3046,
- 3046, 3046, 3046, 3046, 3046, 3046, 3046, 3046,
- 3046, 3046, 3046, 3046, 3046, 3046, 3046, 3046,
- 3046, 3046, 3046, 3046, 3046, 3046, 3046, 3046,
- 3046, 3046, 3046, 3046, 3046, 3046, 3046, 3046,
- 3046, 3046, 3046, 3046, 3046, 3046, 3046, 1815,
- 1815, 1815, 1815, 1815, 1815, 1815, 1824, 1824,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
-
- 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819,
- 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819,
- 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819,
- 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819,
- 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819,
- 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819,
- 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819,
- 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819,
- 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819,
- 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819,
- 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819,
- 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819,
- 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819,
- 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819,
- 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819,
- 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819,
- 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819,
- 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819,
- 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819,
- 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819,
- 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819,
- 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819,
- 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819,
- 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819,
- 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819,
- 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819,
- 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819,
- 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819,
- 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819,
- 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819,
- 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819,
- 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819,
-
- 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819,
- 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819,
- 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819,
- 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819,
- 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819,
- 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819,
- 1819, 1819, 1819, 1819, 1819, 1824, 1824, 1824,
- 1824, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 3047, 3047, 3047, 3047, 3047, 3047, 3047, 3047,
- 3047, 3047, 3047, 3047, 3047, 3047, 3047, 3047,
- 3047, 3047, 3047, 3047, 3047, 3047, 3047, 3047,
- 3047, 3047, 3047, 3047, 3047, 3047, 3047, 3047,
- 3047, 3047, 3047, 3047, 3047, 3047, 3047, 3047,
- 3047, 3047, 3047, 3047, 3047, 3047, 3047, 3047,
- 3047, 3047, 3047, 3047, 3047, 3047, 3047, 3047,
- 3047, 3047, 3047, 3047, 3047, 3047, 3047, 3047,
- 3047, 3047, 3047, 3047, 3047, 3047, 3047, 3047,
- 3047, 3047, 3047, 3047, 3047, 3047, 3047, 3047,
- 3047, 3047, 3047, 3047, 3047, 3047, 3047, 3047,
- 3047, 3047, 3047, 3047, 3047, 3047, 3047, 3047,
- 3047, 3047, 3047, 3047, 3047, 3047, 3047, 3047,
- 3047, 3047, 3047, 3047, 3047, 3047, 3047, 3047,
- 3047, 3047, 3047, 3047, 3047, 3047, 3047, 3047,
- 3047, 3047, 3047, 3047, 3047, 3047, 3047, 3047,
- 3047, 3047, 3047, 3047, 3047, 3047, 3047, 3047,
- 3047, 3047, 3047, 3047, 3047, 3047, 3047, 3047,
- 3047, 3047, 3047, 3047, 3047, 3047, 3047, 3047,
- 3047, 3047, 3047, 3047, 3047, 3047, 3047, 3047,
- 3047, 3047, 3047, 3047, 3047, 3047, 3047, 3047,
- 3047, 3047, 3047, 3047, 3047, 3047, 3047, 3047,
+ 3046, 3046, 3046, 3046, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606,
+ 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606,
+ 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606,
+ 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606,
+ 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606,
+ 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606,
+ 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606,
+ 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606,
+ 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606,
+ 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606,
+ 1606, 1606, 1606, 1606, 1606, 1606, 1606, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
3047, 3047, 3047, 3047, 3047, 3047, 3047, 3047,
3047, 3047, 3047, 3047, 3047, 3047, 3047, 3047,
+ 3047, 3047, 3046, 3046, 3046, 3046, 3046, 3046,
+ 3046, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
- 3047, 3047, 3047, 3047, 3047, 3047, 3047, 3047,
- 3047, 3047, 3047, 3047, 3047, 3047, 3047, 3047,
- 3047, 3047, 3047, 3047, 3047, 3047, 3047, 3047,
- 3047, 3047, 3047, 3047, 3047, 3047, 2134, 2134,
- 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
- 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
- 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
- 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
- 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
- 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
- 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
- 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
- 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
- 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
- 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
- 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
- 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
- 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
- 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
- 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
- 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
- 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
- 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
- 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
- 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
- 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
- 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
- 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
- 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
- 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
- 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
- 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
-
- 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
- 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
- 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
- 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
- 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
- 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
- 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
- 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
- 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
- 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
- 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
- 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
- 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
- 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
- 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
- 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
- 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
- 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
- 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
- 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
- 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
- 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
- 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
- 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
- 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
- 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
- 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
- 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
- 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
- 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
- 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
- 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
-
- 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
- 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
- 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
- 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
- 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
- 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
- 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
- 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
- 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
- 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
- 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
- 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
- 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
- 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
- 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
- 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
- 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
- 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
- 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
- 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
- 1821, 1821, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
- 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
- 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
- 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
- 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
- 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
- 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
- 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
- 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
- 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
-
- 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
- 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
- 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
- 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
- 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
- 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
- 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
- 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
- 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
- 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
- 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
- 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
- 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
- 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
- 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
- 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
- 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
- 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
- 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
- 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
- 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
- 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
- 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
- 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
- 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
- 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
- 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
- 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
- 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
- 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
- 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
- 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
-
- 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
- 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
- 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
- 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
- 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
- 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
- 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
- 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
- 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
- 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
- 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
- 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
- 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
- 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
- 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
- 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
- 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
- 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
- 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
- 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
- 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
- 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
- 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
- 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
- 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
- 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
- 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
- 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
- 1822, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
-
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
-
- 3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
- 3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
+ 3048, 3048, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3048, 3048, 3048, 3048,
3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
+ 3048, 3048, 3048, 3048, 3048, 3048, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3049, 221, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049,
3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
+ 3048, 3048, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3048, 221, 3048, 3048,
+ 221, 221, 3048, 221, 221, 3048, 3048, 221,
+ 221, 3048, 3048, 3048, 3048, 221, 3048, 3048,
+ 3048, 3048, 3048, 3048, 3048, 3048, 3049, 3049,
+ 3049, 3049, 221, 3049, 221, 3049, 3049, 3049,
+ 3049, 3050, 3049, 3049, 221, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049,
3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
- 3049, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
- 3048, 3048, 3048, 3048, 3049, 3048, 3048, 3048,
- 3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
- 3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
- 3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
- 3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
- 3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
- 3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
- 3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
- 3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
- 3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
- 3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
+ 3048, 3048, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049,
+
+ 3049, 3049, 3049, 3049, 3048, 3048, 221, 3048,
+ 3048, 3048, 3048, 221, 221, 3048, 3048, 3048,
+ 3048, 3048, 3048, 3048, 3048, 221, 3048, 3048,
+ 3048, 3048, 3048, 3048, 3048, 221, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3048, 3048, 221, 3048, 3048, 3048, 3048, 221,
+ 3048, 3048, 3048, 3048, 3048, 221, 3048, 221,
+ 221, 221, 3048, 3048, 3048, 3048, 3048, 3048,
+ 3048, 221, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3048, 3048, 3048, 3048,
3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
+ 3048, 3048, 3048, 3048, 3048, 3048, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049,
3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
+ 3048, 3048, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3048, 3048, 3048, 3048,
3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
+ 3048, 3048, 3048, 3048, 3048, 3048, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049,
3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
- 3048, 3048, 3048, 3048, 3048, 3048, 3048, 3049,
- 3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
- 3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
- 3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
- 3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
+ 3048, 3048, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3048, 3048, 3048, 3048,
3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
+ 3048, 3048, 3048, 3048, 3048, 3048, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049,
3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
- 3048, 3048, 3048, 3048, 3048, 3048, 3048, 3049,
3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
+ 3048, 3048, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3049, 1536, 1536, 221, 221,
3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
+ 3048, 3051, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3052, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3048, 3048, 3048, 3048, 3048, 3048,
3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
+ 3048, 3048, 3048, 3051, 3049, 3049, 3049, 3049,
+
+ 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3049, 3052, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3048, 3048, 3048, 3048,
3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
+ 3048, 3048, 3048, 3048, 3048, 3051, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3052,
+ 3049, 3049, 3049, 3049, 3049, 3049, 3048, 3048,
3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
- 3048, 3048, 3048, 3048, 3048, 3048, 3048, 3049,
- 3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
- 3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
- 3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
- 3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
- 3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
+ 3048, 3048, 3048, 3048, 3048, 3048, 3048, 3051,
+ 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3052, 3049, 3049, 3049, 3049, 3049, 3049,
3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
+ 3048, 3051, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3049, 3052, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3053, 3054, 221, 221, 3055, 3056,
+ 3057, 3058, 3059, 3060, 3061, 3062, 3063, 3064,
+ 3055, 3056, 3057, 3058, 3059, 3060, 3061, 3062,
+ 3063, 3064, 3055, 3056, 3057, 3058, 3059, 3060,
+ 3061, 3062, 3063, 3064, 3055, 3056, 3057, 3058,
+ 3059, 3060, 3061, 3062, 3063, 3064, 3055, 3056,
+ 3057, 3058, 3059, 3060, 3061, 3062, 3063, 3064,
+
+ 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065,
+ 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065,
+ 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065,
+ 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065,
+ 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065,
+ 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065,
+ 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065,
+ 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065,
+ 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065,
+ 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065,
+ 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065,
+ 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065,
+ 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065,
+ 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065,
+ 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065,
+ 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065,
+ 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065,
+ 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065,
+ 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065,
+ 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065,
+ 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065,
+ 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065,
+ 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065,
+ 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065,
+ 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065,
+ 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065,
+ 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065,
+ 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065,
+ 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065,
+ 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065,
+ 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065,
+ 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065,
+
+ 3066, 3066, 3066, 3066, 3066, 3066, 3066, 3066,
+ 3066, 3066, 3066, 3066, 3066, 3066, 3066, 3066,
+ 3066, 3066, 3066, 3066, 3066, 3066, 3066, 3066,
+ 3066, 3066, 3066, 3066, 3066, 3066, 3066, 3066,
+ 3066, 3066, 3066, 3066, 3066, 3066, 3066, 3066,
+ 3066, 3066, 3066, 3066, 3066, 3066, 3066, 3066,
+ 3066, 3066, 3066, 3066, 3066, 3066, 3066, 3065,
+ 3065, 3065, 3065, 3066, 3066, 3066, 3066, 3066,
+ 3066, 3066, 3066, 3066, 3066, 3066, 3066, 3066,
+ 3066, 3066, 3066, 3066, 3066, 3066, 3066, 3066,
+ 3066, 3066, 3066, 3066, 3066, 3066, 3066, 3066,
+ 3066, 3066, 3066, 3066, 3066, 3066, 3066, 3066,
+ 3066, 3066, 3066, 3066, 3066, 3066, 3066, 3066,
+ 3066, 3066, 3066, 3066, 3066, 3065, 3065, 3065,
+ 3065, 3065, 3065, 3065, 3065, 3066, 3065, 3065,
+ 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065,
+ 3065, 3065, 3065, 3065, 3066, 3065, 3065, 3067,
+ 3068, 3067, 3067, 3069, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 3066, 3066, 3066, 3066, 3066,
+ 221, 3066, 3066, 3066, 3066, 3066, 3066, 3066,
+ 3066, 3066, 3066, 3066, 3066, 3066, 3066, 3066,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988,
+ 1988, 1988, 3070, 1988, 1988, 1988, 1988, 1988,
+ 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988,
+ 1988, 1988, 1988, 1988, 1988, 1988, 1988, 221,
+ 221, 221, 221, 221, 221, 3071, 3071, 3071,
+ 3071, 3071, 3071, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 3072, 3072, 3072, 3072, 3072, 3072, 3072, 221,
+ 3072, 3072, 3072, 3072, 3072, 3072, 3072, 3072,
+ 3072, 3072, 3072, 3072, 3072, 3072, 3072, 3072,
+ 3072, 221, 221, 3072, 3072, 3072, 3072, 3072,
+ 3072, 3072, 221, 3072, 3072, 221, 3072, 3072,
+ 3072, 3072, 3072, 221, 221, 221, 221, 221,
+ 3073, 3073, 3073, 3073, 3073, 3073, 3073, 3073,
+ 3073, 3073, 3073, 3073, 3073, 3073, 3073, 3073,
+ 3073, 3073, 3073, 3073, 3073, 3073, 3073, 3073,
+ 3073, 3073, 3073, 3073, 3073, 3073, 3073, 3073,
+ 3073, 3073, 3073, 3073, 3073, 3073, 3073, 3073,
+ 3073, 3073, 3073, 3073, 3073, 3073, 3073, 3073,
+ 3073, 3073, 3073, 3073, 3073, 3073, 3073, 3073,
+ 3073, 3073, 3073, 3073, 3073, 3073, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 3074,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 3075, 3075, 3075, 3075, 3075, 3075, 3075, 3075,
+ 3075, 3075, 3075, 3075, 3075, 3075, 3075, 3075,
+ 3075, 3075, 3075, 3075, 3075, 3075, 3075, 3075,
+ 3075, 3075, 3075, 3075, 3075, 3075, 3075, 3075,
+ 3075, 3075, 3075, 3075, 3075, 3075, 3075, 3075,
+ 3075, 3075, 3075, 3075, 3075, 221, 221, 221,
+ 3076, 3076, 3076, 3076, 3076, 3076, 3076, 3077,
+ 3077, 3077, 3077, 3077, 3077, 3077, 221, 221,
+ 3078, 3079, 3080, 3081, 3082, 3083, 3084, 3085,
+ 3086, 3087, 221, 221, 221, 221, 3075, 3088,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 3089, 3089, 3089, 3089, 3089, 3089, 3089, 3089,
+ 3089, 3089, 3089, 3089, 3089, 3089, 3089, 3089,
+ 3089, 3089, 3089, 3089, 3089, 3089, 3089, 3089,
+ 3089, 3089, 3089, 3089, 3089, 3089, 3090, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 3091, 3091, 3091, 3091, 3091, 3091, 3091, 3091,
+ 3091, 3091, 3091, 3091, 3091, 3091, 3091, 3091,
+ 3091, 3091, 3091, 3091, 3091, 3091, 3091, 3091,
+ 3091, 3091, 3091, 3091, 3091, 3091, 3091, 3091,
+ 3091, 3091, 3091, 3091, 3091, 3091, 3091, 3091,
+ 3091, 3091, 3091, 3091, 3092, 3092, 3092, 3092,
+ 3093, 3094, 3095, 3096, 3097, 3098, 3099, 3100,
+ 3101, 3102, 221, 221, 221, 221, 221, 3103,
+
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 3104, 3104, 3104, 3104, 3104, 3104, 3104, 3104,
+ 3104, 3104, 3104, 3104, 3104, 3104, 3104, 3104,
+ 3104, 3104, 3104, 3104, 3104, 3104, 3104, 3104,
+ 3104, 3104, 3104, 3105, 3106, 3106, 3107, 3108,
+ 3109, 3110, 3111, 3112, 3113, 3114, 3115, 3116,
+ 3117, 3118, 221, 221, 221, 221, 221, 221,
+
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 3119, 3119, 3119, 3119, 3119, 3119, 3119, 221,
+ 3119, 3119, 3119, 3119, 221, 3119, 3119, 221,
+ 3119, 3119, 3119, 3119, 3119, 3119, 3119, 3119,
+ 3119, 3119, 3119, 3119, 3119, 3119, 3119, 221,
+
+ 3120, 3120, 3120, 3120, 3120, 3120, 3120, 3120,
+ 3120, 3120, 3120, 3120, 3120, 3120, 3120, 3120,
+ 3120, 3120, 3120, 3120, 3120, 3120, 3120, 3120,
+ 3120, 3120, 3120, 3120, 3120, 3120, 3120, 3120,
+ 3120, 3120, 3120, 3120, 3120, 3120, 3120, 3120,
+ 3120, 3120, 3120, 3120, 3120, 3120, 3120, 3120,
+ 3120, 3120, 3120, 3120, 3120, 3120, 3120, 3120,
+ 3120, 3120, 3120, 3120, 3120, 3120, 3120, 3120,
+ 3120, 3120, 3120, 3120, 3120, 3120, 3120, 3120,
+ 3120, 3120, 3120, 3120, 3120, 3120, 3120, 3120,
+ 3120, 3120, 3120, 3120, 3120, 3120, 3120, 3120,
+ 3120, 3120, 3120, 3120, 3120, 3120, 3120, 3120,
+ 3120, 3120, 3120, 3120, 3120, 3120, 3120, 3120,
+ 3120, 3120, 3120, 3120, 3120, 3120, 3120, 3120,
+ 3120, 3120, 3120, 3120, 3120, 3120, 3120, 3120,
+ 3120, 3120, 3120, 3120, 3120, 3120, 3120, 3120,
+ 3120, 3120, 3120, 3120, 3120, 3120, 3120, 3120,
+ 3120, 3120, 3120, 3120, 3120, 3120, 3120, 3120,
+ 3120, 3120, 3120, 3120, 3120, 3120, 3120, 3120,
+ 3120, 3120, 3120, 3120, 3120, 3120, 3120, 3120,
+ 3120, 3120, 3120, 3120, 3120, 3120, 3120, 3120,
+ 3120, 3120, 3120, 3120, 3120, 3120, 3120, 3120,
+ 3120, 3120, 3120, 3120, 3120, 3120, 3120, 3120,
+ 3120, 3120, 3120, 3120, 3120, 3120, 3120, 3120,
+ 3120, 3120, 3120, 3120, 3120, 323, 323, 3121,
+ 3121, 3121, 3121, 3121, 3121, 3121, 3121, 3121,
+ 3122, 3122, 3122, 3122, 3122, 3122, 3122, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+
+ 3123, 3123, 3123, 3123, 3123, 3123, 3123, 3123,
+ 3123, 3123, 3123, 3123, 3123, 3123, 3123, 3123,
+ 3123, 3123, 3123, 3123, 3123, 3123, 3123, 3123,
+ 3123, 3123, 3123, 3123, 3123, 3123, 3123, 3123,
+ 3123, 3123, 3124, 3124, 3124, 3124, 3124, 3124,
+ 3124, 3124, 3124, 3124, 3124, 3124, 3124, 3124,
+ 3124, 3124, 3124, 3124, 3124, 3124, 3124, 3124,
+ 3124, 3124, 3124, 3124, 3124, 3124, 3124, 3124,
+ 3124, 3124, 3124, 3124, 3125, 3125, 3125, 3125,
+ 3125, 3125, 3126, 3127, 323, 323, 323, 323,
+ 3128, 3129, 3130, 3131, 3132, 3133, 3134, 3135,
+ 3136, 3137, 323, 323, 323, 323, 3138, 3138,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 3139, 3139, 3139, 3139, 3139, 3139, 3139,
+ 3139, 3139, 3139, 3139, 3139, 3139, 3139, 3139,
+ 3139, 3139, 3139, 3139, 3139, 3139, 3139, 3139,
+ 3139, 3139, 3139, 3139, 3139, 3139, 3139, 3139,
+ 3139, 3139, 3139, 3139, 3139, 3139, 3139, 3139,
+ 3139, 3139, 3139, 3139, 3139, 3139, 3139, 3139,
+ 3139, 3139, 3139, 3139, 3139, 3139, 3139, 3139,
+ 3139, 3139, 3139, 3139, 3140, 3139, 3139, 3139,
+ 3141, 3139, 3139, 3139, 3139, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+
+ 323, 3142, 3142, 3142, 3142, 3142, 3142, 3142,
+ 3142, 3142, 3142, 3142, 3142, 3142, 3142, 3142,
+ 3142, 3142, 3142, 3142, 3142, 3142, 3142, 3142,
+ 3142, 3142, 3142, 3142, 3142, 3142, 3142, 3142,
+ 3142, 3142, 3142, 3142, 3142, 3142, 3142, 3142,
+ 3142, 3142, 3142, 3142, 3142, 3142, 3143, 3142,
+ 3142, 3142, 3142, 3142, 3142, 3142, 3142, 3142,
+ 3142, 3142, 3142, 3142, 3142, 3142, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323,
+
+ 3144, 3144, 3144, 3144, 437, 3144, 3144, 3144,
+ 3144, 3144, 3144, 3144, 3144, 3144, 3144, 3144,
+ 3144, 3144, 3144, 3144, 3144, 3144, 3144, 3144,
+ 3144, 3144, 3144, 3144, 3144, 3144, 3144, 3144,
+ 437, 3144, 3144, 437, 3144, 437, 437, 3144,
+ 437, 3144, 3144, 3144, 3144, 3144, 3144, 3144,
+ 3144, 3144, 3144, 437, 3144, 3144, 3144, 3144,
+ 437, 3144, 437, 3144, 437, 437, 437, 437,
+ 437, 437, 3144, 437, 437, 437, 437, 3144,
+ 437, 3144, 437, 3144, 437, 3144, 3144, 3144,
+ 437, 3144, 3144, 437, 3144, 437, 437, 3144,
+ 437, 3144, 437, 3144, 437, 3144, 437, 3144,
+ 437, 3144, 3144, 437, 3144, 437, 437, 3144,
+ 3144, 3144, 3144, 437, 3144, 3144, 3144, 3144,
+ 3144, 3144, 3144, 437, 3144, 3144, 3144, 3144,
+ 437, 3144, 3144, 3144, 3144, 437, 3144, 437,
+ 3144, 3144, 3144, 3144, 3144, 3144, 3144, 3144,
+ 3144, 3144, 437, 3144, 3144, 3144, 3144, 3144,
+ 3144, 3144, 3144, 3144, 3144, 3144, 3144, 3144,
+ 3144, 3144, 3144, 3144, 437, 437, 437, 437,
+ 437, 3144, 3144, 3144, 437, 3144, 3144, 3144,
+ 3144, 3144, 437, 3144, 3144, 3144, 3144, 3144,
+ 3144, 3144, 3144, 3144, 3144, 3144, 3144, 3144,
+ 3144, 3144, 3144, 3144, 437, 437, 437, 437,
+ 437, 437, 437, 437, 437, 437, 437, 437,
+ 437, 437, 437, 437, 437, 437, 437, 437,
+ 437, 437, 437, 437, 437, 437, 437, 437,
+ 437, 437, 437, 437, 437, 437, 437, 437,
+ 437, 437, 437, 437, 437, 437, 437, 437,
+ 437, 437, 437, 437, 437, 437, 437, 437,
+ 3145, 3145, 437, 437, 437, 437, 437, 437,
+ 437, 437, 437, 437, 437, 437, 437, 437,
+
+ 1681, 1681, 1681, 1681, 3146, 1681, 1681, 1681,
+ 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681,
+ 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681,
+ 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681,
+ 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681,
+ 1681, 1681, 1681, 1681, 3147, 3147, 3147, 3147,
+ 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681,
+ 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681,
+ 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681,
+ 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681,
+ 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681,
+ 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681,
+ 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681,
+ 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681,
+ 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681,
+ 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681,
+ 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681,
+ 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681,
+ 1681, 1681, 1681, 1681, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612,
+ 1612, 1612, 1612, 1612, 1612, 1612, 1612, 3147,
+ 3147, 1612, 1612, 1612, 1612, 1612, 1612, 1612,
+ 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1683,
+ 3147, 1612, 1612, 1612, 1612, 1612, 1612, 1612,
+ 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1611,
+ 3147, 1612, 1612, 1612, 1612, 1612, 1612, 1612,
+ 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612,
+ 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683,
+ 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683,
+ 1683, 1683, 1683, 1683, 1683, 1683, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+
+ 3148, 3148, 3149, 3150, 3151, 3152, 3153, 3154,
+ 3155, 3156, 3157, 3158, 3158, 3159, 3159, 3159,
+ 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160,
+ 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160,
+ 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160,
+ 3160, 3160, 3161, 3161, 3161, 3161, 3162, 3163,
+ 3164, 3165, 3164, 3164, 3164, 3164, 3164, 3164,
+ 3164, 3164, 3164, 3164, 3164, 3165, 3164, 3165,
+ 3164, 3164, 3165, 3164, 3164, 3164, 3165, 3164,
+ 3164, 3164, 3161, 3161, 3161, 3161, 3161, 3166,
+ 3167, 3167, 3167, 3167, 3167, 3167, 3167, 3168,
+ 3167, 3167, 3167, 3167, 3167, 3167, 3167, 3168,
+ 3167, 3167, 3167, 3167, 3167, 3167, 3167, 3167,
+ 3167, 3167, 3169, 3169, 3170, 3159, 3159, 3159,
+ 3171, 3171, 3167, 3167, 3167, 3167, 3167, 3167,
+ 3167, 3168, 3167, 3168, 3168, 3167, 3171, 3172,
+ 3167, 3167, 3167, 3167, 3167, 3167, 3167, 3167,
+ 3167, 3167, 3173, 3173, 3173, 3173, 3174, 3175,
+ 3161, 3174, 3174, 3174, 3174, 3174, 3174, 3174,
+ 3174, 3174, 3174, 3176, 3176, 3176, 3176, 3176,
+ 3176, 3176, 3176, 3176, 3176, 3176, 3176, 3176,
+ 3176, 3176, 3176, 3176, 3176, 3159, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3177, 3177,
+ 3177, 3177, 3177, 3177, 3177, 3177, 3177, 3177,
+ 3177, 3177, 3177, 3177, 3177, 3177, 3177, 3177,
+ 3177, 3177, 3177, 3177, 3177, 3177, 3177, 3177,
+
+ 3178, 3179, 3179, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891,
+ 1891, 1891, 3180, 1891, 1891, 1891, 1891, 1891,
+ 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891,
+ 1891, 1891, 1891, 1891, 1891, 1891, 1891, 3180,
+ 1891, 1891, 3179, 3179, 3179, 3179, 3179, 3179,
+ 3179, 3179, 3179, 3181, 3147, 3147, 3147, 3147,
+ 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891,
+ 1891, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3179, 3179, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3182, 3182, 3182, 3182, 3182, 3182, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1683, 1683, 1683, 1683, 1683, 1683, 1683,
+ 1683, 1683, 1683, 1683, 1683, 3183, 3183, 3183,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1683, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1683, 3183, 3183,
+ 1611, 1611, 1611, 1611, 1611, 1684, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1683, 1683, 1683, 1683,
+ 1683, 1683, 1683, 1683, 1614, 1614, 1683, 1683,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1609, 1609, 1611,
+ 1611, 1611, 1611, 1611, 1609, 1611, 1611, 1611,
+ 1611, 1611, 1684, 1684, 1684, 3184, 1611, 1684,
+ 1611, 1611, 1684, 3185, 3185, 1683, 1683, 3183,
+ 3183, 3183, 3183, 3183, 1683, 1683, 1683, 1683,
+ 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1683, 1683, 1683, 3184, 1683, 1683, 1683,
+ 3183, 3183, 3183, 3186, 3186, 3186, 3186, 3186,
+
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1683,
+ 1611, 1683, 1684, 1684, 1611, 1611, 1684, 1684,
+ 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684,
+ 1684, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1684, 1684,
+ 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684,
+ 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684,
+ 1684, 1611, 1611, 1611, 1684, 1611, 1611, 1611,
+ 1611, 1684, 1684, 1684, 1611, 1684, 1684, 1684,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1684,
+ 1611, 1684, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1609, 1611, 1609, 1611, 1609, 1611, 1611, 1611,
+ 1611, 1611, 1684, 1611, 1611, 1611, 1611, 1609,
+ 1611, 1609, 1609, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 3184, 1611, 1611, 1611, 1611, 1683, 1683, 3183,
+
+ 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1609,
+ 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609,
+ 1609, 1609, 1609, 1609, 1609, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1609, 1609, 1609, 1609, 1609, 1609,
+ 1609, 1609, 1609, 1609, 1609, 1609, 1613, 1613,
+ 3187, 3187, 3187, 3187, 1613, 1613, 1614, 1614,
+ 1614, 1614, 1683, 3183, 3183, 3183, 3183, 3188,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683,
+ 1683, 1683, 1683, 1683, 3185, 3185, 1683, 1683,
+ 1683, 1683, 3189, 1683, 1683, 1683, 1683, 1683,
+ 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683,
+ 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683,
+ 3185, 1683, 1683, 1683, 1683, 3190, 3190, 1683,
+ 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683,
+ 1683, 1683, 1683, 1683, 3191, 1683, 1683, 1683,
+ 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683,
+ 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683,
+ 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683,
+ 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683,
+ 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683,
+ 1683, 1683, 1683, 1683, 1614, 1614, 1614, 1614,
+ 1614, 1614, 1614, 1614, 1683, 1683, 1683, 1683,
+ 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683,
+ 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683,
+ 1683, 1683, 1683, 1683, 1614, 1614, 1614, 1614,
+ 1614, 1614, 1683, 1611, 1611, 1611, 1611, 1611,
+
+ 3192, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 3192, 1611, 1611, 1611, 3192, 1611, 3192,
+ 1611, 3192, 1611, 3192, 1611, 1611, 1611, 3192,
+ 1611, 1611, 1611, 1611, 1611, 1611, 3192, 3192,
+ 1611, 1611, 1611, 1611, 3192, 1611, 3192, 3192,
+ 1611, 1611, 1611, 1611, 3192, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 3184, 3184, 3183, 3183, 1684, 1684, 1684,
+ 1611, 1611, 1611, 1684, 1684, 1684, 1684, 1684,
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 1613, 1613, 1613, 1613, 1613, 1613, 3193, 3193,
+ 3193, 3194, 3194, 3194, 1613, 1613, 1613, 1613,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1684, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1611, 1611, 1611, 1611, 1684, 1684, 1684, 1611,
+ 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611,
+ 1684, 1611, 1611, 1611, 1611, 1611, 1683, 1683,
+ 1683, 1683, 1683, 1683, 3190, 1683, 1683, 1683,
+ 3183, 3191, 3191, 3195, 3195, 3196, 3197, 3197,
+ 3147, 3147, 3147, 3147, 3198, 3199, 3199, 3199,
+ 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683,
+ 1683, 1683, 1683, 3184, 3184, 3147, 3147, 3147,
+ 1683, 1683, 1683, 1683, 3191, 3191, 3191, 3182,
+ 3182, 3200, 3196, 3197, 3197, 3147, 3147, 3147,
+
+ 3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201,
+ 3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201,
+ 3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201,
+ 3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201,
+ 3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201,
+ 3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201,
+ 3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201,
+ 3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201,
+ 3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201,
+ 3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201,
+ 3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201,
+ 3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201,
+ 3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201,
+ 3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201,
+ 3201, 3201, 3201, 3201, 3202, 3202, 3202, 3147,
+ 3147, 3147, 3147, 3202, 3202, 3202, 3202, 3202,
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 1613, 1613, 1613, 1613, 1613, 3203, 3203, 3203,
+ 3203, 3202, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3196, 3196, 3196, 3196, 3196, 3196, 3196, 3196,
+ 3196, 3196, 3196, 3196, 3147, 3147, 3147, 3147,
+ 3199, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 1613, 1613, 1613, 1613, 3147, 3147, 3147, 3147,
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 1613, 1613, 3147, 3147, 3147, 3147, 3147, 3147,
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 1613, 1613, 1613, 1613, 1613, 1613, 3147, 3147,
+ 3159, 3159, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+
+ 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616,
+ 1616, 1616, 1616, 1616, 3204, 3196, 3196, 3205,
+ 3183, 3183, 3183, 3183, 3183, 3183, 3183, 3183,
+ 3206, 3189, 3189, 3189, 3189, 3189, 3189, 3207,
+ 3191, 3191, 3191, 3191, 3191, 3191, 3189, 3191,
+ 3182, 3182, 3182, 3182, 3182, 3182, 3182, 3182,
+ 3189, 3207, 3207, 3189, 3189, 3189, 3189, 3189,
+ 3189, 3189, 3191, 3208, 3189, 3189, 3189, 3196,
+ 3191, 3191, 3191, 3191, 3191, 3191, 3208, 3191,
+ 3191, 3191, 3191, 3191, 3182, 3200, 3200, 3200,
+ 3191, 3191, 3191, 3191, 3191, 3191, 3191, 3191,
+ 3191, 3191, 3191, 3191, 3191, 3191, 3191, 3182,
+ 3182, 3182, 3182, 3182, 3182, 3182, 3182, 3182,
+ 3182, 3182, 3182, 3182, 3200, 3200, 3200, 3200,
+ 3200, 3196, 3197, 3200, 3200, 3200, 3200, 3204,
+ 3197, 3199, 3200, 3196, 3200, 3200, 3200, 3200,
+ 3183, 3183, 3183, 3183, 3183, 3191, 3191, 3191,
+ 3191, 3191, 3191, 3191, 3191, 3191, 3191, 3191,
+ 3191, 3191, 3182, 3182, 3182, 3182, 3182, 3182,
+ 3200, 3200, 3200, 3200, 3200, 3200, 3200, 3200,
+ 3200, 3200, 3200, 3197, 3197, 3196, 3196, 3196,
+ 3196, 3196, 3196, 3197, 3197, 3197, 3196, 3196,
+ 3200, 3200, 3200, 3200, 3200, 3209, 3209, 3200,
+ 3209, 3209, 3196, 3205, 3196, 3196, 3196, 3196,
+ 3183, 3200, 3200, 3196, 3196, 3196, 3196, 3196,
+ 3196, 3196, 3196, 3197, 3199, 3205, 3205, 3205,
+ 3182, 3207, 3207, 3207, 3207, 3207, 3207, 3207,
+ 3207, 3207, 3207, 3207, 3207, 3207, 3182, 3182,
+ 3182, 3182, 3182, 3182, 3182, 3182, 3182, 3200,
+ 3200, 3200, 3200, 3200, 3200, 3200, 3200, 3200,
+ 3200, 3200, 3200, 3200, 3200, 3200, 3200, 3200,
+ 3200, 3200, 3200, 3200, 3200, 3200, 3200, 3200,
+
+ 3210, 3210, 3210, 3210, 3210, 3210, 3210, 3210,
+ 3210, 3210, 3210, 3210, 3210, 3210, 3210, 3210,
+ 3210, 3210, 3210, 3210, 3210, 3210, 3210, 3210,
+ 3210, 3210, 3210, 3210, 3210, 3210, 3210, 3210,
+ 3210, 3210, 3210, 3210, 3210, 3210, 3210, 3210,
+ 3210, 3210, 3210, 3210, 3210, 3210, 3210, 3210,
+ 3210, 3210, 3210, 3210, 3210, 3210, 3210, 3210,
+ 3210, 3210, 3210, 3210, 3210, 3210, 3210, 3210,
+ 3210, 3210, 3210, 3210, 3210, 3210, 3210, 3210,
+ 3210, 3210, 3210, 3210, 3210, 3210, 3210, 3210,
+ 3210, 3210, 3210, 3210, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3203, 3203, 3203, 3203, 3203, 3203, 3203, 3203,
+ 3203, 3203, 3203, 3203, 3203, 3203, 3147, 3147,
+ 3196, 3196, 3196, 3196, 3197, 3198, 3198, 3198,
+ 3196, 3196, 3196, 3199, 3199, 3147, 3147, 3147,
+ 3196, 3196, 3196, 3197, 3197, 3197, 3197, 3198,
+ 3198, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3196, 3196, 3196, 3196, 3196, 3196, 3197, 3197,
+ 3197, 3197, 3197, 3197, 3197, 3197, 3197, 3197,
+ 3197, 3197, 3197, 3197, 3197, 3197, 3197, 3197,
+ 3197, 3199, 3199, 3199, 3199, 3198, 3198, 3198,
+ 3197, 3197, 3197, 3197, 3197, 3197, 3197, 3199,
+ 3199, 3199, 3199, 3198, 3198, 3198, 3147, 3198,
+ 3197, 3197, 3197, 3211, 3211, 3211, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3198, 3198,
+ 3197, 3197, 3197, 3197, 3197, 3197, 3197, 3199,
+ 3199, 3199, 3198, 3198, 3147, 3147, 3147, 3147,
+ 3199, 3199, 3199, 3199, 3199, 3199, 3199, 3199,
+ 3198, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3212,
+ 3212, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+
+ 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751,
+ 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751,
+ 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751,
+ 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751,
+ 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751,
+ 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751,
+ 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751,
+ 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751,
+ 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751,
+ 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751,
+ 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751,
+ 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751,
+ 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751,
+ 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751,
+ 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751,
+ 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751,
+ 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751,
+ 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751,
+ 1751, 1751, 1751, 221, 1751, 1751, 1751, 1751,
+ 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751,
+ 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751,
+ 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751,
+ 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751,
+ 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751,
+ 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751,
+ 1751, 1751, 1751, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 3213, 3214, 3215, 3216, 3217, 3218, 3219, 3220,
+ 3221, 3222, 221, 221, 221, 221, 221, 221,
+
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3147, 3223, 3223,
+
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1911, 1911,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
- 3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
- 3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
- 3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
- 3048, 3048, 3048, 3048, 3048, 3048, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
-
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 3045, 3045,
-
- 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815,
- 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815,
- 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815,
- 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815,
- 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815,
- 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815,
- 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815,
- 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815,
- 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815,
- 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815,
- 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815,
- 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815,
- 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815,
- 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815,
- 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815,
- 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815,
- 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815,
- 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815,
- 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815,
- 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815,
- 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815,
- 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815,
- 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815,
- 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815,
- 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815,
- 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815,
- 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815,
- 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815,
- 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815,
- 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815,
- 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815,
- 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815,
-
- 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815,
- 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815,
- 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815,
- 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815,
- 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815,
- 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815,
- 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815,
- 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815,
- 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815,
- 1815, 1815, 1815, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
- 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
-
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 3045, 3045,
-
- 1436, 2892, 1436, 1436, 1436, 1436, 1436, 1436,
- 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436,
- 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436,
- 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436,
- 3050, 3050, 3050, 3050, 3050, 3050, 3050, 3050,
- 3050, 3050, 3050, 3050, 3050, 3050, 3050, 3050,
- 3050, 3050, 3050, 3050, 3050, 3050, 3050, 3050,
- 3050, 3050, 3050, 3050, 3050, 3050, 3050, 3050,
- 3050, 3050, 3050, 3050, 3050, 3050, 3050, 3050,
- 3050, 3050, 3050, 3050, 3050, 3050, 3050, 3050,
- 3050, 3050, 3050, 3050, 3050, 3050, 3050, 3050,
- 3050, 3050, 3050, 3050, 3050, 3050, 3050, 3050,
- 3050, 3050, 3050, 3050, 3050, 3050, 3050, 3050,
- 3050, 3050, 3050, 3050, 3050, 3050, 3050, 3050,
- 3050, 3050, 3050, 3050, 3050, 3050, 3050, 3050,
- 3050, 3050, 3050, 3050, 3050, 3050, 3050, 3050,
- 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436,
- 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436,
- 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436,
- 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436,
- 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436,
- 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436,
- 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436,
- 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436,
- 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436,
- 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436,
- 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436,
- 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436,
- 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436,
- 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436,
- 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436,
- 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436,
-
- 3051, 3051, 3051, 3051, 3051, 3051, 3051, 3051,
- 3051, 3051, 3051, 3051, 3051, 3051, 3051, 3051,
- 3051, 3051, 3051, 3051, 3051, 3051, 3051, 3051,
- 3051, 3051, 3051, 3051, 3051, 3051, 3051, 3051,
- 3051, 3051, 3051, 3051, 3051, 3051, 3051, 3051,
- 3051, 3051, 3051, 3051, 3051, 3051, 3051, 3051,
- 3051, 3051, 3051, 3051, 3051, 3051, 3051, 3051,
- 3051, 3051, 3051, 3051, 3051, 3051, 3051, 3051,
- 3051, 3051, 3051, 3051, 3051, 3051, 3051, 3051,
- 3051, 3051, 3051, 3051, 3051, 3051, 3051, 3051,
- 3051, 3051, 3051, 3051, 3051, 3051, 3051, 3051,
- 3051, 3051, 3051, 3051, 3051, 3051, 3051, 3051,
- 3051, 3051, 3051, 3051, 3051, 3051, 3051, 3051,
- 3051, 3051, 3051, 3051, 3051, 3051, 3051, 3051,
- 3051, 3051, 3051, 3051, 3051, 3051, 3051, 3051,
- 3051, 3051, 3051, 3051, 3051, 3051, 3051, 3051,
- 3051, 3051, 3051, 3051, 3051, 3051, 3051, 3051,
- 3051, 3051, 3051, 3051, 3051, 3051, 3051, 3051,
- 3051, 3051, 3051, 3051, 3051, 3051, 3051, 3051,
- 3051, 3051, 3051, 3051, 3051, 3051, 3051, 3051,
- 3051, 3051, 3051, 3051, 3051, 3051, 3051, 3051,
- 3051, 3051, 3051, 3051, 3051, 3051, 3051, 3051,
- 3051, 3051, 3051, 3051, 3051, 3051, 3051, 3051,
- 3051, 3051, 3051, 3051, 3051, 3051, 3051, 3051,
- 3051, 3051, 3051, 3051, 3051, 3051, 3051, 3051,
- 3051, 3051, 3051, 3051, 3051, 3051, 3051, 3051,
- 3051, 3051, 3051, 3051, 3051, 3051, 3051, 3051,
- 3051, 3051, 3051, 3051, 3051, 3051, 3051, 3051,
- 3051, 3051, 3051, 3051, 3051, 3051, 3051, 3051,
- 3051, 3051, 3051, 3051, 3051, 3051, 3051, 3051,
- 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436,
- 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436,
-
- 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436,
- 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436,
- 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436,
- 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436,
- 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436,
- 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436,
- 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436,
- 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436,
- 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436,
- 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436,
- 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436,
- 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436,
- 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436,
- 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436,
- 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436,
- 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436,
- 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436,
- 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436,
- 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436,
- 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436,
- 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436,
- 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436,
- 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436,
- 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436,
- 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436,
- 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436,
- 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436,
- 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436,
- 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436,
- 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436,
- 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436,
- 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436,
-
- 3052, 3052, 3052, 3052, 3052, 3052, 3052, 3052,
- 3052, 3052, 3052, 3052, 3052, 3052, 3052, 3052,
- 3052, 3052, 3052, 3052, 3052, 3052, 3052, 3052,
- 3052, 3052, 3052, 3052, 3052, 3052, 3052, 3052,
- 3052, 3052, 3052, 3052, 3052, 3052, 3052, 3052,
- 3052, 3052, 3052, 3052, 3052, 3052, 3052, 3052,
- 3052, 3052, 3052, 3052, 3052, 3052, 3052, 3052,
- 3052, 3052, 3052, 3052, 3052, 3052, 3052, 3052,
- 3052, 3052, 3052, 3052, 3052, 3052, 3052, 3052,
- 3052, 3052, 3052, 3052, 3052, 3052, 3052, 3052,
- 3052, 3052, 3052, 3052, 3052, 3052, 3052, 3052,
- 3052, 3052, 3052, 3052, 3052, 3052, 3052, 3052,
- 3052, 3052, 3052, 3052, 3052, 3052, 3052, 3052,
- 3052, 3052, 3052, 3052, 3052, 3052, 3052, 3052,
- 3052, 3052, 3052, 3052, 3052, 3052, 3052, 3052,
- 3052, 3052, 3052, 3052, 3052, 3052, 3052, 3052,
- 3052, 3052, 3052, 3052, 3052, 3052, 3052, 3052,
- 3052, 3052, 3052, 3052, 3052, 3052, 3052, 3052,
- 3052, 3052, 3052, 3052, 3052, 3052, 3052, 3052,
- 3052, 3052, 3052, 3052, 3052, 3052, 3052, 3052,
- 3052, 3052, 3052, 3052, 3052, 3052, 3052, 3052,
- 3052, 3052, 3052, 3052, 3052, 3052, 3052, 3052,
- 3052, 3052, 3052, 3052, 3052, 3052, 3052, 3052,
- 3052, 3052, 3052, 3052, 3052, 3052, 3052, 3052,
- 3052, 3052, 3052, 3052, 3052, 3052, 3052, 3052,
- 3052, 3052, 3052, 3052, 3052, 3052, 3052, 3052,
- 3052, 3052, 3052, 3052, 3052, 3052, 3052, 3052,
- 3052, 3052, 3052, 3052, 3052, 3052, 3052, 3052,
- 3052, 3052, 3052, 3052, 3052, 3052, 3052, 3052,
- 3052, 3052, 3052, 3052, 3052, 3052, 3052, 3052,
- 3052, 3052, 3052, 3052, 3052, 3052, 3052, 3052,
- 3052, 3052, 3052, 3052, 3052, 3052, 3052, 3052,
-
- 3052, 3052, 3052, 3052, 3052, 3052, 3052, 3052,
- 3052, 3052, 3052, 3052, 3052, 3052, 3052, 3052,
- 3052, 3052, 3052, 3052, 3052, 3052, 3052, 3052,
- 3052, 3052, 3052, 3052, 3052, 3052, 3052, 3052,
- 3052, 3052, 3052, 3052, 3052, 3052, 3052, 3052,
- 3052, 3052, 3052, 3052, 3052, 3052, 3052, 3052,
- 3052, 3052, 3052, 3052, 3052, 3052, 3052, 3052,
- 3052, 3052, 3052, 3052, 3052, 3052, 3052, 3052,
- 3052, 3052, 3052, 3052, 3052, 3052, 3052, 3052,
- 3052, 3052, 3052, 3052, 3052, 3052, 3052, 3052,
- 3052, 3052, 3052, 3052, 3052, 3052, 3052, 3052,
- 3052, 3052, 3052, 3052, 3052, 3052, 3052, 3052,
- 3052, 3052, 3052, 3052, 3052, 3052, 3052, 3052,
- 3052, 3052, 3052, 3052, 3052, 3052, 3052, 3052,
- 3052, 3052, 3052, 3052, 3052, 3052, 3052, 3052,
- 3052, 3052, 3052, 3052, 3052, 3052, 3052, 3052,
- 3052, 3052, 3052, 3052, 3052, 3052, 3052, 3052,
- 3052, 3052, 3052, 3052, 3052, 3052, 3052, 3052,
- 3052, 3052, 3052, 3052, 3052, 3052, 3052, 3052,
- 3052, 3052, 3052, 3052, 3052, 3052, 3052, 3052,
- 3052, 3052, 3052, 3052, 3052, 3052, 3052, 3052,
- 3052, 3052, 3052, 3052, 3052, 3052, 3052, 3052,
- 3052, 3052, 3052, 3052, 3052, 3052, 3052, 3052,
- 3052, 3052, 3052, 3052, 3052, 3052, 3052, 3052,
- 3052, 3052, 3052, 3052, 3052, 3052, 3052, 3052,
- 3052, 3052, 3052, 3052, 3052, 3052, 3052, 3052,
- 3052, 3052, 3052, 3052, 3052, 3052, 3052, 3052,
- 3052, 3052, 3052, 3052, 3052, 3052, 3052, 3052,
- 3052, 3052, 3052, 3052, 3052, 3052, 3052, 3052,
- 3052, 3052, 3052, 3052, 3052, 3052, 3052, 3052,
- 3052, 3052, 3052, 3052, 3052, 3052, 3052, 3052,
- 3052, 3052, 3052, 3052, 3052, 3052, 3045, 3045
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1911, 1911, 1911,
+ 1911, 3225, 2223, 2223, 2223, 2223, 2223, 2223,
+ 3226, 3226, 3226, 3226, 3226, 3226, 3226, 3226,
+ 3226, 3226, 3226, 3226, 3226, 3226, 3226, 3226,
+ 3226, 3226, 3226, 3226, 3226, 3226, 3226, 3226,
+ 3226, 3226, 3226, 3226, 3226, 3226, 3226, 3226,
+ 3226, 3226, 3226, 3226, 3226, 3226, 3226, 3226,
+ 3226, 3226, 3226, 3226, 3226, 3226, 3226, 3226,
+ 3226, 3226, 3226, 3226, 3226, 3226, 3226, 3226,
+ 3226, 3226, 3226, 3226, 3226, 3226, 3226, 3226,
+ 3226, 3226, 3226, 3226, 3226, 3226, 3226, 3226,
+ 3226, 3226, 3226, 3226, 3226, 3226, 3226, 3226,
+ 3226, 3226, 3226, 3226, 3226, 3226, 3226, 3226,
+ 3226, 3226, 3226, 3226, 3226, 3226, 3226, 3226,
+ 3226, 3226, 3226, 3226, 3226, 3226, 3226, 3226,
+ 3226, 3226, 3226, 3226, 3226, 3226, 3226, 3226,
+ 3226, 3226, 3226, 3226, 3226, 3226, 3226, 3226,
+ 3226, 3226, 3226, 3226, 3226, 3226, 3226, 3226,
+ 3226, 3226, 3226, 3226, 3226, 3226, 3226, 3226,
+ 3226, 3226, 3226, 3226, 3226, 3226, 3226, 3226,
+ 3226, 3226, 3226, 3226, 3226, 3226, 3226, 3226,
+ 3226, 3226, 3226, 3226, 3226, 3226, 3226, 3226,
+ 3226, 3226, 3226, 3226, 3226, 3226, 3226, 3226,
+ 3226, 3226, 3226, 3226, 3226, 3226, 3226, 3226,
+ 3226, 3226, 3226, 3226, 3226, 3226, 3226, 3226,
+ 3226, 3226, 3226, 3226, 3226, 3226, 3226, 3226,
+
+ 3226, 3226, 3226, 3226, 3226, 3226, 3226, 3226,
+ 3226, 3226, 3226, 3226, 3226, 3226, 3226, 3226,
+ 3226, 3226, 3226, 3226, 3226, 3226, 3226, 3226,
+ 3226, 3226, 3226, 3226, 3226, 3226, 2223, 2223,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3229, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3229, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3229,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3229,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3229,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 3223, 3223,
+
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 2223, 2223, 2223, 2223, 2223,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 221, 221, 221, 221, 221, 3223, 3223,
+
+ 1468, 3039, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 3230, 3230, 3230, 3230, 3230, 3230, 3230, 3230,
+ 3230, 3230, 3230, 3230, 3230, 3230, 3230, 3230,
+ 3230, 3230, 3230, 3230, 3230, 3230, 3230, 3230,
+ 3230, 3230, 3230, 3230, 3230, 3230, 3230, 3230,
+ 3230, 3230, 3230, 3230, 3230, 3230, 3230, 3230,
+ 3230, 3230, 3230, 3230, 3230, 3230, 3230, 3230,
+ 3230, 3230, 3230, 3230, 3230, 3230, 3230, 3230,
+ 3230, 3230, 3230, 3230, 3230, 3230, 3230, 3230,
+ 3230, 3230, 3230, 3230, 3230, 3230, 3230, 3230,
+ 3230, 3230, 3230, 3230, 3230, 3230, 3230, 3230,
+ 3230, 3230, 3230, 3230, 3230, 3230, 3230, 3230,
+ 3230, 3230, 3230, 3230, 3230, 3230, 3230, 3230,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+
+ 3231, 3231, 3231, 3231, 3231, 3231, 3231, 3231,
+ 3231, 3231, 3231, 3231, 3231, 3231, 3231, 3231,
+ 3231, 3231, 3231, 3231, 3231, 3231, 3231, 3231,
+ 3231, 3231, 3231, 3231, 3231, 3231, 3231, 3231,
+ 3231, 3231, 3231, 3231, 3231, 3231, 3231, 3231,
+ 3231, 3231, 3231, 3231, 3231, 3231, 3231, 3231,
+ 3231, 3231, 3231, 3231, 3231, 3231, 3231, 3231,
+ 3231, 3231, 3231, 3231, 3231, 3231, 3231, 3231,
+ 3231, 3231, 3231, 3231, 3231, 3231, 3231, 3231,
+ 3231, 3231, 3231, 3231, 3231, 3231, 3231, 3231,
+ 3231, 3231, 3231, 3231, 3231, 3231, 3231, 3231,
+ 3231, 3231, 3231, 3231, 3231, 3231, 3231, 3231,
+ 3231, 3231, 3231, 3231, 3231, 3231, 3231, 3231,
+ 3231, 3231, 3231, 3231, 3231, 3231, 3231, 3231,
+ 3231, 3231, 3231, 3231, 3231, 3231, 3231, 3231,
+ 3231, 3231, 3231, 3231, 3231, 3231, 3231, 3231,
+ 3231, 3231, 3231, 3231, 3231, 3231, 3231, 3231,
+ 3231, 3231, 3231, 3231, 3231, 3231, 3231, 3231,
+ 3231, 3231, 3231, 3231, 3231, 3231, 3231, 3231,
+ 3231, 3231, 3231, 3231, 3231, 3231, 3231, 3231,
+ 3231, 3231, 3231, 3231, 3231, 3231, 3231, 3231,
+ 3231, 3231, 3231, 3231, 3231, 3231, 3231, 3231,
+ 3231, 3231, 3231, 3231, 3231, 3231, 3231, 3231,
+ 3231, 3231, 3231, 3231, 3231, 3231, 3231, 3231,
+ 3231, 3231, 3231, 3231, 3231, 3231, 3231, 3231,
+ 3231, 3231, 3231, 3231, 3231, 3231, 3231, 3231,
+ 3231, 3231, 3231, 3231, 3231, 3231, 3231, 3231,
+ 3231, 3231, 3231, 3231, 3231, 3231, 3231, 3231,
+ 3231, 3231, 3231, 3231, 3231, 3231, 3231, 3231,
+ 3231, 3231, 3231, 3231, 3231, 3231, 3231, 3231,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+ 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468,
+
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3223, 3223
};
-static const Properties uc_properties[] = {
- { 9, 18, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 0, 21, 0, 0, 2 },
- { 9, 8, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 0, 17, 5, 0, 2 },
- { 9, 7, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 2, 2, 37, 2, 0, 2 },
- { 9, 8, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 3, 38, 5, 0, 2 },
- { 9, 9, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 3, 38, 5, 0, 2 },
- { 9, 7, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 1, 1, 36, 1, 0, 2 },
- { 9, 7, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 0, 21, 0, 0, 2 },
- { 9, 8, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 0, 21, 0, 0, 2 },
- { 6, 9, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 22, 35, 5, 0, 2 },
- { 25, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 6, 12, 0, 2 },
- { 25, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 12, 3, 13, 0, 2 },
- { 25, 4, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 0, 2 },
- { 27, 4, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 9, 0, 0, 2 },
- { 25, 4, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 10, 0, 0, 2 },
- { 25, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 0, 2 },
- { 25, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 11, 3, 13, 0, 2 },
- { 21, 10, 0, 0, -1, 1, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 0, 2 },
- { 22, 10, 0, 0, -1, -1, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 2, 13, 0, 2 },
- { 26, 3, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 9, 0, 0, 2 },
- { 25, 6, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 15, 8, 11, 0, 2 },
- { 20, 3, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 11, 1, 2 },
- { 25, 6, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 15, 8, 10, 1, 2 },
- { 25, 6, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 7, 0, 0, 2 },
- { 3, 2, 0, 0, 0, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 2 },
- { 3, 2, 0, 0, 1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 2 },
- { 3, 2, 0, 0, 2, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 2 },
- { 3, 2, 0, 0, 3, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 2 },
- { 3, 2, 0, 0, 4, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 2 },
- { 3, 2, 0, 0, 5, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 2 },
- { 3, 2, 0, 0, 6, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 2 },
- { 3, 2, 0, 0, 7, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 2 },
- { 3, 2, 0, 0, 8, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 2 },
- { 3, 2, 0, 0, 9, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 2 },
- { 25, 6, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 8, 11, 0, 2 },
- { 25, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 15, 8, 0, 0, 2 },
- { 26, 10, 0, 0, -1, 2, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 0, 2 },
- { 26, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 0, 2 },
- { 26, 10, 0, 0, -1, -2, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 0, 2 },
- { 14, 0, 0, 0, -1, 0, 1, 0, { {0, 32}, {0, 0}, {0, 0}, {0, 32} }, 0, 10, 12, 7, 3, 3 },
- { 21, 10, 0, 0, -1, 2, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 0, 2 },
- { 25, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 9, 0, 0, 2 },
- { 22, 10, 0, 0, -1, -2, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 2, 13, 0, 2 },
- { 28, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 0, 2 },
- { 19, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 17, 12, 0, 1, 2 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, -32}, {0, -32}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 26, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 0, 2 },
- { 22, 10, 0, 0, -1, -2, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 0, 2 },
- { 9, 7, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 3, 38, 3, 0, 2 },
- { 6, 6, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 4, 5, 0, 2 },
- { 25, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 0, 1, 2 },
- { 27, 4, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 10, 0, 1, 2 },
- { 27, 4, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 9, 0, 1, 2 },
- { 29, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 25, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 28, 10, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 0, 2 },
- { 29, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 12, 0, 1, 2 },
- { 18, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 3, 3 },
- { 23, 10, 0, 0, -1, 16, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 3, 13, 1, 2 },
- { 26, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 10, 18, 0, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 17, 4, 2, 2 },
- { 29, 4, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 10, 0, 1, 2 },
- { 26, 4, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 9, 0, 1, 2 },
- { 5, 2, 0, 0, 2, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 3, 2 },
- { 5, 2, 0, 0, 3, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 3, 2 },
- { 28, 10, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 18, 0, 0, 2 },
- { 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 743}, {0, 743}, {0, 775} }, 0, 10, 12, 6, 3, 2 },
- { 25, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 14, 12, 0, 1, 2 },
- { 5, 2, 0, 0, 1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 3, 2 },
- { 24, 10, 0, 0, -1, -16, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 3, 13, 1, 2 },
- { 5, 10, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 3, 2 },
- { 14, 0, 0, 0, -1, 0, 1, 17, { {0, 32}, {0, 0}, {0, 0}, {0, 32} }, 0, 10, 12, 7, 3, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {1, 418}, {1, 415}, {0, 0} }, 0, 10, 12, 6, 4, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {0, -32}, {0, -32}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {0, 121}, {0, 121}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 14, 0, 0, 0, -1, 0, 1, 17, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 3, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 14, 0, 0, 0, -1, 0, 1, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 3, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 14, 0, 0, 0, -1, 0, 1, 17, { {1, 421}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 3, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, -232}, {0, -232}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 14, 0, 0, 0, -1, 0, 1, 80, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 3, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 3, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {1, 500}, {1, 500}, {0, 0} }, 0, 10, 12, 6, 3, 3 },
- { 14, 0, 0, 0, -1, 0, 1, 17, { {0, -121}, {0, 0}, {0, 0}, {0, -121} }, 0, 10, 12, 7, 3, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, -300}, {0, -300}, {0, -268} }, 0, 10, 12, 6, 3, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 195}, {0, 195}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 14, 0, 0, 0, -1, 0, 1, 0, { {0, 210}, {0, 0}, {0, 0}, {0, 210} }, 0, 10, 12, 7, 3, 3 },
- { 14, 0, 0, 0, -1, 0, 1, 0, { {0, 206}, {0, 0}, {0, 0}, {0, 206} }, 0, 10, 12, 7, 3, 3 },
- { 14, 0, 0, 0, -1, 0, 1, 0, { {0, 205}, {0, 0}, {0, 0}, {0, 205} }, 0, 10, 12, 7, 3, 3 },
- { 14, 0, 0, 0, -1, 0, 1, 0, { {0, 79}, {0, 0}, {0, 0}, {0, 79} }, 0, 10, 12, 7, 3, 3 },
- { 14, 0, 0, 0, -1, 0, 1, 0, { {0, 202}, {0, 0}, {0, 0}, {0, 202} }, 0, 10, 12, 7, 3, 3 },
- { 14, 0, 0, 0, -1, 0, 1, 0, { {0, 203}, {0, 0}, {0, 0}, {0, 203} }, 0, 10, 12, 7, 3, 3 },
- { 14, 0, 0, 0, -1, 0, 1, 0, { {0, 207}, {0, 0}, {0, 0}, {0, 207} }, 0, 10, 12, 7, 3, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 97}, {0, 97}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 14, 0, 0, 0, -1, 0, 1, 0, { {0, 211}, {0, 0}, {0, 0}, {0, 211} }, 0, 10, 12, 7, 3, 3 },
- { 14, 0, 0, 0, -1, 0, 1, 0, { {0, 209}, {0, 0}, {0, 0}, {0, 209} }, 0, 10, 12, 7, 3, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 163}, {0, 163}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 14, 0, 0, 0, -1, 0, 1, 0, { {0, 213}, {0, 0}, {0, 0}, {0, 213} }, 0, 10, 12, 7, 3, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 130}, {0, 130}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 14, 0, 0, 0, -1, 0, 1, 0, { {0, 214}, {0, 0}, {0, 0}, {0, 214} }, 0, 10, 12, 7, 3, 3 },
- { 14, 0, 0, 0, -1, 0, 1, 0, { {0, 218}, {0, 0}, {0, 0}, {0, 218} }, 0, 10, 12, 7, 3, 3 },
- { 14, 0, 0, 0, -1, 0, 1, 0, { {0, 217}, {0, 0}, {0, 0}, {0, 217} }, 0, 10, 12, 7, 3, 3 },
- { 14, 0, 0, 0, -1, 0, 1, 0, { {0, 219}, {0, 0}, {0, 0}, {0, 219} }, 0, 10, 12, 7, 3, 3 },
- { 18, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 56}, {0, 56}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 14, 0, 0, 0, -1, 0, 1, 80, { {0, 2}, {0, 0}, {0, 1}, {0, 2} }, 0, 10, 12, 7, 3, 3 },
- { 16, 0, 0, 0, -1, 0, 1, 80, { {0, 1}, {0, -1}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 3, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, -2}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 3, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, -79}, {0, -79}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 511}, {1, 511}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {0, -97}, {0, 0}, {0, 0}, {0, -97} }, 0, 10, 12, 7, 3, 3 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {0, -56}, {0, 0}, {0, 0}, {0, -56} }, 0, 10, 12, 7, 3, 3 },
- { 14, 0, 0, 0, -1, 0, 4, 17, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 3, 3 },
- { 15, 0, 0, 0, -1, 0, 4, 17, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 3, 3 },
- { 15, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 14, 0, 0, 0, -1, 0, 6, 0, { {0, -130}, {0, 0}, {0, 0}, {0, -130} }, 0, 10, 12, 7, 3, 3 },
- { 15, 0, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 15, 0, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 14, 0, 0, 0, -1, 0, 8, 0, { {1, 1}, {0, 0}, {0, 0}, {1, 1} }, 0, 10, 12, 7, 3, 3 },
- { 14, 0, 0, 0, -1, 0, 8, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 3, 3 },
- { 15, 0, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 14, 0, 0, 0, -1, 0, 8, 0, { {0, -163}, {0, 0}, {0, 0}, {0, -163} }, 0, 10, 12, 7, 3, 3 },
- { 14, 0, 0, 0, -1, 0, 8, 0, { {1, 3}, {0, 0}, {0, 0}, {1, 3} }, 0, 10, 12, 7, 3, 3 },
- { 15, 0, 0, 0, -1, 0, 8, 0, { {0, 0}, {1, 5}, {1, 5}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 15, 0, 0, 0, -1, 0, 8, 0, { {0, 0}, {1, 7}, {1, 7}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 15, 0, 0, 0, -1, 0, 9, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 14, 0, 0, 0, -1, 0, 9, 0, { {0, -195}, {0, 0}, {0, 0}, {0, -195} }, 0, 10, 12, 7, 3, 3 },
- { 14, 0, 0, 0, -1, 0, 9, 0, { {0, 69}, {0, 0}, {0, 0}, {0, 69} }, 0, 10, 12, 7, 3, 3 },
- { 14, 0, 0, 0, -1, 0, 9, 0, { {0, 71}, {0, 0}, {0, 0}, {0, 71} }, 0, 10, 12, 7, 3, 3 },
- { 14, 0, 0, 0, -1, 0, 9, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 3, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {1, 9}, {1, 9}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {1, 11}, {1, 11}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {1, 13}, {1, 13}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, -210}, {0, -210}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, -206}, {0, -206}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, -205}, {0, -205}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, -202}, {0, -202}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, -203}, {0, -203}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {1, 15}, {1, 15}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {1, 17}, {1, 17}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, -207}, {0, -207}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {1, 19}, {1, 19}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {1, 21}, {1, 21}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, -209}, {0, -209}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, -211}, {0, -211}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {1, 23}, {1, 23}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {1, 25}, {1, 25}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {1, 27}, {1, 27}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {1, 29}, {1, 29}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, -213}, {0, -213}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, -214}, {0, -214}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {1, 31}, {1, 31}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, -218}, {0, -218}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {1, 33}, {1, 33}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {1, 35}, {1, 35}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, -69}, {0, -69}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, -217}, {0, -217}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, -71}, {0, -71}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, -219}, {0, -219}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {1, 37}, {1, 37}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {1, 39}, {1, 39}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 15, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 17, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 3, 3 },
- { 17, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 2 },
- { 17, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 2 },
- { 17, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 1, 2 },
- { 28, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 0, 1, 2 },
- { 17, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 18, 8, 1, 2 },
- { 28, 10, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 18, 0, 1, 2 },
- { 28, 10, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 0, 1, 36 },
- { 17, 10, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 2 },
- { 28, 10, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 0, 1, 2 },
- { 17, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 2 },
- { 28, 10, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 0, 1, 2 },
- { 0, 17, 230, 5, -1, 0, 1, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 1 },
- { 0, 17, 230, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 1 },
- { 0, 17, 232, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 1 },
- { 0, 17, 220, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 1 },
- { 0, 17, 216, 5, -1, 0, 1, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 1 },
- { 0, 17, 202, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 1 },
- { 0, 17, 220, 5, -1, 0, 1, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 1 },
- { 0, 17, 202, 5, -1, 0, 1, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 1 },
- { 0, 17, 1, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 1 },
- { 0, 17, 1, 5, -1, 0, 1, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 1 },
- { 0, 17, 230, 5, -1, 0, 1, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 3, 1 },
- { 0, 17, 240, 5, -1, 0, 1, 204, { {0, 0}, {0, 84}, {0, 84}, {0, 116} }, 4, 4, 21, 4, 3, 1 },
- { 0, 17, 230, 5, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 1 },
- { 0, 17, 220, 5, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 1 },
- { 0, 17, 0, 5, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 4, 4, 2, 1 },
- { 0, 17, 230, 5, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 1 },
- { 0, 17, 220, 5, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 1 },
- { 0, 17, 232, 5, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 1 },
- { 0, 17, 220, 5, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 1 },
- { 0, 17, 230, 5, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 1 },
- { 0, 17, 233, 5, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 4, 4, 1, 1 },
- { 0, 17, 234, 5, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 4, 4, 1, 1 },
- { 0, 17, 233, 5, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 4, 4, 1, 1 },
- { 0, 17, 234, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 4, 4, 1, 1 },
- { 0, 17, 233, 5, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 4, 4, 1, 1 },
- { 0, 17, 230, 5, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 1 },
- { 14, 0, 0, 0, -1, 0, 10, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 3, 4 },
- { 15, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 1, 4 },
- { 17, 10, 0, 0, -1, 0, 1, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 3, 2 },
- { 28, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 4 },
- { 13, 0, 0, 0, -1, 0, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 0, 0 },
- { 17, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 0, 4 },
- { 15, 0, 0, 0, -1, 0, 9, 0, { {0, 0}, {0, 130}, {0, 130}, {0, 0} }, 0, 10, 12, 6, 1, 4 },
- { 25, 10, 0, 0, -1, 0, 1, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 15, 8, 0, 0, 2 },
- { 14, 0, 0, 0, -1, 0, 16, 0, { {0, 116}, {0, 0}, {0, 0}, {0, 116} }, 0, 10, 12, 7, 3, 4 },
- { 28, 10, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 0, 4 },
- { 28, 10, 0, 0, -1, 0, 1, 81, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 0, 2 },
- { 14, 0, 0, 0, -1, 0, 1, 17, { {0, 38}, {0, 0}, {0, 0}, {0, 38} }, 0, 10, 12, 7, 3, 4 },
- { 25, 10, 0, 0, -1, 0, 1, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 14, 12, 0, 3, 2 },
- { 14, 0, 0, 0, -1, 0, 1, 17, { {0, 37}, {0, 0}, {0, 0}, {0, 37} }, 0, 10, 12, 7, 3, 4 },
- { 14, 0, 0, 0, -1, 0, 1, 17, { {0, 64}, {0, 0}, {0, 0}, {0, 64} }, 0, 10, 12, 7, 3, 4 },
- { 14, 0, 0, 0, -1, 0, 1, 17, { {0, 63}, {0, 0}, {0, 0}, {0, 63} }, 0, 10, 12, 7, 3, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 503}, {1, 503}, {0, 0} }, 0, 10, 12, 6, 1, 4 },
- { 14, 0, 0, 0, -1, 0, 1, 0, { {0, 32}, {0, 0}, {0, 0}, {0, 32} }, 0, 10, 12, 7, 3, 4 },
- { 14, 0, 0, 0, -1, 0, 1, 17, { {0, 32}, {0, 0}, {0, 0}, {0, 32} }, 0, 10, 12, 7, 3, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {0, -38}, {0, -38}, {0, 0} }, 0, 10, 12, 6, 1, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {0, -37}, {0, -37}, {0, 0} }, 0, 10, 12, 6, 1, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 507}, {1, 507}, {0, 0} }, 0, 10, 12, 6, 1, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, -32}, {0, -32}, {0, 0} }, 0, 10, 12, 6, 1, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, -31}, {0, -31}, {0, 1} }, 0, 10, 12, 6, 4, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {0, -32}, {0, -32}, {0, 0} }, 0, 10, 12, 6, 1, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {0, -64}, {0, -64}, {0, 0} }, 0, 10, 12, 6, 1, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {0, -63}, {0, -63}, {0, 0} }, 0, 10, 12, 6, 1, 4 },
- { 14, 0, 0, 0, -1, 0, 10, 0, { {0, 8}, {0, 0}, {0, 0}, {0, 8} }, 0, 10, 12, 7, 3, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, -62}, {0, -62}, {0, -30} }, 0, 10, 12, 6, 3, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, -57}, {0, -57}, {0, -25} }, 0, 10, 12, 6, 3, 4 },
- { 14, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 3, 4 },
- { 14, 0, 0, 0, -1, 0, 1, 81, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 3, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, -47}, {0, -47}, {0, -15} }, 0, 10, 12, 6, 3, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, -54}, {0, -54}, {0, -22} }, 0, 10, 12, 6, 3, 4 },
- { 15, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, -8}, {0, -8}, {0, 0} }, 0, 10, 12, 6, 1, 4 },
- { 14, 0, 0, 0, -1, 0, 6, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 3, 4 },
- { 15, 0, 0, 0, -1, 0, 6, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 1, 4 },
- { 14, 0, 0, 0, -1, 0, 1, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 3, 4 },
- { 15, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 1, 4 },
- { 14, 0, 0, 0, -1, 0, 1, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 3, 46 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 1, 46 },
- { 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, -86}, {0, -86}, {0, -54} }, 0, 10, 12, 6, 3, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, -80}, {0, -80}, {0, -48} }, 0, 10, 12, 6, 3, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 7}, {0, 7}, {0, 0} }, 0, 10, 12, 6, 3, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, -116}, {0, -116}, {0, 0} }, 0, 10, 12, 6, 1, 4 },
- { 14, 0, 0, 0, -1, 0, 5, 80, { {0, -60}, {0, 0}, {0, 0}, {0, -60} }, 0, 10, 12, 7, 3, 4 },
- { 15, 0, 0, 0, -1, 0, 5, 80, { {0, 0}, {0, -96}, {0, -96}, {0, -64} }, 0, 10, 12, 6, 3, 4 },
- { 26, 10, 0, 0, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 4 },
- { 14, 0, 0, 0, -1, 0, 7, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 3, 4 },
- { 15, 0, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 1, 4 },
- { 14, 0, 0, 0, -1, 0, 7, 80, { {0, -7}, {0, 0}, {0, 0}, {0, -7} }, 0, 10, 12, 7, 3, 4 },
- { 15, 0, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 1, 4 },
- { 14, 0, 0, 0, -1, 0, 8, 0, { {0, -130}, {0, 0}, {0, 0}, {0, -130} }, 0, 10, 12, 7, 3, 4 },
- { 14, 0, 0, 0, -1, 0, 4, 17, { {0, 80}, {0, 0}, {0, 0}, {0, 80} }, 0, 10, 12, 7, 3, 5 },
- { 14, 0, 0, 0, -1, 0, 1, 17, { {0, 80}, {0, 0}, {0, 0}, {0, 80} }, 0, 10, 12, 7, 3, 5 },
- { 14, 0, 0, 0, -1, 0, 1, 0, { {0, 80}, {0, 0}, {0, 0}, {0, 80} }, 0, 10, 12, 7, 3, 5 },
- { 14, 0, 0, 0, -1, 0, 1, 0, { {0, 32}, {0, 0}, {0, 0}, {0, 32} }, 0, 10, 12, 7, 3, 5 },
- { 14, 0, 0, 0, -1, 0, 1, 17, { {0, 32}, {0, 0}, {0, 0}, {0, 32} }, 0, 10, 12, 7, 3, 5 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, -32}, {0, -32}, {0, 0} }, 0, 10, 12, 6, 1, 5 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {0, -32}, {0, -32}, {0, 0} }, 0, 10, 12, 6, 1, 5 },
- { 15, 0, 0, 0, -1, 0, 4, 17, { {0, 0}, {0, -80}, {0, -80}, {0, 0} }, 0, 10, 12, 6, 1, 5 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {0, -80}, {0, -80}, {0, 0} }, 0, 10, 12, 6, 1, 5 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, -80}, {0, -80}, {0, 0} }, 0, 10, 12, 6, 1, 5 },
- { 14, 0, 0, 0, -1, 0, 1, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 3, 5 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 1, 5 },
- { 14, 0, 0, 0, -1, 0, 1, 17, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 3, 5 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 1, 5 },
- { 29, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 5 },
- { 0, 17, 230, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 5 },
- { 0, 17, 230, 5, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 5 },
- { 2, 17, 0, 5, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 5 },
- { 14, 0, 0, 0, -1, 0, 6, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 3, 5 },
- { 15, 0, 0, 0, -1, 0, 6, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 1, 5 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 3, 5 },
- { 15, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 1, 5 },
- { 14, 0, 0, 0, -1, 0, 1, 0, { {0, 15}, {0, 0}, {0, 0}, {0, 15} }, 0, 10, 12, 7, 0, 5 },
- { 15, 0, 0, 0, -1, 0, 9, 0, { {0, 0}, {0, -15}, {0, -15}, {0, 0} }, 0, 10, 12, 6, 1, 5 },
- { 14, 0, 0, 0, -1, 0, 4, 17, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 3, 5 },
- { 15, 0, 0, 0, -1, 0, 4, 17, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 1, 5 },
- { 14, 0, 0, 0, -1, 0, 8, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 3, 5 },
- { 15, 0, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 1, 5 },
- { 14, 0, 0, 0, -1, 0, 9, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 3, 5 },
- { 15, 0, 0, 0, -1, 0, 9, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 1, 5 },
- { 14, 0, 0, 0, -1, 0, 10, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 3, 5 },
- { 15, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 1, 5 },
- { 14, 0, 0, 0, -1, 0, 11, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 3, 5 },
- { 15, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 1, 5 },
- { 14, 0, 0, 0, -1, 0, 12, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 3, 5 },
- { 15, 0, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 1, 5 },
- { 14, 0, 0, 0, -1, 0, 16, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 3, 5 },
- { 15, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 1, 5 },
- { 14, 0, 0, 0, -1, 0, 1, 0, { {0, 48}, {0, 0}, {0, 0}, {0, 48} }, 0, 10, 12, 7, 3, 6 },
- { 17, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 6 },
- { 25, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 0, 1, 6 },
- { 25, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 11, 1, 6 },
- { 25, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 14, 12, 0, 1, 6 },
- { 15, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 1, 6 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, -48}, {0, -48}, {0, 0} }, 0, 10, 12, 6, 1, 6 },
- { 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {1, 467}, {1, 464}, {0, 0} }, 0, 10, 12, 6, 3, 6 },
- { 25, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 15, 8, 12, 1, 6 },
- { 20, 10, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 17, 0, 1, 6 },
- { 29, 10, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 6 },
- { 27, 4, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 9, 0, 1, 6 },
- { 13, 1, 0, 0, -1, 0, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 0, 0 },
- { 0, 17, 220, 5, -1, 0, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 7 },
- { 0, 17, 230, 5, -1, 0, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 7 },
- { 0, 17, 222, 5, -1, 0, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 7 },
- { 0, 17, 220, 5, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 7 },
- { 0, 17, 228, 5, -1, 0, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 7 },
- { 0, 17, 10, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 7 },
- { 0, 17, 11, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 7 },
- { 0, 17, 12, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 7 },
- { 0, 17, 13, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 7 },
- { 0, 17, 14, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 7 },
- { 0, 17, 15, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 7 },
- { 0, 17, 16, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 7 },
- { 0, 17, 17, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 7 },
- { 0, 17, 18, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 7 },
- { 0, 17, 19, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 7 },
- { 0, 17, 19, 5, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 7 },
- { 0, 17, 20, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 7 },
- { 0, 17, 21, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 7 },
- { 0, 17, 22, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 7 },
- { 20, 1, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 1, 7 },
- { 0, 17, 23, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 7 },
- { 25, 1, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 7 },
- { 0, 17, 24, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 7 },
- { 0, 17, 25, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 7 },
- { 25, 1, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 6, 0, 1, 7 },
- { 0, 17, 18, 5, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 7 },
- { 18, 1, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 9, 13, 8, 1, 7 },
- { 18, 1, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 9, 13, 8, 1, 7 },
- { 25, 1, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 7 },
- { 25, 1, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 14, 12, 0, 1, 7 },
- { 10, 5, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 7, 6, 12, 4, 0, 8 },
- { 10, 5, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 7, 6, 12, 4, 0, 8 },
- { 10, 5, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 7, 6, 12, 4, 0, 2 },
- { 26, 10, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 8 },
- { 26, 13, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 8 },
- { 25, 4, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 10, 0, 1, 8 },
- { 27, 13, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 10, 0, 1, 8 },
- { 25, 6, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 15, 8, 11, 1, 2 },
- { 25, 13, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 15, 8, 11, 1, 8 },
- { 29, 10, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 8 },
- { 0, 17, 230, 5, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 8 },
- { 0, 17, 230, 5, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 8 },
- { 0, 17, 30, 5, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 8 },
- { 0, 17, 31, 5, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 8 },
- { 0, 17, 32, 5, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 8 },
- { 25, 13, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 6, 0, 1, 2 },
- { 10, 13, 0, 5, -1, 0, 15, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 21, 4, 0, 8 },
- { 25, 13, 0, 0, -1, 0, 24, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 6, 12, 1, 8 },
- { 25, 13, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 6, 12, 1, 8 },
- { 25, 13, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 6, 12, 1, 2 },
- { 18, 13, 0, 2, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 8 },
- { 18, 13, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 8 },
- { 18, 13, 0, 3, -1, 0, 1, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 8 },
- { 18, 13, 0, 2, -1, 0, 1, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 8 },
- { 18, 13, 0, 3, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 8 },
- { 18, 13, 0, 2, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 8 },
- { 18, 13, 0, 2, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 8 },
- { 17, 13, 0, 1, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 2 },
- { 0, 17, 27, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 1 },
- { 0, 17, 28, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 1 },
- { 0, 17, 29, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 1 },
- { 0, 17, 30, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 1 },
- { 0, 17, 31, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 1 },
- { 0, 17, 32, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 1 },
- { 0, 17, 33, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 1 },
- { 0, 17, 34, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 1 },
- { 0, 17, 230, 5, -1, 0, 4, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 1 },
- { 0, 17, 220, 5, -1, 0, 4, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 1 },
- { 0, 17, 220, 5, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 8 },
- { 0, 17, 230, 5, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 8 },
- { 0, 17, 220, 5, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 8 },
- { 0, 17, 220, 5, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 8 },
- { 3, 5, 0, 0, 0, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 8 },
- { 3, 5, 0, 0, 1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 8 },
- { 3, 5, 0, 0, 2, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 8 },
- { 3, 5, 0, 0, 3, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 8 },
- { 3, 5, 0, 0, 4, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 8 },
- { 3, 5, 0, 0, 5, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 8 },
- { 3, 5, 0, 0, 6, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 8 },
- { 3, 5, 0, 0, 7, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 8 },
- { 3, 5, 0, 0, 8, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 8 },
- { 3, 5, 0, 0, 9, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 8 },
- { 25, 4, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 10, 0, 1, 8 },
- { 25, 5, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 8 },
- { 25, 5, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 15, 11, 9, 1, 8 },
- { 25, 13, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 8 },
- { 18, 13, 0, 2, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 8 },
- { 0, 17, 35, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 1 },
- { 18, 13, 0, 3, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 3, 8 },
- { 18, 13, 0, 2, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 3, 8 },
- { 18, 13, 0, 2, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 8 },
- { 18, 13, 0, 3, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 8 },
- { 25, 13, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 6, 12, 1, 8 },
- { 0, 17, 230, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 8 },
- { 10, 5, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 7, 6, 12, 4, 0, 2 },
- { 29, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 8 },
- { 0, 17, 220, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 8 },
- { 17, 13, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 8 },
- { 18, 13, 0, 3, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 8 },
- { 3, 2, 0, 0, 0, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 8 },
- { 3, 2, 0, 0, 1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 8 },
- { 3, 2, 0, 0, 2, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 8 },
- { 3, 2, 0, 0, 3, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 8 },
- { 3, 2, 0, 0, 4, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 8 },
- { 3, 2, 0, 0, 5, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 8 },
- { 3, 2, 0, 0, 6, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 8 },
- { 3, 2, 0, 0, 7, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 8 },
- { 3, 2, 0, 0, 8, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 8 },
- { 3, 2, 0, 0, 9, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 8 },
- { 29, 13, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 8 },
- { 18, 13, 0, 2, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 8 },
- { 25, 13, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 12, 1, 9 },
- { 25, 13, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 9 },
- { 13, 13, 0, 0, -1, 0, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 0, 0 },
- { 10, 13, 0, 5, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 7, 6, 12, 4, 0, 9 },
- { 18, 13, 0, 3, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 9 },
- { 0, 17, 36, 5, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 9 },
- { 18, 13, 0, 2, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 9 },
- { 18, 13, 0, 2, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 9 },
- { 18, 13, 0, 3, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 9 },
- { 0, 17, 230, 5, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 9 },
- { 0, 17, 220, 5, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 9 },
- { 18, 13, 0, 2, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 8 },
- { 18, 13, 0, 3, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 8 },
- { 18, 13, 0, 3, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 8 },
- { 18, 13, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 10 },
- { 0, 17, 0, 5, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 10 },
- { 18, 13, 0, 0, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 10 },
- { 3, 1, 0, 0, 0, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 66 },
- { 3, 1, 0, 0, 1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 66 },
- { 3, 1, 0, 0, 2, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 66 },
- { 3, 1, 0, 0, 3, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 66 },
- { 3, 1, 0, 0, 4, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 66 },
- { 3, 1, 0, 0, 5, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 66 },
- { 3, 1, 0, 0, 6, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 66 },
- { 3, 1, 0, 0, 7, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 66 },
- { 3, 1, 0, 0, 8, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 66 },
- { 3, 1, 0, 0, 9, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 66 },
- { 18, 1, 0, 2, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 66 },
- { 0, 17, 230, 5, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 66 },
- { 0, 17, 220, 5, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 66 },
- { 17, 1, 0, 0, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 66 },
- { 29, 10, 0, 0, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 66 },
- { 25, 10, 0, 0, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 66 },
- { 25, 10, 0, 0, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 15, 8, 11, 1, 66 },
- { 25, 10, 0, 0, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 6, 12, 1, 66 },
- { 17, 1, 0, 1, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 66 },
- { 0, 17, 220, 5, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 66 },
- { 27, 1, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 9, 0, 1, 66 },
- { 18, 1, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 82 },
- { 0, 17, 230, 5, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 82 },
- { 17, 1, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 82 },
- { 25, 1, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 82 },
- { 25, 1, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 12, 1, 82 },
- { 18, 1, 0, 3, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 95 },
- { 18, 1, 0, 2, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 95 },
- { 0, 17, 220, 5, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 95 },
- { 25, 1, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 95 },
- { 18, 13, 0, 2, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 9 },
- { 18, 13, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 9 },
- { 18, 13, 0, 3, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 9 },
- { 18, 13, 0, 3, -1, 0, 24, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 8 },
- { 18, 13, 0, 1, -1, 0, 24, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 8 },
- { 18, 13, 0, 2, -1, 0, 24, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 8 },
- { 18, 13, 0, 0, -1, 0, 24, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 8 },
- { 28, 13, 0, 0, -1, 0, 24, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 8 },
- { 10, 5, 0, 0, -1, 0, 24, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 7, 6, 12, 4, 0, 8 },
- { 0, 17, 230, 5, -1, 0, 24, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 8 },
- { 0, 17, 220, 5, -1, 0, 24, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 8 },
- { 18, 13, 0, 2, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 8 },
- { 18, 13, 0, 2, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 8 },
- { 18, 13, 0, 3, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 8 },
- { 18, 13, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 8 },
- { 18, 13, 0, 3, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 8 },
- { 18, 13, 0, 2, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 8 },
- { 18, 13, 0, 2, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 8 },
- { 18, 13, 0, 3, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 8 },
- { 18, 13, 0, 2, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 8 },
- { 17, 13, 0, 0, -1, 0, 24, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 8 },
- { 0, 17, 220, 5, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 8 },
- { 0, 17, 230, 5, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 8 },
- { 10, 5, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 7, 6, 12, 4, 0, 2 },
- { 0, 17, 220, 5, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 8 },
- { 0, 17, 230, 5, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 8 },
- { 0, 17, 220, 5, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 8 },
- { 0, 17, 27, 5, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 8 },
- { 0, 17, 28, 5, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 8 },
- { 0, 17, 29, 5, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 8 },
- { 0, 17, 230, 5, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 8 },
- { 0, 17, 0, 5, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 11 },
- { 0, 17, 0, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 11 },
- { 1, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 1, 11 },
- { 18, 0, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 11 },
- { 18, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 11 },
- { 18, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 11 },
- { 0, 17, 0, 5, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 11 },
- { 1, 0, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 1, 11 },
- { 0, 17, 7, 5, -1, 0, 1, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 11 },
- { 0, 17, 9, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 11 },
- { 1, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 1, 11 },
- { 18, 0, 0, 0, -1, 0, 1, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 3, 11 },
- { 25, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 1, 2 },
- { 3, 0, 0, 0, 0, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 11 },
- { 3, 0, 0, 0, 1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 11 },
- { 3, 0, 0, 0, 2, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 11 },
- { 3, 0, 0, 0, 3, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 11 },
- { 3, 0, 0, 0, 4, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 11 },
- { 3, 0, 0, 0, 5, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 11 },
- { 3, 0, 0, 0, 6, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 11 },
- { 3, 0, 0, 0, 7, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 11 },
- { 3, 0, 0, 0, 8, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 11 },
- { 3, 0, 0, 0, 9, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 11 },
- { 25, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 11 },
- { 17, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 11 },
- { 18, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 11 },
- { 18, 0, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 11 },
- { 18, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 11 },
- { 18, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 11 },
- { 18, 0, 0, 0, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 11 },
- { 18, 0, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 11 },
- { 18, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 12 },
- { 0, 17, 0, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 12 },
- { 1, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 1, 12 },
- { 18, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 12 },
- { 0, 17, 7, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 12 },
- { 18, 0, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 12 },
- { 1, 0, 0, 0, -1, 0, 1, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 12 },
- { 1, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 1, 12 },
- { 0, 17, 9, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 12 },
- { 18, 0, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 12 },
- { 18, 0, 0, 0, -1, 0, 1, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 3, 12 },
- { 3, 0, 0, 0, 0, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 12 },
- { 3, 0, 0, 0, 1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 12 },
- { 3, 0, 0, 0, 2, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 12 },
- { 3, 0, 0, 0, 3, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 12 },
- { 3, 0, 0, 0, 4, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 12 },
- { 3, 0, 0, 0, 5, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 12 },
- { 3, 0, 0, 0, 6, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 12 },
- { 3, 0, 0, 0, 7, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 12 },
- { 3, 0, 0, 0, 8, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 12 },
- { 3, 0, 0, 0, 9, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 12 },
- { 27, 4, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 10, 0, 1, 12 },
- { 5, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 12 },
- { 5, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 10, 0, 1, 12 },
- { 29, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 12 },
- { 27, 4, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 9, 0, 1, 12 },
- { 18, 0, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 12 },
- { 25, 0, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 12 },
- { 0, 17, 230, 5, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 12 },
- { 0, 17, 0, 5, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 13 },
- { 0, 17, 0, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 13 },
- { 1, 0, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 1, 13 },
- { 18, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 13 },
- { 18, 0, 0, 0, -1, 0, 1, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 3, 13 },
- { 0, 17, 7, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 13 },
- { 1, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 1, 13 },
- { 0, 17, 9, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 13 },
- { 0, 17, 0, 5, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 13 },
- { 3, 0, 0, 0, 0, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 13 },
- { 3, 0, 0, 0, 1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 13 },
- { 3, 0, 0, 0, 2, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 13 },
- { 3, 0, 0, 0, 3, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 13 },
- { 3, 0, 0, 0, 4, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 13 },
- { 3, 0, 0, 0, 5, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 13 },
- { 3, 0, 0, 0, 6, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 13 },
- { 3, 0, 0, 0, 7, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 13 },
- { 3, 0, 0, 0, 8, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 13 },
- { 3, 0, 0, 0, 9, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 13 },
- { 25, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 13 },
- { 0, 17, 0, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 14 },
- { 1, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 1, 14 },
- { 18, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 14 },
- { 18, 0, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 14 },
- { 0, 17, 7, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 14 },
- { 0, 17, 9, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 14 },
- { 0, 17, 0, 5, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 14 },
- { 3, 0, 0, 0, 0, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 14 },
- { 3, 0, 0, 0, 1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 14 },
- { 3, 0, 0, 0, 2, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 14 },
- { 3, 0, 0, 0, 3, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 14 },
- { 3, 0, 0, 0, 4, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 14 },
- { 3, 0, 0, 0, 5, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 14 },
- { 3, 0, 0, 0, 6, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 14 },
- { 3, 0, 0, 0, 7, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 14 },
- { 3, 0, 0, 0, 8, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 14 },
- { 3, 0, 0, 0, 9, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 14 },
- { 25, 0, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 14 },
- { 27, 4, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 9, 0, 1, 14 },
- { 18, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 14 },
- { 0, 17, 0, 5, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 14 },
- { 0, 17, 0, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 15 },
- { 1, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 1, 15 },
- { 18, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 15 },
- { 18, 0, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 15 },
- { 0, 17, 7, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 15 },
- { 1, 0, 0, 0, -1, 0, 1, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 15 },
- { 0, 17, 0, 5, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 15 },
- { 1, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 1, 15 },
- { 0, 17, 9, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 15 },
- { 0, 17, 0, 5, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 15 },
- { 0, 17, 0, 5, -1, 0, 1, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 15 },
- { 18, 0, 0, 0, -1, 0, 1, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 3, 15 },
- { 3, 0, 0, 0, 0, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 15 },
- { 3, 0, 0, 0, 1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 15 },
- { 3, 0, 0, 0, 2, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 15 },
- { 3, 0, 0, 0, 3, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 15 },
- { 3, 0, 0, 0, 4, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 15 },
- { 3, 0, 0, 0, 5, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 15 },
- { 3, 0, 0, 0, 6, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 15 },
- { 3, 0, 0, 0, 7, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 15 },
- { 3, 0, 0, 0, 8, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 15 },
- { 3, 0, 0, 0, 9, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 15 },
- { 29, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 15 },
- { 5, 0, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 15 },
- { 0, 17, 0, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 16 },
- { 18, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 16 },
- { 18, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 16 },
- { 18, 0, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 16 },
- { 1, 0, 0, 0, -1, 0, 1, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 16 },
- { 1, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 1, 16 },
- { 1, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 1, 16 },
- { 0, 17, 9, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 16 },
- { 18, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 16 },
- { 3, 0, 0, 0, 0, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 16 },
- { 3, 0, 0, 0, 1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 16 },
- { 3, 0, 0, 0, 2, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 16 },
- { 3, 0, 0, 0, 3, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 16 },
- { 3, 0, 0, 0, 4, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 16 },
- { 3, 0, 0, 0, 5, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 16 },
- { 3, 0, 0, 0, 6, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 16 },
- { 3, 0, 0, 0, 7, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 16 },
- { 3, 0, 0, 0, 8, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 16 },
- { 3, 0, 0, 0, 9, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 16 },
- { 5, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 16 },
- { 29, 10, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 16 },
- { 27, 4, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 9, 0, 1, 16 },
- { 0, 17, 0, 5, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 17 },
- { 1, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 1, 17 },
- { 0, 17, 0, 5, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 17 },
- { 18, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 17 },
- { 18, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 17 },
- { 0, 17, 7, 5, -1, 0, 24, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 17 },
- { 18, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 17 },
- { 0, 17, 0, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 17 },
- { 0, 17, 0, 5, -1, 0, 1, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 17 },
- { 0, 17, 9, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 17 },
- { 0, 17, 84, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 17 },
- { 0, 17, 91, 5, -1, 0, 1, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 17 },
- { 18, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 17 },
- { 18, 0, 0, 0, -1, 0, 24, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 17 },
- { 0, 17, 0, 5, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 17 },
- { 3, 0, 0, 0, 0, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 17 },
- { 3, 0, 0, 0, 1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 17 },
- { 3, 0, 0, 0, 2, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 17 },
- { 3, 0, 0, 0, 3, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 17 },
- { 3, 0, 0, 0, 4, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 17 },
- { 3, 0, 0, 0, 5, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 17 },
- { 3, 0, 0, 0, 6, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 17 },
- { 3, 0, 0, 0, 7, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 17 },
- { 3, 0, 0, 0, 8, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 17 },
- { 3, 0, 0, 0, 9, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 17 },
- { 25, 0, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 18, 0, 1, 17 },
- { 5, 10, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 17 },
- { 29, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 17 },
- { 18, 0, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 18 },
- { 0, 17, 0, 5, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 18 },
- { 1, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 1, 18 },
- { 25, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 18, 0, 1, 18 },
- { 18, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 18 },
- { 0, 17, 7, 5, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 18 },
- { 18, 0, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 18 },
- { 0, 0, 0, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 18 },
- { 1, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 1, 18 },
- { 1, 0, 0, 0, -1, 0, 1, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 18 },
- { 0, 17, 0, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 18 },
- { 0, 17, 9, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 18 },
- { 18, 0, 0, 0, -1, 0, 24, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 18 },
- { 0, 17, 0, 5, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 18 },
- { 3, 0, 0, 0, 0, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 18 },
- { 3, 0, 0, 0, 1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 18 },
- { 3, 0, 0, 0, 2, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 18 },
- { 3, 0, 0, 0, 3, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 18 },
- { 3, 0, 0, 0, 4, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 18 },
- { 3, 0, 0, 0, 5, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 18 },
- { 3, 0, 0, 0, 6, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 18 },
- { 3, 0, 0, 0, 7, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 18 },
- { 3, 0, 0, 0, 8, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 18 },
- { 3, 0, 0, 0, 9, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 18 },
- { 18, 0, 0, 0, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 18 },
- { 0, 17, 0, 5, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 19 },
- { 0, 17, 0, 5, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 19 },
- { 1, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 1, 19 },
- { 18, 0, 0, 0, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 19 },
- { 18, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 19 },
- { 18, 0, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 19 },
- { 0, 17, 9, 5, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 19 },
- { 18, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 19 },
- { 1, 0, 0, 0, -1, 0, 1, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 19 },
- { 0, 17, 0, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 19 },
- { 0, 17, 0, 5, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 19 },
- { 1, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 1, 19 },
- { 0, 17, 9, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 19 },
- { 18, 0, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 7, 10, 12, 8, 1, 19 },
- { 29, 0, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 19 },
- { 18, 0, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 19 },
- { 5, 0, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 19 },
- { 18, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 19 },
- { 3, 0, 0, 0, 0, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 19 },
- { 3, 0, 0, 0, 1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 19 },
- { 3, 0, 0, 0, 2, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 19 },
- { 3, 0, 0, 0, 3, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 19 },
- { 3, 0, 0, 0, 4, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 19 },
- { 3, 0, 0, 0, 5, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 19 },
- { 3, 0, 0, 0, 6, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 19 },
- { 3, 0, 0, 0, 7, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 19 },
- { 3, 0, 0, 0, 8, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 19 },
- { 3, 0, 0, 0, 9, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 19 },
- { 5, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 19 },
- { 29, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 10, 0, 1, 19 },
- { 0, 17, 0, 5, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 20 },
- { 1, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 1, 20 },
- { 18, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 20 },
- { 0, 17, 9, 5, -1, 0, 4, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 20 },
- { 1, 0, 0, 0, -1, 0, 4, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 20 },
- { 0, 17, 0, 5, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 20 },
- { 1, 0, 0, 0, -1, 0, 4, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 1, 20 },
- { 3, 0, 0, 0, 0, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 20 },
- { 3, 0, 0, 0, 1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 20 },
- { 3, 0, 0, 0, 2, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 20 },
- { 3, 0, 0, 0, 3, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 20 },
- { 3, 0, 0, 0, 4, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 20 },
- { 3, 0, 0, 0, 5, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 20 },
- { 3, 0, 0, 0, 6, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 20 },
- { 3, 0, 0, 0, 7, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 20 },
- { 3, 0, 0, 0, 8, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 20 },
- { 3, 0, 0, 0, 9, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 20 },
- { 25, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 20 },
- { 18, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 33, 8, 1, 21 },
- { 0, 17, 0, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 33, 4, 1, 21 },
- { 18, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 0, 33, 8, 3, 21 },
- { 0, 17, 103, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 33, 4, 1, 21 },
- { 0, 17, 9, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 33, 4, 1, 21 },
- { 17, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 33, 8, 1, 21 },
- { 0, 17, 107, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 33, 4, 1, 21 },
- { 25, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 21 },
- { 3, 0, 0, 0, 0, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 21 },
- { 3, 0, 0, 0, 1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 21 },
- { 3, 0, 0, 0, 2, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 21 },
- { 3, 0, 0, 0, 3, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 21 },
- { 3, 0, 0, 0, 4, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 21 },
- { 3, 0, 0, 0, 5, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 21 },
- { 3, 0, 0, 0, 6, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 21 },
- { 3, 0, 0, 0, 7, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 21 },
- { 3, 0, 0, 0, 8, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 21 },
- { 3, 0, 0, 0, 9, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 21 },
- { 25, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 1, 21 },
- { 18, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 33, 8, 1, 22 },
- { 18, 0, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 33, 8, 1, 22 },
- { 0, 17, 0, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 33, 4, 1, 22 },
- { 18, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 0, 33, 8, 3, 22 },
- { 0, 17, 118, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 33, 4, 1, 22 },
- { 0, 17, 9, 5, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 33, 4, 1, 22 },
- { 17, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 33, 8, 1, 22 },
- { 0, 17, 122, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 33, 4, 1, 22 },
- { 3, 0, 0, 0, 0, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 22 },
- { 3, 0, 0, 0, 1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 22 },
- { 3, 0, 0, 0, 2, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 22 },
- { 3, 0, 0, 0, 3, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 22 },
- { 3, 0, 0, 0, 4, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 22 },
- { 3, 0, 0, 0, 5, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 22 },
- { 3, 0, 0, 0, 6, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 22 },
- { 3, 0, 0, 0, 7, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 22 },
- { 3, 0, 0, 0, 8, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 22 },
- { 3, 0, 0, 0, 9, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 22 },
- { 18, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 33, 8, 3, 22 },
- { 18, 0, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 33, 8, 1, 22 },
- { 18, 0, 0, 0, -1, 0, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 23 },
- { 29, 0, 0, 0, -1, 0, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 18, 0, 1, 23 },
- { 25, 0, 0, 0, -1, 0, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 18, 0, 1, 23 },
- { 25, 0, 0, 0, -1, 0, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 23 },
- { 25, 0, 0, 0, -1, 0, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 4, 0, 1, 23 },
- { 25, 0, 0, 0, -1, 0, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 1, 23 },
- { 25, 0, 0, 0, -1, 0, 2, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 4, 0, 3, 23 },
- { 25, 0, 0, 0, -1, 0, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 6, 0, 1, 23 },
- { 29, 0, 0, 0, -1, 0, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 23 },
- { 0, 17, 220, 5, -1, 0, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 23 },
- { 3, 0, 0, 0, 0, 0, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 23 },
- { 3, 0, 0, 0, 1, 0, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 23 },
- { 3, 0, 0, 0, 2, 0, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 23 },
- { 3, 0, 0, 0, 3, 0, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 23 },
- { 3, 0, 0, 0, 4, 0, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 23 },
- { 3, 0, 0, 0, 5, 0, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 23 },
- { 3, 0, 0, 0, 6, 0, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 23 },
- { 3, 0, 0, 0, 7, 0, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 23 },
- { 3, 0, 0, 0, 8, 0, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 23 },
- { 3, 0, 0, 0, 9, 0, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 23 },
- { 5, 0, 0, 0, -1, 0, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 23 },
- { 29, 0, 0, 0, -1, 0, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 1, 23 },
- { 0, 17, 216, 5, -1, 0, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 23 },
- { 21, 10, 0, 0, -1, 1, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 1, 23 },
- { 22, 10, 0, 0, -1, -1, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 1, 23 },
- { 1, 0, 0, 0, -1, 0, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 1, 23 },
- { 18, 0, 0, 0, -1, 0, 2, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 3, 23 },
- { 18, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 23 },
- { 18, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 23 },
- { 0, 17, 129, 5, -1, 0, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 23 },
- { 0, 17, 130, 5, -1, 0, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 23 },
- { 0, 17, 0, 5, -1, 0, 2, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 3, 23 },
- { 0, 17, 132, 5, -1, 0, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 23 },
- { 0, 17, 0, 5, -1, 0, 2, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 3, 23 },
- { 0, 17, 0, 5, -1, 0, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 23 },
- { 1, 0, 0, 0, -1, 0, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 17, 4, 1, 23 },
- { 0, 17, 230, 5, -1, 0, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 23 },
- { 0, 17, 9, 5, -1, 0, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 23 },
- { 18, 0, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 23 },
- { 0, 17, 0, 5, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 23 },
- { 0, 17, 0, 5, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 23 },
- { 29, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 1, 23 },
- { 29, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 23 },
- { 0, 17, 220, 5, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 23 },
- { 29, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 23 },
- { 25, 0, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 18, 0, 1, 23 },
- { 25, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 1, 23 },
- { 25, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 18, 0, 1, 23 },
- { 25, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 23 },
- { 29, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 25, 0, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 4, 0, 1, 23 },
- { 18, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 33, 8, 1, 24 },
- { 18, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 33, 8, 1, 24 },
- { 18, 0, 0, 0, -1, 0, 4, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 33, 8, 1, 24 },
- { 1, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 4, 33, 4, 1, 24 },
- { 1, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 4, 33, 4, 1, 24 },
- { 0, 17, 0, 5, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 33, 4, 1, 24 },
- { 0, 17, 0, 5, -1, 0, 4, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 33, 4, 1, 24 },
- { 1, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 33, 4, 1, 24 },
- { 0, 17, 0, 5, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 33, 4, 1, 24 },
- { 0, 17, 7, 5, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 33, 4, 1, 24 },
- { 0, 17, 9, 5, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 33, 4, 1, 24 },
- { 0, 17, 9, 5, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 33, 4, 1, 24 },
- { 1, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 33, 4, 1, 24 },
- { 3, 0, 0, 0, 0, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 24 },
- { 3, 0, 0, 0, 1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 24 },
- { 3, 0, 0, 0, 2, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 24 },
- { 3, 0, 0, 0, 3, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 24 },
- { 3, 0, 0, 0, 4, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 24 },
- { 3, 0, 0, 0, 5, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 24 },
- { 3, 0, 0, 0, 6, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 24 },
- { 3, 0, 0, 0, 7, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 24 },
- { 3, 0, 0, 0, 8, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 24 },
- { 3, 0, 0, 0, 9, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 24 },
- { 25, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 1, 24 },
- { 25, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 24 },
- { 0, 17, 220, 5, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 33, 4, 1, 24 },
- { 3, 0, 0, 0, 0, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 24 },
- { 3, 0, 0, 0, 1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 24 },
- { 3, 0, 0, 0, 2, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 24 },
- { 3, 0, 0, 0, 3, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 24 },
- { 3, 0, 0, 0, 4, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 24 },
- { 3, 0, 0, 0, 5, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 24 },
- { 3, 0, 0, 0, 6, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 24 },
- { 3, 0, 0, 0, 7, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 24 },
- { 3, 0, 0, 0, 8, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 24 },
- { 3, 0, 0, 0, 9, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 24 },
- { 1, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 4, 33, 4, 1, 24 },
- { 0, 17, 0, 5, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 33, 4, 1, 24 },
- { 29, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 33, 0, 1, 24 },
- { 14, 0, 0, 0, -1, 0, 1, 0, { {0, 7264}, {0, 0}, {0, 0}, {0, 7264} }, 0, 10, 12, 7, 0, 25 },
- { 14, 0, 0, 0, -1, 0, 13, 0, { {0, 7264}, {0, 0}, {0, 0}, {0, 7264} }, 0, 10, 12, 7, 3, 25 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 3008}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 25 },
- { 15, 0, 0, 0, -1, 0, 6, 0, { {0, 0}, {0, 3008}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 25 },
- { 15, 0, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 3008}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 25 },
- { 25, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 17, 0, 0, 0, -1, 0, 8, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 3, 25 },
- { 15, 0, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 3008}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 25 },
- { 18, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 9, 10, 25, 8, 1, 26 },
- { 18, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 9, 10, 25, 8, 1, 26 },
- { 18, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 9, 10, 25, 8, 0, 26 },
- { 18, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 10, 10, 26, 8, 0, 26 },
- { 18, 0, 0, 0, -1, 0, 1, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 10, 10, 26, 8, 1, 26 },
- { 18, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 10, 10, 26, 8, 1, 26 },
- { 18, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 10, 10, 26, 8, 1, 26 },
- { 18, 0, 0, 0, -1, 0, 1, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 11, 10, 27, 8, 1, 26 },
- { 18, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 11, 10, 27, 8, 1, 26 },
- { 18, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 11, 10, 27, 8, 1, 26 },
- { 18, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 27 },
- { 18, 0, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 27 },
- { 0, 17, 230, 5, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 27 },
- { 0, 17, 230, 5, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 27 },
- { 25, 0, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 27 },
- { 25, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 1, 27 },
- { 25, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 12, 1, 27 },
- { 25, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 27 },
- { 5, 0, 0, 0, 1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 27 },
- { 5, 0, 0, 0, 2, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 27 },
- { 5, 0, 0, 0, 3, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 27 },
- { 5, 0, 0, 0, 4, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 27 },
- { 5, 0, 0, 0, 5, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 27 },
- { 5, 0, 0, 0, 6, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 27 },
- { 5, 0, 0, 0, 7, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 27 },
- { 5, 0, 0, 0, 8, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 27 },
- { 5, 0, 0, 0, 9, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 27 },
- { 5, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 27 },
- { 29, 10, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 27 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 41}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 43}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 45}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 47}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 49}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 51}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 53}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 55}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 57}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 59}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 61}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 63}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 65}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 67}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 69}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 71}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 73}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 75}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 77}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 79}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 81}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 83}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 85}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 87}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 89}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 91}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 93}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 95}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 97}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 99}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 101}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 103}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 105}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 107}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 109}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 111}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 113}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 115}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 117}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 119}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 121}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 123}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 125}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 127}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 129}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 131}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 133}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 135}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 137}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 139}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 141}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 143}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 145}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 147}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 149}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 151}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 153}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 155}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 157}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 159}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 161}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 163}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 165}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 167}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 169}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 171}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 173}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 175}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 177}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 179}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 181}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 183}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 185}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 187}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 189}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 191}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 193}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 195}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 197}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 199}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 28 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {0, 8}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 28 },
- { 14, 0, 0, 0, -1, 0, 17, 0, { {0, 8}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, -8}, {0, -8}, {0, -8} }, 0, 10, 12, 6, 3, 28 },
- { 20, 10, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 1, 29 },
- { 18, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 29 },
- { 29, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 29 },
- { 25, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 12, 1, 29 },
- { 18, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 29 },
- { 6, 9, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 22, 17, 5, 0, 30 },
- { 18, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 30 },
- { 21, 10, 0, 0, -1, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 1, 30 },
- { 22, 10, 0, 0, -1, -1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 1, 30 },
- { 18, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 31 },
- { 25, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 1, 2 },
- { 4, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 31 },
- { 18, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 31 },
- { 18, 0, 0, 0, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 42 },
- { 18, 0, 0, 0, -1, 0, 24, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 42 },
- { 0, 17, 0, 5, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 42 },
- { 0, 17, 9, 5, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 42 },
- { 1, 0, 9, 0, -1, 0, 24, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 1, 42 },
- { 18, 0, 0, 0, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 43 },
- { 0, 17, 0, 5, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 43 },
- { 1, 0, 9, 0, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 1, 43 },
- { 25, 0, 0, 0, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 1, 2 },
- { 18, 0, 0, 0, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 44 },
- { 0, 17, 0, 5, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 44 },
- { 18, 0, 0, 0, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 45 },
- { 0, 17, 0, 5, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 45 },
- { 18, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 33, 8, 1, 32 },
- { 0, 17, 0, 5, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 33, 4, 0, 32 },
- { 1, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 33, 4, 1, 32 },
- { 0, 17, 0, 5, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 33, 4, 1, 32 },
- { 0, 17, 9, 5, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 33, 4, 1, 32 },
- { 25, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 1, 32 },
- { 25, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 5, 0, 1, 32 },
- { 17, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 33, 8, 1, 32 },
- { 25, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 32 },
- { 27, 4, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 9, 0, 1, 32 },
- { 0, 17, 230, 5, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 33, 4, 1, 32 },
- { 3, 0, 0, 0, 0, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 32 },
- { 3, 0, 0, 0, 1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 32 },
- { 3, 0, 0, 0, 2, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 32 },
- { 3, 0, 0, 0, 3, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 32 },
- { 3, 0, 0, 0, 4, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 32 },
- { 3, 0, 0, 0, 5, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 32 },
- { 3, 0, 0, 0, 6, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 32 },
- { 3, 0, 0, 0, 7, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 32 },
- { 3, 0, 0, 0, 8, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 32 },
- { 3, 0, 0, 0, 9, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 32 },
- { 5, 10, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 32 },
- { 25, 10, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 33 },
- { 25, 10, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 6, 11, 1, 2 },
- { 25, 10, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 6, 12, 1, 2 },
- { 25, 10, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 1, 33 },
- { 25, 10, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 1, 2 },
- { 20, 10, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 18, 0, 0, 33 },
- { 25, 10, 0, 2, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 33 },
- { 25, 10, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 6, 11, 1, 33 },
- { 25, 10, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 6, 12, 1, 33 },
- { 25, 10, 0, 1, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 33 },
- { 0, 17, 0, 5, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 2, 33 },
- { 10, 18, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 4, 4, 0, 33 },
- { 0, 17, 0, 5, -1, 0, 24, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 2, 33 },
- { 3, 0, 0, 0, 0, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 33 },
- { 3, 0, 0, 0, 1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 33 },
- { 3, 0, 0, 0, 2, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 33 },
- { 3, 0, 0, 0, 3, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 33 },
- { 3, 0, 0, 0, 4, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 33 },
- { 3, 0, 0, 0, 5, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 33 },
- { 3, 0, 0, 0, 6, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 33 },
- { 3, 0, 0, 0, 7, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 33 },
- { 3, 0, 0, 0, 8, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 33 },
- { 3, 0, 0, 0, 9, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 33 },
- { 18, 0, 0, 2, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 33 },
- { 17, 0, 0, 2, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 33 },
- { 18, 0, 0, 2, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 33 },
- { 18, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 33 },
- { 0, 17, 0, 5, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 33 },
- { 0, 17, 228, 5, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 33 },
- { 18, 0, 0, 2, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 33 },
- { 18, 0, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 47 },
- { 18, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 47 },
- { 0, 17, 0, 5, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 47 },
- { 1, 0, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 1, 47 },
- { 0, 17, 222, 5, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 47 },
- { 0, 17, 230, 5, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 47 },
- { 0, 17, 220, 5, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 47 },
- { 29, 10, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 47 },
- { 25, 10, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 6, 12, 1, 47 },
- { 3, 0, 0, 0, 0, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 47 },
- { 3, 0, 0, 0, 1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 47 },
- { 3, 0, 0, 0, 2, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 47 },
- { 3, 0, 0, 0, 3, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 47 },
- { 3, 0, 0, 0, 4, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 47 },
- { 3, 0, 0, 0, 5, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 47 },
- { 3, 0, 0, 0, 6, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 47 },
- { 3, 0, 0, 0, 7, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 47 },
- { 3, 0, 0, 0, 8, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 47 },
- { 3, 0, 0, 0, 9, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 47 },
- { 18, 0, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 33, 8, 1, 48 },
- { 18, 0, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 33, 8, 1, 56 },
- { 18, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 33, 8, 1, 56 },
- { 3, 0, 0, 0, 0, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 56 },
- { 3, 0, 0, 0, 1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 56 },
- { 3, 0, 0, 0, 2, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 56 },
- { 3, 0, 0, 0, 3, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 56 },
- { 3, 0, 0, 0, 4, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 56 },
- { 3, 0, 0, 0, 5, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 56 },
- { 3, 0, 0, 0, 6, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 56 },
- { 3, 0, 0, 0, 7, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 56 },
- { 3, 0, 0, 0, 8, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 56 },
- { 3, 0, 0, 0, 9, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 56 },
- { 5, 0, 0, 0, 1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 33, 0, 1, 56 },
- { 29, 10, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 33, 0, 1, 56 },
- { 29, 10, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 32 },
- { 18, 0, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 55 },
- { 0, 17, 230, 5, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 55 },
- { 0, 17, 220, 5, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 55 },
- { 1, 0, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 1, 55 },
- { 0, 17, 0, 5, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 55 },
- { 25, 0, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 55 },
- { 18, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 33, 8, 1, 78 },
- { 1, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 33, 4, 1, 78 },
- { 0, 17, 0, 5, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 33, 4, 1, 78 },
- { 0, 17, 9, 5, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 33, 4, 1, 78 },
- { 1, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 4, 33, 4, 1, 78 },
- { 0, 17, 230, 5, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 33, 4, 1, 78 },
- { 0, 17, 220, 5, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 78 },
- { 3, 0, 0, 0, 0, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 78 },
- { 3, 0, 0, 0, 1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 78 },
- { 3, 0, 0, 0, 2, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 78 },
- { 3, 0, 0, 0, 3, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 78 },
- { 3, 0, 0, 0, 4, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 78 },
- { 3, 0, 0, 0, 5, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 78 },
- { 3, 0, 0, 0, 6, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 78 },
- { 3, 0, 0, 0, 7, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 78 },
- { 3, 0, 0, 0, 8, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 78 },
- { 3, 0, 0, 0, 9, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 78 },
- { 25, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 33, 0, 1, 78 },
- { 17, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 33, 8, 1, 78 },
- { 25, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 33, 12, 1, 78 },
- { 0, 17, 230, 5, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 1 },
- { 0, 17, 220, 5, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 1 },
- { 2, 17, 0, 5, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 1 },
- { 0, 17, 220, 5, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 1 },
- { 0, 17, 230, 5, -1, 0, 24, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 1 },
- { 0, 17, 220, 5, -1, 0, 24, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 1 },
- { 0, 17, 0, 5, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 62 },
- { 1, 0, 0, 0, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 1, 62 },
- { 18, 0, 0, 0, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 62 },
- { 18, 0, 0, 0, -1, 0, 9, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 62 },
- { 0, 17, 7, 5, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 62 },
- { 1, 0, 0, 0, -1, 0, 9, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 62 },
- { 1, 0, 0, 0, -1, 0, 9, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 1, 62 },
- { 1, 0, 9, 0, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 1, 62 },
- { 18, 0, 0, 0, -1, 0, 24, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 62 },
- { 3, 0, 0, 0, 0, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 62 },
- { 3, 0, 0, 0, 1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 62 },
- { 3, 0, 0, 0, 2, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 62 },
- { 3, 0, 0, 0, 3, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 62 },
- { 3, 0, 0, 0, 4, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 62 },
- { 3, 0, 0, 0, 5, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 62 },
- { 3, 0, 0, 0, 6, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 62 },
- { 3, 0, 0, 0, 7, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 62 },
- { 3, 0, 0, 0, 8, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 62 },
- { 3, 0, 0, 0, 9, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 62 },
- { 25, 0, 0, 0, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 1, 62 },
- { 25, 0, 0, 0, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 62 },
- { 25, 0, 0, 0, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 1, 62 },
- { 29, 0, 0, 0, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 62 },
- { 0, 17, 230, 5, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 62 },
- { 0, 17, 220, 5, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 62 },
- { 25, 0, 0, 0, -1, 0, 24, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 1, 62 },
- { 0, 17, 0, 5, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 67 },
- { 1, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 1, 67 },
- { 18, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 67 },
- { 1, 0, 9, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 1, 67 },
- { 0, 17, 9, 5, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 67 },
- { 0, 17, 0, 5, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 67 },
- { 3, 0, 0, 0, 0, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 67 },
- { 3, 0, 0, 0, 1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 67 },
- { 3, 0, 0, 0, 2, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 67 },
- { 3, 0, 0, 0, 3, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 67 },
- { 3, 0, 0, 0, 4, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 67 },
- { 3, 0, 0, 0, 5, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 67 },
- { 3, 0, 0, 0, 6, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 67 },
- { 3, 0, 0, 0, 7, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 67 },
- { 3, 0, 0, 0, 8, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 67 },
- { 3, 0, 0, 0, 9, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 67 },
- { 18, 0, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 67 },
- { 18, 0, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 93 },
- { 0, 17, 7, 5, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 93 },
- { 1, 0, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 1, 93 },
- { 0, 17, 0, 5, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 93 },
- { 1, 0, 9, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 1, 93 },
- { 25, 0, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 93 },
- { 18, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 68 },
- { 1, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 1, 68 },
- { 0, 17, 0, 5, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 68 },
- { 0, 17, 7, 5, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 68 },
- { 25, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 1, 68 },
- { 25, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 1, 68 },
- { 3, 0, 0, 0, 0, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 68 },
- { 3, 0, 0, 0, 1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 68 },
- { 3, 0, 0, 0, 2, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 68 },
- { 3, 0, 0, 0, 3, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 68 },
- { 3, 0, 0, 0, 4, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 68 },
- { 3, 0, 0, 0, 5, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 68 },
- { 3, 0, 0, 0, 6, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 68 },
- { 3, 0, 0, 0, 7, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 68 },
- { 3, 0, 0, 0, 8, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 68 },
- { 3, 0, 0, 0, 9, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 68 },
- { 3, 0, 0, 0, 0, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 69 },
- { 3, 0, 0, 0, 1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 69 },
- { 3, 0, 0, 0, 2, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 69 },
- { 3, 0, 0, 0, 3, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 69 },
- { 3, 0, 0, 0, 4, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 69 },
- { 3, 0, 0, 0, 5, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 69 },
- { 3, 0, 0, 0, 6, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 69 },
- { 3, 0, 0, 0, 7, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 69 },
- { 3, 0, 0, 0, 8, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 69 },
- { 3, 0, 0, 0, 9, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 69 },
- { 18, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 69 },
- { 17, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 69 },
- { 25, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 1, 69 },
- { 15, 0, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, -6254}, {0, -6254}, {0, -6222} }, 0, 10, 12, 6, 3, 5 },
- { 15, 0, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, -6253}, {0, -6253}, {0, -6221} }, 0, 10, 12, 6, 3, 5 },
- { 15, 0, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, -6244}, {0, -6244}, {0, -6212} }, 0, 10, 12, 6, 3, 5 },
- { 15, 0, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, -6242}, {0, -6242}, {0, -6210} }, 0, 10, 12, 6, 3, 5 },
- { 15, 0, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, -6243}, {0, -6243}, {0, -6211} }, 0, 10, 12, 6, 3, 5 },
- { 15, 0, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, -6236}, {0, -6236}, {0, -6204} }, 0, 10, 12, 6, 3, 5 },
- { 15, 0, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, -6181}, {0, -6181}, {0, -6180} }, 0, 10, 12, 6, 3, 5 },
- { 15, 0, 0, 0, -1, 0, 18, 0, { {0, 0}, {1, 201}, {1, 201}, {1, 719} }, 0, 10, 12, 6, 3, 5 },
- { 14, 0, 0, 0, -1, 0, 20, 0, { {0, -3008}, {0, 0}, {0, 0}, {0, -3008} }, 0, 10, 12, 8, 3, 25 },
- { 25, 0, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 67 },
- { 0, 17, 230, 5, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 1 },
- { 25, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 0, 17, 1, 5, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 1 },
- { 0, 17, 220, 5, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 1 },
- { 1, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 1, 2 },
- { 18, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 2 },
- { 18, 0, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 2 },
- { 0, 17, 230, 5, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 1 },
- { 1, 0, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 1, 2 },
- { 18, 0, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 2 },
- { 15, 0, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 1, 4 },
- { 15, 0, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 1, 5 },
- { 17, 0, 0, 0, -1, 0, 7, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 3, 3 },
- { 17, 0, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 17, 0, 0, 0, -1, 0, 7, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 3, 4 },
- { 17, 0, 0, 0, -1, 0, 8, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 3, 5 },
- { 15, 0, 0, 0, -1, 0, 8, 0, { {0, 0}, {1, 203}, {1, 203}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 15, 0, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 3814}, {0, 3814}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 15, 0, 0, 0, -1, 0, 8, 0, { {0, 0}, {1, 205}, {1, 205}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 17, 0, 0, 0, -1, 0, 8, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 3, 3 },
- { 17, 0, 0, 0, -1, 0, 8, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 3, 4 },
- { 0, 17, 230, 5, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 1 },
- { 0, 17, 220, 5, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 1 },
- { 0, 17, 230, 5, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 1 },
- { 0, 17, 234, 5, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 1 },
- { 0, 17, 214, 5, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 1 },
- { 0, 17, 220, 5, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 1 },
- { 0, 17, 202, 5, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 1 },
- { 0, 17, 232, 5, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 1 },
- { 0, 17, 228, 5, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 1 },
- { 0, 17, 220, 5, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 1 },
- { 0, 17, 218, 5, -1, 0, 24, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 1 },
- { 0, 17, 230, 5, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 1 },
- { 0, 17, 233, 5, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 1 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 514}, {1, 514}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 517}, {1, 517}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 520}, {1, 520}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 523}, {1, 523}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {1, 526}, {1, 526}, {0, 0} }, 0, 10, 12, 6, 3, 3 },
- { 15, 0, 0, 0, -1, 0, 2, 81, { {0, 0}, {0, -59}, {0, -59}, {0, -58} }, 0, 10, 12, 6, 3, 3 },
- { 15, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 14, 0, 0, 0, -1, 0, 10, 0, { {0, -7615}, {0, 0}, {0, 0}, {0, -7615} }, 0, 10, 12, 7, 3, 3 },
- { 14, 0, 0, 0, -1, 0, 10, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 3, 3 },
- { 15, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {0, 8}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 1, 4 },
- { 14, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {0, 0}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 3, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 529}, {1, 529}, {0, 0} }, 0, 10, 12, 6, 1, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 532}, {1, 532}, {0, 0} }, 0, 10, 12, 6, 1, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 536}, {1, 536}, {0, 0} }, 0, 10, 12, 6, 1, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 540}, {1, 540}, {0, 0} }, 0, 10, 12, 6, 1, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {0, 74}, {0, 74}, {0, 0} }, 0, 10, 12, 6, 1, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 85, { {0, 0}, {0, 74}, {0, 74}, {0, 0} }, 0, 10, 12, 6, 3, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {0, 86}, {0, 86}, {0, 0} }, 0, 10, 12, 6, 1, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 85, { {0, 0}, {0, 86}, {0, 86}, {0, 0} }, 0, 10, 12, 6, 3, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {0, 100}, {0, 100}, {0, 0} }, 0, 10, 12, 6, 1, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 85, { {0, 0}, {0, 100}, {0, 100}, {0, 0} }, 0, 10, 12, 6, 3, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {0, 128}, {0, 128}, {0, 0} }, 0, 10, 12, 6, 1, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 85, { {0, 0}, {0, 128}, {0, 128}, {0, 0} }, 0, 10, 12, 6, 3, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {0, 112}, {0, 112}, {0, 0} }, 0, 10, 12, 6, 1, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 85, { {0, 0}, {0, 112}, {0, 112}, {0, 0} }, 0, 10, 12, 6, 3, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {0, 126}, {0, 126}, {0, 0} }, 0, 10, 12, 6, 1, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 85, { {0, 0}, {0, 126}, {0, 126}, {0, 0} }, 0, 10, 12, 6, 3, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 578}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 3, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 581}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 3, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 584}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 3, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 587}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 3, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 590}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 3, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 593}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 3, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 596}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 3, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 599}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 3, 4 },
- { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 578}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 3, 4 },
- { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 581}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 3, 4 },
- { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 584}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 3, 4 },
- { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 587}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 3, 4 },
- { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 590}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 3, 4 },
- { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 593}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 3, 4 },
- { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 596}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 3, 4 },
- { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 599}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 3, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 602}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 3, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 605}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 3, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 608}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 3, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 611}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 3, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 614}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 3, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 617}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 3, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 620}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 3, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 623}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 3, 4 },
- { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 602}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 3, 4 },
- { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 605}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 3, 4 },
- { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 608}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 3, 4 },
- { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 611}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 3, 4 },
- { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 614}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 3, 4 },
- { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 617}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 3, 4 },
- { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 620}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 3, 4 },
- { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 623}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 3, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 626}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 3, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 629}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 3, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 632}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 3, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 635}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 3, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 638}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 3, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 641}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 3, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 644}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 3, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 647}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 3, 4 },
- { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 626}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 3, 4 },
- { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 629}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 3, 4 },
- { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 632}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 3, 4 },
- { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 635}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 3, 4 },
- { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 638}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 3, 4 },
- { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 641}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 3, 4 },
- { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 644}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 3, 4 },
- { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 647}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 3, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 662}, {1, 659}, {0, 0} }, 0, 10, 12, 6, 3, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 650}, {0, 9}, {0, 0} }, 0, 10, 12, 6, 3, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 668}, {1, 665}, {0, 0} }, 0, 10, 12, 6, 3, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 544}, {1, 544}, {0, 0} }, 0, 10, 12, 6, 1, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 699}, {1, 695}, {0, 0} }, 0, 10, 12, 6, 3, 4 },
- { 14, 0, 0, 0, -1, 0, 1, 17, { {0, -74}, {0, 0}, {0, 0}, {0, -74} }, 0, 10, 12, 7, 3, 4 },
- { 14, 0, 0, 0, -1, 0, 1, 85, { {0, -74}, {0, 0}, {0, 0}, {0, -74} }, 0, 10, 12, 7, 3, 4 },
- { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -9}, {1, 650}, {0, 0}, {0, -9} }, 0, 10, 12, 7, 3, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 85, { {0, 0}, {0, -7205}, {0, -7205}, {0, -7173} }, 0, 10, 12, 6, 3, 4 },
- { 28, 10, 0, 0, -1, 0, 1, 81, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 0, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 674}, {1, 671}, {0, 0} }, 0, 10, 12, 6, 3, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 653}, {0, 9}, {0, 0} }, 0, 10, 12, 6, 3, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 680}, {1, 677}, {0, 0} }, 0, 10, 12, 6, 3, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 547}, {1, 547}, {0, 0} }, 0, 10, 12, 6, 1, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 707}, {1, 703}, {0, 0} }, 0, 10, 12, 6, 3, 4 },
- { 14, 0, 0, 0, -1, 0, 1, 17, { {0, -86}, {0, 0}, {0, 0}, {0, -86} }, 0, 10, 12, 7, 3, 4 },
- { 14, 0, 0, 0, -1, 0, 1, 85, { {0, -86}, {0, 0}, {0, 0}, {0, -86} }, 0, 10, 12, 7, 3, 4 },
- { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -9}, {1, 653}, {0, 0}, {0, -9} }, 0, 10, 12, 7, 3, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 550}, {1, 550}, {0, 0} }, 0, 10, 12, 6, 1, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 85, { {0, 0}, {1, 503}, {1, 503}, {0, 0} }, 0, 10, 12, 6, 3, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 554}, {1, 554}, {0, 0} }, 0, 10, 12, 6, 1, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 557}, {1, 557}, {0, 0} }, 0, 10, 12, 6, 1, 4 },
- { 14, 0, 0, 0, -1, 0, 1, 17, { {0, -100}, {0, 0}, {0, 0}, {0, -100} }, 0, 10, 12, 7, 3, 4 },
- { 14, 0, 0, 0, -1, 0, 1, 85, { {0, -100}, {0, 0}, {0, 0}, {0, -100} }, 0, 10, 12, 7, 3, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 561}, {1, 561}, {0, 0} }, 0, 10, 12, 6, 1, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 85, { {0, 0}, {1, 507}, {1, 507}, {0, 0} }, 0, 10, 12, 6, 3, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 565}, {1, 565}, {0, 0} }, 0, 10, 12, 6, 1, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {0, 7}, {0, 7}, {0, 0} }, 0, 10, 12, 6, 1, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 568}, {1, 568}, {0, 0} }, 0, 10, 12, 6, 1, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 571}, {1, 571}, {0, 0} }, 0, 10, 12, 6, 1, 4 },
- { 14, 0, 0, 0, -1, 0, 1, 17, { {0, -112}, {0, 0}, {0, 0}, {0, -112} }, 0, 10, 12, 7, 3, 4 },
- { 14, 0, 0, 0, -1, 0, 1, 85, { {0, -112}, {0, 0}, {0, 0}, {0, -112} }, 0, 10, 12, 7, 3, 4 },
- { 14, 0, 0, 0, -1, 0, 1, 17, { {0, -7}, {0, 0}, {0, 0}, {0, -7} }, 0, 10, 12, 7, 3, 4 },
- { 28, 10, 0, 0, -1, 0, 1, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 0, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 686}, {1, 683}, {0, 0} }, 0, 10, 12, 6, 3, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 656}, {0, 9}, {0, 0} }, 0, 10, 12, 6, 3, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 692}, {1, 689}, {0, 0} }, 0, 10, 12, 6, 3, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 575}, {1, 575}, {0, 0} }, 0, 10, 12, 6, 1, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 715}, {1, 711}, {0, 0} }, 0, 10, 12, 6, 3, 4 },
- { 14, 0, 0, 0, -1, 0, 1, 17, { {0, -128}, {0, 0}, {0, 0}, {0, -128} }, 0, 10, 12, 7, 3, 4 },
- { 14, 0, 0, 0, -1, 0, 1, 85, { {0, -128}, {0, 0}, {0, 0}, {0, -128} }, 0, 10, 12, 7, 3, 4 },
- { 14, 0, 0, 0, -1, 0, 1, 17, { {0, -126}, {0, 0}, {0, 0}, {0, -126} }, 0, 10, 12, 7, 3, 4 },
- { 14, 0, 0, 0, -1, 0, 1, 85, { {0, -126}, {0, 0}, {0, 0}, {0, -126} }, 0, 10, 12, 7, 3, 4 },
- { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -9}, {1, 656}, {0, 0}, {0, -9} }, 0, 10, 12, 7, 3, 4 },
- { 28, 10, 0, 0, -1, 0, 1, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 18, 0, 0, 4 },
- { 6, 9, 0, 0, -1, 0, 1, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 22, 17, 5, 0, 2 },
- { 6, 9, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 22, 17, 5, 0, 2 },
- { 6, 9, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 4, 5, 0, 2 },
- { 10, 18, 0, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 0, 20, 4, 2, 2 },
- { 10, 18, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 4, 1 },
- { 10, 18, 0, 1, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 5, 5, 32, 4, 4, 1 },
- { 10, 0, 0, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 21, 4, 0, 2 },
- { 10, 1, 0, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 21, 4, 0, 2 },
- { 20, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 1, 2 },
- { 20, 10, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 4, 0, 3, 2 },
- { 20, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 11, 1, 2 },
- { 20, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 11, 1, 2 },
- { 20, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 25, 10, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 0, 2 },
- { 23, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 13, 3, 13, 1, 2 },
- { 24, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 13, 3, 13, 1, 2 },
- { 21, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 1, 2 },
- { 23, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 3, 13, 1, 2 },
- { 24, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 3, 13, 1, 2 },
- { 25, 10, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 13, 15, 10, 0, 2 },
- { 25, 10, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 15, 0, 0, 2 },
- { 25, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 14, 17, 0, 1, 2 },
- { 7, 9, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 3, 38, 3, 0, 2 },
- { 8, 7, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 3, 38, 3, 0, 2 },
- { 10, 11, 0, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 21, 4, 0, 2 },
- { 10, 14, 0, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 21, 4, 0, 2 },
- { 10, 16, 0, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 21, 4, 0, 2 },
- { 10, 12, 0, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 21, 4, 0, 2 },
- { 10, 15, 0, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 21, 4, 0, 2 },
- { 6, 6, 0, 0, -1, 0, 4, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 17, 4, 5, 0, 2 },
- { 25, 4, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 10, 0, 1, 2 },
- { 25, 4, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 10, 0, 3, 2 },
- { 25, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 10, 0, 1, 2 },
- { 25, 10, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 10, 0, 3, 2 },
- { 23, 10, 0, 0, -1, 1, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 3, 13, 1, 2 },
- { 24, 10, 0, 0, -1, -1, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 3, 13, 1, 2 },
- { 25, 10, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 5, 12, 0, 2 },
- { 25, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 5, 12, 1, 2 },
- { 26, 6, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 15, 8, 0, 1, 2 },
- { 21, 10, 0, 0, -1, 1, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 1, 2 },
- { 22, 10, 0, 0, -1, -1, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 1, 2 },
- { 25, 10, 0, 0, -1, 0, 6, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 5, 12, 0, 2 },
- { 25, 10, 0, 0, -1, 0, 4, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 5, 12, 0, 2 },
- { 25, 10, 0, 0, -1, 0, 4, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 5, 12, 0, 2 },
- { 25, 10, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 25, 10, 0, 0, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 26, 10, 0, 0, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 25, 10, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 19, 10, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 17, 12, 0, 1, 2 },
- { 25, 10, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 25, 10, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 1, 2 },
- { 25, 10, 0, 0, -1, 0, 6, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 3, 2 },
- { 6, 9, 0, 0, -1, 0, 6, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 22, 17, 5, 0, 2 },
- { 10, 18, 0, 5, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 22, 4, 2, 2 },
- { 10, 18, 0, 5, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 12, 4, 0, 2 },
- { 10, 18, 0, 5, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 12, 4, 2, 2 },
- { 13, 18, 0, 0, -1, 0, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 0, 12, 0, 0, 0 },
- { 10, 19, 0, 0, -1, 0, 15, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 21, 4, 0, 2 },
- { 10, 20, 0, 0, -1, 0, 15, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 21, 4, 0, 2 },
- { 10, 21, 0, 0, -1, 0, 15, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 21, 4, 0, 2 },
- { 10, 22, 0, 0, -1, 0, 15, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 21, 4, 0, 2 },
- { 10, 18, 0, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 21, 4, 0, 2 },
- { 5, 2, 0, 0, 0, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 3, 2 },
- { 17, 0, 0, 0, -1, 0, 6, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 3, 3 },
- { 5, 2, 0, 0, 4, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 3, 2 },
- { 5, 2, 0, 0, 5, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 3, 2 },
- { 5, 2, 0, 0, 6, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 3, 2 },
- { 5, 2, 0, 0, 7, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 3, 2 },
- { 5, 2, 0, 0, 8, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 3, 2 },
- { 5, 2, 0, 0, 9, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 3, 2 },
- { 26, 3, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 0, 2 },
- { 26, 3, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 3, 2 },
- { 26, 10, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 0, 2 },
- { 21, 10, 0, 0, -1, 1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 0, 2 },
- { 22, 10, 0, 0, -1, -1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 0, 2 },
- { 17, 0, 0, 0, -1, 0, 12, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 3, 3 },
- { 27, 4, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 9, 0, 3, 2 },
- { 27, 4, 0, 0, -1, 0, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 9, 0, 1, 2 },
- { 27, 4, 0, 0, -1, 0, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 9, 0, 1, 2 },
- { 27, 4, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 9, 0, 1, 2 },
- { 27, 4, 0, 0, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 9, 0, 1, 2 },
- { 27, 4, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 9, 0, 1, 2 },
- { 27, 4, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 10, 0, 1, 2 },
- { 27, 4, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 9, 0, 1, 2 },
- { 27, 4, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 9, 0, 1, 2 },
- { 27, 4, 0, 0, -1, 0, 14, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 9, 0, 1, 2 },
- { 27, 4, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 10, 0, 1, 2 },
- { 27, 4, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 9, 0, 1, 2 },
- { 27, 4, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 10, 0, 1, 2 },
- { 27, 4, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 9, 0, 1, 2 },
- { 27, 4, 0, 0, -1, 0, 24, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 10, 0, 1, 2 },
- { 13, 4, 0, 0, -1, 0, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 9, 0, 0, 0 },
- { 2, 17, 0, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 1 },
- { 2, 17, 0, 5, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 1 },
- { 2, 17, 0, 5, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 1 },
- { 0, 17, 1, 5, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 1 },
- { 0, 17, 220, 5, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 1 },
- { 0, 17, 1, 5, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 1 },
- { 29, 10, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 0, 2 },
- { 14, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 3, 2 },
- { 29, 10, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 10, 0, 3, 2 },
- { 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 3, 2 },
- { 29, 10, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 9, 0, 3, 2 },
- { 29, 10, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 3, 2 },
- { 29, 10, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 12, 0, 3, 2 },
- { 14, 0, 0, 0, -1, 0, 1, 85, { {0, -7517}, {0, 0}, {0, 0}, {0, -7517} }, 0, 10, 12, 7, 3, 4 },
- { 14, 0, 0, 0, -1, 0, 1, 85, { {1, 207}, {0, 0}, {0, 0}, {1, 207} }, 0, 10, 12, 7, 3, 3 },
- { 14, 0, 0, 0, -1, 0, 1, 85, { {1, 209}, {0, 0}, {0, 0}, {1, 209} }, 0, 10, 12, 7, 3, 3 },
- { 29, 4, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 14, 0, 0, 0, -1, 0, 1, 0, { {0, 28}, {0, 0}, {0, 0}, {0, 28} }, 0, 10, 12, 7, 0, 3 },
- { 18, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 3, 2 },
- { 15, 0, 0, 0, -1, 0, 4, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 10, 12, 6, 3, 2 },
- { 29, 10, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 29, 10, 0, 0, -1, 0, 7, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 3, 2 },
- { 15, 0, 0, 0, -1, 0, 8, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 3, 2 },
- { 15, 0, 0, 0, -1, 0, 6, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 3, 2 },
- { 14, 0, 0, 0, -1, 0, 6, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 3, 2 },
- { 26, 10, 0, 0, -1, 0, 6, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 3, 2 },
- { 29, 10, 0, 0, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 29, 10, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 29, 10, 0, 0, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 15, 0, 0, 0, -1, 0, 9, 0, { {0, 0}, {0, -28}, {0, -28}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 29, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 5, 10, 0, 0, -1, 0, 11, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 3, 2 },
- { 4, 0, 0, 0, -1, 0, 1, 80, { {0, 16}, {0, 0}, {0, 0}, {0, 16} }, 0, 10, 12, 7, 3, 3 },
- { 4, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, -16}, {0, -16}, {0, 0} }, 0, 10, 12, 6, 3, 3 },
- { 4, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 3 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 0, 3 },
- { 4, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 3 },
- { 29, 10, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 26, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 12, 0, 1, 2 },
- { 26, 10, 0, 0, -1, 0, 1, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 29, 10, 0, 0, -1, 0, 1, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 26, 10, 0, 0, -1, 3, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 26, 10, 0, 0, -1, 3, 1, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 26, 10, 0, 0, -1, -3, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 26, 10, 0, 0, -1, -3, 1, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 26, 3, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 9, 0, 1, 2 },
- { 26, 10, 0, 0, -1, 2016, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 26, 10, 0, 0, -1, 2527, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 26, 10, 0, 0, -1, 1923, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 26, 10, 0, 0, -1, 1914, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 26, 10, 0, 0, -1, 1918, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 26, 10, 0, 0, -1, 2250, 1, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 26, 10, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 3, 2 },
- { 26, 10, 0, 0, -1, 1, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 26, 10, 0, 0, -1, -1, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 26, 10, 0, 0, -1, 138, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 26, 10, 0, 0, -1, 7, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 26, 10, 0, 0, -1, -7, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 26, 10, 0, 0, -1, 0, 1, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 0, 2 },
- { 26, 10, 0, 0, -1, 1, 1, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 0, 2 },
- { 26, 10, 0, 0, -1, -1, 1, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 0, 2 },
- { 26, 10, 0, 0, -1, 1, 1, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 26, 10, 0, 0, -1, -1, 1, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 26, 10, 0, 0, -1, 1824, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 26, 10, 0, 0, -1, 2104, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 26, 10, 0, 0, -1, 2108, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 26, 10, 0, 0, -1, 2106, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 26, 10, 0, 0, -1, 1316, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 26, 10, 0, 0, -1, -138, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 26, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 15, 0, 1, 2 },
- { 26, 10, 0, 0, -1, 8, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 26, 10, 0, 0, -1, 7, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 26, 10, 0, 0, -1, -8, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 26, 10, 0, 0, -1, -7, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 29, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 1, 2 },
- { 21, 10, 0, 0, -1, 1, 1, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 3, 2 },
- { 22, 10, 0, 0, -1, -1, 1, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 3, 2 },
- { 29, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 29, 10, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 12, 0, 1, 2 },
- { 29, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 29, 10, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 12, 0, 1, 2 },
- { 29, 10, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 26, 10, 0, 0, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 29, 10, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 29, 10, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 12, 0, 1, 2 },
- { 29, 10, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 1, 2 },
- { 29, 10, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 29, 10, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 12, 0, 1, 2 },
- { 29, 10, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 29, 10, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 5, 10, 0, 0, 1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 3, 2 },
- { 5, 10, 0, 0, 2, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 3, 2 },
- { 5, 10, 0, 0, 3, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 3, 2 },
- { 5, 10, 0, 0, 4, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 3, 2 },
- { 5, 10, 0, 0, 5, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 3, 2 },
- { 5, 10, 0, 0, 6, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 3, 2 },
- { 5, 10, 0, 0, 7, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 3, 2 },
- { 5, 10, 0, 0, 8, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 3, 2 },
- { 5, 10, 0, 0, 9, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 3, 2 },
- { 5, 10, 0, 0, 1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 0, 2 },
- { 5, 10, 0, 0, 2, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 0, 2 },
- { 5, 10, 0, 0, 3, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 0, 2 },
- { 5, 10, 0, 0, 4, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 0, 2 },
- { 5, 10, 0, 0, 5, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 0, 2 },
- { 5, 10, 0, 0, 6, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 0, 2 },
- { 5, 10, 0, 0, 7, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 0, 2 },
- { 5, 10, 0, 0, 8, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 0, 2 },
- { 5, 10, 0, 0, 9, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 0, 2 },
- { 5, 10, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 0, 2 },
- { 5, 2, 0, 0, 1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 0, 2 },
- { 5, 2, 0, 0, 2, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 0, 2 },
- { 5, 2, 0, 0, 3, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 0, 2 },
- { 5, 2, 0, 0, 4, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 0, 2 },
- { 5, 2, 0, 0, 5, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 0, 2 },
- { 5, 2, 0, 0, 6, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 0, 2 },
- { 5, 2, 0, 0, 7, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 0, 2 },
- { 5, 2, 0, 0, 8, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 0, 2 },
- { 5, 2, 0, 0, 9, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 0, 2 },
- { 5, 2, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 0, 2 },
- { 29, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 0, 2 },
- { 29, 0, 0, 0, -1, 0, 1, 80, { {0, 26}, {0, 0}, {0, 0}, {0, 26} }, 0, 10, 12, 7, 3, 2 },
- { 29, 0, 0, 0, -1, 0, 1, 80, { {0, 26}, {0, 0}, {0, 0}, {0, 26} }, 14, 10, 12, 7, 3, 2 },
- { 29, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, -26}, {0, -26}, {0, 0} }, 0, 10, 12, 6, 3, 2 },
- { 5, 10, 0, 0, 0, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 3, 2 },
- { 5, 10, 0, 0, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 5, 10, 0, 0, 1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 5, 10, 0, 0, 2, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 5, 10, 0, 0, 3, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 5, 10, 0, 0, 4, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 5, 10, 0, 0, 5, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 5, 10, 0, 0, 6, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 5, 10, 0, 0, 7, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 5, 10, 0, 0, 8, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 5, 10, 0, 0, 9, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 5, 10, 0, 0, 0, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 26, 10, 0, 0, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 12, 0, 1, 2 },
- { 29, 10, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 1, 2 },
- { 29, 10, 0, 0, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 12, 0, 1, 2 },
- { 29, 10, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 1, 2 },
- { 29, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 30, 0, 1, 2 },
- { 29, 10, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 12, 0, 1, 2 },
- { 29, 10, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 12, 0, 1, 2 },
- { 29, 10, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 12, 0, 1, 2 },
- { 29, 0, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 12, 0, 1, 2 },
- { 29, 10, 0, 0, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 12, 0, 1, 2 },
- { 29, 10, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 1, 2 },
- { 29, 10, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 1, 2 },
- { 29, 10, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 30, 0, 1, 2 },
- { 29, 10, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 1, 2 },
- { 29, 10, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 30, 0, 1, 2 },
- { 29, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 3, 13, 1, 2 },
- { 29, 10, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 3, 13, 1, 2 },
- { 29, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 6, 0, 1, 2 },
- { 29, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 6, 0, 1, 2 },
- { 21, 10, 0, 0, -1, 1, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 1, 2 },
- { 22, 10, 0, 0, -1, -1, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 1, 2 },
- { 5, 10, 0, 0, 1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 5, 10, 0, 0, 2, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 5, 10, 0, 0, 3, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 5, 10, 0, 0, 4, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 5, 10, 0, 0, 5, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 5, 10, 0, 0, 6, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 5, 10, 0, 0, 7, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 5, 10, 0, 0, 8, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 5, 10, 0, 0, 9, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 5, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 26, 10, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 26, 10, 0, 0, -1, 1, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 26, 10, 0, 0, -1, -1, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 21, 10, 0, 0, -1, 1, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 1, 2 },
- { 22, 10, 0, 0, -1, -1, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 1, 2 },
- { 26, 10, 0, 0, -1, 1, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 26, 10, 0, 0, -1, -1, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 26, 10, 0, 0, -1, 2, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 26, 10, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 26, 10, 0, 0, -1, -2, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 26, 10, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 26, 10, 0, 0, -1, 1, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 26, 10, 0, 0, -1, -1, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 26, 10, 0, 0, -1, -1316, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 21, 10, 0, 0, -1, 1, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 1, 2 },
- { 22, 10, 0, 0, -1, -1, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 1, 2 },
- { 29, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 54 },
- { 21, 10, 0, 0, -1, 3, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 1, 2 },
- { 22, 10, 0, 0, -1, 1, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 1, 2 },
- { 21, 10, 0, 0, -1, -1, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 1, 2 },
- { 22, 10, 0, 0, -1, -3, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 1, 2 },
- { 26, 10, 0, 0, -1, -1914, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 26, 10, 0, 0, -1, -1918, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 26, 10, 0, 0, -1, -1923, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 26, 10, 0, 0, -1, -1824, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 26, 10, 0, 0, -1, -2016, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 26, 10, 0, 0, -1, 0, 6, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 0, 2 },
- { 26, 10, 0, 0, -1, 0, 6, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 3, 2 },
- { 26, 10, 0, 0, -1, -2104, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 26, 10, 0, 0, -1, -2106, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 26, 10, 0, 0, -1, -2108, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 26, 10, 0, 0, -1, -2250, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 29, 10, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 29, 10, 0, 0, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 29, 10, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 29, 10, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 29, 10, 0, 0, -1, -2527, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 14, 0, 0, 0, -1, 0, 8, 0, { {0, 48}, {0, 0}, {0, 0}, {0, 48} }, 0, 10, 12, 7, 3, 57 },
- { 14, 0, 0, 0, -1, 0, 24, 0, { {0, 48}, {0, 0}, {0, 0}, {0, 48} }, 0, 10, 12, 7, 3, 57 },
- { 15, 0, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, -48}, {0, -48}, {0, 0} }, 0, 10, 12, 6, 1, 57 },
- { 15, 0, 0, 0, -1, 0, 24, 0, { {0, 0}, {0, -48}, {0, -48}, {0, 0} }, 0, 10, 12, 6, 1, 57 },
- { 14, 0, 0, 0, -1, 0, 9, 0, { {1, 211}, {0, 0}, {0, 0}, {1, 211} }, 0, 10, 12, 7, 3, 3 },
- { 14, 0, 0, 0, -1, 0, 9, 0, { {0, -3814}, {0, 0}, {0, 0}, {0, -3814} }, 0, 10, 12, 7, 3, 3 },
- { 14, 0, 0, 0, -1, 0, 9, 0, { {1, 213}, {0, 0}, {0, 0}, {1, 213} }, 0, 10, 12, 7, 3, 3 },
- { 15, 0, 0, 0, -1, 0, 9, 0, { {0, 0}, {1, 215}, {1, 215}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 15, 0, 0, 0, -1, 0, 9, 0, { {0, 0}, {1, 217}, {1, 217}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 14, 0, 0, 0, -1, 0, 10, 0, { {1, 219}, {0, 0}, {0, 0}, {1, 219} }, 0, 10, 12, 7, 3, 3 },
- { 14, 0, 0, 0, -1, 0, 10, 0, { {1, 221}, {0, 0}, {0, 0}, {1, 221} }, 0, 10, 12, 7, 3, 3 },
- { 14, 0, 0, 0, -1, 0, 10, 0, { {1, 223}, {0, 0}, {0, 0}, {1, 223} }, 0, 10, 12, 7, 3, 3 },
- { 14, 0, 0, 0, -1, 0, 11, 0, { {1, 225}, {0, 0}, {0, 0}, {1, 225} }, 0, 10, 12, 7, 3, 3 },
- { 15, 0, 0, 0, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 17, 0, 0, 0, -1, 0, 10, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 3, 3 },
- { 14, 0, 0, 0, -1, 0, 11, 0, { {1, 227}, {0, 0}, {0, 0}, {1, 227} }, 0, 10, 12, 7, 3, 3 },
- { 14, 0, 0, 0, -1, 0, 11, 0, { {1, 229}, {0, 0}, {0, 0}, {1, 229} }, 0, 10, 12, 7, 3, 3 },
- { 14, 0, 0, 0, -1, 0, 8, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 3, 46 },
- { 15, 0, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 1, 46 },
- { 15, 0, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 1, 46 },
- { 29, 10, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 46 },
- { 14, 0, 0, 0, -1, 0, 11, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 3, 46 },
- { 15, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 1, 46 },
- { 0, 17, 230, 5, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 46 },
- { 14, 0, 0, 0, -1, 0, 13, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 3, 46 },
- { 15, 0, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 1, 46 },
- { 25, 10, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 6, 0, 1, 46 },
- { 25, 10, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 1, 46 },
- { 5, 10, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 46 },
- { 15, 0, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, -7264}, {0, -7264}, {0, 0} }, 0, 10, 12, 6, 1, 25 },
- { 15, 0, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, -7264}, {0, -7264}, {0, 0} }, 0, 10, 12, 6, 1, 25 },
- { 18, 0, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 58 },
- { 18, 0, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 58 },
- { 17, 0, 0, 0, -1, 0, 8, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 3, 58 },
- { 25, 0, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 1, 58 },
- { 0, 17, 9, 5, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 58 },
- { 25, 10, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 3, 13, 1, 2 },
- { 23, 10, 0, 0, -1, 1, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 3, 13, 1, 2 },
- { 24, 10, 0, 0, -1, -1, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 3, 13, 1, 2 },
- { 20, 10, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 1, 2 },
- { 25, 10, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 0, 1, 2 },
- { 25, 10, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 1, 2 },
- { 20, 10, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 25, 10, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 23, 10, 0, 0, -1, 1, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 3, 13, 1, 2 },
- { 24, 10, 0, 0, -1, -1, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 3, 13, 1, 2 },
- { 25, 10, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 6, 12, 1, 2 },
- { 17, 10, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 2 },
- { 25, 10, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 1, 2 },
- { 25, 10, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 25, 10, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 1, 2 },
- { 20, 10, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 2 },
- { 25, 10, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 1, 2 },
- { 25, 10, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 1, 2 },
- { 25, 10, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 20, 10, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 1, 2 },
- { 21, 10, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 1, 2 },
- { 25, 10, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 1, 2 },
- { 25, 10, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 1, 2 },
- { 25, 10, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 1, 2 },
- { 25, 10, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 25, 10, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 1, 2 },
- { 25, 10, 0, 0, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 25, 10, 0, 0, -1, 0, 24, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 6, 12, 1, 2 },
- { 21, 10, 0, 0, -1, 1, 24, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 1, 2 },
- { 22, 10, 0, 0, -1, -1, 24, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 1, 2 },
- { 20, 10, 0, 0, -1, 0, 24, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 1, 2 },
- { 29, 10, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 37 },
- { 29, 10, 0, 0, -1, 0, 4, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 37 },
- { 29, 10, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
- { 25, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 11, 1, 2 },
- { 25, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 12, 3, 2 },
- { 25, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
- { 29, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
- { 17, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 5, 8, 1, 37 },
- { 18, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 1, 2 },
- { 4, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 1, 37 },
- { 20, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 5, 0, 1, 2 },
- { 22, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 1, 2 },
- { 0, 17, 218, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 1 },
- { 0, 17, 228, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 1 },
- { 0, 17, 222, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 1 },
- { 1, 0, 224, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 26 },
- { 20, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 1, 2 },
- { 17, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 14, 8, 1, 2 },
- { 17, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 21, 8, 1, 2 },
- { 29, 10, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
- { 4, 0, 0, 0, -1, 0, 4, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 3, 37 },
- { 17, 0, 0, 0, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 5, 8, 1, 37 },
- { 18, 0, 0, 0, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 5, 8, 1, 2 },
- { 25, 10, 0, 0, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 1, 2 },
- { 29, 10, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
- { 18, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 5, 8, 1, 34 },
- { 18, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 1, 34 },
- { 18, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 1, 34 },
- { 18, 0, 0, 0, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 5, 8, 1, 34 },
- { 0, 17, 8, 5, -1, 0, 1, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 1 },
- { 28, 10, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 5, 0, 0, 2 },
- { 17, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 5, 8, 1, 34 },
- { 17, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 5, 8, 1, 34 },
- { 18, 0, 0, 0, -1, 0, 6, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 3, 34 },
- { 20, 10, 0, 0, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 5, 0, 1, 2 },
- { 18, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 5, 8, 1, 35 },
- { 18, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 14, 8, 1, 35 },
- { 18, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 14, 8, 1, 35 },
- { 25, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 5, 0, 1, 2 },
- { 17, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 5, 8, 1, 2 },
- { 17, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 5, 8, 1, 35 },
- { 17, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 5, 8, 1, 35 },
- { 18, 0, 0, 0, -1, 0, 6, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 14, 8, 3, 35 },
- { 18, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 36 },
- { 18, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 36 },
- { 18, 0, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 36 },
- { 18, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 36 },
- { 18, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 3, 26 },
- { 18, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 0, 26 },
- { 29, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
- { 5, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
- { 29, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
- { 18, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 36 },
- { 18, 0, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 36 },
- { 18, 0, 0, 0, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 36 },
- { 29, 10, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
- { 29, 10, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
- { 18, 0, 0, 0, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 5, 8, 1, 35 },
- { 29, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 26 },
- { 29, 10, 0, 0, -1, 0, 7, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 26 },
- { 5, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
- { 29, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
- { 29, 0, 0, 0, -1, 0, 11, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
- { 5, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 29, 10, 0, 0, -1, 0, 7, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
- { 5, 10, 0, 0, -1, 0, 6, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
- { 29, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 26 },
- { 29, 10, 0, 0, -1, 0, 7, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 26 },
- { 29, 10, 0, 0, -1, 0, 8, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 26 },
- { 29, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 3, 2 },
- { 29, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 14, 0, 3, 35 },
- { 29, 0, 0, 0, -1, 0, 22, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
- { 18, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 1, 37 },
- { 18, 0, 0, 0, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 1, 37 },
- { 18, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 1, 37 },
- { 18, 0, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 1, 37 },
- { 18, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 1, 37 },
- { 18, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 1, 37 },
- { 18, 0, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 1, 37 },
- { 18, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 1, 37 },
- { 18, 0, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 1, 37 },
- { 18, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 1, 37 },
- { 18, 0, 0, 0, -1, 0, 24, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 1, 37 },
- { 18, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 38 },
- { 17, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 5, 8, 1, 38 },
- { 29, 10, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 38 },
- { 29, 10, 0, 0, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 38 },
- { 18, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 83 },
- { 17, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 83 },
- { 25, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 1, 83 },
- { 25, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 1, 83 },
- { 18, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 70 },
- { 17, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 70 },
- { 25, 10, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 1, 70 },
- { 25, 10, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 6, 12, 1, 70 },
- { 25, 10, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 1, 70 },
- { 3, 0, 0, 0, 0, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 70 },
- { 3, 0, 0, 0, 1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 70 },
- { 3, 0, 0, 0, 2, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 70 },
- { 3, 0, 0, 0, 3, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 70 },
- { 3, 0, 0, 0, 4, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 70 },
- { 3, 0, 0, 0, 5, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 70 },
- { 3, 0, 0, 0, 6, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 70 },
- { 3, 0, 0, 0, 7, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 70 },
- { 3, 0, 0, 0, 8, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 70 },
- { 3, 0, 0, 0, 9, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 70 },
- { 18, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 5 },
- { 2, 17, 0, 5, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 5 },
- { 25, 10, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 5 },
- { 0, 17, 230, 5, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 5 },
- { 17, 10, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 5 },
- { 17, 0, 0, 0, -1, 0, 16, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 3, 5 },
- { 0, 17, 230, 5, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 5 },
- { 18, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 84 },
- { 4, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 84 },
- { 0, 17, 230, 5, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 84 },
- { 25, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 84 },
- { 25, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 1, 84 },
- { 25, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 1, 84 },
- { 28, 10, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 28, 10, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 0, 1, 2 },
- { 17, 10, 0, 0, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 2 },
- { 28, 10, 0, 0, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 0, 1, 2 },
- { 14, 0, 0, 0, -1, 0, 10, 0, { {1, 231}, {0, 0}, {0, 0}, {1, 231} }, 0, 10, 12, 7, 3, 3 },
- { 28, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 0, 1, 2 },
- { 14, 0, 0, 0, -1, 0, 12, 0, { {1, 233}, {0, 0}, {0, 0}, {1, 233} }, 0, 10, 12, 7, 3, 3 },
- { 15, 0, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 18, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 3 },
- { 14, 0, 0, 0, -1, 0, 12, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 3, 3 },
- { 15, 0, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 14, 0, 0, 0, -1, 0, 13, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 3, 3 },
- { 15, 0, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 15, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 48}, {0, 48}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 15, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 14, 0, 0, 0, -1, 0, 16, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 3, 3 },
- { 15, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 14, 0, 0, 0, -1, 0, 13, 0, { {1, 235}, {0, 0}, {0, 0}, {1, 235} }, 0, 10, 12, 7, 3, 3 },
- { 14, 0, 0, 0, -1, 0, 16, 0, { {1, 237}, {0, 0}, {0, 0}, {1, 237} }, 0, 10, 12, 7, 3, 3 },
- { 14, 0, 0, 0, -1, 0, 16, 0, { {1, 239}, {0, 0}, {0, 0}, {1, 239} }, 0, 10, 12, 7, 3, 3 },
- { 14, 0, 0, 0, -1, 0, 16, 0, { {1, 241}, {0, 0}, {0, 0}, {1, 241} }, 0, 10, 12, 7, 3, 3 },
- { 14, 0, 0, 0, -1, 0, 18, 0, { {1, 243}, {0, 0}, {0, 0}, {1, 243} }, 0, 10, 12, 7, 3, 3 },
- { 15, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 14, 0, 0, 0, -1, 0, 16, 0, { {1, 245}, {0, 0}, {0, 0}, {1, 245} }, 0, 10, 12, 7, 3, 3 },
- { 14, 0, 0, 0, -1, 0, 16, 0, { {1, 247}, {0, 0}, {0, 0}, {1, 247} }, 0, 10, 12, 7, 3, 3 },
- { 14, 0, 0, 0, -1, 0, 17, 0, { {1, 249}, {0, 0}, {0, 0}, {1, 249} }, 0, 10, 12, 7, 3, 3 },
- { 14, 0, 0, 0, -1, 0, 17, 0, { {0, 928}, {0, 0}, {0, 0}, {0, 928} }, 0, 10, 12, 7, 3, 3 },
- { 14, 0, 0, 0, -1, 0, 17, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 3, 3 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 14, 0, 0, 0, -1, 0, 20, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 3, 3 },
- { 15, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 14, 0, 0, 0, -1, 0, 21, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 3, 3 },
- { 15, 0, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 14, 0, 0, 0, -1, 0, 24, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 3, 3 },
- { 15, 0, 0, 0, -1, 0, 24, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 14, 0, 0, 0, -1, 0, 21, 0, { {0, -48}, {0, 0}, {0, 0}, {0, -48} }, 0, 10, 12, 7, 3, 3 },
- { 14, 0, 0, 0, -1, 0, 21, 0, { {1, 251}, {0, 0}, {0, 0}, {1, 251} }, 0, 10, 12, 7, 3, 3 },
- { 14, 0, 0, 0, -1, 0, 21, 0, { {1, 253}, {0, 0}, {0, 0}, {1, 253} }, 0, 10, 12, 7, 3, 3 },
- { 14, 0, 0, 0, -1, 0, 23, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 3, 3 },
- { 15, 0, 0, 0, -1, 0, 23, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 15, 0, 0, 0, -1, 0, 24, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 17, 0, 0, 0, -1, 0, 24, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 3, 3 },
- { 18, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 3 },
- { 17, 0, 0, 0, -1, 0, 13, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 3, 3 },
- { 18, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 3 },
- { 18, 0, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 59 },
- { 0, 17, 0, 5, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 59 },
- { 0, 17, 9, 5, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 59 },
- { 1, 0, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 1, 59 },
- { 29, 10, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 59 },
- { 0, 17, 9, 5, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 59 },
- { 29, 4, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 18, 0, 0, 2, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 65 },
- { 18, 0, 0, 4, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 65 },
- { 18, 0, 0, 0, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 65 },
- { 25, 10, 0, 0, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 18, 0, 1, 65 },
- { 25, 10, 0, 0, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 6, 12, 1, 65 },
- { 1, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 1, 71 },
- { 18, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 71 },
- { 0, 17, 9, 5, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 71 },
- { 0, 17, 0, 5, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 71 },
- { 25, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 1, 71 },
- { 3, 0, 0, 0, 0, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 71 },
- { 3, 0, 0, 0, 1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 71 },
- { 3, 0, 0, 0, 2, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 71 },
- { 3, 0, 0, 0, 3, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 71 },
- { 3, 0, 0, 0, 4, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 71 },
- { 3, 0, 0, 0, 5, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 71 },
- { 3, 0, 0, 0, 6, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 71 },
- { 3, 0, 0, 0, 7, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 71 },
- { 3, 0, 0, 0, 8, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 71 },
- { 3, 0, 0, 0, 9, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 71 },
- { 0, 17, 230, 5, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 11 },
- { 25, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 11 },
- { 25, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 18, 0, 1, 11 },
- { 18, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 11 },
- { 18, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 11 },
- { 0, 17, 0, 5, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 11 },
- { 3, 0, 0, 0, 0, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 72 },
- { 3, 0, 0, 0, 1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 72 },
- { 3, 0, 0, 0, 2, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 72 },
- { 3, 0, 0, 0, 3, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 72 },
- { 3, 0, 0, 0, 4, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 72 },
- { 3, 0, 0, 0, 5, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 72 },
- { 3, 0, 0, 0, 6, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 72 },
- { 3, 0, 0, 0, 7, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 72 },
- { 3, 0, 0, 0, 8, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 72 },
- { 3, 0, 0, 0, 9, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 72 },
- { 18, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 72 },
- { 0, 17, 0, 5, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 72 },
- { 0, 17, 220, 5, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 72 },
- { 25, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 1, 2 },
- { 25, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 1, 72 },
- { 18, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 73 },
- { 0, 17, 0, 5, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 73 },
- { 1, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 1, 73 },
- { 1, 0, 9, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 1, 73 },
- { 25, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 73 },
- { 0, 17, 0, 5, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 85 },
- { 1, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 1, 85 },
- { 18, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 85 },
- { 0, 17, 7, 5, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 85 },
- { 1, 0, 9, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 1, 85 },
- { 25, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 85 },
- { 25, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 1, 85 },
- { 25, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 1, 85 },
- { 17, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 2 },
- { 3, 0, 0, 0, 0, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 85 },
- { 3, 0, 0, 0, 1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 85 },
- { 3, 0, 0, 0, 2, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 85 },
- { 3, 0, 0, 0, 3, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 85 },
- { 3, 0, 0, 0, 4, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 85 },
- { 3, 0, 0, 0, 5, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 85 },
- { 3, 0, 0, 0, 6, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 85 },
- { 3, 0, 0, 0, 7, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 85 },
- { 3, 0, 0, 0, 8, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 85 },
- { 3, 0, 0, 0, 9, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 85 },
- { 18, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 33, 8, 1, 24 },
- { 0, 17, 0, 5, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 33, 4, 1, 24 },
- { 17, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 33, 8, 1, 24 },
- { 3, 0, 0, 0, 0, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 24 },
- { 3, 0, 0, 0, 1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 24 },
- { 3, 0, 0, 0, 2, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 24 },
- { 3, 0, 0, 0, 3, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 24 },
- { 3, 0, 0, 0, 4, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 24 },
- { 3, 0, 0, 0, 5, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 24 },
- { 3, 0, 0, 0, 6, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 24 },
- { 3, 0, 0, 0, 7, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 24 },
- { 3, 0, 0, 0, 8, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 24 },
- { 3, 0, 0, 0, 9, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 24 },
- { 18, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 77 },
- { 0, 17, 0, 5, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 77 },
- { 1, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 1, 77 },
- { 3, 0, 0, 0, 0, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 77 },
- { 3, 0, 0, 0, 1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 77 },
- { 3, 0, 0, 0, 2, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 77 },
- { 3, 0, 0, 0, 3, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 77 },
- { 3, 0, 0, 0, 4, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 77 },
- { 3, 0, 0, 0, 5, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 77 },
- { 3, 0, 0, 0, 6, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 77 },
- { 3, 0, 0, 0, 7, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 77 },
- { 3, 0, 0, 0, 8, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 77 },
- { 3, 0, 0, 0, 9, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 77 },
- { 25, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 77 },
- { 25, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 1, 77 },
- { 18, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 33, 8, 1, 24 },
- { 17, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 33, 8, 1, 24 },
- { 29, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 33, 0, 1, 24 },
- { 1, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 4, 33, 4, 1, 24 },
- { 18, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 33, 8, 1, 79 },
- { 0, 17, 230, 5, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 33, 4, 1, 79 },
- { 0, 17, 220, 5, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 33, 4, 1, 79 },
- { 17, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 33, 8, 1, 79 },
- { 25, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 33, 0, 1, 79 },
- { 18, 0, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 86 },
- { 1, 0, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 1, 86 },
- { 0, 17, 0, 5, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 86 },
- { 25, 0, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 1, 86 },
- { 17, 0, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 86 },
- { 0, 17, 9, 5, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 86 },
- { 18, 0, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 27 },
- { 15, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, -928}, {0, -928}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 28, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 0, 1, 2 },
- { 17, 0, 0, 0, -1, 0, 16, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 3, 3 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 15, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 1, 4 },
- { 15, 0, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 15, 0, 0, 0, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 17, 0, 0, 0, -1, 0, 23, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 3, 3 },
- { 28, 10, 0, 0, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 255}, {1, 255}, {1, 255} }, 0, 10, 12, 6, 3, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 257}, {1, 257}, {1, 257} }, 0, 10, 12, 6, 3, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 259}, {1, 259}, {1, 259} }, 0, 10, 12, 6, 3, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 261}, {1, 261}, {1, 261} }, 0, 10, 12, 6, 3, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 263}, {1, 263}, {1, 263} }, 0, 10, 12, 6, 3, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 265}, {1, 265}, {1, 265} }, 0, 10, 12, 6, 3, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 267}, {1, 267}, {1, 267} }, 0, 10, 12, 6, 3, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 269}, {1, 269}, {1, 269} }, 0, 10, 12, 6, 3, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 271}, {1, 271}, {1, 271} }, 0, 10, 12, 6, 3, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 273}, {1, 273}, {1, 273} }, 0, 10, 12, 6, 3, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 275}, {1, 275}, {1, 275} }, 0, 10, 12, 6, 3, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 277}, {1, 277}, {1, 277} }, 0, 10, 12, 6, 3, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 279}, {1, 279}, {1, 279} }, 0, 10, 12, 6, 3, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 281}, {1, 281}, {1, 281} }, 0, 10, 12, 6, 3, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 283}, {1, 283}, {1, 283} }, 0, 10, 12, 6, 3, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 285}, {1, 285}, {1, 285} }, 0, 10, 12, 6, 3, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 287}, {1, 287}, {1, 287} }, 0, 10, 12, 6, 3, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 289}, {1, 289}, {1, 289} }, 0, 10, 12, 6, 3, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 291}, {1, 291}, {1, 291} }, 0, 10, 12, 6, 3, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 293}, {1, 293}, {1, 293} }, 0, 10, 12, 6, 3, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 295}, {1, 295}, {1, 295} }, 0, 10, 12, 6, 3, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 297}, {1, 297}, {1, 297} }, 0, 10, 12, 6, 3, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 299}, {1, 299}, {1, 299} }, 0, 10, 12, 6, 3, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 301}, {1, 301}, {1, 301} }, 0, 10, 12, 6, 3, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 303}, {1, 303}, {1, 303} }, 0, 10, 12, 6, 3, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 305}, {1, 305}, {1, 305} }, 0, 10, 12, 6, 3, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 307}, {1, 307}, {1, 307} }, 0, 10, 12, 6, 3, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 309}, {1, 309}, {1, 309} }, 0, 10, 12, 6, 3, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 311}, {1, 311}, {1, 311} }, 0, 10, 12, 6, 3, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 313}, {1, 313}, {1, 313} }, 0, 10, 12, 6, 3, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 315}, {1, 315}, {1, 315} }, 0, 10, 12, 6, 3, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 317}, {1, 317}, {1, 317} }, 0, 10, 12, 6, 3, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 319}, {1, 319}, {1, 319} }, 0, 10, 12, 6, 3, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 321}, {1, 321}, {1, 321} }, 0, 10, 12, 6, 3, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 323}, {1, 323}, {1, 323} }, 0, 10, 12, 6, 3, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 325}, {1, 325}, {1, 325} }, 0, 10, 12, 6, 3, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 327}, {1, 327}, {1, 327} }, 0, 10, 12, 6, 3, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 329}, {1, 329}, {1, 329} }, 0, 10, 12, 6, 3, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 331}, {1, 331}, {1, 331} }, 0, 10, 12, 6, 3, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 333}, {1, 333}, {1, 333} }, 0, 10, 12, 6, 3, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 335}, {1, 335}, {1, 335} }, 0, 10, 12, 6, 3, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 337}, {1, 337}, {1, 337} }, 0, 10, 12, 6, 3, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 339}, {1, 339}, {1, 339} }, 0, 10, 12, 6, 3, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 341}, {1, 341}, {1, 341} }, 0, 10, 12, 6, 3, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 343}, {1, 343}, {1, 343} }, 0, 10, 12, 6, 3, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 345}, {1, 345}, {1, 345} }, 0, 10, 12, 6, 3, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 347}, {1, 347}, {1, 347} }, 0, 10, 12, 6, 3, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 349}, {1, 349}, {1, 349} }, 0, 10, 12, 6, 3, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 351}, {1, 351}, {1, 351} }, 0, 10, 12, 6, 3, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 353}, {1, 353}, {1, 353} }, 0, 10, 12, 6, 3, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 355}, {1, 355}, {1, 355} }, 0, 10, 12, 6, 3, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 357}, {1, 357}, {1, 357} }, 0, 10, 12, 6, 3, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 359}, {1, 359}, {1, 359} }, 0, 10, 12, 6, 3, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 361}, {1, 361}, {1, 361} }, 0, 10, 12, 6, 3, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 363}, {1, 363}, {1, 363} }, 0, 10, 12, 6, 3, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 365}, {1, 365}, {1, 365} }, 0, 10, 12, 6, 3, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 367}, {1, 367}, {1, 367} }, 0, 10, 12, 6, 3, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 369}, {1, 369}, {1, 369} }, 0, 10, 12, 6, 3, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 371}, {1, 371}, {1, 371} }, 0, 10, 12, 6, 3, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 373}, {1, 373}, {1, 373} }, 0, 10, 12, 6, 3, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 375}, {1, 375}, {1, 375} }, 0, 10, 12, 6, 3, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 377}, {1, 377}, {1, 377} }, 0, 10, 12, 6, 3, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 379}, {1, 379}, {1, 379} }, 0, 10, 12, 6, 3, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 381}, {1, 381}, {1, 381} }, 0, 10, 12, 6, 3, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 383}, {1, 383}, {1, 383} }, 0, 10, 12, 6, 3, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 385}, {1, 385}, {1, 385} }, 0, 10, 12, 6, 3, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 387}, {1, 387}, {1, 387} }, 0, 10, 12, 6, 3, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 389}, {1, 389}, {1, 389} }, 0, 10, 12, 6, 3, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 391}, {1, 391}, {1, 391} }, 0, 10, 12, 6, 3, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 393}, {1, 393}, {1, 393} }, 0, 10, 12, 6, 3, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 395}, {1, 395}, {1, 395} }, 0, 10, 12, 6, 3, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 397}, {1, 397}, {1, 397} }, 0, 10, 12, 6, 3, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 399}, {1, 399}, {1, 399} }, 0, 10, 12, 6, 3, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 401}, {1, 401}, {1, 401} }, 0, 10, 12, 6, 3, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 403}, {1, 403}, {1, 403} }, 0, 10, 12, 6, 3, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 405}, {1, 405}, {1, 405} }, 0, 10, 12, 6, 3, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 407}, {1, 407}, {1, 407} }, 0, 10, 12, 6, 3, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 409}, {1, 409}, {1, 409} }, 0, 10, 12, 6, 3, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 411}, {1, 411}, {1, 411} }, 0, 10, 12, 6, 3, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 413}, {1, 413}, {1, 413} }, 0, 10, 12, 6, 3, 28 },
- { 18, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 86 },
- { 1, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 1, 86 },
- { 0, 17, 0, 5, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 86 },
- { 25, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 1, 86 },
- { 0, 17, 9, 5, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 86 },
- { 3, 0, 0, 0, 0, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 86 },
- { 3, 0, 0, 0, 1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 86 },
- { 3, 0, 0, 0, 2, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 86 },
- { 3, 0, 0, 0, 3, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 86 },
- { 3, 0, 0, 0, 4, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 86 },
- { 3, 0, 0, 0, 5, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 86 },
- { 3, 0, 0, 0, 6, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 86 },
- { 3, 0, 0, 0, 7, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 86 },
- { 3, 0, 0, 0, 8, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 86 },
- { 3, 0, 0, 0, 9, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 86 },
- { 18, 0, 0, 0, -1, 0, 2, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 12, 10, 23, 8, 1, 26 },
- { 18, 0, 0, 0, -1, 0, 2, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 13, 10, 24, 8, 1, 26 },
- { 11, 0, 0, 0, -1, 0, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 34, 0, 0, 0 },
- { 12, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 0, 0 },
- { 18, 0, 0, 0, -1, 0, 1, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 3, 37 },
- { 18, 0, 0, 0, -1, 0, 13, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 3, 37 },
- { 18, 0, 0, 0, -1, 0, 6, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 3, 37 },
- { 18, 0, 0, 0, -1, 0, 11, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 3, 37 },
- { 13, 0, 0, 0, -1, 0, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 0 },
- { 18, 0, 0, 0, -1, 0, 8, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 3, 37 },
- { 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {1, 427}, {1, 424}, {0, 0} }, 0, 10, 12, 6, 3, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {1, 433}, {1, 430}, {0, 0} }, 0, 10, 12, 6, 3, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {1, 439}, {1, 436}, {0, 0} }, 0, 10, 12, 6, 3, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {1, 446}, {1, 442}, {0, 0} }, 0, 10, 12, 6, 3, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {1, 454}, {1, 450}, {0, 0} }, 0, 10, 12, 6, 3, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {1, 461}, {1, 458}, {0, 0} }, 0, 10, 12, 6, 3, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {1, 473}, {1, 470}, {0, 0} }, 0, 10, 12, 6, 3, 6 },
- { 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {1, 479}, {1, 476}, {0, 0} }, 0, 10, 12, 6, 3, 6 },
- { 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {1, 485}, {1, 482}, {0, 0} }, 0, 10, 12, 6, 3, 6 },
- { 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {1, 491}, {1, 488}, {0, 0} }, 0, 10, 12, 6, 3, 6 },
- { 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {1, 497}, {1, 494}, {0, 0} }, 0, 10, 12, 6, 3, 6 },
- { 18, 1, 0, 0, -1, 0, 4, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 9, 13, 8, 3, 7 },
- { 0, 17, 26, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 7 },
- { 18, 1, 0, 0, -1, 0, 1, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 9, 13, 8, 3, 7 },
- { 18, 1, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 9, 13, 8, 3, 7 },
- { 26, 3, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 0, 7 },
- { 18, 13, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 3, 8 },
- { 28, 13, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 8 },
- { 18, 13, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 0, 8 },
- { 29, 10, 0, 0, -1, 0, 24, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 8 },
- { 13, 18, 0, 0, -1, 0, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 0, 0 },
- { 27, 13, 0, 0, -1, 0, 6, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 10, 0, 3, 8 },
- { 0, 17, 0, 5, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 2, 1 },
- { 25, 10, 0, 0, -1, 0, 8, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 15, 8, 11, 0, 2 },
- { 25, 10, 0, 0, -1, 0, 8, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 11, 3, 2 },
- { 25, 10, 0, 0, -1, 0, 8, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 0, 0, 2 },
- { 25, 10, 0, 0, -1, 0, 8, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 14, 8, 11, 0, 2 },
- { 25, 10, 0, 0, -1, 0, 8, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 15, 8, 0, 0, 2 },
- { 25, 10, 0, 0, -1, 0, 8, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 6, 0, 0, 2 },
- { 21, 10, 0, 0, -1, 0, 8, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 3, 2 },
- { 22, 10, 0, 0, -1, 0, 8, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 3, 2 },
- { 25, 10, 0, 0, -1, 0, 8, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 15, 0, 0, 2 },
- { 25, 10, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
- { 20, 10, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 11, 3, 2 },
- { 19, 10, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 17, 14, 0, 3, 2 },
- { 21, 10, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 0, 2 },
- { 22, 10, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 0, 2 },
- { 21, 10, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 3, 2 },
- { 22, 10, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 3, 2 },
- { 25, 10, 0, 0, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
- { 21, 10, 0, 0, -1, 0, 7, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 0, 2 },
- { 22, 10, 0, 0, -1, 0, 7, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 0, 2 },
- { 25, 6, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 15, 1, 11, 0, 2 },
- { 25, 10, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 11, 3, 2 },
- { 25, 6, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 13, 1, 10, 0, 2 },
- { 25, 10, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 15, 5, 0, 0, 2 },
- { 25, 6, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 14, 5, 11, 0, 2 },
- { 25, 10, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 6, 12, 0, 2 },
- { 21, 10, 0, 0, -1, 1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 3, 2 },
- { 22, 10, 0, 0, -1, -1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 3, 2 },
- { 25, 4, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
- { 26, 3, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
- { 20, 3, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 11, 3, 2 },
- { 26, 10, 0, 0, -1, 1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
- { 26, 10, 0, 0, -1, -1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
- { 26, 10, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
- { 27, 4, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 9, 0, 0, 2 },
- { 25, 4, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 10, 0, 0, 2 },
- { 18, 13, 0, 0, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 8 },
- { 10, 18, 0, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 22, 4, 2, 2 },
- { 25, 10, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 13, 14, 0, 0, 2 },
- { 25, 6, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 13, 1, 10, 3, 2 },
- { 25, 6, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
- { 3, 2, 0, 0, 0, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 14, 9, 3, 2 },
- { 3, 2, 0, 0, 1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 14, 9, 3, 2 },
- { 3, 2, 0, 0, 2, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 14, 9, 3, 2 },
- { 3, 2, 0, 0, 3, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 14, 9, 3, 2 },
- { 3, 2, 0, 0, 4, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 14, 9, 3, 2 },
- { 3, 2, 0, 0, 5, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 14, 9, 3, 2 },
- { 3, 2, 0, 0, 6, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 14, 9, 3, 2 },
- { 3, 2, 0, 0, 7, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 14, 9, 3, 2 },
- { 3, 2, 0, 0, 8, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 14, 9, 3, 2 },
- { 3, 2, 0, 0, 9, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 14, 9, 3, 2 },
- { 26, 10, 0, 0, -1, 2, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
- { 26, 10, 0, 0, -1, -2, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
- { 14, 0, 0, 0, -1, 0, 1, 80, { {0, 32}, {0, 0}, {0, 0}, {0, 32} }, 0, 10, 14, 7, 3, 3 },
- { 21, 10, 0, 0, -1, 2, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 0, 2 },
- { 22, 10, 0, 0, -1, -2, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 0, 2 },
- { 28, 10, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
- { 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, -32}, {0, -32}, {0, 0} }, 0, 10, 14, 6, 3, 3 },
- { 21, 10, 0, 0, -1, 1, 6, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 3, 2 },
- { 22, 10, 0, 0, -1, -1, 6, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 3, 2 },
- { 25, 10, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 12, 3, 2 },
- { 25, 10, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 11, 3, 2 },
- { 25, 10, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 5, 0, 3, 2 },
- { 18, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 14, 8, 3, 35 },
- { 18, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 5, 8, 3, 35 },
- { 17, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 5, 8, 3, 2 },
- { 17, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 5, 4, 3, 2 },
- { 27, 4, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 10, 0, 3, 2 },
- { 26, 10, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
- { 10, 10, 0, 5, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 21, 4, 0, 2 },
- { 29, 10, 0, 0, -1, 0, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 29, 0, 0, 2 },
- { 29, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 0, 2 },
- { 13, 18, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 0, 0 },
- { 18, 0, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 49 },
- { 25, 0, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 1, 2 },
- { 25, 10, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 1, 2 },
- { 5, 0, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 29, 0, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 4, 10, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 4 },
- { 5, 10, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 4 },
- { 29, 10, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 4 },
- { 5, 10, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 4 },
- { 29, 10, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 4 },
- { 29, 0, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 4 },
- { 18, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 74 },
- { 18, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 75 },
- { 5, 2, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 18, 0, 0, 0, -1, 0, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 39 },
- { 18, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 39 },
- { 5, 0, 0, 0, -1, 0, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 39 },
- { 18, 0, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 39 },
- { 18, 0, 0, 0, -1, 0, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 40 },
- { 4, 0, 0, 0, -1, 0, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 40 },
- { 18, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 120 },
- { 0, 17, 230, 5, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 120 },
- { 18, 0, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 50 },
- { 25, 0, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 1, 50 },
- { 18, 0, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 60 },
- { 25, 0, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 1, 60 },
- { 4, 0, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 60 },
- { 14, 0, 0, 0, -1, 0, 5, 0, { {0, 40}, {0, 0}, {0, 0}, {0, 40} }, 0, 10, 12, 7, 3, 41 },
- { 14, 0, 0, 0, -1, 0, 7, 0, { {0, 40}, {0, 0}, {0, 0}, {0, 40} }, 0, 10, 12, 7, 3, 41 },
- { 15, 0, 0, 0, -1, 0, 5, 0, { {0, 0}, {0, -40}, {0, -40}, {0, 0} }, 0, 10, 12, 6, 1, 41 },
- { 15, 0, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, -40}, {0, -40}, {0, 0} }, 0, 10, 12, 6, 1, 41 },
- { 18, 0, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 51 },
- { 18, 0, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 52 },
- { 3, 0, 0, 0, 0, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 52 },
- { 3, 0, 0, 0, 1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 52 },
- { 3, 0, 0, 0, 2, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 52 },
- { 3, 0, 0, 0, 3, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 52 },
- { 3, 0, 0, 0, 4, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 52 },
- { 3, 0, 0, 0, 5, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 52 },
- { 3, 0, 0, 0, 6, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 52 },
- { 3, 0, 0, 0, 7, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 52 },
- { 3, 0, 0, 0, 8, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 52 },
- { 3, 0, 0, 0, 9, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 52 },
- { 14, 0, 0, 0, -1, 0, 18, 0, { {0, 40}, {0, 0}, {0, 0}, {0, 40} }, 0, 10, 12, 7, 3, 136 },
- { 15, 0, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, -40}, {0, -40}, {0, 0} }, 0, 10, 12, 6, 1, 136 },
- { 18, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 106 },
- { 18, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 103 },
- { 25, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 103 },
- { 14, 0, 0, 0, -1, 0, 24, 0, { {0, 39}, {0, 0}, {0, 0}, {0, 39} }, 0, 10, 12, 7, 3, 161 },
- { 15, 0, 0, 0, -1, 0, 24, 0, { {0, 0}, {0, -39}, {0, -39}, {0, 0} }, 0, 10, 12, 6, 1, 161 },
- { 18, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 110 },
- { 17, 0, 0, 0, -1, 0, 24, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 1, 3 },
- { 17, 0, 0, 0, -1, 0, 24, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 3, 3 },
- { 18, 1, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 53 },
- { 18, 1, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 87 },
- { 25, 1, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 1, 87 },
- { 5, 1, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 87 },
- { 18, 1, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 118 },
- { 29, 1, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 118 },
- { 5, 1, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 118 },
- { 18, 1, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 117 },
- { 5, 1, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 117 },
- { 18, 1, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 128 },
- { 5, 1, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 128 },
- { 18, 1, 0, 0, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 64 },
- { 5, 1, 0, 0, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 64 },
- { 5, 1, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 64 },
- { 25, 10, 0, 0, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 1, 64 },
- { 18, 1, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 76 },
- { 25, 1, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 76 },
- { 18, 1, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 98 },
- { 18, 1, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 97 },
- { 5, 1, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 97 },
- { 18, 1, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 61 },
- { 0, 17, 0, 5, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 61 },
- { 0, 17, 220, 5, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 61 },
- { 0, 17, 230, 5, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 61 },
- { 18, 1, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 61 },
- { 0, 17, 1, 5, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 61 },
- { 0, 17, 9, 5, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 61 },
- { 5, 1, 0, 0, 1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 61 },
- { 5, 1, 0, 0, 2, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 61 },
- { 5, 1, 0, 0, 3, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 61 },
- { 5, 1, 0, 0, 4, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 61 },
- { 5, 1, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 61 },
- { 5, 1, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 61 },
- { 25, 1, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 1, 61 },
- { 25, 1, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 1, 61 },
- { 25, 1, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 61 },
- { 18, 1, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 88 },
- { 5, 1, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 88 },
- { 25, 1, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 88 },
- { 18, 1, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 116 },
- { 5, 1, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 116 },
- { 18, 1, 0, 2, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 112 },
- { 18, 1, 0, 3, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 112 },
- { 18, 1, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 112 },
- { 29, 1, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 112 },
- { 18, 1, 0, 4, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 112 },
- { 0, 17, 230, 5, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 112 },
- { 0, 17, 220, 5, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 112 },
- { 5, 1, 0, 2, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 112 },
- { 5, 1, 0, 3, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 112 },
- { 25, 1, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 1, 112 },
- { 25, 1, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 15, 0, 1, 112 },
- { 18, 1, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 80 },
- { 25, 10, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 1, 80 },
- { 18, 1, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 89 },
- { 5, 1, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 89 },
- { 18, 1, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 90 },
- { 5, 1, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 90 },
- { 18, 1, 0, 2, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 121 },
- { 18, 1, 0, 3, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 121 },
- { 25, 1, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 121 },
- { 5, 1, 0, 3, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 121 },
- { 5, 1, 0, 2, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 121 },
- { 5, 1, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 121 },
- { 18, 1, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 91 },
- { 14, 1, 0, 0, -1, 0, 17, 0, { {0, 64}, {0, 0}, {0, 0}, {0, 64} }, 0, 10, 12, 7, 3, 130 },
- { 15, 1, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, -64}, {0, -64}, {0, 0} }, 0, 10, 12, 6, 1, 130 },
- { 5, 1, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 130 },
- { 18, 13, 0, 4, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 144 },
- { 18, 13, 0, 2, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 144 },
- { 18, 13, 0, 3, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 144 },
- { 0, 17, 230, 5, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 144 },
- { 3, 5, 0, 0, 0, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 144 },
- { 3, 5, 0, 0, 1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 144 },
- { 3, 5, 0, 0, 2, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 144 },
- { 3, 5, 0, 0, 3, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 144 },
- { 3, 5, 0, 0, 4, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 144 },
- { 3, 5, 0, 0, 5, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 144 },
- { 3, 5, 0, 0, 6, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 144 },
- { 3, 5, 0, 0, 7, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 144 },
- { 3, 5, 0, 0, 8, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 144 },
- { 3, 5, 0, 0, 9, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 144 },
- { 5, 5, 0, 0, 1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 8 },
- { 5, 5, 0, 0, 2, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 8 },
- { 5, 5, 0, 0, 3, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 8 },
- { 5, 5, 0, 0, 4, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 8 },
- { 5, 5, 0, 0, 5, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 8 },
- { 5, 5, 0, 0, 6, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 8 },
- { 5, 5, 0, 0, 7, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 8 },
- { 5, 5, 0, 0, 8, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 8 },
- { 5, 5, 0, 0, 9, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 8 },
- { 5, 5, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 8 },
- { 18, 1, 0, 0, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 156 },
- { 0, 17, 230, 5, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 156 },
- { 20, 1, 0, 0, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 1, 156 },
- { 18, 1, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 147 },
- { 5, 1, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 147 },
- { 18, 13, 0, 2, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 148 },
- { 18, 13, 0, 3, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 148 },
- { 18, 13, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 148 },
- { 0, 17, 220, 5, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 148 },
- { 0, 17, 230, 5, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 148 },
- { 5, 13, 0, 2, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 148 },
- { 5, 13, 0, 3, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 148 },
- { 25, 13, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 12, 1, 148 },
- { 18, 1, 0, 2, -1, 0, 24, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 158 },
- { 18, 1, 0, 3, -1, 0, 24, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 158 },
- { 0, 17, 230, 5, -1, 0, 24, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 158 },
- { 0, 17, 220, 5, -1, 0, 24, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 158 },
- { 25, 1, 0, 0, -1, 0, 24, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 12, 1, 158 },
- { 18, 1, 0, 2, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 153 },
- { 18, 1, 0, 0, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 153 },
- { 18, 1, 0, 3, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 153 },
- { 5, 1, 0, 0, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 153 },
- { 5, 1, 0, 3, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 153 },
- { 5, 1, 0, 2, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 153 },
- { 5, 1, 0, 4, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 153 },
- { 18, 1, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 149 },
- { 1, 0, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 1, 94 },
- { 0, 17, 0, 5, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 94 },
- { 18, 0, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 94 },
- { 0, 17, 9, 5, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 94 },
- { 25, 0, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 1, 94 },
- { 25, 0, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 94 },
- { 5, 10, 0, 0, 1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 94 },
- { 5, 10, 0, 0, 2, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 94 },
- { 5, 10, 0, 0, 3, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 94 },
- { 5, 10, 0, 0, 4, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 94 },
- { 5, 10, 0, 0, 5, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 94 },
- { 5, 10, 0, 0, 6, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 94 },
- { 5, 10, 0, 0, 7, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 94 },
- { 5, 10, 0, 0, 8, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 94 },
- { 5, 10, 0, 0, 9, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 94 },
- { 5, 10, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 94 },
- { 3, 0, 0, 0, 0, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 94 },
- { 3, 0, 0, 0, 1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 94 },
- { 3, 0, 0, 0, 2, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 94 },
- { 3, 0, 0, 0, 3, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 94 },
- { 3, 0, 0, 0, 4, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 94 },
- { 3, 0, 0, 0, 5, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 94 },
- { 3, 0, 0, 0, 6, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 94 },
- { 3, 0, 0, 0, 7, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 94 },
- { 3, 0, 0, 0, 8, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 94 },
- { 3, 0, 0, 0, 9, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 94 },
- { 0, 17, 9, 5, -1, 0, 24, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 94 },
- { 18, 0, 0, 0, -1, 0, 24, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 94 },
- { 0, 17, 0, 5, -1, 0, 24, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 94 },
- { 0, 17, 9, 5, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 94 },
- { 0, 17, 0, 5, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 92 },
- { 1, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 1, 92 },
- { 18, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 92 },
- { 18, 0, 0, 0, -1, 0, 11, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 92 },
- { 0, 17, 9, 5, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 92 },
- { 0, 17, 7, 5, -1, 0, 11, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 92 },
- { 25, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 92 },
- { 10, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 7, 6, 12, 4, 0, 92 },
- { 25, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 1, 92 },
- { 0, 17, 0, 5, -1, 0, 24, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 92 },
- { 10, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 7, 6, 12, 4, 0, 92 },
- { 18, 0, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 101 },
- { 3, 0, 0, 0, 0, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 101 },
- { 3, 0, 0, 0, 1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 101 },
- { 3, 0, 0, 0, 2, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 101 },
- { 3, 0, 0, 0, 3, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 101 },
- { 3, 0, 0, 0, 4, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 101 },
- { 3, 0, 0, 0, 5, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 101 },
- { 3, 0, 0, 0, 6, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 101 },
- { 3, 0, 0, 0, 7, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 101 },
- { 3, 0, 0, 0, 8, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 101 },
- { 3, 0, 0, 0, 9, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 101 },
- { 0, 17, 230, 5, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 96 },
- { 18, 0, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 96 },
- { 0, 17, 0, 5, -1, 0, 13, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 96 },
- { 0, 17, 0, 5, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 96 },
- { 1, 0, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 1, 96 },
- { 0, 17, 0, 5, -1, 0, 13, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 96 },
- { 0, 17, 9, 5, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 96 },
- { 3, 0, 0, 0, 0, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 96 },
- { 3, 0, 0, 0, 1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 96 },
- { 3, 0, 0, 0, 2, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 96 },
- { 3, 0, 0, 0, 3, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 96 },
- { 3, 0, 0, 0, 4, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 96 },
- { 3, 0, 0, 0, 5, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 96 },
- { 3, 0, 0, 0, 6, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 96 },
- { 3, 0, 0, 0, 7, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 96 },
- { 3, 0, 0, 0, 8, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 96 },
- { 3, 0, 0, 0, 9, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 96 },
- { 25, 0, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 1, 96 },
- { 25, 0, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 1, 96 },
- { 18, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 96 },
- { 1, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 1, 96 },
- { 18, 0, 0, 0, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 96 },
- { 18, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 111 },
- { 0, 17, 7, 5, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 111 },
- { 25, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 111 },
- { 25, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 18, 0, 1, 111 },
- { 0, 17, 0, 5, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 100 },
- { 1, 0, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 1, 100 },
- { 18, 0, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 100 },
- { 1, 0, 9, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 1, 100 },
- { 18, 0, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 7, 10, 12, 8, 1, 100 },
- { 25, 0, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 1, 100 },
- { 25, 0, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 100 },
- { 25, 0, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 1, 100 },
- { 0, 17, 0, 5, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 100 },
- { 0, 17, 7, 5, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 100 },
- { 25, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 12, 1, 100 },
- { 1, 0, 0, 0, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 1, 100 },
- { 0, 17, 0, 5, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 100 },
- { 3, 0, 0, 0, 0, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 100 },
- { 3, 0, 0, 0, 1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 100 },
- { 3, 0, 0, 0, 2, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 100 },
- { 3, 0, 0, 0, 3, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 100 },
- { 3, 0, 0, 0, 4, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 100 },
- { 3, 0, 0, 0, 5, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 100 },
- { 3, 0, 0, 0, 6, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 100 },
- { 3, 0, 0, 0, 7, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 100 },
- { 3, 0, 0, 0, 8, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 100 },
- { 3, 0, 0, 0, 9, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 100 },
- { 18, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 100 },
- { 25, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 18, 0, 1, 100 },
- { 18, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 100 },
- { 25, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 1, 100 },
- { 25, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 1, 100 },
- { 5, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 20 },
- { 18, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 109 },
- { 1, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 1, 109 },
- { 0, 17, 0, 5, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 109 },
- { 1, 0, 9, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 1, 109 },
- { 0, 17, 7, 5, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 109 },
- { 25, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 1, 109 },
- { 25, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 109 },
- { 0, 17, 0, 5, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 109 },
- { 18, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 129 },
- { 25, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 1, 129 },
- { 18, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 123 },
- { 0, 17, 0, 5, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 123 },
- { 1, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 1, 123 },
- { 0, 17, 7, 5, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 123 },
- { 0, 17, 9, 5, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 123 },
- { 3, 0, 0, 0, 0, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 123 },
- { 3, 0, 0, 0, 1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 123 },
- { 3, 0, 0, 0, 2, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 123 },
- { 3, 0, 0, 0, 3, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 123 },
- { 3, 0, 0, 0, 4, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 123 },
- { 3, 0, 0, 0, 5, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 123 },
- { 3, 0, 0, 0, 6, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 123 },
- { 3, 0, 0, 0, 7, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 123 },
- { 3, 0, 0, 0, 8, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 123 },
- { 3, 0, 0, 0, 9, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 123 },
- { 0, 17, 0, 5, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 107 },
- { 0, 17, 0, 5, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 107 },
- { 1, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 1, 107 },
- { 18, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 107 },
- { 0, 17, 7, 5, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 1 },
- { 0, 17, 7, 5, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 107 },
- { 1, 0, 0, 0, -1, 0, 16, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 107 },
- { 1, 0, 0, 0, -1, 0, 16, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 1, 107 },
- { 1, 0, 9, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 1, 107 },
- { 18, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 107 },
- { 0, 17, 230, 5, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 107 },
- { 18, 0, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 135 },
- { 1, 0, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 1, 135 },
- { 0, 17, 0, 5, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 135 },
- { 0, 17, 9, 5, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 135 },
- { 0, 17, 7, 5, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 135 },
- { 25, 0, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 1, 135 },
- { 25, 0, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 1, 135 },
- { 25, 0, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 135 },
- { 3, 0, 0, 0, 0, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 135 },
- { 3, 0, 0, 0, 1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 135 },
- { 3, 0, 0, 0, 2, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 135 },
- { 3, 0, 0, 0, 3, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 135 },
- { 3, 0, 0, 0, 4, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 135 },
- { 3, 0, 0, 0, 5, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 135 },
- { 3, 0, 0, 0, 6, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 135 },
- { 3, 0, 0, 0, 7, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 135 },
- { 3, 0, 0, 0, 8, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 135 },
- { 3, 0, 0, 0, 9, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 135 },
- { 25, 0, 0, 0, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 1, 135 },
- { 0, 17, 230, 5, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 135 },
- { 18, 0, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 135 },
- { 18, 0, 0, 0, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 135 },
- { 18, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 124 },
- { 1, 0, 0, 0, -1, 0, 16, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 124 },
- { 1, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 1, 124 },
- { 0, 17, 0, 5, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 124 },
- { 0, 17, 0, 5, -1, 0, 16, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 124 },
- { 1, 0, 0, 0, -1, 0, 16, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 1, 124 },
- { 0, 17, 9, 5, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 124 },
- { 0, 17, 7, 5, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 124 },
- { 25, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 124 },
- { 3, 0, 0, 0, 0, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 124 },
- { 3, 0, 0, 0, 1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 124 },
- { 3, 0, 0, 0, 2, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 124 },
- { 3, 0, 0, 0, 3, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 124 },
- { 3, 0, 0, 0, 4, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 124 },
- { 3, 0, 0, 0, 5, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 124 },
- { 3, 0, 0, 0, 6, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 124 },
- { 3, 0, 0, 0, 7, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 124 },
- { 3, 0, 0, 0, 8, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 124 },
- { 3, 0, 0, 0, 9, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 124 },
- { 18, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 122 },
- { 1, 0, 0, 0, -1, 0, 16, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 122 },
- { 1, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 1, 122 },
- { 0, 17, 0, 5, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 122 },
- { 1, 0, 0, 0, -1, 0, 16, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 1, 122 },
- { 0, 17, 9, 5, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 122 },
- { 0, 17, 7, 5, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 122 },
- { 25, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 18, 0, 1, 122 },
- { 25, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 1, 122 },
- { 25, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 6, 0, 1, 122 },
- { 25, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 122 },
- { 25, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 1, 122 },
- { 18, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 122 },
- { 0, 17, 0, 5, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 122 },
- { 18, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 114 },
- { 1, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 1, 114 },
- { 0, 17, 0, 5, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 114 },
- { 0, 17, 9, 5, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 114 },
- { 25, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 1, 114 },
- { 25, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 114 },
- { 3, 0, 0, 0, 0, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 114 },
- { 3, 0, 0, 0, 1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 114 },
- { 3, 0, 0, 0, 2, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 114 },
- { 3, 0, 0, 0, 3, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 114 },
- { 3, 0, 0, 0, 4, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 114 },
- { 3, 0, 0, 0, 5, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 114 },
- { 3, 0, 0, 0, 6, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 114 },
- { 3, 0, 0, 0, 7, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 114 },
- { 3, 0, 0, 0, 8, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 114 },
- { 3, 0, 0, 0, 9, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 114 },
- { 25, 10, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 18, 0, 1, 33 },
- { 18, 0, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 102 },
- { 0, 17, 0, 5, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 102 },
- { 1, 0, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 1, 102 },
- { 1, 0, 9, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 1, 102 },
- { 0, 17, 7, 5, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 102 },
- { 18, 0, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 102 },
- { 25, 0, 0, 0, -1, 0, 24, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 102 },
- { 3, 0, 0, 0, 0, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 102 },
- { 3, 0, 0, 0, 1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 102 },
- { 3, 0, 0, 0, 2, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 102 },
- { 3, 0, 0, 0, 3, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 102 },
- { 3, 0, 0, 0, 4, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 102 },
- { 3, 0, 0, 0, 5, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 102 },
- { 3, 0, 0, 0, 6, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 102 },
- { 3, 0, 0, 0, 7, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 102 },
- { 3, 0, 0, 0, 8, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 102 },
- { 3, 0, 0, 0, 9, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 102 },
- { 18, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 33, 8, 1, 126 },
- { 18, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 33, 8, 1, 126 },
- { 0, 17, 0, 5, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 33, 4, 1, 126 },
- { 1, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 4, 33, 4, 1, 126 },
- { 1, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 33, 4, 1, 126 },
- { 0, 17, 9, 5, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 33, 4, 1, 126 },
- { 3, 0, 0, 0, 0, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 126 },
- { 3, 0, 0, 0, 1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 126 },
- { 3, 0, 0, 0, 2, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 126 },
- { 3, 0, 0, 0, 3, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 126 },
- { 3, 0, 0, 0, 4, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 126 },
- { 3, 0, 0, 0, 5, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 126 },
- { 3, 0, 0, 0, 6, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 126 },
- { 3, 0, 0, 0, 7, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 126 },
- { 3, 0, 0, 0, 8, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 126 },
- { 3, 0, 0, 0, 9, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 126 },
- { 5, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 33, 0, 1, 126 },
- { 25, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 1, 126 },
- { 29, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 33, 0, 1, 126 },
- { 18, 0, 0, 0, -1, 0, 24, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 33, 8, 1, 126 },
- { 18, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 142 },
- { 1, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 1, 142 },
- { 0, 17, 0, 5, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 142 },
- { 0, 17, 9, 5, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 142 },
- { 0, 17, 7, 5, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 142 },
- { 25, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 142 },
- { 14, 0, 0, 0, -1, 0, 16, 0, { {0, 32}, {0, 0}, {0, 0}, {0, 32} }, 0, 10, 12, 7, 3, 125 },
- { 15, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, -32}, {0, -32}, {0, 0} }, 0, 10, 12, 6, 1, 125 },
- { 3, 0, 0, 0, 0, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 125 },
- { 3, 0, 0, 0, 1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 125 },
- { 3, 0, 0, 0, 2, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 125 },
- { 3, 0, 0, 0, 3, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 125 },
- { 3, 0, 0, 0, 4, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 125 },
- { 3, 0, 0, 0, 5, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 125 },
- { 3, 0, 0, 0, 6, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 125 },
- { 3, 0, 0, 0, 7, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 125 },
- { 3, 0, 0, 0, 8, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 125 },
- { 3, 0, 0, 0, 9, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 125 },
- { 5, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 125 },
- { 18, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 125 },
- { 18, 0, 0, 0, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 154 },
- { 1, 0, 0, 0, -1, 0, 23, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 154 },
- { 1, 0, 0, 0, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 1, 154 },
- { 1, 0, 0, 0, -1, 0, 23, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 1, 154 },
- { 0, 17, 0, 5, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 154 },
- { 1, 0, 9, 0, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 1, 154 },
- { 0, 17, 9, 5, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 154 },
- { 18, 0, 0, 0, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 7, 10, 12, 8, 1, 154 },
- { 0, 17, 7, 5, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 154 },
- { 25, 0, 0, 0, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 1, 154 },
- { 25, 0, 0, 0, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 1, 154 },
- { 3, 0, 0, 0, 0, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 154 },
- { 3, 0, 0, 0, 1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 154 },
- { 3, 0, 0, 0, 2, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 154 },
- { 3, 0, 0, 0, 3, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 154 },
- { 3, 0, 0, 0, 4, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 154 },
- { 3, 0, 0, 0, 5, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 154 },
- { 3, 0, 0, 0, 6, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 154 },
- { 3, 0, 0, 0, 7, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 154 },
- { 3, 0, 0, 0, 8, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 154 },
- { 3, 0, 0, 0, 9, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 154 },
- { 18, 0, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 150 },
- { 1, 0, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 1, 150 },
- { 0, 17, 0, 5, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 150 },
- { 0, 17, 9, 5, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 150 },
- { 25, 0, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 18, 0, 1, 150 },
- { 18, 0, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 141 },
- { 0, 17, 0, 5, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 141 },
- { 0, 0, 0, 5, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 141 },
- { 0, 17, 9, 5, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 141 },
- { 1, 0, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 1, 141 },
- { 18, 0, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 7, 10, 12, 8, 1, 141 },
- { 25, 0, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 18, 0, 1, 141 },
- { 25, 0, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 141 },
- { 25, 0, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 1, 141 },
- { 25, 0, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 1, 141 },
- { 18, 0, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 140 },
- { 0, 17, 0, 5, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 140 },
- { 1, 0, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 1, 140 },
- { 18, 0, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 7, 10, 12, 8, 1, 140 },
- { 18, 0, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 7, 10, 12, 8, 1, 140 },
- { 0, 17, 9, 5, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 140 },
- { 25, 0, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 1, 140 },
- { 25, 0, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 1, 140 },
- { 18, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 140 },
- { 25, 0, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 18, 0, 1, 140 },
- { 18, 0, 0, 0, -1, 0, 24, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 29 },
- { 18, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 119 },
- { 18, 0, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 133 },
- { 1, 0, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 1, 133 },
- { 0, 17, 0, 5, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 133 },
- { 0, 0, 9, 5, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 133 },
- { 25, 0, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 1, 133 },
- { 25, 0, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 1, 133 },
- { 3, 0, 0, 0, 0, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 133 },
- { 3, 0, 0, 0, 1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 133 },
- { 3, 0, 0, 0, 2, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 133 },
- { 3, 0, 0, 0, 3, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 133 },
- { 3, 0, 0, 0, 4, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 133 },
- { 3, 0, 0, 0, 5, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 133 },
- { 3, 0, 0, 0, 6, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 133 },
- { 3, 0, 0, 0, 7, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 133 },
- { 3, 0, 0, 0, 8, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 133 },
- { 3, 0, 0, 0, 9, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 133 },
- { 5, 0, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 133 },
- { 25, 0, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 18, 0, 1, 134 },
- { 25, 0, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 6, 0, 1, 134 },
- { 18, 0, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 134 },
- { 0, 17, 0, 5, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 134 },
- { 1, 0, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 1, 134 },
- { 18, 0, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 138 },
- { 0, 17, 0, 5, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 138 },
- { 0, 17, 7, 5, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 138 },
- { 0, 17, 9, 5, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 138 },
- { 18, 0, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 7, 10, 12, 8, 1, 138 },
- { 3, 0, 0, 0, 0, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 138 },
- { 3, 0, 0, 0, 1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 138 },
- { 3, 0, 0, 0, 2, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 138 },
- { 3, 0, 0, 0, 3, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 138 },
- { 3, 0, 0, 0, 4, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 138 },
- { 3, 0, 0, 0, 5, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 138 },
- { 3, 0, 0, 0, 6, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 138 },
- { 3, 0, 0, 0, 7, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 138 },
- { 3, 0, 0, 0, 8, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 138 },
- { 3, 0, 0, 0, 9, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 138 },
- { 18, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 143 },
- { 1, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 1, 143 },
- { 0, 17, 0, 5, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 143 },
- { 0, 17, 9, 5, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 143 },
- { 3, 0, 0, 0, 0, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 143 },
- { 3, 0, 0, 0, 1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 143 },
- { 3, 0, 0, 0, 2, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 143 },
- { 3, 0, 0, 0, 3, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 143 },
- { 3, 0, 0, 0, 4, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 143 },
- { 3, 0, 0, 0, 5, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 143 },
- { 3, 0, 0, 0, 6, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 143 },
- { 3, 0, 0, 0, 7, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 143 },
- { 3, 0, 0, 0, 8, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 143 },
- { 3, 0, 0, 0, 9, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 143 },
- { 18, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 145 },
- { 0, 17, 0, 5, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 145 },
- { 1, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 1, 145 },
- { 25, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 12, 1, 145 },
- { 18, 0, 0, 0, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 83 },
- { 5, 0, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 16 },
- { 29, 10, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 16 },
- { 27, 4, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 10, 0, 1, 16 },
- { 25, 0, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 1, 16 },
- { 18, 0, 0, 0, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 63 },
- { 18, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 63 },
- { 18, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 63 },
- { 4, 0, 0, 0, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 63 },
- { 4, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 63 },
- { 25, 0, 0, 0, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 1, 63 },
- { 25, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 1, 63 },
- { 18, 0, 0, 0, -1, 0, 24, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 157 },
- { 25, 0, 0, 0, -1, 0, 24, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 157 },
- { 18, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 81 },
- { 18, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 0, 8, 1, 81 },
- { 18, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 1, 8, 1, 81 },
- { 10, 0, 0, 5, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 4, 4, 0, 81 },
- { 10, 0, 0, 5, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 0, 4, 0, 81 },
- { 10, 0, 0, 5, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 1, 4, 0, 81 },
- { 18, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 127 },
- { 18, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 0, 8, 1, 127 },
- { 18, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 1, 8, 1, 127 },
- { 18, 0, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 84 },
- { 18, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 115 },
- { 3, 0, 0, 0, 0, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 115 },
- { 3, 0, 0, 0, 1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 115 },
- { 3, 0, 0, 0, 2, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 115 },
- { 3, 0, 0, 0, 3, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 115 },
- { 3, 0, 0, 0, 4, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 115 },
- { 3, 0, 0, 0, 5, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 115 },
- { 3, 0, 0, 0, 6, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 115 },
- { 3, 0, 0, 0, 7, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 115 },
- { 3, 0, 0, 0, 8, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 115 },
- { 3, 0, 0, 0, 9, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 115 },
- { 25, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 1, 115 },
- { 18, 0, 0, 0, -1, 0, 24, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 159 },
- { 3, 0, 0, 0, 0, 0, 24, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 159 },
- { 3, 0, 0, 0, 1, 0, 24, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 159 },
- { 3, 0, 0, 0, 2, 0, 24, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 159 },
- { 3, 0, 0, 0, 3, 0, 24, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 159 },
- { 3, 0, 0, 0, 4, 0, 24, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 159 },
- { 3, 0, 0, 0, 5, 0, 24, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 159 },
- { 3, 0, 0, 0, 6, 0, 24, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 159 },
- { 3, 0, 0, 0, 7, 0, 24, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 159 },
- { 3, 0, 0, 0, 8, 0, 24, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 159 },
- { 3, 0, 0, 0, 9, 0, 24, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 159 },
- { 18, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 104 },
- { 0, 17, 1, 5, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 104 },
- { 25, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 1, 104 },
- { 18, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 108 },
- { 0, 17, 230, 5, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 108 },
- { 25, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 1, 108 },
- { 25, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 1, 108 },
- { 25, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 108 },
- { 29, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 108 },
- { 17, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 108 },
- { 3, 0, 0, 0, 0, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 108 },
- { 3, 0, 0, 0, 1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 108 },
- { 3, 0, 0, 0, 2, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 108 },
- { 3, 0, 0, 0, 3, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 108 },
- { 3, 0, 0, 0, 4, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 108 },
- { 3, 0, 0, 0, 5, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 108 },
- { 3, 0, 0, 0, 6, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 108 },
- { 3, 0, 0, 0, 7, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 108 },
- { 3, 0, 0, 0, 8, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 108 },
- { 3, 0, 0, 0, 9, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 108 },
- { 5, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 108 },
- { 14, 0, 0, 0, -1, 0, 20, 0, { {0, 32}, {0, 0}, {0, 0}, {0, 32} }, 0, 10, 12, 7, 3, 146 },
- { 15, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, -32}, {0, -32}, {0, 0} }, 0, 10, 12, 6, 1, 146 },
- { 5, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 146 },
- { 25, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 1, 146 },
- { 25, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 1, 146 },
- { 25, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 146 },
- { 18, 0, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 99 },
- { 18, 0, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 99 },
- { 0, 17, 0, 5, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 99 },
- { 1, 0, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 1, 99 },
- { 1, 0, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 1, 99 },
- { 0, 17, 0, 5, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 99 },
- { 17, 0, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 99 },
- { 17, 0, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 5, 8, 1, 137 },
- { 17, 0, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 5, 8, 1, 139 },
- { 25, 10, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 5, 0, 1, 37 },
- { 17, 0, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 5, 8, 1, 37 },
- { 0, 17, 0, 5, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 4, 4, 1, 155 },
- { 1, 0, 6, 0, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 1, 37 },
- { 18, 0, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 1, 137 },
- { 18, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 1, 137 },
- { 18, 0, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 1, 137 },
- { 18, 0, 0, 0, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 1, 137 },
- { 18, 0, 0, 0, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 8, 1, 155 },
- { 17, 0, 0, 0, -1, 0, 24, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 12, 8, 1, 35 },
- { 18, 0, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 14, 8, 1, 35 },
- { 18, 0, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 1, 34 },
- { 18, 0, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 1, 34 },
- { 18, 0, 0, 0, -1, 0, 24, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 1, 34 },
- { 18, 0, 0, 0, -1, 0, 24, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 14, 8, 1, 35 },
- { 18, 0, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 5, 8, 1, 34 },
- { 18, 0, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 5, 8, 1, 35 },
- { 18, 0, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 1, 139 },
- { 18, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 105 },
- { 29, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 105 },
- { 0, 17, 0, 5, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 105 },
- { 0, 17, 1, 5, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 105 },
- { 25, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 1, 105 },
- { 10, 18, 0, 5, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 21, 4, 2, 2 },
- { 0, 17, 0, 5, -1, 0, 24, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 1 },
- { 29, 0, 0, 0, -1, 0, 24, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 29, 0, 0, 0, -1, 0, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 29, 0, 0, 0, -1, 0, 5, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 3, 2 },
- { 1, 0, 216, 0, -1, 0, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 2 },
- { 1, 0, 216, 0, -1, 0, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 1, 2 },
- { 0, 17, 1, 5, -1, 0, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 1 },
- { 1, 0, 226, 0, -1, 0, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 1, 2 },
- { 10, 18, 0, 5, -1, 0, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 21, 4, 0, 2 },
- { 0, 17, 220, 5, -1, 0, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 1 },
- { 0, 17, 230, 5, -1, 0, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 1 },
- { 29, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 29, 10, 0, 0, -1, 0, 24, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 0, 17, 230, 5, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 4 },
- { 5, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 5, 0, 0, 0, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 14, 0, 0, 0, -1, 0, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 3, 2 },
- { 15, 0, 0, 0, -1, 0, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 3, 2 },
- { 15, 0, 0, 0, -1, 0, 7, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 3, 2 },
- { 26, 0, 0, 0, -1, 0, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 3, 2 },
- { 26, 10, 0, 0, -1, 0, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 3, 2 },
- { 14, 0, 0, 0, -1, 0, 9, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 3, 2 },
- { 15, 0, 0, 0, -1, 0, 9, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 3, 2 },
- { 3, 2, 0, 0, 0, 0, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 3, 2 },
- { 3, 2, 0, 0, 1, 0, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 3, 2 },
- { 3, 2, 0, 0, 2, 0, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 3, 2 },
- { 3, 2, 0, 0, 3, 0, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 3, 2 },
- { 3, 2, 0, 0, 4, 0, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 3, 2 },
- { 3, 2, 0, 0, 5, 0, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 3, 2 },
- { 3, 2, 0, 0, 6, 0, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 3, 2 },
- { 3, 2, 0, 0, 7, 0, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 3, 2 },
- { 3, 2, 0, 0, 8, 0, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 3, 2 },
- { 3, 2, 0, 0, 9, 0, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 3, 2 },
- { 29, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 131 },
- { 0, 17, 0, 5, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 131 },
- { 25, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 1, 131 },
- { 25, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 1, 131 },
- { 25, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 131 },
- { 18, 0, 0, 0, -1, 0, 24, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 3 },
- { 0, 17, 230, 5, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 57 },
- { 18, 0, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 151 },
- { 0, 17, 230, 5, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 151 },
- { 17, 0, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 151 },
- { 3, 0, 0, 0, 0, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 151 },
- { 3, 0, 0, 0, 1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 151 },
- { 3, 0, 0, 0, 2, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 151 },
- { 3, 0, 0, 0, 3, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 151 },
- { 3, 0, 0, 0, 4, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 151 },
- { 3, 0, 0, 0, 5, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 151 },
- { 3, 0, 0, 0, 6, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 151 },
- { 3, 0, 0, 0, 7, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 151 },
- { 3, 0, 0, 0, 8, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 151 },
- { 3, 0, 0, 0, 9, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 151 },
- { 29, 0, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 151 },
- { 18, 0, 0, 0, -1, 0, 24, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 160 },
- { 0, 17, 230, 5, -1, 0, 24, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 160 },
- { 18, 0, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 152 },
- { 0, 17, 230, 5, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 152 },
- { 3, 0, 0, 0, 0, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 152 },
- { 3, 0, 0, 0, 1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 152 },
- { 3, 0, 0, 0, 2, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 152 },
- { 3, 0, 0, 0, 3, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 152 },
- { 3, 0, 0, 0, 4, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 152 },
- { 3, 0, 0, 0, 5, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 152 },
- { 3, 0, 0, 0, 6, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 152 },
- { 3, 0, 0, 0, 7, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 152 },
- { 3, 0, 0, 0, 8, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 152 },
- { 3, 0, 0, 0, 9, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 152 },
- { 27, 4, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 9, 0, 1, 152 },
- { 18, 0, 0, 0, -1, 0, 24, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 27 },
- { 18, 1, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 113 },
- { 5, 1, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 113 },
- { 0, 17, 220, 5, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 113 },
- { 14, 1, 0, 2, -1, 0, 18, 0, { {0, 34}, {0, 0}, {0, 0}, {0, 34} }, 0, 10, 12, 7, 3, 132 },
- { 15, 1, 0, 2, -1, 0, 18, 0, { {0, 0}, {0, -34}, {0, -34}, {0, 0} }, 0, 10, 12, 6, 1, 132 },
- { 0, 17, 230, 5, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 132 },
- { 0, 17, 7, 5, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1, 132 },
- { 17, 1, 0, 5, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 1, 132 },
- { 3, 1, 0, 0, 0, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 132 },
- { 3, 1, 0, 0, 1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 132 },
- { 3, 1, 0, 0, 2, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 132 },
- { 3, 1, 0, 0, 3, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 132 },
- { 3, 1, 0, 0, 4, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 132 },
- { 3, 1, 0, 0, 5, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 132 },
- { 3, 1, 0, 0, 6, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 132 },
- { 3, 1, 0, 0, 7, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 132 },
- { 3, 1, 0, 0, 8, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 132 },
- { 3, 1, 0, 0, 9, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 1, 132 },
- { 25, 1, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 0, 1, 132 },
- { 5, 13, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 29, 13, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 10, 0, 1, 2 },
- { 27, 13, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 10, 0, 1, 2 },
- { 5, 13, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 29, 13, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 18, 13, 0, 0, -1, 0, 13, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 3, 8 },
- { 26, 10, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 8 },
- { 13, 0, 0, 0, -1, 0, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 0, 0 },
- { 5, 2, 0, 0, 0, 0, 11, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 0, 2 },
- { 5, 2, 0, 0, 1, 0, 11, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 0, 2 },
- { 5, 2, 0, 0, 2, 0, 11, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 0, 2 },
- { 5, 2, 0, 0, 3, 0, 11, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 0, 2 },
- { 5, 2, 0, 0, 4, 0, 11, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 0, 2 },
- { 5, 2, 0, 0, 5, 0, 11, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 0, 2 },
- { 5, 2, 0, 0, 6, 0, 11, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 0, 2 },
- { 5, 2, 0, 0, 7, 0, 11, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 0, 2 },
- { 5, 2, 0, 0, 8, 0, 11, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 0, 2 },
- { 5, 2, 0, 0, 9, 0, 11, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 0, 2 },
- { 5, 10, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 29, 10, 0, 0, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 1, 2 },
- { 29, 0, 0, 0, -1, 0, 11, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 0, 2 },
- { 29, 0, 0, 0, -1, 0, 11, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 3, 2 },
- { 29, 10, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 12, 0, 1, 2 },
- { 29, 0, 0, 0, -1, 0, 12, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 3, 2 },
- { 29, 0, 0, 0, -1, 0, 11, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 3, 2 },
- { 29, 0, 0, 0, -1, 0, 12, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 3, 2 },
- { 29, 0, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 2 },
- { 29, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 1, 2 },
- { 29, 10, 0, 0, -1, 0, 13, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 3, 2 },
- { 29, 10, 0, 0, -1, 0, 21, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 12, 0, 3, 2 },
- { 29, 0, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 10, 12, 7, 1, 2 },
- { 29, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 10, 12, 7, 1, 2 },
- { 29, 0, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 12, 0, 1, 2 },
- { 29, 0, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 29, 0, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 29, 0, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 6, 7, 28, 0, 1, 2 },
- { 29, 0, 0, 0, -1, 0, 11, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 34 },
- { 29, 0, 0, 0, -1, 0, 12, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 3, 2 },
- { 29, 0, 0, 0, -1, 0, 11, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 3, 2 },
- { 29, 0, 0, 0, -1, 0, 18, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
- { 29, 10, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 1, 2 },
- { 29, 10, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 1, 2 },
- { 29, 10, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 30, 0, 1, 2 },
- { 28, 10, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 31, 0, 1, 2 },
- { 29, 10, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 29, 10, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 30, 0, 1, 2 },
- { 29, 10, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 1, 2 },
- { 29, 10, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 1, 2 },
- { 29, 10, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 3, 13, 1, 2 },
- { 29, 10, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 5, 0, 1, 2 },
- { 29, 10, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 1, 2 },
- { 29, 10, 0, 0, -1, 0, 24, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 1, 2 },
- { 29, 10, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 1, 2 },
- { 29, 10, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
- { 29, 10, 0, 0, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 30, 0, 1, 2 },
- { 29, 10, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 30, 0, 1, 2 },
- { 29, 10, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 30, 0, 1, 2 },
- { 29, 10, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 30, 0, 1, 2 },
- { 29, 10, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
- { 29, 10, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 30, 0, 1, 2 },
- { 29, 10, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 12, 0, 1, 2 },
- { 29, 10, 0, 0, -1, 0, 24, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 30, 0, 1, 2 },
- { 3, 2, 0, 0, 0, 0, 23, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 3, 2 },
- { 3, 2, 0, 0, 1, 0, 23, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 3, 2 },
- { 3, 2, 0, 0, 2, 0, 23, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 3, 2 },
- { 3, 2, 0, 0, 3, 0, 23, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 3, 2 },
- { 3, 2, 0, 0, 4, 0, 23, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 3, 2 },
- { 3, 2, 0, 0, 5, 0, 23, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 3, 2 },
- { 3, 2, 0, 0, 6, 0, 23, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 3, 2 },
- { 3, 2, 0, 0, 7, 0, 23, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 3, 2 },
- { 3, 2, 0, 0, 8, 0, 23, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 3, 2 },
- { 3, 2, 0, 0, 9, 0, 23, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 3, 2 },
- { 13, 18, 0, 0, -1, 0, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 0, 0 },
- { 18, 0, 0, 0, -1, 0, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 1, 37 },
- { 18, 0, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 1, 37 },
- { 18, 0, 0, 0, -1, 0, 5, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 3, 37 },
- { 18, 0, 0, 0, -1, 0, 5, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 0, 37 },
- { 10, 18, 0, 5, -1, 0, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 0, 2 },
- { 0, 17, 0, 5, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 2, 1 },
- { 12, 0, 0, 0, -1, 0, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 0, 0 }
+static constexpr Properties uc_properties[] = {
+ { 9, 18, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 0, 23, 0, 0, 2 },
+ { 9, 8, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 0, 19, 5, 0, 2 },
+ { 9, 7, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 2, 2, 39, 2, 0, 2 },
+ { 9, 8, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 3, 40, 5, 0, 2 },
+ { 9, 9, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 3, 40, 5, 0, 2 },
+ { 9, 7, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 1, 1, 38, 1, 0, 2 },
+ { 9, 7, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 0, 23, 0, 0, 2 },
+ { 9, 8, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 0, 23, 0, 0, 2 },
+ { 6, 9, 0, 0, -1, 0, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 18, 37, 5, 0, 2 },
+ { 25, 10, 0, 0, -1, 0, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 8, 12, 0, 2 },
+ { 25, 10, 0, 0, -1, 0, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 12, 3, 13, 0, 2 },
+ { 25, 4, 0, 0, -1, 0, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 27, 4, 0, 0, -1, 0, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 11, 0, 0, 2 },
+ { 25, 4, 0, 0, -1, 0, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 0, 2 },
+ { 25, 10, 0, 0, -1, 0, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 25, 10, 0, 0, -1, 0, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 11, 3, 13, 0, 2 },
+ { 21, 10, 0, 0, -1, 1, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 0, 2 },
+ { 22, 10, 0, 0, -1, -1, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 2, 13, 0, 2 },
+ { 26, 3, 0, 0, -1, 0, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 11, 0, 0, 2 },
+ { 25, 6, 0, 0, -1, 0, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 15, 10, 11, 0, 2 },
+ { 20, 3, 0, 0, -1, 0, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 18, 11, 1, 2 },
+ { 25, 6, 0, 0, -1, 0, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 15, 10, 10, 1, 2 },
+ { 25, 6, 0, 0, -1, 0, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 9, 0, 0, 2 },
+ { 3, 2, 0, 0, 0, 0, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 2 },
+ { 3, 2, 0, 0, 1, 0, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 2 },
+ { 3, 2, 0, 0, 2, 0, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 2 },
+ { 3, 2, 0, 0, 3, 0, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 2 },
+ { 3, 2, 0, 0, 4, 0, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 2 },
+ { 3, 2, 0, 0, 5, 0, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 2 },
+ { 3, 2, 0, 0, 6, 0, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 2 },
+ { 3, 2, 0, 0, 7, 0, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 2 },
+ { 3, 2, 0, 0, 8, 0, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 2 },
+ { 3, 2, 0, 0, 9, 0, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 2 },
+ { 25, 6, 0, 0, -1, 0, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 10, 11, 0, 2 },
+ { 25, 10, 0, 0, -1, 0, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 15, 10, 0, 0, 2 },
+ { 26, 10, 0, 0, -1, 2, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 26, 10, 0, 0, -1, 0, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 26, 10, 0, 0, -1, -2, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 14, 0, 0, 0, -1, 0, 1, 4, 0, { {0, 32}, {0, 0}, {0, 0}, {0, 32} }, 0, 10, 14, 7, 3, 3 },
+ { 21, 10, 0, 0, -1, 2, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 0, 2 },
+ { 25, 10, 0, 0, -1, 0, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 11, 0, 0, 2 },
+ { 22, 10, 0, 0, -1, -2, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 2, 13, 0, 2 },
+ { 28, 10, 0, 0, -1, 0, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 19, 10, 0, 0, -1, 0, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 17, 14, 0, 1, 2 },
+ { 15, 0, 0, 0, -1, 0, 1, 4, 0, { {0, 0}, {0, -32}, {0, -32}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 26, 10, 0, 0, -1, 0, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 0, 2 },
+ { 22, 10, 0, 0, -1, -2, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 0, 2 },
+ { 9, 7, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 3, 40, 3, 0, 2 },
+ { 6, 6, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 6, 5, 0, 2 },
+ { 25, 10, 0, 0, -1, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 0, 1, 2 },
+ { 27, 4, 0, 0, -1, 0, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
+ { 27, 4, 0, 0, -1, 0, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 11, 0, 1, 2 },
+ { 27, 4, 0, 0, -1, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 11, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 25, 10, 0, 0, -1, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 28, 10, 0, 0, -1, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 29, 10, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 1, 2 },
+ { 18, 0, 0, 0, -1, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 3, 3 },
+ { 23, 10, 0, 0, -1, 16, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 3, 13, 1, 2 },
+ { 26, 10, 0, 0, -1, 0, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 10, 18, 0, 5, -1, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 19, 4, 2, 2 },
+ { 29, 10, 0, 0, -1, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 1, 2 },
+ { 28, 10, 0, 0, -1, 0, 1, 4, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 29, 4, 0, 0, -1, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
+ { 26, 4, 0, 0, -1, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 11, 0, 1, 2 },
+ { 5, 2, 0, 0, 2, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
+ { 5, 2, 0, 0, 3, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
+ { 28, 10, 0, 0, -1, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 20, 0, 0, 2 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, 743}, {0, 743}, {0, 775} }, 0, 10, 14, 6, 3, 2 },
+ { 25, 10, 0, 0, -1, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 14, 14, 0, 1, 2 },
+ { 5, 2, 0, 0, 1, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
+ { 24, 10, 0, 0, -1, -16, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 3, 13, 1, 2 },
+ { 5, 10, 0, 0, -1, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 32}, {0, 0}, {0, 0}, {0, 32} }, 0, 10, 14, 7, 3, 3 },
+ { 14, 0, 0, 0, -1, 0, 1, 0, 0, { {0, 32}, {0, 0}, {0, 0}, {0, 32} }, 0, 10, 14, 7, 3, 3 },
+ { 26, 10, 0, 0, -1, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 15, 0, 0, 0, -1, 0, 1, 0, 0, { {0, 0}, {1, 418}, {1, 415}, {0, 0} }, 0, 10, 14, 6, 4, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 0, 17, { {0, 0}, {0, -32}, {0, -32}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {0, -32}, {0, -32}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 0, 0, { {0, 0}, {0, -32}, {0, -32}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {0, 121}, {0, 121}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 14, 7, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 0, 17, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 14, 7, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 0, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 14, 0, 0, 0, -1, 0, 1, 0, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 14, 7, 3, 3 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 17, { {1, 421}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 0, 0, { {0, 0}, {0, -232}, {0, -232}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 14, 0, 0, 0, -1, 0, 1, 0, 80, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 14, 7, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 0, 80, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 14, 6, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 0, 80, { {0, 0}, {1, 500}, {1, 500}, {0, 0} }, 0, 10, 14, 6, 3, 3 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 17, { {0, -121}, {0, 0}, {0, 0}, {0, -121} }, 0, 10, 14, 7, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, -300}, {0, -300}, {0, -268} }, 0, 10, 14, 6, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 195}, {0, 195}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 210}, {0, 0}, {0, 0}, {0, 210} }, 0, 10, 14, 7, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 206}, {0, 0}, {0, 0}, {0, 206} }, 0, 10, 14, 7, 3, 3 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 205}, {0, 0}, {0, 0}, {0, 205} }, 0, 10, 14, 7, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 79}, {0, 0}, {0, 0}, {0, 79} }, 0, 10, 14, 7, 3, 3 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 202}, {0, 0}, {0, 0}, {0, 202} }, 0, 10, 14, 7, 3, 3 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 203}, {0, 0}, {0, 0}, {0, 203} }, 0, 10, 14, 7, 3, 3 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 207}, {0, 0}, {0, 0}, {0, 207} }, 0, 10, 14, 7, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 97}, {0, 97}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 211}, {0, 0}, {0, 0}, {0, 211} }, 0, 10, 14, 7, 3, 3 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 209}, {0, 0}, {0, 0}, {0, 209} }, 0, 10, 14, 7, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 163}, {0, 163}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 213}, {0, 0}, {0, 0}, {0, 213} }, 0, 10, 14, 7, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 130}, {0, 130}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 214}, {0, 0}, {0, 0}, {0, 214} }, 0, 10, 14, 7, 3, 3 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 218}, {0, 0}, {0, 0}, {0, 218} }, 0, 10, 14, 7, 3, 3 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 217}, {0, 0}, {0, 0}, {0, 217} }, 0, 10, 14, 7, 3, 3 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 219}, {0, 0}, {0, 0}, {0, 219} }, 0, 10, 14, 7, 3, 3 },
+ { 18, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 56}, {0, 56}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 80, { {0, 2}, {0, 0}, {0, 1}, {0, 2} }, 0, 10, 14, 7, 3, 3 },
+ { 16, 0, 0, 0, -1, 0, 1, 3, 80, { {0, 1}, {0, -1}, {0, 0}, {0, 1} }, 0, 10, 14, 7, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, -2}, {0, -1}, {0, 0} }, 0, 10, 14, 6, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, -79}, {0, -79}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 511}, {1, 511}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {0, -97}, {0, 0}, {0, 0}, {0, -97} }, 0, 10, 14, 7, 3, 3 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {0, -56}, {0, 0}, {0, 0}, {0, -56} }, 0, 10, 14, 7, 3, 3 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 17, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 14, 7, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 4, 3, 17, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 14, 7, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 14, 0, 0, 0, -1, 0, 6, 3, 0, { {0, -130}, {0, 0}, {0, 0}, {0, -130} }, 0, 10, 14, 7, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 14, 0, 0, 0, -1, 0, 8, 3, 0, { {1, 1}, {0, 0}, {0, 0}, {1, 1} }, 0, 10, 14, 7, 3, 3 },
+ { 14, 0, 0, 0, -1, 0, 8, 3, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 14, 7, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 14, 0, 0, 0, -1, 0, 8, 3, 0, { {0, -163}, {0, 0}, {0, 0}, {0, -163} }, 0, 10, 14, 7, 3, 3 },
+ { 14, 0, 0, 0, -1, 0, 8, 3, 0, { {1, 3}, {0, 0}, {0, 0}, {1, 3} }, 0, 10, 14, 7, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {1, 5}, {1, 5}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {1, 7}, {1, 7}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 9, 3, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 14, 0, 0, 0, -1, 0, 9, 3, 0, { {0, -195}, {0, 0}, {0, 0}, {0, -195} }, 0, 10, 14, 7, 3, 3 },
+ { 14, 0, 0, 0, -1, 0, 9, 3, 0, { {0, 69}, {0, 0}, {0, 0}, {0, 69} }, 0, 10, 14, 7, 3, 3 },
+ { 14, 0, 0, 0, -1, 0, 9, 3, 0, { {0, 71}, {0, 0}, {0, 0}, {0, 71} }, 0, 10, 14, 7, 3, 3 },
+ { 14, 0, 0, 0, -1, 0, 9, 3, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 14, 7, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {1, 9}, {1, 9}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 0, 0, { {0, 0}, {1, 11}, {1, 11}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {1, 13}, {1, 13}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, -210}, {0, -210}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, -206}, {0, -206}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, -205}, {0, -205}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, -202}, {0, -202}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, -203}, {0, -203}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {1, 15}, {1, 15}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 0, 0, { {0, 0}, {1, 17}, {1, 17}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, -207}, {0, -207}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {1, 19}, {1, 19}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {1, 21}, {1, 21}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, -209}, {0, -209}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, -211}, {0, -211}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {1, 23}, {1, 23}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {1, 25}, {1, 25}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {1, 27}, {1, 27}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {1, 29}, {1, 29}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, -213}, {0, -213}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, -214}, {0, -214}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {1, 31}, {1, 31}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, -218}, {0, -218}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {1, 33}, {1, 33}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {1, 35}, {1, 35}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, -69}, {0, -69}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, -217}, {0, -217}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, -71}, {0, -71}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, -219}, {0, -219}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {1, 37}, {1, 37}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {1, 39}, {1, 39}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 17, 0, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 3, 3 },
+ { 17, 10, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 2 },
+ { 17, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 2 },
+ { 17, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 1, 2 },
+ { 28, 10, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 0, 1, 2 },
+ { 28, 10, 0, 0, -1, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 0, 1, 2 },
+ { 17, 10, 0, 0, -1, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 2 },
+ { 17, 10, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 20, 8, 1, 2 },
+ { 17, 0, 0, 0, -1, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 2 },
+ { 28, 10, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 28, 10, 0, 0, -1, 0, 4, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 20, 0, 1, 2 },
+ { 28, 10, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 0, 1, 36 },
+ { 17, 10, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 2 },
+ { 28, 10, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 0, 1, 2 },
+ { 17, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 2 },
+ { 28, 10, 0, 0, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 0, 1, 2 },
+ { 0, 17, 230, 5, -1, 0, 1, 0, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 230, 5, -1, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 232, 5, -1, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 220, 5, -1, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 216, 5, -1, 0, 1, 0, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 202, 5, -1, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 220, 5, -1, 0, 1, 0, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 202, 5, -1, 0, 1, 0, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 1, 5, -1, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 1, 5, -1, 0, 1, 0, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 230, 5, -1, 0, 1, 0, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 3, 1 },
+ { 0, 17, 240, 5, -1, 0, 1, 0, 204, { {0, 0}, {0, 84}, {0, 84}, {0, 116} }, 4, 4, 23, 4, 3, 1 },
+ { 0, 17, 230, 5, -1, 0, 4, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 220, 5, -1, 0, 4, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 0, 5, -1, 0, 6, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 6, 4, 2, 1 },
+ { 0, 17, 230, 5, -1, 0, 7, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 220, 5, -1, 0, 7, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 232, 5, -1, 0, 8, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 220, 5, -1, 0, 8, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 230, 5, -1, 0, 8, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 233, 5, -1, 0, 8, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 6, 4, 1, 1 },
+ { 0, 17, 234, 5, -1, 0, 7, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 6, 4, 1, 1 },
+ { 0, 17, 233, 5, -1, 0, 7, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 6, 4, 1, 1 },
+ { 0, 17, 234, 5, -1, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 6, 4, 1, 1 },
+ { 0, 17, 233, 5, -1, 0, 4, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 6, 4, 1, 1 },
+ { 0, 17, 230, 5, -1, 0, 6, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 14, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 14, 7, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 14, 6, 1, 4 },
+ { 17, 10, 0, 0, -1, 0, 1, 3, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 3, 2 },
+ { 28, 10, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 4 },
+ { 13, 0, 0, 0, -1, 0, 0, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 0 },
+ { 17, 0, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 0, 4 },
+ { 15, 0, 0, 0, -1, 0, 9, 3, 0, { {0, 0}, {0, 130}, {0, 130}, {0, 0} }, 0, 10, 14, 6, 1, 4 },
+ { 25, 10, 0, 0, -1, 0, 1, 3, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 15, 10, 0, 0, 2 },
+ { 14, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 116}, {0, 0}, {0, 0}, {0, 116} }, 0, 10, 14, 7, 3, 4 },
+ { 28, 10, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 4 },
+ { 28, 10, 0, 0, -1, 0, 1, 3, 81, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 38}, {0, 0}, {0, 0}, {0, 38} }, 0, 10, 14, 7, 3, 4 },
+ { 25, 10, 0, 0, -1, 0, 1, 3, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 14, 14, 0, 3, 2 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 37}, {0, 0}, {0, 0}, {0, 37} }, 0, 10, 14, 7, 3, 4 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 64}, {0, 0}, {0, 0}, {0, 64} }, 0, 10, 14, 7, 3, 4 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 63}, {0, 0}, {0, 0}, {0, 63} }, 0, 10, 14, 7, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 503}, {1, 503}, {0, 0} }, 0, 10, 14, 6, 1, 4 },
+ { 14, 0, 0, 0, -1, 0, 1, 0, 0, { {0, 32}, {0, 0}, {0, 0}, {0, 32} }, 0, 10, 14, 7, 3, 4 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 32}, {0, 0}, {0, 0}, {0, 32} }, 0, 10, 14, 7, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {0, -38}, {0, -38}, {0, 0} }, 0, 10, 14, 6, 1, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {0, -37}, {0, -37}, {0, 0} }, 0, 10, 14, 6, 1, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 507}, {1, 507}, {0, 0} }, 0, 10, 14, 6, 1, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 0, 0, { {0, 0}, {0, -32}, {0, -32}, {0, 0} }, 0, 10, 14, 6, 1, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, -31}, {0, -31}, {0, 1} }, 0, 10, 14, 6, 4, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {0, -32}, {0, -32}, {0, 0} }, 0, 10, 14, 6, 1, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {0, -64}, {0, -64}, {0, 0} }, 0, 10, 14, 6, 1, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {0, -63}, {0, -63}, {0, 0} }, 0, 10, 14, 6, 1, 4 },
+ { 14, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 8}, {0, 0}, {0, 0}, {0, 8} }, 0, 10, 14, 7, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, -62}, {0, -62}, {0, -30} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, -57}, {0, -57}, {0, -25} }, 0, 10, 14, 6, 3, 4 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 3, 4 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 81, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, -47}, {0, -47}, {0, -15} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, -54}, {0, -54}, {0, -22} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, -8}, {0, -8}, {0, 0} }, 0, 10, 14, 6, 1, 4 },
+ { 14, 0, 0, 0, -1, 0, 6, 3, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 14, 7, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 6, 3, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 14, 6, 1, 4 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 14, 7, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 14, 6, 1, 4 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 14, 7, 3, 46 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 14, 6, 1, 46 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, -86}, {0, -86}, {0, -54} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, -80}, {0, -80}, {0, -48} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, 7}, {0, 7}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, -116}, {0, -116}, {0, 0} }, 0, 10, 14, 6, 1, 4 },
+ { 14, 0, 0, 0, -1, 0, 5, 3, 80, { {0, -60}, {0, 0}, {0, 0}, {0, -60} }, 0, 10, 14, 7, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 5, 3, 80, { {0, 0}, {0, -96}, {0, -96}, {0, -64} }, 0, 10, 14, 6, 3, 4 },
+ { 26, 10, 0, 0, -1, 0, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 4 },
+ { 14, 0, 0, 0, -1, 0, 7, 3, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 14, 7, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 7, 3, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 14, 6, 1, 4 },
+ { 14, 0, 0, 0, -1, 0, 7, 3, 80, { {0, -7}, {0, 0}, {0, 0}, {0, -7} }, 0, 10, 14, 7, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 1, 4 },
+ { 14, 0, 0, 0, -1, 0, 8, 3, 0, { {0, -130}, {0, 0}, {0, 0}, {0, -130} }, 0, 10, 14, 7, 3, 4 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 17, { {0, 80}, {0, 0}, {0, 0}, {0, 80} }, 0, 10, 14, 7, 3, 5 },
+ { 14, 0, 0, 0, -1, 0, 1, 0, 17, { {0, 80}, {0, 0}, {0, 0}, {0, 80} }, 0, 10, 14, 7, 3, 5 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 80}, {0, 0}, {0, 0}, {0, 80} }, 0, 10, 14, 7, 3, 5 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 80}, {0, 0}, {0, 0}, {0, 80} }, 0, 10, 14, 7, 3, 5 },
+ { 14, 0, 0, 0, -1, 0, 1, 0, 0, { {0, 32}, {0, 0}, {0, 0}, {0, 32} }, 0, 10, 14, 7, 3, 5 },
+ { 14, 0, 0, 0, -1, 0, 1, 0, 17, { {0, 32}, {0, 0}, {0, 0}, {0, 32} }, 0, 10, 14, 7, 3, 5 },
+ { 15, 0, 0, 0, -1, 0, 1, 0, 0, { {0, 0}, {0, -32}, {0, -32}, {0, 0} }, 0, 10, 14, 6, 1, 5 },
+ { 15, 0, 0, 0, -1, 0, 1, 0, 17, { {0, 0}, {0, -32}, {0, -32}, {0, 0} }, 0, 10, 14, 6, 1, 5 },
+ { 15, 0, 0, 0, -1, 0, 4, 3, 17, { {0, 0}, {0, -80}, {0, -80}, {0, 0} }, 0, 10, 14, 6, 1, 5 },
+ { 15, 0, 0, 0, -1, 0, 1, 0, 17, { {0, 0}, {0, -80}, {0, -80}, {0, 0} }, 0, 10, 14, 6, 1, 5 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, -80}, {0, -80}, {0, 0} }, 0, 10, 14, 6, 1, 5 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {0, -80}, {0, -80}, {0, 0} }, 0, 10, 14, 6, 1, 5 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 14, 7, 3, 5 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 14, 6, 1, 5 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 14, 7, 3, 5 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 14, 6, 1, 5 },
+ { 29, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 5 },
+ { 0, 17, 230, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 5 },
+ { 0, 17, 230, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 230, 5, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 5 },
+ { 2, 17, 0, 5, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 5 },
+ { 14, 0, 0, 0, -1, 0, 6, 3, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 14, 7, 3, 5 },
+ { 15, 0, 0, 0, -1, 0, 6, 3, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 14, 6, 1, 5 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 14, 7, 3, 5 },
+ { 15, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 14, 6, 1, 5 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 15}, {0, 0}, {0, 0}, {0, 15} }, 0, 10, 14, 7, 0, 5 },
+ { 15, 0, 0, 0, -1, 0, 9, 3, 0, { {0, 0}, {0, -15}, {0, -15}, {0, 0} }, 0, 10, 14, 6, 1, 5 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 17, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 14, 7, 3, 5 },
+ { 15, 0, 0, 0, -1, 0, 4, 3, 17, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 14, 6, 1, 5 },
+ { 14, 0, 0, 0, -1, 0, 8, 3, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 14, 7, 3, 5 },
+ { 15, 0, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 14, 6, 1, 5 },
+ { 14, 0, 0, 0, -1, 0, 9, 3, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 14, 7, 3, 5 },
+ { 15, 0, 0, 0, -1, 0, 9, 3, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 14, 6, 1, 5 },
+ { 14, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 14, 7, 3, 5 },
+ { 15, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 14, 6, 1, 5 },
+ { 14, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 14, 7, 3, 5 },
+ { 15, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 14, 6, 1, 5 },
+ { 14, 0, 0, 0, -1, 0, 12, 3, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 14, 7, 3, 5 },
+ { 15, 0, 0, 0, -1, 0, 12, 3, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 14, 6, 1, 5 },
+ { 14, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 14, 7, 3, 5 },
+ { 15, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 14, 6, 1, 5 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 48}, {0, 0}, {0, 0}, {0, 48} }, 0, 10, 14, 7, 3, 6 },
+ { 17, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 6 },
+ { 25, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 0, 1, 6 },
+ { 25, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 11, 1, 6 },
+ { 25, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 14, 14, 0, 1, 6 },
+ { 15, 0, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 1, 6 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, -48}, {0, -48}, {0, 0} }, 0, 10, 14, 6, 1, 6 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {1, 467}, {1, 464}, {0, 0} }, 0, 10, 14, 6, 3, 6 },
+ { 25, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 15, 10, 12, 1, 6 },
+ { 20, 10, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 19, 0, 1, 6 },
+ { 29, 10, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 6 },
+ { 27, 4, 0, 0, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 11, 0, 1, 6 },
+ { 13, 1, 0, 0, -1, 0, 0, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 0 },
+ { 0, 17, 220, 5, -1, 0, 2, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 7 },
+ { 0, 17, 230, 5, -1, 0, 2, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 7 },
+ { 0, 17, 222, 5, -1, 0, 2, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 7 },
+ { 0, 17, 220, 5, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 7 },
+ { 0, 17, 228, 5, -1, 0, 2, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 7 },
+ { 0, 17, 10, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 7 },
+ { 0, 17, 11, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 7 },
+ { 0, 17, 12, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 7 },
+ { 0, 17, 13, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 7 },
+ { 0, 17, 14, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 7 },
+ { 0, 17, 15, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 7 },
+ { 0, 17, 16, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 7 },
+ { 0, 17, 17, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 7 },
+ { 0, 17, 18, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 7 },
+ { 0, 17, 19, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 7 },
+ { 0, 17, 19, 5, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 7 },
+ { 0, 17, 20, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 7 },
+ { 0, 17, 21, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 7 },
+ { 0, 17, 22, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 7 },
+ { 20, 1, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 7 },
+ { 0, 17, 23, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 7 },
+ { 25, 1, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 7 },
+ { 0, 17, 24, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 7 },
+ { 0, 17, 25, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 7 },
+ { 25, 1, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 8, 0, 1, 7 },
+ { 0, 17, 18, 5, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 7 },
+ { 18, 1, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 9, 15, 8, 1, 7 },
+ { 18, 1, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 9, 15, 8, 1, 7 },
+ { 25, 1, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 7 },
+ { 25, 1, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 14, 14, 0, 1, 7 },
+ { 10, 5, 0, 0, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 7, 16, 13, 9, 0, 8 },
+ { 10, 5, 0, 0, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 7, 16, 13, 9, 0, 8 },
+ { 10, 5, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 7, 16, 13, 9, 0, 2 },
+ { 26, 10, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 8 },
+ { 26, 13, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 8 },
+ { 25, 4, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 8 },
+ { 27, 13, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 8 },
+ { 25, 6, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 15, 10, 11, 1, 2 },
+ { 25, 13, 0, 0, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 15, 10, 11, 1, 8 },
+ { 29, 10, 0, 0, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 8 },
+ { 0, 17, 230, 5, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 8 },
+ { 0, 17, 230, 5, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 8 },
+ { 0, 17, 30, 5, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 8 },
+ { 0, 17, 31, 5, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 8 },
+ { 0, 17, 32, 5, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 8 },
+ { 25, 13, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 8, 0, 1, 2 },
+ { 10, 13, 0, 5, -1, 0, 15, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 23, 4, 0, 8 },
+ { 25, 13, 0, 0, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 8, 12, 1, 8 },
+ { 25, 13, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 8, 12, 1, 8 },
+ { 25, 13, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 8, 12, 1, 2 },
+ { 18, 13, 0, 2, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 8 },
+ { 18, 13, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 8 },
+ { 18, 13, 0, 3, -1, 0, 1, 3, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 8 },
+ { 18, 13, 0, 2, -1, 0, 1, 3, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 8 },
+ { 18, 13, 0, 3, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 8 },
+ { 18, 13, 0, 2, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 8 },
+ { 18, 13, 0, 2, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 8 },
+ { 17, 13, 0, 1, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 2 },
+ { 0, 17, 27, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 28, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 29, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 30, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 31, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 32, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 33, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 34, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 230, 5, -1, 0, 4, 3, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 220, 5, -1, 0, 4, 3, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 220, 5, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 8 },
+ { 0, 17, 230, 5, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 8 },
+ { 0, 17, 220, 5, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 8 },
+ { 0, 17, 220, 5, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 8 },
+ { 3, 5, 0, 0, 0, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 8 },
+ { 3, 5, 0, 0, 1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 8 },
+ { 3, 5, 0, 0, 2, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 8 },
+ { 3, 5, 0, 0, 3, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 8 },
+ { 3, 5, 0, 0, 4, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 8 },
+ { 3, 5, 0, 0, 5, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 8 },
+ { 3, 5, 0, 0, 6, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 8 },
+ { 3, 5, 0, 0, 7, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 8 },
+ { 3, 5, 0, 0, 8, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 8 },
+ { 3, 5, 0, 0, 9, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 8 },
+ { 25, 4, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 8 },
+ { 25, 5, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 8 },
+ { 25, 5, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 15, 13, 9, 1, 8 },
+ { 25, 13, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 8 },
+ { 18, 13, 0, 2, -1, 0, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 8 },
+ { 0, 17, 35, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 18, 13, 0, 3, -1, 0, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 3, 8 },
+ { 18, 13, 0, 2, -1, 0, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 3, 8 },
+ { 18, 13, 0, 2, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 8 },
+ { 18, 13, 0, 3, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 8 },
+ { 25, 13, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 8, 12, 1, 8 },
+ { 0, 17, 230, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 8 },
+ { 10, 5, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 7, 16, 13, 9, 0, 2 },
+ { 29, 10, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 8 },
+ { 0, 17, 220, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 8 },
+ { 17, 13, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 8 },
+ { 18, 13, 0, 3, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 8 },
+ { 3, 2, 0, 0, 0, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 8 },
+ { 3, 2, 0, 0, 1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 8 },
+ { 3, 2, 0, 0, 2, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 8 },
+ { 3, 2, 0, 0, 3, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 8 },
+ { 3, 2, 0, 0, 4, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 8 },
+ { 3, 2, 0, 0, 5, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 8 },
+ { 3, 2, 0, 0, 6, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 8 },
+ { 3, 2, 0, 0, 7, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 8 },
+ { 3, 2, 0, 0, 8, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 8 },
+ { 3, 2, 0, 0, 9, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 8 },
+ { 29, 13, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 8 },
+ { 18, 13, 0, 2, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 8 },
+ { 25, 13, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 12, 1, 9 },
+ { 25, 13, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 9 },
+ { 13, 13, 0, 0, -1, 0, 0, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 0 },
+ { 10, 13, 0, 5, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 7, 10, 14, 4, 0, 9 },
+ { 18, 13, 0, 3, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 9 },
+ { 0, 17, 36, 5, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 9 },
+ { 18, 13, 0, 2, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 9 },
+ { 18, 13, 0, 2, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 9 },
+ { 18, 13, 0, 3, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 9 },
+ { 0, 17, 230, 5, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 9 },
+ { 0, 17, 220, 5, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 9 },
+ { 18, 13, 0, 2, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 8 },
+ { 18, 13, 0, 3, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 8 },
+ { 18, 13, 0, 3, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 8 },
+ { 18, 13, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 10 },
+ { 0, 17, 0, 5, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 10 },
+ { 18, 13, 0, 0, -1, 0, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 10 },
+ { 3, 1, 0, 0, 0, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 66 },
+ { 3, 1, 0, 0, 1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 66 },
+ { 3, 1, 0, 0, 2, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 66 },
+ { 3, 1, 0, 0, 3, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 66 },
+ { 3, 1, 0, 0, 4, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 66 },
+ { 3, 1, 0, 0, 5, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 66 },
+ { 3, 1, 0, 0, 6, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 66 },
+ { 3, 1, 0, 0, 7, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 66 },
+ { 3, 1, 0, 0, 8, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 66 },
+ { 3, 1, 0, 0, 9, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 66 },
+ { 18, 1, 0, 2, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 66 },
+ { 0, 17, 230, 5, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 66 },
+ { 0, 17, 220, 5, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 66 },
+ { 17, 1, 0, 0, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 66 },
+ { 29, 10, 0, 0, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 66 },
+ { 25, 10, 0, 0, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 66 },
+ { 25, 10, 0, 0, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 15, 10, 11, 1, 66 },
+ { 25, 10, 0, 0, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 8, 12, 1, 66 },
+ { 17, 1, 0, 1, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 66 },
+ { 0, 17, 220, 5, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 66 },
+ { 27, 1, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 11, 0, 1, 66 },
+ { 18, 1, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 82 },
+ { 0, 17, 230, 5, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 82 },
+ { 17, 1, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 82 },
+ { 25, 1, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 82 },
+ { 25, 1, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 12, 1, 82 },
+ { 18, 1, 0, 3, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 95 },
+ { 18, 1, 0, 2, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 95 },
+ { 0, 17, 220, 5, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 95 },
+ { 25, 1, 0, 0, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 95 },
+ { 18, 13, 0, 2, -1, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 9 },
+ { 18, 13, 0, 0, -1, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 9 },
+ { 18, 13, 0, 3, -1, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 9 },
+ { 18, 13, 0, 3, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 8 },
+ { 18, 13, 0, 1, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 8 },
+ { 18, 13, 0, 2, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 8 },
+ { 18, 13, 0, 0, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 8 },
+ { 28, 13, 0, 0, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 8 },
+ { 10, 5, 0, 0, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 7, 16, 13, 9, 0, 8 },
+ { 0, 17, 230, 5, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 8 },
+ { 0, 17, 220, 5, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 8 },
+ { 18, 13, 0, 2, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 8 },
+ { 18, 13, 0, 2, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 8 },
+ { 18, 13, 0, 3, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 8 },
+ { 18, 13, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 8 },
+ { 18, 13, 0, 3, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 8 },
+ { 18, 13, 0, 2, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 8 },
+ { 18, 13, 0, 2, -1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 8 },
+ { 18, 13, 0, 3, -1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 8 },
+ { 18, 13, 0, 2, -1, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 8 },
+ { 17, 13, 0, 0, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 8 },
+ { 0, 17, 220, 5, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 8 },
+ { 0, 17, 230, 5, -1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 8 },
+ { 10, 5, 0, 0, -1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 7, 16, 13, 9, 0, 2 },
+ { 0, 17, 220, 5, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 8 },
+ { 0, 17, 230, 5, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 8 },
+ { 0, 17, 220, 5, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 8 },
+ { 0, 17, 27, 5, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 8 },
+ { 0, 17, 28, 5, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 8 },
+ { 0, 17, 29, 5, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 8 },
+ { 0, 17, 230, 5, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 8 },
+ { 0, 17, 0, 5, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 11 },
+ { 0, 17, 0, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 11 },
+ { 1, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 11 },
+ { 18, 0, 0, 0, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 11 },
+ { 18, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 11 },
+ { 18, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 11 },
+ { 0, 17, 0, 5, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 11 },
+ { 1, 0, 0, 0, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 11 },
+ { 0, 17, 7, 5, -1, 0, 1, 3, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 11 },
+ { 0, 17, 9, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 11 },
+ { 1, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 11 },
+ { 0, 17, 220, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 18, 0, 0, 0, -1, 0, 1, 3, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 3, 11 },
+ { 25, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 2 },
+ { 3, 0, 0, 0, 0, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 11 },
+ { 3, 0, 0, 0, 1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 11 },
+ { 3, 0, 0, 0, 2, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 11 },
+ { 3, 0, 0, 0, 3, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 11 },
+ { 3, 0, 0, 0, 4, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 11 },
+ { 3, 0, 0, 0, 5, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 11 },
+ { 3, 0, 0, 0, 6, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 11 },
+ { 3, 0, 0, 0, 7, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 11 },
+ { 3, 0, 0, 0, 8, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 11 },
+ { 3, 0, 0, 0, 9, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 11 },
+ { 25, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 11 },
+ { 17, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 11 },
+ { 18, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 11 },
+ { 18, 0, 0, 0, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 11 },
+ { 18, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 11 },
+ { 18, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 11 },
+ { 18, 0, 0, 0, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 11 },
+ { 18, 0, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 11 },
+ { 18, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 12 },
+ { 0, 17, 0, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 12 },
+ { 1, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 12 },
+ { 18, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 12 },
+ { 0, 17, 7, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 12 },
+ { 18, 0, 0, 0, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 12 },
+ { 1, 0, 0, 0, -1, 0, 1, 3, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 12 },
+ { 1, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 12 },
+ { 0, 17, 9, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 12 },
+ { 18, 0, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 12 },
+ { 18, 0, 0, 0, -1, 0, 1, 3, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 3, 12 },
+ { 3, 0, 0, 0, 0, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 12 },
+ { 3, 0, 0, 0, 1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 12 },
+ { 3, 0, 0, 0, 2, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 12 },
+ { 3, 0, 0, 0, 3, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 12 },
+ { 3, 0, 0, 0, 4, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 12 },
+ { 3, 0, 0, 0, 5, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 12 },
+ { 3, 0, 0, 0, 6, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 12 },
+ { 3, 0, 0, 0, 7, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 12 },
+ { 3, 0, 0, 0, 8, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 12 },
+ { 3, 0, 0, 0, 9, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 12 },
+ { 27, 4, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 12 },
+ { 5, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 12 },
+ { 5, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 12 },
+ { 29, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 12 },
+ { 27, 4, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 11, 0, 1, 12 },
+ { 18, 0, 0, 0, -1, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 12 },
+ { 25, 0, 0, 0, -1, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 12 },
+ { 0, 17, 230, 5, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 12 },
+ { 0, 17, 0, 5, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 13 },
+ { 0, 17, 0, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 13 },
+ { 1, 0, 0, 0, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 13 },
+ { 18, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 13 },
+ { 18, 0, 0, 0, -1, 0, 1, 3, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 3, 13 },
+ { 0, 17, 7, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 13 },
+ { 1, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 13 },
+ { 0, 17, 9, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 13 },
+ { 0, 17, 0, 5, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 13 },
+ { 3, 0, 0, 0, 0, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 13 },
+ { 3, 0, 0, 0, 1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 13 },
+ { 3, 0, 0, 0, 2, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 13 },
+ { 3, 0, 0, 0, 3, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 13 },
+ { 3, 0, 0, 0, 4, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 13 },
+ { 3, 0, 0, 0, 5, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 13 },
+ { 3, 0, 0, 0, 6, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 13 },
+ { 3, 0, 0, 0, 7, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 13 },
+ { 3, 0, 0, 0, 8, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 13 },
+ { 3, 0, 0, 0, 9, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 13 },
+ { 25, 0, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 13 },
+ { 0, 17, 0, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 14 },
+ { 1, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 14 },
+ { 18, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 14 },
+ { 18, 0, 0, 0, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 14 },
+ { 0, 17, 7, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 14 },
+ { 0, 17, 9, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 14 },
+ { 0, 17, 0, 5, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 14 },
+ { 3, 0, 0, 0, 0, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 14 },
+ { 3, 0, 0, 0, 1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 14 },
+ { 3, 0, 0, 0, 2, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 14 },
+ { 3, 0, 0, 0, 3, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 14 },
+ { 3, 0, 0, 0, 4, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 14 },
+ { 3, 0, 0, 0, 5, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 14 },
+ { 3, 0, 0, 0, 6, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 14 },
+ { 3, 0, 0, 0, 7, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 14 },
+ { 3, 0, 0, 0, 8, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 14 },
+ { 3, 0, 0, 0, 9, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 14 },
+ { 25, 0, 0, 0, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 14 },
+ { 27, 4, 0, 0, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 11, 0, 1, 14 },
+ { 18, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 14 },
+ { 0, 17, 0, 5, -1, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 14 },
+ { 0, 17, 0, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 15 },
+ { 1, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 15 },
+ { 18, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 15 },
+ { 18, 0, 0, 0, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 15 },
+ { 0, 17, 7, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 15 },
+ { 1, 0, 0, 0, -1, 0, 1, 3, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 15 },
+ { 0, 17, 0, 5, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 15 },
+ { 1, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 15 },
+ { 0, 17, 9, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 15 },
+ { 0, 17, 0, 5, -1, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 15 },
+ { 0, 17, 0, 5, -1, 0, 1, 3, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 15 },
+ { 18, 0, 0, 0, -1, 0, 1, 3, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 3, 15 },
+ { 3, 0, 0, 0, 0, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 15 },
+ { 3, 0, 0, 0, 1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 15 },
+ { 3, 0, 0, 0, 2, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 15 },
+ { 3, 0, 0, 0, 3, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 15 },
+ { 3, 0, 0, 0, 4, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 15 },
+ { 3, 0, 0, 0, 5, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 15 },
+ { 3, 0, 0, 0, 6, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 15 },
+ { 3, 0, 0, 0, 7, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 15 },
+ { 3, 0, 0, 0, 8, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 15 },
+ { 3, 0, 0, 0, 9, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 15 },
+ { 29, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 15 },
+ { 5, 0, 0, 0, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 15 },
+ { 0, 17, 0, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 16 },
+ { 18, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 16 },
+ { 18, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 16 },
+ { 18, 0, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 16 },
+ { 1, 0, 0, 0, -1, 0, 1, 3, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 16 },
+ { 1, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 16 },
+ { 1, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 16 },
+ { 0, 17, 9, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 16 },
+ { 18, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 16 },
+ { 3, 0, 0, 0, 0, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 16 },
+ { 3, 0, 0, 0, 1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 16 },
+ { 3, 0, 0, 0, 2, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 16 },
+ { 3, 0, 0, 0, 3, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 16 },
+ { 3, 0, 0, 0, 4, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 16 },
+ { 3, 0, 0, 0, 5, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 16 },
+ { 3, 0, 0, 0, 6, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 16 },
+ { 3, 0, 0, 0, 7, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 16 },
+ { 3, 0, 0, 0, 8, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 16 },
+ { 3, 0, 0, 0, 9, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 16 },
+ { 5, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 16 },
+ { 29, 10, 0, 0, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 16 },
+ { 27, 4, 0, 0, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 11, 0, 1, 16 },
+ { 0, 17, 0, 5, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 17 },
+ { 1, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 17 },
+ { 0, 17, 0, 5, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 17 },
+ { 18, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 17 },
+ { 18, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 17 },
+ { 0, 17, 7, 5, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 17 },
+ { 18, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 17 },
+ { 0, 17, 0, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 17 },
+ { 0, 17, 0, 5, -1, 0, 1, 3, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 17 },
+ { 0, 17, 9, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 17 },
+ { 0, 17, 84, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 17 },
+ { 0, 17, 91, 5, -1, 0, 1, 3, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 17 },
+ { 18, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 17 },
+ { 18, 0, 0, 0, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 17 },
+ { 0, 17, 0, 5, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 17 },
+ { 3, 0, 0, 0, 0, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 17 },
+ { 3, 0, 0, 0, 1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 17 },
+ { 3, 0, 0, 0, 2, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 17 },
+ { 3, 0, 0, 0, 3, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 17 },
+ { 3, 0, 0, 0, 4, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 17 },
+ { 3, 0, 0, 0, 5, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 17 },
+ { 3, 0, 0, 0, 6, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 17 },
+ { 3, 0, 0, 0, 7, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 17 },
+ { 3, 0, 0, 0, 8, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 17 },
+ { 3, 0, 0, 0, 9, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 17 },
+ { 25, 0, 0, 0, -1, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 20, 0, 1, 17 },
+ { 5, 10, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 17 },
+ { 29, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 17 },
+ { 18, 0, 0, 0, -1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 18 },
+ { 0, 17, 0, 5, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 18 },
+ { 1, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 18 },
+ { 25, 0, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 20, 0, 1, 18 },
+ { 18, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 18 },
+ { 0, 17, 7, 5, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 18 },
+ { 18, 0, 0, 0, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 18 },
+ { 0, 0, 0, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 18 },
+ { 1, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 18 },
+ { 1, 0, 0, 0, -1, 0, 1, 3, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 18 },
+ { 0, 17, 0, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 18 },
+ { 0, 17, 9, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 18 },
+ { 18, 0, 0, 0, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 18 },
+ { 0, 17, 0, 5, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 18 },
+ { 3, 0, 0, 0, 0, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 18 },
+ { 3, 0, 0, 0, 1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 18 },
+ { 3, 0, 0, 0, 2, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 18 },
+ { 3, 0, 0, 0, 3, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 18 },
+ { 3, 0, 0, 0, 4, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 18 },
+ { 3, 0, 0, 0, 5, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 18 },
+ { 3, 0, 0, 0, 6, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 18 },
+ { 3, 0, 0, 0, 7, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 18 },
+ { 3, 0, 0, 0, 8, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 18 },
+ { 3, 0, 0, 0, 9, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 18 },
+ { 18, 0, 0, 0, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 18 },
+ { 1, 0, 0, 0, -1, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 18 },
+ { 0, 17, 0, 5, -1, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 19 },
+ { 0, 17, 0, 5, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 19 },
+ { 1, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 19 },
+ { 18, 0, 0, 0, -1, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 19 },
+ { 18, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 19 },
+ { 18, 0, 0, 0, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 19 },
+ { 0, 17, 9, 5, -1, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 19 },
+ { 18, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 19 },
+ { 1, 0, 0, 0, -1, 0, 1, 3, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 19 },
+ { 0, 17, 0, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 19 },
+ { 0, 17, 0, 5, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 19 },
+ { 1, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 19 },
+ { 0, 17, 9, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 19 },
+ { 18, 0, 0, 0, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 7, 10, 14, 8, 1, 19 },
+ { 29, 0, 0, 0, -1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 19 },
+ { 18, 0, 0, 0, -1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 19 },
+ { 5, 0, 0, 0, -1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 19 },
+ { 18, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 19 },
+ { 3, 0, 0, 0, 0, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 19 },
+ { 3, 0, 0, 0, 1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 19 },
+ { 3, 0, 0, 0, 2, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 19 },
+ { 3, 0, 0, 0, 3, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 19 },
+ { 3, 0, 0, 0, 4, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 19 },
+ { 3, 0, 0, 0, 5, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 19 },
+ { 3, 0, 0, 0, 6, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 19 },
+ { 3, 0, 0, 0, 7, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 19 },
+ { 3, 0, 0, 0, 8, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 19 },
+ { 3, 0, 0, 0, 9, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 19 },
+ { 5, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 19 },
+ { 29, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 19 },
+ { 0, 17, 0, 5, -1, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 20 },
+ { 1, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 20 },
+ { 18, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 20 },
+ { 0, 17, 9, 5, -1, 0, 4, 3, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 20 },
+ { 1, 0, 0, 0, -1, 0, 4, 3, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 20 },
+ { 0, 17, 0, 5, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 20 },
+ { 1, 0, 0, 0, -1, 0, 4, 3, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 20 },
+ { 3, 0, 0, 0, 0, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 20 },
+ { 3, 0, 0, 0, 1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 20 },
+ { 3, 0, 0, 0, 2, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 20 },
+ { 3, 0, 0, 0, 3, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 20 },
+ { 3, 0, 0, 0, 4, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 20 },
+ { 3, 0, 0, 0, 5, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 20 },
+ { 3, 0, 0, 0, 6, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 20 },
+ { 3, 0, 0, 0, 7, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 20 },
+ { 3, 0, 0, 0, 8, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 20 },
+ { 3, 0, 0, 0, 9, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 20 },
+ { 25, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 20 },
+ { 18, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 35, 8, 1, 21 },
+ { 0, 17, 0, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 35, 4, 1, 21 },
+ { 18, 0, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 0, 35, 8, 3, 21 },
+ { 0, 17, 103, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 35, 4, 1, 21 },
+ { 0, 17, 9, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 35, 4, 1, 21 },
+ { 27, 4, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 11, 0, 1, 2 },
+ { 17, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 35, 8, 1, 21 },
+ { 0, 17, 107, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 35, 4, 1, 21 },
+ { 25, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 21 },
+ { 3, 0, 0, 0, 0, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 21 },
+ { 3, 0, 0, 0, 1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 21 },
+ { 3, 0, 0, 0, 2, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 21 },
+ { 3, 0, 0, 0, 3, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 21 },
+ { 3, 0, 0, 0, 4, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 21 },
+ { 3, 0, 0, 0, 5, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 21 },
+ { 3, 0, 0, 0, 6, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 21 },
+ { 3, 0, 0, 0, 7, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 21 },
+ { 3, 0, 0, 0, 8, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 21 },
+ { 3, 0, 0, 0, 9, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 21 },
+ { 25, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 21 },
+ { 18, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 35, 8, 1, 22 },
+ { 18, 0, 0, 0, -1, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 35, 8, 1, 22 },
+ { 0, 17, 0, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 35, 4, 1, 22 },
+ { 18, 0, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 0, 35, 8, 3, 22 },
+ { 0, 17, 118, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 35, 4, 1, 22 },
+ { 0, 17, 9, 5, -1, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 35, 4, 1, 22 },
+ { 17, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 35, 8, 1, 22 },
+ { 0, 17, 122, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 35, 4, 1, 22 },
+ { 0, 17, 0, 5, -1, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 35, 4, 1, 22 },
+ { 3, 0, 0, 0, 0, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 22 },
+ { 3, 0, 0, 0, 1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 22 },
+ { 3, 0, 0, 0, 2, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 22 },
+ { 3, 0, 0, 0, 3, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 22 },
+ { 3, 0, 0, 0, 4, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 22 },
+ { 3, 0, 0, 0, 5, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 22 },
+ { 3, 0, 0, 0, 6, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 22 },
+ { 3, 0, 0, 0, 7, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 22 },
+ { 3, 0, 0, 0, 8, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 22 },
+ { 3, 0, 0, 0, 9, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 22 },
+ { 18, 0, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 35, 8, 3, 22 },
+ { 18, 0, 0, 0, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 35, 8, 1, 22 },
+ { 18, 0, 0, 0, -1, 0, 2, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 23 },
+ { 29, 0, 0, 0, -1, 0, 2, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 20, 0, 1, 23 },
+ { 25, 0, 0, 0, -1, 0, 2, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 20, 0, 1, 23 },
+ { 25, 0, 0, 0, -1, 0, 2, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 23 },
+ { 25, 0, 0, 0, -1, 0, 2, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 6, 0, 1, 23 },
+ { 25, 0, 0, 0, -1, 0, 2, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 23 },
+ { 25, 0, 0, 0, -1, 0, 2, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 6, 0, 3, 23 },
+ { 25, 0, 0, 0, -1, 0, 2, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 8, 0, 1, 23 },
+ { 29, 0, 0, 0, -1, 0, 2, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 23 },
+ { 0, 17, 220, 5, -1, 0, 2, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 23 },
+ { 3, 0, 0, 0, 0, 0, 2, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 23 },
+ { 3, 0, 0, 0, 1, 0, 2, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 23 },
+ { 3, 0, 0, 0, 2, 0, 2, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 23 },
+ { 3, 0, 0, 0, 3, 0, 2, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 23 },
+ { 3, 0, 0, 0, 4, 0, 2, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 23 },
+ { 3, 0, 0, 0, 5, 0, 2, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 23 },
+ { 3, 0, 0, 0, 6, 0, 2, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 23 },
+ { 3, 0, 0, 0, 7, 0, 2, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 23 },
+ { 3, 0, 0, 0, 8, 0, 2, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 23 },
+ { 3, 0, 0, 0, 9, 0, 2, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 23 },
+ { 5, 0, 0, 0, -1, 0, 2, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 23 },
+ { 29, 0, 0, 0, -1, 0, 2, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 23 },
+ { 0, 17, 216, 5, -1, 0, 2, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 23 },
+ { 21, 10, 0, 0, -1, 1, 2, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 1, 23 },
+ { 22, 10, 0, 0, -1, -1, 2, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 1, 23 },
+ { 1, 0, 0, 0, -1, 0, 2, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 23 },
+ { 18, 0, 0, 0, -1, 0, 2, 3, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 3, 23 },
+ { 18, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 23 },
+ { 18, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 23 },
+ { 0, 17, 129, 5, -1, 0, 2, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 23 },
+ { 0, 17, 130, 5, -1, 0, 2, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 23 },
+ { 0, 17, 0, 5, -1, 0, 2, 3, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 3, 23 },
+ { 0, 17, 132, 5, -1, 0, 2, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 23 },
+ { 0, 17, 0, 5, -1, 0, 2, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 3, 23 },
+ { 0, 17, 0, 5, -1, 0, 2, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 23 },
+ { 1, 0, 0, 0, -1, 0, 2, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 19, 4, 1, 23 },
+ { 0, 17, 230, 5, -1, 0, 2, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 23 },
+ { 0, 17, 9, 5, -1, 0, 2, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 23 },
+ { 18, 0, 0, 0, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 23 },
+ { 0, 17, 0, 5, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 23 },
+ { 0, 17, 0, 5, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 23 },
+ { 29, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 23 },
+ { 29, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 23 },
+ { 0, 17, 220, 5, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 23 },
+ { 29, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 23 },
+ { 25, 0, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 20, 0, 1, 23 },
+ { 25, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 23 },
+ { 25, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 20, 0, 1, 23 },
+ { 25, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 23 },
+ { 29, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 25, 0, 0, 0, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 6, 0, 1, 23 },
+ { 18, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 35, 8, 1, 24 },
+ { 18, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 35, 8, 1, 24 },
+ { 18, 0, 0, 0, -1, 0, 4, 3, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 35, 8, 1, 24 },
+ { 1, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 4, 35, 4, 1, 24 },
+ { 1, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 4, 35, 4, 1, 24 },
+ { 0, 17, 0, 5, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 35, 4, 1, 24 },
+ { 0, 17, 0, 5, -1, 0, 4, 3, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 35, 4, 1, 24 },
+ { 1, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 35, 4, 1, 24 },
+ { 0, 17, 0, 5, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 35, 4, 1, 24 },
+ { 0, 17, 7, 5, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 35, 4, 1, 24 },
+ { 0, 17, 9, 5, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 35, 4, 1, 24 },
+ { 0, 17, 9, 5, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 35, 4, 1, 24 },
+ { 1, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 35, 4, 1, 24 },
+ { 3, 0, 0, 0, 0, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 24 },
+ { 3, 0, 0, 0, 1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 24 },
+ { 3, 0, 0, 0, 2, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 24 },
+ { 3, 0, 0, 0, 3, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 24 },
+ { 3, 0, 0, 0, 4, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 24 },
+ { 3, 0, 0, 0, 5, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 24 },
+ { 3, 0, 0, 0, 6, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 24 },
+ { 3, 0, 0, 0, 7, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 24 },
+ { 3, 0, 0, 0, 8, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 24 },
+ { 3, 0, 0, 0, 9, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 24 },
+ { 25, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 24 },
+ { 25, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 24 },
+ { 0, 17, 220, 5, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 35, 4, 1, 24 },
+ { 3, 0, 0, 0, 0, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 24 },
+ { 3, 0, 0, 0, 1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 24 },
+ { 3, 0, 0, 0, 2, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 24 },
+ { 3, 0, 0, 0, 3, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 24 },
+ { 3, 0, 0, 0, 4, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 24 },
+ { 3, 0, 0, 0, 5, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 24 },
+ { 3, 0, 0, 0, 6, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 24 },
+ { 3, 0, 0, 0, 7, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 24 },
+ { 3, 0, 0, 0, 8, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 24 },
+ { 3, 0, 0, 0, 9, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 24 },
+ { 1, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 4, 35, 4, 1, 24 },
+ { 0, 17, 0, 5, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 35, 4, 1, 24 },
+ { 29, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 35, 0, 1, 24 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 7264}, {0, 0}, {0, 0}, {0, 7264} }, 0, 10, 14, 7, 0, 25 },
+ { 14, 0, 0, 0, -1, 0, 13, 3, 0, { {0, 7264}, {0, 0}, {0, 0}, {0, 7264} }, 0, 10, 14, 7, 3, 25 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 3008}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 25 },
+ { 15, 0, 0, 0, -1, 0, 6, 3, 0, { {0, 0}, {0, 3008}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 25 },
+ { 15, 0, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 3008}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 25 },
+ { 25, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 17, 0, 0, 0, -1, 0, 8, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 3, 25 },
+ { 15, 0, 0, 0, -1, 0, 13, 3, 0, { {0, 0}, {0, 3008}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 25 },
+ { 18, 0, 0, 0, -1, 0, 1, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 9, 10, 27, 8, 1, 26 },
+ { 18, 0, 0, 0, -1, 0, 11, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 9, 10, 27, 8, 1, 26 },
+ { 18, 0, 0, 0, -1, 0, 1, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 9, 10, 27, 8, 0, 26 },
+ { 18, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 10, 10, 28, 8, 0, 26 },
+ { 18, 0, 0, 0, -1, 0, 1, 3, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 10, 10, 28, 8, 1, 26 },
+ { 18, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 10, 10, 28, 8, 1, 26 },
+ { 18, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 10, 10, 28, 8, 1, 26 },
+ { 18, 0, 0, 0, -1, 0, 1, 3, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 11, 10, 29, 8, 1, 26 },
+ { 18, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 11, 10, 29, 8, 1, 26 },
+ { 18, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 11, 10, 29, 8, 1, 26 },
+ { 18, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 27 },
+ { 18, 0, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 27 },
+ { 0, 17, 230, 5, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 27 },
+ { 0, 17, 230, 5, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 27 },
+ { 25, 0, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 27 },
+ { 25, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 27 },
+ { 25, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 12, 1, 27 },
+ { 25, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 27 },
+ { 5, 0, 0, 0, 1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 27 },
+ { 5, 0, 0, 0, 2, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 27 },
+ { 5, 0, 0, 0, 3, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 27 },
+ { 5, 0, 0, 0, 4, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 27 },
+ { 5, 0, 0, 0, 5, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 27 },
+ { 5, 0, 0, 0, 6, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 27 },
+ { 5, 0, 0, 0, 7, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 27 },
+ { 5, 0, 0, 0, 8, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 27 },
+ { 5, 0, 0, 0, 9, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 27 },
+ { 5, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 27 },
+ { 29, 10, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 27 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 41}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 43}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 45}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 47}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 49}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 51}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 53}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 55}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 57}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 59}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 61}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 63}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 65}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 67}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 69}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 71}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 73}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 75}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 77}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 79}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 81}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 83}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 85}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 87}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 89}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 91}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 93}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 95}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 97}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 99}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 101}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 103}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 105}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 107}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 109}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 111}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 113}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 115}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 117}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 119}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 121}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 123}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 125}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 127}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 129}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 131}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 133}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 135}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 137}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 139}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 141}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 143}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 145}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 147}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 149}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 151}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 153}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 155}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 157}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 159}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 161}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 163}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 165}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 167}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 169}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 171}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 173}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 175}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 177}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 179}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 181}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 183}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 185}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 187}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 189}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 191}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 193}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 195}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 197}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {1, 199}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 8}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 14, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 8}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {0, -8}, {0, -8}, {0, -8} }, 0, 10, 14, 6, 3, 28 },
+ { 20, 10, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 29 },
+ { 18, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 29 },
+ { 29, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 29 },
+ { 25, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 12, 1, 29 },
+ { 18, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 29 },
+ { 6, 9, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 18, 19, 5, 0, 30 },
+ { 18, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 30 },
+ { 21, 10, 0, 0, -1, 1, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 1, 30 },
+ { 22, 10, 0, 0, -1, -1, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 1, 30 },
+ { 18, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 31 },
+ { 25, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 2 },
+ { 4, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 31 },
+ { 18, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 31 },
+ { 18, 0, 0, 0, -1, 0, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 42 },
+ { 18, 0, 0, 0, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 42 },
+ { 0, 17, 0, 5, -1, 0, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 42 },
+ { 0, 17, 9, 5, -1, 0, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 42 },
+ { 1, 0, 9, 0, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 42 },
+ { 18, 0, 0, 0, -1, 0, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 43 },
+ { 0, 17, 0, 5, -1, 0, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 43 },
+ { 1, 0, 9, 0, -1, 0, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 43 },
+ { 25, 0, 0, 0, -1, 0, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 2 },
+ { 18, 0, 0, 0, -1, 0, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 44 },
+ { 0, 17, 0, 5, -1, 0, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 44 },
+ { 18, 0, 0, 0, -1, 0, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 45 },
+ { 0, 17, 0, 5, -1, 0, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 45 },
+ { 18, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 35, 8, 1, 32 },
+ { 0, 17, 0, 5, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 35, 4, 0, 32 },
+ { 1, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 35, 4, 1, 32 },
+ { 0, 17, 0, 5, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 35, 4, 1, 32 },
+ { 0, 17, 9, 5, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 35, 4, 1, 32 },
+ { 25, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 32 },
+ { 25, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 7, 0, 1, 32 },
+ { 17, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 35, 8, 1, 32 },
+ { 25, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 32 },
+ { 25, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 32 },
+ { 27, 4, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 11, 0, 1, 32 },
+ { 0, 17, 230, 5, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 35, 4, 1, 32 },
+ { 3, 0, 0, 0, 0, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 32 },
+ { 3, 0, 0, 0, 1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 32 },
+ { 3, 0, 0, 0, 2, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 32 },
+ { 3, 0, 0, 0, 3, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 32 },
+ { 3, 0, 0, 0, 4, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 32 },
+ { 3, 0, 0, 0, 5, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 32 },
+ { 3, 0, 0, 0, 6, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 32 },
+ { 3, 0, 0, 0, 7, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 32 },
+ { 3, 0, 0, 0, 8, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 32 },
+ { 3, 0, 0, 0, 9, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 32 },
+ { 5, 10, 0, 0, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 32 },
+ { 25, 10, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 33 },
+ { 25, 10, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 8, 11, 1, 2 },
+ { 25, 10, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 8, 12, 1, 2 },
+ { 25, 10, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 33 },
+ { 25, 10, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 2 },
+ { 20, 10, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 20, 0, 0, 33 },
+ { 25, 10, 0, 2, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 33 },
+ { 25, 10, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 8, 11, 1, 33 },
+ { 25, 10, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 8, 12, 1, 33 },
+ { 25, 10, 0, 1, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 33 },
+ { 0, 17, 0, 5, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 2, 33 },
+ { 10, 18, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 6, 4, 0, 33 },
+ { 0, 17, 0, 5, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 2, 33 },
+ { 3, 0, 0, 0, 0, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 33 },
+ { 3, 0, 0, 0, 1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 33 },
+ { 3, 0, 0, 0, 2, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 33 },
+ { 3, 0, 0, 0, 3, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 33 },
+ { 3, 0, 0, 0, 4, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 33 },
+ { 3, 0, 0, 0, 5, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 33 },
+ { 3, 0, 0, 0, 6, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 33 },
+ { 3, 0, 0, 0, 7, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 33 },
+ { 3, 0, 0, 0, 8, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 33 },
+ { 3, 0, 0, 0, 9, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 33 },
+ { 18, 0, 0, 2, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 33 },
+ { 17, 0, 0, 2, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 33 },
+ { 18, 0, 0, 2, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 33 },
+ { 18, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 33 },
+ { 0, 17, 0, 5, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 33 },
+ { 0, 17, 228, 5, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 33 },
+ { 18, 0, 0, 2, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 33 },
+ { 18, 0, 0, 0, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 47 },
+ { 18, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 47 },
+ { 0, 17, 0, 5, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 47 },
+ { 1, 0, 0, 0, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 47 },
+ { 0, 17, 222, 5, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 47 },
+ { 0, 17, 230, 5, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 47 },
+ { 0, 17, 220, 5, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 47 },
+ { 29, 10, 0, 0, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 47 },
+ { 25, 10, 0, 0, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 8, 12, 1, 47 },
+ { 3, 0, 0, 0, 0, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 47 },
+ { 3, 0, 0, 0, 1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 47 },
+ { 3, 0, 0, 0, 2, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 47 },
+ { 3, 0, 0, 0, 3, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 47 },
+ { 3, 0, 0, 0, 4, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 47 },
+ { 3, 0, 0, 0, 5, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 47 },
+ { 3, 0, 0, 0, 6, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 47 },
+ { 3, 0, 0, 0, 7, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 47 },
+ { 3, 0, 0, 0, 8, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 47 },
+ { 3, 0, 0, 0, 9, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 47 },
+ { 18, 0, 0, 0, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 35, 8, 1, 48 },
+ { 18, 0, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 35, 8, 1, 56 },
+ { 18, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 35, 8, 1, 56 },
+ { 3, 0, 0, 0, 0, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 56 },
+ { 3, 0, 0, 0, 1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 56 },
+ { 3, 0, 0, 0, 2, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 56 },
+ { 3, 0, 0, 0, 3, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 56 },
+ { 3, 0, 0, 0, 4, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 56 },
+ { 3, 0, 0, 0, 5, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 56 },
+ { 3, 0, 0, 0, 6, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 56 },
+ { 3, 0, 0, 0, 7, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 56 },
+ { 3, 0, 0, 0, 8, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 56 },
+ { 3, 0, 0, 0, 9, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 56 },
+ { 5, 0, 0, 0, 1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 35, 0, 1, 56 },
+ { 29, 10, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 35, 0, 1, 56 },
+ { 29, 10, 0, 0, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 32 },
+ { 18, 0, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 55 },
+ { 0, 17, 230, 5, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 55 },
+ { 0, 17, 220, 5, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 55 },
+ { 1, 0, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 55 },
+ { 0, 17, 0, 5, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 55 },
+ { 25, 0, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 55 },
+ { 18, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 35, 8, 1, 78 },
+ { 1, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 35, 4, 1, 78 },
+ { 0, 17, 0, 5, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 35, 4, 1, 78 },
+ { 0, 17, 9, 5, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 35, 4, 1, 78 },
+ { 1, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 4, 35, 4, 1, 78 },
+ { 0, 17, 230, 5, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 35, 4, 1, 78 },
+ { 0, 17, 220, 5, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 78 },
+ { 3, 0, 0, 0, 0, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 78 },
+ { 3, 0, 0, 0, 1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 78 },
+ { 3, 0, 0, 0, 2, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 78 },
+ { 3, 0, 0, 0, 3, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 78 },
+ { 3, 0, 0, 0, 4, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 78 },
+ { 3, 0, 0, 0, 5, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 78 },
+ { 3, 0, 0, 0, 6, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 78 },
+ { 3, 0, 0, 0, 7, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 78 },
+ { 3, 0, 0, 0, 8, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 78 },
+ { 3, 0, 0, 0, 9, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 78 },
+ { 25, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 35, 0, 1, 78 },
+ { 17, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 35, 8, 1, 78 },
+ { 25, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 35, 12, 1, 78 },
+ { 0, 17, 230, 5, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 220, 5, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 2, 17, 0, 5, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 220, 5, -1, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 230, 5, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 220, 5, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 0, 5, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 62 },
+ { 1, 0, 0, 0, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 62 },
+ { 18, 0, 0, 0, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 62 },
+ { 18, 0, 0, 0, -1, 0, 9, 3, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 62 },
+ { 0, 17, 7, 5, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 62 },
+ { 1, 0, 0, 0, -1, 0, 9, 3, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 62 },
+ { 1, 0, 0, 0, -1, 0, 9, 3, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 62 },
+ { 1, 0, 9, 0, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 62 },
+ { 18, 0, 0, 0, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 62 },
+ { 3, 0, 0, 0, 0, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 1, 62 },
+ { 3, 0, 0, 0, 1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 1, 62 },
+ { 3, 0, 0, 0, 2, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 1, 62 },
+ { 3, 0, 0, 0, 3, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 1, 62 },
+ { 3, 0, 0, 0, 4, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 1, 62 },
+ { 3, 0, 0, 0, 5, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 1, 62 },
+ { 3, 0, 0, 0, 6, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 1, 62 },
+ { 3, 0, 0, 0, 7, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 1, 62 },
+ { 3, 0, 0, 0, 8, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 1, 62 },
+ { 3, 0, 0, 0, 9, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 1, 62 },
+ { 25, 0, 0, 0, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 62 },
+ { 25, 0, 0, 0, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 1, 62 },
+ { 25, 0, 0, 0, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 62 },
+ { 29, 0, 0, 0, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 1, 62 },
+ { 0, 17, 230, 5, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 62 },
+ { 0, 17, 220, 5, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 62 },
+ { 25, 0, 0, 0, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 62 },
+ { 0, 17, 0, 5, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 67 },
+ { 1, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 67 },
+ { 18, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 67 },
+ { 1, 0, 9, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 67 },
+ { 0, 17, 9, 5, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 67 },
+ { 0, 17, 0, 5, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 67 },
+ { 3, 0, 0, 0, 0, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 67 },
+ { 3, 0, 0, 0, 1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 67 },
+ { 3, 0, 0, 0, 2, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 67 },
+ { 3, 0, 0, 0, 3, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 67 },
+ { 3, 0, 0, 0, 4, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 67 },
+ { 3, 0, 0, 0, 5, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 67 },
+ { 3, 0, 0, 0, 6, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 67 },
+ { 3, 0, 0, 0, 7, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 67 },
+ { 3, 0, 0, 0, 8, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 67 },
+ { 3, 0, 0, 0, 9, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 67 },
+ { 18, 0, 0, 0, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 67 },
+ { 18, 0, 0, 0, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 93 },
+ { 0, 17, 7, 5, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 93 },
+ { 1, 0, 0, 0, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 93 },
+ { 0, 17, 0, 5, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 93 },
+ { 1, 0, 9, 0, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 93 },
+ { 25, 0, 0, 0, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 93 },
+ { 18, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 68 },
+ { 1, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 68 },
+ { 0, 17, 0, 5, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 68 },
+ { 0, 17, 7, 5, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 68 },
+ { 25, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 68 },
+ { 25, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 68 },
+ { 3, 0, 0, 0, 0, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 68 },
+ { 3, 0, 0, 0, 1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 68 },
+ { 3, 0, 0, 0, 2, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 68 },
+ { 3, 0, 0, 0, 3, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 68 },
+ { 3, 0, 0, 0, 4, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 68 },
+ { 3, 0, 0, 0, 5, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 68 },
+ { 3, 0, 0, 0, 6, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 68 },
+ { 3, 0, 0, 0, 7, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 68 },
+ { 3, 0, 0, 0, 8, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 68 },
+ { 3, 0, 0, 0, 9, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 68 },
+ { 3, 0, 0, 0, 0, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 69 },
+ { 3, 0, 0, 0, 1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 69 },
+ { 3, 0, 0, 0, 2, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 69 },
+ { 3, 0, 0, 0, 3, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 69 },
+ { 3, 0, 0, 0, 4, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 69 },
+ { 3, 0, 0, 0, 5, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 69 },
+ { 3, 0, 0, 0, 6, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 69 },
+ { 3, 0, 0, 0, 7, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 69 },
+ { 3, 0, 0, 0, 8, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 69 },
+ { 3, 0, 0, 0, 9, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 69 },
+ { 18, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 69 },
+ { 17, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 69 },
+ { 25, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 69 },
+ { 15, 0, 0, 0, -1, 0, 18, 3, 0, { {0, 0}, {0, -6254}, {0, -6254}, {0, -6222} }, 0, 10, 14, 6, 3, 5 },
+ { 15, 0, 0, 0, -1, 0, 18, 3, 0, { {0, 0}, {0, -6253}, {0, -6253}, {0, -6221} }, 0, 10, 14, 6, 3, 5 },
+ { 15, 0, 0, 0, -1, 0, 18, 3, 0, { {0, 0}, {0, -6244}, {0, -6244}, {0, -6212} }, 0, 10, 14, 6, 3, 5 },
+ { 15, 0, 0, 0, -1, 0, 18, 3, 0, { {0, 0}, {0, -6242}, {0, -6242}, {0, -6210} }, 0, 10, 14, 6, 3, 5 },
+ { 15, 0, 0, 0, -1, 0, 18, 3, 0, { {0, 0}, {0, -6243}, {0, -6243}, {0, -6211} }, 0, 10, 14, 6, 3, 5 },
+ { 15, 0, 0, 0, -1, 0, 18, 3, 0, { {0, 0}, {0, -6236}, {0, -6236}, {0, -6204} }, 0, 10, 14, 6, 3, 5 },
+ { 15, 0, 0, 0, -1, 0, 18, 3, 0, { {0, 0}, {0, -6181}, {0, -6181}, {0, -6180} }, 0, 10, 14, 6, 3, 5 },
+ { 15, 0, 0, 0, -1, 0, 18, 3, 0, { {0, 0}, {1, 201}, {1, 201}, {1, 719} }, 0, 10, 14, 6, 3, 5 },
+ { 14, 0, 0, 0, -1, 0, 20, 3, 0, { {0, -3008}, {0, 0}, {0, 0}, {0, -3008} }, 0, 10, 14, 8, 3, 25 },
+ { 25, 0, 0, 0, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 67 },
+ { 0, 17, 230, 5, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 25, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 0, 17, 1, 5, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 220, 5, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 1, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 2 },
+ { 18, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 2 },
+ { 18, 0, 0, 0, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 2 },
+ { 0, 17, 230, 5, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 1, 0, 0, 0, -1, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 2 },
+ { 18, 0, 0, 0, -1, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 2 },
+ { 15, 0, 0, 0, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 1, 4 },
+ { 15, 0, 0, 0, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 1, 5 },
+ { 17, 0, 0, 0, -1, 0, 7, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 3, 3 },
+ { 17, 0, 0, 0, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 17, 0, 0, 0, -1, 0, 7, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 17, 0, 0, 0, -1, 0, 8, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 3, 5 },
+ { 15, 0, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {1, 203}, {1, 203}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 3814}, {0, 3814}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {1, 205}, {1, 205}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 17, 0, 0, 0, -1, 0, 8, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 3, 3 },
+ { 17, 0, 0, 0, -1, 0, 8, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 0, 17, 230, 5, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 220, 5, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 230, 5, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 220, 5, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 230, 5, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 234, 5, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 6, 4, 1, 1 },
+ { 0, 17, 214, 5, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 220, 5, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 202, 5, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 232, 5, -1, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 228, 5, -1, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 220, 5, -1, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 218, 5, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 230, 5, -1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 233, 5, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 6, 4, 1, 1 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 514}, {1, 514}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 517}, {1, 517}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 520}, {1, 520}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 523}, {1, 523}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {1, 526}, {1, 526}, {0, 0} }, 0, 10, 14, 6, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 2, 3, 81, { {0, 0}, {0, -59}, {0, -59}, {0, -58} }, 0, 10, 14, 6, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 14, 0, 0, 0, -1, 0, 10, 3, 0, { {0, -7615}, {0, 0}, {0, 0}, {0, -7615} }, 0, 10, 14, 7, 3, 3 },
+ { 14, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 14, 7, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {0, 8}, {0, 8}, {0, 0} }, 0, 10, 14, 6, 1, 4 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 17, { {0, -8}, {0, 0}, {0, 0}, {0, -8} }, 0, 10, 14, 7, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 529}, {1, 529}, {0, 0} }, 0, 10, 14, 6, 1, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 532}, {1, 532}, {0, 0} }, 0, 10, 14, 6, 1, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 536}, {1, 536}, {0, 0} }, 0, 10, 14, 6, 1, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 540}, {1, 540}, {0, 0} }, 0, 10, 14, 6, 1, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {0, 74}, {0, 74}, {0, 0} }, 0, 10, 14, 6, 1, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 85, { {0, 0}, {0, 74}, {0, 74}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {0, 86}, {0, 86}, {0, 0} }, 0, 10, 14, 6, 1, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 85, { {0, 0}, {0, 86}, {0, 86}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {0, 100}, {0, 100}, {0, 0} }, 0, 10, 14, 6, 1, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 85, { {0, 0}, {0, 100}, {0, 100}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {0, 128}, {0, 128}, {0, 0} }, 0, 10, 14, 6, 1, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 85, { {0, 0}, {0, 128}, {0, 128}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {0, 112}, {0, 112}, {0, 0} }, 0, 10, 14, 6, 1, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 85, { {0, 0}, {0, 112}, {0, 112}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {0, 126}, {0, 126}, {0, 0} }, 0, 10, 14, 6, 1, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 85, { {0, 0}, {0, 126}, {0, 126}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 578}, {0, 8}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 581}, {0, 8}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 584}, {0, 8}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 587}, {0, 8}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 590}, {0, 8}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 593}, {0, 8}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 596}, {0, 8}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 599}, {0, 8}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 16, 0, 0, 0, -1, 0, 1, 3, 17, { {0, -8}, {1, 578}, {0, 0}, {0, -8} }, 0, 10, 14, 7, 3, 4 },
+ { 16, 0, 0, 0, -1, 0, 1, 3, 17, { {0, -8}, {1, 581}, {0, 0}, {0, -8} }, 0, 10, 14, 7, 3, 4 },
+ { 16, 0, 0, 0, -1, 0, 1, 3, 17, { {0, -8}, {1, 584}, {0, 0}, {0, -8} }, 0, 10, 14, 7, 3, 4 },
+ { 16, 0, 0, 0, -1, 0, 1, 3, 17, { {0, -8}, {1, 587}, {0, 0}, {0, -8} }, 0, 10, 14, 7, 3, 4 },
+ { 16, 0, 0, 0, -1, 0, 1, 3, 17, { {0, -8}, {1, 590}, {0, 0}, {0, -8} }, 0, 10, 14, 7, 3, 4 },
+ { 16, 0, 0, 0, -1, 0, 1, 3, 17, { {0, -8}, {1, 593}, {0, 0}, {0, -8} }, 0, 10, 14, 7, 3, 4 },
+ { 16, 0, 0, 0, -1, 0, 1, 3, 17, { {0, -8}, {1, 596}, {0, 0}, {0, -8} }, 0, 10, 14, 7, 3, 4 },
+ { 16, 0, 0, 0, -1, 0, 1, 3, 17, { {0, -8}, {1, 599}, {0, 0}, {0, -8} }, 0, 10, 14, 7, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 602}, {0, 8}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 605}, {0, 8}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 608}, {0, 8}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 611}, {0, 8}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 614}, {0, 8}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 617}, {0, 8}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 620}, {0, 8}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 623}, {0, 8}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 16, 0, 0, 0, -1, 0, 1, 3, 17, { {0, -8}, {1, 602}, {0, 0}, {0, -8} }, 0, 10, 14, 7, 3, 4 },
+ { 16, 0, 0, 0, -1, 0, 1, 3, 17, { {0, -8}, {1, 605}, {0, 0}, {0, -8} }, 0, 10, 14, 7, 3, 4 },
+ { 16, 0, 0, 0, -1, 0, 1, 3, 17, { {0, -8}, {1, 608}, {0, 0}, {0, -8} }, 0, 10, 14, 7, 3, 4 },
+ { 16, 0, 0, 0, -1, 0, 1, 3, 17, { {0, -8}, {1, 611}, {0, 0}, {0, -8} }, 0, 10, 14, 7, 3, 4 },
+ { 16, 0, 0, 0, -1, 0, 1, 3, 17, { {0, -8}, {1, 614}, {0, 0}, {0, -8} }, 0, 10, 14, 7, 3, 4 },
+ { 16, 0, 0, 0, -1, 0, 1, 3, 17, { {0, -8}, {1, 617}, {0, 0}, {0, -8} }, 0, 10, 14, 7, 3, 4 },
+ { 16, 0, 0, 0, -1, 0, 1, 3, 17, { {0, -8}, {1, 620}, {0, 0}, {0, -8} }, 0, 10, 14, 7, 3, 4 },
+ { 16, 0, 0, 0, -1, 0, 1, 3, 17, { {0, -8}, {1, 623}, {0, 0}, {0, -8} }, 0, 10, 14, 7, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 626}, {0, 8}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 629}, {0, 8}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 632}, {0, 8}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 635}, {0, 8}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 638}, {0, 8}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 641}, {0, 8}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 644}, {0, 8}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 647}, {0, 8}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 16, 0, 0, 0, -1, 0, 1, 3, 17, { {0, -8}, {1, 626}, {0, 0}, {0, -8} }, 0, 10, 14, 7, 3, 4 },
+ { 16, 0, 0, 0, -1, 0, 1, 3, 17, { {0, -8}, {1, 629}, {0, 0}, {0, -8} }, 0, 10, 14, 7, 3, 4 },
+ { 16, 0, 0, 0, -1, 0, 1, 3, 17, { {0, -8}, {1, 632}, {0, 0}, {0, -8} }, 0, 10, 14, 7, 3, 4 },
+ { 16, 0, 0, 0, -1, 0, 1, 3, 17, { {0, -8}, {1, 635}, {0, 0}, {0, -8} }, 0, 10, 14, 7, 3, 4 },
+ { 16, 0, 0, 0, -1, 0, 1, 3, 17, { {0, -8}, {1, 638}, {0, 0}, {0, -8} }, 0, 10, 14, 7, 3, 4 },
+ { 16, 0, 0, 0, -1, 0, 1, 3, 17, { {0, -8}, {1, 641}, {0, 0}, {0, -8} }, 0, 10, 14, 7, 3, 4 },
+ { 16, 0, 0, 0, -1, 0, 1, 3, 17, { {0, -8}, {1, 644}, {0, 0}, {0, -8} }, 0, 10, 14, 7, 3, 4 },
+ { 16, 0, 0, 0, -1, 0, 1, 3, 17, { {0, -8}, {1, 647}, {0, 0}, {0, -8} }, 0, 10, 14, 7, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 662}, {1, 659}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 650}, {0, 9}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 668}, {1, 665}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 544}, {1, 544}, {0, 0} }, 0, 10, 14, 6, 1, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 699}, {1, 695}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 17, { {0, -74}, {0, 0}, {0, 0}, {0, -74} }, 0, 10, 14, 7, 3, 4 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 85, { {0, -74}, {0, 0}, {0, 0}, {0, -74} }, 0, 10, 14, 7, 3, 4 },
+ { 16, 0, 0, 0, -1, 0, 1, 3, 17, { {0, -9}, {1, 650}, {0, 0}, {0, -9} }, 0, 10, 14, 7, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 85, { {0, 0}, {0, -7205}, {0, -7205}, {0, -7173} }, 0, 10, 14, 6, 3, 4 },
+ { 28, 10, 0, 0, -1, 0, 1, 3, 81, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 674}, {1, 671}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 653}, {0, 9}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 680}, {1, 677}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 547}, {1, 547}, {0, 0} }, 0, 10, 14, 6, 1, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 707}, {1, 703}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 17, { {0, -86}, {0, 0}, {0, 0}, {0, -86} }, 0, 10, 14, 7, 3, 4 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 85, { {0, -86}, {0, 0}, {0, 0}, {0, -86} }, 0, 10, 14, 7, 3, 4 },
+ { 16, 0, 0, 0, -1, 0, 1, 3, 17, { {0, -9}, {1, 653}, {0, 0}, {0, -9} }, 0, 10, 14, 7, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 550}, {1, 550}, {0, 0} }, 0, 10, 14, 6, 1, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 85, { {0, 0}, {1, 503}, {1, 503}, {0, -7235} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 554}, {1, 554}, {0, 0} }, 0, 10, 14, 6, 1, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 557}, {1, 557}, {0, 0} }, 0, 10, 14, 6, 1, 4 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 17, { {0, -100}, {0, 0}, {0, 0}, {0, -100} }, 0, 10, 14, 7, 3, 4 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 85, { {0, -100}, {0, 0}, {0, 0}, {0, -100} }, 0, 10, 14, 7, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 561}, {1, 561}, {0, 0} }, 0, 10, 14, 6, 1, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 85, { {0, 0}, {1, 507}, {1, 507}, {0, -7219} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 565}, {1, 565}, {0, 0} }, 0, 10, 14, 6, 1, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {0, 7}, {0, 7}, {0, 0} }, 0, 10, 14, 6, 1, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 568}, {1, 568}, {0, 0} }, 0, 10, 14, 6, 1, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 571}, {1, 571}, {0, 0} }, 0, 10, 14, 6, 1, 4 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 17, { {0, -112}, {0, 0}, {0, 0}, {0, -112} }, 0, 10, 14, 7, 3, 4 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 85, { {0, -112}, {0, 0}, {0, 0}, {0, -112} }, 0, 10, 14, 7, 3, 4 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 17, { {0, -7}, {0, 0}, {0, 0}, {0, -7} }, 0, 10, 14, 7, 3, 4 },
+ { 28, 10, 0, 0, -1, 0, 1, 3, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 686}, {1, 683}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 656}, {0, 9}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 692}, {1, 689}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 575}, {1, 575}, {0, 0} }, 0, 10, 14, 6, 1, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {1, 715}, {1, 711}, {0, 0} }, 0, 10, 14, 6, 3, 4 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 17, { {0, -128}, {0, 0}, {0, 0}, {0, -128} }, 0, 10, 14, 7, 3, 4 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 85, { {0, -128}, {0, 0}, {0, 0}, {0, -128} }, 0, 10, 14, 7, 3, 4 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 17, { {0, -126}, {0, 0}, {0, 0}, {0, -126} }, 0, 10, 14, 7, 3, 4 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 85, { {0, -126}, {0, 0}, {0, 0}, {0, -126} }, 0, 10, 14, 7, 3, 4 },
+ { 16, 0, 0, 0, -1, 0, 1, 3, 17, { {0, -9}, {1, 656}, {0, 0}, {0, -9} }, 0, 10, 14, 7, 3, 4 },
+ { 28, 10, 0, 0, -1, 0, 1, 3, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 20, 0, 0, 4 },
+ { 6, 9, 0, 0, -1, 0, 1, 3, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 18, 19, 5, 0, 2 },
+ { 6, 9, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 18, 19, 5, 0, 2 },
+ { 6, 9, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 6, 5, 0, 2 },
+ { 10, 18, 0, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 0, 22, 4, 2, 2 },
+ { 10, 18, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 4, 1 },
+ { 10, 18, 0, 1, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 5, 5, 34, 4, 4, 1 },
+ { 10, 0, 0, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 23, 4, 0, 2 },
+ { 10, 1, 0, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 23, 4, 0, 2 },
+ { 20, 10, 0, 0, -1, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 2 },
+ { 20, 10, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 6, 0, 3, 2 },
+ { 20, 10, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 2 },
+ { 20, 10, 0, 0, -1, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 11, 1, 2 },
+ { 20, 10, 0, 0, -1, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 21, 11, 1, 2 },
+ { 20, 10, 0, 0, -1, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 25, 10, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 23, 10, 0, 0, -1, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 13, 3, 13, 1, 2 },
+ { 24, 10, 0, 0, -1, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 13, 3, 13, 1, 2 },
+ { 21, 10, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 1, 2 },
+ { 23, 10, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 3, 13, 1, 2 },
+ { 23, 10, 0, 0, -1, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 3, 13, 1, 2 },
+ { 24, 10, 0, 0, -1, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 3, 13, 1, 2 },
+ { 25, 10, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 25, 10, 0, 0, -1, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 13, 17, 10, 0, 2 },
+ { 25, 10, 0, 0, -1, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 0, 2 },
+ { 25, 10, 0, 0, -1, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 14, 19, 0, 1, 2 },
+ { 7, 9, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 3, 40, 3, 0, 2 },
+ { 8, 7, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 3, 40, 3, 0, 2 },
+ { 10, 11, 0, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 23, 4, 0, 2 },
+ { 10, 14, 0, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 23, 4, 0, 2 },
+ { 10, 16, 0, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 23, 4, 0, 2 },
+ { 10, 12, 0, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 23, 4, 0, 2 },
+ { 10, 15, 0, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 23, 4, 0, 2 },
+ { 6, 6, 0, 0, -1, 0, 4, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 17, 6, 5, 0, 2 },
+ { 25, 4, 0, 0, -1, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
+ { 25, 4, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
+ { 25, 4, 0, 0, -1, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 3, 2 },
+ { 25, 4, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 3, 2 },
+ { 25, 10, 0, 0, -1, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
+ { 25, 10, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 3, 2 },
+ { 23, 10, 0, 0, -1, 1, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 3, 13, 1, 2 },
+ { 24, 10, 0, 0, -1, -1, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 3, 13, 1, 2 },
+ { 25, 10, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 7, 12, 0, 2 },
+ { 25, 10, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 7, 12, 1, 2 },
+ { 25, 10, 0, 0, -1, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 19, 10, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 17, 14, 0, 1, 2 },
+ { 26, 6, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 15, 10, 0, 1, 2 },
+ { 21, 10, 0, 0, -1, 1, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 1, 2 },
+ { 22, 10, 0, 0, -1, -1, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 1, 2 },
+ { 25, 10, 0, 0, -1, 0, 6, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 7, 12, 0, 2 },
+ { 25, 10, 0, 0, -1, 0, 4, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 7, 12, 0, 2 },
+ { 25, 10, 0, 0, -1, 0, 4, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 7, 12, 0, 2 },
+ { 25, 10, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 25, 10, 0, 0, -1, 0, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, 0, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 25, 10, 0, 0, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 19, 10, 0, 0, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 17, 14, 0, 1, 2 },
+ { 25, 10, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 25, 10, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 2 },
+ { 25, 10, 0, 0, -1, 0, 6, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 3, 2 },
+ { 6, 9, 0, 0, -1, 0, 6, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 18, 19, 5, 0, 2 },
+ { 10, 18, 0, 5, -1, 0, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 24, 4, 2, 2 },
+ { 10, 18, 0, 5, -1, 0, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 14, 4, 0, 2 },
+ { 10, 18, 0, 5, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 14, 4, 2, 2 },
+ { 13, 18, 0, 0, -1, 0, 0, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 0, 14, 0, 0, 0 },
+ { 10, 19, 0, 0, -1, 0, 15, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 23, 4, 0, 2 },
+ { 10, 20, 0, 0, -1, 0, 15, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 23, 4, 0, 2 },
+ { 10, 21, 0, 0, -1, 0, 15, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 23, 4, 0, 2 },
+ { 10, 22, 0, 0, -1, 0, 15, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 23, 4, 0, 2 },
+ { 10, 18, 0, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 23, 4, 0, 2 },
+ { 5, 2, 0, 0, 0, 0, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
+ { 17, 0, 0, 0, -1, 0, 6, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 3, 3 },
+ { 5, 2, 0, 0, 4, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
+ { 5, 2, 0, 0, 5, 0, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
+ { 5, 2, 0, 0, 6, 0, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
+ { 5, 2, 0, 0, 7, 0, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
+ { 5, 2, 0, 0, 8, 0, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
+ { 5, 2, 0, 0, 9, 0, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
+ { 26, 3, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 26, 3, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
+ { 26, 10, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 21, 10, 0, 0, -1, 1, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 0, 2 },
+ { 22, 10, 0, 0, -1, -1, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 0, 2 },
+ { 17, 0, 0, 0, -1, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 3, 3 },
+ { 17, 0, 0, 0, -1, 0, 12, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 3, 3 },
+ { 27, 4, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
+ { 27, 4, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 11, 0, 3, 2 },
+ { 27, 4, 0, 0, -1, 0, 1, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 11, 0, 1, 2 },
+ { 27, 4, 0, 0, -1, 0, 2, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 11, 0, 1, 2 },
+ { 27, 4, 0, 0, -1, 0, 3, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 11, 0, 1, 2 },
+ { 27, 4, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 11, 0, 1, 2 },
+ { 27, 4, 0, 0, -1, 0, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 11, 0, 1, 2 },
+ { 27, 4, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 11, 0, 1, 2 },
+ { 27, 4, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
+ { 27, 4, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 11, 0, 1, 2 },
+ { 27, 4, 0, 0, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 11, 0, 1, 2 },
+ { 27, 4, 0, 0, -1, 0, 14, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 11, 0, 1, 2 },
+ { 27, 4, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
+ { 27, 4, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 11, 0, 1, 2 },
+ { 27, 4, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
+ { 27, 4, 0, 0, -1, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 11, 0, 1, 2 },
+ { 27, 4, 0, 0, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
+ { 13, 4, 0, 0, -1, 0, 0, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 11, 0, 0, 0 },
+ { 0, 17, 1, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 2, 17, 0, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 2, 17, 0, 5, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 2, 17, 0, 5, -1, 0, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 1, 5, -1, 0, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 230, 5, -1, 0, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 220, 5, -1, 0, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 1, 5, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 29, 10, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 3, 2 },
+ { 29, 10, 0, 0, -1, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 3, 2 },
+ { 29, 10, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 3, 2 },
+ { 15, 0, 0, 0, -1, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 3, 2 },
+ { 29, 10, 0, 0, -1, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 11, 0, 3, 2 },
+ { 26, 10, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
+ { 29, 10, 0, 0, -1, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
+ { 29, 10, 0, 0, -1, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 3, 2 },
+ { 14, 0, 0, 0, -1, 0, 1, 0, 85, { {0, -7517}, {0, 0}, {0, 0}, {0, -7517} }, 0, 10, 14, 7, 3, 4 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 85, { {1, 207}, {0, 0}, {0, 0}, {1, 207} }, 0, 10, 14, 7, 3, 3 },
+ { 14, 0, 0, 0, -1, 0, 1, 0, 85, { {1, 209}, {0, 0}, {0, 0}, {1, 209} }, 0, 10, 14, 7, 3, 3 },
+ { 29, 4, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 14, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 28}, {0, 0}, {0, 0}, {0, 28} }, 0, 10, 14, 7, 0, 3 },
+ { 18, 0, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 3, 2 },
+ { 15, 0, 0, 0, -1, 0, 4, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 10, 14, 6, 3, 2 },
+ { 29, 10, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 7, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
+ { 15, 0, 0, 0, -1, 0, 8, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 3, 2 },
+ { 15, 0, 0, 0, -1, 0, 6, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 3, 2 },
+ { 14, 0, 0, 0, -1, 0, 6, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 3, 2 },
+ { 26, 10, 0, 0, -1, 0, 6, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
+ { 29, 10, 0, 0, -1, 0, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 15, 0, 0, 0, -1, 0, 9, 3, 0, { {0, 0}, {0, -28}, {0, -28}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 29, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 5, 10, 0, 0, -1, 0, 11, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
+ { 5, 10, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
+ { 4, 0, 0, 0, -1, 0, 1, 0, 80, { {0, 16}, {0, 0}, {0, 0}, {0, 16} }, 0, 10, 14, 7, 3, 3 },
+ { 4, 0, 0, 0, -1, 0, 1, 3, 80, { {0, 16}, {0, 0}, {0, 0}, {0, 16} }, 0, 10, 14, 7, 3, 3 },
+ { 4, 0, 0, 0, -1, 0, 1, 0, 80, { {0, 0}, {0, -16}, {0, -16}, {0, 0} }, 0, 10, 14, 6, 3, 3 },
+ { 4, 0, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, -16}, {0, -16}, {0, 0} }, 0, 10, 14, 6, 3, 3 },
+ { 4, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 3 },
+ { 14, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 14, 7, 0, 3 },
+ { 4, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 3 },
+ { 5, 10, 0, 0, -1, 0, 11, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
+ { 29, 10, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 1, 3, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, 3, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, 3, 1, 3, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, 3, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, -3, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, -3, 1, 3, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, -3, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 3, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 11, 0, 1, 2 },
+ { 26, 4, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 11, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, 2016, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, 2527, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, 1923, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, 1914, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, 1918, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, 2250, 1, 3, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
+ { 26, 10, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
+ { 26, 10, 0, 0, -1, 1, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, -1, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, 138, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, 7, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, -7, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, -1, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, 1, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, 0, 1, 0, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, 1, 1, 0, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, -1, 1, 0, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, 1, 1, 3, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, -1, 1, 3, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, 1824, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, 2104, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, 2108, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, 2106, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, 1316, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, -138, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, 8, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, 7, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, -8, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, -7, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 1, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 16, 0, 1, 2 },
+ { 21, 10, 0, 0, -1, 1, 1, 5, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 3, 2 },
+ { 22, 10, 0, 0, -1, -1, 1, 5, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 3, 2 },
+ { 29, 0, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 1, 2 },
+ { 29, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 12, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 12, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 16, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 16, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 5, 10, 0, 0, 1, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
+ { 5, 10, 0, 0, 2, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
+ { 5, 10, 0, 0, 3, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
+ { 5, 10, 0, 0, 4, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
+ { 5, 10, 0, 0, 5, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
+ { 5, 10, 0, 0, 6, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
+ { 5, 10, 0, 0, 7, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
+ { 5, 10, 0, 0, 8, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
+ { 5, 10, 0, 0, 9, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
+ { 5, 10, 0, 0, 1, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 5, 10, 0, 0, 2, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 5, 10, 0, 0, 3, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 5, 10, 0, 0, 4, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 5, 10, 0, 0, 5, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 5, 10, 0, 0, 6, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 5, 10, 0, 0, 7, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 5, 10, 0, 0, 8, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 5, 10, 0, 0, 9, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 5, 10, 0, 0, -1, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 5, 2, 0, 0, 1, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 5, 2, 0, 0, 2, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 5, 2, 0, 0, 3, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 5, 2, 0, 0, 4, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 5, 2, 0, 0, 5, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 5, 2, 0, 0, 6, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 5, 2, 0, 0, 7, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 5, 2, 0, 0, 8, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 5, 2, 0, 0, 9, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 5, 2, 0, 0, -1, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 29, 0, 0, 0, -1, 0, 1, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 29, 0, 0, 0, -1, 0, 1, 0, 80, { {0, 26}, {0, 0}, {0, 0}, {0, 26} }, 0, 10, 14, 7, 3, 2 },
+ { 29, 0, 0, 0, -1, 0, 1, 0, 80, { {0, 26}, {0, 0}, {0, 0}, {0, 26} }, 14, 10, 14, 7, 3, 2 },
+ { 29, 0, 0, 0, -1, 0, 1, 0, 80, { {0, 0}, {0, -26}, {0, -26}, {0, 0} }, 0, 10, 14, 6, 3, 2 },
+ { 5, 10, 0, 0, 0, 0, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
+ { 5, 10, 0, 0, -1, 0, 6, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 5, 10, 0, 0, 1, 0, 6, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 5, 10, 0, 0, 2, 0, 6, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 5, 10, 0, 0, 3, 0, 6, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 5, 10, 0, 0, 4, 0, 6, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 5, 10, 0, 0, 5, 0, 6, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 5, 10, 0, 0, 6, 0, 6, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 5, 10, 0, 0, 7, 0, 6, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 5, 10, 0, 0, 8, 0, 6, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 5, 10, 0, 0, 9, 0, 6, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 5, 10, 0, 0, 0, 0, 7, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, 0, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, 0, 6, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 16, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 7, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 16, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 16, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 16, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 32, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 1, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 8, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 16, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 8, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 11, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 7, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 1, 2 },
+ { 29, 0, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 11, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 16, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 11, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 16, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 16, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 11, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 32, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 16, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 12, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 32, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 11, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 3, 13, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 3, 13, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 8, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 8, 0, 1, 2 },
+ { 21, 10, 0, 0, -1, 1, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 1, 2 },
+ { 22, 10, 0, 0, -1, -1, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 1, 2 },
+ { 5, 10, 0, 0, 1, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 5, 10, 0, 0, 2, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 5, 10, 0, 0, 3, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 5, 10, 0, 0, 4, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 5, 10, 0, 0, 5, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 5, 10, 0, 0, 6, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 5, 10, 0, 0, 7, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 5, 10, 0, 0, 8, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 5, 10, 0, 0, 9, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 5, 10, 0, 0, -1, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 5, 10, 0, 0, 1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 5, 10, 0, 0, 2, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 5, 10, 0, 0, 3, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 5, 10, 0, 0, 4, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 5, 10, 0, 0, 5, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 5, 10, 0, 0, 6, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 5, 10, 0, 0, 7, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 5, 10, 0, 0, 8, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 5, 10, 0, 0, 9, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 5, 10, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, 1, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, -1, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 21, 10, 0, 0, -1, 1, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 1, 2 },
+ { 22, 10, 0, 0, -1, -1, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 1, 2 },
+ { 26, 10, 0, 0, -1, 1, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, -1, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, 2, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, -2, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, 1, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, -1, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, -1316, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 21, 10, 0, 0, -1, 1, 6, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 1, 2 },
+ { 22, 10, 0, 0, -1, -1, 6, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 1, 2 },
+ { 21, 10, 0, 0, -1, 1, 10, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 1, 2 },
+ { 22, 10, 0, 0, -1, -1, 10, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 1, 2 },
+ { 21, 10, 0, 0, -1, 1, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 1, 2 },
+ { 22, 10, 0, 0, -1, -1, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 1, 2 },
+ { 29, 0, 0, 0, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 54 },
+ { 21, 10, 0, 0, -1, 3, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 1, 2 },
+ { 22, 10, 0, 0, -1, 1, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 1, 2 },
+ { 21, 10, 0, 0, -1, -1, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 1, 2 },
+ { 22, 10, 0, 0, -1, -3, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 1, 2 },
+ { 26, 10, 0, 0, -1, -1914, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, -1918, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, -1923, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, -1824, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, -2016, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, 0, 6, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 26, 10, 0, 0, -1, 0, 6, 3, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
+ { 26, 10, 0, 0, -1, -2104, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, -2106, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, -2108, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 26, 10, 0, 0, -1, -2250, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 10, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 11, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, -2527, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 14, 0, 0, 0, -1, 0, 8, 3, 0, { {0, 48}, {0, 0}, {0, 0}, {0, 48} }, 0, 10, 14, 7, 3, 57 },
+ { 14, 0, 0, 0, -1, 0, 24, 3, 0, { {0, 48}, {0, 0}, {0, 0}, {0, 48} }, 0, 10, 14, 7, 3, 57 },
+ { 15, 0, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, -48}, {0, -48}, {0, 0} }, 0, 10, 14, 6, 1, 57 },
+ { 15, 0, 0, 0, -1, 0, 24, 3, 0, { {0, 0}, {0, -48}, {0, -48}, {0, 0} }, 0, 10, 14, 6, 1, 57 },
+ { 14, 0, 0, 0, -1, 0, 9, 3, 0, { {1, 211}, {0, 0}, {0, 0}, {1, 211} }, 0, 10, 14, 7, 3, 3 },
+ { 14, 0, 0, 0, -1, 0, 9, 3, 0, { {0, -3814}, {0, 0}, {0, 0}, {0, -3814} }, 0, 10, 14, 7, 3, 3 },
+ { 14, 0, 0, 0, -1, 0, 9, 3, 0, { {1, 213}, {0, 0}, {0, 0}, {1, 213} }, 0, 10, 14, 7, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 9, 3, 0, { {0, 0}, {1, 215}, {1, 215}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 9, 3, 0, { {0, 0}, {1, 217}, {1, 217}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 14, 0, 0, 0, -1, 0, 10, 3, 0, { {1, 219}, {0, 0}, {0, 0}, {1, 219} }, 0, 10, 14, 7, 3, 3 },
+ { 14, 0, 0, 0, -1, 0, 10, 3, 0, { {1, 221}, {0, 0}, {0, 0}, {1, 221} }, 0, 10, 14, 7, 3, 3 },
+ { 14, 0, 0, 0, -1, 0, 10, 3, 0, { {1, 223}, {0, 0}, {0, 0}, {1, 223} }, 0, 10, 14, 7, 3, 3 },
+ { 14, 0, 0, 0, -1, 0, 11, 3, 0, { {1, 225}, {0, 0}, {0, 0}, {1, 225} }, 0, 10, 14, 7, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 17, 0, 0, 0, -1, 0, 10, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 3, 3 },
+ { 14, 0, 0, 0, -1, 0, 11, 3, 0, { {1, 227}, {0, 0}, {0, 0}, {1, 227} }, 0, 10, 14, 7, 3, 3 },
+ { 14, 0, 0, 0, -1, 0, 11, 3, 0, { {1, 229}, {0, 0}, {0, 0}, {1, 229} }, 0, 10, 14, 7, 3, 3 },
+ { 14, 0, 0, 0, -1, 0, 8, 3, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 14, 7, 3, 46 },
+ { 15, 0, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 14, 6, 1, 46 },
+ { 15, 0, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 1, 46 },
+ { 29, 10, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 46 },
+ { 14, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 14, 7, 3, 46 },
+ { 15, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 14, 6, 1, 46 },
+ { 0, 17, 230, 5, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 46 },
+ { 14, 0, 0, 0, -1, 0, 13, 3, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 14, 7, 3, 46 },
+ { 15, 0, 0, 0, -1, 0, 13, 3, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 14, 6, 1, 46 },
+ { 25, 10, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 8, 0, 1, 46 },
+ { 25, 10, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 46 },
+ { 5, 10, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 46 },
+ { 15, 0, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, -7264}, {0, -7264}, {0, 0} }, 0, 10, 14, 6, 1, 25 },
+ { 15, 0, 0, 0, -1, 0, 13, 3, 0, { {0, 0}, {0, -7264}, {0, -7264}, {0, 0} }, 0, 10, 14, 6, 1, 25 },
+ { 18, 0, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 58 },
+ { 18, 0, 0, 0, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 58 },
+ { 17, 0, 0, 0, -1, 0, 8, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 3, 58 },
+ { 25, 0, 0, 0, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 58 },
+ { 0, 17, 9, 5, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 58 },
+ { 25, 10, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 3, 13, 1, 2 },
+ { 23, 10, 0, 0, -1, 1, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 3, 13, 1, 2 },
+ { 24, 10, 0, 0, -1, -1, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 3, 13, 1, 2 },
+ { 20, 10, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 2 },
+ { 25, 10, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 0, 1, 2 },
+ { 25, 10, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 2 },
+ { 20, 10, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 25, 10, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 23, 10, 0, 0, -1, 1, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 3, 13, 1, 2 },
+ { 24, 10, 0, 0, -1, -1, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 3, 13, 1, 2 },
+ { 25, 10, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 8, 12, 1, 2 },
+ { 17, 10, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 2 },
+ { 25, 10, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 2 },
+ { 25, 10, 0, 0, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 25, 10, 0, 0, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 2 },
+ { 20, 10, 0, 0, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 21, 0, 1, 2 },
+ { 25, 10, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 2 },
+ { 25, 10, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 2 },
+ { 25, 10, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 20, 10, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 2 },
+ { 21, 10, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 1, 2 },
+ { 25, 10, 0, 0, -1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 2 },
+ { 25, 10, 0, 0, -1, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 2 },
+ { 25, 10, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 2 },
+ { 25, 10, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 25, 10, 0, 0, -1, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 2 },
+ { 25, 10, 0, 0, -1, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 25, 10, 0, 0, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 8, 12, 1, 2 },
+ { 21, 10, 0, 0, -1, 1, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 1, 2 },
+ { 22, 10, 0, 0, -1, -1, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 1, 2 },
+ { 20, 10, 0, 0, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 4, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 1, 37 },
+ { 29, 10, 0, 0, -1, 0, 4, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 3, 37 },
+ { 29, 10, 0, 0, -1, 0, 4, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 0, 2 },
+ { 29, 10, 0, 0, -1, 0, 26, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 0, 2 },
+ { 6, 9, 0, 0, -1, 0, 1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 18, 19, 5, 0, 2 },
+ { 25, 10, 0, 0, -1, 0, 1, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 11, 1, 2 },
+ { 25, 10, 0, 0, -1, 0, 1, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 12, 3, 2 },
+ { 25, 10, 0, 0, -1, 0, 1, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 1, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 1, 2 },
+ { 17, 0, 0, 0, -1, 0, 1, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 7, 8, 1, 37 },
+ { 18, 0, 0, 0, -1, 0, 1, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 8, 1, 2 },
+ { 4, 0, 0, 0, -1, 0, 1, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 8, 1, 37 },
+ { 21, 10, 0, 0, -1, 1, 1, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 1, 2 },
+ { 22, 10, 0, 0, -1, -1, 1, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 1, 2 },
+ { 20, 10, 0, 0, -1, 0, 1, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 7, 0, 1, 2 },
+ { 21, 10, 0, 0, -1, 0, 1, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 1, 2 },
+ { 22, 10, 0, 0, -1, 0, 1, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 1, 2 },
+ { 0, 17, 218, 5, -1, 0, 1, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 228, 5, -1, 0, 1, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 232, 5, -1, 0, 1, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 222, 5, -1, 0, 1, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 1, 0, 224, 0, -1, 0, 1, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 26 },
+ { 20, 10, 0, 0, -1, 0, 1, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 16, 0, 1, 2 },
+ { 17, 0, 0, 0, -1, 0, 1, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 16, 8, 1, 2 },
+ { 17, 0, 0, 0, -1, 0, 1, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 23, 8, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 1, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 3, 2 },
+ { 4, 0, 0, 0, -1, 0, 4, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 8, 3, 37 },
+ { 17, 0, 0, 0, -1, 0, 6, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 7, 8, 1, 37 },
+ { 18, 0, 0, 0, -1, 0, 6, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 7, 8, 1, 2 },
+ { 25, 10, 0, 0, -1, 0, 6, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 16, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 4, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 1, 2 },
+ { 18, 0, 0, 0, -1, 0, 1, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 7, 8, 1, 34 },
+ { 18, 0, 0, 0, -1, 0, 1, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 8, 1, 34 },
+ { 18, 0, 0, 0, -1, 0, 1, 5, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 8, 1, 34 },
+ { 18, 0, 0, 0, -1, 0, 6, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 7, 8, 1, 34 },
+ { 0, 17, 8, 5, -1, 0, 1, 5, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 28, 10, 0, 0, -1, 0, 1, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 7, 0, 0, 2 },
+ { 17, 0, 0, 0, -1, 0, 1, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 7, 8, 1, 34 },
+ { 17, 0, 0, 0, -1, 0, 1, 5, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 7, 8, 1, 34 },
+ { 18, 0, 0, 0, -1, 0, 6, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 8, 3, 34 },
+ { 20, 10, 0, 0, -1, 0, 6, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 7, 0, 1, 2 },
+ { 18, 0, 0, 0, -1, 0, 1, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 7, 8, 1, 35 },
+ { 18, 0, 0, 0, -1, 0, 1, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 16, 8, 1, 35 },
+ { 18, 0, 0, 0, -1, 0, 1, 5, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 16, 8, 1, 35 },
+ { 25, 10, 0, 0, -1, 0, 1, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 7, 0, 1, 2 },
+ { 17, 0, 0, 0, -1, 0, 1, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 7, 8, 1, 2 },
+ { 17, 0, 0, 0, -1, 0, 1, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 7, 8, 1, 35 },
+ { 17, 0, 0, 0, -1, 0, 1, 5, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 7, 8, 1, 35 },
+ { 18, 0, 0, 0, -1, 0, 6, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 16, 8, 3, 35 },
+ { 18, 0, 0, 0, -1, 0, 1, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 16, 8, 1, 36 },
+ { 18, 0, 0, 0, -1, 0, 10, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 16, 8, 1, 36 },
+ { 18, 0, 0, 0, -1, 0, 19, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 16, 8, 1, 36 },
+ { 18, 0, 0, 0, -1, 0, 20, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 16, 8, 1, 36 },
+ { 18, 0, 0, 0, -1, 0, 1, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 16, 8, 3, 26 },
+ { 18, 0, 0, 0, -1, 0, 1, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 16, 8, 0, 26 },
+ { 29, 0, 0, 0, -1, 0, 1, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 1, 2 },
+ { 5, 0, 0, 0, -1, 0, 1, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 3, 2 },
+ { 29, 0, 0, 0, -1, 0, 1, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 3, 2 },
+ { 18, 0, 0, 0, -1, 0, 4, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 16, 8, 1, 36 },
+ { 18, 0, 0, 0, -1, 0, 12, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 16, 8, 1, 36 },
+ { 18, 0, 0, 0, -1, 0, 23, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 16, 8, 1, 36 },
+ { 29, 10, 0, 0, -1, 0, 8, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 10, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 1, 2 },
+ { 18, 0, 0, 0, -1, 0, 6, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 7, 8, 1, 35 },
+ { 29, 0, 0, 0, -1, 0, 1, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 0, 26 },
+ { 29, 10, 0, 0, -1, 0, 7, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 0, 26 },
+ { 5, 0, 0, 0, -1, 0, 1, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 0, 2 },
+ { 29, 0, 0, 0, -1, 0, 1, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 0, 2 },
+ { 29, 0, 0, 0, -1, 0, 11, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 3, 2 },
+ { 5, 0, 0, 0, -1, 0, 11, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 7, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 3, 2 },
+ { 5, 10, 0, 0, -1, 0, 6, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 3, 2 },
+ { 29, 0, 0, 0, -1, 0, 1, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 3, 26 },
+ { 29, 10, 0, 0, -1, 0, 7, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 3, 26 },
+ { 29, 10, 0, 0, -1, 0, 8, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 3, 26 },
+ { 29, 0, 0, 0, -1, 0, 1, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 16, 0, 3, 2 },
+ { 29, 0, 0, 0, -1, 0, 1, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 16, 0, 3, 35 },
+ { 29, 0, 0, 0, -1, 0, 22, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 3, 2 },
+ { 18, 0, 0, 0, -1, 0, 4, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 8, 1, 37 },
+ { 18, 0, 0, 0, -1, 0, 23, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 8, 1, 37 },
+ { 18, 0, 0, 0, -1, 0, 1, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 8, 1, 37 },
+ { 18, 0, 0, 0, -1, 0, 8, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 8, 1, 37 },
+ { 18, 0, 0, 0, -1, 0, 10, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 8, 1, 37 },
+ { 18, 0, 0, 0, -1, 0, 11, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 8, 1, 37 },
+ { 18, 0, 0, 0, -1, 0, 13, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 8, 1, 37 },
+ { 18, 0, 0, 0, -1, 0, 17, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 8, 1, 37 },
+ { 18, 0, 0, 0, -1, 0, 19, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 8, 1, 37 },
+ { 18, 0, 0, 0, -1, 0, 20, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 8, 1, 37 },
+ { 18, 0, 0, 0, -1, 0, 24, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 8, 1, 37 },
+ { 18, 0, 0, 0, -1, 0, 4, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 16, 8, 1, 38 },
+ { 17, 0, 0, 0, -1, 0, 4, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 7, 8, 1, 38 },
+ { 29, 10, 0, 0, -1, 0, 4, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 1, 38 },
+ { 29, 10, 0, 0, -1, 0, 6, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 1, 38 },
+ { 18, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 83 },
+ { 17, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 83 },
+ { 25, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 83 },
+ { 25, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 83 },
+ { 18, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 70 },
+ { 17, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 70 },
+ { 25, 10, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 70 },
+ { 25, 10, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 8, 12, 1, 70 },
+ { 25, 10, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 70 },
+ { 3, 0, 0, 0, 0, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 70 },
+ { 3, 0, 0, 0, 1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 70 },
+ { 3, 0, 0, 0, 2, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 70 },
+ { 3, 0, 0, 0, 3, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 70 },
+ { 3, 0, 0, 0, 4, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 70 },
+ { 3, 0, 0, 0, 5, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 70 },
+ { 3, 0, 0, 0, 6, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 70 },
+ { 3, 0, 0, 0, 7, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 70 },
+ { 3, 0, 0, 0, 8, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 70 },
+ { 3, 0, 0, 0, 9, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 70 },
+ { 18, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 5 },
+ { 2, 17, 0, 5, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 5 },
+ { 25, 10, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 5 },
+ { 0, 17, 230, 5, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 5 },
+ { 17, 10, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 5 },
+ { 17, 0, 0, 0, -1, 0, 16, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 3, 5 },
+ { 0, 17, 230, 5, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 5 },
+ { 18, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 84 },
+ { 4, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 84 },
+ { 0, 17, 230, 5, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 84 },
+ { 25, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 84 },
+ { 25, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 84 },
+ { 25, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 84 },
+ { 28, 10, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 28, 10, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 0, 1, 2 },
+ { 17, 10, 0, 0, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 2 },
+ { 28, 10, 0, 0, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 0, 1, 2 },
+ { 14, 0, 0, 0, -1, 0, 10, 3, 0, { {1, 231}, {0, 0}, {0, 0}, {1, 231} }, 0, 10, 14, 7, 3, 3 },
+ { 28, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 0, 1, 2 },
+ { 14, 0, 0, 0, -1, 0, 12, 3, 0, { {1, 233}, {0, 0}, {0, 0}, {1, 233} }, 0, 10, 14, 7, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 18, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 3 },
+ { 14, 0, 0, 0, -1, 0, 12, 3, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 14, 7, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 12, 3, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 14, 0, 0, 0, -1, 0, 13, 3, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 14, 7, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 13, 3, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 48}, {0, 48}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 14, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 14, 7, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 14, 0, 0, 0, -1, 0, 13, 3, 0, { {1, 235}, {0, 0}, {0, 0}, {1, 235} }, 0, 10, 14, 7, 3, 3 },
+ { 14, 0, 0, 0, -1, 0, 16, 3, 0, { {1, 237}, {0, 0}, {0, 0}, {1, 237} }, 0, 10, 14, 7, 3, 3 },
+ { 14, 0, 0, 0, -1, 0, 16, 3, 0, { {1, 239}, {0, 0}, {0, 0}, {1, 239} }, 0, 10, 14, 7, 3, 3 },
+ { 14, 0, 0, 0, -1, 0, 16, 3, 0, { {1, 241}, {0, 0}, {0, 0}, {1, 241} }, 0, 10, 14, 7, 3, 3 },
+ { 14, 0, 0, 0, -1, 0, 18, 3, 0, { {1, 243}, {0, 0}, {0, 0}, {1, 243} }, 0, 10, 14, 7, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 14, 0, 0, 0, -1, 0, 16, 3, 0, { {1, 245}, {0, 0}, {0, 0}, {1, 245} }, 0, 10, 14, 7, 3, 3 },
+ { 14, 0, 0, 0, -1, 0, 16, 3, 0, { {1, 247}, {0, 0}, {0, 0}, {1, 247} }, 0, 10, 14, 7, 3, 3 },
+ { 14, 0, 0, 0, -1, 0, 17, 3, 0, { {1, 249}, {0, 0}, {0, 0}, {1, 249} }, 0, 10, 14, 7, 3, 3 },
+ { 14, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 928}, {0, 0}, {0, 0}, {0, 928} }, 0, 10, 14, 7, 3, 3 },
+ { 14, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 14, 7, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 14, 0, 0, 0, -1, 0, 20, 3, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 14, 7, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 14, 0, 0, 0, -1, 0, 21, 3, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 14, 7, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 21, 3, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 14, 0, 0, 0, -1, 0, 24, 3, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 14, 7, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 24, 3, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 14, 0, 0, 0, -1, 0, 21, 3, 0, { {0, -48}, {0, 0}, {0, 0}, {0, -48} }, 0, 10, 14, 7, 3, 3 },
+ { 14, 0, 0, 0, -1, 0, 21, 3, 0, { {1, 251}, {0, 0}, {0, 0}, {1, 251} }, 0, 10, 14, 7, 3, 3 },
+ { 14, 0, 0, 0, -1, 0, 21, 3, 0, { {1, 253}, {0, 0}, {0, 0}, {1, 253} }, 0, 10, 14, 7, 3, 3 },
+ { 14, 0, 0, 0, -1, 0, 23, 3, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 14, 7, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 23, 3, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 17, 0, 0, 0, -1, 0, 24, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 3, 3 },
+ { 18, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 3 },
+ { 17, 0, 0, 0, -1, 0, 13, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 3, 3 },
+ { 18, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 3 },
+ { 18, 0, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 59 },
+ { 0, 17, 0, 5, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 59 },
+ { 0, 17, 9, 5, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 59 },
+ { 1, 0, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 59 },
+ { 29, 10, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 59 },
+ { 0, 17, 9, 5, -1, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 59 },
+ { 5, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 29, 4, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 18, 0, 0, 2, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 65 },
+ { 18, 0, 0, 4, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 65 },
+ { 18, 0, 0, 0, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 65 },
+ { 25, 10, 0, 0, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 20, 0, 1, 65 },
+ { 25, 10, 0, 0, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 8, 12, 1, 65 },
+ { 1, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 71 },
+ { 18, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 71 },
+ { 0, 17, 9, 5, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 71 },
+ { 0, 17, 0, 5, -1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 71 },
+ { 25, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 71 },
+ { 3, 0, 0, 0, 0, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 71 },
+ { 3, 0, 0, 0, 1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 71 },
+ { 3, 0, 0, 0, 2, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 71 },
+ { 3, 0, 0, 0, 3, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 71 },
+ { 3, 0, 0, 0, 4, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 71 },
+ { 3, 0, 0, 0, 5, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 71 },
+ { 3, 0, 0, 0, 6, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 71 },
+ { 3, 0, 0, 0, 7, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 71 },
+ { 3, 0, 0, 0, 8, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 71 },
+ { 3, 0, 0, 0, 9, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 71 },
+ { 0, 17, 230, 5, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 11 },
+ { 25, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 11 },
+ { 25, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 20, 0, 1, 11 },
+ { 18, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 11 },
+ { 18, 0, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 11 },
+ { 0, 17, 0, 5, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 11 },
+ { 3, 0, 0, 0, 0, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 72 },
+ { 3, 0, 0, 0, 1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 72 },
+ { 3, 0, 0, 0, 2, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 72 },
+ { 3, 0, 0, 0, 3, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 72 },
+ { 3, 0, 0, 0, 4, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 72 },
+ { 3, 0, 0, 0, 5, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 72 },
+ { 3, 0, 0, 0, 6, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 72 },
+ { 3, 0, 0, 0, 7, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 72 },
+ { 3, 0, 0, 0, 8, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 72 },
+ { 3, 0, 0, 0, 9, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 72 },
+ { 18, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 72 },
+ { 0, 17, 0, 5, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 72 },
+ { 0, 17, 220, 5, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 72 },
+ { 25, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 2 },
+ { 25, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 72 },
+ { 18, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 73 },
+ { 0, 17, 0, 5, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 73 },
+ { 1, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 73 },
+ { 1, 0, 9, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 73 },
+ { 25, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 73 },
+ { 0, 17, 0, 5, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 85 },
+ { 1, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 85 },
+ { 18, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 85 },
+ { 0, 17, 7, 5, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 85 },
+ { 1, 0, 9, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 85 },
+ { 25, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 1, 85 },
+ { 25, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 85 },
+ { 25, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 85 },
+ { 17, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 19, 8, 1, 2 },
+ { 3, 0, 0, 0, 0, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 1, 85 },
+ { 3, 0, 0, 0, 1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 1, 85 },
+ { 3, 0, 0, 0, 2, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 1, 85 },
+ { 3, 0, 0, 0, 3, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 1, 85 },
+ { 3, 0, 0, 0, 4, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 1, 85 },
+ { 3, 0, 0, 0, 5, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 1, 85 },
+ { 3, 0, 0, 0, 6, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 1, 85 },
+ { 3, 0, 0, 0, 7, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 1, 85 },
+ { 3, 0, 0, 0, 8, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 1, 85 },
+ { 3, 0, 0, 0, 9, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 1, 85 },
+ { 18, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 35, 8, 1, 24 },
+ { 0, 17, 0, 5, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 35, 4, 1, 24 },
+ { 17, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 35, 8, 1, 24 },
+ { 3, 0, 0, 0, 0, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 24 },
+ { 3, 0, 0, 0, 1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 24 },
+ { 3, 0, 0, 0, 2, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 24 },
+ { 3, 0, 0, 0, 3, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 24 },
+ { 3, 0, 0, 0, 4, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 24 },
+ { 3, 0, 0, 0, 5, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 24 },
+ { 3, 0, 0, 0, 6, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 24 },
+ { 3, 0, 0, 0, 7, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 24 },
+ { 3, 0, 0, 0, 8, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 24 },
+ { 3, 0, 0, 0, 9, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 24 },
+ { 18, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 77 },
+ { 0, 17, 0, 5, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 77 },
+ { 1, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 77 },
+ { 18, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 19, 8, 1, 77 },
+ { 3, 0, 0, 0, 0, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 1, 77 },
+ { 3, 0, 0, 0, 1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 1, 77 },
+ { 3, 0, 0, 0, 2, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 1, 77 },
+ { 3, 0, 0, 0, 3, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 1, 77 },
+ { 3, 0, 0, 0, 4, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 1, 77 },
+ { 3, 0, 0, 0, 5, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 1, 77 },
+ { 3, 0, 0, 0, 6, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 1, 77 },
+ { 3, 0, 0, 0, 7, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 1, 77 },
+ { 3, 0, 0, 0, 8, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 1, 77 },
+ { 3, 0, 0, 0, 9, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 1, 77 },
+ { 25, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 1, 77 },
+ { 25, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 77 },
+ { 18, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 35, 8, 1, 24 },
+ { 17, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 35, 8, 1, 24 },
+ { 29, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 35, 0, 1, 24 },
+ { 1, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 4, 35, 4, 1, 24 },
+ { 18, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 35, 8, 1, 79 },
+ { 0, 17, 230, 5, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 35, 4, 1, 79 },
+ { 0, 17, 220, 5, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 35, 4, 1, 79 },
+ { 17, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 35, 8, 1, 79 },
+ { 25, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 35, 0, 1, 79 },
+ { 18, 0, 0, 0, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 86 },
+ { 1, 0, 0, 0, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 86 },
+ { 0, 17, 0, 5, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 86 },
+ { 25, 0, 0, 0, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 86 },
+ { 17, 0, 0, 0, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 86 },
+ { 0, 17, 9, 5, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 86 },
+ { 18, 0, 0, 0, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 27 },
+ { 15, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, -928}, {0, -928}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 28, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 0, 1, 2 },
+ { 17, 0, 0, 0, -1, 0, 16, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 1, 4 },
+ { 15, 0, 0, 0, -1, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 17, 0, 0, 0, -1, 0, 23, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 3, 3 },
+ { 28, 10, 0, 0, -1, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 255}, {1, 255}, {1, 255} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 257}, {1, 257}, {1, 257} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 259}, {1, 259}, {1, 259} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 261}, {1, 261}, {1, 261} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 263}, {1, 263}, {1, 263} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 265}, {1, 265}, {1, 265} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 267}, {1, 267}, {1, 267} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 269}, {1, 269}, {1, 269} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 271}, {1, 271}, {1, 271} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 273}, {1, 273}, {1, 273} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 275}, {1, 275}, {1, 275} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 277}, {1, 277}, {1, 277} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 279}, {1, 279}, {1, 279} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 281}, {1, 281}, {1, 281} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 283}, {1, 283}, {1, 283} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 285}, {1, 285}, {1, 285} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 287}, {1, 287}, {1, 287} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 289}, {1, 289}, {1, 289} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 291}, {1, 291}, {1, 291} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 293}, {1, 293}, {1, 293} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 295}, {1, 295}, {1, 295} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 297}, {1, 297}, {1, 297} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 299}, {1, 299}, {1, 299} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 301}, {1, 301}, {1, 301} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 303}, {1, 303}, {1, 303} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 305}, {1, 305}, {1, 305} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 307}, {1, 307}, {1, 307} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 309}, {1, 309}, {1, 309} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 311}, {1, 311}, {1, 311} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 313}, {1, 313}, {1, 313} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 315}, {1, 315}, {1, 315} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 317}, {1, 317}, {1, 317} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 319}, {1, 319}, {1, 319} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 321}, {1, 321}, {1, 321} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 323}, {1, 323}, {1, 323} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 325}, {1, 325}, {1, 325} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 327}, {1, 327}, {1, 327} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 329}, {1, 329}, {1, 329} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 331}, {1, 331}, {1, 331} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 333}, {1, 333}, {1, 333} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 335}, {1, 335}, {1, 335} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 337}, {1, 337}, {1, 337} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 339}, {1, 339}, {1, 339} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 341}, {1, 341}, {1, 341} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 343}, {1, 343}, {1, 343} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 345}, {1, 345}, {1, 345} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 347}, {1, 347}, {1, 347} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 349}, {1, 349}, {1, 349} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 351}, {1, 351}, {1, 351} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 353}, {1, 353}, {1, 353} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 355}, {1, 355}, {1, 355} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 357}, {1, 357}, {1, 357} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 359}, {1, 359}, {1, 359} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 361}, {1, 361}, {1, 361} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 363}, {1, 363}, {1, 363} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 365}, {1, 365}, {1, 365} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 367}, {1, 367}, {1, 367} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 369}, {1, 369}, {1, 369} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 371}, {1, 371}, {1, 371} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 373}, {1, 373}, {1, 373} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 375}, {1, 375}, {1, 375} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 377}, {1, 377}, {1, 377} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 379}, {1, 379}, {1, 379} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 381}, {1, 381}, {1, 381} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 383}, {1, 383}, {1, 383} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 385}, {1, 385}, {1, 385} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 387}, {1, 387}, {1, 387} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 389}, {1, 389}, {1, 389} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 391}, {1, 391}, {1, 391} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 393}, {1, 393}, {1, 393} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 395}, {1, 395}, {1, 395} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 397}, {1, 397}, {1, 397} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 399}, {1, 399}, {1, 399} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 401}, {1, 401}, {1, 401} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 403}, {1, 403}, {1, 403} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 405}, {1, 405}, {1, 405} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 407}, {1, 407}, {1, 407} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 409}, {1, 409}, {1, 409} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 411}, {1, 411}, {1, 411} }, 0, 10, 14, 6, 3, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {1, 413}, {1, 413}, {1, 413} }, 0, 10, 14, 6, 3, 28 },
+ { 18, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 86 },
+ { 1, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 86 },
+ { 0, 17, 0, 5, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 86 },
+ { 25, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 86 },
+ { 0, 17, 9, 5, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 86 },
+ { 3, 0, 0, 0, 0, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 86 },
+ { 3, 0, 0, 0, 1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 86 },
+ { 3, 0, 0, 0, 2, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 86 },
+ { 3, 0, 0, 0, 3, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 86 },
+ { 3, 0, 0, 0, 4, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 86 },
+ { 3, 0, 0, 0, 5, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 86 },
+ { 3, 0, 0, 0, 6, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 86 },
+ { 3, 0, 0, 0, 7, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 86 },
+ { 3, 0, 0, 0, 8, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 86 },
+ { 3, 0, 0, 0, 9, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 86 },
+ { 18, 0, 0, 0, -1, 0, 2, 5, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 12, 10, 25, 8, 1, 26 },
+ { 18, 0, 0, 0, -1, 0, 2, 5, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 13, 10, 26, 8, 1, 26 },
+ { 11, 0, 0, 0, -1, 0, 2, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 36, 0, 0, 0 },
+ { 12, 0, 0, 0, -1, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 0 },
+ { 18, 0, 0, 0, -1, 0, 1, 5, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 8, 3, 37 },
+ { 18, 0, 0, 0, -1, 0, 13, 5, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 8, 3, 37 },
+ { 18, 0, 0, 0, -1, 0, 6, 5, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 8, 3, 37 },
+ { 18, 0, 0, 0, -1, 0, 11, 5, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 8, 3, 37 },
+ { 13, 0, 0, 0, -1, 0, 0, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 0, 0 },
+ { 18, 0, 0, 0, -1, 0, 8, 5, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 8, 3, 37 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {1, 427}, {1, 424}, {0, 0} }, 0, 10, 14, 6, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {1, 433}, {1, 430}, {0, 0} }, 0, 10, 14, 6, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {1, 439}, {1, 436}, {0, 0} }, 0, 10, 14, 6, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {1, 446}, {1, 442}, {0, 0} }, 0, 10, 14, 6, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {1, 454}, {1, 450}, {0, 0} }, 0, 10, 14, 6, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {1, 461}, {1, 458}, {0, 1} }, 0, 10, 14, 6, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {1, 461}, {1, 458}, {0, 0} }, 0, 10, 14, 6, 3, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {1, 473}, {1, 470}, {0, 0} }, 0, 10, 14, 6, 3, 6 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {1, 479}, {1, 476}, {0, 0} }, 0, 10, 14, 6, 3, 6 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {1, 485}, {1, 482}, {0, 0} }, 0, 10, 14, 6, 3, 6 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {1, 491}, {1, 488}, {0, 0} }, 0, 10, 14, 6, 3, 6 },
+ { 15, 0, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {1, 497}, {1, 494}, {0, 0} }, 0, 10, 14, 6, 3, 6 },
+ { 18, 1, 0, 0, -1, 0, 4, 3, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 9, 15, 8, 3, 7 },
+ { 0, 17, 26, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 7 },
+ { 18, 1, 0, 0, -1, 0, 1, 3, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 9, 15, 8, 3, 7 },
+ { 18, 1, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 9, 15, 8, 3, 7 },
+ { 26, 3, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 7 },
+ { 18, 13, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 3, 8 },
+ { 28, 13, 0, 0, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 8 },
+ { 18, 13, 0, 0, -1, 0, 1, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 0, 8 },
+ { 22, 10, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 8 },
+ { 13, 18, 0, 0, -1, 0, 5, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 0 },
+ { 27, 13, 0, 0, -1, 0, 6, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 3, 8 },
+ { 0, 17, 0, 5, -1, 0, 6, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 2, 1 },
+ { 25, 10, 0, 0, -1, 0, 8, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 15, 10, 11, 0, 2 },
+ { 25, 10, 0, 0, -1, 0, 8, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 11, 3, 2 },
+ { 25, 10, 0, 0, -1, 0, 8, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 0, 0, 2 },
+ { 25, 10, 0, 0, -1, 0, 8, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 14, 10, 11, 0, 2 },
+ { 25, 10, 0, 0, -1, 0, 8, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 15, 10, 0, 0, 2 },
+ { 25, 10, 0, 0, -1, 0, 8, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 8, 0, 0, 2 },
+ { 21, 10, 0, 0, -1, 0, 8, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 3, 2 },
+ { 22, 10, 0, 0, -1, 0, 8, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 3, 2 },
+ { 25, 10, 0, 0, -1, 0, 8, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 0, 2 },
+ { 25, 10, 0, 0, -1, 0, 1, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 0, 2 },
+ { 20, 10, 0, 0, -1, 0, 1, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 11, 3, 2 },
+ { 19, 10, 0, 0, -1, 0, 1, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 17, 16, 0, 3, 2 },
+ { 21, 10, 0, 0, -1, 0, 1, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 0, 2 },
+ { 22, 10, 0, 0, -1, 0, 1, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 0, 2 },
+ { 21, 10, 0, 0, -1, 0, 1, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 3, 2 },
+ { 22, 10, 0, 0, -1, 0, 1, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 3, 2 },
+ { 25, 10, 0, 0, -1, 0, 6, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 1, 2 },
+ { 21, 10, 0, 0, -1, 0, 7, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 0, 2 },
+ { 22, 10, 0, 0, -1, 0, 7, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 0, 2 },
+ { 25, 6, 0, 0, -1, 0, 1, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 15, 1, 11, 0, 2 },
+ { 25, 10, 0, 0, -1, 0, 1, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 11, 3, 2 },
+ { 25, 6, 0, 0, -1, 0, 1, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 13, 1, 10, 0, 2 },
+ { 25, 10, 0, 0, -1, 0, 1, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 15, 7, 0, 0, 2 },
+ { 25, 6, 0, 0, -1, 0, 1, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 14, 7, 11, 0, 2 },
+ { 25, 10, 0, 0, -1, 0, 1, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 8, 12, 0, 2 },
+ { 21, 10, 0, 0, -1, 1, 1, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 0, 2 },
+ { 22, 10, 0, 0, -1, -1, 1, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 0, 2 },
+ { 21, 10, 0, 0, -1, 1, 1, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 3, 2 },
+ { 22, 10, 0, 0, -1, -1, 1, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 3, 2 },
+ { 25, 4, 0, 0, -1, 0, 1, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 0, 2 },
+ { 26, 3, 0, 0, -1, 0, 1, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 0, 2 },
+ { 20, 3, 0, 0, -1, 0, 1, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 11, 3, 2 },
+ { 26, 10, 0, 0, -1, 1, 1, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 0, 2 },
+ { 26, 10, 0, 0, -1, -1, 1, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 0, 2 },
+ { 26, 10, 0, 0, -1, 0, 1, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 0, 2 },
+ { 27, 4, 0, 0, -1, 0, 1, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 11, 0, 0, 2 },
+ { 25, 4, 0, 0, -1, 0, 1, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 0, 2 },
+ { 18, 13, 0, 0, -1, 0, 6, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 8 },
+ { 10, 18, 0, 5, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 24, 4, 2, 2 },
+ { 25, 10, 0, 0, -1, 0, 1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 8, 12, 0, 2 },
+ { 25, 10, 0, 0, -1, 0, 1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 0, 2 },
+ { 25, 4, 0, 0, -1, 0, 1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 0, 2 },
+ { 27, 4, 0, 0, -1, 0, 1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 11, 0, 0, 2 },
+ { 25, 4, 0, 0, -1, 0, 1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 0, 2 },
+ { 25, 10, 0, 0, -1, 0, 1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 13, 16, 0, 0, 2 },
+ { 21, 10, 0, 0, -1, 1, 1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 0, 2 },
+ { 22, 10, 0, 0, -1, -1, 1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 0, 2 },
+ { 26, 3, 0, 0, -1, 0, 1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 0, 2 },
+ { 25, 6, 0, 0, -1, 0, 1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 15, 1, 11, 0, 2 },
+ { 20, 3, 0, 0, -1, 0, 1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 11, 3, 2 },
+ { 25, 6, 0, 0, -1, 0, 1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 13, 1, 10, 3, 2 },
+ { 25, 6, 0, 0, -1, 0, 1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 0, 2 },
+ { 3, 2, 0, 0, 0, 0, 1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 3, 2 },
+ { 3, 2, 0, 0, 1, 0, 1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 3, 2 },
+ { 3, 2, 0, 0, 2, 0, 1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 3, 2 },
+ { 3, 2, 0, 0, 3, 0, 1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 3, 2 },
+ { 3, 2, 0, 0, 4, 0, 1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 3, 2 },
+ { 3, 2, 0, 0, 5, 0, 1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 3, 2 },
+ { 3, 2, 0, 0, 6, 0, 1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 3, 2 },
+ { 3, 2, 0, 0, 7, 0, 1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 3, 2 },
+ { 3, 2, 0, 0, 8, 0, 1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 3, 2 },
+ { 3, 2, 0, 0, 9, 0, 1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 3, 2 },
+ { 25, 6, 0, 0, -1, 0, 1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 14, 7, 11, 0, 2 },
+ { 25, 10, 0, 0, -1, 0, 1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 15, 7, 0, 0, 2 },
+ { 26, 10, 0, 0, -1, 2, 1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 0, 2 },
+ { 26, 10, 0, 0, -1, 0, 1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 0, 2 },
+ { 26, 10, 0, 0, -1, -2, 1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 0, 2 },
+ { 14, 0, 0, 0, -1, 0, 1, 1, 80, { {0, 32}, {0, 0}, {0, 0}, {0, 32} }, 0, 10, 16, 7, 3, 3 },
+ { 21, 10, 0, 0, -1, 2, 1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 0, 2 },
+ { 22, 10, 0, 0, -1, -2, 1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 0, 2 },
+ { 28, 10, 0, 0, -1, 0, 1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 0, 2 },
+ { 19, 10, 0, 0, -1, 0, 1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 17, 16, 0, 3, 2 },
+ { 15, 0, 0, 0, -1, 0, 1, 1, 80, { {0, 0}, {0, -32}, {0, -32}, {0, 0} }, 0, 10, 16, 6, 3, 3 },
+ { 21, 10, 0, 0, -1, 1, 6, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 3, 2 },
+ { 22, 10, 0, 0, -1, -1, 6, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 3, 2 },
+ { 25, 10, 0, 0, -1, 0, 1, 2, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 12, 3, 2 },
+ { 21, 10, 0, 0, -1, 1, 1, 2, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 3, 2 },
+ { 22, 10, 0, 0, -1, -1, 1, 2, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 3, 2 },
+ { 25, 10, 0, 0, -1, 0, 1, 2, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 11, 3, 2 },
+ { 25, 10, 0, 0, -1, 0, 1, 2, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 7, 0, 3, 2 },
+ { 18, 0, 0, 0, -1, 0, 1, 2, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 16, 8, 3, 35 },
+ { 18, 0, 0, 0, -1, 0, 1, 2, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 7, 8, 3, 35 },
+ { 17, 0, 0, 0, -1, 0, 1, 2, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 7, 8, 3, 2 },
+ { 17, 0, 0, 0, -1, 0, 1, 2, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 7, 4, 3, 2 },
+ { 18, 0, 0, 0, -1, 0, 1, 2, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 16, 8, 0, 26 },
+ { 18, 0, 0, 0, -1, 0, 1, 2, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 16, 8, 3, 26 },
+ { 27, 4, 0, 0, -1, 0, 1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 3, 2 },
+ { 27, 4, 0, 0, -1, 0, 1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 11, 0, 3, 2 },
+ { 26, 10, 0, 0, -1, 0, 1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 3, 2 },
+ { 29, 10, 0, 0, -1, 0, 1, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 3, 2 },
+ { 29, 10, 0, 0, -1, 0, 1, 2, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
+ { 26, 10, 0, 0, -1, 0, 1, 2, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
+ { 10, 10, 0, 5, -1, 0, 4, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 23, 4, 0, 2 },
+ { 29, 10, 0, 0, -1, 0, 3, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 31, 0, 0, 2 },
+ { 29, 10, 0, 0, -1, 0, 1, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 13, 18, 0, 0, -1, 0, 1, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 0 },
+ { 18, 0, 0, 0, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 49 },
+ { 25, 0, 0, 0, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 2 },
+ { 25, 10, 0, 0, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 2 },
+ { 5, 0, 0, 0, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 29, 0, 0, 0, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 4, 10, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 4 },
+ { 5, 10, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 4 },
+ { 29, 10, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 4 },
+ { 5, 10, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 4 },
+ { 29, 10, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 4 },
+ { 29, 0, 0, 0, -1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 4 },
+ { 18, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 74 },
+ { 18, 0, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 75 },
+ { 5, 2, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 18, 0, 0, 0, -1, 0, 5, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 39 },
+ { 18, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 39 },
+ { 5, 0, 0, 0, -1, 0, 5, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 39 },
+ { 18, 0, 0, 0, -1, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 39 },
+ { 18, 0, 0, 0, -1, 0, 5, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 40 },
+ { 4, 0, 0, 0, -1, 0, 5, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 40 },
+ { 18, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 120 },
+ { 0, 17, 230, 5, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 120 },
+ { 18, 0, 0, 0, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 50 },
+ { 25, 0, 0, 0, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 50 },
+ { 18, 0, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 60 },
+ { 25, 0, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 60 },
+ { 4, 0, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 60 },
+ { 14, 0, 0, 0, -1, 0, 5, 3, 0, { {0, 40}, {0, 0}, {0, 0}, {0, 40} }, 0, 10, 14, 7, 3, 41 },
+ { 14, 0, 0, 0, -1, 0, 7, 3, 0, { {0, 40}, {0, 0}, {0, 0}, {0, 40} }, 0, 10, 14, 7, 3, 41 },
+ { 15, 0, 0, 0, -1, 0, 5, 3, 0, { {0, 0}, {0, -40}, {0, -40}, {0, 0} }, 0, 10, 14, 6, 1, 41 },
+ { 15, 0, 0, 0, -1, 0, 7, 3, 0, { {0, 0}, {0, -40}, {0, -40}, {0, 0} }, 0, 10, 14, 6, 1, 41 },
+ { 18, 0, 0, 0, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 51 },
+ { 18, 0, 0, 0, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 52 },
+ { 3, 0, 0, 0, 0, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 52 },
+ { 3, 0, 0, 0, 1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 52 },
+ { 3, 0, 0, 0, 2, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 52 },
+ { 3, 0, 0, 0, 3, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 52 },
+ { 3, 0, 0, 0, 4, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 52 },
+ { 3, 0, 0, 0, 5, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 52 },
+ { 3, 0, 0, 0, 6, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 52 },
+ { 3, 0, 0, 0, 7, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 52 },
+ { 3, 0, 0, 0, 8, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 52 },
+ { 3, 0, 0, 0, 9, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 52 },
+ { 14, 0, 0, 0, -1, 0, 18, 3, 0, { {0, 40}, {0, 0}, {0, 0}, {0, 40} }, 0, 10, 14, 7, 3, 136 },
+ { 15, 0, 0, 0, -1, 0, 18, 3, 0, { {0, 0}, {0, -40}, {0, -40}, {0, 0} }, 0, 10, 14, 6, 1, 136 },
+ { 18, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 106 },
+ { 18, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 103 },
+ { 25, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 103 },
+ { 14, 0, 0, 0, -1, 0, 24, 3, 0, { {0, 39}, {0, 0}, {0, 0}, {0, 39} }, 0, 10, 14, 7, 3, 161 },
+ { 15, 0, 0, 0, -1, 0, 24, 3, 0, { {0, 0}, {0, -39}, {0, -39}, {0, 0} }, 0, 10, 14, 6, 1, 161 },
+ { 18, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 110 },
+ { 17, 0, 0, 0, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 17, 0, 0, 0, -1, 0, 24, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 3, 3 },
+ { 18, 1, 0, 0, -1, 0, 7, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 53 },
+ { 18, 1, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 87 },
+ { 25, 1, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 87 },
+ { 5, 1, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 87 },
+ { 18, 1, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 118 },
+ { 29, 1, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 118 },
+ { 5, 1, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 118 },
+ { 18, 1, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 117 },
+ { 5, 1, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 117 },
+ { 18, 1, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 128 },
+ { 5, 1, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 128 },
+ { 18, 1, 0, 0, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 64 },
+ { 5, 1, 0, 0, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 64 },
+ { 5, 1, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 64 },
+ { 25, 10, 0, 0, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 64 },
+ { 18, 1, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 76 },
+ { 25, 1, 0, 0, -1, 0, 10, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 76 },
+ { 18, 1, 0, 0, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 98 },
+ { 18, 1, 0, 0, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 97 },
+ { 5, 1, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 97 },
+ { 18, 1, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 61 },
+ { 0, 17, 0, 5, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 61 },
+ { 0, 17, 220, 5, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 61 },
+ { 0, 17, 230, 5, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 61 },
+ { 18, 1, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 61 },
+ { 0, 17, 1, 5, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 61 },
+ { 0, 17, 9, 5, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 61 },
+ { 5, 1, 0, 0, 1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 61 },
+ { 5, 1, 0, 0, 2, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 61 },
+ { 5, 1, 0, 0, 3, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 61 },
+ { 5, 1, 0, 0, 4, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 61 },
+ { 5, 1, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 61 },
+ { 5, 1, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 61 },
+ { 25, 1, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 61 },
+ { 25, 1, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 61 },
+ { 25, 1, 0, 0, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 61 },
+ { 18, 1, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 88 },
+ { 5, 1, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 88 },
+ { 25, 1, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 88 },
+ { 18, 1, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 116 },
+ { 5, 1, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 116 },
+ { 18, 1, 0, 2, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 112 },
+ { 18, 1, 0, 3, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 112 },
+ { 18, 1, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 112 },
+ { 29, 1, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 112 },
+ { 18, 1, 0, 4, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 112 },
+ { 0, 17, 230, 5, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 112 },
+ { 0, 17, 220, 5, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 112 },
+ { 5, 1, 0, 2, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 112 },
+ { 5, 1, 0, 3, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 112 },
+ { 25, 1, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 112 },
+ { 25, 1, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 1, 112 },
+ { 18, 1, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 80 },
+ { 25, 10, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 80 },
+ { 18, 1, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 89 },
+ { 5, 1, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 89 },
+ { 18, 1, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 90 },
+ { 5, 1, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 90 },
+ { 18, 1, 0, 2, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 121 },
+ { 18, 1, 0, 3, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 121 },
+ { 25, 1, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 121 },
+ { 5, 1, 0, 3, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 121 },
+ { 5, 1, 0, 2, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 121 },
+ { 5, 1, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 121 },
+ { 18, 1, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 91 },
+ { 14, 1, 0, 0, -1, 0, 17, 3, 0, { {0, 64}, {0, 0}, {0, 0}, {0, 64} }, 0, 10, 14, 7, 3, 130 },
+ { 15, 1, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {0, -64}, {0, -64}, {0, 0} }, 0, 10, 14, 6, 1, 130 },
+ { 5, 1, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 130 },
+ { 18, 13, 0, 4, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 144 },
+ { 18, 13, 0, 2, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 144 },
+ { 18, 13, 0, 3, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 144 },
+ { 0, 17, 230, 5, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 144 },
+ { 3, 5, 0, 0, 0, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 144 },
+ { 3, 5, 0, 0, 1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 144 },
+ { 3, 5, 0, 0, 2, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 144 },
+ { 3, 5, 0, 0, 3, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 144 },
+ { 3, 5, 0, 0, 4, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 144 },
+ { 3, 5, 0, 0, 5, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 144 },
+ { 3, 5, 0, 0, 6, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 144 },
+ { 3, 5, 0, 0, 7, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 144 },
+ { 3, 5, 0, 0, 8, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 144 },
+ { 3, 5, 0, 0, 9, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 144 },
+ { 5, 5, 0, 0, 1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 8 },
+ { 5, 5, 0, 0, 2, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 8 },
+ { 5, 5, 0, 0, 3, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 8 },
+ { 5, 5, 0, 0, 4, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 8 },
+ { 5, 5, 0, 0, 5, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 8 },
+ { 5, 5, 0, 0, 6, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 8 },
+ { 5, 5, 0, 0, 7, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 8 },
+ { 5, 5, 0, 0, 8, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 8 },
+ { 5, 5, 0, 0, 9, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 8 },
+ { 5, 5, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 8 },
+ { 18, 1, 0, 0, -1, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 156 },
+ { 0, 17, 230, 5, -1, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 156 },
+ { 20, 1, 0, 0, -1, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 156 },
+ { 0, 17, 220, 5, -1, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 8 },
+ { 18, 1, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 147 },
+ { 5, 1, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 147 },
+ { 18, 13, 0, 2, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 148 },
+ { 18, 13, 0, 3, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 148 },
+ { 18, 13, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 148 },
+ { 0, 17, 220, 5, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 148 },
+ { 0, 17, 230, 5, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 148 },
+ { 5, 13, 0, 2, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 148 },
+ { 5, 13, 0, 3, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 148 },
+ { 25, 13, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 12, 1, 148 },
+ { 18, 1, 0, 2, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 158 },
+ { 18, 1, 0, 3, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 158 },
+ { 0, 17, 230, 5, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 158 },
+ { 0, 17, 220, 5, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 158 },
+ { 25, 1, 0, 0, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 12, 1, 158 },
+ { 18, 1, 0, 2, -1, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 153 },
+ { 18, 1, 0, 0, -1, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 153 },
+ { 18, 1, 0, 3, -1, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 153 },
+ { 5, 1, 0, 0, -1, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 153 },
+ { 5, 1, 0, 3, -1, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 153 },
+ { 5, 1, 0, 2, -1, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 153 },
+ { 5, 1, 0, 4, -1, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 153 },
+ { 18, 1, 0, 0, -1, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 149 },
+ { 1, 0, 0, 0, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 94 },
+ { 0, 17, 0, 5, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 94 },
+ { 18, 0, 0, 0, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 94 },
+ { 0, 17, 9, 5, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 94 },
+ { 25, 0, 0, 0, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 94 },
+ { 25, 0, 0, 0, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 1, 94 },
+ { 5, 10, 0, 0, 1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 1, 94 },
+ { 5, 10, 0, 0, 2, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 1, 94 },
+ { 5, 10, 0, 0, 3, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 1, 94 },
+ { 5, 10, 0, 0, 4, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 1, 94 },
+ { 5, 10, 0, 0, 5, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 1, 94 },
+ { 5, 10, 0, 0, 6, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 1, 94 },
+ { 5, 10, 0, 0, 7, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 1, 94 },
+ { 5, 10, 0, 0, 8, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 1, 94 },
+ { 5, 10, 0, 0, 9, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 1, 94 },
+ { 5, 10, 0, 0, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 1, 94 },
+ { 3, 0, 0, 0, 0, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 14, 9, 1, 94 },
+ { 3, 0, 0, 0, 1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 14, 9, 1, 94 },
+ { 3, 0, 0, 0, 2, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 14, 9, 1, 94 },
+ { 3, 0, 0, 0, 3, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 14, 9, 1, 94 },
+ { 3, 0, 0, 0, 4, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 14, 9, 1, 94 },
+ { 3, 0, 0, 0, 5, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 14, 9, 1, 94 },
+ { 3, 0, 0, 0, 6, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 14, 9, 1, 94 },
+ { 3, 0, 0, 0, 7, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 14, 9, 1, 94 },
+ { 3, 0, 0, 0, 8, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 14, 9, 1, 94 },
+ { 3, 0, 0, 0, 9, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 14, 9, 1, 94 },
+ { 0, 17, 9, 5, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 94 },
+ { 18, 0, 0, 0, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 94 },
+ { 0, 17, 0, 5, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 94 },
+ { 0, 17, 9, 5, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 6, 4, 1, 94 },
+ { 0, 17, 0, 5, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 92 },
+ { 1, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 92 },
+ { 18, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 92 },
+ { 18, 0, 0, 0, -1, 0, 11, 3, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 92 },
+ { 0, 17, 9, 5, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 92 },
+ { 0, 17, 7, 5, -1, 0, 11, 3, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 92 },
+ { 25, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 92 },
+ { 10, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 7, 16, 13, 9, 0, 92 },
+ { 25, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 92 },
+ { 0, 17, 0, 5, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 92 },
+ { 10, 0, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 7, 16, 13, 9, 0, 92 },
+ { 18, 0, 0, 0, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 101 },
+ { 3, 0, 0, 0, 0, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 101 },
+ { 3, 0, 0, 0, 1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 101 },
+ { 3, 0, 0, 0, 2, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 101 },
+ { 3, 0, 0, 0, 3, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 101 },
+ { 3, 0, 0, 0, 4, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 101 },
+ { 3, 0, 0, 0, 5, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 101 },
+ { 3, 0, 0, 0, 6, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 101 },
+ { 3, 0, 0, 0, 7, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 101 },
+ { 3, 0, 0, 0, 8, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 101 },
+ { 3, 0, 0, 0, 9, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 101 },
+ { 0, 17, 230, 5, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 96 },
+ { 18, 0, 0, 0, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 96 },
+ { 0, 17, 0, 5, -1, 0, 13, 3, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 96 },
+ { 0, 17, 0, 5, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 96 },
+ { 1, 0, 0, 0, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 96 },
+ { 0, 17, 0, 5, -1, 0, 13, 3, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 96 },
+ { 0, 17, 9, 5, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 96 },
+ { 3, 0, 0, 0, 0, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 96 },
+ { 3, 0, 0, 0, 1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 96 },
+ { 3, 0, 0, 0, 2, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 96 },
+ { 3, 0, 0, 0, 3, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 96 },
+ { 3, 0, 0, 0, 4, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 96 },
+ { 3, 0, 0, 0, 5, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 96 },
+ { 3, 0, 0, 0, 6, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 96 },
+ { 3, 0, 0, 0, 7, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 96 },
+ { 3, 0, 0, 0, 8, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 96 },
+ { 3, 0, 0, 0, 9, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 96 },
+ { 25, 0, 0, 0, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 96 },
+ { 25, 0, 0, 0, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 96 },
+ { 18, 0, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 96 },
+ { 1, 0, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 96 },
+ { 18, 0, 0, 0, -1, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 96 },
+ { 18, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 111 },
+ { 0, 17, 7, 5, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 111 },
+ { 25, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 111 },
+ { 25, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 20, 0, 1, 111 },
+ { 0, 17, 0, 5, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 100 },
+ { 1, 0, 0, 0, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 100 },
+ { 18, 0, 0, 0, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 100 },
+ { 1, 0, 9, 0, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 100 },
+ { 18, 0, 0, 0, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 7, 10, 14, 8, 1, 100 },
+ { 25, 0, 0, 0, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 100 },
+ { 25, 0, 0, 0, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 100 },
+ { 25, 0, 0, 0, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 100 },
+ { 0, 17, 0, 5, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 100 },
+ { 0, 17, 7, 5, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 100 },
+ { 25, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 12, 1, 100 },
+ { 1, 0, 0, 0, -1, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 100 },
+ { 0, 17, 0, 5, -1, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 100 },
+ { 3, 0, 0, 0, 0, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 100 },
+ { 3, 0, 0, 0, 1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 100 },
+ { 3, 0, 0, 0, 2, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 100 },
+ { 3, 0, 0, 0, 3, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 100 },
+ { 3, 0, 0, 0, 4, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 100 },
+ { 3, 0, 0, 0, 5, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 100 },
+ { 3, 0, 0, 0, 6, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 100 },
+ { 3, 0, 0, 0, 7, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 100 },
+ { 3, 0, 0, 0, 8, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 100 },
+ { 3, 0, 0, 0, 9, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 100 },
+ { 18, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 100 },
+ { 25, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 20, 0, 1, 100 },
+ { 18, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 100 },
+ { 25, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 100 },
+ { 25, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 100 },
+ { 5, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 20 },
+ { 18, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 109 },
+ { 1, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 109 },
+ { 0, 17, 0, 5, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 109 },
+ { 1, 0, 9, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 109 },
+ { 0, 17, 7, 5, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 109 },
+ { 25, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 109 },
+ { 25, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 109 },
+ { 0, 17, 0, 5, -1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 109 },
+ { 18, 0, 0, 0, -1, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 109 },
+ { 0, 17, 0, 5, -1, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 109 },
+ { 18, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 129 },
+ { 25, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 129 },
+ { 18, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 123 },
+ { 0, 17, 0, 5, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 123 },
+ { 1, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 123 },
+ { 0, 17, 7, 5, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 123 },
+ { 0, 17, 9, 5, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 123 },
+ { 3, 0, 0, 0, 0, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 123 },
+ { 3, 0, 0, 0, 1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 123 },
+ { 3, 0, 0, 0, 2, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 123 },
+ { 3, 0, 0, 0, 3, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 123 },
+ { 3, 0, 0, 0, 4, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 123 },
+ { 3, 0, 0, 0, 5, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 123 },
+ { 3, 0, 0, 0, 6, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 123 },
+ { 3, 0, 0, 0, 7, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 123 },
+ { 3, 0, 0, 0, 8, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 123 },
+ { 3, 0, 0, 0, 9, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 123 },
+ { 0, 17, 0, 5, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 107 },
+ { 0, 17, 0, 5, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 107 },
+ { 1, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 107 },
+ { 18, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 107 },
+ { 0, 17, 7, 5, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 7, 5, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 107 },
+ { 18, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 19, 8, 1, 107 },
+ { 1, 0, 0, 0, -1, 0, 16, 3, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 107 },
+ { 1, 0, 0, 0, -1, 0, 16, 3, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 107 },
+ { 1, 0, 9, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 107 },
+ { 18, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 107 },
+ { 0, 17, 230, 5, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 107 },
+ { 18, 0, 0, 0, -1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 135 },
+ { 1, 0, 0, 0, -1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 135 },
+ { 0, 17, 0, 5, -1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 135 },
+ { 0, 17, 9, 5, -1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 135 },
+ { 0, 17, 7, 5, -1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 135 },
+ { 25, 0, 0, 0, -1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 135 },
+ { 25, 0, 0, 0, -1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 135 },
+ { 25, 0, 0, 0, -1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 135 },
+ { 3, 0, 0, 0, 0, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 135 },
+ { 3, 0, 0, 0, 1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 135 },
+ { 3, 0, 0, 0, 2, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 135 },
+ { 3, 0, 0, 0, 3, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 135 },
+ { 3, 0, 0, 0, 4, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 135 },
+ { 3, 0, 0, 0, 5, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 135 },
+ { 3, 0, 0, 0, 6, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 135 },
+ { 3, 0, 0, 0, 7, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 135 },
+ { 3, 0, 0, 0, 8, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 135 },
+ { 3, 0, 0, 0, 9, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 135 },
+ { 25, 0, 0, 0, -1, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 135 },
+ { 0, 17, 230, 5, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 135 },
+ { 18, 0, 0, 0, -1, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 135 },
+ { 18, 0, 0, 0, -1, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 135 },
+ { 18, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 124 },
+ { 1, 0, 0, 0, -1, 0, 16, 3, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 124 },
+ { 1, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 124 },
+ { 0, 17, 0, 5, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 124 },
+ { 0, 17, 0, 5, -1, 0, 16, 3, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 124 },
+ { 1, 0, 0, 0, -1, 0, 16, 3, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 124 },
+ { 0, 17, 9, 5, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 124 },
+ { 0, 17, 7, 5, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 124 },
+ { 25, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 124 },
+ { 3, 0, 0, 0, 0, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 124 },
+ { 3, 0, 0, 0, 1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 124 },
+ { 3, 0, 0, 0, 2, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 124 },
+ { 3, 0, 0, 0, 3, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 124 },
+ { 3, 0, 0, 0, 4, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 124 },
+ { 3, 0, 0, 0, 5, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 124 },
+ { 3, 0, 0, 0, 6, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 124 },
+ { 3, 0, 0, 0, 7, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 124 },
+ { 3, 0, 0, 0, 8, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 124 },
+ { 3, 0, 0, 0, 9, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 124 },
+ { 18, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 122 },
+ { 1, 0, 0, 0, -1, 0, 16, 3, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 122 },
+ { 1, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 122 },
+ { 0, 17, 0, 5, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 122 },
+ { 1, 0, 0, 0, -1, 0, 16, 3, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 122 },
+ { 0, 17, 9, 5, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 122 },
+ { 0, 17, 7, 5, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 122 },
+ { 25, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 20, 0, 1, 122 },
+ { 25, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 122 },
+ { 25, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 8, 0, 1, 122 },
+ { 25, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 122 },
+ { 25, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 122 },
+ { 18, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 122 },
+ { 0, 17, 0, 5, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 122 },
+ { 18, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 114 },
+ { 1, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 114 },
+ { 0, 17, 0, 5, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 114 },
+ { 0, 17, 9, 5, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 114 },
+ { 25, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 114 },
+ { 25, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 114 },
+ { 3, 0, 0, 0, 0, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 114 },
+ { 3, 0, 0, 0, 1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 114 },
+ { 3, 0, 0, 0, 2, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 114 },
+ { 3, 0, 0, 0, 3, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 114 },
+ { 3, 0, 0, 0, 4, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 114 },
+ { 3, 0, 0, 0, 5, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 114 },
+ { 3, 0, 0, 0, 6, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 114 },
+ { 3, 0, 0, 0, 7, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 114 },
+ { 3, 0, 0, 0, 8, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 114 },
+ { 3, 0, 0, 0, 9, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 114 },
+ { 25, 10, 0, 0, -1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 20, 0, 1, 33 },
+ { 18, 0, 0, 0, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 102 },
+ { 0, 17, 0, 5, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 102 },
+ { 1, 0, 0, 0, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 102 },
+ { 1, 0, 9, 0, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 102 },
+ { 0, 17, 7, 5, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 102 },
+ { 18, 0, 0, 0, -1, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 102 },
+ { 25, 0, 0, 0, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 102 },
+ { 3, 0, 0, 0, 0, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 102 },
+ { 3, 0, 0, 0, 1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 102 },
+ { 3, 0, 0, 0, 2, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 102 },
+ { 3, 0, 0, 0, 3, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 102 },
+ { 3, 0, 0, 0, 4, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 102 },
+ { 3, 0, 0, 0, 5, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 102 },
+ { 3, 0, 0, 0, 6, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 102 },
+ { 3, 0, 0, 0, 7, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 102 },
+ { 3, 0, 0, 0, 8, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 102 },
+ { 3, 0, 0, 0, 9, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 102 },
+ { 18, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 35, 8, 1, 126 },
+ { 18, 0, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 35, 8, 1, 126 },
+ { 0, 17, 0, 5, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 35, 4, 1, 126 },
+ { 1, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 4, 35, 4, 1, 126 },
+ { 1, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 35, 4, 1, 126 },
+ { 0, 17, 9, 5, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 35, 4, 1, 126 },
+ { 3, 0, 0, 0, 0, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 126 },
+ { 3, 0, 0, 0, 1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 126 },
+ { 3, 0, 0, 0, 2, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 126 },
+ { 3, 0, 0, 0, 3, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 126 },
+ { 3, 0, 0, 0, 4, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 126 },
+ { 3, 0, 0, 0, 5, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 126 },
+ { 3, 0, 0, 0, 6, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 126 },
+ { 3, 0, 0, 0, 7, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 126 },
+ { 3, 0, 0, 0, 8, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 126 },
+ { 3, 0, 0, 0, 9, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 126 },
+ { 5, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 35, 0, 1, 126 },
+ { 25, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 126 },
+ { 29, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 35, 0, 1, 126 },
+ { 18, 0, 0, 0, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 35, 8, 1, 126 },
+ { 18, 0, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 142 },
+ { 1, 0, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 142 },
+ { 0, 17, 0, 5, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 142 },
+ { 0, 17, 9, 5, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 142 },
+ { 0, 17, 7, 5, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 142 },
+ { 25, 0, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 142 },
+ { 14, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 32}, {0, 0}, {0, 0}, {0, 32} }, 0, 10, 14, 7, 3, 125 },
+ { 15, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, -32}, {0, -32}, {0, 0} }, 0, 10, 14, 6, 1, 125 },
+ { 3, 0, 0, 0, 0, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 125 },
+ { 3, 0, 0, 0, 1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 125 },
+ { 3, 0, 0, 0, 2, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 125 },
+ { 3, 0, 0, 0, 3, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 125 },
+ { 3, 0, 0, 0, 4, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 125 },
+ { 3, 0, 0, 0, 5, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 125 },
+ { 3, 0, 0, 0, 6, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 125 },
+ { 3, 0, 0, 0, 7, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 125 },
+ { 3, 0, 0, 0, 8, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 125 },
+ { 3, 0, 0, 0, 9, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 125 },
+ { 5, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 125 },
+ { 18, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 125 },
+ { 18, 0, 0, 0, -1, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 154 },
+ { 1, 0, 0, 0, -1, 0, 23, 3, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 154 },
+ { 1, 0, 0, 0, -1, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 154 },
+ { 1, 0, 0, 0, -1, 0, 23, 3, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 154 },
+ { 0, 17, 0, 5, -1, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 154 },
+ { 1, 0, 9, 0, -1, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 154 },
+ { 0, 17, 9, 5, -1, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 154 },
+ { 18, 0, 0, 0, -1, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 7, 10, 14, 8, 1, 154 },
+ { 0, 17, 7, 5, -1, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 154 },
+ { 25, 0, 0, 0, -1, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 154 },
+ { 25, 0, 0, 0, -1, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 154 },
+ { 3, 0, 0, 0, 0, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 1, 154 },
+ { 3, 0, 0, 0, 1, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 1, 154 },
+ { 3, 0, 0, 0, 2, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 1, 154 },
+ { 3, 0, 0, 0, 3, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 1, 154 },
+ { 3, 0, 0, 0, 4, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 1, 154 },
+ { 3, 0, 0, 0, 5, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 1, 154 },
+ { 3, 0, 0, 0, 6, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 1, 154 },
+ { 3, 0, 0, 0, 7, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 1, 154 },
+ { 3, 0, 0, 0, 8, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 1, 154 },
+ { 3, 0, 0, 0, 9, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 16, 9, 1, 154 },
+ { 18, 0, 0, 0, -1, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 150 },
+ { 1, 0, 0, 0, -1, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 150 },
+ { 0, 17, 0, 5, -1, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 150 },
+ { 0, 17, 9, 5, -1, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 150 },
+ { 25, 0, 0, 0, -1, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 20, 0, 1, 150 },
+ { 18, 0, 0, 0, -1, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 141 },
+ { 0, 17, 0, 5, -1, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 141 },
+ { 0, 0, 0, 5, -1, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 141 },
+ { 0, 17, 9, 5, -1, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 141 },
+ { 1, 0, 0, 0, -1, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 141 },
+ { 18, 0, 0, 0, -1, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 7, 10, 14, 8, 1, 141 },
+ { 25, 0, 0, 0, -1, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 20, 0, 1, 141 },
+ { 25, 0, 0, 0, -1, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 141 },
+ { 25, 0, 0, 0, -1, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 141 },
+ { 25, 0, 0, 0, -1, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 141 },
+ { 18, 0, 0, 0, -1, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 140 },
+ { 0, 17, 0, 5, -1, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 140 },
+ { 1, 0, 0, 0, -1, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 140 },
+ { 18, 0, 0, 0, -1, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 7, 10, 14, 8, 1, 140 },
+ { 18, 0, 0, 0, -1, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 7, 10, 14, 8, 1, 140 },
+ { 0, 17, 9, 5, -1, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 140 },
+ { 25, 0, 0, 0, -1, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 140 },
+ { 25, 0, 0, 0, -1, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 140 },
+ { 18, 0, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 140 },
+ { 25, 0, 0, 0, -1, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 20, 0, 1, 140 },
+ { 18, 0, 0, 0, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 29 },
+ { 18, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 119 },
+ { 25, 0, 0, 0, -1, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 20, 0, 1, 11 },
+ { 18, 0, 0, 0, -1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 133 },
+ { 1, 0, 0, 0, -1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 133 },
+ { 0, 17, 0, 5, -1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 133 },
+ { 0, 0, 9, 5, -1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 133 },
+ { 25, 0, 0, 0, -1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 133 },
+ { 25, 0, 0, 0, -1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 133 },
+ { 3, 0, 0, 0, 0, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 133 },
+ { 3, 0, 0, 0, 1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 133 },
+ { 3, 0, 0, 0, 2, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 133 },
+ { 3, 0, 0, 0, 3, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 133 },
+ { 3, 0, 0, 0, 4, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 133 },
+ { 3, 0, 0, 0, 5, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 133 },
+ { 3, 0, 0, 0, 6, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 133 },
+ { 3, 0, 0, 0, 7, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 133 },
+ { 3, 0, 0, 0, 8, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 133 },
+ { 3, 0, 0, 0, 9, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 133 },
+ { 5, 0, 0, 0, -1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 133 },
+ { 25, 0, 0, 0, -1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 20, 0, 1, 134 },
+ { 25, 0, 0, 0, -1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 8, 0, 1, 134 },
+ { 18, 0, 0, 0, -1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 134 },
+ { 0, 17, 0, 5, -1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 134 },
+ { 1, 0, 0, 0, -1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 134 },
+ { 18, 0, 0, 0, -1, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 138 },
+ { 0, 17, 0, 5, -1, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 138 },
+ { 0, 17, 7, 5, -1, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 138 },
+ { 0, 17, 9, 5, -1, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 138 },
+ { 18, 0, 0, 0, -1, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 7, 10, 14, 8, 1, 138 },
+ { 3, 0, 0, 0, 0, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 138 },
+ { 3, 0, 0, 0, 1, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 138 },
+ { 3, 0, 0, 0, 2, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 138 },
+ { 3, 0, 0, 0, 3, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 138 },
+ { 3, 0, 0, 0, 4, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 138 },
+ { 3, 0, 0, 0, 5, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 138 },
+ { 3, 0, 0, 0, 6, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 138 },
+ { 3, 0, 0, 0, 7, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 138 },
+ { 3, 0, 0, 0, 8, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 138 },
+ { 3, 0, 0, 0, 9, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 138 },
+ { 18, 0, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 143 },
+ { 1, 0, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 143 },
+ { 0, 17, 0, 5, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 143 },
+ { 0, 17, 9, 5, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 143 },
+ { 3, 0, 0, 0, 0, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 143 },
+ { 3, 0, 0, 0, 1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 143 },
+ { 3, 0, 0, 0, 2, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 143 },
+ { 3, 0, 0, 0, 3, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 143 },
+ { 3, 0, 0, 0, 4, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 143 },
+ { 3, 0, 0, 0, 5, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 143 },
+ { 3, 0, 0, 0, 6, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 143 },
+ { 3, 0, 0, 0, 7, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 143 },
+ { 3, 0, 0, 0, 8, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 143 },
+ { 3, 0, 0, 0, 9, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 143 },
+ { 18, 0, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 145 },
+ { 18, 0, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 19, 8, 1, 145 },
+ { 0, 17, 0, 5, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 145 },
+ { 1, 0, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 145 },
+ { 25, 0, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 145 },
+ { 0, 17, 0, 5, -1, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 162 },
+ { 18, 0, 0, 0, -1, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 7, 10, 14, 8, 1, 162 },
+ { 1, 0, 0, 0, -1, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 162 },
+ { 18, 0, 0, 0, -1, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 162 },
+ { 1, 0, 9, 0, -1, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 162 },
+ { 0, 17, 9, 5, -1, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 162 },
+ { 25, 0, 0, 0, -1, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 162 },
+ { 25, 0, 0, 0, -1, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 1, 162 },
+ { 3, 0, 0, 0, 0, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 14, 9, 1, 162 },
+ { 3, 0, 0, 0, 1, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 14, 9, 1, 162 },
+ { 3, 0, 0, 0, 2, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 14, 9, 1, 162 },
+ { 3, 0, 0, 0, 3, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 14, 9, 1, 162 },
+ { 3, 0, 0, 0, 4, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 14, 9, 1, 162 },
+ { 3, 0, 0, 0, 5, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 14, 9, 1, 162 },
+ { 3, 0, 0, 0, 6, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 14, 9, 1, 162 },
+ { 3, 0, 0, 0, 7, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 14, 9, 1, 162 },
+ { 3, 0, 0, 0, 8, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 14, 9, 1, 162 },
+ { 3, 0, 0, 0, 9, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 14, 9, 1, 162 },
+ { 18, 0, 0, 0, -1, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 83 },
+ { 5, 0, 0, 0, -1, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 16 },
+ { 29, 10, 0, 0, -1, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 16 },
+ { 27, 4, 0, 0, -1, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 16 },
+ { 25, 0, 0, 0, -1, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 16 },
+ { 18, 0, 0, 0, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 63 },
+ { 18, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 63 },
+ { 18, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 63 },
+ { 4, 0, 0, 0, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 63 },
+ { 4, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 63 },
+ { 25, 0, 0, 0, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 63 },
+ { 25, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 63 },
+ { 18, 0, 0, 0, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 157 },
+ { 25, 0, 0, 0, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 157 },
+ { 18, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 81 },
+ { 18, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 0, 8, 1, 81 },
+ { 18, 0, 0, 0, -1, 0, 11, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 1, 8, 1, 81 },
+ { 18, 0, 0, 0, -1, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 0, 8, 1, 81 },
+ { 10, 0, 0, 5, -1, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 6, 4, 0, 81 },
+ { 10, 0, 0, 5, -1, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 0, 4, 0, 81 },
+ { 10, 0, 0, 5, -1, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 1, 4, 0, 81 },
+ { 10, 0, 0, 5, -1, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 6, 4, 0, 81 },
+ { 10, 0, 0, 5, -1, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 0, 4, 0, 81 },
+ { 10, 0, 0, 5, -1, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 1, 4, 0, 81 },
+ { 0, 17, 0, 5, -1, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 81 },
+ { 18, 0, 0, 0, -1, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 81 },
+ { 18, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 127 },
+ { 18, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 0, 8, 1, 127 },
+ { 18, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 1, 8, 1, 127 },
+ { 18, 0, 0, 0, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 84 },
+ { 18, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 115 },
+ { 3, 0, 0, 0, 0, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 115 },
+ { 3, 0, 0, 0, 1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 115 },
+ { 3, 0, 0, 0, 2, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 115 },
+ { 3, 0, 0, 0, 3, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 115 },
+ { 3, 0, 0, 0, 4, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 115 },
+ { 3, 0, 0, 0, 5, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 115 },
+ { 3, 0, 0, 0, 6, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 115 },
+ { 3, 0, 0, 0, 7, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 115 },
+ { 3, 0, 0, 0, 8, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 115 },
+ { 3, 0, 0, 0, 9, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 115 },
+ { 25, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 115 },
+ { 18, 0, 0, 0, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 159 },
+ { 3, 0, 0, 0, 0, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 159 },
+ { 3, 0, 0, 0, 1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 159 },
+ { 3, 0, 0, 0, 2, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 159 },
+ { 3, 0, 0, 0, 3, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 159 },
+ { 3, 0, 0, 0, 4, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 159 },
+ { 3, 0, 0, 0, 5, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 159 },
+ { 3, 0, 0, 0, 6, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 159 },
+ { 3, 0, 0, 0, 7, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 159 },
+ { 3, 0, 0, 0, 8, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 159 },
+ { 3, 0, 0, 0, 9, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 159 },
+ { 18, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 104 },
+ { 0, 17, 1, 5, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 104 },
+ { 25, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 104 },
+ { 18, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 108 },
+ { 0, 17, 230, 5, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 108 },
+ { 25, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 108 },
+ { 25, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 108 },
+ { 25, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 108 },
+ { 29, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 108 },
+ { 17, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 108 },
+ { 3, 0, 0, 0, 0, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 108 },
+ { 3, 0, 0, 0, 1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 108 },
+ { 3, 0, 0, 0, 2, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 108 },
+ { 3, 0, 0, 0, 3, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 108 },
+ { 3, 0, 0, 0, 4, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 108 },
+ { 3, 0, 0, 0, 5, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 108 },
+ { 3, 0, 0, 0, 6, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 108 },
+ { 3, 0, 0, 0, 7, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 108 },
+ { 3, 0, 0, 0, 8, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 108 },
+ { 3, 0, 0, 0, 9, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 108 },
+ { 5, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 108 },
+ { 14, 0, 0, 0, -1, 0, 20, 3, 0, { {0, 32}, {0, 0}, {0, 0}, {0, 32} }, 0, 10, 14, 7, 3, 146 },
+ { 15, 0, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, -32}, {0, -32}, {0, 0} }, 0, 10, 14, 6, 1, 146 },
+ { 5, 0, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 146 },
+ { 25, 0, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 146 },
+ { 25, 0, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 146 },
+ { 25, 0, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 146 },
+ { 18, 0, 0, 0, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 99 },
+ { 18, 0, 0, 0, -1, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 99 },
+ { 0, 17, 0, 5, -1, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 99 },
+ { 1, 0, 0, 0, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 99 },
+ { 1, 0, 0, 0, -1, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 99 },
+ { 0, 17, 0, 5, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 99 },
+ { 17, 0, 0, 0, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 99 },
+ { 17, 0, 0, 0, -1, 0, 18, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 7, 8, 1, 137 },
+ { 17, 0, 0, 0, -1, 0, 19, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 7, 8, 1, 139 },
+ { 25, 10, 0, 0, -1, 0, 21, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 7, 0, 1, 37 },
+ { 17, 0, 0, 0, -1, 0, 21, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 7, 8, 1, 37 },
+ { 0, 17, 0, 5, -1, 0, 23, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 6, 4, 1, 155 },
+ { 1, 0, 6, 0, -1, 0, 23, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 37 },
+ { 18, 0, 0, 0, -1, 0, 18, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 8, 1, 137 },
+ { 18, 0, 0, 0, -1, 0, 20, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 8, 1, 137 },
+ { 18, 0, 0, 0, -1, 0, 21, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 8, 1, 137 },
+ { 18, 0, 0, 0, -1, 0, 23, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 8, 1, 137 },
+ { 18, 0, 0, 0, -1, 0, 23, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 1, 155 },
+ { 17, 0, 0, 0, -1, 0, 24, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 14, 8, 1, 35 },
+ { 18, 0, 0, 0, -1, 0, 12, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 16, 8, 1, 35 },
+ { 18, 0, 0, 0, -1, 0, 12, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 8, 1, 34 },
+ { 18, 0, 0, 0, -1, 0, 19, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 8, 1, 34 },
+ { 18, 0, 0, 0, -1, 0, 24, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 8, 1, 34 },
+ { 18, 0, 0, 0, -1, 0, 24, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 16, 8, 1, 35 },
+ { 18, 0, 0, 0, -1, 0, 25, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 7, 8, 1, 34 },
+ { 18, 0, 0, 0, -1, 0, 21, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 7, 8, 1, 34 },
+ { 18, 0, 0, 0, -1, 0, 25, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 7, 8, 1, 35 },
+ { 18, 0, 0, 0, -1, 0, 21, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 7, 8, 1, 35 },
+ { 18, 0, 0, 0, -1, 0, 19, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 8, 1, 139 },
+ { 18, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 105 },
+ { 29, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 105 },
+ { 0, 17, 0, 5, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 105 },
+ { 0, 17, 1, 5, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 105 },
+ { 25, 0, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 105 },
+ { 10, 18, 0, 5, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 23, 4, 2, 2 },
+ { 0, 17, 0, 5, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 29, 0, 0, 0, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 29, 0, 0, 0, -1, 0, 5, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 29, 0, 0, 0, -1, 0, 5, 3, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
+ { 1, 0, 216, 0, -1, 0, 5, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 2 },
+ { 1, 0, 216, 0, -1, 0, 5, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 2 },
+ { 0, 17, 1, 5, -1, 0, 5, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 1, 0, 226, 0, -1, 0, 5, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 23, 4, 1, 2 },
+ { 10, 18, 0, 5, -1, 0, 5, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 23, 4, 0, 2 },
+ { 0, 17, 220, 5, -1, 0, 5, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 0, 17, 230, 5, -1, 0, 5, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 1 },
+ { 29, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 0, 17, 230, 5, -1, 0, 8, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 4 },
+ { 5, 0, 0, 0, -1, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 5, 0, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 5, 0, 0, 0, -1, 0, 9, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 14, 0, 0, 0, -1, 0, 5, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 3, 2 },
+ { 15, 0, 0, 0, -1, 0, 5, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 3, 2 },
+ { 15, 0, 0, 0, -1, 0, 7, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 3, 2 },
+ { 26, 0, 0, 0, -1, 0, 5, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
+ { 26, 10, 0, 0, -1, 0, 5, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
+ { 14, 0, 0, 0, -1, 0, 9, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 3, 2 },
+ { 15, 0, 0, 0, -1, 0, 9, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 3, 2 },
+ { 3, 2, 0, 0, 0, 0, 5, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 3, 2 },
+ { 3, 2, 0, 0, 1, 0, 5, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 3, 2 },
+ { 3, 2, 0, 0, 2, 0, 5, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 3, 2 },
+ { 3, 2, 0, 0, 3, 0, 5, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 3, 2 },
+ { 3, 2, 0, 0, 4, 0, 5, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 3, 2 },
+ { 3, 2, 0, 0, 5, 0, 5, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 3, 2 },
+ { 3, 2, 0, 0, 6, 0, 5, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 3, 2 },
+ { 3, 2, 0, 0, 7, 0, 5, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 3, 2 },
+ { 3, 2, 0, 0, 8, 0, 5, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 3, 2 },
+ { 3, 2, 0, 0, 9, 0, 5, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 3, 2 },
+ { 29, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 131 },
+ { 0, 17, 0, 5, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 131 },
+ { 25, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 0, 1, 131 },
+ { 25, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 19, 12, 1, 131 },
+ { 25, 0, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 131 },
+ { 18, 0, 0, 0, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 3 },
+ { 15, 0, 0, 0, -1, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 1, 3 },
+ { 0, 17, 230, 5, -1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 57 },
+ { 17, 0, 0, 0, -1, 0, 25, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 6, 3, 5 },
+ { 0, 17, 230, 5, -1, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 5 },
+ { 18, 0, 0, 0, -1, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 151 },
+ { 0, 17, 230, 5, -1, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 151 },
+ { 17, 0, 0, 0, -1, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 151 },
+ { 3, 0, 0, 0, 0, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 151 },
+ { 3, 0, 0, 0, 1, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 151 },
+ { 3, 0, 0, 0, 2, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 151 },
+ { 3, 0, 0, 0, 3, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 151 },
+ { 3, 0, 0, 0, 4, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 151 },
+ { 3, 0, 0, 0, 5, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 151 },
+ { 3, 0, 0, 0, 6, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 151 },
+ { 3, 0, 0, 0, 7, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 151 },
+ { 3, 0, 0, 0, 8, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 151 },
+ { 3, 0, 0, 0, 9, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 151 },
+ { 29, 0, 0, 0, -1, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 151 },
+ { 18, 0, 0, 0, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 160 },
+ { 0, 17, 230, 5, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 160 },
+ { 18, 0, 0, 0, -1, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 152 },
+ { 0, 17, 230, 5, -1, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 152 },
+ { 3, 0, 0, 0, 0, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 152 },
+ { 3, 0, 0, 0, 1, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 152 },
+ { 3, 0, 0, 0, 2, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 152 },
+ { 3, 0, 0, 0, 3, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 152 },
+ { 3, 0, 0, 0, 4, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 152 },
+ { 3, 0, 0, 0, 5, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 152 },
+ { 3, 0, 0, 0, 6, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 152 },
+ { 3, 0, 0, 0, 7, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 152 },
+ { 3, 0, 0, 0, 8, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 152 },
+ { 3, 0, 0, 0, 9, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 152 },
+ { 27, 4, 0, 0, -1, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 11, 0, 1, 152 },
+ { 18, 0, 0, 0, -1, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 163 },
+ { 17, 0, 0, 0, -1, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 163 },
+ { 0, 17, 232, 5, -1, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 163 },
+ { 0, 17, 220, 5, -1, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 163 },
+ { 0, 17, 230, 5, -1, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 163 },
+ { 3, 0, 0, 0, 0, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 163 },
+ { 3, 0, 0, 0, 1, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 163 },
+ { 3, 0, 0, 0, 2, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 163 },
+ { 3, 0, 0, 0, 3, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 163 },
+ { 3, 0, 0, 0, 4, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 163 },
+ { 3, 0, 0, 0, 5, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 163 },
+ { 3, 0, 0, 0, 6, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 163 },
+ { 3, 0, 0, 0, 7, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 163 },
+ { 3, 0, 0, 0, 8, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 163 },
+ { 3, 0, 0, 0, 9, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 163 },
+ { 18, 0, 0, 0, -1, 0, 24, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 27 },
+ { 18, 1, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 113 },
+ { 5, 1, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 113 },
+ { 0, 17, 220, 5, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 113 },
+ { 14, 1, 0, 2, -1, 0, 18, 3, 0, { {0, 34}, {0, 0}, {0, 0}, {0, 34} }, 0, 10, 14, 7, 3, 132 },
+ { 15, 1, 0, 2, -1, 0, 18, 3, 0, { {0, 0}, {0, -34}, {0, -34}, {0, 0} }, 0, 10, 14, 6, 1, 132 },
+ { 0, 17, 230, 5, -1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 132 },
+ { 0, 17, 7, 5, -1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 1, 132 },
+ { 17, 1, 0, 5, -1, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 1, 132 },
+ { 3, 1, 0, 0, 0, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 132 },
+ { 3, 1, 0, 0, 1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 132 },
+ { 3, 1, 0, 0, 2, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 132 },
+ { 3, 1, 0, 0, 3, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 132 },
+ { 3, 1, 0, 0, 4, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 132 },
+ { 3, 1, 0, 0, 5, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 132 },
+ { 3, 1, 0, 0, 6, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 132 },
+ { 3, 1, 0, 0, 7, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 132 },
+ { 3, 1, 0, 0, 8, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 132 },
+ { 3, 1, 0, 0, 9, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 1, 132 },
+ { 25, 1, 0, 0, -1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 0, 1, 132 },
+ { 5, 13, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 29, 13, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
+ { 27, 13, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 1, 2 },
+ { 5, 13, 0, 0, -1, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 29, 13, 0, 0, -1, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 18, 13, 0, 0, -1, 0, 13, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 3, 8 },
+ { 26, 10, 0, 0, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 8 },
+ { 29, 10, 0, 0, -1, 0, 10, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 16, 0, 1, 2 },
+ { 13, 0, 0, 0, -1, 0, 0, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 16, 0, 0, 0 },
+ { 5, 2, 0, 0, 0, 0, 11, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 5, 2, 0, 0, 1, 0, 11, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 5, 2, 0, 0, 2, 0, 11, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 5, 2, 0, 0, 3, 0, 11, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 5, 2, 0, 0, 4, 0, 11, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 5, 2, 0, 0, 5, 0, 11, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 5, 2, 0, 0, 6, 0, 11, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 5, 2, 0, 0, 7, 0, 11, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 5, 2, 0, 0, 8, 0, 11, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 5, 2, 0, 0, 9, 0, 11, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 5, 10, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 23, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 16, 0, 1, 2 },
+ { 29, 0, 0, 0, -1, 0, 11, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 2 },
+ { 29, 0, 0, 0, -1, 0, 11, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
+ { 29, 0, 0, 0, -1, 0, 11, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
+ { 29, 10, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 1, 2 },
+ { 29, 0, 0, 0, -1, 0, 12, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 3, 2 },
+ { 29, 0, 0, 0, -1, 0, 11, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 3, 2 },
+ { 29, 0, 0, 0, -1, 0, 12, 0, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
+ { 29, 0, 0, 0, -1, 0, 12, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 2 },
+ { 29, 0, 0, 0, -1, 0, 11, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 7, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 13, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 3, 2 },
+ { 29, 10, 0, 0, -1, 0, 21, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 3, 2 },
+ { 29, 0, 0, 0, -1, 0, 12, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 10, 14, 7, 1, 2 },
+ { 29, 0, 0, 0, -1, 0, 11, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 10, 14, 7, 1, 2 },
+ { 29, 0, 0, 0, -1, 0, 11, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 29, 0, 0, 0, -1, 0, 12, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 1, 2 },
+ { 29, 0, 0, 0, -1, 0, 12, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 29, 0, 0, 0, -1, 0, 18, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 29, 0, 0, 0, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 6, 7, 30, 0, 1, 2 },
+ { 29, 0, 0, 0, -1, 0, 11, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 3, 34 },
+ { 29, 0, 0, 0, -1, 0, 12, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 16, 0, 3, 2 },
+ { 29, 0, 0, 0, -1, 0, 11, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 16, 0, 3, 2 },
+ { 29, 0, 0, 0, -1, 0, 18, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 3, 2 },
+ { 29, 10, 0, 0, -1, 0, 19, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 16, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 17, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 16, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 16, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 16, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 32, 0, 1, 2 },
+ { 28, 10, 0, 0, -1, 0, 17, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 33, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 13, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 17, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 16, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 18, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 32, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 16, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 32, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 18, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 16, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 13, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 16, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 3, 13, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 16, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 7, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 19, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 16, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 21, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 16, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 23, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 16, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 25, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 16, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 24, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 16, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 20, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 16, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 12, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 25, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 16, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 20, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 16, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 23, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 32, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 21, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 32, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 17, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 32, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 19, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 32, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 18, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 20, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 32, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 21, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 24, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 32, 0, 1, 2 },
+ { 29, 10, 0, 0, -1, 0, 25, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 32, 0, 1, 2 },
+ { 3, 2, 0, 0, 0, 0, 23, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 3, 2 },
+ { 3, 2, 0, 0, 1, 0, 23, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 3, 2 },
+ { 3, 2, 0, 0, 2, 0, 23, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 3, 2 },
+ { 3, 2, 0, 0, 3, 0, 23, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 3, 2 },
+ { 3, 2, 0, 0, 4, 0, 23, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 3, 2 },
+ { 3, 2, 0, 0, 5, 0, 23, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 3, 2 },
+ { 3, 2, 0, 0, 6, 0, 23, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 3, 2 },
+ { 3, 2, 0, 0, 7, 0, 23, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 3, 2 },
+ { 3, 2, 0, 0, 8, 0, 23, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 3, 2 },
+ { 3, 2, 0, 0, 9, 0, 23, 3, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 13, 9, 3, 2 },
+ { 13, 18, 0, 0, -1, 0, 2, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 0 },
+ { 18, 0, 0, 0, -1, 0, 5, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 8, 1, 37 },
+ { 18, 0, 0, 0, -1, 0, 25, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 8, 1, 37 },
+ { 18, 0, 0, 0, -1, 0, 12, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 8, 1, 37 },
+ { 18, 0, 0, 0, -1, 0, 26, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 8, 1, 37 },
+ { 18, 0, 0, 0, -1, 0, 5, 5, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 8, 3, 37 },
+ { 18, 0, 0, 0, -1, 0, 5, 5, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 16, 8, 0, 37 },
+ { 10, 18, 0, 5, -1, 0, 5, 3, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 0, 2 },
+ { 0, 17, 0, 5, -1, 0, 7, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 23, 4, 2, 1 },
+ { 12, 0, 0, 0, -1, 0, 2, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0, 0 }
};
Q_DECL_CONST_FUNCTION static inline const Properties *qGetProp(char32_t ucs4) noexcept
@@ -10130,7 +10492,12 @@ Q_CORE_EXPORT IdnaStatus QT_FASTCALL idnaStatus(char32_t ucs4) noexcept
return static_cast<IdnaStatus>(qGetProp(ucs4)->idnaStatus);
}
-static const unsigned short specialCaseMap[] = {
+Q_CORE_EXPORT EastAsianWidth QT_FASTCALL eastAsianWidth(char32_t ucs4) noexcept
+{
+ return static_cast<EastAsianWidth>(qGetProp(ucs4)->eastAsianWidth);
+}
+
+static constexpr unsigned short specialCaseMap[] = {
0x0, // placeholder
0x1, 0x2c65,
0x1, 0x2c66,
@@ -10437,9 +10804,9 @@ static const unsigned short specialCaseMap[] = {
0x1, 0xa64b
};
-const unsigned int MaxSpecialCaseLength = 3;
+constexpr unsigned int MaxSpecialCaseLength = 3;
-static const unsigned short uc_decomposition_trie[] = {
+static constexpr unsigned short uc_decomposition_trie[] = {
// 0 - 0x3400
1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548,
@@ -10606,11 +10973,11 @@ static const unsigned short uc_decomposition_trie[] = {
5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
5356, 5356, 5356, 5356, 5356, 9964, 5356, 5356,
10220, 10476, 10732, 10988, 5356, 5356, 5356, 5356,
+ 5356, 5356, 5356, 5356, 11244, 5356, 5356, 5356,
5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 11244, 5356, 5356, 11500, 11756, 5356,
+ 5356, 5356, 11500, 5356, 5356, 11756, 12012, 5356,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 12012,
+ 5356, 5356, 5356, 5356, 5356, 5356, 5356, 12268,
5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
@@ -10643,7 +11010,7 @@ static const unsigned short uc_decomposition_trie[] = {
5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 12268, 12524, 12780, 5356,
+ 5356, 5356, 5356, 5356, 12524, 12780, 13036, 5356,
5356, 5356, 5356, 5356,
@@ -12120,30 +12487,63 @@ static const unsigned short uc_decomposition_trie[] = {
0x3181, 0x3183, 0x3185, 0x3187, 0x3189, 0x318b, 0x318d, 0x318f,
0x3191, 0x3193, 0x3195, 0x3197, 0x3199, 0x319b, 0x319d, 0x319f,
- 0x31a1, 0x31a3, 0x31a5, 0x31a7, 0xffff, 0x31a9, 0x31ab, 0x31ad,
- 0x31af, 0x31b1, 0x31b3, 0x31b5, 0x31b7, 0x31b9, 0x31bb, 0x31bd,
- 0x31bf, 0x31c1, 0x31c3, 0x31c5, 0x31c7, 0x31c9, 0x31cb, 0x31cd,
- 0x31cf, 0x31d1, 0x31d3, 0x31d5, 0x31d7, 0x31d9, 0x31db, 0x31dd,
- 0xffff, 0x31df, 0x31e1, 0xffff, 0x31e3, 0xffff, 0xffff, 0x31e5,
- 0xffff, 0x31e7, 0x31e9, 0x31eb, 0x31ed, 0x31ef, 0x31f1, 0x31f3,
- 0x31f5, 0x31f7, 0x31f9, 0xffff, 0x31fb, 0x31fd, 0x31ff, 0x3201,
- 0xffff, 0x3203, 0xffff, 0x3205, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0x3207, 0xffff, 0xffff, 0xffff, 0xffff, 0x3209,
- 0xffff, 0x320b, 0xffff, 0x320d, 0xffff, 0x320f, 0x3211, 0x3213,
- 0xffff, 0x3215, 0x3217, 0xffff, 0x3219, 0xffff, 0xffff, 0x321b,
- 0xffff, 0x321d, 0xffff, 0x321f, 0xffff, 0x3221, 0xffff, 0x3223,
- 0xffff, 0x3225, 0x3227, 0xffff, 0x3229, 0xffff, 0xffff, 0x322b,
- 0x322d, 0x322f, 0x3231, 0xffff, 0x3233, 0x3235, 0x3237, 0x3239,
- 0x323b, 0x323d, 0x323f, 0xffff, 0x3241, 0x3243, 0x3245, 0x3247,
- 0xffff, 0x3249, 0x324b, 0x324d, 0x324f, 0xffff, 0x3251, 0xffff,
- 0x3253, 0x3255, 0x3257, 0x3259, 0x325b, 0x325d, 0x325f, 0x3261,
- 0x3263, 0x3265, 0xffff, 0x3267, 0x3269, 0x326b, 0x326d, 0x326f,
- 0x3271, 0x3273, 0x3275, 0x3277, 0x3279, 0x327b, 0x327d, 0x327f,
- 0x3281, 0x3283, 0x3285, 0x3287, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0x3289, 0x328b, 0x328d, 0xffff, 0x328f, 0x3291, 0x3293,
- 0x3295, 0x3297, 0xffff, 0x3299, 0x329b, 0x329d, 0x329f, 0x32a1,
- 0x32a3, 0x32a5, 0x32a7, 0x32a9, 0x32ab, 0x32ad, 0x32af, 0x32b1,
- 0x32b3, 0x32b5, 0x32b7, 0x32b9, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0x31a1, 0x31a3, 0x31a5, 0x31a7, 0x31a9, 0x31ab, 0x31ad, 0x31af,
+ 0x31b1, 0x31b3, 0x31b5, 0x31b7, 0x31b9, 0x31bb, 0x31bd, 0x31bf,
+ 0x31c1, 0x31c3, 0x31c5, 0x31c7, 0x31c9, 0x31cb, 0x31cd, 0x31cf,
+ 0x31d1, 0x31d3, 0x31d5, 0x31d7, 0x31d9, 0x31db, 0x31dd, 0x31df,
+ 0x31e1, 0x31e3, 0x31e5, 0x31e7, 0x31e9, 0x31eb, 0x31ed, 0x31ef,
+ 0x31f1, 0x31f3, 0x31f5, 0x31f7, 0x31f9, 0x31fb, 0x31fd, 0x31ff,
+ 0x3201, 0x3203, 0x3205, 0x3207, 0x3209, 0x320b, 0x320d, 0x320f,
+ 0x3211, 0x3213, 0x3215, 0x3217, 0x3219, 0x321b, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+
+ 0x321d, 0x321f, 0x3221, 0x3223, 0xffff, 0x3225, 0x3227, 0x3229,
+ 0x322b, 0x322d, 0x322f, 0x3231, 0x3233, 0x3235, 0x3237, 0x3239,
+ 0x323b, 0x323d, 0x323f, 0x3241, 0x3243, 0x3245, 0x3247, 0x3249,
+ 0x324b, 0x324d, 0x324f, 0x3251, 0x3253, 0x3255, 0x3257, 0x3259,
+ 0xffff, 0x325b, 0x325d, 0xffff, 0x325f, 0xffff, 0xffff, 0x3261,
+ 0xffff, 0x3263, 0x3265, 0x3267, 0x3269, 0x326b, 0x326d, 0x326f,
+ 0x3271, 0x3273, 0x3275, 0xffff, 0x3277, 0x3279, 0x327b, 0x327d,
+ 0xffff, 0x327f, 0xffff, 0x3281, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0x3283, 0xffff, 0xffff, 0xffff, 0xffff, 0x3285,
+ 0xffff, 0x3287, 0xffff, 0x3289, 0xffff, 0x328b, 0x328d, 0x328f,
+ 0xffff, 0x3291, 0x3293, 0xffff, 0x3295, 0xffff, 0xffff, 0x3297,
+ 0xffff, 0x3299, 0xffff, 0x329b, 0xffff, 0x329d, 0xffff, 0x329f,
+ 0xffff, 0x32a1, 0x32a3, 0xffff, 0x32a5, 0xffff, 0xffff, 0x32a7,
+ 0x32a9, 0x32ab, 0x32ad, 0xffff, 0x32af, 0x32b1, 0x32b3, 0x32b5,
+ 0x32b7, 0x32b9, 0x32bb, 0xffff, 0x32bd, 0x32bf, 0x32c1, 0x32c3,
+ 0xffff, 0x32c5, 0x32c7, 0x32c9, 0x32cb, 0xffff, 0x32cd, 0xffff,
+ 0x32cf, 0x32d1, 0x32d3, 0x32d5, 0x32d7, 0x32d9, 0x32db, 0x32dd,
+ 0x32df, 0x32e1, 0xffff, 0x32e3, 0x32e5, 0x32e7, 0x32e9, 0x32eb,
+ 0x32ed, 0x32ef, 0x32f1, 0x32f3, 0x32f5, 0x32f7, 0x32f9, 0x32fb,
+ 0x32fd, 0x32ff, 0x3301, 0x3303, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0x3305, 0x3307, 0x3309, 0xffff, 0x330b, 0x330d, 0x330f,
+ 0x3311, 0x3313, 0xffff, 0x3315, 0x3317, 0x3319, 0x331b, 0x331d,
+ 0x331f, 0x3321, 0x3323, 0x3325, 0x3327, 0x3329, 0x332b, 0x332d,
+ 0x332f, 0x3331, 0x3333, 0x3335, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
@@ -12153,25 +12553,25 @@ static const unsigned short uc_decomposition_trie[] = {
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0x32bb, 0x32be, 0x32c1, 0x32c4, 0x32c7, 0x32ca, 0x32cd, 0x32d0,
- 0x32d3, 0x32d6, 0x32d9, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0x32dc, 0x32e0, 0x32e4, 0x32e8, 0x32ec, 0x32f0, 0x32f4, 0x32f8,
- 0x32fc, 0x3300, 0x3304, 0x3308, 0x330c, 0x3310, 0x3314, 0x3318,
- 0x331c, 0x3320, 0x3324, 0x3328, 0x332c, 0x3330, 0x3334, 0x3338,
- 0x333c, 0x3340, 0x3344, 0x3348, 0x334a, 0x334c, 0x334f, 0xffff,
- 0x3352, 0x3354, 0x3356, 0x3358, 0x335a, 0x335c, 0x335e, 0x3360,
- 0x3362, 0x3364, 0x3366, 0x3368, 0x336a, 0x336c, 0x336e, 0x3370,
- 0x3372, 0x3374, 0x3376, 0x3378, 0x337a, 0x337c, 0x337e, 0x3380,
- 0x3382, 0x3384, 0x3386, 0x3389, 0x338c, 0x338f, 0x3392, 0x3396,
+ 0x3337, 0x333a, 0x333d, 0x3340, 0x3343, 0x3346, 0x3349, 0x334c,
+ 0x334f, 0x3352, 0x3355, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0x3358, 0x335c, 0x3360, 0x3364, 0x3368, 0x336c, 0x3370, 0x3374,
+ 0x3378, 0x337c, 0x3380, 0x3384, 0x3388, 0x338c, 0x3390, 0x3394,
+ 0x3398, 0x339c, 0x33a0, 0x33a4, 0x33a8, 0x33ac, 0x33b0, 0x33b4,
+ 0x33b8, 0x33bc, 0x33c0, 0x33c4, 0x33c6, 0x33c8, 0x33cb, 0xffff,
+ 0x33ce, 0x33d0, 0x33d2, 0x33d4, 0x33d6, 0x33d8, 0x33da, 0x33dc,
+ 0x33de, 0x33e0, 0x33e2, 0x33e4, 0x33e6, 0x33e8, 0x33ea, 0x33ec,
+ 0x33ee, 0x33f0, 0x33f2, 0x33f4, 0x33f6, 0x33f8, 0x33fa, 0x33fc,
+ 0x33fe, 0x3400, 0x3402, 0x3405, 0x3408, 0x340b, 0x340e, 0x3412,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0x3399, 0x339c, 0x339f, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0x3415, 0x3418, 0x341b, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0x33a2, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0x341e, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
@@ -12186,17 +12586,17 @@ static const unsigned short uc_decomposition_trie[] = {
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0x33a5, 0x33a8, 0x33ab, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0x3421, 0x3424, 0x3427, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0x33ad, 0x33af, 0x33b1, 0x33b3, 0x33b5, 0x33b7, 0x33b9, 0x33bb,
- 0x33bd, 0x33bf, 0x33c1, 0x33c3, 0x33c5, 0x33c7, 0x33c9, 0x33cb,
- 0x33cd, 0x33cf, 0x33d1, 0x33d3, 0x33d5, 0x33d7, 0x33d9, 0x33db,
- 0x33dd, 0x33df, 0x33e1, 0x33e3, 0x33e5, 0x33e7, 0x33e9, 0x33eb,
- 0x33ed, 0x33ef, 0x33f1, 0x33f3, 0x33f5, 0x33f7, 0x33f9, 0x33fb,
- 0x33fd, 0x33ff, 0x3401, 0x3403, 0xffff, 0xffff, 0xffff, 0xffff,
- 0x3405, 0x3409, 0x340d, 0x3411, 0x3415, 0x3419, 0x341d, 0x3421,
- 0x3425, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0x3429, 0x342b, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0x3429, 0x342b, 0x342d, 0x342f, 0x3431, 0x3433, 0x3435, 0x3437,
+ 0x3439, 0x343b, 0x343d, 0x343f, 0x3441, 0x3443, 0x3445, 0x3447,
+ 0x3449, 0x344b, 0x344d, 0x344f, 0x3451, 0x3453, 0x3455, 0x3457,
+ 0x3459, 0x345b, 0x345d, 0x345f, 0x3461, 0x3463, 0x3465, 0x3467,
+ 0x3469, 0x346b, 0x346d, 0x346f, 0x3471, 0x3473, 0x3475, 0x3477,
+ 0x3479, 0x347b, 0x347d, 0x347f, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0x3481, 0x3485, 0x3489, 0x348d, 0x3491, 0x3495, 0x3499, 0x349d,
+ 0x34a1, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0x34a5, 0x34a7, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
@@ -12249,79 +12649,79 @@ static const unsigned short uc_decomposition_trie[] = {
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0x342d, 0x342f, 0x3431, 0x3433, 0x3435, 0x3437, 0x3439, 0x343b,
- 0x343d, 0x343f, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0x34a9, 0x34ab, 0x34ad, 0x34af, 0x34b1, 0x34b3, 0x34b5, 0x34b7,
+ 0x34b9, 0x34bb, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0x3441, 0x3443, 0x3445, 0x3447, 0x344a, 0x344c, 0x344e, 0x3450,
- 0x3452, 0x3454, 0x3456, 0x3458, 0x345a, 0x345c, 0x345f, 0x3461,
- 0x3463, 0x3465, 0x3467, 0x346a, 0x346c, 0x346e, 0x3470, 0x3473,
- 0x3475, 0x3477, 0x3479, 0x347b, 0x347d, 0x3480, 0x3482, 0x3484,
- 0x3486, 0x3488, 0x348a, 0x348c, 0x348e, 0x3490, 0x3492, 0x3494,
- 0x3496, 0x3498, 0x349a, 0x349c, 0x349e, 0x34a0, 0x34a2, 0x34a4,
- 0x34a6, 0x34a8, 0x34aa, 0x34ac, 0x34ae, 0x34b1, 0x34b3, 0x34b5,
- 0x34b7, 0x34ba, 0x34bc, 0x34be, 0x34c0, 0x34c2, 0x34c4, 0x34c6,
- 0x34c8, 0x34ca, 0x34cc, 0x34ce, 0x34d0, 0x34d2, 0x34d4, 0x34d6,
- 0x34d8, 0x34da, 0x34dc, 0x34de, 0x34e0, 0x34e2, 0x34e4, 0x34e6,
- 0x34e8, 0x34ea, 0x34ec, 0x34ee, 0x34f0, 0x34f2, 0x34f4, 0x34f6,
- 0x34f8, 0x34fa, 0x34fd, 0x34ff, 0x3501, 0x3503, 0x3505, 0x3507,
- 0x3509, 0x350c, 0x350f, 0x3511, 0x3513, 0x3515, 0x3517, 0x3519,
- 0x351b, 0x351d, 0x351f, 0x3521, 0x3523, 0x3526, 0x3528, 0x352a,
- 0x352c, 0x352e, 0x3531, 0x3533, 0x3535, 0x3537, 0x3539, 0x353b,
- 0x353d, 0x353f, 0x3541, 0x3543, 0x3546, 0x3548, 0x354b, 0x354d,
- 0x354f, 0x3551, 0x3553, 0x3555, 0x3557, 0x3559, 0x355b, 0x355d,
- 0x355f, 0x3561, 0x3564, 0x3566, 0x3568, 0x356a, 0x356c, 0x356e,
- 0x3571, 0x3573, 0x3576, 0x3579, 0x357b, 0x357d, 0x357f, 0x3581,
- 0x3584, 0x3587, 0x3589, 0x358b, 0x358d, 0x358f, 0x3591, 0x3593,
- 0x3595, 0x3597, 0x3599, 0x359b, 0x359d, 0x35a0, 0x35a2, 0x35a4,
- 0x35a6, 0x35a8, 0x35aa, 0x35ac, 0x35ae, 0x35b0, 0x35b2, 0x35b4,
- 0x35b6, 0x35b8, 0x35ba, 0x35bc, 0x35be, 0x35c0, 0x35c2, 0x35c4,
- 0x35c6, 0x35c9, 0x35cb, 0x35cd, 0x35cf, 0x35d1, 0x35d3, 0x35d6,
- 0x35d8, 0x35da, 0x35dc, 0x35de, 0x35e0, 0x35e2, 0x35e4, 0x35e6,
- 0x35e8, 0x35ea, 0x35ec, 0x35ef, 0x35f1, 0x35f3, 0x35f5, 0x35f7,
- 0x35f9, 0x35fb, 0x35fd, 0x35ff, 0x3601, 0x3603, 0x3605, 0x3607,
- 0x3609, 0x360b, 0x360d, 0x360f, 0x3611, 0x3613, 0x3616, 0x3618,
- 0x361a, 0x361c, 0x361e, 0x3620, 0x3623, 0x3625, 0x3627, 0x3629,
- 0x362b, 0x362d, 0x362f, 0x3631, 0x3633, 0x3636, 0x3638, 0x363a,
- 0x363c, 0x363f, 0x3641, 0x3643, 0x3645, 0x3647, 0x3649, 0x364b,
- 0x364e, 0x3651, 0x3654, 0x3656, 0x3659, 0x365b, 0x365d, 0x365f,
+ 0x34bd, 0x34bf, 0x34c1, 0x34c3, 0x34c6, 0x34c8, 0x34ca, 0x34cc,
+ 0x34ce, 0x34d0, 0x34d2, 0x34d4, 0x34d6, 0x34d8, 0x34db, 0x34dd,
+ 0x34df, 0x34e1, 0x34e3, 0x34e6, 0x34e8, 0x34ea, 0x34ec, 0x34ef,
+ 0x34f1, 0x34f3, 0x34f5, 0x34f7, 0x34f9, 0x34fc, 0x34fe, 0x3500,
+ 0x3502, 0x3504, 0x3506, 0x3508, 0x350a, 0x350c, 0x350e, 0x3510,
+ 0x3512, 0x3514, 0x3516, 0x3518, 0x351a, 0x351c, 0x351e, 0x3520,
+ 0x3522, 0x3524, 0x3526, 0x3528, 0x352a, 0x352d, 0x352f, 0x3531,
+ 0x3533, 0x3536, 0x3538, 0x353a, 0x353c, 0x353e, 0x3540, 0x3542,
+ 0x3544, 0x3546, 0x3548, 0x354a, 0x354c, 0x354e, 0x3550, 0x3552,
+ 0x3554, 0x3556, 0x3558, 0x355a, 0x355c, 0x355e, 0x3560, 0x3562,
+ 0x3564, 0x3566, 0x3568, 0x356a, 0x356c, 0x356e, 0x3570, 0x3572,
+ 0x3574, 0x3576, 0x3579, 0x357b, 0x357d, 0x357f, 0x3581, 0x3583,
+ 0x3585, 0x3588, 0x358b, 0x358d, 0x358f, 0x3591, 0x3593, 0x3595,
+ 0x3597, 0x3599, 0x359b, 0x359d, 0x359f, 0x35a2, 0x35a4, 0x35a6,
+ 0x35a8, 0x35aa, 0x35ad, 0x35af, 0x35b1, 0x35b3, 0x35b5, 0x35b7,
+ 0x35b9, 0x35bb, 0x35bd, 0x35bf, 0x35c2, 0x35c4, 0x35c7, 0x35c9,
+ 0x35cb, 0x35cd, 0x35cf, 0x35d1, 0x35d3, 0x35d5, 0x35d7, 0x35d9,
+ 0x35db, 0x35dd, 0x35e0, 0x35e2, 0x35e4, 0x35e6, 0x35e8, 0x35ea,
+ 0x35ed, 0x35ef, 0x35f2, 0x35f5, 0x35f7, 0x35f9, 0x35fb, 0x35fd,
+ 0x3600, 0x3603, 0x3605, 0x3607, 0x3609, 0x360b, 0x360d, 0x360f,
+ 0x3611, 0x3613, 0x3615, 0x3617, 0x3619, 0x361c, 0x361e, 0x3620,
+ 0x3622, 0x3624, 0x3626, 0x3628, 0x362a, 0x362c, 0x362e, 0x3630,
+ 0x3632, 0x3634, 0x3636, 0x3638, 0x363a, 0x363c, 0x363e, 0x3640,
+ 0x3642, 0x3645, 0x3647, 0x3649, 0x364b, 0x364d, 0x364f, 0x3652,
+ 0x3654, 0x3656, 0x3658, 0x365a, 0x365c, 0x365e, 0x3660, 0x3662,
+ 0x3664, 0x3666, 0x3668, 0x366b, 0x366d, 0x366f, 0x3671, 0x3673,
+ 0x3675, 0x3677, 0x3679, 0x367b, 0x367d, 0x367f, 0x3681, 0x3683,
+ 0x3685, 0x3687, 0x3689, 0x368b, 0x368d, 0x368f, 0x3692, 0x3694,
+ 0x3696, 0x3698, 0x369a, 0x369c, 0x369f, 0x36a1, 0x36a3, 0x36a5,
+ 0x36a7, 0x36a9, 0x36ab, 0x36ad, 0x36af, 0x36b2, 0x36b4, 0x36b6,
+ 0x36b8, 0x36bb, 0x36bd, 0x36bf, 0x36c1, 0x36c3, 0x36c5, 0x36c7,
+ 0x36ca, 0x36cd, 0x36d0, 0x36d2, 0x36d5, 0x36d7, 0x36d9, 0x36db,
- 0x3661, 0x3663, 0x3665, 0x3667, 0x3669, 0x366b, 0x366d, 0x3670,
- 0x3672, 0x3674, 0x3676, 0x3678, 0x367a, 0x367c, 0x367f, 0x3681,
- 0x3683, 0x3686, 0x3689, 0x368b, 0x368d, 0x368f, 0x3691, 0x3693,
- 0x3695, 0x3697, 0x3699, 0x369b, 0x369e, 0x36a0, 0x36a3, 0x36a5,
- 0x36a8, 0x36aa, 0x36ac, 0x36ae, 0x36b1, 0x36b3, 0x36b5, 0x36b8,
- 0x36bb, 0x36bd, 0x36bf, 0x36c1, 0x36c3, 0x36c5, 0x36c7, 0x36c9,
- 0x36cb, 0x36cd, 0x36cf, 0x36d1, 0x36d3, 0x36d5, 0x36d8, 0x36da,
- 0x36dd, 0x36df, 0x36e2, 0x36e4, 0x36e7, 0x36ea, 0x36ed, 0x36ef,
- 0x36f1, 0x36f3, 0x36f6, 0x36f9, 0x36fc, 0x36ff, 0x3701, 0x3703,
- 0x3705, 0x3707, 0x3709, 0x370b, 0x370d, 0x370f, 0x3712, 0x3714,
- 0x3716, 0x3718, 0x371a, 0x371d, 0x371f, 0x3722, 0x3725, 0x3727,
- 0x3729, 0x372b, 0x372d, 0x372f, 0x3731, 0x3734, 0x3737, 0x373a,
- 0x373c, 0x373e, 0x3741, 0x3743, 0x3745, 0x3747, 0x374a, 0x374c,
- 0x374e, 0x3750, 0x3752, 0x3754, 0x3757, 0x3759, 0x375b, 0x375d,
- 0x375f, 0x3761, 0x3763, 0x3766, 0x3769, 0x376b, 0x376e, 0x3770,
- 0x3773, 0x3775, 0x3777, 0x3779, 0x377c, 0x377f, 0x3781, 0x3784,
- 0x3786, 0x3789, 0x378b, 0x378d, 0x378f, 0x3791, 0x3793, 0x3795,
- 0x3798, 0x379b, 0x379e, 0x37a1, 0x37a3, 0x37a5, 0x37a7, 0x37a9,
- 0x37ab, 0x37ad, 0x37af, 0x37b1, 0x37b3, 0x37b5, 0x37b7, 0x37b9,
- 0x37bc, 0x37be, 0x37c0, 0x37c2, 0x37c4, 0x37c6, 0x37c8, 0x37ca,
- 0x37cc, 0x37ce, 0x37d0, 0x37d2, 0x37d4, 0x37d7, 0x37da, 0x37dd,
- 0x37df, 0x37e1, 0x37e3, 0x37e5, 0x37e8, 0x37ea, 0x37ed, 0x37ef,
- 0x37f1, 0x37f4, 0x37f7, 0x37f9, 0x37fb, 0x37fd, 0x37ff, 0x3801,
- 0x3803, 0x3805, 0x3807, 0x3809, 0x380b, 0x380d, 0x380f, 0x3811,
- 0x3813, 0x3815, 0x3817, 0x3819, 0x381b, 0x381d, 0x3820, 0x3822,
- 0x3824, 0x3826, 0x3828, 0x382a, 0x382d, 0x3830, 0x3832, 0x3834,
- 0x3836, 0x3838, 0x383a, 0x383c, 0x383f, 0x3841, 0x3843, 0x3845,
- 0x3847, 0x384a, 0x384d, 0x384f, 0x3851, 0x3853, 0x3856, 0x3858,
- 0x385a, 0x385d, 0x3860, 0x3862, 0x3864, 0x3866, 0x3869, 0x386b,
- 0x386d, 0x386f, 0x3871, 0x3873, 0x3875, 0x3877, 0x387a, 0x387c,
- 0x387e, 0x3880, 0x3883, 0x3885, 0x3887, 0x3889, 0x388b, 0x388e,
- 0x3891, 0x3893, 0x3895, 0x3897, 0x389a, 0x389c, 0x389f, 0x38a1,
+ 0x36dd, 0x36df, 0x36e1, 0x36e3, 0x36e5, 0x36e7, 0x36e9, 0x36ec,
+ 0x36ee, 0x36f0, 0x36f2, 0x36f4, 0x36f6, 0x36f8, 0x36fb, 0x36fd,
+ 0x36ff, 0x3702, 0x3705, 0x3707, 0x3709, 0x370b, 0x370d, 0x370f,
+ 0x3711, 0x3713, 0x3715, 0x3717, 0x371a, 0x371c, 0x371f, 0x3721,
+ 0x3724, 0x3726, 0x3728, 0x372a, 0x372d, 0x372f, 0x3731, 0x3734,
+ 0x3737, 0x3739, 0x373b, 0x373d, 0x373f, 0x3741, 0x3743, 0x3745,
+ 0x3747, 0x3749, 0x374b, 0x374d, 0x374f, 0x3751, 0x3754, 0x3756,
+ 0x3759, 0x375b, 0x375e, 0x3760, 0x3763, 0x3766, 0x3769, 0x376b,
+ 0x376d, 0x376f, 0x3772, 0x3775, 0x3778, 0x377b, 0x377d, 0x377f,
+ 0x3781, 0x3783, 0x3785, 0x3787, 0x3789, 0x378b, 0x378e, 0x3790,
+ 0x3792, 0x3794, 0x3796, 0x3799, 0x379b, 0x379e, 0x37a1, 0x37a3,
+ 0x37a5, 0x37a7, 0x37a9, 0x37ab, 0x37ad, 0x37b0, 0x37b3, 0x37b6,
+ 0x37b8, 0x37ba, 0x37bd, 0x37bf, 0x37c1, 0x37c3, 0x37c6, 0x37c8,
+ 0x37ca, 0x37cc, 0x37ce, 0x37d0, 0x37d3, 0x37d5, 0x37d7, 0x37d9,
+ 0x37db, 0x37dd, 0x37df, 0x37e2, 0x37e5, 0x37e7, 0x37ea, 0x37ec,
+ 0x37ef, 0x37f1, 0x37f3, 0x37f5, 0x37f8, 0x37fb, 0x37fd, 0x3800,
+ 0x3802, 0x3805, 0x3807, 0x3809, 0x380b, 0x380d, 0x380f, 0x3811,
+ 0x3814, 0x3817, 0x381a, 0x381d, 0x381f, 0x3821, 0x3823, 0x3825,
+ 0x3827, 0x3829, 0x382b, 0x382d, 0x382f, 0x3831, 0x3833, 0x3835,
+ 0x3838, 0x383a, 0x383c, 0x383e, 0x3840, 0x3842, 0x3844, 0x3846,
+ 0x3848, 0x384a, 0x384c, 0x384e, 0x3850, 0x3853, 0x3856, 0x3859,
+ 0x385b, 0x385d, 0x385f, 0x3861, 0x3864, 0x3866, 0x3869, 0x386b,
+ 0x386d, 0x3870, 0x3873, 0x3875, 0x3877, 0x3879, 0x387b, 0x387d,
+ 0x387f, 0x3881, 0x3883, 0x3885, 0x3887, 0x3889, 0x388b, 0x388d,
+ 0x388f, 0x3891, 0x3893, 0x3895, 0x3897, 0x3899, 0x389c, 0x389e,
+ 0x38a0, 0x38a2, 0x38a4, 0x38a6, 0x38a9, 0x38ac, 0x38ae, 0x38b0,
+ 0x38b2, 0x38b4, 0x38b6, 0x38b8, 0x38bb, 0x38bd, 0x38bf, 0x38c1,
+ 0x38c3, 0x38c6, 0x38c9, 0x38cb, 0x38cd, 0x38cf, 0x38d2, 0x38d4,
+ 0x38d6, 0x38d9, 0x38dc, 0x38de, 0x38e0, 0x38e2, 0x38e5, 0x38e7,
+ 0x38e9, 0x38eb, 0x38ed, 0x38ef, 0x38f1, 0x38f3, 0x38f6, 0x38f8,
+ 0x38fa, 0x38fc, 0x38ff, 0x3901, 0x3903, 0x3905, 0x3907, 0x390a,
+ 0x390d, 0x390f, 0x3911, 0x3913, 0x3916, 0x3918, 0x391b, 0x391d,
- 0x38a3, 0x38a5, 0x38a8, 0x38aa, 0x38ac, 0x38ae, 0x38b0, 0x38b2,
- 0x38b4, 0x38b6, 0x38b9, 0x38bb, 0x38bd, 0x38bf, 0x38c1, 0x38c3,
- 0x38c5, 0x38c8, 0x38ca, 0x38cd, 0x38d0, 0x38d3, 0x38d5, 0x38d7,
- 0x38d9, 0x38db, 0x38dd, 0x38df, 0x38e1, 0x38e3, 0xffff, 0xffff,
+ 0x391f, 0x3921, 0x3924, 0x3926, 0x3928, 0x392a, 0x392c, 0x392e,
+ 0x3930, 0x3932, 0x3935, 0x3937, 0x3939, 0x393b, 0x393d, 0x393f,
+ 0x3941, 0x3944, 0x3946, 0x3949, 0x394c, 0x394f, 0x3951, 0x3953,
+ 0x3955, 0x3957, 0x3959, 0x395b, 0x395d, 0x395f, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
@@ -12359,7 +12759,7 @@ static const unsigned short uc_decomposition_trie[] = {
? uc_decomposition_trie[uc_decomposition_trie[((ucs4 - 0x3400) >> 8) + 0x340] + (ucs4 & 0xff)] \
: 0xffff)
-static const unsigned short uc_decomposition_map[] = {
+static constexpr unsigned short uc_decomposition_map[] = {
0x103, 0x20, 0x210, 0x20, 0x308, 0x109, 0x61, 0x210,
0x20, 0x304, 0x109, 0x32, 0x109, 0x33, 0x210, 0x20,
0x301, 0x110, 0x3bc, 0x210, 0x20, 0x327, 0x109, 0x31,
@@ -13948,242 +14348,258 @@ static const unsigned short uc_decomposition_map[] = {
0x37, 0x102, 0x38, 0x102, 0x39, 0x102, 0x30, 0x102,
0x31, 0x102, 0x32, 0x102, 0x33, 0x102, 0x34, 0x102,
0x35, 0x102, 0x36, 0x102, 0x37, 0x102, 0x38, 0x102,
- 0x39, 0x102, 0x627, 0x102, 0x628, 0x102, 0x62c, 0x102,
- 0x62f, 0x102, 0x648, 0x102, 0x632, 0x102, 0x62d, 0x102,
- 0x637, 0x102, 0x64a, 0x102, 0x643, 0x102, 0x644, 0x102,
- 0x645, 0x102, 0x646, 0x102, 0x633, 0x102, 0x639, 0x102,
- 0x641, 0x102, 0x635, 0x102, 0x642, 0x102, 0x631, 0x102,
- 0x634, 0x102, 0x62a, 0x102, 0x62b, 0x102, 0x62e, 0x102,
- 0x630, 0x102, 0x636, 0x102, 0x638, 0x102, 0x63a, 0x102,
- 0x66e, 0x102, 0x6ba, 0x102, 0x6a1, 0x102, 0x66f, 0x102,
- 0x628, 0x102, 0x62c, 0x102, 0x647, 0x102, 0x62d, 0x102,
- 0x64a, 0x102, 0x643, 0x102, 0x644, 0x102, 0x645, 0x102,
- 0x646, 0x102, 0x633, 0x102, 0x639, 0x102, 0x641, 0x102,
- 0x635, 0x102, 0x642, 0x102, 0x634, 0x102, 0x62a, 0x102,
- 0x62b, 0x102, 0x62e, 0x102, 0x636, 0x102, 0x63a, 0x102,
- 0x62c, 0x102, 0x62d, 0x102, 0x64a, 0x102, 0x644, 0x102,
- 0x646, 0x102, 0x633, 0x102, 0x639, 0x102, 0x635, 0x102,
- 0x642, 0x102, 0x634, 0x102, 0x62e, 0x102, 0x636, 0x102,
- 0x63a, 0x102, 0x6ba, 0x102, 0x66f, 0x102, 0x628, 0x102,
- 0x62c, 0x102, 0x647, 0x102, 0x62d, 0x102, 0x637, 0x102,
- 0x64a, 0x102, 0x643, 0x102, 0x645, 0x102, 0x646, 0x102,
- 0x633, 0x102, 0x639, 0x102, 0x641, 0x102, 0x635, 0x102,
- 0x642, 0x102, 0x634, 0x102, 0x62a, 0x102, 0x62b, 0x102,
- 0x62e, 0x102, 0x636, 0x102, 0x638, 0x102, 0x63a, 0x102,
- 0x66e, 0x102, 0x6a1, 0x102, 0x627, 0x102, 0x628, 0x102,
- 0x62c, 0x102, 0x62f, 0x102, 0x647, 0x102, 0x648, 0x102,
+ 0x39, 0x109, 0x430, 0x109, 0x431, 0x109, 0x432, 0x109,
+ 0x433, 0x109, 0x434, 0x109, 0x435, 0x109, 0x436, 0x109,
+ 0x437, 0x109, 0x438, 0x109, 0x43a, 0x109, 0x43b, 0x109,
+ 0x43c, 0x109, 0x43e, 0x109, 0x43f, 0x109, 0x440, 0x109,
+ 0x441, 0x109, 0x442, 0x109, 0x443, 0x109, 0x444, 0x109,
+ 0x445, 0x109, 0x446, 0x109, 0x447, 0x109, 0x448, 0x109,
+ 0x44b, 0x109, 0x44d, 0x109, 0x44e, 0x109, 0xa689, 0x109,
+ 0x4d9, 0x109, 0x456, 0x109, 0x458, 0x109, 0x4e9, 0x109,
+ 0x4af, 0x109, 0x4cf, 0x10a, 0x430, 0x10a, 0x431, 0x10a,
+ 0x432, 0x10a, 0x433, 0x10a, 0x434, 0x10a, 0x435, 0x10a,
+ 0x436, 0x10a, 0x437, 0x10a, 0x438, 0x10a, 0x43a, 0x10a,
+ 0x43b, 0x10a, 0x43e, 0x10a, 0x43f, 0x10a, 0x441, 0x10a,
+ 0x443, 0x10a, 0x444, 0x10a, 0x445, 0x10a, 0x446, 0x10a,
+ 0x447, 0x10a, 0x448, 0x10a, 0x44a, 0x10a, 0x44b, 0x10a,
+ 0x491, 0x10a, 0x456, 0x10a, 0x455, 0x10a, 0x45f, 0x109,
+ 0x4ab, 0x109, 0xa651, 0x109, 0x4b1, 0x102, 0x627, 0x102,
+ 0x628, 0x102, 0x62c, 0x102, 0x62f, 0x102, 0x648, 0x102,
0x632, 0x102, 0x62d, 0x102, 0x637, 0x102, 0x64a, 0x102,
- 0x644, 0x102, 0x645, 0x102, 0x646, 0x102, 0x633, 0x102,
- 0x639, 0x102, 0x641, 0x102, 0x635, 0x102, 0x642, 0x102,
- 0x631, 0x102, 0x634, 0x102, 0x62a, 0x102, 0x62b, 0x102,
- 0x62e, 0x102, 0x630, 0x102, 0x636, 0x102, 0x638, 0x102,
- 0x63a, 0x102, 0x628, 0x102, 0x62c, 0x102, 0x62f, 0x102,
- 0x648, 0x102, 0x632, 0x102, 0x62d, 0x102, 0x637, 0x102,
- 0x64a, 0x102, 0x644, 0x102, 0x645, 0x102, 0x646, 0x102,
+ 0x643, 0x102, 0x644, 0x102, 0x645, 0x102, 0x646, 0x102,
0x633, 0x102, 0x639, 0x102, 0x641, 0x102, 0x635, 0x102,
0x642, 0x102, 0x631, 0x102, 0x634, 0x102, 0x62a, 0x102,
0x62b, 0x102, 0x62e, 0x102, 0x630, 0x102, 0x636, 0x102,
- 0x638, 0x102, 0x63a, 0x210, 0x30, 0x2e, 0x210, 0x30,
- 0x2c, 0x210, 0x31, 0x2c, 0x210, 0x32, 0x2c, 0x210,
- 0x33, 0x2c, 0x210, 0x34, 0x2c, 0x210, 0x35, 0x2c,
- 0x210, 0x36, 0x2c, 0x210, 0x37, 0x2c, 0x210, 0x38,
- 0x2c, 0x210, 0x39, 0x2c, 0x310, 0x28, 0x41, 0x29,
- 0x310, 0x28, 0x42, 0x29, 0x310, 0x28, 0x43, 0x29,
- 0x310, 0x28, 0x44, 0x29, 0x310, 0x28, 0x45, 0x29,
- 0x310, 0x28, 0x46, 0x29, 0x310, 0x28, 0x47, 0x29,
- 0x310, 0x28, 0x48, 0x29, 0x310, 0x28, 0x49, 0x29,
- 0x310, 0x28, 0x4a, 0x29, 0x310, 0x28, 0x4b, 0x29,
- 0x310, 0x28, 0x4c, 0x29, 0x310, 0x28, 0x4d, 0x29,
- 0x310, 0x28, 0x4e, 0x29, 0x310, 0x28, 0x4f, 0x29,
- 0x310, 0x28, 0x50, 0x29, 0x310, 0x28, 0x51, 0x29,
- 0x310, 0x28, 0x52, 0x29, 0x310, 0x28, 0x53, 0x29,
- 0x310, 0x28, 0x54, 0x29, 0x310, 0x28, 0x55, 0x29,
- 0x310, 0x28, 0x56, 0x29, 0x310, 0x28, 0x57, 0x29,
- 0x310, 0x28, 0x58, 0x29, 0x310, 0x28, 0x59, 0x29,
- 0x310, 0x28, 0x5a, 0x29, 0x310, 0x3014, 0x53, 0x3015,
- 0x108, 0x43, 0x108, 0x52, 0x208, 0x43, 0x44, 0x208,
- 0x57, 0x5a, 0x10f, 0x41, 0x10f, 0x42, 0x10f, 0x43,
- 0x10f, 0x44, 0x10f, 0x45, 0x10f, 0x46, 0x10f, 0x47,
- 0x10f, 0x48, 0x10f, 0x49, 0x10f, 0x4a, 0x10f, 0x4b,
- 0x10f, 0x4c, 0x10f, 0x4d, 0x10f, 0x4e, 0x10f, 0x4f,
- 0x10f, 0x50, 0x10f, 0x51, 0x10f, 0x52, 0x10f, 0x53,
- 0x10f, 0x54, 0x10f, 0x55, 0x10f, 0x56, 0x10f, 0x57,
- 0x10f, 0x58, 0x10f, 0x59, 0x10f, 0x5a, 0x20f, 0x48,
- 0x56, 0x20f, 0x4d, 0x56, 0x20f, 0x53, 0x44, 0x20f,
- 0x53, 0x53, 0x30f, 0x50, 0x50, 0x56, 0x20f, 0x57,
- 0x43, 0x209, 0x4d, 0x43, 0x209, 0x4d, 0x44, 0x209,
- 0x4d, 0x52, 0x20f, 0x44, 0x4a, 0x20f, 0x307b, 0x304b,
- 0x20f, 0x30b3, 0x30b3, 0x10f, 0x30b5, 0x10f, 0x624b, 0x10f,
- 0x5b57, 0x10f, 0x53cc, 0x10f, 0x30c7, 0x10f, 0x4e8c, 0x10f,
- 0x591a, 0x10f, 0x89e3, 0x10f, 0x5929, 0x10f, 0x4ea4, 0x10f,
- 0x6620, 0x10f, 0x7121, 0x10f, 0x6599, 0x10f, 0x524d, 0x10f,
- 0x5f8c, 0x10f, 0x518d, 0x10f, 0x65b0, 0x10f, 0x521d, 0x10f,
- 0x7d42, 0x10f, 0x751f, 0x10f, 0x8ca9, 0x10f, 0x58f0, 0x10f,
- 0x5439, 0x10f, 0x6f14, 0x10f, 0x6295, 0x10f, 0x6355, 0x10f,
- 0x4e00, 0x10f, 0x4e09, 0x10f, 0x904a, 0x10f, 0x5de6, 0x10f,
- 0x4e2d, 0x10f, 0x53f3, 0x10f, 0x6307, 0x10f, 0x8d70, 0x10f,
- 0x6253, 0x10f, 0x7981, 0x10f, 0x7a7a, 0x10f, 0x5408, 0x10f,
- 0x6e80, 0x10f, 0x6709, 0x10f, 0x6708, 0x10f, 0x7533, 0x10f,
- 0x5272, 0x10f, 0x55b6, 0x10f, 0x914d, 0x310, 0x3014, 0x672c,
- 0x3015, 0x310, 0x3014, 0x4e09, 0x3015, 0x310, 0x3014, 0x4e8c,
- 0x3015, 0x310, 0x3014, 0x5b89, 0x3015, 0x310, 0x3014, 0x70b9,
- 0x3015, 0x310, 0x3014, 0x6253, 0x3015, 0x310, 0x3014, 0x76d7,
- 0x3015, 0x310, 0x3014, 0x52dd, 0x3015, 0x310, 0x3014, 0x6557,
- 0x3015, 0x108, 0x5f97, 0x108, 0x53ef, 0x102, 0x30, 0x102,
- 0x31, 0x102, 0x32, 0x102, 0x33, 0x102, 0x34, 0x102,
- 0x35, 0x102, 0x36, 0x102, 0x37, 0x102, 0x38, 0x102,
- 0x39, 0x101, 0x4e3d, 0x101, 0x4e38, 0x101, 0x4e41, 0x201,
- 0xd840, 0xdd22, 0x101, 0x4f60, 0x101, 0x4fae, 0x101, 0x4fbb,
- 0x101, 0x5002, 0x101, 0x507a, 0x101, 0x5099, 0x101, 0x50e7,
- 0x101, 0x50cf, 0x101, 0x349e, 0x201, 0xd841, 0xde3a, 0x101,
- 0x514d, 0x101, 0x5154, 0x101, 0x5164, 0x101, 0x5177, 0x201,
- 0xd841, 0xdd1c, 0x101, 0x34b9, 0x101, 0x5167, 0x101, 0x518d,
- 0x201, 0xd841, 0xdd4b, 0x101, 0x5197, 0x101, 0x51a4, 0x101,
- 0x4ecc, 0x101, 0x51ac, 0x101, 0x51b5, 0x201, 0xd864, 0xdddf,
- 0x101, 0x51f5, 0x101, 0x5203, 0x101, 0x34df, 0x101, 0x523b,
- 0x101, 0x5246, 0x101, 0x5272, 0x101, 0x5277, 0x101, 0x3515,
- 0x101, 0x52c7, 0x101, 0x52c9, 0x101, 0x52e4, 0x101, 0x52fa,
- 0x101, 0x5305, 0x101, 0x5306, 0x101, 0x5317, 0x101, 0x5349,
- 0x101, 0x5351, 0x101, 0x535a, 0x101, 0x5373, 0x101, 0x537d,
- 0x101, 0x537f, 0x101, 0x537f, 0x101, 0x537f, 0x201, 0xd842,
- 0xde2c, 0x101, 0x7070, 0x101, 0x53ca, 0x101, 0x53df, 0x201,
- 0xd842, 0xdf63, 0x101, 0x53eb, 0x101, 0x53f1, 0x101, 0x5406,
- 0x101, 0x549e, 0x101, 0x5438, 0x101, 0x5448, 0x101, 0x5468,
- 0x101, 0x54a2, 0x101, 0x54f6, 0x101, 0x5510, 0x101, 0x5553,
- 0x101, 0x5563, 0x101, 0x5584, 0x101, 0x5584, 0x101, 0x5599,
- 0x101, 0x55ab, 0x101, 0x55b3, 0x101, 0x55c2, 0x101, 0x5716,
- 0x101, 0x5606, 0x101, 0x5717, 0x101, 0x5651, 0x101, 0x5674,
- 0x101, 0x5207, 0x101, 0x58ee, 0x101, 0x57ce, 0x101, 0x57f4,
- 0x101, 0x580d, 0x101, 0x578b, 0x101, 0x5832, 0x101, 0x5831,
- 0x101, 0x58ac, 0x201, 0xd845, 0xdce4, 0x101, 0x58f2, 0x101,
- 0x58f7, 0x101, 0x5906, 0x101, 0x591a, 0x101, 0x5922, 0x101,
- 0x5962, 0x201, 0xd845, 0xdea8, 0x201, 0xd845, 0xdeea, 0x101,
- 0x59ec, 0x101, 0x5a1b, 0x101, 0x5a27, 0x101, 0x59d8, 0x101,
- 0x5a66, 0x101, 0x36ee, 0x101, 0x36fc, 0x101, 0x5b08, 0x101,
- 0x5b3e, 0x101, 0x5b3e, 0x201, 0xd846, 0xddc8, 0x101, 0x5bc3,
- 0x101, 0x5bd8, 0x101, 0x5be7, 0x101, 0x5bf3, 0x201, 0xd846,
- 0xdf18, 0x101, 0x5bff, 0x101, 0x5c06, 0x101, 0x5f53, 0x101,
- 0x5c22, 0x101, 0x3781, 0x101, 0x5c60, 0x101, 0x5c6e, 0x101,
- 0x5cc0, 0x101, 0x5c8d, 0x201, 0xd847, 0xdde4, 0x101, 0x5d43,
- 0x201, 0xd847, 0xdde6, 0x101, 0x5d6e, 0x101, 0x5d6b, 0x101,
- 0x5d7c, 0x101, 0x5de1, 0x101, 0x5de2, 0x101, 0x382f, 0x101,
- 0x5dfd, 0x101, 0x5e28, 0x101, 0x5e3d, 0x101, 0x5e69, 0x101,
- 0x3862, 0x201, 0xd848, 0xdd83, 0x101, 0x387c, 0x101, 0x5eb0,
- 0x101, 0x5eb3, 0x101, 0x5eb6, 0x101, 0x5eca, 0x201, 0xd868,
- 0xdf92, 0x101, 0x5efe, 0x201, 0xd848, 0xdf31, 0x201, 0xd848,
- 0xdf31, 0x101, 0x8201, 0x101, 0x5f22, 0x101, 0x5f22, 0x101,
- 0x38c7, 0x201, 0xd84c, 0xdeb8, 0x201, 0xd858, 0xddda, 0x101,
- 0x5f62, 0x101, 0x5f6b, 0x101, 0x38e3, 0x101, 0x5f9a, 0x101,
- 0x5fcd, 0x101, 0x5fd7, 0x101, 0x5ff9, 0x101, 0x6081, 0x101,
- 0x393a, 0x101, 0x391c, 0x101, 0x6094, 0x201, 0xd849, 0xded4,
- 0x101, 0x60c7, 0x101, 0x6148, 0x101, 0x614c, 0x101, 0x614e,
- 0x101, 0x614c, 0x101, 0x617a, 0x101, 0x618e, 0x101, 0x61b2,
- 0x101, 0x61a4, 0x101, 0x61af, 0x101, 0x61de, 0x101, 0x61f2,
- 0x101, 0x61f6, 0x101, 0x6210, 0x101, 0x621b, 0x101, 0x625d,
- 0x101, 0x62b1, 0x101, 0x62d4, 0x101, 0x6350, 0x201, 0xd84a,
- 0xdf0c, 0x101, 0x633d, 0x101, 0x62fc, 0x101, 0x6368, 0x101,
- 0x6383, 0x101, 0x63e4, 0x201, 0xd84a, 0xdff1, 0x101, 0x6422,
- 0x101, 0x63c5, 0x101, 0x63a9, 0x101, 0x3a2e, 0x101, 0x6469,
- 0x101, 0x647e, 0x101, 0x649d, 0x101, 0x6477, 0x101, 0x3a6c,
- 0x101, 0x654f, 0x101, 0x656c, 0x201, 0xd84c, 0xdc0a, 0x101,
- 0x65e3, 0x101, 0x66f8, 0x101, 0x6649, 0x101, 0x3b19, 0x101,
- 0x6691, 0x101, 0x3b08, 0x101, 0x3ae4, 0x101, 0x5192, 0x101,
- 0x5195, 0x101, 0x6700, 0x101, 0x669c, 0x101, 0x80ad, 0x101,
- 0x43d9, 0x101, 0x6717, 0x101, 0x671b, 0x101, 0x6721, 0x101,
- 0x675e, 0x101, 0x6753, 0x201, 0xd84c, 0xdfc3, 0x101, 0x3b49,
- 0x101, 0x67fa, 0x101, 0x6785, 0x101, 0x6852, 0x101, 0x6885,
- 0x201, 0xd84d, 0xdc6d, 0x101, 0x688e, 0x101, 0x681f, 0x101,
- 0x6914, 0x101, 0x3b9d, 0x101, 0x6942, 0x101, 0x69a3, 0x101,
- 0x69ea, 0x101, 0x6aa8, 0x201, 0xd84d, 0xdea3, 0x101, 0x6adb,
- 0x101, 0x3c18, 0x101, 0x6b21, 0x201, 0xd84e, 0xdca7, 0x101,
- 0x6b54, 0x101, 0x3c4e, 0x101, 0x6b72, 0x101, 0x6b9f, 0x101,
- 0x6bba, 0x101, 0x6bbb, 0x201, 0xd84e, 0xde8d, 0x201, 0xd847,
- 0xdd0b, 0x201, 0xd84e, 0xdefa, 0x101, 0x6c4e, 0x201, 0xd84f,
- 0xdcbc, 0x101, 0x6cbf, 0x101, 0x6ccd, 0x101, 0x6c67, 0x101,
- 0x6d16, 0x101, 0x6d3e, 0x101, 0x6d77, 0x101, 0x6d41, 0x101,
- 0x6d69, 0x101, 0x6d78, 0x101, 0x6d85, 0x201, 0xd84f, 0xdd1e,
- 0x101, 0x6d34, 0x101, 0x6e2f, 0x101, 0x6e6e, 0x101, 0x3d33,
- 0x101, 0x6ecb, 0x101, 0x6ec7, 0x201, 0xd84f, 0xded1, 0x101,
- 0x6df9, 0x101, 0x6f6e, 0x201, 0xd84f, 0xdf5e, 0x201, 0xd84f,
- 0xdf8e, 0x101, 0x6fc6, 0x101, 0x7039, 0x101, 0x701e, 0x101,
- 0x701b, 0x101, 0x3d96, 0x101, 0x704a, 0x101, 0x707d, 0x101,
- 0x7077, 0x101, 0x70ad, 0x201, 0xd841, 0xdd25, 0x101, 0x7145,
- 0x201, 0xd850, 0xde63, 0x101, 0x719c, 0x201, 0xd850, 0xdfab,
- 0x101, 0x7228, 0x101, 0x7235, 0x101, 0x7250, 0x201, 0xd851,
- 0xde08, 0x101, 0x7280, 0x101, 0x7295, 0x201, 0xd851, 0xdf35,
- 0x201, 0xd852, 0xdc14, 0x101, 0x737a, 0x101, 0x738b, 0x101,
- 0x3eac, 0x101, 0x73a5, 0x101, 0x3eb8, 0x101, 0x3eb8, 0x101,
- 0x7447, 0x101, 0x745c, 0x101, 0x7471, 0x101, 0x7485, 0x101,
- 0x74ca, 0x101, 0x3f1b, 0x101, 0x7524, 0x201, 0xd853, 0xdc36,
- 0x101, 0x753e, 0x201, 0xd853, 0xdc92, 0x101, 0x7570, 0x201,
- 0xd848, 0xdd9f, 0x101, 0x7610, 0x201, 0xd853, 0xdfa1, 0x201,
- 0xd853, 0xdfb8, 0x201, 0xd854, 0xdc44, 0x101, 0x3ffc, 0x101,
- 0x4008, 0x101, 0x76f4, 0x201, 0xd854, 0xdcf3, 0x201, 0xd854,
- 0xdcf2, 0x201, 0xd854, 0xdd19, 0x201, 0xd854, 0xdd33, 0x101,
- 0x771e, 0x101, 0x771f, 0x101, 0x771f, 0x101, 0x774a, 0x101,
- 0x4039, 0x101, 0x778b, 0x101, 0x4046, 0x101, 0x4096, 0x201,
- 0xd855, 0xdc1d, 0x101, 0x784e, 0x101, 0x788c, 0x101, 0x78cc,
- 0x101, 0x40e3, 0x201, 0xd855, 0xde26, 0x101, 0x7956, 0x201,
- 0xd855, 0xde9a, 0x201, 0xd855, 0xdec5, 0x101, 0x798f, 0x101,
- 0x79eb, 0x101, 0x412f, 0x101, 0x7a40, 0x101, 0x7a4a, 0x101,
- 0x7a4f, 0x201, 0xd856, 0xdd7c, 0x201, 0xd856, 0xdea7, 0x201,
- 0xd856, 0xdea7, 0x101, 0x7aee, 0x101, 0x4202, 0x201, 0xd856,
- 0xdfab, 0x101, 0x7bc6, 0x101, 0x7bc9, 0x101, 0x4227, 0x201,
- 0xd857, 0xdc80, 0x101, 0x7cd2, 0x101, 0x42a0, 0x101, 0x7ce8,
- 0x101, 0x7ce3, 0x101, 0x7d00, 0x201, 0xd857, 0xdf86, 0x101,
- 0x7d63, 0x101, 0x4301, 0x101, 0x7dc7, 0x101, 0x7e02, 0x101,
- 0x7e45, 0x101, 0x4334, 0x201, 0xd858, 0xde28, 0x201, 0xd858,
- 0xde47, 0x101, 0x4359, 0x201, 0xd858, 0xded9, 0x101, 0x7f7a,
- 0x201, 0xd858, 0xdf3e, 0x101, 0x7f95, 0x101, 0x7ffa, 0x101,
- 0x8005, 0x201, 0xd859, 0xdcda, 0x201, 0xd859, 0xdd23, 0x101,
- 0x8060, 0x201, 0xd859, 0xdda8, 0x101, 0x8070, 0x201, 0xd84c,
- 0xdf5f, 0x101, 0x43d5, 0x101, 0x80b2, 0x101, 0x8103, 0x101,
- 0x440b, 0x101, 0x813e, 0x101, 0x5ab5, 0x201, 0xd859, 0xdfa7,
- 0x201, 0xd859, 0xdfb5, 0x201, 0xd84c, 0xdf93, 0x201, 0xd84c,
- 0xdf9c, 0x101, 0x8201, 0x101, 0x8204, 0x101, 0x8f9e, 0x101,
- 0x446b, 0x101, 0x8291, 0x101, 0x828b, 0x101, 0x829d, 0x101,
- 0x52b3, 0x101, 0x82b1, 0x101, 0x82b3, 0x101, 0x82bd, 0x101,
- 0x82e6, 0x201, 0xd85a, 0xdf3c, 0x101, 0x82e5, 0x101, 0x831d,
- 0x101, 0x8363, 0x101, 0x83ad, 0x101, 0x8323, 0x101, 0x83bd,
- 0x101, 0x83e7, 0x101, 0x8457, 0x101, 0x8353, 0x101, 0x83ca,
- 0x101, 0x83cc, 0x101, 0x83dc, 0x201, 0xd85b, 0xdc36, 0x201,
- 0xd85b, 0xdd6b, 0x201, 0xd85b, 0xdcd5, 0x101, 0x452b, 0x101,
- 0x84f1, 0x101, 0x84f3, 0x101, 0x8516, 0x201, 0xd85c, 0xdfca,
- 0x101, 0x8564, 0x201, 0xd85b, 0xdf2c, 0x101, 0x455d, 0x101,
- 0x4561, 0x201, 0xd85b, 0xdfb1, 0x201, 0xd85c, 0xdcd2, 0x101,
- 0x456b, 0x101, 0x8650, 0x101, 0x865c, 0x101, 0x8667, 0x101,
- 0x8669, 0x101, 0x86a9, 0x101, 0x8688, 0x101, 0x870e, 0x101,
- 0x86e2, 0x101, 0x8779, 0x101, 0x8728, 0x101, 0x876b, 0x101,
- 0x8786, 0x101, 0x45d7, 0x101, 0x87e1, 0x101, 0x8801, 0x101,
- 0x45f9, 0x101, 0x8860, 0x101, 0x8863, 0x201, 0xd85d, 0xde67,
- 0x101, 0x88d7, 0x101, 0x88de, 0x101, 0x4635, 0x101, 0x88fa,
- 0x101, 0x34bb, 0x201, 0xd85e, 0xdcae, 0x201, 0xd85e, 0xdd66,
- 0x101, 0x46be, 0x101, 0x46c7, 0x101, 0x8aa0, 0x101, 0x8aed,
- 0x101, 0x8b8a, 0x101, 0x8c55, 0x201, 0xd85f, 0xdca8, 0x101,
- 0x8cab, 0x101, 0x8cc1, 0x101, 0x8d1b, 0x101, 0x8d77, 0x201,
- 0xd85f, 0xdf2f, 0x201, 0xd842, 0xdc04, 0x101, 0x8dcb, 0x101,
- 0x8dbc, 0x101, 0x8df0, 0x201, 0xd842, 0xdcde, 0x101, 0x8ed4,
- 0x101, 0x8f38, 0x201, 0xd861, 0xddd2, 0x201, 0xd861, 0xdded,
- 0x101, 0x9094, 0x101, 0x90f1, 0x101, 0x9111, 0x201, 0xd861,
- 0xdf2e, 0x101, 0x911b, 0x101, 0x9238, 0x101, 0x92d7, 0x101,
- 0x92d8, 0x101, 0x927c, 0x101, 0x93f9, 0x101, 0x9415, 0x201,
- 0xd862, 0xdffa, 0x101, 0x958b, 0x101, 0x4995, 0x101, 0x95b7,
- 0x201, 0xd863, 0xdd77, 0x101, 0x49e6, 0x101, 0x96c3, 0x101,
- 0x5db2, 0x101, 0x9723, 0x201, 0xd864, 0xdd45, 0x201, 0xd864,
- 0xde1a, 0x101, 0x4a6e, 0x101, 0x4a76, 0x101, 0x97e0, 0x201,
- 0xd865, 0xdc0a, 0x101, 0x4ab2, 0x201, 0xd865, 0xdc96, 0x101,
- 0x980b, 0x101, 0x980b, 0x101, 0x9829, 0x201, 0xd865, 0xddb6,
- 0x101, 0x98e2, 0x101, 0x4b33, 0x101, 0x9929, 0x101, 0x99a7,
- 0x101, 0x99c2, 0x101, 0x99fe, 0x101, 0x4bce, 0x201, 0xd866,
- 0xdf30, 0x101, 0x9b12, 0x101, 0x9c40, 0x101, 0x9cfd, 0x101,
- 0x4cce, 0x101, 0x4ced, 0x101, 0x9d67, 0x201, 0xd868, 0xdcce,
- 0x101, 0x4cf8, 0x201, 0xd868, 0xdd05, 0x201, 0xd868, 0xde0e,
- 0x201, 0xd868, 0xde91, 0x101, 0x9ebb, 0x101, 0x4d56, 0x101,
- 0x9ef9, 0x101, 0x9efe, 0x101, 0x9f05, 0x101, 0x9f0f, 0x101,
- 0x9f16, 0x101, 0x9f3b, 0x201, 0xd869, 0xde00
+ 0x638, 0x102, 0x63a, 0x102, 0x66e, 0x102, 0x6ba, 0x102,
+ 0x6a1, 0x102, 0x66f, 0x102, 0x628, 0x102, 0x62c, 0x102,
+ 0x647, 0x102, 0x62d, 0x102, 0x64a, 0x102, 0x643, 0x102,
+ 0x644, 0x102, 0x645, 0x102, 0x646, 0x102, 0x633, 0x102,
+ 0x639, 0x102, 0x641, 0x102, 0x635, 0x102, 0x642, 0x102,
+ 0x634, 0x102, 0x62a, 0x102, 0x62b, 0x102, 0x62e, 0x102,
+ 0x636, 0x102, 0x63a, 0x102, 0x62c, 0x102, 0x62d, 0x102,
+ 0x64a, 0x102, 0x644, 0x102, 0x646, 0x102, 0x633, 0x102,
+ 0x639, 0x102, 0x635, 0x102, 0x642, 0x102, 0x634, 0x102,
+ 0x62e, 0x102, 0x636, 0x102, 0x63a, 0x102, 0x6ba, 0x102,
+ 0x66f, 0x102, 0x628, 0x102, 0x62c, 0x102, 0x647, 0x102,
+ 0x62d, 0x102, 0x637, 0x102, 0x64a, 0x102, 0x643, 0x102,
+ 0x645, 0x102, 0x646, 0x102, 0x633, 0x102, 0x639, 0x102,
+ 0x641, 0x102, 0x635, 0x102, 0x642, 0x102, 0x634, 0x102,
+ 0x62a, 0x102, 0x62b, 0x102, 0x62e, 0x102, 0x636, 0x102,
+ 0x638, 0x102, 0x63a, 0x102, 0x66e, 0x102, 0x6a1, 0x102,
+ 0x627, 0x102, 0x628, 0x102, 0x62c, 0x102, 0x62f, 0x102,
+ 0x647, 0x102, 0x648, 0x102, 0x632, 0x102, 0x62d, 0x102,
+ 0x637, 0x102, 0x64a, 0x102, 0x644, 0x102, 0x645, 0x102,
+ 0x646, 0x102, 0x633, 0x102, 0x639, 0x102, 0x641, 0x102,
+ 0x635, 0x102, 0x642, 0x102, 0x631, 0x102, 0x634, 0x102,
+ 0x62a, 0x102, 0x62b, 0x102, 0x62e, 0x102, 0x630, 0x102,
+ 0x636, 0x102, 0x638, 0x102, 0x63a, 0x102, 0x628, 0x102,
+ 0x62c, 0x102, 0x62f, 0x102, 0x648, 0x102, 0x632, 0x102,
+ 0x62d, 0x102, 0x637, 0x102, 0x64a, 0x102, 0x644, 0x102,
+ 0x645, 0x102, 0x646, 0x102, 0x633, 0x102, 0x639, 0x102,
+ 0x641, 0x102, 0x635, 0x102, 0x642, 0x102, 0x631, 0x102,
+ 0x634, 0x102, 0x62a, 0x102, 0x62b, 0x102, 0x62e, 0x102,
+ 0x630, 0x102, 0x636, 0x102, 0x638, 0x102, 0x63a, 0x210,
+ 0x30, 0x2e, 0x210, 0x30, 0x2c, 0x210, 0x31, 0x2c,
+ 0x210, 0x32, 0x2c, 0x210, 0x33, 0x2c, 0x210, 0x34,
+ 0x2c, 0x210, 0x35, 0x2c, 0x210, 0x36, 0x2c, 0x210,
+ 0x37, 0x2c, 0x210, 0x38, 0x2c, 0x210, 0x39, 0x2c,
+ 0x310, 0x28, 0x41, 0x29, 0x310, 0x28, 0x42, 0x29,
+ 0x310, 0x28, 0x43, 0x29, 0x310, 0x28, 0x44, 0x29,
+ 0x310, 0x28, 0x45, 0x29, 0x310, 0x28, 0x46, 0x29,
+ 0x310, 0x28, 0x47, 0x29, 0x310, 0x28, 0x48, 0x29,
+ 0x310, 0x28, 0x49, 0x29, 0x310, 0x28, 0x4a, 0x29,
+ 0x310, 0x28, 0x4b, 0x29, 0x310, 0x28, 0x4c, 0x29,
+ 0x310, 0x28, 0x4d, 0x29, 0x310, 0x28, 0x4e, 0x29,
+ 0x310, 0x28, 0x4f, 0x29, 0x310, 0x28, 0x50, 0x29,
+ 0x310, 0x28, 0x51, 0x29, 0x310, 0x28, 0x52, 0x29,
+ 0x310, 0x28, 0x53, 0x29, 0x310, 0x28, 0x54, 0x29,
+ 0x310, 0x28, 0x55, 0x29, 0x310, 0x28, 0x56, 0x29,
+ 0x310, 0x28, 0x57, 0x29, 0x310, 0x28, 0x58, 0x29,
+ 0x310, 0x28, 0x59, 0x29, 0x310, 0x28, 0x5a, 0x29,
+ 0x310, 0x3014, 0x53, 0x3015, 0x108, 0x43, 0x108, 0x52,
+ 0x208, 0x43, 0x44, 0x208, 0x57, 0x5a, 0x10f, 0x41,
+ 0x10f, 0x42, 0x10f, 0x43, 0x10f, 0x44, 0x10f, 0x45,
+ 0x10f, 0x46, 0x10f, 0x47, 0x10f, 0x48, 0x10f, 0x49,
+ 0x10f, 0x4a, 0x10f, 0x4b, 0x10f, 0x4c, 0x10f, 0x4d,
+ 0x10f, 0x4e, 0x10f, 0x4f, 0x10f, 0x50, 0x10f, 0x51,
+ 0x10f, 0x52, 0x10f, 0x53, 0x10f, 0x54, 0x10f, 0x55,
+ 0x10f, 0x56, 0x10f, 0x57, 0x10f, 0x58, 0x10f, 0x59,
+ 0x10f, 0x5a, 0x20f, 0x48, 0x56, 0x20f, 0x4d, 0x56,
+ 0x20f, 0x53, 0x44, 0x20f, 0x53, 0x53, 0x30f, 0x50,
+ 0x50, 0x56, 0x20f, 0x57, 0x43, 0x209, 0x4d, 0x43,
+ 0x209, 0x4d, 0x44, 0x209, 0x4d, 0x52, 0x20f, 0x44,
+ 0x4a, 0x20f, 0x307b, 0x304b, 0x20f, 0x30b3, 0x30b3, 0x10f,
+ 0x30b5, 0x10f, 0x624b, 0x10f, 0x5b57, 0x10f, 0x53cc, 0x10f,
+ 0x30c7, 0x10f, 0x4e8c, 0x10f, 0x591a, 0x10f, 0x89e3, 0x10f,
+ 0x5929, 0x10f, 0x4ea4, 0x10f, 0x6620, 0x10f, 0x7121, 0x10f,
+ 0x6599, 0x10f, 0x524d, 0x10f, 0x5f8c, 0x10f, 0x518d, 0x10f,
+ 0x65b0, 0x10f, 0x521d, 0x10f, 0x7d42, 0x10f, 0x751f, 0x10f,
+ 0x8ca9, 0x10f, 0x58f0, 0x10f, 0x5439, 0x10f, 0x6f14, 0x10f,
+ 0x6295, 0x10f, 0x6355, 0x10f, 0x4e00, 0x10f, 0x4e09, 0x10f,
+ 0x904a, 0x10f, 0x5de6, 0x10f, 0x4e2d, 0x10f, 0x53f3, 0x10f,
+ 0x6307, 0x10f, 0x8d70, 0x10f, 0x6253, 0x10f, 0x7981, 0x10f,
+ 0x7a7a, 0x10f, 0x5408, 0x10f, 0x6e80, 0x10f, 0x6709, 0x10f,
+ 0x6708, 0x10f, 0x7533, 0x10f, 0x5272, 0x10f, 0x55b6, 0x10f,
+ 0x914d, 0x310, 0x3014, 0x672c, 0x3015, 0x310, 0x3014, 0x4e09,
+ 0x3015, 0x310, 0x3014, 0x4e8c, 0x3015, 0x310, 0x3014, 0x5b89,
+ 0x3015, 0x310, 0x3014, 0x70b9, 0x3015, 0x310, 0x3014, 0x6253,
+ 0x3015, 0x310, 0x3014, 0x76d7, 0x3015, 0x310, 0x3014, 0x52dd,
+ 0x3015, 0x310, 0x3014, 0x6557, 0x3015, 0x108, 0x5f97, 0x108,
+ 0x53ef, 0x102, 0x30, 0x102, 0x31, 0x102, 0x32, 0x102,
+ 0x33, 0x102, 0x34, 0x102, 0x35, 0x102, 0x36, 0x102,
+ 0x37, 0x102, 0x38, 0x102, 0x39, 0x101, 0x4e3d, 0x101,
+ 0x4e38, 0x101, 0x4e41, 0x201, 0xd840, 0xdd22, 0x101, 0x4f60,
+ 0x101, 0x4fae, 0x101, 0x4fbb, 0x101, 0x5002, 0x101, 0x507a,
+ 0x101, 0x5099, 0x101, 0x50e7, 0x101, 0x50cf, 0x101, 0x349e,
+ 0x201, 0xd841, 0xde3a, 0x101, 0x514d, 0x101, 0x5154, 0x101,
+ 0x5164, 0x101, 0x5177, 0x201, 0xd841, 0xdd1c, 0x101, 0x34b9,
+ 0x101, 0x5167, 0x101, 0x518d, 0x201, 0xd841, 0xdd4b, 0x101,
+ 0x5197, 0x101, 0x51a4, 0x101, 0x4ecc, 0x101, 0x51ac, 0x101,
+ 0x51b5, 0x201, 0xd864, 0xdddf, 0x101, 0x51f5, 0x101, 0x5203,
+ 0x101, 0x34df, 0x101, 0x523b, 0x101, 0x5246, 0x101, 0x5272,
+ 0x101, 0x5277, 0x101, 0x3515, 0x101, 0x52c7, 0x101, 0x52c9,
+ 0x101, 0x52e4, 0x101, 0x52fa, 0x101, 0x5305, 0x101, 0x5306,
+ 0x101, 0x5317, 0x101, 0x5349, 0x101, 0x5351, 0x101, 0x535a,
+ 0x101, 0x5373, 0x101, 0x537d, 0x101, 0x537f, 0x101, 0x537f,
+ 0x101, 0x537f, 0x201, 0xd842, 0xde2c, 0x101, 0x7070, 0x101,
+ 0x53ca, 0x101, 0x53df, 0x201, 0xd842, 0xdf63, 0x101, 0x53eb,
+ 0x101, 0x53f1, 0x101, 0x5406, 0x101, 0x549e, 0x101, 0x5438,
+ 0x101, 0x5448, 0x101, 0x5468, 0x101, 0x54a2, 0x101, 0x54f6,
+ 0x101, 0x5510, 0x101, 0x5553, 0x101, 0x5563, 0x101, 0x5584,
+ 0x101, 0x5584, 0x101, 0x5599, 0x101, 0x55ab, 0x101, 0x55b3,
+ 0x101, 0x55c2, 0x101, 0x5716, 0x101, 0x5606, 0x101, 0x5717,
+ 0x101, 0x5651, 0x101, 0x5674, 0x101, 0x5207, 0x101, 0x58ee,
+ 0x101, 0x57ce, 0x101, 0x57f4, 0x101, 0x580d, 0x101, 0x578b,
+ 0x101, 0x5832, 0x101, 0x5831, 0x101, 0x58ac, 0x201, 0xd845,
+ 0xdce4, 0x101, 0x58f2, 0x101, 0x58f7, 0x101, 0x5906, 0x101,
+ 0x591a, 0x101, 0x5922, 0x101, 0x5962, 0x201, 0xd845, 0xdea8,
+ 0x201, 0xd845, 0xdeea, 0x101, 0x59ec, 0x101, 0x5a1b, 0x101,
+ 0x5a27, 0x101, 0x59d8, 0x101, 0x5a66, 0x101, 0x36ee, 0x101,
+ 0x36fc, 0x101, 0x5b08, 0x101, 0x5b3e, 0x101, 0x5b3e, 0x201,
+ 0xd846, 0xddc8, 0x101, 0x5bc3, 0x101, 0x5bd8, 0x101, 0x5be7,
+ 0x101, 0x5bf3, 0x201, 0xd846, 0xdf18, 0x101, 0x5bff, 0x101,
+ 0x5c06, 0x101, 0x5f53, 0x101, 0x5c22, 0x101, 0x3781, 0x101,
+ 0x5c60, 0x101, 0x5c6e, 0x101, 0x5cc0, 0x101, 0x5c8d, 0x201,
+ 0xd847, 0xdde4, 0x101, 0x5d43, 0x201, 0xd847, 0xdde6, 0x101,
+ 0x5d6e, 0x101, 0x5d6b, 0x101, 0x5d7c, 0x101, 0x5de1, 0x101,
+ 0x5de2, 0x101, 0x382f, 0x101, 0x5dfd, 0x101, 0x5e28, 0x101,
+ 0x5e3d, 0x101, 0x5e69, 0x101, 0x3862, 0x201, 0xd848, 0xdd83,
+ 0x101, 0x387c, 0x101, 0x5eb0, 0x101, 0x5eb3, 0x101, 0x5eb6,
+ 0x101, 0x5eca, 0x201, 0xd868, 0xdf92, 0x101, 0x5efe, 0x201,
+ 0xd848, 0xdf31, 0x201, 0xd848, 0xdf31, 0x101, 0x8201, 0x101,
+ 0x5f22, 0x101, 0x5f22, 0x101, 0x38c7, 0x201, 0xd84c, 0xdeb8,
+ 0x201, 0xd858, 0xddda, 0x101, 0x5f62, 0x101, 0x5f6b, 0x101,
+ 0x38e3, 0x101, 0x5f9a, 0x101, 0x5fcd, 0x101, 0x5fd7, 0x101,
+ 0x5ff9, 0x101, 0x6081, 0x101, 0x393a, 0x101, 0x391c, 0x101,
+ 0x6094, 0x201, 0xd849, 0xded4, 0x101, 0x60c7, 0x101, 0x6148,
+ 0x101, 0x614c, 0x101, 0x614e, 0x101, 0x614c, 0x101, 0x617a,
+ 0x101, 0x618e, 0x101, 0x61b2, 0x101, 0x61a4, 0x101, 0x61af,
+ 0x101, 0x61de, 0x101, 0x61f2, 0x101, 0x61f6, 0x101, 0x6210,
+ 0x101, 0x621b, 0x101, 0x625d, 0x101, 0x62b1, 0x101, 0x62d4,
+ 0x101, 0x6350, 0x201, 0xd84a, 0xdf0c, 0x101, 0x633d, 0x101,
+ 0x62fc, 0x101, 0x6368, 0x101, 0x6383, 0x101, 0x63e4, 0x201,
+ 0xd84a, 0xdff1, 0x101, 0x6422, 0x101, 0x63c5, 0x101, 0x63a9,
+ 0x101, 0x3a2e, 0x101, 0x6469, 0x101, 0x647e, 0x101, 0x649d,
+ 0x101, 0x6477, 0x101, 0x3a6c, 0x101, 0x654f, 0x101, 0x656c,
+ 0x201, 0xd84c, 0xdc0a, 0x101, 0x65e3, 0x101, 0x66f8, 0x101,
+ 0x6649, 0x101, 0x3b19, 0x101, 0x6691, 0x101, 0x3b08, 0x101,
+ 0x3ae4, 0x101, 0x5192, 0x101, 0x5195, 0x101, 0x6700, 0x101,
+ 0x669c, 0x101, 0x80ad, 0x101, 0x43d9, 0x101, 0x6717, 0x101,
+ 0x671b, 0x101, 0x6721, 0x101, 0x675e, 0x101, 0x6753, 0x201,
+ 0xd84c, 0xdfc3, 0x101, 0x3b49, 0x101, 0x67fa, 0x101, 0x6785,
+ 0x101, 0x6852, 0x101, 0x6885, 0x201, 0xd84d, 0xdc6d, 0x101,
+ 0x688e, 0x101, 0x681f, 0x101, 0x6914, 0x101, 0x3b9d, 0x101,
+ 0x6942, 0x101, 0x69a3, 0x101, 0x69ea, 0x101, 0x6aa8, 0x201,
+ 0xd84d, 0xdea3, 0x101, 0x6adb, 0x101, 0x3c18, 0x101, 0x6b21,
+ 0x201, 0xd84e, 0xdca7, 0x101, 0x6b54, 0x101, 0x3c4e, 0x101,
+ 0x6b72, 0x101, 0x6b9f, 0x101, 0x6bba, 0x101, 0x6bbb, 0x201,
+ 0xd84e, 0xde8d, 0x201, 0xd847, 0xdd0b, 0x201, 0xd84e, 0xdefa,
+ 0x101, 0x6c4e, 0x201, 0xd84f, 0xdcbc, 0x101, 0x6cbf, 0x101,
+ 0x6ccd, 0x101, 0x6c67, 0x101, 0x6d16, 0x101, 0x6d3e, 0x101,
+ 0x6d77, 0x101, 0x6d41, 0x101, 0x6d69, 0x101, 0x6d78, 0x101,
+ 0x6d85, 0x201, 0xd84f, 0xdd1e, 0x101, 0x6d34, 0x101, 0x6e2f,
+ 0x101, 0x6e6e, 0x101, 0x3d33, 0x101, 0x6ecb, 0x101, 0x6ec7,
+ 0x201, 0xd84f, 0xded1, 0x101, 0x6df9, 0x101, 0x6f6e, 0x201,
+ 0xd84f, 0xdf5e, 0x201, 0xd84f, 0xdf8e, 0x101, 0x6fc6, 0x101,
+ 0x7039, 0x101, 0x701e, 0x101, 0x701b, 0x101, 0x3d96, 0x101,
+ 0x704a, 0x101, 0x707d, 0x101, 0x7077, 0x101, 0x70ad, 0x201,
+ 0xd841, 0xdd25, 0x101, 0x7145, 0x201, 0xd850, 0xde63, 0x101,
+ 0x719c, 0x201, 0xd850, 0xdfab, 0x101, 0x7228, 0x101, 0x7235,
+ 0x101, 0x7250, 0x201, 0xd851, 0xde08, 0x101, 0x7280, 0x101,
+ 0x7295, 0x201, 0xd851, 0xdf35, 0x201, 0xd852, 0xdc14, 0x101,
+ 0x737a, 0x101, 0x738b, 0x101, 0x3eac, 0x101, 0x73a5, 0x101,
+ 0x3eb8, 0x101, 0x3eb8, 0x101, 0x7447, 0x101, 0x745c, 0x101,
+ 0x7471, 0x101, 0x7485, 0x101, 0x74ca, 0x101, 0x3f1b, 0x101,
+ 0x7524, 0x201, 0xd853, 0xdc36, 0x101, 0x753e, 0x201, 0xd853,
+ 0xdc92, 0x101, 0x7570, 0x201, 0xd848, 0xdd9f, 0x101, 0x7610,
+ 0x201, 0xd853, 0xdfa1, 0x201, 0xd853, 0xdfb8, 0x201, 0xd854,
+ 0xdc44, 0x101, 0x3ffc, 0x101, 0x4008, 0x101, 0x76f4, 0x201,
+ 0xd854, 0xdcf3, 0x201, 0xd854, 0xdcf2, 0x201, 0xd854, 0xdd19,
+ 0x201, 0xd854, 0xdd33, 0x101, 0x771e, 0x101, 0x771f, 0x101,
+ 0x771f, 0x101, 0x774a, 0x101, 0x4039, 0x101, 0x778b, 0x101,
+ 0x4046, 0x101, 0x4096, 0x201, 0xd855, 0xdc1d, 0x101, 0x784e,
+ 0x101, 0x788c, 0x101, 0x78cc, 0x101, 0x40e3, 0x201, 0xd855,
+ 0xde26, 0x101, 0x7956, 0x201, 0xd855, 0xde9a, 0x201, 0xd855,
+ 0xdec5, 0x101, 0x798f, 0x101, 0x79eb, 0x101, 0x412f, 0x101,
+ 0x7a40, 0x101, 0x7a4a, 0x101, 0x7a4f, 0x201, 0xd856, 0xdd7c,
+ 0x201, 0xd856, 0xdea7, 0x201, 0xd856, 0xdea7, 0x101, 0x7aee,
+ 0x101, 0x4202, 0x201, 0xd856, 0xdfab, 0x101, 0x7bc6, 0x101,
+ 0x7bc9, 0x101, 0x4227, 0x201, 0xd857, 0xdc80, 0x101, 0x7cd2,
+ 0x101, 0x42a0, 0x101, 0x7ce8, 0x101, 0x7ce3, 0x101, 0x7d00,
+ 0x201, 0xd857, 0xdf86, 0x101, 0x7d63, 0x101, 0x4301, 0x101,
+ 0x7dc7, 0x101, 0x7e02, 0x101, 0x7e45, 0x101, 0x4334, 0x201,
+ 0xd858, 0xde28, 0x201, 0xd858, 0xde47, 0x101, 0x4359, 0x201,
+ 0xd858, 0xded9, 0x101, 0x7f7a, 0x201, 0xd858, 0xdf3e, 0x101,
+ 0x7f95, 0x101, 0x7ffa, 0x101, 0x8005, 0x201, 0xd859, 0xdcda,
+ 0x201, 0xd859, 0xdd23, 0x101, 0x8060, 0x201, 0xd859, 0xdda8,
+ 0x101, 0x8070, 0x201, 0xd84c, 0xdf5f, 0x101, 0x43d5, 0x101,
+ 0x80b2, 0x101, 0x8103, 0x101, 0x440b, 0x101, 0x813e, 0x101,
+ 0x5ab5, 0x201, 0xd859, 0xdfa7, 0x201, 0xd859, 0xdfb5, 0x201,
+ 0xd84c, 0xdf93, 0x201, 0xd84c, 0xdf9c, 0x101, 0x8201, 0x101,
+ 0x8204, 0x101, 0x8f9e, 0x101, 0x446b, 0x101, 0x8291, 0x101,
+ 0x828b, 0x101, 0x829d, 0x101, 0x52b3, 0x101, 0x82b1, 0x101,
+ 0x82b3, 0x101, 0x82bd, 0x101, 0x82e6, 0x201, 0xd85a, 0xdf3c,
+ 0x101, 0x82e5, 0x101, 0x831d, 0x101, 0x8363, 0x101, 0x83ad,
+ 0x101, 0x8323, 0x101, 0x83bd, 0x101, 0x83e7, 0x101, 0x8457,
+ 0x101, 0x8353, 0x101, 0x83ca, 0x101, 0x83cc, 0x101, 0x83dc,
+ 0x201, 0xd85b, 0xdc36, 0x201, 0xd85b, 0xdd6b, 0x201, 0xd85b,
+ 0xdcd5, 0x101, 0x452b, 0x101, 0x84f1, 0x101, 0x84f3, 0x101,
+ 0x8516, 0x201, 0xd85c, 0xdfca, 0x101, 0x8564, 0x201, 0xd85b,
+ 0xdf2c, 0x101, 0x455d, 0x101, 0x4561, 0x201, 0xd85b, 0xdfb1,
+ 0x201, 0xd85c, 0xdcd2, 0x101, 0x456b, 0x101, 0x8650, 0x101,
+ 0x865c, 0x101, 0x8667, 0x101, 0x8669, 0x101, 0x86a9, 0x101,
+ 0x8688, 0x101, 0x870e, 0x101, 0x86e2, 0x101, 0x8779, 0x101,
+ 0x8728, 0x101, 0x876b, 0x101, 0x8786, 0x101, 0x45d7, 0x101,
+ 0x87e1, 0x101, 0x8801, 0x101, 0x45f9, 0x101, 0x8860, 0x101,
+ 0x8863, 0x201, 0xd85d, 0xde67, 0x101, 0x88d7, 0x101, 0x88de,
+ 0x101, 0x4635, 0x101, 0x88fa, 0x101, 0x34bb, 0x201, 0xd85e,
+ 0xdcae, 0x201, 0xd85e, 0xdd66, 0x101, 0x46be, 0x101, 0x46c7,
+ 0x101, 0x8aa0, 0x101, 0x8aed, 0x101, 0x8b8a, 0x101, 0x8c55,
+ 0x201, 0xd85f, 0xdca8, 0x101, 0x8cab, 0x101, 0x8cc1, 0x101,
+ 0x8d1b, 0x101, 0x8d77, 0x201, 0xd85f, 0xdf2f, 0x201, 0xd842,
+ 0xdc04, 0x101, 0x8dcb, 0x101, 0x8dbc, 0x101, 0x8df0, 0x201,
+ 0xd842, 0xdcde, 0x101, 0x8ed4, 0x101, 0x8f38, 0x201, 0xd861,
+ 0xddd2, 0x201, 0xd861, 0xdded, 0x101, 0x9094, 0x101, 0x90f1,
+ 0x101, 0x9111, 0x201, 0xd861, 0xdf2e, 0x101, 0x911b, 0x101,
+ 0x9238, 0x101, 0x92d7, 0x101, 0x92d8, 0x101, 0x927c, 0x101,
+ 0x93f9, 0x101, 0x9415, 0x201, 0xd862, 0xdffa, 0x101, 0x958b,
+ 0x101, 0x4995, 0x101, 0x95b7, 0x201, 0xd863, 0xdd77, 0x101,
+ 0x49e6, 0x101, 0x96c3, 0x101, 0x5db2, 0x101, 0x9723, 0x201,
+ 0xd864, 0xdd45, 0x201, 0xd864, 0xde1a, 0x101, 0x4a6e, 0x101,
+ 0x4a76, 0x101, 0x97e0, 0x201, 0xd865, 0xdc0a, 0x101, 0x4ab2,
+ 0x201, 0xd865, 0xdc96, 0x101, 0x980b, 0x101, 0x980b, 0x101,
+ 0x9829, 0x201, 0xd865, 0xddb6, 0x101, 0x98e2, 0x101, 0x4b33,
+ 0x101, 0x9929, 0x101, 0x99a7, 0x101, 0x99c2, 0x101, 0x99fe,
+ 0x101, 0x4bce, 0x201, 0xd866, 0xdf30, 0x101, 0x9b12, 0x101,
+ 0x9c40, 0x101, 0x9cfd, 0x101, 0x4cce, 0x101, 0x4ced, 0x101,
+ 0x9d67, 0x201, 0xd868, 0xdcce, 0x101, 0x4cf8, 0x201, 0xd868,
+ 0xdd05, 0x201, 0xd868, 0xde0e, 0x201, 0xd868, 0xde91, 0x101,
+ 0x9ebb, 0x101, 0x4d56, 0x101, 0x9ef9, 0x101, 0x9efe, 0x101,
+ 0x9f05, 0x101, 0x9f0f, 0x101, 0x9f16, 0x101, 0x9f3b, 0x201,
+ 0xd869, 0xde00
};
-static const unsigned short uc_ligature_trie[] = {
+static constexpr unsigned short uc_ligature_trie[] = {
// 0 - 0x3100
631, 631, 631, 631, 631, 631, 631, 631,
@@ -14613,7 +15029,7 @@ static const unsigned short uc_ligature_trie[] = {
? uc_ligature_trie[uc_ligature_trie[((ucs4 - 0x3100) >> 8) + 0x188] + (ucs4 & 0xff)] \
: 0xffff)
-static const unsigned short uc_ligature_map[] = {
+static constexpr unsigned short uc_ligature_map[] = {
0x54, 0x41, 0xc0, 0x45, 0xc8, 0x49, 0xcc, 0x4e,
0x1f8, 0x4f, 0xd2, 0x55, 0xd9, 0x57, 0x1e80, 0x59,
0x1ef2, 0x61, 0xe0, 0x65, 0xe8, 0x69, 0xec, 0x6e,
@@ -14869,7 +15285,7 @@ struct NormalizationCorrection {
int version;
};
-static const NormalizationCorrection uc_normalization_corrections[] = {
+static constexpr NormalizationCorrection uc_normalization_corrections[] = {
{ 0xf951, 0x96fb, 6 },
{ 0x2f868, 0x2136a, 7 },
{ 0x2f874, 0x5f33, 7 },
@@ -14881,7 +15297,7 @@ static const NormalizationCorrection uc_normalization_corrections[] = {
enum { NumNormalizationCorrections = 6 };
enum { NormalizationCorrectionsVersionMax = 7 };
-static const char16_t idnaMappingData[] = {
+static constexpr char16_t idnaMappingData[] = {
0x31, 0x31, 0x65e5, 0x31, 0x31, 0x6708, 0x31, 0x31, 0x70b9, 0x31, 0x32, 0x65e5,
0x31, 0x32, 0x6708, 0x31, 0x32, 0x70b9, 0x31, 0x33, 0x65e5, 0x31, 0x33, 0x70b9,
0x31, 0x34, 0x65e5, 0x31, 0x34, 0x70b9, 0x31, 0x35, 0x65e5, 0x31, 0x35, 0x70b9,
@@ -14968,7 +15384,7 @@ struct IdnaMapEntry {
};
static_assert(sizeof(IdnaMapEntry) == 8);
-static const IdnaMapEntry idnaMap[] = {
+static constexpr IdnaMapEntry idnaMap[] = {
{ 0xaa, 1, { 0x61, 0 } },
{ 0xb2, 1, { 0x32, 0 } },
{ 0xb3, 1, { 0x33, 0 } },
@@ -15749,7 +16165,7 @@ static const IdnaMapEntry idnaMap[] = {
{ 0x1e94, 1, { 0x1e95, 0 } },
{ 0x1e9a, 2, { 0x61, 0x2be } },
{ 0x1e9b, 1, { 0x1e61, 0 } },
- { 0x1e9e, 2, { 0x73, 0x73 } },
+ { 0x1e9e, 1, { 0xdf, 0 } },
{ 0x1ea0, 1, { 0x1ea1, 0 } },
{ 0x1ea2, 1, { 0x1ea3, 0 } },
{ 0x1ea4, 1, { 0x1ea5, 0 } },
@@ -20003,6 +20419,68 @@ static const IdnaMapEntry idnaMap[] = {
{ 0x1d7fd, 1, { 0x37, 0 } },
{ 0x1d7fe, 1, { 0x38, 0 } },
{ 0x1d7ff, 1, { 0x39, 0 } },
+ { 0x1e030, 1, { 0x430, 0 } },
+ { 0x1e031, 1, { 0x431, 0 } },
+ { 0x1e032, 1, { 0x432, 0 } },
+ { 0x1e033, 1, { 0x433, 0 } },
+ { 0x1e034, 1, { 0x434, 0 } },
+ { 0x1e035, 1, { 0x435, 0 } },
+ { 0x1e036, 1, { 0x436, 0 } },
+ { 0x1e037, 1, { 0x437, 0 } },
+ { 0x1e038, 1, { 0x438, 0 } },
+ { 0x1e039, 1, { 0x43a, 0 } },
+ { 0x1e03a, 1, { 0x43b, 0 } },
+ { 0x1e03b, 1, { 0x43c, 0 } },
+ { 0x1e03c, 1, { 0x43e, 0 } },
+ { 0x1e03d, 1, { 0x43f, 0 } },
+ { 0x1e03e, 1, { 0x440, 0 } },
+ { 0x1e03f, 1, { 0x441, 0 } },
+ { 0x1e040, 1, { 0x442, 0 } },
+ { 0x1e041, 1, { 0x443, 0 } },
+ { 0x1e042, 1, { 0x444, 0 } },
+ { 0x1e043, 1, { 0x445, 0 } },
+ { 0x1e044, 1, { 0x446, 0 } },
+ { 0x1e045, 1, { 0x447, 0 } },
+ { 0x1e046, 1, { 0x448, 0 } },
+ { 0x1e047, 1, { 0x44b, 0 } },
+ { 0x1e048, 1, { 0x44d, 0 } },
+ { 0x1e049, 1, { 0x44e, 0 } },
+ { 0x1e04a, 1, { 0xa689, 0 } },
+ { 0x1e04b, 1, { 0x4d9, 0 } },
+ { 0x1e04c, 1, { 0x456, 0 } },
+ { 0x1e04d, 1, { 0x458, 0 } },
+ { 0x1e04e, 1, { 0x4e9, 0 } },
+ { 0x1e04f, 1, { 0x4af, 0 } },
+ { 0x1e050, 1, { 0x4cf, 0 } },
+ { 0x1e051, 1, { 0x430, 0 } },
+ { 0x1e052, 1, { 0x431, 0 } },
+ { 0x1e053, 1, { 0x432, 0 } },
+ { 0x1e054, 1, { 0x433, 0 } },
+ { 0x1e055, 1, { 0x434, 0 } },
+ { 0x1e056, 1, { 0x435, 0 } },
+ { 0x1e057, 1, { 0x436, 0 } },
+ { 0x1e058, 1, { 0x437, 0 } },
+ { 0x1e059, 1, { 0x438, 0 } },
+ { 0x1e05a, 1, { 0x43a, 0 } },
+ { 0x1e05b, 1, { 0x43b, 0 } },
+ { 0x1e05c, 1, { 0x43e, 0 } },
+ { 0x1e05d, 1, { 0x43f, 0 } },
+ { 0x1e05e, 1, { 0x441, 0 } },
+ { 0x1e05f, 1, { 0x443, 0 } },
+ { 0x1e060, 1, { 0x444, 0 } },
+ { 0x1e061, 1, { 0x445, 0 } },
+ { 0x1e062, 1, { 0x446, 0 } },
+ { 0x1e063, 1, { 0x447, 0 } },
+ { 0x1e064, 1, { 0x448, 0 } },
+ { 0x1e065, 1, { 0x44a, 0 } },
+ { 0x1e066, 1, { 0x44b, 0 } },
+ { 0x1e067, 1, { 0x491, 0 } },
+ { 0x1e068, 1, { 0x456, 0 } },
+ { 0x1e069, 1, { 0x455, 0 } },
+ { 0x1e06a, 1, { 0x45f, 0 } },
+ { 0x1e06b, 1, { 0x4ab, 0 } },
+ { 0x1e06c, 1, { 0xa651, 0 } },
+ { 0x1e06d, 1, { 0x4b1, 0 } },
{ 0x1e900, 2, { 0xd83a, 0xdd22 } },
{ 0x1e901, 2, { 0xd83a, 0xdd23 } },
{ 0x1e902, 2, { 0xd83a, 0xdd24 } },
diff --git a/src/corelib/text/qunicodetables_p.h b/src/corelib/text/qunicodetables_p.h
index 1fea28c0a3..eabdc919cb 100644
--- a/src/corelib/text/qunicodetables_p.h
+++ b/src/corelib/text/qunicodetables_p.h
@@ -1,43 +1,7 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/* This file is autogenerated from the Unicode 14.0 database. Do not edit */
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: Unicode-DFS-2016
+
+/* This file is autogenerated from the Unicode 15.1 database. Do not edit */
//
// W A R N I N G
@@ -59,7 +23,7 @@
QT_BEGIN_NAMESPACE
-#define UNICODE_DATA_VERSION QChar::Unicode_14_0
+#define UNICODE_DATA_VERSION QChar::Unicode_15_1
namespace QUnicodeTables {
@@ -79,7 +43,8 @@ struct Properties {
ushort joining : 3;
signed short digitValue : 5;
signed short mirrorDiff : 16;
- ushort unicodeVersion : 8; /* 5 used */
+ ushort unicodeVersion : 5; /* 5 used */
+ ushort eastAsianWidth : 3; /* 3 used */
ushort nfQuickCheck : 8;
#ifdef Q_OS_WASM
unsigned char : 0; //wasm 64 packing trick
@@ -104,6 +69,15 @@ Q_CORE_EXPORT const Properties * QT_FASTCALL properties(char16_t ucs2) noexcept;
static_assert(sizeof(Properties) == 20);
+enum class EastAsianWidth : unsigned int {
+ A,
+ F,
+ H,
+ N,
+ Na,
+ W,
+};
+
enum GraphemeBreakClass {
GraphemeBreak_Any,
GraphemeBreak_CR,
@@ -143,10 +117,6 @@ enum WordBreakClass {
WordBreak_MidNum,
WordBreak_Numeric,
WordBreak_ExtendNumLet,
- WordBreak_E_Base,
- WordBreak_E_Modifier,
- WordBreak_Glue_After_Zwj,
- WordBreak_E_Base_GAZ,
WordBreak_WSegSpace,
NumWordBreakClasses
@@ -172,9 +142,11 @@ enum SentenceBreakClass {
};
// see http://www.unicode.org/reports/tr14/tr14-30.html
-// we don't use the XX and AI classes and map them to AL instead.
+// we don't use the XX, AK, AP, AS and AI classes and map them to AL instead.
+// VI and VF classes are mapped to CM.
enum LineBreakClass {
- LineBreak_OP, LineBreak_CL, LineBreak_CP, LineBreak_QU, LineBreak_GL,
+ LineBreak_OP, LineBreak_CL, LineBreak_CP,
+ LineBreak_QU, LineBreak_QU_Pi, LineBreak_QU_Pf, LineBreak_GL,
LineBreak_NS, LineBreak_EX, LineBreak_SY, LineBreak_IS, LineBreak_PR,
LineBreak_PO, LineBreak_NU, LineBreak_AL, LineBreak_HL, LineBreak_ID,
LineBreak_IN, LineBreak_HY, LineBreak_BA, LineBreak_BB, LineBreak_B2,
@@ -219,6 +191,10 @@ Q_CORE_EXPORT QStringView QT_FASTCALL idnaMapping(char32_t usc4) noexcept;
inline QStringView idnaMapping(QChar ch) noexcept
{ return idnaMapping(ch.unicode()); }
+Q_CORE_EXPORT EastAsianWidth QT_FASTCALL eastAsianWidth(char32_t ucs4) noexcept;
+inline EastAsianWidth eastAsianWidth(QChar ch) noexcept
+{ return eastAsianWidth(ch.unicode()); }
+
} // namespace QUnicodeTables
QT_END_NAMESPACE
diff --git a/src/corelib/text/qunicodetools.cpp b/src/corelib/text/qunicodetools.cpp
index a924addda0..2917804830 100644
--- a/src/corelib/text/qunicodetools.cpp
+++ b/src/corelib/text/qunicodetools.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qunicodetools_p.h"
@@ -51,7 +15,14 @@
QT_BEGIN_NAMESPACE
-Q_AUTOTEST_EXPORT int qt_initcharattributes_default_algorithm_only = 0;
+using namespace Qt::StringLiterals;
+
+#ifdef QT_BUILD_INTERNAL
+Q_CONSTINIT Q_AUTOTEST_EXPORT
+#else
+constexpr
+#endif
+int qt_initcharattributes_default_algorithm_only = 0;
namespace QUnicodeTools {
@@ -242,30 +213,26 @@ enum Action {
};
static const uchar breakTable[QUnicodeTables::NumWordBreakClasses][QUnicodeTables::NumWordBreakClasses] = {
-// Any CR LF Newline Extend ZWJ Format RI Katakana HLetter ALetter SQuote DQuote MidNumLet MidLetter MidNum Numeric ExtNumLet E_Base E_Mod GAZ EBG WSeg
- { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // Any
- { Break , Break , NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // CR
- { Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // LF
- { Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // Newline
- { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // Extend
- { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , NoBreak, NoBreak, Break }, // ZWJ
- { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // Format
- { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // RegionalIndicator
- { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , NoBreak, Break , Break , Break , Break , Break }, // Katakana
- { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , NoBreak, NoBreak, LookupW, Lookup , LookupW, LookupW, Break , NoBreak, NoBreak, Break , Break , Break , Break , Break }, // HebrewLetter
- { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , NoBreak, NoBreak, LookupW, Break , LookupW, LookupW, Break , NoBreak, NoBreak, Break , Break , Break , Break , Break }, // ALetter
- { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // SingleQuote
- { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // DoubleQuote
- { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // MidNumLet
- { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // MidLetter
- { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // MidNum
- { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , NoBreak, NoBreak, Lookup , Break , Lookup , Break , Lookup , NoBreak, NoBreak, Break , Break , Break , Break , Break }, // Numeric
- { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , NoBreak, NoBreak, Break , Break , Break , Break , Break }, // ExtendNumLet
- { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , NoBreak, Break , Break , Break }, // E_Base
- { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // E_Mod
- { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // GAZ
- { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , NoBreak, Break , Break , Break }, // EBG
- { Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // WSeg
+// Any CR LF Newline Extend ZWJ Format RI Katakana HLetter ALetter SQuote DQuote MidNumLet MidLetter MidNum Numeric ExtNumLet WSeg
+ { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // Any
+ { Break , Break , NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // CR
+ { Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // LF
+ { Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // Newline
+ { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // Extend
+ { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // ZWJ
+ { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // Format
+ { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // RegionalIndicator
+ { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , NoBreak, Break }, // Katakana
+ { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , NoBreak, NoBreak, LookupW, Lookup , LookupW, LookupW, Break , NoBreak, NoBreak, Break }, // HebrewLetter
+ { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , NoBreak, NoBreak, LookupW, Break , LookupW, LookupW, Break , NoBreak, NoBreak, Break }, // ALetter
+ { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // SingleQuote
+ { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // DoubleQuote
+ { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // MidNumLet
+ { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // MidLetter
+ { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // MidNum
+ { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , NoBreak, NoBreak, Lookup , Break , Lookup , Break , Lookup , NoBreak, NoBreak, Break }, // Numeric
+ { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , NoBreak, NoBreak, Break }, // ExtendNumLet
+ { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , NoBreak }, // WSegSpace
};
} // namespace WB
@@ -277,6 +244,8 @@ static void getWordBreaks(const char16_t *string, qsizetype len, QCharAttributes
} currentWordType = WordTypeNone;
QUnicodeTables::WordBreakClass cls = QUnicodeTables::WordBreak_LF; // to meet WB1
+ auto real_cls = cls; // Unaffected by WB4
+
for (qsizetype i = 0; i != len; ++i) {
qsizetype pos = i;
char32_t ucs4 = string[i];
@@ -290,7 +259,6 @@ static void getWordBreaks(const char16_t *string, qsizetype len, QCharAttributes
const QUnicodeTables::Properties *prop = QUnicodeTables::properties(ucs4);
QUnicodeTables::WordBreakClass ncls = (QUnicodeTables::WordBreakClass) prop->wordBreakClass;
-#ifdef QT_BUILD_INTERNAL
if (qt_initcharattributes_default_algorithm_only) {
// as of Unicode 5.1, some punctuation marks were mapped to MidLetter and MidNumLet
// which caused "hi.there" to be treated like if it were just a single word;
@@ -301,22 +269,32 @@ static void getWordBreaks(const char16_t *string, qsizetype len, QCharAttributes
else if (ucs4 == 0x003A) // COLON
ncls = QUnicodeTables::WordBreak_MidLetter;
}
-#endif
uchar action = WB::breakTable[cls][ncls];
switch (action) {
case WB::Break:
+ if (Q_UNLIKELY(real_cls == QUnicodeTables::WordBreak_ZWJ
+ && prop->graphemeBreakClass
+ == QUnicodeTables::GraphemeBreak_Extended_Pictographic)) {
+ // WB3c: ZWJ × \p{Extended_Pictographic}
+ action = WB::NoBreak;
+ }
break;
case WB::NoBreak:
if (Q_UNLIKELY(ncls == QUnicodeTables::WordBreak_Extend || ncls == QUnicodeTables::WordBreak_ZWJ || ncls == QUnicodeTables::WordBreak_Format)) {
// WB4: X(Extend|Format)* -> X
- if (cls != QUnicodeTables::WordBreak_ZWJ) // WB3c
- continue;
+ real_cls = ncls;
+ continue;
}
if (Q_UNLIKELY(cls == QUnicodeTables::WordBreak_RegionalIndicator)) {
// WB15/WB16: break between pairs of Regional indicator
ncls = QUnicodeTables::WordBreak_Any;
}
+ if (Q_UNLIKELY(ncls == QUnicodeTables::WordBreak_WSegSpace
+ && real_cls != QUnicodeTables::WordBreak_WSegSpace)) {
+ // WB3d should not be affected by WB4
+ action = WB::Break;
+ }
break;
case WB::Lookup:
case WB::LookupW:
@@ -355,6 +333,8 @@ static void getWordBreaks(const char16_t *string, qsizetype len, QCharAttributes
}
cls = ncls;
+ real_cls = ncls;
+
if (action == WB::Break) {
attributes[pos].wordBreak = true;
if (currentWordType != WordTypeNone)
@@ -575,49 +555,53 @@ enum Action {
IndirectBreak, IB = IndirectBreak,
CombiningIndirectBreak, CI = CombiningIndirectBreak,
CombiningProhibitedBreak, CP = CombiningProhibitedBreak,
- ProhibitedBreakAfterHebrewPlusHyphen, HH = ProhibitedBreakAfterHebrewPlusHyphen
+ ProhibitedBreakAfterHebrewPlusHyphen, HH = ProhibitedBreakAfterHebrewPlusHyphen,
+ IndirectBreakIfNarrow, IN = IndirectBreakIfNarrow, // For LB30
};
-static const uchar breakTable[QUnicodeTables::LineBreak_SA][QUnicodeTables::LineBreak_SA] = {
-/* OP CL CP QU GL NS EX SY IS PR PO NU AL HL ID IN HY BA BB B2 ZW CM WJ H2 H3 JL JV JT RI CB EB EM ZWJ*/
-/* OP */ { PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, CP, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB },
-/* CL */ { DB, PB, PB, IB, IB, PB, PB, PB, PB, DB, DB, DB, DB, DB, DB, DB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB, IB },
-/* CP */ { DB, PB, PB, IB, IB, PB, PB, PB, PB, DB, DB, IB, IB, IB, DB, DB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB, IB },
-/* QU */ { PB, PB, PB, IB, IB, IB, PB, PB, PB, IB, IB, IB, IB, IB, IB, IB, IB, IB, IB, IB, PB, CI, PB, IB, IB, IB, IB, IB, IB, IB, IB, IB, IB },
-/* GL */ { IB, PB, PB, IB, IB, IB, PB, PB, PB, IB, IB, IB, IB, IB, IB, IB, IB, IB, IB, IB, PB, CI, PB, IB, IB, IB, IB, IB, IB, IB, IB, IB, IB },
-/* NS */ { DB, PB, PB, IB, IB, IB, PB, PB, PB, DB, DB, DB, DB, DB, DB, DB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB, IB },
-/* EX */ { DB, PB, PB, IB, IB, IB, PB, PB, PB, DB, DB, DB, DB, DB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB, IB },
-/* SY */ { DB, PB, PB, IB, IB, IB, PB, PB, PB, DB, DB, DB, DB, IB, DB, DB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB, IB },
-/* IS */ { DB, PB, PB, IB, IB, IB, PB, PB, PB, DB, DB, DB, IB, IB, DB, DB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB, IB },
-/* PR */ { DB, PB, PB, IB, IB, IB, PB, PB, PB, DB, DB, IB, IB, IB, IB, DB, IB, IB, DB, DB, PB, CI, PB, IB, IB, IB, IB, IB, DB, DB, IB, IB, IB },
-/* PO */ { DB, PB, PB, IB, IB, IB, PB, PB, PB, DB, DB, IB, IB, IB, DB, DB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB, IB },
-/* NU */ { IB, PB, PB, IB, IB, IB, PB, PB, PB, IB, IB, IB, IB, IB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB, IB },
-/* AL */ { IB, PB, PB, IB, IB, IB, PB, PB, PB, IB, IB, IB, IB, IB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB, IB },
-/* HL */ { IB, PB, PB, IB, IB, IB, PB, PB, PB, IB, IB, IB, IB, IB, DB, IB, CI, CI, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB, IB },
-/* ID */ { DB, PB, PB, IB, IB, IB, PB, PB, PB, DB, IB, DB, DB, DB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB, IB },
-/* IN */ { DB, PB, PB, IB, IB, IB, PB, PB, PB, DB, DB, DB, DB, DB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB, IB },
-/* HY */ { HH, PB, PB, IB, HH, IB, PB, PB, PB, HH, HH, IB, HH, HH, HH, HH, IB, IB, HH, HH, PB, CI, PB, HH, HH, HH, HH, HH, HH, DB, DB, DB, IB },
-/* BA */ { HH, PB, PB, IB, HH, IB, PB, PB, PB, HH, HH, HH, HH, HH, HH, HH, IB, IB, HH, HH, PB, CI, PB, HH, HH, HH, HH, HH, HH, DB, DB, DB, IB },
-/* BB */ { IB, PB, PB, IB, IB, IB, PB, PB, PB, IB, IB, IB, IB, IB, IB, IB, IB, IB, IB, IB, PB, CI, PB, IB, IB, IB, IB, IB, IB, DB, IB, IB, IB },
-/* B2 */ { DB, PB, PB, IB, IB, IB, PB, PB, PB, DB, DB, DB, DB, DB, DB, DB, IB, IB, DB, PB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB, IB },
-/* ZW */ { DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB },
-/* CM */ { IB, PB, PB, IB, IB, IB, PB, PB, PB, DB, DB, IB, IB, IB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB, IB },
-/* WJ */ { IB, PB, PB, IB, IB, IB, PB, PB, PB, IB, IB, IB, IB, IB, IB, IB, IB, IB, IB, IB, PB, CI, PB, IB, IB, IB, IB, IB, IB, IB, IB, IB, IB },
-/* H2 */ { DB, PB, PB, IB, IB, IB, PB, PB, PB, DB, IB, DB, DB, DB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, IB, IB, DB, DB, DB, DB, IB },
-/* H3 */ { DB, PB, PB, IB, IB, IB, PB, PB, PB, DB, IB, DB, DB, DB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, IB, DB, DB, DB, DB, IB },
-/* JL */ { DB, PB, PB, IB, IB, IB, PB, PB, PB, DB, IB, DB, DB, DB, DB, IB, IB, IB, DB, DB, PB, CI, PB, IB, IB, IB, IB, DB, DB, DB, DB, DB, IB },
-/* JV */ { DB, PB, PB, IB, IB, IB, PB, PB, PB, DB, IB, DB, DB, DB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, IB, IB, DB, DB, DB, DB, IB },
-/* JT */ { DB, PB, PB, IB, IB, IB, PB, PB, PB, DB, IB, DB, DB, DB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, IB, DB, DB, DB, DB, IB },
-/* RI */ { DB, PB, PB, IB, IB, IB, PB, PB, PB, DB, DB, DB, DB, DB, DB, DB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, IB, DB, DB, DB, IB },
-/* CB */ { DB, PB, PB, IB, IB, DB, PB, PB, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB, IB },
-/* EB */ { DB, PB, PB, IB, IB, IB, PB, PB, PB, DB, IB, DB, DB, DB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, IB, IB },
-/* EM */ { DB, PB, PB, IB, IB, IB, PB, PB, PB, DB, IB, DB, DB, DB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB, IB },
-/* ZWJ*/ { IB, PB, PB, IB, IB, IB, PB, PB, PB, IB, IB, IB, IB, IB, IB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, IB, IB, IB }
+// See https://www.unicode.org/reports/tr14/tr14-37.html for the information
+// about the table. It was removed in the later versions of the standard.
+static const uchar breakTable[QUnicodeTables::LineBreak_ZWJ][QUnicodeTables::LineBreak_ZWJ] = {
+/* 1↓ 2→ OP CL CP QU +Pi +Pf GL NS EX SY IS PR PO NU AL HL ID IN HY BA BB B2 ZW CM WJ H2 H3 JL JV JT RI CB EB EM*/
+/* OP */ { PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, CP, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB },
+/* CL */ { DB, PB, PB, IB, IB, PB, IB, PB, PB, PB, PB, DB, DB, DB, DB, DB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB },
+/* CP */ { DB, PB, PB, IB, IB, PB, IB, PB, PB, PB, PB, DB, DB, IB, IB, IB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB },
+/* QU */ { IB, PB, PB, IB, IB, PB, IB, IB, PB, PB, PB, IB, IB, IB, IB, IB, IB, IB, IB, IB, IB, IB, PB, CI, PB, IB, IB, IB, IB, IB, IB, IB, IB, IB },
+/* +Pi*/ { PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, CP, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB },
+/* +Pf*/ { IB, PB, PB, IB, IB, PB, IB, IB, PB, PB, PB, IB, IB, IB, IB, IB, IB, IB, IB, IB, IB, IB, PB, CI, PB, IB, IB, IB, IB, IB, IB, IB, IB, IB },
+/* GL */ { IB, PB, PB, IB, IB, PB, IB, IB, PB, PB, PB, IB, IB, IB, IB, IB, IB, IB, IB, IB, IB, IB, PB, CI, PB, IB, IB, IB, IB, IB, IB, IB, IB, IB },
+/* NS */ { DB, PB, PB, IB, IB, PB, IB, IB, PB, PB, PB, DB, DB, DB, DB, DB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB },
+/* EX */ { DB, PB, PB, IB, IB, PB, IB, IB, PB, PB, PB, DB, DB, DB, DB, DB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB },
+/* SY */ { DB, PB, PB, IB, IB, PB, IB, IB, PB, PB, PB, DB, DB, DB, DB, IB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB },
+/* IS */ { DB, PB, PB, IB, IB, PB, IB, IB, PB, PB, PB, DB, DB, DB, IB, IB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB },
+/* PR */ { DB, PB, PB, IB, IB, PB, IB, IB, PB, PB, PB, DB, DB, IB, IB, IB, IB, IB, IB, IB, DB, DB, PB, CI, PB, IB, IB, IB, IB, IB, DB, DB, IB, IB },
+/* PO */ { DB, PB, PB, IB, IB, PB, IB, IB, PB, PB, PB, DB, DB, IB, IB, IB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB },
+/* NU */ { IN, PB, PB, IB, IB, PB, IB, IB, PB, PB, PB, IB, IB, IB, IB, IB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB },
+/* AL */ { IN, PB, PB, IB, IB, PB, IB, IB, PB, PB, PB, IB, IB, IB, IB, IB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB },
+/* HL */ { IN, PB, PB, IB, IB, PB, IB, IB, PB, PB, PB, IB, IB, IB, IB, IB, DB, IB, CI, CI, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB },
+/* ID */ { DB, PB, PB, IB, IB, PB, IB, IB, PB, PB, PB, DB, IB, DB, DB, DB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB },
+/* IN */ { DB, PB, PB, IB, IB, PB, IB, IB, PB, PB, PB, DB, DB, DB, DB, DB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB },
+/* HY */ { HH, PB, PB, IB, IB, PB, HH, IB, PB, PB, PB, HH, HH, IB, HH, HH, HH, IB, IB, IB, HH, HH, PB, CI, PB, HH, HH, HH, HH, HH, HH, DB, DB, DB },
+/* BA */ { HH, PB, PB, IB, IB, PB, HH, IB, PB, PB, PB, HH, HH, HH, HH, HH, HH, IB, IB, IB, HH, HH, PB, CI, PB, HH, HH, HH, HH, HH, HH, DB, DB, DB },
+/* BB */ { IB, PB, PB, IB, IB, PB, IB, IB, PB, PB, PB, IB, IB, IB, IB, IB, IB, IB, IB, IB, IB, IB, PB, CI, PB, IB, IB, IB, IB, IB, IB, DB, IB, IB },
+/* B2 */ { DB, PB, PB, IB, IB, PB, IB, IB, PB, PB, PB, DB, DB, DB, DB, DB, DB, IB, IB, IB, DB, PB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB },
+/* ZW */ { DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB },
+/* CM */ { IB, PB, PB, IB, IB, PB, IB, IB, PB, PB, PB, DB, DB, IB, IB, IB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB },
+/* WJ */ { IB, PB, PB, IB, IB, PB, IB, IB, PB, PB, PB, IB, IB, IB, IB, IB, IB, IB, IB, IB, IB, IB, PB, CI, PB, IB, IB, IB, IB, IB, IB, IB, IB, IB },
+/* H2 */ { DB, PB, PB, IB, IB, PB, IB, IB, PB, PB, PB, DB, IB, DB, DB, DB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, IB, IB, DB, DB, DB, DB },
+/* H3 */ { DB, PB, PB, IB, IB, PB, IB, IB, PB, PB, PB, DB, IB, DB, DB, DB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, IB, DB, DB, DB, DB },
+/* JL */ { DB, PB, PB, IB, IB, PB, IB, IB, PB, PB, PB, DB, IB, DB, DB, DB, DB, IB, IB, IB, DB, DB, PB, CI, PB, IB, IB, IB, IB, DB, DB, DB, DB, DB },
+/* JV */ { DB, PB, PB, IB, IB, PB, IB, IB, PB, PB, PB, DB, IB, DB, DB, DB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, IB, IB, DB, DB, DB, DB },
+/* JT */ { DB, PB, PB, IB, IB, PB, IB, IB, PB, PB, PB, DB, IB, DB, DB, DB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, IB, DB, DB, DB, DB },
+/* RI */ { DB, PB, PB, IB, IB, PB, IB, IB, PB, PB, PB, DB, DB, DB, DB, DB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, IB, DB, DB, DB },
+/* CB */ { DB, PB, PB, IB, IB, PB, IB, DB, PB, PB, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB },
+/* EB */ { DB, PB, PB, IB, IB, PB, IB, IB, PB, PB, PB, DB, IB, DB, DB, DB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, IB },
+/* EM */ { DB, PB, PB, IB, IB, PB, IB, IB, PB, PB, PB, DB, IB, DB, DB, DB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB },
};
// The following line break classes are not treated by the pair table
// and must be resolved outside:
-// AI, BK, CB, CJ, CR, LF, NL, SA, SG, SP, XX
+// AI, AK, AP, AS, BK, CB, CJ, CR, LF, NL, SA, SG, SP, VF, VI, XX, ZWJ
} // namespace LB
@@ -628,6 +612,8 @@ static void getLineBreaks(const char16_t *string, qsizetype len, QCharAttributes
QUnicodeTables::LineBreakClass lcls = QUnicodeTables::LineBreak_LF; // to meet LB10
QUnicodeTables::LineBreakClass cls = lcls;
+ const QUnicodeTables::Properties *lastProp = QUnicodeTables::properties(U'\n');
+
for (qsizetype i = 0; i != len; ++i) {
qsizetype pos = i;
char32_t ucs4 = string[i];
@@ -675,6 +661,61 @@ static void getLineBreaks(const char16_t *string, qsizetype len, QCharAttributes
ncls = QUnicodeTables::LineBreak_CM;
}
+ if (Q_UNLIKELY(ncls == QUnicodeTables::LineBreak_QU)) {
+ if (prop->category == QChar::Punctuation_InitialQuote) {
+ // LB15a: Do not break after an unresolved initial punctuation
+ // that lies at the start of the line, after a space, after
+ // opening punctuation, or after an unresolved quotation mark,
+ // even after spaces.
+ // (sot | BK | CR | LF | NL | OP | QU | GL | SP | ZW)
+ // [\p{Pi}&QU] SP* ×
+ // Note: sot is treated as LF here due to initial loop setup.
+ constexpr QUnicodeTables::LineBreakClass lb15a[] = {
+ QUnicodeTables::LineBreak_BK, QUnicodeTables::LineBreak_CR,
+ QUnicodeTables::LineBreak_LF, QUnicodeTables::LineBreak_OP,
+ QUnicodeTables::LineBreak_QU, QUnicodeTables::LineBreak_QU_Pi,
+ QUnicodeTables::LineBreak_QU_Pf, QUnicodeTables::LineBreak_GL,
+ QUnicodeTables::LineBreak_SP, QUnicodeTables::LineBreak_ZW};
+ if (std::any_of(std::begin(lb15a), std::end(lb15a),
+ [lcls](auto x) { return x == lcls; })) {
+ ncls = QUnicodeTables::LineBreak_QU_Pi;
+ }
+ } else if (prop->category == QChar::Punctuation_FinalQuote) {
+ // LB15b: Do not break before an unresolved final punctuation
+ // that lies at the end of the line, before a space, before
+ // a prohibited break, or before an unresolved quotation mark,
+ // even after spaces.
+ // × [\p{Pf}&QU] ( SP | GL | WJ | CL | QU | CP | EX | IS
+ // | SY | BK | CR | LF | NL | ZW | eot)
+ auto nncls = QUnicodeTables::LineBreak_LF;
+
+ if (i + 1 < len) {
+ char32_t c = string[i + 1];
+ if (QChar::isHighSurrogate(c) && i + 2 != len) {
+ ushort low = string[i + 2];
+ if (QChar::isLowSurrogate(low))
+ c = QChar::surrogateToUcs4(c, low);
+ }
+ nncls = QUnicodeTables::LineBreakClass(
+ QUnicodeTables::properties(c)->lineBreakClass);
+ }
+
+ constexpr QUnicodeTables::LineBreakClass lb15b[] = {
+ QUnicodeTables::LineBreak_SP, QUnicodeTables::LineBreak_GL,
+ QUnicodeTables::LineBreak_WJ, QUnicodeTables::LineBreak_CL,
+ QUnicodeTables::LineBreak_QU, QUnicodeTables::LineBreak_QU_Pi,
+ QUnicodeTables::LineBreak_QU_Pf, QUnicodeTables::LineBreak_CP,
+ QUnicodeTables::LineBreak_EX, QUnicodeTables::LineBreak_IS,
+ QUnicodeTables::LineBreak_SY, QUnicodeTables::LineBreak_BK,
+ QUnicodeTables::LineBreak_CR, QUnicodeTables::LineBreak_LF,
+ QUnicodeTables::LineBreak_ZW};
+ if (std::any_of(std::begin(lb15b), std::end(lb15b),
+ [nncls](auto x) { return x == nncls; })) {
+ ncls = QUnicodeTables::LineBreak_QU_Pf;
+ }
+ }
+ }
+
if (Q_UNLIKELY(lcls >= QUnicodeTables::LineBreak_CR)) {
// LB4: BK!, LB5: (CRxLF|CR|LF|NL)!
if (lcls > QUnicodeTables::LineBreak_CR || ncls != QUnicodeTables::LineBreak_LF)
@@ -700,9 +741,8 @@ static void getLineBreaks(const char16_t *string, qsizetype len, QCharAttributes
}
if (Q_UNLIKELY(lcls == QUnicodeTables::LineBreak_ZWJ)) {
- // LB8a: ZWJ x (ID | EB | EM)
- if (ncls == QUnicodeTables::LineBreak_ID || ncls == QUnicodeTables::LineBreak_EB || ncls == QUnicodeTables::LineBreak_EM)
- goto next;
+ // LB8a: ZWJ x
+ goto next;
}
// LB25: do not break lines inside numbers
@@ -732,16 +772,24 @@ static void getLineBreaks(const char16_t *string, qsizetype len, QCharAttributes
goto next;
}
+ if (Q_UNLIKELY(ncls == QUnicodeTables::LineBreak_EM
+ && lastProp->category == QChar::Other_NotAssigned
+ && lastProp->graphemeBreakClass
+ == QUnicodeTables::GraphemeBreak_Extended_Pictographic)) {
+ // LB30b: [\p{Extended_Pictographic}&\p{Cn}] × EM
+ goto next;
+ }
+
// for South East Asian chars that require a complex analysis, the Unicode
// standard recommends to treat them as AL. tailoring that do dictionary analysis can override
if (Q_UNLIKELY(cls >= QUnicodeTables::LineBreak_SA))
cls = QUnicodeTables::LineBreak_AL;
tcls = cls;
- if (tcls == QUnicodeTables::LineBreak_CM)
+ if (tcls == QUnicodeTables::LineBreak_CM || tcls == QUnicodeTables::LineBreak_ZWJ)
// LB10
tcls = QUnicodeTables::LineBreak_AL;
- switch (LB::breakTable[tcls][ncls < QUnicodeTables::LineBreak_SA ? ncls : QUnicodeTables::LineBreak_AL]) {
+ switch (LB::breakTable[tcls][ncls < QUnicodeTables::LineBreak_ZWJ ? ncls : QUnicodeTables::LineBreak_AL]) {
case LB::DirectBreak:
attributes[pos].lineBreak = true;
break;
@@ -762,6 +810,19 @@ static void getLineBreaks(const char16_t *string, qsizetype len, QCharAttributes
if (lcls != QUnicodeTables::LineBreak_HL)
attributes[pos].lineBreak = true;
break;
+ case LB::IndirectBreakIfNarrow:
+ switch (static_cast<QUnicodeTables::EastAsianWidth>(prop->eastAsianWidth)) {
+ default:
+ if (lcls != QUnicodeTables::LineBreak_SP)
+ break;
+ Q_FALLTHROUGH();
+ case QUnicodeTables::EastAsianWidth::F:
+ case QUnicodeTables::EastAsianWidth::W:
+ case QUnicodeTables::EastAsianWidth::H:
+ attributes[pos].lineBreak = true;
+ break;
+ }
+ break;
case LB::ProhibitedBreak:
// nothing to do
default:
@@ -770,6 +831,7 @@ static void getLineBreaks(const char16_t *string, qsizetype len, QCharAttributes
next:
cls = ncls;
+ lastProp = prop;
next_no_cls_update:
lcls = ncls;
}
@@ -1263,12 +1325,12 @@ static inline Form form(unsigned short uc) {
static qsizetype indic_nextSyllableBoundary(QChar::Script script, const char16_t *s, qsizetype start, qsizetype end, bool *invalid)
{
*invalid = false;
- IDEBUG("indic_nextSyllableBoundary: start=%d, end=%d", int(start), int(end));
+ IDEBUG("indic_nextSyllableBoundary: start=%lld, end=%lld", qlonglong(start), qlonglong(end));
const char16_t *uc = s+start;
qsizetype pos = 0;
Form state = form(uc[pos]);
- IDEBUG("state[%d]=%d (uc=%4x)", int(pos), state, uc[pos]);
+ IDEBUG("state[%lld]=%d (uc=%4x)", qlonglong(pos), state, uc[pos]);
pos++;
if (state != Consonant && state != IndependentVowel) {
@@ -1279,7 +1341,7 @@ static qsizetype indic_nextSyllableBoundary(QChar::Script script, const char16_t
while (pos < end - start) {
Form newState = form(uc[pos]);
- IDEBUG("state[%d]=%d (uc=%4x)", int(pos), newState, uc[pos]);
+ IDEBUG("state[%lld]=%d (uc=%4x)", qlonglong(pos), newState, uc[pos]);
switch (newState) {
case Control:
newState = state;
@@ -1352,6 +1414,7 @@ static qsizetype indic_nextSyllableBoundary(QChar::Script script, const char16_t
// ### needs proper testing for correct two/three part matras
break;
}
+ Q_FALLTHROUGH();
case IndependentVowel:
case Invalid:
case Other:
@@ -1367,7 +1430,6 @@ static qsizetype indic_nextSyllableBoundary(QChar::Script script, const char16_t
static void indicAttributes(QChar::Script script, const char16_t *text, qsizetype from, qsizetype len, QCharAttributes *attributes)
{
qsizetype end = from + len;
- const char16_t *uc = text + from;
attributes += from;
qsizetype i = 0;
while (i < len) {
@@ -1379,7 +1441,6 @@ static void indicAttributes(QChar::Script script, const char16_t *text, qsizetyp
i++;
while (i < boundary) {
attributes[i].graphemeBoundary = false;
- ++uc;
++i;
}
assert(i == boundary);
@@ -1388,6 +1449,8 @@ static void indicAttributes(QChar::Script script, const char16_t *text, qsizetyp
}
+#if QT_CONFIG(library)
+
#define LIBTHAI_MAJOR 0
/*
@@ -1398,27 +1461,74 @@ struct thcell_t {
unsigned char hilo; /**< upper/lower vowel/diacritic */
unsigned char top; /**< top-level mark */
};
-typedef int (*th_brk_def) (const unsigned char*, int*, size_t);
-typedef size_t (*th_next_cell_def) (const unsigned char *, size_t, struct thcell_t *, int);
-/* libthai related function handles */
-static th_brk_def th_brk = nullptr;
-static th_next_cell_def th_next_cell = nullptr;
+using ThBrk = struct _ThBrk;
-static int init_libthai() {
-#if QT_CONFIG(library)
- static bool initialized = false;
- if (!initialized && (!th_brk || !th_next_cell)) {
- th_brk = reinterpret_cast<th_brk_def>(QLibrary::resolve(QLatin1String("thai"), static_cast<int>(LIBTHAI_MAJOR), "th_brk"));
- th_next_cell = (th_next_cell_def)QLibrary::resolve(QLatin1String("thai"), LIBTHAI_MAJOR, "th_next_cell");
- initialized = true;
+namespace {
+
+class LibThai final
+{
+ Q_DISABLE_COPY_MOVE(LibThai)
+
+ using th_brk_new_def = ThBrk *(*)(const char *);
+ using th_brk_delete_def = void (*)(ThBrk *);
+ using th_brk_find_breaks_def = int (*)(ThBrk *, const unsigned char *, int *, size_t);
+ using th_next_cell_def = size_t (*)(const unsigned char *, size_t, struct thcell_t *, int);
+
+public:
+ LibThai() : m_library("thai"_L1, LIBTHAI_MAJOR)
+ {
+ m_th_brk_find_breaks =
+ reinterpret_cast<th_brk_find_breaks_def>(m_library.resolve("th_brk_find_breaks"));
+ m_th_next_cell = reinterpret_cast<th_next_cell_def>(m_library.resolve("th_next_cell"));
+
+ auto th_brk_new = reinterpret_cast<th_brk_new_def>(m_library.resolve("th_brk_new"));
+ if (th_brk_new) {
+ m_state = th_brk_new(nullptr);
+ m_th_brk_delete =
+ reinterpret_cast<th_brk_delete_def>(m_library.resolve("th_brk_delete"));
+ }
+ }
+
+ ~LibThai()
+ {
+ if (m_state && m_th_brk_delete)
+ m_th_brk_delete(m_state);
+ m_library.unload();
+ }
+
+ bool isInitialized() const { return m_th_brk_find_breaks && m_th_next_cell && m_state; }
+
+ int brk_find_breaks(const unsigned char *s, int *pos, size_t pos_sz) const
+ {
+ Q_ASSERT(m_state);
+ Q_ASSERT(m_th_brk_find_breaks);
+ return m_th_brk_find_breaks(m_state, s, pos, pos_sz);
}
- if (th_brk && th_next_cell)
- return 1;
- else
-#endif
- return 0;
-}
+
+ size_t next_cell(const unsigned char *s, size_t len, struct thcell_t *cell, int is_decomp_am)
+ {
+ Q_ASSERT(m_th_next_cell);
+ return m_th_next_cell(s, len, cell, is_decomp_am);
+ }
+
+private:
+ QLibrary m_library;
+
+ // Global state for th_brk_find_breaks().
+ // Note: even if signature for th_brk_find_breaks() suggests otherwise, the
+ // state is read-only, and so it is safe to use it from multiple threads after
+ // initialization. This is also stated in the libthai documentation.
+ ThBrk *m_state = nullptr;
+
+ th_brk_find_breaks_def m_th_brk_find_breaks = nullptr;
+ th_next_cell_def m_th_next_cell = nullptr;
+ th_brk_delete_def m_th_brk_delete = nullptr;
+};
+
+} // unnamed namespace
+
+Q_GLOBAL_STATIC(LibThai, g_libThai)
static void to_tis620(const char16_t *string, qsizetype len, char *cstr)
{
@@ -1442,21 +1552,17 @@ static void to_tis620(const char16_t *string, qsizetype len, char *cstr)
*/
static void thaiAssignAttributes(const char16_t *string, qsizetype len, QCharAttributes *attributes)
{
- char s[128];
- char *cstr = s;
- int *break_positions = nullptr;
- int brp[128];
- int brp_size = 0;
- qsizetype numbreaks, i, j, cell_length;
+ constexpr qsizetype Prealloc = 128;
+ QVarLengthArray<char, Prealloc + 1> s(len + 1);
+ QVarLengthArray<int, Prealloc> break_positions(len);
+ qsizetype numbreaks, i;
struct thcell_t tis_cell;
- if (!init_libthai())
- return ;
-
- if (len >= 128)
- cstr = static_cast<char *>(malloc (len * sizeof(char) + 1));
+ LibThai *libThai = g_libThai;
+ if (!libThai || !libThai->isInitialized())
+ return;
- to_tis620(string, len, cstr);
+ to_tis620(string, len, s.data());
for (i = 0; i < len; ++i) {
attributes[i].wordBreak = false;
@@ -1465,58 +1571,53 @@ static void thaiAssignAttributes(const char16_t *string, qsizetype len, QCharAtt
attributes[i].lineBreak = false;
}
- if (len > 128) {
- break_positions = static_cast<int *>(malloc (sizeof(int) * len));
- memset (break_positions, 0, sizeof(int) * len);
- brp_size = len;
- }
- else {
- break_positions = brp;
- brp_size = 128;
- }
-
- if (break_positions) {
- attributes[0].wordBreak = true;
- attributes[0].wordStart = true;
- attributes[0].wordEnd = false;
- numbreaks = th_brk(reinterpret_cast<const unsigned char *>(cstr), break_positions, brp_size);
- for (i = 0; i < numbreaks; ++i) {
- attributes[break_positions[i]].wordBreak = true;
- attributes[break_positions[i]].wordStart = true;
- attributes[break_positions[i]].wordEnd = true;
- attributes[break_positions[i]].lineBreak = true;
- }
- if (numbreaks > 0)
- attributes[break_positions[numbreaks - 1]].wordStart = false;
-
- if (break_positions != brp)
- free(break_positions);
+ attributes[0].wordBreak = true;
+ attributes[0].wordStart = true;
+ attributes[0].wordEnd = false;
+ numbreaks = libThai->brk_find_breaks(reinterpret_cast<const unsigned char *>(s.data()),
+ break_positions.data(),
+ static_cast<size_t>(break_positions.size()));
+ for (i = 0; i < numbreaks; ++i) {
+ attributes[break_positions[i]].wordBreak = true;
+ attributes[break_positions[i]].wordStart = true;
+ attributes[break_positions[i]].wordEnd = true;
+ attributes[break_positions[i]].lineBreak = true;
}
+ if (numbreaks > 0)
+ attributes[break_positions[numbreaks - 1]].wordStart = false;
/* manage grapheme boundaries */
i = 0;
while (i < len) {
- cell_length = static_cast<uint>(th_next_cell(reinterpret_cast<const unsigned char *>(cstr) + i, len - i, &tis_cell, true));
-
+ size_t cell_length =
+ libThai->next_cell(reinterpret_cast<const unsigned char *>(s.data()) + i,
+ size_t(len - i), &tis_cell, true);
attributes[i].graphemeBoundary = true;
- for (j = 1; j < cell_length; j++)
+ for (size_t j = 1; j < cell_length; ++j)
attributes[i + j].graphemeBoundary = false;
i += cell_length;
}
-
- if (len >= 128)
- free(cstr);
}
+#endif // QT_CONFIG(library)
+
static void thaiAttributes(QChar::Script script, const char16_t *text, qsizetype from, qsizetype len, QCharAttributes *attributes)
{
assert(script == QChar::Script_Thai);
+#if QT_CONFIG(library)
const char16_t *uc = text + from;
attributes += from;
Q_UNUSED(script);
thaiAssignAttributes(uc, len, attributes);
+#else
+ Q_UNUSED(script);
+ Q_UNUSED(text);
+ Q_UNUSED(from);
+ Q_UNUSED(len);
+ Q_UNUSED(attributes);
+#endif
}
/*
@@ -1630,7 +1731,6 @@ finish:
static void tibetanAttributes(QChar::Script script, const char16_t *text, qsizetype from, qsizetype len, QCharAttributes *attributes)
{
qsizetype end = from + len;
- const char16_t *uc = text + from;
qsizetype i = 0;
Q_UNUSED(script);
attributes += from;
@@ -1644,7 +1744,6 @@ static void tibetanAttributes(QChar::Script script, const char16_t *text, qsizet
i++;
while (i < boundary) {
attributes[i].graphemeBoundary = false;
- ++uc;
++i;
}
assert(i == boundary);
@@ -1695,6 +1794,8 @@ enum MymrCharClassFlags {
Mymr_CF_AFTER_KINZI = 0x00100000
};
+Q_DECLARE_MIXED_ENUM_OPERATORS(int, MymrCharClassValues, MymrCharClassFlags)
+
/* Characters that get refrered to by name */
enum MymrChar
{
@@ -1827,7 +1928,7 @@ static qsizetype myanmar_nextSyllableBoundary(const char16_t *s, qsizetype start
if (pos == start)
*invalid = (bool)(charClass & Mymr_CF_DOTTED_CIRCLE);
- MMDEBUG("state[%d]=%d class=%8x (uc=%4x)", int(pos - start), state, charClass, *uc);
+ MMDEBUG("state[%lld]=%d class=%8x (uc=%4x)", qlonglong(pos - start), state, charClass, *uc);
if (state < 0) {
if (state < -1)
@@ -1843,7 +1944,6 @@ static qsizetype myanmar_nextSyllableBoundary(const char16_t *s, qsizetype start
static void myanmarAttributes(QChar::Script script, const char16_t *text, qsizetype from, qsizetype len, QCharAttributes *attributes)
{
qsizetype end = from + len;
- const char16_t *uc = text + from;
qsizetype i = 0;
Q_UNUSED(script);
attributes += from;
@@ -1859,7 +1959,6 @@ static void myanmarAttributes(QChar::Script script, const char16_t *text, qsizet
i++;
while (i < boundary) {
attributes[i].graphemeBoundary = false;
- ++uc;
++i;
}
assert(i == boundary);
@@ -1942,6 +2041,7 @@ enum KhmerCharClassFlags {
CF_POS_MASK = 0x000f0000
};
+Q_DECLARE_MIXED_ENUM_OPERATORS(int, KhmerCharClassValues, KhmerCharClassFlags)
/* Characters that get referred to by name */
enum KhmerChar {
@@ -2163,7 +2263,7 @@ static qsizetype khmer_nextSyllableBoundary(const char16_t *s, qsizetype start,
}
state = khmerStateTable[state][charClass & CF_CLASS_MASK];
- KHDEBUG("state[%d]=%d class=%8lx (uc=%4x)", int(pos - start), state,
+ KHDEBUG("state[%lld]=%d class=%8lx (uc=%4x)", qlonglong(pos - start), state,
charClass, *uc );
if (state < 0) {
@@ -2178,7 +2278,6 @@ static qsizetype khmer_nextSyllableBoundary(const char16_t *s, qsizetype start,
static void khmerAttributes(QChar::Script script, const char16_t *text, qsizetype from, qsizetype len, QCharAttributes *attributes)
{
qsizetype end = from + len;
- const char16_t *uc = text + from;
qsizetype i = 0;
Q_UNUSED(script);
attributes += from;
@@ -2192,7 +2291,6 @@ static void khmerAttributes(QChar::Script script, const char16_t *text, qsizetyp
i++;
while ( i < boundary ) {
attributes[i].graphemeBoundary = false;
- ++uc;
++i;
}
assert( i == boundary );
diff --git a/src/corelib/text/qunicodetools_p.h b/src/corelib/text/qunicodetools_p.h
index cecb6defc7..06f31a5511 100644
--- a/src/corelib/text/qunicodetools_p.h
+++ b/src/corelib/text/qunicodetools_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QUNICODETOOLS_P_H
#define QUNICODETOOLS_P_H
diff --git a/src/corelib/text/qutf8stringview.h b/src/corelib/text/qutf8stringview.h
index a6930c2e0f..fe105e283e 100644
--- a/src/corelib/text/qutf8stringview.h
+++ b/src/corelib/text/qutf8stringview.h
@@ -1,55 +1,24 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QUTF8STRINGVIEW_H
#define QUTF8STRINGVIEW_H
+#if 0
+#pragma qt_class(QUtf8StringView)
+#endif
+
#include <QtCore/qstringalgorithms.h>
+#include <QtCore/qstringfwd.h>
#include <QtCore/qarraydata.h> // for QContainerImplHelper
+#include <QtCore/qbytearrayview.h>
+#include <QtCore/qcompare.h>
#include <string>
+#include <string_view>
+#include <QtCore/q20type_traits.h>
QT_BEGIN_NAMESPACE
-template <bool> class QBasicUtf8StringView;
-class QByteArray;
-class QLatin1String;
-
namespace QtPrivate {
template <typename Char>
using IsCompatibleChar8TypeHelper = std::disjunction<
@@ -62,7 +31,7 @@ using IsCompatibleChar8TypeHelper = std::disjunction<
>;
template <typename Char>
using IsCompatibleChar8Type
- = IsCompatibleChar8TypeHelper<std::remove_cv_t<std::remove_reference_t<Char>>>;
+ = IsCompatibleChar8TypeHelper<q20::remove_cvref_t<Char>>;
template <typename Pointer>
struct IsCompatiblePointer8Helper : std::false_type {};
@@ -71,7 +40,7 @@ struct IsCompatiblePointer8Helper<Char*>
: IsCompatibleChar8Type<Char> {};
template <typename Pointer>
using IsCompatiblePointer8
- = IsCompatiblePointer8Helper<std::remove_cv_t<std::remove_reference_t<Pointer>>>;
+ = IsCompatiblePointer8Helper<q20::remove_cvref_t<Pointer>>;
template <typename T, typename Enable = void>
struct IsContainerCompatibleWithQUtf8StringView : std::false_type {};
@@ -98,7 +67,7 @@ struct IsContainerCompatibleWithQUtf8StringView<T, std::enable_if_t<std::conjunc
std::negation<std::is_same<std::decay_t<T>, QByteArray>>,
// This has a compatible value_type, but explicitly a different encoding
- std::negation<std::is_same<std::decay_t<T>, QLatin1String>>,
+ std::negation<std::is_same<std::decay_t<T>, QLatin1StringView>>,
// Don't make an accidental copy constructor
std::negation<std::disjunction<
@@ -117,7 +86,7 @@ struct wrap_char { using type = char; };
} // namespace QtPrivate
-#ifdef Q_CLANG_QDOC
+#ifdef Q_QDOC
#define QBasicUtf8StringView QUtf8StringView
#else
template <bool UseChar8T>
@@ -125,7 +94,7 @@ template <bool UseChar8T>
class QBasicUtf8StringView
{
public:
-#ifndef Q_CLANG_QDOC
+#ifndef Q_QDOC
using storage_type = typename std::conditional<UseChar8T,
QtPrivate::hide_char8_t,
QtPrivate::wrap_char
@@ -196,7 +165,7 @@ public:
constexpr QBasicUtf8StringView(const Char *f, const Char *l)
: QBasicUtf8StringView(f, l - f) {}
-#ifdef Q_CLANG_QDOC
+#ifdef Q_QDOC
template <typename Char, size_t N>
constexpr QBasicUtf8StringView(const Char (&array)[N]) noexcept;
@@ -209,8 +178,9 @@ public:
str ? std::char_traits<std::remove_cv_t<std::remove_pointer_t<Pointer>>>::length(str) : 0) {}
#endif
-#ifdef Q_CLANG_QDOC
+#ifdef Q_QDOC
QBasicUtf8StringView(const QByteArray &str) noexcept;
+ constexpr QBasicUtf8StringView(const storage_type *d, qsizetype n) noexcept {};
#else
template <typename String, if_compatible_qstring_like<String> = true>
QBasicUtf8StringView(const String &str) noexcept
@@ -221,7 +191,7 @@ public:
constexpr QBasicUtf8StringView(const Container &c) noexcept
: QBasicUtf8StringView(std::data(c), lengthHelperContainer(c)) {}
-#ifdef __cpp_char8_t
+#if defined(__cpp_char8_t) && !defined(Q_QDOC)
constexpr QBasicUtf8StringView(QBasicUtf8StringView<!UseChar8T> other)
: QBasicUtf8StringView(other.data(), other.size()) {}
#endif
@@ -233,13 +203,13 @@ public:
[[nodiscard]] inline QString toString() const; // defined in qstring.h
[[nodiscard]] constexpr qsizetype size() const noexcept { return m_size; }
- [[nodiscard]] const_pointer data() const noexcept { return reinterpret_cast<const_pointer>(m_data); }
-#if defined(__cpp_char8_t) || defined(Q_CLANG_QDOC)
+ [[nodiscard]] constexpr const_pointer data() const noexcept { return m_data; }
+#ifdef __cpp_char8_t
[[nodiscard]] const char8_t *utf8() const noexcept { return reinterpret_cast<const char8_t*>(m_data); }
#endif
[[nodiscard]] constexpr storage_type operator[](qsizetype n) const
- { return Q_ASSERT(n >= 0), Q_ASSERT(n < size()), m_data[n]; }
+ { verify(n, 1); return m_data[n]; }
//
// QString API
@@ -270,20 +240,20 @@ public:
}
[[nodiscard]] constexpr QBasicUtf8StringView sliced(qsizetype pos) const
- { verify(pos); return QBasicUtf8StringView{m_data + pos, m_size - pos}; }
+ { verify(pos, 0); return QBasicUtf8StringView{m_data + pos, m_size - pos}; }
[[nodiscard]] constexpr QBasicUtf8StringView sliced(qsizetype pos, qsizetype n) const
{ verify(pos, n); return QBasicUtf8StringView(m_data + pos, n); }
[[nodiscard]] constexpr QBasicUtf8StringView first(qsizetype n) const
- { verify(n); return QBasicUtf8StringView(m_data, n); }
+ { verify(0, n); return sliced(0, n); }
[[nodiscard]] constexpr QBasicUtf8StringView last(qsizetype n) const
- { verify(n); return QBasicUtf8StringView(m_data + m_size - n, n); }
+ { verify(0, n); return sliced(m_size - n, n); }
[[nodiscard]] constexpr QBasicUtf8StringView chopped(qsizetype n) const
- { verify(n); return QBasicUtf8StringView(m_data, m_size - n); }
+ { verify(0, n); return sliced(0, m_size - n); }
constexpr void truncate(qsizetype n)
- { verify(n); m_size = n; }
+ { verify(0, n); m_size = n; }
constexpr void chop(qsizetype n)
- { verify(n); m_size -= n; }
+ { verify(0, n); m_size -= n; }
[[nodiscard]] inline bool isValidUtf8() const noexcept
{
@@ -306,6 +276,9 @@ public:
[[nodiscard]] constexpr storage_type front() const { return Q_ASSERT(!empty()), m_data[0]; }
[[nodiscard]] constexpr storage_type back() const { return Q_ASSERT(!empty()), m_data[m_size - 1]; }
+ [[nodiscard]] Q_IMPLICIT operator std::basic_string_view<storage_type>() const noexcept
+ { return std::basic_string_view<storage_type>(data(), size_t(size())); }
+
//
// Qt compatibility API:
//
@@ -314,6 +287,26 @@ public:
[[nodiscard]] constexpr qsizetype length() const noexcept
{ return size(); }
+ [[nodiscard]] int compare(QBasicUtf8StringView other,
+ Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
+ {
+ return QtPrivate::compareStrings(*this, other, cs);
+ }
+
+ [[nodiscard]] int compare(QChar other,
+ Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept;
+ [[nodiscard]] int compare(QStringView other,
+ Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept;
+ [[nodiscard]] int compare(QLatin1StringView other,
+ Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept;
+ [[nodiscard]] int compare(const QByteArray &other,
+ Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept;
+
+ [[nodiscard]] bool equal(QChar other) const noexcept;
+ [[nodiscard]] bool equal(QStringView other) const noexcept;
+ [[nodiscard]] bool equal(QLatin1StringView other) const noexcept;
+ [[nodiscard]] bool equal(const QByteArray &other) const noexcept;
+
private:
[[nodiscard]] static inline int compare(QBasicUtf8StringView lhs, QBasicUtf8StringView rhs) noexcept
{
@@ -321,30 +314,96 @@ private:
QBasicUtf8StringView<false>(rhs.data(), rhs.size()));
}
- [[nodiscard]] friend inline bool operator==(QBasicUtf8StringView lhs, QBasicUtf8StringView rhs) noexcept
+ friend bool
+ comparesEqual(const QBasicUtf8StringView &lhs, const QBasicUtf8StringView &rhs) noexcept
{
return lhs.size() == rhs.size()
- && QtPrivate::equalStrings(QBasicUtf8StringView<false>(lhs.data(), lhs.size()),
- QBasicUtf8StringView<false>(rhs.data(), rhs.size()));
+ && QtPrivate::equalStrings(QBasicUtf8StringView<false>(lhs.data(), lhs.size()),
+ QBasicUtf8StringView<false>(rhs.data(), rhs.size()));
+ }
+ friend Qt::strong_ordering
+ compareThreeWay(const QBasicUtf8StringView &lhs, const QBasicUtf8StringView &rhs) noexcept
+ {
+ const int res = QBasicUtf8StringView::compare(lhs, rhs);
+ return Qt::compareThreeWay(res, 0);
}
- [[nodiscard]] friend inline bool operator!=(QBasicUtf8StringView lhs, QBasicUtf8StringView rhs) noexcept
- { return !operator==(lhs, rhs); }
+ Q_DECLARE_STRONGLY_ORDERED(QBasicUtf8StringView)
-#ifdef __cpp_impl_three_way_comparison
- [[nodiscard]] friend inline auto operator<=>(QBasicUtf8StringView lhs, QBasicUtf8StringView rhs) noexcept
- { return QBasicUtf8StringView::compare(lhs, rhs) <=> 0; }
-#else
- [[nodiscard]] friend inline bool operator<=(QBasicUtf8StringView lhs, QBasicUtf8StringView rhs) noexcept
- { return QBasicUtf8StringView::compare(lhs, rhs) <= 0; }
- [[nodiscard]] friend inline bool operator>=(QBasicUtf8StringView lhs, QBasicUtf8StringView rhs) noexcept
- { return QBasicUtf8StringView::compare(lhs, rhs) >= 0; }
- [[nodiscard]] friend inline bool operator<(QBasicUtf8StringView lhs, QBasicUtf8StringView rhs) noexcept
- { return QBasicUtf8StringView::compare(lhs, rhs) < 0; }
- [[nodiscard]] friend inline bool operator>(QBasicUtf8StringView lhs, QBasicUtf8StringView rhs) noexcept
- { return QBasicUtf8StringView::compare(lhs, rhs) > 0; }
-#endif
+ friend bool
+ comparesEqual(const QBasicUtf8StringView &lhs, const QLatin1StringView &rhs) noexcept
+ {
+ return lhs.equal(rhs);
+ }
+ friend Qt::strong_ordering
+ compareThreeWay(const QBasicUtf8StringView &lhs, const QLatin1StringView &rhs) noexcept
+ {
+ const int res = lhs.compare(rhs);
+ return Qt::compareThreeWay(res, 0);
+ }
+ Q_DECLARE_STRONGLY_ORDERED(QBasicUtf8StringView, QLatin1StringView)
- Q_ALWAYS_INLINE constexpr void verify(qsizetype pos, qsizetype n = 0) const
+ friend bool
+ comparesEqual(const QBasicUtf8StringView &lhs, const QStringView &rhs) noexcept
+ { return lhs.equal(rhs); }
+ friend Qt::strong_ordering
+ compareThreeWay(const QBasicUtf8StringView &lhs, const QStringView &rhs) noexcept
+ {
+ const int res = lhs.compare(rhs);
+ return Qt::compareThreeWay(res, 0);
+ }
+ Q_DECLARE_STRONGLY_ORDERED(QBasicUtf8StringView, QStringView)
+
+ friend bool comparesEqual(const QBasicUtf8StringView &lhs, const QChar &rhs) noexcept
+ { return lhs.equal(rhs); }
+ friend Qt::strong_ordering
+ compareThreeWay(const QBasicUtf8StringView &lhs, const QChar &rhs) noexcept
+ {
+ const int res = lhs.compare(rhs);
+ return Qt::compareThreeWay(res, 0);
+ }
+ Q_DECLARE_STRONGLY_ORDERED(QBasicUtf8StringView, QChar)
+ Q_DECLARE_STRONGLY_ORDERED(QBasicUtf8StringView, char16_t)
+
+#if !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII)
+ friend bool
+ comparesEqual(const QBasicUtf8StringView &lhs, const QByteArrayView &rhs) noexcept
+ {
+ return lhs.size() == rhs.size()
+ && QtPrivate::equalStrings(QBasicUtf8StringView<false>(lhs.data(), lhs.size()),
+ QBasicUtf8StringView<false>(rhs.data(), rhs.size()));
+ }
+ friend Qt::strong_ordering
+ compareThreeWay(const QBasicUtf8StringView &lhs, const QByteArrayView &rhs) noexcept
+ {
+ const int res = QtPrivate::compareStrings(QBasicUtf8StringView<false>(lhs.data(), lhs.size()),
+ QBasicUtf8StringView<false>(rhs.data(), rhs.size()));
+ return Qt::compareThreeWay(res, 0);
+ }
+ Q_DECLARE_STRONGLY_ORDERED(QBasicUtf8StringView, QByteArrayView, QT_ASCII_CAST_WARN)
+
+ friend bool
+ comparesEqual(const QBasicUtf8StringView &lhs, const QByteArray &rhs) noexcept
+ {
+ return lhs.equal(rhs);
+ }
+ friend Qt::strong_ordering
+ compareThreeWay(const QBasicUtf8StringView &lhs, const QByteArray &rhs) noexcept
+ {
+ const int res = lhs.compare(rhs);
+ return Qt::compareThreeWay(res, 0);
+ }
+ Q_DECLARE_STRONGLY_ORDERED(QBasicUtf8StringView, QByteArray, QT_ASCII_CAST_WARN)
+
+ friend bool comparesEqual(const QBasicUtf8StringView &lhs, const char *rhs) noexcept
+ { return comparesEqual(lhs, QByteArrayView(rhs)); }
+ friend Qt::strong_ordering
+ compareThreeWay(const QBasicUtf8StringView &lhs, const char *rhs) noexcept
+ { return compareThreeWay(lhs, QByteArrayView(rhs)); }
+ Q_DECLARE_STRONGLY_ORDERED(QBasicUtf8StringView, const char *, QT_ASCII_CAST_WARN)
+#endif // !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII)
+
+ Q_ALWAYS_INLINE constexpr void verify([[maybe_unused]] qsizetype pos = 0,
+ [[maybe_unused]] qsizetype n = 1) const
{
Q_ASSERT(pos >= 0);
Q_ASSERT(pos <= size());
@@ -355,25 +414,20 @@ private:
qsizetype m_size;
};
-#ifdef Q_CLANG_QDOC
+constexpr QByteArrayView::QByteArrayView(QUtf8StringView v) noexcept
+ : QByteArrayView(v.data(), v.size())
+{}
+
+#ifdef Q_QDOC
#undef QBasicUtf8StringView
#else
template <bool UseChar8T>
Q_DECLARE_TYPEINFO_BODY(QBasicUtf8StringView<UseChar8T>, Q_PRIMITIVE_TYPE);
-// ### Qt 7: remove the non-char8_t version of QUtf8StringView
-QT_BEGIN_NO_CHAR8_T_NAMESPACE
-using QUtf8StringView = QBasicUtf8StringView<false>;
-QT_END_NO_CHAR8_T_NAMESPACE
-
-QT_BEGIN_HAS_CHAR8_T_NAMESPACE
-using QUtf8StringView = QBasicUtf8StringView<true>;
-QT_END_HAS_CHAR8_T_NAMESPACE
-#endif // Q_CLANG_QDOC
-
template <typename QStringLike, std::enable_if_t<std::is_same_v<QStringLike, QByteArray>, bool> = true>
[[nodiscard]] inline q_no_char8_t::QUtf8StringView qToUtf8StringViewIgnoringNull(const QStringLike &s) noexcept
-{ return q_no_char8_t::QUtf8StringView(s.data(), s.size()); }
+{ return q_no_char8_t::QUtf8StringView(s.begin(), s.size()); }
+#endif // Q_QDOC
QT_END_NAMESPACE
diff --git a/src/corelib/text/qutf8stringview.qdoc b/src/corelib/text/qutf8stringview.qdoc
index deac0882fe..b433e5b995 100644
--- a/src/corelib/text/qutf8stringview.qdoc
+++ b/src/corelib/text/qutf8stringview.qdoc
@@ -1,29 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
\class QUtf8StringView
@@ -35,6 +11,14 @@
\ingroup tools
\ingroup string-processing
+ \compares strong
+ \compareswith strong char16_t QChar {const char16_t *} QString QStringView \
+ QLatin1StringView
+ \endcompareswith
+ \compareswith strong {const char *} QByteArray QByteArrayView
+ The contents of byte arrays is interpreted as utf-8.
+ \endcompareswith
+
A QUtf8StringView references a contiguous portion of a UTF-8
string it does not own. It acts as an interface type to all kinds
of UTF-8 string, without the need to construct a QString or
@@ -228,6 +212,11 @@
*/
/*!
+ \fn QUtf8StringView::QUtf8StringView(const storage_type *d, qsizetype n)
+ \internal
+*/
+
+/*!
\fn QUtf8StringView::QUtf8StringView(std::nullptr_t)
Constructs a null string view.
@@ -236,7 +225,7 @@
*/
/*!
- \fn template <typename Char> QUtf8StringView::QUtf8StringView(const Char *str, qsizetype len)
+ \fn template <typename Char, QUtf8StringView::if_compatible_char<Char> = true> QUtf8StringView::QUtf8StringView(const Char *str, qsizetype len)
Constructs a string view on \a str with length \a len.
@@ -252,7 +241,7 @@
*/
/*!
- \fn template <typename Char> QUtf8StringView::QUtf8StringView(const Char *first, const Char *last)
+ \fn template <typename Char, QUtf8StringView::if_compatible_char<Char> = true> QUtf8StringView::QUtf8StringView(const Char *first, const Char *last)
Constructs a string view on \a first with length (\a last - \a first).
@@ -306,26 +295,26 @@
*/
/*!
- \fn template <typename Container, if_compatible_container<Container>> QUtf8StringView::QUtf8StringView(const Container &str)
+ \fn template <typename Container, QUtf8StringView::if_compatible_container<Container>> QUtf8StringView::QUtf8StringView(const Container &str)
- Constructs a string view on \a str. The length is taken from \c{str.size()}.
+ Constructs a string view on \a str. The length is taken from \c{std::size(str)}.
- \c{str.data()} must remain valid for the lifetime of this string view object.
+ \c{std::data(str)} must remain valid for the lifetime of this string view object.
- This constructor only participates in overload resolution if \c Container is an
- instantiation of \c std::basic_string with a compatible character type. The
+ This constructor only participates in overload resolution if \c Container is a
+ container with a compatible character type as \c{value_type}. The
compatible character types are: \c char8_t, \c char, \c{signed char} and
\c{unsigned char}.
- The string view will be empty if and only if \c{str.empty()}. It is unspecified
- whether this constructor can result in a null string view (\c{str.data()} would
+ The string view will be empty if and only if \c{std::size(str) == 0}. It is unspecified
+ whether this constructor can result in a null string view (\c{std::data(str)} would
have to return \nullptr for this).
\sa isNull(), isEmpty()
*/
/*!
- \fn template <typename Char, size_t Size, if_compatible_char<Char>> QUtf8StringView::fromArray(const Char (&string)[Size])
+ \fn template <typename Char, size_t Size, QUtf8StringView::if_compatible_char<Char>> QUtf8StringView::fromArray(const Char (&string)[Size])
Constructs a string view on the full character string literal \a string,
including any trailing \c{Char(0)}. If you don't want the
@@ -497,7 +486,7 @@
*/
/*!
- \fn int QUtf8StringView::length() const
+ \fn QUtf8StringView::length() const
Same as size().
@@ -624,8 +613,10 @@
Returns a string view containing \a n code points of this string view,
starting at position \a pos.
+//! [UB-sliced-index-length]
\note The behavior is undefined when \a pos < 0, \a n < 0,
or \a pos + \a n > size().
+//! [UB-sliced-index-length]
\sa first(), last(), chopped(), chop(), truncate()
*/
@@ -636,7 +627,9 @@
Returns a string view starting at position \a pos in this object,
and extending to its end.
+//! [UB-sliced-index-only]
\note The behavior is undefined when \a pos < 0 or \a pos > size().
+//! [UB-sliced-index-only]
\sa first(), last(), chopped(), chop(), truncate()
*/
@@ -679,6 +672,20 @@
*/
/*!
+ \fn int QUtf8StringView::compare(QLatin1StringView str, Qt::CaseSensitivity cs) const
+ \fn int QUtf8StringView::compare(QUtf8StringView str, Qt::CaseSensitivity cs) const
+ \fn int QUtf8StringView::compare(QStringView str, Qt::CaseSensitivity cs) const
+ \since 6.5
+
+ Compares this string view with \a str and returns a negative integer if
+ this string view is less than \a str, a positive integer if it is greater than
+ \a str, and zero if they are equal.
+
+ \include qstring.qdocinc {search-comparison-case-sensitivity} {comparison}
+*/
+
+
+/*!
\fn QUtf8StringView::isValidUtf8() const
Returns \c true if this string contains valid UTF-8 encoded data,
@@ -701,3 +708,13 @@
\sa QByteArray::isNull(), QUtf8StringView
*/
+
+
+/*! \fn QUtf8StringView::operator std::basic_string_view<storage_type>() const
+ \since 6.7
+
+ Converts this QUtf8StringView object to a
+ \c{std::basic_string_view} object. The returned view will have the
+ same data pointer and length of this view. The character type of
+ the returned view will be \c{storage_type}.
+*/
diff --git a/src/corelib/text/qvsnprintf.cpp b/src/corelib/text/qvsnprintf.cpp
index 43a21771a1..839fc24217 100644
--- a/src/corelib/text/qvsnprintf.cpp
+++ b/src/corelib/text/qvsnprintf.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qplatformdefs.h"
@@ -46,7 +10,7 @@
QT_BEGIN_NAMESPACE
-#if !defined(QT_VSNPRINTF) || defined(Q_CLANG_QDOC)
+#if !defined(QT_VSNPRINTF) || defined(Q_QDOC)
/*!
\relates QByteArray
diff --git a/src/corelib/thread/qatomic.cpp b/src/corelib/thread/qatomic.cpp
index 3c05661980..a437eb3319 100644
--- a/src/corelib/thread/qatomic.cpp
+++ b/src/corelib/thread/qatomic.cpp
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2016 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qatomic.h"
@@ -67,19 +31,19 @@
The template parameter \c T must be a C++ integer type:
\list
- \li 8-bit: char, signed char, unsigned char, qint8, quint8
- \li 16-bit: short, unsigned short, qint16, quint16, char16_t (C++11)
- \li 32-bit: int, unsigned int, qint32, quint32, char32_t (C++11)
+ \li 8-bit: bool, char, signed char, unsigned char, qint8, quint8, char8_t (C++20)
+ \li 16-bit: short, unsigned short, qint16, quint16, char16_t
+ \li 32-bit: int, unsigned int, qint32, quint32, char32_t
\li 64-bit: long long, unsigned long long, qint64, quint64
\li platform-specific size: long, unsigned long
\li pointer size: qintptr, quintptr, qptrdiff
\endlist
- Of the list above, only the 32-bit- and pointer-sized instantiations are guaranteed to
- work on all platforms. Support for other sizes depends on the compiler and
- processor architecture the code is being compiled for. To test whether the
- other types are supported, check the macro \c Q_ATOMIC_INT\e{nn}_IS_SUPPORTED,
- where \c{\e{nn}} is the number of bits desired.
+ Of the list above, only the 8-bit, 16-bit, 32-bit- and pointer-sized
+ instantiations are guaranteed to work on all platforms. Support for other
+ sizes depends on the compiler and processor architecture the code is being
+ compiled for. To test whether the 64-bit types are supported on 32-bit
+ platforms, check the macro \c Q_ATOMIC_INT64_IS_SUPPORTED.
\section1 The Atomic API
@@ -433,14 +397,21 @@
Atomic test-and-set.
+ \note If you use this function in a loop, consider using the overload with the
+ additional \c{T &currentValue} argument instead, which avoids the extra load() on
+ failure.
+
If the current value of this QAtomicInteger is the \a expectedValue,
the test-and-set functions assign the \a newValue to this
QAtomicInteger and return true. If the values are \e not the same,
this function does nothing and returns \c false.
+//![memory-order-relaxed]
This function uses \e relaxed \l {QAtomicInteger#Memory
ordering}{memory ordering} semantics, leaving the compiler and
processor to freely reorder memory accesses.
+//![memory-order-relaxed]
+
*/
/*!
@@ -448,15 +419,21 @@
Atomic test-and-set.
+ \note If you use this function in a loop, consider using the overload with the
+ additional \c{T &currentValue} argument instead, which avoids the extra load() on
+ failure.
+
If the current value of this QAtomicInteger is the \a expectedValue,
the test-and-set functions assign the \a newValue to this
QAtomicInteger and return true. If the values are \e not the same,
this function does nothing and returns \c false.
+//![memory-order-acquire]
This function uses \e acquire \l {QAtomicInteger#Memory
ordering}{memory ordering} semantics, which ensures that memory
access following the atomic operation (in program order) may not
be re-ordered before the atomic operation.
+//![memory-order-acquire]
*/
/*!
@@ -464,15 +441,21 @@
Atomic test-and-set.
+ \note If you use this function in a loop, consider using the overload with the
+ additional \c{T &currentValue} argument instead, which avoids the extra load() on
+ failure.
+
If the current value of this QAtomicInteger is the \a expectedValue,
the test-and-set functions assign the \a newValue to this
QAtomicInteger and return true. If the values are \e not the same,
this function does nothing and returns \c false.
+//![memory-order-release]
This function uses \e release \l {QAtomicInteger#Memory
ordering}{memory ordering} semantics, which ensures that memory
access before the atomic operation (in program order) may not be
re-ordered after the atomic operation.
+//![memory-order-release]
*/
/*!
@@ -480,15 +463,78 @@
Atomic test-and-set.
+ \note If you use this function in a loop, consider using the overload with the
+ additional \c{T &currentValue} argument instead, which avoids the extra load() on
+ failure.
+
If the current value of this QAtomicInteger is the \a expectedValue,
the test-and-set functions assign the \a newValue to this
QAtomicInteger and return true. If the values are \e not the same,
this function does nothing and returns \c false.
+//![memory-order-ordered]
This function uses \e ordered \l {QAtomicInteger#Memory
ordering}{memory ordering} semantics, which ensures that memory
access before and after the atomic operation (in program order)
may not be re-ordered.
+//![memory-order-ordered]
+
+*/
+
+/*!
+ \fn template <typename T> bool QAtomicInteger<T>::testAndSetRelaxed(T expectedValue, T newValue, T &currentValue)
+ \since 5.3
+
+ Atomic test-and-set.
+
+ If the current value of this QAtomicInteger is the \a expectedValue, the
+ test-and-set functions assign the \a newValue to this QAtomicInteger and
+ return \c true. If the values are \e not the same, the functions load the
+ current value of this QAtomicInteger into \a currentValue and return \c false.
+
+ \include qatomic.cpp memory-order-relaxed
+*/
+
+/*!
+ \fn template <typename T> bool QAtomicInteger<T>::testAndSetAcquire(T expectedValue, T newValue, T &currentValue)
+ \since 5.3
+
+ Atomic test-and-set.
+
+ If the current value of this QAtomicInteger is the \a expectedValue, the
+ test-and-set functions assign the \a newValue to this QAtomicInteger and
+ return \c true. If the values are \e not the same, the functions load the
+ current value of this QAtomicInteger into \a currentValue and return \c false.
+
+ \include qatomic.cpp memory-order-acquire
+*/
+
+/*!
+ \fn template <typename T> bool QAtomicInteger<T>::testAndSetRelease(T expectedValue, T newValue, T &currentValue)
+ \since 5.3
+
+ Atomic test-and-set.
+
+ If the current value of this QAtomicInteger is the \a expectedValue, the
+ test-and-set functions assign the \a newValue to this QAtomicInteger and
+ return \c true. If the values are \e not the same, the functions loads the
+ current value of this QAtomicInteger into \a currentValue and return \c false.
+
+ \include qatomic.cpp memory-order-release
+*/
+
+/*!
+ \fn template <typename T> bool QAtomicInteger<T>::testAndSetOrdered(T expectedValue, T newValue, T &currentValue)
+ \since 5.3
+
+ Atomic test-and-set.
+
+ If the current value of this QAtomicInteger is the \a expectedValue, the
+ test-and-set functions assign the \a newValue to this QAtomicInteger and
+ return \c true. If the values are \e not the same, it loads the current
+ value of this QAtomicInteger into \a currentValue and return \c false.
+
+ \include qatomic.cpp memory-order-ordered
*/
/*!
@@ -986,9 +1032,16 @@
This macro is defined if atomic integers of size \e{nn} (in bits) are
supported in this compiler / architecture combination.
- Q_ATOMIC_INT32_IS_SUPPORTED is always defined.
\e{nn} is the size of the integer, in bits (8, 16, 32 or 64).
+
+ The following macros always defined:
+
+ \list
+ \li Q_ATOMIC_INT8_IS_SUPPORTED
+ \li Q_ATOMIC_INT16_IS_SUPPORTED
+ \li Q_ATOMIC_INT32_IS_SUPPORTED
+ \endlist
*/
/*!
@@ -1306,7 +1359,7 @@
\endlist
- \sa QAtomicInteger
+ \sa QAtomicInteger, qYieldCpu()
*/
/*!
@@ -1689,6 +1742,12 @@
*/
// static checks
+#ifndef Q_ATOMIC_INT8_IS_SUPPORTED
+# error "Q_ATOMIC_INT8_IS_SUPPORTED must be defined"
+#endif
+#ifndef Q_ATOMIC_INT16_IS_SUPPORTED
+# error "Q_ATOMIC_INT16_IS_SUPPORTED must be defined"
+#endif
#ifndef Q_ATOMIC_INT32_IS_SUPPORTED
# error "Q_ATOMIC_INT32_IS_SUPPORTED must be defined"
#endif
@@ -1707,22 +1766,19 @@ static_assert(sizeof(QAtomicInteger<quintptr>));
static_assert(sizeof(QAtomicInteger<qptrdiff>));
static_assert(sizeof(QAtomicInteger<char32_t>));
-#ifdef Q_ATOMIC_INT16_IS_SUPPORTED
static_assert(sizeof(QAtomicInteger<short>));
static_assert(sizeof(QAtomicInteger<unsigned short>));
-# if WCHAR_MAX < 0x10000
static_assert(sizeof(QAtomicInteger<wchar_t>));
-# endif
static_assert(sizeof(QAtomicInteger<char16_t>));
-#endif
+
+static_assert(sizeof(QAtomicInteger<char>));
+static_assert(sizeof(QAtomicInteger<unsigned char>));
+static_assert(sizeof(QAtomicInteger<signed char>));
+static_assert(sizeof(QAtomicInteger<bool>));
#ifdef Q_ATOMIC_INT64_IS_SUPPORTED
static_assert(sizeof(QAtomicInteger<qint64>));
static_assert(sizeof(QAtomicInteger<quint64>));
#endif
-#if WCHAR_MAX == INT_MAX
-static_assert(sizeof(QAtomicInteger<wchar_t>));
-#endif
-
QT_END_NAMESPACE
diff --git a/src/corelib/thread/qatomic.h b/src/corelib/thread/qatomic.h
index 2080167d2c..7fe5ac69b9 100644
--- a/src/corelib/thread/qatomic.h
+++ b/src/corelib/thread/qatomic.h
@@ -1,44 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2017 The Qt Company Ltd.
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include <QtCore/qglobal.h>
+// Copyright (C) 2017 The Qt Company Ltd.
+// Copyright (C) 2016 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QATOMIC_H
#define QATOMIC_H
@@ -50,29 +12,16 @@ QT_BEGIN_NAMESPACE
QT_WARNING_PUSH
QT_WARNING_DISABLE_GCC("-Wextra")
-#ifdef Q_CLANG_QDOC
-# undef QT_BASIC_ATOMIC_HAS_CONSTRUCTORS
-#endif
-
// High-level atomic integer operations
template <typename T>
class QAtomicInteger : public QBasicAtomicInteger<T>
{
public:
// Non-atomic API
-#ifdef QT_BASIC_ATOMIC_HAS_CONSTRUCTORS
constexpr QAtomicInteger(T value = 0) noexcept : QBasicAtomicInteger<T>(value) {}
-#else
- inline QAtomicInteger(T value = 0) noexcept
- {
- this->_q_value = value;
- }
-#endif
inline QAtomicInteger(const QAtomicInteger &other) noexcept
-#ifdef QT_BASIC_ATOMIC_HAS_CONSTRUCTORS
: QBasicAtomicInteger<T>()
-#endif
{
this->storeRelease(other.loadAcquire());
}
@@ -83,7 +32,7 @@ public:
return *this;
}
-#ifdef Q_CLANG_QDOC
+#ifdef Q_QDOC
T loadRelaxed() const;
T loadAcquire() const;
void storeRelaxed(T newValue);
@@ -106,6 +55,11 @@ public:
bool testAndSetRelease(T expectedValue, T newValue);
bool testAndSetOrdered(T expectedValue, T newValue);
+ bool testAndSetRelaxed(T expectedValue, T newValue, T &currentValue);
+ bool testAndSetAcquire(T expectedValue, T newValue, T &currentValue);
+ bool testAndSetRelease(T expectedValue, T newValue, T &currentValue);
+ bool testAndSetOrdered(T expectedValue, T newValue, T &currentValue);
+
static constexpr bool isFetchAndStoreNative();
static constexpr bool isFetchAndStoreWaitFree();
@@ -160,10 +114,7 @@ public:
// Non-atomic API
// We could use QT_COMPILER_INHERITING_CONSTRUCTORS, but we need only one;
// the implicit definition for all the others is fine.
-#ifdef QT_BASIC_ATOMIC_HAS_CONSTRUCTORS
- constexpr
-#endif
- QAtomicInt(int value = 0) noexcept : QAtomicInteger<int>(value) {}
+ constexpr QAtomicInt(int value = 0) noexcept : QAtomicInteger<int>(value) {}
};
// High-level atomic pointer operations
@@ -171,18 +122,10 @@ template <typename T>
class QAtomicPointer : public QBasicAtomicPointer<T>
{
public:
-#ifdef QT_BASIC_ATOMIC_HAS_CONSTRUCTORS
constexpr QAtomicPointer(T *value = nullptr) noexcept : QBasicAtomicPointer<T>(value) {}
-#else
- inline QAtomicPointer(T *value = nullptr) noexcept
- {
- this->storeRelaxed(value);
- }
-#endif
+
inline QAtomicPointer(const QAtomicPointer<T> &other) noexcept
-#ifdef QT_BASIC_ATOMIC_HAS_CONSTRUCTORS
: QBasicAtomicPointer<T>()
-#endif
{
this->storeRelease(other.loadAcquire());
}
@@ -227,10 +170,6 @@ public:
QT_WARNING_POP
-#ifdef QT_BASIC_ATOMIC_HAS_CONSTRUCTORS
-# undef QT_BASIC_ATOMIC_HAS_CONSTRUCTORS
-#endif
-
/*!
This is a helper for the assignment operators of implicitly
shared classes. Your assignment operator should look like this:
diff --git a/src/corelib/thread/qatomic_bootstrap.h b/src/corelib/thread/qatomic_bootstrap.h
deleted file mode 100644
index c4279ee7b1..0000000000
--- a/src/corelib/thread/qatomic_bootstrap.h
+++ /dev/null
@@ -1,97 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2011 Thiago Macieira <thiago@kde.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QATOMIC_BOOTSTRAP_H
-#define QATOMIC_BOOTSTRAP_H
-
-#include <QtCore/qgenericatomic.h>
-
-QT_BEGIN_NAMESPACE
-
-#if 0
-// silence syncqt warnings
-QT_END_NAMESPACE
-#pragma qt_sync_skip_header_check
-#pragma qt_sync_stop_processing
-#endif
-
-template <typename T> struct QAtomicOps: QGenericAtomicOps<QAtomicOps<T> >
-{
- typedef T Type;
-
- static bool ref(T &_q_value) noexcept
- {
- return ++_q_value != 0;
- }
- static bool deref(T &_q_value) noexcept
- {
- return --_q_value != 0;
- }
-
- static bool testAndSetRelaxed(T &_q_value, T expectedValue, T newValue, T *currentValue = nullptr) noexcept
- {
- if (currentValue)
- *currentValue = _q_value;
- if (_q_value == expectedValue) {
- _q_value = newValue;
- return true;
- }
- return false;
- }
-
- static T fetchAndStoreRelaxed(T &_q_value, T newValue) noexcept
- {
- T tmp = _q_value;
- _q_value = newValue;
- return tmp;
- }
-
- template <typename AdditiveType> static
- T fetchAndAddRelaxed(T &_q_value, AdditiveType valueToAdd) noexcept
- {
- T returnValue = _q_value;
- _q_value += valueToAdd;
- return returnValue;
- }
-};
-
-QT_END_NAMESPACE
-
-#endif // QATOMIC_BOOTSTRAP_H
diff --git a/src/corelib/thread/qatomic_cxx11.h b/src/corelib/thread/qatomic_cxx11.h
index bf487bbf1f..47a7bc9a10 100644
--- a/src/corelib/thread/qatomic_cxx11.h
+++ b/src/corelib/thread/qatomic_cxx11.h
@@ -1,47 +1,12 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Thiago Macieira <thiago@kde.org>
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2011 Thiago Macieira <thiago@kde.org>
+// Copyright (C) 2016 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QATOMIC_CXX11_H
#define QATOMIC_CXX11_H
#include <QtCore/qgenericatomic.h>
+#include <QtCore/qyieldcpu.h>
#include <atomic>
QT_BEGIN_NAMESPACE
@@ -185,7 +150,7 @@ template <> inline bool QAtomicTraits<2>::isLockFree()
{ return false; }
#endif
-#if QT_CONFIG(std_atomic64)
+#if !defined(QT_BOOTSTRAPPED) && QT_CONFIG(std_atomic64)
template<> struct QAtomicOpsSupport<8> { enum { IsSupported = 1 }; };
# define Q_ATOMIC_INT64_IS_SUPPORTED
# if ATOMIC_LLONG_LOCK_FREE == 2
@@ -278,13 +243,27 @@ template <typename X> struct QAtomicOps
template <typename T>
static inline bool ref(std::atomic<T> &_q_value)
{
- return ++_q_value != 0;
+ /* Conceptually, we want to
+ * return ++_q_value != 0;
+ * However, that would be sequentially consistent, and thus stronger
+ * than what we need. Based on
+ * http://eel.is/c++draft/atomics.types.memop#6, we know that
+ * pre-increment is equivalent to fetch_add(1) + 1. Unlike
+ * pre-increment, fetch_add takes a memory order argument, so we can get
+ * the desired acquire-release semantics.
+ * One last gotcha is that fetch_add(1) + 1 would need to be converted
+ * back to T, because it's susceptible to integer promotion. To sidestep
+ * this issue and to avoid UB on signed overflow, we rewrite the
+ * expression to:
+ */
+ return _q_value.fetch_add(1, std::memory_order_acq_rel) != T(-1);
}
template <typename T>
static inline bool deref(std::atomic<T> &_q_value) noexcept
{
- return --_q_value != 0;
+ // compare with ref
+ return _q_value.fetch_sub(1, std::memory_order_acq_rel) != T(1);
}
static inline bool isTestAndSetNative() noexcept
diff --git a/src/corelib/thread/qbasicatomic.h b/src/corelib/thread/qbasicatomic.h
index 52ad2ff369..6d061ea49a 100644
--- a/src/corelib/thread/qbasicatomic.h
+++ b/src/corelib/thread/qbasicatomic.h
@@ -1,61 +1,11 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Thiago Macieira <thiago@kde.org>
-** Copyright (C) 2018 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include <QtCore/qglobal.h>
+// Copyright (C) 2011 Thiago Macieira <thiago@kde.org>
+// Copyright (C) 2018 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QBASICATOMIC_H
#define QBASICATOMIC_H
-#if defined(QT_BOOTSTRAPPED)
-# include <QtCore/qatomic_bootstrap.h>
-
-// If C++11 atomics are supported, use them!
-// Note that constexpr support is sometimes disabled in QNX or INTEGRITY builds,
-// but their libraries have <atomic>.
-#elif defined(Q_COMPILER_ATOMICS)
-# include <QtCore/qatomic_cxx11.h>
-
-// No fallback
-#else
-# error "Qt requires C++11 support"
-#endif
+#include <QtCore/qatomic_cxx11.h>
QT_WARNING_PUSH
QT_WARNING_DISABLE_MSVC(4522)
@@ -69,10 +19,6 @@ QT_END_NAMESPACE
#pragma qt_sync_stop_processing
#endif
-// New atomics
-
-#define QT_BASIC_ATOMIC_HAS_CONSTRUCTORS
-
template <typename T>
class QBasicAtomicInteger
{
@@ -80,7 +26,7 @@ public:
typedef T Type;
typedef QAtomicOps<T> Ops;
// static check that this is a valid integer
- static_assert(QTypeInfo<T>::isIntegral, "template parameter is not an integral type");
+ static_assert(std::is_integral_v<T>, "template parameter is not an integral type");
static_assert(QAtomicOpsSupport<sizeof(T)>::IsSupported, "template parameter is an integral of a size not supported on this platform");
typename Ops::Type _q_value;
@@ -203,13 +149,11 @@ public:
{ return fetchAndXorOrdered(v) ^ v; }
-#ifdef QT_BASIC_ATOMIC_HAS_CONSTRUCTORS
QBasicAtomicInteger() = default;
constexpr QBasicAtomicInteger(T value) noexcept : _q_value(value) {}
QBasicAtomicInteger(const QBasicAtomicInteger &) = delete;
QBasicAtomicInteger &operator=(const QBasicAtomicInteger &) = delete;
QBasicAtomicInteger &operator=(const QBasicAtomicInteger &) volatile = delete;
-#endif
};
typedef QBasicAtomicInteger<int> QBasicAtomicInt;
@@ -300,13 +244,11 @@ public:
Type operator-=(qptrdiff valueToSub) noexcept
{ return fetchAndSubOrdered(valueToSub) - valueToSub; }
-#ifdef QT_BASIC_ATOMIC_HAS_CONSTRUCTORS
QBasicAtomicPointer() = default;
constexpr QBasicAtomicPointer(Type value) noexcept : _q_value(value) {}
QBasicAtomicPointer(const QBasicAtomicPointer &) = delete;
QBasicAtomicPointer &operator=(const QBasicAtomicPointer &) = delete;
QBasicAtomicPointer &operator=(const QBasicAtomicPointer &) volatile = delete;
-#endif
};
#ifndef Q_BASIC_ATOMIC_INITIALIZER
diff --git a/src/corelib/thread/qexception.cpp b/src/corelib/thread/qexception.cpp
index 8967e9db1c..a623dc1c6e 100644
--- a/src/corelib/thread/qexception.cpp
+++ b/src/corelib/thread/qexception.cpp
@@ -1,46 +1,10 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qexception.h"
#include "QtCore/qshareddata.h"
-#if !defined(QT_NO_EXCEPTIONS) || defined(Q_CLANG_QDOC)
+#if !defined(QT_NO_EXCEPTIONS) || defined(Q_QDOC)
QT_BEGIN_NAMESPACE
@@ -216,7 +180,7 @@ QUnhandledException *QUnhandledException::clone() const
return new QUnhandledException(*this);
}
-#if !defined(Q_CLANG_QDOC)
+#if !defined(Q_QDOC)
namespace QtPrivate {
@@ -260,7 +224,7 @@ void ExceptionStore::rethrowException() const
} // namespace QtPrivate
-#endif //Q_CLANG_QDOC
+#endif //Q_QDOC
QT_END_NAMESPACE
diff --git a/src/corelib/thread/qexception.h b/src/corelib/thread/qexception.h
index 1c69287615..62b9e70bea 100644
--- a/src/corelib/thread/qexception.h
+++ b/src/corelib/thread/qexception.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QTCORE_QEXCEPTION_H
#define QTCORE_QEXCEPTION_H
@@ -52,7 +16,7 @@ QT_REQUIRE_CONFIG(future);
QT_BEGIN_NAMESPACE
-#if !defined(QT_NO_EXCEPTIONS) || defined(Q_CLANG_QDOC)
+#if !defined(QT_NO_EXCEPTIONS) || defined(Q_QDOC)
class Q_CORE_EXPORT QException : public std::exception
{
@@ -72,7 +36,7 @@ public:
QUnhandledException(QUnhandledException &&other) noexcept;
QUnhandledException(const QUnhandledException &other) noexcept;
- void swap(QUnhandledException &other) noexcept { qSwap(d, other.d); }
+ void swap(QUnhandledException &other) noexcept { d.swap(other.d); }
QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_PURE_SWAP(QUnhandledException)
QUnhandledException &operator=(const QUnhandledException &other) noexcept;
diff --git a/src/corelib/thread/qfutex_freebsd_p.h b/src/corelib/thread/qfutex_freebsd_p.h
new file mode 100644
index 0000000000..b31774d28d
--- /dev/null
+++ b/src/corelib/thread/qfutex_freebsd_p.h
@@ -0,0 +1,82 @@
+// Copyright (C) 2023 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QFUTEX_FREEBSD_P_H
+#define QFUTEX_FREEBSD_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <private/qcore_unix_p.h>
+#include <qdeadlinetimer.h>
+
+// https://man.freebsd.org/cgi/man.cgi?query=_umtx_op
+#include <sys/umtx.h>
+
+#define QT_ALWAYS_USE_FUTEX
+
+QT_BEGIN_NAMESPACE
+
+namespace QtFreeBSDFutex {
+constexpr inline bool futexAvailable() { return true; }
+
+template <typename Atomic>
+inline int do_wait(Atomic &futex, typename Atomic::Type expectedValue, _umtx_time *tmp = nullptr)
+{
+ // FreeBSD UMTX_OP_WAIT does not apply acquire or release memory barriers,
+ // so there are no QtTsan calls here.
+
+ int op = UMTX_OP_WAIT_UINT_PRIVATE;
+ if (sizeof(futex) > sizeof(quint32))
+ op = UMTX_OP_WAIT; // no _PRIVATE version
+
+ // The timeout is passed in uaddr2, with its size in uaddr
+ void *uaddr = reinterpret_cast<void *>(tmp ? sizeof(*tmp) : 0);
+ void *uaddr2 = tmp;
+ int ret = _umtx_op(&futex, op, u_long(expectedValue), uaddr, uaddr2);
+
+ return ret;
+}
+
+template <typename Atomic>
+inline void futexWait(Atomic &futex, typename Atomic::Type expectedValue)
+{
+ do_wait(futex, expectedValue);
+}
+
+template <typename Atomic>
+inline bool futexWait(Atomic &futex, typename Atomic::Type expectedValue, QDeadlineTimer timer)
+{
+ struct _umtx_time tm = {};
+ auto deadline = timer.deadline<std::chrono::steady_clock>();
+ tm._timeout = durationToTimespec(deadline.time_since_epoch());
+ tm._flags = UMTX_ABSTIME;
+ tm._clockid = CLOCK_MONOTONIC;
+ int r = do_wait(futex, expectedValue, &tm);
+ return r == 0 || errno != ETIMEDOUT;
+}
+
+template <typename Atomic> inline void futexWakeOne(Atomic &futex)
+{
+ _umtx_op(&futex, UMTX_OP_WAKE_PRIVATE, 1, nullptr, nullptr);
+}
+
+template <typename Atomic> inline void futexWakeAll(Atomic &futex)
+{
+ _umtx_op(&futex, UMTX_OP_WAKE_PRIVATE, INT_MAX, nullptr, nullptr);
+}
+} //namespace QtFreeBSDFutex
+
+namespace QtFutex = QtFreeBSDFutex;
+
+QT_END_NAMESPACE
+
+#endif // QFUTEX_FREEBSD_P_H
diff --git a/src/corelib/thread/qfutex_linux_p.h b/src/corelib/thread/qfutex_linux_p.h
new file mode 100644
index 0000000000..e114dfca72
--- /dev/null
+++ b/src/corelib/thread/qfutex_linux_p.h
@@ -0,0 +1,95 @@
+// Copyright (C) 2023 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QFUTEX_LINUX_P_H
+#define QFUTEX_LINUX_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <private/qcore_unix_p.h>
+#include <qdeadlinetimer.h>
+#include <qtsan_impl.h>
+
+#include <asm/unistd.h>
+#include <errno.h>
+#include <limits.h>
+#include <linux/futex.h>
+#include <sys/syscall.h>
+#include <unistd.h>
+
+// RISC-V does not supply __NR_futex
+#ifndef __NR_futex
+# define __NR_futex __NR_futex_time64
+#endif
+
+#define QT_ALWAYS_USE_FUTEX
+
+QT_BEGIN_NAMESPACE
+
+namespace QtLinuxFutex {
+constexpr inline bool futexAvailable() { return true; }
+
+inline int _q_futex(int *addr, int op, int val, quintptr val2 = 0,
+ int *addr2 = nullptr, int val3 = 0) noexcept
+{
+ QtTsan::futexRelease(addr, addr2);
+
+ // we use __NR_futex because some libcs (like Android's bionic) don't
+ // provide SYS_futex etc.
+ int result = syscall(__NR_futex, addr, op | FUTEX_PRIVATE_FLAG, val, val2, addr2, val3);
+
+ QtTsan::futexAcquire(addr, addr2);
+
+ return result;
+}
+template <typename T> int *addr(T *ptr)
+{
+ int *int_addr = reinterpret_cast<int *>(ptr);
+#if Q_BYTE_ORDER == Q_BIG_ENDIAN
+ if (sizeof(T) > sizeof(int))
+ int_addr++; //We want a pointer to the least significant half
+#endif
+ return int_addr;
+}
+
+template <typename Atomic>
+inline void futexWait(Atomic &futex, typename Atomic::Type expectedValue)
+{
+ _q_futex(addr(&futex), FUTEX_WAIT, qintptr(expectedValue));
+}
+template <typename Atomic>
+inline bool futexWait(Atomic &futex, typename Atomic::Type expectedValue, QDeadlineTimer deadline)
+{
+ auto timeout = deadline.deadline<std::chrono::steady_clock>().time_since_epoch();
+ struct timespec ts = durationToTimespec(timeout);
+ int r = _q_futex(addr(&futex), FUTEX_WAIT_BITSET, qintptr(expectedValue), quintptr(&ts),
+ nullptr, FUTEX_BITSET_MATCH_ANY);
+ return r == 0 || errno != ETIMEDOUT;
+}
+template <typename Atomic> inline void futexWakeOne(Atomic &futex)
+{
+ _q_futex(addr(&futex), FUTEX_WAKE, 1);
+}
+template <typename Atomic> inline void futexWakeAll(Atomic &futex)
+{
+ _q_futex(addr(&futex), FUTEX_WAKE, INT_MAX);
+}
+template <typename Atomic> inline
+void futexWakeOp(Atomic &futex1, int wake1, int wake2, Atomic &futex2, quint32 op)
+{
+ _q_futex(addr(&futex1), FUTEX_WAKE_OP, wake1, wake2, addr(&futex2), op);
+}} // namespace QtLinuxFutex
+namespace QtFutex = QtLinuxFutex;
+
+QT_END_NAMESPACE
+
+#endif // QFUTEX_LINUX_P_H
diff --git a/src/corelib/thread/qfutex_mac_p.h b/src/corelib/thread/qfutex_mac_p.h
new file mode 100644
index 0000000000..0de08954ab
--- /dev/null
+++ b/src/corelib/thread/qfutex_mac_p.h
@@ -0,0 +1,140 @@
+// Copyright (C) 2023 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QFUTEX_MAC_P_H
+#define QFUTEX_MAC_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <qdeadlinetimer.h>
+#include <qtsan_impl.h>
+#include <private/qglobal_p.h>
+
+// The Darwin kernel exposes a set of __ulock_{wait,wait2,wake} APIs in
+// https://github.com/apple-oss-distributions/xnu/blob/xnu-8792.81.2/bsd/sys/ulock.h,
+// but these APIs are marked as private, so we cannot rely on them being
+// stable, nor we can use these APIs in builds of Qt intended for
+// the Apple App Store. By wholesale disabling the use of the APIs
+// in App Store compliant builds, and runtime checking availability
+// of the APIs when we do build them in, we should be safe, unless
+// the semantics of the APIs change in ways we haven't accounted for,
+// but that's a risk we're willing to take.
+
+#if QT_CONFIG(appstore_compliant)
+QT_BEGIN_NAMESPACE
+namespace QtFutex = QtDummyFutex;
+QT_END_NAMESPACE
+#else
+
+extern "C" {
+// -------- BEGIN OS Declarations --------
+// Source: https://github.com/apple-oss-distributions/xnu/blob/xnu-8792.81.2/bsd/sys/ulock.h
+// Modification: added __attribute((__weak__))
+// Copyright (c) 2015 Apple Inc. All rights reserved.
+
+__attribute((__weak__))
+extern int __ulock_wait2(uint32_t operation, void *addr, uint64_t value,
+ uint64_t timeout, uint64_t value2);
+__attribute((__weak__))
+extern int __ulock_wake(uint32_t operation, void *addr, uint64_t wake_value);
+
+/*
+ * operation bits [7, 0] contain the operation code.
+ */
+#define UL_COMPARE_AND_WAIT 1
+#define UL_COMPARE_AND_WAIT_SHARED 3
+#define UL_COMPARE_AND_WAIT64 5
+#define UL_COMPARE_AND_WAIT64_SHARED 6
+
+/*
+ * operation bits [15, 8] contain the flags for __ulock_wake
+ */
+#define ULF_WAKE_ALL 0x00000100
+#define ULF_WAKE_THREAD 0x00000200
+#define ULF_WAKE_ALLOW_NON_OWNER 0x00000400
+
+/*
+ * operation bits [15, 8] contain the flags for __ulock_wake
+ */
+#define ULF_WAKE_ALL 0x00000100
+#define ULF_WAKE_THREAD 0x00000200
+#define ULF_WAKE_ALLOW_NON_OWNER 0x00000400
+
+/*
+ * operation bits [31, 24] contain the generic flags
+ */
+#define ULF_NO_ERRNO 0x01000000
+
+// -------- END OS Declarations --------
+} // extern "C"
+
+QT_BEGIN_NAMESPACE
+
+namespace QtDarwinFutex {
+
+/*not constexpr*/ inline bool futexAvailable() { return __ulock_wake && __ulock_wait2; }
+
+template <typename Atomic>
+inline uint32_t baseOperation(Atomic &)
+{
+ static_assert(sizeof(Atomic) >= sizeof(quint32), "Can only operate on 32- or 64-bit atomics");
+
+ uint32_t operation = ULF_NO_ERRNO;
+ if (sizeof(Atomic) == sizeof(quint32))
+ operation |= UL_COMPARE_AND_WAIT;
+ else
+ operation |= UL_COMPARE_AND_WAIT64;
+ return operation;
+}
+
+template <typename Atomic> inline int
+do_wait(Atomic &futex, typename Atomic::Type expectedValue, QDeadlineTimer timer)
+{
+ // source code inspection shows __ulock_wait2 uses nanoseconds for timeout
+ QtTsan::futexRelease(&futex);
+ int ret = __ulock_wait2(baseOperation(futex), &futex, uint64_t(expectedValue),
+ timer.remainingTimeNSecs(), 0);
+ QtTsan::futexAcquire(&futex);
+ return ret;
+}
+
+template <typename Atomic>
+inline void futexWait(Atomic &futex, typename Atomic::Type expectedValue)
+{
+ do_wait(futex, expectedValue, {});
+}
+
+template <typename Atomic>
+inline bool futexWait(Atomic &futex, typename Atomic::Type expectedValue, QDeadlineTimer timer)
+{
+ int r = do_wait(futex, expectedValue, timer);
+ return r == 0 || r != -ETIMEDOUT;
+}
+
+template <typename Atomic> inline void futexWakeAll(Atomic &futex)
+{
+ __ulock_wake(baseOperation(futex) | ULF_WAKE_ALL, &futex, 0);
+}
+
+template <typename Atomic> inline void futexWakeOne(Atomic &futex)
+{
+ __ulock_wake(baseOperation(futex), &futex, 0);
+}
+} //namespace QtDarwinMutex
+
+namespace QtFutex = QtDarwinFutex;
+
+QT_END_NAMESPACE
+
+#endif // QT_CONFIG(appstore_compliant)
+
+#endif // QFUTEX_MAC_P_H
diff --git a/src/corelib/thread/qfutex_p.h b/src/corelib/thread/qfutex_p.h
index 037207a5c0..8ba798f920 100644
--- a/src/corelib/thread/qfutex_p.h
+++ b/src/corelib/thread/qfutex_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2017 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2017 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QFUTEX_P_H
#define QFUTEX_P_H
@@ -51,37 +15,16 @@
// We mean it.
//
-#include <qglobal.h>
-
-#if (__has_feature(thread_sanitizer) || defined(__SANITIZE_THREAD__)) && __has_include(<sanitizer/tsan_interface.h>)
-# include <sanitizer/tsan_interface.h>
-inline void _q_tsan_acquire(void *addr, void *addr2 = nullptr)
-{
- // A futex call ensures total ordering on the futex words
- // (in either success or failure of the call). Instruct TSAN accordingly,
- // as TSAN does not understand the futex(2) syscall (or equivalent).
- __tsan_acquire(addr);
- if (addr2)
- __tsan_acquire(addr2);
-}
-inline void _q_tsan_release(void *addr, void *addr2 = nullptr)
-{
- if (addr2)
- __tsan_release(addr2);
- __tsan_release(addr);
-}
-#else
-inline void _q_tsan_acquire(void *, void * = nullptr) {}
-inline void _q_tsan_release(void *, void * = nullptr) {}
-#endif // building for TSAN and __has_include(<sanitizer/tsan_interface.h>)
+#include <qdeadlinetimer.h>
+#include <private/qglobal_p.h>
QT_BEGIN_NAMESPACE
namespace QtDummyFutex {
constexpr inline bool futexAvailable() { return false; }
template <typename Atomic>
- inline bool futexWait(Atomic &, typename Atomic::Type, int = 0)
- { Q_UNREACHABLE(); return false; }
+ inline bool futexWait(Atomic &, typename Atomic::Type, QDeadlineTimer = {})
+ { Q_UNREACHABLE_RETURN(false); }
template <typename Atomic> inline void futexWakeOne(Atomic &)
{ Q_UNREACHABLE(); }
template <typename Atomic> inline void futexWakeAll(Atomic &)
@@ -90,115 +33,16 @@ namespace QtDummyFutex {
QT_END_NAMESPACE
-#if defined(Q_OS_LINUX) && !defined(QT_LINUXBASE)
+#if defined(Q_OS_DARWIN)
+# include "qfutex_mac_p.h"
+#elif defined(Q_OS_FREEBSD)
+# include "qfutex_freebsd_p.h"
+#elif defined(Q_OS_LINUX) && !defined(QT_LINUXBASE)
// use Linux mutexes everywhere except for LSB builds
-# include <sys/syscall.h>
-# include <errno.h>
-# include <limits.h>
-# include <unistd.h>
-# include <asm/unistd.h>
-# include <linux/futex.h>
-# define QT_ALWAYS_USE_FUTEX
-
-// if not defined in linux/futex.h
-# define FUTEX_PRIVATE_FLAG 128 // added in v2.6.22
-
-// RISC-V does not supply __NR_futex
-# ifndef __NR_futex
-# define __NR_futex __NR_futex_time64
-# endif
-
-QT_BEGIN_NAMESPACE
-namespace QtLinuxFutex {
- constexpr inline bool futexAvailable() { return true; }
- inline int _q_futex(int *addr, int op, int val, quintptr val2 = 0,
- int *addr2 = nullptr, int val3 = 0) noexcept
- {
- _q_tsan_release(addr, addr2);
-
- // we use __NR_futex because some libcs (like Android's bionic) don't
- // provide SYS_futex etc.
- int result = syscall(__NR_futex, addr, op | FUTEX_PRIVATE_FLAG, val, val2, addr2, val3);
-
- _q_tsan_acquire(addr, addr2);
-
- return result;
- }
- template <typename T> int *addr(T *ptr)
- {
- int *int_addr = reinterpret_cast<int *>(ptr);
-#if Q_BYTE_ORDER == Q_BIG_ENDIAN
- if (sizeof(T) > sizeof(int))
- int_addr++; //We want a pointer to the least significant half
-#endif
- return int_addr;
- }
-
- template <typename Atomic>
- inline void futexWait(Atomic &futex, typename Atomic::Type expectedValue)
- {
- _q_futex(addr(&futex), FUTEX_WAIT, qintptr(expectedValue));
- }
- template <typename Atomic>
- inline bool futexWait(Atomic &futex, typename Atomic::Type expectedValue, qint64 nstimeout)
- {
- struct timespec ts;
- ts.tv_sec = nstimeout / 1000 / 1000 / 1000;
- ts.tv_nsec = nstimeout % (1000 * 1000 * 1000);
- int r = _q_futex(addr(&futex), FUTEX_WAIT, qintptr(expectedValue), quintptr(&ts));
- return r == 0 || errno != ETIMEDOUT;
- }
- template <typename Atomic> inline void futexWakeOne(Atomic &futex)
- {
- _q_futex(addr(&futex), FUTEX_WAKE, 1);
- }
- template <typename Atomic> inline void futexWakeAll(Atomic &futex)
- {
- _q_futex(addr(&futex), FUTEX_WAKE, INT_MAX);
- }
- template <typename Atomic> inline
- void futexWakeOp(Atomic &futex1, int wake1, int wake2, Atomic &futex2, quint32 op)
- {
- _q_futex(addr(&futex1), FUTEX_WAKE_OP, wake1, wake2, addr(&futex2), op);
- }
-}
-namespace QtFutex = QtLinuxFutex;
-QT_END_NAMESPACE
-
+# include "qfutex_linux_p.h"
#elif defined(Q_OS_WIN)
-# include <qt_windows.h>
-
-QT_BEGIN_NAMESPACE
-namespace QtWindowsFutex {
-#define QT_ALWAYS_USE_FUTEX
-constexpr inline bool futexAvailable() { return true; }
-
-template <typename Atomic>
-inline void futexWait(Atomic &futex, typename Atomic::Type expectedValue)
-{
- _q_tsan_release(&futex);
- WaitOnAddress(&futex, &expectedValue, sizeof(expectedValue), INFINITE);
- _q_tsan_acquire(&futex);
-}
-template <typename Atomic>
-inline bool futexWait(Atomic &futex, typename Atomic::Type expectedValue, qint64 nstimeout)
-{
- BOOL r = WaitOnAddress(&futex, &expectedValue, sizeof(expectedValue), DWORD(nstimeout / 1000 / 1000));
- return r || GetLastError() != ERROR_TIMEOUT;
-}
-template <typename Atomic> inline void futexWakeAll(Atomic &futex)
-{
- WakeByAddressAll(&futex);
-}
-template <typename Atomic> inline void futexWakeOne(Atomic &futex)
-{
- WakeByAddressSingle(&futex);
-}
-}
-namespace QtFutex = QtWindowsFutex;
-QT_END_NAMESPACE
+# include "qfutex_win_p.h"
#else
-
QT_BEGIN_NAMESPACE
namespace QtFutex = QtDummyFutex;
QT_END_NAMESPACE
diff --git a/src/corelib/thread/qfutex_win_p.h b/src/corelib/thread/qfutex_win_p.h
new file mode 100644
index 0000000000..75a12bd82c
--- /dev/null
+++ b/src/corelib/thread/qfutex_win_p.h
@@ -0,0 +1,58 @@
+// Copyright (C) 2023 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QFUTEX_WIN_P_H
+#define QFUTEX_WIN_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <private/qglobal_p.h>
+#include <qdeadlinetimer.h>
+#include <qtsan_impl.h>
+
+#include <qt_windows.h>
+
+#define QT_ALWAYS_USE_FUTEX
+
+QT_BEGIN_NAMESPACE
+
+namespace QtWindowsFutex {
+constexpr inline bool futexAvailable() { return true; }
+
+template <typename Atomic>
+inline void futexWait(Atomic &futex, typename Atomic::Type expectedValue)
+{
+ QtTsan::futexRelease(&futex);
+ WaitOnAddress(&futex, &expectedValue, sizeof(expectedValue), INFINITE);
+ QtTsan::futexAcquire(&futex);
+}
+template <typename Atomic>
+inline bool futexWait(Atomic &futex, typename Atomic::Type expectedValue, QDeadlineTimer deadline)
+{
+ using namespace std::chrono;
+ BOOL r = WaitOnAddress(&futex, &expectedValue, sizeof(expectedValue), DWORD(deadline.remainingTime()));
+ return r || GetLastError() != ERROR_TIMEOUT;
+}
+template <typename Atomic> inline void futexWakeAll(Atomic &futex)
+{
+ WakeByAddressAll(&futex);
+}
+template <typename Atomic> inline void futexWakeOne(Atomic &futex)
+{
+ WakeByAddressSingle(&futex);
+}
+} // namespace QtWindowsFutex
+namespace QtFutex = QtWindowsFutex;
+
+QT_END_NAMESPACE
+
+#endif // QFUTEX_WIN_P_H
diff --git a/src/corelib/thread/qfuture.h b/src/corelib/thread/qfuture.h
index 7aed38be16..5939a93780 100644
--- a/src/corelib/thread/qfuture.h
+++ b/src/corelib/thread/qfuture.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QFUTURE_H
#define QFUTURE_H
@@ -91,7 +55,7 @@ public:
return *this;
}
-#if defined(Q_CLANG_QDOC)
+#if defined(Q_QDOC)
~QFuture() { }
QFuture(const QFuture<T> &) { }
QFuture<T> & operator=(const QFuture<T> &) { }
@@ -191,6 +155,14 @@ QT_WARNING_POP
template<class Function, typename = std::enable_if_t<std::is_invocable_r_v<T, Function>>>
QFuture<T> onCanceled(QObject *context, Function &&handler);
+#if !defined(Q_QDOC)
+ template<class U = T, typename = std::enable_if_t<QtPrivate::isQFutureV<U>>>
+ auto unwrap();
+#else
+ template<class U>
+ QFuture<U> unwrap();
+#endif
+
class const_iterator
{
public:
@@ -317,6 +289,8 @@ private:
template<typename ResultType>
friend struct QtPrivate::WhenAnyContext;
+ friend struct QtPrivate::UnwrapHandler;
+
using QFuturePrivate =
std::conditional_t<std::is_same_v<T, void>, QFutureInterfaceBase, QFutureInterface<T>>;
@@ -431,6 +405,16 @@ QFuture<T> QFuture<T>::onCanceled(QObject *context, Function &&handler)
return promise.future();
}
+template<class T>
+template<class U, typename>
+auto QFuture<T>::unwrap()
+{
+ if constexpr (QtPrivate::isQFutureV<typename QtPrivate::Future<T>::type>)
+ return QtPrivate::UnwrapHandler::unwrapImpl(this).unwrap();
+ else
+ return QtPrivate::UnwrapHandler::unwrapImpl(this);
+}
+
inline QFuture<void> QFutureInterface<void>::future()
{
return QFuture<void>(this);
@@ -461,7 +445,7 @@ struct MetaTypeQFutureHelper<QFuture<T>>
namespace QtFuture {
-#ifndef Q_CLANG_QDOC
+#ifndef Q_QDOC
template<typename OutputSequence, typename InputIt,
typename ValueType = typename std::iterator_traits<InputIt>::value_type,
@@ -536,7 +520,20 @@ QFuture<QtFuture::WhenAnyResult<T>> whenAny(InputIt first, InputIt last);
template<typename... Futures>
QFuture<std::variant<std::decay_t<Futures>...>> whenAny(Futures &&... futures);
-#endif // Q_CLANG_QDOC
+#endif // Q_QDOC
+
+#if QT_DEPRECATED_SINCE(6, 10)
+#if defined(Q_QDOC)
+static QFuture<void> makeReadyFuture()
+#else
+template<typename T = void>
+QT_DEPRECATED_VERSION_X(6, 10, "Use makeReadyVoidFuture() instead.")
+static QFuture<T> makeReadyFuture()
+#endif
+{
+ return makeReadyVoidFuture();
+}
+#endif // QT_DEPRECATED_SINCE(6, 10)
} // namespace QtFuture
diff --git a/src/corelib/thread/qfuture.qdoc b/src/corelib/thread/qfuture.qdoc
index d52db1c481..9eda766968 100644
--- a/src/corelib/thread/qfuture.qdoc
+++ b/src/corelib/thread/qfuture.qdoc
@@ -1,29 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*! \class QFuture
\inmodule QtCore
@@ -99,6 +75,15 @@
If \c testFuture gets canceled, its state is propagated to the next then(),
which will be also canceled. So in this case \c {Block 6} will be called.
+ The future can have only one continuation. Consider the following example:
+
+ \snippet code/src_corelib_thread_qfuture.cpp 31
+
+ In this case \c f1 and \c f2 are effectively the same QFuture object, as
+ they share the same internal state. As a result, calling
+ \l {QFuture::}{then} on \c f2 will overwrite the continuation specified for
+ \c {f1}. So, only \c {"second"} will be printed when this code is executed.
+
QFuture also offers ways to interact with a running computation. For
instance, the computation can be canceled with the cancel() function. To
suspend or resume the computation, use the setSuspended() function or one of
@@ -133,13 +118,21 @@
combine several futures and track when the last or first of them completes.
A ready QFuture object with a value or a QFuture object holding exception can
- be created using convenience functions QtFuture::makeReadyFuture() and
+ be created using convenience functions QtFuture::makeReadyVoidFuture(),
+ QtFuture::makeReadyValueFuture(), QtFuture::makeReadyRangeFuture(), and
QtFuture::makeExceptionalFuture().
+ \note Some APIs (see \l {QFuture::then()} or various QtConcurrent method
+ overloads) allow scheduling the computation to a specific thread pool.
+ However, QFuture implements a work-stealing algorithm to prevent deadlocks
+ and optimize thread usage. As a result, computations can be executed
+ directly in the thread which requests the QFuture's result.
+
\note To start a computation and store results in a QFuture, use QPromise or
one of the APIs in the \l {Qt Concurrent} framework.
- \sa QPromise, QtFuture::connect(), QtFuture::makeReadyFuture(),
+ \sa QPromise, QtFuture::connect(), QtFuture::makeReadyVoidFuture(),
+ QtFuture::makeReadyValueFuture(), QtFuture::makeReadyRangeFuture(),
QtFuture::makeExceptionalFuture(), QFutureWatcher, {Qt Concurrent}
*/
@@ -397,7 +390,7 @@
computations), i.e. until isFinished() returns \c true.
*/
-/*! \fn template <typename T> T QFuture<T>::result() const
+/*! \fn template <typename T> template<typename U = T, typename = QtPrivate::EnableForNonVoid<U>> T QFuture<T>::result() const
Returns the first result in the future. If the result is not immediately
available, this function will block and wait for the result to become
@@ -412,7 +405,7 @@
\sa resultAt(), results(), takeResult()
*/
-/*! \fn template <typename T> T QFuture<T>::resultAt(int index) const
+/*! \fn template <typename T> template<typename U = T, typename = QtPrivate::EnableForNonVoid<U>> T QFuture<T>::resultAt(int index) const
Returns the result at \a index in the future. If the result is not
immediately available, this function will block and wait for the result to
@@ -424,7 +417,7 @@
\sa result(), results(), takeResult(), resultCount()
*/
-/*! \fn template <typename T> bool QFuture<T>::isResultReadyAt(int index) const
+/*! \fn template <typename T> template<typename U = T, typename = QtPrivate::EnableForNonVoid<U>> bool QFuture<T>::isResultReadyAt(int index) const
Returns \c true if the result at \a index is immediately available; otherwise
returns \c false.
@@ -435,7 +428,7 @@
\sa resultAt(), resultCount(), takeResult()
*/
-/*! \fn template <typename T> QList<T> QFuture<T>::results() const
+/*! \fn template <typename T> template<typename U = T, typename = QtPrivate::EnableForNonVoid<U>> QList<T> QFuture<T>::results() const
Returns all results from the future. If the results are not immediately available,
this function will block and wait for them to become available. Note that
@@ -451,7 +444,7 @@
*/
#if 0
-/*! \fn template <typename T> std::vector<T> QFuture<T>::takeResults()
+/*! \fn template <typename T> template<typename U = T, typename = QtPrivate::EnableForNonVoid<U>> std::vector<T> QFuture<T>::takeResults()
If isValid() returns \c false, calling this function leads to undefined behavior.
takeResults() takes all results from the QFuture object and invalidates it
@@ -470,7 +463,7 @@
*/
#endif
-/*! \fn template <typename T> std::vector<T> QFuture<T>::takeResult()
+/*! \fn template <typename T> template<typename U = T, typename = QtPrivate::EnableForNonVoid<U>> std::vector<T> QFuture<T>::takeResult()
\since 6.0
@@ -505,7 +498,7 @@
\sa takeResult(), result(), results(), resultAt()
*/
-/*! \fn template <typename T> QFuture<T>::const_iterator QFuture<T>::begin() const
+/*! \fn template<typename T> template<class U = T, typename = QtPrivate::EnableForNonVoid<U>> QFuture<T>::const_iterator QFuture<T>::begin() const
Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the first result in the
future.
@@ -513,7 +506,7 @@
\sa constBegin(), end()
*/
-/*! \fn template <typename T> QFuture<T>::const_iterator QFuture<T>::end() const
+/*! \fn template<typename T> template<class U = T, typename = QtPrivate::EnableForNonVoid<U>> QFuture<T>::const_iterator QFuture<T>::end() const
Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the imaginary result
after the last result in the future.
@@ -521,7 +514,7 @@
\sa begin(), constEnd()
*/
-/*! \fn template <typename T> QFuture<T>::const_iterator QFuture<T>::constBegin() const
+/*! \fn template<typename T> template<class U = T, typename = QtPrivate::EnableForNonVoid<U>> QFuture<T>::const_iterator QFuture<T>::constBegin() const
Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the first result in the
future.
@@ -529,7 +522,7 @@
\sa begin(), constEnd()
*/
-/*! \fn template <typename T> QFuture<T>::const_iterator QFuture<T>::constEnd() const
+/*! \fn template<typename T> template<class U = T, typename = QtPrivate::EnableForNonVoid<U>> QFuture<T>::const_iterator QFuture<T>::constEnd() const
Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the imaginary result
after the last result in the future.
@@ -638,7 +631,7 @@
/*! \fn template <typename T> QFuture<T>::const_iterator &QFuture<T>::const_iterator::operator++()
- The prefix ++ operator (\c{++it}) advances the iterator to the next result
+ The prefix \c{++} operator (\c{++it}) advances the iterator to the next result
in the future and returns an iterator to the new current result.
Calling this function on QFuture<T>::constEnd() leads to undefined results.
@@ -650,14 +643,14 @@
\overload
- The postfix ++ operator (\c{it++}) advances the iterator to the next
+ The postfix \c{++} operator (\c{it++}) advances the iterator to the next
result in the future and returns an iterator to the previously current
result.
*/
/*! \fn template <typename T> QFuture<T>::const_iterator &QFuture<T>::const_iterator::operator--()
- The prefix -- operator (\c{--it}) makes the preceding result current and
+ The prefix \c{--} operator (\c{--it}) makes the preceding result current and
returns an iterator to the new current result.
Calling this function on QFuture<T>::constBegin() leads to undefined results.
@@ -669,7 +662,7 @@
\overload
- The postfix -- operator (\c{it--}) makes the preceding result current and
+ The postfix \c{--} operator (\c{it--}) makes the preceding result current and
returns an iterator to the previously current result.
*/
@@ -943,7 +936,7 @@
\sa QtFuture::whenAny()
*/
-/*! \fn template<class Sender, class Signal> static QFuture<ArgsType<Signal>> QtFuture::connect(Sender *sender, Signal signal)
+/*! \fn template<class Sender, class Signal, typename = QtPrivate::EnableIfInvocable<Sender, Signal>> static QFuture<ArgsType<Signal>> QtFuture::connect(Sender *sender, Signal signal)
Creates and returns a QFuture which will become available when the \a sender emits
the \a signal. If the \a signal takes no arguments, a QFuture<void> is returned. If
@@ -982,10 +975,11 @@
\sa QFuture, QFuture::then()
*/
-/*! \fn template<typename T> static QFuture<std::decay_t<T>> QtFuture::makeReadyFuture(T &&value)
+/*! \fn template<typename T, typename = QtPrivate::EnableForNonVoid<T>> static QFuture<std::decay_t<T>> QtFuture::makeReadyFuture(T &&value)
\since 6.1
\overload
+ \deprecated [6.6] Use makeReadyValueFuture() instead.
Creates and returns a QFuture which already has a result \a value.
The returned QFuture has a type of std::decay_t<T>, where T is not void.
@@ -996,13 +990,20 @@
const int result = *f.takeResult(); // result == 42
\endcode
- \sa QFuture, QtFuture::makeExceptionalFuture()
+ The method should be avoided because
+ it has an inconsistent set of overloads. From Qt 6.10 onwards, using it
+ in code will result in compiler warnings.
+
+ \sa QFuture, QtFuture::makeReadyVoidFuture(),
+ QtFuture::makeReadyValueFuture(), QtFuture::makeReadyRangeFuture(),
+ QtFuture::makeExceptionalFuture()
*/
/*! \fn QFuture<void> QtFuture::makeReadyFuture()
\since 6.1
\overload
+ \deprecated [6.6] Use makeReadyVoidFuture() instead.
Creates and returns a void QFuture. Such QFuture can't store any result.
One can use it to query the state of the computation.
@@ -1016,14 +1017,21 @@
const bool finished = f.isFinished(); // finished == true
\endcode
+ The method should be avoided because
+ it has an inconsistent set of overloads. From Qt 6.10 onwards, using it
+ in code will result in compiler warnings.
+
\sa QFuture, QFuture::isStarted(), QFuture::isRunning(),
- QFuture::isFinished(), QtFuture::makeExceptionalFuture()
+ QFuture::isFinished(), QtFuture::makeReadyVoidFuture(),
+ QtFuture::makeReadyValueFuture(), QtFuture::makeReadyRangeFuture(),
+ QtFuture::makeExceptionalFuture()
*/
/*! \fn template<typename T> static QFuture<T> QtFuture::makeReadyFuture(const QList<T> &values)
\since 6.1
\overload
+ \deprecated [6.6] Use makeReadyRangeFuture() instead.
Creates and returns a QFuture which already has multiple results set from \a values.
@@ -1035,7 +1043,42 @@
const auto results = f.results(); // results == { 1, 2, 3 }
\endcode
- \sa QFuture, QtFuture::makeExceptionalFuture()
+ The method should be avoided because
+ it has an inconsistent set of overloads. From Qt 6.10 onwards, using it
+ in code will result in compiler warnings.
+
+ \sa QFuture, QtFuture::makeReadyVoidFuture(),
+ QtFuture::makeReadyValueFuture(), QtFuture::makeReadyRangeFuture(),
+ QtFuture::makeExceptionalFuture()
+*/
+
+/*! \fn template<typename T> static QFuture<std::decay_t<T>> QtFuture::makeReadyValueFuture(T &&value)
+
+ \since 6.6
+
+ Creates and returns a QFuture which already has a result \a value.
+ The returned QFuture has a type of std::decay_t<T>, where T is not void.
+ The returned QFuture will already be in the finished state.
+
+ \snippet code/src_corelib_thread_qfuture.cpp 35
+
+ \sa QFuture, QtFuture::makeReadyRangeFuture(),
+ QtFuture::makeReadyVoidFuture(), QtFuture::makeExceptionalFuture()
+*/
+
+/*! \fn QFuture<void> QtFuture::makeReadyVoidFuture()
+
+ \since 6.6
+
+ Creates and returns a void QFuture. Such QFuture can't store any result.
+ One can use it to query the state of the computation.
+ The returned QFuture will already be in the finished state.
+
+ \snippet code/src_corelib_thread_qfuture.cpp 36
+
+ \sa QFuture, QFuture::isStarted(), QFuture::isRunning(),
+ QFuture::isFinished(), QtFuture::makeReadyValueFuture(),
+ QtFuture::makeReadyRangeFuture(), QtFuture::makeExceptionalFuture()
*/
/*! \fn template<typename T> static QFuture<T> QtFuture::makeExceptionalFuture(const QException &exception)
@@ -1055,7 +1098,8 @@
}
\endcode
- \sa QFuture, QException, QtFuture::makeReadyFuture()
+ \sa QFuture, QException, QtFuture::makeReadyVoidFuture(),
+ QtFuture::makeReadyValueFuture()
*/
/*! \fn template<typename T> static QFuture<T> QtFuture::makeExceptionalFuture(std::exception_ptr exception)
@@ -1080,7 +1124,44 @@
}
\endcode
- \sa QFuture, QException, QtFuture::makeReadyFuture()
+ \sa QFuture, QException, QtFuture::makeReadyVoidFuture(),
+ QtFuture::makeReadyValueFuture()
+*/
+
+/*! \fn template<typename Container, QtFuture::if_container_with_input_iterators<Container>> static QFuture<QtFuture::ContainedType<Container>> QtFuture::makeReadyRangeFuture(Container &&container)
+
+ \since 6.6
+ \overload
+
+ Takes an input container \a container and returns a QFuture with multiple
+ results of type \c ContainedType initialized from the values of the
+ \a container.
+
+ \note This overload only participates in overload resolution if the
+ \c Container has input iterators.
+
+ \snippet code/src_corelib_thread_qfuture.cpp 32
+ \dots
+ \snippet code/src_corelib_thread_qfuture.cpp 34
+
+ \sa QFuture, QtFuture::makeReadyVoidFuture(),
+ QtFuture::makeReadyValueFuture(), QtFuture::makeExceptionalFuture()
+*/
+
+/*! \fn template<typename ValueType> static QFuture<ValueType> QtFuture::makeReadyRangeFuture(std::initializer_list<ValueType> values)
+
+ \since 6.6
+ \overload
+
+ Returns a QFuture with multiple results of type \c ValueType initialized
+ from the input initializer list \a values.
+
+ \snippet code/src_corelib_thread_qfuture.cpp 33
+ \dots
+ \snippet code/src_corelib_thread_qfuture.cpp 34
+
+ \sa QFuture, QtFuture::makeReadyVoidFuture(),
+ QtFuture::makeReadyValueFuture(), QtFuture::makeExceptionalFuture()
*/
/*! \fn template<class T> template<class Function> QFuture<typename QFuture<T>::ResultType<Function>> QFuture<T>::then(Function &&function)
@@ -1179,8 +1260,7 @@
Attaches a continuation to this future, allowing to chain multiple asynchronous
computations if desired. When the asynchronous computation represented by this
- future finishes, \a function will be invoked in a separate thread taken from the
- QThreadPool \a pool.
+ future finishes, \a function will be scheduled on \a pool.
\sa onFailed(), onCanceled()
*/
@@ -1220,13 +1300,23 @@
is attached. In this case it will be resolved in the current thread. Therefore, when
in doubt, pass the context explicitly.
+ \target context_lifetime
+ If the \a context is destroyed before the chain has finished, the future is canceled.
+ This implies that a cancellation handler might be invoked when the \a context is not valid
+ anymore. To guard against this, capture the \a context as a QPointer:
+
+ \snippet code/src_corelib_thread_qfuture.cpp 37
+
+ When the context object is destroyed, cancellation happens immediately. Previous futures in the
+ chain are \e {not} cancelled and keep running until they are finished.
+
\note When calling this method, it should be guaranteed that the \a context stays alive
- throughout the execution of the chain.
+ during setup of the chain.
\sa onFailed(), onCanceled()
*/
-/*! \fn template<class T> template<class Function> QFuture<T> QFuture<T>::onFailed(Function &&handler)
+/*! \fn template<class T> template<class Function, typename = std::enable_if_t<!QtPrivate::ArgResolver<Function>::HasExtraArgs>> QFuture<T> QFuture<T>::onFailed(Function &&handler)
\since 6.0
@@ -1269,7 +1359,7 @@
\sa then(), onCanceled()
*/
-/*! \fn template<class T> template<class Function> QFuture<T> QFuture<T>::onFailed(QObject *context, Function &&handler)
+/*! \fn template<class T> template<class Function, typename = std::enable_if_t<!QtPrivate::ArgResolver<Function>::HasExtraArgs>> QFuture<T> QFuture<T>::onFailed(QObject *context, Function &&handler)
\since 6.1
\overload
@@ -1286,15 +1376,18 @@
be invoked from a non-gui thread. So \c this is provided as a context to \c .onFailed(),
to make sure that it will be invoked in the main thread.
+ If the \a context is destroyed before the chain has finished, the future is canceled.
+ See \l {context_lifetime}{then()} for details.
+
\note When calling this method, it should be guaranteed that the \a context stays alive
- throughout the execution of the chain.
+ during setup of the chain.
See the documentation of the other overload for more details about \a handler.
\sa then(), onCanceled()
*/
-/*! \fn template<class T> template<class Function> QFuture<T> QFuture<T>::onCanceled(Function &&handler)
+/*! \fn template<class T> template<class Function, typename = std::enable_if_t<std::is_invocable_r_v<T, Function>>> QFuture<T> QFuture<T>::onCanceled(Function &&handler)
\since 6.0
@@ -1339,7 +1432,7 @@
\sa then(), onFailed()
*/
-/*! \fn template<class T> template<class Function> QFuture<T> QFuture<T>::onCanceled(QObject *context, Function &&handler)
+/*! \fn template<class T> template<class Function, typename = std::enable_if_t<std::is_invocable_r_v<T, Function>>> QFuture<T> QFuture<T>::onCanceled(QObject *context, Function &&handler)
\since 6.1
\overload
@@ -1349,14 +1442,52 @@
invoked in the thread of the \a context object. This can be useful if the cancellation
needs to be handled in a specific thread.
+ If the \a context is destroyed before the chain has finished, the future is canceled.
+ See \l {context_lifetime}{then()} for details.
+
\note When calling this method, it should be guaranteed that the \a context stays alive
- throughout the execution of the chain.
+ during setup of the chain.
See the documentation of the other overload for more details about \a handler.
\sa then(), onFailed()
*/
+/*! \fn template<class T> template<class U> QFuture<U> QFuture<T>::unwrap()
+
+ \since 6.4
+
+ Unwraps the inner future from this \c QFuture<T>, where \c T is a future
+ of type \c QFuture<U>, i.e. this future has type of \c QFuture<QFuture<U>>.
+ For example:
+
+ \snippet code/src_corelib_thread_qfuture.cpp 28
+
+ \c unwrappedFuture will be fulfilled as soon as the inner future nested
+ inside the \c outerFuture is fulfilled, with the same result or exception
+ and in the same thread that reports the inner future as finished. If the
+ inner future is canceled, \c unwrappedFuture will also be canceled.
+
+ This is especially useful when chaining multiple computations, and one of
+ them returns a \c QFuture as its result type. For example, let's say we
+ want to download multiple images from an URL, scale the images, and reduce
+ them to a single image using QtConcurrent::mappedReduced(). We could write
+ something like:
+
+ \snippet code/src_corelib_thread_qfuture.cpp 29
+
+ Here \c QtConcurrent::mappedReduced() returns a \c QFuture<QImage>, so
+ \c .then(processImages) returns a \c QFuture<QFuture<QImage>>. Since
+ \c show() takes a \c QImage as argument, the result of \c .then(processImages)
+ can't be passed to it directly. We need to call \c .unwrap(), that will
+ get the result of the inner future when it's ready and pass it to the next
+ continuation.
+
+ In case of multiple nesting, \c .unwrap() goes down to the innermost level:
+
+ \snippet code/src_corelib_thread_qfuture.cpp 30
+*/
+
/*! \fn template<typename OutputSequence, typename InputIt> QFuture<OutputSequence> QtFuture::whenAll(InputIt first, InputIt last)
\since 6.3
diff --git a/src/corelib/thread/qfuture_impl.h b/src/corelib/thread/qfuture_impl.h
index 136892ddaf..79fc6d9a01 100644
--- a/src/corelib/thread/qfuture_impl.h
+++ b/src/corelib/thread/qfuture_impl.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QFUTURE_H
#error Do not include qfuture_impl.h directly
@@ -50,7 +14,9 @@
#include <QtCore/qfutureinterface.h>
#include <QtCore/qthreadpool.h>
#include <QtCore/qexception.h>
-#include <QtCore/qpointer.h>
+#include <QtCore/qpromise.h>
+
+#include <memory>
QT_BEGIN_NAMESPACE
@@ -82,10 +48,6 @@ WhenAnyResult(qsizetype, const QFuture<T> &) -> WhenAnyResult<T>;
namespace QtPrivate {
-template<class T, class U>
-using EnableIfSameOrConvertible = std::enable_if_t<std::is_same_v<T, U>
- || std::is_convertible_v<T, U>>;
-
template<class T>
using EnableForVoid = std::enable_if_t<std::is_same_v<T, void>>;
@@ -129,7 +91,48 @@ struct ResultTypeHelper<
using ResultType = std::invoke_result_t<std::decay_t<F>>;
};
+// Helpers to remove QPrivateSignal argument from the list of arguments
+
+template<class T, class Enable = void>
+inline constexpr bool IsPrivateSignalArg = false;
+
+template<class T>
+inline constexpr bool IsPrivateSignalArg<T, typename std::enable_if_t<
+ // finds injected-class-name, the 'class' avoids falling into the rules of [class.qual]/2:
+ std::is_class_v<class T::QPrivateSignal>
+ >> = true;
+
+template<class Tuple, std::size_t... I>
+auto cutTuple(Tuple &&t, std::index_sequence<I...>)
+{
+ return std::make_tuple(std::get<I>(t)...);
+}
+
+template<class Arg, class... Args>
+auto createTuple(Arg &&arg, Args &&... args)
+{
+ using TupleType = std::tuple<std::decay_t<Arg>, std::decay_t<Args>...>;
+ constexpr auto Size = sizeof...(Args); // One less than the size of all arguments
+ if constexpr (QtPrivate::IsPrivateSignalArg<std::tuple_element_t<Size, TupleType>>) {
+ if constexpr (Size == 1) {
+ return std::forward<Arg>(arg);
+ } else {
+ return cutTuple(std::make_tuple(std::forward<Arg>(arg), std::forward<Args>(args)...),
+ std::make_index_sequence<Size>());
+ }
+ } else {
+ return std::make_tuple(std::forward<Arg>(arg), std::forward<Args>(args)...);
+ }
+}
+
// Helpers to resolve argument types of callables.
+
+template<class Arg, class... Args>
+using FilterLastPrivateSignalArg =
+ std::conditional_t<(sizeof...(Args) > 0),
+ std::invoke_result_t<decltype(createTuple<Arg, Args...>), Arg, Args...>,
+ std::conditional_t<IsPrivateSignalArg<Arg>, void, Arg>>;
+
template<typename...>
struct ArgsType;
@@ -140,9 +143,7 @@ struct ArgsType<Arg, Args...>
using PromiseType = void;
using IsPromise = std::false_type;
static const bool HasExtraArgs = (sizeof...(Args) > 0);
- using AllArgs =
- std::conditional_t<HasExtraArgs, std::tuple<std::decay_t<Arg>, std::decay_t<Args>...>,
- std::decay_t<Arg>>;
+ using AllArgs = FilterLastPrivateSignalArg<std::decay_t<Arg>, std::decay_t<Args>...>;
template<class Class, class Callable>
static const bool CanInvokeWithArgs = std::is_invocable_v<Callable, Class, Arg, Args...>;
@@ -155,9 +156,7 @@ struct ArgsType<QPromise<Arg> &, Args...>
using PromiseType = Arg;
using IsPromise = std::true_type;
static const bool HasExtraArgs = (sizeof...(Args) > 0);
- using AllArgs =
- std::conditional_t<HasExtraArgs, std::tuple<std::decay_t<QPromise<Arg> &>, std::decay_t<Args>...>,
- std::decay_t<QPromise<Arg> &>>;
+ using AllArgs = FilterLastPrivateSignalArg<QPromise<Arg>, std::decay_t<Args>...>;
template<class Class, class Callable>
static const bool CanInvokeWithArgs = std::is_invocable_v<Callable, Class, QPromise<Arg> &, Args...>;
@@ -245,17 +244,6 @@ template<class Class, class Callable>
using EnableIfInvocable = std::enable_if_t<
QtPrivate::ArgResolver<Callable>::template CanInvokeWithArgs<Class, Callable>>;
-template<class>
-struct isTuple : std::false_type
-{
-};
-template<class... T>
-struct isTuple<std::tuple<T...>> : std::true_type
-{
-};
-template<class T>
-inline constexpr bool isTupleV = isTuple<T>::value;
-
template<class T>
inline constexpr bool isQFutureV = false;
@@ -285,6 +273,12 @@ using IsRandomAccessible =
std::begin(std::declval<Sequence>()))>>::iterator_category,
std::random_access_iterator_tag>;
+template<class Sequence>
+using HasInputIterator =
+ std::is_convertible<typename std::iterator_traits<std::decay_t<decltype(
+ std::begin(std::declval<Sequence>()))>>::iterator_category,
+ std::input_iterator_tag>;
+
template<class Iterator>
using IsForwardIterable =
std::is_convertible<typename std::iterator_traits<Iterator>::iterator_category,
@@ -295,9 +289,8 @@ class Continuation
{
public:
template<typename F = Function>
- Continuation(F &&func, const QFuture<ParentResultType> &f,
- const QFutureInterface<ResultType> &p)
- : promise(p), parentFuture(f), function(std::forward<F>(func))
+ Continuation(F &&func, const QFuture<ParentResultType> &f, QPromise<ResultType> &&p)
+ : promise(std::move(p)), parentFuture(f), function(std::forward<F>(func))
{
}
virtual ~Continuation() = default;
@@ -305,15 +298,15 @@ public:
bool execute();
template<typename F = Function>
- static void create(F &&func, QFuture<ParentResultType> *f, QFutureInterface<ResultType> &p,
+ static void create(F &&func, QFuture<ParentResultType> *f, QFutureInterface<ResultType> &fi,
QtFuture::Launch policy);
template<typename F = Function>
- static void create(F &&func, QFuture<ParentResultType> *f, QFutureInterface<ResultType> &p,
+ static void create(F &&func, QFuture<ParentResultType> *f, QFutureInterface<ResultType> &fi,
QThreadPool *pool);
template<typename F = Function>
- static void create(F &&func, QFuture<ParentResultType> *f, QFutureInterface<ResultType> &p,
+ static void create(F &&func, QFuture<ParentResultType> *f, QFutureInterface<ResultType> &fi,
QObject *context);
private:
@@ -330,7 +323,7 @@ protected:
void runFunction();
protected:
- QFutureInterface<ResultType> promise;
+ QPromise<ResultType> promise;
QFuture<ParentResultType> parentFuture;
Function function;
};
@@ -340,9 +333,9 @@ class SyncContinuation final : public Continuation<Function, ResultType, ParentR
{
public:
template<typename F = Function>
- SyncContinuation(F &&func, const QFuture<ParentResultType> &f,
- const QFutureInterface<ResultType> &p)
- : Continuation<Function, ResultType, ParentResultType>(std::forward<F>(func), f, p)
+ SyncContinuation(F &&func, const QFuture<ParentResultType> &f, QPromise<ResultType> &&p)
+ : Continuation<Function, ResultType, ParentResultType>(std::forward<F>(func), f,
+ std::move(p))
{
}
@@ -358,12 +351,12 @@ class AsyncContinuation final : public QRunnable,
{
public:
template<typename F = Function>
- AsyncContinuation(F &&func, const QFuture<ParentResultType> &f,
- const QFutureInterface<ResultType> &p, QThreadPool *pool = nullptr)
- : Continuation<Function, ResultType, ParentResultType>(std::forward<F>(func), f, p),
+ AsyncContinuation(F &&func, const QFuture<ParentResultType> &f, QPromise<ResultType> &&p,
+ QThreadPool *pool = nullptr)
+ : Continuation<Function, ResultType, ParentResultType>(std::forward<F>(func), f,
+ std::move(p)),
threadPool(pool)
{
- this->promise.setRunnable(this);
}
~AsyncContinuation() override = default;
@@ -392,15 +385,15 @@ class FailureHandler
public:
template<typename F = Function>
static void create(F &&function, QFuture<ResultType> *future,
- const QFutureInterface<ResultType> &promise);
+ const QFutureInterface<ResultType> &fi);
template<typename F = Function>
- static void create(F &&function, QFuture<ResultType> *future,
- QFutureInterface<ResultType> &promise, QObject *context);
+ static void create(F &&function, QFuture<ResultType> *future, QFutureInterface<ResultType> &fi,
+ QObject *context);
template<typename F = Function>
- FailureHandler(F &&func, const QFuture<ResultType> &f, const QFutureInterface<ResultType> &p)
- : promise(p), parentFuture(f), handler(std::forward<F>(func))
+ FailureHandler(F &&func, const QFuture<ResultType> &f, QPromise<ResultType> &&p)
+ : promise(std::move(p)), parentFuture(f), handler(std::forward<F>(func))
{
}
@@ -413,7 +406,7 @@ private:
void handleAllExceptions();
private:
- QFutureInterface<ResultType> promise;
+ QPromise<ResultType> promise;
QFuture<ResultType> parentFuture;
Function handler;
};
@@ -423,7 +416,7 @@ private:
template<typename Function, typename ResultType, typename ParentResultType>
void Continuation<Function, ResultType, ParentResultType>::runFunction()
{
- promise.reportStarted();
+ promise.start();
Q_ASSERT(parentFuture.isFinished());
@@ -437,7 +430,7 @@ void Continuation<Function, ResultType, ParentResultType>::runFunction()
fulfillPromiseWithResult();
} else {
// This assert normally should never fail, this is to make sure
- // that nothing unexpected happend.
+ // that nothing unexpected happened.
static_assert(std::is_invocable_v<Function, QFuture<ParentResultType>>,
"The continuation is not invocable with the provided arguments");
fulfillPromise(parentFuture);
@@ -452,7 +445,7 @@ void Continuation<Function, ResultType, ParentResultType>::runFunction()
fulfillVoidPromise();
} else {
// This assert normally should never fail, this is to make sure
- // that nothing unexpected happend.
+ // that nothing unexpected happened.
static_assert(std::is_invocable_v<Function, QFuture<ParentResultType>>,
"The continuation is not invocable with the provided arguments");
function(parentFuture);
@@ -460,10 +453,10 @@ void Continuation<Function, ResultType, ParentResultType>::runFunction()
}
#ifndef QT_NO_EXCEPTIONS
} catch (...) {
- promise.reportException(std::current_exception());
+ promise.setException(std::current_exception());
}
#endif
- promise.reportFinished();
+ promise.finish();
}
template<typename Function, typename ResultType, typename ParentResultType>
@@ -479,17 +472,17 @@ bool Continuation<Function, ResultType, ParentResultType>::execute()
// the user may want to catch the exception inside the continuation, to not
// interrupt the continuation chain, so don't report anything yet.
if constexpr (!std::is_invocable_v<std::decay_t<Function>, QFuture<ParentResultType>>) {
- promise.reportStarted();
- promise.reportException(parentFuture.d.exceptionStore().exception());
- promise.reportFinished();
+ promise.start();
+ promise.setException(parentFuture.d.exceptionStore().exception());
+ promise.finish();
return false;
}
} else
#endif
{
- promise.reportStarted();
- promise.reportCanceled();
- promise.reportFinished();
+ promise.start();
+ promise.future().cancel();
+ promise.finish();
return false;
}
}
@@ -502,18 +495,26 @@ bool Continuation<Function, ResultType, ParentResultType>::execute()
template<class Function>
struct ContinuationWrapper
{
- ContinuationWrapper(Function &&f) : function(QSharedPointer<Function>::create(std::move(f))) { }
- void operator()(const QFutureInterfaceBase &parentData) { (*function)(parentData); }
+ ContinuationWrapper(Function &&f) : function(std::move(f)) { }
+ ContinuationWrapper(const ContinuationWrapper &other)
+ : function(std::move(const_cast<ContinuationWrapper &>(other).function))
+ {
+ Q_ASSERT_X(false, "QFuture", "Continuation shouldn't be copied");
+ }
+ ContinuationWrapper(ContinuationWrapper &&other) = default;
+ ContinuationWrapper &operator=(ContinuationWrapper &&) = default;
+
+ void operator()(const QFutureInterfaceBase &parentData) { function(parentData); }
private:
- QSharedPointer<Function> function;
+ Function function;
};
template<typename Function, typename ResultType, typename ParentResultType>
template<typename F>
void Continuation<Function, ResultType, ParentResultType>::create(F &&func,
QFuture<ParentResultType> *f,
- QFutureInterface<ResultType> &p,
+ QFutureInterface<ResultType> &fi,
QtFuture::Launch policy)
{
Q_ASSERT(f);
@@ -527,22 +528,24 @@ void Continuation<Function, ResultType, ParentResultType>::create(F &&func,
// If the parent future was using a custom thread pool, inherit it as well.
if (launchAsync && f->d.threadPool()) {
pool = f->d.threadPool();
- p.setThreadPool(pool);
+ fi.setThreadPool(pool);
}
}
- p.setLaunchAsync(launchAsync);
+ fi.setLaunchAsync(launchAsync);
- auto continuation = [func = std::forward<F>(func), p, pool,
+ auto continuation = [func = std::forward<F>(func), fi, promise_ = QPromise(fi), pool,
launchAsync](const QFutureInterfaceBase &parentData) mutable {
const auto parent = QFutureInterface<ParentResultType>(parentData).future();
Continuation<Function, ResultType, ParentResultType> *continuationJob = nullptr;
if (launchAsync) {
- continuationJob = new AsyncContinuation<Function, ResultType, ParentResultType>(
- std::forward<Function>(func), parent, p, pool);
+ auto asyncJob = new AsyncContinuation<Function, ResultType, ParentResultType>(
+ std::forward<Function>(func), parent, std::move(promise_), pool);
+ fi.setRunnable(asyncJob);
+ continuationJob = asyncJob;
} else {
continuationJob = new SyncContinuation<Function, ResultType, ParentResultType>(
- std::forward<Function>(func), parent, p);
+ std::forward<Function>(func), parent, std::move(promise_));
}
bool isLaunched = continuationJob->execute();
@@ -554,29 +557,26 @@ void Continuation<Function, ResultType, ParentResultType>::create(F &&func,
continuationJob = nullptr;
}
};
- if constexpr (!std::is_copy_constructible_v<Function>)
- f->d.setContinuation(ContinuationWrapper(std::move(continuation)), p.d);
- else
- f->d.setContinuation(std::move(continuation), p.d);
+ f->d.setContinuation(ContinuationWrapper(std::move(continuation)), fi.d);
}
template<typename Function, typename ResultType, typename ParentResultType>
template<typename F>
void Continuation<Function, ResultType, ParentResultType>::create(F &&func,
QFuture<ParentResultType> *f,
- QFutureInterface<ResultType> &p,
+ QFutureInterface<ResultType> &fi,
QThreadPool *pool)
{
Q_ASSERT(f);
- p.setLaunchAsync(true);
- p.setThreadPool(pool);
+ fi.setLaunchAsync(true);
+ fi.setThreadPool(pool);
- auto continuation = [func = std::forward<F>(func), p,
+ auto continuation = [func = std::forward<F>(func), promise_ = QPromise(fi),
pool](const QFutureInterfaceBase &parentData) mutable {
const auto parent = QFutureInterface<ParentResultType>(parentData).future();
auto continuationJob = new AsyncContinuation<Function, ResultType, ParentResultType>(
- std::forward<Function>(func), parent, p, pool);
+ std::forward<Function>(func), parent, std::move(promise_), pool);
bool isLaunched = continuationJob->execute();
// If continuation is successfully launched, AsyncContinuation will be deleted
// by the QThreadPool which has started it.
@@ -585,37 +585,42 @@ void Continuation<Function, ResultType, ParentResultType>::create(F &&func,
continuationJob = nullptr;
}
};
+ f->d.setContinuation(ContinuationWrapper(std::move(continuation)), fi.d);
+}
- if constexpr (!std::is_copy_constructible_v<Function>)
- f->d.setContinuation(ContinuationWrapper(std::move(continuation)), p.d);
- else
- f->d.setContinuation(std::move(continuation), p.d);
+// defined in qfutureinterface.cpp:
+Q_CORE_EXPORT void watchContinuationImpl(const QObject *context, QSlotObjectBase *slotObj,
+ QFutureInterfaceBase &fi);
+template <typename Continuation>
+void watchContinuation(const QObject *context, Continuation &&c, QFutureInterfaceBase &fi)
+{
+ using Prototype = typename QtPrivate::Callable<Continuation>::Function;
+ watchContinuationImpl(context,
+ QtPrivate::makeCallableObject<Prototype>(std::forward<Continuation>(c)),
+ fi);
}
template<typename Function, typename ResultType, typename ParentResultType>
template<typename F>
void Continuation<Function, ResultType, ParentResultType>::create(F &&func,
QFuture<ParentResultType> *f,
- QFutureInterface<ResultType> &p,
+ QFutureInterface<ResultType> &fi,
QObject *context)
{
Q_ASSERT(f);
-
- auto continuation = [func = std::forward<F>(func), p, context = QPointer<QObject>(context)](
- const QFutureInterfaceBase &parentData) mutable {
- Q_ASSERT(context);
- const auto parent = QFutureInterface<ParentResultType>(parentData).future();
- QMetaObject::invokeMethod(context, [func = std::forward<F>(func), p, parent]() mutable {
- SyncContinuation<Function, ResultType, ParentResultType> continuationJob(
- std::forward<Function>(func), parent, p);
- continuationJob.execute();
- });
+ Q_ASSERT(context);
+
+ // When the context object is destroyed, the signal-slot connection is broken and the
+ // continuation callback is destroyed. The promise that is created in the capture list is
+ // destroyed and, if it is not yet finished, cancelled.
+ auto continuation = [func = std::forward<F>(func), parent = *f,
+ promise_ = QPromise(fi)]() mutable {
+ SyncContinuation<Function, ResultType, ParentResultType> continuationJob(
+ std::forward<Function>(func), parent, std::move(promise_));
+ continuationJob.execute();
};
- if constexpr (!std::is_copy_constructible_v<Function>)
- f->d.setContinuation(ContinuationWrapper(std::move(continuation)), p.d);
- else
- f->d.setContinuation(std::move(continuation), p.d);
+ QtPrivate::watchContinuation(context, std::move(continuation), f->d);
}
template<typename Function, typename ResultType, typename ParentResultType>
@@ -649,32 +654,27 @@ template<typename Function, typename ResultType, typename ParentResultType>
template<class... Args>
void Continuation<Function, ResultType, ParentResultType>::fulfillPromise(Args &&... args)
{
- if constexpr (std::is_copy_constructible_v<ResultType>)
- promise.reportResult(std::invoke(function, std::forward<Args>(args)...));
- else
- promise.reportAndMoveResult(std::invoke(function, std::forward<Args>(args)...));
+ promise.addResult(std::invoke(function, std::forward<Args>(args)...));
}
template<class T>
-void fulfillPromise(QFutureInterface<T> &promise, QFuture<T> &future)
+void fulfillPromise(QPromise<T> &promise, QFuture<T> &future)
{
if constexpr (!std::is_void_v<T>) {
if constexpr (std::is_copy_constructible_v<T>)
- promise.reportResult(future.result());
+ promise.addResult(future.result());
else
- promise.reportAndMoveResult(future.takeResult());
+ promise.addResult(future.takeResult());
}
}
template<class T, class Function>
-void fulfillPromise(QFutureInterface<T> &promise, Function &&handler)
+void fulfillPromise(QPromise<T> &promise, Function &&handler)
{
if constexpr (std::is_void_v<T>)
handler();
- else if constexpr (std::is_copy_constructible_v<T>)
- promise.reportResult(handler());
else
- promise.reportAndMoveResult(handler());
+ promise.addResult(handler());
}
#ifndef QT_NO_EXCEPTIONS
@@ -682,49 +682,37 @@ void fulfillPromise(QFutureInterface<T> &promise, Function &&handler)
template<class Function, class ResultType>
template<class F>
void FailureHandler<Function, ResultType>::create(F &&function, QFuture<ResultType> *future,
- const QFutureInterface<ResultType> &promise)
+ const QFutureInterface<ResultType> &fi)
{
Q_ASSERT(future);
- auto failureContinuation = [function = std::forward<F>(function),
- promise](const QFutureInterfaceBase &parentData) mutable {
+ auto failureContinuation = [function = std::forward<F>(function), promise_ = QPromise(fi)](
+ const QFutureInterfaceBase &parentData) mutable {
const auto parent = QFutureInterface<ResultType>(parentData).future();
FailureHandler<Function, ResultType> failureHandler(std::forward<Function>(function),
- parent, promise);
+ parent, std::move(promise_));
failureHandler.run();
};
- if constexpr (!std::is_copy_constructible_v<Function>)
- future->d.setContinuation(ContinuationWrapper(std::move(failureContinuation)));
- else
- future->d.setContinuation(std::move(failureContinuation));
+ future->d.setContinuation(ContinuationWrapper(std::move(failureContinuation)));
}
template<class Function, class ResultType>
template<class F>
void FailureHandler<Function, ResultType>::create(F &&function, QFuture<ResultType> *future,
- QFutureInterface<ResultType> &promise,
+ QFutureInterface<ResultType> &fi,
QObject *context)
{
Q_ASSERT(future);
+ Q_ASSERT(context);
+ auto failureContinuation = [function = std::forward<F>(function),
+ parent = *future, promise_ = QPromise(fi)]() mutable {
+ FailureHandler<Function, ResultType> failureHandler(
+ std::forward<Function>(function), parent, std::move(promise_));
+ failureHandler.run();
+ };
- auto failureContinuation =
- [function = std::forward<F>(function), promise,
- context = QPointer<QObject>(context)](const QFutureInterfaceBase &parentData) mutable {
- Q_ASSERT(context);
- const auto parent = QFutureInterface<ResultType>(parentData).future();
- QMetaObject::invokeMethod(
- context, [function = std::forward<F>(function), promise, parent]() mutable {
- FailureHandler<Function, ResultType> failureHandler(
- std::forward<Function>(function), parent, promise);
- failureHandler.run();
- });
- };
-
- if constexpr (!std::is_copy_constructible_v<Function>)
- future->d.setContinuation(ContinuationWrapper(std::move(failureContinuation)));
- else
- future->d.setContinuation(std::move(failureContinuation));
+ QtPrivate::watchContinuation(context, std::move(failureContinuation), future->d);
}
template<class Function, class ResultType>
@@ -732,7 +720,7 @@ void FailureHandler<Function, ResultType>::run()
{
Q_ASSERT(parentFuture.isFinished());
- promise.reportStarted();
+ promise.start();
if (parentFuture.d.hasException()) {
using ArgType = typename QtPrivate::ArgResolver<Function>::First;
@@ -741,10 +729,12 @@ void FailureHandler<Function, ResultType>::run()
} else {
handleException<ArgType>();
}
+ } else if (parentFuture.d.isChainCanceled()) {
+ promise.future().cancel();
} else {
QtPrivate::fulfillPromise(promise, parentFuture);
}
- promise.reportFinished();
+ promise.finish();
}
template<class Function, class ResultType>
@@ -757,21 +747,17 @@ void FailureHandler<Function, ResultType>::handleException()
} catch (const ArgType &e) {
try {
// Handle exceptions matching with the handler's argument type
- if constexpr (std::is_void_v<ResultType>) {
+ if constexpr (std::is_void_v<ResultType>)
handler(e);
- } else {
- if constexpr (std::is_copy_constructible_v<ResultType>)
- promise.reportResult(handler(e));
- else
- promise.reportAndMoveResult(handler(e));
- }
+ else
+ promise.addResult(handler(e));
} catch (...) {
- promise.reportException(std::current_exception());
+ promise.setException(std::current_exception());
}
} catch (...) {
// Exception doesn't match with handler's argument type, propagate
// the exception to be handled later.
- promise.reportException(std::current_exception());
+ promise.setException(std::current_exception());
}
}
@@ -785,7 +771,7 @@ void FailureHandler<Function, ResultType>::handleAllExceptions()
try {
QtPrivate::fulfillPromise(promise, std::forward<Function>(handler));
} catch (...) {
- promise.reportException(std::current_exception());
+ promise.setException(std::current_exception());
}
}
}
@@ -797,68 +783,49 @@ class CanceledHandler
{
public:
template<class F = Function>
- static QFuture<ResultType> create(F &&handler, QFuture<ResultType> *future,
- QFutureInterface<ResultType> &promise)
+ static void create(F &&handler, QFuture<ResultType> *future, QFutureInterface<ResultType> &fi)
{
Q_ASSERT(future);
- auto canceledContinuation = [promise, handler = std::forward<F>(handler)](
+ auto canceledContinuation = [promise = QPromise(fi), handler = std::forward<F>(handler)](
const QFutureInterfaceBase &parentData) mutable {
auto parentFuture = QFutureInterface<ResultType>(parentData).future();
- run(std::forward<F>(handler), parentFuture, promise);
+ run(std::forward<F>(handler), parentFuture, std::move(promise));
};
-
- if constexpr (!std::is_copy_constructible_v<Function>)
- future->d.setContinuation(ContinuationWrapper(std::move(canceledContinuation)));
- else
- future->d.setContinuation(std::move(canceledContinuation));
-
- return promise.future();
+ future->d.setContinuation(ContinuationWrapper(std::move(canceledContinuation)));
}
template<class F = Function>
- static QFuture<ResultType> create(F &&handler, QFuture<ResultType> *future,
- QFutureInterface<ResultType> &promise, QObject *context)
+ static void create(F &&handler, QFuture<ResultType> *future, QFutureInterface<ResultType> &fi,
+ QObject *context)
{
Q_ASSERT(future);
-
- auto canceledContinuation = [promise, handler = std::forward<F>(handler),
- context = QPointer<QObject>(context)](
- const QFutureInterfaceBase &parentData) mutable {
- Q_ASSERT(context);
- auto parentFuture = QFutureInterface<ResultType>(parentData).future();
- QMetaObject::invokeMethod(
- context, [promise, parentFuture, handler = std::forward<F>(handler)]() mutable {
- run(std::forward<F>(handler), parentFuture, promise);
- });
+ Q_ASSERT(context);
+ auto canceledContinuation = [handler = std::forward<F>(handler),
+ parentFuture = *future, promise = QPromise(fi)]() mutable {
+ run(std::forward<F>(handler), parentFuture, std::move(promise));
};
- if constexpr (!std::is_copy_constructible_v<Function>)
- future->d.setContinuation(ContinuationWrapper(std::move(canceledContinuation)));
- else
- future->d.setContinuation(std::move(canceledContinuation));
-
- return promise.future();
+ QtPrivate::watchContinuation(context, std::move(canceledContinuation), future->d);
}
template<class F = Function>
- static void run(F &&handler, QFuture<ResultType> &parentFuture,
- QFutureInterface<ResultType> &promise)
+ static void run(F &&handler, QFuture<ResultType> &parentFuture, QPromise<ResultType> &&promise)
{
- promise.reportStarted();
+ promise.start();
if (parentFuture.isCanceled()) {
#ifndef QT_NO_EXCEPTIONS
if (parentFuture.d.hasException()) {
// Propagate the exception to the result future
- promise.reportException(parentFuture.d.exceptionStore().exception());
+ promise.setException(parentFuture.d.exceptionStore().exception());
} else {
try {
#endif
QtPrivate::fulfillPromise(promise, std::forward<F>(handler));
#ifndef QT_NO_EXCEPTIONS
} catch (...) {
- promise.reportException(std::current_exception());
+ promise.setException(std::current_exception());
}
}
#endif
@@ -866,10 +833,73 @@ public:
QtPrivate::fulfillPromise(promise, parentFuture);
}
- promise.reportFinished();
+ promise.finish();
}
};
+struct UnwrapHandler
+{
+ template<class T>
+ static auto unwrapImpl(T *outer)
+ {
+ Q_ASSERT(outer);
+
+ using ResultType = typename QtPrivate::Future<std::decay_t<T>>::type;
+ using NestedType = typename QtPrivate::Future<ResultType>::type;
+ QFutureInterface<NestedType> promise(QFutureInterfaceBase::State::Pending);
+
+ outer->then([promise](const QFuture<ResultType> &outerFuture) mutable {
+ // We use the .then([](QFuture<ResultType> outerFuture) {...}) version
+ // (where outerFuture == *outer), to propagate the exception if the
+ // outer future has failed.
+ Q_ASSERT(outerFuture.isFinished());
+#ifndef QT_NO_EXCEPTIONS
+ if (outerFuture.d.hasException()) {
+ promise.reportStarted();
+ promise.reportException(outerFuture.d.exceptionStore().exception());
+ promise.reportFinished();
+ return;
+ }
+#endif
+
+ promise.reportStarted();
+ ResultType nestedFuture = outerFuture.result();
+
+ nestedFuture.then([promise] (const QFuture<NestedType> &nested) mutable {
+#ifndef QT_NO_EXCEPTIONS
+ if (nested.d.hasException()) {
+ promise.reportException(nested.d.exceptionStore().exception());
+ } else
+#endif
+ {
+ if constexpr (!std::is_void_v<NestedType>)
+ promise.reportResults(nested.results());
+ }
+ promise.reportFinished();
+ }).onCanceled([promise] () mutable {
+ promise.reportCanceled();
+ promise.reportFinished();
+ });
+ }).onCanceled([promise]() mutable {
+ // propagate the cancellation of the outer future
+ promise.reportStarted();
+ promise.reportCanceled();
+ promise.reportFinished();
+ });
+ return promise.future();
+ }
+};
+
+template<typename ValueType>
+QFuture<ValueType> makeReadyRangeFutureImpl(const QList<ValueType> &values)
+{
+ QFutureInterface<ValueType> promise;
+ promise.reportStarted();
+ promise.reportResults(values);
+ promise.reportFinished();
+ return promise.future();
+}
+
} // namespace QtPrivate
namespace QtFuture {
@@ -883,6 +913,11 @@ static QFuture<ArgsType<Signal>> connect(Sender *sender, Signal signal)
using ArgsType = ArgsType<Signal>;
QFutureInterface<ArgsType> promise;
promise.reportStarted();
+ if (!sender) {
+ promise.reportCanceled();
+ promise.reportFinished();
+ return promise.future();
+ }
using Connections = std::pair<QMetaObject::Connection, QMetaObject::Connection>;
auto connections = std::make_shared<Connections>();
@@ -894,12 +929,13 @@ static QFuture<ArgsType<Signal>> connect(Sender *sender, Signal signal)
QObject::disconnect(connections->second);
promise.reportFinished();
});
- } else if constexpr (QtPrivate::isTupleV<ArgsType>) {
+ } else if constexpr (QtPrivate::ArgResolver<Signal>::HasExtraArgs) {
connections->first = QObject::connect(sender, signal, sender,
[promise, connections](auto... values) mutable {
QObject::disconnect(connections->first);
QObject::disconnect(connections->second);
- promise.reportResult(std::make_tuple(values...));
+ promise.reportResult(QtPrivate::createTuple(
+ std::move(values)...));
promise.reportFinished();
});
} else {
@@ -912,6 +948,12 @@ static QFuture<ArgsType<Signal>> connect(Sender *sender, Signal signal)
});
}
+ if (!connections->first) {
+ promise.reportCanceled();
+ promise.reportFinished();
+ return promise.future();
+ }
+
connections->second =
QObject::connect(sender, &QObject::destroyed, sender, [promise, connections]() mutable {
QObject::disconnect(connections->first);
@@ -923,8 +965,37 @@ static QFuture<ArgsType<Signal>> connect(Sender *sender, Signal signal)
return promise.future();
}
-template<typename T, typename = QtPrivate::EnableForNonVoid<T>>
-static QFuture<std::decay_t<T>> makeReadyFuture(T &&value)
+template<typename Container>
+using if_container_with_input_iterators =
+ std::enable_if_t<QtPrivate::HasInputIterator<Container>::value, bool>;
+
+template<typename Container>
+using ContainedType =
+ typename std::iterator_traits<decltype(
+ std::cbegin(std::declval<Container&>()))>::value_type;
+
+template<typename Container, if_container_with_input_iterators<Container> = true>
+static QFuture<ContainedType<Container>> makeReadyRangeFuture(Container &&container)
+{
+ // handle QList<T> separately, because reportResults() takes a QList
+ // as an input
+ using ValueType = ContainedType<Container>;
+ if constexpr (std::is_convertible_v<q20::remove_cvref_t<Container>, QList<ValueType>>) {
+ return QtPrivate::makeReadyRangeFutureImpl(container);
+ } else {
+ return QtPrivate::makeReadyRangeFutureImpl(QList<ValueType>{std::cbegin(container),
+ std::cend(container)});
+ }
+}
+
+template<typename ValueType>
+static QFuture<ValueType> makeReadyRangeFuture(std::initializer_list<ValueType> values)
+{
+ return QtPrivate::makeReadyRangeFutureImpl(QList<ValueType>{values});
+}
+
+template<typename T>
+static QFuture<std::decay_t<T>> makeReadyValueFuture(T &&value)
{
QFutureInterface<std::decay_t<T>> promise;
promise.reportStarted();
@@ -934,30 +1005,26 @@ static QFuture<std::decay_t<T>> makeReadyFuture(T &&value)
return promise.future();
}
-#if defined(Q_CLANG_QDOC)
-static QFuture<void> makeReadyFuture()
-#else
-template<typename T = void>
-static QFuture<T> makeReadyFuture()
-#endif
-{
- QFutureInterface<T> promise;
- promise.reportStarted();
- promise.reportFinished();
+Q_CORE_EXPORT QFuture<void> makeReadyVoidFuture(); // implemented in qfutureinterface.cpp
- return promise.future();
+#if QT_DEPRECATED_SINCE(6, 10)
+template<typename T, typename = QtPrivate::EnableForNonVoid<T>>
+QT_DEPRECATED_VERSION_X(6, 10, "Use makeReadyValueFuture() instead.")
+static QFuture<std::decay_t<T>> makeReadyFuture(T &&value)
+{
+ return makeReadyValueFuture(std::forward<T>(value));
}
+// the void specialization is moved to the end of qfuture.h, because it now
+// uses makeReadyVoidFuture() and required QFuture<void> to be defined.
+
template<typename T>
+QT_DEPRECATED_VERSION_X(6, 10, "Use makeReadyRangeFuture() instead.")
static QFuture<T> makeReadyFuture(const QList<T> &values)
{
- QFutureInterface<T> promise;
- promise.reportStarted();
- promise.reportResults(values);
- promise.reportFinished();
-
- return promise.future();
+ return makeReadyRangeFuture(values);
}
+#endif // QT_DEPRECATED_SINCE(6, 10)
#ifndef QT_NO_EXCEPTIONS
@@ -994,21 +1061,22 @@ struct WhenAllContext
{
using ValueType = typename ResultFutures::value_type;
- WhenAllContext(qsizetype size) : count(size) {}
+ explicit WhenAllContext(qsizetype size) : remaining(size) {}
template<typename T = ValueType>
void checkForCompletion(qsizetype index, T &&future)
{
futures[index] = std::forward<T>(future);
- Q_ASSERT(count > 0);
- if (--count <= 0) {
- promise.reportResult(futures);
- promise.reportFinished();
+ const auto oldRemaining = remaining.fetchAndSubRelaxed(1);
+ Q_ASSERT(oldRemaining > 0);
+ if (oldRemaining <= 1) { // that was the last one
+ promise.addResult(futures);
+ promise.finish();
}
}
- QAtomicInteger<qsizetype> count;
- QFutureInterface<ResultFutures> promise;
+ QAtomicInteger<qsizetype> remaining;
+ QPromise<ResultFutures> promise;
ResultFutures futures;
};
@@ -1021,24 +1089,25 @@ struct WhenAnyContext
void checkForCompletion(qsizetype, T &&result)
{
if (!ready.fetchAndStoreRelaxed(true)) {
- promise.reportResult(std::forward<T>(result));
- promise.reportFinished();
+ promise.addResult(std::forward<T>(result));
+ promise.finish();
}
}
QAtomicInt ready = false;
- QFutureInterface<ResultType> promise;
+ QPromise<ResultType> promise;
};
template<qsizetype Index, typename ContextType, typename... Ts>
-void addCompletionHandlersImpl(const QSharedPointer<ContextType> &context,
+void addCompletionHandlersImpl(const std::shared_ptr<ContextType> &context,
const std::tuple<Ts...> &t)
{
auto future = std::get<Index>(t);
using ResultType = typename ContextType::ValueType;
- future.then([context](const std::tuple_element_t<Index, std::tuple<Ts...>> &f) {
+ // Need context=context so that the compiler does not infer the captured variable's type as 'const'
+ future.then([context=context](const std::tuple_element_t<Index, std::tuple<Ts...>> &f) {
context->checkForCompletion(Index, ResultType { std::in_place_index<Index>, f });
- }).onCanceled([context, future]() {
+ }).onCanceled([context=context, future]() {
context->checkForCompletion(Index, ResultType { std::in_place_index<Index>, future });
});
@@ -1047,7 +1116,7 @@ void addCompletionHandlersImpl(const QSharedPointer<ContextType> &context,
}
template<typename ContextType, typename... Ts>
-void addCompletionHandlers(const QSharedPointer<ContextType> &context, const std::tuple<Ts...> &t)
+void addCompletionHandlers(const std::shared_ptr<ContextType> &context, const std::tuple<Ts...> &t)
{
constexpr qsizetype size = std::tuple_size<std::tuple<Ts...>>::value;
addCompletionHandlersImpl<size - 1, ContextType, Ts...>(context, t);
@@ -1058,17 +1127,18 @@ QFuture<OutputSequence> whenAllImpl(InputIt first, InputIt last)
{
const qsizetype size = std::distance(first, last);
if (size == 0)
- return QtFuture::makeReadyFuture(OutputSequence());
+ return QtFuture::makeReadyValueFuture(OutputSequence());
- auto context = QSharedPointer<QtPrivate::WhenAllContext<OutputSequence>>::create(size);
+ const auto context = std::make_shared<QtPrivate::WhenAllContext<OutputSequence>>(size);
context->futures.resize(size);
- context->promise.reportStarted();
+ context->promise.start();
qsizetype idx = 0;
for (auto it = first; it != last; ++it, ++idx) {
- it->then([context, idx](const ValueType &f) {
+ // Need context=context so that the compiler does not infer the captured variable's type as 'const'
+ it->then([context=context, idx](const ValueType &f) {
context->checkForCompletion(idx, f);
- }).onCanceled([context, idx, f = *it] {
+ }).onCanceled([context=context, idx, f = *it] {
context->checkForCompletion(idx, f);
});
}
@@ -1079,9 +1149,9 @@ template<typename OutputSequence, typename... Futures>
QFuture<OutputSequence> whenAllImpl(Futures &&... futures)
{
constexpr qsizetype size = sizeof...(Futures);
- auto context = QSharedPointer<QtPrivate::WhenAllContext<OutputSequence>>::create(size);
+ const auto context = std::make_shared<QtPrivate::WhenAllContext<OutputSequence>>(size);
context->futures.resize(size);
- context->promise.reportStarted();
+ context->promise.start();
QtPrivate::addCompletionHandlers(context, std::make_tuple(std::forward<Futures>(futures)...));
@@ -1097,18 +1167,19 @@ QFuture<QtFuture::WhenAnyResult<typename Future<ValueType>::type>> whenAnyImpl(I
const qsizetype size = std::distance(first, last);
if (size == 0) {
- return QtFuture::makeReadyFuture(
+ return QtFuture::makeReadyValueFuture(
QtFuture::WhenAnyResult { qsizetype(-1), QFuture<PackagedType>() });
}
- auto context = QSharedPointer<QtPrivate::WhenAnyContext<ResultType>>::create();
- context->promise.reportStarted();
+ const auto context = std::make_shared<QtPrivate::WhenAnyContext<ResultType>>();
+ context->promise.start();
qsizetype idx = 0;
for (auto it = first; it != last; ++it, ++idx) {
- it->then([context, idx](const ValueType &f) {
+ // Need context=context so that the compiler does not infer the captured variable's type as 'const'
+ it->then([context=context, idx](const ValueType &f) {
context->checkForCompletion(idx, QtFuture::WhenAnyResult { idx, f });
- }).onCanceled([context, idx, f = *it] {
+ }).onCanceled([context=context, idx, f = *it] {
context->checkForCompletion(idx, QtFuture::WhenAnyResult { idx, f });
});
}
@@ -1120,8 +1191,8 @@ QFuture<std::variant<std::decay_t<Futures>...>> whenAnyImpl(Futures &&... future
{
using ResultType = std::variant<std::decay_t<Futures>...>;
- auto context = QSharedPointer<QtPrivate::WhenAnyContext<ResultType>>::create();
- context->promise.reportStarted();
+ const auto context = std::make_shared<QtPrivate::WhenAnyContext<ResultType>>();
+ context->promise.start();
QtPrivate::addCompletionHandlers(context, std::make_tuple(std::forward<Futures>(futures)...));
diff --git a/src/corelib/thread/qfutureinterface.cpp b/src/corelib/thread/qfutureinterface.cpp
index 7512d6174a..f83306af00 100644
--- a/src/corelib/thread/qfutureinterface.cpp
+++ b/src/corelib/thread/qfutureinterface.cpp
@@ -1,53 +1,21 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
// qfutureinterface.h included from qfuture.h
#include "qfuture.h"
#include "qfutureinterface_p.h"
#include <QtCore/qatomic.h>
+#include <QtCore/qcoreapplication.h>
#include <QtCore/qthread.h>
+#include <QtCore/qvarlengtharray.h>
#include <private/qthreadpool_p.h>
+#include <private/qobject_p.h>
-#ifdef interface
-# undef interface
-#endif
+// GCC 12 gets confused about QFutureInterfaceBase::state, for some non-obvious
+// reason
+// warning: ‘unsigned int __atomic_or_fetch_4(volatile void*, unsigned int, int)’ writing 4 bytes into a region of size 0 overflows the destination [-Wstringop-overflow=]
+QT_WARNING_DISABLE_GCC("-Wstringop-overflow")
QT_BEGIN_NAMESPACE
@@ -59,6 +27,7 @@ namespace {
class ThreadPoolThreadReleaser {
QThreadPool *m_pool;
public:
+ Q_NODISCARD_CTOR
explicit ThreadPoolThreadReleaser(QThreadPool *pool)
: m_pool(pool)
{ if (pool) pool->releaseThread(); }
@@ -71,6 +40,67 @@ const auto suspendingOrSuspended =
} // unnamed namespace
+class QObjectContinuationWrapper : public QObject
+{
+ Q_OBJECT
+public:
+ explicit QObjectContinuationWrapper(QObject *parent = nullptr)
+ : QObject(parent)
+ {
+ }
+
+signals:
+ void run();
+};
+
+void QtPrivate::watchContinuationImpl(const QObject *context, QSlotObjectBase *slotObj,
+ QFutureInterfaceBase &fi)
+{
+ Q_ASSERT(context);
+ Q_ASSERT(slotObj);
+
+ auto slot = SlotObjUniquePtr(slotObj);
+
+ auto *watcher = new QObjectContinuationWrapper;
+ watcher->moveToThread(context->thread());
+
+ // We need to protect acccess to the watcher. The context object (and in turn, the watcher)
+ // could be destroyed while the continuation that emits the signal is running. We have to
+ // prevent that.
+ // The mutex has to be recursive, because the continuation itself could delete the context
+ // object (and thus the watcher), which will try to lock the mutex from the same thread twice.
+ auto watcherMutex = std::make_shared<QRecursiveMutex>();
+ const auto destroyWatcher = [watcherMutex, watcher]() mutable {
+ QMutexLocker lock(watcherMutex.get());
+ delete watcher;
+ };
+
+ // ### we're missing a convenient way to `QObject::connect()` to a `QSlotObjectBase`...
+ QObject::connect(watcher, &QObjectContinuationWrapper::run,
+ // for the following, cf. QMetaObject::invokeMethodImpl():
+ // we know `slot` is a lambda returning `void`, so we can just
+ // `call()` with `obj` and `args[0]` set to `nullptr`:
+ context, [slot = std::move(slot)] {
+ void *args[] = { nullptr }; // for `void` return value
+ slot->call(nullptr, args);
+ });
+ QObject::connect(watcher, &QObjectContinuationWrapper::run, watcher, &QObject::deleteLater);
+ QObject::connect(context, &QObject::destroyed, watcher, destroyWatcher);
+
+ fi.setContinuation([watcherMutex, watcher = QPointer(watcher)]
+ (const QFutureInterfaceBase &parentData)
+ {
+ Q_UNUSED(parentData);
+ QMutexLocker lock(watcherMutex.get());
+ if (watcher)
+ emit watcher->run();
+ });
+}
+
+QFutureCallOutInterface::~QFutureCallOutInterface()
+ = default;
+
+Q_IMPL_EVENT_COMMON(QFutureCallOutEvent)
QFutureInterfaceBase::QFutureInterfaceBase(State initialState)
: d(new QFutureInterfaceBasePrivate(initialState))
@@ -100,12 +130,11 @@ static inline int switch_off(QAtomicInt &a, int which)
static inline int switch_from_to(QAtomicInt &a, int from, int to)
{
- int newValue;
- int expected = a.loadRelaxed();
- do {
- newValue = (expected & ~from) | to;
- } while (!a.testAndSetRelaxed(expected, newValue, expected));
- return newValue;
+ const auto adjusted = [&](int old) { return (old & ~from) | to; };
+ int value = a.loadRelaxed();
+ while (!a.testAndSetRelaxed(value, adjusted(value), value))
+ qYieldCpu();
+ return value;
}
void QFutureInterfaceBase::cancel()
@@ -132,6 +161,13 @@ void QFutureInterfaceBase::cancel(QFutureInterfaceBase::CancelMode mode)
break;
}
+ // Cancel the continuations chain
+ QFutureInterfaceBasePrivate *next = d->continuationData;
+ while (next) {
+ next->continuationState = QFutureInterfaceBasePrivate::Canceled;
+ next = next->continuationData;
+ }
+
d->waitCondition.wakeAll();
d->pausedWaitCondition.wakeAll();
@@ -175,7 +211,7 @@ void QFutureInterfaceBase::reportSuspended() const
// i.e. no more events will be reported.
QMutexLocker locker(&d->m_mutex);
- const int state = d->state;
+ const int state = d->state.loadRelaxed();
if (!(state & Suspending) || (state & Suspended))
return;
@@ -638,7 +674,6 @@ void QFutureInterfaceBase::reset()
{
d->m_progressValue = 0;
d->m_progress.reset();
- d->setState(QFutureInterfaceBase::NoState);
d->progressTime.invalidate();
d->isValid = false;
}
@@ -746,7 +781,7 @@ void QFutureInterfaceBasePrivate::sendCallOut(const QFutureCallOutEvent &callOut
if (outputConnections.isEmpty())
return;
- for (int i = 0; i < outputConnections.count(); ++i)
+ for (int i = 0; i < outputConnections.size(); ++i)
outputConnections.at(i)->postCallOutEvent(callOutEvent);
}
@@ -756,38 +791,37 @@ void QFutureInterfaceBasePrivate::sendCallOuts(const QFutureCallOutEvent &callOu
if (outputConnections.isEmpty())
return;
- for (int i = 0; i < outputConnections.count(); ++i) {
- QFutureCallOutInterface *interface = outputConnections.at(i);
- interface->postCallOutEvent(callOutEvent1);
- interface->postCallOutEvent(callOutEvent2);
+ for (int i = 0; i < outputConnections.size(); ++i) {
+ QFutureCallOutInterface *iface = outputConnections.at(i);
+ iface->postCallOutEvent(callOutEvent1);
+ iface->postCallOutEvent(callOutEvent2);
}
}
// This function connects an output interface (for example a QFutureWatcher)
// to this future. While holding the lock we check the state and ready results
-// and add the appropriate callouts to the queue. In order to avoid deadlocks,
-// the actual callouts are made at the end while not holding the lock.
-void QFutureInterfaceBasePrivate::connectOutputInterface(QFutureCallOutInterface *interface)
+// and add the appropriate callouts to the queue.
+void QFutureInterfaceBasePrivate::connectOutputInterface(QFutureCallOutInterface *iface)
{
QMutexLocker locker(&m_mutex);
const auto currentState = state.loadRelaxed();
if (currentState & QFutureInterfaceBase::Started) {
- interface->postCallOutEvent(QFutureCallOutEvent(QFutureCallOutEvent::Started));
+ iface->postCallOutEvent(QFutureCallOutEvent(QFutureCallOutEvent::Started));
if (m_progress) {
- interface->postCallOutEvent(QFutureCallOutEvent(QFutureCallOutEvent::ProgressRange,
- m_progress->minimum,
- m_progress->maximum));
- interface->postCallOutEvent(QFutureCallOutEvent(QFutureCallOutEvent::Progress,
- m_progressValue,
- m_progress->text));
+ iface->postCallOutEvent(QFutureCallOutEvent(QFutureCallOutEvent::ProgressRange,
+ m_progress->minimum,
+ m_progress->maximum));
+ iface->postCallOutEvent(QFutureCallOutEvent(QFutureCallOutEvent::Progress,
+ m_progressValue,
+ m_progress->text));
} else {
- interface->postCallOutEvent(QFutureCallOutEvent(QFutureCallOutEvent::ProgressRange,
- 0,
- 0));
- interface->postCallOutEvent(QFutureCallOutEvent(QFutureCallOutEvent::Progress,
- m_progressValue,
- QString()));
+ iface->postCallOutEvent(QFutureCallOutEvent(QFutureCallOutEvent::ProgressRange,
+ 0,
+ 0));
+ iface->postCallOutEvent(QFutureCallOutEvent(QFutureCallOutEvent::Progress,
+ m_progressValue,
+ QString()));
}
}
@@ -796,36 +830,36 @@ void QFutureInterfaceBasePrivate::connectOutputInterface(QFutureCallOutInterface
while (it != data.m_results.end()) {
const int begin = it.resultIndex();
const int end = begin + it.batchSize();
- interface->postCallOutEvent(QFutureCallOutEvent(QFutureCallOutEvent::ResultsReady,
- begin,
- end));
+ iface->postCallOutEvent(QFutureCallOutEvent(QFutureCallOutEvent::ResultsReady,
+ begin,
+ end));
it.batchedAdvance();
}
}
if (currentState & QFutureInterfaceBase::Suspended)
- interface->postCallOutEvent(QFutureCallOutEvent(QFutureCallOutEvent::Suspended));
+ iface->postCallOutEvent(QFutureCallOutEvent(QFutureCallOutEvent::Suspended));
else if (currentState & QFutureInterfaceBase::Suspending)
- interface->postCallOutEvent(QFutureCallOutEvent(QFutureCallOutEvent::Suspending));
+ iface->postCallOutEvent(QFutureCallOutEvent(QFutureCallOutEvent::Suspending));
if (currentState & QFutureInterfaceBase::Canceled)
- interface->postCallOutEvent(QFutureCallOutEvent(QFutureCallOutEvent::Canceled));
+ iface->postCallOutEvent(QFutureCallOutEvent(QFutureCallOutEvent::Canceled));
if (currentState & QFutureInterfaceBase::Finished)
- interface->postCallOutEvent(QFutureCallOutEvent(QFutureCallOutEvent::Finished));
+ iface->postCallOutEvent(QFutureCallOutEvent(QFutureCallOutEvent::Finished));
- outputConnections.append(interface);
+ outputConnections.append(iface);
}
-void QFutureInterfaceBasePrivate::disconnectOutputInterface(QFutureCallOutInterface *interface)
+void QFutureInterfaceBasePrivate::disconnectOutputInterface(QFutureCallOutInterface *iface)
{
QMutexLocker lock(&m_mutex);
- const int index = outputConnections.indexOf(interface);
+ const qsizetype index = outputConnections.indexOf(iface);
if (index == -1)
return;
outputConnections.removeAt(index);
- interface->callOutInterfaceDisconnected();
+ iface->callOutInterfaceDisconnected();
}
void QFutureInterfaceBasePrivate::setState(QFutureInterfaceBase::State newState)
@@ -835,7 +869,7 @@ void QFutureInterfaceBasePrivate::setState(QFutureInterfaceBase::State newState)
void QFutureInterfaceBase::setContinuation(std::function<void(const QFutureInterfaceBase &)> func)
{
- setContinuation(func, nullptr);
+ setContinuation(std::move(func), nullptr);
}
void QFutureInterfaceBase::setContinuation(std::function<void(const QFutureInterfaceBase &)> func,
@@ -843,44 +877,60 @@ void QFutureInterfaceBase::setContinuation(std::function<void(const QFutureInter
{
QMutexLocker lock(&d->continuationMutex);
- if (continuationFutureData)
- continuationFutureData->parentData = d;
-
// If the state is ready, run continuation immediately,
// otherwise save it for later.
if (isFinished()) {
lock.unlock();
func(*this);
- } else {
+ lock.relock();
+ }
+ // Unless the continuation has been cleaned earlier, we have to
+ // store the move-only continuation, to guarantee that the associated
+ // future's data stays alive.
+ if (d->continuationState != QFutureInterfaceBasePrivate::Cleaned) {
+ if (d->continuation) {
+ qWarning() << "Adding a continuation to a future which already has a continuation. "
+ "The existing continuation is overwritten.";
+ }
d->continuation = std::move(func);
+ d->continuationData = continuationFutureData;
}
}
+void QFutureInterfaceBase::cleanContinuation()
+{
+ if (!d)
+ return;
+
+ QMutexLocker lock(&d->continuationMutex);
+ d->continuation = nullptr;
+ d->continuationState = QFutureInterfaceBasePrivate::Cleaned;
+ d->continuationData = nullptr;
+}
+
void QFutureInterfaceBase::runContinuation() const
{
QMutexLocker lock(&d->continuationMutex);
if (d->continuation) {
+ // Save the continuation in a local function, to avoid calling
+ // a null std::function below, in case cleanContinuation() is
+ // called from some other thread right after unlock() below.
+ auto fn = std::move(d->continuation);
lock.unlock();
- d->continuation(*this);
+ fn(*this);
+
+ lock.relock();
+ // Unless the continuation has been cleaned earlier, we have to
+ // store the move-only continuation, to guarantee that the associated
+ // future's data stays alive.
+ if (d->continuationState != QFutureInterfaceBasePrivate::Cleaned)
+ d->continuation = std::move(fn);
}
}
bool QFutureInterfaceBase::isChainCanceled() const
{
- if (isCanceled())
- return true;
-
- auto parent = d->parentData;
- while (parent) {
- // If the future is in Canceled state because it had an exception, we want to
- // continue checking the chain of parents for cancellation, otherwise if the exception
- // is handeled inside the chain, it won't be interrupted even though cancellation has
- // been requested.
- if ((parent->state.loadRelaxed() & Canceled) && !parent->hasException)
- return true;
- parent = parent->parentData;
- }
- return false;
+ return isCanceled() || d->continuationState == QFutureInterfaceBasePrivate::Canceled;
}
void QFutureInterfaceBase::setLaunchAsync(bool value)
@@ -893,4 +943,19 @@ bool QFutureInterfaceBase::launchAsync() const
return d->launchAsync;
}
+namespace QtFuture {
+
+QFuture<void> makeReadyVoidFuture()
+{
+ QFutureInterface<void> promise;
+ promise.reportStarted();
+ promise.reportFinished();
+
+ return promise.future();
+}
+
+} // namespace QtFuture
+
QT_END_NAMESPACE
+
+#include "qfutureinterface.moc"
diff --git a/src/corelib/thread/qfutureinterface.h b/src/corelib/thread/qfutureinterface.h
index 3130c91420..180a59a94e 100644
--- a/src/corelib/thread/qfutureinterface.h
+++ b/src/corelib/thread/qfutureinterface.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QFUTUREINTERFACE_H
#define QFUTUREINTERFACE_H
@@ -57,6 +21,7 @@ QT_BEGIN_NAMESPACE
template <typename T> class QFuture;
class QThreadPool;
+class QFutureInterfaceBase;
class QFutureInterfaceBasePrivate;
class QFutureWatcherBase;
class QFutureWatcherBasePrivate;
@@ -74,6 +39,10 @@ class CanceledHandler;
template<class Function, class ResultType>
class FailureHandler;
#endif
+
+void Q_CORE_EXPORT watchContinuationImpl(const QObject *context,
+ QtPrivate::QSlotObjectBase *slotObj,
+ QFutureInterfaceBase &fi);
}
class Q_CORE_EXPORT QFutureInterfaceBase
@@ -212,10 +181,17 @@ private:
friend class QtPrivate::FailureHandler;
#endif
+ friend Q_CORE_EXPORT void QtPrivate::watchContinuationImpl(
+ const QObject *context, QtPrivate::QSlotObjectBase *slotObj, QFutureInterfaceBase &fi);
+
+ template<class T>
+ friend class QPromise;
+
protected:
void setContinuation(std::function<void(const QFutureInterfaceBase &)> func);
void setContinuation(std::function<void(const QFutureInterfaceBase &)> func,
QFutureInterfaceBasePrivate *continuationFutureData);
+ void cleanContinuation();
void runContinuation() const;
void setLaunchAsync(bool value);
@@ -268,6 +244,8 @@ public:
inline QFuture<T> future(); // implemented in qfuture.h
+ template <typename...Args, std::enable_if_t<std::is_constructible_v<T, Args...>, bool> = true>
+ inline bool reportAndEmplaceResult(int index, Args&&...args);
inline bool reportResult(const T *result, int index = -1);
inline bool reportAndMoveResult(T &&result, int index = -1);
inline bool reportResult(T &&result, int index = -1);
@@ -333,7 +311,8 @@ inline bool QFutureInterface<T>::reportResult(const T *result, int index)
}
template<typename T>
-bool QFutureInterface<T>::reportAndMoveResult(T &&result, int index)
+template<typename...Args, std::enable_if_t<std::is_constructible_v<T, Args...>, bool>>
+bool QFutureInterface<T>::reportAndEmplaceResult(int index, Args&&...args)
{
QMutexLocker<QMutex> locker{&mutex()};
if (queryState(Canceled) || queryState(Finished))
@@ -343,7 +322,7 @@ bool QFutureInterface<T>::reportAndMoveResult(T &&result, int index)
QtPrivate::ResultStoreBase &store = resultStoreBase();
const int oldResultCount = store.count();
- const int insertIndex = store.moveResult(index, std::forward<T>(result));
+ const int insertIndex = store.emplaceResult<T>(index, std::forward<Args>(args)...);
// Let's make sure it's not in pending results.
if (insertIndex != -1 && (!store.filterMode() || oldResultCount < store.count()))
reportResultsReady(insertIndex, store.count());
@@ -351,6 +330,12 @@ bool QFutureInterface<T>::reportAndMoveResult(T &&result, int index)
}
template<typename T>
+bool QFutureInterface<T>::reportAndMoveResult(T &&result, int index)
+{
+ return reportAndEmplaceResult(index, std::move(result));
+}
+
+template<typename T>
bool QFutureInterface<T>::reportResult(T &&result, int index)
{
return reportAndMoveResult(std::move(result), index);
@@ -379,7 +364,7 @@ inline bool QFutureInterface<T>::reportResults(const QList<T> &_results, int beg
if (store.filterMode()) {
this->reportResultsReady(resultCountBefore, store.count());
} else {
- this->reportResultsReady(insertIndex, insertIndex + _results.count());
+ this->reportResultsReady(insertIndex, insertIndex + _results.size());
}
return true;
}
@@ -484,7 +469,7 @@ template <>
class QFutureInterface<void> : public QFutureInterfaceBase
{
public:
- explicit QFutureInterface<void>(State initialState = NoState)
+ explicit QFutureInterface(State initialState = NoState)
: QFutureInterfaceBase(initialState)
{ }
diff --git a/src/corelib/thread/qfutureinterface_p.h b/src/corelib/thread/qfutureinterface_p.h
index fd7f34826d..92a1072591 100644
--- a/src/corelib/thread/qfutureinterface_p.h
+++ b/src/corelib/thread/qfutureinterface_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QFUTUREINTERFACE_P_H
#define QFUTUREINTERFACE_P_H
@@ -65,9 +29,13 @@ QT_REQUIRE_CONFIG(future);
QT_BEGIN_NAMESPACE
-class QFutureCallOutEvent : public QEvent
+// Although QFutureCallOutEvent and QFutureCallOutInterface are private,
+// for historical reasons they were used externally (in QtJambi, see
+// https://github.com/OmixVisualization/qtjambi), so we export them to
+// not break the pre-existing code.
+class Q_CORE_EXPORT QFutureCallOutEvent : public QEvent
{
- Q_EVENT_DISABLE_COPY(QFutureCallOutEvent);
+ Q_DECL_EVENT_COMMON(QFutureCallOutEvent)
public:
enum CallOutType {
Started,
@@ -103,29 +71,12 @@ public:
int index1;
int index2;
QString text;
-
- QEvent *clone() const override
- {
- return new QFutureCallOutEvent(callOutType, index1, index2, text);
- }
-
-private:
- QFutureCallOutEvent(CallOutType callOutType,
- int index1,
- int index2,
- const QString &text)
- : QEvent(QEvent::FutureCallOut),
- callOutType(callOutType),
- index1(index1),
- index2(index2),
- text(text)
- { }
};
-class QFutureCallOutInterface
+class Q_CORE_EXPORT QFutureCallOutInterface
{
public:
- virtual ~QFutureCallOutInterface() {}
+ virtual ~QFutureCallOutInterface();
virtual void postCallOutEvent(const QFutureCallOutEvent &) = 0;
virtual void callOutInterfaceDisconnected() = 0;
};
@@ -190,7 +141,7 @@ public:
QThreadPool *m_pool = nullptr;
// Wrapper for continuation
std::function<void(const QFutureInterfaceBase &)> continuation;
- QFutureInterfaceBasePrivate *parentData = nullptr;
+ QFutureInterfaceBasePrivate *continuationData = nullptr;
RefCount refCount = 1;
QAtomicInt state; // reads and writes can happen unprotected, both must be atomic
@@ -209,6 +160,9 @@ public:
bool isValid = false;
bool hasException = false;
+ enum ContinuationState : quint8 { Default, Canceled, Cleaned };
+ std::atomic<ContinuationState> continuationState { Default };
+
inline QThreadPool *pool() const
{ return m_pool ? m_pool : QThreadPool::globalInstance(); }
diff --git a/src/corelib/thread/qfuturesynchronizer.h b/src/corelib/thread/qfuturesynchronizer.h
index f73041f6a7..a996362bfd 100644
--- a/src/corelib/thread/qfuturesynchronizer.h
+++ b/src/corelib/thread/qfuturesynchronizer.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QFUTURESYNCHRONIZER_H
#define QFUTURESYNCHRONIZER_H
@@ -53,33 +17,34 @@ class QFutureSynchronizer
Q_DISABLE_COPY(QFutureSynchronizer)
public:
- QFutureSynchronizer() : m_cancelOnWait(false) { }
- explicit QFutureSynchronizer(const QFuture<T> &future)
+ Q_NODISCARD_CTOR QFutureSynchronizer() : m_cancelOnWait(false) { }
+ Q_NODISCARD_CTOR_X("Use future.waitForFinished() instead.")
+ explicit QFutureSynchronizer(QFuture<T> future)
: m_cancelOnWait(false)
- { addFuture(future); }
+ { addFuture(std::move(future)); }
~QFutureSynchronizer() { waitForFinished(); }
- void setFuture(const QFuture<T> &future)
+ void setFuture(QFuture<T> future)
{
waitForFinished();
m_futures.clear();
- addFuture(future);
+ addFuture(std::move(future));
}
- void addFuture(const QFuture<T> &future)
+ void addFuture(QFuture<T> future)
{
- m_futures.append(future);
+ m_futures.append(std::move(future));
}
void waitForFinished()
{
if (m_cancelOnWait) {
- for (int i = 0; i < m_futures.count(); ++i) {
+ for (int i = 0; i < m_futures.size(); ++i) {
m_futures[i].cancel();
}
}
- for (int i = 0; i < m_futures.count(); ++i) {
+ for (int i = 0; i < m_futures.size(); ++i) {
m_futures[i].waitForFinished();
}
}
diff --git a/src/corelib/thread/qfuturesynchronizer.qdoc b/src/corelib/thread/qfuturesynchronizer.qdoc
index 67dafb039e..7d2d16d6e9 100644
--- a/src/corelib/thread/qfuturesynchronizer.qdoc
+++ b/src/corelib/thread/qfuturesynchronizer.qdoc
@@ -1,29 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*! \class QFutureSynchronizer
\since 4.4
@@ -62,7 +38,7 @@
*/
/*!
- \fn template <typename T> QFutureSynchronizer<T>::QFutureSynchronizer(const QFuture<T> &future)
+ \fn template <typename T> QFutureSynchronizer<T>::QFutureSynchronizer(QFuture<T> future)
Constructs a QFutureSynchronizer and begins watching \a future by calling
addFuture().
@@ -80,7 +56,7 @@
*/
/*!
- \fn template <typename T> void QFutureSynchronizer<T>::setFuture(const QFuture<T> &future)
+ \fn template <typename T> void QFutureSynchronizer<T>::setFuture(QFuture<T> future)
Sets \a future to be the only future managed by this QFutureSynchronizer.
This is a convenience function that calls waitForFinished(),
@@ -90,7 +66,7 @@
*/
/*!
- \fn template <typename T> void QFutureSynchronizer<T>::addFuture(const QFuture<T> &future)
+ \fn template <typename T> void QFutureSynchronizer<T>::addFuture(QFuture<T> future)
Adds \a future to the list of managed futures.
diff --git a/src/corelib/thread/qfuturewatcher.cpp b/src/corelib/thread/qfuturewatcher.cpp
index f86f0ce6ba..2cffadfa5b 100644
--- a/src/corelib/thread/qfuturewatcher.cpp
+++ b/src/corelib/thread/qfuturewatcher.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qfuturewatcher.h"
#include "qfuturewatcher_p.h"
@@ -588,7 +552,7 @@ QT_WARNING_POP
}
-/*! \fn template <typename T> const T &QFutureWatcher<T>::result() const
+/*! \fn template <typename T> template<typename U = T, typename = QtPrivate::EnableForNonVoid<U>> const T &QFutureWatcher<T>::result() const
Returns the first result in the future(). If the result is not immediately
available, this function will block and wait for the result to become
@@ -597,7 +561,7 @@ QT_WARNING_POP
\sa resultAt()
*/
-/*! \fn template <typename T> const T &QFutureWatcher<T>::resultAt(int index) const
+/*! \fn template <typename T> template<typename U = T, typename = QtPrivate::EnableForNonVoid<U>> const T &QFutureWatcher<T>::resultAt(int index) const
Returns the result at \a index in the future(). If the result is not
immediately available, this function will block and wait for the result to
@@ -610,9 +574,15 @@ QT_WARNING_POP
Starts watching the given \a future.
- One of the signals might be emitted for the current state of the
- \a future. For example, if the future is already stopped, the
- finished signal will be emitted.
+ If \a future has already started, the watcher will initially emit signals
+ that bring their listeners up to date about the future's state. The
+ following signals will, if applicable, be emitted in the given order:
+ started(), progressRangeChanged(), progressValueChanged(),
+ progressTextChanged(), resultsReadyAt(), resultReadyAt(), suspending(),
+ suspended(), canceled(), and finished(). Of these, resultsReadyAt() and
+ resultReadyAt() may be emitted several times to cover all available
+ results. progressValueChanged() and progressTextChanged() will only be
+ emitted once for the latest available progress value and text.
To avoid a race condition, it is important to call this function
\e after doing the connections.
diff --git a/src/corelib/thread/qfuturewatcher.h b/src/corelib/thread/qfuturewatcher.h
index 0e7490d9a5..89c5b408fa 100644
--- a/src/corelib/thread/qfuturewatcher.h
+++ b/src/corelib/thread/qfuturewatcher.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QFUTUREWATCHER_H
#define QFUTUREWATCHER_H
diff --git a/src/corelib/thread/qfuturewatcher_p.h b/src/corelib/thread/qfuturewatcher_p.h
index f9a628e4fb..6d6bf29774 100644
--- a/src/corelib/thread/qfuturewatcher_p.h
+++ b/src/corelib/thread/qfuturewatcher_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QFUTUREWATCHER_P_H
#define QFUTUREWATCHER_P_H
diff --git a/src/corelib/thread/qgenericatomic.h b/src/corelib/thread/qgenericatomic.h
index 65b6974f4d..91ccbbd1cd 100644
--- a/src/corelib/thread/qgenericatomic.h
+++ b/src/corelib/thread/qgenericatomic.h
@@ -1,48 +1,13 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Thiago Macieira <thiago@kde.org>
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2011 Thiago Macieira <thiago@kde.org>
+// Copyright (C) 2016 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QGENERICATOMIC_H
#define QGENERICATOMIC_H
-#include <QtCore/qglobal.h>
-#include <QtCore/qtypeinfo.h>
+#include <QtCore/qcompilerdetection.h>
+#include <QtCore/qtconfigmacros.h>
+#include <QtCore/qtypes.h>
QT_BEGIN_NAMESPACE
@@ -69,335 +34,5 @@ template <typename T> struct QAtomicAdditiveType<T *>
static const int AddScale = sizeof(T);
};
-// not really atomic...
-template <typename BaseClass> struct QGenericAtomicOps
-{
- template <typename T> struct AtomicType { typedef T Type; typedef T *PointerType; };
-
- template <typename T> static void acquireMemoryFence(const T &_q_value) noexcept
- {
- BaseClass::orderedMemoryFence(_q_value);
- }
- template <typename T> static void releaseMemoryFence(const T &_q_value) noexcept
- {
- BaseClass::orderedMemoryFence(_q_value);
- }
- template <typename T> static void orderedMemoryFence(const T &) noexcept
- {
- }
-
- template <typename T> static Q_ALWAYS_INLINE
- T load(const T &_q_value) noexcept
- {
- return _q_value;
- }
-
- template <typename T, typename X> static Q_ALWAYS_INLINE
- void store(T &_q_value, X newValue) noexcept
- {
- _q_value = newValue;
- }
-
- template <typename T> static Q_ALWAYS_INLINE
- T loadRelaxed(const T &_q_value) noexcept
- {
- return _q_value;
- }
-
- template <typename T, typename X> static Q_ALWAYS_INLINE
- void storeRelaxed(T &_q_value, X newValue) noexcept
- {
- _q_value = newValue;
- }
-
- template <typename T> static Q_ALWAYS_INLINE
- T loadAcquire(const T &_q_value) noexcept
- {
- T tmp = *static_cast<const volatile T *>(&_q_value);
- BaseClass::acquireMemoryFence(_q_value);
- return tmp;
- }
-
- template <typename T, typename X> static Q_ALWAYS_INLINE
- void storeRelease(T &_q_value, X newValue) noexcept
- {
- BaseClass::releaseMemoryFence(_q_value);
- *static_cast<volatile T *>(&_q_value) = newValue;
- }
-
- static inline constexpr bool isReferenceCountingNative() noexcept
- { return BaseClass::isFetchAndAddNative(); }
- static inline constexpr bool isReferenceCountingWaitFree() noexcept
- { return BaseClass::isFetchAndAddWaitFree(); }
- template <typename T> static Q_ALWAYS_INLINE
- bool ref(T &_q_value) noexcept
- {
- return BaseClass::fetchAndAddRelaxed(_q_value, 1) != T(-1);
- }
-
- template <typename T> static Q_ALWAYS_INLINE
- bool deref(T &_q_value) noexcept
- {
- return BaseClass::fetchAndAddRelaxed(_q_value, -1) != 1;
- }
-
-#if 0
- // These functions have no default implementation
- // Architectures must implement them
- static inline constexpr bool isTestAndSetNative() noexcept;
- static inline constexpr bool isTestAndSetWaitFree() noexcept;
- template <typename T, typename X> static inline
- bool testAndSetRelaxed(T &_q_value, X expectedValue, X newValue) noexcept;
- template <typename T, typename X> static inline
- bool testAndSetRelaxed(T &_q_value, X expectedValue, X newValue, X *currentValue) noexcept;
-#endif
-
- template <typename T, typename X> static Q_ALWAYS_INLINE
- bool testAndSetAcquire(T &_q_value, X expectedValue, X newValue) noexcept
- {
- bool tmp = BaseClass::testAndSetRelaxed(_q_value, expectedValue, newValue);
- BaseClass::acquireMemoryFence(_q_value);
- return tmp;
- }
-
- template <typename T, typename X> static Q_ALWAYS_INLINE
- bool testAndSetRelease(T &_q_value, X expectedValue, X newValue) noexcept
- {
- BaseClass::releaseMemoryFence(_q_value);
- return BaseClass::testAndSetRelaxed(_q_value, expectedValue, newValue);
- }
-
- template <typename T, typename X> static Q_ALWAYS_INLINE
- bool testAndSetOrdered(T &_q_value, X expectedValue, X newValue) noexcept
- {
- BaseClass::orderedMemoryFence(_q_value);
- return BaseClass::testAndSetRelaxed(_q_value, expectedValue, newValue);
- }
-
- template <typename T, typename X> static Q_ALWAYS_INLINE
- bool testAndSetAcquire(T &_q_value, X expectedValue, X newValue, X *currentValue) noexcept
- {
- bool tmp = BaseClass::testAndSetRelaxed(_q_value, expectedValue, newValue, currentValue);
- BaseClass::acquireMemoryFence(_q_value);
- return tmp;
- }
-
- template <typename T, typename X> static Q_ALWAYS_INLINE
- bool testAndSetRelease(T &_q_value, X expectedValue, X newValue, X *currentValue) noexcept
- {
- BaseClass::releaseMemoryFence(_q_value);
- return BaseClass::testAndSetRelaxed(_q_value, expectedValue, newValue, currentValue);
- }
-
- template <typename T, typename X> static Q_ALWAYS_INLINE
- bool testAndSetOrdered(T &_q_value, X expectedValue, X newValue, X *currentValue) noexcept
- {
- BaseClass::orderedMemoryFence(_q_value);
- return BaseClass::testAndSetRelaxed(_q_value, expectedValue, newValue, currentValue);
- }
-
- static inline constexpr bool isFetchAndStoreNative() noexcept { return false; }
- static inline constexpr bool isFetchAndStoreWaitFree() noexcept { return false; }
-
- template <typename T, typename X> static Q_ALWAYS_INLINE
- T fetchAndStoreRelaxed(T &_q_value, X newValue) noexcept
- {
- // implement fetchAndStore on top of testAndSet
- Q_FOREVER {
- T tmp = loadRelaxed(_q_value);
- if (BaseClass::testAndSetRelaxed(_q_value, tmp, newValue))
- return tmp;
- }
- }
-
- template <typename T, typename X> static Q_ALWAYS_INLINE
- T fetchAndStoreAcquire(T &_q_value, X newValue) noexcept
- {
- T tmp = BaseClass::fetchAndStoreRelaxed(_q_value, newValue);
- BaseClass::acquireMemoryFence(_q_value);
- return tmp;
- }
-
- template <typename T, typename X> static Q_ALWAYS_INLINE
- T fetchAndStoreRelease(T &_q_value, X newValue) noexcept
- {
- BaseClass::releaseMemoryFence(_q_value);
- return BaseClass::fetchAndStoreRelaxed(_q_value, newValue);
- }
-
- template <typename T, typename X> static Q_ALWAYS_INLINE
- T fetchAndStoreOrdered(T &_q_value, X newValue) noexcept
- {
- BaseClass::orderedMemoryFence(_q_value);
- return BaseClass::fetchAndStoreRelaxed(_q_value, newValue);
- }
-
- static inline constexpr bool isFetchAndAddNative() noexcept { return false; }
- static inline constexpr bool isFetchAndAddWaitFree() noexcept { return false; }
- template <typename T> static Q_ALWAYS_INLINE
- T fetchAndAddRelaxed(T &_q_value, typename QAtomicAdditiveType<T>::AdditiveT valueToAdd) noexcept
- {
- // implement fetchAndAdd on top of testAndSet
- Q_FOREVER {
- T tmp = BaseClass::loadRelaxed(_q_value);
- if (BaseClass::testAndSetRelaxed(_q_value, tmp, T(tmp + valueToAdd)))
- return tmp;
- }
- }
-
- template <typename T> static Q_ALWAYS_INLINE
- T fetchAndAddAcquire(T &_q_value, typename QAtomicAdditiveType<T>::AdditiveT valueToAdd) noexcept
- {
- T tmp = BaseClass::fetchAndAddRelaxed(_q_value, valueToAdd);
- BaseClass::acquireMemoryFence(_q_value);
- return tmp;
- }
-
- template <typename T> static Q_ALWAYS_INLINE
- T fetchAndAddRelease(T &_q_value, typename QAtomicAdditiveType<T>::AdditiveT valueToAdd) noexcept
- {
- BaseClass::releaseMemoryFence(_q_value);
- return BaseClass::fetchAndAddRelaxed(_q_value, valueToAdd);
- }
-
- template <typename T> static Q_ALWAYS_INLINE
- T fetchAndAddOrdered(T &_q_value, typename QAtomicAdditiveType<T>::AdditiveT valueToAdd) noexcept
- {
- BaseClass::orderedMemoryFence(_q_value);
- return BaseClass::fetchAndAddRelaxed(_q_value, valueToAdd);
- }
-
-QT_WARNING_PUSH
-QT_WARNING_DISABLE_MSVC(4146) // unary minus operator applied to unsigned type, result still unsigned
- template <typename T> static Q_ALWAYS_INLINE
- T fetchAndSubRelaxed(T &_q_value, typename QAtomicAdditiveType<T>::AdditiveT operand) noexcept
- {
- // implement fetchAndSub on top of fetchAndAdd
- return fetchAndAddRelaxed(_q_value, -operand);
- }
-QT_WARNING_POP
-
- template <typename T> static Q_ALWAYS_INLINE
- T fetchAndSubAcquire(T &_q_value, typename QAtomicAdditiveType<T>::AdditiveT operand) noexcept
- {
- T tmp = BaseClass::fetchAndSubRelaxed(_q_value, operand);
- BaseClass::acquireMemoryFence(_q_value);
- return tmp;
- }
-
- template <typename T> static Q_ALWAYS_INLINE
- T fetchAndSubRelease(T &_q_value, typename QAtomicAdditiveType<T>::AdditiveT operand) noexcept
- {
- BaseClass::releaseMemoryFence(_q_value);
- return BaseClass::fetchAndSubRelaxed(_q_value, operand);
- }
-
- template <typename T> static Q_ALWAYS_INLINE
- T fetchAndSubOrdered(T &_q_value, typename QAtomicAdditiveType<T>::AdditiveT operand) noexcept
- {
- BaseClass::orderedMemoryFence(_q_value);
- return BaseClass::fetchAndSubRelaxed(_q_value, operand);
- }
-
- template <typename T> static Q_ALWAYS_INLINE
- T fetchAndAndRelaxed(T &_q_value, typename std::enable_if<QTypeInfo<T>::isIntegral, T>::type operand) noexcept
- {
- // implement fetchAndAnd on top of testAndSet
- T tmp = BaseClass::loadRelaxed(_q_value);
- Q_FOREVER {
- if (BaseClass::testAndSetRelaxed(_q_value, tmp, T(tmp & operand), &tmp))
- return tmp;
- }
- }
-
- template <typename T> static Q_ALWAYS_INLINE
- T fetchAndAndAcquire(T &_q_value, typename std::enable_if<QTypeInfo<T>::isIntegral, T>::type operand) noexcept
- {
- T tmp = BaseClass::fetchAndAndRelaxed(_q_value, operand);
- BaseClass::acquireMemoryFence(_q_value);
- return tmp;
- }
-
- template <typename T> static Q_ALWAYS_INLINE
- T fetchAndAndRelease(T &_q_value, typename std::enable_if<QTypeInfo<T>::isIntegral, T>::type operand) noexcept
- {
- BaseClass::releaseMemoryFence(_q_value);
- return BaseClass::fetchAndAndRelaxed(_q_value, operand);
- }
-
- template <typename T> static Q_ALWAYS_INLINE
- T fetchAndAndOrdered(T &_q_value, typename std::enable_if<QTypeInfo<T>::isIntegral, T>::type operand) noexcept
- {
- BaseClass::orderedMemoryFence(_q_value);
- return BaseClass::fetchAndAndRelaxed(_q_value, operand);
- }
-
- template <typename T> static Q_ALWAYS_INLINE
- T fetchAndOrRelaxed(T &_q_value, typename std::enable_if<QTypeInfo<T>::isIntegral, T>::type operand) noexcept
- {
- // implement fetchAndOr on top of testAndSet
- T tmp = BaseClass::loadRelaxed(_q_value);
- Q_FOREVER {
- if (BaseClass::testAndSetRelaxed(_q_value, tmp, T(tmp | operand), &tmp))
- return tmp;
- }
- }
-
- template <typename T> static Q_ALWAYS_INLINE
- T fetchAndOrAcquire(T &_q_value, typename std::enable_if<QTypeInfo<T>::isIntegral, T>::type operand) noexcept
- {
- T tmp = BaseClass::fetchAndOrRelaxed(_q_value, operand);
- BaseClass::acquireMemoryFence(_q_value);
- return tmp;
- }
-
- template <typename T> static Q_ALWAYS_INLINE
- T fetchAndOrRelease(T &_q_value, typename std::enable_if<QTypeInfo<T>::isIntegral, T>::type operand) noexcept
- {
- BaseClass::releaseMemoryFence(_q_value);
- return BaseClass::fetchAndOrRelaxed(_q_value, operand);
- }
-
- template <typename T> static Q_ALWAYS_INLINE
- T fetchAndOrOrdered(T &_q_value, typename std::enable_if<QTypeInfo<T>::isIntegral, T>::type operand) noexcept
- {
- BaseClass::orderedMemoryFence(_q_value);
- return BaseClass::fetchAndOrRelaxed(_q_value, operand);
- }
-
- template <typename T> static Q_ALWAYS_INLINE
- T fetchAndXorRelaxed(T &_q_value, typename std::enable_if<QTypeInfo<T>::isIntegral, T>::type operand) noexcept
- {
- // implement fetchAndXor on top of testAndSet
- T tmp = BaseClass::loadRelaxed(_q_value);
- Q_FOREVER {
- if (BaseClass::testAndSetRelaxed(_q_value, tmp, T(tmp ^ operand), &tmp))
- return tmp;
- }
- }
-
- template <typename T> static Q_ALWAYS_INLINE
- T fetchAndXorAcquire(T &_q_value, typename std::enable_if<QTypeInfo<T>::isIntegral, T>::type operand) noexcept
- {
- T tmp = BaseClass::fetchAndXorRelaxed(_q_value, operand);
- BaseClass::acquireMemoryFence(_q_value);
- return tmp;
- }
-
- template <typename T> static Q_ALWAYS_INLINE
- T fetchAndXorRelease(T &_q_value, typename std::enable_if<QTypeInfo<T>::isIntegral, T>::type operand) noexcept
- {
- BaseClass::releaseMemoryFence(_q_value);
- return BaseClass::fetchAndXorRelaxed(_q_value, operand);
- }
-
- template <typename T> static Q_ALWAYS_INLINE
- T fetchAndXorOrdered(T &_q_value, typename std::enable_if<QTypeInfo<T>::isIntegral, T>::type operand) noexcept
- {
- BaseClass::orderedMemoryFence(_q_value);
- return BaseClass::fetchAndXorRelaxed(_q_value, operand);
- }
-};
-
QT_END_NAMESPACE
#endif // QGENERICATOMIC_H
diff --git a/src/corelib/thread/qlocking_p.h b/src/corelib/thread/qlocking_p.h
index 5fb80454df..9fa7e70da9 100644
--- a/src/corelib/thread/qlocking_p.h
+++ b/src/corelib/thread/qlocking_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2019 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2019 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QLOCKING_P_H
#define QLOCKING_P_H
@@ -44,15 +8,15 @@
// W A R N I N G
// -------------
//
-// This file is not part of the Qt API. It exists for the convenience
-// of qmutex.cpp, qmutex_unix.cpp, and qmutex_win.cpp. This header
-// file may change from version to version without notice, or even be
-// removed.
+// This file is not part of the Qt API. It exists for the convenience of
+// qmutex.cpp and qmutex_unix.cpp. This header file may change from version to
+// version without notice, or even be removed.
//
// We mean it.
//
#include <QtCore/qmutex.h>
+#include <QtCore/private/qglobal_p.h>
#include <mutex>
diff --git a/src/corelib/thread/qmutex.cpp b/src/corelib/thread/qmutex.cpp
index ba97ef8a42..ec6c711a4f 100644
--- a/src/corelib/thread/qmutex.cpp
+++ b/src/corelib/thread/qmutex.cpp
@@ -1,50 +1,13 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2016 Intel Corporation.
-** Copyright (C) 2012 Olivier Goffart <ogoffart@woboq.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2016 Intel Corporation.
+// Copyright (C) 2012 Olivier Goffart <ogoffart@woboq.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "global/qglobal.h"
#include "qplatformdefs.h"
#include "qmutex.h"
#include <qdebug.h>
#include "qatomic.h"
-#include "qelapsedtimer.h"
#include "qfutex_p.h"
#include "qthread.h"
#include "qmutex_p.h"
@@ -182,6 +145,23 @@ void QBasicMutex::destroyInternal(QMutexPrivate *d)
\sa lock(), unlock()
*/
+/*! \fn bool QMutex::tryLock(QDeadlineTimer timer)
+ \since 6.6
+
+ Attempts to lock the mutex. This function returns \c true if the lock
+ was obtained; otherwise it returns \c false. If another thread has
+ locked the mutex, this function will wait until \a timer expires
+ for the mutex to become available.
+
+ If the lock was obtained, the mutex must be unlocked with unlock()
+ before another thread can successfully lock it.
+
+ Calling this function multiple times on the same mutex from the
+ same thread will cause a \e dead-lock.
+
+ \sa lock(), unlock()
+*/
+
/*! \fn bool QMutex::tryLock()
\overload
@@ -315,6 +295,8 @@ QRecursiveMutex::~QRecursiveMutex()
*/
/*!
+ \fn QRecursiveMutex::tryLock(int timeout)
+
Attempts to lock the mutex. This function returns \c true if the lock
was obtained; otherwise it returns \c false. If another thread has
locked the mutex, this function will wait for at most \a timeout
@@ -332,16 +314,37 @@ QRecursiveMutex::~QRecursiveMutex()
\sa lock(), unlock()
*/
-bool QRecursiveMutex::tryLock(int timeout) QT_MUTEX_LOCK_NOEXCEPT
+
+/*!
+ \since 6.6
+
+ Attempts to lock the mutex. This function returns \c true if the lock
+ was obtained; otherwise it returns \c false. If another thread has
+ locked the mutex, this function will wait until \a timeout expires
+ for the mutex to become available.
+
+ If the lock was obtained, the mutex must be unlocked with unlock()
+ before another thread can successfully lock it.
+
+ Calling this function multiple times on the same mutex from the
+ same thread is allowed.
+
+ \sa lock(), unlock()
+*/
+bool QRecursiveMutex::tryLock(QDeadlineTimer timeout) QT_MUTEX_LOCK_NOEXCEPT
{
+ unsigned tsanFlags = QtTsan::MutexWriteReentrant | QtTsan::TryLock;
+ QtTsan::mutexPreLock(this, tsanFlags);
+
Qt::HANDLE self = QThread::currentThreadId();
if (owner.loadRelaxed() == self) {
++count;
Q_ASSERT_X(count != 0, "QMutex::lock", "Overflow in recursion counter");
+ QtTsan::mutexPostLock(this, tsanFlags, 0);
return true;
}
bool success = true;
- if (timeout == -1) {
+ if (timeout.isForever()) {
mutex.lock();
} else {
success = mutex.tryLock(timeout);
@@ -349,6 +352,11 @@ bool QRecursiveMutex::tryLock(int timeout) QT_MUTEX_LOCK_NOEXCEPT
if (success)
owner.storeRelaxed(self);
+ else
+ tsanFlags |= QtTsan::TryLockFailed;
+
+ QtTsan::mutexPostLock(this, tsanFlags, 0);
+
return success;
}
@@ -412,6 +420,7 @@ bool QRecursiveMutex::tryLock(int timeout) QT_MUTEX_LOCK_NOEXCEPT
void QRecursiveMutex::unlock() noexcept
{
Q_ASSERT(owner.loadRelaxed() == QThread::currentThreadId());
+ QtTsan::mutexPreUnlock(this, 0u);
if (count > 0) {
count--;
@@ -419,6 +428,8 @@ void QRecursiveMutex::unlock() noexcept
owner.storeRelaxed(nullptr);
mutex.unlock();
}
+
+ QtTsan::mutexPostUnlock(this, 0u);
}
@@ -486,6 +497,40 @@ void QRecursiveMutex::unlock() noexcept
*/
/*!
+ \fn template <typename Mutex> QMutexLocker<Mutex>::QMutexLocker(QMutexLocker &&other) noexcept
+ \since 6.4
+
+ Move-constructs a QMutexLocker from \a other. The mutex and the
+ state of \a other is transferred to the newly constructed instance.
+ After the move, \a other will no longer be managing any mutex.
+
+ \sa QMutex::lock()
+*/
+
+/*!
+ \fn template <typename Mutex> QMutexLocker<Mutex> &QMutexLocker<Mutex>::operator=(QMutexLocker &&other) noexcept
+ \since 6.4
+
+ Move-assigns \a other onto this QMutexLocker. If this QMutexLocker
+ was holding a locked mutex before the assignment, the mutex will be
+ unlocked. The mutex and the state of \a other is then transferred
+ to this QMutexLocker. After the move, \a other will no longer be
+ managing any mutex.
+
+ \sa QMutex::lock()
+*/
+
+/*!
+ \fn template <typename Mutex> void QMutexLocker<Mutex>::swap(QMutexLocker &other) noexcept
+ \since 6.4
+
+ Swaps the mutex and the state of this QMutexLocker with \a other.
+ This operation is very fast and never fails.
+
+ \sa QMutex::lock()
+*/
+
+/*!
\fn template <typename Mutex> QMutexLocker<Mutex>::~QMutexLocker() noexcept
Destroys the QMutexLocker and unlocks the mutex that was locked
@@ -495,6 +540,14 @@ void QRecursiveMutex::unlock() noexcept
*/
/*!
+ \fn template <typename Mutex> bool QMutexLocker<Mutex>::isLocked() const noexcept
+ \since 6.4
+
+ Returns true if this QMutexLocker is currently locking its associated
+ mutex, or false otherwise.
+*/
+
+/*!
\fn template <typename Mutex> void QMutexLocker<Mutex>::unlock() noexcept
Unlocks this mutex locker. You can use \c relock() to lock
@@ -604,27 +657,38 @@ void QBasicMutex::lockInternal() QT_MUTEX_LOCK_NOEXCEPT
/*!
\internal helper for lock(int)
*/
+#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0)
bool QBasicMutex::lockInternal(int timeout) QT_MUTEX_LOCK_NOEXCEPT
{
if (timeout == 0)
return false;
+ return lockInternal(QDeadlineTimer(timeout));
+}
+#endif
+
+/*!
+ \internal helper for tryLock(QDeadlineTimer)
+ */
+bool QBasicMutex::lockInternal(QDeadlineTimer deadlineTimer) QT_MUTEX_LOCK_NOEXCEPT
+{
+ if (deadlineTimer.hasExpired())
+ return false;
+
if (futexAvailable()) {
- if (Q_UNLIKELY(timeout < 0)) {
+ if (Q_UNLIKELY(deadlineTimer.isForever())) {
lockInternal();
return true;
}
- QDeadlineTimer deadlineTimer(timeout);
// The mutex is already locked, set a bit indicating we're waiting.
// Note we must set to dummyFutexValue because there could be other threads
// also waiting.
if (d_ptr.fetchAndStoreAcquire(dummyFutexValue()) == nullptr)
return true;
- qint64 remainingTime = deadlineTimer.remainingTimeNSecs();
- Q_FOREVER {
- if (!futexWait(d_ptr, dummyFutexValue(), remainingTime))
+ for (;;) {
+ if (!futexWait(d_ptr, dummyFutexValue(), deadlineTimer))
return false;
// We got woken up, so must try to acquire the mutex. We must set
@@ -633,9 +697,7 @@ bool QBasicMutex::lockInternal(int timeout) QT_MUTEX_LOCK_NOEXCEPT
if (d_ptr.fetchAndStoreAcquire(dummyFutexValue()) == nullptr)
return true;
- // calculate the remaining time
- remainingTime = deadlineTimer.remainingTimeNSecs();
- if (remainingTime <= 0)
+ if (deadlineTimer.hasExpired())
return false;
}
}
@@ -647,7 +709,7 @@ bool QBasicMutex::lockInternal(int timeout) QT_MUTEX_LOCK_NOEXCEPT
continue;
if (copy == dummyLocked()) {
- if (timeout == 0)
+ if (deadlineTimer.hasExpired())
return false;
// The mutex is locked but does not have a QMutexPrivate yet.
// we need to allocate a QMutexPrivate
@@ -662,7 +724,7 @@ bool QBasicMutex::lockInternal(int timeout) QT_MUTEX_LOCK_NOEXCEPT
}
QMutexPrivate *d = static_cast<QMutexPrivate *>(copy);
- if (timeout == 0 && !d->possiblyUnlocked.loadRelaxed())
+ if (deadlineTimer.hasExpired() && !d->possiblyUnlocked.loadRelaxed())
return false;
// At this point we have a pointer to a QMutexPrivate. But the other thread
@@ -715,7 +777,7 @@ bool QBasicMutex::lockInternal(int timeout) QT_MUTEX_LOCK_NOEXCEPT
continue;
}
- if (d->wait(timeout)) {
+ if (d->wait(deadlineTimer)) {
// reset the possiblyUnlocked flag if needed (and deref its corresponding reference)
if (d->possiblyUnlocked.loadRelaxed() && d->possiblyUnlocked.testAndSetRelaxed(true, false))
d->deref();
@@ -724,8 +786,7 @@ bool QBasicMutex::lockInternal(int timeout) QT_MUTEX_LOCK_NOEXCEPT
Q_ASSERT(d == d_ptr.loadRelaxed());
return true;
} else {
- Q_ASSERT(timeout >= 0);
- //timeout
+ // timed out
d->derefWaiters(1);
//There may be a race in which the mutex is unlocked right after we timed out,
// and before we deref the waiters, so maybe the mutex is actually unlocked.
@@ -793,7 +854,7 @@ struct FreeListConstants : QFreeListDefaultConstants {
enum { BlockCount = 4, MaxIndex=0xffff };
static const int Sizes[BlockCount];
};
-const int FreeListConstants::Sizes[FreeListConstants::BlockCount] = {
+Q_CONSTINIT const int FreeListConstants::Sizes[FreeListConstants::BlockCount] = {
16,
128,
1024,
@@ -802,7 +863,7 @@ const int FreeListConstants::Sizes[FreeListConstants::BlockCount] = {
typedef QFreeList<QMutexPrivate, FreeListConstants> FreeList;
// We cannot use Q_GLOBAL_STATIC because it uses QMutex
-static FreeList freeList_;
+Q_CONSTINIT static FreeList freeList_;
FreeList *freelist()
{
return &freeList_;
@@ -847,12 +908,10 @@ void QMutexPrivate::derefWaiters(int value) noexcept
QT_END_NAMESPACE
-#if defined(Q_OS_LINUX) && defined(QT_ALWAYS_USE_FUTEX)
+#if defined(QT_ALWAYS_USE_FUTEX)
// nothing
-#elif defined(Q_OS_MAC)
+#elif defined(Q_OS_DARWIN)
# include "qmutex_mac.cpp"
-#elif defined(Q_OS_WIN)
-# include "qmutex_win.cpp"
#else
# include "qmutex_unix.cpp"
#endif
diff --git a/src/corelib/thread/qmutex.h b/src/corelib/thread/qmutex.h
index 19463da619..743b86939e 100644
--- a/src/corelib/thread/qmutex.h
+++ b/src/corelib/thread/qmutex.h
@@ -1,62 +1,21 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QMUTEX_H
#define QMUTEX_H
#include <QtCore/qglobal.h>
#include <QtCore/qatomic.h>
-#include <new>
+#include <QtCore/qdeadlinetimer.h>
+#include <QtCore/qtsan_impl.h>
-#if __has_include(<chrono>)
-# include <chrono>
-# include <limits>
-#endif
-
-class tst_QMutex;
+#include <chrono>
QT_BEGIN_NAMESPACE
+#if QT_CONFIG(thread) || defined(Q_QDOC)
-#if QT_CONFIG(thread) || defined(Q_CLANG_QDOC)
-
-#ifdef Q_OS_LINUX
+#if defined(Q_OS_LINUX) || defined(Q_OS_WIN) // these platforms use futex
# define QT_MUTEX_LOCK_NOEXCEPT noexcept
#else
# define QT_MUTEX_LOCK_NOEXCEPT
@@ -66,34 +25,6 @@ class QMutex;
class QRecursiveMutex;
class QMutexPrivate;
-#if __has_include(<chrono>)
-namespace QtPrivate
-{
- template<class Rep, class Period>
- static int convertToMilliseconds(std::chrono::duration<Rep, Period> duration)
- {
- // N4606 § 30.4.1.3.5 [thread.timedmutex.requirements] specifies that a
- // duration less than or equal to duration.zero() shall result in a
- // try_lock, unlike QMutex's tryLock with a negative duration which
- // results in a lock.
-
- if (duration <= duration.zero())
- return 0;
-
- // when converting from 'duration' to milliseconds, make sure that
- // the result is not shorter than 'duration':
- std::chrono::milliseconds wait = std::chrono::duration_cast<std::chrono::milliseconds>(duration);
- if (wait < duration)
- wait += std::chrono::milliseconds(1);
- Q_ASSERT(wait >= duration);
- const auto ms = wait.count();
- const auto maxInt = (std::numeric_limits<int>::max)();
-
- return ms < maxInt ? int(ms) : maxInt;
- }
-}
-#endif
-
class Q_CORE_EXPORT QBasicMutex
{
Q_DISABLE_COPY_MOVE(QBasicMutex)
@@ -104,26 +35,47 @@ public:
// BasicLockable concept
inline void lock() QT_MUTEX_LOCK_NOEXCEPT {
+ QtTsan::mutexPreLock(this, 0u);
+
if (!fastTryLock())
lockInternal();
+
+ QtTsan::mutexPostLock(this, 0u, 0);
}
// BasicLockable concept
inline void unlock() noexcept {
Q_ASSERT(d_ptr.loadRelaxed()); //mutex must be locked
+
+ QtTsan::mutexPreUnlock(this, 0u);
+
if (!fastTryUnlock())
unlockInternal();
+
+ QtTsan::mutexPostUnlock(this, 0u);
}
bool tryLock() noexcept {
- return fastTryLock();
+ unsigned tsanFlags = QtTsan::TryLock;
+ QtTsan::mutexPreLock(this, tsanFlags);
+
+ const bool success = fastTryLock();
+
+ if (!success)
+ tsanFlags |= QtTsan::TryLockFailed;
+ QtTsan::mutexPostLock(this, tsanFlags, 0);
+
+ return success;
}
// Lockable concept
bool try_lock() noexcept { return tryLock(); }
private:
- inline bool fastTryLock() noexcept {
+ inline bool fastTryLock() noexcept
+ {
+ if (d_ptr.loadRelaxed() != nullptr)
+ return false;
return d_ptr.testAndSetAcquire(nullptr, dummyLocked());
}
inline bool fastTryUnlock() noexcept {
@@ -131,7 +83,10 @@ private:
}
void lockInternal() QT_MUTEX_LOCK_NOEXCEPT;
+ bool lockInternal(QDeadlineTimer timeout) QT_MUTEX_LOCK_NOEXCEPT;
+#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0)
bool lockInternal(int timeout) QT_MUTEX_LOCK_NOEXCEPT;
+#endif
void unlockInternal() noexcept;
void destroyInternal(QMutexPrivate *d);
@@ -168,26 +123,42 @@ public:
using QBasicMutex::tryLock;
bool tryLock(int timeout) QT_MUTEX_LOCK_NOEXCEPT
{
- if (fastTryLock())
- return true;
- return lockInternal(timeout);
+ return tryLock(QDeadlineTimer(timeout));
+ }
+
+ bool tryLock(QDeadlineTimer timeout) QT_MUTEX_LOCK_NOEXCEPT
+ {
+ unsigned tsanFlags = QtTsan::TryLock;
+ QtTsan::mutexPreLock(this, tsanFlags);
+
+ bool success = fastTryLock();
+
+ if (success) {
+ QtTsan::mutexPostLock(this, tsanFlags, 0);
+ return success;
+ }
+
+ success = lockInternal(timeout);
+
+ if (!success)
+ tsanFlags |= QtTsan::TryLockFailed;
+ QtTsan::mutexPostLock(this, tsanFlags, 0);
+
+ return success;
}
// TimedLockable concept
template <class Rep, class Period>
bool try_lock_for(std::chrono::duration<Rep, Period> duration)
{
- return tryLock(QtPrivate::convertToMilliseconds(duration));
+ return tryLock(QDeadlineTimer(duration));
}
// TimedLockable concept
template<class Clock, class Duration>
bool try_lock_until(std::chrono::time_point<Clock, Duration> timePoint)
{
- // Implemented in terms of try_lock_for to honor the similar
- // requirement in N4606 § 30.4.1.3 [thread.timedmutex.requirements]/12.
-
- return try_lock_for(timePoint - Clock::now());
+ return tryLock(QDeadlineTimer(timePoint));
}
};
@@ -208,8 +179,10 @@ public:
// BasicLockable concept
void lock() QT_MUTEX_LOCK_NOEXCEPT
- { tryLock(-1); }
- bool tryLock(int timeout = 0) QT_MUTEX_LOCK_NOEXCEPT;
+ { tryLock(QDeadlineTimer(QDeadlineTimer::Forever)); }
+ QT_CORE_INLINE_SINCE(6, 6)
+ bool tryLock(int timeout) QT_MUTEX_LOCK_NOEXCEPT;
+ bool tryLock(QDeadlineTimer timer = {}) QT_MUTEX_LOCK_NOEXCEPT;
// BasicLockable concept
void unlock() noexcept;
@@ -220,66 +193,89 @@ public:
template <class Rep, class Period>
bool try_lock_for(std::chrono::duration<Rep, Period> duration)
{
- return tryLock(QtPrivate::convertToMilliseconds(duration));
+ return tryLock(QDeadlineTimer(duration));
}
// TimedLockable concept
template<class Clock, class Duration>
bool try_lock_until(std::chrono::time_point<Clock, Duration> timePoint)
{
- // Implemented in terms of try_lock_for to honor the similar
- // requirement in N4606 § 30.4.1.3 [thread.timedmutex.requirements]/12.
-
- return try_lock_for(timePoint - Clock::now());
+ return tryLock(QDeadlineTimer(timePoint));
}
};
+#if QT_CORE_INLINE_IMPL_SINCE(6, 6)
+bool QRecursiveMutex::tryLock(int timeout) QT_MUTEX_LOCK_NOEXCEPT
+{
+ return tryLock(QDeadlineTimer(timeout));
+}
+#endif
+
template <typename Mutex>
-class [[nodiscard]] QMutexLocker
+class QMutexLocker
{
public:
+ Q_NODISCARD_CTOR
inline explicit QMutexLocker(Mutex *mutex) QT_MUTEX_LOCK_NOEXCEPT
{
- m = mutex;
+ m_mutex = mutex;
if (Q_LIKELY(mutex)) {
mutex->lock();
- isLocked = true;
+ m_isLocked = true;
}
}
- inline ~QMutexLocker() {
- unlock();
+
+ Q_NODISCARD_CTOR
+ inline QMutexLocker(QMutexLocker &&other) noexcept
+ : m_mutex(std::exchange(other.m_mutex, nullptr)),
+ m_isLocked(std::exchange(other.m_isLocked, false))
+ {}
+
+ QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_MOVE_AND_SWAP(QMutexLocker)
+
+ inline ~QMutexLocker()
+ {
+ if (m_isLocked)
+ unlock();
+ }
+
+ inline bool isLocked() const noexcept
+ {
+ return m_isLocked;
}
inline void unlock() noexcept
{
- if (!isLocked)
- return;
- m->unlock();
- isLocked = false;
+ Q_ASSERT(m_isLocked);
+ m_mutex->unlock();
+ m_isLocked = false;
}
inline void relock() QT_MUTEX_LOCK_NOEXCEPT
{
- if (isLocked)
- return;
- if (m) {
- m->lock();
- isLocked = true;
- }
+ Q_ASSERT(!m_isLocked);
+ m_mutex->lock();
+ m_isLocked = true;
+ }
+
+ inline void swap(QMutexLocker &other) noexcept
+ {
+ qt_ptr_swap(m_mutex, other.m_mutex);
+ std::swap(m_isLocked, other.m_isLocked);
}
Mutex *mutex() const
{
- return m;
+ return m_mutex;
}
private:
Q_DISABLE_COPY(QMutexLocker)
- Mutex *m;
- bool isLocked = false;
+ Mutex *m_mutex;
+ bool m_isLocked = false;
};
-#else // !QT_CONFIG(thread) && !Q_CLANG_QDOC
+#else // !QT_CONFIG(thread) && !Q_QDOC
class QMutex
{
@@ -313,9 +309,10 @@ private:
class QRecursiveMutex : public QMutex {};
template <typename Mutex>
-class [[nodiscard]] QMutexLocker
+class QMutexLocker
{
public:
+ Q_NODISCARD_CTOR
inline explicit QMutexLocker(Mutex *) noexcept {}
inline ~QMutexLocker() noexcept {}
@@ -329,7 +326,7 @@ private:
typedef QMutex QBasicMutex;
-#endif // !QT_CONFIG(thread) && !Q_CLANG_QDOC
+#endif // !QT_CONFIG(thread) && !Q_QDOC
QT_END_NAMESPACE
diff --git a/src/corelib/thread/qmutex_mac.cpp b/src/corelib/thread/qmutex_mac.cpp
index 923f89f697..7849133e58 100644
--- a/src/corelib/thread/qmutex_mac.cpp
+++ b/src/corelib/thread/qmutex_mac.cpp
@@ -1,46 +1,12 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qplatformdefs.h"
#include "qmutex.h"
#include "qmutex_p.h"
+#include "private/qcore_unix_p.h"
+
#include <mach/mach.h>
#include <mach/task.h>
@@ -62,18 +28,19 @@ QMutexPrivate::~QMutexPrivate()
qWarning("QMutex: failed to destroy semaphore, error %d", r);
}
-bool QMutexPrivate::wait(int timeout)
+bool QMutexPrivate::wait(QDeadlineTimer timeout)
{
kern_return_t r;
- if (timeout < 0) {
+ if (timeout.isForever()) {
do {
r = semaphore_wait(mach_semaphore);
} while (r == KERN_ABORTED);
Q_ASSERT(r == KERN_SUCCESS);
} else {
+ timespec tv = durationToTimespec(timeout.remainingTimeAsDuration());
mach_timespec_t ts;
- ts.tv_nsec = ((timeout % 1000) * 1000) * 1000;
- ts.tv_sec = (timeout / 1000);
+ ts.tv_nsec = tv.tv_nsec;
+ ts.tv_sec = tv.tv_sec;
r = semaphore_timedwait(mach_semaphore, ts);
}
return (r == KERN_SUCCESS);
diff --git a/src/corelib/thread/qmutex_p.h b/src/corelib/thread/qmutex_p.h
index b7d0bdab9b..aabb66fa55 100644
--- a/src/corelib/thread/qmutex_p.h
+++ b/src/corelib/thread/qmutex_p.h
@@ -1,43 +1,7 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2016 Intel Corporation.
-** Copyright (C) 2012 Olivier Goffart <ogoffart@woboq.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2016 Intel Corporation.
+// Copyright (C) 2012 Olivier Goffart <ogoffart@woboq.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QMUTEX_P_H
#define QMUTEX_P_H
@@ -46,10 +10,9 @@
// W A R N I N G
// -------------
//
-// This file is not part of the Qt API. It exists for the convenience
-// of qmutex.cpp, qmutex_unix.cpp, and qmutex_win.cpp. This header
-// file may change from version to version without notice, or even be
-// removed.
+// This file is not part of the Qt API. It exists for the convenience of
+// qmutex.cpp and qmutex_unix.cpp. This header file may change from version to
+// version without notice, or even be removed.
//
// We mean it.
//
@@ -60,26 +23,27 @@
#include <QtCore/qatomic.h>
#include <QtCore/qdeadlinetimer.h>
-#if defined(Q_OS_MAC)
+#include "qplatformdefs.h" // _POSIX_VERSION
+
+#if defined(Q_OS_DARWIN)
# include <mach/semaphore.h>
#elif defined(Q_OS_UNIX)
-# if _POSIX_VERSION-0 >= 200112L || _XOPEN_VERSION-0 >= 600
# include <semaphore.h>
-# define QT_UNIX_SEMAPHORE
-# endif
#endif
struct timespec;
QT_BEGIN_NAMESPACE
+// We manipulate the pointer to this class in inline, atomic code,
+// so syncqt mustn't mark them as private, so ELFVERSION:ignore-next
class QMutexPrivate
{
public:
~QMutexPrivate();
QMutexPrivate();
- bool wait(int timeout = -1);
+ bool wait(QDeadlineTimer timeout = QDeadlineTimer::Forever);
void wakeUp() noexcept;
// Control the lifetime of the privates
@@ -118,27 +82,13 @@ public:
void derefWaiters(int value) noexcept;
//platform specific stuff
-#if defined(Q_OS_MAC)
+#if defined(Q_OS_DARWIN)
semaphore_t mach_semaphore;
-#elif defined(QT_UNIX_SEMAPHORE)
- sem_t semaphore;
#elif defined(Q_OS_UNIX)
- bool wakeup;
- pthread_mutex_t mutex;
- pthread_cond_t cond;
-#elif defined(Q_OS_WIN)
- Qt::HANDLE event;
+ sem_t semaphore;
#endif
};
-
-#ifdef Q_OS_UNIX
-// helper functions for qmutex_unix.cpp and qwaitcondition_unix.cpp
-// they are in qwaitcondition_unix.cpp actually
-void qt_initialize_pthread_cond(pthread_cond_t *cond, const char *where);
-void qt_abstime_for_timeout(struct timespec *ts, QDeadlineTimer deadline);
-#endif
-
QT_END_NAMESPACE
#endif // QMUTEX_P_H
diff --git a/src/corelib/thread/qmutex_unix.cpp b/src/corelib/thread/qmutex_unix.cpp
index df2f606a23..4d01deb7d4 100644
--- a/src/corelib/thread/qmutex_unix.cpp
+++ b/src/corelib/thread/qmutex_unix.cpp
@@ -1,47 +1,10 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2015 Olivier Goffart <ogoffart@woboq.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2015 Olivier Goffart <ogoffart@woboq.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qplatformdefs.h"
#include "qmutex.h"
#include "qstring.h"
-#include "qelapsedtimer.h"
#include "qatomic.h"
#include "qmutex_p.h"
#include <errno.h>
@@ -55,105 +18,48 @@
QT_BEGIN_NAMESPACE
-static void report_error(int code, const char *where, const char *what)
+static void qt_report_error(int code, const char *where, const char *what)
{
if (code != 0)
qErrnoWarning(code, "%s: %s failure", where, what);
}
-#ifdef QT_UNIX_SEMAPHORE
-
QMutexPrivate::QMutexPrivate()
{
- report_error(sem_init(&semaphore, 0, 0), "QMutex", "sem_init");
+ qt_report_error(sem_init(&semaphore, 0, 0), "QMutex", "sem_init");
}
QMutexPrivate::~QMutexPrivate()
{
- report_error(sem_destroy(&semaphore), "QMutex", "sem_destroy");
+ qt_report_error(sem_destroy(&semaphore), "QMutex", "sem_destroy");
}
-bool QMutexPrivate::wait(int timeout)
+bool QMutexPrivate::wait(QDeadlineTimer timeout)
{
int errorCode;
- if (timeout < 0) {
+ if (timeout.isForever()) {
do {
errorCode = sem_wait(&semaphore);
} while (errorCode && errno == EINTR);
- report_error(errorCode, "QMutex::lock()", "sem_wait");
+ qt_report_error(errorCode, "QMutex::lock()", "sem_wait");
} else {
- timespec ts;
- report_error(clock_gettime(CLOCK_REALTIME, &ts), "QMutex::lock()", "clock_gettime");
- ts.tv_sec += timeout / 1000;
- ts.tv_nsec += timeout % 1000 * Q_UINT64_C(1000) * 1000;
- normalizedTimespec(ts);
do {
+ auto tp = timeout.deadline<std::chrono::system_clock>();
+ timespec ts = durationToTimespec(tp.time_since_epoch());
errorCode = sem_timedwait(&semaphore, &ts);
} while (errorCode && errno == EINTR);
if (errorCode && errno == ETIMEDOUT)
return false;
- report_error(errorCode, "QMutex::lock()", "sem_timedwait");
+ qt_report_error(errorCode, "QMutex::lock()", "sem_timedwait");
}
return true;
}
void QMutexPrivate::wakeUp() noexcept
{
- report_error(sem_post(&semaphore), "QMutex::unlock", "sem_post");
-}
-
-#else // QT_UNIX_SEMAPHORE
-
-QMutexPrivate::QMutexPrivate()
- : wakeup(false)
-{
- report_error(pthread_mutex_init(&mutex, NULL), "QMutex", "mutex init");
- qt_initialize_pthread_cond(&cond, "QMutex");
-}
-
-QMutexPrivate::~QMutexPrivate()
-{
- report_error(pthread_cond_destroy(&cond), "QMutex", "cv destroy");
- report_error(pthread_mutex_destroy(&mutex), "QMutex", "mutex destroy");
-}
-
-bool QMutexPrivate::wait(int timeout)
-{
- report_error(pthread_mutex_lock(&mutex), "QMutex::lock", "mutex lock");
- int errorCode = 0;
- while (!wakeup) {
- if (timeout < 0) {
- errorCode = pthread_cond_wait(&cond, &mutex);
- } else {
- timespec ti;
- qt_abstime_for_timeout(&ti, QDeadlineTimer(timeout));
- errorCode = pthread_cond_timedwait(&cond, &mutex, &ti);
- }
- if (errorCode) {
- if (errorCode == ETIMEDOUT) {
- if (wakeup)
- errorCode = 0;
- break;
- }
- report_error(errorCode, "QMutex::lock()", "cv wait");
- }
- }
- bool ret = wakeup;
- wakeup = false;
- report_error(pthread_mutex_unlock(&mutex), "QMutex::lock", "mutex unlock");
- return ret;
-}
-
-void QMutexPrivate::wakeUp() noexcept
-{
- report_error(pthread_mutex_lock(&mutex), "QMutex::unlock", "mutex lock");
- wakeup = true;
- report_error(pthread_cond_signal(&cond), "QMutex::unlock", "cv signal");
- report_error(pthread_mutex_unlock(&mutex), "QMutex::unlock", "mutex unlock");
+ qt_report_error(sem_post(&semaphore), "QMutex::unlock", "sem_post");
}
-#endif
-
QT_END_NAMESPACE
diff --git a/src/corelib/thread/qmutex_win.cpp b/src/corelib/thread/qmutex_win.cpp
deleted file mode 100644
index cf863aeebc..0000000000
--- a/src/corelib/thread/qmutex_win.cpp
+++ /dev/null
@@ -1,66 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qmutex.h"
-#include <qatomic.h>
-#include "qmutex_p.h"
-#include <qt_windows.h>
-
-QT_BEGIN_NAMESPACE
-
-QMutexPrivate::QMutexPrivate()
-{
- event = CreateEvent(0, FALSE, FALSE, 0);
-
- if (!event)
- qWarning("QMutexPrivate::QMutexPrivate: Cannot create event");
-}
-
-QMutexPrivate::~QMutexPrivate()
-{ CloseHandle(event); }
-
-bool QMutexPrivate::wait(int timeout)
-{
- return (WaitForSingleObjectEx(event, timeout < 0 ? INFINITE : timeout, FALSE) == WAIT_OBJECT_0);
-}
-
-void QMutexPrivate::wakeUp() noexcept
-{ SetEvent(event); }
-
-QT_END_NAMESPACE
diff --git a/src/corelib/thread/qorderedmutexlocker_p.h b/src/corelib/thread/qorderedmutexlocker_p.h
index dfa45472ca..fb2e223e01 100644
--- a/src/corelib/thread/qorderedmutexlocker_p.h
+++ b/src/corelib/thread/qorderedmutexlocker_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QORDEREDMUTEXLOCKER_P_H
#define QORDEREDMUTEXLOCKER_P_H
@@ -67,6 +31,7 @@ QT_BEGIN_NAMESPACE
class QOrderedMutexLocker
{
public:
+ Q_NODISCARD_CTOR
QOrderedMutexLocker(QBasicMutex *m1, QBasicMutex *m2)
: mtx1((m1 == m2) ? m1 : (std::less<QBasicMutex *>()(m1, m2) ? m1 : m2)),
mtx2((m1 == m2) ? nullptr : (std::less<QBasicMutex *>()(m1, m2) ? m2 : m1)),
@@ -86,6 +51,7 @@ public:
QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_MOVE_AND_SWAP(QOrderedMutexLocker)
+ Q_NODISCARD_CTOR
QOrderedMutexLocker(QOrderedMutexLocker &&other) noexcept
: mtx1(std::exchange(other.mtx1, nullptr))
, mtx2(std::exchange(other.mtx2, nullptr))
@@ -152,42 +118,15 @@ private:
bool locked;
};
-class QBasicMutexLocker
-{
-public:
- inline explicit QBasicMutexLocker(QBasicMutex *m) QT_MUTEX_LOCK_NOEXCEPT
- : m(m), isLocked(true)
- {
- m->lock();
- }
- inline ~QBasicMutexLocker() { if (isLocked) unlock(); }
-
- inline void unlock() noexcept
- {
- isLocked = false;
- m->unlock();
- }
-
- inline void relock() QT_MUTEX_LOCK_NOEXCEPT
- {
- isLocked = true;
- m->lock();
- }
-
-private:
- Q_DISABLE_COPY(QBasicMutexLocker)
-
- QBasicMutex *m;
- bool isLocked;
-};
-
#else
class QOrderedMutexLocker
{
public:
Q_DISABLE_COPY(QOrderedMutexLocker)
+ Q_NODISCARD_CTOR
QOrderedMutexLocker(QBasicMutex *, QBasicMutex *) {}
+ Q_NODISCARD_CTOR
QOrderedMutexLocker(QOrderedMutexLocker &&) = default;
QOrderedMutexLocker& operator=(QOrderedMutexLocker &&other) = default;
~QOrderedMutexLocker() {}
@@ -199,8 +138,6 @@ public:
static bool relock(QBasicMutex *, QBasicMutex *) { return false; }
};
-using QBasicMutexLocker = QMutexLocker<QBasicMutex>;
-
#endif
diff --git a/src/corelib/thread/qpromise.h b/src/corelib/thread/qpromise.h
index 3cecbd8306..c2b6c119ae 100644
--- a/src/corelib/thread/qpromise.h
+++ b/src/corelib/thread/qpromise.h
@@ -1,47 +1,11 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QPROMISE_H
#define QPROMISE_H
#include <QtCore/qglobal.h>
-#include <QtCore/qfuture.h>
+#include <QtCore/qfutureinterface.h>
#include <utility>
@@ -49,6 +13,13 @@ QT_REQUIRE_CONFIG(future);
QT_BEGIN_NAMESPACE
+namespace QtPrivate {
+
+template<class T, class U>
+using EnableIfSameOrConvertible = std::enable_if_t<std::is_convertible_v<T, U>>;
+
+} // namespace QtPrivate
+
template<typename T>
class QPromise
{
@@ -64,23 +35,34 @@ public:
QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_MOVE_AND_SWAP(QPromise)
~QPromise()
{
- const int state = d.loadState();
- // If QFutureInterface has no state, there is nothing to be done
- if (state == static_cast<int>(QFutureInterfaceBase::State::NoState))
- return;
- // Otherwise, if computation is not finished at this point, cancel
+ // If computation is not finished at this point, cancel
// potential waits
- if (!(state & QFutureInterfaceBase::State::Finished))
+ if (d.d && !(d.loadState() & QFutureInterfaceBase::State::Finished)) {
d.cancelAndFinish(); // cancel and finalize the state
+ d.runContinuation();
+ }
+ d.cleanContinuation();
}
// Core QPromise APIs
QFuture<T> future() const { return d.future(); }
- template<typename U, typename = QtPrivate::EnableIfSameOrConvertible<U, T>>
+ template<typename...Args, std::enable_if_t<std::is_constructible_v<T, Args...>, bool> = true>
+ bool emplaceResultAt(int index, Args&&...args)
+ {
+ return d.reportAndEmplaceResult(index, std::forward<Args>(args)...);
+ }
+ template<typename...Args, std::enable_if_t<std::is_constructible_v<T, Args...>, bool> = true>
+ bool emplaceResult(Args&&...args)
+ {
+ return d.reportAndEmplaceResult(-1, std::forward<Args>(args)...);
+ }
+ template<typename U = T, typename = QtPrivate::EnableIfSameOrConvertible<U, T>>
bool addResult(U &&result, int index = -1)
{
- return d.reportResult(std::forward<U>(result), index);
+ return d.reportAndEmplaceResult(index, std::forward<U>(result));
}
+ bool addResults(const QList<T> &result)
+ { return d.reportResults(result); }
#ifndef QT_NO_EXCEPTIONS
void setException(const QException &e) { d.reportException(e); }
#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0)
@@ -106,10 +88,10 @@ public:
void swap(QPromise<T> &other) noexcept
{
- qSwap(this->d, other.d);
+ d.swap(other.d);
}
-#if defined(Q_CLANG_QDOC) // documentation-only simplified signatures
+#if defined(Q_QDOC) // documentation-only simplified signatures
bool addResult(const T &result, int index = -1) { }
bool addResult(T &&result, int index = -1) { }
#endif
diff --git a/src/corelib/thread/qpromise.qdoc b/src/corelib/thread/qpromise.qdoc
index f9040d4cd1..e9c3eb4b7e 100644
--- a/src/corelib/thread/qpromise.qdoc
+++ b/src/corelib/thread/qpromise.qdoc
@@ -1,29 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*! \class QPromise
\inmodule QtCore
@@ -62,6 +38,8 @@
\snippet snippet_qpromise.cpp multithread_init
\codeline
\snippet snippet_qpromise.cpp multithread_main
+ \codeline
+ \snippet snippet_qpromise.cpp multithread_cleanup
\sa QFuture
*/
@@ -83,7 +61,9 @@
\internal
Constructs a QPromise with a passed QFutureInterface \a other.
- Used internally for QtConcurrent::runWithPromise.
+ Used internally for QtConcurrent::run(), when its callable takes
+ a reference to the associated promise as its first argument
+ (run with promise mode).
\sa operator=()
*/
@@ -111,15 +91,38 @@
/*! \fn template <typename T> bool QPromise<T>::addResult(const T &result, int index = -1)
\fn template <typename T> bool QPromise<T>::addResult(T &&result, int index = -1)
- Adds \a result to the internal result collection at \a index position. If
- index is unspecified, \a result is added to the end of the collection.
+ Same as
+ \code
+ emplaceResultAt(index, result); // first overload
+ emplaceResultAt(index, std::move(result)); // second overload
+ \endcode
+ or, if \c{index == -1} (the default)
+ \code
+ emplaceResult(result); // first overload
+ emplaceResult(std::move(result)); // second overload
+ \endcode
+
+ \sa emplaceResultAt(), emplaceResult(), addResults()
+*/
+
+/*!
+ \fn template <typename T> template <typename...Args, std::enable_if_t<std::is_constructible_v<T, Args...>, bool> = true> bool QPromise<T>::emplaceResultAt(int index, Args&&...args)
+ \fn template <typename T> template <typename...Args, std::enable_if_t<std::is_constructible_v<T, Args...>, bool> = true> bool QPromise<T>::emplaceResult(Args&&...args)
+ \since 6.6
+
+ Adds a result constructed from \a args... to the internal result collection
+ at \a index position (emplaceResultAt()) or the end of of the collection
+ (emplaceResult()).
- Returns \c true when \a result is added to the collection.
+ Returns \c true when the result was added to the collection.
Returns \c false when this promise is in canceled or finished state or when
- \a result is rejected. addResult() rejects \a result if there's already
+ the result was rejected. addResult() rejects to add a result if there's already
another result in the collection stored at the same index.
+ These functions only participate in overload resolutions if \c T is
+ constructible from \a args....
+
You can get a result at a specific index by calling QFuture::resultAt().
\note It is possible to specify an arbitrary index and request result at
@@ -127,6 +130,29 @@
For instance, iterative approaches that use QFuture::resultCount() or
QFuture::const_iterator. In order to get all available results without
thinking if there are index gaps or not, use QFuture::results().
+
+ \sa addResult(), addResults()
+*/
+
+/*!
+ \fn template <typename T> bool QPromise<T>::addResults(const QList<T> &results)
+ \since 6.6
+
+ Adds \a results at the end of the internal result collection.
+
+ Returns \c true when \a results are added to the collection.
+
+ Returns \c false when this promise is in canceled or finished state.
+
+ This is more efficient than looping over addResult(), because associated
+ futures will be notified only once per addResults() call, instead of once
+ per element contained in \a results, as would be the case with individual
+ addResult() calls. But if the calculation of each element takes time, then
+ the code on the receiving end (future) cannot make progress until all
+ results are reported, so use this function only if the calculation of
+ consecutive elements is relatively fast.
+
+ \sa addResult()
*/
/*! \fn template<typename T> void QPromise<T>::setException(const QException &e)
diff --git a/src/corelib/thread/qreadwritelock.cpp b/src/corelib/thread/qreadwritelock.cpp
index 4c2a9c4251..e79bed2231 100644
--- a/src/corelib/thread/qreadwritelock.cpp
+++ b/src/corelib/thread/qreadwritelock.cpp
@@ -1,52 +1,13 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2016 Intel Corporation.
-** Copyright (C) 2016 Olivier Goffart <ogoffart@woboq.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2016 Intel Corporation.
+// Copyright (C) 2016 Olivier Goffart <ogoffart@woboq.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qplatformdefs.h"
#include "qreadwritelock.h"
-#include "qmutex.h"
#include "qthread.h"
-#include "qwaitcondition.h"
#include "qreadwritelock_p.h"
-#include "qelapsedtimer.h"
#include "private/qfreelist_p.h"
#include "private/qlocking_p.h"
@@ -66,21 +27,22 @@ QT_BEGIN_NAMESPACE
* - In any other case, d_ptr points to an actual QReadWriteLockPrivate.
*/
+using namespace QReadWriteLockStates;
namespace {
-using ms = std::chrono::milliseconds;
+using steady_clock = std::chrono::steady_clock;
-enum {
- StateMask = 0x3,
- StateLockedForRead = 0x1,
- StateLockedForWrite = 0x2,
-};
const auto dummyLockedForRead = reinterpret_cast<QReadWriteLockPrivate *>(quintptr(StateLockedForRead));
const auto dummyLockedForWrite = reinterpret_cast<QReadWriteLockPrivate *>(quintptr(StateLockedForWrite));
inline bool isUncontendedLocked(const QReadWriteLockPrivate *d)
{ return quintptr(d) & StateMask; }
}
+static bool contendedTryLockForRead(QAtomicPointer<QReadWriteLockPrivate> &d_ptr,
+ QDeadlineTimer timeout, QReadWriteLockPrivate *d);
+static bool contendedTryLockForWrite(QAtomicPointer<QReadWriteLockPrivate> &d_ptr,
+ QDeadlineTimer timeout, QReadWriteLockPrivate *d);
+
/*! \class QReadWriteLock
\inmodule QtCore
\brief The QReadWriteLock class provides read-write locking.
@@ -138,6 +100,7 @@ inline bool isUncontendedLocked(const QReadWriteLockPrivate *d)
*/
/*!
+ \fn QReadWriteLock::QReadWriteLock(RecursionMode recursionMode)
\since 4.4
Constructs a QReadWriteLock object in the given \a recursionMode.
@@ -146,21 +109,22 @@ inline bool isUncontendedLocked(const QReadWriteLockPrivate *d)
\sa lockForRead(), lockForWrite(), RecursionMode
*/
-QReadWriteLock::QReadWriteLock(RecursionMode recursionMode)
- : d_ptr(recursionMode == Recursive ? new QReadWriteLockPrivate(true) : nullptr)
+QReadWriteLockPrivate *QReadWriteLock::initRecursive()
{
- Q_ASSERT_X(!(quintptr(d_ptr.loadRelaxed()) & StateMask), "QReadWriteLock::QReadWriteLock", "bad d_ptr alignment");
+ auto d = new QReadWriteLockPrivate(true);
+ Q_ASSERT_X(!(quintptr(d) & StateMask), "QReadWriteLock::QReadWriteLock", "bad d_ptr alignment");
+ return d;
}
/*!
+ \fn QReadWriteLock::~QReadWriteLock()
Destroys the QReadWriteLock object.
\warning Destroying a read-write lock that is in use may result
in undefined behavior.
*/
-QReadWriteLock::~QReadWriteLock()
+void QReadWriteLock::destroyRecursive(QReadWriteLockPrivate *d)
{
- auto d = d_ptr.loadRelaxed();
if (isUncontendedLocked(d)) {
qWarning("QReadWriteLock: destroying locked QReadWriteLock");
return;
@@ -169,6 +133,7 @@ QReadWriteLock::~QReadWriteLock()
}
/*!
+ \fn QReadWriteLock::lockForRead()
Locks the lock for reading. This function will block the current
thread if another thread has locked for writing.
@@ -177,20 +142,18 @@ QReadWriteLock::~QReadWriteLock()
\sa unlock(), lockForWrite(), tryLockForRead()
*/
-void QReadWriteLock::lockForRead()
-{
- if (d_ptr.testAndSetAcquire(nullptr, dummyLockedForRead))
- return;
- tryLockForRead(-1);
-}
/*!
- Attempts to lock for reading. If the lock was obtained, this
- function returns \c true, otherwise it returns \c false instead of
- waiting for the lock to become available, i.e. it does not block.
+ \fn bool QReadWriteLock::tryLockForRead(int timeout)
- The lock attempt will fail if another thread has locked for
- writing.
+ Attempts to lock for reading. This function returns \c true if the
+ lock was obtained; otherwise it returns \c false. If another thread
+ has locked for writing, this function will wait for at most \a
+ timeout milliseconds for the lock to become available.
+
+ Note: Passing a negative number as the \a timeout is equivalent to
+ calling lockForRead(), i.e. this function will wait forever until
+ lock can be locked for reading when \a timeout is negative.
If the lock was obtained, the lock must be unlocked with unlock()
before another thread can successfully lock it for writing.
@@ -200,21 +163,15 @@ void QReadWriteLock::lockForRead()
\sa unlock(), lockForRead()
*/
-bool QReadWriteLock::tryLockForRead()
-{
- return tryLockForRead(0);
-}
-
-/*! \overload
- Attempts to lock for reading. This function returns \c true if the
- lock was obtained; otherwise it returns \c false. If another thread
- has locked for writing, this function will wait for at most \a
- timeout milliseconds for the lock to become available.
+/*!
+ \overload
+ \since 6.6
- Note: Passing a negative number as the \a timeout is equivalent to
- calling lockForRead(), i.e. this function will wait forever until
- lock can be locked for reading when \a timeout is negative.
+ Attempts to lock for reading. This function returns \c true if the lock was
+ obtained; otherwise it returns \c false. If another thread has locked for
+ writing, this function will wait until \a timeout expires for the lock to
+ become available.
If the lock was obtained, the lock must be unlocked with unlock()
before another thread can successfully lock it for writing.
@@ -224,13 +181,18 @@ bool QReadWriteLock::tryLockForRead()
\sa unlock(), lockForRead()
*/
-bool QReadWriteLock::tryLockForRead(int timeout)
+bool QReadWriteLock::tryLockForRead(QDeadlineTimer timeout)
{
// Fast case: non contended:
- QReadWriteLockPrivate *d;
- if (d_ptr.testAndSetAcquire(nullptr, dummyLockedForRead, d))
+ QReadWriteLockPrivate *d = d_ptr.loadRelaxed();
+ if (d == nullptr && d_ptr.testAndSetAcquire(nullptr, dummyLockedForRead, d))
return true;
+ return contendedTryLockForRead(d_ptr, timeout, d);
+}
+Q_NEVER_INLINE static bool contendedTryLockForRead(QAtomicPointer<QReadWriteLockPrivate> &d_ptr,
+ QDeadlineTimer timeout, QReadWriteLockPrivate *d)
+{
while (true) {
if (d == nullptr) {
if (!d_ptr.testAndSetAcquire(nullptr, dummyLockedForRead, d))
@@ -249,7 +211,7 @@ bool QReadWriteLock::tryLockForRead(int timeout)
}
if (d == dummyLockedForWrite) {
- if (!timeout)
+ if (timeout.hasExpired())
return false;
// locked for write, assign a d_ptr and wait.
@@ -284,6 +246,7 @@ bool QReadWriteLock::tryLockForRead(int timeout)
}
/*!
+ \fn QReadWriteLock::lockForWrite()
Locks the lock for writing. This function will block the current
thread if another thread (including the current) has locked for
reading or writing (unless the lock has been created using the
@@ -294,17 +257,18 @@ bool QReadWriteLock::tryLockForRead(int timeout)
\sa unlock(), lockForRead(), tryLockForWrite()
*/
-void QReadWriteLock::lockForWrite()
-{
- tryLockForWrite(-1);
-}
/*!
- Attempts to lock for writing. If the lock was obtained, this
- function returns \c true; otherwise, it returns \c false immediately.
+ \fn QReadWriteLock::tryLockForWrite(int timeout)
+
+ Attempts to lock for writing. This function returns \c true if the
+ lock was obtained; otherwise it returns \c false. If another thread
+ has locked for reading or writing, this function will wait for at
+ most \a timeout milliseconds for the lock to become available.
- The lock attempt will fail if another thread has locked for
- reading or writing.
+ Note: Passing a negative number as the \a timeout is equivalent to
+ calling lockForWrite(), i.e. this function will wait forever until
+ lock can be locked for writing when \a timeout is negative.
If the lock was obtained, the lock must be unlocked with unlock()
before another thread can successfully lock it.
@@ -314,21 +278,15 @@ void QReadWriteLock::lockForWrite()
\sa unlock(), lockForWrite()
*/
-bool QReadWriteLock::tryLockForWrite()
-{
- return tryLockForWrite(0);
-}
-
-/*! \overload
- Attempts to lock for writing. This function returns \c true if the
- lock was obtained; otherwise it returns \c false. If another thread
- has locked for reading or writing, this function will wait for at
- most \a timeout milliseconds for the lock to become available.
+/*!
+ \overload
+ \since 6.6
- Note: Passing a negative number as the \a timeout is equivalent to
- calling lockForWrite(), i.e. this function will wait forever until
- lock can be locked for writing when \a timeout is negative.
+ Attempts to lock for writing. This function returns \c true if the lock was
+ obtained; otherwise it returns \c false. If another thread has locked for
+ reading or writing, this function will wait until \a timeout expires for
+ the lock to become available.
If the lock was obtained, the lock must be unlocked with unlock()
before another thread can successfully lock it.
@@ -338,13 +296,18 @@ bool QReadWriteLock::tryLockForWrite()
\sa unlock(), lockForWrite()
*/
-bool QReadWriteLock::tryLockForWrite(int timeout)
+bool QReadWriteLock::tryLockForWrite(QDeadlineTimer timeout)
{
// Fast case: non contended:
- QReadWriteLockPrivate *d;
- if (d_ptr.testAndSetAcquire(nullptr, dummyLockedForWrite, d))
+ QReadWriteLockPrivate *d = d_ptr.loadRelaxed();
+ if (d == nullptr && d_ptr.testAndSetAcquire(nullptr, dummyLockedForWrite, d))
return true;
+ return contendedTryLockForWrite(d_ptr, timeout, d);
+}
+Q_NEVER_INLINE static bool contendedTryLockForWrite(QAtomicPointer<QReadWriteLockPrivate> &d_ptr,
+ QDeadlineTimer timeout, QReadWriteLockPrivate *d)
+{
while (true) {
if (d == nullptr) {
if (!d_ptr.testAndSetAcquire(d, dummyLockedForWrite, d))
@@ -353,7 +316,7 @@ bool QReadWriteLock::tryLockForWrite(int timeout)
}
if (isUncontendedLocked(d)) {
- if (!timeout)
+ if (timeout.hasExpired())
return false;
// locked for either read or write, assign a d_ptr and wait.
@@ -447,42 +410,16 @@ void QReadWriteLock::unlock()
}
}
-/*! \internal Helper for QWaitCondition::wait */
-QReadWriteLock::StateForWaitCondition QReadWriteLock::stateForWaitCondition() const
-{
- QReadWriteLockPrivate *d = d_ptr.loadRelaxed();
- switch (quintptr(d) & StateMask) {
- case StateLockedForRead: return LockedForRead;
- case StateLockedForWrite: return LockedForWrite;
- }
-
- if (!d)
- return Unlocked;
- if (d->writerCount > 1)
- return RecursivelyLocked;
- else if (d->writerCount == 1)
- return LockedForWrite;
- return LockedForRead;
-
-}
-
-bool QReadWriteLockPrivate::lockForRead(std::unique_lock<QtPrivate::mutex> &lock, int timeout)
+bool QReadWriteLockPrivate::lockForRead(std::unique_lock<std::mutex> &lock, QDeadlineTimer timeout)
{
Q_ASSERT(!mutex.try_lock()); // mutex must be locked when entering this function
- QElapsedTimer t;
- if (timeout > 0)
- t.start();
-
while (waitingWriters || writerCount) {
- if (timeout == 0)
+ if (timeout.hasExpired())
return false;
- if (timeout > 0) {
- auto elapsed = t.elapsed();
- if (elapsed > timeout)
- return false;
+ if (!timeout.isForever()) {
waitingReaders++;
- readerCond.wait_for(lock, ms{timeout - elapsed});
+ readerCond.wait_until(lock, timeout.deadline<steady_clock>());
} else {
waitingReaders++;
readerCond.wait(lock);
@@ -494,29 +431,22 @@ bool QReadWriteLockPrivate::lockForRead(std::unique_lock<QtPrivate::mutex> &lock
return true;
}
-bool QReadWriteLockPrivate::lockForWrite(std::unique_lock<QtPrivate::mutex> &lock, int timeout)
+bool QReadWriteLockPrivate::lockForWrite(std::unique_lock<std::mutex> &lock, QDeadlineTimer timeout)
{
Q_ASSERT(!mutex.try_lock()); // mutex must be locked when entering this function
- QElapsedTimer t;
- if (timeout > 0)
- t.start();
-
while (readerCount || writerCount) {
- if (timeout == 0)
- return false;
- if (timeout > 0) {
- auto elapsed = t.elapsed();
- if (elapsed > timeout) {
- if (waitingReaders && !waitingWriters && !writerCount) {
- // We timed out and now there is no more writers or waiting writers, but some
- // readers were queued (probably because of us). Wake the waiting readers.
- readerCond.notify_all();
- }
- return false;
+ if (timeout.hasExpired()) {
+ if (waitingReaders && !waitingWriters && !writerCount) {
+ // We timed out and now there is no more writers or waiting writers, but some
+ // readers were queued (probably because of us). Wake the waiting readers.
+ readerCond.notify_all();
}
+ return false;
+ }
+ if (!timeout.isForever()) {
waitingWriters++;
- writerCond.wait_for(lock, ms{timeout - elapsed});
+ writerCond.wait_until(lock, timeout.deadline<steady_clock>());
} else {
waitingWriters++;
writerCond.wait(lock);
@@ -544,7 +474,7 @@ static auto handleEquals(Qt::HANDLE handle)
return [handle](QReadWriteLockPrivate::Reader reader) { return reader.handle == handle; };
}
-bool QReadWriteLockPrivate::recursiveLockForRead(int timeout)
+bool QReadWriteLockPrivate::recursiveLockForRead(QDeadlineTimer timeout)
{
Q_ASSERT(recursive);
auto lock = qt_unique_lock(mutex);
@@ -566,7 +496,7 @@ bool QReadWriteLockPrivate::recursiveLockForRead(int timeout)
return true;
}
-bool QReadWriteLockPrivate::recursiveLockForWrite(int timeout)
+bool QReadWriteLockPrivate::recursiveLockForWrite(QDeadlineTimer timeout)
{
Q_ASSERT(recursive);
auto lock = qt_unique_lock(mutex);
@@ -615,25 +545,24 @@ void QReadWriteLockPrivate::recursiveUnlock()
// The freelist management
namespace {
-struct FreeListConstants : QFreeListDefaultConstants {
+struct QReadWriteLockFreeListConstants : QFreeListDefaultConstants
+{
enum { BlockCount = 4, MaxIndex=0xffff };
static const int Sizes[BlockCount];
};
-const int FreeListConstants::Sizes[FreeListConstants::BlockCount] = {
- 16,
- 128,
- 1024,
- FreeListConstants::MaxIndex - (16 + 128 + 1024)
-};
+Q_CONSTINIT const int
+ QReadWriteLockFreeListConstants::Sizes[QReadWriteLockFreeListConstants::BlockCount] = {
+ 16, 128, 1024, QReadWriteLockFreeListConstants::MaxIndex - (16 + 128 + 1024)
+ };
-typedef QFreeList<QReadWriteLockPrivate, FreeListConstants> FreeList;
-Q_GLOBAL_STATIC(FreeList, freelist);
+typedef QFreeList<QReadWriteLockPrivate, QReadWriteLockFreeListConstants> QReadWriteLockFreeList;
+Q_GLOBAL_STATIC(QReadWriteLockFreeList, qrwl_freelist);
}
QReadWriteLockPrivate *QReadWriteLockPrivate::allocate()
{
- int i = freelist->next();
- QReadWriteLockPrivate *d = &(*freelist)[i];
+ int i = qrwl_freelist->next();
+ QReadWriteLockPrivate *d = &(*qrwl_freelist)[i];
d->id = i;
Q_ASSERT(!d->recursive);
Q_ASSERT(!d->waitingReaders && !d->waitingWriters && !d->readerCount && !d->writerCount);
@@ -644,7 +573,7 @@ void QReadWriteLockPrivate::release()
{
Q_ASSERT(!recursive);
Q_ASSERT(!waitingReaders && !waitingWriters && !readerCount && !writerCount);
- freelist->release(id);
+ qrwl_freelist->release(id);
}
/*!
diff --git a/src/corelib/thread/qreadwritelock.h b/src/corelib/thread/qreadwritelock.h
index 3c1ed91b94..6ca9be440a 100644
--- a/src/corelib/thread/qreadwritelock.h
+++ b/src/corelib/thread/qreadwritelock.h
@@ -1,50 +1,14 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QREADWRITELOCK_H
#define QREADWRITELOCK_H
#include <QtCore/qglobal.h>
+#include <QtCore/qdeadlinetimer.h>
QT_BEGIN_NAMESPACE
-
#if QT_CONFIG(thread)
class QReadWriteLockPrivate;
@@ -54,36 +18,81 @@ class Q_CORE_EXPORT QReadWriteLock
public:
enum RecursionMode { NonRecursive, Recursive };
+ QT_CORE_INLINE_SINCE(6, 6)
explicit QReadWriteLock(RecursionMode recursionMode = NonRecursive);
+ QT_CORE_INLINE_SINCE(6, 6)
~QReadWriteLock();
+ QT_CORE_INLINE_SINCE(6, 6)
void lockForRead();
+#if QT_CORE_REMOVED_SINCE(6, 6)
bool tryLockForRead();
+#endif
+ QT_CORE_INLINE_SINCE(6, 6)
bool tryLockForRead(int timeout);
+ bool tryLockForRead(QDeadlineTimer timeout = {});
+ QT_CORE_INLINE_SINCE(6, 6)
void lockForWrite();
+#if QT_CORE_REMOVED_SINCE(6, 6)
bool tryLockForWrite();
+#endif
+ QT_CORE_INLINE_SINCE(6, 6)
bool tryLockForWrite(int timeout);
+ bool tryLockForWrite(QDeadlineTimer timeout = {});
void unlock();
private:
Q_DISABLE_COPY(QReadWriteLock)
QAtomicPointer<QReadWriteLockPrivate> d_ptr;
-
- enum StateForWaitCondition { LockedForRead, LockedForWrite, Unlocked, RecursivelyLocked };
- StateForWaitCondition stateForWaitCondition() const;
- friend class QWaitCondition;
+ friend class QReadWriteLockPrivate;
+ static QReadWriteLockPrivate *initRecursive();
+ static void destroyRecursive(QReadWriteLockPrivate *);
};
+#if QT_CORE_INLINE_IMPL_SINCE(6, 6)
+QReadWriteLock::QReadWriteLock(RecursionMode recursionMode)
+ : d_ptr(recursionMode == Recursive ? initRecursive() : nullptr)
+{
+}
+
+QReadWriteLock::~QReadWriteLock()
+{
+ if (auto d = d_ptr.loadAcquire())
+ destroyRecursive(d);
+}
+
+void QReadWriteLock::lockForRead()
+{
+ tryLockForRead(QDeadlineTimer(QDeadlineTimer::Forever));
+}
+
+bool QReadWriteLock::tryLockForRead(int timeout)
+{
+ return tryLockForRead(QDeadlineTimer(timeout));
+}
+
+void QReadWriteLock::lockForWrite()
+{
+ tryLockForWrite(QDeadlineTimer(QDeadlineTimer::Forever));
+}
+
+bool QReadWriteLock::tryLockForWrite(int timeout)
+{
+ return tryLockForWrite(QDeadlineTimer(timeout));
+}
+#endif // inline since 6.6
+
#if defined(Q_CC_MSVC)
#pragma warning( push )
#pragma warning( disable : 4312 ) // ignoring the warning from /Wp64
#endif
-class Q_CORE_EXPORT QReadLocker
+class QT6_ONLY(Q_CORE_EXPORT) QReadLocker
{
public:
+ Q_NODISCARD_CTOR
inline QReadLocker(QReadWriteLock *readWriteLock);
inline ~QReadLocker()
@@ -125,9 +134,10 @@ inline QReadLocker::QReadLocker(QReadWriteLock *areadWriteLock)
relock();
}
-class Q_CORE_EXPORT QWriteLocker
+class QT6_ONLY(Q_CORE_EXPORT) QWriteLocker
{
public:
+ Q_NODISCARD_CTOR
inline QWriteLocker(QReadWriteLock *readWriteLock);
inline ~QWriteLocker()
@@ -176,7 +186,7 @@ inline QWriteLocker::QWriteLocker(QReadWriteLock *areadWriteLock)
#else // QT_CONFIG(thread)
-class Q_CORE_EXPORT QReadWriteLock
+class QT6_ONLY(Q_CORE_EXPORT) QReadWriteLock
{
public:
enum RecursionMode { NonRecursive, Recursive };
@@ -185,10 +195,12 @@ public:
void lockForRead() noexcept { }
bool tryLockForRead() noexcept { return true; }
+ bool tryLockForRead(QDeadlineTimer) noexcept { return true; }
bool tryLockForRead(int timeout) noexcept { Q_UNUSED(timeout); return true; }
void lockForWrite() noexcept { }
bool tryLockForWrite() noexcept { return true; }
+ bool tryLockForWrite(QDeadlineTimer) noexcept { return true; }
bool tryLockForWrite(int timeout) noexcept { Q_UNUSED(timeout); return true; }
void unlock() noexcept { }
@@ -197,9 +209,10 @@ private:
Q_DISABLE_COPY(QReadWriteLock)
};
-class Q_CORE_EXPORT QReadLocker
+class QT6_ONLY(Q_CORE_EXPORT) QReadLocker
{
public:
+ Q_NODISCARD_CTOR
inline explicit QReadLocker(QReadWriteLock *) noexcept { }
inline ~QReadLocker() noexcept { }
@@ -211,9 +224,10 @@ private:
Q_DISABLE_COPY(QReadLocker)
};
-class Q_CORE_EXPORT QWriteLocker
+class QT6_ONLY(Q_CORE_EXPORT) QWriteLocker
{
public:
+ Q_NODISCARD_CTOR
inline explicit QWriteLocker(QReadWriteLock *) noexcept { }
inline ~QWriteLocker() noexcept { }
diff --git a/src/corelib/thread/qreadwritelock_p.h b/src/corelib/thread/qreadwritelock_p.h
index f9725f05af..68fa642a73 100644
--- a/src/corelib/thread/qreadwritelock_p.h
+++ b/src/corelib/thread/qreadwritelock_p.h
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2016 Olivier Goffart <ogoffart@woboq.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2016 Olivier Goffart <ogoffart@woboq.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QREADWRITELOCK_P_H
#define QREADWRITELOCK_P_H
@@ -52,23 +16,39 @@
// We mean it.
//
-#include <QtCore/private/qglobal_p.h>
+#include <QtCore/private/qlocking_p.h>
#include <QtCore/private/qwaitcondition_p.h>
+#include <QtCore/qreadwritelock.h>
#include <QtCore/qvarlengtharray.h>
QT_REQUIRE_CONFIG(thread);
QT_BEGIN_NAMESPACE
+namespace QReadWriteLockStates {
+enum {
+ StateMask = 0x3,
+ StateLockedForRead = 0x1,
+ StateLockedForWrite = 0x2,
+};
+enum StateForWaitCondition {
+ LockedForRead,
+ LockedForWrite,
+ Unlocked,
+ RecursivelyLocked
+};
+}
+
class QReadWriteLockPrivate
{
public:
explicit QReadWriteLockPrivate(bool isRecursive = false)
: recursive(isRecursive) {}
- QtPrivate::mutex mutex;
- QtPrivate::condition_variable writerCond;
- QtPrivate::condition_variable readerCond;
+ alignas(QtPrivate::IdealMutexAlignment) std::condition_variable writerCond;
+ std::condition_variable readerCond;
+
+ alignas(QtPrivate::IdealMutexAlignment) std::mutex mutex;
int readerCount = 0;
int writerCount = 0;
int waitingReaders = 0;
@@ -76,8 +56,8 @@ public:
const bool recursive;
//Called with the mutex locked
- bool lockForWrite(std::unique_lock<QtPrivate::mutex> &lock, int timeout);
- bool lockForRead(std::unique_lock<QtPrivate::mutex> &lock, int timeout);
+ bool lockForWrite(std::unique_lock<std::mutex> &lock, QDeadlineTimer timeout);
+ bool lockForRead(std::unique_lock<std::mutex> &lock, QDeadlineTimer timeout);
void unlock();
//memory management
@@ -85,7 +65,7 @@ public:
void release();
static QReadWriteLockPrivate *allocate();
- // Recusive mutex handling
+ // Recursive mutex handling
Qt::HANDLE currentWriter = {};
struct Reader {
@@ -96,11 +76,36 @@ public:
QVarLengthArray<Reader, 16> currentReaders;
// called with the mutex unlocked
- bool recursiveLockForWrite(int timeout);
- bool recursiveLockForRead(int timeout);
+ bool recursiveLockForWrite(QDeadlineTimer timeout);
+ bool recursiveLockForRead(QDeadlineTimer timeout);
void recursiveUnlock();
+
+ static QReadWriteLockStates::StateForWaitCondition
+ stateForWaitCondition(const QReadWriteLock *lock);
};
-Q_DECLARE_TYPEINFO(QReadWriteLockPrivate::Reader, Q_PRIMITIVE_TYPE);
+Q_DECLARE_TYPEINFO(QReadWriteLockPrivate::Reader, Q_PRIMITIVE_TYPE);\
+
+/*! \internal Helper for QWaitCondition::wait */
+inline QReadWriteLockStates::StateForWaitCondition
+QReadWriteLockPrivate::stateForWaitCondition(const QReadWriteLock *q)
+{
+ using namespace QReadWriteLockStates;
+ QReadWriteLockPrivate *d = q->d_ptr.loadAcquire();
+ switch (quintptr(d) & StateMask) {
+ case StateLockedForRead: return LockedForRead;
+ case StateLockedForWrite: return LockedForWrite;
+ }
+
+ if (!d)
+ return Unlocked;
+ const auto lock = qt_scoped_lock(d->mutex);
+ if (d->writerCount > 1)
+ return RecursivelyLocked;
+ else if (d->writerCount == 1)
+ return LockedForWrite;
+ return LockedForRead;
+
+}
QT_END_NAMESPACE
diff --git a/src/corelib/thread/qresultstore.cpp b/src/corelib/thread/qresultstore.cpp
index 5982ae5454..14ed7c6b87 100644
--- a/src/corelib/thread/qresultstore.cpp
+++ b/src/corelib/thread/qresultstore.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qresultstore.h"
diff --git a/src/corelib/thread/qresultstore.h b/src/corelib/thread/qresultstore.h
index a2a14f3de2..30ce1fe904 100644
--- a/src/corelib/thread/qresultstore.h
+++ b/src/corelib/thread/qresultstore.h
@@ -1,47 +1,10 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QTCORE_RESULTSTORE_H
#define QTCORE_RESULTSTORE_H
#include <QtCore/qmap.h>
-#include <QtCore/qdebug.h>
#include <utility>
@@ -108,7 +71,7 @@ public:
template <typename T>
T *pointer()
{
- const T *p = qAsConst(*this).pointer<T>();
+ const T *p = std::as_const(*this).pointer<T>();
return const_cast<T *>(p);
}
@@ -122,7 +85,7 @@ public:
}
};
-class Q_CORE_EXPORT ResultStoreBase
+class Q_CORE_EXPORT ResultStoreBase final
{
public:
ResultStoreBase();
@@ -136,7 +99,8 @@ public:
ResultIteratorBase resultAt(int index) const;
bool contains(int index) const;
int count() const;
- // ### Qt 7: 'virtual' isn't required, can be removed
+ // ### Qt 7: 'virtual' isn't required, can be removed, along with renaming
+ // the class to ResultStore and changing the members below to be private.
virtual ~ResultStoreBase();
protected:
@@ -170,6 +134,14 @@ protected:
}
public:
+ template <typename T, typename...Args>
+ int emplaceResult(int index, Args&&...args)
+ {
+ if (containsValidResultItem(index)) // reject if already present
+ return -1;
+ return addResult(index, static_cast<void *>(new T(std::forward<Args>(args)...)));
+ }
+
template <typename T>
int addResult(int index, const T *result)
{
@@ -185,10 +157,9 @@ public:
template <typename T>
int moveResult(int index, T &&result)
{
- if (containsValidResultItem(index)) // reject if already present
- return -1;
+ static_assert(!std::is_reference_v<T>, "trying to move from an lvalue!");
- return addResult(index, static_cast<void *>(new T(std::move_if_noexcept(result))));
+ return emplaceResult<std::remove_cv_t<T>>(index, std::forward<T>(result));
}
template<typename T>
@@ -200,23 +171,23 @@ public:
if (containsValidResultItem(index)) // reject if already present
return -1;
- return addResults(index, new QList<T>(*results), results->count(), results->count());
+ return addResults(index, new QList<T>(*results), results->size(), results->size());
}
template<typename T>
int addResults(int index, const QList<T> *results, int totalCount)
{
// reject if results are empty, and nothing is filtered away
- if ((m_filterMode == false || results->count() == totalCount) && results->empty())
+ if ((m_filterMode == false || results->size() == totalCount) && results->empty())
return -1;
if (containsValidResultItem(index)) // reject if already present
return -1;
- if (m_filterMode == true && results->count() != totalCount && 0 == results->count())
+ if (m_filterMode == true && results->size() != totalCount && 0 == results->size())
return addResults(index, nullptr, 0, totalCount);
- return addResults(index, new QList<T>(*results), results->count(), totalCount);
+ return addResults(index, new QList<T>(*results), results->size(), totalCount);
}
int addCanceledResult(int index)
diff --git a/src/corelib/thread/qrunnable.cpp b/src/corelib/thread/qrunnable.cpp
index 32f3cd657e..f9d69ed5cb 100644
--- a/src/corelib/thread/qrunnable.cpp
+++ b/src/corelib/thread/qrunnable.cpp
@@ -1,44 +1,10 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qrunnable.h"
+#include <QtCore/qlogging.h>
+
QT_BEGIN_NAMESPACE
QRunnable::~QRunnable()
@@ -46,6 +12,27 @@ QRunnable::~QRunnable()
}
/*!
+ \internal
+ Prints a warning and returns nullptr.
+*/
+QRunnable *QRunnable::warnNullCallable()
+{
+ qWarning("Trying to create null QRunnable. This may stop working.");
+ return nullptr;
+}
+
+
+QRunnable::QGenericRunnable::~QGenericRunnable()
+{
+ runHelper->destroy();
+}
+
+void QRunnable::QGenericRunnable::run()
+{
+ runHelper->run();
+}
+
+/*!
\class QRunnable
\inmodule QtCore
\since 4.4
@@ -113,31 +100,20 @@ QRunnable::~QRunnable()
\sa autoDelete(), QThreadPool
*/
-class FunctionRunnable : public QRunnable
-{
- std::function<void()> m_functionToRun;
-public:
- FunctionRunnable(std::function<void()> functionToRun) : m_functionToRun(std::move(functionToRun))
- {
- }
- void run() override
- {
- m_functionToRun();
- }
-};
-
/*!
+ \fn template<typename Callable, QRunnable::if_callable<Callable>> QRunnable *QRunnable::create(Callable &&callableToRun);
\since 5.15
- Creates a QRunnable that calls \a functionToRun in run().
+ Creates a QRunnable that calls \a callableToRun in run().
Auto-deletion is enabled by default.
+ \note This function participates in overload resolution only if \c Callable
+ is a function or function object which can be called with zero arguments.
+
+ \note In Qt versions prior to 6.6, this method took copyable functions only.
+
\sa run(), autoDelete()
*/
-QRunnable *QRunnable::create(std::function<void()> functionToRun)
-{
- return new FunctionRunnable(std::move(functionToRun));
-}
QT_END_NAMESPACE
diff --git a/src/corelib/thread/qrunnable.h b/src/corelib/thread/qrunnable.h
index 22d508d35c..f0dd0a582e 100644
--- a/src/corelib/thread/qrunnable.h
+++ b/src/corelib/thread/qrunnable.h
@@ -1,47 +1,16 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QRUNNABLE_H
#define QRUNNABLE_H
-#include <QtCore/qglobal.h>
+#include <QtCore/qcompilerdetection.h>
+#include <QtCore/qfunctionaltools_impl.h>
+#include <QtCore/qtclasshelpermacros.h>
+#include <QtCore/qtcoreexports.h>
+
#include <functional>
+#include <type_traits>
QT_BEGIN_NAMESPACE
@@ -55,12 +24,114 @@ public:
constexpr QRunnable() noexcept = default;
virtual ~QRunnable();
+#if QT_CORE_REMOVED_SINCE(6, 6)
static QRunnable *create(std::function<void()> functionToRun);
+#endif
+ template <typename Callable>
+ using if_callable = std::enable_if_t<std::is_invocable_r_v<void, Callable>, bool>;
+
+ template <typename Callable, if_callable<Callable> = true>
+ static QRunnable *create(Callable &&functionToRun);
+ static QRunnable *create(std::nullptr_t) = delete;
bool autoDelete() const { return m_autoDelete; }
void setAutoDelete(bool autoDelete) { m_autoDelete = autoDelete; }
+
+private:
+ static Q_DECL_COLD_FUNCTION QRunnable *warnNullCallable();
+ class QGenericRunnable;
};
+class Q_CORE_EXPORT QRunnable::QGenericRunnable : public QRunnable
+{
+ // Type erasure, to only instantiate a non-virtual class per Callable:
+ class HelperBase
+ {
+ protected:
+ enum class Op {
+ Run,
+ Destroy,
+ };
+ using OpFn = void* (*)(Op, HelperBase *, void*);
+ OpFn fn;
+ protected:
+ constexpr explicit HelperBase(OpFn f) noexcept : fn(f) {}
+ ~HelperBase() = default;
+ public:
+ void run() { fn(Op::Run, this, nullptr); }
+ void destroy() { fn(Op::Destroy, this, nullptr); }
+ };
+
+ template <typename Callable>
+ class Helper : public HelperBase, private QtPrivate::CompactStorage<Callable>
+ {
+ using Storage = QtPrivate::CompactStorage<Callable>;
+ static void *impl(Op op, HelperBase *that, [[maybe_unused]] void *arg)
+ {
+ const auto _this = static_cast<Helper*>(that);
+ switch (op) {
+ case Op::Run: _this->object()(); break;
+ case Op::Destroy: delete _this; break;
+ }
+ return nullptr;
+ }
+ public:
+ template <typename UniCallable>
+ explicit Helper(UniCallable &&functionToRun) noexcept
+ : HelperBase(&impl),
+ Storage{std::forward<UniCallable>(functionToRun)}
+ {
+ }
+ };
+
+ HelperBase *runHelper;
+public:
+ template <typename Callable, if_callable<Callable> = true>
+ explicit QGenericRunnable(Callable &&c)
+ : runHelper(new Helper<std::decay_t<Callable>>(std::forward<Callable>(c)))
+ {
+ }
+ ~QGenericRunnable() override;
+
+ void run() override;
+};
+
+namespace QtPrivate {
+
+template <typename T>
+constexpr inline bool is_function_pointer_v = std::conjunction_v<
+ std::is_pointer<T>,
+ std::is_function<std::remove_pointer_t<T>>
+ >;
+template <typename T>
+constexpr inline bool is_std_function_v = false;
+template <typename T>
+constexpr inline bool is_std_function_v<std::function<T>> = true;
+
+} // namespace QtPrivate
+
+template <typename Callable, QRunnable::if_callable<Callable>>
+QRunnable *QRunnable::create(Callable &&functionToRun)
+{
+ using F = std::decay_t<Callable>;
+ constexpr bool is_std_function = QtPrivate::is_std_function_v<F>;
+ constexpr bool is_function_pointer = QtPrivate::is_function_pointer_v<F>;
+ if constexpr (is_std_function || is_function_pointer) {
+ bool is_null;
+ if constexpr (is_std_function) {
+ is_null = !functionToRun;
+ } else if constexpr (is_function_pointer) {
+ // shut up warnings about functions always having a non-null address:
+ const void *functionPtr = reinterpret_cast<void *>(functionToRun);
+ is_null = !functionPtr;
+ }
+ if (is_null)
+ return warnNullCallable();
+ }
+
+ return new QGenericRunnable(std::forward<Callable>(functionToRun));
+}
+
QT_END_NAMESPACE
#endif
diff --git a/src/corelib/thread/qsemaphore.cpp b/src/corelib/thread/qsemaphore.cpp
index 0f1c7c2eb8..72781942ac 100644
--- a/src/corelib/thread/qsemaphore.cpp
+++ b/src/corelib/thread/qsemaphore.cpp
@@ -1,49 +1,16 @@
-/****************************************************************************
-**
-** Copyright (C) 2017 The Qt Company Ltd.
-** Copyright (C) 2018 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2022 The Qt Company Ltd.
+// Copyright (C) 2018 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qsemaphore.h"
-#include "qmutex.h"
#include "qfutex_p.h"
-#include "qwaitcondition.h"
#include "qdeadlinetimer.h"
#include "qdatetime.h"
+#include "qdebug.h"
+#include "qlocking_p.h"
+#include "qwaitcondition_p.h"
+
+#include <chrono>
QT_BEGIN_NAMESPACE
@@ -83,7 +50,7 @@ using namespace QtFutex;
A typical application of semaphores is for controlling access to
a circular buffer shared by a producer thread and a consumer
- thread. The \l{Semaphores Example} shows how
+ thread. The \l{Producer and Consumer using Semaphores} example shows how
to use QSemaphore to solve that problem.
A non-computing example of a semaphore would be dining at a
@@ -96,7 +63,8 @@ using namespace QtFutex;
seated (taking the available seats to 5, making the party of 10
people wait longer).
- \sa QSemaphoreReleaser, QMutex, QWaitCondition, QThread, {Semaphores Example}
+ \sa QSemaphoreReleaser, QMutex, QWaitCondition, QThread,
+ {Producer and Consumer using Semaphores}
*/
/*
@@ -178,10 +146,10 @@ static QBasicAtomicInteger<quint32> *futexHigh32(QBasicAtomicInteger<quintptr> *
}
template <bool IsTimed> bool
-futexSemaphoreTryAcquire_loop(QBasicAtomicInteger<quintptr> &u, quintptr curValue, quintptr nn, int timeout)
+futexSemaphoreTryAcquire_loop(QBasicAtomicInteger<quintptr> &u, quintptr curValue, quintptr nn,
+ QDeadlineTimer timer)
{
- QDeadlineTimer timer(IsTimed ? QDeadlineTimer(timeout) : QDeadlineTimer());
- qint64 remainingTime = timeout * Q_INT64_C(1000) * 1000;
+ using namespace std::chrono;
int n = int(unsigned(nn));
// we're called after one testAndSet, so start by waiting first
@@ -194,12 +162,12 @@ futexSemaphoreTryAcquire_loop(QBasicAtomicInteger<quintptr> &u, quintptr curValu
if constexpr (futexHasWaiterCount) {
Q_ASSERT(n > 1);
ptr = futexHigh32(&u);
- curValue >>= 32;
+ curValue = quint64(curValue) >> 32;
}
}
- if (IsTimed && remainingTime > 0) {
- bool timedout = !futexWait(*ptr, curValue, remainingTime);
+ if (IsTimed) {
+ bool timedout = !futexWait(*ptr, curValue, timer);
if (timedout)
return false;
} else {
@@ -207,8 +175,6 @@ futexSemaphoreTryAcquire_loop(QBasicAtomicInteger<quintptr> &u, quintptr curValu
}
curValue = u.loadAcquire();
- if (IsTimed)
- remainingTime = timer.remainingTimeNSecs();
// try to acquire
while (futexAvailCounter(curValue) >= n) {
@@ -218,13 +184,18 @@ futexSemaphoreTryAcquire_loop(QBasicAtomicInteger<quintptr> &u, quintptr curValu
}
// not enough tokens available, put us to wait
- if (remainingTime == 0)
+ if (IsTimed && timer.hasExpired())
return false;
}
}
-template <bool IsTimed> bool futexSemaphoreTryAcquire(QBasicAtomicInteger<quintptr> &u, int n, int timeout)
+static constexpr QDeadlineTimer::ForeverConstant Expired =
+ QDeadlineTimer::ForeverConstant(1);
+
+template <typename T> bool
+futexSemaphoreTryAcquire(QBasicAtomicInteger<quintptr> &u, int n, T timeout)
{
+ constexpr bool IsTimed = std::is_same_v<QDeadlineTimer, T>;
// Try to acquire without waiting (we still loop because the testAndSet
// call can fail).
quintptr nn = unsigned(n);
@@ -238,15 +209,21 @@ template <bool IsTimed> bool futexSemaphoreTryAcquire(QBasicAtomicInteger<quintp
if (u.testAndSetOrdered(curValue, newValue, curValue))
return true; // succeeded!
}
- if (timeout == 0)
- return false;
+ if constexpr (IsTimed) {
+ if (timeout.hasExpired())
+ return false;
+ } else {
+ if (timeout == Expired)
+ return false;
+ }
// we need to wait
constexpr quintptr oneWaiter = quintptr(Q_UINT64_C(1) << 32); // zero on 32-bit
if constexpr (futexHasWaiterCount) {
// We don't use the fetched value from above so futexWait() fails if
// it changed after the testAndSetOrdered above.
- if (((curValue >> 32) & 0x7fffffffU) == 0x7fffffffU) {
+ quint32 waiterCount = (quint64(curValue) >> 32) & 0x7fffffffU;
+ if (waiterCount == 0x7fffffffU) {
qCritical() << "Waiter count overflow in QSemaphore";
return false;
}
@@ -272,14 +249,31 @@ template <bool IsTimed> bool futexSemaphoreTryAcquire(QBasicAtomicInteger<quintp
return false;
}
-class QSemaphorePrivate {
-public:
- inline QSemaphorePrivate(int n) : avail(n) { }
+namespace QtSemaphorePrivate {
+using namespace QtPrivate;
+struct Layout1
+{
+ alignas(IdealMutexAlignment) std::mutex mutex;
+ qsizetype avail = 0;
+ alignas(IdealMutexAlignment) std::condition_variable cond;
+};
- QMutex mutex;
- QWaitCondition cond;
+struct Layout2
+{
+ alignas(IdealMutexAlignment) std::mutex mutex;
+ alignas(IdealMutexAlignment) std::condition_variable cond;
+ qsizetype avail = 0;
+};
+
+// Choose Layout1 if it is smaller than Layout2. That happens for platforms
+// where sizeof(mutex) is 64.
+using Members = std::conditional_t<sizeof(Layout1) <= sizeof(Layout2), Layout1, Layout2>;
+} // namespace QtSemaphorePrivate
- int avail;
+class QSemaphorePrivate : public QtSemaphorePrivate::Members
+{
+public:
+ explicit QSemaphorePrivate(qsizetype n) { avail = n; }
};
/*!
@@ -322,16 +316,22 @@ QSemaphore::~QSemaphore()
*/
void QSemaphore::acquire(int n)
{
+#if QT_VERSION >= QT_VERSION_CHECK(7, 0, 0)
+# warning "Move the Q_ASSERT to inline code, make QSemaphore have wide contract, " \
+ "and mark noexcept where futexes are in use."
+#else
Q_ASSERT_X(n >= 0, "QSemaphore::acquire", "parameter 'n' must be non-negative");
+#endif
if (futexAvailable()) {
- futexSemaphoreTryAcquire<false>(u, n, -1);
+ futexSemaphoreTryAcquire(u, n, QDeadlineTimer::Forever);
return;
}
- QMutexLocker locker(&d->mutex);
- while (n > d->avail)
- d->cond.wait(locker.mutex());
+ const auto sufficientResourcesAvailable = [this, n] { return d->avail >= n; };
+
+ auto locker = qt_unique_lock(d->mutex);
+ d->cond.wait(locker, sufficientResourcesAvailable);
d->avail -= n;
}
@@ -356,7 +356,12 @@ void QSemaphore::release(int n)
quintptr nn = unsigned(n);
if (futexHasWaiterCount)
nn |= quint64(nn) << 32; // token count replicated in high word
- quintptr prevValue = u.fetchAndAddRelease(nn);
+ quintptr prevValue = u.loadRelaxed();
+ quintptr newValue;
+ do { // loop just to ensure the operations are done atomically
+ newValue = prevValue + nn;
+ newValue &= (futexNeedsWakeAllBit - 1);
+ } while (!u.testAndSetRelease(prevValue, newValue, prevValue));
if (futexNeedsWake(prevValue)) {
#ifdef FUTEX_OP
if (futexHasWaiterCount) {
@@ -378,7 +383,6 @@ void QSemaphore::release(int n)
quint32 oparg = 0;
quint32 cmp = FUTEX_OP_CMP_NE;
quint32 cmparg = 0;
- u.fetchAndAndRelease(futexNeedsWakeAllBit - 1);
futexWakeOp(*futexLow32(&u), n, INT_MAX, *futexHigh32(&u), FUTEX_OP(op, oparg, cmp, cmparg));
return;
}
@@ -390,20 +394,18 @@ void QSemaphore::release(int n)
// its acquisition anyway, so it has to wait;
// 2) it did not see the new counter value, in which case its
// futexWait will fail.
- u.fetchAndAndRelease(futexNeedsWakeAllBit - 1);
- if (futexHasWaiterCount) {
- futexWakeAll(*futexLow32(&u));
+ futexWakeAll(*futexLow32(&u));
+ if (futexHasWaiterCount)
futexWakeAll(*futexHigh32(&u));
- } else {
- futexWakeAll(u);
- }
}
return;
}
- QMutexLocker locker(&d->mutex);
+ // Keep mutex locked until after notify_all() lest another thread acquire()s
+ // the semaphore once d->avail == 0 and then destroys it, leaving `d` dangling.
+ const auto locker = qt_scoped_lock(d->mutex);
d->avail += n;
- d->cond.wakeAll();
+ d->cond.notify_all();
}
/*!
@@ -417,7 +419,7 @@ int QSemaphore::available() const
if (futexAvailable())
return futexAvailCounter(u.loadRelaxed());
- QMutexLocker locker(&d->mutex);
+ const auto locker = qt_scoped_lock(d->mutex);
return d->avail;
}
@@ -437,9 +439,9 @@ bool QSemaphore::tryAcquire(int n)
Q_ASSERT_X(n >= 0, "QSemaphore::tryAcquire", "parameter 'n' must be non-negative");
if (futexAvailable())
- return futexSemaphoreTryAcquire<false>(u, n, 0);
+ return futexSemaphoreTryAcquire(u, n, Expired);
- QMutexLocker locker(&d->mutex);
+ const auto locker = qt_scoped_lock(d->mutex);
if (n > d->avail)
return false;
d->avail -= n;
@@ -447,6 +449,8 @@ bool QSemaphore::tryAcquire(int n)
}
/*!
+ \fn QSemaphore::tryAcquire(int n, int timeout)
+
Tries to acquire \c n resources guarded by the semaphore and
returns \c true on success. If available() < \a n, this call will
wait for at most \a timeout milliseconds for resources to become
@@ -462,24 +466,40 @@ bool QSemaphore::tryAcquire(int n)
\sa acquire()
*/
-bool QSemaphore::tryAcquire(int n, int timeout)
+
+/*!
+ \since 6.6
+
+ Tries to acquire \c n resources guarded by the semaphore and returns \c
+ true on success. If available() < \a n, this call will wait until \a timer
+ expires for resources to become available.
+
+ Example:
+
+ \snippet code/src_corelib_thread_qsemaphore.cpp tryAcquire-QDeadlineTimer
+
+ \sa acquire()
+*/
+bool QSemaphore::tryAcquire(int n, QDeadlineTimer timer)
{
- Q_ASSERT_X(n >= 0, "QSemaphore::tryAcquire", "parameter 'n' must be non-negative");
+ if (timer.isForever()) {
+ acquire(n);
+ return true;
+ }
- // We're documented to accept any negative value as "forever"
- // but QDeadlineTimer only accepts -1.
- timeout = qMax(timeout, -1);
+ if (timer.hasExpired())
+ return tryAcquire(n);
+
+ Q_ASSERT_X(n >= 0, "QSemaphore::tryAcquire", "parameter 'n' must be non-negative");
if (futexAvailable())
- return futexSemaphoreTryAcquire<true>(u, n, timeout);
+ return futexSemaphoreTryAcquire(u, n, timer);
- QDeadlineTimer timer(timeout);
- QMutexLocker locker(&d->mutex);
- while (n > d->avail && !timer.hasExpired()) {
- if (!d->cond.wait(locker.mutex(), timer))
- return false;
- }
- if (n > d->avail)
+ using namespace std::chrono;
+ const auto sufficientResourcesAvailable = [this, n] { return d->avail >= n; };
+
+ auto locker = qt_unique_lock(d->mutex);
+ if (!d->cond.wait_until(locker, timer.deadline<steady_clock>(), sufficientResourcesAvailable))
return false;
d->avail -= n;
return true;
@@ -511,7 +531,7 @@ bool QSemaphore::tryAcquire(int n, int timeout)
It is equivalent to calling \c{tryAcquire(1, timeout)}, where the call
times out on the given \a timeout value. The function returns \c true
- on accquiring the resource successfully.
+ on acquiring the resource successfully.
\sa tryAcquire(), try_acquire(), try_acquire_until()
*/
diff --git a/src/corelib/thread/qsemaphore.h b/src/corelib/thread/qsemaphore.h
index b57a274104..dda722a582 100644
--- a/src/corelib/thread/qsemaphore.h
+++ b/src/corelib/thread/qsemaphore.h
@@ -1,47 +1,11 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QSEMAPHORE_H
#define QSEMAPHORE_H
#include <QtCore/qglobal.h>
-#include <QtCore/qmutex.h> // for convertToMilliseconds()
+#include <QtCore/qdeadlinetimer.h>
#include <chrono>
@@ -50,7 +14,6 @@ QT_REQUIRE_CONFIG(thread);
QT_BEGIN_NAMESPACE
class QSemaphorePrivate;
-
class Q_CORE_EXPORT QSemaphore
{
public:
@@ -59,10 +22,14 @@ public:
void acquire(int n = 1);
bool tryAcquire(int n = 1);
+ QT_CORE_INLINE_SINCE(6, 6)
bool tryAcquire(int n, int timeout);
+ bool tryAcquire(int n, QDeadlineTimer timeout);
+#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0)
template <typename Rep, typename Period>
bool tryAcquire(int n, std::chrono::duration<Rep, Period> timeout)
- { return tryAcquire(n, QtPrivate::convertToMilliseconds(timeout)); }
+ { return tryAcquire(n, QDeadlineTimer(timeout)); }
+#endif
void release(int n = 1);
@@ -89,14 +56,25 @@ private:
};
};
+#if QT_CORE_INLINE_IMPL_SINCE(6, 6)
+bool QSemaphore::tryAcquire(int n, int timeout)
+{
+ return tryAcquire(n, QDeadlineTimer(timeout));
+}
+#endif
+
class QSemaphoreReleaser
{
public:
+ Q_NODISCARD_CTOR
QSemaphoreReleaser() = default;
+ Q_NODISCARD_CTOR
explicit QSemaphoreReleaser(QSemaphore &sem, int n = 1) noexcept
: m_sem(&sem), m_n(n) {}
+ Q_NODISCARD_CTOR
explicit QSemaphoreReleaser(QSemaphore *sem, int n = 1) noexcept
: m_sem(sem), m_n(n) {}
+ Q_NODISCARD_CTOR
QSemaphoreReleaser(QSemaphoreReleaser &&other) noexcept
: m_sem(other.cancel()), m_n(other.m_n) {}
QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_MOVE_AND_SWAP(QSemaphoreReleaser)
@@ -109,8 +87,8 @@ public:
void swap(QSemaphoreReleaser &other) noexcept
{
- qSwap(m_sem, other.m_sem);
- qSwap(m_n, other.m_n);
+ qt_ptr_swap(m_sem, other.m_sem);
+ std::swap(m_n, other.m_n);
}
QSemaphore *semaphore() const noexcept
@@ -118,7 +96,7 @@ public:
QSemaphore *cancel() noexcept
{
- return qExchange(m_sem, nullptr);
+ return std::exchange(m_sem, nullptr);
}
private:
diff --git a/src/corelib/thread/qthread.cpp b/src/corelib/thread/qthread.cpp
index a936d189f4..8d8f353aaa 100644
--- a/src/corelib/thread/qthread.cpp
+++ b/src/corelib/thread/qthread.cpp
@@ -1,48 +1,13 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2016 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qthread.h"
#include "qthreadstorage.h"
#include "qmutex.h"
#include "qreadwritelock.h"
#include "qabstracteventdispatcher.h"
+#include "qbindingstorage.h"
#include <qeventloop.h>
@@ -54,6 +19,29 @@
QT_BEGIN_NAMESPACE
/*
+ QPostEventList
+*/
+
+void QPostEventList::addEvent(const QPostEvent &ev)
+{
+ int priority = ev.priority;
+ if (isEmpty() ||
+ constLast().priority >= priority ||
+ insertionOffset >= size()) {
+ // optimization: we can simply append if the last event in
+ // the queue has higher or equal priority
+ append(ev);
+ } else {
+ // insert event in descending priority order, using upper
+ // bound for a given priority (to ensure proper ordering
+ // of events with the same priority)
+ QPostEventList::iterator at = std::upper_bound(begin() + insertionOffset, end(), ev);
+ insert(at, ev);
+ }
+}
+
+
+/*
QThreadData
*/
@@ -77,9 +65,10 @@ QThreadData::~QThreadData()
// crashing during QCoreApplicationData's global static cleanup we need to
// safeguard the main thread here.. This fix is a bit crude, but it solves
// the problem...
- if (this->thread.loadAcquire() == QCoreApplicationPrivate::theMainThread.loadAcquire()) {
- QCoreApplicationPrivate::theMainThread.storeRelease(nullptr);
- QThreadData::clearCurrentThreadData();
+ if (threadId.loadAcquire() == QCoreApplicationPrivate::theMainThreadId.loadAcquire()) {
+ QCoreApplicationPrivate::theMainThread.storeRelease(nullptr);
+ QCoreApplicationPrivate::theMainThreadId.storeRelaxed(nullptr);
+ QThreadData::clearCurrentThreadData();
}
// ~QThread() sets thread to nullptr, so if it isn't null here, it's
@@ -141,8 +130,9 @@ QAdoptedThread::QAdoptedThread(QThreadData *data)
d_func()->running = true;
d_func()->finished = false;
init();
+ d_func()->m_statusOrPendingObjects.setStatusAndClearList(
+ QtPrivate::getBindingStatus({}));
#endif
-
// fprintf(stderr, "new QAdoptedThread = %p\n", this);
}
@@ -157,7 +147,24 @@ void QAdoptedThread::run()
// this function should never be called
qFatal("QAdoptedThread::run(): Internal error, this implementation should never be called.");
}
+#endif
+
+QScopedScopeLevelCounter::QScopedScopeLevelCounter(QThreadData *threadData)
+ : threadData(threadData)
+{
+ ++threadData->scopeLevel;
+ qCDebug(lcDeleteLater) << "Increased" << threadData->thread
+ << "scope level to" << threadData->scopeLevel;
+}
+
+QScopedScopeLevelCounter::~QScopedScopeLevelCounter()
+{
+ --threadData->scopeLevel;
+ qCDebug(lcDeleteLater) << "Decreased" << threadData->thread
+ << "scope level to" << threadData->scopeLevel;
+}
+#if QT_CONFIG(thread)
/*
QThreadPrivate
*/
@@ -175,7 +182,7 @@ QThreadPrivate::QThreadPrivate(QThreadData *d)
#ifdef Q_OS_INTEGRITY
stackSize = 128 * 1024;
#elif defined(Q_OS_RTEMS)
- static bool envStackSizeOk = false;
+ Q_CONSTINIT static bool envStackSizeOk = false;
static const int envStackSize = qEnvironmentVariableIntValue("QT_DEFAULT_THREAD_STACK_SIZE", &envStackSizeOk);
if (envStackSizeOk)
stackSize = envStackSize;
@@ -195,6 +202,10 @@ QThreadPrivate::QThreadPrivate(QThreadData *d)
QThreadPrivate::~QThreadPrivate()
{
+ // access to m_statusOrPendingObjects cannot race with anything
+ // unless there is already a potential use-after-free bug, as the
+ // thread is in the process of being destroyed
+ delete m_statusOrPendingObjects.list();
data->deref();
}
@@ -263,22 +274,21 @@ QThreadPrivate::~QThreadPrivate()
documentation for terminate() and setTerminationEnabled() for
detailed information.
- From Qt 4.8 onwards, it is possible to deallocate objects that
- live in a thread that has just ended, by connecting the
- finished() signal to QObject::deleteLater().
+ You often want to deallocate objects that live in a thread when
+ a thread ends. To do this, connect the finished() signal to
+ QObject::deleteLater().
Use wait() to block the calling thread, until the other thread
has finished execution (or until a specified time has passed).
QThread also provides static, platform independent sleep
functions: sleep(), msleep(), and usleep() allow full second,
- millisecond, and microsecond resolution respectively. These
- functions were made public in Qt 5.0.
+ millisecond, and microsecond resolution respectively.
\note wait() and the sleep() functions should be unnecessary in
general, since Qt is an event-driven framework. Instead of
wait(), consider listening for the finished() signal. Instead of
- the sleep() functions, consider using QTimer.
+ the sleep() functions, consider using QChronoTimer.
The static functions currentThreadId() and currentThread() return
identifiers for the currently executing thread. The former
@@ -291,11 +301,12 @@ QThreadPrivate::~QThreadPrivate()
If you don't call \l{QObject::setObjectName()}{setObjectName()},
the name given to your thread will be the class name of the runtime
type of your thread object (for example, \c "RenderThread" in the case of the
- \l{Mandelbrot Example}, as that is the name of the QThread subclass).
+ \l{Mandelbrot} example, as that is the name of the QThread subclass).
Note that this is currently not available with release builds on Windows.
\sa {Thread Support in Qt}, QThreadStorage, {Synchronizing Threads},
- {Mandelbrot Example}, {Semaphores Example}, {Wait Conditions Example}
+ Mandelbrot, {Producer and Consumer using Semaphores},
+ {Producer and Consumer using Wait Conditions}
*/
/*!
@@ -314,9 +325,20 @@ QThreadPrivate::~QThreadPrivate()
/*!
\fn int QThread::idealThreadCount()
- Returns the ideal number of threads that can be run on the system. This is done querying
- the number of processor cores, both real and logical, in the system. This function returns 1
- if the number of processor cores could not be detected.
+ Returns the ideal number of threads that this process can run in parallel.
+ This is done by querying the number of logical processors available to this
+ process (if supported by this OS) or the total number of logical processors
+ in the system. This function returns 1 if neither value could be
+ determined.
+
+ \note On operating systems that support setting a thread's affinity to a
+ subset of all logical processors, the value returned by this function may
+ change between threads and over time.
+
+ \note On operating systems that support CPU hotplugging and hot-unplugging,
+ the value returned by this function may also change over time (and note
+ that CPUs can be turned on and off by software, without a physical,
+ hardware change).
*/
/*!
@@ -405,6 +427,23 @@ QThread *QThread::currentThread()
}
/*!
+ \since 6.8
+
+ Returns whether the currently executing thread is the main thread.
+
+ The main thread is the thread in which QCoreApplication was created.
+ This is usually the thread that called the \c{main()} function, but not necessarily so.
+ It is the thread that is processing the GUI events and in which graphical objects
+ (QWindow, QWidget) can be created.
+
+ \sa currentThread(), QCoreApplication::instance()
+*/
+bool QThread::isMainThread()
+{
+ return currentThreadId() == QCoreApplicationPrivate::theMainThreadId.loadRelaxed();
+}
+
+/*!
Constructs a new QThread to manage a new thread. The \a parent
takes ownership of the QThread. The thread does not begin
executing until start() is called.
@@ -526,6 +565,24 @@ uint QThread::stackSize() const
}
/*!
+ \internal
+ Transitions BindingStatusOrList to the binding status state. If we had a list of
+ pending objects, all objects get their reinitBindingStorageAfterThreadMove method
+ called, and afterwards, the list gets discarded.
+ */
+void QtPrivate::BindingStatusOrList::setStatusAndClearList(QBindingStatus *status) noexcept
+{
+
+ if (auto pendingObjects = list()) {
+ for (auto obj: *pendingObjects)
+ QObjectPrivate::get(obj)->reinitBindingStorageAfterThreadMove();
+ delete pendingObjects;
+ }
+ // synchronizes-with the load-acquire in bindingStatus():
+ data.store(encodeBindingStatus(status), std::memory_order_release);
+}
+
+/*!
Enters the event loop and waits until exit() is called, returning the value
that was passed to exit(). The value returned is 0 if exit() is called via
quit().
@@ -541,7 +598,10 @@ uint QThread::stackSize() const
int QThread::exec()
{
Q_D(QThread);
+ const auto status = QtPrivate::getBindingStatus(QtPrivate::QBindingStatusAccessToken{});
+
QMutexLocker locker(&d->mutex);
+ d->m_statusOrPendingObjects.setStatusAndClearList(status);
d->data->quitNow = false;
if (d->exited) {
d->exited = false;
@@ -558,6 +618,58 @@ int QThread::exec()
return returnCode;
}
+
+/*!
+ \internal
+ If BindingStatusOrList is already in the binding status state, this will
+ return that BindingStatus pointer.
+ Otherwise, \a object is added to the list, and we return nullptr.
+ The list is allocated if it does not already exist.
+ */
+QBindingStatus *QtPrivate::BindingStatusOrList::addObjectUnlessAlreadyStatus(QObject *object)
+{
+ if (auto status = bindingStatus())
+ return status;
+ List *objectList = list();
+ if (!objectList) {
+ objectList = new List();
+ objectList->reserve(8);
+ data.store(encodeList(objectList), std::memory_order_relaxed);
+ }
+ objectList->push_back(object);
+ return nullptr;
+}
+
+/*!
+ \internal
+ If BindingStatusOrList is a list, remove \a object from it
+ */
+void QtPrivate::BindingStatusOrList::removeObject(QObject *object)
+{
+ List *objectList = list();
+ if (!objectList)
+ return;
+ auto it = std::remove(objectList->begin(), objectList->end(), object);
+ objectList->erase(it, objectList->end());
+}
+
+QBindingStatus *QThreadPrivate::addObjectWithPendingBindingStatusChange(QObject *obj)
+{
+ if (auto status = m_statusOrPendingObjects.bindingStatus())
+ return status;
+ QMutexLocker lock(&mutex);
+ return m_statusOrPendingObjects.addObjectUnlessAlreadyStatus(obj);
+}
+
+void QThreadPrivate::removeObjectWithPendingBindingStatusChange(QObject *obj)
+{
+ if (m_statusOrPendingObjects.bindingStatus())
+ return;
+ QMutexLocker lock(&mutex);
+ m_statusOrPendingObjects.removeObject(obj);
+}
+
+
/*!
\threadsafe
Tells the thread's event loop to exit with a return code.
@@ -674,16 +786,28 @@ QThread::Priority QThread::priority() const
}
/*!
- \fn void QThread::sleep(unsigned long secs)
+ \fn void QThread::sleep(std::chrono::nanoseconds nsecs)
+ \since 6.6
- Forces the current thread to sleep for \a secs seconds.
+ Forces the current thread to sleep for \a nsecs.
Avoid using this function if you need to wait for a given condition to
change. Instead, connect a slot to the signal that indicates the change or
use an event handler (see \l QObject::event()).
\note This function does not guarantee accuracy. The application may sleep
- longer than \a secs under heavy load conditions.
+ longer than \a nsecs under heavy load conditions.
+*/
+
+/*!
+ \fn void QThread::sleep(unsigned long secs)
+
+ Forces the current thread to sleep for \a secs seconds.
+
+ This is an overloaded function, equivalent to calling:
+ \code
+ QThread::sleep(std::chrono::seconds{secs});
+ \endcode
\sa msleep(), usleep()
*/
@@ -691,11 +815,10 @@ QThread::Priority QThread::priority() const
/*!
\fn void QThread::msleep(unsigned long msecs)
- Forces the current thread to sleep for \a msecs milliseconds.
-
- Avoid using this function if you need to wait for a given condition to
- change. Instead, connect a slot to the signal that indicates the change or
- use an event handler (see \l QObject::event()).
+ This is an overloaded function, equivalent to calling:
+ \code
+ QThread::sleep(std::chrono::milliseconds{msecs});
+ \endcode
\note This function does not guarantee accuracy. The application may sleep
longer than \a msecs under heavy load conditions. Some OSes might round \a
@@ -707,11 +830,10 @@ QThread::Priority QThread::priority() const
/*!
\fn void QThread::usleep(unsigned long usecs)
- Forces the current thread to sleep for \a usecs microseconds.
-
- Avoid using this function if you need to wait for a given condition to
- change. Instead, connect a slot to the signal that indicates the change or
- use an event handler (see \l QObject::event()).
+ This is an overloaded function, equivalent to calling:
+ \code
+ QThread::sleep(std::chrono::microseconds{secs});
+ \endcode
\note This function does not guarantee accuracy. The application may sleep
longer than \a usecs under heavy load conditions. Some OSes might round \a
@@ -809,6 +931,36 @@ int QThread::loopLevel() const
return d->data->eventLoops.size();
}
+/*!
+ \internal
+ Returns the thread handle of this thread.
+ It can be compared with the return value of currentThreadId().
+
+ This is used to implement isCurrentThread, and might be useful
+ for debugging (e.g. by comparing the value in gdb with info threads).
+
+ \note Thread handles of destroyed threads might be reused by the
+ operating system. Storing the return value of this function can
+ therefore give surprising results if it outlives the QThread object
+ (threads claimed to be the same even if they aren't).
+*/
+Qt::HANDLE QThreadPrivate::threadId() const
+{
+ return data->threadId.loadRelaxed();
+}
+
+/*!
+ \since 6.8
+ Returns true if this thread is QThread::currentThread.
+
+ \sa currentThreadId()
+*/
+bool QThread::isCurrentThread() const
+{
+ Q_D(const QThread);
+ return QThread::currentThreadId() == d->threadId();
+}
+
#else // QT_CONFIG(thread)
QThread::QThread(QObject *parent)
@@ -881,6 +1033,11 @@ QThread *QThread::currentThread()
return QThreadData::current()->thread.loadAcquire();
}
+bool QThread::isCurrentThread() const
+{
+ return true;
+}
+
int QThread::idealThreadCount() noexcept
{
return 1;
@@ -902,8 +1059,22 @@ bool QThread::isRunning() const
return d->running;
}
+void QThread::requestInterruption()
+{
+
+}
+
+bool QThread::isInterruptionRequested() const
+{
+ return false;
+}
+
+void QThread::setTerminationEnabled(bool)
+{
+}
+
// No threads: so we can just use static variables
-static QThreadData *data = nullptr;
+Q_CONSTINIT static QThreadData *data = nullptr;
QThreadData *QThreadData::current(bool createIfNecessary)
{
@@ -913,8 +1084,10 @@ QThreadData *QThreadData::current(bool createIfNecessary)
data->threadId.storeRelaxed(Qt::HANDLE(data->thread.loadAcquire()));
data->deref();
data->isAdopted = true;
- if (!QCoreApplicationPrivate::theMainThread.loadAcquire())
+ if (!QCoreApplicationPrivate::theMainThreadId.loadAcquire()) {
QCoreApplicationPrivate::theMainThread.storeRelease(data->thread.loadRelaxed());
+ QCoreApplicationPrivate::theMainThreadId.storeRelaxed(data->threadId.loadRelaxed());
+ }
}
return data;
}
@@ -975,8 +1148,11 @@ QAbstractEventDispatcher *QThread::eventDispatcher() const
Sets the event dispatcher for the thread to \a eventDispatcher. This is
only possible as long as there is no event dispatcher installed for the
- thread yet. That is, before the thread has been started with start() or, in
- case of the main thread, before QCoreApplication has been instantiated.
+ thread yet.
+
+ An event dispatcher is automatically created for the main thread when \l
+ QCoreApplication is instantiated and on start() for auxiliary threads.
+
This method takes ownership of the object.
*/
void QThread::setEventDispatcher(QAbstractEventDispatcher *eventDispatcher)
@@ -1031,11 +1207,11 @@ bool QThread::event(QEvent *event)
void QThread::requestInterruption()
{
- if (this == QCoreApplicationPrivate::theMainThread.loadAcquire()) {
+ Q_D(QThread);
+ if (d->threadId() == QCoreApplicationPrivate::theMainThreadId.loadAcquire()) {
qWarning("QThread::requestInterruption has no effect on the main thread");
return;
}
- Q_D(QThread);
QMutexLocker locker(&d->mutex);
if (!d->running || d->finished || d->isInFinish)
return;
@@ -1101,7 +1277,6 @@ bool QThread::isInterruptionRequested() const
\sa start()
*/
-#if QT_CONFIG(cxx11_future)
class QThreadCreateThread : public QThread
{
public:
@@ -1130,7 +1305,6 @@ QThread *QThread::createThreadImpl(std::future<void> &&future)
{
return new QThreadCreateThread(std::move(future));
}
-#endif // QT_CONFIG(cxx11_future)
/*!
\class QDaemonThread
@@ -1145,7 +1319,9 @@ QDaemonThread::QDaemonThread(QObject *parent)
{
// QThread::started() is emitted from the thread we start
connect(this, &QThread::started,
- [](){ QThreadData::current()->requiresCoreApplication = false; });
+ this,
+ [](){ QThreadData::current()->requiresCoreApplication = false; },
+ Qt::DirectConnection);
}
QDaemonThread::~QDaemonThread()
diff --git a/src/corelib/thread/qthread.h b/src/corelib/thread/qthread.h
index 441736cf4e..641c8ef68a 100644
--- a/src/corelib/thread/qthread.h
+++ b/src/corelib/thread/qthread.h
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2017 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2017 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QTHREAD_H
#define QTHREAD_H
@@ -45,10 +9,8 @@
#include <QtCore/qdeadlinetimer.h>
// For QThread::create
-#if QT_CONFIG(cxx11_future)
-# include <future> // for std::async
-# include <functional> // for std::invoke; no guard needed as it's a C++98 header
-#endif
+#include <future> // for std::async
+#include <functional> // for std::invoke; no guard needed as it's a C++98 header
// internal compiler error with mingw 8.1
#if defined(Q_CC_MSVC) && defined(Q_PROCESSOR_X86)
#include <intrin.h>
@@ -60,6 +22,7 @@ QT_BEGIN_NAMESPACE
class QThreadData;
class QThreadPrivate;
class QAbstractEventDispatcher;
+class QEventLoopLocker;
class Q_CORE_EXPORT QThread : public QObject
{
@@ -67,6 +30,7 @@ class Q_CORE_EXPORT QThread : public QObject
public:
static Qt::HANDLE currentThreadId() noexcept Q_DECL_PURE_FUNCTION;
static QThread *currentThread();
+ static bool isMainThread();
static int idealThreadCount() noexcept;
static void yieldCurrentThread();
@@ -105,10 +69,10 @@ public:
bool event(QEvent *event) override;
int loopLevel() const;
-#if QT_CONFIG(cxx11_future) || defined(Q_CLANG_QDOC)
+ bool isCurrentThread() const;
+
template <typename Function, typename... Args>
[[nodiscard]] static QThread *create(Function &&f, Args &&... args);
-#endif
public Q_SLOTS:
void start(Priority = InheritPriority);
@@ -128,6 +92,7 @@ public:
static void sleep(unsigned long);
static void msleep(unsigned long);
static void usleep(unsigned long);
+ static void sleep(std::chrono::nanoseconds nsec);
Q_SIGNALS:
void started(QPrivateSignal);
@@ -144,17 +109,15 @@ protected:
private:
Q_DECLARE_PRIVATE(QThread)
+ friend class QEventLoopLocker;
-#if QT_CONFIG(cxx11_future)
[[nodiscard]] static QThread *createThreadImpl(std::future<void> &&future);
-#endif
static Qt::HANDLE currentThreadIdImpl() noexcept Q_DECL_PURE_FUNCTION;
friend class QCoreApplication;
friend class QThreadData;
};
-#if QT_CONFIG(cxx11_future)
template <typename Function, typename... Args>
QThread *QThread::create(Function &&f, Args &&... args)
{
@@ -169,7 +132,6 @@ QThread *QThread::create(Function &&f, Args &&... args)
std::move(threadFunction),
std::forward<Args>(args)...));
}
-#endif // QT_CONFIG(cxx11_future)
/*
On architectures and platforms we know, interpret the thread control
@@ -191,14 +153,14 @@ inline Qt::HANDLE QThread::currentThreadId() noexcept
Qt::HANDLE tid; // typedef to void*
static_assert(sizeof(tid) == sizeof(void*));
// See https://akkadia.org/drepper/tls.pdf for x86 ABI
-#if defined(Q_PROCESSOR_X86_32) && defined(Q_OS_LINUX) && !defined(Q_OS_ANDROID) // x86 32-bit always uses GS
- __asm__("movl %%gs:0, %0" : "=r" (tid) : : );
-#elif defined(Q_PROCESSOR_X86_64) && defined(Q_OS_DARWIN64)
+#if defined(Q_PROCESSOR_X86_32) && ((defined(Q_OS_LINUX) && defined(__GLIBC__)) || defined(Q_OS_FREEBSD)) // x86 32-bit always uses GS
+ __asm__("mov %%gs:%c1, %0" : "=r" (tid) : "i" (2 * sizeof(void*)) : );
+#elif defined(Q_PROCESSOR_X86_64) && defined(Q_OS_DARWIN)
// 64bit macOS uses GS, see https://github.com/apple/darwin-xnu/blob/master/libsyscall/os/tsd.h
- __asm__("movq %%gs:0, %0" : "=r" (tid) : : );
-#elif defined(Q_PROCESSOR_X86_64) && (defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD)) && !defined(Q_OS_ANDROID)
+ __asm__("mov %%gs:0, %0" : "=r" (tid) : : );
+#elif defined(Q_PROCESSOR_X86_64) && ((defined(Q_OS_LINUX) && defined(__GLIBC__)) || defined(Q_OS_FREEBSD))
// x86_64 Linux, BSD uses FS
- __asm__("movq %%fs:0, %0" : "=r" (tid) : : );
+ __asm__("mov %%fs:%c1, %0" : "=r" (tid) : "i" (2 * sizeof(void*)) : );
#elif defined(Q_PROCESSOR_X86_64) && defined(Q_OS_WIN)
// See https://en.wikipedia.org/wiki/Win32_Thread_Information_Block
// First get the pointer to the TIB
diff --git a/src/corelib/thread/qthread_p.h b/src/corelib/thread/qthread_p.h
index 50d86ab51a..c39e21ec9a 100644
--- a/src/corelib/thread/qthread_p.h
+++ b/src/corelib/thread/qthread_p.h
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2016 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QTHREAD_P_H
#define QTHREAD_P_H
@@ -94,6 +58,7 @@ inline bool operator<(const QPostEvent &first, const QPostEvent &second)
// This class holds the list of posted events.
// The list has to be kept sorted by priority
+// It's used in a virtual in QCoreApplication, so ELFVERSION:ignore-next
class QPostEventList : public QList<QPostEvent>
{
public:
@@ -101,31 +66,15 @@ public:
int recursion;
// sendOffset == the current event to start sending
- int startOffset;
+ qsizetype startOffset;
// insertionOffset == set by sendPostedEvents to tell postEvent() where to start insertions
- int insertionOffset;
+ qsizetype insertionOffset;
QMutex mutex;
inline QPostEventList() : QList<QPostEvent>(), recursion(0), startOffset(0), insertionOffset(0) { }
- void addEvent(const QPostEvent &ev)
- {
- int priority = ev.priority;
- if (isEmpty() ||
- constLast().priority >= priority ||
- insertionOffset >= size()) {
- // optimization: we can simply append if the last event in
- // the queue has higher or equal priority
- append(ev);
- } else {
- // insert event in descending priority order, using upper
- // bound for a given priority (to ensure proper ordering
- // of events with the same priority)
- QPostEventList::iterator at = std::upper_bound(begin() + insertionOffset, end(), ev);
- insert(at, ev);
- }
- }
+ void addEvent(const QPostEvent &ev);
private:
//hides because they do not keep that list sorted. addEvent must be used
@@ -133,6 +82,85 @@ private:
using QList<QPostEvent>::insert;
};
+namespace QtPrivate {
+
+/* BindingStatusOrList is basically a QBiPointer (as found in declarative)
+ with some helper methods to manipulate the list. BindingStatusOrList starts
+ its life in a null state and supports the following transitions
+
+ 0 state (initial)
+ / \
+ / \
+ v v
+ pending object list----------->binding status
+ Note that binding status is the final state, and we never transition away
+ from it
+*/
+class BindingStatusOrList
+{
+ Q_DISABLE_COPY_MOVE(BindingStatusOrList)
+public:
+ using List = std::vector<QObject *>;
+
+ constexpr BindingStatusOrList() noexcept : data(0) {}
+ explicit BindingStatusOrList(QBindingStatus *status) noexcept :
+ data(encodeBindingStatus(status)) {}
+ explicit BindingStatusOrList(List *list) noexcept : data(encodeList(list)) {}
+
+ // requires external synchronization:
+ QBindingStatus *addObjectUnlessAlreadyStatus(QObject *object);
+ void removeObject(QObject *object);
+ void setStatusAndClearList(QBindingStatus *status) noexcept;
+
+
+ static bool isBindingStatus(quintptr data) noexcept
+ {
+ return !isNull(data) && !isList(data);
+ }
+ static bool isList(quintptr data) noexcept { return data & 1; }
+ static bool isNull(quintptr data) noexcept { return data == 0; }
+
+ // thread-safe:
+ QBindingStatus *bindingStatus() const noexcept
+ {
+ // synchronizes-with the store-release in setStatusAndClearList():
+ const auto d = data.load(std::memory_order_acquire);
+ if (isBindingStatus(d))
+ return reinterpret_cast<QBindingStatus *>(d);
+ else
+ return nullptr;
+ }
+
+ // requires external synchronization:
+ List *list() const noexcept
+ {
+ return decodeList(data.load(std::memory_order_relaxed));
+ }
+
+private:
+ static List *decodeList(quintptr ptr) noexcept
+ {
+ if (isList(ptr))
+ return reinterpret_cast<List *>(ptr & ~1);
+ else
+ return nullptr;
+ }
+
+ static quintptr encodeBindingStatus(QBindingStatus *status) noexcept
+ {
+ return quintptr(status);
+ }
+
+ static quintptr encodeList(List *list) noexcept
+ {
+ return quintptr(list) | 1;
+ }
+
+ std::atomic<quintptr> data;
+};
+
+} // namespace QtPrivate
+
#if QT_CONFIG(thread)
class Q_CORE_EXPORT QDaemonThread : public QThread
@@ -142,7 +170,7 @@ public:
~QDaemonThread();
};
-class QThreadPrivate : public QObjectPrivate
+class Q_AUTOTEST_EXPORT QThreadPrivate : public QObjectPrivate
{
Q_DECLARE_PUBLIC(QThread)
@@ -151,6 +179,7 @@ public:
~QThreadPrivate();
void setPriority(QThread::Priority prio);
+ Qt::HANDLE threadId() const;
mutable QMutex mutex;
QAtomicInt quitLockRef;
@@ -164,7 +193,7 @@ public:
int returnCode;
uint stackSize;
- QThread::Priority priority;
+ std::underlying_type_t<QThread::Priority> priority;
#ifdef Q_OS_UNIX
QWaitCondition thread_done;
@@ -201,6 +230,26 @@ public:
QCoreApplication::instance()->postEvent(q_ptr, new QEvent(QEvent::Quit));
}
}
+
+ QBindingStatus *bindingStatus()
+ {
+ return m_statusOrPendingObjects.bindingStatus();
+ }
+
+ /* Returns nullptr if the object has been added, or the binding status
+ if that one has been set in the meantime
+ */
+ QBindingStatus *addObjectWithPendingBindingStatusChange(QObject *obj);
+ void removeObjectWithPendingBindingStatusChange(QObject *obj);
+
+ // manipulating m_statusOrPendingObjects requires mutex to be locked
+ QtPrivate::BindingStatusOrList m_statusOrPendingObjects = {};
+#ifndef Q_OS_INTEGRITY
+private:
+ // Used in QThread(Private)::start to avoid racy access to QObject::objectName,
+ // unset afterwards. On INTEGRITY we set the thread name before starting it.
+ QString objectName;
+#endif
};
#else // QT_CONFIG(thread)
@@ -213,8 +262,13 @@ public:
mutable QMutex mutex;
QThreadData *data;
+ QBindingStatus* m_bindingStatus;
bool running = false;
+ QBindingStatus* bindingStatus() { return m_bindingStatus; }
+ QBindingStatus *addObjectWithPendingBindingStatusChange(QObject *) { return nullptr; }
+ void removeObjectWithPendingBindingStatusChange(QObject *) {}
+
static void setCurrentThread(QThread *) { }
static QAbstractEventDispatcher *createEventDispatcher(QThreadData *data);
@@ -257,26 +311,6 @@ public:
return canWait;
}
- // This class provides per-thread (by way of being a QThreadData
- // member) storage for qFlagLocation()
- class FlaggedDebugSignatures
- {
- static const uint Count = 2;
-
- uint idx;
- const char *locations[Count];
-
- public:
- FlaggedDebugSignatures() : idx(0)
- { std::fill_n(locations, Count, static_cast<char*>(nullptr)); }
-
- void store(const char* method)
- { locations[idx++ % Count] = method; }
-
- bool contains(const char *method) const
- { return std::find(locations, locations + Count, method) != locations + Count; }
- };
-
private:
QAtomicInt _ref;
@@ -290,7 +324,6 @@ public:
QAtomicPointer<void> threadId;
QAtomicPointer<QAbstractEventDispatcher> eventDispatcher;
QList<void *> tls;
- FlaggedDebugSignatures flaggedSignatures;
bool quitNow;
bool canWait;
@@ -302,11 +335,8 @@ class QScopedScopeLevelCounter
{
QThreadData *threadData;
public:
- inline QScopedScopeLevelCounter(QThreadData *threadData)
- : threadData(threadData)
- { ++threadData->scopeLevel; }
- inline ~QScopedScopeLevelCounter()
- { --threadData->scopeLevel; }
+ QScopedScopeLevelCounter(QThreadData *threadData);
+ ~QScopedScopeLevelCounter();
};
// thread wrapper for the main() thread
diff --git a/src/corelib/thread/qthread_unix.cpp b/src/corelib/thread/qthread_unix.cpp
index 8fa4e939f8..23a79074d6 100644
--- a/src/corelib/thread/qthread_unix.cpp
+++ b/src/corelib/thread/qthread_unix.cpp
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2016 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qthread.h"
@@ -44,6 +8,7 @@
#include <private/qcoreapplication_p.h>
#include <private/qcore_unix_p.h>
+#include <private/qtools_p.h>
#if defined(Q_OS_DARWIN)
# include <private/qeventdispatcher_cf_p.h>
@@ -55,7 +20,9 @@
# endif
#endif
-#include <private/qeventdispatcher_unix_p.h>
+#if !defined(Q_OS_WASM)
+# include <private/qeventdispatcher_unix_p.h>
+#endif
#include "qthreadstorage.h"
@@ -70,8 +37,10 @@
#include <sched.h>
#include <errno.h>
-#ifdef Q_OS_BSD4
-#include <sys/sysctl.h>
+#if defined(Q_OS_FREEBSD)
+# include <sys/cpuset.h>
+#elif defined(Q_OS_BSD4)
+# include <sys/sysctl.h>
#endif
#ifdef Q_OS_VXWORKS
# if (_WRS_VXWORKS_MAJOR > 6) || ((_WRS_VXWORKS_MAJOR == 6) && (_WRS_VXWORKS_MINOR >= 6))
@@ -104,6 +73,8 @@
QT_BEGIN_NAMESPACE
+using namespace QtMiscUtils;
+
#if QT_CONFIG(thread)
static_assert(sizeof(pthread_t) <= sizeof(Qt::HANDLE));
@@ -111,10 +82,10 @@ static_assert(sizeof(pthread_t) <= sizeof(Qt::HANDLE));
enum { ThreadPriorityResetFlag = 0x80000000 };
-static thread_local QThreadData *currentThreadData = nullptr;
+Q_CONSTINIT static thread_local QThreadData *currentThreadData = nullptr;
-static pthread_once_t current_thread_data_once = PTHREAD_ONCE_INIT;
-static pthread_key_t current_thread_data_key;
+Q_CONSTINIT static pthread_once_t current_thread_data_once = PTHREAD_ONCE_INIT;
+Q_CONSTINIT static pthread_key_t current_thread_data_key;
static void destroy_current_thread_data(void *p)
{
@@ -171,30 +142,29 @@ static void set_thread_data(QThreadData *data)
static void clear_thread_data()
{
- currentThreadData = nullptr;
- pthread_setspecific(current_thread_data_key, nullptr);
+ set_thread_data(nullptr);
}
template <typename T>
-static typename std::enable_if<QTypeInfo<T>::isIntegral, Qt::HANDLE>::type to_HANDLE(T id)
+static typename std::enable_if<std::is_integral_v<T>, Qt::HANDLE>::type to_HANDLE(T id)
{
return reinterpret_cast<Qt::HANDLE>(static_cast<intptr_t>(id));
}
template <typename T>
-static typename std::enable_if<QTypeInfo<T>::isIntegral, T>::type from_HANDLE(Qt::HANDLE id)
+static typename std::enable_if<std::is_integral_v<T>, T>::type from_HANDLE(Qt::HANDLE id)
{
return static_cast<T>(reinterpret_cast<intptr_t>(id));
}
template <typename T>
-static typename std::enable_if<QTypeInfo<T>::isPointer, Qt::HANDLE>::type to_HANDLE(T id)
+static typename std::enable_if<std::is_pointer_v<T>, Qt::HANDLE>::type to_HANDLE(T id)
{
return id;
}
template <typename T>
-static typename std::enable_if<QTypeInfo<T>::isPointer, T>::type from_HANDLE(Qt::HANDLE id)
+static typename std::enable_if<std::is_pointer_v<T>, T>::type from_HANDLE(Qt::HANDLE id)
{
return static_cast<T>(id);
}
@@ -221,8 +191,10 @@ QThreadData *QThreadData::current(bool createIfNecessary)
data->deref();
data->isAdopted = true;
data->threadId.storeRelaxed(to_HANDLE(pthread_self()));
- if (!QCoreApplicationPrivate::theMainThread.loadAcquire())
+ if (!QCoreApplicationPrivate::theMainThreadId.loadAcquire()) {
QCoreApplicationPrivate::theMainThread.storeRelease(data->thread.loadRelaxed());
+ QCoreApplicationPrivate::theMainThreadId.storeRelaxed(data->threadId.loadRelaxed());
+ }
}
return data;
}
@@ -269,12 +241,12 @@ QAbstractEventDispatcher *QThreadPrivate::createEventDispatcher(QThreadData *dat
#if QT_CONFIG(thread)
-#if (defined(Q_OS_LINUX) || defined(Q_OS_MAC) || defined(Q_OS_QNX))
+#if (defined(Q_OS_LINUX) || defined(Q_OS_DARWIN) || defined(Q_OS_QNX))
static void setCurrentThreadName(const char *name)
{
# if defined(Q_OS_LINUX) && !defined(QT_LINUXBASE)
prctl(PR_SET_NAME, (unsigned long)name, 0, 0, 0);
-# elif defined(Q_OS_MAC)
+# elif defined(Q_OS_DARWIN)
pthread_setname_np(name);
# elif defined(Q_OS_QNX)
pthread_setname_np(pthread_self(), name);
@@ -282,17 +254,37 @@ static void setCurrentThreadName(const char *name)
}
#endif
+namespace {
+template <typename T>
+void terminate_on_exception(T &&t)
+{
+#ifndef QT_NO_EXCEPTIONS
+ try {
+#endif
+ std::forward<T>(t)();
+#ifndef QT_NO_EXCEPTIONS
+#ifdef __GLIBCXX__
+ // POSIX thread cancellation under glibc is implemented by throwing an exception
+ // of this type. Do what libstdc++ is doing and handle it specially in order not to
+ // abort the application if user's code calls a cancellation function.
+ } catch (abi::__forced_unwind &) {
+ throw;
+#endif // __GLIBCXX__
+ } catch (...) {
+ qTerminate();
+ }
+#endif // QT_NO_EXCEPTIONS
+}
+} // unnamed namespace
+
void *QThreadPrivate::start(void *arg)
{
-#if !defined(Q_OS_ANDROID)
+#ifdef PTHREAD_CANCEL_DISABLE
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, nullptr);
#endif
pthread_cleanup_push(QThreadPrivate::finish, arg);
-#ifndef QT_NO_EXCEPTIONS
- try
-#endif
- {
+ terminate_on_exception([&] {
QThread *thr = reinterpret_cast<QThread *>(arg);
QThreadData *data = QThreadData::get2(thr);
@@ -300,8 +292,8 @@ void *QThreadPrivate::start(void *arg)
QMutexLocker locker(&thr->d_func()->mutex);
// do we need to reset the thread priority?
- if (qToUnderlying(thr->d_func()->priority) & ThreadPriorityResetFlag) {
- thr->d_func()->setPriority(QThread::Priority(qToUnderlying(thr->d_func()->priority) & ~ThreadPriorityResetFlag));
+ if (thr->d_func()->priority & ThreadPriorityResetFlag) {
+ thr->d_func()->setPriority(QThread::Priority(thr->d_func()->priority & ~ThreadPriorityResetFlag));
}
// threadId is set in QThread::start()
@@ -316,38 +308,25 @@ void *QThreadPrivate::start(void *arg)
data->ensureEventDispatcher();
data->eventDispatcher.loadRelaxed()->startingUp();
-#if (defined(Q_OS_LINUX) || defined(Q_OS_MAC) || defined(Q_OS_QNX))
+#if (defined(Q_OS_LINUX) || defined(Q_OS_DARWIN) || defined(Q_OS_QNX))
{
// Sets the name of the current thread. We can only do this
// when the thread is starting, as we don't have a cross
// platform way of setting the name of an arbitrary thread.
- if (Q_LIKELY(thr->objectName().isEmpty()))
+ if (Q_LIKELY(thr->d_func()->objectName.isEmpty()))
setCurrentThreadName(thr->metaObject()->className());
else
- setCurrentThreadName(thr->objectName().toLocal8Bit());
+ setCurrentThreadName(std::exchange(thr->d_func()->objectName, {}).toLocal8Bit());
}
#endif
emit thr->started(QThread::QPrivateSignal());
-#if !defined(Q_OS_ANDROID)
+#ifdef PTHREAD_CANCEL_DISABLE
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, nullptr);
pthread_testcancel();
#endif
thr->run();
- }
-#ifndef QT_NO_EXCEPTIONS
-#ifdef __GLIBCXX__
- // POSIX thread cancellation under glibc is implemented by throwing an exception
- // of this type. Do what libstdc++ is doing and handle it specially in order not to
- // abort the application if user's code calls a cancellation function.
- catch (const abi::__forced_unwind &) {
- throw;
- }
-#endif // __GLIBCXX__
- catch (...) {
- qTerminate();
- }
-#endif // QT_NO_EXCEPTIONS
+ });
// This pop runs finish() below. It's outside the try/catch (and has its
// own try/catch) to prevent finish() to be run in case an exception is
@@ -359,10 +338,7 @@ void *QThreadPrivate::start(void *arg)
void QThreadPrivate::finish(void *arg)
{
-#ifndef QT_NO_EXCEPTIONS
- try
-#endif
- {
+ terminate_on_exception([&] {
QThread *thr = reinterpret_cast<QThread *>(arg);
QThreadPrivate *d = thr->d_func();
@@ -373,6 +349,7 @@ void QThreadPrivate::finish(void *arg)
void *data = &d->data->tls;
locker.unlock();
emit thr->finished(QThread::QPrivateSignal());
+ qCDebug(lcDeleteLater) << "Sending deferred delete events as part of finishing thread" << thr;
QCoreApplication::sendPostedEvents(nullptr, QEvent::DeferredDelete);
QThreadStorageData::finish((void **)data);
locker.relock();
@@ -394,20 +371,7 @@ void QThreadPrivate::finish(void *arg)
d->data->threadId.storeRelaxed(nullptr);
d->thread_done.wakeAll();
- }
-#ifndef QT_NO_EXCEPTIONS
-#ifdef __GLIBCXX__
- // POSIX thread cancellation under glibc is implemented by throwing an exception
- // of this type. Do what libstdc++ is doing and handle it specially in order not to
- // abort the application if user's code calls a cancellation function.
- catch (const abi::__forced_unwind &) {
- throw;
- }
-#endif // __GLIBCXX__
- catch (...) {
- qTerminate();
- }
-#endif // QT_NO_EXCEPTIONS
+ });
}
@@ -455,8 +419,31 @@ int QThread::idealThreadCount() noexcept
} else {
cores = (int)psd.psd_proc_cnt;
}
+#elif (defined(Q_OS_LINUX) && !defined(Q_OS_ANDROID)) || defined(Q_OS_FREEBSD)
+# if defined(Q_OS_FREEBSD) && !defined(CPU_COUNT_S)
+# define CPU_COUNT_S(setsize, cpusetp) ((int)BIT_COUNT(setsize, cpusetp))
+ // match the Linux API for simplicity
+ using cpu_set_t = cpuset_t;
+ auto sched_getaffinity = [](pid_t, size_t cpusetsize, cpu_set_t *mask) {
+ return cpuset_getaffinity(CPU_LEVEL_WHICH, CPU_WHICH_PID, -1, cpusetsize, mask);
+ };
+# endif
+
+ // get the number of threads we're assigned, not the total in the system
+ QVarLengthArray<cpu_set_t, 1> cpuset(1);
+ int size = 1;
+ if (Q_UNLIKELY(sched_getaffinity(0, sizeof(cpu_set_t), cpuset.data()) < 0)) {
+ for (size = 2; size <= 4; size *= 2) {
+ cpuset.resize(size);
+ if (sched_getaffinity(0, sizeof(cpu_set_t) * size, cpuset.data()) == 0)
+ break;
+ }
+ if (size > 4)
+ return 1;
+ }
+ cores = CPU_COUNT_S(sizeof(cpu_set_t) * size, cpuset.data());
#elif defined(Q_OS_BSD4)
- // FreeBSD, OpenBSD, NetBSD, BSD/OS, OS X, iOS
+ // OpenBSD, NetBSD, BSD/OS, Darwin (macOS, iOS, etc.)
size_t len = sizeof(cores);
int mib[2];
mib[0] = CTL_HW;
@@ -494,7 +481,7 @@ int QThread::idealThreadCount() noexcept
#elif defined(Q_OS_WASM)
cores = QThreadPrivate::idealThreadCount;
#else
- // the rest: Linux, Solaris, AIX, Tru64
+ // the rest: Solaris, AIX, Tru64
cores = (int)sysconf(_SC_NPROCESSORS_ONLN);
if (cores == -1)
return 1;
@@ -509,27 +496,38 @@ void QThread::yieldCurrentThread()
#endif // QT_CONFIG(thread)
-static timespec makeTimespec(time_t secs, long nsecs)
+static void qt_nanosleep(timespec amount)
{
- struct timespec ts;
- ts.tv_sec = secs;
- ts.tv_nsec = nsecs;
- return ts;
+ // We'd like to use clock_nanosleep.
+ //
+ // But clock_nanosleep is from POSIX.1-2001 and both are *not*
+ // affected by clock changes when using relative sleeps, even for
+ // CLOCK_REALTIME.
+ //
+ // nanosleep is POSIX.1-1993
+
+ int r;
+ QT_EINTR_LOOP(r, nanosleep(&amount, &amount));
}
void QThread::sleep(unsigned long secs)
{
- qt_nanosleep(makeTimespec(secs, 0));
+ sleep(std::chrono::seconds{secs});
}
void QThread::msleep(unsigned long msecs)
{
- qt_nanosleep(makeTimespec(msecs / 1000, msecs % 1000 * 1000 * 1000));
+ sleep(std::chrono::milliseconds{msecs});
}
void QThread::usleep(unsigned long usecs)
{
- qt_nanosleep(makeTimespec(usecs / 1000 / 1000, usecs % (1000*1000) * 1000));
+ sleep(std::chrono::microseconds{usecs});
+}
+
+void QThread::sleep(std::chrono::nanoseconds nsec)
+{
+ qt_nanosleep(durationToTimespec(nsec));
}
#if QT_CONFIG(thread)
@@ -687,7 +685,7 @@ void QThread::start(Priority priority)
// could not set scheduling hints, fallback to inheriting them
// we'll try again from inside the thread
pthread_attr_setinheritsched(&attr, PTHREAD_INHERIT_SCHED);
- d->priority = Priority(qToUnderlying(priority) | ThreadPriorityResetFlag);
+ d->priority = qToUnderlying(priority) | ThreadPriorityResetFlag;
}
break;
}
@@ -718,7 +716,12 @@ void QThread::start(Priority priority)
pthread_attr_setthreadname(&attr, metaObject()->className());
else
pthread_attr_setthreadname(&attr, objectName().toLocal8Bit());
+#else
+ // avoid interacting with the binding system
+ d->objectName = d->extraData ? d->extraData->objectName.valueBypassingBindings()
+ : QString();
#endif
+
pthread_t threadId;
int code = pthread_create(&threadId, &attr, QThreadPrivate::start, this);
if (code == EPERM) {
diff --git a/src/corelib/thread/qthread_win.cpp b/src/corelib/thread/qthread_win.cpp
index 820ffa1149..3e0eef411a 100644
--- a/src/corelib/thread/qthread_win.cpp
+++ b/src/corelib/thread/qthread_win.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qthread.h"
#include "qthread_p.h"
@@ -55,6 +19,17 @@
#endif // _MT
#include <process.h>
+extern "C" {
+// MinGW is missing the declaration of SetThreadDescription:
+WINBASEAPI
+HRESULT
+WINAPI
+SetThreadDescription(
+ _In_ HANDLE hThread,
+ _In_ PCWSTR lpThreadDescription
+ );
+}
+
QT_BEGIN_NAMESPACE
#if QT_CONFIG(thread)
@@ -67,7 +42,7 @@ void qt_create_tls()
{
if (qt_current_thread_data_tls_index != TLS_OUT_OF_INDEXES)
return;
- static QBasicMutex mutex;
+ Q_CONSTINIT static QBasicMutex mutex;
QMutexLocker locker(&mutex);
if (qt_current_thread_data_tls_index != TLS_OUT_OF_INDEXES)
return;
@@ -112,8 +87,9 @@ QThreadData *QThreadData::current(bool createIfNecessary)
threadData->isAdopted = true;
threadData->threadId.storeRelaxed(reinterpret_cast<Qt::HANDLE>(quintptr(GetCurrentThreadId())));
- if (!QCoreApplicationPrivate::theMainThread) {
- QCoreApplicationPrivate::theMainThread = threadData->thread.loadRelaxed();
+ if (!QCoreApplicationPrivate::theMainThreadId) {
+ QCoreApplicationPrivate::theMainThread.storeRelease(threadData->thread.loadRelaxed());
+ QCoreApplicationPrivate::theMainThreadId.storeRelaxed(threadData->threadId.loadRelaxed());
} else {
HANDLE realHandle = INVALID_HANDLE_VALUE;
DuplicateHandle(GetCurrentProcess(),
@@ -137,7 +113,7 @@ void QAdoptedThread::init()
static QList<HANDLE> qt_adopted_thread_handles;
static QList<QThread *> qt_adopted_qthreads;
-static QBasicMutex qt_adopted_thread_watcher_mutex;
+Q_CONSTINIT static QBasicMutex qt_adopted_thread_watcher_mutex;
static DWORD qt_adopted_thread_watcher_id = 0;
static HANDLE qt_adopted_thread_wakeup = 0;
@@ -248,39 +224,6 @@ DWORD WINAPI qt_adopted_thread_watcher_function(LPVOID)
return 0;
}
-#if !defined(QT_NO_DEBUG) && defined(Q_CC_MSVC)
-
-#ifndef Q_OS_WIN64
-# define ULONG_PTR DWORD
-#endif
-
-typedef struct tagTHREADNAME_INFO
-{
- DWORD dwType; // must be 0x1000
- LPCSTR szName; // pointer to name (in user addr space)
- HANDLE dwThreadID; // thread ID (-1=caller thread)
- DWORD dwFlags; // reserved for future use, must be zero
-} THREADNAME_INFO;
-
-void qt_set_thread_name(HANDLE threadId, LPCSTR threadName)
-{
- THREADNAME_INFO info;
- info.dwType = 0x1000;
- info.szName = threadName;
- info.dwThreadID = threadId;
- info.dwFlags = 0;
-
- __try
- {
- RaiseException(0x406D1388, 0, sizeof(info)/sizeof(DWORD),
- reinterpret_cast<const ULONG_PTR*>(&info));
- }
- __except (EXCEPTION_CONTINUE_EXECUTION)
- {
- }
-}
-#endif // !QT_NO_DEBUG && Q_CC_MSVC
-
/**************************************************************************
** QThreadPrivate
*************************************************************************/
@@ -314,13 +257,11 @@ unsigned int __stdcall QT_ENSURE_STACK_ALIGNED_FOR_SSE QThreadPrivate::start(voi
data->ensureEventDispatcher();
data->eventDispatcher.loadRelaxed()->startingUp();
-#if !defined(QT_NO_DEBUG) && defined(Q_CC_MSVC)
// sets the name of the current thread.
- QByteArray objectName = thr->objectName().toLocal8Bit();
- qt_set_thread_name(HANDLE(-1),
- objectName.isEmpty() ?
- thr->metaObject()->className() : objectName.constData());
-#endif
+ QString threadName = std::exchange(thr->d_func()->objectName, {});
+ if (Q_LIKELY(threadName.isEmpty()))
+ threadName = QString::fromUtf8(thr->metaObject()->className());
+ SetThreadDescription(GetCurrentThread(), reinterpret_cast<const wchar_t *>(threadName.utf16()));
emit thr->started(QThread::QPrivateSignal());
QThread::setTerminationEnabled(true);
@@ -330,28 +271,44 @@ unsigned int __stdcall QT_ENSURE_STACK_ALIGNED_FOR_SSE QThreadPrivate::start(voi
return 0;
}
+/*
+ For regularly terminating threads, this will be called and executed by the thread as the
+ last code before the thread exits. In that case, \a arg is the current QThread.
+
+ However, this function will also be called by QThread::terminate (as well as wait() and
+ setTerminationEnabled) to give Qt a chance to update the terminated thread's state and
+ process pending DeleteLater events for objects that live in the terminated thread. And for
+ adopted thread, this method is called by the thread watcher.
+
+ In those cases, \a arg will not be the current thread.
+*/
void QThreadPrivate::finish(void *arg, bool lockAnyway) noexcept
{
QThread *thr = reinterpret_cast<QThread *>(arg);
QThreadPrivate *d = thr->d_func();
- QMutexLocker locker(lockAnyway ? &d->mutex : 0);
+ QMutexLocker locker(lockAnyway ? &d->mutex : nullptr);
d->isInFinish = true;
d->priority = QThread::InheritPriority;
void **tls_data = reinterpret_cast<void **>(&d->data->tls);
- locker.unlock();
+ if (lockAnyway)
+ locker.unlock();
emit thr->finished(QThread::QPrivateSignal());
- QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete);
+ qCDebug(lcDeleteLater) << "Sending deferred delete events as part of finishing thread" << thr;
+ QCoreApplicationPrivate::sendPostedEvents(nullptr, QEvent::DeferredDelete, d->data);
QThreadStorageData::finish(tls_data);
- locker.relock();
+ if (lockAnyway)
+ locker.relock();
QAbstractEventDispatcher *eventDispatcher = d->data->eventDispatcher.loadRelaxed();
if (eventDispatcher) {
d->data->eventDispatcher = 0;
- locker.unlock();
+ if (lockAnyway)
+ locker.unlock();
eventDispatcher->closingDown();
delete eventDispatcher;
- locker.relock();
+ if (lockAnyway)
+ locker.relock();
}
d->running = false;
@@ -390,6 +347,12 @@ void QThread::yieldCurrentThread()
#endif // QT_CONFIG(thread)
+void QThread::sleep(std::chrono::nanoseconds nsecs)
+{
+ using namespace std::chrono;
+ ::Sleep(DWORD(duration_cast<milliseconds>(nsecs).count()));
+}
+
void QThread::sleep(unsigned long secs)
{
::Sleep(secs * 1000);
@@ -421,6 +384,9 @@ void QThread::start(Priority priority)
if (d->running)
return;
+ // avoid interacting with the binding system
+ d->objectName = d->extraData ? d->extraData->objectName.valueBypassingBindings()
+ : QString();
d->running = true;
d->finished = false;
d->exited = false;
@@ -457,7 +423,7 @@ void QThread::start(Priority priority)
int prio;
d->priority = priority;
- switch (d->priority) {
+ switch (priority) {
case IdlePriority:
prio = THREAD_PRIORITY_IDLE;
break;
@@ -584,7 +550,7 @@ void QThreadPrivate::setPriority(QThread::Priority threadPriority)
int prio;
priority = threadPriority;
- switch (priority) {
+ switch (threadPriority) {
case QThread::IdlePriority:
prio = THREAD_PRIORITY_IDLE;
break;
diff --git a/src/corelib/thread/qthreadpool.cpp b/src/corelib/thread/qthreadpool.cpp
index 713c436371..ae584656fe 100644
--- a/src/corelib/thread/qthreadpool.cpp
+++ b/src/corelib/thread/qthreadpool.cpp
@@ -1,51 +1,20 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qthreadpool.h"
#include "qthreadpool_p.h"
#include "qdeadlinetimer.h"
#include "qcoreapplication.h"
+#include <QtCore/qpointer.h>
+
#include <algorithm>
+#include <memory>
QT_BEGIN_NAMESPACE
+using namespace Qt::StringLiterals;
+
/*
QThread wrapper, provides synchronization against a ThreadPool
*/
@@ -120,7 +89,7 @@ void QThreadPoolThread::run()
if (manager->queue.isEmpty())
break;
- QueuePage *page = manager->queue.first();
+ QueuePage *page = manager->queue.constFirst();
r = page->pop();
if (page->isFinished()) {
@@ -221,7 +190,7 @@ inline bool comparePriority(int priority, const QueuePage *p)
void QThreadPoolPrivate::enqueueTask(QRunnable *runnable, int priority)
{
Q_ASSERT(runnable != nullptr);
- for (QueuePage *page : qAsConst(queue)) {
+ for (QueuePage *page : std::as_const(queue)) {
if (page->priority() == priority && !page->isFull()) {
page->push(runnable);
return;
@@ -233,9 +202,9 @@ void QThreadPoolPrivate::enqueueTask(QRunnable *runnable, int priority)
int QThreadPoolPrivate::activeThreadCount() const
{
- return (allThreads.count()
- - expiredThreads.count()
- - waitingThreads.count()
+ return (allThreads.size()
+ - expiredThreads.size()
+ - waitingThreads.size()
+ reservedThreads);
}
@@ -243,7 +212,7 @@ void QThreadPoolPrivate::tryToStartMoreThreads()
{
// try to push tasks on the queue to any available threads
while (!queue.isEmpty()) {
- QueuePage *page = queue.first();
+ QueuePage *page = queue.constFirst();
if (!tryStart(page->first()))
break;
@@ -273,21 +242,17 @@ bool QThreadPoolPrivate::tooManyThreadsActive() const
*/
void QThreadPoolPrivate::startThread(QRunnable *runnable)
{
- Q_Q(QThreadPool);
Q_ASSERT(runnable != nullptr);
- QScopedPointer<QThreadPoolThread> thread(new QThreadPoolThread(this));
- QString objectName;
- if (QString myName = q->objectName(); !myName.isEmpty())
- objectName = myName;
- else
- objectName = QLatin1String("Thread (pooled)");
+ auto thread = std::make_unique<QThreadPoolThread>(this);
+ if (objectName.isEmpty())
+ objectName = u"Thread (pooled)"_s;
thread->setObjectName(objectName);
- Q_ASSERT(!allThreads.contains(thread.data())); // if this assert hits, we have an ABA problem (deleted threads don't get removed here)
- allThreads.insert(thread.data());
+ Q_ASSERT(!allThreads.contains(thread.get())); // if this assert hits, we have an ABA problem (deleted threads don't get removed here)
+ allThreads.insert(thread.get());
++activeThreads;
thread->runnable = runnable;
- thread.take()->start(threadPriority);
+ thread.release()->start(threadPriority);
}
/*!
@@ -306,7 +271,7 @@ void QThreadPoolPrivate::reset()
mutex.unlock();
- for (QThreadPoolThread *thread : qAsConst(allThreadsCopy)) {
+ for (QThreadPoolThread *thread : std::as_const(allThreadsCopy)) {
if (thread->isRunning()) {
thread->runnableReady.wakeAll();
thread->wait();
@@ -385,7 +350,7 @@ bool QThreadPool::tryTake(QRunnable *runnable)
return false;
QMutexLocker locker(&d->mutex);
- for (QueuePage *page : qAsConst(d->queue)) {
+ for (QueuePage *page : std::as_const(d->queue)) {
if (page->tryTake(runnable)) {
if (page->isFinished()) {
d->queue.removeOne(page);
@@ -476,7 +441,14 @@ void QThreadPoolPrivate::stealAndRunRunnable(QRunnable *runnable)
*/
QThreadPool::QThreadPool(QObject *parent)
: QObject(*new QThreadPoolPrivate, parent)
-{ }
+{
+ Q_D(QThreadPool);
+ connect(this, &QObject::objectNameChanged, this, [d](const QString &newName) {
+ // We keep a copy of the name under our own lock, so we can access it thread-safely.
+ QMutexLocker locker(&d->mutex);
+ d->objectName = newName;
+ });
+}
/*!
Destroys the QThreadPool.
@@ -495,8 +467,8 @@ QThreadPool::~QThreadPool()
*/
QThreadPool *QThreadPool::globalInstance()
{
- static QPointer<QThreadPool> theInstance;
- static QBasicMutex theMutex;
+ Q_CONSTINIT static QPointer<QThreadPool> theInstance;
+ Q_CONSTINIT static QBasicMutex theMutex;
const QMutexLocker locker(&theMutex);
if (theInstance.isNull() && !QCoreApplication::closingDown())
@@ -505,6 +477,21 @@ QThreadPool *QThreadPool::globalInstance()
}
/*!
+ Returns the QThreadPool instance for Qt Gui.
+ \internal
+*/
+QThreadPool *QThreadPoolPrivate::qtGuiInstance()
+{
+ Q_CONSTINIT static QPointer<QThreadPool> guiInstance;
+ Q_CONSTINIT static QBasicMutex theMutex;
+
+ const QMutexLocker locker(&theMutex);
+ if (guiInstance.isNull() && !QCoreApplication::closingDown())
+ guiInstance = new QThreadPool();
+ return guiInstance;
+}
+
+/*!
Reserves a thread and uses it to run \a runnable, unless this thread will
make the current thread count exceed maxThreadCount(). In that case,
\a runnable is added to a run queue instead. The \a priority argument can
@@ -532,20 +519,21 @@ void QThreadPool::start(QRunnable *runnable, int priority)
}
/*!
+ \fn template<typename Callable, QRunnable::if_callable<Callable>> void QThreadPool::start(Callable &&callableToRun, int priority)
\overload
\since 5.15
- Reserves a thread and uses it to run \a functionToRun, unless this thread will
+ Reserves a thread and uses it to run \a callableToRun, unless this thread will
make the current thread count exceed maxThreadCount(). In that case,
- \a functionToRun is added to a run queue instead. The \a priority argument can
+ \a callableToRun is added to a run queue instead. The \a priority argument can
be used to control the run queue's order of execution.
+
+ \note This function participates in overload resolution only if \c Callable
+ is a function or function object which can be called with zero arguments.
+
+ \note In Qt version prior to 6.6, this function took std::function<void()>,
+ and therefore couldn't handle move-only callables.
*/
-void QThreadPool::start(std::function<void()> functionToRun, int priority)
-{
- if (!functionToRun)
- return;
- start(QRunnable::create(std::move(functionToRun)), priority);
-}
/*!
Attempts to reserve a thread to run \a runnable.
@@ -577,30 +565,21 @@ bool QThreadPool::tryStart(QRunnable *runnable)
}
/*!
+ \fn template<typename Callable, QRunnable::if_callable<Callable>> bool QThreadPool::tryStart(Callable &&callableToRun)
\overload
\since 5.15
- Attempts to reserve a thread to run \a functionToRun.
+ Attempts to reserve a thread to run \a callableToRun.
If no threads are available at the time of calling, then this function
- does nothing and returns \c false. Otherwise, \a functionToRun is run immediately
+ does nothing and returns \c false. Otherwise, \a callableToRun is run immediately
using one available thread and this function returns \c true.
-*/
-bool QThreadPool::tryStart(std::function<void()> functionToRun)
-{
- if (!functionToRun)
- return false;
- Q_D(QThreadPool);
- QMutexLocker locker(&d->mutex);
- if (!d->allThreads.isEmpty() && d->areAllThreadsActive())
- return false;
+ \note This function participates in overload resolution only if \c Callable
+ is a function or function object which can be called with zero arguments.
- QRunnable *runnable = QRunnable::create(std::move(functionToRun));
- if (d->tryStart(runnable))
- return true;
- delete runnable;
- return false;
-}
+ \note In Qt version prior to 6.6, this function took std::function<void()>,
+ and therefore couldn't handle move-only callables.
+*/
/*! \property QThreadPool::expiryTimeout
\brief the thread expiry timeout value in milliseconds.
@@ -620,12 +599,14 @@ bool QThreadPool::tryStart(std::function<void()> functionToRun)
int QThreadPool::expiryTimeout() const
{
Q_D(const QThreadPool);
+ QMutexLocker locker(&d->mutex);
return d->expiryTimeout;
}
void QThreadPool::setExpiryTimeout(int expiryTimeout)
{
Q_D(QThreadPool);
+ QMutexLocker locker(&d->mutex);
if (d->expiryTimeout == expiryTimeout)
return;
d->expiryTimeout = expiryTimeout;
@@ -646,6 +627,7 @@ void QThreadPool::setExpiryTimeout(int expiryTimeout)
int QThreadPool::maxThreadCount() const
{
Q_D(const QThreadPool);
+ QMutexLocker locker(&d->mutex);
return d->requestedMaxThreadCount;
}
@@ -715,12 +697,14 @@ void QThreadPool::reserveThread()
void QThreadPool::setStackSize(uint stackSize)
{
Q_D(QThreadPool);
+ QMutexLocker locker(&d->mutex);
d->stackSize = stackSize;
}
uint QThreadPool::stackSize() const
{
Q_D(const QThreadPool);
+ QMutexLocker locker(&d->mutex);
return d->stackSize;
}
@@ -741,12 +725,14 @@ uint QThreadPool::stackSize() const
void QThreadPool::setThreadPriority(QThread::Priority priority)
{
Q_D(QThreadPool);
+ QMutexLocker locker(&d->mutex);
d->threadPriority = priority;
}
QThread::Priority QThreadPool::threadPriority() const
{
Q_D(const QThreadPool);
+ QMutexLocker locker(&d->mutex);
return d->threadPriority;
}
@@ -807,19 +793,19 @@ void QThreadPool::startOnReservedThread(QRunnable *runnable)
}
/*!
+ \fn template<typename Callable, QRunnable::if_callable<Callable>> void QThreadPool::startOnReservedThread(Callable &&callableToRun)
\overload
\since 6.3
Releases a thread previously reserved with reserveThread() and uses it
- to run \a functionToRun.
-*/
-void QThreadPool::startOnReservedThread(std::function<void()> functionToRun)
-{
- if (!functionToRun)
- return releaseThread();
+ to run \a callableToRun.
- startOnReservedThread(QRunnable::create(std::move(functionToRun)));
-}
+ \note This function participates in overload resolution only if \c Callable
+ is a function or function object which can be called with zero arguments.
+
+ \note In Qt version prior to 6.6, this function took std::function<void()>,
+ and therefore couldn't handle move-only callables.
+*/
/*!
Waits up to \a msecs milliseconds for all threads to exit and removes all
diff --git a/src/corelib/thread/qthreadpool.h b/src/corelib/thread/qthreadpool.h
index 853055cb30..a097ace14b 100644
--- a/src/corelib/thread/qthreadpool.h
+++ b/src/corelib/thread/qthreadpool.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QTHREADPOOL_H
#define QTHREADPOOL_H
@@ -72,11 +36,22 @@ public:
void start(QRunnable *runnable, int priority = 0);
bool tryStart(QRunnable *runnable);
+#if QT_CORE_REMOVED_SINCE(6, 6)
void start(std::function<void()> functionToRun, int priority = 0);
bool tryStart(std::function<void()> functionToRun);
+#endif
void startOnReservedThread(QRunnable *runnable);
+#if QT_CORE_REMOVED_SINCE(6, 6)
void startOnReservedThread(std::function<void()> functionToRun);
+#endif
+
+ template <typename Callable, QRunnable::if_callable<Callable> = true>
+ void start(Callable &&functionToRun, int priority = 0);
+ template <typename Callable, QRunnable::if_callable<Callable> = true>
+ bool tryStart(Callable &&functionToRun);
+ template <typename Callable, QRunnable::if_callable<Callable> = true>
+ void startOnReservedThread(Callable &&functionToRun);
int expiryTimeout() const;
void setExpiryTimeout(int expiryTimeout);
@@ -104,6 +79,28 @@ public:
[[nodiscard]] bool tryTake(QRunnable *runnable);
};
+template <typename Callable, QRunnable::if_callable<Callable>>
+void QThreadPool::start(Callable &&functionToRun, int priority)
+{
+ start(QRunnable::create(std::forward<Callable>(functionToRun)), priority);
+}
+
+template <typename Callable, QRunnable::if_callable<Callable>>
+bool QThreadPool::tryStart(Callable &&functionToRun)
+{
+ QRunnable *runnable = QRunnable::create(std::forward<Callable>(functionToRun));
+ if (tryStart(runnable))
+ return true;
+ delete runnable;
+ return false;
+}
+
+template <typename Callable, QRunnable::if_callable<Callable>>
+void QThreadPool::startOnReservedThread(Callable &&functionToRun)
+{
+ startOnReservedThread(QRunnable::create(std::forward<Callable>(functionToRun)));
+}
+
QT_END_NAMESPACE
#endif
diff --git a/src/corelib/thread/qthreadpool_p.h b/src/corelib/thread/qthreadpool_p.h
index 1b6a65f69d..67c703fabd 100644
--- a/src/corelib/thread/qthreadpool_p.h
+++ b/src/corelib/thread/qthreadpool_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QTHREADPOOL_P_H
#define QTHREADPOOL_P_H
@@ -170,12 +134,15 @@ public:
void stealAndRunRunnable(QRunnable *runnable);
void deletePageIfFinished(QueuePage *page);
+ static QThreadPool *qtGuiInstance();
+
mutable QMutex mutex;
QSet<QThreadPoolThread *> allThreads;
QQueue<QThreadPoolThread *> waitingThreads;
QQueue<QThreadPoolThread *> expiredThreads;
QList<QueuePage *> queue;
QWaitCondition noActiveThreads;
+ QString objectName;
int expiryTimeout = 30000;
int requestedMaxThreadCount = QThread::idealThreadCount(); // don't use this directly
diff --git a/src/corelib/thread/qthreadstorage.cpp b/src/corelib/thread/qthreadstorage.cpp
index ee8273687b..c2029fe1b3 100644
--- a/src/corelib/thread/qthreadstorage.cpp
+++ b/src/corelib/thread/qthreadstorage.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qthreadstorage.h"
@@ -68,7 +32,7 @@ void qtsDebug(const char *fmt, ...)
# define DEBUG_MSG if (false)qDebug
#endif
-static QBasicMutex destructorsMutex;
+Q_CONSTINIT static QBasicMutex destructorsMutex;
typedef QList<void (*)(void *)> DestructorMap;
Q_GLOBAL_STATIC(DestructorMap, destructors)
@@ -87,15 +51,15 @@ QThreadStorageData::QThreadStorageData(void (*func)(void *))
no where to store it, and no way to actually call it.
*/
QThreadData *data = QThreadData::current();
- id = data->tls.count();
+ id = data->tls.size();
DEBUG_MSG("QThreadStorageData: Allocated id %d, destructor %p cannot be stored", id, func);
return;
}
- for (id = 0; id < destr->count(); id++) {
+ for (id = 0; id < destr->size(); id++) {
if (destr->at(id) == nullptr)
break;
}
- if (id == destr->count()) {
+ if (id == destr->size()) {
destr->append(func);
} else {
(*destr)[id] = func;
diff --git a/src/corelib/thread/qthreadstorage.h b/src/corelib/thread/qthreadstorage.h
index a7e93f03a5..1a8dacae0f 100644
--- a/src/corelib/thread/qthreadstorage.h
+++ b/src/corelib/thread/qthreadstorage.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QTHREADSTORAGE_H
#define QTHREADSTORAGE_H
diff --git a/src/corelib/thread/qtsan_impl.h b/src/corelib/thread/qtsan_impl.h
new file mode 100644
index 0000000000..b28d65e65f
--- /dev/null
+++ b/src/corelib/thread/qtsan_impl.h
@@ -0,0 +1,79 @@
+// Copyright (C) 2017 Intel Corporation.
+// Copyright (C) 2022 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QTSAN_IMPL_H
+#define QTSAN_IMPL_H
+
+#include <QtCore/qglobal.h>
+
+#if (__has_feature(thread_sanitizer) || defined(__SANITIZE_THREAD__)) && __has_include(<sanitizer/tsan_interface.h>)
+# define QT_BUILDING_UNDER_TSAN
+# include <sanitizer/tsan_interface.h>
+#endif
+
+QT_BEGIN_NAMESPACE
+
+namespace QtTsan {
+#ifdef QT_BUILDING_UNDER_TSAN
+inline void futexAcquire(void *addr, void *addr2 = nullptr)
+{
+ // A futex call ensures total ordering on the futex words
+ // (in either success or failure of the call). Instruct TSAN accordingly,
+ // as TSAN does not understand the futex(2) syscall (or equivalent).
+ ::__tsan_acquire(addr);
+ if (addr2)
+ ::__tsan_acquire(addr2);
+}
+
+inline void futexRelease(void *addr, void *addr2 = nullptr)
+{
+ if (addr2)
+ ::__tsan_release(addr2);
+ ::__tsan_release(addr);
+}
+
+inline void mutexPreLock(void *addr, unsigned flags)
+{
+ ::__tsan_mutex_pre_lock(addr, flags);
+}
+
+inline void mutexPostLock(void *addr, unsigned flags, int recursion)
+{
+ ::__tsan_mutex_post_lock(addr, flags, recursion);
+}
+
+inline void mutexPreUnlock(void *addr, unsigned flags)
+{
+ ::__tsan_mutex_pre_unlock(addr, flags);
+}
+
+inline void mutexPostUnlock(void *addr, unsigned flags)
+{
+ ::__tsan_mutex_post_unlock(addr, flags);
+}
+
+enum : unsigned {
+ MutexWriteReentrant = ::__tsan_mutex_write_reentrant,
+ TryLock = ::__tsan_mutex_try_lock,
+ TryLockFailed = ::__tsan_mutex_try_lock_failed,
+};
+#else
+inline void futexAcquire(void *, void * = nullptr) {}
+inline void futexRelease(void *, void * = nullptr) {}
+
+enum : unsigned {
+ MutexWriteReentrant,
+ TryLock,
+ TryLockFailed,
+};
+inline void mutexPreLock(void *, unsigned) {}
+inline void mutexPostLock(void *, unsigned, int) {}
+inline void mutexPreUnlock(void *, unsigned) {}
+inline void mutexPostUnlock(void *, unsigned) {}
+#endif // QT_BUILDING_UNDER_TSAN
+} // namespace QtTsan
+
+QT_END_NAMESPACE
+
+#endif // QTSAN_IMPL_H
diff --git a/src/corelib/thread/qwaitcondition.h b/src/corelib/thread/qwaitcondition.h
index 3d0117ad03..8f8270c918 100644
--- a/src/corelib/thread/qwaitcondition.h
+++ b/src/corelib/thread/qwaitcondition.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QWAITCONDITION_H
#define QWAITCONDITION_H
diff --git a/src/corelib/thread/qwaitcondition.qdoc b/src/corelib/thread/qwaitcondition.qdoc
index 014d549477..8466eb13d2 100644
--- a/src/corelib/thread/qwaitcondition.qdoc
+++ b/src/corelib/thread/qwaitcondition.qdoc
@@ -1,29 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
\class QWaitCondition
@@ -75,12 +51,12 @@
simultaneously are unpredictable.
Wait conditions are a powerful thread synchronization primitive.
- The \l{Wait Conditions Example} example shows how
- to use QWaitCondition as an alternative to QSemaphore for
- controlling access to a circular buffer shared by a producer
+ The \l{Producer and Consumer using Wait Conditions} example
+ shows how to use QWaitCondition as an alternative to QSemaphore
+ for controlling access to a circular buffer shared by a producer
thread and a consumer thread.
- \sa QMutex, QSemaphore, QThread, {Wait Conditions Example}
+ \sa QMutex, QSemaphore, QThread, {Producer and Consumer using Wait Conditions}
*/
/*!
@@ -122,10 +98,16 @@
/*!
\fn bool QWaitCondition::wait(QMutex *lockedMutex, unsigned long time)
\overload
+
+ Releases the \a lockedMutex and waits on the wait condition for \a time
+ milliseconds.
*/
/*!
\fn bool QWaitCondition::wait(QReadWriteLock *lockedReadWriteLock, unsigned long time)
\overload
+
+ Releases the \a lockedReadWriteLock and waits on the wait condition for \a
+ time milliseconds.
*/
/*!
diff --git a/src/corelib/thread/qwaitcondition_p.h b/src/corelib/thread/qwaitcondition_p.h
index 26a7e03ba7..14833d56ef 100644
--- a/src/corelib/thread/qwaitcondition_p.h
+++ b/src/corelib/thread/qwaitcondition_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2019 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2019 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QWAITCONDITION_P_H
#define QWAITCONDITION_P_H
@@ -43,10 +7,9 @@
// W A R N I N G
// -------------
//
-// This file is not part of the Qt API. It exists for the convenience
-// of qmutex.cpp, qmutex_unix.cpp, and qmutex_win.cpp. This header
-// file may change from version to version without notice, or even be
-// removed.
+// This file is not part of the Qt API. It exists for the convenience of
+// qmutex.cpp and qmutex_unix.cpp. This header file may change from version to
+// version without notice, or even be removed.
//
// We mean it.
//
@@ -54,105 +17,21 @@
#include <QtCore/QWaitCondition>
#include <QtCore/QMutex>
#include <QtCore/QDeadlineTimer>
+#include <QtCore/private/qglobal_p.h>
#include <condition_variable>
#include <mutex>
-// There's no feature macro for C++11 std::mutex, so we use the C++14 one
-// for shared_mutex to detect it.
-// Needed for: MinGW without gthreads, Integrity
-#if __has_include(<shared_mutex>)
-# include <shared_mutex>
-#endif
-
QT_BEGIN_NAMESPACE
namespace QtPrivate {
-
-#if !defined(__cpp_lib_shared_timed_mutex)
-
-enum class cv_status { no_timeout, timeout };
-class condition_variable;
-
-class mutex : private QMutex
-{
- friend class QtPrivate::condition_variable;
-
-public:
- // all special member functions are ok!
- // do not expose the (QMutex::Recursive) ctor
- // don't use 'using QMutex::lock;' etc as those have the wrong noexcept
-
- void lock() { return QMutex::lock(); }
- void unlock() { return QMutex::unlock(); }
- bool try_lock() { return QMutex::tryLock(); }
-};
-
-class condition_variable : private QWaitCondition
-{
-public:
- // all special member functions are ok!
-
- void notify_one() { QWaitCondition::wakeOne(); }
- void notify_all() { QWaitCondition::wakeAll(); }
-
- void wait(std::unique_lock<QtPrivate::mutex> &lock) { QWaitCondition::wait(lock.mutex()); }
- template <class Predicate>
- void wait(std::unique_lock<QtPrivate::mutex> &lock, Predicate p)
- {
- while (!p())
- wait(lock);
- }
-
- template <typename Rep, typename Period>
- cv_status wait_for(std::unique_lock<QtPrivate::mutex> &lock,
- const std::chrono::duration<Rep, Period> &d)
- {
- return QWaitCondition::wait(lock.mutex(), QDeadlineTimer{d})
- ? cv_status::no_timeout
- : cv_status::timeout;
- }
- template <typename Rep, typename Period, typename Predicate>
- bool wait_for(std::unique_lock<QtPrivate::mutex> &lock,
- const std::chrono::duration<Rep, Period> &d, Predicate p)
- {
- const auto timer = QDeadlineTimer{d};
- while (!p()) {
- if (!QWaitCondition::wait(lock.mutex(), timer))
- return p();
- }
- return true;
- }
-
- template <typename Clock, typename Duration>
- cv_status wait_until(std::unique_lock<QtPrivate::mutex> &lock,
- const std::chrono::time_point<Clock, Duration> &t)
- {
- return QWaitCondition::wait(lock.mutex(), QDeadlineTimer{t})
- ? cv_status::no_timeout
- : cv_status::timeout;
- }
-
- template <typename Clock, typename Duration, typename Predicate>
- bool wait_until(std::unique_lock<QtPrivate::mutex> &lock,
- const std::chrono::time_point<Clock, Duration> &t, Predicate p)
- {
- const auto timer = QDeadlineTimer{t};
- while (!p()) {
- if (!QWaitCondition::wait(lock.mutex(), timer))
- return p();
- }
- return true;
- }
-
-};
-
-#else // C++11 threads
-
-using mutex = std::mutex;
-using condition_variable = std::condition_variable;
-
-#endif // C++11 threads
+// Ideal alignment for mutex and condition_variable: it's the hardware
+// interference size (size of a cache line) if the types are likely to contain
+// the actual data structures, otherwise just that of a pointer.
+static constexpr quintptr IdealMutexAlignment =
+ sizeof(std::mutex) > sizeof(void *) &&
+ sizeof(std::condition_variable) > sizeof(void *) ?
+ 64 : alignof(void*);
} // namespace QtPrivate
diff --git a/src/corelib/thread/qwaitcondition_unix.cpp b/src/corelib/thread/qwaitcondition_unix.cpp
index 01848a5004..d841183f09 100644
--- a/src/corelib/thread/qwaitcondition_unix.cpp
+++ b/src/corelib/thread/qwaitcondition_unix.cpp
@@ -1,55 +1,17 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2016 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
-#include "qplatformdefs.h"
#include "qwaitcondition.h"
+
+#include "qatomic.h"
+#include "qdeadlinetimer.h"
#include "qmutex.h"
+#include "qplatformdefs.h"
#include "qreadwritelock.h"
-#include "qatomic.h"
#include "qstring.h"
-#include "qdeadlinetimer.h"
-#include "private/qdeadlinetimer_p.h"
-#include "qelapsedtimer.h"
-#include "private/qcore_unix_p.h"
-#include "qmutex_p.h"
+#include "private/qcore_unix_p.h"
#include "qreadwritelock_p.h"
#include <errno.h>
@@ -58,60 +20,61 @@
QT_BEGIN_NAMESPACE
-#ifdef Q_OS_ANDROID
-// pthread_condattr_setclock is available only since Android 5.0. On older versions, there's
-// a private function for relative waits (hidden in 5.0).
-// Use weakref so we can determine at runtime whether each of them is present.
-static int local_condattr_setclock(pthread_condattr_t*, clockid_t)
-__attribute__((weakref("pthread_condattr_setclock")));
-
-static int local_cond_timedwait_relative(pthread_cond_t*, pthread_mutex_t *, const timespec *)
-__attribute__((weakref("__pthread_cond_timedwait_relative")));
+static constexpr clockid_t SteadyClockClockId =
+#if !defined(CLOCK_MONOTONIC)
+ // we don't know how to set the monotonic clock
+ CLOCK_REALTIME
+#elif defined(_LIBCPP_VERSION) && defined(_LIBCPP_HAS_NO_MONOTONIC_CLOCK)
+ // libc++ falling back to system_clock
+ CLOCK_REALTIME
+#elif defined(__GLIBCXX__) && !defined(_GLIBCXX_USE_CLOCK_MONOTONIC)
+ // libstdc++ falling back to system_clock
+ CLOCK_REALTIME
+#elif defined(Q_OS_DARWIN)
+ // Darwin lacks pthread_condattr_setclock()
+ CLOCK_REALTIME
+#elif defined(Q_OS_QNX)
+ // unknown why
+ CLOCK_REALTIME
+#elif defined(__GLIBCXX__) || defined(_LIBCPP_VERSION)
+ // both libstdc++ and libc++ do use CLOCK_MONOTONIC
+ CLOCK_MONOTONIC
+#else
+# warning "Unknown C++ Standard Library implementation - code may be sub-optimal"
+ CLOCK_REALTIME
#endif
+ ;
-static void report_error(int code, const char *where, const char *what)
+static void qt_report_pthread_error(int code, const char *where, const char *what)
{
if (code != 0)
qErrnoWarning(code, "%s: %s failure", where, what);
}
-void qt_initialize_pthread_cond(pthread_cond_t *cond, const char *where)
+static void qt_initialize_pthread_cond(pthread_cond_t *cond, const char *where)
{
+ pthread_condattr_t *attrp = nullptr;
+
+#if defined(CLOCK_MONOTONIC) && !defined(Q_OS_DARWIN)
pthread_condattr_t condattr;
+ attrp = &condattr;
pthread_condattr_init(&condattr);
-#if (_POSIX_MONOTONIC_CLOCK-0 >= 0)
-#if defined(Q_OS_ANDROID)
- if (local_condattr_setclock && QElapsedTimer::clockType() == QElapsedTimer::MonotonicClock)
- local_condattr_setclock(&condattr, CLOCK_MONOTONIC);
-#elif !defined(Q_OS_MAC)
- if (QElapsedTimer::clockType() == QElapsedTimer::MonotonicClock)
- pthread_condattr_setclock(&condattr, CLOCK_MONOTONIC);
-#endif
+ auto destroy = qScopeGuard([&] { pthread_condattr_destroy(&condattr); });
+ if (SteadyClockClockId != CLOCK_REALTIME)
+ pthread_condattr_setclock(&condattr, SteadyClockClockId);
#endif
- report_error(pthread_cond_init(cond, &condattr), where, "cv init");
- pthread_condattr_destroy(&condattr);
+
+ qt_report_pthread_error(pthread_cond_init(cond, attrp), where, "cv init");
}
-void qt_abstime_for_timeout(timespec *ts, QDeadlineTimer deadline)
+static void qt_abstime_for_timeout(timespec *ts, QDeadlineTimer deadline)
{
-#ifdef Q_OS_MAC
- // on Mac, qt_gettime() (on qelapsedtimer_mac.cpp) returns ticks related to the Mach absolute time
- // that doesn't work with pthread
- // Mac also doesn't have clock_gettime
- struct timeval tv;
- qint64 nsec = deadline.remainingTimeNSecs();
- gettimeofday(&tv, 0);
- ts->tv_sec = tv.tv_sec + nsec / (1000 * 1000 * 1000);
- ts->tv_nsec = tv.tv_usec * 1000 + nsec % (1000 * 1000 * 1000);
-
- normalizedTimespec(*ts);
-#else
- // depends on QDeadlineTimer's internals!!
- static_assert(QDeadlineTimerNanosecondsInT2);
- ts->tv_sec = deadline._q_data().first;
- ts->tv_nsec = deadline._q_data().second;
-#endif
+ using namespace std::chrono;
+ using Clock =
+ std::conditional_t<SteadyClockClockId == CLOCK_REALTIME, system_clock, steady_clock>;
+ auto timePoint = deadline.deadline<Clock>();
+ *ts = durationToTimespec(timePoint.time_since_epoch());
}
class QWaitConditionPrivate
@@ -125,14 +88,6 @@ public:
int wait_relative(QDeadlineTimer deadline)
{
timespec ti;
-#ifdef Q_OS_ANDROID
- if (!local_condattr_setclock && local_cond_timedwait_relative) {
- qint64 nsec = deadline.remainingTimeNSecs();
- ti.tv_sec = nsec / (1000 * 1000 * 1000);
- ti.tv_nsec = nsec - ti.tv_sec * 1000 * 1000 * 1000;
- return local_cond_timedwait_relative(&cond, &mutex, &ti);
- }
-#endif
qt_abstime_for_timeout(&ti, deadline);
return pthread_cond_timedwait(&cond, &mutex, &ti);
}
@@ -147,9 +102,7 @@ public:
code = pthread_cond_wait(&cond, &mutex);
}
if (code == 0 && wakeups == 0) {
- // many vendors warn of spurious wakeups from
- // pthread_cond_wait(), especially after signal delivery,
- // even though POSIX doesn't allow for it... sigh
+ // spurious wakeup
continue;
}
break;
@@ -161,10 +114,11 @@ public:
Q_ASSERT_X(wakeups > 0, "QWaitCondition::wait", "internal error (wakeups)");
--wakeups;
}
- report_error(pthread_mutex_unlock(&mutex), "QWaitCondition::wait()", "mutex unlock");
+ qt_report_pthread_error(pthread_mutex_unlock(&mutex), "QWaitCondition::wait()",
+ "mutex unlock");
if (code && code != ETIMEDOUT)
- report_error(code, "QWaitCondition::wait()", "cv wait");
+ qt_report_pthread_error(code, "QWaitCondition::wait()", "cv wait");
return (code == 0);
}
@@ -173,32 +127,38 @@ public:
QWaitCondition::QWaitCondition()
{
d = new QWaitConditionPrivate;
- report_error(pthread_mutex_init(&d->mutex, nullptr), "QWaitCondition", "mutex init");
+ qt_report_pthread_error(pthread_mutex_init(&d->mutex, nullptr), "QWaitCondition", "mutex init");
qt_initialize_pthread_cond(&d->cond, "QWaitCondition");
d->waiters = d->wakeups = 0;
}
QWaitCondition::~QWaitCondition()
{
- report_error(pthread_cond_destroy(&d->cond), "QWaitCondition", "cv destroy");
- report_error(pthread_mutex_destroy(&d->mutex), "QWaitCondition", "mutex destroy");
+ qt_report_pthread_error(pthread_cond_destroy(&d->cond), "QWaitCondition", "cv destroy");
+ qt_report_pthread_error(pthread_mutex_destroy(&d->mutex), "QWaitCondition", "mutex destroy");
delete d;
}
void QWaitCondition::wakeOne()
{
- report_error(pthread_mutex_lock(&d->mutex), "QWaitCondition::wakeOne()", "mutex lock");
+ qt_report_pthread_error(pthread_mutex_lock(&d->mutex), "QWaitCondition::wakeOne()",
+ "mutex lock");
d->wakeups = qMin(d->wakeups + 1, d->waiters);
- report_error(pthread_cond_signal(&d->cond), "QWaitCondition::wakeOne()", "cv signal");
- report_error(pthread_mutex_unlock(&d->mutex), "QWaitCondition::wakeOne()", "mutex unlock");
+ qt_report_pthread_error(pthread_cond_signal(&d->cond), "QWaitCondition::wakeOne()",
+ "cv signal");
+ qt_report_pthread_error(pthread_mutex_unlock(&d->mutex), "QWaitCondition::wakeOne()",
+ "mutex unlock");
}
void QWaitCondition::wakeAll()
{
- report_error(pthread_mutex_lock(&d->mutex), "QWaitCondition::wakeAll()", "mutex lock");
+ qt_report_pthread_error(pthread_mutex_lock(&d->mutex), "QWaitCondition::wakeAll()",
+ "mutex lock");
d->wakeups = d->waiters;
- report_error(pthread_cond_broadcast(&d->cond), "QWaitCondition::wakeAll()", "cv broadcast");
- report_error(pthread_mutex_unlock(&d->mutex), "QWaitCondition::wakeAll()", "mutex unlock");
+ qt_report_pthread_error(pthread_cond_broadcast(&d->cond), "QWaitCondition::wakeAll()",
+ "cv broadcast");
+ qt_report_pthread_error(pthread_mutex_unlock(&d->mutex), "QWaitCondition::wakeAll()",
+ "mutex unlock");
}
bool QWaitCondition::wait(QMutex *mutex, unsigned long time)
@@ -213,7 +173,7 @@ bool QWaitCondition::wait(QMutex *mutex, QDeadlineTimer deadline)
if (!mutex)
return false;
- report_error(pthread_mutex_lock(&d->mutex), "QWaitCondition::wait()", "mutex lock");
+ qt_report_pthread_error(pthread_mutex_lock(&d->mutex), "QWaitCondition::wait()", "mutex lock");
++d->waiters;
mutex->unlock();
@@ -233,24 +193,26 @@ bool QWaitCondition::wait(QReadWriteLock *readWriteLock, unsigned long time)
bool QWaitCondition::wait(QReadWriteLock *readWriteLock, QDeadlineTimer deadline)
{
+ using namespace QReadWriteLockStates;
+
if (!readWriteLock)
return false;
- auto previousState = readWriteLock->stateForWaitCondition();
- if (previousState == QReadWriteLock::Unlocked)
+ auto previousState = QReadWriteLockPrivate::stateForWaitCondition(readWriteLock);
+ if (previousState == Unlocked)
return false;
- if (previousState == QReadWriteLock::RecursivelyLocked) {
+ if (previousState == RecursivelyLocked) {
qWarning("QWaitCondition: cannot wait on QReadWriteLocks with recursive lockForWrite()");
return false;
}
- report_error(pthread_mutex_lock(&d->mutex), "QWaitCondition::wait()", "mutex lock");
+ qt_report_pthread_error(pthread_mutex_lock(&d->mutex), "QWaitCondition::wait()", "mutex lock");
++d->waiters;
readWriteLock->unlock();
bool returnValue = d->wait(deadline);
- if (previousState == QReadWriteLock::LockedForWrite)
+ if (previousState == LockedForWrite)
readWriteLock->lockForWrite();
else
readWriteLock->lockForRead();
diff --git a/src/corelib/thread/qwaitcondition_win.cpp b/src/corelib/thread/qwaitcondition_win.cpp
index 1529cda089..ba53309e1b 100644
--- a/src/corelib/thread/qwaitcondition_win.cpp
+++ b/src/corelib/thread/qwaitcondition_win.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qwaitcondition.h"
#include "qdeadlinetimer.h"
@@ -79,7 +43,7 @@ public:
EventQueue freeQueue;
QWaitConditionEvent *pre();
- bool wait(QWaitConditionEvent *wce, unsigned long time);
+ bool wait(QWaitConditionEvent *wce, QDeadlineTimer deadline);
void post(QWaitConditionEvent *wce, bool ret);
};
@@ -104,19 +68,25 @@ QWaitConditionEvent *QWaitConditionPrivate::pre()
return wce;
}
-bool QWaitConditionPrivate::wait(QWaitConditionEvent *wce, unsigned long time)
+bool QWaitConditionPrivate::wait(QWaitConditionEvent *wce, QDeadlineTimer deadline)
{
// wait for the event
- bool ret = false;
- switch (WaitForSingleObjectEx(wce->event, time, FALSE)) {
- default:
- break;
-
- case WAIT_OBJECT_0:
- ret = true;
- break;
+ while (true) {
+ const DWORD timeout = deadline.isForever()
+ ? INFINITE
+ : DWORD(std::min(deadline.remainingTime(), qint64(INFINITE - 1)));
+
+ switch (WaitForSingleObjectEx(wce->event, timeout, FALSE)) {
+ case WAIT_OBJECT_0:
+ return true;
+ case WAIT_TIMEOUT:
+ if (deadline.hasExpired())
+ return false;
+ break;
+ default:
+ return false;
+ }
}
- return ret;
}
void QWaitConditionPrivate::post(QWaitConditionEvent *wce, bool ret)
@@ -160,13 +130,20 @@ QWaitCondition::~QWaitCondition()
bool QWaitCondition::wait(QMutex *mutex, unsigned long time)
{
+ if (time == std::numeric_limits<unsigned long>::max())
+ return wait(mutex, QDeadlineTimer(QDeadlineTimer::Forever));
+ return wait(mutex, QDeadlineTimer(time));
+}
+
+bool QWaitCondition::wait(QMutex *mutex, QDeadlineTimer deadline)
+{
if (!mutex)
return false;
QWaitConditionEvent *wce = d->pre();
mutex->unlock();
- bool returnValue = d->wait(wce, time);
+ bool returnValue = d->wait(wce, deadline);
mutex->lock();
d->post(wce, returnValue);
@@ -174,19 +151,23 @@ bool QWaitCondition::wait(QMutex *mutex, unsigned long time)
return returnValue;
}
-bool QWaitCondition::wait(QMutex *mutex, QDeadlineTimer deadline)
+bool QWaitCondition::wait(QReadWriteLock *readWriteLock, unsigned long time)
{
- return wait(mutex, deadline.remainingTime());
+ if (time == std::numeric_limits<unsigned long>::max())
+ return wait(readWriteLock, QDeadlineTimer(QDeadlineTimer::Forever));
+ return wait(readWriteLock, QDeadlineTimer(time));
}
-bool QWaitCondition::wait(QReadWriteLock *readWriteLock, unsigned long time)
+bool QWaitCondition::wait(QReadWriteLock *readWriteLock, QDeadlineTimer deadline)
{
+ using namespace QReadWriteLockStates;
+
if (!readWriteLock)
return false;
- auto previousState = readWriteLock->stateForWaitCondition();
- if (previousState == QReadWriteLock::Unlocked)
+ auto previousState = QReadWriteLockPrivate::stateForWaitCondition(readWriteLock);
+ if (previousState == Unlocked)
return false;
- if (previousState == QReadWriteLock::RecursivelyLocked) {
+ if (previousState == RecursivelyLocked) {
qWarning("QWaitCondition: cannot wait on QReadWriteLocks with recursive lockForWrite()");
return false;
}
@@ -194,9 +175,9 @@ bool QWaitCondition::wait(QReadWriteLock *readWriteLock, unsigned long time)
QWaitConditionEvent *wce = d->pre();
readWriteLock->unlock();
- bool returnValue = d->wait(wce, time);
+ bool returnValue = d->wait(wce, deadline);
- if (previousState == QReadWriteLock::LockedForWrite)
+ if (previousState == LockedForWrite)
readWriteLock->lockForWrite();
else
readWriteLock->lockForRead();
@@ -205,16 +186,11 @@ bool QWaitCondition::wait(QReadWriteLock *readWriteLock, unsigned long time)
return returnValue;
}
-bool QWaitCondition::wait(QReadWriteLock *readWriteLock, QDeadlineTimer deadline)
-{
- return wait(readWriteLock, deadline.remainingTime());
-}
-
void QWaitCondition::wakeOne()
{
// wake up the first waiting thread in the queue
QMutexLocker locker(&d->mtx);
- for (QWaitConditionEvent *current : qAsConst(d->queue)) {
+ for (QWaitConditionEvent *current : std::as_const(d->queue)) {
if (current->wokenUp)
continue;
SetEvent(current->event);
@@ -227,7 +203,7 @@ void QWaitCondition::wakeAll()
{
// wake up the all threads in the queue
QMutexLocker locker(&d->mtx);
- for (QWaitConditionEvent *current : qAsConst(d->queue)) {
+ for (QWaitConditionEvent *current : std::as_const(d->queue)) {
SetEvent(current->event);
current->wokenUp = true;
}
diff --git a/src/corelib/thread/qyieldcpu.h b/src/corelib/thread/qyieldcpu.h
new file mode 100644
index 0000000000..d5da58deeb
--- /dev/null
+++ b/src/corelib/thread/qyieldcpu.h
@@ -0,0 +1,64 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// Copyright (C) 2023 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QYIELDCPU_H
+#define QYIELDCPU_H
+
+#include <QtCore/qcompilerdetection.h>
+#include <QtCore/qprocessordetection.h>
+#include <QtCore/qtconfigmacros.h>
+
+#ifdef Q_CC_MSVC_ONLY
+// MSVC defines _YIELD_PROCESSOR() in <xatomic.h>, but as that is a private
+// header, we include the public ones
+# ifdef __cplusplus
+# include <atomic>
+extern "C"
+# endif
+void _mm_pause(void); // the compiler recognizes as intrinsic
+#endif
+
+QT_BEGIN_NAMESPACE
+
+#ifdef Q_CC_GNU
+__attribute__((artificial))
+#endif
+Q_ALWAYS_INLINE void qYieldCpu(void) Q_DECL_NOEXCEPT;
+
+void qYieldCpu(void)
+#ifdef __cplusplus
+ noexcept
+#endif
+{
+#if __has_builtin(__yield)
+ __yield(); // Generic
+#elif defined(_YIELD_PROCESSOR) && defined(Q_CC_MSVC)
+ _YIELD_PROCESSOR(); // Generic; MSVC's <atomic>
+
+#elif __has_builtin(__builtin_ia32_pause)
+ __builtin_ia32_pause();
+#elif defined(Q_PROCESSOR_X86) && defined(Q_CC_GNU)
+ // GCC < 10 didn't have __has_builtin()
+ __builtin_ia32_pause();
+#elif defined(Q_PROCESSOR_X86) && defined(Q_CC_MSVC)
+ _mm_pause();
+#elif defined(Q_PROCESSOR_X86)
+ asm("pause"); // hopefully asm() works in this compiler
+
+#elif __has_builtin(__builtin_arm_yield)
+ __builtin_arm_yield();
+#elif defined(Q_PROCESSOR_ARM) && Q_PROCESSOR_ARM >= 7 && defined(Q_CC_GNU)
+ asm("yield"); // this works everywhere
+
+#elif defined(Q_PROCESSOR_RISCV)
+ asm(".word 0x0100000f"); // a.k.a. "pause"
+
+#elif defined(_YIELD_PROCESSOR) && defined(Q_CC_GHS)
+ _YIELD_PROCESSOR; // Green Hills (INTEGRITY), but only on ARM
+#endif
+}
+
+QT_END_NAMESPACE
+
+#endif // QYIELDCPU_H
diff --git a/src/corelib/thread/qyieldcpu.qdoc b/src/corelib/thread/qyieldcpu.qdoc
new file mode 100644
index 0000000000..c55b2c8a73
--- /dev/null
+++ b/src/corelib/thread/qyieldcpu.qdoc
@@ -0,0 +1,59 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// Copyright (C) 2023 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
+
+/*!
+ \fn qYieldCpu()
+ \inmodule QtCore
+ \ingroup thread
+ \relates QAtomicInteger
+ //! \relatesalso QAtomicPointer
+ \since 6.7
+
+ Pauses the execution of the current thread for an unspecified time, using
+ hardware instructions, without de-scheduling this thread. This function is
+ meant to be used in high-throughput loops where the code expects another
+ thread to modify an atomic variable. This is completely different from
+ QThread::yieldCurrentThread(), which is an OS-level operation that may take
+ the whole thread off the CPU and allow other threads (possibly belonging to
+ other processes) to run.
+
+ So, instead of
+ \code
+ while (!condition)
+ ;
+ \endcode
+
+ one should write
+ \code
+ while (!condition)
+ qYieldCpu();
+ \endcode
+
+ This is useful both with and without hardware multithreading on the same
+ core. In the case of hardware threads, it serves to prevent further
+ speculative execution filling up the pipeline, which could starve the
+ sibling thread of resources. Across cores and higher levels of separation,
+ it allows the cache coherency protocol to allocate the cache line being
+ modified and inspected to the logical processor whose result this code is
+ expecting.
+
+ It is also recommended to loop around code that does not modify the global
+ variable, to avoid contention in exclusively obtaining the memory location.
+ Therefore, an atomic modification loop such as a spinlock acquisition
+ should be:
+
+ \code
+ while (true) {
+ while (!readOnlyCondition(atomic))
+ qYieldCpu();
+ if (modify(atomic))
+ break;
+ }
+ \endcode
+
+ On x86 processors and on RISC-V processors with the \c{Zihintpause}
+ extension, this will emit the \c PAUSE instruction, which is ignored on
+ processors that don't support it; on ARMv7 or later ARM processors, it will
+ emit the \c{YIELD} instruction.
+*/
diff --git a/src/corelib/time/qcalendar.cpp b/src/corelib/time/qcalendar.cpp
index 0cf350254e..c87d4b7cf3 100644
--- a/src/corelib/time/qcalendar.cpp
+++ b/src/corelib/time/qcalendar.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qcalendar.h"
#include "qcalendarbackend_p.h"
#include "qgregoriancalendar_p.h"
@@ -50,36 +14,26 @@
#include "qislamiccivilcalendar_p.h"
#endif
+#include <private/qflatmap_p.h>
#include "qatomic.h"
#include "qdatetime.h"
#include "qcalendarmath_p.h"
#include <qhash.h>
#include <qreadwritelock.h>
-#include <qdebug.h>
#include <vector>
QT_BEGIN_NAMESPACE
-namespace {
-
-struct CalendarName : public QString
+struct QCalendarRegistryCaseInsensitiveAnyStringViewLessThan
{
- CalendarName(const QString &name) : QString(name) {}
+ struct is_transparent {};
+ bool operator()(QAnyStringView lhs, QAnyStringView rhs) const
+ {
+ return QAnyStringView::compare(lhs, rhs, Qt::CaseInsensitive) < 0;
+ }
};
-inline bool operator==(const CalendarName &u, const CalendarName &v)
-{
- return u.compare(v, Qt::CaseInsensitive) == 0;
-}
-
-inline size_t qHash(const CalendarName &key, size_t seed = 0) noexcept
-{
- return qHash(key.toLower(), seed);
-}
-
-} // anonymous namespace
-
namespace QtPrivate {
/*
@@ -90,6 +44,8 @@ class QCalendarRegistry
{
Q_DISABLE_COPY_MOVE(QCalendarRegistry); // This is a singleton.
+ static constexpr qsizetype ExpectedNumberOfBackends = qsizetype(QCalendar::System::Last) + 1;
+
/*
Lock protecting the registry from concurrent modification.
*/
@@ -109,7 +65,12 @@ class QCalendarRegistry
Each backend may be registered with several names associated with it.
The names are case-insensitive.
*/
- QHash<CalendarName, QCalendarBackend *> byName;
+ QFlatMap<
+ QString, QCalendarBackend *,
+ QCalendarRegistryCaseInsensitiveAnyStringViewLessThan,
+ QStringList,
+ std::vector<QCalendarBackend *>
+ > byName;
/*
Pointer to the Gregorian backend for faster lockless access to it.
@@ -139,7 +100,11 @@ class QCalendarRegistry
QCalendar::System system);
public:
- QCalendarRegistry() { byId.resize(int(QCalendar::System::Last) + 1); }
+ QCalendarRegistry()
+ {
+ byId.resize(ExpectedNumberOfBackends);
+ byName.reserve(ExpectedNumberOfBackends * 2); // assume one alias on average
+ }
~QCalendarRegistry();
@@ -340,12 +305,11 @@ void QCalendarRegistry::registerBackendLockHeld(QCalendarBackend *backend, const
// Register any names.
for (const auto &name : names) {
- if (byName.contains(name)) {
+ auto [it, inserted] = byName.try_emplace(name, backend);
+ if (!inserted) {
Q_ASSERT(system == QCalendar::System::User);
- qWarning() << "Cannot register name" << name << "(already in use) for"
- << backend->name();
- } else {
- byName[name] = backend;
+ qWarning("Cannot register name %ls (already in use) for %ls",
+ qUtf16Printable(name), qUtf16Printable(backend->name()));
}
}
}
@@ -363,7 +327,7 @@ QStringList QCalendarRegistry::availableCalendars()
ensurePopulated();
QReadLocker locker(&lock);
- return QStringList(byName.keyBegin(), byName.keyEnd());
+ return byName.keys();
}
/*
@@ -380,7 +344,7 @@ const QCalendarBackend *QCalendarRegistry::fromName(QAnyStringView name)
ensurePopulated();
QReadLocker locker(&lock);
- return byName.value(name.toString(), nullptr);
+ return byName.value(name, nullptr);
}
/*
@@ -448,10 +412,18 @@ const QCalendarBackend *QCalendarRegistry::fromEnum(QCalendar::System system)
QStringList QCalendarRegistry::backendNames(const QCalendarBackend *backend)
{
QStringList l;
-
- QHashIterator<CalendarName, QCalendarBackend *> i(byName);
- while (i.findNext(const_cast<QCalendarBackend *>(backend)))
- l.push_back(i.key());
+ l.reserve(byName.size()); // too large, but never really large, so ok
+
+ QT_WARNING_PUSH
+ // Clang complains about the reference still causing a copy. The reference is idiomatic, but
+ // runs afoul of QFlatMap's iterators which return a pair of references instead of a reference
+ // to pair. Suppress the warning, because `const auto [key, value]` would look wrong.
+ QT_WARNING_DISABLE_CLANG("-Wrange-loop-analysis")
+ for (const auto &[key, value] : byName) {
+ if (value == backend)
+ l.push_back(key);
+ }
+ QT_WARNING_POP
return l;
}
@@ -526,8 +498,8 @@ Q_GLOBAL_STATIC(QtPrivate::QCalendarRegistry, calendarRegistry);
base-classes for custom calendar backends, but cannot be instantiated
themselves.
- \sa calendarId(), QDate, QDateTime, QDateEdit,
- QDateTimeEdit, QCalendarWidget
+ \sa calendarId(), QDate, QDateTime, QDateEdit, QDateTimeEdit,
+ QCalendarWidget, {The Low-Level API: Extending Qt Applications}
*/
/*!
@@ -881,18 +853,73 @@ int QCalendarBackend::maximumMonthsInYear() const
already used in QDate::dayOfWeek() to mean an invalid date). The calendar
should treat the numbers used as an \c enum, whose values need not be
contiguous, nor need they follow closely from the 1 through 7 of the usual
- returns. It suffices that weekDayName() can recognize each such number as
- identifying a distinct name, that it returns to identify the particular
- intercallary day.
+ returns. It suffices that;
+ \list
+ \li weekDayName() can recognize each such number as identifying a distinct
+ name, that it returns to identify the particular intercallary day; and
+ \li matchCenturyToWeekday() can determine what century adjustment aligns a
+ given date within a century to a given day of the week, where this is
+ relevant and possible.
+ \endlist
This base implementation uses the day-numbering that various calendars have
borrowed off the Hebrew calendar.
- \sa weekDayName(), standaloneWeekDayName(), QDate::dayOfWeek()
- */
+ \sa weekDayName(), standaloneWeekDayName(), QDate::dayOfWeek(), Qt::DayOfWeek
+*/
int QCalendarBackend::dayOfWeek(qint64 jd) const
{
- return QRoundingDown::qMod(jd, 7) + 1;
+ return QRoundingDown::qMod<7>(jd) + 1;
+}
+
+/*!
+ \since 6.7
+ Adjusts century of \a parts to match \a dow.
+
+ Preserves parts.month and parts.day while adjusting parts.year by a multiple
+ of 100 (taking the absence of year zero into account, when relevant) to
+ obtain a date for which dayOfWeek() is \a dow. Prefers smaller changes over
+ larger and increases to the century over decreases of the same
+ magnitude. Returns the Julian Day number for the selected date or
+ std::numeric_limits<qint64>::min(), a.k.a. QDate::nullJd(), if there is no
+ date matching these requirements.
+
+ The base-class provides a brute-force implementation that steps outwards
+ from the given date by centures, above and below by up to 14 centuries, in
+ search of a matching date. This is neither computationally efficient nor
+ elegant but should work as advertised for calendars in which every month-day
+ combination does appear on all days of the week, across sufficiently many
+ centuries.
+*/
+qint64 QCalendarBackend::matchCenturyToWeekday(const QCalendar::YearMonthDay &parts, int dow) const
+{
+ Q_ASSERT(parts.isValid());
+ // Brute-force solution as fall-back.
+ const auto checkOffset = [parts, dow, this](int centuries) -> std::optional<qint64> {
+ // Offset parts.year by the given number of centuries:
+ int year = parts.year + centuries * 100;
+ // but take into account the effect of crossing zero, if we did:
+ if (!hasYearZero() && (parts.year > 0) != (year > 0))
+ year += parts.year > 0 ? -1 : +1;
+ qint64 jd;
+ if (isDateValid(year, parts.month, parts.day)
+ && dateToJulianDay(year, parts.month, parts.day, &jd)
+ && dayOfWeek(jd) == dow) {
+ return jd;
+ }
+ return std::nullopt;
+ };
+ // Empirically, aside from Gregorian, each calendar finds every dow within
+ // any 29-century run, so 14 centuries is the biggest offset we ever need.
+ for (int offset = 0; offset < 15; ++offset) {
+ if (auto jd = checkOffset(offset))
+ return *jd;
+ if (offset) {
+ if (auto jd = checkOffset(-offset))
+ return *jd;
+ }
+ }
+ return (std::numeric_limits<qint64>::min)();
}
// Month and week-day name look-ups (implemented in qlocale.cpp):
@@ -1125,6 +1152,7 @@ const QCalendarBackend *QCalendarBackend::gregorian()
/*!
\class QCalendar::SystemId
+ \inmodule QtCore
\since 6.2
This is an opaque type used to identify custom calendar implementations. The
@@ -1163,8 +1191,7 @@ const QCalendarBackend *QCalendarBackend::gregorian()
/*!
\fn QCalendar::QCalendar()
\fn QCalendar::QCalendar(QCalendar::System system)
- \fn QCalendar::QCalendar(QLatin1String name)
- \fn QCalendar::QCalendar(QStringView name)
+ \fn QCalendar::QCalendar(QAnyStringView name)
Constructs a calendar object.
@@ -1174,6 +1201,9 @@ const QCalendarBackend *QCalendarBackend::gregorian()
calendar being constructed by other means first. With no argument, the
default constructor returns the Gregorian calendar.
+ \note In Qt versions before 6.4, the constructor by \a name accepted only
+ QStringView and QLatin1String, not QAnyStringView.
+
\sa QCalendar, System, isValid()
*/
@@ -1207,13 +1237,7 @@ QCalendar::QCalendar(QCalendar::SystemId id)
Q_ASSERT(!d_ptr || d_ptr->calendarId().index() == id.index());
}
-QCalendar::QCalendar(QLatin1String name)
- : d_ptr(QCalendarBackend::fromName(name))
-{
- Q_ASSERT(!d_ptr || d_ptr->calendarId().isValid());
-}
-
-QCalendar::QCalendar(QStringView name)
+QCalendar::QCalendar(QAnyStringView name)
: d_ptr(QCalendarBackend::fromName(name))
{
Q_ASSERT(!d_ptr || d_ptr->calendarId().isValid());
@@ -1456,6 +1480,32 @@ QDate QCalendar::dateFromParts(const QCalendar::YearMonthDay &parts) const
}
/*!
+ \since 6.7
+ Adjusts the century of a date to match a given day of the week.
+
+ For use when given a date's day of week, day of month, month and last two
+ digits of the year. Returns a QDate instance with the given \a dow as its \l
+ {QDate::}{dayOfWeek()}, matching the given \a parts in month and day of the
+ month. The returned QDate's \l {QDate::}{year()} shall differ from
+ \c{parts.year} by a multiple of 100, preferring small multiples over larger
+ and positive multiples over their negations.
+
+ If no date matches these conditions, an invalid QDate is returned: the day
+ of week is incompatible with the other data given. This arises, for example,
+ with the Gregorian calendar, whose 400-year cycle is a whole number of weeks
+ long, so any given month and day of that month only ever falls, in years
+ with a given last two digits, on four days of the week. (In the special case
+ of February 29th at the turn of a century, when that is a leap year, only
+ one day of the week is possible: Tuesday.)
+*/
+QDate QCalendar::matchCenturyToWeekday(const QCalendar::YearMonthDay &parts, int dow) const
+{
+ SAFE_D();
+ return d && parts.isValid()
+ ? QDate::fromJulianDay(d->matchCenturyToWeekday(parts, dow)) : QDate();
+}
+
+/*!
Converts a QDate to a year, month, and day of the month.
The returned structure's isValid() shall be false if the calendar is unable
@@ -1631,3 +1681,7 @@ QStringList QCalendar::availableCalendars()
}
QT_END_NAMESPACE
+
+#ifndef QT_BOOTSTRAPPED
+#include "moc_qcalendar.cpp"
+#endif
diff --git a/src/corelib/time/qcalendar.h b/src/corelib/time/qcalendar.h
index 3238fff7d8..434f06d67f 100644
--- a/src/corelib/time/qcalendar.h
+++ b/src/corelib/time/qcalendar.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QCALENDAR_H
#define QCALENDAR_H
@@ -146,10 +110,11 @@ public:
explicit QCalendar(); // Gregorian, optimised
explicit QCalendar(System system);
- // ### Qt 7: remove
- explicit QCalendar(QLatin1String name);
- // ### Qt 7: use QAnyStringView
+#if QT_CORE_REMOVED_SINCE(6, 4)
+ explicit QCalendar(QLatin1StringView name);
explicit QCalendar(QStringView name);
+#endif
+ explicit QCalendar(QAnyStringView name);
explicit QCalendar(SystemId id);
// QCalendar is a trivially copyable value type.
@@ -179,6 +144,7 @@ public:
// QDate conversions:
QDate dateFromParts(int year, int month, int day) const;
QDate dateFromParts(const YearMonthDay &parts) const;
+ QDate matchCenturyToWeekday(const YearMonthDay &parts, int dow) const;
YearMonthDay partsFromDate(QDate date) const;
int dayOfWeek(QDate date) const;
diff --git a/src/corelib/time/qcalendarbackend_p.h b/src/corelib/time/qcalendarbackend_p.h
index 130a67e340..15e0795755 100644
--- a/src/corelib/time/qcalendarbackend_p.h
+++ b/src/corelib/time/qcalendarbackend_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QCALENDAR_BACKEND_P_H
#define QCALENDAR_BACKEND_P_H
@@ -95,8 +59,10 @@ class Q_CORE_EXPORT QCalendarBackend
{
friend class QCalendar;
friend class QtPrivate::QCalendarRegistry;
+ Q_DISABLE_COPY_MOVE(QCalendarBackend)
public:
+ QCalendarBackend() = default;
virtual ~QCalendarBackend();
virtual QString name() const = 0;
@@ -122,8 +88,9 @@ public:
// Julian Day conversions:
virtual bool dateToJulianDay(int year, int month, int day, qint64 *jd) const = 0;
virtual QCalendar::YearMonthDay julianDayToDate(qint64 jd) const = 0;
- // Day of week and week numbering:
+ // Day of week:
virtual int dayOfWeek(qint64 jd) const;
+ virtual qint64 matchCenturyToWeekday(const QCalendar::YearMonthDay &parts, int dow) const;
// Names of months and week-days (implemented in qlocale.cpp):
virtual QString monthName(const QLocale &locale, int month, int year,
diff --git a/src/corelib/time/qcalendarmath_p.h b/src/corelib/time/qcalendarmath_p.h
index 61c2c5d2b5..c785803ce3 100644
--- a/src/corelib/time/qcalendarmath_p.h
+++ b/src/corelib/time/qcalendarmath_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2019 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QCALENDARMATH_P_H
#define QCALENDARMATH_P_H
@@ -52,26 +16,130 @@
//
#include <QtCore/private/qglobal_p.h>
+#include <QtCore/QtAlgorithms>
QT_BEGIN_NAMESPACE
namespace QRoundingDown {
+// Note: qgregoriancalendar.cpp contains some static asserts to verify this all works.
+namespace QRoundingDownPrivate {
+#ifdef Q_CC_MSVC
+// MSVC 2019 doesn't believe in the constexpr-ness of the #else clause's version :-(
+#define QCALMATH_ISPOW2(b) ((b > 0) && !(b & (b - 1))) // See #else's comment.
+#else
+// Subtracting one toggles the least significant set bit and any unset bits less
+// significant than it, leaving other bits unchanged. Thus the & of this with
+// the original number preserves all more significant bits, clearing the least
+// significant. If there are no such bits, either our number was 0 or it only
+// had one bit set, hence is a power of two.
+template <typename Int>
+inline constexpr bool isPowerOfTwo(Int b) { return b > 0 && (b & (b - 1)) == 0; }
+#define QCALMATH_ISPOW2(b) QRoundingDownPrivate::isPowerOfTwo(b)
+#endif
+}
/*
Division, rounding down (rather than towards zero).
From C++11 onwards, integer division is defined to round towards zero, so we
can rely on that when implementing this. This is only used with denominator b
> 0, so we only have to treat negative numerator, a, specially.
+
+ If a is a multiple of b, adding 1 before and subtracting it after dividing by
+ b gets us to where we should be (albeit by an eccentric path), since the
+ adding caused rounding up, undone by the subtracting. Otherwise, adding 1
+ doesn't change the result of dividing by b; and we want one less than that
+ result. This is equivalent to subtracting b - 1 and simply dividing, except
+ when that subtraction would underflow.
+
+ For the remainder, with negative a, aside from having to add one and subtract
+ it later to deal with the exact multiples, we can simply use the truncating
+ remainder and then add b. When b is a power of two we can, of course, get the
+ remainder correctly by the same masking that works for positive a.
*/
-template<typename Int> constexpr Int qDiv(Int a, unsigned b)
-{ return (a - (a < 0 ? int(b - 1) : 0)) / int(b); }
+// Fall-back, to ensure intelligible error messages on mis-use:
+template <unsigned b, typename Int, std::enable_if_t<(int(b) < 2), bool> = true>
+constexpr auto qDivMod(Int)
+{
+ static_assert(b, "Division by 0 is undefined");
+ // Use complement of earlier cases || new check, to ensure only one error:
+ static_assert(!b || int(b) > 0, "Denominator is too big");
+ static_assert(int(b) < 1 || b > 1, "Division by 1 is fautous");
+ struct R { Int quotient; Int remainder; };
+ return R { 0, 0 };
+}
+
+template <unsigned b, typename Int,
+ std::enable_if_t<(b > 1) && !QCALMATH_ISPOW2(b) && (int(b) > 0),
+ bool> = true>
+constexpr auto qDivMod(Int a)
+{
+ struct R { Int quotient; Int remainder; };
+ if constexpr (std::is_signed_v<Int>) {
+ if (a < 0) {
+ ++a; // can't overflow, it's negative
+ return R { Int(a / int(b) - 1), Int(a % int(b) - 1 + int(b)) };
+ }
+ }
+ return R { Int(a / int(b)), Int(a % int(b)) };
+}
+
+template <unsigned b, typename Int,
+ std::enable_if_t<(b > 1) && QCALMATH_ISPOW2(b) && (int(b) > 0),
+ bool> = true>
+constexpr auto qDivMod(Int a)
+{
+ constexpr unsigned w = QtPrivate::qConstexprCountTrailingZeroBits(b);
+ struct R { Int quotient; Int remainder; };
+ if constexpr (std::is_signed_v<Int>) {
+ if (a < 0)
+ return R { Int((a + 1) / int(b) - 1), Int(a & int(b - 1)) };
+ }
+ return R { Int(a >> w), Int(a & int(b - 1)) };
+}
-template<typename Int> constexpr Int qMod(Int a, unsigned b)
-{ return a - qDiv(a, b) * b; }
+#undef QCALMATH_ISPOW2
+// </kludge>
+
+template <unsigned b, typename Int> constexpr Int qDiv(Int a) { return qDivMod<b>(a).quotient; }
+template <unsigned b, typename Int> constexpr Int qMod(Int a) { return qDivMod<b>(a).remainder; }
} // QRoundingDown
+namespace QRomanCalendrical {
+// Julian Day number of Gregorian 1 BCE, February 29th:
+constexpr qint64 LeapDayGregorian1Bce = 1721119;
+// Aside from (maybe) some turns of centuries, one year in four is leap:
+constexpr unsigned FourYears = 4 * 365 + 1;
+constexpr unsigned FiveMonths = 31 + 30 + 31 + 30 + 31; // Mar-Jul or Aug-Dec.
+
+constexpr auto yearMonthToYearDays(int year, int month)
+{
+ // Pre-digests year and month to (possibly denormal) year count and day-within-year.
+ struct R { qint64 year; qint64 days; };
+ if (year < 0) // Represent -N BCE as 1-N so year numbering is contiguous.
+ ++year;
+ month -= 3; // Adjust month numbering so March = 0, ...
+ if (month < 0) { // and Jan = 10, Feb = 11, in the previous year.
+ --year;
+ month += 12;
+ }
+ return R { year, QRoundingDown::qDiv<5>(FiveMonths * month + 2) };
+}
+
+constexpr auto dayInYearToYmd(int dayInYear)
+{
+ // The year is an adjustment to the year for which dayInYear may be denormal.
+ struct R { int year; int month; int day; };
+ // Shared code for Julian and Milankovic (at least).
+ using namespace QRoundingDown;
+ const auto month5Day = qDivMod<FiveMonths>(5 * dayInYear + 2);
+ // Its remainder changes by 5 per day, except at roughly monthly quotient steps.
+ const auto yearMonth = qDivMod<12>(month5Day.quotient + 2);
+ return R { yearMonth.quotient, yearMonth.remainder + 1, qDiv<5>(month5Day.remainder) + 1 };
+}
+}
+
QT_END_NAMESPACE
#endif // QCALENDARMATH_P_H
diff --git a/src/corelib/time/qdatetime.cpp b/src/corelib/time/qdatetime.cpp
index 9638c5b5e8..687f174c07 100644
--- a/src/corelib/time/qdatetime.cpp
+++ b/src/corelib/time/qdatetime.cpp
@@ -1,52 +1,16 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Copyright (C) 2021 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qplatformdefs.h"
+// Copyright (C) 2022 The Qt Company Ltd.
+// Copyright (C) 2021 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
#include "qdatetime.h"
#include "qcalendar.h"
#include "qdatastream.h"
#include "qdebug.h"
-#include "qset.h"
#include "qlocale.h"
+#include "qset.h"
+#include "private/qcalendarmath_p.h"
#include "private/qdatetime_p.h"
#if QT_CONFIG(datetimeparser)
#include "private/qdatetimeparser_p.h"
@@ -55,7 +19,10 @@
#include "private/qcore_mac_p.h"
#endif
#include "private/qgregoriancalendar_p.h"
+#include "private/qlocale_tools_p.h"
+#include "private/qlocaltime_p.h"
#include "private/qnumeric_p.h"
+#include "private/qstringconverter_p.h"
#include "private/qstringiterator_p.h"
#if QT_CONFIG(timezone)
#include "private/qtimezoneprivate_p.h"
@@ -65,29 +32,25 @@
#ifdef Q_OS_WIN
# include <qt_windows.h>
#endif
-#include <time.h>
+
+#include <private/qtools_p.h>
QT_BEGIN_NAMESPACE
+using namespace Qt::StringLiterals;
+using namespace QtPrivate::DateTimeConstants;
+using namespace QtMiscUtils;
+
/*****************************************************************************
Date/Time Constants
*****************************************************************************/
-constexpr qint64 SECS_PER_DAY = 86400;
-constexpr qint64 MSECS_PER_DAY = 86400000;
-constexpr qint64 SECS_PER_HOUR = 3600;
-constexpr qint64 MSECS_PER_HOUR = 3600000;
-constexpr qint64 SECS_PER_MIN = 60;
-constexpr qint64 MSECS_PER_MIN = 60000;
-constexpr qint64 MSECS_PER_SEC = 1000;
-constexpr qint64 TIME_T_MAX = std::numeric_limits<time_t>::max();
-constexpr qint64 JULIAN_DAY_FOR_EPOCH = 2440588; // result of julianDayFromDate(1970, 1, 1)
-
/*****************************************************************************
QDate static helper functions
*****************************************************************************/
+static_assert(std::is_trivially_copyable_v<QCalendar::YearMonthDay>);
-static inline QDate fixedDate(QCalendar::YearMonthDay &&parts, QCalendar cal)
+static inline QDate fixedDate(QCalendar::YearMonthDay parts, QCalendar cal)
{
if ((parts.year < 0 && !cal.isProleptic()) || (parts.year == 0 && !cal.hasYearZero()))
return QDate();
@@ -96,13 +59,13 @@ static inline QDate fixedDate(QCalendar::YearMonthDay &&parts, QCalendar cal)
return cal.dateFromParts(parts);
}
-static inline QDate fixedDate(QCalendar::YearMonthDay &&parts)
+static inline QDate fixedDate(QCalendar::YearMonthDay parts)
{
if (parts.year) {
parts.day = qMin(parts.day, QGregorianCalendar::monthLength(parts.month, parts.year));
- qint64 jd;
- if (QGregorianCalendar::julianFromParts(parts.year, parts.month, parts.day, &jd))
- return QDate::fromJulianDay(jd);
+ const auto jd = QGregorianCalendar::julianFromParts(parts.year, parts.month, parts.day);
+ if (jd)
+ return QDate::fromJulianDay(*jd);
}
return QDate();
}
@@ -120,7 +83,7 @@ static const char qt_shortMonthNames[][4] = {
static int fromShortMonthName(QStringView monthName)
{
for (unsigned int i = 0; i < sizeof(qt_shortMonthNames) / sizeof(qt_shortMonthNames[0]); ++i) {
- if (monthName == QLatin1String(qt_shortMonthNames[i], 3))
+ if (monthName == QLatin1StringView(qt_shortMonthNames[i], 3))
return i + 1;
}
return -1;
@@ -128,10 +91,46 @@ static int fromShortMonthName(QStringView monthName)
#endif // textdate
#if QT_CONFIG(datestring) // depends on, so implies, textdate
+namespace {
+using ParsedInt = QSimpleParsedNumber<qulonglong>;
+
+/*
+ Reads a whole number that must be the whole text.
+*/
+ParsedInt readInt(QLatin1StringView text)
+{
+ // Various date formats' fields (e.g. all in ISO) should not accept spaces
+ // or signs, so check that the string starts with a digit and that qstrntoull()
+ // converted the whole string.
+
+ if (text.isEmpty() || !isAsciiDigit(text.front().toLatin1()))
+ return {};
+
+ QSimpleParsedNumber res = qstrntoull(text.data(), text.size(), 10);
+ return res.used == text.size() ? res : ParsedInt{};
+}
+
+ParsedInt readInt(QStringView text)
+{
+ if (text.isEmpty())
+ return {};
+
+ // Converting to Latin-1 because QStringView::toULongLong() works with
+ // US-ASCII only by design anyway.
+ // Also QStringView::toULongLong() can't be used here as it will happily ignore
+ // spaces and accept signs; but various date formats' fields (e.g. all in ISO)
+ // should not.
+ QVarLengthArray<char> latin1(text.size());
+ QLatin1::convertFromUnicode(latin1.data(), text);
+ return readInt(QLatin1StringView{latin1.data(), latin1.size()});
+}
+
+} // namespace
+
struct ParsedRfcDateTime {
QDate date;
QTime time;
- int utcOffset;
+ int utcOffset = 0;
};
static int shortDayFromName(QStringView name)
@@ -164,7 +163,7 @@ static ParsedRfcDateTime rfcDateImpl(QStringView s)
QDate date;
const auto isShortName = [](QStringView name) {
- return (name.length() == 3 && name[0].isUpper()
+ return (name.size() == 3 && name[0].isUpper()
&& name[1].isLower() && name[2].isLower());
};
@@ -281,7 +280,7 @@ static ParsedRfcDateTime rfcDateImpl(QStringView s)
}
#endif // datestring
-// Return offset in [+-]HH:mm format
+// Return offset in ±HH:mm format
static QString toOffsetString(Qt::DateFormat format, int offset)
{
return QString::asprintf("%c%02d%s%02d",
@@ -293,12 +292,12 @@ static QString toOffsetString(Qt::DateFormat format, int offset)
}
#if QT_CONFIG(datestring)
-// Parse offset in [+-]HH[[:]mm] format
+// Parse offset in ±HH[[:]mm] format
static int fromOffsetString(QStringView offsetString, bool *valid) noexcept
{
*valid = false;
- const int size = offsetString.size();
+ const qsizetype size = offsetString.size();
if (size < 2 || size > 6)
return 0;
@@ -319,7 +318,7 @@ static int fromOffsetString(QStringView offsetString, bool *valid) noexcept
qsizetype hhLen = time.indexOf(u':');
qsizetype mmIndex;
if (hhLen == -1)
- mmIndex = hhLen = 2; // [+-]HHmm or [+-]HH format
+ mmIndex = hhLen = 2; // ±HHmm or ±HH format
else
mmIndex = hhLen + 1;
@@ -349,6 +348,12 @@ static int fromOffsetString(QStringView offsetString, bool *valid) noexcept
\reentrant
\brief The QDate class provides date functions.
+ \compares strong
+ \compareswith strong std::chrono::year_month_day std::chrono::year_month_day_last \
+ std::chrono::year_month_weekday std::chrono::year_month_weekday_last
+ These comparison operators are only available when using C++20.
+ \endcompareswith
+
A QDate object represents a particular day, regardless of calendar, locale
or other settings used when creating it or supplied by the system. It can
report the year, month and day of the month that represent the day with
@@ -436,8 +441,9 @@ static int fromOffsetString(QStringView offsetString, bool *valid) noexcept
QDate::QDate(int y, int m, int d)
{
- if (!QGregorianCalendar::julianFromParts(y, m, d, &jd))
- jd = nullJd();
+ static_assert(maxJd() == JulianDayMax);
+ static_assert(minJd() == JulianDayMin);
+ jd = QGregorianCalendar::julianFromParts(y, m, d).value_or(nullJd());
}
QDate::QDate(int y, int m, int d, QCalendar cal)
@@ -446,6 +452,54 @@ QDate::QDate(int y, int m, int d, QCalendar cal)
}
/*!
+ \fn QDate::QDate(std::chrono::year_month_day date)
+ \fn QDate::QDate(std::chrono::year_month_day_last date)
+ \fn QDate::QDate(std::chrono::year_month_weekday date)
+ \fn QDate::QDate(std::chrono::year_month_weekday_last date)
+
+ \since 6.4
+
+ Constructs a QDate representing the same date as \a date. This allows for
+ easy interoperability between the Standard Library calendaring classes and
+ Qt datetime classes.
+
+ For example:
+
+ \snippet code/src_corelib_time_qdatetime.cpp 22
+
+ \note Unlike QDate, std::chrono::year and the related classes feature the
+ year zero. This means that if \a date is in the year zero or before, the
+ resulting QDate object will have an year one less than the one specified by
+ \a date.
+
+ \note This function requires C++20.
+*/
+
+/*!
+ \fn QDate QDate::fromStdSysDays(const std::chrono::sys_days &days)
+ \since 6.4
+
+ Returns a QDate \a days days after January 1st, 1970 (the UNIX epoch). If
+ \a days is negative, the returned date will be before the epoch.
+
+ \note This function requires C++20.
+
+ \sa toStdSysDays()
+*/
+
+/*!
+ \fn std::chrono::sys_days QDate::toStdSysDays() const
+
+ Returns the number of days between January 1st, 1970 (the UNIX epoch) and
+ this date, represented as a \c{std::chrono::sys_days} object. If this date
+ is before the epoch, the number of days will be negative.
+
+ \note This function requires C++20.
+
+ \sa fromStdSysDays(), daysTo()
+*/
+
+/*!
\fn bool QDate::isNull() const
Returns \c true if the date is null; otherwise returns \c false. A null
@@ -648,9 +702,8 @@ int QDate::dayOfYear(QCalendar cal) const
int QDate::dayOfYear() const
{
if (isValid()) {
- qint64 first;
- if (QGregorianCalendar::julianFromParts(year(), 1, 1, &first))
- return jd - first + 1;
+ if (const auto first = QGregorianCalendar::julianFromParts(year(), 1, 1))
+ return jd - *first + 1;
}
return 0;
}
@@ -749,7 +802,41 @@ int QDate::weekNumber(int *yearNumber) const
return (thursday.dayOfYear() + 6) / 7;
}
-static bool inDateTimeRange(qint64 jd, bool start)
+#if QT_DEPRECATED_SINCE(6, 9)
+// Only called by deprecated methods (so bootstrap builds warn unused without this #if).
+static QTimeZone asTimeZone(Qt::TimeSpec spec, int offset, const char *warner)
+{
+ if (warner) {
+ switch (spec) {
+ case Qt::TimeZone:
+ qWarning("%s: Pass a QTimeZone instead of Qt::TimeZone.", warner);
+ break;
+ case Qt::LocalTime:
+ if (offset) {
+ qWarning("%s: Ignoring offset (%d seconds) passed with Qt::LocalTime",
+ warner, offset);
+ }
+ break;
+ case Qt::UTC:
+ if (offset) {
+ qWarning("%s: Ignoring offset (%d seconds) passed with Qt::UTC",
+ warner, offset);
+ offset = 0;
+ }
+ break;
+ case Qt::OffsetFromUTC:
+ break;
+ }
+ }
+ return QTimeZone::isUtcOrFixedOffset(spec)
+ ? QTimeZone::fromSecondsAheadOfUtc(offset)
+ : QTimeZone(QTimeZone::LocalTime);
+}
+#endif // Helper for 6.9 deprecation
+
+enum class DaySide { Start, End };
+
+static bool inDateTimeRange(qint64 jd, DaySide side)
{
using Bounds = std::numeric_limits<qint64>;
if (jd < Bounds::min() + JULIAN_DAY_FOR_EPOCH)
@@ -757,30 +844,24 @@ static bool inDateTimeRange(qint64 jd, bool start)
jd -= JULIAN_DAY_FOR_EPOCH;
const qint64 maxDay = Bounds::max() / MSECS_PER_DAY;
const qint64 minDay = Bounds::min() / MSECS_PER_DAY - 1;
- // (Divisions rounded towards zero, as MSECS_PER_DAY has factors other than two.)
+ // (Divisions rounded towards zero, as MSECS_PER_DAY is even - so doesn't
+ // divide max() - and has factors other than two, so doesn't divide min().)
// Range includes start of last day and end of first:
- if (start)
+ switch (side) {
+ case DaySide::Start:
return jd > minDay && jd <= maxDay;
- return jd >= minDay && jd < maxDay;
+ case DaySide::End:
+ return jd >= minDay && jd < maxDay;
+ }
+ Q_UNREACHABLE_RETURN(false);
}
-static QDateTime toEarliest(QDate day, const QDateTime &form)
+static QDateTime toEarliest(QDate day, const QTimeZone &zone)
{
- const Qt::TimeSpec spec = form.timeSpec();
- const int offset = (spec == Qt::OffsetFromUTC) ? form.offsetFromUtc() : 0;
-#if QT_CONFIG(timezone)
- QTimeZone zone;
- if (spec == Qt::TimeZone)
- zone = form.timeZone();
-#endif
- auto moment = [=](QTime time) {
- switch (spec) {
- case Qt::OffsetFromUTC: return QDateTime(day, time, spec, offset);
-#if QT_CONFIG(timezone)
- case Qt::TimeZone: return QDateTime(day, time, zone);
-#endif
- default: return QDateTime(day, time, spec);
- }
+ Q_ASSERT(!zone.isUtcOrFixedOffset());
+ // And the day starts in a gap. First find a moment not in that gap.
+ const auto moment = [=](QTime time) {
+ return QDateTime(day, time, zone, QDateTime::TransitionResolution::Reject);
};
// Longest routine time-zone transition is 2 hours:
QDateTime when = moment(QTime(2, 0));
@@ -798,8 +879,9 @@ static QDateTime toEarliest(QDate day, const QDateTime &form)
int low = 0;
// Binary chop to the right minute
while (high > low + 1) {
- int mid = (high + low) / 2;
- QDateTime probe = moment(QTime(mid / 60, mid % 60));
+ const int mid = (high + low) / 2;
+ const QDateTime probe = QDateTime(day, QTime(mid / 60, mid % 60), zone,
+ QDateTime::TransitionResolution::PreferBefore);
if (probe.isValid() && probe.date() == day) {
high = mid;
when = probe;
@@ -807,107 +889,134 @@ static QDateTime toEarliest(QDate day, const QDateTime &form)
low = mid;
}
}
- return when;
+ // Transitions out of local solar mean time, and the few international
+ // date-line crossings before that (Alaska, Philippines), may have happened
+ // between minute boundaries. Don't try to fix milliseconds.
+ if (QDateTime p = moment(when.time().addSecs(-1)); Q_UNLIKELY(p.isValid() && p.date() == day)) {
+ high *= 60;
+ low *= 60;
+ while (high > low + 1) {
+ const int mid = (high + low) / 2;
+ const int min = mid / 60;
+ const QDateTime probe = moment(QTime(min / 60, min % 60, mid % 60));
+ if (probe.isValid() && probe.date() == day) {
+ high = mid;
+ when = probe;
+ } else {
+ low = mid;
+ }
+ }
+ }
+ return when.isValid() ? when : QDateTime();
}
/*!
\since 5.14
- \fn QDateTime QDate::startOfDay(Qt::TimeSpec spec, int offsetSeconds) const
- \fn QDateTime QDate::startOfDay(const QTimeZone &zone) const
- Returns the start-moment of the day. Usually, this shall be midnight at the
- start of the day: however, if a time-zone transition causes the given date
- to skip over that midnight (e.g. a DST spring-forward skipping from the end
- of the previous day to 01:00 of the new day), the actual earliest time in
- the day is returned. This can only arise when the start-moment is specified
- in terms of a time-zone (by passing its QTimeZone as \a zone) or in terms of
- local time (by passing Qt::LocalTime as \a spec; this is its default).
+ Returns the start-moment of the day.
- The \a offsetSeconds is ignored unless \a spec is Qt::OffsetFromUTC, when it
- gives the implied zone's offset from UTC. As UTC and such zones have no
- transitions, the start of the day is QTime(0, 0) in these cases.
+ When a day starts depends on a how time is described: each day starts and
+ ends earlier for those in time-zones further west and later for those in
+ time-zones further east. The time representation to use can be specified by
+ an optional time \a zone. The default time representation is the system's
+ local time.
+
+ Usually, the start of the day is midnight, 00:00: however, if a time-zone
+ transition causes the given date to skip over that midnight (e.g. a DST
+ spring-forward skipping over the first hour of the day day), the actual
+ earliest time in the day is returned. This can only arise when the time
+ representation is a time-zone or local time.
+
+ When \a zone has a timeSpec() of is Qt::OffsetFromUTC or Qt::UTC, the time
+ representation has no transitions so the start of the day is QTime(0, 0).
In the rare case of a date that was entirely skipped (this happens when a
zone east of the international date-line switches to being west of it), the
- return shall be invalid. Passing Qt::TimeZone as \a spec (instead of
- passing a QTimeZone) or passing an invalid time-zone as \a zone will also
+ return shall be invalid. Passing an invalid time-zone as \a zone will also
produce an invalid result, as shall dates that start outside the range
representable by QDateTime.
\sa endOfDay()
*/
-QDateTime QDate::startOfDay(Qt::TimeSpec spec, int offsetSeconds) const
+QDateTime QDate::startOfDay(const QTimeZone &zone) const
{
- if (!inDateTimeRange(jd, true))
+ if (!inDateTimeRange(jd, DaySide::Start) || !zone.isValid())
return QDateTime();
- switch (spec) {
- case Qt::TimeZone: // should pass a QTimeZone instead of Qt::TimeZone
- qWarning() << "Called QDate::startOfDay(Qt::TimeZone) on" << *this;
- return QDateTime();
- case Qt::OffsetFromUTC:
- case Qt::UTC:
- return QDateTime(*this, QTime(0, 0), spec, offsetSeconds);
+ QDateTime when(*this, QTime(0, 0), zone,
+ QDateTime::TransitionResolution::RelativeToBefore);
+ if (Q_UNLIKELY(!when.isValid() || when.date() != *this)) {
+#if QT_CONFIG(timezone)
+ // The start of the day must have fallen in a spring-forward's gap; find the spring-forward:
+ if (zone.timeSpec() == Qt::TimeZone && zone.hasTransitions()) {
+ QTimeZone::OffsetData tran
+ // There's unlikely to be another transition before noon tomorrow.
+ // However, the whole of today may have been skipped !
+ = zone.previousTransition(QDateTime(addDays(1), QTime(12, 0), zone));
+ const QDateTime &at = tran.atUtc.toTimeZone(zone);
+ if (at.isValid() && at.date() == *this)
+ return at;
+ }
+#endif
- case Qt::LocalTime:
- if (offsetSeconds)
- qWarning("Ignoring offset (%d seconds) passed with Qt::LocalTime", offsetSeconds);
- break;
+ when = toEarliest(*this, zone);
}
- QDateTime when(*this, QTime(0, 0), spec);
- if (!when.isValid())
- when = toEarliest(*this, when);
- return when.isValid() ? when : QDateTime();
+ return when;
}
-#if QT_CONFIG(timezone)
/*!
- \overload
- \since 5.14
+ \overload
+ \since 6.5
*/
-QDateTime QDate::startOfDay(const QTimeZone &zone) const
+QDateTime QDate::startOfDay() const
{
- if (!inDateTimeRange(jd, true) || !zone.isValid())
- return QDateTime();
+ return startOfDay(QTimeZone::LocalTime);
+}
- QDateTime when(*this, QTime(0, 0), zone);
- if (when.isValid())
- return when;
-
- // The start of the day must have fallen in a spring-forward's gap; find the spring-forward:
- if (zone.hasTransitions()) {
- QTimeZone::OffsetData tran
- // There's unlikely to be another transition before noon tomorrow.
- // However, the whole of today may have been skipped !
- = zone.previousTransition(QDateTime(addDays(1), QTime(12, 0), zone));
- const QDateTime &at = tran.atUtc.toTimeZone(zone);
- if (at.isValid() && at.date() == *this)
- return at;
- }
+#if QT_DEPRECATED_SINCE(6, 9)
+/*!
+ \overload
+ \since 5.14
+ \deprecated [6.9] Use \c{startOfDay(const QTimeZone &)} instead.
- when = toEarliest(*this, when);
- return when.isValid() ? when : QDateTime();
+ Returns the start-moment of the day.
+
+ When a day starts depends on a how time is described: each day starts and
+ ends earlier for those with higher offsets from UTC and later for those with
+ lower offsets from UTC. The time representation to use can be specified
+ either by a \a spec and \a offsetSeconds (ignored unless \a spec is
+ Qt::OffsetSeconds) or by a time zone.
+
+ Usually, the start of the day is midnight, 00:00: however, if a local time
+ transition causes the given date to skip over that midnight (e.g. a DST
+ spring-forward skipping over the first hour of the day day), the actual
+ earliest time in the day is returned.
+
+ When \a spec is Qt::OffsetFromUTC, \a offsetSeconds gives an implied zone's
+ offset from UTC. As UTC and such zones have no transitions, the start of the
+ day is QTime(0, 0) in these cases.
+
+ In the rare case of a date that was entirely skipped (this happens when a
+ zone east of the international date-line switches to being west of it), the
+ return shall be invalid. Passing Qt::TimeZone as \a spec (instead of passing
+ a QTimeZone) will also produce an invalid result, as shall dates that start
+ outside the range representable by QDateTime.
+*/
+QDateTime QDate::startOfDay(Qt::TimeSpec spec, int offsetSeconds) const
+{
+ QTimeZone zone = asTimeZone(spec, offsetSeconds, "QDate::startOfDay");
+ // If spec was Qt::TimeZone, zone's is Qt::LocalTime.
+ return zone.timeSpec() == spec ? startOfDay(zone) : QDateTime();
}
-#endif // timezone
+#endif // 6.9 deprecation
-static QDateTime toLatest(QDate day, const QDateTime &form)
+static QDateTime toLatest(QDate day, const QTimeZone &zone)
{
- const Qt::TimeSpec spec = form.timeSpec();
- const int offset = (spec == Qt::OffsetFromUTC) ? form.offsetFromUtc() : 0;
-#if QT_CONFIG(timezone)
- QTimeZone zone;
- if (spec == Qt::TimeZone)
- zone = form.timeZone();
-#endif
- auto moment = [=](QTime time) {
- switch (spec) {
- case Qt::OffsetFromUTC: return QDateTime(day, time, spec, offset);
-#if QT_CONFIG(timezone)
- case Qt::TimeZone: return QDateTime(day, time, zone);
-#endif
- default: return QDateTime(day, time, spec);
- }
+ Q_ASSERT(!zone.isUtcOrFixedOffset());
+ // And the day ends in a gap. First find a moment not in that gap:
+ const auto moment = [=](QTime time) {
+ return QDateTime(day, time, zone, QDateTime::TransitionResolution::Reject);
};
// Longest routine time-zone transition is 2 hours:
QDateTime when = moment(QTime(21, 59, 59, 999));
@@ -925,8 +1034,9 @@ static QDateTime toLatest(QDate day, const QDateTime &form)
int low = when.time().msecsSinceStartOfDay() / 60000;
// Binary chop to the right minute
while (high > low + 1) {
- int mid = (high + low) / 2;
- QDateTime probe = moment(QTime(mid / 60, mid % 60, 59, 999));
+ const int mid = (high + low) / 2;
+ const QDateTime probe = QDateTime(day, QTime(mid / 60, mid % 60, 59, 999), zone,
+ QDateTime::TransitionResolution::PreferAfter);
if (probe.isValid() && probe.date() == day) {
low = mid;
when = probe;
@@ -934,88 +1044,127 @@ static QDateTime toLatest(QDate day, const QDateTime &form)
high = mid;
}
}
- return when;
+ // Transitions out of local solar mean time, and the few international
+ // date-line crossings before that (Alaska, Philippines), may have happened
+ // between minute boundaries. Don't try to fix milliseconds.
+ if (QDateTime p = moment(when.time().addSecs(1)); Q_UNLIKELY(p.isValid() && p.date() == day)) {
+ high *= 60;
+ low *= 60;
+ while (high > low + 1) {
+ const int mid = (high + low) / 2;
+ const int min = mid / 60;
+ const QDateTime probe = moment(QTime(min / 60, min % 60, mid % 60, 999));
+ if (probe.isValid() && probe.date() == day) {
+ low = mid;
+ when = probe;
+ } else {
+ high = mid;
+ }
+ }
+ }
+ return when.isValid() ? when : QDateTime();
}
/*!
\since 5.14
- \fn QDateTime QDate::endOfDay(Qt::TimeSpec spec, int offsetSeconds) const
- \fn QDateTime QDate::endOfDay(const QTimeZone &zone) const
-
- Returns the end-moment of the day. Usually, this is one millisecond before
- the midnight at the end of the day: however, if a time-zone transition
- causes the given date to skip over that midnight (e.g. a DST spring-forward
- skipping from just before 23:00 to the start of the next day), the actual
- latest time in the day is returned. This can only arise when the
- start-moment is specified in terms of a time-zone (by passing its QTimeZone
- as \a zone) or in terms of local time (by passing Qt::LocalTime as \a spec;
- this is its default).
-
- The \a offsetSeconds is ignored unless \a spec is Qt::OffsetFromUTC, when it
- gives the implied zone's offset from UTC. As UTC and such zones have no
- transitions, the end of the day is QTime(23, 59, 59, 999) in these cases.
+
+ Returns the end-moment of the day.
+
+ When a day ends depends on a how time is described: each day starts and ends
+ earlier for those in time-zones further west and later for those in
+ time-zones further east. The time representation to use can be specified by
+ an optional time \a zone. The default time representation is the system's
+ local time.
+
+ Usually, the end of the day is one millisecond before the midnight, 24:00:
+ however, if a time-zone transition causes the given date to skip over that
+ moment (e.g. a DST spring-forward skipping over 23:00 and the following
+ hour), the actual latest time in the day is returned. This can only arise
+ when the time representation is a time-zone or local time.
+
+ When \a zone has a timeSpec() of Qt::OffsetFromUTC or Qt::UTC, the time
+ representation has no transitions so the end of the day is QTime(23, 59, 59,
+ 999).
In the rare case of a date that was entirely skipped (this happens when a
zone east of the international date-line switches to being west of it), the
- return shall be invalid. Passing Qt::TimeZone as \a spec (instead of
- passing a QTimeZone) will also produce an invalid result, as shall dates
- that end outside the range representable by QDateTime.
+ return shall be invalid. Passing an invalid time-zone as \a zone will also
+ produce an invalid result, as shall dates that end outside the range
+ representable by QDateTime.
\sa startOfDay()
*/
-QDateTime QDate::endOfDay(Qt::TimeSpec spec, int offsetSeconds) const
+QDateTime QDate::endOfDay(const QTimeZone &zone) const
{
- if (!inDateTimeRange(jd, false))
+ if (!inDateTimeRange(jd, DaySide::End) || !zone.isValid())
return QDateTime();
- switch (spec) {
- case Qt::TimeZone: // should pass a QTimeZone instead of Qt::TimeZone
- qWarning() << "Called QDate::endOfDay(Qt::TimeZone) on" << *this;
- return QDateTime();
- case Qt::UTC:
- case Qt::OffsetFromUTC:
- return QDateTime(*this, QTime(23, 59, 59, 999), spec, offsetSeconds);
+ QDateTime when(*this, QTime(23, 59, 59, 999), zone,
+ QDateTime::TransitionResolution::RelativeToAfter);
+ if (Q_UNLIKELY(!when.isValid() || when.date() != *this)) {
+#if QT_CONFIG(timezone)
+ // The end of the day must have fallen in a spring-forward's gap; find the spring-forward:
+ if (zone.timeSpec() == Qt::TimeZone && zone.hasTransitions()) {
+ QTimeZone::OffsetData tran
+ // It's unlikely there's been another transition since yesterday noon.
+ // However, the whole of today may have been skipped !
+ = zone.nextTransition(QDateTime(addDays(-1), QTime(12, 0), zone));
+ const QDateTime &at = tran.atUtc.toTimeZone(zone);
+ if (at.isValid() && at.date() == *this)
+ return at;
+ }
+#endif
- case Qt::LocalTime:
- if (offsetSeconds)
- qWarning("Ignoring offset (%d seconds) passed with Qt::LocalTime", offsetSeconds);
- break;
+ when = toLatest(*this, zone);
}
- QDateTime when(*this, QTime(23, 59, 59, 999), spec);
- if (!when.isValid())
- when = toLatest(*this, when);
- return when.isValid() ? when : QDateTime();
+ return when;
}
-#if QT_CONFIG(timezone)
/*!
- \overload
- \since 5.14
+ \overload
+ \since 6.5
*/
-QDateTime QDate::endOfDay(const QTimeZone &zone) const
+QDateTime QDate::endOfDay() const
{
- if (!inDateTimeRange(jd, false) || !zone.isValid())
- return QDateTime();
+ return endOfDay(QTimeZone::LocalTime);
+}
- QDateTime when(*this, QTime(23, 59, 59, 999), zone);
- if (when.isValid())
- return when;
-
- // The end of the day must have fallen in a spring-forward's gap; find the spring-forward:
- if (zone.hasTransitions()) {
- QTimeZone::OffsetData tran
- // It's unlikely there's been another transition since yesterday noon.
- // However, the whole of today may have been skipped !
- = zone.nextTransition(QDateTime(addDays(-1), QTime(12, 0), zone));
- const QDateTime &at = tran.atUtc.toTimeZone(zone);
- if (at.isValid() && at.date() == *this)
- return at;
- }
+#if QT_DEPRECATED_SINCE(6, 9)
+/*!
+ \overload
+ \since 5.14
+ \deprecated [6.9] Use \c{endOfDay(const QTimeZone &) instead.
- when = toLatest(*this, when);
- return when.isValid() ? when : QDateTime();
+ Returns the end-moment of the day.
+
+ When a day ends depends on a how time is described: each day starts and ends
+ earlier for those with higher offsets from UTC and later for those with
+ lower offsets from UTC. The time representation to use can be specified
+ either by a \a spec and \a offsetSeconds (ignored unless \a spec is
+ Qt::OffsetSeconds) or by a time zone.
+
+ Usually, the end of the day is one millisecond before the midnight, 24:00:
+ however, if a local time transition causes the given date to skip over that
+ moment (e.g. a DST spring-forward skipping over 23:00 and the following
+ hour), the actual latest time in the day is returned.
+
+ When \a spec is Qt::OffsetFromUTC, \a offsetSeconds gives the implied zone's
+ offset from UTC. As UTC and such zones have no transitions, the end of the
+ day is QTime(23, 59, 59, 999) in these cases.
+
+ In the rare case of a date that was entirely skipped (this happens when a
+ zone east of the international date-line switches to being west of it), the
+ return shall be invalid. Passing Qt::TimeZone as \a spec (instead of passing
+ a QTimeZone) will also produce an invalid result, as shall dates that end
+ outside the range representable by QDateTime.
+*/
+QDateTime QDate::endOfDay(Qt::TimeSpec spec, int offsetSeconds) const
+{
+ QTimeZone zone = asTimeZone(spec, offsetSeconds, "QDate::endOfDay");
+ // If spec was Qt::TimeZone, zone's is Qt::LocalTime.
+ return endOfDay(zone);
}
-#endif // timezone
+#endif // 6.9 deprecation
#if QT_CONFIG(datestring) // depends on, so implies, textdate
@@ -1092,12 +1241,14 @@ QString QDate::toString(Qt::DateFormat format) const
/*!
\fn QString QDate::toString(const QString &format, QCalendar cal) const
\fn QString QDate::toString(QStringView format, QCalendar cal) const
+ \since 5.14
Returns the date as a string. The \a format parameter determines the format
of the result string. If \a cal is supplied, it determines the calendar used
- to represent the date; it defaults to Gregorian.
+ to represent the date; it defaults to Gregorian. Prior to Qt 5.14, there was
+ no \a cal parameter and the Gregorian calendar was always used.
- These expressions may be used:
+ These expressions may be used in the \a format parameter:
\table
\header \li Expression \li Output
@@ -1140,13 +1291,38 @@ QString QDate::toString(Qt::DateFormat format) const
\note Day and month names are given in English (C locale). To get localized
month and day names, use QLocale::system().toString().
- \sa fromString(), QDateTime::toString(), QTime::toString(), QLocale::toString()
+ \note If a format character is repeated more times than the longest
+ expression in the table above using it, this part of the format will be read
+ as several expressions with no separator between them; the longest above,
+ possibly repeated as many times as there are copies of it, ending with a
+ residue that may be a shorter expression. Thus \c{'MMMMMMMMMM'} for a date
+ in May will contribute \c{"MayMay05"} to the output.
+ \sa fromString(), QDateTime::toString(), QTime::toString(), QLocale::toString()
*/
QString QDate::toString(QStringView format, QCalendar cal) const
{
return QLocale::c().toString(*this, format, cal);
}
+
+// Out-of-line no-calendar overloads, since QCalendar is a non-trivial type
+/*!
+ \overload
+ \since 5.10
+*/
+QString QDate::toString(QStringView format) const
+{
+ return QLocale::c().toString(*this, format, QCalendar());
+}
+
+/*!
+ \overload
+ \since 4.6
+*/
+QString QDate::toString(const QString &format) const
+{
+ return QLocale::c().toString(*this, qToStringViewIgnoringNull(format), QCalendar());
+}
#endif // datestring
/*!
@@ -1161,11 +1337,9 @@ QString QDate::toString(QStringView format, QCalendar cal) const
*/
bool QDate::setDate(int year, int month, int day)
{
- if (QGregorianCalendar::julianFromParts(year, month, day, &jd))
- return true;
-
- jd = nullJd();
- return false;
+ const auto maybe = QGregorianCalendar::julianFromParts(year, month, day);
+ jd = maybe.value_or(nullJd());
+ return bool(maybe);
}
/*!
@@ -1227,12 +1401,35 @@ QDate QDate::addDays(qint64 ndays) const
if (isNull())
return QDate();
- // Due to limits on minJd() and maxJd() we know that any overflow
- // will be invalid and caught by fromJulianDay().
- return fromJulianDay(jd + ndays);
+ if (qint64 r; Q_UNLIKELY(qAddOverflow(jd, ndays, &r)))
+ return QDate();
+ else
+ return fromJulianDay(r);
}
/*!
+ \fn QDate QDate::addDuration(std::chrono::days ndays) const
+
+ \since 6.4
+
+ Returns a QDate object containing a date \a ndays later than the
+ date of this object (or earlier if \a ndays is negative).
+
+ Returns a null date if the current date is invalid or the new date is
+ out of range.
+
+ \note Adding durations expressed in \c{std::chrono::months} or
+ \c{std::chrono::years} does not yield the same result obtained by using
+ addMonths() or addYears(). The former are fixed durations, calculated in
+ relation to the solar year; the latter use the Gregorian calendar definitions
+ of months/years.
+
+ \note This function requires C++20.
+
+ \sa addMonths(), addYears(), daysTo()
+*/
+
+/*!
Returns a QDate object containing a date \a nmonths later than the
date of this object (or earlier if \a nmonths is negative).
@@ -1270,7 +1467,7 @@ QDate QDate::addMonths(int nmonths, QCalendar cal) const
count = (++parts.year || cal.hasYearZero()) ? cal.monthsInYear(parts.year) : 0;
}
- return fixedDate(std::move(parts), cal);
+ return fixedDate(parts, cal);
}
/*!
@@ -1302,7 +1499,7 @@ QDate QDate::addMonths(int nmonths) const
++parts.year;
}
- return fixedDate(std::move(parts));
+ return fixedDate(parts);
}
/*!
@@ -1331,11 +1528,11 @@ QDate QDate::addYears(int nyears, QCalendar cal) const
int old_y = parts.year;
parts.year += nyears;
- // If we just crossed (or hit) a missing year zero, adjust year by +/- 1:
+ // If we just crossed (or hit) a missing year zero, adjust year by ±1:
if (!cal.hasYearZero() && ((old_y > 0) != (parts.year > 0) || !parts.year))
parts.year += nyears > 0 ? +1 : -1;
- return fixedDate(std::move(parts), cal);
+ return fixedDate(parts, cal);
}
/*!
@@ -1354,11 +1551,11 @@ QDate QDate::addYears(int nyears) const
int old_y = parts.year;
parts.year += nyears;
- // If we just crossed (or hit) a missing year zero, adjust year by +/- 1:
+ // If we just crossed (or hit) a missing year zero, adjust year by ±1:
if ((old_y > 0) != (parts.year > 0) || !parts.year)
parts.year += nyears > 0 ? +1 : -1;
- return fixedDate(std::move(parts));
+ return fixedDate(parts);
}
/*!
@@ -1384,14 +1581,14 @@ qint64 QDate::daysTo(QDate d) const
/*!
- \fn bool QDate::operator==(QDate lhs, QDate rhs)
+ \fn bool QDate::operator==(const QDate &lhs, const QDate &rhs)
Returns \c true if \a lhs and \a rhs represent the same day, otherwise
\c false.
*/
/*!
- \fn bool QDate::operator!=(QDate lhs, QDate rhs)
+ \fn bool QDate::operator!=(const QDate &lhs, const QDate &rhs)
Returns \c true if \a lhs and \a rhs represent distinct days; otherwise
returns \c false.
@@ -1400,26 +1597,26 @@ qint64 QDate::daysTo(QDate d) const
*/
/*!
- \fn bool QDate::operator<(QDate lhs, QDate rhs)
+ \fn bool QDate::operator<(const QDate &lhs, const QDate &rhs)
Returns \c true if \a lhs is earlier than \a rhs; otherwise returns \c false.
*/
/*!
- \fn bool QDate::operator<=(QDate lhs, QDate rhs)
+ \fn bool QDate::operator<=(const QDate &lhs, const QDate &rhs)
Returns \c true if \a lhs is earlier than or equal to \a rhs;
otherwise returns \c false.
*/
/*!
- \fn bool QDate::operator>(QDate lhs, QDate rhs)
+ \fn bool QDate::operator>(const QDate &lhs, const QDate &rhs)
Returns \c true if \a lhs is later than \a rhs; otherwise returns \c false.
*/
/*!
- \fn bool QDate::operator>=(QDate lhs, QDate rhs)
+ \fn bool QDate::operator>=(const QDate &lhs, const QDate &rhs)
Returns \c true if \a lhs is later than or equal to \a rhs;
otherwise returns \c false.
@@ -1427,35 +1624,12 @@ qint64 QDate::daysTo(QDate d) const
/*!
\fn QDate::currentDate()
- Returns the current date, as reported by the system clock.
+ Returns the system clock's current date.
\sa QTime::currentTime(), QDateTime::currentDateTime()
*/
#if QT_CONFIG(datestring) // depends on, so implies, textdate
-namespace {
-
-struct ParsedInt { qulonglong value = 0; bool ok = false; };
-
-/*
- /internal
-
- Read a whole number that must be the whole text. QStringView::toULongLong()
- will happily ignore spaces and accept signs; but various date formats'
- fields (e.g. all in ISO) should not.
-*/
-ParsedInt readInt(QStringView text)
-{
- ParsedInt result;
- for (QStringIterator it(text); it.hasNext();) {
- if (!QChar::isDigit(it.next()))
- return result;
- }
- result.value = text.toULongLong(&result.ok);
- return result;
-}
-
-}
/*!
\fn QDate QDate::fromString(const QString &string, Qt::DateFormat format)
@@ -1508,13 +1682,13 @@ QDate QDate::fromString(QStringView string, Qt::DateFormat format)
}
case Qt::ISODate:
// Semi-strict parsing, must be long enough and have punctuators as separators
- if (string.size() >= 10 && string.at(4).isPunct() && string.at(7).isPunct()
- && (string.size() == 10 || !string.at(10).isDigit())) {
+ if (string.size() >= 10 && string[4].isPunct() && string[7].isPunct()
+ && (string.size() == 10 || !string[10].isDigit())) {
const ParsedInt year = readInt(string.first(4));
const ParsedInt month = readInt(string.sliced(5, 2));
const ParsedInt day = readInt(string.sliced(8, 2));
- if (year.ok && year.value > 0 && year.value <= 9999 && month.ok && day.ok)
- return QDate(year.value, month.value, day.value);
+ if (year.ok() && year.result > 0 && year.result <= 9999 && month.ok() && day.ok())
+ return QDate(year.result, month.result, day.result);
}
break;
}
@@ -1522,7 +1696,7 @@ QDate QDate::fromString(QStringView string, Qt::DateFormat format)
}
/*!
- \fn QDate QDate::fromString(const QString &string, const QString &format, QCalendar cal)
+ \fn QDate QDate::fromString(const QString &string, const QString &format, int baseYear, QCalendar cal)
Returns the QDate represented by the \a string, using the \a
format given, or an invalid date if the string cannot be parsed.
@@ -1572,15 +1746,82 @@ QDate QDate::fromString(QStringView string, Qt::DateFormat format)
\table
\header \li Field \li Default value
- \row \li Year \li 1900
+ \row \li Year \li \a baseYear (or 1900)
\row \li Month \li 1 (January)
\row \li Day \li 1
\endtable
+ When \a format only specifies the last two digits of a year, the 100 years
+ starting at \a baseYear are the candidates first considered. Prior to 6.7
+ there was no \a baseYear parameter and 1900 was always used. This is the
+ default for \a baseYear, selecting a year from then to 1999. Passing 1976 as
+ \a baseYear will select a year from 1976 through 2075, for example. When the
+ format also includes month, day (of month) and day-of-week, these suffice to
+ imply the century. In such a case, a matching date is selected in the
+ nearest century to the one indicated by \a baseYear, prefering later over
+ earlier. See \l QCalendar::matchCenturyToWeekday() and \l {Date ambiguities}
+ for further details,
+
The following examples demonstrate the default values:
\snippet code/src_corelib_time_qdatetime.cpp 3
+ \note If a format character is repeated more times than the longest
+ expression in the table above using it, this part of the format will be read
+ as several expressions with no separator between them; the longest above,
+ possibly repeated as many times as there are copies of it, ending with a
+ residue that may be a shorter expression. Thus \c{'MMMMMMMMMM'} would match
+ \c{"MayMay05"} and set the month to May. Likewise, \c{'MMMMMM'} would match
+ \c{"May08"} and find it inconsistent, leading to an invalid date.
+
+ \section2 Date ambiguities
+
+ Different cultures use different formats for dates and, as a result, users
+ may mix up the order in which date fields should be given. For example,
+ \c{"Wed 28-Nov-01"} might mean either 2028 November 1st or the 28th of
+ November, 2001 (each of which happens to be a Wednesday). Using format
+ \c{"ddd yy-MMM-dd"} it shall be interpreted the first way, using \c{"ddd
+ dd-MMM-yy"} the second. However, which the user meant may depend on the way
+ the user normally writes dates, rather than the format the code was
+ expecting.
+
+ The example considered above mixed up day of the month and a two-digit year.
+ Similar confusion can arise over interchanging the month and day of the
+ month, when both are given as numbers. In these cases, including a day of
+ the week field in the date format can provide some redundancy, that may help
+ to catch errors of this kind. However, as in the example above, this is not
+ always effective: the interchange of two fields (or their meanings) may
+ produce dates with the same day of the week.
+
+ Including a day of the week in the format can also resolve the century of a
+ date specified using only the last two digits of its year. Unfortunately,
+ when combined with a date in which the user (or other source of data) has
+ mixed up two of the fields, this resolution can lead to finding a date which
+ does match the format's reading but isn't the one intended by its author.
+ Likewise, if the user simply gets the day of the week wrong, in an otherwise
+ correct date, this can lead a date in a different century. In each case,
+ finding a date in a different century can turn a wrongly-input date into a
+ wildly different one.
+
+ The best way to avoid date ambiguities is to use four-digit years and months
+ specified by name (whether full or abbreviated), ideally collected via user
+ interface idioms that make abundantly clear to the user which part of the
+ date they are selecting. Including a day of the week can also help by
+ providing the means to check consistency of the data. Where data comes from
+ the user, using a format supplied by a locale selected by the user, it is
+ best to use a long format as short formats are more likely to use two-digit
+ years. Of course, it is not always possible to control the format - data may
+ come from a source you do not control, for example.
+
+ As a result of these possible sources of confusion, particularly when you
+ cannot be sure an unambiguous format is in use, it is important to check
+ that the result of reading a string as a date is not just valid but
+ reasonable for the purpose for which it was supplied. If the result is
+ outside some range of reasonable values, it may be worth getting the user to
+ confirm their date selection, showing the date read from the string in a
+ long format that does include month name and four-digit year, to make it
+ easier for them to recognize any errors.
+
\sa toString(), QDateTime::fromString(), QTime::fromString(),
QLocale::toDate()
*/
@@ -1595,21 +1836,67 @@ QDate QDate::fromString(QStringView string, Qt::DateFormat format)
\overload
\since 6.0
*/
-QDate QDate::fromString(const QString &string, QStringView format, QCalendar cal)
+QDate QDate::fromString(const QString &string, QStringView format, int baseYear, QCalendar cal)
{
QDate date;
#if QT_CONFIG(datetimeparser)
QDateTimeParser dt(QMetaType::QDate, QDateTimeParser::FromString, cal);
dt.setDefaultLocale(QLocale::c());
if (dt.parseFormat(format))
- dt.fromString(string, &date, nullptr);
+ dt.fromString(string, &date, nullptr, baseYear);
#else
Q_UNUSED(string);
Q_UNUSED(format);
+ Q_UNUSED(baseYear);
Q_UNUSED(cal);
#endif
return date;
}
+
+/*!
+ \fn QDate QDate::fromString(const QString &string, const QString &format, QCalendar cal)
+ \overload
+ \since 5.14
+*/
+
+/*!
+ \fn QDate QDate::fromString(const QString &string, QStringView format, QCalendar cal)
+ \overload
+ \since 6.0
+*/
+
+/*!
+ \fn QDate QDate::fromString(QStringView string, QStringView format, int baseYear, QCalendar cal)
+ \overload
+ \since 6.7
+*/
+
+/*!
+ \fn QDate QDate::fromString(QStringView string, QStringView format, int baseYear)
+ \overload
+ \since 6.7
+
+ Uses a default-constructed QCalendar.
+*/
+
+/*!
+ \overload
+ \since 6.7
+
+ Uses a default-constructed QCalendar.
+*/
+QDate QDate::fromString(const QString &string, QStringView format, int baseYear)
+{
+ return fromString(string, format, baseYear, QCalendar());
+}
+
+/*!
+ \fn QDate QDate::fromString(const QString &string, const QString &format, int baseYear)
+ \overload
+ \since 6.7
+
+ Uses a default-constructed QCalendar.
+*/
#endif // datestring
/*!
@@ -1668,6 +1955,8 @@ bool QDate::isLeapYear(int y)
\brief The QTime class provides clock time functions.
+ \compares strong
+
A QTime object contains a clock time, which it can express as the numbers of
hours, minutes, seconds, and milliseconds since midnight. It provides
functions for comparing times and for manipulating a time by adding a number
@@ -1882,12 +2171,17 @@ QString QTime::toString(Qt::DateFormat format) const
\row \li mm \li The minute with a leading zero (00 to 59)
\row \li s \li The whole second, without any leading zero (0 to 59)
\row \li ss \li The whole second, with a leading zero where applicable (00 to 59)
- \row \li z \li The fractional part of the second, to go after a decimal
- point, without trailing zeroes (0 to 999). Thus "\c{s.z}"
- reports the seconds to full available (millisecond) precision
- without trailing zeroes.
- \row \li zzz \li The fractional part of the second, to millisecond
- precision, including trailing zeroes where applicable (000 to 999).
+ \row \li z or zz
+ \li The fractional part of the second, to go after a decimal point,
+ without trailing zeroes. Thus \c{"s.z"} reports the seconds to full
+ available (millisecond) precision without trailing zeroes (0 to
+ 999). For example, \c{"s.z"} would produce \c{"0.25"} for a time a
+ quarter second into a minute.
+ \row \li zzz
+ \li The fractional part of the second, to millisecond precision,
+ including trailing zeroes where applicable (000 to 999). For
+ example, \c{"ss.zzz"} would produce \c{"00.250"} for a time a
+ quarter second into a minute.
\row \li AP or A
\li Use AM/PM display. \c A/AP will be replaced by 'AM' or 'PM'. In
localized forms (only relevant to \l{QLocale::toString()}), the
@@ -1902,7 +2196,24 @@ QString QTime::toString(Qt::DateFormat format) const
\l{QLocale::toString()}), the locale-appropriate text (returned by
\l{QLocale::amText()} or \l{QLocale::pmText()}) is used without
change of case.
- \row \li t \li The timezone (for example "CEST")
+ \row \li t
+ \li The timezone abbreviation (for example "CEST"). Note that time zone
+ abbreviations are not unique. In particular, \l toString() cannot
+ parse this.
+ \row \li tt
+ \li The timezone's offset from UTC with no colon between the hours and
+ minutes (for example "+0200").
+ \row \li ttt
+ \li The timezone's offset from UTC with a colon between the hours and
+ minutes (for example "+02:00").
+ \row \li tttt
+ \li The timezone name (for example "Europe/Berlin"). Note that this
+ gives no indication of whether the datetime was in daylight-saving
+ time or standard time, which may lead to ambiguity if the datetime
+ falls in an hour repeated by a transition between the two. The name
+ used is the one provided by \l QTimeZone::displayName() with the \l
+ QTimeZone::LongName type. This may depend on the operating system
+ in use.
\endtable
Any non-empty sequence of characters enclosed in single quotes will be
@@ -1930,8 +2241,16 @@ QString QTime::toString(Qt::DateFormat format) const
\note To get localized forms of AM or PM (the AP, ap, A, a, aP or Ap
formats), use QLocale::system().toString().
+ \note If a format character is repeated more times than the longest
+ expression in the table above using it, this part of the format will be read
+ as several expressions with no separator between them; the longest above,
+ possibly repeated as many times as there are copies of it, ending with a
+ residue that may be a shorter expression. Thus \c{'HHHHH'} for the time
+ 08:00 will contribute \c{"08088"} to the output.
+
\sa fromString(), QDate::toString(), QDateTime::toString(), QLocale::toString()
*/
+// ### Qt 7 The 't' format specifiers should be specific to QDateTime (compare fromString).
QString QTime::toString(QStringView format) const
{
return QLocale::c().toString(*this, format);
@@ -1955,7 +2274,8 @@ bool QTime::setHMS(int h, int m, int s, int ms)
mds = NullTime; // make this invalid
return false;
}
- mds = (h * SECS_PER_HOUR + m * SECS_PER_MIN + s) * MSECS_PER_SEC + ms;
+ mds = ((h * MINS_PER_HOUR + m) * SECS_PER_MIN + s) * MSECS_PER_SEC + ms;
+ Q_ASSERT(mds >= 0 && mds < MSECS_PER_DAY);
return true;
}
@@ -2021,15 +2341,8 @@ int QTime::secsTo(QTime t) const
QTime QTime::addMSecs(int ms) const
{
QTime t;
- if (isValid()) {
- if (ms < 0) {
- // %,/ not well-defined for -ve, so always work with +ve.
- int negdays = (MSECS_PER_DAY - ms) / MSECS_PER_DAY;
- t.mds = (ds() + ms + negdays * MSECS_PER_DAY) % MSECS_PER_DAY;
- } else {
- t.mds = (ds() + ms) % MSECS_PER_DAY;
- }
- }
+ if (isValid())
+ t.mds = QRoundingDown::qMod<MSECS_PER_DAY>(ds() + ms);
return t;
}
@@ -2056,38 +2369,38 @@ int QTime::msecsTo(QTime t) const
/*!
- \fn bool QTime::operator==(QTime lhs, QTime rhs)
+ \fn bool QTime::operator==(const QTime &lhs, const QTime &rhs)
Returns \c true if \a lhs is equal to \a rhs; otherwise returns \c false.
*/
/*!
- \fn bool QTime::operator!=(QTime lhs, QTime rhs)
+ \fn bool QTime::operator!=(const QTime &lhs, const QTime &rhs)
Returns \c true if \a lhs is different from \a rhs; otherwise returns \c false.
*/
/*!
- \fn bool QTime::operator<(QTime lhs, QTime rhs)
+ \fn bool QTime::operator<(const QTime &lhs, const QTime &rhs)
Returns \c true if \a lhs is earlier than \a rhs; otherwise returns \c false.
*/
/*!
- \fn bool QTime::operator<=(QTime lhs, QTime rhs)
+ \fn bool QTime::operator<=(const QTime &lhs, const QTime &rhs)
Returns \c true if \a lhs is earlier than or equal to \a rhs;
otherwise returns \c false.
*/
/*!
- \fn bool QTime::operator>(QTime lhs, QTime rhs)
+ \fn bool QTime::operator>(const QTime &lhs, const QTime &rhs)
Returns \c true if \a lhs is later than \a rhs; otherwise returns \c false.
*/
/*!
- \fn bool QTime::operator>=(QTime lhs, QTime rhs)
+ \fn bool QTime::operator>=(const QTime &lhs, const QTime &rhs)
Returns \c true if \a lhs is later than or equal to \a rhs;
otherwise returns \c false.
@@ -2139,7 +2452,7 @@ static QTime fromIsoTimeString(QStringView string, Qt::DateFormat format, bool *
// TextDate restricts fractional parts to the seconds field.
QStringView tail;
- const int dot = string.indexOf(u'.'), comma = string.indexOf(u',');
+ const qsizetype dot = string.indexOf(u'.'), comma = string.indexOf(u',');
if (dot != -1) {
tail = string.sliced(dot + 1);
if (tail.indexOf(u'.') != -1) // Forbid second dot:
@@ -2154,63 +2467,63 @@ static QTime fromIsoTimeString(QStringView string, Qt::DateFormat format, bool *
const ParsedInt frac = readInt(tail);
// There must be *some* digits in a fractional part; and it must be all digits:
- if (tail.isEmpty() ? dot != -1 || comma != -1 : !frac.ok)
+ if (tail.isEmpty() ? dot != -1 || comma != -1 : !frac.ok())
return QTime();
- Q_ASSERT(frac.ok ^ tail.isEmpty());
- double fraction = frac.ok ? frac.value * std::pow(0.1, tail.size()) : 0.0;
+ Q_ASSERT(frac.ok() ^ tail.isEmpty());
+ double fraction = frac.ok() ? frac.result * std::pow(0.1, tail.size()) : 0.0;
- const int size = string.size();
+ const qsizetype size = string.size();
if (size < 2 || size > 8)
return QTime();
ParsedInt hour = readInt(string.first(2));
- if (!hour.ok || hour.value > (format == Qt::TextDate ? 23 : 24))
+ if (!hour.ok() || hour.result > (format == Qt::TextDate ? 23 : 24))
return QTime();
- ParsedInt minute;
+ ParsedInt minute{};
if (string.size() > 2) {
if (string[2] == u':' && string.size() > 4)
minute = readInt(string.sliced(3, 2));
- if (!minute.ok || minute.value >= 60)
+ if (!minute.ok() || minute.result >= MINS_PER_HOUR)
return QTime();
} else if (format == Qt::TextDate) { // Requires minutes
return QTime();
- } else if (frac.ok) {
+ } else if (frac.ok()) {
Q_ASSERT(!(fraction < 0.0) && fraction < 1.0);
- fraction *= 60;
- minute.value = qulonglong(fraction);
- fraction -= minute.value;
+ fraction *= MINS_PER_HOUR;
+ minute.result = qulonglong(fraction);
+ fraction -= minute.result;
}
- ParsedInt second;
+ ParsedInt second{};
if (string.size() > 5) {
if (string[5] == u':' && string.size() == 8)
second = readInt(string.sliced(6, 2));
- if (!second.ok || second.value >= 60)
+ if (!second.ok() || second.result >= SECS_PER_MIN)
return QTime();
- } else if (frac.ok) {
+ } else if (frac.ok()) {
if (format == Qt::TextDate) // Doesn't allow fraction of minutes
return QTime();
Q_ASSERT(!(fraction < 0.0) && fraction < 1.0);
- fraction *= 60;
- second.value = qulonglong(fraction);
- fraction -= second.value;
+ fraction *= SECS_PER_MIN;
+ second.result = qulonglong(fraction);
+ fraction -= second.result;
}
Q_ASSERT(!(fraction < 0.0) && fraction < 1.0);
// Round millis to nearest (unlike minutes and seconds, rounded down):
- int msec = frac.ok ? qRound(MSECS_PER_SEC * fraction) : 0;
+ int msec = frac.ok() ? qRound(MSECS_PER_SEC * fraction) : 0;
// But handle overflow gracefully:
if (msec == MSECS_PER_SEC) {
// If we can (when data were otherwise valid) validly propagate overflow
// into other fields, do so:
- if (isMidnight24 || hour.value < 23 || minute.value < 59 || second.value < 59) {
+ if (isMidnight24 || hour.result < 23 || minute.result < 59 || second.result < 59) {
msec = 0;
- if (++second.value == 60) {
- second.value = 0;
- if (++minute.value == 60) {
- minute.value = 0;
- ++hour.value;
+ if (++second.result == SECS_PER_MIN) {
+ second.result = 0;
+ if (++minute.result == MINS_PER_HOUR) {
+ minute.result = 0;
+ ++hour.result;
// May need to propagate further via isMidnight24, see below
}
}
@@ -2222,14 +2535,14 @@ static QTime fromIsoTimeString(QStringView string, Qt::DateFormat format, bool *
}
// For ISO date format, 24:0:0 means 0:0:0 on the next day:
- if (hour.value == 24 && minute.value == 0 && second.value == 0 && msec == 0) {
+ if (hour.result == 24 && minute.result == 0 && second.result == 0 && msec == 0) {
Q_ASSERT(format != Qt::TextDate); // It clipped hour at 23, above.
if (isMidnight24)
*isMidnight24 = true;
- hour.value = 0;
+ hour.result = 0;
}
- return QTime(hour.value, minute.value, second.value, msec);
+ return QTime(hour.result, minute.result, second.result, msec);
}
/*!
@@ -2283,12 +2596,20 @@ QTime QTime::fromString(QStringView string, Qt::DateFormat format)
\row \li mm \li The minute with a leading zero (00 to 59)
\row \li s \li The whole second, without any leading zero (0 to 59)
\row \li ss \li The whole second, with a leading zero where applicable (00 to 59)
- \row \li z \li The fractional part of the second, to go after a decimal
- point, without trailing zeroes (0 to 999). Thus "\c{s.z}"
- reports the seconds to full available (millisecond) precision
- without trailing zeroes.
- \row \li zzz \li The fractional part of the second, to millisecond
- precision, including trailing zeroes where applicable (000 to 999).
+ \row \li z or zz
+ \li The fractional part of the second, as would usually follow a
+ decimal point, without requiring trailing zeroes (0 to 999). Thus
+ \c{"s.z"} matches the seconds with up to three digits of fractional
+ part supplying millisecond precision, without needing trailing
+ zeroes. For example, \c{"s.z"} would recognize either \c{"00.250"}
+ or \c{"0.25"} as representing a time a quarter second into its
+ minute.
+ \row \li zzz
+ \li Three digit fractional part of the second, to millisecond
+ precision, including trailing zeroes where applicable (000 to 999).
+ For example, \c{"ss.zzz"} would reject \c{"0.25"} but recognize
+ \c{"00.250"} as representing a time a quarter second into its
+ minute.
\row \li AP, A, ap, a, aP or Ap
\li Either 'AM' indicating a time before 12:00 or 'PM' for later times,
matched case-insensitively.
@@ -2318,6 +2639,15 @@ QTime QTime::fromString(QStringView string, Qt::DateFormat format)
\note If localized forms of am or pm (the AP, ap, Ap, aP, A or a formats)
are to be recognized, use QLocale::system().toTime().
+ \note If a format character is repeated more times than the longest
+ expression in the table above using it, this part of the format will be read
+ as several expressions with no separator between them; the longest above,
+ possibly repeated as many times as there are copies of it, ending with a
+ residue that may be a shorter expression. Thus \c{'HHHHH'} would match
+ \c{"08088"} or \c{"080808"} and set the hour to 8; if the time string
+ contained "070809" it would "match" but produce an inconsistent result,
+ leading to an invalid time.
+
\sa toString(), QDateTime::fromString(), QDate::fromString(),
QLocale::toTime(), QLocale::toDateTime()
*/
@@ -2365,7 +2695,8 @@ QTime QTime::fromString(const QString &string, QStringView format)
bool QTime::isValid(int h, int m, int s, int ms)
{
- return uint(h) < 24 && uint(m) < 60 && uint(s) < SECS_PER_MIN && uint(ms) < MSECS_PER_SEC;
+ return (uint(h) < 24 && uint(m) < MINS_PER_HOUR && uint(s) < SECS_PER_MIN
+ && uint(ms) < MSECS_PER_SEC);
}
/*****************************************************************************
@@ -2376,413 +2707,44 @@ bool QTime::isValid(int h, int m, int s, int ms)
typedef QDateTimePrivate::QDateTimeShortData ShortData;
typedef QDateTimePrivate::QDateTimeData QDateTimeData;
-// Returns the tzname, assume tzset has been called already
-static QString qt_tzname(QDateTimePrivate::DaylightStatus daylightStatus)
+// Converts milliseconds since the start of 1970 into a date and/or time:
+static qint64 msecsToJulianDay(qint64 msecs)
{
- int isDst = (daylightStatus == QDateTimePrivate::DaylightTime) ? 1 : 0;
-#if defined(Q_CC_MSVC)
- size_t s = 0;
- char name[512];
- if (_get_tzname(&s, name, 512, isDst))
- return QString();
- return QString::fromLocal8Bit(name);
-#else
- return QString::fromLocal8Bit(tzname[isDst]);
-#endif // Q_OS_WIN
+ return JULIAN_DAY_FOR_EPOCH + QRoundingDown::qDiv<MSECS_PER_DAY>(msecs);
}
-#if QT_CONFIG(datetimeparser)
-/*
- \internal
- Implemented here to share qt_tzname()
-*/
-int QDateTimeParser::startsWithLocalTimeZone(QStringView name)
+static QDate msecsToDate(qint64 msecs)
{
- QDateTimePrivate::DaylightStatus zones[2] = {
- QDateTimePrivate::StandardTime,
- QDateTimePrivate::DaylightTime
- };
- for (const auto z : zones) {
- QString zone(qt_tzname(z));
- if (name.startsWith(zone))
- return zone.size();
- }
- return 0;
+ return QDate::fromJulianDay(msecsToJulianDay(msecs));
}
-#endif // datetimeparser
-/*
- Qt represents n BCE as -n, whereas struct tm's tm_year field represents a
- year by the number of years after (negative for before) 1900, so that 1+m
- BCE is -1900 -m; so treating 1 BCE as 0 CE. We thus shift by different
- offsets depending on whether the year is BCE or CE.
-*/
-static constexpr int tmYearFromQYear(int year) { return year - (year < 0 ? 1899 : 1900); }
-static constexpr int qYearFromTmYear(int year) { return year + (year < -1899 ? 1899 : 1900); }
-
-/* If mktime() returns -1, is it really an error ?
-
- It might return -1 because we're looking at the last second of 1969 and
- mktime does support times before 1970 (POSIX says "If the year is <1970 or
- the value is negative, the relationship is undefined" and MS rejects the
- value, consistent with that; so we don't call qt_mktime() on MS in this case
- and can't get -1 unless it's a real error). However, on UNIX, that's -1 UTC
- time and all we know, aside from mktime's return, is the local time. (We
- could check errno, but we call mktime from within a
- qt_scoped_lock(QBasicMutex), whose unlocking and destruction of the locker
- might frob errno.)
-
- We can assume the zone offset is a multiple of five minutes and less than a
- day, so this can only arise for the last second of a minute that differs from
- 59 by a multiple of 5 on the last day of 1969 or the first day of 1970. That
- makes for a cheap pre-test; if it holds, we can ask mktime about the first
- second of the same minute; if it gives us -60, then the -1 we originally saw
- is not an error (or was an error, but needn't have been).
-*/
-static inline bool meansEnd1969(tm *local)
+static QTime msecsToTime(qint64 msecs)
{
-#ifdef Q_OS_WIN
- Q_UNUSED(local);
- return false;
-#else
- if (local->tm_sec < 59 || local->tm_year < 69 || local->tm_year > 70
- || local->tm_min % 5 != 4 // Assume zone offset is a multiple of 5 mins
- || (local->tm_year == 69
- ? local->tm_mon < 11 || local->tm_mday < 31
- : local->tm_mon > 0 || local->tm_mday > 1)) {
- return false;
- }
- tm copy = *local;
- copy.tm_sec--; // Preceding second should get -2, not -1
- if (qMkTime(&copy) != -2)
- return false;
- // The original call to qMkTime() may have returned -1 as failure, not
- // updating local, even though it could have; so fake it here. Assumes there
- // was no transition in the last minute of the day !
- *local = copy;
- local->tm_sec++; // Advance back to the intended second
- return true;
-#endif
+ return QTime::fromMSecsSinceStartOfDay(QRoundingDown::qMod<MSECS_PER_DAY>(msecs));
}
-/*
- Call mktime but bypass its fixing of denormal times.
-
- The POSIX spec says mktime() accepts a struct tm whose fields lie outside
- the usual ranges; the parameter is not const-qualified and will be updated
- to have values in those ranges. However, MS's implementation doesn't do that
- (or hasn't always done it); and the only member we actually want updated is
- the tm_isdst flag. (Aside: MS's implementation also only works for tm_year
- >= 70; this is, in fact, in accordance with the POSIX spec; but all known
- UNIX libc implementations in fact have a signed time_t and Do The Sensible
- Thing, to the best of their ability, at least for 0 <= tm_year < 70; see
- meansEnd1969 for the handling of the last second of UTC's 1969.)
-
- If we thought we knew tm_isdst and mktime() disagrees, it'll let us know
- either by correcting it - in which case it adjusts the struct tm to reflect
- the same time, but represented using the right tm_isdst, so typically an
- hour earlier or later - or by returning -1. When this happens, the way we
- actually use qt_mktime(), we don't want a revised time with corrected DST,
- we want the original time with its corrected DST; so we retry the call, this
- time not claiming to know the DST-ness.
-
- POSIX doesn't actually say what to do if the specified struct tm describes a
- time in a spring-forward gap: read literally, this is an unrepresentable
- time and it could return -1, setting errno to EOVERFLOW. However, actual
- implementations chose a time one side or the other of the gap. For example,
- if we claim to know DST, glibc pushes to the other side of the gap (changing
- tm_isdst), but stays on the indicated branch of a repetition (no change to
- tm_isdst); this matches how QTimeZonePrivate::dataForLocalTime() uses its
- hint; in either case, if we don't claim to know DST, glibc picks the DST
- candidate. (Experiments conducted with glibc 2.31-9.)
-*/
-static inline bool callMkTime(tm *local, time_t *secs)
-{
- constexpr time_t maybeError = -1; // mktime()'s return on error; or last second of 1969 UTC.
- const tm copy = *local;
- *secs = qMkTime(local);
- bool good = *secs != maybeError || meansEnd1969(local);
- if (copy.tm_isdst >= 0 && (!good || local->tm_isdst != copy.tm_isdst)) {
- // We thought we knew DST-ness, but were wrong:
- *local = copy;
- local->tm_isdst = -1;
- *secs = qMkTime(local);
- good = *secs != maybeError || meansEnd1969(local);
- }
-#if defined(Q_OS_WIN)
- // Windows mktime for the missing hour backs up 1 hour instead of advancing
- // 1 hour. If time differs and is standard time then this has happened, so
- // add 2 hours to the time and 1 hour to the secs
- if (local->tm_isdst == 0 && local->tm_hour != copy.tm_hour) {
- local->tm_hour += 2;
- if (local->tm_hour > 23) {
- local->tm_hour -= 24;
- if (++local->tm_mday > QGregorianCalendar::monthLength(
- local->tm_mon + 1, qYearFromTmYear(local->tm_year))) {
- local->tm_mday = 1;
- if (++local->tm_mon > 11) {
- local->tm_mon = 0;
- ++local->tm_year;
- }
- }
- }
- *secs += SECS_PER_HOUR;
- local->tm_isdst = 1;
- }
-#endif // Q_OS_WIN
- return good;
-}
-
-// Calls the platform variant of mktime for the given date, time and
-// daylightStatus, and updates the date, time, daylightStatus and abbreviation
-// with the returned values. If the date falls outside the time_t range
-// supported by mktime, then date/time will not be updated and *ok is set false.
-static qint64 qt_mktime(QDate *date, QTime *time, QDateTimePrivate::DaylightStatus *daylightStatus,
- QString *abbreviation, bool *ok)
-{
- Q_ASSERT(ok && date && time);
- qint64 msec = time->msec();
- Q_ASSERT(msec < MSECS_PER_SEC);
- int yy, mm, dd;
- date->getDate(&yy, &mm, &dd);
-
- tm local = {};
- local.tm_sec = time->second();
- local.tm_min = time->minute();
- local.tm_hour = time->hour();
- local.tm_mday = dd;
- local.tm_mon = mm - 1;
- local.tm_year = tmYearFromQYear(yy);
- local.tm_isdst = daylightStatus ? int(*daylightStatus) : -1;
-
- time_t secsSinceEpoch;
- if (!callMkTime(&local, &secsSinceEpoch)) {
- *date = QDate();
- *time = QTime();
- if (daylightStatus)
- *daylightStatus = QDateTimePrivate::UnknownDaylightTime;
- if (abbreviation)
- *abbreviation = QString();
- *ok = false;
- return 0;
- }
-
- // Store date and time:
- *date = QDate(qYearFromTmYear(local.tm_year), local.tm_mon + 1, local.tm_mday);
- *time = QTime(local.tm_hour, local.tm_min, local.tm_sec, msec);
-
- // Store zone details:
- if (local.tm_isdst > 0) {
- if (daylightStatus)
- *daylightStatus = QDateTimePrivate::DaylightTime;
- if (abbreviation)
- *abbreviation = qt_tzname(QDateTimePrivate::DaylightTime);
- } else {
- if (daylightStatus) {
- *daylightStatus = (local.tm_isdst == 0
- ? QDateTimePrivate::StandardTime
- : QDateTimePrivate::UnknownDaylightTime);
- }
- if (abbreviation)
- *abbreviation = qt_tzname(QDateTimePrivate::StandardTime);
- }
-
- // Compute final UTC milliseconds since epoch:
- if (secsSinceEpoch < 0 && msec > 0) {
- secsSinceEpoch++;
- msec -= MSECS_PER_SEC;
- }
- qint64 millis;
- const bool overflow =
- mul_overflow(qint64(secsSinceEpoch),
- std::integral_constant<qint64, MSECS_PER_SEC>(), &millis)
- || add_overflow(millis, msec, &msec);
- *ok = !overflow;
-
- return msec;
-}
-
-// Calls the platform variant of localtime for the given msecs, and updates
-// the date, time, and DST status with the returned values.
-static bool qt_localtime(qint64 msecsSinceEpoch, QDate *localDate, QTime *localTime,
- QDateTimePrivate::DaylightStatus *daylightStatus)
-{
- const int signFix = msecsSinceEpoch % MSECS_PER_SEC && msecsSinceEpoch < 0 ? 1 : 0;
- const time_t secsSinceEpoch = msecsSinceEpoch / MSECS_PER_SEC - signFix;
- const int msec = msecsSinceEpoch % MSECS_PER_SEC + signFix * MSECS_PER_SEC;
- Q_ASSERT(msec >= 0 && msec < MSECS_PER_SEC);
-
- tm local;
- bool valid = false;
-
- // localtime() is specified to work as if it called tzset().
- // localtime_r() does not have this constraint, so make an explicit call.
- // The explicit call should also request the timezone info be re-parsed.
- qTzSet();
- if (qint64(secsSinceEpoch) * MSECS_PER_SEC + msec == msecsSinceEpoch) {
-#if QT_CONFIG(thread) && defined(_POSIX_THREAD_SAFE_FUNCTIONS)
- // Use the reentrant version of localtime() where available
- // as is thread-safe and doesn't use a shared static data area
- if (tm *res = localtime_r(&secsSinceEpoch, &local)) {
- Q_ASSERT(res == &local);
- valid = true;
- }
-#elif defined(Q_OS_WIN)
- if (!localtime_s(&local, &secsSinceEpoch))
- valid = true;
-#else
- // Returns shared static data which may be overwritten at any time
- // So copy the result asap
- if (tm *res = localtime(&secsSinceEpoch)) {
- local = *res;
- valid = true;
- }
-#endif
- }
- if (valid) {
- *localDate = QDate(qYearFromTmYear(local.tm_year), local.tm_mon + 1, local.tm_mday);
- *localTime = QTime(local.tm_hour, local.tm_min, local.tm_sec, msec);
- if (daylightStatus) {
- if (local.tm_isdst > 0)
- *daylightStatus = QDateTimePrivate::DaylightTime;
- else if (local.tm_isdst < 0)
- *daylightStatus = QDateTimePrivate::UnknownDaylightTime;
- else
- *daylightStatus = QDateTimePrivate::StandardTime;
- }
- return true;
- } else {
- *localDate = QDate();
- *localTime = QTime();
- if (daylightStatus)
- *daylightStatus = QDateTimePrivate::UnknownDaylightTime;
- return false;
- }
-}
-
-// Converts an msecs value into a date and time
-static void msecsToTime(qint64 msecs, QDate *date, QTime *time)
+// True if combining days with millis overflows; otherwise, stores result in *sumMillis
+// The inputs should not have opposite signs.
+static inline bool daysAndMillisOverflow(qint64 days, qint64 millisInDay, qint64 *sumMillis)
{
- qint64 jd = JULIAN_DAY_FOR_EPOCH;
- qint64 ds = 0;
-
- if (msecs >= MSECS_PER_DAY || msecs <= -MSECS_PER_DAY) {
- jd += msecs / MSECS_PER_DAY;
- msecs %= MSECS_PER_DAY;
- }
-
- if (msecs < 0) {
- ds = MSECS_PER_DAY - msecs - 1;
- jd -= ds / MSECS_PER_DAY;
- ds = ds % MSECS_PER_DAY;
- ds = MSECS_PER_DAY - ds - 1;
- } else {
- ds = msecs;
- }
-
- if (date)
- *date = QDate::fromJulianDay(jd);
- if (time)
- *time = QTime::fromMSecsSinceStartOfDay(ds);
+ return qMulOverflow(days, std::integral_constant<qint64, MSECS_PER_DAY>(), sumMillis)
+ || qAddOverflow(*sumMillis, millisInDay, sumMillis);
}
// Converts a date/time value into msecs
static qint64 timeToMSecs(QDate date, QTime time)
{
- return ((date.toJulianDay() - JULIAN_DAY_FOR_EPOCH) * MSECS_PER_DAY)
- + time.msecsSinceStartOfDay();
-}
-
-/*!
- \internal
- Determine the range of the system time_t functions.
-
- On MS-systems (where time_t is 64-bit by default), the start-point is the
- epoch, the end-point is the end of the year 3000 (for mktime(); for
- _localtime64_s it's 18 days later, but we ignore that here). Darwin's range
- runs from the beginning of 1900 to the end of its 64-bit time_t and Linux
- uses the full range of time_t (but this might still be 32-bit on some
- embedded systems).
-
- (One potential constraint might appear to be the range of struct tm's int
- tm_year, only allowing time_t to represent times from the start of year
- 1900+INT_MIN to the end of year INT_MAX. The 26-bit number of seconds in a
- year means that a 64-bit time_t can indeed represent times outside the range
- of 32-bit years, by a factor of 32 - but the range of representable
- milliseconds needs ten more bits than that of seconds, so can't reach the
- ends of the 32-bit year range.)
-
- Given the diversity of ranges, we conservatively estimate the actual
- supported range by experiment on the first call to millisInSystemRange() by
- exploration among the known candidates, converting the result to
- milliseconds and flagging whether each end is the qint64 range's bound (so
- millisInSystemRange will know not to try to pad beyond those bounds). The
- probed date-times are somewhat inside the range, but close enough to the
- relevant bound that we can be fairly sure the bound is reached, if the probe
- succeeds.
-*/
-static auto computeSystemMillisRange()
-{
- struct R { qint64 min, max; bool minClip, maxClip; };
- using Bounds = std::numeric_limits<qint64>;
- constexpr bool isNarrow = Bounds::max() / MSECS_PER_SEC > TIME_T_MAX;
- if constexpr (isNarrow) {
- const qint64 msecsMax = quint64(TIME_T_MAX) * MSECS_PER_SEC - 1 + MSECS_PER_SEC;
- const qint64 msecsMin = -1 - msecsMax; // TIME_T_MIN is -1 - TIME_T_MAX
- // If we reach back to msecsMin, use it; otherwise, assume 1970 cut-off (MS).
- struct tm local = {};
- local.tm_year = tmYearFromQYear(1901);
- local.tm_mon = 11;
- local.tm_mday = 15; // A day and a bit after the start of 32-bit time_t:
- local.tm_isdst = -1;
- return R{qMkTime(&local) == -1 ? 0 : msecsMin, msecsMax, false, false};
- } else {
- const struct { int year; qint64 millis; } starts[] = {
- { int(QDateTime::YearRange::First) + 1, Bounds::min() },
- // Beginning of the Common Era:
- { 1, -Q_INT64_C(62135596800000) },
- // Invention of the Gregorian calendar:
- { 1582, -Q_INT64_C(12244089600000) },
- // Its adoption by the anglophone world:
- { 1752, -Q_INT64_C(6879427200000) },
- // Before this, struct tm's tm_year is negative (Darwin):
- { 1900, -Q_INT64_C(2208988800000) },
- }, ends[] = {
- { int(QDateTime::YearRange::Last) - 1, Bounds::max() },
- // MS's end-of-range, end of year 3000:
- { 3000, Q_INT64_C(32535215999999) },
- };
- // Assume we do at least reach the end of 32-bit time_t:
- qint64 stop = quint64(TIME_T_MAX) * MSECS_PER_SEC - 1 + MSECS_PER_SEC;
- // Cleared if first pass round loop fails:
- bool stopMax = true;
- for (const auto c : ends) {
- struct tm local = {};
- local.tm_year = tmYearFromQYear(c.year);
- local.tm_mon = 11;
- local.tm_mday = 31;
- local.tm_hour = 23;
- local.tm_min = local.tm_sec = 59;
- local.tm_isdst = -1;
- if (qMkTime(&local) != -1) {
- stop = c.millis;
- break;
- }
- stopMax = false;
- }
- bool startMin = true;
- for (const auto c : starts) {
- struct tm local {};
- local.tm_year = tmYearFromQYear(c.year);
- local.tm_mon = 1;
- local.tm_mday = 1;
- local.tm_isdst = -1;
- if (qMkTime(&local) != -1)
- return R{c.millis, stop, startMin, stopMax};
- startMin = false;
- }
- return R{0, stop, false, stopMax};
+ qint64 days = date.toJulianDay() - JULIAN_DAY_FOR_EPOCH;
+ qint64 msecs, dayms = time.msecsSinceStartOfDay();
+ if (days < 0 && dayms > 0) {
+ ++days;
+ dayms -= MSECS_PER_DAY;
}
+ if (daysAndMillisOverflow(days, dayms, &msecs)) {
+ using Bound = std::numeric_limits<qint64>;
+ return days < 0 ? Bound::min() : Bound::max();
+ }
+ return msecs;
}
/*!
@@ -2804,7 +2766,7 @@ static auto computeSystemMillisRange()
*/
static inline bool millisInSystemRange(qint64 millis, qint64 slack = 0)
{
- static const auto bounds = computeSystemMillisRange();
+ static const auto bounds = QLocalTime::computeSystemMillisRange();
return (bounds.minClip || millis >= bounds.min - slack)
&& (bounds.maxClip || millis <= bounds.max + slack);
}
@@ -2831,7 +2793,7 @@ static int systemTimeYearMatching(int year)
static constexpr int forLeapEarly[] = { 1984, 1996, 1980, 1992, 1976, 1988, 1972 };
static constexpr int regularEarly[] = { 1978, 1973, 1974, 1975, 1970, 1971, 1977 };
#else // First year fully in 32-bit time_t range is 1902
- static constexpr int forLeapEarly[] = { 1928, 1912, 1924, 1908, 1916, 1904, 1920 };
+ static constexpr int forLeapEarly[] = { 1928, 1912, 1924, 1908, 1920, 1904, 1916 };
static constexpr int regularEarly[] = { 1905, 1906, 1907, 1902, 1903, 1909, 1910 };
#endif
static constexpr int forLeapLate[] = { 2012, 2024, 2036, 2020, 2032, 2016, 2028 };
@@ -2846,71 +2808,165 @@ static int systemTimeYearMatching(int year)
return res;
}
-// Convert an MSecs Since Epoch into Local Time
-bool QDateTimePrivate::epochMSecsToLocalTime(qint64 msecs, QDate *localDate, QTime *localTime,
- DaylightStatus *daylightStatus)
+// Sets up d and status to represent local time at the given UTC msecs since epoch:
+QDateTimePrivate::ZoneState QDateTimePrivate::expressUtcAsLocal(qint64 utcMSecs)
{
- if (!millisInSystemRange(msecs)) {
- // Docs state any LocalTime after 2038-01-18 *will* have any DST applied.
- // When this falls outside the supported range, we need to fake it.
-#if QT_CONFIG(timezone)
- // Use the system time-zone.
- const auto sys = QTimeZone::systemTimeZone();
- if (sys.isValid()) {
- if (daylightStatus) {
- *daylightStatus = sys.d->isDaylightTime(msecs)
- ? QDateTimePrivate::DaylightTime
- : QDateTimePrivate::StandardTime;
- }
- if (add_overflow(msecs, sys.d->offsetFromUtc(msecs) * MSECS_PER_SEC, &msecs))
- return false;
- msecsToTime(msecs, localDate, localTime);
- return true;
- }
+ ZoneState result{utcMSecs};
+ // Within the time_t supported range, localtime() can handle it:
+ if (millisInSystemRange(utcMSecs)) {
+ result = QLocalTime::utcToLocal(utcMSecs);
+ if (result.valid)
+ return result;
+ }
+
+ // Docs state any LocalTime after 2038-01-18 *will* have any DST applied.
+ // When this falls outside the supported range, we need to fake it.
+#if QT_CONFIG(timezone) // Use the system time-zone.
+ if (const auto sys = QTimeZone::systemTimeZone(); sys.isValid()) {
+ result.offset = sys.d->offsetFromUtc(utcMSecs);
+ if (qAddOverflow(utcMSecs, result.offset * MSECS_PER_SEC, &result.when))
+ return result;
+ result.dst = sys.d->isDaylightTime(utcMSecs) ? DaylightTime : StandardTime;
+ result.valid = true;
+ return result;
+ }
#endif // timezone
- // Kludge
- // Use existing method to fake the conversion.
- QDate utcDate;
- QTime utcTime;
- msecsToTime(msecs, &utcDate, &utcTime);
- int year, month, day;
- utcDate.getDate(&year, &month, &day);
-
- QDate fakeDate(systemTimeYearMatching(year), month, day);
- qint64 fakeMsecs = QDateTime(fakeDate, utcTime, Qt::UTC).toMSecsSinceEpoch();
- bool res = qt_localtime(fakeMsecs, localDate, localTime, daylightStatus);
- *localDate = localDate->addDays(fakeDate.daysTo(utcDate));
- return res;
+
+ // Kludge
+ // Do the conversion in a year with the same days of the week, so DST
+ // dates might be right, and adjust by the number of days that was off:
+ const qint64 jd = msecsToJulianDay(utcMSecs);
+ const auto ymd = QGregorianCalendar::partsFromJulian(jd);
+ qint64 diffMillis, fakeUtc;
+ const auto fakeJd = QGregorianCalendar::julianFromParts(systemTimeYearMatching(ymd.year),
+ ymd.month, ymd.day);
+ if (Q_UNLIKELY(!fakeJd
+ || qMulOverflow(jd - *fakeJd, std::integral_constant<qint64, MSECS_PER_DAY>(),
+ &diffMillis)
+ || qSubOverflow(utcMSecs, diffMillis, &fakeUtc))) {
+ return result;
}
- // Falls inside time_t supported range so localtime can handle it:
- return qt_localtime(msecs, localDate, localTime, daylightStatus);
-}
-
-// Convert a LocalTime expressed in local msecs encoding and the corresponding
-// DST status into a UTC epoch msecs. Optionally populate the returned
-// values from mktime for the adjusted local date and time.
-qint64 QDateTimePrivate::localMSecsToEpochMSecs(qint64 localMsecs,
- DaylightStatus *daylightStatus,
- QDate *localDate, QTime *localTime,
- QString *abbreviation)
-{
- // First, if localMsecs is within +/- 1 day of viable range, try mktime() in
- // case it does fall in the range and gets proper DST conversion:
- if (millisInSystemRange(localMsecs, MSECS_PER_DAY)) {
- bool valid;
- QDate dt;
- QTime tm;
- msecsToTime(localMsecs, &dt, &tm);
- const qint64 utcMsecs = qt_mktime(&dt, &tm, daylightStatus, abbreviation, &valid);
- if (valid && millisInSystemRange(utcMsecs)) {
- // mktime worked and falls in valid range, so use it
- if (localDate)
- *localDate = dt;
- if (localTime)
- *localTime = tm;
- return utcMsecs;
- }
+ result = QLocalTime::utcToLocal(fakeUtc);
+ // Now correct result.when for the use of the fake date:
+ if (!result.valid || qAddOverflow(result.when, diffMillis, &result.when)) {
+ // If utcToLocal() failed, its return has the fake when; restore utcMSecs.
+ // Fail on overflow, but preserve offset and DST-ness.
+ result.when = utcMSecs;
+ result.valid = false;
+ }
+ return result;
+}
+
+static auto millisToWithinRange(qint64 millis)
+{
+ struct R {
+ qint64 shifted = 0;
+ bool good = false;
+ } result;
+ qint64 jd = msecsToJulianDay(millis);
+ auto ymd = QGregorianCalendar::partsFromJulian(jd);
+ const auto fakeJd = QGregorianCalendar::julianFromParts(systemTimeYearMatching(ymd.year),
+ ymd.month, ymd.day);
+ result.good = fakeJd && !daysAndMillisOverflow(*fakeJd - jd, millis, &result.shifted);
+ return result;
+}
+
+/*!
+ \internal
+ \enum QDateTimePrivate::TransitionOption
+
+ This enumeration is used to resolve datetime combinations which fall in \l
+ {Timezone transitions}. The transition is described as a "gap" if there are
+ time representations skipped over by the zone, as is common in the "spring
+ forward" transitions in many zones on entering daylight-saving time. The
+ transition is described as a "fold" if there are time representations
+ repeated in the zone, as in a "fall back" transition out of daylight-saving
+ time.
+
+ When the options specified do not determine a resolution for a datetime, it
+ is marked invalid.
+
+ The prepared option sets above are in fact composed from low-level atomic
+ options. For each of gap and fold you can chose between two candidate times,
+ one before or after the transition, based on the time requested; or you can
+ pick the moment of transition, or the start or end of the transition
+ interval. For a gap, the start and end of the interval are the moment of the
+ transition, but for a repeated interval the start of the first pass is the
+ start of the transition interval, the end of the second pass is the end of
+ the transition interval and the moment of the transition itself is both the
+ end of the first pass and the start of the second.
+
+ \value GapUseBefore For a time in a gap, use a time before the transition,
+ as if stepping back from a later time.
+ \value GapUseAfter For a time in a gap, use a time after the transition, as
+ if stepping forward from an earlier time.
+ \value FoldUseBefore For a repeated time, use the first candidate, which is
+ before the transition.
+ \value FoldUseAfter For a repeated time, use the second candidate, which is
+ after the transition.
+ \value FlipForReverseDst For "reversed" DST, this reverses the preceding
+ four options (see below).
+
+ The last has no effect unless the "daylight-saving" time side of the
+ transition is known to have a lower offset from UTC than the standard time
+ side. (This is the "reversed" DST case of \l {Timezone transitions}.) In
+ that case, if other options would select a time after the transition, a time
+ before is used instead, and vice versa. This effectively turns a preference
+ for the side with lower offset into a preference for the side that is
+ officially standard time, even if it has higher offset; and conversely a
+ preference for higher offset into a preference for daylight-saving time,
+ even if it has a lower offset. This option has no effect on a resolution
+ that selects the moment of transition or the start or end of the transition
+ interval.
+
+ The result of combining more than one of the \c GapUse* options is
+ undefined; likewise for the \c FoldUse*. Each of QDateTime's
+ TransitionResolution values, aside from Reject, maps to a combination that
+ incorporates one from each of these sets.
+*/
+
+constexpr static QDateTimePrivate::TransitionOptions
+toTransitionOptions(QDateTime::TransitionResolution res)
+{
+ switch (res) {
+ case QDateTime::TransitionResolution::RelativeToBefore:
+ return QDateTimePrivate::GapUseAfter | QDateTimePrivate::FoldUseBefore;
+ case QDateTime::TransitionResolution::RelativeToAfter:
+ return QDateTimePrivate::GapUseBefore | QDateTimePrivate::FoldUseAfter;
+ case QDateTime::TransitionResolution::PreferBefore:
+ return QDateTimePrivate::GapUseBefore | QDateTimePrivate::FoldUseBefore;
+ case QDateTime::TransitionResolution::PreferAfter:
+ return QDateTimePrivate::GapUseAfter | QDateTimePrivate::FoldUseAfter;
+ case QDateTime::TransitionResolution::PreferStandard:
+ return QDateTimePrivate::GapUseBefore
+ | QDateTimePrivate::FoldUseAfter
+ | QDateTimePrivate::FlipForReverseDst;
+ case QDateTime::TransitionResolution::PreferDaylightSaving:
+ return QDateTimePrivate::GapUseAfter
+ | QDateTimePrivate::FoldUseBefore
+ | QDateTimePrivate::FlipForReverseDst;
+ case QDateTime::TransitionResolution::Reject: break;
+ }
+ return {};
+}
+
+constexpr static QDateTimePrivate::TransitionOptions
+toTransitionOptions(QDateTimePrivate::DaylightStatus dst)
+{
+ return toTransitionOptions(dst == QDateTimePrivate::DaylightTime
+ ? QDateTime::TransitionResolution::PreferDaylightSaving
+ : QDateTime::TransitionResolution::PreferStandard);
+}
+
+QString QDateTimePrivate::localNameAtMillis(qint64 millis, DaylightStatus dst)
+{
+ const QDateTimePrivate::TransitionOptions resolve = toTransitionOptions(dst);
+ QString abbreviation;
+ if (millisInSystemRange(millis, MSECS_PER_DAY)) {
+ abbreviation = QLocalTime::localTimeAbbbreviationAt(millis, resolve);
+ if (!abbreviation.isEmpty())
+ return abbreviation;
}
// Otherwise, outside the system range.
@@ -2918,30 +2974,86 @@ qint64 QDateTimePrivate::localMSecsToEpochMSecs(qint64 localMsecs,
// Use the system zone:
const auto sys = QTimeZone::systemTimeZone();
if (sys.isValid()) {
- return QDateTimePrivate::zoneMSecsToEpochMSecs(localMsecs, sys, daylightStatus,
- localDate, localTime, abbreviation);
+ ZoneState state = zoneStateAtMillis(sys, millis, resolve);
+ if (state.valid)
+ return sys.d->abbreviation(state.when - state.offset * MSECS_PER_SEC);
}
#endif // timezone
+
// Kludge
- // Use existing method to fake the conversion.
- QDate dt;
- QTime tm;
- msecsToTime(localMsecs, &dt, &tm);
- int year, month, day;
- dt.getDate(&year, &month, &day);
- bool ok;
- QDate fakeDate(systemTimeYearMatching(year), month, day);
- const qint64 fakeDiff = fakeDate.daysTo(dt);
- const qint64 utcMsecs = qt_mktime(&fakeDate, &tm, daylightStatus, abbreviation, &ok);
- Q_ASSERT(ok);
- if (localDate)
- *localDate = fakeDate.addDays(fakeDiff);
- if (localTime)
- *localTime = tm;
- QDate utcDate;
- QTime utcTime;
- msecsToTime(utcMsecs, &utcDate, &utcTime);
- return timeToMSecs(utcDate.addDays(fakeDiff), utcTime);
+ // Use a time in the system range with the same day-of-week pattern to its year:
+ auto fake = millisToWithinRange(millis);
+ if (Q_LIKELY(fake.good))
+ return QLocalTime::localTimeAbbbreviationAt(fake.shifted, resolve);
+
+ // Overflow, apparently.
+ return {};
+}
+
+// Determine the offset from UTC at the given local time as millis.
+QDateTimePrivate::ZoneState QDateTimePrivate::localStateAtMillis(
+ qint64 millis, QDateTimePrivate::TransitionOptions resolve)
+{
+ // First, if millis is within a day of the viable range, try mktime() in
+ // case it does fall in the range and gets useful information:
+ if (millisInSystemRange(millis, MSECS_PER_DAY)) {
+ auto result = QLocalTime::mapLocalTime(millis, resolve);
+ if (result.valid)
+ return result;
+ }
+
+ // Otherwise, outside the system range.
+#if QT_CONFIG(timezone)
+ // Use the system zone:
+ const auto sys = QTimeZone::systemTimeZone();
+ if (sys.isValid())
+ return zoneStateAtMillis(sys, millis, resolve);
+#endif // timezone
+
+ // Kludge
+ // Use a time in the system range with the same day-of-week pattern to its year:
+ auto fake = millisToWithinRange(millis);
+ if (Q_LIKELY(fake.good)) {
+ auto result = QLocalTime::mapLocalTime(fake.shifted, resolve);
+ if (result.valid) {
+ qint64 adjusted;
+ if (Q_UNLIKELY(qAddOverflow(result.when, millis - fake.shifted, &adjusted))) {
+ using Bound = std::numeric_limits<qint64>;
+ adjusted = millis < fake.shifted ? Bound::min() : Bound::max();
+ }
+ result.when = adjusted;
+ } else {
+ result.when = millis;
+ }
+ return result;
+ }
+ // Overflow, apparently.
+ return {millis};
+}
+
+#if QT_CONFIG(timezone)
+// For a TimeZone and a time expressed in zone msecs encoding, compute the
+// actual DST-ness and offset, adjusting the time if needed to escape a
+// spring-forward.
+QDateTimePrivate::ZoneState QDateTimePrivate::zoneStateAtMillis(
+ const QTimeZone &zone, qint64 millis, QDateTimePrivate::TransitionOptions resolve)
+{
+ Q_ASSERT(zone.isValid());
+ Q_ASSERT(zone.timeSpec() == Qt::TimeZone);
+ return zone.d->stateAtZoneTime(millis, resolve);
+}
+#endif // timezone
+
+static inline QDateTimePrivate::ZoneState stateAtMillis(const QTimeZone &zone, qint64 millis,
+ QDateTimePrivate::TransitionOptions resolve)
+{
+ if (zone.timeSpec() == Qt::LocalTime)
+ return QDateTimePrivate::localStateAtMillis(millis, resolve);
+#if QT_CONFIG(timezone)
+ if (zone.timeSpec() == Qt::TimeZone && zone.isValid())
+ return QDateTimePrivate::zoneStateAtMillis(zone, millis, resolve);
+#endif
+ return {millis};
}
static inline bool specCanBeSmall(Qt::TimeSpec spec)
@@ -2951,7 +3063,7 @@ static inline bool specCanBeSmall(Qt::TimeSpec spec)
static inline bool msecsCanBeSmall(qint64 msecs)
{
- if (!QDateTimeData::CanBeSmall)
+ if constexpr (!QDateTimeData::CanBeSmall)
return false;
ShortData sd;
@@ -2989,9 +3101,9 @@ mergeDaylightStatus(QDateTimePrivate::StatusFlags sf, QDateTimePrivate::Daylight
static constexpr inline
QDateTimePrivate::DaylightStatus extractDaylightStatus(QDateTimePrivate::StatusFlags status)
{
- if (status & QDateTimePrivate::SetToDaylightTime)
+ if (status.testFlag(QDateTimePrivate::SetToDaylightTime))
return QDateTimePrivate::DaylightTime;
- if (status & QDateTimePrivate::SetToStandardTime)
+ if (status.testFlag(QDateTimePrivate::SetToStandardTime))
return QDateTimePrivate::StandardTime;
return QDateTimePrivate::UnknownDaylightTime;
}
@@ -3048,56 +3160,62 @@ static inline bool usesSameOffset(const QDateTimeData &a, const QDateTimeData &b
Q_ASSERT(!a.isShort() && !b.isShort());
return a->m_offsetFromUtc == b->m_offsetFromUtc;
}
- Q_UNREACHABLE();
- return false;
+ Q_UNREACHABLE_RETURN(false);
}
// Refresh the LocalTime or TimeZone validity and offset
-static void refreshZonedDateTime(QDateTimeData &d, Qt::TimeSpec spec)
+static void refreshZonedDateTime(QDateTimeData &d, const QTimeZone &zone,
+ QDateTimePrivate::TransitionOptions resolve)
{
- Q_ASSERT(spec == Qt::TimeZone || spec == Qt::LocalTime);
+ Q_ASSERT(zone.timeSpec() == Qt::TimeZone || zone.timeSpec() == Qt::LocalTime);
auto status = getStatus(d);
- Q_ASSERT(extractSpec(status) == spec);
+ Q_ASSERT(extractSpec(status) == zone.timeSpec());
int offsetFromUtc = 0;
+ /* Callers are:
+ * QDTP::create(), where d is too new to be shared yet
+ * reviseTimeZone(), which detach()es if not short before calling this
+ * checkValidDateTime(), always follows a setDateTime() that detach()ed if not short
+
+ So we can assume d is not shared. We only need to detach() if we convert
+ from short to pimpled to accommodate an oversize msecs, which can only be
+ needed in the unlikely event we revise it.
+ */
// If not valid date and time then is invalid
- if (!(status & QDateTimePrivate::ValidDate) || !(status & QDateTimePrivate::ValidTime)) {
- status &= ~QDateTimePrivate::ValidDateTime;
+ if (!status.testFlags(QDateTimePrivate::ValidDate | QDateTimePrivate::ValidTime)) {
+ status.setFlag(QDateTimePrivate::ValidDateTime, false);
} else {
- // We have a valid date and time and a Qt::LocalTime or Qt::TimeZone that needs calculating
- // LocalTime and TimeZone might fall into a "missing" DST transition hour
- // Calling toEpochMSecs will adjust the returned date/time if it does
- const qint64 msecs = getMSecs(d);
- qint64 epochMSecs = 0;
- QDate testDate;
- QTime testTime;
- auto dstStatus = extractDaylightStatus(status);
- if (spec == Qt::LocalTime) {
- epochMSecs =
- QDateTimePrivate::localMSecsToEpochMSecs(msecs, &dstStatus, &testDate, &testTime);
-#if QT_CONFIG(timezone)
- // else spec == Qt::TimeZone, so check zone is valid:
- } else if (d->m_timeZone.isValid()) {
- epochMSecs = QDateTimePrivate::zoneMSecsToEpochMSecs(
- msecs, d->m_timeZone, &dstStatus, &testDate, &testTime);
-#endif // timezone
- } // else: testDate, testTime haven't been set, so are invalid.
- const bool ok = testDate.isValid() && testTime.isValid();
- // Cache the offset to use in offsetFromUtc() &c., even if the next
- // check marks invalid; this lets fromMSecsSinceEpoch() give a useful
- // fallback for times in spring-forward gaps.
- if (ok)
- offsetFromUtc = (msecs - epochMSecs) / MSECS_PER_SEC;
- Q_ASSERT(offsetFromUtc >= -SECS_PER_DAY && offsetFromUtc <= SECS_PER_DAY);
- if (ok && timeToMSecs(testDate, testTime) == msecs) {
- status = mergeDaylightStatus(status, dstStatus);
- status |= QDateTimePrivate::ValidDateTime;
+ // We have a valid date and time and a Qt::LocalTime or Qt::TimeZone
+ // that might fall into a "missing" DST transition hour.
+ qint64 msecs = getMSecs(d);
+ QDateTimePrivate::ZoneState state = stateAtMillis(zone, msecs, resolve);
+ Q_ASSERT(!state.valid || (state.offset >= -SECS_PER_DAY && state.offset <= SECS_PER_DAY));
+ if (state.dst == QDateTimePrivate::UnknownDaylightTime) { // Overflow
+ status.setFlag(QDateTimePrivate::ValidDateTime, false);
+ } else if (state.valid) {
+ status = mergeDaylightStatus(status, state.dst);
+ offsetFromUtc = state.offset;
+ status.setFlag(QDateTimePrivate::ValidDateTime, true);
+ if (Q_UNLIKELY(msecs != state.when)) {
+ // Update msecs to the resolution:
+ if (status.testFlag(QDateTimePrivate::ShortData)) {
+ if (msecsCanBeSmall(state.when)) {
+ d.data.msecs = qintptr(state.when);
+ } else {
+ // Convert to long-form so we can hold the revised msecs:
+ status.setFlag(QDateTimePrivate::ShortData, false);
+ d.detach();
+ }
+ }
+ if (!status.testFlag(QDateTimePrivate::ShortData))
+ d->m_msecs = state.when;
+ }
} else {
- status &= ~QDateTimePrivate::ValidDateTime;
+ status.setFlag(QDateTimePrivate::ValidDateTime, false);
}
}
- if (status & QDateTimePrivate::ShortData) {
+ if (status.testFlag(QDateTimePrivate::ShortData)) {
d.data.status = status.toInt();
} else {
d->m_status = status;
@@ -3109,23 +3227,20 @@ static void refreshZonedDateTime(QDateTimeData &d, Qt::TimeSpec spec)
static void refreshSimpleDateTime(QDateTimeData &d)
{
auto status = getStatus(d);
- Q_ASSERT(extractSpec(status) == Qt::UTC || extractSpec(status) == Qt::OffsetFromUTC);
- if ((status & QDateTimePrivate::ValidDate) && (status & QDateTimePrivate::ValidTime))
- status |= QDateTimePrivate::ValidDateTime;
- else
- status &= ~QDateTimePrivate::ValidDateTime;
+ Q_ASSERT(QTimeZone::isUtcOrFixedOffset(extractSpec(status)));
+ status.setFlag(QDateTimePrivate::ValidDateTime,
+ status.testFlags(QDateTimePrivate::ValidDate | QDateTimePrivate::ValidTime));
- if (status & QDateTimePrivate::ShortData)
+ if (status.testFlag(QDateTimePrivate::ShortData))
d.data.status = status.toInt();
else
d->m_status = status;
}
// Clean up and set status after assorted set-up or reworking:
-static void checkValidDateTime(QDateTimeData &d)
+static void checkValidDateTime(QDateTimeData &d, QDateTime::TransitionResolution resolve)
{
- auto status = getStatus(d);
- auto spec = extractSpec(status);
+ auto spec = extractSpec(getStatus(d));
switch (spec) {
case Qt::OffsetFromUTC:
case Qt::UTC:
@@ -3134,54 +3249,61 @@ static void checkValidDateTime(QDateTimeData &d)
break;
case Qt::TimeZone:
case Qt::LocalTime:
- // for these, we need to check whether the timezone is valid and whether
- // the time is valid in that timezone. Expensive, but no other option.
- refreshZonedDateTime(d, spec);
+ // For these, we need to check whether (the zone is valid and) the time
+ // is valid for the zone. Expensive, but we have no other option.
+ refreshZonedDateTime(d, d.timeZone(), toTransitionOptions(resolve));
break;
}
}
-// Caller needs to refresh after calling this
-static void setTimeSpec(QDateTimeData &d, Qt::TimeSpec spec, int offsetSeconds)
+static void reviseTimeZone(QDateTimeData &d, const QTimeZone &zone,
+ QDateTime::TransitionResolution resolve)
{
- auto status = getStatus(d);
- status &= ~(QDateTimePrivate::ValidDateTime | QDateTimePrivate::DaylightMask |
- QDateTimePrivate::TimeSpecMask);
+ Qt::TimeSpec spec = zone.timeSpec();
+ auto status = mergeSpec(getStatus(d), spec);
+ bool reuse = d.isShort();
+ int offset = 0;
switch (spec) {
+ case Qt::UTC:
+ Q_ASSERT(zone.fixedSecondsAheadOfUtc() == 0);
+ break;
case Qt::OffsetFromUTC:
- if (offsetSeconds == 0)
- spec = Qt::UTC;
+ reuse = false;
+ offset = zone.fixedSecondsAheadOfUtc();
+ Q_ASSERT(offset);
break;
case Qt::TimeZone:
- qWarning("Using TimeZone in setTimeSpec() is unsupported"); // Use system time zone instead
- spec = Qt::LocalTime;
- Q_FALLTHROUGH();
- case Qt::UTC:
+ reuse = false;
+ break;
case Qt::LocalTime:
- offsetSeconds = 0;
break;
}
- status = mergeSpec(status, spec);
- if (d.isShort() && offsetSeconds == 0) {
+ status &= ~(QDateTimePrivate::ValidDateTime | QDateTimePrivate::DaylightMask);
+ if (reuse) {
d.data.status = status.toInt();
} else {
d.detach();
d->m_status = status & ~QDateTimePrivate::ShortData;
- d->m_offsetFromUtc = offsetSeconds;
+ d->m_offsetFromUtc = offset;
#if QT_CONFIG(timezone)
- d->m_timeZone = QTimeZone();
+ if (spec == Qt::TimeZone)
+ d->m_timeZone = zone;
#endif // timezone
}
+
+ if (QTimeZone::isUtcOrFixedOffset(spec))
+ refreshSimpleDateTime(d);
+ else
+ refreshZonedDateTime(d, zone, toTransitionOptions(resolve));
}
static void setDateTime(QDateTimeData &d, QDate date, QTime time)
{
// If the date is valid and the time is not we set time to 00:00:00
- QTime useTime = time;
- if (!useTime.isValid() && date.isValid())
- useTime = QTime::fromMSecsSinceStartOfDay(0);
+ if (!time.isValid() && date.isValid())
+ time = QTime::fromMSecsSinceStartOfDay(0);
QDateTimePrivate::StatusFlags newStatus = { };
@@ -3194,8 +3316,8 @@ static void setDateTime(QDateTimeData &d, QDate date, QTime time)
// Set time value and status
int ds = 0;
- if (useTime.isValid()) {
- ds = useTime.msecsSinceStartOfDay();
+ if (time.isValid()) {
+ ds = time.msecsSinceStartOfDay();
newStatus |= QDateTimePrivate::ValidTime;
}
Q_ASSERT(ds < MSECS_PER_DAY);
@@ -3208,8 +3330,7 @@ static void setDateTime(QDateTimeData &d, QDate date, QTime time)
// Check in representable range:
qint64 msecs = 0;
- if (mul_overflow(days, std::integral_constant<qint64, MSECS_PER_DAY>(), &msecs)
- || add_overflow(msecs, qint64(ds), &msecs)) {
+ if (daysAndMillisOverflow(days, qint64(ds), &msecs)) {
newStatus = QDateTimePrivate::StatusFlags{};
msecs = 0;
}
@@ -3233,20 +3354,17 @@ static void setDateTime(QDateTimeData &d, QDate date, QTime time)
}
}
-static QPair<QDate, QTime> getDateTime(const QDateTimeData &d)
+static std::pair<QDate, QTime> getDateTime(const QDateTimeData &d)
{
- QPair<QDate, QTime> result;
- qint64 msecs = getMSecs(d);
auto status = getStatus(d);
- msecsToTime(msecs, &result.first, &result.second);
-
- if (!status.testFlag(QDateTimePrivate::ValidDate))
- result.first = QDate();
-
- if (!status.testFlag(QDateTimePrivate::ValidTime))
- result.second = QTime();
-
- return result;
+ const qint64 msecs = getMSecs(d);
+ const auto dayMilli = QRoundingDown::qDivMod<MSECS_PER_DAY>(msecs);
+ return { status.testFlag(QDateTimePrivate::ValidDate)
+ ? QDate::fromJulianDay(JULIAN_DAY_FOR_EPOCH + dayMilli.quotient)
+ : QDate(),
+ status.testFlag(QDateTimePrivate::ValidTime)
+ ? QTime::fromMSecsSinceStartOfDay(dayMilli.remainder)
+ : QTime() };
}
/*****************************************************************************
@@ -3262,20 +3380,28 @@ inline QDateTime::Data::Data() noexcept
d = reinterpret_cast<QDateTimePrivate *>(value);
}
-inline QDateTime::Data::Data(Qt::TimeSpec spec)
+inline QDateTime::Data::Data(const QTimeZone &zone)
{
+ Qt::TimeSpec spec = zone.timeSpec();
if (CanBeSmall && Q_LIKELY(specCanBeSmall(spec))) {
- d = reinterpret_cast<QDateTimePrivate *>(quintptr(mergeSpec(QDateTimePrivate::ShortData, spec).toInt()));
+ quintptr value = mergeSpec(QDateTimePrivate::ShortData, spec).toInt();
+ d = reinterpret_cast<QDateTimePrivate *>(value);
+ Q_ASSERT(isShort());
} else {
// the structure is too small, we need to detach
d = new QDateTimePrivate;
d->ref.ref();
d->m_status = mergeSpec({}, spec);
+ if (spec == Qt::OffsetFromUTC)
+ d->m_offsetFromUtc = zone.fixedSecondsAheadOfUtc();
+ else if (spec == Qt::TimeZone)
+ d->m_timeZone = zone;
+ Q_ASSERT(!isShort());
}
}
-inline QDateTime::Data::Data(const Data &other)
- : d(other.d)
+inline QDateTime::Data::Data(const Data &other) noexcept
+ : data(other.data)
{
if (!isShort()) {
// check if we could shrink
@@ -3291,18 +3417,18 @@ inline QDateTime::Data::Data(const Data &other)
}
}
-inline QDateTime::Data::Data(Data &&other)
- : d(other.d)
+inline QDateTime::Data::Data(Data &&other) noexcept
+ : data(other.data)
{
// reset the other to a short state
Data dummy;
Q_ASSERT(dummy.isShort());
- other.d = dummy.d;
+ other.data = dummy.data;
}
-inline QDateTime::Data &QDateTime::Data::operator=(const Data &other)
+inline QDateTime::Data &QDateTime::Data::operator=(const Data &other) noexcept
{
- if (d == other.d)
+ if (isShort() ? data == other.data : d == other.d)
return *this;
auto x = d;
@@ -3336,11 +3462,11 @@ inline bool QDateTime::Data::isShort() const
bool b = quintptr(d) & QDateTimePrivate::ShortData;
// sanity check:
- Q_ASSERT(b || (d->m_status & QDateTimePrivate::ShortData) == 0);
+ Q_ASSERT(b || !d->m_status.testFlag(QDateTimePrivate::ShortData));
// even if CanBeSmall = false, we have short data for a default-constructed
// QDateTime object. But it's unlikely.
- if (CanBeSmall)
+ if constexpr (CanBeSmall)
return Q_LIKELY(b);
return Q_UNLIKELY(b);
}
@@ -3367,6 +3493,35 @@ inline void QDateTime::Data::detach()
d = x;
}
+void QDateTime::Data::invalidate()
+{
+ if (isShort()) {
+ data.status &= ~int(QDateTimePrivate::ValidityMask);
+ } else {
+ detach();
+ d->m_status &= ~QDateTimePrivate::ValidityMask;
+ }
+}
+
+QTimeZone QDateTime::Data::timeZone() const
+{
+ switch (getSpec(*this)) {
+ case Qt::UTC:
+ return QTimeZone::UTC;
+ case Qt::OffsetFromUTC:
+ return QTimeZone::fromSecondsAheadOfUtc(d->m_offsetFromUtc);
+ case Qt::TimeZone:
+#if QT_CONFIG(timezone)
+ if (d->m_timeZone.isValid())
+ return d->m_timeZone;
+#endif
+ break;
+ case Qt::LocalTime:
+ return QTimeZone::LocalTime;
+ }
+ return QTimeZone();
+}
+
inline const QDateTimePrivate *QDateTime::Data::operator->() const
{
Q_ASSERT(!isShort());
@@ -3386,69 +3541,18 @@ inline QDateTimePrivate *QDateTime::Data::operator->()
*****************************************************************************/
Q_NEVER_INLINE
-QDateTime::Data QDateTimePrivate::create(QDate toDate, QTime toTime, Qt::TimeSpec toSpec,
- int offsetSeconds)
+QDateTime::Data QDateTimePrivate::create(QDate toDate, QTime toTime, const QTimeZone &zone,
+ QDateTime::TransitionResolution resolve)
{
- QDateTime::Data result(toSpec);
- setTimeSpec(result, toSpec, offsetSeconds);
+ QDateTime::Data result(zone);
setDateTime(result, toDate, toTime);
- if (toSpec == Qt::OffsetFromUTC || toSpec == Qt::UTC)
+ if (zone.isUtcOrFixedOffset())
refreshSimpleDateTime(result);
else
- refreshZonedDateTime(result, Qt::LocalTime);
- return result;
-}
-
-#if QT_CONFIG(timezone)
-inline QDateTime::Data QDateTimePrivate::create(QDate toDate, QTime toTime,
- const QTimeZone &toTimeZone)
-{
- QDateTime::Data result(Qt::TimeZone);
- Q_ASSERT(!result.isShort());
-
- result.d->m_status = mergeSpec(result.d->m_status, Qt::TimeZone);
- result.d->m_timeZone = toTimeZone;
- setDateTime(result, toDate, toTime);
- refreshZonedDateTime(result, Qt::TimeZone);
+ refreshZonedDateTime(result, zone, toTransitionOptions(resolve));
return result;
}
-// Convert a TimeZone time expressed in zone msecs encoding into a UTC epoch msecs
-// DST transitions are disambiguated by hint.
-inline qint64 QDateTimePrivate::zoneMSecsToEpochMSecs(qint64 zoneMSecs, const QTimeZone &zone,
- DaylightStatus *hint,
- QDate *zoneDate, QTime *zoneTime,
- QString *abbreviation)
-{
- Q_ASSERT(zone.isValid());
- // Get the effective data from QTimeZone
- DaylightStatus dst = hint ? *hint : UnknownDaylightTime;
- QTimeZonePrivate::Data data = zone.d->dataForLocalTime(zoneMSecs, int(dst));
- if (data.offsetFromUtc == QTimeZonePrivate::invalidSeconds()) {
- if (hint)
- *hint = QDateTimePrivate::UnknownDaylightTime;
- if (abbreviation)
- *abbreviation = QString();
- if (zoneDate)
- *zoneDate = QDate();
- if (zoneTime)
- *zoneTime = QTime();
- } else {
- Q_ASSERT(zone.d->offsetFromUtc(data.atMSecsSinceEpoch) == data.offsetFromUtc);
- msecsToTime(data.atMSecsSinceEpoch + data.offsetFromUtc * MSECS_PER_SEC,
- zoneDate, zoneTime);
- if (hint) {
- *hint = data.daylightTimeOffset
- ? QDateTimePrivate::DaylightTime
- : QDateTimePrivate::StandardTime;
- }
- if (abbreviation)
- *abbreviation = data.abbreviation;
- }
- return data.atMSecsSinceEpoch;
-}
-#endif // timezone
-
/*****************************************************************************
QDateTime member functions
*****************************************************************************/
@@ -3460,37 +3564,42 @@ inline qint64 QDateTimePrivate::zoneMSecsToEpochMSecs(qint64 zoneMSecs, const QT
\reentrant
\brief The QDateTime class provides date and time functions.
+ \compares weak
- A QDateTime object encodes a calendar date and a clock time (a
- "datetime"). It combines features of the QDate and QTime classes.
- It can read the current datetime from the system clock. It
- provides functions for comparing datetimes and for manipulating a
+ A QDateTime object encodes a calendar date and a clock time (a "datetime")
+ in accordance with a time representation. It combines features of the QDate
+ and QTime classes. It can read the current datetime from the system
+ clock. It provides functions for comparing datetimes and for manipulating a
datetime by adding a number of seconds, days, months, or years.
QDateTime can describe datetimes with respect to \l{Qt::LocalTime}{local
time}, to \l{Qt::UTC}{UTC}, to a specified \l{Qt::OffsetFromUTC}{offset from
- UTC} or to a specified \l{Qt::TimeZone}{time zone}, in conjunction with the
- QTimeZone class. For example, a time zone of "Europe/Berlin" will apply the
- daylight-saving rules as used in Germany. In contrast, an offset from UTC of
- +3600 seconds is one hour ahead of UTC (usually written in ISO standard
- notation as "UTC+01:00"), with no daylight-saving offset or changes. When
- using either local time or a specified time zone, time-zone transitions such
- as the starts and ends of daylight-saving time (DST; but see below) are
- taken into account. The choice of system used to represent a datetime is
- described as its "timespec".
+ UTC} or to a specified \l{Qt::TimeZone}{time zone}. Each of these time
+ representations can be encapsulated in a suitable instance of the QTimeZone
+ class. For example, a time zone of "Europe/Berlin" will apply the
+ daylight-saving rules as used in Germany. In contrast, a fixed offset from
+ UTC of +3600 seconds is one hour ahead of UTC (usually written in ISO
+ standard notation as "UTC+01:00"), with no daylight-saving
+ complications. When using either local time or a specified time zone,
+ time-zone transitions (see \l {Timezone transitions}{below}) are taken into
+ account. A QDateTime's timeSpec() will tell you which of the four types of
+ time representation is in use; its timeRepresentation() provides a full
+ description of that time representation, as a QTimeZone.
A QDateTime object is typically created either by giving a date and time
explicitly in the constructor, or by using a static function such as
currentDateTime() or fromMSecsSinceEpoch(). The date and time can be changed
with setDate() and setTime(). A datetime can also be set using the
setMSecsSinceEpoch() function that takes the time, in milliseconds, since
- 00:00:00 on January 1, 1970. The fromString() function returns a QDateTime,
- given a string and a date format used to interpret the date within the
- string.
+ the start, in UTC, of the year 1970. The fromString() function returns a
+ QDateTime, given a string and a date format used to interpret the date
+ within the string.
QDateTime::currentDateTime() returns a QDateTime that expresses the current
- time with respect to local time. QDateTime::currentDateTimeUtc() returns a
- QDateTime that expresses the current time with respect to UTC.
+ date and time with respect to a specific time representation, such as local
+ time (its default). QDateTime::currentDateTimeUtc() returns a QDateTime that
+ expresses the current date and time with respect to UTC; it is equivalent to
+ \c {QDateTime::currentDateTime(QTimeZone::UTC)}.
The date() and time() functions provide access to the date and
time parts of the datetime. The same information is provided in
@@ -3509,17 +3618,17 @@ inline qint64 QDateTimePrivate::zoneMSecsToEpochMSecs(qint64 zoneMSecs, const QT
daylight-saving time (DST) and other time-zone transitions, where
applicable.
- Use toTimeSpec() to express a datetime in local time or UTC,
- toOffsetFromUtc() to express in terms of an offset from UTC, or toTimeZone()
- to express it with respect to a general time zone. You can use timeSpec() to
- find out what time-spec a QDateTime object stores its time relative to. When
- that is Qt::TimeZone, you can use timeZone() to find out which zone it is
- using.
-
- \note QDateTime does not account for leap seconds.
+ Use toTimeZone() to re-express a datetime in terms of a different time
+ representation. By passing a lightweight QTimeZone that represents local
+ time, UTC or a fixed offset from UTC, you can convert the datetime to use
+ the corresponding time representation; or you can pass a full time zone
+ (whose \l {QTimeZone::timeSpec()}{timeSpec()} is \c {Qt::TimeZone}) to use
+ that instead.
\section1 Remarks
+ \note QDateTime does not account for leap seconds.
+
\note All conversion to and from string formats is done using the C locale.
For localized conversions, see QLocale.
@@ -3527,15 +3636,21 @@ inline qint64 QDateTimePrivate::zoneMSecsToEpochMSecs(qint64 zoneMSecs, const QT
considered invalid. The year -1 is the year "1 before Christ" or "1 before
common era." The day before 1 January 1 CE is 31 December 1 BCE.
+ \note Using local time (the default) or a specified time zone implies a need
+ to resolve any issues around \l {Timezone transitions}{transitions}. As a
+ result, operations on such QDateTime instances (notably including
+ constructing them) may be more expensive than the equivalent when using UTC
+ or a fixed offset from it.
+
\section2 Range of Valid Dates
The range of values that QDateTime can represent is dependent on the
internal storage implementation. QDateTime is currently stored in a qint64
as a serial msecs value encoding the date and time. This restricts the date
- range to about +/- 292 million years, compared to the QDate range of +/- 2
- billion years. Care must be taken when creating a QDateTime with extreme
- values that you do not overflow the storage. The exact range of supported
- values varies depending on the Qt::TimeSpec and time zone.
+ range to about ±292 million years, compared to the QDate range of ±2 billion
+ years. Care must be taken when creating a QDateTime with extreme values that
+ you do not overflow the storage. The exact range of supported values varies
+ depending on the time representation used.
\section2 Use of Timezones
@@ -3552,34 +3667,106 @@ inline qint64 QDateTimePrivate::zoneMSecsToEpochMSecs(qint64 zoneMSecs, const QT
information about historical transitions (including DST, see below) whenever
possible. On Windows, where the system doesn't support historical timezone
data, historical accuracy is not maintained with respect to timezone
- transitions, notably including DST.
-
- \section2 Daylight-Saving Time (DST)
-
- QDateTime takes into account transitions between Standard Time and
- Daylight-Saving Time. For example, if the transition is at 2am and the clock
- goes forward to 3am, then there is a "missing" hour from 02:00:00 to
- 02:59:59.999 which QDateTime considers to be invalid. Any date arithmetic
- performed will take this missing hour into account and return a valid
- result. For example, adding one minute to 01:59:59 will get 03:00:00.
-
- For date-times that the system \c time_t can represent (from 1901-12-14 to
+ transitions, notably including DST. However, building Qt with the ICU
+ library will equip QTimeZone with the same timezone database as is used on
+ Unix.
+
+ \section2 Timezone transitions
+
+ QDateTime takes into account timezone transitions, both the transitions
+ between Standard Time and Daylight-Saving Time (DST) and the transitions
+ that arise when a zone changes its standard offset. For example, if the
+ transition is at 2am and the clock goes forward to 3am, then there is a
+ "missing" hour from 02:00:00 to 02:59:59.999. Such a transition is known as
+ a "spring forward" and the times skipped over have no meaning. When a
+ transition goes the other way, known as a "fall back", a time interval is
+ repeated, first in the old zone (usually DST), then in the new zone (usually
+ Standard Time), so times in this interval are ambiguous.
+
+ Some zones use "reversed" DST, using standard time in summer and
+ daylight-saving time (with a lowered offset) in winter. For such zones, the
+ spring forward still happens in spring and skips an hour, but is a
+ transition \e{out of} daylight-saving time, while the fall back still
+ repeats an autumn hour but is a transition \e to daylight-saving time.
+
+ When converting from a UTC time (or a time at fixed offset from UTC), there
+ is always an unambiguous valid result in any timezone. However, when
+ combining a date and time to make a datetime, expressed with respect to
+ local time or a specific time-zone, the nominal result may fall in a
+ transition, making it either invalid or ambiguous. Methods where this
+ situation may arise take a \c resolve parameter: this is always ignored if
+ the requested datetime is valid and unambiguous. See \l TransitionResolution
+ for the options it lets you control. Prior to Qt 6.7, the equivalent of its
+ \l LegacyBehavior was selected.
+
+ For a spring forward's skipped interval, interpreting the requested time
+ with either offset yields an actual time at which the other offset was in
+ use; so passing \c TransitionResolution::RelativeToBefore for \c resolve
+ will actually result in a time after the transition, that would have had the
+ requested representation had the transition not happened. Likewise, \c
+ TransitionResolution::RelativeToAfter for \c resolve results in a time
+ before the transition, that would have had the requested representation, had
+ the transition happened earlier.
+
+ When QDateTime performs arithmetic, as with addDay() or addSecs(), it takes
+ care to produce a valid result. For example, on a day when there is a spring
+ forward from 02:00 to 03:00, adding one second to 01:59:59 will get
+ 03:00:00. Adding one day to 02:30 on the preceding day will get 03:30 on the
+ day of the transition, while subtracting one day, by calling \c{addDay(-1)},
+ to 02:30 on the following day will get 01:30 on the day of the transition.
+ While addSecs() will deliver a time offset by the given number of seconds,
+ addDays() adjusts the date and only adjusts time if it would otherwise get
+ an invalid result. Applying \c{addDays(1)} to 03:00 on the day before the
+ spring-forward will simply get 03:00 on the day of the transition, even
+ though the latter is only 23 hours after the former; but \c{addSecs(24 * 60
+ * 60)} will get 04:00 on the day of the transition, since that's 24 hours
+ later. Typical transitions make some days 23 or 25 hours long.
+
+ For datetimes that the system \c time_t can represent (from 1901-12-14 to
2038-01-18 on systems with 32-bit \c time_t; for the full range QDateTime
can represent if the type is 64-bit), the standard system APIs are used to
- determine local time's offset from UTC. For date-times not handled by these
- system APIs, QTimeZone::systemTimeZone() is used. In either case, the offset
- information used depends on the system and may be incomplete or, for past
- times, historically inaccurate. In any case, for future dates, the local
- time zone's offsets and DST rules may change before that date comes around.
+ determine local time's offset from UTC. For datetimes not handled by these
+ system APIs (potentially including some within the \c time_t range),
+ QTimeZone::systemTimeZone() is used, if available, or a best effort is made
+ to estimate. In any case, the offset information used depends on the system
+ and may be incomplete or, for past times, historically
+ inaccurate. Furthermore, for future dates, the local time zone's offsets and
+ DST rules may change before that date comes around.
+
+ \section3 Whole day transitions
+
+ A small number of zones have skipped or repeated entire days as part of
+ moving The International Date Line across themselves. For these, daysTo()
+ will be unaware of the duplication or gap, simply using the difference in
+ calendar date; in contrast, msecsTo() and secsTo() know the true time
+ interval. Likewise, addMSecs() and addSecs() correspond directly to elapsed
+ time, where addDays(), addMonths() and addYears() follow the nominal
+ calendar, aside from where landing in a gap or duplication requires
+ resolving an ambiguity or invalidity due to a duplication or omission.
+
+ \note Days "lost" during a change of calendar, such as from Julian to
+ Gregorian, do not affect QDateTime. Although the two calendars describe
+ dates differently, the successive days across the change are described by
+ consecutive QDate instances, each one day later than the previous, as
+ described by either calendar or by their toJulianDay() values. In contrast,
+ a zone skipping or duplicating a day is changing its description of \e time,
+ not date, for all that it does so by a whole 24 hours.
\section2 Offsets From UTC
+ Offsets from UTC are measured in seconds east of Greenwich. The moment
+ described by a particular date and time, such as noon on a particular day,
+ depends on the time representation used. Those with a higher offset from UTC
+ describe an earlier moment, and those with a lower offset a later moment, by
+ any given combination of date and time.
+
There is no explicit size restriction on an offset from UTC, but there is an
implicit limit imposed when using the toString() and fromString() methods
- which use a [+|-]hh:mm format, effectively limiting the range to +/- 99
- hours and 59 minutes and whole minutes only. Note that currently no time
- zone has an offset outside the range of ±14 hours and all known offsets are
- multiples of five minutes.
+ which use a ±hh:mm format, effectively limiting the range to ± 99 hours and
+ 59 minutes and whole minutes only. Note that currently no time zone has an
+ offset outside the range of ±14 hours and all known offsets are multiples of
+ five minutes. Historical time zones have a wider range and may have offsets
+ including seconds; these last cannot be faithfully represented in strings.
\sa QDate, QTime, QDateTimeEdit, QTimeZone
*/
@@ -3605,58 +3792,230 @@ inline qint64 QDateTimePrivate::zoneMSecsToEpochMSecs(qint64 zoneMSecs, const QT
*/
/*!
- Constructs a null datetime.
+ \since 6.7
+ \enum QDateTime::TransitionResolution
+
+ This enumeration is used to resolve datetime combinations which fall in \l
+ {Timezone transitions}.
+
+ When constructing a datetime, specified in terms of local time or a
+ time-zone that has daylight-saving time, or revising one with setDate(),
+ setTime() or setTimeZone(), the given parameters may imply a time
+ representation that either has no meaning or has two meanings in the
+ zone. Such time representations are described as being in the transition. In
+ either case, we can simply return an invalid datetime, to indicate that the
+ operation is ill-defined. In the ambiguous case, we can alternatively select
+ one of the two times that could be meant. When there is no meaning, we can
+ select a time either side of it that might plausibly have been meant. For
+ example, when advancing from an earlier time, we can select the time after
+ the transition that is actually the specified amount of time after the
+ earlier time in question. The options specified here configure how such
+ selection is performed.
+
+ \value Reject
+ Treat any time in a transition as invalid. Either it really is, or it
+ is ambiguous.
+ \value RelativeToBefore
+ Selects a time as if stepping forward from a time before the
+ transition. This interprets the requested time using the offset in
+ effect before the transition and, if necessary, converts the result
+ to the offset in effect at the resulting time.
+ \value RelativeToAfter
+ Select a time as if stepping backward from a time after the
+ transition. This interprets the requested time using the offset in
+ effect after the transition and, if necessary, converts the result to
+ the offset in effect at the resulting time.
+ \value PreferBefore
+ Selects a time before the transition,
+ \value PreferAfter
+ Selects a time after the transition.
+ \value PreferStandard
+ Selects a time on the standard time side of the transition.
+ \value PreferDaylightSaving
+ Selects a time on the daylight-saving-time side of the transition.
+ \value LegacyBehavior
+ An alias for RelativeToBefore, which is used as default for
+ TransitionResolution parameters, as this most closely matches the
+ behavior prior to Qt 6.7.
+
+ For \l addDays(), \l addMonths() or \l addYears(), the behavior is and
+ (mostly) was to use \c RelativeToBefore if adding a positive adjustment and \c
+ RelativeToAfter if adding a negative adjustment.
+
+ \note In time zones where daylight-saving increases the offset from UTC in
+ summer (known as "positive DST"), PreferStandard is an alias for
+ RelativeToAfter and PreferDaylightSaving for RelativeToBefore. In time zones
+ where the daylight-saving mechanism is a decrease in offset from UTC in
+ winter (known as "negative DST"), the reverse applies, provided the
+ operating system reports - as it does on most platforms - whether a datetime
+ is in DST or standard time. For some platforms, where transition times are
+ unavailable even for Qt::TimeZone datetimes, QTimeZone is obliged to presume
+ that the side with lower offset from UTC is standard time, effectively
+ assuming positive DST.
+
+ The following tables illustrate how a QDateTime constructor resolves a
+ request for 02:30 on a day when local time has a transition between 02:00
+ and 03:00, with a nominal standard time LST and daylight-saving time LDT on
+ the two sides, in the various possible cases. The transition type may be to
+ skip an hour or repeat it. The type of transition and value of a parameter
+ \c resolve determine which actual time on the given date is selected. First,
+ the common case of positive daylight-saving, where:
+
+ \table
+ \header \li Before \li 02:00--03:00 \li After \li \c resolve \li selected
+ \row \li LST \li skip \li LDT \li RelativeToBefore \li 03:30 LDT
+ \row \li LST \li skip \li LDT \li RelativeToAfter \li 01:30 LST
+ \row \li LST \li skip \li LDT \li PreferBefore \li 01:30 LST
+ \row \li LST \li skip \li LDT \li PreferAfter \li 03:30 LDT
+ \row \li LST \li skip \li LDT \li PreferStandard \li 01:30 LST
+ \row \li LST \li skip \li LDT \li PreferDaylightSaving \li 03:30 LDT
+ \row \li LDT \li repeat \li LST \li RelativeToBefore \li 02:30 LDT
+ \row \li LDT \li repeat \li LST \li RelativeToAfter \li 02:30 LST
+ \row \li LDT \li repeat \li LST \li PreferBefore \li 02:30 LDT
+ \row \li LDT \li repeat \li LST \li PreferAfter \li 02:30 LST
+ \row \li LDT \li repeat \li LST \li PreferStandard \li 02:30 LST
+ \row \li LDT \li repeat \li LST \li PreferDaylightSaving \li 02:30 LDT
+ \endtable
+
+ Second, the case for negative daylight-saving, using LDT in winter and
+ skipping an hour to transition to LST in summer, then repeating an hour at
+ the transition back to winter:
+
+ \table
+ \row \li LDT \li skip \li LST \li RelativeToBefore \li 03:30 LST
+ \row \li LDT \li skip \li LST \li RelativeToAfter \li 01:30 LDT
+ \row \li LDT \li skip \li LST \li PreferBefore \li 01:30 LDT
+ \row \li LDT \li skip \li LST \li PreferAfter \li 03:30 LST
+ \row \li LDT \li skip \li LST \li PreferStandard \li 03:30 LST
+ \row \li LDT \li skip \li LST \li PreferDaylightSaving \li 01:30 LDT
+ \row \li LST \li repeat \li LDT \li RelativeToBefore \li 02:30 LST
+ \row \li LST \li repeat \li LDT \li RelativeToAfter \li 02:30 LDT
+ \row \li LST \li repeat \li LDT \li PreferBefore \li 02:30 LST
+ \row \li LST \li repeat \li LDT \li PreferAfter \li 02:30 LDT
+ \row \li LST \li repeat \li LDT \li PreferStandard \li 02:30 LST
+ \row \li LST \li repeat \li LDT \li PreferDaylightSaving \li 02:30 LDT
+ \endtable
+
+ Reject can be used to prompt relevant QDateTime APIs to return an invalid
+ datetime object so that your code can deal with transitions for itself, for
+ example by alerting a user to the fact that the datetime they have selected
+ is in a transition interval, to offer them the opportunity to resolve a
+ conflict or ambiguity. Code using this may well find the other options above
+ useful to determine relevant information to use in its own (or the user's)
+ resolution. If the start or end of the transition, or the moment of the
+ transition itself, is the right resolution, QTimeZone's transition APIs can
+ be used to obtain that information. You can determine whether the transition
+ is a repeated or skipped interval by using \l secsTo() to measure the actual
+ time between noon on the previous and following days. The result will be
+ less than 48 hours for a skipped interval (such as a spring-forward) and
+ more than 48 hours for a repeated interval (such as a fall-back).
+
+ \note When a resolution other than Reject is specified, a valid QDateTime
+ object is returned, if possible. If the requested date-time falls in a gap,
+ the returned date-time will not have the time() requested - or, in some
+ cases, the date(), if a whole day was skipped. You can thus detect when a
+ gap is hit by comparing date() and time() to what was requested.
+
+ \section2 Relation to other datetime software
+
+ The Python programming language's datetime APIs have a \c fold parameter
+ that corresponds to \c RelativeToBefore (\c{fold = True}) and \c
+ RelativeToAfter (\c{fold = False}).
+
+ The \c Temporal proposal to replace JavaScript's \c Date offers four options
+ for how to resolve a transition, as value for a \c disambiguation
+ parameter. Its \c{'reject'} raises an exception, which roughly corresponds
+ to \c Reject producing an invalid result. Its \c{'earlier'} and \c{'later'}
+ options correspond to \c PreferBefore and \c PreferAfter. Its
+ \c{'compatible'} option corresponds to \c RelativeToBefore (and Python's
+ \c{fold = True}).
+
+ \sa {Timezone transitions}, QDateTime::TransitionResolution
+*/
+
+/*!
+ Constructs a null datetime, nominally using local time.
A null datetime is invalid, since its date and time are invalid.
- \sa isValid()
+ \sa isValid(), setMSecsSinceEpoch(), setDate(), setTime(), setTimeZone()
*/
QDateTime::QDateTime() noexcept
{
-#if QT_VERSION >= QT_VERSION_CHECK(7,0,0) || QT_POINTER_SIZE == 8
+#if QT_VERSION >= QT_VERSION_CHECK(7, 0, 0) || defined(QT_BOOTSTRAPPED) || QT_POINTER_SIZE == 8
static_assert(sizeof(ShortData) == sizeof(qint64));
static_assert(sizeof(Data) == sizeof(qint64));
#endif
+ static_assert(sizeof(ShortData) >= sizeof(void*), "oops, Data::swap() is broken!");
}
+#if QT_DEPRECATED_SINCE(6, 9)
/*!
- Constructs a datetime with the given \a date and \a time, using
- the time specification defined by \a spec and \a offsetSeconds seconds.
+ \deprecated [6.9] Use \c{QDateTime(date, time)} or \c{QDateTime(date, time, QTimeZone::fromSecondsAheadOfUtc(offsetSeconds))}.
- If \a date is valid and \a time is not, the time will be set to midnight.
+ Constructs a datetime with the given \a date and \a time, using the time
+ representation implied by \a spec and \a offsetSeconds seconds.
- If the \a spec is not Qt::OffsetFromUTC then \a offsetSeconds will be ignored.
+ If \a date is valid and \a time is not, the time will be set to midnight.
- If the \a spec is Qt::OffsetFromUTC and \a offsetSeconds is 0 then the
+ If \a spec is not Qt::OffsetFromUTC then \a offsetSeconds will be
+ ignored. If \a spec is Qt::OffsetFromUTC and \a offsetSeconds is 0 then the
timeSpec() will be set to Qt::UTC, i.e. an offset of 0 seconds.
If \a spec is Qt::TimeZone then the spec will be set to Qt::LocalTime,
i.e. the current system time zone. To create a Qt::TimeZone datetime
use the correct constructor.
-*/
+ If \a date lies outside the range of dates representable by QDateTime, the
+ result is invalid. If \a spec is Qt::LocalTime and the system's time-zone
+ skipped over the given date and time, the result is invalid.
+*/
QDateTime::QDateTime(QDate date, QTime time, Qt::TimeSpec spec, int offsetSeconds)
- : d(QDateTimePrivate::create(date, time, spec, offsetSeconds))
+ : d(QDateTimePrivate::create(date, time, asTimeZone(spec, offsetSeconds, "QDateTime"),
+ TransitionResolution::LegacyBehavior))
{
}
+#endif // 6.9 deprecation
-#if QT_CONFIG(timezone)
/*!
\since 5.2
- Constructs a datetime with the given \a date and \a time, using
- the Time Zone specified by \a timeZone.
+ Constructs a datetime with the given \a date and \a time, using the time
+ representation described by \a timeZone.
- If \a date is valid and \a time is not, the time will be set to 00:00:00.
+ If \a date is valid and \a time is not, the time will be set to midnight.
+ If \a timeZone is invalid then the datetime will be invalid. If \a date and
+ \a time describe a moment close to a transition for \a timeZone, \a resolve
+ controls how that situation is resolved.
- If \a timeZone is invalid then the datetime will be invalid.
+//! [pre-resolve-note]
+ \note Prior to Qt 6.7, the version of this function lacked the \a resolve
+ parameter so had no way to resolve the ambiguities related to transitions.
+//! [pre-resolve-note]
*/
-QDateTime::QDateTime(QDate date, QTime time, const QTimeZone &timeZone)
- : d(QDateTimePrivate::create(date, time, timeZone))
+QDateTime::QDateTime(QDate date, QTime time, const QTimeZone &timeZone, TransitionResolution resolve)
+ : d(QDateTimePrivate::create(date, time, timeZone, resolve))
+{
+}
+
+/*!
+ \since 6.5
+ \overload
+
+ Constructs a datetime with the given \a date and \a time, using local time.
+
+ If \a date is valid and \a time is not, midnight will be used as the
+ time. If \a date and \a time describe a moment close to a transition for
+ local time, \a resolve controls how that situation is resolved.
+
+ \include qdatetime.cpp pre-resolve-note
+*/
+
+QDateTime::QDateTime(QDate date, QTime time, TransitionResolution resolve)
+ : d(QDateTimePrivate::create(date, time, QTimeZone::LocalTime, resolve))
{
}
-#endif // timezone
/*!
Constructs a copy of the \a other datetime.
@@ -3684,8 +4043,7 @@ QDateTime::~QDateTime()
}
/*!
- Makes a copy of the \a other datetime and returns a reference to the
- copy.
+ Copies the \a other datetime into this and returns this copy.
*/
QDateTime &QDateTime::operator=(const QDateTime &other) noexcept
@@ -3710,66 +4068,60 @@ QDateTime &QDateTime::operator=(const QDateTime &other) noexcept
bool QDateTime::isNull() const
{
- auto status = getStatus(d);
- return !status.testFlag(QDateTimePrivate::ValidDate) &&
- !status.testFlag(QDateTimePrivate::ValidTime);
+ // If date or time is invalid, we don't set datetime valid.
+ return !getStatus(d).testAnyFlag(QDateTimePrivate::ValidityMask);
}
/*!
- Returns \c true if both the date and the time are valid and they are valid in
- the current Qt::TimeSpec, otherwise returns \c false.
+ Returns \c true if this datetime represents a definite moment, otherwise \c false.
- If the timeSpec() is Qt::LocalTime or Qt::TimeZone and this object
- represents a time that was skipped by a forward transition, then it is
- invalid. For example, if DST ends at 2am with the clock advancing to 3am,
- then date-times from 02:00:00 to 02:59:59.999 on that day are considered
- invalid.
+ A datetime is valid if both its date and its time are valid and the time
+ representation used gives a valid meaning to their combination. When the
+ time representation is a specific time-zone or local time, there may be
+ times on some dates that the zone skips in its representation, as when a
+ daylight-saving transition skips an hour (typically during a night in
+ spring). For example, if DST ends at 2am with the clock advancing to 3am,
+ then datetimes from 02:00:00 to 02:59:59.999 on that day are invalid.
\sa QDateTime::YearRange, QDate::isValid(), QTime::isValid()
*/
bool QDateTime::isValid() const
{
- auto status = getStatus(d);
- return status.testAnyFlag(QDateTimePrivate::ValidDateTime);
+ return getStatus(d).testFlag(QDateTimePrivate::ValidDateTime);
}
/*!
Returns the date part of the datetime.
- \sa setDate(), time(), timeSpec()
+ \sa setDate(), time(), timeRepresentation()
*/
QDate QDateTime::date() const
{
- auto status = getStatus(d);
- if (!status.testFlag(QDateTimePrivate::ValidDate))
- return QDate();
- QDate dt;
- msecsToTime(getMSecs(d), &dt, nullptr);
- return dt;
+ return getStatus(d).testFlag(QDateTimePrivate::ValidDate) ? msecsToDate(getMSecs(d)) : QDate();
}
/*!
Returns the time part of the datetime.
- \sa setTime(), date(), timeSpec()
+ \sa setTime(), date(), timeRepresentation()
*/
QTime QDateTime::time() const
{
- auto status = getStatus(d);
- if (!status.testFlag(QDateTimePrivate::ValidTime))
- return QTime();
- QTime tm;
- msecsToTime(getMSecs(d), nullptr, &tm);
- return tm;
+ return getStatus(d).testFlag(QDateTimePrivate::ValidTime) ? msecsToTime(getMSecs(d)) : QTime();
}
/*!
Returns the time specification of the datetime.
- \sa setTimeSpec(), date(), time(), Qt::TimeSpec
+ This classifies its time representation as local time, UTC, a fixed offset
+ from UTC (without indicating the offset) or a time zone (without giving the
+ details of that time zone). Equivalent to
+ \c{timeRepresentation().timeSpec()}.
+
+ \sa setTimeSpec(), timeRepresentation(), date(), time()
*/
Qt::TimeSpec QDateTime::timeSpec() const
@@ -3777,41 +4129,51 @@ Qt::TimeSpec QDateTime::timeSpec() const
return getSpec(d);
}
+/*!
+ \since 6.5
+ Returns a QTimeZone identifying how this datetime represents time.
+
+ The timeSpec() of the returned QTimeZone will coincide with that of this
+ datetime; if it is not Qt::TimeZone then the returned QTimeZone is a time
+ representation. When their timeSpec() is Qt::OffsetFromUTC, the returned
+ QTimeZone's fixedSecondsAheadOfUtc() supplies the offset. When timeSpec()
+ is Qt::TimeZone, the QTimeZone object itself is the full representation of
+ that time zone.
+
+ \sa timeZone(), setTimeZone(), QTimeZone::asBackendZone()
+*/
+
+QTimeZone QDateTime::timeRepresentation() const
+{
+ return d.timeZone();
+}
+
#if QT_CONFIG(timezone)
/*!
\since 5.2
Returns the time zone of the datetime.
- If the timeSpec() is Qt::LocalTime then an instance of the current system
- time zone will be returned. Note however that if you copy this time zone
- the instance will not remain in sync if the system time zone changes.
+ The result is the same as \c{timeRepresentation().asBackendZone()}. In all
+ cases, the result's \l {QTimeZone::timeSpec()}{timeSpec()} is Qt::TimeZone.
+
+ When timeSpec() is Qt::LocalTime, the result will describe local time at the
+ time this method was called. It will not reflect subsequent changes to the
+ system time zone, even when the QDateTime from which it was obtained does.
- \sa setTimeZone(), Qt::TimeSpec
+ \sa timeRepresentation(), setTimeZone(), Qt::TimeSpec, QTimeZone::asBackendZone()
*/
QTimeZone QDateTime::timeZone() const
{
- switch (getSpec(d)) {
- case Qt::UTC:
- return QTimeZone::utc();
- case Qt::OffsetFromUTC:
- return QTimeZone(d->m_offsetFromUtc);
- case Qt::TimeZone:
- if (d->m_timeZone.isValid())
- return d->m_timeZone;
- break;
- case Qt::LocalTime:
- return QTimeZone::systemTimeZone();
- }
- return QTimeZone();
+ return d.timeZone().asBackendZone();
}
#endif // timezone
/*!
\since 5.2
- Returns this date-time's Offset From UTC in seconds.
+ Returns this datetime's Offset From UTC in seconds.
The result depends on timeSpec():
\list
@@ -3832,16 +4194,18 @@ QTimeZone QDateTime::timeZone() const
int QDateTime::offsetFromUtc() const
{
+ const auto status = getStatus(d);
+ if (!status.testFlags(QDateTimePrivate::ValidDate | QDateTimePrivate::ValidTime))
+ return 0;
+ // But allow invalid date-time (e.g. gap's resolution) to report its offset.
if (!d.isShort())
return d->m_offsetFromUtc;
- if (!isValid())
- return 0;
- auto spec = getSpec(d);
+ auto spec = extractSpec(status);
if (spec == Qt::LocalTime) {
- // we didn't cache the value, so we need to calculate it now...
- qint64 msecs = getMSecs(d);
- return (msecs - toMSecsSinceEpoch()) / MSECS_PER_SEC;
+ // We didn't cache the value, so we need to calculate it:
+ const auto resolve = toTransitionOptions(extractDaylightStatus(status));
+ return QDateTimePrivate::localStateAtMillis(getMSecs(d), resolve).offset;
}
Q_ASSERT(spec == Qt::UTC);
@@ -3857,7 +4221,7 @@ int QDateTime::offsetFromUtc() const
\list
\li For Qt::UTC it is "UTC".
- \li For Qt::OffsetFromUTC it will be in the format "UTC[+-]00:00".
+ \li For Qt::OffsetFromUTC it will be in the format "UTC±00:00".
\li For Qt::LocalTime, the host system is queried.
\li For Qt::TimeZone, the associated QTimeZone object is queried.
\endlist
@@ -3876,9 +4240,9 @@ QString QDateTime::timeZoneAbbreviation() const
switch (getSpec(d)) {
case Qt::UTC:
- return QLatin1String("UTC");
+ return "UTC"_L1;
case Qt::OffsetFromUTC:
- return QLatin1String("UTC") + toOffsetString(Qt::ISODate, d->m_offsetFromUtc);
+ return "UTC"_L1 + toOffsetString(Qt::ISODate, d->m_offsetFromUtc);
case Qt::TimeZone:
#if !QT_CONFIG(timezone)
break;
@@ -3886,12 +4250,9 @@ QString QDateTime::timeZoneAbbreviation() const
Q_ASSERT(d->m_timeZone.isValid());
return d->m_timeZone.abbreviation(*this);
#endif // timezone
- case Qt::LocalTime: {
- QString abbrev;
- auto status = extractDaylightStatus(getStatus(d));
- QDateTimePrivate::localMSecsToEpochMSecs(getMSecs(d), &status, nullptr, nullptr, &abbrev);
- return abbrev;
- }
+ case Qt::LocalTime:
+ return QDateTimePrivate::localNameAtMillis(getMSecs(d),
+ extractDaylightStatus(getStatus(d)));
}
return QString();
}
@@ -3921,29 +4282,43 @@ bool QDateTime::isDaylightTime() const
break;
#else
Q_ASSERT(d->m_timeZone.isValid());
+ if (auto dst = extractDaylightStatus(getStatus(d));
+ dst != QDateTimePrivate::UnknownDaylightTime) {
+ return dst == QDateTimePrivate::DaylightTime;
+ }
return d->m_timeZone.d->isDaylightTime(toMSecsSinceEpoch());
#endif // timezone
case Qt::LocalTime: {
- auto status = extractDaylightStatus(getStatus(d));
- if (status == QDateTimePrivate::UnknownDaylightTime)
- QDateTimePrivate::localMSecsToEpochMSecs(getMSecs(d), &status);
- return (status == QDateTimePrivate::DaylightTime);
+ auto dst = extractDaylightStatus(getStatus(d));
+ if (dst == QDateTimePrivate::UnknownDaylightTime) {
+ dst = QDateTimePrivate::localStateAtMillis(
+ getMSecs(d), toTransitionOptions(TransitionResolution::LegacyBehavior)).dst;
+ }
+ return dst == QDateTimePrivate::DaylightTime;
}
}
return false;
}
/*!
- Sets the date part of this datetime to \a date. If no time is set yet, it
- is set to midnight. If \a date is invalid, this QDateTime becomes invalid.
+ Sets the date part of this datetime to \a date.
+
+ If no time is set yet, it is set to midnight. If \a date is invalid, this
+ QDateTime becomes invalid.
+
+ If \a date and time() describe a moment close to a transition for this
+ datetime's time representation, \a resolve controls how that situation is
+ resolved.
- \sa date(), setTime(), setTimeSpec()
+ \include qdatetime.cpp pre-resolve-note
+
+ \sa date(), setTime(), setTimeZone()
*/
-void QDateTime::setDate(QDate date)
+void QDateTime::setDate(QDate date, TransitionResolution resolve)
{
setDateTime(d, date, time());
- checkValidDateTime(d);
+ checkValidDateTime(d, resolve);
}
/*!
@@ -3956,18 +4331,27 @@ void QDateTime::setDate(QDate date)
dt.setTime(QTime());
\endcode
- \sa time(), setDate(), setTimeSpec()
+ If date() and \a time describe a moment close to a transition for this
+ datetime's time representation, \a resolve controls how that situation is
+ resolved.
+
+ \include qdatetime.cpp pre-resolve-note
+
+ \sa time(), setDate(), setTimeZone()
*/
-void QDateTime::setTime(QTime time)
+void QDateTime::setTime(QTime time, TransitionResolution resolve)
{
setDateTime(d, date(), time);
- checkValidDateTime(d);
+ checkValidDateTime(d, resolve);
}
+#if QT_DEPRECATED_SINCE(6, 9)
/*!
+ \deprecated [6.9] Use setTimeZone() instead
+
Sets the time specification used in this datetime to \a spec.
- The datetime will refer to a different point in time.
+ The datetime may refer to a different point in time.
If \a spec is Qt::OffsetFromUTC then the timeSpec() will be set
to Qt::UTC, i.e. an effective offset of 0.
@@ -3978,23 +4362,21 @@ void QDateTime::setTime(QTime time)
Example:
\snippet code/src_corelib_time_qdatetime.cpp 19
- \sa timeSpec(), setDate(), setTime(), setTimeZone(), Qt::TimeSpec
+ \sa setTimeZone(), timeSpec(), toTimeSpec(), setDate(), setTime()
*/
void QDateTime::setTimeSpec(Qt::TimeSpec spec)
{
- QT_PREPEND_NAMESPACE(setTimeSpec(d, spec, 0));
- if (spec == Qt::OffsetFromUTC || spec == Qt::UTC)
- refreshSimpleDateTime(d);
- else
- refreshZonedDateTime(d, Qt::LocalTime);
+ reviseTimeZone(d, asTimeZone(spec, 0, "QDateTime::setTimeSpec"),
+ TransitionResolution::LegacyBehavior);
}
/*!
\since 5.2
+ \deprecated [6.9] Use setTimeZone(QTimeZone::fromSecondsAheadOfUtc(offsetSeconds)) instead
Sets the timeSpec() to Qt::OffsetFromUTC and the offset to \a offsetSeconds.
- The datetime will refer to a different point in time.
+ The datetime may refer to a different point in time.
The maximum and minimum offset is 14 positive or negative hours. If
\a offsetSeconds is larger or smaller than that, then the result is
@@ -4002,42 +4384,46 @@ void QDateTime::setTimeSpec(Qt::TimeSpec spec)
If \a offsetSeconds is 0 then the timeSpec() will be set to Qt::UTC.
- \sa isValid(), offsetFromUtc()
+ \sa setTimeZone(), isValid(), offsetFromUtc(), toOffsetFromUtc()
*/
void QDateTime::setOffsetFromUtc(int offsetSeconds)
{
- QT_PREPEND_NAMESPACE(setTimeSpec(d, Qt::OffsetFromUTC, offsetSeconds));
- refreshSimpleDateTime(d);
+ reviseTimeZone(d, QTimeZone::fromSecondsAheadOfUtc(offsetSeconds),
+ TransitionResolution::Reject);
}
+#endif // 6.9 deprecations
-#if QT_CONFIG(timezone)
/*!
\since 5.2
Sets the time zone used in this datetime to \a toZone.
- The datetime will refer to a different point in time.
- If \a toZone is invalid then the datetime will be invalid.
+ The datetime may refer to a different point in time. It uses the time
+ representation of \a toZone, which may change the meaning of its unchanged
+ date() and time().
+
+ If \a toZone is invalid then the datetime will be invalid. Otherwise, this
+ datetime's timeSpec() after the call will match \c{toZone.timeSpec()}.
+
+ If date() and time() describe a moment close to a transition for \a toZone,
+ \a resolve controls how that situation is resolved.
+
+ \include qdatetime.cpp pre-resolve-note
- \sa timeZone(), Qt::TimeSpec
+ \sa timeRepresentation(), timeZone(), Qt::TimeSpec
*/
-void QDateTime::setTimeZone(const QTimeZone &toZone)
+void QDateTime::setTimeZone(const QTimeZone &toZone, TransitionResolution resolve)
{
- d.detach(); // always detach
- d->m_status = mergeSpec(d->m_status, Qt::TimeZone);
- d->m_offsetFromUtc = 0;
- d->m_timeZone = toZone;
- refreshZonedDateTime(d, Qt::TimeZone);
+ reviseTimeZone(d, toZone, resolve);
}
-#endif // timezone
/*!
\since 4.7
- Returns the datetime as the number of milliseconds that have passed
- since 1970-01-01T00:00:00.000, Coordinated Universal Time (Qt::UTC).
+ Returns the datetime as a number of milliseconds after the start, in UTC, of
+ the year 1970.
On systems that do not support time zones, this function will
behave as if local time were Qt::UTC.
@@ -4046,15 +4432,20 @@ void QDateTime::setTimeZone(const QTimeZone &toZone)
this object is not valid. However, for all valid dates, this function
returns a unique value.
- \sa toSecsSinceEpoch(), setMSecsSinceEpoch()
+ \sa toSecsSinceEpoch(), setMSecsSinceEpoch(), fromMSecsSinceEpoch()
*/
qint64 QDateTime::toMSecsSinceEpoch() const
{
// Note: QDateTimeParser relies on this producing a useful result, even when
// !isValid(), at least when the invalidity is a time in a fall-back (that
// we'll have adjusted to lie outside it, but marked invalid because it's
- // not what was asked for). Other things may be doing similar.
- switch (getSpec(d)) {
+ // not what was asked for). Other things may be doing similar. But that's
+ // only relevant when we got enough data for resolution to find it invalid.
+ const auto status = getStatus(d);
+ if (!status.testFlags(QDateTimePrivate::ValidDate | QDateTimePrivate::ValidTime))
+ return 0;
+
+ switch (extractSpec(status)) {
case Qt::UTC:
return getMSecs(d);
@@ -4062,15 +4453,15 @@ qint64 QDateTime::toMSecsSinceEpoch() const
Q_ASSERT(!d.isShort());
return d->m_msecs - d->m_offsetFromUtc * MSECS_PER_SEC;
- case Qt::LocalTime: {
- // recalculate the local timezone
- auto status = extractDaylightStatus(getStatus(d));
- // If short, use offset saved by refreshZonedDateTime() on creation:
- if (!d.isShort())
- return d->m_msecs - d->m_offsetFromUtc * MSECS_PER_SEC;
- // Offset from UTC not recorded: need to recompute.
- return QDateTimePrivate::localMSecsToEpochMSecs(getMSecs(d), &status);
- }
+ case Qt::LocalTime:
+ if (status.testFlag(QDateTimePrivate::ShortData)) {
+ // Short form has nowhere to cache the offset, so recompute.
+ const auto resolve = toTransitionOptions(extractDaylightStatus(getStatus(d)));
+ const auto state = QDateTimePrivate::localStateAtMillis(getMSecs(d), resolve);
+ return state.when - state.offset * MSECS_PER_SEC;
+ }
+ // Use the offset saved by refreshZonedDateTime() on creation.
+ return d->m_msecs - d->m_offsetFromUtc * MSECS_PER_SEC;
case Qt::TimeZone:
Q_ASSERT(!d.isShort());
@@ -4081,15 +4472,14 @@ qint64 QDateTime::toMSecsSinceEpoch() const
#endif
return 0;
}
- Q_UNREACHABLE();
- return 0;
+ Q_UNREACHABLE_RETURN(0);
}
/*!
\since 5.8
- Returns the datetime as the number of seconds that have passed since
- 1970-01-01T00:00:00.000, Coordinated Universal Time (Qt::UTC).
+ Returns the datetime as a number of seconds after the start, in UTC, of the
+ year 1970.
On systems that do not support time zones, this function will
behave as if local time were Qt::UTC.
@@ -4098,7 +4488,7 @@ qint64 QDateTime::toMSecsSinceEpoch() const
this object is not valid. However, for all valid dates, this function
returns a unique value.
- \sa toMSecsSinceEpoch(), setSecsSinceEpoch()
+ \sa toMSecsSinceEpoch(), fromSecsSinceEpoch(), setSecsSinceEpoch()
*/
qint64 QDateTime::toSecsSinceEpoch() const
{
@@ -4108,97 +4498,87 @@ qint64 QDateTime::toSecsSinceEpoch() const
/*!
\since 4.7
- Sets the date and time given the number of milliseconds \a msecs that have
- passed since 1970-01-01T00:00:00.000, Coordinated Universal Time
- (Qt::UTC). On systems that do not support time zones this function
- will behave as if local time were Qt::UTC.
+ Sets the datetime to represent a moment a given number, \a msecs, of
+ milliseconds after the start, in UTC, of the year 1970.
+
+ On systems that do not support time zones, this function will
+ behave as if local time were Qt::UTC.
Note that passing the minimum of \c qint64
(\c{std::numeric_limits<qint64>::min()}) to \a msecs will result in
undefined behavior.
- \sa toMSecsSinceEpoch(), setSecsSinceEpoch()
+ \sa setSecsSinceEpoch(), toMSecsSinceEpoch(), fromMSecsSinceEpoch()
*/
void QDateTime::setMSecsSinceEpoch(qint64 msecs)
{
auto status = getStatus(d);
const auto spec = extractSpec(status);
- Q_ASSERT(spec == Qt::UTC || spec == Qt::LocalTime || !d.isShort());
- qint64 local = msecs;
- int offsetFromUtc = 0;
+ Q_ASSERT(specCanBeSmall(spec) || !d.isShort());
+ QDateTimePrivate::ZoneState state(msecs);
status &= ~QDateTimePrivate::ValidityMask;
- if (spec == Qt::UTC || spec == Qt::OffsetFromUTC) {
+ if (QTimeZone::isUtcOrFixedOffset(spec)) {
if (spec == Qt::OffsetFromUTC)
- offsetFromUtc = d->m_offsetFromUtc;
- if (!offsetFromUtc || !add_overflow(msecs, offsetFromUtc * MSECS_PER_SEC, &local))
- status |= QDateTimePrivate::ValidWhenMask;
- } else {
- auto dst = extractDaylightStatus(status);
- if (spec == Qt::LocalTime) {
- QDate dt;
- QTime tm;
- if (QDateTimePrivate::epochMSecsToLocalTime(msecs, &dt, &tm, &dst))
- setDateTime(d, dt, tm);
- status = getStatus(d);
- if ((status & QDateTimePrivate::ValidDate) && (status & QDateTimePrivate::ValidTime)) {
- local = getMSecs(d);
- offsetFromUtc = (local - msecs) / MSECS_PER_SEC;
- status |= QDateTimePrivate::ValidWhenMask;
- }
+ state.offset = d->m_offsetFromUtc;
+ if (!state.offset || !qAddOverflow(msecs, state.offset * MSECS_PER_SEC, &state.when))
+ status |= QDateTimePrivate::ValidityMask;
+ } else if (spec == Qt::LocalTime) {
+ state = QDateTimePrivate::expressUtcAsLocal(msecs);
+ if (state.valid)
+ status = mergeDaylightStatus(status | QDateTimePrivate::ValidityMask, state.dst);
#if QT_CONFIG(timezone)
- } else if (spec == Qt::TimeZone && (d.detach(), d->m_timeZone.isValid())) {
- const auto data = d->m_timeZone.d->data(msecs);
- if (data.offsetFromUtc != QTimeZonePrivate::invalidSeconds()) {
- dst = data.daylightTimeOffset
- ? QDateTimePrivate::DaylightTime
- : QDateTimePrivate::StandardTime;
- offsetFromUtc = data.offsetFromUtc;
- if (!offsetFromUtc
- || !add_overflow(msecs, offsetFromUtc * MSECS_PER_SEC, &local)) {
- status |= QDateTimePrivate::ValidWhenMask;
- }
- }
+ } else if (spec == Qt::TimeZone && (d.detach(), d->m_timeZone.isValid())) {
+ const auto data = d->m_timeZone.d->data(msecs);
+ if (Q_LIKELY(data.offsetFromUtc != QTimeZonePrivate::invalidSeconds())) {
+ state.offset = data.offsetFromUtc;
+ Q_ASSERT(state.offset >= -SECS_PER_DAY && state.offset <= SECS_PER_DAY);
+ if (!state.offset
+ || !Q_UNLIKELY(qAddOverflow(msecs, state.offset * MSECS_PER_SEC, &state.when))) {
+ d->m_status = mergeDaylightStatus(status | QDateTimePrivate::ValidityMask,
+ data.daylightTimeOffset
+ ? QDateTimePrivate::DaylightTime
+ : QDateTimePrivate::StandardTime);
+ d->m_msecs = state.when;
+ d->m_offsetFromUtc = state.offset;
+ return;
+ } // else: zone can't represent this UTC time
+ } // else: zone unable to represent given UTC time (should only happen on overflow).
#endif // timezone
- }
- status = mergeDaylightStatus(status, dst);
}
- Q_ASSERT(!(status & QDateTimePrivate::ValidDateTime)
- || (offsetFromUtc >= -SECS_PER_DAY && offsetFromUtc <= SECS_PER_DAY));
+ Q_ASSERT(!status.testFlag(QDateTimePrivate::ValidDateTime)
+ || (state.offset >= -SECS_PER_DAY && state.offset <= SECS_PER_DAY));
- if (msecsCanBeSmall(local) && d.isShort()) {
+ if (msecsCanBeSmall(state.when) && d.isShort()) {
// we can keep short
- d.data.msecs = qintptr(local);
+ d.data.msecs = qintptr(state.when);
d.data.status = status.toInt();
} else {
d.detach();
d->m_status = status & ~QDateTimePrivate::ShortData;
- d->m_msecs = local;
- d->m_offsetFromUtc = offsetFromUtc;
+ d->m_msecs = state.when;
+ d->m_offsetFromUtc = state.offset;
}
}
/*!
\since 5.8
- Sets the date and time given the number of seconds \a secs that have
- passed since 1970-01-01T00:00:00.000, Coordinated Universal Time
- (Qt::UTC). On systems that do not support time zones this function
- will behave as if local time were Qt::UTC.
+ Sets the datetime to represent a moment a given number, \a secs, of seconds
+ after the start, in UTC, of the year 1970.
- \sa toSecsSinceEpoch(), setMSecsSinceEpoch()
+ On systems that do not support time zones, this function will
+ behave as if local time were Qt::UTC.
+
+ \sa setMSecsSinceEpoch(), toSecsSinceEpoch(), fromSecsSinceEpoch()
*/
void QDateTime::setSecsSinceEpoch(qint64 secs)
{
qint64 msecs;
- if (!mul_overflow(secs, std::integral_constant<qint64, MSECS_PER_SEC>(), &msecs)) {
+ if (!qMulOverflow(secs, std::integral_constant<qint64, MSECS_PER_SEC>(), &msecs))
setMSecsSinceEpoch(msecs);
- } else if (d.isShort()) {
- d.data.status &= ~int(QDateTimePrivate::ValidWhenMask);
- } else {
- d.detach();
- d->m_status &= ~QDateTimePrivate::ValidWhenMask;
- }
+ else
+ d.invalidate();
}
#if QT_CONFIG(datestring) // depends on, so implies, textdate
@@ -4212,15 +4592,14 @@ void QDateTime::setSecsSinceEpoch(qint64 secs)
formatting is "Wed May 20 03:40:13 1998". For localized formatting, see
\l{QLocale::toString()}.
- If the \a format is Qt::ISODate, the string format corresponds
- to the ISO 8601 extended specification for representations of
- dates and times, taking the form yyyy-MM-ddTHH:mm:ss[Z|[+|-]HH:mm],
- depending on the timeSpec() of the QDateTime. If the timeSpec()
- is Qt::UTC, Z will be appended to the string; if the timeSpec() is
- Qt::OffsetFromUTC, the offset in hours and minutes from UTC will
- be appended to the string. To include milliseconds in the ISO 8601
+ If the \a format is Qt::ISODate, the string format corresponds to the ISO
+ 8601 extended specification for representations of dates and times, taking
+ the form yyyy-MM-ddTHH:mm:ss[Z|±HH:mm], depending on the timeSpec() of the
+ QDateTime. If the timeSpec() is Qt::UTC, Z will be appended to the string;
+ if the timeSpec() is Qt::OffsetFromUTC, the offset in hours and minutes from
+ UTC will be appended to the string. To include milliseconds in the ISO 8601
date, use the \a format Qt::ISODateWithMs, which corresponds to
- yyyy-MM-ddTHH:mm:ss.zzz[Z|[+|-]HH:mm].
+ yyyy-MM-ddTHH:mm:ss.zzz[Z|±HH:mm].
If the \a format is Qt::RFC2822Date, the string is formatted
following \l{RFC 2822}.
@@ -4246,7 +4625,7 @@ QString QDateTime::toString(Qt::DateFormat format) const
return buf;
default:
case Qt::TextDate: {
- const QPair<QDate, QTime> p = getDateTime(d);
+ const std::pair<QDate, QTime> p = getDateTime(d);
buf = toStringTextDate(p.first);
// Insert time between date's day and year:
buf.insert(buf.lastIndexOf(u' '),
@@ -4263,9 +4642,9 @@ QString QDateTime::toString(Qt::DateFormat format) const
#endif
default:
#if 0 // ### Qt 7 GMT: use UTC instead, see qnamespace.qdoc documentation
- buf += QLatin1String(" UTC");
+ buf += " UTC"_L1;
#else
- buf += QLatin1String(" GMT");
+ buf += " GMT"_L1;
#endif
if (getSpec(d) == Qt::OffsetFromUTC)
buf += toOffsetString(Qt::TextDate, offsetFromUtc());
@@ -4274,7 +4653,7 @@ QString QDateTime::toString(Qt::DateFormat format) const
}
case Qt::ISODate:
case Qt::ISODateWithMs: {
- const QPair<QDate, QTime> p = getDateTime(d);
+ const std::pair<QDate, QTime> p = getDateTime(d);
buf = toStringIsoDate(p.first);
if (buf.isEmpty())
return QString(); // failed to convert
@@ -4284,9 +4663,7 @@ QString QDateTime::toString(Qt::DateFormat format) const
buf += u'Z';
break;
case Qt::OffsetFromUTC:
-#if QT_CONFIG(timezone)
case Qt::TimeZone:
-#endif
buf += toOffsetString(Qt::ISODate, offsetFromUtc());
break;
default:
@@ -4300,12 +4677,14 @@ QString QDateTime::toString(Qt::DateFormat format) const
/*!
\fn QString QDateTime::toString(const QString &format, QCalendar cal) const
\fn QString QDateTime::toString(QStringView format, QCalendar cal) const
+ \since 5.14
Returns the datetime as a string. The \a format parameter determines the
- format of the result string. If \a cal is supplied, it determines the calendar
- used to represent the date; it defaults to Gregorian. See QTime::toString()
- and QDate::toString() for the supported specifiers for time and date,
- respectively.
+ format of the result string. If \a cal is supplied, it determines the
+ calendar used to represent the date; it defaults to Gregorian. Prior to Qt
+ 5.14, there was no \a cal parameter and the Gregorian calendar was always
+ used. See QTime::toString() and QDate::toString() for the supported
+ specifiers for time and date, respectively, in the \a format parameter.
Any sequence of characters enclosed in single quotes will be included
verbatim in the output string (stripped of the quotes), even if it contains
@@ -4342,58 +4721,59 @@ QString QDateTime::toString(QStringView format, QCalendar cal) const
{
return QLocale::c().toString(*this, format, cal);
}
+
+// Out-of-line no-calendar overloads, since QCalendar is a non-trivial type
+/*!
+ \overload
+ \since 5.10
+*/
+QString QDateTime::toString(QStringView format) const
+{
+ return QLocale::c().toString(*this, format, QCalendar());
+}
+
+/*!
+ \overload
+ \since 4.6
+*/
+QString QDateTime::toString(const QString &format) const
+{
+ return QLocale::c().toString(*this, qToStringViewIgnoringNull(format), QCalendar());
+}
#endif // datestring
-static inline void massageAdjustedDateTime(QDateTimeData &d, QDate date, QTime time)
-{
- /*
- If we have just adjusted to a day with a DST transition, our given time
- may lie in the transition hour (either missing or duplicated). For any
- other time, telling mktime (deep in the bowels of localMSecsToEpochMSecs)
- or QTimeZone (via zoneMSecsToEpochMSecs) what we know about DST-ness, of
- the time we adjusted from, will make no difference; it'll just tell us the
- actual DST-ness of the given time. When landing in a transition that
- repeats an hour, passing the prior DST-ness - when known - will get us the
- indicated side of the duplicate (either local or zone). When landing in a
- gap, the zone gives us the other side of the gap but (for now) local time
- gets us a platform-dependent side of the gap (e.g. DST-side for glibc).
- */
+static inline void massageAdjustedDateTime(QDateTimeData &d, QDate date, QTime time, bool forward)
+{
+ const QDateTimePrivate::TransitionOptions resolve = toTransitionOptions(
+ forward ? QDateTime::TransitionResolution::RelativeToBefore
+ : QDateTime::TransitionResolution::RelativeToAfter);
auto status = getStatus(d);
- Q_ASSERT((status & QDateTimePrivate::ValidDate) && (status & QDateTimePrivate::ValidTime)
- && (status & QDateTimePrivate::ValidDateTime));
+ Q_ASSERT(status.testFlags(QDateTimePrivate::ValidDate | QDateTimePrivate::ValidTime
+ | QDateTimePrivate::ValidDateTime));
auto spec = extractSpec(status);
- if (spec == Qt::OffsetFromUTC || spec == Qt::UTC) {
+ if (QTimeZone::isUtcOrFixedOffset(spec)) {
setDateTime(d, date, time);
refreshSimpleDateTime(d);
return;
}
- auto dst = extractDaylightStatus(status);
- qint64 utc = 0, local = timeToMSecs(date, time);
- if (spec == Qt::LocalTime)
- utc = QDateTimePrivate::localMSecsToEpochMSecs(local, &dst, &date, &time);
-#if QT_CONFIG(timezone)
- else if (spec == Qt::TimeZone && d->m_timeZone.isValid())
- utc = QDateTimePrivate::zoneMSecsToEpochMSecs(local, d->m_timeZone, &dst, &date, &time);
-#endif // timezone
+ qint64 local = timeToMSecs(date, time);
+ const QDateTimePrivate::ZoneState state = stateAtMillis(d.timeZone(), local, resolve);
+ Q_ASSERT(state.valid || state.dst == QDateTimePrivate::UnknownDaylightTime);
+ if (state.dst == QDateTimePrivate::UnknownDaylightTime)
+ status.setFlag(QDateTimePrivate::ValidDateTime, false);
else
- dst = QDateTimePrivate::UnknownDaylightTime;
-
- setDateTime(d, date, time);
- status = getStatus(d); // Updated by setDateTime()
- const bool ok = (dst != QDateTimePrivate::UnknownDaylightTime
- && (status & QDateTimePrivate::ValidDate)
- && (status & QDateTimePrivate::ValidTime));
- if (ok)
- status = mergeDaylightStatus(status | QDateTimePrivate::ValidDateTime, dst);
- else
- status &= ~QDateTimePrivate::ValidDateTime;
+ status = mergeDaylightStatus(status | QDateTimePrivate::ValidDateTime, state.dst);
if (status & QDateTimePrivate::ShortData) {
+ d.data.msecs = state.when;
d.data.status = status.toInt();
} else {
+ d.detach();
d->m_status = status;
- if (ok)
- d->m_offsetFromUtc = (local - utc) / MSECS_PER_SEC;
+ if (state.valid) {
+ d->m_msecs = state.when;
+ d->m_offsetFromUtc = state.offset;
+ }
}
}
@@ -4402,13 +4782,14 @@ static inline void massageAdjustedDateTime(QDateTimeData &d, QDate date, QTime t
later than the datetime of this object (or earlier if \a ndays is
negative).
- If the timeSpec() is Qt::LocalTime or Qt::TimeZone and the resulting
- date and time fall in the Standard Time to Daylight-Saving Time transition
- hour then the result will be adjusted accordingly, i.e. if the transition
- is at 2am and the clock goes forward to 3am and the result falls between
- 2am and 3am then the result will be adjusted to fall after 3am.
+ If the timeSpec() is Qt::LocalTime or Qt::TimeZone and the resulting date
+ and time fall in the Standard Time to Daylight-Saving Time transition hour
+ then the result will be just beyond this gap, in the direction of change.
+ If the transition is at 2am and the clock goes forward to 3am, the result of
+ aiming between 2am and 3am will be adjusted to fall before 2am (if \c{ndays
+ < 0}) or after 3am (otherwise).
- \sa daysTo(), addMonths(), addYears(), addSecs()
+ \sa daysTo(), addMonths(), addYears(), addSecs(), {Timezone transitions}
*/
QDateTime QDateTime::addDays(qint64 ndays) const
@@ -4417,8 +4798,8 @@ QDateTime QDateTime::addDays(qint64 ndays) const
return QDateTime();
QDateTime dt(*this);
- QPair<QDate, QTime> p = getDateTime(d);
- massageAdjustedDateTime(dt.d, p.first.addDays(ndays), p.second);
+ std::pair<QDate, QTime> p = getDateTime(d);
+ massageAdjustedDateTime(dt.d, p.first.addDays(ndays), p.second, ndays >= 0);
return dt;
}
@@ -4427,13 +4808,14 @@ QDateTime QDateTime::addDays(qint64 ndays) const
later than the datetime of this object (or earlier if \a nmonths
is negative).
- If the timeSpec() is Qt::LocalTime or Qt::TimeZone and the resulting
- date and time fall in the Standard Time to Daylight-Saving Time transition
- hour then the result will be adjusted accordingly, i.e. if the transition
- is at 2am and the clock goes forward to 3am and the result falls between
- 2am and 3am then the result will be adjusted to fall after 3am.
+ If the timeSpec() is Qt::LocalTime or Qt::TimeZone and the resulting date
+ and time fall in the Standard Time to Daylight-Saving Time transition hour
+ then the result will be just beyond this gap, in the direction of change.
+ If the transition is at 2am and the clock goes forward to 3am, the result of
+ aiming between 2am and 3am will be adjusted to fall before 2am (if
+ \c{nmonths < 0}) or after 3am (otherwise).
- \sa daysTo(), addDays(), addYears(), addSecs()
+ \sa daysTo(), addDays(), addYears(), addSecs(), {Timezone transitions}
*/
QDateTime QDateTime::addMonths(int nmonths) const
@@ -4442,8 +4824,8 @@ QDateTime QDateTime::addMonths(int nmonths) const
return QDateTime();
QDateTime dt(*this);
- QPair<QDate, QTime> p = getDateTime(d);
- massageAdjustedDateTime(dt.d, p.first.addMonths(nmonths), p.second);
+ std::pair<QDate, QTime> p = getDateTime(d);
+ massageAdjustedDateTime(dt.d, p.first.addMonths(nmonths), p.second, nmonths >= 0);
return dt;
}
@@ -4452,13 +4834,14 @@ QDateTime QDateTime::addMonths(int nmonths) const
later than the datetime of this object (or earlier if \a nyears is
negative).
- If the timeSpec() is Qt::LocalTime or Qt::TimeZone and the resulting
- date and time fall in the Standard Time to Daylight-Saving Time transition
- hour then the result will be adjusted accordingly, i.e. if the transition
- is at 2am and the clock goes forward to 3am and the result falls between
- 2am and 3am then the result will be adjusted to fall after 3am.
+ If the timeSpec() is Qt::LocalTime or Qt::TimeZone and the resulting date
+ and time fall in the Standard Time to Daylight-Saving Time transition hour
+ then the result will be just beyond this gap, in the direction of change.
+ If the transition is at 2am and the clock goes forward to 3am, the result of
+ aiming between 2am and 3am will be adjusted to fall before 2am (if \c{nyears
+ < 0}) or after 3am (otherwise).
- \sa daysTo(), addDays(), addMonths(), addSecs()
+ \sa daysTo(), addDays(), addMonths(), addSecs(), {Timezone transitions}
*/
QDateTime QDateTime::addYears(int nyears) const
@@ -4467,8 +4850,8 @@ QDateTime QDateTime::addYears(int nyears) const
return QDateTime();
QDateTime dt(*this);
- QPair<QDate, QTime> p = getDateTime(d);
- massageAdjustedDateTime(dt.d, p.first.addYears(nyears), p.second);
+ std::pair<QDate, QTime> p = getDateTime(d);
+ massageAdjustedDateTime(dt.d, p.first.addYears(nyears), p.second, nyears >= 0);
return dt;
}
@@ -4485,7 +4868,7 @@ QDateTime QDateTime::addYears(int nyears) const
QDateTime QDateTime::addSecs(qint64 s) const
{
qint64 msecs;
- if (mul_overflow(s, std::integral_constant<qint64, MSECS_PER_SEC>(), &msecs))
+ if (qMulOverflow(s, std::integral_constant<qint64, MSECS_PER_SEC>(), &msecs))
return QDateTime();
return addMSecs(msecs);
}
@@ -4509,33 +4892,18 @@ QDateTime QDateTime::addMSecs(qint64 msecs) const
case Qt::LocalTime:
case Qt::TimeZone:
// Convert to real UTC first in case this crosses a DST transition:
- if (!add_overflow(toMSecsSinceEpoch(), msecs, &msecs)) {
+ if (!qAddOverflow(toMSecsSinceEpoch(), msecs, &msecs))
dt.setMSecsSinceEpoch(msecs);
- } else if (dt.d.isShort()) {
- dt.d.data.status &= ~int(QDateTimePrivate::ValidWhenMask);
- } else {
- dt.d.detach();
- dt.d->m_status &= ~QDateTimePrivate::ValidWhenMask;
- }
+ else
+ dt.d.invalidate();
break;
case Qt::UTC:
case Qt::OffsetFromUTC:
// No need to convert, just add on
- if (add_overflow(getMSecs(d), msecs, &msecs)) {
- if (dt.d.isShort()) {
- dt.d.data.status &= ~int(QDateTimePrivate::ValidWhenMask);
- } else {
- dt.d.detach();
- dt.d->m_status &= ~QDateTimePrivate::ValidWhenMask;
- }
- } else if (d.isShort()) {
- // need to check if we need to enlarge first
- if (msecsCanBeSmall(msecs)) {
- dt.d.data.msecs = qintptr(msecs);
- } else {
- dt.d.detach();
- dt.d->m_msecs = msecs;
- }
+ if (qAddOverflow(getMSecs(d), msecs, &msecs)) {
+ dt.d.invalidate();
+ } else if (d.isShort() && msecsCanBeSmall(msecs)) {
+ dt.d.data.msecs = qintptr(msecs);
} else {
dt.d.detach();
dt.d->m_msecs = msecs;
@@ -4546,6 +4914,26 @@ QDateTime QDateTime::addMSecs(qint64 msecs) const
}
/*!
+ \fn QDateTime QDateTime::addDuration(std::chrono::milliseconds msecs) const
+
+ \since 6.4
+
+ Returns a QDateTime object containing a datetime \a msecs milliseconds
+ later than the datetime of this object (or earlier if \a msecs is
+ negative).
+
+ If this datetime is invalid, an invalid datetime will be returned.
+
+ \note Adding durations expressed in \c{std::chrono::months} or
+ \c{std::chrono::years} does not yield the same result obtained by using
+ addMonths() or addYears(). The former are fixed durations, calculated in
+ relation to the solar year; the latter use the Gregorian calendar definitions
+ of months/years.
+
+ \sa addMSecs(), msecsTo(), addDays(), addMonths(), addYears()
+*/
+
+/*!
Returns the number of days from this datetime to the \a other
datetime. The number of days is counted as the number of times
midnight is reached between this datetime to the \a other
@@ -4611,75 +4999,172 @@ qint64 QDateTime::msecsTo(const QDateTime &other) const
}
/*!
- Returns a copy of this datetime converted to the given time
- \a spec.
+ \fn std::chrono::milliseconds QDateTime::operator-(const QDateTime &lhs, const QDateTime &rhs)
+ \since 6.4
+
+ Returns the number of milliseconds between \a lhs and \a rhs.
+ If \a lhs is earlier than \a rhs, the result will be negative.
+
+ Returns 0 if either datetime is invalid.
+
+ \sa msecsTo()
+*/
+
+/*!
+ \fn QDateTime QDateTime::operator+(const QDateTime &dateTime, std::chrono::milliseconds duration)
+ \fn QDateTime QDateTime::operator+(std::chrono::milliseconds duration, const QDateTime &dateTime)
+
+ \since 6.4
+
+ Returns a QDateTime object containing a datetime \a duration milliseconds
+ later than \a dateTime (or earlier if \a duration is negative).
+
+ If \a dateTime is invalid, an invalid datetime will be returned.
+
+ \sa addMSecs()
+*/
+
+/*!
+ \fn QDateTime &QDateTime::operator+=(std::chrono::milliseconds duration)
+ \since 6.4
+
+ Modifies this datetime object by adding the given \a duration.
+ The updated object will be later if \a duration is positive,
+ or earlier if it is negative.
+
+ If this datetime is invalid, this function has no effect.
+
+ Returns a reference to this datetime object.
+
+ \sa addMSecs()
+*/
+
+/*!
+ \fn QDateTime QDateTime::operator-(const QDateTime &dateTime, std::chrono::milliseconds duration)
+
+ \since 6.4
+
+ Returns a QDateTime object containing a datetime \a duration milliseconds
+ earlier than \a dateTime (or later if \a duration is negative).
+
+ If \a dateTime is invalid, an invalid datetime will be returned.
+
+ \sa addMSecs()
+*/
+
+/*!
+ \fn QDateTime &QDateTime::operator-=(std::chrono::milliseconds duration)
+ \since 6.4
+
+ Modifies this datetime object by subtracting the given \a duration.
+ The updated object will be earlier if \a duration is positive,
+ or later if it is negative.
+
+ If this datetime is invalid, this function has no effect.
+
+ Returns a reference to this datetime object.
+
+ \sa addMSecs
+*/
+
+#if QT_DEPRECATED_SINCE(6, 9)
+/*!
+ \deprecated [6.9] Use \l toTimeZone() instead.
+
+ Returns a copy of this datetime converted to the given time \a spec.
- If \a spec is Qt::OffsetFromUTC then it is set to Qt::UTC. To set to a
- spec of Qt::OffsetFromUTC use toOffsetFromUtc().
+ The result represents the same moment in time as, and is equal to, this datetime.
- If \a spec is Qt::TimeZone then it is set to Qt::LocalTime,
- i.e. the local Time Zone.
+ If \a spec is Qt::OffsetFromUTC then it is set to Qt::UTC. To set to a fixed
+ offset from UTC, use toTimeZone() or toOffsetFromUtc().
+
+ If \a spec is Qt::TimeZone then it is set to Qt::LocalTime, i.e. the local
+ Time Zone. To set a specified time-zone, use toTimeZone().
Example:
\snippet code/src_corelib_time_qdatetime.cpp 16
- \sa timeSpec(), toTimeZone(), toOffsetFromUtc()
+ \sa setTimeSpec(), timeSpec(), toTimeZone()
*/
QDateTime QDateTime::toTimeSpec(Qt::TimeSpec spec) const
{
- if (getSpec(d) == spec && (spec == Qt::UTC || spec == Qt::LocalTime))
- return *this;
-
- if (!isValid()) {
- QDateTime ret = *this;
- ret.setTimeSpec(spec);
- return ret;
- }
-
- return fromMSecsSinceEpoch(toMSecsSinceEpoch(), spec, 0);
+ return toTimeZone(asTimeZone(spec, 0, "toTimeSpec"));
}
+#endif // 6.9 deprecation
/*!
\since 5.2
- \fn QDateTime QDateTime::toOffsetFromUtc(int offsetSeconds) const
-
Returns a copy of this datetime converted to a spec of Qt::OffsetFromUTC
- with the given \a offsetSeconds.
+ with the given \a offsetSeconds. Equivalent to
+ \c{toTimeZone(QTimeZone::fromSecondsAheadOfUtc(offsetSeconds))}.
- If the \a offsetSeconds equals 0 then a UTC datetime will be returned
+ If the \a offsetSeconds equals 0 then a UTC datetime will be returned.
- \sa setOffsetFromUtc(), offsetFromUtc(), toTimeSpec()
+ The result represents the same moment in time as, and is equal to, this datetime.
+
+ \sa setOffsetFromUtc(), offsetFromUtc(), toTimeZone()
*/
QDateTime QDateTime::toOffsetFromUtc(int offsetSeconds) const
{
- if (getSpec(d) == Qt::OffsetFromUTC
- && d->m_offsetFromUtc == offsetSeconds)
- return *this;
+ return toTimeZone(QTimeZone::fromSecondsAheadOfUtc(offsetSeconds));
+}
- if (!isValid()) {
- QDateTime ret = *this;
- ret.setOffsetFromUtc(offsetSeconds);
- return ret;
- }
+/*!
+ Returns a copy of this datetime converted to local time.
+
+ The result represents the same moment in time as, and is equal to, this datetime.
- return fromMSecsSinceEpoch(toMSecsSinceEpoch(), Qt::OffsetFromUTC, offsetSeconds);
+ Example:
+
+ \snippet code/src_corelib_time_qdatetime.cpp 17
+
+ \sa toTimeZone(), toUTC(), toOffsetFromUtc()
+*/
+QDateTime QDateTime::toLocalTime() const
+{
+ return toTimeZone(QTimeZone::LocalTime);
+}
+
+/*!
+ Returns a copy of this datetime converted to UTC.
+
+ The result represents the same moment in time as, and is equal to, this datetime.
+
+ Example:
+
+ \snippet code/src_corelib_time_qdatetime.cpp 18
+
+ \sa toTimeZone(), toLocalTime(), toOffsetFromUtc()
+*/
+QDateTime QDateTime::toUTC() const
+{
+ return toTimeZone(QTimeZone::UTC);
}
-#if QT_CONFIG(timezone)
/*!
\since 5.2
- Returns a copy of this datetime converted to the given \a timeZone
+ Returns a copy of this datetime converted to the given \a timeZone.
+
+ The result represents the same moment in time as, and is equal to, this datetime.
+
+ The result describes the moment in time in terms of \a timeZone's time
+ representation. For example:
- \sa timeZone(), toTimeSpec()
+ \snippet code/src_corelib_time_qdatetime.cpp 23
+
+ If \a timeZone is invalid then the datetime will be invalid. Otherwise the
+ returned datetime's timeSpec() will match \c{timeZone.timeSpec()}.
+
+ \sa timeRepresentation(), toLocalTime(), toUTC(), toOffsetFromUtc()
*/
QDateTime QDateTime::toTimeZone(const QTimeZone &timeZone) const
{
- if (getSpec(d) == Qt::TimeZone && d->m_timeZone == timeZone)
+ if (timeRepresentation() == timeZone)
return *this;
if (!isValid()) {
@@ -4690,7 +5175,6 @@ QDateTime QDateTime::toTimeZone(const QTimeZone &timeZone) const
return fromMSecsSinceEpoch(toMSecsSinceEpoch(), timeZone);
}
-#endif // timezone
/*!
\internal
@@ -4717,11 +5201,20 @@ bool QDateTime::equals(const QDateTime &other) const
/*!
\fn bool QDateTime::operator==(const QDateTime &lhs, const QDateTime &rhs)
- Returns \c true if \a lhs is the same as \a rhs; otherwise returns \c false.
+ Returns \c true if \a lhs represents the same moment in time as \a rhs;
+ otherwise returns \c false.
+
+//! [datetime-order-details]
+ Two datetimes using different time representations can have different
+ offsets from UTC. In this case, they may compare equivalent even if their \l
+ date() and \l time() differ, if that difference matches the difference in
+ UTC offset. If their \c date() and \c time() coincide, the one with higher
+ offset from UTC is less (earlier) than the one with lower offset. As a
+ result, datetimes are only weakly ordered.
- Two datetimes are different if either the date, the time, or the time zone
- components are different. Since 5.14, all invalid datetime are equal (and
- less than all valid datetimes).
+ Since 5.14, all invalid datetimes are equivalent and less than all valid
+ datetimes.
+//! [datetime-order-details]
\sa operator!=(), operator<(), operator<=(), operator>(), operator>=()
*/
@@ -4732,33 +5225,24 @@ bool QDateTime::equals(const QDateTime &other) const
Returns \c true if \a lhs is different from \a rhs; otherwise returns \c
false.
- Two datetimes are different if either the date, the time, or the time zone
- components are different. Since 5.14, all invalid datetime are equal (and
- less than all valid datetimes).
+ \include qdatetime.cpp datetime-order-details
\sa operator==()
*/
-/*!
- \internal
- Returns \c true if \a lhs is earlier than the \a rhs
- datetime; otherwise returns \c false.
-
- \sa equals(), operator<()
-*/
-
-bool QDateTime::precedes(const QDateTime &other) const
+Qt::weak_ordering compareThreeWay(const QDateTime &lhs, const QDateTime &rhs)
{
- if (!isValid())
- return other.isValid();
- if (!other.isValid())
- return false;
+ if (!lhs.isValid())
+ return rhs.isValid() ? Qt::weak_ordering::less : Qt::weak_ordering::equivalent;
- if (usesSameOffset(d, other.d))
- return getMSecs(d) < getMSecs(other.d);
+ if (!rhs.isValid())
+ return Qt::weak_ordering::greater; // we know that lhs is valid here
+
+ if (usesSameOffset(lhs.d, rhs.d))
+ return Qt::compareThreeWay(getMSecs(lhs.d), getMSecs(rhs.d));
// Convert to UTC and compare
- return toMSecsSinceEpoch() < other.toMSecsSinceEpoch();
+ return Qt::compareThreeWay(lhs.toMSecsSinceEpoch(), rhs.toMSecsSinceEpoch());
}
/*!
@@ -4767,6 +5251,8 @@ bool QDateTime::precedes(const QDateTime &other) const
Returns \c true if \a lhs is earlier than \a rhs;
otherwise returns \c false.
+ \include qdatetime.cpp datetime-order-details
+
\sa operator==()
*/
@@ -4776,6 +5262,8 @@ bool QDateTime::precedes(const QDateTime &other) const
Returns \c true if \a lhs is earlier than or equal to \a rhs; otherwise
returns \c false.
+ \include qdatetime.cpp datetime-order-details
+
\sa operator==()
*/
@@ -4784,6 +5272,8 @@ bool QDateTime::precedes(const QDateTime &other) const
Returns \c true if \a lhs is later than \a rhs; otherwise returns \c false.
+ \include qdatetime.cpp datetime-order-details
+
\sa operator==()
*/
@@ -4793,33 +5283,53 @@ bool QDateTime::precedes(const QDateTime &other) const
Returns \c true if \a lhs is later than or equal to \a rhs;
otherwise returns \c false.
+ \include qdatetime.cpp datetime-order-details
+
\sa operator==()
*/
/*!
- \fn QDateTime QDateTime::currentDateTime()
- Returns the current datetime, as reported by the system clock, in
- the local time zone.
+ \since 6.5
+ \fn QDateTime QDateTime::currentDateTime(const QTimeZone &zone)
+
+ Returns the system clock's current datetime, using the time representation
+ described by \a zone. If \a zone is omitted, local time is used.
\sa currentDateTimeUtc(), QDate::currentDate(), QTime::currentTime(), toTimeSpec()
*/
/*!
+ \overload
+ \since 0.90
+*/
+QDateTime QDateTime::currentDateTime()
+{
+ return currentDateTime(QTimeZone::LocalTime);
+}
+
+/*!
\fn QDateTime QDateTime::currentDateTimeUtc()
\since 4.7
- Returns the current datetime, as reported by the system clock, in
- UTC.
+ Returns the system clock's current datetime, expressed in terms of UTC.
+
+ Equivalent to \c{currentDateTime(QTimeZone::UTC)}.
\sa currentDateTime(), QDate::currentDate(), QTime::currentTime(), toTimeSpec()
*/
+QDateTime QDateTime::currentDateTimeUtc()
+{
+ return currentDateTime(QTimeZone::UTC);
+}
+
/*!
\fn qint64 QDateTime::currentMSecsSinceEpoch()
\since 4.7
- Returns the number of milliseconds since 1970-01-01T00:00:00 Universal
- Coordinated Time. This number is like the POSIX time_t variable, but
- expressed in milliseconds instead.
+ Returns the current number of milliseconds since the start, in UTC, of the year 1970.
+
+ This number is like the POSIX time_t variable, but expressed in milliseconds
+ instead of seconds.
\sa currentDateTime(), currentDateTimeUtc(), toTimeSpec()
*/
@@ -4828,12 +5338,92 @@ bool QDateTime::precedes(const QDateTime &other) const
\fn qint64 QDateTime::currentSecsSinceEpoch()
\since 5.8
- Returns the number of seconds since 1970-01-01T00:00:00 Universal
- Coordinated Time.
+ Returns the number of seconds since the start, in UTC, of the year 1970.
+
+ This number is like the POSIX time_t variable.
\sa currentMSecsSinceEpoch()
*/
+/*!
+ \fn template <typename Clock, typename Duration> QDateTime QDateTime::fromStdTimePoint(const std::chrono::time_point<Clock, Duration> &time)
+ \since 6.4
+
+ Constructs a datetime representing the same point in time as \a time,
+ using Qt::UTC as its specification.
+
+ The clock of \a time must be compatible with \c{std::chrono::system_clock},
+ and the duration type must be convertible to \c{std::chrono::milliseconds}.
+
+ \note This function requires C++20.
+
+ \sa toStdSysMilliseconds(), fromMSecsSinceEpoch()
+*/
+
+/*!
+ \fn QDateTime QDateTime::fromStdTimePoint(const std::chrono::local_time<std::chrono::milliseconds> &time)
+ \since 6.4
+
+ Constructs a datetime whose date and time are the number of milliseconds
+ represented by \a time, counted since 1970-01-01T00:00:00.000 in local
+ time (Qt::LocalTime).
+
+ \note This function requires C++20.
+
+ \sa toStdSysMilliseconds(), fromMSecsSinceEpoch()
+*/
+
+/*!
+ \fn QDateTime QDateTime::fromStdLocalTime(const std::chrono::local_time<std::chrono::milliseconds> &time)
+ \since 6.4
+
+ Constructs a datetime whose date and time are the number of milliseconds
+ represented by \a time, counted since 1970-01-01T00:00:00.000 in local
+ time (Qt::LocalTime).
+
+ \note This function requires C++20.
+
+ \sa toStdSysMilliseconds(), fromMSecsSinceEpoch()
+*/
+
+/*!
+ \fn QDateTime QDateTime::fromStdZonedTime(const std::chrono::zoned_time<std::chrono::milliseconds, const std::chrono::time_zone *> &time);
+ \since 6.4
+
+ Constructs a datetime representing the same point in time as \a time.
+ The result will be expressed in \a{time}'s time zone.
+
+ \note This function requires C++20.
+
+ \sa QTimeZone
+
+ \sa toStdSysMilliseconds(), fromMSecsSinceEpoch()
+*/
+
+/*!
+ \fn std::chrono::sys_time<std::chrono::milliseconds> QDateTime::toStdSysMilliseconds() const
+ \since 6.4
+
+ Converts this datetime object to the equivalent time point expressed in
+ milliseconds, using \c{std::chrono::system_clock} as a clock.
+
+ \note This function requires C++20.
+
+ \sa fromStdTimePoint(), toMSecsSinceEpoch()
+*/
+
+/*!
+ \fn std::chrono::sys_seconds QDateTime::toStdSysSeconds() const
+ \since 6.4
+
+ Converts this datetime object to the equivalent time point expressed in
+ seconds, using \c{std::chrono::system_clock} as a clock.
+
+ \note This function requires C++20.
+
+ \sa fromStdTimePoint(), toSecsSinceEpoch()
+*/
+
#if defined(Q_OS_WIN)
static inline uint msecsFromDecomposed(int hour, int minute, int sec, int msec = 0)
{
@@ -4856,24 +5446,21 @@ QTime QTime::currentTime()
return ct;
}
-QDateTime QDateTime::currentDateTime()
+QDateTime QDateTime::currentDateTime(const QTimeZone &zone)
{
- QTime t;
+ // We can get local time or "system" time (which is UTC); otherwise, we must
+ // convert, which is most efficiently done from UTC.
+ const Qt::TimeSpec spec = zone.timeSpec();
SYSTEMTIME st = {};
- GetLocalTime(&st);
+ // GetSystemTime()'s page links to its partner page for GetLocalTime().
+ // https://docs.microsoft.com/en-us/windows/win32/api/sysinfoapi/nf-sysinfoapi-getsystemtime
+ (spec == Qt::LocalTime ? GetLocalTime : GetSystemTime)(&st);
QDate d(st.wYear, st.wMonth, st.wDay);
- t.mds = msecsFromDecomposed(st.wHour, st.wMinute, st.wSecond, st.wMilliseconds);
- return QDateTime(d, t);
-}
-
-QDateTime QDateTime::currentDateTimeUtc()
-{
- QTime t;
- SYSTEMTIME st = {};
- GetSystemTime(&st);
- QDate d(st.wYear, st.wMonth, st.wDay);
- t.mds = msecsFromDecomposed(st.wHour, st.wMinute, st.wSecond, st.wMilliseconds);
- return QDateTime(d, t, Qt::UTC);
+ QTime t(msecsFromDecomposed(st.wHour, st.wMinute, st.wSecond, st.wMilliseconds));
+ if (spec == Qt::LocalTime)
+ return QDateTime(d, t);
+ QDateTime utc(d, t, QTimeZone::UTC);
+ return spec == Qt::UTC ? utc : utc.toTimeZone(zone);
}
qint64 QDateTime::currentMSecsSinceEpoch() noexcept
@@ -4896,7 +5483,7 @@ qint64 QDateTime::currentSecsSinceEpoch() noexcept
daysAfterEpoch * SECS_PER_DAY;
}
-#elif defined(Q_OS_UNIX)
+#elif defined(Q_OS_UNIX) // Assume POSIX-compliant
QDate QDate::currentDate()
{
return QDateTime::currentDateTime().date();
@@ -4907,127 +5494,151 @@ QTime QTime::currentTime()
return QDateTime::currentDateTime().time();
}
-QDateTime QDateTime::currentDateTime()
+QDateTime QDateTime::currentDateTime(const QTimeZone &zone)
{
- return fromMSecsSinceEpoch(currentMSecsSinceEpoch(), Qt::LocalTime);
-}
-
-QDateTime QDateTime::currentDateTimeUtc()
-{
- return fromMSecsSinceEpoch(currentMSecsSinceEpoch(), Qt::UTC);
+ return fromMSecsSinceEpoch(currentMSecsSinceEpoch(), zone);
}
qint64 QDateTime::currentMSecsSinceEpoch() noexcept
{
- // posix compliant system
- // we have milliseconds
- struct timeval tv;
- gettimeofday(&tv, nullptr);
- return tv.tv_sec * MSECS_PER_SEC + tv.tv_usec / 1000;
+ struct timespec when;
+ if (clock_gettime(CLOCK_REALTIME, &when) == 0) // should always succeed
+ return when.tv_sec * MSECS_PER_SEC + (when.tv_nsec + 500'000) / 1'000'000;
+ Q_UNREACHABLE_RETURN(0);
}
qint64 QDateTime::currentSecsSinceEpoch() noexcept
{
- struct timeval tv;
- gettimeofday(&tv, nullptr);
- return tv.tv_sec;
+ struct timespec when;
+ if (clock_gettime(CLOCK_REALTIME, &when) == 0) // should always succeed
+ return when.tv_sec;
+ Q_UNREACHABLE_RETURN(0);
}
#else
#error "What system is this?"
#endif
+#if QT_DEPRECATED_SINCE(6, 9)
/*!
- Returns a datetime whose date and time are the number of milliseconds \a msecs
- that have passed since 1970-01-01T00:00:00.000, Coordinated Universal
- Time (Qt::UTC) and converted to the given \a spec.
+ \since 5.2
+ \overload
+ \deprecated [6.9] Pass a \l QTimeZone instead, or omit \a spec and \a offsetSeconds.
+
+ Returns a datetime representing a moment the given number \a msecs of
+ milliseconds after the start, in UTC, of the year 1970, described as
+ specified by \a spec and \a offsetSeconds.
- Note that there are possible values for \a msecs that lie outside the valid
- range of QDateTime, both negative and positive. The behavior of this
- function is undefined for those values.
+ Note that there are possible values for \a msecs that lie outside the valid
+ range of QDateTime, both negative and positive. The behavior of this
+ function is undefined for those values.
- If the \a spec is not Qt::OffsetFromUTC then the \a offsetSeconds will be
- ignored. If the \a spec is Qt::OffsetFromUTC and the \a offsetSeconds is 0
- then the spec will be set to Qt::UTC, i.e. an offset of 0 seconds.
+ If the \a spec is not Qt::OffsetFromUTC then the \a offsetSeconds will be
+ ignored. If the \a spec is Qt::OffsetFromUTC and the \a offsetSeconds is 0
+ then Qt::UTC will be used as the \a spec, since UTC has zero offset.
- If \a spec is Qt::TimeZone then the spec will be set to Qt::LocalTime,
- i.e. the current system time zone.
+ If \a spec is Qt::TimeZone then Qt::LocalTime will be used in its place,
+ equivalent to using the current system time zone (but differently
+ represented).
- \sa toMSecsSinceEpoch(), setMSecsSinceEpoch()
+ \sa fromSecsSinceEpoch(), toMSecsSinceEpoch(), setMSecsSinceEpoch()
*/
QDateTime QDateTime::fromMSecsSinceEpoch(qint64 msecs, Qt::TimeSpec spec, int offsetSeconds)
{
- QDateTime dt;
- QT_PREPEND_NAMESPACE(setTimeSpec(dt.d, spec, offsetSeconds));
- dt.setMSecsSinceEpoch(msecs);
- return dt;
+ return fromMSecsSinceEpoch(msecs,
+ asTimeZone(spec, offsetSeconds, "QDateTime::fromMSecsSinceEpoch"));
}
/*!
- \since 5.8
+ \since 5.8
+ \overload
+ \deprecated [6.9] Pass a \l QTimeZone instead, or omit \a spec and \a offsetSeconds.
- Returns a datetime whose date and time are the number of seconds \a secs
- that have passed since 1970-01-01T00:00:00.000, Coordinated Universal
- Time (Qt::UTC) and converted to the given \a spec.
+ Returns a datetime representing a moment the given number \a secs of seconds
+ after the start, in UTC, of the year 1970, described as specified by \a spec
+ and \a offsetSeconds.
- Note that there are possible values for \a secs that lie outside the valid
- range of QDateTime, both negative and positive. The behavior of this
- function is undefined for those values.
+ Note that there are possible values for \a secs that lie outside the valid
+ range of QDateTime, both negative and positive. The behavior of this
+ function is undefined for those values.
- If the \a spec is not Qt::OffsetFromUTC then the \a offsetSeconds will be
- ignored. If the \a spec is Qt::OffsetFromUTC and the \a offsetSeconds is 0
- then the spec will be set to Qt::UTC, i.e. an offset of 0 seconds.
+ If the \a spec is not Qt::OffsetFromUTC then the \a offsetSeconds will be
+ ignored. If the \a spec is Qt::OffsetFromUTC and the \a offsetSeconds is 0
+ then Qt::UTC will be used as the \a spec, since UTC has zero offset.
- If \a spec is Qt::TimeZone then the spec will be set to Qt::LocalTime,
- i.e. the current system time zone.
+ If \a spec is Qt::TimeZone then Qt::LocalTime will be used in its place,
+ equivalent to using the current system time zone (but differently
+ represented).
- \sa toSecsSinceEpoch(), setSecsSinceEpoch()
+ \sa fromMSecsSinceEpoch(), toSecsSinceEpoch(), setSecsSinceEpoch()
*/
QDateTime QDateTime::fromSecsSinceEpoch(qint64 secs, Qt::TimeSpec spec, int offsetSeconds)
{
- constexpr qint64 maxSeconds = std::numeric_limits<qint64>::max() / MSECS_PER_SEC;
- constexpr qint64 minSeconds = std::numeric_limits<qint64>::min() / MSECS_PER_SEC;
- if (secs > maxSeconds || secs < minSeconds)
- return QDateTime(); // Would {und,ov}erflow
- return fromMSecsSinceEpoch(secs * MSECS_PER_SEC, spec, offsetSeconds);
+ return fromSecsSinceEpoch(secs,
+ asTimeZone(spec, offsetSeconds, "QDateTime::fromSecsSinceEpoch"));
}
+#endif // 6.9 deprecations
-#if QT_CONFIG(timezone)
/*!
\since 5.2
- Returns a datetime whose date and time are the number of milliseconds \a msecs
- that have passed since 1970-01-01T00:00:00.000, Coordinated Universal
- Time (Qt::UTC) and with the given \a timeZone.
+ Returns a datetime representing a moment the given number \a msecs of
+ milliseconds after the start, in UTC, of the year 1970, described as
+ specified by \a timeZone. The default time representation is local time.
+
+ Note that there are possible values for \a msecs that lie outside the valid
+ range of QDateTime, both negative and positive. The behavior of this
+ function is undefined for those values.
- \sa fromSecsSinceEpoch()
+ \sa fromSecsSinceEpoch(), toMSecsSinceEpoch(), setMSecsSinceEpoch()
*/
QDateTime QDateTime::fromMSecsSinceEpoch(qint64 msecs, const QTimeZone &timeZone)
{
QDateTime dt;
- dt.setTimeZone(timeZone);
+ reviseTimeZone(dt.d, timeZone, TransitionResolution::Reject);
if (timeZone.isValid())
dt.setMSecsSinceEpoch(msecs);
return dt;
}
/*!
+ \since 6.5
+ \overload
+*/
+QDateTime QDateTime::fromMSecsSinceEpoch(qint64 msecs)
+{
+ return fromMSecsSinceEpoch(msecs, QTimeZone::LocalTime);
+}
+
+/*!
\since 5.8
- Returns a datetime whose date and time are the number of seconds \a secs
- that have passed since 1970-01-01T00:00:00.000, Coordinated Universal
- Time (Qt::UTC) and with the given \a timeZone.
+ Returns a datetime representing a moment the given number \a secs of seconds
+ after the start, in UTC, of the year 1970, described as specified by \a
+ timeZone. The default time representation is local time.
+
+ Note that there are possible values for \a secs that lie outside the valid
+ range of QDateTime, both negative and positive. The behavior of this
+ function is undefined for those values.
- \sa fromMSecsSinceEpoch()
+ \sa fromMSecsSinceEpoch(), toSecsSinceEpoch(), setSecsSinceEpoch()
*/
QDateTime QDateTime::fromSecsSinceEpoch(qint64 secs, const QTimeZone &timeZone)
{
- constexpr qint64 maxSeconds = std::numeric_limits<qint64>::max() / MSECS_PER_SEC;
- constexpr qint64 minSeconds = std::numeric_limits<qint64>::min() / MSECS_PER_SEC;
- if (secs > maxSeconds || secs < minSeconds)
- return QDateTime(); // Would {und,ov}erflow
- return fromMSecsSinceEpoch(secs * MSECS_PER_SEC, timeZone);
+ QDateTime dt;
+ reviseTimeZone(dt.d, timeZone, TransitionResolution::Reject);
+ if (timeZone.isValid())
+ dt.setSecsSinceEpoch(secs);
+ return dt;
+}
+
+/*!
+ \since 6.5
+ \overload
+*/
+QDateTime QDateTime::fromSecsSinceEpoch(qint64 secs)
+{
+ return fromSecsSinceEpoch(secs, QTimeZone::LocalTime);
}
-#endif
#if QT_CONFIG(datestring) // depends on, so implies, textdate
@@ -5059,8 +5670,8 @@ QDateTime QDateTime::fromString(QStringView string, Qt::DateFormat format)
if (!rfc.date.isValid() || !rfc.time.isValid())
return QDateTime();
- QDateTime dateTime(rfc.date, rfc.time, Qt::UTC);
- dateTime.setOffsetFromUtc(rfc.utcOffset);
+ QDateTime dateTime(rfc.date, rfc.time, QTimeZone::UTC);
+ dateTime.setTimeZone(QTimeZone::fromSecondsAheadOfUtc(rfc.utcOffset));
return dateTime;
}
case Qt::ISODate:
@@ -5075,7 +5686,7 @@ QDateTime QDateTime::fromString(QStringView string, Qt::DateFormat format)
if (size == 10)
return date.startOfDay();
- Qt::TimeSpec spec = Qt::LocalTime;
+ QTimeZone zone = QTimeZone::LocalTime;
QStringView isoString = string.sliced(10); // trim "yyyy-MM-dd"
// Must be left with T (or space) and at least one digit for the hour:
@@ -5089,10 +5700,9 @@ QDateTime QDateTime::fromString(QStringView string, Qt::DateFormat format)
}
isoString = isoString.sliced(1); // trim 'T' (or space)
- int offset = 0;
- // Check end of string for Time Zone definition, either Z for UTC or [+-]HH:mm for Offset
+ // Check end of string for Time Zone definition, either Z for UTC or ±HH:mm for Offset
if (isoString.endsWith(u'Z', Qt::CaseInsensitive)) {
- spec = Qt::UTC;
+ zone = QTimeZone::UTC;
isoString.chop(1); // trim 'Z'
} else {
// the loop below is faster but functionally equal to:
@@ -5107,11 +5717,11 @@ QDateTime QDateTime::fromString(QStringView string, Qt::DateFormat format)
if (found) {
bool ok;
- offset = fromOffsetString(isoString.sliced(signIndex), &ok);
+ int offset = fromOffsetString(isoString.sliced(signIndex), &ok);
if (!ok)
return QDateTime();
isoString = isoString.first(signIndex);
- spec = Qt::OffsetFromUTC;
+ zone = QTimeZone::fromSecondsAheadOfUtc(offset);
}
}
@@ -5122,8 +5732,8 @@ QDateTime QDateTime::fromString(QStringView string, Qt::DateFormat format)
if (!time.isValid())
return QDateTime();
if (isMidnight24) // time is 0:0, but we want the start of next day:
- return date.addDays(1).startOfDay(spec, offset);
- return QDateTime(date, time, spec, offset);
+ return date.addDays(1).startOfDay(zone);
+ return QDateTime(date, time, zone);
}
case Qt::TextDate: {
QVarLengthArray<QStringView, 6> parts;
@@ -5135,7 +5745,7 @@ QDateTime QDateTime::fromString(QStringView string, Qt::DateFormat format)
// Documented as "ddd MMM d HH:mm:ss yyyy" with optional offset-suffix;
// and allow time either before or after year.
- if (parts.count() < 5 || it != tokens.end())
+ if (parts.size() < 5 || it != tokens.end())
return QDateTime();
// Year and time can be in either order.
@@ -5164,19 +5774,20 @@ QDateTime QDateTime::fromString(QStringView string, Qt::DateFormat format)
if (!time.isValid())
return QDateTime();
- if (parts.count() == 5)
- return QDateTime(date, time, Qt::LocalTime);
+ if (parts.size() == 5)
+ return QDateTime(date, time);
QStringView tz = parts.at(5);
- if (tz.startsWith(QLatin1String("UTC"))
+ if (tz.startsWith("UTC"_L1)
// GMT has long been deprecated as an alias for UTC.
- || tz.startsWith(QLatin1String("GMT"), Qt::CaseInsensitive)) {
+ || tz.startsWith("GMT"_L1, Qt::CaseInsensitive)) {
tz = tz.sliced(3);
if (tz.isEmpty())
- return QDateTime(date, time, Qt::UTC);
+ return QDateTime(date, time, QTimeZone::UTC);
int offset = fromOffsetString(tz, &ok);
- return ok ? QDateTime(date, time, Qt::OffsetFromUTC, offset) : QDateTime();
+ return ok ? QDateTime(date, time, QTimeZone::fromSecondsAheadOfUtc(offset))
+ : QDateTime();
}
return QDateTime();
}
@@ -5186,20 +5797,33 @@ QDateTime QDateTime::fromString(QStringView string, Qt::DateFormat format)
}
/*!
- \fn QDateTime QDateTime::fromString(const QString &string, const QString &format, QCalendar cal)
+ \fn QDateTime QDateTime::fromString(const QString &string, const QString &format, int baseYear, QCalendar cal)
Returns the QDateTime represented by the \a string, using the \a
format given, or an invalid datetime if the string cannot be parsed.
Uses the calendar \a cal if supplied, else Gregorian.
+ \include qlocale.cpp base-year-for-two-digit
+
In addition to the expressions, recognized in the format string to represent
parts of the date and time, by QDate::fromString() and QTime::fromString(),
this method supports:
\table
\header \li Expression \li Output
- \row \li t \li the timezone (for example "CEST")
+ \row \li t
+ \li the timezone (offset, name, "Z" or offset with "UTC" prefix)
+ \row \li tt
+ \li the timezone in offset format with no colon between hours and
+ minutes (for example "+0200")
+ \row \li ttt
+ \li the timezone in offset format with a colon between hours and
+ minutes (for example "+02:00")
+ \row \li tttt
+ \li the timezone name (for example "Europe/Berlin"). The name
+ recognized are those known to \l QTimeZone, which may depend on the
+ operating system in use.
\endtable
If no 't' format specifier is present, the system's local time-zone is used.
@@ -5216,11 +5840,9 @@ QDateTime QDateTime::fromString(QStringView string, Qt::DateFormat format)
\snippet code/src_corelib_time_qdatetime.cpp 12
If the format is not satisfied, an invalid QDateTime is returned. If the
- format is satisfied but \a string represents an invalid date-time (e.g. in a
- gap skipped by a time-zone transition), an invalid QDateTime is returned,
- whose toMSecsSinceEpoch() represents a near-by date-time that is
- valid. Passing that to fromMSecsSinceEpoch() will produce a valid date-time
- that isn't faithfully represented by the string parsed.
+ format is satisfied but \a string represents an invalid datetime (e.g. in a
+ gap skipped by a time-zone transition), an valid QDateTime is returned, that
+ represents a near-by datetime that is valid.
The expressions that don't have leading zeroes (d, M, h, m, s, z) will be
greedy. This means that they will use two digits (or three, for z) even if this will
@@ -5248,6 +5870,15 @@ QDateTime QDateTime::fromString(QStringView string, Qt::DateFormat format)
English (C locale). If localized month and day names or localized forms of
AM/PM are to be recognized, use QLocale::system().toDateTime().
+ \note If a format character is repeated more times than the longest
+ expression in the table above using it, this part of the format will be read
+ as several expressions with no separator between them; the longest above,
+ possibly repeated as many times as there are copies of it, ending with a
+ residue that may be a shorter expression. Thus \c{'tttttt'} would match
+ \c{"Europe/BerlinEurope/Berlin"} and set the zone to Berlin time; if the
+ datetime string contained "Europe/BerlinZ" it would "match" but produce an
+ inconsistent result, leading to an invalid datetime.
+
\sa toString(), QDate::fromString(), QTime::fromString(),
QLocale::toDateTime()
*/
@@ -5262,49 +5893,72 @@ QDateTime QDateTime::fromString(QStringView string, Qt::DateFormat format)
\overload
\since 6.0
*/
-QDateTime QDateTime::fromString(const QString &string, QStringView format, QCalendar cal)
+QDateTime QDateTime::fromString(const QString &string, QStringView format, int baseYear,
+ QCalendar cal)
{
#if QT_CONFIG(datetimeparser)
QDateTime datetime;
QDateTimeParser dt(QMetaType::QDateTime, QDateTimeParser::FromString, cal);
dt.setDefaultLocale(QLocale::c());
- if (dt.parseFormat(format) && (dt.fromString(string, &datetime) || !datetime.isValid()))
+ if (dt.parseFormat(format) && (dt.fromString(string, &datetime, baseYear)
+ || !datetime.isValid())) {
return datetime;
+ }
#else
Q_UNUSED(string);
Q_UNUSED(format);
+ Q_UNUSED(baseYear);
Q_UNUSED(cal);
#endif
return QDateTime();
}
-#endif // datestring
/*!
- \fn QDateTime QDateTime::toLocalTime() const
+ \fn QDateTime QDateTime::fromString(const QString &string, const QString &format, QCalendar cal)
+ \overload
+ \since 5.14
+*/
- Returns a datetime containing the date and time information in
- this datetime, but specified using the Qt::LocalTime definition.
+/*!
+ \fn QDateTime QDateTime::fromString(const QString &string, QStringView format, QCalendar cal)
+ \overload
+ \since 6.0
+*/
- Example:
+/*!
+ \fn QDateTime QDateTime::fromString(QStringView string, QStringView format, int baseYear, QCalendar cal)
+ \overload
+ \since 6.7
+*/
- \snippet code/src_corelib_time_qdatetime.cpp 17
+/*!
+ \fn QDateTime QDateTime::fromString(QStringView string, QStringView format, int baseYear)
+ \overload
+ \since 6.7
- \sa toTimeSpec()
+ Uses a default-constructed QCalendar.
*/
/*!
- \fn QDateTime QDateTime::toUTC() const
-
- Returns a datetime containing the date and time information in
- this datetime, but specified using the Qt::UTC definition.
+ \overload
+ \since 6.7
- Example:
+ Uses a default-constructed QCalendar.
+*/
+QDateTime QDateTime::fromString(const QString &string, QStringView format, int baseYear)
+{
+ return fromString(string, format, baseYear, QCalendar());
+}
- \snippet code/src_corelib_time_qdatetime.cpp 18
+/*!
+ \fn QDateTime QDateTime::fromString(const QString &string, const QString &format, int baseYear)
+ \overload
+ \since 6.7
- \sa toTimeSpec()
+ Uses a default-constructed QCalendar.
*/
+#endif // datestring
/*****************************************************************************
Date/time stream functions
@@ -5343,9 +5997,7 @@ QDataStream &operator>>(QDataStream &in, QDate &date)
// Older versions consider 0 an invalid jd.
date.jd = (jd != 0 ? jd : QDate::nullJd());
} else {
- qint64 jd;
- in >> jd;
- date.jd = jd;
+ in >> date.jd;
}
return in;
@@ -5399,11 +6051,12 @@ QDataStream &operator>>(QDataStream &in, QTime &time)
*/
QDataStream &operator<<(QDataStream &out, const QDateTime &dateTime)
{
- QPair<QDate, QTime> dateAndTime;
+ std::pair<QDate, QTime> dateAndTime;
+ // TODO: new version, route spec and details via QTimeZone
if (out.version() >= QDataStream::Qt_5_2) {
- // In 5.2 we switched to using Qt::TimeSpec and added offset support
+ // In 5.2 we switched to using Qt::TimeSpec and added offset and zone support
dateAndTime = getDateTime(dateTime.d);
out << dateAndTime << qint8(dateTime.timeSpec());
if (dateTime.timeSpec() == Qt::OffsetFromUTC)
@@ -5466,67 +6119,61 @@ QDataStream &operator>>(QDataStream &in, QDateTime &dateTime)
QDate dt;
QTime tm;
qint8 ts = 0;
- Qt::TimeSpec spec = Qt::LocalTime;
- qint32 offset = 0;
-#if QT_CONFIG(timezone)
- QTimeZone tz;
-#endif // timezone
+ QTimeZone zone(QTimeZone::LocalTime);
if (in.version() >= QDataStream::Qt_5_2) {
- // In 5.2 we switched to using Qt::TimeSpec and added offset support
+ // In 5.2 we switched to using Qt::TimeSpec and added offset and zone support
in >> dt >> tm >> ts;
- spec = static_cast<Qt::TimeSpec>(ts);
- if (spec == Qt::OffsetFromUTC) {
+ switch (static_cast<Qt::TimeSpec>(ts)) {
+ case Qt::UTC:
+ zone = QTimeZone::UTC;
+ break;
+ case Qt::OffsetFromUTC: {
+ qint32 offset = 0;
in >> offset;
- dateTime = QDateTime(dt, tm, spec, offset);
-#if QT_CONFIG(timezone)
- } else if (spec == Qt::TimeZone) {
- in >> tz;
- dateTime = QDateTime(dt, tm, tz);
-#endif // timezone
- } else {
- dateTime = QDateTime(dt, tm, spec);
+ zone = QTimeZone::fromSecondsAheadOfUtc(offset);
+ break;
}
+ case Qt::LocalTime:
+ break;
+ case Qt::TimeZone:
+ in >> zone;
+ break;
+ }
+ // Note: no way to resolve transition ambiguity, when relevant; use default.
+ dateTime = QDateTime(dt, tm, zone);
} else if (in.version() == QDataStream::Qt_5_0) {
// In Qt 5.0 we incorrectly serialised all datetimes as UTC
in >> dt >> tm >> ts;
- spec = static_cast<Qt::TimeSpec>(ts);
- dateTime = QDateTime(dt, tm, Qt::UTC);
- dateTime = dateTime.toTimeSpec(spec);
+ dateTime = QDateTime(dt, tm, QTimeZone::UTC);
+ if (static_cast<Qt::TimeSpec>(ts) == Qt::LocalTime)
+ dateTime = dateTime.toTimeZone(zone);
} else if (in.version() >= QDataStream::Qt_4_0) {
// From 4.0 to 5.1 (except 5.0) we used QDateTimePrivate::Spec
in >> dt >> tm >> ts;
- switch ((QDateTimePrivate::Spec)ts) {
+ switch (static_cast<QDateTimePrivate::Spec>(ts)) {
+ case QDateTimePrivate::OffsetFromUTC: // No offset was stored, so treat as UTC.
case QDateTimePrivate::UTC:
- spec = Qt::UTC;
- break;
- case QDateTimePrivate::OffsetFromUTC:
- spec = Qt::OffsetFromUTC;
- break;
- case QDateTimePrivate::TimeZone:
- spec = Qt::TimeZone;
-#if QT_CONFIG(timezone)
- // FIXME: need to use a different constructor !
-#endif
+ zone = QTimeZone::UTC;
break;
+ case QDateTimePrivate::TimeZone: // No zone was stored, so treat as LocalTime:
case QDateTimePrivate::LocalUnknown:
case QDateTimePrivate::LocalStandard:
case QDateTimePrivate::LocalDST:
- spec = Qt::LocalTime;
break;
}
- dateTime = QDateTime(dt, tm, spec, offset);
+ dateTime = QDateTime(dt, tm, zone);
} else { // version < QDataStream::Qt_4_0
// Before 4.0 there was no TimeSpec, only Qt::LocalTime was supported
in >> dt >> tm;
- dateTime = QDateTime(dt, tm, spec, offset);
+ dateTime = QDateTime(dt, tm);
}
@@ -5544,7 +6191,11 @@ QDebug operator<<(QDebug dbg, QDate date)
QDebugStateSaver saver(dbg);
dbg.nospace() << "QDate(";
if (date.isValid())
- dbg.nospace() << date.toString(Qt::ISODate);
+ // QTBUG-91070, ISODate only supports years in the range 0-9999
+ if (int y = date.year(); y > 0 && y <= 9999)
+ dbg.nospace() << date.toString(Qt::ISODate);
+ else
+ dbg.nospace() << date.toString(Qt::TextDate);
else
dbg.nospace() << "Invalid";
dbg.nospace() << ')';
diff --git a/src/corelib/time/qdatetime.h b/src/corelib/time/qdatetime.h
index 80227afde2..e1c0d29e2a 100644
--- a/src/corelib/time/qdatetime.h
+++ b/src/corelib/time/qdatetime.h
@@ -1,52 +1,19 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Copyright (C) 2021 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// Copyright (C) 2021 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QDATETIME_H
#define QDATETIME_H
-#include <QtCore/qstring.h>
+#include <QtCore/qcalendar.h>
+#include <QtCore/qcompare.h>
+#include <QtCore/qlocale.h>
#include <QtCore/qnamespace.h>
#include <QtCore/qshareddata.h>
-#include <QtCore/qcalendar.h>
+#include <QtCore/qstring.h>
#include <limits>
+#include <chrono>
#if defined(Q_OS_DARWIN) || defined(Q_QDOC)
Q_FORWARD_DECLARE_CF_TYPE(CFDate);
@@ -55,9 +22,7 @@ Q_FORWARD_DECLARE_OBJC_CLASS(NSDate);
QT_BEGIN_NAMESPACE
-#if QT_CONFIG(timezone)
class QTimeZone;
-#endif
class QDateTime;
class Q_CORE_EXPORT QDate
@@ -67,6 +32,40 @@ public:
constexpr QDate() : jd(nullJd()) {}
QDate(int y, int m, int d);
QDate(int y, int m, int d, QCalendar cal);
+#if __cpp_lib_chrono >= 201907L || defined(Q_QDOC)
+ QT_POST_CXX17_API_IN_EXPORTED_CLASS
+ Q_IMPLICIT constexpr QDate(std::chrono::year_month_day date) noexcept
+ : jd(date.ok() ? stdSysDaysToJulianDay(date) : nullJd())
+ {}
+
+ QT_POST_CXX17_API_IN_EXPORTED_CLASS
+ Q_IMPLICIT constexpr QDate(std::chrono::year_month_day_last date) noexcept
+ : jd(date.ok() ? stdSysDaysToJulianDay(date) : nullJd())
+ {}
+
+ QT_POST_CXX17_API_IN_EXPORTED_CLASS
+ Q_IMPLICIT constexpr QDate(std::chrono::year_month_weekday date) noexcept
+ : jd(date.ok() ? stdSysDaysToJulianDay(date) : nullJd())
+ {}
+
+ QT_POST_CXX17_API_IN_EXPORTED_CLASS
+ Q_IMPLICIT constexpr QDate(std::chrono::year_month_weekday_last date) noexcept
+ : jd(date.ok() ? stdSysDaysToJulianDay(date) : nullJd())
+ {}
+
+ QT_POST_CXX17_API_IN_EXPORTED_CLASS
+ static constexpr QDate fromStdSysDays(const std::chrono::sys_days &days) noexcept
+ {
+ return QDate(stdSysDaysToJulianDay(days));
+ }
+
+ QT_POST_CXX17_API_IN_EXPORTED_CLASS
+ constexpr std::chrono::sys_days toStdSysDays() const noexcept
+ {
+ const qint64 days = isValid() ? jd - unixEpochJd() : 0;
+ return std::chrono::sys_days(std::chrono::days(days));
+ }
+#endif
constexpr bool isNull() const { return !isValid(); }
constexpr bool isValid() const { return jd >= minJd() && jd <= maxJd(); }
@@ -89,20 +88,25 @@ public:
int daysInMonth(QCalendar cal) const;
int daysInYear(QCalendar cal) const;
- QDateTime startOfDay(Qt::TimeSpec spec = Qt::LocalTime, int offsetSeconds = 0) const;
- QDateTime endOfDay(Qt::TimeSpec spec = Qt::LocalTime, int offsetSeconds = 0) const;
-#if QT_CONFIG(timezone)
+#if QT_DEPRECATED_SINCE(6, 9)
+ QT_DEPRECATED_VERSION_X_6_9("Pass QTimeZone instead")
+ QDateTime startOfDay(Qt::TimeSpec spec, int offsetSeconds = 0) const;
+ QT_DEPRECATED_VERSION_X_6_9("Pass QTimeZone instead")
+ QDateTime endOfDay(Qt::TimeSpec spec, int offsetSeconds = 0) const;
+#endif
+
QDateTime startOfDay(const QTimeZone &zone) const;
QDateTime endOfDay(const QTimeZone &zone) const;
-#endif
+ QDateTime startOfDay() const;
+ QDateTime endOfDay() const;
#if QT_CONFIG(datestring)
QString toString(Qt::DateFormat format = Qt::TextDate) const;
-# if QT_STRINGVIEW_LEVEL < 2
- QString toString(const QString &format, QCalendar cal = QCalendar()) const
+ QString toString(const QString &format) const;
+ QString toString(const QString &format, QCalendar cal) const
{ return toString(qToStringViewIgnoringNull(format), cal); }
-# endif
- QString toString(QStringView format, QCalendar cal = QCalendar()) const;
+ QString toString(QStringView format) const;
+ QString toString(QStringView format, QCalendar cal) const;
#endif
bool setDate(int year, int month, int day); // Gregorian-optimized
bool setDate(int year, int month, int day, QCalendar cal);
@@ -110,6 +114,13 @@ public:
void getDate(int *year, int *month, int *day) const;
[[nodiscard]] QDate addDays(qint64 days) const;
+#if __cpp_lib_chrono >= 201907L || defined(Q_QDOC)
+ QT_POST_CXX17_API_IN_EXPORTED_CLASS
+ [[nodiscard]] QDate addDuration(std::chrono::days days) const
+ {
+ return addDays(days.count());
+ }
+#endif
// Gregorian-optimized:
[[nodiscard]] QDate addMonths(int months) const;
[[nodiscard]] QDate addYears(int years) const;
@@ -119,17 +130,37 @@ public:
static QDate currentDate();
#if QT_CONFIG(datestring)
+ // No DateFormat accepts a two-digit year, so no need for baseYear:
static QDate fromString(QStringView string, Qt::DateFormat format = Qt::TextDate);
- static QDate fromString(QStringView string, QStringView format, QCalendar cal = QCalendar())
- { return fromString(string.toString(), format, cal); }
- static QDate fromString(const QString &string, QStringView format, QCalendar cal = QCalendar());
-# if QT_STRINGVIEW_LEVEL < 2
static QDate fromString(const QString &string, Qt::DateFormat format = Qt::TextDate)
{ return fromString(qToStringViewIgnoringNull(string), format); }
+
+ // Accept calendar without over-ride of base year:
+ static QDate fromString(QStringView string, QStringView format, QCalendar cal)
+ { return fromString(string.toString(), format, QLocale::DefaultTwoDigitBaseYear, cal); }
+ QT_CORE_INLINE_SINCE(6, 7)
+ static QDate fromString(const QString &string, QStringView format, QCalendar cal);
+ static QDate fromString(const QString &string, const QString &format, QCalendar cal)
+ { return fromString(string, qToStringViewIgnoringNull(format), QLocale::DefaultTwoDigitBaseYear, cal); }
+
+ // Overriding base year is likely more common than overriding calendar (and
+ // likely to get more so, as the legacy base drops ever further behind us).
+ static QDate fromString(QStringView string, QStringView format,
+ int baseYear = QLocale::DefaultTwoDigitBaseYear)
+ { return fromString(string.toString(), format, baseYear); }
+ static QDate fromString(QStringView string, QStringView format,
+ int baseYear, QCalendar cal)
+ { return fromString(string.toString(), format, baseYear, cal); }
+ static QDate fromString(const QString &string, QStringView format,
+ int baseYear = QLocale::DefaultTwoDigitBaseYear);
+ static QDate fromString(const QString &string, QStringView format,
+ int baseYear, QCalendar cal);
static QDate fromString(const QString &string, const QString &format,
- QCalendar cal = QCalendar())
- { return fromString(string, qToStringViewIgnoringNull(format), cal); }
-# endif
+ int baseYear = QLocale::DefaultTwoDigitBaseYear)
+ { return fromString(string, qToStringViewIgnoringNull(format), baseYear); }
+ static QDate fromString(const QString &string, const QString &format,
+ int baseYear, QCalendar cal)
+ { return fromString(string, qToStringViewIgnoringNull(format), baseYear, cal); }
#endif
static bool isValid(int y, int m, int d);
static bool isLeapYear(int year);
@@ -143,18 +174,36 @@ private:
static constexpr inline qint64 nullJd() { return (std::numeric_limits<qint64>::min)(); }
static constexpr inline qint64 minJd() { return Q_INT64_C(-784350574879); }
static constexpr inline qint64 maxJd() { return Q_INT64_C( 784354017364); }
+ static constexpr inline qint64 unixEpochJd() { return Q_INT64_C(2440588); }
+
+#if __cpp_lib_chrono >= 201907L
+ static constexpr qint64 stdSysDaysToJulianDay(const std::chrono::sys_days &days) noexcept
+ {
+ const auto epochDays = days.time_since_epoch().count();
+ // minJd() and maxJd() fit into 40 bits.
+ if constexpr (sizeof(epochDays) * CHAR_BIT >= 41) {
+ constexpr auto top = maxJd() - unixEpochJd();
+ constexpr auto bottom = minJd() - unixEpochJd();
+ if (epochDays > top || epochDays < bottom)
+ return nullJd();
+ }
+ return unixEpochJd() + epochDays;
+ }
+#endif // __cpp_lib_chrono >= 201907L
qint64 jd;
friend class QDateTime;
+ friend class QDateTimeParser;
friend class QDateTimePrivate;
- friend constexpr bool operator==(QDate lhs, QDate rhs) { return lhs.jd == rhs.jd; }
- friend constexpr bool operator!=(QDate lhs, QDate rhs) { return lhs.jd != rhs.jd; }
- friend constexpr bool operator< (QDate lhs, QDate rhs) { return lhs.jd < rhs.jd; }
- friend constexpr bool operator<=(QDate lhs, QDate rhs) { return lhs.jd <= rhs.jd; }
- friend constexpr bool operator> (QDate lhs, QDate rhs) { return lhs.jd > rhs.jd; }
- friend constexpr bool operator>=(QDate lhs, QDate rhs) { return lhs.jd >= rhs.jd; }
+ friend constexpr bool comparesEqual(const QDate &lhs, const QDate &rhs) noexcept
+ { return lhs.jd == rhs.jd; }
+ friend constexpr Qt::strong_ordering
+ compareThreeWay(const QDate &lhs, const QDate &rhs) noexcept
+ { return Qt::compareThreeWay(lhs.jd, rhs.jd); }
+ Q_DECLARE_STRONGLY_ORDERED_LITERAL_TYPE(QDate)
+
#ifndef QT_NO_DATASTREAM
friend Q_CORE_EXPORT QDataStream &operator<<(QDataStream &, QDate);
friend Q_CORE_EXPORT QDataStream &operator>>(QDataStream &, QDate &);
@@ -180,10 +229,8 @@ public:
int msec() const;
#if QT_CONFIG(datestring)
QString toString(Qt::DateFormat f = Qt::TextDate) const;
-#if QT_STRINGVIEW_LEVEL < 2
QString toString(const QString &format) const
{ return toString(qToStringViewIgnoringNull(format)); }
-#endif
QString toString(QStringView format) const;
#endif
bool setHMS(int h, int m, int s, int ms = 0);
@@ -202,12 +249,10 @@ public:
static QTime fromString(QStringView string, QStringView format)
{ return fromString(string.toString(), format); }
static QTime fromString(const QString &string, QStringView format);
-# if QT_STRINGVIEW_LEVEL < 2
static QTime fromString(const QString &string, Qt::DateFormat format = Qt::TextDate)
{ return fromString(qToStringViewIgnoringNull(string), format); }
static QTime fromString(const QString &string, const QString &format)
{ return fromString(string, qToStringViewIgnoringNull(format)); }
-# endif
#endif
static bool isValid(int h, int m, int s, int ms = 0);
@@ -216,12 +261,12 @@ private:
constexpr inline int ds() const { return mds == -1 ? 0 : mds; }
int mds;
- friend constexpr bool operator==(QTime lhs, QTime rhs) { return lhs.mds == rhs.mds; }
- friend constexpr bool operator!=(QTime lhs, QTime rhs) { return lhs.mds != rhs.mds; }
- friend constexpr bool operator< (QTime lhs, QTime rhs) { return lhs.mds < rhs.mds; }
- friend constexpr bool operator<=(QTime lhs, QTime rhs) { return lhs.mds <= rhs.mds; }
- friend constexpr bool operator> (QTime lhs, QTime rhs) { return lhs.mds > rhs.mds; }
- friend constexpr bool operator>=(QTime lhs, QTime rhs) { return lhs.mds >= rhs.mds; }
+ friend constexpr bool comparesEqual(const QTime &lhs, const QTime &rhs) noexcept
+ { return lhs.mds == rhs.mds; }
+ friend constexpr Qt::strong_ordering
+ compareThreeWay(const QTime &lhs, const QTime &rhs) noexcept
+ { return Qt::compareThreeWay(lhs.mds, rhs.mds); }
+ Q_DECLARE_STRONGLY_ORDERED_LITERAL_TYPE(QTime)
friend class QDateTime;
friend class QDateTimePrivate;
@@ -237,38 +282,51 @@ class QDateTimePrivate;
class Q_CORE_EXPORT QDateTime
{
struct ShortData {
-#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN
- quintptr status : 8;
-#endif
-#if QT_VERSION >= QT_VERSION_CHECK(7,0,0)
+#if QT_VERSION >= QT_VERSION_CHECK(7,0,0) || defined(QT_BOOTSTRAPPED)
+# if Q_BYTE_ORDER == Q_LITTLE_ENDIAN
+ qint64 status : 8;
+# endif
qint64 msecs : 56;
+
+# if Q_BYTE_ORDER == Q_BIG_ENDIAN
+ qint64 status : 8;
+# endif
#else
+# if Q_BYTE_ORDER == Q_LITTLE_ENDIAN
+ quintptr status : 8;
+# endif
// note: this is only 24 bits on 32-bit systems...
qintptr msecs : sizeof(void *) * 8 - 8;
-#endif
-#if Q_BYTE_ORDER == Q_BIG_ENDIAN
+# if Q_BYTE_ORDER == Q_BIG_ENDIAN
quintptr status : 8;
+# endif
#endif
+ friend constexpr bool operator==(ShortData lhs, ShortData rhs)
+ { return lhs.status == rhs.status && lhs.msecs == rhs.msecs; }
};
union Data {
- enum {
- // To be of any use, we need at least 60 years around 1970, which
- // is 1,893,456,000,000 ms. That requires 41 bits to store, plus
- // the sign bit. With the status byte, the minimum size is 50 bits.
- CanBeSmall = sizeof(ShortData) * 8 > 50
- };
+ // To be of any use, we need at least 60 years around 1970, which
+ // is 1,893,456,000,000 ms. That requires 41 bits to store, plus
+ // the sign bit. With the status byte, the minimum size is 50 bits.
+ static constexpr bool CanBeSmall = sizeof(ShortData) * 8 > 50;
Data() noexcept;
- Data(Qt::TimeSpec);
- Data(const Data &other);
- Data(Data &&other);
- Data &operator=(const Data &other);
+ Data(const QTimeZone &);
+ Data(const Data &other) noexcept;
+ Data(Data &&other) noexcept;
+ Data &operator=(const Data &other) noexcept;
+ Data &operator=(Data &&other) noexcept { swap(other); return *this; }
~Data();
+ void swap(Data &other) noexcept
+ { std::swap(data, other.data); }
+
bool isShort() const;
+ inline void invalidate();
void detach();
+ QTimeZone timeZone() const;
const QDateTimePrivate *operator->() const;
QDateTimePrivate *operator->();
@@ -279,10 +337,31 @@ class Q_CORE_EXPORT QDateTime
public:
QDateTime() noexcept;
- QDateTime(QDate date, QTime time, Qt::TimeSpec spec = Qt::LocalTime, int offsetSeconds = 0);
-#if QT_CONFIG(timezone)
+
+ enum class TransitionResolution {
+ Reject = 0,
+ RelativeToBefore,
+ RelativeToAfter,
+ PreferBefore,
+ PreferAfter,
+ PreferStandard,
+ PreferDaylightSaving,
+ // Closest match to behavior prior to introducing TransitionResolution:
+ LegacyBehavior = RelativeToBefore
+ };
+
+#if QT_DEPRECATED_SINCE(6, 9)
+ QT_DEPRECATED_VERSION_X_6_9("Pass QTimeZone instead")
+ QDateTime(QDate date, QTime time, Qt::TimeSpec spec, int offsetSeconds = 0);
+#endif
+#if QT_CORE_REMOVED_SINCE(6, 7)
QDateTime(QDate date, QTime time, const QTimeZone &timeZone);
-#endif // timezone
+ QDateTime(QDate date, QTime time);
+#endif
+ QDateTime(QDate date, QTime time, const QTimeZone &timeZone,
+ TransitionResolution resolve = TransitionResolution::LegacyBehavior);
+ QDateTime(QDate date, QTime time,
+ TransitionResolution resolve = TransitionResolution::LegacyBehavior);
QDateTime(const QDateTime &other) noexcept;
QDateTime(QDateTime &&other) noexcept;
~QDateTime();
@@ -290,7 +369,7 @@ public:
QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_PURE_SWAP(QDateTime)
QDateTime &operator=(const QDateTime &other) noexcept;
- void swap(QDateTime &other) noexcept { qSwap(d.d, other.d.d); }
+ void swap(QDateTime &other) noexcept { d.swap(other.d); }
bool isNull() const;
bool isValid() const;
@@ -299,6 +378,7 @@ public:
QTime time() const;
Qt::TimeSpec timeSpec() const;
int offsetFromUtc() const;
+ QTimeZone timeRepresentation() const;
#if QT_CONFIG(timezone)
QTimeZone timeZone() const;
#endif // timezone
@@ -308,69 +388,106 @@ public:
qint64 toMSecsSinceEpoch() const;
qint64 toSecsSinceEpoch() const;
+#if QT_CORE_REMOVED_SINCE(6, 7)
void setDate(QDate date);
void setTime(QTime time);
+#endif
+ void setDate(QDate date, TransitionResolution resolve = TransitionResolution::LegacyBehavior);
+ void setTime(QTime time, TransitionResolution resolve = TransitionResolution::LegacyBehavior);
+
+#if QT_DEPRECATED_SINCE(6, 9)
+ QT_DEPRECATED_VERSION_X_6_9("Use setTimeZone() instead")
void setTimeSpec(Qt::TimeSpec spec);
+ QT_DEPRECATED_VERSION_X_6_9("Use setTimeZone() instead")
void setOffsetFromUtc(int offsetSeconds);
-#if QT_CONFIG(timezone)
+#endif
+#if QT_CORE_REMOVED_SINCE(6, 7)
void setTimeZone(const QTimeZone &toZone);
-#endif // timezone
+#endif
+ void setTimeZone(const QTimeZone &toZone,
+ TransitionResolution resolve = TransitionResolution::LegacyBehavior);
void setMSecsSinceEpoch(qint64 msecs);
void setSecsSinceEpoch(qint64 secs);
#if QT_CONFIG(datestring)
QString toString(Qt::DateFormat format = Qt::TextDate) const;
-# if QT_STRINGVIEW_LEVEL < 2
- QString toString(const QString &format, QCalendar cal = QCalendar()) const
+ QString toString(const QString &format) const;
+ QString toString(const QString &format, QCalendar cal) const
{ return toString(qToStringViewIgnoringNull(format), cal); }
-# endif
- QString toString(QStringView format, QCalendar cal = QCalendar()) const;
+ QString toString(QStringView format) const;
+ QString toString(QStringView format, QCalendar cal) const;
#endif
[[nodiscard]] QDateTime addDays(qint64 days) const;
[[nodiscard]] QDateTime addMonths(int months) const;
[[nodiscard]] QDateTime addYears(int years) const;
[[nodiscard]] QDateTime addSecs(qint64 secs) const;
[[nodiscard]] QDateTime addMSecs(qint64 msecs) const;
+ [[nodiscard]] QDateTime addDuration(std::chrono::milliseconds msecs) const
+ {
+ return addMSecs(msecs.count());
+ }
+#if QT_DEPRECATED_SINCE(6, 9)
+ QT_DEPRECATED_VERSION_X_6_9("Use toTimeZone instead")
QDateTime toTimeSpec(Qt::TimeSpec spec) const;
- inline QDateTime toLocalTime() const { return toTimeSpec(Qt::LocalTime); }
- inline QDateTime toUTC() const { return toTimeSpec(Qt::UTC); }
+#endif
+ QDateTime toLocalTime() const;
+ QDateTime toUTC() const;
QDateTime toOffsetFromUtc(int offsetSeconds) const;
-#if QT_CONFIG(timezone)
QDateTime toTimeZone(const QTimeZone &toZone) const;
-#endif // timezone
qint64 daysTo(const QDateTime &) const;
qint64 secsTo(const QDateTime &) const;
qint64 msecsTo(const QDateTime &) const;
+ static QDateTime currentDateTime(const QTimeZone &zone);
static QDateTime currentDateTime();
static QDateTime currentDateTimeUtc();
#if QT_CONFIG(datestring)
+ // No DateFormat accepts a two-digit year, so no need for baseYear:
static QDateTime fromString(QStringView string, Qt::DateFormat format = Qt::TextDate);
- static QDateTime fromString(QStringView string, QStringView format,
- QCalendar cal = QCalendar())
- { return fromString(string.toString(), format, cal); }
- static QDateTime fromString(const QString &string, QStringView format,
- QCalendar cal = QCalendar());
-# if QT_STRINGVIEW_LEVEL < 2
static QDateTime fromString(const QString &string, Qt::DateFormat format = Qt::TextDate)
{ return fromString(qToStringViewIgnoringNull(string), format); }
+
+ // Accept calendar without over-ride of base year:
+ static QDateTime fromString(QStringView string, QStringView format, QCalendar cal)
+ { return fromString(string.toString(), format, QLocale::DefaultTwoDigitBaseYear, cal); }
+ QT_CORE_INLINE_SINCE(6, 7)
+ static QDateTime fromString(const QString &string, QStringView format, QCalendar cal);
+ static QDateTime fromString(const QString &string, const QString &format, QCalendar cal)
+ { return fromString(string, qToStringViewIgnoringNull(format), QLocale::DefaultTwoDigitBaseYear, cal); }
+
+ // Overriding base year is likely more common than overriding calendar (and
+ // likely to get more so, as the legacy base drops ever further behind us).
+ static QDateTime fromString(QStringView string, QStringView format,
+ int baseYear = QLocale::DefaultTwoDigitBaseYear)
+ { return fromString(string.toString(), format, baseYear); }
+ static QDateTime fromString(QStringView string, QStringView format,
+ int baseYear, QCalendar cal)
+ { return fromString(string.toString(), format, baseYear, cal); }
+ static QDateTime fromString(const QString &string, QStringView format,
+ int baseYear = QLocale::DefaultTwoDigitBaseYear);
+ static QDateTime fromString(const QString &string, QStringView format,
+ int baseYear, QCalendar cal);
+ static QDateTime fromString(const QString &string, const QString &format,
+ int baseYear = QLocale::DefaultTwoDigitBaseYear)
+ { return fromString(string, qToStringViewIgnoringNull(format), baseYear); }
static QDateTime fromString(const QString &string, const QString &format,
- QCalendar cal = QCalendar())
- { return fromString(string, qToStringViewIgnoringNull(format), cal); }
-# endif
+ int baseYear, QCalendar cal)
+ { return fromString(string, qToStringViewIgnoringNull(format), baseYear, cal); }
#endif
- static QDateTime fromMSecsSinceEpoch(qint64 msecs, Qt::TimeSpec spec = Qt::LocalTime,
- int offsetFromUtc = 0);
- static QDateTime fromSecsSinceEpoch(qint64 secs, Qt::TimeSpec spec = Qt::LocalTime,
- int offsetFromUtc = 0);
+#if QT_DEPRECATED_SINCE(6, 9)
+ QT_DEPRECATED_VERSION_X_6_9("Pass QTimeZone instead of time-spec, offset")
+ static QDateTime fromMSecsSinceEpoch(qint64 msecs, Qt::TimeSpec spec, int offsetFromUtc = 0);
+ QT_DEPRECATED_VERSION_X_6_9("Pass QTimeZone instead of time-spec, offset")
+ static QDateTime fromSecsSinceEpoch(qint64 secs, Qt::TimeSpec spec, int offsetFromUtc = 0);
+#endif
-#if QT_CONFIG(timezone)
static QDateTime fromMSecsSinceEpoch(qint64 msecs, const QTimeZone &timeZone);
static QDateTime fromSecsSinceEpoch(qint64 secs, const QTimeZone &timeZone);
-#endif
+ static QDateTime fromMSecsSinceEpoch(qint64 msecs);
+ static QDateTime fromSecsSinceEpoch(qint64 secs);
static qint64 currentMSecsSinceEpoch() noexcept;
static qint64 currentSecsSinceEpoch() noexcept;
@@ -382,23 +499,114 @@ public:
NSDate *toNSDate() const Q_DECL_NS_RETURNS_AUTORELEASED;
#endif
+#if __cpp_lib_chrono >= 201907L || defined(Q_QDOC)
+#if __cpp_concepts >= 201907L || defined(Q_QDOC)
+ // Generic clock, as long as it's compatible with us (= system_clock)
+ template <typename Clock, typename Duration>
+ static QDateTime fromStdTimePoint(const std::chrono::time_point<Clock, Duration> &time)
+ requires
+ requires(const std::chrono::time_point<Clock, Duration> &t) {
+ // the clock can be converted to system_clock
+ std::chrono::clock_cast<std::chrono::system_clock>(t);
+ // the duration can be converted to milliseconds
+ requires std::is_convertible_v<Duration, std::chrono::milliseconds>;
+ }
+ {
+ const auto sysTime = std::chrono::clock_cast<std::chrono::system_clock>(time);
+ // clock_cast can change the duration, so convert it again to milliseconds
+ const auto timeInMSec = std::chrono::time_point_cast<std::chrono::milliseconds>(sysTime);
+ return fromMSecsSinceEpoch(timeInMSec.time_since_epoch().count(), Qt::UTC);
+ }
+#endif // __cpp_concepts
+
+ // local_time
+ QT_POST_CXX17_API_IN_EXPORTED_CLASS
+ static QDateTime fromStdTimePoint(const std::chrono::local_time<std::chrono::milliseconds> &time)
+ {
+ return fromStdLocalTime(time);
+ }
+
+ QT_POST_CXX17_API_IN_EXPORTED_CLASS
+ static QDateTime fromStdLocalTime(const std::chrono::local_time<std::chrono::milliseconds> &time)
+ {
+ QDateTime result(QDate(1970, 1, 1), QTime(0, 0, 0));
+ return result.addMSecs(time.time_since_epoch().count());
+ }
+
+#if QT_CONFIG(timezone) && (__cpp_lib_chrono >= 201907L || defined(Q_QDOC))
+ // zoned_time. defined in qtimezone.h
+ QT_POST_CXX17_API_IN_EXPORTED_CLASS
+ static QDateTime fromStdZonedTime(const std::chrono::zoned_time<
+ std::chrono::milliseconds,
+ const std::chrono::time_zone *
+ > &time);
+#endif // QT_CONFIG(timezone)
+
+ QT_POST_CXX17_API_IN_EXPORTED_CLASS
+ std::chrono::sys_time<std::chrono::milliseconds> toStdSysMilliseconds() const
+ {
+ const std::chrono::milliseconds duration(toMSecsSinceEpoch());
+ return std::chrono::sys_time<std::chrono::milliseconds>(duration);
+ }
+
+ QT_POST_CXX17_API_IN_EXPORTED_CLASS
+ std::chrono::sys_seconds toStdSysSeconds() const
+ {
+ const std::chrono::seconds duration(toSecsSinceEpoch());
+ return std::chrono::sys_seconds(duration);
+ }
+#endif // __cpp_lib_chrono >= 201907L
+
+ friend std::chrono::milliseconds operator-(const QDateTime &lhs, const QDateTime &rhs)
+ {
+ return std::chrono::milliseconds(rhs.msecsTo(lhs));
+ }
+
+ friend QDateTime operator+(const QDateTime &dateTime, std::chrono::milliseconds duration)
+ {
+ return dateTime.addMSecs(duration.count());
+ }
+
+ friend QDateTime operator+(std::chrono::milliseconds duration, const QDateTime &dateTime)
+ {
+ return dateTime + duration;
+ }
+
+ QDateTime &operator+=(std::chrono::milliseconds duration)
+ {
+ *this = addMSecs(duration.count());
+ return *this;
+ }
+
+ friend QDateTime operator-(const QDateTime &dateTime, std::chrono::milliseconds duration)
+ {
+ return dateTime.addMSecs(-duration.count());
+ }
+
+ QDateTime &operator-=(std::chrono::milliseconds duration)
+ {
+ *this = addMSecs(-duration.count());
+ return *this;
+ }
+
// (1<<63) ms is 292277024.6 (average Gregorian) years, counted from the start of 1970, so
// Last is floor(1970 + 292277024.6); no year 0, so First is floor(1970 - 1 - 292277024.6)
enum class YearRange : qint32 { First = -292275056, Last = +292278994 };
private:
bool equals(const QDateTime &other) const;
+#if QT_CORE_REMOVED_SINCE(6, 7)
bool precedes(const QDateTime &other) const;
+#endif
friend class QDateTimePrivate;
Data d;
- friend bool operator==(const QDateTime &lhs, const QDateTime &rhs) { return lhs.equals(rhs); }
- friend bool operator!=(const QDateTime &lhs, const QDateTime &rhs) { return !(lhs == rhs); }
- friend bool operator<(const QDateTime &lhs, const QDateTime &rhs) { return lhs.precedes(rhs); }
- friend bool operator<=(const QDateTime &lhs, const QDateTime &rhs) { return !(rhs < lhs); }
- friend bool operator>(const QDateTime &lhs, const QDateTime &rhs) { return rhs.precedes(lhs); }
- friend bool operator>=(const QDateTime &lhs, const QDateTime &rhs) { return !(lhs < rhs); }
+ friend bool comparesEqual(const QDateTime &lhs, const QDateTime &rhs)
+ { return lhs.equals(rhs); }
+ friend Q_CORE_EXPORT Qt::weak_ordering
+ compareThreeWay(const QDateTime &lhs, const QDateTime &rhs);
+ Q_DECLARE_WEAKLY_ORDERED(QDateTime)
#ifndef QT_NO_DATASTREAM
friend Q_CORE_EXPORT QDataStream &operator<<(QDataStream &, const QDateTime &);
@@ -432,6 +640,18 @@ Q_CORE_EXPORT size_t qHash(const QDateTime &key, size_t seed = 0);
Q_CORE_EXPORT size_t qHash(QDate key, size_t seed = 0) noexcept;
Q_CORE_EXPORT size_t qHash(QTime key, size_t seed = 0) noexcept;
+#if QT_CONFIG(datestring) && QT_CORE_INLINE_IMPL_SINCE(6, 7)
+QDate QDate::fromString(const QString &string, QStringView format, QCalendar cal)
+{
+ return fromString(string, format, QLocale::DefaultTwoDigitBaseYear, cal);
+}
+
+QDateTime QDateTime::fromString(const QString &string, QStringView format, QCalendar cal)
+{
+ return fromString(string, format, QLocale::DefaultTwoDigitBaseYear, cal);
+}
+#endif
+
QT_END_NAMESPACE
#endif // QDATETIME_H
diff --git a/src/corelib/time/qdatetime_p.h b/src/corelib/time/qdatetime_p.h
index 1817d406bd..02b047dd73 100644
--- a/src/corelib/time/qdatetime_p.h
+++ b/src/corelib/time/qdatetime_p.h
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2022 The Qt Company Ltd.
+// Copyright (C) 2016 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QDATETIME_P_H
#define QDATETIME_P_H
@@ -57,11 +21,14 @@
#include "QtCore/qatomic.h"
#include "QtCore/qdatetime.h"
#include "QtCore/qshareddata.h"
+#include "QtCore/qtimezone.h"
#if QT_CONFIG(timezone)
#include "qtimezone.h"
#endif
+#include <chrono>
+
QT_BEGIN_NAMESPACE
class QDateTimePrivate : public QSharedData
@@ -96,7 +63,6 @@ public:
ValidDate = 0x02,
ValidTime = 0x04,
ValidDateTime = 0x08,
- ValidWhenMask = ValidDate | ValidTime | ValidDateTime,
TimeSpecMask = 0x30,
@@ -107,38 +73,79 @@ public:
};
Q_DECLARE_FLAGS(StatusFlags, StatusFlag)
+
+ enum TransitionOption {
+ // Handling of a spring-forward (or other gap):
+ GapUseBefore = 2,
+ GapUseAfter = 4,
+ // Handling of a fall-back (or other repeated period):
+ FoldUseBefore = 0x20,
+ FoldUseAfter = 0x40,
+ // Quirk for negative DST:
+ FlipForReverseDst = 0x400,
+
+ GapMask = GapUseBefore | GapUseAfter,
+ FoldMask = FoldUseBefore | FoldUseAfter,
+ };
+ Q_DECLARE_FLAGS(TransitionOptions, TransitionOption)
+
enum {
TimeSpecShift = 4,
};
- static QDateTime::Data create(QDate toDate, QTime toTime, Qt::TimeSpec toSpec,
- int offsetSeconds);
+ struct ZoneState {
+ qint64 when; // ms after zone/local 1970 start; may be revised from the input time.
+ int offset = 0; // seconds
+ DaylightStatus dst = UnknownDaylightTime;
+ // Other fields are set, if possible, even when valid is false due to spring-forward.
+ bool valid = false;
-#if QT_CONFIG(timezone)
- static QDateTime::Data create(QDate toDate, QTime toTime, const QTimeZone & timeZone);
+ ZoneState(qint64 local) : when(local) {}
+ ZoneState(qint64 w, int o, DaylightStatus d, bool v = true)
+ : when(w), offset(o), dst(d), valid(v) {}
+ };
- static qint64 zoneMSecsToEpochMSecs(qint64 msecs, const QTimeZone &zone,
- DaylightStatus *hint = nullptr,
- QDate *localDate = nullptr, QTime *localTime = nullptr,
- QString *abbreviation = nullptr);
+ static QDateTime::Data create(QDate toDate, QTime toTime, const QTimeZone &timeZone,
+ QDateTime::TransitionResolution resolve);
+#if QT_CONFIG(timezone)
+ static ZoneState zoneStateAtMillis(const QTimeZone &zone, qint64 millis,
+ TransitionOptions resolve);
#endif // timezone
- static bool epochMSecsToLocalTime(qint64 msecs, QDate *localDate, QTime *localTime,
- DaylightStatus *daylightStatus = nullptr);
- static qint64 localMSecsToEpochMSecs(qint64 localMsecs,
- DaylightStatus *daylightStatus,
- QDate *localDate = nullptr, QTime *localTime = nullptr,
- QString *abbreviation = nullptr);
+ static ZoneState expressUtcAsLocal(qint64 utcMSecs);
+
+ static ZoneState localStateAtMillis(qint64 millis, TransitionOptions resolve);
+ static QString localNameAtMillis(qint64 millis, DaylightStatus dst); // empty if unknown
StatusFlags m_status = StatusFlag(Qt::LocalTime << TimeSpecShift);
qint64 m_msecs = 0;
int m_offsetFromUtc = 0;
-#if QT_CONFIG(timezone)
QTimeZone m_timeZone;
-#endif // timezone
};
Q_DECLARE_OPERATORS_FOR_FLAGS(QDateTimePrivate::StatusFlags)
+Q_DECLARE_OPERATORS_FOR_FLAGS(QDateTimePrivate::TransitionOptions)
+
+namespace QtPrivate {
+namespace DateTimeConstants {
+using namespace std::chrono;
+constexpr qint64 SECS_PER_MIN = minutes::period::num;
+constexpr qint64 SECS_PER_HOUR = hours::period::num;
+constexpr qint64 SECS_PER_DAY = SECS_PER_HOUR * 24; // std::chrono::days is C++20
+
+constexpr qint64 MINS_PER_HOUR = std::ratio_divide<hours::period, minutes::period>::num;
+
+constexpr qint64 MSECS_PER_SEC = milliseconds::period::den;
+constexpr qint64 MSECS_PER_MIN = SECS_PER_MIN * MSECS_PER_SEC;
+constexpr qint64 MSECS_PER_HOUR = SECS_PER_HOUR * MSECS_PER_SEC;
+constexpr qint64 MSECS_PER_DAY = SECS_PER_DAY * MSECS_PER_SEC;
+
+constexpr qint64 JULIAN_DAY_FOR_EPOCH = 2440588; // result of QDate(1970, 1, 1).toJulianDay()
+
+constexpr qint64 JulianDayMax = Q_INT64_C( 784354017364);
+constexpr qint64 JulianDayMin = Q_INT64_C(-784350574879);
+}
+}
QT_END_NAMESPACE
diff --git a/src/corelib/time/qdatetimeparser.cpp b/src/corelib/time/qdatetimeparser.cpp
index 6f582ed650..78520a51aa 100644
--- a/src/corelib/time/qdatetimeparser.cpp
+++ b/src/corelib/time/qdatetimeparser.cpp
@@ -1,54 +1,20 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qplatformdefs.h"
#include "private/qdatetimeparser_p.h"
-#include "private/qstringiterator_p.h"
#include "qdatastream.h"
-#include "qset.h"
-#include "qlocale.h"
#include "qdatetime.h"
-#if QT_CONFIG(timezone)
-#include "qtimezone.h"
-#endif
#include "qdebug.h"
+#include "qlocale.h"
+#include "qset.h"
+#include "qtimezone.h"
+#include "qvarlengtharray.h"
+#include "private/qlocale_p.h"
+
+#include "private/qstringiterator_p.h"
+#include "private/qtenvironmentvariables_p.h"
//#define QDATETIMEPARSER_DEBUG
#if defined (QDATETIMEPARSER_DEBUG) && !defined(QT_NO_DEBUG_STREAM)
@@ -61,6 +27,8 @@
QT_BEGIN_NAMESPACE
+using namespace Qt::StringLiterals;
+
template <typename T>
using ShortVector = QVarLengthArray<T, 13>; // enough for month (incl. leap) and day-of-week names
@@ -167,9 +135,7 @@ bool QDateTimeParser::setDigit(QDateTime &v, int index, int newVal) const
int minute = time.minute();
int second = time.second();
int msec = time.msec();
- Qt::TimeSpec tspec = v.timeSpec();
- // Only offset from UTC is amenable to setting an int value:
- int offset = tspec == Qt::OffsetFromUTC ? v.offsetFromUtc() : 0;
+ QTimeZone timeZone = v.timeRepresentation();
const SectionNode &node = sectionNodes.at(index);
switch (node.type) {
@@ -201,8 +167,8 @@ bool QDateTimeParser::setDigit(QDateTime &v, int index, int newVal) const
case TimeZoneSection:
if (newVal < absoluteMin(index) || newVal > absoluteMax(index))
return false;
- tspec = Qt::OffsetFromUTC;
- offset = newVal;
+ // Only offset from UTC is amenable to setting an int value:
+ timeZone = QTimeZone::fromSecondsAheadOfUtc(newVal);
break;
case AmPmSection: hour = (newVal == 0 ? hour % 12 : (hour % 12) + 12); break;
default:
@@ -242,12 +208,7 @@ bool QDateTimeParser::setDigit(QDateTime &v, int index, int newVal) const
if (!newDate.isValid() || !newTime.isValid())
return false;
- // Preserve zone:
- v =
-#if QT_CONFIG(timezone)
- tspec == Qt::TimeZone ? QDateTime(newDate, newTime, v.timeZone()) :
-#endif
- QDateTime(newDate, newTime, tspec, offset);
+ v = QDateTime(newDate, newTime, timeZone);
return true;
}
@@ -264,11 +225,7 @@ int QDateTimeParser::absoluteMax(int s, const QDateTime &cur) const
const SectionNode &sn = sectionNode(s);
switch (sn.type) {
case TimeZoneSection:
-#if QT_CONFIG(timezone)
return QTimeZone::MaxUtcOffsetSecs;
-#else
- return +14 * 3600; // NB: copied from QTimeZone
-#endif
case Hour24Section:
case Hour12Section:
// This is special-cased in parseSection.
@@ -280,9 +237,9 @@ int QDateTimeParser::absoluteMax(int s, const QDateTime &cur) const
case MSecSection:
return 999;
case YearSection2Digits:
- case YearSection:
// sectionMaxSize will prevent people from typing in a larger number in
// count == 2 sections; stepBy() will work on real years anyway.
+ case YearSection:
return 9999;
case MonthSection:
return calendar.maximumMonthsInYear();
@@ -312,11 +269,7 @@ int QDateTimeParser::absoluteMin(int s) const
const SectionNode &sn = sectionNode(s);
switch (sn.type) {
case TimeZoneSection:
-#if QT_CONFIG(timezone)
return QTimeZone::MinUtcOffsetSecs;
-#else
- return -14 * 3600; // NB: copied from QTimeZone
-#endif
case Hour24Section:
case Hour12Section:
case MinuteSection:
@@ -419,9 +372,9 @@ static qsizetype digitCount(QStringView str)
not escaped and removes the escaping on those that are escaped
*/
-
static QString unquote(QStringView str)
{
+ // ### Align unquoting format strings for both from/toString(), QTBUG-110669
const QLatin1Char quote('\'');
const QLatin1Char slash('\\');
const QLatin1Char zero('0');
@@ -446,14 +399,10 @@ static QString unquote(QStringView str)
static inline int countRepeat(QStringView str, int index, int maxCount)
{
str = str.sliced(index);
- if (maxCount > str.size())
- maxCount = str.size();
-
- const QChar ch(str[0]);
- int count = 1;
- while (count < maxCount && str[count] == ch)
- ++count;
- return count;
+ if (maxCount < str.size())
+ str = str.first(maxCount);
+
+ return qt_repeatCount(str);
}
static inline void appendSeparator(QStringList *list, QStringView string,
@@ -534,10 +483,11 @@ bool QDateTimeParser::parseFormat(QStringView newFormat)
case 'z':
if (parserType != QMetaType::QDate) {
- const SectionNode sn = { MSecSection, i - add, countRepeat(newFormat, i, 3) < 3 ? 1 : 3, 0 };
+ const int repeat = countRepeat(newFormat, i, 3);
+ const SectionNode sn = { MSecSection, i - add, repeat < 3 ? 1 : 3, 0 };
newSectionNodes.append(sn);
appendSeparator(&newSeparators, newFormat, index, i - index, lastQuote);
- i += sn.count - 1;
+ i += repeat - 1;
index = i + 1;
newDisplay |= MSecSection;
}
@@ -550,8 +500,7 @@ bool QDateTimeParser::parseFormat(QStringView newFormat)
appendSeparator(&newSeparators, newFormat, index, i - index, lastQuote);
newDisplay |= AmPmSection;
if (i + 1 < newFormat.size()
- && newFormat.sliced(i + 1).startsWith(QLatin1Char('p'),
- Qt::CaseInsensitive)) {
+ && newFormat.sliced(i + 1).startsWith(u'p', Qt::CaseInsensitive)) {
++i;
if (newFormat.at(i) != QLatin1Char(caseOpt == UpperCase ? 'P' : 'p'))
caseOpt = NativeCase;
@@ -600,10 +549,8 @@ bool QDateTimeParser::parseFormat(QStringView newFormat)
break;
case 't':
if (parserType == QMetaType::QDateTime) {
- // TODO (in qlocale.cpp's serialization, too) QTBUG-95966:
- // decide what different lengths of 't' format should do,
- // instead of repetition !
- const SectionNode sn = { TimeZoneSection, i - add, 1, 0 };
+ const SectionNode sn
+ = { TimeZoneSection, i - add, countRepeat(newFormat, i, 4), 0 };
newSectionNodes.append(sn);
appendSeparator(&newSeparators, newFormat, index, i - index, lastQuote);
i += sn.count - 1;
@@ -644,7 +591,7 @@ bool QDateTimeParser::parseFormat(QStringView newFormat)
// }
QDTPDEBUG << newFormat << displayFormat;
- QDTPDEBUGN("separators:\n'%s'", separators.join(QLatin1String("\n")).toLatin1().constData());
+ QDTPDEBUGN("separators:\n'%s'", separators.join("\n"_L1).toLatin1().constData());
return true;
}
@@ -718,16 +665,12 @@ int QDateTimeParser::sectionMaxSize(Section s, int count) const
case DayOfWeekSectionShort:
case DayOfWeekSectionLong:
-#if !QT_CONFIG(textdate)
- return 2;
-#else
+#if QT_CONFIG(textdate)
mcount = 7;
Q_FALLTHROUGH();
#endif
case MonthSection:
-#if !QT_CONFIG(textdate)
- return 2;
-#else
+#if QT_CONFIG(textdate)
if (count <= 2)
return 2;
@@ -743,7 +686,9 @@ int QDateTimeParser::sectionMaxSize(Section s, int count) const
}
return ret;
}
-#endif
+#else
+ return 2;
+#endif // textdate
case MSecSection:
return 3;
case YearSection:
@@ -764,6 +709,7 @@ int QDateTimeParser::sectionMaxSize(Section s, int count) const
case DaySectionMask:
qWarning("QDateTimeParser::sectionMaxSize: Invalid section %s",
SectionNode::name(s).toLatin1().constData());
+ break;
case NoSectionIndex:
case FirstSectionIndex:
@@ -782,6 +728,36 @@ int QDateTimeParser::sectionMaxSize(int index) const
return sectionMaxSize(sn.type, sn.count);
}
+// Separator matching
+//
+// QTBUG-114909: user may be oblivious to difference between visibly
+// indistinguishable spacing characters. For now we only treat horizontal
+// spacing characters, excluding tab, as equivalent.
+
+static int matchesSeparator(QStringView text, QStringView separator)
+{
+ const auto isSimpleSpace = [](char32_t ch) {
+ // Distinguish tab, CR and the vertical spaces from the rest:
+ return ch == u' ' || (ch > 127 && QChar::isSpace(ch));
+ };
+ // -1 if not a match, else length of prefix of text that does match.
+ // First check for exact match
+ if (!text.startsWith(separator)) {
+ // Failing that, check for space-identifying match:
+ QStringIterator given(text), sep(separator);
+ while (sep.hasNext()) {
+ if (!given.hasNext())
+ return -1;
+ char32_t s = sep.next(), g = given.next();
+ if (s != g && !(isSimpleSpace(s) && isSimpleSpace(g)))
+ return -1;
+ }
+ // One side may have used a surrogate pair space where the other didn't:
+ return given.index();
+ }
+ return separator.size();
+}
+
/*!
\internal
@@ -820,7 +796,7 @@ QDateTimeParser::parseSection(const QDateTime &currentValue, int sectionIndex, i
const int sectionmaxsize = sectionMaxSize(sectionIndex);
const bool negate = (sn.type == YearSection && m_text.size() > offset
- && m_text.at(offset) == QLatin1Char('-'));
+ && m_text.at(offset) == u'-');
const int negativeYearOffset = negate ? 1 : 0;
QStringView sectionTextRef =
@@ -860,7 +836,7 @@ QDateTimeParser::parseSection(const QDateTime &currentValue, int sectionIndex, i
case TimeZoneSection:
result = findTimeZone(sectionTextRef, currentValue,
absoluteMax(sectionIndex),
- absoluteMin(sectionIndex));
+ absoluteMin(sectionIndex), sn.count);
break;
case MonthSection:
case DayOfWeekSectionShort:
@@ -895,12 +871,26 @@ QDateTimeParser::parseSection(const QDateTime &currentValue, int sectionIndex, i
case MinuteSection:
case SecondSection:
case MSecSection: {
+ const auto checkSeparator = [&result, field=QStringView{m_text}.sliced(offset),
+ negativeYearOffset, sectionIndex, this]() {
+ // No-digit field if next separator is here, otherwise invalid.
+ const auto &sep = separators.at(sectionIndex + 1);
+ if (matchesSeparator(field.sliced(negativeYearOffset), sep) != -1)
+ result = ParsedSection(Intermediate, 0, negativeYearOffset);
+ else if (negativeYearOffset && matchesSeparator(field, sep) != -1)
+ result = ParsedSection(Intermediate, 0, 0);
+ else
+ return false;
+ return true;
+ };
int used = negativeYearOffset;
- // We already sliced off the - sign if it was legitimately present.
- if (sectionTextRef.startsWith(QLatin1Char('-'))
- || sectionTextRef.startsWith(QLatin1Char('+'))) {
- if (separators.at(sectionIndex + 1).startsWith(sectionTextRef[0]))
- result = ParsedSection(Intermediate, 0, used);
+ // We already sliced off the - sign if it was acceptable.
+ // QLocale::toUInt() would accept a sign, so we must reject it overtly:
+ if (sectionTextRef.startsWith(u'-')
+ || sectionTextRef.startsWith(u'+')) {
+ // However, a sign here may indicate a field with no digits, if it
+ // starts the next separator:
+ checkSeparator();
break;
}
QStringView digitsStr = sectionTextRef.left(digitCount(sectionTextRef));
@@ -912,7 +902,7 @@ QDateTimeParser::parseSection(const QDateTime &currentValue, int sectionIndex, i
const int absMax = absoluteMax(sectionIndex);
const int absMin = absoluteMin(sectionIndex);
- int last = -1;
+ int lastVal = -1;
for (; digitsStr.size(); digitsStr.chop(1)) {
bool ok = false;
@@ -928,52 +918,49 @@ QDateTimeParser::parseSection(const QDateTime &currentValue, int sectionIndex, i
}
QDTPDEBUG << digitsStr << value << digitsStr.size();
- last = value;
+ lastVal = value;
used += digitsStr.size();
break;
}
- if (last == -1) {
- const auto &sep = separators.at(sectionIndex + 1);
- if (sep.startsWith(sectionTextRef[0])
- || (negate && sep.startsWith(m_text.at(offset))))
- result = ParsedSection(Intermediate, 0, 0);
- else
+ if (lastVal == -1) {
+ if (!checkSeparator()) {
QDTPDEBUG << "invalid because" << sectionTextRef << "can't become a uint"
- << last;
+ << lastVal;
+ }
} else {
if (negate)
- last = -last;
+ lastVal = -lastVal;
const FieldInfo fi = fieldInfo(sectionIndex);
const bool unfilled = used - negativeYearOffset < sectionmaxsize;
if (unfilled && fi & Fraction) { // typing 2 in a zzz field should be .200, not .002
for (int i = used; i < sectionmaxsize; ++i)
- last *= 10;
+ lastVal *= 10;
}
// Even those *= 10s can't take last above absMax:
- Q_ASSERT(negate ? last >= absMin : last <= absMax);
- if (negate ? last > absMax : last < absMin) {
+ Q_ASSERT(negate ? lastVal >= absMin : lastVal <= absMax);
+ if (negate ? lastVal > absMax : lastVal < absMin) {
if (unfilled) {
- result = ParsedSection(Intermediate, last, used);
+ result = ParsedSection(Intermediate, lastVal, used);
} else if (negate) {
- QDTPDEBUG << "invalid because" << last << "is greater than absoluteMax"
+ QDTPDEBUG << "invalid because" << lastVal << "is greater than absoluteMax"
<< absMax;
} else {
- QDTPDEBUG << "invalid because" << last << "is less than absoluteMin"
+ QDTPDEBUG << "invalid because" << lastVal << "is less than absoluteMin"
<< absMin;
}
} else if (unfilled && (fi & (FixedWidth | Numeric)) == (FixedWidth | Numeric)) {
if (skipToNextSection(sectionIndex, currentValue, digitsStr)) {
const int missingZeroes = sectionmaxsize - digitsStr.size();
- result = ParsedSection(Acceptable, last, sectionmaxsize, missingZeroes);
- m_text.insert(offset, QString(missingZeroes, QLatin1Char('0')));
+ result = ParsedSection(Acceptable, lastVal, sectionmaxsize, missingZeroes);
+ m_text.insert(offset, QString(missingZeroes, u'0'));
++(const_cast<QDateTimeParser*>(this)->sectionNodes[sectionIndex].zeroesAdded);
} else {
- result = ParsedSection(Intermediate, last, used);;
+ result = ParsedSection(Intermediate, lastVal, used);
}
} else {
- result = ParsedSection(Acceptable, last, used);
+ result = ParsedSection(Acceptable, lastVal, used);
}
}
}
@@ -1003,11 +990,18 @@ static int weekDayWithinMonth(QCalendar calendar, int year, int month, int day,
const int maxDay = calendar.daysInMonth(month, year); // 0 if no such month
day = maxDay > 1 ? qBound(1, day, maxDay) : qMax(1, day);
day += dayOfWeekDiff(weekDay, calendar.dayOfWeek(QDate(year, month, day, calendar)));
- if (day <= 0)
- return day + 7;
- if (maxDay > 0 && day > maxDay)
- return day - 7;
- return day;
+ return day <= 0 ? day + 7 : maxDay > 0 && day > maxDay ? day - 7 : day;
+}
+
+/*!
+ \internal
+ Returns whichever of baseYear through baseYear + 99 has its % 100 == y2d.
+*/
+static int yearInCenturyFrom(int y2d, int baseYear)
+{
+ Q_ASSERT(0 <= y2d && y2d < 100);
+ const int year = baseYear - baseYear % 100 + y2d;
+ return year < baseYear ? year + 100 : year;
}
/*!
@@ -1018,21 +1012,21 @@ static int weekDayWithinMonth(QCalendar calendar, int year, int month, int day,
when on valid date is consistent with the data.
*/
-static QDate actualDate(QDateTimeParser::Sections known, const QCalendar &calendar,
+static QDate actualDate(QDateTimeParser::Sections known, QCalendar calendar, int baseYear,
int year, int year2digits, int month, int day, int dayofweek)
{
QDate actual(year, month, day, calendar);
if (actual.isValid() && year % 100 == year2digits && calendar.dayOfWeek(actual) == dayofweek)
return actual; // The obvious candidate is fine :-)
- if (dayofweek < 1 || dayofweek > 7) // Invalid: ignore
+ if (dayofweek < 1 || dayofweek > 7) // Intercallary (or invalid): ignore
known &= ~QDateTimeParser::DayOfWeekSectionMask;
// Assuming year > 0 ...
if (year % 100 != year2digits) {
if (known & QDateTimeParser::YearSection2Digits) {
// Over-ride year, even if specified:
- year += year2digits - year % 100;
+ year = yearInCenturyFrom(year2digits, baseYear);
known &= ~QDateTimeParser::YearSection;
} else {
year2digits = year % 100;
@@ -1049,16 +1043,21 @@ static QDate actualDate(QDateTimeParser::Sections known, const QCalendar &calend
}
QDate first(year, month, 1, calendar);
- int last = known & QDateTimeParser::YearSection && known & QDateTimeParser::MonthSection
- ? first.daysInMonth(calendar) : 0;
+ int last = known & QDateTimeParser::MonthSection
+ ? (known.testAnyFlag(QDateTimeParser::YearSectionMask)
+ ? calendar.daysInMonth(month, year) : calendar.daysInMonth(month))
+ : 0;
+ // We can only fix DOW if we know year as well as month (hence last):
+ const bool fixDayOfWeek = last && known & QDateTimeParser::YearSection
+ && known & QDateTimeParser::DayOfWeekSectionMask;
// If we also know day-of-week, tweak last to the last in the month that matches it:
- if (last && known & QDateTimeParser::DayOfWeekSectionMask) {
- int diff = (dayofweek - calendar.dayOfWeek(first) - last) % 7;
+ if (fixDayOfWeek) {
+ const int diff = (dayofweek - calendar.dayOfWeek(first) - last) % 7;
Q_ASSERT(diff <= 0); // C++11 specifies (-ve) % (+ve) to be <= 0.
last += diff;
}
if (day < 1) {
- if (known & QDateTimeParser::DayOfWeekSectionMask && last) {
+ if (fixDayOfWeek) {
day = 1 + dayofweek - calendar.dayOfWeek(first);
if (day < 1)
day += 7;
@@ -1066,7 +1065,7 @@ static QDate actualDate(QDateTimeParser::Sections known, const QCalendar &calend
day = 1;
}
known &= ~QDateTimeParser::DaySection;
- } else if (day > 31) {
+ } else if (day > calendar.maximumDaysInMonth()) {
day = last;
known &= ~QDateTimeParser::DaySection;
} else if (last && day > last && (known & QDateTimeParser::DaySection) == 0) {
@@ -1122,20 +1121,11 @@ static QDate actualDate(QDateTimeParser::Sections known, const QCalendar &calend
if ((known & QDateTimeParser::YearSection) == 0) {
if (known & QDateTimeParser::YearSection2Digits) {
- /*
- Two-digit year and month are specified; choice of century can only
- fix this if diff is in one of {1, 2, 5} or {2, 4, 6}; but not if
- diff is in the other. It's also only reasonable to consider
- adjacent century, e.g. if year thinks it's 2012 and two-digit year
- is '97, it makes sense to consider 1997. If either adjacent
- century does work, the other won't.
- */
- actual = QDate(year + 100, month, day, calendar);
- if (calendar.dayOfWeek(actual) == dayofweek)
- return actual;
- actual = QDate(year - 100, month, day, calendar);
- if (calendar.dayOfWeek(actual) == dayofweek)
+ actual = calendar.matchCenturyToWeekday({year, month, day}, dayofweek);
+ if (actual.isValid()) {
+ Q_ASSERT(calendar.dayOfWeek(actual) == dayofweek);
return actual;
+ }
} else {
// Offset by 7 is usually enough, but rare cases may need more:
for (int y = 1; y < 12; y++) {
@@ -1188,6 +1178,48 @@ static QTime actualTime(QDateTimeParser::Sections known,
return actual;
}
+/*
+ \internal
+*/
+static int startsWithLocalTimeZone(QStringView name, const QDateTime &when, const QLocale &locale)
+{
+ // Pick longest match that we might get.
+ qsizetype longest = 0;
+ // On MS-Win, at least when system zone is UTC, the tzname[]s may be empty.
+ for (int i = 0; i < 2; ++i) {
+ const QString zone(qTzName(i));
+ if (zone.size() > longest && name.startsWith(zone))
+ longest = zone.size();
+ }
+ // Mimic each candidate QLocale::toString() could have used, to ensure round-trips work:
+ const auto consider = [name, &longest](QStringView zone) {
+ if (name.startsWith(zone)) {
+ // UTC-based zone's displayName() only includes seconds if non-zero:
+ if (9 > longest && zone.size() == 6 && zone.startsWith("UTC"_L1)
+ && name.sliced(6, 3) == ":00"_L1) {
+ longest = 9;
+ } else if (zone.size() > longest) {
+ longest = zone.size();
+ }
+ }
+ };
+#if QT_CONFIG(timezone)
+ /* QLocale::toString would skip this if locale == QLocale::system(), but we
+ might not be using the same system locale as whoever generated the text
+ we're parsing. So consider it anyway. */
+ {
+ const auto localWhen = QDateTime(when.date(), when.time());
+ consider(localWhen.timeRepresentation().displayName(
+ localWhen, QTimeZone::ShortName, locale));
+ }
+#else
+ Q_UNUSED(locale);
+#endif
+ consider(QDateTime(when.date(), when.time()).timeZoneAbbreviation());
+ Q_ASSERT(longest <= INT_MAX); // Timezone names are not that long.
+ return int(longest);
+}
+
/*!
\internal
*/
@@ -1210,26 +1242,7 @@ QDateTimeParser::scanString(const QDateTime &defaultValue, bool fixup) const
int second = defaultTime.second();
int msec = defaultTime.msec();
int dayofweek = calendar.dayOfWeek(defaultDate);
- Qt::TimeSpec tspec = defaultValue.timeSpec();
- int zoneOffset = 0; // In seconds; local - UTC
-#if QT_CONFIG(timezone)
- QTimeZone timeZone;
-#endif
- switch (tspec) {
- case Qt::OffsetFromUTC: // timeZone is ignored
- zoneOffset = defaultValue.offsetFromUtc();
- break;
-#if QT_CONFIG(timezone)
- case Qt::TimeZone:
- timeZone = defaultValue.timeZone();
- if (timeZone.isValid())
- zoneOffset = timeZone.offsetFromUtc(defaultValue);
- // else: is there anything we can do about this ?
- break;
-#endif
- default: // zoneOffset and timeZone are ignored
- break;
- }
+ QTimeZone timeZone = defaultValue.timeRepresentation();
int ampm = -1;
Sections isSet = NoSection;
@@ -1237,29 +1250,25 @@ QDateTimeParser::scanString(const QDateTime &defaultValue, bool fixup) const
for (int index = 0; index < sectionNodesCount; ++index) {
Q_ASSERT(state != Invalid);
const QString &separator = separators.at(index);
- if (QStringView{m_text}.mid(pos, separator.size()) != separator) {
- QDTPDEBUG << "invalid because" << QStringView{m_text}.mid(pos, separator.size())
- << "!=" << separator
+ int step = matchesSeparator(QStringView{m_text}.sliced(pos), separator);
+ if (step == -1) {
+ QDTPDEBUG << "invalid because" << QStringView{m_text}.sliced(pos)
+ << "does not start with" << separator
<< index << pos << currentSectionIndex;
return StateNode();
}
- pos += separator.size();
+ pos += step;
sectionNodes[index].pos = pos;
int *current = nullptr;
+ int zoneOffset; // Needed to serve as *current when setting zone
const SectionNode sn = sectionNodes.at(index);
- ParsedSection sect;
-
- {
- const QDate date = actualDate(isSet, calendar, year, year2digits,
- month, day, dayofweek);
+ const QDateTime usedDateTime = [&] {
+ const QDate date = actualDate(isSet, calendar, defaultCenturyStart,
+ year, year2digits, month, day, dayofweek);
const QTime time = actualTime(isSet, hour, hour12, ampm, minute, second, msec);
- sect = parseSection(
-#if QT_CONFIG(timezone)
- tspec == Qt::TimeZone ? QDateTime(date, time, timeZone) :
-#endif
- QDateTime(date, time, tspec, zoneOffset),
- index, pos);
- }
+ return QDateTime(date, time, timeZone);
+ }();
+ ParsedSection sect = parseSection(usedDateTime, index, pos);
QDTPDEBUG << "sectionValue" << sn.name() << m_text
<< "pos" << pos << "used" << sect.used << stateName(sect.state);
@@ -1268,7 +1277,7 @@ QDateTimeParser::scanString(const QDateTime &defaultValue, bool fixup) const
if (fixup && sect.state == Intermediate && sect.used < sn.count) {
const FieldInfo fi = fieldInfo(index);
if ((fi & (Numeric|FixedWidth)) == (Numeric|FixedWidth)) {
- const QString newText = QString::fromLatin1("%1").arg(sect.value, sn.count, 10, QLatin1Char('0'));
+ const QString newText = QString::asprintf("%0*d", sn.count, sect.value);
m_text.replace(pos, sect.used, newText);
sect.used = sn.count;
}
@@ -1287,24 +1296,21 @@ QDateTimeParser::scanString(const QDateTime &defaultValue, bool fixup) const
QStringView zoneName = QStringView{m_text}.sliced(pos, sect.used);
Q_ASSERT(!zoneName.isEmpty()); // sect.used > 0
- const QStringView offsetStr = zoneName.startsWith(QLatin1String("UTC"))
- ? zoneName.sliced(3) : zoneName;
- const bool isUtcOffset = offsetStr.startsWith(QLatin1Char('+'))
- || offsetStr.startsWith(QLatin1Char('-'));
- const bool isUtc = zoneName == QLatin1String("Z")
- || zoneName == QLatin1String("UTC");
+ const QStringView offsetStr
+ = zoneName.startsWith("UTC"_L1) ? zoneName.sliced(3) : zoneName;
+ const bool isUtcOffset = offsetStr.startsWith(u'+') || offsetStr.startsWith(u'-');
+ const bool isUtc = zoneName == "Z"_L1 || zoneName == "UTC"_L1;
if (isUtc || isUtcOffset) {
- tspec = sect.value ? Qt::OffsetFromUTC : Qt::UTC;
- } else {
+ timeZone = QTimeZone::fromSecondsAheadOfUtc(sect.value);
#if QT_CONFIG(timezone)
- timeZone = QTimeZone(zoneName.toLatin1());
- tspec = timeZone.isValid()
- ? Qt::TimeZone
- : (Q_ASSERT(startsWithLocalTimeZone(zoneName)), Qt::LocalTime);
-#else
- tspec = Qt::LocalTime;
+ } else if (startsWithLocalTimeZone(zoneName, usedDateTime, locale()) != sect.used) {
+ QTimeZone namedZone = QTimeZone(zoneName.toLatin1());
+ Q_ASSERT(namedZone.isValid());
+ timeZone = namedZone;
#endif
+ } else {
+ timeZone = QTimeZone::LocalTime;
}
}
break;
@@ -1345,24 +1351,24 @@ QDateTimeParser::scanString(const QDateTime &defaultValue, bool fixup) const
isSet |= sn.type;
}
- if (QStringView{m_text}.sliced(pos) != separators.last()) {
+ int step = matchesSeparator(QStringView{m_text}.sliced(pos), separators.last());
+ if (step == -1 || step + pos < m_text.size()) {
QDTPDEBUG << "invalid because" << QStringView{m_text}.sliced(pos)
- << "!=" << separators.last() << pos;
+ << "does not match" << separators.last() << pos;
return StateNode();
}
if (parserType != QMetaType::QTime) {
if (year % 100 != year2digits && (isSet & YearSection2Digits)) {
+ const QDate date = actualDate(isSet, calendar, defaultCenturyStart,
+ year, year2digits, month, day, dayofweek);
if (!(isSet & YearSection)) {
- year = (year / 100) * 100;
- year += year2digits;
+ year = date.year();
} else {
conflicts = true;
const SectionNode &sn = sectionNode(currentSectionIndex);
- if (sn.type == YearSection2Digits) {
- year = (year / 100) * 100;
- year += year2digits;
- }
+ if (sn.type == YearSection2Digits)
+ year = date.year();
}
}
@@ -1445,42 +1451,42 @@ QDateTimeParser::scanString(const QDateTime &defaultValue, bool fixup) const
const QDate date(year, month, day, calendar);
const QTime time(hour, minute, second, msec);
- const QDateTime when =
-#if QT_CONFIG(timezone)
- tspec == Qt::TimeZone ? QDateTime(date, time, timeZone) :
-#endif
- QDateTime(date, time, tspec, zoneOffset);
-
- // If hour wasn't specified, check the default we're using exists on the
- // given date (which might be a spring-forward, skipping an hour).
- if (!(isSet & HourSectionMask) && !when.isValid()) {
- switch (parserType) {
- case QMetaType::QDateTime: {
- qint64 msecs = when.toMSecsSinceEpoch();
- // Fortunately, that gets a useful answer, even though when is invalid ...
- const QDateTime replace =
-#if QT_CONFIG(timezone)
- tspec == Qt::TimeZone ? QDateTime::fromMSecsSinceEpoch(msecs, timeZone) :
-#endif
- QDateTime::fromMSecsSinceEpoch(msecs, tspec, zoneOffset);
- const QTime tick = replace.time();
- if (replace.date() == date
- && (!(isSet & MinuteSection) || tick.minute() == minute)
- && (!(isSet & SecondSection) || tick.second() == second)
- && (!(isSet & MSecSection) || tick.msec() == msec)) {
- return StateNode(replace, state, padding, conflicts);
+ const QDateTime when = QDateTime(date, time, timeZone);
+
+ if (when.time() != time || when.date() != date) {
+ // In a spring-forward, if we hit the skipped hour, we may have been
+ // shunted out of it.
+
+ // If hour wasn't specified, so we're using our default, changing it may
+ // fix that.
+ if (!(isSet & HourSectionMask)) {
+ switch (parserType) {
+ case QMetaType::QDateTime: {
+ qint64 msecs = when.toMSecsSinceEpoch();
+ // Fortunately, that gets a useful answer, even though when is invalid ...
+ const QDateTime replace = QDateTime::fromMSecsSinceEpoch(msecs, timeZone);
+ const QTime tick = replace.time();
+ if (replace.date() == date
+ && (!(isSet & MinuteSection) || tick.minute() == minute)
+ && (!(isSet & SecondSection) || tick.second() == second)
+ && (!(isSet & MSecSection) || tick.msec() == msec)) {
+ return StateNode(replace, state, padding, conflicts);
+ }
+ } break;
+ case QMetaType::QDate:
+ // Don't care about time, so just use start of day (and ignore spec):
+ return StateNode(date.startOfDay(QTimeZone::UTC),
+ state, padding, conflicts);
+ break;
+ case QMetaType::QTime:
+ // Don't care about date or representation, so pick a safe representation:
+ return StateNode(QDateTime(date, time, QTimeZone::UTC),
+ state, padding, conflicts);
+ default:
+ Q_UNREACHABLE_RETURN(StateNode());
}
- } break;
- case QMetaType::QDate:
- // Don't care about time, so just use start of day (and ignore spec):
- return StateNode(date.startOfDay(Qt::UTC), state, padding, conflicts);
- break;
- case QMetaType::QTime:
- // Don't care about date or spec, so pick a safe spec:
- return StateNode(QDateTime(date, time, Qt::UTC), state, padding, conflicts);
- default:
- Q_UNREACHABLE();
- return StateNode();
+ } else if (state > Intermediate) {
+ state = Intermediate;
}
}
@@ -1502,7 +1508,7 @@ QDateTimeParser::parse(const QString &input, int position,
QDTPDEBUG << "parse" << input;
StateNode scan = scanString(defaultValue, fixup);
QDTPDEBUGN("'%s' => '%s'(%s)", m_text.toLatin1().constData(),
- scan.value.toString(QLatin1String("yyyy/MM/dd hh:mm:ss.zzz")).toLatin1().constData(),
+ scan.value.toString("yyyy/MM/dd hh:mm:ss.zzz"_L1).toLatin1().constData(),
stateName(scan.state).toLatin1().constData());
if (scan.value.isValid() && scan.state != Invalid) {
@@ -1631,12 +1637,8 @@ QDateTimeParser::parse(const QString &input, int position,
}
}
- /*
- We might have ended up with an invalid datetime: the non-existent hour
- during dst changes, for instance.
- */
- if (!scan.value.isValid() && scan.state == Acceptable)
- scan.state = Intermediate;
+ // An invalid time should only arise if we set the state to less than acceptable:
+ Q_ASSERT(scan.value.isValid() || scan.state != Acceptable);
return scan;
}
@@ -1652,7 +1654,7 @@ QDateTimeParser::parse(const QString &input, int position,
length of overlap in *used (if \a used is non-NULL) and the first entry that
overlapped this much in *usedText (if \a usedText is non-NULL).
*/
-static int findTextEntry(const QString &text, const ShortVector<QString> &entries, QString *usedText, int *used)
+static int findTextEntry(QStringView text, const ShortVector<QString> &entries, QString *usedText, int *used)
{
if (text.isEmpty())
return -1;
@@ -1689,7 +1691,7 @@ static int findTextEntry(const QString &text, const ShortVector<QString> &entrie
match. Starting from \a index; str should already by lowered
*/
-int QDateTimeParser::findMonth(const QString &str1, int startMonth, int sectionIndex,
+int QDateTimeParser::findMonth(QStringView str, int startMonth, int sectionIndex,
int year, QString *usedMonth, int *used) const
{
const SectionNode &sn = sectionNode(sectionIndex);
@@ -1705,11 +1707,11 @@ int QDateTimeParser::findMonth(const QString &str1, int startMonth, int sectionI
for (int month = startMonth; month <= 12; ++month)
monthNames.append(calendar.monthName(l, month, year, type));
- const int index = findTextEntry(str1, monthNames, usedMonth, used);
+ const int index = findTextEntry(str, monthNames, usedMonth, used);
return index < 0 ? index : index + startMonth;
}
-int QDateTimeParser::findDay(const QString &str1, int startDay, int sectionIndex, QString *usedDay, int *used) const
+int QDateTimeParser::findDay(QStringView str, int startDay, int sectionIndex, QString *usedDay, int *used) const
{
const SectionNode &sn = sectionNode(sectionIndex);
if (!(sn.type & DaySectionMask)) {
@@ -1724,7 +1726,7 @@ int QDateTimeParser::findDay(const QString &str1, int startDay, int sectionIndex
for (int day = startDay; day <= 7; ++day)
daysOfWeek.append(l.dayName(day, type));
- const int index = findTextEntry(str1, daysOfWeek, usedDay, used);
+ const int index = findTextEntry(str, daysOfWeek, usedDay, used);
return index < 0 ? index : index + startDay;
}
@@ -1733,24 +1735,29 @@ int QDateTimeParser::findDay(const QString &str1, int startDay, int sectionIndex
Return's .value is UTC offset in seconds.
The caller must verify that the offset is within a valid range.
+ The mode is 1 for permissive parsing, 2 and 3 for strict offset-only format
+ (no UTC prefix) with no colon for 2 and a colon for 3.
*/
-QDateTimeParser::ParsedSection QDateTimeParser::findUtcOffset(QStringView str) const
+QDateTimeParser::ParsedSection QDateTimeParser::findUtcOffset(QStringView str, int mode) const
{
- const bool startsWithUtc = str.startsWith(QLatin1String("UTC"));
- // Get rid of UTC prefix if it exists
+ Q_ASSERT(mode > 0 && mode < 4);
+ const bool startsWithUtc = str.startsWith("UTC"_L1);
+ // Deal with UTC prefix if present:
if (startsWithUtc) {
+ if (mode != 1)
+ return ParsedSection();
str = str.sliced(3);
if (str.isEmpty())
return ParsedSection(Acceptable, 0, 3);
}
- const bool negativeSign = str.startsWith(QLatin1Char('-'));
+ const bool negativeSign = str.startsWith(u'-');
// Must start with a sign:
- if (!negativeSign && !str.startsWith(QLatin1Char('+')))
+ if (!negativeSign && !str.startsWith(u'+'))
return ParsedSection();
str = str.sliced(1); // drop sign
- const int colonPosition = str.indexOf(QLatin1Char(':'));
+ const int colonPosition = str.indexOf(u':');
// Colon that belongs to offset is at most at position 2 (hh:mm)
bool hasColon = (colonPosition >= 0 && colonPosition < 3);
@@ -1772,6 +1779,8 @@ QDateTimeParser::ParsedSection QDateTimeParser::findUtcOffset(QStringView str) c
i = hoursLength;
hasColon = false;
}
+ if (mode == (hasColon ? 2 : 3))
+ return ParsedSection();
str.truncate(i); // The rest of the string is not part of the UTC offset
bool isInt = false;
@@ -1810,7 +1819,7 @@ QDateTimeParser::ParsedSection QDateTimeParser::findUtcOffset(QStringView str) c
QDateTimeParser::ParsedSection
QDateTimeParser::findTimeZoneName(QStringView str, const QDateTime &when) const
{
- const int systemLength = startsWithLocalTimeZone(str);
+ const int systemLength = startsWithLocalTimeZone(str, when, locale());
#if QT_CONFIG(timezone)
// Collect up plausibly-valid characters; let QTimeZone work out what's
// truly valid.
@@ -1828,7 +1837,7 @@ QDateTimeParser::findTimeZoneName(QStringView str, const QDateTime &when) const
int count = 0;
Q_ASSERT(index <= str.size());
while (lastSlash < index) {
- int slash = str.indexOf(QLatin1Char('/'), lastSlash + 1);
+ int slash = str.indexOf(u'/', lastSlash + 1);
if (slash < 0 || slash > index)
slash = index; // i.e. the end of the candidate text
else if (++count > 5)
@@ -1856,17 +1865,26 @@ QDateTimeParser::findTimeZoneName(QStringView str, const QDateTime &when) const
Return's .value is zone's offset, zone time - UTC time, in seconds.
See QTimeZonePrivate::isValidId() for the format of zone names.
- */
+
+ The mode is the number of 't' characters in the field specifier:
+ * 1: any recognized format
+ * 2: only the simple offset format, without colon
+ * 3: only the simple offset format, with colon
+ * 4: only a zone name
+*/
QDateTimeParser::ParsedSection
QDateTimeParser::findTimeZone(QStringView str, const QDateTime &when,
- int maxVal, int minVal) const
+ int maxVal, int minVal, int mode) const
{
+ Q_ASSERT(mode > 0 && mode <= 4);
// Short-cut Zulu suffix when it's all there is (rather than a prefix match):
- if (str == QLatin1Char('Z'))
+ if (mode == 1 && str == u'Z')
return ParsedSection(Acceptable, 0, 1);
- ParsedSection section = findUtcOffset(str);
- if (section.used <= 0) // if nothing used, try time zone parsing
+ ParsedSection section;
+ if (mode != 4)
+ section = findUtcOffset(str, mode);
+ if (mode != 2 && mode != 3 && section.used <= 0) // if nothing used, try time zone parsing
section = findTimeZoneName(str, when);
// It can be a well formed time zone specifier, but with value out of range
if (section.state == Acceptable && (section.value < minVal || section.value > maxVal))
@@ -1874,11 +1892,13 @@ QDateTimeParser::findTimeZone(QStringView str, const QDateTime &when,
if (section.used > 0)
return section;
- // Check if string is UTC or alias to UTC, after all other options
- if (str.startsWith(QLatin1String("UTC")))
- return ParsedSection(Acceptable, 0, 3);
- if (str.startsWith(QLatin1Char('Z')))
- return ParsedSection(Acceptable, 0, 1);
+ if (mode == 1) {
+ // Check if string is UTC or alias to UTC, after all other options
+ if (str.startsWith("UTC"_L1))
+ return ParsedSection(Acceptable, 0, 3);
+ if (str.startsWith(u'Z'))
+ return ParsedSection(Acceptable, 0, 1);
+ }
return ParsedSection();
}
@@ -1937,20 +1957,21 @@ QDateTimeParser::AmPmFinder QDateTimeParser::findAmPm(QString &str, int sectionI
bool broken[2] = {false, false};
for (int i=0; i<size; ++i) {
- if (str.at(i) != space) {
+ const QChar ch = str.at(i);
+ if (ch != space) {
for (int j=0; j<2; ++j) {
if (!broken[j]) {
- int index = ampm[j].indexOf(str.at(i));
- QDTPDEBUG << "looking for" << str.at(i)
+ int index = ampm[j].indexOf(ch);
+ QDTPDEBUG << "looking for" << ch
<< "in" << ampm[j] << "and got" << index;
if (index == -1) {
- if (str.at(i).category() == QChar::Letter_Uppercase) {
- index = ampm[j].indexOf(str.at(i).toLower());
- QDTPDEBUG << "trying with" << str.at(i).toLower()
+ if (ch.category() == QChar::Letter_Uppercase) {
+ index = ampm[j].indexOf(ch.toLower());
+ QDTPDEBUG << "trying with" << ch.toLower()
<< "in" << ampm[j] << "and got" << index;
- } else if (str.at(i).category() == QChar::Letter_Lowercase) {
- index = ampm[j].indexOf(str.at(i).toUpper());
- QDTPDEBUG << "trying with" << str.at(i).toUpper()
+ } else if (ch.category() == QChar::Letter_Lowercase) {
+ index = ampm[j].indexOf(ch.toUpper());
+ QDTPDEBUG << "trying with" << ch.toUpper()
<< "in" << ampm[j] << "and got" << index;
}
if (index == -1) {
@@ -2061,18 +2082,18 @@ QString QDateTimeParser::SectionNode::format() const
{
QChar fillChar;
switch (type) {
- case AmPmSection: return QLatin1String(count == 1 ? "ap" : count == 2 ? "AP" : "Ap");
- case MSecSection: fillChar = QLatin1Char('z'); break;
- case SecondSection: fillChar = QLatin1Char('s'); break;
- case MinuteSection: fillChar = QLatin1Char('m'); break;
- case Hour24Section: fillChar = QLatin1Char('H'); break;
- case Hour12Section: fillChar = QLatin1Char('h'); break;
+ case AmPmSection: return count == 1 ? "ap"_L1 : count == 2 ? "AP"_L1 : "Ap"_L1;
+ case MSecSection: fillChar = u'z'; break;
+ case SecondSection: fillChar = u's'; break;
+ case MinuteSection: fillChar = u'm'; break;
+ case Hour24Section: fillChar = u'H'; break;
+ case Hour12Section: fillChar = u'h'; break;
case DayOfWeekSectionShort:
case DayOfWeekSectionLong:
- case DaySection: fillChar = QLatin1Char('d'); break;
- case MonthSection: fillChar = QLatin1Char('M'); break;
+ case DaySection: fillChar = u'd'; break;
+ case MonthSection: fillChar = u'M'; break;
case YearSection2Digits:
- case YearSection: fillChar = QLatin1Char('y'); break;
+ case YearSection: fillChar = u'y'; break;
default:
qWarning("QDateTimeParser::sectionFormat Internal error (%ls)",
qUtf16Printable(name(type)));
@@ -2170,23 +2191,23 @@ bool QDateTimeParser::skipToNextSection(int index, const QDateTime &current, QSt
QString QDateTimeParser::SectionNode::name(QDateTimeParser::Section s)
{
switch (s) {
- case QDateTimeParser::AmPmSection: return QLatin1String("AmPmSection");
- case QDateTimeParser::DaySection: return QLatin1String("DaySection");
- case QDateTimeParser::DayOfWeekSectionShort: return QLatin1String("DayOfWeekSectionShort");
- case QDateTimeParser::DayOfWeekSectionLong: return QLatin1String("DayOfWeekSectionLong");
- case QDateTimeParser::Hour24Section: return QLatin1String("Hour24Section");
- case QDateTimeParser::Hour12Section: return QLatin1String("Hour12Section");
- case QDateTimeParser::MSecSection: return QLatin1String("MSecSection");
- case QDateTimeParser::MinuteSection: return QLatin1String("MinuteSection");
- case QDateTimeParser::MonthSection: return QLatin1String("MonthSection");
- case QDateTimeParser::SecondSection: return QLatin1String("SecondSection");
- case QDateTimeParser::TimeZoneSection: return QLatin1String("TimeZoneSection");
- case QDateTimeParser::YearSection: return QLatin1String("YearSection");
- case QDateTimeParser::YearSection2Digits: return QLatin1String("YearSection2Digits");
- case QDateTimeParser::NoSection: return QLatin1String("NoSection");
- case QDateTimeParser::FirstSection: return QLatin1String("FirstSection");
- case QDateTimeParser::LastSection: return QLatin1String("LastSection");
- default: return QLatin1String("Unknown section ") + QString::number(int(s));
+ case AmPmSection: return "AmPmSection"_L1;
+ case DaySection: return "DaySection"_L1;
+ case DayOfWeekSectionShort: return "DayOfWeekSectionShort"_L1;
+ case DayOfWeekSectionLong: return "DayOfWeekSectionLong"_L1;
+ case Hour24Section: return "Hour24Section"_L1;
+ case Hour12Section: return "Hour12Section"_L1;
+ case MSecSection: return "MSecSection"_L1;
+ case MinuteSection: return "MinuteSection"_L1;
+ case MonthSection: return "MonthSection"_L1;
+ case SecondSection: return "SecondSection"_L1;
+ case TimeZoneSection: return "TimeZoneSection"_L1;
+ case YearSection: return "YearSection"_L1;
+ case YearSection2Digits: return "YearSection2Digits"_L1;
+ case NoSection: return "NoSection"_L1;
+ case FirstSection: return "FirstSection"_L1;
+ case LastSection: return "LastSection"_L1;
+ default: return "Unknown section "_L1 + QString::number(int(s));
}
}
@@ -2198,18 +2219,33 @@ QString QDateTimeParser::SectionNode::name(QDateTimeParser::Section s)
QString QDateTimeParser::stateName(State s) const
{
switch (s) {
- case Invalid: return QLatin1String("Invalid");
- case Intermediate: return QLatin1String("Intermediate");
- case Acceptable: return QLatin1String("Acceptable");
- default: return QLatin1String("Unknown state ") + QString::number(s);
+ case Invalid: return "Invalid"_L1;
+ case Intermediate: return "Intermediate"_L1;
+ case Acceptable: return "Acceptable"_L1;
+ default: return "Unknown state "_L1 + QString::number(s);
}
}
+
+/*!
+ \internal
+ Compute a defaultValue to pass to parse().
+*/
+QDateTime QDateTimeParser::baseDate(const QTimeZone &zone) const
+{
+ QDateTime when = QDate(defaultCenturyStart, 1, 1).startOfDay(zone);
+ if (const QDateTime start = getMinimum(); when < start)
+ return start;
+ if (const QDateTime end = getMaximum(); when > end)
+ return end;
+ return when;
+}
+
// Only called when we want only one of date or time; use UTC to avoid bogus DST issues.
-bool QDateTimeParser::fromString(const QString &t, QDate *date, QTime *time) const
+bool QDateTimeParser::fromString(const QString &t, QDate *date, QTime *time, int baseYear) const
{
- QDateTime val(QDate(1900, 1, 1).startOfDay(Qt::UTC));
- const StateNode tmp = parse(t, -1, val, false);
+ defaultCenturyStart = baseYear;
+ const StateNode tmp = parse(t, -1, baseDate(QTimeZone::UTC), false);
if (tmp.state != Acceptable || tmp.conflicts)
return false;
@@ -2232,13 +2268,13 @@ bool QDateTimeParser::fromString(const QString &t, QDate *date, QTime *time) con
}
// Only called when we want both date and time; default to local time.
-bool QDateTimeParser::fromString(const QString &t, QDateTime *datetime) const
+bool QDateTimeParser::fromString(const QString &t, QDateTime *datetime, int baseYear) const
{
- QDateTime val(QDate(1900, 1, 1).startOfDay());
- const StateNode tmp = parse(t, -1, val, false);
+ defaultCenturyStart = baseYear;
+ const StateNode tmp = parse(t, -1, baseDate(QTimeZone::LocalTime), false);
if (datetime)
*datetime = tmp.value;
- return tmp.state == Acceptable && !tmp.conflicts && tmp.value.isValid();
+ return tmp.state >= Intermediate && !tmp.conflicts && tmp.value.isValid();
}
QDateTime QDateTimeParser::getMinimum() const
@@ -2248,7 +2284,7 @@ QDateTime QDateTimeParser::getMinimum() const
// method. At the time of writing, this is done by QDateTimeEditPrivate.
// Cache the only case
- static const QDateTime localTimeMin(QDATETIMEEDIT_DATE_MIN.startOfDay(Qt::LocalTime));
+ static const QDateTime localTimeMin(QDATETIMEEDIT_DATE_MIN.startOfDay());
return localTimeMin;
}
@@ -2259,7 +2295,7 @@ QDateTime QDateTimeParser::getMaximum() const
// method. At the time of writing, this is done by QDateTimeEditPrivate.
// Cache the only case
- static const QDateTime localTimeMax(QDATETIMEEDIT_DATE_MAX.endOfDay(Qt::LocalTime));
+ static const QDateTime localTimeMax(QDATETIMEEDIT_DATE_MAX.endOfDay());
return localTimeMax;
}
@@ -2269,12 +2305,11 @@ QString QDateTimeParser::getAmPmText(AmPm ap, Case cs) const
QString raw = ap == AmText ? loc.amText() : loc.pmText();
switch (cs)
{
- case UpperCase: return raw.toUpper();
- case LowerCase: return raw.toLower();
+ case UpperCase: return std::move(raw).toUpper();
+ case LowerCase: return std::move(raw).toLower();
case NativeCase: return raw;
}
- Q_UNREACHABLE();
- return raw;
+ Q_UNREACHABLE_RETURN(raw);
}
/*
@@ -2292,7 +2327,7 @@ bool operator==(const QDateTimeParser::SectionNode &s1, const QDateTimeParser::S
Sets \a cal as the calendar to use. The default is Gregorian.
*/
-void QDateTimeParser::setCalendar(const QCalendar &cal)
+void QDateTimeParser::setCalendar(QCalendar cal)
{
calendar = cal;
}
diff --git a/src/corelib/time/qdatetimeparser_p.h b/src/corelib/time/qdatetimeparser_p.h
index a5b20c5e35..faf383f3d7 100644
--- a/src/corelib/time/qdatetimeparser_p.h
+++ b/src/corelib/time/qdatetimeparser_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QDATETIMEPARSER_P_H
#define QDATETIMEPARSER_P_H
@@ -82,7 +46,7 @@ public:
FromString,
DateTimeEdit
};
- QDateTimeParser(QMetaType::Type t, Context ctx, const QCalendar &cal = QCalendar())
+ QDateTimeParser(QMetaType::Type t, Context ctx, QCalendar cal = QCalendar())
: parserType(t), context(ctx), calendar(cal)
{
defaultLocale = QLocale::system();
@@ -172,8 +136,9 @@ public:
StateNode parse(const QString &input, int position,
const QDateTime &defaultValue, bool fixup) const;
- bool fromString(const QString &text, QDate *date, QTime *time) const;
- bool fromString(const QString &text, QDateTime* datetime) const;
+ bool fromString(const QString &text, QDate *date, QTime *time,
+ int baseYear = QLocale::DefaultTwoDigitBaseYear) const;
+ bool fromString(const QString &text, QDateTime *datetime, int baseYear) const;
bool parseFormat(QStringView format);
enum FieldInfoFlag {
@@ -188,7 +153,7 @@ public:
void setDefaultLocale(const QLocale &loc) { defaultLocale = loc; }
virtual QString displayText() const { return m_text; }
- void setCalendar(const QCalendar &calendar);
+ void setCalendar(QCalendar calendar);
private:
int sectionMaxSize(Section s, int count) const;
@@ -205,16 +170,14 @@ private:
{}
};
ParsedSection parseSection(const QDateTime &currentValue, int sectionIndex, int offset) const;
- int findMonth(const QString &str1, int monthstart, int sectionIndex,
+ int findMonth(QStringView str, int monthstart, int sectionIndex,
int year, QString *monthName = nullptr, int *used = nullptr) const;
- int findDay(const QString &str1, int intDaystart, int sectionIndex,
+ int findDay(QStringView str, int intDaystart, int sectionIndex,
QString *dayName = nullptr, int *used = nullptr) const;
- ParsedSection findUtcOffset(QStringView str) const;
+ ParsedSection findUtcOffset(QStringView str, int mode) const;
ParsedSection findTimeZoneName(QStringView str, const QDateTime &when) const;
ParsedSection findTimeZone(QStringView str, const QDateTime &when,
- int maxVal, int minVal) const;
- // Implemented in qdatetime.cpp:
- static int startsWithLocalTimeZone(const QStringView name);
+ int maxVal, int minVal, int mode) const;
enum AmPmFinder {
Neither = -1,
@@ -241,6 +204,7 @@ private:
};
QString getAmPmText(AmPm ap, Case cs) const;
+ QDateTime baseDate(const QTimeZone &zone) const;
friend class QDTPUnitTestParser;
@@ -272,6 +236,7 @@ protected: // for the benefit of QDateTimeEditPrivate
virtual QLocale locale() const { return defaultLocale; }
mutable int currentSectionIndex = int(NoSectionIndex);
+ mutable int defaultCenturyStart = QLocale::DefaultTwoDigitBaseYear;
Sections display;
/*
This stores the most recently selected day.
diff --git a/src/corelib/time/qgregoriancalendar.cpp b/src/corelib/time/qgregoriancalendar.cpp
index 620e10e4b4..d46d24ac30 100644
--- a/src/corelib/time/qgregoriancalendar.cpp
+++ b/src/corelib/time/qgregoriancalendar.cpp
@@ -1,50 +1,34 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qgregoriancalendar_p.h"
#include "qcalendarmath_p.h"
+
#include <QtCore/qdatetime.h>
QT_BEGIN_NAMESPACE
using namespace QRoundingDown;
+// Verification that QRoundingDown::qDivMod() works correctly:
+static_assert(qDivMod<2>(-86400).quotient == -43200);
+static_assert(qDivMod<2>(-86400).remainder == 0);
+static_assert(qDivMod<86400>(-86400).quotient == -1);
+static_assert(qDivMod<86400>(-86400).remainder == 0);
+static_assert(qDivMod<86400>(-86401).quotient == -2);
+static_assert(qDivMod<86400>(-86401).remainder == 86399);
+static_assert(qDivMod<86400>(-100000).quotient == -2);
+static_assert(qDivMod<86400>(-100000).remainder == 72800);
+static_assert(qDivMod<86400>(-172799).quotient == -2);
+static_assert(qDivMod<86400>(-172799).remainder == 1);
+static_assert(qDivMod<86400>(-172800).quotient == -2);
+static_assert(qDivMod<86400>(-172800).remainder == 0);
+
+// Uncomment to verify error on bad denominator is clear and intelligible:
+// static_assert(qDivMod<1>(17).remainder == 0);
+// static_assert(qDivMod<0>(17).remainder == 0);
+// static_assert(qDivMod<std::numeric_limits<unsigned>::max()>(17).remainder == 0);
+
/*!
\since 5.14
@@ -109,41 +93,80 @@ bool QGregorianCalendar::validParts(int year, int month, int day)
int QGregorianCalendar::weekDayOfJulian(qint64 jd)
{
- return qMod(jd, 7) + 1;
+ return int(qMod<7>(jd) + 1);
}
bool QGregorianCalendar::dateToJulianDay(int year, int month, int day, qint64 *jd) const
{
- return julianFromParts(year, month, day, jd);
+ const auto maybe = julianFromParts(year, month, day);
+ if (maybe)
+ *jd = *maybe;
+ return bool(maybe);
}
-bool QGregorianCalendar::julianFromParts(int year, int month, int day, qint64 *jd)
+QCalendar::YearMonthDay QGregorianCalendar::julianDayToDate(qint64 jd) const
{
- Q_ASSERT(jd);
- if (!validParts(year, month, day))
- return false;
+ return partsFromJulian(jd);
+}
- if (year < 0)
- ++year;
+qint64
+QGregorianCalendar::matchCenturyToWeekday(const QCalendar::YearMonthDay &parts, int dow) const
+{
+ /* The Gregorian four-century cycle is a whole number of weeks long, so we
+ only need to consider four centuries, from previous through next-but-one.
+ There are thus three days of the week that can't happen, for any given
+ day-of-month, month and year-mod-100. (Exception: '00 Feb 29 has only one
+ option.)
+ */
+ auto maybe = julianFromParts(parts.year, parts.month, parts.day);
+ if (maybe) {
+ int diff = weekDayOfJulian(*maybe) - dow;
+ if (!diff)
+ return *maybe;
+ int year = parts.year < 0 ? parts.year + 1 : parts.year;
+ // What matters is the placement of leap days, so dates before March
+ // effectively belong with the dates since the preceding March:
+ const auto yearSplit = qDivMod<100>(year - (parts.month < 3 ? 1 : 0));
+ const int centuryMod4 = qMod<4>(yearSplit.quotient);
+ // Week-day shift for a century is 5, unless crossing a multiple of 400's Feb 29th.
+ static_assert(qMod<7>(36524) == 5); // and (3 * 5) % 7 = 1
+ // Formulae arrived at by case-by-case analysis of the values of
+ // centuryMod4 and diff (and the above clue to multiply by -3 = 4):
+ if (qMod<7>(diff * 4 + centuryMod4) < 4) {
+ // Century offset maps qMod<7>(diff) in {5, 6} to -1, {3, 4} to +2, and {1, 2} to +1:
+ year += (((qMod<7>(diff) + 3) / 2) % 4 - 1) * 100;
+ maybe = julianFromParts(year > 0 ? year : year - 1, parts.month, parts.day);
+ if (maybe && weekDayOfJulian(*maybe) == dow)
+ return *maybe;
+ Q_ASSERT(parts.month == 2 && parts.day == 29
+ && dow != int(Qt::Tuesday) && !(year % 100));
+ }
- /*
- * Math from The Calendar FAQ at http://www.tondering.dk/claus/cal/julperiod.php
- * This formula is correct for all julian days, when using mathematical integer
- * division (round to negative infinity), not c++11 integer division (round to zero)
- */
- int a = month < 3 ? 1 : 0;
- qint64 y = qint64(year) + 4800 - a;
- int m = month + 12 * a - 3;
- *jd = day + qDiv(153 * m + 2, 5) - 32045
- + 365 * y + qDiv(y, 4) - qDiv(y, 100) + qDiv(y, 400);
- return true;
+ } else if (parts.month == 2 && parts.day == 29) {
+ int year = parts.year < 0 ? parts.year + 1 : parts.year;
+ // Feb 29th on a century needs to resolve to a multiple of 400 years.
+ const auto yearSplit = qDivMod<100>(year);
+ if (!yearSplit.remainder) {
+ const auto centuryMod4 = qMod<4>(yearSplit.quotient);
+ Q_ASSERT(centuryMod4); // or we'd have got a valid date to begin with.
+ if (centuryMod4 == 1) // round down
+ year -= 100;
+ else // 2 or 3; round up
+ year += (4 - centuryMod4) * 100;
+ maybe = julianFromParts(year > 0 ? year : year - 1, parts.month, parts.day);
+ if (maybe && weekDayOfJulian(*maybe) == dow) // (Can only happen for Tuesday.)
+ return *maybe;
+ Q_ASSERT(dow != int(Qt::Tuesday));
+ }
+ }
+ return (std::numeric_limits<qint64>::min)();
}
int QGregorianCalendar::yearStartWeekDay(int year)
{
// Equivalent to weekDayOfJulian(julianForParts({year, 1, 1})
const int y = year - (year < 0 ? 800 : 801);
- return qMod(y + qDiv(y, 4) - qDiv(y, 100) + qDiv(y, 400), 7) + 1;
+ return qMod<7>(y + qDiv<4>(y) - qDiv<100>(y) + qDiv<400>(y)) + 1;
}
int QGregorianCalendar::yearSharingWeekDays(QDate date)
@@ -192,34 +215,52 @@ int QGregorianCalendar::yearSharingWeekDays(QDate date)
return res;
}
-QCalendar::YearMonthDay QGregorianCalendar::julianDayToDate(qint64 jd) const
+/*
+ * Math from The Calendar FAQ at http://www.tondering.dk/claus/cal/julperiod.php
+ * This formula is correct for all julian days, when using mathematical integer
+ * division (round to negative infinity), not c++11 integer division (round to zero).
+ *
+ * The source given uses 4801 BCE as base date; the following adjusts that by
+ * 4800 years to simplify part of the arithmetic (and match more closely what we
+ * do for Milankovic).
+ */
+
+using namespace QRomanCalendrical;
+// End a Gregorian four-century cycle on 1 BC's leap day:
+constexpr qint64 BaseJd = LeapDayGregorian1Bce;
+// Every four centures there are 97 leap years:
+constexpr unsigned FourCenturies = 400 * 365 + 97;
+
+std::optional<qint64> QGregorianCalendar::julianFromParts(int year, int month, int day)
{
- return partsFromJulian(jd);
+ if (!validParts(year, month, day))
+ return std::nullopt;
+
+ const auto yearDays = yearMonthToYearDays(year, month);
+ const qint64 y = yearDays.year;
+ const qint64 fromYear = 365 * y + qDiv<4>(y) - qDiv<100>(y) + qDiv<400>(y);
+ return fromYear + yearDays.days + day + BaseJd;
}
QCalendar::YearMonthDay QGregorianCalendar::partsFromJulian(qint64 jd)
{
- /*
- * Math from The Calendar FAQ at http://www.tondering.dk/claus/cal/julperiod.php
- * This formula is correct for all julian days, when using mathematical integer
- * division (round to negative infinity), not c++11 integer division (round to zero)
- */
- qint64 a = jd + 32044;
- qint64 b = qDiv(4 * a + 3, 146097);
- int c = a - qDiv(146097 * b, 4);
+ const qint64 dayNumber = jd - BaseJd;
+ const qint64 century = qDiv<FourCenturies>(4 * dayNumber - 1);
+ const int dayInCentury = dayNumber - qDiv<4>(FourCenturies * century);
- int d = qDiv(4 * c + 3, 1461);
- int e = c - qDiv(1461 * d, 4);
- int m = qDiv(5 * e + 2, 153);
+ const int yearInCentury = qDiv<FourYears>(4 * dayInCentury - 1);
+ const int dayInYear = dayInCentury - qDiv<4>(FourYears * yearInCentury);
+ const int m = qDiv<FiveMonths>(5 * dayInYear - 3);
+ Q_ASSERT(m < 12 && m >= 0);
+ // That m is a month adjusted to March = 0, with Jan = 10, Feb = 11 in the previous year.
+ const int yearOffset = m < 10 ? 0 : 1;
- int y = 100 * b + d - 4800 + qDiv(m, 10);
+ const int y = 100 * century + yearInCentury + yearOffset;
+ const int month = m + 3 - 12 * yearOffset;
+ const int day = dayInYear - qDiv<5>(FiveMonths * m + 2);
// Adjust for no year 0
- int year = y > 0 ? y : y - 1;
- int month = m + 3 - 12 * qDiv(m, 10);
- int day = e - qDiv(153 * m + 2, 5) + 1;
-
- return QCalendar::YearMonthDay(year, month, day);
+ return QCalendar::YearMonthDay(y > 0 ? y : y - 1, month, day);
}
QT_END_NAMESPACE
diff --git a/src/corelib/time/qgregoriancalendar_p.h b/src/corelib/time/qgregoriancalendar_p.h
index 7cec17c5a3..1093a7b9de 100644
--- a/src/corelib/time/qgregoriancalendar_p.h
+++ b/src/corelib/time/qgregoriancalendar_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QGREGORIAN_CALENDAR_P_H
#define QGREGORIAN_CALENDAR_P_H
@@ -53,6 +17,8 @@
#include "qromancalendar_p.h"
+#include <optional>
+
QT_BEGIN_NAMESPACE
class Q_CORE_EXPORT QGregorianCalendar : public QRomanCalendar
@@ -68,12 +34,7 @@ public:
// Julian Day conversions:
bool dateToJulianDay(int year, int month, int day, qint64 *jd) const override;
QCalendar::YearMonthDay julianDayToDate(qint64 jd) const override;
-
- // Names of months (implemented in qlocale.cpp):
- QString monthName(const QLocale &locale, int month, int year,
- QLocale::FormatType format) const override;
- QString standaloneMonthName(const QLocale &locale, int month, int year,
- QLocale::FormatType format) const override;
+ qint64 matchCenturyToWeekday(const QCalendar::YearMonthDay &parts, int dow) const override;
// Static optimized versions for the benefit of QDate:
static int weekDayOfJulian(qint64 jd);
@@ -81,7 +42,7 @@ public:
static int monthLength(int month, int year);
static bool validParts(int year, int month, int day);
static QCalendar::YearMonthDay partsFromJulian(qint64 jd);
- static bool julianFromParts(int year, int month, int day, qint64 *jd);
+ static std::optional<qint64> julianFromParts(int year, int month, int day);
// Used internally:
static int yearStartWeekDay(int year);
static int yearSharingWeekDays(QDate date);
diff --git a/src/corelib/time/qhijricalendar.cpp b/src/corelib/time/qhijricalendar.cpp
index c0f7662c0d..3d5a97c310 100644
--- a/src/corelib/time/qhijricalendar.cpp
+++ b/src/corelib/time/qhijricalendar.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qglobal.h"
#include "qhijricalendar_p.h"
@@ -115,12 +79,12 @@ int QHijriCalendar::daysInYear(int year) const
const QCalendarLocale *QHijriCalendar::localeMonthIndexData() const
{
- return locale_data;
+ return QtPrivate::Hijri::locale_data;
}
const char16_t *QHijriCalendar::localeMonthData() const
{
- return months_data;
+ return QtPrivate::Hijri::months_data;
}
QT_END_NAMESPACE
diff --git a/src/corelib/time/qhijricalendar_data_p.h b/src/corelib/time/qhijricalendar_data_p.h
index d42e46d706..a52bf1dc4e 100644
--- a/src/corelib/time/qhijricalendar_data_p.h
+++ b/src/corelib/time/qhijricalendar_data_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2019 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2019 The Qt Company Ltd.
+// SPDX-License-Identifier: Unicode-3.0
#ifndef QHIJRI_CALENDAR_DATA_P_H
#define QHIJRI_CALENDAR_DATA_P_H
@@ -56,11 +20,13 @@
QT_BEGIN_NAMESPACE
+namespace QtPrivate::Hijri {
+
// GENERATED PART STARTS HERE
/*
- This part of the file was generated on 2021-11-09 from the
- Common Locale Data Repository v40
+ This part of the file was generated on 2024-01-09 from the
+ Common Locale Data Repository v44.1
http://www.unicode.org/cldr/
@@ -69,77 +35,82 @@ QT_BEGIN_NAMESPACE
edited) CLDR data; see qtbase/util/locale_database/.
*/
-static const QCalendarLocale locale_data[] = {
+static constexpr QCalendarLocale locale_data[] = {
// lang script terr sLong long sShrt short sNarw narow Sizes...
{ 1, 0, 0, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// C/AnyScript/AnyTerritory
{ 2, 27, 90, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Abkhazian/Cyrillic/Georgia
{ 3, 66, 77, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Afar/Latin/Ethiopia
+ { 3, 66, 67, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Afar/Latin/Djibouti
+ { 3, 66, 74, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Afar/Latin/Eritrea
{ 4, 66, 216, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Afrikaans/Latin/South Africa
{ 4, 66, 162, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Afrikaans/Latin/Namibia
{ 5, 66, 40, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Aghem/Latin/Cameroon
{ 6, 66, 92, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Akan/Latin/Ghana
{ 8, 66, 40, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Akoose/Latin/Cameroon
- { 9, 66, 3, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Albanian/Latin/Albania
- { 9, 66, 126, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Albanian/Latin/Kosovo
- { 9, 66, 140, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Albanian/Latin/Macedonia
- { 11, 33, 77, 210, 210, 106, 106, 184, 184, 74, 74, 78, 78, 26, 26 },// Amharic/Ethiopic/Ethiopia
- { 14, 4, 71, 284, 284, 284, 284, 380, 380, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/Egypt
- { 14, 4, 4, 284, 284, 284, 284, 380, 380, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/Algeria
- { 14, 4, 19, 284, 284, 284, 284, 380, 380, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/Bahrain
- { 14, 4, 48, 284, 284, 284, 284, 380, 380, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/Chad
- { 14, 4, 55, 284, 284, 284, 284, 380, 380, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/Comoros
- { 14, 4, 67, 284, 284, 284, 284, 380, 380, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/Djibouti
- { 14, 4, 74, 284, 284, 284, 284, 380, 380, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/Eritrea
- { 14, 4, 113, 284, 284, 284, 284, 380, 380, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/Iraq
- { 14, 4, 116, 284, 284, 284, 284, 380, 380, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/Israel
- { 14, 4, 122, 284, 284, 284, 284, 380, 380, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/Jordan
- { 14, 4, 127, 284, 284, 284, 284, 380, 380, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/Kuwait
- { 14, 4, 132, 284, 284, 284, 284, 380, 380, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/Lebanon
- { 14, 4, 135, 284, 284, 284, 284, 380, 380, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/Libya
- { 14, 4, 149, 284, 284, 284, 284, 380, 380, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/Mauritania
- { 14, 4, 159, 284, 284, 284, 284, 380, 380, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/Morocco
- { 14, 4, 176, 284, 284, 284, 284, 380, 380, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/Oman
- { 14, 4, 180, 284, 284, 284, 284, 380, 380, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/Palestinian Territories
- { 14, 4, 190, 284, 284, 284, 284, 380, 380, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/Qatar
- { 14, 4, 205, 284, 284, 284, 284, 380, 380, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/Saudi Arabia
- { 14, 4, 215, 284, 284, 284, 284, 380, 380, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/Somalia
- { 14, 4, 219, 284, 284, 284, 284, 380, 380, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/South Sudan
- { 14, 4, 222, 284, 284, 284, 284, 380, 380, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/Sudan
- { 14, 4, 227, 284, 284, 284, 284, 380, 380, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/Syria
- { 14, 4, 238, 284, 284, 284, 284, 380, 380, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/Tunisia
- { 14, 4, 245, 284, 284, 284, 284, 380, 380, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/United Arab Emirates
- { 14, 4, 257, 284, 284, 284, 284, 380, 380, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/Western Sahara
- { 14, 4, 258, 284, 284, 284, 284, 380, 380, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/World
- { 14, 4, 259, 284, 284, 284, 284, 380, 380, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/Yemen
+ { 9, 66, 3, 210, 325, 440, 519, 184, 184,115,115, 79, 79, 26, 26 },// Albanian/Latin/Albania
+ { 9, 66, 126, 210, 325, 440, 519, 184, 184,115,115, 79, 79, 26, 26 },// Albanian/Latin/Kosovo
+ { 9, 66, 140, 210, 325, 440, 519, 184, 184,115,115, 79, 79, 26, 26 },// Albanian/Latin/Macedonia
+ { 11, 33, 77, 598, 598, 106, 106, 184, 184, 74, 74, 78, 78, 26, 26 },// Amharic/Ethiopic/Ethiopia
+ { 14, 4, 71, 672, 672, 672, 672, 768, 768, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/Egypt
+ { 14, 4, 4, 672, 672, 672, 672, 768, 768, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/Algeria
+ { 14, 4, 19, 672, 672, 672, 672, 768, 768, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/Bahrain
+ { 14, 4, 48, 672, 672, 672, 672, 768, 768, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/Chad
+ { 14, 4, 55, 672, 672, 672, 672, 768, 768, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/Comoros
+ { 14, 4, 67, 672, 672, 672, 672, 768, 768, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/Djibouti
+ { 14, 4, 74, 672, 672, 672, 672, 768, 768, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/Eritrea
+ { 14, 4, 113, 672, 672, 672, 672, 768, 768, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/Iraq
+ { 14, 4, 116, 672, 672, 672, 672, 768, 768, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/Israel
+ { 14, 4, 122, 672, 672, 672, 672, 768, 768, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/Jordan
+ { 14, 4, 127, 672, 672, 672, 672, 768, 768, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/Kuwait
+ { 14, 4, 132, 672, 672, 672, 672, 768, 768, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/Lebanon
+ { 14, 4, 135, 672, 672, 672, 672, 768, 768, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/Libya
+ { 14, 4, 149, 672, 672, 672, 672, 768, 768, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/Mauritania
+ { 14, 4, 159, 672, 672, 672, 672, 768, 768, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/Morocco
+ { 14, 4, 176, 672, 672, 672, 672, 768, 768, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/Oman
+ { 14, 4, 180, 672, 672, 672, 672, 768, 768, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/Palestinian Territories
+ { 14, 4, 190, 672, 672, 672, 672, 768, 768, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/Qatar
+ { 14, 4, 205, 672, 672, 672, 672, 768, 768, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/Saudi Arabia
+ { 14, 4, 215, 672, 672, 672, 672, 768, 768, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/Somalia
+ { 14, 4, 219, 672, 672, 672, 672, 768, 768, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/South Sudan
+ { 14, 4, 222, 672, 672, 672, 672, 768, 768, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/Sudan
+ { 14, 4, 227, 672, 672, 672, 672, 768, 768, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/Syria
+ { 14, 4, 238, 672, 672, 672, 672, 768, 768, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/Tunisia
+ { 14, 4, 245, 672, 672, 672, 672, 768, 768, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/United Arab Emirates
+ { 14, 4, 257, 672, 672, 672, 672, 768, 768, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/Western Sahara
+ { 14, 4, 258, 672, 672, 672, 672, 768, 768, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/world
+ { 14, 4, 259, 672, 672, 672, 672, 768, 768, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/Yemen
{ 15, 66, 220, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Aragonese/Latin/Spain
{ 17, 5, 12, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Armenian/Armenian/Armenia
{ 18, 9, 110, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Assamese/Bangla/India
- { 19, 66, 220, 0, 406, 106, 106, 184, 184,106,142, 78, 78, 26, 26 },// Asturian/Latin/Spain
+ { 19, 66, 220, 0, 794, 106, 106, 184, 184,106,142, 78, 78, 26, 26 },// Asturian/Latin/Spain
{ 20, 66, 230, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Asu/Latin/Tanzania
{ 21, 66, 169, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Atsam/Latin/Nigeria
- { 25, 66, 17, 548, 548, 658, 658, 184, 184,110,110, 71, 71, 26, 26 },// Azerbaijani/Latin/Azerbaijan
+ { 25, 66, 17, 936, 936, 1046, 1046, 184, 184,110,110, 71, 71, 26, 26 },// Azerbaijani/Latin/Azerbaijan
{ 25, 4, 112, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Azerbaijani/Arabic/Iran
+ { 25, 4, 113, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Azerbaijani/Arabic/Iraq
+ { 25, 4, 239, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Azerbaijani/Arabic/Turkey
{ 25, 27, 17, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Azerbaijani/Cyrillic/Azerbaijan
{ 26, 66, 40, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Bafia/Latin/Cameroon
{ 28, 66, 145, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Bambara/Latin/Mali
{ 28, 90, 145, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Bambara/Nko/Mali
- { 30, 9, 20, 729, 729, 729, 729, 833, 833,104,104,104,104, 26, 26 },// Bangla/Bangla/Bangladesh
- { 30, 9, 110, 729, 729, 729, 729, 833, 833,104,104,104,104, 26, 26 },// Bangla/Bangla/India
+ { 30, 9, 20, 1117, 1117, 1117, 1117, 1221, 1221,104,104,104,104, 26, 26 },// Bangla/Bangla/Bangladesh
+ { 30, 9, 110, 1117, 1117, 1117, 1117, 1221, 1221,104,104,104,104, 26, 26 },// Bangla/Bangla/India
{ 31, 66, 40, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Basaa/Latin/Cameroon
{ 32, 27, 193, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Bashkir/Cyrillic/Russia
{ 33, 66, 220, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Basque/Latin/Spain
{ 35, 27, 22, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Belarusian/Cyrillic/Belarus
{ 36, 66, 260, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Bemba/Latin/Zambia
{ 37, 66, 230, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Bena/Latin/Tanzania
+ { 38, 29, 110, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Bhojpuri/Devanagari/India
{ 40, 33, 74, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Blin/Ethiopic/Eritrea
{ 41, 29, 110, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Bodo/Devanagari/India
- { 42, 66, 29, 859, 859, 958, 958, 184, 184, 99, 99, 74, 74, 26, 26 },// Bosnian/Latin/Bosnia And Herzegovina
- { 42, 27, 29, 1032, 1122, 1219, 1219, 184, 184, 90, 97, 69, 69, 26, 26 },// Bosnian/Cyrillic/Bosnia And Herzegovina
+ { 42, 66, 29, 1247, 1247, 1346, 1346, 184, 184, 99, 99, 74, 74, 26, 26 },// Bosnian/Latin/Bosnia and Herzegovina
+ { 42, 27, 29, 1420, 1510, 1607, 1607, 184, 184, 90, 97, 69, 69, 26, 26 },// Bosnian/Cyrillic/Bosnia and Herzegovina
{ 43, 66, 84, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Breton/Latin/France
- { 45, 27, 36, 1288, 1288, 106, 106, 184, 184, 96, 96, 78, 78, 26, 26 },// Bulgarian/Cyrillic/Bulgaria
+ { 45, 27, 36, 1676, 1676, 106, 106, 184, 184, 96, 96, 78, 78, 26, 26 },// Bulgarian/Cyrillic/Bulgaria
{ 46, 86, 161, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Burmese/Myanmar/Myanmar
- { 47, 137, 107, 1384, 1384, 1384, 1384, 184, 184, 71, 71, 71, 71, 26, 26 },// Cantonese/Traditional Han/Hong Kong
- { 47, 118, 50, 1455, 1455, 1455, 1455, 184, 184, 71, 71, 71, 71, 26, 26 },// Cantonese/Simplified Han/China
+ { 47, 137, 107, 1772, 1772, 1772, 1772, 184, 184, 71, 71, 71, 71, 26, 26 },// Cantonese/Traditional Han/Hong Kong
+ { 47, 118, 50, 1843, 1843, 1843, 1843, 184, 184, 71, 71, 71, 71, 26, 26 },// Cantonese/Simplified Han/China
{ 48, 66, 220, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Catalan/Latin/Spain
{ 48, 66, 6, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Catalan/Latin/Andorra
{ 48, 66, 84, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Catalan/Latin/France
@@ -148,46 +119,46 @@ static const QCalendarLocale locale_data[] = {
{ 50, 66, 159, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Central Atlas Tamazight/Latin/Morocco
{ 51, 4, 113, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Central Kurdish/Arabic/Iraq
{ 51, 4, 112, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Central Kurdish/Arabic/Iran
- { 52, 21, 20, 1526, 1526, 106, 106, 1747, 1747,221,221, 78, 78, 41, 41 },// Chakma/Chakma/Bangladesh
- { 52, 21, 110, 1526, 1526, 106, 106, 1747, 1747,221,221, 78, 78, 41, 41 },// Chakma/Chakma/India
+ { 52, 21, 20, 1914, 1914, 106, 106, 2135, 2135,221,221, 78, 78, 41, 41 },// Chakma/Chakma/Bangladesh
+ { 52, 21, 110, 1914, 1914, 106, 106, 2135, 2135,221,221, 78, 78, 41, 41 },// Chakma/Chakma/India
{ 54, 27, 193, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Chechen/Cyrillic/Russia
{ 55, 23, 248, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Cherokee/Cherokee/United States
{ 56, 66, 248, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Chickasaw/Latin/United States
{ 57, 66, 243, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Chiga/Latin/Uganda
- { 58, 118, 50, 1788, 1788, 1825, 1825, 184, 184, 37, 37, 38, 38, 26, 26 },// Chinese/Simplified Han/China
- { 58, 118, 107, 1788, 1788, 1825, 1825, 184, 184, 37, 37, 38, 38, 26, 26 },// Chinese/Simplified Han/Hong Kong
- { 58, 118, 139, 1788, 1788, 1825, 1825, 184, 184, 37, 37, 38, 38, 26, 26 },// Chinese/Simplified Han/Macao
- { 58, 118, 210, 1788, 1788, 1825, 1825, 184, 184, 37, 37, 38, 38, 26, 26 },// Chinese/Simplified Han/Singapore
- { 58, 137, 107, 1384, 1384, 1384, 1384, 184, 184, 71, 71, 71, 71, 26, 26 },// Chinese/Traditional Han/Hong Kong
- { 58, 137, 139, 1384, 1384, 1384, 1384, 184, 184, 71, 71, 71, 71, 26, 26 },// Chinese/Traditional Han/Macao
- { 58, 137, 228, 1384, 1384, 1384, 1384, 184, 184, 71, 71, 71, 71, 26, 26 },// Chinese/Traditional Han/Taiwan
+ { 58, 118, 50, 2176, 2176, 2213, 2213, 184, 184, 37, 37, 38, 38, 26, 26 },// Chinese/Simplified Han/China
+ { 58, 118, 107, 2176, 2176, 2213, 2213, 184, 184, 37, 37, 38, 38, 26, 26 },// Chinese/Simplified Han/Hong Kong
+ { 58, 118, 139, 2176, 2176, 2213, 2213, 184, 184, 37, 37, 38, 38, 26, 26 },// Chinese/Simplified Han/Macao
+ { 58, 118, 210, 2176, 2176, 2213, 2213, 184, 184, 37, 37, 38, 38, 26, 26 },// Chinese/Simplified Han/Singapore
+ { 58, 137, 107, 1772, 1772, 1772, 1772, 184, 184, 71, 71, 71, 71, 26, 26 },// Chinese/Traditional Han/Hong Kong
+ { 58, 137, 139, 1772, 1772, 1772, 1772, 184, 184, 71, 71, 71, 71, 26, 26 },// Chinese/Traditional Han/Macao
+ { 58, 137, 228, 1772, 1772, 1772, 1772, 184, 184, 71, 71, 71, 71, 26, 26 },// Chinese/Traditional Han/Taiwan
{ 59, 27, 193, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Church/Cyrillic/Russia
{ 60, 27, 193, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Chuvash/Cyrillic/Russia
{ 61, 66, 91, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Colognian/Latin/Germany
{ 63, 66, 246, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Cornish/Latin/United Kingdom
{ 64, 66, 84, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Corsican/Latin/France
- { 66, 66, 60, 0, 0, 106, 106, 1863, 1863,106,106, 78, 78, 38, 38 },// Croatian/Latin/Croatia
- { 66, 66, 29, 0, 0, 106, 106, 1863, 1863,106,106, 78, 78, 38, 38 },// Croatian/Latin/Bosnia And Herzegovina
- { 67, 66, 64, 1901, 1901, 2030, 2030, 184, 184,129,129, 76, 76, 26, 26 },// Czech/Latin/Czechia
- { 68, 66, 65, 2106, 2106, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Danish/Latin/Denmark
- { 68, 66, 95, 2106, 2106, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Danish/Latin/Greenland
+ { 66, 66, 60, 0, 0, 106, 106, 2251, 2251,106,106, 78, 78, 38, 38 },// Croatian/Latin/Croatia
+ { 66, 66, 29, 0, 0, 106, 106, 2251, 2251,106,106, 78, 78, 38, 38 },// Croatian/Latin/Bosnia and Herzegovina
+ { 67, 66, 64, 2289, 2289, 2418, 2418, 184, 184,129,129, 76, 76, 26, 26 },// Czech/Latin/Czechia
+ { 68, 66, 65, 2494, 2494, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Danish/Latin/Denmark
+ { 68, 66, 95, 2494, 2494, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Danish/Latin/Greenland
{ 69, 132, 144, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Divehi/Thaana/Maldives
{ 70, 29, 110, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Dogri/Devanagari/India
{ 71, 66, 40, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Duala/Latin/Cameroon
- { 72, 66, 165, 2212, 2212, 2346, 2346, 184, 184,134,134, 83, 83, 26, 26 },// Dutch/Latin/Netherlands
- { 72, 66, 13, 2212, 2212, 2346, 2346, 184, 184,134,134, 83, 83, 26, 26 },// Dutch/Latin/Aruba
- { 72, 66, 23, 2212, 2212, 2346, 2346, 184, 184,134,134, 83, 83, 26, 26 },// Dutch/Latin/Belgium
- { 72, 66, 44, 2212, 2212, 2346, 2346, 184, 184,134,134, 83, 83, 26, 26 },// Dutch/Latin/Caribbean Netherlands
- { 72, 66, 62, 2212, 2212, 2346, 2346, 184, 184,134,134, 83, 83, 26, 26 },// Dutch/Latin/Curacao
- { 72, 66, 211, 2212, 2212, 2346, 2346, 184, 184,134,134, 83, 83, 26, 26 },// Dutch/Latin/Sint Maarten
- { 72, 66, 223, 2212, 2212, 2346, 2346, 184, 184,134,134, 83, 83, 26, 26 },// Dutch/Latin/Suriname
+ { 72, 66, 165, 2600, 2600, 2734, 2734, 184, 184,134,134, 83, 83, 26, 26 },// Dutch/Latin/Netherlands
+ { 72, 66, 13, 2600, 2600, 2734, 2734, 184, 184,134,134, 83, 83, 26, 26 },// Dutch/Latin/Aruba
+ { 72, 66, 23, 2600, 2600, 2734, 2734, 184, 184,134,134, 83, 83, 26, 26 },// Dutch/Latin/Belgium
+ { 72, 66, 44, 2600, 2600, 2734, 2734, 184, 184,134,134, 83, 83, 26, 26 },// Dutch/Latin/Caribbean Netherlands
+ { 72, 66, 62, 2600, 2600, 2734, 2734, 184, 184,134,134, 83, 83, 26, 26 },// Dutch/Latin/Curacao
+ { 72, 66, 211, 2600, 2600, 2734, 2734, 184, 184,134,134, 83, 83, 26, 26 },// Dutch/Latin/Sint Maarten
+ { 72, 66, 223, 2600, 2600, 2734, 2734, 184, 184,134,134, 83, 83, 26, 26 },// Dutch/Latin/Suriname
{ 73, 134, 27, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Dzongkha/Tibetan/Bhutan
{ 74, 66, 124, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Embu/Latin/Kenya
{ 75, 66, 248, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/United States
{ 75, 28, 248, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Deseret/United States
{ 75, 66, 5, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/American Samoa
{ 75, 66, 8, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Anguilla
- { 75, 66, 10, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Antigua And Barbuda
+ { 75, 66, 10, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Antigua and Barbuda
{ 75, 66, 15, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Australia
{ 75, 66, 16, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Austria
{ 75, 66, 18, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Bahamas
@@ -225,8 +196,9 @@ static const QCalendarLocale locale_data[] = {
{ 75, 66, 103, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Guyana
{ 75, 66, 107, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Hong Kong
{ 75, 66, 110, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/India
+ { 75, 66, 111, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Indonesia
{ 75, 66, 114, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Ireland
- { 75, 66, 115, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Isle Of Man
+ { 75, 66, 115, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Isle of Man
{ 75, 66, 116, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Israel
{ 75, 66, 119, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Jamaica
{ 75, 66, 121, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Jersey
@@ -238,6 +210,7 @@ static const QCalendarLocale locale_data[] = {
{ 75, 66, 141, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Madagascar
{ 75, 66, 142, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Malawi
{ 75, 66, 143, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Malaysia
+ { 75, 66, 144, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Maldives
{ 75, 66, 146, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Malta
{ 75, 66, 147, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Marshall Islands
{ 75, 66, 150, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Mauritius
@@ -259,9 +232,9 @@ static const QCalendarLocale locale_data[] = {
{ 75, 66, 189, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Puerto Rico
{ 75, 66, 194, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Rwanda
{ 75, 66, 196, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Saint Helena
- { 75, 66, 197, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Saint Kitts And Nevis
+ { 75, 66, 197, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Saint Kitts and Nevis
{ 75, 66, 198, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Saint Lucia
- { 75, 66, 201, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Saint Vincent And Grenadines
+ { 75, 66, 201, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Saint Vincent and Grenadines
{ 75, 66, 202, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Samoa
{ 75, 66, 208, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Seychelles
{ 75, 66, 209, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Sierra Leone
@@ -277,8 +250,8 @@ static const QCalendarLocale locale_data[] = {
{ 75, 66, 230, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Tanzania
{ 75, 66, 234, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Tokelau
{ 75, 66, 235, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Tonga
- { 75, 66, 236, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Trinidad And Tobago
- { 75, 66, 241, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Turks And Caicos Islands
+ { 75, 66, 236, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Trinidad and Tobago
+ { 75, 66, 241, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Turks and Caicos Islands
{ 75, 66, 242, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Tuvalu
{ 75, 66, 243, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Uganda
{ 75, 66, 245, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/United Arab Emirates
@@ -286,84 +259,85 @@ static const QCalendarLocale locale_data[] = {
{ 75, 66, 247, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/United States Outlying Islands
{ 75, 66, 249, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/United States Virgin Islands
{ 75, 66, 252, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Vanuatu
- { 75, 66, 258, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/World
+ { 75, 66, 258, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/world
{ 75, 66, 260, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Zambia
{ 75, 66, 261, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Zimbabwe
+ { 75, 115, 246, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Shavian/United Kingdom
{ 76, 27, 193, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Erzya/Cyrillic/Russia
- { 77, 66, 258, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Esperanto/Latin/World
+ { 77, 66, 258, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Esperanto/Latin/world
{ 78, 66, 75, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Estonian/Latin/Estonia
- { 79, 66, 92, 2429, 2429, 2515, 2515, 184, 184, 86, 86, 47, 47, 26, 26 },// Ewe/Latin/Ghana
- { 79, 66, 233, 2429, 2429, 2515, 2515, 184, 184, 86, 86, 47, 47, 26, 26 },// Ewe/Latin/Togo
+ { 79, 66, 92, 2817, 2817, 2903, 2903, 184, 184, 86, 86, 47, 47, 26, 26 },// Ewe/Latin/Ghana
+ { 79, 66, 233, 2817, 2817, 2903, 2903, 184, 184, 86, 86, 47, 47, 26, 26 },// Ewe/Latin/Togo
{ 80, 66, 40, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Ewondo/Latin/Cameroon
{ 81, 66, 81, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Faroese/Latin/Faroe Islands
{ 81, 66, 65, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Faroese/Latin/Denmark
{ 83, 66, 185, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Filipino/Latin/Philippines
- { 84, 66, 83, 2562, 2562, 106, 106, 184, 184,129,129, 78, 78, 26, 26 },// Finnish/Latin/Finland
- { 85, 66, 84, 2691, 2691, 2830, 2920, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/France
- { 85, 66, 4, 2691, 2691, 2830, 2920, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Algeria
- { 85, 66, 23, 2691, 2691, 2830, 2920, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Belgium
- { 85, 66, 25, 2691, 2691, 2830, 2920, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Benin
- { 85, 66, 37, 2691, 2691, 2830, 2920, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Burkina Faso
- { 85, 66, 38, 2691, 2691, 2830, 2920, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Burundi
- { 85, 66, 40, 2691, 2691, 2830, 2920, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Cameroon
- { 85, 66, 41, 2691, 2691, 2830, 2920, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Canada
- { 85, 66, 46, 2691, 2691, 2830, 2920, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Central African Republic
- { 85, 66, 48, 2691, 2691, 2830, 2920, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Chad
- { 85, 66, 55, 2691, 2691, 2830, 2920, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Comoros
- { 85, 66, 56, 2691, 2691, 2830, 2920, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Congo Brazzaville
- { 85, 66, 57, 2691, 2691, 2830, 2920, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Congo Kinshasa
- { 85, 66, 67, 2691, 2691, 2830, 2920, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Djibouti
- { 85, 66, 73, 2691, 2691, 2830, 2920, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Equatorial Guinea
- { 85, 66, 85, 2691, 2691, 2830, 2920, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/French Guiana
- { 85, 66, 86, 2691, 2691, 2830, 2920, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/French Polynesia
- { 85, 66, 88, 2691, 2691, 2830, 2920, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Gabon
- { 85, 66, 97, 2691, 2691, 2830, 2920, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Guadeloupe
- { 85, 66, 102, 2691, 2691, 2830, 2920, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Guinea
- { 85, 66, 104, 2691, 2691, 2830, 2920, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Haiti
- { 85, 66, 118, 2691, 2691, 2830, 2920, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Ivory Coast
- { 85, 66, 138, 2691, 2691, 2830, 2920, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Luxembourg
- { 85, 66, 141, 2691, 2691, 2830, 2920, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Madagascar
- { 85, 66, 145, 2691, 2691, 2830, 2920, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Mali
- { 85, 66, 148, 2691, 2691, 2830, 2920, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Martinique
- { 85, 66, 149, 2691, 2691, 2830, 2920, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Mauritania
- { 85, 66, 150, 2691, 2691, 2830, 2920, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Mauritius
- { 85, 66, 151, 2691, 2691, 2830, 2920, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Mayotte
- { 85, 66, 155, 2691, 2691, 2830, 2920, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Monaco
- { 85, 66, 159, 2691, 2691, 2830, 2920, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Morocco
- { 85, 66, 166, 2691, 2691, 2830, 2920, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/New Caledonia
- { 85, 66, 170, 2691, 2691, 2830, 2920, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Niger
- { 85, 66, 191, 2691, 2691, 2830, 2920, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Reunion
- { 85, 66, 194, 2691, 2691, 2830, 2920, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Rwanda
- { 85, 66, 195, 2691, 2691, 2830, 2920, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Saint Barthelemy
- { 85, 66, 199, 2691, 2691, 2830, 2920, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Saint Martin
- { 85, 66, 200, 2691, 2691, 2830, 2920, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Saint Pierre And Miquelon
- { 85, 66, 206, 2691, 2691, 2830, 2920, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Senegal
- { 85, 66, 208, 2691, 2691, 2830, 2920, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Seychelles
- { 85, 66, 226, 2691, 2691, 2830, 2920, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Switzerland
- { 85, 66, 227, 2691, 2691, 2830, 2920, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Syria
- { 85, 66, 233, 2691, 2691, 2830, 2920, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Togo
- { 85, 66, 238, 2691, 2691, 2830, 2920, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Tunisia
- { 85, 66, 252, 2691, 2691, 2830, 2920, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Vanuatu
- { 85, 66, 256, 2691, 2691, 2830, 2920, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Wallis And Futuna
+ { 84, 66, 83, 2950, 2950, 106, 106, 184, 184,129,129, 78, 78, 26, 26 },// Finnish/Latin/Finland
+ { 85, 66, 84, 3079, 3079, 3218, 3308, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/France
+ { 85, 66, 4, 3079, 3079, 3218, 3308, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Algeria
+ { 85, 66, 23, 3079, 3079, 3218, 3308, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Belgium
+ { 85, 66, 25, 3079, 3079, 3218, 3308, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Benin
+ { 85, 66, 37, 3079, 3079, 3218, 3308, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Burkina Faso
+ { 85, 66, 38, 3079, 3079, 3218, 3308, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Burundi
+ { 85, 66, 40, 3079, 3079, 3218, 3308, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Cameroon
+ { 85, 66, 41, 3079, 3079, 3218, 3308, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Canada
+ { 85, 66, 46, 3079, 3079, 3218, 3308, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Central African Republic
+ { 85, 66, 48, 3079, 3079, 3218, 3308, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Chad
+ { 85, 66, 55, 3079, 3079, 3218, 3308, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Comoros
+ { 85, 66, 56, 3079, 3079, 3218, 3308, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Congo - Brazzaville
+ { 85, 66, 57, 3079, 3079, 3218, 3308, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Congo - Kinshasa
+ { 85, 66, 67, 3079, 3079, 3218, 3308, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Djibouti
+ { 85, 66, 73, 3079, 3079, 3218, 3308, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Equatorial Guinea
+ { 85, 66, 85, 3079, 3079, 3218, 3308, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/French Guiana
+ { 85, 66, 86, 3079, 3079, 3218, 3308, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/French Polynesia
+ { 85, 66, 88, 3079, 3079, 3218, 3308, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Gabon
+ { 85, 66, 97, 3079, 3079, 3218, 3308, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Guadeloupe
+ { 85, 66, 102, 3079, 3079, 3218, 3308, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Guinea
+ { 85, 66, 104, 3079, 3079, 3218, 3308, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Haiti
+ { 85, 66, 118, 3079, 3079, 3218, 3308, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Ivory Coast
+ { 85, 66, 138, 3079, 3079, 3218, 3308, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Luxembourg
+ { 85, 66, 141, 3079, 3079, 3218, 3308, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Madagascar
+ { 85, 66, 145, 3079, 3079, 3218, 3308, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Mali
+ { 85, 66, 148, 3079, 3079, 3218, 3308, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Martinique
+ { 85, 66, 149, 3079, 3079, 3218, 3308, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Mauritania
+ { 85, 66, 150, 3079, 3079, 3218, 3308, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Mauritius
+ { 85, 66, 151, 3079, 3079, 3218, 3308, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Mayotte
+ { 85, 66, 155, 3079, 3079, 3218, 3308, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Monaco
+ { 85, 66, 159, 3079, 3079, 3218, 3308, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Morocco
+ { 85, 66, 166, 3079, 3079, 3218, 3308, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/New Caledonia
+ { 85, 66, 170, 3079, 3079, 3218, 3308, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Niger
+ { 85, 66, 191, 3079, 3079, 3218, 3308, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Reunion
+ { 85, 66, 194, 3079, 3079, 3218, 3308, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Rwanda
+ { 85, 66, 195, 3079, 3079, 3218, 3308, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Saint Barthelemy
+ { 85, 66, 199, 3079, 3079, 3218, 3308, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Saint Martin
+ { 85, 66, 200, 3079, 3079, 3218, 3308, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Saint Pierre and Miquelon
+ { 85, 66, 206, 3079, 3079, 3218, 3308, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Senegal
+ { 85, 66, 208, 3079, 3079, 3218, 3308, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Seychelles
+ { 85, 66, 226, 3079, 3079, 3218, 3308, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Switzerland
+ { 85, 66, 227, 3079, 3079, 3218, 3308, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Syria
+ { 85, 66, 233, 3079, 3079, 3218, 3308, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Togo
+ { 85, 66, 238, 3079, 3079, 3218, 3308, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Tunisia
+ { 85, 66, 252, 3079, 3079, 3218, 3308, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Vanuatu
+ { 85, 66, 256, 3079, 3079, 3218, 3308, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Wallis and Futuna
{ 86, 66, 117, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Friulian/Latin/Italy
{ 87, 66, 206, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Fulah/Latin/Senegal
- { 87, 1, 37, 3010, 3010, 3263, 3263, 3358, 3358,253,253, 95, 95, 41, 41 },// Fulah/Adlam/Burkina Faso
- { 87, 1, 40, 3010, 3010, 3263, 3263, 3358, 3358,253,253, 95, 95, 41, 41 },// Fulah/Adlam/Cameroon
- { 87, 1, 89, 3010, 3010, 3263, 3263, 3358, 3358,253,253, 95, 95, 41, 41 },// Fulah/Adlam/Gambia
- { 87, 1, 92, 3010, 3010, 3263, 3263, 3358, 3358,253,253, 95, 95, 41, 41 },// Fulah/Adlam/Ghana
- { 87, 1, 101, 3010, 3010, 3263, 3263, 3358, 3358,253,253, 95, 95, 41, 41 },// Fulah/Adlam/Guinea Bissau
- { 87, 1, 102, 3010, 3010, 3263, 3263, 3358, 3358,253,253, 95, 95, 41, 41 },// Fulah/Adlam/Guinea
- { 87, 1, 134, 3010, 3010, 3263, 3263, 3358, 3358,253,253, 95, 95, 41, 41 },// Fulah/Adlam/Liberia
- { 87, 1, 149, 3010, 3010, 3263, 3263, 3358, 3358,253,253, 95, 95, 41, 41 },// Fulah/Adlam/Mauritania
- { 87, 1, 169, 3010, 3010, 3263, 3263, 3358, 3358,253,253, 95, 95, 41, 41 },// Fulah/Adlam/Nigeria
- { 87, 1, 170, 3010, 3010, 3263, 3263, 3358, 3358,253,253, 95, 95, 41, 41 },// Fulah/Adlam/Niger
- { 87, 1, 206, 3010, 3010, 3263, 3263, 3358, 3358,253,253, 95, 95, 41, 41 },// Fulah/Adlam/Senegal
- { 87, 1, 209, 3010, 3010, 3263, 3263, 3358, 3358,253,253, 95, 95, 41, 41 },// Fulah/Adlam/Sierra Leone
+ { 87, 1, 37, 3398, 3398, 3651, 3651, 3746, 3746,253,253, 95, 95, 41, 41 },// Fulah/Adlam/Burkina Faso
+ { 87, 1, 40, 3398, 3398, 3651, 3651, 3746, 3746,253,253, 95, 95, 41, 41 },// Fulah/Adlam/Cameroon
+ { 87, 1, 89, 3398, 3398, 3651, 3651, 3746, 3746,253,253, 95, 95, 41, 41 },// Fulah/Adlam/Gambia
+ { 87, 1, 92, 3398, 3398, 3651, 3651, 3746, 3746,253,253, 95, 95, 41, 41 },// Fulah/Adlam/Ghana
+ { 87, 1, 101, 3398, 3398, 3651, 3651, 3746, 3746,253,253, 95, 95, 41, 41 },// Fulah/Adlam/Guinea-Bissau
+ { 87, 1, 102, 3398, 3398, 3651, 3651, 3746, 3746,253,253, 95, 95, 41, 41 },// Fulah/Adlam/Guinea
+ { 87, 1, 134, 3398, 3398, 3651, 3651, 3746, 3746,253,253, 95, 95, 41, 41 },// Fulah/Adlam/Liberia
+ { 87, 1, 149, 3398, 3398, 3651, 3651, 3746, 3746,253,253, 95, 95, 41, 41 },// Fulah/Adlam/Mauritania
+ { 87, 1, 169, 3398, 3398, 3651, 3651, 3746, 3746,253,253, 95, 95, 41, 41 },// Fulah/Adlam/Nigeria
+ { 87, 1, 170, 3398, 3398, 3651, 3651, 3746, 3746,253,253, 95, 95, 41, 41 },// Fulah/Adlam/Niger
+ { 87, 1, 206, 3398, 3398, 3651, 3651, 3746, 3746,253,253, 95, 95, 41, 41 },// Fulah/Adlam/Senegal
+ { 87, 1, 209, 3398, 3398, 3651, 3651, 3746, 3746,253,253, 95, 95, 41, 41 },// Fulah/Adlam/Sierra Leone
{ 87, 66, 37, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Fulah/Latin/Burkina Faso
{ 87, 66, 40, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Fulah/Latin/Cameroon
{ 87, 66, 89, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Fulah/Latin/Gambia
{ 87, 66, 92, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Fulah/Latin/Ghana
- { 87, 66, 101, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Fulah/Latin/Guinea Bissau
+ { 87, 66, 101, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Fulah/Latin/Guinea-Bissau
{ 87, 66, 102, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Fulah/Latin/Guinea
{ 87, 66, 134, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Fulah/Latin/Liberia
{ 87, 66, 149, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Fulah/Latin/Mauritania
@@ -375,34 +349,37 @@ static const QCalendarLocale locale_data[] = {
{ 90, 66, 220, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Galician/Latin/Spain
{ 91, 66, 243, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Ganda/Latin/Uganda
{ 92, 33, 77, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Geez/Ethiopic/Ethiopia
- { 93, 35, 90, 3399, 3399, 3523, 3523, 184, 184,124,124, 73, 73, 26, 26 },// Georgian/Georgian/Georgia
- { 94, 66, 91, 3596, 3596, 106, 106, 184, 184,116,116, 78, 78, 26, 26 },// German/Latin/Germany
- { 94, 66, 16, 3596, 3596, 106, 106, 184, 184,116,116, 78, 78, 26, 26 },// German/Latin/Austria
- { 94, 66, 23, 3596, 3596, 106, 106, 184, 184,116,116, 78, 78, 26, 26 },// German/Latin/Belgium
- { 94, 66, 117, 3596, 3596, 106, 106, 184, 184,116,116, 78, 78, 26, 26 },// German/Latin/Italy
- { 94, 66, 136, 3596, 3596, 106, 106, 184, 184,116,116, 78, 78, 26, 26 },// German/Latin/Liechtenstein
- { 94, 66, 138, 3596, 3596, 106, 106, 184, 184,116,116, 78, 78, 26, 26 },// German/Latin/Luxembourg
- { 94, 66, 226, 3596, 3596, 106, 106, 184, 184,116,116, 78, 78, 26, 26 },// German/Latin/Switzerland
+ { 92, 33, 74, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Geez/Ethiopic/Eritrea
+ { 93, 35, 90, 3787, 3787, 3911, 3911, 184, 184,124,124, 73, 73, 26, 26 },// Georgian/Georgian/Georgia
+ { 94, 66, 91, 3984, 3984, 106, 106, 184, 184,116,116, 78, 78, 26, 26 },// German/Latin/Germany
+ { 94, 66, 16, 3984, 3984, 106, 106, 184, 184,116,116, 78, 78, 26, 26 },// German/Latin/Austria
+ { 94, 66, 23, 3984, 3984, 106, 106, 184, 184,116,116, 78, 78, 26, 26 },// German/Latin/Belgium
+ { 94, 66, 117, 3984, 3984, 106, 106, 184, 184,116,116, 78, 78, 26, 26 },// German/Latin/Italy
+ { 94, 66, 136, 3984, 3984, 106, 106, 184, 184,116,116, 78, 78, 26, 26 },// German/Latin/Liechtenstein
+ { 94, 66, 138, 3984, 3984, 106, 106, 184, 184,116,116, 78, 78, 26, 26 },// German/Latin/Luxembourg
+ { 94, 66, 226, 3984, 3984, 106, 106, 184, 184,116,116, 78, 78, 26, 26 },// German/Latin/Switzerland
{ 96, 39, 94, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Greek/Greek/Greece
{ 96, 39, 63, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Greek/Greek/Cyprus
{ 97, 66, 183, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Guarani/Latin/Paraguay
- { 98, 40, 110, 3712, 3712, 3810, 3810, 184, 184, 98, 98, 74, 74, 26, 26 },// Gujarati/Gujarati/India
+ { 98, 40, 110, 4100, 4100, 4198, 4198, 184, 184, 98, 98, 74, 74, 26, 26 },// Gujarati/Gujarati/India
{ 99, 66, 124, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Gusii/Latin/Kenya
- { 101, 66, 169, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Hausa/Latin/Nigeria
+ { 101, 66, 169, 4272, 4272, 106, 106, 184, 184,107,107, 78, 78, 26, 26 },// Hausa/Latin/Nigeria
{ 101, 4, 169, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Hausa/Arabic/Nigeria
- { 101, 66, 92, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Hausa/Latin/Ghana
- { 101, 66, 170, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Hausa/Latin/Niger
+ { 101, 4, 222, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Hausa/Arabic/Sudan
+ { 101, 66, 92, 4272, 4272, 106, 106, 184, 184,107,107, 78, 78, 26, 26 },// Hausa/Latin/Ghana
+ { 101, 66, 170, 4272, 4272, 106, 106, 184, 184,107,107, 78, 78, 26, 26 },// Hausa/Latin/Niger
{ 102, 66, 248, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Hawaiian/Latin/United States
- { 103, 47, 116, 3884, 4000, 4116, 4116, 184, 184,116,116, 95, 95, 26, 26 },// Hebrew/Hebrew/Israel
- { 105, 29, 110, 4211, 4211, 106, 106, 184, 184,108,108, 78, 78, 26, 26 },// Hindi/Devanagari/India
- { 105, 66, 110, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Hindi/Latin/India
- { 107, 66, 108, 4319, 4418, 4545, 4545, 184, 184, 99,127, 76, 76, 26, 26 },// Hungarian/Latin/Hungary
- { 108, 66, 109, 2106, 2106, 4621, 4621, 184, 184,106,106, 78, 78, 26, 26 },// Icelandic/Latin/Iceland
- { 109, 66, 258, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Ido/Latin/World
+ { 103, 47, 116, 4379, 4495, 4611, 4611, 184, 184,116,116, 95, 95, 26, 26 },// Hebrew/Hebrew/Israel
+ { 105, 29, 110, 4706, 4706, 106, 106, 184, 184,108,108, 78, 78, 26, 26 },// Hindi/Devanagari/India
+ { 105, 66, 110, 0, 4814, 106, 4944, 184, 184,106,130, 78, 63, 26, 26 },// Hindi/Latin/India
+ { 107, 66, 108, 5007, 5106, 5233, 5233, 184, 184, 99,127, 76, 76, 26, 26 },// Hungarian/Latin/Hungary
+ { 108, 66, 109, 2494, 2494, 5309, 5309, 184, 184,106,106, 78, 78, 26, 26 },// Icelandic/Latin/Iceland
+ { 109, 66, 258, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Ido/Latin/world
{ 110, 66, 169, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Igbo/Latin/Nigeria
{ 111, 66, 83, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Inari Sami/Latin/Finland
- { 112, 66, 111, 4699, 4699, 4808, 4808, 184, 184,109,109, 86, 86, 26, 26 },// Indonesian/Latin/Indonesia
- { 114, 66, 258, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Interlingua/Latin/World
+ { 112, 66, 111, 5387, 5387, 5496, 5496, 184, 184,109,109, 86, 86, 26, 26 },// Indonesian/Latin/Indonesia
+ { 114, 66, 258, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Interlingua/Latin/world
+ { 115, 66, 75, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Interlingue/Latin/Estonia
{ 116, 18, 41, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Inuktitut/Canadian Aboriginal/Canada
{ 116, 66, 41, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Inuktitut/Latin/Canada
{ 118, 66, 114, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Irish/Latin/Ireland
@@ -411,72 +388,76 @@ static const QCalendarLocale locale_data[] = {
{ 119, 66, 203, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Italian/Latin/San Marino
{ 119, 66, 226, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Italian/Latin/Switzerland
{ 119, 66, 253, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Italian/Latin/Vatican City
- { 120, 53, 120, 4894, 4894, 4894, 4894, 184, 184, 97, 97, 97, 97, 26, 26 },// Japanese/Japanese/Japan
- { 121, 66, 111, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Javanese/Latin/Indonesia
+ { 120, 53, 120, 5582, 5582, 5582, 5582, 184, 184, 97, 97, 97, 97, 26, 26 },// Japanese/Japanese/Japan
+ { 121, 66, 111, 5679, 5679, 5765, 5765, 184, 184, 86, 86, 72, 72, 26, 26 },// Javanese/Latin/Indonesia
{ 122, 66, 169, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Jju/Latin/Nigeria
- { 123, 66, 206, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Jola Fonyi/Latin/Senegal
+ { 123, 66, 206, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Jola-Fonyi/Latin/Senegal
{ 124, 66, 43, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Kabuverdianu/Latin/Cape Verde
{ 125, 66, 4, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Kabyle/Latin/Algeria
{ 126, 66, 40, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Kako/Latin/Cameroon
{ 127, 66, 95, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Kalaallisut/Latin/Greenland
{ 128, 66, 124, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Kalenjin/Latin/Kenya
{ 129, 66, 124, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Kamba/Latin/Kenya
- { 130, 56, 110, 4991, 4991, 5091, 5091, 184, 184,100,100, 79, 79, 26, 26 },// Kannada/Kannada/India
+ { 130, 56, 110, 5837, 5837, 5937, 5937, 184, 184,100,100, 79, 79, 26, 26 },// Kannada/Kannada/India
{ 132, 4, 110, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Kashmiri/Arabic/India
{ 132, 29, 110, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Kashmiri/Devanagari/India
- { 133, 27, 123, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Kazakh/Cyrillic/Kazakhstan
+ { 133, 27, 123, 6016, 6016, 6139, 6213, 184, 184,123,123, 74, 62, 26, 26 },// Kazakh/Cyrillic/Kazakhstan
{ 134, 66, 40, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Kenyang/Latin/Cameroon
{ 135, 60, 39, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Khmer/Khmer/Cambodia
{ 136, 66, 99, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Kiche/Latin/Guatemala
{ 137, 66, 124, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Kikuyu/Latin/Kenya
{ 138, 66, 194, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Kinyarwanda/Latin/Rwanda
{ 141, 29, 110, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Konkani/Devanagari/India
- { 142, 63, 218, 5170, 5170, 106, 106, 184, 184, 69, 69, 78, 78, 26, 26 },// Korean/Korean/South Korea
- { 142, 63, 174, 5170, 5170, 106, 106, 184, 184, 69, 69, 78, 78, 26, 26 },// Korean/Korean/North Korea
+ { 142, 63, 218, 6275, 6275, 106, 106, 184, 184, 69, 69, 78, 78, 26, 26 },// Korean/Korean/South Korea
+ { 142, 63, 50, 6275, 6275, 106, 106, 184, 184, 69, 69, 78, 78, 26, 26 },// Korean/Korean/China
+ { 142, 63, 174, 6275, 6275, 106, 106, 184, 184, 69, 69, 78, 78, 26, 26 },// Korean/Korean/North Korea
{ 144, 66, 145, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Koyraboro Senni/Latin/Mali
{ 145, 66, 145, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Koyra Chiini/Latin/Mali
{ 146, 66, 134, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Kpelle/Latin/Liberia
- { 148, 66, 239, 5239, 5239, 106, 106, 184, 184,109,109, 78, 78, 26, 26 },// Kurdish/Latin/Turkey
+ { 146, 66, 102, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Kpelle/Latin/Guinea
+ { 148, 66, 239, 6344, 6344, 6453, 6453, 184, 184,109,109, 79, 79, 26, 26 },// Kurdish/Latin/Turkey
{ 149, 66, 40, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Kwasio/Latin/Cameroon
{ 150, 27, 128, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Kyrgyz/Cyrillic/Kyrgyzstan
{ 151, 66, 248, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Lakota/Latin/United States
{ 152, 66, 230, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Langi/Latin/Tanzania
- { 153, 65, 129, 5348, 5348, 5443, 5518, 184, 184, 95, 95, 75, 77, 26, 26 },// Lao/Lao/Laos
+ { 153, 65, 129, 6532, 6532, 6627, 6702, 184, 184, 95, 95, 75, 77, 26, 26 },// Lao/Lao/Laos
{ 154, 66, 253, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Latin/Latin/Vatican City
- { 155, 66, 131, 5595, 5595, 106, 106, 184, 184,108,108, 78, 78, 26, 26 },// Latvian/Latin/Latvia
- { 158, 66, 57, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Lingala/Latin/Congo Kinshasa
+ { 155, 66, 131, 6779, 6779, 106, 106, 184, 184,108,108, 78, 78, 26, 26 },// Latvian/Latin/Latvia
+ { 158, 66, 57, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Lingala/Latin/Congo - Kinshasa
{ 158, 66, 7, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Lingala/Latin/Angola
{ 158, 66, 46, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Lingala/Latin/Central African Republic
- { 158, 66, 56, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Lingala/Latin/Congo Brazzaville
+ { 158, 66, 56, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Lingala/Latin/Congo - Brazzaville
{ 160, 66, 137, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Lithuanian/Latin/Lithuania
- { 161, 66, 258, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Lojban/Latin/World
+ { 161, 66, 258, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Lojban/Latin/world
{ 162, 66, 91, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Lower Sorbian/Latin/Germany
{ 163, 66, 91, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Low German/Latin/Germany
{ 163, 66, 165, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Low German/Latin/Netherlands
- { 164, 66, 57, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Luba Katanga/Latin/Congo Kinshasa
+ { 164, 66, 57, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Luba-Katanga/Latin/Congo - Kinshasa
{ 165, 66, 225, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Lule Sami/Latin/Sweden
+ { 165, 66, 175, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Lule Sami/Latin/Norway
{ 166, 66, 124, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Luo/Latin/Kenya
{ 167, 66, 138, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Luxembourgish/Latin/Luxembourg
{ 168, 66, 124, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Luyia/Latin/Kenya
- { 169, 27, 140, 5703, 5703, 5792, 5792, 184, 184, 89, 89, 71, 71, 26, 26 },// Macedonian/Cyrillic/Macedonia
+ { 169, 27, 140, 6887, 6887, 6976, 6976, 184, 184, 89, 89, 71, 71, 26, 26 },// Macedonian/Cyrillic/Macedonia
{ 170, 66, 230, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Machame/Latin/Tanzania
{ 171, 29, 110, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Maithili/Devanagari/India
- { 172, 66, 160, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Makhuwa Meetto/Latin/Mozambique
+ { 172, 66, 160, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Makhuwa-Meetto/Latin/Mozambique
{ 173, 66, 230, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Makonde/Latin/Tanzania
{ 174, 66, 141, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Malagasy/Latin/Madagascar
- { 175, 74, 110, 5863, 5965, 6067, 6067, 6164, 6164,102,102, 97, 97, 26, 26 },// Malayalam/Malayalam/India
- { 176, 66, 143, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Malay/Latin/Malaysia
+ { 175, 74, 110, 7047, 7149, 7251, 7251, 7348, 7348,102,102, 97, 97, 26, 26 },// Malayalam/Malayalam/India
+ { 176, 66, 143, 7374, 7374, 7483, 7483, 184, 184,109,109, 73, 73, 26, 26 },// Malay/Latin/Malaysia
+ { 176, 4, 35, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Malay/Arabic/Brunei
{ 176, 4, 143, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Malay/Arabic/Malaysia
- { 176, 66, 35, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Malay/Latin/Brunei
- { 176, 66, 111, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Malay/Latin/Indonesia
- { 176, 66, 210, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Malay/Latin/Singapore
+ { 176, 66, 35, 7374, 7374, 7483, 7483, 184, 184,109,109, 73, 73, 26, 26 },// Malay/Latin/Brunei
+ { 176, 66, 111, 7374, 7374, 7483, 7483, 184, 184,109,109, 73, 73, 26, 26 },// Malay/Latin/Indonesia
+ { 176, 66, 210, 7374, 7374, 7483, 7483, 184, 184,109,109, 73, 73, 26, 26 },// Malay/Latin/Singapore
{ 177, 66, 146, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Maltese/Latin/Malta
{ 179, 9, 110, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Manipuri/Bangla/India
{ 179, 78, 110, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Manipuri/Meitei Mayek/India
- { 180, 66, 115, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Manx/Latin/Isle Of Man
+ { 180, 66, 115, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Manx/Latin/Isle of Man
{ 181, 66, 167, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Maori/Latin/New Zealand
{ 182, 66, 49, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Mapuche/Latin/Chile
- { 183, 29, 110, 6190, 6190, 6277, 6277, 6355, 6355, 87, 87, 78, 78, 26, 26 },// Marathi/Devanagari/India
+ { 183, 29, 110, 7556, 7556, 7643, 7643, 7721, 7721, 87, 87, 78, 78, 26, 26 },// Marathi/Devanagari/India
{ 185, 66, 124, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Masai/Latin/Kenya
{ 185, 66, 230, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Masai/Latin/Tanzania
{ 186, 4, 112, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Mazanderani/Arabic/Iran
@@ -485,6 +466,7 @@ static const QCalendarLocale locale_data[] = {
{ 190, 66, 41, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Mohawk/Latin/Canada
{ 191, 27, 156, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Mongolian/Cyrillic/Mongolia
{ 191, 83, 50, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Mongolian/Mongolian/China
+ { 191, 83, 156, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Mongolian/Mongolian/Mongolia
{ 192, 66, 150, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Morisyen/Latin/Mauritius
{ 193, 66, 40, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Mundang/Latin/Cameroon
{ 194, 66, 248, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Muscogee/Latin/United States
@@ -503,38 +485,41 @@ static const QCalendarLocale locale_data[] = {
{ 206, 66, 225, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Northern Sami/Latin/Sweden
{ 207, 66, 216, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Northern Sotho/Latin/South Africa
{ 208, 66, 261, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// North Ndebele/Latin/Zimbabwe
- { 209, 66, 175, 6381, 6381, 6487, 6565, 184, 184,106,106, 78, 78, 26, 26 },// Norwegian Bokmal/Latin/Norway
- { 209, 66, 224, 6381, 6381, 6487, 6565, 184, 184,106,106, 78, 78, 26, 26 },// Norwegian Bokmal/Latin/Svalbard And Jan Mayen
- { 210, 66, 175, 6381, 6381, 6487, 6565, 184, 184,106,106, 78, 78, 26, 26 },// Norwegian Nynorsk/Latin/Norway
+ { 209, 66, 175, 7747, 7747, 7853, 7931, 184, 184,106,106, 78, 78, 26, 26 },// Norwegian Bokmal/Latin/Norway
+ { 209, 66, 224, 7747, 7747, 7853, 7931, 184, 184,106,106, 78, 78, 26, 26 },// Norwegian Bokmal/Latin/Svalbard and Jan Mayen
+ { 210, 66, 175, 7747, 7747, 7853, 7931, 184, 184,106,106, 78, 78, 26, 26 },// Norwegian Nynorsk/Latin/Norway
{ 211, 66, 219, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Nuer/Latin/South Sudan
{ 212, 66, 142, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Nyanja/Latin/Malawi
{ 213, 66, 243, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Nyankole/Latin/Uganda
{ 214, 66, 84, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Occitan/Latin/France
+ { 214, 66, 220, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Occitan/Latin/Spain
{ 215, 91, 110, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Odia/Odia/India
{ 220, 66, 77, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Oromo/Latin/Ethiopia
{ 220, 66, 124, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Oromo/Latin/Kenya
{ 221, 101, 248, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Osage/Osage/United States
{ 222, 27, 90, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Ossetic/Cyrillic/Georgia
{ 222, 27, 193, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Ossetic/Cyrillic/Russia
- { 227, 4, 1, 6643, 6717, 6792, 6865, 184, 184, 74, 75, 73, 73, 26, 26 },// Pashto/Arabic/Afghanistan
- { 227, 4, 178, 6938, 7017, 6792, 6865, 184, 184, 79, 80, 73, 73, 26, 26 },// Pashto/Arabic/Pakistan
- { 228, 4, 112, 7097, 7187, 7097, 7187, 7279, 7279, 90, 92, 90, 92, 23, 23 },// Persian/Arabic/Iran
- { 228, 4, 1, 7097, 7187, 7097, 7187, 7279, 7279, 90, 92, 90, 92, 23, 23 },// Persian/Arabic/Afghanistan
- { 230, 66, 187, 7302, 7302, 7409, 7409, 184, 184,107,107, 77, 77, 26, 26 },// Polish/Latin/Poland
+ { 226, 66, 62, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Papiamento/Latin/Curacao
+ { 226, 66, 13, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Papiamento/Latin/Aruba
+ { 227, 4, 1, 8009, 8009, 8084, 8084, 184, 184, 75, 75, 73, 73, 26, 26 },// Pashto/Arabic/Afghanistan
+ { 227, 4, 178, 8157, 8157, 8084, 8084, 184, 184, 80, 80, 73, 73, 26, 26 },// Pashto/Arabic/Pakistan
+ { 228, 4, 112, 8237, 8237, 8237, 8237, 8327, 8327, 90, 90, 90, 90, 23, 23 },// Persian/Arabic/Iran
+ { 228, 4, 1, 8237, 8237, 8237, 8237, 8327, 8327, 90, 90, 90, 90, 23, 23 },// Persian/Arabic/Afghanistan
+ { 230, 66, 187, 8350, 8350, 8457, 8457, 184, 184,107,107, 77, 77, 26, 26 },// Polish/Latin/Poland
{ 231, 66, 32, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Portuguese/Latin/Brazil
{ 231, 66, 7, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Portuguese/Latin/Angola
{ 231, 66, 43, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Portuguese/Latin/Cape Verde
{ 231, 66, 73, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Portuguese/Latin/Equatorial Guinea
- { 231, 66, 101, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Portuguese/Latin/Guinea Bissau
+ { 231, 66, 101, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Portuguese/Latin/Guinea-Bissau
{ 231, 66, 138, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Portuguese/Latin/Luxembourg
{ 231, 66, 139, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Portuguese/Latin/Macao
{ 231, 66, 160, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Portuguese/Latin/Mozambique
{ 231, 66, 188, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Portuguese/Latin/Portugal
- { 231, 66, 204, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Portuguese/Latin/Sao Tome And Principe
+ { 231, 66, 204, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Portuguese/Latin/Sao Tome and Principe
{ 231, 66, 226, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Portuguese/Latin/Switzerland
{ 231, 66, 232, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Portuguese/Latin/Timor-Leste
- { 232, 66, 258, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Prussian/Latin/World
- { 233, 41, 110, 7486, 7578, 7672, 7672, 184, 184, 92, 94, 77, 77, 26, 26 },// Punjabi/Gurmukhi/India
+ { 232, 66, 187, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Prussian/Latin/Poland
+ { 233, 41, 110, 8534, 8626, 8720, 8720, 184, 184, 92, 94, 77, 77, 26, 26 },// Punjabi/Gurmukhi/India
{ 233, 4, 178, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Punjabi/Arabic/Pakistan
{ 234, 66, 184, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Quechua/Latin/Peru
{ 234, 66, 28, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Quechua/Latin/Bolivia
@@ -544,12 +529,12 @@ static const QCalendarLocale locale_data[] = {
{ 236, 66, 226, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Romansh/Latin/Switzerland
{ 237, 66, 230, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Rombo/Latin/Tanzania
{ 238, 66, 38, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Rundi/Latin/Burundi
- { 239, 27, 193, 7749, 7749, 7880, 7880, 184, 184,131,131, 79, 79, 26, 26 },// Russian/Cyrillic/Russia
- { 239, 27, 22, 7749, 7749, 7880, 7880, 184, 184,131,131, 79, 79, 26, 26 },// Russian/Cyrillic/Belarus
- { 239, 27, 123, 7749, 7749, 7880, 7880, 184, 184,131,131, 79, 79, 26, 26 },// Russian/Cyrillic/Kazakhstan
- { 239, 27, 128, 7749, 7749, 7880, 7880, 184, 184,131,131, 79, 79, 26, 26 },// Russian/Cyrillic/Kyrgyzstan
- { 239, 27, 154, 7749, 7749, 7880, 7880, 184, 184,131,131, 79, 79, 26, 26 },// Russian/Cyrillic/Moldova
- { 239, 27, 244, 7749, 7749, 7880, 7880, 184, 184,131,131, 79, 79, 26, 26 },// Russian/Cyrillic/Ukraine
+ { 239, 27, 193, 8797, 8797, 8928, 8928, 184, 184,131,131, 79, 79, 26, 26 },// Russian/Cyrillic/Russia
+ { 239, 27, 22, 8797, 8797, 8928, 8928, 184, 184,131,131, 79, 79, 26, 26 },// Russian/Cyrillic/Belarus
+ { 239, 27, 123, 8797, 8797, 8928, 8928, 184, 184,131,131, 79, 79, 26, 26 },// Russian/Cyrillic/Kazakhstan
+ { 239, 27, 128, 8797, 8797, 8928, 8928, 184, 184,131,131, 79, 79, 26, 26 },// Russian/Cyrillic/Kyrgyzstan
+ { 239, 27, 154, 8797, 8797, 8928, 8928, 184, 184,131,131, 79, 79, 26, 26 },// Russian/Cyrillic/Moldova
+ { 239, 27, 244, 8797, 8797, 8928, 8928, 184, 184,131,131, 79, 79, 26, 26 },// Russian/Cyrillic/Ukraine
{ 240, 66, 230, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Rwa/Latin/Tanzania
{ 241, 66, 74, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Saho/Latin/Eritrea
{ 242, 27, 193, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Sakha/Cyrillic/Russia
@@ -559,44 +544,47 @@ static const QCalendarLocale locale_data[] = {
{ 247, 29, 110, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Sanskrit/Devanagari/India
{ 248, 93, 110, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Santali/Ol Chiki/India
{ 248, 29, 110, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Santali/Devanagari/India
- { 249, 66, 117, 7959, 7959, 6565, 6565, 184, 184,105,105, 78, 78, 26, 26 },// Sardinian/Latin/Italy
+ { 249, 66, 117, 9007, 9007, 7931, 7931, 184, 184,105,105, 78, 78, 26, 26 },// Sardinian/Latin/Italy
{ 251, 66, 160, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Sena/Latin/Mozambique
- { 252, 27, 207, 1032, 1122, 1219, 1219, 184, 184, 90, 97, 69, 69, 26, 26 },// Serbian/Cyrillic/Serbia
- { 252, 27, 29, 1032, 1122, 1219, 1219, 184, 184, 90, 97, 69, 69, 26, 26 },// Serbian/Cyrillic/Bosnia And Herzegovina
- { 252, 27, 126, 1032, 1122, 1219, 1219, 184, 184, 90, 97, 69, 69, 26, 26 },// Serbian/Cyrillic/Kosovo
- { 252, 27, 157, 1032, 1122, 1219, 1219, 184, 184, 90, 97, 69, 69, 26, 26 },// Serbian/Cyrillic/Montenegro
- { 252, 66, 29, 8064, 8158, 8255, 8255, 184, 184, 94, 97, 72, 72, 26, 26 },// Serbian/Latin/Bosnia And Herzegovina
- { 252, 66, 126, 8064, 8158, 8255, 8255, 184, 184, 94, 97, 72, 72, 26, 26 },// Serbian/Latin/Kosovo
- { 252, 66, 157, 8064, 8158, 8255, 8255, 184, 184, 94, 97, 72, 72, 26, 26 },// Serbian/Latin/Montenegro
- { 252, 66, 207, 8064, 8158, 8255, 8255, 184, 184, 94, 97, 72, 72, 26, 26 },// Serbian/Latin/Serbia
+ { 252, 27, 207, 1420, 9112, 1607, 1607, 184, 184, 90, 97, 69, 69, 26, 26 },// Serbian/Cyrillic/Serbia
+ { 252, 27, 29, 1420, 9112, 1607, 1607, 184, 184, 90, 97, 69, 69, 26, 26 },// Serbian/Cyrillic/Bosnia and Herzegovina
+ { 252, 27, 126, 1420, 9112, 1607, 1607, 184, 184, 90, 97, 69, 69, 26, 26 },// Serbian/Cyrillic/Kosovo
+ { 252, 27, 157, 1420, 9112, 1607, 1607, 184, 184, 90, 97, 69, 69, 26, 26 },// Serbian/Cyrillic/Montenegro
+ { 252, 66, 29, 9209, 9303, 9400, 9400, 184, 184, 94, 97, 72, 72, 26, 26 },// Serbian/Latin/Bosnia and Herzegovina
+ { 252, 66, 126, 9209, 9303, 9400, 9400, 184, 184, 94, 97, 72, 72, 26, 26 },// Serbian/Latin/Kosovo
+ { 252, 66, 157, 9209, 9303, 9400, 9400, 184, 184, 94, 97, 72, 72, 26, 26 },// Serbian/Latin/Montenegro
+ { 252, 66, 207, 9209, 9303, 9400, 9400, 184, 184, 94, 97, 72, 72, 26, 26 },// Serbian/Latin/Serbia
{ 253, 66, 230, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Shambala/Latin/Tanzania
{ 254, 66, 261, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Shona/Latin/Zimbabwe
{ 255, 141, 50, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Sichuan Yi/Yi/China
{ 256, 66, 117, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Sicilian/Latin/Italy
{ 257, 66, 77, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Sidamo/Latin/Ethiopia
{ 258, 66, 187, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Silesian/Latin/Poland
- { 259, 4, 178, 8327, 8327, 8327, 8327, 184, 184, 91, 91, 91, 91, 26, 26 },// Sindhi/Arabic/Pakistan
+ { 259, 4, 178, 9472, 9472, 9472, 9472, 184, 184, 91, 91, 91, 91, 26, 26 },// Sindhi/Arabic/Pakistan
{ 259, 29, 110, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Sindhi/Devanagari/India
{ 260, 119, 221, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Sinhala/Sinhala/Sri Lanka
{ 261, 66, 83, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Skolt Sami/Latin/Finland
- { 262, 66, 212, 8418, 8418, 8553, 8553, 184, 184,135,135, 78, 78, 26, 26 },// Slovak/Latin/Slovakia
+ { 262, 66, 212, 9563, 9563, 9698, 9698, 184, 184,135,135, 78, 78, 26, 26 },// Slovak/Latin/Slovakia
{ 263, 66, 213, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Slovenian/Latin/Slovenia
{ 264, 66, 243, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Soga/Latin/Uganda
- { 265, 66, 215, 8631, 8762, 8892, 8966, 184, 184,131,130, 74, 81, 26, 26 },// Somali/Latin/Somalia
- { 265, 66, 67, 8631, 8762, 8892, 8966, 184, 184,131,130, 74, 81, 26, 26 },// Somali/Latin/Djibouti
- { 265, 66, 77, 8631, 8762, 8892, 8966, 184, 184,131,130, 74, 81, 26, 26 },// Somali/Latin/Ethiopia
- { 265, 66, 124, 8631, 8762, 8892, 8966, 184, 184,131,130, 74, 81, 26, 26 },// Somali/Latin/Kenya
+ { 265, 66, 215, 9776, 9907,10037,10111, 184, 184,131,130, 74, 81, 26, 26 },// Somali/Latin/Somalia
+ { 265, 66, 67, 9776, 9907,10037,10111, 184, 184,131,130, 74, 81, 26, 26 },// Somali/Latin/Djibouti
+ { 265, 66, 77, 9776, 9907,10037,10111, 184, 184,131,130, 74, 81, 26, 26 },// Somali/Latin/Ethiopia
+ { 265, 66, 124, 9776, 9907,10037,10111, 184, 184,131,130, 74, 81, 26, 26 },// Somali/Latin/Kenya
{ 266, 4, 112, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Southern Kurdish/Arabic/Iran
+ { 266, 4, 113, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Southern Kurdish/Arabic/Iraq
{ 267, 66, 225, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Southern Sami/Latin/Sweden
+ { 267, 66, 175, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Southern Sami/Latin/Norway
{ 268, 66, 216, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Southern Sotho/Latin/South Africa
+ { 268, 66, 133, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Southern Sotho/Latin/Lesotho
{ 269, 66, 216, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// South Ndebele/Latin/South Africa
- { 270, 66, 220, 9047, 9047, 6565, 6565, 184, 184,106,106, 78, 78, 26, 26 },// Spanish/Latin/Spain
+ { 270, 66, 220,10192,10192, 7931, 7931, 184, 184,106,106, 78, 78, 26, 26 },// Spanish/Latin/Spain
{ 270, 66, 11, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Spanish/Latin/Argentina
{ 270, 66, 24, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Spanish/Latin/Belize
{ 270, 66, 28, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Spanish/Latin/Bolivia
{ 270, 66, 32, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Spanish/Latin/Brazil
- { 270, 66, 42, 9047, 9047, 6565, 6565, 184, 184,106,106, 78, 78, 26, 26 },// Spanish/Latin/Canary Islands
- { 270, 66, 47, 9047, 9047, 6565, 6565, 184, 184,106,106, 78, 78, 26, 26 },// Spanish/Latin/Ceuta And Melilla
+ { 270, 66, 42,10192,10192, 7931, 7931, 184, 184,106,106, 78, 78, 26, 26 },// Spanish/Latin/Canary Islands
+ { 270, 66, 47,10192,10192, 7931, 7931, 184, 184,106,106, 78, 78, 26, 26 },// Spanish/Latin/Ceuta and Melilla
{ 270, 66, 49, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Spanish/Latin/Chile
{ 270, 66, 54, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Spanish/Latin/Colombia
{ 270, 66, 59, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Spanish/Latin/Costa Rica
@@ -604,7 +592,7 @@ static const QCalendarLocale locale_data[] = {
{ 270, 66, 69, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Spanish/Latin/Dominican Republic
{ 270, 66, 70, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Spanish/Latin/Ecuador
{ 270, 66, 72, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Spanish/Latin/El Salvador
- { 270, 66, 73, 9047, 9047, 6565, 6565, 184, 184,106,106, 78, 78, 26, 26 },// Spanish/Latin/Equatorial Guinea
+ { 270, 66, 73,10192,10192, 7931, 7931, 184, 184,106,106, 78, 78, 26, 26 },// Spanish/Latin/Equatorial Guinea
{ 270, 66, 99, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Spanish/Latin/Guatemala
{ 270, 66, 106, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Spanish/Latin/Honduras
{ 270, 66, 130, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Spanish/Latin/Latin America
@@ -613,7 +601,7 @@ static const QCalendarLocale locale_data[] = {
{ 270, 66, 181, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Spanish/Latin/Panama
{ 270, 66, 183, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Spanish/Latin/Paraguay
{ 270, 66, 184, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Spanish/Latin/Peru
- { 270, 66, 185, 9047, 9047, 6565, 6565, 184, 184,106,106, 78, 78, 26, 26 },// Spanish/Latin/Philippines
+ { 270, 66, 185,10192,10192, 7931, 7931, 184, 184,106,106, 78, 78, 26, 26 },// Spanish/Latin/Philippines
{ 270, 66, 189, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Spanish/Latin/Puerto Rico
{ 270, 66, 248, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Spanish/Latin/United States
{ 270, 66, 250, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Spanish/Latin/Uruguay
@@ -621,664 +609,1185 @@ static const QCalendarLocale locale_data[] = {
{ 271, 135, 159, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Standard Moroccan Tamazight/Tifinagh/Morocco
{ 272, 66, 111, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Sundanese/Latin/Indonesia
{ 273, 66, 230, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Swahili/Latin/Tanzania
- { 273, 66, 57, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Swahili/Latin/Congo Kinshasa
+ { 273, 66, 57, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Swahili/Latin/Congo - Kinshasa
{ 273, 66, 124, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Swahili/Latin/Kenya
{ 273, 66, 243, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Swahili/Latin/Uganda
{ 274, 66, 216, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Swati/Latin/South Africa
- { 275, 66, 225, 9153, 9280, 106, 106, 184, 184,127,127, 78, 78, 26, 26 },// Swedish/Latin/Sweden
- { 275, 66, 2, 9153, 9280, 106, 106, 184, 184,127,127, 78, 78, 26, 26 },// Swedish/Latin/Aland Islands
- { 275, 66, 83, 9153, 9280, 106, 106, 184, 184,127,127, 78, 78, 26, 26 },// Swedish/Latin/Finland
+ { 274, 66, 76, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Swati/Latin/Eswatini
+ { 275, 66, 225,10298,10425, 106, 106, 184, 184,127,127, 78, 78, 26, 26 },// Swedish/Latin/Sweden
+ { 275, 66, 2,10298,10425, 106, 106, 184, 184,127,127, 78, 78, 26, 26 },// Swedish/Latin/Aland Islands
+ { 275, 66, 83,10298,10425, 106, 106, 184, 184,127,127, 78, 78, 26, 26 },// Swedish/Latin/Finland
{ 276, 66, 226, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Swiss German/Latin/Switzerland
{ 276, 66, 84, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Swiss German/Latin/France
{ 276, 66, 136, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Swiss German/Latin/Liechtenstein
{ 277, 123, 113, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Syriac/Syriac/Iraq
+ { 277, 123, 227, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Syriac/Syriac/Syria
{ 278, 135, 159, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Tachelhit/Tifinagh/Morocco
{ 278, 66, 159, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Tachelhit/Latin/Morocco
{ 280, 127, 255, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Tai Dam/Tai Viet/Vietnam
{ 281, 66, 124, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Taita/Latin/Kenya
- { 282, 27, 229, 9407, 9517, 9627, 9627, 184, 184,110,110, 74, 74, 26, 26 },// Tajik/Cyrillic/Tajikistan
- { 283, 129, 110, 9701, 9701, 9792, 9792, 184, 184, 91, 91, 72, 72, 26, 26 },// Tamil/Tamil/India
- { 283, 129, 143, 9701, 9701, 9792, 9792, 184, 184, 91, 91, 72, 72, 26, 26 },// Tamil/Tamil/Malaysia
- { 283, 129, 210, 9701, 9701, 9792, 9792, 184, 184, 91, 91, 72, 72, 26, 26 },// Tamil/Tamil/Singapore
- { 283, 129, 221, 9701, 9701, 9792, 9792, 184, 184, 91, 91, 72, 72, 26, 26 },// Tamil/Tamil/Sri Lanka
+ { 282, 27, 229,10552,10662,10772,10772, 184, 184,110,110, 74, 74, 26, 26 },// Tajik/Cyrillic/Tajikistan
+ { 283, 129, 110,10846,10846,10937,10937, 184, 184, 91, 91, 72, 72, 26, 26 },// Tamil/Tamil/India
+ { 283, 129, 143,10846,10846,10937,10937, 184, 184, 91, 91, 72, 72, 26, 26 },// Tamil/Tamil/Malaysia
+ { 283, 129, 210,10846,10846,10937,10937, 184, 184, 91, 91, 72, 72, 26, 26 },// Tamil/Tamil/Singapore
+ { 283, 129, 221,10846,10846,10937,10937, 184, 184, 91, 91, 72, 72, 26, 26 },// Tamil/Tamil/Sri Lanka
{ 284, 66, 228, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Taroko/Latin/Taiwan
{ 285, 66, 170, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Tasawaq/Latin/Niger
{ 286, 27, 193, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Tatar/Cyrillic/Russia
- { 287, 131, 110, 9864, 0, 9959, 9959, 184, 184, 95,106, 74, 74, 26, 26 },// Telugu/Telugu/India
+ { 287, 131, 110,11009, 0,11104,11104, 184, 184, 95,106, 74, 74, 26, 26 },// Telugu/Telugu/India
{ 288, 66, 243, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Teso/Latin/Uganda
{ 288, 66, 124, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Teso/Latin/Kenya
- { 289, 133, 231,10033,10033,10135,10135, 184, 184,102,102, 89, 89, 26, 26 },// Thai/Thai/Thailand
+ { 289, 133, 231,11178,11178,11280,11280, 184, 184,102,102, 89, 89, 26, 26 },// Thai/Thai/Thailand
{ 290, 134, 50, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Tibetan/Tibetan/China
{ 290, 134, 110, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Tibetan/Tibetan/India
{ 291, 33, 74, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Tigre/Ethiopic/Eritrea
{ 292, 33, 77, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Tigrinya/Ethiopic/Ethiopia
{ 292, 33, 74, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Tigrinya/Ethiopic/Eritrea
{ 294, 66, 182, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Tok Pisin/Latin/Papua New Guinea
- { 295, 66, 235,10224,10224,10323,10323, 184, 184, 99, 99, 60, 60, 26, 26 },// Tongan/Latin/Tonga
+ { 295, 66, 235,11369,11369,11468,11468, 184, 184, 99, 99, 60, 60, 26, 26 },// Tongan/Latin/Tonga
{ 296, 66, 216, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Tsonga/Latin/South Africa
{ 297, 66, 216, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Tswana/Latin/South Africa
- { 298, 66, 239,10383,10383,10493,10493, 184, 184,110,110, 83, 83, 26, 26 },// Turkish/Latin/Turkey
- { 298, 66, 63,10383,10383,10493,10493, 184, 184,110,110, 83, 83, 26, 26 },// Turkish/Latin/Cyprus
- { 299, 66, 240, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Turkmen/Latin/Turkmenistan
+ { 297, 66, 30, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Tswana/Latin/Botswana
+ { 298, 66, 239,11528,11528,11638,11638, 184, 184,110,110, 83, 83, 26, 26 },// Turkish/Latin/Turkey
+ { 298, 66, 63,11528,11528,11638,11638, 184, 184,110,110, 83, 83, 26, 26 },// Turkish/Latin/Cyprus
+ { 299, 66, 240,11721,11721,11834,11834, 184, 184,113,113, 59, 59, 26, 26 },// Turkmen/Latin/Turkmenistan
{ 301, 66, 169, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Tyap/Latin/Nigeria
- { 303, 27, 244,10576,10576,10679,10750, 184, 184,103,103, 71, 81, 26, 26 },// Ukrainian/Cyrillic/Ukraine
+ { 303, 27, 244,11893,11893,11996,12067, 184, 184,103,103, 71, 81, 26, 26 },// Ukrainian/Cyrillic/Ukraine
{ 304, 66, 91, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Upper Sorbian/Latin/Germany
- { 305, 4, 178,10831,10831,10927,11025, 184, 184, 96, 96, 98, 96, 26, 26 },// Urdu/Arabic/Pakistan
- { 305, 4, 110,10831,10831,10927,11025, 184, 184, 96, 96, 98, 96, 26, 26 },// Urdu/Arabic/India
- { 306, 4, 50,11121,11121,11121,11121, 184, 184,118,118,118,118, 26, 26 },// Uyghur/Arabic/China
- { 307, 66, 251,11239,11239,11361,11361, 184, 184,122,122, 82, 82, 26, 26 },// Uzbek/Latin/Uzbekistan
+ { 305, 4, 178,12148,12148,12244,12342, 184, 184, 96, 96, 98, 96, 26, 26 },// Urdu/Arabic/Pakistan
+ { 305, 4, 110,12148,12148,12244,12342, 184, 184, 96, 96, 98, 96, 26, 26 },// Urdu/Arabic/India
+ { 306, 4, 50,12438,12438,12438,12438, 184, 184,118,118,118,118, 26, 26 },// Uyghur/Arabic/China
+ { 307, 66, 251,12556,12556,12678,12678, 184, 184,122,122, 82, 82, 26, 26 },// Uzbek/Latin/Uzbekistan
{ 307, 4, 1, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Uzbek/Arabic/Afghanistan
- { 307, 27, 251,11443,11443, 106, 106, 184, 184,114,114, 78, 78, 26, 26 },// Uzbek/Cyrillic/Uzbekistan
+ { 307, 27, 251,12760,12760, 106, 106, 184, 184,114,114, 78, 78, 26, 26 },// Uzbek/Cyrillic/Uzbekistan
{ 308, 139, 134, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Vai/Vai/Liberia
{ 308, 66, 134, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Vai/Latin/Liberia
{ 309, 66, 216, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Venda/Latin/South Africa
{ 310, 66, 255, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Vietnamese/Latin/Vietnam
- { 311, 66, 258, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Volapuk/Latin/World
+ { 311, 66, 258, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Volapuk/Latin/world
{ 312, 66, 230, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Vunjo/Latin/Tanzania
{ 313, 66, 23, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Walloon/Latin/Belgium
{ 314, 66, 226, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Walser/Latin/Switzerland
{ 315, 66, 15, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Warlpiri/Latin/Australia
{ 316, 66, 246, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Welsh/Latin/United Kingdom
{ 317, 4, 178, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Western Balochi/Arabic/Pakistan
- { 318, 66, 165, 2212, 2212, 2346, 2346, 184, 184,134,134, 83, 83, 26, 26 },// Western Frisian/Latin/Netherlands
+ { 317, 4, 1, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Western Balochi/Arabic/Afghanistan
+ { 317, 4, 112, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Western Balochi/Arabic/Iran
+ { 317, 4, 176, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Western Balochi/Arabic/Oman
+ { 317, 4, 245, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Western Balochi/Arabic/United Arab Emirates
+ { 318, 66, 165, 2600, 2600, 2734, 2734, 184, 184,134,134, 83, 83, 26, 26 },// Western Frisian/Latin/Netherlands
{ 319, 33, 77, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Wolaytta/Ethiopic/Ethiopia
{ 320, 66, 206, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Wolof/Latin/Senegal
{ 321, 66, 216, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Xhosa/Latin/South Africa
{ 322, 66, 40, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Yangben/Latin/Cameroon
- { 323, 47, 258, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Yiddish/Hebrew/World
+ { 323, 47, 244, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Yiddish/Hebrew/Ukraine
{ 324, 66, 169, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Yoruba/Latin/Nigeria
{ 324, 66, 25, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Yoruba/Latin/Benin
{ 325, 66, 170, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Zarma/Latin/Niger
+ { 326, 66, 50, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Zhuang/Latin/China
{ 327, 66, 216, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Zulu/Latin/South Africa
{ 328, 66, 32, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Kaingang/Latin/Brazil
{ 329, 66, 32, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Nheengatu/Latin/Brazil
{ 329, 66, 54, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Nheengatu/Latin/Colombia
{ 329, 66, 254, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Nheengatu/Latin/Venezuela
+ { 330, 29, 110, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Haryanvi/Devanagari/India
+ { 331, 66, 91, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Northern Frisian/Latin/Germany
+ { 332, 29, 110, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Rajasthani/Devanagari/India
+ { 333, 27, 193, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Moksha/Cyrillic/Russia
+ { 334, 66, 258, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Toki Pona/Latin/world
+ { 335, 66, 214, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Pijin/Latin/Solomon Islands
+ { 336, 66, 169, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Obolo/Latin/Nigeria
+ { 337, 4, 178, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Baluchi/Arabic/Pakistan
+ { 337, 66, 178, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Baluchi/Latin/Pakistan
+ { 338, 66, 117, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Ligurian/Latin/Italy
+ { 339, 142, 161, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Rohingya/Hanifi/Myanmar
+ { 339, 142, 20, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Rohingya/Hanifi/Bangladesh
+ { 340, 4, 178, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Torwali/Arabic/Pakistan
+ { 341, 66, 25, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Anii/Latin/Benin
+ { 342, 29, 110, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Kangri/Devanagari/India
+ { 343, 66, 117, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Venetian/Latin/Italy
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },// trailing zeros
};
-static const char16_t months_data[] = {
-0x4d, 0x75, 0x68, 0x61, 0x72, 0x72, 0x61, 0x6d, 0x3b, 0x53, 0x61, 0x66, 0x61, 0x72, 0x3b, 0x52, 0x61, 0x62, 0x69, 0x2bb,
-0x20, 0x49, 0x3b, 0x52, 0x61, 0x62, 0x69, 0x2bb, 0x20, 0x49, 0x49, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x64, 0x61, 0x20, 0x49,
-0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x64, 0x61, 0x20, 0x49, 0x49, 0x3b, 0x52, 0x61, 0x6a, 0x61, 0x62, 0x3b, 0x53, 0x68, 0x61,
-0x2bb, 0x62, 0x61, 0x6e, 0x3b, 0x52, 0x61, 0x6d, 0x61, 0x64, 0x61, 0x6e, 0x3b, 0x53, 0x68, 0x61, 0x77, 0x77, 0x61, 0x6c,
-0x3b, 0x44, 0x68, 0x75, 0x2bb, 0x6c, 0x2d, 0x51, 0x69, 0x2bb, 0x64, 0x61, 0x68, 0x3b, 0x44, 0x68, 0x75, 0x2bb, 0x6c, 0x2d,
-0x48, 0x69, 0x6a, 0x6a, 0x61, 0x68, 0x4d, 0x75, 0x68, 0x2e, 0x3b, 0x53, 0x61, 0x66, 0x2e, 0x3b, 0x52, 0x61, 0x62, 0x2e,
-0x20, 0x49, 0x3b, 0x52, 0x61, 0x62, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x4a, 0x75, 0x6d, 0x2e, 0x20, 0x49, 0x3b, 0x4a, 0x75,
-0x6d, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x52, 0x61, 0x6a, 0x2e, 0x3b, 0x53, 0x68, 0x61, 0x2e, 0x3b, 0x52, 0x61, 0x6d, 0x2e,
-0x3b, 0x53, 0x68, 0x61, 0x77, 0x2e, 0x3b, 0x44, 0x68, 0x75, 0x2bb, 0x6c, 0x2d, 0x51, 0x2e, 0x3b, 0x44, 0x68, 0x75, 0x2bb,
-0x6c, 0x2d, 0x48, 0x2e, 0x31, 0x3b, 0x32, 0x3b, 0x33, 0x3b, 0x34, 0x3b, 0x35, 0x3b, 0x36, 0x3b, 0x37, 0x3b, 0x38, 0x3b,
-0x39, 0x3b, 0x31, 0x30, 0x3b, 0x31, 0x31, 0x3b, 0x31, 0x32, 0x1219, 0x1200, 0x1228, 0x121d, 0x3b, 0x1233, 0x1348, 0x122d, 0x3b, 0x1228,
-0x1262, 0x12d1, 0x120d, 0x20, 0x12a0, 0x12c8, 0x120d, 0x3b, 0x1228, 0x1262, 0x12d1, 0x120d, 0x20, 0x12a0, 0x12ba, 0x122d, 0x3b, 0x1300, 0x121b, 0x12f0,
-0x120d, 0x20, 0x12a0, 0x12c8, 0x120d, 0x3b, 0x1300, 0x121b, 0x12f0, 0x120d, 0x20, 0x12a0, 0x12ba, 0x122d, 0x3b, 0x1228, 0x1300, 0x1265, 0x3b, 0x123b,
-0x12a5, 0x1263, 0x1295, 0x3b, 0x1228, 0x1218, 0x12f3, 0x1295, 0x3b, 0x1238, 0x12cb, 0x120d, 0x3b, 0x12d9, 0x120d, 0x1242, 0x12f3, 0x1205, 0x3b, 0x12d9,
-0x120d, 0x1202, 0x1303, 0x1205, 0x645, 0x62d, 0x631, 0x645, 0x3b, 0x635, 0x641, 0x631, 0x3b, 0x631, 0x628, 0x64a, 0x639, 0x20, 0x627, 0x644,
-0x623, 0x648, 0x644, 0x3b, 0x631, 0x628, 0x64a, 0x639, 0x20, 0x627, 0x644, 0x622, 0x62e, 0x631, 0x3b, 0x62c, 0x645, 0x627, 0x62f, 0x649,
-0x20, 0x627, 0x644, 0x623, 0x648, 0x644, 0x649, 0x3b, 0x62c, 0x645, 0x627, 0x62f, 0x649, 0x20, 0x627, 0x644, 0x622, 0x62e, 0x631, 0x629,
-0x3b, 0x631, 0x62c, 0x628, 0x3b, 0x634, 0x639, 0x628, 0x627, 0x646, 0x3b, 0x631, 0x645, 0x636, 0x627, 0x646, 0x3b, 0x634, 0x648, 0x627,
-0x644, 0x3b, 0x630, 0x648, 0x20, 0x627, 0x644, 0x642, 0x639, 0x62f, 0x629, 0x3b, 0x630, 0x648, 0x20, 0x627, 0x644, 0x62d, 0x62c, 0x629,
-0x661, 0x3b, 0x662, 0x3b, 0x663, 0x3b, 0x664, 0x3b, 0x665, 0x3b, 0x666, 0x3b, 0x667, 0x3b, 0x668, 0x3b, 0x669, 0x3b, 0x661, 0x660,
-0x3b, 0x661, 0x661, 0x3b, 0x661, 0x662, 0x64, 0x65, 0x20, 0x4d, 0x75, 0x68, 0x61, 0x72, 0x72, 0x61, 0x6d, 0x3b, 0x64, 0x65,
-0x20, 0x53, 0x61, 0x66, 0x61, 0x72, 0x3b, 0x64, 0x65, 0x20, 0x52, 0x61, 0x62, 0x69, 0x2bb, 0x20, 0x49, 0x3b, 0x64, 0x65,
-0x20, 0x52, 0x61, 0x62, 0x69, 0x2bb, 0x20, 0x49, 0x49, 0x3b, 0x64, 0x65, 0x20, 0x4a, 0x75, 0x6d, 0x61, 0x64, 0x61, 0x20,
-0x49, 0x3b, 0x64, 0x65, 0x20, 0x4a, 0x75, 0x6d, 0x61, 0x64, 0x61, 0x20, 0x49, 0x49, 0x3b, 0x64, 0x65, 0x20, 0x52, 0x61,
-0x6a, 0x61, 0x62, 0x3b, 0x64, 0x65, 0x20, 0x53, 0x68, 0x61, 0x2bb, 0x62, 0x61, 0x6e, 0x3b, 0x64, 0x65, 0x20, 0x52, 0x61,
-0x6d, 0x61, 0x64, 0x61, 0x6e, 0x3b, 0x64, 0x65, 0x20, 0x53, 0x68, 0x61, 0x77, 0x77, 0x61, 0x6c, 0x3b, 0x64, 0x65, 0x20,
-0x44, 0x68, 0x75, 0x2bb, 0x6c, 0x2d, 0x51, 0x69, 0x2bb, 0x64, 0x61, 0x68, 0x3b, 0x64, 0x65, 0x20, 0x44, 0x68, 0x75, 0x2bb,
-0x6c, 0x2d, 0x48, 0x69, 0x6a, 0x6a, 0x61, 0x68, 0x4d, 0x259, 0x68, 0x259, 0x72, 0x72, 0x259, 0x6d, 0x3b, 0x53, 0x259, 0x66,
-0x259, 0x72, 0x3b, 0x52, 0x259, 0x62, 0x69, 0xfc, 0x6c, 0x259, 0x76, 0x76, 0x259, 0x6c, 0x3b, 0x52, 0x259, 0x62, 0x69, 0xfc,
-0x6c, 0x61, 0x78, 0x131, 0x72, 0x3b, 0x43, 0x259, 0x6d, 0x61, 0x64, 0x69, 0x79, 0x259, 0x6c, 0x259, 0x76, 0x76, 0x259, 0x6c,
-0x3b, 0x43, 0x259, 0x6d, 0x61, 0x64, 0x69, 0x79, 0x259, 0x6c, 0x61, 0x78, 0x131, 0x72, 0x3b, 0x52, 0x259, 0x63, 0x259, 0x62,
-0x3b, 0x15e, 0x61, 0x62, 0x61, 0x6e, 0x3b, 0x52, 0x61, 0x6d, 0x61, 0x7a, 0x61, 0x6e, 0x3b, 0x15e, 0x259, 0x76, 0x76, 0x61,
-0x6c, 0x3b, 0x5a, 0x69, 0x6c, 0x71, 0x259, 0x64, 0x259, 0x3b, 0x5a, 0x69, 0x6c, 0x68, 0x69, 0x63, 0x63, 0x259, 0x4d, 0x259,
-0x68, 0x2e, 0x3b, 0x53, 0x259, 0x66, 0x2e, 0x3b, 0x52, 0x259, 0x62, 0x2e, 0x20, 0x49, 0x3b, 0x52, 0x259, 0x62, 0x2e, 0x20,
-0x49, 0x49, 0x3b, 0x43, 0x259, 0x6d, 0x2e, 0x20, 0x49, 0x3b, 0x43, 0x259, 0x6d, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x52, 0x259,
-0x63, 0x2e, 0x3b, 0x15e, 0x61, 0x62, 0x2e, 0x3b, 0x52, 0x61, 0x6d, 0x2e, 0x3b, 0x15e, 0x259, 0x76, 0x2e, 0x3b, 0x5a, 0x69,
-0x6c, 0x71, 0x2e, 0x3b, 0x5a, 0x69, 0x6c, 0x68, 0x2e, 0x9ae, 0x9b9, 0x9b0, 0x9b0, 0x9ae, 0x3b, 0x9b8, 0x9ab, 0x9b0, 0x3b, 0x9b0,
-0x9ac, 0x9bf, 0x989, 0x9b2, 0x20, 0x986, 0x989, 0x9af, 0x9bc, 0x9be, 0x9b2, 0x3b, 0x9b0, 0x9ac, 0x9bf, 0x989, 0x9b8, 0x20, 0x9b8, 0x9be,
-0x9a8, 0x9bf, 0x3b, 0x99c, 0x9ae, 0x9be, 0x9a6, 0x9bf, 0x989, 0x9b2, 0x20, 0x986, 0x989, 0x9af, 0x9bc, 0x9be, 0x9b2, 0x3b, 0x99c, 0x9ae,
-0x9be, 0x9a6, 0x9bf, 0x989, 0x9b8, 0x20, 0x9b8, 0x9be, 0x9a8, 0x9bf, 0x3b, 0x9b0, 0x99c, 0x9ac, 0x3b, 0x9b6, 0x9be, 0x2018, 0x9ac, 0x9be,
-0x9a8, 0x3b, 0x9b0, 0x9ae, 0x99c, 0x9be, 0x9a8, 0x3b, 0x9b6, 0x9be, 0x993, 0x9af, 0x9bc, 0x9be, 0x9b2, 0x3b, 0x99c, 0x9cd, 0x9ac, 0x9bf,
-0x9b2, 0x995, 0x9a6, 0x3b, 0x99c, 0x9cd, 0x9ac, 0x9bf, 0x9b2, 0x9b9, 0x99c, 0x9cd, 0x99c, 0x9e7, 0x3b, 0x9e8, 0x3b, 0x9e9, 0x3b, 0x9ea,
-0x3b, 0x9eb, 0x3b, 0x9ec, 0x3b, 0x9ed, 0x3b, 0x9ee, 0x3b, 0x9ef, 0x3b, 0x9e7, 0x9e6, 0x3b, 0x9e7, 0x9e7, 0x3b, 0x9e7, 0x9e8, 0x6d,
-0x75, 0x68, 0x61, 0x72, 0x65, 0x6d, 0x3b, 0x73, 0x61, 0x66, 0x65, 0x72, 0x3b, 0x72, 0x61, 0x62, 0x69, 0x2bb, 0x20, 0x69,
-0x3b, 0x72, 0x61, 0x62, 0x69, 0x2bb, 0x20, 0x69, 0x69, 0x3b, 0x64, 0x17e, 0x75, 0x6d, 0x61, 0x64, 0x65, 0x20, 0x69, 0x3b,
-0x64, 0x17e, 0x75, 0x6d, 0x61, 0x64, 0x65, 0x20, 0x69, 0x69, 0x3b, 0x72, 0x65, 0x64, 0x17e, 0x65, 0x62, 0x3b, 0x53, 0x68,
-0x61, 0x2bb, 0x62, 0x61, 0x6e, 0x3b, 0x72, 0x61, 0x6d, 0x61, 0x7a, 0x61, 0x6e, 0x3b, 0x161, 0x65, 0x76, 0x61, 0x6c, 0x3b,
-0x7a, 0x75, 0x6c, 0x2d, 0x6b, 0x61, 0x64, 0x65, 0x3b, 0x7a, 0x75, 0x6c, 0x2d, 0x68, 0x69, 0x64, 0x17e, 0x65, 0x6d, 0x75,
-0x68, 0x2e, 0x3b, 0x73, 0x61, 0x66, 0x2e, 0x3b, 0x52, 0x61, 0x62, 0x2e, 0x20, 0x49, 0x3b, 0x72, 0x61, 0x62, 0x2e, 0x20,
-0x69, 0x69, 0x3b, 0x64, 0x17e, 0x75, 0x6d, 0x2e, 0x20, 0x69, 0x3b, 0x64, 0x17e, 0x75, 0x6d, 0x2e, 0x20, 0x69, 0x69, 0x3b,
-0x72, 0x65, 0x64, 0x17e, 0x2e, 0x3b, 0x161, 0x61, 0x2e, 0x3b, 0x72, 0x61, 0x6d, 0x2e, 0x3b, 0x161, 0x65, 0x2e, 0x3b, 0x7a,
-0x75, 0x6c, 0x2d, 0x6b, 0x2e, 0x3b, 0x7a, 0x75, 0x6c, 0x2d, 0x68, 0x2e, 0x41c, 0x443, 0x445, 0x430, 0x440, 0x435, 0x43c, 0x3b,
-0x421, 0x430, 0x444, 0x435, 0x440, 0x3b, 0x420, 0x435, 0x431, 0x438, 0x20, 0x31, 0x3b, 0x420, 0x435, 0x431, 0x438, 0x20, 0x32, 0x3b,
-0x40f, 0x443, 0x43c, 0x430, 0x434, 0x435, 0x20, 0x31, 0x3b, 0x40f, 0x443, 0x43c, 0x430, 0x434, 0x435, 0x20, 0x32, 0x3b, 0x420, 0x435,
-0x45f, 0x435, 0x431, 0x3b, 0x428, 0x430, 0x2bb, 0x431, 0x430, 0x43d, 0x3b, 0x420, 0x430, 0x43c, 0x430, 0x437, 0x430, 0x43d, 0x3b, 0x428,
-0x435, 0x432, 0x430, 0x43b, 0x3b, 0x417, 0x443, 0x43b, 0x2d, 0x43a, 0x430, 0x434, 0x435, 0x3b, 0x417, 0x443, 0x43b, 0x2d, 0x445, 0x438,
-0x45f, 0x435, 0x41c, 0x443, 0x440, 0x430, 0x445, 0x430, 0x43c, 0x3b, 0x421, 0x430, 0x444, 0x430, 0x440, 0x3b, 0x420, 0x430, 0x431, 0x438,
-0x2bb, 0x20, 0x49, 0x3b, 0x420, 0x430, 0x431, 0x438, 0x2bb, 0x20, 0x49, 0x49, 0x3b, 0x408, 0x443, 0x43c, 0x430, 0x434, 0x430, 0x20,
-0x49, 0x3b, 0x408, 0x443, 0x43c, 0x430, 0x434, 0x430, 0x20, 0x49, 0x49, 0x3b, 0x420, 0x430, 0x452, 0x430, 0x431, 0x3b, 0x428, 0x430,
-0x2bb, 0x431, 0x430, 0x43d, 0x3b, 0x420, 0x430, 0x43c, 0x430, 0x434, 0x430, 0x43d, 0x3b, 0x428, 0x430, 0x432, 0x430, 0x43b, 0x3b, 0x414,
-0x443, 0x2bb, 0x43b, 0x2d, 0x41a, 0x438, 0x2bb, 0x434, 0x430, 0x3b, 0x414, 0x443, 0x2bb, 0x43b, 0x2d, 0x445, 0x438, 0x452, 0x430, 0x41c,
-0x443, 0x445, 0x2e, 0x3b, 0x421, 0x430, 0x444, 0x2e, 0x3b, 0x420, 0x435, 0x431, 0x2e, 0x20, 0x31, 0x3b, 0x420, 0x435, 0x431, 0x2e,
-0x20, 0x32, 0x3b, 0x40f, 0x443, 0x43c, 0x2e, 0x20, 0x31, 0x3b, 0x40f, 0x443, 0x43c, 0x2e, 0x20, 0x32, 0x3b, 0x420, 0x435, 0x45f,
-0x2e, 0x3b, 0x428, 0x430, 0x2e, 0x3b, 0x420, 0x430, 0x43c, 0x2e, 0x3b, 0x428, 0x435, 0x2e, 0x3b, 0x417, 0x443, 0x43b, 0x2d, 0x43a,
-0x2e, 0x3b, 0x417, 0x443, 0x43b, 0x2d, 0x445, 0x2e, 0x43c, 0x443, 0x445, 0x430, 0x440, 0x430, 0x43c, 0x3b, 0x441, 0x430, 0x444, 0x430,
-0x440, 0x3b, 0x440, 0x430, 0x431, 0x438, 0x2d, 0x31, 0x3b, 0x440, 0x430, 0x431, 0x438, 0x2d, 0x32, 0x3b, 0x434, 0x436, 0x443, 0x43c,
-0x430, 0x434, 0x430, 0x2d, 0x31, 0x3b, 0x434, 0x436, 0x443, 0x43c, 0x430, 0x434, 0x430, 0x2d, 0x32, 0x3b, 0x440, 0x430, 0x434, 0x436,
-0x430, 0x431, 0x3b, 0x448, 0x430, 0x431, 0x430, 0x43d, 0x3b, 0x440, 0x430, 0x43c, 0x430, 0x437, 0x430, 0x43d, 0x3b, 0x428, 0x430, 0x432,
-0x430, 0x43b, 0x3b, 0x414, 0x445, 0x443, 0x43b, 0x2d, 0x41a, 0x430, 0x430, 0x434, 0x430, 0x3b, 0x414, 0x445, 0x443, 0x43b, 0x2d, 0x445,
-0x438, 0x434, 0x436, 0x430, 0x7a46, 0x54c8, 0x862d, 0x59c6, 0x6708, 0x3b, 0x8272, 0x6cd5, 0x723e, 0x6708, 0x3b, 0x8cf4, 0x6bd4, 0x6708, 0x20, 0x49,
-0x3b, 0x8cf4, 0x6bd4, 0x6708, 0x20, 0x49, 0x49, 0x3b, 0x4e3b, 0x99ac, 0x9054, 0x6708, 0x20, 0x49, 0x3b, 0x4e3b, 0x99ac, 0x9054, 0x6708, 0x20,
-0x49, 0x49, 0x3b, 0x8cf4, 0x54f2, 0x535c, 0x6708, 0x3b, 0x820d, 0x723e, 0x90a6, 0x6708, 0x3b, 0x8cf4, 0x8cb7, 0x4e39, 0x6708, 0x3b, 0x9583, 0x74e6,
-0x9b6f, 0x6708, 0x3b, 0x90fd, 0x723e, 0x5580, 0x723e, 0x5fb7, 0x6708, 0x3b, 0x90fd, 0x723e, 0x9ed1, 0x54f2, 0x6708, 0x7a46, 0x54c8, 0x5170, 0x59c6, 0x6708,
-0x3b, 0x8272, 0x6cd5, 0x5c14, 0x6708, 0x3b, 0x8d56, 0x6bd4, 0x6708, 0x20, 0x49, 0x3b, 0x8d56, 0x6bd4, 0x6708, 0x20, 0x49, 0x49, 0x3b, 0x4e3b,
-0x9a6c, 0x8fbe, 0x6708, 0x20, 0x49, 0x3b, 0x4e3b, 0x9a6c, 0x8fbe, 0x6708, 0x20, 0x49, 0x49, 0x3b, 0x8d56, 0x54f2, 0x535c, 0x6708, 0x3b, 0x820d,
-0x5c14, 0x90a6, 0x6708, 0x3b, 0x8d56, 0x4e70, 0x4e39, 0x6708, 0x3b, 0x95ea, 0x74e6, 0x9c81, 0x6708, 0x3b, 0x90fd, 0x5c14, 0x5580, 0x5c14, 0x5fb7, 0x6708,
-0x3b, 0x90fd, 0x5c14, 0x9ed1, 0x54f2, 0x6708, 0xd804, 0xdd1f, 0xd804, 0xdd27, 0xd804, 0xdd26, 0xd804, 0xdd27, 0xd804, 0xdd22, 0xd804, 0xdd27, 0xd804, 0xdd1f,
-0xd804, 0xdd34, 0x3b, 0xd804, 0xdd25, 0xd804, 0xdd27, 0xd804, 0xdd1c, 0xd804, 0xdd22, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd22, 0xd804, 0xdd27, 0xd804, 0xdd1d,
-0xd804, 0xdd28, 0xd804, 0xdd05, 0xd804, 0xdd23, 0xd804, 0xdd34, 0x20, 0xd804, 0xdd03, 0xd804, 0xdd03, 0xd804, 0xdd2a, 0xd804, 0xdd20, 0xd804, 0xdd23, 0xd804,
-0xdd34, 0x3b, 0xd804, 0xdd22, 0xd804, 0xdd27, 0xd804, 0xdd1d, 0xd804, 0xdd28, 0xd804, 0xdd05, 0xd804, 0xdd25, 0xd804, 0xdd34, 0x20, 0xd804, 0xdd25, 0xd804,
-0xdd1a, 0xd804, 0xdd28, 0x3b, 0xd804, 0xdd0e, 0xd804, 0xdd27, 0xd804, 0xdd1f, 0xd804, 0xdd18, 0xd804, 0xdd28, 0xd804, 0xdd05, 0xd804, 0xdd23, 0xd804, 0xdd34,
-0x20, 0xd804, 0xdd03, 0xd804, 0xdd03, 0xd804, 0xdd2a, 0xd804, 0xdd20, 0xd804, 0xdd23, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd0e, 0xd804, 0xdd27, 0xd804, 0xdd1f,
-0xd804, 0xdd18, 0xd804, 0xdd28, 0xd804, 0xdd05, 0xd804, 0xdd0c, 0xd804, 0xdd34, 0x20, 0xd804, 0xdd25, 0xd804, 0xdd1a, 0xd804, 0xdd28, 0x3b, 0xd804, 0xdd22,
-0xd804, 0xdd27, 0xd804, 0xdd0e, 0xd804, 0xdd27, 0xd804, 0xdd1d, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd25, 0xd804, 0xdd33, 0xd804, 0xdd03, 0xd804, 0xdd1d, 0xd804,
-0xdd27, 0xd804, 0xdd1a, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd22, 0xd804, 0xdd27, 0xd804, 0xdd1f, 0xd804, 0xdd34, 0xd804, 0xdd0e, 0xd804, 0xdd1a, 0xd804, 0xdd34,
-0x3b, 0xd804, 0xdd25, 0xd804, 0xdd24, 0xd804, 0xdd23, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd0e, 0xd804, 0xdd28, 0xd804, 0xdd23, 0xd804, 0xdd34, 0xd804, 0xdd07,
-0xd804, 0xdd27, 0xd804, 0xdd18, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd0e, 0xd804, 0xdd28, 0xd804, 0xdd23, 0xd804, 0xdd34, 0xd804, 0xdd26, 0xd804, 0xdd27, 0xd804,
-0xdd0e, 0xd804, 0xdd34, 0xd804, 0xdd0e, 0xd804, 0xdd27, 0xd804, 0xdd37, 0x3b, 0xd804, 0xdd38, 0x3b, 0xd804, 0xdd39, 0x3b, 0xd804, 0xdd3a, 0x3b, 0xd804,
-0xdd3b, 0x3b, 0xd804, 0xdd3c, 0x3b, 0xd804, 0xdd3d, 0x3b, 0xd804, 0xdd3e, 0x3b, 0xd804, 0xdd3f, 0x3b, 0xd804, 0xdd37, 0xd804, 0xdd36, 0x3b, 0xd804,
-0xdd37, 0xd804, 0xdd37, 0x3b, 0xd804, 0xdd37, 0xd804, 0xdd38, 0x4e00, 0x6708, 0x3b, 0x4e8c, 0x6708, 0x3b, 0x4e09, 0x6708, 0x3b, 0x56db, 0x6708, 0x3b,
-0x4e94, 0x6708, 0x3b, 0x516d, 0x6708, 0x3b, 0x4e03, 0x6708, 0x3b, 0x516b, 0x6708, 0x3b, 0x4e5d, 0x6708, 0x3b, 0x5341, 0x6708, 0x3b, 0x5341, 0x4e00,
-0x6708, 0x3b, 0x5341, 0x4e8c, 0x6708, 0x31, 0x6708, 0x3b, 0x32, 0x6708, 0x3b, 0x33, 0x6708, 0x3b, 0x34, 0x6708, 0x3b, 0x35, 0x6708, 0x3b,
-0x36, 0x6708, 0x3b, 0x37, 0x6708, 0x3b, 0x38, 0x6708, 0x3b, 0x39, 0x6708, 0x3b, 0x31, 0x30, 0x6708, 0x3b, 0x31, 0x31, 0x6708, 0x3b,
-0x31, 0x32, 0x6708, 0x31, 0x2e, 0x3b, 0x32, 0x2e, 0x3b, 0x33, 0x2e, 0x3b, 0x34, 0x2e, 0x3b, 0x35, 0x2e, 0x3b, 0x36, 0x2e,
-0x3b, 0x37, 0x2e, 0x3b, 0x38, 0x2e, 0x3b, 0x39, 0x2e, 0x3b, 0x31, 0x30, 0x2e, 0x3b, 0x31, 0x31, 0x2e, 0x3b, 0x31, 0x32,
-0x2e, 0x6d, 0x75, 0x68, 0x61, 0x72, 0x72, 0x65, 0x6d, 0x3b, 0x73, 0x61, 0x66, 0x61, 0x72, 0x3b, 0x72, 0x65, 0x62, 0xed,
-0x2019, 0x75, 0x20, 0x6c, 0x2d, 0x61, 0x77, 0x77, 0x61, 0x6c, 0x3b, 0x72, 0x65, 0x62, 0xed, 0x2019, 0x75, 0x20, 0x73, 0x2d,
-0x73, 0xe1, 0x6e, 0xed, 0x3b, 0x64, 0x17e, 0x75, 0x6d, 0xe1, 0x64, 0xe1, 0x20, 0x61, 0x6c, 0x2d, 0xfa, 0x6c, 0xe1, 0x3b,
-0x64, 0x17e, 0x75, 0x6d, 0xe1, 0x64, 0xe1, 0x20, 0x61, 0x6c, 0x2d, 0xe1, 0x63, 0x68, 0x69, 0x72, 0x61, 0x3b, 0x72, 0x65,
-0x64, 0x17e, 0x65, 0x62, 0x3b, 0x161, 0x61, 0x2019, 0x62, 0xe1, 0x6e, 0x3b, 0x72, 0x61, 0x6d, 0x61, 0x64, 0xe1, 0x6e, 0x3b,
-0x161, 0x61, 0x77, 0x77, 0x61, 0x6c, 0x3b, 0x7a, 0xfa, 0x20, 0x6c, 0x2d, 0x6b, 0x61, 0x2019, 0x64, 0x61, 0x3b, 0x7a, 0xfa,
-0x20, 0x6c, 0x2d, 0x68, 0x69, 0x64, 0x17e, 0x64, 0x17e, 0x61, 0x6d, 0x75, 0x68, 0x2e, 0x3b, 0x73, 0x61, 0x66, 0x2e, 0x3b,
-0x72, 0x65, 0x62, 0x2e, 0x20, 0x49, 0x3b, 0x72, 0x65, 0x62, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x64, 0x17e, 0x75, 0x6d, 0x2e,
-0x20, 0x49, 0x3b, 0x64, 0x17e, 0x75, 0x6d, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x72, 0x65, 0x64, 0x2e, 0x3b, 0x161, 0x61, 0x2e,
-0x3b, 0x72, 0x61, 0x6d, 0x2e, 0x3b, 0x161, 0x61, 0x77, 0x2e, 0x3b, 0x7a, 0xfa, 0x20, 0x6c, 0x2d, 0x6b, 0x2e, 0x3b, 0x7a,
-0xfa, 0x20, 0x6c, 0x2d, 0x68, 0x2e, 0x6d, 0x75, 0x68, 0x61, 0x72, 0x72, 0x61, 0x6d, 0x3b, 0x73, 0x61, 0x66, 0x61, 0x72,
-0x3b, 0x72, 0x61, 0x62, 0x69, 0x2bb, 0x20, 0x49, 0x3b, 0x72, 0x61, 0x62, 0x69, 0x2bb, 0x20, 0x49, 0x49, 0x3b, 0x6a, 0x75,
-0x6d, 0x61, 0x64, 0x61, 0x20, 0x49, 0x3b, 0x6a, 0x75, 0x6d, 0x61, 0x64, 0x61, 0x20, 0x49, 0x49, 0x3b, 0x72, 0x61, 0x6a,
-0x61, 0x62, 0x3b, 0x73, 0x68, 0x61, 0x2bb, 0x62, 0x61, 0x6e, 0x3b, 0x72, 0x61, 0x6d, 0x61, 0x64, 0x61, 0x6e, 0x3b, 0x73,
-0x68, 0x61, 0x77, 0x77, 0x61, 0x6c, 0x3b, 0x64, 0x68, 0x75, 0x2bb, 0x6c, 0x2d, 0x51, 0x69, 0x2bb, 0x64, 0x61, 0x68, 0x3b,
-0x64, 0x68, 0x75, 0x2bb, 0x6c, 0x2d, 0x48, 0x69, 0x6a, 0x6a, 0x61, 0x68, 0x4d, 0x6f, 0x65, 0x68, 0x61, 0x72, 0x72, 0x61,
-0x6d, 0x3b, 0x53, 0x61, 0x66, 0x61, 0x72, 0x3b, 0x52, 0x61, 0x62, 0x69, 0x2bb, 0x61, 0x20, 0x61, 0x6c, 0x20, 0x61, 0x77,
-0x61, 0x6c, 0x3b, 0x52, 0x61, 0x62, 0x69, 0x2bb, 0x61, 0x20, 0x61, 0x6c, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x69, 0x3b, 0x4a,
-0x6f, 0x65, 0x6d, 0x61, 0x64, 0x2bb, 0x61, 0x6c, 0x20, 0x61, 0x77, 0x61, 0x6c, 0x3b, 0x4a, 0x6f, 0x65, 0x6d, 0x61, 0x64,
-0x2bb, 0x61, 0x6c, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x69, 0x3b, 0x52, 0x61, 0x6a, 0x61, 0x62, 0x3b, 0x53, 0x6a, 0x61, 0x2bb,
-0x61, 0x62, 0x61, 0x6e, 0x3b, 0x52, 0x61, 0x6d, 0x61, 0x64, 0x61, 0x6e, 0x3b, 0x53, 0x6a, 0x61, 0x77, 0x61, 0x6c, 0x3b,
-0x44, 0x6f, 0x65, 0x20, 0x61, 0x6c, 0x20, 0x6b, 0x61, 0x2bb, 0x61, 0x62, 0x61, 0x3b, 0x44, 0x6f, 0x65, 0x20, 0x61, 0x6c,
-0x20, 0x68, 0x69, 0x7a, 0x6a, 0x61, 0x4d, 0x6f, 0x65, 0x68, 0x2e, 0x3b, 0x53, 0x61, 0x66, 0x2e, 0x3b, 0x52, 0x61, 0x62,
-0x2e, 0x20, 0x49, 0x3b, 0x52, 0x61, 0x62, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x4a, 0x6f, 0x65, 0x6d, 0x2e, 0x20, 0x49, 0x3b,
-0x4a, 0x6f, 0x65, 0x6d, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x52, 0x61, 0x6a, 0x2e, 0x3b, 0x53, 0x6a, 0x61, 0x2e, 0x3b, 0x52,
-0x61, 0x6d, 0x2e, 0x3b, 0x53, 0x6a, 0x61, 0x77, 0x2e, 0x3b, 0x44, 0x6f, 0x65, 0x20, 0x61, 0x6c, 0x20, 0x6b, 0x2e, 0x3b,
-0x44, 0x6f, 0x65, 0x20, 0x61, 0x6c, 0x20, 0x68, 0x2e, 0x64, 0x7a, 0x6f, 0x76, 0x65, 0x3b, 0x64, 0x7a, 0x6f, 0x64, 0x7a,
-0x65, 0x3b, 0x74, 0x65, 0x64, 0x6f, 0x78, 0x65, 0x3b, 0x61, 0x66, 0x254, 0x66, 0x69, 0x1ebd, 0x3b, 0x64, 0x61, 0x6d, 0x25b,
-0x3b, 0x6d, 0x61, 0x73, 0x61, 0x3b, 0x73, 0x69, 0x61, 0x6d, 0x6c, 0x254, 0x6d, 0x3b, 0x64, 0x65, 0x61, 0x73, 0x69, 0x61,
-0x6d, 0x69, 0x6d, 0x65, 0x3b, 0x61, 0x6e, 0x79, 0x254, 0x6e, 0x79, 0x254, 0x3b, 0x6b, 0x65, 0x6c, 0x65, 0x3b, 0x61, 0x64,
-0x65, 0x25b, 0x6d, 0x65, 0x6b, 0x70, 0x254, 0x78, 0x65, 0x3b, 0x64, 0x7a, 0x6f, 0x6d, 0x65, 0x64, 0x7a, 0x76, 0x3b, 0x64,
-0x7a, 0x64, 0x3b, 0x74, 0x65, 0x64, 0x3b, 0x61, 0x66, 0x254, 0x3b, 0x64, 0x61, 0x6d, 0x3b, 0x6d, 0x61, 0x73, 0x3b, 0x73,
-0x69, 0x61, 0x3b, 0x64, 0x65, 0x61, 0x3b, 0x61, 0x6e, 0x79, 0x3b, 0x6b, 0x65, 0x6c, 0x3b, 0x61, 0x64, 0x65, 0x3b, 0x64,
-0x7a, 0x6d, 0x6d, 0x75, 0x68, 0x61, 0x72, 0x72, 0x61, 0x6d, 0x3b, 0x73, 0x61, 0x66, 0x61, 0x72, 0x3b, 0x72, 0x61, 0x62,
-0x69, 0x2019, 0x20, 0x61, 0x6c, 0x2d, 0x61, 0x77, 0x77, 0x61, 0x6c, 0x3b, 0x72, 0x61, 0x62, 0x69, 0x2019, 0x20, 0x61, 0x6c,
-0x2d, 0x61, 0x6b, 0x68, 0x69, 0x72, 0x3b, 0x64, 0x17e, 0x75, 0x6d, 0x61, 0x64, 0x61, 0x2d, 0x6c, 0x2d, 0x75, 0x6c, 0x61,
-0x3b, 0x64, 0x17e, 0x75, 0x6d, 0x61, 0x64, 0x61, 0x2d, 0x6c, 0x2d, 0x61, 0x6b, 0x68, 0x69, 0x72, 0x61, 0x3b, 0x72, 0x61,
-0x64, 0x17e, 0x61, 0x62, 0x3b, 0x161, 0x61, 0x2019, 0x62, 0x61, 0x6e, 0x3b, 0x72, 0x61, 0x6d, 0x61, 0x64, 0x61, 0x6e, 0x3b,
-0x161, 0x61, 0x77, 0x77, 0x61, 0x6c, 0x3b, 0x64, 0x68, 0x75, 0x2d, 0x6c, 0x2d, 0x71, 0x61, 0x2019, 0x64, 0x61, 0x3b, 0x64,
-0x68, 0x75, 0x2d, 0x6c, 0x2d, 0x68, 0x69, 0x64, 0x64, 0x17e, 0x61, 0x6d, 0x6f, 0x75, 0x68, 0x61, 0x72, 0x72, 0x61, 0x6d,
-0x3b, 0x73, 0x61, 0x66, 0x61, 0x72, 0x3b, 0x72, 0x61, 0x62, 0x69, 0x61, 0x20, 0x61, 0x6c, 0x20, 0x61, 0x77, 0x61, 0x6c,
-0x3b, 0x72, 0x61, 0x62, 0x69, 0x61, 0x20, 0x61, 0x74, 0x68, 0x2d, 0x74, 0x68, 0x61, 0x6e, 0x69, 0x3b, 0x6a, 0x6f, 0x75,
-0x6d, 0x61, 0x64, 0x61, 0x20, 0x61, 0x6c, 0x20, 0x6f, 0x75, 0x6c, 0x61, 0x3b, 0x6a, 0x6f, 0x75, 0x6d, 0x61, 0x64, 0x61,
-0x20, 0x61, 0x74, 0x68, 0x2d, 0x74, 0x68, 0x61, 0x6e, 0x69, 0x61, 0x3b, 0x72, 0x61, 0x6a, 0x61, 0x62, 0x3b, 0x63, 0x68,
-0x61, 0x61, 0x62, 0x61, 0x6e, 0x65, 0x3b, 0x72, 0x61, 0x6d, 0x61, 0x64, 0x61, 0x6e, 0x3b, 0x63, 0x68, 0x61, 0x77, 0x77,
-0x61, 0x6c, 0x3b, 0x64, 0x68, 0x6f, 0x75, 0x20, 0x61, 0x6c, 0x20, 0x71, 0x69, 0x60, 0x64, 0x61, 0x3b, 0x64, 0x68, 0x6f,
-0x75, 0x20, 0x61, 0x6c, 0x2d, 0x68, 0x69, 0x6a, 0x6a, 0x61, 0x6d, 0x6f, 0x75, 0x68, 0x2e, 0x3b, 0x73, 0x61, 0x66, 0x2e,
-0x3b, 0x72, 0x61, 0x62, 0x2e, 0x20, 0x61, 0x77, 0x2e, 0x3b, 0x72, 0x61, 0x62, 0x2e, 0x20, 0x74, 0x68, 0x2e, 0x3b, 0x6a,
-0x6f, 0x75, 0x6d, 0x2e, 0x20, 0x6f, 0x75, 0x2e, 0x3b, 0x6a, 0x6f, 0x75, 0x6d, 0x2e, 0x20, 0x74, 0x68, 0x2e, 0x3b, 0x72,
-0x61, 0x6a, 0x2e, 0x3b, 0x63, 0x68, 0x61, 0x61, 0x2e, 0x3b, 0x72, 0x61, 0x6d, 0x2e, 0x3b, 0x63, 0x68, 0x61, 0x77, 0x2e,
-0x3b, 0x64, 0x68, 0x6f, 0x75, 0x2e, 0x20, 0x71, 0x69, 0x2e, 0x3b, 0x64, 0x68, 0x6f, 0x75, 0x2e, 0x20, 0x68, 0x69, 0x2e,
-0x6d, 0x6f, 0x75, 0x68, 0x2e, 0x3b, 0x73, 0x61, 0x66, 0x2e, 0x3b, 0x72, 0x61, 0x62, 0x2e, 0x20, 0x61, 0x77, 0x2e, 0x3b,
-0x72, 0x61, 0x62, 0x2e, 0x20, 0x74, 0x68, 0x2e, 0x3b, 0x6a, 0x6f, 0x75, 0x6d, 0x2e, 0x20, 0x6f, 0x75, 0x6c, 0x2e, 0x3b,
-0x6a, 0x6f, 0x75, 0x6d, 0x2e, 0x20, 0x74, 0x68, 0x61, 0x2e, 0x3b, 0x72, 0x61, 0x6a, 0x2e, 0x3b, 0x63, 0x68, 0x61, 0x61,
-0x2e, 0x3b, 0x72, 0x61, 0x6d, 0x2e, 0x3b, 0x63, 0x68, 0x61, 0x77, 0x2e, 0x3b, 0x64, 0x68, 0x6f, 0x75, 0x2e, 0x20, 0x71,
-0x2e, 0x3b, 0x64, 0x68, 0x6f, 0x75, 0x2e, 0x20, 0x68, 0x2e, 0xd83a, 0xdd14, 0xd83a, 0xdd2e, 0xd83a, 0xdd25, 0xd83a, 0xdd26, 0xd83a, 0xdd2b,
-0xd83a, 0xdd32, 0xd83a, 0xdd3c, 0xd83a, 0xdd2b, 0x3b, 0xd83a, 0xdd05, 0xd83a, 0xdd22, 0xd83a, 0xdd26, 0xd83a, 0xdd46, 0xd83a, 0xdd2e, 0xd83a, 0xdd2a, 0xd83a,
-0xdd23, 0xd83a, 0xdd35, 0x2d, 0xd83a, 0xdd06, 0xd83a, 0xdd22, 0xd83a, 0xdd2a, 0xd83a, 0xdd22, 0xd83a, 0xdd32, 0x3b, 0xd83a, 0xdd06, 0xd83a, 0xdd22, 0xd83a,
-0xdd2a, 0xd83a, 0xdd22, 0xd83a, 0xdd32, 0x3b, 0xd83a, 0xdd03, 0xd83a, 0xdd2d, 0xd83a, 0xdd25, 0xd83a, 0xdd28, 0xd83a, 0xdd22, 0xd83a, 0xdd2a, 0xd83a, 0xdd22,
-0xd83a, 0xdd32, 0x3b, 0xd83a, 0xdd04, 0xd83a, 0xdd22, 0xd83a, 0xdd28, 0xd83a, 0xdd46, 0xd83a, 0xdd22, 0xd83a, 0xdd2a, 0xd83a, 0xdd22, 0xd83a, 0xdd32, 0x3b,
-0xd83a, 0xdd05, 0xd83a, 0xdd22, 0xd83a, 0xdd26, 0xd83a, 0xdd46, 0xd83a, 0xdd2e, 0xd83a, 0xdd2a, 0xd83a, 0xdd23, 0xd83a, 0xdd35, 0x2d, 0xd83a, 0xdd08, 0xd83a,
-0xdd22, 0xd83a, 0xdd44, 0xd83a, 0xdd36, 0xd83a, 0xdd2d, 0xd83a, 0xdd26, 0xd83a, 0xdd2d, 0x3b, 0xd83a, 0xdd08, 0xd83a, 0xdd22, 0xd83a, 0xdd44, 0xd83a, 0xdd36,
-0xd83a, 0xdd2d, 0xd83a, 0xdd26, 0xd83a, 0xdd2d, 0x3b, 0xd83a, 0xdd05, 0xd83a, 0xdd22, 0xd83a, 0xdd26, 0xd83a, 0xdd46, 0xd83a, 0xdd2e, 0xd83a, 0xdd2a, 0xd83a,
-0xdd23, 0xd83a, 0xdd35, 0x2d, 0xd83a, 0xdd05, 0xd83a, 0xdd35, 0xd83a, 0xdd45, 0xd83a, 0xdd25, 0xd83a, 0xdd22, 0xd83a, 0xdd34, 0xd83a, 0xdd2b, 0xd83a, 0xdd45,
-0x3b, 0xd83a, 0xdd05, 0xd83a, 0xdd35, 0xd83a, 0xdd45, 0xd83a, 0xdd25, 0xd83a, 0xdd22, 0xd83a, 0xdd34, 0xd83a, 0xdd2b, 0xd83a, 0xdd45, 0x3b, 0xd83a, 0xdd14,
-0xd83a, 0xdd35, 0xd83a, 0xdd45, 0xd83a, 0xdd24, 0xd83a, 0xdd23, 0xd83a, 0xdd22, 0xd83a, 0xdd44, 0xd83a, 0xdd32, 0xd83a, 0xdd4b, 0xd83a, 0xdd23, 0xd83a, 0xdd35,
-0x3b, 0xd83a, 0xdd05, 0xd83a, 0xdd22, 0xd83a, 0xdd26, 0xd83a, 0xdd46, 0xd83a, 0xdd2e, 0xd83a, 0xdd2a, 0xd83a, 0xdd23, 0xd83a, 0xdd35, 0x2d, 0xd83a, 0xdd01,
-0xd83a, 0xdd2e, 0xd83a, 0xdd32, 0xd83a, 0xdd33, 0xd83a, 0xdd2d, 0xd83a, 0xdd32, 0x3b, 0xd83a, 0xdd01, 0xd83a, 0xdd35, 0xd83a, 0xdd32, 0xd83a, 0xdd33, 0xd83a,
-0xdd2d, 0xd83a, 0xdd32, 0xd83a, 0xdd14, 0xd83a, 0xdd2e, 0xd83a, 0xdd26, 0x2e, 0x3b, 0xd83a, 0xdd05, 0xd83a, 0xdd22, 0xd83a, 0xdd28, 0x2e, 0x3b, 0xd83a,
-0xdd06, 0xd83a, 0xdd22, 0xd83a, 0xdd2a, 0x2e, 0x3b, 0xd83a, 0xdd03, 0xd83a, 0xdd2d, 0xd83a, 0xdd28, 0x2e, 0x3b, 0xd83a, 0xdd04, 0xd83a, 0xdd22, 0xd83a,
-0xdd28, 0x2e, 0x3b, 0xd83a, 0xdd05, 0xd83a, 0xdd22, 0xd83a, 0xdd2a, 0x2e, 0x3b, 0xd83a, 0xdd08, 0xd83a, 0xdd22, 0xd83a, 0xdd36, 0x2e, 0x3b, 0xd83a,
-0xdd05, 0xd83a, 0xdd22, 0xd83a, 0xdd27, 0x2e, 0x3b, 0xd83a, 0xdd05, 0xd83a, 0xdd35, 0xd83a, 0xdd25, 0x2e, 0x3b, 0xd83a, 0xdd14, 0xd83a, 0xdd35, 0xd83a,
-0xdd24, 0x2e, 0x3b, 0xd83a, 0xdd05, 0xd83a, 0xdd22, 0xd83a, 0xdd23, 0x2e, 0x3b, 0xd83a, 0xdd01, 0xd83a, 0xdd2e, 0xd83a, 0xdd32, 0x2e, 0xd83a, 0xdd51,
-0x3b, 0xd83a, 0xdd52, 0x3b, 0xd83a, 0xdd53, 0x3b, 0xd83a, 0xdd54, 0x3b, 0xd83a, 0xdd55, 0x3b, 0xd83a, 0xdd56, 0x3b, 0xd83a, 0xdd57, 0x3b, 0xd83a,
-0xdd58, 0x3b, 0xd83a, 0xdd59, 0x3b, 0xd83a, 0xdd51, 0xd83a, 0xdd50, 0x3b, 0xd83a, 0xdd51, 0xd83a, 0xdd51, 0x3b, 0xd83a, 0xdd51, 0xd83a, 0xdd52, 0x10db,
-0x10e3, 0x10f0, 0x10d0, 0x10e0, 0x10d0, 0x10db, 0x10d8, 0x3b, 0x10e1, 0x10d0, 0x10e4, 0x10d0, 0x10e0, 0x10d8, 0x3b, 0x10e0, 0x10d0, 0x10d1, 0x10d8, 0x20,
-0x10e3, 0x10da, 0x2d, 0x10d0, 0x10d5, 0x10d0, 0x10da, 0x10d8, 0x3b, 0x10e0, 0x10d0, 0x10d1, 0x10d8, 0x20, 0x10e3, 0x10da, 0x2d, 0x10d0, 0x10ee, 0x10d8,
-0x10e0, 0x10d8, 0x3b, 0x10ef, 0x10e3, 0x10db, 0x10d0, 0x10d3, 0x10d0, 0x20, 0x10e3, 0x10da, 0x2d, 0x10d0, 0x10d5, 0x10d0, 0x10da, 0x10d8, 0x3b, 0x10ef,
-0x10e3, 0x10db, 0x10d0, 0x10d3, 0x10d0, 0x20, 0x10e3, 0x10da, 0x2d, 0x10d0, 0x10ee, 0x10d8, 0x10e0, 0x10d8, 0x3b, 0x10e0, 0x10d0, 0x10ef, 0x10d0, 0x10d1,
-0x10d8, 0x3b, 0x10e8, 0x10d0, 0x10d1, 0x10d0, 0x10dc, 0x10d8, 0x3b, 0x10e0, 0x10d0, 0x10db, 0x10d0, 0x10d3, 0x10d0, 0x10dc, 0x10d8, 0x3b, 0x10e8, 0x10d0,
-0x10d5, 0x10d0, 0x10da, 0x10d8, 0x3b, 0x10d6, 0x10e3, 0x10da, 0x2d, 0x10d9, 0x10d0, 0x10d0, 0x10d3, 0x10d0, 0x3b, 0x10d6, 0x10e3, 0x10da, 0x2d, 0x10f0,
-0x10d8, 0x10ef, 0x10d0, 0x10db, 0x10e3, 0x10f0, 0x2e, 0x3b, 0x10e1, 0x10d0, 0x10e4, 0x2e, 0x3b, 0x10e0, 0x10d0, 0x10d1, 0x2e, 0x20, 0x49, 0x3b,
-0x10e0, 0x10d0, 0x10d1, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x10ef, 0x10e3, 0x10db, 0x2e, 0x20, 0x49, 0x3b, 0x10ef, 0x10e3, 0x10db, 0x2e, 0x20,
-0x49, 0x49, 0x3b, 0x10e0, 0x10d0, 0x10ef, 0x2e, 0x3b, 0x10e8, 0x10d0, 0x10d1, 0x2e, 0x3b, 0x10e0, 0x10d0, 0x10db, 0x2e, 0x3b, 0x10e8, 0x10d0,
-0x10d5, 0x2e, 0x3b, 0x10d6, 0x10e3, 0x10da, 0x2d, 0x10d9, 0x2e, 0x3b, 0x10d6, 0x10e3, 0x10da, 0x2d, 0x10f0, 0x2e, 0x4d, 0x75, 0x68, 0x61,
-0x72, 0x72, 0x61, 0x6d, 0x3b, 0x53, 0x61, 0x66, 0x61, 0x72, 0x3b, 0x52, 0x61, 0x62, 0x69, 0x2bb, 0x20, 0x49, 0x3b, 0x52,
-0x61, 0x62, 0x69, 0x2bb, 0x20, 0x49, 0x49, 0x3b, 0x44, 0x73, 0x63, 0x68, 0x75, 0x6d, 0x61, 0x64, 0x61, 0x20, 0x49, 0x3b,
-0x44, 0x73, 0x63, 0x68, 0x75, 0x6d, 0x61, 0x64, 0x61, 0x20, 0x49, 0x49, 0x3b, 0x52, 0x61, 0x64, 0x73, 0x63, 0x68, 0x61,
-0x62, 0x3b, 0x53, 0x68, 0x61, 0x2bb, 0x62, 0x61, 0x6e, 0x3b, 0x52, 0x61, 0x6d, 0x61, 0x64, 0x61, 0x6e, 0x3b, 0x53, 0x68,
-0x61, 0x77, 0x77, 0x61, 0x6c, 0x3b, 0x44, 0x68, 0x75, 0x20, 0x6c, 0x2d, 0x71, 0x61, 0x2bf, 0x64, 0x61, 0x3b, 0x44, 0x68,
-0x75, 0x20, 0x6c, 0x2d, 0x48, 0x69, 0x64, 0x64, 0x73, 0x63, 0x68, 0x61, 0xaae, 0xac1, 0xab9, 0xab0, 0xacd, 0xab0, 0xaae, 0x3b,
-0xab8, 0xaab, 0xab0, 0x3b, 0xab0, 0xabe, 0xaac, 0xac0, 0x2bb, 0x20, 0x49, 0x3b, 0xab0, 0xabe, 0xaac, 0xac0, 0x2bb, 0x20, 0x49, 0x49,
-0x3b, 0xa9c, 0xac1, 0xaae, 0xabe, 0xaa6, 0xabe, 0x20, 0x49, 0x3b, 0xa9c, 0xac1, 0xaae, 0xabe, 0xaa6, 0xabe, 0x20, 0x49, 0x49, 0x3b,
-0xab0, 0xa9c, 0xaac, 0x3b, 0xab6, 0xabe, 0x2bb, 0xaac, 0xabe, 0xaa8, 0x3b, 0xab0, 0xaae, 0xaa6, 0xabe, 0xaa8, 0x3b, 0xab6, 0xabe, 0xab5,
-0xacd, 0xab5, 0xab2, 0x3b, 0xaa7, 0xac1, 0x2bb, 0xab2, 0x2d, 0xa95, 0xacd, 0xab5, 0xac0, 0x2bb, 0xaa1, 0xabe, 0xab9, 0x3b, 0xaa7, 0xac1,
-0x2bb, 0xab2, 0x2d, 0xab9, 0xabf, 0xa9c, 0xacd, 0xa9c, 0xabe, 0xab9, 0xaae, 0xac1, 0xab9, 0x2e, 0x3b, 0xab8, 0xaab, 0x2e, 0x3b, 0xab0,
-0xaac, 0x2e, 0x49, 0x3b, 0xab0, 0xaac, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0xa9c, 0xac1, 0xaae, 0x2e, 0x20, 0x49, 0x3b, 0xa9c, 0xac1,
-0xaae, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0xab0, 0xabe, 0xa9c, 0x2e, 0x3b, 0xab6, 0xabe, 0x2e, 0x3b, 0xab0, 0xabe, 0xaae, 0x2e, 0x3b,
-0xab6, 0xabe, 0xab5, 0x2e, 0x3b, 0xaa7, 0xac1, 0x2bb, 0xab2, 0x2d, 0xa95, 0xacd, 0xaaf, 0xac1, 0x2e, 0x3b, 0xaa7, 0xac1, 0x2bb, 0xab2,
-0x2d, 0xa8f, 0xa9a, 0x2e, 0x5de, 0x5d5, 0x5d7, 0x5e8, 0x5dd, 0x3b, 0x5e6, 0x5e4, 0x5e8, 0x3b, 0x5e8, 0x5d1, 0x5d9, 0x5e2, 0x20, 0x5d0,
-0x5dc, 0x5be, 0x5d0, 0x5d5, 0x5d5, 0x5dc, 0x3b, 0x5e8, 0x5d1, 0x5d9, 0x5e2, 0x20, 0x5d0, 0x5be, 0x5ea, 0x5f3, 0x5d0, 0x5e0, 0x5d9, 0x3b,
-0x5d2, 0x5f3, 0x5d5, 0x5de, 0x5d0, 0x5d3, 0x5d0, 0x20, 0x5d0, 0x5dc, 0x5be, 0x5d0, 0x5d5, 0x5dc, 0x5d0, 0x3b, 0x5d2, 0x5f3, 0x5d5, 0x5de,
-0x5d0, 0x5d3, 0x5d0, 0x20, 0x5d0, 0x5be, 0x5ea, 0x5f3, 0x5d0, 0x5e0, 0x5d9, 0x5d4, 0x3b, 0x5e8, 0x5d2, 0x5f3, 0x5d1, 0x3b, 0x5e9, 0x5e2,
-0x5d1, 0x5d0, 0x5df, 0x3b, 0x5e8, 0x5de, 0x5d3, 0x5d0, 0x5df, 0x3b, 0x5e9, 0x5d5, 0x5d5, 0x5d0, 0x5dc, 0x3b, 0x5d3, 0x5f3, 0x5d5, 0x20,
-0x5d0, 0x5dc, 0x5be, 0x5e7, 0x5e2, 0x5d3, 0x5d4, 0x3b, 0x5d3, 0x5f3, 0x5d5, 0x20, 0x5d0, 0x5dc, 0x5be, 0x5d7, 0x5d9, 0x5d2, 0x5f3, 0x5d4,
-0x5de, 0x5d5, 0x5d7, 0x5e8, 0x5dd, 0x3b, 0x5e6, 0x5e4, 0x5e8, 0x3b, 0x5e8, 0x5d1, 0x5d9, 0x5e2, 0x20, 0x5d0, 0x5dc, 0x2d, 0x5d0, 0x5d5,
-0x5d5, 0x5dc, 0x3b, 0x5e8, 0x5d1, 0x5d9, 0x5e2, 0x20, 0x5d0, 0x2d, 0x5ea, 0x5f3, 0x5d0, 0x5e0, 0x5d9, 0x3b, 0x5d2, 0x5f3, 0x5d5, 0x5de,
-0x5d0, 0x5d3, 0x5d0, 0x20, 0x5d0, 0x5dc, 0x2d, 0x5d0, 0x5d5, 0x5dc, 0x5d0, 0x3b, 0x5d2, 0x5f3, 0x5d5, 0x5de, 0x5d0, 0x5d3, 0x5d0, 0x20,
-0x5d0, 0x2d, 0x5ea, 0x5f3, 0x5d0, 0x5e0, 0x5d9, 0x5d4, 0x3b, 0x5e8, 0x5d2, 0x5f3, 0x5d1, 0x3b, 0x5e9, 0x5e2, 0x5d1, 0x5d0, 0x5df, 0x3b,
-0x5e8, 0x5de, 0x5d3, 0x5d0, 0x5df, 0x3b, 0x5e9, 0x5d5, 0x5d5, 0x5d0, 0x5dc, 0x3b, 0x5d3, 0x5f3, 0x5d5, 0x20, 0x5d0, 0x5dc, 0x5be, 0x5e7,
-0x5e2, 0x5d3, 0x5d4, 0x3b, 0x5d3, 0x5f3, 0x5d5, 0x20, 0x5d0, 0x5dc, 0x5be, 0x5d7, 0x5d9, 0x5d2, 0x5f3, 0x5d4, 0x5de, 0x5d5, 0x5d7, 0x5e8,
-0x5dd, 0x3b, 0x5e6, 0x5e4, 0x5e8, 0x3b, 0x5e8, 0x5d1, 0x5d9, 0x5e2, 0x20, 0x5d0, 0x5f3, 0x3b, 0x5e8, 0x5d1, 0x5d9, 0x5e2, 0x20, 0x5d1,
-0x5f3, 0x3b, 0x5d2, 0x5f3, 0x5d5, 0x5de, 0x5d0, 0x5d3, 0x5d0, 0x20, 0x5d0, 0x5f3, 0x3b, 0x5d2, 0x5f3, 0x5d5, 0x5de, 0x5d0, 0x5d3, 0x5d0,
-0x20, 0x5d1, 0x5f3, 0x3b, 0x5e8, 0x5d2, 0x5f3, 0x5d1, 0x3b, 0x5e9, 0x5e2, 0x5d1, 0x5d0, 0x5df, 0x3b, 0x5e8, 0x5de, 0x5d3, 0x5d0, 0x5df,
-0x3b, 0x5e9, 0x5d5, 0x5d5, 0x5d0, 0x5dc, 0x3b, 0x5d3, 0x5f3, 0x5d5, 0x20, 0x5d0, 0x5dc, 0x5be, 0x5e7, 0x5e2, 0x5d3, 0x5d4, 0x3b, 0x5d3,
-0x5f3, 0x5d5, 0x20, 0x5d0, 0x5dc, 0x5be, 0x5d7, 0x5d9, 0x5d2, 0x5f3, 0x5d4, 0x92e, 0x941, 0x939, 0x930, 0x94d, 0x930, 0x92e, 0x3b, 0x938,
-0x92b, 0x930, 0x3b, 0x930, 0x93e, 0x92c, 0x940, 0x20, 0x92a, 0x94d, 0x930, 0x925, 0x92e, 0x3b, 0x930, 0x93e, 0x92c, 0x940, 0x20, 0x926,
-0x94d, 0x935, 0x93f, 0x924, 0x940, 0x92f, 0x3b, 0x91c, 0x941, 0x92e, 0x94d, 0x921, 0x93e, 0x20, 0x92a, 0x94d, 0x930, 0x925, 0x92e, 0x3b,
-0x91c, 0x941, 0x92e, 0x94d, 0x921, 0x93e, 0x20, 0x926, 0x94d, 0x935, 0x93f, 0x924, 0x940, 0x92f, 0x3b, 0x930, 0x91c, 0x92c, 0x3b, 0x936,
-0x93e, 0x935, 0x928, 0x3b, 0x930, 0x92e, 0x91c, 0x93e, 0x928, 0x3b, 0x936, 0x935, 0x94d, 0x935, 0x94d, 0x932, 0x3b, 0x91c, 0x93f, 0x932,
-0x2d, 0x915, 0x94d, 0x926, 0x93e, 0x939, 0x3b, 0x91c, 0x93f, 0x932, 0x94d, 0x2d, 0x939, 0x93f, 0x91c, 0x94d, 0x91c, 0x93e, 0x939, 0x4d,
-0x6f, 0x68, 0x61, 0x72, 0x72, 0x65, 0x6d, 0x3b, 0x53, 0x61, 0x66, 0x61, 0x72, 0x3b, 0x52, 0xe9, 0x62, 0x69, 0x20, 0x49,
-0x3b, 0x52, 0xe9, 0x62, 0x69, 0x20, 0x49, 0x49, 0x3b, 0x44, 0x73, 0x65, 0x6d, 0xe1, 0x64, 0x69, 0x20, 0x49, 0x3b, 0x44,
-0x73, 0x65, 0x6d, 0xe1, 0x64, 0x69, 0x20, 0x49, 0x49, 0x3b, 0x52, 0x65, 0x64, 0x73, 0x65, 0x62, 0x3b, 0x53, 0x61, 0x62,
-0xe1, 0x6e, 0x3b, 0x52, 0x61, 0x6d, 0x61, 0x64, 0xe1, 0x6e, 0x3b, 0x53, 0x65, 0x76, 0x76, 0xe1, 0x6c, 0x3b, 0x44, 0x73,
-0xfc, 0x6c, 0x20, 0x6b, 0x61, 0x64, 0x65, 0x3b, 0x44, 0x73, 0xfc, 0x6c, 0x20, 0x68, 0x65, 0x64, 0x73, 0x65, 0x4d, 0x6f,
-0x68, 0x61, 0x72, 0x72, 0x65, 0x6d, 0x3b, 0x53, 0x61, 0x66, 0x61, 0x72, 0x3b, 0x52, 0xe9, 0x62, 0x69, 0x20, 0x65, 0x6c,
-0x20, 0x61, 0x76, 0x76, 0x65, 0x6c, 0x3b, 0x52, 0xe9, 0x62, 0x69, 0x20, 0x65, 0x6c, 0x20, 0x61, 0x63, 0x63, 0x68, 0x65,
-0x72, 0x3b, 0x44, 0x73, 0x65, 0x6d, 0xe1, 0x64, 0x69, 0x20, 0x65, 0x6c, 0x20, 0x61, 0x76, 0x76, 0x65, 0x6c, 0x3b, 0x44,
-0x73, 0x65, 0x6d, 0xe1, 0x64, 0x69, 0x20, 0x65, 0x6c, 0x20, 0x61, 0x63, 0x63, 0x68, 0x65, 0x72, 0x3b, 0x52, 0x65, 0x64,
-0x73, 0x65, 0x62, 0x3b, 0x53, 0x61, 0x62, 0xe1, 0x6e, 0x3b, 0x52, 0x61, 0x6d, 0x61, 0x64, 0xe1, 0x6e, 0x3b, 0x53, 0x65,
-0x76, 0x76, 0xe1, 0x6c, 0x3b, 0x44, 0x73, 0xfc, 0x6c, 0x20, 0x6b, 0x61, 0x64, 0x65, 0x3b, 0x44, 0x73, 0xfc, 0x6c, 0x20,
-0x68, 0x65, 0x64, 0x73, 0x65, 0x4d, 0x6f, 0x68, 0x2e, 0x3b, 0x53, 0x61, 0x66, 0x2e, 0x3b, 0x52, 0xe9, 0x62, 0x2e, 0x20,
-0x31, 0x3b, 0x52, 0xe9, 0x62, 0x2e, 0x20, 0x32, 0x3b, 0x44, 0x73, 0x65, 0x6d, 0x2e, 0x20, 0x49, 0x3b, 0x44, 0x73, 0x65,
-0x6d, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x52, 0x65, 0x64, 0x2e, 0x3b, 0x53, 0x61, 0x62, 0x2e, 0x3b, 0x52, 0x61, 0x6d, 0x2e,
-0x3b, 0x53, 0x65, 0x76, 0x2e, 0x3b, 0x44, 0x73, 0xfc, 0x6c, 0x20, 0x6b, 0x2e, 0x3b, 0x44, 0x73, 0xfc, 0x6c, 0x20, 0x68,
-0x2e, 0x6d, 0x75, 0x68, 0x2e, 0x3b, 0x73, 0x61, 0x66, 0x2e, 0x3b, 0x72, 0x61, 0x62, 0x2e, 0x20, 0x49, 0x3b, 0x72, 0x61,
-0x62, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x6a, 0x75, 0x6d, 0x2e, 0x20, 0x49, 0x3b, 0x6a, 0x75, 0x6d, 0x2e, 0x20, 0x49, 0x49,
-0x3b, 0x72, 0x61, 0x6a, 0x2e, 0x3b, 0x73, 0x68, 0x61, 0x2e, 0x3b, 0x72, 0x61, 0x6d, 0x2e, 0x3b, 0x73, 0x68, 0x61, 0x77,
-0x2e, 0x3b, 0x64, 0x68, 0x75, 0x2bb, 0x6c, 0x2d, 0x51, 0x2e, 0x3b, 0x64, 0x68, 0x75, 0x2bb, 0x6c, 0x2d, 0x48, 0x2e, 0x4d,
-0x75, 0x68, 0x61, 0x72, 0x61, 0x6d, 0x3b, 0x53, 0x61, 0x66, 0x61, 0x72, 0x3b, 0x52, 0x61, 0x62, 0x69, 0x75, 0x6c, 0x61,
-0x77, 0x61, 0x6c, 0x3b, 0x52, 0x61, 0x62, 0x69, 0x75, 0x6c, 0x61, 0x6b, 0x68, 0x69, 0x72, 0x3b, 0x4a, 0x75, 0x6d, 0x61,
-0x64, 0x69, 0x6c, 0x61, 0x77, 0x61, 0x6c, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x64, 0x69, 0x6c, 0x61, 0x6b, 0x68, 0x69, 0x72,
-0x3b, 0x52, 0x61, 0x6a, 0x61, 0x62, 0x3b, 0x53, 0x79, 0x61, 0x6b, 0x62, 0x61, 0x6e, 0x3b, 0x52, 0x61, 0x6d, 0x61, 0x64,
-0x61, 0x6e, 0x3b, 0x53, 0x79, 0x61, 0x77, 0x61, 0x6c, 0x3b, 0x5a, 0x75, 0x6c, 0x6b, 0x61, 0x69, 0x64, 0x61, 0x68, 0x3b,
-0x5a, 0x75, 0x6c, 0x68, 0x69, 0x6a, 0x61, 0x68, 0x4d, 0x75, 0x68, 0x2e, 0x3b, 0x53, 0x61, 0x66, 0x2e, 0x3b, 0x52, 0x61,
-0x62, 0x2e, 0x20, 0x41, 0x77, 0x61, 0x6c, 0x3b, 0x52, 0x61, 0x62, 0x2e, 0x20, 0x41, 0x6b, 0x68, 0x69, 0x72, 0x3b, 0x4a,
-0x75, 0x6d, 0x2e, 0x20, 0x41, 0x77, 0x61, 0x6c, 0x3b, 0x4a, 0x75, 0x6d, 0x2e, 0x20, 0x41, 0x6b, 0x68, 0x69, 0x72, 0x3b,
-0x52, 0x61, 0x6a, 0x2e, 0x3b, 0x53, 0x79, 0x61, 0x2e, 0x3b, 0x52, 0x61, 0x6d, 0x2e, 0x3b, 0x53, 0x79, 0x61, 0x77, 0x2e,
-0x3b, 0x5a, 0x75, 0x6c, 0x6b, 0x61, 0x2e, 0x3b, 0x5a, 0x75, 0x6c, 0x68, 0x69, 0x2e, 0x30e0, 0x30cf, 0x30c3, 0x30e9, 0x30e0, 0x3b,
-0x30b5, 0x30d5, 0x30a2, 0x30eb, 0x3b, 0x30e9, 0x30d3, 0x30fc, 0x30fb, 0x30a6, 0x30eb, 0x30fb, 0x30a2, 0x30a6, 0x30ef, 0x30eb, 0x3b, 0x30e9, 0x30d3, 0x30fc,
-0x30fb, 0x30a6, 0x30c3, 0x30fb, 0x30b5, 0x30fc, 0x30cb, 0x30fc, 0x3b, 0x30b8, 0x30e5, 0x30de, 0x30fc, 0x30c0, 0x30eb, 0x30fb, 0x30a2, 0x30a6, 0x30ef, 0x30eb,
-0x3b, 0x30b8, 0x30e5, 0x30de, 0x30fc, 0x30c0, 0x30c3, 0x30b5, 0x30fc, 0x30cb, 0x30fc, 0x3b, 0x30e9, 0x30b8, 0x30e3, 0x30d6, 0x3b, 0x30b7, 0x30e3, 0x30a2,
-0x30d0, 0x30fc, 0x30f3, 0x3b, 0x30e9, 0x30de, 0x30c0, 0x30fc, 0x30f3, 0x3b, 0x30b7, 0x30e3, 0x30a6, 0x30ef, 0x30fc, 0x30eb, 0x3b, 0x30ba, 0x30eb, 0x30fb,
-0x30ab, 0x30a4, 0x30c0, 0x3b, 0x30ba, 0x30eb, 0x30fb, 0x30d2, 0x30c3, 0x30b8, 0x30e3, 0xcae, 0xcc1, 0xcb9, 0xcb0, 0xcae, 0xccd, 0x3b, 0xcb8, 0xcab,
-0xcbe, 0xcb0, 0xccd, 0x3b, 0xcb0, 0xcac, 0xcbf, 0x2018, 0x20, 0x49, 0x3b, 0xcb0, 0xcac, 0xcbf, 0x2018, 0x20, 0x49, 0x49, 0x3b, 0xc9c,
-0xcc1, 0xcae, 0xcbe, 0xca6, 0xcbe, 0x20, 0x49, 0x3b, 0xc9c, 0xcc1, 0xcae, 0xcbe, 0xca6, 0xcbe, 0x20, 0x49, 0x49, 0x3b, 0xcb0, 0xc9c,
-0xcac, 0xccd, 0x3b, 0xcb6, 0x2019, 0xcac, 0xcbe, 0xca8, 0xccd, 0x3b, 0xcb0, 0xcae, 0xca6, 0xcbe, 0xca8, 0xccd, 0x3b, 0xcb6, 0xcb5, 0xccd,
-0xcb5, 0xcbe, 0xcb2, 0xccd, 0x3b, 0xca7, 0xcc1, 0x2018, 0xcb2, 0xccd, 0x2d, 0xc95, 0xcbf, 0x2018, 0xca1, 0xcbe, 0xcb9, 0xccd, 0x3b, 0xca7,
-0xcc1, 0x2018, 0xcb2, 0xccd, 0x2d, 0xcb9, 0xcbf, 0xc9c, 0xcbe, 0xcb9, 0xccd, 0xcae, 0xcc1, 0xcb9, 0xccd, 0x2e, 0x3b, 0xcb8, 0xcab, 0xcbe,
-0x2e, 0x3b, 0xcb0, 0xcac, 0xcbf, 0x2018, 0x20, 0x49, 0x3b, 0xcb0, 0xcac, 0xcbf, 0x2018, 0x20, 0x49, 0x49, 0x3b, 0xc9c, 0xcc1, 0xcae,
-0xccd, 0x2e, 0x20, 0x49, 0x3b, 0xc9c, 0xcc1, 0xcae, 0xccd, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0xcb0, 0xc9c, 0xccd, 0x2e, 0x3b, 0xcb6,
-0x2e, 0x3b, 0xcb0, 0xcae, 0xccd, 0x2e, 0x3b, 0xcb6, 0xcb5, 0xccd, 0x2e, 0x3b, 0xca7, 0xcc1, 0x2018, 0xcb2, 0xccd, 0x2d, 0xc95, 0xcbf,
-0x2e, 0x3b, 0xca7, 0xcc1, 0x2018, 0xcb2, 0xccd, 0x2d, 0xcb9, 0x2e, 0xbb34, 0xd558, 0xb78c, 0x3b, 0xc0ac, 0xd30c, 0xb974, 0x3b, 0xb77c, 0xbe44,
-0x20, 0xc54c, 0x20, 0xc544, 0xc648, 0x3b, 0xb77c, 0xbe44, 0x20, 0xc54c, 0x20, 0xc384, 0xb2c8, 0x3b, 0xc8fc, 0xb9c8, 0xb2e4, 0x20, 0xc54c, 0x20,
-0xc544, 0xc648, 0x3b, 0xc8fc, 0xb9c8, 0xb2e4, 0x20, 0xc54c, 0x20, 0xc384, 0xb2c8, 0x3b, 0xb77c, 0xc7a1, 0x3b, 0xc250, 0xc544, 0xbc18, 0x3b, 0xb77c,
-0xb9c8, 0xb2e8, 0x3b, 0xc250, 0xc648, 0x3b, 0xb4c0, 0x20, 0xc54c, 0x20, 0xae4c, 0xb2e4, 0x3b, 0xb4c0, 0x20, 0xc54c, 0x20, 0xd788, 0xc790, 0x6d,
-0x75, 0x1e96, 0x65, 0x72, 0x65, 0x6d, 0x3b, 0x73, 0x65, 0x66, 0x65, 0x72, 0x3b, 0x72, 0x65, 0x62, 0xee, 0x2bf, 0x75, 0x6c,
-0x65, 0x77, 0x65, 0x6c, 0x3b, 0x72, 0x65, 0x62, 0xee, 0x2bf, 0x75, 0x6c, 0x61, 0x78, 0x65, 0x72, 0x3b, 0x63, 0x65, 0x6d,
-0x61, 0x7a, 0xee, 0x79, 0x65, 0x6c, 0x65, 0x77, 0x65, 0x6c, 0x3b, 0x63, 0x65, 0x6d, 0x61, 0x7a, 0xee, 0x79, 0x65, 0x6c,
-0x61, 0x78, 0x65, 0x72, 0x3b, 0x72, 0x65, 0x63, 0x65, 0x62, 0x3b, 0x15f, 0x65, 0x2bf, 0x62, 0x61, 0x6e, 0x3b, 0x72, 0x65,
-0x6d, 0x65, 0x7a, 0x61, 0x6e, 0x3b, 0x15f, 0x65, 0x77, 0x61, 0x6c, 0x3b, 0x7a, 0xee, 0x6c, 0x71, 0x65, 0x2bf, 0x64, 0x65,
-0x3b, 0x7a, 0xee, 0x6c, 0x1e96, 0x65, 0x63, 0x65, 0xea1, 0xeb8, 0xea3, 0xeb0, 0xeae, 0xead, 0xea1, 0x3b, 0xe8a, 0xeb2, 0xe9f, 0xeb2,
-0xea3, 0x3b, 0xeae, 0xead, 0xe94, 0xe9a, 0xeb5, 0x20, 0x31, 0x3b, 0xeae, 0xead, 0xe94, 0xe9a, 0xeb5, 0x20, 0x32, 0x3b, 0xe88, 0xeb8,
-0xea1, 0xeb2, 0xe94, 0xeb2, 0x20, 0x31, 0x3b, 0xe88, 0xeb8, 0xea1, 0xeb2, 0xe94, 0xeb2, 0x20, 0x32, 0x3b, 0xeae, 0xeb2, 0xe88, 0xeb1,
-0xe9a, 0x3b, 0xe8a, 0xeb0, 0xe9a, 0xeb2, 0xe99, 0x3b, 0xeae, 0xeb2, 0xea1, 0xeb2, 0xe94, 0xead, 0xe99, 0x3b, 0xec0, 0xe8a, 0xebb, 0xeb2,
-0xea7, 0xeb1, 0xe94, 0x3b, 0xe94, 0xeb8, 0xead, 0xeb1, 0xe94, 0xe81, 0xeb4, 0xe94, 0xeb0, 0x3b, 0xe94, 0xeb8, 0xead, 0xeb1, 0xe94, 0xe81,
-0xeb4, 0xe88, 0xeb0, 0xea1, 0xeb8, 0xeae, 0xeb1, 0xe94, 0x3b, 0xec0, 0xe84, 0xeb2, 0xeb0, 0x3b, 0xeae, 0xead, 0xe81, 0xe9a, 0xeb5, 0x20,
-0x31, 0x3b, 0xeae, 0xead, 0xe81, 0xe9a, 0xeb5, 0x20, 0x32, 0x3b, 0xe99, 0xeb8, 0xea1, 0xeb2, 0x20, 0x31, 0x3b, 0xe99, 0xeb8, 0xea1,
-0xeb2, 0x20, 0x32, 0x3b, 0xec0, 0xeae, 0xeb2, 0xeb0, 0x3b, 0xe8a, 0xeb2, 0x3b, 0xec0, 0xeae, 0xeb2, 0xeb0, 0xea1, 0xeb0, 0x3b, 0xec0,
-0xe8a, 0xebb, 0xeb2, 0x3b, 0xe8a, 0xeb8, 0xea5, 0xe81, 0xeb4, 0xead, 0xeb8, 0x3b, 0xe8a, 0xeb8, 0xea5, 0xeab, 0xeb4, 0xe88, 0xea1, 0xeb8,
-0xeae, 0xeb1, 0xe94, 0x3b, 0xec0, 0xe84, 0xeb2, 0xeb0, 0x3b, 0xeae, 0xead, 0xe94, 0xe9a, 0xeb5, 0x20, 0x31, 0x3b, 0xeae, 0xead, 0xe81,
-0xe9a, 0xeb5, 0x20, 0x32, 0x3b, 0xe99, 0xeb8, 0xea1, 0xeb2, 0x20, 0x31, 0x3b, 0xe99, 0xeb8, 0xea1, 0xeb2, 0x20, 0x32, 0x3b, 0xec0,
-0xeae, 0xeb2, 0xeb0, 0x3b, 0xe8a, 0xeb0, 0xead, 0xecc, 0x3b, 0xec0, 0xeae, 0xeb2, 0xeb0, 0xea1, 0xeb0, 0x3b, 0xec0, 0xe8a, 0xebb, 0xeb2,
-0x3b, 0xe8a, 0xeb8, 0xea5, 0xe81, 0xeb4, 0xead, 0xeb8, 0x3b, 0xe8a, 0xeb8, 0xea5, 0xeab, 0xeb4, 0xe88, 0x6d, 0x75, 0x68, 0x61, 0x72,
-0x61, 0x6d, 0x73, 0x3b, 0x73, 0x61, 0x66, 0x61, 0x72, 0x73, 0x3b, 0x31, 0x2e, 0x20, 0x72, 0x61, 0x62, 0x12b, 0x3b, 0x32,
-0x2e, 0x20, 0x72, 0x61, 0x62, 0x12b, 0x3b, 0x31, 0x2e, 0x20, 0x64, 0x17e, 0x75, 0x6d, 0x101, 0x64, 0x101, 0x3b, 0x32, 0x2e,
-0x20, 0x64, 0x17e, 0x75, 0x6d, 0x101, 0x64, 0x101, 0x3b, 0x72, 0x61, 0x64, 0x17e, 0x61, 0x62, 0x73, 0x3b, 0x161, 0x61, 0x62,
-0x61, 0x6e, 0x73, 0x3b, 0x72, 0x61, 0x6d, 0x61, 0x64, 0x101, 0x6e, 0x73, 0x3b, 0x161, 0x61, 0x75, 0x76, 0x61, 0x6c, 0x73,
-0x3b, 0x64, 0x75, 0x20, 0x61, 0x6c, 0x2d, 0x6b, 0x69, 0x64, 0x101, 0x3b, 0x64, 0x75, 0x20, 0x61, 0x6c, 0x2d, 0x68, 0x69,
-0x64, 0x17e, 0x101, 0x43c, 0x443, 0x445, 0x430, 0x440, 0x435, 0x43c, 0x3b, 0x441, 0x430, 0x444, 0x430, 0x440, 0x3b, 0x440, 0x430, 0x431,
-0x438, 0x20, 0x49, 0x3b, 0x440, 0x430, 0x431, 0x438, 0x20, 0x49, 0x49, 0x3b, 0x45f, 0x443, 0x43c, 0x430, 0x434, 0x430, 0x20, 0x49,
-0x3b, 0x45f, 0x443, 0x43c, 0x430, 0x434, 0x430, 0x20, 0x49, 0x49, 0x3b, 0x440, 0x430, 0x45f, 0x430, 0x431, 0x3b, 0x448, 0x430, 0x431,
-0x430, 0x43d, 0x3b, 0x440, 0x430, 0x43c, 0x430, 0x434, 0x430, 0x43d, 0x3b, 0x448, 0x430, 0x432, 0x430, 0x43b, 0x3b, 0x434, 0x443, 0x43b,
-0x43a, 0x438, 0x434, 0x430, 0x3b, 0x434, 0x443, 0x43b, 0x445, 0x438, 0x45f, 0x430, 0x43c, 0x443, 0x445, 0x2e, 0x3b, 0x441, 0x430, 0x444,
-0x2e, 0x3b, 0x440, 0x430, 0x431, 0x2e, 0x20, 0x49, 0x3b, 0x440, 0x430, 0x431, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x45f, 0x443, 0x43c,
-0x2e, 0x20, 0x49, 0x3b, 0x45f, 0x443, 0x43c, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x440, 0x430, 0x45f, 0x2e, 0x3b, 0x448, 0x430, 0x431,
-0x2e, 0x3b, 0x440, 0x430, 0x43c, 0x2e, 0x3b, 0x448, 0x430, 0x432, 0x2e, 0x3b, 0x434, 0x443, 0x43b, 0x43a, 0x2e, 0x3b, 0x434, 0x443,
-0x43b, 0x445, 0x2e, 0xd2e, 0xd41, 0xd39, 0xd31, 0xd02, 0x3b, 0xd38, 0xd2b, 0xd7c, 0x3b, 0xd31, 0xd2c, 0xd40, 0xd39, 0xd41, 0xd7d, 0x20,
-0xd05, 0xd35, 0xd4d, 0xd35, 0xd7d, 0x3b, 0xd31, 0xd2c, 0xd40, 0xd39, 0xd41, 0xd7d, 0x20, 0xd06, 0xd16, 0xd3f, 0xd7c, 0x3b, 0xd1c, 0xd2e,
-0xd3e, 0xd26, 0xd41, 0xd7d, 0x20, 0xd05, 0xd35, 0xd4d, 0xd35, 0xd7d, 0x3b, 0xd1c, 0xd2e, 0xd3e, 0xd26, 0xd41, 0xd7d, 0x20, 0xd06, 0xd16,
-0xd3f, 0xd7c, 0x3b, 0xd31, 0xd1c, 0xd2c, 0xd4d, 0x3b, 0xd36, 0xd39, 0xd2c, 0xd3e, 0xd7b, 0x3b, 0xd31, 0xd2e, 0xd26, 0xd3e, 0xd7b, 0x3b,
-0xd36, 0xd35, 0xd4d, 0xd35, 0xd3e, 0xd7d, 0x3b, 0xd26, 0xd41, 0xd7d, 0x20, 0xd16, 0xd39, 0xd26, 0xd4d, 0x3b, 0xd26, 0xd41, 0xd7d, 0x20,
-0xd39, 0xd3f, 0xd1c, 0xd4d, 0xd1c, 0xd2e, 0xd41, 0xd39, 0xd31, 0xd02, 0x3b, 0xd38, 0xd2b, 0xd7c, 0x3b, 0xd31, 0xd2c, 0xd40, 0xd39, 0xd41,
-0xd7d, 0x20, 0xd05, 0xd35, 0xd4d, 0xd35, 0xd7d, 0x3b, 0xd31, 0xd2c, 0xd40, 0xd39, 0xd41, 0xd7d, 0x20, 0xd06, 0xd16, 0xd3f, 0xd7c, 0x3b,
-0xd1c, 0xd2e, 0xd3e, 0xd26, 0xd41, 0xd7d, 0x20, 0xd05, 0xd35, 0xd4d, 0xd35, 0xd7d, 0x3b, 0xd1c, 0xd2e, 0xd3e, 0xd26, 0xd41, 0xd7d, 0x20,
-0xd06, 0xd16, 0xd3f, 0xd7c, 0x3b, 0xd31, 0xd1c, 0xd2c, 0xd4d, 0x3b, 0xd36, 0xd39, 0xd2c, 0xd3e, 0xd7b, 0x3b, 0xd31, 0xd2e, 0xd33, 0xd3e,
-0xd7b, 0x3b, 0xd36, 0xd35, 0xd4d, 0xd35, 0xd3e, 0xd7d, 0x3b, 0xd26, 0xd41, 0xd7d, 0x20, 0xd16, 0xd39, 0xd26, 0xd4d, 0x3b, 0xd26, 0xd41,
-0xd7d, 0x20, 0xd39, 0xd3f, 0xd1c, 0xd4d, 0xd1c, 0xd2e, 0xd41, 0xd39, 0x2e, 0x3b, 0xd38, 0xd2b, 0x2e, 0x3b, 0xd31, 0xd2c, 0xd40, 0xd39,
-0xd41, 0xd7d, 0x20, 0xd05, 0xd35, 0xd4d, 0xd35, 0x2e, 0x3b, 0xd31, 0xd2c, 0xd40, 0xd39, 0xd41, 0xd7d, 0x20, 0xd06, 0xd16, 0xd3f, 0x2e,
-0x3b, 0xd1c, 0xd2e, 0xd3e, 0xd26, 0xd41, 0xd7d, 0x20, 0xd05, 0xd35, 0xd4d, 0xd35, 0x2e, 0x3b, 0xd1c, 0xd2e, 0xd3e, 0xd26, 0xd41, 0xd7d,
-0x20, 0xd06, 0xd16, 0xd3f, 0x2e, 0x3b, 0xd31, 0xd1c, 0x2e, 0x3b, 0xd36, 0xd39, 0xd2c, 0xd3e, 0x2e, 0x3b, 0xd31, 0xd2e, 0xd26, 0xd3e,
-0x2e, 0x3b, 0xd36, 0xd35, 0xd4d, 0xd35, 0xd3e, 0x2e, 0x3b, 0xd26, 0xd41, 0xd7d, 0x20, 0xd16, 0xd39, 0x2e, 0x3b, 0xd26, 0xd41, 0xd7d,
-0x20, 0xd39, 0xd3f, 0x2e, 0xd2e, 0xd41, 0x3b, 0xd38, 0x3b, 0xd31, 0x3b, 0xd31, 0x3b, 0xd1c, 0x3b, 0xd1c, 0x3b, 0xd31, 0x3b, 0xd36,
-0x3b, 0xd31, 0x3b, 0xd36, 0x3b, 0xd26, 0xd41, 0x3b, 0xd26, 0xd41, 0x92e, 0x94b, 0x939, 0x930, 0x92e, 0x3b, 0x938, 0x92b, 0x930, 0x3b,
-0x930, 0x93e, 0x92c, 0x940, 0x20, 0x49, 0x3b, 0x930, 0x93e, 0x92c, 0x940, 0x20, 0x49, 0x49, 0x3b, 0x91c, 0x941, 0x92e, 0x93e, 0x926,
-0x93e, 0x20, 0x49, 0x3b, 0x91c, 0x941, 0x92e, 0x93e, 0x926, 0x93e, 0x20, 0x49, 0x49, 0x3b, 0x930, 0x91d, 0x93e, 0x92c, 0x3b, 0x936,
-0x93e, 0x92c, 0x93e, 0x928, 0x3b, 0x930, 0x92e, 0x91c, 0x93e, 0x928, 0x3b, 0x936, 0x935, 0x94d, 0x935, 0x93e, 0x932, 0x3b, 0x927, 0x941,
-0x932, 0x2d, 0x915, 0x940, 0x926, 0x93e, 0x939, 0x3b, 0x927, 0x941, 0x932, 0x2d, 0x939, 0x93f, 0x91c, 0x93e, 0x939, 0x92e, 0x94b, 0x939,
-0x2e, 0x3b, 0x938, 0x92b, 0x2e, 0x3b, 0x930, 0x93e, 0x92c, 0x940, 0x20, 0x49, 0x3b, 0x930, 0x93e, 0x92c, 0x940, 0x20, 0x49, 0x49,
-0x3b, 0x91c, 0x941, 0x92e, 0x93e, 0x2e, 0x20, 0x49, 0x3b, 0x91c, 0x941, 0x92e, 0x93e, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x930, 0x91d,
-0x93e, 0x2e, 0x3b, 0x936, 0x93e, 0x92c, 0x93e, 0x2e, 0x3b, 0x930, 0x92e, 0x2e, 0x3b, 0x936, 0x935, 0x94d, 0x935, 0x93e, 0x2e, 0x3b,
-0x927, 0x941, 0x932, 0x2d, 0x915, 0x940, 0x2e, 0x3b, 0x927, 0x941, 0x932, 0x2d, 0x939, 0x93f, 0x2e, 0x967, 0x3b, 0x968, 0x3b, 0x969,
-0x3b, 0x96a, 0x3b, 0x96b, 0x3b, 0x96c, 0x3b, 0x96d, 0x3b, 0x96e, 0x3b, 0x96f, 0x3b, 0x967, 0x966, 0x3b, 0x967, 0x967, 0x3b, 0x967,
-0x968, 0x6d, 0x75, 0x68, 0x61, 0x72, 0x72, 0x61, 0x6d, 0x3b, 0x73, 0x61, 0x66, 0x61, 0x72, 0x3b, 0x72, 0x61, 0x62, 0x69,
-0x2bb, 0x20, 0x49, 0x3b, 0x72, 0x61, 0x62, 0x69, 0x2bb, 0x20, 0x49, 0x49, 0x3b, 0x6a, 0x75, 0x6d, 0x61, 0x64, 0x61, 0x20,
-0x49, 0x3b, 0x6a, 0x75, 0x6d, 0x61, 0x64, 0x61, 0x20, 0x49, 0x49, 0x3b, 0x72, 0x61, 0x6a, 0x61, 0x62, 0x3b, 0x73, 0x68,
-0x61, 0x2bb, 0x62, 0x61, 0x6e, 0x3b, 0x72, 0x61, 0x6d, 0x61, 0x64, 0x61, 0x6e, 0x3b, 0x73, 0x68, 0x61, 0x77, 0x77, 0x61,
-0x6c, 0x3b, 0x64, 0x68, 0x75, 0x2bb, 0x6c, 0x2d, 0x71, 0x69, 0x2bb, 0x64, 0x61, 0x68, 0x3b, 0x64, 0x68, 0x75, 0x2bb, 0x6c,
-0x2d, 0x68, 0x69, 0x6a, 0x6a, 0x61, 0x68, 0x6d, 0x75, 0x68, 0x2e, 0x3b, 0x73, 0x61, 0x66, 0x2e, 0x3b, 0x72, 0x61, 0x62,
-0x2e, 0x20, 0x49, 0x3b, 0x72, 0x61, 0x62, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x6a, 0x75, 0x6d, 0x2e, 0x20, 0x49, 0x3b, 0x6a,
-0x75, 0x6d, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x72, 0x61, 0x6a, 0x2e, 0x3b, 0x73, 0x68, 0x61, 0x2e, 0x3b, 0x72, 0x61, 0x6d,
-0x2e, 0x3b, 0x73, 0x68, 0x61, 0x77, 0x2e, 0x3b, 0x64, 0x68, 0x75, 0x2bb, 0x6c, 0x2d, 0x71, 0x2e, 0x3b, 0x44, 0x68, 0x75,
-0x2bb, 0x6c, 0x2d, 0x48, 0x2e, 0x6d, 0x75, 0x68, 0x2e, 0x3b, 0x73, 0x61, 0x66, 0x2e, 0x3b, 0x72, 0x61, 0x62, 0x2e, 0x20,
-0x49, 0x3b, 0x72, 0x61, 0x62, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x6a, 0x75, 0x6d, 0x2e, 0x20, 0x49, 0x3b, 0x6a, 0x75, 0x6d,
-0x2e, 0x20, 0x49, 0x49, 0x3b, 0x72, 0x61, 0x6a, 0x2e, 0x3b, 0x73, 0x68, 0x61, 0x2e, 0x3b, 0x72, 0x61, 0x6d, 0x2e, 0x3b,
-0x73, 0x68, 0x61, 0x77, 0x2e, 0x3b, 0x64, 0x68, 0x75, 0x2bb, 0x6c, 0x2d, 0x71, 0x2e, 0x3b, 0x64, 0x68, 0x75, 0x2bb, 0x6c,
-0x2d, 0x68, 0x2e, 0x645, 0x62d, 0x631, 0x645, 0x3b, 0x635, 0x641, 0x631, 0x3b, 0x631, 0x628, 0x64a, 0x639, 0x3b, 0x631, 0x628, 0x64a,
-0x639, 0x20, 0x49, 0x49, 0x3b, 0x62c, 0x645, 0x627, 0x639, 0x647, 0x3b, 0x62c, 0x645, 0x648, 0x645, 0x627, 0x20, 0x49, 0x49, 0x3b,
-0x631, 0x62c, 0x628, 0x3b, 0x634, 0x639, 0x628, 0x627, 0x646, 0x3b, 0x631, 0x645, 0x636, 0x627, 0x646, 0x3b, 0x634, 0x648, 0x627, 0x644,
-0x3b, 0x62f, 0x627, 0x644, 0x642, 0x627, 0x639, 0x62f, 0x647, 0x3b, 0x630, 0x64a, 0x20, 0x627, 0x644, 0x62d, 0x62c, 0x645, 0x62d, 0x631,
-0x645, 0x3b, 0x635, 0x641, 0x631, 0x3b, 0x631, 0x628, 0x64a, 0x639, 0x3b, 0x631, 0x628, 0x64a, 0x639, 0x20, 0x49, 0x49, 0x3b, 0x62c,
-0x645, 0x627, 0x639, 0x647, 0x3b, 0x62c, 0x645, 0x648, 0x645, 0x627, 0x20, 0x49, 0x49, 0x3b, 0x631, 0x62c, 0x628, 0x3b, 0x634, 0x639,
-0x628, 0x627, 0x646, 0x3b, 0x631, 0x645, 0x636, 0x627, 0x646, 0x3b, 0x634, 0x648, 0x627, 0x644, 0x3b, 0x630, 0x64a, 0x20, 0x627, 0x644,
-0x642, 0x639, 0x62f, 0x647, 0x3b, 0x630, 0x64a, 0x20, 0x627, 0x644, 0x62d, 0x62c, 0x645, 0x62d, 0x631, 0x645, 0x3b, 0x635, 0x641, 0x631,
-0x3b, 0x631, 0x628, 0x64a, 0x639, 0x3b, 0x631, 0x628, 0x64a, 0x639, 0x20, 0x49, 0x49, 0x3b, 0x62c, 0x645, 0x627, 0x639, 0x647, 0x3b,
-0x62c, 0x645, 0x627, 0x62f, 0x64a, 0x20, 0x6f2, 0x3b, 0x631, 0x62c, 0x628, 0x3b, 0x634, 0x639, 0x628, 0x627, 0x646, 0x3b, 0x631, 0x645,
-0x636, 0x627, 0x646, 0x3b, 0x634, 0x648, 0x627, 0x644, 0x3b, 0x62f, 0x627, 0x644, 0x642, 0x627, 0x639, 0x62f, 0x647, 0x3b, 0x630, 0x64a,
-0x20, 0x627, 0x644, 0x62d, 0x62c, 0x645, 0x62d, 0x631, 0x645, 0x3b, 0x635, 0x641, 0x631, 0x3b, 0x631, 0x628, 0x64a, 0x639, 0x3b, 0x631,
-0x628, 0x64a, 0x639, 0x20, 0x49, 0x49, 0x3b, 0x62c, 0x645, 0x627, 0x62f, 0x20, 0x6f1, 0x3b, 0x62c, 0x645, 0x627, 0x62f, 0x20, 0x6f2,
-0x3b, 0x631, 0x62c, 0x628, 0x3b, 0x634, 0x639, 0x628, 0x627, 0x646, 0x3b, 0x631, 0x645, 0x636, 0x627, 0x646, 0x3b, 0x634, 0x648, 0x627,
-0x644, 0x3b, 0x62f, 0x627, 0x644, 0x642, 0x627, 0x639, 0x62f, 0x647, 0x3b, 0x630, 0x64a, 0x20, 0x627, 0x644, 0x62d, 0x62c, 0x645, 0x62d,
-0x631, 0x645, 0x3b, 0x62f, 0x20, 0x635, 0x641, 0x631, 0x6d2, 0x20, 0x62f, 0x3b, 0x631, 0x628, 0x64a, 0x639, 0x3b, 0x631, 0x628, 0x64a,
-0x639, 0x20, 0x49, 0x49, 0x3b, 0x62c, 0x645, 0x627, 0x639, 0x647, 0x3b, 0x62c, 0x645, 0x648, 0x645, 0x627, 0x20, 0x49, 0x49, 0x3b,
-0x631, 0x62c, 0x628, 0x3b, 0x634, 0x639, 0x628, 0x627, 0x646, 0x3b, 0x631, 0x645, 0x636, 0x627, 0x646, 0x3b, 0x634, 0x648, 0x627, 0x644,
-0x3b, 0x62f, 0x627, 0x644, 0x642, 0x627, 0x639, 0x62f, 0x647, 0x3b, 0x630, 0x64a, 0x20, 0x627, 0x644, 0x62d, 0x62c, 0x645, 0x62d, 0x631,
-0x645, 0x3b, 0x62f, 0x20, 0x635, 0x641, 0x631, 0x6d2, 0x20, 0x62f, 0x3b, 0x631, 0x628, 0x64a, 0x639, 0x3b, 0x631, 0x628, 0x64a, 0x639,
-0x20, 0x49, 0x49, 0x3b, 0x62c, 0x645, 0x627, 0x639, 0x647, 0x3b, 0x62c, 0x645, 0x648, 0x645, 0x627, 0x20, 0x49, 0x49, 0x3b, 0x631,
-0x62c, 0x628, 0x3b, 0x634, 0x639, 0x628, 0x627, 0x646, 0x3b, 0x631, 0x645, 0x636, 0x627, 0x646, 0x3b, 0x634, 0x648, 0x627, 0x644, 0x3b,
-0x630, 0x64a, 0x20, 0x627, 0x644, 0x642, 0x639, 0x62f, 0x647, 0x3b, 0x630, 0x64a, 0x20, 0x627, 0x644, 0x62d, 0x62c, 0x645, 0x62d, 0x631,
-0x645, 0x3b, 0x635, 0x641, 0x631, 0x3b, 0x631, 0x628, 0x6cc, 0x639, 0x200c, 0x627, 0x644, 0x627, 0x648, 0x644, 0x3b, 0x631, 0x628, 0x6cc,
-0x639, 0x200c, 0x627, 0x644, 0x62b, 0x627, 0x646, 0x6cc, 0x3b, 0x62c, 0x645, 0x627, 0x62f, 0x6cc, 0x200c, 0x627, 0x644, 0x627, 0x648, 0x644,
-0x3b, 0x62c, 0x645, 0x627, 0x62f, 0x6cc, 0x200c, 0x627, 0x644, 0x62b, 0x627, 0x646, 0x6cc, 0x3b, 0x631, 0x62c, 0x628, 0x3b, 0x634, 0x639,
-0x628, 0x627, 0x646, 0x3b, 0x631, 0x645, 0x636, 0x627, 0x646, 0x3b, 0x634, 0x648, 0x627, 0x644, 0x3b, 0x630, 0x6cc, 0x642, 0x639, 0x62f,
-0x647, 0x3b, 0x630, 0x6cc, 0x62d, 0x62c, 0x647, 0x645, 0x62d, 0x631, 0x645, 0x3b, 0x635, 0x641, 0x631, 0x3b, 0x631, 0x628, 0x6cc, 0x639,
-0x200c, 0x627, 0x644, 0x627, 0x648, 0x644, 0x3b, 0x631, 0x628, 0x6cc, 0x639, 0x200c, 0x627, 0x644, 0x62b, 0x627, 0x646, 0x6cc, 0x3b, 0x62c,
-0x645, 0x627, 0x62f, 0x6cc, 0x200c, 0x627, 0x644, 0x627, 0x648, 0x644, 0x3b, 0x62c, 0x645, 0x627, 0x62f, 0x6cc, 0x200c, 0x627, 0x644, 0x62b,
-0x627, 0x646, 0x6cc, 0x3b, 0x631, 0x62c, 0x628, 0x3b, 0x634, 0x639, 0x628, 0x627, 0x646, 0x3b, 0x631, 0x645, 0x636, 0x627, 0x646, 0x3b,
-0x634, 0x648, 0x627, 0x644, 0x3b, 0x630, 0x6cc, 0x642, 0x639, 0x62f, 0x647, 0x654, 0x3b, 0x630, 0x6cc, 0x62d, 0x62c, 0x647, 0x654, 0x645,
-0x3b, 0x635, 0x3b, 0x631, 0x3b, 0x631, 0x3b, 0x62c, 0x3b, 0x62c, 0x3b, 0x631, 0x3b, 0x634, 0x3b, 0x631, 0x3b, 0x634, 0x3b, 0x630,
-0x3b, 0x630, 0x4d, 0x75, 0x68, 0x61, 0x72, 0x72, 0x61, 0x6d, 0x3b, 0x53, 0x61, 0x66, 0x61, 0x72, 0x3b, 0x52, 0x61, 0x62,
-0x69, 0x2bb, 0x20, 0x49, 0x3b, 0x52, 0x61, 0x62, 0x69, 0x2bb, 0x20, 0x49, 0x49, 0x3b, 0x44, 0x17c, 0x75, 0x6d, 0x61, 0x64,
-0x61, 0x20, 0x49, 0x3b, 0x44, 0x17c, 0x75, 0x6d, 0x61, 0x64, 0x61, 0x20, 0x49, 0x49, 0x3b, 0x52, 0x61, 0x64, 0x17c, 0x61,
-0x62, 0x3b, 0x53, 0x7a, 0x61, 0x62, 0x61, 0x6e, 0x3b, 0x52, 0x61, 0x6d, 0x61, 0x64, 0x61, 0x6e, 0x3b, 0x53, 0x7a, 0x61,
-0x77, 0x77, 0x61, 0x6c, 0x3b, 0x5a, 0x75, 0x20, 0x61, 0x6c, 0x2d, 0x6b, 0x61, 0x64, 0x61, 0x3b, 0x5a, 0x75, 0x20, 0x61,
-0x6c, 0x2d, 0x68, 0x69, 0x64, 0x17c, 0x64, 0x17c, 0x61, 0x4d, 0x75, 0x68, 0x2e, 0x3b, 0x53, 0x61, 0x66, 0x2e, 0x3b, 0x52,
-0x61, 0x62, 0x2e, 0x20, 0x49, 0x3b, 0x52, 0x61, 0x62, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x44, 0x17c, 0x75, 0x2e, 0x20, 0x49,
-0x3b, 0x44, 0x17c, 0x75, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x52, 0x61, 0x2e, 0x3b, 0x53, 0x7a, 0x61, 0x2e, 0x3b, 0x52, 0x61,
-0x6d, 0x2e, 0x3b, 0x53, 0x7a, 0x61, 0x77, 0x2e, 0x3b, 0x5a, 0x75, 0x20, 0x61, 0x6c, 0x2d, 0x6b, 0x2e, 0x3b, 0x5a, 0x75,
-0x20, 0x61, 0x6c, 0x2d, 0x68, 0x2e, 0xa2e, 0xa41, 0xa39, 0xa71, 0xa30, 0xa2e, 0x3b, 0xa38, 0xa2b, 0xa30, 0x3b, 0xa30, 0xa2c, 0xa40,
-0x2bb, 0x20, 0x49, 0x3b, 0xa30, 0xa2c, 0xa40, 0x2bb, 0x20, 0x49, 0x49, 0x3b, 0xa1c, 0xa41, 0xa2e, 0xa3e, 0xa26, 0xa3e, 0x20, 0x49,
-0x3b, 0xa1c, 0xa41, 0xa2e, 0xa3e, 0xa26, 0xa3e, 0x20, 0x49, 0x49, 0x3b, 0xa30, 0xa1c, 0xa2c, 0x3b, 0xa38, 0xa3c, 0xa2c, 0xa3e, 0xa28,
-0x3b, 0xa30, 0xa2e, 0xa1c, 0xa3c, 0xa3e, 0xa28, 0x3b, 0xa38, 0xa3c, 0xa35, 0xa3e, 0xa32, 0x3b, 0xa26, 0xa42, 0x2d, 0xa05, 0xa32, 0x2d,
-0xa15, 0xa40, 0xa26, 0xa3e, 0xa39, 0x3b, 0xa26, 0xa42, 0x2d, 0xa05, 0xa32, 0x2d, 0xa39, 0xa3f, 0xa1c, 0xa4d, 0xa39, 0xa3e, 0xa2e, 0xa41,
-0xa39, 0xa71, 0xa30, 0xa2e, 0x3b, 0xa38, 0xa2b, 0xa30, 0x3b, 0xa30, 0xa2c, 0xa40, 0x20, 0x2bb, 0x20, 0x49, 0x3b, 0xa30, 0xa2c, 0xa40,
-0x20, 0x2bb, 0x20, 0x49, 0x49, 0x3b, 0xa1c, 0xa41, 0xa2e, 0xa3e, 0xa26, 0xa3e, 0x20, 0x49, 0x3b, 0xa1c, 0xa41, 0xa2e, 0xa3e, 0xa26,
-0xa3e, 0x20, 0x49, 0x49, 0x3b, 0xa30, 0xa1c, 0xa2c, 0x3b, 0xa38, 0xa3c, 0xa2c, 0xa3e, 0xa28, 0x3b, 0xa30, 0xa2e, 0xa1c, 0xa3c, 0xa3e,
-0xa28, 0x3b, 0xa38, 0xa3c, 0xa35, 0xa3e, 0xa32, 0x3b, 0xa26, 0xa42, 0x2d, 0xa05, 0xa32, 0x2d, 0xa15, 0xa40, 0xa26, 0xa3e, 0xa39, 0x3b,
-0xa26, 0xa42, 0x2d, 0xa05, 0xa32, 0x2d, 0xa39, 0xa3f, 0xa1c, 0xa4d, 0xa39, 0xa3e, 0xa2e, 0xa41, 0xa39, 0xa71, 0x2e, 0x3b, 0xa38, 0xa2b,
-0x2e, 0x3b, 0xa30, 0xa2c, 0x2e, 0x20, 0x49, 0x3b, 0xa30, 0xa2c, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0xa1c, 0xa41, 0xa2e, 0x2e, 0x20,
-0x49, 0x3b, 0xa1c, 0xa41, 0xa2e, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0xa30, 0xa3e, 0xa1c, 0x2e, 0x3b, 0xa38, 0xa3c, 0xa3e, 0x2e, 0x3b,
-0xa30, 0xa3e, 0xa2e, 0x2e, 0x3b, 0xa38, 0xa3c, 0xa05, 0x2e, 0x3b, 0xa26, 0xa42, 0x2d, 0xa05, 0xa32, 0x2d, 0xa15, 0xa40, 0x2e, 0x3b,
-0xa26, 0xa42, 0x2d, 0xa05, 0xa32, 0x2d, 0xa39, 0xa3f, 0x2e, 0x43c, 0x443, 0x445, 0x430, 0x440, 0x440, 0x430, 0x43c, 0x3b, 0x441, 0x430,
-0x444, 0x430, 0x440, 0x3b, 0x440, 0x430, 0x431, 0x438, 0x2d, 0x443, 0x43b, 0x44c, 0x2d, 0x430, 0x432, 0x432, 0x430, 0x43b, 0x44c, 0x3b,
-0x440, 0x430, 0x431, 0x438, 0x2d, 0x443, 0x43b, 0x44c, 0x2d, 0x430, 0x445, 0x438, 0x440, 0x3b, 0x434, 0x436, 0x443, 0x43c, 0x430, 0x434,
-0x2d, 0x443, 0x43b, 0x44c, 0x2d, 0x430, 0x432, 0x432, 0x430, 0x43b, 0x44c, 0x3b, 0x434, 0x436, 0x443, 0x43c, 0x430, 0x434, 0x2d, 0x443,
-0x43b, 0x44c, 0x2d, 0x430, 0x445, 0x438, 0x440, 0x3b, 0x440, 0x430, 0x434, 0x436, 0x430, 0x431, 0x3b, 0x448, 0x430, 0x430, 0x431, 0x430,
-0x43d, 0x3b, 0x440, 0x430, 0x43c, 0x430, 0x434, 0x430, 0x43d, 0x3b, 0x448, 0x430, 0x432, 0x432, 0x430, 0x43b, 0x44c, 0x3b, 0x437, 0x443,
-0x43b, 0x44c, 0x2d, 0x43a, 0x430, 0x430, 0x434, 0x430, 0x3b, 0x437, 0x443, 0x43b, 0x44c, 0x2d, 0x445, 0x438, 0x434, 0x436, 0x436, 0x430,
-0x43c, 0x443, 0x445, 0x2e, 0x3b, 0x441, 0x430, 0x444, 0x2e, 0x3b, 0x440, 0x430, 0x431, 0x2e, 0x20, 0x49, 0x3b, 0x440, 0x430, 0x431,
-0x2e, 0x20, 0x49, 0x49, 0x3b, 0x434, 0x436, 0x443, 0x43c, 0x2e, 0x20, 0x49, 0x3b, 0x434, 0x436, 0x443, 0x43c, 0x2e, 0x20, 0x49,
-0x49, 0x3b, 0x440, 0x430, 0x434, 0x436, 0x2e, 0x3b, 0x448, 0x430, 0x430, 0x431, 0x2e, 0x3b, 0x440, 0x430, 0x43c, 0x2e, 0x3b, 0x448,
-0x430, 0x432, 0x2e, 0x3b, 0x437, 0x443, 0x43b, 0x44c, 0x2d, 0x43a, 0x2e, 0x3b, 0x437, 0x443, 0x43b, 0x44c, 0x2d, 0x445, 0x2e, 0x6d,
-0x75, 0x68, 0x61, 0x72, 0x72, 0x61, 0x6d, 0x3b, 0x73, 0x61, 0x66, 0x61, 0x72, 0x3b, 0x72, 0x61, 0x62, 0x69, 0x2bb, 0x20,
-0x49, 0x3b, 0x72, 0x61, 0x62, 0x69, 0x2bb, 0x20, 0x49, 0x49, 0x3b, 0x6a, 0x75, 0x6d, 0x61, 0x64, 0x61, 0x20, 0x49, 0x3b,
-0x6a, 0x75, 0x6d, 0x61, 0x64, 0x61, 0x20, 0x49, 0x49, 0x3b, 0x72, 0x61, 0x6a, 0x61, 0x62, 0x3b, 0x73, 0x68, 0x61, 0x62,
-0x61, 0x6e, 0x3b, 0x72, 0x61, 0x6d, 0x61, 0x64, 0x61, 0x6e, 0x3b, 0x73, 0x68, 0x61, 0x77, 0x77, 0x61, 0x6c, 0x3b, 0x64,
-0x68, 0x75, 0x2bb, 0x6c, 0x2d, 0x71, 0x69, 0x2bb, 0x64, 0x61, 0x68, 0x3b, 0x64, 0x68, 0x75, 0x2bb, 0x6c, 0x2d, 0x68, 0x69,
-0x6a, 0x6a, 0x61, 0x68, 0x4d, 0x75, 0x68, 0x61, 0x72, 0x65, 0x6d, 0x3b, 0x53, 0x61, 0x66, 0x65, 0x72, 0x3b, 0x52, 0x65,
-0x62, 0x69, 0x20, 0x31, 0x3b, 0x52, 0x65, 0x62, 0x69, 0x20, 0x32, 0x3b, 0x44, 0x17e, 0x75, 0x6d, 0x61, 0x64, 0x65, 0x20,
-0x31, 0x3b, 0x44, 0x17e, 0x75, 0x6d, 0x61, 0x64, 0x65, 0x20, 0x32, 0x3b, 0x52, 0x65, 0x64, 0x17e, 0x65, 0x62, 0x3b, 0x160,
-0x61, 0x2bb, 0x62, 0x61, 0x6e, 0x3b, 0x52, 0x61, 0x6d, 0x61, 0x7a, 0x61, 0x6e, 0x3b, 0x160, 0x65, 0x76, 0x61, 0x6c, 0x3b,
-0x5a, 0x75, 0x6c, 0x2d, 0x6b, 0x61, 0x64, 0x65, 0x3b, 0x5a, 0x75, 0x6c, 0x2d, 0x68, 0x69, 0x64, 0x17e, 0x65, 0x4d, 0x75,
-0x72, 0x61, 0x68, 0x61, 0x6d, 0x3b, 0x53, 0x61, 0x66, 0x61, 0x72, 0x3b, 0x52, 0x61, 0x62, 0x69, 0x2bb, 0x20, 0x49, 0x3b,
-0x52, 0x61, 0x62, 0x69, 0x2bb, 0x20, 0x49, 0x49, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x64, 0x61, 0x20, 0x49, 0x3b, 0x4a, 0x75,
-0x6d, 0x61, 0x64, 0x61, 0x20, 0x49, 0x49, 0x3b, 0x52, 0x61, 0x111, 0x61, 0x62, 0x3b, 0x160, 0x61, 0x2bb, 0x62, 0x61, 0x6e,
-0x3b, 0x52, 0x61, 0x6d, 0x61, 0x64, 0x61, 0x6e, 0x3b, 0x160, 0x61, 0x76, 0x61, 0x6c, 0x3b, 0x44, 0x75, 0x2bb, 0x6c, 0x2d,
-0x4b, 0x69, 0x2bb, 0x64, 0x61, 0x3b, 0x44, 0x75, 0x2bb, 0x6c, 0x2d, 0x68, 0x69, 0x111, 0x61, 0x4d, 0x75, 0x68, 0x2e, 0x3b,
-0x53, 0x61, 0x66, 0x2e, 0x3b, 0x52, 0x65, 0x62, 0x2e, 0x20, 0x31, 0x3b, 0x52, 0x65, 0x62, 0x2e, 0x20, 0x32, 0x3b, 0x44,
-0x17e, 0x75, 0x6d, 0x2e, 0x20, 0x31, 0x3b, 0x44, 0x17e, 0x75, 0x6d, 0x2e, 0x20, 0x32, 0x3b, 0x52, 0x65, 0x64, 0x17e, 0x2e,
-0x3b, 0x160, 0x61, 0x2e, 0x3b, 0x52, 0x61, 0x6d, 0x2e, 0x3b, 0x160, 0x65, 0x2e, 0x3b, 0x5a, 0x75, 0x6c, 0x2d, 0x6b, 0x2e,
-0x3b, 0x5a, 0x75, 0x6c, 0x2d, 0x68, 0x2e, 0x645, 0x62d, 0x631, 0x645, 0x3b, 0x635, 0x641, 0x631, 0x3b, 0x631, 0x628, 0x64a, 0x639,
-0x20, 0x627, 0x644, 0x627, 0x648, 0x644, 0x3b, 0x631, 0x628, 0x6cc, 0x639, 0x20, 0x627, 0x644, 0x627, 0x62e, 0x631, 0x3b, 0x62c, 0x645,
-0x627, 0x62f, 0x6cc, 0x20, 0x627, 0x644, 0x627, 0x648, 0x644, 0x3b, 0x62c, 0x645, 0x627, 0x62f, 0x64a, 0x20, 0x627, 0x644, 0x627, 0x62e,
-0x631, 0x3b, 0x631, 0x62c, 0x628, 0x3b, 0x634, 0x639, 0x628, 0x627, 0x646, 0x3b, 0x631, 0x645, 0x636, 0x627, 0x646, 0x3b, 0x634, 0x648,
-0x627, 0x644, 0x3b, 0x630, 0x648, 0x627, 0x644, 0x642, 0x639, 0x62f, 0x3b, 0x630, 0x648, 0x627, 0x644, 0x62d, 0x62c, 0x6c1, 0x61, 0x6c,
-0x2d, 0x6d, 0x75, 0x68, 0x61, 0x72, 0x72, 0x61, 0x6d, 0x3b, 0x73, 0x61, 0x66, 0x61, 0x72, 0x3b, 0x72, 0x61, 0x62, 0xed,
-0xb4, 0x20, 0x61, 0x6c, 0x2d, 0x61, 0x76, 0x76, 0x61, 0x6c, 0x3b, 0x72, 0x61, 0x62, 0xed, 0xb4, 0x61, 0x74, 0x68, 0x2d,
-0x74, 0x68, 0xe1, 0x6e, 0xed, 0x3b, 0x64, 0x17e, 0x75, 0x6d, 0xe1, 0x64, 0xe1, 0x20, 0x6c, 0x2d, 0xfa, 0x6c, 0xe1, 0x3b,
-0x64, 0x17e, 0x75, 0x6d, 0xe1, 0x64, 0xe1, 0x20, 0x6c, 0x2d, 0xe1, 0x63, 0x68, 0x69, 0x72, 0x61, 0x3b, 0x72, 0x61, 0x64,
-0x17e, 0x61, 0x62, 0x3b, 0x161, 0x61, 0xb4, 0x20, 0x62, 0xe1, 0x6e, 0x3b, 0x72, 0x61, 0x6d, 0x61, 0x64, 0xe1, 0x6e, 0x3b,
-0x161, 0x61, 0x75, 0x76, 0xe1, 0x6c, 0x3b, 0x64, 0x68, 0xfa, 0x20, 0x6c, 0x2d, 0x6b, 0x61, 0xb4, 0x20, 0x64, 0x61, 0x3b,
-0x64, 0x68, 0xfa, 0x20, 0x6c, 0x2d, 0x68, 0x69, 0x64, 0x17e, 0x64, 0x17e, 0x61, 0x6d, 0x75, 0x68, 0x2e, 0x3b, 0x73, 0x61,
-0x66, 0x2e, 0x3b, 0x72, 0x61, 0x62, 0x2e, 0x20, 0x49, 0x3b, 0x72, 0x61, 0x62, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x64, 0x17e,
-0x75, 0x6d, 0x2e, 0x20, 0x49, 0x3b, 0x64, 0x17e, 0x75, 0x6d, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x72, 0x61, 0x64, 0x2e, 0x3b,
-0x161, 0x61, 0x2e, 0x3b, 0x72, 0x61, 0x6d, 0x2e, 0x3b, 0x161, 0x61, 0x75, 0x2e, 0x3b, 0x64, 0x68, 0xfa, 0x20, 0x6c, 0x2d,
-0x6b, 0x2e, 0x3b, 0x64, 0x68, 0xfa, 0x20, 0x6c, 0x2d, 0x68, 0x2e, 0x4d, 0x75, 0x78, 0x61, 0x72, 0x72, 0x61, 0x6d, 0x3b,
-0x53, 0x61, 0x66, 0x61, 0x72, 0x3b, 0x52, 0x61, 0x62, 0x69, 0x63, 0x20, 0x61, 0x6c, 0x2d, 0x61, 0x77, 0x77, 0x61, 0x6c,
-0x3b, 0x52, 0x61, 0x62, 0x69, 0x63, 0x20, 0x61, 0x6c, 0x2d, 0x74, 0x68, 0x61, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6d, 0x61,
-0x64, 0x61, 0x20, 0x61, 0x6c, 0x2d, 0x61, 0x77, 0x77, 0x61, 0x6c, 0x3b, 0x6a, 0x75, 0x6d, 0x61, 0x64, 0x61, 0x20, 0x61,
-0x6c, 0x2d, 0x74, 0x68, 0x61, 0x6e, 0x69, 0x3b, 0x52, 0x61, 0x6a, 0x61, 0x62, 0x3b, 0x53, 0x68, 0x61, 0x63, 0x62, 0x61,
-0x6e, 0x3b, 0x52, 0x61, 0x6d, 0x61, 0x64, 0x61, 0x6e, 0x3b, 0x53, 0x68, 0x61, 0x77, 0x77, 0x61, 0x6c, 0x3b, 0x44, 0x75,
-0x6c, 0x20, 0x61, 0x6c, 0x2d, 0x71, 0x61, 0x63, 0x64, 0x61, 0x68, 0x3b, 0x44, 0x75, 0x6c, 0x20, 0x78, 0x69, 0x6a, 0x6a,
-0x61, 0x68, 0x4d, 0x75, 0x78, 0x61, 0x72, 0x72, 0x61, 0x6d, 0x3b, 0x53, 0x61, 0x66, 0x61, 0x72, 0x3b, 0x52, 0x61, 0x62,
-0x69, 0x63, 0x20, 0x61, 0x6c, 0x2d, 0x61, 0x77, 0x77, 0x61, 0x6c, 0x3b, 0x52, 0x61, 0x62, 0x69, 0x63, 0x20, 0x61, 0x6c,
-0x2d, 0x74, 0x68, 0x61, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x64, 0x61, 0x20, 0x61, 0x6c, 0x2d, 0x61, 0x77, 0x77,
-0x61, 0x6c, 0x3b, 0x6a, 0x75, 0x6d, 0x61, 0x64, 0x61, 0x20, 0x61, 0x6c, 0x2d, 0x74, 0x68, 0x61, 0x6e, 0x69, 0x3b, 0x52,
-0x61, 0x6a, 0x61, 0x62, 0x3b, 0x53, 0x68, 0x61, 0x63, 0x62, 0x61, 0x6e, 0x3b, 0x52, 0x61, 0x6d, 0x61, 0x64, 0x61, 0x6e,
-0x3b, 0x53, 0x68, 0x61, 0x77, 0x77, 0x61, 0x6c, 0x3b, 0x44, 0x75, 0x6c, 0x20, 0x61, 0x6c, 0x2d, 0x71, 0x61, 0x63, 0x64,
-0x61, 0x3b, 0x44, 0x75, 0x6c, 0x20, 0x78, 0x69, 0x6a, 0x6a, 0x61, 0x68, 0x4d, 0x75, 0x78, 0x2e, 0x3b, 0x53, 0x61, 0x66,
-0x2e, 0x3b, 0x52, 0x61, 0x62, 0x2e, 0x20, 0x49, 0x3b, 0x52, 0x61, 0x62, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x4a, 0x75, 0x6d,
-0x2e, 0x20, 0x49, 0x3b, 0x4a, 0x75, 0x6d, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x52, 0x61, 0x6a, 0x2e, 0x3b, 0x53, 0x68, 0x61,
-0x2e, 0x3b, 0x52, 0x61, 0x6d, 0x2e, 0x3b, 0x53, 0x68, 0x61, 0x77, 0x2e, 0x3b, 0x44, 0x75, 0x6c, 0x2d, 0x51, 0x2e, 0x3b,
-0x44, 0x75, 0x6c, 0x2d, 0x58, 0x2e, 0x4d, 0x75, 0x78, 0x2e, 0x3b, 0x53, 0x61, 0x66, 0x2e, 0x3b, 0x52, 0x61, 0x62, 0x2e,
-0x20, 0x49, 0x3b, 0x52, 0x61, 0x62, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x4a, 0x75, 0x6d, 0x2e, 0x20, 0x49, 0x3b, 0x4a, 0x75,
-0x6d, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x52, 0x61, 0x6a, 0x2e, 0x3b, 0x53, 0x68, 0x61, 0x2e, 0x3b, 0x52, 0x61, 0x6d, 0x2e,
-0x3b, 0x53, 0x68, 0x61, 0x77, 0x2e, 0x3b, 0x44, 0x75, 0x6c, 0x2019, 0x2d, 0x51, 0x69, 0x63, 0x64, 0x61, 0x2e, 0x3b, 0x44,
-0x68, 0x75, 0x2bb, 0x6c, 0x2d, 0x48, 0x2e, 0x6d, 0x75, 0x68, 0x61, 0x72, 0x72, 0x61, 0x6d, 0x3b, 0x73, 0x61, 0x66, 0x61,
-0x72, 0x3b, 0x72, 0x61, 0x62, 0x69, 0x2bb, 0x20, 0x49, 0x3b, 0x72, 0x61, 0x62, 0x69, 0x2bb, 0x20, 0x49, 0x49, 0x3b, 0x6a,
-0x75, 0x6d, 0x61, 0x64, 0x61, 0x20, 0x49, 0x3b, 0x6a, 0x75, 0x6d, 0x61, 0x64, 0x61, 0x20, 0x49, 0x49, 0x3b, 0x72, 0x61,
-0x6a, 0x61, 0x62, 0x3b, 0x73, 0x68, 0x61, 0x2bb, 0x62, 0x61, 0x6e, 0x3b, 0x72, 0x61, 0x6d, 0x61, 0x64, 0xe1, 0x6e, 0x3b,
-0x73, 0x68, 0x61, 0x77, 0x77, 0x61, 0x6c, 0x3b, 0x64, 0x68, 0x75, 0x2bb, 0x6c, 0x2d, 0x71, 0x69, 0x2bb, 0x64, 0x61, 0x68,
-0x3b, 0x64, 0x68, 0x75, 0x2bb, 0x6c, 0x2d, 0x68, 0x69, 0x6a, 0x6a, 0x61, 0x68, 0x4d, 0x75, 0x68, 0x61, 0x72, 0x72, 0x61,
-0x6d, 0x3b, 0x53, 0x61, 0x66, 0x61, 0x72, 0x3b, 0x52, 0x61, 0x62, 0x69, 0x2019, 0x20, 0x61, 0x6c, 0x2d, 0x61, 0x77, 0x77,
-0x61, 0x6c, 0x3b, 0x52, 0x61, 0x62, 0x69, 0x2019, 0x20, 0x61, 0x6c, 0x2d, 0x61, 0x6b, 0x68, 0x69, 0x72, 0x3b, 0x4a, 0x75,
-0x6d, 0x61, 0x64, 0x61, 0x2d, 0x6c, 0x2d, 0x75, 0x6c, 0x61, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x64, 0x61, 0x2d, 0x6c, 0x2d,
-0x61, 0x6b, 0x68, 0x69, 0x72, 0x61, 0x3b, 0x52, 0x61, 0x6a, 0x61, 0x62, 0x3b, 0x53, 0x68, 0x61, 0x2019, 0x62, 0x61, 0x6e,
-0x3b, 0x52, 0x61, 0x6d, 0x61, 0x64, 0x61, 0x6e, 0x3b, 0x53, 0x68, 0x61, 0x77, 0x77, 0x61, 0x6c, 0x3b, 0x44, 0x68, 0x75,
-0x2d, 0x6c, 0x2d, 0x67, 0x61, 0x2019, 0x64, 0x61, 0x3b, 0x44, 0x68, 0x75, 0x2d, 0x6c, 0x2d, 0x68, 0x69, 0x6a, 0x6a, 0x61,
-0x6d, 0x75, 0x68, 0x61, 0x72, 0x72, 0x61, 0x6d, 0x3b, 0x73, 0x61, 0x66, 0x61, 0x72, 0x3b, 0x72, 0x61, 0x62, 0x69, 0x2019,
-0x20, 0x61, 0x6c, 0x2d, 0x61, 0x77, 0x77, 0x61, 0x6c, 0x3b, 0x72, 0x61, 0x62, 0x69, 0x2019, 0x20, 0x61, 0x6c, 0x2d, 0x61,
-0x6b, 0x68, 0x69, 0x72, 0x3b, 0x6a, 0x75, 0x6d, 0x61, 0x64, 0x61, 0x2d, 0x6c, 0x2d, 0x75, 0x6c, 0x61, 0x3b, 0x6a, 0x75,
-0x6d, 0x61, 0x64, 0x61, 0x2d, 0x6c, 0x2d, 0x61, 0x6b, 0x68, 0x69, 0x72, 0x61, 0x3b, 0x72, 0x61, 0x6a, 0x61, 0x62, 0x3b,
-0x73, 0x68, 0x61, 0x2019, 0x62, 0x61, 0x6e, 0x3b, 0x72, 0x61, 0x6d, 0x61, 0x64, 0x61, 0x6e, 0x3b, 0x73, 0x68, 0x61, 0x77,
-0x77, 0x61, 0x6c, 0x3b, 0x64, 0x68, 0x75, 0x2d, 0x6c, 0x2d, 0x67, 0x61, 0x2019, 0x64, 0x61, 0x3b, 0x64, 0x68, 0x75, 0x2d,
-0x6c, 0x2d, 0x68, 0x69, 0x6a, 0x6a, 0x61, 0x43c, 0x443, 0x4b3, 0x430, 0x440, 0x440, 0x430, 0x43c, 0x3b, 0x441, 0x430, 0x444, 0x430,
-0x440, 0x3b, 0x420, 0x430, 0x431, 0x435, 0x44a, 0x20, 0x49, 0x3b, 0x420, 0x430, 0x431, 0x435, 0x44a, 0x20, 0x49, 0x49, 0x3b, 0x4b7,
-0x438, 0x43c, 0x43e, 0x434, 0x438, 0x2d, 0x443, 0x43b, 0x2d, 0x443, 0x43b, 0x43e, 0x3b, 0x4b7, 0x438, 0x43c, 0x43e, 0x434, 0x438, 0x2d,
-0x443, 0x43b, 0x2d, 0x441, 0x43e, 0x43d, 0x438, 0x3b, 0x440, 0x430, 0x4b7, 0x430, 0x431, 0x3b, 0x428, 0x430, 0x431, 0x430, 0x43d, 0x3b,
-0x420, 0x430, 0x43c, 0x430, 0x434, 0x430, 0x43d, 0x3b, 0x428, 0x430, 0x432, 0x432, 0x430, 0x43b, 0x3b, 0x414, 0x445, 0x443, 0x43b, 0x2d,
-0x49a, 0x438, 0x434, 0x430, 0x4b3, 0x3b, 0x414, 0x445, 0x443, 0x43b, 0x2d, 0x4b2, 0x438, 0x4b7, 0x4b7, 0x430, 0x4b3, 0x43c, 0x443, 0x4b3,
-0x430, 0x440, 0x440, 0x430, 0x43c, 0x3b, 0x441, 0x430, 0x444, 0x430, 0x440, 0x3b, 0x420, 0x430, 0x431, 0x435, 0x44a, 0x20, 0x49, 0x3b,
-0x420, 0x430, 0x431, 0x435, 0x44a, 0x20, 0x49, 0x49, 0x3b, 0x4b7, 0x438, 0x43c, 0x43e, 0x434, 0x438, 0x2d, 0x443, 0x43b, 0x2d, 0x443,
-0x43b, 0x43e, 0x3b, 0x4b7, 0x438, 0x43c, 0x43e, 0x434, 0x438, 0x2d, 0x443, 0x43b, 0x2d, 0x441, 0x43e, 0x43d, 0x438, 0x3b, 0x440, 0x430,
-0x4b7, 0x430, 0x431, 0x3b, 0x428, 0x430, 0x431, 0x430, 0x43d, 0x3b, 0x420, 0x430, 0x43c, 0x430, 0x434, 0x430, 0x43d, 0x3b, 0x428, 0x430,
-0x432, 0x432, 0x430, 0x43b, 0x3b, 0x414, 0x445, 0x443, 0x442, 0x2d, 0x49a, 0x438, 0x434, 0x430, 0x4b3, 0x3b, 0x414, 0x445, 0x443, 0x442,
-0x2d, 0x4b2, 0x438, 0x4b7, 0x4b7, 0x430, 0x4b3, 0x41c, 0x443, 0x4b3, 0x2e, 0x3b, 0x421, 0x430, 0x444, 0x2e, 0x3b, 0x420, 0x430, 0x431,
-0x2e, 0x20, 0x49, 0x3b, 0x420, 0x430, 0x431, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x4b6, 0x443, 0x43c, 0x2e, 0x20, 0x49, 0x3b, 0x4b6,
-0x443, 0x43c, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x420, 0x430, 0x4b7, 0x2e, 0x3b, 0x428, 0x430, 0x2e, 0x3b, 0x420, 0x430, 0x43c, 0x2e,
-0x3b, 0x428, 0x430, 0x432, 0x2e, 0x3b, 0x414, 0x445, 0x443, 0x43b, 0x2d, 0x49a, 0x2e, 0x3b, 0x414, 0x445, 0x443, 0x43b, 0x2d, 0x4b2,
-0x2e, 0xbae, 0xbc1, 0xbb9, 0xbb0, 0xbcd, 0xbb0, 0xbae, 0xbcd, 0x3b, 0xb9a, 0xb83, 0xbaa, 0xbb0, 0xbcd, 0x3b, 0xbb0, 0xbaa, 0xbbf, 0x20,
-0x31, 0x3b, 0xbb0, 0xbaa, 0xbbf, 0x20, 0x32, 0x3b, 0xb9c, 0xbc1, 0xbae, 0xba4, 0xbbe, 0x20, 0x31, 0x3b, 0xb9c, 0xbc1, 0xbae, 0xba4,
-0xbbe, 0x20, 0x32, 0x3b, 0xbb0, 0xb9c, 0xbaa, 0xbcd, 0x3b, 0xbb7, 0xb83, 0xbaa, 0xbbe, 0xba9, 0xbcd, 0x3b, 0xbb0, 0xbae, 0xbb2, 0xbbe,
-0xba9, 0xbcd, 0x3b, 0xbb7, 0xbb5, 0xbcd, 0xbb5, 0xbbe, 0xbb2, 0xbcd, 0x3b, 0xba4, 0xbc1, 0xbb2, 0xbcd, 0x20, 0xb95, 0xb83, 0xba4, 0xbbe,
-0x3b, 0xba4, 0xbc1, 0xbb2, 0xbcd, 0x20, 0xbb9, 0xbbf, 0xb9c, 0xbcd, 0xb9c, 0xbbe, 0xbae, 0xbc1, 0xbb9, 0x2e, 0x3b, 0xb9a, 0xb83, 0xbaa,
-0x2e, 0x3b, 0xbb0, 0xbaa, 0xbbf, 0x20, 0x31, 0x3b, 0xbb0, 0xbaa, 0xbbf, 0x20, 0x32, 0x3b, 0xb9c, 0xbc1, 0xbae, 0x2e, 0x20, 0x31,
-0x3b, 0xb9c, 0xbc1, 0xbae, 0x2e, 0x20, 0x32, 0x3b, 0xbb0, 0xb9c, 0x2e, 0x3b, 0xbb7, 0xb83, 0x2e, 0x3b, 0xbb0, 0xbae, 0x2e, 0x3b,
-0xbb7, 0xbb5, 0xbcd, 0x2e, 0x3b, 0xba4, 0xbc1, 0xbb2, 0xbcd, 0x20, 0xb95, 0xb83, 0x2e, 0x3b, 0xba4, 0xbc1, 0xbb2, 0xbcd, 0x20, 0xbb9,
-0xbbf, 0xb9c, 0xbcd, 0x2e, 0xc2e, 0xc41, 0xc39, 0xc30, 0xc4d, 0xc30, 0xc02, 0x3b, 0xc38, 0xc2b, 0xc30, 0xc4d, 0x3b, 0xc30, 0xc2c, 0xc40,
-0x20, 0x49, 0x3b, 0xc30, 0xc2c, 0xc40, 0x20, 0x49, 0x49, 0x3b, 0xc1c, 0xc41, 0xc2e, 0xc26, 0xc3e, 0x20, 0x49, 0x3b, 0xc1c, 0xc41,
-0xc2e, 0xc26, 0xc3e, 0x20, 0x49, 0x49, 0x3b, 0xc30, 0xc1c, 0xc2c, 0xc4d, 0x3b, 0xc37, 0xc2c, 0xc3e, 0xc28, 0xc4d, 0x3b, 0xc30, 0xc02,
-0xc1c, 0xc3e, 0xc28, 0xc4d, 0x3b, 0xc37, 0xc35, 0xc4d, 0xc35, 0xc3e, 0xc32, 0xc4d, 0x3b, 0xc27, 0xc41, 0xc32, 0xc4d, 0x2d, 0xc15, 0xc3f,
-0x20, 0xc26, 0xc3e, 0xc39, 0xc4d, 0x3b, 0xc27, 0xc41, 0xc32, 0xc4d, 0x2d, 0xc39, 0xc3f, 0xc1c, 0xc4d, 0xc1c, 0xc3e, 0xc39, 0xc4d, 0xc2e,
-0xc41, 0xc39, 0x2e, 0x3b, 0xc38, 0xc2b, 0x2e, 0x3b, 0xc30, 0x2e, 0x20, 0x49, 0x3b, 0xc30, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0xc1c,
-0xc41, 0xc2e, 0x2e, 0x20, 0x49, 0x3b, 0xc1c, 0xc41, 0xc2e, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0xc30, 0xc1c, 0x2e, 0x3b, 0xc37, 0xc2c,
-0xc3e, 0x2e, 0x3b, 0xc30, 0xc02, 0xc1c, 0xc3e, 0x2e, 0x3b, 0xc37, 0xc35, 0xc4d, 0xc35, 0xc3e, 0x2e, 0x3b, 0xc27, 0xc41, 0xc32, 0xc4d,
-0x2d, 0xc15, 0xc3f, 0x2e, 0x3b, 0xc27, 0xc41, 0xc32, 0xc4d, 0x2d, 0xc39, 0xc3f, 0x2e, 0xe21, 0xe38, 0xe2e, 0xe30, 0xe23, 0xe4c, 0xe23,
-0xe2d, 0xe21, 0x3b, 0xe0b, 0xe2d, 0xe1f, 0xe32, 0xe23, 0xe4c, 0x3b, 0xe23, 0xe2d, 0xe1a, 0xe35, 0x20, 0x49, 0x3b, 0xe23, 0xe2d, 0xe1a,
-0xe35, 0x20, 0x49, 0x49, 0x3b, 0xe08, 0xe38, 0xe21, 0xe32, 0xe14, 0xe32, 0x20, 0x49, 0x3b, 0xe08, 0xe38, 0xe21, 0xe32, 0xe14, 0xe32,
-0x20, 0x49, 0x49, 0x3b, 0xe23, 0xe2d, 0xe08, 0xe31, 0xe1a, 0x3b, 0xe0a, 0xe30, 0xe2d, 0xe30, 0xe1a, 0xe32, 0xe19, 0x3b, 0xe23, 0xe2d,
-0xe21, 0xe30, 0xe14, 0xe2d, 0xe19, 0x3b, 0xe40, 0xe0a, 0xe32, 0xe27, 0xe31, 0xe25, 0x3b, 0xe0b, 0xe38, 0xe25, 0xe01, 0xe34, 0xe2d, 0xe3a,
-0xe14, 0xe30, 0xe2e, 0xe3a, 0x3b, 0xe0b, 0xe38, 0xe25, 0xe2b, 0xe34, 0xe08, 0xe0d, 0xe30, 0xe2e, 0xe3a, 0xe21, 0xe38, 0xe2e, 0xe31, 0xe23,
-0x2e, 0x3b, 0xe40, 0xe28, 0xe32, 0xe30, 0x2e, 0x3b, 0xe23, 0xe2d, 0xe1a, 0xe35, 0x20, 0x49, 0x3b, 0xe23, 0xe2d, 0xe1a, 0xe35, 0x20,
-0x49, 0x49, 0x3b, 0xe08, 0xe38, 0xe21, 0xe32, 0xe14, 0xe32, 0x20, 0x49, 0x3b, 0xe08, 0xe38, 0xe21, 0xe32, 0xe14, 0xe32, 0x20, 0x49,
-0x49, 0x3b, 0xe40, 0xe23, 0xe32, 0xe30, 0x2e, 0x3b, 0xe0a, 0xe30, 0xe2d, 0xe4c, 0x2e, 0x3b, 0xe40, 0xe23, 0xe32, 0xe30, 0xe21, 0xe30,
-0x2e, 0x3b, 0xe40, 0xe0a, 0xe32, 0xe27, 0x2e, 0x3b, 0xe0b, 0xe38, 0xe25, 0xe01, 0xe34, 0xe2d, 0xe3a, 0x2e, 0x3b, 0xe0b, 0xe38, 0xe25,
-0xe2b, 0xe34, 0xe08, 0x2e, 0x4d, 0x75, 0x68, 0x61, 0x6c, 0x61, 0x6d, 0x69, 0x3b, 0x53, 0x61, 0x66, 0x61, 0x6c, 0x69, 0x3b,
-0x4c, 0x61, 0x70, 0x12b, 0x20, 0x49, 0x3b, 0x4c, 0x61, 0x70, 0x12b, 0x20, 0x49, 0x49, 0x3b, 0x53, 0x75, 0x6d, 0x61, 0x74,
-0x101, 0x20, 0x49, 0x3b, 0x53, 0x75, 0x6d, 0x61, 0x74, 0x101, 0x20, 0x49, 0x49, 0x3b, 0x4c, 0x61, 0x73, 0x61, 0x70, 0x69,
-0x3b, 0x53, 0x61, 0x2bb, 0x61, 0x70, 0x101, 0x6e, 0x69, 0x3b, 0x4c, 0x61, 0x6d, 0x61, 0x74, 0x101, 0x6e, 0x69, 0x3b, 0x53,
-0x61, 0x76, 0x101, 0x6c, 0x69, 0x3b, 0x53, 0x16b, 0x2d, 0x6b, 0x61, 0x2bb, 0x61, 0x74, 0x61, 0x3b, 0x53, 0x16b, 0x2d, 0x68,
-0x69, 0x73, 0x61, 0x4d, 0x75, 0x68, 0x3b, 0x53, 0x61, 0x66, 0x3b, 0x4c, 0x61, 0x70, 0x20, 0x49, 0x3b, 0x4c, 0x61, 0x70,
-0x20, 0x49, 0x49, 0x3b, 0x53, 0x75, 0x6d, 0x20, 0x49, 0x3b, 0x53, 0x75, 0x6d, 0x20, 0x49, 0x49, 0x3b, 0x4c, 0x61, 0x73,
-0x3b, 0x53, 0x61, 0x2bb, 0x61, 0x3b, 0x4c, 0x61, 0x6d, 0x3b, 0x53, 0x61, 0x76, 0x3b, 0x53, 0x16b, 0x2d, 0x6b, 0x3b, 0x53,
-0x16b, 0x2d, 0x68, 0x4d, 0x75, 0x68, 0x61, 0x72, 0x72, 0x65, 0x6d, 0x3b, 0x53, 0x61, 0x66, 0x65, 0x72, 0x3b, 0x52, 0x65,
-0x62, 0x69, 0xfc, 0x6c, 0x65, 0x76, 0x76, 0x65, 0x6c, 0x3b, 0x52, 0x65, 0x62, 0x69, 0xfc, 0x6c, 0x61, 0x68, 0x69, 0x72,
-0x3b, 0x43, 0x65, 0x6d, 0x61, 0x7a, 0x69, 0x79, 0x65, 0x6c, 0x65, 0x76, 0x76, 0x65, 0x6c, 0x3b, 0x43, 0x65, 0x6d, 0x61,
-0x7a, 0x69, 0x79, 0x65, 0x6c, 0x61, 0x68, 0x69, 0x72, 0x3b, 0x52, 0x65, 0x63, 0x65, 0x70, 0x3b, 0x15e, 0x61, 0x62, 0x61,
-0x6e, 0x3b, 0x52, 0x61, 0x6d, 0x61, 0x7a, 0x61, 0x6e, 0x3b, 0x15e, 0x65, 0x76, 0x76, 0x61, 0x6c, 0x3b, 0x5a, 0x69, 0x6c,
-0x6b, 0x61, 0x64, 0x65, 0x3b, 0x5a, 0x69, 0x6c, 0x68, 0x69, 0x63, 0x63, 0x65, 0x4d, 0x75, 0x68, 0x61, 0x72, 0x2e, 0x3b,
-0x53, 0x61, 0x66, 0x65, 0x72, 0x3b, 0x52, 0x2e, 0x65, 0x76, 0x76, 0x65, 0x6c, 0x3b, 0x52, 0x2e, 0x61, 0x68, 0x69, 0x72,
-0x3b, 0x43, 0x2e, 0x65, 0x76, 0x76, 0x65, 0x6c, 0x3b, 0x43, 0x2e, 0x61, 0x68, 0x69, 0x72, 0x3b, 0x52, 0x65, 0x63, 0x65,
-0x70, 0x3b, 0x15e, 0x61, 0x62, 0x61, 0x6e, 0x3b, 0x52, 0x61, 0x6d, 0x2e, 0x3b, 0x15e, 0x65, 0x76, 0x76, 0x61, 0x6c, 0x3b,
-0x5a, 0x69, 0x6c, 0x6b, 0x61, 0x64, 0x65, 0x3b, 0x5a, 0x69, 0x6c, 0x68, 0x69, 0x63, 0x63, 0x65, 0x43c, 0x443, 0x445, 0x430,
-0x440, 0x440, 0x430, 0x43c, 0x3b, 0x441, 0x430, 0x444, 0x430, 0x440, 0x3b, 0x440, 0x430, 0x431, 0x456, 0x20, 0x49, 0x3b, 0x440, 0x430,
-0x431, 0x456, 0x20, 0x49, 0x49, 0x3b, 0x434, 0x436, 0x443, 0x43c, 0x430, 0x434, 0x430, 0x20, 0x49, 0x3b, 0x434, 0x436, 0x443, 0x43c,
-0x430, 0x434, 0x430, 0x20, 0x49, 0x49, 0x3b, 0x440, 0x430, 0x434, 0x436, 0x430, 0x431, 0x3b, 0x448, 0x430, 0x430, 0x431, 0x430, 0x43d,
-0x3b, 0x440, 0x430, 0x43c, 0x430, 0x434, 0x430, 0x43d, 0x3b, 0x434, 0x430, 0x432, 0x432, 0x430, 0x43b, 0x3b, 0x437, 0x443, 0x2d, 0x43b,
-0x44c, 0x2d, 0x43a, 0x430, 0x430, 0x434, 0x430, 0x3b, 0x437, 0x443, 0x2d, 0x43b, 0x44c, 0x2d, 0x445, 0x456, 0x434, 0x436, 0x430, 0x43c,
-0x443, 0x445, 0x3b, 0x441, 0x430, 0x444, 0x3b, 0x440, 0x430, 0x431, 0x456, 0x20, 0x49, 0x3b, 0x440, 0x430, 0x431, 0x456, 0x20, 0x49,
-0x49, 0x3b, 0x434, 0x436, 0x443, 0x43c, 0x20, 0x49, 0x3b, 0x434, 0x436, 0x443, 0x43c, 0x20, 0x49, 0x49, 0x3b, 0x440, 0x430, 0x434,
-0x436, 0x3b, 0x448, 0x430, 0x430, 0x431, 0x3b, 0x440, 0x430, 0x43c, 0x3b, 0x434, 0x430, 0x432, 0x3b, 0x437, 0x443, 0x2d, 0x43b, 0x44c,
-0x2d, 0x43a, 0x3b, 0x437, 0x443, 0x2d, 0x43b, 0x44c, 0x2d, 0x445, 0x43c, 0x443, 0x445, 0x2e, 0x3b, 0x441, 0x430, 0x444, 0x2e, 0x3b,
-0x440, 0x430, 0x431, 0x456, 0x20, 0x49, 0x3b, 0x440, 0x430, 0x431, 0x456, 0x20, 0x49, 0x49, 0x3b, 0x434, 0x436, 0x443, 0x43c, 0x2e,
-0x20, 0x49, 0x3b, 0x434, 0x436, 0x443, 0x43c, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x440, 0x430, 0x434, 0x436, 0x2e, 0x3b, 0x448, 0x430,
-0x430, 0x431, 0x2e, 0x3b, 0x440, 0x430, 0x43c, 0x2e, 0x3b, 0x434, 0x430, 0x432, 0x2e, 0x3b, 0x437, 0x443, 0x2d, 0x43b, 0x44c, 0x2d,
-0x43a, 0x2e, 0x3b, 0x437, 0x443, 0x2d, 0x43b, 0x44c, 0x2d, 0x445, 0x2e, 0x645, 0x62d, 0x631, 0x645, 0x3b, 0x635, 0x641, 0x631, 0x3b,
-0x631, 0x20, 0x628, 0x6cc, 0x639, 0x20, 0x627, 0x644, 0x627, 0x648, 0x644, 0x3b, 0x631, 0x20, 0x628, 0x6cc, 0x639, 0x20, 0x627, 0x644,
-0x62b, 0x627, 0x646, 0x6cc, 0x3b, 0x62c, 0x645, 0x627, 0x62f, 0x6cc, 0x20, 0x627, 0x644, 0x627, 0x648, 0x644, 0x3b, 0x62c, 0x645, 0x627,
-0x62f, 0x6cc, 0x20, 0x627, 0x644, 0x62b, 0x627, 0x646, 0x6cc, 0x3b, 0x631, 0x62c, 0x628, 0x3b, 0x634, 0x639, 0x628, 0x627, 0x646, 0x3b,
-0x631, 0x645, 0x636, 0x627, 0x646, 0x3b, 0x634, 0x648, 0x627, 0x644, 0x3b, 0x630, 0x648, 0x627, 0x644, 0x642, 0x639, 0x62f, 0x6c3, 0x3b,
-0x630, 0x648, 0x627, 0x644, 0x62d, 0x62c, 0x6c3, 0x645, 0x62d, 0x631, 0x645, 0x3b, 0x635, 0x641, 0x631, 0x3b, 0x631, 0x628, 0x6cc, 0x639,
-0x20, 0x627, 0x644, 0x627, 0x648, 0x651, 0x644, 0x3b, 0x631, 0x628, 0x6cc, 0x639, 0x20, 0x627, 0x644, 0x62b, 0x651, 0x627, 0x646, 0x6cc,
-0x3b, 0x62c, 0x645, 0x627, 0x62f, 0x6cc, 0x20, 0x627, 0x644, 0x627, 0x648, 0x651, 0x644, 0x3b, 0x62c, 0x645, 0x627, 0x62f, 0x6cc, 0x20,
-0x627, 0x644, 0x62b, 0x651, 0x627, 0x646, 0x6cc, 0x3b, 0x631, 0x62c, 0x628, 0x3b, 0x634, 0x639, 0x628, 0x627, 0x646, 0x3b, 0x631, 0x645,
-0x636, 0x627, 0x646, 0x3b, 0x634, 0x648, 0x627, 0x644, 0x3b, 0x630, 0x648, 0x627, 0x644, 0x642, 0x639, 0x62f, 0x6c3, 0x3b, 0x630, 0x648,
-0x627, 0x644, 0x62d, 0x62c, 0x6c3, 0x645, 0x62d, 0x631, 0x645, 0x3b, 0x635, 0x641, 0x631, 0x3b, 0x631, 0x628, 0x6cc, 0x639, 0x20, 0x627,
-0x644, 0x627, 0x648, 0x651, 0x644, 0x3b, 0x631, 0x628, 0x6cc, 0x639, 0x20, 0x627, 0x644, 0x62b, 0x627, 0x646, 0x6cc, 0x3b, 0x62c, 0x645,
-0x627, 0x62f, 0x6cc, 0x20, 0x627, 0x644, 0x627, 0x648, 0x651, 0x644, 0x3b, 0x62c, 0x645, 0x627, 0x62f, 0x6cc, 0x20, 0x627, 0x644, 0x62b,
-0x627, 0x646, 0x6cc, 0x3b, 0x631, 0x62c, 0x628, 0x3b, 0x634, 0x639, 0x628, 0x627, 0x646, 0x3b, 0x631, 0x645, 0x636, 0x627, 0x646, 0x3b,
-0x634, 0x648, 0x627, 0x644, 0x3b, 0x630, 0x648, 0x627, 0x644, 0x642, 0x639, 0x62f, 0x6c3, 0x3b, 0x630, 0x648, 0x627, 0x644, 0x62d, 0x62c,
-0x6c3, 0x645, 0x6c7, 0x6be, 0x6d5, 0x631, 0x631, 0x6d5, 0x645, 0x3b, 0x633, 0x6d5, 0x67e, 0x6d5, 0x631, 0x3b, 0x631, 0x6d5, 0x628, 0x649,
-0x626, 0x6c7, 0x644, 0x626, 0x6d5, 0x6cb, 0x6cb, 0x6d5, 0x644, 0x3b, 0x631, 0x6d5, 0x628, 0x649, 0x626, 0x6c7, 0x644, 0x626, 0x627, 0x62e,
-0x649, 0x631, 0x3b, 0x62c, 0x6d5, 0x645, 0x627, 0x62f, 0x649, 0x64a, 0x6d5, 0x644, 0x626, 0x6d5, 0x6cb, 0x6cb, 0x6d5, 0x644, 0x3b, 0x62c,
-0x6d5, 0x645, 0x627, 0x62f, 0x649, 0x64a, 0x6d5, 0x644, 0x626, 0x627, 0x62e, 0x649, 0x631, 0x3b, 0x631, 0x6d5, 0x62c, 0x6d5, 0x628, 0x3b,
-0x634, 0x6d5, 0x626, 0x628, 0x627, 0x646, 0x3b, 0x631, 0x627, 0x645, 0x649, 0x632, 0x627, 0x646, 0x3b, 0x634, 0x6d5, 0x6cb, 0x6cb, 0x627,
-0x644, 0x3b, 0x632, 0x6c7, 0x644, 0x642, 0x6d5, 0x626, 0x62f, 0x6d5, 0x3b, 0x632, 0x6c7, 0x644, 0x6be, 0x6d5, 0x62c, 0x62c, 0x6d5, 0x4d,
-0x75, 0x68, 0x61, 0x72, 0x72, 0x61, 0x6d, 0x3b, 0x53, 0x61, 0x66, 0x61, 0x72, 0x3b, 0x52, 0x6f, 0x62, 0x69, 0x2019, 0x20,
-0x75, 0x6c, 0x2d, 0x61, 0x76, 0x76, 0x61, 0x6c, 0x3b, 0x52, 0x6f, 0x62, 0x69, 0x2019, 0x20, 0x75, 0x6c, 0x2d, 0x6f, 0x78,
-0x69, 0x72, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x64, 0x20, 0x75, 0x6c, 0x2d, 0x61, 0x76, 0x76, 0x61, 0x6c, 0x3b, 0x4a, 0x75,
-0x6d, 0x61, 0x64, 0x20, 0x75, 0x6c, 0x2d, 0x6f, 0x78, 0x69, 0x72, 0x3b, 0x52, 0x61, 0x6a, 0x61, 0x62, 0x3b, 0x53, 0x68,
-0x61, 0x2019, 0x62, 0x6f, 0x6e, 0x3b, 0x52, 0x61, 0x6d, 0x61, 0x7a, 0x6f, 0x6e, 0x3b, 0x53, 0x68, 0x61, 0x76, 0x76, 0x6f,
-0x6c, 0x3b, 0x5a, 0x75, 0x6c, 0x2d, 0x71, 0x61, 0x2019, 0x64, 0x61, 0x3b, 0x5a, 0x75, 0x6c, 0x2d, 0x68, 0x69, 0x6a, 0x6a,
-0x61, 0x4d, 0x75, 0x68, 0x2e, 0x3b, 0x53, 0x61, 0x66, 0x2e, 0x3b, 0x52, 0x6f, 0x62, 0x2e, 0x20, 0x61, 0x76, 0x76, 0x2e,
-0x3b, 0x52, 0x6f, 0x62, 0x2e, 0x20, 0x6f, 0x78, 0x2e, 0x3b, 0x4a, 0x75, 0x6d, 0x2e, 0x20, 0x61, 0x76, 0x76, 0x2e, 0x3b,
-0x4a, 0x75, 0x6d, 0x2e, 0x20, 0x6f, 0x78, 0x2e, 0x3b, 0x52, 0x61, 0x6a, 0x2e, 0x3b, 0x53, 0x68, 0x61, 0x2e, 0x3b, 0x52,
-0x61, 0x6d, 0x2e, 0x3b, 0x53, 0x68, 0x61, 0x76, 0x2e, 0x3b, 0x5a, 0x75, 0x6c, 0x2d, 0x71, 0x2e, 0x3b, 0x5a, 0x75, 0x6c,
-0x2d, 0x68, 0x2e, 0x41c, 0x443, 0x4b3, 0x430, 0x440, 0x440, 0x430, 0x43c, 0x3b, 0x421, 0x430, 0x444, 0x430, 0x440, 0x3b, 0x420, 0x430,
-0x431, 0x438, 0x443, 0x43b, 0x2d, 0x430, 0x432, 0x432, 0x430, 0x43b, 0x3b, 0x420, 0x430, 0x431, 0x438, 0x443, 0x43b, 0x2d, 0x43e, 0x445,
-0x438, 0x440, 0x3b, 0x416, 0x443, 0x43c, 0x43e, 0x434, 0x438, 0x443, 0x43b, 0x2d, 0x443, 0x43b, 0x43e, 0x3b, 0x416, 0x443, 0x43c, 0x43e,
-0x434, 0x438, 0x443, 0x43b, 0x2d, 0x443, 0x445, 0x440, 0x43e, 0x3b, 0x420, 0x430, 0x436, 0x430, 0x431, 0x3b, 0x428, 0x430, 0x44a, 0x431,
-0x43e, 0x43d, 0x3b, 0x420, 0x430, 0x43c, 0x430, 0x437, 0x43e, 0x43d, 0x3b, 0x428, 0x430, 0x432, 0x432, 0x43e, 0x43b, 0x3b, 0x417, 0x438,
-0x43b, 0x2d, 0x49b, 0x430, 0x44a, 0x434, 0x430, 0x3b, 0x417, 0x438, 0x43b, 0x2d, 0x4b3, 0x438, 0x436, 0x436, 0x430
+static constexpr char16_t months_data[] = {
+0x4d, 0x75, 0x68, 0x61, 0x72, 0x72, 0x61, 0x6d, 0x3b, 0x53, 0x61, 0x66,
+0x61, 0x72, 0x3b, 0x52, 0x61, 0x62, 0x69, 0x2bb, 0x20, 0x49, 0x3b, 0x52,
+0x61, 0x62, 0x69, 0x2bb, 0x20, 0x49, 0x49, 0x3b, 0x4a, 0x75, 0x6d, 0x61,
+0x64, 0x61, 0x20, 0x49, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x64, 0x61, 0x20,
+0x49, 0x49, 0x3b, 0x52, 0x61, 0x6a, 0x61, 0x62, 0x3b, 0x53, 0x68, 0x61,
+0x2bb, 0x62, 0x61, 0x6e, 0x3b, 0x52, 0x61, 0x6d, 0x61, 0x64, 0x61, 0x6e,
+0x3b, 0x53, 0x68, 0x61, 0x77, 0x77, 0x61, 0x6c, 0x3b, 0x44, 0x68, 0x75,
+0x2bb, 0x6c, 0x2d, 0x51, 0x69, 0x2bb, 0x64, 0x61, 0x68, 0x3b, 0x44, 0x68,
+0x75, 0x2bb, 0x6c, 0x2d, 0x48, 0x69, 0x6a, 0x6a, 0x61, 0x68, 0x4d, 0x75,
+0x68, 0x2e, 0x3b, 0x53, 0x61, 0x66, 0x2e, 0x3b, 0x52, 0x61, 0x62, 0x2e,
+0x20, 0x49, 0x3b, 0x52, 0x61, 0x62, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x4a,
+0x75, 0x6d, 0x2e, 0x20, 0x49, 0x3b, 0x4a, 0x75, 0x6d, 0x2e, 0x20, 0x49,
+0x49, 0x3b, 0x52, 0x61, 0x6a, 0x2e, 0x3b, 0x53, 0x68, 0x61, 0x2e, 0x3b,
+0x52, 0x61, 0x6d, 0x2e, 0x3b, 0x53, 0x68, 0x61, 0x77, 0x2e, 0x3b, 0x44,
+0x68, 0x75, 0x2bb, 0x6c, 0x2d, 0x51, 0x2e, 0x3b, 0x44, 0x68, 0x75, 0x2bb,
+0x6c, 0x2d, 0x48, 0x2e, 0x31, 0x3b, 0x32, 0x3b, 0x33, 0x3b, 0x34, 0x3b,
+0x35, 0x3b, 0x36, 0x3b, 0x37, 0x3b, 0x38, 0x3b, 0x39, 0x3b, 0x31, 0x30,
+0x3b, 0x31, 0x31, 0x3b, 0x31, 0x32, 0x4d, 0x75, 0x68, 0x61, 0x72, 0x72,
+0x65, 0x6d, 0x3b, 0x53, 0x65, 0x66, 0x65, 0x72, 0x3b, 0x52, 0x65, 0x62,
+0x69, 0x75, 0x6c, 0x2d, 0x65, 0x76, 0x65, 0x6c, 0x3b, 0x52, 0x65, 0x62,
+0x69, 0x75, 0x2d, 0x74, 0x68, 0x65, 0x6e, 0x69, 0x3b, 0x58, 0x68, 0x75,
+0x6d, 0x61, 0x64, 0x65, 0x6c, 0x2d, 0x75, 0x6c, 0x61, 0x3b, 0x58, 0x68,
+0x75, 0x6d, 0x61, 0x64, 0x65, 0x2d, 0x74, 0x68, 0x65, 0x6e, 0x69, 0x3b,
+0x52, 0x65, 0x78, 0x68, 0x65, 0x62, 0x3b, 0x53, 0x68, 0x61, 0x62, 0x61,
+0x6e, 0x3b, 0x52, 0x61, 0x6d, 0x61, 0x7a, 0x61, 0x6e, 0x3b, 0x53, 0x68,
+0x65, 0x76, 0x61, 0x6c, 0x3b, 0x44, 0x68, 0x75, 0x6c, 0x2d, 0x6b, 0x61,
+0x64, 0x65, 0x3b, 0x44, 0x68, 0x75, 0x6c, 0x2d, 0x68, 0x69, 0x78, 0x68,
+0x65, 0x6d, 0x75, 0x68, 0x61, 0x72, 0x72, 0x65, 0x6d, 0x3b, 0x73, 0x65,
+0x66, 0x65, 0x72, 0x3b, 0x72, 0x65, 0x62, 0x69, 0x75, 0x6c, 0x2d, 0x65,
+0x76, 0x65, 0x6c, 0x3b, 0x72, 0x65, 0x62, 0x69, 0x75, 0x2d, 0x74, 0x68,
+0x65, 0x6e, 0x69, 0x3b, 0x78, 0x68, 0x75, 0x6d, 0x61, 0x64, 0x65, 0x6c,
+0x2d, 0x75, 0x6c, 0x61, 0x3b, 0x78, 0x68, 0x75, 0x6d, 0x61, 0x64, 0x65,
+0x2d, 0x74, 0x68, 0x65, 0x6e, 0x69, 0x3b, 0x72, 0x65, 0x78, 0x68, 0x65,
+0x62, 0x3b, 0x73, 0x68, 0x61, 0x62, 0x61, 0x6e, 0x3b, 0x72, 0x61, 0x6d,
+0x61, 0x7a, 0x61, 0x6e, 0x3b, 0x73, 0x68, 0x65, 0x76, 0x61, 0x6c, 0x3b,
+0x64, 0x68, 0x75, 0x6c, 0x2d, 0x6b, 0x61, 0x64, 0x65, 0x3b, 0x64, 0x68,
+0x75, 0x6c, 0x2d, 0x68, 0x69, 0x78, 0x68, 0x65, 0x4d, 0x75, 0x68, 0x2e,
+0x3b, 0x53, 0x65, 0x66, 0x2e, 0x3b, 0x52, 0x65, 0x62, 0x2e, 0x20, 0x49,
+0x3b, 0x52, 0x65, 0x62, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x58, 0x68, 0x75,
+0x6d, 0x2e, 0x20, 0x49, 0x3b, 0x58, 0x68, 0x75, 0x6d, 0x2e, 0x20, 0x49,
+0x49, 0x3b, 0x52, 0x65, 0x78, 0x68, 0x2e, 0x3b, 0x53, 0x68, 0x61, 0x2e,
+0x3b, 0x52, 0x61, 0x6d, 0x2e, 0x3b, 0x53, 0x68, 0x65, 0x76, 0x2e, 0x3b,
+0x44, 0x68, 0x75, 0x6c, 0x2d, 0x6b, 0x2e, 0x3b, 0x44, 0x68, 0x75, 0x6c,
+0x2d, 0x68, 0x2e, 0x6d, 0x75, 0x68, 0x2e, 0x3b, 0x73, 0x65, 0x66, 0x2e,
+0x3b, 0x72, 0x65, 0x62, 0x2e, 0x20, 0x49, 0x3b, 0x72, 0x65, 0x62, 0x2e,
+0x20, 0x49, 0x49, 0x3b, 0x78, 0x68, 0x75, 0x6d, 0x2e, 0x20, 0x49, 0x3b,
+0x78, 0x68, 0x75, 0x6d, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x72, 0x65, 0x78,
+0x68, 0x2e, 0x3b, 0x73, 0x68, 0x61, 0x2e, 0x3b, 0x72, 0x61, 0x6d, 0x2e,
+0x3b, 0x73, 0x68, 0x65, 0x76, 0x2e, 0x3b, 0x64, 0x68, 0x75, 0x6c, 0x2d,
+0x6b, 0x2e, 0x3b, 0x64, 0x68, 0x75, 0x6c, 0x2d, 0x68, 0x2e, 0x1219, 0x1200,
+0x1228, 0x121d, 0x3b, 0x1233, 0x1348, 0x122d, 0x3b, 0x1228, 0x1262, 0x12d1, 0x120d, 0x20,
+0x12a0, 0x12c8, 0x120d, 0x3b, 0x1228, 0x1262, 0x12d1, 0x120d, 0x20, 0x12a0, 0x12ba, 0x122d,
+0x3b, 0x1300, 0x121b, 0x12f0, 0x120d, 0x20, 0x12a0, 0x12c8, 0x120d, 0x3b, 0x1300, 0x121b,
+0x12f0, 0x120d, 0x20, 0x12a0, 0x12ba, 0x122d, 0x3b, 0x1228, 0x1300, 0x1265, 0x3b, 0x123b,
+0x12a5, 0x1263, 0x1295, 0x3b, 0x1228, 0x1218, 0x12f3, 0x1295, 0x3b, 0x1238, 0x12cb, 0x120d,
+0x3b, 0x12d9, 0x120d, 0x1242, 0x12f3, 0x1205, 0x3b, 0x12d9, 0x120d, 0x1202, 0x1303, 0x1205,
+0x645, 0x62d, 0x631, 0x645, 0x3b, 0x635, 0x641, 0x631, 0x3b, 0x631, 0x628, 0x64a,
+0x639, 0x20, 0x627, 0x644, 0x623, 0x648, 0x644, 0x3b, 0x631, 0x628, 0x64a, 0x639,
+0x20, 0x627, 0x644, 0x622, 0x62e, 0x631, 0x3b, 0x62c, 0x645, 0x627, 0x62f, 0x649,
+0x20, 0x627, 0x644, 0x623, 0x648, 0x644, 0x649, 0x3b, 0x62c, 0x645, 0x627, 0x62f,
+0x649, 0x20, 0x627, 0x644, 0x622, 0x62e, 0x631, 0x629, 0x3b, 0x631, 0x62c, 0x628,
+0x3b, 0x634, 0x639, 0x628, 0x627, 0x646, 0x3b, 0x631, 0x645, 0x636, 0x627, 0x646,
+0x3b, 0x634, 0x648, 0x627, 0x644, 0x3b, 0x630, 0x648, 0x20, 0x627, 0x644, 0x642,
+0x639, 0x62f, 0x629, 0x3b, 0x630, 0x648, 0x20, 0x627, 0x644, 0x62d, 0x62c, 0x629,
+0x661, 0x3b, 0x662, 0x3b, 0x663, 0x3b, 0x664, 0x3b, 0x665, 0x3b, 0x666, 0x3b,
+0x667, 0x3b, 0x668, 0x3b, 0x669, 0x3b, 0x661, 0x660, 0x3b, 0x661, 0x661, 0x3b,
+0x661, 0x662, 0x64, 0x65, 0x20, 0x4d, 0x75, 0x68, 0x61, 0x72, 0x72, 0x61,
+0x6d, 0x3b, 0x64, 0x65, 0x20, 0x53, 0x61, 0x66, 0x61, 0x72, 0x3b, 0x64,
+0x65, 0x20, 0x52, 0x61, 0x62, 0x69, 0x2bb, 0x20, 0x49, 0x3b, 0x64, 0x65,
+0x20, 0x52, 0x61, 0x62, 0x69, 0x2bb, 0x20, 0x49, 0x49, 0x3b, 0x64, 0x65,
+0x20, 0x4a, 0x75, 0x6d, 0x61, 0x64, 0x61, 0x20, 0x49, 0x3b, 0x64, 0x65,
+0x20, 0x4a, 0x75, 0x6d, 0x61, 0x64, 0x61, 0x20, 0x49, 0x49, 0x3b, 0x64,
+0x65, 0x20, 0x52, 0x61, 0x6a, 0x61, 0x62, 0x3b, 0x64, 0x65, 0x20, 0x53,
+0x68, 0x61, 0x2bb, 0x62, 0x61, 0x6e, 0x3b, 0x64, 0x65, 0x20, 0x52, 0x61,
+0x6d, 0x61, 0x64, 0x61, 0x6e, 0x3b, 0x64, 0x65, 0x20, 0x53, 0x68, 0x61,
+0x77, 0x77, 0x61, 0x6c, 0x3b, 0x64, 0x65, 0x20, 0x44, 0x68, 0x75, 0x2bb,
+0x6c, 0x2d, 0x51, 0x69, 0x2bb, 0x64, 0x61, 0x68, 0x3b, 0x64, 0x65, 0x20,
+0x44, 0x68, 0x75, 0x2bb, 0x6c, 0x2d, 0x48, 0x69, 0x6a, 0x6a, 0x61, 0x68,
+0x4d, 0x259, 0x68, 0x259, 0x72, 0x72, 0x259, 0x6d, 0x3b, 0x53, 0x259, 0x66,
+0x259, 0x72, 0x3b, 0x52, 0x259, 0x62, 0x69, 0xfc, 0x6c, 0x259, 0x76, 0x76,
+0x259, 0x6c, 0x3b, 0x52, 0x259, 0x62, 0x69, 0xfc, 0x6c, 0x61, 0x78, 0x131,
+0x72, 0x3b, 0x43, 0x259, 0x6d, 0x61, 0x64, 0x69, 0x79, 0x259, 0x6c, 0x259,
+0x76, 0x76, 0x259, 0x6c, 0x3b, 0x43, 0x259, 0x6d, 0x61, 0x64, 0x69, 0x79,
+0x259, 0x6c, 0x61, 0x78, 0x131, 0x72, 0x3b, 0x52, 0x259, 0x63, 0x259, 0x62,
+0x3b, 0x15e, 0x61, 0x62, 0x61, 0x6e, 0x3b, 0x52, 0x61, 0x6d, 0x61, 0x7a,
+0x61, 0x6e, 0x3b, 0x15e, 0x259, 0x76, 0x76, 0x61, 0x6c, 0x3b, 0x5a, 0x69,
+0x6c, 0x71, 0x259, 0x64, 0x259, 0x3b, 0x5a, 0x69, 0x6c, 0x68, 0x69, 0x63,
+0x63, 0x259, 0x4d, 0x259, 0x68, 0x2e, 0x3b, 0x53, 0x259, 0x66, 0x2e, 0x3b,
+0x52, 0x259, 0x62, 0x2e, 0x20, 0x49, 0x3b, 0x52, 0x259, 0x62, 0x2e, 0x20,
+0x49, 0x49, 0x3b, 0x43, 0x259, 0x6d, 0x2e, 0x20, 0x49, 0x3b, 0x43, 0x259,
+0x6d, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x52, 0x259, 0x63, 0x2e, 0x3b, 0x15e,
+0x61, 0x62, 0x2e, 0x3b, 0x52, 0x61, 0x6d, 0x2e, 0x3b, 0x15e, 0x259, 0x76,
+0x2e, 0x3b, 0x5a, 0x69, 0x6c, 0x71, 0x2e, 0x3b, 0x5a, 0x69, 0x6c, 0x68,
+0x2e, 0x9ae, 0x9b9, 0x9b0, 0x9b0, 0x9ae, 0x3b, 0x9b8, 0x9ab, 0x9b0, 0x3b, 0x9b0,
+0x9ac, 0x9bf, 0x989, 0x9b2, 0x20, 0x986, 0x989, 0x9af, 0x9bc, 0x9be, 0x9b2, 0x3b,
+0x9b0, 0x9ac, 0x9bf, 0x989, 0x9b8, 0x20, 0x9b8, 0x9be, 0x9a8, 0x9bf, 0x3b, 0x99c,
+0x9ae, 0x9be, 0x9a6, 0x9bf, 0x989, 0x9b2, 0x20, 0x986, 0x989, 0x9af, 0x9bc, 0x9be,
+0x9b2, 0x3b, 0x99c, 0x9ae, 0x9be, 0x9a6, 0x9bf, 0x989, 0x9b8, 0x20, 0x9b8, 0x9be,
+0x9a8, 0x9bf, 0x3b, 0x9b0, 0x99c, 0x9ac, 0x3b, 0x9b6, 0x9be, 0x2018, 0x9ac, 0x9be,
+0x9a8, 0x3b, 0x9b0, 0x9ae, 0x99c, 0x9be, 0x9a8, 0x3b, 0x9b6, 0x9be, 0x993, 0x9af,
+0x9bc, 0x9be, 0x9b2, 0x3b, 0x99c, 0x9cd, 0x9ac, 0x9bf, 0x9b2, 0x995, 0x9a6, 0x3b,
+0x99c, 0x9cd, 0x9ac, 0x9bf, 0x9b2, 0x9b9, 0x99c, 0x9cd, 0x99c, 0x9e7, 0x3b, 0x9e8,
+0x3b, 0x9e9, 0x3b, 0x9ea, 0x3b, 0x9eb, 0x3b, 0x9ec, 0x3b, 0x9ed, 0x3b, 0x9ee,
+0x3b, 0x9ef, 0x3b, 0x9e7, 0x9e6, 0x3b, 0x9e7, 0x9e7, 0x3b, 0x9e7, 0x9e8, 0x6d,
+0x75, 0x68, 0x61, 0x72, 0x65, 0x6d, 0x3b, 0x73, 0x61, 0x66, 0x65, 0x72,
+0x3b, 0x72, 0x61, 0x62, 0x69, 0x2bb, 0x20, 0x69, 0x3b, 0x72, 0x61, 0x62,
+0x69, 0x2bb, 0x20, 0x69, 0x69, 0x3b, 0x64, 0x17e, 0x75, 0x6d, 0x61, 0x64,
+0x65, 0x20, 0x69, 0x3b, 0x64, 0x17e, 0x75, 0x6d, 0x61, 0x64, 0x65, 0x20,
+0x69, 0x69, 0x3b, 0x72, 0x65, 0x64, 0x17e, 0x65, 0x62, 0x3b, 0x53, 0x68,
+0x61, 0x2bb, 0x62, 0x61, 0x6e, 0x3b, 0x72, 0x61, 0x6d, 0x61, 0x7a, 0x61,
+0x6e, 0x3b, 0x161, 0x65, 0x76, 0x61, 0x6c, 0x3b, 0x7a, 0x75, 0x6c, 0x2d,
+0x6b, 0x61, 0x64, 0x65, 0x3b, 0x7a, 0x75, 0x6c, 0x2d, 0x68, 0x69, 0x64,
+0x17e, 0x65, 0x6d, 0x75, 0x68, 0x2e, 0x3b, 0x73, 0x61, 0x66, 0x2e, 0x3b,
+0x52, 0x61, 0x62, 0x2e, 0x20, 0x49, 0x3b, 0x72, 0x61, 0x62, 0x2e, 0x20,
+0x69, 0x69, 0x3b, 0x64, 0x17e, 0x75, 0x6d, 0x2e, 0x20, 0x69, 0x3b, 0x64,
+0x17e, 0x75, 0x6d, 0x2e, 0x20, 0x69, 0x69, 0x3b, 0x72, 0x65, 0x64, 0x17e,
+0x2e, 0x3b, 0x161, 0x61, 0x2e, 0x3b, 0x72, 0x61, 0x6d, 0x2e, 0x3b, 0x161,
+0x65, 0x2e, 0x3b, 0x7a, 0x75, 0x6c, 0x2d, 0x6b, 0x2e, 0x3b, 0x7a, 0x75,
+0x6c, 0x2d, 0x68, 0x2e, 0x41c, 0x443, 0x445, 0x430, 0x440, 0x435, 0x43c, 0x3b,
+0x421, 0x430, 0x444, 0x435, 0x440, 0x3b, 0x420, 0x435, 0x431, 0x438, 0x20, 0x31,
+0x3b, 0x420, 0x435, 0x431, 0x438, 0x20, 0x32, 0x3b, 0x40f, 0x443, 0x43c, 0x430,
+0x434, 0x435, 0x20, 0x31, 0x3b, 0x40f, 0x443, 0x43c, 0x430, 0x434, 0x435, 0x20,
+0x32, 0x3b, 0x420, 0x435, 0x45f, 0x435, 0x431, 0x3b, 0x428, 0x430, 0x2bb, 0x431,
+0x430, 0x43d, 0x3b, 0x420, 0x430, 0x43c, 0x430, 0x437, 0x430, 0x43d, 0x3b, 0x428,
+0x435, 0x432, 0x430, 0x43b, 0x3b, 0x417, 0x443, 0x43b, 0x2d, 0x43a, 0x430, 0x434,
+0x435, 0x3b, 0x417, 0x443, 0x43b, 0x2d, 0x445, 0x438, 0x45f, 0x435, 0x41c, 0x443,
+0x440, 0x430, 0x445, 0x430, 0x43c, 0x3b, 0x421, 0x430, 0x444, 0x430, 0x440, 0x3b,
+0x420, 0x430, 0x431, 0x438, 0x2bb, 0x20, 0x49, 0x3b, 0x420, 0x430, 0x431, 0x438,
+0x2bb, 0x20, 0x49, 0x49, 0x3b, 0x408, 0x443, 0x43c, 0x430, 0x434, 0x430, 0x20,
+0x49, 0x3b, 0x408, 0x443, 0x43c, 0x430, 0x434, 0x430, 0x20, 0x49, 0x49, 0x3b,
+0x420, 0x430, 0x452, 0x430, 0x431, 0x3b, 0x428, 0x430, 0x2bb, 0x431, 0x430, 0x43d,
+0x3b, 0x420, 0x430, 0x43c, 0x430, 0x434, 0x430, 0x43d, 0x3b, 0x428, 0x430, 0x432,
+0x430, 0x43b, 0x3b, 0x414, 0x443, 0x2bb, 0x43b, 0x2d, 0x41a, 0x438, 0x2bb, 0x434,
+0x430, 0x3b, 0x414, 0x443, 0x2bb, 0x43b, 0x2d, 0x445, 0x438, 0x452, 0x430, 0x41c,
+0x443, 0x445, 0x2e, 0x3b, 0x421, 0x430, 0x444, 0x2e, 0x3b, 0x420, 0x435, 0x431,
+0x2e, 0x20, 0x31, 0x3b, 0x420, 0x435, 0x431, 0x2e, 0x20, 0x32, 0x3b, 0x40f,
+0x443, 0x43c, 0x2e, 0x20, 0x31, 0x3b, 0x40f, 0x443, 0x43c, 0x2e, 0x20, 0x32,
+0x3b, 0x420, 0x435, 0x45f, 0x2e, 0x3b, 0x428, 0x430, 0x2e, 0x3b, 0x420, 0x430,
+0x43c, 0x2e, 0x3b, 0x428, 0x435, 0x2e, 0x3b, 0x417, 0x443, 0x43b, 0x2d, 0x43a,
+0x2e, 0x3b, 0x417, 0x443, 0x43b, 0x2d, 0x445, 0x2e, 0x43c, 0x443, 0x445, 0x430,
+0x440, 0x430, 0x43c, 0x3b, 0x441, 0x430, 0x444, 0x430, 0x440, 0x3b, 0x440, 0x430,
+0x431, 0x438, 0x2d, 0x31, 0x3b, 0x440, 0x430, 0x431, 0x438, 0x2d, 0x32, 0x3b,
+0x434, 0x436, 0x443, 0x43c, 0x430, 0x434, 0x430, 0x2d, 0x31, 0x3b, 0x434, 0x436,
+0x443, 0x43c, 0x430, 0x434, 0x430, 0x2d, 0x32, 0x3b, 0x440, 0x430, 0x434, 0x436,
+0x430, 0x431, 0x3b, 0x448, 0x430, 0x431, 0x430, 0x43d, 0x3b, 0x440, 0x430, 0x43c,
+0x430, 0x437, 0x430, 0x43d, 0x3b, 0x428, 0x430, 0x432, 0x430, 0x43b, 0x3b, 0x414,
+0x445, 0x443, 0x43b, 0x2d, 0x41a, 0x430, 0x430, 0x434, 0x430, 0x3b, 0x414, 0x445,
+0x443, 0x43b, 0x2d, 0x445, 0x438, 0x434, 0x436, 0x430, 0x7a46, 0x54c8, 0x862d, 0x59c6,
+0x6708, 0x3b, 0x8272, 0x6cd5, 0x723e, 0x6708, 0x3b, 0x8cf4, 0x6bd4, 0x6708, 0x20, 0x49,
+0x3b, 0x8cf4, 0x6bd4, 0x6708, 0x20, 0x49, 0x49, 0x3b, 0x4e3b, 0x99ac, 0x9054, 0x6708,
+0x20, 0x49, 0x3b, 0x4e3b, 0x99ac, 0x9054, 0x6708, 0x20, 0x49, 0x49, 0x3b, 0x8cf4,
+0x54f2, 0x535c, 0x6708, 0x3b, 0x820d, 0x723e, 0x90a6, 0x6708, 0x3b, 0x8cf4, 0x8cb7, 0x4e39,
+0x6708, 0x3b, 0x9583, 0x74e6, 0x9b6f, 0x6708, 0x3b, 0x90fd, 0x723e, 0x5580, 0x723e, 0x5fb7,
+0x6708, 0x3b, 0x90fd, 0x723e, 0x9ed1, 0x54f2, 0x6708, 0x7a46, 0x54c8, 0x5170, 0x59c6, 0x6708,
+0x3b, 0x8272, 0x6cd5, 0x5c14, 0x6708, 0x3b, 0x8d56, 0x6bd4, 0x6708, 0x20, 0x49, 0x3b,
+0x8d56, 0x6bd4, 0x6708, 0x20, 0x49, 0x49, 0x3b, 0x4e3b, 0x9a6c, 0x8fbe, 0x6708, 0x20,
+0x49, 0x3b, 0x4e3b, 0x9a6c, 0x8fbe, 0x6708, 0x20, 0x49, 0x49, 0x3b, 0x8d56, 0x54f2,
+0x535c, 0x6708, 0x3b, 0x820d, 0x5c14, 0x90a6, 0x6708, 0x3b, 0x8d56, 0x4e70, 0x4e39, 0x6708,
+0x3b, 0x95ea, 0x74e6, 0x9c81, 0x6708, 0x3b, 0x90fd, 0x5c14, 0x5580, 0x5c14, 0x5fb7, 0x6708,
+0x3b, 0x90fd, 0x5c14, 0x9ed1, 0x54f2, 0x6708, 0xd804, 0xdd1f, 0xd804, 0xdd27, 0xd804, 0xdd26,
+0xd804, 0xdd27, 0xd804, 0xdd22, 0xd804, 0xdd27, 0xd804, 0xdd1f, 0xd804, 0xdd34, 0x3b, 0xd804,
+0xdd25, 0xd804, 0xdd27, 0xd804, 0xdd1c, 0xd804, 0xdd22, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd22,
+0xd804, 0xdd27, 0xd804, 0xdd1d, 0xd804, 0xdd28, 0xd804, 0xdd05, 0xd804, 0xdd23, 0xd804, 0xdd34,
+0x20, 0xd804, 0xdd03, 0xd804, 0xdd03, 0xd804, 0xdd2a, 0xd804, 0xdd20, 0xd804, 0xdd23, 0xd804,
+0xdd34, 0x3b, 0xd804, 0xdd22, 0xd804, 0xdd27, 0xd804, 0xdd1d, 0xd804, 0xdd28, 0xd804, 0xdd05,
+0xd804, 0xdd25, 0xd804, 0xdd34, 0x20, 0xd804, 0xdd25, 0xd804, 0xdd1a, 0xd804, 0xdd28, 0x3b,
+0xd804, 0xdd0e, 0xd804, 0xdd27, 0xd804, 0xdd1f, 0xd804, 0xdd18, 0xd804, 0xdd28, 0xd804, 0xdd05,
+0xd804, 0xdd23, 0xd804, 0xdd34, 0x20, 0xd804, 0xdd03, 0xd804, 0xdd03, 0xd804, 0xdd2a, 0xd804,
+0xdd20, 0xd804, 0xdd23, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd0e, 0xd804, 0xdd27, 0xd804, 0xdd1f,
+0xd804, 0xdd18, 0xd804, 0xdd28, 0xd804, 0xdd05, 0xd804, 0xdd0c, 0xd804, 0xdd34, 0x20, 0xd804,
+0xdd25, 0xd804, 0xdd1a, 0xd804, 0xdd28, 0x3b, 0xd804, 0xdd22, 0xd804, 0xdd27, 0xd804, 0xdd0e,
+0xd804, 0xdd27, 0xd804, 0xdd1d, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd25, 0xd804, 0xdd33, 0xd804,
+0xdd03, 0xd804, 0xdd1d, 0xd804, 0xdd27, 0xd804, 0xdd1a, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd22,
+0xd804, 0xdd27, 0xd804, 0xdd1f, 0xd804, 0xdd34, 0xd804, 0xdd0e, 0xd804, 0xdd1a, 0xd804, 0xdd34,
+0x3b, 0xd804, 0xdd25, 0xd804, 0xdd24, 0xd804, 0xdd23, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd0e,
+0xd804, 0xdd28, 0xd804, 0xdd23, 0xd804, 0xdd34, 0xd804, 0xdd07, 0xd804, 0xdd27, 0xd804, 0xdd18,
+0xd804, 0xdd34, 0x3b, 0xd804, 0xdd0e, 0xd804, 0xdd28, 0xd804, 0xdd23, 0xd804, 0xdd34, 0xd804,
+0xdd26, 0xd804, 0xdd27, 0xd804, 0xdd0e, 0xd804, 0xdd34, 0xd804, 0xdd0e, 0xd804, 0xdd27, 0xd804,
+0xdd37, 0x3b, 0xd804, 0xdd38, 0x3b, 0xd804, 0xdd39, 0x3b, 0xd804, 0xdd3a, 0x3b, 0xd804,
+0xdd3b, 0x3b, 0xd804, 0xdd3c, 0x3b, 0xd804, 0xdd3d, 0x3b, 0xd804, 0xdd3e, 0x3b, 0xd804,
+0xdd3f, 0x3b, 0xd804, 0xdd37, 0xd804, 0xdd36, 0x3b, 0xd804, 0xdd37, 0xd804, 0xdd37, 0x3b,
+0xd804, 0xdd37, 0xd804, 0xdd38, 0x4e00, 0x6708, 0x3b, 0x4e8c, 0x6708, 0x3b, 0x4e09, 0x6708,
+0x3b, 0x56db, 0x6708, 0x3b, 0x4e94, 0x6708, 0x3b, 0x516d, 0x6708, 0x3b, 0x4e03, 0x6708,
+0x3b, 0x516b, 0x6708, 0x3b, 0x4e5d, 0x6708, 0x3b, 0x5341, 0x6708, 0x3b, 0x5341, 0x4e00,
+0x6708, 0x3b, 0x5341, 0x4e8c, 0x6708, 0x31, 0x6708, 0x3b, 0x32, 0x6708, 0x3b, 0x33,
+0x6708, 0x3b, 0x34, 0x6708, 0x3b, 0x35, 0x6708, 0x3b, 0x36, 0x6708, 0x3b, 0x37,
+0x6708, 0x3b, 0x38, 0x6708, 0x3b, 0x39, 0x6708, 0x3b, 0x31, 0x30, 0x6708, 0x3b,
+0x31, 0x31, 0x6708, 0x3b, 0x31, 0x32, 0x6708, 0x31, 0x2e, 0x3b, 0x32, 0x2e,
+0x3b, 0x33, 0x2e, 0x3b, 0x34, 0x2e, 0x3b, 0x35, 0x2e, 0x3b, 0x36, 0x2e,
+0x3b, 0x37, 0x2e, 0x3b, 0x38, 0x2e, 0x3b, 0x39, 0x2e, 0x3b, 0x31, 0x30,
+0x2e, 0x3b, 0x31, 0x31, 0x2e, 0x3b, 0x31, 0x32, 0x2e, 0x6d, 0x75, 0x68,
+0x61, 0x72, 0x72, 0x65, 0x6d, 0x3b, 0x73, 0x61, 0x66, 0x61, 0x72, 0x3b,
+0x72, 0x65, 0x62, 0xed, 0x2019, 0x75, 0x20, 0x6c, 0x2d, 0x61, 0x77, 0x77,
+0x61, 0x6c, 0x3b, 0x72, 0x65, 0x62, 0xed, 0x2019, 0x75, 0x20, 0x73, 0x2d,
+0x73, 0xe1, 0x6e, 0xed, 0x3b, 0x64, 0x17e, 0x75, 0x6d, 0xe1, 0x64, 0xe1,
+0x20, 0x61, 0x6c, 0x2d, 0xfa, 0x6c, 0xe1, 0x3b, 0x64, 0x17e, 0x75, 0x6d,
+0xe1, 0x64, 0xe1, 0x20, 0x61, 0x6c, 0x2d, 0xe1, 0x63, 0x68, 0x69, 0x72,
+0x61, 0x3b, 0x72, 0x65, 0x64, 0x17e, 0x65, 0x62, 0x3b, 0x161, 0x61, 0x2019,
+0x62, 0xe1, 0x6e, 0x3b, 0x72, 0x61, 0x6d, 0x61, 0x64, 0xe1, 0x6e, 0x3b,
+0x161, 0x61, 0x77, 0x77, 0x61, 0x6c, 0x3b, 0x7a, 0xfa, 0x20, 0x6c, 0x2d,
+0x6b, 0x61, 0x2019, 0x64, 0x61, 0x3b, 0x7a, 0xfa, 0x20, 0x6c, 0x2d, 0x68,
+0x69, 0x64, 0x17e, 0x64, 0x17e, 0x61, 0x6d, 0x75, 0x68, 0x2e, 0x3b, 0x73,
+0x61, 0x66, 0x2e, 0x3b, 0x72, 0x65, 0x62, 0x2e, 0x20, 0x49, 0x3b, 0x72,
+0x65, 0x62, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x64, 0x17e, 0x75, 0x6d, 0x2e,
+0x20, 0x49, 0x3b, 0x64, 0x17e, 0x75, 0x6d, 0x2e, 0x20, 0x49, 0x49, 0x3b,
+0x72, 0x65, 0x64, 0x2e, 0x3b, 0x161, 0x61, 0x2e, 0x3b, 0x72, 0x61, 0x6d,
+0x2e, 0x3b, 0x161, 0x61, 0x77, 0x2e, 0x3b, 0x7a, 0xfa, 0x20, 0x6c, 0x2d,
+0x6b, 0x2e, 0x3b, 0x7a, 0xfa, 0x20, 0x6c, 0x2d, 0x68, 0x2e, 0x6d, 0x75,
+0x68, 0x61, 0x72, 0x72, 0x61, 0x6d, 0x3b, 0x73, 0x61, 0x66, 0x61, 0x72,
+0x3b, 0x72, 0x61, 0x62, 0x69, 0x2bb, 0x20, 0x49, 0x3b, 0x72, 0x61, 0x62,
+0x69, 0x2bb, 0x20, 0x49, 0x49, 0x3b, 0x6a, 0x75, 0x6d, 0x61, 0x64, 0x61,
+0x20, 0x49, 0x3b, 0x6a, 0x75, 0x6d, 0x61, 0x64, 0x61, 0x20, 0x49, 0x49,
+0x3b, 0x72, 0x61, 0x6a, 0x61, 0x62, 0x3b, 0x73, 0x68, 0x61, 0x2bb, 0x62,
+0x61, 0x6e, 0x3b, 0x72, 0x61, 0x6d, 0x61, 0x64, 0x61, 0x6e, 0x3b, 0x73,
+0x68, 0x61, 0x77, 0x77, 0x61, 0x6c, 0x3b, 0x64, 0x68, 0x75, 0x2bb, 0x6c,
+0x2d, 0x51, 0x69, 0x2bb, 0x64, 0x61, 0x68, 0x3b, 0x64, 0x68, 0x75, 0x2bb,
+0x6c, 0x2d, 0x48, 0x69, 0x6a, 0x6a, 0x61, 0x68, 0x4d, 0x6f, 0x65, 0x68,
+0x61, 0x72, 0x72, 0x61, 0x6d, 0x3b, 0x53, 0x61, 0x66, 0x61, 0x72, 0x3b,
+0x52, 0x61, 0x62, 0x69, 0x2bb, 0x61, 0x20, 0x61, 0x6c, 0x20, 0x61, 0x77,
+0x61, 0x6c, 0x3b, 0x52, 0x61, 0x62, 0x69, 0x2bb, 0x61, 0x20, 0x61, 0x6c,
+0x20, 0x74, 0x68, 0x61, 0x6e, 0x69, 0x3b, 0x4a, 0x6f, 0x65, 0x6d, 0x61,
+0x64, 0x2bb, 0x61, 0x6c, 0x20, 0x61, 0x77, 0x61, 0x6c, 0x3b, 0x4a, 0x6f,
+0x65, 0x6d, 0x61, 0x64, 0x2bb, 0x61, 0x6c, 0x20, 0x74, 0x68, 0x61, 0x6e,
+0x69, 0x3b, 0x52, 0x61, 0x6a, 0x61, 0x62, 0x3b, 0x53, 0x6a, 0x61, 0x2bb,
+0x61, 0x62, 0x61, 0x6e, 0x3b, 0x52, 0x61, 0x6d, 0x61, 0x64, 0x61, 0x6e,
+0x3b, 0x53, 0x6a, 0x61, 0x77, 0x61, 0x6c, 0x3b, 0x44, 0x6f, 0x65, 0x20,
+0x61, 0x6c, 0x20, 0x6b, 0x61, 0x2bb, 0x61, 0x62, 0x61, 0x3b, 0x44, 0x6f,
+0x65, 0x20, 0x61, 0x6c, 0x20, 0x68, 0x69, 0x7a, 0x6a, 0x61, 0x4d, 0x6f,
+0x65, 0x68, 0x2e, 0x3b, 0x53, 0x61, 0x66, 0x2e, 0x3b, 0x52, 0x61, 0x62,
+0x2e, 0x20, 0x49, 0x3b, 0x52, 0x61, 0x62, 0x2e, 0x20, 0x49, 0x49, 0x3b,
+0x4a, 0x6f, 0x65, 0x6d, 0x2e, 0x20, 0x49, 0x3b, 0x4a, 0x6f, 0x65, 0x6d,
+0x2e, 0x20, 0x49, 0x49, 0x3b, 0x52, 0x61, 0x6a, 0x2e, 0x3b, 0x53, 0x6a,
+0x61, 0x2e, 0x3b, 0x52, 0x61, 0x6d, 0x2e, 0x3b, 0x53, 0x6a, 0x61, 0x77,
+0x2e, 0x3b, 0x44, 0x6f, 0x65, 0x20, 0x61, 0x6c, 0x20, 0x6b, 0x2e, 0x3b,
+0x44, 0x6f, 0x65, 0x20, 0x61, 0x6c, 0x20, 0x68, 0x2e, 0x64, 0x7a, 0x6f,
+0x76, 0x65, 0x3b, 0x64, 0x7a, 0x6f, 0x64, 0x7a, 0x65, 0x3b, 0x74, 0x65,
+0x64, 0x6f, 0x78, 0x65, 0x3b, 0x61, 0x66, 0x254, 0x66, 0x69, 0x1ebd, 0x3b,
+0x64, 0x61, 0x6d, 0x25b, 0x3b, 0x6d, 0x61, 0x73, 0x61, 0x3b, 0x73, 0x69,
+0x61, 0x6d, 0x6c, 0x254, 0x6d, 0x3b, 0x64, 0x65, 0x61, 0x73, 0x69, 0x61,
+0x6d, 0x69, 0x6d, 0x65, 0x3b, 0x61, 0x6e, 0x79, 0x254, 0x6e, 0x79, 0x254,
+0x3b, 0x6b, 0x65, 0x6c, 0x65, 0x3b, 0x61, 0x64, 0x65, 0x25b, 0x6d, 0x65,
+0x6b, 0x70, 0x254, 0x78, 0x65, 0x3b, 0x64, 0x7a, 0x6f, 0x6d, 0x65, 0x64,
+0x7a, 0x76, 0x3b, 0x64, 0x7a, 0x64, 0x3b, 0x74, 0x65, 0x64, 0x3b, 0x61,
+0x66, 0x254, 0x3b, 0x64, 0x61, 0x6d, 0x3b, 0x6d, 0x61, 0x73, 0x3b, 0x73,
+0x69, 0x61, 0x3b, 0x64, 0x65, 0x61, 0x3b, 0x61, 0x6e, 0x79, 0x3b, 0x6b,
+0x65, 0x6c, 0x3b, 0x61, 0x64, 0x65, 0x3b, 0x64, 0x7a, 0x6d, 0x6d, 0x75,
+0x68, 0x61, 0x72, 0x72, 0x61, 0x6d, 0x3b, 0x73, 0x61, 0x66, 0x61, 0x72,
+0x3b, 0x72, 0x61, 0x62, 0x69, 0x2019, 0x20, 0x61, 0x6c, 0x2d, 0x61, 0x77,
+0x77, 0x61, 0x6c, 0x3b, 0x72, 0x61, 0x62, 0x69, 0x2019, 0x20, 0x61, 0x6c,
+0x2d, 0x61, 0x6b, 0x68, 0x69, 0x72, 0x3b, 0x64, 0x17e, 0x75, 0x6d, 0x61,
+0x64, 0x61, 0x2d, 0x6c, 0x2d, 0x75, 0x6c, 0x61, 0x3b, 0x64, 0x17e, 0x75,
+0x6d, 0x61, 0x64, 0x61, 0x2d, 0x6c, 0x2d, 0x61, 0x6b, 0x68, 0x69, 0x72,
+0x61, 0x3b, 0x72, 0x61, 0x64, 0x17e, 0x61, 0x62, 0x3b, 0x161, 0x61, 0x2019,
+0x62, 0x61, 0x6e, 0x3b, 0x72, 0x61, 0x6d, 0x61, 0x64, 0x61, 0x6e, 0x3b,
+0x161, 0x61, 0x77, 0x77, 0x61, 0x6c, 0x3b, 0x64, 0x68, 0x75, 0x2d, 0x6c,
+0x2d, 0x71, 0x61, 0x2019, 0x64, 0x61, 0x3b, 0x64, 0x68, 0x75, 0x2d, 0x6c,
+0x2d, 0x68, 0x69, 0x64, 0x64, 0x17e, 0x61, 0x6d, 0x6f, 0x75, 0x68, 0x61,
+0x72, 0x72, 0x61, 0x6d, 0x3b, 0x73, 0x61, 0x66, 0x61, 0x72, 0x3b, 0x72,
+0x61, 0x62, 0x69, 0x61, 0x20, 0x61, 0x6c, 0x20, 0x61, 0x77, 0x61, 0x6c,
+0x3b, 0x72, 0x61, 0x62, 0x69, 0x61, 0x20, 0x61, 0x74, 0x68, 0x2d, 0x74,
+0x68, 0x61, 0x6e, 0x69, 0x3b, 0x6a, 0x6f, 0x75, 0x6d, 0x61, 0x64, 0x61,
+0x20, 0x61, 0x6c, 0x20, 0x6f, 0x75, 0x6c, 0x61, 0x3b, 0x6a, 0x6f, 0x75,
+0x6d, 0x61, 0x64, 0x61, 0x20, 0x61, 0x74, 0x68, 0x2d, 0x74, 0x68, 0x61,
+0x6e, 0x69, 0x61, 0x3b, 0x72, 0x61, 0x6a, 0x61, 0x62, 0x3b, 0x63, 0x68,
+0x61, 0x61, 0x62, 0x61, 0x6e, 0x65, 0x3b, 0x72, 0x61, 0x6d, 0x61, 0x64,
+0x61, 0x6e, 0x3b, 0x63, 0x68, 0x61, 0x77, 0x77, 0x61, 0x6c, 0x3b, 0x64,
+0x68, 0x6f, 0x75, 0x20, 0x61, 0x6c, 0x20, 0x71, 0x69, 0x60, 0x64, 0x61,
+0x3b, 0x64, 0x68, 0x6f, 0x75, 0x20, 0x61, 0x6c, 0x2d, 0x68, 0x69, 0x6a,
+0x6a, 0x61, 0x6d, 0x6f, 0x75, 0x68, 0x2e, 0x3b, 0x73, 0x61, 0x66, 0x2e,
+0x3b, 0x72, 0x61, 0x62, 0x2e, 0x20, 0x61, 0x77, 0x2e, 0x3b, 0x72, 0x61,
+0x62, 0x2e, 0x20, 0x74, 0x68, 0x2e, 0x3b, 0x6a, 0x6f, 0x75, 0x6d, 0x2e,
+0x20, 0x6f, 0x75, 0x2e, 0x3b, 0x6a, 0x6f, 0x75, 0x6d, 0x2e, 0x20, 0x74,
+0x68, 0x2e, 0x3b, 0x72, 0x61, 0x6a, 0x2e, 0x3b, 0x63, 0x68, 0x61, 0x61,
+0x2e, 0x3b, 0x72, 0x61, 0x6d, 0x2e, 0x3b, 0x63, 0x68, 0x61, 0x77, 0x2e,
+0x3b, 0x64, 0x68, 0x6f, 0x75, 0x2e, 0x20, 0x71, 0x69, 0x2e, 0x3b, 0x64,
+0x68, 0x6f, 0x75, 0x2e, 0x20, 0x68, 0x69, 0x2e, 0x6d, 0x6f, 0x75, 0x68,
+0x2e, 0x3b, 0x73, 0x61, 0x66, 0x2e, 0x3b, 0x72, 0x61, 0x62, 0x2e, 0x20,
+0x61, 0x77, 0x2e, 0x3b, 0x72, 0x61, 0x62, 0x2e, 0x20, 0x74, 0x68, 0x2e,
+0x3b, 0x6a, 0x6f, 0x75, 0x6d, 0x2e, 0x20, 0x6f, 0x75, 0x6c, 0x2e, 0x3b,
+0x6a, 0x6f, 0x75, 0x6d, 0x2e, 0x20, 0x74, 0x68, 0x61, 0x2e, 0x3b, 0x72,
+0x61, 0x6a, 0x2e, 0x3b, 0x63, 0x68, 0x61, 0x61, 0x2e, 0x3b, 0x72, 0x61,
+0x6d, 0x2e, 0x3b, 0x63, 0x68, 0x61, 0x77, 0x2e, 0x3b, 0x64, 0x68, 0x6f,
+0x75, 0x2e, 0x20, 0x71, 0x2e, 0x3b, 0x64, 0x68, 0x6f, 0x75, 0x2e, 0x20,
+0x68, 0x2e, 0xd83a, 0xdd14, 0xd83a, 0xdd2e, 0xd83a, 0xdd25, 0xd83a, 0xdd26, 0xd83a, 0xdd2b,
+0xd83a, 0xdd32, 0xd83a, 0xdd3c, 0xd83a, 0xdd2b, 0x3b, 0xd83a, 0xdd05, 0xd83a, 0xdd22, 0xd83a,
+0xdd26, 0xd83a, 0xdd46, 0xd83a, 0xdd2e, 0xd83a, 0xdd2a, 0xd83a, 0xdd23, 0xd83a, 0xdd35, 0x2d,
+0xd83a, 0xdd06, 0xd83a, 0xdd22, 0xd83a, 0xdd2a, 0xd83a, 0xdd22, 0xd83a, 0xdd32, 0x3b, 0xd83a,
+0xdd06, 0xd83a, 0xdd22, 0xd83a, 0xdd2a, 0xd83a, 0xdd22, 0xd83a, 0xdd32, 0x3b, 0xd83a, 0xdd03,
+0xd83a, 0xdd2d, 0xd83a, 0xdd25, 0xd83a, 0xdd28, 0xd83a, 0xdd22, 0xd83a, 0xdd2a, 0xd83a, 0xdd22,
+0xd83a, 0xdd32, 0x3b, 0xd83a, 0xdd04, 0xd83a, 0xdd22, 0xd83a, 0xdd28, 0xd83a, 0xdd46, 0xd83a,
+0xdd22, 0xd83a, 0xdd2a, 0xd83a, 0xdd22, 0xd83a, 0xdd32, 0x3b, 0xd83a, 0xdd05, 0xd83a, 0xdd22,
+0xd83a, 0xdd26, 0xd83a, 0xdd46, 0xd83a, 0xdd2e, 0xd83a, 0xdd2a, 0xd83a, 0xdd23, 0xd83a, 0xdd35,
+0x2d, 0xd83a, 0xdd08, 0xd83a, 0xdd22, 0xd83a, 0xdd44, 0xd83a, 0xdd36, 0xd83a, 0xdd2d, 0xd83a,
+0xdd26, 0xd83a, 0xdd2d, 0x3b, 0xd83a, 0xdd08, 0xd83a, 0xdd22, 0xd83a, 0xdd44, 0xd83a, 0xdd36,
+0xd83a, 0xdd2d, 0xd83a, 0xdd26, 0xd83a, 0xdd2d, 0x3b, 0xd83a, 0xdd05, 0xd83a, 0xdd22, 0xd83a,
+0xdd26, 0xd83a, 0xdd46, 0xd83a, 0xdd2e, 0xd83a, 0xdd2a, 0xd83a, 0xdd23, 0xd83a, 0xdd35, 0x2d,
+0xd83a, 0xdd05, 0xd83a, 0xdd35, 0xd83a, 0xdd45, 0xd83a, 0xdd25, 0xd83a, 0xdd22, 0xd83a, 0xdd34,
+0xd83a, 0xdd2b, 0xd83a, 0xdd45, 0x3b, 0xd83a, 0xdd05, 0xd83a, 0xdd35, 0xd83a, 0xdd45, 0xd83a,
+0xdd25, 0xd83a, 0xdd22, 0xd83a, 0xdd34, 0xd83a, 0xdd2b, 0xd83a, 0xdd45, 0x3b, 0xd83a, 0xdd14,
+0xd83a, 0xdd35, 0xd83a, 0xdd45, 0xd83a, 0xdd24, 0xd83a, 0xdd23, 0xd83a, 0xdd22, 0xd83a, 0xdd44,
+0xd83a, 0xdd32, 0xd83a, 0xdd4b, 0xd83a, 0xdd23, 0xd83a, 0xdd35, 0x3b, 0xd83a, 0xdd05, 0xd83a,
+0xdd22, 0xd83a, 0xdd26, 0xd83a, 0xdd46, 0xd83a, 0xdd2e, 0xd83a, 0xdd2a, 0xd83a, 0xdd23, 0xd83a,
+0xdd35, 0x2d, 0xd83a, 0xdd01, 0xd83a, 0xdd2e, 0xd83a, 0xdd32, 0xd83a, 0xdd33, 0xd83a, 0xdd2d,
+0xd83a, 0xdd32, 0x3b, 0xd83a, 0xdd01, 0xd83a, 0xdd35, 0xd83a, 0xdd32, 0xd83a, 0xdd33, 0xd83a,
+0xdd2d, 0xd83a, 0xdd32, 0xd83a, 0xdd14, 0xd83a, 0xdd2e, 0xd83a, 0xdd26, 0x2e, 0x3b, 0xd83a,
+0xdd05, 0xd83a, 0xdd22, 0xd83a, 0xdd28, 0x2e, 0x3b, 0xd83a, 0xdd06, 0xd83a, 0xdd22, 0xd83a,
+0xdd2a, 0x2e, 0x3b, 0xd83a, 0xdd03, 0xd83a, 0xdd2d, 0xd83a, 0xdd28, 0x2e, 0x3b, 0xd83a,
+0xdd04, 0xd83a, 0xdd22, 0xd83a, 0xdd28, 0x2e, 0x3b, 0xd83a, 0xdd05, 0xd83a, 0xdd22, 0xd83a,
+0xdd2a, 0x2e, 0x3b, 0xd83a, 0xdd08, 0xd83a, 0xdd22, 0xd83a, 0xdd36, 0x2e, 0x3b, 0xd83a,
+0xdd05, 0xd83a, 0xdd22, 0xd83a, 0xdd27, 0x2e, 0x3b, 0xd83a, 0xdd05, 0xd83a, 0xdd35, 0xd83a,
+0xdd25, 0x2e, 0x3b, 0xd83a, 0xdd14, 0xd83a, 0xdd35, 0xd83a, 0xdd24, 0x2e, 0x3b, 0xd83a,
+0xdd05, 0xd83a, 0xdd22, 0xd83a, 0xdd23, 0x2e, 0x3b, 0xd83a, 0xdd01, 0xd83a, 0xdd2e, 0xd83a,
+0xdd32, 0x2e, 0xd83a, 0xdd51, 0x3b, 0xd83a, 0xdd52, 0x3b, 0xd83a, 0xdd53, 0x3b, 0xd83a,
+0xdd54, 0x3b, 0xd83a, 0xdd55, 0x3b, 0xd83a, 0xdd56, 0x3b, 0xd83a, 0xdd57, 0x3b, 0xd83a,
+0xdd58, 0x3b, 0xd83a, 0xdd59, 0x3b, 0xd83a, 0xdd51, 0xd83a, 0xdd50, 0x3b, 0xd83a, 0xdd51,
+0xd83a, 0xdd51, 0x3b, 0xd83a, 0xdd51, 0xd83a, 0xdd52, 0x10db, 0x10e3, 0x10f0, 0x10d0, 0x10e0,
+0x10d0, 0x10db, 0x10d8, 0x3b, 0x10e1, 0x10d0, 0x10e4, 0x10d0, 0x10e0, 0x10d8, 0x3b, 0x10e0,
+0x10d0, 0x10d1, 0x10d8, 0x20, 0x10e3, 0x10da, 0x2d, 0x10d0, 0x10d5, 0x10d0, 0x10da, 0x10d8,
+0x3b, 0x10e0, 0x10d0, 0x10d1, 0x10d8, 0x20, 0x10e3, 0x10da, 0x2d, 0x10d0, 0x10ee, 0x10d8,
+0x10e0, 0x10d8, 0x3b, 0x10ef, 0x10e3, 0x10db, 0x10d0, 0x10d3, 0x10d0, 0x20, 0x10e3, 0x10da,
+0x2d, 0x10d0, 0x10d5, 0x10d0, 0x10da, 0x10d8, 0x3b, 0x10ef, 0x10e3, 0x10db, 0x10d0, 0x10d3,
+0x10d0, 0x20, 0x10e3, 0x10da, 0x2d, 0x10d0, 0x10ee, 0x10d8, 0x10e0, 0x10d8, 0x3b, 0x10e0,
+0x10d0, 0x10ef, 0x10d0, 0x10d1, 0x10d8, 0x3b, 0x10e8, 0x10d0, 0x10d1, 0x10d0, 0x10dc, 0x10d8,
+0x3b, 0x10e0, 0x10d0, 0x10db, 0x10d0, 0x10d3, 0x10d0, 0x10dc, 0x10d8, 0x3b, 0x10e8, 0x10d0,
+0x10d5, 0x10d0, 0x10da, 0x10d8, 0x3b, 0x10d6, 0x10e3, 0x10da, 0x2d, 0x10d9, 0x10d0, 0x10d0,
+0x10d3, 0x10d0, 0x3b, 0x10d6, 0x10e3, 0x10da, 0x2d, 0x10f0, 0x10d8, 0x10ef, 0x10d0, 0x10db,
+0x10e3, 0x10f0, 0x2e, 0x3b, 0x10e1, 0x10d0, 0x10e4, 0x2e, 0x3b, 0x10e0, 0x10d0, 0x10d1,
+0x2e, 0x20, 0x49, 0x3b, 0x10e0, 0x10d0, 0x10d1, 0x2e, 0x20, 0x49, 0x49, 0x3b,
+0x10ef, 0x10e3, 0x10db, 0x2e, 0x20, 0x49, 0x3b, 0x10ef, 0x10e3, 0x10db, 0x2e, 0x20,
+0x49, 0x49, 0x3b, 0x10e0, 0x10d0, 0x10ef, 0x2e, 0x3b, 0x10e8, 0x10d0, 0x10d1, 0x2e,
+0x3b, 0x10e0, 0x10d0, 0x10db, 0x2e, 0x3b, 0x10e8, 0x10d0, 0x10d5, 0x2e, 0x3b, 0x10d6,
+0x10e3, 0x10da, 0x2d, 0x10d9, 0x2e, 0x3b, 0x10d6, 0x10e3, 0x10da, 0x2d, 0x10f0, 0x2e,
+0x4d, 0x75, 0x68, 0x61, 0x72, 0x72, 0x61, 0x6d, 0x3b, 0x53, 0x61, 0x66,
+0x61, 0x72, 0x3b, 0x52, 0x61, 0x62, 0x69, 0x2bb, 0x20, 0x49, 0x3b, 0x52,
+0x61, 0x62, 0x69, 0x2bb, 0x20, 0x49, 0x49, 0x3b, 0x44, 0x73, 0x63, 0x68,
+0x75, 0x6d, 0x61, 0x64, 0x61, 0x20, 0x49, 0x3b, 0x44, 0x73, 0x63, 0x68,
+0x75, 0x6d, 0x61, 0x64, 0x61, 0x20, 0x49, 0x49, 0x3b, 0x52, 0x61, 0x64,
+0x73, 0x63, 0x68, 0x61, 0x62, 0x3b, 0x53, 0x68, 0x61, 0x2bb, 0x62, 0x61,
+0x6e, 0x3b, 0x52, 0x61, 0x6d, 0x61, 0x64, 0x61, 0x6e, 0x3b, 0x53, 0x68,
+0x61, 0x77, 0x77, 0x61, 0x6c, 0x3b, 0x44, 0x68, 0x75, 0x20, 0x6c, 0x2d,
+0x71, 0x61, 0x2bf, 0x64, 0x61, 0x3b, 0x44, 0x68, 0x75, 0x20, 0x6c, 0x2d,
+0x48, 0x69, 0x64, 0x64, 0x73, 0x63, 0x68, 0x61, 0xaae, 0xac1, 0xab9, 0xab0,
+0xacd, 0xab0, 0xaae, 0x3b, 0xab8, 0xaab, 0xab0, 0x3b, 0xab0, 0xabe, 0xaac, 0xac0,
+0x2bb, 0x20, 0x49, 0x3b, 0xab0, 0xabe, 0xaac, 0xac0, 0x2bb, 0x20, 0x49, 0x49,
+0x3b, 0xa9c, 0xac1, 0xaae, 0xabe, 0xaa6, 0xabe, 0x20, 0x49, 0x3b, 0xa9c, 0xac1,
+0xaae, 0xabe, 0xaa6, 0xabe, 0x20, 0x49, 0x49, 0x3b, 0xab0, 0xa9c, 0xaac, 0x3b,
+0xab6, 0xabe, 0x2bb, 0xaac, 0xabe, 0xaa8, 0x3b, 0xab0, 0xaae, 0xaa6, 0xabe, 0xaa8,
+0x3b, 0xab6, 0xabe, 0xab5, 0xacd, 0xab5, 0xab2, 0x3b, 0xaa7, 0xac1, 0x2bb, 0xab2,
+0x2d, 0xa95, 0xacd, 0xab5, 0xac0, 0x2bb, 0xaa1, 0xabe, 0xab9, 0x3b, 0xaa7, 0xac1,
+0x2bb, 0xab2, 0x2d, 0xab9, 0xabf, 0xa9c, 0xacd, 0xa9c, 0xabe, 0xab9, 0xaae, 0xac1,
+0xab9, 0x2e, 0x3b, 0xab8, 0xaab, 0x2e, 0x3b, 0xab0, 0xaac, 0x2e, 0x49, 0x3b,
+0xab0, 0xaac, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0xa9c, 0xac1, 0xaae, 0x2e, 0x20,
+0x49, 0x3b, 0xa9c, 0xac1, 0xaae, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0xab0, 0xabe,
+0xa9c, 0x2e, 0x3b, 0xab6, 0xabe, 0x2e, 0x3b, 0xab0, 0xabe, 0xaae, 0x2e, 0x3b,
+0xab6, 0xabe, 0xab5, 0x2e, 0x3b, 0xaa7, 0xac1, 0x2bb, 0xab2, 0x2d, 0xa95, 0xacd,
+0xaaf, 0xac1, 0x2e, 0x3b, 0xaa7, 0xac1, 0x2bb, 0xab2, 0x2d, 0xa8f, 0xa9a, 0x2e,
+0x4d, 0x75, 0x68, 0x61, 0x72, 0x72, 0x61, 0x6d, 0x3b, 0x53, 0x61, 0x66,
+0x61, 0x72, 0x3b, 0x52, 0x61, 0x62, 0x69, 0x2bb, 0x20, 0x49, 0x3b, 0x52,
+0x61, 0x62, 0x69, 0x2bb, 0x20, 0x49, 0x49, 0x3b, 0x4a, 0x75, 0x6d, 0x61,
+0x64, 0x61, 0x20, 0x49, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x64, 0x61, 0x20,
+0x49, 0x49, 0x3b, 0x52, 0x61, 0x6a, 0x61, 0x62, 0x3b, 0x53, 0x68, 0x61,
+0x2bc, 0x61, 0x62, 0x61, 0x6e, 0x3b, 0x52, 0x61, 0x6d, 0x61, 0x64, 0x61,
+0x6e, 0x3b, 0x53, 0x68, 0x61, 0x77, 0x77, 0x61, 0x6c, 0x3b, 0x44, 0x68,
+0x75, 0x2bb, 0x6c, 0x2d, 0x51, 0x69, 0x2bb, 0x64, 0x61, 0x68, 0x3b, 0x44,
+0x68, 0x75, 0x2bb, 0x6c, 0x2d, 0x48, 0x69, 0x6a, 0x6a, 0x61, 0x68, 0x5de,
+0x5d5, 0x5d7, 0x5e8, 0x5dd, 0x3b, 0x5e6, 0x5e4, 0x5e8, 0x3b, 0x5e8, 0x5d1, 0x5d9,
+0x5e2, 0x20, 0x5d0, 0x5dc, 0x5be, 0x5d0, 0x5d5, 0x5d5, 0x5dc, 0x3b, 0x5e8, 0x5d1,
+0x5d9, 0x5e2, 0x20, 0x5d0, 0x5be, 0x5ea, 0x5f3, 0x5d0, 0x5e0, 0x5d9, 0x3b, 0x5d2,
+0x5f3, 0x5d5, 0x5de, 0x5d0, 0x5d3, 0x5d0, 0x20, 0x5d0, 0x5dc, 0x5be, 0x5d0, 0x5d5,
+0x5dc, 0x5d0, 0x3b, 0x5d2, 0x5f3, 0x5d5, 0x5de, 0x5d0, 0x5d3, 0x5d0, 0x20, 0x5d0,
+0x5be, 0x5ea, 0x5f3, 0x5d0, 0x5e0, 0x5d9, 0x5d4, 0x3b, 0x5e8, 0x5d2, 0x5f3, 0x5d1,
+0x3b, 0x5e9, 0x5e2, 0x5d1, 0x5d0, 0x5df, 0x3b, 0x5e8, 0x5de, 0x5d3, 0x5d0, 0x5df,
+0x3b, 0x5e9, 0x5d5, 0x5d5, 0x5d0, 0x5dc, 0x3b, 0x5d3, 0x5f3, 0x5d5, 0x20, 0x5d0,
+0x5dc, 0x5be, 0x5e7, 0x5e2, 0x5d3, 0x5d4, 0x3b, 0x5d3, 0x5f3, 0x5d5, 0x20, 0x5d0,
+0x5dc, 0x5be, 0x5d7, 0x5d9, 0x5d2, 0x5f3, 0x5d4, 0x5de, 0x5d5, 0x5d7, 0x5e8, 0x5dd,
+0x3b, 0x5e6, 0x5e4, 0x5e8, 0x3b, 0x5e8, 0x5d1, 0x5d9, 0x5e2, 0x20, 0x5d0, 0x5dc,
+0x2d, 0x5d0, 0x5d5, 0x5d5, 0x5dc, 0x3b, 0x5e8, 0x5d1, 0x5d9, 0x5e2, 0x20, 0x5d0,
+0x2d, 0x5ea, 0x5f3, 0x5d0, 0x5e0, 0x5d9, 0x3b, 0x5d2, 0x5f3, 0x5d5, 0x5de, 0x5d0,
+0x5d3, 0x5d0, 0x20, 0x5d0, 0x5dc, 0x2d, 0x5d0, 0x5d5, 0x5dc, 0x5d0, 0x3b, 0x5d2,
+0x5f3, 0x5d5, 0x5de, 0x5d0, 0x5d3, 0x5d0, 0x20, 0x5d0, 0x2d, 0x5ea, 0x5f3, 0x5d0,
+0x5e0, 0x5d9, 0x5d4, 0x3b, 0x5e8, 0x5d2, 0x5f3, 0x5d1, 0x3b, 0x5e9, 0x5e2, 0x5d1,
+0x5d0, 0x5df, 0x3b, 0x5e8, 0x5de, 0x5d3, 0x5d0, 0x5df, 0x3b, 0x5e9, 0x5d5, 0x5d5,
+0x5d0, 0x5dc, 0x3b, 0x5d3, 0x5f3, 0x5d5, 0x20, 0x5d0, 0x5dc, 0x5be, 0x5e7, 0x5e2,
+0x5d3, 0x5d4, 0x3b, 0x5d3, 0x5f3, 0x5d5, 0x20, 0x5d0, 0x5dc, 0x5be, 0x5d7, 0x5d9,
+0x5d2, 0x5f3, 0x5d4, 0x5de, 0x5d5, 0x5d7, 0x5e8, 0x5dd, 0x3b, 0x5e6, 0x5e4, 0x5e8,
+0x3b, 0x5e8, 0x5d1, 0x5d9, 0x5e2, 0x20, 0x5d0, 0x5f3, 0x3b, 0x5e8, 0x5d1, 0x5d9,
+0x5e2, 0x20, 0x5d1, 0x5f3, 0x3b, 0x5d2, 0x5f3, 0x5d5, 0x5de, 0x5d0, 0x5d3, 0x5d0,
+0x20, 0x5d0, 0x5f3, 0x3b, 0x5d2, 0x5f3, 0x5d5, 0x5de, 0x5d0, 0x5d3, 0x5d0, 0x20,
+0x5d1, 0x5f3, 0x3b, 0x5e8, 0x5d2, 0x5f3, 0x5d1, 0x3b, 0x5e9, 0x5e2, 0x5d1, 0x5d0,
+0x5df, 0x3b, 0x5e8, 0x5de, 0x5d3, 0x5d0, 0x5df, 0x3b, 0x5e9, 0x5d5, 0x5d5, 0x5d0,
+0x5dc, 0x3b, 0x5d3, 0x5f3, 0x5d5, 0x20, 0x5d0, 0x5dc, 0x5be, 0x5e7, 0x5e2, 0x5d3,
+0x5d4, 0x3b, 0x5d3, 0x5f3, 0x5d5, 0x20, 0x5d0, 0x5dc, 0x5be, 0x5d7, 0x5d9, 0x5d2,
+0x5f3, 0x5d4, 0x92e, 0x941, 0x939, 0x930, 0x94d, 0x930, 0x92e, 0x3b, 0x938, 0x92b,
+0x930, 0x3b, 0x930, 0x93e, 0x92c, 0x940, 0x20, 0x92a, 0x94d, 0x930, 0x925, 0x92e,
+0x3b, 0x930, 0x93e, 0x92c, 0x940, 0x20, 0x926, 0x94d, 0x935, 0x93f, 0x924, 0x940,
+0x92f, 0x3b, 0x91c, 0x941, 0x92e, 0x94d, 0x921, 0x93e, 0x20, 0x92a, 0x94d, 0x930,
+0x925, 0x92e, 0x3b, 0x91c, 0x941, 0x92e, 0x94d, 0x921, 0x93e, 0x20, 0x926, 0x94d,
+0x935, 0x93f, 0x924, 0x940, 0x92f, 0x3b, 0x930, 0x91c, 0x92c, 0x3b, 0x936, 0x93e,
+0x935, 0x928, 0x3b, 0x930, 0x92e, 0x91c, 0x93e, 0x928, 0x3b, 0x936, 0x935, 0x94d,
+0x935, 0x94d, 0x932, 0x3b, 0x91c, 0x93f, 0x932, 0x2d, 0x915, 0x94d, 0x926, 0x93e,
+0x939, 0x3b, 0x91c, 0x93f, 0x932, 0x94d, 0x2d, 0x939, 0x93f, 0x91c, 0x94d, 0x91c,
+0x93e, 0x939, 0x4d, 0x75, 0x68, 0x61, 0x72, 0x72, 0x61, 0x6d, 0x3b, 0x53,
+0x61, 0x66, 0x61, 0x72, 0x3b, 0x52, 0x61, 0x62, 0x69, 0x20, 0x61, 0x6c,
+0x2d, 0x41, 0x77, 0x77, 0x61, 0x6c, 0x3b, 0x52, 0x61, 0x62, 0x69, 0x20,
+0x61, 0x73, 0x2d, 0x53, 0x61, 0x61, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6d,
+0x61, 0x61, 0x64, 0x61, 0x20, 0x61, 0x6c, 0x2d, 0x41, 0x77, 0x77, 0x61,
+0x6c, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x61, 0x64, 0x61, 0x20, 0x61, 0x73,
+0x2d, 0x53, 0x61, 0x61, 0x6e, 0x69, 0x3b, 0x52, 0x61, 0x6a, 0x61, 0x62,
+0x3b, 0x53, 0x68, 0x61, 0x61, 0x62, 0x61, 0x61, 0x6e, 0x3b, 0x52, 0x61,
+0x6d, 0x7a, 0x61, 0x61, 0x6e, 0x3b, 0x53, 0x68, 0x61, 0x77, 0x77, 0x61,
+0x61, 0x6c, 0x3b, 0x5a, 0x75, 0x2019, 0x6c, 0x2d, 0x51, 0x61, 0x61, 0x64,
+0x61, 0x3b, 0x5a, 0x75, 0x2019, 0x6c, 0x2d, 0x48, 0x69, 0x6a, 0x6a, 0x61,
+0x4d, 0x75, 0x68, 0x3b, 0x53, 0x61, 0x66, 0x3b, 0x52, 0x61, 0x62, 0x69,
+0x20, 0x31, 0x3b, 0x52, 0x61, 0x62, 0x69, 0x20, 0x32, 0x3b, 0x4a, 0x75,
+0x6d, 0x20, 0x31, 0x3b, 0x4a, 0x75, 0x6d, 0x20, 0x32, 0x3b, 0x52, 0x61,
+0x6a, 0x61, 0x62, 0x3b, 0x53, 0x68, 0x61, 0x62, 0x3b, 0x52, 0x61, 0x6d,
+0x3b, 0x53, 0x68, 0x61, 0x77, 0x3b, 0x5a, 0x75, 0x20, 0x51, 0x3b, 0x5a,
+0x75, 0x20, 0x48, 0x4d, 0x6f, 0x68, 0x61, 0x72, 0x72, 0x65, 0x6d, 0x3b,
+0x53, 0x61, 0x66, 0x61, 0x72, 0x3b, 0x52, 0xe9, 0x62, 0x69, 0x20, 0x49,
+0x3b, 0x52, 0xe9, 0x62, 0x69, 0x20, 0x49, 0x49, 0x3b, 0x44, 0x73, 0x65,
+0x6d, 0xe1, 0x64, 0x69, 0x20, 0x49, 0x3b, 0x44, 0x73, 0x65, 0x6d, 0xe1,
+0x64, 0x69, 0x20, 0x49, 0x49, 0x3b, 0x52, 0x65, 0x64, 0x73, 0x65, 0x62,
+0x3b, 0x53, 0x61, 0x62, 0xe1, 0x6e, 0x3b, 0x52, 0x61, 0x6d, 0x61, 0x64,
+0xe1, 0x6e, 0x3b, 0x53, 0x65, 0x76, 0x76, 0xe1, 0x6c, 0x3b, 0x44, 0x73,
+0xfc, 0x6c, 0x20, 0x6b, 0x61, 0x64, 0x65, 0x3b, 0x44, 0x73, 0xfc, 0x6c,
+0x20, 0x68, 0x65, 0x64, 0x73, 0x65, 0x4d, 0x6f, 0x68, 0x61, 0x72, 0x72,
+0x65, 0x6d, 0x3b, 0x53, 0x61, 0x66, 0x61, 0x72, 0x3b, 0x52, 0xe9, 0x62,
+0x69, 0x20, 0x65, 0x6c, 0x20, 0x61, 0x76, 0x76, 0x65, 0x6c, 0x3b, 0x52,
+0xe9, 0x62, 0x69, 0x20, 0x65, 0x6c, 0x20, 0x61, 0x63, 0x63, 0x68, 0x65,
+0x72, 0x3b, 0x44, 0x73, 0x65, 0x6d, 0xe1, 0x64, 0x69, 0x20, 0x65, 0x6c,
+0x20, 0x61, 0x76, 0x76, 0x65, 0x6c, 0x3b, 0x44, 0x73, 0x65, 0x6d, 0xe1,
+0x64, 0x69, 0x20, 0x65, 0x6c, 0x20, 0x61, 0x63, 0x63, 0x68, 0x65, 0x72,
+0x3b, 0x52, 0x65, 0x64, 0x73, 0x65, 0x62, 0x3b, 0x53, 0x61, 0x62, 0xe1,
+0x6e, 0x3b, 0x52, 0x61, 0x6d, 0x61, 0x64, 0xe1, 0x6e, 0x3b, 0x53, 0x65,
+0x76, 0x76, 0xe1, 0x6c, 0x3b, 0x44, 0x73, 0xfc, 0x6c, 0x20, 0x6b, 0x61,
+0x64, 0x65, 0x3b, 0x44, 0x73, 0xfc, 0x6c, 0x20, 0x68, 0x65, 0x64, 0x73,
+0x65, 0x4d, 0x6f, 0x68, 0x2e, 0x3b, 0x53, 0x61, 0x66, 0x2e, 0x3b, 0x52,
+0xe9, 0x62, 0x2e, 0x20, 0x31, 0x3b, 0x52, 0xe9, 0x62, 0x2e, 0x20, 0x32,
+0x3b, 0x44, 0x73, 0x65, 0x6d, 0x2e, 0x20, 0x49, 0x3b, 0x44, 0x73, 0x65,
+0x6d, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x52, 0x65, 0x64, 0x2e, 0x3b, 0x53,
+0x61, 0x62, 0x2e, 0x3b, 0x52, 0x61, 0x6d, 0x2e, 0x3b, 0x53, 0x65, 0x76,
+0x2e, 0x3b, 0x44, 0x73, 0xfc, 0x6c, 0x20, 0x6b, 0x2e, 0x3b, 0x44, 0x73,
+0xfc, 0x6c, 0x20, 0x68, 0x2e, 0x6d, 0x75, 0x68, 0x2e, 0x3b, 0x73, 0x61,
+0x66, 0x2e, 0x3b, 0x72, 0x61, 0x62, 0x2e, 0x20, 0x49, 0x3b, 0x72, 0x61,
+0x62, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x6a, 0x75, 0x6d, 0x2e, 0x20, 0x49,
+0x3b, 0x6a, 0x75, 0x6d, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x72, 0x61, 0x6a,
+0x2e, 0x3b, 0x73, 0x68, 0x61, 0x2e, 0x3b, 0x72, 0x61, 0x6d, 0x2e, 0x3b,
+0x73, 0x68, 0x61, 0x77, 0x2e, 0x3b, 0x64, 0x68, 0x75, 0x2bb, 0x6c, 0x2d,
+0x51, 0x2e, 0x3b, 0x64, 0x68, 0x75, 0x2bb, 0x6c, 0x2d, 0x48, 0x2e, 0x4d,
+0x75, 0x68, 0x61, 0x72, 0x61, 0x6d, 0x3b, 0x53, 0x61, 0x66, 0x61, 0x72,
+0x3b, 0x52, 0x61, 0x62, 0x69, 0x75, 0x6c, 0x61, 0x77, 0x61, 0x6c, 0x3b,
+0x52, 0x61, 0x62, 0x69, 0x75, 0x6c, 0x61, 0x6b, 0x68, 0x69, 0x72, 0x3b,
+0x4a, 0x75, 0x6d, 0x61, 0x64, 0x69, 0x6c, 0x61, 0x77, 0x61, 0x6c, 0x3b,
+0x4a, 0x75, 0x6d, 0x61, 0x64, 0x69, 0x6c, 0x61, 0x6b, 0x68, 0x69, 0x72,
+0x3b, 0x52, 0x61, 0x6a, 0x61, 0x62, 0x3b, 0x53, 0x79, 0x61, 0x6b, 0x62,
+0x61, 0x6e, 0x3b, 0x52, 0x61, 0x6d, 0x61, 0x64, 0x61, 0x6e, 0x3b, 0x53,
+0x79, 0x61, 0x77, 0x61, 0x6c, 0x3b, 0x5a, 0x75, 0x6c, 0x6b, 0x61, 0x69,
+0x64, 0x61, 0x68, 0x3b, 0x5a, 0x75, 0x6c, 0x68, 0x69, 0x6a, 0x61, 0x68,
+0x4d, 0x75, 0x68, 0x2e, 0x3b, 0x53, 0x61, 0x66, 0x2e, 0x3b, 0x52, 0x61,
+0x62, 0x2e, 0x20, 0x41, 0x77, 0x61, 0x6c, 0x3b, 0x52, 0x61, 0x62, 0x2e,
+0x20, 0x41, 0x6b, 0x68, 0x69, 0x72, 0x3b, 0x4a, 0x75, 0x6d, 0x2e, 0x20,
+0x41, 0x77, 0x61, 0x6c, 0x3b, 0x4a, 0x75, 0x6d, 0x2e, 0x20, 0x41, 0x6b,
+0x68, 0x69, 0x72, 0x3b, 0x52, 0x61, 0x6a, 0x2e, 0x3b, 0x53, 0x79, 0x61,
+0x2e, 0x3b, 0x52, 0x61, 0x6d, 0x2e, 0x3b, 0x53, 0x79, 0x61, 0x77, 0x2e,
+0x3b, 0x5a, 0x75, 0x6c, 0x6b, 0x61, 0x2e, 0x3b, 0x5a, 0x75, 0x6c, 0x68,
+0x69, 0x2e, 0x30e0, 0x30cf, 0x30c3, 0x30e9, 0x30e0, 0x3b, 0x30b5, 0x30d5, 0x30a2, 0x30eb,
+0x3b, 0x30e9, 0x30d3, 0x30fc, 0x30fb, 0x30a6, 0x30eb, 0x30fb, 0x30a2, 0x30a6, 0x30ef, 0x30eb,
+0x3b, 0x30e9, 0x30d3, 0x30fc, 0x30fb, 0x30a6, 0x30c3, 0x30fb, 0x30b5, 0x30fc, 0x30cb, 0x30fc,
+0x3b, 0x30b8, 0x30e5, 0x30de, 0x30fc, 0x30c0, 0x30eb, 0x30fb, 0x30a2, 0x30a6, 0x30ef, 0x30eb,
+0x3b, 0x30b8, 0x30e5, 0x30de, 0x30fc, 0x30c0, 0x30c3, 0x30b5, 0x30fc, 0x30cb, 0x30fc, 0x3b,
+0x30e9, 0x30b8, 0x30e3, 0x30d6, 0x3b, 0x30b7, 0x30e3, 0x30a2, 0x30d0, 0x30fc, 0x30f3, 0x3b,
+0x30e9, 0x30de, 0x30c0, 0x30fc, 0x30f3, 0x3b, 0x30b7, 0x30e3, 0x30a6, 0x30ef, 0x30fc, 0x30eb,
+0x3b, 0x30ba, 0x30eb, 0x30fb, 0x30ab, 0x30a4, 0x30c0, 0x3b, 0x30ba, 0x30eb, 0x30fb, 0x30d2,
+0x30c3, 0x30b8, 0x30e3, 0x53, 0x75, 0x72, 0x61, 0x3b, 0x53, 0x61, 0x70, 0x61,
+0x72, 0x3b, 0x4d, 0x75, 0x6c, 0x75, 0x64, 0x3b, 0x42, 0x61, 0x6b, 0x64,
+0x61, 0x20, 0x4d, 0x75, 0x6c, 0x75, 0x64, 0x3b, 0x4a, 0x75, 0x6d, 0x61,
+0x64, 0x69, 0x6c, 0x61, 0x77, 0x61, 0x6c, 0x3b, 0x4a, 0x75, 0x6d, 0x61,
+0x64, 0x69, 0x6c, 0x61, 0x6b, 0x69, 0x72, 0x3b, 0x52, 0x65, 0x6a, 0x65,
+0x62, 0x3b, 0x52, 0x75, 0x77, 0x61, 0x68, 0x3b, 0x50, 0x61, 0x73, 0x61,
+0x3b, 0x53, 0x61, 0x77, 0x61, 0x6c, 0x3b, 0x53, 0x65, 0x6c, 0x6f, 0x3b,
+0x42, 0x65, 0x73, 0x61, 0x72, 0x53, 0x75, 0x72, 0x2e, 0x3b, 0x53, 0x61,
+0x70, 0x2e, 0x3b, 0x4d, 0x75, 0x6c, 0x2e, 0x3b, 0x42, 0x2e, 0x20, 0x4d,
+0x75, 0x6c, 0x2e, 0x3b, 0x4a, 0x75, 0x6d, 0x2e, 0x20, 0x41, 0x77, 0x2e,
+0x3b, 0x4a, 0x75, 0x6d, 0x2e, 0x20, 0x41, 0x6b, 0x2e, 0x3b, 0x52, 0x65,
+0x6a, 0x2e, 0x3b, 0x52, 0x75, 0x77, 0x2e, 0x3b, 0x50, 0x73, 0x6f, 0x2e,
+0x3b, 0x53, 0x68, 0x61, 0x77, 0x2e, 0x3b, 0x53, 0x6c, 0x6f, 0x2e, 0x3b,
+0x42, 0x73, 0x61, 0x72, 0x2e, 0xcae, 0xcc1, 0xcb9, 0xcb0, 0xcae, 0xccd, 0x3b,
+0xcb8, 0xcab, 0xcbe, 0xcb0, 0xccd, 0x3b, 0xcb0, 0xcac, 0xcbf, 0x2018, 0x20, 0x49,
+0x3b, 0xcb0, 0xcac, 0xcbf, 0x2018, 0x20, 0x49, 0x49, 0x3b, 0xc9c, 0xcc1, 0xcae,
+0xcbe, 0xca6, 0xcbe, 0x20, 0x49, 0x3b, 0xc9c, 0xcc1, 0xcae, 0xcbe, 0xca6, 0xcbe,
+0x20, 0x49, 0x49, 0x3b, 0xcb0, 0xc9c, 0xcac, 0xccd, 0x3b, 0xcb6, 0x2019, 0xcac,
+0xcbe, 0xca8, 0xccd, 0x3b, 0xcb0, 0xcae, 0xca6, 0xcbe, 0xca8, 0xccd, 0x3b, 0xcb6,
+0xcb5, 0xccd, 0xcb5, 0xcbe, 0xcb2, 0xccd, 0x3b, 0xca7, 0xcc1, 0x2018, 0xcb2, 0xccd,
+0x2d, 0xc95, 0xcbf, 0x2018, 0xca1, 0xcbe, 0xcb9, 0xccd, 0x3b, 0xca7, 0xcc1, 0x2018,
+0xcb2, 0xccd, 0x2d, 0xcb9, 0xcbf, 0xc9c, 0xcbe, 0xcb9, 0xccd, 0xcae, 0xcc1, 0xcb9,
+0xccd, 0x2e, 0x3b, 0xcb8, 0xcab, 0xcbe, 0x2e, 0x3b, 0xcb0, 0xcac, 0xcbf, 0x2018,
+0x20, 0x49, 0x3b, 0xcb0, 0xcac, 0xcbf, 0x2018, 0x20, 0x49, 0x49, 0x3b, 0xc9c,
+0xcc1, 0xcae, 0xccd, 0x2e, 0x20, 0x49, 0x3b, 0xc9c, 0xcc1, 0xcae, 0xccd, 0x2e,
+0x20, 0x49, 0x49, 0x3b, 0xcb0, 0xc9c, 0xccd, 0x2e, 0x3b, 0xcb6, 0x2e, 0x3b,
+0xcb0, 0xcae, 0xccd, 0x2e, 0x3b, 0xcb6, 0xcb5, 0xccd, 0x2e, 0x3b, 0xca7, 0xcc1,
+0x2018, 0xcb2, 0xccd, 0x2d, 0xc95, 0xcbf, 0x2e, 0x3b, 0xca7, 0xcc1, 0x2018, 0xcb2,
+0xccd, 0x2d, 0xcb9, 0x2e, 0x41c, 0x4b1, 0x445, 0x430, 0x440, 0x440, 0x430, 0x43c,
+0x3b, 0x421, 0x430, 0x444, 0x430, 0x440, 0x3b, 0x420, 0x430, 0x431, 0x438, 0x493,
+0x20, 0x4d9, 0x43b, 0x2d, 0x4d9, 0x443, 0x443, 0x4d9, 0x43b, 0x3b, 0x420, 0x430,
+0x431, 0x438, 0x493, 0x20, 0x4d9, 0x441, 0x2d, 0x441, 0x4d9, 0x43d, 0x438, 0x3b,
+0x414, 0x436, 0x443, 0x43c, 0x430, 0x434, 0x430, 0x20, 0x4d9, 0x43b, 0x2d, 0x4d9,
+0x443, 0x443, 0x4d9, 0x43b, 0x3b, 0x416, 0x443, 0x43c, 0x430, 0x434, 0x20, 0x430,
+0x441, 0x2d, 0x441, 0x4d9, 0x43d, 0x438, 0x3b, 0x420, 0x430, 0x434, 0x436, 0x430,
+0x431, 0x3b, 0x428, 0x430, 0x493, 0x431, 0x430, 0x43d, 0x3b, 0x420, 0x430, 0x43c,
+0x430, 0x434, 0x430, 0x43d, 0x3b, 0x428, 0x4d9, 0x443, 0x443, 0x4d9, 0x43b, 0x3b,
+0x417, 0x443, 0x43b, 0x2d, 0x49a, 0x430, 0x493, 0x434, 0x430, 0x3b, 0x417, 0x443,
+0x43b, 0x2d, 0x425, 0x438, 0x434, 0x436, 0x430, 0x41c, 0x4b1, 0x445, 0x2e, 0x3b,
+0x421, 0x430, 0x444, 0x2e, 0x3b, 0x420, 0x430, 0x431, 0x2e, 0x20, 0x406, 0x3b,
+0x420, 0x430, 0x431, 0x2e, 0x20, 0x406, 0x406, 0x3b, 0x416, 0x443, 0x43c, 0x2e,
+0x20, 0x406, 0x3b, 0x416, 0x443, 0x43c, 0x2e, 0x20, 0x406, 0x406, 0x3b, 0x420,
+0x430, 0x434, 0x436, 0x2e, 0x3b, 0x428, 0x430, 0x493, 0x2e, 0x3b, 0x420, 0x430,
+0x43c, 0x2e, 0x3b, 0x428, 0x4d9, 0x443, 0x2e, 0x3b, 0x417, 0x443, 0x43b, 0x2d,
+0x49a, 0x2e, 0x3b, 0x417, 0x443, 0x43b, 0x2d, 0x425, 0x2e, 0x49a, 0x430, 0x4a3,
+0x2e, 0x3b, 0x410, 0x49b, 0x43f, 0x2e, 0x3b, 0x41d, 0x430, 0x443, 0x2e, 0x3b,
+0x421, 0x4d9, 0x443, 0x2e, 0x3b, 0x41c, 0x430, 0x43c, 0x2e, 0x3b, 0x4a, 0x75,
+0x6d, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x448, 0x456, 0x43b, 0x2e, 0x3b, 0x442,
+0x430, 0x43c, 0x2e, 0x3b, 0x49a, 0x44b, 0x440, 0x2e, 0x3b, 0x49a, 0x430, 0x437,
+0x2e, 0x3b, 0x49a, 0x430, 0x440, 0x2e, 0x3b, 0x416, 0x435, 0x43b, 0x2e, 0xbb34,
+0xd558, 0xb78c, 0x3b, 0xc0ac, 0xd30c, 0xb974, 0x3b, 0xb77c, 0xbe44, 0x20, 0xc54c, 0x20,
+0xc544, 0xc648, 0x3b, 0xb77c, 0xbe44, 0x20, 0xc54c, 0x20, 0xc384, 0xb2c8, 0x3b, 0xc8fc,
+0xb9c8, 0xb2e4, 0x20, 0xc54c, 0x20, 0xc544, 0xc648, 0x3b, 0xc8fc, 0xb9c8, 0xb2e4, 0x20,
+0xc54c, 0x20, 0xc384, 0xb2c8, 0x3b, 0xb77c, 0xc7a1, 0x3b, 0xc250, 0xc544, 0xbc18, 0x3b,
+0xb77c, 0xb9c8, 0xb2e8, 0x3b, 0xc250, 0xc648, 0x3b, 0xb4c0, 0x20, 0xc54c, 0x20, 0xae4c,
+0xb2e4, 0x3b, 0xb4c0, 0x20, 0xc54c, 0x20, 0xd788, 0xc790, 0x6d, 0x75, 0x68, 0x65,
+0x72, 0x65, 0x6d, 0x3b, 0x73, 0x65, 0x66, 0x65, 0x72, 0x3b, 0x72, 0x65,
+0x62, 0xee, 0x2bf, 0x75, 0x6c, 0x65, 0x77, 0x65, 0x6c, 0x3b, 0x72, 0x65,
+0x62, 0xee, 0x2bf, 0x75, 0x6c, 0x61, 0x78, 0x65, 0x72, 0x3b, 0x63, 0x65,
+0x6d, 0x61, 0x7a, 0xee, 0x79, 0x65, 0x6c, 0x65, 0x77, 0x65, 0x6c, 0x3b,
+0x63, 0x65, 0x6d, 0x61, 0x7a, 0xee, 0x79, 0x65, 0x6c, 0x61, 0x78, 0x65,
+0x72, 0x3b, 0x72, 0x65, 0x63, 0x65, 0x62, 0x3b, 0x15f, 0x65, 0x2bf, 0x62,
+0x61, 0x6e, 0x3b, 0x72, 0x65, 0x6d, 0x65, 0x7a, 0x61, 0x6e, 0x3b, 0x15f,
+0x65, 0x77, 0x61, 0x6c, 0x3b, 0x7a, 0xee, 0x6c, 0x71, 0x65, 0x2bf, 0x64,
+0x65, 0x3b, 0x7a, 0x69, 0x6c, 0x68, 0x65, 0x63, 0x65, 0x6d, 0x75, 0x68,
+0x2e, 0x3b, 0x73, 0x65, 0x66, 0x2e, 0x3b, 0x72, 0x65, 0x62, 0x2e, 0x20,
+0x49, 0x65, 0x6d, 0x3b, 0x72, 0x65, 0x62, 0x2e, 0x20, 0x49, 0x49, 0x79,
+0x65, 0x6d, 0x3b, 0x63, 0x6d, 0x7a, 0x2e, 0x20, 0x49, 0x65, 0x6d, 0x3b,
+0x63, 0x6d, 0x7a, 0x2e, 0x20, 0x49, 0x49, 0x79, 0x65, 0x6d, 0x3b, 0x72,
+0x63, 0x62, 0x2e, 0x3b, 0x15f, 0x62, 0x6e, 0x2e, 0x3b, 0x72, 0x6d, 0x7a,
+0x2e, 0x3b, 0x15f, 0x77, 0x6c, 0x2e, 0x3b, 0x7a, 0x71, 0x64, 0x2e, 0x3b,
+0x7a, 0x68, 0x63, 0x2e, 0xea1, 0xeb8, 0xea3, 0xeb0, 0xeae, 0xead, 0xea1, 0x3b,
+0xe8a, 0xeb2, 0xe9f, 0xeb2, 0xea3, 0x3b, 0xeae, 0xead, 0xe94, 0xe9a, 0xeb5, 0x20,
+0x31, 0x3b, 0xeae, 0xead, 0xe94, 0xe9a, 0xeb5, 0x20, 0x32, 0x3b, 0xe88, 0xeb8,
+0xea1, 0xeb2, 0xe94, 0xeb2, 0x20, 0x31, 0x3b, 0xe88, 0xeb8, 0xea1, 0xeb2, 0xe94,
+0xeb2, 0x20, 0x32, 0x3b, 0xeae, 0xeb2, 0xe88, 0xeb1, 0xe9a, 0x3b, 0xe8a, 0xeb0,
+0xe9a, 0xeb2, 0xe99, 0x3b, 0xeae, 0xeb2, 0xea1, 0xeb2, 0xe94, 0xead, 0xe99, 0x3b,
+0xec0, 0xe8a, 0xebb, 0xeb2, 0xea7, 0xeb1, 0xe94, 0x3b, 0xe94, 0xeb8, 0xead, 0xeb1,
+0xe94, 0xe81, 0xeb4, 0xe94, 0xeb0, 0x3b, 0xe94, 0xeb8, 0xead, 0xeb1, 0xe94, 0xe81,
+0xeb4, 0xe88, 0xeb0, 0xea1, 0xeb8, 0xeae, 0xeb1, 0xe94, 0x3b, 0xec0, 0xe84, 0xeb2,
+0xeb0, 0x3b, 0xeae, 0xead, 0xe81, 0xe9a, 0xeb5, 0x20, 0x31, 0x3b, 0xeae, 0xead,
+0xe81, 0xe9a, 0xeb5, 0x20, 0x32, 0x3b, 0xe99, 0xeb8, 0xea1, 0xeb2, 0x20, 0x31,
+0x3b, 0xe99, 0xeb8, 0xea1, 0xeb2, 0x20, 0x32, 0x3b, 0xec0, 0xeae, 0xeb2, 0xeb0,
+0x3b, 0xe8a, 0xeb2, 0x3b, 0xec0, 0xeae, 0xeb2, 0xeb0, 0xea1, 0xeb0, 0x3b, 0xec0,
+0xe8a, 0xebb, 0xeb2, 0x3b, 0xe8a, 0xeb8, 0xea5, 0xe81, 0xeb4, 0xead, 0xeb8, 0x3b,
+0xe8a, 0xeb8, 0xea5, 0xeab, 0xeb4, 0xe88, 0xea1, 0xeb8, 0xeae, 0xeb1, 0xe94, 0x3b,
+0xec0, 0xe84, 0xeb2, 0xeb0, 0x3b, 0xeae, 0xead, 0xe94, 0xe9a, 0xeb5, 0x20, 0x31,
+0x3b, 0xeae, 0xead, 0xe81, 0xe9a, 0xeb5, 0x20, 0x32, 0x3b, 0xe99, 0xeb8, 0xea1,
+0xeb2, 0x20, 0x31, 0x3b, 0xe99, 0xeb8, 0xea1, 0xeb2, 0x20, 0x32, 0x3b, 0xec0,
+0xeae, 0xeb2, 0xeb0, 0x3b, 0xe8a, 0xeb0, 0xead, 0xecc, 0x3b, 0xec0, 0xeae, 0xeb2,
+0xeb0, 0xea1, 0xeb0, 0x3b, 0xec0, 0xe8a, 0xebb, 0xeb2, 0x3b, 0xe8a, 0xeb8, 0xea5,
+0xe81, 0xeb4, 0xead, 0xeb8, 0x3b, 0xe8a, 0xeb8, 0xea5, 0xeab, 0xeb4, 0xe88, 0x6d,
+0x75, 0x68, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3b, 0x73, 0x61, 0x66, 0x61,
+0x72, 0x73, 0x3b, 0x31, 0x2e, 0x20, 0x72, 0x61, 0x62, 0x12b, 0x3b, 0x32,
+0x2e, 0x20, 0x72, 0x61, 0x62, 0x12b, 0x3b, 0x31, 0x2e, 0x20, 0x64, 0x17e,
+0x75, 0x6d, 0x101, 0x64, 0x101, 0x3b, 0x32, 0x2e, 0x20, 0x64, 0x17e, 0x75,
+0x6d, 0x101, 0x64, 0x101, 0x3b, 0x72, 0x61, 0x64, 0x17e, 0x61, 0x62, 0x73,
+0x3b, 0x161, 0x61, 0x62, 0x61, 0x6e, 0x73, 0x3b, 0x72, 0x61, 0x6d, 0x61,
+0x64, 0x101, 0x6e, 0x73, 0x3b, 0x161, 0x61, 0x75, 0x76, 0x61, 0x6c, 0x73,
+0x3b, 0x64, 0x75, 0x20, 0x61, 0x6c, 0x2d, 0x6b, 0x69, 0x64, 0x101, 0x3b,
+0x64, 0x75, 0x20, 0x61, 0x6c, 0x2d, 0x68, 0x69, 0x64, 0x17e, 0x101, 0x43c,
+0x443, 0x445, 0x430, 0x440, 0x435, 0x43c, 0x3b, 0x441, 0x430, 0x444, 0x430, 0x440,
+0x3b, 0x440, 0x430, 0x431, 0x438, 0x20, 0x49, 0x3b, 0x440, 0x430, 0x431, 0x438,
+0x20, 0x49, 0x49, 0x3b, 0x45f, 0x443, 0x43c, 0x430, 0x434, 0x430, 0x20, 0x49,
+0x3b, 0x45f, 0x443, 0x43c, 0x430, 0x434, 0x430, 0x20, 0x49, 0x49, 0x3b, 0x440,
+0x430, 0x45f, 0x430, 0x431, 0x3b, 0x448, 0x430, 0x431, 0x430, 0x43d, 0x3b, 0x440,
+0x430, 0x43c, 0x430, 0x434, 0x430, 0x43d, 0x3b, 0x448, 0x430, 0x432, 0x430, 0x43b,
+0x3b, 0x434, 0x443, 0x43b, 0x43a, 0x438, 0x434, 0x430, 0x3b, 0x434, 0x443, 0x43b,
+0x445, 0x438, 0x45f, 0x430, 0x43c, 0x443, 0x445, 0x2e, 0x3b, 0x441, 0x430, 0x444,
+0x2e, 0x3b, 0x440, 0x430, 0x431, 0x2e, 0x20, 0x49, 0x3b, 0x440, 0x430, 0x431,
+0x2e, 0x20, 0x49, 0x49, 0x3b, 0x45f, 0x443, 0x43c, 0x2e, 0x20, 0x49, 0x3b,
+0x45f, 0x443, 0x43c, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x440, 0x430, 0x45f, 0x2e,
+0x3b, 0x448, 0x430, 0x431, 0x2e, 0x3b, 0x440, 0x430, 0x43c, 0x2e, 0x3b, 0x448,
+0x430, 0x432, 0x2e, 0x3b, 0x434, 0x443, 0x43b, 0x43a, 0x2e, 0x3b, 0x434, 0x443,
+0x43b, 0x445, 0x2e, 0xd2e, 0xd41, 0xd39, 0xd31, 0xd02, 0x3b, 0xd38, 0xd2b, 0xd7c,
+0x3b, 0xd31, 0xd2c, 0xd40, 0xd39, 0xd41, 0xd7d, 0x20, 0xd05, 0xd35, 0xd4d, 0xd35,
+0xd7d, 0x3b, 0xd31, 0xd2c, 0xd40, 0xd39, 0xd41, 0xd7d, 0x20, 0xd06, 0xd16, 0xd3f,
+0xd7c, 0x3b, 0xd1c, 0xd2e, 0xd3e, 0xd26, 0xd41, 0xd7d, 0x20, 0xd05, 0xd35, 0xd4d,
+0xd35, 0xd7d, 0x3b, 0xd1c, 0xd2e, 0xd3e, 0xd26, 0xd41, 0xd7d, 0x20, 0xd06, 0xd16,
+0xd3f, 0xd7c, 0x3b, 0xd31, 0xd1c, 0xd2c, 0xd4d, 0x3b, 0xd36, 0xd39, 0xd2c, 0xd3e,
+0xd7b, 0x3b, 0xd31, 0xd2e, 0xd26, 0xd3e, 0xd7b, 0x3b, 0xd36, 0xd35, 0xd4d, 0xd35,
+0xd3e, 0xd7d, 0x3b, 0xd26, 0xd41, 0xd7d, 0x20, 0xd16, 0xd39, 0xd26, 0xd4d, 0x3b,
+0xd26, 0xd41, 0xd7d, 0x20, 0xd39, 0xd3f, 0xd1c, 0xd4d, 0xd1c, 0xd2e, 0xd41, 0xd39,
+0xd31, 0xd02, 0x3b, 0xd38, 0xd2b, 0xd7c, 0x3b, 0xd31, 0xd2c, 0xd40, 0xd39, 0xd41,
+0xd7d, 0x20, 0xd05, 0xd35, 0xd4d, 0xd35, 0xd7d, 0x3b, 0xd31, 0xd2c, 0xd40, 0xd39,
+0xd41, 0xd7d, 0x20, 0xd06, 0xd16, 0xd3f, 0xd7c, 0x3b, 0xd1c, 0xd2e, 0xd3e, 0xd26,
+0xd41, 0xd7d, 0x20, 0xd05, 0xd35, 0xd4d, 0xd35, 0xd7d, 0x3b, 0xd1c, 0xd2e, 0xd3e,
+0xd26, 0xd41, 0xd7d, 0x20, 0xd06, 0xd16, 0xd3f, 0xd7c, 0x3b, 0xd31, 0xd1c, 0xd2c,
+0xd4d, 0x3b, 0xd36, 0xd39, 0xd2c, 0xd3e, 0xd7b, 0x3b, 0xd31, 0xd2e, 0xd33, 0xd3e,
+0xd7b, 0x3b, 0xd36, 0xd35, 0xd4d, 0xd35, 0xd3e, 0xd7d, 0x3b, 0xd26, 0xd41, 0xd7d,
+0x20, 0xd16, 0xd39, 0xd26, 0xd4d, 0x3b, 0xd26, 0xd41, 0xd7d, 0x20, 0xd39, 0xd3f,
+0xd1c, 0xd4d, 0xd1c, 0xd2e, 0xd41, 0xd39, 0x2e, 0x3b, 0xd38, 0xd2b, 0x2e, 0x3b,
+0xd31, 0xd2c, 0xd40, 0xd39, 0xd41, 0xd7d, 0x20, 0xd05, 0xd35, 0xd4d, 0xd35, 0x2e,
+0x3b, 0xd31, 0xd2c, 0xd40, 0xd39, 0xd41, 0xd7d, 0x20, 0xd06, 0xd16, 0xd3f, 0x2e,
+0x3b, 0xd1c, 0xd2e, 0xd3e, 0xd26, 0xd41, 0xd7d, 0x20, 0xd05, 0xd35, 0xd4d, 0xd35,
+0x2e, 0x3b, 0xd1c, 0xd2e, 0xd3e, 0xd26, 0xd41, 0xd7d, 0x20, 0xd06, 0xd16, 0xd3f,
+0x2e, 0x3b, 0xd31, 0xd1c, 0x2e, 0x3b, 0xd36, 0xd39, 0xd2c, 0xd3e, 0x2e, 0x3b,
+0xd31, 0xd2e, 0xd26, 0xd3e, 0x2e, 0x3b, 0xd36, 0xd35, 0xd4d, 0xd35, 0xd3e, 0x2e,
+0x3b, 0xd26, 0xd41, 0xd7d, 0x20, 0xd16, 0xd39, 0x2e, 0x3b, 0xd26, 0xd41, 0xd7d,
+0x20, 0xd39, 0xd3f, 0x2e, 0xd2e, 0xd41, 0x3b, 0xd38, 0x3b, 0xd31, 0x3b, 0xd31,
+0x3b, 0xd1c, 0x3b, 0xd1c, 0x3b, 0xd31, 0x3b, 0xd36, 0x3b, 0xd31, 0x3b, 0xd36,
+0x3b, 0xd26, 0xd41, 0x3b, 0xd26, 0xd41, 0x4d, 0x75, 0x68, 0x61, 0x72, 0x61,
+0x6d, 0x3b, 0x53, 0x61, 0x66, 0x61, 0x72, 0x3b, 0x52, 0x61, 0x62, 0x69,
+0x75, 0x6c, 0x61, 0x77, 0x61, 0x6c, 0x3b, 0x52, 0x61, 0x62, 0x69, 0x75,
+0x6c, 0x61, 0x6b, 0x68, 0x69, 0x72, 0x3b, 0x4a, 0x61, 0x6d, 0x61, 0x64,
+0x69, 0x6c, 0x61, 0x77, 0x61, 0x6c, 0x3b, 0x4a, 0x61, 0x6d, 0x61, 0x64,
+0x69, 0x6c, 0x61, 0x6b, 0x68, 0x69, 0x72, 0x3b, 0x52, 0x65, 0x6a, 0x61,
+0x62, 0x3b, 0x53, 0x79, 0x61, 0x61, 0x62, 0x61, 0x6e, 0x3b, 0x52, 0x61,
+0x6d, 0x61, 0x64, 0x61, 0x6e, 0x3b, 0x53, 0x79, 0x61, 0x77, 0x61, 0x6c,
+0x3b, 0x5a, 0x75, 0x6c, 0x6b, 0x61, 0x65, 0x64, 0x61, 0x68, 0x3b, 0x5a,
+0x75, 0x6c, 0x68, 0x69, 0x6a, 0x61, 0x68, 0x4d, 0x75, 0x68, 0x2e, 0x3b,
+0x53, 0x61, 0x66, 0x2e, 0x3b, 0x52, 0x61, 0x62, 0x2e, 0x20, 0x49, 0x3b,
+0x52, 0x61, 0x62, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x4a, 0x61, 0x6d, 0x2e,
+0x20, 0x49, 0x3b, 0x4a, 0x61, 0x6d, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x52,
+0x65, 0x6a, 0x2e, 0x3b, 0x53, 0x79, 0x61, 0x61, 0x2e, 0x3b, 0x52, 0x61,
+0x6d, 0x2e, 0x3b, 0x53, 0x79, 0x61, 0x77, 0x2e, 0x3b, 0x5a, 0x75, 0x6c,
+0x6b, 0x2e, 0x3b, 0x5a, 0x75, 0x6c, 0x68, 0x2e, 0x92e, 0x94b, 0x939, 0x930,
+0x92e, 0x3b, 0x938, 0x92b, 0x930, 0x3b, 0x930, 0x93e, 0x92c, 0x940, 0x20, 0x49,
+0x3b, 0x930, 0x93e, 0x92c, 0x940, 0x20, 0x49, 0x49, 0x3b, 0x91c, 0x941, 0x92e,
+0x93e, 0x926, 0x93e, 0x20, 0x49, 0x3b, 0x91c, 0x941, 0x92e, 0x93e, 0x926, 0x93e,
+0x20, 0x49, 0x49, 0x3b, 0x930, 0x91d, 0x93e, 0x92c, 0x3b, 0x936, 0x93e, 0x92c,
+0x93e, 0x928, 0x3b, 0x930, 0x92e, 0x91c, 0x93e, 0x928, 0x3b, 0x936, 0x935, 0x94d,
+0x935, 0x93e, 0x932, 0x3b, 0x927, 0x941, 0x932, 0x2d, 0x915, 0x940, 0x926, 0x93e,
+0x939, 0x3b, 0x927, 0x941, 0x932, 0x2d, 0x939, 0x93f, 0x91c, 0x93e, 0x939, 0x92e,
+0x94b, 0x939, 0x2e, 0x3b, 0x938, 0x92b, 0x2e, 0x3b, 0x930, 0x93e, 0x92c, 0x940,
+0x20, 0x49, 0x3b, 0x930, 0x93e, 0x92c, 0x940, 0x20, 0x49, 0x49, 0x3b, 0x91c,
+0x941, 0x92e, 0x93e, 0x2e, 0x20, 0x49, 0x3b, 0x91c, 0x941, 0x92e, 0x93e, 0x2e,
+0x20, 0x49, 0x49, 0x3b, 0x930, 0x91d, 0x93e, 0x2e, 0x3b, 0x936, 0x93e, 0x92c,
+0x93e, 0x2e, 0x3b, 0x930, 0x92e, 0x2e, 0x3b, 0x936, 0x935, 0x94d, 0x935, 0x93e,
+0x2e, 0x3b, 0x927, 0x941, 0x932, 0x2d, 0x915, 0x940, 0x2e, 0x3b, 0x927, 0x941,
+0x932, 0x2d, 0x939, 0x93f, 0x2e, 0x967, 0x3b, 0x968, 0x3b, 0x969, 0x3b, 0x96a,
+0x3b, 0x96b, 0x3b, 0x96c, 0x3b, 0x96d, 0x3b, 0x96e, 0x3b, 0x96f, 0x3b, 0x967,
+0x966, 0x3b, 0x967, 0x967, 0x3b, 0x967, 0x968, 0x6d, 0x75, 0x68, 0x61, 0x72,
+0x72, 0x61, 0x6d, 0x3b, 0x73, 0x61, 0x66, 0x61, 0x72, 0x3b, 0x72, 0x61,
+0x62, 0x69, 0x2bb, 0x20, 0x49, 0x3b, 0x72, 0x61, 0x62, 0x69, 0x2bb, 0x20,
+0x49, 0x49, 0x3b, 0x6a, 0x75, 0x6d, 0x61, 0x64, 0x61, 0x20, 0x49, 0x3b,
+0x6a, 0x75, 0x6d, 0x61, 0x64, 0x61, 0x20, 0x49, 0x49, 0x3b, 0x72, 0x61,
+0x6a, 0x61, 0x62, 0x3b, 0x73, 0x68, 0x61, 0x2bb, 0x62, 0x61, 0x6e, 0x3b,
+0x72, 0x61, 0x6d, 0x61, 0x64, 0x61, 0x6e, 0x3b, 0x73, 0x68, 0x61, 0x77,
+0x77, 0x61, 0x6c, 0x3b, 0x64, 0x68, 0x75, 0x2bb, 0x6c, 0x2d, 0x71, 0x69,
+0x2bb, 0x64, 0x61, 0x68, 0x3b, 0x64, 0x68, 0x75, 0x2bb, 0x6c, 0x2d, 0x68,
+0x69, 0x6a, 0x6a, 0x61, 0x68, 0x6d, 0x75, 0x68, 0x2e, 0x3b, 0x73, 0x61,
+0x66, 0x2e, 0x3b, 0x72, 0x61, 0x62, 0x2e, 0x20, 0x49, 0x3b, 0x72, 0x61,
+0x62, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x6a, 0x75, 0x6d, 0x2e, 0x20, 0x49,
+0x3b, 0x6a, 0x75, 0x6d, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x72, 0x61, 0x6a,
+0x2e, 0x3b, 0x73, 0x68, 0x61, 0x2e, 0x3b, 0x72, 0x61, 0x6d, 0x2e, 0x3b,
+0x73, 0x68, 0x61, 0x77, 0x2e, 0x3b, 0x64, 0x68, 0x75, 0x2bb, 0x6c, 0x2d,
+0x71, 0x2e, 0x3b, 0x44, 0x68, 0x75, 0x2bb, 0x6c, 0x2d, 0x48, 0x2e, 0x6d,
+0x75, 0x68, 0x2e, 0x3b, 0x73, 0x61, 0x66, 0x2e, 0x3b, 0x72, 0x61, 0x62,
+0x2e, 0x20, 0x49, 0x3b, 0x72, 0x61, 0x62, 0x2e, 0x20, 0x49, 0x49, 0x3b,
+0x6a, 0x75, 0x6d, 0x2e, 0x20, 0x49, 0x3b, 0x6a, 0x75, 0x6d, 0x2e, 0x20,
+0x49, 0x49, 0x3b, 0x72, 0x61, 0x6a, 0x2e, 0x3b, 0x73, 0x68, 0x61, 0x2e,
+0x3b, 0x72, 0x61, 0x6d, 0x2e, 0x3b, 0x73, 0x68, 0x61, 0x77, 0x2e, 0x3b,
+0x64, 0x68, 0x75, 0x2bb, 0x6c, 0x2d, 0x71, 0x2e, 0x3b, 0x64, 0x68, 0x75,
+0x2bb, 0x6c, 0x2d, 0x68, 0x2e, 0x645, 0x62d, 0x631, 0x645, 0x3b, 0x635, 0x641,
+0x631, 0x3b, 0x631, 0x628, 0x64a, 0x639, 0x3b, 0x631, 0x628, 0x64a, 0x639, 0x20,
+0x49, 0x49, 0x3b, 0x62c, 0x645, 0x627, 0x639, 0x647, 0x3b, 0x62c, 0x645, 0x627,
+0x639, 0x647, 0x20, 0x49, 0x49, 0x3b, 0x631, 0x62c, 0x628, 0x3b, 0x634, 0x639,
+0x628, 0x627, 0x646, 0x3b, 0x631, 0x645, 0x636, 0x627, 0x646, 0x3b, 0x634, 0x648,
+0x627, 0x644, 0x3b, 0x630, 0x64a, 0x20, 0x627, 0x644, 0x642, 0x639, 0x62f, 0x647,
+0x3b, 0x630, 0x64a, 0x20, 0x627, 0x644, 0x62d, 0x62c, 0x645, 0x62d, 0x631, 0x645,
+0x3b, 0x635, 0x641, 0x631, 0x3b, 0x631, 0x628, 0x64a, 0x639, 0x3b, 0x631, 0x628,
+0x64a, 0x639, 0x20, 0x49, 0x49, 0x3b, 0x62c, 0x645, 0x627, 0x62f, 0x20, 0x6f1,
+0x3b, 0x62c, 0x645, 0x627, 0x62f, 0x20, 0x6f2, 0x3b, 0x631, 0x62c, 0x628, 0x3b,
+0x634, 0x639, 0x628, 0x627, 0x646, 0x3b, 0x631, 0x645, 0x636, 0x627, 0x646, 0x3b,
+0x634, 0x648, 0x627, 0x644, 0x3b, 0x62f, 0x627, 0x644, 0x642, 0x627, 0x639, 0x62f,
+0x647, 0x3b, 0x630, 0x64a, 0x20, 0x627, 0x644, 0x62d, 0x62c, 0x645, 0x62d, 0x631,
+0x645, 0x3b, 0x62f, 0x20, 0x635, 0x641, 0x631, 0x6d2, 0x20, 0x62f, 0x3b, 0x631,
+0x628, 0x64a, 0x639, 0x3b, 0x631, 0x628, 0x64a, 0x639, 0x20, 0x49, 0x49, 0x3b,
+0x62c, 0x645, 0x627, 0x639, 0x647, 0x3b, 0x62c, 0x645, 0x627, 0x639, 0x647, 0x20,
+0x49, 0x49, 0x3b, 0x631, 0x62c, 0x628, 0x3b, 0x634, 0x639, 0x628, 0x627, 0x646,
+0x3b, 0x631, 0x645, 0x636, 0x627, 0x646, 0x3b, 0x634, 0x648, 0x627, 0x644, 0x3b,
+0x630, 0x64a, 0x20, 0x627, 0x644, 0x642, 0x639, 0x62f, 0x647, 0x3b, 0x630, 0x64a,
+0x20, 0x627, 0x644, 0x62d, 0x62c, 0x645, 0x62d, 0x631, 0x645, 0x3b, 0x635, 0x641,
+0x631, 0x3b, 0x631, 0x628, 0x6cc, 0x639, 0x200c, 0x627, 0x644, 0x627, 0x648, 0x644,
+0x3b, 0x631, 0x628, 0x6cc, 0x639, 0x200c, 0x627, 0x644, 0x62b, 0x627, 0x646, 0x6cc,
+0x3b, 0x62c, 0x645, 0x627, 0x62f, 0x6cc, 0x200c, 0x627, 0x644, 0x627, 0x648, 0x644,
+0x3b, 0x62c, 0x645, 0x627, 0x62f, 0x6cc, 0x200c, 0x627, 0x644, 0x62b, 0x627, 0x646,
+0x6cc, 0x3b, 0x631, 0x62c, 0x628, 0x3b, 0x634, 0x639, 0x628, 0x627, 0x646, 0x3b,
+0x631, 0x645, 0x636, 0x627, 0x646, 0x3b, 0x634, 0x648, 0x627, 0x644, 0x3b, 0x630,
+0x6cc, 0x642, 0x639, 0x62f, 0x647, 0x3b, 0x630, 0x6cc, 0x62d, 0x62c, 0x647, 0x645,
+0x3b, 0x635, 0x3b, 0x631, 0x3b, 0x631, 0x3b, 0x62c, 0x3b, 0x62c, 0x3b, 0x631,
+0x3b, 0x634, 0x3b, 0x631, 0x3b, 0x634, 0x3b, 0x630, 0x3b, 0x630, 0x4d, 0x75,
+0x68, 0x61, 0x72, 0x72, 0x61, 0x6d, 0x3b, 0x53, 0x61, 0x66, 0x61, 0x72,
+0x3b, 0x52, 0x61, 0x62, 0x69, 0x2bb, 0x20, 0x49, 0x3b, 0x52, 0x61, 0x62,
+0x69, 0x2bb, 0x20, 0x49, 0x49, 0x3b, 0x44, 0x17c, 0x75, 0x6d, 0x61, 0x64,
+0x61, 0x20, 0x49, 0x3b, 0x44, 0x17c, 0x75, 0x6d, 0x61, 0x64, 0x61, 0x20,
+0x49, 0x49, 0x3b, 0x52, 0x61, 0x64, 0x17c, 0x61, 0x62, 0x3b, 0x53, 0x7a,
+0x61, 0x62, 0x61, 0x6e, 0x3b, 0x52, 0x61, 0x6d, 0x61, 0x64, 0x61, 0x6e,
+0x3b, 0x53, 0x7a, 0x61, 0x77, 0x77, 0x61, 0x6c, 0x3b, 0x5a, 0x75, 0x20,
+0x61, 0x6c, 0x2d, 0x6b, 0x61, 0x64, 0x61, 0x3b, 0x5a, 0x75, 0x20, 0x61,
+0x6c, 0x2d, 0x68, 0x69, 0x64, 0x17c, 0x64, 0x17c, 0x61, 0x4d, 0x75, 0x68,
+0x2e, 0x3b, 0x53, 0x61, 0x66, 0x2e, 0x3b, 0x52, 0x61, 0x62, 0x2e, 0x20,
+0x49, 0x3b, 0x52, 0x61, 0x62, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x44, 0x17c,
+0x75, 0x2e, 0x20, 0x49, 0x3b, 0x44, 0x17c, 0x75, 0x2e, 0x20, 0x49, 0x49,
+0x3b, 0x52, 0x61, 0x2e, 0x3b, 0x53, 0x7a, 0x61, 0x2e, 0x3b, 0x52, 0x61,
+0x6d, 0x2e, 0x3b, 0x53, 0x7a, 0x61, 0x77, 0x2e, 0x3b, 0x5a, 0x75, 0x20,
+0x61, 0x6c, 0x2d, 0x6b, 0x2e, 0x3b, 0x5a, 0x75, 0x20, 0x61, 0x6c, 0x2d,
+0x68, 0x2e, 0xa2e, 0xa41, 0xa39, 0xa71, 0xa30, 0xa2e, 0x3b, 0xa38, 0xa2b, 0xa30,
+0x3b, 0xa30, 0xa2c, 0xa40, 0x2bb, 0x20, 0x49, 0x3b, 0xa30, 0xa2c, 0xa40, 0x2bb,
+0x20, 0x49, 0x49, 0x3b, 0xa1c, 0xa41, 0xa2e, 0xa3e, 0xa26, 0xa3e, 0x20, 0x49,
+0x3b, 0xa1c, 0xa41, 0xa2e, 0xa3e, 0xa26, 0xa3e, 0x20, 0x49, 0x49, 0x3b, 0xa30,
+0xa1c, 0xa2c, 0x3b, 0xa38, 0xa3c, 0xa2c, 0xa3e, 0xa28, 0x3b, 0xa30, 0xa2e, 0xa1c,
+0xa3c, 0xa3e, 0xa28, 0x3b, 0xa38, 0xa3c, 0xa35, 0xa3e, 0xa32, 0x3b, 0xa26, 0xa42,
+0x2d, 0xa05, 0xa32, 0x2d, 0xa15, 0xa40, 0xa26, 0xa3e, 0xa39, 0x3b, 0xa26, 0xa42,
+0x2d, 0xa05, 0xa32, 0x2d, 0xa39, 0xa3f, 0xa1c, 0xa4d, 0xa39, 0xa3e, 0xa2e, 0xa41,
+0xa39, 0xa71, 0xa30, 0xa2e, 0x3b, 0xa38, 0xa2b, 0xa30, 0x3b, 0xa30, 0xa2c, 0xa40,
+0x20, 0x2bb, 0x20, 0x49, 0x3b, 0xa30, 0xa2c, 0xa40, 0x20, 0x2bb, 0x20, 0x49,
+0x49, 0x3b, 0xa1c, 0xa41, 0xa2e, 0xa3e, 0xa26, 0xa3e, 0x20, 0x49, 0x3b, 0xa1c,
+0xa41, 0xa2e, 0xa3e, 0xa26, 0xa3e, 0x20, 0x49, 0x49, 0x3b, 0xa30, 0xa1c, 0xa2c,
+0x3b, 0xa38, 0xa3c, 0xa2c, 0xa3e, 0xa28, 0x3b, 0xa30, 0xa2e, 0xa1c, 0xa3c, 0xa3e,
+0xa28, 0x3b, 0xa38, 0xa3c, 0xa35, 0xa3e, 0xa32, 0x3b, 0xa26, 0xa42, 0x2d, 0xa05,
+0xa32, 0x2d, 0xa15, 0xa40, 0xa26, 0xa3e, 0xa39, 0x3b, 0xa26, 0xa42, 0x2d, 0xa05,
+0xa32, 0x2d, 0xa39, 0xa3f, 0xa1c, 0xa4d, 0xa39, 0xa3e, 0xa2e, 0xa41, 0xa39, 0xa71,
+0x2e, 0x3b, 0xa38, 0xa2b, 0x2e, 0x3b, 0xa30, 0xa2c, 0x2e, 0x20, 0x49, 0x3b,
+0xa30, 0xa2c, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0xa1c, 0xa41, 0xa2e, 0x2e, 0x20,
+0x49, 0x3b, 0xa1c, 0xa41, 0xa2e, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0xa30, 0xa3e,
+0xa1c, 0x2e, 0x3b, 0xa38, 0xa3c, 0xa3e, 0x2e, 0x3b, 0xa30, 0xa3e, 0xa2e, 0x2e,
+0x3b, 0xa38, 0xa3c, 0xa05, 0x2e, 0x3b, 0xa26, 0xa42, 0x2d, 0xa05, 0xa32, 0x2d,
+0xa15, 0xa40, 0x2e, 0x3b, 0xa26, 0xa42, 0x2d, 0xa05, 0xa32, 0x2d, 0xa39, 0xa3f,
+0x2e, 0x43c, 0x443, 0x445, 0x430, 0x440, 0x440, 0x430, 0x43c, 0x3b, 0x441, 0x430,
+0x444, 0x430, 0x440, 0x3b, 0x440, 0x430, 0x431, 0x438, 0x2d, 0x443, 0x43b, 0x44c,
+0x2d, 0x430, 0x432, 0x432, 0x430, 0x43b, 0x44c, 0x3b, 0x440, 0x430, 0x431, 0x438,
+0x2d, 0x443, 0x43b, 0x44c, 0x2d, 0x430, 0x445, 0x438, 0x440, 0x3b, 0x434, 0x436,
+0x443, 0x43c, 0x430, 0x434, 0x2d, 0x443, 0x43b, 0x44c, 0x2d, 0x430, 0x432, 0x432,
+0x430, 0x43b, 0x44c, 0x3b, 0x434, 0x436, 0x443, 0x43c, 0x430, 0x434, 0x2d, 0x443,
+0x43b, 0x44c, 0x2d, 0x430, 0x445, 0x438, 0x440, 0x3b, 0x440, 0x430, 0x434, 0x436,
+0x430, 0x431, 0x3b, 0x448, 0x430, 0x430, 0x431, 0x430, 0x43d, 0x3b, 0x440, 0x430,
+0x43c, 0x430, 0x434, 0x430, 0x43d, 0x3b, 0x448, 0x430, 0x432, 0x432, 0x430, 0x43b,
+0x44c, 0x3b, 0x437, 0x443, 0x43b, 0x44c, 0x2d, 0x43a, 0x430, 0x430, 0x434, 0x430,
+0x3b, 0x437, 0x443, 0x43b, 0x44c, 0x2d, 0x445, 0x438, 0x434, 0x436, 0x436, 0x430,
+0x43c, 0x443, 0x445, 0x2e, 0x3b, 0x441, 0x430, 0x444, 0x2e, 0x3b, 0x440, 0x430,
+0x431, 0x2e, 0x20, 0x49, 0x3b, 0x440, 0x430, 0x431, 0x2e, 0x20, 0x49, 0x49,
+0x3b, 0x434, 0x436, 0x443, 0x43c, 0x2e, 0x20, 0x49, 0x3b, 0x434, 0x436, 0x443,
+0x43c, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x440, 0x430, 0x434, 0x436, 0x2e, 0x3b,
+0x448, 0x430, 0x430, 0x431, 0x2e, 0x3b, 0x440, 0x430, 0x43c, 0x2e, 0x3b, 0x448,
+0x430, 0x432, 0x2e, 0x3b, 0x437, 0x443, 0x43b, 0x44c, 0x2d, 0x43a, 0x2e, 0x3b,
+0x437, 0x443, 0x43b, 0x44c, 0x2d, 0x445, 0x2e, 0x6d, 0x75, 0x68, 0x61, 0x72,
+0x72, 0x61, 0x6d, 0x3b, 0x73, 0x61, 0x66, 0x61, 0x72, 0x3b, 0x72, 0x61,
+0x62, 0x69, 0x2bb, 0x20, 0x49, 0x3b, 0x72, 0x61, 0x62, 0x69, 0x2bb, 0x20,
+0x49, 0x49, 0x3b, 0x6a, 0x75, 0x6d, 0x61, 0x64, 0x61, 0x20, 0x49, 0x3b,
+0x6a, 0x75, 0x6d, 0x61, 0x64, 0x61, 0x20, 0x49, 0x49, 0x3b, 0x72, 0x61,
+0x6a, 0x61, 0x62, 0x3b, 0x73, 0x68, 0x61, 0x62, 0x61, 0x6e, 0x3b, 0x72,
+0x61, 0x6d, 0x61, 0x64, 0x61, 0x6e, 0x3b, 0x73, 0x68, 0x61, 0x77, 0x77,
+0x61, 0x6c, 0x3b, 0x64, 0x68, 0x75, 0x2bb, 0x6c, 0x2d, 0x71, 0x69, 0x2bb,
+0x64, 0x61, 0x68, 0x3b, 0x64, 0x68, 0x75, 0x2bb, 0x6c, 0x2d, 0x68, 0x69,
+0x6a, 0x6a, 0x61, 0x68, 0x41c, 0x443, 0x445, 0x430, 0x440, 0x435, 0x43c, 0x3b,
+0x421, 0x430, 0x444, 0x430, 0x440, 0x3b, 0x420, 0x430, 0x431, 0x438, 0x2bb, 0x20,
+0x49, 0x3b, 0x420, 0x430, 0x431, 0x438, 0x2bb, 0x20, 0x49, 0x49, 0x3b, 0x408,
+0x443, 0x43c, 0x430, 0x434, 0x430, 0x20, 0x49, 0x3b, 0x408, 0x443, 0x43c, 0x430,
+0x434, 0x430, 0x20, 0x49, 0x49, 0x3b, 0x420, 0x430, 0x452, 0x430, 0x431, 0x3b,
+0x428, 0x430, 0x2bb, 0x431, 0x430, 0x43d, 0x3b, 0x420, 0x430, 0x43c, 0x430, 0x434,
+0x430, 0x43d, 0x3b, 0x428, 0x430, 0x432, 0x430, 0x43b, 0x3b, 0x414, 0x443, 0x2bb,
+0x43b, 0x2d, 0x41a, 0x438, 0x2bb, 0x434, 0x430, 0x3b, 0x414, 0x443, 0x2bb, 0x43b,
+0x2d, 0x445, 0x438, 0x452, 0x430, 0x4d, 0x75, 0x68, 0x61, 0x72, 0x65, 0x6d,
+0x3b, 0x53, 0x61, 0x66, 0x65, 0x72, 0x3b, 0x52, 0x65, 0x62, 0x69, 0x20,
+0x31, 0x3b, 0x52, 0x65, 0x62, 0x69, 0x20, 0x32, 0x3b, 0x44, 0x17e, 0x75,
+0x6d, 0x61, 0x64, 0x65, 0x20, 0x31, 0x3b, 0x44, 0x17e, 0x75, 0x6d, 0x61,
+0x64, 0x65, 0x20, 0x32, 0x3b, 0x52, 0x65, 0x64, 0x17e, 0x65, 0x62, 0x3b,
+0x160, 0x61, 0x2bb, 0x62, 0x61, 0x6e, 0x3b, 0x52, 0x61, 0x6d, 0x61, 0x7a,
+0x61, 0x6e, 0x3b, 0x160, 0x65, 0x76, 0x61, 0x6c, 0x3b, 0x5a, 0x75, 0x6c,
+0x2d, 0x6b, 0x61, 0x64, 0x65, 0x3b, 0x5a, 0x75, 0x6c, 0x2d, 0x68, 0x69,
+0x64, 0x17e, 0x65, 0x4d, 0x75, 0x68, 0x61, 0x72, 0x65, 0x6d, 0x3b, 0x53,
+0x61, 0x66, 0x61, 0x72, 0x3b, 0x52, 0x61, 0x62, 0x69, 0x2bb, 0x20, 0x49,
+0x3b, 0x52, 0x61, 0x62, 0x69, 0x2bb, 0x20, 0x49, 0x49, 0x3b, 0x4a, 0x75,
+0x6d, 0x61, 0x64, 0x61, 0x20, 0x49, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x64,
+0x61, 0x20, 0x49, 0x49, 0x3b, 0x52, 0x61, 0x111, 0x61, 0x62, 0x3b, 0x160,
+0x61, 0x2bb, 0x62, 0x61, 0x6e, 0x3b, 0x52, 0x61, 0x6d, 0x61, 0x64, 0x61,
+0x6e, 0x3b, 0x160, 0x61, 0x76, 0x61, 0x6c, 0x3b, 0x44, 0x75, 0x2bb, 0x6c,
+0x2d, 0x4b, 0x69, 0x2bb, 0x64, 0x61, 0x3b, 0x44, 0x75, 0x2bb, 0x6c, 0x2d,
+0x68, 0x69, 0x111, 0x61, 0x4d, 0x75, 0x68, 0x2e, 0x3b, 0x53, 0x61, 0x66,
+0x2e, 0x3b, 0x52, 0x65, 0x62, 0x2e, 0x20, 0x31, 0x3b, 0x52, 0x65, 0x62,
+0x2e, 0x20, 0x32, 0x3b, 0x44, 0x17e, 0x75, 0x6d, 0x2e, 0x20, 0x31, 0x3b,
+0x44, 0x17e, 0x75, 0x6d, 0x2e, 0x20, 0x32, 0x3b, 0x52, 0x65, 0x64, 0x17e,
+0x2e, 0x3b, 0x160, 0x61, 0x2e, 0x3b, 0x52, 0x61, 0x6d, 0x2e, 0x3b, 0x160,
+0x65, 0x2e, 0x3b, 0x5a, 0x75, 0x6c, 0x2d, 0x6b, 0x2e, 0x3b, 0x5a, 0x75,
+0x6c, 0x2d, 0x68, 0x2e, 0x645, 0x62d, 0x631, 0x645, 0x3b, 0x635, 0x641, 0x631,
+0x3b, 0x631, 0x628, 0x64a, 0x639, 0x20, 0x627, 0x644, 0x627, 0x648, 0x644, 0x3b,
+0x631, 0x628, 0x6cc, 0x639, 0x20, 0x627, 0x644, 0x627, 0x62e, 0x631, 0x3b, 0x62c,
+0x645, 0x627, 0x62f, 0x6cc, 0x20, 0x627, 0x644, 0x627, 0x648, 0x644, 0x3b, 0x62c,
+0x645, 0x627, 0x62f, 0x64a, 0x20, 0x627, 0x644, 0x627, 0x62e, 0x631, 0x3b, 0x631,
+0x62c, 0x628, 0x3b, 0x634, 0x639, 0x628, 0x627, 0x646, 0x3b, 0x631, 0x645, 0x636,
+0x627, 0x646, 0x3b, 0x634, 0x648, 0x627, 0x644, 0x3b, 0x630, 0x648, 0x627, 0x644,
+0x642, 0x639, 0x62f, 0x3b, 0x630, 0x648, 0x627, 0x644, 0x62d, 0x62c, 0x6c1, 0x61,
+0x6c, 0x2d, 0x6d, 0x75, 0x68, 0x61, 0x72, 0x72, 0x61, 0x6d, 0x3b, 0x73,
+0x61, 0x66, 0x61, 0x72, 0x3b, 0x72, 0x61, 0x62, 0xed, 0xb4, 0x20, 0x61,
+0x6c, 0x2d, 0x61, 0x76, 0x76, 0x61, 0x6c, 0x3b, 0x72, 0x61, 0x62, 0xed,
+0xb4, 0x61, 0x74, 0x68, 0x2d, 0x74, 0x68, 0xe1, 0x6e, 0xed, 0x3b, 0x64,
+0x17e, 0x75, 0x6d, 0xe1, 0x64, 0xe1, 0x20, 0x6c, 0x2d, 0xfa, 0x6c, 0xe1,
+0x3b, 0x64, 0x17e, 0x75, 0x6d, 0xe1, 0x64, 0xe1, 0x20, 0x6c, 0x2d, 0xe1,
+0x63, 0x68, 0x69, 0x72, 0x61, 0x3b, 0x72, 0x61, 0x64, 0x17e, 0x61, 0x62,
+0x3b, 0x161, 0x61, 0xb4, 0x20, 0x62, 0xe1, 0x6e, 0x3b, 0x72, 0x61, 0x6d,
+0x61, 0x64, 0xe1, 0x6e, 0x3b, 0x161, 0x61, 0x75, 0x76, 0xe1, 0x6c, 0x3b,
+0x64, 0x68, 0xfa, 0x20, 0x6c, 0x2d, 0x6b, 0x61, 0xb4, 0x20, 0x64, 0x61,
+0x3b, 0x64, 0x68, 0xfa, 0x20, 0x6c, 0x2d, 0x68, 0x69, 0x64, 0x17e, 0x64,
+0x17e, 0x61, 0x6d, 0x75, 0x68, 0x2e, 0x3b, 0x73, 0x61, 0x66, 0x2e, 0x3b,
+0x72, 0x61, 0x62, 0x2e, 0x20, 0x49, 0x3b, 0x72, 0x61, 0x62, 0x2e, 0x20,
+0x49, 0x49, 0x3b, 0x64, 0x17e, 0x75, 0x6d, 0x2e, 0x20, 0x49, 0x3b, 0x64,
+0x17e, 0x75, 0x6d, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x72, 0x61, 0x64, 0x2e,
+0x3b, 0x161, 0x61, 0x2e, 0x3b, 0x72, 0x61, 0x6d, 0x2e, 0x3b, 0x161, 0x61,
+0x75, 0x2e, 0x3b, 0x64, 0x68, 0xfa, 0x20, 0x6c, 0x2d, 0x6b, 0x2e, 0x3b,
+0x64, 0x68, 0xfa, 0x20, 0x6c, 0x2d, 0x68, 0x2e, 0x4d, 0x75, 0x78, 0x61,
+0x72, 0x72, 0x61, 0x6d, 0x3b, 0x53, 0x61, 0x66, 0x61, 0x72, 0x3b, 0x52,
+0x61, 0x62, 0x69, 0x63, 0x20, 0x61, 0x6c, 0x2d, 0x61, 0x77, 0x77, 0x61,
+0x6c, 0x3b, 0x52, 0x61, 0x62, 0x69, 0x63, 0x20, 0x61, 0x6c, 0x2d, 0x74,
+0x68, 0x61, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x64, 0x61, 0x20,
+0x61, 0x6c, 0x2d, 0x61, 0x77, 0x77, 0x61, 0x6c, 0x3b, 0x6a, 0x75, 0x6d,
+0x61, 0x64, 0x61, 0x20, 0x61, 0x6c, 0x2d, 0x74, 0x68, 0x61, 0x6e, 0x69,
+0x3b, 0x52, 0x61, 0x6a, 0x61, 0x62, 0x3b, 0x53, 0x68, 0x61, 0x63, 0x62,
+0x61, 0x6e, 0x3b, 0x52, 0x61, 0x6d, 0x61, 0x64, 0x61, 0x6e, 0x3b, 0x53,
+0x68, 0x61, 0x77, 0x77, 0x61, 0x6c, 0x3b, 0x44, 0x75, 0x6c, 0x20, 0x61,
+0x6c, 0x2d, 0x71, 0x61, 0x63, 0x64, 0x61, 0x68, 0x3b, 0x44, 0x75, 0x6c,
+0x20, 0x78, 0x69, 0x6a, 0x6a, 0x61, 0x68, 0x4d, 0x75, 0x78, 0x61, 0x72,
+0x72, 0x61, 0x6d, 0x3b, 0x53, 0x61, 0x66, 0x61, 0x72, 0x3b, 0x52, 0x61,
+0x62, 0x69, 0x63, 0x20, 0x61, 0x6c, 0x2d, 0x61, 0x77, 0x77, 0x61, 0x6c,
+0x3b, 0x52, 0x61, 0x62, 0x69, 0x63, 0x20, 0x61, 0x6c, 0x2d, 0x74, 0x68,
+0x61, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x64, 0x61, 0x20, 0x61,
+0x6c, 0x2d, 0x61, 0x77, 0x77, 0x61, 0x6c, 0x3b, 0x6a, 0x75, 0x6d, 0x61,
+0x64, 0x61, 0x20, 0x61, 0x6c, 0x2d, 0x74, 0x68, 0x61, 0x6e, 0x69, 0x3b,
+0x52, 0x61, 0x6a, 0x61, 0x62, 0x3b, 0x53, 0x68, 0x61, 0x63, 0x62, 0x61,
+0x6e, 0x3b, 0x52, 0x61, 0x6d, 0x61, 0x64, 0x61, 0x6e, 0x3b, 0x53, 0x68,
+0x61, 0x77, 0x77, 0x61, 0x6c, 0x3b, 0x44, 0x75, 0x6c, 0x20, 0x61, 0x6c,
+0x2d, 0x71, 0x61, 0x63, 0x64, 0x61, 0x3b, 0x44, 0x75, 0x6c, 0x20, 0x78,
+0x69, 0x6a, 0x6a, 0x61, 0x68, 0x4d, 0x75, 0x78, 0x2e, 0x3b, 0x53, 0x61,
+0x66, 0x2e, 0x3b, 0x52, 0x61, 0x62, 0x2e, 0x20, 0x49, 0x3b, 0x52, 0x61,
+0x62, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x4a, 0x75, 0x6d, 0x2e, 0x20, 0x49,
+0x3b, 0x4a, 0x75, 0x6d, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x52, 0x61, 0x6a,
+0x2e, 0x3b, 0x53, 0x68, 0x61, 0x2e, 0x3b, 0x52, 0x61, 0x6d, 0x2e, 0x3b,
+0x53, 0x68, 0x61, 0x77, 0x2e, 0x3b, 0x44, 0x75, 0x6c, 0x2d, 0x51, 0x2e,
+0x3b, 0x44, 0x75, 0x6c, 0x2d, 0x58, 0x2e, 0x4d, 0x75, 0x78, 0x2e, 0x3b,
+0x53, 0x61, 0x66, 0x2e, 0x3b, 0x52, 0x61, 0x62, 0x2e, 0x20, 0x49, 0x3b,
+0x52, 0x61, 0x62, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x4a, 0x75, 0x6d, 0x2e,
+0x20, 0x49, 0x3b, 0x4a, 0x75, 0x6d, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x52,
+0x61, 0x6a, 0x2e, 0x3b, 0x53, 0x68, 0x61, 0x2e, 0x3b, 0x52, 0x61, 0x6d,
+0x2e, 0x3b, 0x53, 0x68, 0x61, 0x77, 0x2e, 0x3b, 0x44, 0x75, 0x6c, 0x2019,
+0x2d, 0x51, 0x69, 0x63, 0x64, 0x61, 0x2e, 0x3b, 0x44, 0x68, 0x75, 0x2bb,
+0x6c, 0x2d, 0x48, 0x2e, 0x6d, 0x75, 0x68, 0x61, 0x72, 0x72, 0x61, 0x6d,
+0x3b, 0x73, 0x61, 0x66, 0x61, 0x72, 0x3b, 0x72, 0x61, 0x62, 0x69, 0x2bb,
+0x20, 0x49, 0x3b, 0x72, 0x61, 0x62, 0x69, 0x2bb, 0x20, 0x49, 0x49, 0x3b,
+0x6a, 0x75, 0x6d, 0x61, 0x64, 0x61, 0x20, 0x49, 0x3b, 0x6a, 0x75, 0x6d,
+0x61, 0x64, 0x61, 0x20, 0x49, 0x49, 0x3b, 0x72, 0x61, 0x6a, 0x61, 0x62,
+0x3b, 0x73, 0x68, 0x61, 0x2bb, 0x62, 0x61, 0x6e, 0x3b, 0x72, 0x61, 0x6d,
+0x61, 0x64, 0xe1, 0x6e, 0x3b, 0x73, 0x68, 0x61, 0x77, 0x77, 0x61, 0x6c,
+0x3b, 0x64, 0x68, 0x75, 0x2bb, 0x6c, 0x2d, 0x71, 0x69, 0x2bb, 0x64, 0x61,
+0x68, 0x3b, 0x64, 0x68, 0x75, 0x2bb, 0x6c, 0x2d, 0x68, 0x69, 0x6a, 0x6a,
+0x61, 0x68, 0x4d, 0x75, 0x68, 0x61, 0x72, 0x72, 0x61, 0x6d, 0x3b, 0x53,
+0x61, 0x66, 0x61, 0x72, 0x3b, 0x52, 0x61, 0x62, 0x69, 0x2019, 0x20, 0x61,
+0x6c, 0x2d, 0x61, 0x77, 0x77, 0x61, 0x6c, 0x3b, 0x52, 0x61, 0x62, 0x69,
+0x2019, 0x20, 0x61, 0x6c, 0x2d, 0x61, 0x6b, 0x68, 0x69, 0x72, 0x3b, 0x4a,
+0x75, 0x6d, 0x61, 0x64, 0x61, 0x2d, 0x6c, 0x2d, 0x75, 0x6c, 0x61, 0x3b,
+0x4a, 0x75, 0x6d, 0x61, 0x64, 0x61, 0x2d, 0x6c, 0x2d, 0x61, 0x6b, 0x68,
+0x69, 0x72, 0x61, 0x3b, 0x52, 0x61, 0x6a, 0x61, 0x62, 0x3b, 0x53, 0x68,
+0x61, 0x2019, 0x62, 0x61, 0x6e, 0x3b, 0x52, 0x61, 0x6d, 0x61, 0x64, 0x61,
+0x6e, 0x3b, 0x53, 0x68, 0x61, 0x77, 0x77, 0x61, 0x6c, 0x3b, 0x44, 0x68,
+0x75, 0x2d, 0x6c, 0x2d, 0x67, 0x61, 0x2019, 0x64, 0x61, 0x3b, 0x44, 0x68,
+0x75, 0x2d, 0x6c, 0x2d, 0x68, 0x69, 0x6a, 0x6a, 0x61, 0x6d, 0x75, 0x68,
+0x61, 0x72, 0x72, 0x61, 0x6d, 0x3b, 0x73, 0x61, 0x66, 0x61, 0x72, 0x3b,
+0x72, 0x61, 0x62, 0x69, 0x2019, 0x20, 0x61, 0x6c, 0x2d, 0x61, 0x77, 0x77,
+0x61, 0x6c, 0x3b, 0x72, 0x61, 0x62, 0x69, 0x2019, 0x20, 0x61, 0x6c, 0x2d,
+0x61, 0x6b, 0x68, 0x69, 0x72, 0x3b, 0x6a, 0x75, 0x6d, 0x61, 0x64, 0x61,
+0x2d, 0x6c, 0x2d, 0x75, 0x6c, 0x61, 0x3b, 0x6a, 0x75, 0x6d, 0x61, 0x64,
+0x61, 0x2d, 0x6c, 0x2d, 0x61, 0x6b, 0x68, 0x69, 0x72, 0x61, 0x3b, 0x72,
+0x61, 0x6a, 0x61, 0x62, 0x3b, 0x73, 0x68, 0x61, 0x2019, 0x62, 0x61, 0x6e,
+0x3b, 0x72, 0x61, 0x6d, 0x61, 0x64, 0x61, 0x6e, 0x3b, 0x73, 0x68, 0x61,
+0x77, 0x77, 0x61, 0x6c, 0x3b, 0x64, 0x68, 0x75, 0x2d, 0x6c, 0x2d, 0x67,
+0x61, 0x2019, 0x64, 0x61, 0x3b, 0x64, 0x68, 0x75, 0x2d, 0x6c, 0x2d, 0x68,
+0x69, 0x6a, 0x6a, 0x61, 0x43c, 0x443, 0x4b3, 0x430, 0x440, 0x440, 0x430, 0x43c,
+0x3b, 0x441, 0x430, 0x444, 0x430, 0x440, 0x3b, 0x420, 0x430, 0x431, 0x435, 0x44a,
+0x20, 0x49, 0x3b, 0x420, 0x430, 0x431, 0x435, 0x44a, 0x20, 0x49, 0x49, 0x3b,
+0x4b7, 0x438, 0x43c, 0x43e, 0x434, 0x438, 0x2d, 0x443, 0x43b, 0x2d, 0x443, 0x43b,
+0x43e, 0x3b, 0x4b7, 0x438, 0x43c, 0x43e, 0x434, 0x438, 0x2d, 0x443, 0x43b, 0x2d,
+0x441, 0x43e, 0x43d, 0x438, 0x3b, 0x440, 0x430, 0x4b7, 0x430, 0x431, 0x3b, 0x428,
+0x430, 0x431, 0x430, 0x43d, 0x3b, 0x420, 0x430, 0x43c, 0x430, 0x434, 0x430, 0x43d,
+0x3b, 0x428, 0x430, 0x432, 0x432, 0x430, 0x43b, 0x3b, 0x414, 0x445, 0x443, 0x43b,
+0x2d, 0x49a, 0x438, 0x434, 0x430, 0x4b3, 0x3b, 0x414, 0x445, 0x443, 0x43b, 0x2d,
+0x4b2, 0x438, 0x4b7, 0x4b7, 0x430, 0x4b3, 0x43c, 0x443, 0x4b3, 0x430, 0x440, 0x440,
+0x430, 0x43c, 0x3b, 0x441, 0x430, 0x444, 0x430, 0x440, 0x3b, 0x420, 0x430, 0x431,
+0x435, 0x44a, 0x20, 0x49, 0x3b, 0x420, 0x430, 0x431, 0x435, 0x44a, 0x20, 0x49,
+0x49, 0x3b, 0x4b7, 0x438, 0x43c, 0x43e, 0x434, 0x438, 0x2d, 0x443, 0x43b, 0x2d,
+0x443, 0x43b, 0x43e, 0x3b, 0x4b7, 0x438, 0x43c, 0x43e, 0x434, 0x438, 0x2d, 0x443,
+0x43b, 0x2d, 0x441, 0x43e, 0x43d, 0x438, 0x3b, 0x440, 0x430, 0x4b7, 0x430, 0x431,
+0x3b, 0x428, 0x430, 0x431, 0x430, 0x43d, 0x3b, 0x420, 0x430, 0x43c, 0x430, 0x434,
+0x430, 0x43d, 0x3b, 0x428, 0x430, 0x432, 0x432, 0x430, 0x43b, 0x3b, 0x414, 0x445,
+0x443, 0x442, 0x2d, 0x49a, 0x438, 0x434, 0x430, 0x4b3, 0x3b, 0x414, 0x445, 0x443,
+0x442, 0x2d, 0x4b2, 0x438, 0x4b7, 0x4b7, 0x430, 0x4b3, 0x41c, 0x443, 0x4b3, 0x2e,
+0x3b, 0x421, 0x430, 0x444, 0x2e, 0x3b, 0x420, 0x430, 0x431, 0x2e, 0x20, 0x49,
+0x3b, 0x420, 0x430, 0x431, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x4b6, 0x443, 0x43c,
+0x2e, 0x20, 0x49, 0x3b, 0x4b6, 0x443, 0x43c, 0x2e, 0x20, 0x49, 0x49, 0x3b,
+0x420, 0x430, 0x4b7, 0x2e, 0x3b, 0x428, 0x430, 0x2e, 0x3b, 0x420, 0x430, 0x43c,
+0x2e, 0x3b, 0x428, 0x430, 0x432, 0x2e, 0x3b, 0x414, 0x445, 0x443, 0x43b, 0x2d,
+0x49a, 0x2e, 0x3b, 0x414, 0x445, 0x443, 0x43b, 0x2d, 0x4b2, 0x2e, 0xbae, 0xbc1,
+0xbb9, 0xbb0, 0xbcd, 0xbb0, 0xbae, 0xbcd, 0x3b, 0xb9a, 0xb83, 0xbaa, 0xbb0, 0xbcd,
+0x3b, 0xbb0, 0xbaa, 0xbbf, 0x20, 0x31, 0x3b, 0xbb0, 0xbaa, 0xbbf, 0x20, 0x32,
+0x3b, 0xb9c, 0xbc1, 0xbae, 0xba4, 0xbbe, 0x20, 0x31, 0x3b, 0xb9c, 0xbc1, 0xbae,
+0xba4, 0xbbe, 0x20, 0x32, 0x3b, 0xbb0, 0xb9c, 0xbaa, 0xbcd, 0x3b, 0xbb7, 0xb83,
+0xbaa, 0xbbe, 0xba9, 0xbcd, 0x3b, 0xbb0, 0xbae, 0xbb2, 0xbbe, 0xba9, 0xbcd, 0x3b,
+0xbb7, 0xbb5, 0xbcd, 0xbb5, 0xbbe, 0xbb2, 0xbcd, 0x3b, 0xba4, 0xbc1, 0xbb2, 0xbcd,
+0x20, 0xb95, 0xb83, 0xba4, 0xbbe, 0x3b, 0xba4, 0xbc1, 0xbb2, 0xbcd, 0x20, 0xbb9,
+0xbbf, 0xb9c, 0xbcd, 0xb9c, 0xbbe, 0xbae, 0xbc1, 0xbb9, 0x2e, 0x3b, 0xb9a, 0xb83,
+0xbaa, 0x2e, 0x3b, 0xbb0, 0xbaa, 0xbbf, 0x20, 0x31, 0x3b, 0xbb0, 0xbaa, 0xbbf,
+0x20, 0x32, 0x3b, 0xb9c, 0xbc1, 0xbae, 0x2e, 0x20, 0x31, 0x3b, 0xb9c, 0xbc1,
+0xbae, 0x2e, 0x20, 0x32, 0x3b, 0xbb0, 0xb9c, 0x2e, 0x3b, 0xbb7, 0xb83, 0x2e,
+0x3b, 0xbb0, 0xbae, 0x2e, 0x3b, 0xbb7, 0xbb5, 0xbcd, 0x2e, 0x3b, 0xba4, 0xbc1,
+0xbb2, 0xbcd, 0x20, 0xb95, 0xb83, 0x2e, 0x3b, 0xba4, 0xbc1, 0xbb2, 0xbcd, 0x20,
+0xbb9, 0xbbf, 0xb9c, 0xbcd, 0x2e, 0xc2e, 0xc41, 0xc39, 0xc30, 0xc4d, 0xc30, 0xc02,
+0x3b, 0xc38, 0xc2b, 0xc30, 0xc4d, 0x3b, 0xc30, 0xc2c, 0xc40, 0x20, 0x49, 0x3b,
+0xc30, 0xc2c, 0xc40, 0x20, 0x49, 0x49, 0x3b, 0xc1c, 0xc41, 0xc2e, 0xc26, 0xc3e,
+0x20, 0x49, 0x3b, 0xc1c, 0xc41, 0xc2e, 0xc26, 0xc3e, 0x20, 0x49, 0x49, 0x3b,
+0xc30, 0xc1c, 0xc2c, 0xc4d, 0x3b, 0xc37, 0xc2c, 0xc3e, 0xc28, 0xc4d, 0x3b, 0xc30,
+0xc02, 0xc1c, 0xc3e, 0xc28, 0xc4d, 0x3b, 0xc37, 0xc35, 0xc4d, 0xc35, 0xc3e, 0xc32,
+0xc4d, 0x3b, 0xc27, 0xc41, 0xc32, 0xc4d, 0x2d, 0xc15, 0xc3f, 0x20, 0xc26, 0xc3e,
+0xc39, 0xc4d, 0x3b, 0xc27, 0xc41, 0xc32, 0xc4d, 0x2d, 0xc39, 0xc3f, 0xc1c, 0xc4d,
+0xc1c, 0xc3e, 0xc39, 0xc4d, 0xc2e, 0xc41, 0xc39, 0x2e, 0x3b, 0xc38, 0xc2b, 0x2e,
+0x3b, 0xc30, 0x2e, 0x20, 0x49, 0x3b, 0xc30, 0x2e, 0x20, 0x49, 0x49, 0x3b,
+0xc1c, 0xc41, 0xc2e, 0x2e, 0x20, 0x49, 0x3b, 0xc1c, 0xc41, 0xc2e, 0x2e, 0x20,
+0x49, 0x49, 0x3b, 0xc30, 0xc1c, 0x2e, 0x3b, 0xc37, 0xc2c, 0xc3e, 0x2e, 0x3b,
+0xc30, 0xc02, 0xc1c, 0xc3e, 0x2e, 0x3b, 0xc37, 0xc35, 0xc4d, 0xc35, 0xc3e, 0x2e,
+0x3b, 0xc27, 0xc41, 0xc32, 0xc4d, 0x2d, 0xc15, 0xc3f, 0x2e, 0x3b, 0xc27, 0xc41,
+0xc32, 0xc4d, 0x2d, 0xc39, 0xc3f, 0x2e, 0xe21, 0xe38, 0xe2e, 0xe30, 0xe23, 0xe4c,
+0xe23, 0xe2d, 0xe21, 0x3b, 0xe0b, 0xe2d, 0xe1f, 0xe32, 0xe23, 0xe4c, 0x3b, 0xe23,
+0xe2d, 0xe1a, 0xe35, 0x20, 0x49, 0x3b, 0xe23, 0xe2d, 0xe1a, 0xe35, 0x20, 0x49,
+0x49, 0x3b, 0xe08, 0xe38, 0xe21, 0xe32, 0xe14, 0xe32, 0x20, 0x49, 0x3b, 0xe08,
+0xe38, 0xe21, 0xe32, 0xe14, 0xe32, 0x20, 0x49, 0x49, 0x3b, 0xe23, 0xe2d, 0xe08,
+0xe31, 0xe1a, 0x3b, 0xe0a, 0xe30, 0xe2d, 0xe30, 0xe1a, 0xe32, 0xe19, 0x3b, 0xe23,
+0xe2d, 0xe21, 0xe30, 0xe14, 0xe2d, 0xe19, 0x3b, 0xe40, 0xe0a, 0xe32, 0xe27, 0xe31,
+0xe25, 0x3b, 0xe0b, 0xe38, 0xe25, 0xe01, 0xe34, 0xe2d, 0xe3a, 0xe14, 0xe30, 0xe2e,
+0xe3a, 0x3b, 0xe0b, 0xe38, 0xe25, 0xe2b, 0xe34, 0xe08, 0xe0d, 0xe30, 0xe2e, 0xe3a,
+0xe21, 0xe38, 0xe2e, 0xe31, 0xe23, 0x2e, 0x3b, 0xe40, 0xe28, 0xe32, 0xe30, 0x2e,
+0x3b, 0xe23, 0xe2d, 0xe1a, 0xe35, 0x20, 0x49, 0x3b, 0xe23, 0xe2d, 0xe1a, 0xe35,
+0x20, 0x49, 0x49, 0x3b, 0xe08, 0xe38, 0xe21, 0xe32, 0xe14, 0xe32, 0x20, 0x49,
+0x3b, 0xe08, 0xe38, 0xe21, 0xe32, 0xe14, 0xe32, 0x20, 0x49, 0x49, 0x3b, 0xe40,
+0xe23, 0xe32, 0xe30, 0x2e, 0x3b, 0xe0a, 0xe30, 0xe2d, 0xe4c, 0x2e, 0x3b, 0xe40,
+0xe23, 0xe32, 0xe30, 0xe21, 0xe30, 0x2e, 0x3b, 0xe40, 0xe0a, 0xe32, 0xe27, 0x2e,
+0x3b, 0xe0b, 0xe38, 0xe25, 0xe01, 0xe34, 0xe2d, 0xe3a, 0x2e, 0x3b, 0xe0b, 0xe38,
+0xe25, 0xe2b, 0xe34, 0xe08, 0x2e, 0x4d, 0x75, 0x68, 0x61, 0x6c, 0x61, 0x6d,
+0x69, 0x3b, 0x53, 0x61, 0x66, 0x61, 0x6c, 0x69, 0x3b, 0x4c, 0x61, 0x70,
+0x12b, 0x20, 0x49, 0x3b, 0x4c, 0x61, 0x70, 0x12b, 0x20, 0x49, 0x49, 0x3b,
+0x53, 0x75, 0x6d, 0x61, 0x74, 0x101, 0x20, 0x49, 0x3b, 0x53, 0x75, 0x6d,
+0x61, 0x74, 0x101, 0x20, 0x49, 0x49, 0x3b, 0x4c, 0x61, 0x73, 0x61, 0x70,
+0x69, 0x3b, 0x53, 0x61, 0x2bb, 0x61, 0x70, 0x101, 0x6e, 0x69, 0x3b, 0x4c,
+0x61, 0x6d, 0x61, 0x74, 0x101, 0x6e, 0x69, 0x3b, 0x53, 0x61, 0x76, 0x101,
+0x6c, 0x69, 0x3b, 0x53, 0x16b, 0x2d, 0x6b, 0x61, 0x2bb, 0x61, 0x74, 0x61,
+0x3b, 0x53, 0x16b, 0x2d, 0x68, 0x69, 0x73, 0x61, 0x4d, 0x75, 0x68, 0x3b,
+0x53, 0x61, 0x66, 0x3b, 0x4c, 0x61, 0x70, 0x20, 0x49, 0x3b, 0x4c, 0x61,
+0x70, 0x20, 0x49, 0x49, 0x3b, 0x53, 0x75, 0x6d, 0x20, 0x49, 0x3b, 0x53,
+0x75, 0x6d, 0x20, 0x49, 0x49, 0x3b, 0x4c, 0x61, 0x73, 0x3b, 0x53, 0x61,
+0x2bb, 0x61, 0x3b, 0x4c, 0x61, 0x6d, 0x3b, 0x53, 0x61, 0x76, 0x3b, 0x53,
+0x16b, 0x2d, 0x6b, 0x3b, 0x53, 0x16b, 0x2d, 0x68, 0x4d, 0x75, 0x68, 0x61,
+0x72, 0x72, 0x65, 0x6d, 0x3b, 0x53, 0x61, 0x66, 0x65, 0x72, 0x3b, 0x52,
+0x65, 0x62, 0x69, 0xfc, 0x6c, 0x65, 0x76, 0x76, 0x65, 0x6c, 0x3b, 0x52,
+0x65, 0x62, 0x69, 0xfc, 0x6c, 0x61, 0x68, 0x69, 0x72, 0x3b, 0x43, 0x65,
+0x6d, 0x61, 0x7a, 0x69, 0x79, 0x65, 0x6c, 0x65, 0x76, 0x76, 0x65, 0x6c,
+0x3b, 0x43, 0x65, 0x6d, 0x61, 0x7a, 0x69, 0x79, 0x65, 0x6c, 0x61, 0x68,
+0x69, 0x72, 0x3b, 0x52, 0x65, 0x63, 0x65, 0x70, 0x3b, 0x15e, 0x61, 0x62,
+0x61, 0x6e, 0x3b, 0x52, 0x61, 0x6d, 0x61, 0x7a, 0x61, 0x6e, 0x3b, 0x15e,
+0x65, 0x76, 0x76, 0x61, 0x6c, 0x3b, 0x5a, 0x69, 0x6c, 0x6b, 0x61, 0x64,
+0x65, 0x3b, 0x5a, 0x69, 0x6c, 0x68, 0x69, 0x63, 0x63, 0x65, 0x4d, 0x75,
+0x68, 0x61, 0x72, 0x2e, 0x3b, 0x53, 0x61, 0x66, 0x65, 0x72, 0x3b, 0x52,
+0x2e, 0x65, 0x76, 0x76, 0x65, 0x6c, 0x3b, 0x52, 0x2e, 0x61, 0x68, 0x69,
+0x72, 0x3b, 0x43, 0x2e, 0x65, 0x76, 0x76, 0x65, 0x6c, 0x3b, 0x43, 0x2e,
+0x61, 0x68, 0x69, 0x72, 0x3b, 0x52, 0x65, 0x63, 0x65, 0x70, 0x3b, 0x15e,
+0x61, 0x62, 0x61, 0x6e, 0x3b, 0x52, 0x61, 0x6d, 0x2e, 0x3b, 0x15e, 0x65,
+0x76, 0x76, 0x61, 0x6c, 0x3b, 0x5a, 0x69, 0x6c, 0x6b, 0x61, 0x64, 0x65,
+0x3b, 0x5a, 0x69, 0x6c, 0x68, 0x69, 0x63, 0x63, 0x65, 0x41, 0x15f, 0x79,
+0x72, 0x3b, 0x53, 0x61, 0x70, 0x61, 0x72, 0x3b, 0x44, 0xf6, 0x72, 0x74,
+0x20, 0x74, 0x69, 0x72, 0x6b, 0x65, 0x15f, 0x69, 0x6b, 0x20, 0x31, 0x3b,
+0x44, 0xf6, 0x72, 0x74, 0x20, 0x74, 0x69, 0x72, 0x6b, 0x65, 0x15f, 0x69,
+0x6b, 0x20, 0x32, 0x3b, 0x44, 0xf6, 0x72, 0x74, 0x20, 0x74, 0x69, 0x72,
+0x6b, 0x65, 0x15f, 0x69, 0x6b, 0x20, 0x33, 0x3b, 0x44, 0xf6, 0x72, 0x74,
+0x20, 0x74, 0x69, 0x72, 0x6b, 0x65, 0x15f, 0x69, 0x6b, 0x20, 0x34, 0x3b,
+0x52, 0x65, 0x6a, 0x65, 0x70, 0x3b, 0x4d, 0x65, 0x72, 0x65, 0x74, 0x3b,
+0x4f, 0x72, 0x61, 0x7a, 0x61, 0x3b, 0x42, 0x61, 0xfd, 0x72, 0x61, 0x6d,
+0x3b, 0x42, 0x6f, 0x15f, 0x20, 0x61, 0xfd, 0x3b, 0x47, 0x75, 0x72, 0x62,
+0x61, 0x6e, 0x41, 0x15f, 0x79, 0x3b, 0x53, 0x61, 0x70, 0x3b, 0x54, 0x69,
+0x72, 0x20, 0x49, 0x3b, 0x54, 0x69, 0x72, 0x20, 0x49, 0x49, 0x3b, 0x54,
+0x69, 0x72, 0x20, 0x49, 0x49, 0x49, 0x3b, 0x54, 0x69, 0x72, 0x20, 0x49,
+0x56, 0x3b, 0x52, 0x65, 0x6a, 0x3b, 0x4d, 0x65, 0x72, 0x3b, 0x4f, 0x72,
+0x61, 0x3b, 0x42, 0x61, 0xfd, 0x3b, 0x42, 0x6f, 0x15f, 0x3b, 0x47, 0x75,
+0x72, 0x43c, 0x443, 0x445, 0x430, 0x440, 0x440, 0x430, 0x43c, 0x3b, 0x441, 0x430,
+0x444, 0x430, 0x440, 0x3b, 0x440, 0x430, 0x431, 0x456, 0x20, 0x49, 0x3b, 0x440,
+0x430, 0x431, 0x456, 0x20, 0x49, 0x49, 0x3b, 0x434, 0x436, 0x443, 0x43c, 0x430,
+0x434, 0x430, 0x20, 0x49, 0x3b, 0x434, 0x436, 0x443, 0x43c, 0x430, 0x434, 0x430,
+0x20, 0x49, 0x49, 0x3b, 0x440, 0x430, 0x434, 0x436, 0x430, 0x431, 0x3b, 0x448,
+0x430, 0x430, 0x431, 0x430, 0x43d, 0x3b, 0x440, 0x430, 0x43c, 0x430, 0x434, 0x430,
+0x43d, 0x3b, 0x434, 0x430, 0x432, 0x432, 0x430, 0x43b, 0x3b, 0x437, 0x443, 0x2d,
+0x43b, 0x44c, 0x2d, 0x43a, 0x430, 0x430, 0x434, 0x430, 0x3b, 0x437, 0x443, 0x2d,
+0x43b, 0x44c, 0x2d, 0x445, 0x456, 0x434, 0x436, 0x430, 0x43c, 0x443, 0x445, 0x3b,
+0x441, 0x430, 0x444, 0x3b, 0x440, 0x430, 0x431, 0x456, 0x20, 0x49, 0x3b, 0x440,
+0x430, 0x431, 0x456, 0x20, 0x49, 0x49, 0x3b, 0x434, 0x436, 0x443, 0x43c, 0x20,
+0x49, 0x3b, 0x434, 0x436, 0x443, 0x43c, 0x20, 0x49, 0x49, 0x3b, 0x440, 0x430,
+0x434, 0x436, 0x3b, 0x448, 0x430, 0x430, 0x431, 0x3b, 0x440, 0x430, 0x43c, 0x3b,
+0x434, 0x430, 0x432, 0x3b, 0x437, 0x443, 0x2d, 0x43b, 0x44c, 0x2d, 0x43a, 0x3b,
+0x437, 0x443, 0x2d, 0x43b, 0x44c, 0x2d, 0x445, 0x43c, 0x443, 0x445, 0x2e, 0x3b,
+0x441, 0x430, 0x444, 0x2e, 0x3b, 0x440, 0x430, 0x431, 0x456, 0x20, 0x49, 0x3b,
+0x440, 0x430, 0x431, 0x456, 0x20, 0x49, 0x49, 0x3b, 0x434, 0x436, 0x443, 0x43c,
+0x2e, 0x20, 0x49, 0x3b, 0x434, 0x436, 0x443, 0x43c, 0x2e, 0x20, 0x49, 0x49,
+0x3b, 0x440, 0x430, 0x434, 0x436, 0x2e, 0x3b, 0x448, 0x430, 0x430, 0x431, 0x2e,
+0x3b, 0x440, 0x430, 0x43c, 0x2e, 0x3b, 0x434, 0x430, 0x432, 0x2e, 0x3b, 0x437,
+0x443, 0x2d, 0x43b, 0x44c, 0x2d, 0x43a, 0x2e, 0x3b, 0x437, 0x443, 0x2d, 0x43b,
+0x44c, 0x2d, 0x445, 0x2e, 0x645, 0x62d, 0x631, 0x645, 0x3b, 0x635, 0x641, 0x631,
+0x3b, 0x631, 0x20, 0x628, 0x6cc, 0x639, 0x20, 0x627, 0x644, 0x627, 0x648, 0x644,
+0x3b, 0x631, 0x20, 0x628, 0x6cc, 0x639, 0x20, 0x627, 0x644, 0x62b, 0x627, 0x646,
+0x6cc, 0x3b, 0x62c, 0x645, 0x627, 0x62f, 0x6cc, 0x20, 0x627, 0x644, 0x627, 0x648,
+0x644, 0x3b, 0x62c, 0x645, 0x627, 0x62f, 0x6cc, 0x20, 0x627, 0x644, 0x62b, 0x627,
+0x646, 0x6cc, 0x3b, 0x631, 0x62c, 0x628, 0x3b, 0x634, 0x639, 0x628, 0x627, 0x646,
+0x3b, 0x631, 0x645, 0x636, 0x627, 0x646, 0x3b, 0x634, 0x648, 0x627, 0x644, 0x3b,
+0x630, 0x648, 0x627, 0x644, 0x642, 0x639, 0x62f, 0x6c3, 0x3b, 0x630, 0x648, 0x627,
+0x644, 0x62d, 0x62c, 0x6c3, 0x645, 0x62d, 0x631, 0x645, 0x3b, 0x635, 0x641, 0x631,
+0x3b, 0x631, 0x628, 0x6cc, 0x639, 0x20, 0x627, 0x644, 0x627, 0x648, 0x651, 0x644,
+0x3b, 0x631, 0x628, 0x6cc, 0x639, 0x20, 0x627, 0x644, 0x62b, 0x651, 0x627, 0x646,
+0x6cc, 0x3b, 0x62c, 0x645, 0x627, 0x62f, 0x6cc, 0x20, 0x627, 0x644, 0x627, 0x648,
+0x651, 0x644, 0x3b, 0x62c, 0x645, 0x627, 0x62f, 0x6cc, 0x20, 0x627, 0x644, 0x62b,
+0x651, 0x627, 0x646, 0x6cc, 0x3b, 0x631, 0x62c, 0x628, 0x3b, 0x634, 0x639, 0x628,
+0x627, 0x646, 0x3b, 0x631, 0x645, 0x636, 0x627, 0x646, 0x3b, 0x634, 0x648, 0x627,
+0x644, 0x3b, 0x630, 0x648, 0x627, 0x644, 0x642, 0x639, 0x62f, 0x6c3, 0x3b, 0x630,
+0x648, 0x627, 0x644, 0x62d, 0x62c, 0x6c3, 0x645, 0x62d, 0x631, 0x645, 0x3b, 0x635,
+0x641, 0x631, 0x3b, 0x631, 0x628, 0x6cc, 0x639, 0x20, 0x627, 0x644, 0x627, 0x648,
+0x651, 0x644, 0x3b, 0x631, 0x628, 0x6cc, 0x639, 0x20, 0x627, 0x644, 0x62b, 0x627,
+0x646, 0x6cc, 0x3b, 0x62c, 0x645, 0x627, 0x62f, 0x6cc, 0x20, 0x627, 0x644, 0x627,
+0x648, 0x651, 0x644, 0x3b, 0x62c, 0x645, 0x627, 0x62f, 0x6cc, 0x20, 0x627, 0x644,
+0x62b, 0x627, 0x646, 0x6cc, 0x3b, 0x631, 0x62c, 0x628, 0x3b, 0x634, 0x639, 0x628,
+0x627, 0x646, 0x3b, 0x631, 0x645, 0x636, 0x627, 0x646, 0x3b, 0x634, 0x648, 0x627,
+0x644, 0x3b, 0x630, 0x648, 0x627, 0x644, 0x642, 0x639, 0x62f, 0x6c3, 0x3b, 0x630,
+0x648, 0x627, 0x644, 0x62d, 0x62c, 0x6c3, 0x645, 0x6c7, 0x6be, 0x6d5, 0x631, 0x631,
+0x6d5, 0x645, 0x3b, 0x633, 0x6d5, 0x67e, 0x6d5, 0x631, 0x3b, 0x631, 0x6d5, 0x628,
+0x649, 0x626, 0x6c7, 0x644, 0x626, 0x6d5, 0x6cb, 0x6cb, 0x6d5, 0x644, 0x3b, 0x631,
+0x6d5, 0x628, 0x649, 0x626, 0x6c7, 0x644, 0x626, 0x627, 0x62e, 0x649, 0x631, 0x3b,
+0x62c, 0x6d5, 0x645, 0x627, 0x62f, 0x649, 0x64a, 0x6d5, 0x644, 0x626, 0x6d5, 0x6cb,
+0x6cb, 0x6d5, 0x644, 0x3b, 0x62c, 0x6d5, 0x645, 0x627, 0x62f, 0x649, 0x64a, 0x6d5,
+0x644, 0x626, 0x627, 0x62e, 0x649, 0x631, 0x3b, 0x631, 0x6d5, 0x62c, 0x6d5, 0x628,
+0x3b, 0x634, 0x6d5, 0x626, 0x628, 0x627, 0x646, 0x3b, 0x631, 0x627, 0x645, 0x649,
+0x632, 0x627, 0x646, 0x3b, 0x634, 0x6d5, 0x6cb, 0x6cb, 0x627, 0x644, 0x3b, 0x632,
+0x6c7, 0x644, 0x642, 0x6d5, 0x626, 0x62f, 0x6d5, 0x3b, 0x632, 0x6c7, 0x644, 0x6be,
+0x6d5, 0x62c, 0x62c, 0x6d5, 0x4d, 0x75, 0x68, 0x61, 0x72, 0x72, 0x61, 0x6d,
+0x3b, 0x53, 0x61, 0x66, 0x61, 0x72, 0x3b, 0x52, 0x6f, 0x62, 0x69, 0x2019,
+0x20, 0x75, 0x6c, 0x2d, 0x61, 0x76, 0x76, 0x61, 0x6c, 0x3b, 0x52, 0x6f,
+0x62, 0x69, 0x2019, 0x20, 0x75, 0x6c, 0x2d, 0x6f, 0x78, 0x69, 0x72, 0x3b,
+0x4a, 0x75, 0x6d, 0x61, 0x64, 0x20, 0x75, 0x6c, 0x2d, 0x61, 0x76, 0x76,
+0x61, 0x6c, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x64, 0x20, 0x75, 0x6c, 0x2d,
+0x6f, 0x78, 0x69, 0x72, 0x3b, 0x52, 0x61, 0x6a, 0x61, 0x62, 0x3b, 0x53,
+0x68, 0x61, 0x2019, 0x62, 0x6f, 0x6e, 0x3b, 0x52, 0x61, 0x6d, 0x61, 0x7a,
+0x6f, 0x6e, 0x3b, 0x53, 0x68, 0x61, 0x76, 0x76, 0x6f, 0x6c, 0x3b, 0x5a,
+0x75, 0x6c, 0x2d, 0x71, 0x61, 0x2019, 0x64, 0x61, 0x3b, 0x5a, 0x75, 0x6c,
+0x2d, 0x68, 0x69, 0x6a, 0x6a, 0x61, 0x4d, 0x75, 0x68, 0x2e, 0x3b, 0x53,
+0x61, 0x66, 0x2e, 0x3b, 0x52, 0x6f, 0x62, 0x2e, 0x20, 0x61, 0x76, 0x76,
+0x2e, 0x3b, 0x52, 0x6f, 0x62, 0x2e, 0x20, 0x6f, 0x78, 0x2e, 0x3b, 0x4a,
+0x75, 0x6d, 0x2e, 0x20, 0x61, 0x76, 0x76, 0x2e, 0x3b, 0x4a, 0x75, 0x6d,
+0x2e, 0x20, 0x6f, 0x78, 0x2e, 0x3b, 0x52, 0x61, 0x6a, 0x2e, 0x3b, 0x53,
+0x68, 0x61, 0x2e, 0x3b, 0x52, 0x61, 0x6d, 0x2e, 0x3b, 0x53, 0x68, 0x61,
+0x76, 0x2e, 0x3b, 0x5a, 0x75, 0x6c, 0x2d, 0x71, 0x2e, 0x3b, 0x5a, 0x75,
+0x6c, 0x2d, 0x68, 0x2e, 0x41c, 0x443, 0x4b3, 0x430, 0x440, 0x440, 0x430, 0x43c,
+0x3b, 0x421, 0x430, 0x444, 0x430, 0x440, 0x3b, 0x420, 0x430, 0x431, 0x438, 0x443,
+0x43b, 0x2d, 0x430, 0x432, 0x432, 0x430, 0x43b, 0x3b, 0x420, 0x430, 0x431, 0x438,
+0x443, 0x43b, 0x2d, 0x43e, 0x445, 0x438, 0x440, 0x3b, 0x416, 0x443, 0x43c, 0x43e,
+0x434, 0x438, 0x443, 0x43b, 0x2d, 0x443, 0x43b, 0x43e, 0x3b, 0x416, 0x443, 0x43c,
+0x43e, 0x434, 0x438, 0x443, 0x43b, 0x2d, 0x443, 0x445, 0x440, 0x43e, 0x3b, 0x420,
+0x430, 0x436, 0x430, 0x431, 0x3b, 0x428, 0x430, 0x44a, 0x431, 0x43e, 0x43d, 0x3b,
+0x420, 0x430, 0x43c, 0x430, 0x437, 0x43e, 0x43d, 0x3b, 0x428, 0x430, 0x432, 0x432,
+0x43e, 0x43b, 0x3b, 0x417, 0x438, 0x43b, 0x2d, 0x49b, 0x430, 0x44a, 0x434, 0x430,
+0x3b, 0x417, 0x438, 0x43b, 0x2d, 0x4b3, 0x438, 0x436, 0x436, 0x430
};
// GENERATED PART ENDS HERE
+} // namespace QtPrivate::Hijri
+
QT_END_NAMESPACE
#endif // QHIJRI_CALENDAR_DATA_P_H
diff --git a/src/corelib/time/qhijricalendar_p.h b/src/corelib/time/qhijricalendar_p.h
index f3bf2208f3..6c54b93fac 100644
--- a/src/corelib/time/qhijricalendar_p.h
+++ b/src/corelib/time/qhijricalendar_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QHIJRI_CALENDAR_P_H
#define QHIJRI_CALENDAR_P_H
diff --git a/src/corelib/time/qislamiccivilcalendar.cpp b/src/corelib/time/qislamiccivilcalendar.cpp
index d5250364a5..ac1f97cb6c 100644
--- a/src/corelib/time/qislamiccivilcalendar.cpp
+++ b/src/corelib/time/qislamiccivilcalendar.cpp
@@ -1,46 +1,9 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qglobal.h"
#include "qislamiccivilcalendar_p.h"
#include "qcalendarmath_p.h"
-#include <QtCore/qmath.h>
QT_BEGIN_NAMESPACE
@@ -94,30 +57,37 @@ bool QIslamicCivilCalendar::isLeapYear(int year) const
return false;
if (year < 0)
++year;
- return qMod(year * 11 + 14, 30) < 11;
+ return qMod<30>(year * 11 + 14) < 11;
}
+// First day of first year (Gregorian 622 CE July 19th) is the base date here:
+constexpr qint64 EpochJd = 1948440;
+// Each 30 years has 11 leap years of 355 days and 19 ordinary years of 354:
+constexpr unsigned ThirtyYears = 11 * 355 + 19 * 354;
+// The first eleven months of the year alternate 30, 29, ..., 29, 30 days in length.
+constexpr unsigned ElevenMonths = 6 * 30 + 5 * 29;
+
bool QIslamicCivilCalendar::dateToJulianDay(int year, int month, int day, qint64 *jd) const
{
Q_ASSERT(jd);
if (!isDateValid(year, month, day))
return false;
- if (year <= 0)
- ++year;
- *jd = qDiv(10631 * year - 10617, 30)
- + qDiv(325 * month - 320, 11)
- + day + 1948439;
+
+ *jd = qDiv<30>(qint64(ThirtyYears) * (year > 0 ? year - 1 : year) + 14)
+ + qDiv<11>(ElevenMonths * (month - 1) + 5)
+ + day + EpochJd - 1;
return true;
}
QCalendar::YearMonthDay QIslamicCivilCalendar::julianDayToDate(qint64 jd) const
{
- const qint64 epoch = 1948440;
- const int32_t k2 = 30 * (jd - epoch) + 15;
- const int32_t k1 = 11 * qDiv(qMod(k2, 10631), 30) + 5;
- int y = qDiv(k2, 10631) + 1;
- const int month = qDiv(k1, 325) + 1;
- const int day = qDiv(qMod(k1, 325), 11) + 1;
+ const auto year30Day = qDivMod<ThirtyYears>(30 * (jd - EpochJd) + 15);
+ // Its remainder changes by 30 per day, except roughly yearly.
+ const auto month11Day = qDivMod<ElevenMonths>(11 * qDiv<30>(year30Day.remainder) + 5);
+ // Its remainder changes by 11 per day except roughly monthly.
+ const int month = month11Day.quotient + 1;
+ const int day = qDiv<11>(month11Day.remainder) + 1;
+ const int y = year30Day.quotient + 1;
return QCalendar::YearMonthDay(y > 0 ? y : y - 1, month, day);
}
diff --git a/src/corelib/time/qislamiccivilcalendar_p.h b/src/corelib/time/qislamiccivilcalendar_p.h
index c71c4f6e0e..4a4bbcc7ed 100644
--- a/src/corelib/time/qislamiccivilcalendar_p.h
+++ b/src/corelib/time/qislamiccivilcalendar_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QISLAMIC_CIVIL_CALENDAR_P_H
#define QISLAMIC_CIVIL_CALENDAR_P_H
diff --git a/src/corelib/time/qjalalicalendar.cpp b/src/corelib/time/qjalalicalendar.cpp
index d47a688b16..fcbdf14395 100644
--- a/src/corelib/time/qjalalicalendar.cpp
+++ b/src/corelib/time/qjalalicalendar.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qglobal.h"
#include "qjalalicalendar_p.h"
@@ -49,16 +13,17 @@ using namespace QRoundingDown;
// Constants
-static const qint64 cycleDays = 1029983;
-static const int cycleYears = 2820;
-static const double yearLength = 365.24219858156028368; // 365 + leapRatio;
-static const qint64 jalaliEpoch = 2121446; // 475/01/01 AP, start of 2820 cycle
+constexpr qint64 cycleDays = 1029983;
+constexpr int cycleYears = 2820;
+constexpr double yearLength = 365.24219858156028368; // 365 + 683 / 2820.
+constexpr qint64 jalaliEpoch = 2121446; // 475/01/01 AP, start of 2820 cycle
+// This appears to be based on Ahmad Birashk's algorithm.
// Calendar implementation
static inline int cycle(qint64 jdn)
{
- return qDiv(jdn - jalaliEpoch, cycleDays);
+ return qDiv<cycleDays>(jdn - jalaliEpoch);
}
qint64 cycleStart(int cycleNo)
@@ -111,7 +76,7 @@ qint64 firstDayOfYear(int year, int cycleNo)
Source: \l {https://en.wikipedia.org/wiki/Solar_Hijri_calendar}{Wikipedia
page on Solar Hijri Calendar}
- */
+*/
QString QJalaliCalendar::name() const
{
@@ -132,7 +97,7 @@ bool QJalaliCalendar::isLeapYear(int year) const
return false;
if (year < 0)
year++;
- return qMod((year + 2346) * 683, 2820) < 683;
+ return qMod<2820>((year + 2346) * 683) < 683;
}
bool QJalaliCalendar::isLunar() const
@@ -157,7 +122,7 @@ bool QJalaliCalendar::dateToJulianDay(int year, int month, int day, qint64 *jd)
return false;
const int y = year - (year < 0 ? 474 : 475);
- const int c = qDiv(y, cycleYears);
+ const int c = qDiv<cycleYears>(y);
const int yearInCycle = y - c * cycleYears;
int dayInYear = day;
for (int i = 1; i < month; ++i)
@@ -198,12 +163,12 @@ int QJalaliCalendar::daysInMonth(int month, int year) const
const QCalendarLocale *QJalaliCalendar::localeMonthIndexData() const
{
- return locale_data;
+ return QtPrivate::Jalali::locale_data;
}
const char16_t *QJalaliCalendar::localeMonthData() const
{
- return months_data;
+ return QtPrivate::Jalali::months_data;
}
QT_END_NAMESPACE
diff --git a/src/corelib/time/qjalalicalendar_data_p.h b/src/corelib/time/qjalalicalendar_data_p.h
index 37254647b8..0e3c3cedb9 100644
--- a/src/corelib/time/qjalalicalendar_data_p.h
+++ b/src/corelib/time/qjalalicalendar_data_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2019 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2019 The Qt Company Ltd.
+// SPDX-License-Identifier: Unicode-3.0
#ifndef QPERSIANCALENDAR_DATA_P_H
#define QPERSIANCALENDAR_DATA_P_H
@@ -56,11 +20,13 @@
QT_BEGIN_NAMESPACE
+namespace QtPrivate::Jalali {
+
// GENERATED PART STARTS HERE
/*
- This part of the file was generated on 2021-11-09 from the
- Common Locale Data Repository v40
+ This part of the file was generated on 2024-01-09 from the
+ Common Locale Data Repository v44.1
http://www.unicode.org/cldr/
@@ -69,11 +35,13 @@ QT_BEGIN_NAMESPACE
edited) CLDR data; see qtbase/util/locale_database/.
*/
-static const QCalendarLocale locale_data[] = {
+static constexpr QCalendarLocale locale_data[] = {
// lang script terr sLong long sShrt short sNarw narow Sizes...
{ 1, 0, 0, 0, 0, 83, 83, 130, 153, 83, 83, 47, 47, 23, 26 },// C/AnyScript/AnyTerritory
{ 2, 27, 90, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Abkhazian/Cyrillic/Georgia
{ 3, 66, 77, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Afar/Latin/Ethiopia
+ { 3, 66, 67, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Afar/Latin/Djibouti
+ { 3, 66, 74, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Afar/Latin/Eritrea
{ 4, 66, 216, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Afrikaans/Latin/South Africa
{ 4, 66, 162, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Afrikaans/Latin/Namibia
{ 5, 66, 40, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Aghem/Latin/Cameroon
@@ -109,7 +77,7 @@ static const QCalendarLocale locale_data[] = {
{ 14, 4, 238, 179, 179, 179, 179, 153, 153, 67, 67, 67, 67, 26, 26 },// Arabic/Arabic/Tunisia
{ 14, 4, 245, 179, 179, 179, 179, 153, 153, 67, 67, 67, 67, 26, 26 },// Arabic/Arabic/United Arab Emirates
{ 14, 4, 257, 179, 179, 179, 179, 153, 153, 67, 67, 67, 67, 26, 26 },// Arabic/Arabic/Western Sahara
- { 14, 4, 258, 179, 179, 179, 179, 153, 153, 67, 67, 67, 67, 26, 26 },// Arabic/Arabic/World
+ { 14, 4, 258, 179, 179, 179, 179, 153, 153, 67, 67, 67, 67, 26, 26 },// Arabic/Arabic/world
{ 14, 4, 259, 179, 179, 179, 179, 153, 153, 67, 67, 67, 67, 26, 26 },// Arabic/Arabic/Yemen
{ 15, 66, 220, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Aragonese/Latin/Spain
{ 17, 5, 12, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Armenian/Armenian/Armenia
@@ -117,60 +85,63 @@ static const QCalendarLocale locale_data[] = {
{ 19, 66, 220, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Asturian/Latin/Spain
{ 20, 66, 230, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Asu/Latin/Tanzania
{ 21, 66, 169, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Atsam/Latin/Nigeria
- { 25, 66, 17, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Azerbaijani/Latin/Azerbaijan
+ { 25, 66, 17, 246, 246, 246, 246, 153, 153, 80, 80, 80, 80, 26, 26 },// Azerbaijani/Latin/Azerbaijan
{ 25, 4, 112, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Azerbaijani/Arabic/Iran
+ { 25, 4, 113, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Azerbaijani/Arabic/Iraq
+ { 25, 4, 239, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Azerbaijani/Arabic/Turkey
{ 25, 27, 17, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Azerbaijani/Cyrillic/Azerbaijan
{ 26, 66, 40, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Bafia/Latin/Cameroon
{ 28, 66, 145, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Bambara/Latin/Mali
{ 28, 90, 145, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Bambara/Nko/Mali
- { 30, 9, 20, 246, 246, 334, 334, 421, 421, 88, 88, 87, 87, 26, 26 },// Bangla/Bangla/Bangladesh
- { 30, 9, 110, 246, 246, 334, 334, 421, 421, 88, 88, 87, 87, 26, 26 },// Bangla/Bangla/India
+ { 30, 9, 20, 326, 326, 414, 414, 501, 501, 88, 88, 87, 87, 26, 26 },// Bangla/Bangla/Bangladesh
+ { 30, 9, 110, 326, 326, 414, 414, 501, 501, 88, 88, 87, 87, 26, 26 },// Bangla/Bangla/India
{ 31, 66, 40, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Basaa/Latin/Cameroon
{ 32, 27, 193, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Bashkir/Cyrillic/Russia
{ 33, 66, 220, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Basque/Latin/Spain
{ 35, 27, 22, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Belarusian/Cyrillic/Belarus
{ 36, 66, 260, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Bemba/Latin/Zambia
{ 37, 66, 230, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Bena/Latin/Tanzania
+ { 38, 29, 110, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Bhojpuri/Devanagari/India
{ 40, 33, 74, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Blin/Ethiopic/Eritrea
{ 41, 29, 110, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Bodo/Devanagari/India
- { 42, 66, 29, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Bosnian/Latin/Bosnia And Herzegovina
- { 42, 27, 29, 447, 447, 447, 447, 153, 153, 80, 80, 80, 80, 26, 26 },// Bosnian/Cyrillic/Bosnia And Herzegovina
+ { 42, 66, 29, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Bosnian/Latin/Bosnia and Herzegovina
+ { 42, 27, 29, 527, 527, 527, 527, 153, 153, 80, 80, 80, 80, 26, 26 },// Bosnian/Cyrillic/Bosnia and Herzegovina
{ 43, 66, 84, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Breton/Latin/France
{ 45, 27, 36, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Bulgarian/Cyrillic/Bulgaria
{ 46, 86, 161, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Burmese/Myanmar/Myanmar
- { 47, 137, 107, 527, 527, 527, 527, 153, 153, 38, 38, 38, 38, 26, 26 },// Cantonese/Traditional Han/Hong Kong
- { 47, 118, 50, 527, 527, 527, 527, 153, 153, 38, 38, 38, 38, 26, 26 },// Cantonese/Simplified Han/China
+ { 47, 137, 107, 607, 607, 607, 607, 153, 153, 38, 38, 38, 38, 26, 26 },// Cantonese/Traditional Han/Hong Kong
+ { 47, 118, 50, 607, 607, 607, 607, 153, 153, 38, 38, 38, 38, 26, 26 },// Cantonese/Simplified Han/China
{ 48, 66, 220, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Catalan/Latin/Spain
{ 48, 66, 6, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Catalan/Latin/Andorra
{ 48, 66, 84, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Catalan/Latin/France
{ 48, 66, 117, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Catalan/Latin/Italy
{ 49, 66, 185, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Cebuano/Latin/Philippines
{ 50, 66, 159, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Central Atlas Tamazight/Latin/Morocco
- { 51, 4, 113, 565, 565, 565, 565, 153, 153,101,101,101,101, 26, 26 },// Central Kurdish/Arabic/Iraq
- { 51, 4, 112, 565, 666, 565, 565, 153, 153,101,100,101,101, 26, 26 },// Central Kurdish/Arabic/Iran
+ { 51, 4, 113, 645, 645, 645, 645, 153, 153,101,101,101,101, 26, 26 },// Central Kurdish/Arabic/Iraq
+ { 51, 4, 112, 746, 746, 746, 746, 153, 153,100,100,100,100, 26, 26 },// Central Kurdish/Arabic/Iran
{ 52, 21, 20, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Chakma/Chakma/Bangladesh
{ 52, 21, 110, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Chakma/Chakma/India
{ 54, 27, 193, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Chechen/Cyrillic/Russia
{ 55, 23, 248, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Cherokee/Cherokee/United States
{ 56, 66, 248, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Chickasaw/Latin/United States
{ 57, 66, 243, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Chiga/Latin/Uganda
- { 58, 118, 50, 766, 766, 527, 527, 153, 153, 37, 37, 38, 38, 26, 26 },// Chinese/Simplified Han/China
- { 58, 118, 107, 766, 766, 527, 527, 153, 153, 37, 37, 38, 38, 26, 26 },// Chinese/Simplified Han/Hong Kong
- { 58, 118, 139, 766, 766, 527, 527, 153, 153, 37, 37, 38, 38, 26, 26 },// Chinese/Simplified Han/Macao
- { 58, 118, 210, 766, 766, 527, 527, 153, 153, 37, 37, 38, 38, 26, 26 },// Chinese/Simplified Han/Singapore
- { 58, 137, 107, 527, 527, 527, 527, 153, 153, 38, 38, 38, 38, 26, 26 },// Chinese/Traditional Han/Hong Kong
- { 58, 137, 139, 527, 527, 527, 527, 153, 153, 38, 38, 38, 38, 26, 26 },// Chinese/Traditional Han/Macao
- { 58, 137, 228, 527, 527, 527, 527, 153, 153, 38, 38, 38, 38, 26, 26 },// Chinese/Traditional Han/Taiwan
+ { 58, 118, 50, 846, 846, 607, 607, 153, 153, 37, 37, 38, 38, 26, 26 },// Chinese/Simplified Han/China
+ { 58, 118, 107, 846, 846, 607, 607, 153, 153, 37, 37, 38, 38, 26, 26 },// Chinese/Simplified Han/Hong Kong
+ { 58, 118, 139, 846, 846, 607, 607, 153, 153, 37, 37, 38, 38, 26, 26 },// Chinese/Simplified Han/Macao
+ { 58, 118, 210, 846, 846, 607, 607, 153, 153, 37, 37, 38, 38, 26, 26 },// Chinese/Simplified Han/Singapore
+ { 58, 137, 107, 607, 607, 607, 607, 153, 153, 38, 38, 38, 38, 26, 26 },// Chinese/Traditional Han/Hong Kong
+ { 58, 137, 139, 607, 607, 607, 607, 153, 153, 38, 38, 38, 38, 26, 26 },// Chinese/Traditional Han/Macao
+ { 58, 137, 228, 607, 607, 607, 607, 153, 153, 38, 38, 38, 38, 26, 26 },// Chinese/Traditional Han/Taiwan
{ 59, 27, 193, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Church/Cyrillic/Russia
{ 60, 27, 193, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Chuvash/Cyrillic/Russia
{ 61, 66, 91, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Colognian/Latin/Germany
{ 63, 66, 246, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Cornish/Latin/United Kingdom
{ 64, 66, 84, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Corsican/Latin/France
- { 66, 66, 60, 0, 0, 0, 0, 803, 803, 83, 83, 83, 83, 38, 38 },// Croatian/Latin/Croatia
- { 66, 66, 29, 0, 0, 0, 0, 803, 803, 83, 83, 83, 83, 38, 38 },// Croatian/Latin/Bosnia And Herzegovina
- { 67, 66, 64, 841, 841, 841, 841, 153, 153, 81, 81, 81, 81, 26, 26 },// Czech/Latin/Czechia
- { 68, 66, 65, 922, 922, 922, 922, 153, 153, 83, 83, 83, 83, 26, 26 },// Danish/Latin/Denmark
- { 68, 66, 95, 922, 922, 922, 922, 153, 153, 83, 83, 83, 83, 26, 26 },// Danish/Latin/Greenland
+ { 66, 66, 60, 0, 0, 0, 0, 883, 883, 83, 83, 83, 83, 38, 38 },// Croatian/Latin/Croatia
+ { 66, 66, 29, 0, 0, 0, 0, 883, 883, 83, 83, 83, 83, 38, 38 },// Croatian/Latin/Bosnia and Herzegovina
+ { 67, 66, 64, 921, 921, 921, 921, 153, 153, 81, 81, 81, 81, 26, 26 },// Czech/Latin/Czechia
+ { 68, 66, 65, 1002, 1002, 1002, 1002, 153, 153, 83, 83, 83, 83, 26, 26 },// Danish/Latin/Denmark
+ { 68, 66, 95, 1002, 1002, 1002, 1002, 153, 153, 83, 83, 83, 83, 26, 26 },// Danish/Latin/Greenland
{ 69, 132, 144, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Divehi/Thaana/Maldives
{ 70, 29, 110, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Dogri/Devanagari/India
{ 71, 66, 40, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Duala/Latin/Cameroon
@@ -187,7 +158,7 @@ static const QCalendarLocale locale_data[] = {
{ 75, 28, 248, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Deseret/United States
{ 75, 66, 5, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/American Samoa
{ 75, 66, 8, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Anguilla
- { 75, 66, 10, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Antigua And Barbuda
+ { 75, 66, 10, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Antigua and Barbuda
{ 75, 66, 15, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Australia
{ 75, 66, 16, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Austria
{ 75, 66, 18, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Bahamas
@@ -225,8 +196,9 @@ static const QCalendarLocale locale_data[] = {
{ 75, 66, 103, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Guyana
{ 75, 66, 107, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Hong Kong
{ 75, 66, 110, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/India
+ { 75, 66, 111, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Indonesia
{ 75, 66, 114, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Ireland
- { 75, 66, 115, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Isle Of Man
+ { 75, 66, 115, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Isle of Man
{ 75, 66, 116, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Israel
{ 75, 66, 119, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Jamaica
{ 75, 66, 121, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Jersey
@@ -238,6 +210,7 @@ static const QCalendarLocale locale_data[] = {
{ 75, 66, 141, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Madagascar
{ 75, 66, 142, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Malawi
{ 75, 66, 143, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Malaysia
+ { 75, 66, 144, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Maldives
{ 75, 66, 146, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Malta
{ 75, 66, 147, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Marshall Islands
{ 75, 66, 150, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Mauritius
@@ -259,9 +232,9 @@ static const QCalendarLocale locale_data[] = {
{ 75, 66, 189, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Puerto Rico
{ 75, 66, 194, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Rwanda
{ 75, 66, 196, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Saint Helena
- { 75, 66, 197, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Saint Kitts And Nevis
+ { 75, 66, 197, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Saint Kitts and Nevis
{ 75, 66, 198, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Saint Lucia
- { 75, 66, 201, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Saint Vincent And Grenadines
+ { 75, 66, 201, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Saint Vincent and Grenadines
{ 75, 66, 202, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Samoa
{ 75, 66, 208, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Seychelles
{ 75, 66, 209, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Sierra Leone
@@ -277,8 +250,8 @@ static const QCalendarLocale locale_data[] = {
{ 75, 66, 230, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Tanzania
{ 75, 66, 234, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Tokelau
{ 75, 66, 235, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Tonga
- { 75, 66, 236, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Trinidad And Tobago
- { 75, 66, 241, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Turks And Caicos Islands
+ { 75, 66, 236, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Trinidad and Tobago
+ { 75, 66, 241, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Turks and Caicos Islands
{ 75, 66, 242, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Tuvalu
{ 75, 66, 243, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Uganda
{ 75, 66, 245, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/United Arab Emirates
@@ -286,84 +259,85 @@ static const QCalendarLocale locale_data[] = {
{ 75, 66, 247, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/United States Outlying Islands
{ 75, 66, 249, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/United States Virgin Islands
{ 75, 66, 252, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Vanuatu
- { 75, 66, 258, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/World
+ { 75, 66, 258, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/world
{ 75, 66, 260, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Zambia
{ 75, 66, 261, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Zimbabwe
+ { 75, 115, 246, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Shavian/United Kingdom
{ 76, 27, 193, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Erzya/Cyrillic/Russia
- { 77, 66, 258, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Esperanto/Latin/World
+ { 77, 66, 258, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Esperanto/Latin/world
{ 78, 66, 75, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Estonian/Latin/Estonia
- { 79, 66, 92, 1005, 1005, 1091, 1091, 153, 153, 86, 86, 47, 47, 26, 26 },// Ewe/Latin/Ghana
- { 79, 66, 233, 1005, 1005, 1091, 1091, 153, 153, 86, 86, 47, 47, 26, 26 },// Ewe/Latin/Togo
+ { 79, 66, 92, 1085, 1085, 1171, 1171, 153, 153, 86, 86, 47, 47, 26, 26 },// Ewe/Latin/Ghana
+ { 79, 66, 233, 1085, 1085, 1171, 1171, 153, 153, 86, 86, 47, 47, 26, 26 },// Ewe/Latin/Togo
{ 80, 66, 40, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Ewondo/Latin/Cameroon
{ 81, 66, 81, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Faroese/Latin/Faroe Islands
{ 81, 66, 65, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Faroese/Latin/Denmark
{ 83, 66, 185, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Filipino/Latin/Philippines
- { 84, 66, 83, 1138, 1255, 1396, 1255, 153, 153,117,141, 81,141, 26, 26 },// Finnish/Latin/Finland
- { 85, 66, 84, 1477, 1477, 1558, 1558, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/France
- { 85, 66, 4, 1477, 1477, 1558, 1558, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Algeria
- { 85, 66, 23, 1477, 1477, 1558, 1558, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Belgium
- { 85, 66, 25, 1477, 1477, 1558, 1558, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Benin
- { 85, 66, 37, 1477, 1477, 1558, 1558, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Burkina Faso
- { 85, 66, 38, 1477, 1477, 1558, 1558, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Burundi
- { 85, 66, 40, 1477, 1477, 1558, 1558, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Cameroon
- { 85, 66, 41, 1615, 1615, 1696, 1696, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Canada
- { 85, 66, 46, 1477, 1477, 1558, 1558, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Central African Republic
- { 85, 66, 48, 1477, 1477, 1558, 1558, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Chad
- { 85, 66, 55, 1477, 1477, 1558, 1558, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Comoros
- { 85, 66, 56, 1477, 1477, 1558, 1558, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Congo Brazzaville
- { 85, 66, 57, 1477, 1477, 1558, 1558, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Congo Kinshasa
- { 85, 66, 67, 1477, 1477, 1558, 1558, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Djibouti
- { 85, 66, 73, 1477, 1477, 1558, 1558, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Equatorial Guinea
- { 85, 66, 85, 1477, 1477, 1558, 1558, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/French Guiana
- { 85, 66, 86, 1477, 1477, 1558, 1558, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/French Polynesia
- { 85, 66, 88, 1477, 1477, 1558, 1558, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Gabon
- { 85, 66, 97, 1477, 1477, 1558, 1558, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Guadeloupe
- { 85, 66, 102, 1477, 1477, 1558, 1558, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Guinea
- { 85, 66, 104, 1477, 1477, 1558, 1558, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Haiti
- { 85, 66, 118, 1477, 1477, 1558, 1558, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Ivory Coast
- { 85, 66, 138, 1477, 1477, 1558, 1558, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Luxembourg
- { 85, 66, 141, 1477, 1477, 1558, 1558, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Madagascar
- { 85, 66, 145, 1477, 1477, 1558, 1558, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Mali
- { 85, 66, 148, 1477, 1477, 1558, 1558, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Martinique
- { 85, 66, 149, 1477, 1477, 1558, 1558, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Mauritania
- { 85, 66, 150, 1477, 1477, 1558, 1558, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Mauritius
- { 85, 66, 151, 1477, 1477, 1558, 1558, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Mayotte
- { 85, 66, 155, 1477, 1477, 1558, 1558, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Monaco
- { 85, 66, 159, 1477, 1477, 1558, 1558, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Morocco
- { 85, 66, 166, 1477, 1477, 1558, 1558, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/New Caledonia
- { 85, 66, 170, 1477, 1477, 1558, 1558, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Niger
- { 85, 66, 191, 1477, 1477, 1558, 1558, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Reunion
- { 85, 66, 194, 1477, 1477, 1558, 1558, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Rwanda
- { 85, 66, 195, 1477, 1477, 1558, 1558, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Saint Barthelemy
- { 85, 66, 199, 1477, 1477, 1558, 1558, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Saint Martin
- { 85, 66, 200, 1477, 1477, 1558, 1558, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Saint Pierre And Miquelon
- { 85, 66, 206, 1477, 1477, 1558, 1558, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Senegal
- { 85, 66, 208, 1477, 1477, 1558, 1558, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Seychelles
- { 85, 66, 226, 1477, 1477, 1558, 1558, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Switzerland
- { 85, 66, 227, 1477, 1477, 1558, 1558, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Syria
- { 85, 66, 233, 1477, 1477, 1558, 1558, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Togo
- { 85, 66, 238, 1477, 1477, 1558, 1558, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Tunisia
- { 85, 66, 252, 1477, 1477, 1558, 1558, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Vanuatu
- { 85, 66, 256, 1477, 1477, 1558, 1558, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Wallis And Futuna
+ { 84, 66, 83, 1218, 1335, 1476, 1335, 153, 153,117,141, 81,141, 26, 26 },// Finnish/Latin/Finland
+ { 85, 66, 84, 1557, 1557, 1638, 1638, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/France
+ { 85, 66, 4, 1557, 1557, 1638, 1638, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Algeria
+ { 85, 66, 23, 1557, 1557, 1638, 1638, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Belgium
+ { 85, 66, 25, 1557, 1557, 1638, 1638, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Benin
+ { 85, 66, 37, 1557, 1557, 1638, 1638, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Burkina Faso
+ { 85, 66, 38, 1557, 1557, 1638, 1638, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Burundi
+ { 85, 66, 40, 1557, 1557, 1638, 1638, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Cameroon
+ { 85, 66, 41, 1695, 1695, 1776, 1776, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Canada
+ { 85, 66, 46, 1557, 1557, 1638, 1638, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Central African Republic
+ { 85, 66, 48, 1557, 1557, 1638, 1638, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Chad
+ { 85, 66, 55, 1557, 1557, 1638, 1638, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Comoros
+ { 85, 66, 56, 1557, 1557, 1638, 1638, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Congo - Brazzaville
+ { 85, 66, 57, 1557, 1557, 1638, 1638, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Congo - Kinshasa
+ { 85, 66, 67, 1557, 1557, 1638, 1638, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Djibouti
+ { 85, 66, 73, 1557, 1557, 1638, 1638, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Equatorial Guinea
+ { 85, 66, 85, 1557, 1557, 1638, 1638, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/French Guiana
+ { 85, 66, 86, 1557, 1557, 1638, 1638, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/French Polynesia
+ { 85, 66, 88, 1557, 1557, 1638, 1638, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Gabon
+ { 85, 66, 97, 1557, 1557, 1638, 1638, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Guadeloupe
+ { 85, 66, 102, 1557, 1557, 1638, 1638, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Guinea
+ { 85, 66, 104, 1557, 1557, 1638, 1638, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Haiti
+ { 85, 66, 118, 1557, 1557, 1638, 1638, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Ivory Coast
+ { 85, 66, 138, 1557, 1557, 1638, 1638, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Luxembourg
+ { 85, 66, 141, 1557, 1557, 1638, 1638, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Madagascar
+ { 85, 66, 145, 1557, 1557, 1638, 1638, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Mali
+ { 85, 66, 148, 1557, 1557, 1638, 1638, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Martinique
+ { 85, 66, 149, 1557, 1557, 1638, 1638, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Mauritania
+ { 85, 66, 150, 1557, 1557, 1638, 1638, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Mauritius
+ { 85, 66, 151, 1557, 1557, 1638, 1638, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Mayotte
+ { 85, 66, 155, 1557, 1557, 1638, 1638, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Monaco
+ { 85, 66, 159, 1557, 1557, 1638, 1638, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Morocco
+ { 85, 66, 166, 1557, 1557, 1638, 1638, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/New Caledonia
+ { 85, 66, 170, 1557, 1557, 1638, 1638, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Niger
+ { 85, 66, 191, 1557, 1557, 1638, 1638, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Reunion
+ { 85, 66, 194, 1557, 1557, 1638, 1638, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Rwanda
+ { 85, 66, 195, 1557, 1557, 1638, 1638, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Saint Barthelemy
+ { 85, 66, 199, 1557, 1557, 1638, 1638, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Saint Martin
+ { 85, 66, 200, 1557, 1557, 1638, 1638, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Saint Pierre and Miquelon
+ { 85, 66, 206, 1557, 1557, 1638, 1638, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Senegal
+ { 85, 66, 208, 1557, 1557, 1638, 1638, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Seychelles
+ { 85, 66, 226, 1557, 1557, 1638, 1638, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Switzerland
+ { 85, 66, 227, 1557, 1557, 1638, 1638, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Syria
+ { 85, 66, 233, 1557, 1557, 1638, 1638, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Togo
+ { 85, 66, 238, 1557, 1557, 1638, 1638, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Tunisia
+ { 85, 66, 252, 1557, 1557, 1638, 1638, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Vanuatu
+ { 85, 66, 256, 1557, 1557, 1638, 1638, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Wallis and Futuna
{ 86, 66, 117, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Friulian/Latin/Italy
{ 87, 66, 206, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Fulah/Latin/Senegal
- { 87, 1, 37, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Fulah/Adlam/Burkina Faso
- { 87, 1, 40, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Fulah/Adlam/Cameroon
- { 87, 1, 89, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Fulah/Adlam/Gambia
- { 87, 1, 92, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Fulah/Adlam/Ghana
- { 87, 1, 101, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Fulah/Adlam/Guinea Bissau
- { 87, 1, 102, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Fulah/Adlam/Guinea
- { 87, 1, 134, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Fulah/Adlam/Liberia
- { 87, 1, 149, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Fulah/Adlam/Mauritania
- { 87, 1, 169, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Fulah/Adlam/Nigeria
- { 87, 1, 170, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Fulah/Adlam/Niger
- { 87, 1, 206, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Fulah/Adlam/Senegal
- { 87, 1, 209, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Fulah/Adlam/Sierra Leone
+ { 87, 1, 37, 1833, 1833, 1833, 1833, 1984, 1984,151,151,151,151, 41, 41 },// Fulah/Adlam/Burkina Faso
+ { 87, 1, 40, 1833, 1833, 1833, 1833, 1984, 1984,151,151,151,151, 41, 41 },// Fulah/Adlam/Cameroon
+ { 87, 1, 89, 1833, 1833, 1833, 1833, 1984, 1984,151,151,151,151, 41, 41 },// Fulah/Adlam/Gambia
+ { 87, 1, 92, 1833, 1833, 1833, 1833, 1984, 1984,151,151,151,151, 41, 41 },// Fulah/Adlam/Ghana
+ { 87, 1, 101, 1833, 1833, 1833, 1833, 1984, 1984,151,151,151,151, 41, 41 },// Fulah/Adlam/Guinea-Bissau
+ { 87, 1, 102, 1833, 1833, 1833, 1833, 1984, 1984,151,151,151,151, 41, 41 },// Fulah/Adlam/Guinea
+ { 87, 1, 134, 1833, 1833, 1833, 1833, 1984, 1984,151,151,151,151, 41, 41 },// Fulah/Adlam/Liberia
+ { 87, 1, 149, 1833, 1833, 1833, 1833, 1984, 1984,151,151,151,151, 41, 41 },// Fulah/Adlam/Mauritania
+ { 87, 1, 169, 1833, 1833, 1833, 1833, 1984, 1984,151,151,151,151, 41, 41 },// Fulah/Adlam/Nigeria
+ { 87, 1, 170, 1833, 1833, 1833, 1833, 1984, 1984,151,151,151,151, 41, 41 },// Fulah/Adlam/Niger
+ { 87, 1, 206, 1833, 1833, 1833, 1833, 1984, 1984,151,151,151,151, 41, 41 },// Fulah/Adlam/Senegal
+ { 87, 1, 209, 1833, 1833, 1833, 1833, 1984, 1984,151,151,151,151, 41, 41 },// Fulah/Adlam/Sierra Leone
{ 87, 66, 37, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Fulah/Latin/Burkina Faso
{ 87, 66, 40, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Fulah/Latin/Cameroon
{ 87, 66, 89, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Fulah/Latin/Gambia
{ 87, 66, 92, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Fulah/Latin/Ghana
- { 87, 66, 101, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Fulah/Latin/Guinea Bissau
+ { 87, 66, 101, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Fulah/Latin/Guinea-Bissau
{ 87, 66, 102, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Fulah/Latin/Guinea
{ 87, 66, 134, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Fulah/Latin/Liberia
{ 87, 66, 149, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Fulah/Latin/Mauritania
@@ -375,34 +349,37 @@ static const QCalendarLocale locale_data[] = {
{ 90, 66, 220, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Galician/Latin/Spain
{ 91, 66, 243, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Ganda/Latin/Uganda
{ 92, 33, 77, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Geez/Ethiopic/Ethiopia
- { 93, 35, 90, 1753, 1753, 1753, 1753, 153, 153, 91, 91, 91, 91, 26, 26 },// Georgian/Georgian/Georgia
- { 94, 66, 91, 1844, 1844, 1844, 1844, 153, 153, 86, 86, 86, 86, 26, 26 },// German/Latin/Germany
- { 94, 66, 16, 1844, 1844, 1844, 1844, 153, 153, 86, 86, 86, 86, 26, 26 },// German/Latin/Austria
- { 94, 66, 23, 1844, 1844, 1844, 1844, 153, 153, 86, 86, 86, 86, 26, 26 },// German/Latin/Belgium
- { 94, 66, 117, 1844, 1844, 1844, 1844, 153, 153, 86, 86, 86, 86, 26, 26 },// German/Latin/Italy
- { 94, 66, 136, 1844, 1844, 1844, 1844, 153, 153, 86, 86, 86, 86, 26, 26 },// German/Latin/Liechtenstein
- { 94, 66, 138, 1844, 1844, 1844, 1844, 153, 153, 86, 86, 86, 86, 26, 26 },// German/Latin/Luxembourg
- { 94, 66, 226, 1844, 1844, 1844, 1844, 153, 153, 86, 86, 86, 86, 26, 26 },// German/Latin/Switzerland
+ { 92, 33, 74, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Geez/Ethiopic/Eritrea
+ { 93, 35, 90, 2025, 2025, 2025, 2025, 153, 153, 91, 91, 91, 91, 26, 26 },// Georgian/Georgian/Georgia
+ { 94, 66, 91, 2116, 2116, 2116, 2116, 153, 153, 86, 86, 86, 86, 26, 26 },// German/Latin/Germany
+ { 94, 66, 16, 2116, 2116, 2116, 2116, 153, 153, 86, 86, 86, 86, 26, 26 },// German/Latin/Austria
+ { 94, 66, 23, 2116, 2116, 2116, 2116, 153, 153, 86, 86, 86, 86, 26, 26 },// German/Latin/Belgium
+ { 94, 66, 117, 2116, 2116, 2116, 2116, 153, 153, 86, 86, 86, 86, 26, 26 },// German/Latin/Italy
+ { 94, 66, 136, 2116, 2116, 2116, 2116, 153, 153, 86, 86, 86, 86, 26, 26 },// German/Latin/Liechtenstein
+ { 94, 66, 138, 2116, 2116, 2116, 2116, 153, 153, 86, 86, 86, 86, 26, 26 },// German/Latin/Luxembourg
+ { 94, 66, 226, 2116, 2116, 2116, 2116, 153, 153, 86, 86, 86, 86, 26, 26 },// German/Latin/Switzerland
{ 96, 39, 94, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Greek/Greek/Greece
{ 96, 39, 63, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Greek/Greek/Cyprus
{ 97, 66, 183, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Guarani/Latin/Paraguay
- { 98, 40, 110, 1930, 1930, 1930, 1930, 153, 153, 85, 85, 85, 85, 26, 26 },// Gujarati/Gujarati/India
+ { 98, 40, 110, 2202, 2202, 2202, 2202, 153, 153, 85, 85, 85, 85, 26, 26 },// Gujarati/Gujarati/India
{ 99, 66, 124, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Gusii/Latin/Kenya
{ 101, 66, 169, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Hausa/Latin/Nigeria
{ 101, 4, 169, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Hausa/Arabic/Nigeria
+ { 101, 4, 222, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Hausa/Arabic/Sudan
{ 101, 66, 92, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Hausa/Latin/Ghana
{ 101, 66, 170, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Hausa/Latin/Niger
{ 102, 66, 248, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Hawaiian/Latin/United States
- { 103, 47, 116, 2015, 2015, 2015, 2015, 153, 153, 68, 68, 68, 68, 26, 26 },// Hebrew/Hebrew/Israel
- { 105, 29, 110, 2083, 2083, 2083, 2083, 153, 153, 81, 81, 81, 81, 26, 26 },// Hindi/Devanagari/India
+ { 103, 47, 116, 2287, 2287, 2287, 2287, 153, 153, 68, 68, 68, 68, 26, 26 },// Hebrew/Hebrew/Israel
+ { 105, 29, 110, 2355, 2355, 2355, 2355, 153, 153, 81, 81, 81, 81, 26, 26 },// Hindi/Devanagari/India
{ 105, 66, 110, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Hindi/Latin/India
- { 107, 66, 108, 922, 922, 922, 922, 153, 153, 83, 83, 83, 83, 26, 26 },// Hungarian/Latin/Hungary
- { 108, 66, 109, 922, 922, 922, 922, 153, 153, 83, 83, 83, 83, 26, 26 },// Icelandic/Latin/Iceland
- { 109, 66, 258, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Ido/Latin/World
+ { 107, 66, 108, 1002, 1002, 1002, 1002, 153, 153, 83, 83, 83, 83, 26, 26 },// Hungarian/Latin/Hungary
+ { 108, 66, 109, 1002, 1002, 1002, 1002, 153, 153, 83, 83, 83, 83, 26, 26 },// Icelandic/Latin/Iceland
+ { 109, 66, 258, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Ido/Latin/world
{ 110, 66, 169, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Igbo/Latin/Nigeria
{ 111, 66, 83, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Inari Sami/Latin/Finland
{ 112, 66, 111, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Indonesian/Latin/Indonesia
- { 114, 66, 258, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Interlingua/Latin/World
+ { 114, 66, 258, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Interlingua/Latin/world
+ { 115, 66, 75, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Interlingue/Latin/Estonia
{ 116, 18, 41, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Inuktitut/Canadian Aboriginal/Canada
{ 116, 66, 41, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Inuktitut/Latin/Canada
{ 118, 66, 114, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Irish/Latin/Ireland
@@ -411,61 +388,65 @@ static const QCalendarLocale locale_data[] = {
{ 119, 66, 203, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Italian/Latin/San Marino
{ 119, 66, 226, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Italian/Latin/Switzerland
{ 119, 66, 253, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Italian/Latin/Vatican City
- { 120, 53, 120, 2164, 2164, 2164, 2164, 153, 153, 77, 77, 77, 77, 26, 26 },// Japanese/Japanese/Japan
+ { 120, 53, 120, 2436, 2436, 2436, 2436, 153, 153, 77, 77, 77, 77, 26, 26 },// Japanese/Japanese/Japan
{ 121, 66, 111, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Javanese/Latin/Indonesia
{ 122, 66, 169, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Jju/Latin/Nigeria
- { 123, 66, 206, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Jola Fonyi/Latin/Senegal
+ { 123, 66, 206, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Jola-Fonyi/Latin/Senegal
{ 124, 66, 43, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Kabuverdianu/Latin/Cape Verde
{ 125, 66, 4, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Kabyle/Latin/Algeria
{ 126, 66, 40, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Kako/Latin/Cameroon
{ 127, 66, 95, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Kalaallisut/Latin/Greenland
{ 128, 66, 124, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Kalenjin/Latin/Kenya
{ 129, 66, 124, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Kamba/Latin/Kenya
- { 130, 56, 110, 2241, 2241, 2241, 2241, 153, 153, 92, 92, 92, 92, 26, 26 },// Kannada/Kannada/India
+ { 130, 56, 110, 2513, 2513, 2513, 2513, 153, 153, 92, 92, 92, 92, 26, 26 },// Kannada/Kannada/India
{ 132, 4, 110, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Kashmiri/Arabic/India
{ 132, 29, 110, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Kashmiri/Devanagari/India
- { 133, 27, 123, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Kazakh/Cyrillic/Kazakhstan
+ { 133, 27, 123, 2605, 2605, 2605, 2605, 153, 153, 80, 80, 80, 80, 26, 26 },// Kazakh/Cyrillic/Kazakhstan
{ 134, 66, 40, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Kenyang/Latin/Cameroon
{ 135, 60, 39, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Khmer/Khmer/Cambodia
{ 136, 66, 99, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Kiche/Latin/Guatemala
{ 137, 66, 124, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Kikuyu/Latin/Kenya
{ 138, 66, 194, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Kinyarwanda/Latin/Rwanda
{ 141, 29, 110, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Konkani/Devanagari/India
- { 142, 63, 218, 2333, 2333, 2333, 2333, 153, 153, 54, 54, 54, 54, 26, 26 },// Korean/Korean/South Korea
- { 142, 63, 174, 2333, 2333, 2333, 2333, 153, 153, 54, 54, 54, 54, 26, 26 },// Korean/Korean/North Korea
+ { 142, 63, 218, 2685, 2685, 2685, 2685, 153, 153, 54, 54, 54, 54, 26, 26 },// Korean/Korean/South Korea
+ { 142, 63, 50, 2685, 2685, 2685, 2685, 153, 153, 54, 54, 54, 54, 26, 26 },// Korean/Korean/China
+ { 142, 63, 174, 2685, 2685, 2685, 2685, 153, 153, 54, 54, 54, 54, 26, 26 },// Korean/Korean/North Korea
{ 144, 66, 145, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Koyraboro Senni/Latin/Mali
{ 145, 66, 145, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Koyra Chiini/Latin/Mali
{ 146, 66, 134, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Kpelle/Latin/Liberia
+ { 146, 66, 102, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Kpelle/Latin/Guinea
{ 148, 66, 239, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Kurdish/Latin/Turkey
{ 149, 66, 40, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Kwasio/Latin/Cameroon
{ 150, 27, 128, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Kyrgyz/Cyrillic/Kyrgyzstan
{ 151, 66, 248, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Lakota/Latin/United States
{ 152, 66, 230, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Langi/Latin/Tanzania
- { 153, 65, 129, 2387, 2387, 2467, 2546, 153, 153, 80, 80, 79, 79, 26, 26 },// Lao/Lao/Laos
+ { 153, 65, 129, 2739, 2739, 2819, 2898, 153, 153, 80, 80, 79, 79, 26, 26 },// Lao/Lao/Laos
{ 154, 66, 253, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Latin/Latin/Vatican City
- { 155, 66, 131, 2625, 2625, 2625, 2625, 153, 153, 92, 92, 92, 92, 26, 26 },// Latvian/Latin/Latvia
- { 158, 66, 57, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Lingala/Latin/Congo Kinshasa
+ { 155, 66, 131, 2977, 2977, 2977, 2977, 153, 153, 92, 92, 92, 92, 26, 26 },// Latvian/Latin/Latvia
+ { 158, 66, 57, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Lingala/Latin/Congo - Kinshasa
{ 158, 66, 7, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Lingala/Latin/Angola
{ 158, 66, 46, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Lingala/Latin/Central African Republic
- { 158, 66, 56, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Lingala/Latin/Congo Brazzaville
+ { 158, 66, 56, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Lingala/Latin/Congo - Brazzaville
{ 160, 66, 137, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Lithuanian/Latin/Lithuania
- { 161, 66, 258, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Lojban/Latin/World
+ { 161, 66, 258, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Lojban/Latin/world
{ 162, 66, 91, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Lower Sorbian/Latin/Germany
{ 163, 66, 91, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Low German/Latin/Germany
{ 163, 66, 165, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Low German/Latin/Netherlands
- { 164, 66, 57, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Luba Katanga/Latin/Congo Kinshasa
+ { 164, 66, 57, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Luba-Katanga/Latin/Congo - Kinshasa
{ 165, 66, 225, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Lule Sami/Latin/Sweden
+ { 165, 66, 175, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Lule Sami/Latin/Norway
{ 166, 66, 124, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Luo/Latin/Kenya
{ 167, 66, 138, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Luxembourgish/Latin/Luxembourg
{ 168, 66, 124, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Luyia/Latin/Kenya
- { 169, 27, 140, 2717, 2717, 2717, 2717, 153, 153, 79, 79, 79, 79, 26, 26 },// Macedonian/Cyrillic/Macedonia
+ { 169, 27, 140, 3069, 3069, 3069, 3069, 153, 153, 79, 79, 79, 79, 26, 26 },// Macedonian/Cyrillic/Macedonia
{ 170, 66, 230, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Machame/Latin/Tanzania
{ 171, 29, 110, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Maithili/Devanagari/India
- { 172, 66, 160, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Makhuwa Meetto/Latin/Mozambique
+ { 172, 66, 160, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Makhuwa-Meetto/Latin/Mozambique
{ 173, 66, 230, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Makonde/Latin/Tanzania
{ 174, 66, 141, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Malagasy/Latin/Madagascar
- { 175, 74, 110, 2796, 2796, 2796, 2796, 2887, 2887, 91, 91, 91, 91, 39, 39 },// Malayalam/Malayalam/India
+ { 175, 74, 110, 3148, 3148, 3148, 3148, 3239, 3239, 91, 91, 91, 91, 39, 39 },// Malayalam/Malayalam/India
{ 176, 66, 143, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Malay/Latin/Malaysia
+ { 176, 4, 35, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Malay/Arabic/Brunei
{ 176, 4, 143, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Malay/Arabic/Malaysia
{ 176, 66, 35, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Malay/Latin/Brunei
{ 176, 66, 111, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Malay/Latin/Indonesia
@@ -473,10 +454,10 @@ static const QCalendarLocale locale_data[] = {
{ 177, 66, 146, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Maltese/Latin/Malta
{ 179, 9, 110, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Manipuri/Bangla/India
{ 179, 78, 110, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Manipuri/Meitei Mayek/India
- { 180, 66, 115, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Manx/Latin/Isle Of Man
+ { 180, 66, 115, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Manx/Latin/Isle of Man
{ 181, 66, 167, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Maori/Latin/New Zealand
{ 182, 66, 49, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Mapuche/Latin/Chile
- { 183, 29, 110, 2926, 2926, 2926, 2926, 3006, 3006, 80, 80, 80, 80, 26, 26 },// Marathi/Devanagari/India
+ { 183, 29, 110, 3278, 3278, 3278, 3278, 3358, 3358, 80, 80, 80, 80, 26, 26 },// Marathi/Devanagari/India
{ 185, 66, 124, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Masai/Latin/Kenya
{ 185, 66, 230, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Masai/Latin/Tanzania
{ 186, 4, 112, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Mazanderani/Arabic/Iran
@@ -485,6 +466,7 @@ static const QCalendarLocale locale_data[] = {
{ 190, 66, 41, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Mohawk/Latin/Canada
{ 191, 27, 156, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Mongolian/Cyrillic/Mongolia
{ 191, 83, 50, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Mongolian/Mongolian/China
+ { 191, 83, 156, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Mongolian/Mongolian/Mongolia
{ 192, 66, 150, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Morisyen/Latin/Mauritius
{ 193, 66, 40, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Mundang/Latin/Cameroon
{ 194, 66, 248, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Muscogee/Latin/United States
@@ -503,53 +485,56 @@ static const QCalendarLocale locale_data[] = {
{ 206, 66, 225, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Northern Sami/Latin/Sweden
{ 207, 66, 216, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Northern Sotho/Latin/South Africa
{ 208, 66, 261, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// North Ndebele/Latin/Zimbabwe
- { 209, 66, 175, 922, 922, 922, 922, 153, 153, 83, 83, 83, 83, 26, 26 },// Norwegian Bokmal/Latin/Norway
- { 209, 66, 224, 922, 922, 922, 922, 153, 153, 83, 83, 83, 83, 26, 26 },// Norwegian Bokmal/Latin/Svalbard And Jan Mayen
- { 210, 66, 175, 922, 922, 922, 922, 153, 153, 83, 83, 83, 83, 26, 26 },// Norwegian Nynorsk/Latin/Norway
+ { 209, 66, 175, 1002, 1002, 1002, 1002, 153, 153, 83, 83, 83, 83, 26, 26 },// Norwegian Bokmal/Latin/Norway
+ { 209, 66, 224, 1002, 1002, 1002, 1002, 153, 153, 83, 83, 83, 83, 26, 26 },// Norwegian Bokmal/Latin/Svalbard and Jan Mayen
+ { 210, 66, 175, 1002, 1002, 1002, 1002, 153, 153, 83, 83, 83, 83, 26, 26 },// Norwegian Nynorsk/Latin/Norway
{ 211, 66, 219, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Nuer/Latin/South Sudan
{ 212, 66, 142, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Nyanja/Latin/Malawi
{ 213, 66, 243, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Nyankole/Latin/Uganda
{ 214, 66, 84, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Occitan/Latin/France
+ { 214, 66, 220, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Occitan/Latin/Spain
{ 215, 91, 110, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Odia/Odia/India
{ 220, 66, 77, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Oromo/Latin/Ethiopia
{ 220, 66, 124, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Oromo/Latin/Kenya
{ 221, 101, 248, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Osage/Osage/United States
{ 222, 27, 90, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Ossetic/Cyrillic/Georgia
{ 222, 27, 193, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Ossetic/Cyrillic/Russia
- { 227, 4, 1, 3032, 3032, 3032, 3032, 3094, 3094, 62, 62, 62, 62, 26, 26 },// Pashto/Arabic/Afghanistan
- { 227, 4, 178, 3032, 3032, 3032, 3032, 3094, 3094, 62, 62, 62, 62, 26, 26 },// Pashto/Arabic/Pakistan
- { 228, 4, 112, 3120, 3120, 3120, 3120, 3186, 3186, 66, 66, 66, 66, 23, 23 },// Persian/Arabic/Iran
- { 228, 4, 1, 3120, 3209, 3120, 3120, 3265, 3186, 66, 56, 66, 66, 23, 23 },// Persian/Arabic/Afghanistan
- { 230, 66, 187, 3288, 3288, 3288, 3288, 153, 153, 83, 83, 83, 83, 26, 26 },// Polish/Latin/Poland
+ { 226, 66, 62, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Papiamento/Latin/Curacao
+ { 226, 66, 13, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Papiamento/Latin/Aruba
+ { 227, 4, 1, 3384, 3384, 3384, 3384, 3446, 3446, 62, 62, 62, 62, 26, 26 },// Pashto/Arabic/Afghanistan
+ { 227, 4, 178, 3384, 3384, 3384, 3384, 3446, 3446, 62, 62, 62, 62, 26, 26 },// Pashto/Arabic/Pakistan
+ { 228, 4, 112, 3472, 3472, 3472, 3472, 3538, 3538, 66, 66, 66, 66, 23, 23 },// Persian/Arabic/Iran
+ { 228, 4, 1, 3561, 3561, 3561, 3561, 3617, 3617, 56, 56, 56, 56, 23, 23 },// Persian/Arabic/Afghanistan
+ { 230, 66, 187, 3640, 3640, 3640, 3640, 153, 153, 83, 83, 83, 83, 26, 26 },// Polish/Latin/Poland
{ 231, 66, 32, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Portuguese/Latin/Brazil
{ 231, 66, 7, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Portuguese/Latin/Angola
{ 231, 66, 43, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Portuguese/Latin/Cape Verde
{ 231, 66, 73, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Portuguese/Latin/Equatorial Guinea
- { 231, 66, 101, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Portuguese/Latin/Guinea Bissau
+ { 231, 66, 101, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Portuguese/Latin/Guinea-Bissau
{ 231, 66, 138, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Portuguese/Latin/Luxembourg
{ 231, 66, 139, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Portuguese/Latin/Macao
{ 231, 66, 160, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Portuguese/Latin/Mozambique
{ 231, 66, 188, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Portuguese/Latin/Portugal
- { 231, 66, 204, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Portuguese/Latin/Sao Tome And Principe
+ { 231, 66, 204, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Portuguese/Latin/Sao Tome and Principe
{ 231, 66, 226, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Portuguese/Latin/Switzerland
{ 231, 66, 232, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Portuguese/Latin/Timor-Leste
- { 232, 66, 258, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Prussian/Latin/World
- { 233, 41, 110, 3371, 3371, 3371, 3371, 153, 153, 77, 77, 77, 77, 26, 26 },// Punjabi/Gurmukhi/India
+ { 232, 66, 187, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Prussian/Latin/Poland
+ { 233, 41, 110, 3723, 3723, 3723, 3723, 153, 153, 77, 77, 77, 77, 26, 26 },// Punjabi/Gurmukhi/India
{ 233, 4, 178, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Punjabi/Arabic/Pakistan
{ 234, 66, 184, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Quechua/Latin/Peru
{ 234, 66, 28, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Quechua/Latin/Bolivia
{ 234, 66, 70, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Quechua/Latin/Ecuador
- { 235, 66, 192, 3448, 3448, 3448, 3448, 153, 153, 85, 85, 85, 85, 26, 26 },// Romanian/Latin/Romania
- { 235, 66, 154, 3448, 3448, 3448, 3448, 153, 153, 85, 85, 85, 85, 26, 26 },// Romanian/Latin/Moldova
+ { 235, 66, 192, 3800, 3800, 3800, 3800, 153, 153, 85, 85, 85, 85, 26, 26 },// Romanian/Latin/Romania
+ { 235, 66, 154, 3800, 3800, 3800, 3800, 153, 153, 85, 85, 85, 85, 26, 26 },// Romanian/Latin/Moldova
{ 236, 66, 226, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Romansh/Latin/Switzerland
{ 237, 66, 230, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Rombo/Latin/Tanzania
{ 238, 66, 38, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Rundi/Latin/Burundi
- { 239, 27, 193, 3533, 3533, 3533, 3533, 153, 153, 80, 80, 80, 80, 26, 26 },// Russian/Cyrillic/Russia
- { 239, 27, 22, 3533, 3533, 3533, 3533, 153, 153, 80, 80, 80, 80, 26, 26 },// Russian/Cyrillic/Belarus
- { 239, 27, 123, 3533, 3533, 3533, 3533, 153, 153, 80, 80, 80, 80, 26, 26 },// Russian/Cyrillic/Kazakhstan
- { 239, 27, 128, 3533, 3533, 3533, 3533, 153, 153, 80, 80, 80, 80, 26, 26 },// Russian/Cyrillic/Kyrgyzstan
- { 239, 27, 154, 3533, 3533, 3533, 3533, 153, 153, 80, 80, 80, 80, 26, 26 },// Russian/Cyrillic/Moldova
- { 239, 27, 244, 3533, 3533, 3533, 3533, 153, 153, 80, 80, 80, 80, 26, 26 },// Russian/Cyrillic/Ukraine
+ { 239, 27, 193, 3885, 3885, 3885, 3885, 153, 153, 80, 80, 80, 80, 26, 26 },// Russian/Cyrillic/Russia
+ { 239, 27, 22, 3885, 3885, 3885, 3885, 153, 153, 80, 80, 80, 80, 26, 26 },// Russian/Cyrillic/Belarus
+ { 239, 27, 123, 3885, 3885, 3885, 3885, 153, 153, 80, 80, 80, 80, 26, 26 },// Russian/Cyrillic/Kazakhstan
+ { 239, 27, 128, 3885, 3885, 3885, 3885, 153, 153, 80, 80, 80, 80, 26, 26 },// Russian/Cyrillic/Kyrgyzstan
+ { 239, 27, 154, 3885, 3885, 3885, 3885, 153, 153, 80, 80, 80, 80, 26, 26 },// Russian/Cyrillic/Moldova
+ { 239, 27, 244, 3885, 3885, 3885, 3885, 153, 153, 80, 80, 80, 80, 26, 26 },// Russian/Cyrillic/Ukraine
{ 240, 66, 230, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Rwa/Latin/Tanzania
{ 241, 66, 74, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Saho/Latin/Eritrea
{ 242, 27, 193, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Sakha/Cyrillic/Russia
@@ -559,16 +544,16 @@ static const QCalendarLocale locale_data[] = {
{ 247, 29, 110, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Sanskrit/Devanagari/India
{ 248, 93, 110, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Santali/Ol Chiki/India
{ 248, 29, 110, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Santali/Devanagari/India
- { 249, 66, 117, 922, 922, 3613, 3613, 153, 153, 83, 83, 57, 57, 26, 26 },// Sardinian/Latin/Italy
+ { 249, 66, 117, 1002, 1002, 3965, 3965, 153, 153, 83, 83, 57, 57, 26, 26 },// Sardinian/Latin/Italy
{ 251, 66, 160, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Sena/Latin/Mozambique
- { 252, 27, 207, 447, 447, 447, 447, 153, 153, 80, 80, 80, 80, 26, 26 },// Serbian/Cyrillic/Serbia
- { 252, 27, 29, 447, 447, 447, 447, 153, 153, 80, 80, 80, 80, 26, 26 },// Serbian/Cyrillic/Bosnia And Herzegovina
- { 252, 27, 126, 447, 447, 447, 447, 153, 153, 80, 80, 80, 80, 26, 26 },// Serbian/Cyrillic/Kosovo
- { 252, 27, 157, 447, 447, 447, 447, 153, 153, 80, 80, 80, 80, 26, 26 },// Serbian/Cyrillic/Montenegro
- { 252, 66, 29, 3670, 3670, 3670, 3670, 153, 153, 80, 80, 80, 80, 26, 26 },// Serbian/Latin/Bosnia And Herzegovina
- { 252, 66, 126, 3670, 3670, 3670, 3670, 153, 153, 80, 80, 80, 80, 26, 26 },// Serbian/Latin/Kosovo
- { 252, 66, 157, 3670, 3670, 3670, 3670, 153, 153, 80, 80, 80, 80, 26, 26 },// Serbian/Latin/Montenegro
- { 252, 66, 207, 3670, 3670, 3670, 3670, 153, 153, 80, 80, 80, 80, 26, 26 },// Serbian/Latin/Serbia
+ { 252, 27, 207, 527, 527, 527, 527, 153, 153, 80, 80, 80, 80, 26, 26 },// Serbian/Cyrillic/Serbia
+ { 252, 27, 29, 527, 527, 527, 527, 153, 153, 80, 80, 80, 80, 26, 26 },// Serbian/Cyrillic/Bosnia and Herzegovina
+ { 252, 27, 126, 527, 527, 527, 527, 153, 153, 80, 80, 80, 80, 26, 26 },// Serbian/Cyrillic/Kosovo
+ { 252, 27, 157, 527, 527, 527, 527, 153, 153, 80, 80, 80, 80, 26, 26 },// Serbian/Cyrillic/Montenegro
+ { 252, 66, 29, 4022, 4022, 4022, 4022, 153, 153, 80, 80, 80, 80, 26, 26 },// Serbian/Latin/Bosnia and Herzegovina
+ { 252, 66, 126, 4022, 4022, 4022, 4022, 153, 153, 80, 80, 80, 80, 26, 26 },// Serbian/Latin/Kosovo
+ { 252, 66, 157, 4022, 4022, 4022, 4022, 153, 153, 80, 80, 80, 80, 26, 26 },// Serbian/Latin/Montenegro
+ { 252, 66, 207, 4022, 4022, 4022, 4022, 153, 153, 80, 80, 80, 80, 26, 26 },// Serbian/Latin/Serbia
{ 253, 66, 230, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Shambala/Latin/Tanzania
{ 254, 66, 261, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Shona/Latin/Zimbabwe
{ 255, 141, 50, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Sichuan Yi/Yi/China
@@ -579,75 +564,80 @@ static const QCalendarLocale locale_data[] = {
{ 259, 29, 110, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Sindhi/Devanagari/India
{ 260, 119, 221, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Sinhala/Sinhala/Sri Lanka
{ 261, 66, 83, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Skolt Sami/Latin/Finland
- { 262, 66, 212, 841, 841, 841, 841, 153, 153, 81, 81, 81, 81, 26, 26 },// Slovak/Latin/Slovakia
+ { 262, 66, 212, 921, 921, 921, 921, 153, 153, 81, 81, 81, 81, 26, 26 },// Slovak/Latin/Slovakia
{ 263, 66, 213, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Slovenian/Latin/Slovenia
{ 264, 66, 243, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Soga/Latin/Uganda
- { 265, 66, 215, 3750, 3750, 3750, 3750, 153, 153, 99, 99, 99, 99, 26, 26 },// Somali/Latin/Somalia
- { 265, 66, 67, 3750, 3750, 3750, 3750, 153, 153, 99, 99, 99, 99, 26, 26 },// Somali/Latin/Djibouti
- { 265, 66, 77, 3750, 3750, 3750, 3750, 153, 153, 99, 99, 99, 99, 26, 26 },// Somali/Latin/Ethiopia
- { 265, 66, 124, 3750, 3750, 3750, 3750, 153, 153, 99, 99, 99, 99, 26, 26 },// Somali/Latin/Kenya
+ { 265, 66, 215, 4102, 4102, 4102, 4102, 153, 153, 99, 99, 99, 99, 26, 26 },// Somali/Latin/Somalia
+ { 265, 66, 67, 4102, 4102, 4102, 4102, 153, 153, 99, 99, 99, 99, 26, 26 },// Somali/Latin/Djibouti
+ { 265, 66, 77, 4102, 4102, 4102, 4102, 153, 153, 99, 99, 99, 99, 26, 26 },// Somali/Latin/Ethiopia
+ { 265, 66, 124, 4102, 4102, 4102, 4102, 153, 153, 99, 99, 99, 99, 26, 26 },// Somali/Latin/Kenya
{ 266, 4, 112, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Southern Kurdish/Arabic/Iran
+ { 266, 4, 113, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Southern Kurdish/Arabic/Iraq
{ 267, 66, 225, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Southern Sami/Latin/Sweden
+ { 267, 66, 175, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Southern Sami/Latin/Norway
{ 268, 66, 216, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Southern Sotho/Latin/South Africa
+ { 268, 66, 133, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Southern Sotho/Latin/Lesotho
{ 269, 66, 216, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// South Ndebele/Latin/South Africa
- { 270, 66, 220, 922, 922, 922, 922, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/Spain
- { 270, 66, 11, 922, 922, 922, 922, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/Argentina
- { 270, 66, 24, 922, 922, 922, 922, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/Belize
- { 270, 66, 28, 922, 922, 922, 922, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/Bolivia
- { 270, 66, 32, 922, 922, 922, 922, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/Brazil
- { 270, 66, 42, 922, 922, 922, 922, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/Canary Islands
- { 270, 66, 47, 922, 922, 922, 922, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/Ceuta And Melilla
- { 270, 66, 49, 922, 922, 922, 922, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/Chile
- { 270, 66, 54, 922, 922, 922, 922, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/Colombia
- { 270, 66, 59, 922, 922, 922, 922, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/Costa Rica
- { 270, 66, 61, 922, 922, 922, 922, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/Cuba
- { 270, 66, 69, 922, 922, 922, 922, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/Dominican Republic
- { 270, 66, 70, 922, 922, 922, 922, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/Ecuador
- { 270, 66, 72, 922, 922, 922, 922, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/El Salvador
- { 270, 66, 73, 922, 922, 922, 922, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/Equatorial Guinea
- { 270, 66, 99, 922, 922, 922, 922, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/Guatemala
- { 270, 66, 106, 922, 922, 922, 922, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/Honduras
- { 270, 66, 130, 922, 922, 922, 922, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/Latin America
- { 270, 66, 152, 922, 922, 922, 922, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/Mexico
- { 270, 66, 168, 922, 922, 922, 922, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/Nicaragua
- { 270, 66, 181, 922, 922, 922, 922, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/Panama
- { 270, 66, 183, 922, 922, 922, 922, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/Paraguay
- { 270, 66, 184, 922, 922, 922, 922, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/Peru
- { 270, 66, 185, 922, 922, 922, 922, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/Philippines
- { 270, 66, 189, 922, 922, 922, 922, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/Puerto Rico
- { 270, 66, 248, 922, 922, 922, 922, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/United States
- { 270, 66, 250, 922, 922, 922, 922, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/Uruguay
- { 270, 66, 254, 922, 922, 922, 922, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/Venezuela
+ { 270, 66, 220, 1002, 1002, 1002, 1002, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/Spain
+ { 270, 66, 11, 1002, 1002, 1002, 1002, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/Argentina
+ { 270, 66, 24, 1002, 1002, 1002, 1002, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/Belize
+ { 270, 66, 28, 1002, 1002, 1002, 1002, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/Bolivia
+ { 270, 66, 32, 1002, 1002, 1002, 1002, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/Brazil
+ { 270, 66, 42, 1002, 1002, 1002, 1002, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/Canary Islands
+ { 270, 66, 47, 1002, 1002, 1002, 1002, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/Ceuta and Melilla
+ { 270, 66, 49, 1002, 1002, 1002, 1002, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/Chile
+ { 270, 66, 54, 1002, 1002, 1002, 1002, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/Colombia
+ { 270, 66, 59, 1002, 1002, 1002, 1002, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/Costa Rica
+ { 270, 66, 61, 1002, 1002, 1002, 1002, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/Cuba
+ { 270, 66, 69, 1002, 1002, 1002, 1002, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/Dominican Republic
+ { 270, 66, 70, 1002, 1002, 1002, 1002, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/Ecuador
+ { 270, 66, 72, 1002, 1002, 1002, 1002, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/El Salvador
+ { 270, 66, 73, 1002, 1002, 1002, 1002, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/Equatorial Guinea
+ { 270, 66, 99, 1002, 1002, 1002, 1002, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/Guatemala
+ { 270, 66, 106, 1002, 1002, 1002, 1002, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/Honduras
+ { 270, 66, 130, 1002, 1002, 1002, 1002, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/Latin America
+ { 270, 66, 152, 1002, 1002, 1002, 1002, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/Mexico
+ { 270, 66, 168, 1002, 1002, 1002, 1002, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/Nicaragua
+ { 270, 66, 181, 1002, 1002, 1002, 1002, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/Panama
+ { 270, 66, 183, 1002, 1002, 1002, 1002, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/Paraguay
+ { 270, 66, 184, 1002, 1002, 1002, 1002, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/Peru
+ { 270, 66, 185, 1002, 1002, 1002, 1002, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/Philippines
+ { 270, 66, 189, 1002, 1002, 1002, 1002, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/Puerto Rico
+ { 270, 66, 248, 1002, 1002, 1002, 1002, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/United States
+ { 270, 66, 250, 1002, 1002, 1002, 1002, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/Uruguay
+ { 270, 66, 254, 1002, 1002, 1002, 1002, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/Venezuela
{ 271, 135, 159, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Standard Moroccan Tamazight/Tifinagh/Morocco
{ 272, 66, 111, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Sundanese/Latin/Indonesia
{ 273, 66, 230, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Swahili/Latin/Tanzania
- { 273, 66, 57, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Swahili/Latin/Congo Kinshasa
+ { 273, 66, 57, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Swahili/Latin/Congo - Kinshasa
{ 273, 66, 124, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Swahili/Latin/Kenya
{ 273, 66, 243, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Swahili/Latin/Uganda
{ 274, 66, 216, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Swati/Latin/South Africa
- { 275, 66, 225, 3849, 3932, 3849, 3932, 153, 153, 83, 83, 83, 83, 26, 26 },// Swedish/Latin/Sweden
- { 275, 66, 2, 3849, 3932, 3849, 3932, 153, 153, 83, 83, 83, 83, 26, 26 },// Swedish/Latin/Aland Islands
- { 275, 66, 83, 3849, 3932, 3849, 3932, 153, 153, 83, 83, 83, 83, 26, 26 },// Swedish/Latin/Finland
+ { 274, 66, 76, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Swati/Latin/Eswatini
+ { 275, 66, 225, 4201, 4284, 4201, 4284, 153, 153, 83, 83, 83, 83, 26, 26 },// Swedish/Latin/Sweden
+ { 275, 66, 2, 4201, 4284, 4201, 4284, 153, 153, 83, 83, 83, 83, 26, 26 },// Swedish/Latin/Aland Islands
+ { 275, 66, 83, 4201, 4284, 4201, 4284, 153, 153, 83, 83, 83, 83, 26, 26 },// Swedish/Latin/Finland
{ 276, 66, 226, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Swiss German/Latin/Switzerland
{ 276, 66, 84, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Swiss German/Latin/France
{ 276, 66, 136, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Swiss German/Latin/Liechtenstein
{ 277, 123, 113, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Syriac/Syriac/Iraq
+ { 277, 123, 227, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Syriac/Syriac/Syria
{ 278, 135, 159, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Tachelhit/Tifinagh/Morocco
{ 278, 66, 159, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Tachelhit/Latin/Morocco
{ 280, 127, 255, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Tai Dam/Tai Viet/Vietnam
{ 281, 66, 124, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Taita/Latin/Kenya
- { 282, 27, 229, 4015, 4015, 4015, 4015, 153, 153, 80, 80, 80, 80, 26, 26 },// Tajik/Cyrillic/Tajikistan
- { 283, 129, 110, 4095, 4095, 4188, 4188, 153, 153, 93, 93, 63, 63, 26, 26 },// Tamil/Tamil/India
- { 283, 129, 143, 4095, 4095, 4188, 4188, 153, 153, 93, 93, 63, 63, 26, 26 },// Tamil/Tamil/Malaysia
- { 283, 129, 210, 4095, 4095, 4188, 4188, 153, 153, 93, 93, 63, 63, 26, 26 },// Tamil/Tamil/Singapore
- { 283, 129, 221, 4095, 4095, 4188, 4188, 153, 153, 93, 93, 63, 63, 26, 26 },// Tamil/Tamil/Sri Lanka
+ { 282, 27, 229, 4367, 4367, 4367, 4367, 153, 153, 80, 80, 80, 80, 26, 26 },// Tajik/Cyrillic/Tajikistan
+ { 283, 129, 110, 4447, 4447, 4540, 4540, 153, 153, 93, 93, 63, 63, 26, 26 },// Tamil/Tamil/India
+ { 283, 129, 143, 4447, 4447, 4540, 4540, 153, 153, 93, 93, 63, 63, 26, 26 },// Tamil/Tamil/Malaysia
+ { 283, 129, 210, 4447, 4447, 4540, 4540, 153, 153, 93, 93, 63, 63, 26, 26 },// Tamil/Tamil/Singapore
+ { 283, 129, 221, 4447, 4447, 4540, 4540, 153, 153, 93, 93, 63, 63, 26, 26 },// Tamil/Tamil/Sri Lanka
{ 284, 66, 228, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Taroko/Latin/Taiwan
{ 285, 66, 170, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Tasawaq/Latin/Niger
{ 286, 27, 193, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Tatar/Cyrillic/Russia
- { 287, 131, 110, 4251, 4251, 4251, 4251, 153, 153, 88, 88, 88, 88, 26, 26 },// Telugu/Telugu/India
+ { 287, 131, 110, 4603, 4603, 4603, 4603, 153, 153, 88, 88, 88, 88, 26, 26 },// Telugu/Telugu/India
{ 288, 66, 243, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Teso/Latin/Uganda
{ 288, 66, 124, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Teso/Latin/Kenya
- { 289, 133, 231, 4339, 4339, 4339, 4339, 153, 153, 98, 98, 98, 98, 26, 26 },// Thai/Thai/Thailand
+ { 289, 133, 231, 4691, 4691, 4691, 4691, 153, 153, 98, 98, 98, 98, 26, 26 },// Thai/Thai/Thailand
{ 290, 134, 50, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Tibetan/Tibetan/China
{ 290, 134, 110, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Tibetan/Tibetan/India
{ 291, 33, 74, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Tigre/Ethiopic/Eritrea
@@ -657,289 +647,522 @@ static const QCalendarLocale locale_data[] = {
{ 295, 66, 235, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Tongan/Latin/Tonga
{ 296, 66, 216, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Tsonga/Latin/South Africa
{ 297, 66, 216, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Tswana/Latin/South Africa
- { 298, 66, 239, 4437, 4437, 4437, 4437, 153, 153, 80, 80, 80, 80, 26, 26 },// Turkish/Latin/Turkey
- { 298, 66, 63, 4437, 4437, 4437, 4437, 153, 153, 80, 80, 80, 80, 26, 26 },// Turkish/Latin/Cyprus
+ { 297, 66, 30, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Tswana/Latin/Botswana
+ { 298, 66, 239, 4789, 4789, 4789, 4789, 153, 153, 80, 80, 80, 80, 26, 26 },// Turkish/Latin/Turkey
+ { 298, 66, 63, 4789, 4789, 4789, 4789, 153, 153, 80, 80, 80, 80, 26, 26 },// Turkish/Latin/Cyprus
{ 299, 66, 240, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Turkmen/Latin/Turkmenistan
{ 301, 66, 169, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Tyap/Latin/Nigeria
- { 303, 27, 244, 4517, 4517, 4597, 4646, 153, 153, 80, 80, 49, 57, 26, 26 },// Ukrainian/Cyrillic/Ukraine
+ { 303, 27, 244, 4869, 4869, 4949, 4998, 153, 153, 80, 80, 49, 57, 26, 26 },// Ukrainian/Cyrillic/Ukraine
{ 304, 66, 91, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Upper Sorbian/Latin/Germany
- { 305, 4, 178, 4703, 4703, 4703, 4703, 153, 153, 66, 66, 66, 66, 26, 26 },// Urdu/Arabic/Pakistan
- { 305, 4, 110, 4703, 4703, 4703, 4703, 153, 153, 66, 66, 66, 66, 26, 26 },// Urdu/Arabic/India
+ { 305, 4, 178, 5055, 5055, 5055, 5055, 153, 153, 66, 66, 66, 66, 26, 26 },// Urdu/Arabic/Pakistan
+ { 305, 4, 110, 5055, 5055, 5055, 5055, 153, 153, 66, 66, 66, 66, 26, 26 },// Urdu/Arabic/India
{ 306, 4, 50, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Uyghur/Arabic/China
- { 307, 66, 251, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Uzbek/Latin/Uzbekistan
+ { 307, 66, 251, 5121, 5204, 5286, 5204, 153, 153, 83, 82, 83, 82, 26, 26 },// Uzbek/Latin/Uzbekistan
{ 307, 4, 1, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Uzbek/Arabic/Afghanistan
{ 307, 27, 251, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Uzbek/Cyrillic/Uzbekistan
{ 308, 139, 134, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Vai/Vai/Liberia
{ 308, 66, 134, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Vai/Latin/Liberia
{ 309, 66, 216, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Venda/Latin/South Africa
{ 310, 66, 255, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Vietnamese/Latin/Vietnam
- { 311, 66, 258, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Volapuk/Latin/World
+ { 311, 66, 258, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Volapuk/Latin/world
{ 312, 66, 230, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Vunjo/Latin/Tanzania
{ 313, 66, 23, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Walloon/Latin/Belgium
{ 314, 66, 226, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Walser/Latin/Switzerland
{ 315, 66, 15, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Warlpiri/Latin/Australia
{ 316, 66, 246, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Welsh/Latin/United Kingdom
{ 317, 4, 178, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Western Balochi/Arabic/Pakistan
+ { 317, 4, 1, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Western Balochi/Arabic/Afghanistan
+ { 317, 4, 112, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Western Balochi/Arabic/Iran
+ { 317, 4, 176, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Western Balochi/Arabic/Oman
+ { 317, 4, 245, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Western Balochi/Arabic/United Arab Emirates
{ 318, 66, 165, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Western Frisian/Latin/Netherlands
{ 319, 33, 77, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Wolaytta/Ethiopic/Ethiopia
{ 320, 66, 206, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Wolof/Latin/Senegal
{ 321, 66, 216, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Xhosa/Latin/South Africa
{ 322, 66, 40, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Yangben/Latin/Cameroon
- { 323, 47, 258, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Yiddish/Hebrew/World
+ { 323, 47, 244, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Yiddish/Hebrew/Ukraine
{ 324, 66, 169, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Yoruba/Latin/Nigeria
{ 324, 66, 25, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Yoruba/Latin/Benin
{ 325, 66, 170, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Zarma/Latin/Niger
+ { 326, 66, 50, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Zhuang/Latin/China
{ 327, 66, 216, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Zulu/Latin/South Africa
{ 328, 66, 32, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Kaingang/Latin/Brazil
{ 329, 66, 32, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Nheengatu/Latin/Brazil
{ 329, 66, 54, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Nheengatu/Latin/Colombia
{ 329, 66, 254, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Nheengatu/Latin/Venezuela
+ { 330, 29, 110, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Haryanvi/Devanagari/India
+ { 331, 66, 91, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Northern Frisian/Latin/Germany
+ { 332, 29, 110, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Rajasthani/Devanagari/India
+ { 333, 27, 193, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Moksha/Cyrillic/Russia
+ { 334, 66, 258, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Toki Pona/Latin/world
+ { 335, 66, 214, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Pijin/Latin/Solomon Islands
+ { 336, 66, 169, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Obolo/Latin/Nigeria
+ { 337, 4, 178, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Baluchi/Arabic/Pakistan
+ { 337, 66, 178, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Baluchi/Latin/Pakistan
+ { 338, 66, 117, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Ligurian/Latin/Italy
+ { 339, 142, 161, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Rohingya/Hanifi/Myanmar
+ { 339, 142, 20, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Rohingya/Hanifi/Bangladesh
+ { 340, 4, 178, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Torwali/Arabic/Pakistan
+ { 341, 66, 25, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Anii/Latin/Benin
+ { 342, 29, 110, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Kangri/Devanagari/India
+ { 343, 66, 117, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Venetian/Latin/Italy
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },// trailing zeros
};
-static const char16_t months_data[] = {
-0x46, 0x61, 0x72, 0x76, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x3b, 0x4f, 0x72, 0x64, 0x69, 0x62, 0x65, 0x68, 0x65, 0x73, 0x68,
-0x74, 0x3b, 0x4b, 0x68, 0x6f, 0x72, 0x64, 0x61, 0x64, 0x3b, 0x54, 0x69, 0x72, 0x3b, 0x4d, 0x6f, 0x72, 0x64, 0x61, 0x64,
-0x3b, 0x53, 0x68, 0x61, 0x68, 0x72, 0x69, 0x76, 0x61, 0x72, 0x3b, 0x4d, 0x65, 0x68, 0x72, 0x3b, 0x41, 0x62, 0x61, 0x6e,
-0x3b, 0x41, 0x7a, 0x61, 0x72, 0x3b, 0x44, 0x65, 0x79, 0x3b, 0x42, 0x61, 0x68, 0x6d, 0x61, 0x6e, 0x3b, 0x45, 0x73, 0x66,
-0x61, 0x6e, 0x64, 0x46, 0x61, 0x72, 0x3b, 0x4f, 0x72, 0x64, 0x3b, 0x4b, 0x68, 0x6f, 0x3b, 0x54, 0x69, 0x72, 0x3b, 0x4d,
-0x6f, 0x72, 0x3b, 0x53, 0x68, 0x61, 0x3b, 0x4d, 0x65, 0x68, 0x3b, 0x41, 0x62, 0x61, 0x3b, 0x41, 0x7a, 0x61, 0x3b, 0x44,
-0x65, 0x79, 0x3b, 0x42, 0x61, 0x68, 0x3b, 0x45, 0x73, 0x66, 0x46, 0x3b, 0x4f, 0x3b, 0x4b, 0x3b, 0x54, 0x3b, 0x4d, 0x3b,
-0x53, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x44, 0x3b, 0x42, 0x3b, 0x45, 0x31, 0x3b, 0x32, 0x3b, 0x33, 0x3b, 0x34,
-0x3b, 0x35, 0x3b, 0x36, 0x3b, 0x37, 0x3b, 0x38, 0x3b, 0x39, 0x3b, 0x31, 0x30, 0x3b, 0x31, 0x31, 0x3b, 0x31, 0x32, 0x641,
-0x631, 0x641, 0x631, 0x62f, 0x646, 0x3b, 0x623, 0x630, 0x631, 0x628, 0x64a, 0x647, 0x634, 0x62a, 0x3b, 0x62e, 0x631, 0x62f, 0x627, 0x62f,
-0x3b, 0x62a, 0x627, 0x631, 0x3b, 0x645, 0x631, 0x62f, 0x627, 0x62f, 0x3b, 0x634, 0x647, 0x631, 0x641, 0x627, 0x631, 0x3b, 0x645, 0x647,
-0x631, 0x3b, 0x622, 0x64a, 0x627, 0x646, 0x3b, 0x622, 0x630, 0x631, 0x3b, 0x62f, 0x64a, 0x3b, 0x628, 0x647, 0x645, 0x646, 0x3b, 0x627,
-0x633, 0x641, 0x646, 0x62f, 0x627, 0x631, 0x9ab, 0x9cd, 0x9af, 0x9be, 0x9ad, 0x9be, 0x9b0, 0x9cd, 0x9a1, 0x9bf, 0x9a8, 0x3b, 0x985, 0x9b0,
-0x9a1, 0x9bf, 0x9ac, 0x9c7, 0x9b9, 0x9c7, 0x9b6, 0x9cd, 0x9a4, 0x3b, 0x996, 0x9cb, 0x9b0, 0x9cd, 0x9a6, 0x9cd, 0x9a6, 0x3b, 0x9a4, 0x9c0,
-0x9b0, 0x3b, 0x9ae, 0x9b0, 0x9cd, 0x9af, 0x9be, 0x9a6, 0x3b, 0x9b6, 0x9be, 0x9b9, 0x9b0, 0x9bf, 0x9ac, 0x9be, 0x9b0, 0x3b, 0x9ae, 0x9c7,
-0x9b9, 0x9c7, 0x9b0, 0x3b, 0x986, 0x9ac, 0x9be, 0x9a8, 0x3b, 0x9ac, 0x9be, 0x99c, 0x9be, 0x9b0, 0x3b, 0x9a6, 0x9c7, 0x3b, 0x9ac, 0x9be,
-0x9b9, 0x9ae, 0x9be, 0x9a8, 0x3b, 0x98f, 0x9b8, 0x9ab, 0x9cd, 0x9af, 0x9be, 0x9a8, 0x9cd, 0x9a1, 0x9ab, 0x9cd, 0x9af, 0x9be, 0x9ad, 0x9be,
-0x9b0, 0x9cd, 0x9a1, 0x9bf, 0x9a8, 0x3b, 0x985, 0x9b0, 0x9a1, 0x9bf, 0x9ac, 0x9c7, 0x9b9, 0x9c7, 0x9b6, 0x9cd, 0x9a4, 0x3b, 0x996, 0x9cb,
-0x9b0, 0x9cd, 0x9a6, 0x9cd, 0x9a6, 0x3b, 0x9a4, 0x9c0, 0x9b0, 0x3b, 0x9ae, 0x9b0, 0x9cd, 0x9af, 0x9be, 0x9a6, 0x3b, 0x9b6, 0x9be, 0x9b9,
-0x9b0, 0x9bf, 0x9ac, 0x9be, 0x9b0, 0x3b, 0x9ae, 0x9c7, 0x9b9, 0x9c7, 0x9b0, 0x3b, 0x986, 0x9ac, 0x9be, 0x9a8, 0x3b, 0x986, 0x99c, 0x9be,
-0x9b0, 0x3b, 0x9a6, 0x9c7, 0x3b, 0x9ac, 0x9be, 0x9b9, 0x9ae, 0x9be, 0x9a8, 0x3b, 0x98f, 0x9b8, 0x9ab, 0x9cd, 0x9af, 0x9be, 0x9a8, 0x9cd,
-0x9a1, 0x9e7, 0x3b, 0x9e8, 0x3b, 0x9e9, 0x3b, 0x9ea, 0x3b, 0x9eb, 0x3b, 0x9ec, 0x3b, 0x9ed, 0x3b, 0x9ee, 0x3b, 0x9ef, 0x3b, 0x9e7,
-0x9e6, 0x3b, 0x9e7, 0x9e7, 0x3b, 0x9e7, 0x9e8, 0x424, 0x430, 0x440, 0x430, 0x432, 0x430, 0x434, 0x438, 0x43d, 0x3b, 0x41e, 0x440, 0x434,
-0x438, 0x431, 0x435, 0x445, 0x435, 0x448, 0x442, 0x3b, 0x41a, 0x43e, 0x440, 0x434, 0x430, 0x434, 0x3b, 0x422, 0x438, 0x440, 0x3b, 0x41c,
-0x43e, 0x440, 0x434, 0x430, 0x434, 0x3b, 0x428, 0x430, 0x445, 0x440, 0x438, 0x432, 0x430, 0x440, 0x3b, 0x41c, 0x435, 0x445, 0x440, 0x3b,
-0x410, 0x431, 0x430, 0x43d, 0x3b, 0x410, 0x437, 0x430, 0x440, 0x3b, 0x414, 0x435, 0x458, 0x3b, 0x411, 0x430, 0x445, 0x43c, 0x430, 0x43d,
-0x3b, 0x415, 0x441, 0x444, 0x430, 0x43d, 0x434, 0x31, 0x6708, 0x3b, 0x32, 0x6708, 0x3b, 0x33, 0x6708, 0x3b, 0x34, 0x6708, 0x3b, 0x35,
-0x6708, 0x3b, 0x36, 0x6708, 0x3b, 0x37, 0x6708, 0x3b, 0x38, 0x6708, 0x3b, 0x39, 0x6708, 0x3b, 0x31, 0x30, 0x6708, 0x3b, 0x31, 0x31,
-0x6708, 0x3b, 0x31, 0x32, 0x6708, 0x62e, 0x627, 0x6a9, 0x6d5, 0x644, 0x6ce, 0x648, 0x6d5, 0x3b, 0x628, 0x627, 0x646, 0x6d5, 0x645, 0x6d5,
-0x695, 0x3b, 0x62c, 0x6c6, 0x632, 0x6d5, 0x631, 0x62f, 0x627, 0x646, 0x3b, 0x67e, 0x648, 0x648, 0x634, 0x67e, 0x6d5, 0x695, 0x3b, 0x6af,
-0x6d5, 0x644, 0x627, 0x648, 0x6ce, 0x698, 0x3b, 0x62e, 0x6d5, 0x631, 0x645, 0x627, 0x646, 0x627, 0x646, 0x3b, 0x695, 0x6d5, 0x632, 0x628,
-0x6d5, 0x631, 0x3b, 0x62e, 0x6d5, 0x632, 0x6d5, 0x6b5, 0x648, 0x6d5, 0x631, 0x3b, 0x633, 0x6d5, 0x631, 0x645, 0x627, 0x648, 0x6d5, 0x632,
-0x3b, 0x628, 0x6d5, 0x641, 0x631, 0x627, 0x646, 0x628, 0x627, 0x631, 0x3b, 0x695, 0x6ce, 0x628, 0x6d5, 0x646, 0x62f, 0x627, 0x646, 0x3b,
-0x631, 0x6d5, 0x634, 0x6d5, 0x645, 0x6ce, 0x62e, 0x627, 0x6a9, 0x6d5, 0x644, 0x6ce, 0x648, 0x6d5, 0x3b, 0x6af, 0x648, 0x6b5, 0x627, 0x646,
-0x3b, 0x62c, 0x6c6, 0x632, 0x6d5, 0x631, 0x62f, 0x627, 0x646, 0x3b, 0x67e, 0x648, 0x648, 0x634, 0x67e, 0x6d5, 0x695, 0x3b, 0x6af, 0x6d5,
-0x644, 0x627, 0x648, 0x6ce, 0x698, 0x3b, 0x62e, 0x6d5, 0x631, 0x645, 0x627, 0x646, 0x627, 0x646, 0x3b, 0x695, 0x6d5, 0x632, 0x628, 0x6d5,
-0x631, 0x3b, 0x6af, 0x6d5, 0x6b5, 0x627, 0x695, 0x6ce, 0x632, 0x627, 0x646, 0x3b, 0x633, 0x6d5, 0x631, 0x645, 0x627, 0x648, 0x6d5, 0x632,
-0x3b, 0x628, 0x6d5, 0x641, 0x631, 0x627, 0x646, 0x628, 0x627, 0x631, 0x3b, 0x695, 0x6ce, 0x628, 0x6d5, 0x646, 0x62f, 0x627, 0x646, 0x3b,
-0x695, 0x6d5, 0x634, 0x6d5, 0x645, 0x6d5, 0x4e00, 0x6708, 0x3b, 0x4e8c, 0x6708, 0x3b, 0x4e09, 0x6708, 0x3b, 0x56db, 0x6708, 0x3b, 0x4e94, 0x6708,
-0x3b, 0x516d, 0x6708, 0x3b, 0x4e03, 0x6708, 0x3b, 0x516b, 0x6708, 0x3b, 0x4e5d, 0x6708, 0x3b, 0x5341, 0x6708, 0x3b, 0x5341, 0x4e00, 0x6708, 0x3b,
-0x5341, 0x4e8c, 0x6708, 0x31, 0x2e, 0x3b, 0x32, 0x2e, 0x3b, 0x33, 0x2e, 0x3b, 0x34, 0x2e, 0x3b, 0x35, 0x2e, 0x3b, 0x36, 0x2e,
-0x3b, 0x37, 0x2e, 0x3b, 0x38, 0x2e, 0x3b, 0x39, 0x2e, 0x3b, 0x31, 0x30, 0x2e, 0x3b, 0x31, 0x31, 0x2e, 0x3b, 0x31, 0x32,
-0x2e, 0x66, 0x61, 0x72, 0x76, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x3b, 0x6f, 0x72, 0x64, 0x69, 0x62, 0x65, 0x68, 0x65, 0x161,
-0x74, 0x3b, 0x63, 0x68, 0x6f, 0x72, 0x64, 0xe1, 0x64, 0x3b, 0x74, 0xed, 0x72, 0x3b, 0x6d, 0x6f, 0x72, 0x64, 0xe1, 0x64,
-0x3b, 0x161, 0x61, 0x68, 0x72, 0xed, 0x76, 0x61, 0x72, 0x3b, 0x6d, 0x65, 0x68, 0x72, 0x3b, 0xe1, 0x62, 0xe1, 0x6e, 0x3b,
-0xe1, 0x7a, 0x61, 0x72, 0x3b, 0x64, 0x65, 0x69, 0x3b, 0x62, 0x61, 0x68, 0x6d, 0x61, 0x6e, 0x3b, 0x65, 0x73, 0x66, 0x61,
-0x6e, 0x64, 0x66, 0x61, 0x72, 0x76, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x3b, 0x6f, 0x72, 0x64, 0x69, 0x62, 0x65, 0x68, 0x65,
-0x73, 0x68, 0x74, 0x3b, 0x6b, 0x68, 0x6f, 0x72, 0x64, 0x61, 0x64, 0x3b, 0x74, 0x69, 0x72, 0x3b, 0x6d, 0x6f, 0x72, 0x64,
-0x61, 0x64, 0x3b, 0x73, 0x68, 0x61, 0x68, 0x72, 0x69, 0x76, 0x61, 0x72, 0x3b, 0x6d, 0x65, 0x68, 0x72, 0x3b, 0x61, 0x62,
-0x61, 0x6e, 0x3b, 0x61, 0x7a, 0x61, 0x72, 0x3b, 0x64, 0x65, 0x79, 0x3b, 0x62, 0x61, 0x68, 0x6d, 0x61, 0x6e, 0x3b, 0x65,
-0x73, 0x66, 0x61, 0x6e, 0x64, 0x64, 0x7a, 0x6f, 0x76, 0x65, 0x3b, 0x64, 0x7a, 0x6f, 0x64, 0x7a, 0x65, 0x3b, 0x74, 0x65,
-0x64, 0x6f, 0x78, 0x65, 0x3b, 0x61, 0x66, 0x254, 0x66, 0x69, 0x1ebd, 0x3b, 0x64, 0x61, 0x6d, 0x25b, 0x3b, 0x6d, 0x61, 0x73,
-0x61, 0x3b, 0x73, 0x69, 0x61, 0x6d, 0x6c, 0x254, 0x6d, 0x3b, 0x64, 0x65, 0x61, 0x73, 0x69, 0x61, 0x6d, 0x69, 0x6d, 0x65,
-0x3b, 0x61, 0x6e, 0x79, 0x254, 0x6e, 0x79, 0x254, 0x3b, 0x6b, 0x65, 0x6c, 0x65, 0x3b, 0x61, 0x64, 0x65, 0x25b, 0x6d, 0x65,
-0x6b, 0x70, 0x254, 0x78, 0x65, 0x3b, 0x64, 0x7a, 0x6f, 0x6d, 0x65, 0x64, 0x7a, 0x76, 0x3b, 0x64, 0x7a, 0x64, 0x3b, 0x74,
-0x65, 0x64, 0x3b, 0x61, 0x66, 0x254, 0x3b, 0x64, 0x61, 0x6d, 0x3b, 0x6d, 0x61, 0x73, 0x3b, 0x73, 0x69, 0x61, 0x3b, 0x64,
-0x65, 0x61, 0x3b, 0x61, 0x6e, 0x79, 0x3b, 0x6b, 0x65, 0x6c, 0x3b, 0x61, 0x64, 0x65, 0x3b, 0x64, 0x7a, 0x6d, 0x66, 0x61,
-0x72, 0x76, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x6b, 0x75, 0x75, 0x3b, 0x6f, 0x72, 0x64, 0x69, 0x62, 0x65, 0x68, 0x65, 0x161,
-0x74, 0x6b, 0x75, 0x75, 0x3b, 0x6b, 0x68, 0x6f, 0x72, 0x64, 0x61, 0x64, 0x6b, 0x75, 0x75, 0x3b, 0x74, 0x69, 0x72, 0x6b,
-0x75, 0x75, 0x3b, 0x6d, 0x6f, 0x72, 0x64, 0x61, 0x64, 0x6b, 0x75, 0x75, 0x3b, 0x161, 0x61, 0x68, 0x72, 0x69, 0x76, 0x61,
-0x72, 0x6b, 0x75, 0x75, 0x3b, 0x6d, 0x65, 0x68, 0x72, 0x6b, 0x75, 0x75, 0x3b, 0x61, 0x62, 0x61, 0x6e, 0x6b, 0x75, 0x75,
-0x3b, 0x61, 0x7a, 0x61, 0x72, 0x6b, 0x75, 0x75, 0x3b, 0x64, 0x65, 0x79, 0x6b, 0x75, 0x75, 0x3b, 0x62, 0x61, 0x68, 0x6d,
-0x61, 0x6e, 0x6b, 0x75, 0x75, 0x3b, 0x65, 0x73, 0x66, 0x61, 0x6e, 0x64, 0x6b, 0x75, 0x75, 0x66, 0x61, 0x72, 0x76, 0x61,
-0x72, 0x64, 0x69, 0x6e, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x6f, 0x72, 0x64, 0x69, 0x62, 0x65, 0x68, 0x65, 0x161, 0x74,
-0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x6b, 0x68, 0x6f, 0x72, 0x64, 0x61, 0x64, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x74,
-0x69, 0x72, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x6d, 0x6f, 0x72, 0x64, 0x61, 0x64, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b,
-0x161, 0x61, 0x68, 0x72, 0x69, 0x76, 0x61, 0x72, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x6d, 0x65, 0x68, 0x72, 0x6b, 0x75,
-0x75, 0x74, 0x61, 0x3b, 0x61, 0x62, 0x61, 0x6e, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x61, 0x7a, 0x61, 0x72, 0x6b, 0x75,
-0x75, 0x74, 0x61, 0x3b, 0x64, 0x65, 0x79, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x62, 0x61, 0x68, 0x6d, 0x61, 0x6e, 0x6b,
-0x75, 0x75, 0x74, 0x61, 0x3b, 0x65, 0x73, 0x66, 0x61, 0x6e, 0x64, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x66, 0x61, 0x72, 0x76,
-0x61, 0x72, 0x64, 0x69, 0x6e, 0x3b, 0x6f, 0x72, 0x64, 0x69, 0x62, 0x65, 0x68, 0x65, 0x161, 0x74, 0x3b, 0x6b, 0x68, 0x6f,
-0x72, 0x64, 0x61, 0x64, 0x3b, 0x74, 0x69, 0x72, 0x3b, 0x6d, 0x6f, 0x72, 0x64, 0x61, 0x64, 0x3b, 0x161, 0x61, 0x68, 0x72,
-0x69, 0x76, 0x61, 0x72, 0x3b, 0x6d, 0x65, 0x68, 0x72, 0x3b, 0x61, 0x62, 0x61, 0x6e, 0x3b, 0x61, 0x7a, 0x61, 0x72, 0x3b,
-0x64, 0x65, 0x79, 0x3b, 0x62, 0x61, 0x68, 0x6d, 0x61, 0x6e, 0x3b, 0x65, 0x73, 0x66, 0x61, 0x6e, 0x64, 0x66, 0x61, 0x72,
-0x76, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x3b, 0x6f, 0x72, 0x64, 0x69, 0x62, 0x65, 0x68, 0x65, 0x161, 0x74, 0x3b, 0x6b, 0x68,
-0x6f, 0x72, 0x64, 0xe2, 0x64, 0x3b, 0x74, 0x69, 0x72, 0x3b, 0x6d, 0x6f, 0x72, 0x64, 0xe2, 0x64, 0x3b, 0x161, 0x61, 0x68,
-0x72, 0x69, 0x76, 0x61, 0x72, 0x3b, 0x6d, 0x65, 0x68, 0x72, 0x3b, 0xe2, 0x62, 0xe2, 0x6e, 0x3b, 0xe2, 0x7a, 0x61, 0x72,
-0x3b, 0x64, 0x65, 0x79, 0x3b, 0x62, 0x61, 0x68, 0x6d, 0x61, 0x6e, 0x3b, 0x65, 0x73, 0x66, 0x61, 0x6e, 0x64, 0x66, 0x61,
-0x72, 0x2e, 0x3b, 0x6f, 0x72, 0x64, 0x2e, 0x3b, 0x6b, 0x68, 0x6f, 0x2e, 0x3b, 0x74, 0x69, 0x72, 0x3b, 0x6d, 0x6f, 0x72,
-0x2e, 0x3b, 0x161, 0x61, 0x68, 0x2e, 0x3b, 0x6d, 0x65, 0x68, 0x72, 0x3b, 0xe2, 0x62, 0xe2, 0x6e, 0x3b, 0xe2, 0x7a, 0x61,
-0x72, 0x3b, 0x64, 0x65, 0x79, 0x3b, 0x62, 0x61, 0x68, 0x2e, 0x3b, 0x65, 0x73, 0x66, 0x2e, 0x46, 0x61, 0x72, 0x76, 0x61,
-0x72, 0x64, 0x69, 0x6e, 0x3b, 0x4f, 0x72, 0x64, 0x69, 0x62, 0x65, 0x68, 0x65, 0x161, 0x74, 0x3b, 0x4b, 0x68, 0x6f, 0x72,
-0x64, 0xe2, 0x64, 0x3b, 0x54, 0x69, 0x72, 0x3b, 0x4d, 0x6f, 0x72, 0x64, 0xe2, 0x64, 0x3b, 0x160, 0x61, 0x68, 0x72, 0x69,
-0x76, 0x61, 0x72, 0x3b, 0x4d, 0x65, 0x68, 0x72, 0x3b, 0xc2, 0x62, 0xe2, 0x6e, 0x3b, 0xc2, 0x7a, 0x61, 0x72, 0x3b, 0x44,
-0x65, 0x79, 0x3b, 0x42, 0x61, 0x68, 0x6d, 0x61, 0x6e, 0x3b, 0x45, 0x73, 0x66, 0x61, 0x6e, 0x64, 0x46, 0x61, 0x72, 0x2e,
-0x3b, 0x4f, 0x72, 0x64, 0x2e, 0x3b, 0x4b, 0x68, 0x6f, 0x2e, 0x3b, 0x54, 0x69, 0x72, 0x3b, 0x4d, 0x6f, 0x72, 0x2e, 0x3b,
-0x160, 0x61, 0x68, 0x2e, 0x3b, 0x4d, 0x65, 0x68, 0x72, 0x3b, 0xc2, 0x62, 0xe2, 0x2e, 0x3b, 0xc2, 0x7a, 0x61, 0x72, 0x3b,
-0x44, 0x65, 0x79, 0x3b, 0x42, 0x61, 0x68, 0x2e, 0x3b, 0x45, 0x73, 0x66, 0x2e, 0x10e4, 0x10d0, 0x10e0, 0x10d5, 0x10d0, 0x10e0, 0x10d3,
-0x10d8, 0x10dc, 0x10d8, 0x3b, 0x10dd, 0x10e0, 0x10d3, 0x10d8, 0x10d1, 0x10d4, 0x10f0, 0x10d4, 0x10e8, 0x10d7, 0x10d8, 0x3b, 0x10ee, 0x10dd, 0x10e0, 0x10d3,
-0x10d0, 0x10d3, 0x10d8, 0x3b, 0x10d7, 0x10d8, 0x10e0, 0x10d8, 0x3b, 0x10db, 0x10dd, 0x10e0, 0x10d3, 0x10d0, 0x10d3, 0x10d8, 0x3b, 0x10e8, 0x10d0, 0x10f0,
-0x10e0, 0x10d8, 0x10d5, 0x10d0, 0x10e0, 0x10d8, 0x3b, 0x10db, 0x10d4, 0x10f0, 0x10e0, 0x10d8, 0x3b, 0x10d0, 0x10d1, 0x10d0, 0x10dc, 0x10d8, 0x3b, 0x10d0,
-0x10d6, 0x10d0, 0x10e0, 0x10d8, 0x3b, 0x10d3, 0x10d4, 0x10d8, 0x3b, 0x10d1, 0x10d0, 0x10f0, 0x10db, 0x10d0, 0x10dc, 0x10d8, 0x3b, 0x10d4, 0x10e1, 0x10e4,
-0x10d0, 0x10dc, 0x10d3, 0x10d8, 0x46, 0x61, 0x72, 0x77, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x3b, 0x4f, 0x72, 0x64, 0x69, 0x62, 0x65,
-0x68, 0x65, 0x73, 0x63, 0x68, 0x74, 0x3b, 0x43, 0x68, 0x6f, 0x72, 0x64, 0x101, 0x64, 0x3b, 0x54, 0x69, 0x72, 0x3b, 0x4d,
-0x6f, 0x72, 0x64, 0x101, 0x64, 0x3b, 0x53, 0x63, 0x68, 0x61, 0x68, 0x72, 0x69, 0x77, 0x61, 0x72, 0x3b, 0x4d, 0x65, 0x68,
-0x72, 0x3b, 0x100, 0x62, 0x101, 0x6e, 0x3b, 0x100, 0x73, 0x61, 0x72, 0x3b, 0x44, 0xe9, 0x69, 0x3b, 0x42, 0x61, 0x68, 0x6d,
-0x61, 0x6e, 0x3b, 0x45, 0x73, 0x73, 0x66, 0x61, 0x6e, 0x64, 0xaab, 0xabe, 0xab0, 0xacd, 0xab5, 0xabe, 0xab0, 0xacd, 0xaa6, 0xabf,
-0xaa8, 0x3b, 0xa93, 0xab0, 0xaa1, 0xac0, 0xaac, 0xac7, 0xab9, 0xac7, 0xab6, 0xacd, 0xa9f, 0x3b, 0xa96, 0xacb, 0xab0, 0xaa6, 0xabe, 0xaa6,
-0x3b, 0xaa4, 0xabf, 0xab0, 0x3b, 0xaae, 0xacb, 0xab0, 0xacd, 0xaa6, 0xabe, 0xaa6, 0x3b, 0xab6, 0xabe, 0xab9, 0xab0, 0xabf, 0xab5, 0xab0,
-0x3b, 0xaae, 0xac7, 0xab9, 0xab0, 0x3b, 0xa85, 0xaac, 0xabe, 0xaa8, 0x3b, 0xa85, 0xa9d, 0xabe, 0xab0, 0x3b, 0xaa1, 0xac7, 0xaaf, 0x3b,
-0xaac, 0xabe, 0xab9, 0xaae, 0xac7, 0xaa8, 0x3b, 0xa8f, 0xab8, 0xacd, 0xaab, 0xabe, 0xaa8, 0xacd, 0xaa1, 0x5e4, 0x5e8, 0x5d5, 0x5e8, 0x5d3,
-0x5d9, 0x5df, 0x3b, 0x5d0, 0x5e8, 0x5d3, 0x5d9, 0x5d1, 0x5d4, 0x5e9, 0x5ea, 0x3b, 0x5d7, 0x5f3, 0x5e8, 0x5d3, 0x5d0, 0x5d3, 0x3b, 0x5ea,
-0x5d9, 0x5e8, 0x3b, 0x5de, 0x5e8, 0x5d3, 0x5d0, 0x5d3, 0x3b, 0x5e9, 0x5d4, 0x5e8, 0x5d9, 0x5d5, 0x5e8, 0x3b, 0x5de, 0x5d4, 0x5e8, 0x3b,
-0x5d0, 0x5d1, 0x5d0, 0x5df, 0x3b, 0x5d0, 0x5d3, 0x5f3, 0x5e8, 0x3b, 0x5d3, 0x5d9, 0x3b, 0x5d1, 0x5d4, 0x5de, 0x5df, 0x3b, 0x5d0, 0x5e1,
-0x5e4, 0x5e0, 0x5d3, 0x92b, 0x930, 0x94d, 0x935, 0x93e, 0x926, 0x93f, 0x928, 0x3b, 0x913, 0x930, 0x94d, 0x926, 0x93f, 0x935, 0x947, 0x939,
-0x947, 0x938, 0x94d, 0x91f, 0x3b, 0x916, 0x94b, 0x930, 0x930, 0x94d, 0x926, 0x93e, 0x926, 0x3b, 0x91f, 0x93f, 0x930, 0x3b, 0x92e, 0x94b,
-0x930, 0x926, 0x93e, 0x926, 0x3b, 0x936, 0x93e, 0x939, 0x930, 0x940, 0x935, 0x930, 0x94d, 0x3b, 0x92e, 0x947, 0x939, 0x930, 0x3b, 0x905,
-0x935, 0x928, 0x3b, 0x905, 0x91c, 0x93c, 0x930, 0x3b, 0x921, 0x947, 0x3b, 0x92c, 0x939, 0x92e, 0x928, 0x3b, 0x908, 0x938, 0x94d, 0x92b,
-0x928, 0x94d, 0x926, 0x94d, 0x30d5, 0x30a1, 0x30eb, 0x30f4, 0x30a1, 0x30eb, 0x30c7, 0x30a3, 0x30fc, 0x30f3, 0x3b, 0x30aa, 0x30eb, 0x30c7, 0x30a3, 0x30fc,
-0x30d9, 0x30d8, 0x30b7, 0x30e5, 0x30c8, 0x3b, 0x30db, 0x30eb, 0x30c0, 0x30fc, 0x30c9, 0x3b, 0x30c6, 0x30a3, 0x30fc, 0x30eb, 0x3b, 0x30e2, 0x30eb, 0x30c0,
-0x30fc, 0x30c9, 0x3b, 0x30b7, 0x30e3, 0x30cf, 0x30ea, 0x30fc, 0x30f4, 0x30a1, 0x30eb, 0x3b, 0x30e1, 0x30d5, 0x30eb, 0x3b, 0x30a2, 0x30fc, 0x30d0, 0x30fc,
-0x30f3, 0x3b, 0x30a2, 0x30fc, 0x30b6, 0x30eb, 0x3b, 0x30c7, 0x30a4, 0x3b, 0x30d0, 0x30d5, 0x30de, 0x30f3, 0x3b, 0x30a8, 0x30b9, 0x30d5, 0x30a1, 0x30f3,
-0x30c9, 0xcab, 0xcb0, 0xccd, 0xcb5, 0xcb0, 0xccd, 0xca6, 0xcbf, 0xca8, 0xccd, 0x3b, 0xc93, 0xcb0, 0xccd, 0xca6, 0xcbf, 0xcac, 0xcc6, 0xcb9,
-0xcc6, 0xcb6, 0xccd, 0xc9f, 0xccd, 0x3b, 0xc96, 0xccb, 0xcb0, 0xccd, 0xca1, 0xcbe, 0xca6, 0xccd, 0x3b, 0xc9f, 0xcbf, 0xcb0, 0xccd, 0x3b,
-0xcae, 0xcca, 0xcb0, 0xccd, 0xca6, 0xcbe, 0xca6, 0xccd, 0x3b, 0xcb6, 0xcb9, 0xcb0, 0xcbf, 0xcb5, 0xcbe, 0xcb0, 0xccd, 0x3b, 0xcae, 0xcc6,
-0xcb9, 0xccd, 0xcb0, 0xccd, 0x3b, 0xc85, 0xcac, 0xca8, 0xccd, 0x3b, 0xc85, 0xc9d, 0xcb0, 0xccd, 0x3b, 0xca1, 0xcc7, 0x3b, 0xcac, 0xcb9,
-0xccd, 0xcae, 0xca8, 0xccd, 0x3b, 0xc8e, 0xcb8, 0xccd, 0xcab, 0xcbe, 0xc82, 0xca1, 0xccd, 0xd654, 0xb974, 0xbc14, 0xb518, 0x3b, 0xc624, 0xb974,
-0xb514, 0xbca0, 0xd5e4, 0xc26c, 0xd2b8, 0x3b, 0xd638, 0xb974, 0xb2e4, 0xb4dc, 0x3b, 0xd2f0, 0xb974, 0x3b, 0xbaa8, 0xb974, 0xb2e4, 0xb4dc, 0x3b, 0xc0e4,
-0xd750, 0xb9ac, 0xbc14, 0xb974, 0x3b, 0xba54, 0xd750, 0xb974, 0x3b, 0xc544, 0xbc18, 0x3b, 0xc544, 0xc790, 0xb974, 0x3b, 0xb2e4, 0xc774, 0x3b, 0xbc14,
-0xd750, 0xb9cc, 0x3b, 0xc5d0, 0xc2a4, 0xd310, 0xb4dc, 0xe9f, 0xea3, 0xeb2, 0xea7, 0xeb2, 0xe94, 0xeb4, 0xe99, 0x3b, 0xead, 0xecd, 0xea3, 0xe94,
-0xeb5, 0xe9a, 0xeb5, 0xec0, 0xeab, 0xea3, 0xe94, 0x3b, 0xe84, 0xecd, 0xea3, 0xec0, 0xe94, 0xe94, 0x3b, 0xec1, 0xe95, 0xea3, 0x3b, 0xea1,
-0xecd, 0xea3, 0xec0, 0xe94, 0xe94, 0x3b, 0xe8a, 0xeb2, 0xea3, 0xeab, 0xeb4, 0xea7, 0xeb2, 0x3b, 0xec0, 0xea1, 0xeb5, 0x3b, 0xead, 0xeb2,
-0xe9a, 0xeb2, 0xe99, 0x3b, 0xead, 0xeb2, 0xe8a, 0xeb2, 0xea3, 0x3b, 0xe94, 0xeb5, 0xea3, 0x3b, 0xe9a, 0xea3, 0xeb2, 0xec1, 0xea1, 0xe99,
-0x3b, 0xec0, 0xead, 0xeaa, 0xe9f, 0xeb2, 0xe99, 0xe9f, 0xea3, 0xeb2, 0xea7, 0xeb2, 0xe94, 0xeb4, 0xe99, 0x3b, 0xead, 0xecd, 0xea3, 0xe94,
-0xeb5, 0xe9a, 0xeb5, 0xec0, 0xeab, 0xeae, 0xe94, 0x3b, 0xe84, 0xecd, 0xea3, 0xec0, 0xe94, 0xe94, 0x3b, 0xec1, 0xe95, 0xea3, 0x3b, 0xea1,
-0xecd, 0xea3, 0xec0, 0xe94, 0xe94, 0x3b, 0xe8a, 0xeb2, 0xea3, 0xea5, 0xeb4, 0xea7, 0xeb2, 0x3b, 0xec0, 0xea1, 0xeb5, 0x3b, 0xead, 0xeb2,
-0xe9a, 0xeb2, 0xe99, 0x3b, 0xead, 0xeb2, 0xe8a, 0xeb2, 0x3b, 0xe94, 0xeb5, 0xea3, 0x3b, 0xe9a, 0xea3, 0xeb2, 0xea1, 0xeb2, 0xe99, 0x3b,
-0xec0, 0xead, 0xeaa, 0xe9f, 0xeb2, 0xe99, 0xe9f, 0xeb2, 0xea3, 0xea7, 0xeb2, 0xe94, 0xeb4, 0xe99, 0x3b, 0xead, 0xecd, 0xea3, 0xe94, 0xeb5,
-0xe9a, 0xeb5, 0xec0, 0xeab, 0xea3, 0xe94, 0x3b, 0xe84, 0xecd, 0xea3, 0xec0, 0xe94, 0xe94, 0x3b, 0xec1, 0xe95, 0xea3, 0x3b, 0xea1, 0xecd,
-0xea3, 0xec0, 0xe94, 0xe94, 0x3b, 0xe8a, 0xeb2, 0xea3, 0xeab, 0xeb4, 0xea7, 0xeb2, 0x3b, 0xec0, 0xea1, 0xeb5, 0x3b, 0xead, 0xeb2, 0xe9a,
-0xeb2, 0xe99, 0x3b, 0xead, 0xeb2, 0xe8a, 0xeb2, 0x3b, 0xe94, 0xeb5, 0xea3, 0x3b, 0xe9a, 0xea3, 0xeb2, 0xea1, 0xeb2, 0xe99, 0x3b, 0xec0,
-0xead, 0xeaa, 0xe9f, 0xeb2, 0xe99, 0x66, 0x61, 0x72, 0x76, 0x61, 0x72, 0x64, 0x12b, 0x6e, 0x73, 0x3b, 0x6f, 0x72, 0x64, 0x69,
-0x62, 0x65, 0x68, 0x65, 0x161, 0x74, 0x73, 0x3b, 0x68, 0x6f, 0x72, 0x64, 0x101, 0x64, 0x73, 0x3b, 0x74, 0x12b, 0x72, 0x73,
-0x3b, 0x6d, 0x6f, 0x72, 0x64, 0x101, 0x64, 0x73, 0x3b, 0x161, 0x61, 0x68, 0x72, 0x69, 0x76, 0x113, 0x72, 0x73, 0x3b, 0x6d,
-0x65, 0x68, 0x72, 0x73, 0x3b, 0x61, 0x62, 0x61, 0x6e, 0x73, 0x3b, 0x61, 0x7a, 0x65, 0x72, 0x73, 0x3b, 0x64, 0x65, 0x6a,
-0x73, 0x3b, 0x62, 0x61, 0x68, 0x6d, 0x61, 0x6e, 0x73, 0x3b, 0x65, 0x73, 0x66, 0x61, 0x6e, 0x64, 0x73, 0x444, 0x430, 0x440,
-0x432, 0x430, 0x440, 0x434, 0x438, 0x43d, 0x3b, 0x43e, 0x440, 0x434, 0x438, 0x431, 0x435, 0x445, 0x435, 0x448, 0x442, 0x3b, 0x43a, 0x43e,
-0x440, 0x434, 0x430, 0x434, 0x3b, 0x442, 0x438, 0x440, 0x3b, 0x43c, 0x43e, 0x440, 0x434, 0x430, 0x434, 0x3b, 0x448, 0x430, 0x445, 0x440,
-0x438, 0x432, 0x430, 0x440, 0x3b, 0x43c, 0x435, 0x440, 0x3b, 0x430, 0x431, 0x430, 0x43d, 0x3b, 0x430, 0x437, 0x430, 0x440, 0x3b, 0x434,
-0x435, 0x458, 0x3b, 0x431, 0x430, 0x445, 0x43c, 0x430, 0x43d, 0x3b, 0x435, 0x441, 0x444, 0x430, 0x43d, 0x434, 0xd2b, 0xd7c, 0xd35, 0xd3e,
-0xd7c, 0xd26, 0xd3f, 0xd7b, 0x3b, 0xd13, 0xd7c, 0xd21, 0xd3f, 0xd2c, 0xd46, 0xd39, 0xd46, 0xd37, 0xd4d, 0x200c, 0xd31, 0xd4d, 0xd31, 0xd4d,
-0x3b, 0xd16, 0xd4b, 0xd7c, 0xd26, 0xd3e, 0xd26, 0xd4d, 0x3b, 0xd1f, 0xd3f, 0xd7c, 0x3b, 0xd2e, 0xd4b, 0xd7c, 0xd26, 0xd3e, 0xd26, 0xd4d,
-0x3b, 0xd37, 0xd39, 0xd4d, 0x200c, 0xd30, 0xd3f, 0xd35, 0xd3e, 0xd7c, 0x3b, 0xd2e, 0xd46, 0xd39, 0xd7c, 0x3b, 0xd05, 0xd2c, 0xd3e, 0xd7b,
-0x3b, 0xd05, 0xd38, 0xd7c, 0x3b, 0xd21, 0xd46, 0xd2f, 0xd4d, 0x3b, 0xd2c, 0xd39, 0xd4d, 0x200c, 0xd2e, 0xd3e, 0xd7b, 0x3b, 0xd0e, 0xd38,
-0xd4d, 0x200c, 0xd2b, 0xd3e, 0xd7b, 0xd21, 0xd4d, 0xd2b, 0x2e, 0x3b, 0xd13, 0x2e, 0x3b, 0xd16, 0xd4b, 0x3b, 0xd1f, 0xd3f, 0x2e, 0x3b,
-0xd2e, 0xd4b, 0x2e, 0x3b, 0xd37, 0x2e, 0x3b, 0xd2e, 0xd46, 0x2e, 0x3b, 0xd05, 0x2e, 0x3b, 0xd05, 0x2e, 0x3b, 0xd21, 0xd46, 0x2e,
-0x3b, 0xd2c, 0x2e, 0x3b, 0xd0e, 0x2e, 0x92b, 0x930, 0x935, 0x930, 0x926, 0x93f, 0x928, 0x3b, 0x913, 0x930, 0x94d, 0x926, 0x93f, 0x92c,
-0x947, 0x939, 0x947, 0x936, 0x94d, 0x924, 0x3b, 0x916, 0x94b, 0x930, 0x926, 0x93e, 0x926, 0x3b, 0x924, 0x93f, 0x930, 0x3b, 0x92e, 0x94b,
-0x930, 0x926, 0x93e, 0x926, 0x3b, 0x936, 0x93e, 0x939, 0x930, 0x940, 0x935, 0x93e, 0x930, 0x3b, 0x92e, 0x947, 0x939, 0x947, 0x930, 0x3b,
-0x905, 0x92c, 0x93e, 0x928, 0x3b, 0x905, 0x91d, 0x93e, 0x930, 0x3b, 0x926, 0x947, 0x3b, 0x92c, 0x93e, 0x939, 0x92e, 0x93e, 0x928, 0x3b,
-0x90f, 0x938, 0x92b, 0x93e, 0x902, 0x926, 0x967, 0x3b, 0x968, 0x3b, 0x969, 0x3b, 0x96a, 0x3b, 0x96b, 0x3b, 0x96c, 0x3b, 0x96d, 0x3b,
-0x96e, 0x3b, 0x96f, 0x3b, 0x967, 0x966, 0x3b, 0x967, 0x967, 0x3b, 0x967, 0x968, 0x648, 0x631, 0x6cc, 0x3b, 0x63a, 0x648, 0x6cc, 0x6cc,
-0x3b, 0x63a, 0x628, 0x631, 0x6af, 0x648, 0x644, 0x6cc, 0x3b, 0x686, 0x646, 0x6af, 0x627, 0x69a, 0x3b, 0x632, 0x645, 0x631, 0x6cc, 0x3b,
-0x648, 0x696, 0x6cc, 0x3b, 0x62a, 0x644, 0x647, 0x3b, 0x644, 0x693, 0x645, 0x3b, 0x644, 0x6cc, 0x646, 0x62f, 0x6cd, 0x3b, 0x645, 0x631,
-0x63a, 0x648, 0x645, 0x6cc, 0x3b, 0x633, 0x644, 0x648, 0x627, 0x63a, 0x647, 0x3b, 0x6a9, 0x628, 0x6f1, 0x3b, 0x6f2, 0x3b, 0x6f3, 0x3b,
-0x6f4, 0x3b, 0x6f5, 0x3b, 0x6f6, 0x3b, 0x6f7, 0x3b, 0x6f8, 0x3b, 0x6f9, 0x3b, 0x6f1, 0x6f0, 0x3b, 0x6f1, 0x6f1, 0x3b, 0x6f1, 0x6f2,
-0x641, 0x631, 0x648, 0x631, 0x62f, 0x6cc, 0x646, 0x3b, 0x627, 0x631, 0x62f, 0x6cc, 0x628, 0x647, 0x634, 0x62a, 0x3b, 0x62e, 0x631, 0x62f,
-0x627, 0x62f, 0x3b, 0x62a, 0x6cc, 0x631, 0x3b, 0x645, 0x631, 0x62f, 0x627, 0x62f, 0x3b, 0x634, 0x647, 0x631, 0x6cc, 0x648, 0x631, 0x3b,
-0x645, 0x647, 0x631, 0x3b, 0x622, 0x628, 0x627, 0x646, 0x3b, 0x622, 0x630, 0x631, 0x3b, 0x62f, 0x6cc, 0x3b, 0x628, 0x647, 0x645, 0x646,
-0x3b, 0x627, 0x633, 0x641, 0x646, 0x62f, 0x641, 0x3b, 0x627, 0x3b, 0x62e, 0x3b, 0x62a, 0x3b, 0x645, 0x3b, 0x634, 0x3b, 0x645, 0x3b,
-0x622, 0x3b, 0x622, 0x3b, 0x62f, 0x3b, 0x628, 0x3b, 0x627, 0x62d, 0x645, 0x644, 0x3b, 0x62b, 0x648, 0x631, 0x3b, 0x62c, 0x648, 0x632,
-0x627, 0x3b, 0x633, 0x631, 0x637, 0x627, 0x646, 0x3b, 0x627, 0x633, 0x62f, 0x3b, 0x633, 0x646, 0x628, 0x644, 0x647, 0x654, 0x3b, 0x645,
-0x6cc, 0x632, 0x627, 0x646, 0x3b, 0x639, 0x642, 0x631, 0x628, 0x3b, 0x642, 0x648, 0x633, 0x3b, 0x62c, 0x62f, 0x6cc, 0x3b, 0x62f, 0x644,
-0x648, 0x3b, 0x62d, 0x648, 0x62a, 0x62d, 0x3b, 0x62b, 0x3b, 0x62c, 0x3b, 0x633, 0x3b, 0x627, 0x3b, 0x633, 0x3b, 0x645, 0x3b, 0x639,
-0x3b, 0x642, 0x3b, 0x62c, 0x3b, 0x62f, 0x3b, 0x62d, 0x46, 0x61, 0x72, 0x77, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x3b, 0x4f, 0x72,
-0x64, 0x69, 0x62, 0x65, 0x68, 0x65, 0x73, 0x7a, 0x74, 0x3b, 0x43, 0x68, 0x6f, 0x72, 0x64, 0x101, 0x64, 0x3b, 0x54, 0x69,
-0x72, 0x3b, 0x4d, 0x6f, 0x72, 0x64, 0x101, 0x64, 0x3b, 0x53, 0x7a, 0x61, 0x68, 0x72, 0x69, 0x77, 0x61, 0x72, 0x3b, 0x4d,
-0x65, 0x68, 0x72, 0x3b, 0x100, 0x62, 0x101, 0x6e, 0x3b, 0x100, 0x73, 0x61, 0x72, 0x3b, 0x44, 0xe9, 0x69, 0x3b, 0x42, 0x61,
-0x68, 0x6d, 0x61, 0x6e, 0x3b, 0x45, 0x73, 0x66, 0x61, 0x6e, 0x64, 0xa2b, 0xa3e, 0xa30, 0xa35, 0xa30, 0xa21, 0xa40, 0xa28, 0x3b,
-0xa14, 0xa30, 0xa21, 0xa3e, 0xa08, 0xa2c, 0xa39, 0xa48, 0xa38, 0xa3c, 0xa1f, 0x3b, 0xa16, 0xa4b, 0xa21, 0xa30, 0xa21, 0x3b, 0xa1f, 0xa3f,
-0xa30, 0x3b, 0xa2e, 0xa4b, 0xa30, 0xa21, 0xa3e, 0xa26, 0x3b, 0xa38, 0xa3c, 0xa30, 0xa3e, 0xa07, 0xa35, 0xa30, 0x3b, 0xa2e, 0xa47, 0xa39,
-0xa30, 0x3b, 0xa05, 0xa2c, 0xa3e, 0xa28, 0x3b, 0xa05, 0xa1c, 0xa3c, 0xa3e, 0xa30, 0x3b, 0xa21, 0xa47, 0xa05, 0x3b, 0xa2c, 0xa3e, 0xa39,
-0xa2e, 0xa28, 0x3b, 0xa10, 0xa38, 0xa2b, 0xa70, 0xa21, 0x46, 0x61, 0x72, 0x76, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x3b, 0x4f, 0x72,
-0x64, 0x69, 0x62, 0x65, 0x68, 0x65, 0x73, 0x68, 0x74, 0x3b, 0x4b, 0x68, 0x6f, 0x72, 0x64, 0x61, 0x64, 0x3b, 0x54, 0x69,
-0x72, 0x3b, 0x41, 0x2d, 0x4d, 0x6f, 0x72, 0x64, 0x61, 0x64, 0x3b, 0x53, 0x68, 0x61, 0x68, 0x72, 0x69, 0x76, 0x61, 0x72,
-0x3b, 0x4d, 0x65, 0x68, 0x72, 0x3b, 0x41, 0x62, 0x61, 0x6e, 0x3b, 0x41, 0x7a, 0x61, 0x72, 0x3b, 0x44, 0x65, 0x79, 0x3b,
-0x42, 0x61, 0x68, 0x6d, 0x61, 0x6e, 0x3b, 0x45, 0x73, 0x66, 0x61, 0x6e, 0x64, 0x444, 0x430, 0x440, 0x432, 0x430, 0x440, 0x434,
-0x438, 0x43d, 0x3b, 0x43e, 0x440, 0x434, 0x438, 0x431, 0x435, 0x445, 0x435, 0x448, 0x442, 0x3b, 0x445, 0x43e, 0x440, 0x434, 0x430, 0x434,
-0x3b, 0x442, 0x438, 0x440, 0x3b, 0x43c, 0x43e, 0x440, 0x434, 0x430, 0x434, 0x3b, 0x448, 0x430, 0x445, 0x440, 0x438, 0x432, 0x435, 0x440,
-0x3b, 0x43c, 0x435, 0x445, 0x440, 0x3b, 0x430, 0x431, 0x430, 0x43d, 0x3b, 0x430, 0x437, 0x435, 0x440, 0x3b, 0x434, 0x435, 0x439, 0x3b,
-0x431, 0x430, 0x445, 0x43c, 0x430, 0x43d, 0x3b, 0x44d, 0x441, 0x444, 0x430, 0x43d, 0x434, 0x66, 0x61, 0x72, 0x2e, 0x3b, 0x6f, 0x72,
-0x64, 0x2e, 0x3b, 0x6b, 0x68, 0x6f, 0x2e, 0x3b, 0x74, 0x69, 0x72, 0x3b, 0x6d, 0x6f, 0x72, 0x2e, 0x3b, 0x73, 0x68, 0x61,
-0x2e, 0x3b, 0x6d, 0x65, 0x68, 0x72, 0x3b, 0x61, 0x62, 0x61, 0x6e, 0x3b, 0x61, 0x7a, 0x61, 0x72, 0x3b, 0x64, 0x65, 0x79,
-0x3b, 0x62, 0x61, 0x68, 0x2e, 0x3b, 0x65, 0x73, 0x66, 0x2e, 0x46, 0x61, 0x72, 0x61, 0x76, 0x61, 0x64, 0x69, 0x6e, 0x3b,
-0x4f, 0x72, 0x64, 0x69, 0x62, 0x65, 0x68, 0x65, 0x161, 0x74, 0x3b, 0x4b, 0x6f, 0x72, 0x64, 0x61, 0x64, 0x3b, 0x54, 0x69,
-0x72, 0x3b, 0x4d, 0x6f, 0x72, 0x64, 0x61, 0x64, 0x3b, 0x160, 0x61, 0x68, 0x72, 0x69, 0x76, 0x61, 0x72, 0x3b, 0x4d, 0x65,
-0x68, 0x72, 0x3b, 0x41, 0x62, 0x61, 0x6e, 0x3b, 0x41, 0x7a, 0x61, 0x72, 0x3b, 0x44, 0x65, 0x6a, 0x3b, 0x42, 0x61, 0x68,
-0x6d, 0x61, 0x6e, 0x3b, 0x45, 0x73, 0x66, 0x61, 0x6e, 0x64, 0x4a, 0x61, 0x6e, 0x61, 0x61, 0x79, 0x6f, 0x3b, 0x46, 0x65,
-0x65, 0x62, 0x72, 0x61, 0x61, 0x79, 0x6f, 0x3b, 0x4d, 0x61, 0x61, 0x72, 0x73, 0x6f, 0x3b, 0x41, 0x62, 0x72, 0x69, 0x6c,
-0x3b, 0x4d, 0x61, 0x61, 0x79, 0x6f, 0x3b, 0x4a, 0x75, 0x75, 0x6e, 0x3b, 0x4c, 0x75, 0x75, 0x6c, 0x69, 0x79, 0x6f, 0x3b,
-0x41, 0x67, 0x6f, 0x6f, 0x73, 0x74, 0x6f, 0x3b, 0x53, 0x61, 0x62, 0x74, 0x65, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x3b, 0x4f,
-0x6b, 0x74, 0x6f, 0x6f, 0x62, 0x61, 0x72, 0x3b, 0x4e, 0x6f, 0x6f, 0x66, 0x65, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x3b, 0x44,
-0x69, 0x69, 0x73, 0x65, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x46, 0x61, 0x72, 0x76, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x3b, 0x4f,
-0x72, 0x64, 0x69, 0x62, 0x65, 0x68, 0x65, 0x73, 0x68, 0x74, 0x3b, 0x4b, 0x68, 0x6f, 0x72, 0x64, 0x101, 0x64, 0x3b, 0x54,
-0x69, 0x72, 0x3b, 0x4d, 0x6f, 0x72, 0x64, 0x101, 0x64, 0x3b, 0x53, 0x68, 0x61, 0x68, 0x72, 0x69, 0x76, 0x61, 0x72, 0x3b,
-0x4d, 0x65, 0x68, 0x72, 0x3b, 0x100, 0x62, 0x101, 0x6e, 0x3b, 0x100, 0x7a, 0x61, 0x72, 0x3b, 0x44, 0x65, 0x79, 0x3b, 0x42,
-0x61, 0x68, 0x6d, 0x61, 0x6e, 0x3b, 0x45, 0x73, 0x66, 0x61, 0x6e, 0x64, 0x66, 0x61, 0x72, 0x76, 0x61, 0x72, 0x64, 0x69,
-0x6e, 0x3b, 0x6f, 0x72, 0x64, 0x69, 0x62, 0x65, 0x68, 0x65, 0x73, 0x68, 0x74, 0x3b, 0x6b, 0x68, 0x6f, 0x72, 0x64, 0x101,
-0x64, 0x3b, 0x74, 0x69, 0x72, 0x3b, 0x6d, 0x6f, 0x72, 0x64, 0x101, 0x64, 0x3b, 0x73, 0x68, 0x61, 0x68, 0x72, 0x69, 0x76,
-0x61, 0x72, 0x3b, 0x6d, 0x65, 0x68, 0x72, 0x3b, 0x101, 0x62, 0x101, 0x6e, 0x3b, 0x101, 0x7a, 0x61, 0x72, 0x3b, 0x64, 0x65,
-0x79, 0x3b, 0x62, 0x61, 0x68, 0x6d, 0x61, 0x6e, 0x3b, 0x65, 0x73, 0x66, 0x61, 0x6e, 0x64, 0x444, 0x430, 0x440, 0x432, 0x430,
-0x440, 0x434, 0x438, 0x43d, 0x3b, 0x443, 0x440, 0x434, 0x438, 0x431, 0x438, 0x4b3, 0x438, 0x448, 0x442, 0x3b, 0x445, 0x443, 0x440, 0x434,
-0x43e, 0x434, 0x3b, 0x442, 0x438, 0x440, 0x3b, 0x43c, 0x443, 0x440, 0x434, 0x43e, 0x434, 0x3b, 0x448, 0x430, 0x4b3, 0x440, 0x438, 0x432,
-0x430, 0x440, 0x3b, 0x43c, 0x435, 0x4b3, 0x440, 0x3b, 0x43e, 0x431, 0x43e, 0x43d, 0x3b, 0x43e, 0x437, 0x430, 0x440, 0x3b, 0x434, 0x435,
-0x439, 0x3b, 0x431, 0x430, 0x4b3, 0x43c, 0x430, 0x43d, 0x3b, 0x438, 0x441, 0x444, 0x430, 0x43d, 0x434, 0xb83, 0xbaa, 0xbb0, 0xbcd, 0xbb5,
-0xbbe, 0xba4, 0xbbf, 0xba9, 0xbcd, 0x3b, 0xb86, 0xbb0, 0xbcd, 0xb9f, 0xbbf, 0xbaa, 0xbc6, 0xbb9, 0xbc6, 0xbb7, 0xbcd, 0xba4, 0xbcd, 0x3b,
-0xb95, 0xbca, 0xbb0, 0xbcd, 0xba4, 0xbbe, 0xba4, 0xbcd, 0x3b, 0xba4, 0xbbf, 0xbb0, 0xbcd, 0x3b, 0xbae, 0xbca, 0xbb0, 0xbcd, 0xba4, 0xbbe,
-0xba4, 0xbcd, 0x3b, 0xbb7, 0xbbe, 0xbb0, 0xbbf, 0xbb5, 0xbbe, 0xbb0, 0xbcd, 0x3b, 0xbae, 0xbc6, 0xbb9, 0xbcd, 0xbb0, 0xbcd, 0x3b, 0xb85,
-0xbaa, 0xbbe, 0xba9, 0xbcd, 0x3b, 0xb85, 0xb9a, 0xbbe, 0xbb0, 0xbcd, 0x3b, 0xba4, 0xbc7, 0x3b, 0xbaa, 0xbb9, 0xbcd, 0xbae, 0xbbe, 0xba9,
-0xbcd, 0x3b, 0xb8e, 0xb83, 0xbaa, 0xbbe, 0xba9, 0xbcd, 0xb83, 0xbaa, 0xbb0, 0xbcd, 0x2e, 0x3b, 0xb86, 0xbb0, 0xbcd, 0xb9f, 0xbbf, 0x2e,
-0x3b, 0xb95, 0xbca, 0xbb0, 0xbcd, 0x2e, 0x3b, 0xba4, 0xbbf, 0xbb0, 0xbcd, 0x3b, 0xbae, 0xbca, 0xbb0, 0xbcd, 0x2e, 0x3b, 0xbb7, 0xbbe,
-0xbb0, 0xbbf, 0x2e, 0x3b, 0xbae, 0xbc6, 0xbb9, 0xbcd, 0x2e, 0x3b, 0xb85, 0xbaa, 0xbbe, 0x2e, 0x3b, 0xb85, 0xb9a, 0xbbe, 0x2e, 0x3b,
-0xba4, 0xbc7, 0x3b, 0xbaa, 0xbb9, 0xbcd, 0x2e, 0x3b, 0xb8e, 0xb83, 0x2e, 0xc2b, 0xc3e, 0xc35, 0xc30, 0xc4d, 0xc21, 0xc3f, 0xc28, 0xc4d,
-0x3b, 0xc0a, 0xc21, 0xc3e, 0xc2c, 0xc39, 0xc37, 0xc4d, 0xc1f, 0xc4d, 0x3b, 0xc16, 0xc4b, 0xc30, 0xc4d, 0xc21, 0xc3e, 0xc21, 0xc4d, 0x3b,
-0xc1f, 0xc3f, 0xc30, 0xc4d, 0x3b, 0xc2e, 0xc46, 0xc30, 0xc4d, 0xc21, 0xc3e, 0xc21, 0xc4d, 0x3b, 0xc36, 0xc36, 0xc3f, 0xc35, 0xc30, 0xc4d,
-0x3b, 0xc2e, 0xc46, 0xc39, 0xc30, 0xc4d, 0x3b, 0xc05, 0xc2c, 0xc28, 0xc4d, 0x3b, 0xc05, 0xc1c, 0xc30, 0xc4d, 0x3b, 0xc21, 0xc47, 0x3b,
-0xc2c, 0xc3e, 0xc39, 0xc4d, 0x200c, 0xc2e, 0xc3e, 0xc28, 0xc4d, 0x3b, 0xc0e, 0xc38, 0xc4d, 0x200c, 0xc2b, 0xc3e, 0xc02, 0xc21, 0xc4d, 0xe1f,
-0xe32, 0xe23, 0xe4c, 0xe27, 0xe32, 0xe23, 0xe4c, 0xe14, 0xe34, 0xe19, 0x3b, 0xe2d, 0xe2d, 0xe23, 0xe4c, 0xe14, 0xe34, 0xe40, 0xe1a, 0xe40,
-0xe2e, 0xe0a, 0xe15, 0xe4c, 0x3b, 0xe04, 0xe2d, 0xe23, 0xe4c, 0xe41, 0xe14, 0xe14, 0x3b, 0xe40, 0xe15, 0xe2d, 0xe23, 0xe4c, 0x3b, 0xe21,
-0xe2d, 0xe23, 0xe4c, 0xe41, 0xe14, 0xe14, 0x3b, 0xe0a, 0xe32, 0xe2b, 0xe23, 0xe34, 0xe27, 0xe32, 0xe23, 0xe4c, 0x3b, 0xe40, 0xe21, 0xe2e,
-0xe23, 0xe4c, 0x3b, 0xe2d, 0xe30, 0xe1a, 0xe32, 0xe19, 0x3b, 0xe2d, 0xe30, 0xe0b, 0xe32, 0xe23, 0xe4c, 0x3b, 0xe40, 0xe14, 0xe22, 0xe4c,
-0x3b, 0xe1a, 0xe32, 0xe2e, 0xe4c, 0xe21, 0xe32, 0xe19, 0x3b, 0xe40, 0xe2d, 0xe2a, 0xe1f, 0xe32, 0xe19, 0xe14, 0xe4c, 0x46, 0x65, 0x72,
-0x76, 0x65, 0x72, 0x64, 0x69, 0x6e, 0x3b, 0x4f, 0x72, 0x64, 0x69, 0x62, 0x65, 0x68, 0x65, 0x15f, 0x74, 0x3b, 0x48, 0x6f,
-0x72, 0x64, 0x61, 0x64, 0x3b, 0x54, 0x69, 0x72, 0x3b, 0x4d, 0x6f, 0x72, 0x64, 0x61, 0x64, 0x3b, 0x15e, 0x65, 0x68, 0x72,
-0x69, 0x76, 0x65, 0x72, 0x3b, 0x4d, 0x65, 0x68, 0x72, 0x3b, 0x41, 0x62, 0x61, 0x6e, 0x3b, 0x41, 0x7a, 0x65, 0x72, 0x3b,
-0x44, 0x65, 0x79, 0x3b, 0x42, 0x65, 0x68, 0x6d, 0x65, 0x6e, 0x3b, 0x45, 0x73, 0x66, 0x65, 0x6e, 0x64, 0x444, 0x430, 0x440,
-0x432, 0x430, 0x440, 0x434, 0x456, 0x43d, 0x3b, 0x43e, 0x440, 0x434, 0x456, 0x431, 0x435, 0x445, 0x435, 0x448, 0x442, 0x3b, 0x445, 0x43e,
-0x440, 0x434, 0x430, 0x434, 0x3b, 0x442, 0x456, 0x440, 0x3b, 0x43c, 0x43e, 0x440, 0x434, 0x430, 0x434, 0x3b, 0x448, 0x430, 0x445, 0x440,
-0x456, 0x432, 0x435, 0x440, 0x3b, 0x43c, 0x435, 0x445, 0x440, 0x3b, 0x430, 0x431, 0x430, 0x43d, 0x3b, 0x430, 0x437, 0x435, 0x440, 0x3b,
-0x434, 0x435, 0x439, 0x3b, 0x431, 0x430, 0x445, 0x43c, 0x430, 0x43d, 0x3b, 0x435, 0x441, 0x444, 0x430, 0x43d, 0x434, 0x444, 0x430, 0x440,
-0x3b, 0x43e, 0x440, 0x434, 0x3b, 0x445, 0x43e, 0x440, 0x3b, 0x442, 0x456, 0x440, 0x3b, 0x43c, 0x43e, 0x440, 0x3b, 0x448, 0x430, 0x445,
-0x3b, 0x43c, 0x435, 0x445, 0x3b, 0x430, 0x431, 0x430, 0x43d, 0x3b, 0x430, 0x437, 0x435, 0x440, 0x3b, 0x434, 0x435, 0x439, 0x3b, 0x431,
-0x430, 0x445, 0x3b, 0x435, 0x441, 0x444, 0x444, 0x430, 0x440, 0x2e, 0x3b, 0x43e, 0x440, 0x434, 0x2e, 0x3b, 0x445, 0x43e, 0x440, 0x2e,
-0x3b, 0x442, 0x456, 0x440, 0x3b, 0x43c, 0x43e, 0x440, 0x2e, 0x3b, 0x448, 0x430, 0x445, 0x2e, 0x3b, 0x43c, 0x435, 0x445, 0x2e, 0x3b,
-0x430, 0x431, 0x430, 0x43d, 0x3b, 0x430, 0x437, 0x435, 0x440, 0x3b, 0x434, 0x435, 0x439, 0x3b, 0x431, 0x430, 0x445, 0x2e, 0x3b, 0x435,
-0x441, 0x444, 0x2e, 0x641, 0x631, 0x648, 0x631, 0x62f, 0x646, 0x3b, 0x622, 0x631, 0x688, 0x628, 0x627, 0x626, 0x634, 0x3b, 0x62e, 0x62f,
-0x627, 0x62f, 0x627, 0x62f, 0x3b, 0x62a, 0x6cc, 0x631, 0x3b, 0x645, 0x631, 0x62f, 0x627, 0x62f, 0x3b, 0x634, 0x6c1, 0x631, 0x6cc, 0x648,
-0x627, 0x631, 0x3b, 0x645, 0x6c1, 0x631, 0x3b, 0x627, 0x628, 0x627, 0x646, 0x3b, 0x622, 0x632, 0x631, 0x3b, 0x688, 0x6d2, 0x3b, 0x628,
-0x6c1, 0x645, 0x646, 0x3b, 0x627, 0x633, 0x641, 0x646, 0x62f
+static constexpr char16_t months_data[] = {
+0x46, 0x61, 0x72, 0x76, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x3b, 0x4f, 0x72,
+0x64, 0x69, 0x62, 0x65, 0x68, 0x65, 0x73, 0x68, 0x74, 0x3b, 0x4b, 0x68,
+0x6f, 0x72, 0x64, 0x61, 0x64, 0x3b, 0x54, 0x69, 0x72, 0x3b, 0x4d, 0x6f,
+0x72, 0x64, 0x61, 0x64, 0x3b, 0x53, 0x68, 0x61, 0x68, 0x72, 0x69, 0x76,
+0x61, 0x72, 0x3b, 0x4d, 0x65, 0x68, 0x72, 0x3b, 0x41, 0x62, 0x61, 0x6e,
+0x3b, 0x41, 0x7a, 0x61, 0x72, 0x3b, 0x44, 0x65, 0x79, 0x3b, 0x42, 0x61,
+0x68, 0x6d, 0x61, 0x6e, 0x3b, 0x45, 0x73, 0x66, 0x61, 0x6e, 0x64, 0x46,
+0x61, 0x72, 0x3b, 0x4f, 0x72, 0x64, 0x3b, 0x4b, 0x68, 0x6f, 0x3b, 0x54,
+0x69, 0x72, 0x3b, 0x4d, 0x6f, 0x72, 0x3b, 0x53, 0x68, 0x61, 0x3b, 0x4d,
+0x65, 0x68, 0x3b, 0x41, 0x62, 0x61, 0x3b, 0x41, 0x7a, 0x61, 0x3b, 0x44,
+0x65, 0x79, 0x3b, 0x42, 0x61, 0x68, 0x3b, 0x45, 0x73, 0x66, 0x46, 0x3b,
+0x4f, 0x3b, 0x4b, 0x3b, 0x54, 0x3b, 0x4d, 0x3b, 0x53, 0x3b, 0x4d, 0x3b,
+0x41, 0x3b, 0x41, 0x3b, 0x44, 0x3b, 0x42, 0x3b, 0x45, 0x31, 0x3b, 0x32,
+0x3b, 0x33, 0x3b, 0x34, 0x3b, 0x35, 0x3b, 0x36, 0x3b, 0x37, 0x3b, 0x38,
+0x3b, 0x39, 0x3b, 0x31, 0x30, 0x3b, 0x31, 0x31, 0x3b, 0x31, 0x32, 0x641,
+0x631, 0x641, 0x631, 0x62f, 0x646, 0x3b, 0x623, 0x630, 0x631, 0x628, 0x64a, 0x647,
+0x634, 0x62a, 0x3b, 0x62e, 0x631, 0x62f, 0x627, 0x62f, 0x3b, 0x62a, 0x627, 0x631,
+0x3b, 0x645, 0x631, 0x62f, 0x627, 0x62f, 0x3b, 0x634, 0x647, 0x631, 0x641, 0x627,
+0x631, 0x3b, 0x645, 0x647, 0x631, 0x3b, 0x622, 0x64a, 0x627, 0x646, 0x3b, 0x622,
+0x630, 0x631, 0x3b, 0x62f, 0x64a, 0x3b, 0x628, 0x647, 0x645, 0x646, 0x3b, 0x627,
+0x633, 0x641, 0x646, 0x62f, 0x627, 0x631, 0x66, 0x259, 0x72, 0x76, 0x259, 0x72,
+0x64, 0x69, 0x6e, 0x3b, 0x6f, 0x72, 0x64, 0x69, 0x62, 0x65, 0x68, 0x65,
+0x15f, 0x74, 0x3b, 0x78, 0x6f, 0x72, 0x64, 0x259, 0x64, 0x3b, 0x74, 0x69,
+0x72, 0x3b, 0x6d, 0x6f, 0x72, 0x64, 0x259, 0x64, 0x3b, 0x15f, 0x259, 0x68,
+0x72, 0x69, 0x76, 0x61, 0x72, 0x3b, 0x6d, 0x65, 0x68, 0x72, 0x3b, 0x61,
+0x62, 0x259, 0x6e, 0x3b, 0x61, 0x7a, 0x259, 0x72, 0x3b, 0x64, 0x65, 0x79,
+0x3b, 0x62, 0x259, 0x68, 0x6d, 0x259, 0x6e, 0x3b, 0x69, 0x73, 0x66, 0x259,
+0x6e, 0x64, 0x9ab, 0x9cd, 0x9af, 0x9be, 0x9ad, 0x9be, 0x9b0, 0x9cd, 0x9a1, 0x9bf,
+0x9a8, 0x3b, 0x985, 0x9b0, 0x9a1, 0x9bf, 0x9ac, 0x9c7, 0x9b9, 0x9c7, 0x9b6, 0x9cd,
+0x9a4, 0x3b, 0x996, 0x9cb, 0x9b0, 0x9cd, 0x9a6, 0x9cd, 0x9a6, 0x3b, 0x9a4, 0x9c0,
+0x9b0, 0x3b, 0x9ae, 0x9b0, 0x9cd, 0x9af, 0x9be, 0x9a6, 0x3b, 0x9b6, 0x9be, 0x9b9,
+0x9b0, 0x9bf, 0x9ac, 0x9be, 0x9b0, 0x3b, 0x9ae, 0x9c7, 0x9b9, 0x9c7, 0x9b0, 0x3b,
+0x986, 0x9ac, 0x9be, 0x9a8, 0x3b, 0x9ac, 0x9be, 0x99c, 0x9be, 0x9b0, 0x3b, 0x9a6,
+0x9c7, 0x3b, 0x9ac, 0x9be, 0x9b9, 0x9ae, 0x9be, 0x9a8, 0x3b, 0x98f, 0x9b8, 0x9ab,
+0x9cd, 0x9af, 0x9be, 0x9a8, 0x9cd, 0x9a1, 0x9ab, 0x9cd, 0x9af, 0x9be, 0x9ad, 0x9be,
+0x9b0, 0x9cd, 0x9a1, 0x9bf, 0x9a8, 0x3b, 0x985, 0x9b0, 0x9a1, 0x9bf, 0x9ac, 0x9c7,
+0x9b9, 0x9c7, 0x9b6, 0x9cd, 0x9a4, 0x3b, 0x996, 0x9cb, 0x9b0, 0x9cd, 0x9a6, 0x9cd,
+0x9a6, 0x3b, 0x9a4, 0x9c0, 0x9b0, 0x3b, 0x9ae, 0x9b0, 0x9cd, 0x9af, 0x9be, 0x9a6,
+0x3b, 0x9b6, 0x9be, 0x9b9, 0x9b0, 0x9bf, 0x9ac, 0x9be, 0x9b0, 0x3b, 0x9ae, 0x9c7,
+0x9b9, 0x9c7, 0x9b0, 0x3b, 0x986, 0x9ac, 0x9be, 0x9a8, 0x3b, 0x986, 0x99c, 0x9be,
+0x9b0, 0x3b, 0x9a6, 0x9c7, 0x3b, 0x9ac, 0x9be, 0x9b9, 0x9ae, 0x9be, 0x9a8, 0x3b,
+0x98f, 0x9b8, 0x9ab, 0x9cd, 0x9af, 0x9be, 0x9a8, 0x9cd, 0x9a1, 0x9e7, 0x3b, 0x9e8,
+0x3b, 0x9e9, 0x3b, 0x9ea, 0x3b, 0x9eb, 0x3b, 0x9ec, 0x3b, 0x9ed, 0x3b, 0x9ee,
+0x3b, 0x9ef, 0x3b, 0x9e7, 0x9e6, 0x3b, 0x9e7, 0x9e7, 0x3b, 0x9e7, 0x9e8, 0x424,
+0x430, 0x440, 0x430, 0x432, 0x430, 0x434, 0x438, 0x43d, 0x3b, 0x41e, 0x440, 0x434,
+0x438, 0x431, 0x435, 0x445, 0x435, 0x448, 0x442, 0x3b, 0x41a, 0x43e, 0x440, 0x434,
+0x430, 0x434, 0x3b, 0x422, 0x438, 0x440, 0x3b, 0x41c, 0x43e, 0x440, 0x434, 0x430,
+0x434, 0x3b, 0x428, 0x430, 0x445, 0x440, 0x438, 0x432, 0x430, 0x440, 0x3b, 0x41c,
+0x435, 0x445, 0x440, 0x3b, 0x410, 0x431, 0x430, 0x43d, 0x3b, 0x410, 0x437, 0x430,
+0x440, 0x3b, 0x414, 0x435, 0x458, 0x3b, 0x411, 0x430, 0x445, 0x43c, 0x430, 0x43d,
+0x3b, 0x415, 0x441, 0x444, 0x430, 0x43d, 0x434, 0x31, 0x6708, 0x3b, 0x32, 0x6708,
+0x3b, 0x33, 0x6708, 0x3b, 0x34, 0x6708, 0x3b, 0x35, 0x6708, 0x3b, 0x36, 0x6708,
+0x3b, 0x37, 0x6708, 0x3b, 0x38, 0x6708, 0x3b, 0x39, 0x6708, 0x3b, 0x31, 0x30,
+0x6708, 0x3b, 0x31, 0x31, 0x6708, 0x3b, 0x31, 0x32, 0x6708, 0x62e, 0x627, 0x6a9,
+0x6d5, 0x644, 0x6ce, 0x648, 0x6d5, 0x3b, 0x628, 0x627, 0x646, 0x6d5, 0x645, 0x6d5,
+0x695, 0x3b, 0x62c, 0x6c6, 0x632, 0x6d5, 0x631, 0x62f, 0x627, 0x646, 0x3b, 0x67e,
+0x648, 0x648, 0x634, 0x67e, 0x6d5, 0x695, 0x3b, 0x6af, 0x6d5, 0x644, 0x627, 0x648,
+0x6ce, 0x698, 0x3b, 0x62e, 0x6d5, 0x631, 0x645, 0x627, 0x646, 0x627, 0x646, 0x3b,
+0x695, 0x6d5, 0x632, 0x628, 0x6d5, 0x631, 0x3b, 0x62e, 0x6d5, 0x632, 0x6d5, 0x6b5,
+0x648, 0x6d5, 0x631, 0x3b, 0x633, 0x6d5, 0x631, 0x645, 0x627, 0x648, 0x6d5, 0x632,
+0x3b, 0x628, 0x6d5, 0x641, 0x631, 0x627, 0x646, 0x628, 0x627, 0x631, 0x3b, 0x695,
+0x6ce, 0x628, 0x6d5, 0x646, 0x62f, 0x627, 0x646, 0x3b, 0x631, 0x6d5, 0x634, 0x6d5,
+0x645, 0x6ce, 0x62e, 0x627, 0x6a9, 0x6d5, 0x644, 0x6ce, 0x648, 0x6d5, 0x3b, 0x6af,
+0x648, 0x6b5, 0x627, 0x646, 0x3b, 0x62c, 0x6c6, 0x632, 0x6d5, 0x631, 0x62f, 0x627,
+0x646, 0x3b, 0x67e, 0x648, 0x648, 0x634, 0x67e, 0x6d5, 0x695, 0x3b, 0x6af, 0x6d5,
+0x644, 0x627, 0x648, 0x6ce, 0x698, 0x3b, 0x62e, 0x6d5, 0x631, 0x645, 0x627, 0x646,
+0x627, 0x646, 0x3b, 0x695, 0x6d5, 0x632, 0x628, 0x6d5, 0x631, 0x3b, 0x6af, 0x6d5,
+0x6b5, 0x627, 0x695, 0x6ce, 0x632, 0x627, 0x646, 0x3b, 0x633, 0x6d5, 0x631, 0x645,
+0x627, 0x648, 0x6d5, 0x632, 0x3b, 0x628, 0x6d5, 0x641, 0x631, 0x627, 0x646, 0x628,
+0x627, 0x631, 0x3b, 0x695, 0x6ce, 0x628, 0x6d5, 0x646, 0x62f, 0x627, 0x646, 0x3b,
+0x695, 0x6d5, 0x634, 0x6d5, 0x645, 0x6d5, 0x4e00, 0x6708, 0x3b, 0x4e8c, 0x6708, 0x3b,
+0x4e09, 0x6708, 0x3b, 0x56db, 0x6708, 0x3b, 0x4e94, 0x6708, 0x3b, 0x516d, 0x6708, 0x3b,
+0x4e03, 0x6708, 0x3b, 0x516b, 0x6708, 0x3b, 0x4e5d, 0x6708, 0x3b, 0x5341, 0x6708, 0x3b,
+0x5341, 0x4e00, 0x6708, 0x3b, 0x5341, 0x4e8c, 0x6708, 0x31, 0x2e, 0x3b, 0x32, 0x2e,
+0x3b, 0x33, 0x2e, 0x3b, 0x34, 0x2e, 0x3b, 0x35, 0x2e, 0x3b, 0x36, 0x2e,
+0x3b, 0x37, 0x2e, 0x3b, 0x38, 0x2e, 0x3b, 0x39, 0x2e, 0x3b, 0x31, 0x30,
+0x2e, 0x3b, 0x31, 0x31, 0x2e, 0x3b, 0x31, 0x32, 0x2e, 0x66, 0x61, 0x72,
+0x76, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x3b, 0x6f, 0x72, 0x64, 0x69, 0x62,
+0x65, 0x68, 0x65, 0x161, 0x74, 0x3b, 0x63, 0x68, 0x6f, 0x72, 0x64, 0xe1,
+0x64, 0x3b, 0x74, 0xed, 0x72, 0x3b, 0x6d, 0x6f, 0x72, 0x64, 0xe1, 0x64,
+0x3b, 0x161, 0x61, 0x68, 0x72, 0xed, 0x76, 0x61, 0x72, 0x3b, 0x6d, 0x65,
+0x68, 0x72, 0x3b, 0xe1, 0x62, 0xe1, 0x6e, 0x3b, 0xe1, 0x7a, 0x61, 0x72,
+0x3b, 0x64, 0x65, 0x69, 0x3b, 0x62, 0x61, 0x68, 0x6d, 0x61, 0x6e, 0x3b,
+0x65, 0x73, 0x66, 0x61, 0x6e, 0x64, 0x66, 0x61, 0x72, 0x76, 0x61, 0x72,
+0x64, 0x69, 0x6e, 0x3b, 0x6f, 0x72, 0x64, 0x69, 0x62, 0x65, 0x68, 0x65,
+0x73, 0x68, 0x74, 0x3b, 0x6b, 0x68, 0x6f, 0x72, 0x64, 0x61, 0x64, 0x3b,
+0x74, 0x69, 0x72, 0x3b, 0x6d, 0x6f, 0x72, 0x64, 0x61, 0x64, 0x3b, 0x73,
+0x68, 0x61, 0x68, 0x72, 0x69, 0x76, 0x61, 0x72, 0x3b, 0x6d, 0x65, 0x68,
+0x72, 0x3b, 0x61, 0x62, 0x61, 0x6e, 0x3b, 0x61, 0x7a, 0x61, 0x72, 0x3b,
+0x64, 0x65, 0x79, 0x3b, 0x62, 0x61, 0x68, 0x6d, 0x61, 0x6e, 0x3b, 0x65,
+0x73, 0x66, 0x61, 0x6e, 0x64, 0x64, 0x7a, 0x6f, 0x76, 0x65, 0x3b, 0x64,
+0x7a, 0x6f, 0x64, 0x7a, 0x65, 0x3b, 0x74, 0x65, 0x64, 0x6f, 0x78, 0x65,
+0x3b, 0x61, 0x66, 0x254, 0x66, 0x69, 0x1ebd, 0x3b, 0x64, 0x61, 0x6d, 0x25b,
+0x3b, 0x6d, 0x61, 0x73, 0x61, 0x3b, 0x73, 0x69, 0x61, 0x6d, 0x6c, 0x254,
+0x6d, 0x3b, 0x64, 0x65, 0x61, 0x73, 0x69, 0x61, 0x6d, 0x69, 0x6d, 0x65,
+0x3b, 0x61, 0x6e, 0x79, 0x254, 0x6e, 0x79, 0x254, 0x3b, 0x6b, 0x65, 0x6c,
+0x65, 0x3b, 0x61, 0x64, 0x65, 0x25b, 0x6d, 0x65, 0x6b, 0x70, 0x254, 0x78,
+0x65, 0x3b, 0x64, 0x7a, 0x6f, 0x6d, 0x65, 0x64, 0x7a, 0x76, 0x3b, 0x64,
+0x7a, 0x64, 0x3b, 0x74, 0x65, 0x64, 0x3b, 0x61, 0x66, 0x254, 0x3b, 0x64,
+0x61, 0x6d, 0x3b, 0x6d, 0x61, 0x73, 0x3b, 0x73, 0x69, 0x61, 0x3b, 0x64,
+0x65, 0x61, 0x3b, 0x61, 0x6e, 0x79, 0x3b, 0x6b, 0x65, 0x6c, 0x3b, 0x61,
+0x64, 0x65, 0x3b, 0x64, 0x7a, 0x6d, 0x66, 0x61, 0x72, 0x76, 0x61, 0x72,
+0x64, 0x69, 0x6e, 0x6b, 0x75, 0x75, 0x3b, 0x6f, 0x72, 0x64, 0x69, 0x62,
+0x65, 0x68, 0x65, 0x161, 0x74, 0x6b, 0x75, 0x75, 0x3b, 0x6b, 0x68, 0x6f,
+0x72, 0x64, 0x61, 0x64, 0x6b, 0x75, 0x75, 0x3b, 0x74, 0x69, 0x72, 0x6b,
+0x75, 0x75, 0x3b, 0x6d, 0x6f, 0x72, 0x64, 0x61, 0x64, 0x6b, 0x75, 0x75,
+0x3b, 0x161, 0x61, 0x68, 0x72, 0x69, 0x76, 0x61, 0x72, 0x6b, 0x75, 0x75,
+0x3b, 0x6d, 0x65, 0x68, 0x72, 0x6b, 0x75, 0x75, 0x3b, 0x61, 0x62, 0x61,
+0x6e, 0x6b, 0x75, 0x75, 0x3b, 0x61, 0x7a, 0x61, 0x72, 0x6b, 0x75, 0x75,
+0x3b, 0x64, 0x65, 0x79, 0x6b, 0x75, 0x75, 0x3b, 0x62, 0x61, 0x68, 0x6d,
+0x61, 0x6e, 0x6b, 0x75, 0x75, 0x3b, 0x65, 0x73, 0x66, 0x61, 0x6e, 0x64,
+0x6b, 0x75, 0x75, 0x66, 0x61, 0x72, 0x76, 0x61, 0x72, 0x64, 0x69, 0x6e,
+0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x6f, 0x72, 0x64, 0x69, 0x62, 0x65,
+0x68, 0x65, 0x161, 0x74, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x6b, 0x68,
+0x6f, 0x72, 0x64, 0x61, 0x64, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x74,
+0x69, 0x72, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x6d, 0x6f, 0x72, 0x64,
+0x61, 0x64, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x161, 0x61, 0x68, 0x72,
+0x69, 0x76, 0x61, 0x72, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x6d, 0x65,
+0x68, 0x72, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x61, 0x62, 0x61, 0x6e,
+0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x61, 0x7a, 0x61, 0x72, 0x6b, 0x75,
+0x75, 0x74, 0x61, 0x3b, 0x64, 0x65, 0x79, 0x6b, 0x75, 0x75, 0x74, 0x61,
+0x3b, 0x62, 0x61, 0x68, 0x6d, 0x61, 0x6e, 0x6b, 0x75, 0x75, 0x74, 0x61,
+0x3b, 0x65, 0x73, 0x66, 0x61, 0x6e, 0x64, 0x6b, 0x75, 0x75, 0x74, 0x61,
+0x66, 0x61, 0x72, 0x76, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x3b, 0x6f, 0x72,
+0x64, 0x69, 0x62, 0x65, 0x68, 0x65, 0x161, 0x74, 0x3b, 0x6b, 0x68, 0x6f,
+0x72, 0x64, 0x61, 0x64, 0x3b, 0x74, 0x69, 0x72, 0x3b, 0x6d, 0x6f, 0x72,
+0x64, 0x61, 0x64, 0x3b, 0x161, 0x61, 0x68, 0x72, 0x69, 0x76, 0x61, 0x72,
+0x3b, 0x6d, 0x65, 0x68, 0x72, 0x3b, 0x61, 0x62, 0x61, 0x6e, 0x3b, 0x61,
+0x7a, 0x61, 0x72, 0x3b, 0x64, 0x65, 0x79, 0x3b, 0x62, 0x61, 0x68, 0x6d,
+0x61, 0x6e, 0x3b, 0x65, 0x73, 0x66, 0x61, 0x6e, 0x64, 0x66, 0x61, 0x72,
+0x76, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x3b, 0x6f, 0x72, 0x64, 0x69, 0x62,
+0x65, 0x68, 0x65, 0x161, 0x74, 0x3b, 0x6b, 0x68, 0x6f, 0x72, 0x64, 0xe2,
+0x64, 0x3b, 0x74, 0x69, 0x72, 0x3b, 0x6d, 0x6f, 0x72, 0x64, 0xe2, 0x64,
+0x3b, 0x161, 0x61, 0x68, 0x72, 0x69, 0x76, 0x61, 0x72, 0x3b, 0x6d, 0x65,
+0x68, 0x72, 0x3b, 0xe2, 0x62, 0xe2, 0x6e, 0x3b, 0xe2, 0x7a, 0x61, 0x72,
+0x3b, 0x64, 0x65, 0x79, 0x3b, 0x62, 0x61, 0x68, 0x6d, 0x61, 0x6e, 0x3b,
+0x65, 0x73, 0x66, 0x61, 0x6e, 0x64, 0x66, 0x61, 0x72, 0x2e, 0x3b, 0x6f,
+0x72, 0x64, 0x2e, 0x3b, 0x6b, 0x68, 0x6f, 0x2e, 0x3b, 0x74, 0x69, 0x72,
+0x3b, 0x6d, 0x6f, 0x72, 0x2e, 0x3b, 0x161, 0x61, 0x68, 0x2e, 0x3b, 0x6d,
+0x65, 0x68, 0x72, 0x3b, 0xe2, 0x62, 0xe2, 0x6e, 0x3b, 0xe2, 0x7a, 0x61,
+0x72, 0x3b, 0x64, 0x65, 0x79, 0x3b, 0x62, 0x61, 0x68, 0x2e, 0x3b, 0x65,
+0x73, 0x66, 0x2e, 0x46, 0x61, 0x72, 0x76, 0x61, 0x72, 0x64, 0x69, 0x6e,
+0x3b, 0x4f, 0x72, 0x64, 0x69, 0x62, 0x65, 0x68, 0x65, 0x161, 0x74, 0x3b,
+0x4b, 0x68, 0x6f, 0x72, 0x64, 0xe2, 0x64, 0x3b, 0x54, 0x69, 0x72, 0x3b,
+0x4d, 0x6f, 0x72, 0x64, 0xe2, 0x64, 0x3b, 0x160, 0x61, 0x68, 0x72, 0x69,
+0x76, 0x61, 0x72, 0x3b, 0x4d, 0x65, 0x68, 0x72, 0x3b, 0xc2, 0x62, 0xe2,
+0x6e, 0x3b, 0xc2, 0x7a, 0x61, 0x72, 0x3b, 0x44, 0x65, 0x79, 0x3b, 0x42,
+0x61, 0x68, 0x6d, 0x61, 0x6e, 0x3b, 0x45, 0x73, 0x66, 0x61, 0x6e, 0x64,
+0x46, 0x61, 0x72, 0x2e, 0x3b, 0x4f, 0x72, 0x64, 0x2e, 0x3b, 0x4b, 0x68,
+0x6f, 0x2e, 0x3b, 0x54, 0x69, 0x72, 0x3b, 0x4d, 0x6f, 0x72, 0x2e, 0x3b,
+0x160, 0x61, 0x68, 0x2e, 0x3b, 0x4d, 0x65, 0x68, 0x72, 0x3b, 0xc2, 0x62,
+0xe2, 0x2e, 0x3b, 0xc2, 0x7a, 0x61, 0x72, 0x3b, 0x44, 0x65, 0x79, 0x3b,
+0x42, 0x61, 0x68, 0x2e, 0x3b, 0x45, 0x73, 0x66, 0x2e, 0xd83a, 0xdd0a, 0xd83a,
+0xdd22, 0xd83a, 0xdd2a, 0xd83a, 0xdd3e, 0xd83a, 0xdd22, 0xd83a, 0xdd2a, 0xd83a, 0xdd23, 0xd83a,
+0xdd2d, 0xd83a, 0xdd32, 0x3b, 0xd83a, 0xdd0c, 0xd83a, 0xdd2a, 0xd83a, 0xdd23, 0xd83a, 0xdd2d,
+0xd83a, 0xdd26, 0xd83a, 0xdd2b, 0xd83a, 0xdd38, 0xd83a, 0xdd2b, 0xd83a, 0xdd43, 0xd83a, 0xdd3c,
+0x3b, 0xd83a, 0xdd1d, 0xd83a, 0xdd2e, 0xd83a, 0xdd2a, 0xd83a, 0xdd23, 0xd83a, 0xdd22, 0xd83a,
+0xdd23, 0x3b, 0xd83a, 0xdd1a, 0xd83a, 0xdd2d, 0xd83a, 0xdd2a, 0x3b, 0xd83a, 0xdd03, 0xd83a,
+0xdd2e, 0xd83a, 0xdd2a, 0xd83a, 0xdd23, 0xd83a, 0xdd22, 0xd83a, 0xdd23, 0x3b, 0xd83a, 0xdd21,
+0xd83a, 0xdd22, 0xd83a, 0xdd38, 0xd83a, 0xdd2a, 0xd83a, 0xdd2d, 0xd83a, 0xdd3e, 0xd83a, 0xdd22,
+0xd83a, 0xdd2a, 0x3b, 0xd83a, 0xdd03, 0xd83a, 0xdd2b, 0xd83a, 0xdd38, 0xd83a, 0xdd2b, 0xd83a,
+0xdd2a, 0x3b, 0xd83a, 0xdd00, 0xd83a, 0xdd26, 0xd83a, 0xdd22, 0xd83a, 0xdd32, 0x3b, 0xd83a,
+0xdd00, 0xd83a, 0xdd41, 0xd83a, 0xdd22, 0xd83a, 0xdd2a, 0x3b, 0xd83a, 0xdd01, 0xd83a, 0xdd2b,
+0xd83a, 0xdd34, 0x3b, 0xd83a, 0xdd04, 0xd83a, 0xdd22, 0xd83a, 0xdd38, 0xd83a, 0xdd25, 0xd83a,
+0xdd22, 0xd83a, 0xdd32, 0x3b, 0xd83a, 0xdd09, 0xd83a, 0xdd27, 0xd83a, 0xdd2c, 0xd83a, 0xdd22,
+0xd83a, 0xdd32, 0xd83a, 0xdd23, 0xd83a, 0xdd51, 0x3b, 0xd83a, 0xdd52, 0x3b, 0xd83a, 0xdd53,
+0x3b, 0xd83a, 0xdd54, 0x3b, 0xd83a, 0xdd55, 0x3b, 0xd83a, 0xdd56, 0x3b, 0xd83a, 0xdd57,
+0x3b, 0xd83a, 0xdd58, 0x3b, 0xd83a, 0xdd59, 0x3b, 0xd83a, 0xdd51, 0xd83a, 0xdd50, 0x3b,
+0xd83a, 0xdd51, 0xd83a, 0xdd51, 0x3b, 0xd83a, 0xdd51, 0xd83a, 0xdd52, 0x10e4, 0x10d0, 0x10e0,
+0x10d5, 0x10d0, 0x10e0, 0x10d3, 0x10d8, 0x10dc, 0x10d8, 0x3b, 0x10dd, 0x10e0, 0x10d3, 0x10d8,
+0x10d1, 0x10d4, 0x10f0, 0x10d4, 0x10e8, 0x10d7, 0x10d8, 0x3b, 0x10ee, 0x10dd, 0x10e0, 0x10d3,
+0x10d0, 0x10d3, 0x10d8, 0x3b, 0x10d7, 0x10d8, 0x10e0, 0x10d8, 0x3b, 0x10db, 0x10dd, 0x10e0,
+0x10d3, 0x10d0, 0x10d3, 0x10d8, 0x3b, 0x10e8, 0x10d0, 0x10f0, 0x10e0, 0x10d8, 0x10d5, 0x10d0,
+0x10e0, 0x10d8, 0x3b, 0x10db, 0x10d4, 0x10f0, 0x10e0, 0x10d8, 0x3b, 0x10d0, 0x10d1, 0x10d0,
+0x10dc, 0x10d8, 0x3b, 0x10d0, 0x10d6, 0x10d0, 0x10e0, 0x10d8, 0x3b, 0x10d3, 0x10d4, 0x10d8,
+0x3b, 0x10d1, 0x10d0, 0x10f0, 0x10db, 0x10d0, 0x10dc, 0x10d8, 0x3b, 0x10d4, 0x10e1, 0x10e4,
+0x10d0, 0x10dc, 0x10d3, 0x10d8, 0x46, 0x61, 0x72, 0x77, 0x61, 0x72, 0x64, 0x69,
+0x6e, 0x3b, 0x4f, 0x72, 0x64, 0x69, 0x62, 0x65, 0x68, 0x65, 0x73, 0x63,
+0x68, 0x74, 0x3b, 0x43, 0x68, 0x6f, 0x72, 0x64, 0x101, 0x64, 0x3b, 0x54,
+0x69, 0x72, 0x3b, 0x4d, 0x6f, 0x72, 0x64, 0x101, 0x64, 0x3b, 0x53, 0x63,
+0x68, 0x61, 0x68, 0x72, 0x69, 0x77, 0x61, 0x72, 0x3b, 0x4d, 0x65, 0x68,
+0x72, 0x3b, 0x100, 0x62, 0x101, 0x6e, 0x3b, 0x100, 0x73, 0x61, 0x72, 0x3b,
+0x44, 0xe9, 0x69, 0x3b, 0x42, 0x61, 0x68, 0x6d, 0x61, 0x6e, 0x3b, 0x45,
+0x73, 0x73, 0x66, 0x61, 0x6e, 0x64, 0xaab, 0xabe, 0xab0, 0xacd, 0xab5, 0xabe,
+0xab0, 0xacd, 0xaa6, 0xabf, 0xaa8, 0x3b, 0xa93, 0xab0, 0xaa1, 0xac0, 0xaac, 0xac7,
+0xab9, 0xac7, 0xab6, 0xacd, 0xa9f, 0x3b, 0xa96, 0xacb, 0xab0, 0xaa6, 0xabe, 0xaa6,
+0x3b, 0xaa4, 0xabf, 0xab0, 0x3b, 0xaae, 0xacb, 0xab0, 0xacd, 0xaa6, 0xabe, 0xaa6,
+0x3b, 0xab6, 0xabe, 0xab9, 0xab0, 0xabf, 0xab5, 0xab0, 0x3b, 0xaae, 0xac7, 0xab9,
+0xab0, 0x3b, 0xa85, 0xaac, 0xabe, 0xaa8, 0x3b, 0xa85, 0xa9d, 0xabe, 0xab0, 0x3b,
+0xaa1, 0xac7, 0xaaf, 0x3b, 0xaac, 0xabe, 0xab9, 0xaae, 0xac7, 0xaa8, 0x3b, 0xa8f,
+0xab8, 0xacd, 0xaab, 0xabe, 0xaa8, 0xacd, 0xaa1, 0x5e4, 0x5e8, 0x5d5, 0x5e8, 0x5d3,
+0x5d9, 0x5df, 0x3b, 0x5d0, 0x5e8, 0x5d3, 0x5d9, 0x5d1, 0x5d4, 0x5e9, 0x5ea, 0x3b,
+0x5d7, 0x5f3, 0x5e8, 0x5d3, 0x5d0, 0x5d3, 0x3b, 0x5ea, 0x5d9, 0x5e8, 0x3b, 0x5de,
+0x5e8, 0x5d3, 0x5d0, 0x5d3, 0x3b, 0x5e9, 0x5d4, 0x5e8, 0x5d9, 0x5d5, 0x5e8, 0x3b,
+0x5de, 0x5d4, 0x5e8, 0x3b, 0x5d0, 0x5d1, 0x5d0, 0x5df, 0x3b, 0x5d0, 0x5d3, 0x5f3,
+0x5e8, 0x3b, 0x5d3, 0x5d9, 0x3b, 0x5d1, 0x5d4, 0x5de, 0x5df, 0x3b, 0x5d0, 0x5e1,
+0x5e4, 0x5e0, 0x5d3, 0x92b, 0x930, 0x94d, 0x935, 0x93e, 0x926, 0x93f, 0x928, 0x3b,
+0x913, 0x930, 0x94d, 0x926, 0x93f, 0x935, 0x947, 0x939, 0x947, 0x938, 0x94d, 0x91f,
+0x3b, 0x916, 0x94b, 0x930, 0x930, 0x94d, 0x926, 0x93e, 0x926, 0x3b, 0x91f, 0x93f,
+0x930, 0x3b, 0x92e, 0x94b, 0x930, 0x926, 0x93e, 0x926, 0x3b, 0x936, 0x93e, 0x939,
+0x930, 0x940, 0x935, 0x930, 0x94d, 0x3b, 0x92e, 0x947, 0x939, 0x930, 0x3b, 0x905,
+0x935, 0x928, 0x3b, 0x905, 0x91c, 0x93c, 0x930, 0x3b, 0x921, 0x947, 0x3b, 0x92c,
+0x939, 0x92e, 0x928, 0x3b, 0x908, 0x938, 0x94d, 0x92b, 0x928, 0x94d, 0x926, 0x94d,
+0x30d5, 0x30a1, 0x30eb, 0x30f4, 0x30a1, 0x30eb, 0x30c7, 0x30a3, 0x30fc, 0x30f3, 0x3b, 0x30aa,
+0x30eb, 0x30c7, 0x30a3, 0x30fc, 0x30d9, 0x30d8, 0x30b7, 0x30e5, 0x30c8, 0x3b, 0x30db, 0x30eb,
+0x30c0, 0x30fc, 0x30c9, 0x3b, 0x30c6, 0x30a3, 0x30fc, 0x30eb, 0x3b, 0x30e2, 0x30eb, 0x30c0,
+0x30fc, 0x30c9, 0x3b, 0x30b7, 0x30e3, 0x30cf, 0x30ea, 0x30fc, 0x30f4, 0x30a1, 0x30eb, 0x3b,
+0x30e1, 0x30d5, 0x30eb, 0x3b, 0x30a2, 0x30fc, 0x30d0, 0x30fc, 0x30f3, 0x3b, 0x30a2, 0x30fc,
+0x30b6, 0x30eb, 0x3b, 0x30c7, 0x30a4, 0x3b, 0x30d0, 0x30d5, 0x30de, 0x30f3, 0x3b, 0x30a8,
+0x30b9, 0x30d5, 0x30a1, 0x30f3, 0x30c9, 0xcab, 0xcb0, 0xccd, 0xcb5, 0xcb0, 0xccd, 0xca6,
+0xcbf, 0xca8, 0xccd, 0x3b, 0xc93, 0xcb0, 0xccd, 0xca6, 0xcbf, 0xcac, 0xcc6, 0xcb9,
+0xcc6, 0xcb6, 0xccd, 0xc9f, 0xccd, 0x3b, 0xc96, 0xccb, 0xcb0, 0xccd, 0xca1, 0xcbe,
+0xca6, 0xccd, 0x3b, 0xc9f, 0xcbf, 0xcb0, 0xccd, 0x3b, 0xcae, 0xcca, 0xcb0, 0xccd,
+0xca6, 0xcbe, 0xca6, 0xccd, 0x3b, 0xcb6, 0xcb9, 0xcb0, 0xcbf, 0xcb5, 0xcbe, 0xcb0,
+0xccd, 0x3b, 0xcae, 0xcc6, 0xcb9, 0xccd, 0xcb0, 0xccd, 0x3b, 0xc85, 0xcac, 0xca8,
+0xccd, 0x3b, 0xc85, 0xc9d, 0xcb0, 0xccd, 0x3b, 0xca1, 0xcc7, 0x3b, 0xcac, 0xcb9,
+0xccd, 0xcae, 0xca8, 0xccd, 0x3b, 0xc8e, 0xcb8, 0xccd, 0xcab, 0xcbe, 0xc82, 0xca1,
+0xccd, 0x424, 0x430, 0x440, 0x432, 0x430, 0x440, 0x434, 0x438, 0x43d, 0x3b, 0x41e,
+0x440, 0x434, 0x438, 0x431, 0x435, 0x445, 0x435, 0x448, 0x442, 0x3b, 0x425, 0x43e,
+0x440, 0x434, 0x430, 0x434, 0x3b, 0x422, 0x438, 0x440, 0x3b, 0x41c, 0x43e, 0x440,
+0x434, 0x430, 0x434, 0x3b, 0x428, 0x430, 0x445, 0x440, 0x438, 0x432, 0x430, 0x440,
+0x3b, 0x41c, 0x435, 0x445, 0x440, 0x3b, 0x410, 0x431, 0x430, 0x43d, 0x3b, 0x410,
+0x437, 0x430, 0x440, 0x3b, 0x414, 0x435, 0x439, 0x3b, 0x411, 0x430, 0x445, 0x43c,
+0x430, 0x43d, 0x3b, 0x42d, 0x441, 0x444, 0x430, 0x43d, 0x434, 0xd654, 0xb974, 0xbc14,
+0xb518, 0x3b, 0xc624, 0xb974, 0xb514, 0xbca0, 0xd5e4, 0xc26c, 0xd2b8, 0x3b, 0xd638, 0xb974,
+0xb2e4, 0xb4dc, 0x3b, 0xd2f0, 0xb974, 0x3b, 0xbaa8, 0xb974, 0xb2e4, 0xb4dc, 0x3b, 0xc0e4,
+0xd750, 0xb9ac, 0xbc14, 0xb974, 0x3b, 0xba54, 0xd750, 0xb974, 0x3b, 0xc544, 0xbc18, 0x3b,
+0xc544, 0xc790, 0xb974, 0x3b, 0xb2e4, 0xc774, 0x3b, 0xbc14, 0xd750, 0xb9cc, 0x3b, 0xc5d0,
+0xc2a4, 0xd310, 0xb4dc, 0xe9f, 0xea3, 0xeb2, 0xea7, 0xeb2, 0xe94, 0xeb4, 0xe99, 0x3b,
+0xead, 0xecd, 0xea3, 0xe94, 0xeb5, 0xe9a, 0xeb5, 0xec0, 0xeab, 0xea3, 0xe94, 0x3b,
+0xe84, 0xecd, 0xea3, 0xec0, 0xe94, 0xe94, 0x3b, 0xec1, 0xe95, 0xea3, 0x3b, 0xea1,
+0xecd, 0xea3, 0xec0, 0xe94, 0xe94, 0x3b, 0xe8a, 0xeb2, 0xea3, 0xeab, 0xeb4, 0xea7,
+0xeb2, 0x3b, 0xec0, 0xea1, 0xeb5, 0x3b, 0xead, 0xeb2, 0xe9a, 0xeb2, 0xe99, 0x3b,
+0xead, 0xeb2, 0xe8a, 0xeb2, 0xea3, 0x3b, 0xe94, 0xeb5, 0xea3, 0x3b, 0xe9a, 0xea3,
+0xeb2, 0xec1, 0xea1, 0xe99, 0x3b, 0xec0, 0xead, 0xeaa, 0xe9f, 0xeb2, 0xe99, 0xe9f,
+0xea3, 0xeb2, 0xea7, 0xeb2, 0xe94, 0xeb4, 0xe99, 0x3b, 0xead, 0xecd, 0xea3, 0xe94,
+0xeb5, 0xe9a, 0xeb5, 0xec0, 0xeab, 0xeae, 0xe94, 0x3b, 0xe84, 0xecd, 0xea3, 0xec0,
+0xe94, 0xe94, 0x3b, 0xec1, 0xe95, 0xea3, 0x3b, 0xea1, 0xecd, 0xea3, 0xec0, 0xe94,
+0xe94, 0x3b, 0xe8a, 0xeb2, 0xea3, 0xea5, 0xeb4, 0xea7, 0xeb2, 0x3b, 0xec0, 0xea1,
+0xeb5, 0x3b, 0xead, 0xeb2, 0xe9a, 0xeb2, 0xe99, 0x3b, 0xead, 0xeb2, 0xe8a, 0xeb2,
+0x3b, 0xe94, 0xeb5, 0xea3, 0x3b, 0xe9a, 0xea3, 0xeb2, 0xea1, 0xeb2, 0xe99, 0x3b,
+0xec0, 0xead, 0xeaa, 0xe9f, 0xeb2, 0xe99, 0xe9f, 0xeb2, 0xea3, 0xea7, 0xeb2, 0xe94,
+0xeb4, 0xe99, 0x3b, 0xead, 0xecd, 0xea3, 0xe94, 0xeb5, 0xe9a, 0xeb5, 0xec0, 0xeab,
+0xea3, 0xe94, 0x3b, 0xe84, 0xecd, 0xea3, 0xec0, 0xe94, 0xe94, 0x3b, 0xec1, 0xe95,
+0xea3, 0x3b, 0xea1, 0xecd, 0xea3, 0xec0, 0xe94, 0xe94, 0x3b, 0xe8a, 0xeb2, 0xea3,
+0xeab, 0xeb4, 0xea7, 0xeb2, 0x3b, 0xec0, 0xea1, 0xeb5, 0x3b, 0xead, 0xeb2, 0xe9a,
+0xeb2, 0xe99, 0x3b, 0xead, 0xeb2, 0xe8a, 0xeb2, 0x3b, 0xe94, 0xeb5, 0xea3, 0x3b,
+0xe9a, 0xea3, 0xeb2, 0xea1, 0xeb2, 0xe99, 0x3b, 0xec0, 0xead, 0xeaa, 0xe9f, 0xeb2,
+0xe99, 0x66, 0x61, 0x72, 0x76, 0x61, 0x72, 0x64, 0x12b, 0x6e, 0x73, 0x3b,
+0x6f, 0x72, 0x64, 0x69, 0x62, 0x65, 0x68, 0x65, 0x161, 0x74, 0x73, 0x3b,
+0x68, 0x6f, 0x72, 0x64, 0x101, 0x64, 0x73, 0x3b, 0x74, 0x12b, 0x72, 0x73,
+0x3b, 0x6d, 0x6f, 0x72, 0x64, 0x101, 0x64, 0x73, 0x3b, 0x161, 0x61, 0x68,
+0x72, 0x69, 0x76, 0x113, 0x72, 0x73, 0x3b, 0x6d, 0x65, 0x68, 0x72, 0x73,
+0x3b, 0x61, 0x62, 0x61, 0x6e, 0x73, 0x3b, 0x61, 0x7a, 0x65, 0x72, 0x73,
+0x3b, 0x64, 0x65, 0x6a, 0x73, 0x3b, 0x62, 0x61, 0x68, 0x6d, 0x61, 0x6e,
+0x73, 0x3b, 0x65, 0x73, 0x66, 0x61, 0x6e, 0x64, 0x73, 0x444, 0x430, 0x440,
+0x432, 0x430, 0x440, 0x434, 0x438, 0x43d, 0x3b, 0x43e, 0x440, 0x434, 0x438, 0x431,
+0x435, 0x445, 0x435, 0x448, 0x442, 0x3b, 0x43a, 0x43e, 0x440, 0x434, 0x430, 0x434,
+0x3b, 0x442, 0x438, 0x440, 0x3b, 0x43c, 0x43e, 0x440, 0x434, 0x430, 0x434, 0x3b,
+0x448, 0x430, 0x445, 0x440, 0x438, 0x432, 0x430, 0x440, 0x3b, 0x43c, 0x435, 0x440,
+0x3b, 0x430, 0x431, 0x430, 0x43d, 0x3b, 0x430, 0x437, 0x430, 0x440, 0x3b, 0x434,
+0x435, 0x458, 0x3b, 0x431, 0x430, 0x445, 0x43c, 0x430, 0x43d, 0x3b, 0x435, 0x441,
+0x444, 0x430, 0x43d, 0x434, 0xd2b, 0xd7c, 0xd35, 0xd3e, 0xd7c, 0xd26, 0xd3f, 0xd7b,
+0x3b, 0xd13, 0xd7c, 0xd21, 0xd3f, 0xd2c, 0xd46, 0xd39, 0xd46, 0xd37, 0xd4d, 0x200c,
+0xd31, 0xd4d, 0xd31, 0xd4d, 0x3b, 0xd16, 0xd4b, 0xd7c, 0xd26, 0xd3e, 0xd26, 0xd4d,
+0x3b, 0xd1f, 0xd3f, 0xd7c, 0x3b, 0xd2e, 0xd4b, 0xd7c, 0xd26, 0xd3e, 0xd26, 0xd4d,
+0x3b, 0xd37, 0xd39, 0xd4d, 0x200c, 0xd30, 0xd3f, 0xd35, 0xd3e, 0xd7c, 0x3b, 0xd2e,
+0xd46, 0xd39, 0xd7c, 0x3b, 0xd05, 0xd2c, 0xd3e, 0xd7b, 0x3b, 0xd05, 0xd38, 0xd7c,
+0x3b, 0xd21, 0xd46, 0xd2f, 0xd4d, 0x3b, 0xd2c, 0xd39, 0xd4d, 0x200c, 0xd2e, 0xd3e,
+0xd7b, 0x3b, 0xd0e, 0xd38, 0xd4d, 0x200c, 0xd2b, 0xd3e, 0xd7b, 0xd21, 0xd4d, 0xd2b,
+0x2e, 0x3b, 0xd13, 0x2e, 0x3b, 0xd16, 0xd4b, 0x3b, 0xd1f, 0xd3f, 0x2e, 0x3b,
+0xd2e, 0xd4b, 0x2e, 0x3b, 0xd37, 0x2e, 0x3b, 0xd2e, 0xd46, 0x2e, 0x3b, 0xd05,
+0x2e, 0x3b, 0xd05, 0x2e, 0x3b, 0xd21, 0xd46, 0x2e, 0x3b, 0xd2c, 0x2e, 0x3b,
+0xd0e, 0x2e, 0x92b, 0x930, 0x935, 0x930, 0x926, 0x93f, 0x928, 0x3b, 0x913, 0x930,
+0x94d, 0x926, 0x93f, 0x92c, 0x947, 0x939, 0x947, 0x936, 0x94d, 0x924, 0x3b, 0x916,
+0x94b, 0x930, 0x926, 0x93e, 0x926, 0x3b, 0x924, 0x93f, 0x930, 0x3b, 0x92e, 0x94b,
+0x930, 0x926, 0x93e, 0x926, 0x3b, 0x936, 0x93e, 0x939, 0x930, 0x940, 0x935, 0x93e,
+0x930, 0x3b, 0x92e, 0x947, 0x939, 0x947, 0x930, 0x3b, 0x905, 0x92c, 0x93e, 0x928,
+0x3b, 0x905, 0x91d, 0x93e, 0x930, 0x3b, 0x926, 0x947, 0x3b, 0x92c, 0x93e, 0x939,
+0x92e, 0x93e, 0x928, 0x3b, 0x90f, 0x938, 0x92b, 0x93e, 0x902, 0x926, 0x967, 0x3b,
+0x968, 0x3b, 0x969, 0x3b, 0x96a, 0x3b, 0x96b, 0x3b, 0x96c, 0x3b, 0x96d, 0x3b,
+0x96e, 0x3b, 0x96f, 0x3b, 0x967, 0x966, 0x3b, 0x967, 0x967, 0x3b, 0x967, 0x968,
+0x648, 0x631, 0x6cc, 0x3b, 0x63a, 0x648, 0x6cc, 0x6cc, 0x3b, 0x63a, 0x628, 0x631,
+0x6af, 0x648, 0x644, 0x6cc, 0x3b, 0x686, 0x646, 0x6af, 0x627, 0x69a, 0x3b, 0x632,
+0x645, 0x631, 0x6cc, 0x3b, 0x648, 0x696, 0x6cc, 0x3b, 0x62a, 0x644, 0x647, 0x3b,
+0x644, 0x693, 0x645, 0x3b, 0x644, 0x6cc, 0x646, 0x62f, 0x6cd, 0x3b, 0x645, 0x631,
+0x63a, 0x648, 0x645, 0x6cc, 0x3b, 0x633, 0x644, 0x648, 0x627, 0x63a, 0x647, 0x3b,
+0x6a9, 0x628, 0x6f1, 0x3b, 0x6f2, 0x3b, 0x6f3, 0x3b, 0x6f4, 0x3b, 0x6f5, 0x3b,
+0x6f6, 0x3b, 0x6f7, 0x3b, 0x6f8, 0x3b, 0x6f9, 0x3b, 0x6f1, 0x6f0, 0x3b, 0x6f1,
+0x6f1, 0x3b, 0x6f1, 0x6f2, 0x641, 0x631, 0x648, 0x631, 0x62f, 0x6cc, 0x646, 0x3b,
+0x627, 0x631, 0x62f, 0x6cc, 0x628, 0x647, 0x634, 0x62a, 0x3b, 0x62e, 0x631, 0x62f,
+0x627, 0x62f, 0x3b, 0x62a, 0x6cc, 0x631, 0x3b, 0x645, 0x631, 0x62f, 0x627, 0x62f,
+0x3b, 0x634, 0x647, 0x631, 0x6cc, 0x648, 0x631, 0x3b, 0x645, 0x647, 0x631, 0x3b,
+0x622, 0x628, 0x627, 0x646, 0x3b, 0x622, 0x630, 0x631, 0x3b, 0x62f, 0x6cc, 0x3b,
+0x628, 0x647, 0x645, 0x646, 0x3b, 0x627, 0x633, 0x641, 0x646, 0x62f, 0x641, 0x3b,
+0x627, 0x3b, 0x62e, 0x3b, 0x62a, 0x3b, 0x645, 0x3b, 0x634, 0x3b, 0x645, 0x3b,
+0x622, 0x3b, 0x622, 0x3b, 0x62f, 0x3b, 0x628, 0x3b, 0x627, 0x62d, 0x645, 0x644,
+0x3b, 0x62b, 0x648, 0x631, 0x3b, 0x62c, 0x648, 0x632, 0x627, 0x3b, 0x633, 0x631,
+0x637, 0x627, 0x646, 0x3b, 0x627, 0x633, 0x62f, 0x3b, 0x633, 0x646, 0x628, 0x644,
+0x647, 0x654, 0x3b, 0x645, 0x6cc, 0x632, 0x627, 0x646, 0x3b, 0x639, 0x642, 0x631,
+0x628, 0x3b, 0x642, 0x648, 0x633, 0x3b, 0x62c, 0x62f, 0x6cc, 0x3b, 0x62f, 0x644,
+0x648, 0x3b, 0x62d, 0x648, 0x62a, 0x62d, 0x3b, 0x62b, 0x3b, 0x62c, 0x3b, 0x633,
+0x3b, 0x627, 0x3b, 0x633, 0x3b, 0x645, 0x3b, 0x639, 0x3b, 0x642, 0x3b, 0x62c,
+0x3b, 0x62f, 0x3b, 0x62d, 0x46, 0x61, 0x72, 0x77, 0x61, 0x72, 0x64, 0x69,
+0x6e, 0x3b, 0x4f, 0x72, 0x64, 0x69, 0x62, 0x65, 0x68, 0x65, 0x73, 0x7a,
+0x74, 0x3b, 0x43, 0x68, 0x6f, 0x72, 0x64, 0x101, 0x64, 0x3b, 0x54, 0x69,
+0x72, 0x3b, 0x4d, 0x6f, 0x72, 0x64, 0x101, 0x64, 0x3b, 0x53, 0x7a, 0x61,
+0x68, 0x72, 0x69, 0x77, 0x61, 0x72, 0x3b, 0x4d, 0x65, 0x68, 0x72, 0x3b,
+0x100, 0x62, 0x101, 0x6e, 0x3b, 0x100, 0x73, 0x61, 0x72, 0x3b, 0x44, 0xe9,
+0x69, 0x3b, 0x42, 0x61, 0x68, 0x6d, 0x61, 0x6e, 0x3b, 0x45, 0x73, 0x66,
+0x61, 0x6e, 0x64, 0xa2b, 0xa3e, 0xa30, 0xa35, 0xa30, 0xa21, 0xa40, 0xa28, 0x3b,
+0xa14, 0xa30, 0xa21, 0xa3e, 0xa08, 0xa2c, 0xa39, 0xa48, 0xa38, 0xa3c, 0xa1f, 0x3b,
+0xa16, 0xa4b, 0xa21, 0xa30, 0xa21, 0x3b, 0xa1f, 0xa3f, 0xa30, 0x3b, 0xa2e, 0xa4b,
+0xa30, 0xa21, 0xa3e, 0xa26, 0x3b, 0xa38, 0xa3c, 0xa30, 0xa3e, 0xa07, 0xa35, 0xa30,
+0x3b, 0xa2e, 0xa47, 0xa39, 0xa30, 0x3b, 0xa05, 0xa2c, 0xa3e, 0xa28, 0x3b, 0xa05,
+0xa1c, 0xa3c, 0xa3e, 0xa30, 0x3b, 0xa21, 0xa47, 0xa05, 0x3b, 0xa2c, 0xa3e, 0xa39,
+0xa2e, 0xa28, 0x3b, 0xa10, 0xa38, 0xa2b, 0xa70, 0xa21, 0x46, 0x61, 0x72, 0x76,
+0x61, 0x72, 0x64, 0x69, 0x6e, 0x3b, 0x4f, 0x72, 0x64, 0x69, 0x62, 0x65,
+0x68, 0x65, 0x73, 0x68, 0x74, 0x3b, 0x4b, 0x68, 0x6f, 0x72, 0x64, 0x61,
+0x64, 0x3b, 0x54, 0x69, 0x72, 0x3b, 0x41, 0x2d, 0x4d, 0x6f, 0x72, 0x64,
+0x61, 0x64, 0x3b, 0x53, 0x68, 0x61, 0x68, 0x72, 0x69, 0x76, 0x61, 0x72,
+0x3b, 0x4d, 0x65, 0x68, 0x72, 0x3b, 0x41, 0x62, 0x61, 0x6e, 0x3b, 0x41,
+0x7a, 0x61, 0x72, 0x3b, 0x44, 0x65, 0x79, 0x3b, 0x42, 0x61, 0x68, 0x6d,
+0x61, 0x6e, 0x3b, 0x45, 0x73, 0x66, 0x61, 0x6e, 0x64, 0x444, 0x430, 0x440,
+0x432, 0x430, 0x440, 0x434, 0x438, 0x43d, 0x3b, 0x43e, 0x440, 0x434, 0x438, 0x431,
+0x435, 0x445, 0x435, 0x448, 0x442, 0x3b, 0x445, 0x43e, 0x440, 0x434, 0x430, 0x434,
+0x3b, 0x442, 0x438, 0x440, 0x3b, 0x43c, 0x43e, 0x440, 0x434, 0x430, 0x434, 0x3b,
+0x448, 0x430, 0x445, 0x440, 0x438, 0x432, 0x435, 0x440, 0x3b, 0x43c, 0x435, 0x445,
+0x440, 0x3b, 0x430, 0x431, 0x430, 0x43d, 0x3b, 0x430, 0x437, 0x435, 0x440, 0x3b,
+0x434, 0x435, 0x439, 0x3b, 0x431, 0x430, 0x445, 0x43c, 0x430, 0x43d, 0x3b, 0x44d,
+0x441, 0x444, 0x430, 0x43d, 0x434, 0x66, 0x61, 0x72, 0x2e, 0x3b, 0x6f, 0x72,
+0x64, 0x2e, 0x3b, 0x6b, 0x68, 0x6f, 0x2e, 0x3b, 0x74, 0x69, 0x72, 0x3b,
+0x6d, 0x6f, 0x72, 0x2e, 0x3b, 0x73, 0x68, 0x61, 0x2e, 0x3b, 0x6d, 0x65,
+0x68, 0x72, 0x3b, 0x61, 0x62, 0x61, 0x6e, 0x3b, 0x61, 0x7a, 0x61, 0x72,
+0x3b, 0x64, 0x65, 0x79, 0x3b, 0x62, 0x61, 0x68, 0x2e, 0x3b, 0x65, 0x73,
+0x66, 0x2e, 0x46, 0x61, 0x72, 0x61, 0x76, 0x61, 0x64, 0x69, 0x6e, 0x3b,
+0x4f, 0x72, 0x64, 0x69, 0x62, 0x65, 0x68, 0x65, 0x161, 0x74, 0x3b, 0x4b,
+0x6f, 0x72, 0x64, 0x61, 0x64, 0x3b, 0x54, 0x69, 0x72, 0x3b, 0x4d, 0x6f,
+0x72, 0x64, 0x61, 0x64, 0x3b, 0x160, 0x61, 0x68, 0x72, 0x69, 0x76, 0x61,
+0x72, 0x3b, 0x4d, 0x65, 0x68, 0x72, 0x3b, 0x41, 0x62, 0x61, 0x6e, 0x3b,
+0x41, 0x7a, 0x61, 0x72, 0x3b, 0x44, 0x65, 0x6a, 0x3b, 0x42, 0x61, 0x68,
+0x6d, 0x61, 0x6e, 0x3b, 0x45, 0x73, 0x66, 0x61, 0x6e, 0x64, 0x4a, 0x61,
+0x6e, 0x61, 0x61, 0x79, 0x6f, 0x3b, 0x46, 0x65, 0x65, 0x62, 0x72, 0x61,
+0x61, 0x79, 0x6f, 0x3b, 0x4d, 0x61, 0x61, 0x72, 0x73, 0x6f, 0x3b, 0x41,
+0x62, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x61, 0x61, 0x79, 0x6f, 0x3b, 0x4a,
+0x75, 0x75, 0x6e, 0x3b, 0x4c, 0x75, 0x75, 0x6c, 0x69, 0x79, 0x6f, 0x3b,
+0x41, 0x67, 0x6f, 0x6f, 0x73, 0x74, 0x6f, 0x3b, 0x53, 0x61, 0x62, 0x74,
+0x65, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x6f,
+0x62, 0x61, 0x72, 0x3b, 0x4e, 0x6f, 0x6f, 0x66, 0x65, 0x65, 0x6d, 0x62,
+0x61, 0x72, 0x3b, 0x44, 0x69, 0x69, 0x73, 0x65, 0x65, 0x6d, 0x62, 0x61,
+0x72, 0x46, 0x61, 0x72, 0x76, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x3b, 0x4f,
+0x72, 0x64, 0x69, 0x62, 0x65, 0x68, 0x65, 0x73, 0x68, 0x74, 0x3b, 0x4b,
+0x68, 0x6f, 0x72, 0x64, 0x101, 0x64, 0x3b, 0x54, 0x69, 0x72, 0x3b, 0x4d,
+0x6f, 0x72, 0x64, 0x101, 0x64, 0x3b, 0x53, 0x68, 0x61, 0x68, 0x72, 0x69,
+0x76, 0x61, 0x72, 0x3b, 0x4d, 0x65, 0x68, 0x72, 0x3b, 0x100, 0x62, 0x101,
+0x6e, 0x3b, 0x100, 0x7a, 0x61, 0x72, 0x3b, 0x44, 0x65, 0x79, 0x3b, 0x42,
+0x61, 0x68, 0x6d, 0x61, 0x6e, 0x3b, 0x45, 0x73, 0x66, 0x61, 0x6e, 0x64,
+0x66, 0x61, 0x72, 0x76, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x3b, 0x6f, 0x72,
+0x64, 0x69, 0x62, 0x65, 0x68, 0x65, 0x73, 0x68, 0x74, 0x3b, 0x6b, 0x68,
+0x6f, 0x72, 0x64, 0x101, 0x64, 0x3b, 0x74, 0x69, 0x72, 0x3b, 0x6d, 0x6f,
+0x72, 0x64, 0x101, 0x64, 0x3b, 0x73, 0x68, 0x61, 0x68, 0x72, 0x69, 0x76,
+0x61, 0x72, 0x3b, 0x6d, 0x65, 0x68, 0x72, 0x3b, 0x101, 0x62, 0x101, 0x6e,
+0x3b, 0x101, 0x7a, 0x61, 0x72, 0x3b, 0x64, 0x65, 0x79, 0x3b, 0x62, 0x61,
+0x68, 0x6d, 0x61, 0x6e, 0x3b, 0x65, 0x73, 0x66, 0x61, 0x6e, 0x64, 0x444,
+0x430, 0x440, 0x432, 0x430, 0x440, 0x434, 0x438, 0x43d, 0x3b, 0x443, 0x440, 0x434,
+0x438, 0x431, 0x438, 0x4b3, 0x438, 0x448, 0x442, 0x3b, 0x445, 0x443, 0x440, 0x434,
+0x43e, 0x434, 0x3b, 0x442, 0x438, 0x440, 0x3b, 0x43c, 0x443, 0x440, 0x434, 0x43e,
+0x434, 0x3b, 0x448, 0x430, 0x4b3, 0x440, 0x438, 0x432, 0x430, 0x440, 0x3b, 0x43c,
+0x435, 0x4b3, 0x440, 0x3b, 0x43e, 0x431, 0x43e, 0x43d, 0x3b, 0x43e, 0x437, 0x430,
+0x440, 0x3b, 0x434, 0x435, 0x439, 0x3b, 0x431, 0x430, 0x4b3, 0x43c, 0x430, 0x43d,
+0x3b, 0x438, 0x441, 0x444, 0x430, 0x43d, 0x434, 0xb83, 0xbaa, 0xbb0, 0xbcd, 0xbb5,
+0xbbe, 0xba4, 0xbbf, 0xba9, 0xbcd, 0x3b, 0xb86, 0xbb0, 0xbcd, 0xb9f, 0xbbf, 0xbaa,
+0xbc6, 0xbb9, 0xbc6, 0xbb7, 0xbcd, 0xba4, 0xbcd, 0x3b, 0xb95, 0xbca, 0xbb0, 0xbcd,
+0xba4, 0xbbe, 0xba4, 0xbcd, 0x3b, 0xba4, 0xbbf, 0xbb0, 0xbcd, 0x3b, 0xbae, 0xbca,
+0xbb0, 0xbcd, 0xba4, 0xbbe, 0xba4, 0xbcd, 0x3b, 0xbb7, 0xbbe, 0xbb0, 0xbbf, 0xbb5,
+0xbbe, 0xbb0, 0xbcd, 0x3b, 0xbae, 0xbc6, 0xbb9, 0xbcd, 0xbb0, 0xbcd, 0x3b, 0xb85,
+0xbaa, 0xbbe, 0xba9, 0xbcd, 0x3b, 0xb85, 0xb9a, 0xbbe, 0xbb0, 0xbcd, 0x3b, 0xba4,
+0xbc7, 0x3b, 0xbaa, 0xbb9, 0xbcd, 0xbae, 0xbbe, 0xba9, 0xbcd, 0x3b, 0xb8e, 0xb83,
+0xbaa, 0xbbe, 0xba9, 0xbcd, 0xb83, 0xbaa, 0xbb0, 0xbcd, 0x2e, 0x3b, 0xb86, 0xbb0,
+0xbcd, 0xb9f, 0xbbf, 0x2e, 0x3b, 0xb95, 0xbca, 0xbb0, 0xbcd, 0x2e, 0x3b, 0xba4,
+0xbbf, 0xbb0, 0xbcd, 0x3b, 0xbae, 0xbca, 0xbb0, 0xbcd, 0x2e, 0x3b, 0xbb7, 0xbbe,
+0xbb0, 0xbbf, 0x2e, 0x3b, 0xbae, 0xbc6, 0xbb9, 0xbcd, 0x2e, 0x3b, 0xb85, 0xbaa,
+0xbbe, 0x2e, 0x3b, 0xb85, 0xb9a, 0xbbe, 0x2e, 0x3b, 0xba4, 0xbc7, 0x3b, 0xbaa,
+0xbb9, 0xbcd, 0x2e, 0x3b, 0xb8e, 0xb83, 0x2e, 0xc2b, 0xc3e, 0xc35, 0xc30, 0xc4d,
+0xc21, 0xc3f, 0xc28, 0xc4d, 0x3b, 0xc0a, 0xc21, 0xc3e, 0xc2c, 0xc39, 0xc37, 0xc4d,
+0xc1f, 0xc4d, 0x3b, 0xc16, 0xc4b, 0xc30, 0xc4d, 0xc21, 0xc3e, 0xc21, 0xc4d, 0x3b,
+0xc1f, 0xc3f, 0xc30, 0xc4d, 0x3b, 0xc2e, 0xc46, 0xc30, 0xc4d, 0xc21, 0xc3e, 0xc21,
+0xc4d, 0x3b, 0xc36, 0xc36, 0xc3f, 0xc35, 0xc30, 0xc4d, 0x3b, 0xc2e, 0xc46, 0xc39,
+0xc30, 0xc4d, 0x3b, 0xc05, 0xc2c, 0xc28, 0xc4d, 0x3b, 0xc05, 0xc1c, 0xc30, 0xc4d,
+0x3b, 0xc21, 0xc47, 0x3b, 0xc2c, 0xc3e, 0xc39, 0xc4d, 0x200c, 0xc2e, 0xc3e, 0xc28,
+0xc4d, 0x3b, 0xc0e, 0xc38, 0xc4d, 0x200c, 0xc2b, 0xc3e, 0xc02, 0xc21, 0xc4d, 0xe1f,
+0xe32, 0xe23, 0xe4c, 0xe27, 0xe32, 0xe23, 0xe4c, 0xe14, 0xe34, 0xe19, 0x3b, 0xe2d,
+0xe2d, 0xe23, 0xe4c, 0xe14, 0xe34, 0xe40, 0xe1a, 0xe40, 0xe2e, 0xe0a, 0xe15, 0xe4c,
+0x3b, 0xe04, 0xe2d, 0xe23, 0xe4c, 0xe41, 0xe14, 0xe14, 0x3b, 0xe40, 0xe15, 0xe2d,
+0xe23, 0xe4c, 0x3b, 0xe21, 0xe2d, 0xe23, 0xe4c, 0xe41, 0xe14, 0xe14, 0x3b, 0xe0a,
+0xe32, 0xe2b, 0xe23, 0xe34, 0xe27, 0xe32, 0xe23, 0xe4c, 0x3b, 0xe40, 0xe21, 0xe2e,
+0xe23, 0xe4c, 0x3b, 0xe2d, 0xe30, 0xe1a, 0xe32, 0xe19, 0x3b, 0xe2d, 0xe30, 0xe0b,
+0xe32, 0xe23, 0xe4c, 0x3b, 0xe40, 0xe14, 0xe22, 0xe4c, 0x3b, 0xe1a, 0xe32, 0xe2e,
+0xe4c, 0xe21, 0xe32, 0xe19, 0x3b, 0xe40, 0xe2d, 0xe2a, 0xe1f, 0xe32, 0xe19, 0xe14,
+0xe4c, 0x46, 0x65, 0x72, 0x76, 0x65, 0x72, 0x64, 0x69, 0x6e, 0x3b, 0x4f,
+0x72, 0x64, 0x69, 0x62, 0x65, 0x68, 0x65, 0x15f, 0x74, 0x3b, 0x48, 0x6f,
+0x72, 0x64, 0x61, 0x64, 0x3b, 0x54, 0x69, 0x72, 0x3b, 0x4d, 0x6f, 0x72,
+0x64, 0x61, 0x64, 0x3b, 0x15e, 0x65, 0x68, 0x72, 0x69, 0x76, 0x65, 0x72,
+0x3b, 0x4d, 0x65, 0x68, 0x72, 0x3b, 0x41, 0x62, 0x61, 0x6e, 0x3b, 0x41,
+0x7a, 0x65, 0x72, 0x3b, 0x44, 0x65, 0x79, 0x3b, 0x42, 0x65, 0x68, 0x6d,
+0x65, 0x6e, 0x3b, 0x45, 0x73, 0x66, 0x65, 0x6e, 0x64, 0x444, 0x430, 0x440,
+0x432, 0x430, 0x440, 0x434, 0x456, 0x43d, 0x3b, 0x43e, 0x440, 0x434, 0x456, 0x431,
+0x435, 0x445, 0x435, 0x448, 0x442, 0x3b, 0x445, 0x43e, 0x440, 0x434, 0x430, 0x434,
+0x3b, 0x442, 0x456, 0x440, 0x3b, 0x43c, 0x43e, 0x440, 0x434, 0x430, 0x434, 0x3b,
+0x448, 0x430, 0x445, 0x440, 0x456, 0x432, 0x435, 0x440, 0x3b, 0x43c, 0x435, 0x445,
+0x440, 0x3b, 0x430, 0x431, 0x430, 0x43d, 0x3b, 0x430, 0x437, 0x435, 0x440, 0x3b,
+0x434, 0x435, 0x439, 0x3b, 0x431, 0x430, 0x445, 0x43c, 0x430, 0x43d, 0x3b, 0x435,
+0x441, 0x444, 0x430, 0x43d, 0x434, 0x444, 0x430, 0x440, 0x3b, 0x43e, 0x440, 0x434,
+0x3b, 0x445, 0x43e, 0x440, 0x3b, 0x442, 0x456, 0x440, 0x3b, 0x43c, 0x43e, 0x440,
+0x3b, 0x448, 0x430, 0x445, 0x3b, 0x43c, 0x435, 0x445, 0x3b, 0x430, 0x431, 0x430,
+0x43d, 0x3b, 0x430, 0x437, 0x435, 0x440, 0x3b, 0x434, 0x435, 0x439, 0x3b, 0x431,
+0x430, 0x445, 0x3b, 0x435, 0x441, 0x444, 0x444, 0x430, 0x440, 0x2e, 0x3b, 0x43e,
+0x440, 0x434, 0x2e, 0x3b, 0x445, 0x43e, 0x440, 0x2e, 0x3b, 0x442, 0x456, 0x440,
+0x3b, 0x43c, 0x43e, 0x440, 0x2e, 0x3b, 0x448, 0x430, 0x445, 0x2e, 0x3b, 0x43c,
+0x435, 0x445, 0x2e, 0x3b, 0x430, 0x431, 0x430, 0x43d, 0x3b, 0x430, 0x437, 0x435,
+0x440, 0x3b, 0x434, 0x435, 0x439, 0x3b, 0x431, 0x430, 0x445, 0x2e, 0x3b, 0x435,
+0x441, 0x444, 0x2e, 0x641, 0x631, 0x648, 0x631, 0x62f, 0x646, 0x3b, 0x622, 0x631,
+0x688, 0x628, 0x627, 0x626, 0x634, 0x3b, 0x62e, 0x62f, 0x627, 0x62f, 0x627, 0x62f,
+0x3b, 0x62a, 0x6cc, 0x631, 0x3b, 0x645, 0x631, 0x62f, 0x627, 0x62f, 0x3b, 0x634,
+0x6c1, 0x631, 0x6cc, 0x648, 0x627, 0x631, 0x3b, 0x645, 0x6c1, 0x631, 0x3b, 0x627,
+0x628, 0x627, 0x646, 0x3b, 0x622, 0x632, 0x631, 0x3b, 0x688, 0x6d2, 0x3b, 0x628,
+0x6c1, 0x645, 0x646, 0x3b, 0x627, 0x633, 0x641, 0x646, 0x62f, 0x66, 0x61, 0x72,
+0x76, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x3b, 0x6f, 0x2bb, 0x72, 0x64, 0x69,
+0x62, 0x65, 0x68, 0x69, 0x73, 0x68, 0x74, 0x3b, 0x78, 0x75, 0x72, 0x64,
+0x6f, 0x64, 0x3b, 0x74, 0x75, 0x72, 0x3b, 0x6d, 0x75, 0x72, 0x64, 0x6f,
+0x64, 0x3b, 0x73, 0x68, 0x61, 0x68, 0x72, 0x69, 0x76, 0x61, 0x72, 0x3b,
+0x6d, 0x65, 0x68, 0x72, 0x3b, 0x6f, 0x62, 0x6f, 0x6e, 0x3b, 0x6f, 0x7a,
+0x61, 0x72, 0x3b, 0x64, 0x65, 0x79, 0x3b, 0x62, 0x61, 0x68, 0x6d, 0x61,
+0x6e, 0x3b, 0x69, 0x73, 0x66, 0x61, 0x6e, 0x64, 0x66, 0x61, 0x72, 0x76,
+0x61, 0x72, 0x64, 0x69, 0x6e, 0x3b, 0x6f, 0x2bb, 0x72, 0x64, 0x69, 0x62,
+0x65, 0x68, 0x69, 0x73, 0x68, 0x74, 0x3b, 0x78, 0x75, 0x72, 0x64, 0x6f,
+0x64, 0x3b, 0x74, 0x69, 0x72, 0x3b, 0x6d, 0x75, 0x72, 0x64, 0x6f, 0x64,
+0x3b, 0x73, 0x68, 0x61, 0x68, 0x72, 0x69, 0x76, 0x61, 0x72, 0x3b, 0x6d,
+0x65, 0x68, 0x72, 0x3b, 0x6f, 0x62, 0x6f, 0x6e, 0x3b, 0x6f, 0x7a, 0x61,
+0x72, 0x3b, 0x64, 0x65, 0x79, 0x3b, 0x62, 0x61, 0x68, 0x6d, 0x61, 0x6e,
+0x3b, 0x69, 0x73, 0x66, 0x61, 0x6e, 0x66, 0x61, 0x72, 0x76, 0x61, 0x72,
+0x64, 0x69, 0x6e, 0x3b, 0x6f, 0x2bb, 0x72, 0x64, 0x69, 0x62, 0x65, 0x68,
+0x69, 0x73, 0x68, 0x74, 0x3b, 0x78, 0x75, 0x72, 0x64, 0x6f, 0x64, 0x3b,
+0x74, 0x69, 0x72, 0x3b, 0x6d, 0x75, 0x72, 0x64, 0x6f, 0x64, 0x3b, 0x73,
+0x68, 0x61, 0x68, 0x72, 0x69, 0x76, 0x61, 0x72, 0x3b, 0x6d, 0x65, 0x68,
+0x72, 0x3b, 0x6f, 0x62, 0x6f, 0x6e, 0x3b, 0x6f, 0x7a, 0x61, 0x72, 0x3b,
+0x64, 0x65, 0x79, 0x3b, 0x62, 0x61, 0x68, 0x6d, 0x61, 0x6e, 0x3b, 0x69,
+0x73, 0x66, 0x61, 0x6e, 0x64
};
// GENERATED PART ENDS HERE
+} // namespace QtPrivate::Jalali
+
QT_END_NAMESPACE
#endif
diff --git a/src/corelib/time/qjalalicalendar_p.h b/src/corelib/time/qjalalicalendar_p.h
index c93516b87c..51c89fe297 100644
--- a/src/corelib/time/qjalalicalendar_p.h
+++ b/src/corelib/time/qjalalicalendar_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QJALALI_CALENDAR_P_H
#define QJALALI_CALENDAR_P_H
diff --git a/src/corelib/time/qjuliancalendar.cpp b/src/corelib/time/qjuliancalendar.cpp
index 06ab9bba3d..1439ae3e00 100644
--- a/src/corelib/time/qjuliancalendar.cpp
+++ b/src/corelib/time/qjuliancalendar.cpp
@@ -1,48 +1,11 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qglobal.h"
#include "qjuliancalendar_p.h"
#include "qromancalendar_data_p.h"
#include "qcalendarmath_p.h"
-#include <QtCore/qmath.h>
-#include <QtCore/qlocale.h>
+
#include <QtCore/qdatetime.h>
QT_BEGIN_NAMESPACE
@@ -90,36 +53,32 @@ bool QJulianCalendar::isLeapYear(int year) const
if (year == QCalendar::Unspecified || !year)
return false;
- return qMod(year < 0 ? year + 1 : year, 4) == 0;
+ return qMod<4>(year < 0 ? year + 1 : year) == 0;
}
-// Julian Day 0 was January the first in the proleptic Julian calendar's 4713 BC
+// Julian Day 0 was January the first in the proleptic Julian calendar's 4713 BC.
+using namespace QRomanCalendrical;
+// End a Julian four-year cycle on 1 BC's leap day (Gregorian Feb 27th):
+constexpr qint64 JulianBaseJd = LeapDayGregorian1Bce - 2;
bool QJulianCalendar::dateToJulianDay(int year, int month, int day, qint64 *jd) const
{
Q_ASSERT(jd);
if (!isDateValid(year, month, day))
return false;
- if (year < 0)
- ++year;
- const qint64 c0 = month < 3 ? -1 : 0;
- const qint64 j1 = qDiv(1461 * (year + c0), 4);
- const qint64 j2 = qDiv(153 * month - 1836 * c0 - 457, 5);
- *jd = j1 + j2 + day + 1721117;
+
+ const auto yearDays = yearMonthToYearDays(year, month);
+ *jd = qDiv<4>(FourYears * yearDays.year) + yearDays.days + day + JulianBaseJd;
return true;
}
QCalendar::YearMonthDay QJulianCalendar::julianDayToDate(qint64 jd) const
{
- const qint64 y2 = jd - 1721118;
- const qint64 k2 = 4 * y2 + 3;
- const qint64 k1 = 5 * qDiv(qMod(k2, 1461), 4) + 2;
- const qint64 x1 = qDiv(k1, 153);
- const qint64 c0 = qDiv(x1 + 2, 12);
- const int y = qint16(qDiv(k2, 1461) + c0);
- const int month = quint8(x1 - 12 * c0 + 3);
- const int day = qDiv(qMod(k1, 153), 5) + 1;
- return QCalendar::YearMonthDay(y > 0 ? y : y - 1, month, day);
+ const auto year4Day = qDivMod<FourYears>(4 * (jd - JulianBaseJd) - 1);
+ // Its remainder changes by 4 per day, except at roughly yearly quotient steps.
+ const auto ymd = dayInYearToYmd(qDiv<4>(year4Day.remainder));
+ const int y = year4Day.quotient + ymd.year;
+ return QCalendar::YearMonthDay(y > 0 ? y : y - 1, ymd.month, ymd.day);
}
QT_END_NAMESPACE
diff --git a/src/corelib/time/qjuliancalendar_p.h b/src/corelib/time/qjuliancalendar_p.h
index 6212873af2..95850fd4f9 100644
--- a/src/corelib/time/qjuliancalendar_p.h
+++ b/src/corelib/time/qjuliancalendar_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QJULIAN_CALENDAR_P_H
#define QJULIAN_CALENDAR_P_H
diff --git a/src/corelib/time/qlocaltime.cpp b/src/corelib/time/qlocaltime.cpp
new file mode 100644
index 0000000000..609a5a4b37
--- /dev/null
+++ b/src/corelib/time/qlocaltime.cpp
@@ -0,0 +1,720 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#include "qlocaltime_p.h"
+#include "qplatformdefs.h"
+
+#include "private/qcalendarmath_p.h"
+#if QT_CONFIG(datetimeparser)
+#include "private/qdatetimeparser_p.h"
+#endif
+#include "private/qgregoriancalendar_p.h"
+#include "private/qnumeric_p.h"
+#include "private/qtenvironmentvariables_p.h"
+#if QT_CONFIG(timezone)
+#include "private/qtimezoneprivate_p.h"
+#endif
+
+#include <time.h>
+#ifdef Q_OS_WIN
+# include <qt_windows.h>
+#endif
+
+#ifdef __GLIBC__ // Extends struct tm with some extra fields:
+#define HAVE_TM_GMTOFF // tm_gmtoff is the UTC offset.
+#define HAVE_TM_ZONE // tm_zone is the zone abbreviation.
+#endif
+
+QT_BEGIN_NAMESPACE
+
+using namespace QtPrivate::DateTimeConstants;
+namespace {
+/*
+ Qt represents n BCE as -n, whereas struct tm's tm_year field represents a
+ year by the number of years after (negative for before) 1900, so that 1+m
+ BCE is -1900 -m; so treating 1 BCE as 0 CE. We thus shift by different
+ offsets depending on whether the year is BCE or CE.
+*/
+constexpr int tmYearFromQYear(int year) { return year - (year < 0 ? 1899 : 1900); }
+constexpr int qYearFromTmYear(int year) { return year + (year < -1899 ? 1899 : 1900); }
+
+constexpr inline qint64 tmSecsWithinDay(const struct tm &when)
+{
+ return (when.tm_hour * MINS_PER_HOUR + when.tm_min) * SECS_PER_MIN + when.tm_sec;
+}
+
+/* Call mktime() and make sense of the result.
+
+ This packages the call to mktime() with the needed determination of whether
+ that succeeded and whether the call has materially perturbed, including
+ normalizing, the struct tm it was passed (as opposed to merely filling in
+ details).
+*/
+class MkTimeResult
+{
+ // mktime()'s return on error; or last second of 1969 UTC:
+ static constexpr time_t maybeError = -1;
+ inline bool meansEnd1969();
+ bool changed(const struct tm &prior) const;
+
+public:
+ struct tm local = {}; // Describes the local time in familiar form.
+ time_t utcSecs = maybeError; // Seconds since UTC epoch.
+ bool good = false; // Ignore the rest unless this is true.
+ bool adjusted = true; // Is local at odds with prior ?
+ MkTimeResult() { local.tm_isdst = -1; }
+
+ // Note: the calls to qMkTime() and meansEnd1969() potentially modify local.
+ explicit MkTimeResult(const struct tm &prior)
+ : local(prior), utcSecs(qMkTime(&local)),
+ good(utcSecs != maybeError || meansEnd1969()),
+ adjusted(changed(prior))
+ {}
+};
+
+/* If mktime() returns -1, is it really an error ?
+
+ It might return -1 because we're looking at the last second of 1969 and
+ mktime does support times before 1970 (POSIX says "If the year is <1970 or
+ the value is negative, the relationship is undefined" and MS rejects the
+ value, consistent with that; so we don't call mktime() on MS in this case and
+ can't get -1 unless it's a real error). However, on UNIX, that's -1 UTC time
+ and all we know, aside from mktime's return, is the local time. (We could
+ check errno, but we call mktime from within a qt_scoped_lock(QBasicMutex),
+ whose unlocking and destruction of the locker might frob errno.)
+
+ We can assume time-zone offsets are less than a day, so this can only arise
+ if the struct tm describes either the last day of 1969 or the first day of
+ 1970. When we do know the offset (a glibc extension supplies it as a member
+ of struct tm), we can determine whether we're on the last second of the day,
+ refining that check. That makes for a cheap pre-test; if it holds, we can ask
+ mktime() about the preceding second; if it gives us -2, then the -1 we
+ originally saw is not (or at least didn't need to be) an error. We can then
+ synthesize a corrected value for local using the -2 result.
+*/
+inline bool MkTimeResult::meansEnd1969()
+{
+#ifdef Q_OS_WIN
+ return false;
+#else
+ if (local.tm_year < 69 || local.tm_year > 70
+# ifdef HAVE_TM_GMTOFF
+ // Africa/Monrovia had offset 00:44:30 at the epoch, so (although all
+ // other zones' offsets were round multiples of five minutes) we need
+ // the offset to determine whether the time might match:
+ || (tmSecsWithinDay(local) - local.tm_gmtoff + 1) % SECS_PER_DAY
+# endif
+ || (local.tm_year == 69 // ... and less than a day:
+ ? local.tm_mon < 11 || local.tm_mday < 31
+ : local.tm_mon > 0 || local.tm_mday > 1)) {
+ return false;
+ }
+ struct tm copy = local;
+ copy.tm_sec--; // Preceding second should get -2, not -1
+ if (qMkTime(&copy) != -2)
+ return false;
+ // The original call to qMkTime() may have returned -1 as failure, not
+ // updating local, even though it could have; so fake it here. Assumes there
+ // was no transition in the last minute of the day !
+ local = copy;
+ local.tm_sec++; // Advance back to the intended second
+ return true;
+#endif
+}
+
+bool MkTimeResult::changed(const struct tm &prior) const
+{
+ // If mktime() has been passed a copy of prior and local is its value on
+ // return, this checks whether mktime() has made a material change
+ // (including normalization) to the value, as opposed to merely filling in
+ // the fields that it's specified to fill in. It returns true if there has
+ // been any material change.
+ return !(prior.tm_year == local.tm_year && prior.tm_mon == local.tm_mon
+ && prior.tm_mday == local.tm_mday && prior.tm_hour == local.tm_hour
+ && prior.tm_min == local.tm_min && prior.tm_sec == local.tm_sec
+ && (prior.tm_isdst == -1
+ ? local.tm_isdst >= 0 : prior.tm_isdst == local.tm_isdst));
+}
+
+struct tm timeToTm(qint64 localDay, int secs)
+{
+ Q_ASSERT(0 <= secs && secs < SECS_PER_DAY);
+ const auto ymd = QGregorianCalendar::partsFromJulian(JULIAN_DAY_FOR_EPOCH + localDay);
+ struct tm local = {};
+ local.tm_year = tmYearFromQYear(ymd.year);
+ local.tm_mon = ymd.month - 1;
+ local.tm_mday = ymd.day;
+ local.tm_hour = secs / 3600;
+ local.tm_min = (secs % 3600) / 60;
+ local.tm_sec = (secs % 60);
+ local.tm_isdst = -1;
+ return local;
+}
+
+// Transitions account for a small fraction of 1% of the time.
+// So mark functions only used in handling them as cold.
+Q_DECL_COLD_FUNCTION
+struct tm matchYearMonth(struct tm when, const struct tm &base)
+{
+ // Adjust *when to be a denormal representation of the same point in time
+ // but with tm_year and tm_mon the same as base. In practice this will
+ // represent an adjacent month, so don't worry too much about optimising for
+ // any other case; we almost certainly run zero or one iteration of one of
+ // the year loops then zero or one iteration of one of the month loops.
+ while (when.tm_year > base.tm_year) {
+ --when.tm_year;
+ when.tm_mon += 12;
+ }
+ while (when.tm_year < base.tm_year) {
+ ++when.tm_year;
+ when.tm_mon -= 12;
+ }
+ Q_ASSERT(when.tm_year == base.tm_year);
+ while (when.tm_mon > base.tm_mon) {
+ const auto yearMon = QRoundingDown::qDivMod<12>(when.tm_mon);
+ int year = yearMon.quotient;
+ // We want the month before's Qt month number, which is the tm_mon mod 12:
+ int month = yearMon.remainder;
+ if (month == 0) {
+ --year;
+ month = 12;
+ }
+ year += when.tm_year;
+ when.tm_mday += QGregorianCalendar::monthLength(month, qYearFromTmYear(year));
+ --when.tm_mon;
+ }
+ while (when.tm_mon < base.tm_mon) {
+ const auto yearMon = QRoundingDown::qDivMod<12>(when.tm_mon);
+ // Qt month number is offset from tm_mon by one:
+ when.tm_mday -= QGregorianCalendar::monthLength(
+ yearMon.remainder + 1, qYearFromTmYear(yearMon.quotient + when.tm_year));
+ ++when.tm_mon;
+ }
+ Q_ASSERT(when.tm_mon == base.tm_mon);
+ return when;
+}
+
+Q_DECL_COLD_FUNCTION
+struct tm adjacentDay(struct tm when, int dayStep)
+{
+ // Before we adjust it, when is a return from timeToTm(), so in normal form.
+ Q_ASSERT(dayStep * dayStep == 1);
+ when.tm_mday += dayStep;
+ // That may have bumped us across a month boundary or even a year one.
+ // So now we normalize it.
+
+ if (dayStep < 0) {
+ if (when.tm_mday <= 0) {
+ // Month before's day-count; but tm_mon's value is one less than Qt's
+ // month numbering so, before we decrement it, it has the value we need,
+ // unless it's 0.
+ int daysInMonth = when.tm_mon
+ ? QGregorianCalendar::monthLength(when.tm_mon, qYearFromTmYear(when.tm_year))
+ : QGregorianCalendar::monthLength(12, qYearFromTmYear(when.tm_year - 1));
+ when.tm_mday += daysInMonth;
+ if (--when.tm_mon < 0) {
+ --when.tm_year;
+ when.tm_mon = 11;
+ }
+ Q_ASSERT(when.tm_mday >= 1);
+ }
+ } else if (when.tm_mday > 28) {
+ // We have to wind through months one at a time, since their lengths vary.
+ int daysInMonth = QGregorianCalendar::monthLength(
+ when.tm_mon + 1, qYearFromTmYear(when.tm_year));
+ if (when.tm_mday > daysInMonth) {
+ when.tm_mday -= daysInMonth;
+ if (++when.tm_mon > 11) {
+ ++when.tm_year;
+ when.tm_mon = 0;
+ }
+ Q_ASSERT(when.tm_mday <= QGregorianCalendar::monthLength(
+ when.tm_mon + 1, qYearFromTmYear(when.tm_year)));
+ }
+ }
+ return when;
+}
+
+Q_DECL_COLD_FUNCTION
+qint64 secondsBetween(const struct tm &start, const struct tm &stop)
+{
+ // Nominal difference between start and stop, in seconds (negative if start
+ // is after stop); may differ from actual UTC difference if there's a
+ // transition between them.
+ struct tm from = matchYearMonth(start, stop);
+ qint64 diff = stop.tm_mday - from.tm_mday; // in days
+ diff = diff * 24 + stop.tm_hour - from.tm_hour; // in hours
+ diff = diff * 60 + stop.tm_min - from.tm_min; // in minutes
+ return diff * 60 + stop.tm_sec - from.tm_sec; // in seconds
+}
+
+Q_DECL_COLD_FUNCTION
+MkTimeResult hopAcrossGap(const MkTimeResult &outside, const struct tm &base)
+{
+ // base fell in a gap; outside is one resolution
+ // This returns the other resolution, if possible.
+ const qint64 shift = secondsBetween(outside.local, base);
+ struct tm across;
+ // Shift is the nominal time adjustment between outside and base; now obtain
+ // the actual time that far from outside:
+ if (qLocalTime(outside.utcSecs + shift, &across)) {
+ const qint64 wider = secondsBetween(outside.local, across);
+ // That should be bigger than shift (typically by a factor of two), in
+ // the same direction:
+ if (shift > 0 ? wider > shift : wider < shift) {
+ MkTimeResult result(across);
+ if (result.good && !result.adjusted)
+ return result;
+ }
+ }
+ // This can surely only arise if the other resolution lies outside the
+ // time_t-range supported by the system functions.
+ return {};
+}
+
+Q_DECL_COLD_FUNCTION
+MkTimeResult resolveRejected(struct tm base, MkTimeResult result,
+ QDateTimePrivate::TransitionOptions resolve)
+{
+ // May result from a time outside the supported range of system time_t
+ // functions, or from a gap (on a platform where mktime() rejects them).
+ // QDateTime filters on times well outside the supported range, but may
+ // pass values only slightly outside the range.
+
+ // The easy case - no need to find a resolution anyway:
+ if (!resolve.testAnyFlags(QDateTimePrivate::GapMask))
+ return {};
+
+ constexpr time_t twoDaysInSeconds = 2 * 24 * 60 * 60;
+ // Bracket base, one day each side (in case the zone skipped a whole day):
+ MkTimeResult early(adjacentDay(base, -1));
+ MkTimeResult later(adjacentDay(base, +1));
+ if (!early.good || !later.good) // Assume out of range, rather than gap.
+ return {};
+
+ // OK, looks like a gap.
+ Q_ASSERT(twoDaysInSeconds + early.utcSecs > later.utcSecs);
+ result.adjusted = true;
+
+ // Extrapolate backwards from later if this option is set:
+ QDateTimePrivate::TransitionOption beforeLater = QDateTimePrivate::GapUseBefore;
+ if (resolve.testFlag(QDateTimePrivate::FlipForReverseDst)) {
+ // Reverse DST has DST before a gap and not after:
+ if (early.local.tm_isdst == 1 && !later.local.tm_isdst)
+ beforeLater = QDateTimePrivate::GapUseAfter;
+ }
+ if (resolve.testFlag(beforeLater)) // Result will be before the gap:
+ result.utcSecs = later.utcSecs - secondsBetween(base, later.local);
+ else // Result will be after the gap:
+ result.utcSecs = early.utcSecs + secondsBetween(early.local, base);
+
+ if (!qLocalTime(result.utcSecs, &result.local)) // Abandon hope.
+ return {};
+
+ return result;
+}
+
+Q_DECL_COLD_FUNCTION
+bool preferAlternative(QDateTimePrivate::TransitionOptions resolve,
+ // is_dst flags of incumbent and an alternative:
+ int gotDst, int altDst,
+ // True precisely if alternative selects a later UTC time:
+ bool altIsLater,
+ // True for a gap, false for a fold:
+ bool inGap)
+{
+ // If resolve has this option set, prefer the later candidate, else the earlier:
+ QDateTimePrivate::TransitionOption preferLater = inGap ? QDateTimePrivate::GapUseAfter
+ : QDateTimePrivate::FoldUseAfter;
+ if (resolve.testFlag(QDateTimePrivate::FlipForReverseDst)) {
+ // gotDst and altDst are {-1: unknown, 0: standard, 1: daylight-saving}
+ // So gotDst ^ altDst is 1 precisely if exactly one candidate thinks it's DST.
+ if ((altDst ^ gotDst) == 1) {
+ // In this case, we can tell whether we have reversed DST: that's a
+ // gap with DST before it or a fold with DST after it.
+#if 1
+ const bool isReversed = (altDst == 1) != (altIsLater == inGap);
+#else // Pedagogic version of the same thing:
+ bool isReversed;
+ if (altIsLater == inGap) // alt is after a gap or before a fold, so summer-time
+ isReversed = altDst != 1; // flip if summer-time isn't DST
+ else // alt is before a gap or after a fold, so winter-time
+ isReversed = altDst == 1; // flip if winter-time is DST
+#endif
+ if (isReversed) {
+ preferLater = inGap ? QDateTimePrivate::GapUseBefore
+ : QDateTimePrivate::FoldUseBefore;
+ }
+ } // Otherwise, we can't tell, so assume not.
+ }
+ return resolve.testFlag(preferLater) == altIsLater;
+}
+
+/*
+ Determine UTC time and offset, if possible, at a given local time.
+
+ The local time is specified as a number of seconds since the epoch (so, in
+ effect, a time_t, albeit delivered as qint64). If the specified local time
+ falls in a transition, resolve determines what to do.
+
+ If the specified local time is outside what the system time_t APIs will
+ handle, this fails.
+*/
+MkTimeResult resolveLocalTime(qint64 local, QDateTimePrivate::TransitionOptions resolve)
+{
+ const auto localDaySecs = QRoundingDown::qDivMod<SECS_PER_DAY>(local);
+ struct tm base = timeToTm(localDaySecs.quotient, localDaySecs.remainder);
+
+ // Get provisional result (correct > 99.9 % of the time):
+ MkTimeResult result(base);
+
+ // Our callers (mostly) deal with questions of being within the range that
+ // system time_t functions can handle, and timeToTm() gave us data in
+ // normalized form, so the only excuse for !good or a change to the HH:mm:ss
+ // fields (aside from being at the boundary of time_t's supported range) is
+ // that we hit a gap, although we have to handle these cases differently:
+ if (!result.good) {
+ // Rejected. The tricky case: maybe mktime() doesn't resolve gaps.
+ return resolveRejected(base, result, resolve);
+ } else if (result.local.tm_isdst < 0) {
+ // Apparently success without knowledge of whether this is DST or not.
+ // Should not happen, but that means our usual understanding of what the
+ // system is up to has gone out the window. So just let it be.
+ } else if (result.adjusted) {
+ // Shunted out of a gap.
+ if (!resolve.testAnyFlags(QDateTimePrivate::GapMask)) {
+ result = {};
+ return result;
+ }
+
+ // Try to obtain a matching point on the other side of the gap:
+ const MkTimeResult flipped = hopAcrossGap(result, base);
+ // Even if that failed, result may be the correct resolution
+
+ if (preferAlternative(resolve, result.local.tm_isdst, flipped.local.tm_isdst,
+ flipped.utcSecs > result.utcSecs, true)) {
+ // If hopAcrossGap() failed and we do need its answer, give up.
+ if (!flipped.good || flipped.adjusted)
+ return {};
+
+ // As resolution of local, flipped involves adjustment (across gap):
+ result = flipped;
+ result.adjusted = true;
+ }
+ } else if (resolve.testFlag(QDateTimePrivate::FlipForReverseDst)
+ // In fold, DST counts as before and standard as after -
+ // we may not need to check whether we're in a transition:
+ && resolve.testFlag(result.local.tm_isdst ? QDateTimePrivate::FoldUseBefore
+ : QDateTimePrivate::FoldUseAfter)) {
+ // We prefer DST or standard and got what we wanted, so we're good.
+ // As below, but we don't need to check, because we're on the side of
+ // the transition that it would select as valid, if we were near one.
+ // NB: this branch is routinely exercised, when QDT::Data::isShort()
+ // obliges us to rediscover an offsetFromUtc that ShortData has no space
+ // to store, as it does remember the DST status we got before.
+ } else {
+ // What we gave was valid. However, it might have been in a fall-back.
+ // If so, the same input but with tm_isdst flipped should also be valid.
+ struct tm copy = base;
+ copy.tm_isdst = !result.local.tm_isdst;
+ const MkTimeResult flipped(copy);
+ if (flipped.good && !flipped.adjusted) {
+ // We're in a fall-back
+ if (!resolve.testAnyFlags(QDateTimePrivate::FoldMask)) {
+ result = {};
+ return result;
+ }
+
+ // Work out which repeat to use:
+ if (preferAlternative(resolve, result.local.tm_isdst, flipped.local.tm_isdst,
+ flipped.utcSecs > result.utcSecs, false)) {
+ result = flipped;
+ }
+ } // else: not in a transition, nothing to worry about.
+ }
+ return result;
+}
+
+inline std::optional<qint64> tmToJd(const struct tm &date)
+{
+ return QGregorianCalendar::julianFromParts(qYearFromTmYear(date.tm_year),
+ date.tm_mon + 1, date.tm_mday);
+}
+
+#define IC(N) std::integral_constant<qint64, N>()
+
+// True if combining day and seconds overflows qint64; otherwise, sets *epochSeconds
+inline bool daysAndSecondsOverflow(qint64 julianDay, qint64 daySeconds, qint64 *epochSeconds)
+{
+ return qMulOverflow(julianDay - JULIAN_DAY_FOR_EPOCH, IC(SECS_PER_DAY), epochSeconds)
+ || qAddOverflow(*epochSeconds, daySeconds, epochSeconds);
+}
+
+// True if combining seconds and millis overflows; otherwise sets *epochMillis
+inline bool secondsAndMillisOverflow(qint64 epochSeconds, qint64 millis, qint64 *epochMillis)
+{
+ return qMulOverflow(epochSeconds, IC(MSECS_PER_SEC), epochMillis)
+ || qAddOverflow(*epochMillis, millis, epochMillis);
+}
+
+#undef IC
+
+} // namespace
+
+namespace QLocalTime {
+
+#ifndef QT_BOOTSTRAPPED
+// Even if local time is currently in DST, this returns the standard time offset
+// (in seconds) nominally in effect at present:
+int getCurrentStandardUtcOffset()
+{
+#ifdef Q_OS_WIN
+ TIME_ZONE_INFORMATION tzInfo;
+ if (GetTimeZoneInformation(&tzInfo) != TIME_ZONE_ID_INVALID) {
+ int bias = tzInfo.Bias; // In minutes.
+ // StandardBias is usually zero, but include it if given:
+ if (tzInfo.StandardDate.wMonth) // Zero month means ignore StandardBias.
+ bias += tzInfo.StandardBias;
+ // MS's bias is +ve in the USA, so minutes *behind* UTC - we want seconds *ahead*:
+ return -bias * SECS_PER_MIN;
+ }
+#else
+ qTzSet();
+ const time_t curr = time(nullptr);
+ if (curr != -1) {
+ /* Set t to the UTC representation of curr; the time whose local
+ standard time representation coincides with that differs from curr by
+ local time's standard offset. Note that gmtime() leaves the tm_isdst
+ flag set to 0, so mktime() will, even if local time is currently
+ using DST, return the time since epoch at which local standard time
+ would have the same representation as UTC's representation of
+ curr. The fact that mktime() also flips tm_isdst and updates the time
+ fields to the DST-equivalent time needn't concern us here; all that
+ matters is that it returns the time after epoch at which standard
+ time's representation would have matched UTC's, had it been in
+ effect.
+ */
+# if defined(_POSIX_THREAD_SAFE_FUNCTIONS)
+ struct tm t;
+ if (gmtime_r(&curr, &t)) {
+ time_t mkt = qMkTime(&t);
+ int offset = int(curr - mkt);
+ Q_ASSERT(std::abs(offset) <= SECS_PER_DAY);
+ return offset;
+ }
+# else
+ if (struct tm *tp = gmtime(&curr)) {
+ struct tm t = *tp; // Copy it quick, hopefully before it can get stomped
+ time_t mkt = qMkTime(&t);
+ int offset = int(curr - mkt);
+ Q_ASSERT(std::abs(offset) <= SECS_PER_DAY);
+ return offset;
+ }
+# endif
+ } // else, presumably: errno == EOVERFLOW
+#endif // Platform choice
+ qDebug("Unable to determine current standard time offset from UTC");
+ // We can't tell, presume UTC.
+ return 0;
+}
+
+// This is local time's offset (in seconds), at the specified time, including
+// any DST part.
+int getUtcOffset(qint64 atMSecsSinceEpoch)
+{
+ return QDateTimePrivate::expressUtcAsLocal(atMSecsSinceEpoch).offset;
+}
+#endif // QT_BOOTSTRAPPED
+
+// Calls the platform variant of localtime() for the given utcMillis, and
+// returns the local milliseconds, offset from UTC and DST status.
+QDateTimePrivate::ZoneState utcToLocal(qint64 utcMillis)
+{
+ const auto epoch = QRoundingDown::qDivMod<MSECS_PER_SEC>(utcMillis);
+ const time_t epochSeconds = epoch.quotient;
+ const int msec = epoch.remainder;
+ Q_ASSERT(msec >= 0 && msec < MSECS_PER_SEC);
+ if (qint64(epochSeconds) * MSECS_PER_SEC + msec != utcMillis) // time_t range too narrow
+ return {utcMillis};
+
+ tm local;
+ if (!qLocalTime(epochSeconds, &local))
+ return {utcMillis};
+
+ auto jd = tmToJd(local);
+ if (Q_UNLIKELY(!jd))
+ return {utcMillis};
+
+ const qint64 daySeconds = tmSecsWithinDay(local);
+ Q_ASSERT(0 <= daySeconds && daySeconds < SECS_PER_DAY);
+ qint64 localSeconds, localMillis;
+ if (Q_UNLIKELY(daysAndSecondsOverflow(*jd, daySeconds, &localSeconds)
+ || secondsAndMillisOverflow(localSeconds, qint64(msec), &localMillis))) {
+ return {utcMillis};
+ }
+ const auto dst
+ = local.tm_isdst ? QDateTimePrivate::DaylightTime : QDateTimePrivate::StandardTime;
+ return { localMillis, int(localSeconds - epochSeconds), dst };
+}
+
+QString localTimeAbbbreviationAt(qint64 local, QDateTimePrivate::TransitionOptions resolve)
+{
+ auto use = resolveLocalTime(QRoundingDown::qDiv<MSECS_PER_SEC>(local), resolve);
+ if (!use.good)
+ return {};
+#ifdef HAVE_TM_ZONE
+ if (use.local.tm_zone)
+ return QString::fromLocal8Bit(use.local.tm_zone);
+#endif
+ return qTzName(use.local.tm_isdst > 0 ? 1 : 0);
+}
+
+QDateTimePrivate::ZoneState mapLocalTime(qint64 local, QDateTimePrivate::TransitionOptions resolve)
+{
+ // Revised later to match what use.local tells us:
+ qint64 localSecs = local / MSECS_PER_SEC;
+ auto use = resolveLocalTime(localSecs, resolve);
+ if (!use.good)
+ return {local};
+
+ qint64 millis = local - localSecs * MSECS_PER_SEC;
+ // Division is defined to round towards zero:
+ Q_ASSERT(local < 0 ? (millis <= 0 && millis > -MSECS_PER_SEC)
+ : (millis >= 0 && millis < MSECS_PER_SEC));
+
+ QDateTimePrivate::DaylightStatus dst =
+ use.local.tm_isdst > 0 ? QDateTimePrivate::DaylightTime : QDateTimePrivate::StandardTime;
+
+#ifdef HAVE_TM_GMTOFF
+ const int offset = use.local.tm_gmtoff;
+ localSecs = offset + use.utcSecs;
+#else
+ // Provisional offset, until we have a revised localSecs:
+ int offset = localSecs - use.utcSecs;
+ auto jd = tmToJd(use.local);
+ if (Q_UNLIKELY(!jd))
+ return {local, offset, dst, false};
+
+ qint64 daySecs = tmSecsWithinDay(use.local);
+ Q_ASSERT(0 <= daySecs && daySecs < SECS_PER_DAY);
+ if (daySecs > 0 && *jd < JULIAN_DAY_FOR_EPOCH) {
+ jd = *jd + 1;
+ daySecs -= SECS_PER_DAY;
+ }
+ if (Q_UNLIKELY(daysAndSecondsOverflow(*jd, daySecs, &localSecs)))
+ return {local, offset, dst, false};
+
+ // Use revised localSecs to refine offset:
+ offset = localSecs - use.utcSecs;
+#endif // HAVE_TM_GMTOFF
+
+ // The only way localSecs and millis can now have opposite sign is for
+ // resolution of the local time to have kicked us across the epoch, in which
+ // case there's no danger of overflow. So if overflow is in danger of
+ // happening, we're already doing the best we can to avoid it.
+ qint64 revised;
+ if (secondsAndMillisOverflow(localSecs, millis, &revised))
+ return {local, offset, QDateTimePrivate::UnknownDaylightTime, false};
+ return {revised, offset, dst, true};
+}
+
+/*!
+ \internal
+ Determine the range of the system time_t functions.
+
+ On MS-systems (where time_t is 64-bit by default), the start-point is the
+ epoch, the end-point is the end of the year 3000 (for mktime(); for
+ _localtime64_s it's 18 days later, but we ignore that here). Darwin's range
+ runs from the beginning of 1900 to the end of its 64-bit time_t and Linux
+ uses the full range of time_t (but this might still be 32-bit on some
+ embedded systems).
+
+ (One potential constraint might appear to be the range of struct tm's int
+ tm_year, only allowing time_t to represent times from the start of year
+ 1900+INT_MIN to the end of year INT_MAX. The 26-bit number of seconds in a
+ year means that a 64-bit time_t can indeed represent times outside the range
+ of 32-bit years, by a factor of 32 - but the range of representable
+ milliseconds needs ten more bits than that of seconds, so can't reach the
+ ends of the 32-bit year range.)
+
+ Given the diversity of ranges, we conservatively estimate the actual
+ supported range by experiment on the first call to qdatetime.cpp's
+ millisInSystemRange() by exploration among the known candidates, converting
+ the result to milliseconds and flagging whether each end is the qint64
+ range's bound (so millisInSystemRange will know not to try to pad beyond
+ those bounds). The probed date-times are somewhat inside the range, but
+ close enough to the relevant bound that we can be fairly sure the bound is
+ reached, if the probe succeeds.
+*/
+SystemMillisRange computeSystemMillisRange()
+{
+ // Assert this here, as this is called just once, in a static initialization.
+ Q_ASSERT(QGregorianCalendar::julianFromParts(1970, 1, 1) == JULIAN_DAY_FOR_EPOCH);
+
+ constexpr qint64 TIME_T_MAX = std::numeric_limits<time_t>::max();
+ using Bounds = std::numeric_limits<qint64>;
+ constexpr bool isNarrow = Bounds::max() / MSECS_PER_SEC > TIME_T_MAX;
+ if constexpr (isNarrow) {
+ const qint64 msecsMax = quint64(TIME_T_MAX) * MSECS_PER_SEC - 1 + MSECS_PER_SEC;
+ const qint64 msecsMin = -1 - msecsMax; // TIME_T_MIN is -1 - TIME_T_MAX
+ // If we reach back to msecsMin, use it; otherwise, assume 1970 cut-off (MS).
+ struct tm local = {};
+ local.tm_year = tmYearFromQYear(1901);
+ local.tm_mon = 11;
+ local.tm_mday = 15; // A day and a bit after the start of 32-bit time_t:
+ local.tm_isdst = -1;
+ return {qMkTime(&local) == -1 ? 0 : msecsMin, msecsMax, false, false};
+ } else {
+ const struct { int year; qint64 millis; } starts[] = {
+ { int(QDateTime::YearRange::First) + 1, Bounds::min() },
+ // Beginning of the Common Era:
+ { 1, -Q_INT64_C(62135596800000) },
+ // Invention of the Gregorian calendar:
+ { 1582, -Q_INT64_C(12244089600000) },
+ // Its adoption by the anglophone world:
+ { 1752, -Q_INT64_C(6879427200000) },
+ // Before this, struct tm's tm_year is negative (Darwin):
+ { 1900, -Q_INT64_C(2208988800000) },
+ }, ends[] = {
+ { int(QDateTime::YearRange::Last) - 1, Bounds::max() },
+ // MS's end-of-range, end of year 3000:
+ { 3000, Q_INT64_C(32535215999999) },
+ };
+ // Assume we do at least reach the end of a signed 32-bit time_t (since
+ // our actual time_t is bigger than that):
+ qint64 stop =
+ quint64(std::numeric_limits<qint32>::max()) * MSECS_PER_SEC - 1 + MSECS_PER_SEC;
+ // Cleared if first pass round loop fails:
+ bool stopMax = true;
+ for (const auto c : ends) {
+ struct tm local = {};
+ local.tm_year = tmYearFromQYear(c.year);
+ local.tm_mon = 11;
+ local.tm_mday = 31;
+ local.tm_hour = 23;
+ local.tm_min = local.tm_sec = 59;
+ local.tm_isdst = -1;
+ if (qMkTime(&local) != -1) {
+ stop = c.millis;
+ break;
+ }
+ stopMax = false;
+ }
+ bool startMin = true;
+ for (const auto c : starts) {
+ struct tm local {};
+ local.tm_year = tmYearFromQYear(c.year);
+ local.tm_mon = 1;
+ local.tm_mday = 1;
+ local.tm_isdst = -1;
+ if (qMkTime(&local) != -1)
+ return {c.millis, stop, startMin, stopMax};
+ startMin = false;
+ }
+ return {0, stop, false, stopMax};
+ }
+}
+
+} // QLocalTime
+
+QT_END_NAMESPACE
diff --git a/src/corelib/time/qlocaltime_p.h b/src/corelib/time/qlocaltime_p.h
new file mode 100644
index 0000000000..5e31d5e9cc
--- /dev/null
+++ b/src/corelib/time/qlocaltime_p.h
@@ -0,0 +1,46 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QLOCALTIME_P_H
+#define QLOCALTIME_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an implementation
+// detail. This header file may change from version to version without notice,
+// or even be removed.
+//
+// We mean it.
+//
+
+#include <QtCore/private/qglobal_p.h>
+#include <QtCore/private/qdatetime_p.h>
+
+QT_BEGIN_NAMESPACE
+
+// Packaging system time_t functions
+namespace QLocalTime {
+#ifndef QT_BOOTSTRAPPED
+// Support for V4's Date implelenentation.
+// Each returns offset from UTC in seconds (or 0 if unknown).
+// V4 shall need to multiply by 1000.
+// Offset is -ve East of Greenwich, +ve west of Greenwich.
+// Add it to UTC seconds since epoch to get local seconds since nominal local epoch.
+Q_CORE_EXPORT int getCurrentStandardUtcOffset();
+Q_CORE_EXPORT int getUtcOffset(qint64 atMSecsSinceEpoch);
+#endif // QT_BOOTSTRAPPED
+
+// Support for QDateTime
+QDateTimePrivate::ZoneState utcToLocal(qint64 utcMillis);
+QString localTimeAbbbreviationAt(qint64 local, QDateTimePrivate::TransitionOptions resolve);
+QDateTimePrivate::ZoneState mapLocalTime(qint64 local, QDateTimePrivate::TransitionOptions resolve);
+
+struct SystemMillisRange { qint64 min, max; bool minClip, maxClip; };
+SystemMillisRange computeSystemMillisRange();
+}
+
+QT_END_NAMESPACE
+
+#endif // QLOCALTIME_P_H
diff --git a/src/corelib/time/qmilankoviccalendar.cpp b/src/corelib/time/qmilankoviccalendar.cpp
index 7e70141e1b..a3ffa2a305 100644
--- a/src/corelib/time/qmilankoviccalendar.cpp
+++ b/src/corelib/time/qmilankoviccalendar.cpp
@@ -1,47 +1,10 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qglobal.h"
#include "qmilankoviccalendar_p.h"
#include "qcalendarmath_p.h"
-#include <QtCore/qmath.h>
-#include <QtCore/qlocale.h>
+
#include <QtCore/qdatetime.h>
QT_BEGIN_NAMESPACE
@@ -89,48 +52,48 @@ bool QMilankovicCalendar::isLeapYear(int year) const
return false;
if (year <= 0)
++year;
- if (qMod(year, 4))
+ if (qMod<4>(year))
return false;
- if (qMod(year, 100) == 0) {
- const qint16 century = qMod(qDiv(year, 100), 9);
+ const auto yeardm = qDivMod<100>(year);
+ if (yeardm.remainder == 0) {
+ const qint16 century = qMod<9>(yeardm.quotient);
if (century != 2 && century != 6)
return false;
}
return true;
}
+using namespace QRomanCalendrical;
+// End a Milankovic nine-century cycle on 1 BC, Feb 28 (Gregorian Feb 29):
+constexpr qint64 MilankovicBaseJd = LeapDayGregorian1Bce;
+// Leap years every 4 years, except for 7 turn-of-century years per nine centuries:
+constexpr unsigned NineCenturies = 365 * 900 + 900 / 4 - 7;
+// When the turn-of-century is a leap year, the century has 25 leap years in it:
+constexpr unsigned LeapCentury = 365 * 100 + 25;
+
bool QMilankovicCalendar::dateToJulianDay(int year, int month, int day, qint64 *jd) const
{
Q_ASSERT(jd);
if (!isDateValid(year, month, day))
return false;
- if (year <= 0)
- ++year;
- const qint16 c0 = month < 3 ? -1 : 0;
- const qint16 x1 = month - 12 * c0 - 3;
- const qint16 x4 = year + c0;
- const qint16 x3 = qDiv(x4, 100);
- const qint16 x2 = qMod(x4, 100);
- *jd = qDiv(328718 * x3 + 6, 9)
- + qDiv(36525 * x2 , 100)
- + qDiv(153 * x1 + 2 , 5)
- + day + 1721119;
+
+ const auto yearDays = yearMonthToYearDays(year, month);
+ const auto centuryYear = qDivMod<100>(yearDays.year);
+ const qint64 fromYear = qDiv<9>(NineCenturies * centuryYear.quotient + 6)
+ + qDiv<100>(LeapCentury * centuryYear.remainder);
+ *jd = fromYear + yearDays.days + day + MilankovicBaseJd;
return true;
}
QCalendar::YearMonthDay QMilankovicCalendar::julianDayToDate(qint64 jd) const
{
- const qint64 k3 = 9 * (jd - 1721120) + 2;
- const qint64 x3 = qDiv(k3, 328718);
- const qint64 k2 = 100 * qDiv(qMod(k3, 328718), 9) + 99;
- const qint64 k1 = qDiv(qMod(k2, 36525), 100) * 5 + 2;
- const qint64 x2 = qDiv(k2, 36525);
- const qint64 x1 = qDiv(5 * qDiv(qMod(k2, 36525), 100) + 2, 153);
- const qint64 c0 = qDiv(x1 + 2, 12);
- const int y = 100 * x3 + x2 + c0;
- const int month = x1 - 12 * c0 + 3;
- const int day = qDiv(qMod(k1, 153), 5) + 1;
- return QCalendar::YearMonthDay(y > 0 ? y : y - 1, month, day);
+ const auto century9Day = qDivMod<NineCenturies>(9 * (jd - MilankovicBaseJd) - 7);
+ // Its remainder changes by 9 per day, except roughly once per century.
+ const auto year100Day = qDivMod<LeapCentury>(100 * qDiv<9>(century9Day.remainder) + 99);
+ // Its remainder changes by 100 per day, except roughly once per year.
+ const auto ymd = dayInYearToYmd(qDiv<100>(year100Day.remainder));
+ const int y = 100 * century9Day.quotient + year100Day.quotient + ymd.year;
+ return QCalendar::YearMonthDay(y > 0 ? y : y - 1, ymd.month, ymd.day);
}
QT_END_NAMESPACE
diff --git a/src/corelib/time/qmilankoviccalendar_p.h b/src/corelib/time/qmilankoviccalendar_p.h
index 31c6bfd351..c6797ac221 100644
--- a/src/corelib/time/qmilankoviccalendar_p.h
+++ b/src/corelib/time/qmilankoviccalendar_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QMILANKOVICCALENDAR_CALENDAR_P_H
#define QMILANKOVICCALENDAR_CALENDAR_P_H
diff --git a/src/corelib/time/qromancalendar.cpp b/src/corelib/time/qromancalendar.cpp
index 98b53eb9cf..0a7399ea51 100644
--- a/src/corelib/time/qromancalendar.cpp
+++ b/src/corelib/time/qromancalendar.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qglobal.h"
#include "qromancalendar_p.h"
@@ -51,11 +15,10 @@ QT_BEGIN_NAMESPACE
\brief The QRomanCalendar class is a shared base for calendars based on the
ancient Roman calendar.
- \section1
-
- Calendars based on the ancient Roman calendar share the names of months,
- whose lengths depend in a common way on whether the year is a leap
- year. They differ in how they determine which years are leap years.
+ Calendars based on the ancient Roman calendar have several common properties:
+ they have the same names for months, the month lengths depend in a common
+ way on whether the year is a leap year. They differ in how they determine
+ which years are leap years.
\sa QGregorianCalendar, QJulianCalendar, QMilankovicCalendar
*/
@@ -94,12 +57,12 @@ bool QRomanCalendar::isSolar() const
const QCalendarLocale *QRomanCalendar::localeMonthIndexData() const
{
- return locale_data;
+ return QtPrivate::Roman::locale_data;
}
const char16_t *QRomanCalendar::localeMonthData() const
{
- return months_data;
+ return QtPrivate::Roman::months_data;
}
QT_END_NAMESPACE
diff --git a/src/corelib/time/qromancalendar_data_p.h b/src/corelib/time/qromancalendar_data_p.h
index c3982e8407..320a19ccdc 100644
--- a/src/corelib/time/qromancalendar_data_p.h
+++ b/src/corelib/time/qromancalendar_data_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2019 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2019 The Qt Company Ltd.
+// SPDX-License-Identifier: Unicode-3.0
#ifndef QROMANCALENDAR_DATA_P_H
#define QROMANCALENDAR_DATA_P_H
@@ -56,11 +20,13 @@
QT_BEGIN_NAMESPACE
+namespace QtPrivate::Roman {
+
// GENERATED PART STARTS HERE
/*
- This part of the file was generated on 2021-11-09 from the
- Common Locale Data Repository v40
+ This part of the file was generated on 2024-01-09 from the
+ Common Locale Data Repository v44.1
http://www.unicode.org/cldr/
@@ -69,2708 +35,5052 @@ QT_BEGIN_NAMESPACE
edited) CLDR data; see qtbase/util/locale_database/.
*/
-static const QCalendarLocale locale_data[] = {
+static constexpr QCalendarLocale locale_data[] = {
// lang script terr sLong long sShrt short sNarw narow Sizes...
{ 1, 0, 0, 0, 0, 85, 85, 132, 155, 85, 85, 47, 47, 23, 26 },// C/AnyScript/AnyTerritory
- { 2, 27, 90, 181, 181, 181, 181, 155, 155, 47, 47, 47, 47, 26, 26 },// Abkhazian/Cyrillic/Georgia
- { 3, 66, 77, 181, 181, 181, 181, 155, 155, 47, 47, 47, 47, 26, 26 },// Afar/Latin/Ethiopia
- { 4, 66, 216, 228, 228, 319, 319, 132, 132, 91, 91, 58, 58, 23, 23 },// Afrikaans/Latin/South Africa
- { 4, 66, 162, 228, 228, 319, 319, 132, 132, 91, 91, 58, 58, 23, 23 },// Afrikaans/Latin/Namibia
- { 5, 66, 40, 377, 377, 571, 571, 618, 618,194,194, 47, 47, 23, 23 },// Aghem/Latin/Cameroon
- { 6, 66, 92, 641, 641, 832, 832, 155, 155,191,191, 47, 47, 26, 26 },// Akan/Latin/Ghana
- { 8, 66, 40, 181, 181, 181, 181, 155, 155, 47, 47, 47, 47, 26, 26 },// Akoose/Latin/Cameroon
- { 9, 66, 3, 879, 879, 956, 956, 1005, 1005, 77, 77, 49, 49, 26, 26 },// Albanian/Latin/Albania
- { 9, 66, 126, 879, 879, 956, 956, 1005, 1005, 77, 77, 49, 49, 26, 26 },// Albanian/Latin/Kosovo
- { 9, 66, 140, 879, 879, 956, 956, 1005, 1005, 77, 77, 49, 49, 26, 26 },// Albanian/Latin/Macedonia
- { 11, 33, 77, 1031, 1031, 1091, 1091, 1136, 1136, 60, 60, 45, 45, 23, 23 },// Amharic/Ethiopic/Ethiopia
- { 14, 4, 71, 1159, 1159, 1159, 1159, 1233, 1233, 74, 74, 74, 74, 23, 23 },// Arabic/Arabic/Egypt
- { 14, 4, 4, 1256, 1256, 1256, 1256, 1326, 1326, 70, 70, 70, 70, 23, 23 },// Arabic/Arabic/Algeria
- { 14, 4, 19, 1159, 1159, 1159, 1159, 1233, 1233, 74, 74, 74, 74, 23, 23 },// Arabic/Arabic/Bahrain
- { 14, 4, 48, 1159, 1159, 1159, 1159, 1233, 1233, 74, 74, 74, 74, 23, 23 },// Arabic/Arabic/Chad
- { 14, 4, 55, 1159, 1159, 1159, 1159, 1233, 1233, 74, 74, 74, 74, 23, 23 },// Arabic/Arabic/Comoros
- { 14, 4, 67, 1159, 1159, 1159, 1159, 1233, 1233, 74, 74, 74, 74, 23, 23 },// Arabic/Arabic/Djibouti
- { 14, 4, 74, 1159, 1159, 1159, 1159, 1233, 1233, 74, 74, 74, 74, 23, 23 },// Arabic/Arabic/Eritrea
- { 14, 4, 113, 1349, 1349, 1349, 1440, 1531, 1531, 91, 91, 91, 91, 23, 23 },// Arabic/Arabic/Iraq
- { 14, 4, 116, 1159, 1159, 1159, 1159, 1233, 1233, 74, 74, 74, 74, 23, 23 },// Arabic/Arabic/Israel
- { 14, 4, 122, 1349, 1349, 1349, 1349, 1531, 1531, 91, 91, 91, 91, 23, 23 },// Arabic/Arabic/Jordan
- { 14, 4, 127, 1159, 1159, 1159, 1159, 1233, 1233, 74, 74, 74, 74, 23, 23 },// Arabic/Arabic/Kuwait
- { 14, 4, 132, 1349, 1349, 1349, 1349, 1531, 1531, 91, 91, 91, 91, 23, 23 },// Arabic/Arabic/Lebanon
- { 14, 4, 135, 1159, 1159, 1159, 1159, 1233, 1233, 74, 74, 74, 74, 23, 23 },// Arabic/Arabic/Libya
- { 14, 4, 149, 1554, 1554, 1554, 1554, 1625, 1625, 71, 71, 71, 71, 23, 23 },// Arabic/Arabic/Mauritania
- { 14, 4, 159, 1648, 1648, 1648, 1648, 1717, 1717, 69, 69, 69, 69, 23, 23 },// Arabic/Arabic/Morocco
- { 14, 4, 176, 1159, 1159, 1159, 1159, 1233, 1233, 74, 74, 74, 74, 23, 23 },// Arabic/Arabic/Oman
- { 14, 4, 180, 1349, 1349, 1349, 1349, 1531, 1531, 91, 91, 91, 91, 23, 23 },// Arabic/Arabic/Palestinian Territories
- { 14, 4, 190, 1159, 1159, 1159, 1159, 1233, 1233, 74, 74, 74, 74, 23, 23 },// Arabic/Arabic/Qatar
- { 14, 4, 205, 1159, 1159, 1159, 1159, 1233, 1233, 74, 74, 74, 74, 23, 23 },// Arabic/Arabic/Saudi Arabia
- { 14, 4, 215, 1159, 1159, 1159, 1159, 1233, 1233, 74, 74, 74, 74, 23, 23 },// Arabic/Arabic/Somalia
- { 14, 4, 219, 1159, 1159, 1159, 1159, 1233, 1233, 74, 74, 74, 74, 23, 23 },// Arabic/Arabic/South Sudan
- { 14, 4, 222, 1159, 1159, 1159, 1159, 1233, 1233, 74, 74, 74, 74, 23, 23 },// Arabic/Arabic/Sudan
- { 14, 4, 227, 1349, 1349, 1349, 1349, 1531, 1531, 91, 91, 91, 91, 23, 23 },// Arabic/Arabic/Syria
- { 14, 4, 238, 1256, 1256, 1256, 1256, 1326, 1326, 70, 70, 70, 70, 23, 23 },// Arabic/Arabic/Tunisia
- { 14, 4, 245, 1159, 1159, 1159, 1159, 1233, 1233, 74, 74, 74, 74, 23, 23 },// Arabic/Arabic/United Arab Emirates
- { 14, 4, 257, 1159, 1159, 1159, 1159, 1233, 1233, 74, 74, 74, 74, 23, 23 },// Arabic/Arabic/Western Sahara
- { 14, 4, 258, 1159, 1159, 1159, 1159, 1233, 1233, 74, 74, 74, 74, 23, 23 },// Arabic/Arabic/World
- { 14, 4, 259, 1159, 1159, 1159, 1159, 1233, 1233, 74, 74, 74, 74, 23, 23 },// Arabic/Arabic/Yemen
- { 15, 66, 220, 181, 181, 181, 181, 155, 155, 47, 47, 47, 47, 26, 26 },// Aragonese/Latin/Spain
- { 17, 5, 12, 1740, 1833, 1938, 1938, 1985, 1985, 93,105, 47, 47, 23, 23 },// Armenian/Armenian/Armenia
- { 18, 9, 110, 2008, 2008, 2096, 2096, 2159, 2159, 88, 88, 63, 63, 23, 23 },// Assamese/Bangla/India
- { 19, 66, 220, 2182, 2266, 2382, 2429, 2476, 2476, 84,116, 47, 47, 23, 23 },// Asturian/Latin/Spain
- { 20, 66, 230, 2499, 2499, 2582, 2582, 132, 132, 83, 83, 47, 47, 23, 23 },// Asu/Latin/Tanzania
- { 21, 66, 169, 181, 181, 181, 181, 155, 155, 47, 47, 47, 47, 26, 26 },// Atsam/Latin/Nigeria
- { 25, 66, 17, 2629, 2629, 2705, 2705, 155, 155, 76, 76, 47, 47, 26, 26 },// Azerbaijani/Latin/Azerbaijan
- { 25, 4, 112, 181, 181, 181, 181, 155, 155, 47, 47, 47, 47, 26, 26 },// Azerbaijani/Arabic/Iran
- { 25, 27, 17, 2752, 2828, 2904, 2904, 155, 155, 76, 76, 47, 47, 26, 26 },// Azerbaijani/Cyrillic/Azerbaijan
- { 26, 66, 40, 2951, 2951, 3141, 3141, 155, 155,190,190, 38, 38, 26, 26 },// Bafia/Latin/Cameroon
- { 28, 66, 145, 3179, 3179, 3270, 3270, 3316, 3316, 91, 91, 46, 46, 23, 23 },// Bambara/Latin/Mali
- { 28, 90, 145, 181, 181, 181, 181, 155, 155, 47, 47, 47, 47, 26, 26 },// Bambara/Nko/Mali
- { 30, 9, 20, 3339, 3339, 3339, 3428, 3504, 3504, 89, 89, 89, 76, 32, 32 },// Bangla/Bangla/Bangladesh
- { 30, 9, 110, 3339, 3339, 3339, 3428, 3504, 3504, 89, 89, 89, 76, 32, 32 },// Bangla/Bangla/India
- { 31, 66, 40, 3536, 3536, 3625, 3625, 3672, 3672, 89, 89, 47, 47, 23, 23 },// Basaa/Latin/Cameroon
- { 32, 27, 193, 181, 181, 181, 181, 155, 155, 47, 47, 47, 47, 26, 26 },// Bashkir/Cyrillic/Russia
- { 33, 66, 220, 3695, 3787, 3891, 3891, 3950, 3950, 92,104, 59, 59, 23, 23 },// Basque/Latin/Spain
- { 35, 27, 22, 3973, 4067, 4164, 4211, 4258, 4258, 94, 97, 47, 47, 23, 23 },// Belarusian/Cyrillic/Belarus
- { 36, 66, 260, 4281, 4281, 4363, 4363, 4410, 4410, 82, 82, 47, 47, 23, 23 },// Bemba/Latin/Zambia
- { 37, 66, 230, 4433, 4433, 4686, 4686, 4733, 4733,253,253, 47, 47, 23, 23 },// Bena/Latin/Tanzania
- { 40, 33, 74, 181, 181, 181, 181, 155, 155, 47, 47, 47, 47, 26, 26 },// Blin/Ethiopic/Eritrea
- { 41, 29, 110, 4756, 4756, 4756, 4756, 4843, 4843, 87, 87, 87, 87, 30, 30 },// Bodo/Devanagari/India
- { 42, 66, 29, 4873, 4873, 4955, 4955, 5002, 5002, 82, 82, 47, 47, 23, 23 },// Bosnian/Latin/Bosnia And Herzegovina
- { 42, 27, 29, 5025, 5025, 5107, 5107, 5154, 5154, 82, 82, 47, 47, 23, 23 },// Bosnian/Cyrillic/Bosnia And Herzegovina
- { 43, 66, 84, 5177, 5177, 5254, 5254, 5316, 5316, 77, 77, 62, 62, 35, 35 },// Breton/Latin/France
- { 45, 27, 36, 5351, 5351, 5432, 5432, 5480, 5480, 81, 81, 48, 48, 23, 23 },// Bulgarian/Cyrillic/Bulgaria
- { 46, 86, 161, 5503, 5503, 5590, 5590, 5632, 5632, 87, 87, 42, 42, 23, 23 },// Burmese/Myanmar/Myanmar
- { 47, 137, 107, 5655, 5655, 5655, 5655, 155, 155, 38, 38, 38, 38, 26, 26 },// Cantonese/Traditional Han/Hong Kong
- { 47, 118, 50, 5693, 5693, 5655, 5655, 155, 155, 37, 37, 38, 38, 26, 26 },// Cantonese/Simplified Han/China
- { 48, 66, 220, 5730, 5811, 5925, 5984, 6076, 6076, 81,114, 59, 92, 35, 35 },// Catalan/Latin/Spain
- { 48, 66, 6, 5730, 5811, 5925, 5984, 6076, 6076, 81,114, 59, 92, 35, 35 },// Catalan/Latin/Andorra
- { 48, 66, 84, 5730, 5811, 5925, 5984, 6076, 6076, 81,114, 59, 92, 35, 35 },// Catalan/Latin/France
- { 48, 66, 117, 5730, 5811, 5925, 5984, 6076, 6076, 81,114, 59, 92, 35, 35 },// Catalan/Latin/Italy
- { 49, 66, 185, 6111, 6111, 6198, 6198, 6245, 6245, 87, 87, 47, 47, 23, 23 },// Cebuano/Latin/Philippines
- { 50, 66, 159, 6268, 6268, 6353, 6353, 6400, 6400, 85, 85, 47, 47, 23, 23 },// Central Atlas Tamazight/Latin/Morocco
- { 51, 4, 113, 6423, 6423, 6423, 6423, 6527, 6527,104,104,104,104, 23, 23 },// Central Kurdish/Arabic/Iraq
- { 51, 4, 112, 6423, 6423, 6423, 6423, 6527, 6527,104,104,104,104, 23, 23 },// Central Kurdish/Arabic/Iran
- { 52, 21, 20, 6550, 6739, 6550, 6928, 7095, 7095,189,189,189,167, 57, 57 },// Chakma/Chakma/Bangladesh
- { 52, 21, 110, 6550, 6739, 6550, 6928, 7095, 7095,189,189,189,167, 57, 57 },// Chakma/Chakma/India
- { 54, 27, 193, 7152, 7152, 7231, 7231, 7278, 7278, 79, 79, 47, 47, 23, 23 },// Chechen/Cyrillic/Russia
- { 55, 23, 248, 7301, 7301, 7358, 7358, 7393, 7393, 57, 57, 35, 35, 23, 23 },// Cherokee/Cherokee/United States
- { 56, 66, 248, 181, 181, 181, 181, 155, 155, 47, 47, 47, 47, 26, 26 },// Chickasaw/Latin/United States
- { 57, 66, 243, 7416, 7416, 7567, 7567, 132, 132,151,151, 47, 47, 23, 23 },// Chiga/Latin/Uganda
- { 58, 118, 50, 5693, 5693, 5655, 5655, 155, 155, 37, 37, 38, 38, 26, 26 },// Chinese/Simplified Han/China
- { 58, 118, 107, 5693, 5693, 5655, 5655, 155, 155, 37, 37, 38, 38, 26, 26 },// Chinese/Simplified Han/Hong Kong
- { 58, 118, 139, 5693, 5693, 5655, 5655, 155, 155, 37, 37, 38, 38, 26, 26 },// Chinese/Simplified Han/Macao
- { 58, 118, 210, 5693, 5693, 5655, 5655, 155, 155, 37, 37, 38, 38, 26, 26 },// Chinese/Simplified Han/Singapore
- { 58, 137, 107, 5655, 5655, 5655, 5655, 155, 155, 38, 38, 38, 38, 26, 26 },// Chinese/Traditional Han/Hong Kong
- { 58, 137, 139, 5655, 5655, 5655, 5655, 155, 155, 38, 38, 38, 38, 26, 26 },// Chinese/Traditional Han/Macao
- { 58, 137, 228, 5655, 5655, 5655, 5655, 155, 155, 38, 38, 38, 38, 26, 26 },// Chinese/Traditional Han/Taiwan
- { 59, 27, 193, 181, 181, 181, 181, 155, 155, 47, 47, 47, 47, 26, 26 },// Church/Cyrillic/Russia
- { 60, 27, 193, 181, 181, 181, 181, 155, 155, 47, 47, 47, 47, 26, 26 },// Chuvash/Cyrillic/Russia
- { 61, 66, 91, 7614, 7614, 7700, 7758, 7805, 7805, 86, 86, 58, 47, 23, 23 },// Colognian/Latin/Germany
- { 63, 66, 246, 7828, 7828, 7957, 7957, 155, 155,129,129, 45, 45, 26, 26 },// Cornish/Latin/United Kingdom
- { 64, 66, 84, 181, 181, 181, 181, 155, 155, 47, 47, 47, 47, 26, 26 },// Corsican/Latin/France
- { 66, 66, 60, 8002, 8095, 8192, 8192, 8240, 8240, 93, 97, 48, 48, 38, 38 },// Croatian/Latin/Croatia
- { 66, 66, 29, 8002, 8095, 8192, 8192, 8240, 8240, 93, 97, 48, 48, 38, 38 },// Croatian/Latin/Bosnia And Herzegovina
- { 67, 66, 64, 8278, 8359, 8442, 8442, 155, 155, 81, 83, 47, 47, 26, 26 },// Czech/Latin/Czechia
- { 68, 66, 65, 8489, 8489, 8572, 8572, 132, 132, 83, 83, 58, 58, 23, 23 },// Danish/Latin/Denmark
- { 68, 66, 95, 8489, 8489, 8572, 8572, 132, 132, 83, 83, 58, 58, 23, 23 },// Danish/Latin/Greenland
- { 69, 132, 144, 181, 181, 181, 181, 155, 155, 47, 47, 47, 47, 26, 26 },// Divehi/Thaana/Maldives
- { 70, 29, 110, 8630, 8702, 8774, 8774, 8833, 8833, 72, 72, 59, 59, 29, 29 },// Dogri/Devanagari/India
- { 71, 66, 40, 8862, 8862, 8960, 8960, 9008, 9008, 98, 98, 48, 48, 23, 23 },// Duala/Latin/Cameroon
- { 72, 66, 165, 9031, 9031, 9118, 9118, 132, 132, 87, 87, 58, 58, 23, 23 },// Dutch/Latin/Netherlands
- { 72, 66, 13, 9031, 9031, 9118, 9118, 132, 132, 87, 87, 58, 58, 23, 23 },// Dutch/Latin/Aruba
- { 72, 66, 23, 9031, 9031, 9118, 9118, 132, 132, 87, 87, 58, 58, 23, 23 },// Dutch/Latin/Belgium
- { 72, 66, 44, 9031, 9031, 9118, 9118, 132, 132, 87, 87, 58, 58, 23, 23 },// Dutch/Latin/Caribbean Netherlands
- { 72, 66, 62, 9031, 9031, 9118, 9118, 132, 132, 87, 87, 58, 58, 23, 23 },// Dutch/Latin/Curacao
- { 72, 66, 211, 9031, 9031, 9118, 9118, 132, 132, 87, 87, 58, 58, 23, 23 },// Dutch/Latin/Sint Maarten
- { 72, 66, 223, 9031, 9031, 9118, 9118, 132, 132, 87, 87, 58, 58, 23, 23 },// Dutch/Latin/Suriname
- { 73, 134, 27, 9176, 9366, 9497, 9559, 9585, 9611,190,131, 62, 26, 26, 26 },// Dzongkha/Tibetan/Bhutan
- { 74, 66, 124, 9637, 9637, 9843, 9843, 9890, 9890,206,206, 47, 47, 23, 23 },// Embu/Latin/Kenya
+ { 2, 27, 90, 181, 181, 278, 278, 336, 364, 97, 97, 58, 58, 28, 28 },// Abkhazian/Cyrillic/Georgia
+ { 3, 66, 77, 392, 392, 509, 509, 556, 556,117,117, 47, 47, 23, 23 },// Afar/Latin/Ethiopia
+ { 3, 66, 67, 579, 579, 509, 509, 556, 556,118,118, 47, 47, 23, 23 },// Afar/Latin/Djibouti
+ { 3, 66, 74, 392, 392, 509, 509, 556, 556,117,117, 47, 47, 23, 23 },// Afar/Latin/Eritrea
+ { 4, 66, 216, 697, 697, 788, 788, 132, 132, 91, 91, 58, 58, 23, 23 },// Afrikaans/Latin/South Africa
+ { 4, 66, 162, 697, 697, 788, 788, 132, 132, 91, 91, 58, 58, 23, 23 },// Afrikaans/Latin/Namibia
+ { 5, 66, 40, 846, 846, 1040, 1040, 1087, 1087,194,194, 47, 47, 23, 23 },// Aghem/Latin/Cameroon
+ { 6, 66, 92, 1110, 1110, 1301, 1301, 155, 155,191,191, 47, 47, 26, 26 },// Akan/Latin/Ghana
+ { 8, 66, 40, 1348, 1348, 1348, 1348, 155, 155, 47, 47, 47, 47, 26, 26 },// Akoose/Latin/Cameroon
+ { 9, 66, 3, 1395, 1395, 1472, 1472, 1521, 1521, 77, 77, 49, 49, 26, 26 },// Albanian/Latin/Albania
+ { 9, 66, 126, 1395, 1395, 1472, 1472, 1521, 1521, 77, 77, 49, 49, 26, 26 },// Albanian/Latin/Kosovo
+ { 9, 66, 140, 1395, 1395, 1472, 1472, 1521, 1521, 77, 77, 49, 49, 26, 26 },// Albanian/Latin/Macedonia
+ { 11, 33, 77, 1547, 1547, 1606, 1606, 1649, 1649, 59, 59, 43, 43, 23, 23 },// Amharic/Ethiopic/Ethiopia
+ { 14, 4, 71, 1672, 1672, 1672, 1672, 1746, 1746, 74, 74, 74, 74, 23, 23 },// Arabic/Arabic/Egypt
+ { 14, 4, 4, 1769, 1769, 1769, 1769, 1839, 1839, 70, 70, 70, 70, 23, 23 },// Arabic/Arabic/Algeria
+ { 14, 4, 19, 1672, 1672, 1672, 1672, 1746, 1746, 74, 74, 74, 74, 23, 23 },// Arabic/Arabic/Bahrain
+ { 14, 4, 48, 1672, 1672, 1672, 1672, 1746, 1746, 74, 74, 74, 74, 23, 23 },// Arabic/Arabic/Chad
+ { 14, 4, 55, 1672, 1672, 1672, 1672, 1746, 1746, 74, 74, 74, 74, 23, 23 },// Arabic/Arabic/Comoros
+ { 14, 4, 67, 1672, 1672, 1672, 1672, 1746, 1746, 74, 74, 74, 74, 23, 23 },// Arabic/Arabic/Djibouti
+ { 14, 4, 74, 1672, 1672, 1672, 1672, 1746, 1746, 74, 74, 74, 74, 23, 23 },// Arabic/Arabic/Eritrea
+ { 14, 4, 113, 1862, 1862, 1862, 1953, 2044, 2044, 91, 91, 91, 91, 23, 23 },// Arabic/Arabic/Iraq
+ { 14, 4, 116, 1672, 1672, 1672, 1672, 1746, 1746, 74, 74, 74, 74, 23, 23 },// Arabic/Arabic/Israel
+ { 14, 4, 122, 1862, 1862, 1862, 1862, 2044, 2044, 91, 91, 91, 91, 23, 23 },// Arabic/Arabic/Jordan
+ { 14, 4, 127, 1672, 1672, 1672, 1672, 1746, 1746, 74, 74, 74, 74, 23, 23 },// Arabic/Arabic/Kuwait
+ { 14, 4, 132, 1862, 1862, 1862, 1862, 2044, 2044, 91, 91, 91, 91, 23, 23 },// Arabic/Arabic/Lebanon
+ { 14, 4, 135, 1672, 1672, 1672, 1672, 1746, 1746, 74, 74, 74, 74, 23, 23 },// Arabic/Arabic/Libya
+ { 14, 4, 149, 2067, 2067, 2067, 2067, 2138, 2138, 71, 71, 71, 71, 23, 23 },// Arabic/Arabic/Mauritania
+ { 14, 4, 159, 2161, 2161, 2161, 2161, 2230, 2230, 69, 69, 69, 69, 23, 23 },// Arabic/Arabic/Morocco
+ { 14, 4, 176, 1672, 1672, 1672, 1672, 1746, 1746, 74, 74, 74, 74, 23, 23 },// Arabic/Arabic/Oman
+ { 14, 4, 180, 1862, 1862, 1862, 1862, 2044, 2044, 91, 91, 91, 91, 23, 23 },// Arabic/Arabic/Palestinian Territories
+ { 14, 4, 190, 1672, 1672, 1672, 1672, 1746, 1746, 74, 74, 74, 74, 23, 23 },// Arabic/Arabic/Qatar
+ { 14, 4, 205, 1672, 1672, 1672, 1672, 1746, 1746, 74, 74, 74, 74, 23, 23 },// Arabic/Arabic/Saudi Arabia
+ { 14, 4, 215, 1672, 1672, 1672, 1672, 1746, 1746, 74, 74, 74, 74, 23, 23 },// Arabic/Arabic/Somalia
+ { 14, 4, 219, 1672, 1672, 1672, 1672, 1746, 1746, 74, 74, 74, 74, 23, 23 },// Arabic/Arabic/South Sudan
+ { 14, 4, 222, 1672, 1672, 1672, 1672, 1746, 1746, 74, 74, 74, 74, 23, 23 },// Arabic/Arabic/Sudan
+ { 14, 4, 227, 1862, 1862, 1862, 1862, 2044, 2044, 91, 91, 91, 91, 23, 23 },// Arabic/Arabic/Syria
+ { 14, 4, 238, 1769, 1769, 1769, 1769, 1839, 1839, 70, 70, 70, 70, 23, 23 },// Arabic/Arabic/Tunisia
+ { 14, 4, 245, 1672, 1672, 1672, 1672, 1746, 1746, 74, 74, 74, 74, 23, 23 },// Arabic/Arabic/United Arab Emirates
+ { 14, 4, 257, 1672, 1672, 1672, 1672, 1746, 1746, 74, 74, 74, 74, 23, 23 },// Arabic/Arabic/Western Sahara
+ { 14, 4, 258, 1672, 1672, 1672, 1672, 1746, 1746, 74, 74, 74, 74, 23, 23 },// Arabic/Arabic/world
+ { 14, 4, 259, 1672, 1672, 1672, 1672, 1746, 1746, 74, 74, 74, 74, 23, 23 },// Arabic/Arabic/Yemen
+ { 15, 66, 220, 2253, 2343, 2465, 2465, 155, 155, 90,122, 59, 59, 26, 26 },// Aragonese/Latin/Spain
+ { 17, 5, 12, 2524, 2617, 2722, 2722, 2769, 2769, 93,105, 47, 47, 23, 23 },// Armenian/Armenian/Armenia
+ { 18, 9, 110, 2792, 2792, 2880, 2880, 2943, 2943, 88, 88, 63, 63, 23, 23 },// Assamese/Bangla/India
+ { 19, 66, 220, 2966, 3050, 3166, 3213, 3260, 3260, 84,116, 47, 47, 23, 23 },// Asturian/Latin/Spain
+ { 20, 66, 230, 3283, 3283, 3366, 3366, 132, 132, 83, 83, 47, 47, 23, 23 },// Asu/Latin/Tanzania
+ { 21, 66, 169, 3413, 3413, 3541, 3541, 155, 155,128,128, 58, 58, 26, 26 },// Atsam/Latin/Nigeria
+ { 25, 66, 17, 3599, 3599, 3675, 3675, 155, 155, 76, 76, 47, 47, 26, 26 },// Azerbaijani/Latin/Azerbaijan
+ { 25, 4, 112, 1348, 1348, 1348, 1348, 155, 155, 47, 47, 47, 47, 26, 26 },// Azerbaijani/Arabic/Iran
+ { 25, 4, 113, 1348, 1348, 1348, 1348, 155, 155, 47, 47, 47, 47, 26, 26 },// Azerbaijani/Arabic/Iraq
+ { 25, 4, 239, 1348, 1348, 1348, 1348, 155, 155, 47, 47, 47, 47, 26, 26 },// Azerbaijani/Arabic/Turkey
+ { 25, 27, 17, 3722, 3798, 3874, 3874, 155, 155, 76, 76, 47, 47, 26, 26 },// Azerbaijani/Cyrillic/Azerbaijan
+ { 26, 66, 40, 3921, 3921, 4111, 4111, 155, 155,190,190, 38, 38, 26, 26 },// Bafia/Latin/Cameroon
+ { 28, 66, 145, 4149, 4149, 4240, 4240, 4286, 4286, 91, 91, 46, 46, 23, 23 },// Bambara/Latin/Mali
+ { 28, 90, 145, 1348, 1348, 1348, 1348, 155, 155, 47, 47, 47, 47, 26, 26 },// Bambara/Nko/Mali
+ { 30, 9, 20, 4309, 4309, 4398, 4474, 4527, 4527, 89, 89, 76, 53, 32, 32 },// Bangla/Bangla/Bangladesh
+ { 30, 9, 110, 4309, 4309, 4559, 4625, 4685, 4685, 89, 89, 66, 60, 33, 33 },// Bangla/Bangla/India
+ { 31, 66, 40, 4718, 4718, 4807, 4807, 4854, 4854, 89, 89, 47, 47, 23, 23 },// Basaa/Latin/Cameroon
+ { 32, 27, 193, 1348, 1348, 1348, 1348, 155, 155, 47, 47, 47, 47, 26, 26 },// Bashkir/Cyrillic/Russia
+ { 33, 66, 220, 4877, 4877, 4969, 4969, 5028, 5028, 92, 92, 59, 59, 23, 23 },// Basque/Latin/Spain
+ { 35, 27, 22, 5051, 5145, 5242, 5289, 5336, 5336, 94, 97, 47, 47, 23, 23 },// Belarusian/Cyrillic/Belarus
+ { 36, 66, 260, 5359, 5359, 5441, 5441, 5488, 5488, 82, 82, 47, 47, 23, 23 },// Bemba/Latin/Zambia
+ { 37, 66, 230, 5511, 5511, 5764, 5764, 5811, 5811,253,253, 47, 47, 23, 23 },// Bena/Latin/Tanzania
+ { 38, 29, 110, 5834, 5834, 5834, 5834, 155, 155, 72, 72, 72, 72, 26, 26 },// Bhojpuri/Devanagari/India
+ { 40, 33, 74, 5906, 5906, 5982, 5982, 6028, 6028, 76, 76, 46, 46, 23, 23 },// Blin/Ethiopic/Eritrea
+ { 41, 29, 110, 6051, 6051, 6138, 6138, 6190, 6190, 87, 87, 52, 52, 23, 23 },// Bodo/Devanagari/India
+ { 42, 66, 29, 6213, 6213, 6295, 6295, 6342, 6342, 82, 82, 47, 47, 23, 23 },// Bosnian/Latin/Bosnia and Herzegovina
+ { 42, 27, 29, 6365, 6365, 6447, 6447, 6494, 6494, 82, 82, 47, 47, 23, 23 },// Bosnian/Cyrillic/Bosnia and Herzegovina
+ { 43, 66, 84, 6517, 6517, 6594, 6594, 6656, 6656, 77, 77, 62, 62, 35, 35 },// Breton/Latin/France
+ { 45, 27, 36, 6691, 6691, 6772, 6772, 6820, 6820, 81, 81, 48, 48, 23, 23 },// Bulgarian/Cyrillic/Bulgaria
+ { 46, 86, 161, 6843, 6843, 6930, 6930, 6972, 6972, 87, 87, 42, 42, 23, 23 },// Burmese/Myanmar/Myanmar
+ { 47, 137, 107, 6995, 6995, 6995, 6995, 155, 155, 38, 38, 38, 38, 26, 26 },// Cantonese/Traditional Han/Hong Kong
+ { 47, 118, 50, 7033, 7033, 6995, 6995, 155, 155, 37, 37, 38, 38, 26, 26 },// Cantonese/Simplified Han/China
+ { 48, 66, 220, 7070, 7151, 7265, 7324, 7416, 7416, 81,114, 59, 92, 35, 35 },// Catalan/Latin/Spain
+ { 48, 66, 6, 7070, 7151, 7265, 7324, 7416, 7416, 81,114, 59, 92, 35, 35 },// Catalan/Latin/Andorra
+ { 48, 66, 84, 7070, 7151, 7265, 7324, 7416, 7416, 81,114, 59, 92, 35, 35 },// Catalan/Latin/France
+ { 48, 66, 117, 7070, 7151, 7265, 7324, 7416, 7416, 81,114, 59, 92, 35, 35 },// Catalan/Latin/Italy
+ { 49, 66, 185, 7451, 7451, 7540, 7540, 7587, 7587, 89, 89, 47, 47, 23, 23 },// Cebuano/Latin/Philippines
+ { 50, 66, 159, 7610, 7610, 7695, 7695, 7742, 7742, 85, 85, 47, 47, 23, 23 },// Central Atlas Tamazight/Latin/Morocco
+ { 51, 4, 113, 7765, 7765, 7765, 7765, 7869, 7869,104,104,104,104, 23, 23 },// Central Kurdish/Arabic/Iraq
+ { 51, 4, 112, 7765, 7765, 7765, 7765, 7869, 7869,104,104,104,104, 23, 23 },// Central Kurdish/Arabic/Iran
+ { 52, 21, 20, 7892, 8081, 7892, 8270, 8437, 8437,189,189,189,167, 57, 57 },// Chakma/Chakma/Bangladesh
+ { 52, 21, 110, 7892, 8081, 7892, 8270, 8437, 8437,189,189,189,167, 57, 57 },// Chakma/Chakma/India
+ { 54, 27, 193, 8494, 8494, 8573, 8573, 8620, 8620, 79, 79, 47, 47, 23, 23 },// Chechen/Cyrillic/Russia
+ { 55, 23, 248, 8643, 8643, 8700, 8700, 8735, 8735, 57, 57, 35, 35, 23, 23 },// Cherokee/Cherokee/United States
+ { 56, 66, 248, 8758, 8758, 8758, 8758, 155, 155,118,118,118,118, 26, 26 },// Chickasaw/Latin/United States
+ { 57, 66, 243, 8876, 8876, 9027, 9027, 132, 132,151,151, 47, 47, 23, 23 },// Chiga/Latin/Uganda
+ { 58, 118, 50, 7033, 7033, 6995, 6995, 155, 155, 37, 37, 38, 38, 26, 26 },// Chinese/Simplified Han/China
+ { 58, 118, 107, 7033, 7033, 6995, 6995, 155, 155, 37, 37, 38, 38, 26, 26 },// Chinese/Simplified Han/Hong Kong
+ { 58, 118, 139, 7033, 7033, 6995, 6995, 155, 155, 37, 37, 38, 38, 26, 26 },// Chinese/Simplified Han/Macao
+ { 58, 118, 210, 7033, 7033, 6995, 6995, 155, 155, 37, 37, 38, 38, 26, 26 },// Chinese/Simplified Han/Singapore
+ { 58, 137, 107, 6995, 6995, 6995, 6995, 155, 155, 38, 38, 38, 38, 26, 26 },// Chinese/Traditional Han/Hong Kong
+ { 58, 137, 139, 6995, 6995, 6995, 6995, 155, 155, 38, 38, 38, 38, 26, 26 },// Chinese/Traditional Han/Macao
+ { 58, 137, 228, 6995, 6995, 6995, 6995, 155, 155, 38, 38, 38, 38, 26, 26 },// Chinese/Traditional Han/Taiwan
+ { 59, 27, 193, 9074, 9190, 9306, 9306, 9370, 9370,116,116, 64, 64, 29, 29 },// Church/Cyrillic/Russia
+ { 60, 27, 193, 9399, 9399, 9459, 9459, 9511, 9511, 60, 60, 52, 52, 23, 23 },// Chuvash/Cyrillic/Russia
+ { 61, 66, 91, 9534, 9534, 9620, 9678, 9725, 9725, 86, 86, 58, 47, 23, 23 },// Colognian/Latin/Germany
+ { 63, 66, 246, 9748, 9748, 9877, 9877, 155, 155,129,129, 45, 45, 26, 26 },// Cornish/Latin/United Kingdom
+ { 64, 66, 84, 9922,10020,10151,10151,10211,10211, 98,131, 60, 60, 23, 23 },// Corsican/Latin/France
+ { 66, 66, 60,10234,10327,10424,10424,10472,10472, 93, 97, 48, 48, 38, 38 },// Croatian/Latin/Croatia
+ { 66, 66, 29,10234,10327,10424,10424,10472,10472, 93, 97, 48, 48, 38, 38 },// Croatian/Latin/Bosnia and Herzegovina
+ { 67, 66, 64,10510,10591,10674,10674, 155, 155, 81, 83, 47, 47, 26, 26 },// Czech/Latin/Czechia
+ { 68, 66, 65,10721,10721,10804,10804, 132, 132, 83, 83, 58, 58, 23, 23 },// Danish/Latin/Denmark
+ { 68, 66, 95,10721,10721,10804,10804, 132, 132, 83, 83, 58, 58, 23, 23 },// Danish/Latin/Greenland
+ { 69, 132, 144, 1348, 1348, 1348, 1348, 155, 155, 47, 47, 47, 47, 26, 26 },// Divehi/Thaana/Maldives
+ { 70, 29, 110,10862,10862,10934,10934,10993,10993, 72, 72, 59, 59, 29, 29 },// Dogri/Devanagari/India
+ { 71, 66, 40,11022,11022,11120,11120,11168,11168, 98, 98, 48, 48, 23, 23 },// Duala/Latin/Cameroon
+ { 72, 66, 165,11191,11191,11278,11278, 132, 132, 87, 87, 47, 47, 23, 23 },// Dutch/Latin/Netherlands
+ { 72, 66, 13,11191,11191,11278,11278, 132, 132, 87, 87, 47, 47, 23, 23 },// Dutch/Latin/Aruba
+ { 72, 66, 23,11191,11191,11278,11278, 132, 132, 87, 87, 47, 47, 23, 23 },// Dutch/Latin/Belgium
+ { 72, 66, 44,11191,11191,11278,11278, 132, 132, 87, 87, 47, 47, 23, 23 },// Dutch/Latin/Caribbean Netherlands
+ { 72, 66, 62,11191,11191,11278,11278, 132, 132, 87, 87, 47, 47, 23, 23 },// Dutch/Latin/Curacao
+ { 72, 66, 211,11191,11191,11278,11278, 132, 132, 87, 87, 47, 47, 23, 23 },// Dutch/Latin/Sint Maarten
+ { 72, 66, 223,11191,11191,11278,11278, 132, 132, 87, 87, 47, 47, 23, 23 },// Dutch/Latin/Suriname
+ { 73, 134, 27,11325,11515,11646,11708,11734,11760,190,131, 62, 26, 26, 26 },// Dzongkha/Tibetan/Bhutan
+ { 74, 66, 124,11786,11786,11992,11992,12039,12039,206,206, 47, 47, 23, 23 },// Embu/Latin/Kenya
{ 75, 66, 248, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/United States
- { 75, 28, 248, 181, 181, 181, 181, 155, 155, 47, 47, 47, 47, 26, 26 },// English/Deseret/United States
+ { 75, 28, 248,12062,12062,12215,12215,12294,12294,153,153, 79, 79, 35, 35 },// English/Deseret/United States
{ 75, 66, 5, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/American Samoa
- { 75, 66, 8, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Anguilla
- { 75, 66, 10, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Antigua And Barbuda
- { 75, 66, 15, 0, 0, 85, 9961, 132, 132, 85, 85, 47, 50, 23, 23 },// English/Latin/Australia
- { 75, 66, 16, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Austria
- { 75, 66, 18, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Bahamas
- { 75, 66, 21, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Barbados
- { 75, 66, 23, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Belgium
- { 75, 66, 24, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Belize
- { 75, 66, 26, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Bermuda
- { 75, 66, 30, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Botswana
- { 75, 66, 33, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/British Indian Ocean Territory
- { 75, 66, 34, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/British Virgin Islands
+ { 75, 66, 8, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Anguilla
+ { 75, 66, 10, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Antigua and Barbuda
+ { 75, 66, 15, 0, 0,12377,12377, 132, 132, 85, 85, 50, 50, 23, 23 },// English/Latin/Australia
+ { 75, 66, 16, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Austria
+ { 75, 66, 18, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Bahamas
+ { 75, 66, 21, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Barbados
+ { 75, 66, 23, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Belgium
+ { 75, 66, 24, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Belize
+ { 75, 66, 26, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Bermuda
+ { 75, 66, 30, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Botswana
+ { 75, 66, 33, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/British Indian Ocean Territory
+ { 75, 66, 34, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/British Virgin Islands
{ 75, 66, 38, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Burundi
- { 75, 66, 40, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Cameroon
- { 75, 66, 41, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Canada
- { 75, 66, 45, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Cayman Islands
- { 75, 66, 51, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Christmas Island
- { 75, 66, 53, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Cocos Islands
- { 75, 66, 58, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Cook Islands
- { 75, 66, 63, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Cyprus
- { 75, 66, 65, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Denmark
- { 75, 66, 66, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Diego Garcia
- { 75, 66, 68, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Dominica
- { 75, 66, 74, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Eritrea
- { 75, 66, 76, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Eswatini
- { 75, 66, 78, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Europe
- { 75, 66, 80, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Falkland Islands
- { 75, 66, 82, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Fiji
- { 75, 66, 83, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Finland
- { 75, 66, 89, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Gambia
- { 75, 66, 91, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Germany
- { 75, 66, 92, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Ghana
- { 75, 66, 93, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Gibraltar
- { 75, 66, 96, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Grenada
+ { 75, 66, 40, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Cameroon
+ { 75, 66, 41, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Canada
+ { 75, 66, 45, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Cayman Islands
+ { 75, 66, 51, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Christmas Island
+ { 75, 66, 53, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Cocos Islands
+ { 75, 66, 58, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Cook Islands
+ { 75, 66, 63, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Cyprus
+ { 75, 66, 65, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Denmark
+ { 75, 66, 66, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Diego Garcia
+ { 75, 66, 68, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Dominica
+ { 75, 66, 74, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Eritrea
+ { 75, 66, 76, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Eswatini
+ { 75, 66, 78, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Europe
+ { 75, 66, 80, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Falkland Islands
+ { 75, 66, 82, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Fiji
+ { 75, 66, 83, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Finland
+ { 75, 66, 89, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Gambia
+ { 75, 66, 91, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Germany
+ { 75, 66, 92, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Ghana
+ { 75, 66, 93, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Gibraltar
+ { 75, 66, 96, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Grenada
{ 75, 66, 98, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Guam
- { 75, 66, 100, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Guernsey
- { 75, 66, 103, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Guyana
- { 75, 66, 107, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Hong Kong
- { 75, 66, 110, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/India
- { 75, 66, 114, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Ireland
- { 75, 66, 115, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Isle Of Man
- { 75, 66, 116, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Israel
- { 75, 66, 119, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Jamaica
- { 75, 66, 121, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Jersey
- { 75, 66, 124, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Kenya
- { 75, 66, 125, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Kiribati
- { 75, 66, 133, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Lesotho
- { 75, 66, 134, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Liberia
- { 75, 66, 139, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Macao
- { 75, 66, 141, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Madagascar
- { 75, 66, 142, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Malawi
- { 75, 66, 143, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Malaysia
- { 75, 66, 146, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Malta
+ { 75, 66, 100, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Guernsey
+ { 75, 66, 103, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Guyana
+ { 75, 66, 107, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Hong Kong
+ { 75, 66, 110, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/India
+ { 75, 66, 111, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Indonesia
+ { 75, 66, 114, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Ireland
+ { 75, 66, 115, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Isle of Man
+ { 75, 66, 116, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Israel
+ { 75, 66, 119, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Jamaica
+ { 75, 66, 121, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Jersey
+ { 75, 66, 124, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Kenya
+ { 75, 66, 125, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Kiribati
+ { 75, 66, 133, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Lesotho
+ { 75, 66, 134, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Liberia
+ { 75, 66, 139, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Macao
+ { 75, 66, 141, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Madagascar
+ { 75, 66, 142, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Malawi
+ { 75, 66, 143, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Malaysia
+ { 75, 66, 144, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Maldives
+ { 75, 66, 146, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Malta
{ 75, 66, 147, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Marshall Islands
- { 75, 66, 150, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Mauritius
- { 75, 66, 153, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Micronesia
- { 75, 66, 158, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Montserrat
- { 75, 66, 162, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Namibia
- { 75, 66, 163, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Nauru
- { 75, 66, 165, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Netherlands
- { 75, 66, 167, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/New Zealand
- { 75, 66, 169, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Nigeria
- { 75, 66, 171, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Niue
- { 75, 66, 172, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Norfolk Island
+ { 75, 66, 150, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Mauritius
+ { 75, 66, 153, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Micronesia
+ { 75, 66, 158, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Montserrat
+ { 75, 66, 162, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Namibia
+ { 75, 66, 163, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Nauru
+ { 75, 66, 165, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Netherlands
+ { 75, 66, 167, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/New Zealand
+ { 75, 66, 169, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Nigeria
+ { 75, 66, 171, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Niue
+ { 75, 66, 172, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Norfolk Island
{ 75, 66, 173, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Northern Mariana Islands
- { 75, 66, 178, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Pakistan
- { 75, 66, 179, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Palau
- { 75, 66, 182, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Papua New Guinea
+ { 75, 66, 178, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Pakistan
+ { 75, 66, 179, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Palau
+ { 75, 66, 182, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Papua New Guinea
{ 75, 66, 185, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Philippines
- { 75, 66, 186, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Pitcairn
+ { 75, 66, 186, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Pitcairn
{ 75, 66, 189, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Puerto Rico
- { 75, 66, 194, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Rwanda
- { 75, 66, 196, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Saint Helena
- { 75, 66, 197, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Saint Kitts And Nevis
- { 75, 66, 198, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Saint Lucia
- { 75, 66, 201, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Saint Vincent And Grenadines
- { 75, 66, 202, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Samoa
- { 75, 66, 208, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Seychelles
- { 75, 66, 209, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Sierra Leone
- { 75, 66, 210, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Singapore
- { 75, 66, 211, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Sint Maarten
- { 75, 66, 213, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Slovenia
- { 75, 66, 214, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Solomon Islands
- { 75, 66, 216, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/South Africa
- { 75, 66, 219, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/South Sudan
- { 75, 66, 222, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Sudan
- { 75, 66, 225, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Sweden
- { 75, 66, 226, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Switzerland
- { 75, 66, 230, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Tanzania
- { 75, 66, 234, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Tokelau
- { 75, 66, 235, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Tonga
- { 75, 66, 236, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Trinidad And Tobago
- { 75, 66, 241, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Turks And Caicos Islands
- { 75, 66, 242, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Tuvalu
- { 75, 66, 243, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Uganda
+ { 75, 66, 194, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Rwanda
+ { 75, 66, 196, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Saint Helena
+ { 75, 66, 197, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Saint Kitts and Nevis
+ { 75, 66, 198, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Saint Lucia
+ { 75, 66, 201, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Saint Vincent and Grenadines
+ { 75, 66, 202, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Samoa
+ { 75, 66, 208, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Seychelles
+ { 75, 66, 209, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Sierra Leone
+ { 75, 66, 210, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Singapore
+ { 75, 66, 211, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Sint Maarten
+ { 75, 66, 213, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Slovenia
+ { 75, 66, 214, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Solomon Islands
+ { 75, 66, 216, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/South Africa
+ { 75, 66, 219, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/South Sudan
+ { 75, 66, 222, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Sudan
+ { 75, 66, 225, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Sweden
+ { 75, 66, 226, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Switzerland
+ { 75, 66, 230, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Tanzania
+ { 75, 66, 234, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Tokelau
+ { 75, 66, 235, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Tonga
+ { 75, 66, 236, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Trinidad and Tobago
+ { 75, 66, 241, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Turks and Caicos Islands
+ { 75, 66, 242, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Tuvalu
+ { 75, 66, 243, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Uganda
{ 75, 66, 245, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/United Arab Emirates
- { 75, 66, 246, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/United Kingdom
+ { 75, 66, 246, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/United Kingdom
{ 75, 66, 247, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/United States Outlying Islands
{ 75, 66, 249, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/United States Virgin Islands
- { 75, 66, 252, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Vanuatu
- { 75, 66, 258, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/World
- { 75, 66, 260, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Zambia
- { 75, 66, 261, 0, 0, 9913, 9913, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Zimbabwe
- { 76, 27, 193, 181, 181, 181, 181, 155, 155, 47, 47, 47, 47, 26, 26 },// Erzya/Cyrillic/Russia
- { 77, 66, 258,10011,10011,10101,10101, 132, 132, 90, 90, 47, 47, 23, 23 },// Esperanto/Latin/World
- { 78, 66, 75,10148,10148,10238,10238,10296,10296, 90, 90, 58, 58, 23, 23 },// Estonian/Latin/Estonia
- { 79, 66, 92,10319,10319,10405,10405,10452,10452, 86, 86, 47, 47, 23, 23 },// Ewe/Latin/Ghana
- { 79, 66, 233,10319,10319,10405,10405,10452,10452, 86, 86, 47, 47, 23, 23 },// Ewe/Latin/Togo
- { 80, 66, 40,10475,10475,10615,10615,10664,10664,140,140, 49, 49, 23, 23 },// Ewondo/Latin/Cameroon
- { 81, 66, 81,10687,10687,10769,10816, 132, 132, 82, 82, 47, 58, 23, 23 },// Faroese/Latin/Faroe Islands
- { 81, 66, 65,10687,10687,10769,10816, 132, 132, 82, 82, 47, 58, 23, 23 },// Faroese/Latin/Denmark
- { 83, 66, 185, 6111, 6111, 6198, 6198,10874, 6198, 87, 87, 47, 47, 37, 47 },// Filipino/Latin/Philippines
- { 84, 66, 83,10911,11015,11143,11211,11303,11303,104,128, 68, 92, 23, 23 },// Finnish/Latin/Finland
- { 85, 66, 84,11326,11326,11410,11410, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/France
- { 85, 66, 4,11326,11326,11410,11410, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Algeria
- { 85, 66, 23,11326,11326,11410,11410, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Belgium
- { 85, 66, 25,11326,11326,11410,11410, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Benin
- { 85, 66, 37,11326,11326,11410,11410, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Burkina Faso
- { 85, 66, 38,11326,11326,11410,11410, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Burundi
- { 85, 66, 40,11326,11326,11410,11410, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Cameroon
- { 85, 66, 41,11326,11326,11472,11472, 132, 132, 84, 84, 63, 63, 23, 23 },// French/Latin/Canada
- { 85, 66, 46,11326,11326,11410,11410, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Central African Republic
- { 85, 66, 48,11326,11326,11410,11410, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Chad
- { 85, 66, 55,11326,11326,11410,11410, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Comoros
- { 85, 66, 56,11326,11326,11410,11410, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Congo Brazzaville
- { 85, 66, 57,11326,11326,11410,11410, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Congo Kinshasa
- { 85, 66, 67,11326,11326,11410,11410, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Djibouti
- { 85, 66, 73,11326,11326,11410,11410, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Equatorial Guinea
- { 85, 66, 85,11326,11326,11410,11410, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/French Guiana
- { 85, 66, 86,11326,11326,11410,11410, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/French Polynesia
- { 85, 66, 88,11326,11326,11410,11410, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Gabon
- { 85, 66, 97,11326,11326,11410,11410, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Guadeloupe
- { 85, 66, 102,11326,11326,11410,11410, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Guinea
- { 85, 66, 104,11326,11326,11410,11410, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Haiti
- { 85, 66, 118,11326,11326,11410,11410, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Ivory Coast
- { 85, 66, 138,11326,11326,11410,11410, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Luxembourg
- { 85, 66, 141,11326,11326,11410,11410, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Madagascar
- { 85, 66, 145,11326,11326,11410,11410, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Mali
- { 85, 66, 148,11326,11326,11410,11410, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Martinique
- { 85, 66, 149,11326,11326,11410,11410, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Mauritania
- { 85, 66, 150,11326,11326,11410,11410, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Mauritius
- { 85, 66, 151,11326,11326,11410,11410, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Mayotte
- { 85, 66, 155,11326,11326,11410,11410, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Monaco
- { 85, 66, 159,11326,11326,11535,11535, 132, 132, 84, 84, 60, 60, 23, 23 },// French/Latin/Morocco
- { 85, 66, 166,11326,11326,11410,11410, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/New Caledonia
- { 85, 66, 170,11326,11326,11410,11410, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Niger
- { 85, 66, 191,11326,11326,11410,11410, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Reunion
- { 85, 66, 194,11326,11326,11410,11410, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Rwanda
- { 85, 66, 195,11326,11326,11410,11410, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Saint Barthelemy
- { 85, 66, 199,11326,11326,11410,11410, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Saint Martin
- { 85, 66, 200,11326,11326,11410,11410, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Saint Pierre And Miquelon
- { 85, 66, 206,11326,11326,11410,11410, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Senegal
- { 85, 66, 208,11326,11326,11410,11410, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Seychelles
- { 85, 66, 226,11326,11326,11410,11410, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Switzerland
- { 85, 66, 227,11326,11326,11410,11410, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Syria
- { 85, 66, 233,11326,11326,11410,11410, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Togo
- { 85, 66, 238,11326,11326,11410,11410, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Tunisia
- { 85, 66, 252,11326,11326,11410,11410, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Vanuatu
- { 85, 66, 256,11326,11326,11410,11410, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Wallis And Futuna
- { 86, 66, 117,11595,11595,11671,11671,11718,11718, 76, 76, 47, 47, 23, 23 },// Friulian/Latin/Italy
- { 87, 66, 206,11741,11741,11817,11817,11864,11864, 76, 76, 47, 47, 23, 23 },// Fulah/Latin/Senegal
- { 87, 1, 37,11887,11887,12016,11887,12109,12109,129,129, 93,129, 35, 35 },// Fulah/Adlam/Burkina Faso
- { 87, 1, 40,11887,11887,12016,11887,12109,12109,129,129, 93,129, 35, 35 },// Fulah/Adlam/Cameroon
- { 87, 1, 89,11887,11887,12016,11887,12109,12109,129,129, 93,129, 35, 35 },// Fulah/Adlam/Gambia
- { 87, 1, 92,11887,11887,12016,11887,12109,12109,129,129, 93,129, 35, 35 },// Fulah/Adlam/Ghana
- { 87, 1, 101,11887,11887,12016,11887,12109,12109,129,129, 93,129, 35, 35 },// Fulah/Adlam/Guinea Bissau
- { 87, 1, 102,11887,11887,12016,11887,12109,12109,129,129, 93,129, 35, 35 },// Fulah/Adlam/Guinea
- { 87, 1, 134,11887,11887,12016,11887,12109,12109,129,129, 93,129, 35, 35 },// Fulah/Adlam/Liberia
- { 87, 1, 149,11887,11887,12016,11887,12109,12109,129,129, 93,129, 35, 35 },// Fulah/Adlam/Mauritania
- { 87, 1, 169,11887,11887,12016,11887,12109,12109,129,129, 93,129, 35, 35 },// Fulah/Adlam/Nigeria
- { 87, 1, 170,11887,11887,12016,11887,12109,12109,129,129, 93,129, 35, 35 },// Fulah/Adlam/Niger
- { 87, 1, 206,11887,11887,12016,11887,12109,12109,129,129, 93,129, 35, 35 },// Fulah/Adlam/Senegal
- { 87, 1, 209,11887,11887,12016,11887,12109,12109,129,129, 93,129, 35, 35 },// Fulah/Adlam/Sierra Leone
- { 87, 66, 37,11741,11741,11817,11817,11864,11864, 76, 76, 47, 47, 23, 23 },// Fulah/Latin/Burkina Faso
- { 87, 66, 40,11741,11741,11817,11817,11864,11864, 76, 76, 47, 47, 23, 23 },// Fulah/Latin/Cameroon
- { 87, 66, 89,11741,11741,11817,11817,11864,11864, 76, 76, 47, 47, 23, 23 },// Fulah/Latin/Gambia
- { 87, 66, 92,11741,11741,11817,11817,11864,11864, 76, 76, 47, 47, 23, 23 },// Fulah/Latin/Ghana
- { 87, 66, 101,11741,11741,11817,11817,11864,11864, 76, 76, 47, 47, 23, 23 },// Fulah/Latin/Guinea Bissau
- { 87, 66, 102,11741,11741,11817,11817,11864,11864, 76, 76, 47, 47, 23, 23 },// Fulah/Latin/Guinea
- { 87, 66, 134,11741,11741,11817,11817,11864,11864, 76, 76, 47, 47, 23, 23 },// Fulah/Latin/Liberia
- { 87, 66, 149,11741,11741,11817,11817,11864,11864, 76, 76, 47, 47, 23, 23 },// Fulah/Latin/Mauritania
- { 87, 66, 169,11741,11741,11817,11817,11864,11864, 76, 76, 47, 47, 23, 23 },// Fulah/Latin/Nigeria
- { 87, 66, 170,11741,11741,11817,11817,11864,11864, 76, 76, 47, 47, 23, 23 },// Fulah/Latin/Niger
- { 87, 66, 209,11741,11741,11817,11817,11864,11864, 76, 76, 47, 47, 23, 23 },// Fulah/Latin/Sierra Leone
- { 88, 66, 246,12144,12285,12451,12451,12511,12511,141,166, 60, 60, 23, 23 },// Gaelic/Latin/United Kingdom
- { 89, 66, 92, 181, 181, 181, 181, 155, 155, 47, 47, 47, 47, 26, 26 },// Ga/Latin/Ghana
- { 90, 66, 220,12534,12620,12706,12765,12824,12847, 86, 86, 59, 59, 23, 35 },// Galician/Latin/Spain
- { 91, 66, 243,12882,12882,12978,12978, 132, 132, 96, 96, 47, 47, 23, 23 },// Ganda/Latin/Uganda
- { 92, 33, 77, 181, 181, 181, 181, 155, 155, 47, 47, 47, 47, 26, 26 },// Geez/Ethiopic/Ethiopia
- { 93, 35, 90,13025,13025,13123,13123,13170,13170, 98, 98, 47, 47, 23, 23 },// Georgian/Georgian/Georgia
- { 94, 66, 91,13193,13193,13275,13322, 132, 132, 82, 82, 47, 59, 23, 23 },// German/Latin/Germany
- { 94, 66, 16,13381,13381,13463,13510, 132, 132, 82, 82, 47, 58, 23, 23 },// German/Latin/Austria
- { 94, 66, 23,13193,13193,13275,13322, 132, 132, 82, 82, 47, 59, 23, 23 },// German/Latin/Belgium
- { 94, 66, 117,13381,13381,13463,13510, 132, 132, 82, 82, 47, 58, 23, 23 },// German/Latin/Italy
- { 94, 66, 136,13193,13193,13275,13322, 132, 132, 82, 82, 47, 59, 23, 23 },// German/Latin/Liechtenstein
- { 94, 66, 138,13193,13193,13275,13322, 132, 132, 82, 82, 47, 59, 23, 23 },// German/Latin/Luxembourg
- { 94, 66, 226,13193,13193,13275,13322, 132, 132, 82, 82, 47, 59, 23, 23 },// German/Latin/Switzerland
- { 96, 39, 94,13568,13682,13796,13845,13894,13894,114,114, 49, 49, 23, 23 },// Greek/Greek/Greece
- { 96, 39, 63,13568,13682,13796,13845,13894,13894,114,114, 49, 49, 23, 23 },// Greek/Greek/Cyprus
- { 97, 66, 183, 181, 181, 181, 181, 155, 155, 47, 47, 47, 47, 26, 26 },// Guarani/Latin/Paraguay
- { 98, 40, 110,13917,13917,14003,14003,14069,14069, 86, 86, 66, 66, 30, 30 },// Gujarati/Gujarati/India
- { 99, 66, 124,14099,14099,14186,14186,14233,14233, 87, 87, 47, 47, 23, 23 },// Gusii/Latin/Kenya
- { 101, 66, 169,14256,14256,14340,14340,14387,14387, 84, 84, 47, 47, 23, 23 },// Hausa/Latin/Nigeria
- { 101, 4, 169, 181, 181, 181, 181, 155, 155, 47, 47, 47, 47, 26, 26 },// Hausa/Arabic/Nigeria
- { 101, 66, 92,14256,14256,14340,14340,14387,14387, 84, 84, 47, 47, 23, 23 },// Hausa/Latin/Ghana
- { 101, 66, 170,14256,14256,14340,14340,14387,14387, 84, 84, 47, 47, 23, 23 },// Hausa/Latin/Niger
- { 102, 66, 248,14410,14410,14504,14504, 155, 155, 94, 94, 58, 58, 26, 26 },// Hawaiian/Latin/United States
- { 103, 47, 116,14562,14562,14633,14633, 155, 155, 71, 71, 57, 57, 26, 26 },// Hebrew/Hebrew/Israel
- { 105, 29, 110,14690,14690,14762,14762,14820,14820, 72, 72, 58, 58, 29, 29 },// Hindi/Devanagari/India
- { 105, 66, 110, 181, 181, 181, 181, 155, 155, 47, 47, 47, 47, 26, 26 },// Hindi/Latin/India
- { 107, 66, 108,14849,14849,14946,14946,15009,15009, 97, 97, 63, 63, 24, 24 },// Hungarian/Latin/Hungary
- { 108, 66, 109,15033,15033,15114,15114,15172,15172, 81, 81, 58, 58, 23, 23 },// Icelandic/Latin/Iceland
- { 109, 66, 258, 181, 181, 181, 181, 155, 155, 47, 47, 47, 47, 26, 26 },// Ido/Latin/World
- { 110, 66, 169,15195,15195,15281,15281,15328,15328, 86, 86, 47, 47, 23, 23 },// Igbo/Latin/Nigeria
- { 111, 66, 83,15351,15351,15490,15490,15566,15566,139,139, 76, 76, 24, 24 },// Inari Sami/Latin/Finland
- { 112, 66, 111,15590,15590,15676,15676, 132, 132, 86, 86, 47, 47, 23, 23 },// Indonesian/Latin/Indonesia
- { 114, 66, 258,15723,15723,15815,15815, 155, 5002, 92, 92, 47, 47, 26, 23 },// Interlingua/Latin/World
- { 116, 18, 41, 181, 181, 181, 181, 155, 155, 47, 47, 47, 47, 26, 26 },// Inuktitut/Canadian Aboriginal/Canada
- { 116, 66, 41, 181, 181, 181, 181, 155, 155, 47, 47, 47, 47, 26, 26 },// Inuktitut/Latin/Canada
- { 118, 66, 114,15862,15862,15968,15968,16029,16029,106,106, 61, 61, 23, 23 },// Irish/Latin/Ireland
- { 118, 66, 246,15862,15862,15968,15968,16029,16029,106,106, 61, 61, 23, 23 },// Irish/Latin/United Kingdom
- { 119, 66, 117,16052,16052,16145,16145,16192,16192, 93, 93, 47, 47, 23, 23 },// Italian/Latin/Italy
- { 119, 66, 203,16052,16052,16145,16145,16192,16192, 93, 93, 47, 47, 23, 23 },// Italian/Latin/San Marino
- { 119, 66, 226,16052,16052,16145,16145,16192,16192, 93, 93, 47, 47, 23, 23 },// Italian/Latin/Switzerland
- { 119, 66, 253,16052,16052,16145,16145,16192,16192, 93, 93, 47, 47, 23, 23 },// Italian/Latin/Vatican City
- { 120, 53, 120, 5655, 5655, 5655, 5655, 155, 155, 38, 38, 38, 38, 26, 26 },// Japanese/Japanese/Japan
- { 121, 66, 111,15590,15590,16215,16215, 132, 132, 86, 86, 47, 47, 23, 23 },// Javanese/Latin/Indonesia
- { 122, 66, 169, 181, 181, 181, 181, 155, 155, 47, 47, 47, 47, 26, 26 },// Jju/Latin/Nigeria
- { 123, 66, 206,16262,16262,16343,16343,16378,16378, 81, 81, 35, 35, 23, 23 },// Jola Fonyi/Latin/Senegal
- { 124, 66, 43,16401,16401,16485,16485, 132, 132, 84, 84, 47, 47, 23, 23 },// Kabuverdianu/Latin/Cape Verde
- { 125, 66, 4,16532,16615,16698,16698,16745,16745, 83, 83, 47, 47, 23, 23 },// Kabyle/Latin/Algeria
- { 126, 66, 40,16768,16768,16768,16768, 155, 155,102,102,102,102, 26, 26 },// Kako/Latin/Cameroon
- { 127, 66, 95,16870,16968,17078,17078, 132, 132, 98,110, 49, 49, 23, 23 },// Kalaallisut/Latin/Greenland
- { 128, 66, 124,17127,17127,17247,17247,17295,17295,120,120, 48, 48, 23, 23 },// Kalenjin/Latin/Kenya
- { 129, 66, 124,17318,17318,17506,17506,17553,17553,188,188, 47, 47, 23, 23 },// Kamba/Latin/Kenya
- { 130, 56, 110,17576,17576,17662,17724,17792,17792, 86, 86, 62, 68, 30, 30 },// Kannada/Kannada/India
- { 132, 4, 110,17822,17822,17822,17822,17893,17893, 71, 71, 71, 71, 23, 23 },// Kashmiri/Arabic/India
- { 132, 29, 110, 181, 181, 181, 181, 155, 155, 47, 47, 47, 47, 26, 26 },// Kashmiri/Devanagari/India
- { 133, 27, 123,17916,17998,18080,18080,18139,18139, 82, 82, 59, 59, 23, 23 },// Kazakh/Cyrillic/Kazakhstan
- { 134, 66, 40, 181, 181, 181, 181, 155, 155, 47, 47, 47, 47, 26, 26 },// Kenyang/Latin/Cameroon
- { 135, 60, 39,18162,18162,18162,18162,18232,18232, 70, 70, 70, 70, 23, 23 },// Khmer/Khmer/Cambodia
- { 136, 66, 99, 181, 181, 181, 181, 155, 155, 47, 47, 47, 47, 26, 26 },// Kiche/Latin/Guatemala
- { 137, 66, 124,18255,18255,18439,18439,18486,18486,184,184, 47, 47, 23, 23 },// Kikuyu/Latin/Kenya
- { 138, 66, 194,18509,18509,18608,18608, 155, 155, 99, 99, 59, 59, 26, 26 },// Kinyarwanda/Latin/Rwanda
- { 141, 29, 110,18667,18667,18752,18667, 155, 155, 85, 85, 58, 85, 26, 26 },// Konkani/Devanagari/India
- { 142, 63, 218,18810,18810,18810,18810,18810,18810, 38, 38, 38, 38, 38, 38 },// Korean/Korean/South Korea
- { 142, 63, 174,18810,18810,18810,18810,18810,18810, 38, 38, 38, 38, 38, 38 },// Korean/Korean/North Korea
- { 144, 66, 145,18848,18848,18935,18935,18980,18980, 87, 87, 45, 45, 23, 23 },// Koyraboro Senni/Latin/Mali
- { 145, 66, 145,18848,18848,18935,18935,18980,18980, 87, 87, 45, 45, 23, 23 },// Koyra Chiini/Latin/Mali
- { 146, 66, 134, 181, 181, 181, 181, 155, 155, 47, 47, 47, 47, 26, 26 },// Kpelle/Latin/Liberia
- { 148, 66, 239,19003,19090,19190,19190,19237,19237, 87,100, 47, 47, 23, 23 },// Kurdish/Latin/Turkey
- { 149, 66, 40,19260,19260,19402,19402, 155, 155,142,142, 50, 50, 26, 26 },// Kwasio/Latin/Cameroon
- { 150, 27, 128,19452, 7152,19531,19578, 7278, 7278, 79, 79, 47, 58, 23, 23 },// Kyrgyz/Cyrillic/Kyrgyzstan
- { 151, 66, 248,19636,19636,19636,19636, 155, 155,179,179,179,179, 26, 26 },// Lakota/Latin/United States
- { 152, 66, 230,19815,19815,19925,19925,20007,20007,110,110, 82, 82, 23, 23 },// Langi/Latin/Tanzania
- { 153, 65, 129,20030,20030,20104,20104, 155, 155, 74, 74, 60, 60, 26, 26 },// Lao/Lao/Laos
- { 154, 66, 253, 181, 181, 181, 181, 155, 155, 47, 47, 47, 47, 26, 26 },// Latin/Latin/Vatican City
- { 155, 66, 131,20164,20164,20264,20264, 132, 132,100,100, 64, 64, 23, 23 },// Latvian/Latin/Latvia
- { 158, 66, 57,20328,20328,20530,20530,20577,20577,202,202, 47, 47, 23, 23 },// Lingala/Latin/Congo Kinshasa
- { 158, 66, 7,20328,20328,20530,20530,20577,20577,202,202, 47, 47, 23, 23 },// Lingala/Latin/Angola
- { 158, 66, 46,20328,20328,20530,20530,20577,20577,202,202, 47, 47, 23, 23 },// Lingala/Latin/Central African Republic
- { 158, 66, 56,20328,20328,20530,20530,20577,20577,202,202, 47, 47, 23, 23 },// Lingala/Latin/Congo Brazzaville
- { 160, 66, 137,20600,20695,20792,20792,20861,20861, 95, 97, 69, 69, 23, 23 },// Lithuanian/Latin/Lithuania
- { 161, 66, 258, 181, 181, 181, 181, 155, 155, 47, 47, 47, 47, 26, 26 },// Lojban/Latin/World
- { 162, 66, 91,20884,20968,21060,21107, 5002, 5002, 84, 92, 47, 59, 23, 23 },// Lower Sorbian/Latin/Germany
- { 163, 66, 91,21166,21166,21250,21250, 132, 132, 84, 84, 58, 58, 23, 23 },// Low German/Latin/Germany
- { 163, 66, 165,21166,21166,21250,21250, 132, 132, 84, 84, 58, 58, 23, 23 },// Low German/Latin/Netherlands
- { 164, 66, 57,21308,21308,21406,21406,21454,21454, 98, 98, 48, 48, 23, 23 },// Luba Katanga/Latin/Congo Kinshasa
- { 165, 66, 225, 181, 181, 181, 181, 155, 155, 47, 47, 47, 47, 26, 26 },// Lule Sami/Latin/Sweden
- { 166, 66, 124,21477,21477,21662,21662,21709,21709,185,185, 47, 47, 23, 23 },// Luo/Latin/Kenya
- { 167, 66, 138,21732,21732,21816,21863, 132, 132, 84, 84, 47, 58, 23, 23 },// Luxembourgish/Latin/Luxembourg
- { 168, 66, 124, 2499, 2499,21921,21921, 132, 132, 83, 83, 47, 47, 23, 23 },// Luyia/Latin/Kenya
- { 169, 27, 140,21968,21968,22052,22052, 5154, 5154, 84, 84, 60, 60, 23, 23 },// Macedonian/Cyrillic/Macedonia
- { 170, 66, 230,22112,22112,22198,22198, 132, 132, 86, 86, 47, 47, 23, 23 },// Machame/Latin/Tanzania
- { 171, 29, 110,22245,22316,22387,14762,22444,22444, 71, 71, 57, 58, 28, 28 },// Maithili/Devanagari/India
- { 172, 66, 160,22472,22472,22684,22684,22731,22731,212,212, 47, 47, 23, 23 },// Makhuwa Meetto/Latin/Mozambique
- { 173, 66, 230,22754,22754,22198,22198, 132, 132,263,263, 47, 47, 23, 23 },// Makonde/Latin/Tanzania
- { 174, 66, 141,23017,23017,23108,23108, 132, 132, 91, 91, 47, 47, 23, 23 },// Malagasy/Latin/Madagascar
- { 175, 74, 110,23155,23155,23242,23242,23303,23303, 87, 87, 61, 61, 31, 31 },// Malayalam/Malayalam/India
- { 176, 66, 143,23334,23334,23415,23415, 7805, 7805, 81, 81, 47, 47, 23, 23 },// Malay/Latin/Malaysia
- { 176, 4, 143, 181, 181, 181, 181, 155, 155, 47, 47, 47, 47, 26, 26 },// Malay/Arabic/Malaysia
- { 176, 66, 35,23334,23334,23415,23415, 7805, 7805, 81, 81, 47, 47, 23, 23 },// Malay/Latin/Brunei
- { 176, 66, 111,23334,23334,23415,23415, 7805, 7805, 81, 81, 47, 47, 23, 23 },// Malay/Latin/Indonesia
- { 176, 66, 210,23334,23334,23415,23415, 7805, 7805, 81, 81, 47, 47, 23, 23 },// Malay/Latin/Singapore
- { 177, 66, 146,23462,23462,23547,23547,23594,23629, 85, 85, 47, 47, 35, 23 },// Maltese/Latin/Malta
- { 179, 9, 110,23652,23739,23826,23739,23883,23919, 87, 87, 57, 87, 36, 37 },// Manipuri/Bangla/India
- { 179, 78, 110, 181, 181, 181, 181, 155, 155, 47, 47, 47, 47, 26, 26 },// Manipuri/Meitei Mayek/India
- { 180, 66, 115,23956,23956,24095,24095, 155, 155,139,139,101,101, 26, 26 },// Manx/Latin/Isle Of Man
- { 181, 66, 167,24196,24196,24328,24328,24386,24386,132,132, 58, 58, 23, 23 },// Maori/Latin/New Zealand
- { 182, 66, 49, 181, 181, 181, 181, 155, 155, 47, 47, 47, 47, 26, 26 },// Mapuche/Latin/Chile
- { 183, 29, 110,24409,24409,24494,24494,24559,24559, 85, 85, 65, 65, 31, 31 },// Marathi/Devanagari/India
- { 185, 66, 124,24590,24590,24721,24721, 155, 155,131,131, 50, 50, 26, 26 },// Masai/Latin/Kenya
- { 185, 66, 230,24590,24590,24721,24721, 155, 155,131,131, 50, 50, 26, 26 },// Masai/Latin/Tanzania
- { 186, 4, 112,24771,24771,24771,24771, 155, 155, 69, 69, 69, 69, 26, 26 },// Mazanderani/Arabic/Iran
- { 188, 66, 124,24840,24840,24925,24925,24972,24972, 85, 85, 47, 47, 23, 23 },// Meru/Latin/Kenya
- { 189, 66, 40,24995,24995,25136,25136,25272,25272,141,141,136,136, 35, 35 },// Meta/Latin/Cameroon
- { 190, 66, 41, 181, 181, 181, 181, 155, 155, 47, 47, 47, 47, 26, 26 },// Mohawk/Latin/Canada
- { 191, 27, 156,25307,25498,25689,25689,25787,25787,191,191, 98, 98, 37, 37 },// Mongolian/Cyrillic/Mongolia
- { 191, 83, 50, 181, 181, 181, 181, 155, 155, 47, 47, 47, 47, 26, 26 },// Mongolian/Mongolian/China
- { 192, 66, 150,25824,25824,25891,25891,25937,25937, 67, 67, 46, 46, 23, 23 },// Morisyen/Latin/Mauritius
- { 193, 66, 40,25960,25960,26098,26098,26145,26145,138,138, 47, 47, 23, 23 },// Mundang/Latin/Cameroon
- { 194, 66, 248, 181, 181, 181, 181, 155, 155, 47, 47, 47, 47, 26, 26 },// Muscogee/Latin/United States
- { 195, 66, 162,26168,26168, 85, 85, 132, 132,135,135, 47, 47, 23, 23 },// Nama/Latin/Namibia
- { 197, 66, 248, 181, 181, 181, 181, 155, 155, 47, 47, 47, 47, 26, 26 },// Navajo/Latin/United States
- { 199, 29, 164,26303,26303,26303,26303,26387,26439, 84, 84, 84, 84, 52, 51 },// Nepali/Devanagari/Nepal
- { 199, 29, 110,26303,26303,26303,26303,26387,26439, 84, 84, 84, 84, 52, 51 },// Nepali/Devanagari/India
- { 201, 66, 40,26490,26490,26490,26490, 155, 155,164,164,164,164, 26, 26 },// Ngiemboon/Latin/Cameroon
- { 202, 66, 40,26654,26654,26654,26654, 155, 155,173,173,173,173, 26, 26 },// Ngomba/Latin/Cameroon
- { 203, 66, 169,26827,26827,26909,26959, 132, 132, 82, 82, 50, 49, 23, 23 },// Nigerian Pidgin/Latin/Nigeria
- { 204, 90, 102, 181, 181, 181, 181, 155, 155, 47, 47, 47, 47, 26, 26 },// Nko/Nko/Guinea
- { 205, 4, 112,27008,27008,27008,27008, 155, 155, 76, 76, 76, 76, 26, 26 },// Northern Luri/Arabic/Iran
- { 205, 4, 113,27008,27008,27008,27008, 155, 155, 76, 76, 76, 76, 26, 26 },// Northern Luri/Arabic/Iraq
- { 206, 66, 175,27084,27084,27228,27228,27286,27286,144,144, 58, 58, 23, 23 },// Northern Sami/Latin/Norway
- { 206, 66, 83,27084,27084,27309,27309,27286,27286,144,144, 59, 59, 23, 23 },// Northern Sami/Latin/Finland
- { 206, 66, 225,27084,27084,27228,27228,27286,27286,144,144, 58, 58, 23, 23 },// Northern Sami/Latin/Sweden
- { 207, 66, 216, 181, 181, 181, 181, 155, 155, 47, 47, 47, 47, 26, 26 },// Northern Sotho/Latin/South Africa
- { 208, 66, 261,27368,27368,27479,27479,27530,27530,111,111, 51, 51, 23, 23 },// North Ndebele/Latin/Zimbabwe
- { 209, 66, 175,27553,27553,10769,10816, 132, 132, 82, 82, 47, 58, 23, 23 },// Norwegian Bokmal/Latin/Norway
- { 209, 66, 224,27553,27553,10769,10816, 132, 132, 82, 82, 47, 58, 23, 23 },// Norwegian Bokmal/Latin/Svalbard And Jan Mayen
- { 210, 66, 175,27553,27553,10769,27635, 132, 132, 82, 82, 47, 58, 23, 23 },// Norwegian Nynorsk/Latin/Norway
- { 211, 66, 219,27693,27693,27788,27788,27841,27841, 95, 95, 53, 53, 23, 23 },// Nuer/Latin/South Sudan
- { 212, 66, 142, 181, 181, 181, 181, 155, 155, 47, 47, 47, 47, 26, 26 },// Nyanja/Latin/Malawi
- { 213, 66, 243, 7416, 7416, 7567, 7567, 132, 132,151,151, 47, 47, 23, 23 },// Nyankole/Latin/Uganda
- { 214, 66, 84, 181, 181, 181, 181, 155, 155, 47, 47, 47, 47, 26, 26 },// Occitan/Latin/France
- { 215, 91, 110,27864,27864,27864,27864,27949,27949, 85, 85, 85, 85, 31, 31 },// Odia/Odia/India
- { 220, 66, 77,27980,27980,28090,28090, 132, 132,110,110, 47, 47, 23, 23 },// Oromo/Latin/Ethiopia
- { 220, 66, 124,27980,27980,28090,28090,28137, 132,110,110, 47, 47, 23, 23 },// Oromo/Latin/Kenya
- { 221, 101, 248, 181, 181, 181, 181, 155, 155, 47, 47, 47, 47, 26, 26 },// Osage/Osage/United States
- { 222, 27, 90,28160,28241,28326,28388, 7278, 7278, 81, 85, 62, 59, 23, 23 },// Ossetic/Cyrillic/Georgia
- { 222, 27, 193,28160,28241,28326,28388, 7278, 7278, 81, 85, 62, 59, 23, 23 },// Ossetic/Cyrillic/Russia
- { 227, 4, 1,28447,28515,28583,28515, 155,28650, 68, 68, 67, 68, 26, 23 },// Pashto/Arabic/Afghanistan
- { 227, 4, 178,28447,28515,28583,28515, 155,28650, 68, 68, 67, 68, 26, 23 },// Pashto/Arabic/Pakistan
- { 228, 4, 112,24771,28673,24771,24771,28746,28746, 69, 73, 69, 69, 23, 23 },// Persian/Arabic/Iran
- { 228, 4, 1,28769,28769,28769,28836,28650,28650, 67, 67, 67, 61, 23, 23 },// Persian/Arabic/Afghanistan
- { 230, 66, 187,28897,28993,29091,29091,29138,29161, 96, 98, 47, 47, 23, 23 },// Polish/Latin/Poland
- { 231, 66, 32,29184,29184,29272,29272, 132, 132, 88, 88, 59, 59, 23, 23 },// Portuguese/Latin/Brazil
- { 231, 66, 7,29184,29184,29272,29272, 132, 132, 88, 88, 59, 59, 23, 23 },// Portuguese/Latin/Angola
- { 231, 66, 43,29184,29184,29272,29272, 132, 132, 88, 88, 59, 59, 23, 23 },// Portuguese/Latin/Cape Verde
- { 231, 66, 73,29184,29184,29272,29272, 132, 132, 88, 88, 59, 59, 23, 23 },// Portuguese/Latin/Equatorial Guinea
- { 231, 66, 101,29184,29184,29272,29272, 132, 132, 88, 88, 59, 59, 23, 23 },// Portuguese/Latin/Guinea Bissau
- { 231, 66, 138,29184,29184,29272,29272, 132, 132, 88, 88, 59, 59, 23, 23 },// Portuguese/Latin/Luxembourg
- { 231, 66, 139,29184,29184,29272,29272, 132, 132, 88, 88, 59, 59, 23, 23 },// Portuguese/Latin/Macao
- { 231, 66, 160,29184,29184,29272,29272, 132, 132, 88, 88, 59, 59, 23, 23 },// Portuguese/Latin/Mozambique
- { 231, 66, 188,29184,29184,29272,29272, 132, 132, 88, 88, 59, 59, 23, 23 },// Portuguese/Latin/Portugal
- { 231, 66, 204,29184,29184,29272,29272, 132, 132, 88, 88, 59, 59, 23, 23 },// Portuguese/Latin/Sao Tome And Principe
- { 231, 66, 226,29184,29184,29272,29272, 132, 132, 88, 88, 59, 59, 23, 23 },// Portuguese/Latin/Switzerland
- { 231, 66, 232,29184,29184,29272,29272, 132, 132, 88, 88, 59, 59, 23, 23 },// Portuguese/Latin/Timor-Leste
- { 232, 66, 258, 181, 181, 181, 181, 155, 155, 47, 47, 47, 47, 26, 26 },// Prussian/Latin/World
- { 233, 41, 110,29331,29331,29398,29398,29447,29447, 67, 67, 49, 49, 27, 27 },// Punjabi/Gurmukhi/India
- { 233, 4, 178,29474,29474,29474,29474, 155, 155, 66, 66, 66, 66, 26, 26 },// Punjabi/Arabic/Pakistan
- { 234, 66, 184,29540,29540,29627,29627, 155, 155, 87, 87, 47, 47, 26, 26 },// Quechua/Latin/Peru
- { 234, 66, 28,29540,29540,29627,29627, 155, 155, 87, 87, 47, 47, 26, 26 },// Quechua/Latin/Bolivia
- { 234, 66, 70,29540,29540,29627,29627, 155, 155, 87, 87, 47, 47, 26, 26 },// Quechua/Latin/Ecuador
- { 235, 66, 192,29674,29674,29771,29771,29830,29830, 97, 97, 59, 59, 23, 23 },// Romanian/Latin/Romania
- { 235, 66, 154,29674,29674,29771,29771,29830,29830, 97, 97, 59, 59, 23, 23 },// Romanian/Latin/Moldova
- { 236, 66, 226,29853,29944,30068,30068,30134,30134, 91,124, 66, 66, 23, 23 },// Romansh/Latin/Switzerland
- { 237, 66, 230,30157,30157,30350,30350,30388,30388,193,193, 38, 38, 23, 23 },// Rombo/Latin/Tanzania
- { 238, 66, 38,30411,30411,30516,30516, 155, 155,105,105, 59, 59, 26, 26 },// Rundi/Latin/Burundi
- { 239, 27, 193, 7152,30575,30656,30717, 7278, 7278, 79, 81, 61, 61, 23, 23 },// Russian/Cyrillic/Russia
- { 239, 27, 22, 7152,30575,30656,30717, 7278, 7278, 79, 81, 61, 61, 23, 23 },// Russian/Cyrillic/Belarus
- { 239, 27, 123, 7152,30575,30656,30717, 7278, 7278, 79, 81, 61, 61, 23, 23 },// Russian/Cyrillic/Kazakhstan
- { 239, 27, 128, 7152,30575,30656,30717, 7278, 7278, 79, 81, 61, 61, 23, 23 },// Russian/Cyrillic/Kyrgyzstan
- { 239, 27, 154, 7152,30575,30656,30717, 7278, 7278, 79, 81, 61, 61, 23, 23 },// Russian/Cyrillic/Moldova
- { 239, 27, 244, 7152,30575,30656,30717, 7278, 7278, 79, 81, 61, 61, 23, 23 },// Russian/Cyrillic/Ukraine
- { 240, 66, 230,22112,22112,22198,22198, 132, 132, 86, 86, 47, 47, 23, 23 },// Rwa/Latin/Tanzania
- { 241, 66, 74, 181, 181, 181, 181, 155, 155, 47, 47, 47, 47, 26, 26 },// Saho/Latin/Eritrea
- { 242, 27, 193,30778,30893,31013,31013,31062,31062,115,120, 49, 49, 23, 23 },// Sakha/Cyrillic/Russia
- { 243, 66, 124,31085,31085,31257,31257,31304,31304,172,172, 47, 47, 23, 23 },// Samburu/Latin/Kenya
- { 245, 66, 46,31327,31327,31417,31417,31464,31464, 90, 90, 47, 47, 23, 23 },// Sango/Latin/Central African Republic
- { 246, 66, 230,31487,31487,31603,31603, 155, 155,116,116, 47, 47, 26, 26 },// Sangu/Latin/Tanzania
- { 247, 29, 110,31650,31650,31769,31769, 155,22444,119,119, 82, 82, 26, 28 },// Sanskrit/Devanagari/India
- { 248, 93, 110,31851,31851,31933,31933,31979,31979, 82, 82, 46, 46, 23, 23 },// Santali/Ol Chiki/India
- { 248, 29, 110, 181, 181, 181, 181, 155, 155, 47, 47, 47, 47, 26, 26 },// Santali/Devanagari/India
- { 249, 66, 117,32002,32002,32102,32102,32149,32149,100,100, 47, 47, 23, 23 },// Sardinian/Latin/Italy
- { 251, 66, 160,32172,32172,32259,32259, 132, 132, 87, 87, 47, 47, 23, 23 },// Sena/Latin/Mozambique
- { 252, 27, 207,32306,32306,32386,32386, 5154, 5154, 80, 80, 47, 47, 23, 23 },// Serbian/Cyrillic/Serbia
- { 252, 27, 29,32306,32306,32386,32386, 5154, 5154, 80, 80, 47, 47, 23, 23 },// Serbian/Cyrillic/Bosnia And Herzegovina
- { 252, 27, 126,32306,32306,32433,32433, 5154, 5154, 80, 80, 49, 49, 23, 23 },// Serbian/Cyrillic/Kosovo
- { 252, 27, 157,32306,32306,32433,32433, 5154, 5154, 80, 80, 49, 49, 23, 23 },// Serbian/Cyrillic/Montenegro
- { 252, 66, 29,32482,32482,32562,32562, 5002, 5002, 80, 80, 47, 47, 23, 23 },// Serbian/Latin/Bosnia And Herzegovina
- { 252, 66, 126,32482,32482,32609,32609, 5002, 5002, 80, 80, 49, 49, 23, 23 },// Serbian/Latin/Kosovo
- { 252, 66, 157,32482,32482,32609,32609, 5002, 5002, 80, 80, 49, 49, 23, 23 },// Serbian/Latin/Montenegro
- { 252, 66, 207,32482,32482,32562,32562, 5002, 5002, 80, 80, 47, 47, 23, 23 },// Serbian/Latin/Serbia
- { 253, 66, 230,32658,32658,22198,22198, 132, 132, 83, 83, 47, 47, 23, 23 },// Shambala/Latin/Tanzania
- { 254, 66, 261,32741,32741,32840,32840,32887,32887, 99, 99, 47, 47, 23, 23 },// Shona/Latin/Zimbabwe
- { 255, 141, 50,32910,32910,32910,32910, 155, 155, 37, 37, 37, 37, 26, 26 },// Sichuan Yi/Yi/China
- { 256, 66, 117, 181, 181, 181, 181, 155, 155, 47, 47, 47, 47, 26, 26 },// Sicilian/Latin/Italy
- { 257, 66, 77, 181, 181, 181, 181, 155, 155, 47, 47, 47, 47, 26, 26 },// Sidamo/Latin/Ethiopia
- { 258, 66, 187, 181, 181, 181, 181, 155, 155, 47, 47, 47, 47, 26, 26 },// Silesian/Latin/Poland
- { 259, 4, 178,32947,32947,32947,32947, 132, 132, 71, 71, 71, 71, 23, 23 },// Sindhi/Arabic/Pakistan
- { 259, 29, 110,33018,33018,33092,33145,33196,33225, 74, 74, 53, 51, 29, 30 },// Sindhi/Devanagari/India
- { 260, 119, 221,33255,33255,33350,33408,33468,33468, 95, 95, 58, 60, 31, 31 },// Sinhala/Sinhala/Sri Lanka
- { 261, 66, 83, 181, 181, 181, 181, 155, 155, 47, 47, 47, 47, 26, 26 },// Skolt Sami/Latin/Finland
- { 262, 66, 212,33499,33580,33668,33668, 5002, 5002, 81, 88, 47, 47, 23, 23 },// Slovak/Latin/Slovakia
- { 263, 66, 213,33715,33715,33800,33800, 5002, 5002, 85, 85, 58, 58, 23, 23 },// Slovenian/Latin/Slovenia
- { 264, 66, 243,12882,12882,12978,12978, 132, 132, 96, 96, 47, 47, 23, 23 },// Soga/Latin/Uganda
- { 265, 66, 215,33858,33949,34137,34137,34184,34184, 91,188, 47, 47, 23, 23 },// Somali/Latin/Somalia
- { 265, 66, 67,33858,33949,34137,34137,34184,34184, 91,188, 47, 47, 23, 23 },// Somali/Latin/Djibouti
- { 265, 66, 77,33858,33949,34137,34137,34184,34184, 91,188, 47, 47, 23, 23 },// Somali/Latin/Ethiopia
- { 265, 66, 124,33858,33949,34137,34137,34184,34184, 91,188, 47, 47, 23, 23 },// Somali/Latin/Kenya
- { 266, 4, 112, 181, 181, 181, 181, 155, 155, 47, 47, 47, 47, 26, 26 },// Southern Kurdish/Arabic/Iran
- { 267, 66, 225, 181, 181, 181, 181, 155, 155, 47, 47, 47, 47, 26, 26 },// Southern Sami/Latin/Sweden
- { 268, 66, 216, 181, 181, 181, 181, 155, 155, 47, 47, 47, 47, 26, 26 },// Southern Sotho/Latin/South Africa
- { 269, 66, 216, 181, 181, 181, 181, 155, 155, 47, 47, 47, 47, 26, 26 },// South Ndebele/Latin/South Africa
- { 270, 66, 220,34207,34207,34295,34295,34343,34343, 88, 88, 48, 48, 23, 23 },// Spanish/Latin/Spain
- { 270, 66, 11,34207,34207,34295,34295,34343,34343, 88, 88, 48, 48, 23, 23 },// Spanish/Latin/Argentina
- { 270, 66, 24,34207,34207,34295,34295,34343,34343, 88, 88, 48, 48, 23, 23 },// Spanish/Latin/Belize
- { 270, 66, 28,34207,34207,34295,34295,34343,34343, 88, 88, 48, 48, 23, 23 },// Spanish/Latin/Bolivia
- { 270, 66, 32,34207,34207,34295,34295,34343,34343, 88, 88, 48, 48, 23, 23 },// Spanish/Latin/Brazil
- { 270, 66, 42,34207,34207,34295,34295,34343,34343, 88, 88, 48, 48, 23, 23 },// Spanish/Latin/Canary Islands
- { 270, 66, 47,34207,34207,34295,34295,34343,34343, 88, 88, 48, 48, 23, 23 },// Spanish/Latin/Ceuta And Melilla
- { 270, 66, 49,34207,34207,34366,34295,34343,34343, 88, 88, 60, 48, 23, 23 },// Spanish/Latin/Chile
- { 270, 66, 54,34207,34207,34366,34295,34343,34343, 88, 88, 60, 48, 23, 23 },// Spanish/Latin/Colombia
- { 270, 66, 59,34207,34207,34295,34295,34343,34343, 88, 88, 48, 48, 23, 23 },// Spanish/Latin/Costa Rica
- { 270, 66, 61,34207,34207,34295,34295,34343,34343, 88, 88, 48, 48, 23, 23 },// Spanish/Latin/Cuba
- { 270, 66, 69,34207,34207,34295,34295,34343,34343, 88, 88, 48, 48, 23, 23 },// Spanish/Latin/Dominican Republic
- { 270, 66, 70,34207,34207,34295,34295,34343,34343, 88, 88, 48, 48, 23, 23 },// Spanish/Latin/Ecuador
- { 270, 66, 72,34207,34207,34295,34295,34343,34343, 88, 88, 48, 48, 23, 23 },// Spanish/Latin/El Salvador
- { 270, 66, 73,34207,34207,34295,34295,34343,34343, 88, 88, 48, 48, 23, 23 },// Spanish/Latin/Equatorial Guinea
- { 270, 66, 99,34207,34207,34295,34295,34343,34343, 88, 88, 48, 48, 23, 23 },// Spanish/Latin/Guatemala
- { 270, 66, 106,34207,34207,34295,34295,34343,34343, 88, 88, 48, 48, 23, 23 },// Spanish/Latin/Honduras
- { 270, 66, 130,34207,34207,34295,34295,34343,34343, 88, 88, 48, 48, 23, 23 },// Spanish/Latin/Latin America
- { 270, 66, 152,34207,34207,34295,34295,34343,34343, 88, 88, 48, 48, 23, 23 },// Spanish/Latin/Mexico
- { 270, 66, 168,34207,34207,34295,34295,34343,34343, 88, 88, 48, 48, 23, 23 },// Spanish/Latin/Nicaragua
- { 270, 66, 181,34207,34207,34295,34295,34343,34343, 88, 88, 48, 48, 23, 23 },// Spanish/Latin/Panama
- { 270, 66, 183,34207,34207,34366,34366,34343,34343, 88, 88, 60, 60, 23, 23 },// Spanish/Latin/Paraguay
- { 270, 66, 184,29540,34426,34513,34572,34343,34343, 87, 87, 59, 59, 23, 23 },// Spanish/Latin/Peru
- { 270, 66, 185,34207,34207,34295,34295,34343,34343, 88, 88, 48, 48, 23, 23 },// Spanish/Latin/Philippines
- { 270, 66, 189,34207,34207,34295,34295,34343,34343, 88, 88, 48, 48, 23, 23 },// Spanish/Latin/Puerto Rico
- { 270, 66, 248,34207,34207,34295,34295,34343,34343, 88, 88, 48, 48, 23, 23 },// Spanish/Latin/United States
- { 270, 66, 250,29540,34426,34513,34572,34343,34343, 87, 87, 59, 59, 23, 23 },// Spanish/Latin/Uruguay
- { 270, 66, 254,34207,34207,34366,34366,34343,34343, 88, 88, 60, 60, 23, 23 },// Spanish/Latin/Venezuela
- { 271, 135, 159,34631,34631,34711,34711,34758,34758, 80, 80, 47, 47, 23, 23 },// Standard Moroccan Tamazight/Tifinagh/Morocco
- { 272, 66, 111,34781,34781,34867,34867,34914,34914, 86, 86, 47, 47, 23, 23 },// Sundanese/Latin/Indonesia
- { 273, 66, 230, 2499, 2499,22198,22198, 132, 132, 83, 83, 47, 47, 23, 23 },// Swahili/Latin/Tanzania
- { 273, 66, 57, 2499, 2499,22198,22198, 132, 132, 83, 83, 47, 47, 23, 23 },// Swahili/Latin/Congo Kinshasa
- { 273, 66, 124, 2499, 2499,22198,22198, 132, 132, 83, 83, 47, 47, 23, 23 },// Swahili/Latin/Kenya
- { 273, 66, 243, 2499, 2499,22198,22198, 132, 132, 83, 83, 47, 47, 23, 23 },// Swahili/Latin/Uganda
- { 274, 66, 216, 181, 181, 181, 181, 155, 155, 47, 47, 47, 47, 26, 26 },// Swati/Latin/South Africa
- { 275, 66, 225,34937,34937,35022,35022, 132, 132, 85, 85, 58, 58, 23, 23 },// Swedish/Latin/Sweden
- { 275, 66, 2,34937,34937,35022,35022, 132, 132, 85, 85, 58, 58, 23, 23 },// Swedish/Latin/Aland Islands
- { 275, 66, 83,34937,34937,35022,35022, 132, 132, 85, 85, 58, 58, 23, 23 },// Swedish/Latin/Finland
- { 276, 66, 226,35080,35080,13275,13275, 132, 132, 85, 85, 47, 47, 23, 23 },// Swiss German/Latin/Switzerland
- { 276, 66, 84,35080,35080,13275,13275, 132, 132, 85, 85, 47, 47, 23, 23 },// Swiss German/Latin/France
- { 276, 66, 136,35080,35080,13275,13275, 132, 132, 85, 85, 47, 47, 23, 23 },// Swiss German/Latin/Liechtenstein
- { 277, 123, 113, 181, 181, 181, 181, 155, 155, 47, 47, 47, 47, 26, 26 },// Syriac/Syriac/Iraq
- { 278, 135, 159,34631,34631,34711,34711,34758,34758, 80, 80, 47, 47, 23, 23 },// Tachelhit/Tifinagh/Morocco
- { 278, 66, 159,35165,35165,35245,35245,35292,35292, 80, 80, 47, 47, 23, 23 },// Tachelhit/Latin/Morocco
- { 280, 127, 255, 181, 181, 181, 181, 155, 155, 47, 47, 47, 47, 26, 26 },// Tai Dam/Tai Viet/Vietnam
- { 281, 66, 124,35315,35315,35535,35535,35582,35582,220,220, 47, 47, 23, 23 },// Taita/Latin/Kenya
- { 282, 27, 229,35605,35605,19531,19531, 7278, 7278, 70, 70, 47, 47, 23, 23 },// Tajik/Cyrillic/Tajikistan
- { 283, 129, 110,35675,35675,35760,35760,35817,35817, 85, 85, 57, 57, 30, 30 },// Tamil/Tamil/India
- { 283, 129, 143,35675,35675,35760,35760,35817,35817, 85, 85, 57, 57, 30, 30 },// Tamil/Tamil/Malaysia
- { 283, 129, 210,35675,35675,35760,35760,35817,35817, 85, 85, 57, 57, 30, 30 },// Tamil/Tamil/Singapore
- { 283, 129, 221,35675,35675,35760,35760,35817,35817, 85, 85, 57, 57, 30, 30 },// Tamil/Tamil/Sri Lanka
- { 284, 66, 228, 181, 181, 181, 181, 155, 155, 47, 47, 47, 47, 26, 26 },// Taroko/Latin/Taiwan
- { 285, 66, 170,18848,18848,18935,18935,18980,18980, 87, 87, 45, 45, 23, 23 },// Tasawaq/Latin/Niger
- { 286, 27, 193,35847,35847,35927,35927, 155, 155, 80, 80, 61, 61, 26, 26 },// Tatar/Cyrillic/Russia
- { 287, 131, 110,35988,35988,36073,36073,36134,36134, 85, 85, 61, 61, 30, 30 },// Telugu/Telugu/India
- { 288, 66, 243,36164,36164,36257,36257,36304,36304, 93, 93, 47, 47, 23, 23 },// Teso/Latin/Uganda
- { 288, 66, 124,36164,36164,36257,36257,36304,36304, 93, 93, 47, 47, 23, 23 },// Teso/Latin/Kenya
- { 289, 133, 231,36327,36327,36424,36424,36424,36424, 97, 97, 62, 62, 62, 62 },// Thai/Thai/Thailand
- { 290, 134, 50,36486,36644, 9497, 9497, 155, 155,158,146, 62, 62, 26, 26 },// Tibetan/Tibetan/China
- { 290, 134, 110,36486,36644, 9497, 9497, 155, 155,158,146, 62, 62, 26, 26 },// Tibetan/Tibetan/India
- { 291, 33, 74, 181, 181, 181, 181, 155, 155, 47, 47, 47, 47, 26, 26 },// Tigre/Ethiopic/Eritrea
- { 292, 33, 77,36790,36790,36843,36843,36878,36878, 53, 53, 35, 35, 23, 23 },// Tigrinya/Ethiopic/Ethiopia
- { 292, 33, 74,36790,36790,36843,36843,36878,36878, 53, 53, 35, 35, 23, 23 },// Tigrinya/Ethiopic/Eritrea
- { 294, 66, 182, 181, 181, 181, 181, 155, 155, 47, 47, 47, 47, 26, 26 },// Tok Pisin/Latin/Papua New Guinea
- { 295, 66, 235,36901,36901,36987,36987,37037,37037, 86, 86, 50, 50, 23, 23 },// Tongan/Latin/Tonga
- { 296, 66, 216, 181, 181, 181, 181, 155, 155, 47, 47, 47, 47, 26, 26 },// Tsonga/Latin/South Africa
- { 297, 66, 216, 181, 181, 181, 181, 155, 155, 47, 47, 47, 47, 26, 26 },// Tswana/Latin/South Africa
- { 298, 66, 239,37060,37060,37134,37134,37181,37181, 74, 74, 47, 47, 23, 23 },// Turkish/Latin/Turkey
- { 298, 66, 63,37060,37060,37134,37134,37181,37181, 74, 74, 47, 47, 23, 23 },// Turkish/Latin/Cyprus
- { 299, 66, 240,37204,37280,37356,37405,37455,37455, 76, 76, 49, 50, 23, 23 },// Turkmen/Latin/Turkmenistan
- { 301, 66, 169, 181, 181, 181, 181, 155, 155, 47, 47, 47, 47, 26, 26 },// Tyap/Latin/Nigeria
- { 303, 27, 244,37478,37572,37658,37705,37771,37794, 94, 86, 47, 66, 23, 23 },// Ukrainian/Cyrillic/Ukraine
- { 304, 66, 91,37817,37902,37994,38041, 5002, 5002, 85, 92, 47, 59, 23, 23 },// Upper Sorbian/Latin/Germany
- { 305, 4, 178,38100,38100,38100,38100, 132, 132, 67, 67, 67, 67, 23, 23 },// Urdu/Arabic/Pakistan
- { 305, 4, 110,38100,38100,38100,38100, 132, 132, 67, 67, 67, 67, 23, 23 },// Urdu/Arabic/India
- { 306, 4, 50,38167,38167,38167,38167, 155, 155, 83, 83, 83, 83, 26, 26 },// Uyghur/Arabic/China
- { 307, 66, 251,38250,38324,38398,38445,38492,38492, 74, 74, 47, 47, 23, 23 },// Uzbek/Latin/Uzbekistan
- { 307, 4, 1,28769,28769,38515,38515, 155, 155, 67, 67, 46, 46, 26, 26 },// Uzbek/Arabic/Afghanistan
- { 307, 27, 251,38561,38561, 7231, 7231, 7278, 7278, 70, 70, 47, 47, 23, 23 },// Uzbek/Cyrillic/Uzbekistan
- { 308, 139, 134,38631,38631,38691,38691, 155, 155, 60, 60, 37, 37, 26, 26 },// Vai/Vai/Liberia
- { 308, 66, 134, 181, 181, 181, 181, 155, 155, 47, 47, 47, 47, 26, 26 },// Vai/Latin/Liberia
- { 309, 66, 216, 181, 181, 181, 181, 155, 155, 47, 47, 47, 47, 26, 26 },// Venda/Latin/South Africa
- { 310, 66, 255,38728,38826,38924,38998, 155, 155, 98, 98, 74, 74, 26, 26 },// Vietnamese/Latin/Vietnam
- { 311, 66, 258, 181, 181, 181, 181, 155, 155, 47, 47, 47, 47, 26, 26 },// Volapuk/Latin/World
- { 312, 66, 230,22112,22112,22198,22198, 132, 132, 86, 86, 47, 47, 23, 23 },// Vunjo/Latin/Tanzania
- { 313, 66, 23, 181, 181, 181, 181, 155, 155, 47, 47, 47, 47, 26, 26 },// Walloon/Latin/Belgium
- { 314, 66, 226,39072,39072,39170,39170,39217,39217, 98, 98, 47, 47, 23, 23 },// Walser/Latin/Switzerland
- { 315, 66, 15, 181, 181, 181, 181, 155, 155, 47, 47, 47, 47, 26, 26 },// Warlpiri/Latin/Australia
- { 316, 66, 246,39240,39240,39326,39377,39432,39432, 86, 86, 51, 55, 25, 25 },// Welsh/Latin/United Kingdom
- { 317, 4, 178, 181, 181, 181, 181, 155, 155, 47, 47, 47, 47, 26, 26 },// Western Balochi/Arabic/Pakistan
- { 318, 66, 165,39457,39457,39551,39551, 132, 132, 94, 94, 47, 47, 23, 23 },// Western Frisian/Latin/Netherlands
- { 319, 33, 77, 181, 181, 181, 181, 155, 155, 47, 47, 47, 47, 26, 26 },// Wolaytta/Ethiopic/Ethiopia
- { 320, 66, 206,39598,39598,39681,39681, 155, 155, 83, 83, 46, 46, 26, 26 },// Wolof/Latin/Senegal
- { 321, 66, 216,39727,39727,39817,39817, 155, 155, 90, 90, 47, 47, 26, 26 },// Xhosa/Latin/South Africa
- { 322, 66, 40,39864,39864,40054,40054, 155, 155,190,190, 50, 50, 26, 26 },// Yangben/Latin/Cameroon
- { 323, 47, 258,40104,40104,40195,40104, 155, 155, 91, 91, 57, 91, 26, 26 },// Yiddish/Hebrew/World
- { 324, 66, 169,40252,40324,40444,40483,40537,40537, 72,120, 39, 54, 26, 26 },// Yoruba/Latin/Nigeria
- { 324, 66, 25,40563,40636,40769,40809,40864,40864, 73,133, 40, 55, 26, 26 },// Yoruba/Latin/Benin
- { 325, 66, 170,18848,18848,18935,18935,18980,18980, 87, 87, 45, 45, 23, 23 },// Zarma/Latin/Niger
- { 327, 66, 216,40890,40890,40980,40980, 132,41027, 90, 90, 47, 47, 23, 23 },// Zulu/Latin/South Africa
- { 328, 66, 32,41050,41050,41136,41136,41198,41198, 86, 86, 62, 62, 38, 38 },// Kaingang/Latin/Brazil
- { 329, 66, 32,41236,41236,41336,41336,41371,41371,100,100, 35, 35, 23, 23 },// Nheengatu/Latin/Brazil
- { 329, 66, 54,41236,41236,41336,41336,41371,41371,100,100, 35, 35, 23, 23 },// Nheengatu/Latin/Colombia
- { 329, 66, 254,41236,41236,41336,41336,41371,41371,100,100, 35, 35, 23, 23 },// Nheengatu/Latin/Venezuela
+ { 75, 66, 252, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Vanuatu
+ { 75, 66, 258, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/world
+ { 75, 66, 260, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Zambia
+ { 75, 66, 261, 0, 0,12329,12329, 132, 132, 85, 85, 48, 48, 23, 23 },// English/Latin/Zimbabwe
+ { 75, 115, 246,12427,12427,12582,12582,12653,12653,155,155, 71, 71, 35, 35 },// English/Shavian/United Kingdom
+ { 76, 27, 193,12688,12688,12793,12688, 155, 155,105,105, 47,105, 26, 26 },// Erzya/Cyrillic/Russia
+ { 77, 66, 258,12840,12840,12930,12930, 132, 132, 90, 90, 47, 47, 23, 23 },// Esperanto/Latin/world
+ { 78, 66, 75,12977,12977,13067,13067,13125,13125, 90, 90, 58, 58, 23, 23 },// Estonian/Latin/Estonia
+ { 79, 66, 92,13148,13148,13234,13234,13281,13281, 86, 86, 47, 47, 23, 23 },// Ewe/Latin/Ghana
+ { 79, 66, 233,13148,13148,13234,13234,13281,13281, 86, 86, 47, 47, 23, 23 },// Ewe/Latin/Togo
+ { 80, 66, 40,13304,13304,13444,13444,13493,13493,140,140, 49, 49, 23, 23 },// Ewondo/Latin/Cameroon
+ { 81, 66, 81,13516,13516,13598,13645, 132, 132, 82, 82, 47, 58, 23, 23 },// Faroese/Latin/Faroe Islands
+ { 81, 66, 65,13516,13516,13598,13645, 132, 132, 82, 82, 47, 58, 23, 23 },// Faroese/Latin/Denmark
+ { 83, 66, 185,13703,13703,13790,13790,13837,13790, 87, 87, 47, 47, 37, 47 },// Filipino/Latin/Philippines
+ { 84, 66, 83,13874,13978,14106,14174,14266,14266,104,128, 68, 92, 23, 23 },// Finnish/Latin/Finland
+ { 85, 66, 84,14289,14289,14373,14373, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/France
+ { 85, 66, 4,14289,14289,14373,14373, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Algeria
+ { 85, 66, 23,14289,14289,14373,14373, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Belgium
+ { 85, 66, 25,14289,14289,14373,14373, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Benin
+ { 85, 66, 37,14289,14289,14373,14373, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Burkina Faso
+ { 85, 66, 38,14289,14289,14373,14373, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Burundi
+ { 85, 66, 40,14289,14289,14373,14373, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Cameroon
+ { 85, 66, 41,14289,14289,14435,14435, 132, 132, 84, 84, 63, 63, 23, 23 },// French/Latin/Canada
+ { 85, 66, 46,14289,14289,14373,14373, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Central African Republic
+ { 85, 66, 48,14289,14289,14373,14373, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Chad
+ { 85, 66, 55,14289,14289,14373,14373, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Comoros
+ { 85, 66, 56,14289,14289,14373,14373, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Congo - Brazzaville
+ { 85, 66, 57,14289,14289,14373,14373, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Congo - Kinshasa
+ { 85, 66, 67,14289,14289,14373,14373, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Djibouti
+ { 85, 66, 73,14289,14289,14373,14373, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Equatorial Guinea
+ { 85, 66, 85,14289,14289,14373,14373, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/French Guiana
+ { 85, 66, 86,14289,14289,14373,14373, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/French Polynesia
+ { 85, 66, 88,14289,14289,14373,14373, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Gabon
+ { 85, 66, 97,14289,14289,14373,14373, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Guadeloupe
+ { 85, 66, 102,14289,14289,14373,14373, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Guinea
+ { 85, 66, 104,14289,14289,14373,14373, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Haiti
+ { 85, 66, 118,14289,14289,14373,14373, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Ivory Coast
+ { 85, 66, 138,14289,14289,14373,14373, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Luxembourg
+ { 85, 66, 141,14289,14289,14373,14373, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Madagascar
+ { 85, 66, 145,14289,14289,14373,14373, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Mali
+ { 85, 66, 148,14289,14289,14373,14373, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Martinique
+ { 85, 66, 149,14289,14289,14373,14373, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Mauritania
+ { 85, 66, 150,14289,14289,14373,14373, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Mauritius
+ { 85, 66, 151,14289,14289,14373,14373, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Mayotte
+ { 85, 66, 155,14289,14289,14373,14373, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Monaco
+ { 85, 66, 159,14289,14289,14498,14498, 132, 132, 84, 84, 60, 60, 23, 23 },// French/Latin/Morocco
+ { 85, 66, 166,14289,14289,14373,14373, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/New Caledonia
+ { 85, 66, 170,14289,14289,14373,14373, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Niger
+ { 85, 66, 191,14289,14289,14373,14373, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Reunion
+ { 85, 66, 194,14289,14289,14373,14373, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Rwanda
+ { 85, 66, 195,14289,14289,14373,14373, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Saint Barthelemy
+ { 85, 66, 199,14289,14289,14373,14373, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Saint Martin
+ { 85, 66, 200,14289,14289,14373,14373, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Saint Pierre and Miquelon
+ { 85, 66, 206,14289,14289,14373,14373, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Senegal
+ { 85, 66, 208,14289,14289,14373,14373, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Seychelles
+ { 85, 66, 226,14289,14289,14373,14373, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Switzerland
+ { 85, 66, 227,14289,14289,14373,14373, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Syria
+ { 85, 66, 233,14289,14289,14373,14373, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Togo
+ { 85, 66, 238,14289,14289,14373,14373, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Tunisia
+ { 85, 66, 252,14289,14289,14373,14373, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Vanuatu
+ { 85, 66, 256,14289,14289,14373,14373, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Wallis and Futuna
+ { 86, 66, 117,14558,14558,14634,14634,14681,14681, 76, 76, 47, 47, 23, 23 },// Friulian/Latin/Italy
+ { 87, 66, 206,14704,14704,14780,14780,14827,14827, 76, 76, 47, 47, 23, 23 },// Fulah/Latin/Senegal
+ { 87, 1, 37,14850,14850,14979,14850,15072,15072,129,129, 93,129, 35, 35 },// Fulah/Adlam/Burkina Faso
+ { 87, 1, 40,14850,14850,14979,14850,15072,15072,129,129, 93,129, 35, 35 },// Fulah/Adlam/Cameroon
+ { 87, 1, 89,14850,14850,14979,14850,15072,15072,129,129, 93,129, 35, 35 },// Fulah/Adlam/Gambia
+ { 87, 1, 92,14850,14850,14979,14850,15072,15072,129,129, 93,129, 35, 35 },// Fulah/Adlam/Ghana
+ { 87, 1, 101,14850,14850,14979,14850,15072,15072,129,129, 93,129, 35, 35 },// Fulah/Adlam/Guinea-Bissau
+ { 87, 1, 102,14850,14850,14979,14850,15072,15072,129,129, 93,129, 35, 35 },// Fulah/Adlam/Guinea
+ { 87, 1, 134,14850,14850,14979,14850,15072,15072,129,129, 93,129, 35, 35 },// Fulah/Adlam/Liberia
+ { 87, 1, 149,14850,14850,14979,14850,15072,15072,129,129, 93,129, 35, 35 },// Fulah/Adlam/Mauritania
+ { 87, 1, 169,14850,14850,14979,14850,15072,15072,129,129, 93,129, 35, 35 },// Fulah/Adlam/Nigeria
+ { 87, 1, 170,14850,14850,14979,14850,15072,15072,129,129, 93,129, 35, 35 },// Fulah/Adlam/Niger
+ { 87, 1, 206,14850,14850,14979,14850,15072,15072,129,129, 93,129, 35, 35 },// Fulah/Adlam/Senegal
+ { 87, 1, 209,14850,14850,14979,14850,15072,15072,129,129, 93,129, 35, 35 },// Fulah/Adlam/Sierra Leone
+ { 87, 66, 37,14704,14704,14780,14780,14827,14827, 76, 76, 47, 47, 23, 23 },// Fulah/Latin/Burkina Faso
+ { 87, 66, 40,14704,14704,14780,14780,14827,14827, 76, 76, 47, 47, 23, 23 },// Fulah/Latin/Cameroon
+ { 87, 66, 89,14704,14704,14780,14780,14827,14827, 76, 76, 47, 47, 23, 23 },// Fulah/Latin/Gambia
+ { 87, 66, 92,14704,14704,14780,14780,14827,14827, 76, 76, 47, 47, 23, 23 },// Fulah/Latin/Ghana
+ { 87, 66, 101,14704,14704,14780,14780,14827,14827, 76, 76, 47, 47, 23, 23 },// Fulah/Latin/Guinea-Bissau
+ { 87, 66, 102,14704,14704,14780,14780,14827,14827, 76, 76, 47, 47, 23, 23 },// Fulah/Latin/Guinea
+ { 87, 66, 134,14704,14704,14780,14780,14827,14827, 76, 76, 47, 47, 23, 23 },// Fulah/Latin/Liberia
+ { 87, 66, 149,14704,14704,14780,14780,14827,14827, 76, 76, 47, 47, 23, 23 },// Fulah/Latin/Mauritania
+ { 87, 66, 169,14704,14704,14780,14780,14827,14827, 76, 76, 47, 47, 23, 23 },// Fulah/Latin/Nigeria
+ { 87, 66, 170,14704,14704,14780,14780,14827,14827, 76, 76, 47, 47, 23, 23 },// Fulah/Latin/Niger
+ { 87, 66, 209,14704,14704,14780,14780,14827,14827, 76, 76, 47, 47, 23, 23 },// Fulah/Latin/Sierra Leone
+ { 88, 66, 246,15107,15248,15414,15414,15474,15474,141,166, 60, 60, 23, 23 },// Gaelic/Latin/United Kingdom
+ { 89, 66, 92,15497,15588,15679,15679,15726,15726, 91, 91, 47, 47, 23, 23 },// Ga/Latin/Ghana
+ { 90, 66, 220,15749,15749,15835,15835,15894,15917, 86, 86, 59, 59, 23, 35 },// Galician/Latin/Spain
+ { 91, 66, 243,15952,15952,16048,16048, 132, 132, 96, 96, 47, 47, 23, 23 },// Ganda/Latin/Uganda
+ { 92, 33, 77,16095,16095,16095,16095,16143,16143, 48, 48, 48, 48, 23, 23 },// Geez/Ethiopic/Ethiopia
+ { 92, 33, 74,16095,16095,16095,16095,16143,16143, 48, 48, 48, 48, 23, 23 },// Geez/Ethiopic/Eritrea
+ { 93, 35, 90,16166,16166,16264,16264,16311,16311, 98, 98, 47, 47, 23, 23 },// Georgian/Georgian/Georgia
+ { 94, 66, 91,16334,16334,16416,16463, 132, 132, 82, 82, 47, 59, 23, 23 },// German/Latin/Germany
+ { 94, 66, 16,16522,16522,16604,16651, 132, 132, 82, 82, 47, 58, 23, 23 },// German/Latin/Austria
+ { 94, 66, 23,16334,16334,16416,16463, 132, 132, 82, 82, 47, 59, 23, 23 },// German/Latin/Belgium
+ { 94, 66, 117,16522,16522,16604,16651, 132, 132, 82, 82, 47, 58, 23, 23 },// German/Latin/Italy
+ { 94, 66, 136,16334,16334,16416,16463, 132, 132, 82, 82, 47, 59, 23, 23 },// German/Latin/Liechtenstein
+ { 94, 66, 138,16334,16334,16416,16463, 132, 132, 82, 82, 47, 59, 23, 23 },// German/Latin/Luxembourg
+ { 94, 66, 226,16334,16334,16416,16463, 132, 132, 82, 82, 47, 59, 23, 23 },// German/Latin/Switzerland
+ { 96, 39, 94,16709,16823,16937,16986,17035,17035,114,114, 49, 49, 23, 23 },// Greek/Greek/Greece
+ { 96, 39, 63,16709,16823,16937,16986,17035,17035,114,114, 49, 49, 23, 23 },// Greek/Greek/Cyprus
+ { 97, 66, 183,17058,17058,17058,17058, 155, 155,109,109,109,109, 26, 26 },// Guarani/Latin/Paraguay
+ { 98, 40, 110,17167,17167,17253,17253,17319,17319, 86, 86, 66, 66, 30, 30 },// Gujarati/Gujarati/India
+ { 99, 66, 124,17349,17349,17436,17436,17483,17483, 87, 87, 47, 47, 23, 23 },// Gusii/Latin/Kenya
+ { 101, 66, 169,17506,17506,17590,17590,17637,17637, 84, 84, 47, 47, 23, 23 },// Hausa/Latin/Nigeria
+ { 101, 4, 169,17660,17660,17758,17758, 155, 155, 98, 98, 54, 54, 26, 26 },// Hausa/Arabic/Nigeria
+ { 101, 4, 222,17660,17660,17758,17758, 155, 155, 98, 98, 54, 54, 26, 26 },// Hausa/Arabic/Sudan
+ { 101, 66, 92,17506,17506,17590,17590,17637,17637, 84, 84, 47, 47, 23, 23 },// Hausa/Latin/Ghana
+ { 101, 66, 170,17506,17506,17590,17590,17637,17637, 84, 84, 47, 47, 23, 23 },// Hausa/Latin/Niger
+ { 102, 66, 248,17812,17812,17906,17906, 155, 155, 94, 94, 58, 58, 26, 26 },// Hawaiian/Latin/United States
+ { 103, 47, 116,17964,17964,18035,18035, 155, 155, 71, 71, 57, 57, 26, 26 },// Hebrew/Hebrew/Israel
+ { 105, 29, 110,18092,18092,18164,18164,18222,18222, 72, 72, 58, 58, 29, 29 },// Hindi/Devanagari/India
+ { 105, 66, 110, 0, 0,12329, 85, 132, 132, 85, 85, 48, 47, 23, 23 },// Hindi/Latin/India
+ { 107, 66, 108,18251,18251,18348,18348,18411,18411, 97, 97, 63, 63, 24, 24 },// Hungarian/Latin/Hungary
+ { 108, 66, 109,18435,18435,18516,18516,18574,18574, 81, 81, 58, 58, 23, 23 },// Icelandic/Latin/Iceland
+ { 109, 66, 258, 1348, 1348, 1348, 1348, 155, 155, 47, 47, 47, 47, 26, 26 },// Ido/Latin/world
+ { 110, 66, 169,18597,18597,18683,18683,18730,18730, 86, 86, 47, 47, 23, 23 },// Igbo/Latin/Nigeria
+ { 111, 66, 83,18753,18753,18892,18892,18968,18968,139,139, 76, 76, 24, 24 },// Inari Sami/Latin/Finland
+ { 112, 66, 111,18992,18992,19078,19078, 132, 132, 86, 86, 47, 47, 23, 23 },// Indonesian/Latin/Indonesia
+ { 114, 66, 258,19125,19125,19217,19217, 155, 6342, 92, 92, 47, 47, 26, 23 },// Interlingua/Latin/world
+ { 115, 66, 75,19264,19264,19348,19348, 132, 132, 84, 84, 60, 60, 23, 23 },// Interlingue/Latin/Estonia
+ { 116, 18, 41,19408,19408,19408,19408, 155, 155, 58, 58, 58, 58, 26, 26 },// Inuktitut/Canadian Aboriginal/Canada
+ { 116, 66, 41, 1348, 1348, 1348, 1348, 155, 155, 47, 47, 47, 47, 26, 26 },// Inuktitut/Latin/Canada
+ { 118, 66, 114,19466,19466,19572,19572,19633,19633,106,106, 61, 61, 23, 23 },// Irish/Latin/Ireland
+ { 118, 66, 246,19466,19466,19572,19572,19633,19633,106,106, 61, 61, 23, 23 },// Irish/Latin/United Kingdom
+ { 119, 66, 117,19656,19656,19749,19749,10211,10211, 93, 93, 47, 47, 23, 23 },// Italian/Latin/Italy
+ { 119, 66, 203,19656,19656,19749,19749,10211,10211, 93, 93, 47, 47, 23, 23 },// Italian/Latin/San Marino
+ { 119, 66, 226,19656,19656,19749,19749,10211,10211, 93, 93, 47, 47, 23, 23 },// Italian/Latin/Switzerland
+ { 119, 66, 253,19656,19656,19749,19749,10211,10211, 93, 93, 47, 47, 23, 23 },// Italian/Latin/Vatican City
+ { 120, 53, 120, 6995, 6995, 6995, 6995, 155, 155, 38, 38, 38, 38, 26, 26 },// Japanese/Japanese/Japan
+ { 121, 66, 111,18992,18992,19796,19796, 132, 132, 86, 86, 47, 47, 23, 23 },// Javanese/Latin/Indonesia
+ { 122, 66, 169,19843,19843,20020,20020, 155, 155,177,177, 56, 56, 26, 26 },// Jju/Latin/Nigeria
+ { 123, 66, 206,20076,20076,20157,20157,20192,20192, 81, 81, 35, 35, 23, 23 },// Jola-Fonyi/Latin/Senegal
+ { 124, 66, 43,20215,20215,20299,20299, 132, 132, 84, 84, 47, 47, 23, 23 },// Kabuverdianu/Latin/Cape Verde
+ { 125, 66, 4,20346,20346,20429,20476,20523,20546, 83, 83, 47, 47, 23, 23 },// Kabyle/Latin/Algeria
+ { 126, 66, 40,20569,20569,20569,20569, 155, 155,102,102,102,102, 26, 26 },// Kako/Latin/Cameroon
+ { 127, 66, 95,20671,20769,20879,20879, 132, 132, 98,110, 49, 49, 23, 23 },// Kalaallisut/Latin/Greenland
+ { 128, 66, 124,20928,20928,21048,21048,21096,21096,120,120, 48, 48, 23, 23 },// Kalenjin/Latin/Kenya
+ { 129, 66, 124,21119,21119,21307,21307,21354,21354,188,188, 47, 47, 23, 23 },// Kamba/Latin/Kenya
+ { 130, 56, 110,21377,21377,21463,21525,21597,21597, 86, 86, 62, 72, 30, 30 },// Kannada/Kannada/India
+ { 132, 4, 110,21627,21698,21627,21770,21839,21839, 71, 72, 71, 69, 23, 23 },// Kashmiri/Arabic/India
+ { 132, 29, 110,21862,21936,21862,22006,22079,22079, 74, 70, 74, 73, 24, 24 },// Kashmiri/Devanagari/India
+ { 133, 27, 123,22103,22185,22267,22267,22326,22326, 82, 82, 59, 59, 23, 23 },// Kazakh/Cyrillic/Kazakhstan
+ { 134, 66, 40, 1348, 1348, 1348, 1348, 155, 155, 47, 47, 47, 47, 26, 26 },// Kenyang/Latin/Cameroon
+ { 135, 60, 39,22349,22349,22349,22349,22419,22419, 70, 70, 70, 70, 23, 23 },// Khmer/Khmer/Cambodia
+ { 136, 66, 99, 1348, 1348, 1348, 1348, 155, 155, 47, 47, 47, 47, 26, 26 },// Kiche/Latin/Guatemala
+ { 137, 66, 124,22442,22442,22626,22626,22673,22673,184,184, 47, 47, 23, 23 },// Kikuyu/Latin/Kenya
+ { 138, 66, 194,22696,22696,22795,22795, 155, 155, 99, 99, 59, 59, 26, 26 },// Kinyarwanda/Latin/Rwanda
+ { 141, 29, 110,22854,22854,22939,22854, 155, 155, 85, 85, 58, 85, 26, 26 },// Konkani/Devanagari/India
+ { 142, 63, 218,22997,22997,22997,22997,22997,22997, 38, 38, 38, 38, 38, 38 },// Korean/Korean/South Korea
+ { 142, 63, 50,22997,22997,22997,22997,22997,22997, 38, 38, 38, 38, 38, 38 },// Korean/Korean/China
+ { 142, 63, 174,22997,22997,22997,22997,22997,22997, 38, 38, 38, 38, 38, 38 },// Korean/Korean/North Korea
+ { 144, 66, 145,23035,23035,23122,23122,23167,23167, 87, 87, 45, 45, 23, 23 },// Koyraboro Senni/Latin/Mali
+ { 145, 66, 145,23035,23035,23122,23122,23167,23167, 87, 87, 45, 45, 23, 23 },// Koyra Chiini/Latin/Mali
+ { 146, 66, 134, 1348, 1348, 1348, 1348, 155, 155, 47, 47, 47, 47, 26, 26 },// Kpelle/Latin/Liberia
+ { 146, 66, 102, 1348, 1348, 1348, 1348, 155, 155, 47, 47, 47, 47, 26, 26 },// Kpelle/Latin/Guinea
+ { 148, 66, 239,23190,23190,23271,23271,23318,23318, 81, 81, 47, 47, 23, 23 },// Kurdish/Latin/Turkey
+ { 149, 66, 40,23341,23341,23483,23483, 155, 155,142,142, 50, 50, 26, 26 },// Kwasio/Latin/Cameroon
+ { 150, 27, 128,23533, 8494,23612,23659, 8620, 8620, 79, 79, 47, 58, 23, 23 },// Kyrgyz/Cyrillic/Kyrgyzstan
+ { 151, 66, 248,23717,23717,23717,23717, 155, 155,179,179,179,179, 26, 26 },// Lakota/Latin/United States
+ { 152, 66, 230,23896,23896,24006,24006,24088,24088,110,110, 82, 82, 23, 23 },// Langi/Latin/Tanzania
+ { 153, 65, 129,24111,24111,24185,24185, 155, 155, 74, 74, 60, 60, 26, 26 },// Lao/Lao/Laos
+ { 154, 66, 253,24245,24346,24444,24444, 155, 155,101, 98, 47, 47, 26, 26 },// Latin/Latin/Vatican City
+ { 155, 66, 131,24491,24491,24591,24591, 132, 132,100,100, 64, 64, 23, 23 },// Latvian/Latin/Latvia
+ { 158, 66, 57,24655,24655,24857,24857,24904,24904,202,202, 47, 47, 23, 23 },// Lingala/Latin/Congo - Kinshasa
+ { 158, 66, 7,24655,24655,24857,24857,24904,24904,202,202, 47, 47, 23, 23 },// Lingala/Latin/Angola
+ { 158, 66, 46,24655,24655,24857,24857,24904,24904,202,202, 47, 47, 23, 23 },// Lingala/Latin/Central African Republic
+ { 158, 66, 56,24655,24655,24857,24857,24904,24904,202,202, 47, 47, 23, 23 },// Lingala/Latin/Congo - Brazzaville
+ { 160, 66, 137,24927,25022,25119,25119,25188,25188, 95, 97, 69, 69, 23, 23 },// Lithuanian/Latin/Lithuania
+ { 161, 66, 258, 1348, 1348, 1348, 1348, 155, 155, 47, 47, 47, 47, 26, 26 },// Lojban/Latin/world
+ { 162, 66, 91,25211,25295,25387,25434, 6342, 6342, 84, 92, 47, 59, 23, 23 },// Lower Sorbian/Latin/Germany
+ { 163, 66, 91,25493,25493,25577,25577, 132, 132, 84, 84, 58, 58, 23, 23 },// Low German/Latin/Germany
+ { 163, 66, 165,25493,25493,25577,25577, 132, 132, 84, 84, 58, 58, 23, 23 },// Low German/Latin/Netherlands
+ { 164, 66, 57,25635,25635,25733,25733,25781,25781, 98, 98, 48, 48, 23, 23 },// Luba-Katanga/Latin/Congo - Kinshasa
+ { 165, 66, 225, 1348, 1348, 1348, 1348, 155, 155, 47, 47, 47, 47, 26, 26 },// Lule Sami/Latin/Sweden
+ { 165, 66, 175, 1348, 1348, 1348, 1348, 155, 155, 47, 47, 47, 47, 26, 26 },// Lule Sami/Latin/Norway
+ { 166, 66, 124,25804,25804,25989,25989,26036,26036,185,185, 47, 47, 23, 23 },// Luo/Latin/Kenya
+ { 167, 66, 138,26059,26059,26143,26190, 132, 132, 84, 84, 47, 58, 23, 23 },// Luxembourgish/Latin/Luxembourg
+ { 168, 66, 124, 3283, 3283,26248,26248, 132, 132, 83, 83, 47, 47, 23, 23 },// Luyia/Latin/Kenya
+ { 169, 27, 140,26295,26295,26379,26379, 6494, 6494, 84, 84, 58, 58, 23, 23 },// Macedonian/Cyrillic/Macedonia
+ { 170, 66, 230,26437,26437,26523,26523, 132, 132, 86, 86, 47, 47, 23, 23 },// Machame/Latin/Tanzania
+ { 171, 29, 110,26570,26641,26712,18164,26769,26769, 71, 71, 57, 58, 28, 28 },// Maithili/Devanagari/India
+ { 172, 66, 160,26797,26797,27009,27009,27056,27056,212,212, 47, 47, 23, 23 },// Makhuwa-Meetto/Latin/Mozambique
+ { 173, 66, 230,27079,27079,26523,26523, 132, 132,263,263, 47, 47, 23, 23 },// Makonde/Latin/Tanzania
+ { 174, 66, 141,27342,27342,27433,27433, 132, 132, 91, 91, 47, 47, 23, 23 },// Malagasy/Latin/Madagascar
+ { 175, 74, 110,27480,27480,27567,27567,27628,27628, 87, 87, 61, 61, 31, 31 },// Malayalam/Malayalam/India
+ { 176, 66, 143,27659,27659,27740,27740, 9725, 9725, 81, 81, 47, 47, 23, 23 },// Malay/Latin/Malaysia
+ { 176, 4, 35,27787,27787,27787,27787, 155, 155, 74, 74, 74, 74, 26, 26 },// Malay/Arabic/Brunei
+ { 176, 4, 143,27787,27787,27787,27787, 155, 155, 74, 74, 74, 74, 26, 26 },// Malay/Arabic/Malaysia
+ { 176, 66, 35,27659,27659,27740,27740, 9725, 9725, 81, 81, 47, 47, 23, 23 },// Malay/Latin/Brunei
+ { 176, 66, 111,27659,27659,27740,27740, 9725, 9725, 81, 81, 47, 47, 23, 23 },// Malay/Latin/Indonesia
+ { 176, 66, 210,27659,27659,27740,27740, 9725, 9725, 81, 81, 47, 47, 23, 23 },// Malay/Latin/Singapore
+ { 177, 66, 146,27861,27861,27946,27946,27993,28028, 85, 85, 47, 47, 35, 23 },// Maltese/Latin/Malta
+ { 179, 9, 110,28051,28138,28225,28282,28360,28396, 87, 87, 57, 78, 36, 37 },// Manipuri/Bangla/India
+ { 179, 78, 110, 1348, 1348, 1348, 1348, 155, 155, 47, 47, 47, 47, 26, 26 },// Manipuri/Meitei Mayek/India
+ { 180, 66, 115,28433,28433,28572,28572, 155, 155,139,139,101,101, 26, 26 },// Manx/Latin/Isle of Man
+ { 181, 66, 167,28673,28755,28838,28838,28885,28885, 82, 83, 47, 47, 23, 23 },// Maori/Latin/New Zealand
+ { 182, 66, 49, 1348, 1348, 1348, 1348, 155, 155, 47, 47, 47, 47, 26, 26 },// Mapuche/Latin/Chile
+ { 183, 29, 110,28908,28908,28993,28993,29058,29058, 85, 85, 65, 65, 31, 31 },// Marathi/Devanagari/India
+ { 185, 66, 124,29089,29089,29220,29220, 155, 155,131,131, 50, 50, 26, 26 },// Masai/Latin/Kenya
+ { 185, 66, 230,29089,29089,29220,29220, 155, 155,131,131, 50, 50, 26, 26 },// Masai/Latin/Tanzania
+ { 186, 4, 112,29270,29270,29270,29270, 155, 155, 69, 69, 69, 69, 26, 26 },// Mazanderani/Arabic/Iran
+ { 188, 66, 124,29339,29339,29424,29424,29471,29471, 85, 85, 47, 47, 23, 23 },// Meru/Latin/Kenya
+ { 189, 66, 40,29494,29494,29635,29635,29771,29771,141,141,136,136, 35, 35 },// Meta/Latin/Cameroon
+ { 190, 66, 41, 1348, 1348, 1348, 1348, 155, 155, 47, 47, 47, 47, 26, 26 },// Mohawk/Latin/Canada
+ { 191, 27, 156,29806,29997,30188,30188,30286,30286,191,191, 98, 98, 37, 37 },// Mongolian/Cyrillic/Mongolia
+ { 191, 83, 50, 1348, 1348, 1348, 1348, 155, 155, 47, 47, 47, 47, 26, 26 },// Mongolian/Mongolian/China
+ { 191, 83, 156,30323,30323,30534,30665,30286,30286,211,211,131,132, 37, 37 },// Mongolian/Mongolian/Mongolia
+ { 192, 66, 150,30797,30797,30864,30864,30910,30910, 67, 67, 46, 46, 23, 23 },// Morisyen/Latin/Mauritius
+ { 193, 66, 40,30933,30933,31071,31071,31118,31118,138,138, 47, 47, 23, 23 },// Mundang/Latin/Cameroon
+ { 194, 66, 248,31141,31141,31141,31141, 155, 155,124,124,124,124, 26, 26 },// Muscogee/Latin/United States
+ { 195, 66, 162,31265,31265, 85, 85, 132, 132,135,135, 47, 47, 23, 23 },// Nama/Latin/Namibia
+ { 197, 66, 248, 1348, 1348, 1348, 1348, 155, 155, 47, 47, 47, 47, 26, 26 },// Navajo/Latin/United States
+ { 199, 29, 164,31400,31400,31400,31400,31484,31536, 84, 84, 84, 84, 52, 51 },// Nepali/Devanagari/Nepal
+ { 199, 29, 110,31400,31400,31400,31400,31484,31536, 84, 84, 84, 84, 52, 51 },// Nepali/Devanagari/India
+ { 201, 66, 40,31587,31587,31587,31587, 155, 155,164,164,164,164, 26, 26 },// Ngiemboon/Latin/Cameroon
+ { 202, 66, 40,31751,31751,31751,31751, 155, 155,173,173,173,173, 26, 26 },// Ngomba/Latin/Cameroon
+ { 203, 66, 169,31924,31924,32006,32056, 132, 132, 82, 82, 50, 49, 23, 23 },// Nigerian Pidgin/Latin/Nigeria
+ { 204, 90, 102,32105,32105,32210,32210,32271,32271,105,105, 61, 61, 23, 23 },// Nko/Nko/Guinea
+ { 205, 4, 112,32294,32294,32294,32294, 155, 155, 76, 76, 76, 76, 26, 26 },// Northern Luri/Arabic/Iran
+ { 205, 4, 113,32294,32294,32294,32294, 155, 155, 76, 76, 76, 76, 26, 26 },// Northern Luri/Arabic/Iraq
+ { 206, 66, 175,32370,32370,32514,32514,32572,32572,144,144, 58, 58, 23, 23 },// Northern Sami/Latin/Norway
+ { 206, 66, 83,32370,32370,32595,32595,32572,32572,144,144, 59, 59, 23, 23 },// Northern Sami/Latin/Finland
+ { 206, 66, 225,32370,32370,32514,32514,32572,32572,144,144, 58, 58, 23, 23 },// Northern Sami/Latin/Sweden
+ { 207, 66, 216,32654,32654,32759,32759,32823,32823,105,105, 64, 64, 23, 23 },// Northern Sotho/Latin/South Africa
+ { 208, 66, 261,32846,32846,32957,32957,33008,33008,111,111, 51, 51, 23, 23 },// North Ndebele/Latin/Zimbabwe
+ { 209, 66, 175,33031,33031,13598,33113, 132, 132, 82, 82, 47, 58, 23, 23 },// Norwegian Bokmal/Latin/Norway
+ { 209, 66, 224,33031,33031,13598,33113, 132, 132, 82, 82, 47, 58, 23, 23 },// Norwegian Bokmal/Latin/Svalbard and Jan Mayen
+ { 210, 66, 175,33031,33031,13598,33113, 132, 132, 82, 82, 47, 58, 23, 23 },// Norwegian Nynorsk/Latin/Norway
+ { 211, 66, 219,33171,33171,33266,33266,33319,33319, 95, 95, 53, 53, 23, 23 },// Nuer/Latin/South Sudan
+ { 212, 66, 142,33342,33342,33432,33432, 155, 155, 90, 90, 47, 47, 26, 26 },// Nyanja/Latin/Malawi
+ { 213, 66, 243, 8876, 8876, 9027, 9027, 132, 132,151,151, 47, 47, 23, 23 },// Nyankole/Latin/Uganda
+ { 214, 66, 84,33479,33561,33676,33676,33734,33734, 82,115, 58, 58, 23, 23 },// Occitan/Latin/France
+ { 214, 66, 220,33757,33757,33830,33830,33734,33877, 73, 73, 47, 47, 23, 23 },// Occitan/Latin/Spain
+ { 215, 91, 110,33900,33900,33900,33900,33985,33985, 85, 85, 85, 85, 31, 31 },// Odia/Odia/India
+ { 220, 66, 77,34016,34016,34126,34126, 132, 132,110,110, 47, 47, 23, 23 },// Oromo/Latin/Ethiopia
+ { 220, 66, 124,34016,34016,34126,34126,34173,34173,110,110, 47, 47, 23, 23 },// Oromo/Latin/Kenya
+ { 221, 101, 248,34196,34196,34527,34527, 155, 155,331,331,155,155, 26, 26 },// Osage/Osage/United States
+ { 222, 27, 90,34682,34763,34848,34910, 8620, 8620, 81, 85, 62, 59, 23, 23 },// Ossetic/Cyrillic/Georgia
+ { 222, 27, 193,34682,34763,34848,34910, 8620, 8620, 81, 85, 62, 59, 23, 23 },// Ossetic/Cyrillic/Russia
+ { 226, 66, 62,34969,34969,35055,35102, 155, 155, 86, 86, 47, 47, 26, 26 },// Papiamento/Latin/Curacao
+ { 226, 66, 13,34969,34969,35055,35102, 155, 155, 86, 86, 47, 47, 26, 26 },// Papiamento/Latin/Aruba
+ { 227, 4, 1,35149,35217,35285,35217, 155,35352, 68, 68, 67, 68, 26, 23 },// Pashto/Arabic/Afghanistan
+ { 227, 4, 178,35149,35217,35285,35217, 155,35352, 68, 68, 67, 68, 26, 23 },// Pashto/Arabic/Pakistan
+ { 228, 4, 112,29270,35375,29270,29270,35448,35448, 69, 73, 69, 69, 23, 23 },// Persian/Arabic/Iran
+ { 228, 4, 1,35471,35471,35471,35538,35352,35352, 67, 67, 67, 61, 23, 23 },// Persian/Arabic/Afghanistan
+ { 230, 66, 187,35599,35695,35793,35793,35840,35863, 96, 98, 47, 47, 23, 23 },// Polish/Latin/Poland
+ { 231, 66, 32,35886,35886,35974,35974, 132, 132, 88, 88, 59, 59, 23, 23 },// Portuguese/Latin/Brazil
+ { 231, 66, 7,35886,35886,35974,35974, 132, 132, 88, 88, 59, 59, 23, 23 },// Portuguese/Latin/Angola
+ { 231, 66, 43,35886,35886,35974,35974, 132, 132, 88, 88, 59, 59, 23, 23 },// Portuguese/Latin/Cape Verde
+ { 231, 66, 73,35886,35886,35974,35974, 132, 132, 88, 88, 59, 59, 23, 23 },// Portuguese/Latin/Equatorial Guinea
+ { 231, 66, 101,35886,35886,35974,35974, 132, 132, 88, 88, 59, 59, 23, 23 },// Portuguese/Latin/Guinea-Bissau
+ { 231, 66, 138,35886,35886,35974,35974, 132, 132, 88, 88, 59, 59, 23, 23 },// Portuguese/Latin/Luxembourg
+ { 231, 66, 139,35886,35886,35974,35974, 132, 132, 88, 88, 59, 59, 23, 23 },// Portuguese/Latin/Macao
+ { 231, 66, 160,35886,35886,35974,35974, 132, 132, 88, 88, 59, 59, 23, 23 },// Portuguese/Latin/Mozambique
+ { 231, 66, 188,35886,35886,35974,35974, 132, 132, 88, 88, 59, 59, 23, 23 },// Portuguese/Latin/Portugal
+ { 231, 66, 204,35886,35886,35974,35974, 132, 132, 88, 88, 59, 59, 23, 23 },// Portuguese/Latin/Sao Tome and Principe
+ { 231, 66, 226,35886,35886,35974,35974, 132, 132, 88, 88, 59, 59, 23, 23 },// Portuguese/Latin/Switzerland
+ { 231, 66, 232,35886,35886,35974,35974, 132, 132, 88, 88, 59, 59, 23, 23 },// Portuguese/Latin/Timor-Leste
+ { 232, 66, 187,36033,36033,36123,36123,36170,36170, 90, 90, 47, 47, 23, 23 },// Prussian/Latin/Poland
+ { 233, 41, 110,36193,36193,36260,36260,36309,36309, 67, 67, 49, 49, 27, 27 },// Punjabi/Gurmukhi/India
+ { 233, 4, 178,36336,36336,36336,36336, 155, 155, 66, 66, 66, 66, 26, 26 },// Punjabi/Arabic/Pakistan
+ { 234, 66, 184,36402,36402,36489,36489, 155, 155, 87, 87, 47, 47, 26, 26 },// Quechua/Latin/Peru
+ { 234, 66, 28,36402,36402,36489,36489, 155, 155, 87, 87, 47, 47, 26, 26 },// Quechua/Latin/Bolivia
+ { 234, 66, 70,36402,36402,36489,36489, 155, 155, 87, 87, 47, 47, 26, 26 },// Quechua/Latin/Ecuador
+ { 235, 66, 192,36536,36536,36633,36633,36692,36692, 97, 97, 59, 59, 23, 23 },// Romanian/Latin/Romania
+ { 235, 66, 154,36536,36536,36633,36633,36692,36692, 97, 97, 59, 59, 23, 23 },// Romanian/Latin/Moldova
+ { 236, 66, 226,36715,36806,36930,36930,36996,36996, 91,124, 66, 66, 23, 23 },// Romansh/Latin/Switzerland
+ { 237, 66, 230,37019,37019,37212,37212,37250,37250,193,193, 38, 38, 23, 23 },// Rombo/Latin/Tanzania
+ { 238, 66, 38,37273,37273,37378,37378, 155, 155,105,105, 59, 59, 26, 26 },// Rundi/Latin/Burundi
+ { 239, 27, 193, 8494,37437,37518,37579, 8620, 8620, 79, 81, 61, 61, 23, 23 },// Russian/Cyrillic/Russia
+ { 239, 27, 22, 8494,37437,37518,37579, 8620, 8620, 79, 81, 61, 61, 23, 23 },// Russian/Cyrillic/Belarus
+ { 239, 27, 123, 8494,37437,37518,37579, 8620, 8620, 79, 81, 61, 61, 23, 23 },// Russian/Cyrillic/Kazakhstan
+ { 239, 27, 128, 8494,37437,37518,37579, 8620, 8620, 79, 81, 61, 61, 23, 23 },// Russian/Cyrillic/Kyrgyzstan
+ { 239, 27, 154, 8494,37437,37518,37579, 8620, 8620, 79, 81, 61, 61, 23, 23 },// Russian/Cyrillic/Moldova
+ { 239, 27, 244, 8494,37437,37518,37579, 8620, 8620, 79, 81, 61, 61, 23, 23 },// Russian/Cyrillic/Ukraine
+ { 240, 66, 230,26437,26437,26523,26523, 132, 132, 86, 86, 47, 47, 23, 23 },// Rwa/Latin/Tanzania
+ { 241, 66, 74, 392, 392, 509, 509, 556, 556,117,117, 47, 47, 23, 23 },// Saho/Latin/Eritrea
+ { 242, 27, 193,37640,37755,37875,37875,37924,37924,115,120, 49, 49, 23, 23 },// Sakha/Cyrillic/Russia
+ { 243, 66, 124,37947,37947,38119,38119,38166,38166,172,172, 47, 47, 23, 23 },// Samburu/Latin/Kenya
+ { 245, 66, 46,38189,38189,38279,38279,38326,38326, 90, 90, 47, 47, 23, 23 },// Sango/Latin/Central African Republic
+ { 246, 66, 230,38349,38349,38465,38465, 155, 155,116,116, 47, 47, 26, 26 },// Sangu/Latin/Tanzania
+ { 247, 29, 110,38512,38512,38631,38631, 155,26769,119,119, 82, 82, 26, 28 },// Sanskrit/Devanagari/India
+ { 248, 93, 110,38713,38713,38795,38795,38841,38841, 82, 82, 46, 46, 23, 23 },// Santali/Ol Chiki/India
+ { 248, 29, 110, 1348, 1348, 1348, 1348, 155, 155, 47, 47, 47, 47, 26, 26 },// Santali/Devanagari/India
+ { 249, 66, 117,38864,38864,38964,38964,39011,39011,100,100, 47, 47, 23, 23 },// Sardinian/Latin/Italy
+ { 251, 66, 160,39034,39034,39121,39121, 132, 132, 87, 87, 47, 47, 23, 23 },// Sena/Latin/Mozambique
+ { 252, 27, 207,39168,39168,39248,39248, 6494, 6494, 80, 80, 47, 47, 23, 23 },// Serbian/Cyrillic/Serbia
+ { 252, 27, 29,39168,39168,39248,39248, 6494, 6494, 80, 80, 47, 47, 23, 23 },// Serbian/Cyrillic/Bosnia and Herzegovina
+ { 252, 27, 126,39168,39168,39295,39295, 6494, 6494, 80, 80, 49, 49, 23, 23 },// Serbian/Cyrillic/Kosovo
+ { 252, 27, 157,39168,39168,39295,39295, 6494, 6494, 80, 80, 49, 49, 23, 23 },// Serbian/Cyrillic/Montenegro
+ { 252, 66, 29,39344,39344,39424,39424, 6342, 6342, 80, 80, 47, 47, 23, 23 },// Serbian/Latin/Bosnia and Herzegovina
+ { 252, 66, 126,39344,39344,39471,39471, 6342, 6342, 80, 80, 49, 49, 23, 23 },// Serbian/Latin/Kosovo
+ { 252, 66, 157,39344,39344,39471,39471, 6342, 6342, 80, 80, 49, 49, 23, 23 },// Serbian/Latin/Montenegro
+ { 252, 66, 207,39344,39344,39424,39424, 6342, 6342, 80, 80, 47, 47, 23, 23 },// Serbian/Latin/Serbia
+ { 253, 66, 230,39520,39520,26523,26523, 132, 132, 83, 83, 47, 47, 23, 23 },// Shambala/Latin/Tanzania
+ { 254, 66, 261,39603,39603,39702,39702,39749,39749, 99, 99, 47, 47, 23, 23 },// Shona/Latin/Zimbabwe
+ { 255, 141, 50,39772,39772,39772,39772, 155, 155, 37, 37, 37, 37, 26, 26 },// Sichuan Yi/Yi/China
+ { 256, 66, 117,39809,39809,39906,39906,39953,39953, 97, 97, 47, 47, 23, 23 },// Sicilian/Latin/Italy
+ { 257, 66, 77, 1348, 1348, 1348, 1348, 155, 155, 47, 47, 47, 47, 26, 26 },// Sidamo/Latin/Ethiopia
+ { 258, 66, 187,39976,40072,40170,40170,35840,35840, 96, 98, 47, 47, 23, 23 },// Silesian/Latin/Poland
+ { 259, 4, 178,40217,40217,40217,40217, 132, 132, 71, 71, 71, 71, 23, 23 },// Sindhi/Arabic/Pakistan
+ { 259, 29, 110,40288,40362,40436,40489,40540,40569, 74, 74, 53, 51, 29, 30 },// Sindhi/Devanagari/India
+ { 260, 119, 221,40599,40599,40694,40752,40812,40812, 95, 95, 58, 60, 31, 31 },// Sinhala/Sinhala/Sri Lanka
+ { 261, 66, 83, 1348, 1348, 1348, 1348, 155, 155, 47, 47, 47, 47, 26, 26 },// Skolt Sami/Latin/Finland
+ { 262, 66, 212,40843,40924,41012,41012, 6342, 6342, 81, 88, 47, 47, 23, 23 },// Slovak/Latin/Slovakia
+ { 263, 66, 213,41059,41059,41144,41144, 6342, 6342, 85, 85, 58, 58, 23, 23 },// Slovenian/Latin/Slovenia
+ { 264, 66, 243,15952,15952,16048,16048, 132, 132, 96, 96, 47, 47, 23, 23 },// Soga/Latin/Uganda
+ { 265, 66, 215,41202,41298,41486,41486,41533,41533, 96,188, 47, 47, 23, 23 },// Somali/Latin/Somalia
+ { 265, 66, 67,41202,41298,41486,41486,41533,41533, 96,188, 47, 47, 23, 23 },// Somali/Latin/Djibouti
+ { 265, 66, 77,41202,41298,41486,41486,41533,41533, 96,188, 47, 47, 23, 23 },// Somali/Latin/Ethiopia
+ { 265, 66, 124,41202,41298,41486,41486,41533,41533, 96,188, 47, 47, 23, 23 },// Somali/Latin/Kenya
+ { 266, 4, 112, 1348, 1348, 1348, 1348, 155, 155, 47, 47, 47, 47, 26, 26 },// Southern Kurdish/Arabic/Iran
+ { 266, 4, 113, 1348, 1348, 1348, 1348, 155, 155, 47, 47, 47, 47, 26, 26 },// Southern Kurdish/Arabic/Iraq
+ { 267, 66, 225, 1348, 1348, 1348, 1348, 155, 155, 47, 47, 47, 47, 26, 26 },// Southern Sami/Latin/Sweden
+ { 267, 66, 175, 1348, 1348, 1348, 1348, 155, 155, 47, 47, 47, 47, 26, 26 },// Southern Sami/Latin/Norway
+ { 268, 66, 216,41556,41556,41660,41660, 155, 155,104,104, 47, 47, 26, 26 },// Southern Sotho/Latin/South Africa
+ { 268, 66, 133,41556,41556,41660,41660, 155, 155,104,104, 47, 47, 26, 26 },// Southern Sotho/Latin/Lesotho
+ { 269, 66, 216,41707,41707,41806,41806, 155, 155, 99, 99, 47, 47, 26, 26 },// South Ndebele/Latin/South Africa
+ { 270, 66, 220,41853,41853,41941,41941,41989,41989, 88, 88, 48, 48, 23, 23 },// Spanish/Latin/Spain
+ { 270, 66, 11,41853,41853,41941,41941,41989,41989, 88, 88, 48, 48, 23, 23 },// Spanish/Latin/Argentina
+ { 270, 66, 24,41853,41853,41941,41941,41989,41989, 88, 88, 48, 48, 23, 23 },// Spanish/Latin/Belize
+ { 270, 66, 28,41853,41853,41941,41941,41989,41989, 88, 88, 48, 48, 23, 23 },// Spanish/Latin/Bolivia
+ { 270, 66, 32,41853,41853,41941,41941,41989,41989, 88, 88, 48, 48, 23, 23 },// Spanish/Latin/Brazil
+ { 270, 66, 42,41853,41853,41941,41941,41989,41989, 88, 88, 48, 48, 23, 23 },// Spanish/Latin/Canary Islands
+ { 270, 66, 47,41853,41853,41941,41941,41989,41989, 88, 88, 48, 48, 23, 23 },// Spanish/Latin/Ceuta and Melilla
+ { 270, 66, 49,41853,41853,42012,41941,41989,41989, 88, 88, 60, 48, 23, 23 },// Spanish/Latin/Chile
+ { 270, 66, 54,41853,41853,42012,41941,41989,41989, 88, 88, 60, 48, 23, 23 },// Spanish/Latin/Colombia
+ { 270, 66, 59,41853,41853,41941,41941,41989,41989, 88, 88, 48, 48, 23, 23 },// Spanish/Latin/Costa Rica
+ { 270, 66, 61,41853,41853,41941,41941,41989,41989, 88, 88, 48, 48, 23, 23 },// Spanish/Latin/Cuba
+ { 270, 66, 69,41853,41853,41941,41941,41989,41989, 88, 88, 48, 48, 23, 23 },// Spanish/Latin/Dominican Republic
+ { 270, 66, 70,41853,41853,41941,41941,41989,41989, 88, 88, 48, 48, 23, 23 },// Spanish/Latin/Ecuador
+ { 270, 66, 72,41853,41853,41941,41941,41989,41989, 88, 88, 48, 48, 23, 23 },// Spanish/Latin/El Salvador
+ { 270, 66, 73,41853,41853,41941,41941,41989,41989, 88, 88, 48, 48, 23, 23 },// Spanish/Latin/Equatorial Guinea
+ { 270, 66, 99,41853,41853,41941,41941,41989,41989, 88, 88, 48, 48, 23, 23 },// Spanish/Latin/Guatemala
+ { 270, 66, 106,41853,41853,41941,41941,41989,41989, 88, 88, 48, 48, 23, 23 },// Spanish/Latin/Honduras
+ { 270, 66, 130,41853,41853,41941,41941,41989,41989, 88, 88, 48, 48, 23, 23 },// Spanish/Latin/Latin America
+ { 270, 66, 152,41853,41853,42072,42072,41989,41989, 88, 88, 47, 47, 23, 23 },// Spanish/Latin/Mexico
+ { 270, 66, 168,41853,41853,41941,41941,41989,41989, 88, 88, 48, 48, 23, 23 },// Spanish/Latin/Nicaragua
+ { 270, 66, 181,41853,41853,41941,41941,41989,41989, 88, 88, 48, 48, 23, 23 },// Spanish/Latin/Panama
+ { 270, 66, 183,41853,41853,42012,42012,41989,41989, 88, 88, 60, 60, 23, 23 },// Spanish/Latin/Paraguay
+ { 270, 66, 184,36402,42119,42206,42265,41989,41989, 87, 87, 59, 59, 23, 23 },// Spanish/Latin/Peru
+ { 270, 66, 185,41853,41853,41941,41941,41989,41989, 88, 88, 48, 48, 23, 23 },// Spanish/Latin/Philippines
+ { 270, 66, 189,41853,41853,41941,41941,41989,41989, 88, 88, 48, 48, 23, 23 },// Spanish/Latin/Puerto Rico
+ { 270, 66, 248,41853,41853,41941,41941,41989,41989, 88, 88, 48, 48, 23, 23 },// Spanish/Latin/United States
+ { 270, 66, 250,36402,42119,42206,42265,41989,41989, 87, 87, 59, 59, 23, 23 },// Spanish/Latin/Uruguay
+ { 270, 66, 254,41853,41853,42012,42012,41989,41989, 88, 88, 60, 60, 23, 23 },// Spanish/Latin/Venezuela
+ { 271, 135, 159,42324,42324,42404,42404,42451,42451, 80, 80, 47, 47, 23, 23 },// Standard Moroccan Tamazight/Tifinagh/Morocco
+ { 272, 66, 111,42474,42474,42560,42560,42607,42607, 86, 86, 47, 47, 23, 23 },// Sundanese/Latin/Indonesia
+ { 273, 66, 230, 3283, 3283,26523,26523, 132, 132, 83, 83, 47, 47, 23, 23 },// Swahili/Latin/Tanzania
+ { 273, 66, 57, 3283, 3283,26523,26523, 132, 132, 83, 83, 47, 47, 23, 23 },// Swahili/Latin/Congo - Kinshasa
+ { 273, 66, 124, 3283, 3283,26523,26523, 132, 132, 83, 83, 47, 47, 23, 23 },// Swahili/Latin/Kenya
+ { 273, 66, 243, 3283, 3283,26523,26523, 132, 132, 83, 83, 47, 47, 23, 23 },// Swahili/Latin/Uganda
+ { 274, 66, 216,42630,42630,42743,42743, 155, 155,113,113, 47, 47, 26, 26 },// Swati/Latin/South Africa
+ { 274, 66, 76,42630,42630,42743,42743, 155, 155,113,113, 47, 47, 26, 26 },// Swati/Latin/Eswatini
+ { 275, 66, 225,42790,42790,42875,42875, 132, 132, 85, 85, 58, 58, 23, 23 },// Swedish/Latin/Sweden
+ { 275, 66, 2,42790,42790,42875,42875, 132, 132, 85, 85, 58, 58, 23, 23 },// Swedish/Latin/Aland Islands
+ { 275, 66, 83,42790,42790,42875,42875, 132, 132, 85, 85, 58, 58, 23, 23 },// Swedish/Latin/Finland
+ { 276, 66, 226,42933,42933,16416,16416, 132, 132, 85, 85, 47, 47, 23, 23 },// Swiss German/Latin/Switzerland
+ { 276, 66, 84,42933,42933,16416,16416, 132, 132, 85, 85, 47, 47, 23, 23 },// Swiss German/Latin/France
+ { 276, 66, 136,42933,42933,16416,16416, 132, 132, 85, 85, 47, 47, 23, 23 },// Swiss German/Latin/Liechtenstein
+ { 277, 123, 113,43018,43018,43100,43100,43166,43189, 82, 82, 66, 66, 23, 23 },// Syriac/Syriac/Iraq
+ { 277, 123, 227,43018,43018,43100,43100,43166,43189, 82, 82, 66, 66, 23, 23 },// Syriac/Syriac/Syria
+ { 278, 135, 159,42324,42324,42404,42404,42451,42451, 80, 80, 47, 47, 23, 23 },// Tachelhit/Tifinagh/Morocco
+ { 278, 66, 159,43212,43212,43292,43292,43339,43339, 80, 80, 47, 47, 23, 23 },// Tachelhit/Latin/Morocco
+ { 280, 127, 255, 1348, 1348, 1348, 1348, 155, 155, 47, 47, 47, 47, 26, 26 },// Tai Dam/Tai Viet/Vietnam
+ { 281, 66, 124,43362,43362,43582,43582,43629,43629,220,220, 47, 47, 23, 23 },// Taita/Latin/Kenya
+ { 282, 27, 229,43652,43652,23612,23612, 8620, 8620, 70, 70, 47, 47, 23, 23 },// Tajik/Cyrillic/Tajikistan
+ { 283, 129, 110,43722,43722,43807,43807,43864,43864, 85, 85, 57, 57, 30, 30 },// Tamil/Tamil/India
+ { 283, 129, 143,43722,43722,43807,43807,43864,43864, 85, 85, 57, 57, 30, 30 },// Tamil/Tamil/Malaysia
+ { 283, 129, 210,43722,43722,43807,43807,43864,43864, 85, 85, 57, 57, 30, 30 },// Tamil/Tamil/Singapore
+ { 283, 129, 221,43722,43722,43807,43807,43864,43864, 85, 85, 57, 57, 30, 30 },// Tamil/Tamil/Sri Lanka
+ { 284, 66, 228,43894,43894,44035,44035,44082,44082,141,141, 47, 47, 23, 23 },// Taroko/Latin/Taiwan
+ { 285, 66, 170,23035,23035,23122,23122,23167,23167, 87, 87, 45, 45, 23, 23 },// Tasawaq/Latin/Niger
+ { 286, 27, 193,44105,44105,44185,44185, 155, 155, 80, 80, 61, 61, 26, 26 },// Tatar/Cyrillic/Russia
+ { 287, 131, 110,44246,44246,44331,44331,44392,44392, 85, 85, 61, 61, 30, 30 },// Telugu/Telugu/India
+ { 288, 66, 243,44422,44422,44515,44515,44562,44562, 93, 93, 47, 47, 23, 23 },// Teso/Latin/Uganda
+ { 288, 66, 124,44422,44422,44515,44515,44562,44562, 93, 93, 47, 47, 23, 23 },// Teso/Latin/Kenya
+ { 289, 133, 231,44585,44585,44682,44682,44682,44682, 97, 97, 62, 62, 62, 62 },// Thai/Thai/Thailand
+ { 290, 134, 50,44744,44902,11646,11646, 155, 155,158,146, 62, 62, 26, 26 },// Tibetan/Tibetan/China
+ { 290, 134, 110,44744,44902,11646,11646, 155, 155,158,146, 62, 62, 26, 26 },// Tibetan/Tibetan/India
+ { 291, 33, 74,45048,45048,45109,45109, 1649, 1649, 61, 61, 45, 45, 23, 23 },// Tigre/Ethiopic/Eritrea
+ { 292, 33, 77,45154,45154,45207,45207,45242,45242, 53, 53, 35, 35, 23, 23 },// Tigrinya/Ethiopic/Ethiopia
+ { 292, 33, 74,45154,45154,45207,45207,45242,45242, 53, 53, 35, 35, 23, 23 },// Tigrinya/Ethiopic/Eritrea
+ { 294, 66, 182,45265,45265,45341,45341, 155, 155, 76, 76, 46, 46, 26, 26 },// Tok Pisin/Latin/Papua New Guinea
+ { 295, 66, 235,45387,45473,45559,45559,45609,45609, 86, 86, 50, 50, 26, 26 },// Tongan/Latin/Tonga
+ { 296, 66, 216,45635,45635,45756,45756, 155, 155,121,121, 47, 47, 26, 26 },// Tsonga/Latin/South Africa
+ { 297, 66, 216,45803,45803,45919,45919, 155, 155,116,116, 47, 47, 26, 26 },// Tswana/Latin/South Africa
+ { 297, 66, 30,45803,45803,45919,45919, 155, 155,116,116, 47, 47, 26, 26 },// Tswana/Latin/Botswana
+ { 298, 66, 239,45966,45966,46040,46040,46087,46087, 74, 74, 47, 47, 23, 23 },// Turkish/Latin/Turkey
+ { 298, 66, 63,45966,45966,46040,46040,46087,46087, 74, 74, 47, 47, 23, 23 },// Turkish/Latin/Cyprus
+ { 299, 66, 240,46110,46186,46262,46311,46361,46361, 76, 76, 49, 50, 23, 23 },// Turkmen/Latin/Turkmenistan
+ { 301, 66, 169,46384,46384,46536,46536, 155, 155,152,152, 47, 47, 26, 26 },// Tyap/Latin/Nigeria
+ { 303, 27, 244,46583,46677,46763,46763,46829,46852, 94, 86, 66, 66, 23, 23 },// Ukrainian/Cyrillic/Ukraine
+ { 304, 66, 91,46875,46960,47052,47099, 6342, 6342, 85, 92, 47, 59, 23, 23 },// Upper Sorbian/Latin/Germany
+ { 305, 4, 178,47158,47158,47158,47158, 132, 132, 67, 67, 67, 67, 23, 23 },// Urdu/Arabic/Pakistan
+ { 305, 4, 110,47158,47158,47158,47158, 132, 132, 67, 67, 67, 67, 23, 23 },// Urdu/Arabic/India
+ { 306, 4, 50,47225,47225,47225,47225, 155, 155, 83, 83, 83, 83, 26, 26 },// Uyghur/Arabic/China
+ { 307, 66, 251,47308,47382,47456,47503,47550,47550, 74, 74, 47, 47, 23, 23 },// Uzbek/Latin/Uzbekistan
+ { 307, 4, 1,35471,35471,47573,47573, 155, 155, 67, 67, 46, 46, 26, 26 },// Uzbek/Arabic/Afghanistan
+ { 307, 27, 251,47619,47619, 8573, 8573, 8620, 8620, 70, 70, 47, 47, 23, 23 },// Uzbek/Cyrillic/Uzbekistan
+ { 308, 139, 134,47689,47689,47749,47749, 155, 155, 60, 60, 37, 37, 26, 26 },// Vai/Vai/Liberia
+ { 308, 66, 134, 1348, 1348, 1348, 1348, 155, 155, 47, 47, 47, 47, 26, 26 },// Vai/Latin/Liberia
+ { 309, 66, 216,47786,47786,47896,47896, 155, 155,110,110, 47, 47, 26, 26 },// Venda/Latin/South Africa
+ { 310, 66, 255,47943,48041,47943,48139, 155, 155, 98, 98, 98, 74, 26, 26 },// Vietnamese/Latin/Vietnam
+ { 311, 66, 258,48213,48213,48286,48333,48380,48380, 73, 73, 47, 47, 23, 23 },// Volapuk/Latin/world
+ { 312, 66, 230,26437,26437,26523,26523, 132, 132, 86, 86, 47, 47, 23, 23 },// Vunjo/Latin/Tanzania
+ { 313, 66, 23, 1348, 1348, 1348, 1348, 155, 155, 47, 47, 47, 47, 26, 26 },// Walloon/Latin/Belgium
+ { 314, 66, 226,48403,48403,48501,48501,48548,48548, 98, 98, 47, 47, 23, 23 },// Walser/Latin/Switzerland
+ { 315, 66, 15, 1348, 1348, 1348, 1348, 155, 155, 47, 47, 47, 47, 26, 26 },// Warlpiri/Latin/Australia
+ { 316, 66, 246,48571,48571,48657,48708,48763,48763, 86, 86, 51, 55, 25, 25 },// Welsh/Latin/United Kingdom
+ { 317, 4, 178, 1348, 1348, 1348, 1348, 155, 155, 47, 47, 47, 47, 26, 26 },// Western Balochi/Arabic/Pakistan
+ { 317, 4, 1, 1348, 1348, 1348, 1348, 155, 155, 47, 47, 47, 47, 26, 26 },// Western Balochi/Arabic/Afghanistan
+ { 317, 4, 112, 1348, 1348, 1348, 1348, 155, 155, 47, 47, 47, 47, 26, 26 },// Western Balochi/Arabic/Iran
+ { 317, 4, 176, 1348, 1348, 1348, 1348, 155, 155, 47, 47, 47, 47, 26, 26 },// Western Balochi/Arabic/Oman
+ { 317, 4, 245, 1348, 1348, 1348, 1348, 155, 155, 47, 47, 47, 47, 26, 26 },// Western Balochi/Arabic/United Arab Emirates
+ { 318, 66, 165,48788,48788,48882,48882, 132, 132, 94, 94, 47, 47, 23, 23 },// Western Frisian/Latin/Netherlands
+ { 319, 33, 77,45048,45048,45109,45109, 1649, 1649, 61, 61, 45, 45, 23, 23 },// Wolaytta/Ethiopic/Ethiopia
+ { 320, 66, 206,48929,48929,49012,49012, 155, 155, 83, 83, 46, 46, 26, 26 },// Wolof/Latin/Senegal
+ { 321, 66, 216,49058,49148,49239,49286, 155, 155, 90, 91, 47, 48, 26, 26 },// Xhosa/Latin/South Africa
+ { 322, 66, 40,49334,49334,49524,49524, 155, 155,190,190, 50, 50, 26, 26 },// Yangben/Latin/Cameroon
+ { 323, 47, 244,49574,49574,49665,49574, 155, 155, 91, 91, 57, 91, 26, 26 },// Yiddish/Hebrew/Ukraine
+ { 324, 66, 169,49722,49794,49914,49953,50007,50007, 72,120, 39, 54, 26, 26 },// Yoruba/Latin/Nigeria
+ { 324, 66, 25,50033,50106,50239,50279,50334,50334, 73,133, 40, 55, 26, 26 },// Yoruba/Latin/Benin
+ { 325, 66, 170,23035,23035,23122,23122,23167,23167, 87, 87, 45, 45, 23, 23 },// Zarma/Latin/Niger
+ { 326, 66, 50,50360,50360,50360,50360, 155, 155,121,121,121,121, 26, 26 },// Zhuang/Latin/China
+ { 327, 66, 216,50481,50481,50571,50571, 132,50618, 90, 90, 47, 47, 23, 23 },// Zulu/Latin/South Africa
+ { 328, 66, 32,50641,50641,50727,50727,50789,50789, 86, 86, 62, 62, 38, 38 },// Kaingang/Latin/Brazil
+ { 329, 66, 32,50827,50827,50927,50927,50962,50962,100,100, 35, 35, 23, 23 },// Nheengatu/Latin/Brazil
+ { 329, 66, 54,50827,50827,50927,50927,50962,50962,100,100, 35, 35, 23, 23 },// Nheengatu/Latin/Colombia
+ { 329, 66, 254,50827,50827,50927,50927,50962,50962,100,100, 35, 35, 23, 23 },// Nheengatu/Latin/Venezuela
+ { 330, 29, 110,50985,50985,50985,50985, 155, 155, 73, 73, 73, 73, 26, 26 },// Haryanvi/Devanagari/India
+ { 331, 66, 91,51058,51058,51152,51152, 132, 132, 94, 94, 47, 47, 23, 23 },// Northern Frisian/Latin/Germany
+ { 332, 29, 110, 5834, 5834, 5834, 5834, 155, 155, 72, 72, 72, 72, 26, 26 },// Rajasthani/Devanagari/India
+ { 333, 27, 193, 1348, 1348, 1348, 1348, 155, 155, 47, 47, 47, 47, 26, 26 },// Moksha/Cyrillic/Russia
+ { 334, 66, 258,51199,51199,51199,51199, 155, 155, 86, 86, 86, 86, 26, 26 },// Toki Pona/Latin/world
+ { 335, 66, 214,51285,51285,51285,51285, 155, 155, 76, 76, 76, 76, 26, 26 },// Pijin/Latin/Solomon Islands
+ { 336, 66, 169, 1348, 1348, 1348, 1348, 155, 155, 47, 47, 47, 47, 26, 26 },// Obolo/Latin/Nigeria
+ { 337, 4, 178,51361,51361,51430,51430, 155, 155, 69, 69, 48, 48, 26, 26 },// Baluchi/Arabic/Pakistan
+ { 337, 66, 178,51478,51478,51560,51560, 155, 155, 82, 82, 47, 47, 26, 26 },// Baluchi/Latin/Pakistan
+ { 338, 66, 117,51607,51690,51806,51865,51957,51957, 83,116, 59, 92, 35, 35 },// Ligurian/Latin/Italy
+ { 339, 142, 161, 1348, 1348, 1348, 1348, 155, 155, 47, 47, 47, 47, 26, 26 },// Rohingya/Hanifi/Myanmar
+ { 339, 142, 20, 1348, 1348, 1348, 1348, 155, 155, 47, 47, 47, 47, 26, 26 },// Rohingya/Hanifi/Bangladesh
+ { 340, 4, 178,36336,36336,36336,36336,35352,35352, 66, 66, 66, 66, 23, 23 },// Torwali/Arabic/Pakistan
+ { 341, 66, 25,51992,51992,52190,52190, 155, 155,198,198, 44, 44, 26, 26 },// Anii/Latin/Benin
+ { 342, 29, 110,18092,18092,18164,18164,18222,18222, 72, 72, 58, 58, 29, 29 },// Kangri/Devanagari/India
+ { 343, 66, 117,52234,52234,52318,52318,52365,52365, 84, 84, 47, 47, 23, 23 },// Venetian/Latin/Italy
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },// trailing zeros
};
-static const char16_t months_data[] = {
-0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x79, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x79, 0x3b, 0x4d, 0x61, 0x72,
-0x63, 0x68, 0x3b, 0x41, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x61, 0x79, 0x3b, 0x4a, 0x75, 0x6e, 0x65, 0x3b, 0x4a, 0x75,
-0x6c, 0x79, 0x3b, 0x41, 0x75, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b,
-0x4f, 0x63, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x44, 0x65, 0x63,
-0x65, 0x6d, 0x62, 0x65, 0x72, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x70, 0x72,
-0x3b, 0x4d, 0x61, 0x79, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x75, 0x67, 0x3b, 0x53, 0x65, 0x70,
-0x3b, 0x4f, 0x63, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x63, 0x4a, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b,
-0x4d, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x31, 0x3b, 0x32, 0x3b, 0x33,
-0x3b, 0x34, 0x3b, 0x35, 0x3b, 0x36, 0x3b, 0x37, 0x3b, 0x38, 0x3b, 0x39, 0x3b, 0x31, 0x30, 0x3b, 0x31, 0x31, 0x3b, 0x31,
-0x32, 0x4d, 0x30, 0x31, 0x3b, 0x4d, 0x30, 0x32, 0x3b, 0x4d, 0x30, 0x33, 0x3b, 0x4d, 0x30, 0x34, 0x3b, 0x4d, 0x30, 0x35,
-0x3b, 0x4d, 0x30, 0x36, 0x3b, 0x4d, 0x30, 0x37, 0x3b, 0x4d, 0x30, 0x38, 0x3b, 0x4d, 0x30, 0x39, 0x3b, 0x4d, 0x31, 0x30,
-0x3b, 0x4d, 0x31, 0x31, 0x3b, 0x4d, 0x31, 0x32, 0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x69, 0x65, 0x3b, 0x46, 0x65, 0x62,
-0x72, 0x75, 0x61, 0x72, 0x69, 0x65, 0x3b, 0x4d, 0x61, 0x61, 0x72, 0x74, 0x3b, 0x41, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x4d,
-0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x65, 0x3b, 0x4a, 0x75, 0x6c, 0x69, 0x65, 0x3b, 0x41, 0x75, 0x67, 0x75, 0x73,
-0x74, 0x75, 0x73, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x65,
-0x72, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x44, 0x65, 0x73, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x4a,
-0x61, 0x6e, 0x2e, 0x3b, 0x46, 0x65, 0x62, 0x2e, 0x3b, 0x4d, 0x72, 0x74, 0x2e, 0x3b, 0x41, 0x70, 0x72, 0x2e, 0x3b, 0x4d,
-0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x2e, 0x3b, 0x4a, 0x75, 0x6c, 0x2e, 0x3b, 0x41, 0x75, 0x67, 0x2e, 0x3b, 0x53, 0x65,
-0x70, 0x2e, 0x3b, 0x4f, 0x6b, 0x74, 0x2e, 0x3b, 0x4e, 0x6f, 0x76, 0x2e, 0x3b, 0x44, 0x65, 0x73, 0x2e, 0x6e, 0x64, 0x7a,
-0x254, 0x300, 0x14b, 0x254, 0x300, 0x6e, 0xf9, 0x6d, 0x3b, 0x6e, 0x64, 0x7a, 0x254, 0x300, 0x14b, 0x254, 0x300, 0x6b, 0x197, 0x300,
-0x7a, 0xf9, 0x294, 0x3b, 0x6e, 0x64, 0x7a, 0x254, 0x300, 0x14b, 0x254, 0x300, 0x74, 0x197, 0x300, 0x64, 0x289, 0x300, 0x67, 0x68,
-0xe0, 0x3b, 0x6e, 0x64, 0x7a, 0x254, 0x300, 0x14b, 0x254, 0x300, 0x74, 0x1ce, 0x61, 0x66, 0x289, 0x304, 0x67, 0x68, 0x101, 0x3b,
-0x6e, 0x64, 0x7a, 0x254, 0x300, 0x14b, 0xe8, 0x73, 0xe8, 0x65, 0x3b, 0x6e, 0x64, 0x7a, 0x254, 0x300, 0x14b, 0x254, 0x300, 0x6e,
-0x7a, 0xf9, 0x67, 0x68, 0xf2, 0x3b, 0x6e, 0x64, 0x7a, 0x254, 0x300, 0x14b, 0x254, 0x300, 0x64, 0xf9, 0x6d, 0x6c, 0x6f, 0x3b,
-0x6e, 0x64, 0x7a, 0x254, 0x300, 0x14b, 0x254, 0x300, 0x6b, 0x77, 0xee, 0x66, 0x254, 0x300, 0x65, 0x3b, 0x6e, 0x64, 0x7a, 0x254,
-0x300, 0x14b, 0x254, 0x300, 0x74, 0x197, 0x300, 0x66, 0x289, 0x300, 0x67, 0x68, 0xe0, 0x64, 0x7a, 0x75, 0x67, 0x68, 0xf9, 0x3b,
-0x6e, 0x64, 0x7a, 0x254, 0x300, 0x14b, 0x254, 0x300, 0x67, 0x68, 0x1d4, 0x75, 0x77, 0x65, 0x6c, 0x254, 0x300, 0x6d, 0x3b, 0x6e,
-0x64, 0x7a, 0x254, 0x300, 0x14b, 0x254, 0x300, 0x63, 0x68, 0x77, 0x61, 0x294, 0xe0, 0x6b, 0x61, 0x61, 0x20, 0x77, 0x6f, 0x3b,
-0x6e, 0x64, 0x7a, 0x254, 0x300, 0x14b, 0xe8, 0x66, 0x77, 0xf2, 0x6f, 0x6e, 0xf9, 0x6d, 0x3b, 0x6b, 0x268, 0x7a, 0x3b, 0x74,
-0x268, 0x64, 0x3b, 0x74, 0x61, 0x61, 0x3b, 0x73, 0x65, 0x65, 0x3b, 0x6e, 0x7a, 0x75, 0x3b, 0x64, 0x75, 0x6d, 0x3b, 0x66,
-0x254, 0x65, 0x3b, 0x64, 0x7a, 0x75, 0x3b, 0x6c, 0x254, 0x6d, 0x3b, 0x6b, 0x61, 0x61, 0x3b, 0x66, 0x77, 0x6f, 0x6e, 0x3b,
-0x6b, 0x3b, 0x74, 0x3b, 0x74, 0x3b, 0x73, 0x3b, 0x7a, 0x3b, 0x6b, 0x3b, 0x66, 0x3b, 0x64, 0x3b, 0x6c, 0x3b, 0x63, 0x3b,
-0x66, 0x53, 0x61, 0x6e, 0x64, 0x61, 0x2d, 0x186, 0x70, 0x25b, 0x70, 0x254, 0x6e, 0x3b, 0x4b, 0x77, 0x61, 0x6b, 0x77, 0x61,
-0x72, 0x2d, 0x186, 0x67, 0x79, 0x65, 0x66, 0x75, 0x6f, 0x3b, 0x45, 0x62, 0x254, 0x77, 0x2d, 0x186, 0x62, 0x65, 0x6e, 0x65,
-0x6d, 0x3b, 0x45, 0x62, 0x254, 0x62, 0x69, 0x72, 0x61, 0x2d, 0x4f, 0x66, 0x6f, 0x72, 0x69, 0x73, 0x75, 0x6f, 0x3b, 0x45,
-0x73, 0x75, 0x73, 0x6f, 0x77, 0x20, 0x41, 0x6b, 0x65, 0x74, 0x73, 0x65, 0x61, 0x62, 0x61, 0x2d, 0x4b, 0x254, 0x74, 0x254,
-0x6e, 0x69, 0x6d, 0x62, 0x61, 0x3b, 0x4f, 0x62, 0x69, 0x72, 0x61, 0x64, 0x65, 0x2d, 0x41, 0x79, 0x25b, 0x77, 0x6f, 0x68,
-0x6f, 0x6d, 0x75, 0x6d, 0x75, 0x3b, 0x41, 0x79, 0x25b, 0x77, 0x6f, 0x68, 0x6f, 0x2d, 0x4b, 0x69, 0x74, 0x61, 0x77, 0x6f,
-0x6e, 0x73, 0x61, 0x3b, 0x44, 0x69, 0x66, 0x75, 0x75, 0x2d, 0x186, 0x73, 0x61, 0x6e, 0x64, 0x61, 0x61, 0x3b, 0x46, 0x61,
-0x6e, 0x6b, 0x77, 0x61, 0x2d, 0x190, 0x62, 0x254, 0x3b, 0x186, 0x62, 0x25b, 0x73, 0x25b, 0x2d, 0x41, 0x68, 0x69, 0x6e, 0x69,
-0x6d, 0x65, 0x3b, 0x186, 0x62, 0x65, 0x72, 0x25b, 0x66, 0x25b, 0x77, 0x2d, 0x4f, 0x62, 0x75, 0x62, 0x75, 0x6f, 0x3b, 0x4d,
-0x75, 0x6d, 0x75, 0x2d, 0x186, 0x70, 0x25b, 0x6e, 0x69, 0x6d, 0x62, 0x61, 0x53, 0x2d, 0x186, 0x3b, 0x4b, 0x2d, 0x186, 0x3b,
-0x45, 0x2d, 0x186, 0x3b, 0x45, 0x2d, 0x4f, 0x3b, 0x45, 0x2d, 0x4b, 0x3b, 0x4f, 0x2d, 0x41, 0x3b, 0x41, 0x2d, 0x4b, 0x3b,
-0x44, 0x2d, 0x186, 0x3b, 0x46, 0x2d, 0x190, 0x3b, 0x186, 0x2d, 0x41, 0x3b, 0x186, 0x2d, 0x4f, 0x3b, 0x4d, 0x2d, 0x186, 0x6a,
-0x61, 0x6e, 0x61, 0x72, 0x3b, 0x73, 0x68, 0x6b, 0x75, 0x72, 0x74, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x3b, 0x70, 0x72, 0x69,
-0x6c, 0x6c, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x71, 0x65, 0x72, 0x73, 0x68, 0x6f, 0x72, 0x3b, 0x6b, 0x6f, 0x72, 0x72, 0x69,
-0x6b, 0x3b, 0x67, 0x75, 0x73, 0x68, 0x74, 0x3b, 0x73, 0x68, 0x74, 0x61, 0x74, 0x6f, 0x72, 0x3b, 0x74, 0x65, 0x74, 0x6f,
-0x72, 0x3b, 0x6e, 0xeb, 0x6e, 0x74, 0x6f, 0x72, 0x3b, 0x64, 0x68, 0x6a, 0x65, 0x74, 0x6f, 0x72, 0x6a, 0x61, 0x6e, 0x3b,
-0x73, 0x68, 0x6b, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x70, 0x72, 0x69, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x71, 0x65, 0x72, 0x3b,
-0x6b, 0x6f, 0x72, 0x72, 0x3b, 0x67, 0x75, 0x73, 0x68, 0x3b, 0x73, 0x68, 0x74, 0x3b, 0x74, 0x65, 0x74, 0x3b, 0x6e, 0xeb,
-0x6e, 0x3b, 0x64, 0x68, 0x6a, 0x6a, 0x3b, 0x73, 0x68, 0x3b, 0x6d, 0x3b, 0x70, 0x3b, 0x6d, 0x3b, 0x71, 0x3b, 0x6b, 0x3b,
-0x67, 0x3b, 0x73, 0x68, 0x3b, 0x74, 0x3b, 0x6e, 0x3b, 0x64, 0x68, 0x1303, 0x1295, 0x12e9, 0x12c8, 0x122a, 0x3b, 0x134c, 0x1265, 0x1229,
-0x12c8, 0x122a, 0x3b, 0x121b, 0x122d, 0x127d, 0x3b, 0x12a4, 0x1355, 0x122a, 0x120d, 0x3b, 0x121c, 0x12ed, 0x3b, 0x1301, 0x1295, 0x3b, 0x1301, 0x120b,
-0x12ed, 0x3b, 0x12a6, 0x1308, 0x1235, 0x1275, 0x3b, 0x1234, 0x1355, 0x1274, 0x121d, 0x1260, 0x122d, 0x3b, 0x12a6, 0x12ad, 0x1276, 0x1260, 0x122d, 0x3b,
-0x1296, 0x126c, 0x121d, 0x1260, 0x122d, 0x3b, 0x12f2, 0x1234, 0x121d, 0x1260, 0x122d, 0x1303, 0x1295, 0x12e9, 0x3b, 0x134c, 0x1265, 0x1229, 0x3b, 0x121b,
-0x122d, 0x127d, 0x3b, 0x12a4, 0x1355, 0x122a, 0x3b, 0x121c, 0x12ed, 0x3b, 0x1301, 0x1295, 0x3b, 0x1301, 0x120b, 0x12ed, 0x3b, 0x12a6, 0x1308, 0x1235,
-0x3b, 0x1234, 0x1355, 0x1274, 0x3b, 0x12a6, 0x12ad, 0x1276, 0x3b, 0x1296, 0x126c, 0x121d, 0x3b, 0x12f2, 0x1234, 0x121d, 0x1303, 0x3b, 0x134c, 0x3b,
-0x121b, 0x3b, 0x12a4, 0x3b, 0x121c, 0x3b, 0x1301, 0x3b, 0x1301, 0x3b, 0x12a6, 0x3b, 0x1234, 0x3b, 0x12a6, 0x3b, 0x1296, 0x3b, 0x12f2, 0x64a,
-0x646, 0x627, 0x64a, 0x631, 0x3b, 0x641, 0x628, 0x631, 0x627, 0x64a, 0x631, 0x3b, 0x645, 0x627, 0x631, 0x633, 0x3b, 0x623, 0x628, 0x631,
-0x64a, 0x644, 0x3b, 0x645, 0x627, 0x64a, 0x648, 0x3b, 0x64a, 0x648, 0x646, 0x64a, 0x648, 0x3b, 0x64a, 0x648, 0x644, 0x64a, 0x648, 0x3b,
-0x623, 0x63a, 0x633, 0x637, 0x633, 0x3b, 0x633, 0x628, 0x62a, 0x645, 0x628, 0x631, 0x3b, 0x623, 0x643, 0x62a, 0x648, 0x628, 0x631, 0x3b,
-0x646, 0x648, 0x641, 0x645, 0x628, 0x631, 0x3b, 0x62f, 0x64a, 0x633, 0x645, 0x628, 0x631, 0x64a, 0x3b, 0x641, 0x3b, 0x645, 0x3b, 0x623,
-0x3b, 0x648, 0x3b, 0x646, 0x3b, 0x644, 0x3b, 0x63a, 0x3b, 0x633, 0x3b, 0x643, 0x3b, 0x628, 0x3b, 0x62f, 0x62c, 0x627, 0x646, 0x641,
-0x64a, 0x3b, 0x641, 0x64a, 0x641, 0x631, 0x64a, 0x3b, 0x645, 0x627, 0x631, 0x633, 0x3b, 0x623, 0x641, 0x631, 0x64a, 0x644, 0x3b, 0x645,
-0x627, 0x64a, 0x3b, 0x62c, 0x648, 0x627, 0x646, 0x3b, 0x62c, 0x648, 0x64a, 0x644, 0x64a, 0x629, 0x3b, 0x623, 0x648, 0x62a, 0x3b, 0x633,
-0x628, 0x62a, 0x645, 0x628, 0x631, 0x3b, 0x623, 0x643, 0x62a, 0x648, 0x628, 0x631, 0x3b, 0x646, 0x648, 0x641, 0x645, 0x628, 0x631, 0x3b,
-0x62f, 0x64a, 0x633, 0x645, 0x628, 0x631, 0x62c, 0x3b, 0x641, 0x3b, 0x645, 0x3b, 0x623, 0x3b, 0x645, 0x3b, 0x62c, 0x3b, 0x62c, 0x3b,
-0x623, 0x3b, 0x633, 0x3b, 0x623, 0x3b, 0x646, 0x3b, 0x62f, 0x643, 0x627, 0x646, 0x648, 0x646, 0x20, 0x627, 0x644, 0x62b, 0x627, 0x646,
-0x64a, 0x3b, 0x634, 0x628, 0x627, 0x637, 0x3b, 0x622, 0x630, 0x627, 0x631, 0x3b, 0x646, 0x64a, 0x633, 0x627, 0x646, 0x3b, 0x623, 0x64a,
-0x627, 0x631, 0x3b, 0x62d, 0x632, 0x64a, 0x631, 0x627, 0x646, 0x3b, 0x62a, 0x645, 0x648, 0x632, 0x3b, 0x622, 0x628, 0x3b, 0x623, 0x64a,
-0x644, 0x648, 0x644, 0x3b, 0x62a, 0x634, 0x631, 0x64a, 0x646, 0x20, 0x627, 0x644, 0x623, 0x648, 0x644, 0x3b, 0x62a, 0x634, 0x631, 0x64a,
-0x646, 0x20, 0x627, 0x644, 0x62b, 0x627, 0x646, 0x64a, 0x3b, 0x643, 0x627, 0x646, 0x648, 0x646, 0x20, 0x627, 0x644, 0x623, 0x648, 0x644,
-0x643, 0x627, 0x646, 0x648, 0x646, 0x20, 0x627, 0x644, 0x62b, 0x627, 0x646, 0x64a, 0x3b, 0x634, 0x628, 0x627, 0x637, 0x3b, 0x622, 0x630,
-0x627, 0x631, 0x3b, 0x646, 0x64a, 0x633, 0x627, 0x646, 0x3b, 0x623, 0x64a, 0x627, 0x631, 0x3b, 0x62d, 0x632, 0x64a, 0x631, 0x627, 0x646,
-0x3b, 0x62a, 0x645, 0x648, 0x632, 0x3b, 0x622, 0x628, 0x3b, 0x623, 0x64a, 0x644, 0x648, 0x644, 0x3b, 0x62a, 0x634, 0x631, 0x64a, 0x646,
-0xa0, 0x627, 0x644, 0x623, 0x648, 0x644, 0x3b, 0x62a, 0x634, 0x631, 0x64a, 0x646, 0x20, 0x627, 0x644, 0x62b, 0x627, 0x646, 0x64a, 0x3b,
-0x643, 0x627, 0x646, 0x648, 0x646, 0x20, 0x627, 0x644, 0x623, 0x648, 0x644, 0x643, 0x3b, 0x634, 0x3b, 0x622, 0x3b, 0x646, 0x3b, 0x623,
-0x3b, 0x62d, 0x3b, 0x62a, 0x3b, 0x622, 0x3b, 0x623, 0x3b, 0x62a, 0x3b, 0x62a, 0x3b, 0x643, 0x64a, 0x646, 0x627, 0x64a, 0x631, 0x3b,
-0x641, 0x628, 0x631, 0x627, 0x64a, 0x631, 0x3b, 0x645, 0x627, 0x631, 0x633, 0x3b, 0x625, 0x628, 0x631, 0x64a, 0x644, 0x3b, 0x645, 0x627,
-0x64a, 0x648, 0x3b, 0x64a, 0x648, 0x646, 0x64a, 0x648, 0x3b, 0x64a, 0x648, 0x644, 0x64a, 0x648, 0x3b, 0x623, 0x63a, 0x634, 0x62a, 0x3b,
-0x634, 0x62a, 0x645, 0x628, 0x631, 0x3b, 0x623, 0x643, 0x62a, 0x648, 0x628, 0x631, 0x3b, 0x646, 0x648, 0x641, 0x645, 0x628, 0x631, 0x3b,
-0x62f, 0x62c, 0x645, 0x628, 0x631, 0x64a, 0x3b, 0x641, 0x3b, 0x645, 0x3b, 0x625, 0x3b, 0x648, 0x3b, 0x646, 0x3b, 0x644, 0x3b, 0x63a,
-0x3b, 0x634, 0x3b, 0x643, 0x3b, 0x628, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x64a, 0x631, 0x3b, 0x641, 0x628, 0x631, 0x627, 0x64a, 0x631,
-0x3b, 0x645, 0x627, 0x631, 0x633, 0x3b, 0x623, 0x628, 0x631, 0x64a, 0x644, 0x3b, 0x645, 0x627, 0x64a, 0x3b, 0x64a, 0x648, 0x646, 0x64a,
-0x648, 0x3b, 0x64a, 0x648, 0x644, 0x64a, 0x648, 0x632, 0x3b, 0x63a, 0x634, 0x62a, 0x3b, 0x634, 0x62a, 0x646, 0x628, 0x631, 0x3b, 0x623,
-0x643, 0x62a, 0x648, 0x628, 0x631, 0x3b, 0x646, 0x648, 0x646, 0x628, 0x631, 0x3b, 0x62f, 0x62c, 0x646, 0x628, 0x631, 0x64a, 0x3b, 0x641,
-0x3b, 0x645, 0x3b, 0x623, 0x3b, 0x645, 0x3b, 0x646, 0x3b, 0x644, 0x3b, 0x63a, 0x3b, 0x634, 0x3b, 0x643, 0x3b, 0x628, 0x3b, 0x62f,
-0x570, 0x578, 0x582, 0x576, 0x57e, 0x561, 0x580, 0x3b, 0x583, 0x565, 0x57f, 0x580, 0x57e, 0x561, 0x580, 0x3b, 0x574, 0x561, 0x580, 0x57f,
-0x3b, 0x561, 0x57a, 0x580, 0x56b, 0x56c, 0x3b, 0x574, 0x561, 0x575, 0x56b, 0x57d, 0x3b, 0x570, 0x578, 0x582, 0x576, 0x56b, 0x57d, 0x3b,
-0x570, 0x578, 0x582, 0x56c, 0x56b, 0x57d, 0x3b, 0x585, 0x563, 0x578, 0x57d, 0x57f, 0x578, 0x57d, 0x3b, 0x57d, 0x565, 0x57a, 0x57f, 0x565,
-0x574, 0x562, 0x565, 0x580, 0x3b, 0x570, 0x578, 0x56f, 0x57f, 0x565, 0x574, 0x562, 0x565, 0x580, 0x3b, 0x576, 0x578, 0x575, 0x565, 0x574,
-0x562, 0x565, 0x580, 0x3b, 0x564, 0x565, 0x56f, 0x57f, 0x565, 0x574, 0x562, 0x565, 0x580, 0x570, 0x578, 0x582, 0x576, 0x57e, 0x561, 0x580,
-0x56b, 0x3b, 0x583, 0x565, 0x57f, 0x580, 0x57e, 0x561, 0x580, 0x56b, 0x3b, 0x574, 0x561, 0x580, 0x57f, 0x56b, 0x3b, 0x561, 0x57a, 0x580,
-0x56b, 0x56c, 0x56b, 0x3b, 0x574, 0x561, 0x575, 0x56b, 0x57d, 0x56b, 0x3b, 0x570, 0x578, 0x582, 0x576, 0x56b, 0x57d, 0x56b, 0x3b, 0x570,
-0x578, 0x582, 0x56c, 0x56b, 0x57d, 0x56b, 0x3b, 0x585, 0x563, 0x578, 0x57d, 0x57f, 0x578, 0x57d, 0x56b, 0x3b, 0x57d, 0x565, 0x57a, 0x57f,
-0x565, 0x574, 0x562, 0x565, 0x580, 0x56b, 0x3b, 0x570, 0x578, 0x56f, 0x57f, 0x565, 0x574, 0x562, 0x565, 0x580, 0x56b, 0x3b, 0x576, 0x578,
-0x575, 0x565, 0x574, 0x562, 0x565, 0x580, 0x56b, 0x3b, 0x564, 0x565, 0x56f, 0x57f, 0x565, 0x574, 0x562, 0x565, 0x580, 0x56b, 0x570, 0x576,
-0x57e, 0x3b, 0x583, 0x57f, 0x57e, 0x3b, 0x574, 0x580, 0x57f, 0x3b, 0x561, 0x57a, 0x580, 0x3b, 0x574, 0x575, 0x57d, 0x3b, 0x570, 0x576,
-0x57d, 0x3b, 0x570, 0x56c, 0x57d, 0x3b, 0x585, 0x563, 0x57d, 0x3b, 0x57d, 0x565, 0x57a, 0x3b, 0x570, 0x578, 0x56f, 0x3b, 0x576, 0x578,
-0x575, 0x3b, 0x564, 0x565, 0x56f, 0x540, 0x3b, 0x553, 0x3b, 0x544, 0x3b, 0x531, 0x3b, 0x544, 0x3b, 0x540, 0x3b, 0x540, 0x3b, 0x555,
-0x3b, 0x54d, 0x3b, 0x540, 0x3b, 0x546, 0x3b, 0x534, 0x99c, 0x9be, 0x9a8, 0x9c1, 0x9f1, 0x9be, 0x9f0, 0x9c0, 0x3b, 0x9ab, 0x9c7, 0x9ac,
-0x9cd, 0x9f0, 0x9c1, 0x9f1, 0x9be, 0x9f0, 0x9c0, 0x3b, 0x9ae, 0x9be, 0x9f0, 0x9cd, 0x99a, 0x3b, 0x98f, 0x9aa, 0x9cd, 0x9f0, 0x9bf, 0x9b2,
-0x3b, 0x9ae, 0x9c7, 0x2019, 0x3b, 0x99c, 0x9c1, 0x9a8, 0x3b, 0x99c, 0x9c1, 0x9b2, 0x9be, 0x987, 0x3b, 0x986, 0x997, 0x9b7, 0x9cd, 0x99f,
-0x3b, 0x99b, 0x9c7, 0x9aa, 0x9cd, 0x9a4, 0x9c7, 0x9ae, 0x9cd, 0x9ac, 0x9f0, 0x3b, 0x985, 0x995, 0x9cd, 0x99f, 0x9cb, 0x9ac, 0x9f0, 0x3b,
-0x9a8, 0x9f1, 0x9c7, 0x9ae, 0x9cd, 0x9ac, 0x9f0, 0x3b, 0x9a1, 0x9bf, 0x99a, 0x9c7, 0x9ae, 0x9cd, 0x9ac, 0x9f0, 0x99c, 0x9be, 0x9a8, 0x9c1,
-0x3b, 0x9ab, 0x9c7, 0x9ac, 0x9cd, 0x9f0, 0x9c1, 0x3b, 0x9ae, 0x9be, 0x9f0, 0x9cd, 0x99a, 0x3b, 0x98f, 0x9aa, 0x9cd, 0x9f0, 0x9bf, 0x9b2,
-0x3b, 0x9ae, 0x9c7, 0x2019, 0x3b, 0x99c, 0x9c1, 0x9a8, 0x3b, 0x99c, 0x9c1, 0x9b2, 0x9be, 0x987, 0x3b, 0x986, 0x997, 0x3b, 0x99b, 0x9c7,
-0x9aa, 0x9cd, 0x9a4, 0x9c7, 0x3b, 0x985, 0x995, 0x9cd, 0x99f, 0x9cb, 0x3b, 0x9a8, 0x9f1, 0x9c7, 0x3b, 0x9a1, 0x9bf, 0x99a, 0x9c7, 0x99c,
-0x3b, 0x9ab, 0x3b, 0x9ae, 0x3b, 0x98f, 0x3b, 0x9ae, 0x3b, 0x99c, 0x3b, 0x99c, 0x3b, 0x986, 0x3b, 0x99b, 0x3b, 0x985, 0x3b, 0x9a8,
-0x3b, 0x9a1, 0x78, 0x69, 0x6e, 0x65, 0x72, 0x75, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x65, 0x72, 0x75, 0x3b, 0x6d, 0x61, 0x72,
-0x7a, 0x75, 0x3b, 0x61, 0x62, 0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x61, 0x79, 0x75, 0x3b, 0x78, 0x75, 0x6e, 0x75, 0x3b, 0x78,
-0x75, 0x6e, 0x65, 0x74, 0x75, 0x3b, 0x61, 0x67, 0x6f, 0x73, 0x74, 0x75, 0x3b, 0x73, 0x65, 0x74, 0x69, 0x65, 0x6d, 0x62,
-0x72, 0x65, 0x3b, 0x6f, 0x63, 0x68, 0x6f, 0x62, 0x72, 0x65, 0x3b, 0x70, 0x61, 0x79, 0x61, 0x72, 0x65, 0x73, 0x3b, 0x61,
-0x76, 0x69, 0x65, 0x6e, 0x74, 0x75, 0x64, 0x65, 0x20, 0x78, 0x69, 0x6e, 0x65, 0x72, 0x75, 0x3b, 0x64, 0x65, 0x20, 0x66,
-0x65, 0x62, 0x72, 0x65, 0x72, 0x75, 0x3b, 0x64, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x7a, 0x75, 0x3b, 0x64, 0x2019, 0x61, 0x62,
-0x72, 0x69, 0x6c, 0x3b, 0x64, 0x65, 0x20, 0x6d, 0x61, 0x79, 0x75, 0x3b, 0x64, 0x65, 0x20, 0x78, 0x75, 0x6e, 0x75, 0x3b,
-0x64, 0x65, 0x20, 0x78, 0x75, 0x6e, 0x65, 0x74, 0x75, 0x3b, 0x64, 0x2019, 0x61, 0x67, 0x6f, 0x73, 0x74, 0x75, 0x3b, 0x64,
-0x65, 0x20, 0x73, 0x65, 0x74, 0x69, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x64, 0x2019, 0x6f, 0x63, 0x68, 0x6f, 0x62, 0x72,
-0x65, 0x3b, 0x64, 0x65, 0x20, 0x70, 0x61, 0x79, 0x61, 0x72, 0x65, 0x73, 0x3b, 0x64, 0x2019, 0x61, 0x76, 0x69, 0x65, 0x6e,
-0x74, 0x75, 0x58, 0x69, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x62, 0x72, 0x3b, 0x4d, 0x61,
-0x79, 0x3b, 0x58, 0x75, 0x6e, 0x3b, 0x58, 0x6e, 0x74, 0x3b, 0x41, 0x67, 0x6f, 0x3b, 0x53, 0x65, 0x74, 0x3b, 0x4f, 0x63,
-0x68, 0x3b, 0x50, 0x61, 0x79, 0x3b, 0x41, 0x76, 0x69, 0x78, 0x69, 0x6e, 0x3b, 0x66, 0x65, 0x62, 0x3b, 0x6d, 0x61, 0x72,
-0x3b, 0x61, 0x62, 0x72, 0x3b, 0x6d, 0x61, 0x79, 0x3b, 0x78, 0x75, 0x6e, 0x3b, 0x78, 0x6e, 0x74, 0x3b, 0x61, 0x67, 0x6f,
-0x3b, 0x73, 0x65, 0x74, 0x3b, 0x6f, 0x63, 0x68, 0x3b, 0x70, 0x61, 0x79, 0x3b, 0x61, 0x76, 0x69, 0x58, 0x3b, 0x46, 0x3b,
-0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x58, 0x3b, 0x58, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x50, 0x3b, 0x41, 0x4a,
-0x61, 0x6e, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x4d, 0x61, 0x63, 0x68,
-0x69, 0x3b, 0x41, 0x70, 0x72, 0x69, 0x6c, 0x69, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75,
-0x6c, 0x61, 0x69, 0x3b, 0x41, 0x67, 0x6f, 0x73, 0x74, 0x69, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x61, 0x3b,
-0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x61, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x44, 0x65, 0x73, 0x65, 0x6d,
-0x62, 0x61, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x63, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x65,
-0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x6f, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b,
-0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x63, 0x79, 0x61, 0x6e, 0x76, 0x61, 0x72, 0x3b, 0x66, 0x65, 0x76, 0x72,
-0x61, 0x6c, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x3b, 0x61, 0x70, 0x72, 0x65, 0x6c, 0x3b, 0x6d, 0x61, 0x79, 0x3b, 0x69, 0x79,
-0x75, 0x6e, 0x3b, 0x69, 0x79, 0x75, 0x6c, 0x3b, 0x61, 0x76, 0x71, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x6e, 0x74, 0x79,
-0x61, 0x62, 0x72, 0x3b, 0x6f, 0x6b, 0x74, 0x79, 0x61, 0x62, 0x72, 0x3b, 0x6e, 0x6f, 0x79, 0x61, 0x62, 0x72, 0x3b, 0x64,
-0x65, 0x6b, 0x61, 0x62, 0x72, 0x79, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x76, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x61, 0x70, 0x72,
-0x3b, 0x6d, 0x61, 0x79, 0x3b, 0x69, 0x79, 0x6e, 0x3b, 0x69, 0x79, 0x6c, 0x3b, 0x61, 0x76, 0x71, 0x3b, 0x73, 0x65, 0x6e,
-0x3b, 0x6f, 0x6b, 0x74, 0x3b, 0x6e, 0x6f, 0x79, 0x3b, 0x64, 0x65, 0x6b, 0x408, 0x430, 0x43d, 0x432, 0x430, 0x440, 0x3b, 0x424,
-0x435, 0x432, 0x440, 0x430, 0x43b, 0x3b, 0x41c, 0x430, 0x440, 0x442, 0x3b, 0x410, 0x43f, 0x440, 0x435, 0x43b, 0x3b, 0x41c, 0x430, 0x439,
-0x3b, 0x418, 0x458, 0x443, 0x43d, 0x3b, 0x418, 0x458, 0x443, 0x43b, 0x3b, 0x410, 0x432, 0x433, 0x443, 0x441, 0x442, 0x3b, 0x421, 0x435,
-0x43d, 0x442, 0x458, 0x430, 0x431, 0x440, 0x3b, 0x41e, 0x43a, 0x442, 0x458, 0x430, 0x431, 0x440, 0x3b, 0x41d, 0x43e, 0x458, 0x430, 0x431,
-0x440, 0x3b, 0x414, 0x435, 0x43a, 0x430, 0x431, 0x440, 0x458, 0x430, 0x43d, 0x432, 0x430, 0x440, 0x3b, 0x444, 0x435, 0x432, 0x440, 0x430,
-0x43b, 0x3b, 0x43c, 0x430, 0x440, 0x442, 0x3b, 0x430, 0x43f, 0x440, 0x435, 0x43b, 0x3b, 0x43c, 0x430, 0x439, 0x3b, 0x438, 0x458, 0x443,
-0x43d, 0x3b, 0x438, 0x458, 0x443, 0x43b, 0x3b, 0x430, 0x432, 0x433, 0x443, 0x441, 0x442, 0x3b, 0x441, 0x435, 0x43d, 0x442, 0x458, 0x430,
-0x431, 0x440, 0x3b, 0x43e, 0x43a, 0x442, 0x458, 0x430, 0x431, 0x440, 0x3b, 0x43d, 0x43e, 0x458, 0x430, 0x431, 0x440, 0x3b, 0x434, 0x435,
-0x43a, 0x430, 0x431, 0x440, 0x458, 0x430, 0x43d, 0x3b, 0x444, 0x435, 0x432, 0x3b, 0x43c, 0x430, 0x440, 0x3b, 0x430, 0x43f, 0x440, 0x3b,
-0x43c, 0x430, 0x439, 0x3b, 0x438, 0x458, 0x43d, 0x3b, 0x438, 0x458, 0x43b, 0x3b, 0x430, 0x432, 0x433, 0x3b, 0x441, 0x435, 0x43d, 0x3b,
-0x43e, 0x43a, 0x442, 0x3b, 0x43d, 0x43e, 0x458, 0x3b, 0x434, 0x435, 0x43a, 0x14b, 0x77, 0xed, 0xed, 0x20, 0x61, 0x20, 0x6e, 0x74,
-0x254, 0x301, 0x6e, 0x74, 0x254, 0x3b, 0x14b, 0x77, 0xed, 0xed, 0x20, 0x61, 0x6b, 0x1dd, 0x20, 0x62, 0x25b, 0x301, 0x25b, 0x3b,
-0x14b, 0x77, 0xed, 0xed, 0x20, 0x61, 0x6b, 0x1dd, 0x20, 0x72, 0xe1, 0xe1, 0x3b, 0x14b, 0x77, 0xed, 0xed, 0x20, 0x61, 0x6b,
-0x1dd, 0x20, 0x6e, 0x69, 0x6e, 0x3b, 0x14b, 0x77, 0xed, 0xed, 0x20, 0x61, 0x6b, 0x1dd, 0x20, 0x74, 0xe1, 0x61, 0x6e, 0x3b,
-0x14b, 0x77, 0xed, 0xed, 0x20, 0x61, 0x6b, 0x1dd, 0x20, 0x74, 0xe1, 0x61, 0x66, 0x254, 0x6b, 0x3b, 0x14b, 0x77, 0xed, 0xed,
-0x20, 0x61, 0x6b, 0x1dd, 0x20, 0x74, 0xe1, 0x61, 0x62, 0x25b, 0x25b, 0x3b, 0x14b, 0x77, 0xed, 0xed, 0x20, 0x61, 0x6b, 0x1dd,
-0x20, 0x74, 0xe1, 0x61, 0x72, 0x61, 0x61, 0x3b, 0x14b, 0x77, 0xed, 0xed, 0x20, 0x61, 0x6b, 0x1dd, 0x20, 0x74, 0xe1, 0x61,
-0x6e, 0x69, 0x6e, 0x3b, 0x14b, 0x77, 0xed, 0xed, 0x20, 0x61, 0x6b, 0x1dd, 0x20, 0x6e, 0x74, 0x25b, 0x6b, 0x3b, 0x14b, 0x77,
-0xed, 0xed, 0x20, 0x61, 0x6b, 0x1dd, 0x20, 0x6e, 0x74, 0x25b, 0x6b, 0x20, 0x64, 0x69, 0x20, 0x62, 0x254, 0x301, 0x6b, 0x3b,
-0x14b, 0x77, 0xed, 0xed, 0x20, 0x61, 0x6b, 0x1dd, 0x20, 0x6e, 0x74, 0x25b, 0x6b, 0x20, 0x64, 0x69, 0x20, 0x62, 0x25b, 0x301,
-0x25b, 0x14b, 0x31, 0x3b, 0x14b, 0x32, 0x3b, 0x14b, 0x33, 0x3b, 0x14b, 0x34, 0x3b, 0x14b, 0x35, 0x3b, 0x14b, 0x36, 0x3b, 0x14b,
-0x37, 0x3b, 0x14b, 0x38, 0x3b, 0x14b, 0x39, 0x3b, 0x14b, 0x31, 0x30, 0x3b, 0x14b, 0x31, 0x31, 0x3b, 0x14b, 0x31, 0x32, 0x7a,
-0x61, 0x6e, 0x77, 0x75, 0x79, 0x65, 0x3b, 0x66, 0x65, 0x62, 0x75, 0x72, 0x75, 0x79, 0x65, 0x3b, 0x6d, 0x61, 0x72, 0x69,
-0x73, 0x69, 0x3b, 0x61, 0x77, 0x69, 0x72, 0x69, 0x6c, 0x69, 0x3b, 0x6d, 0x25b, 0x3b, 0x7a, 0x75, 0x77, 0x25b, 0x6e, 0x3b,
-0x7a, 0x75, 0x6c, 0x75, 0x79, 0x65, 0x3b, 0x75, 0x74, 0x69, 0x3b, 0x73, 0x25b, 0x74, 0x61, 0x6e, 0x62, 0x75, 0x72, 0x75,
-0x3b, 0x254, 0x6b, 0x75, 0x74, 0x254, 0x62, 0x75, 0x72, 0x75, 0x3b, 0x6e, 0x6f, 0x77, 0x61, 0x6e, 0x62, 0x75, 0x72, 0x75,
-0x3b, 0x64, 0x65, 0x73, 0x61, 0x6e, 0x62, 0x75, 0x72, 0x75, 0x7a, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x62, 0x3b, 0x6d, 0x61,
-0x72, 0x3b, 0x61, 0x77, 0x69, 0x3b, 0x6d, 0x25b, 0x3b, 0x7a, 0x75, 0x77, 0x3b, 0x7a, 0x75, 0x6c, 0x3b, 0x75, 0x74, 0x69,
-0x3b, 0x73, 0x25b, 0x74, 0x3b, 0x254, 0x6b, 0x75, 0x3b, 0x6e, 0x6f, 0x77, 0x3b, 0x64, 0x65, 0x73, 0x5a, 0x3b, 0x46, 0x3b,
-0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x5a, 0x3b, 0x5a, 0x3b, 0x55, 0x3b, 0x53, 0x3b, 0x186, 0x3b, 0x4e, 0x3b, 0x44, 0x99c,
-0x9be, 0x9a8, 0x9c1, 0x9af, 0x9bc, 0x9be, 0x9b0, 0x9c0, 0x3b, 0x9ab, 0x9c7, 0x9ac, 0x9cd, 0x9b0, 0x9c1, 0x9af, 0x9bc, 0x9be, 0x9b0, 0x9c0,
-0x3b, 0x9ae, 0x9be, 0x9b0, 0x9cd, 0x99a, 0x3b, 0x98f, 0x9aa, 0x9cd, 0x9b0, 0x9bf, 0x9b2, 0x3b, 0x9ae, 0x9c7, 0x3b, 0x99c, 0x9c1, 0x9a8,
-0x3b, 0x99c, 0x9c1, 0x9b2, 0x9be, 0x987, 0x3b, 0x986, 0x997, 0x9b8, 0x9cd, 0x99f, 0x3b, 0x9b8, 0x9c7, 0x9aa, 0x9cd, 0x99f, 0x9c7, 0x9ae,
-0x9cd, 0x9ac, 0x9b0, 0x3b, 0x985, 0x995, 0x9cd, 0x99f, 0x9cb, 0x9ac, 0x9b0, 0x3b, 0x9a8, 0x9ad, 0x9c7, 0x9ae, 0x9cd, 0x9ac, 0x9b0, 0x3b,
-0x9a1, 0x9bf, 0x9b8, 0x9c7, 0x9ae, 0x9cd, 0x9ac, 0x9b0, 0x99c, 0x9be, 0x9a8, 0x9c1, 0x3b, 0x9ab, 0x9c7, 0x9ac, 0x3b, 0x9ae, 0x9be, 0x9b0,
-0x9cd, 0x99a, 0x3b, 0x98f, 0x9aa, 0x9cd, 0x9b0, 0x9bf, 0x9b2, 0x3b, 0x9ae, 0x9c7, 0x3b, 0x99c, 0x9c1, 0x9a8, 0x3b, 0x99c, 0x9c1, 0x9b2,
-0x9be, 0x987, 0x3b, 0x986, 0x997, 0x9b8, 0x9cd, 0x99f, 0x3b, 0x9b8, 0x9c7, 0x9aa, 0x9cd, 0x99f, 0x9c7, 0x9ae, 0x9cd, 0x9ac, 0x9b0, 0x3b,
-0x985, 0x995, 0x9cd, 0x99f, 0x9cb, 0x9ac, 0x9b0, 0x3b, 0x9a8, 0x9ad, 0x9c7, 0x9ae, 0x9cd, 0x9ac, 0x9b0, 0x3b, 0x9a1, 0x9bf, 0x9b8, 0x9c7,
-0x9ae, 0x9cd, 0x9ac, 0x9b0, 0x99c, 0x9be, 0x3b, 0x9ab, 0x9c7, 0x3b, 0x9ae, 0x9be, 0x3b, 0x98f, 0x3b, 0x9ae, 0x9c7, 0x3b, 0x99c, 0x9c1,
-0x9a8, 0x3b, 0x99c, 0x9c1, 0x3b, 0x986, 0x3b, 0x9b8, 0x9c7, 0x3b, 0x985, 0x3b, 0x9a8, 0x3b, 0x9a1, 0x9bf, 0x4b, 0x254, 0x6e, 0x64,
-0x254, 0x14b, 0x3b, 0x4d, 0xe0, 0x63, 0x25b, 0x302, 0x6c, 0x3b, 0x4d, 0xe0, 0x74, 0xf9, 0x6d, 0x62, 0x3b, 0x4d, 0xe0, 0x74,
-0x6f, 0x70, 0x3b, 0x4d, 0x300, 0x70, 0x75, 0x79, 0x25b, 0x3b, 0x48, 0xec, 0x6c, 0xf2, 0x6e, 0x64, 0x25b, 0x300, 0x3b, 0x4e,
-0x6a, 0xe8, 0x62, 0xe0, 0x3b, 0x48, 0xec, 0x6b, 0x61, 0x14b, 0x3b, 0x44, 0xec, 0x70, 0x254, 0x300, 0x73, 0x3b, 0x42, 0xec,
-0xf2, 0xf4, 0x6d, 0x3b, 0x4d, 0xe0, 0x79, 0x25b, 0x73, 0xe8, 0x70, 0x3b, 0x4c, 0xec, 0x62, 0x75, 0x79, 0x20, 0x6c, 0x69,
-0x20, 0x144, 0x79, 0xe8, 0x65, 0x6b, 0x254, 0x6e, 0x3b, 0x6d, 0x61, 0x63, 0x3b, 0x6d, 0x61, 0x74, 0x3b, 0x6d, 0x74, 0x6f,
-0x3b, 0x6d, 0x70, 0x75, 0x3b, 0x68, 0x69, 0x6c, 0x3b, 0x6e, 0x6a, 0x65, 0x3b, 0x68, 0x69, 0x6b, 0x3b, 0x64, 0x69, 0x70,
-0x3b, 0x62, 0x69, 0x6f, 0x3b, 0x6d, 0x61, 0x79, 0x3b, 0x6c, 0x69, 0x253, 0x6b, 0x3b, 0x6d, 0x3b, 0x6d, 0x3b, 0x6d, 0x3b,
-0x6d, 0x3b, 0x68, 0x3b, 0x6e, 0x3b, 0x68, 0x3b, 0x64, 0x3b, 0x62, 0x3b, 0x6d, 0x3b, 0x6c, 0x75, 0x72, 0x74, 0x61, 0x72,
-0x72, 0x69, 0x6c, 0x61, 0x3b, 0x6f, 0x74, 0x73, 0x61, 0x69, 0x6c, 0x61, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x78, 0x6f, 0x61,
-0x3b, 0x61, 0x70, 0x69, 0x72, 0x69, 0x6c, 0x61, 0x3b, 0x6d, 0x61, 0x69, 0x61, 0x74, 0x7a, 0x61, 0x3b, 0x65, 0x6b, 0x61,
-0x69, 0x6e, 0x61, 0x3b, 0x75, 0x7a, 0x74, 0x61, 0x69, 0x6c, 0x61, 0x3b, 0x61, 0x62, 0x75, 0x7a, 0x74, 0x75, 0x61, 0x3b,
-0x69, 0x72, 0x61, 0x69, 0x6c, 0x61, 0x3b, 0x75, 0x72, 0x72, 0x69, 0x61, 0x3b, 0x61, 0x7a, 0x61, 0x72, 0x6f, 0x61, 0x3b,
-0x61, 0x62, 0x65, 0x6e, 0x64, 0x75, 0x61, 0x75, 0x72, 0x74, 0x61, 0x72, 0x72, 0x69, 0x6c, 0x61, 0x6b, 0x3b, 0x6f, 0x74,
-0x73, 0x61, 0x69, 0x6c, 0x61, 0x6b, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x78, 0x6f, 0x61, 0x6b, 0x3b, 0x61, 0x70, 0x69, 0x72,
-0x69, 0x6c, 0x61, 0x6b, 0x3b, 0x6d, 0x61, 0x69, 0x61, 0x74, 0x7a, 0x61, 0x6b, 0x3b, 0x65, 0x6b, 0x61, 0x69, 0x6e, 0x61,
-0x6b, 0x3b, 0x75, 0x7a, 0x74, 0x61, 0x69, 0x6c, 0x61, 0x6b, 0x3b, 0x61, 0x62, 0x75, 0x7a, 0x74, 0x75, 0x61, 0x6b, 0x3b,
-0x69, 0x72, 0x61, 0x69, 0x6c, 0x61, 0x6b, 0x3b, 0x75, 0x72, 0x72, 0x69, 0x61, 0x6b, 0x3b, 0x61, 0x7a, 0x61, 0x72, 0x6f,
-0x61, 0x6b, 0x3b, 0x61, 0x62, 0x65, 0x6e, 0x64, 0x75, 0x61, 0x6b, 0x75, 0x72, 0x74, 0x2e, 0x3b, 0x6f, 0x74, 0x73, 0x2e,
-0x3b, 0x6d, 0x61, 0x72, 0x2e, 0x3b, 0x61, 0x70, 0x69, 0x2e, 0x3b, 0x6d, 0x61, 0x69, 0x2e, 0x3b, 0x65, 0x6b, 0x61, 0x2e,
-0x3b, 0x75, 0x7a, 0x74, 0x2e, 0x3b, 0x61, 0x62, 0x75, 0x2e, 0x3b, 0x69, 0x72, 0x61, 0x2e, 0x3b, 0x75, 0x72, 0x72, 0x2e,
-0x3b, 0x61, 0x7a, 0x61, 0x2e, 0x3b, 0x61, 0x62, 0x65, 0x2e, 0x55, 0x3b, 0x4f, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b,
-0x45, 0x3b, 0x55, 0x3b, 0x41, 0x3b, 0x49, 0x3b, 0x55, 0x3b, 0x41, 0x3b, 0x41, 0x441, 0x442, 0x443, 0x434, 0x437, 0x435, 0x43d,
-0x44c, 0x3b, 0x43b, 0x44e, 0x442, 0x44b, 0x3b, 0x441, 0x430, 0x43a, 0x430, 0x432, 0x456, 0x43a, 0x3b, 0x43a, 0x440, 0x430, 0x441, 0x430,
-0x432, 0x456, 0x43a, 0x3b, 0x43c, 0x430, 0x439, 0x3b, 0x447, 0x44d, 0x440, 0x432, 0x435, 0x43d, 0x44c, 0x3b, 0x43b, 0x456, 0x43f, 0x435,
-0x43d, 0x44c, 0x3b, 0x436, 0x43d, 0x456, 0x432, 0x435, 0x43d, 0x44c, 0x3b, 0x432, 0x435, 0x440, 0x430, 0x441, 0x435, 0x43d, 0x44c, 0x3b,
-0x43a, 0x430, 0x441, 0x442, 0x440, 0x44b, 0x447, 0x43d, 0x456, 0x43a, 0x3b, 0x43b, 0x456, 0x441, 0x442, 0x430, 0x43f, 0x430, 0x434, 0x3b,
-0x441, 0x43d, 0x435, 0x436, 0x430, 0x43d, 0x44c, 0x441, 0x442, 0x443, 0x434, 0x437, 0x435, 0x43d, 0x44f, 0x3b, 0x43b, 0x44e, 0x442, 0x430,
-0x433, 0x430, 0x3b, 0x441, 0x430, 0x43a, 0x430, 0x432, 0x456, 0x43a, 0x430, 0x3b, 0x43a, 0x440, 0x430, 0x441, 0x430, 0x432, 0x456, 0x43a,
-0x430, 0x3b, 0x43c, 0x430, 0x44f, 0x3b, 0x447, 0x44d, 0x440, 0x432, 0x435, 0x43d, 0x44f, 0x3b, 0x43b, 0x456, 0x43f, 0x435, 0x43d, 0x44f,
-0x3b, 0x436, 0x43d, 0x456, 0x45e, 0x43d, 0x44f, 0x3b, 0x432, 0x435, 0x440, 0x430, 0x441, 0x43d, 0x44f, 0x3b, 0x43a, 0x430, 0x441, 0x442,
-0x440, 0x44b, 0x447, 0x43d, 0x456, 0x43a, 0x430, 0x3b, 0x43b, 0x456, 0x441, 0x442, 0x430, 0x43f, 0x430, 0x434, 0x430, 0x3b, 0x441, 0x43d,
-0x435, 0x436, 0x43d, 0x44f, 0x441, 0x442, 0x443, 0x3b, 0x43b, 0x44e, 0x442, 0x3b, 0x441, 0x430, 0x43a, 0x3b, 0x43a, 0x440, 0x430, 0x3b,
-0x43c, 0x430, 0x439, 0x3b, 0x447, 0x44d, 0x440, 0x3b, 0x43b, 0x456, 0x43f, 0x3b, 0x436, 0x43d, 0x456, 0x3b, 0x432, 0x435, 0x440, 0x3b,
-0x43a, 0x430, 0x441, 0x3b, 0x43b, 0x456, 0x441, 0x3b, 0x441, 0x43d, 0x435, 0x441, 0x442, 0x443, 0x3b, 0x43b, 0x44e, 0x442, 0x3b, 0x441,
-0x430, 0x43a, 0x3b, 0x43a, 0x440, 0x430, 0x3b, 0x43c, 0x430, 0x44f, 0x3b, 0x447, 0x44d, 0x440, 0x3b, 0x43b, 0x456, 0x43f, 0x3b, 0x436,
-0x43d, 0x456, 0x3b, 0x432, 0x435, 0x440, 0x3b, 0x43a, 0x430, 0x441, 0x3b, 0x43b, 0x456, 0x441, 0x3b, 0x441, 0x43d, 0x435, 0x441, 0x3b,
-0x43b, 0x3b, 0x441, 0x3b, 0x43a, 0x3b, 0x43c, 0x3b, 0x447, 0x3b, 0x43b, 0x3b, 0x436, 0x3b, 0x432, 0x3b, 0x43a, 0x3b, 0x43b, 0x3b,
-0x441, 0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x4d, 0x61,
-0x63, 0x68, 0x69, 0x3b, 0x45, 0x70, 0x72, 0x65, 0x6f, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a,
-0x75, 0x6c, 0x61, 0x69, 0x3b, 0x4f, 0x67, 0x61, 0x73, 0x74, 0x69, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x61,
-0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x61, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x44, 0x69, 0x73, 0x65,
-0x6d, 0x62, 0x61, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x63, 0x3b, 0x45, 0x70, 0x72, 0x3b, 0x4d,
-0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x4f, 0x67, 0x61, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f,
-0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x69, 0x73, 0x4a, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x45, 0x3b, 0x4d, 0x3b,
-0x4a, 0x3b, 0x4a, 0x3b, 0x4f, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x70, 0x61, 0x20, 0x6d, 0x77, 0x65, 0x64,
-0x7a, 0x69, 0x20, 0x67, 0x77, 0x61, 0x20, 0x68, 0x75, 0x74, 0x61, 0x6c, 0x61, 0x3b, 0x70, 0x61, 0x20, 0x6d, 0x77, 0x65,
-0x64, 0x7a, 0x69, 0x20, 0x67, 0x77, 0x61, 0x20, 0x77, 0x75, 0x76, 0x69, 0x6c, 0x69, 0x3b, 0x70, 0x61, 0x20, 0x6d, 0x77,
-0x65, 0x64, 0x7a, 0x69, 0x20, 0x67, 0x77, 0x61, 0x20, 0x77, 0x75, 0x64, 0x61, 0x74, 0x75, 0x3b, 0x70, 0x61, 0x20, 0x6d,
-0x77, 0x65, 0x64, 0x7a, 0x69, 0x20, 0x67, 0x77, 0x61, 0x20, 0x77, 0x75, 0x74, 0x61, 0x69, 0x3b, 0x70, 0x61, 0x20, 0x6d,
-0x77, 0x65, 0x64, 0x7a, 0x69, 0x20, 0x67, 0x77, 0x61, 0x20, 0x77, 0x75, 0x68, 0x61, 0x6e, 0x75, 0x3b, 0x70, 0x61, 0x20,
-0x6d, 0x77, 0x65, 0x64, 0x7a, 0x69, 0x20, 0x67, 0x77, 0x61, 0x20, 0x73, 0x69, 0x74, 0x61, 0x3b, 0x70, 0x61, 0x20, 0x6d,
-0x77, 0x65, 0x64, 0x7a, 0x69, 0x20, 0x67, 0x77, 0x61, 0x20, 0x73, 0x61, 0x62, 0x61, 0x3b, 0x70, 0x61, 0x20, 0x6d, 0x77,
-0x65, 0x64, 0x7a, 0x69, 0x20, 0x67, 0x77, 0x61, 0x20, 0x6e, 0x61, 0x6e, 0x65, 0x3b, 0x70, 0x61, 0x20, 0x6d, 0x77, 0x65,
-0x64, 0x7a, 0x69, 0x20, 0x67, 0x77, 0x61, 0x20, 0x74, 0x69, 0x73, 0x61, 0x3b, 0x70, 0x61, 0x20, 0x6d, 0x77, 0x65, 0x64,
-0x7a, 0x69, 0x20, 0x67, 0x77, 0x61, 0x20, 0x6b, 0x75, 0x6d, 0x69, 0x3b, 0x70, 0x61, 0x20, 0x6d, 0x77, 0x65, 0x64, 0x7a,
-0x69, 0x20, 0x67, 0x77, 0x61, 0x20, 0x6b, 0x75, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x6d, 0x6f, 0x6a, 0x61, 0x3b, 0x70,
-0x61, 0x20, 0x6d, 0x77, 0x65, 0x64, 0x7a, 0x69, 0x20, 0x67, 0x77, 0x61, 0x20, 0x6b, 0x75, 0x6d, 0x69, 0x20, 0x6e, 0x61,
-0x20, 0x6d, 0x62, 0x69, 0x6c, 0x69, 0x48, 0x75, 0x74, 0x3b, 0x56, 0x69, 0x6c, 0x3b, 0x44, 0x61, 0x74, 0x3b, 0x54, 0x61,
-0x69, 0x3b, 0x48, 0x61, 0x6e, 0x3b, 0x53, 0x69, 0x74, 0x3b, 0x53, 0x61, 0x62, 0x3b, 0x4e, 0x61, 0x6e, 0x3b, 0x54, 0x69,
-0x73, 0x3b, 0x4b, 0x75, 0x6d, 0x3b, 0x4b, 0x6d, 0x6a, 0x3b, 0x4b, 0x6d, 0x62, 0x48, 0x3b, 0x56, 0x3b, 0x44, 0x3b, 0x54,
-0x3b, 0x48, 0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x4e, 0x3b, 0x54, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4b, 0x91c, 0x93e, 0x928, 0x941,
-0x935, 0x93e, 0x930, 0x940, 0x3b, 0x92b, 0x947, 0x92c, 0x94d, 0x930, 0x941, 0x935, 0x93e, 0x930, 0x940, 0x3b, 0x92e, 0x93e, 0x930, 0x94d,
-0x938, 0x3b, 0x90f, 0x92b, 0x94d, 0x930, 0x93f, 0x932, 0x3b, 0x92e, 0x947, 0x3b, 0x91c, 0x941, 0x928, 0x3b, 0x91c, 0x941, 0x932, 0x93e,
-0x907, 0x3b, 0x906, 0x917, 0x938, 0x94d, 0x925, 0x3b, 0x938, 0x947, 0x92c, 0x925, 0x947, 0x91c, 0x94d, 0x92c, 0x93c, 0x930, 0x3b, 0x905,
-0x916, 0x925, 0x92c, 0x930, 0x3b, 0x928, 0x92c, 0x947, 0x91c, 0x94d, 0x92c, 0x93c, 0x930, 0x3b, 0x926, 0x93f, 0x938, 0x947, 0x91c, 0x94d,
-0x92c, 0x93c, 0x930, 0x91c, 0x3b, 0x92b, 0x947, 0x3b, 0x92e, 0x93e, 0x3b, 0x90f, 0x3b, 0x92e, 0x947, 0x3b, 0x91c, 0x941, 0x3b, 0x91c,
-0x941, 0x3b, 0x906, 0x3b, 0x938, 0x947, 0x3b, 0x905, 0x3b, 0x928, 0x3b, 0x926, 0x93f, 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x3b,
-0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x6d,
-0x61, 0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x3b, 0x61, 0x75, 0x67, 0x75, 0x73, 0x74, 0x3b,
-0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x62, 0x61, 0x72, 0x3b, 0x6e, 0x6f,
-0x76, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x6a, 0x61, 0x6e, 0x3b, 0x66,
-0x65, 0x62, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x61, 0x70, 0x72, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x3b, 0x6a,
-0x75, 0x6c, 0x3b, 0x61, 0x75, 0x67, 0x3b, 0x73, 0x65, 0x70, 0x3b, 0x6f, 0x6b, 0x74, 0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64,
-0x65, 0x63, 0x6a, 0x3b, 0x66, 0x3b, 0x6d, 0x3b, 0x61, 0x3b, 0x6d, 0x3b, 0x6a, 0x3b, 0x6a, 0x3b, 0x61, 0x3b, 0x73, 0x3b,
-0x6f, 0x3b, 0x6e, 0x3b, 0x64, 0x458, 0x430, 0x43d, 0x443, 0x430, 0x440, 0x3b, 0x444, 0x435, 0x431, 0x440, 0x443, 0x430, 0x440, 0x3b,
-0x43c, 0x430, 0x440, 0x442, 0x3b, 0x430, 0x43f, 0x440, 0x438, 0x43b, 0x3b, 0x43c, 0x430, 0x458, 0x3b, 0x458, 0x443, 0x43d, 0x438, 0x3b,
-0x458, 0x443, 0x43b, 0x438, 0x3b, 0x430, 0x443, 0x433, 0x443, 0x441, 0x442, 0x3b, 0x441, 0x435, 0x43f, 0x442, 0x435, 0x43c, 0x431, 0x430,
-0x440, 0x3b, 0x43e, 0x43a, 0x442, 0x43e, 0x431, 0x430, 0x440, 0x3b, 0x43d, 0x43e, 0x432, 0x435, 0x43c, 0x431, 0x430, 0x440, 0x3b, 0x434,
-0x435, 0x446, 0x435, 0x43c, 0x431, 0x430, 0x440, 0x458, 0x430, 0x43d, 0x3b, 0x444, 0x435, 0x431, 0x3b, 0x43c, 0x430, 0x440, 0x3b, 0x430,
-0x43f, 0x440, 0x3b, 0x43c, 0x430, 0x458, 0x3b, 0x458, 0x443, 0x43d, 0x3b, 0x458, 0x443, 0x43b, 0x3b, 0x430, 0x443, 0x433, 0x3b, 0x441,
-0x435, 0x43f, 0x3b, 0x43e, 0x43a, 0x442, 0x3b, 0x43d, 0x43e, 0x432, 0x3b, 0x434, 0x435, 0x446, 0x458, 0x3b, 0x444, 0x3b, 0x43c, 0x3b,
-0x430, 0x3b, 0x43c, 0x3b, 0x458, 0x3b, 0x458, 0x3b, 0x430, 0x3b, 0x441, 0x3b, 0x43e, 0x3b, 0x43d, 0x3b, 0x434, 0x47, 0x65, 0x6e,
-0x76, 0x65, 0x72, 0x3b, 0x43, 0x2bc, 0x68, 0x77, 0x65, 0x76, 0x72, 0x65, 0x72, 0x3b, 0x4d, 0x65, 0x75, 0x72, 0x7a, 0x68,
-0x3b, 0x45, 0x62, 0x72, 0x65, 0x6c, 0x3b, 0x4d, 0x61, 0x65, 0x3b, 0x4d, 0x65, 0x7a, 0x68, 0x65, 0x76, 0x65, 0x6e, 0x3b,
-0x47, 0x6f, 0x75, 0x65, 0x72, 0x65, 0x3b, 0x45, 0x6f, 0x73, 0x74, 0x3b, 0x47, 0x77, 0x65, 0x6e, 0x67, 0x6f, 0x6c, 0x6f,
-0x3b, 0x48, 0x65, 0x72, 0x65, 0x3b, 0x44, 0x75, 0x3b, 0x4b, 0x65, 0x72, 0x7a, 0x75, 0x47, 0x65, 0x6e, 0x2e, 0x3b, 0x43,
-0x2bc, 0x68, 0x77, 0x65, 0x2e, 0x3b, 0x4d, 0x65, 0x75, 0x72, 0x2e, 0x3b, 0x45, 0x62, 0x72, 0x2e, 0x3b, 0x4d, 0x61, 0x65,
-0x3b, 0x4d, 0x65, 0x7a, 0x68, 0x2e, 0x3b, 0x47, 0x6f, 0x75, 0x65, 0x2e, 0x3b, 0x45, 0x6f, 0x73, 0x74, 0x3b, 0x47, 0x77,
-0x65, 0x6e, 0x2e, 0x3b, 0x48, 0x65, 0x72, 0x65, 0x3b, 0x44, 0x75, 0x3b, 0x4b, 0x7a, 0x75, 0x2e, 0x30, 0x31, 0x3b, 0x30,
-0x32, 0x3b, 0x30, 0x33, 0x3b, 0x30, 0x34, 0x3b, 0x30, 0x35, 0x3b, 0x30, 0x36, 0x3b, 0x30, 0x37, 0x3b, 0x30, 0x38, 0x3b,
-0x30, 0x39, 0x3b, 0x31, 0x30, 0x3b, 0x31, 0x31, 0x3b, 0x31, 0x32, 0x44f, 0x43d, 0x443, 0x430, 0x440, 0x438, 0x3b, 0x444, 0x435,
-0x432, 0x440, 0x443, 0x430, 0x440, 0x438, 0x3b, 0x43c, 0x430, 0x440, 0x442, 0x3b, 0x430, 0x43f, 0x440, 0x438, 0x43b, 0x3b, 0x43c, 0x430,
-0x439, 0x3b, 0x44e, 0x43d, 0x438, 0x3b, 0x44e, 0x43b, 0x438, 0x3b, 0x430, 0x432, 0x433, 0x443, 0x441, 0x442, 0x3b, 0x441, 0x435, 0x43f,
-0x442, 0x435, 0x43c, 0x432, 0x440, 0x438, 0x3b, 0x43e, 0x43a, 0x442, 0x43e, 0x43c, 0x432, 0x440, 0x438, 0x3b, 0x43d, 0x43e, 0x435, 0x43c,
-0x432, 0x440, 0x438, 0x3b, 0x434, 0x435, 0x43a, 0x435, 0x43c, 0x432, 0x440, 0x438, 0x44f, 0x43d, 0x443, 0x3b, 0x444, 0x435, 0x432, 0x3b,
-0x43c, 0x430, 0x440, 0x442, 0x3b, 0x430, 0x43f, 0x440, 0x3b, 0x43c, 0x430, 0x439, 0x3b, 0x44e, 0x43d, 0x438, 0x3b, 0x44e, 0x43b, 0x438,
-0x3b, 0x430, 0x432, 0x433, 0x3b, 0x441, 0x435, 0x43f, 0x3b, 0x43e, 0x43a, 0x442, 0x3b, 0x43d, 0x43e, 0x435, 0x3b, 0x434, 0x435, 0x43a,
-0x44f, 0x3b, 0x444, 0x3b, 0x43c, 0x3b, 0x430, 0x3b, 0x43c, 0x3b, 0x44e, 0x3b, 0x44e, 0x3b, 0x430, 0x3b, 0x441, 0x3b, 0x43e, 0x3b,
-0x43d, 0x3b, 0x434, 0x1007, 0x1014, 0x103a, 0x1014, 0x101d, 0x102b, 0x101b, 0x102e, 0x3b, 0x1016, 0x1031, 0x1016, 0x1031, 0x102c, 0x103a, 0x101d, 0x102b,
-0x101b, 0x102e, 0x3b, 0x1019, 0x1010, 0x103a, 0x3b, 0x1027, 0x1015, 0x103c, 0x102e, 0x3b, 0x1019, 0x1031, 0x3b, 0x1007, 0x103d, 0x1014, 0x103a, 0x3b,
-0x1007, 0x1030, 0x101c, 0x102d, 0x102f, 0x1004, 0x103a, 0x3b, 0x1029, 0x1002, 0x102f, 0x1010, 0x103a, 0x3b, 0x1005, 0x1000, 0x103a, 0x1010, 0x1004, 0x103a,
-0x1018, 0x102c, 0x3b, 0x1021, 0x1031, 0x102c, 0x1000, 0x103a, 0x1010, 0x102d, 0x102f, 0x1018, 0x102c, 0x3b, 0x1014, 0x102d, 0x102f, 0x101d, 0x1004, 0x103a,
-0x1018, 0x102c, 0x3b, 0x1012, 0x102e, 0x1007, 0x1004, 0x103a, 0x1018, 0x102c, 0x1007, 0x1014, 0x103a, 0x3b, 0x1016, 0x1031, 0x3b, 0x1019, 0x1010, 0x103a,
-0x3b, 0x1027, 0x3b, 0x1019, 0x1031, 0x3b, 0x1007, 0x103d, 0x1014, 0x103a, 0x3b, 0x1007, 0x1030, 0x3b, 0x1029, 0x3b, 0x1005, 0x1000, 0x103a, 0x3b,
-0x1021, 0x1031, 0x102c, 0x1000, 0x103a, 0x3b, 0x1014, 0x102d, 0x102f, 0x3b, 0x1012, 0x102e, 0x1007, 0x3b, 0x1016, 0x3b, 0x1019, 0x3b, 0x1027, 0x3b,
-0x1019, 0x3b, 0x1007, 0x3b, 0x1007, 0x3b, 0x1029, 0x3b, 0x1005, 0x3b, 0x1021, 0x3b, 0x1014, 0x3b, 0x1012, 0x31, 0x6708, 0x3b, 0x32, 0x6708,
-0x3b, 0x33, 0x6708, 0x3b, 0x34, 0x6708, 0x3b, 0x35, 0x6708, 0x3b, 0x36, 0x6708, 0x3b, 0x37, 0x6708, 0x3b, 0x38, 0x6708, 0x3b, 0x39,
-0x6708, 0x3b, 0x31, 0x30, 0x6708, 0x3b, 0x31, 0x31, 0x6708, 0x3b, 0x31, 0x32, 0x6708, 0x4e00, 0x6708, 0x3b, 0x4e8c, 0x6708, 0x3b, 0x4e09,
-0x6708, 0x3b, 0x56db, 0x6708, 0x3b, 0x4e94, 0x6708, 0x3b, 0x516d, 0x6708, 0x3b, 0x4e03, 0x6708, 0x3b, 0x516b, 0x6708, 0x3b, 0x4e5d, 0x6708, 0x3b,
-0x5341, 0x6708, 0x3b, 0x5341, 0x4e00, 0x6708, 0x3b, 0x5341, 0x4e8c, 0x6708, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x3b, 0x66, 0x65, 0x62, 0x72,
-0x65, 0x72, 0x3b, 0x6d, 0x61, 0x72, 0xe7, 0x3b, 0x61, 0x62, 0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x61, 0x69, 0x67, 0x3b, 0x6a,
-0x75, 0x6e, 0x79, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x6f, 0x6c, 0x3b, 0x61, 0x67, 0x6f, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x74,
-0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x6f, 0x63, 0x74, 0x75, 0x62, 0x72, 0x65, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62,
-0x72, 0x65, 0x3b, 0x64, 0x65, 0x73, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x64, 0x65, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x3b,
-0x64, 0x65, 0x20, 0x66, 0x65, 0x62, 0x72, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x20, 0x6d, 0x61, 0x72, 0xe7, 0x3b, 0x64, 0x2019,
-0x61, 0x62, 0x72, 0x69, 0x6c, 0x3b, 0x64, 0x65, 0x20, 0x6d, 0x61, 0x69, 0x67, 0x3b, 0x64, 0x65, 0x20, 0x6a, 0x75, 0x6e,
-0x79, 0x3b, 0x64, 0x65, 0x20, 0x6a, 0x75, 0x6c, 0x69, 0x6f, 0x6c, 0x3b, 0x64, 0x2019, 0x61, 0x67, 0x6f, 0x73, 0x74, 0x3b,
-0x64, 0x65, 0x20, 0x73, 0x65, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x64, 0x2019, 0x6f, 0x63, 0x74, 0x75, 0x62, 0x72,
-0x65, 0x3b, 0x64, 0x65, 0x20, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x64, 0x65, 0x20, 0x64, 0x65, 0x73,
-0x65, 0x6d, 0x62, 0x72, 0x65, 0x67, 0x65, 0x6e, 0x2e, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0xe7,
-0x3b, 0x61, 0x62, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x69, 0x67, 0x3b, 0x6a, 0x75, 0x6e, 0x79, 0x3b, 0x6a, 0x75, 0x6c, 0x2e,
-0x3b, 0x61, 0x67, 0x2e, 0x3b, 0x73, 0x65, 0x74, 0x2e, 0x3b, 0x6f, 0x63, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b,
-0x64, 0x65, 0x73, 0x2e, 0x64, 0x65, 0x20, 0x67, 0x65, 0x6e, 0x2e, 0x3b, 0x64, 0x65, 0x20, 0x66, 0x65, 0x62, 0x72, 0x2e,
-0x3b, 0x64, 0x65, 0x20, 0x6d, 0x61, 0x72, 0xe7, 0x3b, 0x64, 0x2019, 0x61, 0x62, 0x72, 0x2e, 0x3b, 0x64, 0x65, 0x20, 0x6d,
-0x61, 0x69, 0x67, 0x3b, 0x64, 0x65, 0x20, 0x6a, 0x75, 0x6e, 0x79, 0x3b, 0x64, 0x65, 0x20, 0x6a, 0x75, 0x6c, 0x2e, 0x3b,
-0x64, 0x2019, 0x61, 0x67, 0x2e, 0x3b, 0x64, 0x65, 0x20, 0x73, 0x65, 0x74, 0x2e, 0x3b, 0x64, 0x2019, 0x6f, 0x63, 0x74, 0x2e,
-0x3b, 0x64, 0x65, 0x20, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0x65, 0x20, 0x64, 0x65, 0x73, 0x2e, 0x47, 0x4e, 0x3b, 0x46,
-0x42, 0x3b, 0x4d, 0xc7, 0x3b, 0x41, 0x42, 0x3b, 0x4d, 0x47, 0x3b, 0x4a, 0x4e, 0x3b, 0x4a, 0x4c, 0x3b, 0x41, 0x47, 0x3b,
-0x53, 0x54, 0x3b, 0x4f, 0x43, 0x3b, 0x4e, 0x56, 0x3b, 0x44, 0x53, 0x45, 0x6e, 0x65, 0x72, 0x6f, 0x3b, 0x50, 0x65, 0x62,
-0x72, 0x65, 0x72, 0x6f, 0x3b, 0x4d, 0x61, 0x72, 0x73, 0x6f, 0x3b, 0x41, 0x62, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x61, 0x79,
-0x6f, 0x3b, 0x48, 0x75, 0x6e, 0x79, 0x6f, 0x3b, 0x48, 0x75, 0x6c, 0x79, 0x6f, 0x3b, 0x41, 0x67, 0x6f, 0x73, 0x74, 0x6f,
-0x3b, 0x53, 0x65, 0x74, 0x79, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x4f, 0x6b, 0x74, 0x75, 0x62, 0x72, 0x65, 0x3b, 0x4e,
-0x6f, 0x62, 0x79, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x44, 0x69, 0x73, 0x79, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x45, 0x6e,
-0x65, 0x3b, 0x50, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x62, 0x72, 0x3b, 0x4d, 0x61, 0x79, 0x3b, 0x48, 0x75,
-0x6e, 0x3b, 0x48, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x6f, 0x3b, 0x53, 0x65, 0x74, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f,
-0x62, 0x3b, 0x44, 0x69, 0x73, 0x45, 0x3b, 0x50, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x48, 0x3b, 0x48, 0x3b, 0x41,
-0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x59, 0x65, 0x6e, 0x6e, 0x61, 0x79, 0x65, 0x72, 0x3b, 0x59, 0x65, 0x62,
-0x72, 0x61, 0x79, 0x65, 0x72, 0x3b, 0x4d, 0x61, 0x72, 0x73, 0x3b, 0x49, 0x62, 0x72, 0x69, 0x72, 0x3b, 0x4d, 0x61, 0x79,
-0x79, 0x75, 0x3b, 0x59, 0x75, 0x6e, 0x79, 0x75, 0x3b, 0x59, 0x75, 0x6c, 0x79, 0x75, 0x7a, 0x3b, 0x194, 0x75, 0x63, 0x74,
-0x3b, 0x43, 0x75, 0x74, 0x61, 0x6e, 0x62, 0x69, 0x72, 0x3b, 0x4b, 0x1e6d, 0x75, 0x62, 0x65, 0x72, 0x3b, 0x4e, 0x77, 0x61,
-0x6e, 0x62, 0x69, 0x72, 0x3b, 0x44, 0x75, 0x6a, 0x61, 0x6e, 0x62, 0x69, 0x72, 0x59, 0x65, 0x6e, 0x3b, 0x59, 0x65, 0x62,
-0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x49, 0x62, 0x72, 0x3b, 0x4d, 0x61, 0x79, 0x3b, 0x59, 0x75, 0x6e, 0x3b, 0x59, 0x75, 0x6c,
-0x3b, 0x194, 0x75, 0x63, 0x3b, 0x43, 0x75, 0x74, 0x3b, 0x4b, 0x1e6d, 0x75, 0x3b, 0x4e, 0x77, 0x61, 0x3b, 0x44, 0x75, 0x6a,
-0x59, 0x3b, 0x59, 0x3b, 0x4d, 0x3b, 0x49, 0x3b, 0x4d, 0x3b, 0x59, 0x3b, 0x59, 0x3b, 0x194, 0x3b, 0x43, 0x3b, 0x4b, 0x3b,
-0x4e, 0x3b, 0x44, 0x6a9, 0x627, 0x646, 0x648, 0x648, 0x646, 0x6cc, 0x20, 0x62f, 0x648, 0x648, 0x6d5, 0x645, 0x3b, 0x634, 0x648, 0x628,
-0x627, 0x62a, 0x3b, 0x626, 0x627, 0x632, 0x627, 0x631, 0x3b, 0x646, 0x6cc, 0x633, 0x627, 0x646, 0x3b, 0x626, 0x627, 0x6cc, 0x627, 0x631,
-0x3b, 0x62d, 0x648, 0x632, 0x6d5, 0x6cc, 0x631, 0x627, 0x646, 0x3b, 0x62a, 0x6d5, 0x645, 0x648, 0x648, 0x632, 0x3b, 0x626, 0x627, 0x628,
-0x3b, 0x626, 0x6d5, 0x6cc, 0x644, 0x648, 0x648, 0x644, 0x3b, 0x62a, 0x634, 0x631, 0x6cc, 0x646, 0x6cc, 0x20, 0x6cc, 0x6d5, 0x6a9, 0x6d5,
-0x645, 0x3b, 0x62a, 0x634, 0x631, 0x6cc, 0x646, 0x6cc, 0x20, 0x62f, 0x648, 0x648, 0x6d5, 0x645, 0x3b, 0x6a9, 0x627, 0x646, 0x648, 0x646,
-0x6cc, 0x20, 0x6cc, 0x6d5, 0x6a9, 0x6d5, 0x645, 0x6a9, 0x3b, 0x634, 0x3b, 0x626, 0x3b, 0x646, 0x3b, 0x626, 0x3b, 0x62d, 0x3b, 0x62a,
-0x3b, 0x626, 0x3b, 0x626, 0x3b, 0x62a, 0x3b, 0x62a, 0x3b, 0x6a9, 0xd804, 0xdd0e, 0xd804, 0xdd1a, 0xd804, 0xdd2a, 0xd804, 0xdd20, 0xd804, 0xdd22,
-0xd804, 0xdd28, 0x3b, 0xd804, 0xdd1c, 0xd804, 0xdd2c, 0xd804, 0xdd1b, 0xd804, 0xdd34, 0xd804, 0xdd1d, 0xd804, 0xdd33, 0xd804, 0xdd22, 0xd804, 0xdd2a, 0xd804,
-0xdd20, 0xd804, 0xdd22, 0xd804, 0xdd28, 0x3b, 0xd804, 0xdd1f, 0xd804, 0xdd22, 0xd804, 0xdd34, 0xd804, 0xdd0c, 0xd804, 0xdd27, 0x3b, 0xd804, 0xdd03, 0xd804,
-0xdd2c, 0xd804, 0xdd1b, 0xd804, 0xdd33, 0xd804, 0xdd22, 0xd804, 0xdd28, 0xd804, 0xdd23, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd1f, 0xd804, 0xdd2c, 0x3b, 0xd804,
-0xdd0e, 0xd804, 0xdd2a, 0xd804, 0xdd1a, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd0e, 0xd804, 0xdd2a, 0xd804, 0xdd23, 0xd804, 0xdd2d, 0x3b, 0xd804, 0xdd03, 0xd804,
-0xdd09, 0xd804, 0xdd27, 0xd804, 0xdd0c, 0xd804, 0xdd34, 0xd804, 0xdd11, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd25, 0xd804, 0xdd2c, 0xd804, 0xdd1b, 0xd804, 0xdd34,
-0xd804, 0xdd11, 0xd804, 0xdd2c, 0xd804, 0xdd1f, 0xd804, 0xdd34, 0xd804, 0xdd1d, 0xd804, 0xdd27, 0xd804, 0xdd22, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd03, 0xd804,
-0xdd27, 0xd804, 0xdd07, 0xd804, 0xdd34, 0xd804, 0xdd11, 0xd804, 0xdd2e, 0xd804, 0xdd1d, 0xd804, 0xdd27, 0xd804, 0xdd22, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd1a,
-0xd804, 0xdd27, 0xd804, 0xdd1e, 0xd804, 0xdd2c, 0xd804, 0xdd1f, 0xd804, 0xdd34, 0xd804, 0xdd1d, 0xd804, 0xdd27, 0xd804, 0xdd22, 0xd804, 0xdd34, 0x3b, 0xd804,
-0xdd13, 0xd804, 0xdd28, 0xd804, 0xdd25, 0xd804, 0xdd2c, 0xd804, 0xdd1f, 0xd804, 0xdd34, 0xd804, 0xdd1d, 0xd804, 0xdd27, 0xd804, 0xdd22, 0xd804, 0xdd34, 0xd804,
-0xdd0e, 0xd804, 0xdd1a, 0xd804, 0xdd2a, 0xd804, 0xdd20, 0xd804, 0xdd22, 0xd804, 0xdd28, 0x3b, 0xd804, 0xdd1c, 0xd804, 0xdd2c, 0xd804, 0xdd1b, 0xd804, 0xdd34,
-0xd804, 0xdd1d, 0xd804, 0xdd33, 0xd804, 0xdd22, 0xd804, 0xdd2a, 0xd804, 0xdd20, 0xd804, 0xdd22, 0xd804, 0xdd28, 0x3b, 0xd804, 0xdd1f, 0xd804, 0xdd22, 0xd804,
-0xdd34, 0xd804, 0xdd0c, 0xd804, 0xdd27, 0x3b, 0xd804, 0xdd03, 0xd804, 0xdd2c, 0xd804, 0xdd1b, 0xd804, 0xdd33, 0xd804, 0xdd22, 0xd804, 0xdd28, 0xd804, 0xdd23,
-0xd804, 0xdd34, 0x3b, 0xd804, 0xdd1f, 0xd804, 0xdd2c, 0x3b, 0xd804, 0xdd0e, 0xd804, 0xdd2a, 0xd804, 0xdd1a, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd0e, 0xd804,
-0xdd2a, 0xd804, 0xdd23, 0xd804, 0xdd2d, 0x3b, 0xd804, 0xdd03, 0xd804, 0xdd09, 0xd804, 0xdd27, 0xd804, 0xdd0c, 0xd804, 0xdd34, 0xd804, 0xdd11, 0xd804, 0xdd34,
-0x3b, 0xd804, 0xdd25, 0xd804, 0xdd2c, 0xd804, 0xdd1b, 0xd804, 0xdd34, 0xd804, 0xdd11, 0xd804, 0xdd2c, 0xd804, 0xdd1f, 0xd804, 0xdd34, 0xd804, 0xdd1d, 0xd804,
-0xdd27, 0xd804, 0xdd22, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd03, 0xd804, 0xdd27, 0xd804, 0xdd07, 0xd804, 0xdd34, 0xd804, 0xdd11, 0xd804, 0xdd2c, 0xd804, 0xdd1d,
-0xd804, 0xdd27, 0xd804, 0xdd22, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd1a, 0xd804, 0xdd27, 0xd804, 0xdd1e, 0xd804, 0xdd2c, 0xd804, 0xdd1f, 0xd804, 0xdd34, 0xd804,
-0xdd1d, 0xd804, 0xdd27, 0xd804, 0xdd22, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd13, 0xd804, 0xdd28, 0xd804, 0xdd25, 0xd804, 0xdd2c, 0xd804, 0xdd1f, 0xd804, 0xdd34,
-0xd804, 0xdd1d, 0xd804, 0xdd27, 0xd804, 0xdd22, 0xd804, 0xdd34, 0xd804, 0xdd0e, 0xd804, 0xdd1a, 0xd804, 0xdd2a, 0x3b, 0xd804, 0xdd1c, 0xd804, 0xdd2c, 0xd804,
-0xdd1b, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd1f, 0xd804, 0xdd22, 0xd804, 0xdd34, 0xd804, 0xdd0c, 0xd804, 0xdd27, 0x3b, 0xd804, 0xdd03, 0xd804, 0xdd2c, 0xd804,
-0xdd1b, 0xd804, 0xdd33, 0xd804, 0xdd22, 0xd804, 0xdd28, 0xd804, 0xdd23, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd1f, 0xd804, 0xdd2c, 0x3b, 0xd804, 0xdd0e, 0xd804,
-0xdd2a, 0xd804, 0xdd1a, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd0e, 0xd804, 0xdd2a, 0xd804, 0xdd23, 0xd804, 0xdd2d, 0x3b, 0xd804, 0xdd03, 0xd804, 0xdd09, 0xd804,
-0xdd27, 0xd804, 0xdd0c, 0xd804, 0xdd34, 0xd804, 0xdd11, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd25, 0xd804, 0xdd2c, 0xd804, 0xdd1b, 0xd804, 0xdd34, 0xd804, 0xdd11,
-0xd804, 0xdd2c, 0xd804, 0xdd1f, 0xd804, 0xdd34, 0xd804, 0xdd1d, 0xd804, 0xdd27, 0xd804, 0xdd22, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd03, 0xd804, 0xdd27, 0xd804,
-0xdd07, 0xd804, 0xdd34, 0xd804, 0xdd11, 0xd804, 0xdd2e, 0xd804, 0xdd1d, 0xd804, 0xdd27, 0xd804, 0xdd22, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd1a, 0xd804, 0xdd27,
-0xd804, 0xdd1e, 0xd804, 0xdd2c, 0xd804, 0xdd1f, 0xd804, 0xdd34, 0xd804, 0xdd1d, 0xd804, 0xdd27, 0xd804, 0xdd22, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd13, 0xd804,
-0xdd28, 0xd804, 0xdd25, 0xd804, 0xdd2c, 0xd804, 0xdd1f, 0xd804, 0xdd34, 0xd804, 0xdd1d, 0xd804, 0xdd22, 0xd804, 0xdd34, 0xd804, 0xdd0e, 0x3b, 0xd804, 0xdd1c,
-0xd804, 0xdd2c, 0x3b, 0xd804, 0xdd1f, 0x3b, 0xd804, 0xdd03, 0xd804, 0xdd2c, 0x3b, 0xd804, 0xdd1f, 0xd804, 0xdd2c, 0x3b, 0xd804, 0xdd0e, 0xd804, 0xdd2a,
-0xd804, 0xdd1a, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd0e, 0xd804, 0xdd2a, 0x3b, 0xd804, 0xdd03, 0x3b, 0xd804, 0xdd25, 0xd804, 0xdd2c, 0x3b, 0xd804, 0xdd03,
-0xd804, 0xdd27, 0x3b, 0xd804, 0xdd1a, 0xd804, 0xdd27, 0x3b, 0xd804, 0xdd13, 0xd804, 0xdd28, 0x44f, 0x43d, 0x432, 0x430, 0x440, 0x44c, 0x3b, 0x444,
-0x435, 0x432, 0x440, 0x430, 0x43b, 0x44c, 0x3b, 0x43c, 0x430, 0x440, 0x442, 0x3b, 0x430, 0x43f, 0x440, 0x435, 0x43b, 0x44c, 0x3b, 0x43c,
-0x430, 0x439, 0x3b, 0x438, 0x44e, 0x43d, 0x44c, 0x3b, 0x438, 0x44e, 0x43b, 0x44c, 0x3b, 0x430, 0x432, 0x433, 0x443, 0x441, 0x442, 0x3b,
-0x441, 0x435, 0x43d, 0x442, 0x44f, 0x431, 0x440, 0x44c, 0x3b, 0x43e, 0x43a, 0x442, 0x44f, 0x431, 0x440, 0x44c, 0x3b, 0x43d, 0x43e, 0x44f,
-0x431, 0x440, 0x44c, 0x3b, 0x434, 0x435, 0x43a, 0x430, 0x431, 0x440, 0x44c, 0x44f, 0x43d, 0x432, 0x3b, 0x444, 0x435, 0x432, 0x3b, 0x43c,
-0x430, 0x440, 0x3b, 0x430, 0x43f, 0x440, 0x3b, 0x43c, 0x430, 0x439, 0x3b, 0x438, 0x44e, 0x43d, 0x3b, 0x438, 0x44e, 0x43b, 0x3b, 0x430,
-0x432, 0x433, 0x3b, 0x441, 0x435, 0x43d, 0x3b, 0x43e, 0x43a, 0x442, 0x3b, 0x43d, 0x43e, 0x44f, 0x3b, 0x434, 0x435, 0x43a, 0x42f, 0x3b,
-0x424, 0x3b, 0x41c, 0x3b, 0x410, 0x3b, 0x41c, 0x3b, 0x418, 0x3b, 0x418, 0x3b, 0x410, 0x3b, 0x421, 0x3b, 0x41e, 0x3b, 0x41d, 0x3b,
-0x414, 0x13a4, 0x13c3, 0x13b8, 0x13d4, 0x13c5, 0x3b, 0x13a7, 0x13a6, 0x13b5, 0x3b, 0x13a0, 0x13c5, 0x13f1, 0x3b, 0x13a7, 0x13ec, 0x13c2, 0x3b, 0x13a0,
-0x13c2, 0x13cd, 0x13ac, 0x13d8, 0x3b, 0x13d5, 0x13ad, 0x13b7, 0x13f1, 0x3b, 0x13ab, 0x13f0, 0x13c9, 0x13c2, 0x3b, 0x13a6, 0x13b6, 0x13c2, 0x3b, 0x13da,
-0x13b5, 0x13cd, 0x13d7, 0x3b, 0x13da, 0x13c2, 0x13c5, 0x13d7, 0x3b, 0x13c5, 0x13d3, 0x13d5, 0x13c6, 0x3b, 0x13a5, 0x13cd, 0x13a9, 0x13f1, 0x13a4, 0x13c3,
-0x3b, 0x13a7, 0x13a6, 0x3b, 0x13a0, 0x13c5, 0x3b, 0x13a7, 0x13ec, 0x3b, 0x13a0, 0x13c2, 0x3b, 0x13d5, 0x13ad, 0x3b, 0x13ab, 0x13f0, 0x3b, 0x13a6,
-0x13b6, 0x3b, 0x13da, 0x13b5, 0x3b, 0x13da, 0x13c2, 0x3b, 0x13c5, 0x13d3, 0x3b, 0x13a5, 0x13cd, 0x13a4, 0x3b, 0x13a7, 0x3b, 0x13a0, 0x3b, 0x13a7,
-0x3b, 0x13a0, 0x3b, 0x13d5, 0x3b, 0x13ab, 0x3b, 0x13a6, 0x3b, 0x13da, 0x3b, 0x13da, 0x3b, 0x13c5, 0x3b, 0x13a5, 0x4f, 0x6b, 0x77, 0x6f,
-0x6b, 0x75, 0x62, 0x61, 0x6e, 0x7a, 0x61, 0x3b, 0x4f, 0x6b, 0x77, 0x61, 0x6b, 0x61, 0x62, 0x69, 0x72, 0x69, 0x3b, 0x4f,
-0x6b, 0x77, 0x61, 0x6b, 0x61, 0x73, 0x68, 0x61, 0x74, 0x75, 0x3b, 0x4f, 0x6b, 0x77, 0x61, 0x6b, 0x61, 0x6e, 0x61, 0x3b,
-0x4f, 0x6b, 0x77, 0x61, 0x6b, 0x61, 0x74, 0x61, 0x61, 0x6e, 0x61, 0x3b, 0x4f, 0x6b, 0x77, 0x61, 0x6d, 0x75, 0x6b, 0x61,
-0x61, 0x67, 0x61, 0x3b, 0x4f, 0x6b, 0x77, 0x61, 0x6d, 0x75, 0x73, 0x68, 0x61, 0x6e, 0x6a, 0x75, 0x3b, 0x4f, 0x6b, 0x77,
-0x61, 0x6d, 0x75, 0x6e, 0x61, 0x61, 0x6e, 0x61, 0x3b, 0x4f, 0x6b, 0x77, 0x61, 0x6d, 0x77, 0x65, 0x6e, 0x64, 0x61, 0x3b,
-0x4f, 0x6b, 0x77, 0x61, 0x69, 0x6b, 0x75, 0x6d, 0x69, 0x3b, 0x4f, 0x6b, 0x77, 0x61, 0x69, 0x6b, 0x75, 0x6d, 0x69, 0x20,
-0x6e, 0x61, 0x20, 0x6b, 0x75, 0x6d, 0x77, 0x65, 0x3b, 0x4f, 0x6b, 0x77, 0x61, 0x69, 0x6b, 0x75, 0x6d, 0x69, 0x20, 0x6e,
-0x61, 0x20, 0x69, 0x62, 0x69, 0x72, 0x69, 0x4b, 0x42, 0x5a, 0x3b, 0x4b, 0x42, 0x52, 0x3b, 0x4b, 0x53, 0x54, 0x3b, 0x4b,
-0x4b, 0x4e, 0x3b, 0x4b, 0x54, 0x4e, 0x3b, 0x4b, 0x4d, 0x4b, 0x3b, 0x4b, 0x4d, 0x53, 0x3b, 0x4b, 0x4d, 0x4e, 0x3b, 0x4b,
-0x4d, 0x57, 0x3b, 0x4b, 0x4b, 0x4d, 0x3b, 0x4b, 0x4e, 0x4b, 0x3b, 0x4b, 0x4e, 0x42, 0x4a, 0x61, 0x6e, 0x6e, 0x65, 0x77,
-0x61, 0x3b, 0x46, 0xe4, 0x62, 0x72, 0x6f, 0x77, 0x61, 0x3b, 0x4d, 0xe4, 0xe4, 0x7a, 0x3b, 0x41, 0x70, 0x72, 0x65, 0x6c,
-0x6c, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x75, 0x6c, 0x69, 0x3b, 0x4f, 0x75,
-0x6a, 0x6f, 0xdf, 0x3b, 0x53, 0x65, 0x70, 0x74, 0xe4, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x68, 0x62,
-0x65, 0x72, 0x3b, 0x4e, 0x6f, 0x76, 0xe4, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x44, 0x65, 0x7a, 0xe4, 0x6d, 0x62, 0x65, 0x72,
-0x4a, 0x61, 0x6e, 0x2e, 0x3b, 0x46, 0xe4, 0x62, 0x2e, 0x3b, 0x4d, 0xe4, 0x7a, 0x2e, 0x3b, 0x41, 0x70, 0x72, 0x2e, 0x3b,
-0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x2e, 0x3b, 0x4a, 0x75, 0x6c, 0x2e, 0x3b, 0x4f, 0x75, 0x6a, 0x2e, 0x3b, 0x53,
-0xe4, 0x70, 0x2e, 0x3b, 0x4f, 0x6b, 0x74, 0x2e, 0x3b, 0x4e, 0x6f, 0x76, 0x2e, 0x3b, 0x44, 0x65, 0x7a, 0x2e, 0x4a, 0x61,
-0x6e, 0x3b, 0x46, 0xe4, 0x62, 0x3b, 0x4d, 0xe4, 0x7a, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75,
-0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x4f, 0x75, 0x6a, 0x3b, 0x53, 0xe4, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f,
-0x76, 0x3b, 0x44, 0x65, 0x7a, 0x4a, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0x4f,
-0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x6d, 0x69, 0x73, 0x20, 0x47, 0x65, 0x6e, 0x76, 0x65, 0x72, 0x3b, 0x6d,
-0x69, 0x73, 0x20, 0x48, 0x77, 0x65, 0x76, 0x72, 0x65, 0x72, 0x3b, 0x6d, 0x69, 0x73, 0x20, 0x4d, 0x65, 0x75, 0x72, 0x74,
-0x68, 0x3b, 0x6d, 0x69, 0x73, 0x20, 0x45, 0x62, 0x72, 0x65, 0x6c, 0x3b, 0x6d, 0x69, 0x73, 0x20, 0x4d, 0x65, 0x3b, 0x6d,
-0x69, 0x73, 0x20, 0x4d, 0x65, 0x74, 0x68, 0x65, 0x76, 0x65, 0x6e, 0x3b, 0x6d, 0x69, 0x73, 0x20, 0x47, 0x6f, 0x72, 0x74,
-0x68, 0x65, 0x72, 0x65, 0x6e, 0x3b, 0x6d, 0x69, 0x73, 0x20, 0x45, 0x73, 0x74, 0x3b, 0x6d, 0x69, 0x73, 0x20, 0x47, 0x77,
-0x79, 0x6e, 0x6e, 0x67, 0x61, 0x6c, 0x61, 0x3b, 0x6d, 0x69, 0x73, 0x20, 0x48, 0x65, 0x64, 0x72, 0x61, 0x3b, 0x6d, 0x69,
-0x73, 0x20, 0x44, 0x75, 0x3b, 0x6d, 0x69, 0x73, 0x20, 0x4b, 0x65, 0x76, 0x61, 0x72, 0x64, 0x68, 0x75, 0x47, 0x65, 0x6e,
-0x3b, 0x48, 0x77, 0x65, 0x3b, 0x4d, 0x65, 0x75, 0x3b, 0x45, 0x62, 0x72, 0x3b, 0x4d, 0x65, 0x3b, 0x4d, 0x65, 0x74, 0x3b,
-0x47, 0x6f, 0x72, 0x3b, 0x45, 0x73, 0x74, 0x3b, 0x47, 0x77, 0x6e, 0x3b, 0x48, 0x65, 0x64, 0x3b, 0x44, 0x75, 0x3b, 0x4b,
-0x65, 0x76, 0x73, 0x69, 0x6a, 0x65, 0x10d, 0x61, 0x6e, 0x6a, 0x3b, 0x76, 0x65, 0x6c, 0x6a, 0x61, 0x10d, 0x61, 0x3b, 0x6f,
-0x17e, 0x75, 0x6a, 0x61, 0x6b, 0x3b, 0x74, 0x72, 0x61, 0x76, 0x61, 0x6e, 0x6a, 0x3b, 0x73, 0x76, 0x69, 0x62, 0x61, 0x6e,
-0x6a, 0x3b, 0x6c, 0x69, 0x70, 0x61, 0x6e, 0x6a, 0x3b, 0x73, 0x72, 0x70, 0x61, 0x6e, 0x6a, 0x3b, 0x6b, 0x6f, 0x6c, 0x6f,
-0x76, 0x6f, 0x7a, 0x3b, 0x72, 0x75, 0x6a, 0x61, 0x6e, 0x3b, 0x6c, 0x69, 0x73, 0x74, 0x6f, 0x70, 0x61, 0x64, 0x3b, 0x73,
-0x74, 0x75, 0x64, 0x65, 0x6e, 0x69, 0x3b, 0x70, 0x72, 0x6f, 0x73, 0x69, 0x6e, 0x61, 0x63, 0x73, 0x69, 0x6a, 0x65, 0x10d,
-0x6e, 0x6a, 0x61, 0x3b, 0x76, 0x65, 0x6c, 0x6a, 0x61, 0x10d, 0x65, 0x3b, 0x6f, 0x17e, 0x75, 0x6a, 0x6b, 0x61, 0x3b, 0x74,
-0x72, 0x61, 0x76, 0x6e, 0x6a, 0x61, 0x3b, 0x73, 0x76, 0x69, 0x62, 0x6e, 0x6a, 0x61, 0x3b, 0x6c, 0x69, 0x70, 0x6e, 0x6a,
-0x61, 0x3b, 0x73, 0x72, 0x70, 0x6e, 0x6a, 0x61, 0x3b, 0x6b, 0x6f, 0x6c, 0x6f, 0x76, 0x6f, 0x7a, 0x61, 0x3b, 0x72, 0x75,
-0x6a, 0x6e, 0x61, 0x3b, 0x6c, 0x69, 0x73, 0x74, 0x6f, 0x70, 0x61, 0x64, 0x61, 0x3b, 0x73, 0x74, 0x75, 0x64, 0x65, 0x6e,
-0x6f, 0x67, 0x61, 0x3b, 0x70, 0x72, 0x6f, 0x73, 0x69, 0x6e, 0x63, 0x61, 0x73, 0x69, 0x6a, 0x3b, 0x76, 0x65, 0x6c, 0x6a,
-0x3b, 0x6f, 0x17e, 0x75, 0x3b, 0x74, 0x72, 0x61, 0x3b, 0x73, 0x76, 0x69, 0x3b, 0x6c, 0x69, 0x70, 0x3b, 0x73, 0x72, 0x70,
-0x3b, 0x6b, 0x6f, 0x6c, 0x3b, 0x72, 0x75, 0x6a, 0x3b, 0x6c, 0x69, 0x73, 0x3b, 0x73, 0x74, 0x75, 0x3b, 0x70, 0x72, 0x6f,
-0x31, 0x2e, 0x3b, 0x32, 0x2e, 0x3b, 0x33, 0x2e, 0x3b, 0x34, 0x2e, 0x3b, 0x35, 0x2e, 0x3b, 0x36, 0x2e, 0x3b, 0x37, 0x2e,
-0x3b, 0x38, 0x2e, 0x3b, 0x39, 0x2e, 0x3b, 0x31, 0x30, 0x2e, 0x3b, 0x31, 0x31, 0x2e, 0x3b, 0x31, 0x32, 0x2e, 0x6c, 0x65,
-0x64, 0x65, 0x6e, 0x3b, 0xfa, 0x6e, 0x6f, 0x72, 0x3b, 0x62, 0x159, 0x65, 0x7a, 0x65, 0x6e, 0x3b, 0x64, 0x75, 0x62, 0x65,
-0x6e, 0x3b, 0x6b, 0x76, 0x11b, 0x74, 0x65, 0x6e, 0x3b, 0x10d, 0x65, 0x72, 0x76, 0x65, 0x6e, 0x3b, 0x10d, 0x65, 0x72, 0x76,
-0x65, 0x6e, 0x65, 0x63, 0x3b, 0x73, 0x72, 0x70, 0x65, 0x6e, 0x3b, 0x7a, 0xe1, 0x159, 0xed, 0x3b, 0x159, 0xed, 0x6a, 0x65,
-0x6e, 0x3b, 0x6c, 0x69, 0x73, 0x74, 0x6f, 0x70, 0x61, 0x64, 0x3b, 0x70, 0x72, 0x6f, 0x73, 0x69, 0x6e, 0x65, 0x63, 0x6c,
-0x65, 0x64, 0x6e, 0x61, 0x3b, 0xfa, 0x6e, 0x6f, 0x72, 0x61, 0x3b, 0x62, 0x159, 0x65, 0x7a, 0x6e, 0x61, 0x3b, 0x64, 0x75,
-0x62, 0x6e, 0x61, 0x3b, 0x6b, 0x76, 0x11b, 0x74, 0x6e, 0x61, 0x3b, 0x10d, 0x65, 0x72, 0x76, 0x6e, 0x61, 0x3b, 0x10d, 0x65,
-0x72, 0x76, 0x65, 0x6e, 0x63, 0x65, 0x3b, 0x73, 0x72, 0x70, 0x6e, 0x61, 0x3b, 0x7a, 0xe1, 0x159, 0xed, 0x3b, 0x159, 0xed,
-0x6a, 0x6e, 0x61, 0x3b, 0x6c, 0x69, 0x73, 0x74, 0x6f, 0x70, 0x61, 0x64, 0x75, 0x3b, 0x70, 0x72, 0x6f, 0x73, 0x69, 0x6e,
-0x63, 0x65, 0x6c, 0x65, 0x64, 0x3b, 0xfa, 0x6e, 0x6f, 0x3b, 0x62, 0x159, 0x65, 0x3b, 0x64, 0x75, 0x62, 0x3b, 0x6b, 0x76,
-0x11b, 0x3b, 0x10d, 0x76, 0x6e, 0x3b, 0x10d, 0x76, 0x63, 0x3b, 0x73, 0x72, 0x70, 0x3b, 0x7a, 0xe1, 0x159, 0x3b, 0x159, 0xed,
-0x6a, 0x3b, 0x6c, 0x69, 0x73, 0x3b, 0x70, 0x72, 0x6f, 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x3b, 0x66, 0x65, 0x62, 0x72,
-0x75, 0x61, 0x72, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x61, 0x6a, 0x3b,
-0x6a, 0x75, 0x6e, 0x69, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x3b, 0x61, 0x75, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x70,
-0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d,
-0x62, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x6a, 0x61, 0x6e, 0x2e, 0x3b, 0x66, 0x65, 0x62,
-0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x2e, 0x3b, 0x61, 0x70, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x2e,
-0x3b, 0x6a, 0x75, 0x6c, 0x2e, 0x3b, 0x61, 0x75, 0x67, 0x2e, 0x3b, 0x73, 0x65, 0x70, 0x2e, 0x3b, 0x6f, 0x6b, 0x74, 0x2e,
-0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0x65, 0x63, 0x2e, 0x91c, 0x928, 0x935, 0x930, 0x940, 0x3b, 0x92b, 0x930, 0x935, 0x930,
-0x940, 0x3b, 0x92e, 0x93e, 0x930, 0x94d, 0x91a, 0x3b, 0x905, 0x92a, 0x94d, 0x930, 0x948, 0x932, 0x3b, 0x92e, 0x947, 0x908, 0x3b, 0x91c,
-0x942, 0x928, 0x3b, 0x91c, 0x941, 0x932, 0x93e, 0x908, 0x3b, 0x905, 0x917, 0x938, 0x94d, 0x924, 0x3b, 0x938, 0x93f, 0x924, 0x902, 0x92c,
-0x930, 0x3b, 0x905, 0x915, 0x94d, 0x924, 0x942, 0x92c, 0x930, 0x3b, 0x928, 0x935, 0x902, 0x92c, 0x930, 0x3b, 0x926, 0x93f, 0x938, 0x902,
-0x92c, 0x930, 0x91c, 0x928, 0x935, 0x930, 0x940, 0x3b, 0x92b, 0x930, 0x935, 0x930, 0x940, 0x3b, 0x92e, 0x93e, 0x930, 0x94d, 0x91a, 0x3b,
-0x905, 0x92a, 0x94d, 0x930, 0x948, 0x932, 0x3b, 0x92e, 0x947, 0x908, 0x3b, 0x91c, 0x942, 0x928, 0x3b, 0x91c, 0x941, 0x932, 0x93e, 0x908,
-0x3b, 0x905, 0x917, 0x938, 0x94d, 0x924, 0x3b, 0x938, 0x93f, 0x924, 0x902, 0x92c, 0x930, 0x3b, 0x905, 0x924, 0x94d, 0x924, 0x942, 0x92c,
-0x930, 0x3b, 0x928, 0x935, 0x902, 0x92c, 0x930, 0x3b, 0x926, 0x93f, 0x938, 0x902, 0x92c, 0x930, 0x91c, 0x928, 0x2e, 0x3b, 0x92b, 0x930,
-0x2e, 0x3b, 0x92e, 0x93e, 0x930, 0x94d, 0x91a, 0x3b, 0x905, 0x92a, 0x94d, 0x930, 0x948, 0x932, 0x3b, 0x92e, 0x947, 0x908, 0x3b, 0x91c,
-0x942, 0x928, 0x3b, 0x91c, 0x941, 0x932, 0x93e, 0x908, 0x3b, 0x905, 0x917, 0x2e, 0x3b, 0x938, 0x93f, 0x924, 0x2e, 0x3b, 0x905, 0x915,
-0x94d, 0x924, 0x942, 0x2e, 0x3b, 0x928, 0x935, 0x2e, 0x3b, 0x926, 0x93f, 0x938, 0x2e, 0x91c, 0x3b, 0x92b, 0x3b, 0x92e, 0x93e, 0x3b,
-0x905, 0x3b, 0x92e, 0x947, 0x3b, 0x91c, 0x942, 0x3b, 0x91c, 0x941, 0x3b, 0x905, 0x3b, 0x938, 0x93f, 0x3b, 0x905, 0x3b, 0x928, 0x3b,
-0x926, 0x93f, 0x64, 0x69, 0x6d, 0x254, 0x301, 0x64, 0x69, 0x3b, 0x14b, 0x67, 0x254, 0x6e, 0x64, 0x25b, 0x3b, 0x73, 0x254, 0x14b,
-0x25b, 0x3b, 0x64, 0x69, 0x253, 0xe1, 0x253, 0xe1, 0x3b, 0x65, 0x6d, 0x69, 0x61, 0x73, 0x65, 0x6c, 0x65, 0x3b, 0x65, 0x73,
-0x254, 0x70, 0x25b, 0x73, 0x254, 0x70, 0x25b, 0x3b, 0x6d, 0x61, 0x64, 0x69, 0x253, 0x25b, 0x301, 0x64, 0xed, 0x253, 0x25b, 0x301,
-0x3b, 0x64, 0x69, 0x14b, 0x67, 0x69, 0x6e, 0x64, 0x69, 0x3b, 0x6e, 0x79, 0x25b, 0x74, 0x25b, 0x6b, 0x69, 0x3b, 0x6d, 0x61,
-0x79, 0xe9, 0x73, 0x25b, 0x301, 0x3b, 0x74, 0x69, 0x6e, 0xed, 0x6e, 0xed, 0x3b, 0x65, 0x6c, 0xe1, 0x14b, 0x67, 0x25b, 0x301,
-0x64, 0x69, 0x3b, 0x14b, 0x67, 0x254, 0x6e, 0x3b, 0x73, 0x254, 0x14b, 0x3b, 0x64, 0x69, 0x253, 0x3b, 0x65, 0x6d, 0x69, 0x3b,
-0x65, 0x73, 0x254, 0x3b, 0x6d, 0x61, 0x64, 0x3b, 0x64, 0x69, 0x14b, 0x3b, 0x6e, 0x79, 0x25b, 0x74, 0x3b, 0x6d, 0x61, 0x79,
-0x3b, 0x74, 0x69, 0x6e, 0x3b, 0x65, 0x6c, 0xe1, 0x64, 0x3b, 0x14b, 0x3b, 0x73, 0x3b, 0x64, 0x3b, 0x65, 0x3b, 0x65, 0x3b,
-0x6d, 0x3b, 0x64, 0x3b, 0x6e, 0x3b, 0x6d, 0x3b, 0x74, 0x3b, 0x65, 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x66,
-0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x6d, 0x61, 0x61, 0x72, 0x74, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x6c, 0x3b,
-0x6d, 0x65, 0x69, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x3b, 0x61, 0x75, 0x67, 0x75, 0x73, 0x74,
-0x75, 0x73, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72,
-0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x6a, 0x61,
-0x6e, 0x2e, 0x3b, 0x66, 0x65, 0x62, 0x2e, 0x3b, 0x6d, 0x72, 0x74, 0x2e, 0x3b, 0x61, 0x70, 0x72, 0x2e, 0x3b, 0x6d, 0x65,
-0x69, 0x3b, 0x6a, 0x75, 0x6e, 0x2e, 0x3b, 0x6a, 0x75, 0x6c, 0x2e, 0x3b, 0x61, 0x75, 0x67, 0x2e, 0x3b, 0x73, 0x65, 0x70,
-0x2e, 0x3b, 0x6f, 0x6b, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0x65, 0x63, 0x2e, 0xf66, 0xfa4, 0xfb1, 0xf72,
-0xf0b, 0xf5f, 0xfb3, 0xf0b, 0xf51, 0xf44, 0xf54, 0xf0b, 0x3b, 0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf0b, 0xf42, 0xf49, 0xf72,
-0xf66, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf0b, 0xf42, 0xf66, 0xf74, 0xf58, 0xf0b, 0xf54, 0xf0b,
-0x3b, 0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf5e, 0xf72, 0xf0b, 0xf54, 0x3b, 0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b,
-0xf5f, 0xfb3, 0xf0b, 0xf63, 0xf94, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf0b, 0xf51, 0xfb2, 0xf74,
-0xf42, 0xf0b, 0xf54, 0x3b, 0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf51, 0xf74, 0xf53, 0xf0b, 0xf54, 0xf0b, 0x3b,
-0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf62, 0xf92, 0xfb1, 0xf51, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf66, 0xfa4, 0xfb1,
-0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf0b, 0xf51, 0xf42, 0xf74, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf0b,
-0xf56, 0xf45, 0xf74, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf45, 0xf74, 0xf0b, 0xf42,
-0xf45, 0xf72, 0xf42, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf45, 0xf74, 0xf0b, 0xf42,
-0xf49, 0xf72, 0xf66, 0xf0b, 0xf54, 0xf0b, 0xf5f, 0xfb3, 0xf0b, 0xf51, 0xf44, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf42, 0xf49, 0xf72,
-0xf66, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf42, 0xf66, 0xf74, 0xf58, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56,
-0xf5e, 0xf72, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf63, 0xf94, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf51, 0xfb2,
-0xf74, 0xf42, 0xf0b, 0xf54, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf51, 0xf74, 0xf53, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56,
-0xf62, 0xf92, 0xfb1, 0xf51, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf51, 0xf42, 0xf74, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3,
-0xf0b, 0xf56, 0xf45, 0xf74, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf45, 0xf74, 0xf0b, 0xf42, 0xf45, 0xf72, 0xf42, 0xf0b,
-0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf45, 0xf74, 0xf0b, 0xf42, 0xf49, 0xf72, 0xf66, 0xf0b, 0xf54, 0xf0b, 0xf5f, 0xfb3, 0xf0b,
-0xf21, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf22, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf23, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf24, 0x3b, 0xf5f, 0xfb3, 0xf0b,
-0xf25, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf26, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf27, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf28, 0x3b, 0xf5f, 0xfb3, 0xf0b,
-0xf29, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf21, 0xf20, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf21, 0xf21, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf21, 0xf22, 0xf21,
-0x3b, 0xf22, 0x3b, 0xf23, 0x3b, 0xf24, 0x3b, 0xf25, 0x3b, 0xf26, 0x3b, 0xf27, 0x3b, 0xf28, 0x3b, 0xf29, 0x3b, 0xf21, 0xf20, 0x3b,
-0xf21, 0xf21, 0x3b, 0x31, 0x32, 0xf21, 0x3b, 0xf22, 0x3b, 0xf23, 0x3b, 0xf24, 0x3b, 0xf25, 0x3b, 0xf26, 0x3b, 0xf27, 0x3b, 0xf28,
-0x3b, 0xf29, 0x3b, 0xf21, 0xf20, 0x3b, 0xf21, 0xf21, 0x3b, 0xf21, 0xf22, 0xf21, 0x3b, 0xf22, 0x3b, 0xf23, 0x3b, 0x34, 0x3b, 0xf25,
-0x3b, 0xf26, 0x3b, 0xf27, 0x3b, 0xf28, 0x3b, 0x39, 0x3b, 0xf21, 0xf20, 0x3b, 0xf21, 0xf21, 0x3b, 0xf21, 0xf22, 0x4d, 0x77, 0x65,
-0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6d, 0x62, 0x65, 0x72, 0x65, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61,
-0x20, 0x6b, 0x61, 0x129, 0x72, 0x69, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x74, 0x68,
-0x61, 0x74, 0x169, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x6e, 0x61, 0x3b, 0x4d, 0x77,
-0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x67, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20,
-0x77, 0x61, 0x20, 0x67, 0x61, 0x74, 0x61, 0x6e, 0x74, 0x61, 0x74, 0x169, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77,
-0x61, 0x20, 0x6d, 0x169, 0x67, 0x77, 0x61, 0x6e, 0x6a, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20,
-0x6b, 0x61, 0x6e, 0x61, 0x6e, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x65, 0x6e, 0x64,
-0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x69, 0x6b, 0x169, 0x6d, 0x69, 0x3b, 0x4d, 0x77, 0x65,
-0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x69, 0x6b, 0x169, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x169, 0x6d, 0x77, 0x65, 0x3b,
-0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x69, 0x6b, 0x169, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x4b, 0x61,
-0x129, 0x72, 0x129, 0x4d, 0x62, 0x65, 0x3b, 0x4b, 0x61, 0x69, 0x3b, 0x4b, 0x61, 0x74, 0x3b, 0x4b, 0x61, 0x6e, 0x3b, 0x47,
-0x61, 0x74, 0x3b, 0x47, 0x61, 0x6e, 0x3b, 0x4d, 0x75, 0x67, 0x3b, 0x4b, 0x6e, 0x6e, 0x3b, 0x4b, 0x65, 0x6e, 0x3b, 0x49,
-0x6b, 0x75, 0x3b, 0x49, 0x6d, 0x77, 0x3b, 0x49, 0x67, 0x69, 0x4d, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x47, 0x3b,
-0x47, 0x3b, 0x4d, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x49, 0x3b, 0x49, 0x3b, 0x49, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62,
-0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x61, 0x79, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c,
-0x3b, 0x41, 0x75, 0x67, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x3b, 0x4f, 0x63, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65,
-0x63, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x61, 0x79,
-0x3b, 0x4a, 0x75, 0x6e, 0x65, 0x3b, 0x4a, 0x75, 0x6c, 0x79, 0x3b, 0x41, 0x75, 0x67, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x3b,
-0x4f, 0x63, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x63, 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x6f, 0x3b, 0x66,
-0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x6f, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x6f, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x6c, 0x6f,
-0x3b, 0x6d, 0x61, 0x6a, 0x6f, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x6f, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x6f, 0x3b, 0x61, 0x16d,
-0x67, 0x75, 0x73, 0x74, 0x6f, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x6f, 0x3b, 0x6f, 0x6b, 0x74, 0x6f,
-0x62, 0x72, 0x6f, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x6f, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x72,
-0x6f, 0x6a, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x62, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x61, 0x70, 0x72, 0x3b, 0x6d, 0x61, 0x6a,
-0x3b, 0x6a, 0x75, 0x6e, 0x3b, 0x6a, 0x75, 0x6c, 0x3b, 0x61, 0x16d, 0x67, 0x3b, 0x73, 0x65, 0x70, 0x3b, 0x6f, 0x6b, 0x74,
-0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64, 0x65, 0x63, 0x6a, 0x61, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x3b, 0x76, 0x65, 0x65, 0x62,
-0x72, 0x75, 0x61, 0x72, 0x3b, 0x6d, 0xe4, 0x72, 0x74, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x6c, 0x6c, 0x3b, 0x6d, 0x61,
-0x69, 0x3b, 0x6a, 0x75, 0x75, 0x6e, 0x69, 0x3b, 0x6a, 0x75, 0x75, 0x6c, 0x69, 0x3b, 0x61, 0x75, 0x67, 0x75, 0x73, 0x74,
-0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x6f, 0x62, 0x65, 0x72, 0x3b,
-0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x74, 0x73, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x6a, 0x61,
-0x61, 0x6e, 0x3b, 0x76, 0x65, 0x65, 0x62, 0x72, 0x3b, 0x6d, 0xe4, 0x72, 0x74, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x3b, 0x6d,
-0x61, 0x69, 0x3b, 0x6a, 0x75, 0x75, 0x6e, 0x69, 0x3b, 0x6a, 0x75, 0x75, 0x6c, 0x69, 0x3b, 0x61, 0x75, 0x67, 0x3b, 0x73,
-0x65, 0x70, 0x74, 0x3b, 0x6f, 0x6b, 0x74, 0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64, 0x65, 0x74, 0x73, 0x4a, 0x3b, 0x56, 0x3b,
-0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x64,
-0x7a, 0x6f, 0x76, 0x65, 0x3b, 0x64, 0x7a, 0x6f, 0x64, 0x7a, 0x65, 0x3b, 0x74, 0x65, 0x64, 0x6f, 0x78, 0x65, 0x3b, 0x61,
-0x66, 0x254, 0x66, 0x129, 0x65, 0x3b, 0x64, 0x61, 0x6d, 0x61, 0x3b, 0x6d, 0x61, 0x73, 0x61, 0x3b, 0x73, 0x69, 0x61, 0x6d,
-0x6c, 0x254, 0x6d, 0x3b, 0x64, 0x65, 0x61, 0x73, 0x69, 0x61, 0x6d, 0x69, 0x6d, 0x65, 0x3b, 0x61, 0x6e, 0x79, 0x254, 0x6e,
-0x79, 0x254, 0x3b, 0x6b, 0x65, 0x6c, 0x65, 0x3b, 0x61, 0x64, 0x65, 0x25b, 0x6d, 0x65, 0x6b, 0x70, 0x254, 0x78, 0x65, 0x3b,
-0x64, 0x7a, 0x6f, 0x6d, 0x65, 0x64, 0x7a, 0x76, 0x3b, 0x64, 0x7a, 0x64, 0x3b, 0x74, 0x65, 0x64, 0x3b, 0x61, 0x66, 0x254,
-0x3b, 0x64, 0x61, 0x6d, 0x3b, 0x6d, 0x61, 0x73, 0x3b, 0x73, 0x69, 0x61, 0x3b, 0x64, 0x65, 0x61, 0x3b, 0x61, 0x6e, 0x79,
-0x3b, 0x6b, 0x65, 0x6c, 0x3b, 0x61, 0x64, 0x65, 0x3b, 0x64, 0x7a, 0x6d, 0x64, 0x3b, 0x64, 0x3b, 0x74, 0x3b, 0x61, 0x3b,
-0x64, 0x3b, 0x6d, 0x3b, 0x73, 0x3b, 0x64, 0x3b, 0x61, 0x3b, 0x6b, 0x3b, 0x61, 0x3b, 0x64, 0x6e, 0x67, 0x254, 0x6e, 0x20,
-0x6f, 0x73, 0xfa, 0x3b, 0x6e, 0x67, 0x254, 0x6e, 0x20, 0x62, 0x25b, 0x30c, 0x3b, 0x6e, 0x67, 0x254, 0x6e, 0x20, 0x6c, 0xe1,
-0x6c, 0x61, 0x3b, 0x6e, 0x67, 0x254, 0x6e, 0x20, 0x6e, 0x79, 0x69, 0x6e, 0x61, 0x3b, 0x6e, 0x67, 0x254, 0x6e, 0x20, 0x74,
-0xe1, 0x6e, 0x61, 0x3b, 0x6e, 0x67, 0x254, 0x6e, 0x20, 0x73, 0x61, 0x6d, 0x259, 0x6e, 0x61, 0x3b, 0x6e, 0x67, 0x254, 0x6e,
-0x20, 0x7a, 0x61, 0x6d, 0x67, 0x62, 0xe1, 0x6c, 0x61, 0x3b, 0x6e, 0x67, 0x254, 0x6e, 0x20, 0x6d, 0x77, 0x6f, 0x6d, 0x3b,
-0x6e, 0x67, 0x254, 0x6e, 0x20, 0x65, 0x62, 0x75, 0x6c, 0xfa, 0x3b, 0x6e, 0x67, 0x254, 0x6e, 0x20, 0x61, 0x77, 0xf3, 0x6d,
-0x3b, 0x6e, 0x67, 0x254, 0x6e, 0x20, 0x61, 0x77, 0xf3, 0x6d, 0x20, 0x61, 0x69, 0x20, 0x64, 0x7a, 0x69, 0xe1, 0x3b, 0x6e,
-0x67, 0x254, 0x6e, 0x20, 0x61, 0x77, 0xf3, 0x6d, 0x20, 0x61, 0x69, 0x20, 0x62, 0x25b, 0x30c, 0x6e, 0x67, 0x6f, 0x3b, 0x6e,
-0x67, 0x62, 0x3b, 0x6e, 0x67, 0x6c, 0x3b, 0x6e, 0x67, 0x6e, 0x3b, 0x6e, 0x67, 0x74, 0x3b, 0x6e, 0x67, 0x73, 0x3b, 0x6e,
-0x67, 0x7a, 0x3b, 0x6e, 0x67, 0x6d, 0x3b, 0x6e, 0x67, 0x65, 0x3b, 0x6e, 0x67, 0x61, 0x3b, 0x6e, 0x67, 0x61, 0x64, 0x3b,
-0x6e, 0x67, 0x61, 0x62, 0x6f, 0x3b, 0x62, 0x3b, 0x6c, 0x3b, 0x6e, 0x3b, 0x74, 0x3b, 0x73, 0x3b, 0x7a, 0x3b, 0x6d, 0x3b,
-0x65, 0x3b, 0x61, 0x3b, 0x64, 0x3b, 0x62, 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61,
-0x72, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x3b, 0x61, 0x70, 0x72, 0xed, 0x6c, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x6a, 0x75, 0x6e,
-0x69, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x3b, 0x61, 0x75, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d,
-0x62, 0x65, 0x72, 0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72,
-0x3b, 0x64, 0x65, 0x73, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x6a, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x62, 0x3b, 0x6d, 0x61, 0x72,
-0x3b, 0x61, 0x70, 0x72, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x6a, 0x75, 0x6e, 0x3b, 0x6a, 0x75, 0x6c, 0x3b, 0x61, 0x75, 0x67,
-0x3b, 0x73, 0x65, 0x70, 0x3b, 0x6f, 0x6b, 0x74, 0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64, 0x65, 0x73, 0x6a, 0x61, 0x6e, 0x2e,
-0x3b, 0x66, 0x65, 0x62, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x2e, 0x3b, 0x61, 0x70, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x69, 0x3b,
-0x6a, 0x75, 0x6e, 0x2e, 0x3b, 0x6a, 0x75, 0x6c, 0x2e, 0x3b, 0x61, 0x75, 0x67, 0x2e, 0x3b, 0x73, 0x65, 0x70, 0x2e, 0x3b,
-0x6f, 0x6b, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0x65, 0x73, 0x2e, 0x45, 0x3b, 0x50, 0x3b, 0x4d, 0x3b,
-0x41, 0x3b, 0x4d, 0x3b, 0x48, 0x75, 0x6e, 0x3b, 0x48, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x6f, 0x3b, 0x53, 0x65, 0x74, 0x3b,
-0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x62, 0x3b, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6d, 0x6d, 0x69, 0x6b, 0x75, 0x75, 0x3b,
-0x68, 0x65, 0x6c, 0x6d, 0x69, 0x6b, 0x75, 0x75, 0x3b, 0x6d, 0x61, 0x61, 0x6c, 0x69, 0x73, 0x6b, 0x75, 0x75, 0x3b, 0x68,
-0x75, 0x68, 0x74, 0x69, 0x6b, 0x75, 0x75, 0x3b, 0x74, 0x6f, 0x75, 0x6b, 0x6f, 0x6b, 0x75, 0x75, 0x3b, 0x6b, 0x65, 0x73,
-0xe4, 0x6b, 0x75, 0x75, 0x3b, 0x68, 0x65, 0x69, 0x6e, 0xe4, 0x6b, 0x75, 0x75, 0x3b, 0x65, 0x6c, 0x6f, 0x6b, 0x75, 0x75,
-0x3b, 0x73, 0x79, 0x79, 0x73, 0x6b, 0x75, 0x75, 0x3b, 0x6c, 0x6f, 0x6b, 0x61, 0x6b, 0x75, 0x75, 0x3b, 0x6d, 0x61, 0x72,
-0x72, 0x61, 0x73, 0x6b, 0x75, 0x75, 0x3b, 0x6a, 0x6f, 0x75, 0x6c, 0x75, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x6d, 0x6d, 0x69,
-0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x68, 0x65, 0x6c, 0x6d, 0x69, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x6d, 0x61, 0x61,
-0x6c, 0x69, 0x73, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x68, 0x75, 0x68, 0x74, 0x69, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b,
-0x74, 0x6f, 0x75, 0x6b, 0x6f, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x6b, 0x65, 0x73, 0xe4, 0x6b, 0x75, 0x75, 0x74, 0x61,
-0x3b, 0x68, 0x65, 0x69, 0x6e, 0xe4, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x65, 0x6c, 0x6f, 0x6b, 0x75, 0x75, 0x74, 0x61,
-0x3b, 0x73, 0x79, 0x79, 0x73, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x6c, 0x6f, 0x6b, 0x61, 0x6b, 0x75, 0x75, 0x74, 0x61,
-0x3b, 0x6d, 0x61, 0x72, 0x72, 0x61, 0x73, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x6a, 0x6f, 0x75, 0x6c, 0x75, 0x6b, 0x75,
-0x75, 0x74, 0x61, 0x74, 0x61, 0x6d, 0x6d, 0x69, 0x3b, 0x68, 0x65, 0x6c, 0x6d, 0x69, 0x3b, 0x6d, 0x61, 0x61, 0x6c, 0x69,
-0x73, 0x3b, 0x68, 0x75, 0x68, 0x74, 0x69, 0x3b, 0x74, 0x6f, 0x75, 0x6b, 0x6f, 0x3b, 0x6b, 0x65, 0x73, 0xe4, 0x3b, 0x68,
-0x65, 0x69, 0x6e, 0xe4, 0x3b, 0x65, 0x6c, 0x6f, 0x3b, 0x73, 0x79, 0x79, 0x73, 0x3b, 0x6c, 0x6f, 0x6b, 0x61, 0x3b, 0x6d,
-0x61, 0x72, 0x72, 0x61, 0x73, 0x3b, 0x6a, 0x6f, 0x75, 0x6c, 0x75, 0x74, 0x61, 0x6d, 0x6d, 0x69, 0x6b, 0x2e, 0x3b, 0x68,
-0x65, 0x6c, 0x6d, 0x69, 0x6b, 0x2e, 0x3b, 0x6d, 0x61, 0x61, 0x6c, 0x69, 0x73, 0x6b, 0x2e, 0x3b, 0x68, 0x75, 0x68, 0x74,
-0x69, 0x6b, 0x2e, 0x3b, 0x74, 0x6f, 0x75, 0x6b, 0x6f, 0x6b, 0x2e, 0x3b, 0x6b, 0x65, 0x73, 0xe4, 0x6b, 0x2e, 0x3b, 0x68,
-0x65, 0x69, 0x6e, 0xe4, 0x6b, 0x2e, 0x3b, 0x65, 0x6c, 0x6f, 0x6b, 0x2e, 0x3b, 0x73, 0x79, 0x79, 0x73, 0x6b, 0x2e, 0x3b,
-0x6c, 0x6f, 0x6b, 0x61, 0x6b, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x72, 0x61, 0x73, 0x6b, 0x2e, 0x3b, 0x6a, 0x6f, 0x75, 0x6c,
-0x75, 0x6b, 0x2e, 0x54, 0x3b, 0x48, 0x3b, 0x4d, 0x3b, 0x48, 0x3b, 0x54, 0x3b, 0x4b, 0x3b, 0x48, 0x3b, 0x45, 0x3b, 0x53,
-0x3b, 0x4c, 0x3b, 0x4d, 0x3b, 0x4a, 0x6a, 0x61, 0x6e, 0x76, 0x69, 0x65, 0x72, 0x3b, 0x66, 0xe9, 0x76, 0x72, 0x69, 0x65,
-0x72, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x3b, 0x61, 0x76, 0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x6a, 0x75, 0x69,
-0x6e, 0x3b, 0x6a, 0x75, 0x69, 0x6c, 0x6c, 0x65, 0x74, 0x3b, 0x61, 0x6f, 0xfb, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65,
-0x6d, 0x62, 0x72, 0x65, 0x3b, 0x6f, 0x63, 0x74, 0x6f, 0x62, 0x72, 0x65, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72,
-0x65, 0x3b, 0x64, 0xe9, 0x63, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x6a, 0x61, 0x6e, 0x76, 0x2e, 0x3b, 0x66, 0xe9, 0x76, 0x72,
-0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x3b, 0x61, 0x76, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x6a, 0x75, 0x69, 0x6e,
-0x3b, 0x6a, 0x75, 0x69, 0x6c, 0x2e, 0x3b, 0x61, 0x6f, 0xfb, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x2e, 0x3b, 0x6f, 0x63,
-0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0xe9, 0x63, 0x2e, 0x6a, 0x61, 0x6e, 0x76, 0x2e, 0x3b, 0x66, 0xe9,
-0x76, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x3b, 0x61, 0x76, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x6a, 0x75,
-0x69, 0x6e, 0x3b, 0x6a, 0x75, 0x69, 0x6c, 0x6c, 0x2e, 0x3b, 0x61, 0x6f, 0xfb, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x2e,
-0x3b, 0x6f, 0x63, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0xe9, 0x63, 0x2e, 0x6a, 0x61, 0x6e, 0x2e, 0x3b,
-0x66, 0xe9, 0x76, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x2e, 0x3b, 0x61, 0x76, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x6a,
-0x75, 0x69, 0x2e, 0x3b, 0x6a, 0x75, 0x69, 0x6c, 0x2e, 0x3b, 0x61, 0x6f, 0xfb, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x2e,
-0x3b, 0x6f, 0x63, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0xe9, 0x63, 0x2e, 0x5a, 0x65, 0x6e, 0xe2, 0x72,
-0x3b, 0x46, 0x65, 0x76, 0x72, 0xe2, 0x72, 0x3b, 0x4d, 0x61, 0x72, 0xe7, 0x3b, 0x41, 0x76, 0x72, 0xee, 0x6c, 0x3b, 0x4d,
-0x61, 0x69, 0x3b, 0x4a, 0x75, 0x67, 0x6e, 0x3b, 0x4c, 0x75, 0x69, 0x3b, 0x41, 0x76, 0x6f, 0x73, 0x74, 0x3b, 0x53, 0x65,
-0x74, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x3b, 0x4f, 0x74, 0x75, 0x62, 0x61, 0x72, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62,
-0x61, 0x72, 0x3b, 0x44, 0x69, 0x63, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x5a, 0x65, 0x6e, 0x3b, 0x46, 0x65, 0x76, 0x3b, 0x4d,
-0x61, 0x72, 0x3b, 0x41, 0x76, 0x72, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x67, 0x3b, 0x4c, 0x75, 0x69, 0x3b, 0x41,
-0x76, 0x6f, 0x3b, 0x53, 0x65, 0x74, 0x3b, 0x4f, 0x74, 0x75, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x69, 0x63, 0x5a, 0x3b,
-0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x4c, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b,
-0x44, 0x73, 0x69, 0x69, 0x6c, 0x6f, 0x3b, 0x63, 0x6f, 0x6c, 0x74, 0x65, 0x3b, 0x6d, 0x62, 0x6f, 0x6f, 0x79, 0x3b, 0x73,
-0x65, 0x65, 0x257, 0x74, 0x6f, 0x3b, 0x64, 0x75, 0x75, 0x6a, 0x61, 0x6c, 0x3b, 0x6b, 0x6f, 0x72, 0x73, 0x65, 0x3b, 0x6d,
-0x6f, 0x72, 0x73, 0x6f, 0x3b, 0x6a, 0x75, 0x6b, 0x6f, 0x3b, 0x73, 0x69, 0x69, 0x6c, 0x74, 0x6f, 0x3b, 0x79, 0x61, 0x72,
-0x6b, 0x6f, 0x6d, 0x61, 0x61, 0x3b, 0x6a, 0x6f, 0x6c, 0x61, 0x6c, 0x3b, 0x62, 0x6f, 0x77, 0x74, 0x65, 0x73, 0x69, 0x69,
-0x3b, 0x63, 0x6f, 0x6c, 0x3b, 0x6d, 0x62, 0x6f, 0x3b, 0x73, 0x65, 0x65, 0x3b, 0x64, 0x75, 0x75, 0x3b, 0x6b, 0x6f, 0x72,
-0x3b, 0x6d, 0x6f, 0x72, 0x3b, 0x6a, 0x75, 0x6b, 0x3b, 0x73, 0x6c, 0x74, 0x3b, 0x79, 0x61, 0x72, 0x3b, 0x6a, 0x6f, 0x6c,
-0x3b, 0x62, 0x6f, 0x77, 0x73, 0x3b, 0x63, 0x3b, 0x6d, 0x3b, 0x73, 0x3b, 0x64, 0x3b, 0x6b, 0x3b, 0x6d, 0x3b, 0x6a, 0x3b,
-0x73, 0x3b, 0x79, 0x3b, 0x6a, 0x3b, 0x62, 0xd83a, 0xdd05, 0xd83a, 0xdd2d, 0xd83a, 0xdd45, 0xd83a, 0xdd24, 0xd83a, 0xdd2e, 0x3b, 0xd83a, 0xdd15,
-0xd83a, 0xdd2e, 0xd83a, 0xdd24, 0xd83a, 0xdd3c, 0xd83a, 0xdd2e, 0x3b, 0xd83a, 0xdd10, 0xd83a, 0xdd26, 0xd83a, 0xdd2e, 0xd83a, 0xdd45, 0xd83a, 0xdd34, 0xd83a,
-0xdd2e, 0x3b, 0xd83a, 0xdd05, 0xd83a, 0xdd2b, 0xd83a, 0xdd45, 0xd83a, 0xdd3c, 0xd83a, 0xdd2e, 0x3b, 0xd83a, 0xdd01, 0xd83a, 0xdd35, 0xd83a, 0xdd45, 0xd83a,
-0xdd36, 0xd83a, 0xdd2e, 0x3b, 0xd83a, 0xdd11, 0xd83a, 0xdd2e, 0xd83a, 0xdd2a, 0xd83a, 0xdd27, 0xd83a, 0xdd2e, 0x3b, 0xd83a, 0xdd03, 0xd83a, 0xdd2e, 0xd83a,
-0xdd2a, 0xd83a, 0xdd27, 0xd83a, 0xdd2e, 0x3b, 0xd83a, 0xdd14, 0xd83a, 0xdd35, 0xd83a, 0xdd33, 0xd83a, 0xdd2e, 0x3b, 0xd83a, 0xdd05, 0xd83a, 0xdd2d, 0xd83a,
-0xdd24, 0xd83a, 0xdd3c, 0xd83a, 0xdd2e, 0x3b, 0xd83a, 0xdd12, 0xd83a, 0xdd22, 0xd83a, 0xdd2a, 0xd83a, 0xdd33, 0xd83a, 0xdd2e, 0x3b, 0xd83a, 0xdd14, 0xd83a,
-0xdd2e, 0xd83a, 0xdd24, 0xd83a, 0xdd2e, 0x3b, 0xd83a, 0xdd04, 0xd83a, 0xdd2e, 0xd83a, 0xdd31, 0xd83a, 0xdd3c, 0xd83a, 0xdd2e, 0xd83a, 0xdd05, 0xd83a, 0xdd2d,
-0xd83a, 0xdd45, 0xd83a, 0xdd24, 0x3b, 0xd83a, 0xdd15, 0xd83a, 0xdd2e, 0xd83a, 0xdd24, 0x3b, 0xd83a, 0xdd10, 0xd83a, 0xdd26, 0xd83a, 0xdd2e, 0xd83a, 0xdd45,
-0xd83a, 0xdd34, 0x3b, 0xd83a, 0xdd05, 0xd83a, 0xdd2b, 0xd83a, 0xdd45, 0xd83a, 0xdd3c, 0x3b, 0xd83a, 0xdd01, 0xd83a, 0xdd35, 0xd83a, 0xdd45, 0xd83a, 0xdd36,
-0x3b, 0xd83a, 0xdd11, 0xd83a, 0xdd2e, 0xd83a, 0xdd2a, 0x3b, 0xd83a, 0xdd03, 0xd83a, 0xdd2e, 0xd83a, 0xdd2a, 0x3b, 0xd83a, 0xdd14, 0xd83a, 0xdd35, 0xd83a,
-0xdd33, 0x3b, 0xd83a, 0xdd05, 0xd83a, 0xdd2d, 0xd83a, 0xdd24, 0x3b, 0xd83a, 0xdd12, 0xd83a, 0xdd22, 0xd83a, 0xdd2a, 0x3b, 0xd83a, 0xdd14, 0xd83a, 0xdd2e,
-0xd83a, 0xdd24, 0x3b, 0xd83a, 0xdd04, 0xd83a, 0xdd2e, 0xd83a, 0xdd31, 0xd83a, 0xdd05, 0x3b, 0xd83a, 0xdd15, 0x3b, 0xd83a, 0xdd04, 0x3b, 0xd83a, 0xdd05,
-0x3b, 0xd83a, 0xdd01, 0x3b, 0xd83a, 0xdd11, 0x3b, 0xd83a, 0xdd03, 0x3b, 0xd83a, 0xdd14, 0x3b, 0xd83a, 0xdd05, 0x3b, 0xd83a, 0xdd12, 0x3b, 0xd83a,
-0xdd14, 0x3b, 0xd83a, 0xdd04, 0x41, 0x6d, 0x20, 0x46, 0x61, 0x6f, 0x69, 0x6c, 0x6c, 0x65, 0x61, 0x63, 0x68, 0x3b, 0x41, 0x6e,
-0x20, 0x47, 0x65, 0x61, 0x72, 0x72, 0x61, 0x6e, 0x3b, 0x41, 0x6d, 0x20, 0x4d, 0xe0, 0x72, 0x74, 0x3b, 0x41, 0x6e, 0x20,
-0x47, 0x69, 0x62, 0x6c, 0x65, 0x61, 0x6e, 0x3b, 0x41, 0x6e, 0x20, 0x43, 0xe8, 0x69, 0x74, 0x65, 0x61, 0x6e, 0x3b, 0x41,
-0x6e, 0x20, 0x74, 0x2d, 0xd2, 0x67, 0x6d, 0x68, 0x69, 0x6f, 0x73, 0x3b, 0x41, 0x6e, 0x20, 0x74, 0x2d, 0x49, 0x75, 0x63,
-0x68, 0x61, 0x72, 0x3b, 0x41, 0x6e, 0x20, 0x4c, 0xf9, 0x6e, 0x61, 0x73, 0x74, 0x61, 0x6c, 0x3b, 0x41, 0x6e, 0x20, 0x74,
-0x2d, 0x53, 0x75, 0x6c, 0x74, 0x61, 0x69, 0x6e, 0x3b, 0x41, 0x6e, 0x20, 0x44, 0xe0, 0x6d, 0x68, 0x61, 0x69, 0x72, 0x3b,
-0x41, 0x6e, 0x20, 0x74, 0x2d, 0x53, 0x61, 0x6d, 0x68, 0x61, 0x69, 0x6e, 0x3b, 0x41, 0x6e, 0x20, 0x44, 0xf9, 0x62, 0x68,
-0x6c, 0x61, 0x63, 0x68, 0x64, 0x64, 0x68, 0x65, 0x6e, 0x20, 0x46, 0x68, 0x61, 0x6f, 0x69, 0x6c, 0x6c, 0x65, 0x61, 0x63,
-0x68, 0x3b, 0x64, 0x68, 0x65, 0x6e, 0x20, 0x47, 0x68, 0x65, 0x61, 0x72, 0x72, 0x61, 0x6e, 0x3b, 0x64, 0x68, 0x65, 0x6e,
-0x20, 0x4d, 0x68, 0xe0, 0x72, 0x74, 0x3b, 0x64, 0x68, 0x65, 0x6e, 0x20, 0x47, 0x68, 0x69, 0x62, 0x6c, 0x65, 0x61, 0x6e,
-0x3b, 0x64, 0x68, 0x65, 0x6e, 0x20, 0x43, 0x68, 0xe8, 0x69, 0x74, 0x65, 0x61, 0x6e, 0x3b, 0x64, 0x68, 0x65, 0x6e, 0x20,
-0xd2, 0x67, 0x6d, 0x68, 0x69, 0x6f, 0x73, 0x3b, 0x64, 0x68, 0x65, 0x6e, 0x20, 0x49, 0x75, 0x63, 0x68, 0x61, 0x72, 0x3b,
-0x64, 0x68, 0x65, 0x6e, 0x20, 0x4c, 0xf9, 0x6e, 0x61, 0x73, 0x74, 0x61, 0x6c, 0x3b, 0x64, 0x68, 0x65, 0x6e, 0x20, 0x74,
-0x2d, 0x53, 0x75, 0x6c, 0x74, 0x61, 0x69, 0x6e, 0x3b, 0x64, 0x68, 0x65, 0x6e, 0x20, 0x44, 0xe0, 0x6d, 0x68, 0x61, 0x69,
-0x72, 0x3b, 0x64, 0x68, 0x65, 0x6e, 0x20, 0x74, 0x2d, 0x53, 0x61, 0x6d, 0x68, 0x61, 0x69, 0x6e, 0x3b, 0x64, 0x68, 0x65,
-0x6e, 0x20, 0x44, 0xf9, 0x62, 0x68, 0x6c, 0x61, 0x63, 0x68, 0x64, 0x46, 0x61, 0x6f, 0x69, 0x3b, 0x47, 0x65, 0x61, 0x72,
-0x72, 0x3b, 0x4d, 0xe0, 0x72, 0x74, 0x3b, 0x47, 0x69, 0x62, 0x6c, 0x3b, 0x43, 0xe8, 0x69, 0x74, 0x3b, 0xd2, 0x67, 0x6d,
-0x68, 0x3b, 0x49, 0x75, 0x63, 0x68, 0x3b, 0x4c, 0xf9, 0x6e, 0x61, 0x3b, 0x53, 0x75, 0x6c, 0x74, 0x3b, 0x44, 0xe0, 0x6d,
-0x68, 0x3b, 0x53, 0x61, 0x6d, 0x68, 0x3b, 0x44, 0xf9, 0x62, 0x68, 0x46, 0x3b, 0x47, 0x3b, 0x4d, 0x3b, 0x47, 0x3b, 0x43,
-0x3b, 0xd2, 0x3b, 0x49, 0x3b, 0x4c, 0x3b, 0x53, 0x3b, 0x44, 0x3b, 0x53, 0x3b, 0x44, 0x58, 0x61, 0x6e, 0x65, 0x69, 0x72,
-0x6f, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x65, 0x69, 0x72, 0x6f, 0x3b, 0x4d, 0x61, 0x72, 0x7a, 0x6f, 0x3b, 0x41, 0x62, 0x72,
-0x69, 0x6c, 0x3b, 0x4d, 0x61, 0x69, 0x6f, 0x3b, 0x58, 0x75, 0xf1, 0x6f, 0x3b, 0x58, 0x75, 0x6c, 0x6c, 0x6f, 0x3b, 0x41,
-0x67, 0x6f, 0x73, 0x74, 0x6f, 0x3b, 0x53, 0x65, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x6f, 0x3b, 0x4f, 0x75, 0x74, 0x75, 0x62,
-0x72, 0x6f, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x6f, 0x3b, 0x44, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x72, 0x6f,
-0x78, 0x61, 0x6e, 0x65, 0x69, 0x72, 0x6f, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x65, 0x69, 0x72, 0x6f, 0x3b, 0x6d, 0x61, 0x72,
-0x7a, 0x6f, 0x3b, 0x61, 0x62, 0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x61, 0x69, 0x6f, 0x3b, 0x78, 0x75, 0xf1, 0x6f, 0x3b, 0x78,
-0x75, 0x6c, 0x6c, 0x6f, 0x3b, 0x61, 0x67, 0x6f, 0x73, 0x74, 0x6f, 0x3b, 0x73, 0x65, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x6f,
-0x3b, 0x6f, 0x75, 0x74, 0x75, 0x62, 0x72, 0x6f, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x6f, 0x3b, 0x64, 0x65,
-0x63, 0x65, 0x6d, 0x62, 0x72, 0x6f, 0x58, 0x61, 0x6e, 0x2e, 0x3b, 0x46, 0x65, 0x62, 0x2e, 0x3b, 0x4d, 0x61, 0x72, 0x2e,
-0x3b, 0x41, 0x62, 0x72, 0x2e, 0x3b, 0x4d, 0x61, 0x69, 0x6f, 0x3b, 0x58, 0x75, 0xf1, 0x6f, 0x3b, 0x58, 0x75, 0x6c, 0x2e,
-0x3b, 0x41, 0x67, 0x6f, 0x2e, 0x3b, 0x53, 0x65, 0x74, 0x2e, 0x3b, 0x4f, 0x75, 0x74, 0x2e, 0x3b, 0x4e, 0x6f, 0x76, 0x2e,
-0x3b, 0x44, 0x65, 0x63, 0x2e, 0x78, 0x61, 0x6e, 0x2e, 0x3b, 0x66, 0x65, 0x62, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x2e, 0x3b,
-0x61, 0x62, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x69, 0x6f, 0x3b, 0x78, 0x75, 0xf1, 0x6f, 0x3b, 0x78, 0x75, 0x6c, 0x2e, 0x3b,
-0x61, 0x67, 0x6f, 0x2e, 0x3b, 0x73, 0x65, 0x74, 0x2e, 0x3b, 0x6f, 0x75, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b,
-0x64, 0x65, 0x63, 0x2e, 0x58, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x58, 0x3b, 0x58, 0x3b, 0x41, 0x3b,
-0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x78, 0x2e, 0x3b, 0x66, 0x2e, 0x3b, 0x6d, 0x2e, 0x3b, 0x61, 0x2e, 0x3b, 0x6d,
-0x2e, 0x3b, 0x78, 0x2e, 0x3b, 0x78, 0x2e, 0x3b, 0x61, 0x2e, 0x3b, 0x73, 0x2e, 0x3b, 0x6f, 0x2e, 0x3b, 0x6e, 0x2e, 0x3b,
-0x64, 0x2e, 0x4a, 0x61, 0x6e, 0x77, 0x61, 0x6c, 0x69, 0x79, 0x6f, 0x3b, 0x46, 0x65, 0x62, 0x77, 0x61, 0x6c, 0x69, 0x79,
-0x6f, 0x3b, 0x4d, 0x61, 0x72, 0x69, 0x73, 0x69, 0x3b, 0x41, 0x70, 0x75, 0x6c, 0x69, 0x3b, 0x4d, 0x61, 0x61, 0x79, 0x69,
-0x3b, 0x4a, 0x75, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x61, 0x61, 0x79, 0x69, 0x3b, 0x41, 0x67, 0x75, 0x73, 0x69,
-0x74, 0x6f, 0x3b, 0x53, 0x65, 0x62, 0x75, 0x74, 0x74, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4f, 0x6b, 0x69, 0x74, 0x6f, 0x62,
-0x62, 0x61, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x44, 0x65, 0x73, 0x65, 0x6d, 0x62, 0x61, 0x4a, 0x61,
-0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x70, 0x75, 0x3b, 0x4d, 0x61, 0x61, 0x3b, 0x4a, 0x75,
-0x75, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x75, 0x3b, 0x53, 0x65, 0x62, 0x3b, 0x4f, 0x6b, 0x69, 0x3b, 0x4e, 0x6f,
-0x76, 0x3b, 0x44, 0x65, 0x73, 0x10d8, 0x10d0, 0x10dc, 0x10d5, 0x10d0, 0x10e0, 0x10d8, 0x3b, 0x10d7, 0x10d4, 0x10d1, 0x10d4, 0x10e0, 0x10d5, 0x10d0,
-0x10da, 0x10d8, 0x3b, 0x10db, 0x10d0, 0x10e0, 0x10e2, 0x10d8, 0x3b, 0x10d0, 0x10de, 0x10e0, 0x10d8, 0x10da, 0x10d8, 0x3b, 0x10db, 0x10d0, 0x10d8, 0x10e1,
-0x10d8, 0x3b, 0x10d8, 0x10d5, 0x10dc, 0x10d8, 0x10e1, 0x10d8, 0x3b, 0x10d8, 0x10d5, 0x10da, 0x10d8, 0x10e1, 0x10d8, 0x3b, 0x10d0, 0x10d2, 0x10d5, 0x10d8,
-0x10e1, 0x10e2, 0x10dd, 0x3b, 0x10e1, 0x10d4, 0x10e5, 0x10e2, 0x10d4, 0x10db, 0x10d1, 0x10d4, 0x10e0, 0x10d8, 0x3b, 0x10dd, 0x10e5, 0x10e2, 0x10dd, 0x10db,
-0x10d1, 0x10d4, 0x10e0, 0x10d8, 0x3b, 0x10dc, 0x10dd, 0x10d4, 0x10db, 0x10d1, 0x10d4, 0x10e0, 0x10d8, 0x3b, 0x10d3, 0x10d4, 0x10d9, 0x10d4, 0x10db, 0x10d1,
-0x10d4, 0x10e0, 0x10d8, 0x10d8, 0x10d0, 0x10dc, 0x3b, 0x10d7, 0x10d4, 0x10d1, 0x3b, 0x10db, 0x10d0, 0x10e0, 0x3b, 0x10d0, 0x10de, 0x10e0, 0x3b, 0x10db,
-0x10d0, 0x10d8, 0x3b, 0x10d8, 0x10d5, 0x10dc, 0x3b, 0x10d8, 0x10d5, 0x10da, 0x3b, 0x10d0, 0x10d2, 0x10d5, 0x3b, 0x10e1, 0x10d4, 0x10e5, 0x3b, 0x10dd,
-0x10e5, 0x10e2, 0x3b, 0x10dc, 0x10dd, 0x10d4, 0x3b, 0x10d3, 0x10d4, 0x10d9, 0x10d8, 0x3b, 0x10d7, 0x3b, 0x10db, 0x3b, 0x10d0, 0x3b, 0x10db, 0x3b,
-0x10d8, 0x3b, 0x10d8, 0x3b, 0x10d0, 0x3b, 0x10e1, 0x3b, 0x10dd, 0x3b, 0x10dc, 0x3b, 0x10d3, 0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x3b,
-0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b, 0x4d, 0xe4, 0x72, 0x7a, 0x3b, 0x41, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x4d,
-0x61, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x69, 0x3b, 0x41, 0x75, 0x67, 0x75, 0x73, 0x74, 0x3b,
-0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x4e, 0x6f,
-0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x44, 0x65, 0x7a, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x4a, 0x61, 0x6e, 0x3b, 0x46,
-0x65, 0x62, 0x3b, 0x4d, 0xe4, 0x72, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a,
-0x75, 0x6c, 0x3b, 0x41, 0x75, 0x67, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44,
-0x65, 0x7a, 0x4a, 0x61, 0x6e, 0x2e, 0x3b, 0x46, 0x65, 0x62, 0x2e, 0x3b, 0x4d, 0xe4, 0x72, 0x7a, 0x3b, 0x41, 0x70, 0x72,
-0x2e, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x69, 0x3b, 0x41, 0x75, 0x67, 0x2e,
-0x3b, 0x53, 0x65, 0x70, 0x74, 0x2e, 0x3b, 0x4f, 0x6b, 0x74, 0x2e, 0x3b, 0x4e, 0x6f, 0x76, 0x2e, 0x3b, 0x44, 0x65, 0x7a,
-0x2e, 0x4a, 0xe4, 0x6e, 0x6e, 0x65, 0x72, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b, 0x4d, 0xe4, 0x72, 0x7a,
-0x3b, 0x41, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x69,
-0x3b, 0x41, 0x75, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4f, 0x6b,
-0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x44, 0x65, 0x7a, 0x65, 0x6d,
-0x62, 0x65, 0x72, 0x4a, 0xe4, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0xe4, 0x72, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d,
-0x61, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x75, 0x67, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f,
-0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x7a, 0x4a, 0xe4, 0x6e, 0x2e, 0x3b, 0x46, 0x65, 0x62, 0x2e, 0x3b,
-0x4d, 0xe4, 0x72, 0x7a, 0x3b, 0x41, 0x70, 0x72, 0x2e, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a,
-0x75, 0x6c, 0x69, 0x3b, 0x41, 0x75, 0x67, 0x2e, 0x3b, 0x53, 0x65, 0x70, 0x2e, 0x3b, 0x4f, 0x6b, 0x74, 0x2e, 0x3b, 0x4e,
-0x6f, 0x76, 0x2e, 0x3b, 0x44, 0x65, 0x7a, 0x2e, 0x399, 0x3b1, 0x3bd, 0x3bf, 0x3c5, 0x3ac, 0x3c1, 0x3b9, 0x3bf, 0x3c2, 0x3b, 0x3a6,
-0x3b5, 0x3b2, 0x3c1, 0x3bf, 0x3c5, 0x3ac, 0x3c1, 0x3b9, 0x3bf, 0x3c2, 0x3b, 0x39c, 0x3ac, 0x3c1, 0x3c4, 0x3b9, 0x3bf, 0x3c2, 0x3b, 0x391,
-0x3c0, 0x3c1, 0x3af, 0x3bb, 0x3b9, 0x3bf, 0x3c2, 0x3b, 0x39c, 0x3ac, 0x3b9, 0x3bf, 0x3c2, 0x3b, 0x399, 0x3bf, 0x3cd, 0x3bd, 0x3b9, 0x3bf,
-0x3c2, 0x3b, 0x399, 0x3bf, 0x3cd, 0x3bb, 0x3b9, 0x3bf, 0x3c2, 0x3b, 0x391, 0x3cd, 0x3b3, 0x3bf, 0x3c5, 0x3c3, 0x3c4, 0x3bf, 0x3c2, 0x3b,
-0x3a3, 0x3b5, 0x3c0, 0x3c4, 0x3ad, 0x3bc, 0x3b2, 0x3c1, 0x3b9, 0x3bf, 0x3c2, 0x3b, 0x39f, 0x3ba, 0x3c4, 0x3ce, 0x3b2, 0x3c1, 0x3b9, 0x3bf,
-0x3c2, 0x3b, 0x39d, 0x3bf, 0x3ad, 0x3bc, 0x3b2, 0x3c1, 0x3b9, 0x3bf, 0x3c2, 0x3b, 0x394, 0x3b5, 0x3ba, 0x3ad, 0x3bc, 0x3b2, 0x3c1, 0x3b9,
-0x3bf, 0x3c2, 0x399, 0x3b1, 0x3bd, 0x3bf, 0x3c5, 0x3b1, 0x3c1, 0x3af, 0x3bf, 0x3c5, 0x3b, 0x3a6, 0x3b5, 0x3b2, 0x3c1, 0x3bf, 0x3c5, 0x3b1,
-0x3c1, 0x3af, 0x3bf, 0x3c5, 0x3b, 0x39c, 0x3b1, 0x3c1, 0x3c4, 0x3af, 0x3bf, 0x3c5, 0x3b, 0x391, 0x3c0, 0x3c1, 0x3b9, 0x3bb, 0x3af, 0x3bf,
-0x3c5, 0x3b, 0x39c, 0x3b1, 0x390, 0x3bf, 0x3c5, 0x3b, 0x399, 0x3bf, 0x3c5, 0x3bd, 0x3af, 0x3bf, 0x3c5, 0x3b, 0x399, 0x3bf, 0x3c5, 0x3bb,
-0x3af, 0x3bf, 0x3c5, 0x3b, 0x391, 0x3c5, 0x3b3, 0x3bf, 0x3cd, 0x3c3, 0x3c4, 0x3bf, 0x3c5, 0x3b, 0x3a3, 0x3b5, 0x3c0, 0x3c4, 0x3b5, 0x3bc,
-0x3b2, 0x3c1, 0x3af, 0x3bf, 0x3c5, 0x3b, 0x39f, 0x3ba, 0x3c4, 0x3c9, 0x3b2, 0x3c1, 0x3af, 0x3bf, 0x3c5, 0x3b, 0x39d, 0x3bf, 0x3b5, 0x3bc,
-0x3b2, 0x3c1, 0x3af, 0x3bf, 0x3c5, 0x3b, 0x394, 0x3b5, 0x3ba, 0x3b5, 0x3bc, 0x3b2, 0x3c1, 0x3af, 0x3bf, 0x3c5, 0x399, 0x3b1, 0x3bd, 0x3b,
-0x3a6, 0x3b5, 0x3b2, 0x3b, 0x39c, 0x3ac, 0x3c1, 0x3b, 0x391, 0x3c0, 0x3c1, 0x3b, 0x39c, 0x3ac, 0x3b9, 0x3b, 0x399, 0x3bf, 0x3cd, 0x3bd,
-0x3b, 0x399, 0x3bf, 0x3cd, 0x3bb, 0x3b, 0x391, 0x3cd, 0x3b3, 0x3b, 0x3a3, 0x3b5, 0x3c0, 0x3b, 0x39f, 0x3ba, 0x3c4, 0x3b, 0x39d, 0x3bf,
-0x3ad, 0x3b, 0x394, 0x3b5, 0x3ba, 0x399, 0x3b1, 0x3bd, 0x3b, 0x3a6, 0x3b5, 0x3b2, 0x3b, 0x39c, 0x3b1, 0x3c1, 0x3b, 0x391, 0x3c0, 0x3c1,
-0x3b, 0x39c, 0x3b1, 0x390, 0x3b, 0x399, 0x3bf, 0x3c5, 0x3bd, 0x3b, 0x399, 0x3bf, 0x3c5, 0x3bb, 0x3b, 0x391, 0x3c5, 0x3b3, 0x3b, 0x3a3,
-0x3b5, 0x3c0, 0x3b, 0x39f, 0x3ba, 0x3c4, 0x3b, 0x39d, 0x3bf, 0x3b5, 0x3b, 0x394, 0x3b5, 0x3ba, 0x399, 0x3b, 0x3a6, 0x3b, 0x39c, 0x3b,
-0x391, 0x3b, 0x39c, 0x3b, 0x399, 0x3b, 0x399, 0x3b, 0x391, 0x3b, 0x3a3, 0x3b, 0x39f, 0x3b, 0x39d, 0x3b, 0x394, 0xa9c, 0xabe, 0xaa8,
-0xacd, 0xaaf, 0xac1, 0xa86, 0xab0, 0xac0, 0x3b, 0xaab, 0xac7, 0xaac, 0xacd, 0xab0, 0xac1, 0xa86, 0xab0, 0xac0, 0x3b, 0xaae, 0xabe, 0xab0,
-0xacd, 0xa9a, 0x3b, 0xa8f, 0xaaa, 0xacd, 0xab0, 0xabf, 0xab2, 0x3b, 0xaae, 0xac7, 0x3b, 0xa9c, 0xac2, 0xaa8, 0x3b, 0xa9c, 0xac1, 0xab2,
-0xabe, 0xa88, 0x3b, 0xa91, 0xa97, 0xab8, 0xacd, 0xa9f, 0x3b, 0xab8, 0xaaa, 0xacd, 0xa9f, 0xac7, 0xaae, 0xacd, 0xaac, 0xab0, 0x3b, 0xa91,
-0xa95, 0xacd, 0xa9f, 0xacb, 0xaac, 0xab0, 0x3b, 0xaa8, 0xab5, 0xac7, 0xaae, 0xacd, 0xaac, 0xab0, 0x3b, 0xaa1, 0xabf, 0xab8, 0xac7, 0xaae,
-0xacd, 0xaac, 0xab0, 0xa9c, 0xabe, 0xaa8, 0xacd, 0xaaf, 0xac1, 0x3b, 0xaab, 0xac7, 0xaac, 0xacd, 0xab0, 0xac1, 0x3b, 0xaae, 0xabe, 0xab0,
-0xacd, 0xa9a, 0x3b, 0xa8f, 0xaaa, 0xacd, 0xab0, 0xabf, 0xab2, 0x3b, 0xaae, 0xac7, 0x3b, 0xa9c, 0xac2, 0xaa8, 0x3b, 0xa9c, 0xac1, 0xab2,
-0xabe, 0xa88, 0x3b, 0xa91, 0xa97, 0xab8, 0xacd, 0xa9f, 0x3b, 0xab8, 0xaaa, 0xacd, 0xa9f, 0xac7, 0x3b, 0xa91, 0xa95, 0xacd, 0xa9f, 0xacb,
-0x3b, 0xaa8, 0xab5, 0xac7, 0x3b, 0xaa1, 0xabf, 0xab8, 0xac7, 0xa9c, 0xabe, 0x3b, 0xaab, 0xac7, 0x3b, 0xaae, 0xabe, 0x3b, 0xa8f, 0x3b,
-0xaae, 0xac7, 0x3b, 0xa9c, 0xac2, 0x3b, 0xa9c, 0xac1, 0x3b, 0xa91, 0x3b, 0xab8, 0x3b, 0xa91, 0x3b, 0xaa8, 0x3b, 0xaa1, 0xabf, 0x43,
-0x68, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x46, 0x65, 0x62, 0x75, 0x72, 0x61, 0x72, 0x69, 0x3b, 0x4d, 0x61, 0x63,
-0x68, 0x69, 0x3b, 0x41, 0x70, 0x69, 0x72, 0x69, 0x72, 0x69, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b,
-0x43, 0x68, 0x75, 0x6c, 0x61, 0x69, 0x3b, 0x41, 0x67, 0x6f, 0x73, 0x74, 0x69, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d,
-0x62, 0x61, 0x3b, 0x4f, 0x6b, 0x69, 0x74, 0x6f, 0x62, 0x61, 0x3b, 0x4e, 0x6f, 0x62, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x44,
-0x69, 0x73, 0x65, 0x6d, 0x62, 0x61, 0x43, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x63, 0x3b, 0x41, 0x70,
-0x72, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x43, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x74, 0x3b, 0x53, 0x65,
-0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x62, 0x3b, 0x44, 0x69, 0x73, 0x43, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41,
-0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x43, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x4a, 0x61, 0x6e, 0x61,
-0x69, 0x72, 0x75, 0x3b, 0x46, 0x61, 0x62, 0x75, 0x72, 0x61, 0x69, 0x72, 0x75, 0x3b, 0x4d, 0x61, 0x72, 0x69, 0x73, 0x3b,
-0x41, 0x66, 0x69, 0x72, 0x69, 0x6c, 0x75, 0x3b, 0x4d, 0x61, 0x79, 0x75, 0x3b, 0x59, 0x75, 0x6e, 0x69, 0x3b, 0x59, 0x75,
-0x6c, 0x69, 0x3b, 0x41, 0x67, 0x75, 0x73, 0x74, 0x61, 0x3b, 0x53, 0x61, 0x74, 0x75, 0x6d, 0x62, 0x61, 0x3b, 0x4f, 0x6b,
-0x74, 0x6f, 0x62, 0x61, 0x3b, 0x4e, 0x75, 0x77, 0x61, 0x6d, 0x62, 0x61, 0x3b, 0x44, 0x69, 0x73, 0x61, 0x6d, 0x62, 0x61,
-0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x61, 0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x66, 0x69, 0x3b, 0x4d, 0x61, 0x79, 0x3b,
-0x59, 0x75, 0x6e, 0x3b, 0x59, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x75, 0x3b, 0x53, 0x61, 0x74, 0x3b, 0x4f, 0x6b, 0x74, 0x3b,
-0x4e, 0x75, 0x77, 0x3b, 0x44, 0x69, 0x73, 0x4a, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x59, 0x3b, 0x59,
-0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x49, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x69, 0x3b, 0x50, 0x65,
-0x70, 0x65, 0x6c, 0x75, 0x61, 0x6c, 0x69, 0x3b, 0x4d, 0x61, 0x6c, 0x61, 0x6b, 0x69, 0x3b, 0x2bb, 0x41, 0x70, 0x65, 0x6c,
-0x69, 0x6c, 0x61, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x49, 0x75, 0x6e, 0x65, 0x3b, 0x49, 0x75, 0x6c, 0x61, 0x69, 0x3b, 0x2bb,
-0x41, 0x75, 0x6b, 0x61, 0x6b, 0x65, 0x3b, 0x4b, 0x65, 0x70, 0x61, 0x6b, 0x65, 0x6d, 0x61, 0x70, 0x61, 0x3b, 0x2bb, 0x4f,
-0x6b, 0x61, 0x6b, 0x6f, 0x70, 0x61, 0x3b, 0x4e, 0x6f, 0x77, 0x65, 0x6d, 0x61, 0x70, 0x61, 0x3b, 0x4b, 0x65, 0x6b, 0x65,
-0x6d, 0x61, 0x70, 0x61, 0x49, 0x61, 0x6e, 0x2e, 0x3b, 0x50, 0x65, 0x70, 0x2e, 0x3b, 0x4d, 0x61, 0x6c, 0x2e, 0x3b, 0x2bb,
-0x41, 0x70, 0x2e, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x49, 0x75, 0x6e, 0x2e, 0x3b, 0x49, 0x75, 0x6c, 0x2e, 0x3b, 0x2bb, 0x41,
-0x75, 0x2e, 0x3b, 0x4b, 0x65, 0x70, 0x2e, 0x3b, 0x2bb, 0x4f, 0x6b, 0x2e, 0x3b, 0x4e, 0x6f, 0x77, 0x2e, 0x3b, 0x4b, 0x65,
-0x6b, 0x2e, 0x5d9, 0x5e0, 0x5d5, 0x5d0, 0x5e8, 0x3b, 0x5e4, 0x5d1, 0x5e8, 0x5d5, 0x5d0, 0x5e8, 0x3b, 0x5de, 0x5e8, 0x5e5, 0x3b, 0x5d0,
-0x5e4, 0x5e8, 0x5d9, 0x5dc, 0x3b, 0x5de, 0x5d0, 0x5d9, 0x3b, 0x5d9, 0x5d5, 0x5e0, 0x5d9, 0x3b, 0x5d9, 0x5d5, 0x5dc, 0x5d9, 0x3b, 0x5d0,
-0x5d5, 0x5d2, 0x5d5, 0x5e1, 0x5d8, 0x3b, 0x5e1, 0x5e4, 0x5d8, 0x5de, 0x5d1, 0x5e8, 0x3b, 0x5d0, 0x5d5, 0x5e7, 0x5d8, 0x5d5, 0x5d1, 0x5e8,
-0x3b, 0x5e0, 0x5d5, 0x5d1, 0x5de, 0x5d1, 0x5e8, 0x3b, 0x5d3, 0x5e6, 0x5de, 0x5d1, 0x5e8, 0x5d9, 0x5e0, 0x5d5, 0x5f3, 0x3b, 0x5e4, 0x5d1,
-0x5e8, 0x5f3, 0x3b, 0x5de, 0x5e8, 0x5e5, 0x3b, 0x5d0, 0x5e4, 0x5e8, 0x5f3, 0x3b, 0x5de, 0x5d0, 0x5d9, 0x3b, 0x5d9, 0x5d5, 0x5e0, 0x5d9,
-0x3b, 0x5d9, 0x5d5, 0x5dc, 0x5d9, 0x3b, 0x5d0, 0x5d5, 0x5d2, 0x5f3, 0x3b, 0x5e1, 0x5e4, 0x5d8, 0x5f3, 0x3b, 0x5d0, 0x5d5, 0x5e7, 0x5f3,
-0x3b, 0x5e0, 0x5d5, 0x5d1, 0x5f3, 0x3b, 0x5d3, 0x5e6, 0x5de, 0x5f3, 0x91c, 0x928, 0x935, 0x930, 0x940, 0x3b, 0x92b, 0x93c, 0x930, 0x935,
-0x930, 0x940, 0x3b, 0x92e, 0x93e, 0x930, 0x94d, 0x91a, 0x3b, 0x905, 0x92a, 0x94d, 0x930, 0x948, 0x932, 0x3b, 0x92e, 0x908, 0x3b, 0x91c,
-0x942, 0x928, 0x3b, 0x91c, 0x941, 0x932, 0x93e, 0x908, 0x3b, 0x905, 0x917, 0x938, 0x94d, 0x924, 0x3b, 0x938, 0x93f, 0x924, 0x902, 0x92c,
-0x930, 0x3b, 0x905, 0x915, 0x94d, 0x924, 0x942, 0x92c, 0x930, 0x3b, 0x928, 0x935, 0x902, 0x92c, 0x930, 0x3b, 0x926, 0x93f, 0x938, 0x902,
-0x92c, 0x930, 0x91c, 0x928, 0x970, 0x3b, 0x92b, 0x93c, 0x930, 0x970, 0x3b, 0x92e, 0x93e, 0x930, 0x94d, 0x91a, 0x3b, 0x905, 0x92a, 0x94d,
-0x930, 0x948, 0x932, 0x3b, 0x92e, 0x908, 0x3b, 0x91c, 0x942, 0x928, 0x3b, 0x91c, 0x941, 0x932, 0x970, 0x3b, 0x905, 0x917, 0x970, 0x3b,
-0x938, 0x93f, 0x924, 0x970, 0x3b, 0x905, 0x915, 0x94d, 0x924, 0x942, 0x970, 0x3b, 0x928, 0x935, 0x970, 0x3b, 0x926, 0x93f, 0x938, 0x970,
-0x91c, 0x3b, 0x92b, 0x93c, 0x3b, 0x92e, 0x93e, 0x3b, 0x905, 0x3b, 0x92e, 0x3b, 0x91c, 0x942, 0x3b, 0x91c, 0x941, 0x3b, 0x905, 0x3b,
-0x938, 0x93f, 0x3b, 0x905, 0x3b, 0x928, 0x3b, 0x926, 0x93f, 0x6a, 0x61, 0x6e, 0x75, 0xe1, 0x72, 0x3b, 0x66, 0x65, 0x62, 0x72,
-0x75, 0xe1, 0x72, 0x3b, 0x6d, 0xe1, 0x72, 0x63, 0x69, 0x75, 0x73, 0x3b, 0xe1, 0x70, 0x72, 0x69, 0x6c, 0x69, 0x73, 0x3b,
-0x6d, 0xe1, 0x6a, 0x75, 0x73, 0x3b, 0x6a, 0xfa, 0x6e, 0x69, 0x75, 0x73, 0x3b, 0x6a, 0xfa, 0x6c, 0x69, 0x75, 0x73, 0x3b,
-0x61, 0x75, 0x67, 0x75, 0x73, 0x7a, 0x74, 0x75, 0x73, 0x3b, 0x73, 0x7a, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72,
-0x3b, 0x6f, 0x6b, 0x74, 0xf3, 0x62, 0x65, 0x72, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x65,
-0x63, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x6a, 0x61, 0x6e, 0x2e, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x2e, 0x3b, 0x6d, 0xe1, 0x72,
-0x63, 0x2e, 0x3b, 0xe1, 0x70, 0x72, 0x2e, 0x3b, 0x6d, 0xe1, 0x6a, 0x2e, 0x3b, 0x6a, 0xfa, 0x6e, 0x2e, 0x3b, 0x6a, 0xfa,
-0x6c, 0x2e, 0x3b, 0x61, 0x75, 0x67, 0x2e, 0x3b, 0x73, 0x7a, 0x65, 0x70, 0x74, 0x2e, 0x3b, 0x6f, 0x6b, 0x74, 0x2e, 0x3b,
-0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0x65, 0x63, 0x2e, 0x4a, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0xc1, 0x3b, 0x4d, 0x3b, 0x4a,
-0x3b, 0x4a, 0x3b, 0x41, 0x3b, 0x53, 0x7a, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x6a, 0x61, 0x6e, 0xfa, 0x61, 0x72, 0x3b,
-0x66, 0x65, 0x62, 0x72, 0xfa, 0x61, 0x72, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x3b, 0x61, 0x70, 0x72, 0xed, 0x6c, 0x3b, 0x6d,
-0x61, 0xed, 0x3b, 0x6a, 0xfa, 0x6e, 0xed, 0x3b, 0x6a, 0xfa, 0x6c, 0xed, 0x3b, 0xe1, 0x67, 0xfa, 0x73, 0x74, 0x3b, 0x73,
-0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6f, 0x6b, 0x74, 0xf3, 0x62, 0x65, 0x72, 0x3b, 0x6e, 0xf3, 0x76,
-0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x73, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x6a, 0x61, 0x6e, 0x2e, 0x3b, 0x66,
-0x65, 0x62, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x2e, 0x3b, 0x61, 0x70, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0xed, 0x3b, 0x6a, 0xfa,
-0x6e, 0x2e, 0x3b, 0x6a, 0xfa, 0x6c, 0x2e, 0x3b, 0xe1, 0x67, 0xfa, 0x2e, 0x3b, 0x73, 0x65, 0x70, 0x2e, 0x3b, 0x6f, 0x6b,
-0x74, 0x2e, 0x3b, 0x6e, 0xf3, 0x76, 0x2e, 0x3b, 0x64, 0x65, 0x73, 0x2e, 0x4a, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b,
-0x4d, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0xc1, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x4a, 0x65, 0x6e, 0x1ee5, 0x77,
-0x61, 0x72, 0x1ecb, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x1ee5, 0x77, 0x61, 0x72, 0x1ecb, 0x3b, 0x4d, 0x61, 0x61, 0x63, 0x68, 0x1ecb,
-0x3b, 0x45, 0x70, 0x72, 0x65, 0x65, 0x6c, 0x3b, 0x4d, 0x65, 0x65, 0x3b, 0x4a, 0x75, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c,
-0x61, 0x1ecb, 0x3b, 0x1ecc, 0x67, 0x1ecd, 0x1ecd, 0x73, 0x74, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x1ecc,
-0x6b, 0x74, 0x6f, 0x62, 0x61, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x44, 0x69, 0x73, 0x65, 0x6d, 0x62,
-0x61, 0x4a, 0x65, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x61, 0x3b, 0x45, 0x70, 0x72, 0x3b, 0x4d, 0x65, 0x65,
-0x3b, 0x4a, 0x75, 0x75, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x1ecc, 0x67, 0x1ecd, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x1ecc, 0x6b, 0x74,
-0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x69, 0x73, 0x4a, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x45, 0x3b, 0x4d, 0x3b, 0x4a, 0x3b,
-0x4a, 0x3b, 0x1ecc, 0x3b, 0x53, 0x3b, 0x1ecc, 0x3b, 0x4e, 0x3b, 0x44, 0x75, 0x111, 0x111, 0xe2, 0x69, 0x76, 0x65, 0x6d, 0xe1,
-0xe1, 0x6e, 0x75, 0x3b, 0x6b, 0x75, 0x6f, 0x76, 0xe2, 0x6d, 0xe1, 0xe1, 0x6e, 0x75, 0x3b, 0x6e, 0x6a, 0x75, 0x68, 0x10d,
-0xe2, 0x6d, 0xe1, 0xe1, 0x6e, 0x75, 0x3b, 0x63, 0x75, 0xe1, 0x14b, 0x75, 0x69, 0x6d, 0xe1, 0xe1, 0x6e, 0x75, 0x3b, 0x76,
-0x79, 0x65, 0x73, 0x69, 0x6d, 0xe1, 0xe1, 0x6e, 0x75, 0x3b, 0x6b, 0x65, 0x73, 0x69, 0x6d, 0xe1, 0xe1, 0x6e, 0x75, 0x3b,
-0x73, 0x79, 0x65, 0x69, 0x6e, 0x69, 0x6d, 0xe1, 0xe1, 0x6e, 0x75, 0x3b, 0x70, 0x6f, 0x72, 0x67, 0x65, 0x6d, 0xe1, 0xe1,
-0x6e, 0x75, 0x3b, 0x10d, 0x6f, 0x68, 0x10d, 0xe2, 0x6d, 0xe1, 0xe1, 0x6e, 0x75, 0x3b, 0x72, 0x6f, 0x6f, 0x76, 0x76, 0xe2,
-0x64, 0x6d, 0xe1, 0xe1, 0x6e, 0x75, 0x3b, 0x73, 0x6b, 0x61, 0x6d, 0x6d, 0xe2, 0x6d, 0xe1, 0xe1, 0x6e, 0x75, 0x3b, 0x6a,
-0x75, 0x6f, 0x76, 0x6c, 0xe2, 0x6d, 0xe1, 0xe1, 0x6e, 0x75, 0x75, 0x111, 0x69, 0x76, 0x3b, 0x6b, 0x75, 0x6f, 0x76, 0xe2,
-0x3b, 0x6e, 0x6a, 0x75, 0x68, 0x10d, 0xe2, 0x3b, 0x63, 0x75, 0xe1, 0x14b, 0x75, 0x69, 0x3b, 0x76, 0x79, 0x65, 0x73, 0x69,
-0x3b, 0x6b, 0x65, 0x73, 0x69, 0x3b, 0x73, 0x79, 0x65, 0x69, 0x6e, 0x69, 0x3b, 0x70, 0x6f, 0x72, 0x67, 0x65, 0x3b, 0x10d,
-0x6f, 0x68, 0x10d, 0xe2, 0x3b, 0x72, 0x6f, 0x6f, 0x76, 0x76, 0xe2, 0x64, 0x3b, 0x73, 0x6b, 0x61, 0x6d, 0x6d, 0xe2, 0x3b,
-0x6a, 0x75, 0x6f, 0x76, 0x6c, 0xe2, 0x55, 0x3b, 0x4b, 0x3b, 0x4e, 0x4a, 0x3b, 0x43, 0x3b, 0x56, 0x3b, 0x4b, 0x3b, 0x53,
-0x3b, 0x50, 0x3b, 0x10c, 0x3b, 0x52, 0x3b, 0x53, 0x3b, 0x4a, 0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x46, 0x65,
-0x62, 0x72, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x4d, 0x61, 0x72, 0x65, 0x74, 0x3b, 0x41, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x4d,
-0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x69, 0x3b, 0x41, 0x67, 0x75, 0x73, 0x74, 0x75, 0x73,
-0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x4e,
-0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x44, 0x65, 0x73, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x4a, 0x61, 0x6e, 0x3b,
-0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b,
-0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x75, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b,
-0x44, 0x65, 0x73, 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x69, 0x6f, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x69,
-0x6f, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x69, 0x6f, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x61, 0x69, 0x6f, 0x3b,
-0x6a, 0x75, 0x6e, 0x69, 0x6f, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x6f, 0x3b, 0x61, 0x75, 0x67, 0x75, 0x73, 0x74, 0x6f, 0x3b,
-0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x6f, 0x63, 0x74, 0x6f, 0x62, 0x72, 0x65, 0x3b, 0x6e, 0x6f,
-0x76, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x6a, 0x61, 0x6e, 0x3b, 0x66,
-0x65, 0x62, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x61, 0x70, 0x72, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x6a, 0x75, 0x6e, 0x3b, 0x6a,
-0x75, 0x6c, 0x3b, 0x61, 0x75, 0x67, 0x3b, 0x73, 0x65, 0x70, 0x3b, 0x6f, 0x63, 0x74, 0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64,
-0x65, 0x63, 0x45, 0x61, 0x6e, 0xe1, 0x69, 0x72, 0x3b, 0x46, 0x65, 0x61, 0x62, 0x68, 0x72, 0x61, 0x3b, 0x4d, 0xe1, 0x72,
-0x74, 0x61, 0x3b, 0x41, 0x69, 0x62, 0x72, 0x65, 0xe1, 0x6e, 0x3b, 0x42, 0x65, 0x61, 0x6c, 0x74, 0x61, 0x69, 0x6e, 0x65,
-0x3b, 0x4d, 0x65, 0x69, 0x74, 0x68, 0x65, 0x61, 0x6d, 0x68, 0x3b, 0x49, 0xfa, 0x69, 0x6c, 0x3b, 0x4c, 0xfa, 0x6e, 0x61,
-0x73, 0x61, 0x3b, 0x4d, 0x65, 0xe1, 0x6e, 0x20, 0x46, 0xf3, 0x6d, 0x68, 0x61, 0x69, 0x72, 0x3b, 0x44, 0x65, 0x69, 0x72,
-0x65, 0x61, 0x64, 0x68, 0x20, 0x46, 0xf3, 0x6d, 0x68, 0x61, 0x69, 0x72, 0x3b, 0x53, 0x61, 0x6d, 0x68, 0x61, 0x69, 0x6e,
-0x3b, 0x4e, 0x6f, 0x6c, 0x6c, 0x61, 0x69, 0x67, 0x45, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x61, 0x62, 0x68, 0x3b, 0x4d, 0xe1,
-0x72, 0x74, 0x61, 0x3b, 0x41, 0x69, 0x62, 0x3b, 0x42, 0x65, 0x61, 0x6c, 0x3b, 0x4d, 0x65, 0x69, 0x74, 0x68, 0x3b, 0x49,
-0xfa, 0x69, 0x6c, 0x3b, 0x4c, 0xfa, 0x6e, 0x3b, 0x4d, 0x46, 0xf3, 0x6d, 0x68, 0x3b, 0x44, 0x46, 0xf3, 0x6d, 0x68, 0x3b,
-0x53, 0x61, 0x6d, 0x68, 0x3b, 0x4e, 0x6f, 0x6c, 0x6c, 0x45, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x42, 0x3b, 0x4d,
-0x3b, 0x49, 0x3b, 0x4c, 0x3b, 0x4d, 0x3b, 0x44, 0x3b, 0x53, 0x3b, 0x4e, 0x67, 0x65, 0x6e, 0x6e, 0x61, 0x69, 0x6f, 0x3b,
-0x66, 0x65, 0x62, 0x62, 0x72, 0x61, 0x69, 0x6f, 0x3b, 0x6d, 0x61, 0x72, 0x7a, 0x6f, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x6c,
-0x65, 0x3b, 0x6d, 0x61, 0x67, 0x67, 0x69, 0x6f, 0x3b, 0x67, 0x69, 0x75, 0x67, 0x6e, 0x6f, 0x3b, 0x6c, 0x75, 0x67, 0x6c,
-0x69, 0x6f, 0x3b, 0x61, 0x67, 0x6f, 0x73, 0x74, 0x6f, 0x3b, 0x73, 0x65, 0x74, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b,
-0x6f, 0x74, 0x74, 0x6f, 0x62, 0x72, 0x65, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x64, 0x69, 0x63,
-0x65, 0x6d, 0x62, 0x72, 0x65, 0x67, 0x65, 0x6e, 0x3b, 0x66, 0x65, 0x62, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x61, 0x70, 0x72,
-0x3b, 0x6d, 0x61, 0x67, 0x3b, 0x67, 0x69, 0x75, 0x3b, 0x6c, 0x75, 0x67, 0x3b, 0x61, 0x67, 0x6f, 0x3b, 0x73, 0x65, 0x74,
-0x3b, 0x6f, 0x74, 0x74, 0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64, 0x69, 0x63, 0x47, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b,
-0x4d, 0x3b, 0x47, 0x3b, 0x4c, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x4a, 0x61, 0x6e, 0x3b, 0x46,
-0x65, 0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a,
-0x75, 0x6c, 0x3b, 0x41, 0x67, 0x74, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44,
-0x65, 0x73, 0x53, 0x61, 0x6e, 0x76, 0x69, 0x65, 0x3b, 0x46, 0xe9, 0x62, 0x69, 0x72, 0x69, 0x65, 0x3b, 0x4d, 0x61, 0x72,
-0x73, 0x3b, 0x41, 0x62, 0x75, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x65, 0x65, 0x3b, 0x53, 0x75, 0x65, 0x14b, 0x3b, 0x53, 0xfa,
-0x75, 0x79, 0x65, 0x65, 0x3b, 0x55, 0x74, 0x3b, 0x53, 0x65, 0x74, 0x74, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x3b, 0x4f, 0x6b,
-0x74, 0x6f, 0x62, 0x61, 0x72, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x3b, 0x44, 0x69, 0x73, 0x61, 0x6d,
-0x62, 0x61, 0x72, 0x53, 0x61, 0x3b, 0x46, 0x65, 0x3b, 0x4d, 0x61, 0x3b, 0x41, 0x62, 0x3b, 0x4d, 0x65, 0x3b, 0x53, 0x75,
-0x3b, 0x53, 0xfa, 0x3b, 0x55, 0x74, 0x3b, 0x53, 0x65, 0x3b, 0x4f, 0x6b, 0x3b, 0x4e, 0x6f, 0x3b, 0x44, 0x65, 0x53, 0x3b,
-0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x55, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b,
-0x44, 0x4a, 0x61, 0x6e, 0x65, 0x72, 0x75, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x65, 0x72, 0x75, 0x3b, 0x4d, 0x61, 0x72, 0x73,
-0x75, 0x3b, 0x41, 0x62, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x61, 0x69, 0x75, 0x3b, 0x4a, 0x75, 0x6e, 0x68, 0x75, 0x3b, 0x4a,
-0x75, 0x6c, 0x68, 0x75, 0x3b, 0x41, 0x67, 0x6f, 0x73, 0x74, 0x75, 0x3b, 0x53, 0x65, 0x74, 0x65, 0x6e, 0x62, 0x72, 0x75,
-0x3b, 0x4f, 0x74, 0x75, 0x62, 0x72, 0x75, 0x3b, 0x4e, 0x75, 0x76, 0x65, 0x6e, 0x62, 0x72, 0x75, 0x3b, 0x44, 0x69, 0x7a,
-0x65, 0x6e, 0x62, 0x72, 0x75, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x62, 0x72,
-0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x6f, 0x3b, 0x53, 0x65, 0x74,
-0x3b, 0x4f, 0x74, 0x75, 0x3b, 0x4e, 0x75, 0x76, 0x3b, 0x44, 0x69, 0x7a, 0x59, 0x65, 0x6e, 0x6e, 0x61, 0x79, 0x65, 0x72,
-0x3b, 0x46, 0x75, 0x1e5b, 0x61, 0x72, 0x3b, 0x4d, 0x65, 0x263, 0x72, 0x65, 0x73, 0x3b, 0x59, 0x65, 0x62, 0x72, 0x69, 0x72,
-0x3b, 0x4d, 0x61, 0x79, 0x79, 0x75, 0x3b, 0x59, 0x75, 0x6e, 0x79, 0x75, 0x3b, 0x59, 0x75, 0x6c, 0x79, 0x75, 0x3b, 0x194,
-0x75, 0x63, 0x74, 0x3b, 0x43, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x54, 0x75, 0x62, 0x65, 0x72, 0x3b, 0x4e, 0x75,
-0x6e, 0x65, 0x6d, 0x62, 0x65, 0x1e5b, 0x3b, 0x44, 0x75, 0x1e7, 0x65, 0x6d, 0x62, 0x65, 0x1e5b, 0x59, 0x65, 0x6e, 0x6e, 0x61,
-0x79, 0x65, 0x72, 0x3b, 0x46, 0x75, 0x1e5b, 0x61, 0x72, 0x3b, 0x4d, 0x65, 0x263, 0x72, 0x65, 0x73, 0x3b, 0x59, 0x65, 0x62,
-0x72, 0x69, 0x72, 0x3b, 0x4d, 0x61, 0x79, 0x79, 0x75, 0x3b, 0x59, 0x75, 0x6e, 0x79, 0x75, 0x3b, 0x59, 0x75, 0x6c, 0x79,
-0x75, 0x3b, 0x194, 0x75, 0x63, 0x74, 0x3b, 0x43, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x1e5b, 0x3b, 0x54, 0x75, 0x62, 0x65, 0x1e5b,
-0x3b, 0x4e, 0x75, 0x6e, 0x65, 0x6d, 0x62, 0x65, 0x1e5b, 0x3b, 0x44, 0x75, 0x1e7, 0x65, 0x6d, 0x62, 0x65, 0x1e5b, 0x59, 0x65,
-0x6e, 0x3b, 0x46, 0x75, 0x72, 0x3b, 0x4d, 0x65, 0x263, 0x3b, 0x59, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x79, 0x3b, 0x59, 0x75,
-0x6e, 0x3b, 0x59, 0x75, 0x6c, 0x3b, 0x194, 0x75, 0x63, 0x3b, 0x43, 0x74, 0x65, 0x3b, 0x54, 0x75, 0x62, 0x3b, 0x4e, 0x75,
-0x6e, 0x3b, 0x44, 0x75, 0x1e7, 0x59, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x59, 0x3b, 0x4d, 0x3b, 0x59, 0x3b, 0x59, 0x3b, 0x194,
-0x3b, 0x43, 0x3b, 0x54, 0x3b, 0x4e, 0x3b, 0x44, 0x70, 0x61, 0x6d, 0x62, 0x61, 0x3b, 0x77, 0x61, 0x6e, 0x6a, 0x61, 0x3b,
-0x6d, 0x62, 0x69, 0x79, 0x254, 0x20, 0x6d, 0x25b, 0x6e, 0x64, 0x6f, 0x14b, 0x67, 0x254, 0x3b, 0x4e, 0x79, 0x254, 0x6c, 0x254,
-0x6d, 0x62, 0x254, 0x14b, 0x67, 0x254, 0x3b, 0x4d, 0x254, 0x6e, 0x254, 0x20, 0x14b, 0x67, 0x62, 0x61, 0x6e, 0x6a, 0x61, 0x3b,
-0x4e, 0x79, 0x61, 0x14b, 0x67, 0x77, 0x25b, 0x20, 0x14b, 0x67, 0x62, 0x61, 0x6e, 0x6a, 0x61, 0x3b, 0x6b, 0x75, 0x14b, 0x67,
-0x77, 0x25b, 0x3b, 0x66, 0x25b, 0x3b, 0x6e, 0x6a, 0x61, 0x70, 0x69, 0x3b, 0x6e, 0x79, 0x75, 0x6b, 0x75, 0x6c, 0x3b, 0x4d,
-0x31, 0x31, 0x3b, 0x253, 0x75, 0x6c, 0x253, 0x75, 0x73, 0x25b, 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x61, 0x72, 0x69, 0x3b, 0x66,
-0x65, 0x62, 0x72, 0x75, 0x61, 0x61, 0x72, 0x69, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x69, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x69,
-0x6c, 0x69, 0x3b, 0x6d, 0x61, 0x61, 0x6a, 0x69, 0x3b, 0x6a, 0x75, 0x75, 0x6e, 0x69, 0x3b, 0x6a, 0x75, 0x75, 0x6c, 0x69,
-0x3b, 0x61, 0x67, 0x67, 0x75, 0x73, 0x74, 0x69, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x69, 0x3b,
-0x6f, 0x6b, 0x74, 0x6f, 0x62, 0x61, 0x72, 0x69, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x69, 0x3b, 0x64,
-0x65, 0x63, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x69, 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x61, 0x72, 0x69, 0x70, 0x3b, 0x66, 0x65,
-0x62, 0x72, 0x75, 0x61, 0x61, 0x72, 0x69, 0x70, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x69, 0x70, 0x3b, 0x61, 0x70, 0x72, 0x69,
-0x69, 0x6c, 0x69, 0x70, 0x3b, 0x6d, 0x61, 0x61, 0x6a, 0x69, 0x70, 0x3b, 0x6a, 0x75, 0x75, 0x6e, 0x69, 0x70, 0x3b, 0x6a,
-0x75, 0x75, 0x6c, 0x69, 0x70, 0x3b, 0x61, 0x67, 0x67, 0x75, 0x73, 0x74, 0x69, 0x70, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65,
-0x6d, 0x62, 0x61, 0x72, 0x69, 0x70, 0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x62, 0x61, 0x72, 0x69, 0x70, 0x3b, 0x6e, 0x6f, 0x76,
-0x65, 0x6d, 0x62, 0x61, 0x72, 0x69, 0x70, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x69, 0x70, 0x6a, 0x61,
-0x6e, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x61, 0x70, 0x72, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x6a,
-0x75, 0x6e, 0x3b, 0x6a, 0x75, 0x6c, 0x3b, 0x61, 0x75, 0x67, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x3b, 0x6f, 0x6b, 0x74, 0x3b,
-0x6e, 0x6f, 0x76, 0x3b, 0x64, 0x65, 0x63, 0x4d, 0x75, 0x6c, 0x67, 0x75, 0x6c, 0x3b, 0x4e, 0x67, 0x2019, 0x61, 0x74, 0x79,
-0x61, 0x61, 0x74, 0x6f, 0x3b, 0x4b, 0x69, 0x70, 0x74, 0x61, 0x61, 0x6d, 0x6f, 0x3b, 0x49, 0x77, 0x6f, 0x6f, 0x74, 0x6b,
-0x75, 0x75, 0x74, 0x3b, 0x4d, 0x61, 0x6d, 0x75, 0x75, 0x74, 0x3b, 0x50, 0x61, 0x61, 0x67, 0x69, 0x3b, 0x4e, 0x67, 0x2019,
-0x65, 0x69, 0x79, 0x65, 0x65, 0x74, 0x3b, 0x52, 0x6f, 0x6f, 0x70, 0x74, 0x75, 0x69, 0x3b, 0x42, 0x75, 0x72, 0x65, 0x65,
-0x74, 0x3b, 0x45, 0x70, 0x65, 0x65, 0x73, 0x6f, 0x3b, 0x4b, 0x69, 0x70, 0x73, 0x75, 0x75, 0x6e, 0x64, 0x65, 0x20, 0x6e,
-0x65, 0x20, 0x74, 0x61, 0x61, 0x69, 0x3b, 0x4b, 0x69, 0x70, 0x73, 0x75, 0x75, 0x6e, 0x64, 0x65, 0x20, 0x6e, 0x65, 0x62,
-0x6f, 0x20, 0x61, 0x65, 0x6e, 0x67, 0x2019, 0x4d, 0x75, 0x6c, 0x3b, 0x4e, 0x67, 0x61, 0x74, 0x3b, 0x54, 0x61, 0x61, 0x3b,
-0x49, 0x77, 0x6f, 0x3b, 0x4d, 0x61, 0x6d, 0x3b, 0x50, 0x61, 0x61, 0x3b, 0x4e, 0x67, 0x65, 0x3b, 0x52, 0x6f, 0x6f, 0x3b,
-0x42, 0x75, 0x72, 0x3b, 0x45, 0x70, 0x65, 0x3b, 0x4b, 0x70, 0x74, 0x3b, 0x4b, 0x70, 0x61, 0x4d, 0x3b, 0x4e, 0x3b, 0x54,
-0x3b, 0x49, 0x3b, 0x4d, 0x3b, 0x50, 0x3b, 0x4e, 0x3b, 0x52, 0x3b, 0x42, 0x3b, 0x45, 0x3b, 0x4b, 0x3b, 0x4b, 0x4d, 0x77,
-0x61, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6d, 0x62, 0x65, 0x65, 0x3b, 0x4d, 0x77, 0x61, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6b,
-0x65, 0x6c, 0x129, 0x3b, 0x4d, 0x77, 0x61, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x74, 0x61, 0x74, 0x169, 0x3b, 0x4d,
-0x77, 0x61, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x6e, 0x61, 0x3b, 0x4d, 0x77, 0x61, 0x69, 0x20, 0x77, 0x61, 0x20,
-0x6b, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x4d, 0x77, 0x61, 0x69, 0x20, 0x77, 0x61, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x74,
-0x68, 0x61, 0x74, 0x169, 0x3b, 0x4d, 0x77, 0x61, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6d, 0x75, 0x6f, 0x6e, 0x7a, 0x61, 0x3b,
-0x4d, 0x77, 0x61, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6e, 0x79, 0x61, 0x61, 0x6e, 0x79, 0x61, 0x3b, 0x4d, 0x77, 0x61, 0x69,
-0x20, 0x77, 0x61, 0x20, 0x6b, 0x65, 0x6e, 0x64, 0x61, 0x3b, 0x4d, 0x77, 0x61, 0x69, 0x20, 0x77, 0x61, 0x20, 0x129, 0x6b,
-0x75, 0x6d, 0x69, 0x3b, 0x4d, 0x77, 0x61, 0x69, 0x20, 0x77, 0x61, 0x20, 0x129, 0x6b, 0x75, 0x6d, 0x69, 0x20, 0x6e, 0x61,
-0x20, 0x129, 0x6d, 0x77, 0x65, 0x3b, 0x4d, 0x77, 0x61, 0x69, 0x20, 0x77, 0x61, 0x20, 0x129, 0x6b, 0x75, 0x6d, 0x69, 0x20,
-0x6e, 0x61, 0x20, 0x69, 0x6c, 0x129, 0x4d, 0x62, 0x65, 0x3b, 0x4b, 0x65, 0x6c, 0x3b, 0x4b, 0x74, 0x169, 0x3b, 0x4b, 0x61,
-0x6e, 0x3b, 0x4b, 0x74, 0x6e, 0x3b, 0x54, 0x68, 0x61, 0x3b, 0x4d, 0x6f, 0x6f, 0x3b, 0x4e, 0x79, 0x61, 0x3b, 0x4b, 0x6e,
-0x64, 0x3b, 0x128, 0x6b, 0x75, 0x3b, 0x128, 0x6b, 0x6d, 0x3b, 0x128, 0x6b, 0x6c, 0x4d, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4b,
-0x3b, 0x4b, 0x3b, 0x54, 0x3b, 0x4d, 0x3b, 0x4e, 0x3b, 0x4b, 0x3b, 0x128, 0x3b, 0x128, 0x3b, 0x128, 0xc9c, 0xca8, 0xcb5, 0xcb0,
-0xcbf, 0x3b, 0xcab, 0xcc6, 0xcac, 0xccd, 0xcb0, 0xcb5, 0xcb0, 0xcbf, 0x3b, 0xcae, 0xcbe, 0xcb0, 0xccd, 0xc9a, 0xccd, 0x3b, 0xc8f, 0xcaa,
-0xccd, 0xcb0, 0xcbf, 0xcb2, 0xccd, 0x3b, 0xcae, 0xcc7, 0x3b, 0xc9c, 0xcc2, 0xca8, 0xccd, 0x3b, 0xc9c, 0xcc1, 0xcb2, 0xcc8, 0x3b, 0xc86,
-0xc97, 0xcb8, 0xccd, 0xc9f, 0xccd, 0x3b, 0xcb8, 0xcc6, 0xcaa, 0xccd, 0xc9f, 0xcc6, 0xc82, 0xcac, 0xcb0, 0xccd, 0x3b, 0xc85, 0xc95, 0xccd,
-0xc9f, 0xccb, 0xcac, 0xcb0, 0xccd, 0x3b, 0xca8, 0xcb5, 0xcc6, 0xc82, 0xcac, 0xcb0, 0xccd, 0x3b, 0xca1, 0xcbf, 0xcb8, 0xcc6, 0xc82, 0xcac,
-0xcb0, 0xccd, 0xc9c, 0xca8, 0x3b, 0xcab, 0xcc6, 0xcac, 0xccd, 0xcb0, 0x3b, 0xcae, 0xcbe, 0xcb0, 0xccd, 0xc9a, 0xccd, 0x3b, 0xc8f, 0xcaa,
-0xccd, 0xcb0, 0xcbf, 0x3b, 0xcae, 0xcc7, 0x3b, 0xc9c, 0xcc2, 0xca8, 0xccd, 0x3b, 0xc9c, 0xcc1, 0xcb2, 0xcc8, 0x3b, 0xc86, 0xc97, 0x3b,
-0xcb8, 0xcc6, 0xcaa, 0xccd, 0xc9f, 0xcc6, 0xc82, 0x3b, 0xc85, 0xc95, 0xccd, 0xc9f, 0xccb, 0x3b, 0xca8, 0xcb5, 0xcc6, 0xc82, 0x3b, 0xca1,
-0xcbf, 0xcb8, 0xcc6, 0xc82, 0xc9c, 0xca8, 0xcb5, 0xcb0, 0xcbf, 0x3b, 0xcab, 0xcc6, 0xcac, 0xccd, 0xcb0, 0xcb5, 0xcb0, 0xcbf, 0x3b, 0xcae,
-0xcbe, 0xcb0, 0xccd, 0xc9a, 0xccd, 0x3b, 0xc8f, 0xcaa, 0xccd, 0xcb0, 0xcbf, 0x3b, 0xcae, 0xcc7, 0x3b, 0xc9c, 0xcc2, 0xca8, 0xccd, 0x3b,
-0xc9c, 0xcc1, 0xcb2, 0xcc8, 0x3b, 0xc86, 0xc97, 0x3b, 0xcb8, 0xcc6, 0xcaa, 0xccd, 0xc9f, 0xcc6, 0xc82, 0x3b, 0xc85, 0xc95, 0xccd, 0xc9f,
-0xccb, 0x3b, 0xca8, 0xcb5, 0xcc6, 0xc82, 0x3b, 0xca1, 0xcbf, 0xcb8, 0xcc6, 0xc82, 0xc9c, 0x3b, 0xcab, 0xcc6, 0x3b, 0xcae, 0xcbe, 0x3b,
-0xc8f, 0x3b, 0xcae, 0xcc7, 0x3b, 0xc9c, 0xcc2, 0x3b, 0xc9c, 0xcc1, 0x3b, 0xc86, 0x3b, 0xcb8, 0xcc6, 0x3b, 0xc85, 0x3b, 0xca8, 0x3b,
-0xca1, 0xcbf, 0x62c, 0x646, 0x624, 0x631, 0x6cc, 0x3b, 0x641, 0x631, 0x624, 0x631, 0x6cc, 0x3b, 0x645, 0x627, 0x631, 0x655, 0x686, 0x3b,
-0x627, 0x67e, 0x631, 0x6cc, 0x644, 0x3b, 0x645, 0x6cc, 0x654, 0x3b, 0x62c, 0x648, 0x657, 0x646, 0x3b, 0x62c, 0x648, 0x657, 0x644, 0x627,
-0x6cc, 0x6cc, 0x3b, 0x627, 0x6af, 0x633, 0x62a, 0x3b, 0x633, 0x62a, 0x645, 0x628, 0x631, 0x3b, 0x627, 0x6a9, 0x62a, 0x648, 0x657, 0x628,
-0x631, 0x3b, 0x646, 0x648, 0x645, 0x628, 0x631, 0x3b, 0x62f, 0x633, 0x645, 0x628, 0x631, 0x62c, 0x3b, 0x641, 0x3b, 0x645, 0x3b, 0x627,
-0x3b, 0x645, 0x3b, 0x62c, 0x3b, 0x62c, 0x3b, 0x627, 0x3b, 0x633, 0x3b, 0x633, 0x3b, 0x627, 0x3b, 0x646, 0x49a, 0x430, 0x4a3, 0x442,
-0x430, 0x440, 0x3b, 0x410, 0x49b, 0x43f, 0x430, 0x43d, 0x3b, 0x41d, 0x430, 0x443, 0x440, 0x44b, 0x437, 0x3b, 0x421, 0x4d9, 0x443, 0x456,
-0x440, 0x3b, 0x41c, 0x430, 0x43c, 0x44b, 0x440, 0x3b, 0x41c, 0x430, 0x443, 0x441, 0x44b, 0x43c, 0x3b, 0x428, 0x456, 0x43b, 0x434, 0x435,
-0x3b, 0x422, 0x430, 0x43c, 0x44b, 0x437, 0x3b, 0x49a, 0x44b, 0x440, 0x43a, 0x4af, 0x439, 0x435, 0x43a, 0x3b, 0x49a, 0x430, 0x437, 0x430,
-0x43d, 0x3b, 0x49a, 0x430, 0x440, 0x430, 0x448, 0x430, 0x3b, 0x416, 0x435, 0x43b, 0x442, 0x43e, 0x49b, 0x441, 0x430, 0x43d, 0x49b, 0x430,
-0x4a3, 0x442, 0x430, 0x440, 0x3b, 0x430, 0x49b, 0x43f, 0x430, 0x43d, 0x3b, 0x43d, 0x430, 0x443, 0x440, 0x44b, 0x437, 0x3b, 0x441, 0x4d9,
-0x443, 0x456, 0x440, 0x3b, 0x43c, 0x430, 0x43c, 0x44b, 0x440, 0x3b, 0x43c, 0x430, 0x443, 0x441, 0x44b, 0x43c, 0x3b, 0x448, 0x456, 0x43b,
-0x434, 0x435, 0x3b, 0x442, 0x430, 0x43c, 0x44b, 0x437, 0x3b, 0x49b, 0x44b, 0x440, 0x43a, 0x4af, 0x439, 0x435, 0x43a, 0x3b, 0x49b, 0x430,
-0x437, 0x430, 0x43d, 0x3b, 0x49b, 0x430, 0x440, 0x430, 0x448, 0x430, 0x3b, 0x436, 0x435, 0x43b, 0x442, 0x43e, 0x49b, 0x441, 0x430, 0x43d,
-0x49b, 0x430, 0x4a3, 0x2e, 0x3b, 0x430, 0x49b, 0x43f, 0x2e, 0x3b, 0x43d, 0x430, 0x443, 0x2e, 0x3b, 0x441, 0x4d9, 0x443, 0x2e, 0x3b,
-0x43c, 0x430, 0x43c, 0x2e, 0x3b, 0x43c, 0x430, 0x443, 0x2e, 0x3b, 0x448, 0x456, 0x43b, 0x2e, 0x3b, 0x442, 0x430, 0x43c, 0x2e, 0x3b,
-0x49b, 0x44b, 0x440, 0x2e, 0x3b, 0x49b, 0x430, 0x437, 0x2e, 0x3b, 0x49b, 0x430, 0x440, 0x2e, 0x3b, 0x436, 0x435, 0x43b, 0x2e, 0x49a,
-0x3b, 0x410, 0x3b, 0x41d, 0x3b, 0x421, 0x3b, 0x41c, 0x3b, 0x41c, 0x3b, 0x428, 0x3b, 0x422, 0x3b, 0x49a, 0x3b, 0x49a, 0x3b, 0x49a,
-0x3b, 0x416, 0x1798, 0x1780, 0x179a, 0x17b6, 0x3b, 0x1780, 0x17bb, 0x1798, 0x17d2, 0x1797, 0x17c8, 0x3b, 0x1798, 0x17b8, 0x1793, 0x17b6, 0x3b, 0x1798,
-0x17c1, 0x179f, 0x17b6, 0x3b, 0x17a7, 0x179f, 0x1797, 0x17b6, 0x3b, 0x1798, 0x17b7, 0x1790, 0x17bb, 0x1793, 0x17b6, 0x3b, 0x1780, 0x1780, 0x17d2, 0x1780,
-0x178a, 0x17b6, 0x3b, 0x179f, 0x17b8, 0x17a0, 0x17b6, 0x3b, 0x1780, 0x1789, 0x17d2, 0x1789, 0x17b6, 0x3b, 0x178f, 0x17bb, 0x179b, 0x17b6, 0x3b, 0x179c,
-0x17b7, 0x1785, 0x17d2, 0x1786, 0x17b7, 0x1780, 0x17b6, 0x3b, 0x1792, 0x17d2, 0x1793, 0x17bc, 0x1798, 0x3b, 0x1780, 0x3b, 0x1798, 0x3b, 0x1798, 0x3b,
-0x17a7, 0x3b, 0x1798, 0x3b, 0x1780, 0x3b, 0x179f, 0x3b, 0x1780, 0x3b, 0x178f, 0x3b, 0x179c, 0x3b, 0x1792, 0x4e, 0x6a, 0x65, 0x6e, 0x75,
-0x61, 0x72, 0x129, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x65, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x65, 0x72, 0x129, 0x3b, 0x4d, 0x77,
-0x65, 0x72, 0x65, 0x20, 0x77, 0x61, 0x20, 0x67, 0x61, 0x74, 0x61, 0x74, 0x169, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x65, 0x20,
-0x77, 0x61, 0x20, 0x6b, 0x61, 0x6e, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x65, 0x20, 0x77, 0x61, 0x20, 0x67, 0x61, 0x74,
-0x61, 0x6e, 0x6f, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x65, 0x20, 0x77, 0x61, 0x20, 0x67, 0x61, 0x74, 0x61, 0x6e, 0x64, 0x61,
-0x74, 0x169, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x65, 0x20, 0x77, 0x61, 0x20, 0x6d, 0x169, 0x67, 0x77, 0x61, 0x6e, 0x6a, 0x61,
-0x3b, 0x4d, 0x77, 0x65, 0x72, 0x65, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x6e, 0x61, 0x6e, 0x61, 0x3b, 0x4d, 0x77, 0x65,
-0x72, 0x65, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x65, 0x6e, 0x64, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x65, 0x20, 0x77, 0x61,
-0x20, 0x69, 0x6b, 0x169, 0x6d, 0x69, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x65, 0x20, 0x77, 0x61, 0x20, 0x69, 0x6b, 0x169, 0x6d,
-0x69, 0x20, 0x6e, 0x61, 0x20, 0x169, 0x6d, 0x77, 0x65, 0x3b, 0x4e, 0x64, 0x69, 0x74, 0x68, 0x65, 0x6d, 0x62, 0x61, 0x4a,
-0x45, 0x4e, 0x3b, 0x57, 0x4b, 0x52, 0x3b, 0x57, 0x47, 0x54, 0x3b, 0x57, 0x4b, 0x4e, 0x3b, 0x57, 0x54, 0x4e, 0x3b, 0x57,
-0x54, 0x44, 0x3b, 0x57, 0x4d, 0x4a, 0x3b, 0x57, 0x4e, 0x4e, 0x3b, 0x57, 0x4b, 0x44, 0x3b, 0x57, 0x49, 0x4b, 0x3b, 0x57,
-0x4d, 0x57, 0x3b, 0x44, 0x49, 0x54, 0x4a, 0x3b, 0x4b, 0x3b, 0x47, 0x3b, 0x4b, 0x3b, 0x47, 0x3b, 0x47, 0x3b, 0x4d, 0x3b,
-0x4b, 0x3b, 0x4b, 0x3b, 0x49, 0x3b, 0x49, 0x3b, 0x44, 0x4d, 0x75, 0x74, 0x61, 0x72, 0x61, 0x6d, 0x61, 0x3b, 0x47, 0x61,
-0x73, 0x68, 0x79, 0x61, 0x6e, 0x74, 0x61, 0x72, 0x65, 0x3b, 0x57, 0x65, 0x72, 0x75, 0x72, 0x77, 0x65, 0x3b, 0x4d, 0x61,
-0x74, 0x61, 0x3b, 0x47, 0x69, 0x63, 0x75, 0x72, 0x61, 0x73, 0x69, 0x3b, 0x4b, 0x61, 0x6d, 0x65, 0x6e, 0x61, 0x3b, 0x4e,
-0x79, 0x61, 0x6b, 0x61, 0x6e, 0x67, 0x61, 0x3b, 0x4b, 0x61, 0x6e, 0x61, 0x6d, 0x61, 0x3b, 0x4e, 0x7a, 0x65, 0x6c, 0x69,
-0x3b, 0x55, 0x6b, 0x77, 0x61, 0x6b, 0x69, 0x72, 0x61, 0x3b, 0x55, 0x67, 0x75, 0x73, 0x68, 0x79, 0x69, 0x6e, 0x67, 0x6f,
-0x3b, 0x55, 0x6b, 0x75, 0x62, 0x6f, 0x7a, 0x61, 0x6d, 0x75, 0x74, 0x2e, 0x3b, 0x67, 0x61, 0x73, 0x2e, 0x3b, 0x77, 0x65,
-0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x74, 0x2e, 0x3b, 0x67, 0x69, 0x63, 0x2e, 0x3b, 0x6b, 0x61, 0x6d, 0x2e, 0x3b, 0x6e, 0x79,
-0x61, 0x2e, 0x3b, 0x6b, 0x61, 0x6e, 0x2e, 0x3b, 0x6e, 0x7a, 0x65, 0x2e, 0x3b, 0x75, 0x6b, 0x77, 0x2e, 0x3b, 0x75, 0x67,
-0x75, 0x2e, 0x3b, 0x75, 0x6b, 0x75, 0x2e, 0x91c, 0x93e, 0x928, 0x947, 0x935, 0x93e, 0x930, 0x940, 0x3b, 0x92b, 0x947, 0x92c, 0x94d,
-0x930, 0x941, 0x935, 0x93e, 0x930, 0x940, 0x3b, 0x92e, 0x93e, 0x930, 0x94d, 0x91a, 0x3b, 0x90f, 0x92a, 0x94d, 0x930, 0x940, 0x932, 0x3b,
-0x92e, 0x947, 0x3b, 0x91c, 0x942, 0x928, 0x3b, 0x91c, 0x941, 0x932, 0x92f, 0x3b, 0x911, 0x917, 0x938, 0x94d, 0x91f, 0x3b, 0x938, 0x92a,
-0x94d, 0x91f, 0x947, 0x902, 0x92c, 0x930, 0x3b, 0x911, 0x915, 0x94d, 0x91f, 0x94b, 0x92c, 0x930, 0x3b, 0x928, 0x94b, 0x935, 0x94d, 0x939,
-0x947, 0x902, 0x92c, 0x930, 0x3b, 0x921, 0x93f, 0x938, 0x947, 0x902, 0x92c, 0x930, 0x91c, 0x93e, 0x928, 0x947, 0x3b, 0x92b, 0x947, 0x92c,
-0x94d, 0x930, 0x941, 0x3b, 0x92e, 0x93e, 0x930, 0x94d, 0x91a, 0x3b, 0x90f, 0x92a, 0x94d, 0x930, 0x940, 0x3b, 0x92e, 0x947, 0x3b, 0x91c,
-0x942, 0x928, 0x3b, 0x91c, 0x941, 0x932, 0x3b, 0x911, 0x917, 0x3b, 0x938, 0x92a, 0x94d, 0x91f, 0x947, 0x902, 0x3b, 0x911, 0x915, 0x94d,
-0x91f, 0x94b, 0x3b, 0x928, 0x94b, 0x3b, 0x921, 0x93f, 0x938, 0x947, 0x31, 0xc6d4, 0x3b, 0x32, 0xc6d4, 0x3b, 0x33, 0xc6d4, 0x3b, 0x34,
-0xc6d4, 0x3b, 0x35, 0xc6d4, 0x3b, 0x36, 0xc6d4, 0x3b, 0x37, 0xc6d4, 0x3b, 0x38, 0xc6d4, 0x3b, 0x39, 0xc6d4, 0x3b, 0x31, 0x30, 0xc6d4,
-0x3b, 0x31, 0x31, 0xc6d4, 0x3b, 0x31, 0x32, 0xc6d4, 0x17d, 0x61, 0x6e, 0x77, 0x69, 0x79, 0x65, 0x3b, 0x46, 0x65, 0x65, 0x77,
-0x69, 0x72, 0x69, 0x79, 0x65, 0x3b, 0x4d, 0x61, 0x72, 0x73, 0x69, 0x3b, 0x41, 0x77, 0x69, 0x72, 0x69, 0x6c, 0x3b, 0x4d,
-0x65, 0x3b, 0x17d, 0x75, 0x77, 0x65, 0x14b, 0x3b, 0x17d, 0x75, 0x79, 0x79, 0x65, 0x3b, 0x55, 0x74, 0x3b, 0x53, 0x65, 0x6b,
-0x74, 0x61, 0x6e, 0x62, 0x75, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x6f, 0x62, 0x75, 0x72, 0x3b, 0x4e, 0x6f, 0x6f, 0x77,
-0x61, 0x6e, 0x62, 0x75, 0x72, 0x3b, 0x44, 0x65, 0x65, 0x73, 0x61, 0x6e, 0x62, 0x75, 0x72, 0x17d, 0x61, 0x6e, 0x3b, 0x46,
-0x65, 0x65, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x77, 0x69, 0x3b, 0x4d, 0x65, 0x3b, 0x17d, 0x75, 0x77, 0x3b, 0x17d, 0x75,
-0x79, 0x3b, 0x55, 0x74, 0x3b, 0x53, 0x65, 0x6b, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x6f, 0x3b, 0x44, 0x65, 0x65,
-0x17d, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x17d, 0x3b, 0x17d, 0x3b, 0x55, 0x3b, 0x53, 0x3b, 0x4f, 0x3b,
-0x4e, 0x3b, 0x44, 0x72, 0xea, 0x62, 0x65, 0x6e, 0x64, 0x61, 0x6e, 0x3b, 0x72, 0x65, 0x15f, 0x65, 0x6d, 0xee, 0x3b, 0x61,
-0x64, 0x61, 0x72, 0x3b, 0x61, 0x76, 0x72, 0xea, 0x6c, 0x3b, 0x67, 0x75, 0x6c, 0x61, 0x6e, 0x3b, 0x70, 0xfb, 0x15f, 0x70,
-0x65, 0x72, 0x3b, 0x74, 0xee, 0x72, 0x6d, 0x65, 0x68, 0x3b, 0x67, 0x65, 0x6c, 0x61, 0x77, 0xea, 0x6a, 0x3b, 0x72, 0x65,
-0x7a, 0x62, 0x65, 0x72, 0x3b, 0x6b, 0x65, 0x77, 0xe7, 0xea, 0x72, 0x3b, 0x73, 0x65, 0x72, 0x6d, 0x61, 0x77, 0x65, 0x7a,
-0x3b, 0x62, 0x65, 0x72, 0x66, 0x61, 0x6e, 0x62, 0x61, 0x72, 0x72, 0xea, 0x62, 0x65, 0x6e, 0x64, 0x61, 0x6e, 0xea, 0x3b,
-0x72, 0x65, 0x15f, 0x65, 0x6d, 0x69, 0x79, 0xea, 0x3b, 0x61, 0x64, 0x61, 0x72, 0xea, 0x3b, 0x61, 0x76, 0x72, 0xea, 0x6c,
-0xea, 0x3b, 0x67, 0x75, 0x6c, 0x61, 0x6e, 0xea, 0x3b, 0x70, 0xfb, 0x15f, 0x70, 0x65, 0x72, 0xea, 0x3b, 0x74, 0xee, 0x72,
-0x6d, 0x65, 0x68, 0xea, 0x3b, 0x67, 0x65, 0x6c, 0x61, 0x77, 0xea, 0x6a, 0xea, 0x3b, 0x72, 0x65, 0x7a, 0x62, 0x65, 0x72,
-0xea, 0x3b, 0x6b, 0x65, 0x77, 0xe7, 0xea, 0x72, 0xea, 0x3b, 0x73, 0x65, 0x72, 0x6d, 0x61, 0x77, 0x65, 0x7a, 0xea, 0x3b,
-0x62, 0x65, 0x72, 0x66, 0x61, 0x6e, 0x62, 0x61, 0x72, 0xea, 0x72, 0xea, 0x62, 0x3b, 0x72, 0x65, 0x15f, 0x3b, 0x61, 0x64,
-0x61, 0x3b, 0x61, 0x76, 0x72, 0x3b, 0x67, 0x75, 0x6c, 0x3b, 0x70, 0xfb, 0x15f, 0x3b, 0x74, 0xee, 0x72, 0x3b, 0x67, 0x65,
-0x6c, 0x3b, 0x72, 0x65, 0x7a, 0x3b, 0x6b, 0x65, 0x77, 0x3b, 0x73, 0x65, 0x72, 0x3b, 0x62, 0x65, 0x72, 0x52, 0x3b, 0x52,
-0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x47, 0x3b, 0x50, 0x3b, 0x54, 0x3b, 0x47, 0x3b, 0x52, 0x3b, 0x4b, 0x3b, 0x53, 0x3b, 0x42,
-0x6e, 0x67, 0x77, 0x25b, 0x6e, 0x20, 0x6d, 0x61, 0x74, 0xe1, 0x68, 0x72, 0x61, 0x3b, 0x6e, 0x67, 0x77, 0x25b, 0x6e, 0x20,
-0x144, 0x6d, 0x62, 0x61, 0x3b, 0x6e, 0x67, 0x77, 0x25b, 0x6e, 0x20, 0x144, 0x6c, 0x61, 0x6c, 0x3b, 0x6e, 0x67, 0x77, 0x25b,
-0x6e, 0x20, 0x144, 0x6e, 0x61, 0x3b, 0x6e, 0x67, 0x77, 0x25b, 0x6e, 0x20, 0x144, 0x74, 0x61, 0x6e, 0x3b, 0x6e, 0x67, 0x77,
-0x25b, 0x6e, 0x20, 0x144, 0x74, 0x75, 0xf3, 0x3b, 0x6e, 0x67, 0x77, 0x25b, 0x6e, 0x20, 0x68, 0x25b, 0x6d, 0x62, 0x75, 0x25b,
-0x72, 0xed, 0x3b, 0x6e, 0x67, 0x77, 0x25b, 0x6e, 0x20, 0x6c, 0x254, 0x6d, 0x62, 0x69, 0x3b, 0x6e, 0x67, 0x77, 0x25b, 0x6e,
-0x20, 0x72, 0x25b, 0x62, 0x76, 0x75, 0xe2, 0x3b, 0x6e, 0x67, 0x77, 0x25b, 0x6e, 0x20, 0x77, 0x75, 0x6d, 0x3b, 0x6e, 0x67,
-0x77, 0x25b, 0x6e, 0x20, 0x77, 0x75, 0x6d, 0x20, 0x6e, 0x61, 0x76, 0x1d4, 0x72, 0x3b, 0x6b, 0x72, 0xed, 0x73, 0x69, 0x6d,
-0x69, 0x6e, 0x6e, 0x67, 0x31, 0x3b, 0x6e, 0x67, 0x32, 0x3b, 0x6e, 0x67, 0x33, 0x3b, 0x6e, 0x67, 0x34, 0x3b, 0x6e, 0x67,
-0x35, 0x3b, 0x6e, 0x67, 0x36, 0x3b, 0x6e, 0x67, 0x37, 0x3b, 0x6e, 0x67, 0x38, 0x3b, 0x6e, 0x67, 0x39, 0x3b, 0x6e, 0x67,
-0x31, 0x30, 0x3b, 0x6e, 0x67, 0x31, 0x31, 0x3b, 0x6b, 0x72, 0x69, 0x73, 0x42f, 0x43d, 0x432, 0x430, 0x440, 0x44c, 0x3b, 0x424,
-0x435, 0x432, 0x440, 0x430, 0x43b, 0x44c, 0x3b, 0x41c, 0x430, 0x440, 0x442, 0x3b, 0x410, 0x43f, 0x440, 0x435, 0x43b, 0x44c, 0x3b, 0x41c,
-0x430, 0x439, 0x3b, 0x418, 0x44e, 0x43d, 0x44c, 0x3b, 0x418, 0x44e, 0x43b, 0x44c, 0x3b, 0x410, 0x432, 0x433, 0x443, 0x441, 0x442, 0x3b,
-0x421, 0x435, 0x43d, 0x442, 0x44f, 0x431, 0x440, 0x44c, 0x3b, 0x41e, 0x43a, 0x442, 0x44f, 0x431, 0x440, 0x44c, 0x3b, 0x41d, 0x43e, 0x44f,
-0x431, 0x440, 0x44c, 0x3b, 0x414, 0x435, 0x43a, 0x430, 0x431, 0x440, 0x44c, 0x42f, 0x43d, 0x432, 0x3b, 0x424, 0x435, 0x432, 0x3b, 0x41c,
-0x430, 0x440, 0x3b, 0x410, 0x43f, 0x440, 0x3b, 0x41c, 0x430, 0x439, 0x3b, 0x418, 0x44e, 0x43d, 0x3b, 0x418, 0x44e, 0x43b, 0x3b, 0x410,
-0x432, 0x433, 0x3b, 0x421, 0x435, 0x43d, 0x3b, 0x41e, 0x43a, 0x442, 0x3b, 0x41d, 0x43e, 0x44f, 0x3b, 0x414, 0x435, 0x43a, 0x44f, 0x43d,
-0x432, 0x2e, 0x3b, 0x444, 0x435, 0x432, 0x2e, 0x3b, 0x43c, 0x430, 0x440, 0x2e, 0x3b, 0x430, 0x43f, 0x440, 0x2e, 0x3b, 0x43c, 0x430,
-0x439, 0x3b, 0x438, 0x44e, 0x43d, 0x2e, 0x3b, 0x438, 0x44e, 0x43b, 0x2e, 0x3b, 0x430, 0x432, 0x433, 0x2e, 0x3b, 0x441, 0x435, 0x43d,
-0x2e, 0x3b, 0x43e, 0x43a, 0x442, 0x2e, 0x3b, 0x43d, 0x43e, 0x44f, 0x2e, 0x3b, 0x434, 0x435, 0x43a, 0x2e, 0x57, 0x69, 0xf3, 0x74,
-0x68, 0x65, 0x21f, 0x69, 0x6b, 0x61, 0x20, 0x57, 0xed, 0x3b, 0x54, 0x68, 0x69, 0x79, 0xf3, 0x21f, 0x65, 0x79, 0x75, 0x14b,
-0x6b, 0x61, 0x20, 0x57, 0xed, 0x3b, 0x49, 0x161, 0x74, 0xe1, 0x77, 0x69, 0x10d, 0x68, 0x61, 0x79, 0x61, 0x7a, 0x61, 0x14b,
-0x20, 0x57, 0xed, 0x3b, 0x50, 0x21f, 0x65, 0x17e, 0xed, 0x74, 0x21f, 0x6f, 0x20, 0x57, 0xed, 0x3b, 0x10c, 0x68, 0x61, 0x14b,
-0x77, 0xe1, 0x70, 0x65, 0x74, 0x21f, 0x6f, 0x20, 0x57, 0xed, 0x3b, 0x57, 0xed, 0x70, 0x61, 0x7a, 0x75, 0x6b, 0x21f, 0x61,
-0x2d, 0x77, 0x61, 0x161, 0x74, 0xe9, 0x20, 0x57, 0xed, 0x3b, 0x10c, 0x68, 0x61, 0x14b, 0x70, 0x21f, 0xe1, 0x73, 0x61, 0x70,
-0x61, 0x20, 0x57, 0xed, 0x3b, 0x57, 0x61, 0x73, 0xfa, 0x74, 0x21f, 0x75, 0x14b, 0x20, 0x57, 0xed, 0x3b, 0x10c, 0x68, 0x61,
-0x14b, 0x77, 0xe1, 0x70, 0x65, 0x1e7, 0x69, 0x20, 0x57, 0xed, 0x3b, 0x10c, 0x68, 0x61, 0x14b, 0x77, 0xe1, 0x70, 0x65, 0x2d,
-0x6b, 0x61, 0x73, 0x6e, 0xe1, 0x20, 0x57, 0xed, 0x3b, 0x57, 0x61, 0x6e, 0xed, 0x79, 0x65, 0x74, 0x75, 0x20, 0x57, 0xed,
-0x3b, 0x54, 0x21f, 0x61, 0x68, 0xe9, 0x6b, 0x61, 0x70, 0x161, 0x75, 0x14b, 0x20, 0x57, 0xed, 0x4b, 0x289, 0x66, 0xfa, 0x6e,
-0x67, 0x61, 0x74, 0x268, 0x3b, 0x4b, 0x289, 0x6e, 0x61, 0x61, 0x6e, 0x268, 0x3b, 0x4b, 0x289, 0x6b, 0x65, 0x65, 0x6e, 0x64,
-0x61, 0x3b, 0x4b, 0x77, 0x69, 0x69, 0x6b, 0x75, 0x6d, 0x69, 0x3b, 0x4b, 0x77, 0x69, 0x69, 0x6e, 0x79, 0x61, 0x6d, 0x62,
-0xe1, 0x6c, 0x61, 0x3b, 0x4b, 0x77, 0x69, 0x69, 0x64, 0x77, 0x61, 0x61, 0x74, 0x61, 0x3b, 0x4b, 0x289, 0x6d, 0x289, 0x289,
-0x6e, 0x63, 0x68, 0x268, 0x3b, 0x4b, 0x289, 0x76, 0x268, 0x268, 0x72, 0x268, 0x3b, 0x4b, 0x289, 0x73, 0x61, 0x61, 0x74, 0x289,
-0x3b, 0x4b, 0x77, 0x69, 0x69, 0x6e, 0x79, 0x69, 0x3b, 0x4b, 0x289, 0x73, 0x61, 0x61, 0x6e, 0x6f, 0x3b, 0x4b, 0x289, 0x73,
-0x61, 0x73, 0x61, 0x74, 0x289, 0x46, 0xfa, 0x6e, 0x67, 0x61, 0x74, 0x268, 0x3b, 0x4e, 0x61, 0x61, 0x6e, 0x268, 0x3b, 0x4b,
-0x65, 0x65, 0x6e, 0x64, 0x61, 0x3b, 0x49, 0x6b, 0xfa, 0x6d, 0x69, 0x3b, 0x49, 0x6e, 0x79, 0x61, 0x6d, 0x62, 0x61, 0x6c,
-0x61, 0x3b, 0x49, 0x64, 0x77, 0x61, 0x61, 0x74, 0x61, 0x3b, 0x4d, 0x289, 0x289, 0x6e, 0x63, 0x68, 0x268, 0x3b, 0x56, 0x268,
-0x268, 0x72, 0x268, 0x3b, 0x53, 0x61, 0x61, 0x74, 0x289, 0x3b, 0x49, 0x6e, 0x79, 0x69, 0x3b, 0x53, 0x61, 0x61, 0x6e, 0x6f,
-0x3b, 0x53, 0x61, 0x73, 0x61, 0x74, 0x289, 0x46, 0x3b, 0x4e, 0x3b, 0x4b, 0x3b, 0x49, 0x3b, 0x49, 0x3b, 0x49, 0x3b, 0x4d,
-0x3b, 0x56, 0x3b, 0x53, 0x3b, 0x49, 0x3b, 0x53, 0x3b, 0x53, 0xea1, 0xeb1, 0xe87, 0xe81, 0xead, 0xe99, 0x3b, 0xe81, 0xeb8, 0xea1,
-0xe9e, 0xeb2, 0x3b, 0xea1, 0xeb5, 0xe99, 0xeb2, 0x3b, 0xec0, 0xea1, 0xeaa, 0xeb2, 0x3b, 0xe9e, 0xeb6, 0xe94, 0xeaa, 0xeb0, 0xe9e, 0xeb2,
-0x3b, 0xea1, 0xeb4, 0xe96, 0xeb8, 0xe99, 0xeb2, 0x3b, 0xe81, 0xecd, 0xea5, 0xeb0, 0xe81, 0xebb, 0xe94, 0x3b, 0xeaa, 0xeb4, 0xe87, 0xeab,
-0xeb2, 0x3b, 0xe81, 0xeb1, 0xe99, 0xe8d, 0xeb2, 0x3b, 0xe95, 0xeb8, 0xea5, 0xeb2, 0x3b, 0xe9e, 0xeb0, 0xe88, 0xeb4, 0xe81, 0x3b, 0xe97,
-0xeb1, 0xe99, 0xea7, 0xeb2, 0xea1, 0x2e, 0xe81, 0x2e, 0x3b, 0xe81, 0x2e, 0xe9e, 0x2e, 0x3b, 0xea1, 0x2e, 0xe99, 0x2e, 0x3b, 0xea1,
-0x2e, 0xeaa, 0x2e, 0x3b, 0xe9e, 0x2e, 0xe9e, 0x2e, 0x3b, 0xea1, 0xeb4, 0x2e, 0xe96, 0x2e, 0x3b, 0xe81, 0x2e, 0xea5, 0x2e, 0x3b,
-0xeaa, 0x2e, 0xeab, 0x2e, 0x3b, 0xe81, 0x2e, 0xe8d, 0x2e, 0x3b, 0xe95, 0x2e, 0xea5, 0x2e, 0x3b, 0xe9e, 0x2e, 0xe88, 0x2e, 0x3b,
-0xe97, 0x2e, 0xea7, 0x2e, 0x6a, 0x61, 0x6e, 0x76, 0x101, 0x72, 0x69, 0x73, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x101, 0x72,
-0x69, 0x73, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x12b, 0x6c, 0x69, 0x73, 0x3b, 0x6d, 0x61, 0x69,
-0x6a, 0x73, 0x3b, 0x6a, 0x16b, 0x6e, 0x69, 0x6a, 0x73, 0x3b, 0x6a, 0x16b, 0x6c, 0x69, 0x6a, 0x73, 0x3b, 0x61, 0x75, 0x67,
-0x75, 0x73, 0x74, 0x73, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x69, 0x73, 0x3b, 0x6f, 0x6b, 0x74, 0x6f,
-0x62, 0x72, 0x69, 0x73, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x69, 0x73, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d,
-0x62, 0x72, 0x69, 0x73, 0x6a, 0x61, 0x6e, 0x76, 0x2e, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x74,
-0x73, 0x3b, 0x61, 0x70, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x69, 0x6a, 0x73, 0x3b, 0x6a, 0x16b, 0x6e, 0x2e, 0x3b, 0x6a, 0x16b,
-0x6c, 0x2e, 0x3b, 0x61, 0x75, 0x67, 0x2e, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x2e, 0x3b, 0x6f, 0x6b, 0x74, 0x2e, 0x3b, 0x6e,
-0x6f, 0x76, 0x2e, 0x3b, 0x64, 0x65, 0x63, 0x2e, 0x73, 0xe1, 0x6e, 0x7a, 0xe1, 0x20, 0x79, 0x61, 0x20, 0x79, 0x61, 0x6d,
-0x62, 0x6f, 0x3b, 0x73, 0xe1, 0x6e, 0x7a, 0xe1, 0x20, 0x79, 0x61, 0x20, 0x6d, 0xed, 0x62, 0x61, 0x6c, 0xe9, 0x3b, 0x73,
-0xe1, 0x6e, 0x7a, 0xe1, 0x20, 0x79, 0x61, 0x20, 0x6d, 0xed, 0x73, 0xe1, 0x74, 0x6f, 0x3b, 0x73, 0xe1, 0x6e, 0x7a, 0xe1,
-0x20, 0x79, 0x61, 0x20, 0x6d, 0xed, 0x6e, 0x65, 0x69, 0x3b, 0x73, 0xe1, 0x6e, 0x7a, 0xe1, 0x20, 0x79, 0x61, 0x20, 0x6d,
-0xed, 0x74, 0xe1, 0x6e, 0x6f, 0x3b, 0x73, 0xe1, 0x6e, 0x7a, 0xe1, 0x20, 0x79, 0x61, 0x20, 0x6d, 0x6f, 0x74, 0xf3, 0x62,
-0xe1, 0x3b, 0x73, 0xe1, 0x6e, 0x7a, 0xe1, 0x20, 0x79, 0x61, 0x20, 0x6e, 0x73, 0x61, 0x6d, 0x62, 0x6f, 0x3b, 0x73, 0xe1,
-0x6e, 0x7a, 0xe1, 0x20, 0x79, 0x61, 0x20, 0x6d, 0x77, 0x61, 0x6d, 0x62, 0x65, 0x3b, 0x73, 0xe1, 0x6e, 0x7a, 0xe1, 0x20,
-0x79, 0x61, 0x20, 0x6c, 0x69, 0x62, 0x77, 0x61, 0x3b, 0x73, 0xe1, 0x6e, 0x7a, 0xe1, 0x20, 0x79, 0x61, 0x20, 0x7a, 0xf3,
-0x6d, 0x69, 0x3b, 0x73, 0xe1, 0x6e, 0x7a, 0xe1, 0x20, 0x79, 0x61, 0x20, 0x7a, 0xf3, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20,
-0x6d, 0x254, 0x30c, 0x6b, 0x254, 0x301, 0x3b, 0x73, 0xe1, 0x6e, 0x7a, 0xe1, 0x20, 0x79, 0x61, 0x20, 0x7a, 0xf3, 0x6d, 0x69,
-0x20, 0x6e, 0x61, 0x20, 0x6d, 0xed, 0x62, 0x61, 0x6c, 0xe9, 0x79, 0x61, 0x6e, 0x3b, 0x66, 0x62, 0x6c, 0x3b, 0x6d, 0x73,
-0x69, 0x3b, 0x61, 0x70, 0x6c, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x79, 0x75, 0x6e, 0x3b, 0x79, 0x75, 0x6c, 0x3b, 0x61, 0x67,
-0x74, 0x3b, 0x73, 0x74, 0x62, 0x3b, 0x254, 0x74, 0x62, 0x3b, 0x6e, 0x76, 0x62, 0x3b, 0x64, 0x73, 0x62, 0x79, 0x3b, 0x66,
-0x3b, 0x6d, 0x3b, 0x61, 0x3b, 0x6d, 0x3b, 0x79, 0x3b, 0x79, 0x3b, 0x61, 0x3b, 0x73, 0x3b, 0x254, 0x3b, 0x6e, 0x3b, 0x64,
-0x73, 0x61, 0x75, 0x73, 0x69, 0x73, 0x3b, 0x76, 0x61, 0x73, 0x61, 0x72, 0x69, 0x73, 0x3b, 0x6b, 0x6f, 0x76, 0x61, 0x73,
-0x3b, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x64, 0x69, 0x73, 0x3b, 0x67, 0x65, 0x67, 0x75, 0x17e, 0x117, 0x3b, 0x62, 0x69, 0x72,
-0x17e, 0x65, 0x6c, 0x69, 0x73, 0x3b, 0x6c, 0x69, 0x65, 0x70, 0x61, 0x3b, 0x72, 0x75, 0x67, 0x70, 0x6a, 0x16b, 0x74, 0x69,
-0x73, 0x3b, 0x72, 0x75, 0x67, 0x73, 0x117, 0x6a, 0x69, 0x73, 0x3b, 0x73, 0x70, 0x61, 0x6c, 0x69, 0x73, 0x3b, 0x6c, 0x61,
-0x70, 0x6b, 0x72, 0x69, 0x74, 0x69, 0x73, 0x3b, 0x67, 0x72, 0x75, 0x6f, 0x64, 0x69, 0x73, 0x73, 0x61, 0x75, 0x73, 0x69,
-0x6f, 0x3b, 0x76, 0x61, 0x73, 0x61, 0x72, 0x69, 0x6f, 0x3b, 0x6b, 0x6f, 0x76, 0x6f, 0x3b, 0x62, 0x61, 0x6c, 0x61, 0x6e,
-0x64, 0x17e, 0x69, 0x6f, 0x3b, 0x67, 0x65, 0x67, 0x75, 0x17e, 0x117, 0x73, 0x3b, 0x62, 0x69, 0x72, 0x17e, 0x65, 0x6c, 0x69,
-0x6f, 0x3b, 0x6c, 0x69, 0x65, 0x70, 0x6f, 0x73, 0x3b, 0x72, 0x75, 0x67, 0x70, 0x6a, 0x16b, 0x10d, 0x69, 0x6f, 0x3b, 0x72,
-0x75, 0x67, 0x73, 0x117, 0x6a, 0x6f, 0x3b, 0x73, 0x70, 0x61, 0x6c, 0x69, 0x6f, 0x3b, 0x6c, 0x61, 0x70, 0x6b, 0x72, 0x69,
-0x10d, 0x69, 0x6f, 0x3b, 0x67, 0x72, 0x75, 0x6f, 0x64, 0x17e, 0x69, 0x6f, 0x73, 0x61, 0x75, 0x73, 0x2e, 0x3b, 0x76, 0x61,
-0x73, 0x2e, 0x3b, 0x6b, 0x6f, 0x76, 0x2e, 0x3b, 0x62, 0x61, 0x6c, 0x2e, 0x3b, 0x67, 0x65, 0x67, 0x2e, 0x3b, 0x62, 0x69,
-0x72, 0x17e, 0x2e, 0x3b, 0x6c, 0x69, 0x65, 0x70, 0x2e, 0x3b, 0x72, 0x75, 0x67, 0x70, 0x2e, 0x3b, 0x72, 0x75, 0x67, 0x73,
-0x2e, 0x3b, 0x73, 0x70, 0x61, 0x6c, 0x2e, 0x3b, 0x6c, 0x61, 0x70, 0x6b, 0x72, 0x2e, 0x3b, 0x67, 0x72, 0x75, 0x6f, 0x64,
-0x2e, 0x53, 0x3b, 0x56, 0x3b, 0x4b, 0x3b, 0x42, 0x3b, 0x47, 0x3b, 0x42, 0x3b, 0x4c, 0x3b, 0x52, 0x3b, 0x52, 0x3b, 0x53,
-0x3b, 0x4c, 0x3b, 0x47, 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b, 0x6d,
-0x11b, 0x72, 0x63, 0x3b, 0x61, 0x70, 0x72, 0x79, 0x6c, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x6a, 0x3b,
-0x6a, 0x75, 0x6c, 0x69, 0x6a, 0x3b, 0x61, 0x77, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62,
-0x65, 0x72, 0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x6e, 0x6f, 0x77, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b,
-0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x61, 0x3b, 0x66, 0x65, 0x62, 0x72,
-0x75, 0x61, 0x72, 0x61, 0x3b, 0x6d, 0x11b, 0x72, 0x63, 0x61, 0x3b, 0x61, 0x70, 0x72, 0x79, 0x6c, 0x61, 0x3b, 0x6d, 0x61,
-0x6a, 0x61, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x6a, 0x61, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x6a, 0x61, 0x3b, 0x61, 0x77, 0x67,
-0x75, 0x73, 0x74, 0x61, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x61, 0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x62,
-0x72, 0x61, 0x3b, 0x6e, 0x6f, 0x77, 0x65, 0x6d, 0x62, 0x72, 0x61, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x72, 0x61,
-0x6a, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x62, 0x3b, 0x6d, 0x11b, 0x72, 0x3b, 0x61, 0x70, 0x72, 0x3b, 0x6d, 0x61, 0x6a, 0x3b,
-0x6a, 0x75, 0x6e, 0x3b, 0x6a, 0x75, 0x6c, 0x3b, 0x61, 0x77, 0x67, 0x3b, 0x73, 0x65, 0x70, 0x3b, 0x6f, 0x6b, 0x74, 0x3b,
-0x6e, 0x6f, 0x77, 0x3b, 0x64, 0x65, 0x63, 0x6a, 0x61, 0x6e, 0x2e, 0x3b, 0x66, 0x65, 0x62, 0x2e, 0x3b, 0x6d, 0x11b, 0x72,
-0x2e, 0x3b, 0x61, 0x70, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x6a, 0x2e, 0x3b, 0x6a, 0x75, 0x6e, 0x2e, 0x3b, 0x6a, 0x75, 0x6c,
-0x2e, 0x3b, 0x61, 0x77, 0x67, 0x2e, 0x3b, 0x73, 0x65, 0x70, 0x2e, 0x3b, 0x6f, 0x6b, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x77,
-0x2e, 0x3b, 0x64, 0x65, 0x63, 0x2e, 0x4a, 0x61, 0x6e, 0x75, 0x61, 0x61, 0x72, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x75, 0x61,
-0x61, 0x72, 0x3b, 0x4d, 0xe4, 0x72, 0x7a, 0x3b, 0x41, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75,
-0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x69, 0x3b, 0x41, 0x75, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65,
-0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x76, 0x65, 0x72, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65,
-0x72, 0x3b, 0x44, 0x65, 0x7a, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x4a, 0x61, 0x6e, 0x2e, 0x3b, 0x46, 0x65, 0x62, 0x2e, 0x3b,
-0x4d, 0xe4, 0x72, 0x7a, 0x3b, 0x41, 0x70, 0x72, 0x2e, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a,
-0x75, 0x6c, 0x69, 0x3b, 0x41, 0x75, 0x67, 0x2e, 0x3b, 0x53, 0x65, 0x70, 0x2e, 0x3b, 0x4f, 0x6b, 0x74, 0x2e, 0x3b, 0x4e,
-0x6f, 0x76, 0x2e, 0x3b, 0x44, 0x65, 0x7a, 0x2e, 0x43, 0x69, 0x6f, 0x6e, 0x67, 0x6f, 0x3b, 0x4c, 0xf9, 0x69, 0x73, 0x68,
-0x69, 0x3b, 0x4c, 0x75, 0x73, 0xf2, 0x6c, 0x6f, 0x3b, 0x4d, 0xf9, 0x75, 0x79, 0xe0, 0x3b, 0x4c, 0x75, 0x6d, 0xf9, 0x6e,
-0x67, 0xf9, 0x6c, 0xf9, 0x3b, 0x4c, 0x75, 0x66, 0x75, 0x69, 0x6d, 0x69, 0x3b, 0x4b, 0x61, 0x62, 0xe0, 0x6c, 0xe0, 0x73,
-0x68, 0xec, 0x70, 0xf9, 0x3b, 0x4c, 0xf9, 0x73, 0x68, 0xec, 0x6b, 0xe0, 0x3b, 0x4c, 0x75, 0x74, 0x6f, 0x6e, 0x67, 0x6f,
-0x6c, 0x6f, 0x3b, 0x4c, 0x75, 0x6e, 0x67, 0xf9, 0x64, 0x69, 0x3b, 0x4b, 0x61, 0x73, 0x77, 0xe8, 0x6b, 0xe8, 0x73, 0xe8,
-0x3b, 0x43, 0x69, 0x73, 0x77, 0xe0, 0x43, 0x69, 0x6f, 0x3b, 0x4c, 0x75, 0x69, 0x3b, 0x4c, 0x75, 0x73, 0x3b, 0x4d, 0x75,
-0x75, 0x3b, 0x4c, 0x75, 0x6d, 0x3b, 0x4c, 0x75, 0x66, 0x3b, 0x4b, 0x61, 0x62, 0x3b, 0x4c, 0x75, 0x73, 0x68, 0x3b, 0x4c,
-0x75, 0x74, 0x3b, 0x4c, 0x75, 0x6e, 0x3b, 0x4b, 0x61, 0x73, 0x3b, 0x43, 0x69, 0x73, 0x43, 0x3b, 0x4c, 0x3b, 0x4c, 0x3b,
-0x4d, 0x3b, 0x4c, 0x3b, 0x4c, 0x3b, 0x4b, 0x3b, 0x4c, 0x3b, 0x4c, 0x3b, 0x4c, 0x3b, 0x4b, 0x3b, 0x43, 0x44, 0x77, 0x65,
-0x20, 0x6d, 0x61, 0x72, 0x20, 0x41, 0x63, 0x68, 0x69, 0x65, 0x6c, 0x3b, 0x44, 0x77, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x20,
-0x41, 0x72, 0x69, 0x79, 0x6f, 0x3b, 0x44, 0x77, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x20, 0x41, 0x64, 0x65, 0x6b, 0x3b, 0x44,
-0x77, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x20, 0x41, 0x6e, 0x67, 0x2019, 0x77, 0x65, 0x6e, 0x3b, 0x44, 0x77, 0x65, 0x20, 0x6d,
-0x61, 0x72, 0x20, 0x41, 0x62, 0x69, 0x63, 0x68, 0x3b, 0x44, 0x77, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x20, 0x41, 0x75, 0x63,
-0x68, 0x69, 0x65, 0x6c, 0x3b, 0x44, 0x77, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x20, 0x41, 0x62, 0x69, 0x72, 0x69, 0x79, 0x6f,
-0x3b, 0x44, 0x77, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x20, 0x41, 0x62, 0x6f, 0x72, 0x6f, 0x3b, 0x44, 0x77, 0x65, 0x20, 0x6d,
-0x61, 0x72, 0x20, 0x4f, 0x63, 0x68, 0x69, 0x6b, 0x6f, 0x3b, 0x44, 0x77, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x20, 0x41, 0x70,
-0x61, 0x72, 0x3b, 0x44, 0x77, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x20, 0x67, 0x69, 0x20, 0x61, 0x63, 0x68, 0x69, 0x65, 0x6c,
-0x3b, 0x44, 0x77, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x20, 0x41, 0x70, 0x61, 0x72, 0x20, 0x67, 0x69, 0x20, 0x61, 0x72, 0x69,
-0x79, 0x6f, 0x44, 0x41, 0x43, 0x3b, 0x44, 0x41, 0x52, 0x3b, 0x44, 0x41, 0x44, 0x3b, 0x44, 0x41, 0x4e, 0x3b, 0x44, 0x41,
-0x48, 0x3b, 0x44, 0x41, 0x55, 0x3b, 0x44, 0x41, 0x4f, 0x3b, 0x44, 0x41, 0x42, 0x3b, 0x44, 0x4f, 0x43, 0x3b, 0x44, 0x41,
-0x50, 0x3b, 0x44, 0x47, 0x49, 0x3b, 0x44, 0x41, 0x47, 0x43, 0x3b, 0x52, 0x3b, 0x44, 0x3b, 0x4e, 0x3b, 0x42, 0x3b, 0x55,
-0x3b, 0x42, 0x3b, 0x42, 0x3b, 0x43, 0x3b, 0x50, 0x3b, 0x43, 0x3b, 0x50, 0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x3b, 0x46,
-0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b, 0x4d, 0xe4, 0x65, 0x72, 0x7a, 0x3b, 0x41, 0x62, 0x72, 0xeb, 0x6c, 0x6c, 0x3b,
-0x4d, 0x65, 0x65, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x69, 0x3b, 0x41, 0x75, 0x67, 0x75, 0x73, 0x74,
-0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x4e,
-0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x44, 0x65, 0x7a, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x4a, 0x61, 0x6e, 0x3b,
-0x46, 0x65, 0x62, 0x3b, 0x4d, 0xe4, 0x65, 0x3b, 0x41, 0x62, 0x72, 0x3b, 0x4d, 0x65, 0x65, 0x3b, 0x4a, 0x75, 0x6e, 0x3b,
-0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x75, 0x67, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b,
-0x44, 0x65, 0x7a, 0x4a, 0x61, 0x6e, 0x2e, 0x3b, 0x46, 0x65, 0x62, 0x2e, 0x3b, 0x4d, 0xe4, 0x65, 0x2e, 0x3b, 0x41, 0x62,
-0x72, 0x2e, 0x3b, 0x4d, 0x65, 0x65, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x69, 0x3b, 0x41, 0x75, 0x67,
-0x2e, 0x3b, 0x53, 0x65, 0x70, 0x2e, 0x3b, 0x4f, 0x6b, 0x74, 0x2e, 0x3b, 0x4e, 0x6f, 0x76, 0x2e, 0x3b, 0x44, 0x65, 0x7a,
-0x2e, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x65, 0x69,
-0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x6f, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74,
-0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x73, 0x458, 0x430, 0x43d, 0x443, 0x430, 0x440, 0x438, 0x3b, 0x444, 0x435, 0x432, 0x440,
-0x443, 0x430, 0x440, 0x438, 0x3b, 0x43c, 0x430, 0x440, 0x442, 0x3b, 0x430, 0x43f, 0x440, 0x438, 0x43b, 0x3b, 0x43c, 0x430, 0x458, 0x3b,
-0x458, 0x443, 0x43d, 0x438, 0x3b, 0x458, 0x443, 0x43b, 0x438, 0x3b, 0x430, 0x432, 0x433, 0x443, 0x441, 0x442, 0x3b, 0x441, 0x435, 0x43f,
-0x442, 0x435, 0x43c, 0x432, 0x440, 0x438, 0x3b, 0x43e, 0x43a, 0x442, 0x43e, 0x43c, 0x432, 0x440, 0x438, 0x3b, 0x43d, 0x43e, 0x435, 0x43c,
-0x432, 0x440, 0x438, 0x3b, 0x434, 0x435, 0x43a, 0x435, 0x43c, 0x432, 0x440, 0x438, 0x458, 0x430, 0x43d, 0x2e, 0x3b, 0x444, 0x435, 0x432,
-0x2e, 0x3b, 0x43c, 0x430, 0x440, 0x2e, 0x3b, 0x430, 0x43f, 0x440, 0x2e, 0x3b, 0x43c, 0x430, 0x458, 0x3b, 0x458, 0x443, 0x43d, 0x2e,
-0x3b, 0x458, 0x443, 0x43b, 0x2e, 0x3b, 0x430, 0x432, 0x433, 0x2e, 0x3b, 0x441, 0x435, 0x43f, 0x442, 0x2e, 0x3b, 0x43e, 0x43a, 0x442,
-0x2e, 0x3b, 0x43d, 0x43e, 0x435, 0x43c, 0x2e, 0x3b, 0x434, 0x435, 0x43a, 0x2e, 0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x69, 0x3b,
-0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x3b, 0x41, 0x70, 0x72, 0x69, 0x6c,
-0x79, 0x69, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x79, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x79, 0x61, 0x69, 0x3b,
-0x41, 0x67, 0x75, 0x73, 0x74, 0x69, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4f, 0x6b, 0x74, 0x6f,
-0x62, 0x61, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x44, 0x65, 0x73, 0x65, 0x6d, 0x62, 0x61, 0x4a, 0x61,
-0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x63, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75,
-0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x6f, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f,
-0x76, 0x3b, 0x44, 0x65, 0x73, 0x91c, 0x928, 0x935, 0x930, 0x940, 0x3b, 0x92b, 0x930, 0x935, 0x930, 0x940, 0x3b, 0x92e, 0x93e, 0x930,
-0x94d, 0x91a, 0x3b, 0x905, 0x92a, 0x94d, 0x930, 0x948, 0x932, 0x3b, 0x92e, 0x908, 0x3b, 0x91c, 0x942, 0x928, 0x3b, 0x91c, 0x941, 0x932,
-0x93e, 0x908, 0x3b, 0x905, 0x917, 0x938, 0x94d, 0x924, 0x3b, 0x938, 0x93f, 0x924, 0x902, 0x92c, 0x930, 0x3b, 0x905, 0x915, 0x94d, 0x91f,
-0x942, 0x92c, 0x930, 0x3b, 0x928, 0x935, 0x902, 0x92c, 0x930, 0x3b, 0x926, 0x93f, 0x938, 0x902, 0x92c, 0x930, 0x91c, 0x928, 0x935, 0x930,
-0x940, 0x3b, 0x92b, 0x930, 0x935, 0x930, 0x940, 0x3b, 0x92e, 0x93e, 0x930, 0x94d, 0x91a, 0x3b, 0x905, 0x92a, 0x94d, 0x930, 0x948, 0x932,
-0x3b, 0x92e, 0x908, 0x3b, 0x91c, 0x942, 0x928, 0x3b, 0x91c, 0x941, 0x932, 0x93e, 0x908, 0x3b, 0x905, 0x917, 0x938, 0x94d, 0x924, 0x3b,
-0x938, 0x93f, 0x924, 0x902, 0x92c, 0x930, 0x3b, 0x905, 0x915, 0x94d, 0x924, 0x942, 0x92c, 0x930, 0x3b, 0x928, 0x935, 0x902, 0x92c, 0x930,
-0x3b, 0x926, 0x93f, 0x938, 0x902, 0x92c, 0x930, 0x91c, 0x928, 0x970, 0x3b, 0x92b, 0x930, 0x970, 0x3b, 0x92e, 0x93e, 0x930, 0x94d, 0x91a,
-0x3b, 0x905, 0x92a, 0x94d, 0x930, 0x948, 0x932, 0x3b, 0x92e, 0x908, 0x3b, 0x91c, 0x942, 0x928, 0x3b, 0x91c, 0x941, 0x932, 0x970, 0x3b,
-0x905, 0x917, 0x970, 0x3b, 0x938, 0x93f, 0x924, 0x970, 0x3b, 0x905, 0x915, 0x94d, 0x924, 0x942, 0x970, 0x3b, 0x928, 0x935, 0x970, 0x3b,
-0x926, 0x93f, 0x938, 0x970, 0x91c, 0x3b, 0x92b, 0x3b, 0x92e, 0x93e, 0x3b, 0x905, 0x3b, 0x92e, 0x3b, 0x91c, 0x942, 0x3b, 0x91c, 0x941,
-0x3b, 0x905, 0x3b, 0x938, 0x93f, 0x3b, 0x905, 0x3b, 0x928, 0x3b, 0x926, 0x93f, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x6f,
-0x20, 0x6b, 0x77, 0x61, 0x6e, 0x7a, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x6f, 0x20, 0x75, 0x6e, 0x61,
-0x79, 0x65, 0x6c, 0x69, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x6f, 0x20, 0x75, 0x6e, 0x65, 0x72, 0x61, 0x72,
-0x75, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x6f, 0x20, 0x75, 0x6e, 0x65, 0x63, 0x68, 0x65, 0x73, 0x68, 0x65,
-0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x6f, 0x20, 0x75, 0x6e, 0x65, 0x74, 0x68, 0x61, 0x6e, 0x75, 0x3b, 0x4d,
-0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x6f, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x75, 0x20, 0x6e, 0x61, 0x20, 0x6d, 0x6f, 0x63,
-0x68, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x6f, 0x20, 0x73, 0x61, 0x62, 0x61, 0x3b, 0x4d, 0x77, 0x65,
-0x72, 0x69, 0x20, 0x77, 0x6f, 0x20, 0x6e, 0x61, 0x6e, 0x65, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x6f, 0x20,
-0x74, 0x69, 0x73, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x6f, 0x20, 0x6b, 0x75, 0x6d, 0x69, 0x3b, 0x4d,
-0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x6f, 0x20, 0x6b, 0x75, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x6d, 0x6f, 0x6a, 0x61,
-0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x6f, 0x20, 0x6b, 0x75, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x79, 0x65,
-0x6c, 0x2019, 0x6c, 0x69, 0x4b, 0x77, 0x61, 0x3b, 0x55, 0x6e, 0x61, 0x3b, 0x52, 0x61, 0x72, 0x3b, 0x43, 0x68, 0x65, 0x3b,
-0x54, 0x68, 0x61, 0x3b, 0x4d, 0x6f, 0x63, 0x3b, 0x53, 0x61, 0x62, 0x3b, 0x4e, 0x61, 0x6e, 0x3b, 0x54, 0x69, 0x73, 0x3b,
-0x4b, 0x75, 0x6d, 0x3b, 0x4d, 0x6f, 0x6a, 0x3b, 0x59, 0x65, 0x6c, 0x4b, 0x3b, 0x55, 0x3b, 0x52, 0x3b, 0x43, 0x3b, 0x54,
-0x3b, 0x4d, 0x3b, 0x53, 0x3b, 0x4e, 0x3b, 0x54, 0x3b, 0x4b, 0x3b, 0x4d, 0x3b, 0x59, 0x4d, 0x77, 0x65, 0x64, 0x69, 0x20,
-0x4e, 0x74, 0x61, 0x6e, 0x64, 0x69, 0x3b, 0x4d, 0x77, 0x65, 0x64, 0x69, 0x20, 0x77, 0x61, 0x20, 0x50, 0x69, 0x6c, 0x69,
-0x3b, 0x4d, 0x77, 0x65, 0x64, 0x69, 0x20, 0x77, 0x61, 0x20, 0x54, 0x61, 0x74, 0x75, 0x3b, 0x4d, 0x77, 0x65, 0x64, 0x69,
-0x20, 0x77, 0x61, 0x20, 0x4e, 0x63, 0x68, 0x65, 0x63, 0x68, 0x69, 0x3b, 0x4d, 0x77, 0x65, 0x64, 0x69, 0x20, 0x77, 0x61,
-0x20, 0x4e, 0x6e, 0x79, 0x61, 0x6e, 0x6f, 0x3b, 0x4d, 0x77, 0x65, 0x64, 0x69, 0x20, 0x77, 0x61, 0x20, 0x4e, 0x6e, 0x79,
-0x61, 0x6e, 0x6f, 0x20, 0x6e, 0x61, 0x20, 0x55, 0x6d, 0x6f, 0x3b, 0x4d, 0x77, 0x65, 0x64, 0x69, 0x20, 0x77, 0x61, 0x20,
-0x4e, 0x6e, 0x79, 0x61, 0x6e, 0x6f, 0x20, 0x6e, 0x61, 0x20, 0x4d, 0x69, 0x76, 0x69, 0x6c, 0x69, 0x3b, 0x4d, 0x77, 0x65,
-0x64, 0x69, 0x20, 0x77, 0x61, 0x20, 0x4e, 0x6e, 0x79, 0x61, 0x6e, 0x6f, 0x20, 0x6e, 0x61, 0x20, 0x4d, 0x69, 0x74, 0x61,
-0x74, 0x75, 0x3b, 0x4d, 0x77, 0x65, 0x64, 0x69, 0x20, 0x77, 0x61, 0x20, 0x4e, 0x6e, 0x79, 0x61, 0x6e, 0x6f, 0x20, 0x6e,
-0x61, 0x20, 0x4e, 0x63, 0x68, 0x65, 0x63, 0x68, 0x69, 0x3b, 0x4d, 0x77, 0x65, 0x64, 0x69, 0x20, 0x77, 0x61, 0x20, 0x4e,
-0x6e, 0x79, 0x61, 0x6e, 0x6f, 0x20, 0x6e, 0x61, 0x20, 0x4e, 0x6e, 0x79, 0x61, 0x6e, 0x6f, 0x3b, 0x4d, 0x77, 0x65, 0x64,
-0x69, 0x20, 0x77, 0x61, 0x20, 0x4e, 0x6e, 0x79, 0x61, 0x6e, 0x6f, 0x20, 0x6e, 0x61, 0x20, 0x4e, 0x6e, 0x79, 0x61, 0x6e,
-0x6f, 0x20, 0x6e, 0x61, 0x20, 0x55, 0x3b, 0x4d, 0x77, 0x65, 0x64, 0x69, 0x20, 0x77, 0x61, 0x20, 0x4e, 0x6e, 0x79, 0x61,
-0x6e, 0x6f, 0x20, 0x6e, 0x61, 0x20, 0x4e, 0x6e, 0x79, 0x61, 0x6e, 0x6f, 0x20, 0x6e, 0x61, 0x20, 0x4d, 0x4a, 0x61, 0x6e,
-0x6f, 0x61, 0x72, 0x79, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x6f, 0x61, 0x72, 0x79, 0x3b, 0x4d, 0x61, 0x72, 0x74, 0x73, 0x61,
-0x3b, 0x41, 0x70, 0x72, 0x69, 0x6c, 0x79, 0x3b, 0x4d, 0x65, 0x79, 0x3b, 0x4a, 0x6f, 0x6e, 0x61, 0x3b, 0x4a, 0x6f, 0x6c,
-0x61, 0x79, 0x3b, 0x41, 0x6f, 0x67, 0x6f, 0x73, 0x69, 0x74, 0x72, 0x61, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x61, 0x6d, 0x62,
-0x72, 0x61, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x72, 0x61, 0x3b, 0x4e, 0x6f, 0x76, 0x61, 0x6d, 0x62, 0x72, 0x61, 0x3b,
-0x44, 0x65, 0x73, 0x61, 0x6d, 0x62, 0x72, 0x61, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b,
-0x41, 0x70, 0x72, 0x3b, 0x4d, 0x65, 0x79, 0x3b, 0x4a, 0x6f, 0x6e, 0x3b, 0x4a, 0x6f, 0x6c, 0x3b, 0x41, 0x6f, 0x67, 0x3b,
-0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x73, 0xd1c, 0xd28, 0xd41, 0xd35, 0xd30,
-0xd3f, 0x3b, 0xd2b, 0xd46, 0xd2c, 0xd4d, 0xd30, 0xd41, 0xd35, 0xd30, 0xd3f, 0x3b, 0xd2e, 0xd3e, 0xd7c, 0xd1a, 0xd4d, 0xd1a, 0xd4d, 0x3b,
-0xd0f, 0xd2a, 0xd4d, 0xd30, 0xd3f, 0xd7d, 0x3b, 0xd2e, 0xd47, 0xd2f, 0xd4d, 0x3b, 0xd1c, 0xd42, 0xd7a, 0x3b, 0xd1c, 0xd42, 0xd32, 0xd48,
-0x3b, 0xd13, 0xd17, 0xd38, 0xd4d, 0xd31, 0xd4d, 0xd31, 0xd4d, 0x3b, 0xd38, 0xd46, 0xd2a, 0xd4d, 0xd31, 0xd4d, 0xd31, 0xd02, 0xd2c, 0xd7c,
-0x3b, 0xd12, 0xd15, 0xd4d, 0x200c, 0xd1f, 0xd4b, 0xd2c, 0xd7c, 0x3b, 0xd28, 0xd35, 0xd02, 0xd2c, 0xd7c, 0x3b, 0xd21, 0xd3f, 0xd38, 0xd02,
-0xd2c, 0xd7c, 0xd1c, 0xd28, 0xd41, 0x3b, 0xd2b, 0xd46, 0xd2c, 0xd4d, 0xd30, 0xd41, 0x3b, 0xd2e, 0xd3e, 0xd7c, 0x3b, 0xd0f, 0xd2a, 0xd4d,
-0xd30, 0xd3f, 0x3b, 0xd2e, 0xd47, 0xd2f, 0xd4d, 0x3b, 0xd1c, 0xd42, 0xd7a, 0x3b, 0xd1c, 0xd42, 0xd32, 0xd48, 0x3b, 0xd13, 0xd17, 0x3b,
-0xd38, 0xd46, 0xd2a, 0xd4d, 0xd31, 0xd4d, 0xd31, 0xd02, 0x3b, 0xd12, 0xd15, 0xd4d, 0xd1f, 0xd4b, 0x3b, 0xd28, 0xd35, 0xd02, 0x3b, 0xd21,
-0xd3f, 0xd38, 0xd02, 0xd1c, 0x3b, 0xd2b, 0xd46, 0x3b, 0xd2e, 0xd3e, 0x3b, 0xd0f, 0x3b, 0xd2e, 0xd46, 0x3b, 0xd1c, 0xd42, 0xd7a, 0x3b,
-0xd1c, 0xd42, 0x3b, 0xd13, 0x3b, 0xd38, 0xd46, 0x3b, 0xd12, 0x3b, 0xd28, 0x3b, 0xd21, 0xd3f, 0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72,
-0x69, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x4d, 0x61, 0x63, 0x3b, 0x41, 0x70, 0x72, 0x69, 0x6c,
-0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x61, 0x69, 0x3b, 0x4f, 0x67, 0x6f, 0x73, 0x3b,
-0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x4e, 0x6f,
-0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x44, 0x69, 0x73, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x4a, 0x61, 0x6e, 0x3b, 0x46,
-0x65, 0x62, 0x3b, 0x4d, 0x61, 0x63, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a,
-0x75, 0x6c, 0x3b, 0x4f, 0x67, 0x6f, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44,
-0x69, 0x73, 0x4a, 0x61, 0x6e, 0x6e, 0x61, 0x72, 0x3b, 0x46, 0x72, 0x61, 0x72, 0x3b, 0x4d, 0x61, 0x72, 0x7a, 0x75, 0x3b,
-0x41, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x65, 0x6a, 0x6a, 0x75, 0x3b, 0x120, 0x75, 0x6e, 0x6a, 0x75, 0x3b, 0x4c, 0x75,
-0x6c, 0x6a, 0x75, 0x3b, 0x41, 0x77, 0x77, 0x69, 0x73, 0x73, 0x75, 0x3b, 0x53, 0x65, 0x74, 0x74, 0x65, 0x6d, 0x62, 0x72,
-0x75, 0x3b, 0x4f, 0x74, 0x74, 0x75, 0x62, 0x72, 0x75, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x75, 0x3b, 0x44,
-0x69, 0x10b, 0x65, 0x6d, 0x62, 0x72, 0x75, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x72, 0x61, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41,
-0x70, 0x72, 0x3b, 0x4d, 0x65, 0x6a, 0x3b, 0x120, 0x75, 0x6e, 0x3b, 0x4c, 0x75, 0x6c, 0x3b, 0x41, 0x77, 0x77, 0x3b, 0x53,
-0x65, 0x74, 0x3b, 0x4f, 0x74, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x69, 0x10b, 0x4a, 0x6e, 0x3b, 0x46, 0x72, 0x3b,
-0x4d, 0x7a, 0x3b, 0x41, 0x70, 0x3b, 0x4d, 0x6a, 0x3b, 0x120, 0x6e, 0x3b, 0x4c, 0x6a, 0x3b, 0x41, 0x77, 0x3b, 0x53, 0x74,
-0x3b, 0x4f, 0x62, 0x3b, 0x4e, 0x76, 0x3b, 0x44, 0x10b, 0x4a, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x120,
-0x3b, 0x4c, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x99c, 0x9be, 0x9a8, 0x9c1, 0x9f1, 0x9be, 0x9b0, 0x9bf,
-0x3b, 0x9ab, 0x9c7, 0x9ac, 0x9cd, 0x9b0, 0x9c1, 0x9f1, 0x9be, 0x9b0, 0x9bf, 0x3b, 0x9ae, 0x9be, 0x9b0, 0x9cd, 0x99a, 0x3b, 0x98f, 0x9aa,
-0x9cd, 0x9b0, 0x9bf, 0x9b2, 0x3b, 0x9ae, 0x9c7, 0x3b, 0x99c, 0x9c1, 0x9a8, 0x3b, 0x99c, 0x9c1, 0x9b2, 0x9be, 0x987, 0x3b, 0x993, 0x997,
-0x9b7, 0x9cd, 0x99f, 0x3b, 0x9b8, 0x9c7, 0x9aa, 0x9cd, 0x99f, 0x9c7, 0x9ae, 0x9cd, 0x9ac, 0x9b0, 0x3b, 0x993, 0x995, 0x9cd, 0x99f, 0x9cb,
-0x9ac, 0x9b0, 0x3b, 0x9a8, 0x9ac, 0x9c7, 0x9ae, 0x9cd, 0x9ac, 0x9b0, 0x3b, 0x9a1, 0x9bf, 0x9b8, 0x9c7, 0x9ae, 0x9cd, 0x9ac, 0x9b0, 0x99c,
-0x9be, 0x9a8, 0x9c1, 0x9f1, 0x9be, 0x9b0, 0x9bf, 0x3b, 0x9ab, 0x9c7, 0x9ac, 0x9cd, 0x9b0, 0x9c1, 0x9f1, 0x9be, 0x9b0, 0x9bf, 0x3b, 0x9ae,
-0x9be, 0x9b0, 0x9cd, 0x99a, 0x3b, 0x98f, 0x9aa, 0x9cd, 0x9b0, 0x9bf, 0x9b2, 0x3b, 0x9ae, 0x9c7, 0x3b, 0x99c, 0x9c1, 0x9a8, 0x3b, 0x99c,
-0x9c1, 0x9b2, 0x9be, 0x987, 0x3b, 0x986, 0x997, 0x9b8, 0x9cd, 0x99f, 0x3b, 0x9b8, 0x9c7, 0x9aa, 0x9cd, 0x99f, 0x9c7, 0x9ae, 0x9cd, 0x9ac,
-0x9b0, 0x3b, 0x993, 0x995, 0x9cd, 0x99f, 0x9cb, 0x9ac, 0x9b0, 0x3b, 0x9a8, 0x9ad, 0x9c7, 0x9ae, 0x9cd, 0x9ac, 0x9b0, 0x3b, 0x9a1, 0x9bf,
-0x9b8, 0x9c7, 0x9ae, 0x9cd, 0x9ac, 0x9b0, 0x99c, 0x9be, 0x9a8, 0x9c1, 0x3b, 0x9ab, 0x9c7, 0x9ac, 0x9cd, 0x9b0, 0x9c1, 0x3b, 0x9ae, 0x9be,
-0x9b0, 0x3b, 0x98f, 0x9aa, 0x9cd, 0x9b0, 0x9bf, 0x3b, 0x9ae, 0x9c7, 0x3b, 0x99c, 0x9c1, 0x9a8, 0x3b, 0x99c, 0x9c1, 0x9b2, 0x9be, 0x3b,
-0x986, 0x997, 0x3b, 0x9b8, 0x9c7, 0x9aa, 0x9cd, 0x99f, 0x3b, 0x993, 0x995, 0x9cd, 0x99f, 0x9cb, 0x3b, 0x9a8, 0x9ad, 0x9c7, 0x3b, 0x9a1,
-0x9bf, 0x9b8, 0x9c7, 0x99c, 0x9be, 0x3b, 0x9ab, 0x9c7, 0x3b, 0x9ae, 0x9be, 0x9b0, 0x3b, 0x98f, 0x9aa, 0x3b, 0x9ae, 0x9c7, 0x3b, 0x99c,
-0x9c1, 0x9a8, 0x3b, 0x99c, 0x9c1, 0x9b2, 0x3b, 0x986, 0x3b, 0x9b8, 0x9c7, 0x3b, 0x993, 0x3b, 0x9a8, 0x9ac, 0x3b, 0x9a1, 0x9bf, 0x99c,
-0x9be, 0x3b, 0x9ab, 0x9c7, 0x3b, 0x9ae, 0x9be, 0x9b0, 0x3b, 0x98f, 0x9aa, 0x3b, 0x9ae, 0x9c7, 0x3b, 0x99c, 0x9c1, 0x9a8, 0x3b, 0x99c,
-0x9c1, 0x9b2, 0x3b, 0x986, 0x3b, 0x9b8, 0x9c7, 0x3b, 0x993, 0x995, 0x3b, 0x9a8, 0x9ac, 0x3b, 0x9a1, 0x9bf, 0x4a, 0x65, 0x72, 0x72,
-0x65, 0x79, 0x2d, 0x67, 0x65, 0x75, 0x72, 0x65, 0x65, 0x3b, 0x54, 0x6f, 0x73, 0x68, 0x69, 0x61, 0x67, 0x68, 0x74, 0x2d,
-0x61, 0x72, 0x72, 0x65, 0x65, 0x3b, 0x4d, 0x61, 0x79, 0x72, 0x6e, 0x74, 0x3b, 0x41, 0x76, 0x65, 0x72, 0x69, 0x6c, 0x3b,
-0x42, 0x6f, 0x61, 0x6c, 0x64, 0x79, 0x6e, 0x3b, 0x4d, 0x65, 0x61, 0x6e, 0x2d, 0x73, 0x6f, 0x75, 0x72, 0x65, 0x65, 0x3b,
-0x4a, 0x65, 0x72, 0x72, 0x65, 0x79, 0x2d, 0x73, 0x6f, 0x75, 0x72, 0x65, 0x65, 0x3b, 0x4c, 0x75, 0x61, 0x6e, 0x69, 0x73,
-0x74, 0x79, 0x6e, 0x3b, 0x4d, 0x65, 0x61, 0x6e, 0x2d, 0x66, 0x6f, 0x75, 0x79, 0x69, 0x72, 0x3b, 0x4a, 0x65, 0x72, 0x72,
-0x65, 0x79, 0x2d, 0x66, 0x6f, 0x75, 0x79, 0x69, 0x72, 0x3b, 0x4d, 0x65, 0x65, 0x20, 0x48, 0x6f, 0x75, 0x6e, 0x65, 0x79,
-0x3b, 0x4d, 0x65, 0x65, 0x20, 0x6e, 0x79, 0x20, 0x4e, 0x6f, 0x6c, 0x6c, 0x69, 0x63, 0x6b, 0x4a, 0x2d, 0x67, 0x75, 0x65,
-0x72, 0x3b, 0x54, 0x2d, 0x61, 0x72, 0x72, 0x65, 0x65, 0x3b, 0x4d, 0x61, 0x79, 0x72, 0x6e, 0x74, 0x3b, 0x41, 0x76, 0x72,
-0x72, 0x69, 0x6c, 0x3b, 0x42, 0x6f, 0x61, 0x6c, 0x64, 0x79, 0x6e, 0x3b, 0x4d, 0x2d, 0x73, 0x6f, 0x75, 0x72, 0x65, 0x65,
-0x3b, 0x4a, 0x2d, 0x73, 0x6f, 0x75, 0x72, 0x65, 0x65, 0x3b, 0x4c, 0x75, 0x61, 0x6e, 0x69, 0x73, 0x74, 0x79, 0x6e, 0x3b,
-0x4d, 0x2d, 0x66, 0x6f, 0x75, 0x79, 0x69, 0x72, 0x3b, 0x4a, 0x2d, 0x66, 0x6f, 0x75, 0x79, 0x69, 0x72, 0x3b, 0x4d, 0x2d,
-0x48, 0x6f, 0x75, 0x6e, 0x65, 0x79, 0x3b, 0x4d, 0x2d, 0x4e, 0x6f, 0x6c, 0x6c, 0x69, 0x63, 0x6b, 0x4b, 0x6f, 0x68, 0x69,
-0x74, 0x101, 0x74, 0x65, 0x61, 0x3b, 0x48, 0x75, 0x69, 0x74, 0x61, 0x6e, 0x67, 0x75, 0x72, 0x75, 0x3b, 0x50, 0x6f, 0x75,
-0x74, 0x16b, 0x74, 0x65, 0x72, 0x61, 0x6e, 0x67, 0x69, 0x3b, 0x50, 0x61, 0x65, 0x6e, 0x67, 0x61, 0x77, 0x68, 0x101, 0x77,
-0x68, 0x101, 0x3b, 0x48, 0x61, 0x72, 0x61, 0x74, 0x75, 0x61, 0x3b, 0x50, 0x69, 0x70, 0x69, 0x72, 0x69, 0x3b, 0x48, 0x14d,
-0x6e, 0x67, 0x6f, 0x6e, 0x67, 0x6f, 0x69, 0x3b, 0x48, 0x65, 0x72, 0x65, 0x74, 0x75, 0x72, 0x69, 0x6b, 0x14d, 0x6b, 0x101,
-0x3b, 0x4d, 0x61, 0x68, 0x75, 0x72, 0x75, 0x3b, 0x57, 0x68, 0x69, 0x72, 0x69, 0x6e, 0x67, 0x61, 0x2d, 0x101, 0x2d, 0x6e,
-0x75, 0x6b, 0x75, 0x3b, 0x57, 0x68, 0x69, 0x72, 0x69, 0x6e, 0x67, 0x61, 0x2d, 0x101, 0x2d, 0x72, 0x61, 0x6e, 0x67, 0x69,
-0x3b, 0x48, 0x61, 0x6b, 0x69, 0x68, 0x65, 0x61, 0x4b, 0x6f, 0x68, 0x69, 0x3b, 0x48, 0x75, 0x69, 0x3b, 0x50, 0x6f, 0x75,
-0x3b, 0x50, 0x61, 0x65, 0x3b, 0x48, 0x61, 0x72, 0x61, 0x3b, 0x50, 0x69, 0x70, 0x69, 0x3b, 0x48, 0x14d, 0x6e, 0x67, 0x6f,
-0x3b, 0x48, 0x65, 0x72, 0x65, 0x3b, 0x4d, 0x61, 0x68, 0x75, 0x3b, 0x4e, 0x75, 0x6b, 0x75, 0x3b, 0x52, 0x61, 0x6e, 0x67,
-0x69, 0x3b, 0x48, 0x61, 0x6b, 0x69, 0x4b, 0x3b, 0x48, 0x3b, 0x50, 0x3b, 0x50, 0x3b, 0x48, 0x3b, 0x50, 0x3b, 0x48, 0x3b,
-0x48, 0x3b, 0x4d, 0x3b, 0x4e, 0x3b, 0x52, 0x3b, 0x48, 0x91c, 0x93e, 0x928, 0x947, 0x935, 0x93e, 0x930, 0x940, 0x3b, 0x92b, 0x947,
-0x92c, 0x94d, 0x930, 0x941, 0x935, 0x93e, 0x930, 0x940, 0x3b, 0x92e, 0x93e, 0x930, 0x94d, 0x91a, 0x3b, 0x90f, 0x92a, 0x94d, 0x930, 0x93f,
-0x932, 0x3b, 0x92e, 0x947, 0x3b, 0x91c, 0x942, 0x928, 0x3b, 0x91c, 0x941, 0x932, 0x948, 0x3b, 0x911, 0x917, 0x938, 0x94d, 0x91f, 0x3b,
-0x938, 0x92a, 0x94d, 0x91f, 0x947, 0x902, 0x92c, 0x930, 0x3b, 0x911, 0x915, 0x94d, 0x91f, 0x94b, 0x92c, 0x930, 0x3b, 0x928, 0x94b, 0x935,
-0x94d, 0x939, 0x947, 0x902, 0x92c, 0x930, 0x3b, 0x921, 0x93f, 0x938, 0x947, 0x902, 0x92c, 0x930, 0x91c, 0x93e, 0x928, 0x947, 0x3b, 0x92b,
-0x947, 0x92c, 0x94d, 0x930, 0x941, 0x3b, 0x92e, 0x93e, 0x930, 0x94d, 0x91a, 0x3b, 0x90f, 0x92a, 0x94d, 0x930, 0x93f, 0x3b, 0x92e, 0x947,
-0x3b, 0x91c, 0x942, 0x928, 0x3b, 0x91c, 0x941, 0x932, 0x948, 0x3b, 0x911, 0x917, 0x3b, 0x938, 0x92a, 0x94d, 0x91f, 0x947, 0x902, 0x3b,
-0x911, 0x915, 0x94d, 0x91f, 0x94b, 0x3b, 0x928, 0x94b, 0x935, 0x94d, 0x939, 0x947, 0x902, 0x3b, 0x921, 0x93f, 0x938, 0x947, 0x902, 0x91c,
-0x93e, 0x3b, 0x92b, 0x947, 0x3b, 0x92e, 0x93e, 0x3b, 0x90f, 0x3b, 0x92e, 0x947, 0x3b, 0x91c, 0x942, 0x3b, 0x91c, 0x941, 0x3b, 0x911,
-0x3b, 0x938, 0x3b, 0x911, 0x3b, 0x928, 0x94b, 0x3b, 0x921, 0x93f, 0x4f, 0x6c, 0x61, 0x64, 0x61, 0x6c, 0x289, 0x301, 0x3b, 0x41,
-0x72, 0xe1, 0x74, 0x3b, 0x186, 0x25b, 0x6e, 0x268, 0x301, 0x254, 0x268, 0x14b, 0x254, 0x6b, 0x3b, 0x4f, 0x6c, 0x6f, 0x64, 0x6f,
-0x79, 0xed, 0xf3, 0x72, 0xed, 0xea, 0x20, 0x69, 0x6e, 0x6b, 0xf3, 0x6b, 0xfa, 0xe2, 0x3b, 0x4f, 0x6c, 0x6f, 0x69, 0x6c,
-0xe9, 0x70, 0x16b, 0x6e, 0x79, 0x12b, 0x113, 0x20, 0x69, 0x6e, 0x6b, 0xf3, 0x6b, 0xfa, 0xe2, 0x3b, 0x4b, 0xfa, 0x6a, 0xfa,
-0x254, 0x72, 0x254, 0x6b, 0x3b, 0x4d, 0xf3, 0x72, 0x75, 0x73, 0xe1, 0x73, 0x69, 0x6e, 0x3b, 0x186, 0x6c, 0x254, 0x301, 0x268,
-0x301, 0x62, 0x254, 0x301, 0x72, 0xe1, 0x72, 0x25b, 0x3b, 0x4b, 0xfa, 0x73, 0x68, 0xee, 0x6e, 0x3b, 0x4f, 0x6c, 0x67, 0xed,
-0x73, 0x61, 0x6e, 0x3b, 0x50, 0x289, 0x73, 0x68, 0x289, 0x301, 0x6b, 0x61, 0x3b, 0x4e, 0x74, 0x289, 0x301, 0x14b, 0x289, 0x301,
-0x73, 0x44, 0x61, 0x6c, 0x3b, 0x41, 0x72, 0xe1, 0x3b, 0x186, 0x25b, 0x6e, 0x3b, 0x44, 0x6f, 0x79, 0x3b, 0x4c, 0xe9, 0x70,
-0x3b, 0x52, 0x6f, 0x6b, 0x3b, 0x53, 0xe1, 0x73, 0x3b, 0x42, 0x254, 0x301, 0x72, 0x3b, 0x4b, 0xfa, 0x73, 0x3b, 0x47, 0xed,
-0x73, 0x3b, 0x53, 0x68, 0x289, 0x301, 0x3b, 0x4e, 0x74, 0x289, 0x301, 0x698, 0x627, 0x646, 0x648, 0x6cc, 0x647, 0x3b, 0x641, 0x648,
-0x631, 0x6cc, 0x647, 0x3b, 0x645, 0x627, 0x631, 0x633, 0x3b, 0x622, 0x648, 0x631, 0x6cc, 0x644, 0x3b, 0x645, 0x647, 0x3b, 0x698, 0x648,
-0x626, 0x646, 0x3b, 0x698, 0x648, 0x626, 0x6cc, 0x647, 0x3b, 0x627, 0x648, 0x62a, 0x3b, 0x633, 0x67e, 0x62a, 0x627, 0x645, 0x628, 0x631,
-0x3b, 0x627, 0x6a9, 0x62a, 0x628, 0x631, 0x3b, 0x646, 0x648, 0x627, 0x645, 0x628, 0x631, 0x3b, 0x62f, 0x633, 0x627, 0x645, 0x628, 0x631,
-0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x129, 0x3b, 0x46, 0x65, 0x62, 0x75, 0x72, 0x75, 0x61, 0x72, 0x129, 0x3b, 0x4d, 0x61,
-0x63, 0x68, 0x69, 0x3b, 0x128, 0x70, 0x75, 0x72, 0x169, 0x3b, 0x4d, 0x129, 0x129, 0x3b, 0x4e, 0x6a, 0x75, 0x6e, 0x69, 0x3b,
-0x4e, 0x6a, 0x75, 0x72, 0x61, 0x129, 0x3b, 0x41, 0x67, 0x61, 0x73, 0x74, 0x69, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d,
-0x62, 0x61, 0x3b, 0x4f, 0x6b, 0x74, 0x169, 0x62, 0x61, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x44, 0x69,
-0x63, 0x65, 0x6d, 0x62, 0x61, 0x4a, 0x41, 0x4e, 0x3b, 0x46, 0x45, 0x42, 0x3b, 0x4d, 0x41, 0x43, 0x3b, 0x128, 0x50, 0x55,
-0x3b, 0x4d, 0x128, 0x128, 0x3b, 0x4e, 0x4a, 0x55, 0x3b, 0x4e, 0x4a, 0x52, 0x3b, 0x41, 0x47, 0x41, 0x3b, 0x53, 0x50, 0x54,
-0x3b, 0x4f, 0x4b, 0x54, 0x3b, 0x4e, 0x4f, 0x56, 0x3b, 0x44, 0x45, 0x43, 0x4a, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x128, 0x3b,
-0x4d, 0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x69, 0x6d, 0x259, 0x67, 0x20,
-0x6d, 0x62, 0x65, 0x67, 0x74, 0x75, 0x67, 0x3b, 0x69, 0x6d, 0x65, 0x67, 0x20, 0xe0, 0x62, 0xf9, 0x62, 0xec, 0x3b, 0x69,
-0x6d, 0x65, 0x67, 0x20, 0x6d, 0x62, 0x259, 0x14b, 0x63, 0x68, 0x75, 0x62, 0x69, 0x3b, 0x69, 0x6d, 0x259, 0x67, 0x20, 0x6e,
-0x67, 0x77, 0x259, 0x300, 0x74, 0x3b, 0x69, 0x6d, 0x259, 0x67, 0x20, 0x66, 0x6f, 0x67, 0x3b, 0x69, 0x6d, 0x259, 0x67, 0x20,
-0x69, 0x63, 0x68, 0x69, 0x69, 0x62, 0x254, 0x64, 0x3b, 0x69, 0x6d, 0x259, 0x67, 0x20, 0xe0, 0x64, 0xf9, 0x6d, 0x62, 0x259,
-0x300, 0x14b, 0x3b, 0x69, 0x6d, 0x259, 0x67, 0x20, 0x69, 0x63, 0x68, 0x69, 0x6b, 0x61, 0x3b, 0x69, 0x6d, 0x259, 0x67, 0x20,
-0x6b, 0x75, 0x64, 0x3b, 0x69, 0x6d, 0x259, 0x67, 0x20, 0x74, 0xe8, 0x73, 0x69, 0x2bc, 0x65, 0x3b, 0x69, 0x6d, 0x259, 0x67,
-0x20, 0x7a, 0xf2, 0x3b, 0x69, 0x6d, 0x259, 0x67, 0x20, 0x6b, 0x72, 0x69, 0x7a, 0x6d, 0x65, 0x64, 0x6d, 0x62, 0x65, 0x67,
-0x74, 0x75, 0x67, 0x3b, 0x69, 0x6d, 0x65, 0x67, 0x20, 0xe0, 0x62, 0xf9, 0x62, 0xec, 0x3b, 0x69, 0x6d, 0x65, 0x67, 0x20,
-0x6d, 0x62, 0x259, 0x14b, 0x63, 0x68, 0x75, 0x62, 0x69, 0x3b, 0x69, 0x6d, 0x259, 0x67, 0x20, 0x6e, 0x67, 0x77, 0x259, 0x300,
-0x74, 0x3b, 0x69, 0x6d, 0x259, 0x67, 0x20, 0x66, 0x6f, 0x67, 0x3b, 0x69, 0x6d, 0x259, 0x67, 0x20, 0x69, 0x63, 0x68, 0x69,
-0x69, 0x62, 0x254, 0x64, 0x3b, 0x69, 0x6d, 0x259, 0x67, 0x20, 0xe0, 0x64, 0xf9, 0x6d, 0x62, 0x259, 0x300, 0x14b, 0x3b, 0x69,
-0x6d, 0x259, 0x67, 0x20, 0x69, 0x63, 0x68, 0x69, 0x6b, 0x61, 0x3b, 0x69, 0x6d, 0x259, 0x67, 0x20, 0x6b, 0x75, 0x64, 0x3b,
-0x69, 0x6d, 0x259, 0x67, 0x20, 0x74, 0xe8, 0x73, 0x69, 0x2bc, 0x65, 0x3b, 0x69, 0x6d, 0x259, 0x67, 0x20, 0x7a, 0xf2, 0x3b,
-0x69, 0x6d, 0x259, 0x67, 0x20, 0x6b, 0x72, 0x69, 0x7a, 0x6d, 0x65, 0x64, 0x4d, 0x31, 0x3b, 0x41, 0x32, 0x3b, 0x4d, 0x33,
-0x3b, 0x4e, 0x34, 0x3b, 0x46, 0x35, 0x3b, 0x49, 0x36, 0x3b, 0x41, 0x37, 0x3b, 0x49, 0x38, 0x3b, 0x4b, 0x39, 0x3b, 0x31,
-0x30, 0x3b, 0x31, 0x31, 0x3b, 0x31, 0x32, 0x41d, 0x44d, 0x433, 0x434, 0x4af, 0x433, 0x44d, 0x44d, 0x440, 0x20, 0x441, 0x430, 0x440,
-0x3b, 0x425, 0x43e, 0x451, 0x440, 0x434, 0x443, 0x433, 0x430, 0x430, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x413, 0x443, 0x440, 0x430,
-0x432, 0x434, 0x443, 0x433, 0x430, 0x430, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x414, 0x4e9, 0x440, 0x4e9, 0x432, 0x434, 0x4af, 0x433,
-0x44d, 0x44d, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x422, 0x430, 0x432, 0x434, 0x443, 0x433, 0x430, 0x430, 0x440, 0x20, 0x441, 0x430,
-0x440, 0x3b, 0x417, 0x443, 0x440, 0x433, 0x430, 0x430, 0x434, 0x443, 0x433, 0x430, 0x430, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x414,
-0x43e, 0x43b, 0x43e, 0x43e, 0x434, 0x443, 0x433, 0x430, 0x430, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x41d, 0x430, 0x439, 0x43c, 0x434,
-0x443, 0x433, 0x430, 0x430, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x415, 0x441, 0x434, 0x4af, 0x433, 0x44d, 0x44d, 0x440, 0x20, 0x441,
-0x430, 0x440, 0x3b, 0x410, 0x440, 0x430, 0x432, 0x434, 0x443, 0x433, 0x430, 0x430, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x410, 0x440,
-0x432, 0x430, 0x43d, 0x20, 0x43d, 0x44d, 0x433, 0x434, 0x4af, 0x433, 0x44d, 0x44d, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x410, 0x440,
-0x432, 0x430, 0x43d, 0x20, 0x445, 0x43e, 0x451, 0x440, 0x434, 0x443, 0x433, 0x430, 0x430, 0x440, 0x20, 0x441, 0x430, 0x440, 0x43d, 0x44d,
-0x433, 0x434, 0x4af, 0x433, 0x44d, 0x44d, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x445, 0x43e, 0x451, 0x440, 0x434, 0x443, 0x433, 0x430,
-0x430, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x433, 0x443, 0x440, 0x430, 0x432, 0x434, 0x443, 0x433, 0x430, 0x430, 0x440, 0x20, 0x441,
-0x430, 0x440, 0x3b, 0x434, 0x4e9, 0x440, 0x4e9, 0x432, 0x434, 0x4af, 0x433, 0x44d, 0x44d, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x442,
-0x430, 0x432, 0x434, 0x443, 0x433, 0x430, 0x430, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x437, 0x443, 0x440, 0x433, 0x430, 0x430, 0x434,
-0x443, 0x433, 0x430, 0x430, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x434, 0x43e, 0x43b, 0x43e, 0x43e, 0x434, 0x443, 0x433, 0x430, 0x430,
-0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x43d, 0x430, 0x439, 0x43c, 0x434, 0x443, 0x433, 0x430, 0x430, 0x440, 0x20, 0x441, 0x430, 0x440,
-0x3b, 0x435, 0x441, 0x434, 0x4af, 0x433, 0x44d, 0x44d, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x430, 0x440, 0x430, 0x432, 0x434, 0x443,
-0x433, 0x430, 0x430, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x430, 0x440, 0x432, 0x430, 0x43d, 0x20, 0x43d, 0x44d, 0x433, 0x434, 0x4af,
-0x433, 0x44d, 0x44d, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x430, 0x440, 0x432, 0x430, 0x43d, 0x20, 0x445, 0x43e, 0x451, 0x440, 0x434,
-0x443, 0x433, 0x430, 0x430, 0x440, 0x20, 0x441, 0x430, 0x440, 0x31, 0x2d, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x32, 0x2d, 0x440,
-0x20, 0x441, 0x430, 0x440, 0x3b, 0x33, 0x2d, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x34, 0x2d, 0x440, 0x20, 0x441, 0x430, 0x440,
-0x3b, 0x35, 0x2d, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x36, 0x2d, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x37, 0x2d, 0x440,
-0x20, 0x441, 0x430, 0x440, 0x3b, 0x38, 0x2d, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x39, 0x2d, 0x440, 0x20, 0x441, 0x430, 0x440,
-0x3b, 0x31, 0x30, 0x2d, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x31, 0x31, 0x2d, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x31,
-0x32, 0x2d, 0x440, 0x20, 0x441, 0x430, 0x440, 0x49, 0x3b, 0x49, 0x49, 0x3b, 0x49, 0x49, 0x49, 0x3b, 0x49, 0x56, 0x3b, 0x56,
-0x3b, 0x56, 0x49, 0x3b, 0x56, 0x49, 0x49, 0x3b, 0x56, 0x49, 0x49, 0x49, 0x3b, 0x49, 0x58, 0x3b, 0x58, 0x3b, 0x58, 0x49,
-0x3b, 0x58, 0x49, 0x49, 0x7a, 0x61, 0x6e, 0x76, 0x69, 0x65, 0x3b, 0x66, 0x65, 0x76, 0x72, 0x69, 0x79, 0x65, 0x3b, 0x6d,
-0x61, 0x72, 0x73, 0x3b, 0x61, 0x76, 0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x65, 0x3b, 0x7a, 0x69, 0x6e, 0x3b, 0x7a, 0x69, 0x6c,
-0x79, 0x65, 0x3b, 0x6f, 0x75, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x61, 0x6d, 0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x62, 0x3b,
-0x6e, 0x6f, 0x76, 0x61, 0x6d, 0x3b, 0x64, 0x65, 0x73, 0x61, 0x6d, 0x7a, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x76, 0x3b, 0x6d,
-0x61, 0x72, 0x3b, 0x61, 0x76, 0x72, 0x3b, 0x6d, 0x65, 0x3b, 0x7a, 0x69, 0x6e, 0x3b, 0x7a, 0x69, 0x6c, 0x3b, 0x6f, 0x75,
-0x74, 0x3b, 0x73, 0x65, 0x70, 0x3b, 0x6f, 0x6b, 0x74, 0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64, 0x65, 0x73, 0x7a, 0x3b, 0x66,
-0x3b, 0x6d, 0x3b, 0x61, 0x3b, 0x6d, 0x3b, 0x7a, 0x3b, 0x7a, 0x3b, 0x6f, 0x3b, 0x73, 0x3b, 0x6f, 0x3b, 0x6e, 0x3b, 0x64,
-0x46, 0x129, 0x69, 0x20, 0x4c, 0x6f, 0x6f, 0x3b, 0x43, 0x6f, 0x6b, 0x63, 0x77, 0x61, 0x6b, 0x6c, 0x61, 0x14b, 0x6e, 0x65,
-0x3b, 0x43, 0x6f, 0x6b, 0x63, 0x77, 0x61, 0x6b, 0x6c, 0x69, 0x69, 0x3b, 0x46, 0x129, 0x69, 0x20, 0x4d, 0x61, 0x72, 0x66,
-0x6f, 0x6f, 0x3b, 0x4d, 0x61, 0x64, 0x1dd, 0x1dd, 0x75, 0x75, 0x74, 0x1dd, 0x62, 0x69, 0x6a, 0x61, 0x14b, 0x3b, 0x4d, 0x61,
-0x6d, 0x1dd, 0x14b, 0x67, 0x77, 0xe3, 0x61, 0x66, 0x61, 0x68, 0x62, 0x69, 0x69, 0x3b, 0x4d, 0x61, 0x6d, 0x1dd, 0x14b, 0x67,
-0x77, 0xe3, 0x61, 0x6c, 0x69, 0x69, 0x3b, 0x4d, 0x61, 0x64, 0x1dd, 0x6d, 0x62, 0x69, 0x69, 0x3b, 0x46, 0x129, 0x69, 0x20,
-0x44, 0x1dd, 0x253, 0x6c, 0x69, 0x69, 0x3b, 0x46, 0x129, 0x69, 0x20, 0x4d, 0x75, 0x6e, 0x64, 0x61, 0x14b, 0x3b, 0x46, 0x129,
-0x69, 0x20, 0x47, 0x77, 0x61, 0x68, 0x6c, 0x6c, 0x65, 0x3b, 0x46, 0x129, 0x69, 0x20, 0x59, 0x75, 0x72, 0x75, 0x46, 0x4c,
-0x4f, 0x3b, 0x43, 0x4c, 0x41, 0x3b, 0x43, 0x4b, 0x49, 0x3b, 0x46, 0x4d, 0x46, 0x3b, 0x4d, 0x41, 0x44, 0x3b, 0x4d, 0x42,
-0x49, 0x3b, 0x4d, 0x4c, 0x49, 0x3b, 0x4d, 0x41, 0x4d, 0x3b, 0x46, 0x44, 0x45, 0x3b, 0x46, 0x4d, 0x55, 0x3b, 0x46, 0x47,
-0x57, 0x3b, 0x46, 0x59, 0x55, 0x4f, 0x3b, 0x41, 0x3b, 0x49, 0x3b, 0x46, 0x3b, 0x44, 0x3b, 0x42, 0x3b, 0x4c, 0x3b, 0x4d,
-0x3b, 0x45, 0x3b, 0x55, 0x3b, 0x57, 0x3b, 0x59, 0x1c3, 0x4b, 0x68, 0x61, 0x6e, 0x6e, 0x69, 0x3b, 0x1c3, 0x4b, 0x68, 0x61,
-0x6e, 0x1c0, 0x67, 0xf4, 0x61, 0x62, 0x3b, 0x1c0, 0x4b, 0x68, 0x75, 0x75, 0x1c1, 0x6b, 0x68, 0xe2, 0x62, 0x3b, 0x1c3, 0x48,
-0xf4, 0x61, 0x1c2, 0x6b, 0x68, 0x61, 0x69, 0x62, 0x3b, 0x1c3, 0x4b, 0x68, 0x61, 0x69, 0x74, 0x73, 0xe2, 0x62, 0x3b, 0x47,
-0x61, 0x6d, 0x61, 0x1c0, 0x61, 0x65, 0x62, 0x3b, 0x1c2, 0x4b, 0x68, 0x6f, 0x65, 0x73, 0x61, 0x6f, 0x62, 0x3b, 0x41, 0x6f,
-0x1c1, 0x6b, 0x68, 0x75, 0x75, 0x6d, 0xfb, 0x1c1, 0x6b, 0x68, 0xe2, 0x62, 0x3b, 0x54, 0x61, 0x72, 0x61, 0x1c0, 0x6b, 0x68,
-0x75, 0x75, 0x6d, 0xfb, 0x1c1, 0x6b, 0x68, 0xe2, 0x62, 0x3b, 0x1c2, 0x4e, 0xfb, 0x1c1, 0x6e, 0xe2, 0x69, 0x73, 0x65, 0x62,
-0x3b, 0x1c0, 0x48, 0x6f, 0x6f, 0x1c2, 0x67, 0x61, 0x65, 0x62, 0x3b, 0x48, 0xf4, 0x61, 0x73, 0x6f, 0x72, 0x65, 0x1c1, 0x6b,
-0x68, 0xe2, 0x62, 0x91c, 0x928, 0x935, 0x930, 0x940, 0x3b, 0x92b, 0x947, 0x92c, 0x94d, 0x930, 0x941, 0x905, 0x930, 0x940, 0x3b, 0x92e,
-0x93e, 0x930, 0x94d, 0x91a, 0x3b, 0x905, 0x92a, 0x94d, 0x930, 0x93f, 0x932, 0x3b, 0x92e, 0x947, 0x3b, 0x91c, 0x941, 0x928, 0x3b, 0x91c,
-0x941, 0x932, 0x93e, 0x908, 0x3b, 0x905, 0x917, 0x938, 0x94d, 0x91f, 0x3b, 0x938, 0x947, 0x92a, 0x94d, 0x91f, 0x947, 0x92e, 0x94d, 0x92c,
-0x930, 0x3b, 0x905, 0x915, 0x94d, 0x91f, 0x94b, 0x92c, 0x930, 0x3b, 0x928, 0x94b, 0x92d, 0x947, 0x92e, 0x94d, 0x92c, 0x930, 0x3b, 0x921,
-0x93f, 0x938, 0x947, 0x92e, 0x94d, 0x92c, 0x930, 0x91c, 0x928, 0x3b, 0x92b, 0x947, 0x947, 0x92c, 0x3b, 0x92e, 0x93e, 0x930, 0x94d, 0x91a,
-0x3b, 0x905, 0x92a, 0x94d, 0x930, 0x3b, 0x92e, 0x947, 0x3b, 0x91c, 0x941, 0x928, 0x3b, 0x91c, 0x941, 0x932, 0x3b, 0x905, 0x917, 0x3b,
-0x938, 0x947, 0x92a, 0x3b, 0x905, 0x915, 0x94d, 0x91f, 0x94b, 0x3b, 0x928, 0x94b, 0x92d, 0x947, 0x3b, 0x921, 0x93f, 0x938, 0x947, 0x91c,
-0x928, 0x3b, 0x92b, 0x947, 0x92c, 0x3b, 0x92e, 0x93e, 0x930, 0x94d, 0x91a, 0x3b, 0x905, 0x92a, 0x94d, 0x930, 0x3b, 0x92e, 0x947, 0x3b,
-0x91c, 0x941, 0x928, 0x3b, 0x91c, 0x941, 0x932, 0x3b, 0x905, 0x917, 0x3b, 0x938, 0x947, 0x92a, 0x3b, 0x905, 0x915, 0x94d, 0x91f, 0x94b,
-0x3b, 0x928, 0x94b, 0x92d, 0x947, 0x3b, 0x921, 0x93f, 0x938, 0x947, 0x73, 0x61, 0x14b, 0x20, 0x74, 0x73, 0x65, 0x74, 0x73, 0x25b,
-0x300, 0x25b, 0x20, 0x6c, 0xf9, 0x6d, 0x3b, 0x73, 0x61, 0x14b, 0x20, 0x6b, 0xe0, 0x67, 0x20, 0x6e, 0x67, 0x77, 0xf3, 0x14b,
-0x3b, 0x73, 0x61, 0x14b, 0x20, 0x6c, 0x65, 0x70, 0x79, 0xe8, 0x20, 0x73, 0x68, 0xfa, 0x6d, 0x3b, 0x73, 0x61, 0x14b, 0x20,
-0x63, 0xff, 0xf3, 0x3b, 0x73, 0x61, 0x14b, 0x20, 0x74, 0x73, 0x25b, 0x300, 0x25b, 0x20, 0x63, 0xff, 0xf3, 0x3b, 0x73, 0x61,
-0x14b, 0x20, 0x6e, 0x6a, 0xff, 0x6f, 0x6c, 0xe1, 0x2bc, 0x3b, 0x73, 0x61, 0x14b, 0x20, 0x74, 0x79, 0x25b, 0x300, 0x62, 0x20,
-0x74, 0x79, 0x25b, 0x300, 0x62, 0x20, 0x6d, 0x62, 0x289, 0x300, 0x14b, 0x3b, 0x73, 0x61, 0x14b, 0x20, 0x6d, 0x62, 0x289, 0x300,
-0x14b, 0x3b, 0x73, 0x61, 0x14b, 0x20, 0x6e, 0x67, 0x77, 0x254, 0x300, 0x2bc, 0x20, 0x6d, 0x62, 0xff, 0x25b, 0x3b, 0x73, 0x61,
-0x14b, 0x20, 0x74, 0xe0, 0x14b, 0x61, 0x20, 0x74, 0x73, 0x65, 0x74, 0x73, 0xe1, 0x2bc, 0x3b, 0x73, 0x61, 0x14b, 0x20, 0x6d,
-0x65, 0x6a, 0x77, 0x6f, 0x14b, 0xf3, 0x3b, 0x73, 0x61, 0x14b, 0x20, 0x6c, 0xf9, 0x6d, 0x4e, 0x64, 0x75, 0x14b, 0x6d, 0x62,
-0x69, 0x20, 0x53, 0x61, 0x14b, 0x3b, 0x50, 0x25b, 0x73, 0x61, 0x14b, 0x20, 0x50, 0x25b, 0x301, 0x70, 0xe1, 0x3b, 0x50, 0x25b,
-0x73, 0x61, 0x14b, 0x20, 0x50, 0x25b, 0x301, 0x74, 0xe1, 0x74, 0x3b, 0x50, 0x25b, 0x73, 0x61, 0x14b, 0x20, 0x50, 0x25b, 0x301,
-0x6e, 0x25b, 0x301, 0x6b, 0x77, 0x61, 0x3b, 0x50, 0x25b, 0x73, 0x61, 0x14b, 0x20, 0x50, 0x61, 0x74, 0x61, 0x61, 0x3b, 0x50,
-0x25b, 0x73, 0x61, 0x14b, 0x20, 0x50, 0x25b, 0x301, 0x6e, 0x25b, 0x301, 0x6e, 0x74, 0xfa, 0x6b, 0xfa, 0x3b, 0x50, 0x25b, 0x73,
-0x61, 0x14b, 0x20, 0x53, 0x61, 0x61, 0x6d, 0x62, 0xe1, 0x3b, 0x50, 0x25b, 0x73, 0x61, 0x14b, 0x20, 0x50, 0x25b, 0x301, 0x6e,
-0x25b, 0x301, 0x66, 0x254, 0x6d, 0x3b, 0x50, 0x25b, 0x73, 0x61, 0x14b, 0x20, 0x50, 0x25b, 0x301, 0x6e, 0x25b, 0x301, 0x70, 0x66,
-0xfa, 0xa78b, 0xfa, 0x3b, 0x50, 0x25b, 0x73, 0x61, 0x14b, 0x20, 0x4e, 0x25b, 0x67, 0x25b, 0x301, 0x6d, 0x3b, 0x50, 0x25b, 0x73,
-0x61, 0x14b, 0x20, 0x4e, 0x74, 0x73, 0x254, 0x30c, 0x70, 0x6d, 0x254, 0x301, 0x3b, 0x50, 0x25b, 0x73, 0x61, 0x14b, 0x20, 0x4e,
-0x74, 0x73, 0x254, 0x30c, 0x70, 0x70, 0xe1, 0x4a, 0xe9, 0x6e, 0xfa, 0xe1, 0x72, 0x69, 0x3b, 0x46, 0x1eb9, 0x301, 0x62, 0xfa,
-0xe1, 0x72, 0x69, 0x3b, 0x4d, 0x61, 0x63, 0x68, 0x3b, 0xc9, 0x70, 0x72, 0x65, 0x6c, 0x3b, 0x4d, 0x65, 0x65, 0x3b, 0x4a,
-0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x61, 0x69, 0x3b, 0x1ecc, 0x67, 0x1ecd, 0x73, 0x74, 0x3b, 0x53, 0x1eb9, 0x70, 0x74, 0x1eb9,
-0x301, 0x6d, 0x62, 0x61, 0x3b, 0x1ecc, 0x6b, 0x74, 0xf3, 0x62, 0x61, 0x3b, 0x4e, 0x1ecd, 0x76, 0x1eb9, 0x301, 0x6d, 0x62, 0x61,
-0x3b, 0x44, 0x69, 0x73, 0x1eb9, 0x301, 0x6d, 0x62, 0x61, 0x4a, 0xe9, 0x6e, 0x3b, 0x46, 0x1eb9, 0x301, 0x62, 0x3b, 0x4d, 0x61,
-0x63, 0x68, 0x3b, 0xc9, 0x70, 0x72, 0x3b, 0x4d, 0x65, 0x65, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x1ecc,
-0x301, 0x67, 0x1ecd, 0x3b, 0x53, 0x1eb9, 0x70, 0x3b, 0x1ecc, 0x6b, 0x74, 0x3b, 0x4e, 0x1ecd, 0x76, 0x3b, 0x44, 0x69, 0x73, 0x4a,
-0xe9, 0x6e, 0x3b, 0x46, 0x1eb9, 0x301, 0x62, 0x3b, 0x4d, 0x61, 0x63, 0x68, 0x3b, 0xc9, 0x70, 0x72, 0x3b, 0x4d, 0x65, 0x65,
-0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x1ecc, 0x67, 0x1ecd, 0x3b, 0x53, 0x1eb9, 0x70, 0x3b, 0x1ecc, 0x6b, 0x74,
-0x3b, 0x4e, 0x1ecd, 0x76, 0x3b, 0x44, 0x69, 0x73, 0x62c, 0x627, 0x646, 0x6a4, 0x6cc, 0x6d5, 0x3b, 0x641, 0x626, 0x6a4, 0x631, 0x6cc,
-0x6d5, 0x3b, 0x645, 0x627, 0x631, 0x633, 0x3b, 0x622, 0x6a4, 0x631, 0x6cc, 0x644, 0x3b, 0x645, 0x626, 0x6cc, 0x3b, 0x62c, 0x648, 0x659,
-0x623, 0x646, 0x3b, 0x62c, 0x648, 0x659, 0x644, 0x627, 0x3b, 0x622, 0x6af, 0x648, 0x633, 0x62a, 0x3b, 0x633, 0x626, 0x67e, 0x62a, 0x627,
-0x645, 0x631, 0x3b, 0x626, 0x648, 0x6a9, 0x62a, 0x648, 0x6a4, 0x631, 0x3b, 0x646, 0x648, 0x6a4, 0x627, 0x645, 0x631, 0x3b, 0x62f, 0x626,
-0x633, 0x627, 0x645, 0x631, 0x6f, 0x111, 0x111, 0x61, 0x6a, 0x61, 0x67, 0x65, 0x6d, 0xe1, 0x6e, 0x6e, 0x75, 0x3b, 0x67, 0x75,
-0x6f, 0x76, 0x76, 0x61, 0x6d, 0xe1, 0x6e, 0x6e, 0x75, 0x3b, 0x6e, 0x6a, 0x75, 0x6b, 0x10d, 0x61, 0x6d, 0xe1, 0x6e, 0x6e,
-0x75, 0x3b, 0x63, 0x75, 0x6f, 0x14b, 0x6f, 0x6d, 0xe1, 0x6e, 0x6e, 0x75, 0x3b, 0x6d, 0x69, 0x65, 0x73, 0x73, 0x65, 0x6d,
-0xe1, 0x6e, 0x6e, 0x75, 0x3b, 0x67, 0x65, 0x61, 0x73, 0x73, 0x65, 0x6d, 0xe1, 0x6e, 0x6e, 0x75, 0x3b, 0x73, 0x75, 0x6f,
-0x69, 0x64, 0x6e, 0x65, 0x6d, 0xe1, 0x6e, 0x6e, 0x75, 0x3b, 0x62, 0x6f, 0x72, 0x67, 0x65, 0x6d, 0xe1, 0x6e, 0x6e, 0x75,
-0x3b, 0x10d, 0x61, 0x6b, 0x10d, 0x61, 0x6d, 0xe1, 0x6e, 0x6e, 0x75, 0x3b, 0x67, 0x6f, 0x6c, 0x67, 0x67, 0x6f, 0x74, 0x6d,
-0xe1, 0x6e, 0x6e, 0x75, 0x3b, 0x73, 0x6b, 0xe1, 0x62, 0x6d, 0x61, 0x6d, 0xe1, 0x6e, 0x6e, 0x75, 0x3b, 0x6a, 0x75, 0x6f,
-0x76, 0x6c, 0x61, 0x6d, 0xe1, 0x6e, 0x6e, 0x75, 0x6f, 0x111, 0x111, 0x6a, 0x3b, 0x67, 0x75, 0x6f, 0x76, 0x3b, 0x6e, 0x6a,
-0x75, 0x6b, 0x3b, 0x63, 0x75, 0x6f, 0x3b, 0x6d, 0x69, 0x65, 0x73, 0x3b, 0x67, 0x65, 0x61, 0x73, 0x3b, 0x73, 0x75, 0x6f,
-0x69, 0x3b, 0x62, 0x6f, 0x72, 0x67, 0x3b, 0x10d, 0x61, 0x6b, 0x10d, 0x3b, 0x67, 0x6f, 0x6c, 0x67, 0x3b, 0x73, 0x6b, 0xe1,
-0x62, 0x3b, 0x6a, 0x75, 0x6f, 0x76, 0x4f, 0x3b, 0x47, 0x3b, 0x4e, 0x3b, 0x43, 0x3b, 0x4d, 0x3b, 0x47, 0x3b, 0x53, 0x3b,
-0x42, 0x3b, 0x10c, 0x3b, 0x47, 0x3b, 0x53, 0x3b, 0x4a, 0x6f, 0x111, 0x111, 0x6a, 0x3b, 0x67, 0x75, 0x6f, 0x76, 0x3b, 0x6e,
-0x6a, 0x75, 0x6b, 0x3b, 0x63, 0x75, 0x6f, 0x14b, 0x3b, 0x6d, 0x69, 0x65, 0x73, 0x3b, 0x67, 0x65, 0x61, 0x73, 0x3b, 0x73,
-0x75, 0x6f, 0x69, 0x3b, 0x62, 0x6f, 0x72, 0x67, 0x3b, 0x10d, 0x61, 0x6b, 0x10d, 0x3b, 0x67, 0x6f, 0x6c, 0x67, 0x3b, 0x73,
-0x6b, 0xe1, 0x62, 0x3b, 0x6a, 0x75, 0x6f, 0x76, 0x5a, 0x69, 0x62, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x6c, 0x61, 0x3b, 0x4e,
-0x68, 0x6c, 0x6f, 0x6c, 0x61, 0x6e, 0x6a, 0x61, 0x3b, 0x4d, 0x62, 0x69, 0x6d, 0x62, 0x69, 0x74, 0x68, 0x6f, 0x3b, 0x4d,
-0x61, 0x62, 0x61, 0x73, 0x61, 0x3b, 0x4e, 0x6b, 0x77, 0x65, 0x6e, 0x6b, 0x77, 0x65, 0x7a, 0x69, 0x3b, 0x4e, 0x68, 0x6c,
-0x61, 0x6e, 0x67, 0x75, 0x6c, 0x61, 0x3b, 0x4e, 0x74, 0x75, 0x6c, 0x69, 0x6b, 0x61, 0x7a, 0x69, 0x3b, 0x4e, 0x63, 0x77,
-0x61, 0x62, 0x61, 0x6b, 0x61, 0x7a, 0x69, 0x3b, 0x4d, 0x70, 0x61, 0x6e, 0x64, 0x75, 0x6c, 0x61, 0x3b, 0x4d, 0x66, 0x75,
-0x6d, 0x66, 0x75, 0x3b, 0x4c, 0x77, 0x65, 0x7a, 0x69, 0x3b, 0x4d, 0x70, 0x61, 0x6c, 0x61, 0x6b, 0x61, 0x7a, 0x69, 0x5a,
-0x69, 0x62, 0x3b, 0x4e, 0x68, 0x6c, 0x6f, 0x3b, 0x4d, 0x62, 0x69, 0x3b, 0x4d, 0x61, 0x62, 0x3b, 0x4e, 0x6b, 0x77, 0x3b,
-0x4e, 0x68, 0x6c, 0x61, 0x3b, 0x4e, 0x74, 0x75, 0x3b, 0x4e, 0x63, 0x77, 0x3b, 0x4d, 0x70, 0x61, 0x6e, 0x3b, 0x4d, 0x66,
-0x75, 0x3b, 0x4c, 0x77, 0x65, 0x3b, 0x4d, 0x70, 0x61, 0x6c, 0x5a, 0x3b, 0x4e, 0x3b, 0x4d, 0x3b, 0x4d, 0x3b, 0x4e, 0x3b,
-0x4e, 0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x4d, 0x3b, 0x4d, 0x3b, 0x4c, 0x3b, 0x4d, 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x3b,
-0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x6d,
-0x61, 0x69, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x3b, 0x61, 0x75, 0x67, 0x75, 0x73, 0x74, 0x3b,
-0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x6e, 0x6f,
-0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x73, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x6a, 0x61, 0x6e, 0x2e, 0x3b,
-0x66, 0x65, 0x62, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x6a,
-0x75, 0x6e, 0x69, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x3b, 0x61, 0x75, 0x67, 0x2e, 0x3b, 0x73, 0x65, 0x70, 0x2e, 0x3b, 0x6f,
-0x6b, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0x65, 0x73, 0x2e, 0x54, 0x69, 0x6f, 0x70, 0x20, 0x74, 0x68,
-0x61, 0x72, 0x20, 0x70, 0x25b, 0x74, 0x3b, 0x50, 0x25b, 0x74, 0x3b, 0x44, 0x75, 0x254, 0x331, 0x254, 0x331, 0x14b, 0x3b, 0x47,
-0x75, 0x61, 0x6b, 0x3b, 0x44, 0x75, 0xe4, 0x74, 0x3b, 0x4b, 0x6f, 0x72, 0x6e, 0x79, 0x6f, 0x6f, 0x74, 0x3b, 0x50, 0x61,
-0x79, 0x20, 0x79, 0x69, 0x65, 0x331, 0x74, 0x6e, 0x69, 0x3b, 0x54, 0x68, 0x6f, 0x331, 0x6f, 0x331, 0x72, 0x3b, 0x54, 0x25b,
-0x25b, 0x72, 0x3b, 0x4c, 0x61, 0x61, 0x74, 0x68, 0x3b, 0x4b, 0x75, 0x72, 0x3b, 0x54, 0x69, 0x6f, 0x331, 0x70, 0x20, 0x69,
-0x6e, 0x20, 0x64, 0x69, 0x331, 0x69, 0x331, 0x74, 0x54, 0x69, 0x6f, 0x70, 0x3b, 0x50, 0x25b, 0x74, 0x3b, 0x44, 0x75, 0x254,
-0x331, 0x254, 0x331, 0x3b, 0x47, 0x75, 0x61, 0x6b, 0x3b, 0x44, 0x75, 0xe4, 0x3b, 0x4b, 0x6f, 0x72, 0x3b, 0x50, 0x61, 0x79,
-0x3b, 0x54, 0x68, 0x6f, 0x6f, 0x3b, 0x54, 0x25b, 0x25b, 0x3b, 0x4c, 0x61, 0x61, 0x3b, 0x4b, 0x75, 0x72, 0x3b, 0x54, 0x69,
-0x64, 0x54, 0x3b, 0x50, 0x3b, 0x44, 0x3b, 0x47, 0x3b, 0x44, 0x3b, 0x4b, 0x3b, 0x50, 0x3b, 0x54, 0x3b, 0x54, 0x3b, 0x4c,
-0x3b, 0x4b, 0x3b, 0x54, 0xb1c, 0xb3e, 0xb28, 0xb41, 0xb06, 0xb30, 0xb40, 0x3b, 0xb2b, 0xb47, 0xb2c, 0xb43, 0xb06, 0xb30, 0xb40, 0x3b,
-0xb2e, 0xb3e, 0xb30, 0xb4d, 0xb1a, 0xb4d, 0xb1a, 0x3b, 0xb05, 0xb2a, 0xb4d, 0xb30, 0xb47, 0xb32, 0x3b, 0xb2e, 0xb07, 0x3b, 0xb1c, 0xb41,
-0xb28, 0x3b, 0xb1c, 0xb41, 0xb32, 0xb3e, 0xb07, 0x3b, 0xb05, 0xb17, 0xb37, 0xb4d, 0xb1f, 0x3b, 0xb38, 0xb47, 0xb2a, 0xb4d, 0xb1f, 0xb47,
-0xb2e, 0xb4d, 0xb2c, 0xb30, 0x3b, 0xb05, 0xb15, 0xb4d, 0xb1f, 0xb4b, 0xb2c, 0xb30, 0x3b, 0xb28, 0xb2d, 0xb47, 0xb2e, 0xb4d, 0xb2c, 0xb30,
-0x3b, 0xb21, 0xb3f, 0xb38, 0xb47, 0xb2e, 0xb4d, 0xb2c, 0xb30, 0xb1c, 0xb3e, 0x3b, 0xb2b, 0xb47, 0x3b, 0xb2e, 0xb3e, 0x3b, 0xb05, 0x3b,
-0xb2e, 0xb07, 0x3b, 0xb1c, 0xb41, 0x3b, 0xb1c, 0xb41, 0x3b, 0xb05, 0x3b, 0xb38, 0xb47, 0x3b, 0xb05, 0x3b, 0xb28, 0x3b, 0xb21, 0xb3f,
-0x41, 0x6d, 0x61, 0x6a, 0x6a, 0x69, 0x69, 0x3b, 0x47, 0x75, 0x72, 0x61, 0x61, 0x6e, 0x64, 0x68, 0x61, 0x6c, 0x61, 0x3b,
-0x42, 0x69, 0x74, 0x6f, 0x6f, 0x74, 0x65, 0x65, 0x73, 0x73, 0x61, 0x3b, 0x45, 0x6c, 0x62, 0x61, 0x3b, 0x43, 0x61, 0x61,
-0x6d, 0x73, 0x61, 0x3b, 0x57, 0x61, 0x78, 0x61, 0x62, 0x61, 0x6a, 0x6a, 0x69, 0x69, 0x3b, 0x41, 0x64, 0x6f, 0x6f, 0x6c,
-0x65, 0x65, 0x73, 0x73, 0x61, 0x3b, 0x48, 0x61, 0x67, 0x61, 0x79, 0x79, 0x61, 0x3b, 0x46, 0x75, 0x75, 0x6c, 0x62, 0x61,
-0x6e, 0x61, 0x3b, 0x4f, 0x6e, 0x6b, 0x6f, 0x6c, 0x6f, 0x6c, 0x65, 0x65, 0x73, 0x73, 0x61, 0x3b, 0x53, 0x61, 0x64, 0x61,
-0x61, 0x73, 0x61, 0x3b, 0x4d, 0x75, 0x64, 0x64, 0x65, 0x65, 0x41, 0x6d, 0x61, 0x3b, 0x47, 0x75, 0x72, 0x3b, 0x42, 0x69,
-0x74, 0x3b, 0x45, 0x6c, 0x62, 0x3b, 0x43, 0x61, 0x6d, 0x3b, 0x57, 0x61, 0x78, 0x3b, 0x41, 0x64, 0x6f, 0x3b, 0x48, 0x61,
-0x67, 0x3b, 0x46, 0x75, 0x6c, 0x3b, 0x4f, 0x6e, 0x6b, 0x3b, 0x53, 0x61, 0x64, 0x3b, 0x4d, 0x75, 0x64, 0x41, 0x3b, 0x47,
-0x3b, 0x42, 0x3b, 0x45, 0x3b, 0x43, 0x3b, 0x57, 0x3b, 0x41, 0x3b, 0x48, 0x3b, 0x46, 0x3b, 0x4f, 0x3b, 0x53, 0x3b, 0x4d,
-0x42f, 0x43d, 0x432, 0x430, 0x440, 0x44c, 0x3b, 0x424, 0x435, 0x432, 0x440, 0x430, 0x43b, 0x44c, 0x3b, 0x41c, 0x430, 0x440, 0x442, 0x44a,
-0x438, 0x3b, 0x410, 0x43f, 0x440, 0x435, 0x43b, 0x44c, 0x3b, 0x41c, 0x430, 0x439, 0x3b, 0x418, 0x44e, 0x43d, 0x44c, 0x3b, 0x418, 0x44e,
-0x43b, 0x44c, 0x3b, 0x410, 0x432, 0x433, 0x443, 0x441, 0x442, 0x3b, 0x421, 0x435, 0x43d, 0x442, 0x44f, 0x431, 0x440, 0x44c, 0x3b, 0x41e,
-0x43a, 0x442, 0x44f, 0x431, 0x440, 0x44c, 0x3b, 0x41d, 0x43e, 0x44f, 0x431, 0x440, 0x44c, 0x3b, 0x414, 0x435, 0x43a, 0x430, 0x431, 0x440,
-0x44c, 0x44f, 0x43d, 0x432, 0x430, 0x440, 0x44b, 0x3b, 0x444, 0x435, 0x432, 0x440, 0x430, 0x43b, 0x44b, 0x3b, 0x43c, 0x430, 0x440, 0x442,
-0x44a, 0x438, 0x439, 0x44b, 0x3b, 0x430, 0x43f, 0x440, 0x435, 0x43b, 0x44b, 0x3b, 0x43c, 0x430, 0x439, 0x44b, 0x3b, 0x438, 0x44e, 0x43d,
-0x44b, 0x3b, 0x438, 0x44e, 0x43b, 0x44b, 0x3b, 0x430, 0x432, 0x433, 0x443, 0x441, 0x442, 0x44b, 0x3b, 0x441, 0x435, 0x43d, 0x442, 0x44f,
-0x431, 0x440, 0x44b, 0x3b, 0x43e, 0x43a, 0x442, 0x44f, 0x431, 0x440, 0x44b, 0x3b, 0x43d, 0x43e, 0x44f, 0x431, 0x440, 0x44b, 0x3b, 0x434,
-0x435, 0x43a, 0x430, 0x431, 0x440, 0x44b, 0x42f, 0x43d, 0x432, 0x2e, 0x3b, 0x424, 0x435, 0x432, 0x440, 0x2e, 0x3b, 0x41c, 0x430, 0x440,
-0x442, 0x2e, 0x3b, 0x410, 0x43f, 0x440, 0x2e, 0x3b, 0x41c, 0x430, 0x439, 0x3b, 0x418, 0x44e, 0x43d, 0x44c, 0x3b, 0x418, 0x44e, 0x43b,
-0x44c, 0x3b, 0x410, 0x432, 0x433, 0x2e, 0x3b, 0x421, 0x435, 0x43d, 0x442, 0x2e, 0x3b, 0x41e, 0x43a, 0x442, 0x2e, 0x3b, 0x41d, 0x43e,
-0x44f, 0x431, 0x2e, 0x3b, 0x414, 0x435, 0x43a, 0x2e, 0x44f, 0x43d, 0x432, 0x2e, 0x3b, 0x444, 0x435, 0x432, 0x2e, 0x3b, 0x43c, 0x430,
-0x440, 0x2e, 0x3b, 0x430, 0x43f, 0x440, 0x2e, 0x3b, 0x43c, 0x430, 0x439, 0x44b, 0x3b, 0x438, 0x44e, 0x43d, 0x44b, 0x3b, 0x438, 0x44e,
-0x43b, 0x44b, 0x3b, 0x430, 0x432, 0x433, 0x2e, 0x3b, 0x441, 0x435, 0x43d, 0x2e, 0x3b, 0x43e, 0x43a, 0x442, 0x2e, 0x3b, 0x43d, 0x43e,
-0x44f, 0x2e, 0x3b, 0x434, 0x435, 0x43a, 0x2e, 0x62c, 0x646, 0x648, 0x631, 0x64a, 0x3b, 0x641, 0x6d0, 0x628, 0x631, 0x648, 0x631, 0x64a,
-0x3b, 0x645, 0x627, 0x631, 0x686, 0x3b, 0x627, 0x67e, 0x631, 0x6cc, 0x644, 0x3b, 0x645, 0x6cd, 0x3b, 0x62c, 0x648, 0x646, 0x3b, 0x62c,
-0x648, 0x644, 0x627, 0x6cc, 0x3b, 0x627, 0x6ab, 0x633, 0x62a, 0x3b, 0x633, 0x67e, 0x62a, 0x645, 0x628, 0x631, 0x3b, 0x627, 0x6a9, 0x62a,
-0x648, 0x628, 0x631, 0x3b, 0x646, 0x648, 0x645, 0x628, 0x631, 0x3b, 0x62f, 0x633, 0x645, 0x628, 0x631, 0x62c, 0x646, 0x648, 0x631, 0x64a,
-0x3b, 0x641, 0x628, 0x631, 0x648, 0x631, 0x64a, 0x3b, 0x645, 0x627, 0x631, 0x686, 0x3b, 0x627, 0x67e, 0x631, 0x6cc, 0x644, 0x3b, 0x645,
-0x6cd, 0x3b, 0x62c, 0x648, 0x646, 0x3b, 0x62c, 0x648, 0x644, 0x627, 0x6cc, 0x3b, 0x627, 0x6ab, 0x633, 0x62a, 0x3b, 0x633, 0x6d0, 0x67e,
-0x62a, 0x645, 0x628, 0x631, 0x3b, 0x627, 0x6a9, 0x62a, 0x648, 0x628, 0x631, 0x3b, 0x646, 0x648, 0x645, 0x628, 0x631, 0x3b, 0x62f, 0x633,
-0x645, 0x628, 0x631, 0x62c, 0x646, 0x648, 0x631, 0x64a, 0x3b, 0x641, 0x628, 0x631, 0x648, 0x631, 0x64a, 0x3b, 0x645, 0x627, 0x631, 0x686,
-0x3b, 0x627, 0x67e, 0x631, 0x6cc, 0x644, 0x3b, 0x645, 0x6cd, 0x3b, 0x62c, 0x648, 0x646, 0x3b, 0x62c, 0x648, 0x644, 0x627, 0x6cc, 0x3b,
-0x627, 0x6ab, 0x633, 0x62a, 0x3b, 0x633, 0x67e, 0x62a, 0x645, 0x628, 0x631, 0x3b, 0x627, 0x6a9, 0x62a, 0x648, 0x628, 0x631, 0x3b, 0x646,
-0x648, 0x645, 0x628, 0x631, 0x3b, 0x62f, 0x633, 0x645, 0x628, 0x631, 0x62c, 0x3b, 0x641, 0x3b, 0x645, 0x3b, 0x627, 0x3b, 0x645, 0x3b,
-0x62c, 0x3b, 0x62c, 0x3b, 0x627, 0x3b, 0x633, 0x3b, 0x627, 0x3b, 0x646, 0x3b, 0x62f, 0x698, 0x627, 0x646, 0x648, 0x6cc, 0x647, 0x654,
-0x3b, 0x641, 0x648, 0x631, 0x6cc, 0x647, 0x654, 0x3b, 0x645, 0x627, 0x631, 0x633, 0x3b, 0x622, 0x648, 0x631, 0x6cc, 0x644, 0x3b, 0x645,
-0x647, 0x654, 0x3b, 0x698, 0x648, 0x626, 0x646, 0x3b, 0x698, 0x648, 0x626, 0x6cc, 0x647, 0x654, 0x3b, 0x627, 0x648, 0x62a, 0x3b, 0x633,
-0x67e, 0x62a, 0x627, 0x645, 0x628, 0x631, 0x3b, 0x627, 0x6a9, 0x62a, 0x628, 0x631, 0x3b, 0x646, 0x648, 0x627, 0x645, 0x628, 0x631, 0x3b,
-0x62f, 0x633, 0x627, 0x645, 0x628, 0x631, 0x698, 0x3b, 0x641, 0x3b, 0x645, 0x3b, 0x622, 0x3b, 0x645, 0x3b, 0x698, 0x3b, 0x698, 0x3b,
-0x627, 0x3b, 0x633, 0x3b, 0x627, 0x3b, 0x646, 0x3b, 0x62f, 0x62c, 0x646, 0x648, 0x631, 0x6cc, 0x3b, 0x641, 0x628, 0x631, 0x648, 0x631,
-0x6cc, 0x3b, 0x645, 0x627, 0x631, 0x686, 0x3b, 0x627, 0x67e, 0x631, 0x6cc, 0x644, 0x3b, 0x645, 0x6cc, 0x3b, 0x62c, 0x648, 0x646, 0x3b,
-0x62c, 0x648, 0x644, 0x627, 0x6cc, 0x3b, 0x627, 0x6af, 0x633, 0x62a, 0x3b, 0x633, 0x67e, 0x62a, 0x645, 0x628, 0x631, 0x3b, 0x627, 0x6a9,
-0x62a, 0x648, 0x628, 0x631, 0x3b, 0x646, 0x648, 0x645, 0x628, 0x631, 0x3b, 0x62f, 0x633, 0x645, 0x628, 0x631, 0x62c, 0x646, 0x648, 0x3b,
-0x641, 0x628, 0x631, 0x648, 0x631, 0x6cc, 0x3b, 0x645, 0x627, 0x631, 0x686, 0x3b, 0x627, 0x67e, 0x631, 0x6cc, 0x644, 0x3b, 0x645, 0x6cc,
-0x3b, 0x62c, 0x648, 0x646, 0x3b, 0x62c, 0x648, 0x644, 0x3b, 0x627, 0x6af, 0x633, 0x62a, 0x3b, 0x633, 0x67e, 0x62a, 0x645, 0x628, 0x631,
-0x3b, 0x627, 0x6a9, 0x62a, 0x648, 0x628, 0x631, 0x3b, 0x646, 0x648, 0x645, 0x628, 0x631, 0x3b, 0x62f, 0x633, 0x645, 0x73, 0x74, 0x79,
-0x63, 0x7a, 0x65, 0x144, 0x3b, 0x6c, 0x75, 0x74, 0x79, 0x3b, 0x6d, 0x61, 0x72, 0x7a, 0x65, 0x63, 0x3b, 0x6b, 0x77, 0x69,
-0x65, 0x63, 0x69, 0x65, 0x144, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x63, 0x7a, 0x65, 0x72, 0x77, 0x69, 0x65, 0x63, 0x3b, 0x6c,
-0x69, 0x70, 0x69, 0x65, 0x63, 0x3b, 0x73, 0x69, 0x65, 0x72, 0x70, 0x69, 0x65, 0x144, 0x3b, 0x77, 0x72, 0x7a, 0x65, 0x73,
-0x69, 0x65, 0x144, 0x3b, 0x70, 0x61, 0x17a, 0x64, 0x7a, 0x69, 0x65, 0x72, 0x6e, 0x69, 0x6b, 0x3b, 0x6c, 0x69, 0x73, 0x74,
-0x6f, 0x70, 0x61, 0x64, 0x3b, 0x67, 0x72, 0x75, 0x64, 0x7a, 0x69, 0x65, 0x144, 0x73, 0x74, 0x79, 0x63, 0x7a, 0x6e, 0x69,
-0x61, 0x3b, 0x6c, 0x75, 0x74, 0x65, 0x67, 0x6f, 0x3b, 0x6d, 0x61, 0x72, 0x63, 0x61, 0x3b, 0x6b, 0x77, 0x69, 0x65, 0x74,
-0x6e, 0x69, 0x61, 0x3b, 0x6d, 0x61, 0x6a, 0x61, 0x3b, 0x63, 0x7a, 0x65, 0x72, 0x77, 0x63, 0x61, 0x3b, 0x6c, 0x69, 0x70,
-0x63, 0x61, 0x3b, 0x73, 0x69, 0x65, 0x72, 0x70, 0x6e, 0x69, 0x61, 0x3b, 0x77, 0x72, 0x7a, 0x65, 0x15b, 0x6e, 0x69, 0x61,
-0x3b, 0x70, 0x61, 0x17a, 0x64, 0x7a, 0x69, 0x65, 0x72, 0x6e, 0x69, 0x6b, 0x61, 0x3b, 0x6c, 0x69, 0x73, 0x74, 0x6f, 0x70,
-0x61, 0x64, 0x61, 0x3b, 0x67, 0x72, 0x75, 0x64, 0x6e, 0x69, 0x61, 0x73, 0x74, 0x79, 0x3b, 0x6c, 0x75, 0x74, 0x3b, 0x6d,
-0x61, 0x72, 0x3b, 0x6b, 0x77, 0x69, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x63, 0x7a, 0x65, 0x3b, 0x6c, 0x69, 0x70, 0x3b, 0x73,
-0x69, 0x65, 0x3b, 0x77, 0x72, 0x7a, 0x3b, 0x70, 0x61, 0x17a, 0x3b, 0x6c, 0x69, 0x73, 0x3b, 0x67, 0x72, 0x75, 0x53, 0x3b,
-0x4c, 0x3b, 0x4d, 0x3b, 0x4b, 0x3b, 0x4d, 0x3b, 0x43, 0x3b, 0x4c, 0x3b, 0x53, 0x3b, 0x57, 0x3b, 0x50, 0x3b, 0x4c, 0x3b,
-0x47, 0x73, 0x3b, 0x6c, 0x3b, 0x6d, 0x3b, 0x6b, 0x3b, 0x6d, 0x3b, 0x63, 0x3b, 0x6c, 0x3b, 0x73, 0x3b, 0x77, 0x3b, 0x70,
-0x3b, 0x6c, 0x3b, 0x67, 0x6a, 0x61, 0x6e, 0x65, 0x69, 0x72, 0x6f, 0x3b, 0x66, 0x65, 0x76, 0x65, 0x72, 0x65, 0x69, 0x72,
-0x6f, 0x3b, 0x6d, 0x61, 0x72, 0xe7, 0x6f, 0x3b, 0x61, 0x62, 0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x61, 0x69, 0x6f, 0x3b, 0x6a,
-0x75, 0x6e, 0x68, 0x6f, 0x3b, 0x6a, 0x75, 0x6c, 0x68, 0x6f, 0x3b, 0x61, 0x67, 0x6f, 0x73, 0x74, 0x6f, 0x3b, 0x73, 0x65,
-0x74, 0x65, 0x6d, 0x62, 0x72, 0x6f, 0x3b, 0x6f, 0x75, 0x74, 0x75, 0x62, 0x72, 0x6f, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d,
-0x62, 0x72, 0x6f, 0x3b, 0x64, 0x65, 0x7a, 0x65, 0x6d, 0x62, 0x72, 0x6f, 0x6a, 0x61, 0x6e, 0x2e, 0x3b, 0x66, 0x65, 0x76,
-0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x2e, 0x3b, 0x61, 0x62, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x69, 0x2e, 0x3b, 0x6a, 0x75, 0x6e,
-0x2e, 0x3b, 0x6a, 0x75, 0x6c, 0x2e, 0x3b, 0x61, 0x67, 0x6f, 0x2e, 0x3b, 0x73, 0x65, 0x74, 0x2e, 0x3b, 0x6f, 0x75, 0x74,
-0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0x65, 0x7a, 0x2e, 0xa1c, 0xa28, 0xa35, 0xa30, 0xa40, 0x3b, 0xa2b, 0xa3c, 0xa30,
-0xa35, 0xa30, 0xa40, 0x3b, 0xa2e, 0xa3e, 0xa30, 0xa1a, 0x3b, 0xa05, 0xa2a, 0xa4d, 0xa30, 0xa48, 0xa32, 0x3b, 0xa2e, 0xa08, 0x3b, 0xa1c,
-0xa42, 0xa28, 0x3b, 0xa1c, 0xa41, 0xa32, 0xa3e, 0xa08, 0x3b, 0xa05, 0xa17, 0xa38, 0xa24, 0x3b, 0xa38, 0xa24, 0xa70, 0xa2c, 0xa30, 0x3b,
-0xa05, 0xa15, 0xa24, 0xa42, 0xa2c, 0xa30, 0x3b, 0xa28, 0xa35, 0xa70, 0xa2c, 0xa30, 0x3b, 0xa26, 0xa38, 0xa70, 0xa2c, 0xa30, 0xa1c, 0xa28,
-0x3b, 0xa2b, 0xa3c, 0xa30, 0x3b, 0xa2e, 0xa3e, 0xa30, 0xa1a, 0x3b, 0xa05, 0xa2a, 0xa4d, 0xa30, 0xa48, 0x3b, 0xa2e, 0xa08, 0x3b, 0xa1c,
-0xa42, 0xa28, 0x3b, 0xa1c, 0xa41, 0xa32, 0xa3e, 0x3b, 0xa05, 0xa17, 0x3b, 0xa38, 0xa24, 0xa70, 0x3b, 0xa05, 0xa15, 0xa24, 0xa42, 0x3b,
-0xa28, 0xa35, 0xa70, 0x3b, 0xa26, 0xa38, 0xa70, 0xa1c, 0x3b, 0xa2b, 0xa3c, 0x3b, 0xa2e, 0xa3e, 0x3b, 0xa05, 0x3b, 0xa2e, 0x3b, 0xa1c,
-0xa42, 0x3b, 0xa1c, 0xa41, 0x3b, 0xa05, 0x3b, 0xa38, 0x3b, 0xa05, 0x3b, 0xa28, 0x3b, 0xa26, 0x62c, 0x646, 0x648, 0x631, 0x6cc, 0x3b,
-0x641, 0x631, 0x648, 0x631, 0x6cc, 0x3b, 0x645, 0x627, 0x631, 0x686, 0x3b, 0x627, 0x67e, 0x631, 0x6cc, 0x644, 0x3b, 0x645, 0x626, 0x3b,
-0x62c, 0x648, 0x646, 0x3b, 0x62c, 0x648, 0x644, 0x627, 0x626, 0x6cc, 0x3b, 0x627, 0x6af, 0x633, 0x62a, 0x3b, 0x633, 0x62a, 0x645, 0x628,
-0x631, 0x3b, 0x627, 0x6a9, 0x62a, 0x648, 0x628, 0x631, 0x3b, 0x646, 0x648, 0x645, 0x628, 0x631, 0x3b, 0x62f, 0x633, 0x645, 0x628, 0x631,
-0x45, 0x6e, 0x65, 0x72, 0x6f, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x65, 0x72, 0x6f, 0x3b, 0x4d, 0x61, 0x72, 0x7a, 0x6f, 0x3b,
-0x41, 0x62, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x61, 0x79, 0x6f, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x6f, 0x3b, 0x4a, 0x75, 0x6c,
-0x69, 0x6f, 0x3b, 0x41, 0x67, 0x6f, 0x73, 0x74, 0x6f, 0x3b, 0x53, 0x65, 0x74, 0x69, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b,
-0x4f, 0x63, 0x74, 0x75, 0x62, 0x72, 0x65, 0x3b, 0x4e, 0x6f, 0x76, 0x69, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x44, 0x69,
-0x63, 0x69, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x45, 0x6e, 0x65, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41,
-0x62, 0x72, 0x3b, 0x4d, 0x61, 0x79, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x6f, 0x3b, 0x53,
-0x65, 0x74, 0x3b, 0x4f, 0x63, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x69, 0x63, 0x69, 0x61, 0x6e, 0x75, 0x61, 0x72,
-0x69, 0x65, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x69, 0x65, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x69, 0x65, 0x3b,
-0x61, 0x70, 0x72, 0x69, 0x6c, 0x69, 0x65, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x69, 0x75, 0x6e, 0x69, 0x65, 0x3b, 0x69, 0x75,
-0x6c, 0x69, 0x65, 0x3b, 0x61, 0x75, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x69,
-0x65, 0x3b, 0x6f, 0x63, 0x74, 0x6f, 0x6d, 0x62, 0x72, 0x69, 0x65, 0x3b, 0x6e, 0x6f, 0x69, 0x65, 0x6d, 0x62, 0x72, 0x69,
-0x65, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x72, 0x69, 0x65, 0x69, 0x61, 0x6e, 0x2e, 0x3b, 0x66, 0x65, 0x62, 0x2e,
-0x3b, 0x6d, 0x61, 0x72, 0x2e, 0x3b, 0x61, 0x70, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x69, 0x75, 0x6e, 0x2e, 0x3b,
-0x69, 0x75, 0x6c, 0x2e, 0x3b, 0x61, 0x75, 0x67, 0x2e, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x2e, 0x3b, 0x6f, 0x63, 0x74, 0x2e,
-0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0x65, 0x63, 0x2e, 0x49, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b,
-0x49, 0x3b, 0x49, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x73, 0x63, 0x68, 0x61, 0x6e, 0x65, 0x72,
-0x3b, 0x66, 0x61, 0x76, 0x72, 0x65, 0x72, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x3b, 0x61, 0x76, 0x72, 0x69, 0x67, 0x6c, 0x3b,
-0x6d, 0x61, 0x74, 0x67, 0x3b, 0x7a, 0x65, 0x72, 0x63, 0x6c, 0x61, 0x64, 0x75, 0x72, 0x3b, 0x66, 0x61, 0x6e, 0x61, 0x64,
-0x75, 0x72, 0x3b, 0x61, 0x76, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x74, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6f,
-0x63, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x63, 0x65,
-0x6d, 0x62, 0x65, 0x72, 0x64, 0x61, 0x20, 0x73, 0x63, 0x68, 0x61, 0x6e, 0x65, 0x72, 0x3b, 0x64, 0x61, 0x20, 0x66, 0x61,
-0x76, 0x72, 0x65, 0x72, 0x3b, 0x64, 0x61, 0x20, 0x6d, 0x61, 0x72, 0x73, 0x3b, 0x64, 0x2019, 0x61, 0x76, 0x72, 0x69, 0x67,
-0x6c, 0x3b, 0x64, 0x61, 0x20, 0x6d, 0x61, 0x74, 0x67, 0x3b, 0x64, 0x61, 0x20, 0x7a, 0x65, 0x72, 0x63, 0x6c, 0x61, 0x64,
-0x75, 0x72, 0x3b, 0x64, 0x61, 0x20, 0x66, 0x61, 0x6e, 0x61, 0x64, 0x75, 0x72, 0x3b, 0x64, 0x2019, 0x61, 0x76, 0x75, 0x73,
-0x74, 0x3b, 0x64, 0x61, 0x20, 0x73, 0x65, 0x74, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x2019, 0x6f, 0x63, 0x74,
-0x6f, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x61, 0x20, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x61, 0x20,
-0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x63, 0x68, 0x61, 0x6e, 0x2e, 0x3b, 0x66, 0x61, 0x76, 0x72, 0x2e,
-0x3b, 0x6d, 0x61, 0x72, 0x73, 0x3b, 0x61, 0x76, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x74, 0x67, 0x3b, 0x7a, 0x65, 0x72, 0x63,
-0x6c, 0x2e, 0x3b, 0x66, 0x61, 0x6e, 0x2e, 0x3b, 0x61, 0x76, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x74, 0x74, 0x2e, 0x3b,
-0x6f, 0x63, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0x65, 0x63, 0x2e, 0x53, 0x3b, 0x46, 0x3b, 0x4d, 0x3b,
-0x41, 0x3b, 0x4d, 0x3b, 0x5a, 0x3b, 0x46, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x4d, 0x77, 0x65,
-0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x77, 0x61, 0x6e, 0x7a, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77,
-0x61, 0x20, 0x6b, 0x61, 0x69, 0x6c, 0x69, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x74,
-0x61, 0x74, 0x75, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x61, 0x6e, 0x61, 0x3b, 0x4d,
-0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x74, 0x61, 0x6e, 0x75, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77,
-0x61, 0x20, 0x73, 0x69, 0x74, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x73, 0x61, 0x62, 0x61,
-0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6e, 0x61, 0x6e, 0x65, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69,
-0x20, 0x77, 0x61, 0x20, 0x74, 0x69, 0x73, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x69, 0x6b,
-0x75, 0x6d, 0x69, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x69, 0x6b, 0x75, 0x6d, 0x69, 0x20, 0x6e,
-0x61, 0x20, 0x6d, 0x6f, 0x6a, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x69, 0x6b, 0x75, 0x6d,
-0x69, 0x20, 0x6e, 0x61, 0x20, 0x6d, 0x62, 0x69, 0x6c, 0x69, 0x4d, 0x31, 0x3b, 0x4d, 0x32, 0x3b, 0x4d, 0x33, 0x3b, 0x4d,
-0x34, 0x3b, 0x4d, 0x35, 0x3b, 0x4d, 0x36, 0x3b, 0x4d, 0x37, 0x3b, 0x4d, 0x38, 0x3b, 0x4d, 0x39, 0x3b, 0x4d, 0x31, 0x30,
-0x3b, 0x4d, 0x31, 0x31, 0x3b, 0x4d, 0x31, 0x32, 0x4b, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x54, 0x3b, 0x53, 0x3b,
-0x53, 0x3b, 0x4e, 0x3b, 0x54, 0x3b, 0x49, 0x3b, 0x49, 0x3b, 0x49, 0x4e, 0x7a, 0x65, 0x72, 0x6f, 0x3b, 0x52, 0x75, 0x68,
-0x75, 0x68, 0x75, 0x6d, 0x61, 0x3b, 0x4e, 0x74, 0x77, 0x61, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x3b, 0x4e, 0x64, 0x61, 0x6d,
-0x75, 0x6b, 0x69, 0x7a, 0x61, 0x3b, 0x52, 0x75, 0x73, 0x61, 0x6d, 0x61, 0x3b, 0x52, 0x75, 0x68, 0x65, 0x73, 0x68, 0x69,
-0x3b, 0x4d, 0x75, 0x6b, 0x61, 0x6b, 0x61, 0x72, 0x6f, 0x3b, 0x4e, 0x79, 0x61, 0x6e, 0x64, 0x61, 0x67, 0x61, 0x72, 0x6f,
-0x3b, 0x4e, 0x79, 0x61, 0x6b, 0x61, 0x6e, 0x67, 0x61, 0x3b, 0x47, 0x69, 0x74, 0x75, 0x67, 0x75, 0x74, 0x75, 0x3b, 0x4d,
-0x75, 0x6e, 0x79, 0x6f, 0x6e, 0x79, 0x6f, 0x3b, 0x4b, 0x69, 0x67, 0x61, 0x72, 0x61, 0x6d, 0x61, 0x4d, 0x75, 0x74, 0x2e,
-0x3b, 0x47, 0x61, 0x73, 0x2e, 0x3b, 0x57, 0x65, 0x72, 0x2e, 0x3b, 0x4d, 0x61, 0x74, 0x2e, 0x3b, 0x47, 0x69, 0x63, 0x2e,
-0x3b, 0x4b, 0x61, 0x6d, 0x2e, 0x3b, 0x4e, 0x79, 0x61, 0x2e, 0x3b, 0x4b, 0x61, 0x6e, 0x2e, 0x3b, 0x4e, 0x7a, 0x65, 0x2e,
-0x3b, 0x55, 0x6b, 0x77, 0x2e, 0x3b, 0x55, 0x67, 0x75, 0x2e, 0x3b, 0x55, 0x6b, 0x75, 0x2e, 0x44f, 0x43d, 0x432, 0x430, 0x440,
-0x44f, 0x3b, 0x444, 0x435, 0x432, 0x440, 0x430, 0x43b, 0x44f, 0x3b, 0x43c, 0x430, 0x440, 0x442, 0x430, 0x3b, 0x430, 0x43f, 0x440, 0x435,
-0x43b, 0x44f, 0x3b, 0x43c, 0x430, 0x44f, 0x3b, 0x438, 0x44e, 0x43d, 0x44f, 0x3b, 0x438, 0x44e, 0x43b, 0x44f, 0x3b, 0x430, 0x432, 0x433,
-0x443, 0x441, 0x442, 0x430, 0x3b, 0x441, 0x435, 0x43d, 0x442, 0x44f, 0x431, 0x440, 0x44f, 0x3b, 0x43e, 0x43a, 0x442, 0x44f, 0x431, 0x440,
-0x44f, 0x3b, 0x43d, 0x43e, 0x44f, 0x431, 0x440, 0x44f, 0x3b, 0x434, 0x435, 0x43a, 0x430, 0x431, 0x440, 0x44f, 0x44f, 0x43d, 0x432, 0x2e,
-0x3b, 0x444, 0x435, 0x432, 0x440, 0x2e, 0x3b, 0x43c, 0x430, 0x440, 0x442, 0x3b, 0x430, 0x43f, 0x440, 0x2e, 0x3b, 0x43c, 0x430, 0x439,
-0x3b, 0x438, 0x44e, 0x43d, 0x44c, 0x3b, 0x438, 0x44e, 0x43b, 0x44c, 0x3b, 0x430, 0x432, 0x433, 0x2e, 0x3b, 0x441, 0x435, 0x43d, 0x442,
-0x2e, 0x3b, 0x43e, 0x43a, 0x442, 0x2e, 0x3b, 0x43d, 0x43e, 0x44f, 0x431, 0x2e, 0x3b, 0x434, 0x435, 0x43a, 0x2e, 0x44f, 0x43d, 0x432,
-0x2e, 0x3b, 0x444, 0x435, 0x432, 0x440, 0x2e, 0x3b, 0x43c, 0x430, 0x440, 0x2e, 0x3b, 0x430, 0x43f, 0x440, 0x2e, 0x3b, 0x43c, 0x430,
-0x44f, 0x3b, 0x438, 0x44e, 0x43d, 0x2e, 0x3b, 0x438, 0x44e, 0x43b, 0x2e, 0x3b, 0x430, 0x432, 0x433, 0x2e, 0x3b, 0x441, 0x435, 0x43d,
-0x442, 0x2e, 0x3b, 0x43e, 0x43a, 0x442, 0x2e, 0x3b, 0x43d, 0x43e, 0x44f, 0x431, 0x2e, 0x3b, 0x434, 0x435, 0x43a, 0x2e, 0x442, 0x43e,
-0x445, 0x441, 0x443, 0x43d, 0x43d, 0x44c, 0x443, 0x3b, 0x43e, 0x43b, 0x443, 0x43d, 0x43d, 0x44c, 0x443, 0x3b, 0x43a, 0x443, 0x43b, 0x443,
-0x43d, 0x20, 0x442, 0x443, 0x442, 0x430, 0x440, 0x3b, 0x43c, 0x443, 0x443, 0x441, 0x20, 0x443, 0x441, 0x442, 0x430, 0x440, 0x3b, 0x44b,
-0x430, 0x43c, 0x20, 0x44b, 0x439, 0x430, 0x3b, 0x431, 0x44d, 0x441, 0x20, 0x44b, 0x439, 0x430, 0x3b, 0x43e, 0x442, 0x20, 0x44b, 0x439,
-0x430, 0x3b, 0x430, 0x442, 0x44b, 0x440, 0x434, 0x44c, 0x44b, 0x445, 0x20, 0x44b, 0x439, 0x430, 0x3b, 0x431, 0x430, 0x43b, 0x430, 0x495,
-0x430, 0x43d, 0x20, 0x44b, 0x439, 0x430, 0x3b, 0x430, 0x43b, 0x442, 0x44b, 0x43d, 0x43d, 0x44c, 0x44b, 0x3b, 0x441, 0x44d, 0x442, 0x438,
-0x43d, 0x43d, 0x44c, 0x438, 0x3b, 0x430, 0x445, 0x441, 0x44b, 0x43d, 0x43d, 0x44c, 0x44b, 0x422, 0x43e, 0x445, 0x441, 0x443, 0x43d, 0x43d,
-0x44c, 0x443, 0x3b, 0x41e, 0x43b, 0x443, 0x43d, 0x43d, 0x44c, 0x443, 0x3b, 0x41a, 0x443, 0x43b, 0x443, 0x43d, 0x20, 0x442, 0x443, 0x442,
-0x430, 0x440, 0x3b, 0x41c, 0x443, 0x443, 0x441, 0x20, 0x443, 0x441, 0x442, 0x430, 0x440, 0x3b, 0x42b, 0x430, 0x43c, 0x20, 0x44b, 0x439,
-0x44b, 0x43d, 0x3b, 0x411, 0x44d, 0x441, 0x20, 0x44b, 0x439, 0x44b, 0x43d, 0x3b, 0x41e, 0x442, 0x20, 0x44b, 0x439, 0x44b, 0x43d, 0x3b,
-0x410, 0x442, 0x44b, 0x440, 0x434, 0x44c, 0x44b, 0x445, 0x20, 0x44b, 0x439, 0x44b, 0x43d, 0x3b, 0x411, 0x430, 0x43b, 0x430, 0x495, 0x430,
-0x43d, 0x20, 0x44b, 0x439, 0x44b, 0x43d, 0x3b, 0x410, 0x43b, 0x442, 0x44b, 0x43d, 0x43d, 0x44c, 0x44b, 0x3b, 0x421, 0x44d, 0x442, 0x438,
-0x43d, 0x43d, 0x44c, 0x438, 0x3b, 0x430, 0x445, 0x441, 0x44b, 0x43d, 0x43d, 0x44c, 0x44b, 0x422, 0x43e, 0x445, 0x441, 0x3b, 0x41e, 0x43b,
-0x443, 0x43d, 0x3b, 0x41a, 0x43b, 0x43d, 0x3b, 0x41c, 0x441, 0x443, 0x3b, 0x42b, 0x430, 0x43c, 0x3b, 0x411, 0x44d, 0x441, 0x3b, 0x41e,
-0x442, 0x439, 0x3b, 0x410, 0x442, 0x440, 0x3b, 0x411, 0x43b, 0x495, 0x3b, 0x410, 0x43b, 0x442, 0x3b, 0x421, 0x44d, 0x442, 0x3b, 0x410,
-0x445, 0x441, 0x422, 0x3b, 0x41e, 0x3b, 0x41a, 0x3b, 0x41c, 0x3b, 0x42b, 0x3b, 0x411, 0x3b, 0x41e, 0x3b, 0x410, 0x3b, 0x411, 0x3b,
-0x410, 0x3b, 0x421, 0x3b, 0x410, 0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c, 0x65, 0x20, 0x6f, 0x62, 0x6f, 0x3b, 0x4c, 0x61, 0x70,
-0x61, 0x20, 0x6c, 0x65, 0x20, 0x77, 0x61, 0x61, 0x72, 0x65, 0x3b, 0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c, 0x65, 0x20, 0x6f,
-0x6b, 0x75, 0x6e, 0x69, 0x3b, 0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c, 0x65, 0x20, 0x6f, 0x6e, 0x67, 0x2019, 0x77, 0x61, 0x6e,
-0x3b, 0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c, 0x65, 0x20, 0x69, 0x6d, 0x65, 0x74, 0x3b, 0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c,
-0x65, 0x20, 0x69, 0x6c, 0x65, 0x3b, 0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c, 0x65, 0x20, 0x73, 0x61, 0x70, 0x61, 0x3b, 0x4c,
-0x61, 0x70, 0x61, 0x20, 0x6c, 0x65, 0x20, 0x69, 0x73, 0x69, 0x65, 0x74, 0x3b, 0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c, 0x65,
-0x20, 0x73, 0x61, 0x61, 0x6c, 0x3b, 0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x6d, 0x6f, 0x6e, 0x3b,
-0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x6d, 0x6f, 0x6e, 0x20, 0x6f, 0x62, 0x6f, 0x3b, 0x4c, 0x61,
-0x70, 0x61, 0x20, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x6d, 0x6f, 0x6e, 0x20, 0x77, 0x61, 0x61, 0x72, 0x65, 0x4f, 0x62, 0x6f,
-0x3b, 0x57, 0x61, 0x61, 0x3b, 0x4f, 0x6b, 0x75, 0x3b, 0x4f, 0x6e, 0x67, 0x3b, 0x49, 0x6d, 0x65, 0x3b, 0x49, 0x6c, 0x65,
-0x3b, 0x53, 0x61, 0x70, 0x3b, 0x49, 0x73, 0x69, 0x3b, 0x53, 0x61, 0x61, 0x3b, 0x54, 0x6f, 0x6d, 0x3b, 0x54, 0x6f, 0x62,
-0x3b, 0x54, 0x6f, 0x77, 0x4f, 0x3b, 0x57, 0x3b, 0x4f, 0x3b, 0x4f, 0x3b, 0x49, 0x3b, 0x49, 0x3b, 0x53, 0x3b, 0x49, 0x3b,
-0x53, 0x3b, 0x54, 0x3b, 0x54, 0x3b, 0x54, 0x4e, 0x79, 0x65, 0x6e, 0x79, 0x65, 0x3b, 0x46, 0x75, 0x6c, 0x75, 0x6e, 0x64,
-0xef, 0x67, 0x69, 0x3b, 0x4d, 0x62, 0xe4, 0x6e, 0x67, 0xfc, 0x3b, 0x4e, 0x67, 0x75, 0x62, 0xf9, 0x65, 0x3b, 0x42, 0xea,
-0x6c, 0xe4, 0x77, 0xfc, 0x3b, 0x46, 0xf6, 0x6e, 0x64, 0x6f, 0x3b, 0x4c, 0x65, 0x6e, 0x67, 0x75, 0x61, 0x3b, 0x4b, 0xfc,
-0x6b, 0xfc, 0x72, 0xfc, 0x3b, 0x4d, 0x76, 0x75, 0x6b, 0x61, 0x3b, 0x4e, 0x67, 0x62, 0x65, 0x72, 0x65, 0x72, 0x65, 0x3b,
-0x4e, 0x61, 0x62, 0xe4, 0x6e, 0x64, 0xfc, 0x72, 0x75, 0x3b, 0x4b, 0x61, 0x6b, 0x61, 0x75, 0x6b, 0x61, 0x4e, 0x79, 0x65,
-0x3b, 0x46, 0x75, 0x6c, 0x3b, 0x4d, 0x62, 0xe4, 0x3b, 0x4e, 0x67, 0x75, 0x3b, 0x42, 0xea, 0x6c, 0x3b, 0x46, 0xf6, 0x6e,
-0x3b, 0x4c, 0x65, 0x6e, 0x3b, 0x4b, 0xfc, 0x6b, 0x3b, 0x4d, 0x76, 0x75, 0x3b, 0x4e, 0x67, 0x62, 0x3b, 0x4e, 0x61, 0x62,
-0x3b, 0x4b, 0x61, 0x6b, 0x4e, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x4e, 0x3b, 0x42, 0x3b, 0x46, 0x3b, 0x4c, 0x3b, 0x4b, 0x3b,
-0x4d, 0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x4b, 0x4d, 0x75, 0x70, 0x61, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x6c, 0x77, 0x61, 0x3b,
-0x4d, 0x77, 0x69, 0x74, 0x6f, 0x70, 0x65, 0x3b, 0x4d, 0x75, 0x73, 0x68, 0x65, 0x6e, 0x64, 0x65, 0x3b, 0x4d, 0x75, 0x6e,
-0x79, 0x69, 0x3b, 0x4d, 0x75, 0x73, 0x68, 0x65, 0x6e, 0x64, 0x65, 0x20, 0x4d, 0x61, 0x67, 0x61, 0x6c, 0x69, 0x3b, 0x4d,
-0x75, 0x6a, 0x69, 0x6d, 0x62, 0x69, 0x3b, 0x4d, 0x75, 0x73, 0x68, 0x69, 0x70, 0x65, 0x70, 0x6f, 0x3b, 0x4d, 0x75, 0x70,
-0x75, 0x67, 0x75, 0x74, 0x6f, 0x3b, 0x4d, 0x75, 0x6e, 0x79, 0x65, 0x6e, 0x73, 0x65, 0x3b, 0x4d, 0x6f, 0x6b, 0x68, 0x75,
-0x3b, 0x4d, 0x75, 0x73, 0x6f, 0x6e, 0x67, 0x61, 0x6e, 0x64, 0x65, 0x6d, 0x62, 0x77, 0x65, 0x3b, 0x4d, 0x75, 0x68, 0x61,
-0x61, 0x6e, 0x6f, 0x4d, 0x75, 0x70, 0x3b, 0x4d, 0x77, 0x69, 0x3b, 0x4d, 0x73, 0x68, 0x3b, 0x4d, 0x75, 0x6e, 0x3b, 0x4d,
-0x61, 0x67, 0x3b, 0x4d, 0x75, 0x6a, 0x3b, 0x4d, 0x73, 0x70, 0x3b, 0x4d, 0x70, 0x67, 0x3b, 0x4d, 0x79, 0x65, 0x3b, 0x4d,
-0x6f, 0x6b, 0x3b, 0x4d, 0x75, 0x73, 0x3b, 0x4d, 0x75, 0x68, 0x91c, 0x928, 0x935, 0x930, 0x940, 0x92e, 0x93e, 0x938, 0x903, 0x3b,
-0x92b, 0x930, 0x935, 0x930, 0x940, 0x92e, 0x93e, 0x938, 0x903, 0x3b, 0x92e, 0x93e, 0x930, 0x94d, 0x91a, 0x92e, 0x93e, 0x938, 0x903, 0x3b,
-0x905, 0x92a, 0x94d, 0x930, 0x948, 0x932, 0x92e, 0x93e, 0x938, 0x903, 0x3b, 0x92e, 0x908, 0x92e, 0x93e, 0x938, 0x903, 0x3b, 0x91c, 0x942,
-0x928, 0x92e, 0x93e, 0x938, 0x903, 0x3b, 0x91c, 0x941, 0x932, 0x93e, 0x908, 0x92e, 0x93e, 0x938, 0x903, 0x3b, 0x905, 0x917, 0x938, 0x94d,
-0x924, 0x92e, 0x93e, 0x938, 0x903, 0x3b, 0x938, 0x93f, 0x924, 0x902, 0x92c, 0x930, 0x92e, 0x93e, 0x938, 0x903, 0x3b, 0x905, 0x915, 0x94d,
-0x924, 0x942, 0x92c, 0x930, 0x92e, 0x93e, 0x938, 0x903, 0x3b, 0x928, 0x935, 0x902, 0x92c, 0x930, 0x92e, 0x93e, 0x938, 0x903, 0x3b, 0x926,
-0x93f, 0x938, 0x902, 0x92c, 0x930, 0x92e, 0x93e, 0x938, 0x903, 0x91c, 0x928, 0x935, 0x930, 0x940, 0x3a, 0x3b, 0x92b, 0x930, 0x935, 0x930,
-0x940, 0x3a, 0x3b, 0x92e, 0x93e, 0x930, 0x94d, 0x91a, 0x3a, 0x3b, 0x905, 0x92a, 0x94d, 0x930, 0x948, 0x932, 0x3a, 0x3b, 0x92e, 0x908,
-0x3b, 0x91c, 0x942, 0x928, 0x3a, 0x3b, 0x91c, 0x941, 0x932, 0x93e, 0x908, 0x3a, 0x3b, 0x905, 0x917, 0x938, 0x94d, 0x924, 0x3a, 0x3b,
-0x938, 0x93f, 0x924, 0x902, 0x92c, 0x930, 0x3a, 0x3b, 0x905, 0x915, 0x94d, 0x924, 0x942, 0x92c, 0x930, 0x3a, 0x3b, 0x928, 0x935, 0x902,
-0x92c, 0x930, 0x3a, 0x3b, 0x926, 0x93f, 0x938, 0x902, 0x92c, 0x930, 0x3a, 0x1c61, 0x1c5f, 0x1c71, 0x1c63, 0x1c5f, 0x1c68, 0x1c64, 0x3b, 0x1c6f,
-0x1c77, 0x1c5f, 0x1c68, 0x1c63, 0x1c5f, 0x1c68, 0x1c64, 0x3b, 0x1c62, 0x1c5f, 0x1c68, 0x1c6a, 0x3b, 0x1c5f, 0x1c6f, 0x1c68, 0x1c6e, 0x1c5e, 0x3b, 0x1c62,
-0x1c6e, 0x3b, 0x1c61, 0x1c69, 0x1c71, 0x3b, 0x1c61, 0x1c69, 0x1c5e, 0x1c5f, 0x1c6d, 0x3b, 0x1c5f, 0x1c5c, 0x1c5f, 0x1c65, 0x1c5b, 0x3b, 0x1c65, 0x1c6e,
-0x1c6f, 0x1c74, 0x1c6e, 0x1c62, 0x1c75, 0x1c5f, 0x1c68, 0x3b, 0x1c5a, 0x1c60, 0x1c74, 0x1c5a, 0x1c75, 0x1c5f, 0x1c68, 0x3b, 0x1c71, 0x1c5f, 0x1c63, 0x1c5f,
-0x1c62, 0x1c75, 0x1c5f, 0x1c68, 0x3b, 0x1c6b, 0x1c64, 0x1c65, 0x1c5f, 0x1c62, 0x1c75, 0x1c5f, 0x1c68, 0x1c61, 0x1c5f, 0x1c71, 0x3b, 0x1c6f, 0x1c77, 0x1c5f,
-0x3b, 0x1c62, 0x1c5f, 0x1c68, 0x3b, 0x1c5f, 0x1c6f, 0x1c68, 0x3b, 0x1c62, 0x1c6e, 0x3b, 0x1c61, 0x1c69, 0x1c71, 0x3b, 0x1c61, 0x1c69, 0x1c5e, 0x3b,
-0x1c5f, 0x1c5c, 0x1c5f, 0x3b, 0x1c65, 0x1c6e, 0x1c6f, 0x3b, 0x1c5a, 0x1c60, 0x1c74, 0x3b, 0x1c71, 0x1c5f, 0x1c63, 0x3b, 0x1c6b, 0x1c64, 0x1c65, 0x1c61,
-0x3b, 0x1c6f, 0x3b, 0x1c62, 0x3b, 0x1c5f, 0x3b, 0x1c62, 0x3b, 0x1c61, 0x3b, 0x1c61, 0x3b, 0x1c5f, 0x3b, 0x1c65, 0x3b, 0x1c5a, 0x3b, 0x1c71,
-0x3b, 0x1c6b, 0x67, 0x68, 0x65, 0x6e, 0x6e, 0xe0, 0x72, 0x67, 0x69, 0x75, 0x3b, 0x66, 0x72, 0x65, 0xe0, 0x72, 0x67, 0x69,
-0x75, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x7a, 0x75, 0x3b, 0x61, 0x62, 0x72, 0x69, 0x6c, 0x65, 0x3b, 0x6d, 0x61, 0x6a, 0x75,
-0x3b, 0x6c, 0xe0, 0x6d, 0x70, 0x61, 0x64, 0x61, 0x73, 0x3b, 0x74, 0x72, 0xec, 0x75, 0x6c, 0x61, 0x73, 0x3b, 0x61, 0x75,
-0x73, 0x74, 0x75, 0x3b, 0x63, 0x61, 0x62, 0x75, 0x64, 0x61, 0x6e, 0x6e, 0x69, 0x3b, 0x73, 0x61, 0x6e, 0x74, 0x75, 0x67,
-0x61, 0x69, 0x6e, 0x65, 0x3b, 0x73, 0x61, 0x6e, 0x74, 0x61, 0x6e, 0x64, 0x72, 0x69, 0x61, 0x3b, 0x6e, 0x61, 0x64, 0x61,
-0x6c, 0x65, 0x67, 0x68, 0x65, 0x3b, 0x66, 0x72, 0x65, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x61, 0x62, 0x72, 0x3b, 0x6d, 0x61,
-0x6a, 0x3b, 0x6c, 0xe0, 0x6d, 0x3b, 0x74, 0x72, 0xec, 0x3b, 0x61, 0x75, 0x73, 0x3b, 0x63, 0x61, 0x62, 0x3b, 0x73, 0x74,
-0x47, 0x3b, 0x73, 0x74, 0x41, 0x3b, 0x6e, 0x61, 0x64, 0x47, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x4c,
-0x3b, 0x54, 0x3b, 0x41, 0x3b, 0x43, 0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x4e, 0x4a, 0x61, 0x6e, 0x65, 0x69, 0x72, 0x6f, 0x3b,
-0x46, 0x65, 0x76, 0x72, 0x65, 0x69, 0x72, 0x6f, 0x3b, 0x4d, 0x61, 0x72, 0x63, 0x6f, 0x3b, 0x41, 0x62, 0x72, 0x69, 0x6c,
-0x3b, 0x4d, 0x61, 0x69, 0x6f, 0x3b, 0x4a, 0x75, 0x6e, 0x68, 0x6f, 0x3b, 0x4a, 0x75, 0x6c, 0x68, 0x6f, 0x3b, 0x41, 0x75,
-0x67, 0x75, 0x73, 0x74, 0x6f, 0x3b, 0x53, 0x65, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x6f, 0x3b, 0x4f, 0x74, 0x75, 0x62, 0x72,
-0x6f, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x6f, 0x3b, 0x44, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x72, 0x6f, 0x4a,
-0x61, 0x6e, 0x3b, 0x46, 0x65, 0x76, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x62, 0x72, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a,
-0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x75, 0x67, 0x3b, 0x53, 0x65, 0x74, 0x3b, 0x4f, 0x74, 0x75, 0x3b, 0x4e,
-0x6f, 0x76, 0x3b, 0x44, 0x65, 0x63, 0x458, 0x430, 0x43d, 0x443, 0x430, 0x440, 0x3b, 0x444, 0x435, 0x431, 0x440, 0x443, 0x430, 0x440,
-0x3b, 0x43c, 0x430, 0x440, 0x442, 0x3b, 0x430, 0x43f, 0x440, 0x438, 0x43b, 0x3b, 0x43c, 0x430, 0x458, 0x3b, 0x458, 0x443, 0x43d, 0x3b,
-0x458, 0x443, 0x43b, 0x3b, 0x430, 0x432, 0x433, 0x443, 0x441, 0x442, 0x3b, 0x441, 0x435, 0x43f, 0x442, 0x435, 0x43c, 0x431, 0x430, 0x440,
-0x3b, 0x43e, 0x43a, 0x442, 0x43e, 0x431, 0x430, 0x440, 0x3b, 0x43d, 0x43e, 0x432, 0x435, 0x43c, 0x431, 0x430, 0x440, 0x3b, 0x434, 0x435,
-0x446, 0x435, 0x43c, 0x431, 0x430, 0x440, 0x458, 0x430, 0x43d, 0x3b, 0x444, 0x435, 0x431, 0x3b, 0x43c, 0x430, 0x440, 0x3b, 0x430, 0x43f,
-0x440, 0x3b, 0x43c, 0x430, 0x458, 0x3b, 0x458, 0x443, 0x43d, 0x3b, 0x458, 0x443, 0x43b, 0x3b, 0x430, 0x432, 0x433, 0x3b, 0x441, 0x435,
-0x43f, 0x3b, 0x43e, 0x43a, 0x442, 0x3b, 0x43d, 0x43e, 0x432, 0x3b, 0x434, 0x435, 0x446, 0x458, 0x430, 0x43d, 0x3b, 0x444, 0x435, 0x431,
-0x3b, 0x43c, 0x430, 0x440, 0x442, 0x3b, 0x430, 0x43f, 0x440, 0x3b, 0x43c, 0x430, 0x458, 0x3b, 0x458, 0x443, 0x43d, 0x3b, 0x458, 0x443,
-0x43b, 0x3b, 0x430, 0x432, 0x433, 0x3b, 0x441, 0x435, 0x43f, 0x442, 0x3b, 0x43e, 0x43a, 0x442, 0x3b, 0x43d, 0x43e, 0x432, 0x3b, 0x434,
-0x435, 0x446, 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b, 0x6d, 0x61, 0x72,
-0x74, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x3b, 0x6a, 0x75, 0x6c, 0x3b,
-0x61, 0x76, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x3b, 0x6f, 0x6b, 0x74,
-0x6f, 0x62, 0x61, 0x72, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62,
-0x61, 0x72, 0x6a, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x62, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x61, 0x70, 0x72, 0x3b, 0x6d, 0x61,
-0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x3b, 0x6a, 0x75, 0x6c, 0x3b, 0x61, 0x76, 0x67, 0x3b, 0x73, 0x65, 0x70, 0x3b, 0x6f, 0x6b,
-0x74, 0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64, 0x65, 0x63, 0x6a, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x62, 0x3b, 0x6d, 0x61, 0x72,
-0x74, 0x3b, 0x61, 0x70, 0x72, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x3b, 0x6a, 0x75, 0x6c, 0x3b, 0x61, 0x76,
-0x67, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x3b, 0x6f, 0x6b, 0x74, 0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64, 0x65, 0x63, 0x4a, 0x61,
-0x6e, 0x75, 0x61, 0x6c, 0x69, 0x3b, 0x46, 0x65, 0x62, 0x6c, 0x75, 0x61, 0x6c, 0x69, 0x3b, 0x4d, 0x61, 0x63, 0x68, 0x69,
-0x3b, 0x41, 0x70, 0x6c, 0x69, 0x6c, 0x69, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c,
-0x61, 0x69, 0x3b, 0x41, 0x67, 0x6f, 0x73, 0x74, 0x69, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4f,
-0x6b, 0x74, 0x6f, 0x62, 0x61, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x44, 0x65, 0x73, 0x65, 0x6d, 0x62,
-0x61, 0x4e, 0x64, 0x69, 0x72, 0x61, 0x3b, 0x4b, 0x75, 0x6b, 0x61, 0x64, 0x7a, 0x69, 0x3b, 0x4b, 0x75, 0x72, 0x75, 0x6d,
-0x65, 0x3b, 0x4b, 0x75, 0x62, 0x76, 0x75, 0x6d, 0x62, 0x69, 0x3b, 0x43, 0x68, 0x69, 0x76, 0x61, 0x62, 0x76, 0x75, 0x3b,
-0x43, 0x68, 0x69, 0x6b, 0x75, 0x6d, 0x69, 0x3b, 0x43, 0x68, 0x69, 0x6b, 0x75, 0x6e, 0x67, 0x75, 0x72, 0x75, 0x3b, 0x4e,
-0x79, 0x61, 0x6d, 0x61, 0x76, 0x68, 0x75, 0x76, 0x68, 0x75, 0x3b, 0x47, 0x75, 0x6e, 0x79, 0x61, 0x6e, 0x61, 0x3b, 0x47,
-0x75, 0x6d, 0x69, 0x67, 0x75, 0x72, 0x75, 0x3b, 0x4d, 0x62, 0x75, 0x64, 0x7a, 0x69, 0x3b, 0x5a, 0x76, 0x69, 0x74, 0x61,
-0x4e, 0x64, 0x69, 0x3b, 0x4b, 0x75, 0x6b, 0x3b, 0x4b, 0x75, 0x72, 0x3b, 0x4b, 0x75, 0x62, 0x3b, 0x43, 0x68, 0x76, 0x3b,
-0x43, 0x68, 0x6b, 0x3b, 0x43, 0x68, 0x67, 0x3b, 0x4e, 0x79, 0x61, 0x3b, 0x47, 0x75, 0x6e, 0x3b, 0x47, 0x75, 0x6d, 0x3b,
-0x4d, 0x62, 0x75, 0x3b, 0x5a, 0x76, 0x69, 0x4e, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x43, 0x3b, 0x43, 0x3b, 0x43,
-0x3b, 0x4e, 0x3b, 0x47, 0x3b, 0x47, 0x3b, 0x4d, 0x3b, 0x5a, 0xa2cd, 0xa1aa, 0x3b, 0xa44d, 0xa1aa, 0x3b, 0xa315, 0xa1aa, 0x3b, 0xa1d6,
-0xa1aa, 0x3b, 0xa26c, 0xa1aa, 0x3b, 0xa0d8, 0xa1aa, 0x3b, 0xa3c3, 0xa1aa, 0x3b, 0xa246, 0xa1aa, 0x3b, 0xa22c, 0xa1aa, 0x3b, 0xa2b0, 0xa1aa, 0x3b,
-0xa2b0, 0xa2aa, 0xa1aa, 0x3b, 0xa2b0, 0xa44b, 0xa1aa, 0x62c, 0x646, 0x648, 0x631, 0x64a, 0x3b, 0x641, 0x64a, 0x628, 0x631, 0x648, 0x631, 0x64a,
-0x3b, 0x645, 0x627, 0x631, 0x686, 0x3b, 0x627, 0x67e, 0x631, 0x64a, 0x644, 0x3b, 0x645, 0x626, 0x64a, 0x3b, 0x62c, 0x648, 0x646, 0x3b,
-0x62c, 0x648, 0x644, 0x627, 0x621, 0x650, 0x3b, 0x622, 0x6af, 0x633, 0x67d, 0x3b, 0x633, 0x64a, 0x67e, 0x67d, 0x645, 0x628, 0x631, 0x3b,
-0x622, 0x6aa, 0x67d, 0x648, 0x628, 0x631, 0x3b, 0x646, 0x648, 0x645, 0x628, 0x631, 0x3b, 0x68a, 0x633, 0x645, 0x628, 0x631, 0x91c, 0x928,
-0x935, 0x930, 0x940, 0x3b, 0x92b, 0x930, 0x935, 0x930, 0x940, 0x3b, 0x92e, 0x93e, 0x930, 0x94d, 0x91a, 0x941, 0x3b, 0x905, 0x92a, 0x94d,
-0x930, 0x948, 0x932, 0x3b, 0x92e, 0x908, 0x3b, 0x91c, 0x942, 0x928, 0x3b, 0x91c, 0x941, 0x932, 0x93e, 0x908, 0x3b, 0x905, 0x917, 0x938,
-0x94d, 0x91f, 0x3b, 0x938, 0x92a, 0x94d, 0x91f, 0x947, 0x902, 0x92c, 0x930, 0x3b, 0x911, 0x915, 0x94d, 0x91f, 0x94b, 0x92c, 0x930, 0x3b,
-0x928, 0x935, 0x902, 0x92c, 0x930, 0x3b, 0x921, 0x93f, 0x938, 0x902, 0x92c, 0x930, 0x91c, 0x928, 0x3b, 0x92b, 0x930, 0x3b, 0x92e, 0x93e,
-0x930, 0x94d, 0x91a, 0x3b, 0x905, 0x92a, 0x94d, 0x930, 0x948, 0x3b, 0x92e, 0x908, 0x3b, 0x91c, 0x942, 0x928, 0x3b, 0x91c, 0x941, 0x932,
-0x93e, 0x3b, 0x905, 0x917, 0x3b, 0x938, 0x92a, 0x94d, 0x91f, 0x947, 0x3b, 0x911, 0x915, 0x94d, 0x91f, 0x94b, 0x3b, 0x928, 0x935, 0x902,
-0x3b, 0x921, 0x93f, 0x938, 0x902, 0x91c, 0x928, 0x3b, 0x92b, 0x930, 0x3b, 0x92e, 0x93e, 0x930, 0x94d, 0x91a, 0x3b, 0x905, 0x92a, 0x94d,
-0x930, 0x948, 0x3b, 0x92e, 0x908, 0x3b, 0x91c, 0x942, 0x928, 0x3b, 0x91c, 0x941, 0x3b, 0x905, 0x917, 0x3b, 0x938, 0x92a, 0x94d, 0x91f,
-0x947, 0x3b, 0x911, 0x915, 0x94d, 0x91f, 0x94b, 0x3b, 0x928, 0x935, 0x902, 0x3b, 0x921, 0x93f, 0x938, 0x902, 0x91c, 0x3b, 0x92b, 0x93c,
-0x3b, 0x92e, 0x3b, 0x905, 0x3b, 0x92e, 0x93e, 0x3b, 0x91c, 0x942, 0x3b, 0x91c, 0x941, 0x3b, 0x905, 0x917, 0x3b, 0x938, 0x3b, 0x911,
-0x3b, 0x928, 0x3b, 0x921, 0x93f, 0x91c, 0x3b, 0x92b, 0x93c, 0x3b, 0x92e, 0x93e, 0x3b, 0x905, 0x3b, 0x92e, 0x93e, 0x3b, 0x91c, 0x942,
-0x3b, 0x91c, 0x941, 0x3b, 0x905, 0x917, 0x3b, 0x938, 0x3b, 0x911, 0x3b, 0x928, 0x3b, 0x921, 0x93f, 0xda2, 0xdb1, 0xdc0, 0xdcf, 0xdbb,
-0xdd2, 0x3b, 0xdb4, 0xdd9, 0xdb6, 0xdbb, 0xdc0, 0xdcf, 0xdbb, 0xdd2, 0x3b, 0xdb8, 0xdcf, 0xdbb, 0xdca, 0xdad, 0xdd4, 0x3b, 0xd85, 0xdb4,
-0xdca, 0x200d, 0xdbb, 0xdda, 0xdbd, 0xdca, 0x3b, 0xdb8, 0xdd0, 0xdba, 0xdd2, 0x3b, 0xda2, 0xdd6, 0xdb1, 0xdd2, 0x3b, 0xda2, 0xdd6, 0xdbd,
-0xdd2, 0x3b, 0xd85, 0xd9c, 0xddd, 0xdc3, 0xdca, 0xdad, 0xdd4, 0x3b, 0xdc3, 0xdd0, 0xdb4, 0xdca, 0xdad, 0xdd0, 0xdb8, 0xdca, 0xdb6, 0xdbb,
-0xdca, 0x3b, 0xd94, 0xd9a, 0xdca, 0xdad, 0xddd, 0xdb6, 0xdbb, 0xdca, 0x3b, 0xdb1, 0xddc, 0xdc0, 0xdd0, 0xdb8, 0xdca, 0xdb6, 0xdbb, 0xdca,
-0x3b, 0xdaf, 0xdd9, 0xdc3, 0xdd0, 0xdb8, 0xdca, 0xdb6, 0xdbb, 0xdca, 0xda2, 0xdb1, 0x3b, 0xdb4, 0xdd9, 0xdb6, 0x3b, 0xdb8, 0xdcf, 0xdbb,
-0xdca, 0x3b, 0xd85, 0xdb4, 0xdca, 0x200d, 0xdbb, 0xdda, 0xdbd, 0xdca, 0x3b, 0xdb8, 0xdd0, 0xdba, 0xdd2, 0x3b, 0xda2, 0xdd6, 0xdb1, 0xdd2,
-0x3b, 0xda2, 0xdd6, 0xdbd, 0xdd2, 0x3b, 0xd85, 0xd9c, 0xddd, 0x3b, 0xdc3, 0xdd0, 0xdb4, 0xdca, 0x3b, 0xd94, 0xd9a, 0xdca, 0x3b, 0xdb1,
-0xddc, 0xdc0, 0xdd0, 0x3b, 0xdaf, 0xdd9, 0xdc3, 0xdd0, 0xda2, 0xdb1, 0x3b, 0xdb4, 0xdd9, 0xdb6, 0x3b, 0xdb8, 0xdcf, 0xdbb, 0xdca, 0xdad,
-0xdd4, 0x3b, 0xd85, 0xdb4, 0xdca, 0x200d, 0xdbb, 0xdda, 0xdbd, 0xdca, 0x3b, 0xdb8, 0xdd0, 0xdba, 0xdd2, 0x3b, 0xda2, 0xdd6, 0xdb1, 0xdd2,
-0x3b, 0xda2, 0xdd6, 0xdbd, 0xdd2, 0x3b, 0xd85, 0xd9c, 0xddd, 0x3b, 0xdc3, 0xdd0, 0xdb4, 0xdca, 0x3b, 0xd94, 0xd9a, 0xdca, 0x3b, 0xdb1,
-0xddc, 0xdc0, 0xdd0, 0x3b, 0xdaf, 0xdd9, 0xdc3, 0xdd0, 0xda2, 0x3b, 0xdb4, 0xdd9, 0x3b, 0xdb8, 0xdcf, 0x3b, 0xd85, 0x3b, 0xdb8, 0xdd0,
-0x3b, 0xda2, 0xdd6, 0x3b, 0xda2, 0xdd6, 0x3b, 0xd85, 0x3b, 0xdc3, 0xdd0, 0x3b, 0xd94, 0x3b, 0xdb1, 0xdd9, 0x3b, 0xdaf, 0xdd9, 0x6a,
-0x61, 0x6e, 0x75, 0xe1, 0x72, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0xe1, 0x72, 0x3b, 0x6d, 0x61, 0x72, 0x65, 0x63, 0x3b,
-0x61, 0x70, 0x72, 0xed, 0x6c, 0x3b, 0x6d, 0xe1, 0x6a, 0x3b, 0x6a, 0xfa, 0x6e, 0x3b, 0x6a, 0xfa, 0x6c, 0x3b, 0x61, 0x75,
-0x67, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6f, 0x6b, 0x74, 0xf3, 0x62,
-0x65, 0x72, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x65, 0x72,
-0x6a, 0x61, 0x6e, 0x75, 0xe1, 0x72, 0x61, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0xe1, 0x72, 0x61, 0x3b, 0x6d, 0x61, 0x72,
-0x63, 0x61, 0x3b, 0x61, 0x70, 0x72, 0xed, 0x6c, 0x61, 0x3b, 0x6d, 0xe1, 0x6a, 0x61, 0x3b, 0x6a, 0xfa, 0x6e, 0x61, 0x3b,
-0x6a, 0xfa, 0x6c, 0x61, 0x3b, 0x61, 0x75, 0x67, 0x75, 0x73, 0x74, 0x61, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62,
-0x72, 0x61, 0x3b, 0x6f, 0x6b, 0x74, 0xf3, 0x62, 0x72, 0x61, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x61, 0x3b,
-0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x72, 0x61, 0x6a, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x62, 0x3b, 0x6d, 0x61, 0x72, 0x3b,
-0x61, 0x70, 0x72, 0x3b, 0x6d, 0xe1, 0x6a, 0x3b, 0x6a, 0xfa, 0x6e, 0x3b, 0x6a, 0xfa, 0x6c, 0x3b, 0x61, 0x75, 0x67, 0x3b,
-0x73, 0x65, 0x70, 0x3b, 0x6f, 0x6b, 0x74, 0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64, 0x65, 0x63, 0x6a, 0x61, 0x6e, 0x75, 0x61,
-0x72, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b, 0x6d, 0x61, 0x72, 0x65, 0x63, 0x3b, 0x61, 0x70, 0x72, 0x69,
-0x6c, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x6a, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x6a, 0x3b, 0x61, 0x76,
-0x67, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x62,
-0x65, 0x72, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x65, 0x72,
-0x6a, 0x61, 0x6e, 0x2e, 0x3b, 0x66, 0x65, 0x62, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x2e, 0x3b, 0x61, 0x70, 0x72, 0x2e, 0x3b,
-0x6d, 0x61, 0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x2e, 0x3b, 0x6a, 0x75, 0x6c, 0x2e, 0x3b, 0x61, 0x76, 0x67, 0x2e, 0x3b, 0x73,
-0x65, 0x70, 0x2e, 0x3b, 0x6f, 0x6b, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0x65, 0x63, 0x2e, 0x4a, 0x61,
-0x6e, 0x6e, 0x61, 0x61, 0x79, 0x6f, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x61, 0x61, 0x79, 0x6f, 0x3b, 0x4d, 0x61, 0x61, 0x72,
-0x73, 0x6f, 0x3b, 0x41, 0x62, 0x72, 0x69, 0x69, 0x6c, 0x3b, 0x4d, 0x61, 0x79, 0x3b, 0x4a, 0x75, 0x75, 0x6e, 0x3b, 0x4c,
-0x75, 0x75, 0x6c, 0x69, 0x79, 0x6f, 0x3b, 0x4f, 0x67, 0x6f, 0x73, 0x74, 0x3b, 0x53, 0x65, 0x62, 0x74, 0x65, 0x6d, 0x62,
-0x61, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x6f, 0x62, 0x61, 0x72, 0x3b, 0x4e, 0x6f, 0x66, 0x65, 0x6d, 0x62, 0x61, 0x72,
-0x3b, 0x44, 0x65, 0x73, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x42, 0x69, 0x73, 0x68, 0x61, 0x20, 0x4b, 0x6f, 0x6f, 0x62, 0x61,
-0x61, 0x64, 0x3b, 0x42, 0x69, 0x73, 0x68, 0x61, 0x20, 0x4c, 0x61, 0x62, 0x61, 0x61, 0x64, 0x3b, 0x42, 0x69, 0x73, 0x68,
-0x61, 0x20, 0x53, 0x61, 0x64, 0x64, 0x65, 0x78, 0x61, 0x61, 0x64, 0x3b, 0x42, 0x69, 0x73, 0x68, 0x61, 0x20, 0x41, 0x66,
-0x72, 0x61, 0x61, 0x64, 0x3b, 0x42, 0x69, 0x73, 0x68, 0x61, 0x20, 0x53, 0x68, 0x61, 0x6e, 0x61, 0x61, 0x64, 0x3b, 0x42,
-0x69, 0x73, 0x68, 0x61, 0x20, 0x4c, 0x69, 0x78, 0x61, 0x61, 0x64, 0x3b, 0x42, 0x69, 0x73, 0x68, 0x61, 0x20, 0x54, 0x6f,
-0x64, 0x6f, 0x62, 0x61, 0x61, 0x64, 0x3b, 0x42, 0x69, 0x73, 0x68, 0x61, 0x20, 0x53, 0x69, 0x64, 0x65, 0x65, 0x64, 0x61,
-0x61, 0x64, 0x3b, 0x42, 0x69, 0x73, 0x68, 0x61, 0x20, 0x53, 0x61, 0x67, 0x61, 0x61, 0x6c, 0x61, 0x61, 0x64, 0x3b, 0x42,
-0x69, 0x73, 0x68, 0x61, 0x20, 0x54, 0x6f, 0x62, 0x6e, 0x61, 0x61, 0x64, 0x3b, 0x42, 0x69, 0x73, 0x68, 0x61, 0x20, 0x4b,
-0x6f, 0x77, 0x20, 0x69, 0x79, 0x6f, 0x20, 0x54, 0x6f, 0x62, 0x6e, 0x61, 0x61, 0x64, 0x3b, 0x42, 0x69, 0x73, 0x68, 0x61,
-0x20, 0x4c, 0x61, 0x62, 0x61, 0x20, 0x69, 0x79, 0x6f, 0x20, 0x54, 0x6f, 0x62, 0x6e, 0x61, 0x61, 0x64, 0x4a, 0x61, 0x6e,
-0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x62, 0x72, 0x3b, 0x4d, 0x61, 0x79, 0x3b, 0x4a, 0x75, 0x6e,
-0x3b, 0x4c, 0x75, 0x6c, 0x3b, 0x4f, 0x67, 0x73, 0x3b, 0x53, 0x65, 0x62, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x66,
-0x3b, 0x44, 0x69, 0x73, 0x4a, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x4c, 0x3b, 0x4f, 0x3b,
-0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x65, 0x6e, 0x65, 0x72, 0x6f, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x65, 0x72, 0x6f,
-0x3b, 0x6d, 0x61, 0x72, 0x7a, 0x6f, 0x3b, 0x61, 0x62, 0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x61, 0x79, 0x6f, 0x3b, 0x6a, 0x75,
-0x6e, 0x69, 0x6f, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x6f, 0x3b, 0x61, 0x67, 0x6f, 0x73, 0x74, 0x6f, 0x3b, 0x73, 0x65, 0x70,
-0x74, 0x69, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x6f, 0x63, 0x74, 0x75, 0x62, 0x72, 0x65, 0x3b, 0x6e, 0x6f, 0x76, 0x69,
-0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x64, 0x69, 0x63, 0x69, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x65, 0x6e, 0x65, 0x3b, 0x66,
-0x65, 0x62, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x61, 0x62, 0x72, 0x3b, 0x6d, 0x61, 0x79, 0x3b, 0x6a, 0x75, 0x6e, 0x3b, 0x6a,
-0x75, 0x6c, 0x3b, 0x61, 0x67, 0x6f, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x3b, 0x6f, 0x63, 0x74, 0x3b, 0x6e, 0x6f, 0x76, 0x3b,
-0x64, 0x69, 0x63, 0x45, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0x41, 0x3b, 0x53,
-0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x65, 0x6e, 0x65, 0x2e, 0x3b, 0x66, 0x65, 0x62, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x2e,
-0x3b, 0x61, 0x62, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x79, 0x2e, 0x3b, 0x6a, 0x75, 0x6e, 0x2e, 0x3b, 0x6a, 0x75, 0x6c, 0x2e,
-0x3b, 0x61, 0x67, 0x6f, 0x2e, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x2e, 0x3b, 0x6f, 0x63, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76,
-0x2e, 0x3b, 0x64, 0x69, 0x63, 0x2e, 0x65, 0x6e, 0x65, 0x72, 0x6f, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x65, 0x72, 0x6f, 0x3b,
-0x6d, 0x61, 0x72, 0x7a, 0x6f, 0x3b, 0x61, 0x62, 0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x61, 0x79, 0x6f, 0x3b, 0x6a, 0x75, 0x6e,
-0x69, 0x6f, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x6f, 0x3b, 0x61, 0x67, 0x6f, 0x73, 0x74, 0x6f, 0x3b, 0x73, 0x65, 0x74, 0x69,
-0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x6f, 0x63, 0x74, 0x75, 0x62, 0x72, 0x65, 0x3b, 0x6e, 0x6f, 0x76, 0x69, 0x65, 0x6d,
-0x62, 0x72, 0x65, 0x3b, 0x64, 0x69, 0x63, 0x69, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x45, 0x6e, 0x65, 0x2e, 0x3b, 0x46, 0x65,
-0x62, 0x2e, 0x3b, 0x4d, 0x61, 0x72, 0x2e, 0x3b, 0x41, 0x62, 0x72, 0x2e, 0x3b, 0x4d, 0x61, 0x79, 0x2e, 0x3b, 0x4a, 0x75,
-0x6e, 0x2e, 0x3b, 0x4a, 0x75, 0x6c, 0x2e, 0x3b, 0x41, 0x67, 0x6f, 0x2e, 0x3b, 0x53, 0x65, 0x74, 0x2e, 0x3b, 0x4f, 0x63,
-0x74, 0x2e, 0x3b, 0x4e, 0x6f, 0x76, 0x2e, 0x3b, 0x44, 0x69, 0x63, 0x2e, 0x65, 0x6e, 0x65, 0x2e, 0x3b, 0x66, 0x65, 0x62,
-0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x2e, 0x3b, 0x61, 0x62, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x79, 0x2e, 0x3b, 0x6a, 0x75, 0x6e,
-0x2e, 0x3b, 0x6a, 0x75, 0x6c, 0x2e, 0x3b, 0x61, 0x67, 0x6f, 0x2e, 0x3b, 0x73, 0x65, 0x74, 0x2e, 0x3b, 0x6f, 0x63, 0x74,
-0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0x69, 0x63, 0x2e, 0x2d49, 0x2d4f, 0x2d4f, 0x2d30, 0x2d62, 0x2d54, 0x3b, 0x2d31, 0x2d55,
-0x2d30, 0x2d62, 0x2d55, 0x3b, 0x2d4e, 0x2d30, 0x2d55, 0x2d5a, 0x3b, 0x2d49, 0x2d31, 0x2d54, 0x2d49, 0x2d54, 0x3b, 0x2d4e, 0x2d30, 0x2d62, 0x2d62, 0x2d53,
-0x3b, 0x2d62, 0x2d53, 0x2d4f, 0x2d62, 0x2d53, 0x3b, 0x2d62, 0x2d53, 0x2d4d, 0x2d62, 0x2d53, 0x2d63, 0x3b, 0x2d56, 0x2d53, 0x2d5b, 0x2d5c, 0x3b, 0x2d5b,
-0x2d53, 0x2d5c, 0x2d30, 0x2d4f, 0x2d31, 0x2d49, 0x2d54, 0x3b, 0x2d3d, 0x2d5c, 0x2d53, 0x2d31, 0x2d54, 0x3b, 0x2d4f, 0x2d53, 0x2d61, 0x2d30, 0x2d4f, 0x2d31,
-0x2d49, 0x2d54, 0x3b, 0x2d37, 0x2d53, 0x2d4a, 0x2d30, 0x2d4f, 0x2d31, 0x2d49, 0x2d54, 0x2d49, 0x2d4f, 0x2d4f, 0x3b, 0x2d31, 0x2d55, 0x2d30, 0x3b, 0x2d4e,
-0x2d30, 0x2d55, 0x3b, 0x2d49, 0x2d31, 0x2d54, 0x3b, 0x2d4e, 0x2d30, 0x2d62, 0x3b, 0x2d62, 0x2d53, 0x2d4f, 0x3b, 0x2d62, 0x2d53, 0x2d4d, 0x3b, 0x2d56,
-0x2d53, 0x2d5b, 0x3b, 0x2d5b, 0x2d53, 0x2d5c, 0x3b, 0x2d3d, 0x2d5c, 0x2d53, 0x3b, 0x2d4f, 0x2d53, 0x2d61, 0x3b, 0x2d37, 0x2d53, 0x2d4a, 0x2d49, 0x3b,
-0x2d31, 0x3b, 0x2d4e, 0x3b, 0x2d49, 0x3b, 0x2d4e, 0x3b, 0x2d62, 0x3b, 0x2d62, 0x3b, 0x2d56, 0x3b, 0x2d5b, 0x3b, 0x2d3d, 0x3b, 0x2d4f, 0x3b,
-0x2d37, 0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x50, 0xe9, 0x62, 0x72, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x4d, 0x61,
-0x72, 0x65, 0x74, 0x3b, 0x41, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0xe9, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a,
-0x75, 0x6c, 0x69, 0x3b, 0x41, 0x67, 0x75, 0x73, 0x74, 0x75, 0x73, 0x3b, 0x53, 0xe9, 0x70, 0x74, 0xe9, 0x6d, 0x62, 0x65,
-0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x4e, 0x6f, 0x70, 0xe9, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x44,
-0xe9, 0x73, 0xe9, 0x6d, 0x62, 0x65, 0x72, 0x4a, 0x61, 0x6e, 0x3b, 0x50, 0xe9, 0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41,
-0x70, 0x72, 0x3b, 0x4d, 0xe9, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x73, 0x3b, 0x53,
-0xe9, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x70, 0x3b, 0x44, 0xe9, 0x73, 0x4a, 0x3b, 0x50, 0x3b, 0x4d, 0x3b,
-0x41, 0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x6a, 0x61, 0x6e,
-0x75, 0x61, 0x72, 0x69, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x3b, 0x61,
-0x70, 0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x3b, 0x61,
-0x75, 0x67, 0x75, 0x73, 0x74, 0x69, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6f, 0x6b, 0x74,
-0x6f, 0x62, 0x65, 0x72, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62,
-0x65, 0x72, 0x6a, 0x61, 0x6e, 0x2e, 0x3b, 0x66, 0x65, 0x62, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x3b, 0x61, 0x70, 0x72,
-0x2e, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x3b, 0x61, 0x75, 0x67, 0x2e,
-0x3b, 0x73, 0x65, 0x70, 0x2e, 0x3b, 0x6f, 0x6b, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0x65, 0x63, 0x2e,
-0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b, 0x4d, 0xe4, 0x72, 0x7a, 0x3b,
-0x41, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x69, 0x3b,
-0x41, 0x75, 0x67, 0x75, 0x73, 0x63, 0x68, 0x74, 0x3b, 0x53, 0x65, 0x70, 0x74, 0xe4, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4f,
-0x6b, 0x74, 0x6f, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x4e, 0x6f, 0x76, 0xe4, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x44, 0x65, 0x7a,
-0xe4, 0x6d, 0x62, 0x65, 0x72, 0x69, 0x6e, 0x6e, 0x61, 0x79, 0x72, 0x3b, 0x62, 0x1e5b, 0x61, 0x79, 0x1e5b, 0x3b, 0x6d, 0x61,
-0x1e5b, 0x1e63, 0x3b, 0x69, 0x62, 0x72, 0x69, 0x72, 0x3b, 0x6d, 0x61, 0x79, 0x79, 0x75, 0x3b, 0x79, 0x75, 0x6e, 0x79, 0x75,
-0x3b, 0x79, 0x75, 0x6c, 0x79, 0x75, 0x7a, 0x3b, 0x263, 0x75, 0x63, 0x74, 0x3b, 0x63, 0x75, 0x74, 0x61, 0x6e, 0x62, 0x69,
-0x72, 0x3b, 0x6b, 0x74, 0x75, 0x62, 0x72, 0x3b, 0x6e, 0x75, 0x77, 0x61, 0x6e, 0x62, 0x69, 0x72, 0x3b, 0x64, 0x75, 0x6a,
-0x61, 0x6e, 0x62, 0x69, 0x72, 0x69, 0x6e, 0x6e, 0x3b, 0x62, 0x1e5b, 0x61, 0x3b, 0x6d, 0x61, 0x1e5b, 0x3b, 0x69, 0x62, 0x72,
-0x3b, 0x6d, 0x61, 0x79, 0x3b, 0x79, 0x75, 0x6e, 0x3b, 0x79, 0x75, 0x6c, 0x3b, 0x263, 0x75, 0x63, 0x3b, 0x63, 0x75, 0x74,
-0x3b, 0x6b, 0x74, 0x75, 0x3b, 0x6e, 0x75, 0x77, 0x3b, 0x64, 0x75, 0x6a, 0x69, 0x3b, 0x62, 0x3b, 0x6d, 0x3b, 0x69, 0x3b,
-0x6d, 0x3b, 0x79, 0x3b, 0x79, 0x3b, 0x263, 0x3b, 0x63, 0x3b, 0x6b, 0x3b, 0x6e, 0x3b, 0x64, 0x4d, 0x6f, 0x72, 0x69, 0x20,
-0x67, 0x68, 0x77, 0x61, 0x20, 0x69, 0x6d, 0x62, 0x69, 0x72, 0x69, 0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67, 0x68, 0x77,
-0x61, 0x20, 0x6b, 0x61, 0x77, 0x69, 0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67, 0x68, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x64,
-0x61, 0x64, 0x75, 0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67, 0x68, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x6e, 0x61, 0x3b, 0x4d,
-0x6f, 0x72, 0x69, 0x20, 0x67, 0x68, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x73, 0x61, 0x6e, 0x75, 0x3b, 0x4d, 0x6f, 0x72, 0x69,
-0x20, 0x67, 0x68, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x72, 0x61, 0x6e, 0x64, 0x61, 0x64, 0x75, 0x3b, 0x4d, 0x6f, 0x72, 0x69,
-0x20, 0x67, 0x68, 0x77, 0x61, 0x20, 0x6d, 0x66, 0x75, 0x6e, 0x67, 0x61, 0x64, 0x65, 0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20,
-0x67, 0x68, 0x77, 0x61, 0x20, 0x77, 0x75, 0x6e, 0x79, 0x61, 0x6e, 0x79, 0x61, 0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67,
-0x68, 0x77, 0x61, 0x20, 0x69, 0x6b, 0x65, 0x6e, 0x64, 0x61, 0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67, 0x68, 0x77, 0x61,
-0x20, 0x69, 0x6b, 0x75, 0x6d, 0x69, 0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67, 0x68, 0x77, 0x61, 0x20, 0x69, 0x6b, 0x75,
-0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x69, 0x6d, 0x77, 0x65, 0x72, 0x69, 0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67, 0x68,
-0x77, 0x61, 0x20, 0x69, 0x6b, 0x75, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x69, 0x77, 0x69, 0x49, 0x6d, 0x62, 0x3b, 0x4b,
-0x61, 0x77, 0x3b, 0x4b, 0x61, 0x64, 0x3b, 0x4b, 0x61, 0x6e, 0x3b, 0x4b, 0x61, 0x73, 0x3b, 0x4b, 0x61, 0x72, 0x3b, 0x4d,
-0x66, 0x75, 0x3b, 0x57, 0x75, 0x6e, 0x3b, 0x49, 0x6b, 0x65, 0x3b, 0x49, 0x6b, 0x75, 0x3b, 0x49, 0x6d, 0x77, 0x3b, 0x49,
-0x77, 0x69, 0x49, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4d, 0x3b, 0x57, 0x3b, 0x49, 0x3b,
-0x49, 0x3b, 0x49, 0x3b, 0x49, 0x42f, 0x43d, 0x432, 0x430, 0x440, 0x3b, 0x424, 0x435, 0x432, 0x440, 0x430, 0x43b, 0x3b, 0x41c, 0x430,
-0x440, 0x442, 0x3b, 0x410, 0x43f, 0x440, 0x435, 0x43b, 0x3b, 0x41c, 0x430, 0x439, 0x3b, 0x418, 0x44e, 0x43d, 0x3b, 0x418, 0x44e, 0x43b,
-0x3b, 0x410, 0x432, 0x433, 0x443, 0x441, 0x442, 0x3b, 0x421, 0x435, 0x43d, 0x442, 0x44f, 0x431, 0x440, 0x3b, 0x41e, 0x43a, 0x442, 0x44f,
-0x431, 0x440, 0x3b, 0x41d, 0x43e, 0x44f, 0x431, 0x440, 0x3b, 0x414, 0x435, 0x43a, 0x430, 0x431, 0x440, 0xb9c, 0xba9, 0xbb5, 0xbb0, 0xbbf,
-0x3b, 0xbaa, 0xbbf, 0xbaa, 0xbcd, 0xbb0, 0xbb5, 0xbb0, 0xbbf, 0x3b, 0xbae, 0xbbe, 0xbb0, 0xbcd, 0xb9a, 0xbcd, 0x3b, 0xb8f, 0xbaa, 0xbcd,
-0xbb0, 0xbb2, 0xbcd, 0x3b, 0xbae, 0xbc7, 0x3b, 0xb9c, 0xbc2, 0xba9, 0xbcd, 0x3b, 0xb9c, 0xbc2, 0xbb2, 0xbc8, 0x3b, 0xb86, 0xb95, 0xbb8,
-0xbcd, 0xb9f, 0xbcd, 0x3b, 0xb9a, 0xbc6, 0xbaa, 0xbcd, 0xb9f, 0xbae, 0xbcd, 0xbaa, 0xbb0, 0xbcd, 0x3b, 0xb85, 0xb95, 0xbcd, 0xb9f, 0xbcb,
-0xbaa, 0xbb0, 0xbcd, 0x3b, 0xba8, 0xbb5, 0xbae, 0xbcd, 0xbaa, 0xbb0, 0xbcd, 0x3b, 0xb9f, 0xbbf, 0xb9a, 0xbae, 0xbcd, 0xbaa, 0xbb0, 0xbcd,
-0xb9c, 0xba9, 0x2e, 0x3b, 0xbaa, 0xbbf, 0xbaa, 0xbcd, 0x2e, 0x3b, 0xbae, 0xbbe, 0xbb0, 0xbcd, 0x2e, 0x3b, 0xb8f, 0xbaa, 0xbcd, 0x2e,
-0x3b, 0xbae, 0xbc7, 0x3b, 0xb9c, 0xbc2, 0xba9, 0xbcd, 0x3b, 0xb9c, 0xbc2, 0xbb2, 0xbc8, 0x3b, 0xb86, 0xb95, 0x2e, 0x3b, 0xb9a, 0xbc6,
-0xbaa, 0xbcd, 0x2e, 0x3b, 0xb85, 0xb95, 0xbcd, 0x2e, 0x3b, 0xba8, 0xbb5, 0x2e, 0x3b, 0xb9f, 0xbbf, 0xb9a, 0x2e, 0xb9c, 0x3b, 0xbaa,
-0xbbf, 0x3b, 0xbae, 0xbbe, 0x3b, 0xb8f, 0x3b, 0xbae, 0xbc7, 0x3b, 0xb9c, 0xbc2, 0x3b, 0xb9c, 0xbc2, 0x3b, 0xb86, 0x3b, 0xb9a, 0xbc6,
-0x3b, 0xb85, 0x3b, 0xba8, 0x3b, 0xb9f, 0xbbf, 0x433, 0x44b, 0x439, 0x43d, 0x432, 0x430, 0x440, 0x3b, 0x444, 0x435, 0x432, 0x440, 0x430,
-0x43b, 0x44c, 0x3b, 0x43c, 0x430, 0x440, 0x442, 0x3b, 0x430, 0x43f, 0x440, 0x435, 0x43b, 0x44c, 0x3b, 0x43c, 0x430, 0x439, 0x3b, 0x438,
-0x44e, 0x43d, 0x44c, 0x3b, 0x438, 0x44e, 0x43b, 0x44c, 0x3b, 0x430, 0x432, 0x433, 0x443, 0x441, 0x442, 0x3b, 0x441, 0x435, 0x43d, 0x442,
-0x44f, 0x431, 0x440, 0x44c, 0x3b, 0x43e, 0x43a, 0x442, 0x44f, 0x431, 0x440, 0x44c, 0x3b, 0x43d, 0x43e, 0x44f, 0x431, 0x440, 0x44c, 0x3b,
-0x434, 0x435, 0x43a, 0x430, 0x431, 0x440, 0x44c, 0x433, 0x44b, 0x439, 0x43d, 0x2e, 0x3b, 0x444, 0x435, 0x432, 0x2e, 0x3b, 0x43c, 0x430,
-0x440, 0x2e, 0x3b, 0x430, 0x43f, 0x440, 0x2e, 0x3b, 0x43c, 0x430, 0x439, 0x3b, 0x438, 0x44e, 0x43d, 0x44c, 0x3b, 0x438, 0x44e, 0x43b,
-0x44c, 0x3b, 0x430, 0x432, 0x433, 0x2e, 0x3b, 0x441, 0x435, 0x43d, 0x442, 0x2e, 0x3b, 0x43e, 0x43a, 0x442, 0x2e, 0x3b, 0x43d, 0x43e,
-0x44f, 0x431, 0x2e, 0x3b, 0x434, 0x435, 0x43a, 0x2e, 0xc1c, 0xc28, 0xc35, 0xc30, 0xc3f, 0x3b, 0xc2b, 0xc3f, 0xc2c, 0xc4d, 0xc30, 0xc35,
-0xc30, 0xc3f, 0x3b, 0xc2e, 0xc3e, 0xc30, 0xc4d, 0xc1a, 0xc3f, 0x3b, 0xc0f, 0xc2a, 0xc4d, 0xc30, 0xc3f, 0xc32, 0xc4d, 0x3b, 0xc2e, 0xc47,
-0x3b, 0xc1c, 0xc42, 0xc28, 0xc4d, 0x3b, 0xc1c, 0xc41, 0xc32, 0xc48, 0x3b, 0xc06, 0xc17, 0xc38, 0xc4d, 0xc1f, 0xc41, 0x3b, 0xc38, 0xc46,
-0xc2a, 0xc4d, 0xc1f, 0xc46, 0xc02, 0xc2c, 0xc30, 0xc4d, 0x3b, 0xc05, 0xc15, 0xc4d, 0xc1f, 0xc4b, 0xc2c, 0xc30, 0xc4d, 0x3b, 0xc28, 0xc35,
-0xc02, 0xc2c, 0xc30, 0xc4d, 0x3b, 0xc21, 0xc3f, 0xc38, 0xc46, 0xc02, 0xc2c, 0xc30, 0xc4d, 0xc1c, 0xc28, 0x3b, 0xc2b, 0xc3f, 0xc2c, 0xc4d,
-0xc30, 0x3b, 0xc2e, 0xc3e, 0xc30, 0xc4d, 0xc1a, 0xc3f, 0x3b, 0xc0f, 0xc2a, 0xc4d, 0xc30, 0xc3f, 0x3b, 0xc2e, 0xc47, 0x3b, 0xc1c, 0xc42,
-0xc28, 0xc4d, 0x3b, 0xc1c, 0xc41, 0xc32, 0xc48, 0x3b, 0xc06, 0xc17, 0x3b, 0xc38, 0xc46, 0xc2a, 0xc4d, 0xc1f, 0xc46, 0xc02, 0x3b, 0xc05,
-0xc15, 0xc4d, 0xc1f, 0xc4b, 0x3b, 0xc28, 0xc35, 0xc02, 0x3b, 0xc21, 0xc3f, 0xc38, 0xc46, 0xc02, 0xc1c, 0x3b, 0xc2b, 0xc3f, 0x3b, 0xc2e,
-0xc3e, 0x3b, 0xc0f, 0x3b, 0xc2e, 0xc47, 0x3b, 0xc1c, 0xc42, 0x3b, 0xc1c, 0xc41, 0x3b, 0xc06, 0x3b, 0xc38, 0xc46, 0x3b, 0xc05, 0x3b,
-0xc28, 0x3b, 0xc21, 0xc3f, 0x4f, 0x72, 0x61, 0x72, 0x61, 0x3b, 0x4f, 0x6d, 0x75, 0x6b, 0x3b, 0x4f, 0x6b, 0x77, 0x61, 0x6d,
-0x67, 0x2019, 0x3b, 0x4f, 0x64, 0x75, 0x6e, 0x67, 0x2019, 0x65, 0x6c, 0x3b, 0x4f, 0x6d, 0x61, 0x72, 0x75, 0x6b, 0x3b, 0x4f,
-0x6d, 0x6f, 0x64, 0x6f, 0x6b, 0x2019, 0x6b, 0x69, 0x6e, 0x67, 0x2019, 0x6f, 0x6c, 0x3b, 0x4f, 0x6a, 0x6f, 0x6c, 0x61, 0x3b,
-0x4f, 0x70, 0x65, 0x64, 0x65, 0x6c, 0x3b, 0x4f, 0x73, 0x6f, 0x6b, 0x6f, 0x73, 0x6f, 0x6b, 0x6f, 0x6d, 0x61, 0x3b, 0x4f,
-0x74, 0x69, 0x62, 0x61, 0x72, 0x3b, 0x4f, 0x6c, 0x61, 0x62, 0x6f, 0x72, 0x3b, 0x4f, 0x70, 0x6f, 0x6f, 0x52, 0x61, 0x72,
-0x3b, 0x4d, 0x75, 0x6b, 0x3b, 0x4b, 0x77, 0x61, 0x3b, 0x44, 0x75, 0x6e, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x4d, 0x6f, 0x64,
-0x3b, 0x4a, 0x6f, 0x6c, 0x3b, 0x50, 0x65, 0x64, 0x3b, 0x53, 0x6f, 0x6b, 0x3b, 0x54, 0x69, 0x62, 0x3b, 0x4c, 0x61, 0x62,
-0x3b, 0x50, 0x6f, 0x6f, 0x52, 0x3b, 0x4d, 0x3b, 0x4b, 0x3b, 0x44, 0x3b, 0x4d, 0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x50, 0x3b,
-0x53, 0x3b, 0x54, 0x3b, 0x4c, 0x3b, 0x50, 0xe21, 0xe01, 0xe23, 0xe32, 0xe04, 0xe21, 0x3b, 0xe01, 0xe38, 0xe21, 0xe20, 0xe32, 0xe1e,
-0xe31, 0xe19, 0xe18, 0xe4c, 0x3b, 0xe21, 0xe35, 0xe19, 0xe32, 0xe04, 0xe21, 0x3b, 0xe40, 0xe21, 0xe29, 0xe32, 0xe22, 0xe19, 0x3b, 0xe1e,
-0xe24, 0xe29, 0xe20, 0xe32, 0xe04, 0xe21, 0x3b, 0xe21, 0xe34, 0xe16, 0xe38, 0xe19, 0xe32, 0xe22, 0xe19, 0x3b, 0xe01, 0xe23, 0xe01, 0xe0e,
-0xe32, 0xe04, 0xe21, 0x3b, 0xe2a, 0xe34, 0xe07, 0xe2b, 0xe32, 0xe04, 0xe21, 0x3b, 0xe01, 0xe31, 0xe19, 0xe22, 0xe32, 0xe22, 0xe19, 0x3b,
-0xe15, 0xe38, 0xe25, 0xe32, 0xe04, 0xe21, 0x3b, 0xe1e, 0xe24, 0xe28, 0xe08, 0xe34, 0xe01, 0xe32, 0xe22, 0xe19, 0x3b, 0xe18, 0xe31, 0xe19,
-0xe27, 0xe32, 0xe04, 0xe21, 0xe21, 0x2e, 0xe04, 0x2e, 0x3b, 0xe01, 0x2e, 0xe1e, 0x2e, 0x3b, 0xe21, 0xe35, 0x2e, 0xe04, 0x2e, 0x3b,
-0xe40, 0xe21, 0x2e, 0xe22, 0x2e, 0x3b, 0xe1e, 0x2e, 0xe04, 0x2e, 0x3b, 0xe21, 0xe34, 0x2e, 0xe22, 0x2e, 0x3b, 0xe01, 0x2e, 0xe04,
-0x2e, 0x3b, 0xe2a, 0x2e, 0xe04, 0x2e, 0x3b, 0xe01, 0x2e, 0xe22, 0x2e, 0x3b, 0xe15, 0x2e, 0xe04, 0x2e, 0x3b, 0xe1e, 0x2e, 0xe22,
-0x2e, 0x3b, 0xe18, 0x2e, 0xe04, 0x2e, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf51, 0xf44, 0xf0b, 0xf54, 0xf7c, 0xf0b, 0x3b, 0xf5f, 0xfb3,
-0xf0b, 0xf56, 0xf0b, 0xf42, 0xf49, 0xf72, 0xf66, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf42, 0xf66, 0xf74, 0xf58,
-0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf56, 0xf5e, 0xf72, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56,
-0xf0b, 0xf63, 0xf94, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf51, 0xfb2, 0xf74, 0xf42, 0xf0b, 0xf54, 0xf0b, 0x3b,
-0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf56, 0xf51, 0xf74, 0xf53, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf56, 0xf62,
-0xf92, 0xfb1, 0xf51, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf51, 0xf42, 0xf74, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f,
-0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf56, 0xf45, 0xf74, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf56, 0xf45, 0xf74, 0xf0b,
-0xf42, 0xf45, 0xf72, 0xf42, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf56, 0xf45, 0xf74, 0xf0b, 0xf42, 0xf49, 0xf72,
-0xf66, 0xf0b, 0xf54, 0xf0b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf51, 0xf44, 0xf0b, 0xf54, 0xf7c, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b,
-0xf42, 0xf49, 0xf72, 0xf66, 0xf0b, 0xf54, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf42, 0xf66, 0xf74, 0xf58, 0xf0b, 0xf54, 0x3b, 0xf5f,
-0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf56, 0xf5e, 0xf72, 0xf0b, 0xf54, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf63, 0xf94, 0xf0b, 0xf54, 0x3b,
-0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf51, 0xfb2, 0xf74, 0xf42, 0xf0b, 0xf54, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf56, 0xf51, 0xf74,
-0xf53, 0xf0b, 0xf54, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf56, 0xf62, 0xf92, 0xfb1, 0xf51, 0xf0b, 0xf54, 0x3b, 0xf5f, 0xfb3, 0xf0b,
-0xf56, 0xf0b, 0xf51, 0xf42, 0xf74, 0xf0b, 0xf54, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf56, 0xf45, 0xf74, 0xf0b, 0xf54, 0x3b, 0xf5f,
-0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf56, 0xf45, 0xf74, 0xf0b, 0xf42, 0xf45, 0xf72, 0xf42, 0xf0b, 0xf54, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b,
-0xf56, 0xf45, 0xf74, 0xf0b, 0xf42, 0xf49, 0xf72, 0xf66, 0xf0b, 0xf54, 0x1325, 0x122a, 0x3b, 0x1208, 0x12ab, 0x1272, 0x1275, 0x3b, 0x1218, 0x130b,
-0x1262, 0x1275, 0x3b, 0x121a, 0x12eb, 0x12dd, 0x12eb, 0x3b, 0x130d, 0x1295, 0x1266, 0x1275, 0x3b, 0x1230, 0x1290, 0x3b, 0x1213, 0x121d, 0x1208, 0x3b,
-0x1290, 0x1213, 0x1230, 0x3b, 0x1218, 0x1235, 0x12a8, 0x1228, 0x121d, 0x3b, 0x1325, 0x1245, 0x121d, 0x1272, 0x3b, 0x1215, 0x12f3, 0x122d, 0x3b, 0x1273,
-0x1215, 0x1233, 0x1235, 0x1325, 0x122a, 0x3b, 0x1208, 0x12ab, 0x3b, 0x1218, 0x130b, 0x3b, 0x121a, 0x12eb, 0x3b, 0x130d, 0x1295, 0x3b, 0x1230, 0x1290,
-0x3b, 0x1213, 0x121d, 0x3b, 0x1290, 0x1213, 0x3b, 0x1218, 0x1235, 0x3b, 0x1325, 0x1245, 0x3b, 0x1215, 0x12f3, 0x3b, 0x1273, 0x1215, 0x1325, 0x3b,
-0x1208, 0x3b, 0x1218, 0x3b, 0x121a, 0x3b, 0x130d, 0x3b, 0x1230, 0x3b, 0x1213, 0x3b, 0x1290, 0x3b, 0x1218, 0x3b, 0x1325, 0x3b, 0x1215, 0x3b,
-0x1273, 0x53, 0x101, 0x6e, 0x75, 0x61, 0x6c, 0x69, 0x3b, 0x46, 0x113, 0x70, 0x75, 0x65, 0x6c, 0x69, 0x3b, 0x4d, 0x61, 0x2bb,
-0x61, 0x73, 0x69, 0x3b, 0x2bb, 0x45, 0x70, 0x65, 0x6c, 0x65, 0x6c, 0x69, 0x3b, 0x4d, 0x113, 0x3b, 0x53, 0x75, 0x6e, 0x65,
-0x3b, 0x53, 0x69, 0x75, 0x6c, 0x61, 0x69, 0x3b, 0x2bb, 0x41, 0x6f, 0x6b, 0x6f, 0x73, 0x69, 0x3b, 0x53, 0x65, 0x70, 0x69,
-0x74, 0x65, 0x6d, 0x61, 0x3b, 0x2bb, 0x4f, 0x6b, 0x61, 0x74, 0x6f, 0x70, 0x61, 0x3b, 0x4e, 0x14d, 0x76, 0x65, 0x6d, 0x61,
-0x3b, 0x54, 0x12b, 0x73, 0x65, 0x6d, 0x61, 0x53, 0x101, 0x6e, 0x3b, 0x46, 0x113, 0x70, 0x3b, 0x4d, 0x61, 0x2bb, 0x61, 0x3b,
-0x2bb, 0x45, 0x70, 0x65, 0x3b, 0x4d, 0x113, 0x3b, 0x53, 0x75, 0x6e, 0x3b, 0x53, 0x69, 0x75, 0x3b, 0x2bb, 0x41, 0x6f, 0x6b,
-0x3b, 0x53, 0x65, 0x70, 0x3b, 0x2bb, 0x4f, 0x6b, 0x61, 0x3b, 0x4e, 0x14d, 0x76, 0x3b, 0x54, 0x12b, 0x73, 0x53, 0x3b, 0x46,
-0x3b, 0x4d, 0x3b, 0x45, 0x3b, 0x4d, 0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x54,
-0x4f, 0x63, 0x61, 0x6b, 0x3b, 0x15e, 0x75, 0x62, 0x61, 0x74, 0x3b, 0x4d, 0x61, 0x72, 0x74, 0x3b, 0x4e, 0x69, 0x73, 0x61,
-0x6e, 0x3b, 0x4d, 0x61, 0x79, 0x131, 0x73, 0x3b, 0x48, 0x61, 0x7a, 0x69, 0x72, 0x61, 0x6e, 0x3b, 0x54, 0x65, 0x6d, 0x6d,
-0x75, 0x7a, 0x3b, 0x41, 0x11f, 0x75, 0x73, 0x74, 0x6f, 0x73, 0x3b, 0x45, 0x79, 0x6c, 0xfc, 0x6c, 0x3b, 0x45, 0x6b, 0x69,
-0x6d, 0x3b, 0x4b, 0x61, 0x73, 0x131, 0x6d, 0x3b, 0x41, 0x72, 0x61, 0x6c, 0x131, 0x6b, 0x4f, 0x63, 0x61, 0x3b, 0x15e, 0x75,
-0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x4e, 0x69, 0x73, 0x3b, 0x4d, 0x61, 0x79, 0x3b, 0x48, 0x61, 0x7a, 0x3b, 0x54, 0x65,
-0x6d, 0x3b, 0x41, 0x11f, 0x75, 0x3b, 0x45, 0x79, 0x6c, 0x3b, 0x45, 0x6b, 0x69, 0x3b, 0x4b, 0x61, 0x73, 0x3b, 0x41, 0x72,
-0x61, 0x4f, 0x3b, 0x15e, 0x3b, 0x4d, 0x3b, 0x4e, 0x3b, 0x4d, 0x3b, 0x48, 0x3b, 0x54, 0x3b, 0x41, 0x3b, 0x45, 0x3b, 0x45,
-0x3b, 0x4b, 0x3b, 0x41, 0xdd, 0x61, 0x6e, 0x77, 0x61, 0x72, 0x3b, 0x46, 0x65, 0x77, 0x72, 0x61, 0x6c, 0x3b, 0x4d, 0x61,
-0x72, 0x74, 0x3b, 0x41, 0x70, 0x72, 0x65, 0x6c, 0x3b, 0x4d, 0x61, 0xfd, 0x3b, 0x49, 0xfd, 0x75, 0x6e, 0x3b, 0x49, 0xfd,
-0x75, 0x6c, 0x3b, 0x41, 0x77, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x53, 0x65, 0x6e, 0x74, 0xfd, 0x61, 0x62, 0x72, 0x3b, 0x4f,
-0x6b, 0x74, 0xfd, 0x61, 0x62, 0x72, 0x3b, 0x4e, 0x6f, 0xfd, 0x61, 0x62, 0x72, 0x3b, 0x44, 0x65, 0x6b, 0x61, 0x62, 0x72,
-0xfd, 0x61, 0x6e, 0x77, 0x61, 0x72, 0x3b, 0x66, 0x65, 0x77, 0x72, 0x61, 0x6c, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x3b, 0x61,
-0x70, 0x72, 0x65, 0x6c, 0x3b, 0x6d, 0x61, 0xfd, 0x3b, 0x69, 0xfd, 0x75, 0x6e, 0x3b, 0x69, 0xfd, 0x75, 0x6c, 0x3b, 0x61,
-0x77, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x6e, 0x74, 0xfd, 0x61, 0x62, 0x72, 0x3b, 0x6f, 0x6b, 0x74, 0xfd, 0x61,
-0x62, 0x72, 0x3b, 0x6e, 0x6f, 0xfd, 0x61, 0x62, 0x72, 0x3b, 0x64, 0x65, 0x6b, 0x61, 0x62, 0x72, 0xdd, 0x61, 0x6e, 0x3b,
-0x46, 0x65, 0x77, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x61, 0xfd, 0x3b, 0x49, 0xfd, 0x75, 0x6e,
-0x3b, 0x49, 0xfd, 0x75, 0x6c, 0x3b, 0x41, 0x77, 0x67, 0x3b, 0x53, 0x65, 0x6e, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f,
-0xfd, 0x3b, 0x44, 0x65, 0x6b, 0xfd, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x77, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x3b, 0x61, 0x70,
-0x72, 0x3b, 0x6d, 0x61, 0xfd, 0x3b, 0x69, 0xfd, 0x75, 0x6e, 0x3b, 0x69, 0xfd, 0x75, 0x6c, 0x3b, 0x61, 0x77, 0x67, 0x3b,
-0x73, 0x65, 0x6e, 0x3b, 0x6f, 0x6b, 0x74, 0x3b, 0x6e, 0x6f, 0xfd, 0x3b, 0x64, 0x65, 0x6b, 0xdd, 0x3b, 0x46, 0x3b, 0x4d,
-0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x49, 0x3b, 0x49, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x441, 0x456,
-0x447, 0x435, 0x43d, 0x44c, 0x3b, 0x43b, 0x44e, 0x442, 0x438, 0x439, 0x3b, 0x431, 0x435, 0x440, 0x435, 0x437, 0x435, 0x43d, 0x44c, 0x3b,
-0x43a, 0x432, 0x456, 0x442, 0x435, 0x43d, 0x44c, 0x3b, 0x442, 0x440, 0x430, 0x432, 0x435, 0x43d, 0x44c, 0x3b, 0x447, 0x435, 0x440, 0x432,
-0x435, 0x43d, 0x44c, 0x3b, 0x43b, 0x438, 0x43f, 0x435, 0x43d, 0x44c, 0x3b, 0x441, 0x435, 0x440, 0x43f, 0x435, 0x43d, 0x44c, 0x3b, 0x432,
-0x435, 0x440, 0x435, 0x441, 0x435, 0x43d, 0x44c, 0x3b, 0x436, 0x43e, 0x432, 0x442, 0x435, 0x43d, 0x44c, 0x3b, 0x43b, 0x438, 0x441, 0x442,
-0x43e, 0x43f, 0x430, 0x434, 0x3b, 0x433, 0x440, 0x443, 0x434, 0x435, 0x43d, 0x44c, 0x441, 0x456, 0x447, 0x43d, 0x44f, 0x3b, 0x43b, 0x44e,
-0x442, 0x43e, 0x433, 0x43e, 0x3b, 0x431, 0x435, 0x440, 0x435, 0x437, 0x43d, 0x44f, 0x3b, 0x43a, 0x432, 0x456, 0x442, 0x43d, 0x44f, 0x3b,
-0x442, 0x440, 0x430, 0x432, 0x43d, 0x44f, 0x3b, 0x447, 0x435, 0x440, 0x432, 0x43d, 0x44f, 0x3b, 0x43b, 0x438, 0x43f, 0x43d, 0x44f, 0x3b,
-0x441, 0x435, 0x440, 0x43f, 0x43d, 0x44f, 0x3b, 0x432, 0x435, 0x440, 0x435, 0x441, 0x43d, 0x44f, 0x3b, 0x436, 0x43e, 0x432, 0x442, 0x43d,
-0x44f, 0x3b, 0x43b, 0x438, 0x441, 0x442, 0x43e, 0x43f, 0x430, 0x434, 0x430, 0x3b, 0x433, 0x440, 0x443, 0x434, 0x43d, 0x44f, 0x441, 0x456,
-0x447, 0x3b, 0x43b, 0x44e, 0x442, 0x3b, 0x431, 0x435, 0x440, 0x3b, 0x43a, 0x432, 0x456, 0x3b, 0x442, 0x440, 0x430, 0x3b, 0x447, 0x435,
-0x440, 0x3b, 0x43b, 0x438, 0x43f, 0x3b, 0x441, 0x435, 0x440, 0x3b, 0x432, 0x435, 0x440, 0x3b, 0x436, 0x43e, 0x432, 0x3b, 0x43b, 0x438,
-0x441, 0x3b, 0x433, 0x440, 0x443, 0x441, 0x456, 0x447, 0x2e, 0x3b, 0x43b, 0x44e, 0x442, 0x2e, 0x3b, 0x431, 0x435, 0x440, 0x2e, 0x3b,
-0x43a, 0x432, 0x456, 0x442, 0x2e, 0x3b, 0x442, 0x440, 0x430, 0x432, 0x2e, 0x3b, 0x447, 0x435, 0x440, 0x432, 0x2e, 0x3b, 0x43b, 0x438,
-0x43f, 0x2e, 0x3b, 0x441, 0x435, 0x440, 0x43f, 0x2e, 0x3b, 0x432, 0x435, 0x440, 0x2e, 0x3b, 0x436, 0x43e, 0x432, 0x442, 0x2e, 0x3b,
-0x43b, 0x438, 0x441, 0x442, 0x2e, 0x3b, 0x433, 0x440, 0x443, 0x434, 0x2e, 0x421, 0x3b, 0x41b, 0x3b, 0x411, 0x3b, 0x41a, 0x3b, 0x422,
-0x3b, 0x427, 0x3b, 0x41b, 0x3b, 0x421, 0x3b, 0x412, 0x3b, 0x416, 0x3b, 0x41b, 0x3b, 0x413, 0x441, 0x3b, 0x43b, 0x3b, 0x431, 0x3b,
-0x43a, 0x3b, 0x442, 0x3b, 0x447, 0x3b, 0x43b, 0x3b, 0x441, 0x3b, 0x432, 0x3b, 0x436, 0x3b, 0x43b, 0x3b, 0x433, 0x6a, 0x61, 0x6e,
-0x75, 0x61, 0x72, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b, 0x6d, 0x11b, 0x72, 0x63, 0x3b, 0x61, 0x70, 0x72,
-0x79, 0x6c, 0x3b, 0x6d, 0x65, 0x6a, 0x61, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x6a, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x6a, 0x3b,
-0x61, 0x77, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6f, 0x6b, 0x74,
-0x6f, 0x62, 0x65, 0x72, 0x3b, 0x6e, 0x6f, 0x77, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62,
-0x65, 0x72, 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x61, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x61, 0x3b, 0x6d,
-0x11b, 0x72, 0x63, 0x61, 0x3b, 0x61, 0x70, 0x72, 0x79, 0x6c, 0x61, 0x3b, 0x6d, 0x65, 0x6a, 0x65, 0x3b, 0x6a, 0x75, 0x6e,
-0x69, 0x6a, 0x61, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x6a, 0x61, 0x3b, 0x61, 0x77, 0x67, 0x75, 0x73, 0x74, 0x61, 0x3b, 0x73,
-0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x61, 0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x62, 0x72, 0x61, 0x3b, 0x6e, 0x6f, 0x77,
-0x65, 0x6d, 0x62, 0x72, 0x61, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x72, 0x61, 0x6a, 0x61, 0x6e, 0x3b, 0x66, 0x65,
-0x62, 0x3b, 0x6d, 0x11b, 0x72, 0x3b, 0x61, 0x70, 0x72, 0x3b, 0x6d, 0x65, 0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x3b, 0x6a, 0x75,
-0x6c, 0x3b, 0x61, 0x77, 0x67, 0x3b, 0x73, 0x65, 0x70, 0x3b, 0x6f, 0x6b, 0x74, 0x3b, 0x6e, 0x6f, 0x77, 0x3b, 0x64, 0x65,
-0x63, 0x6a, 0x61, 0x6e, 0x2e, 0x3b, 0x66, 0x65, 0x62, 0x2e, 0x3b, 0x6d, 0x11b, 0x72, 0x2e, 0x3b, 0x61, 0x70, 0x72, 0x2e,
-0x3b, 0x6d, 0x65, 0x6a, 0x2e, 0x3b, 0x6a, 0x75, 0x6e, 0x2e, 0x3b, 0x6a, 0x75, 0x6c, 0x2e, 0x3b, 0x61, 0x77, 0x67, 0x2e,
-0x3b, 0x73, 0x65, 0x70, 0x2e, 0x3b, 0x6f, 0x6b, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x77, 0x2e, 0x3b, 0x64, 0x65, 0x63, 0x2e,
-0x62c, 0x646, 0x648, 0x631, 0x6cc, 0x3b, 0x641, 0x631, 0x648, 0x631, 0x6cc, 0x3b, 0x645, 0x627, 0x631, 0x686, 0x3b, 0x627, 0x67e, 0x631,
-0x6cc, 0x644, 0x3b, 0x645, 0x626, 0x6cc, 0x3b, 0x62c, 0x648, 0x646, 0x3b, 0x62c, 0x648, 0x644, 0x627, 0x626, 0x6cc, 0x3b, 0x627, 0x6af,
-0x633, 0x62a, 0x3b, 0x633, 0x62a, 0x645, 0x628, 0x631, 0x3b, 0x627, 0x6a9, 0x62a, 0x648, 0x628, 0x631, 0x3b, 0x646, 0x648, 0x645, 0x628,
-0x631, 0x3b, 0x62f, 0x633, 0x645, 0x628, 0x631, 0x64a, 0x627, 0x646, 0x6cb, 0x627, 0x631, 0x3b, 0x641, 0x6d0, 0x6cb, 0x631, 0x627, 0x644,
-0x3b, 0x645, 0x627, 0x631, 0x62a, 0x3b, 0x626, 0x627, 0x67e, 0x631, 0x6d0, 0x644, 0x3b, 0x645, 0x627, 0x64a, 0x3b, 0x626, 0x649, 0x64a,
-0x6c7, 0x646, 0x3b, 0x626, 0x649, 0x64a, 0x6c7, 0x644, 0x3b, 0x626, 0x627, 0x6cb, 0x63a, 0x6c7, 0x633, 0x62a, 0x3b, 0x633, 0x6d0, 0x646,
-0x62a, 0x6d5, 0x628, 0x649, 0x631, 0x3b, 0x626, 0x6c6, 0x643, 0x62a, 0x6d5, 0x628, 0x649, 0x631, 0x3b, 0x646, 0x648, 0x64a, 0x627, 0x628,
-0x649, 0x631, 0x3b, 0x62f, 0x6d0, 0x643, 0x627, 0x628, 0x649, 0x631, 0x59, 0x61, 0x6e, 0x76, 0x61, 0x72, 0x3b, 0x46, 0x65, 0x76,
-0x72, 0x61, 0x6c, 0x3b, 0x4d, 0x61, 0x72, 0x74, 0x3b, 0x41, 0x70, 0x72, 0x65, 0x6c, 0x3b, 0x4d, 0x61, 0x79, 0x3b, 0x49,
-0x79, 0x75, 0x6e, 0x3b, 0x49, 0x79, 0x75, 0x6c, 0x3b, 0x41, 0x76, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x53, 0x65, 0x6e, 0x74,
-0x61, 0x62, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x61, 0x62, 0x72, 0x3b, 0x4e, 0x6f, 0x79, 0x61, 0x62, 0x72, 0x3b, 0x44, 0x65,
-0x6b, 0x61, 0x62, 0x72, 0x79, 0x61, 0x6e, 0x76, 0x61, 0x72, 0x3b, 0x66, 0x65, 0x76, 0x72, 0x61, 0x6c, 0x3b, 0x6d, 0x61,
-0x72, 0x74, 0x3b, 0x61, 0x70, 0x72, 0x65, 0x6c, 0x3b, 0x6d, 0x61, 0x79, 0x3b, 0x69, 0x79, 0x75, 0x6e, 0x3b, 0x69, 0x79,
-0x75, 0x6c, 0x3b, 0x61, 0x76, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x62, 0x72, 0x3b, 0x6f, 0x6b,
-0x74, 0x61, 0x62, 0x72, 0x3b, 0x6e, 0x6f, 0x79, 0x61, 0x62, 0x72, 0x3b, 0x64, 0x65, 0x6b, 0x61, 0x62, 0x72, 0x59, 0x61,
-0x6e, 0x3b, 0x46, 0x65, 0x76, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x61, 0x79, 0x3b, 0x49, 0x79,
-0x6e, 0x3b, 0x49, 0x79, 0x6c, 0x3b, 0x41, 0x76, 0x67, 0x3b, 0x53, 0x65, 0x6e, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f,
-0x79, 0x3b, 0x44, 0x65, 0x6b, 0x79, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x76, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x61, 0x70, 0x72,
-0x3b, 0x6d, 0x61, 0x79, 0x3b, 0x69, 0x79, 0x6e, 0x3b, 0x69, 0x79, 0x6c, 0x3b, 0x61, 0x76, 0x67, 0x3b, 0x73, 0x65, 0x6e,
-0x3b, 0x6f, 0x6b, 0x74, 0x3b, 0x6e, 0x6f, 0x79, 0x3b, 0x64, 0x65, 0x6b, 0x59, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b,
-0x4d, 0x3b, 0x49, 0x3b, 0x49, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x62c, 0x646, 0x648, 0x3b, 0x641,
-0x628, 0x631, 0x3b, 0x645, 0x627, 0x631, 0x3b, 0x627, 0x67e, 0x631, 0x3b, 0x645, 0x6cc, 0x3b, 0x62c, 0x648, 0x646, 0x3b, 0x62c, 0x648,
-0x644, 0x3b, 0x627, 0x6af, 0x633, 0x3b, 0x633, 0x67e, 0x62a, 0x3b, 0x627, 0x6a9, 0x62a, 0x3b, 0x646, 0x648, 0x645, 0x3b, 0x62f, 0x633,
-0x645, 0x44f, 0x43d, 0x432, 0x430, 0x440, 0x3b, 0x444, 0x435, 0x432, 0x440, 0x430, 0x43b, 0x3b, 0x43c, 0x430, 0x440, 0x442, 0x3b, 0x430,
-0x43f, 0x440, 0x435, 0x43b, 0x3b, 0x43c, 0x430, 0x439, 0x3b, 0x438, 0x44e, 0x43d, 0x3b, 0x438, 0x44e, 0x43b, 0x3b, 0x430, 0x432, 0x433,
-0x443, 0x441, 0x442, 0x3b, 0x441, 0x435, 0x43d, 0x442, 0x44f, 0x431, 0x440, 0x3b, 0x43e, 0x43a, 0x442, 0x44f, 0x431, 0x440, 0x3b, 0x43d,
-0x43e, 0x44f, 0x431, 0x440, 0x3b, 0x434, 0x435, 0x43a, 0x430, 0x431, 0x440, 0xa5a8, 0xa595, 0x20, 0xa56a, 0xa574, 0x20, 0xa51e, 0xa500, 0xa56e,
-0xa54a, 0x3b, 0xa552, 0xa561, 0xa59d, 0xa595, 0x3b, 0xa57e, 0xa5ba, 0x3b, 0xa5a2, 0xa595, 0x3b, 0xa591, 0xa571, 0x3b, 0xa5b1, 0xa60b, 0x3b, 0xa5b1,
-0xa55e, 0xa524, 0x3b, 0xa5db, 0xa515, 0x3b, 0xa562, 0xa54c, 0x3b, 0xa56d, 0xa583, 0x3b, 0xa51e, 0xa60b, 0xa554, 0xa57f, 0x20, 0xa578, 0xa583, 0xa5cf,
-0x3b, 0xa5a8, 0xa595, 0x20, 0xa56a, 0xa574, 0x20, 0xa5cf, 0xa5ba, 0xa56e, 0xa54a, 0xa5a8, 0xa595, 0xa51e, 0x3b, 0xa552, 0xa561, 0x3b, 0xa57e, 0xa5ba,
-0x3b, 0xa5a2, 0xa595, 0x3b, 0xa591, 0xa571, 0x3b, 0xa5b1, 0xa60b, 0x3b, 0xa5b1, 0xa55e, 0x3b, 0xa5db, 0xa515, 0x3b, 0xa562, 0xa54c, 0x3b, 0xa56d,
-0xa583, 0x3b, 0xa51e, 0xa60b, 0x3b, 0xa5a8, 0xa595, 0xa5cf, 0x54, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x31, 0x3b, 0x54, 0x68, 0xe1, 0x6e,
-0x67, 0x20, 0x32, 0x3b, 0x54, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x33, 0x3b, 0x54, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x34, 0x3b,
-0x54, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x35, 0x3b, 0x54, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x36, 0x3b, 0x54, 0x68, 0xe1, 0x6e,
-0x67, 0x20, 0x37, 0x3b, 0x54, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x38, 0x3b, 0x54, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x39, 0x3b,
-0x54, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x31, 0x30, 0x3b, 0x54, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x31, 0x31, 0x3b, 0x54, 0x68,
-0xe1, 0x6e, 0x67, 0x20, 0x31, 0x32, 0x74, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x31, 0x3b, 0x74, 0x68, 0xe1, 0x6e, 0x67, 0x20,
-0x32, 0x3b, 0x74, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x33, 0x3b, 0x74, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x34, 0x3b, 0x74, 0x68,
-0xe1, 0x6e, 0x67, 0x20, 0x35, 0x3b, 0x74, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x36, 0x3b, 0x74, 0x68, 0xe1, 0x6e, 0x67, 0x20,
-0x37, 0x3b, 0x74, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x38, 0x3b, 0x74, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x39, 0x3b, 0x74, 0x68,
-0xe1, 0x6e, 0x67, 0x20, 0x31, 0x30, 0x3b, 0x74, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x31, 0x31, 0x3b, 0x74, 0x68, 0xe1, 0x6e,
-0x67, 0x20, 0x31, 0x32, 0x54, 0x68, 0x67, 0x20, 0x31, 0x3b, 0x54, 0x68, 0x67, 0x20, 0x32, 0x3b, 0x54, 0x68, 0x67, 0x20,
-0x33, 0x3b, 0x54, 0x68, 0x67, 0x20, 0x34, 0x3b, 0x54, 0x68, 0x67, 0x20, 0x35, 0x3b, 0x54, 0x68, 0x67, 0x20, 0x36, 0x3b,
-0x54, 0x68, 0x67, 0x20, 0x37, 0x3b, 0x54, 0x68, 0x67, 0x20, 0x38, 0x3b, 0x54, 0x68, 0x67, 0x20, 0x39, 0x3b, 0x54, 0x68,
-0x67, 0x20, 0x31, 0x30, 0x3b, 0x54, 0x68, 0x67, 0x20, 0x31, 0x31, 0x3b, 0x54, 0x68, 0x67, 0x20, 0x31, 0x32, 0x74, 0x68,
-0x67, 0x20, 0x31, 0x3b, 0x74, 0x68, 0x67, 0x20, 0x32, 0x3b, 0x74, 0x68, 0x67, 0x20, 0x33, 0x3b, 0x74, 0x68, 0x67, 0x20,
-0x34, 0x3b, 0x74, 0x68, 0x67, 0x20, 0x35, 0x3b, 0x74, 0x68, 0x67, 0x20, 0x36, 0x3b, 0x74, 0x68, 0x67, 0x20, 0x37, 0x3b,
-0x74, 0x68, 0x67, 0x20, 0x38, 0x3b, 0x74, 0x68, 0x67, 0x20, 0x39, 0x3b, 0x74, 0x68, 0x67, 0x20, 0x31, 0x30, 0x3b, 0x74,
-0x68, 0x67, 0x20, 0x31, 0x31, 0x3b, 0x74, 0x68, 0x67, 0x20, 0x31, 0x32, 0x4a, 0x65, 0x6e, 0x6e, 0x65, 0x72, 0x3b, 0x48,
-0x6f, 0x72, 0x6e, 0x69, 0x67, 0x3b, 0x4d, 0xe4, 0x72, 0x7a, 0x65, 0x3b, 0x41, 0x62, 0x72, 0x69, 0x6c, 0x6c, 0x65, 0x3b,
-0x4d, 0x65, 0x69, 0x6a, 0x65, 0x3b, 0x42, 0x72, 0xe1, 0x10d, 0x65, 0x74, 0x3b, 0x48, 0x65, 0x69, 0x77, 0x65, 0x74, 0x3b,
-0xd6, 0x69, 0x67, 0x161, 0x74, 0x65, 0x3b, 0x48, 0x65, 0x72, 0x62, 0x161, 0x74, 0x6d, 0xe1, 0x6e, 0x65, 0x74, 0x3b, 0x57,
-0xed, 0x6d, 0xe1, 0x6e, 0x65, 0x74, 0x3b, 0x57, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6d, 0xe1, 0x6e, 0x65, 0x74, 0x3b, 0x43,
-0x68, 0x72, 0x69, 0x161, 0x74, 0x6d, 0xe1, 0x6e, 0x65, 0x74, 0x4a, 0x65, 0x6e, 0x3b, 0x48, 0x6f, 0x72, 0x3b, 0x4d, 0xe4,
-0x72, 0x3b, 0x41, 0x62, 0x72, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x42, 0x72, 0xe1, 0x3b, 0x48, 0x65, 0x69, 0x3b, 0xd6, 0x69,
-0x67, 0x3b, 0x48, 0x65, 0x72, 0x3b, 0x57, 0xed, 0x6d, 0x3b, 0x57, 0x69, 0x6e, 0x3b, 0x43, 0x68, 0x72, 0x4a, 0x3b, 0x48,
-0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x42, 0x3b, 0x48, 0x3b, 0xd6, 0x3b, 0x48, 0x3b, 0x57, 0x3b, 0x57, 0x3b, 0x43,
-0x49, 0x6f, 0x6e, 0x61, 0x77, 0x72, 0x3b, 0x43, 0x68, 0x77, 0x65, 0x66, 0x72, 0x6f, 0x72, 0x3b, 0x4d, 0x61, 0x77, 0x72,
-0x74, 0x68, 0x3b, 0x45, 0x62, 0x72, 0x69, 0x6c, 0x6c, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4d, 0x65, 0x68, 0x65, 0x66, 0x69,
-0x6e, 0x3b, 0x47, 0x6f, 0x72, 0x66, 0x66, 0x65, 0x6e, 0x6e, 0x61, 0x66, 0x3b, 0x41, 0x77, 0x73, 0x74, 0x3b, 0x4d, 0x65,
-0x64, 0x69, 0x3b, 0x48, 0x79, 0x64, 0x72, 0x65, 0x66, 0x3b, 0x54, 0x61, 0x63, 0x68, 0x77, 0x65, 0x64, 0x64, 0x3b, 0x52,
-0x68, 0x61, 0x67, 0x66, 0x79, 0x72, 0x49, 0x6f, 0x6e, 0x3b, 0x43, 0x68, 0x77, 0x3b, 0x4d, 0x61, 0x77, 0x3b, 0x45, 0x62,
-0x72, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4d, 0x65, 0x68, 0x3b, 0x47, 0x6f, 0x72, 0x3b, 0x41, 0x77, 0x73, 0x74, 0x3b, 0x4d,
-0x65, 0x64, 0x69, 0x3b, 0x48, 0x79, 0x64, 0x3b, 0x54, 0x61, 0x63, 0x68, 0x3b, 0x52, 0x68, 0x61, 0x67, 0x49, 0x6f, 0x6e,
-0x3b, 0x43, 0x68, 0x77, 0x65, 0x66, 0x3b, 0x4d, 0x61, 0x77, 0x3b, 0x45, 0x62, 0x72, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4d,
-0x65, 0x68, 0x3b, 0x47, 0x6f, 0x72, 0x66, 0x66, 0x3b, 0x41, 0x77, 0x73, 0x74, 0x3b, 0x4d, 0x65, 0x64, 0x69, 0x3b, 0x48,
-0x79, 0x64, 0x3b, 0x54, 0x61, 0x63, 0x68, 0x3b, 0x52, 0x68, 0x61, 0x67, 0x49, 0x3b, 0x43, 0x68, 0x3b, 0x4d, 0x3b, 0x45,
-0x3b, 0x4d, 0x3b, 0x4d, 0x3b, 0x47, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x48, 0x3b, 0x54, 0x3b, 0x52, 0x68, 0x4a, 0x61, 0x6e,
-0x6e, 0x65, 0x77, 0x61, 0x72, 0x69, 0x73, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x65, 0x77, 0x61, 0x72, 0x69, 0x73, 0x3b, 0x4d,
-0x61, 0x61, 0x72, 0x74, 0x3b, 0x41, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x61, 0x61, 0x69, 0x65, 0x3b, 0x4a, 0x75, 0x6e,
-0x79, 0x3b, 0x4a, 0x75, 0x6c, 0x79, 0x3b, 0x41, 0x75, 0x67, 0x75, 0x73, 0x74, 0x75, 0x73, 0x3b, 0x53, 0x65, 0x70, 0x74,
-0x69, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x4e, 0x6f, 0x76, 0x69, 0x6d, 0x62,
-0x65, 0x72, 0x3b, 0x44, 0x65, 0x73, 0x69, 0x6d, 0x62, 0x65, 0x72, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d,
-0x72, 0x74, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41,
-0x75, 0x67, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x73, 0x53, 0x61,
-0x6d, 0x77, 0x69, 0x79, 0x65, 0x65, 0x3b, 0x46, 0x65, 0x77, 0x72, 0x69, 0x79, 0x65, 0x65, 0x3b, 0x4d, 0x61, 0x72, 0x73,
-0x3b, 0x41, 0x77, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x65, 0x65, 0x3b, 0x53, 0x75, 0x77, 0x65, 0x3b, 0x53, 0x75, 0x6c, 0x65,
-0x74, 0x3b, 0x55, 0x74, 0x3b, 0x53, 0xe0, 0x74, 0x74, 0x75, 0x6d, 0x62, 0x61, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x6f,
-0x62, 0x61, 0x72, 0x3b, 0x4e, 0x6f, 0x77, 0xe0, 0x6d, 0x62, 0x61, 0x72, 0x3b, 0x44, 0x65, 0x73, 0xe0, 0x6d, 0x62, 0x61,
-0x72, 0x53, 0x61, 0x6d, 0x3b, 0x46, 0x65, 0x77, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x77, 0x72, 0x3b, 0x4d, 0x65, 0x65,
-0x3b, 0x53, 0x75, 0x77, 0x3b, 0x53, 0x75, 0x6c, 0x3b, 0x55, 0x74, 0x3b, 0x53, 0xe0, 0x74, 0x3b, 0x4f, 0x6b, 0x74, 0x3b,
-0x4e, 0x6f, 0x77, 0x3b, 0x44, 0x65, 0x73, 0x4a, 0x61, 0x6e, 0x79, 0x75, 0x77, 0x61, 0x72, 0x69, 0x3b, 0x46, 0x65, 0x62,
-0x72, 0x75, 0x77, 0x61, 0x72, 0x69, 0x3b, 0x4d, 0x61, 0x74, 0x73, 0x68, 0x69, 0x3b, 0x45, 0x70, 0x72, 0x65, 0x6c, 0x69,
-0x3b, 0x4d, 0x65, 0x79, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x61, 0x79, 0x69, 0x3b, 0x41, 0x67,
-0x61, 0x73, 0x74, 0x69, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4f, 0x6b, 0x74, 0x68, 0x6f, 0x62,
-0x61, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x44, 0x69, 0x73, 0x65, 0x6d, 0x62, 0x61, 0x4a, 0x61, 0x6e,
-0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x74, 0x3b, 0x45, 0x70, 0x72, 0x3b, 0x4d, 0x65, 0x79, 0x3b, 0x4a, 0x75, 0x6e,
-0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x61, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76,
-0x3b, 0x44, 0x69, 0x73, 0x70, 0x69, 0x6b, 0xed, 0x74, 0xed, 0x6b, 0xed, 0x74, 0x69, 0x65, 0x2c, 0x20, 0x6f, 0xf3, 0x6c,
-0xed, 0x20, 0xfa, 0x20, 0x6b, 0x75, 0x74, 0xfa, 0x61, 0x6e, 0x3b, 0x73, 0x69, 0x25b, 0x79, 0x25b, 0x301, 0x2c, 0x20, 0x6f,
-0xf3, 0x6c, 0x69, 0x20, 0xfa, 0x20, 0x6b, 0xe1, 0x6e, 0x64, 0xed, 0x25b, 0x3b, 0x254, 0x6e, 0x73, 0xfa, 0x6d, 0x62, 0x254,
-0x6c, 0x2c, 0x20, 0x6f, 0xf3, 0x6c, 0x69, 0x20, 0xfa, 0x20, 0x6b, 0xe1, 0x74, 0xe1, 0x74, 0xfa, 0x25b, 0x3b, 0x6d, 0x65,
-0x73, 0x69, 0x14b, 0x2c, 0x20, 0x6f, 0xf3, 0x6c, 0x69, 0x20, 0xfa, 0x20, 0x6b, 0xe9, 0x6e, 0x69, 0x65, 0x3b, 0x65, 0x6e,
-0x73, 0x69, 0x6c, 0x2c, 0x20, 0x6f, 0xf3, 0x6c, 0x69, 0x20, 0xfa, 0x20, 0x6b, 0xe1, 0x74, 0xe1, 0x6e, 0x75, 0x25b, 0x3b,
-0x254, 0x73, 0x254, 0x6e, 0x3b, 0x65, 0x66, 0x75, 0x74, 0x65, 0x3b, 0x70, 0x69, 0x73, 0x75, 0x79, 0xfa, 0x3b, 0x69, 0x6d,
-0x25b, 0x14b, 0x20, 0x69, 0x20, 0x70, 0x75, 0x254, 0x73, 0x3b, 0x69, 0x6d, 0x25b, 0x14b, 0x20, 0x69, 0x20, 0x70, 0x75, 0x74,
-0xfa, 0x6b, 0x2c, 0x6f, 0xf3, 0x6c, 0x69, 0x20, 0xfa, 0x20, 0x6b, 0xe1, 0x74, 0xed, 0x25b, 0x3b, 0x6d, 0x61, 0x6b, 0x61,
-0x6e, 0x64, 0x69, 0x6b, 0x25b, 0x3b, 0x70, 0x69, 0x6c, 0x254, 0x6e, 0x64, 0x254, 0x301, 0x6f, 0x2e, 0x31, 0x3b, 0x6f, 0x2e,
-0x32, 0x3b, 0x6f, 0x2e, 0x33, 0x3b, 0x6f, 0x2e, 0x34, 0x3b, 0x6f, 0x2e, 0x35, 0x3b, 0x6f, 0x2e, 0x36, 0x3b, 0x6f, 0x2e,
-0x37, 0x3b, 0x6f, 0x2e, 0x38, 0x3b, 0x6f, 0x2e, 0x39, 0x3b, 0x6f, 0x2e, 0x31, 0x30, 0x3b, 0x6f, 0x2e, 0x31, 0x31, 0x3b,
-0x6f, 0x2e, 0x31, 0x32, 0x5d9, 0x5d0, 0x5b7, 0x5e0, 0x5d5, 0x5d0, 0x5b7, 0x5e8, 0x3b, 0x5e4, 0x5bf, 0x5e2, 0x5d1, 0x5e8, 0x5d5, 0x5d0,
-0x5b7, 0x5e8, 0x3b, 0x5de, 0x5e2, 0x5e8, 0x5e5, 0x3b, 0x5d0, 0x5b7, 0x5e4, 0x5bc, 0x5e8, 0x5d9, 0x5dc, 0x3b, 0x5de, 0x5d9, 0x5d9, 0x3b,
-0x5d9, 0x5d5, 0x5e0, 0x5d9, 0x3b, 0x5d9, 0x5d5, 0x5dc, 0x5d9, 0x3b, 0x5d0, 0x5d5, 0x5d9, 0x5d2, 0x5d5, 0x5e1, 0x5d8, 0x3b, 0x5e1, 0x5e2,
-0x5e4, 0x5bc, 0x5d8, 0x5e2, 0x5de, 0x5d1, 0x5e2, 0x5e8, 0x3b, 0x5d0, 0x5e7, 0x5d8, 0x5d0, 0x5d1, 0x5e2, 0x5e8, 0x3b, 0x5e0, 0x5d0, 0x5d5,
-0x5d5, 0x5e2, 0x5de, 0x5d1, 0x5e2, 0x5e8, 0x3b, 0x5d3, 0x5e2, 0x5e6, 0x5e2, 0x5de, 0x5d1, 0x5e2, 0x5e8, 0x5d9, 0x5d0, 0x5b7, 0x5e0, 0x3b,
-0x5e4, 0x5bf, 0x5e2, 0x5d1, 0x3b, 0x5de, 0x5e2, 0x5e8, 0x5e5, 0x3b, 0x5d0, 0x5b7, 0x5e4, 0x5bc, 0x5e8, 0x3b, 0x5de, 0x5d9, 0x5d9, 0x3b,
-0x5d9, 0x5d5, 0x5e0, 0x5d9, 0x3b, 0x5d9, 0x5d5, 0x5dc, 0x5d9, 0x3b, 0x5d0, 0x5d5, 0x5d9, 0x5d2, 0x3b, 0x5e1, 0x5e2, 0x5e4, 0x5bc, 0x3b,
-0x5d0, 0x5e7, 0x5d8, 0x3b, 0x5e0, 0x5d0, 0x5d5, 0x5d5, 0x3b, 0x5d3, 0x5e2, 0x5e6, 0x1e62, 0x1eb9, 0x301, 0x72, 0x1eb9, 0x301, 0x3b, 0xc8,
-0x72, 0xe8, 0x6c, 0xe8, 0x3b, 0x1eb8, 0x72, 0x1eb9, 0x300, 0x6e, 0xe0, 0x3b, 0xcc, 0x67, 0x62, 0xe9, 0x3b, 0x1eb8, 0x300, 0x62,
-0x69, 0x62, 0x69, 0x3b, 0xd2, 0x6b, 0xfa, 0x64, 0x75, 0x3b, 0x41, 0x67, 0x1eb9, 0x6d, 0x1ecd, 0x3b, 0xd2, 0x67, 0xfa, 0x6e,
-0x3b, 0x4f, 0x77, 0x65, 0x77, 0x65, 0x3b, 0x1ecc, 0x300, 0x77, 0xe0, 0x72, 0xe0, 0x3b, 0x42, 0xe9, 0x6c, 0xfa, 0x3b, 0x1ecc,
-0x300, 0x70, 0x1eb9, 0x300, 0x4f, 0x1e63, 0xf9, 0x20, 0x1e62, 0x1eb9, 0x301, 0x72, 0x1eb9, 0x301, 0x3b, 0x4f, 0x1e63, 0xf9, 0x20, 0xc8,
-0x72, 0xe8, 0x6c, 0xe8, 0x3b, 0x4f, 0x1e63, 0xf9, 0x20, 0x1eb8, 0x72, 0x1eb9, 0x300, 0x6e, 0xe0, 0x3b, 0x4f, 0x1e63, 0xf9, 0x20,
-0xcc, 0x67, 0x62, 0xe9, 0x3b, 0x4f, 0x1e63, 0xf9, 0x20, 0x1eb8, 0x300, 0x62, 0x69, 0x62, 0x69, 0x3b, 0x4f, 0x1e63, 0xf9, 0x20,
-0xd2, 0x6b, 0xfa, 0x64, 0x75, 0x3b, 0x4f, 0x1e63, 0xf9, 0x20, 0x41, 0x67, 0x1eb9, 0x6d, 0x1ecd, 0x3b, 0x4f, 0x1e63, 0xf9, 0x20,
-0xd2, 0x67, 0xfa, 0x6e, 0x3b, 0x4f, 0x1e63, 0xf9, 0x20, 0x4f, 0x77, 0x65, 0x77, 0x65, 0x3b, 0x4f, 0x1e63, 0xf9, 0x20, 0x1ecc,
-0x300, 0x77, 0xe0, 0x72, 0xe0, 0x3b, 0x4f, 0x1e63, 0xf9, 0x20, 0x42, 0xe9, 0x6c, 0xfa, 0x3b, 0x4f, 0x1e63, 0xf9, 0x20, 0x1ecc,
-0x300, 0x70, 0x1eb9, 0x300, 0x1e62, 0x1eb9, 0x301, 0x3b, 0xc8, 0x72, 0x3b, 0x1eb8, 0x72, 0x3b, 0xcc, 0x67, 0x3b, 0x1eb8, 0x300, 0x62,
-0x3b, 0xd2, 0x6b, 0x3b, 0x41, 0x67, 0x3b, 0xd2, 0x67, 0x3b, 0x4f, 0x77, 0x3b, 0x1ecc, 0x300, 0x77, 0x3b, 0x42, 0xe9, 0x3b,
-0x1ecc, 0x300, 0x70, 0x1e62, 0x1eb9, 0x301, 0x72, 0x3b, 0xc8, 0x72, 0xe8, 0x6c, 0x3b, 0x1eb8, 0x72, 0x1eb9, 0x300, 0x6e, 0x3b, 0xcc,
-0x67, 0x62, 0x3b, 0x1eb8, 0x300, 0x62, 0x69, 0x3b, 0xd2, 0x6b, 0xfa, 0x3b, 0x41, 0x67, 0x1eb9, 0x3b, 0xd2, 0x67, 0xfa, 0x3b,
-0x4f, 0x77, 0x65, 0x3b, 0x1ecc, 0x300, 0x77, 0xe0, 0x3b, 0x42, 0xe9, 0x6c, 0x3b, 0x1ecc, 0x300, 0x70, 0x1eb9, 0x53, 0x3b, 0xc8,
-0x3b, 0x1eb8, 0x3b, 0xcc, 0x3b, 0x1eb8, 0x300, 0x3b, 0xd2, 0x3b, 0x41, 0x3b, 0xd2, 0x3b, 0x4f, 0x3b, 0x1ecc, 0x300, 0x3b, 0x42,
-0x3b, 0x1ecc, 0x300, 0x53, 0x68, 0x25b, 0x301, 0x72, 0x25b, 0x301, 0x3b, 0xc8, 0x72, 0xe8, 0x6c, 0xe8, 0x3b, 0x190, 0x72, 0x25b,
-0x300, 0x6e, 0xe0, 0x3b, 0xcc, 0x67, 0x62, 0xe9, 0x3b, 0x190, 0x300, 0x62, 0x69, 0x62, 0x69, 0x3b, 0xd2, 0x6b, 0xfa, 0x64,
-0x75, 0x3b, 0x41, 0x67, 0x25b, 0x6d, 0x254, 0x3b, 0xd2, 0x67, 0xfa, 0x6e, 0x3b, 0x4f, 0x77, 0x65, 0x77, 0x65, 0x3b, 0x186,
-0x300, 0x77, 0xe0, 0x72, 0xe0, 0x3b, 0x42, 0xe9, 0x6c, 0xfa, 0x3b, 0x186, 0x300, 0x70, 0x25b, 0x300, 0x4f, 0x73, 0x68, 0xf9,
-0x20, 0x53, 0x68, 0x25b, 0x301, 0x72, 0x25b, 0x301, 0x3b, 0x4f, 0x73, 0x68, 0xf9, 0x20, 0xc8, 0x72, 0xe8, 0x6c, 0xe8, 0x3b,
-0x4f, 0x73, 0x68, 0xf9, 0x20, 0x190, 0x72, 0x25b, 0x300, 0x6e, 0xe0, 0x3b, 0x4f, 0x73, 0x68, 0xf9, 0x20, 0xcc, 0x67, 0x62,
-0xe9, 0x3b, 0x4f, 0x73, 0x68, 0xf9, 0x20, 0x190, 0x300, 0x62, 0x69, 0x62, 0x69, 0x3b, 0x4f, 0x73, 0x68, 0xf9, 0x20, 0xd2,
-0x6b, 0xfa, 0x64, 0x75, 0x3b, 0x4f, 0x73, 0x68, 0xf9, 0x20, 0x41, 0x67, 0x25b, 0x6d, 0x254, 0x3b, 0x4f, 0x73, 0x68, 0xf9,
-0x20, 0xd2, 0x67, 0xfa, 0x6e, 0x3b, 0x4f, 0x73, 0x68, 0xf9, 0x20, 0x4f, 0x77, 0x65, 0x77, 0x65, 0x3b, 0x4f, 0x73, 0x68,
-0xf9, 0x20, 0x186, 0x300, 0x77, 0xe0, 0x72, 0xe0, 0x3b, 0x4f, 0x73, 0x68, 0xf9, 0x20, 0x42, 0xe9, 0x6c, 0xfa, 0x3b, 0x4f,
-0x73, 0x68, 0xf9, 0x20, 0x186, 0x300, 0x70, 0x25b, 0x300, 0x53, 0x68, 0x25b, 0x301, 0x3b, 0xc8, 0x72, 0x3b, 0x190, 0x72, 0x3b,
-0xcc, 0x67, 0x3b, 0x190, 0x300, 0x62, 0x3b, 0xd2, 0x6b, 0x3b, 0x41, 0x67, 0x3b, 0xd2, 0x67, 0x3b, 0x4f, 0x77, 0x3b, 0x186,
-0x300, 0x77, 0x3b, 0x42, 0xe9, 0x3b, 0x186, 0x300, 0x70, 0x53, 0x68, 0x25b, 0x301, 0x72, 0x3b, 0xc8, 0x72, 0xe8, 0x6c, 0x3b,
-0x190, 0x72, 0x25b, 0x300, 0x6e, 0x3b, 0xcc, 0x67, 0x62, 0x3b, 0x190, 0x300, 0x62, 0x69, 0x3b, 0xd2, 0x6b, 0xfa, 0x3b, 0x41,
-0x67, 0x25b, 0x3b, 0xd2, 0x67, 0xfa, 0x3b, 0x4f, 0x77, 0x65, 0x3b, 0x186, 0x300, 0x77, 0xe0, 0x3b, 0x42, 0xe9, 0x6c, 0x3b,
-0x186, 0x300, 0x70, 0x25b, 0x53, 0x3b, 0xc8, 0x3b, 0x190, 0x3b, 0xcc, 0x3b, 0x190, 0x300, 0x3b, 0xd2, 0x3b, 0x41, 0x3b, 0xd2,
-0x3b, 0x4f, 0x3b, 0x186, 0x300, 0x3b, 0x42, 0x3b, 0x186, 0x300, 0x4a, 0x61, 0x6e, 0x75, 0x77, 0x61, 0x72, 0x69, 0x3b, 0x46,
-0x65, 0x62, 0x72, 0x75, 0x77, 0x61, 0x72, 0x69, 0x3b, 0x4d, 0x61, 0x73, 0x68, 0x69, 0x3b, 0x45, 0x70, 0x68, 0x72, 0x65,
-0x6c, 0x69, 0x3b, 0x4d, 0x65, 0x79, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x61, 0x79, 0x69, 0x3b,
-0x41, 0x67, 0x61, 0x73, 0x74, 0x69, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x68, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4f, 0x6b, 0x74,
-0x68, 0x6f, 0x62, 0x61, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x44, 0x69, 0x73, 0x65, 0x6d, 0x62, 0x61,
-0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x73, 0x3b, 0x45, 0x70, 0x68, 0x3b, 0x4d, 0x65, 0x79, 0x3b,
-0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x61, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b,
-0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x69, 0x73, 0x4a, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x45, 0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x4a,
-0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x31, 0x2d, 0x4b, 0x79, 0x73, 0xe3, 0x3b, 0x32, 0x2d, 0x4b,
-0x79, 0x73, 0xe3, 0x3b, 0x33, 0x2d, 0x4b, 0x79, 0x73, 0xe3, 0x3b, 0x34, 0x2d, 0x4b, 0x79, 0x73, 0xe3, 0x3b, 0x35, 0x2d,
-0x4b, 0x79, 0x73, 0xe3, 0x3b, 0x36, 0x2d, 0x4b, 0x79, 0x73, 0xe3, 0x3b, 0x37, 0x2d, 0x4b, 0x79, 0x73, 0xe3, 0x3b, 0x38,
-0x2d, 0x4b, 0x79, 0x73, 0xe3, 0x3b, 0x39, 0x2d, 0x4b, 0x79, 0x73, 0xe3, 0x3b, 0x31, 0x30, 0x2d, 0x4b, 0x79, 0x73, 0xe3,
-0x3b, 0x31, 0x31, 0x2d, 0x4b, 0x79, 0x73, 0xe3, 0x3b, 0x31, 0x32, 0x2d, 0x4b, 0x79, 0x73, 0xe3, 0x31, 0x4b, 0x79, 0x2e,
-0x3b, 0x32, 0x4b, 0x79, 0x2e, 0x3b, 0x33, 0x4b, 0x79, 0x2e, 0x3b, 0x34, 0x4b, 0x79, 0x2e, 0x3b, 0x35, 0x4b, 0x79, 0x2e,
-0x3b, 0x36, 0x4b, 0x79, 0x2e, 0x3b, 0x37, 0x4b, 0x79, 0x2e, 0x3b, 0x38, 0x4b, 0x79, 0x2e, 0x3b, 0x39, 0x4b, 0x79, 0x2e,
-0x3b, 0x31, 0x30, 0x4b, 0x79, 0x2e, 0x3b, 0x31, 0x31, 0x4b, 0x79, 0x2e, 0x3b, 0x31, 0x32, 0x4b, 0x79, 0x2e, 0x31, 0x4b,
-0x3b, 0x32, 0x4b, 0x3b, 0x33, 0x4b, 0x3b, 0x34, 0x4b, 0x3b, 0x35, 0x4b, 0x3b, 0x36, 0x4b, 0x3b, 0x37, 0x4b, 0x3b, 0x38,
-0x4b, 0x3b, 0x39, 0x4b, 0x3b, 0x31, 0x30, 0x4b, 0x3b, 0x31, 0x31, 0x4b, 0x3b, 0x31, 0x32, 0x4b, 0x79, 0x65, 0x70, 0xe9,
-0x3b, 0x6d, 0x75, 0x6b, 0x169, 0x69, 0x3b, 0x6d, 0x75, 0x73, 0x61, 0x70, 0xed, 0x72, 0x69, 0x3b, 0x69, 0x72, 0x169, 0x64,
-0xed, 0x3b, 0x70, 0xfa, 0x3b, 0x70, 0xfa, 0x2d, 0x79, 0x65, 0x70, 0xe9, 0x3b, 0x70, 0xfa, 0x2d, 0x6d, 0x75, 0x6b, 0x169,
-0x69, 0x3b, 0x70, 0xfa, 0x2d, 0x6d, 0x75, 0x73, 0x61, 0x70, 0xed, 0x72, 0x69, 0x3b, 0x70, 0xfa, 0x2d, 0x69, 0x72, 0x169,
-0x64, 0xed, 0x3b, 0x79, 0x65, 0x70, 0xe9, 0x2d, 0x70, 0x75, 0x74, 0x69, 0x6d, 0x61, 0xe3, 0x3b, 0x79, 0x65, 0x70, 0xe9,
-0x2d, 0x79, 0x65, 0x70, 0xe9, 0x3b, 0x79, 0x65, 0x70, 0xe9, 0x2d, 0x6d, 0x75, 0x6b, 0x169, 0x69, 0x79, 0x65, 0x3b, 0x6d,
-0x6b, 0x3b, 0x6d, 0x73, 0x3b, 0x69, 0x64, 0x3b, 0x70, 0x75, 0x3b, 0x70, 0x79, 0x3b, 0x70, 0x6d, 0x3b, 0x70, 0x73, 0x3b,
-0x70, 0x69, 0x3b, 0x79, 0x70, 0x3b, 0x79, 0x79, 0x3b, 0x79, 0x6d, 0x59, 0x3b, 0x4d, 0x3b, 0x4d, 0x3b, 0x49, 0x3b, 0x50,
-0x3b, 0x50, 0x3b, 0x50, 0x3b, 0x50, 0x3b, 0x50, 0x3b, 0x59, 0x3b, 0x59, 0x3b, 0x59
+static constexpr char16_t months_data[] = {
+0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x79, 0x3b, 0x46, 0x65, 0x62, 0x72,
+0x75, 0x61, 0x72, 0x79, 0x3b, 0x4d, 0x61, 0x72, 0x63, 0x68, 0x3b, 0x41,
+0x70, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x61, 0x79, 0x3b, 0x4a, 0x75, 0x6e,
+0x65, 0x3b, 0x4a, 0x75, 0x6c, 0x79, 0x3b, 0x41, 0x75, 0x67, 0x75, 0x73,
+0x74, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b,
+0x4f, 0x63, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x4e, 0x6f, 0x76, 0x65,
+0x6d, 0x62, 0x65, 0x72, 0x3b, 0x44, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x65,
+0x72, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x72,
+0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x61, 0x79, 0x3b, 0x4a, 0x75, 0x6e,
+0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x75, 0x67, 0x3b, 0x53, 0x65, 0x70,
+0x3b, 0x4f, 0x63, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x63,
+0x4a, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x4a, 0x3b,
+0x4a, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x31,
+0x3b, 0x32, 0x3b, 0x33, 0x3b, 0x34, 0x3b, 0x35, 0x3b, 0x36, 0x3b, 0x37,
+0x3b, 0x38, 0x3b, 0x39, 0x3b, 0x31, 0x30, 0x3b, 0x31, 0x31, 0x3b, 0x31,
+0x32, 0x410, 0x436, 0x44c, 0x44b, 0x440, 0x43d, 0x44b, 0x4b3, 0x259, 0x430, 0x3b,
+0x416, 0x259, 0x430, 0x431, 0x440, 0x430, 0x43d, 0x3b, 0x425, 0x259, 0x430, 0x436,
+0x259, 0x43a, 0x44b, 0x440, 0x430, 0x3b, 0x41c, 0x448, 0x430, 0x525, 0x44b, 0x3b,
+0x41b, 0x430, 0x4b5, 0x430, 0x440, 0x430, 0x3b, 0x420, 0x430, 0x448, 0x259, 0x430,
+0x440, 0x430, 0x3b, 0x524, 0x445, 0x44b, 0x43d, 0x433, 0x259, 0x44b, 0x3b, 0x41d,
+0x430, 0x43d, 0x4b3, 0x259, 0x430, 0x3b, 0x426, 0x259, 0x44b, 0x431, 0x431, 0x440,
+0x430, 0x3b, 0x416, 0x44c, 0x4ad, 0x430, 0x430, 0x440, 0x430, 0x3b, 0x410, 0x431,
+0x4b5, 0x430, 0x440, 0x430, 0x3b, 0x524, 0x445, 0x44b, 0x43d, 0x4b7, 0x43a, 0x4d9,
+0x44b, 0x43d, 0x410, 0x436, 0x44c, 0x3b, 0x416, 0x259, 0x430, 0x431, 0x3b, 0x425,
+0x259, 0x430, 0x436, 0x4d9, 0x3b, 0x41c, 0x448, 0x3b, 0x41b, 0x430, 0x4b5, 0x3b,
+0x420, 0x430, 0x448, 0x4d9, 0x3b, 0x524, 0x445, 0x44b, 0x43d, 0x433, 0x4d9, 0x3b,
+0x41d, 0x430, 0x43d, 0x4b3, 0x4d9, 0x3b, 0x426, 0x259, 0x44b, 0x431, 0x3b, 0x416,
+0x44c, 0x4ad, 0x3b, 0x410, 0x431, 0x4b5, 0x3b, 0x524, 0x445, 0x44b, 0x43d, 0x4b7,
+0x416, 0x44c, 0x3b, 0x416, 0x259, 0x3b, 0x425, 0x259, 0x3b, 0x41c, 0x3b, 0x41b,
+0x3b, 0x420, 0x3b, 0x413, 0x4d9, 0x3b, 0x41d, 0x3b, 0x426, 0x4d9, 0x3b, 0x4ac,
+0x3b, 0x411, 0x3b, 0x4b6, 0x416, 0x44c, 0x3b, 0x416, 0x259, 0x3b, 0x425, 0x259,
+0x3b, 0x41c, 0x3b, 0x41b, 0x3b, 0x420, 0x3b, 0x413, 0x4d9, 0x3b, 0x41d, 0x3b,
+0x426, 0x259, 0x3b, 0x4ac, 0x3b, 0x411, 0x3b, 0x4b6, 0x51, 0x75, 0x6e, 0x78,
+0x61, 0x20, 0x47, 0x61, 0x72, 0x61, 0x62, 0x6c, 0x75, 0x3b, 0x4b, 0x75,
+0x64, 0x6f, 0x3b, 0x43, 0x69, 0x67, 0x67, 0x69, 0x6c, 0x74, 0x61, 0x20,
+0x4b, 0x75, 0x64, 0x6f, 0x3b, 0x41, 0x67, 0x64, 0x61, 0x20, 0x42, 0x61,
+0x78, 0x69, 0x73, 0x3b, 0x43, 0x61, 0x78, 0x61, 0x68, 0x20, 0x41, 0x6c,
+0x73, 0x61, 0x3b, 0x51, 0x61, 0x73, 0x61, 0x20, 0x44, 0x69, 0x72, 0x72,
+0x69, 0x3b, 0x51, 0x61, 0x64, 0x6f, 0x20, 0x44, 0x69, 0x72, 0x72, 0x69,
+0x3b, 0x4c, 0x69, 0x69, 0x71, 0x65, 0x6e, 0x3b, 0x57, 0x61, 0x79, 0x73,
+0x75, 0x3b, 0x44, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x3b, 0x58, 0x69, 0x6d,
+0x6f, 0x6c, 0x69, 0x3b, 0x4b, 0x61, 0x78, 0x78, 0x61, 0x20, 0x47, 0x61,
+0x72, 0x61, 0x62, 0x6c, 0x75, 0x51, 0x75, 0x6e, 0x3b, 0x4e, 0x61, 0x68,
+0x3b, 0x43, 0x69, 0x67, 0x3b, 0x41, 0x67, 0x64, 0x3b, 0x43, 0x61, 0x78,
+0x3b, 0x51, 0x61, 0x73, 0x3b, 0x51, 0x61, 0x64, 0x3b, 0x4c, 0x65, 0x71,
+0x3b, 0x57, 0x61, 0x79, 0x3b, 0x44, 0x69, 0x74, 0x3b, 0x58, 0x69, 0x6d,
+0x3b, 0x4b, 0x61, 0x78, 0x51, 0x3b, 0x4e, 0x3b, 0x43, 0x3b, 0x41, 0x3b,
+0x43, 0x3b, 0x51, 0x3b, 0x51, 0x3b, 0x4c, 0x3b, 0x57, 0x3b, 0x44, 0x3b,
+0x58, 0x3b, 0x4b, 0x51, 0x75, 0x6e, 0x78, 0x61, 0x20, 0x47, 0x61, 0x72,
+0x61, 0x62, 0x6c, 0x75, 0x3b, 0x4b, 0x75, 0x64, 0x6f, 0x3b, 0x43, 0x69,
+0x67, 0x67, 0x69, 0x6c, 0x74, 0x61, 0x20, 0x4b, 0x75, 0x64, 0x6f, 0x3b,
+0x41, 0x67, 0x64, 0x61, 0x20, 0x42, 0x61, 0x78, 0x69, 0x73, 0x3b, 0x43,
+0x61, 0x78, 0x61, 0x68, 0x20, 0x41, 0x6c, 0x73, 0x61, 0x3b, 0x51, 0x61,
+0x73, 0x61, 0x20, 0x44, 0x69, 0x72, 0x72, 0x69, 0x3b, 0x51, 0x61, 0x64,
+0x6f, 0x20, 0x44, 0x69, 0x72, 0x72, 0x69, 0x3b, 0x4c, 0x65, 0x71, 0x65,
+0x65, 0x6e, 0x69, 0x3b, 0x57, 0x61, 0x79, 0x73, 0x75, 0x3b, 0x44, 0x69,
+0x74, 0x65, 0x6c, 0x69, 0x3b, 0x58, 0x69, 0x6d, 0x6f, 0x6c, 0x69, 0x3b,
+0x4b, 0x61, 0x78, 0x78, 0x61, 0x20, 0x47, 0x61, 0x72, 0x61, 0x62, 0x6c,
+0x75, 0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x69, 0x65, 0x3b, 0x46, 0x65,
+0x62, 0x72, 0x75, 0x61, 0x72, 0x69, 0x65, 0x3b, 0x4d, 0x61, 0x61, 0x72,
+0x74, 0x3b, 0x41, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x65, 0x69, 0x3b,
+0x4a, 0x75, 0x6e, 0x69, 0x65, 0x3b, 0x4a, 0x75, 0x6c, 0x69, 0x65, 0x3b,
+0x41, 0x75, 0x67, 0x75, 0x73, 0x74, 0x75, 0x73, 0x3b, 0x53, 0x65, 0x70,
+0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62,
+0x65, 0x72, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b,
+0x44, 0x65, 0x73, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x4a, 0x61, 0x6e, 0x2e,
+0x3b, 0x46, 0x65, 0x62, 0x2e, 0x3b, 0x4d, 0x72, 0x74, 0x2e, 0x3b, 0x41,
+0x70, 0x72, 0x2e, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x2e,
+0x3b, 0x4a, 0x75, 0x6c, 0x2e, 0x3b, 0x41, 0x75, 0x67, 0x2e, 0x3b, 0x53,
+0x65, 0x70, 0x2e, 0x3b, 0x4f, 0x6b, 0x74, 0x2e, 0x3b, 0x4e, 0x6f, 0x76,
+0x2e, 0x3b, 0x44, 0x65, 0x73, 0x2e, 0x6e, 0x64, 0x7a, 0x254, 0x300, 0x14b,
+0x254, 0x300, 0x6e, 0xf9, 0x6d, 0x3b, 0x6e, 0x64, 0x7a, 0x254, 0x300, 0x14b,
+0x254, 0x300, 0x6b, 0x197, 0x300, 0x7a, 0xf9, 0x294, 0x3b, 0x6e, 0x64, 0x7a,
+0x254, 0x300, 0x14b, 0x254, 0x300, 0x74, 0x197, 0x300, 0x64, 0x289, 0x300, 0x67,
+0x68, 0xe0, 0x3b, 0x6e, 0x64, 0x7a, 0x254, 0x300, 0x14b, 0x254, 0x300, 0x74,
+0x1ce, 0x61, 0x66, 0x289, 0x304, 0x67, 0x68, 0x101, 0x3b, 0x6e, 0x64, 0x7a,
+0x254, 0x300, 0x14b, 0xe8, 0x73, 0xe8, 0x65, 0x3b, 0x6e, 0x64, 0x7a, 0x254,
+0x300, 0x14b, 0x254, 0x300, 0x6e, 0x7a, 0xf9, 0x67, 0x68, 0xf2, 0x3b, 0x6e,
+0x64, 0x7a, 0x254, 0x300, 0x14b, 0x254, 0x300, 0x64, 0xf9, 0x6d, 0x6c, 0x6f,
+0x3b, 0x6e, 0x64, 0x7a, 0x254, 0x300, 0x14b, 0x254, 0x300, 0x6b, 0x77, 0xee,
+0x66, 0x254, 0x300, 0x65, 0x3b, 0x6e, 0x64, 0x7a, 0x254, 0x300, 0x14b, 0x254,
+0x300, 0x74, 0x197, 0x300, 0x66, 0x289, 0x300, 0x67, 0x68, 0xe0, 0x64, 0x7a,
+0x75, 0x67, 0x68, 0xf9, 0x3b, 0x6e, 0x64, 0x7a, 0x254, 0x300, 0x14b, 0x254,
+0x300, 0x67, 0x68, 0x1d4, 0x75, 0x77, 0x65, 0x6c, 0x254, 0x300, 0x6d, 0x3b,
+0x6e, 0x64, 0x7a, 0x254, 0x300, 0x14b, 0x254, 0x300, 0x63, 0x68, 0x77, 0x61,
+0x294, 0xe0, 0x6b, 0x61, 0x61, 0x20, 0x77, 0x6f, 0x3b, 0x6e, 0x64, 0x7a,
+0x254, 0x300, 0x14b, 0xe8, 0x66, 0x77, 0xf2, 0x6f, 0x6e, 0xf9, 0x6d, 0x3b,
+0x6b, 0x268, 0x7a, 0x3b, 0x74, 0x268, 0x64, 0x3b, 0x74, 0x61, 0x61, 0x3b,
+0x73, 0x65, 0x65, 0x3b, 0x6e, 0x7a, 0x75, 0x3b, 0x64, 0x75, 0x6d, 0x3b,
+0x66, 0x254, 0x65, 0x3b, 0x64, 0x7a, 0x75, 0x3b, 0x6c, 0x254, 0x6d, 0x3b,
+0x6b, 0x61, 0x61, 0x3b, 0x66, 0x77, 0x6f, 0x6e, 0x3b, 0x6b, 0x3b, 0x74,
+0x3b, 0x74, 0x3b, 0x73, 0x3b, 0x7a, 0x3b, 0x6b, 0x3b, 0x66, 0x3b, 0x64,
+0x3b, 0x6c, 0x3b, 0x63, 0x3b, 0x66, 0x53, 0x61, 0x6e, 0x64, 0x61, 0x2d,
+0x186, 0x70, 0x25b, 0x70, 0x254, 0x6e, 0x3b, 0x4b, 0x77, 0x61, 0x6b, 0x77,
+0x61, 0x72, 0x2d, 0x186, 0x67, 0x79, 0x65, 0x66, 0x75, 0x6f, 0x3b, 0x45,
+0x62, 0x254, 0x77, 0x2d, 0x186, 0x62, 0x65, 0x6e, 0x65, 0x6d, 0x3b, 0x45,
+0x62, 0x254, 0x62, 0x69, 0x72, 0x61, 0x2d, 0x4f, 0x66, 0x6f, 0x72, 0x69,
+0x73, 0x75, 0x6f, 0x3b, 0x45, 0x73, 0x75, 0x73, 0x6f, 0x77, 0x20, 0x41,
+0x6b, 0x65, 0x74, 0x73, 0x65, 0x61, 0x62, 0x61, 0x2d, 0x4b, 0x254, 0x74,
+0x254, 0x6e, 0x69, 0x6d, 0x62, 0x61, 0x3b, 0x4f, 0x62, 0x69, 0x72, 0x61,
+0x64, 0x65, 0x2d, 0x41, 0x79, 0x25b, 0x77, 0x6f, 0x68, 0x6f, 0x6d, 0x75,
+0x6d, 0x75, 0x3b, 0x41, 0x79, 0x25b, 0x77, 0x6f, 0x68, 0x6f, 0x2d, 0x4b,
+0x69, 0x74, 0x61, 0x77, 0x6f, 0x6e, 0x73, 0x61, 0x3b, 0x44, 0x69, 0x66,
+0x75, 0x75, 0x2d, 0x186, 0x73, 0x61, 0x6e, 0x64, 0x61, 0x61, 0x3b, 0x46,
+0x61, 0x6e, 0x6b, 0x77, 0x61, 0x2d, 0x190, 0x62, 0x254, 0x3b, 0x186, 0x62,
+0x25b, 0x73, 0x25b, 0x2d, 0x41, 0x68, 0x69, 0x6e, 0x69, 0x6d, 0x65, 0x3b,
+0x186, 0x62, 0x65, 0x72, 0x25b, 0x66, 0x25b, 0x77, 0x2d, 0x4f, 0x62, 0x75,
+0x62, 0x75, 0x6f, 0x3b, 0x4d, 0x75, 0x6d, 0x75, 0x2d, 0x186, 0x70, 0x25b,
+0x6e, 0x69, 0x6d, 0x62, 0x61, 0x53, 0x2d, 0x186, 0x3b, 0x4b, 0x2d, 0x186,
+0x3b, 0x45, 0x2d, 0x186, 0x3b, 0x45, 0x2d, 0x4f, 0x3b, 0x45, 0x2d, 0x4b,
+0x3b, 0x4f, 0x2d, 0x41, 0x3b, 0x41, 0x2d, 0x4b, 0x3b, 0x44, 0x2d, 0x186,
+0x3b, 0x46, 0x2d, 0x190, 0x3b, 0x186, 0x2d, 0x41, 0x3b, 0x186, 0x2d, 0x4f,
+0x3b, 0x4d, 0x2d, 0x186, 0x4d, 0x30, 0x31, 0x3b, 0x4d, 0x30, 0x32, 0x3b,
+0x4d, 0x30, 0x33, 0x3b, 0x4d, 0x30, 0x34, 0x3b, 0x4d, 0x30, 0x35, 0x3b,
+0x4d, 0x30, 0x36, 0x3b, 0x4d, 0x30, 0x37, 0x3b, 0x4d, 0x30, 0x38, 0x3b,
+0x4d, 0x30, 0x39, 0x3b, 0x4d, 0x31, 0x30, 0x3b, 0x4d, 0x31, 0x31, 0x3b,
+0x4d, 0x31, 0x32, 0x6a, 0x61, 0x6e, 0x61, 0x72, 0x3b, 0x73, 0x68, 0x6b,
+0x75, 0x72, 0x74, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x3b, 0x70, 0x72, 0x69,
+0x6c, 0x6c, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x71, 0x65, 0x72, 0x73, 0x68,
+0x6f, 0x72, 0x3b, 0x6b, 0x6f, 0x72, 0x72, 0x69, 0x6b, 0x3b, 0x67, 0x75,
+0x73, 0x68, 0x74, 0x3b, 0x73, 0x68, 0x74, 0x61, 0x74, 0x6f, 0x72, 0x3b,
+0x74, 0x65, 0x74, 0x6f, 0x72, 0x3b, 0x6e, 0xeb, 0x6e, 0x74, 0x6f, 0x72,
+0x3b, 0x64, 0x68, 0x6a, 0x65, 0x74, 0x6f, 0x72, 0x6a, 0x61, 0x6e, 0x3b,
+0x73, 0x68, 0x6b, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x70, 0x72, 0x69, 0x3b,
+0x6d, 0x61, 0x6a, 0x3b, 0x71, 0x65, 0x72, 0x3b, 0x6b, 0x6f, 0x72, 0x72,
+0x3b, 0x67, 0x75, 0x73, 0x68, 0x3b, 0x73, 0x68, 0x74, 0x3b, 0x74, 0x65,
+0x74, 0x3b, 0x6e, 0xeb, 0x6e, 0x3b, 0x64, 0x68, 0x6a, 0x6a, 0x3b, 0x73,
+0x68, 0x3b, 0x6d, 0x3b, 0x70, 0x3b, 0x6d, 0x3b, 0x71, 0x3b, 0x6b, 0x3b,
+0x67, 0x3b, 0x73, 0x68, 0x3b, 0x74, 0x3b, 0x6e, 0x3b, 0x64, 0x68, 0x1303,
+0x1295, 0x12cb, 0x122a, 0x3b, 0x134c, 0x1265, 0x1229, 0x12cb, 0x122a, 0x3b, 0x121b, 0x122d,
+0x127d, 0x3b, 0x12a4, 0x1355, 0x122a, 0x120d, 0x3b, 0x121c, 0x12ed, 0x3b, 0x1301, 0x1295,
+0x3b, 0x1301, 0x120b, 0x12ed, 0x3b, 0x12a6, 0x1308, 0x1235, 0x1275, 0x3b, 0x1234, 0x1355,
+0x1274, 0x121d, 0x1260, 0x122d, 0x3b, 0x12a6, 0x12ad, 0x1276, 0x1260, 0x122d, 0x3b, 0x1296,
+0x126c, 0x121d, 0x1260, 0x122d, 0x3b, 0x12f2, 0x1234, 0x121d, 0x1260, 0x122d, 0x1303, 0x1295,
+0x3b, 0x134c, 0x1265, 0x3b, 0x121b, 0x122d, 0x127d, 0x3b, 0x12a4, 0x1355, 0x122a, 0x3b,
+0x121c, 0x12ed, 0x3b, 0x1301, 0x1295, 0x3b, 0x1301, 0x120b, 0x12ed, 0x3b, 0x12a6, 0x1308,
+0x1235, 0x3b, 0x1234, 0x1355, 0x1274, 0x3b, 0x12a6, 0x12ad, 0x1276, 0x3b, 0x1296, 0x126c,
+0x121d, 0x3b, 0x12f2, 0x1234, 0x121d, 0x1303, 0x3b, 0x134c, 0x3b, 0x121b, 0x3b, 0x12a4,
+0x3b, 0x121c, 0x3b, 0x1301, 0x3b, 0x1301, 0x3b, 0x12a6, 0x3b, 0x1234, 0x3b, 0x12a6,
+0x3b, 0x1296, 0x3b, 0x12f2, 0x64a, 0x646, 0x627, 0x64a, 0x631, 0x3b, 0x641, 0x628,
+0x631, 0x627, 0x64a, 0x631, 0x3b, 0x645, 0x627, 0x631, 0x633, 0x3b, 0x623, 0x628,
+0x631, 0x64a, 0x644, 0x3b, 0x645, 0x627, 0x64a, 0x648, 0x3b, 0x64a, 0x648, 0x646,
+0x64a, 0x648, 0x3b, 0x64a, 0x648, 0x644, 0x64a, 0x648, 0x3b, 0x623, 0x63a, 0x633,
+0x637, 0x633, 0x3b, 0x633, 0x628, 0x62a, 0x645, 0x628, 0x631, 0x3b, 0x623, 0x643,
+0x62a, 0x648, 0x628, 0x631, 0x3b, 0x646, 0x648, 0x641, 0x645, 0x628, 0x631, 0x3b,
+0x62f, 0x64a, 0x633, 0x645, 0x628, 0x631, 0x64a, 0x3b, 0x641, 0x3b, 0x645, 0x3b,
+0x623, 0x3b, 0x648, 0x3b, 0x646, 0x3b, 0x644, 0x3b, 0x63a, 0x3b, 0x633, 0x3b,
+0x643, 0x3b, 0x628, 0x3b, 0x62f, 0x62c, 0x627, 0x646, 0x641, 0x64a, 0x3b, 0x641,
+0x64a, 0x641, 0x631, 0x64a, 0x3b, 0x645, 0x627, 0x631, 0x633, 0x3b, 0x623, 0x641,
+0x631, 0x64a, 0x644, 0x3b, 0x645, 0x627, 0x64a, 0x3b, 0x62c, 0x648, 0x627, 0x646,
+0x3b, 0x62c, 0x648, 0x64a, 0x644, 0x64a, 0x629, 0x3b, 0x623, 0x648, 0x62a, 0x3b,
+0x633, 0x628, 0x62a, 0x645, 0x628, 0x631, 0x3b, 0x623, 0x643, 0x62a, 0x648, 0x628,
+0x631, 0x3b, 0x646, 0x648, 0x641, 0x645, 0x628, 0x631, 0x3b, 0x62f, 0x64a, 0x633,
+0x645, 0x628, 0x631, 0x62c, 0x3b, 0x641, 0x3b, 0x645, 0x3b, 0x623, 0x3b, 0x645,
+0x3b, 0x62c, 0x3b, 0x62c, 0x3b, 0x623, 0x3b, 0x633, 0x3b, 0x623, 0x3b, 0x646,
+0x3b, 0x62f, 0x643, 0x627, 0x646, 0x648, 0x646, 0x20, 0x627, 0x644, 0x62b, 0x627,
+0x646, 0x64a, 0x3b, 0x634, 0x628, 0x627, 0x637, 0x3b, 0x622, 0x630, 0x627, 0x631,
+0x3b, 0x646, 0x64a, 0x633, 0x627, 0x646, 0x3b, 0x623, 0x64a, 0x627, 0x631, 0x3b,
+0x62d, 0x632, 0x64a, 0x631, 0x627, 0x646, 0x3b, 0x62a, 0x645, 0x648, 0x632, 0x3b,
+0x622, 0x628, 0x3b, 0x623, 0x64a, 0x644, 0x648, 0x644, 0x3b, 0x62a, 0x634, 0x631,
+0x64a, 0x646, 0x20, 0x627, 0x644, 0x623, 0x648, 0x644, 0x3b, 0x62a, 0x634, 0x631,
+0x64a, 0x646, 0x20, 0x627, 0x644, 0x62b, 0x627, 0x646, 0x64a, 0x3b, 0x643, 0x627,
+0x646, 0x648, 0x646, 0x20, 0x627, 0x644, 0x623, 0x648, 0x644, 0x643, 0x627, 0x646,
+0x648, 0x646, 0x20, 0x627, 0x644, 0x62b, 0x627, 0x646, 0x64a, 0x3b, 0x634, 0x628,
+0x627, 0x637, 0x3b, 0x622, 0x630, 0x627, 0x631, 0x3b, 0x646, 0x64a, 0x633, 0x627,
+0x646, 0x3b, 0x623, 0x64a, 0x627, 0x631, 0x3b, 0x62d, 0x632, 0x64a, 0x631, 0x627,
+0x646, 0x3b, 0x62a, 0x645, 0x648, 0x632, 0x3b, 0x622, 0x628, 0x3b, 0x623, 0x64a,
+0x644, 0x648, 0x644, 0x3b, 0x62a, 0x634, 0x631, 0x64a, 0x646, 0xa0, 0x627, 0x644,
+0x623, 0x648, 0x644, 0x3b, 0x62a, 0x634, 0x631, 0x64a, 0x646, 0x20, 0x627, 0x644,
+0x62b, 0x627, 0x646, 0x64a, 0x3b, 0x643, 0x627, 0x646, 0x648, 0x646, 0x20, 0x627,
+0x644, 0x623, 0x648, 0x644, 0x643, 0x3b, 0x634, 0x3b, 0x622, 0x3b, 0x646, 0x3b,
+0x623, 0x3b, 0x62d, 0x3b, 0x62a, 0x3b, 0x622, 0x3b, 0x623, 0x3b, 0x62a, 0x3b,
+0x62a, 0x3b, 0x643, 0x64a, 0x646, 0x627, 0x64a, 0x631, 0x3b, 0x641, 0x628, 0x631,
+0x627, 0x64a, 0x631, 0x3b, 0x645, 0x627, 0x631, 0x633, 0x3b, 0x625, 0x628, 0x631,
+0x64a, 0x644, 0x3b, 0x645, 0x627, 0x64a, 0x648, 0x3b, 0x64a, 0x648, 0x646, 0x64a,
+0x648, 0x3b, 0x64a, 0x648, 0x644, 0x64a, 0x648, 0x3b, 0x623, 0x63a, 0x634, 0x62a,
+0x3b, 0x634, 0x62a, 0x645, 0x628, 0x631, 0x3b, 0x623, 0x643, 0x62a, 0x648, 0x628,
+0x631, 0x3b, 0x646, 0x648, 0x641, 0x645, 0x628, 0x631, 0x3b, 0x62f, 0x62c, 0x645,
+0x628, 0x631, 0x64a, 0x3b, 0x641, 0x3b, 0x645, 0x3b, 0x625, 0x3b, 0x648, 0x3b,
+0x646, 0x3b, 0x644, 0x3b, 0x63a, 0x3b, 0x634, 0x3b, 0x643, 0x3b, 0x628, 0x3b,
+0x62f, 0x64a, 0x646, 0x627, 0x64a, 0x631, 0x3b, 0x641, 0x628, 0x631, 0x627, 0x64a,
+0x631, 0x3b, 0x645, 0x627, 0x631, 0x633, 0x3b, 0x623, 0x628, 0x631, 0x64a, 0x644,
+0x3b, 0x645, 0x627, 0x64a, 0x3b, 0x64a, 0x648, 0x646, 0x64a, 0x648, 0x3b, 0x64a,
+0x648, 0x644, 0x64a, 0x648, 0x632, 0x3b, 0x63a, 0x634, 0x62a, 0x3b, 0x634, 0x62a,
+0x646, 0x628, 0x631, 0x3b, 0x623, 0x643, 0x62a, 0x648, 0x628, 0x631, 0x3b, 0x646,
+0x648, 0x646, 0x628, 0x631, 0x3b, 0x62f, 0x62c, 0x646, 0x628, 0x631, 0x64a, 0x3b,
+0x641, 0x3b, 0x645, 0x3b, 0x623, 0x3b, 0x645, 0x3b, 0x646, 0x3b, 0x644, 0x3b,
+0x63a, 0x3b, 0x634, 0x3b, 0x643, 0x3b, 0x628, 0x3b, 0x62f, 0x63, 0x68, 0x69,
+0x6e, 0x65, 0x72, 0x6f, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x65, 0x72, 0x6f,
+0x3b, 0x6d, 0x61, 0x72, 0x7a, 0x6f, 0x3b, 0x61, 0x62, 0x72, 0x69, 0x6c,
+0x3b, 0x6d, 0x61, 0x79, 0x6f, 0x3b, 0x63, 0x68, 0x75, 0x6e, 0x79, 0x6f,
+0x3b, 0x63, 0x68, 0x75, 0x6c, 0x69, 0x6f, 0x6c, 0x3b, 0x61, 0x67, 0x6f,
+0x73, 0x74, 0x6f, 0x3b, 0x73, 0x65, 0x74, 0x69, 0x65, 0x6d, 0x62, 0x72,
+0x65, 0x3b, 0x6f, 0x63, 0x74, 0x75, 0x62, 0x72, 0x65, 0x3b, 0x6e, 0x6f,
+0x76, 0x69, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x61, 0x76, 0x69, 0x65,
+0x6e, 0x74, 0x6f, 0x64, 0x65, 0x20, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x72,
+0x6f, 0x3b, 0x64, 0x65, 0x20, 0x66, 0x65, 0x62, 0x72, 0x65, 0x72, 0x6f,
+0x3b, 0x64, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x7a, 0x6f, 0x3b, 0x64, 0x2019,
+0x61, 0x62, 0x72, 0x69, 0x6c, 0x3b, 0x64, 0x65, 0x20, 0x6d, 0x61, 0x79,
+0x6f, 0x3b, 0x64, 0x65, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x79, 0x6f, 0x3b,
+0x64, 0x65, 0x20, 0x63, 0x68, 0x75, 0x6c, 0x69, 0x6f, 0x6c, 0x3b, 0x64,
+0x2019, 0x61, 0x67, 0x6f, 0x73, 0x74, 0x6f, 0x3b, 0x64, 0x65, 0x20, 0x73,
+0x65, 0x74, 0x69, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x64, 0x2019, 0x6f,
+0x63, 0x74, 0x75, 0x62, 0x72, 0x65, 0x3b, 0x64, 0x65, 0x20, 0x6e, 0x6f,
+0x76, 0x69, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x64, 0x2019, 0x61, 0x76,
+0x69, 0x65, 0x6e, 0x74, 0x6f, 0x63, 0x68, 0x69, 0x2e, 0x3b, 0x66, 0x65,
+0x62, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x2e, 0x3b, 0x61, 0x62, 0x72, 0x2e,
+0x3b, 0x6d, 0x61, 0x79, 0x2e, 0x3b, 0x63, 0x68, 0x6e, 0x2e, 0x3b, 0x63,
+0x68, 0x6c, 0x2e, 0x3b, 0x61, 0x67, 0x6f, 0x2e, 0x3b, 0x73, 0x65, 0x74,
+0x2e, 0x3b, 0x6f, 0x63, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b,
+0x61, 0x76, 0x69, 0x2e, 0x570, 0x578, 0x582, 0x576, 0x57e, 0x561, 0x580, 0x3b,
+0x583, 0x565, 0x57f, 0x580, 0x57e, 0x561, 0x580, 0x3b, 0x574, 0x561, 0x580, 0x57f,
+0x3b, 0x561, 0x57a, 0x580, 0x56b, 0x56c, 0x3b, 0x574, 0x561, 0x575, 0x56b, 0x57d,
+0x3b, 0x570, 0x578, 0x582, 0x576, 0x56b, 0x57d, 0x3b, 0x570, 0x578, 0x582, 0x56c,
+0x56b, 0x57d, 0x3b, 0x585, 0x563, 0x578, 0x57d, 0x57f, 0x578, 0x57d, 0x3b, 0x57d,
+0x565, 0x57a, 0x57f, 0x565, 0x574, 0x562, 0x565, 0x580, 0x3b, 0x570, 0x578, 0x56f,
+0x57f, 0x565, 0x574, 0x562, 0x565, 0x580, 0x3b, 0x576, 0x578, 0x575, 0x565, 0x574,
+0x562, 0x565, 0x580, 0x3b, 0x564, 0x565, 0x56f, 0x57f, 0x565, 0x574, 0x562, 0x565,
+0x580, 0x570, 0x578, 0x582, 0x576, 0x57e, 0x561, 0x580, 0x56b, 0x3b, 0x583, 0x565,
+0x57f, 0x580, 0x57e, 0x561, 0x580, 0x56b, 0x3b, 0x574, 0x561, 0x580, 0x57f, 0x56b,
+0x3b, 0x561, 0x57a, 0x580, 0x56b, 0x56c, 0x56b, 0x3b, 0x574, 0x561, 0x575, 0x56b,
+0x57d, 0x56b, 0x3b, 0x570, 0x578, 0x582, 0x576, 0x56b, 0x57d, 0x56b, 0x3b, 0x570,
+0x578, 0x582, 0x56c, 0x56b, 0x57d, 0x56b, 0x3b, 0x585, 0x563, 0x578, 0x57d, 0x57f,
+0x578, 0x57d, 0x56b, 0x3b, 0x57d, 0x565, 0x57a, 0x57f, 0x565, 0x574, 0x562, 0x565,
+0x580, 0x56b, 0x3b, 0x570, 0x578, 0x56f, 0x57f, 0x565, 0x574, 0x562, 0x565, 0x580,
+0x56b, 0x3b, 0x576, 0x578, 0x575, 0x565, 0x574, 0x562, 0x565, 0x580, 0x56b, 0x3b,
+0x564, 0x565, 0x56f, 0x57f, 0x565, 0x574, 0x562, 0x565, 0x580, 0x56b, 0x570, 0x576,
+0x57e, 0x3b, 0x583, 0x57f, 0x57e, 0x3b, 0x574, 0x580, 0x57f, 0x3b, 0x561, 0x57a,
+0x580, 0x3b, 0x574, 0x575, 0x57d, 0x3b, 0x570, 0x576, 0x57d, 0x3b, 0x570, 0x56c,
+0x57d, 0x3b, 0x585, 0x563, 0x57d, 0x3b, 0x57d, 0x565, 0x57a, 0x3b, 0x570, 0x578,
+0x56f, 0x3b, 0x576, 0x578, 0x575, 0x3b, 0x564, 0x565, 0x56f, 0x540, 0x3b, 0x553,
+0x3b, 0x544, 0x3b, 0x531, 0x3b, 0x544, 0x3b, 0x540, 0x3b, 0x540, 0x3b, 0x555,
+0x3b, 0x54d, 0x3b, 0x540, 0x3b, 0x546, 0x3b, 0x534, 0x99c, 0x9be, 0x9a8, 0x9c1,
+0x9f1, 0x9be, 0x9f0, 0x9c0, 0x3b, 0x9ab, 0x9c7, 0x9ac, 0x9cd, 0x9f0, 0x9c1, 0x9f1,
+0x9be, 0x9f0, 0x9c0, 0x3b, 0x9ae, 0x9be, 0x9f0, 0x9cd, 0x99a, 0x3b, 0x98f, 0x9aa,
+0x9cd, 0x9f0, 0x9bf, 0x9b2, 0x3b, 0x9ae, 0x9c7, 0x2019, 0x3b, 0x99c, 0x9c1, 0x9a8,
+0x3b, 0x99c, 0x9c1, 0x9b2, 0x9be, 0x987, 0x3b, 0x986, 0x997, 0x9b7, 0x9cd, 0x99f,
+0x3b, 0x99b, 0x9c7, 0x9aa, 0x9cd, 0x9a4, 0x9c7, 0x9ae, 0x9cd, 0x9ac, 0x9f0, 0x3b,
+0x985, 0x995, 0x9cd, 0x99f, 0x9cb, 0x9ac, 0x9f0, 0x3b, 0x9a8, 0x9f1, 0x9c7, 0x9ae,
+0x9cd, 0x9ac, 0x9f0, 0x3b, 0x9a1, 0x9bf, 0x99a, 0x9c7, 0x9ae, 0x9cd, 0x9ac, 0x9f0,
+0x99c, 0x9be, 0x9a8, 0x9c1, 0x3b, 0x9ab, 0x9c7, 0x9ac, 0x9cd, 0x9f0, 0x9c1, 0x3b,
+0x9ae, 0x9be, 0x9f0, 0x9cd, 0x99a, 0x3b, 0x98f, 0x9aa, 0x9cd, 0x9f0, 0x9bf, 0x9b2,
+0x3b, 0x9ae, 0x9c7, 0x2019, 0x3b, 0x99c, 0x9c1, 0x9a8, 0x3b, 0x99c, 0x9c1, 0x9b2,
+0x9be, 0x987, 0x3b, 0x986, 0x997, 0x3b, 0x99b, 0x9c7, 0x9aa, 0x9cd, 0x9a4, 0x9c7,
+0x3b, 0x985, 0x995, 0x9cd, 0x99f, 0x9cb, 0x3b, 0x9a8, 0x9f1, 0x9c7, 0x3b, 0x9a1,
+0x9bf, 0x99a, 0x9c7, 0x99c, 0x3b, 0x9ab, 0x3b, 0x9ae, 0x3b, 0x98f, 0x3b, 0x9ae,
+0x3b, 0x99c, 0x3b, 0x99c, 0x3b, 0x986, 0x3b, 0x99b, 0x3b, 0x985, 0x3b, 0x9a8,
+0x3b, 0x9a1, 0x78, 0x69, 0x6e, 0x65, 0x72, 0x75, 0x3b, 0x66, 0x65, 0x62,
+0x72, 0x65, 0x72, 0x75, 0x3b, 0x6d, 0x61, 0x72, 0x7a, 0x75, 0x3b, 0x61,
+0x62, 0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x61, 0x79, 0x75, 0x3b, 0x78, 0x75,
+0x6e, 0x75, 0x3b, 0x78, 0x75, 0x6e, 0x65, 0x74, 0x75, 0x3b, 0x61, 0x67,
+0x6f, 0x73, 0x74, 0x75, 0x3b, 0x73, 0x65, 0x74, 0x69, 0x65, 0x6d, 0x62,
+0x72, 0x65, 0x3b, 0x6f, 0x63, 0x68, 0x6f, 0x62, 0x72, 0x65, 0x3b, 0x70,
+0x61, 0x79, 0x61, 0x72, 0x65, 0x73, 0x3b, 0x61, 0x76, 0x69, 0x65, 0x6e,
+0x74, 0x75, 0x64, 0x65, 0x20, 0x78, 0x69, 0x6e, 0x65, 0x72, 0x75, 0x3b,
+0x64, 0x65, 0x20, 0x66, 0x65, 0x62, 0x72, 0x65, 0x72, 0x75, 0x3b, 0x64,
+0x65, 0x20, 0x6d, 0x61, 0x72, 0x7a, 0x75, 0x3b, 0x64, 0x2019, 0x61, 0x62,
+0x72, 0x69, 0x6c, 0x3b, 0x64, 0x65, 0x20, 0x6d, 0x61, 0x79, 0x75, 0x3b,
+0x64, 0x65, 0x20, 0x78, 0x75, 0x6e, 0x75, 0x3b, 0x64, 0x65, 0x20, 0x78,
+0x75, 0x6e, 0x65, 0x74, 0x75, 0x3b, 0x64, 0x2019, 0x61, 0x67, 0x6f, 0x73,
+0x74, 0x75, 0x3b, 0x64, 0x65, 0x20, 0x73, 0x65, 0x74, 0x69, 0x65, 0x6d,
+0x62, 0x72, 0x65, 0x3b, 0x64, 0x2019, 0x6f, 0x63, 0x68, 0x6f, 0x62, 0x72,
+0x65, 0x3b, 0x64, 0x65, 0x20, 0x70, 0x61, 0x79, 0x61, 0x72, 0x65, 0x73,
+0x3b, 0x64, 0x2019, 0x61, 0x76, 0x69, 0x65, 0x6e, 0x74, 0x75, 0x58, 0x69,
+0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x62,
+0x72, 0x3b, 0x4d, 0x61, 0x79, 0x3b, 0x58, 0x75, 0x6e, 0x3b, 0x58, 0x6e,
+0x74, 0x3b, 0x41, 0x67, 0x6f, 0x3b, 0x53, 0x65, 0x74, 0x3b, 0x4f, 0x63,
+0x68, 0x3b, 0x50, 0x61, 0x79, 0x3b, 0x41, 0x76, 0x69, 0x78, 0x69, 0x6e,
+0x3b, 0x66, 0x65, 0x62, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x61, 0x62, 0x72,
+0x3b, 0x6d, 0x61, 0x79, 0x3b, 0x78, 0x75, 0x6e, 0x3b, 0x78, 0x6e, 0x74,
+0x3b, 0x61, 0x67, 0x6f, 0x3b, 0x73, 0x65, 0x74, 0x3b, 0x6f, 0x63, 0x68,
+0x3b, 0x70, 0x61, 0x79, 0x3b, 0x61, 0x76, 0x69, 0x58, 0x3b, 0x46, 0x3b,
+0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x58, 0x3b, 0x58, 0x3b, 0x41, 0x3b,
+0x53, 0x3b, 0x4f, 0x3b, 0x50, 0x3b, 0x41, 0x4a, 0x61, 0x6e, 0x75, 0x61,
+0x72, 0x69, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x69, 0x3b,
+0x4d, 0x61, 0x63, 0x68, 0x69, 0x3b, 0x41, 0x70, 0x72, 0x69, 0x6c, 0x69,
+0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75,
+0x6c, 0x61, 0x69, 0x3b, 0x41, 0x67, 0x6f, 0x73, 0x74, 0x69, 0x3b, 0x53,
+0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4f, 0x6b, 0x74, 0x6f,
+0x62, 0x61, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x44,
+0x65, 0x73, 0x65, 0x6d, 0x62, 0x61, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65,
+0x62, 0x3b, 0x4d, 0x61, 0x63, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x65,
+0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x67,
+0x6f, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f,
+0x76, 0x3b, 0x44, 0x65, 0x63, 0x50, 0x65, 0x6e, 0x20, 0x44, 0x79, 0x6f,
+0x6e, 0x3b, 0x50, 0x65, 0x6e, 0x20, 0x42, 0x61, 0x2bc, 0x61, 0x3b, 0x50,
+0x65, 0x6e, 0x20, 0x41, 0x74, 0x61, 0x74, 0x3b, 0x50, 0x65, 0x6e, 0x20,
+0x41, 0x6e, 0x61, 0x73, 0x3b, 0x50, 0x65, 0x6e, 0x20, 0x41, 0x74, 0x79,
+0x6f, 0x6e, 0x3b, 0x50, 0x65, 0x6e, 0x20, 0x41, 0x63, 0x68, 0x69, 0x72,
+0x69, 0x6d, 0x3b, 0x50, 0x65, 0x6e, 0x20, 0x41, 0x74, 0x61, 0x72, 0x69,
+0x62, 0x61, 0x3b, 0x50, 0x65, 0x6e, 0x20, 0x41, 0x77, 0x75, 0x72, 0x72,
+0x3b, 0x50, 0x65, 0x6e, 0x20, 0x53, 0x68, 0x61, 0x64, 0x6f, 0x6e, 0x3b,
+0x50, 0x65, 0x6e, 0x20, 0x53, 0x68, 0x61, 0x6b, 0x75, 0x72, 0x3b, 0x50,
+0x65, 0x6e, 0x20, 0x4b, 0x75, 0x72, 0x20, 0x4e, 0x61, 0x62, 0x61, 0x3b,
+0x50, 0x65, 0x6e, 0x20, 0x4b, 0x75, 0x72, 0x20, 0x4e, 0x61, 0x74, 0x61,
+0x74, 0x44, 0x79, 0x6f, 0x6e, 0x3b, 0x42, 0x61, 0x61, 0x3b, 0x41, 0x74,
+0x61, 0x74, 0x3b, 0x41, 0x6e, 0x61, 0x73, 0x3b, 0x41, 0x74, 0x79, 0x6f,
+0x3b, 0x41, 0x63, 0x68, 0x69, 0x3b, 0x41, 0x74, 0x61, 0x72, 0x3b, 0x41,
+0x77, 0x75, 0x72, 0x3b, 0x53, 0x68, 0x61, 0x64, 0x3b, 0x53, 0x68, 0x61,
+0x6b, 0x3b, 0x4e, 0x61, 0x62, 0x61, 0x3b, 0x4e, 0x61, 0x74, 0x61, 0x79,
+0x61, 0x6e, 0x76, 0x61, 0x72, 0x3b, 0x66, 0x65, 0x76, 0x72, 0x61, 0x6c,
+0x3b, 0x6d, 0x61, 0x72, 0x74, 0x3b, 0x61, 0x70, 0x72, 0x65, 0x6c, 0x3b,
+0x6d, 0x61, 0x79, 0x3b, 0x69, 0x79, 0x75, 0x6e, 0x3b, 0x69, 0x79, 0x75,
+0x6c, 0x3b, 0x61, 0x76, 0x71, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x6e,
+0x74, 0x79, 0x61, 0x62, 0x72, 0x3b, 0x6f, 0x6b, 0x74, 0x79, 0x61, 0x62,
+0x72, 0x3b, 0x6e, 0x6f, 0x79, 0x61, 0x62, 0x72, 0x3b, 0x64, 0x65, 0x6b,
+0x61, 0x62, 0x72, 0x79, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x76, 0x3b, 0x6d,
+0x61, 0x72, 0x3b, 0x61, 0x70, 0x72, 0x3b, 0x6d, 0x61, 0x79, 0x3b, 0x69,
+0x79, 0x6e, 0x3b, 0x69, 0x79, 0x6c, 0x3b, 0x61, 0x76, 0x71, 0x3b, 0x73,
+0x65, 0x6e, 0x3b, 0x6f, 0x6b, 0x74, 0x3b, 0x6e, 0x6f, 0x79, 0x3b, 0x64,
+0x65, 0x6b, 0x408, 0x430, 0x43d, 0x432, 0x430, 0x440, 0x3b, 0x424, 0x435, 0x432,
+0x440, 0x430, 0x43b, 0x3b, 0x41c, 0x430, 0x440, 0x442, 0x3b, 0x410, 0x43f, 0x440,
+0x435, 0x43b, 0x3b, 0x41c, 0x430, 0x439, 0x3b, 0x418, 0x458, 0x443, 0x43d, 0x3b,
+0x418, 0x458, 0x443, 0x43b, 0x3b, 0x410, 0x432, 0x433, 0x443, 0x441, 0x442, 0x3b,
+0x421, 0x435, 0x43d, 0x442, 0x458, 0x430, 0x431, 0x440, 0x3b, 0x41e, 0x43a, 0x442,
+0x458, 0x430, 0x431, 0x440, 0x3b, 0x41d, 0x43e, 0x458, 0x430, 0x431, 0x440, 0x3b,
+0x414, 0x435, 0x43a, 0x430, 0x431, 0x440, 0x458, 0x430, 0x43d, 0x432, 0x430, 0x440,
+0x3b, 0x444, 0x435, 0x432, 0x440, 0x430, 0x43b, 0x3b, 0x43c, 0x430, 0x440, 0x442,
+0x3b, 0x430, 0x43f, 0x440, 0x435, 0x43b, 0x3b, 0x43c, 0x430, 0x439, 0x3b, 0x438,
+0x458, 0x443, 0x43d, 0x3b, 0x438, 0x458, 0x443, 0x43b, 0x3b, 0x430, 0x432, 0x433,
+0x443, 0x441, 0x442, 0x3b, 0x441, 0x435, 0x43d, 0x442, 0x458, 0x430, 0x431, 0x440,
+0x3b, 0x43e, 0x43a, 0x442, 0x458, 0x430, 0x431, 0x440, 0x3b, 0x43d, 0x43e, 0x458,
+0x430, 0x431, 0x440, 0x3b, 0x434, 0x435, 0x43a, 0x430, 0x431, 0x440, 0x458, 0x430,
+0x43d, 0x3b, 0x444, 0x435, 0x432, 0x3b, 0x43c, 0x430, 0x440, 0x3b, 0x430, 0x43f,
+0x440, 0x3b, 0x43c, 0x430, 0x439, 0x3b, 0x438, 0x458, 0x43d, 0x3b, 0x438, 0x458,
+0x43b, 0x3b, 0x430, 0x432, 0x433, 0x3b, 0x441, 0x435, 0x43d, 0x3b, 0x43e, 0x43a,
+0x442, 0x3b, 0x43d, 0x43e, 0x458, 0x3b, 0x434, 0x435, 0x43a, 0x14b, 0x77, 0xed,
+0xed, 0x20, 0x61, 0x20, 0x6e, 0x74, 0x254, 0x301, 0x6e, 0x74, 0x254, 0x3b,
+0x14b, 0x77, 0xed, 0xed, 0x20, 0x61, 0x6b, 0x1dd, 0x20, 0x62, 0x25b, 0x301,
+0x25b, 0x3b, 0x14b, 0x77, 0xed, 0xed, 0x20, 0x61, 0x6b, 0x1dd, 0x20, 0x72,
+0xe1, 0xe1, 0x3b, 0x14b, 0x77, 0xed, 0xed, 0x20, 0x61, 0x6b, 0x1dd, 0x20,
+0x6e, 0x69, 0x6e, 0x3b, 0x14b, 0x77, 0xed, 0xed, 0x20, 0x61, 0x6b, 0x1dd,
+0x20, 0x74, 0xe1, 0x61, 0x6e, 0x3b, 0x14b, 0x77, 0xed, 0xed, 0x20, 0x61,
+0x6b, 0x1dd, 0x20, 0x74, 0xe1, 0x61, 0x66, 0x254, 0x6b, 0x3b, 0x14b, 0x77,
+0xed, 0xed, 0x20, 0x61, 0x6b, 0x1dd, 0x20, 0x74, 0xe1, 0x61, 0x62, 0x25b,
+0x25b, 0x3b, 0x14b, 0x77, 0xed, 0xed, 0x20, 0x61, 0x6b, 0x1dd, 0x20, 0x74,
+0xe1, 0x61, 0x72, 0x61, 0x61, 0x3b, 0x14b, 0x77, 0xed, 0xed, 0x20, 0x61,
+0x6b, 0x1dd, 0x20, 0x74, 0xe1, 0x61, 0x6e, 0x69, 0x6e, 0x3b, 0x14b, 0x77,
+0xed, 0xed, 0x20, 0x61, 0x6b, 0x1dd, 0x20, 0x6e, 0x74, 0x25b, 0x6b, 0x3b,
+0x14b, 0x77, 0xed, 0xed, 0x20, 0x61, 0x6b, 0x1dd, 0x20, 0x6e, 0x74, 0x25b,
+0x6b, 0x20, 0x64, 0x69, 0x20, 0x62, 0x254, 0x301, 0x6b, 0x3b, 0x14b, 0x77,
+0xed, 0xed, 0x20, 0x61, 0x6b, 0x1dd, 0x20, 0x6e, 0x74, 0x25b, 0x6b, 0x20,
+0x64, 0x69, 0x20, 0x62, 0x25b, 0x301, 0x25b, 0x14b, 0x31, 0x3b, 0x14b, 0x32,
+0x3b, 0x14b, 0x33, 0x3b, 0x14b, 0x34, 0x3b, 0x14b, 0x35, 0x3b, 0x14b, 0x36,
+0x3b, 0x14b, 0x37, 0x3b, 0x14b, 0x38, 0x3b, 0x14b, 0x39, 0x3b, 0x14b, 0x31,
+0x30, 0x3b, 0x14b, 0x31, 0x31, 0x3b, 0x14b, 0x31, 0x32, 0x7a, 0x61, 0x6e,
+0x77, 0x75, 0x79, 0x65, 0x3b, 0x66, 0x65, 0x62, 0x75, 0x72, 0x75, 0x79,
+0x65, 0x3b, 0x6d, 0x61, 0x72, 0x69, 0x73, 0x69, 0x3b, 0x61, 0x77, 0x69,
+0x72, 0x69, 0x6c, 0x69, 0x3b, 0x6d, 0x25b, 0x3b, 0x7a, 0x75, 0x77, 0x25b,
+0x6e, 0x3b, 0x7a, 0x75, 0x6c, 0x75, 0x79, 0x65, 0x3b, 0x75, 0x74, 0x69,
+0x3b, 0x73, 0x25b, 0x74, 0x61, 0x6e, 0x62, 0x75, 0x72, 0x75, 0x3b, 0x254,
+0x6b, 0x75, 0x74, 0x254, 0x62, 0x75, 0x72, 0x75, 0x3b, 0x6e, 0x6f, 0x77,
+0x61, 0x6e, 0x62, 0x75, 0x72, 0x75, 0x3b, 0x64, 0x65, 0x73, 0x61, 0x6e,
+0x62, 0x75, 0x72, 0x75, 0x7a, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x62, 0x3b,
+0x6d, 0x61, 0x72, 0x3b, 0x61, 0x77, 0x69, 0x3b, 0x6d, 0x25b, 0x3b, 0x7a,
+0x75, 0x77, 0x3b, 0x7a, 0x75, 0x6c, 0x3b, 0x75, 0x74, 0x69, 0x3b, 0x73,
+0x25b, 0x74, 0x3b, 0x254, 0x6b, 0x75, 0x3b, 0x6e, 0x6f, 0x77, 0x3b, 0x64,
+0x65, 0x73, 0x5a, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b,
+0x5a, 0x3b, 0x5a, 0x3b, 0x55, 0x3b, 0x53, 0x3b, 0x186, 0x3b, 0x4e, 0x3b,
+0x44, 0x99c, 0x9be, 0x9a8, 0x9c1, 0x9af, 0x9bc, 0x9be, 0x9b0, 0x9c0, 0x3b, 0x9ab,
+0x9c7, 0x9ac, 0x9cd, 0x9b0, 0x9c1, 0x9af, 0x9bc, 0x9be, 0x9b0, 0x9c0, 0x3b, 0x9ae,
+0x9be, 0x9b0, 0x9cd, 0x99a, 0x3b, 0x98f, 0x9aa, 0x9cd, 0x9b0, 0x9bf, 0x9b2, 0x3b,
+0x9ae, 0x9c7, 0x3b, 0x99c, 0x9c1, 0x9a8, 0x3b, 0x99c, 0x9c1, 0x9b2, 0x9be, 0x987,
+0x3b, 0x986, 0x997, 0x9b8, 0x9cd, 0x99f, 0x3b, 0x9b8, 0x9c7, 0x9aa, 0x9cd, 0x99f,
+0x9c7, 0x9ae, 0x9cd, 0x9ac, 0x9b0, 0x3b, 0x985, 0x995, 0x9cd, 0x99f, 0x9cb, 0x9ac,
+0x9b0, 0x3b, 0x9a8, 0x9ad, 0x9c7, 0x9ae, 0x9cd, 0x9ac, 0x9b0, 0x3b, 0x9a1, 0x9bf,
+0x9b8, 0x9c7, 0x9ae, 0x9cd, 0x9ac, 0x9b0, 0x99c, 0x9be, 0x9a8, 0x9c1, 0x3b, 0x9ab,
+0x9c7, 0x9ac, 0x3b, 0x9ae, 0x9be, 0x9b0, 0x9cd, 0x99a, 0x3b, 0x98f, 0x9aa, 0x9cd,
+0x9b0, 0x9bf, 0x9b2, 0x3b, 0x9ae, 0x9c7, 0x3b, 0x99c, 0x9c1, 0x9a8, 0x3b, 0x99c,
+0x9c1, 0x9b2, 0x9be, 0x987, 0x3b, 0x986, 0x997, 0x9b8, 0x9cd, 0x99f, 0x3b, 0x9b8,
+0x9c7, 0x9aa, 0x9cd, 0x99f, 0x9c7, 0x9ae, 0x9cd, 0x9ac, 0x9b0, 0x3b, 0x985, 0x995,
+0x9cd, 0x99f, 0x9cb, 0x9ac, 0x9b0, 0x3b, 0x9a8, 0x9ad, 0x9c7, 0x9ae, 0x9cd, 0x9ac,
+0x9b0, 0x3b, 0x9a1, 0x9bf, 0x9b8, 0x9c7, 0x9ae, 0x9cd, 0x9ac, 0x9b0, 0x99c, 0x9be,
+0x9a8, 0x9c1, 0x3b, 0x9ab, 0x9c7, 0x9ac, 0x3b, 0x9ae, 0x9be, 0x9b0, 0x9cd, 0x99a,
+0x3b, 0x98f, 0x9aa, 0x9cd, 0x9b0, 0x9bf, 0x3b, 0x9ae, 0x9c7, 0x3b, 0x99c, 0x9c1,
+0x9a8, 0x3b, 0x99c, 0x9c1, 0x9b2, 0x3b, 0x986, 0x997, 0x3b, 0x9b8, 0x9c7, 0x9aa,
+0x3b, 0x985, 0x995, 0x9cd, 0x99f, 0x9cb, 0x3b, 0x9a8, 0x9ad, 0x9c7, 0x3b, 0x9a1,
+0x9bf, 0x9b8, 0x9c7, 0x99c, 0x9be, 0x3b, 0x9ab, 0x9c7, 0x3b, 0x9ae, 0x9be, 0x3b,
+0x98f, 0x3b, 0x9ae, 0x9c7, 0x3b, 0x99c, 0x9c1, 0x9a8, 0x3b, 0x99c, 0x9c1, 0x3b,
+0x986, 0x3b, 0x9b8, 0x9c7, 0x3b, 0x985, 0x3b, 0x9a8, 0x3b, 0x9a1, 0x9bf, 0x99c,
+0x9be, 0x9a8, 0x9c1, 0x3b, 0x9ab, 0x9c7, 0x9ac, 0x3b, 0x9ae, 0x9be, 0x9b0, 0x9cd,
+0x99a, 0x3b, 0x98f, 0x9aa, 0x9cd, 0x9b0, 0x9bf, 0x9b2, 0x3b, 0x9ae, 0x9c7, 0x3b,
+0x99c, 0x9c1, 0x9a8, 0x3b, 0x99c, 0x9c1, 0x9b2, 0x9be, 0x987, 0x3b, 0x986, 0x997,
+0x9b8, 0x9cd, 0x99f, 0x3b, 0x9b8, 0x9c7, 0x9aa, 0x9cd, 0x99f, 0x9c7, 0x983, 0x3b,
+0x985, 0x995, 0x9cd, 0x99f, 0x9cb, 0x983, 0x3b, 0x9a8, 0x9ad, 0x9c7, 0x983, 0x3b,
+0x9a1, 0x9bf, 0x9b8, 0x9c7, 0x983, 0x99c, 0x9be, 0x9a8, 0x9c1, 0x3b, 0x9ab, 0x9c7,
+0x9ac, 0x3b, 0x9ae, 0x9be, 0x9b0, 0x9cd, 0x99a, 0x3b, 0x98f, 0x9aa, 0x9cd, 0x9b0,
+0x9bf, 0x3b, 0x9ae, 0x9c7, 0x3b, 0x99c, 0x9c1, 0x9a8, 0x3b, 0x99c, 0x9c1, 0x9b2,
+0x3b, 0x986, 0x997, 0x3b, 0x9b8, 0x9c7, 0x9aa, 0x9cd, 0x99f, 0x9c7, 0x983, 0x3b,
+0x985, 0x995, 0x9cd, 0x99f, 0x9cb, 0x983, 0x3b, 0x9a8, 0x9ad, 0x9c7, 0x983, 0x3b,
+0x9a1, 0x9bf, 0x9b8, 0x9c7, 0x983, 0x99c, 0x9be, 0x3b, 0x9ab, 0x9c7, 0x3b, 0x9ae,
+0x9be, 0x3b, 0x98f, 0x3b, 0x9ae, 0x9c7, 0x3b, 0x99c, 0x9c1, 0x9a8, 0x3b, 0x99c,
+0x9c1, 0x9b2, 0x3b, 0x986, 0x3b, 0x9b8, 0x9c7, 0x3b, 0x985, 0x3b, 0x9a8, 0x3b,
+0x9a1, 0x9bf, 0x4b, 0x254, 0x6e, 0x64, 0x254, 0x14b, 0x3b, 0x4d, 0xe0, 0x63,
+0x25b, 0x302, 0x6c, 0x3b, 0x4d, 0xe0, 0x74, 0xf9, 0x6d, 0x62, 0x3b, 0x4d,
+0xe0, 0x74, 0x6f, 0x70, 0x3b, 0x4d, 0x300, 0x70, 0x75, 0x79, 0x25b, 0x3b,
+0x48, 0xec, 0x6c, 0xf2, 0x6e, 0x64, 0x25b, 0x300, 0x3b, 0x4e, 0x6a, 0xe8,
+0x62, 0xe0, 0x3b, 0x48, 0xec, 0x6b, 0x61, 0x14b, 0x3b, 0x44, 0xec, 0x70,
+0x254, 0x300, 0x73, 0x3b, 0x42, 0xec, 0xf2, 0xf4, 0x6d, 0x3b, 0x4d, 0xe0,
+0x79, 0x25b, 0x73, 0xe8, 0x70, 0x3b, 0x4c, 0xec, 0x62, 0x75, 0x79, 0x20,
+0x6c, 0x69, 0x20, 0x144, 0x79, 0xe8, 0x65, 0x6b, 0x254, 0x6e, 0x3b, 0x6d,
+0x61, 0x63, 0x3b, 0x6d, 0x61, 0x74, 0x3b, 0x6d, 0x74, 0x6f, 0x3b, 0x6d,
+0x70, 0x75, 0x3b, 0x68, 0x69, 0x6c, 0x3b, 0x6e, 0x6a, 0x65, 0x3b, 0x68,
+0x69, 0x6b, 0x3b, 0x64, 0x69, 0x70, 0x3b, 0x62, 0x69, 0x6f, 0x3b, 0x6d,
+0x61, 0x79, 0x3b, 0x6c, 0x69, 0x253, 0x6b, 0x3b, 0x6d, 0x3b, 0x6d, 0x3b,
+0x6d, 0x3b, 0x6d, 0x3b, 0x68, 0x3b, 0x6e, 0x3b, 0x68, 0x3b, 0x64, 0x3b,
+0x62, 0x3b, 0x6d, 0x3b, 0x6c, 0x75, 0x72, 0x74, 0x61, 0x72, 0x72, 0x69,
+0x6c, 0x61, 0x3b, 0x6f, 0x74, 0x73, 0x61, 0x69, 0x6c, 0x61, 0x3b, 0x6d,
+0x61, 0x72, 0x74, 0x78, 0x6f, 0x61, 0x3b, 0x61, 0x70, 0x69, 0x72, 0x69,
+0x6c, 0x61, 0x3b, 0x6d, 0x61, 0x69, 0x61, 0x74, 0x7a, 0x61, 0x3b, 0x65,
+0x6b, 0x61, 0x69, 0x6e, 0x61, 0x3b, 0x75, 0x7a, 0x74, 0x61, 0x69, 0x6c,
+0x61, 0x3b, 0x61, 0x62, 0x75, 0x7a, 0x74, 0x75, 0x61, 0x3b, 0x69, 0x72,
+0x61, 0x69, 0x6c, 0x61, 0x3b, 0x75, 0x72, 0x72, 0x69, 0x61, 0x3b, 0x61,
+0x7a, 0x61, 0x72, 0x6f, 0x61, 0x3b, 0x61, 0x62, 0x65, 0x6e, 0x64, 0x75,
+0x61, 0x75, 0x72, 0x74, 0x2e, 0x3b, 0x6f, 0x74, 0x73, 0x2e, 0x3b, 0x6d,
+0x61, 0x72, 0x2e, 0x3b, 0x61, 0x70, 0x69, 0x2e, 0x3b, 0x6d, 0x61, 0x69,
+0x2e, 0x3b, 0x65, 0x6b, 0x61, 0x2e, 0x3b, 0x75, 0x7a, 0x74, 0x2e, 0x3b,
+0x61, 0x62, 0x75, 0x2e, 0x3b, 0x69, 0x72, 0x61, 0x2e, 0x3b, 0x75, 0x72,
+0x72, 0x2e, 0x3b, 0x61, 0x7a, 0x61, 0x2e, 0x3b, 0x61, 0x62, 0x65, 0x2e,
+0x55, 0x3b, 0x4f, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x45, 0x3b,
+0x55, 0x3b, 0x41, 0x3b, 0x49, 0x3b, 0x55, 0x3b, 0x41, 0x3b, 0x41, 0x441,
+0x442, 0x443, 0x434, 0x437, 0x435, 0x43d, 0x44c, 0x3b, 0x43b, 0x44e, 0x442, 0x44b,
+0x3b, 0x441, 0x430, 0x43a, 0x430, 0x432, 0x456, 0x43a, 0x3b, 0x43a, 0x440, 0x430,
+0x441, 0x430, 0x432, 0x456, 0x43a, 0x3b, 0x43c, 0x430, 0x439, 0x3b, 0x447, 0x44d,
+0x440, 0x432, 0x435, 0x43d, 0x44c, 0x3b, 0x43b, 0x456, 0x43f, 0x435, 0x43d, 0x44c,
+0x3b, 0x436, 0x43d, 0x456, 0x432, 0x435, 0x43d, 0x44c, 0x3b, 0x432, 0x435, 0x440,
+0x430, 0x441, 0x435, 0x43d, 0x44c, 0x3b, 0x43a, 0x430, 0x441, 0x442, 0x440, 0x44b,
+0x447, 0x43d, 0x456, 0x43a, 0x3b, 0x43b, 0x456, 0x441, 0x442, 0x430, 0x43f, 0x430,
+0x434, 0x3b, 0x441, 0x43d, 0x435, 0x436, 0x430, 0x43d, 0x44c, 0x441, 0x442, 0x443,
+0x434, 0x437, 0x435, 0x43d, 0x44f, 0x3b, 0x43b, 0x44e, 0x442, 0x430, 0x433, 0x430,
+0x3b, 0x441, 0x430, 0x43a, 0x430, 0x432, 0x456, 0x43a, 0x430, 0x3b, 0x43a, 0x440,
+0x430, 0x441, 0x430, 0x432, 0x456, 0x43a, 0x430, 0x3b, 0x43c, 0x430, 0x44f, 0x3b,
+0x447, 0x44d, 0x440, 0x432, 0x435, 0x43d, 0x44f, 0x3b, 0x43b, 0x456, 0x43f, 0x435,
+0x43d, 0x44f, 0x3b, 0x436, 0x43d, 0x456, 0x45e, 0x43d, 0x44f, 0x3b, 0x432, 0x435,
+0x440, 0x430, 0x441, 0x43d, 0x44f, 0x3b, 0x43a, 0x430, 0x441, 0x442, 0x440, 0x44b,
+0x447, 0x43d, 0x456, 0x43a, 0x430, 0x3b, 0x43b, 0x456, 0x441, 0x442, 0x430, 0x43f,
+0x430, 0x434, 0x430, 0x3b, 0x441, 0x43d, 0x435, 0x436, 0x43d, 0x44f, 0x441, 0x442,
+0x443, 0x3b, 0x43b, 0x44e, 0x442, 0x3b, 0x441, 0x430, 0x43a, 0x3b, 0x43a, 0x440,
+0x430, 0x3b, 0x43c, 0x430, 0x439, 0x3b, 0x447, 0x44d, 0x440, 0x3b, 0x43b, 0x456,
+0x43f, 0x3b, 0x436, 0x43d, 0x456, 0x3b, 0x432, 0x435, 0x440, 0x3b, 0x43a, 0x430,
+0x441, 0x3b, 0x43b, 0x456, 0x441, 0x3b, 0x441, 0x43d, 0x435, 0x441, 0x442, 0x443,
+0x3b, 0x43b, 0x44e, 0x442, 0x3b, 0x441, 0x430, 0x43a, 0x3b, 0x43a, 0x440, 0x430,
+0x3b, 0x43c, 0x430, 0x44f, 0x3b, 0x447, 0x44d, 0x440, 0x3b, 0x43b, 0x456, 0x43f,
+0x3b, 0x436, 0x43d, 0x456, 0x3b, 0x432, 0x435, 0x440, 0x3b, 0x43a, 0x430, 0x441,
+0x3b, 0x43b, 0x456, 0x441, 0x3b, 0x441, 0x43d, 0x435, 0x441, 0x3b, 0x43b, 0x3b,
+0x441, 0x3b, 0x43a, 0x3b, 0x43c, 0x3b, 0x447, 0x3b, 0x43b, 0x3b, 0x436, 0x3b,
+0x432, 0x3b, 0x43a, 0x3b, 0x43b, 0x3b, 0x441, 0x4a, 0x61, 0x6e, 0x75, 0x61,
+0x72, 0x69, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x69, 0x3b,
+0x4d, 0x61, 0x63, 0x68, 0x69, 0x3b, 0x45, 0x70, 0x72, 0x65, 0x6f, 0x3b,
+0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c,
+0x61, 0x69, 0x3b, 0x4f, 0x67, 0x61, 0x73, 0x74, 0x69, 0x3b, 0x53, 0x65,
+0x70, 0x74, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62,
+0x61, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x44, 0x69,
+0x73, 0x65, 0x6d, 0x62, 0x61, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62,
+0x3b, 0x4d, 0x61, 0x63, 0x3b, 0x45, 0x70, 0x72, 0x3b, 0x4d, 0x65, 0x69,
+0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x4f, 0x67, 0x61,
+0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76,
+0x3b, 0x44, 0x69, 0x73, 0x4a, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x45, 0x3b,
+0x4d, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0x4f, 0x3b, 0x53, 0x3b, 0x4f, 0x3b,
+0x4e, 0x3b, 0x44, 0x70, 0x61, 0x20, 0x6d, 0x77, 0x65, 0x64, 0x7a, 0x69,
+0x20, 0x67, 0x77, 0x61, 0x20, 0x68, 0x75, 0x74, 0x61, 0x6c, 0x61, 0x3b,
+0x70, 0x61, 0x20, 0x6d, 0x77, 0x65, 0x64, 0x7a, 0x69, 0x20, 0x67, 0x77,
+0x61, 0x20, 0x77, 0x75, 0x76, 0x69, 0x6c, 0x69, 0x3b, 0x70, 0x61, 0x20,
+0x6d, 0x77, 0x65, 0x64, 0x7a, 0x69, 0x20, 0x67, 0x77, 0x61, 0x20, 0x77,
+0x75, 0x64, 0x61, 0x74, 0x75, 0x3b, 0x70, 0x61, 0x20, 0x6d, 0x77, 0x65,
+0x64, 0x7a, 0x69, 0x20, 0x67, 0x77, 0x61, 0x20, 0x77, 0x75, 0x74, 0x61,
+0x69, 0x3b, 0x70, 0x61, 0x20, 0x6d, 0x77, 0x65, 0x64, 0x7a, 0x69, 0x20,
+0x67, 0x77, 0x61, 0x20, 0x77, 0x75, 0x68, 0x61, 0x6e, 0x75, 0x3b, 0x70,
+0x61, 0x20, 0x6d, 0x77, 0x65, 0x64, 0x7a, 0x69, 0x20, 0x67, 0x77, 0x61,
+0x20, 0x73, 0x69, 0x74, 0x61, 0x3b, 0x70, 0x61, 0x20, 0x6d, 0x77, 0x65,
+0x64, 0x7a, 0x69, 0x20, 0x67, 0x77, 0x61, 0x20, 0x73, 0x61, 0x62, 0x61,
+0x3b, 0x70, 0x61, 0x20, 0x6d, 0x77, 0x65, 0x64, 0x7a, 0x69, 0x20, 0x67,
+0x77, 0x61, 0x20, 0x6e, 0x61, 0x6e, 0x65, 0x3b, 0x70, 0x61, 0x20, 0x6d,
+0x77, 0x65, 0x64, 0x7a, 0x69, 0x20, 0x67, 0x77, 0x61, 0x20, 0x74, 0x69,
+0x73, 0x61, 0x3b, 0x70, 0x61, 0x20, 0x6d, 0x77, 0x65, 0x64, 0x7a, 0x69,
+0x20, 0x67, 0x77, 0x61, 0x20, 0x6b, 0x75, 0x6d, 0x69, 0x3b, 0x70, 0x61,
+0x20, 0x6d, 0x77, 0x65, 0x64, 0x7a, 0x69, 0x20, 0x67, 0x77, 0x61, 0x20,
+0x6b, 0x75, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x6d, 0x6f, 0x6a, 0x61,
+0x3b, 0x70, 0x61, 0x20, 0x6d, 0x77, 0x65, 0x64, 0x7a, 0x69, 0x20, 0x67,
+0x77, 0x61, 0x20, 0x6b, 0x75, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x6d,
+0x62, 0x69, 0x6c, 0x69, 0x48, 0x75, 0x74, 0x3b, 0x56, 0x69, 0x6c, 0x3b,
+0x44, 0x61, 0x74, 0x3b, 0x54, 0x61, 0x69, 0x3b, 0x48, 0x61, 0x6e, 0x3b,
+0x53, 0x69, 0x74, 0x3b, 0x53, 0x61, 0x62, 0x3b, 0x4e, 0x61, 0x6e, 0x3b,
+0x54, 0x69, 0x73, 0x3b, 0x4b, 0x75, 0x6d, 0x3b, 0x4b, 0x6d, 0x6a, 0x3b,
+0x4b, 0x6d, 0x62, 0x48, 0x3b, 0x56, 0x3b, 0x44, 0x3b, 0x54, 0x3b, 0x48,
+0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x4e, 0x3b, 0x54, 0x3b, 0x4b, 0x3b, 0x4b,
+0x3b, 0x4b, 0x91c, 0x928, 0x935, 0x930, 0x940, 0x3b, 0x92b, 0x930, 0x935, 0x930,
+0x940, 0x3b, 0x92e, 0x93e, 0x930, 0x94d, 0x91a, 0x3b, 0x905, 0x92a, 0x94d, 0x930,
+0x948, 0x932, 0x3b, 0x92e, 0x908, 0x3b, 0x91c, 0x942, 0x928, 0x3b, 0x91c, 0x941,
+0x932, 0x93e, 0x908, 0x3b, 0x905, 0x917, 0x938, 0x94d, 0x924, 0x3b, 0x938, 0x93f,
+0x924, 0x92e, 0x94d, 0x92c, 0x930, 0x3b, 0x905, 0x915, 0x94d, 0x91f, 0x942, 0x92c,
+0x930, 0x3b, 0x928, 0x935, 0x902, 0x92c, 0x930, 0x3b, 0x926, 0x93f, 0x938, 0x902,
+0x92c, 0x930, 0x120d, 0x12f0, 0x1275, 0x122a, 0x3b, 0x12ab, 0x1265, 0x12bd, 0x1265, 0x1272,
+0x3b, 0x12ad, 0x1265, 0x120b, 0x3b, 0x134b, 0x1305, 0x12ba, 0x122a, 0x3b, 0x12ad, 0x1262,
+0x1245, 0x122a, 0x3b, 0x121d, 0x12aa, 0x12a4, 0x120d, 0x20, 0x1275, 0x131f, 0x1292, 0x122a,
+0x3b, 0x12b0, 0x122d, 0x12a9, 0x3b, 0x121b, 0x122d, 0x12eb, 0x121d, 0x20, 0x1275, 0x122a,
+0x3b, 0x12eb, 0x12b8, 0x1292, 0x20, 0x1218, 0x1233, 0x1245, 0x1208, 0x122a, 0x3b, 0x1218,
+0x1270, 0x1209, 0x3b, 0x121d, 0x12aa, 0x12a4, 0x120d, 0x20, 0x1218, 0x123d, 0x12c8, 0x122a,
+0x3b, 0x1270, 0x1215, 0x1233, 0x1235, 0x122a, 0x120d, 0x12f0, 0x1275, 0x3b, 0x12ab, 0x1265,
+0x12bd, 0x3b, 0x12ad, 0x1265, 0x120b, 0x3b, 0x134b, 0x1305, 0x12ba, 0x3b, 0x12ad, 0x1262,
+0x1245, 0x3b, 0x121d, 0x2f, 0x1275, 0x3b, 0x12b0, 0x122d, 0x3b, 0x121b, 0x122d, 0x12eb,
+0x3b, 0x12eb, 0x12b8, 0x1292, 0x3b, 0x1218, 0x1270, 0x1209, 0x3b, 0x121d, 0x2f, 0x121d,
+0x3b, 0x1270, 0x1215, 0x1233, 0x120d, 0x3b, 0x12ab, 0x3b, 0x12ad, 0x3b, 0x134b, 0x3b,
+0x12ad, 0x3b, 0x121d, 0x3b, 0x12b0, 0x3b, 0x121b, 0x3b, 0x12eb, 0x3b, 0x1218, 0x3b,
+0x121d, 0x3b, 0x1270, 0x91c, 0x93e, 0x928, 0x941, 0x935, 0x93e, 0x930, 0x940, 0x3b,
+0x92b, 0x947, 0x92c, 0x94d, 0x930, 0x942, 0x935, 0x93e, 0x930, 0x940, 0x3b, 0x92e,
+0x93e, 0x930, 0x94d, 0x91a, 0x3b, 0x90f, 0x92a, 0x94d, 0x930, 0x93f, 0x932, 0x3b,
+0x92e, 0x947, 0x3b, 0x91c, 0x941, 0x928, 0x3b, 0x91c, 0x941, 0x932, 0x93e, 0x908,
+0x3b, 0x906, 0x917, 0x937, 0x94d, 0x91f, 0x3b, 0x938, 0x947, 0x92a, 0x94d, 0x925,
+0x947, 0x92e, 0x94d, 0x92c, 0x930, 0x3b, 0x905, 0x915, 0x94d, 0x91f, 0x2019, 0x92c,
+0x930, 0x3b, 0x928, 0x935, 0x947, 0x92e, 0x94d, 0x92c, 0x930, 0x3b, 0x921, 0x93f,
+0x938, 0x947, 0x92e, 0x94d, 0x92c, 0x930, 0x91c, 0x93e, 0x928, 0x3b, 0x92b, 0x947,
+0x92c, 0x3b, 0x92e, 0x93e, 0x930, 0x94d, 0x91a, 0x3b, 0x90f, 0x92a, 0x94d, 0x930,
+0x93f, 0x3b, 0x92e, 0x947, 0x3b, 0x91c, 0x941, 0x928, 0x3b, 0x91c, 0x941, 0x932,
+0x3b, 0x906, 0x917, 0x3b, 0x938, 0x947, 0x92a, 0x3b, 0x905, 0x915, 0x94d, 0x91f,
+0x2019, 0x3b, 0x928, 0x935, 0x947, 0x3b, 0x921, 0x93f, 0x938, 0x947, 0x91c, 0x3b,
+0x92b, 0x3b, 0x92e, 0x3b, 0x90f, 0x3b, 0x92e, 0x3b, 0x91c, 0x3b, 0x91c, 0x3b,
+0x906, 0x3b, 0x938, 0x3b, 0x905, 0x3b, 0x928, 0x3b, 0x921, 0x6a, 0x61, 0x6e,
+0x75, 0x61, 0x72, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b,
+0x6d, 0x61, 0x72, 0x74, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x6d,
+0x61, 0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x3b, 0x6a, 0x75, 0x6c, 0x69,
+0x3b, 0x61, 0x75, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74,
+0x65, 0x6d, 0x62, 0x61, 0x72, 0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x62, 0x61,
+0x72, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x3b, 0x64,
+0x65, 0x63, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x6a, 0x61, 0x6e, 0x3b, 0x66,
+0x65, 0x62, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x61, 0x70, 0x72, 0x3b, 0x6d,
+0x61, 0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x3b, 0x6a, 0x75, 0x6c, 0x3b, 0x61,
+0x75, 0x67, 0x3b, 0x73, 0x65, 0x70, 0x3b, 0x6f, 0x6b, 0x74, 0x3b, 0x6e,
+0x6f, 0x76, 0x3b, 0x64, 0x65, 0x63, 0x6a, 0x3b, 0x66, 0x3b, 0x6d, 0x3b,
+0x61, 0x3b, 0x6d, 0x3b, 0x6a, 0x3b, 0x6a, 0x3b, 0x61, 0x3b, 0x73, 0x3b,
+0x6f, 0x3b, 0x6e, 0x3b, 0x64, 0x458, 0x430, 0x43d, 0x443, 0x430, 0x440, 0x3b,
+0x444, 0x435, 0x431, 0x440, 0x443, 0x430, 0x440, 0x3b, 0x43c, 0x430, 0x440, 0x442,
+0x3b, 0x430, 0x43f, 0x440, 0x438, 0x43b, 0x3b, 0x43c, 0x430, 0x458, 0x3b, 0x458,
+0x443, 0x43d, 0x438, 0x3b, 0x458, 0x443, 0x43b, 0x438, 0x3b, 0x430, 0x443, 0x433,
+0x443, 0x441, 0x442, 0x3b, 0x441, 0x435, 0x43f, 0x442, 0x435, 0x43c, 0x431, 0x430,
+0x440, 0x3b, 0x43e, 0x43a, 0x442, 0x43e, 0x431, 0x430, 0x440, 0x3b, 0x43d, 0x43e,
+0x432, 0x435, 0x43c, 0x431, 0x430, 0x440, 0x3b, 0x434, 0x435, 0x446, 0x435, 0x43c,
+0x431, 0x430, 0x440, 0x458, 0x430, 0x43d, 0x3b, 0x444, 0x435, 0x431, 0x3b, 0x43c,
+0x430, 0x440, 0x3b, 0x430, 0x43f, 0x440, 0x3b, 0x43c, 0x430, 0x458, 0x3b, 0x458,
+0x443, 0x43d, 0x3b, 0x458, 0x443, 0x43b, 0x3b, 0x430, 0x443, 0x433, 0x3b, 0x441,
+0x435, 0x43f, 0x3b, 0x43e, 0x43a, 0x442, 0x3b, 0x43d, 0x43e, 0x432, 0x3b, 0x434,
+0x435, 0x446, 0x458, 0x3b, 0x444, 0x3b, 0x43c, 0x3b, 0x430, 0x3b, 0x43c, 0x3b,
+0x458, 0x3b, 0x458, 0x3b, 0x430, 0x3b, 0x441, 0x3b, 0x43e, 0x3b, 0x43d, 0x3b,
+0x434, 0x47, 0x65, 0x6e, 0x76, 0x65, 0x72, 0x3b, 0x43, 0x2bc, 0x68, 0x77,
+0x65, 0x76, 0x72, 0x65, 0x72, 0x3b, 0x4d, 0x65, 0x75, 0x72, 0x7a, 0x68,
+0x3b, 0x45, 0x62, 0x72, 0x65, 0x6c, 0x3b, 0x4d, 0x61, 0x65, 0x3b, 0x4d,
+0x65, 0x7a, 0x68, 0x65, 0x76, 0x65, 0x6e, 0x3b, 0x47, 0x6f, 0x75, 0x65,
+0x72, 0x65, 0x3b, 0x45, 0x6f, 0x73, 0x74, 0x3b, 0x47, 0x77, 0x65, 0x6e,
+0x67, 0x6f, 0x6c, 0x6f, 0x3b, 0x48, 0x65, 0x72, 0x65, 0x3b, 0x44, 0x75,
+0x3b, 0x4b, 0x65, 0x72, 0x7a, 0x75, 0x47, 0x65, 0x6e, 0x2e, 0x3b, 0x43,
+0x2bc, 0x68, 0x77, 0x65, 0x2e, 0x3b, 0x4d, 0x65, 0x75, 0x72, 0x2e, 0x3b,
+0x45, 0x62, 0x72, 0x2e, 0x3b, 0x4d, 0x61, 0x65, 0x3b, 0x4d, 0x65, 0x7a,
+0x68, 0x2e, 0x3b, 0x47, 0x6f, 0x75, 0x65, 0x2e, 0x3b, 0x45, 0x6f, 0x73,
+0x74, 0x3b, 0x47, 0x77, 0x65, 0x6e, 0x2e, 0x3b, 0x48, 0x65, 0x72, 0x65,
+0x3b, 0x44, 0x75, 0x3b, 0x4b, 0x7a, 0x75, 0x2e, 0x30, 0x31, 0x3b, 0x30,
+0x32, 0x3b, 0x30, 0x33, 0x3b, 0x30, 0x34, 0x3b, 0x30, 0x35, 0x3b, 0x30,
+0x36, 0x3b, 0x30, 0x37, 0x3b, 0x30, 0x38, 0x3b, 0x30, 0x39, 0x3b, 0x31,
+0x30, 0x3b, 0x31, 0x31, 0x3b, 0x31, 0x32, 0x44f, 0x43d, 0x443, 0x430, 0x440,
+0x438, 0x3b, 0x444, 0x435, 0x432, 0x440, 0x443, 0x430, 0x440, 0x438, 0x3b, 0x43c,
+0x430, 0x440, 0x442, 0x3b, 0x430, 0x43f, 0x440, 0x438, 0x43b, 0x3b, 0x43c, 0x430,
+0x439, 0x3b, 0x44e, 0x43d, 0x438, 0x3b, 0x44e, 0x43b, 0x438, 0x3b, 0x430, 0x432,
+0x433, 0x443, 0x441, 0x442, 0x3b, 0x441, 0x435, 0x43f, 0x442, 0x435, 0x43c, 0x432,
+0x440, 0x438, 0x3b, 0x43e, 0x43a, 0x442, 0x43e, 0x43c, 0x432, 0x440, 0x438, 0x3b,
+0x43d, 0x43e, 0x435, 0x43c, 0x432, 0x440, 0x438, 0x3b, 0x434, 0x435, 0x43a, 0x435,
+0x43c, 0x432, 0x440, 0x438, 0x44f, 0x43d, 0x443, 0x3b, 0x444, 0x435, 0x432, 0x3b,
+0x43c, 0x430, 0x440, 0x442, 0x3b, 0x430, 0x43f, 0x440, 0x3b, 0x43c, 0x430, 0x439,
+0x3b, 0x44e, 0x43d, 0x438, 0x3b, 0x44e, 0x43b, 0x438, 0x3b, 0x430, 0x432, 0x433,
+0x3b, 0x441, 0x435, 0x43f, 0x3b, 0x43e, 0x43a, 0x442, 0x3b, 0x43d, 0x43e, 0x435,
+0x3b, 0x434, 0x435, 0x43a, 0x44f, 0x3b, 0x444, 0x3b, 0x43c, 0x3b, 0x430, 0x3b,
+0x43c, 0x3b, 0x44e, 0x3b, 0x44e, 0x3b, 0x430, 0x3b, 0x441, 0x3b, 0x43e, 0x3b,
+0x43d, 0x3b, 0x434, 0x1007, 0x1014, 0x103a, 0x1014, 0x101d, 0x102b, 0x101b, 0x102e, 0x3b,
+0x1016, 0x1031, 0x1016, 0x1031, 0x102c, 0x103a, 0x101d, 0x102b, 0x101b, 0x102e, 0x3b, 0x1019,
+0x1010, 0x103a, 0x3b, 0x1027, 0x1015, 0x103c, 0x102e, 0x3b, 0x1019, 0x1031, 0x3b, 0x1007,
+0x103d, 0x1014, 0x103a, 0x3b, 0x1007, 0x1030, 0x101c, 0x102d, 0x102f, 0x1004, 0x103a, 0x3b,
+0x1029, 0x1002, 0x102f, 0x1010, 0x103a, 0x3b, 0x1005, 0x1000, 0x103a, 0x1010, 0x1004, 0x103a,
+0x1018, 0x102c, 0x3b, 0x1021, 0x1031, 0x102c, 0x1000, 0x103a, 0x1010, 0x102d, 0x102f, 0x1018,
+0x102c, 0x3b, 0x1014, 0x102d, 0x102f, 0x101d, 0x1004, 0x103a, 0x1018, 0x102c, 0x3b, 0x1012,
+0x102e, 0x1007, 0x1004, 0x103a, 0x1018, 0x102c, 0x1007, 0x1014, 0x103a, 0x3b, 0x1016, 0x1031,
+0x3b, 0x1019, 0x1010, 0x103a, 0x3b, 0x1027, 0x3b, 0x1019, 0x1031, 0x3b, 0x1007, 0x103d,
+0x1014, 0x103a, 0x3b, 0x1007, 0x1030, 0x3b, 0x1029, 0x3b, 0x1005, 0x1000, 0x103a, 0x3b,
+0x1021, 0x1031, 0x102c, 0x1000, 0x103a, 0x3b, 0x1014, 0x102d, 0x102f, 0x3b, 0x1012, 0x102e,
+0x1007, 0x3b, 0x1016, 0x3b, 0x1019, 0x3b, 0x1027, 0x3b, 0x1019, 0x3b, 0x1007, 0x3b,
+0x1007, 0x3b, 0x1029, 0x3b, 0x1005, 0x3b, 0x1021, 0x3b, 0x1014, 0x3b, 0x1012, 0x31,
+0x6708, 0x3b, 0x32, 0x6708, 0x3b, 0x33, 0x6708, 0x3b, 0x34, 0x6708, 0x3b, 0x35,
+0x6708, 0x3b, 0x36, 0x6708, 0x3b, 0x37, 0x6708, 0x3b, 0x38, 0x6708, 0x3b, 0x39,
+0x6708, 0x3b, 0x31, 0x30, 0x6708, 0x3b, 0x31, 0x31, 0x6708, 0x3b, 0x31, 0x32,
+0x6708, 0x4e00, 0x6708, 0x3b, 0x4e8c, 0x6708, 0x3b, 0x4e09, 0x6708, 0x3b, 0x56db, 0x6708,
+0x3b, 0x4e94, 0x6708, 0x3b, 0x516d, 0x6708, 0x3b, 0x4e03, 0x6708, 0x3b, 0x516b, 0x6708,
+0x3b, 0x4e5d, 0x6708, 0x3b, 0x5341, 0x6708, 0x3b, 0x5341, 0x4e00, 0x6708, 0x3b, 0x5341,
+0x4e8c, 0x6708, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x3b, 0x66, 0x65, 0x62, 0x72,
+0x65, 0x72, 0x3b, 0x6d, 0x61, 0x72, 0xe7, 0x3b, 0x61, 0x62, 0x72, 0x69,
+0x6c, 0x3b, 0x6d, 0x61, 0x69, 0x67, 0x3b, 0x6a, 0x75, 0x6e, 0x79, 0x3b,
+0x6a, 0x75, 0x6c, 0x69, 0x6f, 0x6c, 0x3b, 0x61, 0x67, 0x6f, 0x73, 0x74,
+0x3b, 0x73, 0x65, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x6f, 0x63,
+0x74, 0x75, 0x62, 0x72, 0x65, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62,
+0x72, 0x65, 0x3b, 0x64, 0x65, 0x73, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x64,
+0x65, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x20, 0x66,
+0x65, 0x62, 0x72, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x20, 0x6d, 0x61, 0x72,
+0xe7, 0x3b, 0x64, 0x2019, 0x61, 0x62, 0x72, 0x69, 0x6c, 0x3b, 0x64, 0x65,
+0x20, 0x6d, 0x61, 0x69, 0x67, 0x3b, 0x64, 0x65, 0x20, 0x6a, 0x75, 0x6e,
+0x79, 0x3b, 0x64, 0x65, 0x20, 0x6a, 0x75, 0x6c, 0x69, 0x6f, 0x6c, 0x3b,
+0x64, 0x2019, 0x61, 0x67, 0x6f, 0x73, 0x74, 0x3b, 0x64, 0x65, 0x20, 0x73,
+0x65, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x64, 0x2019, 0x6f, 0x63,
+0x74, 0x75, 0x62, 0x72, 0x65, 0x3b, 0x64, 0x65, 0x20, 0x6e, 0x6f, 0x76,
+0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x64, 0x65, 0x20, 0x64, 0x65, 0x73,
+0x65, 0x6d, 0x62, 0x72, 0x65, 0x67, 0x65, 0x6e, 0x2e, 0x3b, 0x66, 0x65,
+0x62, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0xe7, 0x3b, 0x61, 0x62, 0x72,
+0x2e, 0x3b, 0x6d, 0x61, 0x69, 0x67, 0x3b, 0x6a, 0x75, 0x6e, 0x79, 0x3b,
+0x6a, 0x75, 0x6c, 0x2e, 0x3b, 0x61, 0x67, 0x2e, 0x3b, 0x73, 0x65, 0x74,
+0x2e, 0x3b, 0x6f, 0x63, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b,
+0x64, 0x65, 0x73, 0x2e, 0x64, 0x65, 0x20, 0x67, 0x65, 0x6e, 0x2e, 0x3b,
+0x64, 0x65, 0x20, 0x66, 0x65, 0x62, 0x72, 0x2e, 0x3b, 0x64, 0x65, 0x20,
+0x6d, 0x61, 0x72, 0xe7, 0x3b, 0x64, 0x2019, 0x61, 0x62, 0x72, 0x2e, 0x3b,
+0x64, 0x65, 0x20, 0x6d, 0x61, 0x69, 0x67, 0x3b, 0x64, 0x65, 0x20, 0x6a,
+0x75, 0x6e, 0x79, 0x3b, 0x64, 0x65, 0x20, 0x6a, 0x75, 0x6c, 0x2e, 0x3b,
+0x64, 0x2019, 0x61, 0x67, 0x2e, 0x3b, 0x64, 0x65, 0x20, 0x73, 0x65, 0x74,
+0x2e, 0x3b, 0x64, 0x2019, 0x6f, 0x63, 0x74, 0x2e, 0x3b, 0x64, 0x65, 0x20,
+0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0x65, 0x20, 0x64, 0x65, 0x73, 0x2e,
+0x47, 0x4e, 0x3b, 0x46, 0x42, 0x3b, 0x4d, 0xc7, 0x3b, 0x41, 0x42, 0x3b,
+0x4d, 0x47, 0x3b, 0x4a, 0x4e, 0x3b, 0x4a, 0x4c, 0x3b, 0x41, 0x47, 0x3b,
+0x53, 0x54, 0x3b, 0x4f, 0x43, 0x3b, 0x4e, 0x56, 0x3b, 0x44, 0x53, 0x45,
+0x6e, 0x65, 0x72, 0x6f, 0x3b, 0x50, 0x65, 0x62, 0x72, 0x65, 0x72, 0x6f,
+0x3b, 0x4d, 0x61, 0x72, 0x73, 0x6f, 0x3b, 0x41, 0x62, 0x72, 0x69, 0x6c,
+0x3b, 0x4d, 0x61, 0x79, 0x6f, 0x3b, 0x48, 0x75, 0x6e, 0x79, 0x6f, 0x3b,
+0x48, 0x75, 0x6c, 0x79, 0x6f, 0x3b, 0x41, 0x67, 0x6f, 0x73, 0x74, 0x6f,
+0x3b, 0x53, 0x65, 0x70, 0x74, 0x69, 0x79, 0x65, 0x6d, 0x62, 0x72, 0x65,
+0x3b, 0x4f, 0x6b, 0x74, 0x75, 0x62, 0x72, 0x65, 0x3b, 0x4e, 0x6f, 0x62,
+0x79, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x44, 0x69, 0x73, 0x79, 0x65,
+0x6d, 0x62, 0x72, 0x65, 0x45, 0x6e, 0x65, 0x3b, 0x50, 0x65, 0x62, 0x3b,
+0x4d, 0x61, 0x72, 0x3b, 0x41, 0x62, 0x72, 0x3b, 0x4d, 0x61, 0x79, 0x3b,
+0x48, 0x75, 0x6e, 0x3b, 0x48, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x6f, 0x3b,
+0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x62, 0x3b,
+0x44, 0x69, 0x73, 0x45, 0x3b, 0x50, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d,
+0x3b, 0x48, 0x3b, 0x48, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e,
+0x3b, 0x44, 0x59, 0x65, 0x6e, 0x6e, 0x61, 0x79, 0x65, 0x72, 0x3b, 0x59,
+0x65, 0x62, 0x72, 0x61, 0x79, 0x65, 0x72, 0x3b, 0x4d, 0x61, 0x72, 0x73,
+0x3b, 0x49, 0x62, 0x72, 0x69, 0x72, 0x3b, 0x4d, 0x61, 0x79, 0x79, 0x75,
+0x3b, 0x59, 0x75, 0x6e, 0x79, 0x75, 0x3b, 0x59, 0x75, 0x6c, 0x79, 0x75,
+0x7a, 0x3b, 0x194, 0x75, 0x63, 0x74, 0x3b, 0x43, 0x75, 0x74, 0x61, 0x6e,
+0x62, 0x69, 0x72, 0x3b, 0x4b, 0x1e6d, 0x75, 0x62, 0x65, 0x72, 0x3b, 0x4e,
+0x77, 0x61, 0x6e, 0x62, 0x69, 0x72, 0x3b, 0x44, 0x75, 0x6a, 0x61, 0x6e,
+0x62, 0x69, 0x72, 0x59, 0x65, 0x6e, 0x3b, 0x59, 0x65, 0x62, 0x3b, 0x4d,
+0x61, 0x72, 0x3b, 0x49, 0x62, 0x72, 0x3b, 0x4d, 0x61, 0x79, 0x3b, 0x59,
+0x75, 0x6e, 0x3b, 0x59, 0x75, 0x6c, 0x3b, 0x194, 0x75, 0x63, 0x3b, 0x43,
+0x75, 0x74, 0x3b, 0x4b, 0x1e6d, 0x75, 0x3b, 0x4e, 0x77, 0x61, 0x3b, 0x44,
+0x75, 0x6a, 0x59, 0x3b, 0x59, 0x3b, 0x4d, 0x3b, 0x49, 0x3b, 0x4d, 0x3b,
+0x59, 0x3b, 0x59, 0x3b, 0x194, 0x3b, 0x43, 0x3b, 0x4b, 0x3b, 0x4e, 0x3b,
+0x44, 0x6a9, 0x627, 0x646, 0x648, 0x648, 0x646, 0x6cc, 0x20, 0x62f, 0x648, 0x648,
+0x6d5, 0x645, 0x3b, 0x634, 0x648, 0x628, 0x627, 0x62a, 0x3b, 0x626, 0x627, 0x632,
+0x627, 0x631, 0x3b, 0x646, 0x6cc, 0x633, 0x627, 0x646, 0x3b, 0x626, 0x627, 0x6cc,
+0x627, 0x631, 0x3b, 0x62d, 0x648, 0x632, 0x6d5, 0x6cc, 0x631, 0x627, 0x646, 0x3b,
+0x62a, 0x6d5, 0x645, 0x648, 0x648, 0x632, 0x3b, 0x626, 0x627, 0x628, 0x3b, 0x626,
+0x6d5, 0x6cc, 0x644, 0x648, 0x648, 0x644, 0x3b, 0x62a, 0x634, 0x631, 0x6cc, 0x646,
+0x6cc, 0x20, 0x6cc, 0x6d5, 0x6a9, 0x6d5, 0x645, 0x3b, 0x62a, 0x634, 0x631, 0x6cc,
+0x646, 0x6cc, 0x20, 0x62f, 0x648, 0x648, 0x6d5, 0x645, 0x3b, 0x6a9, 0x627, 0x646,
+0x648, 0x646, 0x6cc, 0x20, 0x6cc, 0x6d5, 0x6a9, 0x6d5, 0x645, 0x6a9, 0x3b, 0x634,
+0x3b, 0x626, 0x3b, 0x646, 0x3b, 0x626, 0x3b, 0x62d, 0x3b, 0x62a, 0x3b, 0x626,
+0x3b, 0x626, 0x3b, 0x62a, 0x3b, 0x62a, 0x3b, 0x6a9, 0xd804, 0xdd0e, 0xd804, 0xdd1a,
+0xd804, 0xdd2a, 0xd804, 0xdd20, 0xd804, 0xdd22, 0xd804, 0xdd28, 0x3b, 0xd804, 0xdd1c, 0xd804,
+0xdd2c, 0xd804, 0xdd1b, 0xd804, 0xdd34, 0xd804, 0xdd1d, 0xd804, 0xdd33, 0xd804, 0xdd22, 0xd804,
+0xdd2a, 0xd804, 0xdd20, 0xd804, 0xdd22, 0xd804, 0xdd28, 0x3b, 0xd804, 0xdd1f, 0xd804, 0xdd22,
+0xd804, 0xdd34, 0xd804, 0xdd0c, 0xd804, 0xdd27, 0x3b, 0xd804, 0xdd03, 0xd804, 0xdd2c, 0xd804,
+0xdd1b, 0xd804, 0xdd33, 0xd804, 0xdd22, 0xd804, 0xdd28, 0xd804, 0xdd23, 0xd804, 0xdd34, 0x3b,
+0xd804, 0xdd1f, 0xd804, 0xdd2c, 0x3b, 0xd804, 0xdd0e, 0xd804, 0xdd2a, 0xd804, 0xdd1a, 0xd804,
+0xdd34, 0x3b, 0xd804, 0xdd0e, 0xd804, 0xdd2a, 0xd804, 0xdd23, 0xd804, 0xdd2d, 0x3b, 0xd804,
+0xdd03, 0xd804, 0xdd09, 0xd804, 0xdd27, 0xd804, 0xdd0c, 0xd804, 0xdd34, 0xd804, 0xdd11, 0xd804,
+0xdd34, 0x3b, 0xd804, 0xdd25, 0xd804, 0xdd2c, 0xd804, 0xdd1b, 0xd804, 0xdd34, 0xd804, 0xdd11,
+0xd804, 0xdd2c, 0xd804, 0xdd1f, 0xd804, 0xdd34, 0xd804, 0xdd1d, 0xd804, 0xdd27, 0xd804, 0xdd22,
+0xd804, 0xdd34, 0x3b, 0xd804, 0xdd03, 0xd804, 0xdd27, 0xd804, 0xdd07, 0xd804, 0xdd34, 0xd804,
+0xdd11, 0xd804, 0xdd2e, 0xd804, 0xdd1d, 0xd804, 0xdd27, 0xd804, 0xdd22, 0xd804, 0xdd34, 0x3b,
+0xd804, 0xdd1a, 0xd804, 0xdd27, 0xd804, 0xdd1e, 0xd804, 0xdd2c, 0xd804, 0xdd1f, 0xd804, 0xdd34,
+0xd804, 0xdd1d, 0xd804, 0xdd27, 0xd804, 0xdd22, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd13, 0xd804,
+0xdd28, 0xd804, 0xdd25, 0xd804, 0xdd2c, 0xd804, 0xdd1f, 0xd804, 0xdd34, 0xd804, 0xdd1d, 0xd804,
+0xdd27, 0xd804, 0xdd22, 0xd804, 0xdd34, 0xd804, 0xdd0e, 0xd804, 0xdd1a, 0xd804, 0xdd2a, 0xd804,
+0xdd20, 0xd804, 0xdd22, 0xd804, 0xdd28, 0x3b, 0xd804, 0xdd1c, 0xd804, 0xdd2c, 0xd804, 0xdd1b,
+0xd804, 0xdd34, 0xd804, 0xdd1d, 0xd804, 0xdd33, 0xd804, 0xdd22, 0xd804, 0xdd2a, 0xd804, 0xdd20,
+0xd804, 0xdd22, 0xd804, 0xdd28, 0x3b, 0xd804, 0xdd1f, 0xd804, 0xdd22, 0xd804, 0xdd34, 0xd804,
+0xdd0c, 0xd804, 0xdd27, 0x3b, 0xd804, 0xdd03, 0xd804, 0xdd2c, 0xd804, 0xdd1b, 0xd804, 0xdd33,
+0xd804, 0xdd22, 0xd804, 0xdd28, 0xd804, 0xdd23, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd1f, 0xd804,
+0xdd2c, 0x3b, 0xd804, 0xdd0e, 0xd804, 0xdd2a, 0xd804, 0xdd1a, 0xd804, 0xdd34, 0x3b, 0xd804,
+0xdd0e, 0xd804, 0xdd2a, 0xd804, 0xdd23, 0xd804, 0xdd2d, 0x3b, 0xd804, 0xdd03, 0xd804, 0xdd09,
+0xd804, 0xdd27, 0xd804, 0xdd0c, 0xd804, 0xdd34, 0xd804, 0xdd11, 0xd804, 0xdd34, 0x3b, 0xd804,
+0xdd25, 0xd804, 0xdd2c, 0xd804, 0xdd1b, 0xd804, 0xdd34, 0xd804, 0xdd11, 0xd804, 0xdd2c, 0xd804,
+0xdd1f, 0xd804, 0xdd34, 0xd804, 0xdd1d, 0xd804, 0xdd27, 0xd804, 0xdd22, 0xd804, 0xdd34, 0x3b,
+0xd804, 0xdd03, 0xd804, 0xdd27, 0xd804, 0xdd07, 0xd804, 0xdd34, 0xd804, 0xdd11, 0xd804, 0xdd2c,
+0xd804, 0xdd1d, 0xd804, 0xdd27, 0xd804, 0xdd22, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd1a, 0xd804,
+0xdd27, 0xd804, 0xdd1e, 0xd804, 0xdd2c, 0xd804, 0xdd1f, 0xd804, 0xdd34, 0xd804, 0xdd1d, 0xd804,
+0xdd27, 0xd804, 0xdd22, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd13, 0xd804, 0xdd28, 0xd804, 0xdd25,
+0xd804, 0xdd2c, 0xd804, 0xdd1f, 0xd804, 0xdd34, 0xd804, 0xdd1d, 0xd804, 0xdd27, 0xd804, 0xdd22,
+0xd804, 0xdd34, 0xd804, 0xdd0e, 0xd804, 0xdd1a, 0xd804, 0xdd2a, 0x3b, 0xd804, 0xdd1c, 0xd804,
+0xdd2c, 0xd804, 0xdd1b, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd1f, 0xd804, 0xdd22, 0xd804, 0xdd34,
+0xd804, 0xdd0c, 0xd804, 0xdd27, 0x3b, 0xd804, 0xdd03, 0xd804, 0xdd2c, 0xd804, 0xdd1b, 0xd804,
+0xdd33, 0xd804, 0xdd22, 0xd804, 0xdd28, 0xd804, 0xdd23, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd1f,
+0xd804, 0xdd2c, 0x3b, 0xd804, 0xdd0e, 0xd804, 0xdd2a, 0xd804, 0xdd1a, 0xd804, 0xdd34, 0x3b,
+0xd804, 0xdd0e, 0xd804, 0xdd2a, 0xd804, 0xdd23, 0xd804, 0xdd2d, 0x3b, 0xd804, 0xdd03, 0xd804,
+0xdd09, 0xd804, 0xdd27, 0xd804, 0xdd0c, 0xd804, 0xdd34, 0xd804, 0xdd11, 0xd804, 0xdd34, 0x3b,
+0xd804, 0xdd25, 0xd804, 0xdd2c, 0xd804, 0xdd1b, 0xd804, 0xdd34, 0xd804, 0xdd11, 0xd804, 0xdd2c,
+0xd804, 0xdd1f, 0xd804, 0xdd34, 0xd804, 0xdd1d, 0xd804, 0xdd27, 0xd804, 0xdd22, 0xd804, 0xdd34,
+0x3b, 0xd804, 0xdd03, 0xd804, 0xdd27, 0xd804, 0xdd07, 0xd804, 0xdd34, 0xd804, 0xdd11, 0xd804,
+0xdd2e, 0xd804, 0xdd1d, 0xd804, 0xdd27, 0xd804, 0xdd22, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd1a,
+0xd804, 0xdd27, 0xd804, 0xdd1e, 0xd804, 0xdd2c, 0xd804, 0xdd1f, 0xd804, 0xdd34, 0xd804, 0xdd1d,
+0xd804, 0xdd27, 0xd804, 0xdd22, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd13, 0xd804, 0xdd28, 0xd804,
+0xdd25, 0xd804, 0xdd2c, 0xd804, 0xdd1f, 0xd804, 0xdd34, 0xd804, 0xdd1d, 0xd804, 0xdd22, 0xd804,
+0xdd34, 0xd804, 0xdd0e, 0x3b, 0xd804, 0xdd1c, 0xd804, 0xdd2c, 0x3b, 0xd804, 0xdd1f, 0x3b,
+0xd804, 0xdd03, 0xd804, 0xdd2c, 0x3b, 0xd804, 0xdd1f, 0xd804, 0xdd2c, 0x3b, 0xd804, 0xdd0e,
+0xd804, 0xdd2a, 0xd804, 0xdd1a, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd0e, 0xd804, 0xdd2a, 0x3b,
+0xd804, 0xdd03, 0x3b, 0xd804, 0xdd25, 0xd804, 0xdd2c, 0x3b, 0xd804, 0xdd03, 0xd804, 0xdd27,
+0x3b, 0xd804, 0xdd1a, 0xd804, 0xdd27, 0x3b, 0xd804, 0xdd13, 0xd804, 0xdd28, 0x44f, 0x43d,
+0x432, 0x430, 0x440, 0x44c, 0x3b, 0x444, 0x435, 0x432, 0x440, 0x430, 0x43b, 0x44c,
+0x3b, 0x43c, 0x430, 0x440, 0x442, 0x3b, 0x430, 0x43f, 0x440, 0x435, 0x43b, 0x44c,
+0x3b, 0x43c, 0x430, 0x439, 0x3b, 0x438, 0x44e, 0x43d, 0x44c, 0x3b, 0x438, 0x44e,
+0x43b, 0x44c, 0x3b, 0x430, 0x432, 0x433, 0x443, 0x441, 0x442, 0x3b, 0x441, 0x435,
+0x43d, 0x442, 0x44f, 0x431, 0x440, 0x44c, 0x3b, 0x43e, 0x43a, 0x442, 0x44f, 0x431,
+0x440, 0x44c, 0x3b, 0x43d, 0x43e, 0x44f, 0x431, 0x440, 0x44c, 0x3b, 0x434, 0x435,
+0x43a, 0x430, 0x431, 0x440, 0x44c, 0x44f, 0x43d, 0x432, 0x3b, 0x444, 0x435, 0x432,
+0x3b, 0x43c, 0x430, 0x440, 0x3b, 0x430, 0x43f, 0x440, 0x3b, 0x43c, 0x430, 0x439,
+0x3b, 0x438, 0x44e, 0x43d, 0x3b, 0x438, 0x44e, 0x43b, 0x3b, 0x430, 0x432, 0x433,
+0x3b, 0x441, 0x435, 0x43d, 0x3b, 0x43e, 0x43a, 0x442, 0x3b, 0x43d, 0x43e, 0x44f,
+0x3b, 0x434, 0x435, 0x43a, 0x42f, 0x3b, 0x424, 0x3b, 0x41c, 0x3b, 0x410, 0x3b,
+0x41c, 0x3b, 0x418, 0x3b, 0x418, 0x3b, 0x410, 0x3b, 0x421, 0x3b, 0x41e, 0x3b,
+0x41d, 0x3b, 0x414, 0x13a4, 0x13c3, 0x13b8, 0x13d4, 0x13c5, 0x3b, 0x13a7, 0x13a6, 0x13b5,
+0x3b, 0x13a0, 0x13c5, 0x13f1, 0x3b, 0x13a7, 0x13ec, 0x13c2, 0x3b, 0x13a0, 0x13c2, 0x13cd,
+0x13ac, 0x13d8, 0x3b, 0x13d5, 0x13ad, 0x13b7, 0x13f1, 0x3b, 0x13ab, 0x13f0, 0x13c9, 0x13c2,
+0x3b, 0x13a6, 0x13b6, 0x13c2, 0x3b, 0x13da, 0x13b5, 0x13cd, 0x13d7, 0x3b, 0x13da, 0x13c2,
+0x13c5, 0x13d7, 0x3b, 0x13c5, 0x13d3, 0x13d5, 0x13c6, 0x3b, 0x13a5, 0x13cd, 0x13a9, 0x13f1,
+0x13a4, 0x13c3, 0x3b, 0x13a7, 0x13a6, 0x3b, 0x13a0, 0x13c5, 0x3b, 0x13a7, 0x13ec, 0x3b,
+0x13a0, 0x13c2, 0x3b, 0x13d5, 0x13ad, 0x3b, 0x13ab, 0x13f0, 0x3b, 0x13a6, 0x13b6, 0x3b,
+0x13da, 0x13b5, 0x3b, 0x13da, 0x13c2, 0x3b, 0x13c5, 0x13d3, 0x3b, 0x13a5, 0x13cd, 0x13a4,
+0x3b, 0x13a7, 0x3b, 0x13a0, 0x3b, 0x13a7, 0x3b, 0x13a0, 0x3b, 0x13d5, 0x3b, 0x13ab,
+0x3b, 0x13a6, 0x3b, 0x13da, 0x3b, 0x13da, 0x3b, 0x13c5, 0x3b, 0x13a5, 0x48, 0x61,
+0x73, 0x68, 0x69, 0x2bc, 0x20, 0x41, 0x6d, 0x6d, 0x6f, 0x2bc, 0x6e, 0x61,
+0x2bc, 0x3b, 0x48, 0x61, 0x73, 0x68, 0x69, 0x2bc, 0x20, 0x41, 0x74, 0x6f,
+0x6b, 0x6c, 0x6f, 0x2bc, 0x3b, 0x48, 0x61, 0x73, 0x68, 0x69, 0x2bc, 0x20,
+0x41, 0x74, 0x6f, 0x63, 0x68, 0x63, 0x68, 0xed, 0x2bc, 0x6e, 0x61, 0x2bc,
+0x3b, 0x49, 0x69, 0x70, 0x6c, 0x61, 0x6c, 0x3b, 0x4d, 0x69, 0x68, 0x3b,
+0x43, 0x68, 0x6f, 0x6f, 0x6e, 0x3b, 0x43, 0x68, 0x6f, 0x6f, 0x6c, 0x61,
+0x3b, 0x41, 0x6b, 0x61, 0x61, 0x73, 0x3b, 0x53, 0x69, 0x70, 0x74, 0x69,
+0x6d, 0x70, 0x61, 0x2bc, 0x3b, 0x41, 0x61, 0x6b, 0x74, 0x6f, 0x70, 0x61,
+0x2bc, 0x3b, 0x4e, 0x6f, 0x66, 0x69, 0x6d, 0x70, 0x61, 0x2bc, 0x3b, 0x54,
+0x69, 0x69, 0x73, 0x69, 0x6d, 0x70, 0x61, 0x2bc, 0x4f, 0x6b, 0x77, 0x6f,
+0x6b, 0x75, 0x62, 0x61, 0x6e, 0x7a, 0x61, 0x3b, 0x4f, 0x6b, 0x77, 0x61,
+0x6b, 0x61, 0x62, 0x69, 0x72, 0x69, 0x3b, 0x4f, 0x6b, 0x77, 0x61, 0x6b,
+0x61, 0x73, 0x68, 0x61, 0x74, 0x75, 0x3b, 0x4f, 0x6b, 0x77, 0x61, 0x6b,
+0x61, 0x6e, 0x61, 0x3b, 0x4f, 0x6b, 0x77, 0x61, 0x6b, 0x61, 0x74, 0x61,
+0x61, 0x6e, 0x61, 0x3b, 0x4f, 0x6b, 0x77, 0x61, 0x6d, 0x75, 0x6b, 0x61,
+0x61, 0x67, 0x61, 0x3b, 0x4f, 0x6b, 0x77, 0x61, 0x6d, 0x75, 0x73, 0x68,
+0x61, 0x6e, 0x6a, 0x75, 0x3b, 0x4f, 0x6b, 0x77, 0x61, 0x6d, 0x75, 0x6e,
+0x61, 0x61, 0x6e, 0x61, 0x3b, 0x4f, 0x6b, 0x77, 0x61, 0x6d, 0x77, 0x65,
+0x6e, 0x64, 0x61, 0x3b, 0x4f, 0x6b, 0x77, 0x61, 0x69, 0x6b, 0x75, 0x6d,
+0x69, 0x3b, 0x4f, 0x6b, 0x77, 0x61, 0x69, 0x6b, 0x75, 0x6d, 0x69, 0x20,
+0x6e, 0x61, 0x20, 0x6b, 0x75, 0x6d, 0x77, 0x65, 0x3b, 0x4f, 0x6b, 0x77,
+0x61, 0x69, 0x6b, 0x75, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x69, 0x62,
+0x69, 0x72, 0x69, 0x4b, 0x42, 0x5a, 0x3b, 0x4b, 0x42, 0x52, 0x3b, 0x4b,
+0x53, 0x54, 0x3b, 0x4b, 0x4b, 0x4e, 0x3b, 0x4b, 0x54, 0x4e, 0x3b, 0x4b,
+0x4d, 0x4b, 0x3b, 0x4b, 0x4d, 0x53, 0x3b, 0x4b, 0x4d, 0x4e, 0x3b, 0x4b,
+0x4d, 0x57, 0x3b, 0x4b, 0x4b, 0x4d, 0x3b, 0x4b, 0x4e, 0x4b, 0x3b, 0x4b,
+0x4e, 0x42, 0x456, 0x486, 0x430, 0x43d, 0x43d, 0xa64b, 0x430, 0x301, 0x440, 0x457,
+0x439, 0x3b, 0x444, 0x435, 0x432, 0x440, 0xa64b, 0x430, 0x301, 0x440, 0x457, 0x439,
+0x3b, 0x43c, 0x430, 0x301, 0x440, 0x442, 0x44a, 0x3b, 0x430, 0x486, 0x43f, 0x440,
+0x456, 0x301, 0x43b, 0x43b, 0x457, 0x439, 0x3b, 0x43c, 0x430, 0x301, 0x457, 0x439,
+0x3b, 0x456, 0x486, 0xa64b, 0x301, 0x43d, 0x457, 0x439, 0x3b, 0x456, 0x486, 0xa64b,
+0x301, 0x43b, 0x457, 0x439, 0x3b, 0x430, 0x486, 0x301, 0x475, 0x433, 0xa64b, 0x441,
+0x442, 0x44a, 0x3b, 0x441, 0x435, 0x43f, 0x442, 0x435, 0x301, 0x43c, 0x432, 0x440,
+0x457, 0x439, 0x3b, 0x47b, 0x486, 0x43a, 0x442, 0x461, 0x301, 0x432, 0x440, 0x457,
+0x439, 0x3b, 0x43d, 0x43e, 0x435, 0x301, 0x43c, 0x432, 0x440, 0x457, 0x439, 0x3b,
+0x434, 0x435, 0x43a, 0x435, 0x301, 0x43c, 0x432, 0x440, 0x457, 0x439, 0x456, 0x486,
+0x430, 0x43d, 0x43d, 0xa64b, 0x430, 0x301, 0x440, 0x457, 0x430, 0x3b, 0x444, 0x435,
+0x432, 0x440, 0xa64b, 0x430, 0x301, 0x440, 0x457, 0x430, 0x3b, 0x43c, 0x430, 0x301,
+0x440, 0x442, 0x430, 0x3b, 0x430, 0x486, 0x43f, 0x440, 0x456, 0x301, 0x43b, 0x43b,
+0x457, 0x430, 0x3b, 0x43c, 0x430, 0x301, 0x457, 0x430, 0x3b, 0x456, 0x486, 0xa64b,
+0x301, 0x43d, 0x457, 0x430, 0x3b, 0x456, 0x486, 0xa64b, 0x301, 0x43b, 0x457, 0x430,
+0x3b, 0x430, 0x486, 0x301, 0x475, 0x433, 0xa64b, 0x441, 0x442, 0x430, 0x3b, 0x441,
+0x435, 0x43f, 0x442, 0x435, 0x301, 0x43c, 0x432, 0x440, 0x457, 0x430, 0x3b, 0x47b,
+0x486, 0x43a, 0x442, 0x461, 0x301, 0x432, 0x440, 0x457, 0x430, 0x3b, 0x43d, 0x43e,
+0x435, 0x301, 0x43c, 0x432, 0x440, 0x457, 0x430, 0x3b, 0x434, 0x435, 0x43a, 0x435,
+0x301, 0x43c, 0x432, 0x440, 0x457, 0x430, 0x456, 0x486, 0x430, 0x2de9, 0x487, 0x3b,
+0x444, 0x435, 0x2de1, 0x487, 0x3b, 0x43c, 0x430, 0x2dec, 0x487, 0x3b, 0x430, 0x486,
+0x43f, 0x2dec, 0x487, 0x3b, 0x43c, 0x430, 0xa675, 0x3b, 0x456, 0x486, 0xa64b, 0x2de9,
+0x487, 0x3b, 0x456, 0x486, 0xa64b, 0x2de7, 0x487, 0x3b, 0x430, 0x486, 0x301, 0x475,
+0x2de2, 0x487, 0x3b, 0x441, 0x435, 0x2deb, 0x487, 0x3b, 0x47b, 0x486, 0x43a, 0x2dee,
+0x3b, 0x43d, 0x43e, 0x435, 0x2de8, 0x3b, 0x434, 0x435, 0x2de6, 0x487, 0x406, 0x486,
+0x3b, 0x424, 0x3b, 0x41c, 0x3b, 0x410, 0x486, 0x3b, 0x41c, 0x3b, 0x406, 0x486,
+0x3b, 0x406, 0x486, 0x3b, 0x410, 0x486, 0x3b, 0x421, 0x3b, 0x47a, 0x486, 0x3b,
+0x41d, 0x3b, 0x414, 0x43a, 0x4d1, 0x440, 0x43b, 0x430, 0x447, 0x3b, 0x43d, 0x430,
+0x440, 0x4d1, 0x441, 0x3b, 0x43f, 0x443, 0x448, 0x3b, 0x430, 0x43a, 0x430, 0x3b,
+0x4ab, 0x443, 0x3b, 0x4ab, 0x4d7, 0x440, 0x442, 0x43c, 0x435, 0x3b, 0x443, 0x442,
+0x4d1, 0x3b, 0x4ab, 0x443, 0x440, 0x43b, 0x430, 0x3b, 0x430, 0x432, 0x4d1, 0x43d,
+0x3b, 0x44e, 0x43f, 0x430, 0x3b, 0x447, 0x4f3, 0x43a, 0x3b, 0x440, 0x430, 0x448,
+0x442, 0x430, 0x432, 0x43a, 0x4d1, 0x440, 0x2e, 0x3b, 0x43d, 0x430, 0x440, 0x2e,
+0x3b, 0x43f, 0x443, 0x448, 0x3b, 0x430, 0x43a, 0x430, 0x3b, 0x4ab, 0x443, 0x3b,
+0x4ab, 0x4d7, 0x440, 0x2e, 0x3b, 0x443, 0x442, 0x4d1, 0x3b, 0x4ab, 0x443, 0x440,
+0x2e, 0x3b, 0x430, 0x432, 0x4d1, 0x43d, 0x3b, 0x44e, 0x43f, 0x430, 0x3b, 0x447,
+0x4f3, 0x43a, 0x3b, 0x440, 0x430, 0x448, 0x2e, 0x41a, 0x3b, 0x41d, 0x3b, 0x41f,
+0x3b, 0x410, 0x3b, 0x4aa, 0x3b, 0x4aa, 0x3b, 0x423, 0x3b, 0x4aa, 0x3b, 0x410,
+0x3b, 0x42e, 0x3b, 0x427, 0x3b, 0x420, 0x4a, 0x61, 0x6e, 0x6e, 0x65, 0x77,
+0x61, 0x3b, 0x46, 0xe4, 0x62, 0x72, 0x6f, 0x77, 0x61, 0x3b, 0x4d, 0xe4,
+0xe4, 0x7a, 0x3b, 0x41, 0x70, 0x72, 0x65, 0x6c, 0x6c, 0x3b, 0x4d, 0x61,
+0x69, 0x3b, 0x4a, 0x75, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x75, 0x6c,
+0x69, 0x3b, 0x4f, 0x75, 0x6a, 0x6f, 0xdf, 0x3b, 0x53, 0x65, 0x70, 0x74,
+0xe4, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x68, 0x62,
+0x65, 0x72, 0x3b, 0x4e, 0x6f, 0x76, 0xe4, 0x6d, 0x62, 0x65, 0x72, 0x3b,
+0x44, 0x65, 0x7a, 0xe4, 0x6d, 0x62, 0x65, 0x72, 0x4a, 0x61, 0x6e, 0x2e,
+0x3b, 0x46, 0xe4, 0x62, 0x2e, 0x3b, 0x4d, 0xe4, 0x7a, 0x2e, 0x3b, 0x41,
+0x70, 0x72, 0x2e, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x2e,
+0x3b, 0x4a, 0x75, 0x6c, 0x2e, 0x3b, 0x4f, 0x75, 0x6a, 0x2e, 0x3b, 0x53,
+0xe4, 0x70, 0x2e, 0x3b, 0x4f, 0x6b, 0x74, 0x2e, 0x3b, 0x4e, 0x6f, 0x76,
+0x2e, 0x3b, 0x44, 0x65, 0x7a, 0x2e, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0xe4,
+0x62, 0x3b, 0x4d, 0xe4, 0x7a, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x61,
+0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x4f, 0x75,
+0x6a, 0x3b, 0x53, 0xe4, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f,
+0x76, 0x3b, 0x44, 0x65, 0x7a, 0x4a, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41,
+0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0x4f, 0x3b, 0x53, 0x3b, 0x4f,
+0x3b, 0x4e, 0x3b, 0x44, 0x6d, 0x69, 0x73, 0x20, 0x47, 0x65, 0x6e, 0x76,
+0x65, 0x72, 0x3b, 0x6d, 0x69, 0x73, 0x20, 0x48, 0x77, 0x65, 0x76, 0x72,
+0x65, 0x72, 0x3b, 0x6d, 0x69, 0x73, 0x20, 0x4d, 0x65, 0x75, 0x72, 0x74,
+0x68, 0x3b, 0x6d, 0x69, 0x73, 0x20, 0x45, 0x62, 0x72, 0x65, 0x6c, 0x3b,
+0x6d, 0x69, 0x73, 0x20, 0x4d, 0x65, 0x3b, 0x6d, 0x69, 0x73, 0x20, 0x4d,
+0x65, 0x74, 0x68, 0x65, 0x76, 0x65, 0x6e, 0x3b, 0x6d, 0x69, 0x73, 0x20,
+0x47, 0x6f, 0x72, 0x74, 0x68, 0x65, 0x72, 0x65, 0x6e, 0x3b, 0x6d, 0x69,
+0x73, 0x20, 0x45, 0x73, 0x74, 0x3b, 0x6d, 0x69, 0x73, 0x20, 0x47, 0x77,
+0x79, 0x6e, 0x6e, 0x67, 0x61, 0x6c, 0x61, 0x3b, 0x6d, 0x69, 0x73, 0x20,
+0x48, 0x65, 0x64, 0x72, 0x61, 0x3b, 0x6d, 0x69, 0x73, 0x20, 0x44, 0x75,
+0x3b, 0x6d, 0x69, 0x73, 0x20, 0x4b, 0x65, 0x76, 0x61, 0x72, 0x64, 0x68,
+0x75, 0x47, 0x65, 0x6e, 0x3b, 0x48, 0x77, 0x65, 0x3b, 0x4d, 0x65, 0x75,
+0x3b, 0x45, 0x62, 0x72, 0x3b, 0x4d, 0x65, 0x3b, 0x4d, 0x65, 0x74, 0x3b,
+0x47, 0x6f, 0x72, 0x3b, 0x45, 0x73, 0x74, 0x3b, 0x47, 0x77, 0x6e, 0x3b,
+0x48, 0x65, 0x64, 0x3b, 0x44, 0x75, 0x3b, 0x4b, 0x65, 0x76, 0x67, 0x68,
+0x6a, 0x65, 0x6e, 0x6e, 0x61, 0x67, 0x68, 0x6a, 0x75, 0x3b, 0x66, 0x65,
+0x72, 0x72, 0x61, 0x67, 0x68, 0x6a, 0x75, 0x3b, 0x6d, 0x61, 0x72, 0x7a,
+0x75, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x6c, 0x65, 0x3b, 0x6d, 0x61, 0x67,
+0x68, 0x6a, 0x75, 0x3b, 0x67, 0x68, 0x6a, 0x75, 0x67, 0x6e, 0x75, 0x3b,
+0x6c, 0x75, 0x67, 0x6c, 0x69, 0x75, 0x3b, 0x61, 0x6f, 0x73, 0x74, 0x75,
+0x3b, 0x73, 0x69, 0x74, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x6f,
+0x74, 0x74, 0x6f, 0x62, 0x72, 0x65, 0x3b, 0x6e, 0x75, 0x76, 0x65, 0x6d,
+0x62, 0x72, 0x65, 0x3b, 0x64, 0x69, 0x63, 0x65, 0x6d, 0x62, 0x72, 0x65,
+0x64, 0x69, 0x20, 0x67, 0x68, 0x6a, 0x65, 0x6e, 0x6e, 0x61, 0x67, 0x68,
+0x6a, 0x75, 0x3b, 0x64, 0x69, 0x20, 0x66, 0x65, 0x72, 0x72, 0x61, 0x67,
+0x68, 0x6a, 0x75, 0x3b, 0x64, 0x69, 0x20, 0x6d, 0x61, 0x72, 0x7a, 0x75,
+0x3b, 0x64, 0x2019, 0x61, 0x70, 0x72, 0x69, 0x6c, 0x65, 0x3b, 0x64, 0x69,
+0x20, 0x6d, 0x61, 0x67, 0x68, 0x6a, 0x75, 0x3b, 0x64, 0x69, 0x20, 0x67,
+0x68, 0x6a, 0x75, 0x67, 0x6e, 0x75, 0x3b, 0x64, 0x69, 0x20, 0x6c, 0x75,
+0x67, 0x6c, 0x69, 0x75, 0x3b, 0x64, 0x2019, 0x61, 0x6f, 0x73, 0x74, 0x75,
+0x3b, 0x64, 0x69, 0x20, 0x73, 0x69, 0x74, 0x74, 0x65, 0x6d, 0x62, 0x72,
+0x65, 0x3b, 0x64, 0x2019, 0x6f, 0x74, 0x74, 0x6f, 0x62, 0x72, 0x65, 0x3b,
+0x64, 0x69, 0x20, 0x6e, 0x75, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b,
+0x64, 0x69, 0x20, 0x64, 0x69, 0x63, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x67,
+0x68, 0x6a, 0x2e, 0x3b, 0x66, 0x65, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x72,
+0x2e, 0x3b, 0x61, 0x70, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x67, 0x2e, 0x3b,
+0x67, 0x68, 0x6a, 0x75, 0x2e, 0x3b, 0x6c, 0x75, 0x67, 0x2e, 0x3b, 0x61,
+0x6f, 0x73, 0x2e, 0x3b, 0x73, 0x69, 0x74, 0x2e, 0x3b, 0x6f, 0x74, 0x74,
+0x2e, 0x3b, 0x6e, 0x75, 0x76, 0x2e, 0x3b, 0x64, 0x69, 0x63, 0x2e, 0x47,
+0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x47, 0x3b, 0x4c,
+0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x73, 0x69,
+0x6a, 0x65, 0x10d, 0x61, 0x6e, 0x6a, 0x3b, 0x76, 0x65, 0x6c, 0x6a, 0x61,
+0x10d, 0x61, 0x3b, 0x6f, 0x17e, 0x75, 0x6a, 0x61, 0x6b, 0x3b, 0x74, 0x72,
+0x61, 0x76, 0x61, 0x6e, 0x6a, 0x3b, 0x73, 0x76, 0x69, 0x62, 0x61, 0x6e,
+0x6a, 0x3b, 0x6c, 0x69, 0x70, 0x61, 0x6e, 0x6a, 0x3b, 0x73, 0x72, 0x70,
+0x61, 0x6e, 0x6a, 0x3b, 0x6b, 0x6f, 0x6c, 0x6f, 0x76, 0x6f, 0x7a, 0x3b,
+0x72, 0x75, 0x6a, 0x61, 0x6e, 0x3b, 0x6c, 0x69, 0x73, 0x74, 0x6f, 0x70,
+0x61, 0x64, 0x3b, 0x73, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x69, 0x3b, 0x70,
+0x72, 0x6f, 0x73, 0x69, 0x6e, 0x61, 0x63, 0x73, 0x69, 0x6a, 0x65, 0x10d,
+0x6e, 0x6a, 0x61, 0x3b, 0x76, 0x65, 0x6c, 0x6a, 0x61, 0x10d, 0x65, 0x3b,
+0x6f, 0x17e, 0x75, 0x6a, 0x6b, 0x61, 0x3b, 0x74, 0x72, 0x61, 0x76, 0x6e,
+0x6a, 0x61, 0x3b, 0x73, 0x76, 0x69, 0x62, 0x6e, 0x6a, 0x61, 0x3b, 0x6c,
+0x69, 0x70, 0x6e, 0x6a, 0x61, 0x3b, 0x73, 0x72, 0x70, 0x6e, 0x6a, 0x61,
+0x3b, 0x6b, 0x6f, 0x6c, 0x6f, 0x76, 0x6f, 0x7a, 0x61, 0x3b, 0x72, 0x75,
+0x6a, 0x6e, 0x61, 0x3b, 0x6c, 0x69, 0x73, 0x74, 0x6f, 0x70, 0x61, 0x64,
+0x61, 0x3b, 0x73, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x6f, 0x67, 0x61, 0x3b,
+0x70, 0x72, 0x6f, 0x73, 0x69, 0x6e, 0x63, 0x61, 0x73, 0x69, 0x6a, 0x3b,
+0x76, 0x65, 0x6c, 0x6a, 0x3b, 0x6f, 0x17e, 0x75, 0x3b, 0x74, 0x72, 0x61,
+0x3b, 0x73, 0x76, 0x69, 0x3b, 0x6c, 0x69, 0x70, 0x3b, 0x73, 0x72, 0x70,
+0x3b, 0x6b, 0x6f, 0x6c, 0x3b, 0x72, 0x75, 0x6a, 0x3b, 0x6c, 0x69, 0x73,
+0x3b, 0x73, 0x74, 0x75, 0x3b, 0x70, 0x72, 0x6f, 0x31, 0x2e, 0x3b, 0x32,
+0x2e, 0x3b, 0x33, 0x2e, 0x3b, 0x34, 0x2e, 0x3b, 0x35, 0x2e, 0x3b, 0x36,
+0x2e, 0x3b, 0x37, 0x2e, 0x3b, 0x38, 0x2e, 0x3b, 0x39, 0x2e, 0x3b, 0x31,
+0x30, 0x2e, 0x3b, 0x31, 0x31, 0x2e, 0x3b, 0x31, 0x32, 0x2e, 0x6c, 0x65,
+0x64, 0x65, 0x6e, 0x3b, 0xfa, 0x6e, 0x6f, 0x72, 0x3b, 0x62, 0x159, 0x65,
+0x7a, 0x65, 0x6e, 0x3b, 0x64, 0x75, 0x62, 0x65, 0x6e, 0x3b, 0x6b, 0x76,
+0x11b, 0x74, 0x65, 0x6e, 0x3b, 0x10d, 0x65, 0x72, 0x76, 0x65, 0x6e, 0x3b,
+0x10d, 0x65, 0x72, 0x76, 0x65, 0x6e, 0x65, 0x63, 0x3b, 0x73, 0x72, 0x70,
+0x65, 0x6e, 0x3b, 0x7a, 0xe1, 0x159, 0xed, 0x3b, 0x159, 0xed, 0x6a, 0x65,
+0x6e, 0x3b, 0x6c, 0x69, 0x73, 0x74, 0x6f, 0x70, 0x61, 0x64, 0x3b, 0x70,
+0x72, 0x6f, 0x73, 0x69, 0x6e, 0x65, 0x63, 0x6c, 0x65, 0x64, 0x6e, 0x61,
+0x3b, 0xfa, 0x6e, 0x6f, 0x72, 0x61, 0x3b, 0x62, 0x159, 0x65, 0x7a, 0x6e,
+0x61, 0x3b, 0x64, 0x75, 0x62, 0x6e, 0x61, 0x3b, 0x6b, 0x76, 0x11b, 0x74,
+0x6e, 0x61, 0x3b, 0x10d, 0x65, 0x72, 0x76, 0x6e, 0x61, 0x3b, 0x10d, 0x65,
+0x72, 0x76, 0x65, 0x6e, 0x63, 0x65, 0x3b, 0x73, 0x72, 0x70, 0x6e, 0x61,
+0x3b, 0x7a, 0xe1, 0x159, 0xed, 0x3b, 0x159, 0xed, 0x6a, 0x6e, 0x61, 0x3b,
+0x6c, 0x69, 0x73, 0x74, 0x6f, 0x70, 0x61, 0x64, 0x75, 0x3b, 0x70, 0x72,
+0x6f, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x6c, 0x65, 0x64, 0x3b, 0xfa, 0x6e,
+0x6f, 0x3b, 0x62, 0x159, 0x65, 0x3b, 0x64, 0x75, 0x62, 0x3b, 0x6b, 0x76,
+0x11b, 0x3b, 0x10d, 0x76, 0x6e, 0x3b, 0x10d, 0x76, 0x63, 0x3b, 0x73, 0x72,
+0x70, 0x3b, 0x7a, 0xe1, 0x159, 0x3b, 0x159, 0xed, 0x6a, 0x3b, 0x6c, 0x69,
+0x73, 0x3b, 0x70, 0x72, 0x6f, 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x3b,
+0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b, 0x6d, 0x61, 0x72, 0x74,
+0x73, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x61, 0x6a, 0x3b,
+0x6a, 0x75, 0x6e, 0x69, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x3b, 0x61, 0x75,
+0x67, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62,
+0x65, 0x72, 0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x6e,
+0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x63, 0x65,
+0x6d, 0x62, 0x65, 0x72, 0x6a, 0x61, 0x6e, 0x2e, 0x3b, 0x66, 0x65, 0x62,
+0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x2e, 0x3b, 0x61, 0x70, 0x72, 0x2e, 0x3b,
+0x6d, 0x61, 0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x2e, 0x3b, 0x6a, 0x75, 0x6c,
+0x2e, 0x3b, 0x61, 0x75, 0x67, 0x2e, 0x3b, 0x73, 0x65, 0x70, 0x2e, 0x3b,
+0x6f, 0x6b, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0x65,
+0x63, 0x2e, 0x91c, 0x928, 0x935, 0x930, 0x940, 0x3b, 0x92b, 0x930, 0x935, 0x930,
+0x940, 0x3b, 0x92e, 0x93e, 0x930, 0x94d, 0x91a, 0x3b, 0x905, 0x92a, 0x94d, 0x930,
+0x948, 0x932, 0x3b, 0x92e, 0x947, 0x908, 0x3b, 0x91c, 0x942, 0x928, 0x3b, 0x91c,
+0x941, 0x932, 0x93e, 0x908, 0x3b, 0x905, 0x917, 0x938, 0x94d, 0x924, 0x3b, 0x938,
+0x93f, 0x924, 0x902, 0x92c, 0x930, 0x3b, 0x905, 0x915, 0x94d, 0x924, 0x942, 0x92c,
+0x930, 0x3b, 0x928, 0x935, 0x902, 0x92c, 0x930, 0x3b, 0x926, 0x93f, 0x938, 0x902,
+0x92c, 0x930, 0x91c, 0x928, 0x2e, 0x3b, 0x92b, 0x930, 0x2e, 0x3b, 0x92e, 0x93e,
+0x930, 0x94d, 0x91a, 0x3b, 0x905, 0x92a, 0x94d, 0x930, 0x948, 0x932, 0x3b, 0x92e,
+0x947, 0x908, 0x3b, 0x91c, 0x942, 0x928, 0x3b, 0x91c, 0x941, 0x932, 0x93e, 0x908,
+0x3b, 0x905, 0x917, 0x2e, 0x3b, 0x938, 0x93f, 0x924, 0x2e, 0x3b, 0x905, 0x915,
+0x94d, 0x924, 0x942, 0x2e, 0x3b, 0x928, 0x935, 0x2e, 0x3b, 0x926, 0x93f, 0x938,
+0x2e, 0x91c, 0x3b, 0x92b, 0x3b, 0x92e, 0x93e, 0x3b, 0x905, 0x3b, 0x92e, 0x947,
+0x3b, 0x91c, 0x942, 0x3b, 0x91c, 0x941, 0x3b, 0x905, 0x3b, 0x938, 0x93f, 0x3b,
+0x905, 0x3b, 0x928, 0x3b, 0x926, 0x93f, 0x64, 0x69, 0x6d, 0x254, 0x301, 0x64,
+0x69, 0x3b, 0x14b, 0x67, 0x254, 0x6e, 0x64, 0x25b, 0x3b, 0x73, 0x254, 0x14b,
+0x25b, 0x3b, 0x64, 0x69, 0x253, 0xe1, 0x253, 0xe1, 0x3b, 0x65, 0x6d, 0x69,
+0x61, 0x73, 0x65, 0x6c, 0x65, 0x3b, 0x65, 0x73, 0x254, 0x70, 0x25b, 0x73,
+0x254, 0x70, 0x25b, 0x3b, 0x6d, 0x61, 0x64, 0x69, 0x253, 0x25b, 0x301, 0x64,
+0xed, 0x253, 0x25b, 0x301, 0x3b, 0x64, 0x69, 0x14b, 0x67, 0x69, 0x6e, 0x64,
+0x69, 0x3b, 0x6e, 0x79, 0x25b, 0x74, 0x25b, 0x6b, 0x69, 0x3b, 0x6d, 0x61,
+0x79, 0xe9, 0x73, 0x25b, 0x301, 0x3b, 0x74, 0x69, 0x6e, 0xed, 0x6e, 0xed,
+0x3b, 0x65, 0x6c, 0xe1, 0x14b, 0x67, 0x25b, 0x301, 0x64, 0x69, 0x3b, 0x14b,
+0x67, 0x254, 0x6e, 0x3b, 0x73, 0x254, 0x14b, 0x3b, 0x64, 0x69, 0x253, 0x3b,
+0x65, 0x6d, 0x69, 0x3b, 0x65, 0x73, 0x254, 0x3b, 0x6d, 0x61, 0x64, 0x3b,
+0x64, 0x69, 0x14b, 0x3b, 0x6e, 0x79, 0x25b, 0x74, 0x3b, 0x6d, 0x61, 0x79,
+0x3b, 0x74, 0x69, 0x6e, 0x3b, 0x65, 0x6c, 0xe1, 0x64, 0x3b, 0x14b, 0x3b,
+0x73, 0x3b, 0x64, 0x3b, 0x65, 0x3b, 0x65, 0x3b, 0x6d, 0x3b, 0x64, 0x3b,
+0x6e, 0x3b, 0x6d, 0x3b, 0x74, 0x3b, 0x65, 0x6a, 0x61, 0x6e, 0x75, 0x61,
+0x72, 0x69, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x69, 0x3b,
+0x6d, 0x61, 0x61, 0x72, 0x74, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x6c, 0x3b,
+0x6d, 0x65, 0x69, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x3b, 0x6a, 0x75, 0x6c,
+0x69, 0x3b, 0x61, 0x75, 0x67, 0x75, 0x73, 0x74, 0x75, 0x73, 0x3b, 0x73,
+0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6f, 0x6b, 0x74,
+0x6f, 0x62, 0x65, 0x72, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65,
+0x72, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x6a, 0x61,
+0x6e, 0x3b, 0x66, 0x65, 0x62, 0x3b, 0x6d, 0x72, 0x74, 0x3b, 0x61, 0x70,
+0x72, 0x3b, 0x6d, 0x65, 0x69, 0x3b, 0x6a, 0x75, 0x6e, 0x3b, 0x6a, 0x75,
+0x6c, 0x3b, 0x61, 0x75, 0x67, 0x3b, 0x73, 0x65, 0x70, 0x3b, 0x6f, 0x6b,
+0x74, 0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64, 0x65, 0x63, 0xf66, 0xfa4, 0xfb1,
+0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf0b, 0xf51, 0xf44, 0xf54, 0xf0b, 0x3b, 0xf66, 0xfa4,
+0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf0b, 0xf42, 0xf49, 0xf72, 0xf66, 0xf0b, 0xf54,
+0xf0b, 0x3b, 0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf0b, 0xf42, 0xf66,
+0xf74, 0xf58, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf5f,
+0xfb3, 0xf0b, 0xf56, 0xf5e, 0xf72, 0xf0b, 0xf54, 0x3b, 0xf66, 0xfa4, 0xfb1, 0xf72,
+0xf0b, 0xf5f, 0xfb3, 0xf0b, 0xf63, 0xf94, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf66, 0xfa4,
+0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf0b, 0xf51, 0xfb2, 0xf74, 0xf42, 0xf0b, 0xf54,
+0x3b, 0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf51, 0xf74,
+0xf53, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3,
+0xf0b, 0xf56, 0xf62, 0xf92, 0xfb1, 0xf51, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf66, 0xfa4,
+0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf0b, 0xf51, 0xf42, 0xf74, 0xf0b, 0xf54, 0xf0b,
+0x3b, 0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf45, 0xf74,
+0xf0b, 0xf54, 0xf0b, 0x3b, 0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf0b,
+0xf56, 0xf45, 0xf74, 0xf0b, 0xf42, 0xf45, 0xf72, 0xf42, 0xf0b, 0xf54, 0xf0b, 0x3b,
+0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf45, 0xf74, 0xf0b,
+0xf42, 0xf49, 0xf72, 0xf66, 0xf0b, 0xf54, 0xf0b, 0xf5f, 0xfb3, 0xf0b, 0xf51, 0xf44,
+0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf42, 0xf49, 0xf72, 0xf66, 0xf0b, 0xf54,
+0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf42, 0xf66, 0xf74, 0xf58, 0xf0b, 0xf54, 0xf0b,
+0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf5e, 0xf72, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f,
+0xfb3, 0xf0b, 0xf63, 0xf94, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf51,
+0xfb2, 0xf74, 0xf42, 0xf0b, 0xf54, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf51, 0xf74,
+0xf53, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf62, 0xf92, 0xfb1,
+0xf51, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf51, 0xf42, 0xf74, 0xf0b,
+0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf45, 0xf74, 0xf0b, 0xf54, 0xf0b,
+0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf45, 0xf74, 0xf0b, 0xf42, 0xf45, 0xf72, 0xf42,
+0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf45, 0xf74, 0xf0b, 0xf42,
+0xf49, 0xf72, 0xf66, 0xf0b, 0xf54, 0xf0b, 0xf5f, 0xfb3, 0xf0b, 0xf21, 0x3b, 0xf5f,
+0xfb3, 0xf0b, 0xf22, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf23, 0x3b, 0xf5f, 0xfb3, 0xf0b,
+0xf24, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf25, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf26, 0x3b,
+0xf5f, 0xfb3, 0xf0b, 0xf27, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf28, 0x3b, 0xf5f, 0xfb3,
+0xf0b, 0xf29, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf21, 0xf20, 0x3b, 0xf5f, 0xfb3, 0xf0b,
+0xf21, 0xf21, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf21, 0xf22, 0xf21, 0x3b, 0xf22, 0x3b,
+0xf23, 0x3b, 0xf24, 0x3b, 0xf25, 0x3b, 0xf26, 0x3b, 0xf27, 0x3b, 0xf28, 0x3b,
+0xf29, 0x3b, 0xf21, 0xf20, 0x3b, 0xf21, 0xf21, 0x3b, 0x31, 0x32, 0xf21, 0x3b,
+0xf22, 0x3b, 0xf23, 0x3b, 0xf24, 0x3b, 0xf25, 0x3b, 0xf26, 0x3b, 0xf27, 0x3b,
+0xf28, 0x3b, 0xf29, 0x3b, 0xf21, 0xf20, 0x3b, 0xf21, 0xf21, 0x3b, 0xf21, 0xf22,
+0xf21, 0x3b, 0xf22, 0x3b, 0xf23, 0x3b, 0x34, 0x3b, 0xf25, 0x3b, 0xf26, 0x3b,
+0xf27, 0x3b, 0xf28, 0x3b, 0x39, 0x3b, 0xf21, 0xf20, 0x3b, 0xf21, 0xf21, 0x3b,
+0xf21, 0xf22, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6d,
+0x62, 0x65, 0x72, 0x65, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77,
+0x61, 0x20, 0x6b, 0x61, 0x129, 0x72, 0x69, 0x3b, 0x4d, 0x77, 0x65, 0x72,
+0x69, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x74, 0x68, 0x61, 0x74, 0x169,
+0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x61,
+0x6e, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20,
+0x67, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69,
+0x20, 0x77, 0x61, 0x20, 0x67, 0x61, 0x74, 0x61, 0x6e, 0x74, 0x61, 0x74,
+0x169, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6d,
+0x169, 0x67, 0x77, 0x61, 0x6e, 0x6a, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72,
+0x69, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x6e, 0x61, 0x6e, 0x61, 0x3b,
+0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x65, 0x6e,
+0x64, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20,
+0x69, 0x6b, 0x169, 0x6d, 0x69, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20,
+0x77, 0x61, 0x20, 0x69, 0x6b, 0x169, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20,
+0x169, 0x6d, 0x77, 0x65, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77,
+0x61, 0x20, 0x69, 0x6b, 0x169, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x4b,
+0x61, 0x129, 0x72, 0x129, 0x4d, 0x62, 0x65, 0x3b, 0x4b, 0x61, 0x69, 0x3b,
+0x4b, 0x61, 0x74, 0x3b, 0x4b, 0x61, 0x6e, 0x3b, 0x47, 0x61, 0x74, 0x3b,
+0x47, 0x61, 0x6e, 0x3b, 0x4d, 0x75, 0x67, 0x3b, 0x4b, 0x6e, 0x6e, 0x3b,
+0x4b, 0x65, 0x6e, 0x3b, 0x49, 0x6b, 0x75, 0x3b, 0x49, 0x6d, 0x77, 0x3b,
+0x49, 0x67, 0x69, 0x4d, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x47,
+0x3b, 0x47, 0x3b, 0x4d, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x49, 0x3b, 0x49,
+0x3b, 0x49, 0xd801, 0xdc16, 0xd801, 0xdc30, 0xd801, 0xdc4c, 0xd801, 0xdc37, 0xd801, 0xdc2d,
+0xd801, 0xdc2f, 0xd801, 0xdc49, 0xd801, 0xdc28, 0x3b, 0xd801, 0xdc19, 0xd801, 0xdc2f, 0xd801,
+0xdc3a, 0xd801, 0xdc49, 0xd801, 0xdc2d, 0xd801, 0xdc2f, 0xd801, 0xdc49, 0xd801, 0xdc28, 0x3b,
+0xd801, 0xdc23, 0xd801, 0xdc2a, 0xd801, 0xdc49, 0xd801, 0xdc3d, 0x3b, 0xd801, 0xdc01, 0xd801,
+0xdc39, 0xd801, 0xdc49, 0xd801, 0xdc2e, 0xd801, 0xdc4a, 0x3b, 0xd801, 0xdc23, 0xd801, 0xdc29,
+0x3b, 0xd801, 0xdc16, 0xd801, 0xdc2d, 0xd801, 0xdc4c, 0x3b, 0xd801, 0xdc16, 0xd801, 0xdc2d,
+0xd801, 0xdc4a, 0xd801, 0xdc34, 0x3b, 0xd801, 0xdc02, 0xd801, 0xdc40, 0xd801, 0xdc32, 0xd801,
+0xdc45, 0xd801, 0xdc3b, 0x3b, 0xd801, 0xdc1d, 0xd801, 0xdc2f, 0xd801, 0xdc39, 0xd801, 0xdc3b,
+0xd801, 0xdc2f, 0xd801, 0xdc4b, 0xd801, 0xdc3a, 0xd801, 0xdc32, 0xd801, 0xdc49, 0x3b, 0xd801,
+0xdc09, 0xd801, 0xdc3f, 0xd801, 0xdc3b, 0xd801, 0xdc2c, 0xd801, 0xdc3a, 0xd801, 0xdc32, 0xd801,
+0xdc49, 0x3b, 0xd801, 0xdc24, 0xd801, 0xdc2c, 0xd801, 0xdc42, 0xd801, 0xdc2f, 0xd801, 0xdc4b,
+0xd801, 0xdc3a, 0xd801, 0xdc32, 0xd801, 0xdc49, 0x3b, 0xd801, 0xdc14, 0xd801, 0xdc28, 0xd801,
+0xdc45, 0xd801, 0xdc2f, 0xd801, 0xdc4b, 0xd801, 0xdc3a, 0xd801, 0xdc32, 0xd801, 0xdc49, 0xd801,
+0xdc16, 0xd801, 0xdc30, 0xd801, 0xdc4c, 0x3b, 0xd801, 0xdc19, 0xd801, 0xdc2f, 0xd801, 0xdc3a,
+0x3b, 0xd801, 0xdc23, 0xd801, 0xdc2a, 0xd801, 0xdc49, 0x3b, 0xd801, 0xdc01, 0xd801, 0xdc39,
+0xd801, 0xdc49, 0x3b, 0xd801, 0xdc23, 0xd801, 0xdc29, 0x3b, 0xd801, 0xdc16, 0xd801, 0xdc2d,
+0xd801, 0xdc4c, 0x3b, 0xd801, 0xdc16, 0xd801, 0xdc2d, 0xd801, 0xdc4a, 0x3b, 0xd801, 0xdc02,
+0xd801, 0xdc40, 0x3b, 0xd801, 0xdc1d, 0xd801, 0xdc2f, 0xd801, 0xdc39, 0x3b, 0xd801, 0xdc09,
+0xd801, 0xdc3f, 0xd801, 0xdc3b, 0x3b, 0xd801, 0xdc24, 0xd801, 0xdc2c, 0xd801, 0xdc42, 0x3b,
+0xd801, 0xdc14, 0xd801, 0xdc28, 0xd801, 0xdc45, 0xd801, 0xdc16, 0x3b, 0xd801, 0xdc19, 0x3b,
+0xd801, 0xdc23, 0x3b, 0xd801, 0xdc01, 0x3b, 0xd801, 0xdc23, 0x3b, 0xd801, 0xdc16, 0x3b,
+0xd801, 0xdc16, 0x3b, 0xd801, 0xdc02, 0x3b, 0xd801, 0xdc1d, 0x3b, 0xd801, 0xdc09, 0x3b,
+0xd801, 0xdc24, 0x3b, 0xd801, 0xdc14, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62,
+0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x61, 0x79,
+0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x75, 0x67,
+0x3b, 0x53, 0x65, 0x70, 0x74, 0x3b, 0x4f, 0x63, 0x74, 0x3b, 0x4e, 0x6f,
+0x76, 0x3b, 0x44, 0x65, 0x63, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62,
+0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x61, 0x79,
+0x3b, 0x4a, 0x75, 0x6e, 0x65, 0x3b, 0x4a, 0x75, 0x6c, 0x79, 0x3b, 0x41,
+0x75, 0x67, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x3b, 0x4f, 0x63, 0x74, 0x3b,
+0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x63, 0xb7, 0xd801, 0xdc61, 0xd801, 0xdc68,
+0xd801, 0xdc59, 0xd801, 0xdc58, 0xd801, 0xdc6d, 0xd801, 0xdc62, 0xd801, 0xdc7a, 0xd801, 0xdc70,
+0x3b, 0xb7, 0xd801, 0xdc53, 0xd801, 0xdc67, 0xd801, 0xdc5a, 0xd801, 0xdc58, 0xd801, 0xdc75,
+0xd801, 0xdc62, 0xd801, 0xdc7a, 0xd801, 0xdc70, 0x3b, 0xb7, 0xd801, 0xdc65, 0xd801, 0xdc78,
+0xd801, 0xdc57, 0x3b, 0xb7, 0xd801, 0xdc71, 0xd801, 0xdc50, 0xd801, 0xdc6e, 0xd801, 0xdc6d,
+0xd801, 0xdc64, 0x3b, 0xb7, 0xd801, 0xdc65, 0xd801, 0xdc71, 0x3b, 0xb7, 0xd801, 0xdc61,
+0xd801, 0xdc75, 0xd801, 0xdc6f, 0x3b, 0xb7, 0xd801, 0xdc61, 0xd801, 0xdc6b, 0xd801, 0xdc64,
+0xd801, 0xdc72, 0x3b, 0xb7, 0xd801, 0xdc6a, 0xd801, 0xdc5c, 0xd801, 0xdc6d, 0xd801, 0xdc55,
+0xd801, 0xdc51, 0x3b, 0xb7, 0xd801, 0xdc55, 0xd801, 0xdc67, 0xd801, 0xdc50, 0xd801, 0xdc51,
+0xd801, 0xdc67, 0xd801, 0xdc65, 0xd801, 0xdc5a, 0xd801, 0xdc78, 0x3b, 0xb7, 0xd801, 0xdc77,
+0xd801, 0xdc52, 0xd801, 0xdc51, 0xd801, 0xdc74, 0xd801, 0xdc5a, 0xd801, 0xdc78, 0x3b, 0xb7,
+0xd801, 0xdc6f, 0xd801, 0xdc74, 0xd801, 0xdc5d, 0xd801, 0xdc67, 0xd801, 0xdc65, 0xd801, 0xdc5a,
+0xd801, 0xdc78, 0x3b, 0xb7, 0xd801, 0xdc5b, 0xd801, 0xdc6d, 0xd801, 0xdc55, 0xd801, 0xdc67,
+0xd801, 0xdc65, 0xd801, 0xdc5a, 0xd801, 0xdc78, 0xb7, 0xd801, 0xdc61, 0xd801, 0xdc68, 0x3b,
+0xb7, 0xd801, 0xdc53, 0xd801, 0xdc67, 0x3b, 0xb7, 0xd801, 0xdc65, 0xd801, 0xdc78, 0x3b,
+0xb7, 0xd801, 0xdc71, 0xd801, 0xdc50, 0x3b, 0xb7, 0xd801, 0xdc65, 0xd801, 0xdc71, 0x3b,
+0xb7, 0xd801, 0xdc61, 0xd801, 0xdc75, 0x3b, 0xb7, 0xd801, 0xdc61, 0xd801, 0xdc6b, 0x3b,
+0xb7, 0xd801, 0xdc6a, 0xd801, 0xdc5c, 0x3b, 0xb7, 0xd801, 0xdc55, 0xd801, 0xdc67, 0x3b,
+0xb7, 0xd801, 0xdc77, 0xd801, 0xdc52, 0x3b, 0xb7, 0xd801, 0xdc6f, 0xd801, 0xdc74, 0x3b,
+0xb7, 0xd801, 0xdc5b, 0xd801, 0xdc6d, 0xd801, 0xdc61, 0x3b, 0xd801, 0xdc53, 0x3b, 0xd801,
+0xdc65, 0x3b, 0xd801, 0xdc71, 0x3b, 0xd801, 0xdc65, 0x3b, 0xd801, 0xdc61, 0x3b, 0xd801,
+0xdc61, 0x3b, 0xd801, 0xdc6a, 0x3b, 0xd801, 0xdc55, 0x3b, 0xd801, 0xdc77, 0x3b, 0xd801,
+0xdc6f, 0x3b, 0xd801, 0xdc5b, 0x44f, 0x43a, 0x448, 0x430, 0x43c, 0x43a, 0x43e, 0x432,
+0x3b, 0x434, 0x430, 0x432, 0x43e, 0x43b, 0x43a, 0x43e, 0x432, 0x3b, 0x44d, 0x439,
+0x437, 0x44e, 0x440, 0x43a, 0x43e, 0x432, 0x3b, 0x447, 0x430, 0x434, 0x44b, 0x43a,
+0x43e, 0x432, 0x3b, 0x43f, 0x430, 0x43d, 0x436, 0x438, 0x43a, 0x43e, 0x432, 0x3b,
+0x430, 0x448, 0x442, 0x435, 0x43c, 0x43a, 0x43e, 0x432, 0x3b, 0x43c, 0x435, 0x434,
+0x44c, 0x43a, 0x43e, 0x432, 0x3b, 0x443, 0x43c, 0x430, 0x440, 0x44c, 0x43a, 0x43e,
+0x432, 0x3b, 0x442, 0x430, 0x448, 0x442, 0x430, 0x43c, 0x43a, 0x43e, 0x432, 0x3b,
+0x43e, 0x436, 0x43e, 0x43a, 0x43e, 0x432, 0x3b, 0x441, 0x443, 0x43d, 0x434, 0x435,
+0x440, 0x44c, 0x43a, 0x43e, 0x432, 0x3b, 0x430, 0x446, 0x430, 0x43c, 0x43a, 0x43e,
+0x432, 0x44f, 0x43a, 0x448, 0x3b, 0x434, 0x430, 0x432, 0x3b, 0x44d, 0x439, 0x437,
+0x3b, 0x447, 0x430, 0x434, 0x3b, 0x43f, 0x430, 0x43d, 0x3b, 0x430, 0x448, 0x442,
+0x3b, 0x43c, 0x435, 0x434, 0x3b, 0x443, 0x43c, 0x430, 0x3b, 0x442, 0x430, 0x448,
+0x3b, 0x43e, 0x436, 0x43e, 0x3b, 0x441, 0x443, 0x43d, 0x3b, 0x430, 0x446, 0x430,
+0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x6f, 0x3b, 0x46, 0x65, 0x62, 0x72,
+0x75, 0x61, 0x72, 0x6f, 0x3b, 0x4d, 0x61, 0x72, 0x74, 0x6f, 0x3b, 0x41,
+0x70, 0x72, 0x69, 0x6c, 0x6f, 0x3b, 0x4d, 0x61, 0x6a, 0x6f, 0x3b, 0x4a,
+0x75, 0x6e, 0x69, 0x6f, 0x3b, 0x4a, 0x75, 0x6c, 0x69, 0x6f, 0x3b, 0x41,
+0x16d, 0x67, 0x75, 0x73, 0x74, 0x6f, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65,
+0x6d, 0x62, 0x72, 0x6f, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x72, 0x6f,
+0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x6f, 0x3b, 0x44, 0x65,
+0x63, 0x65, 0x6d, 0x62, 0x72, 0x6f, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65,
+0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x61,
+0x6a, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x16d,
+0x67, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f,
+0x76, 0x3b, 0x44, 0x65, 0x63, 0x6a, 0x61, 0x61, 0x6e, 0x75, 0x61, 0x72,
+0x3b, 0x76, 0x65, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b, 0x6d, 0xe4,
+0x72, 0x74, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x6c, 0x6c, 0x3b, 0x6d,
+0x61, 0x69, 0x3b, 0x6a, 0x75, 0x75, 0x6e, 0x69, 0x3b, 0x6a, 0x75, 0x75,
+0x6c, 0x69, 0x3b, 0x61, 0x75, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65,
+0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6f, 0x6b, 0x74, 0x6f,
+0x6f, 0x62, 0x65, 0x72, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65,
+0x72, 0x3b, 0x64, 0x65, 0x74, 0x73, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x6a,
+0x61, 0x61, 0x6e, 0x3b, 0x76, 0x65, 0x65, 0x62, 0x72, 0x3b, 0x6d, 0xe4,
+0x72, 0x74, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x3b, 0x6d, 0x61, 0x69, 0x3b,
+0x6a, 0x75, 0x75, 0x6e, 0x69, 0x3b, 0x6a, 0x75, 0x75, 0x6c, 0x69, 0x3b,
+0x61, 0x75, 0x67, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x3b, 0x6f, 0x6b, 0x74,
+0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64, 0x65, 0x74, 0x73, 0x4a, 0x3b, 0x56,
+0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0x41,
+0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x64, 0x7a, 0x6f, 0x76,
+0x65, 0x3b, 0x64, 0x7a, 0x6f, 0x64, 0x7a, 0x65, 0x3b, 0x74, 0x65, 0x64,
+0x6f, 0x78, 0x65, 0x3b, 0x61, 0x66, 0x254, 0x66, 0x129, 0x65, 0x3b, 0x64,
+0x61, 0x6d, 0x61, 0x3b, 0x6d, 0x61, 0x73, 0x61, 0x3b, 0x73, 0x69, 0x61,
+0x6d, 0x6c, 0x254, 0x6d, 0x3b, 0x64, 0x65, 0x61, 0x73, 0x69, 0x61, 0x6d,
+0x69, 0x6d, 0x65, 0x3b, 0x61, 0x6e, 0x79, 0x254, 0x6e, 0x79, 0x254, 0x3b,
+0x6b, 0x65, 0x6c, 0x65, 0x3b, 0x61, 0x64, 0x65, 0x25b, 0x6d, 0x65, 0x6b,
+0x70, 0x254, 0x78, 0x65, 0x3b, 0x64, 0x7a, 0x6f, 0x6d, 0x65, 0x64, 0x7a,
+0x76, 0x3b, 0x64, 0x7a, 0x64, 0x3b, 0x74, 0x65, 0x64, 0x3b, 0x61, 0x66,
+0x254, 0x3b, 0x64, 0x61, 0x6d, 0x3b, 0x6d, 0x61, 0x73, 0x3b, 0x73, 0x69,
+0x61, 0x3b, 0x64, 0x65, 0x61, 0x3b, 0x61, 0x6e, 0x79, 0x3b, 0x6b, 0x65,
+0x6c, 0x3b, 0x61, 0x64, 0x65, 0x3b, 0x64, 0x7a, 0x6d, 0x64, 0x3b, 0x64,
+0x3b, 0x74, 0x3b, 0x61, 0x3b, 0x64, 0x3b, 0x6d, 0x3b, 0x73, 0x3b, 0x64,
+0x3b, 0x61, 0x3b, 0x6b, 0x3b, 0x61, 0x3b, 0x64, 0x6e, 0x67, 0x254, 0x6e,
+0x20, 0x6f, 0x73, 0xfa, 0x3b, 0x6e, 0x67, 0x254, 0x6e, 0x20, 0x62, 0x25b,
+0x30c, 0x3b, 0x6e, 0x67, 0x254, 0x6e, 0x20, 0x6c, 0xe1, 0x6c, 0x61, 0x3b,
+0x6e, 0x67, 0x254, 0x6e, 0x20, 0x6e, 0x79, 0x69, 0x6e, 0x61, 0x3b, 0x6e,
+0x67, 0x254, 0x6e, 0x20, 0x74, 0xe1, 0x6e, 0x61, 0x3b, 0x6e, 0x67, 0x254,
+0x6e, 0x20, 0x73, 0x61, 0x6d, 0x259, 0x6e, 0x61, 0x3b, 0x6e, 0x67, 0x254,
+0x6e, 0x20, 0x7a, 0x61, 0x6d, 0x67, 0x62, 0xe1, 0x6c, 0x61, 0x3b, 0x6e,
+0x67, 0x254, 0x6e, 0x20, 0x6d, 0x77, 0x6f, 0x6d, 0x3b, 0x6e, 0x67, 0x254,
+0x6e, 0x20, 0x65, 0x62, 0x75, 0x6c, 0xfa, 0x3b, 0x6e, 0x67, 0x254, 0x6e,
+0x20, 0x61, 0x77, 0xf3, 0x6d, 0x3b, 0x6e, 0x67, 0x254, 0x6e, 0x20, 0x61,
+0x77, 0xf3, 0x6d, 0x20, 0x61, 0x69, 0x20, 0x64, 0x7a, 0x69, 0xe1, 0x3b,
+0x6e, 0x67, 0x254, 0x6e, 0x20, 0x61, 0x77, 0xf3, 0x6d, 0x20, 0x61, 0x69,
+0x20, 0x62, 0x25b, 0x30c, 0x6e, 0x67, 0x6f, 0x3b, 0x6e, 0x67, 0x62, 0x3b,
+0x6e, 0x67, 0x6c, 0x3b, 0x6e, 0x67, 0x6e, 0x3b, 0x6e, 0x67, 0x74, 0x3b,
+0x6e, 0x67, 0x73, 0x3b, 0x6e, 0x67, 0x7a, 0x3b, 0x6e, 0x67, 0x6d, 0x3b,
+0x6e, 0x67, 0x65, 0x3b, 0x6e, 0x67, 0x61, 0x3b, 0x6e, 0x67, 0x61, 0x64,
+0x3b, 0x6e, 0x67, 0x61, 0x62, 0x6f, 0x3b, 0x62, 0x3b, 0x6c, 0x3b, 0x6e,
+0x3b, 0x74, 0x3b, 0x73, 0x3b, 0x7a, 0x3b, 0x6d, 0x3b, 0x65, 0x3b, 0x61,
+0x3b, 0x64, 0x3b, 0x62, 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x3b, 0x66,
+0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x3b,
+0x61, 0x70, 0x72, 0xed, 0x6c, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x6a, 0x75,
+0x6e, 0x69, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x3b, 0x61, 0x75, 0x67, 0x75,
+0x73, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72,
+0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x6e, 0x6f, 0x76,
+0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x73, 0x65, 0x6d, 0x62,
+0x65, 0x72, 0x6a, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x62, 0x3b, 0x6d, 0x61,
+0x72, 0x3b, 0x61, 0x70, 0x72, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x6a, 0x75,
+0x6e, 0x3b, 0x6a, 0x75, 0x6c, 0x3b, 0x61, 0x75, 0x67, 0x3b, 0x73, 0x65,
+0x70, 0x3b, 0x6f, 0x6b, 0x74, 0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64, 0x65,
+0x73, 0x6a, 0x61, 0x6e, 0x2e, 0x3b, 0x66, 0x65, 0x62, 0x2e, 0x3b, 0x6d,
+0x61, 0x72, 0x2e, 0x3b, 0x61, 0x70, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x69,
+0x3b, 0x6a, 0x75, 0x6e, 0x2e, 0x3b, 0x6a, 0x75, 0x6c, 0x2e, 0x3b, 0x61,
+0x75, 0x67, 0x2e, 0x3b, 0x73, 0x65, 0x70, 0x2e, 0x3b, 0x6f, 0x6b, 0x74,
+0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0x65, 0x73, 0x2e, 0x45,
+0x6e, 0x65, 0x72, 0x6f, 0x3b, 0x50, 0x65, 0x62, 0x72, 0x65, 0x72, 0x6f,
+0x3b, 0x4d, 0x61, 0x72, 0x73, 0x6f, 0x3b, 0x41, 0x62, 0x72, 0x69, 0x6c,
+0x3b, 0x4d, 0x61, 0x79, 0x6f, 0x3b, 0x48, 0x75, 0x6e, 0x79, 0x6f, 0x3b,
+0x48, 0x75, 0x6c, 0x79, 0x6f, 0x3b, 0x41, 0x67, 0x6f, 0x73, 0x74, 0x6f,
+0x3b, 0x53, 0x65, 0x74, 0x79, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x4f,
+0x6b, 0x74, 0x75, 0x62, 0x72, 0x65, 0x3b, 0x4e, 0x6f, 0x62, 0x79, 0x65,
+0x6d, 0x62, 0x72, 0x65, 0x3b, 0x44, 0x69, 0x73, 0x79, 0x65, 0x6d, 0x62,
+0x72, 0x65, 0x45, 0x6e, 0x65, 0x3b, 0x50, 0x65, 0x62, 0x3b, 0x4d, 0x61,
+0x72, 0x3b, 0x41, 0x62, 0x72, 0x3b, 0x4d, 0x61, 0x79, 0x3b, 0x48, 0x75,
+0x6e, 0x3b, 0x48, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x6f, 0x3b, 0x53, 0x65,
+0x74, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x62, 0x3b, 0x44, 0x69,
+0x73, 0x45, 0x3b, 0x50, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x48,
+0x75, 0x6e, 0x3b, 0x48, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x6f, 0x3b, 0x53,
+0x65, 0x74, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x62, 0x3b, 0x44,
+0x69, 0x73, 0x74, 0x61, 0x6d, 0x6d, 0x69, 0x6b, 0x75, 0x75, 0x3b, 0x68,
+0x65, 0x6c, 0x6d, 0x69, 0x6b, 0x75, 0x75, 0x3b, 0x6d, 0x61, 0x61, 0x6c,
+0x69, 0x73, 0x6b, 0x75, 0x75, 0x3b, 0x68, 0x75, 0x68, 0x74, 0x69, 0x6b,
+0x75, 0x75, 0x3b, 0x74, 0x6f, 0x75, 0x6b, 0x6f, 0x6b, 0x75, 0x75, 0x3b,
+0x6b, 0x65, 0x73, 0xe4, 0x6b, 0x75, 0x75, 0x3b, 0x68, 0x65, 0x69, 0x6e,
+0xe4, 0x6b, 0x75, 0x75, 0x3b, 0x65, 0x6c, 0x6f, 0x6b, 0x75, 0x75, 0x3b,
+0x73, 0x79, 0x79, 0x73, 0x6b, 0x75, 0x75, 0x3b, 0x6c, 0x6f, 0x6b, 0x61,
+0x6b, 0x75, 0x75, 0x3b, 0x6d, 0x61, 0x72, 0x72, 0x61, 0x73, 0x6b, 0x75,
+0x75, 0x3b, 0x6a, 0x6f, 0x75, 0x6c, 0x75, 0x6b, 0x75, 0x75, 0x74, 0x61,
+0x6d, 0x6d, 0x69, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x68, 0x65, 0x6c,
+0x6d, 0x69, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x6d, 0x61, 0x61, 0x6c,
+0x69, 0x73, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x68, 0x75, 0x68, 0x74,
+0x69, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x74, 0x6f, 0x75, 0x6b, 0x6f,
+0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x6b, 0x65, 0x73, 0xe4, 0x6b, 0x75,
+0x75, 0x74, 0x61, 0x3b, 0x68, 0x65, 0x69, 0x6e, 0xe4, 0x6b, 0x75, 0x75,
+0x74, 0x61, 0x3b, 0x65, 0x6c, 0x6f, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b,
+0x73, 0x79, 0x79, 0x73, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x6c, 0x6f,
+0x6b, 0x61, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x6d, 0x61, 0x72, 0x72,
+0x61, 0x73, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x6a, 0x6f, 0x75, 0x6c,
+0x75, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x74, 0x61, 0x6d, 0x6d, 0x69, 0x3b,
+0x68, 0x65, 0x6c, 0x6d, 0x69, 0x3b, 0x6d, 0x61, 0x61, 0x6c, 0x69, 0x73,
+0x3b, 0x68, 0x75, 0x68, 0x74, 0x69, 0x3b, 0x74, 0x6f, 0x75, 0x6b, 0x6f,
+0x3b, 0x6b, 0x65, 0x73, 0xe4, 0x3b, 0x68, 0x65, 0x69, 0x6e, 0xe4, 0x3b,
+0x65, 0x6c, 0x6f, 0x3b, 0x73, 0x79, 0x79, 0x73, 0x3b, 0x6c, 0x6f, 0x6b,
+0x61, 0x3b, 0x6d, 0x61, 0x72, 0x72, 0x61, 0x73, 0x3b, 0x6a, 0x6f, 0x75,
+0x6c, 0x75, 0x74, 0x61, 0x6d, 0x6d, 0x69, 0x6b, 0x2e, 0x3b, 0x68, 0x65,
+0x6c, 0x6d, 0x69, 0x6b, 0x2e, 0x3b, 0x6d, 0x61, 0x61, 0x6c, 0x69, 0x73,
+0x6b, 0x2e, 0x3b, 0x68, 0x75, 0x68, 0x74, 0x69, 0x6b, 0x2e, 0x3b, 0x74,
+0x6f, 0x75, 0x6b, 0x6f, 0x6b, 0x2e, 0x3b, 0x6b, 0x65, 0x73, 0xe4, 0x6b,
+0x2e, 0x3b, 0x68, 0x65, 0x69, 0x6e, 0xe4, 0x6b, 0x2e, 0x3b, 0x65, 0x6c,
+0x6f, 0x6b, 0x2e, 0x3b, 0x73, 0x79, 0x79, 0x73, 0x6b, 0x2e, 0x3b, 0x6c,
+0x6f, 0x6b, 0x61, 0x6b, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x72, 0x61, 0x73,
+0x6b, 0x2e, 0x3b, 0x6a, 0x6f, 0x75, 0x6c, 0x75, 0x6b, 0x2e, 0x54, 0x3b,
+0x48, 0x3b, 0x4d, 0x3b, 0x48, 0x3b, 0x54, 0x3b, 0x4b, 0x3b, 0x48, 0x3b,
+0x45, 0x3b, 0x53, 0x3b, 0x4c, 0x3b, 0x4d, 0x3b, 0x4a, 0x6a, 0x61, 0x6e,
+0x76, 0x69, 0x65, 0x72, 0x3b, 0x66, 0xe9, 0x76, 0x72, 0x69, 0x65, 0x72,
+0x3b, 0x6d, 0x61, 0x72, 0x73, 0x3b, 0x61, 0x76, 0x72, 0x69, 0x6c, 0x3b,
+0x6d, 0x61, 0x69, 0x3b, 0x6a, 0x75, 0x69, 0x6e, 0x3b, 0x6a, 0x75, 0x69,
+0x6c, 0x6c, 0x65, 0x74, 0x3b, 0x61, 0x6f, 0xfb, 0x74, 0x3b, 0x73, 0x65,
+0x70, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x6f, 0x63, 0x74, 0x6f,
+0x62, 0x72, 0x65, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x65,
+0x3b, 0x64, 0xe9, 0x63, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x6a, 0x61, 0x6e,
+0x76, 0x2e, 0x3b, 0x66, 0xe9, 0x76, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x72,
+0x73, 0x3b, 0x61, 0x76, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x6a,
+0x75, 0x69, 0x6e, 0x3b, 0x6a, 0x75, 0x69, 0x6c, 0x2e, 0x3b, 0x61, 0x6f,
+0xfb, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x2e, 0x3b, 0x6f, 0x63, 0x74,
+0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0xe9, 0x63, 0x2e, 0x6a,
+0x61, 0x6e, 0x76, 0x2e, 0x3b, 0x66, 0xe9, 0x76, 0x72, 0x2e, 0x3b, 0x6d,
+0x61, 0x72, 0x73, 0x3b, 0x61, 0x76, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x69,
+0x3b, 0x6a, 0x75, 0x69, 0x6e, 0x3b, 0x6a, 0x75, 0x69, 0x6c, 0x6c, 0x2e,
+0x3b, 0x61, 0x6f, 0xfb, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x2e, 0x3b,
+0x6f, 0x63, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0xe9,
+0x63, 0x2e, 0x6a, 0x61, 0x6e, 0x2e, 0x3b, 0x66, 0xe9, 0x76, 0x2e, 0x3b,
+0x6d, 0x61, 0x72, 0x2e, 0x3b, 0x61, 0x76, 0x72, 0x2e, 0x3b, 0x6d, 0x61,
+0x69, 0x3b, 0x6a, 0x75, 0x69, 0x2e, 0x3b, 0x6a, 0x75, 0x69, 0x6c, 0x2e,
+0x3b, 0x61, 0x6f, 0xfb, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x2e, 0x3b,
+0x6f, 0x63, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0xe9,
+0x63, 0x2e, 0x5a, 0x65, 0x6e, 0xe2, 0x72, 0x3b, 0x46, 0x65, 0x76, 0x72,
+0xe2, 0x72, 0x3b, 0x4d, 0x61, 0x72, 0xe7, 0x3b, 0x41, 0x76, 0x72, 0xee,
+0x6c, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x67, 0x6e, 0x3b, 0x4c,
+0x75, 0x69, 0x3b, 0x41, 0x76, 0x6f, 0x73, 0x74, 0x3b, 0x53, 0x65, 0x74,
+0x65, 0x6d, 0x62, 0x61, 0x72, 0x3b, 0x4f, 0x74, 0x75, 0x62, 0x61, 0x72,
+0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x3b, 0x44, 0x69,
+0x63, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x5a, 0x65, 0x6e, 0x3b, 0x46, 0x65,
+0x76, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x76, 0x72, 0x3b, 0x4d, 0x61,
+0x69, 0x3b, 0x4a, 0x75, 0x67, 0x3b, 0x4c, 0x75, 0x69, 0x3b, 0x41, 0x76,
+0x6f, 0x3b, 0x53, 0x65, 0x74, 0x3b, 0x4f, 0x74, 0x75, 0x3b, 0x4e, 0x6f,
+0x76, 0x3b, 0x44, 0x69, 0x63, 0x5a, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41,
+0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x4c, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f,
+0x3b, 0x4e, 0x3b, 0x44, 0x73, 0x69, 0x69, 0x6c, 0x6f, 0x3b, 0x63, 0x6f,
+0x6c, 0x74, 0x65, 0x3b, 0x6d, 0x62, 0x6f, 0x6f, 0x79, 0x3b, 0x73, 0x65,
+0x65, 0x257, 0x74, 0x6f, 0x3b, 0x64, 0x75, 0x75, 0x6a, 0x61, 0x6c, 0x3b,
+0x6b, 0x6f, 0x72, 0x73, 0x65, 0x3b, 0x6d, 0x6f, 0x72, 0x73, 0x6f, 0x3b,
+0x6a, 0x75, 0x6b, 0x6f, 0x3b, 0x73, 0x69, 0x69, 0x6c, 0x74, 0x6f, 0x3b,
+0x79, 0x61, 0x72, 0x6b, 0x6f, 0x6d, 0x61, 0x61, 0x3b, 0x6a, 0x6f, 0x6c,
+0x61, 0x6c, 0x3b, 0x62, 0x6f, 0x77, 0x74, 0x65, 0x73, 0x69, 0x69, 0x3b,
+0x63, 0x6f, 0x6c, 0x3b, 0x6d, 0x62, 0x6f, 0x3b, 0x73, 0x65, 0x65, 0x3b,
+0x64, 0x75, 0x75, 0x3b, 0x6b, 0x6f, 0x72, 0x3b, 0x6d, 0x6f, 0x72, 0x3b,
+0x6a, 0x75, 0x6b, 0x3b, 0x73, 0x6c, 0x74, 0x3b, 0x79, 0x61, 0x72, 0x3b,
+0x6a, 0x6f, 0x6c, 0x3b, 0x62, 0x6f, 0x77, 0x73, 0x3b, 0x63, 0x3b, 0x6d,
+0x3b, 0x73, 0x3b, 0x64, 0x3b, 0x6b, 0x3b, 0x6d, 0x3b, 0x6a, 0x3b, 0x73,
+0x3b, 0x79, 0x3b, 0x6a, 0x3b, 0x62, 0xd83a, 0xdd05, 0xd83a, 0xdd2d, 0xd83a, 0xdd45,
+0xd83a, 0xdd24, 0xd83a, 0xdd2e, 0x3b, 0xd83a, 0xdd15, 0xd83a, 0xdd2e, 0xd83a, 0xdd24, 0xd83a,
+0xdd3c, 0xd83a, 0xdd2e, 0x3b, 0xd83a, 0xdd10, 0xd83a, 0xdd26, 0xd83a, 0xdd2e, 0xd83a, 0xdd45,
+0xd83a, 0xdd34, 0xd83a, 0xdd2e, 0x3b, 0xd83a, 0xdd05, 0xd83a, 0xdd2b, 0xd83a, 0xdd45, 0xd83a,
+0xdd3c, 0xd83a, 0xdd2e, 0x3b, 0xd83a, 0xdd01, 0xd83a, 0xdd35, 0xd83a, 0xdd45, 0xd83a, 0xdd36,
+0xd83a, 0xdd2e, 0x3b, 0xd83a, 0xdd11, 0xd83a, 0xdd2e, 0xd83a, 0xdd2a, 0xd83a, 0xdd27, 0xd83a,
+0xdd2e, 0x3b, 0xd83a, 0xdd03, 0xd83a, 0xdd2e, 0xd83a, 0xdd2a, 0xd83a, 0xdd27, 0xd83a, 0xdd2e,
+0x3b, 0xd83a, 0xdd14, 0xd83a, 0xdd35, 0xd83a, 0xdd33, 0xd83a, 0xdd2e, 0x3b, 0xd83a, 0xdd05,
+0xd83a, 0xdd2d, 0xd83a, 0xdd24, 0xd83a, 0xdd3c, 0xd83a, 0xdd2e, 0x3b, 0xd83a, 0xdd12, 0xd83a,
+0xdd22, 0xd83a, 0xdd2a, 0xd83a, 0xdd33, 0xd83a, 0xdd2e, 0x3b, 0xd83a, 0xdd14, 0xd83a, 0xdd2e,
+0xd83a, 0xdd24, 0xd83a, 0xdd2e, 0x3b, 0xd83a, 0xdd04, 0xd83a, 0xdd2e, 0xd83a, 0xdd31, 0xd83a,
+0xdd3c, 0xd83a, 0xdd2e, 0xd83a, 0xdd05, 0xd83a, 0xdd2d, 0xd83a, 0xdd45, 0xd83a, 0xdd24, 0x3b,
+0xd83a, 0xdd15, 0xd83a, 0xdd2e, 0xd83a, 0xdd24, 0x3b, 0xd83a, 0xdd10, 0xd83a, 0xdd26, 0xd83a,
+0xdd2e, 0xd83a, 0xdd45, 0xd83a, 0xdd34, 0x3b, 0xd83a, 0xdd05, 0xd83a, 0xdd2b, 0xd83a, 0xdd45,
+0xd83a, 0xdd3c, 0x3b, 0xd83a, 0xdd01, 0xd83a, 0xdd35, 0xd83a, 0xdd45, 0xd83a, 0xdd36, 0x3b,
+0xd83a, 0xdd11, 0xd83a, 0xdd2e, 0xd83a, 0xdd2a, 0x3b, 0xd83a, 0xdd03, 0xd83a, 0xdd2e, 0xd83a,
+0xdd2a, 0x3b, 0xd83a, 0xdd14, 0xd83a, 0xdd35, 0xd83a, 0xdd33, 0x3b, 0xd83a, 0xdd05, 0xd83a,
+0xdd2d, 0xd83a, 0xdd24, 0x3b, 0xd83a, 0xdd12, 0xd83a, 0xdd22, 0xd83a, 0xdd2a, 0x3b, 0xd83a,
+0xdd14, 0xd83a, 0xdd2e, 0xd83a, 0xdd24, 0x3b, 0xd83a, 0xdd04, 0xd83a, 0xdd2e, 0xd83a, 0xdd31,
+0xd83a, 0xdd05, 0x3b, 0xd83a, 0xdd15, 0x3b, 0xd83a, 0xdd04, 0x3b, 0xd83a, 0xdd05, 0x3b,
+0xd83a, 0xdd01, 0x3b, 0xd83a, 0xdd11, 0x3b, 0xd83a, 0xdd03, 0x3b, 0xd83a, 0xdd14, 0x3b,
+0xd83a, 0xdd05, 0x3b, 0xd83a, 0xdd12, 0x3b, 0xd83a, 0xdd14, 0x3b, 0xd83a, 0xdd04, 0x41,
+0x6d, 0x20, 0x46, 0x61, 0x6f, 0x69, 0x6c, 0x6c, 0x65, 0x61, 0x63, 0x68,
+0x3b, 0x41, 0x6e, 0x20, 0x47, 0x65, 0x61, 0x72, 0x72, 0x61, 0x6e, 0x3b,
+0x41, 0x6d, 0x20, 0x4d, 0xe0, 0x72, 0x74, 0x3b, 0x41, 0x6e, 0x20, 0x47,
+0x69, 0x62, 0x6c, 0x65, 0x61, 0x6e, 0x3b, 0x41, 0x6e, 0x20, 0x43, 0xe8,
+0x69, 0x74, 0x65, 0x61, 0x6e, 0x3b, 0x41, 0x6e, 0x20, 0x74, 0x2d, 0xd2,
+0x67, 0x6d, 0x68, 0x69, 0x6f, 0x73, 0x3b, 0x41, 0x6e, 0x20, 0x74, 0x2d,
+0x49, 0x75, 0x63, 0x68, 0x61, 0x72, 0x3b, 0x41, 0x6e, 0x20, 0x4c, 0xf9,
+0x6e, 0x61, 0x73, 0x74, 0x61, 0x6c, 0x3b, 0x41, 0x6e, 0x20, 0x74, 0x2d,
+0x53, 0x75, 0x6c, 0x74, 0x61, 0x69, 0x6e, 0x3b, 0x41, 0x6e, 0x20, 0x44,
+0xe0, 0x6d, 0x68, 0x61, 0x69, 0x72, 0x3b, 0x41, 0x6e, 0x20, 0x74, 0x2d,
+0x53, 0x61, 0x6d, 0x68, 0x61, 0x69, 0x6e, 0x3b, 0x41, 0x6e, 0x20, 0x44,
+0xf9, 0x62, 0x68, 0x6c, 0x61, 0x63, 0x68, 0x64, 0x64, 0x68, 0x65, 0x6e,
+0x20, 0x46, 0x68, 0x61, 0x6f, 0x69, 0x6c, 0x6c, 0x65, 0x61, 0x63, 0x68,
+0x3b, 0x64, 0x68, 0x65, 0x6e, 0x20, 0x47, 0x68, 0x65, 0x61, 0x72, 0x72,
+0x61, 0x6e, 0x3b, 0x64, 0x68, 0x65, 0x6e, 0x20, 0x4d, 0x68, 0xe0, 0x72,
+0x74, 0x3b, 0x64, 0x68, 0x65, 0x6e, 0x20, 0x47, 0x68, 0x69, 0x62, 0x6c,
+0x65, 0x61, 0x6e, 0x3b, 0x64, 0x68, 0x65, 0x6e, 0x20, 0x43, 0x68, 0xe8,
+0x69, 0x74, 0x65, 0x61, 0x6e, 0x3b, 0x64, 0x68, 0x65, 0x6e, 0x20, 0xd2,
+0x67, 0x6d, 0x68, 0x69, 0x6f, 0x73, 0x3b, 0x64, 0x68, 0x65, 0x6e, 0x20,
+0x49, 0x75, 0x63, 0x68, 0x61, 0x72, 0x3b, 0x64, 0x68, 0x65, 0x6e, 0x20,
+0x4c, 0xf9, 0x6e, 0x61, 0x73, 0x74, 0x61, 0x6c, 0x3b, 0x64, 0x68, 0x65,
+0x6e, 0x20, 0x74, 0x2d, 0x53, 0x75, 0x6c, 0x74, 0x61, 0x69, 0x6e, 0x3b,
+0x64, 0x68, 0x65, 0x6e, 0x20, 0x44, 0xe0, 0x6d, 0x68, 0x61, 0x69, 0x72,
+0x3b, 0x64, 0x68, 0x65, 0x6e, 0x20, 0x74, 0x2d, 0x53, 0x61, 0x6d, 0x68,
+0x61, 0x69, 0x6e, 0x3b, 0x64, 0x68, 0x65, 0x6e, 0x20, 0x44, 0xf9, 0x62,
+0x68, 0x6c, 0x61, 0x63, 0x68, 0x64, 0x46, 0x61, 0x6f, 0x69, 0x3b, 0x47,
+0x65, 0x61, 0x72, 0x72, 0x3b, 0x4d, 0xe0, 0x72, 0x74, 0x3b, 0x47, 0x69,
+0x62, 0x6c, 0x3b, 0x43, 0xe8, 0x69, 0x74, 0x3b, 0xd2, 0x67, 0x6d, 0x68,
+0x3b, 0x49, 0x75, 0x63, 0x68, 0x3b, 0x4c, 0xf9, 0x6e, 0x61, 0x3b, 0x53,
+0x75, 0x6c, 0x74, 0x3b, 0x44, 0xe0, 0x6d, 0x68, 0x3b, 0x53, 0x61, 0x6d,
+0x68, 0x3b, 0x44, 0xf9, 0x62, 0x68, 0x46, 0x3b, 0x47, 0x3b, 0x4d, 0x3b,
+0x47, 0x3b, 0x43, 0x3b, 0xd2, 0x3b, 0x49, 0x3b, 0x4c, 0x3b, 0x53, 0x3b,
+0x44, 0x3b, 0x53, 0x3b, 0x44, 0x41, 0x68, 0x61, 0x72, 0x61, 0x62, 0x61,
+0x74, 0x61, 0x3b, 0x4f, 0x66, 0x6c, 0x254, 0x3b, 0x4f, 0x74, 0x73, 0x6f,
+0x6b, 0x72, 0x69, 0x6b, 0x72, 0x69, 0x3b, 0x41, 0x62, 0x65, 0x69, 0x62,
+0x65, 0x3b, 0x41, 0x67, 0x62, 0x69, 0x25b, 0x6e, 0x61, 0x61, 0x3b, 0x4f,
+0x74, 0x75, 0x6b, 0x77, 0x61, 0x6a, 0x61, 0x6e, 0x3b, 0x4d, 0x61, 0x61,
+0x77, 0x25b, 0x3b, 0x4d, 0x61, 0x6e, 0x79, 0x61, 0x77, 0x61, 0x6c, 0x65,
+0x3b, 0x47, 0x62, 0x6f, 0x3b, 0x41, 0x6e, 0x74, 0x254, 0x14b, 0x3b, 0x41,
+0x6c, 0x65, 0x6d, 0x6c, 0x65, 0x3b, 0x41, 0x66, 0x75, 0x61, 0x62, 0x65,
+0x41, 0x68, 0x61, 0x72, 0x61, 0x62, 0x61, 0x74, 0x61, 0x3b, 0x4f, 0x66,
+0x6c, 0x254, 0x3b, 0x4f, 0x74, 0x73, 0x6f, 0x6b, 0x72, 0x69, 0x6b, 0x72,
+0x69, 0x3b, 0x41, 0x62, 0x65, 0x69, 0x62, 0x65, 0x3b, 0x41, 0x67, 0x62,
+0x69, 0x25b, 0x6e, 0x61, 0x61, 0x3b, 0x4f, 0x74, 0x75, 0x6b, 0x77, 0x61,
+0x6a, 0x61, 0x14b, 0x3b, 0x4d, 0x61, 0x61, 0x77, 0x25b, 0x3b, 0x4d, 0x61,
+0x6e, 0x79, 0x61, 0x77, 0x61, 0x6c, 0x65, 0x3b, 0x47, 0x62, 0x6f, 0x3b,
+0x41, 0x6e, 0x74, 0x254, 0x14b, 0x3b, 0x41, 0x6c, 0x65, 0x6d, 0x6c, 0x65,
+0x3b, 0x41, 0x66, 0x75, 0x61, 0x62, 0x65, 0x41, 0x68, 0x61, 0x3b, 0x4f,
+0x66, 0x6c, 0x3b, 0x4f, 0x74, 0x73, 0x3b, 0x41, 0x62, 0x65, 0x3b, 0x41,
+0x67, 0x62, 0x3b, 0x4f, 0x74, 0x75, 0x3b, 0x4d, 0x61, 0x61, 0x3b, 0x4d,
+0x61, 0x6e, 0x3b, 0x47, 0x62, 0x6f, 0x3b, 0x41, 0x6e, 0x74, 0x3b, 0x41,
+0x6c, 0x65, 0x3b, 0x41, 0x66, 0x75, 0x41, 0x3b, 0x4f, 0x3b, 0x4f, 0x3b,
+0x41, 0x3b, 0x41, 0x3b, 0x4f, 0x3b, 0x4d, 0x3b, 0x4d, 0x3b, 0x47, 0x3b,
+0x41, 0x3b, 0x41, 0x3b, 0x41, 0x78, 0x61, 0x6e, 0x65, 0x69, 0x72, 0x6f,
+0x3b, 0x66, 0x65, 0x62, 0x72, 0x65, 0x69, 0x72, 0x6f, 0x3b, 0x6d, 0x61,
+0x72, 0x7a, 0x6f, 0x3b, 0x61, 0x62, 0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x61,
+0x69, 0x6f, 0x3b, 0x78, 0x75, 0xf1, 0x6f, 0x3b, 0x78, 0x75, 0x6c, 0x6c,
+0x6f, 0x3b, 0x61, 0x67, 0x6f, 0x73, 0x74, 0x6f, 0x3b, 0x73, 0x65, 0x74,
+0x65, 0x6d, 0x62, 0x72, 0x6f, 0x3b, 0x6f, 0x75, 0x74, 0x75, 0x62, 0x72,
+0x6f, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x6f, 0x3b, 0x64,
+0x65, 0x63, 0x65, 0x6d, 0x62, 0x72, 0x6f, 0x78, 0x61, 0x6e, 0x2e, 0x3b,
+0x66, 0x65, 0x62, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x2e, 0x3b, 0x61, 0x62,
+0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x69, 0x6f, 0x3b, 0x78, 0x75, 0xf1, 0x6f,
+0x3b, 0x78, 0x75, 0x6c, 0x2e, 0x3b, 0x61, 0x67, 0x6f, 0x2e, 0x3b, 0x73,
+0x65, 0x74, 0x2e, 0x3b, 0x6f, 0x75, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76,
+0x2e, 0x3b, 0x64, 0x65, 0x63, 0x2e, 0x58, 0x3b, 0x46, 0x3b, 0x4d, 0x3b,
+0x41, 0x3b, 0x4d, 0x3b, 0x58, 0x3b, 0x58, 0x3b, 0x41, 0x3b, 0x53, 0x3b,
+0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x78, 0x2e, 0x3b, 0x66, 0x2e, 0x3b, 0x6d,
+0x2e, 0x3b, 0x61, 0x2e, 0x3b, 0x6d, 0x2e, 0x3b, 0x78, 0x2e, 0x3b, 0x78,
+0x2e, 0x3b, 0x61, 0x2e, 0x3b, 0x73, 0x2e, 0x3b, 0x6f, 0x2e, 0x3b, 0x6e,
+0x2e, 0x3b, 0x64, 0x2e, 0x4a, 0x61, 0x6e, 0x77, 0x61, 0x6c, 0x69, 0x79,
+0x6f, 0x3b, 0x46, 0x65, 0x62, 0x77, 0x61, 0x6c, 0x69, 0x79, 0x6f, 0x3b,
+0x4d, 0x61, 0x72, 0x69, 0x73, 0x69, 0x3b, 0x41, 0x70, 0x75, 0x6c, 0x69,
+0x3b, 0x4d, 0x61, 0x61, 0x79, 0x69, 0x3b, 0x4a, 0x75, 0x75, 0x6e, 0x69,
+0x3b, 0x4a, 0x75, 0x6c, 0x61, 0x61, 0x79, 0x69, 0x3b, 0x41, 0x67, 0x75,
+0x73, 0x69, 0x74, 0x6f, 0x3b, 0x53, 0x65, 0x62, 0x75, 0x74, 0x74, 0x65,
+0x6d, 0x62, 0x61, 0x3b, 0x4f, 0x6b, 0x69, 0x74, 0x6f, 0x62, 0x62, 0x61,
+0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x44, 0x65, 0x73,
+0x65, 0x6d, 0x62, 0x61, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b,
+0x4d, 0x61, 0x72, 0x3b, 0x41, 0x70, 0x75, 0x3b, 0x4d, 0x61, 0x61, 0x3b,
+0x4a, 0x75, 0x75, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x75, 0x3b,
+0x53, 0x65, 0x62, 0x3b, 0x4f, 0x6b, 0x69, 0x3b, 0x4e, 0x6f, 0x76, 0x3b,
+0x44, 0x65, 0x73, 0x1320, 0x1210, 0x1228, 0x3b, 0x12a8, 0x1270, 0x1270, 0x3b, 0x1218,
+0x1308, 0x1260, 0x3b, 0x12a0, 0x1280, 0x12d8, 0x3b, 0x130d, 0x1295, 0x1263, 0x1275, 0x3b,
+0x1220, 0x1295, 0x12e8, 0x3b, 0x1210, 0x1218, 0x1208, 0x3b, 0x1290, 0x1210, 0x1230, 0x3b,
+0x12a8, 0x1228, 0x1218, 0x3b, 0x1320, 0x1240, 0x1218, 0x3b, 0x1280, 0x12f0, 0x1228, 0x3b,
+0x1280, 0x1220, 0x1220, 0x1320, 0x3b, 0x12a8, 0x3b, 0x1218, 0x3b, 0x12a0, 0x3b, 0x130d,
+0x3b, 0x1220, 0x3b, 0x1210, 0x3b, 0x1290, 0x3b, 0x12a8, 0x3b, 0x1320, 0x3b, 0x1280,
+0x3b, 0x1280, 0x10d8, 0x10d0, 0x10dc, 0x10d5, 0x10d0, 0x10e0, 0x10d8, 0x3b, 0x10d7, 0x10d4,
+0x10d1, 0x10d4, 0x10e0, 0x10d5, 0x10d0, 0x10da, 0x10d8, 0x3b, 0x10db, 0x10d0, 0x10e0, 0x10e2,
+0x10d8, 0x3b, 0x10d0, 0x10de, 0x10e0, 0x10d8, 0x10da, 0x10d8, 0x3b, 0x10db, 0x10d0, 0x10d8,
+0x10e1, 0x10d8, 0x3b, 0x10d8, 0x10d5, 0x10dc, 0x10d8, 0x10e1, 0x10d8, 0x3b, 0x10d8, 0x10d5,
+0x10da, 0x10d8, 0x10e1, 0x10d8, 0x3b, 0x10d0, 0x10d2, 0x10d5, 0x10d8, 0x10e1, 0x10e2, 0x10dd,
+0x3b, 0x10e1, 0x10d4, 0x10e5, 0x10e2, 0x10d4, 0x10db, 0x10d1, 0x10d4, 0x10e0, 0x10d8, 0x3b,
+0x10dd, 0x10e5, 0x10e2, 0x10dd, 0x10db, 0x10d1, 0x10d4, 0x10e0, 0x10d8, 0x3b, 0x10dc, 0x10dd,
+0x10d4, 0x10db, 0x10d1, 0x10d4, 0x10e0, 0x10d8, 0x3b, 0x10d3, 0x10d4, 0x10d9, 0x10d4, 0x10db,
+0x10d1, 0x10d4, 0x10e0, 0x10d8, 0x10d8, 0x10d0, 0x10dc, 0x3b, 0x10d7, 0x10d4, 0x10d1, 0x3b,
+0x10db, 0x10d0, 0x10e0, 0x3b, 0x10d0, 0x10de, 0x10e0, 0x3b, 0x10db, 0x10d0, 0x10d8, 0x3b,
+0x10d8, 0x10d5, 0x10dc, 0x3b, 0x10d8, 0x10d5, 0x10da, 0x3b, 0x10d0, 0x10d2, 0x10d5, 0x3b,
+0x10e1, 0x10d4, 0x10e5, 0x3b, 0x10dd, 0x10e5, 0x10e2, 0x3b, 0x10dc, 0x10dd, 0x10d4, 0x3b,
+0x10d3, 0x10d4, 0x10d9, 0x10d8, 0x3b, 0x10d7, 0x3b, 0x10db, 0x3b, 0x10d0, 0x3b, 0x10db,
+0x3b, 0x10d8, 0x3b, 0x10d8, 0x3b, 0x10d0, 0x3b, 0x10e1, 0x3b, 0x10dd, 0x3b, 0x10dc,
+0x3b, 0x10d3, 0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x3b, 0x46, 0x65, 0x62,
+0x72, 0x75, 0x61, 0x72, 0x3b, 0x4d, 0xe4, 0x72, 0x7a, 0x3b, 0x41, 0x70,
+0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69,
+0x3b, 0x4a, 0x75, 0x6c, 0x69, 0x3b, 0x41, 0x75, 0x67, 0x75, 0x73, 0x74,
+0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4f,
+0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d,
+0x62, 0x65, 0x72, 0x3b, 0x44, 0x65, 0x7a, 0x65, 0x6d, 0x62, 0x65, 0x72,
+0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0xe4, 0x72, 0x3b,
+0x41, 0x70, 0x72, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b,
+0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x75, 0x67, 0x3b, 0x53, 0x65, 0x70, 0x3b,
+0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x7a, 0x4a,
+0x61, 0x6e, 0x2e, 0x3b, 0x46, 0x65, 0x62, 0x2e, 0x3b, 0x4d, 0xe4, 0x72,
+0x7a, 0x3b, 0x41, 0x70, 0x72, 0x2e, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a,
+0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x69, 0x3b, 0x41, 0x75, 0x67,
+0x2e, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x2e, 0x3b, 0x4f, 0x6b, 0x74, 0x2e,
+0x3b, 0x4e, 0x6f, 0x76, 0x2e, 0x3b, 0x44, 0x65, 0x7a, 0x2e, 0x4a, 0xe4,
+0x6e, 0x6e, 0x65, 0x72, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72,
+0x3b, 0x4d, 0xe4, 0x72, 0x7a, 0x3b, 0x41, 0x70, 0x72, 0x69, 0x6c, 0x3b,
+0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c,
+0x69, 0x3b, 0x41, 0x75, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x53, 0x65, 0x70,
+0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62,
+0x65, 0x72, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b,
+0x44, 0x65, 0x7a, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x4a, 0xe4, 0x6e, 0x3b,
+0x46, 0x65, 0x62, 0x3b, 0x4d, 0xe4, 0x72, 0x3b, 0x41, 0x70, 0x72, 0x3b,
+0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b,
+0x41, 0x75, 0x67, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b,
+0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x7a, 0x4a, 0xe4, 0x6e, 0x2e, 0x3b,
+0x46, 0x65, 0x62, 0x2e, 0x3b, 0x4d, 0xe4, 0x72, 0x7a, 0x3b, 0x41, 0x70,
+0x72, 0x2e, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b,
+0x4a, 0x75, 0x6c, 0x69, 0x3b, 0x41, 0x75, 0x67, 0x2e, 0x3b, 0x53, 0x65,
+0x70, 0x2e, 0x3b, 0x4f, 0x6b, 0x74, 0x2e, 0x3b, 0x4e, 0x6f, 0x76, 0x2e,
+0x3b, 0x44, 0x65, 0x7a, 0x2e, 0x399, 0x3b1, 0x3bd, 0x3bf, 0x3c5, 0x3ac, 0x3c1,
+0x3b9, 0x3bf, 0x3c2, 0x3b, 0x3a6, 0x3b5, 0x3b2, 0x3c1, 0x3bf, 0x3c5, 0x3ac, 0x3c1,
+0x3b9, 0x3bf, 0x3c2, 0x3b, 0x39c, 0x3ac, 0x3c1, 0x3c4, 0x3b9, 0x3bf, 0x3c2, 0x3b,
+0x391, 0x3c0, 0x3c1, 0x3af, 0x3bb, 0x3b9, 0x3bf, 0x3c2, 0x3b, 0x39c, 0x3ac, 0x3b9,
+0x3bf, 0x3c2, 0x3b, 0x399, 0x3bf, 0x3cd, 0x3bd, 0x3b9, 0x3bf, 0x3c2, 0x3b, 0x399,
+0x3bf, 0x3cd, 0x3bb, 0x3b9, 0x3bf, 0x3c2, 0x3b, 0x391, 0x3cd, 0x3b3, 0x3bf, 0x3c5,
+0x3c3, 0x3c4, 0x3bf, 0x3c2, 0x3b, 0x3a3, 0x3b5, 0x3c0, 0x3c4, 0x3ad, 0x3bc, 0x3b2,
+0x3c1, 0x3b9, 0x3bf, 0x3c2, 0x3b, 0x39f, 0x3ba, 0x3c4, 0x3ce, 0x3b2, 0x3c1, 0x3b9,
+0x3bf, 0x3c2, 0x3b, 0x39d, 0x3bf, 0x3ad, 0x3bc, 0x3b2, 0x3c1, 0x3b9, 0x3bf, 0x3c2,
+0x3b, 0x394, 0x3b5, 0x3ba, 0x3ad, 0x3bc, 0x3b2, 0x3c1, 0x3b9, 0x3bf, 0x3c2, 0x399,
+0x3b1, 0x3bd, 0x3bf, 0x3c5, 0x3b1, 0x3c1, 0x3af, 0x3bf, 0x3c5, 0x3b, 0x3a6, 0x3b5,
+0x3b2, 0x3c1, 0x3bf, 0x3c5, 0x3b1, 0x3c1, 0x3af, 0x3bf, 0x3c5, 0x3b, 0x39c, 0x3b1,
+0x3c1, 0x3c4, 0x3af, 0x3bf, 0x3c5, 0x3b, 0x391, 0x3c0, 0x3c1, 0x3b9, 0x3bb, 0x3af,
+0x3bf, 0x3c5, 0x3b, 0x39c, 0x3b1, 0x390, 0x3bf, 0x3c5, 0x3b, 0x399, 0x3bf, 0x3c5,
+0x3bd, 0x3af, 0x3bf, 0x3c5, 0x3b, 0x399, 0x3bf, 0x3c5, 0x3bb, 0x3af, 0x3bf, 0x3c5,
+0x3b, 0x391, 0x3c5, 0x3b3, 0x3bf, 0x3cd, 0x3c3, 0x3c4, 0x3bf, 0x3c5, 0x3b, 0x3a3,
+0x3b5, 0x3c0, 0x3c4, 0x3b5, 0x3bc, 0x3b2, 0x3c1, 0x3af, 0x3bf, 0x3c5, 0x3b, 0x39f,
+0x3ba, 0x3c4, 0x3c9, 0x3b2, 0x3c1, 0x3af, 0x3bf, 0x3c5, 0x3b, 0x39d, 0x3bf, 0x3b5,
+0x3bc, 0x3b2, 0x3c1, 0x3af, 0x3bf, 0x3c5, 0x3b, 0x394, 0x3b5, 0x3ba, 0x3b5, 0x3bc,
+0x3b2, 0x3c1, 0x3af, 0x3bf, 0x3c5, 0x399, 0x3b1, 0x3bd, 0x3b, 0x3a6, 0x3b5, 0x3b2,
+0x3b, 0x39c, 0x3ac, 0x3c1, 0x3b, 0x391, 0x3c0, 0x3c1, 0x3b, 0x39c, 0x3ac, 0x3b9,
+0x3b, 0x399, 0x3bf, 0x3cd, 0x3bd, 0x3b, 0x399, 0x3bf, 0x3cd, 0x3bb, 0x3b, 0x391,
+0x3cd, 0x3b3, 0x3b, 0x3a3, 0x3b5, 0x3c0, 0x3b, 0x39f, 0x3ba, 0x3c4, 0x3b, 0x39d,
+0x3bf, 0x3ad, 0x3b, 0x394, 0x3b5, 0x3ba, 0x399, 0x3b1, 0x3bd, 0x3b, 0x3a6, 0x3b5,
+0x3b2, 0x3b, 0x39c, 0x3b1, 0x3c1, 0x3b, 0x391, 0x3c0, 0x3c1, 0x3b, 0x39c, 0x3b1,
+0x390, 0x3b, 0x399, 0x3bf, 0x3c5, 0x3bd, 0x3b, 0x399, 0x3bf, 0x3c5, 0x3bb, 0x3b,
+0x391, 0x3c5, 0x3b3, 0x3b, 0x3a3, 0x3b5, 0x3c0, 0x3b, 0x39f, 0x3ba, 0x3c4, 0x3b,
+0x39d, 0x3bf, 0x3b5, 0x3b, 0x394, 0x3b5, 0x3ba, 0x399, 0x3b, 0x3a6, 0x3b, 0x39c,
+0x3b, 0x391, 0x3b, 0x39c, 0x3b, 0x399, 0x3b, 0x399, 0x3b, 0x391, 0x3b, 0x3a3,
+0x3b, 0x39f, 0x3b, 0x39d, 0x3b, 0x394, 0x4a, 0x61, 0x73, 0x79, 0x74, 0x65,
+0x129, 0x3b, 0x4a, 0x61, 0x73, 0x79, 0x6b, 0xf5, 0x69, 0x3b, 0x4a, 0x61,
+0x73, 0x79, 0x61, 0x70, 0x79, 0x3b, 0x4a, 0x61, 0x73, 0x79, 0x72, 0x75,
+0x6e, 0x64, 0x79, 0x3b, 0x4a, 0x61, 0x73, 0x79, 0x70, 0x6f, 0x3b, 0x4a,
+0x61, 0x73, 0x79, 0x70, 0x6f, 0x74, 0x65, 0x129, 0x3b, 0x4a, 0x61, 0x73,
+0x79, 0x70, 0x6f, 0x6b, 0xf5, 0x69, 0x3b, 0x4a, 0x61, 0x73, 0x79, 0x70,
+0x6f, 0x61, 0x70, 0x79, 0x3b, 0x4a, 0x61, 0x73, 0x79, 0x70, 0x6f, 0x72,
+0x75, 0x6e, 0x64, 0x79, 0x3b, 0x4a, 0x61, 0x73, 0x79, 0x70, 0x61, 0x3b,
+0x4a, 0x61, 0x73, 0x79, 0x70, 0x61, 0x74, 0x65, 0x129, 0x3b, 0x4a, 0x61,
+0x73, 0x79, 0x70, 0x61, 0x6b, 0xf5, 0x69, 0xa9c, 0xabe, 0xaa8, 0xacd, 0xaaf,
+0xac1, 0xa86, 0xab0, 0xac0, 0x3b, 0xaab, 0xac7, 0xaac, 0xacd, 0xab0, 0xac1, 0xa86,
+0xab0, 0xac0, 0x3b, 0xaae, 0xabe, 0xab0, 0xacd, 0xa9a, 0x3b, 0xa8f, 0xaaa, 0xacd,
+0xab0, 0xabf, 0xab2, 0x3b, 0xaae, 0xac7, 0x3b, 0xa9c, 0xac2, 0xaa8, 0x3b, 0xa9c,
+0xac1, 0xab2, 0xabe, 0xa88, 0x3b, 0xa91, 0xa97, 0xab8, 0xacd, 0xa9f, 0x3b, 0xab8,
+0xaaa, 0xacd, 0xa9f, 0xac7, 0xaae, 0xacd, 0xaac, 0xab0, 0x3b, 0xa91, 0xa95, 0xacd,
+0xa9f, 0xacb, 0xaac, 0xab0, 0x3b, 0xaa8, 0xab5, 0xac7, 0xaae, 0xacd, 0xaac, 0xab0,
+0x3b, 0xaa1, 0xabf, 0xab8, 0xac7, 0xaae, 0xacd, 0xaac, 0xab0, 0xa9c, 0xabe, 0xaa8,
+0xacd, 0xaaf, 0xac1, 0x3b, 0xaab, 0xac7, 0xaac, 0xacd, 0xab0, 0xac1, 0x3b, 0xaae,
+0xabe, 0xab0, 0xacd, 0xa9a, 0x3b, 0xa8f, 0xaaa, 0xacd, 0xab0, 0xabf, 0xab2, 0x3b,
+0xaae, 0xac7, 0x3b, 0xa9c, 0xac2, 0xaa8, 0x3b, 0xa9c, 0xac1, 0xab2, 0xabe, 0xa88,
+0x3b, 0xa91, 0xa97, 0xab8, 0xacd, 0xa9f, 0x3b, 0xab8, 0xaaa, 0xacd, 0xa9f, 0xac7,
+0x3b, 0xa91, 0xa95, 0xacd, 0xa9f, 0xacb, 0x3b, 0xaa8, 0xab5, 0xac7, 0x3b, 0xaa1,
+0xabf, 0xab8, 0xac7, 0xa9c, 0xabe, 0x3b, 0xaab, 0xac7, 0x3b, 0xaae, 0xabe, 0x3b,
+0xa8f, 0x3b, 0xaae, 0xac7, 0x3b, 0xa9c, 0xac2, 0x3b, 0xa9c, 0xac1, 0x3b, 0xa91,
+0x3b, 0xab8, 0x3b, 0xa91, 0x3b, 0xaa8, 0x3b, 0xaa1, 0xabf, 0x43, 0x68, 0x61,
+0x6e, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x46, 0x65, 0x62, 0x75, 0x72, 0x61,
+0x72, 0x69, 0x3b, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x3b, 0x41, 0x70, 0x69,
+0x72, 0x69, 0x72, 0x69, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e,
+0x69, 0x3b, 0x43, 0x68, 0x75, 0x6c, 0x61, 0x69, 0x3b, 0x41, 0x67, 0x6f,
+0x73, 0x74, 0x69, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x61,
+0x3b, 0x4f, 0x6b, 0x69, 0x74, 0x6f, 0x62, 0x61, 0x3b, 0x4e, 0x6f, 0x62,
+0x65, 0x6d, 0x62, 0x61, 0x3b, 0x44, 0x69, 0x73, 0x65, 0x6d, 0x62, 0x61,
+0x43, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x63, 0x3b,
+0x41, 0x70, 0x72, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b,
+0x43, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x74, 0x3b, 0x53, 0x65, 0x70, 0x3b,
+0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x62, 0x3b, 0x44, 0x69, 0x73, 0x43,
+0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x43,
+0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x4a, 0x61,
+0x6e, 0x61, 0x69, 0x72, 0x75, 0x3b, 0x46, 0x61, 0x62, 0x75, 0x72, 0x61,
+0x69, 0x72, 0x75, 0x3b, 0x4d, 0x61, 0x72, 0x69, 0x73, 0x3b, 0x41, 0x66,
+0x69, 0x72, 0x69, 0x6c, 0x75, 0x3b, 0x4d, 0x61, 0x79, 0x75, 0x3b, 0x59,
+0x75, 0x6e, 0x69, 0x3b, 0x59, 0x75, 0x6c, 0x69, 0x3b, 0x41, 0x67, 0x75,
+0x73, 0x74, 0x61, 0x3b, 0x53, 0x61, 0x74, 0x75, 0x6d, 0x62, 0x61, 0x3b,
+0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x61, 0x3b, 0x4e, 0x75, 0x77, 0x61, 0x6d,
+0x62, 0x61, 0x3b, 0x44, 0x69, 0x73, 0x61, 0x6d, 0x62, 0x61, 0x4a, 0x61,
+0x6e, 0x3b, 0x46, 0x61, 0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x66,
+0x69, 0x3b, 0x4d, 0x61, 0x79, 0x3b, 0x59, 0x75, 0x6e, 0x3b, 0x59, 0x75,
+0x6c, 0x3b, 0x41, 0x67, 0x75, 0x3b, 0x53, 0x61, 0x74, 0x3b, 0x4f, 0x6b,
+0x74, 0x3b, 0x4e, 0x75, 0x77, 0x3b, 0x44, 0x69, 0x73, 0x4a, 0x3b, 0x46,
+0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x59, 0x3b, 0x59, 0x3b, 0x41,
+0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x62c, 0x64e, 0x646, 0x64e,
+0x64a, 0x652, 0x631, 0x64f, 0x3b, 0x6a2, 0x64e, 0x628, 0x652, 0x631, 0x64e, 0x64a,
+0x652, 0x631, 0x64f, 0x3b, 0x645, 0x64e, 0x631, 0x650, 0x633, 0x652, 0x3b, 0x623,
+0x64e, 0x6a2, 0x652, 0x631, 0x650, 0x644, 0x64f, 0x3b, 0x645, 0x64e, 0x64a, 0x64f,
+0x3b, 0x64a, 0x64f, 0x648, 0x646, 0x650, 0x3b, 0x64a, 0x64f, 0x648, 0x644, 0x650,
+0x3b, 0x623, 0x64e, 0x63a, 0x64f, 0x633, 0x652, 0x62a, 0x64e, 0x3b, 0x633, 0x64e,
+0x62a, 0x64f, 0x645, 0x652, 0x628, 0x64e, 0x3b, 0x623, 0x64f, 0x643, 0x652, 0x62a,
+0x648, 0x64f, 0x628, 0x64e, 0x3b, 0x646, 0x64f, 0x648, 0x64e, 0x645, 0x652, 0x628,
+0x64e, 0x3b, 0x62f, 0x650, 0x633, 0x64e, 0x645, 0x652, 0x628, 0x64e, 0x62c, 0x64e,
+0x646, 0x3b, 0x6a2, 0x64e, 0x628, 0x3b, 0x645, 0x64e, 0x631, 0x3b, 0x623, 0x64e,
+0x6a2, 0x652, 0x631, 0x3b, 0x645, 0x64e, 0x64a, 0x3b, 0x64a, 0x64f, 0x648, 0x646,
+0x3b, 0x64a, 0x64f, 0x648, 0x644, 0x3b, 0x623, 0x64e, 0x63a, 0x64f, 0x3b, 0x633,
+0x64e, 0x62a, 0x3b, 0x623, 0x64f, 0x643, 0x652, 0x62a, 0x3b, 0x646, 0x64f, 0x648,
+0x3b, 0x62f, 0x650, 0x633, 0x49, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x69, 0x3b,
+0x50, 0x65, 0x70, 0x65, 0x6c, 0x75, 0x61, 0x6c, 0x69, 0x3b, 0x4d, 0x61,
+0x6c, 0x61, 0x6b, 0x69, 0x3b, 0x2bb, 0x41, 0x70, 0x65, 0x6c, 0x69, 0x6c,
+0x61, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x49, 0x75, 0x6e, 0x65, 0x3b, 0x49,
+0x75, 0x6c, 0x61, 0x69, 0x3b, 0x2bb, 0x41, 0x75, 0x6b, 0x61, 0x6b, 0x65,
+0x3b, 0x4b, 0x65, 0x70, 0x61, 0x6b, 0x65, 0x6d, 0x61, 0x70, 0x61, 0x3b,
+0x2bb, 0x4f, 0x6b, 0x61, 0x6b, 0x6f, 0x70, 0x61, 0x3b, 0x4e, 0x6f, 0x77,
+0x65, 0x6d, 0x61, 0x70, 0x61, 0x3b, 0x4b, 0x65, 0x6b, 0x65, 0x6d, 0x61,
+0x70, 0x61, 0x49, 0x61, 0x6e, 0x2e, 0x3b, 0x50, 0x65, 0x70, 0x2e, 0x3b,
+0x4d, 0x61, 0x6c, 0x2e, 0x3b, 0x2bb, 0x41, 0x70, 0x2e, 0x3b, 0x4d, 0x65,
+0x69, 0x3b, 0x49, 0x75, 0x6e, 0x2e, 0x3b, 0x49, 0x75, 0x6c, 0x2e, 0x3b,
+0x2bb, 0x41, 0x75, 0x2e, 0x3b, 0x4b, 0x65, 0x70, 0x2e, 0x3b, 0x2bb, 0x4f,
+0x6b, 0x2e, 0x3b, 0x4e, 0x6f, 0x77, 0x2e, 0x3b, 0x4b, 0x65, 0x6b, 0x2e,
+0x5d9, 0x5e0, 0x5d5, 0x5d0, 0x5e8, 0x3b, 0x5e4, 0x5d1, 0x5e8, 0x5d5, 0x5d0, 0x5e8,
+0x3b, 0x5de, 0x5e8, 0x5e5, 0x3b, 0x5d0, 0x5e4, 0x5e8, 0x5d9, 0x5dc, 0x3b, 0x5de,
+0x5d0, 0x5d9, 0x3b, 0x5d9, 0x5d5, 0x5e0, 0x5d9, 0x3b, 0x5d9, 0x5d5, 0x5dc, 0x5d9,
+0x3b, 0x5d0, 0x5d5, 0x5d2, 0x5d5, 0x5e1, 0x5d8, 0x3b, 0x5e1, 0x5e4, 0x5d8, 0x5de,
+0x5d1, 0x5e8, 0x3b, 0x5d0, 0x5d5, 0x5e7, 0x5d8, 0x5d5, 0x5d1, 0x5e8, 0x3b, 0x5e0,
+0x5d5, 0x5d1, 0x5de, 0x5d1, 0x5e8, 0x3b, 0x5d3, 0x5e6, 0x5de, 0x5d1, 0x5e8, 0x5d9,
+0x5e0, 0x5d5, 0x5f3, 0x3b, 0x5e4, 0x5d1, 0x5e8, 0x5f3, 0x3b, 0x5de, 0x5e8, 0x5e5,
+0x3b, 0x5d0, 0x5e4, 0x5e8, 0x5f3, 0x3b, 0x5de, 0x5d0, 0x5d9, 0x3b, 0x5d9, 0x5d5,
+0x5e0, 0x5d9, 0x3b, 0x5d9, 0x5d5, 0x5dc, 0x5d9, 0x3b, 0x5d0, 0x5d5, 0x5d2, 0x5f3,
+0x3b, 0x5e1, 0x5e4, 0x5d8, 0x5f3, 0x3b, 0x5d0, 0x5d5, 0x5e7, 0x5f3, 0x3b, 0x5e0,
+0x5d5, 0x5d1, 0x5f3, 0x3b, 0x5d3, 0x5e6, 0x5de, 0x5f3, 0x91c, 0x928, 0x935, 0x930,
+0x940, 0x3b, 0x92b, 0x93c, 0x930, 0x935, 0x930, 0x940, 0x3b, 0x92e, 0x93e, 0x930,
+0x94d, 0x91a, 0x3b, 0x905, 0x92a, 0x94d, 0x930, 0x948, 0x932, 0x3b, 0x92e, 0x908,
+0x3b, 0x91c, 0x942, 0x928, 0x3b, 0x91c, 0x941, 0x932, 0x93e, 0x908, 0x3b, 0x905,
+0x917, 0x938, 0x94d, 0x924, 0x3b, 0x938, 0x93f, 0x924, 0x902, 0x92c, 0x930, 0x3b,
+0x905, 0x915, 0x94d, 0x924, 0x942, 0x92c, 0x930, 0x3b, 0x928, 0x935, 0x902, 0x92c,
+0x930, 0x3b, 0x926, 0x93f, 0x938, 0x902, 0x92c, 0x930, 0x91c, 0x928, 0x970, 0x3b,
+0x92b, 0x93c, 0x930, 0x970, 0x3b, 0x92e, 0x93e, 0x930, 0x94d, 0x91a, 0x3b, 0x905,
+0x92a, 0x94d, 0x930, 0x948, 0x932, 0x3b, 0x92e, 0x908, 0x3b, 0x91c, 0x942, 0x928,
+0x3b, 0x91c, 0x941, 0x932, 0x970, 0x3b, 0x905, 0x917, 0x970, 0x3b, 0x938, 0x93f,
+0x924, 0x970, 0x3b, 0x905, 0x915, 0x94d, 0x924, 0x942, 0x970, 0x3b, 0x928, 0x935,
+0x970, 0x3b, 0x926, 0x93f, 0x938, 0x970, 0x91c, 0x3b, 0x92b, 0x93c, 0x3b, 0x92e,
+0x93e, 0x3b, 0x905, 0x3b, 0x92e, 0x3b, 0x91c, 0x942, 0x3b, 0x91c, 0x941, 0x3b,
+0x905, 0x3b, 0x938, 0x93f, 0x3b, 0x905, 0x3b, 0x928, 0x3b, 0x926, 0x93f, 0x6a,
+0x61, 0x6e, 0x75, 0xe1, 0x72, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0xe1,
+0x72, 0x3b, 0x6d, 0xe1, 0x72, 0x63, 0x69, 0x75, 0x73, 0x3b, 0xe1, 0x70,
+0x72, 0x69, 0x6c, 0x69, 0x73, 0x3b, 0x6d, 0xe1, 0x6a, 0x75, 0x73, 0x3b,
+0x6a, 0xfa, 0x6e, 0x69, 0x75, 0x73, 0x3b, 0x6a, 0xfa, 0x6c, 0x69, 0x75,
+0x73, 0x3b, 0x61, 0x75, 0x67, 0x75, 0x73, 0x7a, 0x74, 0x75, 0x73, 0x3b,
+0x73, 0x7a, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6f,
+0x6b, 0x74, 0xf3, 0x62, 0x65, 0x72, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d,
+0x62, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x65, 0x72,
+0x6a, 0x61, 0x6e, 0x2e, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x2e, 0x3b, 0x6d,
+0xe1, 0x72, 0x63, 0x2e, 0x3b, 0xe1, 0x70, 0x72, 0x2e, 0x3b, 0x6d, 0xe1,
+0x6a, 0x2e, 0x3b, 0x6a, 0xfa, 0x6e, 0x2e, 0x3b, 0x6a, 0xfa, 0x6c, 0x2e,
+0x3b, 0x61, 0x75, 0x67, 0x2e, 0x3b, 0x73, 0x7a, 0x65, 0x70, 0x74, 0x2e,
+0x3b, 0x6f, 0x6b, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64,
+0x65, 0x63, 0x2e, 0x4a, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0xc1, 0x3b, 0x4d,
+0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0x41, 0x3b, 0x53, 0x7a, 0x3b, 0x4f, 0x3b,
+0x4e, 0x3b, 0x44, 0x6a, 0x61, 0x6e, 0xfa, 0x61, 0x72, 0x3b, 0x66, 0x65,
+0x62, 0x72, 0xfa, 0x61, 0x72, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x3b, 0x61,
+0x70, 0x72, 0xed, 0x6c, 0x3b, 0x6d, 0x61, 0xed, 0x3b, 0x6a, 0xfa, 0x6e,
+0xed, 0x3b, 0x6a, 0xfa, 0x6c, 0xed, 0x3b, 0xe1, 0x67, 0xfa, 0x73, 0x74,
+0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6f,
+0x6b, 0x74, 0xf3, 0x62, 0x65, 0x72, 0x3b, 0x6e, 0xf3, 0x76, 0x65, 0x6d,
+0x62, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x73, 0x65, 0x6d, 0x62, 0x65, 0x72,
+0x6a, 0x61, 0x6e, 0x2e, 0x3b, 0x66, 0x65, 0x62, 0x2e, 0x3b, 0x6d, 0x61,
+0x72, 0x2e, 0x3b, 0x61, 0x70, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0xed, 0x3b,
+0x6a, 0xfa, 0x6e, 0x2e, 0x3b, 0x6a, 0xfa, 0x6c, 0x2e, 0x3b, 0xe1, 0x67,
+0xfa, 0x2e, 0x3b, 0x73, 0x65, 0x70, 0x2e, 0x3b, 0x6f, 0x6b, 0x74, 0x2e,
+0x3b, 0x6e, 0xf3, 0x76, 0x2e, 0x3b, 0x64, 0x65, 0x73, 0x2e, 0x4a, 0x3b,
+0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b,
+0xc1, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x4a, 0x65, 0x6e,
+0x1ee5, 0x77, 0x61, 0x72, 0x1ecb, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x1ee5, 0x77,
+0x61, 0x72, 0x1ecb, 0x3b, 0x4d, 0x61, 0x61, 0x63, 0x68, 0x1ecb, 0x3b, 0x45,
+0x70, 0x72, 0x65, 0x65, 0x6c, 0x3b, 0x4d, 0x65, 0x65, 0x3b, 0x4a, 0x75,
+0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x61, 0x1ecb, 0x3b, 0x1ecc, 0x67, 0x1ecd,
+0x1ecd, 0x73, 0x74, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x61,
+0x3b, 0x1ecc, 0x6b, 0x74, 0x6f, 0x62, 0x61, 0x3b, 0x4e, 0x6f, 0x76, 0x65,
+0x6d, 0x62, 0x61, 0x3b, 0x44, 0x69, 0x73, 0x65, 0x6d, 0x62, 0x61, 0x4a,
+0x65, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x61, 0x3b, 0x45,
+0x70, 0x72, 0x3b, 0x4d, 0x65, 0x65, 0x3b, 0x4a, 0x75, 0x75, 0x3b, 0x4a,
+0x75, 0x6c, 0x3b, 0x1ecc, 0x67, 0x1ecd, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x1ecc,
+0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x69, 0x73, 0x4a, 0x3b,
+0x46, 0x3b, 0x4d, 0x3b, 0x45, 0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b,
+0x1ecc, 0x3b, 0x53, 0x3b, 0x1ecc, 0x3b, 0x4e, 0x3b, 0x44, 0x75, 0x111, 0x111,
+0xe2, 0x69, 0x76, 0x65, 0x6d, 0xe1, 0xe1, 0x6e, 0x75, 0x3b, 0x6b, 0x75,
+0x6f, 0x76, 0xe2, 0x6d, 0xe1, 0xe1, 0x6e, 0x75, 0x3b, 0x6e, 0x6a, 0x75,
+0x68, 0x10d, 0xe2, 0x6d, 0xe1, 0xe1, 0x6e, 0x75, 0x3b, 0x63, 0x75, 0xe1,
+0x14b, 0x75, 0x69, 0x6d, 0xe1, 0xe1, 0x6e, 0x75, 0x3b, 0x76, 0x79, 0x65,
+0x73, 0x69, 0x6d, 0xe1, 0xe1, 0x6e, 0x75, 0x3b, 0x6b, 0x65, 0x73, 0x69,
+0x6d, 0xe1, 0xe1, 0x6e, 0x75, 0x3b, 0x73, 0x79, 0x65, 0x69, 0x6e, 0x69,
+0x6d, 0xe1, 0xe1, 0x6e, 0x75, 0x3b, 0x70, 0x6f, 0x72, 0x67, 0x65, 0x6d,
+0xe1, 0xe1, 0x6e, 0x75, 0x3b, 0x10d, 0x6f, 0x68, 0x10d, 0xe2, 0x6d, 0xe1,
+0xe1, 0x6e, 0x75, 0x3b, 0x72, 0x6f, 0x6f, 0x76, 0x76, 0xe2, 0x64, 0x6d,
+0xe1, 0xe1, 0x6e, 0x75, 0x3b, 0x73, 0x6b, 0x61, 0x6d, 0x6d, 0xe2, 0x6d,
+0xe1, 0xe1, 0x6e, 0x75, 0x3b, 0x6a, 0x75, 0x6f, 0x76, 0x6c, 0xe2, 0x6d,
+0xe1, 0xe1, 0x6e, 0x75, 0x75, 0x111, 0x69, 0x76, 0x3b, 0x6b, 0x75, 0x6f,
+0x76, 0xe2, 0x3b, 0x6e, 0x6a, 0x75, 0x68, 0x10d, 0xe2, 0x3b, 0x63, 0x75,
+0xe1, 0x14b, 0x75, 0x69, 0x3b, 0x76, 0x79, 0x65, 0x73, 0x69, 0x3b, 0x6b,
+0x65, 0x73, 0x69, 0x3b, 0x73, 0x79, 0x65, 0x69, 0x6e, 0x69, 0x3b, 0x70,
+0x6f, 0x72, 0x67, 0x65, 0x3b, 0x10d, 0x6f, 0x68, 0x10d, 0xe2, 0x3b, 0x72,
+0x6f, 0x6f, 0x76, 0x76, 0xe2, 0x64, 0x3b, 0x73, 0x6b, 0x61, 0x6d, 0x6d,
+0xe2, 0x3b, 0x6a, 0x75, 0x6f, 0x76, 0x6c, 0xe2, 0x55, 0x3b, 0x4b, 0x3b,
+0x4e, 0x4a, 0x3b, 0x43, 0x3b, 0x56, 0x3b, 0x4b, 0x3b, 0x53, 0x3b, 0x50,
+0x3b, 0x10c, 0x3b, 0x52, 0x3b, 0x53, 0x3b, 0x4a, 0x4a, 0x61, 0x6e, 0x75,
+0x61, 0x72, 0x69, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x69,
+0x3b, 0x4d, 0x61, 0x72, 0x65, 0x74, 0x3b, 0x41, 0x70, 0x72, 0x69, 0x6c,
+0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75,
+0x6c, 0x69, 0x3b, 0x41, 0x67, 0x75, 0x73, 0x74, 0x75, 0x73, 0x3b, 0x53,
+0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4f, 0x6b, 0x74,
+0x6f, 0x62, 0x65, 0x72, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65,
+0x72, 0x3b, 0x44, 0x65, 0x73, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x4a, 0x61,
+0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x70,
+0x72, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75,
+0x6c, 0x3b, 0x41, 0x67, 0x75, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b,
+0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x73, 0x6a, 0x61, 0x6e,
+0x75, 0x61, 0x72, 0x69, 0x6f, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61,
+0x72, 0x69, 0x6f, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x69, 0x6f, 0x3b, 0x61,
+0x70, 0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x61, 0x69, 0x6f, 0x3b, 0x6a, 0x75,
+0x6e, 0x69, 0x6f, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x6f, 0x3b, 0x61, 0x75,
+0x67, 0x75, 0x73, 0x74, 0x6f, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d,
+0x62, 0x72, 0x65, 0x3b, 0x6f, 0x63, 0x74, 0x6f, 0x62, 0x72, 0x65, 0x3b,
+0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x64, 0x65, 0x63,
+0x65, 0x6d, 0x62, 0x72, 0x65, 0x6a, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x62,
+0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x61, 0x70, 0x72, 0x3b, 0x6d, 0x61, 0x69,
+0x3b, 0x6a, 0x75, 0x6e, 0x3b, 0x6a, 0x75, 0x6c, 0x3b, 0x61, 0x75, 0x67,
+0x3b, 0x73, 0x65, 0x70, 0x3b, 0x6f, 0x63, 0x74, 0x3b, 0x6e, 0x6f, 0x76,
+0x3b, 0x64, 0x65, 0x63, 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x3b, 0x66,
+0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x65,
+0x3b, 0x61, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x61, 0x79, 0x3b, 0x6a,
+0x75, 0x6e, 0x69, 0x6f, 0x3b, 0x6a, 0x75, 0x6c, 0xed, 0x3b, 0x61, 0x75,
+0x67, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62,
+0x72, 0x65, 0x3b, 0x6f, 0x63, 0x74, 0x6f, 0x62, 0x72, 0x65, 0x3b, 0x6e,
+0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x64, 0x65, 0x63, 0x65,
+0x6d, 0x62, 0x72, 0x65, 0x6a, 0x61, 0x6e, 0x2e, 0x3b, 0x66, 0x65, 0x62,
+0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x2e, 0x3b, 0x61, 0x70, 0x72, 0x2e,
+0x3b, 0x6d, 0x61, 0x79, 0x3b, 0x6a, 0x75, 0x6e, 0x2e, 0x3b, 0x6a, 0x75,
+0x6c, 0xed, 0x3b, 0x61, 0x75, 0x67, 0x2e, 0x3b, 0x73, 0x65, 0x70, 0x74,
+0x2e, 0x3b, 0x6f, 0x63, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b,
+0x64, 0x65, 0x63, 0x2e, 0x152d, 0x14d0, 0x14c4, 0x140a, 0x14d5, 0x3b, 0x1555, 0x155d,
+0x1557, 0x140a, 0x14d5, 0x3b, 0x14ab, 0x1466, 0x14ef, 0x3b, 0x140a, 0x1403, 0x1449, 0x1433,
+0x14d7, 0x3b, 0x14aa, 0x1403, 0x3b, 0x152b, 0x14c2, 0x3b, 0x152a, 0x14da, 0x1403, 0x3b,
+0x140a, 0x1405, 0x14a1, 0x148d, 0x14ef, 0x3b, 0x14ef, 0x144e, 0x1431, 0x1546, 0x3b, 0x1406,
+0x1466, 0x1451, 0x155d, 0x1559, 0x3b, 0x14c4, 0x1555, 0x1431, 0x1546, 0x3b, 0x144e, 0x14ef,
+0x1431, 0x1546, 0x45, 0x61, 0x6e, 0xe1, 0x69, 0x72, 0x3b, 0x46, 0x65, 0x61,
+0x62, 0x68, 0x72, 0x61, 0x3b, 0x4d, 0xe1, 0x72, 0x74, 0x61, 0x3b, 0x41,
+0x69, 0x62, 0x72, 0x65, 0xe1, 0x6e, 0x3b, 0x42, 0x65, 0x61, 0x6c, 0x74,
+0x61, 0x69, 0x6e, 0x65, 0x3b, 0x4d, 0x65, 0x69, 0x74, 0x68, 0x65, 0x61,
+0x6d, 0x68, 0x3b, 0x49, 0xfa, 0x69, 0x6c, 0x3b, 0x4c, 0xfa, 0x6e, 0x61,
+0x73, 0x61, 0x3b, 0x4d, 0x65, 0xe1, 0x6e, 0x20, 0x46, 0xf3, 0x6d, 0x68,
+0x61, 0x69, 0x72, 0x3b, 0x44, 0x65, 0x69, 0x72, 0x65, 0x61, 0x64, 0x68,
+0x20, 0x46, 0xf3, 0x6d, 0x68, 0x61, 0x69, 0x72, 0x3b, 0x53, 0x61, 0x6d,
+0x68, 0x61, 0x69, 0x6e, 0x3b, 0x4e, 0x6f, 0x6c, 0x6c, 0x61, 0x69, 0x67,
+0x45, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x61, 0x62, 0x68, 0x3b, 0x4d, 0xe1,
+0x72, 0x74, 0x61, 0x3b, 0x41, 0x69, 0x62, 0x3b, 0x42, 0x65, 0x61, 0x6c,
+0x3b, 0x4d, 0x65, 0x69, 0x74, 0x68, 0x3b, 0x49, 0xfa, 0x69, 0x6c, 0x3b,
+0x4c, 0xfa, 0x6e, 0x3b, 0x4d, 0x46, 0xf3, 0x6d, 0x68, 0x3b, 0x44, 0x46,
+0xf3, 0x6d, 0x68, 0x3b, 0x53, 0x61, 0x6d, 0x68, 0x3b, 0x4e, 0x6f, 0x6c,
+0x6c, 0x45, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x42, 0x3b, 0x4d,
+0x3b, 0x49, 0x3b, 0x4c, 0x3b, 0x4d, 0x3b, 0x44, 0x3b, 0x53, 0x3b, 0x4e,
+0x67, 0x65, 0x6e, 0x6e, 0x61, 0x69, 0x6f, 0x3b, 0x66, 0x65, 0x62, 0x62,
+0x72, 0x61, 0x69, 0x6f, 0x3b, 0x6d, 0x61, 0x72, 0x7a, 0x6f, 0x3b, 0x61,
+0x70, 0x72, 0x69, 0x6c, 0x65, 0x3b, 0x6d, 0x61, 0x67, 0x67, 0x69, 0x6f,
+0x3b, 0x67, 0x69, 0x75, 0x67, 0x6e, 0x6f, 0x3b, 0x6c, 0x75, 0x67, 0x6c,
+0x69, 0x6f, 0x3b, 0x61, 0x67, 0x6f, 0x73, 0x74, 0x6f, 0x3b, 0x73, 0x65,
+0x74, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x6f, 0x74, 0x74, 0x6f,
+0x62, 0x72, 0x65, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x65,
+0x3b, 0x64, 0x69, 0x63, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x67, 0x65, 0x6e,
+0x3b, 0x66, 0x65, 0x62, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x61, 0x70, 0x72,
+0x3b, 0x6d, 0x61, 0x67, 0x3b, 0x67, 0x69, 0x75, 0x3b, 0x6c, 0x75, 0x67,
+0x3b, 0x61, 0x67, 0x6f, 0x3b, 0x73, 0x65, 0x74, 0x3b, 0x6f, 0x74, 0x74,
+0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64, 0x69, 0x63, 0x4a, 0x61, 0x6e, 0x3b,
+0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x70, 0x72, 0x3b,
+0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b,
+0x41, 0x67, 0x74, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b,
+0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x73, 0x48, 0x79, 0x77, 0x61, 0x6e,
+0x20, 0x41, 0x331, 0x79, 0x72, 0x6e, 0x69, 0x67, 0x3b, 0x48, 0x79, 0x77,
+0x61, 0x6e, 0x20, 0x41, 0x331, 0x68, 0x77, 0x61, 0x3b, 0x48, 0x79, 0x77,
+0x61, 0x6e, 0x20, 0x41, 0x331, 0x74, 0x61, 0x74, 0x3b, 0x48, 0x79, 0x77,
+0x61, 0x6e, 0x20, 0x41, 0x331, 0x6e, 0x61, 0x61, 0x69, 0x3b, 0x48, 0x79,
+0x77, 0x61, 0x6e, 0x20, 0x41, 0x331, 0x70, 0x66, 0x77, 0x6f, 0x6e, 0x3b,
+0x48, 0x79, 0x77, 0x61, 0x6e, 0x20, 0x41, 0x331, 0x6b, 0x69, 0x74, 0x61,
+0x74, 0x3b, 0x48, 0x79, 0x77, 0x61, 0x6e, 0x20, 0x41, 0x331, 0x74, 0x79,
+0x69, 0x72, 0x69, 0x6e, 0x3b, 0x48, 0x79, 0x77, 0x61, 0x6e, 0x20, 0x41,
+0x331, 0x6e, 0x69, 0x6e, 0x61, 0x69, 0x3b, 0x48, 0x79, 0x77, 0x61, 0x6e,
+0x20, 0x41, 0x331, 0x6b, 0x75, 0x6d, 0x76, 0x69, 0x72, 0x69, 0x79, 0x69,
+0x6e, 0x3b, 0x48, 0x79, 0x77, 0x61, 0x6e, 0x20, 0x53, 0x77, 0x61, 0x6b,
+0x3b, 0x48, 0x79, 0x77, 0x61, 0x6e, 0x20, 0x53, 0x77, 0x61, 0x6b, 0x20,
+0x42, 0x2019, 0x61, 0x331, 0x79, 0x72, 0x6e, 0x69, 0x67, 0x3b, 0x48, 0x79,
+0x77, 0x61, 0x6e, 0x20, 0x53, 0x77, 0x61, 0x6b, 0x20, 0x42, 0x2019, 0x61,
+0x331, 0x68, 0x77, 0x61, 0x41, 0x331, 0x79, 0x72, 0x3b, 0x41, 0x331, 0x68,
+0x77, 0x3b, 0x41, 0x331, 0x74, 0x61, 0x3b, 0x41, 0x331, 0x6e, 0x61, 0x3b,
+0x41, 0x331, 0x70, 0x66, 0x3b, 0x41, 0x331, 0x6b, 0x69, 0x3b, 0x41, 0x331,
+0x74, 0x79, 0x3b, 0x41, 0x331, 0x6e, 0x69, 0x3b, 0x41, 0x331, 0x6b, 0x75,
+0x3b, 0x53, 0x77, 0x61, 0x3b, 0x53, 0x62, 0x79, 0x3b, 0x53, 0x62, 0x68,
+0x53, 0x61, 0x6e, 0x76, 0x69, 0x65, 0x3b, 0x46, 0xe9, 0x62, 0x69, 0x72,
+0x69, 0x65, 0x3b, 0x4d, 0x61, 0x72, 0x73, 0x3b, 0x41, 0x62, 0x75, 0x72,
+0x69, 0x6c, 0x3b, 0x4d, 0x65, 0x65, 0x3b, 0x53, 0x75, 0x65, 0x14b, 0x3b,
+0x53, 0xfa, 0x75, 0x79, 0x65, 0x65, 0x3b, 0x55, 0x74, 0x3b, 0x53, 0x65,
+0x74, 0x74, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x6f,
+0x62, 0x61, 0x72, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x72,
+0x3b, 0x44, 0x69, 0x73, 0x61, 0x6d, 0x62, 0x61, 0x72, 0x53, 0x61, 0x3b,
+0x46, 0x65, 0x3b, 0x4d, 0x61, 0x3b, 0x41, 0x62, 0x3b, 0x4d, 0x65, 0x3b,
+0x53, 0x75, 0x3b, 0x53, 0xfa, 0x3b, 0x55, 0x74, 0x3b, 0x53, 0x65, 0x3b,
+0x4f, 0x6b, 0x3b, 0x4e, 0x6f, 0x3b, 0x44, 0x65, 0x53, 0x3b, 0x46, 0x3b,
+0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x55, 0x3b,
+0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x4a, 0x61, 0x6e, 0x65, 0x72,
+0x75, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x65, 0x72, 0x75, 0x3b, 0x4d, 0x61,
+0x72, 0x73, 0x75, 0x3b, 0x41, 0x62, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x61,
+0x69, 0x75, 0x3b, 0x4a, 0x75, 0x6e, 0x68, 0x75, 0x3b, 0x4a, 0x75, 0x6c,
+0x68, 0x75, 0x3b, 0x41, 0x67, 0x6f, 0x73, 0x74, 0x75, 0x3b, 0x53, 0x65,
+0x74, 0x65, 0x6e, 0x62, 0x72, 0x75, 0x3b, 0x4f, 0x74, 0x75, 0x62, 0x72,
+0x75, 0x3b, 0x4e, 0x75, 0x76, 0x65, 0x6e, 0x62, 0x72, 0x75, 0x3b, 0x44,
+0x69, 0x7a, 0x65, 0x6e, 0x62, 0x72, 0x75, 0x4a, 0x61, 0x6e, 0x3b, 0x46,
+0x65, 0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x62, 0x72, 0x3b, 0x4d,
+0x61, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41,
+0x67, 0x6f, 0x3b, 0x53, 0x65, 0x74, 0x3b, 0x4f, 0x74, 0x75, 0x3b, 0x4e,
+0x75, 0x76, 0x3b, 0x44, 0x69, 0x7a, 0x59, 0x65, 0x6e, 0x6e, 0x61, 0x79,
+0x65, 0x72, 0x3b, 0x46, 0x75, 0x1e5b, 0x61, 0x72, 0x3b, 0x4d, 0x65, 0x263,
+0x72, 0x65, 0x73, 0x3b, 0x59, 0x65, 0x62, 0x72, 0x69, 0x72, 0x3b, 0x4d,
+0x61, 0x79, 0x79, 0x75, 0x3b, 0x59, 0x75, 0x6e, 0x79, 0x75, 0x3b, 0x59,
+0x75, 0x6c, 0x79, 0x75, 0x3b, 0x194, 0x75, 0x63, 0x74, 0x3b, 0x43, 0x74,
+0x65, 0x6d, 0x62, 0x65, 0x1e5b, 0x3b, 0x54, 0x75, 0x62, 0x65, 0x1e5b, 0x3b,
+0x4e, 0x75, 0x6e, 0x65, 0x6d, 0x62, 0x65, 0x1e5b, 0x3b, 0x44, 0x75, 0x1e7,
+0x65, 0x6d, 0x62, 0x65, 0x1e5b, 0x59, 0x65, 0x6e, 0x3b, 0x46, 0x75, 0x72,
+0x3b, 0x4d, 0x65, 0x263, 0x3b, 0x59, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x79,
+0x3b, 0x59, 0x75, 0x6e, 0x3b, 0x59, 0x75, 0x6c, 0x3b, 0x194, 0x75, 0x63,
+0x3b, 0x43, 0x74, 0x65, 0x3b, 0x54, 0x75, 0x62, 0x3b, 0x57, 0x61, 0x6d,
+0x3b, 0x44, 0x75, 0x1e7, 0x59, 0x65, 0x6e, 0x3b, 0x46, 0x75, 0x72, 0x3b,
+0x4d, 0x65, 0x263, 0x3b, 0x59, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x79, 0x3b,
+0x59, 0x75, 0x6e, 0x3b, 0x59, 0x75, 0x6c, 0x3b, 0x194, 0x75, 0x63, 0x3b,
+0x43, 0x74, 0x65, 0x3b, 0x54, 0x75, 0x62, 0x3b, 0x4e, 0x75, 0x6e, 0x3b,
+0x44, 0x75, 0x1e7, 0x59, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x59, 0x3b, 0x4d,
+0x3b, 0x59, 0x3b, 0x59, 0x3b, 0x194, 0x3b, 0x43, 0x3b, 0x54, 0x3b, 0x4e,
+0x3b, 0x44, 0x59, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x59, 0x3b, 0x4d, 0x3b,
+0x59, 0x3b, 0x59, 0x3b, 0x194, 0x3b, 0x43, 0x3b, 0x54, 0x3b, 0x57, 0x3b,
+0x44, 0x70, 0x61, 0x6d, 0x62, 0x61, 0x3b, 0x77, 0x61, 0x6e, 0x6a, 0x61,
+0x3b, 0x6d, 0x62, 0x69, 0x79, 0x254, 0x20, 0x6d, 0x25b, 0x6e, 0x64, 0x6f,
+0x14b, 0x67, 0x254, 0x3b, 0x4e, 0x79, 0x254, 0x6c, 0x254, 0x6d, 0x62, 0x254,
+0x14b, 0x67, 0x254, 0x3b, 0x4d, 0x254, 0x6e, 0x254, 0x20, 0x14b, 0x67, 0x62,
+0x61, 0x6e, 0x6a, 0x61, 0x3b, 0x4e, 0x79, 0x61, 0x14b, 0x67, 0x77, 0x25b,
+0x20, 0x14b, 0x67, 0x62, 0x61, 0x6e, 0x6a, 0x61, 0x3b, 0x6b, 0x75, 0x14b,
+0x67, 0x77, 0x25b, 0x3b, 0x66, 0x25b, 0x3b, 0x6e, 0x6a, 0x61, 0x70, 0x69,
+0x3b, 0x6e, 0x79, 0x75, 0x6b, 0x75, 0x6c, 0x3b, 0x4d, 0x31, 0x31, 0x3b,
+0x253, 0x75, 0x6c, 0x253, 0x75, 0x73, 0x25b, 0x6a, 0x61, 0x6e, 0x75, 0x61,
+0x61, 0x72, 0x69, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x61, 0x72,
+0x69, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x69, 0x3b, 0x61, 0x70, 0x72, 0x69,
+0x69, 0x6c, 0x69, 0x3b, 0x6d, 0x61, 0x61, 0x6a, 0x69, 0x3b, 0x6a, 0x75,
+0x75, 0x6e, 0x69, 0x3b, 0x6a, 0x75, 0x75, 0x6c, 0x69, 0x3b, 0x61, 0x67,
+0x67, 0x75, 0x73, 0x74, 0x69, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d,
+0x62, 0x61, 0x72, 0x69, 0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x62, 0x61, 0x72,
+0x69, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x69, 0x3b,
+0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x69, 0x6a, 0x61, 0x6e,
+0x75, 0x61, 0x61, 0x72, 0x69, 0x70, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75,
+0x61, 0x61, 0x72, 0x69, 0x70, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x69, 0x70,
+0x3b, 0x61, 0x70, 0x72, 0x69, 0x69, 0x6c, 0x69, 0x70, 0x3b, 0x6d, 0x61,
+0x61, 0x6a, 0x69, 0x70, 0x3b, 0x6a, 0x75, 0x75, 0x6e, 0x69, 0x70, 0x3b,
+0x6a, 0x75, 0x75, 0x6c, 0x69, 0x70, 0x3b, 0x61, 0x67, 0x67, 0x75, 0x73,
+0x74, 0x69, 0x70, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x61,
+0x72, 0x69, 0x70, 0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x62, 0x61, 0x72, 0x69,
+0x70, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x69, 0x70,
+0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x69, 0x70, 0x6a,
+0x61, 0x6e, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x3b, 0x6d, 0x61, 0x72, 0x3b,
+0x61, 0x70, 0x72, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x3b,
+0x6a, 0x75, 0x6c, 0x3b, 0x61, 0x75, 0x67, 0x3b, 0x73, 0x65, 0x70, 0x74,
+0x3b, 0x6f, 0x6b, 0x74, 0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64, 0x65, 0x63,
+0x4d, 0x75, 0x6c, 0x67, 0x75, 0x6c, 0x3b, 0x4e, 0x67, 0x2019, 0x61, 0x74,
+0x79, 0x61, 0x61, 0x74, 0x6f, 0x3b, 0x4b, 0x69, 0x70, 0x74, 0x61, 0x61,
+0x6d, 0x6f, 0x3b, 0x49, 0x77, 0x6f, 0x6f, 0x74, 0x6b, 0x75, 0x75, 0x74,
+0x3b, 0x4d, 0x61, 0x6d, 0x75, 0x75, 0x74, 0x3b, 0x50, 0x61, 0x61, 0x67,
+0x69, 0x3b, 0x4e, 0x67, 0x2019, 0x65, 0x69, 0x79, 0x65, 0x65, 0x74, 0x3b,
+0x52, 0x6f, 0x6f, 0x70, 0x74, 0x75, 0x69, 0x3b, 0x42, 0x75, 0x72, 0x65,
+0x65, 0x74, 0x3b, 0x45, 0x70, 0x65, 0x65, 0x73, 0x6f, 0x3b, 0x4b, 0x69,
+0x70, 0x73, 0x75, 0x75, 0x6e, 0x64, 0x65, 0x20, 0x6e, 0x65, 0x20, 0x74,
+0x61, 0x61, 0x69, 0x3b, 0x4b, 0x69, 0x70, 0x73, 0x75, 0x75, 0x6e, 0x64,
+0x65, 0x20, 0x6e, 0x65, 0x62, 0x6f, 0x20, 0x61, 0x65, 0x6e, 0x67, 0x2019,
+0x4d, 0x75, 0x6c, 0x3b, 0x4e, 0x67, 0x61, 0x74, 0x3b, 0x54, 0x61, 0x61,
+0x3b, 0x49, 0x77, 0x6f, 0x3b, 0x4d, 0x61, 0x6d, 0x3b, 0x50, 0x61, 0x61,
+0x3b, 0x4e, 0x67, 0x65, 0x3b, 0x52, 0x6f, 0x6f, 0x3b, 0x42, 0x75, 0x72,
+0x3b, 0x45, 0x70, 0x65, 0x3b, 0x4b, 0x70, 0x74, 0x3b, 0x4b, 0x70, 0x61,
+0x4d, 0x3b, 0x4e, 0x3b, 0x54, 0x3b, 0x49, 0x3b, 0x4d, 0x3b, 0x50, 0x3b,
+0x4e, 0x3b, 0x52, 0x3b, 0x42, 0x3b, 0x45, 0x3b, 0x4b, 0x3b, 0x4b, 0x4d,
+0x77, 0x61, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6d, 0x62, 0x65, 0x65, 0x3b,
+0x4d, 0x77, 0x61, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x65, 0x6c, 0x129,
+0x3b, 0x4d, 0x77, 0x61, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x74,
+0x61, 0x74, 0x169, 0x3b, 0x4d, 0x77, 0x61, 0x69, 0x20, 0x77, 0x61, 0x20,
+0x6b, 0x61, 0x6e, 0x61, 0x3b, 0x4d, 0x77, 0x61, 0x69, 0x20, 0x77, 0x61,
+0x20, 0x6b, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x4d, 0x77, 0x61, 0x69,
+0x20, 0x77, 0x61, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x74, 0x68, 0x61, 0x74,
+0x169, 0x3b, 0x4d, 0x77, 0x61, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6d, 0x75,
+0x6f, 0x6e, 0x7a, 0x61, 0x3b, 0x4d, 0x77, 0x61, 0x69, 0x20, 0x77, 0x61,
+0x20, 0x6e, 0x79, 0x61, 0x61, 0x6e, 0x79, 0x61, 0x3b, 0x4d, 0x77, 0x61,
+0x69, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x65, 0x6e, 0x64, 0x61, 0x3b, 0x4d,
+0x77, 0x61, 0x69, 0x20, 0x77, 0x61, 0x20, 0x129, 0x6b, 0x75, 0x6d, 0x69,
+0x3b, 0x4d, 0x77, 0x61, 0x69, 0x20, 0x77, 0x61, 0x20, 0x129, 0x6b, 0x75,
+0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x129, 0x6d, 0x77, 0x65, 0x3b, 0x4d,
+0x77, 0x61, 0x69, 0x20, 0x77, 0x61, 0x20, 0x129, 0x6b, 0x75, 0x6d, 0x69,
+0x20, 0x6e, 0x61, 0x20, 0x69, 0x6c, 0x129, 0x4d, 0x62, 0x65, 0x3b, 0x4b,
+0x65, 0x6c, 0x3b, 0x4b, 0x74, 0x169, 0x3b, 0x4b, 0x61, 0x6e, 0x3b, 0x4b,
+0x74, 0x6e, 0x3b, 0x54, 0x68, 0x61, 0x3b, 0x4d, 0x6f, 0x6f, 0x3b, 0x4e,
+0x79, 0x61, 0x3b, 0x4b, 0x6e, 0x64, 0x3b, 0x128, 0x6b, 0x75, 0x3b, 0x128,
+0x6b, 0x6d, 0x3b, 0x128, 0x6b, 0x6c, 0x4d, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b,
+0x4b, 0x3b, 0x4b, 0x3b, 0x54, 0x3b, 0x4d, 0x3b, 0x4e, 0x3b, 0x4b, 0x3b,
+0x128, 0x3b, 0x128, 0x3b, 0x128, 0xc9c, 0xca8, 0xcb5, 0xcb0, 0xcbf, 0x3b, 0xcab,
+0xcc6, 0xcac, 0xccd, 0xcb0, 0xcb5, 0xcb0, 0xcbf, 0x3b, 0xcae, 0xcbe, 0xcb0, 0xccd,
+0xc9a, 0xccd, 0x3b, 0xc8f, 0xcaa, 0xccd, 0xcb0, 0xcbf, 0xcb2, 0xccd, 0x3b, 0xcae,
+0xcc7, 0x3b, 0xc9c, 0xcc2, 0xca8, 0xccd, 0x3b, 0xc9c, 0xcc1, 0xcb2, 0xcc8, 0x3b,
+0xc86, 0xc97, 0xcb8, 0xccd, 0xc9f, 0xccd, 0x3b, 0xcb8, 0xcc6, 0xcaa, 0xccd, 0xc9f,
+0xcc6, 0xc82, 0xcac, 0xcb0, 0xccd, 0x3b, 0xc85, 0xc95, 0xccd, 0xc9f, 0xccb, 0xcac,
+0xcb0, 0xccd, 0x3b, 0xca8, 0xcb5, 0xcc6, 0xc82, 0xcac, 0xcb0, 0xccd, 0x3b, 0xca1,
+0xcbf, 0xcb8, 0xcc6, 0xc82, 0xcac, 0xcb0, 0xccd, 0xc9c, 0xca8, 0x3b, 0xcab, 0xcc6,
+0xcac, 0xccd, 0xcb0, 0x3b, 0xcae, 0xcbe, 0xcb0, 0xccd, 0xc9a, 0xccd, 0x3b, 0xc8f,
+0xcaa, 0xccd, 0xcb0, 0xcbf, 0x3b, 0xcae, 0xcc7, 0x3b, 0xc9c, 0xcc2, 0xca8, 0xccd,
+0x3b, 0xc9c, 0xcc1, 0xcb2, 0xcc8, 0x3b, 0xc86, 0xc97, 0x3b, 0xcb8, 0xcc6, 0xcaa,
+0xccd, 0xc9f, 0xcc6, 0xc82, 0x3b, 0xc85, 0xc95, 0xccd, 0xc9f, 0xccb, 0x3b, 0xca8,
+0xcb5, 0xcc6, 0xc82, 0x3b, 0xca1, 0xcbf, 0xcb8, 0xcc6, 0xc82, 0xc9c, 0xca8, 0xcb5,
+0xcb0, 0xcbf, 0x3b, 0xcab, 0xcc6, 0xcac, 0xccd, 0xcb0, 0xcb5, 0xcb0, 0xcbf, 0x3b,
+0xcae, 0xcbe, 0xcb0, 0xccd, 0xc9a, 0xccd, 0x3b, 0xc8f, 0xcaa, 0xccd, 0xcb0, 0xcbf,
+0x3b, 0xcae, 0xcc7, 0x3b, 0xc9c, 0xcc2, 0xca8, 0xccd, 0x3b, 0xc9c, 0xcc1, 0xcb2,
+0xcc8, 0x3b, 0xc86, 0xc97, 0xcb8, 0xccd, 0xc9f, 0xccd, 0x3b, 0xcb8, 0xcc6, 0xcaa,
+0xccd, 0xc9f, 0xcc6, 0xc82, 0x3b, 0xc85, 0xc95, 0xccd, 0xc9f, 0xccb, 0x3b, 0xca8,
+0xcb5, 0xcc6, 0xc82, 0x3b, 0xca1, 0xcbf, 0xcb8, 0xcc6, 0xc82, 0xc9c, 0x3b, 0xcab,
+0xcc6, 0x3b, 0xcae, 0xcbe, 0x3b, 0xc8f, 0x3b, 0xcae, 0xcc7, 0x3b, 0xc9c, 0xcc2,
+0x3b, 0xc9c, 0xcc1, 0x3b, 0xc86, 0x3b, 0xcb8, 0xcc6, 0x3b, 0xc85, 0x3b, 0xca8,
+0x3b, 0xca1, 0xcbf, 0x62c, 0x646, 0x624, 0x631, 0x6cc, 0x3b, 0x641, 0x631, 0x624,
+0x631, 0x6cc, 0x3b, 0x645, 0x627, 0x631, 0x655, 0x686, 0x3b, 0x627, 0x67e, 0x631,
+0x6cc, 0x644, 0x3b, 0x645, 0x626, 0x6cc, 0x3b, 0x62c, 0x648, 0x657, 0x646, 0x3b,
+0x62c, 0x648, 0x657, 0x644, 0x627, 0x6cc, 0x6cc, 0x3b, 0x627, 0x6af, 0x633, 0x62a,
+0x3b, 0x633, 0x62a, 0x645, 0x628, 0x631, 0x3b, 0x627, 0x6a9, 0x62a, 0x648, 0x657,
+0x628, 0x631, 0x3b, 0x646, 0x648, 0x645, 0x628, 0x631, 0x3b, 0x62f, 0x633, 0x645,
+0x628, 0x631, 0x62c, 0x646, 0x624, 0x631, 0x6cc, 0x3b, 0x641, 0x631, 0x624, 0x631,
+0x6cc, 0x3b, 0x645, 0x627, 0x631, 0x655, 0x686, 0x3b, 0x627, 0x67e, 0x631, 0x6cc,
+0x644, 0x3b, 0x645, 0x626, 0x6cc, 0x3b, 0x62c, 0x648, 0x657, 0x646, 0x3b, 0x62c,
+0x64f, 0x644, 0x64e, 0x6d2, 0x3b, 0x627, 0x6af, 0x633, 0x62a, 0x3b, 0x633, 0x62a,
+0x645, 0x628, 0x631, 0x3b, 0x627, 0x6a9, 0x62a, 0x648, 0x657, 0x628, 0x631, 0x3b,
+0x646, 0x648, 0x645, 0x628, 0x631, 0x3b, 0x62f, 0x64e, 0x633, 0x64e, 0x645, 0x628,
+0x64e, 0x631, 0x62c, 0x646, 0x624, 0x631, 0x6cc, 0x3b, 0x641, 0x631, 0x624, 0x631,
+0x6cc, 0x3b, 0x645, 0x627, 0x631, 0x655, 0x686, 0x3b, 0x627, 0x67e, 0x631, 0x6cc,
+0x644, 0x3b, 0x645, 0x626, 0x6cc, 0x3b, 0x62c, 0x648, 0x657, 0x646, 0x3b, 0x62c,
+0x64f, 0x644, 0x64e, 0x6d2, 0x3b, 0x627, 0x6af, 0x633, 0x62a, 0x3b, 0x633, 0x62a,
+0x645, 0x628, 0x631, 0x3b, 0x627, 0x6a9, 0x62a, 0x648, 0x657, 0x628, 0x631, 0x3b,
+0x646, 0x648, 0x645, 0x628, 0x631, 0x3b, 0x62f, 0x633, 0x645, 0x628, 0x631, 0x62c,
+0x3b, 0x641, 0x3b, 0x645, 0x3b, 0x627, 0x3b, 0x645, 0x3b, 0x62c, 0x3b, 0x62c,
+0x3b, 0x627, 0x3b, 0x633, 0x3b, 0x633, 0x3b, 0x627, 0x3b, 0x646, 0x91c, 0x928,
+0x935, 0x930, 0x940, 0x3b, 0x92b, 0x93c, 0x930, 0x935, 0x930, 0x940, 0x3b, 0x92e,
+0x93e, 0x930, 0x94d, 0x91a, 0x3b, 0x905, 0x92a, 0x94d, 0x930, 0x948, 0x932, 0x3b,
+0x92e, 0x947, 0x3b, 0x91c, 0x942, 0x928, 0x3b, 0x91c, 0x941, 0x932, 0x93e, 0x908,
+0x3b, 0x905, 0x917, 0x938, 0x94d, 0x924, 0x3b, 0x938, 0x924, 0x941, 0x902, 0x92c,
+0x930, 0x3b, 0x905, 0x915, 0x924, 0x941, 0x92e, 0x94d, 0x92c, 0x930, 0x3b, 0x928,
+0x935, 0x942, 0x92e, 0x92c, 0x930, 0x3b, 0x926, 0x938, 0x942, 0x92e, 0x92c, 0x930,
+0x91c, 0x928, 0x935, 0x930, 0x940, 0x3b, 0x92b, 0x93c, 0x930, 0x935, 0x930, 0x940,
+0x3b, 0x92e, 0x93e, 0x930, 0x94d, 0x91a, 0x3b, 0x905, 0x92a, 0x94d, 0x930, 0x948,
+0x932, 0x3b, 0x92e, 0x947, 0x3b, 0x91c, 0x942, 0x928, 0x3b, 0x91c, 0x941, 0x932,
+0x93e, 0x908, 0x3b, 0x905, 0x917, 0x938, 0x94d, 0x924, 0x3b, 0x938, 0x924, 0x92e,
+0x92c, 0x930, 0x3b, 0x905, 0x915, 0x94d, 0x924, 0x942, 0x92c, 0x930, 0x3b, 0x928,
+0x935, 0x92e, 0x92c, 0x930, 0x3b, 0x926, 0x938, 0x92e, 0x92c, 0x930, 0x91c, 0x928,
+0x935, 0x930, 0x940, 0x3b, 0x92b, 0x93c, 0x930, 0x935, 0x930, 0x940, 0x3b, 0x92e,
+0x93e, 0x930, 0x94d, 0x91a, 0x3b, 0x905, 0x92a, 0x94d, 0x930, 0x948, 0x932, 0x3b,
+0x92e, 0x947, 0x3b, 0x91c, 0x942, 0x928, 0x3b, 0x91c, 0x941, 0x932, 0x93e, 0x908,
+0x3b, 0x905, 0x917, 0x938, 0x94d, 0x924, 0x3b, 0x938, 0x924, 0x941, 0x902, 0x92c,
+0x930, 0x3b, 0x905, 0x915, 0x94d, 0x924, 0x942, 0x92c, 0x930, 0x3b, 0x928, 0x935,
+0x942, 0x92e, 0x92c, 0x930, 0x3b, 0x926, 0x938, 0x942, 0x92e, 0x92c, 0x930, 0x91c,
+0x3b, 0x92b, 0x93c, 0x3b, 0x92e, 0x3b, 0x905, 0x3b, 0x92e, 0x3b, 0x91c, 0x3b,
+0x91c, 0x3b, 0x905, 0x3b, 0x938, 0x3b, 0x913, 0x3b, 0x928, 0x3b, 0x926, 0x49a,
+0x430, 0x4a3, 0x442, 0x430, 0x440, 0x3b, 0x410, 0x49b, 0x43f, 0x430, 0x43d, 0x3b,
+0x41d, 0x430, 0x443, 0x440, 0x44b, 0x437, 0x3b, 0x421, 0x4d9, 0x443, 0x456, 0x440,
+0x3b, 0x41c, 0x430, 0x43c, 0x44b, 0x440, 0x3b, 0x41c, 0x430, 0x443, 0x441, 0x44b,
+0x43c, 0x3b, 0x428, 0x456, 0x43b, 0x434, 0x435, 0x3b, 0x422, 0x430, 0x43c, 0x44b,
+0x437, 0x3b, 0x49a, 0x44b, 0x440, 0x43a, 0x4af, 0x439, 0x435, 0x43a, 0x3b, 0x49a,
+0x430, 0x437, 0x430, 0x43d, 0x3b, 0x49a, 0x430, 0x440, 0x430, 0x448, 0x430, 0x3b,
+0x416, 0x435, 0x43b, 0x442, 0x43e, 0x49b, 0x441, 0x430, 0x43d, 0x49b, 0x430, 0x4a3,
+0x442, 0x430, 0x440, 0x3b, 0x430, 0x49b, 0x43f, 0x430, 0x43d, 0x3b, 0x43d, 0x430,
+0x443, 0x440, 0x44b, 0x437, 0x3b, 0x441, 0x4d9, 0x443, 0x456, 0x440, 0x3b, 0x43c,
+0x430, 0x43c, 0x44b, 0x440, 0x3b, 0x43c, 0x430, 0x443, 0x441, 0x44b, 0x43c, 0x3b,
+0x448, 0x456, 0x43b, 0x434, 0x435, 0x3b, 0x442, 0x430, 0x43c, 0x44b, 0x437, 0x3b,
+0x49b, 0x44b, 0x440, 0x43a, 0x4af, 0x439, 0x435, 0x43a, 0x3b, 0x49b, 0x430, 0x437,
+0x430, 0x43d, 0x3b, 0x49b, 0x430, 0x440, 0x430, 0x448, 0x430, 0x3b, 0x436, 0x435,
+0x43b, 0x442, 0x43e, 0x49b, 0x441, 0x430, 0x43d, 0x49b, 0x430, 0x4a3, 0x2e, 0x3b,
+0x430, 0x49b, 0x43f, 0x2e, 0x3b, 0x43d, 0x430, 0x443, 0x2e, 0x3b, 0x441, 0x4d9,
+0x443, 0x2e, 0x3b, 0x43c, 0x430, 0x43c, 0x2e, 0x3b, 0x43c, 0x430, 0x443, 0x2e,
+0x3b, 0x448, 0x456, 0x43b, 0x2e, 0x3b, 0x442, 0x430, 0x43c, 0x2e, 0x3b, 0x49b,
+0x44b, 0x440, 0x2e, 0x3b, 0x49b, 0x430, 0x437, 0x2e, 0x3b, 0x49b, 0x430, 0x440,
+0x2e, 0x3b, 0x436, 0x435, 0x43b, 0x2e, 0x49a, 0x3b, 0x410, 0x3b, 0x41d, 0x3b,
+0x421, 0x3b, 0x41c, 0x3b, 0x41c, 0x3b, 0x428, 0x3b, 0x422, 0x3b, 0x49a, 0x3b,
+0x49a, 0x3b, 0x49a, 0x3b, 0x416, 0x1798, 0x1780, 0x179a, 0x17b6, 0x3b, 0x1780, 0x17bb,
+0x1798, 0x17d2, 0x1797, 0x17c8, 0x3b, 0x1798, 0x17b8, 0x1793, 0x17b6, 0x3b, 0x1798, 0x17c1,
+0x179f, 0x17b6, 0x3b, 0x17a7, 0x179f, 0x1797, 0x17b6, 0x3b, 0x1798, 0x17b7, 0x1790, 0x17bb,
+0x1793, 0x17b6, 0x3b, 0x1780, 0x1780, 0x17d2, 0x1780, 0x178a, 0x17b6, 0x3b, 0x179f, 0x17b8,
+0x17a0, 0x17b6, 0x3b, 0x1780, 0x1789, 0x17d2, 0x1789, 0x17b6, 0x3b, 0x178f, 0x17bb, 0x179b,
+0x17b6, 0x3b, 0x179c, 0x17b7, 0x1785, 0x17d2, 0x1786, 0x17b7, 0x1780, 0x17b6, 0x3b, 0x1792,
+0x17d2, 0x1793, 0x17bc, 0x1798, 0x3b, 0x1780, 0x3b, 0x1798, 0x3b, 0x1798, 0x3b, 0x17a7,
+0x3b, 0x1798, 0x3b, 0x1780, 0x3b, 0x179f, 0x3b, 0x1780, 0x3b, 0x178f, 0x3b, 0x179c,
+0x3b, 0x1792, 0x4e, 0x6a, 0x65, 0x6e, 0x75, 0x61, 0x72, 0x129, 0x3b, 0x4d,
+0x77, 0x65, 0x72, 0x65, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x65, 0x72, 0x129,
+0x3b, 0x4d, 0x77, 0x65, 0x72, 0x65, 0x20, 0x77, 0x61, 0x20, 0x67, 0x61,
+0x74, 0x61, 0x74, 0x169, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x65, 0x20, 0x77,
+0x61, 0x20, 0x6b, 0x61, 0x6e, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x65,
+0x20, 0x77, 0x61, 0x20, 0x67, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x4d,
+0x77, 0x65, 0x72, 0x65, 0x20, 0x77, 0x61, 0x20, 0x67, 0x61, 0x74, 0x61,
+0x6e, 0x64, 0x61, 0x74, 0x169, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x65, 0x20,
+0x77, 0x61, 0x20, 0x6d, 0x169, 0x67, 0x77, 0x61, 0x6e, 0x6a, 0x61, 0x3b,
+0x4d, 0x77, 0x65, 0x72, 0x65, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x6e,
+0x61, 0x6e, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x65, 0x20, 0x77, 0x61,
+0x20, 0x6b, 0x65, 0x6e, 0x64, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x65,
+0x20, 0x77, 0x61, 0x20, 0x69, 0x6b, 0x169, 0x6d, 0x69, 0x3b, 0x4d, 0x77,
+0x65, 0x72, 0x65, 0x20, 0x77, 0x61, 0x20, 0x69, 0x6b, 0x169, 0x6d, 0x69,
+0x20, 0x6e, 0x61, 0x20, 0x169, 0x6d, 0x77, 0x65, 0x3b, 0x4e, 0x64, 0x69,
+0x74, 0x68, 0x65, 0x6d, 0x62, 0x61, 0x4a, 0x45, 0x4e, 0x3b, 0x57, 0x4b,
+0x52, 0x3b, 0x57, 0x47, 0x54, 0x3b, 0x57, 0x4b, 0x4e, 0x3b, 0x57, 0x54,
+0x4e, 0x3b, 0x57, 0x54, 0x44, 0x3b, 0x57, 0x4d, 0x4a, 0x3b, 0x57, 0x4e,
+0x4e, 0x3b, 0x57, 0x4b, 0x44, 0x3b, 0x57, 0x49, 0x4b, 0x3b, 0x57, 0x4d,
+0x57, 0x3b, 0x44, 0x49, 0x54, 0x4a, 0x3b, 0x4b, 0x3b, 0x47, 0x3b, 0x4b,
+0x3b, 0x47, 0x3b, 0x47, 0x3b, 0x4d, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x49,
+0x3b, 0x49, 0x3b, 0x44, 0x4d, 0x75, 0x74, 0x61, 0x72, 0x61, 0x6d, 0x61,
+0x3b, 0x47, 0x61, 0x73, 0x68, 0x79, 0x61, 0x6e, 0x74, 0x61, 0x72, 0x65,
+0x3b, 0x57, 0x65, 0x72, 0x75, 0x72, 0x77, 0x65, 0x3b, 0x4d, 0x61, 0x74,
+0x61, 0x3b, 0x47, 0x69, 0x63, 0x75, 0x72, 0x61, 0x73, 0x69, 0x3b, 0x4b,
+0x61, 0x6d, 0x65, 0x6e, 0x61, 0x3b, 0x4e, 0x79, 0x61, 0x6b, 0x61, 0x6e,
+0x67, 0x61, 0x3b, 0x4b, 0x61, 0x6e, 0x61, 0x6d, 0x61, 0x3b, 0x4e, 0x7a,
+0x65, 0x6c, 0x69, 0x3b, 0x55, 0x6b, 0x77, 0x61, 0x6b, 0x69, 0x72, 0x61,
+0x3b, 0x55, 0x67, 0x75, 0x73, 0x68, 0x79, 0x69, 0x6e, 0x67, 0x6f, 0x3b,
+0x55, 0x6b, 0x75, 0x62, 0x6f, 0x7a, 0x61, 0x6d, 0x75, 0x74, 0x2e, 0x3b,
+0x67, 0x61, 0x73, 0x2e, 0x3b, 0x77, 0x65, 0x72, 0x2e, 0x3b, 0x6d, 0x61,
+0x74, 0x2e, 0x3b, 0x67, 0x69, 0x63, 0x2e, 0x3b, 0x6b, 0x61, 0x6d, 0x2e,
+0x3b, 0x6e, 0x79, 0x61, 0x2e, 0x3b, 0x6b, 0x61, 0x6e, 0x2e, 0x3b, 0x6e,
+0x7a, 0x65, 0x2e, 0x3b, 0x75, 0x6b, 0x77, 0x2e, 0x3b, 0x75, 0x67, 0x75,
+0x2e, 0x3b, 0x75, 0x6b, 0x75, 0x2e, 0x91c, 0x93e, 0x928, 0x947, 0x935, 0x93e,
+0x930, 0x940, 0x3b, 0x92b, 0x947, 0x92c, 0x94d, 0x930, 0x941, 0x935, 0x93e, 0x930,
+0x940, 0x3b, 0x92e, 0x93e, 0x930, 0x94d, 0x91a, 0x3b, 0x90f, 0x92a, 0x94d, 0x930,
+0x940, 0x932, 0x3b, 0x92e, 0x947, 0x3b, 0x91c, 0x942, 0x928, 0x3b, 0x91c, 0x941,
+0x932, 0x92f, 0x3b, 0x911, 0x917, 0x938, 0x94d, 0x91f, 0x3b, 0x938, 0x92a, 0x94d,
+0x91f, 0x947, 0x902, 0x92c, 0x930, 0x3b, 0x911, 0x915, 0x94d, 0x91f, 0x94b, 0x92c,
+0x930, 0x3b, 0x928, 0x94b, 0x935, 0x94d, 0x939, 0x947, 0x902, 0x92c, 0x930, 0x3b,
+0x921, 0x93f, 0x938, 0x947, 0x902, 0x92c, 0x930, 0x91c, 0x93e, 0x928, 0x947, 0x3b,
+0x92b, 0x947, 0x92c, 0x94d, 0x930, 0x941, 0x3b, 0x92e, 0x93e, 0x930, 0x94d, 0x91a,
+0x3b, 0x90f, 0x92a, 0x94d, 0x930, 0x940, 0x3b, 0x92e, 0x947, 0x3b, 0x91c, 0x942,
+0x928, 0x3b, 0x91c, 0x941, 0x932, 0x3b, 0x911, 0x917, 0x3b, 0x938, 0x92a, 0x94d,
+0x91f, 0x947, 0x902, 0x3b, 0x911, 0x915, 0x94d, 0x91f, 0x94b, 0x3b, 0x928, 0x94b,
+0x3b, 0x921, 0x93f, 0x938, 0x947, 0x31, 0xc6d4, 0x3b, 0x32, 0xc6d4, 0x3b, 0x33,
+0xc6d4, 0x3b, 0x34, 0xc6d4, 0x3b, 0x35, 0xc6d4, 0x3b, 0x36, 0xc6d4, 0x3b, 0x37,
+0xc6d4, 0x3b, 0x38, 0xc6d4, 0x3b, 0x39, 0xc6d4, 0x3b, 0x31, 0x30, 0xc6d4, 0x3b,
+0x31, 0x31, 0xc6d4, 0x3b, 0x31, 0x32, 0xc6d4, 0x17d, 0x61, 0x6e, 0x77, 0x69,
+0x79, 0x65, 0x3b, 0x46, 0x65, 0x65, 0x77, 0x69, 0x72, 0x69, 0x79, 0x65,
+0x3b, 0x4d, 0x61, 0x72, 0x73, 0x69, 0x3b, 0x41, 0x77, 0x69, 0x72, 0x69,
+0x6c, 0x3b, 0x4d, 0x65, 0x3b, 0x17d, 0x75, 0x77, 0x65, 0x14b, 0x3b, 0x17d,
+0x75, 0x79, 0x79, 0x65, 0x3b, 0x55, 0x74, 0x3b, 0x53, 0x65, 0x6b, 0x74,
+0x61, 0x6e, 0x62, 0x75, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x6f, 0x62,
+0x75, 0x72, 0x3b, 0x4e, 0x6f, 0x6f, 0x77, 0x61, 0x6e, 0x62, 0x75, 0x72,
+0x3b, 0x44, 0x65, 0x65, 0x73, 0x61, 0x6e, 0x62, 0x75, 0x72, 0x17d, 0x61,
+0x6e, 0x3b, 0x46, 0x65, 0x65, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x77,
+0x69, 0x3b, 0x4d, 0x65, 0x3b, 0x17d, 0x75, 0x77, 0x3b, 0x17d, 0x75, 0x79,
+0x3b, 0x55, 0x74, 0x3b, 0x53, 0x65, 0x6b, 0x3b, 0x4f, 0x6b, 0x74, 0x3b,
+0x4e, 0x6f, 0x6f, 0x3b, 0x44, 0x65, 0x65, 0x17d, 0x3b, 0x46, 0x3b, 0x4d,
+0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x17d, 0x3b, 0x17d, 0x3b, 0x55, 0x3b, 0x53,
+0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x72, 0xea, 0x62, 0x65, 0x6e, 0x64,
+0x61, 0x6e, 0x3b, 0x73, 0x69, 0x62, 0x61, 0x74, 0x3b, 0x61, 0x64, 0x61,
+0x72, 0x3b, 0x6e, 0xee, 0x73, 0x61, 0x6e, 0x3b, 0x67, 0x75, 0x6c, 0x61,
+0x6e, 0x3b, 0x68, 0x65, 0x7a, 0xee, 0x72, 0x61, 0x6e, 0x3b, 0x74, 0xee,
+0x72, 0x6d, 0x65, 0x68, 0x3b, 0x74, 0x65, 0x62, 0x61, 0x78, 0x3b, 0xee,
+0x6c, 0x6f, 0x6e, 0x3b, 0x63, 0x6f, 0x74, 0x6d, 0x65, 0x68, 0x3b, 0x6d,
+0x69, 0x6a, 0x64, 0x61, 0x72, 0x3b, 0x62, 0x65, 0x72, 0x66, 0x61, 0x6e,
+0x62, 0x61, 0x72, 0x72, 0x62, 0x6e, 0x3b, 0x73, 0x62, 0x74, 0x3b, 0x61,
+0x64, 0x72, 0x3b, 0x6e, 0x73, 0x6e, 0x3b, 0x67, 0x6c, 0x6e, 0x3b, 0x68,
+0x7a, 0x72, 0x3b, 0x74, 0x72, 0x6d, 0x3b, 0x74, 0x62, 0x78, 0x3b, 0xee,
+0x6c, 0x6e, 0x3b, 0x63, 0x6f, 0x74, 0x3b, 0x6d, 0x6a, 0x64, 0x3b, 0x62,
+0x72, 0x66, 0x52, 0x3b, 0x53, 0x3b, 0x41, 0x3b, 0x4e, 0x3b, 0x47, 0x3b,
+0x48, 0x3b, 0x54, 0x3b, 0x54, 0x3b, 0xce, 0x3b, 0x43, 0x3b, 0x4d, 0x3b,
+0x42, 0x6e, 0x67, 0x77, 0x25b, 0x6e, 0x20, 0x6d, 0x61, 0x74, 0xe1, 0x68,
+0x72, 0x61, 0x3b, 0x6e, 0x67, 0x77, 0x25b, 0x6e, 0x20, 0x144, 0x6d, 0x62,
+0x61, 0x3b, 0x6e, 0x67, 0x77, 0x25b, 0x6e, 0x20, 0x144, 0x6c, 0x61, 0x6c,
+0x3b, 0x6e, 0x67, 0x77, 0x25b, 0x6e, 0x20, 0x144, 0x6e, 0x61, 0x3b, 0x6e,
+0x67, 0x77, 0x25b, 0x6e, 0x20, 0x144, 0x74, 0x61, 0x6e, 0x3b, 0x6e, 0x67,
+0x77, 0x25b, 0x6e, 0x20, 0x144, 0x74, 0x75, 0xf3, 0x3b, 0x6e, 0x67, 0x77,
+0x25b, 0x6e, 0x20, 0x68, 0x25b, 0x6d, 0x62, 0x75, 0x25b, 0x72, 0xed, 0x3b,
+0x6e, 0x67, 0x77, 0x25b, 0x6e, 0x20, 0x6c, 0x254, 0x6d, 0x62, 0x69, 0x3b,
+0x6e, 0x67, 0x77, 0x25b, 0x6e, 0x20, 0x72, 0x25b, 0x62, 0x76, 0x75, 0xe2,
+0x3b, 0x6e, 0x67, 0x77, 0x25b, 0x6e, 0x20, 0x77, 0x75, 0x6d, 0x3b, 0x6e,
+0x67, 0x77, 0x25b, 0x6e, 0x20, 0x77, 0x75, 0x6d, 0x20, 0x6e, 0x61, 0x76,
+0x1d4, 0x72, 0x3b, 0x6b, 0x72, 0xed, 0x73, 0x69, 0x6d, 0x69, 0x6e, 0x6e,
+0x67, 0x31, 0x3b, 0x6e, 0x67, 0x32, 0x3b, 0x6e, 0x67, 0x33, 0x3b, 0x6e,
+0x67, 0x34, 0x3b, 0x6e, 0x67, 0x35, 0x3b, 0x6e, 0x67, 0x36, 0x3b, 0x6e,
+0x67, 0x37, 0x3b, 0x6e, 0x67, 0x38, 0x3b, 0x6e, 0x67, 0x39, 0x3b, 0x6e,
+0x67, 0x31, 0x30, 0x3b, 0x6e, 0x67, 0x31, 0x31, 0x3b, 0x6b, 0x72, 0x69,
+0x73, 0x42f, 0x43d, 0x432, 0x430, 0x440, 0x44c, 0x3b, 0x424, 0x435, 0x432, 0x440,
+0x430, 0x43b, 0x44c, 0x3b, 0x41c, 0x430, 0x440, 0x442, 0x3b, 0x410, 0x43f, 0x440,
+0x435, 0x43b, 0x44c, 0x3b, 0x41c, 0x430, 0x439, 0x3b, 0x418, 0x44e, 0x43d, 0x44c,
+0x3b, 0x418, 0x44e, 0x43b, 0x44c, 0x3b, 0x410, 0x432, 0x433, 0x443, 0x441, 0x442,
+0x3b, 0x421, 0x435, 0x43d, 0x442, 0x44f, 0x431, 0x440, 0x44c, 0x3b, 0x41e, 0x43a,
+0x442, 0x44f, 0x431, 0x440, 0x44c, 0x3b, 0x41d, 0x43e, 0x44f, 0x431, 0x440, 0x44c,
+0x3b, 0x414, 0x435, 0x43a, 0x430, 0x431, 0x440, 0x44c, 0x42f, 0x43d, 0x432, 0x3b,
+0x424, 0x435, 0x432, 0x3b, 0x41c, 0x430, 0x440, 0x3b, 0x410, 0x43f, 0x440, 0x3b,
+0x41c, 0x430, 0x439, 0x3b, 0x418, 0x44e, 0x43d, 0x3b, 0x418, 0x44e, 0x43b, 0x3b,
+0x410, 0x432, 0x433, 0x3b, 0x421, 0x435, 0x43d, 0x3b, 0x41e, 0x43a, 0x442, 0x3b,
+0x41d, 0x43e, 0x44f, 0x3b, 0x414, 0x435, 0x43a, 0x44f, 0x43d, 0x432, 0x2e, 0x3b,
+0x444, 0x435, 0x432, 0x2e, 0x3b, 0x43c, 0x430, 0x440, 0x2e, 0x3b, 0x430, 0x43f,
+0x440, 0x2e, 0x3b, 0x43c, 0x430, 0x439, 0x3b, 0x438, 0x44e, 0x43d, 0x2e, 0x3b,
+0x438, 0x44e, 0x43b, 0x2e, 0x3b, 0x430, 0x432, 0x433, 0x2e, 0x3b, 0x441, 0x435,
+0x43d, 0x2e, 0x3b, 0x43e, 0x43a, 0x442, 0x2e, 0x3b, 0x43d, 0x43e, 0x44f, 0x2e,
+0x3b, 0x434, 0x435, 0x43a, 0x2e, 0x57, 0x69, 0xf3, 0x74, 0x68, 0x65, 0x21f,
+0x69, 0x6b, 0x61, 0x20, 0x57, 0xed, 0x3b, 0x54, 0x68, 0x69, 0x79, 0xf3,
+0x21f, 0x65, 0x79, 0x75, 0x14b, 0x6b, 0x61, 0x20, 0x57, 0xed, 0x3b, 0x49,
+0x161, 0x74, 0xe1, 0x77, 0x69, 0x10d, 0x68, 0x61, 0x79, 0x61, 0x7a, 0x61,
+0x14b, 0x20, 0x57, 0xed, 0x3b, 0x50, 0x21f, 0x65, 0x17e, 0xed, 0x74, 0x21f,
+0x6f, 0x20, 0x57, 0xed, 0x3b, 0x10c, 0x68, 0x61, 0x14b, 0x77, 0xe1, 0x70,
+0x65, 0x74, 0x21f, 0x6f, 0x20, 0x57, 0xed, 0x3b, 0x57, 0xed, 0x70, 0x61,
+0x7a, 0x75, 0x6b, 0x21f, 0x61, 0x2d, 0x77, 0x61, 0x161, 0x74, 0xe9, 0x20,
+0x57, 0xed, 0x3b, 0x10c, 0x68, 0x61, 0x14b, 0x70, 0x21f, 0xe1, 0x73, 0x61,
+0x70, 0x61, 0x20, 0x57, 0xed, 0x3b, 0x57, 0x61, 0x73, 0xfa, 0x74, 0x21f,
+0x75, 0x14b, 0x20, 0x57, 0xed, 0x3b, 0x10c, 0x68, 0x61, 0x14b, 0x77, 0xe1,
+0x70, 0x65, 0x1e7, 0x69, 0x20, 0x57, 0xed, 0x3b, 0x10c, 0x68, 0x61, 0x14b,
+0x77, 0xe1, 0x70, 0x65, 0x2d, 0x6b, 0x61, 0x73, 0x6e, 0xe1, 0x20, 0x57,
+0xed, 0x3b, 0x57, 0x61, 0x6e, 0xed, 0x79, 0x65, 0x74, 0x75, 0x20, 0x57,
+0xed, 0x3b, 0x54, 0x21f, 0x61, 0x68, 0xe9, 0x6b, 0x61, 0x70, 0x161, 0x75,
+0x14b, 0x20, 0x57, 0xed, 0x4b, 0x289, 0x66, 0xfa, 0x6e, 0x67, 0x61, 0x74,
+0x268, 0x3b, 0x4b, 0x289, 0x6e, 0x61, 0x61, 0x6e, 0x268, 0x3b, 0x4b, 0x289,
+0x6b, 0x65, 0x65, 0x6e, 0x64, 0x61, 0x3b, 0x4b, 0x77, 0x69, 0x69, 0x6b,
+0x75, 0x6d, 0x69, 0x3b, 0x4b, 0x77, 0x69, 0x69, 0x6e, 0x79, 0x61, 0x6d,
+0x62, 0xe1, 0x6c, 0x61, 0x3b, 0x4b, 0x77, 0x69, 0x69, 0x64, 0x77, 0x61,
+0x61, 0x74, 0x61, 0x3b, 0x4b, 0x289, 0x6d, 0x289, 0x289, 0x6e, 0x63, 0x68,
+0x268, 0x3b, 0x4b, 0x289, 0x76, 0x268, 0x268, 0x72, 0x268, 0x3b, 0x4b, 0x289,
+0x73, 0x61, 0x61, 0x74, 0x289, 0x3b, 0x4b, 0x77, 0x69, 0x69, 0x6e, 0x79,
+0x69, 0x3b, 0x4b, 0x289, 0x73, 0x61, 0x61, 0x6e, 0x6f, 0x3b, 0x4b, 0x289,
+0x73, 0x61, 0x73, 0x61, 0x74, 0x289, 0x46, 0xfa, 0x6e, 0x67, 0x61, 0x74,
+0x268, 0x3b, 0x4e, 0x61, 0x61, 0x6e, 0x268, 0x3b, 0x4b, 0x65, 0x65, 0x6e,
+0x64, 0x61, 0x3b, 0x49, 0x6b, 0xfa, 0x6d, 0x69, 0x3b, 0x49, 0x6e, 0x79,
+0x61, 0x6d, 0x62, 0x61, 0x6c, 0x61, 0x3b, 0x49, 0x64, 0x77, 0x61, 0x61,
+0x74, 0x61, 0x3b, 0x4d, 0x289, 0x289, 0x6e, 0x63, 0x68, 0x268, 0x3b, 0x56,
+0x268, 0x268, 0x72, 0x268, 0x3b, 0x53, 0x61, 0x61, 0x74, 0x289, 0x3b, 0x49,
+0x6e, 0x79, 0x69, 0x3b, 0x53, 0x61, 0x61, 0x6e, 0x6f, 0x3b, 0x53, 0x61,
+0x73, 0x61, 0x74, 0x289, 0x46, 0x3b, 0x4e, 0x3b, 0x4b, 0x3b, 0x49, 0x3b,
+0x49, 0x3b, 0x49, 0x3b, 0x4d, 0x3b, 0x56, 0x3b, 0x53, 0x3b, 0x49, 0x3b,
+0x53, 0x3b, 0x53, 0xea1, 0xeb1, 0xe87, 0xe81, 0xead, 0xe99, 0x3b, 0xe81, 0xeb8,
+0xea1, 0xe9e, 0xeb2, 0x3b, 0xea1, 0xeb5, 0xe99, 0xeb2, 0x3b, 0xec0, 0xea1, 0xeaa,
+0xeb2, 0x3b, 0xe9e, 0xeb6, 0xe94, 0xeaa, 0xeb0, 0xe9e, 0xeb2, 0x3b, 0xea1, 0xeb4,
+0xe96, 0xeb8, 0xe99, 0xeb2, 0x3b, 0xe81, 0xecd, 0xea5, 0xeb0, 0xe81, 0xebb, 0xe94,
+0x3b, 0xeaa, 0xeb4, 0xe87, 0xeab, 0xeb2, 0x3b, 0xe81, 0xeb1, 0xe99, 0xe8d, 0xeb2,
+0x3b, 0xe95, 0xeb8, 0xea5, 0xeb2, 0x3b, 0xe9e, 0xeb0, 0xe88, 0xeb4, 0xe81, 0x3b,
+0xe97, 0xeb1, 0xe99, 0xea7, 0xeb2, 0xea1, 0x2e, 0xe81, 0x2e, 0x3b, 0xe81, 0x2e,
+0xe9e, 0x2e, 0x3b, 0xea1, 0x2e, 0xe99, 0x2e, 0x3b, 0xea1, 0x2e, 0xeaa, 0x2e,
+0x3b, 0xe9e, 0x2e, 0xe9e, 0x2e, 0x3b, 0xea1, 0xeb4, 0x2e, 0xe96, 0x2e, 0x3b,
+0xe81, 0x2e, 0xea5, 0x2e, 0x3b, 0xeaa, 0x2e, 0xeab, 0x2e, 0x3b, 0xe81, 0x2e,
+0xe8d, 0x2e, 0x3b, 0xe95, 0x2e, 0xea5, 0x2e, 0x3b, 0xe9e, 0x2e, 0xe88, 0x2e,
+0x3b, 0xe97, 0x2e, 0xea7, 0x2e, 0x49, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x69,
+0x75, 0x73, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x69, 0x75,
+0x73, 0x3b, 0x4d, 0x61, 0x72, 0x74, 0x69, 0x75, 0x73, 0x3b, 0x41, 0x70,
+0x72, 0x69, 0x6c, 0x69, 0x73, 0x3b, 0x4d, 0x61, 0x69, 0x75, 0x73, 0x3b,
+0x49, 0x75, 0x6e, 0x69, 0x75, 0x73, 0x3b, 0x49, 0x75, 0x6c, 0x69, 0x75,
+0x73, 0x3b, 0x41, 0x75, 0x67, 0x75, 0x73, 0x74, 0x75, 0x73, 0x3b, 0x53,
+0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4f, 0x63, 0x74,
+0x6f, 0x62, 0x65, 0x72, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65,
+0x72, 0x3b, 0x44, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x49, 0x61,
+0x6e, 0x75, 0x61, 0x72, 0x69, 0x69, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x75,
+0x61, 0x72, 0x69, 0x69, 0x3b, 0x4d, 0x61, 0x72, 0x74, 0x69, 0x69, 0x3b,
+0x41, 0x70, 0x72, 0x69, 0x6c, 0x69, 0x73, 0x3b, 0x4d, 0x61, 0x69, 0x69,
+0x3b, 0x49, 0x75, 0x6e, 0x69, 0x69, 0x3b, 0x49, 0x75, 0x6c, 0x69, 0x69,
+0x3b, 0x41, 0x75, 0x67, 0x75, 0x73, 0x74, 0x69, 0x3b, 0x53, 0x65, 0x70,
+0x74, 0x65, 0x6d, 0x62, 0x72, 0x69, 0x73, 0x3b, 0x4f, 0x63, 0x74, 0x6f,
+0x62, 0x72, 0x69, 0x73, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72,
+0x69, 0x73, 0x3b, 0x44, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x72, 0x69, 0x73,
+0x49, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b,
+0x41, 0x70, 0x72, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x49, 0x75, 0x6e, 0x3b,
+0x49, 0x75, 0x6c, 0x3b, 0x41, 0x75, 0x67, 0x3b, 0x53, 0x65, 0x70, 0x3b,
+0x4f, 0x63, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x63, 0x6a,
+0x61, 0x6e, 0x76, 0x101, 0x72, 0x69, 0x73, 0x3b, 0x66, 0x65, 0x62, 0x72,
+0x75, 0x101, 0x72, 0x69, 0x73, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x73, 0x3b,
+0x61, 0x70, 0x72, 0x12b, 0x6c, 0x69, 0x73, 0x3b, 0x6d, 0x61, 0x69, 0x6a,
+0x73, 0x3b, 0x6a, 0x16b, 0x6e, 0x69, 0x6a, 0x73, 0x3b, 0x6a, 0x16b, 0x6c,
+0x69, 0x6a, 0x73, 0x3b, 0x61, 0x75, 0x67, 0x75, 0x73, 0x74, 0x73, 0x3b,
+0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x69, 0x73, 0x3b, 0x6f,
+0x6b, 0x74, 0x6f, 0x62, 0x72, 0x69, 0x73, 0x3b, 0x6e, 0x6f, 0x76, 0x65,
+0x6d, 0x62, 0x72, 0x69, 0x73, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62,
+0x72, 0x69, 0x73, 0x6a, 0x61, 0x6e, 0x76, 0x2e, 0x3b, 0x66, 0x65, 0x62,
+0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x73, 0x3b, 0x61, 0x70, 0x72,
+0x2e, 0x3b, 0x6d, 0x61, 0x69, 0x6a, 0x73, 0x3b, 0x6a, 0x16b, 0x6e, 0x2e,
+0x3b, 0x6a, 0x16b, 0x6c, 0x2e, 0x3b, 0x61, 0x75, 0x67, 0x2e, 0x3b, 0x73,
+0x65, 0x70, 0x74, 0x2e, 0x3b, 0x6f, 0x6b, 0x74, 0x2e, 0x3b, 0x6e, 0x6f,
+0x76, 0x2e, 0x3b, 0x64, 0x65, 0x63, 0x2e, 0x73, 0xe1, 0x6e, 0x7a, 0xe1,
+0x20, 0x79, 0x61, 0x20, 0x79, 0x61, 0x6d, 0x62, 0x6f, 0x3b, 0x73, 0xe1,
+0x6e, 0x7a, 0xe1, 0x20, 0x79, 0x61, 0x20, 0x6d, 0xed, 0x62, 0x61, 0x6c,
+0xe9, 0x3b, 0x73, 0xe1, 0x6e, 0x7a, 0xe1, 0x20, 0x79, 0x61, 0x20, 0x6d,
+0xed, 0x73, 0xe1, 0x74, 0x6f, 0x3b, 0x73, 0xe1, 0x6e, 0x7a, 0xe1, 0x20,
+0x79, 0x61, 0x20, 0x6d, 0xed, 0x6e, 0x65, 0x69, 0x3b, 0x73, 0xe1, 0x6e,
+0x7a, 0xe1, 0x20, 0x79, 0x61, 0x20, 0x6d, 0xed, 0x74, 0xe1, 0x6e, 0x6f,
+0x3b, 0x73, 0xe1, 0x6e, 0x7a, 0xe1, 0x20, 0x79, 0x61, 0x20, 0x6d, 0x6f,
+0x74, 0xf3, 0x62, 0xe1, 0x3b, 0x73, 0xe1, 0x6e, 0x7a, 0xe1, 0x20, 0x79,
+0x61, 0x20, 0x6e, 0x73, 0x61, 0x6d, 0x62, 0x6f, 0x3b, 0x73, 0xe1, 0x6e,
+0x7a, 0xe1, 0x20, 0x79, 0x61, 0x20, 0x6d, 0x77, 0x61, 0x6d, 0x62, 0x65,
+0x3b, 0x73, 0xe1, 0x6e, 0x7a, 0xe1, 0x20, 0x79, 0x61, 0x20, 0x6c, 0x69,
+0x62, 0x77, 0x61, 0x3b, 0x73, 0xe1, 0x6e, 0x7a, 0xe1, 0x20, 0x79, 0x61,
+0x20, 0x7a, 0xf3, 0x6d, 0x69, 0x3b, 0x73, 0xe1, 0x6e, 0x7a, 0xe1, 0x20,
+0x79, 0x61, 0x20, 0x7a, 0xf3, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x6d,
+0x254, 0x30c, 0x6b, 0x254, 0x301, 0x3b, 0x73, 0xe1, 0x6e, 0x7a, 0xe1, 0x20,
+0x79, 0x61, 0x20, 0x7a, 0xf3, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x6d,
+0xed, 0x62, 0x61, 0x6c, 0xe9, 0x79, 0x61, 0x6e, 0x3b, 0x66, 0x62, 0x6c,
+0x3b, 0x6d, 0x73, 0x69, 0x3b, 0x61, 0x70, 0x6c, 0x3b, 0x6d, 0x61, 0x69,
+0x3b, 0x79, 0x75, 0x6e, 0x3b, 0x79, 0x75, 0x6c, 0x3b, 0x61, 0x67, 0x74,
+0x3b, 0x73, 0x74, 0x62, 0x3b, 0x254, 0x74, 0x62, 0x3b, 0x6e, 0x76, 0x62,
+0x3b, 0x64, 0x73, 0x62, 0x79, 0x3b, 0x66, 0x3b, 0x6d, 0x3b, 0x61, 0x3b,
+0x6d, 0x3b, 0x79, 0x3b, 0x79, 0x3b, 0x61, 0x3b, 0x73, 0x3b, 0x254, 0x3b,
+0x6e, 0x3b, 0x64, 0x73, 0x61, 0x75, 0x73, 0x69, 0x73, 0x3b, 0x76, 0x61,
+0x73, 0x61, 0x72, 0x69, 0x73, 0x3b, 0x6b, 0x6f, 0x76, 0x61, 0x73, 0x3b,
+0x62, 0x61, 0x6c, 0x61, 0x6e, 0x64, 0x69, 0x73, 0x3b, 0x67, 0x65, 0x67,
+0x75, 0x17e, 0x117, 0x3b, 0x62, 0x69, 0x72, 0x17e, 0x65, 0x6c, 0x69, 0x73,
+0x3b, 0x6c, 0x69, 0x65, 0x70, 0x61, 0x3b, 0x72, 0x75, 0x67, 0x70, 0x6a,
+0x16b, 0x74, 0x69, 0x73, 0x3b, 0x72, 0x75, 0x67, 0x73, 0x117, 0x6a, 0x69,
+0x73, 0x3b, 0x73, 0x70, 0x61, 0x6c, 0x69, 0x73, 0x3b, 0x6c, 0x61, 0x70,
+0x6b, 0x72, 0x69, 0x74, 0x69, 0x73, 0x3b, 0x67, 0x72, 0x75, 0x6f, 0x64,
+0x69, 0x73, 0x73, 0x61, 0x75, 0x73, 0x69, 0x6f, 0x3b, 0x76, 0x61, 0x73,
+0x61, 0x72, 0x69, 0x6f, 0x3b, 0x6b, 0x6f, 0x76, 0x6f, 0x3b, 0x62, 0x61,
+0x6c, 0x61, 0x6e, 0x64, 0x17e, 0x69, 0x6f, 0x3b, 0x67, 0x65, 0x67, 0x75,
+0x17e, 0x117, 0x73, 0x3b, 0x62, 0x69, 0x72, 0x17e, 0x65, 0x6c, 0x69, 0x6f,
+0x3b, 0x6c, 0x69, 0x65, 0x70, 0x6f, 0x73, 0x3b, 0x72, 0x75, 0x67, 0x70,
+0x6a, 0x16b, 0x10d, 0x69, 0x6f, 0x3b, 0x72, 0x75, 0x67, 0x73, 0x117, 0x6a,
+0x6f, 0x3b, 0x73, 0x70, 0x61, 0x6c, 0x69, 0x6f, 0x3b, 0x6c, 0x61, 0x70,
+0x6b, 0x72, 0x69, 0x10d, 0x69, 0x6f, 0x3b, 0x67, 0x72, 0x75, 0x6f, 0x64,
+0x17e, 0x69, 0x6f, 0x73, 0x61, 0x75, 0x73, 0x2e, 0x3b, 0x76, 0x61, 0x73,
+0x2e, 0x3b, 0x6b, 0x6f, 0x76, 0x2e, 0x3b, 0x62, 0x61, 0x6c, 0x2e, 0x3b,
+0x67, 0x65, 0x67, 0x2e, 0x3b, 0x62, 0x69, 0x72, 0x17e, 0x2e, 0x3b, 0x6c,
+0x69, 0x65, 0x70, 0x2e, 0x3b, 0x72, 0x75, 0x67, 0x70, 0x2e, 0x3b, 0x72,
+0x75, 0x67, 0x73, 0x2e, 0x3b, 0x73, 0x70, 0x61, 0x6c, 0x2e, 0x3b, 0x6c,
+0x61, 0x70, 0x6b, 0x72, 0x2e, 0x3b, 0x67, 0x72, 0x75, 0x6f, 0x64, 0x2e,
+0x53, 0x3b, 0x56, 0x3b, 0x4b, 0x3b, 0x42, 0x3b, 0x47, 0x3b, 0x42, 0x3b,
+0x4c, 0x3b, 0x52, 0x3b, 0x52, 0x3b, 0x53, 0x3b, 0x4c, 0x3b, 0x47, 0x6a,
+0x61, 0x6e, 0x75, 0x61, 0x72, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61,
+0x72, 0x3b, 0x6d, 0x11b, 0x72, 0x63, 0x3b, 0x61, 0x70, 0x72, 0x79, 0x6c,
+0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x6a, 0x3b, 0x6a,
+0x75, 0x6c, 0x69, 0x6a, 0x3b, 0x61, 0x77, 0x67, 0x75, 0x73, 0x74, 0x3b,
+0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6f, 0x6b,
+0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x6e, 0x6f, 0x77, 0x65, 0x6d, 0x62,
+0x65, 0x72, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x6a,
+0x61, 0x6e, 0x75, 0x61, 0x72, 0x61, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75,
+0x61, 0x72, 0x61, 0x3b, 0x6d, 0x11b, 0x72, 0x63, 0x61, 0x3b, 0x61, 0x70,
+0x72, 0x79, 0x6c, 0x61, 0x3b, 0x6d, 0x61, 0x6a, 0x61, 0x3b, 0x6a, 0x75,
+0x6e, 0x69, 0x6a, 0x61, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x6a, 0x61, 0x3b,
+0x61, 0x77, 0x67, 0x75, 0x73, 0x74, 0x61, 0x3b, 0x73, 0x65, 0x70, 0x74,
+0x65, 0x6d, 0x62, 0x72, 0x61, 0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x62, 0x72,
+0x61, 0x3b, 0x6e, 0x6f, 0x77, 0x65, 0x6d, 0x62, 0x72, 0x61, 0x3b, 0x64,
+0x65, 0x63, 0x65, 0x6d, 0x62, 0x72, 0x61, 0x6a, 0x61, 0x6e, 0x3b, 0x66,
+0x65, 0x62, 0x3b, 0x6d, 0x11b, 0x72, 0x3b, 0x61, 0x70, 0x72, 0x3b, 0x6d,
+0x61, 0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x3b, 0x6a, 0x75, 0x6c, 0x3b, 0x61,
+0x77, 0x67, 0x3b, 0x73, 0x65, 0x70, 0x3b, 0x6f, 0x6b, 0x74, 0x3b, 0x6e,
+0x6f, 0x77, 0x3b, 0x64, 0x65, 0x63, 0x6a, 0x61, 0x6e, 0x2e, 0x3b, 0x66,
+0x65, 0x62, 0x2e, 0x3b, 0x6d, 0x11b, 0x72, 0x2e, 0x3b, 0x61, 0x70, 0x72,
+0x2e, 0x3b, 0x6d, 0x61, 0x6a, 0x2e, 0x3b, 0x6a, 0x75, 0x6e, 0x2e, 0x3b,
+0x6a, 0x75, 0x6c, 0x2e, 0x3b, 0x61, 0x77, 0x67, 0x2e, 0x3b, 0x73, 0x65,
+0x70, 0x2e, 0x3b, 0x6f, 0x6b, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x77, 0x2e,
+0x3b, 0x64, 0x65, 0x63, 0x2e, 0x4a, 0x61, 0x6e, 0x75, 0x61, 0x61, 0x72,
+0x3b, 0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x61, 0x72, 0x3b, 0x4d, 0xe4,
+0x72, 0x7a, 0x3b, 0x41, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x61, 0x69,
+0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x69, 0x3b, 0x41,
+0x75, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d,
+0x62, 0x65, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x76, 0x65, 0x72, 0x3b,
+0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x44, 0x65, 0x7a,
+0x65, 0x6d, 0x62, 0x65, 0x72, 0x4a, 0x61, 0x6e, 0x2e, 0x3b, 0x46, 0x65,
+0x62, 0x2e, 0x3b, 0x4d, 0xe4, 0x72, 0x7a, 0x3b, 0x41, 0x70, 0x72, 0x2e,
+0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75,
+0x6c, 0x69, 0x3b, 0x41, 0x75, 0x67, 0x2e, 0x3b, 0x53, 0x65, 0x70, 0x2e,
+0x3b, 0x4f, 0x6b, 0x74, 0x2e, 0x3b, 0x4e, 0x6f, 0x76, 0x2e, 0x3b, 0x44,
+0x65, 0x7a, 0x2e, 0x43, 0x69, 0x6f, 0x6e, 0x67, 0x6f, 0x3b, 0x4c, 0xf9,
+0x69, 0x73, 0x68, 0x69, 0x3b, 0x4c, 0x75, 0x73, 0xf2, 0x6c, 0x6f, 0x3b,
+0x4d, 0xf9, 0x75, 0x79, 0xe0, 0x3b, 0x4c, 0x75, 0x6d, 0xf9, 0x6e, 0x67,
+0xf9, 0x6c, 0xf9, 0x3b, 0x4c, 0x75, 0x66, 0x75, 0x69, 0x6d, 0x69, 0x3b,
+0x4b, 0x61, 0x62, 0xe0, 0x6c, 0xe0, 0x73, 0x68, 0xec, 0x70, 0xf9, 0x3b,
+0x4c, 0xf9, 0x73, 0x68, 0xec, 0x6b, 0xe0, 0x3b, 0x4c, 0x75, 0x74, 0x6f,
+0x6e, 0x67, 0x6f, 0x6c, 0x6f, 0x3b, 0x4c, 0x75, 0x6e, 0x67, 0xf9, 0x64,
+0x69, 0x3b, 0x4b, 0x61, 0x73, 0x77, 0xe8, 0x6b, 0xe8, 0x73, 0xe8, 0x3b,
+0x43, 0x69, 0x73, 0x77, 0xe0, 0x43, 0x69, 0x6f, 0x3b, 0x4c, 0x75, 0x69,
+0x3b, 0x4c, 0x75, 0x73, 0x3b, 0x4d, 0x75, 0x75, 0x3b, 0x4c, 0x75, 0x6d,
+0x3b, 0x4c, 0x75, 0x66, 0x3b, 0x4b, 0x61, 0x62, 0x3b, 0x4c, 0x75, 0x73,
+0x68, 0x3b, 0x4c, 0x75, 0x74, 0x3b, 0x4c, 0x75, 0x6e, 0x3b, 0x4b, 0x61,
+0x73, 0x3b, 0x43, 0x69, 0x73, 0x43, 0x3b, 0x4c, 0x3b, 0x4c, 0x3b, 0x4d,
+0x3b, 0x4c, 0x3b, 0x4c, 0x3b, 0x4b, 0x3b, 0x4c, 0x3b, 0x4c, 0x3b, 0x4c,
+0x3b, 0x4b, 0x3b, 0x43, 0x44, 0x77, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x20,
+0x41, 0x63, 0x68, 0x69, 0x65, 0x6c, 0x3b, 0x44, 0x77, 0x65, 0x20, 0x6d,
+0x61, 0x72, 0x20, 0x41, 0x72, 0x69, 0x79, 0x6f, 0x3b, 0x44, 0x77, 0x65,
+0x20, 0x6d, 0x61, 0x72, 0x20, 0x41, 0x64, 0x65, 0x6b, 0x3b, 0x44, 0x77,
+0x65, 0x20, 0x6d, 0x61, 0x72, 0x20, 0x41, 0x6e, 0x67, 0x2019, 0x77, 0x65,
+0x6e, 0x3b, 0x44, 0x77, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x20, 0x41, 0x62,
+0x69, 0x63, 0x68, 0x3b, 0x44, 0x77, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x20,
+0x41, 0x75, 0x63, 0x68, 0x69, 0x65, 0x6c, 0x3b, 0x44, 0x77, 0x65, 0x20,
+0x6d, 0x61, 0x72, 0x20, 0x41, 0x62, 0x69, 0x72, 0x69, 0x79, 0x6f, 0x3b,
+0x44, 0x77, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x20, 0x41, 0x62, 0x6f, 0x72,
+0x6f, 0x3b, 0x44, 0x77, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x20, 0x4f, 0x63,
+0x68, 0x69, 0x6b, 0x6f, 0x3b, 0x44, 0x77, 0x65, 0x20, 0x6d, 0x61, 0x72,
+0x20, 0x41, 0x70, 0x61, 0x72, 0x3b, 0x44, 0x77, 0x65, 0x20, 0x6d, 0x61,
+0x72, 0x20, 0x67, 0x69, 0x20, 0x61, 0x63, 0x68, 0x69, 0x65, 0x6c, 0x3b,
+0x44, 0x77, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x20, 0x41, 0x70, 0x61, 0x72,
+0x20, 0x67, 0x69, 0x20, 0x61, 0x72, 0x69, 0x79, 0x6f, 0x44, 0x41, 0x43,
+0x3b, 0x44, 0x41, 0x52, 0x3b, 0x44, 0x41, 0x44, 0x3b, 0x44, 0x41, 0x4e,
+0x3b, 0x44, 0x41, 0x48, 0x3b, 0x44, 0x41, 0x55, 0x3b, 0x44, 0x41, 0x4f,
+0x3b, 0x44, 0x41, 0x42, 0x3b, 0x44, 0x4f, 0x43, 0x3b, 0x44, 0x41, 0x50,
+0x3b, 0x44, 0x47, 0x49, 0x3b, 0x44, 0x41, 0x47, 0x43, 0x3b, 0x52, 0x3b,
+0x44, 0x3b, 0x4e, 0x3b, 0x42, 0x3b, 0x55, 0x3b, 0x42, 0x3b, 0x42, 0x3b,
+0x43, 0x3b, 0x50, 0x3b, 0x43, 0x3b, 0x50, 0x4a, 0x61, 0x6e, 0x75, 0x61,
+0x72, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b, 0x4d, 0xe4,
+0x65, 0x72, 0x7a, 0x3b, 0x41, 0x62, 0x72, 0xeb, 0x6c, 0x6c, 0x3b, 0x4d,
+0x65, 0x65, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x69,
+0x3b, 0x41, 0x75, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x53, 0x65, 0x70, 0x74,
+0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x65,
+0x72, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x44,
+0x65, 0x7a, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x4a, 0x61, 0x6e, 0x3b, 0x46,
+0x65, 0x62, 0x3b, 0x4d, 0xe4, 0x65, 0x3b, 0x41, 0x62, 0x72, 0x3b, 0x4d,
+0x65, 0x65, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41,
+0x75, 0x67, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e,
+0x6f, 0x76, 0x3b, 0x44, 0x65, 0x7a, 0x4a, 0x61, 0x6e, 0x2e, 0x3b, 0x46,
+0x65, 0x62, 0x2e, 0x3b, 0x4d, 0xe4, 0x65, 0x2e, 0x3b, 0x41, 0x62, 0x72,
+0x2e, 0x3b, 0x4d, 0x65, 0x65, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a,
+0x75, 0x6c, 0x69, 0x3b, 0x41, 0x75, 0x67, 0x2e, 0x3b, 0x53, 0x65, 0x70,
+0x2e, 0x3b, 0x4f, 0x6b, 0x74, 0x2e, 0x3b, 0x4e, 0x6f, 0x76, 0x2e, 0x3b,
+0x44, 0x65, 0x7a, 0x2e, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b,
+0x4d, 0x61, 0x72, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x65, 0x69, 0x3b,
+0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x6f, 0x3b,
+0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b,
+0x44, 0x65, 0x73, 0x458, 0x430, 0x43d, 0x443, 0x430, 0x440, 0x438, 0x3b, 0x444,
+0x435, 0x432, 0x440, 0x443, 0x430, 0x440, 0x438, 0x3b, 0x43c, 0x430, 0x440, 0x442,
+0x3b, 0x430, 0x43f, 0x440, 0x438, 0x43b, 0x3b, 0x43c, 0x430, 0x458, 0x3b, 0x458,
+0x443, 0x43d, 0x438, 0x3b, 0x458, 0x443, 0x43b, 0x438, 0x3b, 0x430, 0x432, 0x433,
+0x443, 0x441, 0x442, 0x3b, 0x441, 0x435, 0x43f, 0x442, 0x435, 0x43c, 0x432, 0x440,
+0x438, 0x3b, 0x43e, 0x43a, 0x442, 0x43e, 0x43c, 0x432, 0x440, 0x438, 0x3b, 0x43d,
+0x43e, 0x435, 0x43c, 0x432, 0x440, 0x438, 0x3b, 0x434, 0x435, 0x43a, 0x435, 0x43c,
+0x432, 0x440, 0x438, 0x458, 0x430, 0x43d, 0x2e, 0x3b, 0x444, 0x435, 0x432, 0x2e,
+0x3b, 0x43c, 0x430, 0x440, 0x2e, 0x3b, 0x430, 0x43f, 0x440, 0x2e, 0x3b, 0x43c,
+0x430, 0x458, 0x3b, 0x458, 0x443, 0x43d, 0x2e, 0x3b, 0x458, 0x443, 0x43b, 0x2e,
+0x3b, 0x430, 0x432, 0x433, 0x2e, 0x3b, 0x441, 0x435, 0x43f, 0x2e, 0x3b, 0x43e,
+0x43a, 0x442, 0x2e, 0x3b, 0x43d, 0x43e, 0x435, 0x2e, 0x3b, 0x434, 0x435, 0x43a,
+0x2e, 0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x46, 0x65, 0x62,
+0x72, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x3b,
+0x41, 0x70, 0x72, 0x69, 0x6c, 0x79, 0x69, 0x3b, 0x4d, 0x65, 0x69, 0x3b,
+0x4a, 0x75, 0x6e, 0x79, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x79, 0x61, 0x69,
+0x3b, 0x41, 0x67, 0x75, 0x73, 0x74, 0x69, 0x3b, 0x53, 0x65, 0x70, 0x74,
+0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x61, 0x3b,
+0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x44, 0x65, 0x73, 0x65,
+0x6d, 0x62, 0x61, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d,
+0x61, 0x63, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a,
+0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x6f, 0x3b, 0x53,
+0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44,
+0x65, 0x73, 0x91c, 0x928, 0x935, 0x930, 0x940, 0x3b, 0x92b, 0x930, 0x935, 0x930,
+0x940, 0x3b, 0x92e, 0x93e, 0x930, 0x94d, 0x91a, 0x3b, 0x905, 0x92a, 0x94d, 0x930,
+0x948, 0x932, 0x3b, 0x92e, 0x908, 0x3b, 0x91c, 0x942, 0x928, 0x3b, 0x91c, 0x941,
+0x932, 0x93e, 0x908, 0x3b, 0x905, 0x917, 0x938, 0x94d, 0x924, 0x3b, 0x938, 0x93f,
+0x924, 0x902, 0x92c, 0x930, 0x3b, 0x905, 0x915, 0x94d, 0x91f, 0x942, 0x92c, 0x930,
+0x3b, 0x928, 0x935, 0x902, 0x92c, 0x930, 0x3b, 0x926, 0x93f, 0x938, 0x902, 0x92c,
+0x930, 0x91c, 0x928, 0x935, 0x930, 0x940, 0x3b, 0x92b, 0x930, 0x935, 0x930, 0x940,
+0x3b, 0x92e, 0x93e, 0x930, 0x94d, 0x91a, 0x3b, 0x905, 0x92a, 0x94d, 0x930, 0x948,
+0x932, 0x3b, 0x92e, 0x908, 0x3b, 0x91c, 0x942, 0x928, 0x3b, 0x91c, 0x941, 0x932,
+0x93e, 0x908, 0x3b, 0x905, 0x917, 0x938, 0x94d, 0x924, 0x3b, 0x938, 0x93f, 0x924,
+0x902, 0x92c, 0x930, 0x3b, 0x905, 0x915, 0x94d, 0x924, 0x942, 0x92c, 0x930, 0x3b,
+0x928, 0x935, 0x902, 0x92c, 0x930, 0x3b, 0x926, 0x93f, 0x938, 0x902, 0x92c, 0x930,
+0x91c, 0x928, 0x970, 0x3b, 0x92b, 0x930, 0x970, 0x3b, 0x92e, 0x93e, 0x930, 0x94d,
+0x91a, 0x3b, 0x905, 0x92a, 0x94d, 0x930, 0x948, 0x932, 0x3b, 0x92e, 0x908, 0x3b,
+0x91c, 0x942, 0x928, 0x3b, 0x91c, 0x941, 0x932, 0x970, 0x3b, 0x905, 0x917, 0x970,
+0x3b, 0x938, 0x93f, 0x924, 0x970, 0x3b, 0x905, 0x915, 0x94d, 0x924, 0x942, 0x970,
+0x3b, 0x928, 0x935, 0x970, 0x3b, 0x926, 0x93f, 0x938, 0x970, 0x91c, 0x3b, 0x92b,
+0x3b, 0x92e, 0x93e, 0x3b, 0x905, 0x3b, 0x92e, 0x3b, 0x91c, 0x942, 0x3b, 0x91c,
+0x941, 0x3b, 0x905, 0x3b, 0x938, 0x93f, 0x3b, 0x905, 0x3b, 0x928, 0x3b, 0x926,
+0x93f, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x6f, 0x20, 0x6b, 0x77,
+0x61, 0x6e, 0x7a, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77,
+0x6f, 0x20, 0x75, 0x6e, 0x61, 0x79, 0x65, 0x6c, 0x69, 0x3b, 0x4d, 0x77,
+0x65, 0x72, 0x69, 0x20, 0x77, 0x6f, 0x20, 0x75, 0x6e, 0x65, 0x72, 0x61,
+0x72, 0x75, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x6f, 0x20,
+0x75, 0x6e, 0x65, 0x63, 0x68, 0x65, 0x73, 0x68, 0x65, 0x3b, 0x4d, 0x77,
+0x65, 0x72, 0x69, 0x20, 0x77, 0x6f, 0x20, 0x75, 0x6e, 0x65, 0x74, 0x68,
+0x61, 0x6e, 0x75, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x6f,
+0x20, 0x74, 0x68, 0x61, 0x6e, 0x75, 0x20, 0x6e, 0x61, 0x20, 0x6d, 0x6f,
+0x63, 0x68, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x6f,
+0x20, 0x73, 0x61, 0x62, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20,
+0x77, 0x6f, 0x20, 0x6e, 0x61, 0x6e, 0x65, 0x3b, 0x4d, 0x77, 0x65, 0x72,
+0x69, 0x20, 0x77, 0x6f, 0x20, 0x74, 0x69, 0x73, 0x61, 0x3b, 0x4d, 0x77,
+0x65, 0x72, 0x69, 0x20, 0x77, 0x6f, 0x20, 0x6b, 0x75, 0x6d, 0x69, 0x3b,
+0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x6f, 0x20, 0x6b, 0x75, 0x6d,
+0x69, 0x20, 0x6e, 0x61, 0x20, 0x6d, 0x6f, 0x6a, 0x61, 0x3b, 0x4d, 0x77,
+0x65, 0x72, 0x69, 0x20, 0x77, 0x6f, 0x20, 0x6b, 0x75, 0x6d, 0x69, 0x20,
+0x6e, 0x61, 0x20, 0x79, 0x65, 0x6c, 0x2019, 0x6c, 0x69, 0x4b, 0x77, 0x61,
+0x3b, 0x55, 0x6e, 0x61, 0x3b, 0x52, 0x61, 0x72, 0x3b, 0x43, 0x68, 0x65,
+0x3b, 0x54, 0x68, 0x61, 0x3b, 0x4d, 0x6f, 0x63, 0x3b, 0x53, 0x61, 0x62,
+0x3b, 0x4e, 0x61, 0x6e, 0x3b, 0x54, 0x69, 0x73, 0x3b, 0x4b, 0x75, 0x6d,
+0x3b, 0x4d, 0x6f, 0x6a, 0x3b, 0x59, 0x65, 0x6c, 0x4b, 0x3b, 0x55, 0x3b,
+0x52, 0x3b, 0x43, 0x3b, 0x54, 0x3b, 0x4d, 0x3b, 0x53, 0x3b, 0x4e, 0x3b,
+0x54, 0x3b, 0x4b, 0x3b, 0x4d, 0x3b, 0x59, 0x4d, 0x77, 0x65, 0x64, 0x69,
+0x20, 0x4e, 0x74, 0x61, 0x6e, 0x64, 0x69, 0x3b, 0x4d, 0x77, 0x65, 0x64,
+0x69, 0x20, 0x77, 0x61, 0x20, 0x50, 0x69, 0x6c, 0x69, 0x3b, 0x4d, 0x77,
+0x65, 0x64, 0x69, 0x20, 0x77, 0x61, 0x20, 0x54, 0x61, 0x74, 0x75, 0x3b,
+0x4d, 0x77, 0x65, 0x64, 0x69, 0x20, 0x77, 0x61, 0x20, 0x4e, 0x63, 0x68,
+0x65, 0x63, 0x68, 0x69, 0x3b, 0x4d, 0x77, 0x65, 0x64, 0x69, 0x20, 0x77,
+0x61, 0x20, 0x4e, 0x6e, 0x79, 0x61, 0x6e, 0x6f, 0x3b, 0x4d, 0x77, 0x65,
+0x64, 0x69, 0x20, 0x77, 0x61, 0x20, 0x4e, 0x6e, 0x79, 0x61, 0x6e, 0x6f,
+0x20, 0x6e, 0x61, 0x20, 0x55, 0x6d, 0x6f, 0x3b, 0x4d, 0x77, 0x65, 0x64,
+0x69, 0x20, 0x77, 0x61, 0x20, 0x4e, 0x6e, 0x79, 0x61, 0x6e, 0x6f, 0x20,
+0x6e, 0x61, 0x20, 0x4d, 0x69, 0x76, 0x69, 0x6c, 0x69, 0x3b, 0x4d, 0x77,
+0x65, 0x64, 0x69, 0x20, 0x77, 0x61, 0x20, 0x4e, 0x6e, 0x79, 0x61, 0x6e,
+0x6f, 0x20, 0x6e, 0x61, 0x20, 0x4d, 0x69, 0x74, 0x61, 0x74, 0x75, 0x3b,
+0x4d, 0x77, 0x65, 0x64, 0x69, 0x20, 0x77, 0x61, 0x20, 0x4e, 0x6e, 0x79,
+0x61, 0x6e, 0x6f, 0x20, 0x6e, 0x61, 0x20, 0x4e, 0x63, 0x68, 0x65, 0x63,
+0x68, 0x69, 0x3b, 0x4d, 0x77, 0x65, 0x64, 0x69, 0x20, 0x77, 0x61, 0x20,
+0x4e, 0x6e, 0x79, 0x61, 0x6e, 0x6f, 0x20, 0x6e, 0x61, 0x20, 0x4e, 0x6e,
+0x79, 0x61, 0x6e, 0x6f, 0x3b, 0x4d, 0x77, 0x65, 0x64, 0x69, 0x20, 0x77,
+0x61, 0x20, 0x4e, 0x6e, 0x79, 0x61, 0x6e, 0x6f, 0x20, 0x6e, 0x61, 0x20,
+0x4e, 0x6e, 0x79, 0x61, 0x6e, 0x6f, 0x20, 0x6e, 0x61, 0x20, 0x55, 0x3b,
+0x4d, 0x77, 0x65, 0x64, 0x69, 0x20, 0x77, 0x61, 0x20, 0x4e, 0x6e, 0x79,
+0x61, 0x6e, 0x6f, 0x20, 0x6e, 0x61, 0x20, 0x4e, 0x6e, 0x79, 0x61, 0x6e,
+0x6f, 0x20, 0x6e, 0x61, 0x20, 0x4d, 0x4a, 0x61, 0x6e, 0x6f, 0x61, 0x72,
+0x79, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x6f, 0x61, 0x72, 0x79, 0x3b, 0x4d,
+0x61, 0x72, 0x74, 0x73, 0x61, 0x3b, 0x41, 0x70, 0x72, 0x69, 0x6c, 0x79,
+0x3b, 0x4d, 0x65, 0x79, 0x3b, 0x4a, 0x6f, 0x6e, 0x61, 0x3b, 0x4a, 0x6f,
+0x6c, 0x61, 0x79, 0x3b, 0x41, 0x6f, 0x67, 0x6f, 0x73, 0x69, 0x74, 0x72,
+0x61, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x61, 0x6d, 0x62, 0x72, 0x61, 0x3b,
+0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x72, 0x61, 0x3b, 0x4e, 0x6f, 0x76, 0x61,
+0x6d, 0x62, 0x72, 0x61, 0x3b, 0x44, 0x65, 0x73, 0x61, 0x6d, 0x62, 0x72,
+0x61, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x72,
+0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x65, 0x79, 0x3b, 0x4a, 0x6f, 0x6e,
+0x3b, 0x4a, 0x6f, 0x6c, 0x3b, 0x41, 0x6f, 0x67, 0x3b, 0x53, 0x65, 0x70,
+0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x73,
+0xd1c, 0xd28, 0xd41, 0xd35, 0xd30, 0xd3f, 0x3b, 0xd2b, 0xd46, 0xd2c, 0xd4d, 0xd30,
+0xd41, 0xd35, 0xd30, 0xd3f, 0x3b, 0xd2e, 0xd3e, 0xd7c, 0xd1a, 0xd4d, 0xd1a, 0xd4d,
+0x3b, 0xd0f, 0xd2a, 0xd4d, 0xd30, 0xd3f, 0xd7d, 0x3b, 0xd2e, 0xd47, 0xd2f, 0xd4d,
+0x3b, 0xd1c, 0xd42, 0xd7a, 0x3b, 0xd1c, 0xd42, 0xd32, 0xd48, 0x3b, 0xd13, 0xd17,
+0xd38, 0xd4d, 0xd31, 0xd4d, 0xd31, 0xd4d, 0x3b, 0xd38, 0xd46, 0xd2a, 0xd4d, 0xd31,
+0xd4d, 0xd31, 0xd02, 0xd2c, 0xd7c, 0x3b, 0xd12, 0xd15, 0xd4d, 0x200c, 0xd1f, 0xd4b,
+0xd2c, 0xd7c, 0x3b, 0xd28, 0xd35, 0xd02, 0xd2c, 0xd7c, 0x3b, 0xd21, 0xd3f, 0xd38,
+0xd02, 0xd2c, 0xd7c, 0xd1c, 0xd28, 0xd41, 0x3b, 0xd2b, 0xd46, 0xd2c, 0xd4d, 0xd30,
+0xd41, 0x3b, 0xd2e, 0xd3e, 0xd7c, 0x3b, 0xd0f, 0xd2a, 0xd4d, 0xd30, 0xd3f, 0x3b,
+0xd2e, 0xd47, 0xd2f, 0xd4d, 0x3b, 0xd1c, 0xd42, 0xd7a, 0x3b, 0xd1c, 0xd42, 0xd32,
+0xd48, 0x3b, 0xd13, 0xd17, 0x3b, 0xd38, 0xd46, 0xd2a, 0xd4d, 0xd31, 0xd4d, 0xd31,
+0xd02, 0x3b, 0xd12, 0xd15, 0xd4d, 0xd1f, 0xd4b, 0x3b, 0xd28, 0xd35, 0xd02, 0x3b,
+0xd21, 0xd3f, 0xd38, 0xd02, 0xd1c, 0x3b, 0xd2b, 0xd46, 0x3b, 0xd2e, 0xd3e, 0x3b,
+0xd0f, 0x3b, 0xd2e, 0xd46, 0x3b, 0xd1c, 0xd42, 0xd7a, 0x3b, 0xd1c, 0xd42, 0x3b,
+0xd13, 0x3b, 0xd38, 0xd46, 0x3b, 0xd12, 0x3b, 0xd28, 0x3b, 0xd21, 0xd3f, 0x4a,
+0x61, 0x6e, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x75,
+0x61, 0x72, 0x69, 0x3b, 0x4d, 0x61, 0x63, 0x3b, 0x41, 0x70, 0x72, 0x69,
+0x6c, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75,
+0x6c, 0x61, 0x69, 0x3b, 0x4f, 0x67, 0x6f, 0x73, 0x3b, 0x53, 0x65, 0x70,
+0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62,
+0x65, 0x72, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b,
+0x44, 0x69, 0x73, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x4a, 0x61, 0x6e, 0x3b,
+0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x63, 0x3b, 0x41, 0x70, 0x72, 0x3b,
+0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b,
+0x4f, 0x67, 0x6f, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b,
+0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x69, 0x73, 0x62c, 0x627, 0x646, 0x648, 0x627,
+0x631, 0x64a, 0x3b, 0x641, 0x64a, 0x628, 0x648, 0x627, 0x631, 0x64a, 0x3b, 0x645,
+0x686, 0x3b, 0x627, 0x6a4, 0x631, 0x64a, 0x644, 0x3b, 0x645, 0x64a, 0x3b, 0x62c,
+0x648, 0x646, 0x3b, 0x62c, 0x648, 0x644, 0x627, 0x64a, 0x3b, 0x762, 0x648, 0x633,
+0x3b, 0x633, 0x64a, 0x6a4, 0x62a, 0x64a, 0x645, 0x628, 0x631, 0x3b, 0x627, 0x648,
+0x6a9, 0x62a, 0x648, 0x628, 0x631, 0x3b, 0x646, 0x648, 0x6cf, 0x64a, 0x645, 0x628,
+0x631, 0x3b, 0x62f, 0x64a, 0x633, 0x64a, 0x645, 0x628, 0x631, 0x4a, 0x61, 0x6e,
+0x6e, 0x61, 0x72, 0x3b, 0x46, 0x72, 0x61, 0x72, 0x3b, 0x4d, 0x61, 0x72,
+0x7a, 0x75, 0x3b, 0x41, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x65, 0x6a,
+0x6a, 0x75, 0x3b, 0x120, 0x75, 0x6e, 0x6a, 0x75, 0x3b, 0x4c, 0x75, 0x6c,
+0x6a, 0x75, 0x3b, 0x41, 0x77, 0x77, 0x69, 0x73, 0x73, 0x75, 0x3b, 0x53,
+0x65, 0x74, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x75, 0x3b, 0x4f, 0x74, 0x74,
+0x75, 0x62, 0x72, 0x75, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72,
+0x75, 0x3b, 0x44, 0x69, 0x10b, 0x65, 0x6d, 0x62, 0x72, 0x75, 0x4a, 0x61,
+0x6e, 0x3b, 0x46, 0x72, 0x61, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x70,
+0x72, 0x3b, 0x4d, 0x65, 0x6a, 0x3b, 0x120, 0x75, 0x6e, 0x3b, 0x4c, 0x75,
+0x6c, 0x3b, 0x41, 0x77, 0x77, 0x3b, 0x53, 0x65, 0x74, 0x3b, 0x4f, 0x74,
+0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x69, 0x10b, 0x4a, 0x6e, 0x3b,
+0x46, 0x72, 0x3b, 0x4d, 0x7a, 0x3b, 0x41, 0x70, 0x3b, 0x4d, 0x6a, 0x3b,
+0x120, 0x6e, 0x3b, 0x4c, 0x6a, 0x3b, 0x41, 0x77, 0x3b, 0x53, 0x74, 0x3b,
+0x4f, 0x62, 0x3b, 0x4e, 0x76, 0x3b, 0x44, 0x10b, 0x4a, 0x3b, 0x46, 0x3b,
+0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x120, 0x3b, 0x4c, 0x3b, 0x41, 0x3b,
+0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x99c, 0x9be, 0x9a8, 0x9c1, 0x9f1,
+0x9be, 0x9b0, 0x9bf, 0x3b, 0x9ab, 0x9c7, 0x9ac, 0x9cd, 0x9b0, 0x9c1, 0x9f1, 0x9be,
+0x9b0, 0x9bf, 0x3b, 0x9ae, 0x9be, 0x9b0, 0x9cd, 0x99a, 0x3b, 0x98f, 0x9aa, 0x9cd,
+0x9b0, 0x9bf, 0x9b2, 0x3b, 0x9ae, 0x9c7, 0x3b, 0x99c, 0x9c1, 0x9a8, 0x3b, 0x99c,
+0x9c1, 0x9b2, 0x9be, 0x987, 0x3b, 0x993, 0x997, 0x9b7, 0x9cd, 0x99f, 0x3b, 0x9b8,
+0x9c7, 0x9aa, 0x9cd, 0x99f, 0x9c7, 0x9ae, 0x9cd, 0x9ac, 0x9b0, 0x3b, 0x993, 0x995,
+0x9cd, 0x99f, 0x9cb, 0x9ac, 0x9b0, 0x3b, 0x9a8, 0x9ac, 0x9c7, 0x9ae, 0x9cd, 0x9ac,
+0x9b0, 0x3b, 0x9a1, 0x9bf, 0x9b8, 0x9c7, 0x9ae, 0x9cd, 0x9ac, 0x9b0, 0x99c, 0x9a8,
+0x9c1, 0x9f1, 0x9be, 0x9b0, 0x9c0, 0x3b, 0x9ab, 0x9c7, 0x9ac, 0x9cd, 0x9b0, 0x9c1,
+0x9f1, 0x9be, 0x9b0, 0x9bf, 0x3b, 0x9ae, 0x9be, 0x9b0, 0x9cd, 0x99a, 0x3b, 0x98f,
+0x9aa, 0x9cd, 0x9b0, 0x9bf, 0x9b2, 0x3b, 0x9ae, 0x9c7, 0x3b, 0x99c, 0x9c1, 0x9a8,
+0x3b, 0x99c, 0x9c1, 0x9b2, 0x9be, 0x987, 0x3b, 0x200c, 0x993, 0x997, 0x9b7, 0x9cd,
+0x99f, 0x3b, 0x9b8, 0x9c7, 0x9aa, 0x9cd, 0x99f, 0x9c7, 0x9ae, 0x9cd, 0x9ac, 0x9b0,
+0x3b, 0x993, 0x995, 0x9cd, 0x99f, 0x9cb, 0x9ac, 0x9b0, 0x3b, 0x9a8, 0x9ad, 0x9c7,
+0x9ae, 0x9cd, 0x9ac, 0x9b0, 0x3b, 0x9a1, 0x9bf, 0x9b8, 0x9c7, 0x9ae, 0x9cd, 0x9ac,
+0x9b0, 0x99c, 0x9be, 0x9a8, 0x9c1, 0x3b, 0x9ab, 0x9c7, 0x9ac, 0x9cd, 0x9b0, 0x9c1,
+0x3b, 0x9ae, 0x9be, 0x9b0, 0x3b, 0x98f, 0x9aa, 0x9cd, 0x9b0, 0x9bf, 0x3b, 0x9ae,
+0x9c7, 0x3b, 0x99c, 0x9c1, 0x9a8, 0x3b, 0x99c, 0x9c1, 0x9b2, 0x9be, 0x3b, 0x986,
+0x997, 0x3b, 0x9b8, 0x9c7, 0x9aa, 0x9cd, 0x99f, 0x3b, 0x993, 0x995, 0x9cd, 0x99f,
+0x9cb, 0x3b, 0x9a8, 0x9ad, 0x9c7, 0x3b, 0x9a1, 0x9bf, 0x9b8, 0x9c7, 0x99c, 0x9a8,
+0x3b, 0x9ab, 0x9c7, 0x9ac, 0x9cd, 0x9b0, 0x9c1, 0x9f1, 0x9be, 0x9b0, 0x9bf, 0x3b,
+0x9ae, 0x9be, 0x9b0, 0x9cd, 0x99a, 0x3b, 0x98f, 0x9aa, 0x9cd, 0x9b0, 0x9bf, 0x9b2,
+0x3b, 0x9ae, 0x9c7, 0x3b, 0x99c, 0x9c1, 0x9a8, 0x3b, 0x99c, 0x9c1, 0x9b2, 0x9be,
+0x987, 0x3b, 0x993, 0x997, 0x3b, 0x9b8, 0x9c7, 0x9aa, 0x9cd, 0x99f, 0x9c7, 0x9ae,
+0x9cd, 0x9ac, 0x9b0, 0x3b, 0x993, 0x995, 0x9cd, 0x99f, 0x9cb, 0x9ac, 0x9b0, 0x3b,
+0x9a8, 0x9ad, 0x9c7, 0x9ae, 0x9cd, 0x9ac, 0x9b0, 0x3b, 0x9a1, 0x9bf, 0x9b8, 0x9c7,
+0x9ae, 0x9cd, 0x9ac, 0x9b0, 0x99c, 0x9be, 0x3b, 0x9ab, 0x9c7, 0x3b, 0x9ae, 0x9be,
+0x9b0, 0x3b, 0x98f, 0x9aa, 0x3b, 0x9ae, 0x9c7, 0x3b, 0x99c, 0x9c1, 0x9a8, 0x3b,
+0x99c, 0x9c1, 0x9b2, 0x3b, 0x986, 0x3b, 0x9b8, 0x9c7, 0x3b, 0x993, 0x3b, 0x9a8,
+0x9ac, 0x3b, 0x9a1, 0x9bf, 0x99c, 0x9be, 0x3b, 0x9ab, 0x9c7, 0x3b, 0x9ae, 0x9be,
+0x9b0, 0x3b, 0x98f, 0x9aa, 0x3b, 0x9ae, 0x9c7, 0x3b, 0x99c, 0x9c1, 0x9a8, 0x3b,
+0x99c, 0x9c1, 0x9b2, 0x3b, 0x986, 0x3b, 0x9b8, 0x9c7, 0x3b, 0x993, 0x995, 0x3b,
+0x9a8, 0x9ac, 0x3b, 0x9a1, 0x9bf, 0x4a, 0x65, 0x72, 0x72, 0x65, 0x79, 0x2d,
+0x67, 0x65, 0x75, 0x72, 0x65, 0x65, 0x3b, 0x54, 0x6f, 0x73, 0x68, 0x69,
+0x61, 0x67, 0x68, 0x74, 0x2d, 0x61, 0x72, 0x72, 0x65, 0x65, 0x3b, 0x4d,
+0x61, 0x79, 0x72, 0x6e, 0x74, 0x3b, 0x41, 0x76, 0x65, 0x72, 0x69, 0x6c,
+0x3b, 0x42, 0x6f, 0x61, 0x6c, 0x64, 0x79, 0x6e, 0x3b, 0x4d, 0x65, 0x61,
+0x6e, 0x2d, 0x73, 0x6f, 0x75, 0x72, 0x65, 0x65, 0x3b, 0x4a, 0x65, 0x72,
+0x72, 0x65, 0x79, 0x2d, 0x73, 0x6f, 0x75, 0x72, 0x65, 0x65, 0x3b, 0x4c,
+0x75, 0x61, 0x6e, 0x69, 0x73, 0x74, 0x79, 0x6e, 0x3b, 0x4d, 0x65, 0x61,
+0x6e, 0x2d, 0x66, 0x6f, 0x75, 0x79, 0x69, 0x72, 0x3b, 0x4a, 0x65, 0x72,
+0x72, 0x65, 0x79, 0x2d, 0x66, 0x6f, 0x75, 0x79, 0x69, 0x72, 0x3b, 0x4d,
+0x65, 0x65, 0x20, 0x48, 0x6f, 0x75, 0x6e, 0x65, 0x79, 0x3b, 0x4d, 0x65,
+0x65, 0x20, 0x6e, 0x79, 0x20, 0x4e, 0x6f, 0x6c, 0x6c, 0x69, 0x63, 0x6b,
+0x4a, 0x2d, 0x67, 0x75, 0x65, 0x72, 0x3b, 0x54, 0x2d, 0x61, 0x72, 0x72,
+0x65, 0x65, 0x3b, 0x4d, 0x61, 0x79, 0x72, 0x6e, 0x74, 0x3b, 0x41, 0x76,
+0x72, 0x72, 0x69, 0x6c, 0x3b, 0x42, 0x6f, 0x61, 0x6c, 0x64, 0x79, 0x6e,
+0x3b, 0x4d, 0x2d, 0x73, 0x6f, 0x75, 0x72, 0x65, 0x65, 0x3b, 0x4a, 0x2d,
+0x73, 0x6f, 0x75, 0x72, 0x65, 0x65, 0x3b, 0x4c, 0x75, 0x61, 0x6e, 0x69,
+0x73, 0x74, 0x79, 0x6e, 0x3b, 0x4d, 0x2d, 0x66, 0x6f, 0x75, 0x79, 0x69,
+0x72, 0x3b, 0x4a, 0x2d, 0x66, 0x6f, 0x75, 0x79, 0x69, 0x72, 0x3b, 0x4d,
+0x2d, 0x48, 0x6f, 0x75, 0x6e, 0x65, 0x79, 0x3b, 0x4d, 0x2d, 0x4e, 0x6f,
+0x6c, 0x6c, 0x69, 0x63, 0x6b, 0x48, 0x101, 0x6e, 0x75, 0x65, 0x72, 0x65,
+0x3b, 0x50, 0x113, 0x70, 0x75, 0x65, 0x72, 0x65, 0x3b, 0x4d, 0x101, 0x65,
+0x68, 0x65, 0x3b, 0x100, 0x70, 0x65, 0x72, 0x69, 0x72, 0x61, 0x3b, 0x4d,
+0x65, 0x69, 0x3b, 0x48, 0x75, 0x6e, 0x65, 0x3b, 0x48, 0x16b, 0x72, 0x61,
+0x65, 0x3b, 0x100, 0x6b, 0x75, 0x68, 0x61, 0x74, 0x61, 0x3b, 0x48, 0x65,
+0x70, 0x65, 0x74, 0x65, 0x6d, 0x61, 0x3b, 0x4f, 0x6b, 0x65, 0x74, 0x6f,
+0x70, 0x61, 0x3b, 0x4e, 0x6f, 0x65, 0x6d, 0x61, 0x3b, 0x54, 0x12b, 0x68,
+0x65, 0x6d, 0x61, 0x48, 0x101, 0x6e, 0x75, 0x65, 0x72, 0x65, 0x3b, 0x50,
+0x113, 0x70, 0x75, 0x65, 0x72, 0x65, 0x3b, 0x4d, 0x101, 0x65, 0x68, 0x65,
+0x3b, 0x100, 0x70, 0x65, 0x72, 0x65, 0x69, 0x72, 0x61, 0x3b, 0x4d, 0x65,
+0x69, 0x3b, 0x48, 0x75, 0x6e, 0x65, 0x3b, 0x48, 0x16b, 0x72, 0x61, 0x65,
+0x3b, 0x100, 0x6b, 0x75, 0x68, 0x61, 0x74, 0x61, 0x3b, 0x48, 0x65, 0x70,
+0x65, 0x74, 0x65, 0x6d, 0x61, 0x3b, 0x4f, 0x6b, 0x65, 0x74, 0x6f, 0x70,
+0x61, 0x3b, 0x4e, 0x6f, 0x65, 0x6d, 0x61, 0x3b, 0x54, 0x12b, 0x68, 0x65,
+0x6d, 0x61, 0x48, 0x101, 0x6e, 0x3b, 0x50, 0x113, 0x70, 0x3b, 0x4d, 0x101,
+0x65, 0x3b, 0x100, 0x70, 0x65, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x48, 0x75,
+0x6e, 0x3b, 0x48, 0x16b, 0x72, 0x3b, 0x100, 0x6b, 0x75, 0x3b, 0x48, 0x65,
+0x70, 0x3b, 0x4f, 0x6b, 0x65, 0x3b, 0x4e, 0x6f, 0x65, 0x3b, 0x54, 0x12b,
+0x68, 0x48, 0x3b, 0x50, 0x3b, 0x4d, 0x3b, 0x100, 0x3b, 0x4d, 0x3b, 0x48,
+0x3b, 0x48, 0x3b, 0x100, 0x3b, 0x48, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x54,
+0x91c, 0x93e, 0x928, 0x947, 0x935, 0x93e, 0x930, 0x940, 0x3b, 0x92b, 0x947, 0x92c,
+0x94d, 0x930, 0x941, 0x935, 0x93e, 0x930, 0x940, 0x3b, 0x92e, 0x93e, 0x930, 0x94d,
+0x91a, 0x3b, 0x90f, 0x92a, 0x94d, 0x930, 0x93f, 0x932, 0x3b, 0x92e, 0x947, 0x3b,
+0x91c, 0x942, 0x928, 0x3b, 0x91c, 0x941, 0x932, 0x948, 0x3b, 0x911, 0x917, 0x938,
+0x94d, 0x91f, 0x3b, 0x938, 0x92a, 0x94d, 0x91f, 0x947, 0x902, 0x92c, 0x930, 0x3b,
+0x911, 0x915, 0x94d, 0x91f, 0x94b, 0x92c, 0x930, 0x3b, 0x928, 0x94b, 0x935, 0x94d,
+0x939, 0x947, 0x902, 0x92c, 0x930, 0x3b, 0x921, 0x93f, 0x938, 0x947, 0x902, 0x92c,
+0x930, 0x91c, 0x93e, 0x928, 0x947, 0x3b, 0x92b, 0x947, 0x92c, 0x94d, 0x930, 0x941,
+0x3b, 0x92e, 0x93e, 0x930, 0x94d, 0x91a, 0x3b, 0x90f, 0x92a, 0x94d, 0x930, 0x93f,
+0x3b, 0x92e, 0x947, 0x3b, 0x91c, 0x942, 0x928, 0x3b, 0x91c, 0x941, 0x932, 0x948,
+0x3b, 0x911, 0x917, 0x3b, 0x938, 0x92a, 0x94d, 0x91f, 0x947, 0x902, 0x3b, 0x911,
+0x915, 0x94d, 0x91f, 0x94b, 0x3b, 0x928, 0x94b, 0x935, 0x94d, 0x939, 0x947, 0x902,
+0x3b, 0x921, 0x93f, 0x938, 0x947, 0x902, 0x91c, 0x93e, 0x3b, 0x92b, 0x947, 0x3b,
+0x92e, 0x93e, 0x3b, 0x90f, 0x3b, 0x92e, 0x947, 0x3b, 0x91c, 0x942, 0x3b, 0x91c,
+0x941, 0x3b, 0x911, 0x3b, 0x938, 0x3b, 0x911, 0x3b, 0x928, 0x94b, 0x3b, 0x921,
+0x93f, 0x4f, 0x6c, 0x61, 0x64, 0x61, 0x6c, 0x289, 0x301, 0x3b, 0x41, 0x72,
+0xe1, 0x74, 0x3b, 0x186, 0x25b, 0x6e, 0x268, 0x301, 0x254, 0x268, 0x14b, 0x254,
+0x6b, 0x3b, 0x4f, 0x6c, 0x6f, 0x64, 0x6f, 0x79, 0xed, 0xf3, 0x72, 0xed,
+0xea, 0x20, 0x69, 0x6e, 0x6b, 0xf3, 0x6b, 0xfa, 0xe2, 0x3b, 0x4f, 0x6c,
+0x6f, 0x69, 0x6c, 0xe9, 0x70, 0x16b, 0x6e, 0x79, 0x12b, 0x113, 0x20, 0x69,
+0x6e, 0x6b, 0xf3, 0x6b, 0xfa, 0xe2, 0x3b, 0x4b, 0xfa, 0x6a, 0xfa, 0x254,
+0x72, 0x254, 0x6b, 0x3b, 0x4d, 0xf3, 0x72, 0x75, 0x73, 0xe1, 0x73, 0x69,
+0x6e, 0x3b, 0x186, 0x6c, 0x254, 0x301, 0x268, 0x301, 0x62, 0x254, 0x301, 0x72,
+0xe1, 0x72, 0x25b, 0x3b, 0x4b, 0xfa, 0x73, 0x68, 0xee, 0x6e, 0x3b, 0x4f,
+0x6c, 0x67, 0xed, 0x73, 0x61, 0x6e, 0x3b, 0x50, 0x289, 0x73, 0x68, 0x289,
+0x301, 0x6b, 0x61, 0x3b, 0x4e, 0x74, 0x289, 0x301, 0x14b, 0x289, 0x301, 0x73,
+0x44, 0x61, 0x6c, 0x3b, 0x41, 0x72, 0xe1, 0x3b, 0x186, 0x25b, 0x6e, 0x3b,
+0x44, 0x6f, 0x79, 0x3b, 0x4c, 0xe9, 0x70, 0x3b, 0x52, 0x6f, 0x6b, 0x3b,
+0x53, 0xe1, 0x73, 0x3b, 0x42, 0x254, 0x301, 0x72, 0x3b, 0x4b, 0xfa, 0x73,
+0x3b, 0x47, 0xed, 0x73, 0x3b, 0x53, 0x68, 0x289, 0x301, 0x3b, 0x4e, 0x74,
+0x289, 0x301, 0x698, 0x627, 0x646, 0x648, 0x6cc, 0x647, 0x3b, 0x641, 0x648, 0x631,
+0x6cc, 0x647, 0x3b, 0x645, 0x627, 0x631, 0x633, 0x3b, 0x622, 0x648, 0x631, 0x6cc,
+0x644, 0x3b, 0x645, 0x647, 0x3b, 0x698, 0x648, 0x626, 0x646, 0x3b, 0x698, 0x648,
+0x626, 0x6cc, 0x647, 0x3b, 0x627, 0x648, 0x62a, 0x3b, 0x633, 0x67e, 0x62a, 0x627,
+0x645, 0x628, 0x631, 0x3b, 0x627, 0x6a9, 0x62a, 0x628, 0x631, 0x3b, 0x646, 0x648,
+0x627, 0x645, 0x628, 0x631, 0x3b, 0x62f, 0x633, 0x627, 0x645, 0x628, 0x631, 0x4a,
+0x61, 0x6e, 0x75, 0x61, 0x72, 0x129, 0x3b, 0x46, 0x65, 0x62, 0x75, 0x72,
+0x75, 0x61, 0x72, 0x129, 0x3b, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x3b, 0x128,
+0x70, 0x75, 0x72, 0x169, 0x3b, 0x4d, 0x129, 0x129, 0x3b, 0x4e, 0x6a, 0x75,
+0x6e, 0x69, 0x3b, 0x4e, 0x6a, 0x75, 0x72, 0x61, 0x129, 0x3b, 0x41, 0x67,
+0x61, 0x73, 0x74, 0x69, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62,
+0x61, 0x3b, 0x4f, 0x6b, 0x74, 0x169, 0x62, 0x61, 0x3b, 0x4e, 0x6f, 0x76,
+0x65, 0x6d, 0x62, 0x61, 0x3b, 0x44, 0x69, 0x63, 0x65, 0x6d, 0x62, 0x61,
+0x4a, 0x41, 0x4e, 0x3b, 0x46, 0x45, 0x42, 0x3b, 0x4d, 0x41, 0x43, 0x3b,
+0x128, 0x50, 0x55, 0x3b, 0x4d, 0x128, 0x128, 0x3b, 0x4e, 0x4a, 0x55, 0x3b,
+0x4e, 0x4a, 0x52, 0x3b, 0x41, 0x47, 0x41, 0x3b, 0x53, 0x50, 0x54, 0x3b,
+0x4f, 0x4b, 0x54, 0x3b, 0x4e, 0x4f, 0x56, 0x3b, 0x44, 0x45, 0x43, 0x4a,
+0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x128, 0x3b, 0x4d, 0x3b, 0x4e, 0x3b, 0x4e,
+0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x69, 0x6d,
+0x259, 0x67, 0x20, 0x6d, 0x62, 0x65, 0x67, 0x74, 0x75, 0x67, 0x3b, 0x69,
+0x6d, 0x65, 0x67, 0x20, 0xe0, 0x62, 0xf9, 0x62, 0xec, 0x3b, 0x69, 0x6d,
+0x65, 0x67, 0x20, 0x6d, 0x62, 0x259, 0x14b, 0x63, 0x68, 0x75, 0x62, 0x69,
+0x3b, 0x69, 0x6d, 0x259, 0x67, 0x20, 0x6e, 0x67, 0x77, 0x259, 0x300, 0x74,
+0x3b, 0x69, 0x6d, 0x259, 0x67, 0x20, 0x66, 0x6f, 0x67, 0x3b, 0x69, 0x6d,
+0x259, 0x67, 0x20, 0x69, 0x63, 0x68, 0x69, 0x69, 0x62, 0x254, 0x64, 0x3b,
+0x69, 0x6d, 0x259, 0x67, 0x20, 0xe0, 0x64, 0xf9, 0x6d, 0x62, 0x259, 0x300,
+0x14b, 0x3b, 0x69, 0x6d, 0x259, 0x67, 0x20, 0x69, 0x63, 0x68, 0x69, 0x6b,
+0x61, 0x3b, 0x69, 0x6d, 0x259, 0x67, 0x20, 0x6b, 0x75, 0x64, 0x3b, 0x69,
+0x6d, 0x259, 0x67, 0x20, 0x74, 0xe8, 0x73, 0x69, 0x2bc, 0x65, 0x3b, 0x69,
+0x6d, 0x259, 0x67, 0x20, 0x7a, 0xf2, 0x3b, 0x69, 0x6d, 0x259, 0x67, 0x20,
+0x6b, 0x72, 0x69, 0x7a, 0x6d, 0x65, 0x64, 0x6d, 0x62, 0x65, 0x67, 0x74,
+0x75, 0x67, 0x3b, 0x69, 0x6d, 0x65, 0x67, 0x20, 0xe0, 0x62, 0xf9, 0x62,
+0xec, 0x3b, 0x69, 0x6d, 0x65, 0x67, 0x20, 0x6d, 0x62, 0x259, 0x14b, 0x63,
+0x68, 0x75, 0x62, 0x69, 0x3b, 0x69, 0x6d, 0x259, 0x67, 0x20, 0x6e, 0x67,
+0x77, 0x259, 0x300, 0x74, 0x3b, 0x69, 0x6d, 0x259, 0x67, 0x20, 0x66, 0x6f,
+0x67, 0x3b, 0x69, 0x6d, 0x259, 0x67, 0x20, 0x69, 0x63, 0x68, 0x69, 0x69,
+0x62, 0x254, 0x64, 0x3b, 0x69, 0x6d, 0x259, 0x67, 0x20, 0xe0, 0x64, 0xf9,
+0x6d, 0x62, 0x259, 0x300, 0x14b, 0x3b, 0x69, 0x6d, 0x259, 0x67, 0x20, 0x69,
+0x63, 0x68, 0x69, 0x6b, 0x61, 0x3b, 0x69, 0x6d, 0x259, 0x67, 0x20, 0x6b,
+0x75, 0x64, 0x3b, 0x69, 0x6d, 0x259, 0x67, 0x20, 0x74, 0xe8, 0x73, 0x69,
+0x2bc, 0x65, 0x3b, 0x69, 0x6d, 0x259, 0x67, 0x20, 0x7a, 0xf2, 0x3b, 0x69,
+0x6d, 0x259, 0x67, 0x20, 0x6b, 0x72, 0x69, 0x7a, 0x6d, 0x65, 0x64, 0x4d,
+0x31, 0x3b, 0x41, 0x32, 0x3b, 0x4d, 0x33, 0x3b, 0x4e, 0x34, 0x3b, 0x46,
+0x35, 0x3b, 0x49, 0x36, 0x3b, 0x41, 0x37, 0x3b, 0x49, 0x38, 0x3b, 0x4b,
+0x39, 0x3b, 0x31, 0x30, 0x3b, 0x31, 0x31, 0x3b, 0x31, 0x32, 0x41d, 0x44d,
+0x433, 0x434, 0x4af, 0x433, 0x44d, 0x44d, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b,
+0x425, 0x43e, 0x451, 0x440, 0x434, 0x443, 0x433, 0x430, 0x430, 0x440, 0x20, 0x441,
+0x430, 0x440, 0x3b, 0x413, 0x443, 0x440, 0x430, 0x432, 0x434, 0x443, 0x433, 0x430,
+0x430, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x414, 0x4e9, 0x440, 0x4e9, 0x432,
+0x434, 0x4af, 0x433, 0x44d, 0x44d, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x422,
+0x430, 0x432, 0x434, 0x443, 0x433, 0x430, 0x430, 0x440, 0x20, 0x441, 0x430, 0x440,
+0x3b, 0x417, 0x443, 0x440, 0x433, 0x430, 0x430, 0x434, 0x443, 0x433, 0x430, 0x430,
+0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x414, 0x43e, 0x43b, 0x43e, 0x43e, 0x434,
+0x443, 0x433, 0x430, 0x430, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x41d, 0x430,
+0x439, 0x43c, 0x434, 0x443, 0x433, 0x430, 0x430, 0x440, 0x20, 0x441, 0x430, 0x440,
+0x3b, 0x415, 0x441, 0x434, 0x4af, 0x433, 0x44d, 0x44d, 0x440, 0x20, 0x441, 0x430,
+0x440, 0x3b, 0x410, 0x440, 0x430, 0x432, 0x434, 0x443, 0x433, 0x430, 0x430, 0x440,
+0x20, 0x441, 0x430, 0x440, 0x3b, 0x410, 0x440, 0x432, 0x430, 0x43d, 0x20, 0x43d,
+0x44d, 0x433, 0x434, 0x4af, 0x433, 0x44d, 0x44d, 0x440, 0x20, 0x441, 0x430, 0x440,
+0x3b, 0x410, 0x440, 0x432, 0x430, 0x43d, 0x20, 0x445, 0x43e, 0x451, 0x440, 0x434,
+0x443, 0x433, 0x430, 0x430, 0x440, 0x20, 0x441, 0x430, 0x440, 0x43d, 0x44d, 0x433,
+0x434, 0x4af, 0x433, 0x44d, 0x44d, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x445,
+0x43e, 0x451, 0x440, 0x434, 0x443, 0x433, 0x430, 0x430, 0x440, 0x20, 0x441, 0x430,
+0x440, 0x3b, 0x433, 0x443, 0x440, 0x430, 0x432, 0x434, 0x443, 0x433, 0x430, 0x430,
+0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x434, 0x4e9, 0x440, 0x4e9, 0x432, 0x434,
+0x4af, 0x433, 0x44d, 0x44d, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x442, 0x430,
+0x432, 0x434, 0x443, 0x433, 0x430, 0x430, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b,
+0x437, 0x443, 0x440, 0x433, 0x430, 0x430, 0x434, 0x443, 0x433, 0x430, 0x430, 0x440,
+0x20, 0x441, 0x430, 0x440, 0x3b, 0x434, 0x43e, 0x43b, 0x43e, 0x43e, 0x434, 0x443,
+0x433, 0x430, 0x430, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x43d, 0x430, 0x439,
+0x43c, 0x434, 0x443, 0x433, 0x430, 0x430, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b,
+0x435, 0x441, 0x434, 0x4af, 0x433, 0x44d, 0x44d, 0x440, 0x20, 0x441, 0x430, 0x440,
+0x3b, 0x430, 0x440, 0x430, 0x432, 0x434, 0x443, 0x433, 0x430, 0x430, 0x440, 0x20,
+0x441, 0x430, 0x440, 0x3b, 0x430, 0x440, 0x432, 0x430, 0x43d, 0x20, 0x43d, 0x44d,
+0x433, 0x434, 0x4af, 0x433, 0x44d, 0x44d, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b,
+0x430, 0x440, 0x432, 0x430, 0x43d, 0x20, 0x445, 0x43e, 0x451, 0x440, 0x434, 0x443,
+0x433, 0x430, 0x430, 0x440, 0x20, 0x441, 0x430, 0x440, 0x31, 0x2d, 0x440, 0x20,
+0x441, 0x430, 0x440, 0x3b, 0x32, 0x2d, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b,
+0x33, 0x2d, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x34, 0x2d, 0x440, 0x20,
+0x441, 0x430, 0x440, 0x3b, 0x35, 0x2d, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b,
+0x36, 0x2d, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x37, 0x2d, 0x440, 0x20,
+0x441, 0x430, 0x440, 0x3b, 0x38, 0x2d, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b,
+0x39, 0x2d, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x31, 0x30, 0x2d, 0x440,
+0x20, 0x441, 0x430, 0x440, 0x3b, 0x31, 0x31, 0x2d, 0x440, 0x20, 0x441, 0x430,
+0x440, 0x3b, 0x31, 0x32, 0x2d, 0x440, 0x20, 0x441, 0x430, 0x440, 0x49, 0x3b,
+0x49, 0x49, 0x3b, 0x49, 0x49, 0x49, 0x3b, 0x49, 0x56, 0x3b, 0x56, 0x3b,
+0x56, 0x49, 0x3b, 0x56, 0x49, 0x49, 0x3b, 0x56, 0x49, 0x49, 0x49, 0x3b,
+0x49, 0x58, 0x3b, 0x58, 0x3b, 0x58, 0x49, 0x3b, 0x58, 0x49, 0x49, 0x1828,
+0x1822, 0x182d, 0x1821, 0x1833, 0x1825, 0x182d, 0x1821, 0x1837, 0x20, 0x1830, 0x1820, 0x1837,
+0x180e, 0x1820, 0x3b, 0x182c, 0x1823, 0x1836, 0x1820, 0x1833, 0x1823, 0x182d, 0x1820, 0x1837,
+0x20, 0x1830, 0x1820, 0x1837, 0x202f, 0x1820, 0x3b, 0x182d, 0x1823, 0x1837, 0x182a, 0x1821,
+0x1833, 0x1823, 0x182d, 0x1820, 0x1837, 0x20, 0x1830, 0x1820, 0x1837, 0x202f, 0x1820, 0x3b,
+0x1833, 0x1825, 0x1837, 0x182a, 0x1821, 0x1833, 0x1825, 0x182d, 0x1821, 0x1837, 0x20, 0x1830,
+0x1820, 0x1837, 0x180e, 0x1820, 0x3b, 0x1832, 0x1820, 0x182a, 0x1823, 0x1833, 0x1823, 0x182d,
+0x1820, 0x1837, 0x20, 0x1830, 0x1820, 0x1837, 0x202f, 0x1820, 0x3b, 0x1835, 0x1822, 0x1837,
+0x182d, 0x1823, 0x182d, 0x1820, 0x1833, 0x1823, 0x182d, 0x1820, 0x1837, 0x20, 0x1830, 0x1820,
+0x1837, 0x180e, 0x1820, 0x3b, 0x1832, 0x1823, 0x182f, 0x1823, 0x182d, 0x1820, 0x1833, 0x1823,
+0x182d, 0x1820, 0x1837, 0x20, 0x1830, 0x1820, 0x1837, 0x180e, 0x1820, 0x3b, 0x1828, 0x1820,
+0x1822, 0x182e, 0x1820, 0x1833, 0x1825, 0x182d, 0x1820, 0x1837, 0x20, 0x1830, 0x1820, 0x1837,
+0x180e, 0x1820, 0x3b, 0x1836, 0x1822, 0x1830, 0x1825, 0x1833, 0x1825, 0x182d, 0x1821, 0x1837,
+0x20, 0x1830, 0x1820, 0x1837, 0x180e, 0x1820, 0x3b, 0x1820, 0x1837, 0x182a, 0x1820, 0x1833,
+0x1823, 0x182d, 0x1820, 0x1837, 0x20, 0x1830, 0x1820, 0x1837, 0x180e, 0x1820, 0x3b, 0x1820,
+0x1837, 0x182a, 0x1820, 0x1828, 0x20, 0x1828, 0x1822, 0x182d, 0x1821, 0x1833, 0x1825, 0x182d,
+0x1821, 0x1837, 0x20, 0x1830, 0x1820, 0x1837, 0x180e, 0x1820, 0x3b, 0x1820, 0x1837, 0x182a,
+0x1820, 0x1828, 0x20, 0x182c, 0x1823, 0x1836, 0x1820, 0x1833, 0x1823, 0x182d, 0x1820, 0x1837,
+0x20, 0x1830, 0x1820, 0x1837, 0x180e, 0x1820, 0x31, 0x202f, 0x180a, 0x1837, 0x20, 0x1830,
+0x1820, 0x1837, 0x180e, 0x1820, 0x3b, 0x32, 0x202f, 0x180a, 0x1837, 0x20, 0x1830, 0x1820,
+0x1837, 0x180e, 0x1820, 0x3b, 0x33, 0x180a, 0x1837, 0x20, 0x1830, 0x1820, 0x1837, 0x180e,
+0x1820, 0x3b, 0x34, 0x202f, 0x180a, 0x1837, 0x20, 0x1830, 0x1820, 0x1837, 0x180e, 0x1820,
+0x3b, 0x35, 0x202f, 0x180a, 0x1837, 0x20, 0x1830, 0x1820, 0x1837, 0x180e, 0x1820, 0x3b,
+0x36, 0x202f, 0x180a, 0x1837, 0x20, 0x1830, 0x1820, 0x1837, 0x180e, 0x1820, 0x3b, 0x37,
+0x202f, 0x180a, 0x1837, 0x20, 0x1830, 0x1820, 0x1837, 0x180e, 0x1820, 0x3b, 0x38, 0x202f,
+0x180a, 0x1837, 0x20, 0x1830, 0x1820, 0x1837, 0x180e, 0x1820, 0x3b, 0x39, 0x202f, 0x180a,
+0x1837, 0x20, 0x1830, 0x1820, 0x1837, 0x180e, 0x1820, 0x3b, 0x31, 0x30, 0x20, 0x180a,
+0x1837, 0x20, 0x1830, 0x1820, 0x1837, 0x180e, 0x1820, 0x3b, 0x31, 0x31, 0x180a, 0x1837,
+0x20, 0x1830, 0x1820, 0x1837, 0x180e, 0x1820, 0x3b, 0x31, 0x32, 0x180a, 0x1837, 0x20,
+0x1830, 0x1820, 0x1837, 0x180e, 0x1820, 0x31, 0x202f, 0x180a, 0x1837, 0x20, 0x1830, 0x1820,
+0x1837, 0x180e, 0x1820, 0x3b, 0x32, 0x202f, 0x180a, 0x1837, 0x20, 0x1830, 0x1820, 0x1837,
+0x180e, 0x1820, 0x3b, 0x33, 0x180a, 0x1837, 0x20, 0x1830, 0x1820, 0x1837, 0x180e, 0x1820,
+0x3b, 0x34, 0x202f, 0x180a, 0x1837, 0x20, 0x1830, 0x1820, 0x1837, 0x180e, 0x1820, 0x3b,
+0x35, 0x202f, 0x180a, 0x1837, 0x20, 0x1830, 0x1820, 0x1837, 0x180e, 0x1820, 0x3b, 0x36,
+0x202f, 0x180a, 0x1837, 0x20, 0x1830, 0x1820, 0x1837, 0x180e, 0x1820, 0x3b, 0x37, 0x202f,
+0x180a, 0x1837, 0x20, 0x1830, 0x1820, 0x1837, 0x180e, 0x1820, 0x3b, 0x38, 0x180a, 0x1837,
+0x20, 0x1830, 0x1820, 0x1837, 0x180e, 0x1820, 0x3b, 0x39, 0x20, 0x180a, 0x1837, 0x20,
+0x1830, 0x1820, 0x1837, 0x180e, 0x1820, 0x3b, 0x31, 0x30, 0x20, 0x180a, 0x1837, 0x20,
+0x1830, 0x1820, 0x1837, 0x180e, 0x1820, 0x3b, 0x31, 0x31, 0x20, 0x180a, 0x1837, 0x20,
+0x1830, 0x1820, 0x1837, 0x180e, 0x1820, 0x3b, 0x31, 0x32, 0x20, 0x180a, 0x1837, 0x20,
+0x1830, 0x1820, 0x1837, 0x180e, 0x1820, 0x7a, 0x61, 0x6e, 0x76, 0x69, 0x65, 0x3b,
+0x66, 0x65, 0x76, 0x72, 0x69, 0x79, 0x65, 0x3b, 0x6d, 0x61, 0x72, 0x73,
+0x3b, 0x61, 0x76, 0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x65, 0x3b, 0x7a, 0x69,
+0x6e, 0x3b, 0x7a, 0x69, 0x6c, 0x79, 0x65, 0x3b, 0x6f, 0x75, 0x74, 0x3b,
+0x73, 0x65, 0x70, 0x74, 0x61, 0x6d, 0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x62,
+0x3b, 0x6e, 0x6f, 0x76, 0x61, 0x6d, 0x3b, 0x64, 0x65, 0x73, 0x61, 0x6d,
+0x7a, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x76, 0x3b, 0x6d, 0x61, 0x72, 0x3b,
+0x61, 0x76, 0x72, 0x3b, 0x6d, 0x65, 0x3b, 0x7a, 0x69, 0x6e, 0x3b, 0x7a,
+0x69, 0x6c, 0x3b, 0x6f, 0x75, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x3b, 0x6f,
+0x6b, 0x74, 0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64, 0x65, 0x73, 0x7a, 0x3b,
+0x66, 0x3b, 0x6d, 0x3b, 0x61, 0x3b, 0x6d, 0x3b, 0x7a, 0x3b, 0x7a, 0x3b,
+0x6f, 0x3b, 0x73, 0x3b, 0x6f, 0x3b, 0x6e, 0x3b, 0x64, 0x46, 0x129, 0x69,
+0x20, 0x4c, 0x6f, 0x6f, 0x3b, 0x43, 0x6f, 0x6b, 0x63, 0x77, 0x61, 0x6b,
+0x6c, 0x61, 0x14b, 0x6e, 0x65, 0x3b, 0x43, 0x6f, 0x6b, 0x63, 0x77, 0x61,
+0x6b, 0x6c, 0x69, 0x69, 0x3b, 0x46, 0x129, 0x69, 0x20, 0x4d, 0x61, 0x72,
+0x66, 0x6f, 0x6f, 0x3b, 0x4d, 0x61, 0x64, 0x1dd, 0x1dd, 0x75, 0x75, 0x74,
+0x1dd, 0x62, 0x69, 0x6a, 0x61, 0x14b, 0x3b, 0x4d, 0x61, 0x6d, 0x1dd, 0x14b,
+0x67, 0x77, 0xe3, 0x61, 0x66, 0x61, 0x68, 0x62, 0x69, 0x69, 0x3b, 0x4d,
+0x61, 0x6d, 0x1dd, 0x14b, 0x67, 0x77, 0xe3, 0x61, 0x6c, 0x69, 0x69, 0x3b,
+0x4d, 0x61, 0x64, 0x1dd, 0x6d, 0x62, 0x69, 0x69, 0x3b, 0x46, 0x129, 0x69,
+0x20, 0x44, 0x1dd, 0x253, 0x6c, 0x69, 0x69, 0x3b, 0x46, 0x129, 0x69, 0x20,
+0x4d, 0x75, 0x6e, 0x64, 0x61, 0x14b, 0x3b, 0x46, 0x129, 0x69, 0x20, 0x47,
+0x77, 0x61, 0x68, 0x6c, 0x6c, 0x65, 0x3b, 0x46, 0x129, 0x69, 0x20, 0x59,
+0x75, 0x72, 0x75, 0x46, 0x4c, 0x4f, 0x3b, 0x43, 0x4c, 0x41, 0x3b, 0x43,
+0x4b, 0x49, 0x3b, 0x46, 0x4d, 0x46, 0x3b, 0x4d, 0x41, 0x44, 0x3b, 0x4d,
+0x42, 0x49, 0x3b, 0x4d, 0x4c, 0x49, 0x3b, 0x4d, 0x41, 0x4d, 0x3b, 0x46,
+0x44, 0x45, 0x3b, 0x46, 0x4d, 0x55, 0x3b, 0x46, 0x47, 0x57, 0x3b, 0x46,
+0x59, 0x55, 0x4f, 0x3b, 0x41, 0x3b, 0x49, 0x3b, 0x46, 0x3b, 0x44, 0x3b,
+0x42, 0x3b, 0x4c, 0x3b, 0x4d, 0x3b, 0x45, 0x3b, 0x55, 0x3b, 0x57, 0x3b,
+0x59, 0x52, 0x76, 0x66, 0x6f, 0x20, 0x43, 0x75, 0x73, 0x65, 0x3b, 0x48,
+0x6f, 0x74, 0x76, 0x6c, 0x65, 0x20, 0x48, 0x76, 0x73, 0x65, 0x3b, 0x54,
+0x61, 0x73, 0x61, 0x68, 0x63, 0x75, 0x63, 0x65, 0x3b, 0x54, 0x61, 0x73,
+0x61, 0x68, 0x63, 0x65, 0x20, 0x52, 0x61, 0x6b, 0x6b, 0x6f, 0x3b, 0x4b,
+0x65, 0x20, 0x48, 0x76, 0x73, 0x65, 0x3b, 0x4b, 0x76, 0x63, 0x6f, 0x20,
+0x48, 0x76, 0x73, 0x65, 0x3b, 0x48, 0x69, 0x79, 0x75, 0x63, 0x65, 0x3b,
+0x48, 0x69, 0x79, 0x6f, 0x20, 0x52, 0x61, 0x6b, 0x6b, 0x6f, 0x3b, 0x4f,
+0x74, 0x6f, 0x77, 0x6f, 0x73, 0x6b, 0x75, 0x63, 0x65, 0x3b, 0x4f, 0x74,
+0x6f, 0x77, 0x6f, 0x73, 0x6b, 0x76, 0x20, 0x52, 0x61, 0x6b, 0x6b, 0x6f,
+0x3b, 0x45, 0x68, 0x6f, 0x6c, 0x65, 0x3b, 0x52, 0x76, 0x66, 0x6f, 0x20,
+0x52, 0x61, 0x6b, 0x6b, 0x6f, 0x1c3, 0x4b, 0x68, 0x61, 0x6e, 0x6e, 0x69,
+0x3b, 0x1c3, 0x4b, 0x68, 0x61, 0x6e, 0x1c0, 0x67, 0xf4, 0x61, 0x62, 0x3b,
+0x1c0, 0x4b, 0x68, 0x75, 0x75, 0x1c1, 0x6b, 0x68, 0xe2, 0x62, 0x3b, 0x1c3,
+0x48, 0xf4, 0x61, 0x1c2, 0x6b, 0x68, 0x61, 0x69, 0x62, 0x3b, 0x1c3, 0x4b,
+0x68, 0x61, 0x69, 0x74, 0x73, 0xe2, 0x62, 0x3b, 0x47, 0x61, 0x6d, 0x61,
+0x1c0, 0x61, 0x65, 0x62, 0x3b, 0x1c2, 0x4b, 0x68, 0x6f, 0x65, 0x73, 0x61,
+0x6f, 0x62, 0x3b, 0x41, 0x6f, 0x1c1, 0x6b, 0x68, 0x75, 0x75, 0x6d, 0xfb,
+0x1c1, 0x6b, 0x68, 0xe2, 0x62, 0x3b, 0x54, 0x61, 0x72, 0x61, 0x1c0, 0x6b,
+0x68, 0x75, 0x75, 0x6d, 0xfb, 0x1c1, 0x6b, 0x68, 0xe2, 0x62, 0x3b, 0x1c2,
+0x4e, 0xfb, 0x1c1, 0x6e, 0xe2, 0x69, 0x73, 0x65, 0x62, 0x3b, 0x1c0, 0x48,
+0x6f, 0x6f, 0x1c2, 0x67, 0x61, 0x65, 0x62, 0x3b, 0x48, 0xf4, 0x61, 0x73,
+0x6f, 0x72, 0x65, 0x1c1, 0x6b, 0x68, 0xe2, 0x62, 0x91c, 0x928, 0x935, 0x930,
+0x940, 0x3b, 0x92b, 0x947, 0x92c, 0x94d, 0x930, 0x941, 0x905, 0x930, 0x940, 0x3b,
+0x92e, 0x93e, 0x930, 0x94d, 0x91a, 0x3b, 0x905, 0x92a, 0x94d, 0x930, 0x93f, 0x932,
+0x3b, 0x92e, 0x947, 0x3b, 0x91c, 0x941, 0x928, 0x3b, 0x91c, 0x941, 0x932, 0x93e,
+0x908, 0x3b, 0x905, 0x917, 0x938, 0x94d, 0x91f, 0x3b, 0x938, 0x947, 0x92a, 0x94d,
+0x91f, 0x947, 0x92e, 0x94d, 0x92c, 0x930, 0x3b, 0x905, 0x915, 0x94d, 0x91f, 0x94b,
+0x92c, 0x930, 0x3b, 0x928, 0x94b, 0x92d, 0x947, 0x92e, 0x94d, 0x92c, 0x930, 0x3b,
+0x921, 0x93f, 0x938, 0x947, 0x92e, 0x94d, 0x92c, 0x930, 0x91c, 0x928, 0x3b, 0x92b,
+0x947, 0x947, 0x92c, 0x3b, 0x92e, 0x93e, 0x930, 0x94d, 0x91a, 0x3b, 0x905, 0x92a,
+0x94d, 0x930, 0x3b, 0x92e, 0x947, 0x3b, 0x91c, 0x941, 0x928, 0x3b, 0x91c, 0x941,
+0x932, 0x3b, 0x905, 0x917, 0x3b, 0x938, 0x947, 0x92a, 0x3b, 0x905, 0x915, 0x94d,
+0x91f, 0x94b, 0x3b, 0x928, 0x94b, 0x92d, 0x947, 0x3b, 0x921, 0x93f, 0x938, 0x947,
+0x91c, 0x928, 0x3b, 0x92b, 0x947, 0x92c, 0x3b, 0x92e, 0x93e, 0x930, 0x94d, 0x91a,
+0x3b, 0x905, 0x92a, 0x94d, 0x930, 0x3b, 0x92e, 0x947, 0x3b, 0x91c, 0x941, 0x928,
+0x3b, 0x91c, 0x941, 0x932, 0x3b, 0x905, 0x917, 0x3b, 0x938, 0x947, 0x92a, 0x3b,
+0x905, 0x915, 0x94d, 0x91f, 0x94b, 0x3b, 0x928, 0x94b, 0x92d, 0x947, 0x3b, 0x921,
+0x93f, 0x938, 0x947, 0x73, 0x61, 0x14b, 0x20, 0x74, 0x73, 0x65, 0x74, 0x73,
+0x25b, 0x300, 0x25b, 0x20, 0x6c, 0xf9, 0x6d, 0x3b, 0x73, 0x61, 0x14b, 0x20,
+0x6b, 0xe0, 0x67, 0x20, 0x6e, 0x67, 0x77, 0xf3, 0x14b, 0x3b, 0x73, 0x61,
+0x14b, 0x20, 0x6c, 0x65, 0x70, 0x79, 0xe8, 0x20, 0x73, 0x68, 0xfa, 0x6d,
+0x3b, 0x73, 0x61, 0x14b, 0x20, 0x63, 0xff, 0xf3, 0x3b, 0x73, 0x61, 0x14b,
+0x20, 0x74, 0x73, 0x25b, 0x300, 0x25b, 0x20, 0x63, 0xff, 0xf3, 0x3b, 0x73,
+0x61, 0x14b, 0x20, 0x6e, 0x6a, 0xff, 0x6f, 0x6c, 0xe1, 0x2bc, 0x3b, 0x73,
+0x61, 0x14b, 0x20, 0x74, 0x79, 0x25b, 0x300, 0x62, 0x20, 0x74, 0x79, 0x25b,
+0x300, 0x62, 0x20, 0x6d, 0x62, 0x289, 0x300, 0x14b, 0x3b, 0x73, 0x61, 0x14b,
+0x20, 0x6d, 0x62, 0x289, 0x300, 0x14b, 0x3b, 0x73, 0x61, 0x14b, 0x20, 0x6e,
+0x67, 0x77, 0x254, 0x300, 0x2bc, 0x20, 0x6d, 0x62, 0xff, 0x25b, 0x3b, 0x73,
+0x61, 0x14b, 0x20, 0x74, 0xe0, 0x14b, 0x61, 0x20, 0x74, 0x73, 0x65, 0x74,
+0x73, 0xe1, 0x2bc, 0x3b, 0x73, 0x61, 0x14b, 0x20, 0x6d, 0x65, 0x6a, 0x77,
+0x6f, 0x14b, 0xf3, 0x3b, 0x73, 0x61, 0x14b, 0x20, 0x6c, 0xf9, 0x6d, 0x4e,
+0x64, 0x75, 0x14b, 0x6d, 0x62, 0x69, 0x20, 0x53, 0x61, 0x14b, 0x3b, 0x50,
+0x25b, 0x73, 0x61, 0x14b, 0x20, 0x50, 0x25b, 0x301, 0x70, 0xe1, 0x3b, 0x50,
+0x25b, 0x73, 0x61, 0x14b, 0x20, 0x50, 0x25b, 0x301, 0x74, 0xe1, 0x74, 0x3b,
+0x50, 0x25b, 0x73, 0x61, 0x14b, 0x20, 0x50, 0x25b, 0x301, 0x6e, 0x25b, 0x301,
+0x6b, 0x77, 0x61, 0x3b, 0x50, 0x25b, 0x73, 0x61, 0x14b, 0x20, 0x50, 0x61,
+0x74, 0x61, 0x61, 0x3b, 0x50, 0x25b, 0x73, 0x61, 0x14b, 0x20, 0x50, 0x25b,
+0x301, 0x6e, 0x25b, 0x301, 0x6e, 0x74, 0xfa, 0x6b, 0xfa, 0x3b, 0x50, 0x25b,
+0x73, 0x61, 0x14b, 0x20, 0x53, 0x61, 0x61, 0x6d, 0x62, 0xe1, 0x3b, 0x50,
+0x25b, 0x73, 0x61, 0x14b, 0x20, 0x50, 0x25b, 0x301, 0x6e, 0x25b, 0x301, 0x66,
+0x254, 0x6d, 0x3b, 0x50, 0x25b, 0x73, 0x61, 0x14b, 0x20, 0x50, 0x25b, 0x301,
+0x6e, 0x25b, 0x301, 0x70, 0x66, 0xfa, 0xa78b, 0xfa, 0x3b, 0x50, 0x25b, 0x73,
+0x61, 0x14b, 0x20, 0x4e, 0x25b, 0x67, 0x25b, 0x301, 0x6d, 0x3b, 0x50, 0x25b,
+0x73, 0x61, 0x14b, 0x20, 0x4e, 0x74, 0x73, 0x254, 0x30c, 0x70, 0x6d, 0x254,
+0x301, 0x3b, 0x50, 0x25b, 0x73, 0x61, 0x14b, 0x20, 0x4e, 0x74, 0x73, 0x254,
+0x30c, 0x70, 0x70, 0xe1, 0x4a, 0xe9, 0x6e, 0xfa, 0xe1, 0x72, 0x69, 0x3b,
+0x46, 0x1eb9, 0x301, 0x62, 0xfa, 0xe1, 0x72, 0x69, 0x3b, 0x4d, 0x61, 0x63,
+0x68, 0x3b, 0xc9, 0x70, 0x72, 0x65, 0x6c, 0x3b, 0x4d, 0x65, 0x65, 0x3b,
+0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x61, 0x69, 0x3b, 0x1ecc, 0x67,
+0x1ecd, 0x73, 0x74, 0x3b, 0x53, 0x1eb9, 0x70, 0x74, 0x1eb9, 0x301, 0x6d, 0x62,
+0x61, 0x3b, 0x1ecc, 0x6b, 0x74, 0xf3, 0x62, 0x61, 0x3b, 0x4e, 0x1ecd, 0x76,
+0x1eb9, 0x301, 0x6d, 0x62, 0x61, 0x3b, 0x44, 0x69, 0x73, 0x1eb9, 0x301, 0x6d,
+0x62, 0x61, 0x4a, 0xe9, 0x6e, 0x3b, 0x46, 0x1eb9, 0x301, 0x62, 0x3b, 0x4d,
+0x61, 0x63, 0x68, 0x3b, 0xc9, 0x70, 0x72, 0x3b, 0x4d, 0x65, 0x65, 0x3b,
+0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x1ecc, 0x301, 0x67, 0x1ecd,
+0x3b, 0x53, 0x1eb9, 0x70, 0x3b, 0x1ecc, 0x6b, 0x74, 0x3b, 0x4e, 0x1ecd, 0x76,
+0x3b, 0x44, 0x69, 0x73, 0x4a, 0xe9, 0x6e, 0x3b, 0x46, 0x1eb9, 0x301, 0x62,
+0x3b, 0x4d, 0x61, 0x63, 0x68, 0x3b, 0xc9, 0x70, 0x72, 0x3b, 0x4d, 0x65,
+0x65, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x1ecc, 0x67,
+0x1ecd, 0x3b, 0x53, 0x1eb9, 0x70, 0x3b, 0x1ecc, 0x6b, 0x74, 0x3b, 0x4e, 0x1ecd,
+0x76, 0x3b, 0x44, 0x69, 0x73, 0x7d3, 0x7cc, 0x7f2, 0x7e0, 0x7ca, 0x7e5, 0x7ce,
+0x7df, 0x7cb, 0x7f2, 0x3b, 0x7de, 0x7cf, 0x7f2, 0x7de, 0x7cf, 0x7dc, 0x7cd, 0x3b,
+0x7d5, 0x7d9, 0x7ca, 0x7d3, 0x7ca, 0x3b, 0x7de, 0x7cf, 0x7f2, 0x7de, 0x7cf, 0x7d8,
+0x7cc, 0x7ec, 0x7d3, 0x7cc, 0x3b, 0x7d8, 0x7d3, 0x7ca, 0x7ec, 0x7d5, 0x7ca, 0x3b,
+0x7e5, 0x7ca, 0x7ec, 0x7db, 0x7cc, 0x7ec, 0x7e5, 0x7d9, 0x7ca, 0x3b, 0x7de, 0x7ca,
+0x7ec, 0x7d9, 0x7cc, 0x7dd, 0x7d0, 0x7ed, 0x3b, 0x7d8, 0x7d3, 0x7ca, 0x7ec, 0x7d3,
+0x7cc, 0x7df, 0x7ca, 0x3b, 0x7d5, 0x7ce, 0x7df, 0x7ca, 0x7dd, 0x7cc, 0x7f2, 0x3b,
+0x7de, 0x7cf, 0x7f2, 0x7d3, 0x7cc, 0x7d5, 0x7cc, 0x7ee, 0x3b, 0x7e3, 0x7cd, 0x7e3,
+0x7cd, 0x7d3, 0x7ca, 0x3b, 0x7de, 0x7cf, 0x7df, 0x7cc, 0x7f2, 0x7de, 0x7cf, 0x7df,
+0x7cc, 0x7f2, 0x7d3, 0x7cc, 0x7f2, 0x7e0, 0x3b, 0x7de, 0x7cf, 0x7f2, 0x7de, 0x3b,
+0x7d5, 0x7d9, 0x7ca, 0x3b, 0x7de, 0x7cf, 0x7f2, 0x7d8, 0x3b, 0x7d8, 0x7d3, 0x7ca,
+0x7ec, 0x7d5, 0x3b, 0x7e5, 0x7ca, 0x7ec, 0x7db, 0x3b, 0x7de, 0x7ca, 0x7ec, 0x7d9,
+0x3b, 0x7d8, 0x7d3, 0x7ca, 0x7ec, 0x7d3, 0x3b, 0x7d5, 0x7ce, 0x7df, 0x7ca, 0x7dd,
+0x7cc, 0x7f2, 0x3b, 0x7de, 0x7cf, 0x7f2, 0x7d3, 0x3b, 0x7e3, 0x7cd, 0x7e3, 0x3b,
+0x7de, 0x7cf, 0x7df, 0x7d3, 0x3b, 0x7de, 0x3b, 0x7d5, 0x3b, 0x7de, 0x3b, 0x7d8,
+0x3b, 0x7e5, 0x3b, 0x7de, 0x3b, 0x7d8, 0x3b, 0x7d5, 0x3b, 0x7de, 0x3b, 0x7e3,
+0x3b, 0x7de, 0x62c, 0x627, 0x646, 0x6a4, 0x6cc, 0x6d5, 0x3b, 0x641, 0x626, 0x6a4,
+0x631, 0x6cc, 0x6d5, 0x3b, 0x645, 0x627, 0x631, 0x633, 0x3b, 0x622, 0x6a4, 0x631,
+0x6cc, 0x644, 0x3b, 0x645, 0x626, 0x6cc, 0x3b, 0x62c, 0x648, 0x659, 0x623, 0x646,
+0x3b, 0x62c, 0x648, 0x659, 0x644, 0x627, 0x3b, 0x622, 0x6af, 0x648, 0x633, 0x62a,
+0x3b, 0x633, 0x626, 0x67e, 0x62a, 0x627, 0x645, 0x631, 0x3b, 0x626, 0x648, 0x6a9,
+0x62a, 0x648, 0x6a4, 0x631, 0x3b, 0x646, 0x648, 0x6a4, 0x627, 0x645, 0x631, 0x3b,
+0x62f, 0x626, 0x633, 0x627, 0x645, 0x631, 0x6f, 0x111, 0x111, 0x61, 0x6a, 0x61,
+0x67, 0x65, 0x6d, 0xe1, 0x6e, 0x6e, 0x75, 0x3b, 0x67, 0x75, 0x6f, 0x76,
+0x76, 0x61, 0x6d, 0xe1, 0x6e, 0x6e, 0x75, 0x3b, 0x6e, 0x6a, 0x75, 0x6b,
+0x10d, 0x61, 0x6d, 0xe1, 0x6e, 0x6e, 0x75, 0x3b, 0x63, 0x75, 0x6f, 0x14b,
+0x6f, 0x6d, 0xe1, 0x6e, 0x6e, 0x75, 0x3b, 0x6d, 0x69, 0x65, 0x73, 0x73,
+0x65, 0x6d, 0xe1, 0x6e, 0x6e, 0x75, 0x3b, 0x67, 0x65, 0x61, 0x73, 0x73,
+0x65, 0x6d, 0xe1, 0x6e, 0x6e, 0x75, 0x3b, 0x73, 0x75, 0x6f, 0x69, 0x64,
+0x6e, 0x65, 0x6d, 0xe1, 0x6e, 0x6e, 0x75, 0x3b, 0x62, 0x6f, 0x72, 0x67,
+0x65, 0x6d, 0xe1, 0x6e, 0x6e, 0x75, 0x3b, 0x10d, 0x61, 0x6b, 0x10d, 0x61,
+0x6d, 0xe1, 0x6e, 0x6e, 0x75, 0x3b, 0x67, 0x6f, 0x6c, 0x67, 0x67, 0x6f,
+0x74, 0x6d, 0xe1, 0x6e, 0x6e, 0x75, 0x3b, 0x73, 0x6b, 0xe1, 0x62, 0x6d,
+0x61, 0x6d, 0xe1, 0x6e, 0x6e, 0x75, 0x3b, 0x6a, 0x75, 0x6f, 0x76, 0x6c,
+0x61, 0x6d, 0xe1, 0x6e, 0x6e, 0x75, 0x6f, 0x111, 0x111, 0x6a, 0x3b, 0x67,
+0x75, 0x6f, 0x76, 0x3b, 0x6e, 0x6a, 0x75, 0x6b, 0x3b, 0x63, 0x75, 0x6f,
+0x3b, 0x6d, 0x69, 0x65, 0x73, 0x3b, 0x67, 0x65, 0x61, 0x73, 0x3b, 0x73,
+0x75, 0x6f, 0x69, 0x3b, 0x62, 0x6f, 0x72, 0x67, 0x3b, 0x10d, 0x61, 0x6b,
+0x10d, 0x3b, 0x67, 0x6f, 0x6c, 0x67, 0x3b, 0x73, 0x6b, 0xe1, 0x62, 0x3b,
+0x6a, 0x75, 0x6f, 0x76, 0x4f, 0x3b, 0x47, 0x3b, 0x4e, 0x3b, 0x43, 0x3b,
+0x4d, 0x3b, 0x47, 0x3b, 0x53, 0x3b, 0x42, 0x3b, 0x10c, 0x3b, 0x47, 0x3b,
+0x53, 0x3b, 0x4a, 0x6f, 0x111, 0x111, 0x6a, 0x3b, 0x67, 0x75, 0x6f, 0x76,
+0x3b, 0x6e, 0x6a, 0x75, 0x6b, 0x3b, 0x63, 0x75, 0x6f, 0x14b, 0x3b, 0x6d,
+0x69, 0x65, 0x73, 0x3b, 0x67, 0x65, 0x61, 0x73, 0x3b, 0x73, 0x75, 0x6f,
+0x69, 0x3b, 0x62, 0x6f, 0x72, 0x67, 0x3b, 0x10d, 0x61, 0x6b, 0x10d, 0x3b,
+0x67, 0x6f, 0x6c, 0x67, 0x3b, 0x73, 0x6b, 0xe1, 0x62, 0x3b, 0x6a, 0x75,
+0x6f, 0x76, 0x50, 0x68, 0x65, 0x72, 0x65, 0x6b, 0x67, 0x6f, 0x6e, 0x67,
+0x3b, 0x44, 0x69, 0x62, 0x6f, 0x6b, 0x77, 0x61, 0x6e, 0x65, 0x3b, 0x48,
+0x6c, 0x61, 0x6b, 0x6f, 0x6c, 0x61, 0x3b, 0x4d, 0x6f, 0x72, 0x61, 0x6e,
+0x61, 0x6e, 0x67, 0x3b, 0x4d, 0x6f, 0x70, 0x69, 0x74, 0x6c, 0x6f, 0x3b,
+0x50, 0x68, 0x75, 0x70, 0x75, 0x3b, 0x4d, 0x6f, 0x73, 0x65, 0x67, 0x65,
+0x6d, 0x61, 0x6e, 0x79, 0x65, 0x3b, 0x50, 0x68, 0x61, 0x74, 0x6f, 0x3b,
+0x4c, 0x65, 0x77, 0x65, 0x64, 0x69, 0x3b, 0x44, 0x69, 0x70, 0x68, 0x61,
+0x6c, 0x61, 0x6e, 0x65, 0x3b, 0x44, 0x69, 0x62, 0x61, 0x74, 0x73, 0x65,
+0x6c, 0x61, 0x3b, 0x4d, 0x61, 0x6e, 0x74, 0x68, 0x6f, 0x6c, 0x65, 0x50,
+0x68, 0x65, 0x72, 0x65, 0x3b, 0x44, 0x69, 0x62, 0x6f, 0x3b, 0x48, 0x6c,
+0x61, 0x6b, 0x3b, 0x4d, 0x6f, 0x72, 0x61, 0x3b, 0x4d, 0x6f, 0x70, 0x69,
+0x3b, 0x50, 0x68, 0x75, 0x70, 0x75, 0x3b, 0x4d, 0x6f, 0x73, 0x65, 0x3b,
+0x50, 0x68, 0x61, 0x74, 0x6f, 0x3b, 0x4c, 0x65, 0x77, 0x65, 0x3b, 0x44,
+0x69, 0x70, 0x68, 0x61, 0x3b, 0x44, 0x69, 0x62, 0x61, 0x3b, 0x4d, 0x61,
+0x6e, 0x74, 0x68, 0x50, 0x3b, 0x44, 0x3b, 0x48, 0x3b, 0x4d, 0x3b, 0x4d,
+0x3b, 0x50, 0x3b, 0x4d, 0x3b, 0x50, 0x3b, 0x4c, 0x3b, 0x44, 0x3b, 0x44,
+0x3b, 0x4d, 0x5a, 0x69, 0x62, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x6c, 0x61,
+0x3b, 0x4e, 0x68, 0x6c, 0x6f, 0x6c, 0x61, 0x6e, 0x6a, 0x61, 0x3b, 0x4d,
+0x62, 0x69, 0x6d, 0x62, 0x69, 0x74, 0x68, 0x6f, 0x3b, 0x4d, 0x61, 0x62,
+0x61, 0x73, 0x61, 0x3b, 0x4e, 0x6b, 0x77, 0x65, 0x6e, 0x6b, 0x77, 0x65,
+0x7a, 0x69, 0x3b, 0x4e, 0x68, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x6c, 0x61,
+0x3b, 0x4e, 0x74, 0x75, 0x6c, 0x69, 0x6b, 0x61, 0x7a, 0x69, 0x3b, 0x4e,
+0x63, 0x77, 0x61, 0x62, 0x61, 0x6b, 0x61, 0x7a, 0x69, 0x3b, 0x4d, 0x70,
+0x61, 0x6e, 0x64, 0x75, 0x6c, 0x61, 0x3b, 0x4d, 0x66, 0x75, 0x6d, 0x66,
+0x75, 0x3b, 0x4c, 0x77, 0x65, 0x7a, 0x69, 0x3b, 0x4d, 0x70, 0x61, 0x6c,
+0x61, 0x6b, 0x61, 0x7a, 0x69, 0x5a, 0x69, 0x62, 0x3b, 0x4e, 0x68, 0x6c,
+0x6f, 0x3b, 0x4d, 0x62, 0x69, 0x3b, 0x4d, 0x61, 0x62, 0x3b, 0x4e, 0x6b,
+0x77, 0x3b, 0x4e, 0x68, 0x6c, 0x61, 0x3b, 0x4e, 0x74, 0x75, 0x3b, 0x4e,
+0x63, 0x77, 0x3b, 0x4d, 0x70, 0x61, 0x6e, 0x3b, 0x4d, 0x66, 0x75, 0x3b,
+0x4c, 0x77, 0x65, 0x3b, 0x4d, 0x70, 0x61, 0x6c, 0x5a, 0x3b, 0x4e, 0x3b,
+0x4d, 0x3b, 0x4d, 0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x4e, 0x3b,
+0x4d, 0x3b, 0x4d, 0x3b, 0x4c, 0x3b, 0x4d, 0x6a, 0x61, 0x6e, 0x75, 0x61,
+0x72, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b, 0x6d, 0x61,
+0x72, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x61, 0x69,
+0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x3b, 0x61,
+0x75, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d,
+0x62, 0x65, 0x72, 0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b,
+0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x73,
+0x65, 0x6d, 0x62, 0x65, 0x72, 0x6a, 0x61, 0x6e, 0x2e, 0x3b, 0x66, 0x65,
+0x62, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x2e,
+0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x3b, 0x6a, 0x75,
+0x6c, 0x69, 0x3b, 0x61, 0x75, 0x67, 0x2e, 0x3b, 0x73, 0x65, 0x70, 0x2e,
+0x3b, 0x6f, 0x6b, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64,
+0x65, 0x73, 0x2e, 0x54, 0x69, 0x6f, 0x70, 0x20, 0x74, 0x68, 0x61, 0x72,
+0x20, 0x70, 0x25b, 0x74, 0x3b, 0x50, 0x25b, 0x74, 0x3b, 0x44, 0x75, 0x254,
+0x331, 0x254, 0x331, 0x14b, 0x3b, 0x47, 0x75, 0x61, 0x6b, 0x3b, 0x44, 0x75,
+0xe4, 0x74, 0x3b, 0x4b, 0x6f, 0x72, 0x6e, 0x79, 0x6f, 0x6f, 0x74, 0x3b,
+0x50, 0x61, 0x79, 0x20, 0x79, 0x69, 0x65, 0x331, 0x74, 0x6e, 0x69, 0x3b,
+0x54, 0x68, 0x6f, 0x331, 0x6f, 0x331, 0x72, 0x3b, 0x54, 0x25b, 0x25b, 0x72,
+0x3b, 0x4c, 0x61, 0x61, 0x74, 0x68, 0x3b, 0x4b, 0x75, 0x72, 0x3b, 0x54,
+0x69, 0x6f, 0x331, 0x70, 0x20, 0x69, 0x6e, 0x20, 0x64, 0x69, 0x331, 0x69,
+0x331, 0x74, 0x54, 0x69, 0x6f, 0x70, 0x3b, 0x50, 0x25b, 0x74, 0x3b, 0x44,
+0x75, 0x254, 0x331, 0x254, 0x331, 0x3b, 0x47, 0x75, 0x61, 0x6b, 0x3b, 0x44,
+0x75, 0xe4, 0x3b, 0x4b, 0x6f, 0x72, 0x3b, 0x50, 0x61, 0x79, 0x3b, 0x54,
+0x68, 0x6f, 0x6f, 0x3b, 0x54, 0x25b, 0x25b, 0x3b, 0x4c, 0x61, 0x61, 0x3b,
+0x4b, 0x75, 0x72, 0x3b, 0x54, 0x69, 0x64, 0x54, 0x3b, 0x50, 0x3b, 0x44,
+0x3b, 0x47, 0x3b, 0x44, 0x3b, 0x4b, 0x3b, 0x50, 0x3b, 0x54, 0x3b, 0x54,
+0x3b, 0x4c, 0x3b, 0x4b, 0x3b, 0x54, 0x4a, 0x61, 0x6e, 0x75, 0x77, 0x61,
+0x6c, 0x65, 0x3b, 0x46, 0x65, 0x62, 0x75, 0x6c, 0x75, 0x77, 0x61, 0x6c,
+0x65, 0x3b, 0x4d, 0x61, 0x6c, 0x69, 0x63, 0x68, 0x69, 0x3b, 0x45, 0x70,
+0x75, 0x6c, 0x6f, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69,
+0x3b, 0x4a, 0x75, 0x6c, 0x61, 0x69, 0x3b, 0x4f, 0x67, 0x61, 0x73, 0x69,
+0x74, 0x69, 0x3b, 0x53, 0x65, 0x70, 0x75, 0x74, 0x65, 0x6d, 0x62, 0x61,
+0x3b, 0x4f, 0x6b, 0x75, 0x74, 0x6f, 0x62, 0x61, 0x3b, 0x4e, 0x6f, 0x76,
+0x65, 0x6d, 0x62, 0x61, 0x3b, 0x44, 0x69, 0x73, 0x65, 0x6d, 0x62, 0x61,
+0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x6c, 0x3b,
+0x45, 0x70, 0x75, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b,
+0x4a, 0x75, 0x6c, 0x3b, 0x4f, 0x67, 0x61, 0x3b, 0x53, 0x65, 0x70, 0x3b,
+0x4f, 0x6b, 0x75, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x69, 0x73, 0x67,
+0x65, 0x6e, 0x69, 0xe8, 0x72, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x69, 0xe8,
+0x72, 0x3b, 0x6d, 0x61, 0x72, 0xe7, 0x3b, 0x61, 0x62, 0x72, 0x69, 0x6c,
+0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x6a, 0x75, 0x6e, 0x68, 0x3b, 0x6a, 0x75,
+0x6c, 0x68, 0x65, 0x74, 0x3b, 0x61, 0x67, 0x6f, 0x73, 0x74, 0x3b, 0x73,
+0x65, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x6f, 0x63, 0x74, 0xf2,
+0x62, 0x72, 0x65, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x65,
+0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x64, 0x65, 0x20,
+0x67, 0x65, 0x6e, 0x69, 0xe8, 0x72, 0x3b, 0x64, 0x65, 0x20, 0x66, 0x65,
+0x62, 0x72, 0x69, 0xe8, 0x72, 0x3b, 0x64, 0x65, 0x20, 0x6d, 0x61, 0x72,
+0xe7, 0x3b, 0x64, 0x2019, 0x61, 0x62, 0x72, 0x69, 0x6c, 0x3b, 0x64, 0x65,
+0x20, 0x6d, 0x61, 0x69, 0x3b, 0x64, 0x65, 0x20, 0x6a, 0x75, 0x6e, 0x68,
+0x3b, 0x64, 0x65, 0x20, 0x6a, 0x75, 0x6c, 0x68, 0x65, 0x74, 0x3b, 0x64,
+0x2019, 0x61, 0x67, 0x6f, 0x73, 0x74, 0x3b, 0x64, 0x65, 0x20, 0x73, 0x65,
+0x74, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x64, 0x2019, 0x6f, 0x63, 0x74,
+0xf2, 0x62, 0x72, 0x65, 0x3b, 0x64, 0x65, 0x20, 0x6e, 0x6f, 0x76, 0x65,
+0x6d, 0x62, 0x72, 0x65, 0x3b, 0x64, 0x65, 0x20, 0x64, 0x65, 0x63, 0x65,
+0x6d, 0x62, 0x72, 0x65, 0x67, 0x65, 0x6e, 0x2e, 0x3b, 0x66, 0x65, 0x62,
+0x2e, 0x3b, 0x6d, 0x61, 0x72, 0xe7, 0x3b, 0x61, 0x62, 0x72, 0x2e, 0x3b,
+0x6d, 0x61, 0x69, 0x3b, 0x6a, 0x75, 0x6e, 0x68, 0x3b, 0x6a, 0x75, 0x6c,
+0x2e, 0x3b, 0x61, 0x67, 0x6f, 0x2e, 0x3b, 0x73, 0x65, 0x74, 0x2e, 0x3b,
+0x6f, 0x63, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0x65,
+0x63, 0x2e, 0x47, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b,
+0x4a, 0x3b, 0x4a, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b,
+0x44, 0x67, 0xe8, 0x72, 0x3b, 0x68, 0x65, 0x72, 0x65, 0x75, 0xe8, 0x72,
+0x3b, 0x6d, 0x61, 0x72, 0xe7, 0x3b, 0x61, 0x62, 0x72, 0x69, 0x75, 0x3b,
+0x6d, 0x61, 0x69, 0x3b, 0x6a, 0x75, 0x6e, 0x68, 0x3b, 0x6a, 0x75, 0x72,
+0x69, 0xf2, 0x6c, 0x3b, 0x61, 0x67, 0x6f, 0x73, 0x74, 0x3b, 0x73, 0x65,
+0x74, 0x65, 0x6d, 0x65, 0x3b, 0x6f, 0x63, 0x74, 0x6f, 0x62, 0x72, 0x65,
+0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x3b, 0x64, 0x65, 0x73, 0x65,
+0x6d, 0x65, 0x67, 0xe8, 0x72, 0x3b, 0x68, 0x65, 0x72, 0x3b, 0x6d, 0x61,
+0x72, 0x3b, 0x61, 0x62, 0x72, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x6a, 0x75,
+0x6e, 0x3b, 0x6a, 0x75, 0x72, 0x3b, 0x61, 0x67, 0x6f, 0x3b, 0x73, 0x65,
+0x74, 0x3b, 0x6f, 0x63, 0x74, 0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64, 0x65,
+0x63, 0x47, 0x3b, 0x48, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x4a,
+0x3b, 0x4a, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44,
+0xb1c, 0xb3e, 0xb28, 0xb41, 0xb06, 0xb30, 0xb40, 0x3b, 0xb2b, 0xb47, 0xb2c, 0xb43,
+0xb06, 0xb30, 0xb40, 0x3b, 0xb2e, 0xb3e, 0xb30, 0xb4d, 0xb1a, 0xb4d, 0xb1a, 0x3b,
+0xb05, 0xb2a, 0xb4d, 0xb30, 0xb47, 0xb32, 0x3b, 0xb2e, 0xb07, 0x3b, 0xb1c, 0xb41,
+0xb28, 0x3b, 0xb1c, 0xb41, 0xb32, 0xb3e, 0xb07, 0x3b, 0xb05, 0xb17, 0xb37, 0xb4d,
+0xb1f, 0x3b, 0xb38, 0xb47, 0xb2a, 0xb4d, 0xb1f, 0xb47, 0xb2e, 0xb4d, 0xb2c, 0xb30,
+0x3b, 0xb05, 0xb15, 0xb4d, 0xb1f, 0xb4b, 0xb2c, 0xb30, 0x3b, 0xb28, 0xb2d, 0xb47,
+0xb2e, 0xb4d, 0xb2c, 0xb30, 0x3b, 0xb21, 0xb3f, 0xb38, 0xb47, 0xb2e, 0xb4d, 0xb2c,
+0xb30, 0xb1c, 0xb3e, 0x3b, 0xb2b, 0xb47, 0x3b, 0xb2e, 0xb3e, 0x3b, 0xb05, 0x3b,
+0xb2e, 0xb07, 0x3b, 0xb1c, 0xb41, 0x3b, 0xb1c, 0xb41, 0x3b, 0xb05, 0x3b, 0xb38,
+0xb47, 0x3b, 0xb05, 0x3b, 0xb28, 0x3b, 0xb21, 0xb3f, 0x41, 0x6d, 0x61, 0x6a,
+0x6a, 0x69, 0x69, 0x3b, 0x47, 0x75, 0x72, 0x61, 0x61, 0x6e, 0x64, 0x68,
+0x61, 0x6c, 0x61, 0x3b, 0x42, 0x69, 0x74, 0x6f, 0x6f, 0x74, 0x65, 0x65,
+0x73, 0x73, 0x61, 0x3b, 0x45, 0x6c, 0x62, 0x61, 0x3b, 0x43, 0x61, 0x61,
+0x6d, 0x73, 0x61, 0x3b, 0x57, 0x61, 0x78, 0x61, 0x62, 0x61, 0x6a, 0x6a,
+0x69, 0x69, 0x3b, 0x41, 0x64, 0x6f, 0x6f, 0x6c, 0x65, 0x65, 0x73, 0x73,
+0x61, 0x3b, 0x48, 0x61, 0x67, 0x61, 0x79, 0x79, 0x61, 0x3b, 0x46, 0x75,
+0x75, 0x6c, 0x62, 0x61, 0x6e, 0x61, 0x3b, 0x4f, 0x6e, 0x6b, 0x6f, 0x6c,
+0x6f, 0x6c, 0x65, 0x65, 0x73, 0x73, 0x61, 0x3b, 0x53, 0x61, 0x64, 0x61,
+0x61, 0x73, 0x61, 0x3b, 0x4d, 0x75, 0x64, 0x64, 0x65, 0x65, 0x41, 0x6d,
+0x61, 0x3b, 0x47, 0x75, 0x72, 0x3b, 0x42, 0x69, 0x74, 0x3b, 0x45, 0x6c,
+0x62, 0x3b, 0x43, 0x61, 0x6d, 0x3b, 0x57, 0x61, 0x78, 0x3b, 0x41, 0x64,
+0x6f, 0x3b, 0x48, 0x61, 0x67, 0x3b, 0x46, 0x75, 0x6c, 0x3b, 0x4f, 0x6e,
+0x6b, 0x3b, 0x53, 0x61, 0x64, 0x3b, 0x4d, 0x75, 0x64, 0x41, 0x3b, 0x47,
+0x3b, 0x42, 0x3b, 0x45, 0x3b, 0x43, 0x3b, 0x57, 0x3b, 0x41, 0x3b, 0x48,
+0x3b, 0x46, 0x3b, 0x4f, 0x3b, 0x53, 0x3b, 0x4d, 0xd801, 0xdcc0, 0xd801, 0xdce3,
+0x358, 0xd801, 0xdcea, 0x358, 0xd801, 0xdcec, 0xd801, 0xdcd8, 0x20, 0xd801, 0xdcc4, 0xd801,
+0xdcd8, 0xd801, 0xdce1, 0xd801, 0xdcdb, 0x358, 0xd801, 0xdce7, 0xd801, 0xdcdf, 0x3b, 0xd801,
+0xdcc0, 0xd801, 0xdce3, 0x358, 0xd801, 0xdcea, 0x358, 0xd801, 0xdcec, 0xd801, 0xdcd8, 0x20,
+0xd801, 0xdccf, 0xd801, 0xdcdf, 0xd801, 0xdcf5, 0xd801, 0xdcea, 0x358, 0xd801, 0xdcec, 0xd801,
+0xdcd8, 0x3b, 0xd801, 0xdcc0, 0xd801, 0xdce3, 0x358, 0xd801, 0xdcea, 0x358, 0xd801, 0xdcec,
+0xd801, 0xdcd8, 0x20, 0xd801, 0xdccf, 0xd801, 0xdcdf, 0xd801, 0xdcf5, 0xd801, 0xdcd8, 0xd801,
+0xdcdc, 0xd801, 0xdce3, 0x3b, 0xd801, 0xdcc0, 0xd801, 0xdce3, 0x358, 0xd801, 0xdcea, 0x358,
+0xd801, 0xdcec, 0xd801, 0xdcd8, 0x20, 0xd801, 0xdccf, 0xd801, 0xdcdf, 0xd801, 0xdcf0, 0xd801,
+0xdcea, 0xd801, 0xdcec, 0xd801, 0xdcd8, 0x3b, 0xd801, 0xdcc0, 0xd801, 0xdce3, 0x358, 0xd801,
+0xdcea, 0x358, 0xd801, 0xdcec, 0xd801, 0xdcd8, 0x20, 0xd801, 0xdccf, 0xd801, 0xdcdf, 0xd801,
+0xdcee, 0xd801, 0xdcd8, 0xd801, 0xdcf0, 0xd801, 0xdcd8, 0x3b, 0xd801, 0xdcc0, 0xd801, 0xdce3,
+0x358, 0xd801, 0xdcea, 0x358, 0xd801, 0xdcec, 0xd801, 0xdcd8, 0x20, 0xd801, 0xdccf, 0xd801,
+0xdcdf, 0xd801, 0xdcef, 0xd801, 0xdcd8, 0xd801, 0xdcec, 0xd801, 0xdcdf, 0x3b, 0xd801, 0xdcc0,
+0xd801, 0xdce3, 0x358, 0xd801, 0xdcea, 0x358, 0xd801, 0xdcec, 0xd801, 0xdcd8, 0x20, 0xd801,
+0xdcc4, 0xd801, 0xdcdf, 0xd801, 0xdcf5, 0xd801, 0xdcea, 0x358, 0xd801, 0xdcec, 0xd801, 0xdcd8,
+0x3b, 0xd801, 0xdcc0, 0xd801, 0xdce3, 0x358, 0xd801, 0xdcea, 0x358, 0xd801, 0xdcec, 0xd801,
+0xdcd8, 0x20, 0xd801, 0xdcbc, 0xd801, 0xdce3, 0xd801, 0xdcdf, 0xd801, 0xdcf0, 0xd801, 0xdcea,
+0xd801, 0xdcec, 0xd801, 0xdcd8, 0x3b, 0xd801, 0xdcc0, 0xd801, 0xdce3, 0x358, 0xd801, 0xdcea,
+0x358, 0xd801, 0xdcec, 0xd801, 0xdcd8, 0x20, 0xd801, 0xdcbf, 0xd801, 0xdcdf, 0xd801, 0xdcdc,
+0xd801, 0xdcdb, 0xd801, 0xdcf2, 0xd801, 0xdcdf, 0xd801, 0xdcf7, 0xd801, 0xdce3, 0x358, 0xd801,
+0xdce4, 0xd801, 0xdcdf, 0x3b, 0xd801, 0xdcc0, 0xd801, 0xdce3, 0x358, 0xd801, 0xdcea, 0x358,
+0xd801, 0xdcec, 0xd801, 0xdcd8, 0x20, 0xd801, 0xdcbf, 0xd801, 0xdcdf, 0xd801, 0xdcdc, 0xd801,
+0xdcdb, 0x3b, 0xd801, 0xdcc0, 0xd801, 0xdce3, 0x358, 0xd801, 0xdcea, 0x358, 0xd801, 0xdcec,
+0xd801, 0xdcd8, 0x20, 0xd801, 0xdcb0, 0xd801, 0xdce7, 0xd801, 0xdce3, 0x20, 0xd801, 0xdccf,
+0xd801, 0xdce3, 0x358, 0xd801, 0xdcf8, 0xd801, 0xdcf2, 0xd801, 0xdce3, 0x3b, 0xd801, 0xdcc0,
+0xd801, 0xdce3, 0x358, 0xd801, 0xdcea, 0x358, 0xd801, 0xdcec, 0xd801, 0xdcd8, 0x20, 0xd801,
+0xdcb0, 0xd801, 0xdce7, 0xd801, 0xdce3, 0x20, 0xd801, 0xdccd, 0xd801, 0xdcea, 0x358, 0xd801,
+0xdcec, 0xd801, 0xdcd8, 0xd801, 0xdcc4, 0xd801, 0xdcd8, 0xd801, 0xdce1, 0xd801, 0xdcdb, 0x358,
+0xd801, 0xdce7, 0xd801, 0xdcdf, 0x3b, 0xd801, 0xdcf5, 0xd801, 0xdcea, 0x358, 0xd801, 0xdcec,
+0xd801, 0xdcd8, 0x3b, 0xd801, 0xdcf5, 0xd801, 0xdcd8, 0xd801, 0xdcdc, 0xd801, 0xdce3, 0x3b,
+0xd801, 0xdcf0, 0xd801, 0xdcea, 0xd801, 0xdcec, 0xd801, 0xdcd8, 0x3b, 0xd801, 0xdcee, 0xd801,
+0xdcd8, 0xd801, 0xdcf0, 0xd801, 0xdcd8, 0x3b, 0xd801, 0xdcef, 0xd801, 0xdcd8, 0xd801, 0xdcec,
+0xd801, 0xdcdf, 0x3b, 0xd801, 0xdcc4, 0xd801, 0xdcdf, 0xd801, 0xdcf5, 0xd801, 0xdcea, 0x358,
+0xd801, 0xdcec, 0xd801, 0xdcd8, 0x3b, 0xd801, 0xdcbc, 0xd801, 0xdce3, 0xd801, 0xdcdf, 0xd801,
+0xdcf0, 0xd801, 0xdcea, 0xd801, 0xdcec, 0xd801, 0xdcd8, 0x3b, 0xd801, 0xdcbf, 0xd801, 0xdcdf,
+0xd801, 0xdcdc, 0xd801, 0xdcdb, 0xd801, 0xdcf2, 0xd801, 0xdcdf, 0xd801, 0xdcf7, 0xd801, 0xdce3,
+0x358, 0xd801, 0xdce4, 0xd801, 0xdcdf, 0x3b, 0xd801, 0xdcbf, 0xd801, 0xdcdf, 0xd801, 0xdcdc,
+0xd801, 0xdcdb, 0x3b, 0xd801, 0xdcb0, 0xd801, 0xdce7, 0xd801, 0xdce3, 0x20, 0xd801, 0xdccf,
+0xd801, 0xdce3, 0x358, 0xd801, 0xdcf8, 0xd801, 0xdcf2, 0xd801, 0xdce3, 0x3b, 0xd801, 0xdcb0,
+0xd801, 0xdce7, 0xd801, 0xdce3, 0x20, 0xd801, 0xdccd, 0xd801, 0xdcea, 0x358, 0xd801, 0xdcec,
+0xd801, 0xdcd8, 0x42f, 0x43d, 0x432, 0x430, 0x440, 0x44c, 0x3b, 0x424, 0x435, 0x432,
+0x440, 0x430, 0x43b, 0x44c, 0x3b, 0x41c, 0x430, 0x440, 0x442, 0x44a, 0x438, 0x3b,
+0x410, 0x43f, 0x440, 0x435, 0x43b, 0x44c, 0x3b, 0x41c, 0x430, 0x439, 0x3b, 0x418,
+0x44e, 0x43d, 0x44c, 0x3b, 0x418, 0x44e, 0x43b, 0x44c, 0x3b, 0x410, 0x432, 0x433,
+0x443, 0x441, 0x442, 0x3b, 0x421, 0x435, 0x43d, 0x442, 0x44f, 0x431, 0x440, 0x44c,
+0x3b, 0x41e, 0x43a, 0x442, 0x44f, 0x431, 0x440, 0x44c, 0x3b, 0x41d, 0x43e, 0x44f,
+0x431, 0x440, 0x44c, 0x3b, 0x414, 0x435, 0x43a, 0x430, 0x431, 0x440, 0x44c, 0x44f,
+0x43d, 0x432, 0x430, 0x440, 0x44b, 0x3b, 0x444, 0x435, 0x432, 0x440, 0x430, 0x43b,
+0x44b, 0x3b, 0x43c, 0x430, 0x440, 0x442, 0x44a, 0x438, 0x439, 0x44b, 0x3b, 0x430,
+0x43f, 0x440, 0x435, 0x43b, 0x44b, 0x3b, 0x43c, 0x430, 0x439, 0x44b, 0x3b, 0x438,
+0x44e, 0x43d, 0x44b, 0x3b, 0x438, 0x44e, 0x43b, 0x44b, 0x3b, 0x430, 0x432, 0x433,
+0x443, 0x441, 0x442, 0x44b, 0x3b, 0x441, 0x435, 0x43d, 0x442, 0x44f, 0x431, 0x440,
+0x44b, 0x3b, 0x43e, 0x43a, 0x442, 0x44f, 0x431, 0x440, 0x44b, 0x3b, 0x43d, 0x43e,
+0x44f, 0x431, 0x440, 0x44b, 0x3b, 0x434, 0x435, 0x43a, 0x430, 0x431, 0x440, 0x44b,
+0x42f, 0x43d, 0x432, 0x2e, 0x3b, 0x424, 0x435, 0x432, 0x440, 0x2e, 0x3b, 0x41c,
+0x430, 0x440, 0x442, 0x2e, 0x3b, 0x410, 0x43f, 0x440, 0x2e, 0x3b, 0x41c, 0x430,
+0x439, 0x3b, 0x418, 0x44e, 0x43d, 0x44c, 0x3b, 0x418, 0x44e, 0x43b, 0x44c, 0x3b,
+0x410, 0x432, 0x433, 0x2e, 0x3b, 0x421, 0x435, 0x43d, 0x442, 0x2e, 0x3b, 0x41e,
+0x43a, 0x442, 0x2e, 0x3b, 0x41d, 0x43e, 0x44f, 0x431, 0x2e, 0x3b, 0x414, 0x435,
+0x43a, 0x2e, 0x44f, 0x43d, 0x432, 0x2e, 0x3b, 0x444, 0x435, 0x432, 0x2e, 0x3b,
+0x43c, 0x430, 0x440, 0x2e, 0x3b, 0x430, 0x43f, 0x440, 0x2e, 0x3b, 0x43c, 0x430,
+0x439, 0x44b, 0x3b, 0x438, 0x44e, 0x43d, 0x44b, 0x3b, 0x438, 0x44e, 0x43b, 0x44b,
+0x3b, 0x430, 0x432, 0x433, 0x2e, 0x3b, 0x441, 0x435, 0x43d, 0x2e, 0x3b, 0x43e,
+0x43a, 0x442, 0x2e, 0x3b, 0x43d, 0x43e, 0x44f, 0x2e, 0x3b, 0x434, 0x435, 0x43a,
+0x2e, 0x59, 0x61, 0x6e, 0xfc, 0x61, 0x72, 0x69, 0x3b, 0x46, 0x65, 0x62,
+0x72, 0xfc, 0x61, 0x72, 0x69, 0x3b, 0x4d, 0x61, 0x72, 0x74, 0x3b, 0x41,
+0x70, 0x72, 0x65, 0x6c, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x59, 0xfc, 0x6e,
+0x69, 0x3b, 0x59, 0xfc, 0x6c, 0x69, 0x3b, 0x4f, 0x75, 0x67, 0xf9, 0x73,
+0x74, 0xf9, 0x73, 0x3b, 0x53, 0xe8, 0x70, 0x74, 0xe8, 0x6d, 0x62, 0x65,
+0x72, 0x3b, 0xd2, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x4e, 0x6f,
+0x76, 0xe8, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x44, 0x65, 0x73, 0xe8, 0x6d,
+0x62, 0x65, 0x72, 0x6a, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x62, 0x3b, 0x6d,
+0x61, 0x72, 0x3b, 0x61, 0x70, 0x72, 0x3b, 0x6d, 0x65, 0x69, 0x3b, 0x79,
+0xfc, 0x6e, 0x3b, 0x79, 0xfc, 0x6c, 0x3b, 0x6f, 0x75, 0x67, 0x3b, 0x73,
+0xe8, 0x70, 0x3b, 0xf2, 0x6b, 0x74, 0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64,
+0x65, 0x73, 0x59, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61,
+0x72, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x59, 0xfc,
+0x6e, 0x3b, 0x59, 0xfc, 0x6c, 0x3b, 0x4f, 0x75, 0x67, 0x3b, 0x53, 0xe8,
+0x70, 0x3b, 0xd2, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65,
+0x73, 0x62c, 0x646, 0x648, 0x631, 0x64a, 0x3b, 0x641, 0x6d0, 0x628, 0x631, 0x648,
+0x631, 0x64a, 0x3b, 0x645, 0x627, 0x631, 0x686, 0x3b, 0x627, 0x67e, 0x631, 0x6cc,
+0x644, 0x3b, 0x645, 0x6cd, 0x3b, 0x62c, 0x648, 0x646, 0x3b, 0x62c, 0x648, 0x644,
+0x627, 0x6cc, 0x3b, 0x627, 0x6ab, 0x633, 0x62a, 0x3b, 0x633, 0x67e, 0x62a, 0x645,
+0x628, 0x631, 0x3b, 0x627, 0x6a9, 0x62a, 0x648, 0x628, 0x631, 0x3b, 0x646, 0x648,
+0x645, 0x628, 0x631, 0x3b, 0x62f, 0x633, 0x645, 0x628, 0x631, 0x62c, 0x646, 0x648,
+0x631, 0x64a, 0x3b, 0x641, 0x628, 0x631, 0x648, 0x631, 0x64a, 0x3b, 0x645, 0x627,
+0x631, 0x686, 0x3b, 0x627, 0x67e, 0x631, 0x6cc, 0x644, 0x3b, 0x645, 0x6cd, 0x3b,
+0x62c, 0x648, 0x646, 0x3b, 0x62c, 0x648, 0x644, 0x627, 0x6cc, 0x3b, 0x627, 0x6ab,
+0x633, 0x62a, 0x3b, 0x633, 0x6d0, 0x67e, 0x62a, 0x645, 0x628, 0x631, 0x3b, 0x627,
+0x6a9, 0x62a, 0x648, 0x628, 0x631, 0x3b, 0x646, 0x648, 0x645, 0x628, 0x631, 0x3b,
+0x62f, 0x633, 0x645, 0x628, 0x631, 0x62c, 0x646, 0x648, 0x631, 0x64a, 0x3b, 0x641,
+0x628, 0x631, 0x648, 0x631, 0x64a, 0x3b, 0x645, 0x627, 0x631, 0x686, 0x3b, 0x627,
+0x67e, 0x631, 0x6cc, 0x644, 0x3b, 0x645, 0x6cd, 0x3b, 0x62c, 0x648, 0x646, 0x3b,
+0x62c, 0x648, 0x644, 0x627, 0x6cc, 0x3b, 0x627, 0x6ab, 0x633, 0x62a, 0x3b, 0x633,
+0x67e, 0x62a, 0x645, 0x628, 0x631, 0x3b, 0x627, 0x6a9, 0x62a, 0x648, 0x628, 0x631,
+0x3b, 0x646, 0x648, 0x645, 0x628, 0x631, 0x3b, 0x62f, 0x633, 0x645, 0x628, 0x631,
+0x62c, 0x3b, 0x641, 0x3b, 0x645, 0x3b, 0x627, 0x3b, 0x645, 0x3b, 0x62c, 0x3b,
+0x62c, 0x3b, 0x627, 0x3b, 0x633, 0x3b, 0x627, 0x3b, 0x646, 0x3b, 0x62f, 0x698,
+0x627, 0x646, 0x648, 0x6cc, 0x647, 0x654, 0x3b, 0x641, 0x648, 0x631, 0x6cc, 0x647,
+0x654, 0x3b, 0x645, 0x627, 0x631, 0x633, 0x3b, 0x622, 0x648, 0x631, 0x6cc, 0x644,
+0x3b, 0x645, 0x647, 0x654, 0x3b, 0x698, 0x648, 0x626, 0x646, 0x3b, 0x698, 0x648,
+0x626, 0x6cc, 0x647, 0x654, 0x3b, 0x627, 0x648, 0x62a, 0x3b, 0x633, 0x67e, 0x62a,
+0x627, 0x645, 0x628, 0x631, 0x3b, 0x627, 0x6a9, 0x62a, 0x628, 0x631, 0x3b, 0x646,
+0x648, 0x627, 0x645, 0x628, 0x631, 0x3b, 0x62f, 0x633, 0x627, 0x645, 0x628, 0x631,
+0x698, 0x3b, 0x641, 0x3b, 0x645, 0x3b, 0x622, 0x3b, 0x645, 0x3b, 0x698, 0x3b,
+0x698, 0x3b, 0x627, 0x3b, 0x633, 0x3b, 0x627, 0x3b, 0x646, 0x3b, 0x62f, 0x62c,
+0x646, 0x648, 0x631, 0x6cc, 0x3b, 0x641, 0x628, 0x631, 0x648, 0x631, 0x6cc, 0x3b,
+0x645, 0x627, 0x631, 0x686, 0x3b, 0x627, 0x67e, 0x631, 0x6cc, 0x644, 0x3b, 0x645,
+0x6cc, 0x3b, 0x62c, 0x648, 0x646, 0x3b, 0x62c, 0x648, 0x644, 0x627, 0x6cc, 0x3b,
+0x627, 0x6af, 0x633, 0x62a, 0x3b, 0x633, 0x67e, 0x62a, 0x645, 0x628, 0x631, 0x3b,
+0x627, 0x6a9, 0x62a, 0x648, 0x628, 0x631, 0x3b, 0x646, 0x648, 0x645, 0x628, 0x631,
+0x3b, 0x62f, 0x633, 0x645, 0x628, 0x631, 0x62c, 0x646, 0x648, 0x3b, 0x641, 0x628,
+0x631, 0x648, 0x631, 0x6cc, 0x3b, 0x645, 0x627, 0x631, 0x686, 0x3b, 0x627, 0x67e,
+0x631, 0x6cc, 0x644, 0x3b, 0x645, 0x6cc, 0x3b, 0x62c, 0x648, 0x646, 0x3b, 0x62c,
+0x648, 0x644, 0x3b, 0x627, 0x6af, 0x633, 0x62a, 0x3b, 0x633, 0x67e, 0x62a, 0x645,
+0x628, 0x631, 0x3b, 0x627, 0x6a9, 0x62a, 0x648, 0x628, 0x631, 0x3b, 0x646, 0x648,
+0x645, 0x628, 0x631, 0x3b, 0x62f, 0x633, 0x645, 0x73, 0x74, 0x79, 0x63, 0x7a,
+0x65, 0x144, 0x3b, 0x6c, 0x75, 0x74, 0x79, 0x3b, 0x6d, 0x61, 0x72, 0x7a,
+0x65, 0x63, 0x3b, 0x6b, 0x77, 0x69, 0x65, 0x63, 0x69, 0x65, 0x144, 0x3b,
+0x6d, 0x61, 0x6a, 0x3b, 0x63, 0x7a, 0x65, 0x72, 0x77, 0x69, 0x65, 0x63,
+0x3b, 0x6c, 0x69, 0x70, 0x69, 0x65, 0x63, 0x3b, 0x73, 0x69, 0x65, 0x72,
+0x70, 0x69, 0x65, 0x144, 0x3b, 0x77, 0x72, 0x7a, 0x65, 0x73, 0x69, 0x65,
+0x144, 0x3b, 0x70, 0x61, 0x17a, 0x64, 0x7a, 0x69, 0x65, 0x72, 0x6e, 0x69,
+0x6b, 0x3b, 0x6c, 0x69, 0x73, 0x74, 0x6f, 0x70, 0x61, 0x64, 0x3b, 0x67,
+0x72, 0x75, 0x64, 0x7a, 0x69, 0x65, 0x144, 0x73, 0x74, 0x79, 0x63, 0x7a,
+0x6e, 0x69, 0x61, 0x3b, 0x6c, 0x75, 0x74, 0x65, 0x67, 0x6f, 0x3b, 0x6d,
+0x61, 0x72, 0x63, 0x61, 0x3b, 0x6b, 0x77, 0x69, 0x65, 0x74, 0x6e, 0x69,
+0x61, 0x3b, 0x6d, 0x61, 0x6a, 0x61, 0x3b, 0x63, 0x7a, 0x65, 0x72, 0x77,
+0x63, 0x61, 0x3b, 0x6c, 0x69, 0x70, 0x63, 0x61, 0x3b, 0x73, 0x69, 0x65,
+0x72, 0x70, 0x6e, 0x69, 0x61, 0x3b, 0x77, 0x72, 0x7a, 0x65, 0x15b, 0x6e,
+0x69, 0x61, 0x3b, 0x70, 0x61, 0x17a, 0x64, 0x7a, 0x69, 0x65, 0x72, 0x6e,
+0x69, 0x6b, 0x61, 0x3b, 0x6c, 0x69, 0x73, 0x74, 0x6f, 0x70, 0x61, 0x64,
+0x61, 0x3b, 0x67, 0x72, 0x75, 0x64, 0x6e, 0x69, 0x61, 0x73, 0x74, 0x79,
+0x3b, 0x6c, 0x75, 0x74, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x6b, 0x77, 0x69,
+0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x63, 0x7a, 0x65, 0x3b, 0x6c, 0x69, 0x70,
+0x3b, 0x73, 0x69, 0x65, 0x3b, 0x77, 0x72, 0x7a, 0x3b, 0x70, 0x61, 0x17a,
+0x3b, 0x6c, 0x69, 0x73, 0x3b, 0x67, 0x72, 0x75, 0x53, 0x3b, 0x4c, 0x3b,
+0x4d, 0x3b, 0x4b, 0x3b, 0x4d, 0x3b, 0x43, 0x3b, 0x4c, 0x3b, 0x53, 0x3b,
+0x57, 0x3b, 0x50, 0x3b, 0x4c, 0x3b, 0x47, 0x73, 0x3b, 0x6c, 0x3b, 0x6d,
+0x3b, 0x6b, 0x3b, 0x6d, 0x3b, 0x63, 0x3b, 0x6c, 0x3b, 0x73, 0x3b, 0x77,
+0x3b, 0x70, 0x3b, 0x6c, 0x3b, 0x67, 0x6a, 0x61, 0x6e, 0x65, 0x69, 0x72,
+0x6f, 0x3b, 0x66, 0x65, 0x76, 0x65, 0x72, 0x65, 0x69, 0x72, 0x6f, 0x3b,
+0x6d, 0x61, 0x72, 0xe7, 0x6f, 0x3b, 0x61, 0x62, 0x72, 0x69, 0x6c, 0x3b,
+0x6d, 0x61, 0x69, 0x6f, 0x3b, 0x6a, 0x75, 0x6e, 0x68, 0x6f, 0x3b, 0x6a,
+0x75, 0x6c, 0x68, 0x6f, 0x3b, 0x61, 0x67, 0x6f, 0x73, 0x74, 0x6f, 0x3b,
+0x73, 0x65, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x6f, 0x3b, 0x6f, 0x75, 0x74,
+0x75, 0x62, 0x72, 0x6f, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72,
+0x6f, 0x3b, 0x64, 0x65, 0x7a, 0x65, 0x6d, 0x62, 0x72, 0x6f, 0x6a, 0x61,
+0x6e, 0x2e, 0x3b, 0x66, 0x65, 0x76, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x2e,
+0x3b, 0x61, 0x62, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x69, 0x2e, 0x3b, 0x6a,
+0x75, 0x6e, 0x2e, 0x3b, 0x6a, 0x75, 0x6c, 0x2e, 0x3b, 0x61, 0x67, 0x6f,
+0x2e, 0x3b, 0x73, 0x65, 0x74, 0x2e, 0x3b, 0x6f, 0x75, 0x74, 0x2e, 0x3b,
+0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0x65, 0x7a, 0x2e, 0x72, 0x61, 0x67,
+0x73, 0x3b, 0x77, 0x61, 0x73, 0x73, 0x61, 0x72, 0x69, 0x6e, 0x73, 0x3b,
+0x70, 0x16b, 0x6c, 0x69, 0x73, 0x3b, 0x73, 0x61, 0x6b, 0x6b, 0x69, 0x73,
+0x3b, 0x7a, 0x61, 0x6c, 0x6c, 0x61, 0x77, 0x73, 0x3b, 0x73, 0x12b, 0x6d,
+0x65, 0x6e, 0x69, 0x73, 0x3b, 0x6c, 0x12b, 0x70, 0x61, 0x3b, 0x64, 0x61,
+0x67, 0x67, 0x69, 0x73, 0x3b, 0x73, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x73,
+0x3b, 0x73, 0x70, 0x61, 0x6c, 0x6c, 0x69, 0x6e, 0x73, 0x3b, 0x6c, 0x61,
+0x70, 0x6b, 0x72, 0x16b, 0x74, 0x69, 0x73, 0x3b, 0x73, 0x61, 0x6c, 0x6c,
+0x61, 0x77, 0x73, 0x72, 0x61, 0x67, 0x3b, 0x77, 0x61, 0x73, 0x3b, 0x70,
+0x16b, 0x6c, 0x3b, 0x73, 0x61, 0x6b, 0x3b, 0x7a, 0x61, 0x6c, 0x3b, 0x73,
+0x12b, 0x6d, 0x3b, 0x6c, 0x12b, 0x70, 0x3b, 0x64, 0x61, 0x67, 0x3b, 0x73,
+0x69, 0x6c, 0x3b, 0x73, 0x70, 0x61, 0x3b, 0x6c, 0x61, 0x70, 0x3b, 0x73,
+0x61, 0x6c, 0x52, 0x3b, 0x57, 0x3b, 0x50, 0x3b, 0x53, 0x3b, 0x5a, 0x3b,
+0x53, 0x3b, 0x4c, 0x3b, 0x44, 0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x4c, 0x3b,
+0x53, 0xa1c, 0xa28, 0xa35, 0xa30, 0xa40, 0x3b, 0xa2b, 0xa3c, 0xa30, 0xa35, 0xa30,
+0xa40, 0x3b, 0xa2e, 0xa3e, 0xa30, 0xa1a, 0x3b, 0xa05, 0xa2a, 0xa4d, 0xa30, 0xa48,
+0xa32, 0x3b, 0xa2e, 0xa08, 0x3b, 0xa1c, 0xa42, 0xa28, 0x3b, 0xa1c, 0xa41, 0xa32,
+0xa3e, 0xa08, 0x3b, 0xa05, 0xa17, 0xa38, 0xa24, 0x3b, 0xa38, 0xa24, 0xa70, 0xa2c,
+0xa30, 0x3b, 0xa05, 0xa15, 0xa24, 0xa42, 0xa2c, 0xa30, 0x3b, 0xa28, 0xa35, 0xa70,
+0xa2c, 0xa30, 0x3b, 0xa26, 0xa38, 0xa70, 0xa2c, 0xa30, 0xa1c, 0xa28, 0x3b, 0xa2b,
+0xa3c, 0xa30, 0x3b, 0xa2e, 0xa3e, 0xa30, 0xa1a, 0x3b, 0xa05, 0xa2a, 0xa4d, 0xa30,
+0xa48, 0x3b, 0xa2e, 0xa08, 0x3b, 0xa1c, 0xa42, 0xa28, 0x3b, 0xa1c, 0xa41, 0xa32,
+0xa3e, 0x3b, 0xa05, 0xa17, 0x3b, 0xa38, 0xa24, 0xa70, 0x3b, 0xa05, 0xa15, 0xa24,
+0xa42, 0x3b, 0xa28, 0xa35, 0xa70, 0x3b, 0xa26, 0xa38, 0xa70, 0xa1c, 0x3b, 0xa2b,
+0xa3c, 0x3b, 0xa2e, 0xa3e, 0x3b, 0xa05, 0x3b, 0xa2e, 0x3b, 0xa1c, 0xa42, 0x3b,
+0xa1c, 0xa41, 0x3b, 0xa05, 0x3b, 0xa38, 0x3b, 0xa05, 0x3b, 0xa28, 0x3b, 0xa26,
+0x62c, 0x646, 0x648, 0x631, 0x6cc, 0x3b, 0x641, 0x631, 0x648, 0x631, 0x6cc, 0x3b,
+0x645, 0x627, 0x631, 0x686, 0x3b, 0x627, 0x67e, 0x631, 0x6cc, 0x644, 0x3b, 0x645,
+0x626, 0x3b, 0x62c, 0x648, 0x646, 0x3b, 0x62c, 0x648, 0x644, 0x627, 0x626, 0x6cc,
+0x3b, 0x627, 0x6af, 0x633, 0x62a, 0x3b, 0x633, 0x62a, 0x645, 0x628, 0x631, 0x3b,
+0x627, 0x6a9, 0x62a, 0x648, 0x628, 0x631, 0x3b, 0x646, 0x648, 0x645, 0x628, 0x631,
+0x3b, 0x62f, 0x633, 0x645, 0x628, 0x631, 0x45, 0x6e, 0x65, 0x72, 0x6f, 0x3b,
+0x46, 0x65, 0x62, 0x72, 0x65, 0x72, 0x6f, 0x3b, 0x4d, 0x61, 0x72, 0x7a,
+0x6f, 0x3b, 0x41, 0x62, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x61, 0x79, 0x6f,
+0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x6f, 0x3b, 0x4a, 0x75, 0x6c, 0x69, 0x6f,
+0x3b, 0x41, 0x67, 0x6f, 0x73, 0x74, 0x6f, 0x3b, 0x53, 0x65, 0x74, 0x69,
+0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x4f, 0x63, 0x74, 0x75, 0x62, 0x72,
+0x65, 0x3b, 0x4e, 0x6f, 0x76, 0x69, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b,
+0x44, 0x69, 0x63, 0x69, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x45, 0x6e, 0x65,
+0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x62, 0x72,
+0x3b, 0x4d, 0x61, 0x79, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c,
+0x3b, 0x41, 0x67, 0x6f, 0x3b, 0x53, 0x65, 0x74, 0x3b, 0x4f, 0x63, 0x74,
+0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x69, 0x63, 0x69, 0x61, 0x6e, 0x75,
+0x61, 0x72, 0x69, 0x65, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72,
+0x69, 0x65, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x69, 0x65, 0x3b, 0x61, 0x70,
+0x72, 0x69, 0x6c, 0x69, 0x65, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x69, 0x75,
+0x6e, 0x69, 0x65, 0x3b, 0x69, 0x75, 0x6c, 0x69, 0x65, 0x3b, 0x61, 0x75,
+0x67, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62,
+0x72, 0x69, 0x65, 0x3b, 0x6f, 0x63, 0x74, 0x6f, 0x6d, 0x62, 0x72, 0x69,
+0x65, 0x3b, 0x6e, 0x6f, 0x69, 0x65, 0x6d, 0x62, 0x72, 0x69, 0x65, 0x3b,
+0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x72, 0x69, 0x65, 0x69, 0x61, 0x6e,
+0x2e, 0x3b, 0x66, 0x65, 0x62, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x2e, 0x3b,
+0x61, 0x70, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x69, 0x75, 0x6e,
+0x2e, 0x3b, 0x69, 0x75, 0x6c, 0x2e, 0x3b, 0x61, 0x75, 0x67, 0x2e, 0x3b,
+0x73, 0x65, 0x70, 0x74, 0x2e, 0x3b, 0x6f, 0x63, 0x74, 0x2e, 0x3b, 0x6e,
+0x6f, 0x76, 0x2e, 0x3b, 0x64, 0x65, 0x63, 0x2e, 0x49, 0x3b, 0x46, 0x3b,
+0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x49, 0x3b, 0x49, 0x3b, 0x41, 0x3b,
+0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x73, 0x63, 0x68, 0x61, 0x6e,
+0x65, 0x72, 0x3b, 0x66, 0x61, 0x76, 0x72, 0x65, 0x72, 0x3b, 0x6d, 0x61,
+0x72, 0x73, 0x3b, 0x61, 0x76, 0x72, 0x69, 0x67, 0x6c, 0x3b, 0x6d, 0x61,
+0x74, 0x67, 0x3b, 0x7a, 0x65, 0x72, 0x63, 0x6c, 0x61, 0x64, 0x75, 0x72,
+0x3b, 0x66, 0x61, 0x6e, 0x61, 0x64, 0x75, 0x72, 0x3b, 0x61, 0x76, 0x75,
+0x73, 0x74, 0x3b, 0x73, 0x65, 0x74, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72,
+0x3b, 0x6f, 0x63, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x6e, 0x6f, 0x76,
+0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62,
+0x65, 0x72, 0x64, 0x61, 0x20, 0x73, 0x63, 0x68, 0x61, 0x6e, 0x65, 0x72,
+0x3b, 0x64, 0x61, 0x20, 0x66, 0x61, 0x76, 0x72, 0x65, 0x72, 0x3b, 0x64,
+0x61, 0x20, 0x6d, 0x61, 0x72, 0x73, 0x3b, 0x64, 0x2019, 0x61, 0x76, 0x72,
+0x69, 0x67, 0x6c, 0x3b, 0x64, 0x61, 0x20, 0x6d, 0x61, 0x74, 0x67, 0x3b,
+0x64, 0x61, 0x20, 0x7a, 0x65, 0x72, 0x63, 0x6c, 0x61, 0x64, 0x75, 0x72,
+0x3b, 0x64, 0x61, 0x20, 0x66, 0x61, 0x6e, 0x61, 0x64, 0x75, 0x72, 0x3b,
+0x64, 0x2019, 0x61, 0x76, 0x75, 0x73, 0x74, 0x3b, 0x64, 0x61, 0x20, 0x73,
+0x65, 0x74, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x2019, 0x6f,
+0x63, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x61, 0x20, 0x6e, 0x6f,
+0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x61, 0x20, 0x64, 0x65,
+0x63, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x63, 0x68, 0x61, 0x6e, 0x2e,
+0x3b, 0x66, 0x61, 0x76, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x3b,
+0x61, 0x76, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x74, 0x67, 0x3b, 0x7a, 0x65,
+0x72, 0x63, 0x6c, 0x2e, 0x3b, 0x66, 0x61, 0x6e, 0x2e, 0x3b, 0x61, 0x76,
+0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x74, 0x74, 0x2e, 0x3b, 0x6f, 0x63,
+0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0x65, 0x63, 0x2e,
+0x53, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x5a, 0x3b,
+0x46, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x4d,
+0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x77, 0x61, 0x6e,
+0x7a, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20,
+0x6b, 0x61, 0x69, 0x6c, 0x69, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20,
+0x77, 0x61, 0x20, 0x6b, 0x61, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x4d, 0x77,
+0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x61, 0x6e, 0x61,
+0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x74, 0x61,
+0x6e, 0x75, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20,
+0x73, 0x69, 0x74, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77,
+0x61, 0x20, 0x73, 0x61, 0x62, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69,
+0x20, 0x77, 0x61, 0x20, 0x6e, 0x61, 0x6e, 0x65, 0x3b, 0x4d, 0x77, 0x65,
+0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x74, 0x69, 0x73, 0x61, 0x3b, 0x4d,
+0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x69, 0x6b, 0x75, 0x6d,
+0x69, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x69,
+0x6b, 0x75, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x6d, 0x6f, 0x6a, 0x61,
+0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x69, 0x6b,
+0x75, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x6d, 0x62, 0x69, 0x6c, 0x69,
+0x4d, 0x31, 0x3b, 0x4d, 0x32, 0x3b, 0x4d, 0x33, 0x3b, 0x4d, 0x34, 0x3b,
+0x4d, 0x35, 0x3b, 0x4d, 0x36, 0x3b, 0x4d, 0x37, 0x3b, 0x4d, 0x38, 0x3b,
+0x4d, 0x39, 0x3b, 0x4d, 0x31, 0x30, 0x3b, 0x4d, 0x31, 0x31, 0x3b, 0x4d,
+0x31, 0x32, 0x4b, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x54, 0x3b,
+0x53, 0x3b, 0x53, 0x3b, 0x4e, 0x3b, 0x54, 0x3b, 0x49, 0x3b, 0x49, 0x3b,
+0x49, 0x4e, 0x7a, 0x65, 0x72, 0x6f, 0x3b, 0x52, 0x75, 0x68, 0x75, 0x68,
+0x75, 0x6d, 0x61, 0x3b, 0x4e, 0x74, 0x77, 0x61, 0x72, 0x61, 0x6e, 0x74,
+0x65, 0x3b, 0x4e, 0x64, 0x61, 0x6d, 0x75, 0x6b, 0x69, 0x7a, 0x61, 0x3b,
+0x52, 0x75, 0x73, 0x61, 0x6d, 0x61, 0x3b, 0x52, 0x75, 0x68, 0x65, 0x73,
+0x68, 0x69, 0x3b, 0x4d, 0x75, 0x6b, 0x61, 0x6b, 0x61, 0x72, 0x6f, 0x3b,
+0x4e, 0x79, 0x61, 0x6e, 0x64, 0x61, 0x67, 0x61, 0x72, 0x6f, 0x3b, 0x4e,
+0x79, 0x61, 0x6b, 0x61, 0x6e, 0x67, 0x61, 0x3b, 0x47, 0x69, 0x74, 0x75,
+0x67, 0x75, 0x74, 0x75, 0x3b, 0x4d, 0x75, 0x6e, 0x79, 0x6f, 0x6e, 0x79,
+0x6f, 0x3b, 0x4b, 0x69, 0x67, 0x61, 0x72, 0x61, 0x6d, 0x61, 0x4d, 0x75,
+0x74, 0x2e, 0x3b, 0x47, 0x61, 0x73, 0x2e, 0x3b, 0x57, 0x65, 0x72, 0x2e,
+0x3b, 0x4d, 0x61, 0x74, 0x2e, 0x3b, 0x47, 0x69, 0x63, 0x2e, 0x3b, 0x4b,
+0x61, 0x6d, 0x2e, 0x3b, 0x4e, 0x79, 0x61, 0x2e, 0x3b, 0x4b, 0x61, 0x6e,
+0x2e, 0x3b, 0x4e, 0x7a, 0x65, 0x2e, 0x3b, 0x55, 0x6b, 0x77, 0x2e, 0x3b,
+0x55, 0x67, 0x75, 0x2e, 0x3b, 0x55, 0x6b, 0x75, 0x2e, 0x44f, 0x43d, 0x432,
+0x430, 0x440, 0x44f, 0x3b, 0x444, 0x435, 0x432, 0x440, 0x430, 0x43b, 0x44f, 0x3b,
+0x43c, 0x430, 0x440, 0x442, 0x430, 0x3b, 0x430, 0x43f, 0x440, 0x435, 0x43b, 0x44f,
+0x3b, 0x43c, 0x430, 0x44f, 0x3b, 0x438, 0x44e, 0x43d, 0x44f, 0x3b, 0x438, 0x44e,
+0x43b, 0x44f, 0x3b, 0x430, 0x432, 0x433, 0x443, 0x441, 0x442, 0x430, 0x3b, 0x441,
+0x435, 0x43d, 0x442, 0x44f, 0x431, 0x440, 0x44f, 0x3b, 0x43e, 0x43a, 0x442, 0x44f,
+0x431, 0x440, 0x44f, 0x3b, 0x43d, 0x43e, 0x44f, 0x431, 0x440, 0x44f, 0x3b, 0x434,
+0x435, 0x43a, 0x430, 0x431, 0x440, 0x44f, 0x44f, 0x43d, 0x432, 0x2e, 0x3b, 0x444,
+0x435, 0x432, 0x440, 0x2e, 0x3b, 0x43c, 0x430, 0x440, 0x442, 0x3b, 0x430, 0x43f,
+0x440, 0x2e, 0x3b, 0x43c, 0x430, 0x439, 0x3b, 0x438, 0x44e, 0x43d, 0x44c, 0x3b,
+0x438, 0x44e, 0x43b, 0x44c, 0x3b, 0x430, 0x432, 0x433, 0x2e, 0x3b, 0x441, 0x435,
+0x43d, 0x442, 0x2e, 0x3b, 0x43e, 0x43a, 0x442, 0x2e, 0x3b, 0x43d, 0x43e, 0x44f,
+0x431, 0x2e, 0x3b, 0x434, 0x435, 0x43a, 0x2e, 0x44f, 0x43d, 0x432, 0x2e, 0x3b,
+0x444, 0x435, 0x432, 0x440, 0x2e, 0x3b, 0x43c, 0x430, 0x440, 0x2e, 0x3b, 0x430,
+0x43f, 0x440, 0x2e, 0x3b, 0x43c, 0x430, 0x44f, 0x3b, 0x438, 0x44e, 0x43d, 0x2e,
+0x3b, 0x438, 0x44e, 0x43b, 0x2e, 0x3b, 0x430, 0x432, 0x433, 0x2e, 0x3b, 0x441,
+0x435, 0x43d, 0x442, 0x2e, 0x3b, 0x43e, 0x43a, 0x442, 0x2e, 0x3b, 0x43d, 0x43e,
+0x44f, 0x431, 0x2e, 0x3b, 0x434, 0x435, 0x43a, 0x2e, 0x442, 0x43e, 0x445, 0x441,
+0x443, 0x43d, 0x43d, 0x44c, 0x443, 0x3b, 0x43e, 0x43b, 0x443, 0x43d, 0x43d, 0x44c,
+0x443, 0x3b, 0x43a, 0x443, 0x43b, 0x443, 0x43d, 0x20, 0x442, 0x443, 0x442, 0x430,
+0x440, 0x3b, 0x43c, 0x443, 0x443, 0x441, 0x20, 0x443, 0x441, 0x442, 0x430, 0x440,
+0x3b, 0x44b, 0x430, 0x43c, 0x20, 0x44b, 0x439, 0x430, 0x3b, 0x431, 0x44d, 0x441,
+0x20, 0x44b, 0x439, 0x430, 0x3b, 0x43e, 0x442, 0x20, 0x44b, 0x439, 0x430, 0x3b,
+0x430, 0x442, 0x44b, 0x440, 0x434, 0x44c, 0x44b, 0x445, 0x20, 0x44b, 0x439, 0x430,
+0x3b, 0x431, 0x430, 0x43b, 0x430, 0x495, 0x430, 0x43d, 0x20, 0x44b, 0x439, 0x430,
+0x3b, 0x430, 0x43b, 0x442, 0x44b, 0x43d, 0x43d, 0x44c, 0x44b, 0x3b, 0x441, 0x44d,
+0x442, 0x438, 0x43d, 0x43d, 0x44c, 0x438, 0x3b, 0x430, 0x445, 0x441, 0x44b, 0x43d,
+0x43d, 0x44c, 0x44b, 0x422, 0x43e, 0x445, 0x441, 0x443, 0x43d, 0x43d, 0x44c, 0x443,
+0x3b, 0x41e, 0x43b, 0x443, 0x43d, 0x43d, 0x44c, 0x443, 0x3b, 0x41a, 0x443, 0x43b,
+0x443, 0x43d, 0x20, 0x442, 0x443, 0x442, 0x430, 0x440, 0x3b, 0x41c, 0x443, 0x443,
+0x441, 0x20, 0x443, 0x441, 0x442, 0x430, 0x440, 0x3b, 0x42b, 0x430, 0x43c, 0x20,
+0x44b, 0x439, 0x44b, 0x43d, 0x3b, 0x411, 0x44d, 0x441, 0x20, 0x44b, 0x439, 0x44b,
+0x43d, 0x3b, 0x41e, 0x442, 0x20, 0x44b, 0x439, 0x44b, 0x43d, 0x3b, 0x410, 0x442,
+0x44b, 0x440, 0x434, 0x44c, 0x44b, 0x445, 0x20, 0x44b, 0x439, 0x44b, 0x43d, 0x3b,
+0x411, 0x430, 0x43b, 0x430, 0x495, 0x430, 0x43d, 0x20, 0x44b, 0x439, 0x44b, 0x43d,
+0x3b, 0x410, 0x43b, 0x442, 0x44b, 0x43d, 0x43d, 0x44c, 0x44b, 0x3b, 0x421, 0x44d,
+0x442, 0x438, 0x43d, 0x43d, 0x44c, 0x438, 0x3b, 0x430, 0x445, 0x441, 0x44b, 0x43d,
+0x43d, 0x44c, 0x44b, 0x422, 0x43e, 0x445, 0x441, 0x3b, 0x41e, 0x43b, 0x443, 0x43d,
+0x3b, 0x41a, 0x43b, 0x43d, 0x3b, 0x41c, 0x441, 0x443, 0x3b, 0x42b, 0x430, 0x43c,
+0x3b, 0x411, 0x44d, 0x441, 0x3b, 0x41e, 0x442, 0x439, 0x3b, 0x410, 0x442, 0x440,
+0x3b, 0x411, 0x43b, 0x495, 0x3b, 0x410, 0x43b, 0x442, 0x3b, 0x421, 0x44d, 0x442,
+0x3b, 0x410, 0x445, 0x441, 0x422, 0x3b, 0x41e, 0x3b, 0x41a, 0x3b, 0x41c, 0x3b,
+0x42b, 0x3b, 0x411, 0x3b, 0x41e, 0x3b, 0x410, 0x3b, 0x411, 0x3b, 0x410, 0x3b,
+0x421, 0x3b, 0x410, 0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c, 0x65, 0x20, 0x6f,
+0x62, 0x6f, 0x3b, 0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c, 0x65, 0x20, 0x77,
+0x61, 0x61, 0x72, 0x65, 0x3b, 0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c, 0x65,
+0x20, 0x6f, 0x6b, 0x75, 0x6e, 0x69, 0x3b, 0x4c, 0x61, 0x70, 0x61, 0x20,
+0x6c, 0x65, 0x20, 0x6f, 0x6e, 0x67, 0x2019, 0x77, 0x61, 0x6e, 0x3b, 0x4c,
+0x61, 0x70, 0x61, 0x20, 0x6c, 0x65, 0x20, 0x69, 0x6d, 0x65, 0x74, 0x3b,
+0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c, 0x65, 0x20, 0x69, 0x6c, 0x65, 0x3b,
+0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c, 0x65, 0x20, 0x73, 0x61, 0x70, 0x61,
+0x3b, 0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c, 0x65, 0x20, 0x69, 0x73, 0x69,
+0x65, 0x74, 0x3b, 0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c, 0x65, 0x20, 0x73,
+0x61, 0x61, 0x6c, 0x3b, 0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c, 0x65, 0x20,
+0x74, 0x6f, 0x6d, 0x6f, 0x6e, 0x3b, 0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c,
+0x65, 0x20, 0x74, 0x6f, 0x6d, 0x6f, 0x6e, 0x20, 0x6f, 0x62, 0x6f, 0x3b,
+0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x6d, 0x6f,
+0x6e, 0x20, 0x77, 0x61, 0x61, 0x72, 0x65, 0x4f, 0x62, 0x6f, 0x3b, 0x57,
+0x61, 0x61, 0x3b, 0x4f, 0x6b, 0x75, 0x3b, 0x4f, 0x6e, 0x67, 0x3b, 0x49,
+0x6d, 0x65, 0x3b, 0x49, 0x6c, 0x65, 0x3b, 0x53, 0x61, 0x70, 0x3b, 0x49,
+0x73, 0x69, 0x3b, 0x53, 0x61, 0x61, 0x3b, 0x54, 0x6f, 0x6d, 0x3b, 0x54,
+0x6f, 0x62, 0x3b, 0x54, 0x6f, 0x77, 0x4f, 0x3b, 0x57, 0x3b, 0x4f, 0x3b,
+0x4f, 0x3b, 0x49, 0x3b, 0x49, 0x3b, 0x53, 0x3b, 0x49, 0x3b, 0x53, 0x3b,
+0x54, 0x3b, 0x54, 0x3b, 0x54, 0x4e, 0x79, 0x65, 0x6e, 0x79, 0x65, 0x3b,
+0x46, 0x75, 0x6c, 0x75, 0x6e, 0x64, 0xef, 0x67, 0x69, 0x3b, 0x4d, 0x62,
+0xe4, 0x6e, 0x67, 0xfc, 0x3b, 0x4e, 0x67, 0x75, 0x62, 0xf9, 0x65, 0x3b,
+0x42, 0xea, 0x6c, 0xe4, 0x77, 0xfc, 0x3b, 0x46, 0xf6, 0x6e, 0x64, 0x6f,
+0x3b, 0x4c, 0x65, 0x6e, 0x67, 0x75, 0x61, 0x3b, 0x4b, 0xfc, 0x6b, 0xfc,
+0x72, 0xfc, 0x3b, 0x4d, 0x76, 0x75, 0x6b, 0x61, 0x3b, 0x4e, 0x67, 0x62,
+0x65, 0x72, 0x65, 0x72, 0x65, 0x3b, 0x4e, 0x61, 0x62, 0xe4, 0x6e, 0x64,
+0xfc, 0x72, 0x75, 0x3b, 0x4b, 0x61, 0x6b, 0x61, 0x75, 0x6b, 0x61, 0x4e,
+0x79, 0x65, 0x3b, 0x46, 0x75, 0x6c, 0x3b, 0x4d, 0x62, 0xe4, 0x3b, 0x4e,
+0x67, 0x75, 0x3b, 0x42, 0xea, 0x6c, 0x3b, 0x46, 0xf6, 0x6e, 0x3b, 0x4c,
+0x65, 0x6e, 0x3b, 0x4b, 0xfc, 0x6b, 0x3b, 0x4d, 0x76, 0x75, 0x3b, 0x4e,
+0x67, 0x62, 0x3b, 0x4e, 0x61, 0x62, 0x3b, 0x4b, 0x61, 0x6b, 0x4e, 0x3b,
+0x46, 0x3b, 0x4d, 0x3b, 0x4e, 0x3b, 0x42, 0x3b, 0x46, 0x3b, 0x4c, 0x3b,
+0x4b, 0x3b, 0x4d, 0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x4b, 0x4d, 0x75, 0x70,
+0x61, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x6c, 0x77, 0x61, 0x3b, 0x4d, 0x77,
+0x69, 0x74, 0x6f, 0x70, 0x65, 0x3b, 0x4d, 0x75, 0x73, 0x68, 0x65, 0x6e,
+0x64, 0x65, 0x3b, 0x4d, 0x75, 0x6e, 0x79, 0x69, 0x3b, 0x4d, 0x75, 0x73,
+0x68, 0x65, 0x6e, 0x64, 0x65, 0x20, 0x4d, 0x61, 0x67, 0x61, 0x6c, 0x69,
+0x3b, 0x4d, 0x75, 0x6a, 0x69, 0x6d, 0x62, 0x69, 0x3b, 0x4d, 0x75, 0x73,
+0x68, 0x69, 0x70, 0x65, 0x70, 0x6f, 0x3b, 0x4d, 0x75, 0x70, 0x75, 0x67,
+0x75, 0x74, 0x6f, 0x3b, 0x4d, 0x75, 0x6e, 0x79, 0x65, 0x6e, 0x73, 0x65,
+0x3b, 0x4d, 0x6f, 0x6b, 0x68, 0x75, 0x3b, 0x4d, 0x75, 0x73, 0x6f, 0x6e,
+0x67, 0x61, 0x6e, 0x64, 0x65, 0x6d, 0x62, 0x77, 0x65, 0x3b, 0x4d, 0x75,
+0x68, 0x61, 0x61, 0x6e, 0x6f, 0x4d, 0x75, 0x70, 0x3b, 0x4d, 0x77, 0x69,
+0x3b, 0x4d, 0x73, 0x68, 0x3b, 0x4d, 0x75, 0x6e, 0x3b, 0x4d, 0x61, 0x67,
+0x3b, 0x4d, 0x75, 0x6a, 0x3b, 0x4d, 0x73, 0x70, 0x3b, 0x4d, 0x70, 0x67,
+0x3b, 0x4d, 0x79, 0x65, 0x3b, 0x4d, 0x6f, 0x6b, 0x3b, 0x4d, 0x75, 0x73,
+0x3b, 0x4d, 0x75, 0x68, 0x91c, 0x928, 0x935, 0x930, 0x940, 0x92e, 0x93e, 0x938,
+0x903, 0x3b, 0x92b, 0x930, 0x935, 0x930, 0x940, 0x92e, 0x93e, 0x938, 0x903, 0x3b,
+0x92e, 0x93e, 0x930, 0x94d, 0x91a, 0x92e, 0x93e, 0x938, 0x903, 0x3b, 0x905, 0x92a,
+0x94d, 0x930, 0x948, 0x932, 0x92e, 0x93e, 0x938, 0x903, 0x3b, 0x92e, 0x908, 0x92e,
+0x93e, 0x938, 0x903, 0x3b, 0x91c, 0x942, 0x928, 0x92e, 0x93e, 0x938, 0x903, 0x3b,
+0x91c, 0x941, 0x932, 0x93e, 0x908, 0x92e, 0x93e, 0x938, 0x903, 0x3b, 0x905, 0x917,
+0x938, 0x94d, 0x924, 0x92e, 0x93e, 0x938, 0x903, 0x3b, 0x938, 0x93f, 0x924, 0x902,
+0x92c, 0x930, 0x92e, 0x93e, 0x938, 0x903, 0x3b, 0x905, 0x915, 0x94d, 0x924, 0x942,
+0x92c, 0x930, 0x92e, 0x93e, 0x938, 0x903, 0x3b, 0x928, 0x935, 0x902, 0x92c, 0x930,
+0x92e, 0x93e, 0x938, 0x903, 0x3b, 0x926, 0x93f, 0x938, 0x902, 0x92c, 0x930, 0x92e,
+0x93e, 0x938, 0x903, 0x91c, 0x928, 0x935, 0x930, 0x940, 0x3a, 0x3b, 0x92b, 0x930,
+0x935, 0x930, 0x940, 0x3a, 0x3b, 0x92e, 0x93e, 0x930, 0x94d, 0x91a, 0x3a, 0x3b,
+0x905, 0x92a, 0x94d, 0x930, 0x948, 0x932, 0x3a, 0x3b, 0x92e, 0x908, 0x3b, 0x91c,
+0x942, 0x928, 0x3a, 0x3b, 0x91c, 0x941, 0x932, 0x93e, 0x908, 0x3a, 0x3b, 0x905,
+0x917, 0x938, 0x94d, 0x924, 0x3a, 0x3b, 0x938, 0x93f, 0x924, 0x902, 0x92c, 0x930,
+0x3a, 0x3b, 0x905, 0x915, 0x94d, 0x924, 0x942, 0x92c, 0x930, 0x3a, 0x3b, 0x928,
+0x935, 0x902, 0x92c, 0x930, 0x3a, 0x3b, 0x926, 0x93f, 0x938, 0x902, 0x92c, 0x930,
+0x3a, 0x1c61, 0x1c5f, 0x1c71, 0x1c63, 0x1c5f, 0x1c68, 0x1c64, 0x3b, 0x1c6f, 0x1c77, 0x1c5f,
+0x1c68, 0x1c63, 0x1c5f, 0x1c68, 0x1c64, 0x3b, 0x1c62, 0x1c5f, 0x1c68, 0x1c6a, 0x3b, 0x1c5f,
+0x1c6f, 0x1c68, 0x1c6e, 0x1c5e, 0x3b, 0x1c62, 0x1c6e, 0x3b, 0x1c61, 0x1c69, 0x1c71, 0x3b,
+0x1c61, 0x1c69, 0x1c5e, 0x1c5f, 0x1c6d, 0x3b, 0x1c5f, 0x1c5c, 0x1c5f, 0x1c65, 0x1c5b, 0x3b,
+0x1c65, 0x1c6e, 0x1c6f, 0x1c74, 0x1c6e, 0x1c62, 0x1c75, 0x1c5f, 0x1c68, 0x3b, 0x1c5a, 0x1c60,
+0x1c74, 0x1c5a, 0x1c75, 0x1c5f, 0x1c68, 0x3b, 0x1c71, 0x1c5f, 0x1c63, 0x1c5f, 0x1c62, 0x1c75,
+0x1c5f, 0x1c68, 0x3b, 0x1c6b, 0x1c64, 0x1c65, 0x1c5f, 0x1c62, 0x1c75, 0x1c5f, 0x1c68, 0x1c61,
+0x1c5f, 0x1c71, 0x3b, 0x1c6f, 0x1c77, 0x1c5f, 0x3b, 0x1c62, 0x1c5f, 0x1c68, 0x3b, 0x1c5f,
+0x1c6f, 0x1c68, 0x3b, 0x1c62, 0x1c6e, 0x3b, 0x1c61, 0x1c69, 0x1c71, 0x3b, 0x1c61, 0x1c69,
+0x1c5e, 0x3b, 0x1c5f, 0x1c5c, 0x1c5f, 0x3b, 0x1c65, 0x1c6e, 0x1c6f, 0x3b, 0x1c5a, 0x1c60,
+0x1c74, 0x3b, 0x1c71, 0x1c5f, 0x1c63, 0x3b, 0x1c6b, 0x1c64, 0x1c65, 0x1c61, 0x3b, 0x1c6f,
+0x3b, 0x1c62, 0x3b, 0x1c5f, 0x3b, 0x1c62, 0x3b, 0x1c61, 0x3b, 0x1c61, 0x3b, 0x1c5f,
+0x3b, 0x1c65, 0x3b, 0x1c5a, 0x3b, 0x1c71, 0x3b, 0x1c6b, 0x67, 0x68, 0x65, 0x6e,
+0x6e, 0xe0, 0x72, 0x67, 0x69, 0x75, 0x3b, 0x66, 0x72, 0x65, 0xe0, 0x72,
+0x67, 0x69, 0x75, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x7a, 0x75, 0x3b, 0x61,
+0x62, 0x72, 0x69, 0x6c, 0x65, 0x3b, 0x6d, 0x61, 0x6a, 0x75, 0x3b, 0x6c,
+0xe0, 0x6d, 0x70, 0x61, 0x64, 0x61, 0x73, 0x3b, 0x74, 0x72, 0xec, 0x75,
+0x6c, 0x61, 0x73, 0x3b, 0x61, 0x75, 0x73, 0x74, 0x75, 0x3b, 0x63, 0x61,
+0x62, 0x75, 0x64, 0x61, 0x6e, 0x6e, 0x69, 0x3b, 0x73, 0x61, 0x6e, 0x74,
+0x75, 0x67, 0x61, 0x69, 0x6e, 0x65, 0x3b, 0x73, 0x61, 0x6e, 0x74, 0x61,
+0x6e, 0x64, 0x72, 0x69, 0x61, 0x3b, 0x6e, 0x61, 0x64, 0x61, 0x6c, 0x65,
+0x67, 0x68, 0x65, 0x3b, 0x66, 0x72, 0x65, 0x3b, 0x6d, 0x61, 0x72, 0x3b,
+0x61, 0x62, 0x72, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x6c, 0xe0, 0x6d, 0x3b,
+0x74, 0x72, 0xec, 0x3b, 0x61, 0x75, 0x73, 0x3b, 0x63, 0x61, 0x62, 0x3b,
+0x73, 0x74, 0x47, 0x3b, 0x73, 0x74, 0x41, 0x3b, 0x6e, 0x61, 0x64, 0x47,
+0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x4c, 0x3b, 0x54,
+0x3b, 0x41, 0x3b, 0x43, 0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x4e, 0x4a, 0x61,
+0x6e, 0x65, 0x69, 0x72, 0x6f, 0x3b, 0x46, 0x65, 0x76, 0x72, 0x65, 0x69,
+0x72, 0x6f, 0x3b, 0x4d, 0x61, 0x72, 0x63, 0x6f, 0x3b, 0x41, 0x62, 0x72,
+0x69, 0x6c, 0x3b, 0x4d, 0x61, 0x69, 0x6f, 0x3b, 0x4a, 0x75, 0x6e, 0x68,
+0x6f, 0x3b, 0x4a, 0x75, 0x6c, 0x68, 0x6f, 0x3b, 0x41, 0x75, 0x67, 0x75,
+0x73, 0x74, 0x6f, 0x3b, 0x53, 0x65, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x6f,
+0x3b, 0x4f, 0x74, 0x75, 0x62, 0x72, 0x6f, 0x3b, 0x4e, 0x6f, 0x76, 0x65,
+0x6d, 0x62, 0x72, 0x6f, 0x3b, 0x44, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x72,
+0x6f, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x76, 0x3b, 0x4d, 0x61, 0x72,
+0x3b, 0x41, 0x62, 0x72, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x6e,
+0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x75, 0x67, 0x3b, 0x53, 0x65, 0x74,
+0x3b, 0x4f, 0x74, 0x75, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x63,
+0x458, 0x430, 0x43d, 0x443, 0x430, 0x440, 0x3b, 0x444, 0x435, 0x431, 0x440, 0x443,
+0x430, 0x440, 0x3b, 0x43c, 0x430, 0x440, 0x442, 0x3b, 0x430, 0x43f, 0x440, 0x438,
+0x43b, 0x3b, 0x43c, 0x430, 0x458, 0x3b, 0x458, 0x443, 0x43d, 0x3b, 0x458, 0x443,
+0x43b, 0x3b, 0x430, 0x432, 0x433, 0x443, 0x441, 0x442, 0x3b, 0x441, 0x435, 0x43f,
+0x442, 0x435, 0x43c, 0x431, 0x430, 0x440, 0x3b, 0x43e, 0x43a, 0x442, 0x43e, 0x431,
+0x430, 0x440, 0x3b, 0x43d, 0x43e, 0x432, 0x435, 0x43c, 0x431, 0x430, 0x440, 0x3b,
+0x434, 0x435, 0x446, 0x435, 0x43c, 0x431, 0x430, 0x440, 0x458, 0x430, 0x43d, 0x3b,
+0x444, 0x435, 0x431, 0x3b, 0x43c, 0x430, 0x440, 0x3b, 0x430, 0x43f, 0x440, 0x3b,
+0x43c, 0x430, 0x458, 0x3b, 0x458, 0x443, 0x43d, 0x3b, 0x458, 0x443, 0x43b, 0x3b,
+0x430, 0x432, 0x433, 0x3b, 0x441, 0x435, 0x43f, 0x3b, 0x43e, 0x43a, 0x442, 0x3b,
+0x43d, 0x43e, 0x432, 0x3b, 0x434, 0x435, 0x446, 0x458, 0x430, 0x43d, 0x3b, 0x444,
+0x435, 0x431, 0x3b, 0x43c, 0x430, 0x440, 0x442, 0x3b, 0x430, 0x43f, 0x440, 0x3b,
+0x43c, 0x430, 0x458, 0x3b, 0x458, 0x443, 0x43d, 0x3b, 0x458, 0x443, 0x43b, 0x3b,
+0x430, 0x432, 0x433, 0x3b, 0x441, 0x435, 0x43f, 0x442, 0x3b, 0x43e, 0x43a, 0x442,
+0x3b, 0x43d, 0x43e, 0x432, 0x3b, 0x434, 0x435, 0x446, 0x6a, 0x61, 0x6e, 0x75,
+0x61, 0x72, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b, 0x6d,
+0x61, 0x72, 0x74, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x61,
+0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x3b, 0x6a, 0x75, 0x6c, 0x3b, 0x61, 0x76,
+0x67, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62,
+0x61, 0x72, 0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x62, 0x61, 0x72, 0x3b, 0x6e,
+0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x3b, 0x64, 0x65, 0x63, 0x65,
+0x6d, 0x62, 0x61, 0x72, 0x6a, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x62, 0x3b,
+0x6d, 0x61, 0x72, 0x3b, 0x61, 0x70, 0x72, 0x3b, 0x6d, 0x61, 0x6a, 0x3b,
+0x6a, 0x75, 0x6e, 0x3b, 0x6a, 0x75, 0x6c, 0x3b, 0x61, 0x76, 0x67, 0x3b,
+0x73, 0x65, 0x70, 0x3b, 0x6f, 0x6b, 0x74, 0x3b, 0x6e, 0x6f, 0x76, 0x3b,
+0x64, 0x65, 0x63, 0x6a, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x62, 0x3b, 0x6d,
+0x61, 0x72, 0x74, 0x3b, 0x61, 0x70, 0x72, 0x3b, 0x6d, 0x61, 0x6a, 0x3b,
+0x6a, 0x75, 0x6e, 0x3b, 0x6a, 0x75, 0x6c, 0x3b, 0x61, 0x76, 0x67, 0x3b,
+0x73, 0x65, 0x70, 0x74, 0x3b, 0x6f, 0x6b, 0x74, 0x3b, 0x6e, 0x6f, 0x76,
+0x3b, 0x64, 0x65, 0x63, 0x4a, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x69, 0x3b,
+0x46, 0x65, 0x62, 0x6c, 0x75, 0x61, 0x6c, 0x69, 0x3b, 0x4d, 0x61, 0x63,
+0x68, 0x69, 0x3b, 0x41, 0x70, 0x6c, 0x69, 0x6c, 0x69, 0x3b, 0x4d, 0x65,
+0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x61, 0x69,
+0x3b, 0x41, 0x67, 0x6f, 0x73, 0x74, 0x69, 0x3b, 0x53, 0x65, 0x70, 0x74,
+0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x61, 0x3b,
+0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x44, 0x65, 0x73, 0x65,
+0x6d, 0x62, 0x61, 0x4e, 0x64, 0x69, 0x72, 0x61, 0x3b, 0x4b, 0x75, 0x6b,
+0x61, 0x64, 0x7a, 0x69, 0x3b, 0x4b, 0x75, 0x72, 0x75, 0x6d, 0x65, 0x3b,
+0x4b, 0x75, 0x62, 0x76, 0x75, 0x6d, 0x62, 0x69, 0x3b, 0x43, 0x68, 0x69,
+0x76, 0x61, 0x62, 0x76, 0x75, 0x3b, 0x43, 0x68, 0x69, 0x6b, 0x75, 0x6d,
+0x69, 0x3b, 0x43, 0x68, 0x69, 0x6b, 0x75, 0x6e, 0x67, 0x75, 0x72, 0x75,
+0x3b, 0x4e, 0x79, 0x61, 0x6d, 0x61, 0x76, 0x68, 0x75, 0x76, 0x68, 0x75,
+0x3b, 0x47, 0x75, 0x6e, 0x79, 0x61, 0x6e, 0x61, 0x3b, 0x47, 0x75, 0x6d,
+0x69, 0x67, 0x75, 0x72, 0x75, 0x3b, 0x4d, 0x62, 0x75, 0x64, 0x7a, 0x69,
+0x3b, 0x5a, 0x76, 0x69, 0x74, 0x61, 0x4e, 0x64, 0x69, 0x3b, 0x4b, 0x75,
+0x6b, 0x3b, 0x4b, 0x75, 0x72, 0x3b, 0x4b, 0x75, 0x62, 0x3b, 0x43, 0x68,
+0x76, 0x3b, 0x43, 0x68, 0x6b, 0x3b, 0x43, 0x68, 0x67, 0x3b, 0x4e, 0x79,
+0x61, 0x3b, 0x47, 0x75, 0x6e, 0x3b, 0x47, 0x75, 0x6d, 0x3b, 0x4d, 0x62,
+0x75, 0x3b, 0x5a, 0x76, 0x69, 0x4e, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4b,
+0x3b, 0x43, 0x3b, 0x43, 0x3b, 0x43, 0x3b, 0x4e, 0x3b, 0x47, 0x3b, 0x47,
+0x3b, 0x4d, 0x3b, 0x5a, 0xa2cd, 0xa1aa, 0x3b, 0xa44d, 0xa1aa, 0x3b, 0xa315, 0xa1aa,
+0x3b, 0xa1d6, 0xa1aa, 0x3b, 0xa26c, 0xa1aa, 0x3b, 0xa0d8, 0xa1aa, 0x3b, 0xa3c3, 0xa1aa,
+0x3b, 0xa246, 0xa1aa, 0x3b, 0xa22c, 0xa1aa, 0x3b, 0xa2b0, 0xa1aa, 0x3b, 0xa2b0, 0xa2aa,
+0xa1aa, 0x3b, 0xa2b0, 0xa44b, 0xa1aa, 0x6a, 0x69, 0x6e, 0x6e, 0x61, 0x72, 0x75,
+0x3b, 0x66, 0x72, 0x69, 0x76, 0x61, 0x72, 0x75, 0x3b, 0x6d, 0x61, 0x72,
+0x7a, 0x75, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x6c, 0x69, 0x3b, 0x6d, 0x61,
+0x6a, 0x75, 0x3b, 0x67, 0x69, 0x75, 0x67, 0x6e, 0x75, 0x3b, 0x67, 0x69,
+0x75, 0x67, 0x6e, 0x65, 0x74, 0x74, 0x75, 0x3b, 0x61, 0x67, 0x75, 0x73,
+0x74, 0x75, 0x3b, 0x73, 0x69, 0x74, 0x74, 0xe8, 0x6d, 0x6d, 0x69, 0x72,
+0x75, 0x3b, 0x75, 0x74, 0x74, 0xf2, 0x76, 0x69, 0x72, 0x75, 0x3b, 0x6e,
+0x75, 0x76, 0xe8, 0x6d, 0x6d, 0x69, 0x72, 0x75, 0x3b, 0x64, 0x69, 0x63,
+0xe8, 0x6d, 0x6d, 0x69, 0x72, 0x75, 0x6a, 0x69, 0x6e, 0x3b, 0x66, 0x72,
+0x69, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x61, 0x70, 0x72, 0x3b, 0x6d, 0x61,
+0x6a, 0x3b, 0x67, 0x69, 0x75, 0x3b, 0x67, 0x6e, 0x74, 0x3b, 0x61, 0x67,
+0x75, 0x3b, 0x73, 0x69, 0x74, 0x3b, 0x75, 0x74, 0x74, 0x3b, 0x6e, 0x75,
+0x76, 0x3b, 0x64, 0x69, 0x63, 0x4a, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41,
+0x3b, 0x4d, 0x3b, 0x47, 0x3b, 0x47, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x55,
+0x3b, 0x4e, 0x3b, 0x44, 0x73, 0x74, 0x79, 0x63, 0x7a, 0x79, 0x144, 0x3b,
+0x6c, 0x75, 0x74, 0x79, 0x3b, 0x6d, 0x61, 0x72, 0x7a, 0x65, 0x63, 0x3b,
+0x6b, 0x77, 0x69, 0x65, 0x63, 0x69, 0x79, 0x144, 0x3b, 0x6d, 0x6f, 0x6a,
+0x3b, 0x63, 0x7a, 0x79, 0x72, 0x77, 0x69, 0x65, 0x63, 0x3b, 0x6c, 0x69,
+0x70, 0x69, 0x65, 0x63, 0x3b, 0x73, 0x69, 0x79, 0x72, 0x70, 0x69, 0x79,
+0x144, 0x3b, 0x77, 0x72, 0x7a, 0x65, 0x73, 0x69, 0x79, 0x144, 0x3b, 0x70,
+0x61, 0x17a, 0x64, 0x7a, 0x69, 0x65, 0x72, 0x6e, 0x69, 0x6b, 0x3b, 0x6c,
+0x69, 0x73, 0x74, 0x6f, 0x70, 0x61, 0x64, 0x3b, 0x67, 0x72, 0x75, 0x64,
+0x7a, 0x69, 0x79, 0x144, 0x73, 0x74, 0x79, 0x63, 0x7a, 0x6e, 0x69, 0x61,
+0x3b, 0x6c, 0x75, 0x74, 0x65, 0x67, 0x6f, 0x3b, 0x6d, 0x61, 0x72, 0x63,
+0x61, 0x3b, 0x6b, 0x77, 0x69, 0x65, 0x74, 0x6e, 0x69, 0x61, 0x3b, 0x6d,
+0x6f, 0x6a, 0x61, 0x3b, 0x63, 0x7a, 0x79, 0x72, 0x77, 0x63, 0x61, 0x3b,
+0x6c, 0x69, 0x70, 0x63, 0x61, 0x3b, 0x73, 0x69, 0x79, 0x72, 0x70, 0x6e,
+0x69, 0x61, 0x3b, 0x77, 0x72, 0x7a, 0x65, 0x15b, 0x6e, 0x69, 0x61, 0x3b,
+0x70, 0x61, 0x17a, 0x64, 0x7a, 0x69, 0x65, 0x72, 0x6e, 0x69, 0x6b, 0x61,
+0x3b, 0x6c, 0x69, 0x73, 0x74, 0x6f, 0x70, 0x61, 0x64, 0x61, 0x3b, 0x67,
+0x72, 0x75, 0x64, 0x6e, 0x69, 0x61, 0x73, 0x74, 0x79, 0x3b, 0x6c, 0x75,
+0x74, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x6b, 0x77, 0x69, 0x3b, 0x6d, 0x6f,
+0x6a, 0x3b, 0x63, 0x7a, 0x79, 0x3b, 0x6c, 0x69, 0x70, 0x3b, 0x73, 0x69,
+0x79, 0x3b, 0x77, 0x72, 0x7a, 0x3b, 0x70, 0x61, 0x17a, 0x3b, 0x6c, 0x69,
+0x73, 0x3b, 0x67, 0x72, 0x75, 0x62c, 0x646, 0x648, 0x631, 0x64a, 0x3b, 0x641,
+0x64a, 0x628, 0x631, 0x648, 0x631, 0x64a, 0x3b, 0x645, 0x627, 0x631, 0x686, 0x3b,
+0x627, 0x67e, 0x631, 0x64a, 0x644, 0x3b, 0x645, 0x626, 0x64a, 0x3b, 0x62c, 0x648,
+0x646, 0x3b, 0x62c, 0x648, 0x644, 0x627, 0x621, 0x650, 0x3b, 0x622, 0x6af, 0x633,
+0x67d, 0x3b, 0x633, 0x64a, 0x67e, 0x67d, 0x645, 0x628, 0x631, 0x3b, 0x622, 0x6aa,
+0x67d, 0x648, 0x628, 0x631, 0x3b, 0x646, 0x648, 0x645, 0x628, 0x631, 0x3b, 0x68a,
+0x633, 0x645, 0x628, 0x631, 0x91c, 0x928, 0x935, 0x930, 0x940, 0x3b, 0x92b, 0x930,
+0x935, 0x930, 0x940, 0x3b, 0x92e, 0x93e, 0x930, 0x94d, 0x91a, 0x941, 0x3b, 0x905,
+0x92a, 0x94d, 0x930, 0x948, 0x932, 0x3b, 0x92e, 0x908, 0x3b, 0x91c, 0x942, 0x928,
+0x3b, 0x91c, 0x941, 0x932, 0x93e, 0x908, 0x3b, 0x905, 0x917, 0x938, 0x94d, 0x91f,
+0x3b, 0x938, 0x92a, 0x94d, 0x91f, 0x947, 0x902, 0x92c, 0x930, 0x3b, 0x911, 0x915,
+0x94d, 0x91f, 0x94b, 0x92c, 0x930, 0x3b, 0x928, 0x935, 0x902, 0x92c, 0x930, 0x3b,
+0x921, 0x93f, 0x938, 0x902, 0x92c, 0x930, 0x91c, 0x928, 0x935, 0x930, 0x940, 0x3b,
+0x92b, 0x930, 0x935, 0x930, 0x940, 0x3b, 0x92e, 0x93e, 0x930, 0x94d, 0x91a, 0x941,
+0x3b, 0x905, 0x92a, 0x94d, 0x930, 0x948, 0x932, 0x3b, 0x92e, 0x908, 0x3b, 0x91c,
+0x942, 0x928, 0x3b, 0x91c, 0x941, 0x932, 0x93e, 0x908, 0x3b, 0x905, 0x917, 0x938,
+0x94d, 0x91f, 0x3b, 0x938, 0x92a, 0x94d, 0x91f, 0x947, 0x902, 0x92c, 0x930, 0x3b,
+0x913, 0x915, 0x94d, 0x91f, 0x94b, 0x92c, 0x930, 0x3b, 0x928, 0x935, 0x902, 0x92c,
+0x930, 0x3b, 0x921, 0x93f, 0x938, 0x902, 0x92c, 0x930, 0x91c, 0x928, 0x3b, 0x92b,
+0x930, 0x3b, 0x92e, 0x93e, 0x930, 0x94d, 0x91a, 0x3b, 0x905, 0x92a, 0x94d, 0x930,
+0x948, 0x3b, 0x92e, 0x908, 0x3b, 0x91c, 0x942, 0x928, 0x3b, 0x91c, 0x941, 0x932,
+0x93e, 0x3b, 0x905, 0x917, 0x3b, 0x938, 0x92a, 0x94d, 0x91f, 0x947, 0x3b, 0x911,
+0x915, 0x94d, 0x91f, 0x94b, 0x3b, 0x928, 0x935, 0x902, 0x3b, 0x921, 0x93f, 0x938,
+0x902, 0x91c, 0x928, 0x3b, 0x92b, 0x930, 0x3b, 0x92e, 0x93e, 0x930, 0x94d, 0x91a,
+0x3b, 0x905, 0x92a, 0x94d, 0x930, 0x948, 0x3b, 0x92e, 0x908, 0x3b, 0x91c, 0x942,
+0x928, 0x3b, 0x91c, 0x941, 0x3b, 0x905, 0x917, 0x3b, 0x938, 0x92a, 0x94d, 0x91f,
+0x947, 0x3b, 0x911, 0x915, 0x94d, 0x91f, 0x94b, 0x3b, 0x928, 0x935, 0x902, 0x3b,
+0x921, 0x93f, 0x938, 0x902, 0x91c, 0x3b, 0x92b, 0x93c, 0x3b, 0x92e, 0x3b, 0x905,
+0x3b, 0x92e, 0x93e, 0x3b, 0x91c, 0x942, 0x3b, 0x91c, 0x941, 0x3b, 0x905, 0x917,
+0x3b, 0x938, 0x3b, 0x911, 0x3b, 0x928, 0x3b, 0x921, 0x93f, 0x91c, 0x3b, 0x92b,
+0x93c, 0x3b, 0x92e, 0x93e, 0x3b, 0x905, 0x3b, 0x92e, 0x93e, 0x3b, 0x91c, 0x942,
+0x3b, 0x91c, 0x941, 0x3b, 0x905, 0x917, 0x3b, 0x938, 0x3b, 0x911, 0x3b, 0x928,
+0x3b, 0x921, 0x93f, 0xda2, 0xdb1, 0xdc0, 0xdcf, 0xdbb, 0xdd2, 0x3b, 0xdb4, 0xdd9,
+0xdb6, 0xdbb, 0xdc0, 0xdcf, 0xdbb, 0xdd2, 0x3b, 0xdb8, 0xdcf, 0xdbb, 0xdca, 0xdad,
+0xdd4, 0x3b, 0xd85, 0xdb4, 0xdca, 0x200d, 0xdbb, 0xdda, 0xdbd, 0xdca, 0x3b, 0xdb8,
+0xdd0, 0xdba, 0xdd2, 0x3b, 0xda2, 0xdd6, 0xdb1, 0xdd2, 0x3b, 0xda2, 0xdd6, 0xdbd,
+0xdd2, 0x3b, 0xd85, 0xd9c, 0xddd, 0xdc3, 0xdca, 0xdad, 0xdd4, 0x3b, 0xdc3, 0xdd0,
+0xdb4, 0xdca, 0xdad, 0xdd0, 0xdb8, 0xdca, 0xdb6, 0xdbb, 0xdca, 0x3b, 0xd94, 0xd9a,
+0xdca, 0xdad, 0xddd, 0xdb6, 0xdbb, 0xdca, 0x3b, 0xdb1, 0xddc, 0xdc0, 0xdd0, 0xdb8,
+0xdca, 0xdb6, 0xdbb, 0xdca, 0x3b, 0xdaf, 0xdd9, 0xdc3, 0xdd0, 0xdb8, 0xdca, 0xdb6,
+0xdbb, 0xdca, 0xda2, 0xdb1, 0x3b, 0xdb4, 0xdd9, 0xdb6, 0x3b, 0xdb8, 0xdcf, 0xdbb,
+0xdca, 0x3b, 0xd85, 0xdb4, 0xdca, 0x200d, 0xdbb, 0xdda, 0xdbd, 0xdca, 0x3b, 0xdb8,
+0xdd0, 0xdba, 0xdd2, 0x3b, 0xda2, 0xdd6, 0xdb1, 0xdd2, 0x3b, 0xda2, 0xdd6, 0xdbd,
+0xdd2, 0x3b, 0xd85, 0xd9c, 0xddd, 0x3b, 0xdc3, 0xdd0, 0xdb4, 0xdca, 0x3b, 0xd94,
+0xd9a, 0xdca, 0x3b, 0xdb1, 0xddc, 0xdc0, 0xdd0, 0x3b, 0xdaf, 0xdd9, 0xdc3, 0xdd0,
+0xda2, 0xdb1, 0x3b, 0xdb4, 0xdd9, 0xdb6, 0x3b, 0xdb8, 0xdcf, 0xdbb, 0xdca, 0xdad,
+0xdd4, 0x3b, 0xd85, 0xdb4, 0xdca, 0x200d, 0xdbb, 0xdda, 0xdbd, 0xdca, 0x3b, 0xdb8,
+0xdd0, 0xdba, 0xdd2, 0x3b, 0xda2, 0xdd6, 0xdb1, 0xdd2, 0x3b, 0xda2, 0xdd6, 0xdbd,
+0xdd2, 0x3b, 0xd85, 0xd9c, 0xddd, 0x3b, 0xdc3, 0xdd0, 0xdb4, 0xdca, 0x3b, 0xd94,
+0xd9a, 0xdca, 0x3b, 0xdb1, 0xddc, 0xdc0, 0xdd0, 0x3b, 0xdaf, 0xdd9, 0xdc3, 0xdd0,
+0xda2, 0x3b, 0xdb4, 0xdd9, 0x3b, 0xdb8, 0xdcf, 0x3b, 0xd85, 0x3b, 0xdb8, 0xdd0,
+0x3b, 0xda2, 0xdd6, 0x3b, 0xda2, 0xdd6, 0x3b, 0xd85, 0x3b, 0xdc3, 0xdd0, 0x3b,
+0xd94, 0x3b, 0xdb1, 0xdd9, 0x3b, 0xdaf, 0xdd9, 0x6a, 0x61, 0x6e, 0x75, 0xe1,
+0x72, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0xe1, 0x72, 0x3b, 0x6d, 0x61,
+0x72, 0x65, 0x63, 0x3b, 0x61, 0x70, 0x72, 0xed, 0x6c, 0x3b, 0x6d, 0xe1,
+0x6a, 0x3b, 0x6a, 0xfa, 0x6e, 0x3b, 0x6a, 0xfa, 0x6c, 0x3b, 0x61, 0x75,
+0x67, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62,
+0x65, 0x72, 0x3b, 0x6f, 0x6b, 0x74, 0xf3, 0x62, 0x65, 0x72, 0x3b, 0x6e,
+0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x63, 0x65,
+0x6d, 0x62, 0x65, 0x72, 0x6a, 0x61, 0x6e, 0x75, 0xe1, 0x72, 0x61, 0x3b,
+0x66, 0x65, 0x62, 0x72, 0x75, 0xe1, 0x72, 0x61, 0x3b, 0x6d, 0x61, 0x72,
+0x63, 0x61, 0x3b, 0x61, 0x70, 0x72, 0xed, 0x6c, 0x61, 0x3b, 0x6d, 0xe1,
+0x6a, 0x61, 0x3b, 0x6a, 0xfa, 0x6e, 0x61, 0x3b, 0x6a, 0xfa, 0x6c, 0x61,
+0x3b, 0x61, 0x75, 0x67, 0x75, 0x73, 0x74, 0x61, 0x3b, 0x73, 0x65, 0x70,
+0x74, 0x65, 0x6d, 0x62, 0x72, 0x61, 0x3b, 0x6f, 0x6b, 0x74, 0xf3, 0x62,
+0x72, 0x61, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x61, 0x3b,
+0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x72, 0x61, 0x6a, 0x61, 0x6e, 0x3b,
+0x66, 0x65, 0x62, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x61, 0x70, 0x72, 0x3b,
+0x6d, 0xe1, 0x6a, 0x3b, 0x6a, 0xfa, 0x6e, 0x3b, 0x6a, 0xfa, 0x6c, 0x3b,
+0x61, 0x75, 0x67, 0x3b, 0x73, 0x65, 0x70, 0x3b, 0x6f, 0x6b, 0x74, 0x3b,
+0x6e, 0x6f, 0x76, 0x3b, 0x64, 0x65, 0x63, 0x6a, 0x61, 0x6e, 0x75, 0x61,
+0x72, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b, 0x6d, 0x61,
+0x72, 0x65, 0x63, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x61,
+0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x6a, 0x3b, 0x6a, 0x75, 0x6c, 0x69,
+0x6a, 0x3b, 0x61, 0x76, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x70,
+0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x62,
+0x65, 0x72, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b,
+0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x6a, 0x61, 0x6e, 0x2e,
+0x3b, 0x66, 0x65, 0x62, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x2e, 0x3b, 0x61,
+0x70, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x2e,
+0x3b, 0x6a, 0x75, 0x6c, 0x2e, 0x3b, 0x61, 0x76, 0x67, 0x2e, 0x3b, 0x73,
+0x65, 0x70, 0x2e, 0x3b, 0x6f, 0x6b, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76,
+0x2e, 0x3b, 0x64, 0x65, 0x63, 0x2e, 0x4a, 0x61, 0x6e, 0x6e, 0x61, 0x61,
+0x79, 0x6f, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x61, 0x61, 0x79, 0x6f, 0x3b,
+0x4d, 0x61, 0x61, 0x72, 0x73, 0x6f, 0x3b, 0x41, 0x62, 0x72, 0x69, 0x69,
+0x6c, 0x3b, 0x4d, 0x61, 0x79, 0x3b, 0x4a, 0x75, 0x75, 0x6e, 0x3b, 0x4c,
+0x75, 0x75, 0x6c, 0x69, 0x79, 0x6f, 0x3b, 0x4f, 0x67, 0x6f, 0x73, 0x74,
+0x6f, 0x3b, 0x53, 0x65, 0x62, 0x74, 0x65, 0x65, 0x6d, 0x62, 0x61, 0x72,
+0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x6f, 0x62, 0x61, 0x72, 0x3b, 0x4e, 0x6f,
+0x6f, 0x66, 0x65, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x3b, 0x44, 0x69, 0x73,
+0x65, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x42, 0x69, 0x73, 0x68, 0x61, 0x20,
+0x4b, 0x6f, 0x6f, 0x62, 0x61, 0x61, 0x64, 0x3b, 0x42, 0x69, 0x73, 0x68,
+0x61, 0x20, 0x4c, 0x61, 0x62, 0x61, 0x61, 0x64, 0x3b, 0x42, 0x69, 0x73,
+0x68, 0x61, 0x20, 0x53, 0x61, 0x64, 0x64, 0x65, 0x78, 0x61, 0x61, 0x64,
+0x3b, 0x42, 0x69, 0x73, 0x68, 0x61, 0x20, 0x41, 0x66, 0x72, 0x61, 0x61,
+0x64, 0x3b, 0x42, 0x69, 0x73, 0x68, 0x61, 0x20, 0x53, 0x68, 0x61, 0x6e,
+0x61, 0x61, 0x64, 0x3b, 0x42, 0x69, 0x73, 0x68, 0x61, 0x20, 0x4c, 0x69,
+0x78, 0x61, 0x61, 0x64, 0x3b, 0x42, 0x69, 0x73, 0x68, 0x61, 0x20, 0x54,
+0x6f, 0x64, 0x6f, 0x62, 0x61, 0x61, 0x64, 0x3b, 0x42, 0x69, 0x73, 0x68,
+0x61, 0x20, 0x53, 0x69, 0x64, 0x65, 0x65, 0x64, 0x61, 0x61, 0x64, 0x3b,
+0x42, 0x69, 0x73, 0x68, 0x61, 0x20, 0x53, 0x61, 0x67, 0x61, 0x61, 0x6c,
+0x61, 0x61, 0x64, 0x3b, 0x42, 0x69, 0x73, 0x68, 0x61, 0x20, 0x54, 0x6f,
+0x62, 0x6e, 0x61, 0x61, 0x64, 0x3b, 0x42, 0x69, 0x73, 0x68, 0x61, 0x20,
+0x4b, 0x6f, 0x77, 0x20, 0x69, 0x79, 0x6f, 0x20, 0x54, 0x6f, 0x62, 0x6e,
+0x61, 0x61, 0x64, 0x3b, 0x42, 0x69, 0x73, 0x68, 0x61, 0x20, 0x4c, 0x61,
+0x62, 0x61, 0x20, 0x69, 0x79, 0x6f, 0x20, 0x54, 0x6f, 0x62, 0x6e, 0x61,
+0x61, 0x64, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61,
+0x72, 0x3b, 0x41, 0x62, 0x72, 0x3b, 0x4d, 0x61, 0x79, 0x3b, 0x4a, 0x75,
+0x6e, 0x3b, 0x4c, 0x75, 0x6c, 0x3b, 0x4f, 0x67, 0x73, 0x3b, 0x53, 0x65,
+0x62, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x66, 0x3b, 0x44, 0x69,
+0x73, 0x4a, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x4a,
+0x3b, 0x4c, 0x3b, 0x4f, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44,
+0x50, 0x68, 0x65, 0x73, 0x65, 0x6b, 0x67, 0x6f, 0x6e, 0x67, 0x3b, 0x48,
+0x6c, 0x61, 0x6b, 0x6f, 0x6c, 0x61, 0x3b, 0x48, 0x6c, 0x61, 0x6b, 0x75,
+0x62, 0x65, 0x6c, 0x65, 0x3b, 0x4d, 0x6d, 0x65, 0x73, 0x65, 0x3b, 0x4d,
+0x6f, 0x74, 0x73, 0x68, 0x65, 0x61, 0x6e, 0x6f, 0x6e, 0x67, 0x3b, 0x50,
+0x68, 0x75, 0x70, 0x6a, 0x61, 0x6e, 0x65, 0x3b, 0x50, 0x68, 0x75, 0x70,
+0x75, 0x3b, 0x50, 0x68, 0x61, 0x74, 0x61, 0x3b, 0x4c, 0x65, 0x6f, 0x74,
+0x73, 0x68, 0x65, 0x3b, 0x4d, 0x70, 0x68, 0x61, 0x6c, 0x61, 0x6e, 0x65,
+0x3b, 0x50, 0x75, 0x6e, 0x64, 0x75, 0x6e, 0x67, 0x77, 0x61, 0x6e, 0x65,
+0x3b, 0x54, 0x73, 0x68, 0x69, 0x74, 0x77, 0x65, 0x50, 0x68, 0x65, 0x3b,
+0x4b, 0x6f, 0x6c, 0x3b, 0x55, 0x62, 0x65, 0x3b, 0x4d, 0x6d, 0x65, 0x3b,
+0x4d, 0x6f, 0x74, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x55, 0x70, 0x75, 0x3b,
+0x50, 0x68, 0x61, 0x3b, 0x4c, 0x65, 0x6f, 0x3b, 0x4d, 0x70, 0x68, 0x3b,
+0x50, 0x75, 0x6e, 0x3b, 0x54, 0x73, 0x68, 0x4a, 0x61, 0x6e, 0x61, 0x62,
+0x61, 0x72, 0x69, 0x3b, 0x75, 0x46, 0x65, 0x62, 0x65, 0x72, 0x62, 0x61,
+0x72, 0x69, 0x3b, 0x75, 0x4d, 0x61, 0x74, 0x6a, 0x68, 0x69, 0x3b, 0x75,
+0x2d, 0x41, 0x70, 0x72, 0x65, 0x6c, 0x69, 0x3b, 0x4d, 0x65, 0x79, 0x69,
+0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x61, 0x79, 0x69,
+0x3b, 0x41, 0x72, 0x68, 0x6f, 0x73, 0x74, 0x6f, 0x73, 0x69, 0x3b, 0x53,
+0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4f, 0x6b, 0x74, 0x6f,
+0x62, 0x61, 0x3b, 0x55, 0x73, 0x69, 0x6e, 0x79, 0x69, 0x6b, 0x68, 0x61,
+0x62, 0x61, 0x3b, 0x44, 0x69, 0x73, 0x65, 0x6d, 0x62, 0x61, 0x4a, 0x61,
+0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x74, 0x3b, 0x41, 0x70,
+0x72, 0x3b, 0x4d, 0x65, 0x79, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75,
+0x6c, 0x3b, 0x41, 0x72, 0x68, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b,
+0x74, 0x3b, 0x55, 0x73, 0x69, 0x3b, 0x44, 0x69, 0x73, 0x65, 0x6e, 0x65,
+0x72, 0x6f, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x65, 0x72, 0x6f, 0x3b, 0x6d,
+0x61, 0x72, 0x7a, 0x6f, 0x3b, 0x61, 0x62, 0x72, 0x69, 0x6c, 0x3b, 0x6d,
+0x61, 0x79, 0x6f, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x6f, 0x3b, 0x6a, 0x75,
+0x6c, 0x69, 0x6f, 0x3b, 0x61, 0x67, 0x6f, 0x73, 0x74, 0x6f, 0x3b, 0x73,
+0x65, 0x70, 0x74, 0x69, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x6f, 0x63,
+0x74, 0x75, 0x62, 0x72, 0x65, 0x3b, 0x6e, 0x6f, 0x76, 0x69, 0x65, 0x6d,
+0x62, 0x72, 0x65, 0x3b, 0x64, 0x69, 0x63, 0x69, 0x65, 0x6d, 0x62, 0x72,
+0x65, 0x65, 0x6e, 0x65, 0x3b, 0x66, 0x65, 0x62, 0x3b, 0x6d, 0x61, 0x72,
+0x3b, 0x61, 0x62, 0x72, 0x3b, 0x6d, 0x61, 0x79, 0x3b, 0x6a, 0x75, 0x6e,
+0x3b, 0x6a, 0x75, 0x6c, 0x3b, 0x61, 0x67, 0x6f, 0x3b, 0x73, 0x65, 0x70,
+0x74, 0x3b, 0x6f, 0x63, 0x74, 0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64, 0x69,
+0x63, 0x45, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x4a,
+0x3b, 0x4a, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44,
+0x65, 0x6e, 0x65, 0x2e, 0x3b, 0x66, 0x65, 0x62, 0x2e, 0x3b, 0x6d, 0x61,
+0x72, 0x2e, 0x3b, 0x61, 0x62, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x79, 0x2e,
+0x3b, 0x6a, 0x75, 0x6e, 0x2e, 0x3b, 0x6a, 0x75, 0x6c, 0x2e, 0x3b, 0x61,
+0x67, 0x6f, 0x2e, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x2e, 0x3b, 0x6f, 0x63,
+0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0x69, 0x63, 0x2e,
+0x65, 0x6e, 0x65, 0x3b, 0x66, 0x65, 0x62, 0x3b, 0x6d, 0x61, 0x72, 0x3b,
+0x61, 0x62, 0x72, 0x3b, 0x6d, 0x61, 0x79, 0x3b, 0x6a, 0x75, 0x6e, 0x3b,
+0x6a, 0x75, 0x6c, 0x3b, 0x61, 0x67, 0x6f, 0x3b, 0x73, 0x65, 0x70, 0x3b,
+0x6f, 0x63, 0x74, 0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64, 0x69, 0x63, 0x65,
+0x6e, 0x65, 0x72, 0x6f, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x65, 0x72, 0x6f,
+0x3b, 0x6d, 0x61, 0x72, 0x7a, 0x6f, 0x3b, 0x61, 0x62, 0x72, 0x69, 0x6c,
+0x3b, 0x6d, 0x61, 0x79, 0x6f, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x6f, 0x3b,
+0x6a, 0x75, 0x6c, 0x69, 0x6f, 0x3b, 0x61, 0x67, 0x6f, 0x73, 0x74, 0x6f,
+0x3b, 0x73, 0x65, 0x74, 0x69, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x6f,
+0x63, 0x74, 0x75, 0x62, 0x72, 0x65, 0x3b, 0x6e, 0x6f, 0x76, 0x69, 0x65,
+0x6d, 0x62, 0x72, 0x65, 0x3b, 0x64, 0x69, 0x63, 0x69, 0x65, 0x6d, 0x62,
+0x72, 0x65, 0x45, 0x6e, 0x65, 0x2e, 0x3b, 0x46, 0x65, 0x62, 0x2e, 0x3b,
+0x4d, 0x61, 0x72, 0x2e, 0x3b, 0x41, 0x62, 0x72, 0x2e, 0x3b, 0x4d, 0x61,
+0x79, 0x2e, 0x3b, 0x4a, 0x75, 0x6e, 0x2e, 0x3b, 0x4a, 0x75, 0x6c, 0x2e,
+0x3b, 0x41, 0x67, 0x6f, 0x2e, 0x3b, 0x53, 0x65, 0x74, 0x2e, 0x3b, 0x4f,
+0x63, 0x74, 0x2e, 0x3b, 0x4e, 0x6f, 0x76, 0x2e, 0x3b, 0x44, 0x69, 0x63,
+0x2e, 0x65, 0x6e, 0x65, 0x2e, 0x3b, 0x66, 0x65, 0x62, 0x2e, 0x3b, 0x6d,
+0x61, 0x72, 0x2e, 0x3b, 0x61, 0x62, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x79,
+0x2e, 0x3b, 0x6a, 0x75, 0x6e, 0x2e, 0x3b, 0x6a, 0x75, 0x6c, 0x2e, 0x3b,
+0x61, 0x67, 0x6f, 0x2e, 0x3b, 0x73, 0x65, 0x74, 0x2e, 0x3b, 0x6f, 0x63,
+0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0x69, 0x63, 0x2e,
+0x2d49, 0x2d4f, 0x2d4f, 0x2d30, 0x2d62, 0x2d54, 0x3b, 0x2d31, 0x2d55, 0x2d30, 0x2d62, 0x2d55,
+0x3b, 0x2d4e, 0x2d30, 0x2d55, 0x2d5a, 0x3b, 0x2d49, 0x2d31, 0x2d54, 0x2d49, 0x2d54, 0x3b,
+0x2d4e, 0x2d30, 0x2d62, 0x2d62, 0x2d53, 0x3b, 0x2d62, 0x2d53, 0x2d4f, 0x2d62, 0x2d53, 0x3b,
+0x2d62, 0x2d53, 0x2d4d, 0x2d62, 0x2d53, 0x2d63, 0x3b, 0x2d56, 0x2d53, 0x2d5b, 0x2d5c, 0x3b,
+0x2d5b, 0x2d53, 0x2d5c, 0x2d30, 0x2d4f, 0x2d31, 0x2d49, 0x2d54, 0x3b, 0x2d3d, 0x2d5c, 0x2d53,
+0x2d31, 0x2d54, 0x3b, 0x2d4f, 0x2d53, 0x2d61, 0x2d30, 0x2d4f, 0x2d31, 0x2d49, 0x2d54, 0x3b,
+0x2d37, 0x2d53, 0x2d4a, 0x2d30, 0x2d4f, 0x2d31, 0x2d49, 0x2d54, 0x2d49, 0x2d4f, 0x2d4f, 0x3b,
+0x2d31, 0x2d55, 0x2d30, 0x3b, 0x2d4e, 0x2d30, 0x2d55, 0x3b, 0x2d49, 0x2d31, 0x2d54, 0x3b,
+0x2d4e, 0x2d30, 0x2d62, 0x3b, 0x2d62, 0x2d53, 0x2d4f, 0x3b, 0x2d62, 0x2d53, 0x2d4d, 0x3b,
+0x2d56, 0x2d53, 0x2d5b, 0x3b, 0x2d5b, 0x2d53, 0x2d5c, 0x3b, 0x2d3d, 0x2d5c, 0x2d53, 0x3b,
+0x2d4f, 0x2d53, 0x2d61, 0x3b, 0x2d37, 0x2d53, 0x2d4a, 0x2d49, 0x3b, 0x2d31, 0x3b, 0x2d4e,
+0x3b, 0x2d49, 0x3b, 0x2d4e, 0x3b, 0x2d62, 0x3b, 0x2d62, 0x3b, 0x2d56, 0x3b, 0x2d5b,
+0x3b, 0x2d3d, 0x3b, 0x2d4f, 0x3b, 0x2d37, 0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72,
+0x69, 0x3b, 0x50, 0xe9, 0x62, 0x72, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x4d,
+0x61, 0x72, 0x65, 0x74, 0x3b, 0x41, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x4d,
+0xe9, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x69,
+0x3b, 0x41, 0x67, 0x75, 0x73, 0x74, 0x75, 0x73, 0x3b, 0x53, 0xe9, 0x70,
+0x74, 0xe9, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62,
+0x65, 0x72, 0x3b, 0x4e, 0x6f, 0x70, 0xe9, 0x6d, 0x62, 0x65, 0x72, 0x3b,
+0x44, 0xe9, 0x73, 0xe9, 0x6d, 0x62, 0x65, 0x72, 0x4a, 0x61, 0x6e, 0x3b,
+0x50, 0xe9, 0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x70, 0x72, 0x3b,
+0x4d, 0xe9, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b,
+0x41, 0x67, 0x73, 0x3b, 0x53, 0xe9, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b,
+0x4e, 0x6f, 0x70, 0x3b, 0x44, 0xe9, 0x73, 0x4a, 0x3b, 0x50, 0x3b, 0x4d,
+0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0x41, 0x3b, 0x53,
+0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x42, 0x68, 0x69, 0x6d, 0x62, 0x69,
+0x64, 0x76, 0x77, 0x61, 0x6e, 0x65, 0x3b, 0x69, 0x4e, 0x64, 0x6c, 0x6f,
+0x76, 0x61, 0x6e, 0x61, 0x3b, 0x69, 0x4e, 0x64, 0x6c, 0x6f, 0x76, 0x75,
+0x2d, 0x6c, 0x65, 0x6e, 0x6b, 0x68, 0x75, 0x6c, 0x75, 0x3b, 0x4d, 0x61,
+0x62, 0x61, 0x73, 0x61, 0x3b, 0x69, 0x4e, 0x6b, 0x68, 0x77, 0x65, 0x6b,
+0x68, 0x77, 0x65, 0x74, 0x69, 0x3b, 0x69, 0x4e, 0x68, 0x6c, 0x61, 0x62,
+0x61, 0x3b, 0x4b, 0x68, 0x6f, 0x6c, 0x77, 0x61, 0x6e, 0x65, 0x3b, 0x69,
+0x4e, 0x67, 0x63, 0x69, 0x3b, 0x69, 0x4e, 0x79, 0x6f, 0x6e, 0x69, 0x3b,
+0x69, 0x4d, 0x70, 0x68, 0x61, 0x6c, 0x61, 0x3b, 0x4c, 0x77, 0x65, 0x74,
+0x69, 0x3b, 0x69, 0x4e, 0x67, 0x6f, 0x6e, 0x67, 0x6f, 0x6e, 0x69, 0x42,
+0x68, 0x69, 0x3b, 0x56, 0x61, 0x6e, 0x3b, 0x56, 0x6f, 0x6c, 0x3b, 0x4d,
+0x61, 0x62, 0x3b, 0x4e, 0x6b, 0x68, 0x3b, 0x4e, 0x68, 0x6c, 0x3b, 0x4b,
+0x68, 0x6f, 0x3b, 0x4e, 0x67, 0x63, 0x3b, 0x4e, 0x79, 0x6f, 0x3b, 0x4d,
+0x70, 0x68, 0x3b, 0x4c, 0x77, 0x65, 0x3b, 0x4e, 0x67, 0x6f, 0x6a, 0x61,
+0x6e, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61,
+0x72, 0x69, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x69,
+0x6c, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x3b, 0x6a,
+0x75, 0x6c, 0x69, 0x3b, 0x61, 0x75, 0x67, 0x75, 0x73, 0x74, 0x69, 0x3b,
+0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6f, 0x6b,
+0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62,
+0x65, 0x72, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x6a,
+0x61, 0x6e, 0x2e, 0x3b, 0x66, 0x65, 0x62, 0x2e, 0x3b, 0x6d, 0x61, 0x72,
+0x73, 0x3b, 0x61, 0x70, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x6a,
+0x75, 0x6e, 0x69, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x3b, 0x61, 0x75, 0x67,
+0x2e, 0x3b, 0x73, 0x65, 0x70, 0x2e, 0x3b, 0x6f, 0x6b, 0x74, 0x2e, 0x3b,
+0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0x65, 0x63, 0x2e, 0x4a, 0x61, 0x6e,
+0x75, 0x61, 0x72, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b,
+0x4d, 0xe4, 0x72, 0x7a, 0x3b, 0x41, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x4d,
+0x61, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x69,
+0x3b, 0x41, 0x75, 0x67, 0x75, 0x73, 0x63, 0x68, 0x74, 0x3b, 0x53, 0x65,
+0x70, 0x74, 0xe4, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x6f,
+0x6f, 0x62, 0x65, 0x72, 0x3b, 0x4e, 0x6f, 0x76, 0xe4, 0x6d, 0x62, 0x65,
+0x72, 0x3b, 0x44, 0x65, 0x7a, 0xe4, 0x6d, 0x62, 0x65, 0x72, 0x71f, 0x722,
+0x718, 0x722, 0x20, 0x710, 0x71a, 0x72a, 0x71d, 0x710, 0x3b, 0x72b, 0x712, 0x71b,
+0x3b, 0x710, 0x715, 0x72a, 0x3b, 0x722, 0x71d, 0x723, 0x722, 0x3b, 0x710, 0x71d,
+0x72a, 0x3b, 0x71a, 0x719, 0x71d, 0x72a, 0x722, 0x3b, 0x72c, 0x721, 0x718, 0x719,
+0x3b, 0x710, 0x712, 0x3b, 0x710, 0x71d, 0x720, 0x718, 0x720, 0x3b, 0x72c, 0x72b,
+0x72a, 0x71d, 0x722, 0x20, 0x729, 0x715, 0x721, 0x71d, 0x710, 0x3b, 0x72c, 0x72b,
+0x72a, 0x71d, 0x722, 0x20, 0x710, 0x71a, 0x72a, 0x71d, 0x710, 0x3b, 0x71f, 0x722,
+0x718, 0x722, 0x20, 0x729, 0x715, 0x721, 0x71d, 0x710, 0x71f, 0x722, 0x718, 0x722,
+0x20, 0x712, 0x3b, 0x72b, 0x712, 0x71b, 0x3b, 0x710, 0x715, 0x72a, 0x3b, 0x722,
+0x71d, 0x723, 0x722, 0x3b, 0x710, 0x71d, 0x72a, 0x3b, 0x71a, 0x719, 0x71d, 0x72a,
+0x722, 0x3b, 0x72c, 0x721, 0x718, 0x719, 0x3b, 0x710, 0x712, 0x3b, 0x710, 0x71d,
+0x720, 0x718, 0x720, 0x3b, 0x72c, 0x72b, 0x72a, 0x71d, 0x722, 0x20, 0x710, 0x3b,
+0x72c, 0x72b, 0x72a, 0x71d, 0x722, 0x20, 0x712, 0x3b, 0x71f, 0x722, 0x718, 0x722,
+0x20, 0x710, 0x71f, 0x3b, 0x72b, 0x3b, 0x710, 0x3b, 0x722, 0x3b, 0x710, 0x3b,
+0x72c, 0x3b, 0x71a, 0x3b, 0x710, 0x3b, 0x710, 0x3b, 0x72c, 0x3b, 0x72c, 0x3b,
+0x71f, 0x71f, 0x3b, 0x72b, 0x3b, 0x710, 0x3b, 0x722, 0x3b, 0x710, 0x3b, 0x71a,
+0x3b, 0x72c, 0x3b, 0x710, 0x3b, 0x710, 0x3b, 0x72c, 0x3b, 0x72c, 0x3b, 0x71f,
+0x69, 0x6e, 0x6e, 0x61, 0x79, 0x72, 0x3b, 0x62, 0x1e5b, 0x61, 0x79, 0x1e5b,
+0x3b, 0x6d, 0x61, 0x1e5b, 0x1e63, 0x3b, 0x69, 0x62, 0x72, 0x69, 0x72, 0x3b,
+0x6d, 0x61, 0x79, 0x79, 0x75, 0x3b, 0x79, 0x75, 0x6e, 0x79, 0x75, 0x3b,
+0x79, 0x75, 0x6c, 0x79, 0x75, 0x7a, 0x3b, 0x263, 0x75, 0x63, 0x74, 0x3b,
+0x63, 0x75, 0x74, 0x61, 0x6e, 0x62, 0x69, 0x72, 0x3b, 0x6b, 0x74, 0x75,
+0x62, 0x72, 0x3b, 0x6e, 0x75, 0x77, 0x61, 0x6e, 0x62, 0x69, 0x72, 0x3b,
+0x64, 0x75, 0x6a, 0x61, 0x6e, 0x62, 0x69, 0x72, 0x69, 0x6e, 0x6e, 0x3b,
+0x62, 0x1e5b, 0x61, 0x3b, 0x6d, 0x61, 0x1e5b, 0x3b, 0x69, 0x62, 0x72, 0x3b,
+0x6d, 0x61, 0x79, 0x3b, 0x79, 0x75, 0x6e, 0x3b, 0x79, 0x75, 0x6c, 0x3b,
+0x263, 0x75, 0x63, 0x3b, 0x63, 0x75, 0x74, 0x3b, 0x6b, 0x74, 0x75, 0x3b,
+0x6e, 0x75, 0x77, 0x3b, 0x64, 0x75, 0x6a, 0x69, 0x3b, 0x62, 0x3b, 0x6d,
+0x3b, 0x69, 0x3b, 0x6d, 0x3b, 0x79, 0x3b, 0x79, 0x3b, 0x263, 0x3b, 0x63,
+0x3b, 0x6b, 0x3b, 0x6e, 0x3b, 0x64, 0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67,
+0x68, 0x77, 0x61, 0x20, 0x69, 0x6d, 0x62, 0x69, 0x72, 0x69, 0x3b, 0x4d,
+0x6f, 0x72, 0x69, 0x20, 0x67, 0x68, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x77,
+0x69, 0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67, 0x68, 0x77, 0x61, 0x20,
+0x6b, 0x61, 0x64, 0x61, 0x64, 0x75, 0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20,
+0x67, 0x68, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x6e, 0x61, 0x3b, 0x4d, 0x6f,
+0x72, 0x69, 0x20, 0x67, 0x68, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x73, 0x61,
+0x6e, 0x75, 0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67, 0x68, 0x77, 0x61,
+0x20, 0x6b, 0x61, 0x72, 0x61, 0x6e, 0x64, 0x61, 0x64, 0x75, 0x3b, 0x4d,
+0x6f, 0x72, 0x69, 0x20, 0x67, 0x68, 0x77, 0x61, 0x20, 0x6d, 0x66, 0x75,
+0x6e, 0x67, 0x61, 0x64, 0x65, 0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67,
+0x68, 0x77, 0x61, 0x20, 0x77, 0x75, 0x6e, 0x79, 0x61, 0x6e, 0x79, 0x61,
+0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67, 0x68, 0x77, 0x61, 0x20, 0x69,
+0x6b, 0x65, 0x6e, 0x64, 0x61, 0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67,
+0x68, 0x77, 0x61, 0x20, 0x69, 0x6b, 0x75, 0x6d, 0x69, 0x3b, 0x4d, 0x6f,
+0x72, 0x69, 0x20, 0x67, 0x68, 0x77, 0x61, 0x20, 0x69, 0x6b, 0x75, 0x6d,
+0x69, 0x20, 0x6e, 0x61, 0x20, 0x69, 0x6d, 0x77, 0x65, 0x72, 0x69, 0x3b,
+0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67, 0x68, 0x77, 0x61, 0x20, 0x69, 0x6b,
+0x75, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x69, 0x77, 0x69, 0x49, 0x6d,
+0x62, 0x3b, 0x4b, 0x61, 0x77, 0x3b, 0x4b, 0x61, 0x64, 0x3b, 0x4b, 0x61,
+0x6e, 0x3b, 0x4b, 0x61, 0x73, 0x3b, 0x4b, 0x61, 0x72, 0x3b, 0x4d, 0x66,
+0x75, 0x3b, 0x57, 0x75, 0x6e, 0x3b, 0x49, 0x6b, 0x65, 0x3b, 0x49, 0x6b,
+0x75, 0x3b, 0x49, 0x6d, 0x77, 0x3b, 0x49, 0x77, 0x69, 0x49, 0x3b, 0x4b,
+0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4d, 0x3b, 0x57,
+0x3b, 0x49, 0x3b, 0x49, 0x3b, 0x49, 0x3b, 0x49, 0x42f, 0x43d, 0x432, 0x430,
+0x440, 0x3b, 0x424, 0x435, 0x432, 0x440, 0x430, 0x43b, 0x3b, 0x41c, 0x430, 0x440,
+0x442, 0x3b, 0x410, 0x43f, 0x440, 0x435, 0x43b, 0x3b, 0x41c, 0x430, 0x439, 0x3b,
+0x418, 0x44e, 0x43d, 0x3b, 0x418, 0x44e, 0x43b, 0x3b, 0x410, 0x432, 0x433, 0x443,
+0x441, 0x442, 0x3b, 0x421, 0x435, 0x43d, 0x442, 0x44f, 0x431, 0x440, 0x3b, 0x41e,
+0x43a, 0x442, 0x44f, 0x431, 0x440, 0x3b, 0x41d, 0x43e, 0x44f, 0x431, 0x440, 0x3b,
+0x414, 0x435, 0x43a, 0x430, 0x431, 0x440, 0xb9c, 0xba9, 0xbb5, 0xbb0, 0xbbf, 0x3b,
+0xbaa, 0xbbf, 0xbaa, 0xbcd, 0xbb0, 0xbb5, 0xbb0, 0xbbf, 0x3b, 0xbae, 0xbbe, 0xbb0,
+0xbcd, 0xb9a, 0xbcd, 0x3b, 0xb8f, 0xbaa, 0xbcd, 0xbb0, 0xbb2, 0xbcd, 0x3b, 0xbae,
+0xbc7, 0x3b, 0xb9c, 0xbc2, 0xba9, 0xbcd, 0x3b, 0xb9c, 0xbc2, 0xbb2, 0xbc8, 0x3b,
+0xb86, 0xb95, 0xbb8, 0xbcd, 0xb9f, 0xbcd, 0x3b, 0xb9a, 0xbc6, 0xbaa, 0xbcd, 0xb9f,
+0xbae, 0xbcd, 0xbaa, 0xbb0, 0xbcd, 0x3b, 0xb85, 0xb95, 0xbcd, 0xb9f, 0xbcb, 0xbaa,
+0xbb0, 0xbcd, 0x3b, 0xba8, 0xbb5, 0xbae, 0xbcd, 0xbaa, 0xbb0, 0xbcd, 0x3b, 0xb9f,
+0xbbf, 0xb9a, 0xbae, 0xbcd, 0xbaa, 0xbb0, 0xbcd, 0xb9c, 0xba9, 0x2e, 0x3b, 0xbaa,
+0xbbf, 0xbaa, 0xbcd, 0x2e, 0x3b, 0xbae, 0xbbe, 0xbb0, 0xbcd, 0x2e, 0x3b, 0xb8f,
+0xbaa, 0xbcd, 0x2e, 0x3b, 0xbae, 0xbc7, 0x3b, 0xb9c, 0xbc2, 0xba9, 0xbcd, 0x3b,
+0xb9c, 0xbc2, 0xbb2, 0xbc8, 0x3b, 0xb86, 0xb95, 0x2e, 0x3b, 0xb9a, 0xbc6, 0xbaa,
+0xbcd, 0x2e, 0x3b, 0xb85, 0xb95, 0xbcd, 0x2e, 0x3b, 0xba8, 0xbb5, 0x2e, 0x3b,
+0xb9f, 0xbbf, 0xb9a, 0x2e, 0xb9c, 0x3b, 0xbaa, 0xbbf, 0x3b, 0xbae, 0xbbe, 0x3b,
+0xb8f, 0x3b, 0xbae, 0xbc7, 0x3b, 0xb9c, 0xbc2, 0x3b, 0xb9c, 0xbc2, 0x3b, 0xb86,
+0x3b, 0xb9a, 0xbc6, 0x3b, 0xb85, 0x3b, 0xba8, 0x3b, 0xb9f, 0xbbf, 0x4b, 0x69,
+0x6e, 0x67, 0x61, 0x6c, 0x20, 0x69, 0x64, 0x61, 0x73, 0x3b, 0x44, 0x68,
+0x61, 0x20, 0x69, 0x64, 0x61, 0x73, 0x3b, 0x54, 0x72, 0x75, 0x20, 0x69,
+0x64, 0x61, 0x73, 0x3b, 0x53, 0x70, 0x61, 0x74, 0x20, 0x69, 0x64, 0x61,
+0x73, 0x3b, 0x52, 0x69, 0x6d, 0x61, 0x20, 0x69, 0x64, 0x61, 0x73, 0x3b,
+0x4d, 0x61, 0x74, 0x61, 0x72, 0x75, 0x20, 0x69, 0x64, 0x61, 0x73, 0x3b,
+0x45, 0x6d, 0x70, 0x69, 0x74, 0x75, 0x20, 0x69, 0x64, 0x61, 0x73, 0x3b,
+0x4d, 0x61, 0x73, 0x70, 0x61, 0x74, 0x20, 0x69, 0x64, 0x61, 0x73, 0x3b,
+0x4d, 0x6e, 0x67, 0x61, 0x72, 0x69, 0x20, 0x69, 0x64, 0x61, 0x73, 0x3b,
+0x4d, 0x61, 0x78, 0x61, 0x6c, 0x20, 0x69, 0x64, 0x61, 0x73, 0x3b, 0x4d,
+0x61, 0x78, 0x61, 0x6c, 0x20, 0x6b, 0x69, 0x6e, 0x67, 0x61, 0x6c, 0x20,
+0x69, 0x64, 0x61, 0x73, 0x3b, 0x4d, 0x61, 0x78, 0x61, 0x6c, 0x20, 0x64,
+0x68, 0x61, 0x20, 0x69, 0x64, 0x61, 0x73, 0x4b, 0x69, 0x69, 0x3b, 0x44,
+0x68, 0x69, 0x3b, 0x54, 0x72, 0x69, 0x3b, 0x53, 0x70, 0x69, 0x3b, 0x52,
+0x69, 0x69, 0x3b, 0x4d, 0x74, 0x69, 0x3b, 0x45, 0x6d, 0x69, 0x3b, 0x4d,
+0x61, 0x69, 0x3b, 0x4d, 0x6e, 0x69, 0x3b, 0x4d, 0x78, 0x69, 0x3b, 0x4d,
+0x78, 0x6b, 0x3b, 0x4d, 0x78, 0x64, 0x4b, 0x3b, 0x44, 0x3b, 0x54, 0x3b,
+0x53, 0x3b, 0x52, 0x3b, 0x4d, 0x3b, 0x45, 0x3b, 0x50, 0x3b, 0x41, 0x3b,
+0x4d, 0x3b, 0x4b, 0x3b, 0x44, 0x433, 0x44b, 0x439, 0x43d, 0x432, 0x430, 0x440,
+0x3b, 0x444, 0x435, 0x432, 0x440, 0x430, 0x43b, 0x44c, 0x3b, 0x43c, 0x430, 0x440,
+0x442, 0x3b, 0x430, 0x43f, 0x440, 0x435, 0x43b, 0x44c, 0x3b, 0x43c, 0x430, 0x439,
+0x3b, 0x438, 0x44e, 0x43d, 0x44c, 0x3b, 0x438, 0x44e, 0x43b, 0x44c, 0x3b, 0x430,
+0x432, 0x433, 0x443, 0x441, 0x442, 0x3b, 0x441, 0x435, 0x43d, 0x442, 0x44f, 0x431,
+0x440, 0x44c, 0x3b, 0x43e, 0x43a, 0x442, 0x44f, 0x431, 0x440, 0x44c, 0x3b, 0x43d,
+0x43e, 0x44f, 0x431, 0x440, 0x44c, 0x3b, 0x434, 0x435, 0x43a, 0x430, 0x431, 0x440,
+0x44c, 0x433, 0x44b, 0x439, 0x43d, 0x2e, 0x3b, 0x444, 0x435, 0x432, 0x2e, 0x3b,
+0x43c, 0x430, 0x440, 0x2e, 0x3b, 0x430, 0x43f, 0x440, 0x2e, 0x3b, 0x43c, 0x430,
+0x439, 0x3b, 0x438, 0x44e, 0x43d, 0x44c, 0x3b, 0x438, 0x44e, 0x43b, 0x44c, 0x3b,
+0x430, 0x432, 0x433, 0x2e, 0x3b, 0x441, 0x435, 0x43d, 0x442, 0x2e, 0x3b, 0x43e,
+0x43a, 0x442, 0x2e, 0x3b, 0x43d, 0x43e, 0x44f, 0x431, 0x2e, 0x3b, 0x434, 0x435,
+0x43a, 0x2e, 0xc1c, 0xc28, 0xc35, 0xc30, 0xc3f, 0x3b, 0xc2b, 0xc3f, 0xc2c, 0xc4d,
+0xc30, 0xc35, 0xc30, 0xc3f, 0x3b, 0xc2e, 0xc3e, 0xc30, 0xc4d, 0xc1a, 0xc3f, 0x3b,
+0xc0f, 0xc2a, 0xc4d, 0xc30, 0xc3f, 0xc32, 0xc4d, 0x3b, 0xc2e, 0xc47, 0x3b, 0xc1c,
+0xc42, 0xc28, 0xc4d, 0x3b, 0xc1c, 0xc41, 0xc32, 0xc48, 0x3b, 0xc06, 0xc17, 0xc38,
+0xc4d, 0xc1f, 0xc41, 0x3b, 0xc38, 0xc46, 0xc2a, 0xc4d, 0xc1f, 0xc46, 0xc02, 0xc2c,
+0xc30, 0xc4d, 0x3b, 0xc05, 0xc15, 0xc4d, 0xc1f, 0xc4b, 0xc2c, 0xc30, 0xc4d, 0x3b,
+0xc28, 0xc35, 0xc02, 0xc2c, 0xc30, 0xc4d, 0x3b, 0xc21, 0xc3f, 0xc38, 0xc46, 0xc02,
+0xc2c, 0xc30, 0xc4d, 0xc1c, 0xc28, 0x3b, 0xc2b, 0xc3f, 0xc2c, 0xc4d, 0xc30, 0x3b,
+0xc2e, 0xc3e, 0xc30, 0xc4d, 0xc1a, 0xc3f, 0x3b, 0xc0f, 0xc2a, 0xc4d, 0xc30, 0xc3f,
+0x3b, 0xc2e, 0xc47, 0x3b, 0xc1c, 0xc42, 0xc28, 0xc4d, 0x3b, 0xc1c, 0xc41, 0xc32,
+0xc48, 0x3b, 0xc06, 0xc17, 0x3b, 0xc38, 0xc46, 0xc2a, 0xc4d, 0xc1f, 0xc46, 0xc02,
+0x3b, 0xc05, 0xc15, 0xc4d, 0xc1f, 0xc4b, 0x3b, 0xc28, 0xc35, 0xc02, 0x3b, 0xc21,
+0xc3f, 0xc38, 0xc46, 0xc02, 0xc1c, 0x3b, 0xc2b, 0xc3f, 0x3b, 0xc2e, 0xc3e, 0x3b,
+0xc0f, 0x3b, 0xc2e, 0xc47, 0x3b, 0xc1c, 0xc42, 0x3b, 0xc1c, 0xc41, 0x3b, 0xc06,
+0x3b, 0xc38, 0xc46, 0x3b, 0xc05, 0x3b, 0xc28, 0x3b, 0xc21, 0xc3f, 0x4f, 0x72,
+0x61, 0x72, 0x61, 0x3b, 0x4f, 0x6d, 0x75, 0x6b, 0x3b, 0x4f, 0x6b, 0x77,
+0x61, 0x6d, 0x67, 0x2019, 0x3b, 0x4f, 0x64, 0x75, 0x6e, 0x67, 0x2019, 0x65,
+0x6c, 0x3b, 0x4f, 0x6d, 0x61, 0x72, 0x75, 0x6b, 0x3b, 0x4f, 0x6d, 0x6f,
+0x64, 0x6f, 0x6b, 0x2019, 0x6b, 0x69, 0x6e, 0x67, 0x2019, 0x6f, 0x6c, 0x3b,
+0x4f, 0x6a, 0x6f, 0x6c, 0x61, 0x3b, 0x4f, 0x70, 0x65, 0x64, 0x65, 0x6c,
+0x3b, 0x4f, 0x73, 0x6f, 0x6b, 0x6f, 0x73, 0x6f, 0x6b, 0x6f, 0x6d, 0x61,
+0x3b, 0x4f, 0x74, 0x69, 0x62, 0x61, 0x72, 0x3b, 0x4f, 0x6c, 0x61, 0x62,
+0x6f, 0x72, 0x3b, 0x4f, 0x70, 0x6f, 0x6f, 0x52, 0x61, 0x72, 0x3b, 0x4d,
+0x75, 0x6b, 0x3b, 0x4b, 0x77, 0x61, 0x3b, 0x44, 0x75, 0x6e, 0x3b, 0x4d,
+0x61, 0x72, 0x3b, 0x4d, 0x6f, 0x64, 0x3b, 0x4a, 0x6f, 0x6c, 0x3b, 0x50,
+0x65, 0x64, 0x3b, 0x53, 0x6f, 0x6b, 0x3b, 0x54, 0x69, 0x62, 0x3b, 0x4c,
+0x61, 0x62, 0x3b, 0x50, 0x6f, 0x6f, 0x52, 0x3b, 0x4d, 0x3b, 0x4b, 0x3b,
+0x44, 0x3b, 0x4d, 0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x50, 0x3b, 0x53, 0x3b,
+0x54, 0x3b, 0x4c, 0x3b, 0x50, 0xe21, 0xe01, 0xe23, 0xe32, 0xe04, 0xe21, 0x3b,
+0xe01, 0xe38, 0xe21, 0xe20, 0xe32, 0xe1e, 0xe31, 0xe19, 0xe18, 0xe4c, 0x3b, 0xe21,
+0xe35, 0xe19, 0xe32, 0xe04, 0xe21, 0x3b, 0xe40, 0xe21, 0xe29, 0xe32, 0xe22, 0xe19,
+0x3b, 0xe1e, 0xe24, 0xe29, 0xe20, 0xe32, 0xe04, 0xe21, 0x3b, 0xe21, 0xe34, 0xe16,
+0xe38, 0xe19, 0xe32, 0xe22, 0xe19, 0x3b, 0xe01, 0xe23, 0xe01, 0xe0e, 0xe32, 0xe04,
+0xe21, 0x3b, 0xe2a, 0xe34, 0xe07, 0xe2b, 0xe32, 0xe04, 0xe21, 0x3b, 0xe01, 0xe31,
+0xe19, 0xe22, 0xe32, 0xe22, 0xe19, 0x3b, 0xe15, 0xe38, 0xe25, 0xe32, 0xe04, 0xe21,
+0x3b, 0xe1e, 0xe24, 0xe28, 0xe08, 0xe34, 0xe01, 0xe32, 0xe22, 0xe19, 0x3b, 0xe18,
+0xe31, 0xe19, 0xe27, 0xe32, 0xe04, 0xe21, 0xe21, 0x2e, 0xe04, 0x2e, 0x3b, 0xe01,
+0x2e, 0xe1e, 0x2e, 0x3b, 0xe21, 0xe35, 0x2e, 0xe04, 0x2e, 0x3b, 0xe40, 0xe21,
+0x2e, 0xe22, 0x2e, 0x3b, 0xe1e, 0x2e, 0xe04, 0x2e, 0x3b, 0xe21, 0xe34, 0x2e,
+0xe22, 0x2e, 0x3b, 0xe01, 0x2e, 0xe04, 0x2e, 0x3b, 0xe2a, 0x2e, 0xe04, 0x2e,
+0x3b, 0xe01, 0x2e, 0xe22, 0x2e, 0x3b, 0xe15, 0x2e, 0xe04, 0x2e, 0x3b, 0xe1e,
+0x2e, 0xe22, 0x2e, 0x3b, 0xe18, 0x2e, 0xe04, 0x2e, 0xf5f, 0xfb3, 0xf0b, 0xf56,
+0xf0b, 0xf51, 0xf44, 0xf0b, 0xf54, 0xf7c, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56,
+0xf0b, 0xf42, 0xf49, 0xf72, 0xf66, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b,
+0xf56, 0xf0b, 0xf42, 0xf66, 0xf74, 0xf58, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3,
+0xf0b, 0xf56, 0xf0b, 0xf56, 0xf5e, 0xf72, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3,
+0xf0b, 0xf56, 0xf0b, 0xf63, 0xf94, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b,
+0xf56, 0xf0b, 0xf51, 0xfb2, 0xf74, 0xf42, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3,
+0xf0b, 0xf56, 0xf0b, 0xf56, 0xf51, 0xf74, 0xf53, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f,
+0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf56, 0xf62, 0xf92, 0xfb1, 0xf51, 0xf0b, 0xf54, 0xf0b,
+0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf51, 0xf42, 0xf74, 0xf0b, 0xf54, 0xf0b,
+0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf56, 0xf45, 0xf74, 0xf0b, 0xf54, 0xf0b,
+0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf56, 0xf45, 0xf74, 0xf0b, 0xf42, 0xf45,
+0xf72, 0xf42, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf56,
+0xf45, 0xf74, 0xf0b, 0xf42, 0xf49, 0xf72, 0xf66, 0xf0b, 0xf54, 0xf0b, 0xf5f, 0xfb3,
+0xf0b, 0xf56, 0xf0b, 0xf51, 0xf44, 0xf0b, 0xf54, 0xf7c, 0x3b, 0xf5f, 0xfb3, 0xf0b,
+0xf56, 0xf0b, 0xf42, 0xf49, 0xf72, 0xf66, 0xf0b, 0xf54, 0x3b, 0xf5f, 0xfb3, 0xf0b,
+0xf56, 0xf0b, 0xf42, 0xf66, 0xf74, 0xf58, 0xf0b, 0xf54, 0x3b, 0xf5f, 0xfb3, 0xf0b,
+0xf56, 0xf0b, 0xf56, 0xf5e, 0xf72, 0xf0b, 0xf54, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56,
+0xf0b, 0xf63, 0xf94, 0xf0b, 0xf54, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf51,
+0xfb2, 0xf74, 0xf42, 0xf0b, 0xf54, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf56,
+0xf51, 0xf74, 0xf53, 0xf0b, 0xf54, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf56,
+0xf62, 0xf92, 0xfb1, 0xf51, 0xf0b, 0xf54, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b,
+0xf51, 0xf42, 0xf74, 0xf0b, 0xf54, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf56,
+0xf45, 0xf74, 0xf0b, 0xf54, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf56, 0xf45,
+0xf74, 0xf0b, 0xf42, 0xf45, 0xf72, 0xf42, 0xf0b, 0xf54, 0x3b, 0xf5f, 0xfb3, 0xf0b,
+0xf56, 0xf0b, 0xf56, 0xf45, 0xf74, 0xf0b, 0xf42, 0xf49, 0xf72, 0xf66, 0xf0b, 0xf54,
+0x1303, 0x1295, 0x12e9, 0x12c8, 0x122a, 0x3b, 0x134c, 0x1265, 0x1229, 0x12c8, 0x122a, 0x3b,
+0x121b, 0x122d, 0x127d, 0x3b, 0x12a4, 0x1355, 0x1228, 0x120d, 0x3b, 0x121c, 0x12ed, 0x3b,
+0x1301, 0x1295, 0x3b, 0x1301, 0x120b, 0x12ed, 0x3b, 0x12a6, 0x1308, 0x1235, 0x1275, 0x3b,
+0x1234, 0x1355, 0x1274, 0x121d, 0x1260, 0x122d, 0x3b, 0x12a6, 0x12ad, 0x1270, 0x12cd, 0x1260,
+0x122d, 0x3b, 0x1296, 0x126c, 0x121d, 0x1260, 0x122d, 0x3b, 0x12f2, 0x1234, 0x121d, 0x1260,
+0x122d, 0x1303, 0x1295, 0x12e9, 0x3b, 0x134c, 0x1265, 0x1229, 0x3b, 0x121b, 0x122d, 0x127d,
+0x3b, 0x12a4, 0x1355, 0x1228, 0x3b, 0x121c, 0x12ed, 0x3b, 0x1301, 0x1295, 0x3b, 0x1301,
+0x120b, 0x12ed, 0x3b, 0x12a6, 0x1308, 0x1235, 0x3b, 0x1234, 0x1355, 0x1274, 0x3b, 0x12a6,
+0x12ad, 0x1270, 0x3b, 0x1296, 0x126c, 0x121d, 0x3b, 0x12f2, 0x1234, 0x121d, 0x1325, 0x122a,
+0x3b, 0x1208, 0x12ab, 0x1272, 0x1275, 0x3b, 0x1218, 0x130b, 0x1262, 0x1275, 0x3b, 0x121a,
+0x12eb, 0x12dd, 0x12eb, 0x3b, 0x130d, 0x1295, 0x1266, 0x1275, 0x3b, 0x1230, 0x1290, 0x3b,
+0x1213, 0x121d, 0x1208, 0x3b, 0x1290, 0x1213, 0x1230, 0x3b, 0x1218, 0x1235, 0x12a8, 0x1228,
+0x121d, 0x3b, 0x1325, 0x1245, 0x121d, 0x1272, 0x3b, 0x1215, 0x12f3, 0x122d, 0x3b, 0x1273,
+0x1215, 0x1233, 0x1235, 0x1325, 0x122a, 0x3b, 0x1208, 0x12ab, 0x3b, 0x1218, 0x130b, 0x3b,
+0x121a, 0x12eb, 0x3b, 0x130d, 0x1295, 0x3b, 0x1230, 0x1290, 0x3b, 0x1213, 0x121d, 0x3b,
+0x1290, 0x1213, 0x3b, 0x1218, 0x1235, 0x3b, 0x1325, 0x1245, 0x3b, 0x1215, 0x12f3, 0x3b,
+0x1273, 0x1215, 0x1325, 0x3b, 0x1208, 0x3b, 0x1218, 0x3b, 0x121a, 0x3b, 0x130d, 0x3b,
+0x1230, 0x3b, 0x1213, 0x3b, 0x1290, 0x3b, 0x1218, 0x3b, 0x1325, 0x3b, 0x1215, 0x3b,
+0x1273, 0x4a, 0x61, 0x6e, 0x75, 0x65, 0x72, 0x69, 0x3b, 0x46, 0x65, 0x62,
+0x72, 0x75, 0x65, 0x72, 0x69, 0x3b, 0x4d, 0x61, 0x73, 0x3b, 0x45, 0x70,
+0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x65, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a,
+0x75, 0x6c, 0x61, 0x69, 0x3b, 0x4f, 0x67, 0x61, 0x73, 0x3b, 0x53, 0x65,
+0x70, 0x74, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62,
+0x61, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x44, 0x65,
+0x73, 0x65, 0x6d, 0x62, 0x61, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62,
+0x3b, 0x4d, 0x61, 0x73, 0x3b, 0x45, 0x70, 0x72, 0x3b, 0x4d, 0x65, 0x3b,
+0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x4f, 0x67, 0x61, 0x3b,
+0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b,
+0x44, 0x65, 0x73, 0x53, 0x101, 0x6e, 0x75, 0x61, 0x6c, 0x69, 0x3b, 0x46,
+0x113, 0x70, 0x75, 0x65, 0x6c, 0x69, 0x3b, 0x4d, 0x61, 0x2bb, 0x61, 0x73,
+0x69, 0x3b, 0x2bb, 0x45, 0x70, 0x65, 0x6c, 0x65, 0x6c, 0x69, 0x3b, 0x4d,
+0x113, 0x3b, 0x53, 0x75, 0x6e, 0x65, 0x3b, 0x53, 0x69, 0x75, 0x6c, 0x61,
+0x69, 0x3b, 0x2bb, 0x41, 0x6f, 0x6b, 0x6f, 0x73, 0x69, 0x3b, 0x53, 0x65,
+0x70, 0x69, 0x74, 0x65, 0x6d, 0x61, 0x3b, 0x2bb, 0x4f, 0x6b, 0x61, 0x74,
+0x6f, 0x70, 0x61, 0x3b, 0x4e, 0x14d, 0x76, 0x65, 0x6d, 0x61, 0x3b, 0x54,
+0x12b, 0x73, 0x65, 0x6d, 0x61, 0x53, 0x101, 0x6e, 0x75, 0x61, 0x6c, 0x69,
+0x3b, 0x46, 0x113, 0x70, 0x75, 0x65, 0x6c, 0x69, 0x3b, 0x4d, 0x61, 0x2bb,
+0x61, 0x73, 0x69, 0x3b, 0x2bb, 0x45, 0x70, 0x65, 0x6c, 0x65, 0x6c, 0x69,
+0x3b, 0x4d, 0x113, 0x3b, 0x53, 0x75, 0x6e, 0x65, 0x3b, 0x53, 0x69, 0x75,
+0x6c, 0x61, 0x69, 0x3b, 0x2bb, 0x41, 0x6f, 0x6b, 0x6f, 0x73, 0x69, 0x3b,
+0x53, 0x113, 0x70, 0x69, 0x74, 0x65, 0x6d, 0x61, 0x3b, 0x2bb, 0x4f, 0x6b,
+0x61, 0x74, 0x6f, 0x70, 0x61, 0x3b, 0x4e, 0x14d, 0x76, 0x65, 0x6d, 0x61,
+0x3b, 0x54, 0x12b, 0x73, 0x65, 0x6d, 0x61, 0x53, 0x101, 0x6e, 0x3b, 0x46,
+0x113, 0x70, 0x3b, 0x4d, 0x61, 0x2bb, 0x61, 0x3b, 0x2bb, 0x45, 0x70, 0x65,
+0x3b, 0x4d, 0x113, 0x3b, 0x53, 0x75, 0x6e, 0x3b, 0x53, 0x69, 0x75, 0x3b,
+0x2bb, 0x41, 0x6f, 0x6b, 0x3b, 0x53, 0x113, 0x70, 0x3b, 0x2bb, 0x4f, 0x6b,
+0x61, 0x3b, 0x4e, 0x14d, 0x76, 0x3b, 0x54, 0x12b, 0x73, 0x53, 0x3b, 0x46,
+0x3b, 0x4d, 0x3b, 0x2bb, 0x45, 0x3b, 0x4d, 0x3b, 0x53, 0x3b, 0x53, 0x3b,
+0x2bb, 0x41, 0x3b, 0x53, 0x3b, 0x2bb, 0x4f, 0x3b, 0x4e, 0x3b, 0x54, 0x53,
+0x75, 0x6e, 0x67, 0x75, 0x74, 0x69, 0x3b, 0x4e, 0x79, 0x65, 0x6e, 0x79,
+0x65, 0x6e, 0x79, 0x61, 0x6e, 0x69, 0x3b, 0x4e, 0x79, 0x65, 0x6e, 0x79,
+0x61, 0x6e, 0x6b, 0x75, 0x6c, 0x75, 0x3b, 0x44, 0x7a, 0x69, 0x76, 0x61,
+0x6d, 0x69, 0x73, 0x6f, 0x6b, 0x6f, 0x3b, 0x4d, 0x75, 0x64, 0x79, 0x61,
+0x78, 0x69, 0x68, 0x69, 0x3b, 0x4b, 0x68, 0x6f, 0x74, 0x61, 0x76, 0x75,
+0x78, 0x69, 0x6b, 0x61, 0x3b, 0x4d, 0x61, 0x77, 0x75, 0x77, 0x61, 0x6e,
+0x69, 0x3b, 0x4d, 0x68, 0x61, 0x77, 0x75, 0x72, 0x69, 0x3b, 0x4e, 0x64,
+0x7a, 0x68, 0x61, 0x74, 0x69, 0x3b, 0x4e, 0x68, 0x6c, 0x61, 0x6e, 0x67,
+0x75, 0x6c, 0x61, 0x3b, 0x48, 0x75, 0x6b, 0x75, 0x72, 0x69, 0x3b, 0x4e,
+0x2019, 0x77, 0x65, 0x6e, 0x64, 0x7a, 0x61, 0x6d, 0x68, 0x61, 0x6c, 0x61,
+0x53, 0x75, 0x6e, 0x3b, 0x59, 0x61, 0x6e, 0x3b, 0x4b, 0x75, 0x6c, 0x3b,
+0x44, 0x7a, 0x69, 0x3b, 0x4d, 0x75, 0x64, 0x3b, 0x4b, 0x68, 0x6f, 0x3b,
+0x4d, 0x61, 0x77, 0x3b, 0x4d, 0x68, 0x61, 0x3b, 0x4e, 0x64, 0x7a, 0x3b,
+0x4e, 0x68, 0x6c, 0x3b, 0x48, 0x75, 0x6b, 0x3b, 0x4e, 0x2019, 0x77, 0x46,
+0x65, 0x72, 0x69, 0x6b, 0x67, 0x6f, 0x6e, 0x67, 0x3b, 0x54, 0x6c, 0x68,
+0x61, 0x6b, 0x6f, 0x6c, 0x65, 0x3b, 0x4d, 0x6f, 0x70, 0x69, 0x74, 0x6c,
+0x6f, 0x3b, 0x4d, 0x6f, 0x72, 0x61, 0x6e, 0x61, 0x6e, 0x67, 0x3b, 0x4d,
+0x6f, 0x74, 0x73, 0x68, 0x65, 0x67, 0x61, 0x6e, 0x61, 0x6e, 0x67, 0x3b,
+0x53, 0x65, 0x65, 0x74, 0x65, 0x62, 0x6f, 0x73, 0x69, 0x67, 0x6f, 0x3b,
+0x50, 0x68, 0x75, 0x6b, 0x77, 0x69, 0x3b, 0x50, 0x68, 0x61, 0x74, 0x77,
+0x65, 0x3b, 0x4c, 0x77, 0x65, 0x74, 0x73, 0x65, 0x3b, 0x44, 0x69, 0x70,
+0x68, 0x61, 0x6c, 0x61, 0x6e, 0x65, 0x3b, 0x4e, 0x67, 0x77, 0x61, 0x6e,
+0x61, 0x74, 0x73, 0x65, 0x6c, 0x65, 0x3b, 0x53, 0x65, 0x64, 0x69, 0x6d,
+0x6f, 0x6e, 0x74, 0x68, 0x6f, 0x6c, 0x65, 0x46, 0x65, 0x72, 0x3b, 0x54,
+0x6c, 0x68, 0x3b, 0x4d, 0x6f, 0x70, 0x3b, 0x4d, 0x6f, 0x72, 0x3b, 0x4d,
+0x6f, 0x74, 0x3b, 0x53, 0x65, 0x65, 0x3b, 0x50, 0x68, 0x75, 0x3b, 0x50,
+0x68, 0x61, 0x3b, 0x4c, 0x77, 0x65, 0x3b, 0x44, 0x69, 0x70, 0x3b, 0x4e,
+0x67, 0x77, 0x3b, 0x53, 0x65, 0x64, 0x4f, 0x63, 0x61, 0x6b, 0x3b, 0x15e,
+0x75, 0x62, 0x61, 0x74, 0x3b, 0x4d, 0x61, 0x72, 0x74, 0x3b, 0x4e, 0x69,
+0x73, 0x61, 0x6e, 0x3b, 0x4d, 0x61, 0x79, 0x131, 0x73, 0x3b, 0x48, 0x61,
+0x7a, 0x69, 0x72, 0x61, 0x6e, 0x3b, 0x54, 0x65, 0x6d, 0x6d, 0x75, 0x7a,
+0x3b, 0x41, 0x11f, 0x75, 0x73, 0x74, 0x6f, 0x73, 0x3b, 0x45, 0x79, 0x6c,
+0xfc, 0x6c, 0x3b, 0x45, 0x6b, 0x69, 0x6d, 0x3b, 0x4b, 0x61, 0x73, 0x131,
+0x6d, 0x3b, 0x41, 0x72, 0x61, 0x6c, 0x131, 0x6b, 0x4f, 0x63, 0x61, 0x3b,
+0x15e, 0x75, 0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x4e, 0x69, 0x73, 0x3b,
+0x4d, 0x61, 0x79, 0x3b, 0x48, 0x61, 0x7a, 0x3b, 0x54, 0x65, 0x6d, 0x3b,
+0x41, 0x11f, 0x75, 0x3b, 0x45, 0x79, 0x6c, 0x3b, 0x45, 0x6b, 0x69, 0x3b,
+0x4b, 0x61, 0x73, 0x3b, 0x41, 0x72, 0x61, 0x4f, 0x3b, 0x15e, 0x3b, 0x4d,
+0x3b, 0x4e, 0x3b, 0x4d, 0x3b, 0x48, 0x3b, 0x54, 0x3b, 0x41, 0x3b, 0x45,
+0x3b, 0x45, 0x3b, 0x4b, 0x3b, 0x41, 0xdd, 0x61, 0x6e, 0x77, 0x61, 0x72,
+0x3b, 0x46, 0x65, 0x77, 0x72, 0x61, 0x6c, 0x3b, 0x4d, 0x61, 0x72, 0x74,
+0x3b, 0x41, 0x70, 0x72, 0x65, 0x6c, 0x3b, 0x4d, 0x61, 0xfd, 0x3b, 0x49,
+0xfd, 0x75, 0x6e, 0x3b, 0x49, 0xfd, 0x75, 0x6c, 0x3b, 0x41, 0x77, 0x67,
+0x75, 0x73, 0x74, 0x3b, 0x53, 0x65, 0x6e, 0x74, 0xfd, 0x61, 0x62, 0x72,
+0x3b, 0x4f, 0x6b, 0x74, 0xfd, 0x61, 0x62, 0x72, 0x3b, 0x4e, 0x6f, 0xfd,
+0x61, 0x62, 0x72, 0x3b, 0x44, 0x65, 0x6b, 0x61, 0x62, 0x72, 0xfd, 0x61,
+0x6e, 0x77, 0x61, 0x72, 0x3b, 0x66, 0x65, 0x77, 0x72, 0x61, 0x6c, 0x3b,
+0x6d, 0x61, 0x72, 0x74, 0x3b, 0x61, 0x70, 0x72, 0x65, 0x6c, 0x3b, 0x6d,
+0x61, 0xfd, 0x3b, 0x69, 0xfd, 0x75, 0x6e, 0x3b, 0x69, 0xfd, 0x75, 0x6c,
+0x3b, 0x61, 0x77, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x6e, 0x74,
+0xfd, 0x61, 0x62, 0x72, 0x3b, 0x6f, 0x6b, 0x74, 0xfd, 0x61, 0x62, 0x72,
+0x3b, 0x6e, 0x6f, 0xfd, 0x61, 0x62, 0x72, 0x3b, 0x64, 0x65, 0x6b, 0x61,
+0x62, 0x72, 0xdd, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x77, 0x3b, 0x4d, 0x61,
+0x72, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x61, 0xfd, 0x3b, 0x49, 0xfd,
+0x75, 0x6e, 0x3b, 0x49, 0xfd, 0x75, 0x6c, 0x3b, 0x41, 0x77, 0x67, 0x3b,
+0x53, 0x65, 0x6e, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0xfd, 0x3b,
+0x44, 0x65, 0x6b, 0xfd, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x77, 0x3b, 0x6d,
+0x61, 0x72, 0x74, 0x3b, 0x61, 0x70, 0x72, 0x3b, 0x6d, 0x61, 0xfd, 0x3b,
+0x69, 0xfd, 0x75, 0x6e, 0x3b, 0x69, 0xfd, 0x75, 0x6c, 0x3b, 0x61, 0x77,
+0x67, 0x3b, 0x73, 0x65, 0x6e, 0x3b, 0x6f, 0x6b, 0x74, 0x3b, 0x6e, 0x6f,
+0xfd, 0x3b, 0x64, 0x65, 0x6b, 0xdd, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41,
+0x3b, 0x4d, 0x3b, 0x49, 0x3b, 0x49, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f,
+0x3b, 0x4e, 0x3b, 0x44, 0x5a, 0x77, 0x61, 0x74, 0x20, 0x4a, 0x75, 0x77,
+0x75, 0x6e, 0x67, 0x3b, 0x5a, 0x77, 0x61, 0x74, 0x20, 0x53, 0x77, 0x69,
+0x79, 0x61, 0x6e, 0x67, 0x3b, 0x5a, 0x77, 0x61, 0x74, 0x20, 0x54, 0x73,
+0x61, 0x74, 0x3b, 0x5a, 0x77, 0x61, 0x74, 0x20, 0x4e, 0x79, 0x61, 0x69,
+0x3b, 0x5a, 0x77, 0x61, 0x74, 0x20, 0x54, 0x73, 0x77, 0x6f, 0x6e, 0x3b,
+0x5a, 0x77, 0x61, 0x74, 0x20, 0x41, 0x74, 0x61, 0x61, 0x68, 0x3b, 0x5a,
+0x77, 0x61, 0x74, 0x20, 0x41, 0x6e, 0x61, 0x74, 0x61, 0x74, 0x3b, 0x5a,
+0x77, 0x61, 0x74, 0x20, 0x41, 0x72, 0x69, 0x6e, 0x61, 0x69, 0x3b, 0x5a,
+0x77, 0x61, 0x74, 0x20, 0x41, 0x6b, 0x75, 0x62, 0x75, 0x6e, 0x79, 0x75,
+0x6e, 0x67, 0x3b, 0x5a, 0x77, 0x61, 0x74, 0x20, 0x53, 0x77, 0x61, 0x67,
+0x3b, 0x5a, 0x77, 0x61, 0x74, 0x20, 0x4d, 0x61, 0x6e, 0x67, 0x6a, 0x75,
+0x77, 0x61, 0x6e, 0x67, 0x3b, 0x5a, 0x77, 0x61, 0x74, 0x20, 0x53, 0x77,
+0x61, 0x67, 0x2d, 0x4d, 0x61, 0x2d, 0x53, 0x75, 0x79, 0x61, 0x6e, 0x67,
+0x4a, 0x75, 0x77, 0x3b, 0x53, 0x77, 0x69, 0x3b, 0x54, 0x73, 0x61, 0x3b,
+0x4e, 0x79, 0x61, 0x3b, 0x54, 0x73, 0x77, 0x3b, 0x41, 0x74, 0x61, 0x3b,
+0x41, 0x6e, 0x61, 0x3b, 0x41, 0x72, 0x69, 0x3b, 0x41, 0x6b, 0x75, 0x3b,
+0x53, 0x77, 0x61, 0x3b, 0x4d, 0x61, 0x6e, 0x3b, 0x4d, 0x61, 0x73, 0x441,
+0x456, 0x447, 0x435, 0x43d, 0x44c, 0x3b, 0x43b, 0x44e, 0x442, 0x438, 0x439, 0x3b,
+0x431, 0x435, 0x440, 0x435, 0x437, 0x435, 0x43d, 0x44c, 0x3b, 0x43a, 0x432, 0x456,
+0x442, 0x435, 0x43d, 0x44c, 0x3b, 0x442, 0x440, 0x430, 0x432, 0x435, 0x43d, 0x44c,
+0x3b, 0x447, 0x435, 0x440, 0x432, 0x435, 0x43d, 0x44c, 0x3b, 0x43b, 0x438, 0x43f,
+0x435, 0x43d, 0x44c, 0x3b, 0x441, 0x435, 0x440, 0x43f, 0x435, 0x43d, 0x44c, 0x3b,
+0x432, 0x435, 0x440, 0x435, 0x441, 0x435, 0x43d, 0x44c, 0x3b, 0x436, 0x43e, 0x432,
+0x442, 0x435, 0x43d, 0x44c, 0x3b, 0x43b, 0x438, 0x441, 0x442, 0x43e, 0x43f, 0x430,
+0x434, 0x3b, 0x433, 0x440, 0x443, 0x434, 0x435, 0x43d, 0x44c, 0x441, 0x456, 0x447,
+0x43d, 0x44f, 0x3b, 0x43b, 0x44e, 0x442, 0x43e, 0x433, 0x43e, 0x3b, 0x431, 0x435,
+0x440, 0x435, 0x437, 0x43d, 0x44f, 0x3b, 0x43a, 0x432, 0x456, 0x442, 0x43d, 0x44f,
+0x3b, 0x442, 0x440, 0x430, 0x432, 0x43d, 0x44f, 0x3b, 0x447, 0x435, 0x440, 0x432,
+0x43d, 0x44f, 0x3b, 0x43b, 0x438, 0x43f, 0x43d, 0x44f, 0x3b, 0x441, 0x435, 0x440,
+0x43f, 0x43d, 0x44f, 0x3b, 0x432, 0x435, 0x440, 0x435, 0x441, 0x43d, 0x44f, 0x3b,
+0x436, 0x43e, 0x432, 0x442, 0x43d, 0x44f, 0x3b, 0x43b, 0x438, 0x441, 0x442, 0x43e,
+0x43f, 0x430, 0x434, 0x430, 0x3b, 0x433, 0x440, 0x443, 0x434, 0x43d, 0x44f, 0x441,
+0x456, 0x447, 0x2e, 0x3b, 0x43b, 0x44e, 0x442, 0x2e, 0x3b, 0x431, 0x435, 0x440,
+0x2e, 0x3b, 0x43a, 0x432, 0x456, 0x442, 0x2e, 0x3b, 0x442, 0x440, 0x430, 0x432,
+0x2e, 0x3b, 0x447, 0x435, 0x440, 0x432, 0x2e, 0x3b, 0x43b, 0x438, 0x43f, 0x2e,
+0x3b, 0x441, 0x435, 0x440, 0x43f, 0x2e, 0x3b, 0x432, 0x435, 0x440, 0x2e, 0x3b,
+0x436, 0x43e, 0x432, 0x442, 0x2e, 0x3b, 0x43b, 0x438, 0x441, 0x442, 0x2e, 0x3b,
+0x433, 0x440, 0x443, 0x434, 0x2e, 0x421, 0x3b, 0x41b, 0x3b, 0x411, 0x3b, 0x41a,
+0x3b, 0x422, 0x3b, 0x427, 0x3b, 0x41b, 0x3b, 0x421, 0x3b, 0x412, 0x3b, 0x416,
+0x3b, 0x41b, 0x3b, 0x413, 0x441, 0x3b, 0x43b, 0x3b, 0x431, 0x3b, 0x43a, 0x3b,
+0x442, 0x3b, 0x447, 0x3b, 0x43b, 0x3b, 0x441, 0x3b, 0x432, 0x3b, 0x436, 0x3b,
+0x43b, 0x3b, 0x433, 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x3b, 0x66, 0x65,
+0x62, 0x72, 0x75, 0x61, 0x72, 0x3b, 0x6d, 0x11b, 0x72, 0x63, 0x3b, 0x61,
+0x70, 0x72, 0x79, 0x6c, 0x3b, 0x6d, 0x65, 0x6a, 0x61, 0x3b, 0x6a, 0x75,
+0x6e, 0x69, 0x6a, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x6a, 0x3b, 0x61, 0x77,
+0x67, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62,
+0x65, 0x72, 0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x6e,
+0x6f, 0x77, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x63, 0x65,
+0x6d, 0x62, 0x65, 0x72, 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x61, 0x3b,
+0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x61, 0x3b, 0x6d, 0x11b, 0x72,
+0x63, 0x61, 0x3b, 0x61, 0x70, 0x72, 0x79, 0x6c, 0x61, 0x3b, 0x6d, 0x65,
+0x6a, 0x65, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x6a, 0x61, 0x3b, 0x6a, 0x75,
+0x6c, 0x69, 0x6a, 0x61, 0x3b, 0x61, 0x77, 0x67, 0x75, 0x73, 0x74, 0x61,
+0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x61, 0x3b, 0x6f,
+0x6b, 0x74, 0x6f, 0x62, 0x72, 0x61, 0x3b, 0x6e, 0x6f, 0x77, 0x65, 0x6d,
+0x62, 0x72, 0x61, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x72, 0x61,
+0x6a, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x62, 0x3b, 0x6d, 0x11b, 0x72, 0x3b,
+0x61, 0x70, 0x72, 0x3b, 0x6d, 0x65, 0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x3b,
+0x6a, 0x75, 0x6c, 0x3b, 0x61, 0x77, 0x67, 0x3b, 0x73, 0x65, 0x70, 0x3b,
+0x6f, 0x6b, 0x74, 0x3b, 0x6e, 0x6f, 0x77, 0x3b, 0x64, 0x65, 0x63, 0x6a,
+0x61, 0x6e, 0x2e, 0x3b, 0x66, 0x65, 0x62, 0x2e, 0x3b, 0x6d, 0x11b, 0x72,
+0x2e, 0x3b, 0x61, 0x70, 0x72, 0x2e, 0x3b, 0x6d, 0x65, 0x6a, 0x2e, 0x3b,
+0x6a, 0x75, 0x6e, 0x2e, 0x3b, 0x6a, 0x75, 0x6c, 0x2e, 0x3b, 0x61, 0x77,
+0x67, 0x2e, 0x3b, 0x73, 0x65, 0x70, 0x2e, 0x3b, 0x6f, 0x6b, 0x74, 0x2e,
+0x3b, 0x6e, 0x6f, 0x77, 0x2e, 0x3b, 0x64, 0x65, 0x63, 0x2e, 0x62c, 0x646,
+0x648, 0x631, 0x6cc, 0x3b, 0x641, 0x631, 0x648, 0x631, 0x6cc, 0x3b, 0x645, 0x627,
+0x631, 0x686, 0x3b, 0x627, 0x67e, 0x631, 0x6cc, 0x644, 0x3b, 0x645, 0x626, 0x6cc,
+0x3b, 0x62c, 0x648, 0x646, 0x3b, 0x62c, 0x648, 0x644, 0x627, 0x626, 0x6cc, 0x3b,
+0x627, 0x6af, 0x633, 0x62a, 0x3b, 0x633, 0x62a, 0x645, 0x628, 0x631, 0x3b, 0x627,
+0x6a9, 0x62a, 0x648, 0x628, 0x631, 0x3b, 0x646, 0x648, 0x645, 0x628, 0x631, 0x3b,
+0x62f, 0x633, 0x645, 0x628, 0x631, 0x64a, 0x627, 0x646, 0x6cb, 0x627, 0x631, 0x3b,
+0x641, 0x6d0, 0x6cb, 0x631, 0x627, 0x644, 0x3b, 0x645, 0x627, 0x631, 0x62a, 0x3b,
+0x626, 0x627, 0x67e, 0x631, 0x6d0, 0x644, 0x3b, 0x645, 0x627, 0x64a, 0x3b, 0x626,
+0x649, 0x64a, 0x6c7, 0x646, 0x3b, 0x626, 0x649, 0x64a, 0x6c7, 0x644, 0x3b, 0x626,
+0x627, 0x6cb, 0x63a, 0x6c7, 0x633, 0x62a, 0x3b, 0x633, 0x6d0, 0x646, 0x62a, 0x6d5,
+0x628, 0x649, 0x631, 0x3b, 0x626, 0x6c6, 0x643, 0x62a, 0x6d5, 0x628, 0x649, 0x631,
+0x3b, 0x646, 0x648, 0x64a, 0x627, 0x628, 0x649, 0x631, 0x3b, 0x62f, 0x6d0, 0x643,
+0x627, 0x628, 0x649, 0x631, 0x59, 0x61, 0x6e, 0x76, 0x61, 0x72, 0x3b, 0x46,
+0x65, 0x76, 0x72, 0x61, 0x6c, 0x3b, 0x4d, 0x61, 0x72, 0x74, 0x3b, 0x41,
+0x70, 0x72, 0x65, 0x6c, 0x3b, 0x4d, 0x61, 0x79, 0x3b, 0x49, 0x79, 0x75,
+0x6e, 0x3b, 0x49, 0x79, 0x75, 0x6c, 0x3b, 0x41, 0x76, 0x67, 0x75, 0x73,
+0x74, 0x3b, 0x53, 0x65, 0x6e, 0x74, 0x61, 0x62, 0x72, 0x3b, 0x4f, 0x6b,
+0x74, 0x61, 0x62, 0x72, 0x3b, 0x4e, 0x6f, 0x79, 0x61, 0x62, 0x72, 0x3b,
+0x44, 0x65, 0x6b, 0x61, 0x62, 0x72, 0x79, 0x61, 0x6e, 0x76, 0x61, 0x72,
+0x3b, 0x66, 0x65, 0x76, 0x72, 0x61, 0x6c, 0x3b, 0x6d, 0x61, 0x72, 0x74,
+0x3b, 0x61, 0x70, 0x72, 0x65, 0x6c, 0x3b, 0x6d, 0x61, 0x79, 0x3b, 0x69,
+0x79, 0x75, 0x6e, 0x3b, 0x69, 0x79, 0x75, 0x6c, 0x3b, 0x61, 0x76, 0x67,
+0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x62, 0x72, 0x3b,
+0x6f, 0x6b, 0x74, 0x61, 0x62, 0x72, 0x3b, 0x6e, 0x6f, 0x79, 0x61, 0x62,
+0x72, 0x3b, 0x64, 0x65, 0x6b, 0x61, 0x62, 0x72, 0x59, 0x61, 0x6e, 0x3b,
+0x46, 0x65, 0x76, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x70, 0x72, 0x3b,
+0x4d, 0x61, 0x79, 0x3b, 0x49, 0x79, 0x6e, 0x3b, 0x49, 0x79, 0x6c, 0x3b,
+0x41, 0x76, 0x67, 0x3b, 0x53, 0x65, 0x6e, 0x3b, 0x4f, 0x6b, 0x74, 0x3b,
+0x4e, 0x6f, 0x79, 0x3b, 0x44, 0x65, 0x6b, 0x79, 0x61, 0x6e, 0x3b, 0x66,
+0x65, 0x76, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x61, 0x70, 0x72, 0x3b, 0x6d,
+0x61, 0x79, 0x3b, 0x69, 0x79, 0x6e, 0x3b, 0x69, 0x79, 0x6c, 0x3b, 0x61,
+0x76, 0x67, 0x3b, 0x73, 0x65, 0x6e, 0x3b, 0x6f, 0x6b, 0x74, 0x3b, 0x6e,
+0x6f, 0x79, 0x3b, 0x64, 0x65, 0x6b, 0x59, 0x3b, 0x46, 0x3b, 0x4d, 0x3b,
+0x41, 0x3b, 0x4d, 0x3b, 0x49, 0x3b, 0x49, 0x3b, 0x41, 0x3b, 0x53, 0x3b,
+0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x62c, 0x646, 0x648, 0x3b, 0x641, 0x628, 0x631,
+0x3b, 0x645, 0x627, 0x631, 0x3b, 0x627, 0x67e, 0x631, 0x3b, 0x645, 0x6cc, 0x3b,
+0x62c, 0x648, 0x646, 0x3b, 0x62c, 0x648, 0x644, 0x3b, 0x627, 0x6af, 0x633, 0x3b,
+0x633, 0x67e, 0x62a, 0x3b, 0x627, 0x6a9, 0x62a, 0x3b, 0x646, 0x648, 0x645, 0x3b,
+0x62f, 0x633, 0x645, 0x44f, 0x43d, 0x432, 0x430, 0x440, 0x3b, 0x444, 0x435, 0x432,
+0x440, 0x430, 0x43b, 0x3b, 0x43c, 0x430, 0x440, 0x442, 0x3b, 0x430, 0x43f, 0x440,
+0x435, 0x43b, 0x3b, 0x43c, 0x430, 0x439, 0x3b, 0x438, 0x44e, 0x43d, 0x3b, 0x438,
+0x44e, 0x43b, 0x3b, 0x430, 0x432, 0x433, 0x443, 0x441, 0x442, 0x3b, 0x441, 0x435,
+0x43d, 0x442, 0x44f, 0x431, 0x440, 0x3b, 0x43e, 0x43a, 0x442, 0x44f, 0x431, 0x440,
+0x3b, 0x43d, 0x43e, 0x44f, 0x431, 0x440, 0x3b, 0x434, 0x435, 0x43a, 0x430, 0x431,
+0x440, 0xa5a8, 0xa595, 0x20, 0xa56a, 0xa574, 0x20, 0xa51e, 0xa500, 0xa56e, 0xa54a, 0x3b,
+0xa552, 0xa561, 0xa59d, 0xa595, 0x3b, 0xa57e, 0xa5ba, 0x3b, 0xa5a2, 0xa595, 0x3b, 0xa591,
+0xa571, 0x3b, 0xa5b1, 0xa60b, 0x3b, 0xa5b1, 0xa55e, 0xa524, 0x3b, 0xa5db, 0xa515, 0x3b,
+0xa562, 0xa54c, 0x3b, 0xa56d, 0xa583, 0x3b, 0xa51e, 0xa60b, 0xa554, 0xa57f, 0x20, 0xa578,
+0xa583, 0xa5cf, 0x3b, 0xa5a8, 0xa595, 0x20, 0xa56a, 0xa574, 0x20, 0xa5cf, 0xa5ba, 0xa56e,
+0xa54a, 0xa5a8, 0xa595, 0xa51e, 0x3b, 0xa552, 0xa561, 0x3b, 0xa57e, 0xa5ba, 0x3b, 0xa5a2,
+0xa595, 0x3b, 0xa591, 0xa571, 0x3b, 0xa5b1, 0xa60b, 0x3b, 0xa5b1, 0xa55e, 0x3b, 0xa5db,
+0xa515, 0x3b, 0xa562, 0xa54c, 0x3b, 0xa56d, 0xa583, 0x3b, 0xa51e, 0xa60b, 0x3b, 0xa5a8,
+0xa595, 0xa5cf, 0x50, 0x68, 0x61, 0x6e, 0x64, 0x6f, 0x3b, 0x4c, 0x75, 0x68,
+0x75, 0x68, 0x69, 0x3b, 0x1e70, 0x68, 0x61, 0x66, 0x61, 0x6d, 0x75, 0x68,
+0x77, 0x65, 0x3b, 0x4c, 0x61, 0x6d, 0x62, 0x61, 0x6d, 0x61, 0x69, 0x3b,
+0x53, 0x68, 0x75, 0x6e, 0x64, 0x75, 0x6e, 0x74, 0x68, 0x75, 0x6c, 0x65,
+0x3b, 0x46, 0x75, 0x6c, 0x77, 0x69, 0x3b, 0x46, 0x75, 0x6c, 0x77, 0x61,
+0x6e, 0x61, 0x3b, 0x1e70, 0x68, 0x61, 0x6e, 0x67, 0x75, 0x6c, 0x65, 0x3b,
+0x4b, 0x68, 0x75, 0x62, 0x76, 0x75, 0x6d, 0x65, 0x64, 0x7a, 0x69, 0x3b,
+0x54, 0x73, 0x68, 0x69, 0x6d, 0x65, 0x64, 0x7a, 0x69, 0x3b, 0x1e3c, 0x61,
+0x72, 0x61, 0x3b, 0x4e, 0x79, 0x65, 0x6e, 0x64, 0x61, 0x76, 0x68, 0x75,
+0x73, 0x69, 0x6b, 0x75, 0x50, 0x68, 0x61, 0x3b, 0x4c, 0x75, 0x68, 0x3b,
+0x1e70, 0x68, 0x66, 0x3b, 0x4c, 0x61, 0x6d, 0x3b, 0x53, 0x68, 0x75, 0x3b,
+0x4c, 0x77, 0x69, 0x3b, 0x4c, 0x77, 0x61, 0x3b, 0x1e70, 0x68, 0x61, 0x3b,
+0x4b, 0x68, 0x75, 0x3b, 0x54, 0x73, 0x68, 0x3b, 0x1e3c, 0x61, 0x72, 0x3b,
+0x4e, 0x79, 0x65, 0x54, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x31, 0x3b, 0x54,
+0x68, 0xe1, 0x6e, 0x67, 0x20, 0x32, 0x3b, 0x54, 0x68, 0xe1, 0x6e, 0x67,
+0x20, 0x33, 0x3b, 0x54, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x34, 0x3b, 0x54,
+0x68, 0xe1, 0x6e, 0x67, 0x20, 0x35, 0x3b, 0x54, 0x68, 0xe1, 0x6e, 0x67,
+0x20, 0x36, 0x3b, 0x54, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x37, 0x3b, 0x54,
+0x68, 0xe1, 0x6e, 0x67, 0x20, 0x38, 0x3b, 0x54, 0x68, 0xe1, 0x6e, 0x67,
+0x20, 0x39, 0x3b, 0x54, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x31, 0x30, 0x3b,
+0x54, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x31, 0x31, 0x3b, 0x54, 0x68, 0xe1,
+0x6e, 0x67, 0x20, 0x31, 0x32, 0x74, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x31,
+0x3b, 0x74, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x32, 0x3b, 0x74, 0x68, 0xe1,
+0x6e, 0x67, 0x20, 0x33, 0x3b, 0x74, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x34,
+0x3b, 0x74, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x35, 0x3b, 0x74, 0x68, 0xe1,
+0x6e, 0x67, 0x20, 0x36, 0x3b, 0x74, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x37,
+0x3b, 0x74, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x38, 0x3b, 0x74, 0x68, 0xe1,
+0x6e, 0x67, 0x20, 0x39, 0x3b, 0x74, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x31,
+0x30, 0x3b, 0x74, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x31, 0x31, 0x3b, 0x74,
+0x68, 0xe1, 0x6e, 0x67, 0x20, 0x31, 0x32, 0x74, 0x68, 0x67, 0x20, 0x31,
+0x3b, 0x74, 0x68, 0x67, 0x20, 0x32, 0x3b, 0x74, 0x68, 0x67, 0x20, 0x33,
+0x3b, 0x74, 0x68, 0x67, 0x20, 0x34, 0x3b, 0x74, 0x68, 0x67, 0x20, 0x35,
+0x3b, 0x74, 0x68, 0x67, 0x20, 0x36, 0x3b, 0x74, 0x68, 0x67, 0x20, 0x37,
+0x3b, 0x74, 0x68, 0x67, 0x20, 0x38, 0x3b, 0x74, 0x68, 0x67, 0x20, 0x39,
+0x3b, 0x74, 0x68, 0x67, 0x20, 0x31, 0x30, 0x3b, 0x74, 0x68, 0x67, 0x20,
+0x31, 0x31, 0x3b, 0x74, 0x68, 0x67, 0x20, 0x31, 0x32, 0x79, 0x61, 0x6e,
+0x75, 0x6c, 0x3b, 0x66, 0x65, 0x62, 0x75, 0x6c, 0x3b, 0x6d, 0xe4, 0x7a,
+0x75, 0x6c, 0x3b, 0x70, 0x72, 0x69, 0x6c, 0x75, 0x6c, 0x3b, 0x6d, 0x61,
+0x79, 0x75, 0x6c, 0x3b, 0x79, 0x75, 0x6e, 0x75, 0x6c, 0x3b, 0x79, 0x75,
+0x6c, 0x75, 0x6c, 0x3b, 0x67, 0x75, 0x73, 0x74, 0x75, 0x6c, 0x3b, 0x73,
+0x65, 0x74, 0x75, 0x6c, 0x3b, 0x74, 0x6f, 0x62, 0x75, 0x6c, 0x3b, 0x6e,
+0x6f, 0x76, 0x75, 0x6c, 0x3b, 0x64, 0x65, 0x6b, 0x75, 0x6c, 0x79, 0x61,
+0x6e, 0x3b, 0x66, 0x65, 0x62, 0x3b, 0x6d, 0xe4, 0x7a, 0x3b, 0x70, 0x72,
+0x6c, 0x3b, 0x6d, 0x61, 0x79, 0x3b, 0x79, 0x75, 0x6e, 0x3b, 0x79, 0x75,
+0x6c, 0x3b, 0x67, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x74, 0x3b, 0x74, 0x6f,
+0x62, 0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64, 0x65, 0x6b, 0x79, 0x61, 0x6e,
+0x3b, 0x66, 0x65, 0x62, 0x3b, 0x6d, 0xe4, 0x7a, 0x3b, 0x70, 0x72, 0x6c,
+0x3b, 0x6d, 0x61, 0x79, 0x3b, 0x79, 0x75, 0x6e, 0x3b, 0x79, 0x75, 0x6c,
+0x3b, 0x67, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x74, 0x3b, 0x74, 0x6f, 0x6e,
+0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64, 0x65, 0x6b, 0x59, 0x3b, 0x46, 0x3b,
+0x4d, 0x3b, 0x50, 0x3b, 0x4d, 0x3b, 0x59, 0x3b, 0x59, 0x3b, 0x47, 0x3b,
+0x53, 0x3b, 0x54, 0x3b, 0x4e, 0x3b, 0x44, 0x4a, 0x65, 0x6e, 0x6e, 0x65,
+0x72, 0x3b, 0x48, 0x6f, 0x72, 0x6e, 0x69, 0x67, 0x3b, 0x4d, 0xe4, 0x72,
+0x7a, 0x65, 0x3b, 0x41, 0x62, 0x72, 0x69, 0x6c, 0x6c, 0x65, 0x3b, 0x4d,
+0x65, 0x69, 0x6a, 0x65, 0x3b, 0x42, 0x72, 0xe1, 0x10d, 0x65, 0x74, 0x3b,
+0x48, 0x65, 0x69, 0x77, 0x65, 0x74, 0x3b, 0xd6, 0x69, 0x67, 0x161, 0x74,
+0x65, 0x3b, 0x48, 0x65, 0x72, 0x62, 0x161, 0x74, 0x6d, 0xe1, 0x6e, 0x65,
+0x74, 0x3b, 0x57, 0xed, 0x6d, 0xe1, 0x6e, 0x65, 0x74, 0x3b, 0x57, 0x69,
+0x6e, 0x74, 0x65, 0x72, 0x6d, 0xe1, 0x6e, 0x65, 0x74, 0x3b, 0x43, 0x68,
+0x72, 0x69, 0x161, 0x74, 0x6d, 0xe1, 0x6e, 0x65, 0x74, 0x4a, 0x65, 0x6e,
+0x3b, 0x48, 0x6f, 0x72, 0x3b, 0x4d, 0xe4, 0x72, 0x3b, 0x41, 0x62, 0x72,
+0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x42, 0x72, 0xe1, 0x3b, 0x48, 0x65, 0x69,
+0x3b, 0xd6, 0x69, 0x67, 0x3b, 0x48, 0x65, 0x72, 0x3b, 0x57, 0xed, 0x6d,
+0x3b, 0x57, 0x69, 0x6e, 0x3b, 0x43, 0x68, 0x72, 0x4a, 0x3b, 0x48, 0x3b,
+0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x42, 0x3b, 0x48, 0x3b, 0xd6, 0x3b,
+0x48, 0x3b, 0x57, 0x3b, 0x57, 0x3b, 0x43, 0x49, 0x6f, 0x6e, 0x61, 0x77,
+0x72, 0x3b, 0x43, 0x68, 0x77, 0x65, 0x66, 0x72, 0x6f, 0x72, 0x3b, 0x4d,
+0x61, 0x77, 0x72, 0x74, 0x68, 0x3b, 0x45, 0x62, 0x72, 0x69, 0x6c, 0x6c,
+0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4d, 0x65, 0x68, 0x65, 0x66, 0x69, 0x6e,
+0x3b, 0x47, 0x6f, 0x72, 0x66, 0x66, 0x65, 0x6e, 0x6e, 0x61, 0x66, 0x3b,
+0x41, 0x77, 0x73, 0x74, 0x3b, 0x4d, 0x65, 0x64, 0x69, 0x3b, 0x48, 0x79,
+0x64, 0x72, 0x65, 0x66, 0x3b, 0x54, 0x61, 0x63, 0x68, 0x77, 0x65, 0x64,
+0x64, 0x3b, 0x52, 0x68, 0x61, 0x67, 0x66, 0x79, 0x72, 0x49, 0x6f, 0x6e,
+0x3b, 0x43, 0x68, 0x77, 0x3b, 0x4d, 0x61, 0x77, 0x3b, 0x45, 0x62, 0x72,
+0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4d, 0x65, 0x68, 0x3b, 0x47, 0x6f, 0x72,
+0x3b, 0x41, 0x77, 0x73, 0x74, 0x3b, 0x4d, 0x65, 0x64, 0x69, 0x3b, 0x48,
+0x79, 0x64, 0x3b, 0x54, 0x61, 0x63, 0x68, 0x3b, 0x52, 0x68, 0x61, 0x67,
+0x49, 0x6f, 0x6e, 0x3b, 0x43, 0x68, 0x77, 0x65, 0x66, 0x3b, 0x4d, 0x61,
+0x77, 0x3b, 0x45, 0x62, 0x72, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4d, 0x65,
+0x68, 0x3b, 0x47, 0x6f, 0x72, 0x66, 0x66, 0x3b, 0x41, 0x77, 0x73, 0x74,
+0x3b, 0x4d, 0x65, 0x64, 0x69, 0x3b, 0x48, 0x79, 0x64, 0x3b, 0x54, 0x61,
+0x63, 0x68, 0x3b, 0x52, 0x68, 0x61, 0x67, 0x49, 0x3b, 0x43, 0x68, 0x3b,
+0x4d, 0x3b, 0x45, 0x3b, 0x4d, 0x3b, 0x4d, 0x3b, 0x47, 0x3b, 0x41, 0x3b,
+0x4d, 0x3b, 0x48, 0x3b, 0x54, 0x3b, 0x52, 0x68, 0x4a, 0x61, 0x6e, 0x6e,
+0x65, 0x77, 0x61, 0x72, 0x69, 0x73, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x65,
+0x77, 0x61, 0x72, 0x69, 0x73, 0x3b, 0x4d, 0x61, 0x61, 0x72, 0x74, 0x3b,
+0x41, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x61, 0x61, 0x69, 0x65, 0x3b,
+0x4a, 0x75, 0x6e, 0x79, 0x3b, 0x4a, 0x75, 0x6c, 0x79, 0x3b, 0x41, 0x75,
+0x67, 0x75, 0x73, 0x74, 0x75, 0x73, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x69,
+0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72,
+0x3b, 0x4e, 0x6f, 0x76, 0x69, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x44, 0x65,
+0x73, 0x69, 0x6d, 0x62, 0x65, 0x72, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65,
+0x62, 0x3b, 0x4d, 0x72, 0x74, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x61,
+0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x75,
+0x67, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f,
+0x76, 0x3b, 0x44, 0x65, 0x73, 0x53, 0x61, 0x6d, 0x77, 0x69, 0x79, 0x65,
+0x65, 0x3b, 0x46, 0x65, 0x77, 0x72, 0x69, 0x79, 0x65, 0x65, 0x3b, 0x4d,
+0x61, 0x72, 0x73, 0x3b, 0x41, 0x77, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x65,
+0x65, 0x3b, 0x53, 0x75, 0x77, 0x65, 0x3b, 0x53, 0x75, 0x6c, 0x65, 0x74,
+0x3b, 0x55, 0x74, 0x3b, 0x53, 0xe0, 0x74, 0x74, 0x75, 0x6d, 0x62, 0x61,
+0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x6f, 0x62, 0x61, 0x72, 0x3b, 0x4e,
+0x6f, 0x77, 0xe0, 0x6d, 0x62, 0x61, 0x72, 0x3b, 0x44, 0x65, 0x73, 0xe0,
+0x6d, 0x62, 0x61, 0x72, 0x53, 0x61, 0x6d, 0x3b, 0x46, 0x65, 0x77, 0x3b,
+0x4d, 0x61, 0x72, 0x3b, 0x41, 0x77, 0x72, 0x3b, 0x4d, 0x65, 0x65, 0x3b,
+0x53, 0x75, 0x77, 0x3b, 0x53, 0x75, 0x6c, 0x3b, 0x55, 0x74, 0x3b, 0x53,
+0xe0, 0x74, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x77, 0x3b, 0x44,
+0x65, 0x73, 0x4a, 0x61, 0x6e, 0x79, 0x75, 0x77, 0x61, 0x72, 0x69, 0x3b,
+0x46, 0x65, 0x62, 0x72, 0x75, 0x77, 0x61, 0x72, 0x69, 0x3b, 0x4d, 0x61,
+0x74, 0x73, 0x68, 0x69, 0x3b, 0x45, 0x70, 0x72, 0x65, 0x6c, 0x69, 0x3b,
+0x4d, 0x65, 0x79, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75,
+0x6c, 0x61, 0x79, 0x69, 0x3b, 0x41, 0x67, 0x61, 0x73, 0x74, 0x69, 0x3b,
+0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4f, 0x6b, 0x74,
+0x68, 0x6f, 0x62, 0x61, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61,
+0x3b, 0x44, 0x69, 0x73, 0x65, 0x6d, 0x62, 0x61, 0x4a, 0x61, 0x6e, 0x79,
+0x75, 0x77, 0x61, 0x72, 0x69, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x75, 0x77,
+0x61, 0x72, 0x69, 0x3b, 0x4d, 0x61, 0x74, 0x73, 0x68, 0x69, 0x3b, 0x45,
+0x70, 0x72, 0x65, 0x6c, 0x69, 0x3b, 0x4d, 0x65, 0x79, 0x69, 0x3b, 0x4a,
+0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x61, 0x79, 0x69, 0x3b, 0x41,
+0x67, 0x61, 0x73, 0x74, 0x69, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d,
+0x62, 0x61, 0x3b, 0x4f, 0x6b, 0x74, 0x68, 0x6f, 0x62, 0x68, 0x61, 0x3b,
+0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x44, 0x69, 0x73, 0x65,
+0x6d, 0x62, 0x61, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d,
+0x61, 0x74, 0x3b, 0x45, 0x70, 0x72, 0x3b, 0x4d, 0x65, 0x79, 0x3b, 0x4a,
+0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x61, 0x3b, 0x53,
+0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44,
+0x69, 0x73, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61,
+0x74, 0x3b, 0x45, 0x70, 0x72, 0x3b, 0x4d, 0x65, 0x79, 0x3b, 0x4a, 0x75,
+0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x61, 0x3b, 0x53, 0x65,
+0x70, 0x74, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44,
+0x69, 0x73, 0x70, 0x69, 0x6b, 0xed, 0x74, 0xed, 0x6b, 0xed, 0x74, 0x69,
+0x65, 0x2c, 0x20, 0x6f, 0xf3, 0x6c, 0xed, 0x20, 0xfa, 0x20, 0x6b, 0x75,
+0x74, 0xfa, 0x61, 0x6e, 0x3b, 0x73, 0x69, 0x25b, 0x79, 0x25b, 0x301, 0x2c,
+0x20, 0x6f, 0xf3, 0x6c, 0x69, 0x20, 0xfa, 0x20, 0x6b, 0xe1, 0x6e, 0x64,
+0xed, 0x25b, 0x3b, 0x254, 0x6e, 0x73, 0xfa, 0x6d, 0x62, 0x254, 0x6c, 0x2c,
+0x20, 0x6f, 0xf3, 0x6c, 0x69, 0x20, 0xfa, 0x20, 0x6b, 0xe1, 0x74, 0xe1,
+0x74, 0xfa, 0x25b, 0x3b, 0x6d, 0x65, 0x73, 0x69, 0x14b, 0x2c, 0x20, 0x6f,
+0xf3, 0x6c, 0x69, 0x20, 0xfa, 0x20, 0x6b, 0xe9, 0x6e, 0x69, 0x65, 0x3b,
+0x65, 0x6e, 0x73, 0x69, 0x6c, 0x2c, 0x20, 0x6f, 0xf3, 0x6c, 0x69, 0x20,
+0xfa, 0x20, 0x6b, 0xe1, 0x74, 0xe1, 0x6e, 0x75, 0x25b, 0x3b, 0x254, 0x73,
+0x254, 0x6e, 0x3b, 0x65, 0x66, 0x75, 0x74, 0x65, 0x3b, 0x70, 0x69, 0x73,
+0x75, 0x79, 0xfa, 0x3b, 0x69, 0x6d, 0x25b, 0x14b, 0x20, 0x69, 0x20, 0x70,
+0x75, 0x254, 0x73, 0x3b, 0x69, 0x6d, 0x25b, 0x14b, 0x20, 0x69, 0x20, 0x70,
+0x75, 0x74, 0xfa, 0x6b, 0x2c, 0x6f, 0xf3, 0x6c, 0x69, 0x20, 0xfa, 0x20,
+0x6b, 0xe1, 0x74, 0xed, 0x25b, 0x3b, 0x6d, 0x61, 0x6b, 0x61, 0x6e, 0x64,
+0x69, 0x6b, 0x25b, 0x3b, 0x70, 0x69, 0x6c, 0x254, 0x6e, 0x64, 0x254, 0x301,
+0x6f, 0x2e, 0x31, 0x3b, 0x6f, 0x2e, 0x32, 0x3b, 0x6f, 0x2e, 0x33, 0x3b,
+0x6f, 0x2e, 0x34, 0x3b, 0x6f, 0x2e, 0x35, 0x3b, 0x6f, 0x2e, 0x36, 0x3b,
+0x6f, 0x2e, 0x37, 0x3b, 0x6f, 0x2e, 0x38, 0x3b, 0x6f, 0x2e, 0x39, 0x3b,
+0x6f, 0x2e, 0x31, 0x30, 0x3b, 0x6f, 0x2e, 0x31, 0x31, 0x3b, 0x6f, 0x2e,
+0x31, 0x32, 0x5d9, 0x5d0, 0x5b7, 0x5e0, 0x5d5, 0x5d0, 0x5b7, 0x5e8, 0x3b, 0x5e4,
+0x5bf, 0x5e2, 0x5d1, 0x5e8, 0x5d5, 0x5d0, 0x5b7, 0x5e8, 0x3b, 0x5de, 0x5e2, 0x5e8,
+0x5e5, 0x3b, 0x5d0, 0x5b7, 0x5e4, 0x5bc, 0x5e8, 0x5d9, 0x5dc, 0x3b, 0x5de, 0x5d9,
+0x5d9, 0x3b, 0x5d9, 0x5d5, 0x5e0, 0x5d9, 0x3b, 0x5d9, 0x5d5, 0x5dc, 0x5d9, 0x3b,
+0x5d0, 0x5d5, 0x5d9, 0x5d2, 0x5d5, 0x5e1, 0x5d8, 0x3b, 0x5e1, 0x5e2, 0x5e4, 0x5bc,
+0x5d8, 0x5e2, 0x5de, 0x5d1, 0x5e2, 0x5e8, 0x3b, 0x5d0, 0x5e7, 0x5d8, 0x5d0, 0x5d1,
+0x5e2, 0x5e8, 0x3b, 0x5e0, 0x5d0, 0x5d5, 0x5d5, 0x5e2, 0x5de, 0x5d1, 0x5e2, 0x5e8,
+0x3b, 0x5d3, 0x5e2, 0x5e6, 0x5e2, 0x5de, 0x5d1, 0x5e2, 0x5e8, 0x5d9, 0x5d0, 0x5b7,
+0x5e0, 0x3b, 0x5e4, 0x5bf, 0x5e2, 0x5d1, 0x3b, 0x5de, 0x5e2, 0x5e8, 0x5e5, 0x3b,
+0x5d0, 0x5b7, 0x5e4, 0x5bc, 0x5e8, 0x3b, 0x5de, 0x5d9, 0x5d9, 0x3b, 0x5d9, 0x5d5,
+0x5e0, 0x5d9, 0x3b, 0x5d9, 0x5d5, 0x5dc, 0x5d9, 0x3b, 0x5d0, 0x5d5, 0x5d9, 0x5d2,
+0x3b, 0x5e1, 0x5e2, 0x5e4, 0x5bc, 0x3b, 0x5d0, 0x5e7, 0x5d8, 0x3b, 0x5e0, 0x5d0,
+0x5d5, 0x5d5, 0x3b, 0x5d3, 0x5e2, 0x5e6, 0x1e62, 0x1eb9, 0x301, 0x72, 0x1eb9, 0x301,
+0x3b, 0xc8, 0x72, 0xe8, 0x6c, 0xe8, 0x3b, 0x1eb8, 0x72, 0x1eb9, 0x300, 0x6e,
+0xe0, 0x3b, 0xcc, 0x67, 0x62, 0xe9, 0x3b, 0x1eb8, 0x300, 0x62, 0x69, 0x62,
+0x69, 0x3b, 0xd2, 0x6b, 0xfa, 0x64, 0x75, 0x3b, 0x41, 0x67, 0x1eb9, 0x6d,
+0x1ecd, 0x3b, 0xd2, 0x67, 0xfa, 0x6e, 0x3b, 0x4f, 0x77, 0x65, 0x77, 0x65,
+0x3b, 0x1ecc, 0x300, 0x77, 0xe0, 0x72, 0xe0, 0x3b, 0x42, 0xe9, 0x6c, 0xfa,
+0x3b, 0x1ecc, 0x300, 0x70, 0x1eb9, 0x300, 0x4f, 0x1e63, 0xf9, 0x20, 0x1e62, 0x1eb9,
+0x301, 0x72, 0x1eb9, 0x301, 0x3b, 0x4f, 0x1e63, 0xf9, 0x20, 0xc8, 0x72, 0xe8,
+0x6c, 0xe8, 0x3b, 0x4f, 0x1e63, 0xf9, 0x20, 0x1eb8, 0x72, 0x1eb9, 0x300, 0x6e,
+0xe0, 0x3b, 0x4f, 0x1e63, 0xf9, 0x20, 0xcc, 0x67, 0x62, 0xe9, 0x3b, 0x4f,
+0x1e63, 0xf9, 0x20, 0x1eb8, 0x300, 0x62, 0x69, 0x62, 0x69, 0x3b, 0x4f, 0x1e63,
+0xf9, 0x20, 0xd2, 0x6b, 0xfa, 0x64, 0x75, 0x3b, 0x4f, 0x1e63, 0xf9, 0x20,
+0x41, 0x67, 0x1eb9, 0x6d, 0x1ecd, 0x3b, 0x4f, 0x1e63, 0xf9, 0x20, 0xd2, 0x67,
+0xfa, 0x6e, 0x3b, 0x4f, 0x1e63, 0xf9, 0x20, 0x4f, 0x77, 0x65, 0x77, 0x65,
+0x3b, 0x4f, 0x1e63, 0xf9, 0x20, 0x1ecc, 0x300, 0x77, 0xe0, 0x72, 0xe0, 0x3b,
+0x4f, 0x1e63, 0xf9, 0x20, 0x42, 0xe9, 0x6c, 0xfa, 0x3b, 0x4f, 0x1e63, 0xf9,
+0x20, 0x1ecc, 0x300, 0x70, 0x1eb9, 0x300, 0x1e62, 0x1eb9, 0x301, 0x3b, 0xc8, 0x72,
+0x3b, 0x1eb8, 0x72, 0x3b, 0xcc, 0x67, 0x3b, 0x1eb8, 0x300, 0x62, 0x3b, 0xd2,
+0x6b, 0x3b, 0x41, 0x67, 0x3b, 0xd2, 0x67, 0x3b, 0x4f, 0x77, 0x3b, 0x1ecc,
+0x300, 0x77, 0x3b, 0x42, 0xe9, 0x3b, 0x1ecc, 0x300, 0x70, 0x1e62, 0x1eb9, 0x301,
+0x72, 0x3b, 0xc8, 0x72, 0xe8, 0x6c, 0x3b, 0x1eb8, 0x72, 0x1eb9, 0x300, 0x6e,
+0x3b, 0xcc, 0x67, 0x62, 0x3b, 0x1eb8, 0x300, 0x62, 0x69, 0x3b, 0xd2, 0x6b,
+0xfa, 0x3b, 0x41, 0x67, 0x1eb9, 0x3b, 0xd2, 0x67, 0xfa, 0x3b, 0x4f, 0x77,
+0x65, 0x3b, 0x1ecc, 0x300, 0x77, 0xe0, 0x3b, 0x42, 0xe9, 0x6c, 0x3b, 0x1ecc,
+0x300, 0x70, 0x1eb9, 0x53, 0x3b, 0xc8, 0x3b, 0x1eb8, 0x3b, 0xcc, 0x3b, 0x1eb8,
+0x300, 0x3b, 0xd2, 0x3b, 0x41, 0x3b, 0xd2, 0x3b, 0x4f, 0x3b, 0x1ecc, 0x300,
+0x3b, 0x42, 0x3b, 0x1ecc, 0x300, 0x53, 0x68, 0x25b, 0x301, 0x72, 0x25b, 0x301,
+0x3b, 0xc8, 0x72, 0xe8, 0x6c, 0xe8, 0x3b, 0x190, 0x72, 0x25b, 0x300, 0x6e,
+0xe0, 0x3b, 0xcc, 0x67, 0x62, 0xe9, 0x3b, 0x190, 0x300, 0x62, 0x69, 0x62,
+0x69, 0x3b, 0xd2, 0x6b, 0xfa, 0x64, 0x75, 0x3b, 0x41, 0x67, 0x25b, 0x6d,
+0x254, 0x3b, 0xd2, 0x67, 0xfa, 0x6e, 0x3b, 0x4f, 0x77, 0x65, 0x77, 0x65,
+0x3b, 0x186, 0x300, 0x77, 0xe0, 0x72, 0xe0, 0x3b, 0x42, 0xe9, 0x6c, 0xfa,
+0x3b, 0x186, 0x300, 0x70, 0x25b, 0x300, 0x4f, 0x73, 0x68, 0xf9, 0x20, 0x53,
+0x68, 0x25b, 0x301, 0x72, 0x25b, 0x301, 0x3b, 0x4f, 0x73, 0x68, 0xf9, 0x20,
+0xc8, 0x72, 0xe8, 0x6c, 0xe8, 0x3b, 0x4f, 0x73, 0x68, 0xf9, 0x20, 0x190,
+0x72, 0x25b, 0x300, 0x6e, 0xe0, 0x3b, 0x4f, 0x73, 0x68, 0xf9, 0x20, 0xcc,
+0x67, 0x62, 0xe9, 0x3b, 0x4f, 0x73, 0x68, 0xf9, 0x20, 0x190, 0x300, 0x62,
+0x69, 0x62, 0x69, 0x3b, 0x4f, 0x73, 0x68, 0xf9, 0x20, 0xd2, 0x6b, 0xfa,
+0x64, 0x75, 0x3b, 0x4f, 0x73, 0x68, 0xf9, 0x20, 0x41, 0x67, 0x25b, 0x6d,
+0x254, 0x3b, 0x4f, 0x73, 0x68, 0xf9, 0x20, 0xd2, 0x67, 0xfa, 0x6e, 0x3b,
+0x4f, 0x73, 0x68, 0xf9, 0x20, 0x4f, 0x77, 0x65, 0x77, 0x65, 0x3b, 0x4f,
+0x73, 0x68, 0xf9, 0x20, 0x186, 0x300, 0x77, 0xe0, 0x72, 0xe0, 0x3b, 0x4f,
+0x73, 0x68, 0xf9, 0x20, 0x42, 0xe9, 0x6c, 0xfa, 0x3b, 0x4f, 0x73, 0x68,
+0xf9, 0x20, 0x186, 0x300, 0x70, 0x25b, 0x300, 0x53, 0x68, 0x25b, 0x301, 0x3b,
+0xc8, 0x72, 0x3b, 0x190, 0x72, 0x3b, 0xcc, 0x67, 0x3b, 0x190, 0x300, 0x62,
+0x3b, 0xd2, 0x6b, 0x3b, 0x41, 0x67, 0x3b, 0xd2, 0x67, 0x3b, 0x4f, 0x77,
+0x3b, 0x186, 0x300, 0x77, 0x3b, 0x42, 0xe9, 0x3b, 0x186, 0x300, 0x70, 0x53,
+0x68, 0x25b, 0x301, 0x72, 0x3b, 0xc8, 0x72, 0xe8, 0x6c, 0x3b, 0x190, 0x72,
+0x25b, 0x300, 0x6e, 0x3b, 0xcc, 0x67, 0x62, 0x3b, 0x190, 0x300, 0x62, 0x69,
+0x3b, 0xd2, 0x6b, 0xfa, 0x3b, 0x41, 0x67, 0x25b, 0x3b, 0xd2, 0x67, 0xfa,
+0x3b, 0x4f, 0x77, 0x65, 0x3b, 0x186, 0x300, 0x77, 0xe0, 0x3b, 0x42, 0xe9,
+0x6c, 0x3b, 0x186, 0x300, 0x70, 0x25b, 0x53, 0x3b, 0xc8, 0x3b, 0x190, 0x3b,
+0xcc, 0x3b, 0x190, 0x300, 0x3b, 0xd2, 0x3b, 0x41, 0x3b, 0xd2, 0x3b, 0x4f,
+0x3b, 0x186, 0x300, 0x3b, 0x42, 0x3b, 0x186, 0x300, 0x6e, 0x64, 0x77, 0x65,
+0x6e, 0x69, 0x74, 0x3b, 0x6e, 0x64, 0x77, 0x65, 0x6e, 0x6e, 0x67, 0x65,
+0x69, 0x68, 0x3b, 0x6e, 0x64, 0x77, 0x65, 0x6e, 0x73, 0x61, 0x6d, 0x3b,
+0x6e, 0x64, 0x77, 0x65, 0x6e, 0x73, 0x65, 0x69, 0x71, 0x3b, 0x6e, 0x64,
+0x77, 0x65, 0x6e, 0x6e, 0x67, 0x75, 0x78, 0x3b, 0x6e, 0x64, 0x77, 0x65,
+0x6e, 0x6c, 0x6f, 0x65, 0x67, 0x3b, 0x6e, 0x64, 0x77, 0x65, 0x6e, 0x63,
+0x61, 0x65, 0x74, 0x3b, 0x6e, 0x64, 0x77, 0x65, 0x6e, 0x62, 0x65, 0x74,
+0x3b, 0x6e, 0x64, 0x77, 0x65, 0x6e, 0x67, 0x6f, 0x75, 0x6a, 0x3b, 0x6e,
+0x64, 0x77, 0x65, 0x6e, 0x63, 0x69, 0x62, 0x3b, 0x6e, 0x64, 0x77, 0x65,
+0x6e, 0x63, 0x69, 0x62, 0x2019, 0x69, 0x74, 0x3b, 0x6e, 0x64, 0x77, 0x65,
+0x6e, 0x63, 0x69, 0x62, 0x6e, 0x67, 0x65, 0x69, 0x68, 0x4a, 0x61, 0x6e,
+0x75, 0x77, 0x61, 0x72, 0x69, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x75, 0x77,
+0x61, 0x72, 0x69, 0x3b, 0x4d, 0x61, 0x73, 0x68, 0x69, 0x3b, 0x45, 0x70,
+0x68, 0x72, 0x65, 0x6c, 0x69, 0x3b, 0x4d, 0x65, 0x79, 0x69, 0x3b, 0x4a,
+0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x61, 0x79, 0x69, 0x3b, 0x41,
+0x67, 0x61, 0x73, 0x74, 0x69, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x68, 0x65,
+0x6d, 0x62, 0x61, 0x3b, 0x4f, 0x6b, 0x74, 0x68, 0x6f, 0x62, 0x61, 0x3b,
+0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x44, 0x69, 0x73, 0x65,
+0x6d, 0x62, 0x61, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d,
+0x61, 0x73, 0x3b, 0x45, 0x70, 0x68, 0x3b, 0x4d, 0x65, 0x79, 0x3b, 0x4a,
+0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x61, 0x3b, 0x53,
+0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44,
+0x69, 0x73, 0x4a, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x45, 0x3b, 0x4d, 0x3b,
+0x4a, 0x3b, 0x4a, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b,
+0x44, 0x31, 0x2d, 0x4b, 0x79, 0x73, 0xe3, 0x3b, 0x32, 0x2d, 0x4b, 0x79,
+0x73, 0xe3, 0x3b, 0x33, 0x2d, 0x4b, 0x79, 0x73, 0xe3, 0x3b, 0x34, 0x2d,
+0x4b, 0x79, 0x73, 0xe3, 0x3b, 0x35, 0x2d, 0x4b, 0x79, 0x73, 0xe3, 0x3b,
+0x36, 0x2d, 0x4b, 0x79, 0x73, 0xe3, 0x3b, 0x37, 0x2d, 0x4b, 0x79, 0x73,
+0xe3, 0x3b, 0x38, 0x2d, 0x4b, 0x79, 0x73, 0xe3, 0x3b, 0x39, 0x2d, 0x4b,
+0x79, 0x73, 0xe3, 0x3b, 0x31, 0x30, 0x2d, 0x4b, 0x79, 0x73, 0xe3, 0x3b,
+0x31, 0x31, 0x2d, 0x4b, 0x79, 0x73, 0xe3, 0x3b, 0x31, 0x32, 0x2d, 0x4b,
+0x79, 0x73, 0xe3, 0x31, 0x4b, 0x79, 0x2e, 0x3b, 0x32, 0x4b, 0x79, 0x2e,
+0x3b, 0x33, 0x4b, 0x79, 0x2e, 0x3b, 0x34, 0x4b, 0x79, 0x2e, 0x3b, 0x35,
+0x4b, 0x79, 0x2e, 0x3b, 0x36, 0x4b, 0x79, 0x2e, 0x3b, 0x37, 0x4b, 0x79,
+0x2e, 0x3b, 0x38, 0x4b, 0x79, 0x2e, 0x3b, 0x39, 0x4b, 0x79, 0x2e, 0x3b,
+0x31, 0x30, 0x4b, 0x79, 0x2e, 0x3b, 0x31, 0x31, 0x4b, 0x79, 0x2e, 0x3b,
+0x31, 0x32, 0x4b, 0x79, 0x2e, 0x31, 0x4b, 0x3b, 0x32, 0x4b, 0x3b, 0x33,
+0x4b, 0x3b, 0x34, 0x4b, 0x3b, 0x35, 0x4b, 0x3b, 0x36, 0x4b, 0x3b, 0x37,
+0x4b, 0x3b, 0x38, 0x4b, 0x3b, 0x39, 0x4b, 0x3b, 0x31, 0x30, 0x4b, 0x3b,
+0x31, 0x31, 0x4b, 0x3b, 0x31, 0x32, 0x4b, 0x79, 0x65, 0x70, 0xe9, 0x3b,
+0x6d, 0x75, 0x6b, 0x169, 0x69, 0x3b, 0x6d, 0x75, 0x73, 0x61, 0x70, 0xed,
+0x72, 0x69, 0x3b, 0x69, 0x72, 0x169, 0x64, 0xed, 0x3b, 0x70, 0xfa, 0x3b,
+0x70, 0xfa, 0x2d, 0x79, 0x65, 0x70, 0xe9, 0x3b, 0x70, 0xfa, 0x2d, 0x6d,
+0x75, 0x6b, 0x169, 0x69, 0x3b, 0x70, 0xfa, 0x2d, 0x6d, 0x75, 0x73, 0x61,
+0x70, 0xed, 0x72, 0x69, 0x3b, 0x70, 0xfa, 0x2d, 0x69, 0x72, 0x169, 0x64,
+0xed, 0x3b, 0x79, 0x65, 0x70, 0xe9, 0x2d, 0x70, 0x75, 0x74, 0x69, 0x6d,
+0x61, 0xe3, 0x3b, 0x79, 0x65, 0x70, 0xe9, 0x2d, 0x79, 0x65, 0x70, 0xe9,
+0x3b, 0x79, 0x65, 0x70, 0xe9, 0x2d, 0x6d, 0x75, 0x6b, 0x169, 0x69, 0x79,
+0x65, 0x3b, 0x6d, 0x6b, 0x3b, 0x6d, 0x73, 0x3b, 0x69, 0x64, 0x3b, 0x70,
+0x75, 0x3b, 0x70, 0x79, 0x3b, 0x70, 0x6d, 0x3b, 0x70, 0x73, 0x3b, 0x70,
+0x69, 0x3b, 0x79, 0x70, 0x3b, 0x79, 0x79, 0x3b, 0x79, 0x6d, 0x59, 0x3b,
+0x4d, 0x3b, 0x4d, 0x3b, 0x49, 0x3b, 0x50, 0x3b, 0x50, 0x3b, 0x50, 0x3b,
+0x50, 0x3b, 0x50, 0x3b, 0x59, 0x3b, 0x59, 0x3b, 0x59, 0x91c, 0x928, 0x935,
+0x930, 0x940, 0x3b, 0x92b, 0x930, 0x935, 0x930, 0x940, 0x3b, 0x92e, 0x93e, 0x930,
+0x94d, 0x91a, 0x3b, 0x905, 0x92a, 0x94d, 0x930, 0x948, 0x932, 0x3b, 0x92e, 0x908,
+0x3b, 0x91c, 0x942, 0x928, 0x3b, 0x91c, 0x941, 0x932, 0x93e, 0x908, 0x3b, 0x905,
+0x917, 0x938, 0x94d, 0x924, 0x3b, 0x938, 0x93f, 0x924, 0x92e, 0x94d, 0x92c, 0x930,
+0x3b, 0x905, 0x915, 0x94d, 0x91f, 0x942, 0x92c, 0x930, 0x3b, 0x928, 0x935, 0x92e,
+0x94d, 0x92c, 0x930, 0x3b, 0x926, 0x93f, 0x938, 0x902, 0x92c, 0x930, 0x4a, 0x61,
+0x6e, 0x65, 0x77, 0x6f, 0x6f, 0x72, 0x65, 0x3b, 0x46, 0x65, 0x62, 0x72,
+0x65, 0x77, 0x6f, 0x6f, 0x72, 0x65, 0x3b, 0x4d, 0x61, 0x61, 0x72, 0x74,
+0x73, 0x3b, 0x41, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x65, 0x69, 0x3b,
+0x4a, 0xfc, 0xfc, 0x6e, 0x65, 0x3b, 0x4a, 0xfc, 0xfc, 0x6c, 0x65, 0x3b,
+0x41, 0x75, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65,
+0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x75, 0x75, 0x62, 0x65,
+0x72, 0x3b, 0x4e, 0x6f, 0x66, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x44,
+0x65, 0x74, 0x73, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x4a, 0x61, 0x6e, 0x3b,
+0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x70, 0x72, 0x3b,
+0x4d, 0x65, 0x69, 0x3b, 0x4a, 0xfc, 0x6e, 0x3b, 0x4a, 0xfc, 0x6c, 0x3b,
+0x41, 0x75, 0x67, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b,
+0x4e, 0x6f, 0x66, 0x3b, 0x44, 0x65, 0x74, 0x6d, 0x75, 0x6e, 0x20, 0x23,
+0x31, 0x3b, 0x6d, 0x75, 0x6e, 0x20, 0x23, 0x32, 0x3b, 0x6d, 0x75, 0x6e,
+0x20, 0x23, 0x33, 0x3b, 0x6d, 0x75, 0x6e, 0x20, 0x23, 0x34, 0x3b, 0x6d,
+0x75, 0x6e, 0x20, 0x23, 0x35, 0x3b, 0x6d, 0x75, 0x6e, 0x20, 0x23, 0x36,
+0x3b, 0x6d, 0x75, 0x6e, 0x20, 0x23, 0x37, 0x3b, 0x6d, 0x75, 0x6e, 0x20,
+0x23, 0x38, 0x3b, 0x6d, 0x75, 0x6e, 0x20, 0x23, 0x39, 0x3b, 0x6d, 0x75,
+0x6e, 0x20, 0x23, 0x31, 0x30, 0x3b, 0x6d, 0x75, 0x6e, 0x20, 0x23, 0x31,
+0x31, 0x3b, 0x6d, 0x75, 0x6e, 0x20, 0x23, 0x31, 0x32, 0x4a, 0x61, 0x6e,
+0x75, 0x61, 0x72, 0x65, 0x3b, 0x46, 0x65, 0x62, 0x75, 0x61, 0x72, 0x65,
+0x3b, 0x4d, 0x61, 0x73, 0x3b, 0x45, 0x70, 0x72, 0x65, 0x6c, 0x3b, 0x4d,
+0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x61, 0x65,
+0x3b, 0x4f, 0x67, 0x75, 0x73, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d,
+0x62, 0x61, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x61, 0x3b, 0x4e, 0x6f,
+0x76, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x44, 0x69, 0x73, 0x65, 0x6d, 0x62,
+0x61, 0x62c, 0x646, 0x648, 0x631, 0x6cc, 0x3b, 0x67e, 0x631, 0x648, 0x631, 0x6cc,
+0x3b, 0x645, 0x627, 0x631, 0x686, 0x3b, 0x627, 0x67e, 0x631, 0x6ce, 0x644, 0x3b,
+0x645, 0x626, 0x6cc, 0x6cc, 0x3b, 0x62c, 0x648, 0x646, 0x3b, 0x62c, 0x6c6, 0x644,
+0x627, 0x6cc, 0x6cc, 0x3b, 0x627, 0x6af, 0x633, 0x62a, 0x3b, 0x633, 0x62a, 0x645,
+0x628, 0x631, 0x3b, 0x627, 0x6a9, 0x62a, 0x648, 0x628, 0x631, 0x3b, 0x646, 0x626,
+0x648, 0x645, 0x628, 0x631, 0x3b, 0x62f, 0x633, 0x645, 0x628, 0x631, 0x62c, 0x646,
+0x3b, 0x67e, 0x631, 0x3b, 0x645, 0x627, 0x631, 0x3b, 0x627, 0x67e, 0x631, 0x3b,
+0x645, 0x626, 0x6cc, 0x6cc, 0x3b, 0x62c, 0x648, 0x646, 0x3b, 0x62c, 0x6c6, 0x644,
+0x3b, 0x627, 0x6af, 0x633, 0x62a, 0x3b, 0x633, 0x62a, 0x645, 0x3b, 0x627, 0x6a9,
+0x62a, 0x3b, 0x646, 0x626, 0x648, 0x645, 0x3b, 0x62f, 0x633, 0x645, 0x4a, 0x61,
+0x6e, 0x77, 0x61, 0x72, 0x69, 0x3b, 0x50, 0x61, 0x72, 0x77, 0x61, 0x72,
+0x69, 0x3b, 0x4d, 0xe1, 0x72, 0x63, 0x68, 0x3b, 0x41, 0x70, 0x72, 0xe9,
+0x6c, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0xf3,
+0x6c, 0xe1, 0x69, 0x3b, 0x41, 0x67, 0x61, 0x73, 0x74, 0x3b, 0x53, 0x61,
+0x74, 0x61, 0x6d, 0x62, 0x61, 0x72, 0x3b, 0x41, 0x6b, 0x74, 0x75, 0x62,
+0x61, 0x72, 0x3b, 0x4e, 0x61, 0x77, 0x61, 0x6d, 0x62, 0x61, 0x72, 0x3b,
+0x44, 0x61, 0x73, 0x61, 0x6d, 0x62, 0x61, 0x72, 0x4a, 0x61, 0x6e, 0x3b,
+0x50, 0x61, 0x72, 0x3b, 0x4d, 0xe1, 0x72, 0x3b, 0x41, 0x70, 0x72, 0x3b,
+0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0xf3, 0x6c, 0x3b,
+0x41, 0x67, 0x61, 0x3b, 0x53, 0x61, 0x74, 0x3b, 0x41, 0x6b, 0x74, 0x3b,
+0x4e, 0x61, 0x77, 0x3b, 0x44, 0x61, 0x73, 0x7a, 0x65, 0x6e, 0xe2, 0x3b,
+0x66, 0x72, 0x65, 0x76, 0xe2, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x6f, 0x3b,
+0x61, 0x72, 0x76, 0xee, 0x3b, 0x6d, 0x61, 0x7a, 0x7a, 0x6f, 0x3b, 0x7a,
+0x75, 0x67, 0x6e, 0x6f, 0x3b, 0x6c, 0x75, 0x67, 0x67, 0x69, 0x6f, 0x3b,
+0x61, 0x67, 0x6f, 0x73, 0x74, 0x6f, 0x3b, 0x73, 0x65, 0x74, 0x74, 0x65,
+0x6d, 0x62, 0x72, 0x65, 0x3b, 0x6f, 0x74, 0x74, 0x6f, 0x62, 0x72, 0x65,
+0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x64, 0x65,
+0x78, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x64, 0x65, 0x20, 0x7a, 0x65, 0x6e,
+0xe2, 0x3b, 0x64, 0x65, 0x20, 0x66, 0x72, 0x65, 0x76, 0xe2, 0x3b, 0x64,
+0x65, 0x20, 0x6d, 0x61, 0x72, 0x73, 0x6f, 0x3b, 0x64, 0x2019, 0x61, 0x72,
+0x76, 0xee, 0x3b, 0x64, 0x65, 0x20, 0x6d, 0x61, 0x7a, 0x7a, 0x6f, 0x3b,
+0x64, 0x65, 0x20, 0x7a, 0x75, 0x67, 0x6e, 0x6f, 0x3b, 0x64, 0x65, 0x20,
+0x6c, 0x75, 0x67, 0x67, 0x69, 0x6f, 0x3b, 0x64, 0x2019, 0x61, 0x67, 0x6f,
+0x73, 0x74, 0x6f, 0x3b, 0x64, 0x65, 0x20, 0x73, 0x65, 0x74, 0x74, 0x65,
+0x6d, 0x62, 0x72, 0x65, 0x3b, 0x64, 0x2019, 0x6f, 0x74, 0x74, 0x6f, 0x62,
+0x72, 0x65, 0x3b, 0x64, 0x65, 0x20, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62,
+0x72, 0x65, 0x3b, 0x64, 0x65, 0x20, 0x64, 0x65, 0x78, 0x65, 0x6d, 0x62,
+0x72, 0x65, 0x7a, 0x65, 0x6e, 0x2e, 0x3b, 0x66, 0x72, 0x65, 0x2e, 0x3b,
+0x6d, 0x61, 0x72, 0x2e, 0x3b, 0x61, 0x72, 0x76, 0x2e, 0x3b, 0x6d, 0x61,
+0x7a, 0x2e, 0x3b, 0x7a, 0x75, 0x67, 0x2e, 0x3b, 0x6c, 0x75, 0x67, 0x2e,
+0x3b, 0x61, 0x67, 0x6f, 0x2e, 0x3b, 0x73, 0x65, 0x74, 0x2e, 0x3b, 0x6f,
+0x74, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0x65, 0x78,
+0x2e, 0x64, 0x65, 0x20, 0x7a, 0x65, 0x6e, 0x2e, 0x3b, 0x64, 0x65, 0x20,
+0x66, 0x72, 0x65, 0x2e, 0x3b, 0x64, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x2e,
+0x3b, 0x64, 0x2019, 0x61, 0x72, 0x76, 0x2e, 0x3b, 0x64, 0x65, 0x20, 0x6d,
+0x61, 0x7a, 0x2e, 0x3b, 0x64, 0x65, 0x20, 0x7a, 0x75, 0x67, 0x2e, 0x3b,
+0x64, 0x65, 0x20, 0x6c, 0x75, 0x67, 0x2e, 0x3b, 0x64, 0x2019, 0x61, 0x67,
+0x6f, 0x2e, 0x3b, 0x64, 0x65, 0x20, 0x73, 0x65, 0x74, 0x2e, 0x3b, 0x64,
+0x2019, 0x6f, 0x74, 0x74, 0x2e, 0x3b, 0x64, 0x65, 0x20, 0x6e, 0x6f, 0x76,
+0x2e, 0x3b, 0x64, 0x65, 0x20, 0x64, 0x65, 0x78, 0x2e, 0x5a, 0x4e, 0x3b,
+0x46, 0x52, 0x3b, 0x4d, 0x52, 0x3b, 0x41, 0x52, 0x3b, 0x4d, 0x5a, 0x3b,
+0x5a, 0x47, 0x3b, 0x4c, 0x47, 0x3b, 0x41, 0x47, 0x3b, 0x53, 0x54, 0x3b,
+0x4f, 0x54, 0x3b, 0x4e, 0x56, 0x3b, 0x44, 0x58, 0x269, 0x6a, 0x69, 0x6b,
+0x61, 0x77, 0x1dd, 0x72, 0x6b, 0x61, 0x20, 0x6b, 0x61, 0x14b, 0x254, 0x72,
+0x254, 0x3b, 0x269, 0x6a, 0x69, 0x6b, 0x70, 0x61, 0x6b, 0x61, 0x20, 0x6b,
+0x61, 0x14b, 0x254, 0x72, 0x254, 0x3b, 0x61, 0x72, 0x25b, 0x301, 0x63, 0x69,
+0x6b, 0x61, 0x20, 0x6b, 0x61, 0x14b, 0x254, 0x72, 0x254, 0x3b, 0x6e, 0x6a,
+0x269, 0x62, 0x254, 0x20, 0x6e, 0x256, 0x28a, 0x6b, 0x61, 0x20, 0x6b, 0x61,
+0x14b, 0x254, 0x72, 0x254, 0x3b, 0x61, 0x63, 0x61, 0x66, 0x28a, 0x6e, 0x256,
+0x75, 0x6b, 0x61, 0x20, 0x6b, 0x61, 0x14b, 0x254, 0x72, 0x254, 0x3b, 0x61,
+0x6e, 0x254, 0x254, 0x256, 0x75, 0x6b, 0x61, 0x20, 0x6b, 0x61, 0x14b, 0x254,
+0x72, 0x254, 0x3b, 0x61, 0x6c, 0xe0, 0x6c, 0x61, 0x6b, 0x61, 0x20, 0x6b,
+0x61, 0x14b, 0x254, 0x72, 0x254, 0x3b, 0x269, 0x6a, 0x69, 0x6b, 0x1dd, 0x75,
+0x6b, 0x61, 0x20, 0x6b, 0x61, 0x14b, 0x254, 0x72, 0x254, 0x3b, 0x61, 0x62,
+0x6f, 0x66, 0x28a, 0x6d, 0x6b, 0x61, 0x20, 0x6b, 0x61, 0x14b, 0x254, 0x72,
+0x254, 0x3b, 0x269, 0x6a, 0x69, 0x63, 0x69, 0x6d, 0x6b, 0x61, 0x20, 0x6b,
+0x61, 0x14b, 0x254, 0x72, 0x254, 0x3b, 0x61, 0x63, 0x61, 0x70, 0x6f, 0x6d,
+0x6b, 0x61, 0x20, 0x6b, 0x61, 0x14b, 0x254, 0x72, 0x254, 0x3b, 0x61, 0x6e,
+0x254, 0x254, 0x62, 0x28a, 0x6e, 0x6b, 0x61, 0x20, 0x6b, 0x61, 0x14b, 0x254,
+0x72, 0x254, 0x6b, 0x61, 0x77, 0x3b, 0x6b, 0x70, 0x61, 0x3b, 0x63, 0x69,
+0x3b, 0x256, 0x28a, 0x3b, 0x256, 0x75, 0x35, 0x3b, 0x256, 0x75, 0x36, 0x3b,
+0x6c, 0x61, 0x3b, 0x6b, 0x1dd, 0x75, 0x3b, 0x66, 0x28a, 0x6d, 0x3b, 0x63,
+0x69, 0x6d, 0x3b, 0x70, 0x6f, 0x6d, 0x3b, 0x62, 0x28a, 0x6e, 0x6a, 0x65,
+0x6e, 0x61, 0x72, 0x6f, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x61, 0x72, 0x6f,
+0x3b, 0x6d, 0x61, 0x72, 0x73, 0x6f, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x6c,
+0x65, 0x3b, 0x6d, 0x61, 0x6a, 0x6f, 0x3b, 0x6a, 0x75, 0x67, 0x6e, 0x6f,
+0x3b, 0x6c, 0x75, 0x6a, 0x6f, 0x3b, 0x61, 0x67, 0x6f, 0x73, 0x74, 0x6f,
+0x3b, 0x73, 0x65, 0x74, 0x65, 0x6e, 0x62, 0x72, 0x65, 0x3b, 0x6f, 0x74,
+0x6f, 0x62, 0x72, 0x65, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6e, 0x62, 0x72,
+0x65, 0x3b, 0x64, 0x65, 0x73, 0x65, 0x6e, 0x62, 0x72, 0x65, 0x6a, 0x65,
+0x6e, 0x3b, 0x66, 0x65, 0x62, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x61, 0x70,
+0x72, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x6a, 0x75, 0x67, 0x3b, 0x6c, 0x75,
+0x6a, 0x3b, 0x61, 0x67, 0x6f, 0x3b, 0x73, 0x65, 0x74, 0x3b, 0x6f, 0x74,
+0x6f, 0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64, 0x65, 0x73, 0x4a, 0x3b, 0x46,
+0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x4c, 0x3b, 0x41,
+0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44
};
// GENERATED PART ENDS HERE
+} // namespace QtPrivate::Roman
+
QT_END_NAMESPACE
#endif
diff --git a/src/corelib/time/qromancalendar_p.h b/src/corelib/time/qromancalendar_p.h
index 4bf5b8eb84..96501ce701 100644
--- a/src/corelib/time/qromancalendar_p.h
+++ b/src/corelib/time/qromancalendar_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QROMAN_CALENDAR_P_H
#define QROMAN_CALENDAR_P_H
@@ -65,6 +29,12 @@ public:
bool isLunar() const override;
bool isLuniSolar() const override;
bool isSolar() const override;
+
+ // Names of months (implemented in qlocale.cpp):
+ QString monthName(const QLocale &locale, int month, int year,
+ QLocale::FormatType format) const override;
+ QString standaloneMonthName(const QLocale &locale, int month, int year,
+ QLocale::FormatType format) const override;
protected:
// locale support:
const QCalendarLocale *localeMonthIndexData() const override;
diff --git a/src/corelib/time/qtimezone.cpp b/src/corelib/time/qtimezone.cpp
index 57ddef4e2d..3a68277a6c 100644
--- a/src/corelib/time/qtimezone.cpp
+++ b/src/corelib/time/qtimezone.cpp
@@ -1,45 +1,11 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Copyright (C) 2013 John Layt <jlayt@kde.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2022 The Qt Company Ltd.
+// Copyright (C) 2013 John Layt <jlayt@kde.org>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qtimezone.h"
-#include "qtimezoneprivate_p.h"
+#if QT_CONFIG(timezone)
+# include "qtimezoneprivate_p.h"
+#endif
#include <QtCore/qdatastream.h>
#include <QtCore/qdatetime.h>
@@ -50,17 +16,13 @@
QT_BEGIN_NAMESPACE
+using namespace Qt::StringLiterals;
+
+#if QT_CONFIG(timezone)
// Create default time zone using appropriate backend
static QTimeZonePrivate *newBackendTimeZone()
{
-#ifdef QT_NO_SYSTEMLOCALE
-#if QT_CONFIG(icu)
- return new QIcuTimeZonePrivate();
-#else
- return new QUtcTimeZonePrivate();
-#endif
-#else
-#if defined Q_OS_MAC
+#if defined(Q_OS_DARWIN)
return new QMacTimeZonePrivate();
#elif defined(Q_OS_ANDROID)
return new QAndroidTimeZonePrivate();
@@ -68,26 +30,18 @@ static QTimeZonePrivate *newBackendTimeZone()
return new QTzTimeZonePrivate();
#elif QT_CONFIG(icu)
return new QIcuTimeZonePrivate();
-#elif defined Q_OS_WIN
+#elif defined(Q_OS_WIN)
return new QWinTimeZonePrivate();
#else
return new QUtcTimeZonePrivate();
-#endif // System Locales
-#endif // QT_NO_SYSTEMLOCALE
+#endif // Backend selection
}
// Create named time zone using appropriate backend
static QTimeZonePrivate *newBackendTimeZone(const QByteArray &ianaId)
{
Q_ASSERT(!ianaId.isEmpty());
-#ifdef QT_NO_SYSTEMLOCALE
-#if QT_CONFIG(icu)
- return new QIcuTimeZonePrivate(ianaId);
-#else
- return new QUtcTimeZonePrivate(ianaId);
-#endif
-#else
-#if defined Q_OS_MAC
+#if defined(Q_OS_DARWIN)
return new QMacTimeZonePrivate(ianaId);
#elif defined(Q_OS_ANDROID)
return new QAndroidTimeZonePrivate(ianaId);
@@ -95,12 +49,11 @@ static QTimeZonePrivate *newBackendTimeZone(const QByteArray &ianaId)
return new QTzTimeZonePrivate(ianaId);
#elif QT_CONFIG(icu)
return new QIcuTimeZonePrivate(ianaId);
-#elif defined Q_OS_WIN
+#elif defined(Q_OS_WIN)
return new QWinTimeZonePrivate(ianaId);
#else
return new QUtcTimeZonePrivate(ianaId);
-#endif // System Locales
-#endif // QT_NO_SYSTEMLOCALE
+#endif // Backend selection
}
class QTimeZoneSingleton
@@ -108,38 +61,89 @@ class QTimeZoneSingleton
public:
QTimeZoneSingleton() : backend(newBackendTimeZone()) {}
- // The backend_tz is the tz to use in static methods such as availableTimeZoneIds() and
- // isTimeZoneIdAvailable() and to create named IANA time zones. This is usually the host
- // system, but may be different if the host resources are insufficient or if
- // QT_NO_SYSTEMLOCALE is set. A simple UTC backend is used if no alternative is available.
+ // The global_tz is the tz to use in static methods such as
+ // availableTimeZoneIds() and isTimeZoneIdAvailable() and to create named
+ // IANA time zones. This is usually the host system, but may be different if
+ // the host resources are insufficient. A simple UTC backend is used if no
+ // alternative is available.
QExplicitlySharedDataPointer<QTimeZonePrivate> backend;
};
Q_GLOBAL_STATIC(QTimeZoneSingleton, global_tz);
+#endif // feature timezone
/*!
\class QTimeZone
\inmodule QtCore
\since 5.2
-
- \brief The QTimeZone class converts between UTC and local time in a specific
- time zone.
-
\threadsafe
- This class provides a stateless calculator for time zone conversions
- between UTC and the local time in a specific time zone. By default it uses
- the host system time zone data to perform these conversions.
+ \brief QTimeZone identifies how a time representation relates to UTC.
+
+ \compares equality
+
+ When dates and times are combined, the meaning of the result depends on how
+ time is being represented. There are various international standards for
+ representing time; one of these, UTC, corresponds to the traditional
+ standard of solar mean time at Greenwich (a.k.a. GMT). All other time
+ systems supported by Qt are ultimately specified in relation to UTC. An
+ instance of this class provides a stateless calculator for conversions
+ between UTC and other time representations.
+
+ Some time representations are simply defined at a fixed offset to UTC.
+ Others are defined by governments for use within their jurisdictions. The
+ latter are properly known as time zones, but QTimeZone (since Qt 6.5) is
+ unifies their representation with that of general time systems. One time
+ zone generally supported on most operating systems is designated local time;
+ this is presumed to correspond to the time zone within which the user is
+ living.
+
+ For time zones other than local time, UTC and those at fixed offsets from
+ UTC, Qt can only provide support when the operating system provides some way
+ to access that information. When Qt is built, the \c timezone feature
+ controls whether such information is available. When it is not, some
+ constructors and methods of QTimeZone are excluded from its API; these are
+ documented as depending on feature \c timezone. Note that, even when Qt is
+ built with this feature enabled, it may be unavailable to users whose
+ systems are misconfigured, or where some standard packages (for example, the
+ \c tzdata package on Linux) are not installed. This feature is enabled by
+ default when time zone information is available.
This class is primarily designed for use in QDateTime; most applications
- will not need to access this class directly and should instead use
- QDateTime with a Qt::TimeSpec of Qt::TimeZone.
+ will not need to access this class directly and should instead use an
+ instance of it when constructing a QDateTime.
\note For consistency with QDateTime, QTimeZone does not account for leap
seconds.
\section1 Remarks
+ QTimeZone, like QDateTime, measures offsets from UTC in seconds. This
+ contrasts with their measurement of time generally, which they do in
+ milliseconds. Real-world time zones generally have UTC offsets that are
+ whole-number multiples of five minutes (300 seconds), at least since well
+ before 1970. A positive offset from UTC gives a time representation puts
+ noon on any given day before UTC noon on that day; a negative offset puts
+ noon after UTC noon on the same day.
+
+ \section2 Lightweight Time Representations
+
+ QTimeZone can represent UTC, local time and fixed offsets from UTC even when
+ feature \c timezone is disabled. The form in which it does so is also
+ available when the feature is enabled; it is a more lightweight form and
+ processing using it will typically be more efficient, unless methods only
+ available when feature \c timezone is enabled are being exercised. See \l
+ Initialization and \l QTimeZone::fromSecondsAheadOfUtc(int) for how to
+ construct these representations.
+
+ This documentation distinguishes between "time zone", used to describe a
+ time representation described by system-supplied or standard information,
+ and time representations more generally, which include these lightweight
+ forms. The methods available only when feature \c timezone is enabled are
+ apt to be cheaper for time zones than for lightweight time representations,
+ for which these methods may construct a suitable transient time zone object
+ to which to forward the query.
+
\section2 IANA Time Zone IDs
QTimeZone uses the IANA time zone IDs as defined in the IANA Time Zone
@@ -154,25 +158,29 @@ Q_GLOBAL_STATIC(QTimeZoneSingleton, global_tz);
availableTimeZoneIds() to determine what IANA IDs are available.
The IANA IDs and database are also know as the Olson IDs and database,
- named after their creator.
+ named after the original compiler of the database.
\section2 UTC Offset Time Zones
- A default UTC time zone backend is provided which is always guaranteed to
- be available. This provides a set of generic Offset From UTC time zones
- in the range UTC-14:00 to UTC+14:00. These time zones can be created
- using either the standard ISO format names "UTC+00:00" as listed by
- availableTimeZoneIds(), or using the number of offset seconds.
+ A default UTC time zone backend is provided which is always available when
+ feature \c timezone is enabled. This provides a set of generic Offset From
+ UTC time zones in the range UTC-16:00 to UTC+16:00. These time zones can be
+ created using either the standard ISO format names, such as "UTC+00:00", as
+ listed by availableTimeZoneIds(), or using a name of similar form in
+ combination with the number of offset seconds.
\section2 Windows Time Zones
Windows native time zone support is severely limited compared to the
standard IANA TZ Database. Windows time zones cover larger geographic
areas and are thus less accurate in their conversions. They also do not
- support as much historic conversion data and so may only be accurate for
- the current year.
+ support as much historical data and so may only be accurate for the
+ current year. In particular, when MS's zone data claims that DST was
+ observed prior to 1900 (this is historically known to be untrue), the
+ claim is ignored and the standard time (allegedly) in force in 1900 is
+ taken to have always been in effect.
- QTimeZone uses a conversion table derived form the Unicode CLDR data to map
+ QTimeZone uses a conversion table derived from the Unicode CLDR data to map
between IANA IDs and Windows IDs. Depending on your version of Windows
and Qt, this table may not be able to provide a valid conversion, in which
"UTC" will be returned.
@@ -182,11 +190,11 @@ Q_GLOBAL_STATIC(QTimeZoneSingleton, global_tz);
Exchange EWS ID as well, but is different to the Time Zone Name (TZID) and
COD code used by MS Exchange in versions before 2007.
- \section2 System Time Zone
+ \note When Qt is built with the ICU library, it is used in preference to the
+ Windows system APIs, bypassing all problems with those APIs using different
+ names.
- QTimeZone does not support any concept of a system or default time zone.
- If you require a QDateTime that uses the current system time zone at any
- given moment then you should use a Qt::TimeSpec of Qt::LocalTime.
+ \section2 System Time Zone
The method systemTimeZoneId() returns the current system IANA time zone
ID which on Unix-like systems will always be correct. On Windows this ID is
@@ -197,7 +205,13 @@ Q_GLOBAL_STATIC(QTimeZoneSingleton, global_tz);
Creating a new QTimeZone instance using the system time zone ID will only
produce a fixed named copy of the time zone, it will not change if the
- system time zone changes.
+ system time zone changes. QTimeZone::systemTimeZone() will return an
+ instance representing the zone named by this system ID. Note that
+ constructing a QDateTime using this system zone may behave differently than
+ constructing a QDateTime that uses Qt::LocalTime as its Qt::TimeSpec, as the
+ latter directly uses system APIs for accessing local time information, which
+ may behave differently (and, in particular, might adapt if the user adjusts
+ the system zone setting).
\section2 Time Zone Offsets
@@ -223,23 +237,41 @@ Q_GLOBAL_STATIC(QTimeZoneSingleton, global_tz);
of the Unicode Data Files and Software License. See
\l{unicode-cldr}{Unicode Common Locale Data Repository (CLDR)} for details.
- \sa QDateTime
+ \sa QDateTime, QCalendar
*/
/*!
- \enum QTimeZone::anonymous
+ \variable QTimeZone::MinUtcOffsetSecs
+ \brief Timezone offsets from UTC are expected to be no lower than this.
+
+ The lowest UTC offset of any early 21st century timezone is -12 hours (Baker
+ Island, USA), or 12 hours west of Greenwich.
+
+ Historically, until 1844, The Philippines (then controlled by Spain) used
+ the same date as Spain's American holdings, so had offsets close to 16 hours
+ west of Greenwich. As The Philippines was using local solar mean time, it is
+ possible some outlying territory of it may have been operating at more than
+ 16 hours west of Greenwich, but no early 21st century timezone traces its
+ history back to such an extreme.
+
+ \sa MaxUtcOffsetSecs
+*/
+/*!
+ \variable QTimeZone::MaxUtcOffsetSecs
+ \brief Timezone offsets from UTC are expected to be no higher than this.
- Sane UTC offsets range from -14 to +14 hours.
- No known zone > 12 hrs West of Greenwich (Baker Island, USA).
- No known zone > 14 hrs East of Greenwich (Kiritimati, Christmas Island, Kiribati).
+ The highest UTC offset of any early 21st century timezone is +14 hours
+ (Christmas Island, Kiribati, Kiritimati), or 14 hours east of Greenwich.
- \value MinUtcOffsetSecs
- -14 * 3600,
+ Historically, before 1867, when Russia sold Alaska to America, Alaska used
+ the same date as Russia, so had offsets over 15 hours east of Greenwich. As
+ Alaska was using local solar mean time, its offsets varied, but all were
+ less than 16 hours east of Greenwich.
- \value MaxUtcOffsetSecs
- +14 * 3600
+ \sa MinUtcOffsetSecs
*/
+#if QT_CONFIG(timezone)
/*!
\enum QTimeZone::TimeType
@@ -260,6 +292,8 @@ Q_GLOBAL_STATIC(QTimeZoneSingleton, global_tz);
either an unknown time or a neutral form.
For example when formatting a display name this will show something
like "Pacific Time".
+
+ This type is only available when feature \c timezone is enabled.
*/
/*!
@@ -275,14 +309,20 @@ Q_GLOBAL_STATIC(QTimeZoneSingleton, global_tz);
The short form of the time zone name, usually an abbreviation, e.g. "CET"
\value OffsetName
The standard ISO offset form of the time zone name, e.g. "UTC+01:00"
+
+ This type is only available when feature \c timezone is enabled.
*/
/*!
\class QTimeZone::OffsetData
\inmodule QtCore
- The time zone offset data for a given moment in time, i.e. the time zone
- offsets and abbreviation to use at that moment in time.
+ The time zone offset data for a given moment in time.
+
+ This provides the time zone offsets and abbreviation to use at that moment
+ in time. When a function returns this type, it may use an invalid datetime
+ to indicate that the query it is answering has no valid answer, so check
+ \c{atUtc.isValid()} before using the results.
\list
\li OffsetData::atUtc The datetime of the offset data in UTC time.
@@ -295,7 +335,7 @@ Q_GLOBAL_STATIC(QTimeZoneSingleton, global_tz);
For example, for time zone "Europe/Berlin" the OffsetDate in standard and DST might be:
\list
- \li atUtc = QDateTime(QDate(2013, 1, 1), QTime(0, 0, 0), Qt::UTC)
+ \li atUtc = QDateTime(QDate(2013, 1, 1), QTime(0, 0), QTimeZone::UTC)
\li offsetFromUtc = 3600
\li standardTimeOffset = 3600
\li daylightTimeOffset = 0
@@ -303,50 +343,126 @@ Q_GLOBAL_STATIC(QTimeZoneSingleton, global_tz);
\endlist
\list
- \li atUtc = QDateTime(QDate(2013, 6, 1), QTime(0, 0, 0), Qt::UTC)
+ \li atUtc = QDateTime(QDate(2013, 6, 1), QTime(0, 0), QTimeZone::UTC)
\li offsetFromUtc = 7200
\li standardTimeOffset = 3600
\li daylightTimeOffset = 3600
\li abbreviation = "CEST"
\endlist
+
+ This type is only available when feature \c timezone is enabled.
*/
/*!
\typedef QTimeZone::OffsetDataList
Synonym for QList<OffsetData>.
+
+ This type is only available when feature \c timezone is enabled.
*/
+#endif // timezone backends
+
+QTimeZone::Data::Data() noexcept : d(nullptr)
+{
+ // Assumed by the conversion between spec and mode:
+ static_assert(int(Qt::TimeZone) == 3);
+}
+
+QTimeZone::Data::Data(const Data &other) noexcept
+{
+#if QT_CONFIG(timezone)
+ if (!other.isShort() && other.d)
+ other.d->ref.ref();
+#endif
+ d = other.d;
+}
+
+QTimeZone::Data::Data(QTimeZonePrivate *dptr) noexcept
+ : d(dptr)
+{
+#if QT_CONFIG(timezone)
+ if (d)
+ d->ref.ref();
+#endif
+}
+
+QTimeZone::Data::~Data()
+{
+#if QT_CONFIG(timezone)
+ if (!isShort() && d && !d->ref.deref())
+ delete d;
+ d = nullptr;
+#endif
+}
+
+QTimeZone::Data &QTimeZone::Data::operator=(const QTimeZone::Data &other) noexcept
+{
+#if QT_CONFIG(timezone)
+ if (!other.isShort())
+ return *this = other.d;
+ if (!isShort() && d && !d->ref.deref())
+ delete d;
+#endif
+ d = other.d;
+ return *this;
+}
/*!
Create a null/invalid time zone instance.
*/
QTimeZone::QTimeZone() noexcept
- : d(nullptr)
{
+ // Assumed by (at least) Data::swap() and {copy,move} {assign,construct}:
+ static_assert(sizeof(ShortData) <= sizeof(Data::d));
+ // Needed for ShortData::offset to represent all valid offsets:
+ static_assert(qintptr(1) << (sizeof(void *) * 8 - 2) >= MaxUtcOffsetSecs);
+}
+
+#if QT_CONFIG(timezone)
+QTimeZone::Data &QTimeZone::Data::operator=(QTimeZonePrivate *dptr) noexcept
+{
+ if (!isShort()) {
+ if (d == dptr)
+ return *this;
+ if (d && !d->ref.deref())
+ delete d;
+ }
+ if (dptr)
+ dptr->ref.ref();
+ d = dptr;
+ Q_ASSERT(!isShort());
+ return *this;
}
/*!
- Creates an instance of the requested time zone \a ianaId.
+ Creates a time zone instance with the requested IANA ID \a ianaId.
The ID must be one of the available system IDs or a valid UTC-with-offset
- ID, otherwise an invalid time zone will be returned.
+ ID, otherwise an invalid time zone will be returned. For UTC-with-offset
+ IDs, when they are not in fact IANA IDs, the \c{id()} of the resulting
+ instance may differ from the ID passed to the constructor.
- \sa availableTimeZoneIds()
+ This constructor is only available when feature \c timezone is enabled.
+
+ \sa availableTimeZoneIds(), id()
*/
QTimeZone::QTimeZone(const QByteArray &ianaId)
{
- // Try and see if it's a CLDR UTC offset ID - just as quick by creating as
- // by looking up.
+ // Try and see if it's a recognized UTC offset ID - just as quick by
+ // creating as by looking up.
d = new QUtcTimeZonePrivate(ianaId);
- // If not a CLDR UTC offset ID then try creating it with the system backend.
- // Relies on backend not creating valid TZ with invalid name.
- if (!d.constData()->isValid())
- d = ianaId.isEmpty() ? newBackendTimeZone() : newBackendTimeZone(ianaId);
+ // If not recognized, try creating it with the system backend.
+ if (!d->isValid()) {
+ if (ianaId.isEmpty())
+ d = newBackendTimeZone();
+ else // Constructor MUST produce invalid for unsupported ID.
+ d = newBackendTimeZone(ianaId);
+ }
// Can also handle UTC with arbitrary (valid) offset, but only do so as
// fall-back, since either of the above may handle it more informatively.
- if (!d.constData()->isValid()) {
+ if (!d->isValid()) {
qint64 offset = QUtcTimeZonePrivate::offsetFromUtcString(ianaId);
if (offset != QTimeZonePrivate::invalidSeconds()) {
// Should have abs(offset) < 24 * 60 * 60 = 86400.
@@ -359,11 +475,17 @@ QTimeZone::QTimeZone(const QByteArray &ianaId)
}
/*!
- Creates an instance of a time zone with the requested Offset from UTC of
- \a offsetSeconds.
+ Creates a time zone instance with the given offset, \a offsetSeconds, from UTC.
- The \a offsetSeconds from UTC must be in the range -14 hours to +14 hours
+ The \a offsetSeconds from UTC must be in the range -16 hours to +16 hours
otherwise an invalid time zone will be returned.
+
+ This constructor is only available when feature \c timezone is enabled. The
+ returned instance is equivalent to the lightweight time representation
+ \c{QTimeZone::fromSecondsAfterUtc(offsetSeconds)}, albeit implemented as a
+ time zone.
+
+ \sa MinUtcOffsetSecs, MaxUtcOffsetSecs, id()
*/
QTimeZone::QTimeZone(int offsetSeconds)
@@ -373,32 +495,43 @@ QTimeZone::QTimeZone(int offsetSeconds)
}
/*!
- Creates a custom time zone with an ID of \a ianaId and an offset from UTC
- of \a offsetSeconds. The \a name will be the name used by displayName()
- for the LongName, the \a abbreviation will be used by displayName() for the
+ Creates a custom time zone instance at fixed offset from UTC.
+
+ The returned time zone has an ID of \a zoneId and an offset from UTC of \a
+ offsetSeconds. The \a name will be the name used by displayName() for the
+ LongName, the \a abbreviation will be used by displayName() for the
ShortName and by abbreviation(), and the optional \a territory will be used
by territory(). The \a comment is an optional note that may be displayed in
a GUI to assist users in selecting a time zone.
- The \a ianaId must not be one of the available system IDs returned by
- availableTimeZoneIds(). The \a offsetSeconds from UTC must be in the range
- -14 hours to +14 hours.
+ The \a zoneId \e{must not} be one of the available system IDs returned by
+ availableTimeZoneIds(). The \a offsetSeconds from UTC must be in the range
+ -16 hours to +16 hours.
If the custom time zone does not have a specific territory then set it to the
default value of QLocale::AnyTerritory.
+
+ This constructor is only available when feature \c timezone is enabled.
+
+ \sa id(), offsetFromUtc(), displayName(), abbreviation(), territory(), comment(),
+ MinUtcOffsetSecs, MaxUtcOffsetSecs
*/
-QTimeZone::QTimeZone(const QByteArray &ianaId, int offsetSeconds, const QString &name,
+QTimeZone::QTimeZone(const QByteArray &zoneId, int offsetSeconds, const QString &name,
const QString &abbreviation, QLocale::Territory territory, const QString &comment)
+ : d(QUtcTimeZonePrivate().isTimeZoneIdAvailable(zoneId)
+ || global_tz->backend->isTimeZoneIdAvailable(zoneId)
+ ? nullptr // Don't let client code hijack a real zone name.
+ : new QUtcTimeZonePrivate(zoneId, offsetSeconds, name, abbreviation, territory, comment))
{
- if (!isTimeZoneIdAvailable(ianaId))
- d = new QUtcTimeZonePrivate(ianaId, offsetSeconds, name, abbreviation, territory, comment);
}
/*!
\internal
Private. Create time zone with given private backend
+
+ This constructor is only available when feature \c timezone is enabled.
*/
QTimeZone::QTimeZone(QTimeZonePrivate &dd)
@@ -407,15 +540,154 @@ QTimeZone::QTimeZone(QTimeZonePrivate &dd)
}
/*!
- Copy constructor, copy \a other to this.
+ \since 6.5
+ Converts this QTimeZone to one whose timeSpec() is Qt::TimeZone.
+
+ In all cases, the result's \l timeSpec() is Qt::TimeZone. When this
+ QTimeZone's timeSpec() is Qt::TimeZone, this QTimeZone itself is returned.
+ If timeSpec() is Qt::LocalTime then systemTimeZone() is returned.
+
+ If timeSpec() is Qt::UTC, QTimeZone::utc() is returned. If it is
+ Qt::OffsetFromUTC then QTimeZone(int) is passed its offset and the result is
+ returned.
+
+ When using a lightweight time representation - local time, UTC time or time
+ at a fixed offset from UTC - using methods only supported when feature \c
+ timezone is enabled may be more expensive than using a corresponding time
+ zone. This method maps a lightweight time representation to a corresponding
+ time zone - that is, an instance based on system-supplied or standard data.
+
+ This method is only available when feature \c timezone is enabled.
+
+ \sa QTimeZone(QTimeZone::Initialization), fromSecondsAheadOfUtc()
+*/
+
+QTimeZone QTimeZone::asBackendZone() const
+{
+ switch (timeSpec()) {
+ case Qt::TimeZone:
+ return *this;
+ case Qt::LocalTime:
+ return systemTimeZone();
+ case Qt::UTC:
+ return utc();
+ case Qt::OffsetFromUTC:
+ return QTimeZone(*new QUtcTimeZonePrivate(int(d.s.offset)));
+ }
+ return QTimeZone();
+}
+#endif // timezone backends
+
+/*!
+ \since 6.5
+ \enum QTimeZone::Initialization
+
+ The type of the simplest lightweight time representations.
+
+ This enumeration identifies a type of lightweight time representation to
+ pass to a QTimeZone constructor, where no further data are required. They
+ correspond to the like-named members of Qt::TimeSpec.
+
+ \value LocalTime This time representation corresponds to the one implicitly
+ used by system functions using \c time_t and \c {struct tm}
+ value to map between local time and UTC time.
+
+ \value UTC This time representation, Coordinated Universal Time, is the base
+ representation to which civil time is referred in all supported
+ time representations. It is defined by the International
+ Telecommunication Union.
+*/
+
+/*!
+ \since 6.5
+ \fn QTimeZone::QTimeZone(Initialization spec) noexcept
+
+ Creates a lightweight instance describing UTC or local time.
+
+ \sa fromSecondsAheadOfUtc(), asBackendZone(), utc(), systemTimeZone()
+*/
+
+/*!
+ \since 6.5
+ \fn QTimeZone::fromSecondsAheadOfUtc(int offset)
+ \fn QTimeZone::fromDurationAheadOfUtc(std::chrono::seconds offset)
+
+ Returns a time representation at a fixed \a offset, in seconds, ahead of
+ UTC.
+
+ The \a offset from UTC must be in the range -16 hours to +16 hours otherwise
+ an invalid time zone will be returned. The returned QTimeZone is a
+ lightweight time representation, not a time zone (backed by system-supplied
+ or standard data).
+
+ If the offset is 0, the \l timeSpec() of the returned instance will be
+ Qt::UTC. Otherwise, if \a offset is valid, timeSpec() is
+ Qt::OffsetFromUTC. An invalid time zone, when returned, has Qt::TimeZone as
+ its timeSpec().
+
+ \sa QTimeZone(int), asBackendZone(), fixedSecondsAheadOfUtc(),
+ MinUtcOffsetSecs, MaxUtcOffsetSecs
*/
-QTimeZone::QTimeZone(const QTimeZone &other)
+/*!
+ \since 6.5
+ \fn Qt::TimeSpec QTimeZone::timeSpec() const noexcept
+
+ Returns a Qt::TimeSpec identifying the type of time representation.
+
+ If the result is Qt::TimeZone, this time description is a time zone (backed
+ by system-supplied or standard data); otherwise, it is a lightweight time
+ representation. If the result is Qt::LocalTime it describes local time: see
+ Qt::TimeSpec for details.
+
+ \sa fixedSecondsAheadOfUtc(), asBackendZone()
+*/
+
+/*!
+ \since 6.5
+ \fn int QTimeZone::fixedSecondsAheadOfUtc() const noexcept
+
+ For a lightweight time representation whose \l timeSpec() is Qt::OffsetFromUTC,
+ this returns the fixed offset from UTC that it describes. For any other time
+ representation it returns 0, even if that time representation does have a
+ constant offset from UTC.
+*/
+
+/*!
+ \since 6.5
+ \fn QTimeZone::isUtcOrFixedOffset(Qt::TimeSpec spec) noexcept
+
+ Returns \c true if \a spec is Qt::UTC or Qt::OffsetFromUTC.
+*/
+
+/*!
+ \since 6.5
+ \fn QTimeZone::isUtcOrFixedOffset() const noexcept
+
+ Returns \c true if \l timeSpec() is Qt::UTC or Qt::OffsetFromUTC.
+
+ When it is true, the time description does not change over time, such as
+ having seasonal daylight-saving changes, as may happen for local time or a
+ time zone. Knowing this may save the calling code to need for various other
+ checks.
+*/
+
+/*!
+ Copy constructor: copy \a other to this.
+*/
+
+QTimeZone::QTimeZone(const QTimeZone &other) noexcept
: d(other.d)
{
}
/*!
+ \fn QTimeZone::QTimeZone(QTimeZone &&other) noexcept
+
+ Move constructor of this from \a other.
+*/
+
+/*!
Destroys the time zone.
*/
@@ -424,7 +696,7 @@ QTimeZone::~QTimeZone()
}
/*!
- \fn QTimeZone::swap(QTimeZone &other)
+ \fn QTimeZone::swap(QTimeZone &other) noexcept
Swaps this time zone instance with \a other. This function is very
fast and never fails.
@@ -440,36 +712,49 @@ QTimeZone &QTimeZone::operator=(const QTimeZone &other)
return *this;
}
-/*
- \fn void QTimeZone::swap(QTimeZone &other)
+/*!
+ \fn QTimeZone &QTimeZone::operator=(QTimeZone &&other)
- Swaps this timezone with \a other. This function is very fast and
- never fails.
+ Move-assigns \a other to this QTimeZone instance, transferring the ownership
+ of its data to this instance.
*/
/*!
- \fn QTimeZone &QTimeZone::operator=(QTimeZone &&other)
+ \fn bool QTimeZone::operator==(const QTimeZone &lhs, const QTimeZone &rhs)
- Move-assigns \a other to this QTimeZone instance, transferring the
- ownership of the managed pointer to this instance.
+ Returns \c true if \a lhs time zone is equal to the \a rhs time zone.
+
+ Two representations are different if they are internally described
+ differently, even if they agree in their representation of all moments of
+ time. In particular, a lightweight time representation may coincide with a
+ time zone but the two will not be equal.
*/
/*!
- Returns \c true if this time zone is equal to the \a other time zone.
-*/
+ \fn bool QTimeZone::operator!=(const QTimeZone &lhs, const QTimeZone &rhs)
-bool QTimeZone::operator==(const QTimeZone &other) const
-{
- return d == other.d || (d && other.d && *d == *other.d);
-}
+ Returns \c true if \a lhs time zone is not equal to the \a rhs time zone.
-/*!
- Returns \c true if this time zone is not equal to the \a other time zone.
+ Two representations are different if they are internally described
+ differently, even if they agree in their representation of all moments of
+ time. In particular, a lightweight time representation may coincide with a
+ time zone but the two will not be equal.
*/
-bool QTimeZone::operator!=(const QTimeZone &other) const
+bool comparesEqual(const QTimeZone &lhs, const QTimeZone &rhs) noexcept
{
- return d != other.d && (!d || !other.d || *d != *other.d);
+ if (lhs.d.isShort())
+ return rhs.d.isShort() && lhs.d.s == rhs.d.s;
+
+ if (!rhs.d.isShort()) {
+ if (lhs.d.d == rhs.d.d)
+ return true;
+#if QT_CONFIG(timezone)
+ return lhs.d.d && rhs.d.d && *lhs.d.d == *rhs.d.d;
+#endif
+ }
+
+ return false;
}
/*!
@@ -478,29 +763,89 @@ bool QTimeZone::operator!=(const QTimeZone &other) const
bool QTimeZone::isValid() const
{
- return d && d->isValid();
+#if QT_CONFIG(timezone)
+ if (!d.isShort())
+ return d.d && d->isValid();
+#endif
+ return d.isShort();
}
+#if QT_CONFIG(timezone)
/*!
Returns the IANA ID for the time zone.
- IANA IDs are used on all platforms. On Windows these are translated
- from the Windows ID into the closest IANA ID for the time zone and territory.
+ IANA IDs are used on all platforms. On Windows these are translated from
+ the Windows ID into the best match IANA ID for the time zone and territory.
+
+ If this timezone instance was not constructed from an IANA ID, its ID is
+ determined by how it was constructed. In most cases, the ID passed when
+ constructing the instance is used. (The constructor for a custom zone uses
+ the ID it is passed, which must not be an IANA ID.) There are two
+ exceptions.
+ \list
+ \li Instances constructed by passing only a UTC offset in seconds have no ID
+ passed when constructing.
+ \li The constructor taking only an IANA ID will also accept some UTC-offset
+ IDs that are not in fact IANA IDs: its handling of these is equivalent
+ to passing the corresponding offset in seconds, as for the first
+ exception.
+ \endlist
+
+ In the two exceptional cases, if there is an IANA UTC-offset zone with the
+ specified offset, the instance constructed uses that IANA zone's ID, even
+ though this may differ from the (non-IANA) UTC-offset ID passed to the
+ constructor. Otherwise, the instance uses an ID synthesized from its offset,
+ with the form UTC±hh:mm:ss, omitting any trailing :00 for zero seconds or
+ minutes. Again, this may differ from the UTC-offset ID passed to the
+ constructor.
+
+ This method is only available when feature \c timezone is enabled.
*/
QByteArray QTimeZone::id() const
{
- return d ? d->id() : QByteArray();
+ if (d.isShort()) {
+ switch (d.s.spec()) {
+ case Qt::UTC:
+ return QTimeZonePrivate::utcQByteArray();
+ case Qt::LocalTime:
+ return systemTimeZoneId();
+ case Qt::OffsetFromUTC:
+ return QUtcTimeZonePrivate(d.s.offset).id();
+ case Qt::TimeZone:
+ Q_UNREACHABLE();
+ break;
+ }
+ } else if (d.d) {
+ return d->id();
+ }
+ return QByteArray();
}
/*!
\since 6.2
Returns the territory for the time zone.
+
+ A return of \l {QLocale::}{AnyTerritory} means the zone has no known
+ territorial association. In some cases this may be because the zone has no
+ associated territory - for example, UTC - or because the zone is used in
+ several territories - for example, CET. In other cases, the QTimeZone
+ backend may not know which territory the zone is associated with - for
+ example, because it is not the primary zone of the territory in which it is
+ used.
+
+ This method is only available when feature \c timezone is enabled.
*/
QLocale::Territory QTimeZone::territory() const
{
- return isValid() ? d->territory() : QLocale::AnyTerritory;
+ if (d.isShort()) {
+ if (d.s.spec() == Qt::LocalTime)
+ return systemTimeZone().territory();
+ } else if (isValid()) {
+ return d->territory();
+ }
+ return QLocale::AnyTerritory;
}
#if QT_DEPRECATED_SINCE(6, 6)
@@ -508,6 +853,8 @@ QLocale::Territory QTimeZone::territory() const
\deprecated [6.6] Use territory() instead.
Returns the territory for the time zone.
+
+ This method is only available when feature \c timezone is enabled.
*/
QLocale::Country QTimeZone::country() const
@@ -522,11 +869,18 @@ QLocale::Country QTimeZone::country() const
A comment may be provided by the host platform to assist users in
choosing the correct time zone. Depending on the platform this may not
be localized.
+
+ This method is only available when feature \c timezone is enabled.
*/
QString QTimeZone::comment() const
{
- return isValid() ? d->comment() : QString();
+ if (d.isShort()) {
+ // TODO: anything ? Or just stick with empty string ?
+ } else if (isValid()) {
+ return d->comment();
+ }
+ return QString();
}
/*!
@@ -540,14 +894,29 @@ QString QTimeZone::comment() const
The display name may change depending on DST or historical events.
+ This method is only available when feature \c timezone is enabled.
+
\sa abbreviation()
*/
QString QTimeZone::displayName(const QDateTime &atDateTime, NameType nameType,
const QLocale &locale) const
{
- if (isValid())
+ if (d.isShort()) {
+ switch (d.s.spec()) {
+ case Qt::LocalTime:
+ return systemTimeZone().displayName(atDateTime, nameType, locale);
+ case Qt::UTC:
+ case Qt::OffsetFromUTC:
+ return QUtcTimeZonePrivate(d.s.offset).displayName(
+ atDateTime.toMSecsSinceEpoch(), nameType, locale);
+ case Qt::TimeZone:
+ Q_UNREACHABLE();
+ break;
+ }
+ } else if (isValid()) {
return d->displayName(atDateTime.toMSecsSinceEpoch(), nameType, locale);
+ }
return QString();
}
@@ -564,14 +933,28 @@ QString QTimeZone::displayName(const QDateTime &atDateTime, NameType nameType,
Where the time zone display names have changed over time then the most
recent names will be used.
+ This method is only available when feature \c timezone is enabled.
+
\sa abbreviation()
*/
QString QTimeZone::displayName(TimeType timeType, NameType nameType,
const QLocale &locale) const
{
- if (isValid())
+ if (d.isShort()) {
+ switch (d.s.spec()) {
+ case Qt::LocalTime:
+ return systemTimeZone().displayName(timeType, nameType, locale);
+ case Qt::UTC:
+ case Qt::OffsetFromUTC:
+ return QUtcTimeZonePrivate(d.s.offset).displayName(timeType, nameType, locale);
+ case Qt::TimeZone:
+ Q_UNREACHABLE();
+ break;
+ }
+ } else if (isValid()) {
return d->displayName(timeType, nameType, locale);
+ }
return QString();
}
@@ -583,13 +966,27 @@ QString QTimeZone::displayName(TimeType timeType, NameType nameType,
Note that the abbreviation is not guaranteed to be unique to this time zone
and should not be used in place of the ID or display name.
+ This method is only available when feature \c timezone is enabled.
+
\sa displayName()
*/
QString QTimeZone::abbreviation(const QDateTime &atDateTime) const
{
- if (isValid())
+ if (d.isShort()) {
+ switch (d.s.spec()) {
+ case Qt::LocalTime:
+ return systemTimeZone().abbreviation(atDateTime);
+ case Qt::UTC:
+ case Qt::OffsetFromUTC:
+ return QUtcTimeZonePrivate(d.s.offset).abbreviation(atDateTime.toMSecsSinceEpoch());
+ case Qt::TimeZone:
+ Q_UNREACHABLE();
+ break;
+ }
+ } else if (isValid()) {
return d->abbreviation(atDateTime.toMSecsSinceEpoch());
+ }
return QString();
}
@@ -605,12 +1002,25 @@ QString QTimeZone::abbreviation(const QDateTime &atDateTime) const
offsetFromUtc() will return +3600 (UTC+01:00), and during DST it will
return +7200 (UTC+02:00).
+ This method is only available when feature \c timezone is enabled.
+
\sa standardTimeOffset(), daylightTimeOffset()
*/
int QTimeZone::offsetFromUtc(const QDateTime &atDateTime) const
{
- if (isValid()) {
+ if (d.isShort()) {
+ switch (d.s.spec()) {
+ case Qt::LocalTime:
+ return systemTimeZone().offsetFromUtc(atDateTime);
+ case Qt::UTC:
+ case Qt::OffsetFromUTC:
+ return d.s.offset;
+ case Qt::TimeZone:
+ Q_UNREACHABLE();
+ break;
+ }
+ } else if (isValid()) {
const int offset = d->offsetFromUtc(atDateTime.toMSecsSinceEpoch());
if (offset != QTimeZonePrivate::invalidSeconds())
return offset;
@@ -627,12 +1037,25 @@ int QTimeZone::offsetFromUtc(const QDateTime &atDateTime) const
+3600 seconds. During both standard and DST offsetFromUtc() will return
+3600 (UTC+01:00).
+ This method is only available when feature \c timezone is enabled.
+
\sa offsetFromUtc(), daylightTimeOffset()
*/
int QTimeZone::standardTimeOffset(const QDateTime &atDateTime) const
{
- if (isValid()) {
+ if (d.isShort()) {
+ switch (d.s.spec()) {
+ case Qt::LocalTime:
+ return systemTimeZone().standardTimeOffset(atDateTime);
+ case Qt::UTC:
+ case Qt::OffsetFromUTC:
+ return d.s.offset;
+ case Qt::TimeZone:
+ Q_UNREACHABLE();
+ break;
+ }
+ } else if (isValid()) {
const int offset = d->standardTimeOffset(atDateTime.toMSecsSinceEpoch());
if (offset != QTimeZonePrivate::invalidSeconds())
return offset;
@@ -649,12 +1072,25 @@ int QTimeZone::standardTimeOffset(const QDateTime &atDateTime) const
seconds. During standard time daylightTimeOffset() will return 0, and when
daylight-saving is in effect it will return +3600.
+ This method is only available when feature \c timezone is enabled.
+
\sa offsetFromUtc(), standardTimeOffset()
*/
int QTimeZone::daylightTimeOffset(const QDateTime &atDateTime) const
{
- if (hasDaylightTime()) {
+ if (d.isShort()) {
+ switch (d.s.spec()) {
+ case Qt::LocalTime:
+ return systemTimeZone().daylightTimeOffset(atDateTime);
+ case Qt::UTC:
+ case Qt::OffsetFromUTC:
+ return 0;
+ case Qt::TimeZone:
+ Q_UNREACHABLE();
+ break;
+ }
+ } else if (hasDaylightTime()) {
const int offset = d->daylightTimeOffset(atDateTime.toMSecsSinceEpoch());
if (offset != QTimeZonePrivate::invalidSeconds())
return offset;
@@ -665,36 +1101,85 @@ int QTimeZone::daylightTimeOffset(const QDateTime &atDateTime) const
/*!
Returns \c true if the time zone has practiced daylight-saving at any time.
+ This method is only available when feature \c timezone is enabled.
+
\sa isDaylightTime(), daylightTimeOffset()
*/
bool QTimeZone::hasDaylightTime() const
{
- return isValid() && d->hasDaylightTime();
+ if (d.isShort()) {
+ switch (d.s.spec()) {
+ case Qt::LocalTime:
+ return systemTimeZone().hasDaylightTime();
+ case Qt::UTC:
+ case Qt::OffsetFromUTC:
+ return false;
+ case Qt::TimeZone:
+ Q_UNREACHABLE();
+ break;
+ }
+ } else if (isValid()) {
+ return d->hasDaylightTime();
+ }
+ return false;
}
/*!
Returns \c true if daylight-saving was in effect at the given \a atDateTime.
+ This method is only available when feature \c timezone is enabled.
+
\sa hasDaylightTime(), daylightTimeOffset()
*/
bool QTimeZone::isDaylightTime(const QDateTime &atDateTime) const
{
- return hasDaylightTime() && d->isDaylightTime(atDateTime.toMSecsSinceEpoch());
+ if (d.isShort()) {
+ switch (d.s.spec()) {
+ case Qt::LocalTime:
+ return systemTimeZone().isDaylightTime(atDateTime);
+ case Qt::UTC:
+ case Qt::OffsetFromUTC:
+ return false;
+ case Qt::TimeZone:
+ Q_UNREACHABLE();
+ break;
+ }
+ } else if (hasDaylightTime()) {
+ return d->isDaylightTime(atDateTime.toMSecsSinceEpoch());
+ }
+ return false;
}
/*!
- Returns the effective offset details at the given \a forDateTime. This is
- the equivalent of calling offsetFromUtc(), abbreviation(), etc individually but is
- more efficient.
+ Returns the effective offset details at the given \a forDateTime.
+
+ This is the equivalent of calling abbreviation() and all three offset
+ functions individually but is more efficient. If this data is not available
+ for the given datetime, an invalid OffsetData will be returned with an
+ invalid QDateTime as its \c atUtc.
+
+ This method is only available when feature \c timezone is enabled.
\sa offsetFromUtc(), standardTimeOffset(), daylightTimeOffset(), abbreviation()
*/
QTimeZone::OffsetData QTimeZone::offsetData(const QDateTime &forDateTime) const
{
- if (hasTransitions())
+ if (d.isShort()) {
+ switch (d.s.spec()) {
+ case Qt::LocalTime:
+ return systemTimeZone().offsetData(forDateTime);
+ case Qt::UTC:
+ case Qt::OffsetFromUTC:
+ return { abbreviation(forDateTime), forDateTime, int(d.s.offset), int(d.s.offset), 0 };
+ case Qt::TimeZone:
+ Q_UNREACHABLE();
+ break;
+ }
+ }
+ if (isValid())
return QTimeZonePrivate::toOffsetData(d->data(forDateTime.toMSecsSinceEpoch()));
return QTimeZonePrivate::invalidOffsetData();
@@ -706,12 +1191,28 @@ QTimeZone::OffsetData QTimeZone::offsetData(const QDateTime &forDateTime) const
Transitions are changes in the time-zone: these happen when DST turns on or
off and when authorities alter the offsets for the time-zone.
+ This method is only available when feature \c timezone is enabled.
+
\sa nextTransition(), previousTransition(), transitions()
*/
bool QTimeZone::hasTransitions() const
{
- return isValid() && d->hasTransitions();
+ if (d.isShort()) {
+ switch (d.s.spec()) {
+ case Qt::LocalTime:
+ return systemTimeZone().hasTransitions();
+ case Qt::UTC:
+ case Qt::OffsetFromUTC:
+ return false;
+ case Qt::TimeZone:
+ Q_UNREACHABLE();
+ break;
+ }
+ } else if (isValid()) {
+ return d->hasTransitions();
+ }
+ return false;
}
/*!
@@ -720,17 +1221,31 @@ bool QTimeZone::hasTransitions() const
Transition after it.
If there is no transition after the given \a afterDateTime then an invalid
- OffsetData will be returned with an invalid QDateTime.
+ OffsetData will be returned with an invalid QDateTime as its \c atUtc.
The given \a afterDateTime is exclusive.
+ This method is only available when feature \c timezone is enabled.
+
\sa hasTransitions(), previousTransition(), transitions()
*/
QTimeZone::OffsetData QTimeZone::nextTransition(const QDateTime &afterDateTime) const
{
- if (hasTransitions())
+ if (d.isShort()) {
+ switch (d.s.spec()) {
+ case Qt::LocalTime:
+ return systemTimeZone().nextTransition(afterDateTime);
+ case Qt::UTC:
+ case Qt::OffsetFromUTC:
+ break;
+ case Qt::TimeZone:
+ Q_UNREACHABLE();
+ break;
+ }
+ } else if (hasTransitions()) {
return QTimeZonePrivate::toOffsetData(d->nextTransition(afterDateTime.toMSecsSinceEpoch()));
+ }
return QTimeZonePrivate::invalidOffsetData();
}
@@ -741,17 +1256,32 @@ QTimeZone::OffsetData QTimeZone::nextTransition(const QDateTime &afterDateTime)
Transition before it.
If there is no transition before the given \a beforeDateTime then an invalid
- OffsetData will be returned with an invalid QDateTime.
+ OffsetData will be returned with an invalid QDateTime as its \c atUtc.
The given \a beforeDateTime is exclusive.
+ This method is only available when feature \c timezone is enabled.
+
\sa hasTransitions(), nextTransition(), transitions()
*/
QTimeZone::OffsetData QTimeZone::previousTransition(const QDateTime &beforeDateTime) const
{
- if (hasTransitions())
- return QTimeZonePrivate::toOffsetData(d->previousTransition(beforeDateTime.toMSecsSinceEpoch()));
+ if (d.isShort()) {
+ switch (d.s.spec()) {
+ case Qt::LocalTime:
+ return systemTimeZone().previousTransition(beforeDateTime);
+ case Qt::UTC:
+ case Qt::OffsetFromUTC:
+ break;
+ case Qt::TimeZone:
+ Q_UNREACHABLE();
+ break;
+ }
+ } else if (hasTransitions()) {
+ return QTimeZonePrivate::toOffsetData(
+ d->previousTransition(beforeDateTime.toMSecsSinceEpoch()));
+ }
return QTimeZonePrivate::invalidOffsetData();
}
@@ -759,7 +1289,11 @@ QTimeZone::OffsetData QTimeZone::previousTransition(const QDateTime &beforeDateT
/*!
Returns a list of all time zone transitions between the given datetimes.
- The given \a fromDateTime and \a toDateTime are inclusive.
+ The given \a fromDateTime and \a toDateTime are inclusive. The \c atUtc
+ member of each entry describes the moment of the transition, at which the
+ offsets and abbreviation given by other members take effect.
+
+ This method is only available when feature \c timezone is enabled.
\sa hasTransitions(), nextTransition(), previousTransition()
*/
@@ -768,10 +1302,21 @@ QTimeZone::OffsetDataList QTimeZone::transitions(const QDateTime &fromDateTime,
const QDateTime &toDateTime) const
{
OffsetDataList list;
- if (hasTransitions()) {
+ if (d.isShort()) {
+ switch (d.s.spec()) {
+ case Qt::LocalTime:
+ return systemTimeZone().transitions(fromDateTime, toDateTime);
+ case Qt::UTC:
+ case Qt::OffsetFromUTC:
+ break;
+ case Qt::TimeZone:
+ Q_UNREACHABLE();
+ break;
+ }
+ } else if (hasTransitions()) {
const QTimeZonePrivate::DataList plist = d->transitions(fromDateTime.toMSecsSinceEpoch(),
toDateTime.toMSecsSinceEpoch());
- list.reserve(plist.count());
+ list.reserve(plist.size());
for (const QTimeZonePrivate::Data &pdata : plist)
list.append(QTimeZonePrivate::toOffsetData(pdata));
}
@@ -783,42 +1328,82 @@ QTimeZone::OffsetDataList QTimeZone::transitions(const QDateTime &fromDateTime,
/*!
Returns the current system time zone IANA ID.
- On Windows this ID is translated from the Windows ID using an internal
- translation table and the user's selected country. As a consequence there
- is a small chance any Windows install may have IDs not known by Qt, in
- which case "UTC" will be returned.
+ Equivalent to calling systemTimeZone().id(), but may bypass some computation
+ to obtain it. Constructing a QTimeZone from the returned byte array will
+ produce the same result as systemTimeZone().
+
+ If the backend is unable to determine the correct system zone, the result is
+ empty. In this case, systemTimeZone().isValid() is false and a warning is
+ output if either this method of systemTimeZone() is called.
+
+ If the backend is able to determine the correct system zone but not its
+ name, an empty byte array is returned. For example, on Windows, the system
+ native ID is converted to an IANA ID - if the system ID isn't known to the
+ internal translation code, the result shall be empty. In this case,
+ systemTimeZone().isValid() shall be true.
+
+ This method is only available when feature \c timezone is enabled.
+
+ \note Prior to Qt 6.7, when the result could not be determined, the
+ misleading result "UTC" was returned.
+
+ \sa systemTimeZone()
*/
QByteArray QTimeZone::systemTimeZoneId()
{
- const QByteArray sys = global_tz->backend->systemTimeZoneId();
+ QByteArray sys = global_tz->backend->systemTimeZoneId();
if (!sys.isEmpty())
return sys;
// The system zone, despite the empty ID, may know its real ID anyway:
- auto zone = systemTimeZone();
- if (zone.isValid() && !zone.id().isEmpty())
- return zone.id();
- // If all else fails, guess UTC.
- return QTimeZonePrivate::utcQByteArray();
+ return systemTimeZone().id();
}
/*!
\since 5.5
- Returns a QTimeZone object that refers to the local system time, as
- specified by systemTimeZoneId().
- \sa utc()
+ Returns a QTimeZone object that describes local system time.
+
+ This method is only available when feature \c timezone is enabled. The
+ returned instance is usually equivalent to the lightweight time
+ representation \c {QTimeZone(QTimeZone::LocalTime)}, albeit implemented as a
+ time zone.
+
+ The returned object will not change to reflect any subsequent change to the
+ system time zone. It represents the local time that was in effect when
+ asBackendZone() was called. On misconfigured systems, such as those that
+ lack the timezone data relied on by the backend for which Qt was compiled,
+ it may be invalid. In such a case, a warning is output.
+
+ \sa utc(), Initialization, asBackendZone(), systemTimeZoneId()
*/
QTimeZone QTimeZone::systemTimeZone()
{
- return QTimeZone(global_tz->backend->systemTimeZoneId());
+ // Use ID even if empty, as default constructor is invalid but empty-ID
+ // constructor goes to backend's default constructor, which may succeed.
+ const auto sys = QTimeZone(global_tz->backend->systemTimeZoneId());
+ if (!sys.isValid()) {
+ static bool neverWarned = true;
+ if (neverWarned) {
+ // Racey but, at worst, merely repeats the warning.
+ neverWarned = false;
+ qWarning("Unable to determine system time zone: "
+ "please check your system configuration.");
+ }
+ }
+ return sys;
}
/*!
\since 5.5
- Returns a QTimeZone object that refers to UTC (Universal Time Coordinated).
+ Returns a QTimeZone object that describes UTC as a time zone.
- \sa systemTimeZone()
+ This method is only available when feature \c timezone is enabled. It is
+ equivalent to passing 0 to QTimeZone(int offsetSeconds) and to the
+ lightweight time representation QTimeZone(QTimeZone::UTC), albeit
+ implemented as a time zone, unlike the latter.
+
+ \sa systemTimeZone(), Initialization, asBackendZone()
*/
QTimeZone QTimeZone::utc()
{
@@ -828,17 +1413,29 @@ QTimeZone QTimeZone::utc()
/*!
Returns \c true if a given time zone \a ianaId is available on this system.
+ This may include some non-IANA IDs, notably UTC-offset IDs, that are not
+ listed in \l availableTimeZoneIds().
+
+ This method is only available when feature \c timezone is enabled.
+
\sa availableTimeZoneIds()
*/
bool QTimeZone::isTimeZoneIdAvailable(const QByteArray &ianaId)
{
+#if defined(Q_OS_UNIX) && !(defined(Q_OS_ANDROID) || defined(Q_OS_DARWIN))
+ // Keep #if-ery consistent with selection of QTzTimeZonePrivate in
+ // newBackendTimeZone(). Skip the pre-check, as the TZ backend accepts POSIX
+ // zone IDs, which need not be valid IANA IDs. See also QTBUG-112006.
+#else
// isValidId is not strictly required, but faster to weed out invalid
// IDs as availableTimeZoneIds() may be slow
if (!QTimeZonePrivate::isValidId(ianaId))
return false;
- return QUtcTimeZonePrivate().isTimeZoneIdAvailable(ianaId) ||
- global_tz->backend->isTimeZoneIdAvailable(ianaId);
+#endif
+ return QUtcTimeZonePrivate().isTimeZoneIdAvailable(ianaId)
+ || QUtcTimeZonePrivate::offsetFromUtcString(ianaId) != QTimeZonePrivate::invalidSeconds()
+ || global_tz->backend->isTimeZoneIdAvailable(ianaId);
}
static QList<QByteArray> set_union(const QList<QByteArray> &l1, const QList<QByteArray> &l2)
@@ -854,6 +1451,12 @@ static QList<QByteArray> set_union(const QList<QByteArray> &l1, const QList<QByt
/*!
Returns a list of all available IANA time zone IDs on this system.
+ This method is only available when feature \c timezone is enabled.
+
+ \note the QTimeZone constructor will also accept some UTC-offset IDs that
+ are not in the list returned - it would be impractical to list all possible
+ UTC-offset IDs.
+
\sa isTimeZoneIdAvailable()
*/
@@ -866,12 +1469,14 @@ QList<QByteArray> QTimeZone::availableTimeZoneIds()
/*!
Returns a list of all available IANA time zone IDs for a given \a territory.
- As a special case, a \a territory of Qt::AnyTerritory returns those time zones
- that do not have any territory related to them, such as UTC. If you require
- a list of all time zone IDs for all countries then use the standard
- availableTimeZoneIds() method.
+ As a special case, a \a territory of \l {QLocale::}{AnyTerritory} selects
+ those time zones that have no known territorial association, such as UTC. If
+ you require a list of all time zone IDs for all territories then use the
+ standard availableTimeZoneIds() method.
- \sa isTimeZoneIdAvailable()
+ This method is only available when feature \c timezone is enabled.
+
+ \sa isTimeZoneIdAvailable(), territory()
*/
QList<QByteArray> QTimeZone::availableTimeZoneIds(QLocale::Territory territory)
@@ -884,7 +1489,13 @@ QList<QByteArray> QTimeZone::availableTimeZoneIds(QLocale::Territory territory)
Returns a list of all available IANA time zone IDs with a given standard
time offset of \a offsetSeconds.
- \sa isTimeZoneIdAvailable()
+ Where the given offset is supported, \c{QTimeZone(offsetSeconds).id()} is
+ included in the list, even if it is not an IANA ID. This only arises when
+ there is no IANA UTC-offset ID with the given offset.
+
+ This method is only available when feature \c timezone is enabled.
+
+ \sa isTimeZoneIdAvailable(), QTimeZone(int)
*/
QList<QByteArray> QTimeZone::availableTimeZoneIds(int offsetSeconds)
@@ -896,6 +1507,8 @@ QList<QByteArray> QTimeZone::availableTimeZoneIds(int offsetSeconds)
/*!
Returns the Windows ID equivalent to the given \a ianaId.
+ This method is only available when feature \c timezone is enabled.
+
\sa windowsIdToDefaultIanaId(), windowsIdToIanaIds()
*/
@@ -908,9 +1521,11 @@ QByteArray QTimeZone::ianaIdToWindowsId(const QByteArray &ianaId)
Returns the default IANA ID for a given \a windowsId.
Because a Windows ID can cover several IANA IDs in several different
- countries, this function returns the most frequently used IANA ID with no
- regard for the country and should thus be used with care. It is usually
- best to request the default for a specific country.
+ territories, this function returns the most frequently used IANA ID with no
+ regard for the territory and should thus be used with care. It is usually
+ best to request the default for a specific territory.
+
+ This method is only available when feature \c timezone is enabled.
\sa ianaIdToWindowsId(), windowsIdToIanaIds()
*/
@@ -926,13 +1541,16 @@ QByteArray QTimeZone::windowsIdToDefaultIanaId(const QByteArray &windowsId)
Because a Windows ID can cover several IANA IDs within a given territory,
the most frequently used IANA ID in that territory is returned.
- As a special case, QLocale::AnyTerritory returns the default of those IANA IDs
- that do not have any specific territory.
+ As a special case, \l{QLocale::}{AnyTerritory} returns the default of those
+ IANA IDs that have no known territorial association.
- \sa ianaIdToWindowsId(), windowsIdToIanaIds()
+ This method is only available when feature \c timezone is enabled.
+
+ \sa ianaIdToWindowsId(), windowsIdToIanaIds(), territory()
*/
-QByteArray QTimeZone::windowsIdToDefaultIanaId(const QByteArray &windowsId, QLocale::Territory territory)
+QByteArray QTimeZone::windowsIdToDefaultIanaId(const QByteArray &windowsId,
+ QLocale::Territory territory)
{
return QTimeZonePrivate::windowsIdToDefaultIanaId(windowsId, territory);
}
@@ -942,6 +1560,8 @@ QByteArray QTimeZone::windowsIdToDefaultIanaId(const QByteArray &windowsId, QLoc
The returned list is sorted alphabetically.
+ This method is only available when feature \c timezone is enabled.
+
\sa ianaIdToWindowsId(), windowsIdToDefaultIanaId()
*/
@@ -953,28 +1573,77 @@ QList<QByteArray> QTimeZone::windowsIdToIanaIds(const QByteArray &windowsId)
/*!
Returns all the IANA IDs for a given \a windowsId and \a territory.
- As a special case QLocale::AnyTerritory returns those IANA IDs that do
- not have any specific territory.
+ As a special case, \l{QLocale::}{AnyTerritory} selects those IANA IDs that
+ have no known territorial association.
The returned list is in order of frequency of usage, i.e. larger zones
within a territory are listed first.
- \sa ianaIdToWindowsId(), windowsIdToDefaultIanaId()
+ This method is only available when feature \c timezone is enabled.
+
+ \sa ianaIdToWindowsId(), windowsIdToDefaultIanaId(), territory()
*/
-QList<QByteArray> QTimeZone::windowsIdToIanaIds(const QByteArray &windowsId, QLocale::Territory territory)
+QList<QByteArray> QTimeZone::windowsIdToIanaIds(const QByteArray &windowsId,
+ QLocale::Territory territory)
{
return QTimeZonePrivate::windowsIdToIanaIds(windowsId, territory);
}
+/*!
+ \fn QTimeZone QTimeZone::fromStdTimeZonePtr(const std::chrono::time_zone *timeZone)
+ \since 6.4
+
+ Returns a QTimeZone object representing the same time zone as \a timeZone.
+ The IANA ID of \a timeZone must be one of the available system IDs,
+ otherwise an invalid time zone will be returned.
+
+ This method is only available when feature \c timezone is enabled.
+*/
+#endif // feature timezone
+
+template <typename Stream, typename Wrap>
+void QTimeZone::Data::serialize(Stream &out, const Wrap &wrap) const
+{
+ if (isShort()) {
+ switch (s.spec()) {
+ case Qt::UTC:
+ out << wrap("QTimeZone::UTC");
+ break;
+ case Qt::LocalTime:
+ out << wrap("QTimeZone::LocalTime");
+ break;
+ case Qt::OffsetFromUTC:
+ out << wrap("AheadOfUtcBy") << int(s.offset);
+ break;
+ case Qt::TimeZone:
+ Q_UNREACHABLE();
+ break;
+ }
+ return;
+ }
+#if QT_CONFIG(timezone)
+ if constexpr (std::is_same<Stream, QDataStream>::value) {
+ if (d)
+ d->serialize(out);
+ } else {
+ // QDebug, traditionally gets a QString, hence quotes round the (possibly empty) ID:
+ out << QString::fromUtf8(d ? QByteArrayView(d->id()) : QByteArrayView());
+ }
+#endif
+}
+
#ifndef QT_NO_DATASTREAM
// Invalid, as an IANA ID: too long, starts with - and has other invalid characters in it
static inline QString invalidId() { return QStringLiteral("-No Time Zone Specified!"); }
QDataStream &operator<<(QDataStream &ds, const QTimeZone &tz)
{
+ const auto toQString = [](const char *text) {
+ return QString(QLatin1StringView(text));
+ };
if (tz.isValid())
- tz.d->serialize(ds);
+ tz.d.serialize(ds, toQString);
else
ds << invalidId();
return ds;
@@ -984,27 +1653,42 @@ QDataStream &operator>>(QDataStream &ds, QTimeZone &tz)
{
QString ianaId;
ds >> ianaId;
+ // That may be various things other than actual IANA IDs:
if (ianaId == invalidId()) {
tz = QTimeZone();
- } else if (ianaId == QLatin1String("OffsetFromUtc")) {
+ } else if (ianaId == "OffsetFromUtc"_L1) {
int utcOffset;
QString name;
QString abbreviation;
int territory;
QString comment;
ds >> ianaId >> utcOffset >> name >> abbreviation >> territory >> comment;
+#if QT_CONFIG(timezone)
// Try creating as a system timezone, which succeeds (producing a valid
// zone) iff ianaId is valid; use this if it is a plain offset from UTC
// zone, with the right offset, ignoring the other data:
tz = QTimeZone(ianaId.toUtf8());
if (!tz.isValid() || tz.hasDaylightTime()
- || tz.offsetFromUtc(QDateTime::fromMSecsSinceEpoch(0, Qt::UTC)) != utcOffset) {
+ || tz.offsetFromUtc(QDateTime::fromMSecsSinceEpoch(0, QTimeZone::UTC)) != utcOffset) {
// Construct a custom timezone using the saved values:
tz = QTimeZone(ianaId.toUtf8(), utcOffset, name, abbreviation,
QLocale::Territory(territory), comment);
}
+#else
+ tz = QTimeZone::fromSecondsAheadOfUtc(utcOffset);
+#endif
+ } else if (ianaId == "AheadOfUtcBy"_L1) {
+ int utcOffset;
+ ds >> utcOffset;
+ tz = QTimeZone::fromSecondsAheadOfUtc(utcOffset);
+ } else if (ianaId == "QTimeZone::UTC"_L1) {
+ tz = QTimeZone(QTimeZone::UTC);
+ } else if (ianaId == "QTimeZone::LocalTime"_L1) {
+ tz = QTimeZone(QTimeZone::LocalTime);
+#if QT_CONFIG(timezone)
} else {
tz = QTimeZone(ianaId.toUtf8());
+#endif
}
return ds;
}
@@ -1014,8 +1698,11 @@ QDataStream &operator>>(QDataStream &ds, QTimeZone &tz)
QDebug operator<<(QDebug dbg, const QTimeZone &tz)
{
QDebugStateSaver saver(dbg);
- //TODO Include backend and data version details?
- dbg.nospace() << "QTimeZone(" << QString::fromUtf8(tz.id()) << ')';
+ const auto asIs = [](const char *text) { return text; };
+ // TODO Include backend and data version details?
+ dbg.nospace() << "QTimeZone(";
+ tz.d.serialize(dbg, asIs);
+ dbg.nospace() << ')';
return dbg;
}
#endif
diff --git a/src/corelib/time/qtimezone.h b/src/corelib/time/qtimezone.h
index 6039749689..46c7d6312b 100644
--- a/src/corelib/time/qtimezone.h
+++ b/src/corelib/time/qtimezone.h
@@ -1,53 +1,19 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 John Layt <jlayt@kde.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
+// Copyright (C) 2017 The Qt Company Ltd.
+// Copyright (C) 2013 John Layt <jlayt@kde.org>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QTIMEZONE_H
#define QTIMEZONE_H
-#include <QtCore/qshareddata.h>
-#include <QtCore/qlocale.h>
+#include <QtCore/qcompare.h>
#include <QtCore/qdatetime.h>
+#include <QtCore/qlocale.h>
+#include <QtCore/qswap.h>
+#include <QtCore/qtclasshelpermacros.h>
-QT_REQUIRE_CONFIG(timezone);
+#include <chrono>
-#if (defined(Q_OS_DARWIN) || defined(Q_QDOC)) && !defined(QT_NO_SYSTEMLOCALE)
+#if QT_CONFIG(timezone) && (defined(Q_OS_DARWIN) || defined(Q_QDOC))
Q_FORWARD_DECLARE_CF_TYPE(CFTimeZone);
Q_FORWARD_DECLARE_OBJC_CLASS(NSTimeZone);
#endif
@@ -58,44 +24,89 @@ class QTimeZonePrivate;
class Q_CORE_EXPORT QTimeZone
{
-public:
- // Sane UTC offsets range from -14 to +14 hours:
- enum {
- // No known zone > 12 hrs West of Greenwich (Baker Island, USA)
- MinUtcOffsetSecs = -14 * 3600,
- // No known zone > 14 hrs East of Greenwich (Kiritimati, Christmas Island, Kiribati)
- MaxUtcOffsetSecs = +14 * 3600
- };
+ struct ShortData
+ {
+#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN
+ quintptr mode : 2;
+#endif
+ qintptr offset : sizeof(void *) * 8 - 2;
- enum TimeType {
- StandardTime = 0,
- DaylightTime = 1,
- GenericTime = 2
- };
+#if Q_BYTE_ORDER == Q_BIG_ENDIAN
+ quintptr mode : 2;
+#endif
- enum NameType {
- DefaultName = 0,
- LongName = 1,
- ShortName = 2,
- OffsetName = 3
+ // mode is a cycled Qt::TimeSpec, (int(spec) + 1) % 4, so that zero
+ // (lowest bits of a pointer) matches spec being Qt::TimeZone, for which
+ // Data holds a QTZP pointer instead of ShortData.
+ // Passing Qt::TimeZone gets the equivalent of a null QTZP; it is not short.
+ constexpr ShortData(Qt::TimeSpec spec, int secondsAhead = 0)
+#if Q_BYTE_ORDER == Q_BIG_ENDIAN
+ : offset(spec == Qt::OffsetFromUTC ? secondsAhead : 0),
+ mode((int(spec) + 1) & 3)
+#else
+ : mode((int(spec) + 1) & 3),
+ offset(spec == Qt::OffsetFromUTC ? secondsAhead : 0)
+#endif
+ {
+ }
+ friend constexpr bool operator==(ShortData lhs, ShortData rhs)
+ { return lhs.mode == rhs.mode && lhs.offset == rhs.offset; }
+ constexpr Qt::TimeSpec spec() const { return Qt::TimeSpec((mode + 3) & 3); }
};
- struct OffsetData {
- QString abbreviation;
- QDateTime atUtc;
- int offsetFromUtc;
- int standardTimeOffset;
- int daylightTimeOffset;
+ union Data
+ {
+ Data() noexcept;
+ Data(ShortData sd) : s(sd) {}
+ Data(const Data &other) noexcept;
+ Data(Data &&other) noexcept : d(std::exchange(other.d, nullptr)) {}
+ Data &operator=(const Data &other) noexcept;
+ Data &operator=(Data &&other) noexcept { swap(other); return *this; }
+ ~Data();
+
+ void swap(Data &other) noexcept { qt_ptr_swap(d, other.d); }
+ // isShort() is equivalent to s.spec() != Qt::TimeZone
+ bool isShort() const { return s.mode; } // a.k.a. quintptr(d) & 3
+
+ // Typse must support: out << wrap("C-strings");
+ template <typename Stream, typename Wrap>
+ void serialize(Stream &out, const Wrap &wrap) const;
+
+ Data(QTimeZonePrivate *dptr) noexcept;
+ Data &operator=(QTimeZonePrivate *dptr) noexcept;
+ const QTimeZonePrivate *operator->() const { Q_ASSERT(!isShort()); return d; }
+ QTimeZonePrivate *operator->() { Q_ASSERT(!isShort()); return d; }
+
+ QTimeZonePrivate *d = nullptr;
+ ShortData s;
};
- typedef QList<OffsetData> OffsetDataList;
+ QTimeZone(ShortData sd) : d(sd) {}
+
+public:
+ // Sane UTC offsets range from -16 to +16 hours:
+ static constexpr int MinUtcOffsetSecs = -16 * 3600;
+ // No known modern zone > 12 hrs West of Greenwich.
+ // Until 1844, Asia/Manila (in The Philippines) was at 15:56 West.
+ static constexpr int MaxUtcOffsetSecs = +16 * 3600;
+ // No known modern zone > 14 hrs East of Greenwich.
+ // Until 1867, America/Metlakatla (in Alaska) was at 15:13:42 East.
+
+ enum Initialization { LocalTime, UTC };
QTimeZone() noexcept;
- explicit QTimeZone(const QByteArray &ianaId);
+ Q_IMPLICIT QTimeZone(Initialization spec) noexcept
+ : d(ShortData(spec == UTC ? Qt::UTC : Qt::LocalTime)) {}
+
+#if QT_CONFIG(timezone)
explicit QTimeZone(int offsetSeconds);
+ explicit QTimeZone(const QByteArray &ianaId);
QTimeZone(const QByteArray &zoneId, int offsetSeconds, const QString &name,
const QString &abbreviation, QLocale::Territory territory = QLocale::AnyTerritory,
const QString &comment = QString());
- QTimeZone(const QTimeZone &other);
+#endif // timezone backends
+
+ QTimeZone(const QTimeZone &other) noexcept;
+ QTimeZone(QTimeZone &&other) noexcept : d(std::move(other.d)) {}
~QTimeZone();
QTimeZone &operator=(const QTimeZone &other);
@@ -104,17 +115,63 @@ public:
void swap(QTimeZone &other) noexcept
{ d.swap(other.d); }
+#if QT_CORE_REMOVED_SINCE(6, 7)
bool operator==(const QTimeZone &other) const;
bool operator!=(const QTimeZone &other) const;
+#endif
bool isValid() const;
+ static QTimeZone fromDurationAheadOfUtc(std::chrono::seconds offset)
+ {
+ return QTimeZone((offset.count() >= MinUtcOffsetSecs && offset.count() <= MaxUtcOffsetSecs)
+ ? ShortData(offset.count() ? Qt::OffsetFromUTC : Qt::UTC,
+ int(offset.count()))
+ : ShortData(Qt::TimeZone));
+ }
+ static QTimeZone fromSecondsAheadOfUtc(int offset)
+ {
+ return fromDurationAheadOfUtc(std::chrono::seconds{offset});
+ }
+ constexpr Qt::TimeSpec timeSpec() const noexcept { return d.s.spec(); }
+ constexpr int fixedSecondsAheadOfUtc() const noexcept
+ { return timeSpec() == Qt::OffsetFromUTC ? int(d.s.offset) : 0; }
+
+ static constexpr bool isUtcOrFixedOffset(Qt::TimeSpec spec) noexcept
+ { return spec == Qt::UTC || spec == Qt::OffsetFromUTC; }
+ constexpr bool isUtcOrFixedOffset() const noexcept { return isUtcOrFixedOffset(timeSpec()); }
+
+#if QT_CONFIG(timezone)
+ QTimeZone asBackendZone() const;
+
+ enum TimeType {
+ StandardTime = 0,
+ DaylightTime = 1,
+ GenericTime = 2
+ };
+
+ enum NameType {
+ DefaultName = 0,
+ LongName = 1,
+ ShortName = 2,
+ OffsetName = 3
+ };
+
+ struct OffsetData {
+ QString abbreviation;
+ QDateTime atUtc;
+ int offsetFromUtc;
+ int standardTimeOffset;
+ int daylightTimeOffset;
+ };
+ typedef QList<OffsetData> OffsetDataList;
+
QByteArray id() const;
QLocale::Territory territory() const;
-#if QT_DEPRECATED_SINCE(6, 6)
+# if QT_DEPRECATED_SINCE(6, 6)
QT_DEPRECATED_VERSION_X_6_6("Use territory() instead")
QLocale::Country country() const;
-#endif
+# endif
QString comment() const;
QString displayName(const QDateTime &atDateTime,
@@ -157,25 +214,44 @@ public:
static QList<QByteArray> windowsIdToIanaIds(const QByteArray &windowsId,
QLocale::Territory territory);
-#if (defined(Q_OS_DARWIN) || defined(Q_QDOC)) && !defined(QT_NO_SYSTEMLOCALE)
+# if defined(Q_OS_DARWIN) || defined(Q_QDOC)
static QTimeZone fromCFTimeZone(CFTimeZoneRef timeZone);
CFTimeZoneRef toCFTimeZone() const Q_DECL_CF_RETURNS_RETAINED;
static QTimeZone fromNSTimeZone(const NSTimeZone *timeZone);
NSTimeZone *toNSTimeZone() const Q_DECL_NS_RETURNS_AUTORELEASED;
-#endif
-
+# endif
+
+# if __cpp_lib_chrono >= 201907L || defined(Q_QDOC)
+ QT_POST_CXX17_API_IN_EXPORTED_CLASS
+ static QTimeZone fromStdTimeZonePtr(const std::chrono::time_zone *timeZone)
+ {
+ if (!timeZone)
+ return QTimeZone();
+ const std::string_view timeZoneName = timeZone->name();
+ return QTimeZone(QByteArrayView(timeZoneName).toByteArray());
+ }
+# endif
+#endif // feature timezone
private:
- QTimeZone(QTimeZonePrivate &dd);
+ friend Q_CORE_EXPORT bool comparesEqual(const QTimeZone &lhs, const QTimeZone &rhs) noexcept;
+ Q_DECLARE_EQUALITY_COMPARABLE(QTimeZone)
+
#ifndef QT_NO_DATASTREAM
friend Q_CORE_EXPORT QDataStream &operator<<(QDataStream &ds, const QTimeZone &tz);
#endif
+#ifndef QT_NO_DEBUG_STREAM
+ friend Q_CORE_EXPORT QDebug operator<<(QDebug dbg, const QTimeZone &tz);
+#endif
+ QTimeZone(QTimeZonePrivate &dd);
friend class QTimeZonePrivate;
friend class QDateTime;
friend class QDateTimePrivate;
- QSharedDataPointer<QTimeZonePrivate> d;
+ Data d;
};
+#if QT_CONFIG(timezone)
Q_DECLARE_TYPEINFO(QTimeZone::OffsetData, Q_RELOCATABLE_TYPE);
+#endif
Q_DECLARE_SHARED(QTimeZone)
#ifndef QT_NO_DATASTREAM
@@ -187,6 +263,20 @@ Q_CORE_EXPORT QDataStream &operator>>(QDataStream &ds, QTimeZone &tz);
Q_CORE_EXPORT QDebug operator<<(QDebug dbg, const QTimeZone &tz);
#endif
+#if QT_CONFIG(timezone) && __cpp_lib_chrono >= 201907L
+// zoned_time
+template <typename> // QT_POST_CXX17_API_IN_EXPORTED_CLASS
+inline QDateTime QDateTime::fromStdZonedTime(const std::chrono::zoned_time<
+ std::chrono::milliseconds,
+ const std::chrono::time_zone *
+ > &time)
+{
+ const auto sysTime = time.get_sys_time();
+ const QTimeZone timeZone = QTimeZone::fromStdTimeZonePtr(time.get_time_zone());
+ return fromMSecsSinceEpoch(sysTime.time_since_epoch().count(), timeZone);
+}
+#endif
+
QT_END_NAMESPACE
#endif // QTIMEZONE_H
diff --git a/src/corelib/time/qtimezonelocale.cpp b/src/corelib/time/qtimezonelocale.cpp
new file mode 100644
index 0000000000..5757e55d28
--- /dev/null
+++ b/src/corelib/time/qtimezonelocale.cpp
@@ -0,0 +1,29 @@
+// Copyright (C) 2024 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#include <private/qtimezonelocale_p.h>
+#include <private/qtimezoneprivate_p.h>
+
+#if !QT_CONFIG(icu) // Use data generated from CLDR:
+# include <private/qtimezonelocale_data_p.h>
+# include <private/qtimezoneprivate_data_p.h>
+#endif
+
+QT_BEGIN_NAMESPACE
+
+#if QT_CONFIG(icu) // Get data from ICU:
+namespace QtTimeZoneLocale {
+
+} // QtTimeZoneLocale
+#else // No ICU, use QTZ[LP}_data_p.h data for feature timezone_locale.
+namespace {
+using namespace QtTimeZoneLocale; // QTZL_data_p.h
+using namespace QtTimeZoneCldr; // QTZP_data_p.h
+// Accessors for the QTZL_data_p.h
+
+// Accessors for the QTZP_data_p.h
+
+} // nameless namespace
+#endif // ICU
+
+QT_END_NAMESPACE
diff --git a/src/corelib/time/qtimezonelocale_data_p.h b/src/corelib/time/qtimezonelocale_data_p.h
new file mode 100644
index 0000000000..1cdbbaa952
--- /dev/null
+++ b/src/corelib/time/qtimezonelocale_data_p.h
@@ -0,0 +1,39 @@
+// Copyright (C) 2024 The Qt Company Ltd.
+// SPDX-License-Identifier: Unicode-3.0
+
+#ifndef QTIMEZONELOCALE_DATA_P_H
+#define QTIMEZONELOCALE_DATA_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists for the convenience
+// of internal files. This header file may change from version to version
+// without notice, or even be removed.
+//
+// We mean it.
+//
+
+// Only qtimezonelocale.cpp should #include this (after other things it needs),
+// and even that only when feature icu is disabled.
+#include "qtimezonelocale_p.h"
+
+QT_REQUIRE_CONFIG(timezone_locale);
+#if QT_CONFIG(icu)
+# error "This file should only be needed (or seen) when ICU is not in use"
+#endif
+
+QT_BEGIN_NAMESPACE
+
+namespace QtTimeZoneLocale {
+
+// GENERATED PART STARTS HERE
+
+// GENERATED PART ENDS HERE
+
+} // QtTimeZoneLocale
+
+QT_END_NAMESPACE
+
+#endif // QTIMEZONELOCALE_DATA_P_H
diff --git a/src/corelib/time/qtimezonelocale_p.h b/src/corelib/time/qtimezonelocale_p.h
new file mode 100644
index 0000000000..adc8e83b35
--- /dev/null
+++ b/src/corelib/time/qtimezonelocale_p.h
@@ -0,0 +1,31 @@
+// Copyright (C) 2024 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QTIMEZONELOCALE_P_H
+#define QTIMEZONELOCALE_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists for the convenience
+// of internal files. This header file may change from version to version
+// without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QtCore/qtimezone.h>
+
+QT_REQUIRE_CONFIG(timezone);
+QT_REQUIRE_CONFIG(timezone_locale);
+
+namespace QtTimeZoneLocale {
+#if QT_CONFIG(icu)
+#else
+// Define data types for QTZL_data_p.h
+
+#endif
+}
+
+#endif // QTIMEZONELOCALE_P_H
diff --git a/src/corelib/time/qtimezoneprivate.cpp b/src/corelib/time/qtimezoneprivate.cpp
index c90547d0ee..2ad0d874b6 100644
--- a/src/corelib/time/qtimezoneprivate.cpp
+++ b/src/corelib/time/qtimezoneprivate.cpp
@@ -1,84 +1,116 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Copyright (C) 2013 John Layt <jlayt@kde.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2022 The Qt Company Ltd.
+// Copyright (C) 2013 John Layt <jlayt@kde.org>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qtimezone.h"
#include "qtimezoneprivate_p.h"
#include "qtimezoneprivate_data_p.h"
-#include <private/qnumeric_p.h>
#include <qdatastream.h>
#include <qdebug.h>
+#include <qstring.h>
+
+#include <private/qcalendarmath_p.h>
+#include <private/qnumeric_p.h>
+#include <private/qtools_p.h>
#include <algorithm>
QT_BEGIN_NAMESPACE
-/*
- Static utilities for looking up Windows ID tables
-*/
+using namespace QtMiscUtils;
+using namespace QtTimeZoneCldr;
+using namespace Qt::StringLiterals;
+
+// For use with std::is_sorted() in assertions:
+[[maybe_unused]]
+constexpr bool earlierZoneData(const ZoneData &less, const ZoneData &more) noexcept
+{
+ return less.windowsIdKey < more.windowsIdKey
+ || (less.windowsIdKey == more.windowsIdKey && less.territory < more.territory);
+}
+
+[[maybe_unused]]
+static bool earlierWinData(const WindowsData &less, const WindowsData &more) noexcept
+{
+ // Actually only tested in the negative, to check more < less never happens,
+ // so should be true if more < less in either part; hence || not && combines.
+ return less.windowsIdKey < more.windowsIdKey
+ || less.windowsId().compare(more.windowsId(), Qt::CaseInsensitive) < 0;
+}
+
+// For use with std::lower_bound():
+constexpr bool atLowerUtcOffset(const UtcData &entry, qint32 offsetSeconds) noexcept
+{
+ return entry.offsetFromUtc < offsetSeconds;
+}
+
+constexpr bool atLowerWindowsKey(const WindowsData &entry, qint16 winIdKey) noexcept
+{
+ return entry.windowsIdKey < winIdKey;
+}
+
+static bool earlierWindowsId(const WindowsData &entry, QByteArrayView winId) noexcept
+{
+ return entry.windowsId().compare(winId, Qt::CaseInsensitive) < 0;
+}
+
+constexpr bool zoneAtLowerWindowsKey(const ZoneData &entry, qint16 winIdKey) noexcept
+{
+ return entry.windowsIdKey < winIdKey;
+}
+// Static table-lookup helpers
static quint16 toWindowsIdKey(const QByteArray &winId)
{
- for (const QWindowsData &data : windowsDataTable) {
- if (data.windowsId() == winId)
- return data.windowsIdKey;
- }
+ // Key and winId are monotonic, table is sorted on them.
+ const auto data = std::lower_bound(std::begin(windowsDataTable), std::end(windowsDataTable),
+ winId, earlierWindowsId);
+ if (data != std::end(windowsDataTable) && data->windowsId() == winId)
+ return data->windowsIdKey;
return 0;
}
static QByteArray toWindowsIdLiteral(quint16 windowsIdKey)
{
- for (const QWindowsData &data : windowsDataTable) {
- if (data.windowsIdKey == windowsIdKey)
+ // Caller should be passing a valid (in range) key; and table is sorted in
+ // increasing order, with no gaps in numbering, starting with key = 1 at
+ // index [0]. So this should normally work:
+ if (Q_LIKELY(windowsIdKey > 0 && windowsIdKey <= std::size(windowsDataTable))) {
+ const auto &data = windowsDataTable[windowsIdKey - 1];
+ if (Q_LIKELY(data.windowsIdKey == windowsIdKey))
return data.windowsId().toByteArray();
}
+ // Fall back on binary chop - key and winId are monotonic, table is sorted on them:
+ const auto data = std::lower_bound(std::begin(windowsDataTable), std::end(windowsDataTable),
+ windowsIdKey, atLowerWindowsKey);
+ if (data != std::end(windowsDataTable) && data->windowsIdKey == windowsIdKey)
+ return data->windowsId().toByteArray();
+
return QByteArray();
}
+static auto zoneStartForWindowsId(quint16 windowsIdKey) noexcept
+{
+ // Caller must check the resulting iterator isn't std::end(zoneDataTable)
+ // and does match windowsIdKey, since this is just the lower bound.
+ return std::lower_bound(std::begin(zoneDataTable), std::end(zoneDataTable),
+ windowsIdKey, zoneAtLowerWindowsKey);
+}
+
/*
Base class implementing common utility routines, only instantiate for a null tz.
*/
QTimeZonePrivate::QTimeZonePrivate()
{
+ // If std::is_sorted() were constexpr, the first could be a static_assert().
+ // From C++20, we should be able to rework it in terms of std::all_of().
+ Q_ASSERT(std::is_sorted(std::begin(zoneDataTable), std::end(zoneDataTable),
+ earlierZoneData));
+ Q_ASSERT(std::is_sorted(std::begin(windowsDataTable), std::end(windowsDataTable),
+ earlierWinData));
}
QTimeZonePrivate::QTimeZonePrivate(const QTimeZonePrivate &other)
@@ -121,9 +153,9 @@ QByteArray QTimeZonePrivate::id() const
QLocale::Territory QTimeZonePrivate::territory() const
{
// Default fall-back mode, use the zoneTable to find Region of known Zones
- const QLatin1String sought(m_id.data(), m_id.size());
- for (const QZoneData &data : zoneDataTable) {
- for (QLatin1String token : data.ids()) {
+ const QLatin1StringView sought(m_id.data(), m_id.size());
+ for (const ZoneData &data : zoneDataTable) {
+ for (QLatin1StringView token : data.ids()) {
if (token == sought)
return QLocale::Territory(data.territory);
}
@@ -161,8 +193,7 @@ QString QTimeZonePrivate::displayName(QTimeZone::TimeType timeType,
QString QTimeZonePrivate::abbreviation(qint64 atMSecsSinceEpoch) const
{
- Q_UNUSED(atMSecsSinceEpoch);
- return QString();
+ return displayName(atMSecsSinceEpoch, QTimeZone::ShortName, QLocale::c());
}
int QTimeZonePrivate::offsetFromUtc(qint64 atMSecsSinceEpoch) const
@@ -199,46 +230,60 @@ bool QTimeZonePrivate::isDaylightTime(qint64 atMSecsSinceEpoch) const
QTimeZonePrivate::Data QTimeZonePrivate::data(qint64 forMSecsSinceEpoch) const
{
Q_UNUSED(forMSecsSinceEpoch);
- return invalidData();
+ return {};
}
// Private only method for use by QDateTime to convert local msecs to epoch msecs
-QTimeZonePrivate::Data QTimeZonePrivate::dataForLocalTime(qint64 forLocalMSecs, int hint) const
-{
-#ifndef Q_OS_ANDROID
- // The Android back-end's hasDaylightTime() is only true for zones with
- // transitions in the future; we need it to mean "has ever had a transition"
- // though, so can't trust it here.
- if (!hasDaylightTime()) // No DST means same offset for all local msecs
- return data(forLocalMSecs - standardTimeOffset(forLocalMSecs) * 1000);
-#endif
+QDateTimePrivate::ZoneState QTimeZonePrivate::stateAtZoneTime(
+ qint64 forLocalMSecs, QDateTimePrivate::TransitionOptions resolve) const
+{
+ auto dataToState = [](const QTimeZonePrivate::Data &d) {
+ return QDateTimePrivate::ZoneState(d.atMSecsSinceEpoch + d.offsetFromUtc * 1000,
+ d.offsetFromUtc,
+ d.daylightTimeOffset ? QDateTimePrivate::DaylightTime
+ : QDateTimePrivate::StandardTime);
+ };
/*
We need a UTC time at which to ask for the offset, in order to be able to
- add that offset to forLocalMSecs, to get the UTC time we
- need. Fortunately, no time-zone offset is more than 14 hours; and DST
- transitions happen (much) more than thirty-two hours apart. So sampling
- offset sixteen hours each side gives us information we can be sure
+ add that offset to forLocalMSecs, to get the UTC time we need.
+ Fortunately, all time-zone offsets have been less than 17 hours; and DST
+ transitions happen (much) more than thirty-four hours apart. So sampling
+ offset seventeen hours each side gives us information we can be sure
brackets the correct time and at most one DST transition.
*/
- std::integral_constant<qint64, 16 * 3600 * 1000> sixteenHoursInMSecs;
- static_assert(-sixteenHoursInMSecs / 1000 < QTimeZone::MinUtcOffsetSecs
- && sixteenHoursInMSecs / 1000 > QTimeZone::MaxUtcOffsetSecs);
- using Bound = std::numeric_limits<qint64>;
+ std::integral_constant<qint64, 17 * 3600 * 1000> seventeenHoursInMSecs;
+ static_assert(-seventeenHoursInMSecs / 1000 < QTimeZone::MinUtcOffsetSecs
+ && seventeenHoursInMSecs / 1000 > QTimeZone::MaxUtcOffsetSecs);
qint64 millis;
+ // Clip the bracketing times to the bounds of the supported range.
const qint64 recent =
- sub_overflow(forLocalMSecs, sixteenHoursInMSecs, &millis)
- ? Bound::min() : millis;
+ qSubOverflow(forLocalMSecs, seventeenHoursInMSecs, &millis) || millis < minMSecs()
+ ? minMSecs() : millis; // Necessarily <= forLocalMSecs + 1.
+ // (Given that minMSecs() is std::numeric_limits<qint64>::min() + 1.)
const qint64 imminent =
- add_overflow(forLocalMSecs, sixteenHoursInMSecs, &millis)
- ? Bound::max() : millis;
- // At most one of those took the boundary value:
- Q_ASSERT(recent < imminent && sixteenHoursInMSecs < imminent - recent);
+ qAddOverflow(forLocalMSecs, seventeenHoursInMSecs, &millis)
+ ? maxMSecs() : millis; // Necessarily >= forLocalMSecs
+ // At most one of those was clipped to its boundary value:
+ Q_ASSERT(recent < imminent && seventeenHoursInMSecs < imminent - recent + 1);
+
+ const Data past = data(recent), future = data(imminent);
+ // > 99% of the time, past and future will agree:
+ if (Q_LIKELY(past.offsetFromUtc == future.offsetFromUtc
+ && past.standardTimeOffset == future.standardTimeOffset
+ // Those two imply same daylightTimeOffset.
+ && past.abbreviation == future.abbreviation)) {
+ Data data = future;
+ data.atMSecsSinceEpoch = forLocalMSecs - future.offsetFromUtc * 1000;
+ return dataToState(data);
+ }
+
/*
Offsets are Local - UTC, positive to the east of Greenwich, negative to
- the west; DST offset always exceeds standard offset, when DST applies.
+ the west; DST offset normally exceeds standard offset, when DST applies.
When we have offsets on either side of a transition, the lower one is
- standard, the higher is DST.
+ standard, the higher is DST, unless we have data telling us it's the other
+ way round.
Non-DST transitions (jurisdictions changing time-zone and time-zones
changing their standard offset, typically) are described below as if they
@@ -250,60 +295,34 @@ QTimeZonePrivate::Data QTimeZonePrivate::dataForLocalTime(qint64 forLocalMSecs,
and take the easy path; with transitions, tran and nextTran get the
correct UTC time as atMSecsSinceEpoch so comparing to nextStart selects
the right one. In all other cases, the transition changes offset and the
- reasoning that applies to DST applies just the same. Aside from hinting,
- the only thing that looks at DST-ness at all, other than inferred from
- offset changes, is the case without transition data handling an invalid
- time in the gap that a transition passed over.
-
- The handling of hint (see below) is apt to go wrong in non-DST
- transitions. There isn't really a great deal we can hope to do about that
- without adding yet more unreliable complexity to the heuristics in use for
- already obscure corner-cases.
- */
-
- /*
- The hint (really a QDateTimePrivate::DaylightStatus) is > 0 if caller
- thinks we're in DST, 0 if in standard. A value of -2 means never-DST, so
- should have been handled above; if it slips through, it's wrong but we
- should probably treat it as standard anyway (never-DST means
- always-standard, after all). If the hint turns out to be wrong, fall back
- on trying the other possibility: which makes it harmless to treat -1
- (meaning unknown) as standard (i.e. try standard first, then try DST). In
- practice, away from a transition, the only difference hint makes is to
- which candidate we try first: if the hint is wrong (or unknown and
- standard fails), we'll try the other candidate and it'll work.
-
- For the obscure (and invalid) case where forLocalMSecs falls in a
- spring-forward's missing hour, a common case is that we started with a
- date/time for which the hint was valid and adjusted it naively; for that
- case, we should correct the adjustment by shunting across the transition
- into where hint is wrong. So half-way through the gap, arrived at from
- the DST side, should be read as an hour earlier, in standard time; but, if
- arrived at from the standard side, should be read as an hour later, in
- DST. (This shall be wrong in some cases; for example, when a country
- changes its transition dates and changing a date/time by more than six
- months lands it on a transition. However, these cases are even more
- obscure than those where the heuristic is good.)
- */
-
+ reasoning that applies to DST applies just the same.
+
+ The resolution of transitions, specified by \a resolve, may be lead astray
+ if (as happens on Windows) the backend has been obliged to guess whether a
+ transition is in fact a DST one or a change to standard offset; or to
+ guess that the higher-offset side is the DST one (the reverse of this is
+ true for Ireland, using negative DST). There's not much we can do about
+ that, though.
+ */
if (hasTransitions()) {
/*
We have transitions.
- Each transition gives the offsets to use until the next; so we need the
- most recent transition before the time forLocalMSecs describes. If it
- describes a time *in* a transition, we'll need both that transition and
- the one before it. So find one transition that's probably after (and not
- much before, otherwise) and another that's definitely before, then work
- out which one to use. When both or neither work on forLocalMSecs, use
- hint to disambiguate.
+ Each transition gives the offsets to use until the next; so we need
+ the most recent transition before the time forLocalMSecs describes. If
+ it describes a time *in* a transition, we'll need both that transition
+ and the one before it. So find one transition that's probably after
+ (and not much before, otherwise) and another that's definitely before,
+ then work out which one to use. When both or neither work on
+ forLocalMSecs, use resolve to disambiguate.
*/
// Get a transition definitely before the local MSecs; usually all we need.
// Only around the transition times might we need another.
- Data tran = previousTransition(recent);
+ Data tran = past; // Data after last transition before our window.
Q_ASSERT(forLocalMSecs < 0 || // Pre-epoch TZ info may be unavailable
forLocalMSecs - tran.offsetFromUtc * 1000 >= tran.atMSecsSinceEpoch);
+ // If offset actually exceeds 17 hours, that assert may trigger.
Data nextTran = nextTransition(tran.atMSecsSinceEpoch);
/*
Now walk those forward until they bracket forLocalMSecs with transitions.
@@ -311,7 +330,7 @@ QTimeZonePrivate::Data QTimeZonePrivate::dataForLocalTime(qint64 forLocalMSecs,
One of the transitions should then be telling us the right offset to use.
In a transition, we need the transition before it (to describe the run-up
to the transition) and the transition itself; so we need to stop when
- nextTran is that transition.
+ nextTran is (invalid or) that transition.
*/
while (nextTran.atMSecsSinceEpoch != invalidMSecs()
&& forLocalMSecs > nextTran.atMSecsSinceEpoch + nextTran.offsetFromUtc * 1000) {
@@ -335,56 +354,75 @@ QTimeZonePrivate::Data QTimeZonePrivate::dataForLocalTime(qint64 forLocalMSecs,
// If we know of no transition after it, the answer is easy:
const qint64 nextStart = nextTran.atMSecsSinceEpoch;
if (nextStart == invalidMSecs())
- return tran;
+ return dataToState(tran); // Last valid transition.
/*
... and nextTran is either after or only slightly before. We're
going to interpret one as standard time, the other as DST
(although the transition might in fact be a change in standard
- offset, or a change in DST offset, e.g. to/from double-DST). Our
- hint tells us which of those to use (defaulting to standard if no
- hint): try it first; if that fails, try the other; if both fail,
- life's tricky.
+ offset, or a change in DST offset, e.g. to/from double-DST).
+
+ Usually exactly one of those shall be relevant and we'll use it;
+ but if we're close to nextTran we may be in a transition, to be
+ settled according to resolve's rules.
*/
// Work out the UTC value it would make sense to return if using nextTran:
nextTran.atMSecsSinceEpoch = forLocalMSecs - nextTran.offsetFromUtc * 1000;
- // If both or neither have zero DST, treat the one with lower offset as standard:
- const bool nextIsDst = !nextTran.daylightTimeOffset == !tran.daylightTimeOffset
- ? tran.offsetFromUtc < nextTran.offsetFromUtc : nextTran.daylightTimeOffset;
- // If that agrees with hint > 0, our first guess is to use nextTran; else tran.
- const bool nextFirst = nextIsDst == (hint > 0);
- for (int i = 0; i < 2; i++) {
- /*
- On the first pass, the case we consider is what hint told us to expect
- (except when hint was -1 and didn't actually tell us what to expect),
- so it's likely right. We only get a second pass if the first failed,
- by which time the second case, that we're trying, is likely right.
- */
- if (nextFirst ? i == 0 : i) {
- if (nextStart <= nextTran.atMSecsSinceEpoch)
- return nextTran;
- } else {
- // If next is invalid, nextFirst is false, to route us here first:
- if (nextStart > tran.atMSecsSinceEpoch)
- return tran;
- }
+ bool fallBack = false;
+ if (nextStart > nextTran.atMSecsSinceEpoch) {
+ // If both UTC values are before nextTran's offset applies, use tran:
+ if (nextStart > tran.atMSecsSinceEpoch)
+ return dataToState(tran);
+
+ Q_ASSERT(tran.offsetFromUtc < nextTran.offsetFromUtc);
+ // We're in a spring-forward.
+ } else if (nextStart <= tran.atMSecsSinceEpoch) {
+ // Both UTC values say we should be using nextTran:
+ return dataToState(nextTran);
+ } else {
+ Q_ASSERT(nextTran.offsetFromUtc < tran.offsetFromUtc);
+ fallBack = true; // We're in a fall-back.
}
-
- /*
- Neither is valid (e.g. in a spring-forward's gap) and
- nextTran.atMSecsSinceEpoch < nextStart <= tran.atMSecsSinceEpoch, so
- 0 < tran.atMSecsSinceEpoch - nextTran.atMSecsSinceEpoch
- = (nextTran.offsetFromUtc - tran.offsetFromUtc) * 1000
- */
- int dstStep = (nextTran.offsetFromUtc - tran.offsetFromUtc) * 1000;
- Q_ASSERT(dstStep > 0); // How else could we get here ?
- if (nextFirst) { // hint thought we needed nextTran, so use tran
- tran.atMSecsSinceEpoch -= dstStep;
- return tran;
+ // (forLocalMSecs - nextStart) / 1000 lies between the two offsets.
+
+ // Apply resolve:
+ // Determine whether FlipForReverseDst affects the outcome:
+ const bool flipped
+ = resolve.testFlag(QDateTimePrivate::FlipForReverseDst)
+ && (fallBack ? !tran.daylightTimeOffset && nextTran.daylightTimeOffset
+ : tran.daylightTimeOffset && !nextTran.daylightTimeOffset);
+
+ if (fallBack) {
+ if (resolve.testFlag(flipped
+ ? QDateTimePrivate::FoldUseBefore
+ : QDateTimePrivate::FoldUseAfter)) {
+ return dataToState(nextTran);
+ }
+ if (resolve.testFlag(flipped
+ ? QDateTimePrivate::FoldUseAfter
+ : QDateTimePrivate::FoldUseBefore)) {
+ return dataToState(tran);
+ }
+ } else {
+ /* Neither is valid (e.g. in a spring-forward's gap) and
+ nextTran.atMSecsSinceEpoch < nextStart <= tran.atMSecsSinceEpoch.
+ So swap their atMSecsSinceEpoch to give each a moment on the
+ side of the transition that it describes, then select the one
+ after or before according to the option set:
+ */
+ std::swap(tran.atMSecsSinceEpoch, nextTran.atMSecsSinceEpoch);
+ if (resolve.testFlag(flipped
+ ? QDateTimePrivate::GapUseBefore
+ : QDateTimePrivate::GapUseAfter))
+ return dataToState(nextTran);
+ if (resolve.testFlag(flipped
+ ? QDateTimePrivate::GapUseAfter
+ : QDateTimePrivate::GapUseBefore))
+ return dataToState(tran);
}
- nextTran.atMSecsSinceEpoch += dstStep;
- return nextTran;
+ // Reject
+ return {forLocalMSecs};
}
// Before first transition, or system has transitions but not for this zone.
// Try falling back to offsetFromUtc (works for before first transition, at least).
@@ -393,41 +431,54 @@ QTimeZonePrivate::Data QTimeZonePrivate::dataForLocalTime(qint64 forLocalMSecs,
/* Bracket and refine to discover offset. */
qint64 utcEpochMSecs;
- int early = offsetFromUtc(recent);
- int late = offsetFromUtc(imminent);
- if (early == late // > 99% of the time
- || late == invalidSeconds()) {
+ // We don't have true data on DST-ness, so can't apply FlipForReverseDst.
+ int early = past.offsetFromUtc;
+ int late = future.offsetFromUtc;
+ if (early == late || late == invalidSeconds()) {
if (early == invalidSeconds()
- || sub_overflow(forLocalMSecs, early * qint64(1000), &utcEpochMSecs)) {
- return invalidData(); // Outside representable range
+ || qSubOverflow(forLocalMSecs, early * qint64(1000), &utcEpochMSecs)) {
+ return {forLocalMSecs}; // Outside representable range
}
} else {
- // Close to a DST transition: early > late is near a fall-back,
- // early < late is near a spring-forward.
- const int offsetInDst = qMax(early, late);
- const int offsetInStd = qMin(early, late);
// Candidate values for utcEpochMSecs (if forLocalMSecs is valid):
- const qint64 forDst = forLocalMSecs - offsetInDst * 1000;
- const qint64 forStd = forLocalMSecs - offsetInStd * 1000;
- // Best guess at the answer:
- const qint64 hinted = hint > 0 ? forDst : forStd;
- if (offsetFromUtc(hinted) == (hint > 0 ? offsetInDst : offsetInStd)) {
- utcEpochMSecs = hinted;
- } else if (hint <= 0 && offsetFromUtc(forDst) == offsetInDst) {
- utcEpochMSecs = forDst;
- } else if (hint > 0 && offsetFromUtc(forStd) == offsetInStd) {
- utcEpochMSecs = forStd;
+ const qint64 forEarly = forLocalMSecs - early * 1000;
+ const qint64 forLate = forLocalMSecs - late * 1000;
+ // If either of those doesn't have the offset we got it from, it's on
+ // the wrong side of the transition (and both may be, for a gap):
+ const bool earlyOk = offsetFromUtc(forEarly) == early;
+ const bool lateOk = offsetFromUtc(forLate) == late;
+
+ if (earlyOk) {
+ if (lateOk) {
+ Q_ASSERT(early > late);
+ // fall-back's repeated interval
+ if (resolve.testFlag(QDateTimePrivate::FoldUseBefore))
+ utcEpochMSecs = forEarly;
+ else if (resolve.testFlag(QDateTimePrivate::FoldUseAfter))
+ utcEpochMSecs = forLate;
+ else
+ return {forLocalMSecs};
+ } else {
+ // Before and clear of the transition:
+ utcEpochMSecs = forEarly;
+ }
+ } else if (lateOk) {
+ // After and clear of the transition:
+ utcEpochMSecs = forLate;
} else {
- // Invalid forLocalMSecs: in spring-forward gap.
- const int dstStep = (offsetInDst - offsetInStd) * 1000;
- // That'll typically be the DST offset at imminent, but changes to
- // standard time have zero DST offset both before and after.
- Q_ASSERT(dstStep > 0); // There can't be a gap without it !
- utcEpochMSecs = (hint > 0) ? forStd - dstStep : forDst + dstStep;
+ // forLate <= gap < forEarly
+ Q_ASSERT(late > early);
+ const int dstStep = (late - early) * 1000;
+ if (resolve.testFlag(QDateTimePrivate::GapUseBefore))
+ utcEpochMSecs = forEarly - dstStep;
+ else if (resolve.testFlag(QDateTimePrivate::GapUseAfter))
+ utcEpochMSecs = forLate + dstStep;
+ else
+ return {forLocalMSecs};
}
}
- return data(utcEpochMSecs);
+ return dataToState(data(utcEpochMSecs));
}
bool QTimeZonePrivate::hasTransitions() const
@@ -438,13 +489,13 @@ bool QTimeZonePrivate::hasTransitions() const
QTimeZonePrivate::Data QTimeZonePrivate::nextTransition(qint64 afterMSecsSinceEpoch) const
{
Q_UNUSED(afterMSecsSinceEpoch);
- return invalidData();
+ return {};
}
QTimeZonePrivate::Data QTimeZonePrivate::previousTransition(qint64 beforeMSecsSinceEpoch) const
{
Q_UNUSED(beforeMSecsSinceEpoch);
- return invalidData();
+ return {};
}
QTimeZonePrivate::DataList QTimeZonePrivate::transitions(qint64 fromMSecsSinceEpoch,
@@ -470,7 +521,8 @@ QByteArray QTimeZonePrivate::systemTimeZoneId() const
bool QTimeZonePrivate::isTimeZoneIdAvailable(const QByteArray& ianaId) const
{
- // Fall-back implementation, can be made faster in subclasses
+ // Fall-back implementation, can be made faster in subclasses.
+ // Backends that don't cache the available list SHOULD override this.
const QList<QByteArray> tzIds = availableTimeZoneIds();
return std::binary_search(tzIds.begin(), tzIds.end(), ianaId);
}
@@ -480,29 +532,31 @@ QList<QByteArray> QTimeZonePrivate::availableTimeZoneIds() const
return QList<QByteArray>();
}
+static QList<QByteArray> selectAvailable(QList<QByteArray>&& desired, const QList<QByteArray>& all)
+{
+ std::sort(desired.begin(), desired.end());
+ const auto newEnd = std::unique(desired.begin(), desired.end());
+ const auto newSize = std::distance(desired.begin(), newEnd);
+ QList<QByteArray> result;
+ result.reserve(qMin(all.size(), newSize));
+ std::set_intersection(all.begin(), all.end(), desired.cbegin(),
+ std::next(desired.cbegin(), newSize), std::back_inserter(result));
+ return result;
+}
+
QList<QByteArray> QTimeZonePrivate::availableTimeZoneIds(QLocale::Territory territory) const
{
// Default fall-back mode, use the zoneTable to find Region of know Zones
QList<QByteArray> regions;
// First get all Zones in the Zones table belonging to the Region
- for (const QZoneData &data : zoneDataTable) {
+ for (const ZoneData &data : zoneDataTable) {
if (data.territory == territory) {
for (auto l1 : data.ids())
regions << QByteArray(l1.data(), l1.size());
}
}
-
- std::sort(regions.begin(), regions.end());
- regions.erase(std::unique(regions.begin(), regions.end()), regions.end());
-
- // Then select just those that are available
- const QList<QByteArray> all = availableTimeZoneIds();
- QList<QByteArray> result;
- result.reserve(qMin(all.size(), regions.size()));
- std::set_intersection(all.begin(), all.end(), regions.cbegin(), regions.cend(),
- std::back_inserter(result));
- return result;
+ return selectAvailable(std::move(regions), availableTimeZoneIds());
}
QList<QByteArray> QTimeZonePrivate::availableTimeZoneIds(int offsetFromUtc) const
@@ -510,27 +564,17 @@ QList<QByteArray> QTimeZonePrivate::availableTimeZoneIds(int offsetFromUtc) cons
// Default fall-back mode, use the zoneTable to find Offset of know Zones
QList<QByteArray> offsets;
// First get all Zones in the table using the Offset
- for (const QWindowsData &winData : windowsDataTable) {
+ for (const WindowsData &winData : windowsDataTable) {
if (winData.offsetFromUtc == offsetFromUtc) {
- for (const QZoneData &data : zoneDataTable) {
- if (data.windowsIdKey == winData.windowsIdKey) {
- for (auto l1 : data.ids())
- offsets << QByteArray(l1.data(), l1.size());
- }
+ for (auto data = zoneStartForWindowsId(winData.windowsIdKey);
+ data != std::end(zoneDataTable) && data->windowsIdKey == winData.windowsIdKey;
+ ++data) {
+ for (auto l1 : data->ids())
+ offsets << QByteArray(l1.data(), l1.size());
}
}
}
-
- std::sort(offsets.begin(), offsets.end());
- offsets.erase(std::unique(offsets.begin(), offsets.end()), offsets.end());
-
- // Then select just those that are available
- const QList<QByteArray> all = availableTimeZoneIds();
- QList<QByteArray> result;
- result.reserve(qMin(all.size(), offsets.size()));
- std::set_intersection(all.begin(), all.end(), offsets.cbegin(), offsets.cend(),
- std::back_inserter(result));
- return result;
+ return selectAvailable(std::move(offsets), availableTimeZoneIds());
}
#ifndef QT_NO_DATASTREAM
@@ -542,53 +586,41 @@ void QTimeZonePrivate::serialize(QDataStream &ds) const
// Static Utility Methods
-QTimeZonePrivate::Data QTimeZonePrivate::invalidData()
-{
- Data data;
- data.atMSecsSinceEpoch = invalidMSecs();
- data.offsetFromUtc = invalidSeconds();
- data.standardTimeOffset = invalidSeconds();
- data.daylightTimeOffset = invalidSeconds();
- return data;
-}
-
QTimeZone::OffsetData QTimeZonePrivate::invalidOffsetData()
{
- QTimeZone::OffsetData offsetData;
- offsetData.atUtc = QDateTime();
- offsetData.offsetFromUtc = invalidSeconds();
- offsetData.standardTimeOffset = invalidSeconds();
- offsetData.daylightTimeOffset = invalidSeconds();
- return offsetData;
+ return { QString(), QDateTime(),
+ invalidSeconds(), invalidSeconds(), invalidSeconds() };
}
QTimeZone::OffsetData QTimeZonePrivate::toOffsetData(const QTimeZonePrivate::Data &data)
{
- QTimeZone::OffsetData offsetData = invalidOffsetData();
- if (data.atMSecsSinceEpoch != invalidMSecs()) {
- offsetData.atUtc = QDateTime::fromMSecsSinceEpoch(data.atMSecsSinceEpoch, Qt::UTC);
- offsetData.offsetFromUtc = data.offsetFromUtc;
- offsetData.standardTimeOffset = data.standardTimeOffset;
- offsetData.daylightTimeOffset = data.daylightTimeOffset;
- offsetData.abbreviation = data.abbreviation;
- }
- return offsetData;
+ if (data.atMSecsSinceEpoch == invalidMSecs())
+ return invalidOffsetData();
+
+ return {
+ data.abbreviation,
+ QDateTime::fromMSecsSinceEpoch(data.atMSecsSinceEpoch, QTimeZone::UTC),
+ data.offsetFromUtc, data.standardTimeOffset, data.daylightTimeOffset };
}
// Is the format of the ID valid ?
bool QTimeZonePrivate::isValidId(const QByteArray &ianaId)
{
/*
- Main rules for defining TZ/IANA names as per ftp://ftp.iana.org/tz/code/Theory
+ Main rules for defining TZ/IANA names, as per
+ https://www.iana.org/time-zones/repository/theory.html, are:
1. Use only valid POSIX file name components
2. Within a file name component, use only ASCII letters, `.', `-' and `_'.
3. Do not use digits (except in a [+-]\d+ suffix, when used).
4. A file name component must not exceed 14 characters or start with `-'
+
However, the rules are really guidelines - a later one says
- Do not change established names if they only marginally violate the
above rules.
We may, therefore, need to be a bit slack in our check here, if we hit
- legitimate exceptions in real time-zone databases.
+ legitimate exceptions in real time-zone databases. In particular, ICU
+ includes some non-standard names with some components > 14 characters
+ long; so does Android, possibly deriving them from ICU.
In particular, aliases such as "Etc/GMT+7" and "SystemV/EST5EDT" are valid
so we need to accept digits, ':', and '+'; aliases typically have the form
@@ -615,8 +647,8 @@ bool QTimeZonePrivate::isValidId(const QByteArray &ianaId)
// Somewhat slack hand-rolled version:
const int MinSectionLength = 1;
-#ifdef Q_OS_ANDROID
- // Android has its own naming of zones.
+#if defined(Q_OS_ANDROID) || QT_CONFIG(icu)
+ // Android has its own naming of zones. It may well come from ICU.
// "Canada/East-Saskatchewan" has a 17-character second component.
const int MaxSectionLength = 17;
#else
@@ -632,12 +664,12 @@ bool QTimeZonePrivate::isValidId(const QByteArray &ianaId)
} else if (ch == '-') {
if (sectionLength == 0)
return false; // violates (4)
- } else if (!(ch >= 'a' && ch <= 'z')
- && !(ch >= 'A' && ch <= 'Z')
+ } else if (!isAsciiLower(ch)
+ && !isAsciiUpper(ch)
&& !(ch == '_')
&& !(ch == '.')
// Should ideally check these only happen as an offset:
- && !(ch >= '0' && ch <= '9')
+ && !isAsciiDigit(ch)
&& !(ch == '+')
&& !(ch == ':')) {
return false; // violates (2)
@@ -671,9 +703,11 @@ QString QTimeZonePrivate::isoOffsetFormat(int offsetFromUtc, QTimeZone::NameType
QByteArray QTimeZonePrivate::ianaIdToWindowsId(const QByteArray &id)
{
- for (const QZoneData &data : zoneDataTable) {
+ const auto idUtf8 = QUtf8StringView(id);
+
+ for (const ZoneData &data : zoneDataTable) {
for (auto l1 : data.ids()) {
- if (l1 == QByteArrayView(id))
+ if (l1 == idUtf8)
return toWindowsIdLiteral(data.windowsIdKey);
}
}
@@ -682,9 +716,13 @@ QByteArray QTimeZonePrivate::ianaIdToWindowsId(const QByteArray &id)
QByteArray QTimeZonePrivate::windowsIdToDefaultIanaId(const QByteArray &windowsId)
{
- for (const QWindowsData &data : windowsDataTable) {
- if (data.windowsId() == windowsId)
- return data.ianaId().toByteArray();
+ const auto data = std::lower_bound(std::begin(windowsDataTable), std::end(windowsDataTable),
+ windowsId, earlierWindowsId);
+ if (data != std::end(windowsDataTable) && data->windowsId() == windowsId) {
+ QByteArrayView id = data->ianaId();
+ if (qsizetype cut = id.indexOf(' '); cut >= 0)
+ id = id.first(cut);
+ return id.toByteArray();
}
return QByteArray();
}
@@ -693,7 +731,7 @@ QByteArray QTimeZonePrivate::windowsIdToDefaultIanaId(const QByteArray &windowsI
QLocale::Territory territory)
{
const QList<QByteArray> list = windowsIdToIanaIds(windowsId, territory);
- return list.count() > 0 ? list.first() : QByteArray();
+ return list.size() > 0 ? list.first() : QByteArray();
}
QList<QByteArray> QTimeZonePrivate::windowsIdToIanaIds(const QByteArray &windowsId)
@@ -701,11 +739,11 @@ QList<QByteArray> QTimeZonePrivate::windowsIdToIanaIds(const QByteArray &windows
const quint16 windowsIdKey = toWindowsIdKey(windowsId);
QList<QByteArray> list;
- for (const QZoneData &data : zoneDataTable) {
- if (data.windowsIdKey == windowsIdKey) {
- for (auto l1 : data.ids())
- list << QByteArray(l1.data(), l1.size());
- }
+ for (auto data = zoneStartForWindowsId(windowsIdKey);
+ data != std::end(zoneDataTable) && data->windowsIdKey == windowsIdKey;
+ ++data) {
+ for (auto l1 : data->ids())
+ list << QByteArray(l1.data(), l1.size());
}
// Return the full list in alpha order
@@ -716,19 +754,21 @@ QList<QByteArray> QTimeZonePrivate::windowsIdToIanaIds(const QByteArray &windows
QList<QByteArray> QTimeZonePrivate::windowsIdToIanaIds(const QByteArray &windowsId,
QLocale::Territory territory)
{
+ QList<QByteArray> list;
const quint16 windowsIdKey = toWindowsIdKey(windowsId);
const qint16 land = static_cast<quint16>(territory);
- for (const QZoneData &data : zoneDataTable) {
+ for (auto data = zoneStartForWindowsId(windowsIdKey);
+ data != std::end(zoneDataTable) && data->windowsIdKey == windowsIdKey;
+ ++data) {
// Return the region matches in preference order
- if (data.windowsIdKey == windowsIdKey && data.territory == land) {
- QList<QByteArray> list;
- for (auto l1 : data.ids())
+ if (data->territory == land) {
+ for (auto l1 : data->ids())
list << QByteArray(l1.data(), l1.size());
- return list;
+ break;
}
}
- return QList<QByteArray>();
+ return list;
}
// Define template for derived classes to reimplement so QSharedDataPointer clone() works correctly
@@ -737,9 +777,23 @@ template<> QTimeZonePrivate *QSharedDataPointer<QTimeZonePrivate>::clone()
return d->clone();
}
+static bool isEntryInIanaList(QByteArrayView id, QByteArrayView ianaIds)
+{
+ qsizetype cut;
+ while ((cut = ianaIds.indexOf(' ')) >= 0) {
+ if (id == ianaIds.first(cut))
+ return true;
+ ianaIds = ianaIds.sliced(cut + 1);
+ }
+ return id == ianaIds;
+}
+
/*
- UTC Offset implementation, used when QT_NO_SYSTEMLOCALE set and ICU is not being used,
- or for QDateTimes with a Qt:Spec of Qt::OffsetFromUtc.
+ UTC Offset backend.
+
+ Always present, based on UTC-offset zones.
+ Complements platform-specific backends.
+ Equivalent to Qt::OffsetFromUtc lightweight time representations.
*/
// Create default UTC time zone
@@ -753,8 +807,8 @@ QUtcTimeZonePrivate::QUtcTimeZonePrivate()
QUtcTimeZonePrivate::QUtcTimeZonePrivate(const QByteArray &id)
{
// Look for the name in the UTC list, if found set the values
- for (const QUtcData &data : utcDataTable) {
- if (data.id() == id) {
+ for (const UtcData &data : utcDataTable) {
+ if (isEntryInIanaList(id, data.id())) {
QString name = QString::fromUtf8(id);
init(id, data.offsetFromUtc, name, name, QLocale::AnyTerritory, name);
break;
@@ -762,7 +816,7 @@ QUtcTimeZonePrivate::QUtcTimeZonePrivate(const QByteArray &id)
}
}
-qint64 QUtcTimeZonePrivate::offsetFromUtcString(const QByteArray &id)
+qint64 QUtcTimeZonePrivate::offsetFromUtcString(QByteArrayView id)
{
// Convert reasonable UTC[+-]\d+(:\d+){,2} to offset in seconds.
// Assumption: id has already been tried as a CLDR UTC offset ID (notably
@@ -774,32 +828,47 @@ qint64 QUtcTimeZonePrivate::offsetFromUtcString(const QByteArray &id)
return invalidSeconds(); // No sign
const int sign = signChar == '-' ? -1 : 1;
- const auto offsets = id.mid(4).split(':');
- if (offsets.isEmpty() || offsets.size() > 3)
- return invalidSeconds(); // No numbers, or too many.
-
qint32 seconds = 0;
int prior = 0; // Number of fields parsed thus far
- for (const auto &offset : offsets) {
+ for (auto offset : QLatin1StringView(id.mid(4)).tokenize(':'_L1)) {
bool ok = false;
unsigned short field = offset.toUShort(&ok);
// Bound hour above at 24, minutes and seconds at 60:
if (!ok || field >= (prior ? 60 : 24))
return invalidSeconds();
seconds = seconds * 60 + field;
- ++prior;
+ if (++prior > 3)
+ return invalidSeconds(); // Too many numbers
}
+
+ if (!prior)
+ return invalidSeconds(); // No numbers
+
while (prior++ < 3)
seconds *= 60;
return seconds * sign;
}
-// Create offset from UTC
+// Create from UTC offset:
QUtcTimeZonePrivate::QUtcTimeZonePrivate(qint32 offsetSeconds)
{
- QString utcId = isoOffsetFormat(offsetSeconds, QTimeZone::ShortName);
- init(utcId.toUtf8(), offsetSeconds, utcId, utcId, QLocale::AnyTerritory, utcId);
+ QString name;
+ QByteArray id;
+ // If there's an IANA ID for this offset, use it:
+ const auto data = std::lower_bound(std::begin(utcDataTable), std::end(utcDataTable),
+ offsetSeconds, atLowerUtcOffset);
+ if (data != std::end(utcDataTable) && data->offsetFromUtc == offsetSeconds) {
+ QByteArrayView ianaId = data->id();
+ qsizetype cut = ianaId.indexOf(' ');
+ id = (cut < 0 ? ianaId : ianaId.first(cut)).toByteArray();
+ name = QString::fromUtf8(id);
+ Q_ASSERT(!name.isEmpty());
+ } else { // Fall back to a UTC-offset name:
+ name = isoOffsetFormat(offsetSeconds, QTimeZone::ShortName);
+ id = name.toUtf8();
+ }
+ init(id, offsetSeconds, name, name, QLocale::AnyTerritory, name);
}
QUtcTimeZonePrivate::QUtcTimeZonePrivate(const QByteArray &zoneId, int offsetSeconds,
@@ -903,11 +972,13 @@ QByteArray QUtcTimeZonePrivate::systemTimeZoneId() const
bool QUtcTimeZonePrivate::isTimeZoneIdAvailable(const QByteArray &ianaId) const
{
// Only the zone IDs supplied by CLDR and recognized by constructor.
- for (const QUtcData &data : utcDataTable) {
- if (data.id() == ianaId)
+ for (const UtcData &data : utcDataTable) {
+ if (isEntryInIanaList(ianaId, data.id()))
return true;
}
- // But see offsetFromUtcString(), which lets us accept some "unavailable" IDs.
+ // Callers may want to || offsetFromUtcString(ianaId) != invalidSeconds(),
+ // but those are technically not IANA IDs and the custom QTimeZone
+ // constructor needs the return here to reflect that.
return false;
}
@@ -916,8 +987,15 @@ QList<QByteArray> QUtcTimeZonePrivate::availableTimeZoneIds() const
// Only the zone IDs supplied by CLDR and recognized by constructor.
QList<QByteArray> result;
result.reserve(std::size(utcDataTable));
- for (const QUtcData &data : utcDataTable)
- result << data.id().toByteArray();
+ for (const UtcData &data : utcDataTable) {
+ QByteArrayView id = data.id();
+ qsizetype cut;
+ while ((cut = id.indexOf(' ')) >= 0) {
+ result << id.first(cut).toByteArray();
+ id = id.sliced(cut + 1);
+ }
+ result << id.toByteArray();
+ }
// Not guaranteed to be sorted, so sort:
std::sort(result.begin(), result.end());
// ### assuming no duplicates
@@ -937,10 +1015,23 @@ QList<QByteArray> QUtcTimeZonePrivate::availableTimeZoneIds(qint32 offsetSeconds
// Only if it's present in CLDR. (May get more than one ID: UTC, UTC+00:00
// and UTC-00:00 all have the same offset.)
QList<QByteArray> result;
- for (const QUtcData &data : utcDataTable) {
- if (data.offsetFromUtc == offsetSeconds)
- result << data.id().toByteArray();
+ const auto data = std::lower_bound(std::begin(utcDataTable), std::end(utcDataTable),
+ offsetSeconds, atLowerUtcOffset);
+ if (data != std::end(utcDataTable) && data->offsetFromUtc == offsetSeconds) {
+ QByteArrayView id = data->id();
+ qsizetype cut;
+ while ((cut = id.indexOf(' ')) >= 0) {
+ result << id.first(cut).toByteArray();
+ id = id.sliced(cut + 1);
+ }
+ result << id.toByteArray();
}
+ // CLDR only has round multiples of a quarter hour, and only some of
+ // those. For anything else, throw in the ID we would use for this offset
+ // (if we'd accept that ID).
+ QByteArray isoName = isoOffsetFormat(offsetSeconds, QTimeZone::ShortName).toUtf8();
+ if (offsetFromUtcString(isoName) == qint64(offsetSeconds) && !result.contains(isoName))
+ result << isoName;
// Not guaranteed to be sorted, so sort:
std::sort(result.begin(), result.end());
// ### assuming no duplicates
diff --git a/src/corelib/time/qtimezoneprivate_android.cpp b/src/corelib/time/qtimezoneprivate_android.cpp
index 4d98597dc7..47fc68b1ac 100644
--- a/src/corelib/time/qtimezoneprivate_android.cpp
+++ b/src/corelib/time/qtimezoneprivate_android.cpp
@@ -1,51 +1,21 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Copyright (C) 2014 Drew Parsons <dparsons@emerall.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// Copyright (C) 2014 Drew Parsons <dparsons@emerall.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qtimezone.h"
#include "qtimezoneprivate_p.h"
#include <QtCore/QJniEnvironment>
#include <QtCore/QSet>
+#include <QtCore/qjnitypes.h>
QT_BEGIN_NAMESPACE
+Q_DECLARE_JNI_CLASS(TimeZone, "java/util/TimeZone");
+Q_DECLARE_JNI_CLASS(Locale, "java/util/Locale");
+Q_DECLARE_JNI_CLASS(Date, "java/util/Date");
+Q_DECLARE_JNI_TYPE(StringArray, "[Ljava/lang/String;")
+
/*
Private
@@ -61,9 +31,9 @@ QAndroidTimeZonePrivate::QAndroidTimeZonePrivate()
: QTimeZonePrivate()
{
// Keep in sync with systemTimeZoneId():
- androidTimeZone = QJniObject::callStaticObjectMethod(
- "java.util.TimeZone", "getDefault", "()Ljava/util/TimeZone;");
- const QJniObject id = androidTimeZone.callObjectMethod("getID", "()Ljava/lang/String;");
+ androidTimeZone = QJniObject::callStaticMethod<QtJniTypes::TimeZone>(
+ QtJniTypes::Traits<QtJniTypes::TimeZone>::className(), "getDefault");
+ const QJniObject id = androidTimeZone.callMethod<jstring>("getID");
m_id = id.toString().toUtf8();
}
@@ -85,36 +55,27 @@ QAndroidTimeZonePrivate::~QAndroidTimeZonePrivate()
{
}
-static QJniObject getDisplayName(QJniObject zone, jint style, jboolean dst,
+static QString getDisplayName(QJniObject zone, jint style, jboolean dst,
const QLocale &locale)
{
- QJniObject jlanguage
- = QJniObject::fromString(QLocale::languageToString(locale.language()));
- QJniObject jterritory
- = QJniObject::fromString(QLocale::territoryToString(locale.territory()));
- QJniObject
- jvariant = QJniObject::fromString(QLocale::scriptToString(locale.script()));
- QJniObject jlocale("java.util.Locale",
- "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V",
- jlanguage.object<jstring>(),
- jterritory.object<jstring>(),
- jvariant.object<jstring>());
-
- return zone.callObjectMethod("getDisplayName",
- "(ZILjava/util/Locale;)Ljava/lang/String;",
- dst, style, jlocale.object());
+ QJniObject jbcpTag = QJniObject::fromString(locale.bcp47Name());
+ QJniObject jlocale = QJniObject::callStaticMethod<QtJniTypes::Locale>(
+ QtJniTypes::Traits<QtJniTypes::Locale>::className(), "forLanguageTag",
+ jbcpTag.object<jstring>());
+
+ return zone.callMethod<jstring>("getDisplayName", dst, style,
+ jlocale.object<QtJniTypes::Locale>()).toString();
}
void QAndroidTimeZonePrivate::init(const QByteArray &ianaId)
{
const QString iana = QString::fromUtf8(ianaId);
- androidTimeZone = QJniObject::callStaticObjectMethod(
- "java.util.TimeZone", "getTimeZone", "(Ljava/lang/String;)Ljava/util/TimeZone;",
+ androidTimeZone = QJniObject::callStaticMethod<QtJniTypes::TimeZone>(
+ QtJniTypes::Traits<QtJniTypes::TimeZone>::className(), "getTimeZone",
QJniObject::fromString(iana).object<jstring>());
// The ID or display name of the zone we've got, if it looks like what we asked for:
- const auto match = [iana](const QJniObject &jname) -> QByteArray {
- const QString name = jname.toString();
+ const auto match = [iana](const QString &name) -> QByteArray {
if (iana.compare(name, Qt::CaseInsensitive) == 0)
return name.toUtf8();
@@ -125,7 +86,7 @@ void QAndroidTimeZonePrivate::init(const QByteArray &ianaId)
// recognize the name; so check for whether ianaId is a recognized name of
// the zone object we got and ignore the zone if not.
// Try checking ianaId against getID(), getDisplayName():
- m_id = match(androidTimeZone.callObjectMethod("getID", "()Ljava/lang/String;"));
+ m_id = match(androidTimeZone.callMethod<jstring>("getID").toString());
for (int style = 1; m_id.isEmpty() && style >= 0; --style) {
for (int dst = 1; m_id.isEmpty() && dst >= 0; --dst) {
for (int pick = 2; m_id.isEmpty() && pick >= 0; --pick) {
@@ -154,7 +115,7 @@ QString QAndroidTimeZonePrivate::displayName(QTimeZone::TimeType timeType, QTime
// treat all NameTypes as java TimeZone style LONG (value 1), except of course QTimeZone::ShortName which is style SHORT (value 0);
jint style = (nameType == QTimeZone::ShortName ? 0 : 1);
- name = getDisplayName(androidTimeZone, style, daylightTime, locale).toString();
+ name = getDisplayName(androidTimeZone, style, daylightTime, locale);
}
return name;
@@ -172,11 +133,13 @@ int QAndroidTimeZonePrivate::offsetFromUtc(qint64 atMSecsSinceEpoch) const
{
// offsetFromUtc( ) is invoked when androidTimeZone may not yet be set at startup,
// so a validity test is needed here
- if ( androidTimeZone.isValid() )
+ if ( androidTimeZone.isValid() ) {
// the java method getOffset() returns milliseconds, but QTimeZone returns seconds
- return androidTimeZone.callMethod<jint>( "getOffset", "(J)I", static_cast<jlong>(atMSecsSinceEpoch) ) / 1000;
- else
+ return androidTimeZone.callMethod<jint>(
+ "getOffset", static_cast<jlong>(atMSecsSinceEpoch) ) / 1000;
+ } else {
return 0;
+ }
}
int QAndroidTimeZonePrivate::standardTimeOffset(qint64 atMSecsSinceEpoch) const
@@ -207,8 +170,10 @@ bool QAndroidTimeZonePrivate::hasDaylightTime() const
bool QAndroidTimeZonePrivate::isDaylightTime(qint64 atMSecsSinceEpoch) const
{
if ( androidTimeZone.isValid() ) {
- QJniObject jDate( "java/util/Date", "(J)V", static_cast<jlong>(atMSecsSinceEpoch) );
- return androidTimeZone.callMethod<jboolean>("inDaylightTime", "(Ljava/util/Date;)Z", jDate.object() );
+ QJniObject jDate = QJniObject::construct<QtJniTypes::Date>(
+ static_cast<jlong>(atMSecsSinceEpoch));
+ return androidTimeZone.callMethod<jboolean>("inDaylightTime",
+ jDate.object<QtJniTypes::Date>());
}
else
return false;
@@ -217,16 +182,11 @@ bool QAndroidTimeZonePrivate::isDaylightTime(qint64 atMSecsSinceEpoch) const
QTimeZonePrivate::Data QAndroidTimeZonePrivate::data(qint64 forMSecsSinceEpoch) const
{
if (androidTimeZone.isValid()) {
- Data data;
- data.atMSecsSinceEpoch = forMSecsSinceEpoch;
- data.standardTimeOffset = standardTimeOffset(forMSecsSinceEpoch);
- data.offsetFromUtc = offsetFromUtc(forMSecsSinceEpoch);
- data.daylightTimeOffset = data.offsetFromUtc - data.standardTimeOffset;
- data.abbreviation = abbreviation(forMSecsSinceEpoch);
- return data;
- } else {
- return invalidData();
+ return Data(abbreviation(forMSecsSinceEpoch), forMSecsSinceEpoch,
+ offsetFromUtc(forMSecsSinceEpoch),
+ standardTimeOffset(forMSecsSinceEpoch));
}
+ return {};
}
// java.util.TimeZone does not directly provide transitions,
@@ -235,16 +195,23 @@ QTimeZonePrivate::Data QAndroidTimeZonePrivate::data(qint64 forMSecsSinceEpoch)
QByteArray QAndroidTimeZonePrivate::systemTimeZoneId() const
{
// Keep in sync with default constructor:
- QJniObject androidSystemTimeZone = QJniObject::callStaticObjectMethod(
- "java.util.TimeZone", "getDefault", "()Ljava/util/TimeZone;");
- const QJniObject id = androidSystemTimeZone.callObjectMethod<jstring>("getID");
+ QJniObject androidSystemTimeZone = QJniObject::callStaticMethod<QtJniTypes::TimeZone>(
+ QtJniTypes::Traits<QtJniTypes::TimeZone>::className(), "getDefault");
+ const QJniObject id = androidSystemTimeZone.callMethod<jstring>("getID");
return id.toString().toUtf8();
}
+bool QAndroidTimeZonePrivate::isTimeZoneIdAvailable(const QByteArray &ianaId) const
+{
+ QAndroidTimeZonePrivate probe(ianaId);
+ return probe.isValid();
+}
+
QList<QByteArray> QAndroidTimeZonePrivate::availableTimeZoneIds() const
{
QList<QByteArray> availableTimeZoneIdList;
- QJniObject androidAvailableIdList = QJniObject::callStaticObjectMethod("java.util.TimeZone", "getAvailableIDs", "()[Ljava/lang/String;");
+ QJniObject androidAvailableIdList = QJniObject::callStaticMethod<QtJniTypes::StringArray>(
+ QtJniTypes::Traits<QtJniTypes::TimeZone>::className(), "getAvailableIDs");
QJniEnvironment jniEnv;
int androidTZcount = jniEnv->GetArrayLength(androidAvailableIdList.object<jarray>());
diff --git a/src/corelib/time/qtimezoneprivate_data_p.h b/src/corelib/time/qtimezoneprivate_data_p.h
index ebc04e1217..5174f06a0d 100644
--- a/src/corelib/time/qtimezoneprivate_data_p.h
+++ b/src/corelib/time/qtimezoneprivate_data_p.h
@@ -1,43 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Copyright (C) 2013 John Layt <jlayt@kde.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
+// Copyright (C) 2021 The Qt Company Ltd.
+// Copyright (C) 2013 John Layt <jlayt@kde.org>
+// SPDX-License-Identifier: Unicode-3.0
#ifndef QTIMEZONEPRIVATE_DATA_P_H
#define QTIMEZONEPRIVATE_DATA_P_H
@@ -57,76 +20,65 @@
#include "qbytearrayview.h"
#include "qstring.h"
+QT_REQUIRE_CONFIG(timezone);
QT_BEGIN_NAMESPACE
+namespace QtTimeZoneCldr {
/*
- Windows Zone ID support, included in default base class build so can be used on all platforms,
- e.g. an app running on Linux may need to communicate with a Windows Outlook server. These
- tables can also be used to look-up Region Codes and UTC Offsets on platforms that don't directly
- support them., e.g. Mac does not support availableTimeZones() filtering by region or offset.
+ Recognized UTC-offset zones and CLDR-derived data on Windows IDs.
+
+ The UTC-offset zone table is provided for generic UTC±HH:mm format time
+ zones. The UTC backend can support arbitrary offsets in seconds, but only
+ advertises a limited repertoire of offsets as "available" in the normal
+ sense.
- Another data table is provided for generic UTC+00:00 format time zones to be used as a
- fall-back if no system time zones are available (QT_NO_SYSTEMLOCALE is set) or for QDateTimes
- with a QT:Spec of OffsetFromUTC
+ Windows Zone ID support is included in the default base class, QTZP, so can
+ be used on all platforms, since an app running on Linux may need to
+ communicate with a Windows Outlook server. These tables can also be used to
+ look up Region Codes and UTC Offsets on platforms whose backends don't
+ directly support them. For example, Darwin does not support
+ availableTimeZones() filtering by region or offset. This table is
+ auto-generated from the CLDR supplemental/windowsZones.xml data file.
- These tables are automatically adapted from the CLDR supplemental/windowsZones.xml data file
- using a script in qtbase/util/locale_database. Please do not edit this data directly. In the
- future if ICU is made a hard dependency then the ICU resource can be used directly and this
- table removed
+ Please do not edit this data directly. See the generated section for details
+ of its last update and how to update it.
*/
-struct QZoneData
+struct ZoneData
{
- quint16 windowsIdKey; // Windows ID Key
- quint16 territory; // Territory of IANA ID's, AnyTerritory means No Territory
- quint16 ianaIdIndex; // All IANA ID's for the Windows ID and Country, space separated
- inline QLatin1String id() const;
- inline auto ids() const { return id().tokenize(QLatin1String(" ")); }
+ // Keys (table is sorted in Windows ID, then on territory enum value):
+ quint16 windowsIdKey; // Windows ID sequence number
+ quint16 territory; // QLocale::Territory, AnyTerritory means No Territory
+ // Values for this Windows zone and territory:
+ quint16 ianaIdIndex; // Index in ianaIdData of space-joined IANA IDs
+ constexpr QLatin1StringView id() const; // Space-joined list of IANA IDs
+ constexpr auto ids() const { return id().tokenize(u' '); } // Iterate IANA IDs
};
-struct QWindowsData
+struct WindowsData
{
- quint16 windowsIdKey; // Windows ID Key
- quint16 windowsIdIndex; // Windows ID Literal
- quint16 ianaIdIndex; // Default IANA ID for the Windows ID
+ // Table is sorted on key and this puts the windowsId()s in ascending order.
+ quint16 windowsIdKey; // Windows ID sequence number
+ quint16 windowsIdIndex; // Index of Windows ID in windowsIdData
+ // Values for this Windows zone:
+ quint16 ianaIdIndex; // Index in ianaIdData of space-joined IANA IDs
qint32 offsetFromUtc; // Standard Time Offset from UTC, used for quick look-ups
- inline QByteArrayView windowsId() const;
- inline QByteArrayView ianaId() const;
+ constexpr QByteArrayView windowsId() const;
+ constexpr QByteArrayView ianaId() const; // Space-joined list of IANA IDs
};
-struct QUtcData
+struct UtcData
{
- quint16 ianaIdIndex; // IANA ID
- qint32 offsetFromUtc; // Offset form UTC is seconds
- inline QByteArrayView id() const;
+ quint16 ianaIdIndex; // Index in ianaIdData of space-joined IANA IDs
+ qint32 offsetFromUtc; // Offset form UTC in seconds
+ constexpr QByteArrayView id() const; // Space-joined list of IANA IDs
};
-/*
- 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.
-*/
-
// GENERATED PART STARTS HERE
/*
- This part of the file was generated on 2021-11-05 from the
- Common Locale Data Repository v40 file supplemental/windowsZones.xml
+ This part of the file was generated on 2024-01-29 from the
+ Common Locale Data Repository v43 file supplemental/windowsZones.xml
http://www.unicode.org/cldr/
@@ -135,7 +87,7 @@ struct QUtcData
*/
// Windows ID Key, Territory Enum, IANA ID Index
-static const QZoneData zoneDataTable[] = {
+static constexpr ZoneData zoneDataTable[] = {
{ 1, 1, 0 }, // Afghanistan Standard Time / Afghanistan
{ 2, 248, 11 }, // Alaskan Standard Time / United States
{ 3, 248, 106 }, // Aleutian Standard Time / United States
@@ -192,7 +144,7 @@ static const QZoneData zoneDataTable[] = {
{ 27, 207, 1278 }, // Central Europe Standard Time / Serbia
{ 27, 212, 1294 }, // Central Europe Standard Time / Slovakia
{ 27, 213, 1312 }, // Central Europe Standard Time / Slovenia
- { 28, 29, 1329 }, // Central European Standard Time / Bosnia And Herzegovina
+ { 28, 29, 1329 }, // Central European Standard Time / Bosnia and Herzegovina
{ 28, 60, 1345 }, // Central European Standard Time / Croatia
{ 28, 140, 1359 }, // Central European Standard Time / Macedonia
{ 28, 187, 1373 }, // Central European Standard Time / Poland
@@ -202,455 +154,454 @@ static const QZoneData zoneDataTable[] = {
{ 29, 166, 1445 }, // Central Pacific Standard Time / New Caledonia
{ 29, 214, 1460 }, // Central Pacific Standard Time / Solomon Islands
{ 29, 252, 1480 }, // Central Pacific Standard Time / Vanuatu
- { 30, 152, 1494 }, // Central Standard Time (Mexico) / Mexico
- { 31, 0, 1570 }, // Central Standard Time / AnyTerritory
- { 31, 41, 1578 }, // Central Standard Time / Canada
- { 31, 152, 1653 }, // Central Standard Time / Mexico
- { 31, 248, 1671 }, // Central Standard Time / United States
- { 32, 50, 1839 }, // China Standard Time / China
- { 32, 107, 1853 }, // China Standard Time / Hong Kong
- { 32, 139, 1868 }, // China Standard Time / Macao
- { 33, 167, 1879 }, // Chatham Islands Standard Time / New Zealand
- { 34, 61, 1895 }, // Cuba Standard Time / Cuba
- { 35, 0, 1910 }, // Dateline Standard Time / AnyTerritory
- { 36, 0, 1921 }, // E. Africa Standard Time / AnyTerritory
- { 36, 9, 1931 }, // E. Africa Standard Time / Antarctica
- { 36, 55, 1948 }, // E. Africa Standard Time / Comoros
- { 36, 67, 1962 }, // E. Africa Standard Time / Djibouti
- { 36, 74, 1978 }, // E. Africa Standard Time / Eritrea
- { 36, 77, 1992 }, // E. Africa Standard Time / Ethiopia
- { 36, 124, 2011 }, // E. Africa Standard Time / Kenya
- { 36, 141, 2026 }, // E. Africa Standard Time / Madagascar
- { 36, 151, 2046 }, // E. Africa Standard Time / Mayotte
- { 36, 215, 2061 }, // E. Africa Standard Time / Somalia
- { 36, 230, 2078 }, // E. Africa Standard Time / Tanzania
- { 36, 243, 2099 }, // E. Africa Standard Time / Uganda
- { 37, 15, 2114 }, // E. Australia Standard Time / Australia
- { 38, 154, 2152 }, // E. Europe Standard Time / Moldova
- { 39, 32, 2168 }, // E. South America Standard Time / Brazil
- { 40, 49, 2186 }, // Easter Island Standard Time / Chile
- { 41, 0, 2201 }, // Eastern Standard Time / AnyTerritory
- { 41, 18, 2209 }, // Eastern Standard Time / Bahamas
- { 41, 41, 2224 }, // Eastern Standard Time / Canada
- { 41, 248, 2329 }, // Eastern Standard Time / United States
- { 42, 152, 2486 }, // Eastern Standard Time (Mexico) / Mexico
- { 43, 71, 2501 }, // Egypt Standard Time / Egypt
- { 44, 193, 2514 }, // Ekaterinburg Standard Time / Russia
- { 45, 82, 2533 }, // Fiji Standard Time / Fiji
- { 46, 2, 2546 }, // FLE Standard Time / Aland Islands
- { 46, 36, 2563 }, // FLE Standard Time / Bulgaria
- { 46, 75, 2576 }, // FLE Standard Time / Estonia
- { 46, 83, 2591 }, // FLE Standard Time / Finland
- { 46, 131, 2607 }, // FLE Standard Time / Latvia
- { 46, 137, 2619 }, // FLE Standard Time / Lithuania
- { 46, 244, 2634 }, // FLE Standard Time / Ukraine
- { 47, 90, 2680 }, // Georgian Standard Time / Georgia
- { 48, 81, 2693 }, // GMT Standard Time / Faroe Islands
- { 48, 100, 2709 }, // GMT Standard Time / Guernsey
- { 48, 114, 2725 }, // GMT Standard Time / Ireland
- { 48, 115, 2739 }, // GMT Standard Time / Isle Of Man
- { 48, 121, 2758 }, // GMT Standard Time / Jersey
- { 48, 188, 2772 }, // GMT Standard Time / Portugal
- { 48, 220, 2803 }, // GMT Standard Time / Spain
- { 48, 246, 2819 }, // GMT Standard Time / United Kingdom
- { 49, 95, 2833 }, // Greenland Standard Time / Greenland
- { 50, 37, 2849 }, // Greenwich Standard Time / Burkina Faso
- { 50, 89, 2868 }, // Greenwich Standard Time / Gambia
- { 50, 92, 2882 }, // Greenwich Standard Time / Ghana
- { 50, 95, 2895 }, // Greenwich Standard Time / Greenland
- { 50, 101, 2916 }, // Greenwich Standard Time / Guinea Bissau
- { 50, 102, 2930 }, // Greenwich Standard Time / Guinea
- { 50, 109, 2945 }, // Greenwich Standard Time / Iceland
- { 50, 118, 2964 }, // Greenwich Standard Time / Ivory Coast
- { 50, 134, 2979 }, // Greenwich Standard Time / Liberia
- { 50, 145, 2995 }, // Greenwich Standard Time / Mali
- { 50, 149, 3009 }, // Greenwich Standard Time / Mauritania
- { 50, 196, 3027 }, // Greenwich Standard Time / Saint Helena
- { 50, 206, 3046 }, // Greenwich Standard Time / Senegal
- { 50, 209, 3059 }, // Greenwich Standard Time / Sierra Leone
- { 50, 233, 3075 }, // Greenwich Standard Time / Togo
- { 51, 63, 3087 }, // GTB Standard Time / Cyprus
- { 51, 94, 3115 }, // GTB Standard Time / Greece
- { 51, 192, 3129 }, // GTB Standard Time / Romania
- { 52, 104, 3146 }, // Haiti Standard Time / Haiti
- { 53, 0, 3169 }, // Hawaiian Standard Time / AnyTerritory
- { 53, 58, 3180 }, // Hawaiian Standard Time / Cook Islands
- { 53, 86, 3198 }, // Hawaiian Standard Time / French Polynesia
- { 53, 247, 3213 }, // Hawaiian Standard Time / United States Outlying Islands
- { 53, 248, 3230 }, // Hawaiian Standard Time / United States
- { 54, 110, 3247 }, // India Standard Time / India
- { 55, 112, 3261 }, // Iran Standard Time / Iran
- { 56, 116, 3273 }, // Israel Standard Time / Israel
- { 57, 122, 3288 }, // Jordan Standard Time / Jordan
- { 58, 193, 3299 }, // Kaliningrad Standard Time / Russia
- { 59, 218, 3318 }, // Korea Standard Time / South Korea
- { 60, 135, 3329 }, // Libya Standard Time / Libya
- { 61, 0, 3344 }, // Line Islands Standard Time / AnyTerritory
- { 61, 125, 3355 }, // Line Islands Standard Time / Kiribati
- { 62, 15, 3374 }, // Lord Howe Standard Time / Australia
- { 63, 193, 3394 }, // Magadan Standard Time / Russia
- { 64, 49, 3407 }, // Magallanes Standard Time / Chile
- { 65, 86, 3428 }, // Marquesas Standard Time / French Polynesia
- { 66, 150, 3446 }, // Mauritius Standard Time / Mauritius
- { 66, 191, 3463 }, // Mauritius Standard Time / Reunion
- { 66, 208, 3478 }, // Mauritius Standard Time / Seychelles
- { 67, 132, 3490 }, // Middle East Standard Time / Lebanon
- { 68, 250, 3502 }, // Montevideo Standard Time / Uruguay
- { 69, 159, 3521 }, // Morocco Standard Time / Morocco
- { 69, 257, 3539 }, // Morocco Standard Time / Western Sahara
- { 70, 152, 3555 }, // Mountain Standard Time (Mexico) / Mexico
- { 71, 0, 3590 }, // Mountain Standard Time / AnyTerritory
- { 71, 41, 3598 }, // Mountain Standard Time / Canada
- { 71, 152, 3672 }, // Mountain Standard Time / Mexico
- { 71, 248, 3688 }, // Mountain Standard Time / United States
- { 72, 53, 3717 }, // Myanmar Standard Time / Cocos Islands
- { 72, 161, 3730 }, // Myanmar Standard Time / Myanmar
- { 73, 193, 3743 }, // N. Central Asia Standard Time / Russia
- { 74, 162, 3760 }, // Namibia Standard Time / Namibia
- { 75, 164, 3776 }, // Nepal Standard Time / Nepal
- { 76, 9, 3790 }, // New Zealand Standard Time / Antarctica
- { 76, 167, 3809 }, // New Zealand Standard Time / New Zealand
- { 77, 41, 3826 }, // Newfoundland Standard Time / Canada
- { 78, 172, 3843 }, // Norfolk Standard Time / Norfolk Island
- { 79, 193, 3859 }, // North Asia East Standard Time / Russia
- { 80, 193, 3872 }, // North Asia Standard Time / Russia
- { 81, 174, 3907 }, // North Korea Standard Time / North Korea
- { 82, 193, 3922 }, // Omsk Standard Time / Russia
- { 83, 49, 3932 }, // Pacific SA Standard Time / Chile
- { 84, 0, 3949 }, // Pacific Standard Time / AnyTerritory
- { 84, 41, 3957 }, // Pacific Standard Time / Canada
- { 84, 248, 3975 }, // Pacific Standard Time / United States
- { 85, 152, 3995 }, // Pacific Standard Time (Mexico) / Mexico
- { 86, 178, 4032 }, // Pakistan Standard Time / Pakistan
- { 87, 183, 4045 }, // Paraguay Standard Time / Paraguay
- { 88, 123, 4062 }, // Qyzylorda Standard Time / Kazakhstan
- { 89, 23, 4077 }, // Romance Standard Time / Belgium
- { 89, 65, 4093 }, // Romance Standard Time / Denmark
- { 89, 84, 4111 }, // Romance Standard Time / France
- { 89, 220, 4124 }, // Romance Standard Time / Spain
- { 90, 193, 4151 }, // Russia Time Zone 3 / Russia
- { 91, 193, 4165 }, // Russia Time Zone 10 / Russia
- { 92, 193, 4184 }, // Russia Time Zone 11 / Russia
- { 93, 193, 4211 }, // Russian Standard Time / Russia
- { 93, 244, 4238 }, // Russian Standard Time / Ukraine
- { 94, 0, 4256 }, // SA Eastern Standard Time / AnyTerritory
- { 94, 9, 4266 }, // SA Eastern Standard Time / Antarctica
- { 94, 32, 4303 }, // SA Eastern Standard Time / Brazil
- { 94, 80, 4382 }, // SA Eastern Standard Time / Falkland Islands
- { 94, 85, 4399 }, // SA Eastern Standard Time / French Guiana
- { 94, 223, 4415 }, // SA Eastern Standard Time / Suriname
- { 95, 0, 4434 }, // SA Pacific Standard Time / AnyTerritory
- { 95, 32, 4444 }, // SA Pacific Standard Time / Brazil
- { 95, 41, 4480 }, // SA Pacific Standard Time / Canada
- { 95, 45, 4502 }, // SA Pacific Standard Time / Cayman Islands
- { 95, 54, 4517 }, // SA Pacific Standard Time / Colombia
- { 95, 70, 4532 }, // SA Pacific Standard Time / Ecuador
- { 95, 119, 4550 }, // SA Pacific Standard Time / Jamaica
- { 95, 181, 4566 }, // SA Pacific Standard Time / Panama
- { 95, 184, 4581 }, // SA Pacific Standard Time / Peru
- { 96, 0, 4594 }, // SA Western Standard Time / AnyTerritory
- { 96, 8, 4604 }, // SA Western Standard Time / Anguilla
- { 96, 10, 4621 }, // SA Western Standard Time / Antigua And Barbuda
- { 96, 13, 4637 }, // SA Western Standard Time / Aruba
- { 96, 21, 4651 }, // SA Western Standard Time / Barbados
- { 96, 28, 4668 }, // SA Western Standard Time / Bolivia
- { 96, 32, 4683 }, // SA Western Standard Time / Brazil
- { 96, 34, 4736 }, // SA Western Standard Time / British Virgin Islands
- { 96, 41, 4752 }, // SA Western Standard Time / Canada
- { 96, 44, 4773 }, // SA Western Standard Time / Caribbean Netherlands
- { 96, 62, 4792 }, // SA Western Standard Time / Curacao
- { 96, 68, 4808 }, // SA Western Standard Time / Dominica
- { 96, 69, 4825 }, // SA Western Standard Time / Dominican Republic
- { 96, 96, 4847 }, // SA Western Standard Time / Grenada
- { 96, 97, 4863 }, // SA Western Standard Time / Guadeloupe
- { 96, 103, 4882 }, // SA Western Standard Time / Guyana
- { 96, 148, 4897 }, // SA Western Standard Time / Martinique
- { 96, 158, 4916 }, // SA Western Standard Time / Montserrat
- { 96, 189, 4935 }, // SA Western Standard Time / Puerto Rico
- { 96, 195, 4955 }, // SA Western Standard Time / Saint Barthelemy
- { 96, 197, 4977 }, // SA Western Standard Time / Saint Kitts And Nevis
- { 96, 198, 4994 }, // SA Western Standard Time / Saint Lucia
- { 96, 199, 5011 }, // SA Western Standard Time / Saint Martin
- { 96, 201, 5027 }, // SA Western Standard Time / Saint Vincent And Grenadines
- { 96, 211, 5046 }, // SA Western Standard Time / Sint Maarten
- { 96, 236, 5068 }, // SA Western Standard Time / Trinidad And Tobago
- { 96, 249, 5090 }, // SA Western Standard Time / United States Virgin Islands
- { 97, 200, 5108 }, // Saint Pierre Standard Time / Saint Pierre And Miquelon
- { 98, 193, 5125 }, // Sakhalin Standard Time / Russia
- { 99, 202, 5139 }, // Samoa Standard Time / Samoa
- { 100, 204, 5152 }, // Sao Tome Standard Time / Sao Tome And Principe
- { 101, 193, 5168 }, // Saratov Standard Time / Russia
- { 102, 0, 5183 }, // SE Asia Standard Time / AnyTerritory
- { 102, 9, 5193 }, // SE Asia Standard Time / Antarctica
- { 102, 39, 5210 }, // SE Asia Standard Time / Cambodia
- { 102, 51, 5226 }, // SE Asia Standard Time / Christmas Island
- { 102, 111, 5243 }, // SE Asia Standard Time / Indonesia
- { 102, 129, 5271 }, // SE Asia Standard Time / Laos
- { 102, 231, 5286 }, // SE Asia Standard Time / Thailand
- { 102, 255, 5299 }, // SE Asia Standard Time / Vietnam
- { 103, 0, 5311 }, // Singapore Standard Time / AnyTerritory
- { 103, 35, 5321 }, // Singapore Standard Time / Brunei
- { 103, 111, 5333 }, // Singapore Standard Time / Indonesia
- { 103, 143, 5347 }, // Singapore Standard Time / Malaysia
- { 103, 185, 5378 }, // Singapore Standard Time / Philippines
- { 103, 210, 5390 }, // Singapore Standard Time / Singapore
- { 104, 0, 5405 }, // South Africa Standard Time / AnyTerritory
- { 104, 30, 5415 }, // South Africa Standard Time / Botswana
- { 104, 38, 5431 }, // South Africa Standard Time / Burundi
- { 104, 57, 5448 }, // South Africa Standard Time / Congo Kinshasa
- { 104, 76, 5466 }, // South Africa Standard Time / Eswatini
- { 104, 133, 5481 }, // South Africa Standard Time / Lesotho
- { 104, 142, 5495 }, // South Africa Standard Time / Malawi
- { 104, 160, 5511 }, // South Africa Standard Time / Mozambique
- { 104, 194, 5525 }, // South Africa Standard Time / Rwanda
- { 104, 216, 5539 }, // South Africa Standard Time / South Africa
- { 104, 260, 5559 }, // South Africa Standard Time / Zambia
- { 104, 261, 5573 }, // South Africa Standard Time / Zimbabwe
- { 105, 219, 5587 }, // South Sudan Standard Time / South Sudan
- { 106, 221, 5599 }, // Sri Lanka Standard Time / Sri Lanka
- { 107, 222, 5612 }, // Sudan Standard Time / Sudan
- { 108, 227, 5628 }, // Syria Standard Time / Syria
- { 109, 228, 5642 }, // Taipei Standard Time / Taiwan
- { 110, 15, 5654 }, // Tasmania Standard Time / Australia
- { 111, 32, 5709 }, // Tocantins Standard Time / Brazil
- { 112, 0, 5727 }, // Tokyo Standard Time / AnyTerritory
- { 112, 111, 5737 }, // Tokyo Standard Time / Indonesia
- { 112, 120, 5751 }, // Tokyo Standard Time / Japan
- { 112, 179, 5762 }, // Tokyo Standard Time / Palau
- { 112, 232, 5776 }, // Tokyo Standard Time / Timor-Leste
- { 113, 193, 5786 }, // Tomsk Standard Time / Russia
- { 114, 235, 5797 }, // Tonga Standard Time / Tonga
- { 115, 193, 5815 }, // Transbaikal Standard Time / Russia
- { 116, 239, 5826 }, // Turkey Standard Time / Turkey
- { 117, 241, 5842 }, // Turks And Caicos Standard Time / Turks And Caicos Islands
- { 118, 156, 5861 }, // Ulaanbaatar Standard Time / Mongolia
- { 119, 248, 5894 }, // US Eastern Standard Time / United States
- { 120, 0, 5961 }, // US Mountain Standard Time / AnyTerritory
- { 120, 41, 5971 }, // US Mountain Standard Time / Canada
- { 120, 152, 6028 }, // US Mountain Standard Time / Mexico
- { 120, 248, 6047 }, // US Mountain Standard Time / United States
- { 121, 0, 6063 }, // UTC-11 / AnyTerritory
- { 121, 5, 6074 }, // UTC-11 / American Samoa
- { 121, 171, 6092 }, // UTC-11 / Niue
- { 121, 247, 6105 }, // UTC-11 / United States Outlying Islands
- { 122, 0, 6120 }, // UTC-09 / AnyTerritory
- { 122, 86, 6130 }, // UTC-09 / French Polynesia
- { 123, 0, 6146 }, // UTC-08 / AnyTerritory
- { 123, 186, 6156 }, // UTC-08 / Pitcairn
- { 124, 0, 6173 }, // UTC-02 / AnyTerritory
- { 124, 32, 6183 }, // UTC-02 / Brazil
- { 124, 217, 6199 }, // UTC-02 / South Georgia And South Sandwich Islands
- { 125, 0, 6222 }, // UTC / AnyTerritory
- { 126, 0, 6238 }, // UTC+12 / AnyTerritory
- { 126, 125, 6249 }, // UTC+12 / Kiribati
- { 126, 147, 6264 }, // UTC+12 / Marshall Islands
- { 126, 163, 6297 }, // UTC+12 / Nauru
- { 126, 242, 6311 }, // UTC+12 / Tuvalu
- { 126, 247, 6328 }, // UTC+12 / United States Outlying Islands
- { 126, 256, 6341 }, // UTC+12 / Wallis And Futuna
- { 127, 0, 6356 }, // UTC+13 / AnyTerritory
- { 127, 125, 6367 }, // UTC+13 / Kiribati
- { 127, 234, 6385 }, // UTC+13 / Tokelau
- { 128, 254, 6401 }, // Venezuela Standard Time / Venezuela
- { 129, 193, 6417 }, // Vladivostok Standard Time / Russia
- { 130, 193, 6448 }, // Volgograd Standard Time / Russia
- { 131, 15, 6465 }, // W. Australia Standard Time / Australia
- { 132, 0, 6481 }, // W. Central Africa Standard Time / AnyTerritory
- { 132, 4, 6491 }, // W. Central Africa Standard Time / Algeria
- { 132, 7, 6506 }, // W. Central Africa Standard Time / Angola
- { 132, 25, 6520 }, // W. Central Africa Standard Time / Benin
- { 132, 40, 6538 }, // W. Central Africa Standard Time / Cameroon
- { 132, 46, 6552 }, // W. Central Africa Standard Time / Central African Republic
- { 132, 48, 6566 }, // W. Central Africa Standard Time / Chad
- { 132, 56, 6582 }, // W. Central Africa Standard Time / Congo Brazzaville
- { 132, 57, 6601 }, // W. Central Africa Standard Time / Congo Kinshasa
- { 132, 73, 6617 }, // W. Central Africa Standard Time / Equatorial Guinea
- { 132, 88, 6631 }, // W. Central Africa Standard Time / Gabon
- { 132, 169, 6649 }, // W. Central Africa Standard Time / Nigeria
- { 132, 170, 6662 }, // W. Central Africa Standard Time / Niger
- { 132, 238, 6676 }, // W. Central Africa Standard Time / Tunisia
- { 133, 6, 6689 }, // W. Europe Standard Time / Andorra
- { 133, 16, 6704 }, // W. Europe Standard Time / Austria
- { 133, 91, 6718 }, // W. Europe Standard Time / Germany
- { 133, 93, 6748 }, // W. Europe Standard Time / Gibraltar
- { 133, 117, 6765 }, // W. Europe Standard Time / Italy
- { 133, 136, 6777 }, // W. Europe Standard Time / Liechtenstein
- { 133, 138, 6790 }, // W. Europe Standard Time / Luxembourg
- { 133, 146, 6808 }, // W. Europe Standard Time / Malta
- { 133, 155, 6821 }, // W. Europe Standard Time / Monaco
- { 133, 165, 6835 }, // W. Europe Standard Time / Netherlands
- { 133, 175, 6852 }, // W. Europe Standard Time / Norway
- { 133, 203, 6864 }, // W. Europe Standard Time / San Marino
- { 133, 224, 6882 }, // W. Europe Standard Time / Svalbard And Jan Mayen
- { 133, 225, 6902 }, // W. Europe Standard Time / Sweden
- { 133, 226, 6919 }, // W. Europe Standard Time / Switzerland
- { 133, 253, 6933 }, // W. Europe Standard Time / Vatican City
- { 134, 156, 6948 }, // W. Mongolia Standard Time / Mongolia
- { 135, 0, 6958 }, // West Asia Standard Time / AnyTerritory
- { 135, 9, 6968 }, // West Asia Standard Time / Antarctica
- { 135, 87, 6986 }, // West Asia Standard Time / French Southern Territories
- { 135, 123, 7003 }, // West Asia Standard Time / Kazakhstan
- { 135, 144, 7048 }, // West Asia Standard Time / Maldives
- { 135, 229, 7064 }, // West Asia Standard Time / Tajikistan
- { 135, 240, 7078 }, // West Asia Standard Time / Turkmenistan
- { 135, 251, 7092 }, // West Asia Standard Time / Uzbekistan
- { 136, 180, 7121 }, // West Bank Standard Time / Palestinian Territories
- { 137, 0, 7143 }, // West Pacific Standard Time / AnyTerritory
- { 137, 9, 7154 }, // West Pacific Standard Time / Antarctica
- { 137, 98, 7180 }, // West Pacific Standard Time / Guam
- { 137, 153, 7193 }, // West Pacific Standard Time / Micronesia
- { 137, 173, 7206 }, // West Pacific Standard Time / Northern Mariana Islands
- { 137, 182, 7221 }, // West Pacific Standard Time / Papua New Guinea
- { 138, 193, 7242 }, // Yakutsk Standard Time / Russia
- { 139, 41, 7269 }, // Yukon Standard Time / Canada
+ { 30, 0, 1494 }, // Central Standard Time / AnyTerritory
+ { 30, 41, 1502 }, // Central Standard Time / Canada
+ { 30, 152, 1577 }, // Central Standard Time / Mexico
+ { 30, 248, 1611 }, // Central Standard Time / United States
+ { 31, 152, 1779 }, // Central Standard Time (Mexico) / Mexico
+ { 32, 167, 1873 }, // Chatham Islands Standard Time / New Zealand
+ { 33, 50, 1889 }, // China Standard Time / China
+ { 33, 107, 1903 }, // China Standard Time / Hong Kong
+ { 33, 139, 1918 }, // China Standard Time / Macao
+ { 34, 61, 1929 }, // Cuba Standard Time / Cuba
+ { 35, 0, 1944 }, // Dateline Standard Time / AnyTerritory
+ { 36, 0, 1955 }, // E. Africa Standard Time / AnyTerritory
+ { 36, 9, 1965 }, // E. Africa Standard Time / Antarctica
+ { 36, 55, 1982 }, // E. Africa Standard Time / Comoros
+ { 36, 67, 1996 }, // E. Africa Standard Time / Djibouti
+ { 36, 74, 2012 }, // E. Africa Standard Time / Eritrea
+ { 36, 77, 2026 }, // E. Africa Standard Time / Ethiopia
+ { 36, 124, 2045 }, // E. Africa Standard Time / Kenya
+ { 36, 141, 2060 }, // E. Africa Standard Time / Madagascar
+ { 36, 151, 2080 }, // E. Africa Standard Time / Mayotte
+ { 36, 215, 2095 }, // E. Africa Standard Time / Somalia
+ { 36, 230, 2112 }, // E. Africa Standard Time / Tanzania
+ { 36, 243, 2133 }, // E. Africa Standard Time / Uganda
+ { 37, 15, 2148 }, // E. Australia Standard Time / Australia
+ { 38, 154, 2186 }, // E. Europe Standard Time / Moldova
+ { 39, 32, 2202 }, // E. South America Standard Time / Brazil
+ { 40, 49, 2220 }, // Easter Island Standard Time / Chile
+ { 41, 0, 2235 }, // Eastern Standard Time / AnyTerritory
+ { 41, 18, 2243 }, // Eastern Standard Time / Bahamas
+ { 41, 41, 2258 }, // Eastern Standard Time / Canada
+ { 41, 248, 2363 }, // Eastern Standard Time / United States
+ { 42, 152, 2520 }, // Eastern Standard Time (Mexico) / Mexico
+ { 43, 71, 2535 }, // Egypt Standard Time / Egypt
+ { 44, 193, 2548 }, // Ekaterinburg Standard Time / Russia
+ { 45, 82, 2567 }, // Fiji Standard Time / Fiji
+ { 46, 2, 2580 }, // FLE Standard Time / Aland Islands
+ { 46, 36, 2597 }, // FLE Standard Time / Bulgaria
+ { 46, 75, 2610 }, // FLE Standard Time / Estonia
+ { 46, 83, 2625 }, // FLE Standard Time / Finland
+ { 46, 131, 2641 }, // FLE Standard Time / Latvia
+ { 46, 137, 2653 }, // FLE Standard Time / Lithuania
+ { 46, 244, 2668 }, // FLE Standard Time / Ukraine
+ { 47, 90, 2714 }, // Georgian Standard Time / Georgia
+ { 48, 81, 2727 }, // GMT Standard Time / Faroe Islands
+ { 48, 100, 2743 }, // GMT Standard Time / Guernsey
+ { 48, 114, 2759 }, // GMT Standard Time / Ireland
+ { 48, 115, 2773 }, // GMT Standard Time / Isle of Man
+ { 48, 121, 2792 }, // GMT Standard Time / Jersey
+ { 48, 188, 2806 }, // GMT Standard Time / Portugal
+ { 48, 220, 2837 }, // GMT Standard Time / Spain
+ { 48, 246, 2853 }, // GMT Standard Time / United Kingdom
+ { 49, 95, 2867 }, // Greenland Standard Time / Greenland
+ { 50, 37, 2883 }, // Greenwich Standard Time / Burkina Faso
+ { 50, 89, 2902 }, // Greenwich Standard Time / Gambia
+ { 50, 92, 2916 }, // Greenwich Standard Time / Ghana
+ { 50, 95, 2929 }, // Greenwich Standard Time / Greenland
+ { 50, 101, 2950 }, // Greenwich Standard Time / Guinea-Bissau
+ { 50, 102, 2964 }, // Greenwich Standard Time / Guinea
+ { 50, 109, 2979 }, // Greenwich Standard Time / Iceland
+ { 50, 118, 2998 }, // Greenwich Standard Time / Ivory Coast
+ { 50, 134, 3013 }, // Greenwich Standard Time / Liberia
+ { 50, 145, 3029 }, // Greenwich Standard Time / Mali
+ { 50, 149, 3043 }, // Greenwich Standard Time / Mauritania
+ { 50, 196, 3061 }, // Greenwich Standard Time / Saint Helena
+ { 50, 206, 3080 }, // Greenwich Standard Time / Senegal
+ { 50, 209, 3093 }, // Greenwich Standard Time / Sierra Leone
+ { 50, 233, 3109 }, // Greenwich Standard Time / Togo
+ { 51, 63, 3121 }, // GTB Standard Time / Cyprus
+ { 51, 94, 3149 }, // GTB Standard Time / Greece
+ { 51, 192, 3163 }, // GTB Standard Time / Romania
+ { 52, 104, 3180 }, // Haiti Standard Time / Haiti
+ { 53, 0, 3203 }, // Hawaiian Standard Time / AnyTerritory
+ { 53, 58, 3214 }, // Hawaiian Standard Time / Cook Islands
+ { 53, 86, 3232 }, // Hawaiian Standard Time / French Polynesia
+ { 53, 247, 3247 }, // Hawaiian Standard Time / United States Outlying Islands
+ { 53, 248, 3264 }, // Hawaiian Standard Time / United States
+ { 54, 110, 3281 }, // India Standard Time / India
+ { 55, 112, 3295 }, // Iran Standard Time / Iran
+ { 56, 116, 3307 }, // Israel Standard Time / Israel
+ { 57, 122, 3322 }, // Jordan Standard Time / Jordan
+ { 58, 193, 3333 }, // Kaliningrad Standard Time / Russia
+ { 59, 218, 3352 }, // Korea Standard Time / South Korea
+ { 60, 135, 3363 }, // Libya Standard Time / Libya
+ { 61, 0, 3378 }, // Line Islands Standard Time / AnyTerritory
+ { 61, 125, 3389 }, // Line Islands Standard Time / Kiribati
+ { 62, 15, 3408 }, // Lord Howe Standard Time / Australia
+ { 63, 193, 3428 }, // Magadan Standard Time / Russia
+ { 64, 49, 3441 }, // Magallanes Standard Time / Chile
+ { 65, 86, 3462 }, // Marquesas Standard Time / French Polynesia
+ { 66, 150, 3480 }, // Mauritius Standard Time / Mauritius
+ { 66, 191, 3497 }, // Mauritius Standard Time / Reunion
+ { 66, 208, 3512 }, // Mauritius Standard Time / Seychelles
+ { 67, 132, 3524 }, // Middle East Standard Time / Lebanon
+ { 68, 250, 3536 }, // Montevideo Standard Time / Uruguay
+ { 69, 159, 3555 }, // Morocco Standard Time / Morocco
+ { 69, 257, 3573 }, // Morocco Standard Time / Western Sahara
+ { 70, 0, 3589 }, // Mountain Standard Time / AnyTerritory
+ { 70, 41, 3597 }, // Mountain Standard Time / Canada
+ { 70, 152, 3671 }, // Mountain Standard Time / Mexico
+ { 70, 248, 3693 }, // Mountain Standard Time / United States
+ { 71, 152, 3722 }, // Mountain Standard Time (Mexico) / Mexico
+ { 72, 53, 3739 }, // Myanmar Standard Time / Cocos Islands
+ { 72, 161, 3752 }, // Myanmar Standard Time / Myanmar
+ { 73, 193, 3765 }, // N. Central Asia Standard Time / Russia
+ { 74, 162, 3782 }, // Namibia Standard Time / Namibia
+ { 75, 164, 3798 }, // Nepal Standard Time / Nepal
+ { 76, 9, 3812 }, // New Zealand Standard Time / Antarctica
+ { 76, 167, 3831 }, // New Zealand Standard Time / New Zealand
+ { 77, 41, 3848 }, // Newfoundland Standard Time / Canada
+ { 78, 172, 3865 }, // Norfolk Standard Time / Norfolk Island
+ { 79, 193, 3881 }, // North Asia East Standard Time / Russia
+ { 80, 193, 3894 }, // North Asia Standard Time / Russia
+ { 81, 174, 3929 }, // North Korea Standard Time / North Korea
+ { 82, 193, 3944 }, // Omsk Standard Time / Russia
+ { 83, 49, 3954 }, // Pacific SA Standard Time / Chile
+ { 84, 0, 3971 }, // Pacific Standard Time / AnyTerritory
+ { 84, 41, 3979 }, // Pacific Standard Time / Canada
+ { 84, 248, 3997 }, // Pacific Standard Time / United States
+ { 85, 152, 4017 }, // Pacific Standard Time (Mexico) / Mexico
+ { 86, 178, 4054 }, // Pakistan Standard Time / Pakistan
+ { 87, 183, 4067 }, // Paraguay Standard Time / Paraguay
+ { 88, 123, 4084 }, // Qyzylorda Standard Time / Kazakhstan
+ { 89, 23, 4099 }, // Romance Standard Time / Belgium
+ { 89, 65, 4115 }, // Romance Standard Time / Denmark
+ { 89, 84, 4133 }, // Romance Standard Time / France
+ { 89, 220, 4146 }, // Romance Standard Time / Spain
+ { 90, 193, 4173 }, // Russia Time Zone 10 / Russia
+ { 91, 193, 4192 }, // Russia Time Zone 11 / Russia
+ { 92, 193, 4219 }, // Russia Time Zone 3 / Russia
+ { 93, 193, 4233 }, // Russian Standard Time / Russia
+ { 93, 244, 4260 }, // Russian Standard Time / Ukraine
+ { 94, 0, 4278 }, // SA Eastern Standard Time / AnyTerritory
+ { 94, 9, 4288 }, // SA Eastern Standard Time / Antarctica
+ { 94, 32, 4325 }, // SA Eastern Standard Time / Brazil
+ { 94, 80, 4404 }, // SA Eastern Standard Time / Falkland Islands
+ { 94, 85, 4421 }, // SA Eastern Standard Time / French Guiana
+ { 94, 223, 4437 }, // SA Eastern Standard Time / Suriname
+ { 95, 0, 4456 }, // SA Pacific Standard Time / AnyTerritory
+ { 95, 32, 4466 }, // SA Pacific Standard Time / Brazil
+ { 95, 41, 4502 }, // SA Pacific Standard Time / Canada
+ { 95, 45, 4524 }, // SA Pacific Standard Time / Cayman Islands
+ { 95, 54, 4539 }, // SA Pacific Standard Time / Colombia
+ { 95, 70, 4554 }, // SA Pacific Standard Time / Ecuador
+ { 95, 119, 4572 }, // SA Pacific Standard Time / Jamaica
+ { 95, 181, 4588 }, // SA Pacific Standard Time / Panama
+ { 95, 184, 4603 }, // SA Pacific Standard Time / Peru
+ { 96, 0, 4616 }, // SA Western Standard Time / AnyTerritory
+ { 96, 8, 4626 }, // SA Western Standard Time / Anguilla
+ { 96, 10, 4643 }, // SA Western Standard Time / Antigua and Barbuda
+ { 96, 13, 4659 }, // SA Western Standard Time / Aruba
+ { 96, 21, 4673 }, // SA Western Standard Time / Barbados
+ { 96, 28, 4690 }, // SA Western Standard Time / Bolivia
+ { 96, 32, 4705 }, // SA Western Standard Time / Brazil
+ { 96, 34, 4758 }, // SA Western Standard Time / British Virgin Islands
+ { 96, 41, 4774 }, // SA Western Standard Time / Canada
+ { 96, 44, 4795 }, // SA Western Standard Time / Caribbean Netherlands
+ { 96, 62, 4814 }, // SA Western Standard Time / Curacao
+ { 96, 68, 4830 }, // SA Western Standard Time / Dominica
+ { 96, 69, 4847 }, // SA Western Standard Time / Dominican Republic
+ { 96, 96, 4869 }, // SA Western Standard Time / Grenada
+ { 96, 97, 4885 }, // SA Western Standard Time / Guadeloupe
+ { 96, 103, 4904 }, // SA Western Standard Time / Guyana
+ { 96, 148, 4919 }, // SA Western Standard Time / Martinique
+ { 96, 158, 4938 }, // SA Western Standard Time / Montserrat
+ { 96, 189, 4957 }, // SA Western Standard Time / Puerto Rico
+ { 96, 195, 4977 }, // SA Western Standard Time / Saint Barthelemy
+ { 96, 197, 4999 }, // SA Western Standard Time / Saint Kitts and Nevis
+ { 96, 198, 5016 }, // SA Western Standard Time / Saint Lucia
+ { 96, 199, 5033 }, // SA Western Standard Time / Saint Martin
+ { 96, 201, 5049 }, // SA Western Standard Time / Saint Vincent and Grenadines
+ { 96, 211, 5068 }, // SA Western Standard Time / Sint Maarten
+ { 96, 236, 5090 }, // SA Western Standard Time / Trinidad and Tobago
+ { 96, 249, 5112 }, // SA Western Standard Time / United States Virgin Islands
+ { 97, 200, 5130 }, // Saint Pierre Standard Time / Saint Pierre and Miquelon
+ { 98, 193, 5147 }, // Sakhalin Standard Time / Russia
+ { 99, 202, 5161 }, // Samoa Standard Time / Samoa
+ { 100, 204, 5174 }, // Sao Tome Standard Time / Sao Tome and Principe
+ { 101, 193, 5190 }, // Saratov Standard Time / Russia
+ { 102, 0, 5205 }, // SE Asia Standard Time / AnyTerritory
+ { 102, 9, 5215 }, // SE Asia Standard Time / Antarctica
+ { 102, 39, 5232 }, // SE Asia Standard Time / Cambodia
+ { 102, 51, 5248 }, // SE Asia Standard Time / Christmas Island
+ { 102, 111, 5265 }, // SE Asia Standard Time / Indonesia
+ { 102, 129, 5293 }, // SE Asia Standard Time / Laos
+ { 102, 231, 5308 }, // SE Asia Standard Time / Thailand
+ { 102, 255, 5321 }, // SE Asia Standard Time / Vietnam
+ { 103, 0, 5333 }, // Singapore Standard Time / AnyTerritory
+ { 103, 35, 5343 }, // Singapore Standard Time / Brunei
+ { 103, 111, 5355 }, // Singapore Standard Time / Indonesia
+ { 103, 143, 5369 }, // Singapore Standard Time / Malaysia
+ { 103, 185, 5400 }, // Singapore Standard Time / Philippines
+ { 103, 210, 5412 }, // Singapore Standard Time / Singapore
+ { 104, 0, 5427 }, // South Africa Standard Time / AnyTerritory
+ { 104, 30, 5437 }, // South Africa Standard Time / Botswana
+ { 104, 38, 5453 }, // South Africa Standard Time / Burundi
+ { 104, 57, 5470 }, // South Africa Standard Time / Congo - Kinshasa
+ { 104, 76, 5488 }, // South Africa Standard Time / Eswatini
+ { 104, 133, 5503 }, // South Africa Standard Time / Lesotho
+ { 104, 142, 5517 }, // South Africa Standard Time / Malawi
+ { 104, 160, 5533 }, // South Africa Standard Time / Mozambique
+ { 104, 194, 5547 }, // South Africa Standard Time / Rwanda
+ { 104, 216, 5561 }, // South Africa Standard Time / South Africa
+ { 104, 260, 5581 }, // South Africa Standard Time / Zambia
+ { 104, 261, 5595 }, // South Africa Standard Time / Zimbabwe
+ { 105, 219, 5609 }, // South Sudan Standard Time / South Sudan
+ { 106, 221, 5621 }, // Sri Lanka Standard Time / Sri Lanka
+ { 107, 222, 5634 }, // Sudan Standard Time / Sudan
+ { 108, 227, 5650 }, // Syria Standard Time / Syria
+ { 109, 228, 5664 }, // Taipei Standard Time / Taiwan
+ { 110, 15, 5676 }, // Tasmania Standard Time / Australia
+ { 111, 32, 5731 }, // Tocantins Standard Time / Brazil
+ { 112, 0, 5749 }, // Tokyo Standard Time / AnyTerritory
+ { 112, 111, 5759 }, // Tokyo Standard Time / Indonesia
+ { 112, 120, 5773 }, // Tokyo Standard Time / Japan
+ { 112, 179, 5784 }, // Tokyo Standard Time / Palau
+ { 112, 232, 5798 }, // Tokyo Standard Time / Timor-Leste
+ { 113, 193, 5808 }, // Tomsk Standard Time / Russia
+ { 114, 235, 5819 }, // Tonga Standard Time / Tonga
+ { 115, 193, 5837 }, // Transbaikal Standard Time / Russia
+ { 116, 239, 5848 }, // Turkey Standard Time / Turkey
+ { 117, 241, 5864 }, // Turks And Caicos Standard Time / Turks and Caicos Islands
+ { 118, 156, 5883 }, // Ulaanbaatar Standard Time / Mongolia
+ { 119, 248, 5916 }, // US Eastern Standard Time / United States
+ { 120, 0, 5983 }, // US Mountain Standard Time / AnyTerritory
+ { 120, 41, 5993 }, // US Mountain Standard Time / Canada
+ { 120, 152, 6050 }, // US Mountain Standard Time / Mexico
+ { 120, 248, 6069 }, // US Mountain Standard Time / United States
+ { 121, 0, 6085 }, // UTC / AnyTerritory
+ { 122, 0, 6101 }, // UTC+12 / AnyTerritory
+ { 122, 125, 6112 }, // UTC+12 / Kiribati
+ { 122, 147, 6127 }, // UTC+12 / Marshall Islands
+ { 122, 163, 6160 }, // UTC+12 / Nauru
+ { 122, 242, 6174 }, // UTC+12 / Tuvalu
+ { 122, 247, 6191 }, // UTC+12 / United States Outlying Islands
+ { 122, 256, 6204 }, // UTC+12 / Wallis and Futuna
+ { 123, 0, 6219 }, // UTC+13 / AnyTerritory
+ { 123, 125, 6230 }, // UTC+13 / Kiribati
+ { 123, 234, 6248 }, // UTC+13 / Tokelau
+ { 124, 0, 6264 }, // UTC-02 / AnyTerritory
+ { 124, 32, 6274 }, // UTC-02 / Brazil
+ { 124, 217, 6290 }, // UTC-02 / South Georgia and South Sandwich Islands
+ { 125, 0, 6313 }, // UTC-08 / AnyTerritory
+ { 125, 186, 6323 }, // UTC-08 / Pitcairn
+ { 126, 0, 6340 }, // UTC-09 / AnyTerritory
+ { 126, 86, 6350 }, // UTC-09 / French Polynesia
+ { 127, 0, 6366 }, // UTC-11 / AnyTerritory
+ { 127, 5, 6377 }, // UTC-11 / American Samoa
+ { 127, 171, 6395 }, // UTC-11 / Niue
+ { 127, 247, 6408 }, // UTC-11 / United States Outlying Islands
+ { 128, 254, 6423 }, // Venezuela Standard Time / Venezuela
+ { 129, 193, 6439 }, // Vladivostok Standard Time / Russia
+ { 130, 193, 6470 }, // Volgograd Standard Time / Russia
+ { 131, 15, 6487 }, // W. Australia Standard Time / Australia
+ { 132, 0, 6503 }, // W. Central Africa Standard Time / AnyTerritory
+ { 132, 4, 6513 }, // W. Central Africa Standard Time / Algeria
+ { 132, 7, 6528 }, // W. Central Africa Standard Time / Angola
+ { 132, 25, 6542 }, // W. Central Africa Standard Time / Benin
+ { 132, 40, 6560 }, // W. Central Africa Standard Time / Cameroon
+ { 132, 46, 6574 }, // W. Central Africa Standard Time / Central African Republic
+ { 132, 48, 6588 }, // W. Central Africa Standard Time / Chad
+ { 132, 56, 6604 }, // W. Central Africa Standard Time / Congo - Brazzaville
+ { 132, 57, 6623 }, // W. Central Africa Standard Time / Congo - Kinshasa
+ { 132, 73, 6639 }, // W. Central Africa Standard Time / Equatorial Guinea
+ { 132, 88, 6653 }, // W. Central Africa Standard Time / Gabon
+ { 132, 169, 6671 }, // W. Central Africa Standard Time / Nigeria
+ { 132, 170, 6684 }, // W. Central Africa Standard Time / Niger
+ { 132, 238, 6698 }, // W. Central Africa Standard Time / Tunisia
+ { 133, 6, 6711 }, // W. Europe Standard Time / Andorra
+ { 133, 16, 6726 }, // W. Europe Standard Time / Austria
+ { 133, 91, 6740 }, // W. Europe Standard Time / Germany
+ { 133, 93, 6770 }, // W. Europe Standard Time / Gibraltar
+ { 133, 117, 6787 }, // W. Europe Standard Time / Italy
+ { 133, 136, 6799 }, // W. Europe Standard Time / Liechtenstein
+ { 133, 138, 6812 }, // W. Europe Standard Time / Luxembourg
+ { 133, 146, 6830 }, // W. Europe Standard Time / Malta
+ { 133, 155, 6843 }, // W. Europe Standard Time / Monaco
+ { 133, 165, 6857 }, // W. Europe Standard Time / Netherlands
+ { 133, 175, 6874 }, // W. Europe Standard Time / Norway
+ { 133, 203, 6886 }, // W. Europe Standard Time / San Marino
+ { 133, 224, 6904 }, // W. Europe Standard Time / Svalbard and Jan Mayen
+ { 133, 225, 6924 }, // W. Europe Standard Time / Sweden
+ { 133, 226, 6941 }, // W. Europe Standard Time / Switzerland
+ { 133, 253, 6955 }, // W. Europe Standard Time / Vatican City
+ { 134, 156, 6970 }, // W. Mongolia Standard Time / Mongolia
+ { 135, 0, 6980 }, // West Asia Standard Time / AnyTerritory
+ { 135, 9, 6990 }, // West Asia Standard Time / Antarctica
+ { 135, 87, 7008 }, // West Asia Standard Time / French Southern Territories
+ { 135, 123, 7025 }, // West Asia Standard Time / Kazakhstan
+ { 135, 144, 7070 }, // West Asia Standard Time / Maldives
+ { 135, 229, 7086 }, // West Asia Standard Time / Tajikistan
+ { 135, 240, 7100 }, // West Asia Standard Time / Turkmenistan
+ { 135, 251, 7114 }, // West Asia Standard Time / Uzbekistan
+ { 136, 180, 7143 }, // West Bank Standard Time / Palestinian Territories
+ { 137, 0, 7165 }, // West Pacific Standard Time / AnyTerritory
+ { 137, 9, 7176 }, // West Pacific Standard Time / Antarctica
+ { 137, 98, 7202 }, // West Pacific Standard Time / Guam
+ { 137, 153, 7215 }, // West Pacific Standard Time / Micronesia
+ { 137, 173, 7228 }, // West Pacific Standard Time / Northern Mariana Islands
+ { 137, 182, 7243 }, // West Pacific Standard Time / Papua New Guinea
+ { 138, 193, 7264 }, // Yakutsk Standard Time / Russia
+ { 139, 41, 7291 }, // Yukon Standard Time / Canada
};
// Windows ID Key, Windows ID Index, IANA ID Index, UTC Offset
-static const QWindowsData windowsDataTable[] = {
+static constexpr WindowsData windowsDataTable[] = {
{ 1, 0, 0, 16200 }, // Afghanistan Standard Time
- { 2, 26, 7303,-32400 }, // Alaskan Standard Time
+ { 2, 26, 7325,-32400 }, // Alaskan Standard Time
{ 3, 48, 106,-36000 }, // Aleutian Standard Time
{ 4, 71, 119, 25200 }, // Altai Standard Time
{ 5, 91, 168, 10800 }, // Arab Standard Time
{ 6, 110, 212, 14400 }, // Arabian Standard Time
{ 7, 132, 223, 10800 }, // Arabic Standard Time
- { 8, 153, 7321,-10800 }, // Argentina Standard Time
- { 9, 177, 7342, 14400 }, // Astrakhan Standard Time
- { 10, 201, 7359,-14400 }, // Atlantic Standard Time
+ { 8, 153, 7343,-10800 }, // Argentina Standard Time
+ { 9, 177, 7364, 14400 }, // Astrakhan Standard Time
+ { 10, 201, 7381,-14400 }, // Atlantic Standard Time
{ 11, 224, 642, 34200 }, // AUS Central Standard Time
{ 12, 250, 659, 31500 }, // Aus Central W. Standard Time
- { 13, 279, 7375, 36000 }, // AUS Eastern Standard Time
+ { 13, 279, 7397, 36000 }, // AUS Eastern Standard Time
{ 14, 305, 712, 14400 }, // Azerbaijan Standard Time
{ 15, 330, 743, -3600 }, // Azores Standard Time
{ 16, 351, 759,-10800 }, // Bahia Standard Time
{ 17, 371, 773, 21600 }, // Bangladesh Standard Time
{ 18, 396, 797, 10800 }, // Belarus Standard Time
{ 19, 418, 810, 39600 }, // Bougainville Standard Time
- { 20, 445, 7392,-21600 }, // Canada Central Standard Time
+ { 20, 445, 7414,-21600 }, // Canada Central Standard Time
{ 21, 474, 878, -3600 }, // Cape Verde Standard Time
{ 22, 499, 898, 14400 }, // Caucasus Standard Time
- { 23, 522, 7407, 34200 }, // Cen. Australia Standard Time
+ { 23, 522, 7429, 34200 }, // Cen. Australia Standard Time
{ 24, 551, 1034,-21600 }, // Central America Standard Time
- { 25, 581, 7426, 21600 }, // Central Asia Standard Time
- { 26, 608, 7438,-14400 }, // Central Brazilian Standard Time
+ { 25, 581, 7448, 21600 }, // Central Asia Standard Time
+ { 26, 608, 7460,-14400 }, // Central Brazilian Standard Time
{ 27, 640, 1245, 3600 }, // Central Europe Standard Time
{ 28, 669, 1373, 3600 }, // Central European Standard Time
{ 29, 700, 1460, 39600 }, // Central Pacific Standard Time
- { 30, 730, 7453,-21600 }, // Central Standard Time (Mexico)
- { 31, 761, 7473,-21600 }, // Central Standard Time
- { 32, 783, 1839, 28800 }, // China Standard Time
- { 33, 803, 1879, 45900 }, // Chatham Islands Standard Time
- { 34, 833, 1895,-18000 }, // Cuba Standard Time
- { 35, 852, 1910,-43200 }, // Dateline Standard Time
- { 36, 875, 2011, 10800 }, // E. Africa Standard Time
- { 37, 899, 7489, 36000 }, // E. Australia Standard Time
- { 38, 926, 2152, 7200 }, // E. Europe Standard Time
- { 39, 950, 2168,-10800 }, // E. South America Standard Time
- { 40, 981, 2186,-21600 }, // Easter Island Standard Time
- { 41, 1009, 7508,-18000 }, // Eastern Standard Time
- { 42, 1031, 2486,-18000 }, // Eastern Standard Time (Mexico)
- { 43, 1062, 2501, 7200 }, // Egypt Standard Time
- { 44, 1082, 2514, 18000 }, // Ekaterinburg Standard Time
- { 45, 1109, 2533, 43200 }, // Fiji Standard Time
- { 46, 1128, 7525, 7200 }, // FLE Standard Time
- { 47, 1146, 2680, 14400 }, // Georgian Standard Time
- { 48, 1169, 2819, 0 }, // GMT Standard Time
- { 49, 1187, 2833,-10800 }, // Greenland Standard Time
- { 50, 1211, 2945, 0 }, // Greenwich Standard Time
- { 51, 1235, 3129, 7200 }, // GTB Standard Time
- { 52, 1253, 3146,-18000 }, // Haiti Standard Time
- { 53, 1273, 3230,-36000 }, // Hawaiian Standard Time
- { 54, 1296, 3247, 19800 }, // India Standard Time
- { 55, 1316, 3261, 12600 }, // Iran Standard Time
- { 56, 1335, 3273, 7200 }, // Israel Standard Time
- { 57, 1356, 3288, 7200 }, // Jordan Standard Time
- { 58, 1377, 3299, 7200 }, // Kaliningrad Standard Time
- { 59, 1403, 3318, 32400 }, // Korea Standard Time
- { 60, 1423, 3329, 7200 }, // Libya Standard Time
- { 61, 1443, 3355, 50400 }, // Line Islands Standard Time
- { 62, 1470, 3374, 37800 }, // Lord Howe Standard Time
- { 63, 1494, 3394, 36000 }, // Magadan Standard Time
- { 64, 1516, 3407,-10800 }, // Magallanes Standard Time
- { 65, 1541, 3428,-34200 }, // Marquesas Standard Time
- { 66, 1565, 3446, 14400 }, // Mauritius Standard Time
- { 67, 1589, 3490, 7200 }, // Middle East Standard Time
- { 68, 1615, 3502,-10800 }, // Montevideo Standard Time
- { 69, 1640, 3521, 0 }, // Morocco Standard Time
- { 70, 1662, 7537,-25200 }, // Mountain Standard Time (Mexico)
- { 71, 1694, 7555,-25200 }, // Mountain Standard Time
- { 72, 1717, 3730, 23400 }, // Myanmar Standard Time
- { 73, 1739, 3743, 21600 }, // N. Central Asia Standard Time
- { 74, 1769, 3760, 3600 }, // Namibia Standard Time
- { 75, 1791, 3776, 20700 }, // Nepal Standard Time
- { 76, 1811, 3809, 43200 }, // New Zealand Standard Time
- { 77, 1837, 3826,-12600 }, // Newfoundland Standard Time
- { 78, 1864, 3843, 39600 }, // Norfolk Standard Time
- { 79, 1886, 3859, 28800 }, // North Asia East Standard Time
- { 80, 1916, 7570, 25200 }, // North Asia Standard Time
- { 81, 1941, 3907, 30600 }, // North Korea Standard Time
- { 82, 1967, 3922, 21600 }, // Omsk Standard Time
- { 83, 1986, 3932,-10800 }, // Pacific SA Standard Time
- { 84, 2011, 3975,-28800 }, // Pacific Standard Time
- { 85, 2033, 7587,-28800 }, // Pacific Standard Time (Mexico)
- { 86, 2064, 4032, 18000 }, // Pakistan Standard Time
- { 87, 2087, 4045,-14400 }, // Paraguay Standard Time
- { 88, 2110, 4062, 18000 }, // Qyzylorda Standard Time
- { 89, 2134, 4111, 3600 }, // Romance Standard Time
- { 90, 2156, 4151, 14400 }, // Russia Time Zone 3
- { 91, 2175, 4165, 39600 }, // Russia Time Zone 10
- { 92, 2195, 7603, 43200 }, // Russia Time Zone 11
- { 93, 2215, 7618, 10800 }, // Russian Standard Time
- { 94, 2237, 4399,-10800 }, // SA Eastern Standard Time
- { 95, 2262, 4517,-18000 }, // SA Pacific Standard Time
- { 96, 2287, 4668,-14400 }, // SA Western Standard Time
- { 97, 2312, 5108,-10800 }, // Saint Pierre Standard Time
- { 98, 2339, 5125, 39600 }, // Sakhalin Standard Time
- { 99, 2362, 5139, 46800 }, // Samoa Standard Time
- { 100, 2382, 5152, 0 }, // Sao Tome Standard Time
- { 101, 2405, 5168, 14400 }, // Saratov Standard Time
- { 102, 2427, 5286, 25200 }, // SE Asia Standard Time
- { 103, 2449, 5390, 28800 }, // Singapore Standard Time
- { 104, 2473, 5539, 7200 }, // South Africa Standard Time
- { 105, 2500, 5587, 7200 }, // South Sudan Standard Time
- { 106, 2526, 5599, 19800 }, // Sri Lanka Standard Time
- { 107, 2550, 5612, 7200 }, // Sudan Standard Time
- { 108, 2570, 5628, 7200 }, // Syria Standard Time
- { 109, 2590, 5642, 28800 }, // Taipei Standard Time
- { 110, 2611, 7632, 36000 }, // Tasmania Standard Time
- { 111, 2634, 5709,-10800 }, // Tocantins Standard Time
- { 112, 2658, 5751, 32400 }, // Tokyo Standard Time
- { 113, 2678, 5786, 25200 }, // Tomsk Standard Time
- { 114, 2698, 5797, 46800 }, // Tonga Standard Time
- { 115, 2718, 5815, 32400 }, // Transbaikal Standard Time
- { 116, 2744, 5826, 7200 }, // Turkey Standard Time
- { 117, 2765, 5842,-14400 }, // Turks And Caicos Standard Time
- { 118, 2796, 7649, 28800 }, // Ulaanbaatar Standard Time
- { 119, 2822, 7666,-18000 }, // US Eastern Standard Time
- { 120, 2847, 6047,-25200 }, // US Mountain Standard Time
- { 121, 2873, 6063,-39600 }, // UTC-11
- { 122, 2880, 6120,-32400 }, // UTC-09
- { 123, 2887, 6146,-28800 }, // UTC-08
- { 124, 2894, 6173, -7200 }, // UTC-02
- { 125, 2901, 7687, 0 }, // UTC
- { 126, 2905, 6238, 43200 }, // UTC+12
- { 127, 2912, 6356, 46800 }, // UTC+13
- { 128, 2919, 6401,-16200 }, // Venezuela Standard Time
- { 129, 2943, 7695, 36000 }, // Vladivostok Standard Time
- { 130, 2969, 6448, 14400 }, // Volgograd Standard Time
- { 131, 2993, 6465, 28800 }, // W. Australia Standard Time
- { 132, 3020, 6649, 3600 }, // W. Central Africa Standard Time
- { 133, 3052, 7712, 3600 }, // W. Europe Standard Time
- { 134, 3076, 6948, 25200 }, // W. Mongolia Standard Time
- { 135, 3102, 7726, 18000 }, // West Asia Standard Time
- { 136, 3126, 7740, 7200 }, // West Bank Standard Time
- { 137, 3150, 7221, 36000 }, // West Pacific Standard Time
- { 138, 3177, 7752, 32400 }, // Yakutsk Standard Time
- { 139, 3199, 7765,-25200 }, // Yukon Standard Time
+ { 30, 730, 7475,-21600 }, // Central Standard Time
+ { 31, 752, 7491,-21600 }, // Central Standard Time (Mexico)
+ { 32, 783, 1873, 45900 }, // Chatham Islands Standard Time
+ { 33, 813, 1889, 28800 }, // China Standard Time
+ { 34, 833, 1929,-18000 }, // Cuba Standard Time
+ { 35, 852, 1944,-43200 }, // Dateline Standard Time
+ { 36, 875, 2045, 10800 }, // E. Africa Standard Time
+ { 37, 899, 7511, 36000 }, // E. Australia Standard Time
+ { 38, 926, 2186, 7200 }, // E. Europe Standard Time
+ { 39, 950, 2202,-10800 }, // E. South America Standard Time
+ { 40, 981, 2220,-21600 }, // Easter Island Standard Time
+ { 41, 1009, 7530,-18000 }, // Eastern Standard Time
+ { 42, 1031, 2520,-18000 }, // Eastern Standard Time (Mexico)
+ { 43, 1062, 2535, 7200 }, // Egypt Standard Time
+ { 44, 1082, 2548, 18000 }, // Ekaterinburg Standard Time
+ { 45, 1109, 2567, 43200 }, // Fiji Standard Time
+ { 46, 1128, 7547, 7200 }, // FLE Standard Time
+ { 47, 1146, 2714, 14400 }, // Georgian Standard Time
+ { 48, 1169, 2853, 0 }, // GMT Standard Time
+ { 49, 1187, 2867,-10800 }, // Greenland Standard Time
+ { 50, 1211, 2979, 0 }, // Greenwich Standard Time
+ { 51, 1235, 3163, 7200 }, // GTB Standard Time
+ { 52, 1253, 3180,-18000 }, // Haiti Standard Time
+ { 53, 1273, 3264,-36000 }, // Hawaiian Standard Time
+ { 54, 1296, 3281, 19800 }, // India Standard Time
+ { 55, 1316, 3295, 12600 }, // Iran Standard Time
+ { 56, 1335, 3307, 7200 }, // Israel Standard Time
+ { 57, 1356, 3322, 7200 }, // Jordan Standard Time
+ { 58, 1377, 3333, 7200 }, // Kaliningrad Standard Time
+ { 59, 1403, 3352, 32400 }, // Korea Standard Time
+ { 60, 1423, 3363, 7200 }, // Libya Standard Time
+ { 61, 1443, 3389, 50400 }, // Line Islands Standard Time
+ { 62, 1470, 3408, 37800 }, // Lord Howe Standard Time
+ { 63, 1494, 3428, 36000 }, // Magadan Standard Time
+ { 64, 1516, 3441,-10800 }, // Magallanes Standard Time
+ { 65, 1541, 3462,-34200 }, // Marquesas Standard Time
+ { 66, 1565, 3480, 14400 }, // Mauritius Standard Time
+ { 67, 1589, 3524, 7200 }, // Middle East Standard Time
+ { 68, 1615, 3536,-10800 }, // Montevideo Standard Time
+ { 69, 1640, 3555, 0 }, // Morocco Standard Time
+ { 70, 1662, 7559,-25200 }, // Mountain Standard Time
+ { 71, 1685, 3722,-25200 }, // Mountain Standard Time (Mexico)
+ { 72, 1717, 3752, 23400 }, // Myanmar Standard Time
+ { 73, 1739, 3765, 21600 }, // N. Central Asia Standard Time
+ { 74, 1769, 3782, 3600 }, // Namibia Standard Time
+ { 75, 1791, 3798, 20700 }, // Nepal Standard Time
+ { 76, 1811, 3831, 43200 }, // New Zealand Standard Time
+ { 77, 1837, 3848,-12600 }, // Newfoundland Standard Time
+ { 78, 1864, 3865, 39600 }, // Norfolk Standard Time
+ { 79, 1886, 3881, 28800 }, // North Asia East Standard Time
+ { 80, 1916, 7574, 25200 }, // North Asia Standard Time
+ { 81, 1941, 3929, 30600 }, // North Korea Standard Time
+ { 82, 1967, 3944, 21600 }, // Omsk Standard Time
+ { 83, 1986, 3954,-10800 }, // Pacific SA Standard Time
+ { 84, 2011, 3997,-28800 }, // Pacific Standard Time
+ { 85, 2033, 7591,-28800 }, // Pacific Standard Time (Mexico)
+ { 86, 2064, 4054, 18000 }, // Pakistan Standard Time
+ { 87, 2087, 4067,-14400 }, // Paraguay Standard Time
+ { 88, 2110, 4084, 18000 }, // Qyzylorda Standard Time
+ { 89, 2134, 4133, 3600 }, // Romance Standard Time
+ { 90, 2156, 4173, 39600 }, // Russia Time Zone 10
+ { 91, 2176, 7607, 43200 }, // Russia Time Zone 11
+ { 92, 2196, 4219, 14400 }, // Russia Time Zone 3
+ { 93, 2215, 7622, 10800 }, // Russian Standard Time
+ { 94, 2237, 4421,-10800 }, // SA Eastern Standard Time
+ { 95, 2262, 4539,-18000 }, // SA Pacific Standard Time
+ { 96, 2287, 4690,-14400 }, // SA Western Standard Time
+ { 97, 2312, 5130,-10800 }, // Saint Pierre Standard Time
+ { 98, 2339, 5147, 39600 }, // Sakhalin Standard Time
+ { 99, 2362, 5161, 46800 }, // Samoa Standard Time
+ { 100, 2382, 5174, 0 }, // Sao Tome Standard Time
+ { 101, 2405, 5190, 14400 }, // Saratov Standard Time
+ { 102, 2427, 5308, 25200 }, // SE Asia Standard Time
+ { 103, 2449, 5412, 28800 }, // Singapore Standard Time
+ { 104, 2473, 5561, 7200 }, // South Africa Standard Time
+ { 105, 2500, 5609, 7200 }, // South Sudan Standard Time
+ { 106, 2526, 5621, 19800 }, // Sri Lanka Standard Time
+ { 107, 2550, 5634, 7200 }, // Sudan Standard Time
+ { 108, 2570, 5650, 7200 }, // Syria Standard Time
+ { 109, 2590, 5664, 28800 }, // Taipei Standard Time
+ { 110, 2611, 7636, 36000 }, // Tasmania Standard Time
+ { 111, 2634, 5731,-10800 }, // Tocantins Standard Time
+ { 112, 2658, 5773, 32400 }, // Tokyo Standard Time
+ { 113, 2678, 5808, 25200 }, // Tomsk Standard Time
+ { 114, 2698, 5819, 46800 }, // Tonga Standard Time
+ { 115, 2718, 5837, 32400 }, // Transbaikal Standard Time
+ { 116, 2744, 5848, 7200 }, // Turkey Standard Time
+ { 117, 2765, 5864,-14400 }, // Turks And Caicos Standard Time
+ { 118, 2796, 7653, 28800 }, // Ulaanbaatar Standard Time
+ { 119, 2822, 7670,-18000 }, // US Eastern Standard Time
+ { 120, 2847, 6069,-25200 }, // US Mountain Standard Time
+ { 121, 2873, 7691, 0 }, // UTC
+ { 122, 2877, 6101, 43200 }, // UTC+12
+ { 123, 2884, 6219, 46800 }, // UTC+13
+ { 124, 2891, 6264, -7200 }, // UTC-02
+ { 125, 2898, 6313,-28800 }, // UTC-08
+ { 126, 2905, 6340,-32400 }, // UTC-09
+ { 127, 2912, 6366,-39600 }, // UTC-11
+ { 128, 2919, 6423,-16200 }, // Venezuela Standard Time
+ { 129, 2943, 7699, 36000 }, // Vladivostok Standard Time
+ { 130, 2969, 6470, 14400 }, // Volgograd Standard Time
+ { 131, 2993, 6487, 28800 }, // W. Australia Standard Time
+ { 132, 3020, 6671, 3600 }, // W. Central Africa Standard Time
+ { 133, 3052, 7716, 3600 }, // W. Europe Standard Time
+ { 134, 3076, 6970, 25200 }, // W. Mongolia Standard Time
+ { 135, 3102, 7730, 18000 }, // West Asia Standard Time
+ { 136, 3126, 7744, 7200 }, // West Bank Standard Time
+ { 137, 3150, 7243, 36000 }, // West Pacific Standard Time
+ { 138, 3177, 7756, 32400 }, // Yakutsk Standard Time
+ { 139, 3199, 7769,-25200 }, // Yukon Standard Time
};
// IANA ID Index, UTC Offset
-static const QUtcData utcDataTable[] = {
- { 7784, 0 }, // UTC
+static constexpr UtcData utcDataTable[] = {
{ 7788,-50400 }, // UTC-14:00
{ 7798,-46800 }, // UTC-13:00
{ 7808,-43200 }, // UTC-12:00
@@ -667,612 +618,759 @@ static const QUtcData utcDataTable[] = {
{ 7918,-10800 }, // UTC-03:00
{ 7928, -7200 }, // UTC-02:00
{ 7938, -3600 }, // UTC-01:00
- { 7948, 0 }, // UTC-00:00
- { 7958, 0 }, // UTC+00:00
- { 7968, 3600 }, // UTC+01:00
- { 7978, 7200 }, // UTC+02:00
- { 7988, 10800 }, // UTC+03:00
- { 7998, 12600 }, // UTC+03:30
- { 8008, 14400 }, // UTC+04:00
- { 8018, 16200 }, // UTC+04:30
- { 8028, 18000 }, // UTC+05:00
- { 8038, 19800 }, // UTC+05:30
- { 8048, 20700 }, // UTC+05:45
- { 8058, 21600 }, // UTC+06:00
- { 8068, 23400 }, // UTC+06:30
- { 8078, 25200 }, // UTC+07:00
- { 8088, 28800 }, // UTC+08:00
- { 8098, 30600 }, // UTC+08:30
- { 8108, 32400 }, // UTC+09:00
- { 8118, 34200 }, // UTC+09:30
- { 8128, 36000 }, // UTC+10:00
- { 8138, 39600 }, // UTC+11:00
- { 8148, 43200 }, // UTC+12:00
- { 8158, 46800 }, // UTC+13:00
- { 8168, 50400 }, // UTC+14:00
+ { 7948, 0 }, // UTC
+ { 7972, 3600 }, // UTC+01:00
+ { 7982, 7200 }, // UTC+02:00
+ { 7992, 10800 }, // UTC+03:00
+ { 8002, 12600 }, // UTC+03:30
+ { 8012, 14400 }, // UTC+04:00
+ { 8022, 16200 }, // UTC+04:30
+ { 8032, 18000 }, // UTC+05:00
+ { 8042, 19800 }, // UTC+05:30
+ { 8052, 20700 }, // UTC+05:45
+ { 8062, 21600 }, // UTC+06:00
+ { 8072, 23400 }, // UTC+06:30
+ { 8082, 25200 }, // UTC+07:00
+ { 8092, 28800 }, // UTC+08:00
+ { 8102, 30600 }, // UTC+08:30
+ { 8112, 32400 }, // UTC+09:00
+ { 8122, 34200 }, // UTC+09:30
+ { 8132, 36000 }, // UTC+10:00
+ { 8142, 39600 }, // UTC+11:00
+ { 8152, 43200 }, // UTC+12:00
+ { 8162, 46800 }, // UTC+13:00
+ { 8172, 50400 }, // UTC+14:00
};
-static const char windowsIdData[] = {
-0x41, 0x66, 0x67, 0x68, 0x61, 0x6e, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64,
-0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x41, 0x6c, 0x61, 0x73, 0x6b, 0x61, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61,
-0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x41, 0x6c, 0x65, 0x75, 0x74, 0x69, 0x61, 0x6e, 0x20, 0x53, 0x74, 0x61,
-0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x41, 0x6c, 0x74, 0x61, 0x69, 0x20, 0x53, 0x74, 0x61,
-0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x41, 0x72, 0x61, 0x62, 0x20, 0x53, 0x74, 0x61, 0x6e,
-0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x41, 0x72, 0x61, 0x62, 0x69, 0x61, 0x6e, 0x20, 0x53, 0x74,
-0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x41, 0x72, 0x61, 0x62, 0x69, 0x63, 0x20, 0x53,
-0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x41, 0x72, 0x67, 0x65, 0x6e, 0x74, 0x69,
-0x6e, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x41, 0x73, 0x74,
-0x72, 0x61, 0x6b, 0x68, 0x61, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65,
-0x0, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54,
-0x69, 0x6d, 0x65, 0x0, 0x41, 0x55, 0x53, 0x20, 0x43, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x20, 0x53, 0x74, 0x61, 0x6e,
-0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x41, 0x75, 0x73, 0x20, 0x43, 0x65, 0x6e, 0x74, 0x72, 0x61,
-0x6c, 0x20, 0x57, 0x2e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x41,
-0x55, 0x53, 0x20, 0x45, 0x61, 0x73, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20,
-0x54, 0x69, 0x6d, 0x65, 0x0, 0x41, 0x7a, 0x65, 0x72, 0x62, 0x61, 0x69, 0x6a, 0x61, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e,
-0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x41, 0x7a, 0x6f, 0x72, 0x65, 0x73, 0x20, 0x53, 0x74, 0x61,
-0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x42, 0x61, 0x68, 0x69, 0x61, 0x20, 0x53, 0x74, 0x61,
-0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x42, 0x61, 0x6e, 0x67, 0x6c, 0x61, 0x64, 0x65, 0x73,
-0x68, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x42, 0x65, 0x6c, 0x61,
-0x72, 0x75, 0x73, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x42, 0x6f,
-0x75, 0x67, 0x61, 0x69, 0x6e, 0x76, 0x69, 0x6c, 0x6c, 0x65, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20,
-0x54, 0x69, 0x6d, 0x65, 0x0, 0x43, 0x61, 0x6e, 0x61, 0x64, 0x61, 0x20, 0x43, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x20,
-0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x43, 0x61, 0x70, 0x65, 0x20, 0x56,
-0x65, 0x72, 0x64, 0x65, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x43,
-0x61, 0x75, 0x63, 0x61, 0x73, 0x75, 0x73, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d,
-0x65, 0x0, 0x43, 0x65, 0x6e, 0x2e, 0x20, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x20, 0x53, 0x74, 0x61,
-0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x43, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x20, 0x41,
-0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65,
-0x0, 0x43, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x20, 0x41, 0x73, 0x69, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61,
-0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x43, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x20, 0x42, 0x72, 0x61, 0x7a,
-0x69, 0x6c, 0x69, 0x61, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0,
-0x43, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x20, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64,
-0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x43, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x20, 0x45, 0x75, 0x72,
-0x6f, 0x70, 0x65, 0x61, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0,
-0x43, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x20, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x20, 0x53, 0x74, 0x61, 0x6e,
-0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x43, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x20, 0x53, 0x74,
-0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x20, 0x28, 0x4d, 0x65, 0x78, 0x69, 0x63, 0x6f, 0x29,
-0x0, 0x43, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69,
-0x6d, 0x65, 0x0, 0x43, 0x68, 0x69, 0x6e, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69,
-0x6d, 0x65, 0x0, 0x43, 0x68, 0x61, 0x74, 0x68, 0x61, 0x6d, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x20, 0x53,
-0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x43, 0x75, 0x62, 0x61, 0x20, 0x53, 0x74,
-0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x44, 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6e, 0x65,
-0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x45, 0x2e, 0x20, 0x41, 0x66,
-0x72, 0x69, 0x63, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x45,
-0x2e, 0x20, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64,
-0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x45, 0x2e, 0x20, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x20, 0x53, 0x74, 0x61, 0x6e,
-0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x45, 0x2e, 0x20, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x20, 0x41,
-0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65,
-0x0, 0x45, 0x61, 0x73, 0x74, 0x65, 0x72, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64,
-0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x45, 0x61, 0x73, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x53, 0x74, 0x61,
-0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x45, 0x61, 0x73, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x53,
-0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x20, 0x28, 0x4d, 0x65, 0x78, 0x69, 0x63, 0x6f,
-0x29, 0x0, 0x45, 0x67, 0x79, 0x70, 0x74, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d,
-0x65, 0x0, 0x45, 0x6b, 0x61, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x62, 0x75, 0x72, 0x67, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64,
-0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x46, 0x69, 0x6a, 0x69, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61,
-0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x46, 0x4c, 0x45, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64,
-0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x47, 0x65, 0x6f, 0x72, 0x67, 0x69, 0x61, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64,
-0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x47, 0x4d, 0x54, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72,
-0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x47, 0x72, 0x65, 0x65, 0x6e, 0x6c, 0x61, 0x6e, 0x64, 0x20, 0x53, 0x74, 0x61,
-0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x47, 0x72, 0x65, 0x65, 0x6e, 0x77, 0x69, 0x63, 0x68,
-0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x47, 0x54, 0x42, 0x20, 0x53,
-0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x48, 0x61, 0x69, 0x74, 0x69, 0x20, 0x53,
-0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x48, 0x61, 0x77, 0x61, 0x69, 0x69, 0x61,
-0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x49, 0x6e, 0x64, 0x69,
-0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x49, 0x72, 0x61, 0x6e,
-0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x49, 0x73, 0x72, 0x61, 0x65,
-0x6c, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x4a, 0x6f, 0x72, 0x64,
-0x61, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x4b, 0x61, 0x6c,
-0x69, 0x6e, 0x69, 0x6e, 0x67, 0x72, 0x61, 0x64, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69,
-0x6d, 0x65, 0x0, 0x4b, 0x6f, 0x72, 0x65, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69,
-0x6d, 0x65, 0x0, 0x4c, 0x69, 0x62, 0x79, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69,
-0x6d, 0x65, 0x0, 0x4c, 0x69, 0x6e, 0x65, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x20, 0x53, 0x74, 0x61, 0x6e,
-0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x4c, 0x6f, 0x72, 0x64, 0x20, 0x48, 0x6f, 0x77, 0x65, 0x20,
-0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x4d, 0x61, 0x67, 0x61, 0x64, 0x61,
-0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x4d, 0x61, 0x67, 0x61,
-0x6c, 0x6c, 0x61, 0x6e, 0x65, 0x73, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65,
-0x0, 0x4d, 0x61, 0x72, 0x71, 0x75, 0x65, 0x73, 0x61, 0x73, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20,
-0x54, 0x69, 0x6d, 0x65, 0x0, 0x4d, 0x61, 0x75, 0x72, 0x69, 0x74, 0x69, 0x75, 0x73, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64,
-0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x4d, 0x69, 0x64, 0x64, 0x6c, 0x65, 0x20, 0x45, 0x61, 0x73, 0x74,
-0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x4d, 0x6f, 0x6e, 0x74, 0x65,
-0x76, 0x69, 0x64, 0x65, 0x6f, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0,
-0x4d, 0x6f, 0x72, 0x6f, 0x63, 0x63, 0x6f, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d,
-0x65, 0x0, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20,
-0x54, 0x69, 0x6d, 0x65, 0x20, 0x28, 0x4d, 0x65, 0x78, 0x69, 0x63, 0x6f, 0x29, 0x0, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x61,
-0x69, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x4d, 0x79, 0x61,
-0x6e, 0x6d, 0x61, 0x72, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x4e,
-0x2e, 0x20, 0x43, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x20, 0x41, 0x73, 0x69, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64,
-0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x4e, 0x61, 0x6d, 0x69, 0x62, 0x69, 0x61, 0x20, 0x53, 0x74, 0x61,
-0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x4e, 0x65, 0x70, 0x61, 0x6c, 0x20, 0x53, 0x74, 0x61,
-0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x4e, 0x65, 0x77, 0x20, 0x5a, 0x65, 0x61, 0x6c, 0x61,
-0x6e, 0x64, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x4e, 0x65, 0x77,
-0x66, 0x6f, 0x75, 0x6e, 0x64, 0x6c, 0x61, 0x6e, 0x64, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54,
-0x69, 0x6d, 0x65, 0x0, 0x4e, 0x6f, 0x72, 0x66, 0x6f, 0x6c, 0x6b, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64,
-0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x20, 0x41, 0x73, 0x69, 0x61, 0x20, 0x45, 0x61, 0x73,
-0x74, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x4e, 0x6f, 0x72, 0x74,
-0x68, 0x20, 0x41, 0x73, 0x69, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65,
-0x0, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x20, 0x4b, 0x6f, 0x72, 0x65, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72,
-0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x4f, 0x6d, 0x73, 0x6b, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64,
-0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x20, 0x53, 0x41, 0x20, 0x53, 0x74, 0x61,
-0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x20, 0x53,
-0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63,
-0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x20, 0x28, 0x4d, 0x65, 0x78, 0x69,
-0x63, 0x6f, 0x29, 0x0, 0x50, 0x61, 0x6b, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72,
-0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x50, 0x61, 0x72, 0x61, 0x67, 0x75, 0x61, 0x79, 0x20, 0x53, 0x74, 0x61, 0x6e,
-0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x51, 0x79, 0x7a, 0x79, 0x6c, 0x6f, 0x72, 0x64, 0x61, 0x20,
-0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x52, 0x6f, 0x6d, 0x61, 0x6e, 0x63,
-0x65, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x52, 0x75, 0x73, 0x73,
-0x69, 0x61, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x20, 0x5a, 0x6f, 0x6e, 0x65, 0x20, 0x33, 0x0, 0x52, 0x75, 0x73, 0x73, 0x69,
-0x61, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x20, 0x5a, 0x6f, 0x6e, 0x65, 0x20, 0x31, 0x30, 0x0, 0x52, 0x75, 0x73, 0x73, 0x69,
-0x61, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x20, 0x5a, 0x6f, 0x6e, 0x65, 0x20, 0x31, 0x31, 0x0, 0x52, 0x75, 0x73, 0x73, 0x69,
-0x61, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x53, 0x41, 0x20,
-0x45, 0x61, 0x73, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d,
-0x65, 0x0, 0x53, 0x41, 0x20, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72,
-0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x53, 0x41, 0x20, 0x57, 0x65, 0x73, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x53, 0x74,
-0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x53, 0x61, 0x69, 0x6e, 0x74, 0x20, 0x50, 0x69,
-0x65, 0x72, 0x72, 0x65, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x53,
-0x61, 0x6b, 0x68, 0x61, 0x6c, 0x69, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d,
-0x65, 0x0, 0x53, 0x61, 0x6d, 0x6f, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d,
-0x65, 0x0, 0x53, 0x61, 0x6f, 0x20, 0x54, 0x6f, 0x6d, 0x65, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20,
-0x54, 0x69, 0x6d, 0x65, 0x0, 0x53, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x76, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72,
-0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x53, 0x45, 0x20, 0x41, 0x73, 0x69, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64,
-0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x53, 0x69, 0x6e, 0x67, 0x61, 0x70, 0x6f, 0x72, 0x65, 0x20, 0x53,
-0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x20, 0x41,
-0x66, 0x72, 0x69, 0x63, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0,
-0x53, 0x6f, 0x75, 0x74, 0x68, 0x20, 0x53, 0x75, 0x64, 0x61, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64,
-0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x53, 0x72, 0x69, 0x20, 0x4c, 0x61, 0x6e, 0x6b, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e,
-0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x53, 0x75, 0x64, 0x61, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e,
-0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x53, 0x79, 0x72, 0x69, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e,
-0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x54, 0x61, 0x69, 0x70, 0x65, 0x69, 0x20, 0x53, 0x74, 0x61,
-0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x54, 0x61, 0x73, 0x6d, 0x61, 0x6e, 0x69, 0x61, 0x20,
-0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x54, 0x6f, 0x63, 0x61, 0x6e, 0x74,
-0x69, 0x6e, 0x73, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x54, 0x6f,
-0x6b, 0x79, 0x6f, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x54, 0x6f,
-0x6d, 0x73, 0x6b, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x54, 0x6f,
-0x6e, 0x67, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x54, 0x72,
-0x61, 0x6e, 0x73, 0x62, 0x61, 0x69, 0x6b, 0x61, 0x6c, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54,
-0x69, 0x6d, 0x65, 0x0, 0x54, 0x75, 0x72, 0x6b, 0x65, 0x79, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20,
-0x54, 0x69, 0x6d, 0x65, 0x0, 0x54, 0x75, 0x72, 0x6b, 0x73, 0x20, 0x41, 0x6e, 0x64, 0x20, 0x43, 0x61, 0x69, 0x63, 0x6f,
-0x73, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x55, 0x6c, 0x61, 0x61,
-0x6e, 0x62, 0x61, 0x61, 0x74, 0x61, 0x72, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d,
-0x65, 0x0, 0x55, 0x53, 0x20, 0x45, 0x61, 0x73, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72,
-0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x55, 0x53, 0x20, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x20, 0x53,
-0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x31, 0x31, 0x0,
-0x55, 0x54, 0x43, 0x2d, 0x30, 0x39, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x30, 0x38, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x30, 0x32,
-0x0, 0x55, 0x54, 0x43, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x31, 0x32, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x31, 0x33, 0x0, 0x56,
-0x65, 0x6e, 0x65, 0x7a, 0x75, 0x65, 0x6c, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69,
-0x6d, 0x65, 0x0, 0x56, 0x6c, 0x61, 0x64, 0x69, 0x76, 0x6f, 0x73, 0x74, 0x6f, 0x6b, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64,
-0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x56, 0x6f, 0x6c, 0x67, 0x6f, 0x67, 0x72, 0x61, 0x64, 0x20, 0x53,
-0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x57, 0x2e, 0x20, 0x41, 0x75, 0x73, 0x74,
-0x72, 0x61, 0x6c, 0x69, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0,
-0x57, 0x2e, 0x20, 0x43, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x20, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x20, 0x53, 0x74,
-0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x57, 0x2e, 0x20, 0x45, 0x75, 0x72, 0x6f, 0x70,
-0x65, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x57, 0x2e, 0x20, 0x4d,
-0x6f, 0x6e, 0x67, 0x6f, 0x6c, 0x69, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d,
-0x65, 0x0, 0x57, 0x65, 0x73, 0x74, 0x20, 0x41, 0x73, 0x69, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64,
-0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x57, 0x65, 0x73, 0x74, 0x20, 0x42, 0x61, 0x6e, 0x6b, 0x20, 0x53, 0x74, 0x61, 0x6e,
-0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x57, 0x65, 0x73, 0x74, 0x20, 0x50, 0x61, 0x63, 0x69, 0x66,
-0x69, 0x63, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x59, 0x61, 0x6b,
-0x75, 0x74, 0x73, 0x6b, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x59,
-0x75, 0x6b, 0x6f, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0
+static constexpr char windowsIdData[] = {
+0x41, 0x66, 0x67, 0x68, 0x61, 0x6e, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e,
+0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x41, 0x6c, 0x61, 0x73, 0x6b, 0x61,
+0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0,
+0x41, 0x6c, 0x65, 0x75, 0x74, 0x69, 0x61, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72,
+0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x41, 0x6c, 0x74, 0x61, 0x69, 0x20, 0x53, 0x74, 0x61,
+0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x41, 0x72, 0x61, 0x62, 0x20,
+0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x41, 0x72,
+0x61, 0x62, 0x69, 0x61, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54,
+0x69, 0x6d, 0x65, 0x0, 0x41, 0x72, 0x61, 0x62, 0x69, 0x63, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64,
+0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x41, 0x72, 0x67, 0x65, 0x6e, 0x74, 0x69,
+0x6e, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65,
+0x0, 0x41, 0x73, 0x74, 0x72, 0x61, 0x6b, 0x68, 0x61, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64,
+0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69,
+0x63, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0,
+0x41, 0x55, 0x53, 0x20, 0x43, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x20, 0x53, 0x74, 0x61, 0x6e,
+0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x41, 0x75, 0x73, 0x20, 0x43, 0x65,
+0x6e, 0x74, 0x72, 0x61, 0x6c, 0x20, 0x57, 0x2e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72,
+0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x41, 0x55, 0x53, 0x20, 0x45, 0x61, 0x73, 0x74, 0x65,
+0x72, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65,
+0x0, 0x41, 0x7a, 0x65, 0x72, 0x62, 0x61, 0x69, 0x6a, 0x61, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e,
+0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x41, 0x7a, 0x6f, 0x72, 0x65, 0x73,
+0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x42,
+0x61, 0x68, 0x69, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69,
+0x6d, 0x65, 0x0, 0x42, 0x61, 0x6e, 0x67, 0x6c, 0x61, 0x64, 0x65, 0x73, 0x68, 0x20, 0x53, 0x74,
+0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x42, 0x65, 0x6c, 0x61,
+0x72, 0x75, 0x73, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d,
+0x65, 0x0, 0x42, 0x6f, 0x75, 0x67, 0x61, 0x69, 0x6e, 0x76, 0x69, 0x6c, 0x6c, 0x65, 0x20, 0x53,
+0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x43, 0x61, 0x6e,
+0x61, 0x64, 0x61, 0x20, 0x43, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x20, 0x53, 0x74, 0x61, 0x6e,
+0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x43, 0x61, 0x70, 0x65, 0x20, 0x56,
+0x65, 0x72, 0x64, 0x65, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69,
+0x6d, 0x65, 0x0, 0x43, 0x61, 0x75, 0x63, 0x61, 0x73, 0x75, 0x73, 0x20, 0x53, 0x74, 0x61, 0x6e,
+0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x43, 0x65, 0x6e, 0x2e, 0x20, 0x41,
+0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72,
+0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x43, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x20, 0x41,
+0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20,
+0x54, 0x69, 0x6d, 0x65, 0x0, 0x43, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x20, 0x41, 0x73, 0x69,
+0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0,
+0x43, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x20, 0x42, 0x72, 0x61, 0x7a, 0x69, 0x6c, 0x69, 0x61,
+0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0,
+0x43, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x20, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x20, 0x53,
+0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x43, 0x65, 0x6e,
+0x74, 0x72, 0x61, 0x6c, 0x20, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x61, 0x6e, 0x20, 0x53, 0x74,
+0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x43, 0x65, 0x6e, 0x74,
+0x72, 0x61, 0x6c, 0x20, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x20, 0x53, 0x74, 0x61, 0x6e,
+0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x43, 0x65, 0x6e, 0x74, 0x72, 0x61,
+0x6c, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0,
+0x43, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64,
+0x20, 0x54, 0x69, 0x6d, 0x65, 0x20, 0x28, 0x4d, 0x65, 0x78, 0x69, 0x63, 0x6f, 0x29, 0x0, 0x43,
+0x68, 0x61, 0x74, 0x68, 0x61, 0x6d, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x20, 0x53,
+0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x43, 0x68, 0x69,
+0x6e, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65,
+0x0, 0x43, 0x75, 0x62, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54,
+0x69, 0x6d, 0x65, 0x0, 0x44, 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x74, 0x61,
+0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x45, 0x2e, 0x20, 0x41, 0x66,
+0x72, 0x69, 0x63, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69,
+0x6d, 0x65, 0x0, 0x45, 0x2e, 0x20, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x20,
+0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x45, 0x2e,
+0x20, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64,
+0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x45, 0x2e, 0x20, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x20, 0x41,
+0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20,
+0x54, 0x69, 0x6d, 0x65, 0x0, 0x45, 0x61, 0x73, 0x74, 0x65, 0x72, 0x20, 0x49, 0x73, 0x6c, 0x61,
+0x6e, 0x64, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65,
+0x0, 0x45, 0x61, 0x73, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72,
+0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x45, 0x61, 0x73, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x53,
+0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x20, 0x28, 0x4d, 0x65,
+0x78, 0x69, 0x63, 0x6f, 0x29, 0x0, 0x45, 0x67, 0x79, 0x70, 0x74, 0x20, 0x53, 0x74, 0x61, 0x6e,
+0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x45, 0x6b, 0x61, 0x74, 0x65, 0x72,
+0x69, 0x6e, 0x62, 0x75, 0x72, 0x67, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20,
+0x54, 0x69, 0x6d, 0x65, 0x0, 0x46, 0x69, 0x6a, 0x69, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61,
+0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x46, 0x4c, 0x45, 0x20, 0x53, 0x74, 0x61, 0x6e,
+0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x47, 0x65, 0x6f, 0x72, 0x67, 0x69,
+0x61, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65,
+0x0, 0x47, 0x4d, 0x54, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69,
+0x6d, 0x65, 0x0, 0x47, 0x72, 0x65, 0x65, 0x6e, 0x6c, 0x61, 0x6e, 0x64, 0x20, 0x53, 0x74, 0x61,
+0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x47, 0x72, 0x65, 0x65, 0x6e,
+0x77, 0x69, 0x63, 0x68, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69,
+0x6d, 0x65, 0x0, 0x47, 0x54, 0x42, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20,
+0x54, 0x69, 0x6d, 0x65, 0x0, 0x48, 0x61, 0x69, 0x74, 0x69, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64,
+0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x48, 0x61, 0x77, 0x61, 0x69, 0x69, 0x61,
+0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0,
+0x49, 0x6e, 0x64, 0x69, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54,
+0x69, 0x6d, 0x65, 0x0, 0x49, 0x72, 0x61, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72,
+0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x49, 0x73, 0x72, 0x61, 0x65, 0x6c, 0x20, 0x53, 0x74,
+0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x4a, 0x6f, 0x72, 0x64,
+0x61, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65,
+0x0, 0x4b, 0x61, 0x6c, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x72, 0x61, 0x64, 0x20, 0x53, 0x74, 0x61,
+0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x4b, 0x6f, 0x72, 0x65, 0x61,
+0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x4c,
+0x69, 0x62, 0x79, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69,
+0x6d, 0x65, 0x0, 0x4c, 0x69, 0x6e, 0x65, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x20,
+0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x4c, 0x6f,
+0x72, 0x64, 0x20, 0x48, 0x6f, 0x77, 0x65, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64,
+0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x4d, 0x61, 0x67, 0x61, 0x64, 0x61, 0x6e, 0x20, 0x53, 0x74,
+0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x4d, 0x61, 0x67, 0x61,
+0x6c, 0x6c, 0x61, 0x6e, 0x65, 0x73, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20,
+0x54, 0x69, 0x6d, 0x65, 0x0, 0x4d, 0x61, 0x72, 0x71, 0x75, 0x65, 0x73, 0x61, 0x73, 0x20, 0x53,
+0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x4d, 0x61, 0x75,
+0x72, 0x69, 0x74, 0x69, 0x75, 0x73, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20,
+0x54, 0x69, 0x6d, 0x65, 0x0, 0x4d, 0x69, 0x64, 0x64, 0x6c, 0x65, 0x20, 0x45, 0x61, 0x73, 0x74,
+0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x4d,
+0x6f, 0x6e, 0x74, 0x65, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61,
+0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x4d, 0x6f, 0x72, 0x6f, 0x63, 0x63, 0x6f, 0x20,
+0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x4d, 0x6f,
+0x75, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20,
+0x54, 0x69, 0x6d, 0x65, 0x0, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x20, 0x53, 0x74,
+0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x20, 0x28, 0x4d, 0x65, 0x78,
+0x69, 0x63, 0x6f, 0x29, 0x0, 0x4d, 0x79, 0x61, 0x6e, 0x6d, 0x61, 0x72, 0x20, 0x53, 0x74, 0x61,
+0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x4e, 0x2e, 0x20, 0x43, 0x65,
+0x6e, 0x74, 0x72, 0x61, 0x6c, 0x20, 0x41, 0x73, 0x69, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64,
+0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x4e, 0x61, 0x6d, 0x69, 0x62, 0x69, 0x61,
+0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x4e,
+0x65, 0x70, 0x61, 0x6c, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69,
+0x6d, 0x65, 0x0, 0x4e, 0x65, 0x77, 0x20, 0x5a, 0x65, 0x61, 0x6c, 0x61, 0x6e, 0x64, 0x20, 0x53,
+0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x4e, 0x65, 0x77,
+0x66, 0x6f, 0x75, 0x6e, 0x64, 0x6c, 0x61, 0x6e, 0x64, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61,
+0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x4e, 0x6f, 0x72, 0x66, 0x6f, 0x6c, 0x6b, 0x20,
+0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x4e, 0x6f,
+0x72, 0x74, 0x68, 0x20, 0x41, 0x73, 0x69, 0x61, 0x20, 0x45, 0x61, 0x73, 0x74, 0x20, 0x53, 0x74,
+0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x4e, 0x6f, 0x72, 0x74,
+0x68, 0x20, 0x41, 0x73, 0x69, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20,
+0x54, 0x69, 0x6d, 0x65, 0x0, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x20, 0x4b, 0x6f, 0x72, 0x65, 0x61,
+0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x4f,
+0x6d, 0x73, 0x6b, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d,
+0x65, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x20, 0x53, 0x41, 0x20, 0x53, 0x74, 0x61,
+0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66,
+0x69, 0x63, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65,
+0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72,
+0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x20, 0x28, 0x4d, 0x65, 0x78, 0x69, 0x63, 0x6f, 0x29, 0x0,
+0x50, 0x61, 0x6b, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72,
+0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x50, 0x61, 0x72, 0x61, 0x67, 0x75, 0x61, 0x79, 0x20,
+0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x51, 0x79,
+0x7a, 0x79, 0x6c, 0x6f, 0x72, 0x64, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64,
+0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x52, 0x6f, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x53, 0x74,
+0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x52, 0x75, 0x73, 0x73,
+0x69, 0x61, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x20, 0x5a, 0x6f, 0x6e, 0x65, 0x20, 0x31, 0x30, 0x0,
+0x52, 0x75, 0x73, 0x73, 0x69, 0x61, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x20, 0x5a, 0x6f, 0x6e, 0x65,
+0x20, 0x31, 0x31, 0x0, 0x52, 0x75, 0x73, 0x73, 0x69, 0x61, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x20,
+0x5a, 0x6f, 0x6e, 0x65, 0x20, 0x33, 0x0, 0x52, 0x75, 0x73, 0x73, 0x69, 0x61, 0x6e, 0x20, 0x53,
+0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x53, 0x41, 0x20,
+0x45, 0x61, 0x73, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64,
+0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x53, 0x41, 0x20, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63,
+0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x53,
+0x41, 0x20, 0x57, 0x65, 0x73, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61,
+0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x53, 0x61, 0x69, 0x6e, 0x74, 0x20, 0x50, 0x69,
+0x65, 0x72, 0x72, 0x65, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69,
+0x6d, 0x65, 0x0, 0x53, 0x61, 0x6b, 0x68, 0x61, 0x6c, 0x69, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e,
+0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x53, 0x61, 0x6d, 0x6f, 0x61, 0x20,
+0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x53, 0x61,
+0x6f, 0x20, 0x54, 0x6f, 0x6d, 0x65, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20,
+0x54, 0x69, 0x6d, 0x65, 0x0, 0x53, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x76, 0x20, 0x53, 0x74, 0x61,
+0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x53, 0x45, 0x20, 0x41, 0x73,
+0x69, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65,
+0x0, 0x53, 0x69, 0x6e, 0x67, 0x61, 0x70, 0x6f, 0x72, 0x65, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64,
+0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x20, 0x41,
+0x66, 0x72, 0x69, 0x63, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54,
+0x69, 0x6d, 0x65, 0x0, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x20, 0x53, 0x75, 0x64, 0x61, 0x6e, 0x20,
+0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x53, 0x72,
+0x69, 0x20, 0x4c, 0x61, 0x6e, 0x6b, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64,
+0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x53, 0x75, 0x64, 0x61, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e,
+0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x53, 0x79, 0x72, 0x69, 0x61, 0x20,
+0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x54, 0x61,
+0x69, 0x70, 0x65, 0x69, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69,
+0x6d, 0x65, 0x0, 0x54, 0x61, 0x73, 0x6d, 0x61, 0x6e, 0x69, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e,
+0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x54, 0x6f, 0x63, 0x61, 0x6e, 0x74,
+0x69, 0x6e, 0x73, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d,
+0x65, 0x0, 0x54, 0x6f, 0x6b, 0x79, 0x6f, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64,
+0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x54, 0x6f, 0x6d, 0x73, 0x6b, 0x20, 0x53, 0x74, 0x61, 0x6e,
+0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x54, 0x6f, 0x6e, 0x67, 0x61, 0x20,
+0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x54, 0x72,
+0x61, 0x6e, 0x73, 0x62, 0x61, 0x69, 0x6b, 0x61, 0x6c, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61,
+0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x54, 0x75, 0x72, 0x6b, 0x65, 0x79, 0x20, 0x53,
+0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x54, 0x75, 0x72,
+0x6b, 0x73, 0x20, 0x41, 0x6e, 0x64, 0x20, 0x43, 0x61, 0x69, 0x63, 0x6f, 0x73, 0x20, 0x53, 0x74,
+0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x55, 0x6c, 0x61, 0x61,
+0x6e, 0x62, 0x61, 0x61, 0x74, 0x61, 0x72, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64,
+0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x55, 0x53, 0x20, 0x45, 0x61, 0x73, 0x74, 0x65, 0x72, 0x6e,
+0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x55,
+0x53, 0x20, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64,
+0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x55, 0x54, 0x43, 0x0, 0x55, 0x54, 0x43,
+0x2b, 0x31, 0x32, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x31, 0x33, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x30,
+0x32, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x30, 0x38, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x30, 0x39, 0x0,
+0x55, 0x54, 0x43, 0x2d, 0x31, 0x31, 0x0, 0x56, 0x65, 0x6e, 0x65, 0x7a, 0x75, 0x65, 0x6c, 0x61,
+0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x56,
+0x6c, 0x61, 0x64, 0x69, 0x76, 0x6f, 0x73, 0x74, 0x6f, 0x6b, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64,
+0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x56, 0x6f, 0x6c, 0x67, 0x6f, 0x67, 0x72,
+0x61, 0x64, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65,
+0x0, 0x57, 0x2e, 0x20, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x20, 0x53, 0x74,
+0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x57, 0x2e, 0x20, 0x43,
+0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x20, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x20, 0x53, 0x74,
+0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x57, 0x2e, 0x20, 0x45,
+0x75, 0x72, 0x6f, 0x70, 0x65, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54,
+0x69, 0x6d, 0x65, 0x0, 0x57, 0x2e, 0x20, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x6c, 0x69, 0x61, 0x20,
+0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x57, 0x65,
+0x73, 0x74, 0x20, 0x41, 0x73, 0x69, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64,
+0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x57, 0x65, 0x73, 0x74, 0x20, 0x42, 0x61, 0x6e, 0x6b, 0x20,
+0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x57, 0x65,
+0x73, 0x74, 0x20, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64,
+0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x59, 0x61, 0x6b, 0x75, 0x74, 0x73, 0x6b,
+0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x59,
+0x75, 0x6b, 0x6f, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69,
+0x6d, 0x65, 0x0
};
-static const char ianaIdData[] = {
-0x41, 0x73, 0x69, 0x61, 0x2f, 0x4b, 0x61, 0x62, 0x75, 0x6c, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41,
-0x6e, 0x63, 0x68, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4a, 0x75, 0x6e,
-0x65, 0x61, 0x75, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x65, 0x74, 0x6c, 0x61, 0x6b, 0x61, 0x74,
-0x6c, 0x61, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4e, 0x6f, 0x6d, 0x65, 0x20, 0x41, 0x6d, 0x65, 0x72,
-0x69, 0x63, 0x61, 0x2f, 0x53, 0x69, 0x74, 0x6b, 0x61, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x59, 0x61,
-0x6b, 0x75, 0x74, 0x61, 0x74, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x64, 0x61, 0x6b, 0x0, 0x41,
-0x73, 0x69, 0x61, 0x2f, 0x42, 0x61, 0x72, 0x6e, 0x61, 0x75, 0x6c, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x42, 0x61, 0x68,
-0x72, 0x61, 0x69, 0x6e, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4b, 0x75, 0x77, 0x61, 0x69, 0x74, 0x0, 0x41, 0x73, 0x69,
-0x61, 0x2f, 0x51, 0x61, 0x74, 0x61, 0x72, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x52, 0x69, 0x79, 0x61, 0x64, 0x68, 0x0,
-0x41, 0x73, 0x69, 0x61, 0x2f, 0x41, 0x64, 0x65, 0x6e, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x34, 0x0,
-0x41, 0x73, 0x69, 0x61, 0x2f, 0x4d, 0x75, 0x73, 0x63, 0x61, 0x74, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x44, 0x75, 0x62,
-0x61, 0x69, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x42, 0x61, 0x67, 0x68, 0x64, 0x61, 0x64, 0x0, 0x41, 0x6d, 0x65, 0x72,
-0x69, 0x63, 0x61, 0x2f, 0x42, 0x75, 0x65, 0x6e, 0x6f, 0x73, 0x5f, 0x41, 0x69, 0x72, 0x65, 0x73, 0x20, 0x41, 0x6d, 0x65,
-0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x72, 0x67, 0x65, 0x6e, 0x74, 0x69, 0x6e, 0x61, 0x2f, 0x4c, 0x61, 0x5f, 0x52, 0x69,
-0x6f, 0x6a, 0x61, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x72, 0x67, 0x65, 0x6e, 0x74, 0x69, 0x6e,
-0x61, 0x2f, 0x52, 0x69, 0x6f, 0x5f, 0x47, 0x61, 0x6c, 0x6c, 0x65, 0x67, 0x6f, 0x73, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69,
-0x63, 0x61, 0x2f, 0x41, 0x72, 0x67, 0x65, 0x6e, 0x74, 0x69, 0x6e, 0x61, 0x2f, 0x53, 0x61, 0x6c, 0x74, 0x61, 0x20, 0x41,
-0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x72, 0x67, 0x65, 0x6e, 0x74, 0x69, 0x6e, 0x61, 0x2f, 0x53, 0x61, 0x6e,
-0x5f, 0x4a, 0x75, 0x61, 0x6e, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x72, 0x67, 0x65, 0x6e, 0x74,
-0x69, 0x6e, 0x61, 0x2f, 0x53, 0x61, 0x6e, 0x5f, 0x4c, 0x75, 0x69, 0x73, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61,
-0x2f, 0x41, 0x72, 0x67, 0x65, 0x6e, 0x74, 0x69, 0x6e, 0x61, 0x2f, 0x54, 0x75, 0x63, 0x75, 0x6d, 0x61, 0x6e, 0x20, 0x41,
-0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x72, 0x67, 0x65, 0x6e, 0x74, 0x69, 0x6e, 0x61, 0x2f, 0x55, 0x73, 0x68,
-0x75, 0x61, 0x69, 0x61, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x61, 0x74, 0x61, 0x6d, 0x61, 0x72,
-0x63, 0x61, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x6f, 0x72, 0x64, 0x6f, 0x62, 0x61, 0x20, 0x41,
-0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4a, 0x75, 0x6a, 0x75, 0x79, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61,
-0x2f, 0x4d, 0x65, 0x6e, 0x64, 0x6f, 0x7a, 0x61, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x41, 0x73, 0x74, 0x72,
-0x61, 0x6b, 0x68, 0x61, 0x6e, 0x20, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x55, 0x6c, 0x79, 0x61, 0x6e, 0x6f, 0x76,
-0x73, 0x6b, 0x0, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x2f, 0x42, 0x65, 0x72, 0x6d, 0x75, 0x64, 0x61, 0x0,
-0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x48, 0x61, 0x6c, 0x69, 0x66, 0x61, 0x78, 0x20, 0x41, 0x6d, 0x65, 0x72,
-0x69, 0x63, 0x61, 0x2f, 0x47, 0x6c, 0x61, 0x63, 0x65, 0x5f, 0x42, 0x61, 0x79, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63,
-0x61, 0x2f, 0x47, 0x6f, 0x6f, 0x73, 0x65, 0x5f, 0x42, 0x61, 0x79, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f,
-0x4d, 0x6f, 0x6e, 0x63, 0x74, 0x6f, 0x6e, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x54, 0x68, 0x75, 0x6c,
-0x65, 0x0, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x2f, 0x44, 0x61, 0x72, 0x77, 0x69, 0x6e, 0x0, 0x41,
-0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x2f, 0x45, 0x75, 0x63, 0x6c, 0x61, 0x0, 0x41, 0x75, 0x73, 0x74, 0x72,
-0x61, 0x6c, 0x69, 0x61, 0x2f, 0x53, 0x79, 0x64, 0x6e, 0x65, 0x79, 0x20, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69,
-0x61, 0x2f, 0x4d, 0x65, 0x6c, 0x62, 0x6f, 0x75, 0x72, 0x6e, 0x65, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x42, 0x61, 0x6b,
-0x75, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x62, 0x79, 0x73, 0x75,
-0x6e, 0x64, 0x0, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x2f, 0x41, 0x7a, 0x6f, 0x72, 0x65, 0x73, 0x0, 0x41,
-0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x61, 0x68, 0x69, 0x61, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x44, 0x68,
-0x61, 0x6b, 0x61, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x54, 0x68, 0x69, 0x6d, 0x70, 0x68, 0x75, 0x0, 0x45, 0x75, 0x72,
-0x6f, 0x70, 0x65, 0x2f, 0x4d, 0x69, 0x6e, 0x73, 0x6b, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x42, 0x6f,
-0x75, 0x67, 0x61, 0x69, 0x6e, 0x76, 0x69, 0x6c, 0x6c, 0x65, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x52,
-0x65, 0x67, 0x69, 0x6e, 0x61, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x77, 0x69, 0x66, 0x74, 0x5f,
-0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b, 0x31, 0x0, 0x41, 0x74,
-0x6c, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x2f, 0x43, 0x61, 0x70, 0x65, 0x5f, 0x56, 0x65, 0x72, 0x64, 0x65, 0x0, 0x41, 0x73,
-0x69, 0x61, 0x2f, 0x59, 0x65, 0x72, 0x65, 0x76, 0x61, 0x6e, 0x0, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61,
-0x2f, 0x41, 0x64, 0x65, 0x6c, 0x61, 0x69, 0x64, 0x65, 0x20, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x2f,
-0x42, 0x72, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x48, 0x69, 0x6c, 0x6c, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b,
-0x36, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x65, 0x6c, 0x69, 0x7a, 0x65, 0x0, 0x41, 0x6d, 0x65,
-0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x6f, 0x73, 0x74, 0x61, 0x5f, 0x52, 0x69, 0x63, 0x61, 0x0, 0x50, 0x61, 0x63, 0x69,
-0x66, 0x69, 0x63, 0x2f, 0x47, 0x61, 0x6c, 0x61, 0x70, 0x61, 0x67, 0x6f, 0x73, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63,
-0x61, 0x2f, 0x45, 0x6c, 0x5f, 0x53, 0x61, 0x6c, 0x76, 0x61, 0x64, 0x6f, 0x72, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63,
-0x61, 0x2f, 0x47, 0x75, 0x61, 0x74, 0x65, 0x6d, 0x61, 0x6c, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f,
-0x54, 0x65, 0x67, 0x75, 0x63, 0x69, 0x67, 0x61, 0x6c, 0x70, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f,
-0x4d, 0x61, 0x6e, 0x61, 0x67, 0x75, 0x61, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x36, 0x0, 0x41, 0x6e,
-0x74, 0x61, 0x72, 0x63, 0x74, 0x69, 0x63, 0x61, 0x2f, 0x56, 0x6f, 0x73, 0x74, 0x6f, 0x6b, 0x0, 0x49, 0x6e, 0x64, 0x69,
-0x61, 0x6e, 0x2f, 0x43, 0x68, 0x61, 0x67, 0x6f, 0x73, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x55, 0x72, 0x75, 0x6d, 0x71,
-0x69, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x41, 0x6c, 0x6d, 0x61, 0x74, 0x79, 0x20, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x51,
-0x6f, 0x73, 0x74, 0x61, 0x6e, 0x61, 0x79, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x42, 0x69, 0x73, 0x68, 0x6b, 0x65, 0x6b,
-0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x75, 0x69, 0x61, 0x62, 0x61, 0x20, 0x41, 0x6d, 0x65, 0x72,
-0x69, 0x63, 0x61, 0x2f, 0x43, 0x61, 0x6d, 0x70, 0x6f, 0x5f, 0x47, 0x72, 0x61, 0x6e, 0x64, 0x65, 0x0, 0x45, 0x75, 0x72,
-0x6f, 0x70, 0x65, 0x2f, 0x54, 0x69, 0x72, 0x61, 0x6e, 0x65, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x50, 0x72,
-0x61, 0x67, 0x75, 0x65, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x42, 0x75, 0x64, 0x61, 0x70, 0x65, 0x73, 0x74,
-0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x50, 0x6f, 0x64, 0x67, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x0, 0x45, 0x75,
-0x72, 0x6f, 0x70, 0x65, 0x2f, 0x42, 0x65, 0x6c, 0x67, 0x72, 0x61, 0x64, 0x65, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65,
-0x2f, 0x42, 0x72, 0x61, 0x74, 0x69, 0x73, 0x6c, 0x61, 0x76, 0x61, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4c,
-0x6a, 0x75, 0x62, 0x6c, 0x6a, 0x61, 0x6e, 0x61, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x53, 0x61, 0x72, 0x61,
-0x6a, 0x65, 0x76, 0x6f, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x5a, 0x61, 0x67, 0x72, 0x65, 0x62, 0x0, 0x45,
-0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x53, 0x6b, 0x6f, 0x70, 0x6a, 0x65, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f,
-0x57, 0x61, 0x72, 0x73, 0x61, 0x77, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x31, 0x31, 0x0, 0x41, 0x6e,
-0x74, 0x61, 0x72, 0x63, 0x74, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x61, 0x73, 0x65, 0x79, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66,
-0x69, 0x63, 0x2f, 0x50, 0x6f, 0x6e, 0x61, 0x70, 0x65, 0x20, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x4b, 0x6f,
-0x73, 0x72, 0x61, 0x65, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x4e, 0x6f, 0x75, 0x6d, 0x65, 0x61, 0x0,
-0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x47, 0x75, 0x61, 0x64, 0x61, 0x6c, 0x63, 0x61, 0x6e, 0x61, 0x6c, 0x0,
-0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x45, 0x66, 0x61, 0x74, 0x65, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63,
-0x61, 0x2f, 0x4d, 0x65, 0x78, 0x69, 0x63, 0x6f, 0x5f, 0x43, 0x69, 0x74, 0x79, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63,
-0x61, 0x2f, 0x42, 0x61, 0x68, 0x69, 0x61, 0x5f, 0x42, 0x61, 0x6e, 0x64, 0x65, 0x72, 0x61, 0x73, 0x20, 0x41, 0x6d, 0x65,
-0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x65, 0x72, 0x69, 0x64, 0x61, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f,
-0x4d, 0x6f, 0x6e, 0x74, 0x65, 0x72, 0x72, 0x65, 0x79, 0x0, 0x43, 0x53, 0x54, 0x36, 0x43, 0x44, 0x54, 0x0, 0x41, 0x6d,
-0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x57, 0x69, 0x6e, 0x6e, 0x69, 0x70, 0x65, 0x67, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69,
-0x63, 0x61, 0x2f, 0x52, 0x61, 0x69, 0x6e, 0x79, 0x5f, 0x52, 0x69, 0x76, 0x65, 0x72, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69,
-0x63, 0x61, 0x2f, 0x52, 0x61, 0x6e, 0x6b, 0x69, 0x6e, 0x5f, 0x49, 0x6e, 0x6c, 0x65, 0x74, 0x20, 0x41, 0x6d, 0x65, 0x72,
-0x69, 0x63, 0x61, 0x2f, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61,
-0x2f, 0x4d, 0x61, 0x74, 0x61, 0x6d, 0x6f, 0x72, 0x6f, 0x73, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43,
-0x68, 0x69, 0x63, 0x61, 0x67, 0x6f, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x49, 0x6e, 0x64, 0x69, 0x61,
-0x6e, 0x61, 0x2f, 0x4b, 0x6e, 0x6f, 0x78, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x49, 0x6e, 0x64, 0x69,
-0x61, 0x6e, 0x61, 0x2f, 0x54, 0x65, 0x6c, 0x6c, 0x5f, 0x43, 0x69, 0x74, 0x79, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63,
-0x61, 0x2f, 0x4d, 0x65, 0x6e, 0x6f, 0x6d, 0x69, 0x6e, 0x65, 0x65, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f,
-0x4e, 0x6f, 0x72, 0x74, 0x68, 0x5f, 0x44, 0x61, 0x6b, 0x6f, 0x74, 0x61, 0x2f, 0x42, 0x65, 0x75, 0x6c, 0x61, 0x68, 0x20,
-0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x5f, 0x44, 0x61, 0x6b, 0x6f, 0x74, 0x61,
-0x2f, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4e, 0x6f, 0x72, 0x74,
-0x68, 0x5f, 0x44, 0x61, 0x6b, 0x6f, 0x74, 0x61, 0x2f, 0x4e, 0x65, 0x77, 0x5f, 0x53, 0x61, 0x6c, 0x65, 0x6d, 0x0, 0x41,
-0x73, 0x69, 0x61, 0x2f, 0x53, 0x68, 0x61, 0x6e, 0x67, 0x68, 0x61, 0x69, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x48, 0x6f,
-0x6e, 0x67, 0x5f, 0x4b, 0x6f, 0x6e, 0x67, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4d, 0x61, 0x63, 0x61, 0x75, 0x0, 0x50,
-0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x43, 0x68, 0x61, 0x74, 0x68, 0x61, 0x6d, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69,
-0x63, 0x61, 0x2f, 0x48, 0x61, 0x76, 0x61, 0x6e, 0x61, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b, 0x31, 0x32,
-0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x33, 0x0, 0x41, 0x6e, 0x74, 0x61, 0x72, 0x63, 0x74, 0x69, 0x63,
-0x61, 0x2f, 0x53, 0x79, 0x6f, 0x77, 0x61, 0x0, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x2f, 0x43, 0x6f, 0x6d, 0x6f, 0x72,
-0x6f, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x6a, 0x69, 0x62, 0x6f, 0x75, 0x74, 0x69, 0x0, 0x41, 0x66,
-0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x73, 0x6d, 0x65, 0x72, 0x61, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41,
-0x64, 0x64, 0x69, 0x73, 0x5f, 0x41, 0x62, 0x61, 0x62, 0x61, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4e, 0x61,
-0x69, 0x72, 0x6f, 0x62, 0x69, 0x0, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x2f, 0x41, 0x6e, 0x74, 0x61, 0x6e, 0x61, 0x6e,
-0x61, 0x72, 0x69, 0x76, 0x6f, 0x0, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x2f, 0x4d, 0x61, 0x79, 0x6f, 0x74, 0x74, 0x65,
-0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x6f, 0x67, 0x61, 0x64, 0x69, 0x73, 0x68, 0x75, 0x0, 0x41, 0x66,
-0x72, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x61, 0x72, 0x5f, 0x65, 0x73, 0x5f, 0x53, 0x61, 0x6c, 0x61, 0x61, 0x6d, 0x0, 0x41,
-0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4b, 0x61, 0x6d, 0x70, 0x61, 0x6c, 0x61, 0x0, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61,
-0x6c, 0x69, 0x61, 0x2f, 0x42, 0x72, 0x69, 0x73, 0x62, 0x61, 0x6e, 0x65, 0x20, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c,
-0x69, 0x61, 0x2f, 0x4c, 0x69, 0x6e, 0x64, 0x65, 0x6d, 0x61, 0x6e, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x43,
-0x68, 0x69, 0x73, 0x69, 0x6e, 0x61, 0x75, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x61, 0x6f, 0x5f,
-0x50, 0x61, 0x75, 0x6c, 0x6f, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x45, 0x61, 0x73, 0x74, 0x65, 0x72,
-0x0, 0x45, 0x53, 0x54, 0x35, 0x45, 0x44, 0x54, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4e, 0x61, 0x73,
-0x73, 0x61, 0x75, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x54, 0x6f, 0x72, 0x6f, 0x6e, 0x74, 0x6f, 0x20,
-0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x49, 0x71, 0x61, 0x6c, 0x75, 0x69, 0x74, 0x20, 0x41, 0x6d, 0x65, 0x72,
-0x69, 0x63, 0x61, 0x2f, 0x4d, 0x6f, 0x6e, 0x74, 0x72, 0x65, 0x61, 0x6c, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61,
-0x2f, 0x4e, 0x69, 0x70, 0x69, 0x67, 0x6f, 0x6e, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x50, 0x61, 0x6e,
-0x67, 0x6e, 0x69, 0x72, 0x74, 0x75, 0x6e, 0x67, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x54, 0x68, 0x75,
-0x6e, 0x64, 0x65, 0x72, 0x5f, 0x42, 0x61, 0x79, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4e, 0x65, 0x77,
-0x5f, 0x59, 0x6f, 0x72, 0x6b, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x65, 0x74, 0x72, 0x6f, 0x69,
-0x74, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x61, 0x2f, 0x50, 0x65,
-0x74, 0x65, 0x72, 0x73, 0x62, 0x75, 0x72, 0x67, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x49, 0x6e, 0x64,
-0x69, 0x61, 0x6e, 0x61, 0x2f, 0x56, 0x69, 0x6e, 0x63, 0x65, 0x6e, 0x6e, 0x65, 0x73, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69,
-0x63, 0x61, 0x2f, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x61, 0x2f, 0x57, 0x69, 0x6e, 0x61, 0x6d, 0x61, 0x63, 0x20, 0x41,
-0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4b, 0x65, 0x6e, 0x74, 0x75, 0x63, 0x6b, 0x79, 0x2f, 0x4d, 0x6f, 0x6e, 0x74,
-0x69, 0x63, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x6f, 0x75, 0x69, 0x73,
-0x76, 0x69, 0x6c, 0x6c, 0x65, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x61, 0x6e, 0x63, 0x75, 0x6e,
-0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x61, 0x69, 0x72, 0x6f, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x59,
-0x65, 0x6b, 0x61, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x62, 0x75, 0x72, 0x67, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63,
-0x2f, 0x46, 0x69, 0x6a, 0x69, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4d, 0x61, 0x72, 0x69, 0x65, 0x68, 0x61,
-0x6d, 0x6e, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x53, 0x6f, 0x66, 0x69, 0x61, 0x0, 0x45, 0x75, 0x72, 0x6f,
-0x70, 0x65, 0x2f, 0x54, 0x61, 0x6c, 0x6c, 0x69, 0x6e, 0x6e, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x48, 0x65,
-0x6c, 0x73, 0x69, 0x6e, 0x6b, 0x69, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x52, 0x69, 0x67, 0x61, 0x0, 0x45,
-0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x56, 0x69, 0x6c, 0x6e, 0x69, 0x75, 0x73, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65,
-0x2f, 0x4b, 0x69, 0x65, 0x76, 0x20, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x55, 0x7a, 0x68, 0x67, 0x6f, 0x72, 0x6f,
-0x64, 0x20, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x5a, 0x61, 0x70, 0x6f, 0x72, 0x6f, 0x7a, 0x68, 0x79, 0x65, 0x0,
-0x41, 0x73, 0x69, 0x61, 0x2f, 0x54, 0x62, 0x69, 0x6c, 0x69, 0x73, 0x69, 0x0, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69,
-0x63, 0x2f, 0x46, 0x61, 0x65, 0x72, 0x6f, 0x65, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x47, 0x75, 0x65, 0x72,
-0x6e, 0x73, 0x65, 0x79, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x44, 0x75, 0x62, 0x6c, 0x69, 0x6e, 0x0, 0x45,
-0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x49, 0x73, 0x6c, 0x65, 0x5f, 0x6f, 0x66, 0x5f, 0x4d, 0x61, 0x6e, 0x0, 0x45, 0x75,
-0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4a, 0x65, 0x72, 0x73, 0x65, 0x79, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4c,
-0x69, 0x73, 0x62, 0x6f, 0x6e, 0x20, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x2f, 0x4d, 0x61, 0x64, 0x65, 0x69,
-0x72, 0x61, 0x0, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x2f, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x79, 0x0, 0x45,
-0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4c, 0x6f, 0x6e, 0x64, 0x6f, 0x6e, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61,
-0x2f, 0x47, 0x6f, 0x64, 0x74, 0x68, 0x61, 0x62, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4f, 0x75, 0x61, 0x67,
-0x61, 0x64, 0x6f, 0x75, 0x67, 0x6f, 0x75, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x61, 0x6e, 0x6a, 0x75,
-0x6c, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x63, 0x63, 0x72, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69,
-0x63, 0x61, 0x2f, 0x44, 0x61, 0x6e, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x68, 0x61, 0x76, 0x6e, 0x0, 0x41, 0x66, 0x72, 0x69,
-0x63, 0x61, 0x2f, 0x42, 0x69, 0x73, 0x73, 0x61, 0x75, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x6f, 0x6e,
-0x61, 0x6b, 0x72, 0x79, 0x0, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x2f, 0x52, 0x65, 0x79, 0x6b, 0x6a, 0x61,
-0x76, 0x69, 0x6b, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x62, 0x69, 0x64, 0x6a, 0x61, 0x6e, 0x0, 0x41,
-0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x6f, 0x6e, 0x72, 0x6f, 0x76, 0x69, 0x61, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63,
-0x61, 0x2f, 0x42, 0x61, 0x6d, 0x61, 0x6b, 0x6f, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4e, 0x6f, 0x75, 0x61,
-0x6b, 0x63, 0x68, 0x6f, 0x74, 0x74, 0x0, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x2f, 0x53, 0x74, 0x5f, 0x48,
-0x65, 0x6c, 0x65, 0x6e, 0x61, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x61, 0x6b, 0x61, 0x72, 0x0, 0x41,
-0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x46, 0x72, 0x65, 0x65, 0x74, 0x6f, 0x77, 0x6e, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63,
-0x61, 0x2f, 0x4c, 0x6f, 0x6d, 0x65, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4e, 0x69, 0x63, 0x6f, 0x73, 0x69, 0x61, 0x20,
-0x41, 0x73, 0x69, 0x61, 0x2f, 0x46, 0x61, 0x6d, 0x61, 0x67, 0x75, 0x73, 0x74, 0x61, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70,
-0x65, 0x2f, 0x41, 0x74, 0x68, 0x65, 0x6e, 0x73, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x42, 0x75, 0x63, 0x68,
-0x61, 0x72, 0x65, 0x73, 0x74, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x50, 0x6f, 0x72, 0x74, 0x2d, 0x61,
-0x75, 0x2d, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x65, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b, 0x31, 0x30, 0x0,
-0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x52, 0x61, 0x72, 0x6f, 0x74, 0x6f, 0x6e, 0x67, 0x61, 0x0, 0x50, 0x61,
-0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x54, 0x61, 0x68, 0x69, 0x74, 0x69, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63,
-0x2f, 0x4a, 0x6f, 0x68, 0x6e, 0x73, 0x74, 0x6f, 0x6e, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x48, 0x6f,
-0x6e, 0x6f, 0x6c, 0x75, 0x6c, 0x75, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x43, 0x61, 0x6c, 0x63, 0x75, 0x74, 0x74, 0x61,
-0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x54, 0x65, 0x68, 0x72, 0x61, 0x6e, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4a, 0x65,
-0x72, 0x75, 0x73, 0x61, 0x6c, 0x65, 0x6d, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x41, 0x6d, 0x6d, 0x61, 0x6e, 0x0, 0x45,
-0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4b, 0x61, 0x6c, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x72, 0x61, 0x64, 0x0, 0x41, 0x73,
-0x69, 0x61, 0x2f, 0x53, 0x65, 0x6f, 0x75, 0x6c, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x54, 0x72, 0x69, 0x70,
-0x6f, 0x6c, 0x69, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x31, 0x34, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66,
-0x69, 0x63, 0x2f, 0x4b, 0x69, 0x72, 0x69, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x69, 0x0, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61,
-0x6c, 0x69, 0x61, 0x2f, 0x4c, 0x6f, 0x72, 0x64, 0x5f, 0x48, 0x6f, 0x77, 0x65, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4d,
-0x61, 0x67, 0x61, 0x64, 0x61, 0x6e, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x50, 0x75, 0x6e, 0x74, 0x61,
-0x5f, 0x41, 0x72, 0x65, 0x6e, 0x61, 0x73, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x4d, 0x61, 0x72, 0x71,
-0x75, 0x65, 0x73, 0x61, 0x73, 0x0, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x2f, 0x4d, 0x61, 0x75, 0x72, 0x69, 0x74, 0x69,
-0x75, 0x73, 0x0, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x2f, 0x52, 0x65, 0x75, 0x6e, 0x69, 0x6f, 0x6e, 0x0, 0x49, 0x6e,
-0x64, 0x69, 0x61, 0x6e, 0x2f, 0x4d, 0x61, 0x68, 0x65, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x42, 0x65, 0x69, 0x72, 0x75,
-0x74, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x6f, 0x6e, 0x74, 0x65, 0x76, 0x69, 0x64, 0x65, 0x6f,
-0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x61, 0x73, 0x61, 0x62, 0x6c, 0x61, 0x6e, 0x63, 0x61, 0x0, 0x41,
-0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x45, 0x6c, 0x5f, 0x41, 0x61, 0x69, 0x75, 0x6e, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69,
-0x63, 0x61, 0x2f, 0x43, 0x68, 0x69, 0x68, 0x75, 0x61, 0x68, 0x75, 0x61, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61,
-0x2f, 0x4d, 0x61, 0x7a, 0x61, 0x74, 0x6c, 0x61, 0x6e, 0x0, 0x4d, 0x53, 0x54, 0x37, 0x4d, 0x44, 0x54, 0x0, 0x41, 0x6d,
-0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x45, 0x64, 0x6d, 0x6f, 0x6e, 0x74, 0x6f, 0x6e, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69,
-0x63, 0x61, 0x2f, 0x43, 0x61, 0x6d, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x5f, 0x42, 0x61, 0x79, 0x20, 0x41, 0x6d, 0x65,
-0x72, 0x69, 0x63, 0x61, 0x2f, 0x49, 0x6e, 0x75, 0x76, 0x69, 0x6b, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f,
-0x59, 0x65, 0x6c, 0x6c, 0x6f, 0x77, 0x6b, 0x6e, 0x69, 0x66, 0x65, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f,
-0x4f, 0x6a, 0x69, 0x6e, 0x61, 0x67, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x65, 0x6e, 0x76,
-0x65, 0x72, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x6f, 0x69, 0x73, 0x65, 0x0, 0x49, 0x6e, 0x64,
-0x69, 0x61, 0x6e, 0x2f, 0x43, 0x6f, 0x63, 0x6f, 0x73, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x52, 0x61, 0x6e, 0x67, 0x6f,
-0x6f, 0x6e, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4e, 0x6f, 0x76, 0x6f, 0x73, 0x69, 0x62, 0x69, 0x72, 0x73, 0x6b, 0x0,
-0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x57, 0x69, 0x6e, 0x64, 0x68, 0x6f, 0x65, 0x6b, 0x0, 0x41, 0x73, 0x69, 0x61,
-0x2f, 0x4b, 0x61, 0x74, 0x6d, 0x61, 0x6e, 0x64, 0x75, 0x0, 0x41, 0x6e, 0x74, 0x61, 0x72, 0x63, 0x74, 0x69, 0x63, 0x61,
-0x2f, 0x4d, 0x63, 0x4d, 0x75, 0x72, 0x64, 0x6f, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x41, 0x75, 0x63,
-0x6b, 0x6c, 0x61, 0x6e, 0x64, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x74, 0x5f, 0x4a, 0x6f, 0x68,
-0x6e, 0x73, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x4e, 0x6f, 0x72, 0x66, 0x6f, 0x6c, 0x6b, 0x0, 0x41,
-0x73, 0x69, 0x61, 0x2f, 0x49, 0x72, 0x6b, 0x75, 0x74, 0x73, 0x6b, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4b, 0x72, 0x61,
-0x73, 0x6e, 0x6f, 0x79, 0x61, 0x72, 0x73, 0x6b, 0x20, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4e, 0x6f, 0x76, 0x6f, 0x6b, 0x75,
-0x7a, 0x6e, 0x65, 0x74, 0x73, 0x6b, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x50, 0x79, 0x6f, 0x6e, 0x67, 0x79, 0x61, 0x6e,
-0x67, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4f, 0x6d, 0x73, 0x6b, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f,
-0x53, 0x61, 0x6e, 0x74, 0x69, 0x61, 0x67, 0x6f, 0x0, 0x50, 0x53, 0x54, 0x38, 0x50, 0x44, 0x54, 0x0, 0x41, 0x6d, 0x65,
-0x72, 0x69, 0x63, 0x61, 0x2f, 0x56, 0x61, 0x6e, 0x63, 0x6f, 0x75, 0x76, 0x65, 0x72, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69,
-0x63, 0x61, 0x2f, 0x4c, 0x6f, 0x73, 0x5f, 0x41, 0x6e, 0x67, 0x65, 0x6c, 0x65, 0x73, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69,
-0x63, 0x61, 0x2f, 0x54, 0x69, 0x6a, 0x75, 0x61, 0x6e, 0x61, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53,
-0x61, 0x6e, 0x74, 0x61, 0x5f, 0x49, 0x73, 0x61, 0x62, 0x65, 0x6c, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4b, 0x61, 0x72,
-0x61, 0x63, 0x68, 0x69, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x73, 0x75, 0x6e, 0x63, 0x69, 0x6f,
-0x6e, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x51, 0x79, 0x7a, 0x79, 0x6c, 0x6f, 0x72, 0x64, 0x61, 0x0, 0x45, 0x75, 0x72,
-0x6f, 0x70, 0x65, 0x2f, 0x42, 0x72, 0x75, 0x73, 0x73, 0x65, 0x6c, 0x73, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f,
-0x43, 0x6f, 0x70, 0x65, 0x6e, 0x68, 0x61, 0x67, 0x65, 0x6e, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x50, 0x61,
-0x72, 0x69, 0x73, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4d, 0x61, 0x64, 0x72, 0x69, 0x64, 0x20, 0x41, 0x66,
-0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x65, 0x75, 0x74, 0x61, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x53, 0x61,
-0x6d, 0x61, 0x72, 0x61, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x53, 0x72, 0x65, 0x64, 0x6e, 0x65, 0x6b, 0x6f, 0x6c, 0x79,
-0x6d, 0x73, 0x6b, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4b, 0x61, 0x6d, 0x63, 0x68, 0x61, 0x74, 0x6b, 0x61, 0x20, 0x41,
-0x73, 0x69, 0x61, 0x2f, 0x41, 0x6e, 0x61, 0x64, 0x79, 0x72, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4d, 0x6f,
-0x73, 0x63, 0x6f, 0x77, 0x20, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4b, 0x69, 0x72, 0x6f, 0x76, 0x0, 0x45, 0x75,
-0x72, 0x6f, 0x70, 0x65, 0x2f, 0x53, 0x69, 0x6d, 0x66, 0x65, 0x72, 0x6f, 0x70, 0x6f, 0x6c, 0x0, 0x45, 0x74, 0x63, 0x2f,
-0x47, 0x4d, 0x54, 0x2b, 0x33, 0x0, 0x41, 0x6e, 0x74, 0x61, 0x72, 0x63, 0x74, 0x69, 0x63, 0x61, 0x2f, 0x52, 0x6f, 0x74,
-0x68, 0x65, 0x72, 0x61, 0x20, 0x41, 0x6e, 0x74, 0x61, 0x72, 0x63, 0x74, 0x69, 0x63, 0x61, 0x2f, 0x50, 0x61, 0x6c, 0x6d,
-0x65, 0x72, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x46, 0x6f, 0x72, 0x74, 0x61, 0x6c, 0x65, 0x7a, 0x61,
-0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x65, 0x6c, 0x65, 0x6d, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69,
-0x63, 0x61, 0x2f, 0x4d, 0x61, 0x63, 0x65, 0x69, 0x6f, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x52, 0x65,
-0x63, 0x69, 0x66, 0x65, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x61, 0x6e, 0x74, 0x61, 0x72, 0x65,
-0x6d, 0x0, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x2f, 0x53, 0x74, 0x61, 0x6e, 0x6c, 0x65, 0x79, 0x0, 0x41,
-0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x61, 0x79, 0x65, 0x6e, 0x6e, 0x65, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69,
-0x63, 0x61, 0x2f, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x61, 0x72, 0x69, 0x62, 0x6f, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d,
-0x54, 0x2b, 0x35, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x52, 0x69, 0x6f, 0x5f, 0x42, 0x72, 0x61, 0x6e,
-0x63, 0x6f, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x45, 0x69, 0x72, 0x75, 0x6e, 0x65, 0x70, 0x65, 0x0,
-0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x6f, 0x72, 0x61, 0x6c, 0x5f, 0x48, 0x61, 0x72, 0x62, 0x6f, 0x75,
-0x72, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x61, 0x79, 0x6d, 0x61, 0x6e, 0x0, 0x41, 0x6d, 0x65,
-0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x6f, 0x67, 0x6f, 0x74, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f,
-0x47, 0x75, 0x61, 0x79, 0x61, 0x71, 0x75, 0x69, 0x6c, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4a, 0x61,
-0x6d, 0x61, 0x69, 0x63, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x50, 0x61, 0x6e, 0x61, 0x6d, 0x61,
-0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x69, 0x6d, 0x61, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d,
-0x54, 0x2b, 0x34, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x6e, 0x67, 0x75, 0x69, 0x6c, 0x6c, 0x61,
-0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x6e, 0x74, 0x69, 0x67, 0x75, 0x61, 0x0, 0x41, 0x6d, 0x65,
-0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x72, 0x75, 0x62, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42,
-0x61, 0x72, 0x62, 0x61, 0x64, 0x6f, 0x73, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x61, 0x5f, 0x50,
-0x61, 0x7a, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x61, 0x6e, 0x61, 0x75, 0x73, 0x20, 0x41, 0x6d,
-0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x6f, 0x61, 0x5f, 0x56, 0x69, 0x73, 0x74, 0x61, 0x20, 0x41, 0x6d, 0x65, 0x72,
-0x69, 0x63, 0x61, 0x2f, 0x50, 0x6f, 0x72, 0x74, 0x6f, 0x5f, 0x56, 0x65, 0x6c, 0x68, 0x6f, 0x0, 0x41, 0x6d, 0x65, 0x72,
-0x69, 0x63, 0x61, 0x2f, 0x54, 0x6f, 0x72, 0x74, 0x6f, 0x6c, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f,
-0x42, 0x6c, 0x61, 0x6e, 0x63, 0x2d, 0x53, 0x61, 0x62, 0x6c, 0x6f, 0x6e, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61,
-0x2f, 0x4b, 0x72, 0x61, 0x6c, 0x65, 0x6e, 0x64, 0x69, 0x6a, 0x6b, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f,
-0x43, 0x75, 0x72, 0x61, 0x63, 0x61, 0x6f, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x6f, 0x6d, 0x69,
-0x6e, 0x69, 0x63, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x61, 0x6e, 0x74, 0x6f, 0x5f, 0x44,
-0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x6f, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x47, 0x72, 0x65, 0x6e, 0x61,
-0x64, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x47, 0x75, 0x61, 0x64, 0x65, 0x6c, 0x6f, 0x75, 0x70,
-0x65, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x47, 0x75, 0x79, 0x61, 0x6e, 0x61, 0x0, 0x41, 0x6d, 0x65,
-0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x61, 0x72, 0x74, 0x69, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x0, 0x41, 0x6d, 0x65, 0x72,
-0x69, 0x63, 0x61, 0x2f, 0x4d, 0x6f, 0x6e, 0x74, 0x73, 0x65, 0x72, 0x72, 0x61, 0x74, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69,
-0x63, 0x61, 0x2f, 0x50, 0x75, 0x65, 0x72, 0x74, 0x6f, 0x5f, 0x52, 0x69, 0x63, 0x6f, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69,
-0x63, 0x61, 0x2f, 0x53, 0x74, 0x5f, 0x42, 0x61, 0x72, 0x74, 0x68, 0x65, 0x6c, 0x65, 0x6d, 0x79, 0x0, 0x41, 0x6d, 0x65,
-0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x74, 0x5f, 0x4b, 0x69, 0x74, 0x74, 0x73, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63,
-0x61, 0x2f, 0x53, 0x74, 0x5f, 0x4c, 0x75, 0x63, 0x69, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d,
-0x61, 0x72, 0x69, 0x67, 0x6f, 0x74, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x74, 0x5f, 0x56, 0x69,
-0x6e, 0x63, 0x65, 0x6e, 0x74, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x6f, 0x77, 0x65, 0x72, 0x5f,
-0x50, 0x72, 0x69, 0x6e, 0x63, 0x65, 0x73, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x50, 0x6f, 0x72, 0x74,
-0x5f, 0x6f, 0x66, 0x5f, 0x53, 0x70, 0x61, 0x69, 0x6e, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x74,
-0x5f, 0x54, 0x68, 0x6f, 0x6d, 0x61, 0x73, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x69, 0x71, 0x75,
-0x65, 0x6c, 0x6f, 0x6e, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x53, 0x61, 0x6b, 0x68, 0x61, 0x6c, 0x69, 0x6e, 0x0, 0x50,
-0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x41, 0x70, 0x69, 0x61, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53,
-0x61, 0x6f, 0x5f, 0x54, 0x6f, 0x6d, 0x65, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x53, 0x61, 0x72, 0x61, 0x74,
-0x6f, 0x76, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x37, 0x0, 0x41, 0x6e, 0x74, 0x61, 0x72, 0x63, 0x74,
-0x69, 0x63, 0x61, 0x2f, 0x44, 0x61, 0x76, 0x69, 0x73, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x50, 0x68, 0x6e, 0x6f, 0x6d,
-0x5f, 0x50, 0x65, 0x6e, 0x68, 0x0, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x2f, 0x43, 0x68, 0x72, 0x69, 0x73, 0x74, 0x6d,
-0x61, 0x73, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4a, 0x61, 0x6b, 0x61, 0x72, 0x74, 0x61, 0x20, 0x41, 0x73, 0x69, 0x61,
-0x2f, 0x50, 0x6f, 0x6e, 0x74, 0x69, 0x61, 0x6e, 0x61, 0x6b, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x56, 0x69, 0x65, 0x6e,
-0x74, 0x69, 0x61, 0x6e, 0x65, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x42, 0x61, 0x6e, 0x67, 0x6b, 0x6f, 0x6b, 0x0, 0x41,
-0x73, 0x69, 0x61, 0x2f, 0x53, 0x61, 0x69, 0x67, 0x6f, 0x6e, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x38,
-0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x42, 0x72, 0x75, 0x6e, 0x65, 0x69, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4d, 0x61,
-0x6b, 0x61, 0x73, 0x73, 0x61, 0x72, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4b, 0x75, 0x61, 0x6c, 0x61, 0x5f, 0x4c, 0x75,
-0x6d, 0x70, 0x75, 0x72, 0x20, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4b, 0x75, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x0, 0x41, 0x73,
-0x69, 0x61, 0x2f, 0x4d, 0x61, 0x6e, 0x69, 0x6c, 0x61, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x53, 0x69, 0x6e, 0x67, 0x61,
-0x70, 0x6f, 0x72, 0x65, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x32, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63,
-0x61, 0x2f, 0x47, 0x61, 0x62, 0x6f, 0x72, 0x6f, 0x6e, 0x65, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x75,
-0x6a, 0x75, 0x6d, 0x62, 0x75, 0x72, 0x61, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x75, 0x62, 0x75, 0x6d,
-0x62, 0x61, 0x73, 0x68, 0x69, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x62, 0x61, 0x62, 0x61, 0x6e, 0x65,
-0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x61, 0x73, 0x65, 0x72, 0x75, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63,
-0x61, 0x2f, 0x42, 0x6c, 0x61, 0x6e, 0x74, 0x79, 0x72, 0x65, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x61,
-0x70, 0x75, 0x74, 0x6f, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4b, 0x69, 0x67, 0x61, 0x6c, 0x69, 0x0, 0x41,
-0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4a, 0x6f, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x73, 0x62, 0x75, 0x72, 0x67, 0x0, 0x41,
-0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x75, 0x73, 0x61, 0x6b, 0x61, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f,
-0x48, 0x61, 0x72, 0x61, 0x72, 0x65, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4a, 0x75, 0x62, 0x61, 0x0, 0x41,
-0x73, 0x69, 0x61, 0x2f, 0x43, 0x6f, 0x6c, 0x6f, 0x6d, 0x62, 0x6f, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4b,
-0x68, 0x61, 0x72, 0x74, 0x6f, 0x75, 0x6d, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x44, 0x61, 0x6d, 0x61, 0x73, 0x63, 0x75,
-0x73, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x54, 0x61, 0x69, 0x70, 0x65, 0x69, 0x0, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61,
-0x6c, 0x69, 0x61, 0x2f, 0x48, 0x6f, 0x62, 0x61, 0x72, 0x74, 0x20, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61,
-0x2f, 0x43, 0x75, 0x72, 0x72, 0x69, 0x65, 0x20, 0x41, 0x6e, 0x74, 0x61, 0x72, 0x63, 0x74, 0x69, 0x63, 0x61, 0x2f, 0x4d,
-0x61, 0x63, 0x71, 0x75, 0x61, 0x72, 0x69, 0x65, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x72, 0x61,
-0x67, 0x75, 0x61, 0x69, 0x6e, 0x61, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x39, 0x0, 0x41, 0x73, 0x69,
-0x61, 0x2f, 0x4a, 0x61, 0x79, 0x61, 0x70, 0x75, 0x72, 0x61, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x54, 0x6f, 0x6b, 0x79,
-0x6f, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x50, 0x61, 0x6c, 0x61, 0x75, 0x0, 0x41, 0x73, 0x69, 0x61,
-0x2f, 0x44, 0x69, 0x6c, 0x69, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x54, 0x6f, 0x6d, 0x73, 0x6b, 0x0, 0x50, 0x61, 0x63,
-0x69, 0x66, 0x69, 0x63, 0x2f, 0x54, 0x6f, 0x6e, 0x67, 0x61, 0x74, 0x61, 0x70, 0x75, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f,
-0x43, 0x68, 0x69, 0x74, 0x61, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x49, 0x73, 0x74, 0x61, 0x6e, 0x62, 0x75,
-0x6c, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x47, 0x72, 0x61, 0x6e, 0x64, 0x5f, 0x54, 0x75, 0x72, 0x6b,
-0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x55, 0x6c, 0x61, 0x61, 0x6e, 0x62, 0x61, 0x61, 0x74, 0x61, 0x72, 0x20, 0x41, 0x73,
-0x69, 0x61, 0x2f, 0x43, 0x68, 0x6f, 0x69, 0x62, 0x61, 0x6c, 0x73, 0x61, 0x6e, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63,
-0x61, 0x2f, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x61, 0x70, 0x6f, 0x6c, 0x69, 0x73, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69,
-0x63, 0x61, 0x2f, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x61, 0x2f, 0x4d, 0x61, 0x72, 0x65, 0x6e, 0x67, 0x6f, 0x20, 0x41,
-0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x61, 0x2f, 0x56, 0x65, 0x76, 0x61, 0x79,
-0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b, 0x37, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43,
-0x72, 0x65, 0x73, 0x74, 0x6f, 0x6e, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x61, 0x77, 0x73, 0x6f,
-0x6e, 0x5f, 0x43, 0x72, 0x65, 0x65, 0x6b, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x46, 0x6f, 0x72, 0x74,
-0x5f, 0x4e, 0x65, 0x6c, 0x73, 0x6f, 0x6e, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x48, 0x65, 0x72, 0x6d,
-0x6f, 0x73, 0x69, 0x6c, 0x6c, 0x6f, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x50, 0x68, 0x6f, 0x65, 0x6e,
-0x69, 0x78, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b, 0x31, 0x31, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69,
-0x63, 0x2f, 0x50, 0x61, 0x67, 0x6f, 0x5f, 0x50, 0x61, 0x67, 0x6f, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f,
-0x4e, 0x69, 0x75, 0x65, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x4d, 0x69, 0x64, 0x77, 0x61, 0x79, 0x0,
-0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b, 0x39, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x47, 0x61,
-0x6d, 0x62, 0x69, 0x65, 0x72, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b, 0x38, 0x0, 0x50, 0x61, 0x63, 0x69,
-0x66, 0x69, 0x63, 0x2f, 0x50, 0x69, 0x74, 0x63, 0x61, 0x69, 0x72, 0x6e, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54,
-0x2b, 0x32, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4e, 0x6f, 0x72, 0x6f, 0x6e, 0x68, 0x61, 0x0, 0x41,
-0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x2f, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x5f, 0x47, 0x65, 0x6f, 0x72, 0x67, 0x69,
-0x61, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x55, 0x54, 0x43, 0x20, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x0, 0x45, 0x74,
-0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x31, 0x32, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x54, 0x61, 0x72,
-0x61, 0x77, 0x61, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x4d, 0x61, 0x6a, 0x75, 0x72, 0x6f, 0x20, 0x50,
-0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x4b, 0x77, 0x61, 0x6a, 0x61, 0x6c, 0x65, 0x69, 0x6e, 0x0, 0x50, 0x61, 0x63,
-0x69, 0x66, 0x69, 0x63, 0x2f, 0x4e, 0x61, 0x75, 0x72, 0x75, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x46,
-0x75, 0x6e, 0x61, 0x66, 0x75, 0x74, 0x69, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x57, 0x61, 0x6b, 0x65,
-0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x57, 0x61, 0x6c, 0x6c, 0x69, 0x73, 0x0, 0x45, 0x74, 0x63, 0x2f,
-0x47, 0x4d, 0x54, 0x2d, 0x31, 0x33, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x45, 0x6e, 0x64, 0x65, 0x72,
-0x62, 0x75, 0x72, 0x79, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x46, 0x61, 0x6b, 0x61, 0x6f, 0x66, 0x6f,
-0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x61, 0x72, 0x61, 0x63, 0x61, 0x73, 0x0, 0x41, 0x73, 0x69,
-0x61, 0x2f, 0x56, 0x6c, 0x61, 0x64, 0x69, 0x76, 0x6f, 0x73, 0x74, 0x6f, 0x6b, 0x20, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x55,
-0x73, 0x74, 0x2d, 0x4e, 0x65, 0x72, 0x61, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x56, 0x6f, 0x6c, 0x67, 0x6f,
-0x67, 0x72, 0x61, 0x64, 0x0, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x2f, 0x50, 0x65, 0x72, 0x74, 0x68,
-0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x31, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x6c,
-0x67, 0x69, 0x65, 0x72, 0x73, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x75, 0x61, 0x6e, 0x64, 0x61, 0x0,
-0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x50, 0x6f, 0x72, 0x74, 0x6f, 0x2d, 0x4e, 0x6f, 0x76, 0x6f, 0x0, 0x41, 0x66,
-0x72, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x6f, 0x75, 0x61, 0x6c, 0x61, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42,
-0x61, 0x6e, 0x67, 0x75, 0x69, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4e, 0x64, 0x6a, 0x61, 0x6d, 0x65, 0x6e,
-0x61, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x72, 0x61, 0x7a, 0x7a, 0x61, 0x76, 0x69, 0x6c, 0x6c, 0x65,
-0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4b, 0x69, 0x6e, 0x73, 0x68, 0x61, 0x73, 0x61, 0x0, 0x41, 0x66, 0x72,
-0x69, 0x63, 0x61, 0x2f, 0x4d, 0x61, 0x6c, 0x61, 0x62, 0x6f, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x69,
-0x62, 0x72, 0x65, 0x76, 0x69, 0x6c, 0x6c, 0x65, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x61, 0x67, 0x6f,
-0x73, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4e, 0x69, 0x61, 0x6d, 0x65, 0x79, 0x0, 0x41, 0x66, 0x72, 0x69,
-0x63, 0x61, 0x2f, 0x54, 0x75, 0x6e, 0x69, 0x73, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x41, 0x6e, 0x64, 0x6f,
-0x72, 0x72, 0x61, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x56, 0x69, 0x65, 0x6e, 0x6e, 0x61, 0x0, 0x45, 0x75,
-0x72, 0x6f, 0x70, 0x65, 0x2f, 0x42, 0x65, 0x72, 0x6c, 0x69, 0x6e, 0x20, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x42,
-0x75, 0x73, 0x69, 0x6e, 0x67, 0x65, 0x6e, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x47, 0x69, 0x62, 0x72, 0x61,
-0x6c, 0x74, 0x61, 0x72, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x52, 0x6f, 0x6d, 0x65, 0x0, 0x45, 0x75, 0x72,
-0x6f, 0x70, 0x65, 0x2f, 0x56, 0x61, 0x64, 0x75, 0x7a, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4c, 0x75, 0x78,
-0x65, 0x6d, 0x62, 0x6f, 0x75, 0x72, 0x67, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4d, 0x61, 0x6c, 0x74, 0x61,
-0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4d, 0x6f, 0x6e, 0x61, 0x63, 0x6f, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70,
-0x65, 0x2f, 0x41, 0x6d, 0x73, 0x74, 0x65, 0x72, 0x64, 0x61, 0x6d, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4f,
-0x73, 0x6c, 0x6f, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x53, 0x61, 0x6e, 0x5f, 0x4d, 0x61, 0x72, 0x69, 0x6e,
-0x6f, 0x0, 0x41, 0x72, 0x63, 0x74, 0x69, 0x63, 0x2f, 0x4c, 0x6f, 0x6e, 0x67, 0x79, 0x65, 0x61, 0x72, 0x62, 0x79, 0x65,
-0x6e, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x53, 0x74, 0x6f, 0x63, 0x6b, 0x68, 0x6f, 0x6c, 0x6d, 0x0, 0x45,
-0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x5a, 0x75, 0x72, 0x69, 0x63, 0x68, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f,
-0x56, 0x61, 0x74, 0x69, 0x63, 0x61, 0x6e, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x48, 0x6f, 0x76, 0x64, 0x0, 0x45, 0x74,
-0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x35, 0x0, 0x41, 0x6e, 0x74, 0x61, 0x72, 0x63, 0x74, 0x69, 0x63, 0x61, 0x2f, 0x4d,
-0x61, 0x77, 0x73, 0x6f, 0x6e, 0x0, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x2f, 0x4b, 0x65, 0x72, 0x67, 0x75, 0x65, 0x6c,
-0x65, 0x6e, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4f, 0x72, 0x61, 0x6c, 0x20, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x41, 0x71,
-0x74, 0x61, 0x75, 0x20, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x41, 0x71, 0x74, 0x6f, 0x62, 0x65, 0x20, 0x41, 0x73, 0x69, 0x61,
-0x2f, 0x41, 0x74, 0x79, 0x72, 0x61, 0x75, 0x0, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x2f, 0x4d, 0x61, 0x6c, 0x64, 0x69,
-0x76, 0x65, 0x73, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x44, 0x75, 0x73, 0x68, 0x61, 0x6e, 0x62, 0x65, 0x0, 0x41, 0x73,
-0x69, 0x61, 0x2f, 0x41, 0x73, 0x68, 0x67, 0x61, 0x62, 0x61, 0x74, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x54, 0x61, 0x73,
-0x68, 0x6b, 0x65, 0x6e, 0x74, 0x20, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x53, 0x61, 0x6d, 0x61, 0x72, 0x6b, 0x61, 0x6e, 0x64,
-0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x48, 0x65, 0x62, 0x72, 0x6f, 0x6e, 0x20, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x47, 0x61,
-0x7a, 0x61, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x31, 0x30, 0x0, 0x41, 0x6e, 0x74, 0x61, 0x72, 0x63,
-0x74, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x75, 0x6d, 0x6f, 0x6e, 0x74, 0x44, 0x55, 0x72, 0x76, 0x69, 0x6c, 0x6c, 0x65, 0x0,
-0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x47, 0x75, 0x61, 0x6d, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63,
-0x2f, 0x54, 0x72, 0x75, 0x6b, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x53, 0x61, 0x69, 0x70, 0x61, 0x6e,
-0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x50, 0x6f, 0x72, 0x74, 0x5f, 0x4d, 0x6f, 0x72, 0x65, 0x73, 0x62,
-0x79, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x59, 0x61, 0x6b, 0x75, 0x74, 0x73, 0x6b, 0x20, 0x41, 0x73, 0x69, 0x61, 0x2f,
-0x4b, 0x68, 0x61, 0x6e, 0x64, 0x79, 0x67, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x57, 0x68, 0x69,
-0x74, 0x65, 0x68, 0x6f, 0x72, 0x73, 0x65, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x61, 0x77, 0x73,
-0x6f, 0x6e, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x61, 0x67, 0x65,
-0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x75, 0x65, 0x6e, 0x6f, 0x73, 0x5f, 0x41, 0x69, 0x72, 0x65,
-0x73, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x41, 0x73, 0x74, 0x72, 0x61, 0x6b, 0x68, 0x61, 0x6e, 0x0, 0x41,
-0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x48, 0x61, 0x6c, 0x69, 0x66, 0x61, 0x78, 0x0, 0x41, 0x75, 0x73, 0x74, 0x72,
-0x61, 0x6c, 0x69, 0x61, 0x2f, 0x53, 0x79, 0x64, 0x6e, 0x65, 0x79, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f,
-0x52, 0x65, 0x67, 0x69, 0x6e, 0x61, 0x0, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x2f, 0x41, 0x64, 0x65,
-0x6c, 0x61, 0x69, 0x64, 0x65, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x41, 0x6c, 0x6d, 0x61, 0x74, 0x79, 0x0, 0x41, 0x6d,
-0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x75, 0x69, 0x61, 0x62, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61,
-0x2f, 0x4d, 0x65, 0x78, 0x69, 0x63, 0x6f, 0x5f, 0x43, 0x69, 0x74, 0x79, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61,
-0x2f, 0x43, 0x68, 0x69, 0x63, 0x61, 0x67, 0x6f, 0x0, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x2f, 0x42,
-0x72, 0x69, 0x73, 0x62, 0x61, 0x6e, 0x65, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4e, 0x65, 0x77, 0x5f,
-0x59, 0x6f, 0x72, 0x6b, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4b, 0x69, 0x65, 0x76, 0x0, 0x41, 0x6d, 0x65,
-0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x68, 0x69, 0x68, 0x75, 0x61, 0x68, 0x75, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69,
-0x63, 0x61, 0x2f, 0x44, 0x65, 0x6e, 0x76, 0x65, 0x72, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4b, 0x72, 0x61, 0x73, 0x6e,
-0x6f, 0x79, 0x61, 0x72, 0x73, 0x6b, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x54, 0x69, 0x6a, 0x75, 0x61,
-0x6e, 0x61, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4b, 0x61, 0x6d, 0x63, 0x68, 0x61, 0x74, 0x6b, 0x61, 0x0, 0x45, 0x75,
-0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4d, 0x6f, 0x73, 0x63, 0x6f, 0x77, 0x0, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69,
-0x61, 0x2f, 0x48, 0x6f, 0x62, 0x61, 0x72, 0x74, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x55, 0x6c, 0x61, 0x61, 0x6e, 0x62,
-0x61, 0x61, 0x74, 0x61, 0x72, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e,
-0x61, 0x70, 0x6f, 0x6c, 0x69, 0x73, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x55, 0x54, 0x43, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f,
-0x56, 0x6c, 0x61, 0x64, 0x69, 0x76, 0x6f, 0x73, 0x74, 0x6f, 0x6b, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x42,
-0x65, 0x72, 0x6c, 0x69, 0x6e, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x54, 0x61, 0x73, 0x68, 0x6b, 0x65, 0x6e, 0x74, 0x0,
-0x41, 0x73, 0x69, 0x61, 0x2f, 0x48, 0x65, 0x62, 0x72, 0x6f, 0x6e, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x59, 0x61, 0x6b,
-0x75, 0x74, 0x73, 0x6b, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x57, 0x68, 0x69, 0x74, 0x65, 0x68, 0x6f,
-0x72, 0x73, 0x65, 0x0, 0x55, 0x54, 0x43, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x31, 0x34, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54,
-0x43, 0x2d, 0x31, 0x33, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x31, 0x32, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54,
-0x43, 0x2d, 0x31, 0x31, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x31, 0x30, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54,
-0x43, 0x2d, 0x30, 0x39, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x30, 0x38, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54,
-0x43, 0x2d, 0x30, 0x37, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x30, 0x36, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54,
-0x43, 0x2d, 0x30, 0x35, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x30, 0x34, 0x3a, 0x33, 0x30, 0x0, 0x55, 0x54,
-0x43, 0x2d, 0x30, 0x34, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x30, 0x33, 0x3a, 0x33, 0x30, 0x0, 0x55, 0x54,
-0x43, 0x2d, 0x30, 0x33, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x30, 0x32, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54,
-0x43, 0x2d, 0x30, 0x31, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x30, 0x30, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54,
-0x43, 0x2b, 0x30, 0x30, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x31, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54,
-0x43, 0x2b, 0x30, 0x32, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x33, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54,
-0x43, 0x2b, 0x30, 0x33, 0x3a, 0x33, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x34, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54,
-0x43, 0x2b, 0x30, 0x34, 0x3a, 0x33, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x35, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54,
-0x43, 0x2b, 0x30, 0x35, 0x3a, 0x33, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x35, 0x3a, 0x34, 0x35, 0x0, 0x55, 0x54,
-0x43, 0x2b, 0x30, 0x36, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x36, 0x3a, 0x33, 0x30, 0x0, 0x55, 0x54,
-0x43, 0x2b, 0x30, 0x37, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x38, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54,
-0x43, 0x2b, 0x30, 0x38, 0x3a, 0x33, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x39, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54,
-0x43, 0x2b, 0x30, 0x39, 0x3a, 0x33, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x31, 0x30, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54,
-0x43, 0x2b, 0x31, 0x31, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x31, 0x32, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54,
-0x43, 0x2b, 0x31, 0x33, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x31, 0x34, 0x3a, 0x30, 0x30, 0x0
+static constexpr char ianaIdData[] = {
+0x41, 0x73, 0x69, 0x61, 0x2f, 0x4b, 0x61, 0x62, 0x75, 0x6c, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69,
+0x63, 0x61, 0x2f, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x41, 0x6d, 0x65,
+0x72, 0x69, 0x63, 0x61, 0x2f, 0x4a, 0x75, 0x6e, 0x65, 0x61, 0x75, 0x20, 0x41, 0x6d, 0x65, 0x72,
+0x69, 0x63, 0x61, 0x2f, 0x4d, 0x65, 0x74, 0x6c, 0x61, 0x6b, 0x61, 0x74, 0x6c, 0x61, 0x20, 0x41,
+0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4e, 0x6f, 0x6d, 0x65, 0x20, 0x41, 0x6d, 0x65, 0x72,
+0x69, 0x63, 0x61, 0x2f, 0x53, 0x69, 0x74, 0x6b, 0x61, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63,
+0x61, 0x2f, 0x59, 0x61, 0x6b, 0x75, 0x74, 0x61, 0x74, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63,
+0x61, 0x2f, 0x41, 0x64, 0x61, 0x6b, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x42, 0x61, 0x72, 0x6e,
+0x61, 0x75, 0x6c, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x42, 0x61, 0x68, 0x72, 0x61, 0x69, 0x6e,
+0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4b, 0x75, 0x77, 0x61, 0x69, 0x74, 0x0, 0x41, 0x73, 0x69,
+0x61, 0x2f, 0x51, 0x61, 0x74, 0x61, 0x72, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x52, 0x69, 0x79,
+0x61, 0x64, 0x68, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x41, 0x64, 0x65, 0x6e, 0x0, 0x45, 0x74,
+0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x34, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4d, 0x75, 0x73,
+0x63, 0x61, 0x74, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x44, 0x75, 0x62, 0x61, 0x69, 0x0, 0x41,
+0x73, 0x69, 0x61, 0x2f, 0x42, 0x61, 0x67, 0x68, 0x64, 0x61, 0x64, 0x0, 0x41, 0x6d, 0x65, 0x72,
+0x69, 0x63, 0x61, 0x2f, 0x42, 0x75, 0x65, 0x6e, 0x6f, 0x73, 0x5f, 0x41, 0x69, 0x72, 0x65, 0x73,
+0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x72, 0x67, 0x65, 0x6e, 0x74, 0x69,
+0x6e, 0x61, 0x2f, 0x4c, 0x61, 0x5f, 0x52, 0x69, 0x6f, 0x6a, 0x61, 0x20, 0x41, 0x6d, 0x65, 0x72,
+0x69, 0x63, 0x61, 0x2f, 0x41, 0x72, 0x67, 0x65, 0x6e, 0x74, 0x69, 0x6e, 0x61, 0x2f, 0x52, 0x69,
+0x6f, 0x5f, 0x47, 0x61, 0x6c, 0x6c, 0x65, 0x67, 0x6f, 0x73, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69,
+0x63, 0x61, 0x2f, 0x41, 0x72, 0x67, 0x65, 0x6e, 0x74, 0x69, 0x6e, 0x61, 0x2f, 0x53, 0x61, 0x6c,
+0x74, 0x61, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x72, 0x67, 0x65, 0x6e,
+0x74, 0x69, 0x6e, 0x61, 0x2f, 0x53, 0x61, 0x6e, 0x5f, 0x4a, 0x75, 0x61, 0x6e, 0x20, 0x41, 0x6d,
+0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x72, 0x67, 0x65, 0x6e, 0x74, 0x69, 0x6e, 0x61, 0x2f,
+0x53, 0x61, 0x6e, 0x5f, 0x4c, 0x75, 0x69, 0x73, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61,
+0x2f, 0x41, 0x72, 0x67, 0x65, 0x6e, 0x74, 0x69, 0x6e, 0x61, 0x2f, 0x54, 0x75, 0x63, 0x75, 0x6d,
+0x61, 0x6e, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x72, 0x67, 0x65, 0x6e,
+0x74, 0x69, 0x6e, 0x61, 0x2f, 0x55, 0x73, 0x68, 0x75, 0x61, 0x69, 0x61, 0x20, 0x41, 0x6d, 0x65,
+0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x61, 0x74, 0x61, 0x6d, 0x61, 0x72, 0x63, 0x61, 0x20, 0x41,
+0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x6f, 0x72, 0x64, 0x6f, 0x62, 0x61, 0x20, 0x41,
+0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4a, 0x75, 0x6a, 0x75, 0x79, 0x20, 0x41, 0x6d, 0x65,
+0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x65, 0x6e, 0x64, 0x6f, 0x7a, 0x61, 0x0, 0x45, 0x75, 0x72,
+0x6f, 0x70, 0x65, 0x2f, 0x41, 0x73, 0x74, 0x72, 0x61, 0x6b, 0x68, 0x61, 0x6e, 0x20, 0x45, 0x75,
+0x72, 0x6f, 0x70, 0x65, 0x2f, 0x55, 0x6c, 0x79, 0x61, 0x6e, 0x6f, 0x76, 0x73, 0x6b, 0x0, 0x41,
+0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x2f, 0x42, 0x65, 0x72, 0x6d, 0x75, 0x64, 0x61, 0x0,
+0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x48, 0x61, 0x6c, 0x69, 0x66, 0x61, 0x78, 0x20,
+0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x47, 0x6c, 0x61, 0x63, 0x65, 0x5f, 0x42, 0x61,
+0x79, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x47, 0x6f, 0x6f, 0x73, 0x65, 0x5f,
+0x42, 0x61, 0x79, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x6f, 0x6e, 0x63,
+0x74, 0x6f, 0x6e, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x54, 0x68, 0x75, 0x6c,
+0x65, 0x0, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x2f, 0x44, 0x61, 0x72, 0x77,
+0x69, 0x6e, 0x0, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x2f, 0x45, 0x75, 0x63,
+0x6c, 0x61, 0x0, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x2f, 0x53, 0x79, 0x64,
+0x6e, 0x65, 0x79, 0x20, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x2f, 0x4d, 0x65,
+0x6c, 0x62, 0x6f, 0x75, 0x72, 0x6e, 0x65, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x42, 0x61, 0x6b,
+0x75, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x73,
+0x62, 0x79, 0x73, 0x75, 0x6e, 0x64, 0x0, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x2f,
+0x41, 0x7a, 0x6f, 0x72, 0x65, 0x73, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42,
+0x61, 0x68, 0x69, 0x61, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x44, 0x68, 0x61, 0x6b, 0x61, 0x0,
+0x41, 0x73, 0x69, 0x61, 0x2f, 0x54, 0x68, 0x69, 0x6d, 0x70, 0x68, 0x75, 0x0, 0x45, 0x75, 0x72,
+0x6f, 0x70, 0x65, 0x2f, 0x4d, 0x69, 0x6e, 0x73, 0x6b, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69,
+0x63, 0x2f, 0x42, 0x6f, 0x75, 0x67, 0x61, 0x69, 0x6e, 0x76, 0x69, 0x6c, 0x6c, 0x65, 0x0, 0x41,
+0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x52, 0x65, 0x67, 0x69, 0x6e, 0x61, 0x20, 0x41, 0x6d,
+0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x77, 0x69, 0x66, 0x74, 0x5f, 0x43, 0x75, 0x72, 0x72,
+0x65, 0x6e, 0x74, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b, 0x31, 0x0, 0x41, 0x74,
+0x6c, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x2f, 0x43, 0x61, 0x70, 0x65, 0x5f, 0x56, 0x65, 0x72, 0x64,
+0x65, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x59, 0x65, 0x72, 0x65, 0x76, 0x61, 0x6e, 0x0, 0x41,
+0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x2f, 0x41, 0x64, 0x65, 0x6c, 0x61, 0x69, 0x64,
+0x65, 0x20, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x2f, 0x42, 0x72, 0x6f, 0x6b,
+0x65, 0x6e, 0x5f, 0x48, 0x69, 0x6c, 0x6c, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b,
+0x36, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x65, 0x6c, 0x69, 0x7a, 0x65,
+0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x6f, 0x73, 0x74, 0x61, 0x5f, 0x52,
+0x69, 0x63, 0x61, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x47, 0x61, 0x6c, 0x61,
+0x70, 0x61, 0x67, 0x6f, 0x73, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x45, 0x6c,
+0x5f, 0x53, 0x61, 0x6c, 0x76, 0x61, 0x64, 0x6f, 0x72, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63,
+0x61, 0x2f, 0x47, 0x75, 0x61, 0x74, 0x65, 0x6d, 0x61, 0x6c, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72,
+0x69, 0x63, 0x61, 0x2f, 0x54, 0x65, 0x67, 0x75, 0x63, 0x69, 0x67, 0x61, 0x6c, 0x70, 0x61, 0x0,
+0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x75, 0x61, 0x0,
+0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x36, 0x0, 0x41, 0x6e, 0x74, 0x61, 0x72, 0x63,
+0x74, 0x69, 0x63, 0x61, 0x2f, 0x56, 0x6f, 0x73, 0x74, 0x6f, 0x6b, 0x0, 0x49, 0x6e, 0x64, 0x69,
+0x61, 0x6e, 0x2f, 0x43, 0x68, 0x61, 0x67, 0x6f, 0x73, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x55,
+0x72, 0x75, 0x6d, 0x71, 0x69, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x41, 0x6c, 0x6d, 0x61, 0x74,
+0x79, 0x20, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x51, 0x6f, 0x73, 0x74, 0x61, 0x6e, 0x61, 0x79, 0x0,
+0x41, 0x73, 0x69, 0x61, 0x2f, 0x42, 0x69, 0x73, 0x68, 0x6b, 0x65, 0x6b, 0x0, 0x41, 0x6d, 0x65,
+0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x75, 0x69, 0x61, 0x62, 0x61, 0x20, 0x41, 0x6d, 0x65, 0x72,
+0x69, 0x63, 0x61, 0x2f, 0x43, 0x61, 0x6d, 0x70, 0x6f, 0x5f, 0x47, 0x72, 0x61, 0x6e, 0x64, 0x65,
+0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x54, 0x69, 0x72, 0x61, 0x6e, 0x65, 0x0, 0x45,
+0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x50, 0x72, 0x61, 0x67, 0x75, 0x65, 0x0, 0x45, 0x75, 0x72,
+0x6f, 0x70, 0x65, 0x2f, 0x42, 0x75, 0x64, 0x61, 0x70, 0x65, 0x73, 0x74, 0x0, 0x45, 0x75, 0x72,
+0x6f, 0x70, 0x65, 0x2f, 0x50, 0x6f, 0x64, 0x67, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x0, 0x45, 0x75,
+0x72, 0x6f, 0x70, 0x65, 0x2f, 0x42, 0x65, 0x6c, 0x67, 0x72, 0x61, 0x64, 0x65, 0x0, 0x45, 0x75,
+0x72, 0x6f, 0x70, 0x65, 0x2f, 0x42, 0x72, 0x61, 0x74, 0x69, 0x73, 0x6c, 0x61, 0x76, 0x61, 0x0,
+0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4c, 0x6a, 0x75, 0x62, 0x6c, 0x6a, 0x61, 0x6e, 0x61,
+0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x53, 0x61, 0x72, 0x61, 0x6a, 0x65, 0x76, 0x6f,
+0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x5a, 0x61, 0x67, 0x72, 0x65, 0x62, 0x0, 0x45,
+0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x53, 0x6b, 0x6f, 0x70, 0x6a, 0x65, 0x0, 0x45, 0x75, 0x72,
+0x6f, 0x70, 0x65, 0x2f, 0x57, 0x61, 0x72, 0x73, 0x61, 0x77, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47,
+0x4d, 0x54, 0x2d, 0x31, 0x31, 0x0, 0x41, 0x6e, 0x74, 0x61, 0x72, 0x63, 0x74, 0x69, 0x63, 0x61,
+0x2f, 0x43, 0x61, 0x73, 0x65, 0x79, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x50,
+0x6f, 0x6e, 0x61, 0x70, 0x65, 0x20, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x4b, 0x6f,
+0x73, 0x72, 0x61, 0x65, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x4e, 0x6f, 0x75,
+0x6d, 0x65, 0x61, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x47, 0x75, 0x61, 0x64,
+0x61, 0x6c, 0x63, 0x61, 0x6e, 0x61, 0x6c, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f,
+0x45, 0x66, 0x61, 0x74, 0x65, 0x0, 0x43, 0x53, 0x54, 0x36, 0x43, 0x44, 0x54, 0x0, 0x41, 0x6d,
+0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x57, 0x69, 0x6e, 0x6e, 0x69, 0x70, 0x65, 0x67, 0x20, 0x41,
+0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x52, 0x61, 0x69, 0x6e, 0x79, 0x5f, 0x52, 0x69, 0x76,
+0x65, 0x72, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x52, 0x61, 0x6e, 0x6b, 0x69,
+0x6e, 0x5f, 0x49, 0x6e, 0x6c, 0x65, 0x74, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f,
+0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61,
+0x2f, 0x4d, 0x61, 0x74, 0x61, 0x6d, 0x6f, 0x72, 0x6f, 0x73, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69,
+0x63, 0x61, 0x2f, 0x4f, 0x6a, 0x69, 0x6e, 0x61, 0x67, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69,
+0x63, 0x61, 0x2f, 0x43, 0x68, 0x69, 0x63, 0x61, 0x67, 0x6f, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69,
+0x63, 0x61, 0x2f, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x61, 0x2f, 0x4b, 0x6e, 0x6f, 0x78, 0x20,
+0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x61, 0x2f,
+0x54, 0x65, 0x6c, 0x6c, 0x5f, 0x43, 0x69, 0x74, 0x79, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63,
+0x61, 0x2f, 0x4d, 0x65, 0x6e, 0x6f, 0x6d, 0x69, 0x6e, 0x65, 0x65, 0x20, 0x41, 0x6d, 0x65, 0x72,
+0x69, 0x63, 0x61, 0x2f, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x5f, 0x44, 0x61, 0x6b, 0x6f, 0x74, 0x61,
+0x2f, 0x42, 0x65, 0x75, 0x6c, 0x61, 0x68, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f,
+0x4e, 0x6f, 0x72, 0x74, 0x68, 0x5f, 0x44, 0x61, 0x6b, 0x6f, 0x74, 0x61, 0x2f, 0x43, 0x65, 0x6e,
+0x74, 0x65, 0x72, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4e, 0x6f, 0x72, 0x74,
+0x68, 0x5f, 0x44, 0x61, 0x6b, 0x6f, 0x74, 0x61, 0x2f, 0x4e, 0x65, 0x77, 0x5f, 0x53, 0x61, 0x6c,
+0x65, 0x6d, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x65, 0x78, 0x69, 0x63,
+0x6f, 0x5f, 0x43, 0x69, 0x74, 0x79, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42,
+0x61, 0x68, 0x69, 0x61, 0x5f, 0x42, 0x61, 0x6e, 0x64, 0x65, 0x72, 0x61, 0x73, 0x20, 0x41, 0x6d,
+0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x65, 0x72, 0x69, 0x64, 0x61, 0x20, 0x41, 0x6d, 0x65,
+0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x6f, 0x6e, 0x74, 0x65, 0x72, 0x72, 0x65, 0x79, 0x20, 0x41,
+0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x68, 0x69, 0x68, 0x75, 0x61, 0x68, 0x75, 0x61,
+0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x43, 0x68, 0x61, 0x74, 0x68, 0x61, 0x6d,
+0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x53, 0x68, 0x61, 0x6e, 0x67, 0x68, 0x61, 0x69, 0x0, 0x41,
+0x73, 0x69, 0x61, 0x2f, 0x48, 0x6f, 0x6e, 0x67, 0x5f, 0x4b, 0x6f, 0x6e, 0x67, 0x0, 0x41, 0x73,
+0x69, 0x61, 0x2f, 0x4d, 0x61, 0x63, 0x61, 0x75, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61,
+0x2f, 0x48, 0x61, 0x76, 0x61, 0x6e, 0x61, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b,
+0x31, 0x32, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x33, 0x0, 0x41, 0x6e, 0x74,
+0x61, 0x72, 0x63, 0x74, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x79, 0x6f, 0x77, 0x61, 0x0, 0x49, 0x6e,
+0x64, 0x69, 0x61, 0x6e, 0x2f, 0x43, 0x6f, 0x6d, 0x6f, 0x72, 0x6f, 0x0, 0x41, 0x66, 0x72, 0x69,
+0x63, 0x61, 0x2f, 0x44, 0x6a, 0x69, 0x62, 0x6f, 0x75, 0x74, 0x69, 0x0, 0x41, 0x66, 0x72, 0x69,
+0x63, 0x61, 0x2f, 0x41, 0x73, 0x6d, 0x65, 0x72, 0x61, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61,
+0x2f, 0x41, 0x64, 0x64, 0x69, 0x73, 0x5f, 0x41, 0x62, 0x61, 0x62, 0x61, 0x0, 0x41, 0x66, 0x72,
+0x69, 0x63, 0x61, 0x2f, 0x4e, 0x61, 0x69, 0x72, 0x6f, 0x62, 0x69, 0x0, 0x49, 0x6e, 0x64, 0x69,
+0x61, 0x6e, 0x2f, 0x41, 0x6e, 0x74, 0x61, 0x6e, 0x61, 0x6e, 0x61, 0x72, 0x69, 0x76, 0x6f, 0x0,
+0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x2f, 0x4d, 0x61, 0x79, 0x6f, 0x74, 0x74, 0x65, 0x0, 0x41,
+0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x6f, 0x67, 0x61, 0x64, 0x69, 0x73, 0x68, 0x75, 0x0,
+0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x61, 0x72, 0x5f, 0x65, 0x73, 0x5f, 0x53, 0x61,
+0x6c, 0x61, 0x61, 0x6d, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4b, 0x61, 0x6d, 0x70,
+0x61, 0x6c, 0x61, 0x0, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x2f, 0x42, 0x72,
+0x69, 0x73, 0x62, 0x61, 0x6e, 0x65, 0x20, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61,
+0x2f, 0x4c, 0x69, 0x6e, 0x64, 0x65, 0x6d, 0x61, 0x6e, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65,
+0x2f, 0x43, 0x68, 0x69, 0x73, 0x69, 0x6e, 0x61, 0x75, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63,
+0x61, 0x2f, 0x53, 0x61, 0x6f, 0x5f, 0x50, 0x61, 0x75, 0x6c, 0x6f, 0x0, 0x50, 0x61, 0x63, 0x69,
+0x66, 0x69, 0x63, 0x2f, 0x45, 0x61, 0x73, 0x74, 0x65, 0x72, 0x0, 0x45, 0x53, 0x54, 0x35, 0x45,
+0x44, 0x54, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4e, 0x61, 0x73, 0x73, 0x61,
+0x75, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x54, 0x6f, 0x72, 0x6f, 0x6e, 0x74,
+0x6f, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x49, 0x71, 0x61, 0x6c, 0x75, 0x69,
+0x74, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x6f, 0x6e, 0x74, 0x72, 0x65,
+0x61, 0x6c, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4e, 0x69, 0x70, 0x69, 0x67,
+0x6f, 0x6e, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x50, 0x61, 0x6e, 0x67, 0x6e,
+0x69, 0x72, 0x74, 0x75, 0x6e, 0x67, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x54,
+0x68, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x5f, 0x42, 0x61, 0x79, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69,
+0x63, 0x61, 0x2f, 0x4e, 0x65, 0x77, 0x5f, 0x59, 0x6f, 0x72, 0x6b, 0x20, 0x41, 0x6d, 0x65, 0x72,
+0x69, 0x63, 0x61, 0x2f, 0x44, 0x65, 0x74, 0x72, 0x6f, 0x69, 0x74, 0x20, 0x41, 0x6d, 0x65, 0x72,
+0x69, 0x63, 0x61, 0x2f, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x61, 0x2f, 0x50, 0x65, 0x74, 0x65,
+0x72, 0x73, 0x62, 0x75, 0x72, 0x67, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x49,
+0x6e, 0x64, 0x69, 0x61, 0x6e, 0x61, 0x2f, 0x56, 0x69, 0x6e, 0x63, 0x65, 0x6e, 0x6e, 0x65, 0x73,
+0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x61,
+0x2f, 0x57, 0x69, 0x6e, 0x61, 0x6d, 0x61, 0x63, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61,
+0x2f, 0x4b, 0x65, 0x6e, 0x74, 0x75, 0x63, 0x6b, 0x79, 0x2f, 0x4d, 0x6f, 0x6e, 0x74, 0x69, 0x63,
+0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x6f, 0x75,
+0x69, 0x73, 0x76, 0x69, 0x6c, 0x6c, 0x65, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f,
+0x43, 0x61, 0x6e, 0x63, 0x75, 0x6e, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x61,
+0x69, 0x72, 0x6f, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x59, 0x65, 0x6b, 0x61, 0x74, 0x65, 0x72,
+0x69, 0x6e, 0x62, 0x75, 0x72, 0x67, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x46,
+0x69, 0x6a, 0x69, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4d, 0x61, 0x72, 0x69, 0x65,
+0x68, 0x61, 0x6d, 0x6e, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x53, 0x6f, 0x66, 0x69,
+0x61, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x54, 0x61, 0x6c, 0x6c, 0x69, 0x6e, 0x6e,
+0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x48, 0x65, 0x6c, 0x73, 0x69, 0x6e, 0x6b, 0x69,
+0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x52, 0x69, 0x67, 0x61, 0x0, 0x45, 0x75, 0x72,
+0x6f, 0x70, 0x65, 0x2f, 0x56, 0x69, 0x6c, 0x6e, 0x69, 0x75, 0x73, 0x0, 0x45, 0x75, 0x72, 0x6f,
+0x70, 0x65, 0x2f, 0x4b, 0x69, 0x65, 0x76, 0x20, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x55,
+0x7a, 0x68, 0x67, 0x6f, 0x72, 0x6f, 0x64, 0x20, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x5a,
+0x61, 0x70, 0x6f, 0x72, 0x6f, 0x7a, 0x68, 0x79, 0x65, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x54,
+0x62, 0x69, 0x6c, 0x69, 0x73, 0x69, 0x0, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x2f,
+0x46, 0x61, 0x65, 0x72, 0x6f, 0x65, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x47, 0x75,
+0x65, 0x72, 0x6e, 0x73, 0x65, 0x79, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x44, 0x75,
+0x62, 0x6c, 0x69, 0x6e, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x49, 0x73, 0x6c, 0x65,
+0x5f, 0x6f, 0x66, 0x5f, 0x4d, 0x61, 0x6e, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4a,
+0x65, 0x72, 0x73, 0x65, 0x79, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4c, 0x69, 0x73,
+0x62, 0x6f, 0x6e, 0x20, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x2f, 0x4d, 0x61, 0x64,
+0x65, 0x69, 0x72, 0x61, 0x0, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x2f, 0x43, 0x61,
+0x6e, 0x61, 0x72, 0x79, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4c, 0x6f, 0x6e, 0x64,
+0x6f, 0x6e, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x47, 0x6f, 0x64, 0x74, 0x68,
+0x61, 0x62, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4f, 0x75, 0x61, 0x67, 0x61, 0x64,
+0x6f, 0x75, 0x67, 0x6f, 0x75, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x61, 0x6e,
+0x6a, 0x75, 0x6c, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x63, 0x63, 0x72, 0x61,
+0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x61, 0x6e, 0x6d, 0x61, 0x72, 0x6b,
+0x73, 0x68, 0x61, 0x76, 0x6e, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x69, 0x73,
+0x73, 0x61, 0x75, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x6f, 0x6e, 0x61, 0x6b,
+0x72, 0x79, 0x0, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x2f, 0x52, 0x65, 0x79, 0x6b,
+0x6a, 0x61, 0x76, 0x69, 0x6b, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x62, 0x69,
+0x64, 0x6a, 0x61, 0x6e, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x6f, 0x6e, 0x72,
+0x6f, 0x76, 0x69, 0x61, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x61, 0x6d, 0x61,
+0x6b, 0x6f, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4e, 0x6f, 0x75, 0x61, 0x6b, 0x63,
+0x68, 0x6f, 0x74, 0x74, 0x0, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x2f, 0x53, 0x74,
+0x5f, 0x48, 0x65, 0x6c, 0x65, 0x6e, 0x61, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x44,
+0x61, 0x6b, 0x61, 0x72, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x46, 0x72, 0x65, 0x65,
+0x74, 0x6f, 0x77, 0x6e, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x6f, 0x6d, 0x65,
+0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4e, 0x69, 0x63, 0x6f, 0x73, 0x69, 0x61, 0x20, 0x41, 0x73,
+0x69, 0x61, 0x2f, 0x46, 0x61, 0x6d, 0x61, 0x67, 0x75, 0x73, 0x74, 0x61, 0x0, 0x45, 0x75, 0x72,
+0x6f, 0x70, 0x65, 0x2f, 0x41, 0x74, 0x68, 0x65, 0x6e, 0x73, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70,
+0x65, 0x2f, 0x42, 0x75, 0x63, 0x68, 0x61, 0x72, 0x65, 0x73, 0x74, 0x0, 0x41, 0x6d, 0x65, 0x72,
+0x69, 0x63, 0x61, 0x2f, 0x50, 0x6f, 0x72, 0x74, 0x2d, 0x61, 0x75, 0x2d, 0x50, 0x72, 0x69, 0x6e,
+0x63, 0x65, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b, 0x31, 0x30, 0x0, 0x50, 0x61,
+0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x52, 0x61, 0x72, 0x6f, 0x74, 0x6f, 0x6e, 0x67, 0x61, 0x0,
+0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x54, 0x61, 0x68, 0x69, 0x74, 0x69, 0x0, 0x50,
+0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x4a, 0x6f, 0x68, 0x6e, 0x73, 0x74, 0x6f, 0x6e, 0x0,
+0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x48, 0x6f, 0x6e, 0x6f, 0x6c, 0x75, 0x6c, 0x75,
+0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x43, 0x61, 0x6c, 0x63, 0x75, 0x74, 0x74, 0x61, 0x0, 0x41,
+0x73, 0x69, 0x61, 0x2f, 0x54, 0x65, 0x68, 0x72, 0x61, 0x6e, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f,
+0x4a, 0x65, 0x72, 0x75, 0x73, 0x61, 0x6c, 0x65, 0x6d, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x41,
+0x6d, 0x6d, 0x61, 0x6e, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4b, 0x61, 0x6c, 0x69,
+0x6e, 0x69, 0x6e, 0x67, 0x72, 0x61, 0x64, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x53, 0x65, 0x6f,
+0x75, 0x6c, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x54, 0x72, 0x69, 0x70, 0x6f, 0x6c,
+0x69, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x31, 0x34, 0x0, 0x50, 0x61, 0x63,
+0x69, 0x66, 0x69, 0x63, 0x2f, 0x4b, 0x69, 0x72, 0x69, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x69, 0x0,
+0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x2f, 0x4c, 0x6f, 0x72, 0x64, 0x5f, 0x48,
+0x6f, 0x77, 0x65, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4d, 0x61, 0x67, 0x61, 0x64, 0x61, 0x6e,
+0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x50, 0x75, 0x6e, 0x74, 0x61, 0x5f, 0x41,
+0x72, 0x65, 0x6e, 0x61, 0x73, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x4d, 0x61,
+0x72, 0x71, 0x75, 0x65, 0x73, 0x61, 0x73, 0x0, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x2f, 0x4d,
+0x61, 0x75, 0x72, 0x69, 0x74, 0x69, 0x75, 0x73, 0x0, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x2f,
+0x52, 0x65, 0x75, 0x6e, 0x69, 0x6f, 0x6e, 0x0, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x2f, 0x4d,
+0x61, 0x68, 0x65, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x42, 0x65, 0x69, 0x72, 0x75, 0x74, 0x0,
+0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x6f, 0x6e, 0x74, 0x65, 0x76, 0x69, 0x64,
+0x65, 0x6f, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x61, 0x73, 0x61, 0x62, 0x6c,
+0x61, 0x6e, 0x63, 0x61, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x45, 0x6c, 0x5f, 0x41,
+0x61, 0x69, 0x75, 0x6e, 0x0, 0x4d, 0x53, 0x54, 0x37, 0x4d, 0x44, 0x54, 0x0, 0x41, 0x6d, 0x65,
+0x72, 0x69, 0x63, 0x61, 0x2f, 0x45, 0x64, 0x6d, 0x6f, 0x6e, 0x74, 0x6f, 0x6e, 0x20, 0x41, 0x6d,
+0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x61, 0x6d, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x5f,
+0x42, 0x61, 0x79, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x49, 0x6e, 0x75, 0x76,
+0x69, 0x6b, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x59, 0x65, 0x6c, 0x6c, 0x6f,
+0x77, 0x6b, 0x6e, 0x69, 0x66, 0x65, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43,
+0x69, 0x75, 0x64, 0x61, 0x64, 0x5f, 0x4a, 0x75, 0x61, 0x72, 0x65, 0x7a, 0x0, 0x41, 0x6d, 0x65,
+0x72, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x65, 0x6e, 0x76, 0x65, 0x72, 0x20, 0x41, 0x6d, 0x65, 0x72,
+0x69, 0x63, 0x61, 0x2f, 0x42, 0x6f, 0x69, 0x73, 0x65, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63,
+0x61, 0x2f, 0x4d, 0x61, 0x7a, 0x61, 0x74, 0x6c, 0x61, 0x6e, 0x0, 0x49, 0x6e, 0x64, 0x69, 0x61,
+0x6e, 0x2f, 0x43, 0x6f, 0x63, 0x6f, 0x73, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x52, 0x61, 0x6e,
+0x67, 0x6f, 0x6f, 0x6e, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4e, 0x6f, 0x76, 0x6f, 0x73, 0x69,
+0x62, 0x69, 0x72, 0x73, 0x6b, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x57, 0x69, 0x6e,
+0x64, 0x68, 0x6f, 0x65, 0x6b, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4b, 0x61, 0x74, 0x6d, 0x61,
+0x6e, 0x64, 0x75, 0x0, 0x41, 0x6e, 0x74, 0x61, 0x72, 0x63, 0x74, 0x69, 0x63, 0x61, 0x2f, 0x4d,
+0x63, 0x4d, 0x75, 0x72, 0x64, 0x6f, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x41,
+0x75, 0x63, 0x6b, 0x6c, 0x61, 0x6e, 0x64, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f,
+0x53, 0x74, 0x5f, 0x4a, 0x6f, 0x68, 0x6e, 0x73, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63,
+0x2f, 0x4e, 0x6f, 0x72, 0x66, 0x6f, 0x6c, 0x6b, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x49, 0x72,
+0x6b, 0x75, 0x74, 0x73, 0x6b, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4b, 0x72, 0x61, 0x73, 0x6e,
+0x6f, 0x79, 0x61, 0x72, 0x73, 0x6b, 0x20, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4e, 0x6f, 0x76, 0x6f,
+0x6b, 0x75, 0x7a, 0x6e, 0x65, 0x74, 0x73, 0x6b, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x50, 0x79,
+0x6f, 0x6e, 0x67, 0x79, 0x61, 0x6e, 0x67, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4f, 0x6d, 0x73,
+0x6b, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x61, 0x6e, 0x74, 0x69, 0x61,
+0x67, 0x6f, 0x0, 0x50, 0x53, 0x54, 0x38, 0x50, 0x44, 0x54, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69,
+0x63, 0x61, 0x2f, 0x56, 0x61, 0x6e, 0x63, 0x6f, 0x75, 0x76, 0x65, 0x72, 0x0, 0x41, 0x6d, 0x65,
+0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x6f, 0x73, 0x5f, 0x41, 0x6e, 0x67, 0x65, 0x6c, 0x65, 0x73,
+0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x54, 0x69, 0x6a, 0x75, 0x61, 0x6e, 0x61,
+0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x61, 0x6e, 0x74, 0x61, 0x5f, 0x49,
+0x73, 0x61, 0x62, 0x65, 0x6c, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4b, 0x61, 0x72, 0x61, 0x63,
+0x68, 0x69, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x73, 0x75, 0x6e, 0x63,
+0x69, 0x6f, 0x6e, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x51, 0x79, 0x7a, 0x79, 0x6c, 0x6f, 0x72,
+0x64, 0x61, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x42, 0x72, 0x75, 0x73, 0x73, 0x65,
+0x6c, 0x73, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x43, 0x6f, 0x70, 0x65, 0x6e, 0x68,
+0x61, 0x67, 0x65, 0x6e, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x50, 0x61, 0x72, 0x69,
+0x73, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4d, 0x61, 0x64, 0x72, 0x69, 0x64, 0x20,
+0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x65, 0x75, 0x74, 0x61, 0x0, 0x41, 0x73, 0x69,
+0x61, 0x2f, 0x53, 0x72, 0x65, 0x64, 0x6e, 0x65, 0x6b, 0x6f, 0x6c, 0x79, 0x6d, 0x73, 0x6b, 0x0,
+0x41, 0x73, 0x69, 0x61, 0x2f, 0x4b, 0x61, 0x6d, 0x63, 0x68, 0x61, 0x74, 0x6b, 0x61, 0x20, 0x41,
+0x73, 0x69, 0x61, 0x2f, 0x41, 0x6e, 0x61, 0x64, 0x79, 0x72, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70,
+0x65, 0x2f, 0x53, 0x61, 0x6d, 0x61, 0x72, 0x61, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f,
+0x4d, 0x6f, 0x73, 0x63, 0x6f, 0x77, 0x20, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4b, 0x69,
+0x72, 0x6f, 0x76, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x53, 0x69, 0x6d, 0x66, 0x65,
+0x72, 0x6f, 0x70, 0x6f, 0x6c, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b, 0x33, 0x0,
+0x41, 0x6e, 0x74, 0x61, 0x72, 0x63, 0x74, 0x69, 0x63, 0x61, 0x2f, 0x52, 0x6f, 0x74, 0x68, 0x65,
+0x72, 0x61, 0x20, 0x41, 0x6e, 0x74, 0x61, 0x72, 0x63, 0x74, 0x69, 0x63, 0x61, 0x2f, 0x50, 0x61,
+0x6c, 0x6d, 0x65, 0x72, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x46, 0x6f, 0x72,
+0x74, 0x61, 0x6c, 0x65, 0x7a, 0x61, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42,
+0x65, 0x6c, 0x65, 0x6d, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x61, 0x63,
+0x65, 0x69, 0x6f, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x52, 0x65, 0x63, 0x69,
+0x66, 0x65, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x61, 0x6e, 0x74, 0x61,
+0x72, 0x65, 0x6d, 0x0, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x2f, 0x53, 0x74, 0x61,
+0x6e, 0x6c, 0x65, 0x79, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x61, 0x79,
+0x65, 0x6e, 0x6e, 0x65, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x50, 0x61, 0x72,
+0x61, 0x6d, 0x61, 0x72, 0x69, 0x62, 0x6f, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b,
+0x35, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x52, 0x69, 0x6f, 0x5f, 0x42, 0x72,
+0x61, 0x6e, 0x63, 0x6f, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x45, 0x69, 0x72,
+0x75, 0x6e, 0x65, 0x70, 0x65, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x6f,
+0x72, 0x61, 0x6c, 0x5f, 0x48, 0x61, 0x72, 0x62, 0x6f, 0x75, 0x72, 0x0, 0x41, 0x6d, 0x65, 0x72,
+0x69, 0x63, 0x61, 0x2f, 0x43, 0x61, 0x79, 0x6d, 0x61, 0x6e, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69,
+0x63, 0x61, 0x2f, 0x42, 0x6f, 0x67, 0x6f, 0x74, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63,
+0x61, 0x2f, 0x47, 0x75, 0x61, 0x79, 0x61, 0x71, 0x75, 0x69, 0x6c, 0x0, 0x41, 0x6d, 0x65, 0x72,
+0x69, 0x63, 0x61, 0x2f, 0x4a, 0x61, 0x6d, 0x61, 0x69, 0x63, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72,
+0x69, 0x63, 0x61, 0x2f, 0x50, 0x61, 0x6e, 0x61, 0x6d, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69,
+0x63, 0x61, 0x2f, 0x4c, 0x69, 0x6d, 0x61, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b,
+0x34, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x6e, 0x67, 0x75, 0x69, 0x6c,
+0x6c, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x6e, 0x74, 0x69, 0x67,
+0x75, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x72, 0x75, 0x62, 0x61,
+0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x61, 0x72, 0x62, 0x61, 0x64, 0x6f,
+0x73, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x61, 0x5f, 0x50, 0x61, 0x7a,
+0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x61, 0x6e, 0x61, 0x75, 0x73, 0x20,
+0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x6f, 0x61, 0x5f, 0x56, 0x69, 0x73, 0x74,
+0x61, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x50, 0x6f, 0x72, 0x74, 0x6f, 0x5f,
+0x56, 0x65, 0x6c, 0x68, 0x6f, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x54, 0x6f,
+0x72, 0x74, 0x6f, 0x6c, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x6c,
+0x61, 0x6e, 0x63, 0x2d, 0x53, 0x61, 0x62, 0x6c, 0x6f, 0x6e, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69,
+0x63, 0x61, 0x2f, 0x4b, 0x72, 0x61, 0x6c, 0x65, 0x6e, 0x64, 0x69, 0x6a, 0x6b, 0x0, 0x41, 0x6d,
+0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x75, 0x72, 0x61, 0x63, 0x61, 0x6f, 0x0, 0x41, 0x6d,
+0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x6f, 0x6d, 0x69, 0x6e, 0x69, 0x63, 0x61, 0x0, 0x41,
+0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x61, 0x6e, 0x74, 0x6f, 0x5f, 0x44, 0x6f, 0x6d,
+0x69, 0x6e, 0x67, 0x6f, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x47, 0x72, 0x65,
+0x6e, 0x61, 0x64, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x47, 0x75, 0x61,
+0x64, 0x65, 0x6c, 0x6f, 0x75, 0x70, 0x65, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f,
+0x47, 0x75, 0x79, 0x61, 0x6e, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d,
+0x61, 0x72, 0x74, 0x69, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63,
+0x61, 0x2f, 0x4d, 0x6f, 0x6e, 0x74, 0x73, 0x65, 0x72, 0x72, 0x61, 0x74, 0x0, 0x41, 0x6d, 0x65,
+0x72, 0x69, 0x63, 0x61, 0x2f, 0x50, 0x75, 0x65, 0x72, 0x74, 0x6f, 0x5f, 0x52, 0x69, 0x63, 0x6f,
+0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x74, 0x5f, 0x42, 0x61, 0x72, 0x74,
+0x68, 0x65, 0x6c, 0x65, 0x6d, 0x79, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53,
+0x74, 0x5f, 0x4b, 0x69, 0x74, 0x74, 0x73, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f,
+0x53, 0x74, 0x5f, 0x4c, 0x75, 0x63, 0x69, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61,
+0x2f, 0x4d, 0x61, 0x72, 0x69, 0x67, 0x6f, 0x74, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61,
+0x2f, 0x53, 0x74, 0x5f, 0x56, 0x69, 0x6e, 0x63, 0x65, 0x6e, 0x74, 0x0, 0x41, 0x6d, 0x65, 0x72,
+0x69, 0x63, 0x61, 0x2f, 0x4c, 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x65,
+0x73, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x50, 0x6f, 0x72, 0x74, 0x5f, 0x6f,
+0x66, 0x5f, 0x53, 0x70, 0x61, 0x69, 0x6e, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f,
+0x53, 0x74, 0x5f, 0x54, 0x68, 0x6f, 0x6d, 0x61, 0x73, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63,
+0x61, 0x2f, 0x4d, 0x69, 0x71, 0x75, 0x65, 0x6c, 0x6f, 0x6e, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f,
+0x53, 0x61, 0x6b, 0x68, 0x61, 0x6c, 0x69, 0x6e, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63,
+0x2f, 0x41, 0x70, 0x69, 0x61, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x61, 0x6f,
+0x5f, 0x54, 0x6f, 0x6d, 0x65, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x53, 0x61, 0x72,
+0x61, 0x74, 0x6f, 0x76, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x37, 0x0, 0x41,
+0x6e, 0x74, 0x61, 0x72, 0x63, 0x74, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x61, 0x76, 0x69, 0x73, 0x0,
+0x41, 0x73, 0x69, 0x61, 0x2f, 0x50, 0x68, 0x6e, 0x6f, 0x6d, 0x5f, 0x50, 0x65, 0x6e, 0x68, 0x0,
+0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x2f, 0x43, 0x68, 0x72, 0x69, 0x73, 0x74, 0x6d, 0x61, 0x73,
+0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4a, 0x61, 0x6b, 0x61, 0x72, 0x74, 0x61, 0x20, 0x41, 0x73,
+0x69, 0x61, 0x2f, 0x50, 0x6f, 0x6e, 0x74, 0x69, 0x61, 0x6e, 0x61, 0x6b, 0x0, 0x41, 0x73, 0x69,
+0x61, 0x2f, 0x56, 0x69, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6e, 0x65, 0x0, 0x41, 0x73, 0x69, 0x61,
+0x2f, 0x42, 0x61, 0x6e, 0x67, 0x6b, 0x6f, 0x6b, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x53, 0x61,
+0x69, 0x67, 0x6f, 0x6e, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x38, 0x0, 0x41,
+0x73, 0x69, 0x61, 0x2f, 0x42, 0x72, 0x75, 0x6e, 0x65, 0x69, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f,
+0x4d, 0x61, 0x6b, 0x61, 0x73, 0x73, 0x61, 0x72, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4b, 0x75,
+0x61, 0x6c, 0x61, 0x5f, 0x4c, 0x75, 0x6d, 0x70, 0x75, 0x72, 0x20, 0x41, 0x73, 0x69, 0x61, 0x2f,
+0x4b, 0x75, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4d, 0x61, 0x6e,
+0x69, 0x6c, 0x61, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x53, 0x69, 0x6e, 0x67, 0x61, 0x70, 0x6f,
+0x72, 0x65, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x32, 0x0, 0x41, 0x66, 0x72,
+0x69, 0x63, 0x61, 0x2f, 0x47, 0x61, 0x62, 0x6f, 0x72, 0x6f, 0x6e, 0x65, 0x0, 0x41, 0x66, 0x72,
+0x69, 0x63, 0x61, 0x2f, 0x42, 0x75, 0x6a, 0x75, 0x6d, 0x62, 0x75, 0x72, 0x61, 0x0, 0x41, 0x66,
+0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x75, 0x62, 0x75, 0x6d, 0x62, 0x61, 0x73, 0x68, 0x69, 0x0,
+0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x62, 0x61, 0x62, 0x61, 0x6e, 0x65, 0x0, 0x41,
+0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x61, 0x73, 0x65, 0x72, 0x75, 0x0, 0x41, 0x66, 0x72,
+0x69, 0x63, 0x61, 0x2f, 0x42, 0x6c, 0x61, 0x6e, 0x74, 0x79, 0x72, 0x65, 0x0, 0x41, 0x66, 0x72,
+0x69, 0x63, 0x61, 0x2f, 0x4d, 0x61, 0x70, 0x75, 0x74, 0x6f, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63,
+0x61, 0x2f, 0x4b, 0x69, 0x67, 0x61, 0x6c, 0x69, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f,
+0x4a, 0x6f, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x73, 0x62, 0x75, 0x72, 0x67, 0x0, 0x41, 0x66, 0x72,
+0x69, 0x63, 0x61, 0x2f, 0x4c, 0x75, 0x73, 0x61, 0x6b, 0x61, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63,
+0x61, 0x2f, 0x48, 0x61, 0x72, 0x61, 0x72, 0x65, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f,
+0x4a, 0x75, 0x62, 0x61, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x43, 0x6f, 0x6c, 0x6f, 0x6d, 0x62,
+0x6f, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4b, 0x68, 0x61, 0x72, 0x74, 0x6f, 0x75,
+0x6d, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x44, 0x61, 0x6d, 0x61, 0x73, 0x63, 0x75, 0x73, 0x0,
+0x41, 0x73, 0x69, 0x61, 0x2f, 0x54, 0x61, 0x69, 0x70, 0x65, 0x69, 0x0, 0x41, 0x75, 0x73, 0x74,
+0x72, 0x61, 0x6c, 0x69, 0x61, 0x2f, 0x48, 0x6f, 0x62, 0x61, 0x72, 0x74, 0x20, 0x41, 0x75, 0x73,
+0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x2f, 0x43, 0x75, 0x72, 0x72, 0x69, 0x65, 0x20, 0x41, 0x6e,
+0x74, 0x61, 0x72, 0x63, 0x74, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x61, 0x63, 0x71, 0x75, 0x61, 0x72,
+0x69, 0x65, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x72, 0x61, 0x67, 0x75,
+0x61, 0x69, 0x6e, 0x61, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x39, 0x0, 0x41,
+0x73, 0x69, 0x61, 0x2f, 0x4a, 0x61, 0x79, 0x61, 0x70, 0x75, 0x72, 0x61, 0x0, 0x41, 0x73, 0x69,
+0x61, 0x2f, 0x54, 0x6f, 0x6b, 0x79, 0x6f, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f,
+0x50, 0x61, 0x6c, 0x61, 0x75, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x44, 0x69, 0x6c, 0x69, 0x0,
+0x41, 0x73, 0x69, 0x61, 0x2f, 0x54, 0x6f, 0x6d, 0x73, 0x6b, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66,
+0x69, 0x63, 0x2f, 0x54, 0x6f, 0x6e, 0x67, 0x61, 0x74, 0x61, 0x70, 0x75, 0x0, 0x41, 0x73, 0x69,
+0x61, 0x2f, 0x43, 0x68, 0x69, 0x74, 0x61, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x49,
+0x73, 0x74, 0x61, 0x6e, 0x62, 0x75, 0x6c, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f,
+0x47, 0x72, 0x61, 0x6e, 0x64, 0x5f, 0x54, 0x75, 0x72, 0x6b, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f,
+0x55, 0x6c, 0x61, 0x61, 0x6e, 0x62, 0x61, 0x61, 0x74, 0x61, 0x72, 0x20, 0x41, 0x73, 0x69, 0x61,
+0x2f, 0x43, 0x68, 0x6f, 0x69, 0x62, 0x61, 0x6c, 0x73, 0x61, 0x6e, 0x0, 0x41, 0x6d, 0x65, 0x72,
+0x69, 0x63, 0x61, 0x2f, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x61, 0x70, 0x6f, 0x6c, 0x69, 0x73,
+0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x61,
+0x2f, 0x4d, 0x61, 0x72, 0x65, 0x6e, 0x67, 0x6f, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61,
+0x2f, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x61, 0x2f, 0x56, 0x65, 0x76, 0x61, 0x79, 0x0, 0x45,
+0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b, 0x37, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61,
+0x2f, 0x43, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x6e, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61,
+0x2f, 0x44, 0x61, 0x77, 0x73, 0x6f, 0x6e, 0x5f, 0x43, 0x72, 0x65, 0x65, 0x6b, 0x20, 0x41, 0x6d,
+0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x46, 0x6f, 0x72, 0x74, 0x5f, 0x4e, 0x65, 0x6c, 0x73, 0x6f,
+0x6e, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x48, 0x65, 0x72, 0x6d, 0x6f, 0x73,
+0x69, 0x6c, 0x6c, 0x6f, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x50, 0x68, 0x6f,
+0x65, 0x6e, 0x69, 0x78, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x55, 0x54, 0x43, 0x20, 0x45, 0x74, 0x63,
+0x2f, 0x47, 0x4d, 0x54, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x31, 0x32, 0x0,
+0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x54, 0x61, 0x72, 0x61, 0x77, 0x61, 0x0, 0x50,
+0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x4d, 0x61, 0x6a, 0x75, 0x72, 0x6f, 0x20, 0x50, 0x61,
+0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x4b, 0x77, 0x61, 0x6a, 0x61, 0x6c, 0x65, 0x69, 0x6e, 0x0,
+0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x4e, 0x61, 0x75, 0x72, 0x75, 0x0, 0x50, 0x61,
+0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x46, 0x75, 0x6e, 0x61, 0x66, 0x75, 0x74, 0x69, 0x0, 0x50,
+0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x57, 0x61, 0x6b, 0x65, 0x0, 0x50, 0x61, 0x63, 0x69,
+0x66, 0x69, 0x63, 0x2f, 0x57, 0x61, 0x6c, 0x6c, 0x69, 0x73, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47,
+0x4d, 0x54, 0x2d, 0x31, 0x33, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x45, 0x6e,
+0x64, 0x65, 0x72, 0x62, 0x75, 0x72, 0x79, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f,
+0x46, 0x61, 0x6b, 0x61, 0x6f, 0x66, 0x6f, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b,
+0x32, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4e, 0x6f, 0x72, 0x6f, 0x6e, 0x68,
+0x61, 0x0, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x2f, 0x53, 0x6f, 0x75, 0x74, 0x68,
+0x5f, 0x47, 0x65, 0x6f, 0x72, 0x67, 0x69, 0x61, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54,
+0x2b, 0x38, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x50, 0x69, 0x74, 0x63, 0x61,
+0x69, 0x72, 0x6e, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b, 0x39, 0x0, 0x50, 0x61,
+0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x47, 0x61, 0x6d, 0x62, 0x69, 0x65, 0x72, 0x0, 0x45, 0x74,
+0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b, 0x31, 0x31, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63,
+0x2f, 0x50, 0x61, 0x67, 0x6f, 0x5f, 0x50, 0x61, 0x67, 0x6f, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66,
+0x69, 0x63, 0x2f, 0x4e, 0x69, 0x75, 0x65, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f,
+0x4d, 0x69, 0x64, 0x77, 0x61, 0x79, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43,
+0x61, 0x72, 0x61, 0x63, 0x61, 0x73, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x56, 0x6c, 0x61, 0x64,
+0x69, 0x76, 0x6f, 0x73, 0x74, 0x6f, 0x6b, 0x20, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x55, 0x73, 0x74,
+0x2d, 0x4e, 0x65, 0x72, 0x61, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x56, 0x6f, 0x6c,
+0x67, 0x6f, 0x67, 0x72, 0x61, 0x64, 0x0, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61,
+0x2f, 0x50, 0x65, 0x72, 0x74, 0x68, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x31,
+0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x6c, 0x67, 0x69, 0x65, 0x72, 0x73, 0x0,
+0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x75, 0x61, 0x6e, 0x64, 0x61, 0x0, 0x41, 0x66,
+0x72, 0x69, 0x63, 0x61, 0x2f, 0x50, 0x6f, 0x72, 0x74, 0x6f, 0x2d, 0x4e, 0x6f, 0x76, 0x6f, 0x0,
+0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x6f, 0x75, 0x61, 0x6c, 0x61, 0x0, 0x41, 0x66,
+0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x61, 0x6e, 0x67, 0x75, 0x69, 0x0, 0x41, 0x66, 0x72, 0x69,
+0x63, 0x61, 0x2f, 0x4e, 0x64, 0x6a, 0x61, 0x6d, 0x65, 0x6e, 0x61, 0x0, 0x41, 0x66, 0x72, 0x69,
+0x63, 0x61, 0x2f, 0x42, 0x72, 0x61, 0x7a, 0x7a, 0x61, 0x76, 0x69, 0x6c, 0x6c, 0x65, 0x0, 0x41,
+0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4b, 0x69, 0x6e, 0x73, 0x68, 0x61, 0x73, 0x61, 0x0, 0x41,
+0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x61, 0x6c, 0x61, 0x62, 0x6f, 0x0, 0x41, 0x66, 0x72,
+0x69, 0x63, 0x61, 0x2f, 0x4c, 0x69, 0x62, 0x72, 0x65, 0x76, 0x69, 0x6c, 0x6c, 0x65, 0x0, 0x41,
+0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x61, 0x67, 0x6f, 0x73, 0x0, 0x41, 0x66, 0x72, 0x69,
+0x63, 0x61, 0x2f, 0x4e, 0x69, 0x61, 0x6d, 0x65, 0x79, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61,
+0x2f, 0x54, 0x75, 0x6e, 0x69, 0x73, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x41, 0x6e,
+0x64, 0x6f, 0x72, 0x72, 0x61, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x56, 0x69, 0x65,
+0x6e, 0x6e, 0x61, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x42, 0x65, 0x72, 0x6c, 0x69,
+0x6e, 0x20, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x65,
+0x6e, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x47, 0x69, 0x62, 0x72, 0x61, 0x6c, 0x74,
+0x61, 0x72, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x52, 0x6f, 0x6d, 0x65, 0x0, 0x45,
+0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x56, 0x61, 0x64, 0x75, 0x7a, 0x0, 0x45, 0x75, 0x72, 0x6f,
+0x70, 0x65, 0x2f, 0x4c, 0x75, 0x78, 0x65, 0x6d, 0x62, 0x6f, 0x75, 0x72, 0x67, 0x0, 0x45, 0x75,
+0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4d, 0x61, 0x6c, 0x74, 0x61, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70,
+0x65, 0x2f, 0x4d, 0x6f, 0x6e, 0x61, 0x63, 0x6f, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f,
+0x41, 0x6d, 0x73, 0x74, 0x65, 0x72, 0x64, 0x61, 0x6d, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65,
+0x2f, 0x4f, 0x73, 0x6c, 0x6f, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x53, 0x61, 0x6e,
+0x5f, 0x4d, 0x61, 0x72, 0x69, 0x6e, 0x6f, 0x0, 0x41, 0x72, 0x63, 0x74, 0x69, 0x63, 0x2f, 0x4c,
+0x6f, 0x6e, 0x67, 0x79, 0x65, 0x61, 0x72, 0x62, 0x79, 0x65, 0x6e, 0x0, 0x45, 0x75, 0x72, 0x6f,
+0x70, 0x65, 0x2f, 0x53, 0x74, 0x6f, 0x63, 0x6b, 0x68, 0x6f, 0x6c, 0x6d, 0x0, 0x45, 0x75, 0x72,
+0x6f, 0x70, 0x65, 0x2f, 0x5a, 0x75, 0x72, 0x69, 0x63, 0x68, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70,
+0x65, 0x2f, 0x56, 0x61, 0x74, 0x69, 0x63, 0x61, 0x6e, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x48,
+0x6f, 0x76, 0x64, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x35, 0x0, 0x41, 0x6e,
+0x74, 0x61, 0x72, 0x63, 0x74, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x61, 0x77, 0x73, 0x6f, 0x6e, 0x0,
+0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x2f, 0x4b, 0x65, 0x72, 0x67, 0x75, 0x65, 0x6c, 0x65, 0x6e,
+0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4f, 0x72, 0x61, 0x6c, 0x20, 0x41, 0x73, 0x69, 0x61, 0x2f,
+0x41, 0x71, 0x74, 0x61, 0x75, 0x20, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x41, 0x71, 0x74, 0x6f, 0x62,
+0x65, 0x20, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x41, 0x74, 0x79, 0x72, 0x61, 0x75, 0x0, 0x49, 0x6e,
+0x64, 0x69, 0x61, 0x6e, 0x2f, 0x4d, 0x61, 0x6c, 0x64, 0x69, 0x76, 0x65, 0x73, 0x0, 0x41, 0x73,
+0x69, 0x61, 0x2f, 0x44, 0x75, 0x73, 0x68, 0x61, 0x6e, 0x62, 0x65, 0x0, 0x41, 0x73, 0x69, 0x61,
+0x2f, 0x41, 0x73, 0x68, 0x67, 0x61, 0x62, 0x61, 0x74, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x54,
+0x61, 0x73, 0x68, 0x6b, 0x65, 0x6e, 0x74, 0x20, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x53, 0x61, 0x6d,
+0x61, 0x72, 0x6b, 0x61, 0x6e, 0x64, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x48, 0x65, 0x62, 0x72,
+0x6f, 0x6e, 0x20, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x47, 0x61, 0x7a, 0x61, 0x0, 0x45, 0x74, 0x63,
+0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x31, 0x30, 0x0, 0x41, 0x6e, 0x74, 0x61, 0x72, 0x63, 0x74, 0x69,
+0x63, 0x61, 0x2f, 0x44, 0x75, 0x6d, 0x6f, 0x6e, 0x74, 0x44, 0x55, 0x72, 0x76, 0x69, 0x6c, 0x6c,
+0x65, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x47, 0x75, 0x61, 0x6d, 0x0, 0x50,
+0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x54, 0x72, 0x75, 0x6b, 0x0, 0x50, 0x61, 0x63, 0x69,
+0x66, 0x69, 0x63, 0x2f, 0x53, 0x61, 0x69, 0x70, 0x61, 0x6e, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66,
+0x69, 0x63, 0x2f, 0x50, 0x6f, 0x72, 0x74, 0x5f, 0x4d, 0x6f, 0x72, 0x65, 0x73, 0x62, 0x79, 0x0,
+0x41, 0x73, 0x69, 0x61, 0x2f, 0x59, 0x61, 0x6b, 0x75, 0x74, 0x73, 0x6b, 0x20, 0x41, 0x73, 0x69,
+0x61, 0x2f, 0x4b, 0x68, 0x61, 0x6e, 0x64, 0x79, 0x67, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69,
+0x63, 0x61, 0x2f, 0x57, 0x68, 0x69, 0x74, 0x65, 0x68, 0x6f, 0x72, 0x73, 0x65, 0x20, 0x41, 0x6d,
+0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x61, 0x77, 0x73, 0x6f, 0x6e, 0x0, 0x41, 0x6d, 0x65,
+0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x0, 0x41,
+0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x75, 0x65, 0x6e, 0x6f, 0x73, 0x5f, 0x41, 0x69,
+0x72, 0x65, 0x73, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x41, 0x73, 0x74, 0x72, 0x61,
+0x6b, 0x68, 0x61, 0x6e, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x48, 0x61, 0x6c,
+0x69, 0x66, 0x61, 0x78, 0x0, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x2f, 0x53,
+0x79, 0x64, 0x6e, 0x65, 0x79, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x52, 0x65,
+0x67, 0x69, 0x6e, 0x61, 0x0, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x2f, 0x41,
+0x64, 0x65, 0x6c, 0x61, 0x69, 0x64, 0x65, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x41, 0x6c, 0x6d,
+0x61, 0x74, 0x79, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x75, 0x69, 0x61,
+0x62, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x68, 0x69, 0x63, 0x61,
+0x67, 0x6f, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x65, 0x78, 0x69, 0x63,
+0x6f, 0x5f, 0x43, 0x69, 0x74, 0x79, 0x0, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61,
+0x2f, 0x42, 0x72, 0x69, 0x73, 0x62, 0x61, 0x6e, 0x65, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63,
+0x61, 0x2f, 0x4e, 0x65, 0x77, 0x5f, 0x59, 0x6f, 0x72, 0x6b, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70,
+0x65, 0x2f, 0x4b, 0x69, 0x65, 0x76, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x44,
+0x65, 0x6e, 0x76, 0x65, 0x72, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4b, 0x72, 0x61, 0x73, 0x6e,
+0x6f, 0x79, 0x61, 0x72, 0x73, 0x6b, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x54,
+0x69, 0x6a, 0x75, 0x61, 0x6e, 0x61, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4b, 0x61, 0x6d, 0x63,
+0x68, 0x61, 0x74, 0x6b, 0x61, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4d, 0x6f, 0x73,
+0x63, 0x6f, 0x77, 0x0, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x2f, 0x48, 0x6f,
+0x62, 0x61, 0x72, 0x74, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x55, 0x6c, 0x61, 0x61, 0x6e, 0x62,
+0x61, 0x61, 0x74, 0x61, 0x72, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x49, 0x6e,
+0x64, 0x69, 0x61, 0x6e, 0x61, 0x70, 0x6f, 0x6c, 0x69, 0x73, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x55,
+0x54, 0x43, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x56, 0x6c, 0x61, 0x64, 0x69, 0x76, 0x6f, 0x73,
+0x74, 0x6f, 0x6b, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x42, 0x65, 0x72, 0x6c, 0x69,
+0x6e, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x54, 0x61, 0x73, 0x68, 0x6b, 0x65, 0x6e, 0x74, 0x0,
+0x41, 0x73, 0x69, 0x61, 0x2f, 0x48, 0x65, 0x62, 0x72, 0x6f, 0x6e, 0x0, 0x41, 0x73, 0x69, 0x61,
+0x2f, 0x59, 0x61, 0x6b, 0x75, 0x74, 0x73, 0x6b, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61,
+0x2f, 0x57, 0x68, 0x69, 0x74, 0x65, 0x68, 0x6f, 0x72, 0x73, 0x65, 0x0, 0x55, 0x54, 0x43, 0x2d,
+0x31, 0x34, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x31, 0x33, 0x3a, 0x30, 0x30, 0x0,
+0x55, 0x54, 0x43, 0x2d, 0x31, 0x32, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x31, 0x31,
+0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x31, 0x30, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54,
+0x43, 0x2d, 0x30, 0x39, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x30, 0x38, 0x3a, 0x30,
+0x30, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x30, 0x37, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2d,
+0x30, 0x36, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x30, 0x35, 0x3a, 0x30, 0x30, 0x0,
+0x55, 0x54, 0x43, 0x2d, 0x30, 0x34, 0x3a, 0x33, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x30, 0x34,
+0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x30, 0x33, 0x3a, 0x33, 0x30, 0x0, 0x55, 0x54,
+0x43, 0x2d, 0x30, 0x33, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x30, 0x32, 0x3a, 0x30,
+0x30, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x30, 0x31, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x20,
+0x55, 0x54, 0x43, 0x2b, 0x30, 0x30, 0x3a, 0x30, 0x30, 0x20, 0x55, 0x54, 0x43, 0x2d, 0x30, 0x30,
+0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x31, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54,
+0x43, 0x2b, 0x30, 0x32, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x33, 0x3a, 0x30,
+0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x33, 0x3a, 0x33, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2b,
+0x30, 0x34, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x34, 0x3a, 0x33, 0x30, 0x0,
+0x55, 0x54, 0x43, 0x2b, 0x30, 0x35, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x35,
+0x3a, 0x33, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x35, 0x3a, 0x34, 0x35, 0x0, 0x55, 0x54,
+0x43, 0x2b, 0x30, 0x36, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x36, 0x3a, 0x33,
+0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x37, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2b,
+0x30, 0x38, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x38, 0x3a, 0x33, 0x30, 0x0,
+0x55, 0x54, 0x43, 0x2b, 0x30, 0x39, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x39,
+0x3a, 0x33, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x31, 0x30, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54,
+0x43, 0x2b, 0x31, 0x31, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x31, 0x32, 0x3a, 0x30,
+0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x31, 0x33, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2b,
+0x31, 0x34, 0x3a, 0x30, 0x30, 0x0
};
// GENERATED PART ENDS HERE
-inline QByteArrayView QWindowsData::windowsId() const { return windowsIdData + windowsIdIndex; }
-inline QByteArrayView QWindowsData::ianaId() const { return ianaIdData + ianaIdIndex; }
-inline QByteArrayView QUtcData::id() const { return ianaIdData + ianaIdIndex; }
-inline QLatin1String QZoneData::id() const { return QLatin1String(ianaIdData + ianaIdIndex); }
+constexpr QByteArrayView WindowsData::windowsId() const { return windowsIdData + windowsIdIndex; }
+// Each of the following returns a space-joined sequence of IANA IDs:
+constexpr QByteArrayView WindowsData::ianaId() const { return ianaIdData + ianaIdIndex; }
+constexpr QByteArrayView UtcData::id() const { return ianaIdData + ianaIdIndex; }
+constexpr QLatin1StringView ZoneData::id() const
+{ return QLatin1StringView(ianaIdData + ianaIdIndex); }
+
+} // namespace QtTimeZoneCldr
QT_END_NAMESPACE
diff --git a/src/corelib/time/qtimezoneprivate_icu.cpp b/src/corelib/time/qtimezoneprivate_icu.cpp
index 798f231219..1a3baa70d0 100644
--- a/src/corelib/time/qtimezoneprivate_icu.cpp
+++ b/src/corelib/time/qtimezoneprivate_icu.cpp
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 John Layt <jlayt@kde.org>
-** Copyright (C) 2021 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2013 John Layt <jlayt@kde.org>
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qtimezone.h"
#include "qtimezoneprivate_p.h"
@@ -183,14 +147,13 @@ static bool ucalOffsetsAtTime(UCalendar *m_ucal, qint64 atMSecsSinceEpoch,
return false;
}
-// ICU Draft api in v50, should be stable in ICU v51. Available in C++ api from ICU v3.8
-#if U_ICU_VERSION_MAJOR_NUM == 50
+#if U_ICU_VERSION_MAJOR_NUM >= 50
// Qt wrapper around qt_ucal_getTimeZoneTransitionDate & ucal_get
static QTimeZonePrivate::Data ucalTimeZoneTransition(UCalendar *m_ucal,
UTimeZoneTransitionType type,
qint64 atMSecsSinceEpoch)
{
- QTimeZonePrivate::Data tran = QTimeZonePrivate::invalidData();
+ QTimeZonePrivate::Data tran;
// Clone the ucal so we don't change the shared object
UErrorCode status = U_ZERO_ERROR;
@@ -207,6 +170,14 @@ static QTimeZonePrivate::Data ucalTimeZoneTransition(UCalendar *m_ucal,
status = U_ZERO_ERROR;
bool ok = ucal_getTimeZoneTransitionDate(ucal, type, &tranMSecs, &status);
+ // Catch a known violation (in ICU 67) of the specified behavior:
+ if (U_SUCCESS(status) && ok && type == UCAL_TZ_TRANSITION_NEXT) {
+ // At the end of time, that can "succeed" with tranMSecs ==
+ // atMSecsSinceEpoch, which should be treated as a failure.
+ // (At the start of time, previous correctly fails.)
+ ok = qint64(tranMSecs) > atMSecsSinceEpoch;
+ }
+
// Set the transition time to find the offsets for
if (U_SUCCESS(status) && ok) {
status = U_ZERO_ERROR;
@@ -283,8 +254,8 @@ QIcuTimeZonePrivate::QIcuTimeZonePrivate()
QIcuTimeZonePrivate::QIcuTimeZonePrivate(const QByteArray &ianaId)
: m_ucal(nullptr)
{
- // Need to check validity here as ICu will create a GMT tz if name is invalid
- if (availableTimeZoneIds().contains(ianaId))
+ // ICU misleadingly maps invalid IDs to GMT.
+ if (isTimeZoneIdAvailable(ianaId))
init(ianaId);
}
@@ -330,28 +301,25 @@ QString QIcuTimeZonePrivate::displayName(QTimeZone::TimeType timeType,
QTimeZone::NameType nameType,
const QLocale &locale) const
{
- // Return standard offset format name as ICU C api doesn't support it yet
+ // Base class has handled OffsetName if we came via the other overload.
if (nameType == QTimeZone::OffsetName) {
- const Data nowData = data(QDateTime::currentMSecsSinceEpoch());
- // We can't use transitions reliably to find out right dst offset
- // Instead use dst offset api to try get it if needed
+ int offset = standardTimeOffset(QDateTime::currentMSecsSinceEpoch());
+ // We can't use transitions reliably to find out right DST offset.
+ // Instead use DST offset API to try to get it, when needed:
if (timeType == QTimeZone::DaylightTime)
- return isoOffsetFormat(nowData.standardTimeOffset + ucalDaylightOffset(m_id));
- else
- return isoOffsetFormat(nowData.standardTimeOffset);
+ offset += ucalDaylightOffset(m_id);
+ // This is only valid for times since the most recent standard offset
+ // change; for earlier times, caller must use the other overload.
+
+ // Use our own formating for offset names (ICU C API doesn't support it
+ // and we may as well be self-consistent anyway).
+ return isoOffsetFormat(offset);
}
+ // Technically this may be suspect, if locale isn't QLocale(), since that's
+ // what we used when constructing m_ucal; does ICU cope with inconsistency ?
return ucalTimeZoneDisplayName(m_ucal, timeType, nameType, locale.name());
}
-QString QIcuTimeZonePrivate::abbreviation(qint64 atMSecsSinceEpoch) const
-{
- // TODO No ICU API, use short name instead
- if (isDaylightTime(atMSecsSinceEpoch))
- return displayName(QTimeZone::DaylightTime, QTimeZone::ShortName, QLocale());
- else
- return displayName(QTimeZone::StandardTime, QTimeZone::ShortName, QLocale());
-}
-
int QIcuTimeZonePrivate::offsetFromUtc(qint64 atMSecsSinceEpoch) const
{
int stdOffset = 0;
@@ -378,8 +346,17 @@ int QIcuTimeZonePrivate::daylightTimeOffset(qint64 atMSecsSinceEpoch) const
bool QIcuTimeZonePrivate::hasDaylightTime() const
{
- // TODO No direct ICU C api, work-around below not reliable? Find a better way?
- return (ucalDaylightOffset(m_id) != 0);
+ if (ucalDaylightOffset(m_id) != 0)
+ return true;
+#if U_ICU_VERSION_MAJOR_NUM >= 50
+ for (qint64 when = minMSecs(); when != invalidMSecs(); ) {
+ auto data = nextTransition(when);
+ if (data.daylightTimeOffset && data.daylightTimeOffset != invalidSeconds())
+ return true;
+ when = data.atMSecsSinceEpoch;
+ }
+#endif
+ return false;
}
bool QIcuTimeZonePrivate::isDaylightTime(qint64 atMSecsSinceEpoch) const
@@ -407,17 +384,18 @@ bool QIcuTimeZonePrivate::isDaylightTime(qint64 atMSecsSinceEpoch) const
QTimeZonePrivate::Data QIcuTimeZonePrivate::data(qint64 forMSecsSinceEpoch) const
{
// Available in ICU C++ api, and draft C api in v50
- // TODO When v51 released see if api is stable
- QTimeZonePrivate::Data data = invalidData();
-#if U_ICU_VERSION_MAJOR_NUM == 50
+ QTimeZonePrivate::Data data;
+#if U_ICU_VERSION_MAJOR_NUM >= 50
data = ucalTimeZoneTransition(m_ucal, UCAL_TZ_TRANSITION_PREVIOUS_INCLUSIVE,
forMSecsSinceEpoch);
-#else
- ucalOffsetsAtTime(m_ucal, forMSecsSinceEpoch, &data.standardTimeOffset,
- &data.daylightTimeOffset);
- data.offsetFromUtc = data.standardTimeOffset + data.daylightTimeOffset;
- data.abbreviation = abbreviation(forMSecsSinceEpoch);
-#endif // U_ICU_VERSION_MAJOR_NUM == 50
+ if (data.atMSecsSinceEpoch == invalidMSecs()) // before first transition
+#endif
+ {
+ ucalOffsetsAtTime(m_ucal, forMSecsSinceEpoch, &data.standardTimeOffset,
+ &data.daylightTimeOffset);
+ data.offsetFromUtc = data.standardTimeOffset + data.daylightTimeOffset;
+ data.abbreviation = abbreviation(forMSecsSinceEpoch);
+ }
data.atMSecsSinceEpoch = forMSecsSinceEpoch;
return data;
}
@@ -425,36 +403,33 @@ QTimeZonePrivate::Data QIcuTimeZonePrivate::data(qint64 forMSecsSinceEpoch) cons
bool QIcuTimeZonePrivate::hasTransitions() const
{
// Available in ICU C++ api, and draft C api in v50
- // TODO When v51 released see if api is stable
-#if U_ICU_VERSION_MAJOR_NUM == 50
+#if U_ICU_VERSION_MAJOR_NUM >= 50
return true;
#else
return false;
-#endif // U_ICU_VERSION_MAJOR_NUM == 50
+#endif
}
QTimeZonePrivate::Data QIcuTimeZonePrivate::nextTransition(qint64 afterMSecsSinceEpoch) const
{
// Available in ICU C++ api, and draft C api in v50
- // TODO When v51 released see if api is stable
-#if U_ICU_VERSION_MAJOR_NUM == 50
+#if U_ICU_VERSION_MAJOR_NUM >= 50
return ucalTimeZoneTransition(m_ucal, UCAL_TZ_TRANSITION_NEXT, afterMSecsSinceEpoch);
#else
Q_UNUSED(afterMSecsSinceEpoch);
- return invalidData();
-#endif // U_ICU_VERSION_MAJOR_NUM == 50
+ return {};
+#endif
}
QTimeZonePrivate::Data QIcuTimeZonePrivate::previousTransition(qint64 beforeMSecsSinceEpoch) const
{
// Available in ICU C++ api, and draft C api in v50
- // TODO When v51 released see if api is stable
-#if U_ICU_VERSION_MAJOR_NUM == 50
+#if U_ICU_VERSION_MAJOR_NUM >= 50
return ucalTimeZoneTransition(m_ucal, UCAL_TZ_TRANSITION_PREVIOUS, beforeMSecsSinceEpoch);
#else
Q_UNUSED(beforeMSecsSinceEpoch);
- return invalidData();
-#endif // U_ICU_VERSION_MAJOR_NUM == 50
+ return {};
+#endif
}
QByteArray QIcuTimeZonePrivate::systemTimeZoneId() const
@@ -464,6 +439,25 @@ QByteArray QIcuTimeZonePrivate::systemTimeZoneId() const
return ucalDefaultTimeZoneId();
}
+bool QIcuTimeZonePrivate::isTimeZoneIdAvailable(const QByteArray &ianaId) const
+{
+ const QString ianaStr = QString::fromUtf8(ianaId);
+ const UChar *const name = reinterpret_cast<const UChar *>(ianaStr.constData());
+ // We are not interested in the value, but we have to pass something.
+ // No known IANA zone name is (up to 2023) longer than 30 characters.
+ constexpr size_t size = 64;
+ UChar buffer[size];
+
+ // TODO: convert to ucal_getIanaTimeZoneID(), new draft in ICU 74, once we
+ // can rely on its availability, assuming it works the same once not draft.
+ UErrorCode status = U_ZERO_ERROR;
+ UBool isSys = false;
+ // Returns the length of the IANA zone name (but we don't care):
+ ucal_getCanonicalTimeZoneID(name, ianaStr.size(), buffer, size, &isSys, &status);
+ // We're only interested if the result is a "system" (i.e. IANA) ID:
+ return isSys;
+}
+
QList<QByteArray> QIcuTimeZonePrivate::availableTimeZoneIds() const
{
UErrorCode status = U_ZERO_ERROR;
@@ -477,7 +471,7 @@ QList<QByteArray> QIcuTimeZonePrivate::availableTimeZoneIds() const
QList<QByteArray> QIcuTimeZonePrivate::availableTimeZoneIds(QLocale::Territory territory) const
{
- const QLatin1String regionCode = QLocalePrivate::territoryToCode(territory);
+ const QLatin1StringView regionCode = QLocalePrivate::territoryToCode(territory);
const QByteArray regionCodeUtf8 = QString(regionCode).toUtf8();
UErrorCode status = U_ZERO_ERROR;
UEnumeration *uenum = ucal_openCountryTimeZones(regionCodeUtf8.data(), &status);
diff --git a/src/corelib/time/qtimezoneprivate_mac.mm b/src/corelib/time/qtimezoneprivate_mac.mm
index 1fb48a31d3..da7e24d614 100644
--- a/src/corelib/time/qtimezoneprivate_mac.mm
+++ b/src/corelib/time/qtimezoneprivate_mac.mm
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2019 The Qt Company Ltd.
-** Copyright (C) 2013 John Layt <jlayt@kde.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2019 The Qt Company Ltd.
+// Copyright (C) 2013 John Layt <jlayt@kde.org>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qtimezone.h"
#include "qtimezoneprivate_p.h"
@@ -55,7 +19,8 @@ QT_BEGIN_NAMESPACE
/*
Private
- OS X system implementation
+ Darwin system implementation
+ https://developer.apple.com/documentation/foundation/nstimezone
*/
// Create the system default time zone
@@ -92,12 +57,10 @@ QMacTimeZonePrivate *QMacTimeZonePrivate::clone() const
void QMacTimeZonePrivate::init(const QByteArray &ianaId)
{
- if (availableTimeZoneIds().contains(ianaId)) {
- m_nstz = [[NSTimeZone timeZoneWithName:QString::fromUtf8(ianaId).toNSString()] retain];
- if (m_nstz)
- m_id = ianaId;
- }
- if (!m_nstz) {
+ m_nstz = [[NSTimeZone timeZoneWithName:QString::fromUtf8(ianaId).toNSString()] retain];
+ if (m_nstz) {
+ m_id = ianaId;
+ } else {
// macOS has been seen returning a systemTimeZone which reports its name
// as Asia/Kolkata, which doesn't appear in knownTimeZoneNames (which
// calls the zone Asia/Calcutta). So explicitly check for the name
@@ -149,7 +112,7 @@ QString QMacTimeZonePrivate::displayName(QTimeZone::TimeType timeType,
style = NSTimeZoneNameStyleStandard;
break;
case QTimeZone::OffsetName :
- // Unreachable
+ Q_UNREACHABLE();
break;
}
@@ -185,7 +148,7 @@ int QMacTimeZonePrivate::daylightTimeOffset(qint64 atMSecsSinceEpoch) const
bool QMacTimeZonePrivate::hasDaylightTime() const
{
- // TODO No Mac API, assume if has transitions
+ // TODO Scan transitions for one after which isDaylightSavingTimeForDate is true.
return hasTransitions();
}
@@ -227,7 +190,7 @@ QTimeZonePrivate::Data QMacTimeZonePrivate::nextTransition(qint64 afterMSecsSinc
const NSTimeInterval nextSecs = nextDate.timeIntervalSince1970;
if (nextDate == nil || nextSecs <= seconds) {
[nextDate release];
- return invalidData();
+ return {};
}
tran.atMSecsSinceEpoch = nextSecs * 1000;
tran.offsetFromUtc = [m_nstz secondsFromGMTForDate:nextDate];
@@ -240,7 +203,7 @@ QTimeZonePrivate::Data QMacTimeZonePrivate::nextTransition(qint64 afterMSecsSinc
QTimeZonePrivate::Data QMacTimeZonePrivate::previousTransition(qint64 beforeMSecsSinceEpoch) const
{
// The native API only lets us search forward, so we need to find an early-enough start:
- const NSTimeInterval lowerBound = std::numeric_limits<NSTimeInterval>::lowest();
+ constexpr NSTimeInterval lowerBound = std::numeric_limits<NSTimeInterval>::lowest();
const qint64 endSecs = beforeMSecsSinceEpoch / 1000;
const int year = 366 * 24 * 3600; // a (long) year, in seconds
NSTimeInterval prevSecs = endSecs; // sentinel for later check
@@ -310,7 +273,7 @@ QTimeZonePrivate::Data QMacTimeZonePrivate::previousTransition(qint64 beforeMSec
return data(qint64(prevSecs * 1e3));
// No transition data; or first transition later than requested time.
- return invalidData();
+ return {};
}
QByteArray QMacTimeZonePrivate::systemTimeZoneId() const
@@ -321,6 +284,12 @@ QByteArray QMacTimeZonePrivate::systemTimeZoneId() const
return QString::fromNSString(NSTimeZone.systemTimeZone.name).toUtf8();
}
+bool QMacTimeZonePrivate::isTimeZoneIdAvailable(const QByteArray& ianaId) const
+{
+ QMacAutoReleasePool pool;
+ return [NSTimeZone timeZoneWithName:QString::fromUtf8(ianaId).toNSString()] != nil;
+}
+
QList<QByteArray> QMacTimeZonePrivate::availableTimeZoneIds() const
{
NSEnumerator *enumerator = NSTimeZone.knownTimeZoneNames.objectEnumerator;
diff --git a/src/corelib/time/qtimezoneprivate_p.h b/src/corelib/time/qtimezoneprivate_p.h
index 129f0343b3..506acaa1f7 100644
--- a/src/corelib/time/qtimezoneprivate_p.h
+++ b/src/corelib/time/qtimezoneprivate_p.h
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Copyright (C) 2013 John Layt <jlayt@kde.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2022 The Qt Company Ltd.
+// Copyright (C) 2013 John Layt <jlayt@kde.org>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QTIMEZONEPRIVATE_P_H
@@ -56,6 +20,7 @@
#include "qlist.h"
#include "qtimezone.h"
#include "private/qlocale_p.h"
+#include "private/qdatetime_p.h"
#if QT_CONFIG(icu)
#include <unicode/ucal.h>
@@ -73,18 +38,32 @@ Q_FORWARD_DECLARE_OBJC_CLASS(NSTimeZone);
#include <QJniObject>
#endif
+QT_REQUIRE_CONFIG(timezone);
QT_BEGIN_NAMESPACE
class Q_AUTOTEST_EXPORT QTimeZonePrivate : public QSharedData
{
public:
- //Version of QTimeZone::OffsetData struct using msecs for efficiency
+ // Version of QTimeZone::OffsetData struct using msecs for efficiency
struct Data {
QString abbreviation;
qint64 atMSecsSinceEpoch;
int offsetFromUtc;
int standardTimeOffset;
int daylightTimeOffset;
+ Data()
+ : atMSecsSinceEpoch(QTimeZonePrivate::invalidMSecs()),
+ offsetFromUtc(QTimeZonePrivate::invalidSeconds()),
+ standardTimeOffset(QTimeZonePrivate::invalidSeconds()),
+ daylightTimeOffset(QTimeZonePrivate::invalidSeconds())
+ {}
+ Data(const QString &name, qint64 when, int offset, int standard)
+ : abbreviation(name),
+ atMSecsSinceEpoch(when),
+ offsetFromUtc(offset),
+ standardTimeOffset(standard),
+ daylightTimeOffset(offset - standard)
+ {}
};
typedef QList<Data> DataList;
@@ -120,7 +99,8 @@ public:
virtual bool isDaylightTime(qint64 atMSecsSinceEpoch) const;
virtual Data data(qint64 forMSecsSinceEpoch) const;
- Data dataForLocalTime(qint64 forLocalMSecs, int hint) const;
+ QDateTimePrivate::ZoneState stateAtZoneTime(qint64 forLocalMSecs,
+ QDateTimePrivate::TransitionOptions resolve) const;
virtual bool hasTransitions() const;
virtual Data nextTransition(qint64 afterMSecsSinceEpoch) const;
@@ -137,11 +117,14 @@ public:
virtual void serialize(QDataStream &ds) const;
// Static Utility Methods
- static inline qint64 maxMSecs() { return std::numeric_limits<qint64>::max(); }
- static inline qint64 minMSecs() { return std::numeric_limits<qint64>::min() + 1; }
- static inline qint64 invalidMSecs() { return std::numeric_limits<qint64>::min(); }
- static inline qint64 invalidSeconds() { return std::numeric_limits<int>::min(); }
- static Data invalidData();
+ [[nodiscard]] static constexpr qint64 maxMSecs()
+ { return (std::numeric_limits<qint64>::max)(); }
+ [[nodiscard]] static constexpr qint64 minMSecs()
+ { return (std::numeric_limits<qint64>::min)() + 1; }
+ [[nodiscard]] static constexpr qint64 invalidMSecs()
+ { return (std::numeric_limits<qint64>::min)(); }
+ [[nodiscard]] static constexpr qint64 invalidSeconds()
+ { return (std::numeric_limits<int>::min)(); }
static QTimeZone::OffsetData invalidOffsetData();
static QTimeZone::OffsetData toOffsetData(const Data &data);
static bool isValidId(const QByteArray &ianaId);
@@ -191,7 +174,7 @@ public:
virtual ~QUtcTimeZonePrivate();
// Fall-back for UTC[+-]\d+(:\d+){,2} IDs.
- static qint64 offsetFromUtcString(const QByteArray &id);
+ static qint64 offsetFromUtcString(QByteArrayView id);
QUtcTimeZonePrivate *clone() const override;
@@ -200,6 +183,7 @@ public:
QLocale::Territory territory() const override;
QString comment() const override;
+ using QTimeZonePrivate::displayName;
QString displayName(QTimeZone::TimeType timeType,
QTimeZone::NameType nameType,
const QLocale &locale) const override;
@@ -230,6 +214,9 @@ private:
int m_offsetFromUtc;
};
+// TODO: shuffle (almost reverse) order of and rework #if-ery here to use #elif
+// and match the #if-ery in each of QTZ's newBackendTimeZone() cascades for
+// backend selection.
#if QT_CONFIG(icu)
class Q_AUTOTEST_EXPORT QIcuTimeZonePrivate final : public QTimeZonePrivate
{
@@ -243,9 +230,9 @@ public:
QIcuTimeZonePrivate *clone() const override;
+ using QTimeZonePrivate::displayName;
QString displayName(QTimeZone::TimeType timeType, QTimeZone::NameType nameType,
const QLocale &locale) const override;
- QString abbreviation(qint64 atMSecsSinceEpoch) const override;
int offsetFromUtc(qint64 atMSecsSinceEpoch) const override;
int standardTimeOffset(qint64 atMSecsSinceEpoch) const override;
@@ -262,6 +249,7 @@ public:
QByteArray systemTimeZoneId() const override;
+ bool isTimeZoneIdAvailable(const QByteArray &ianaId) const override;
QList<QByteArray> availableTimeZoneIds() const override;
QList<QByteArray> availableTimeZoneIds(QLocale::Territory territory) const override;
QList<QByteArray> availableTimeZoneIds(int offsetFromUtc) const override;
@@ -271,7 +259,7 @@ private:
UCalendar *m_ucal;
};
-#endif
+#endif // ICU
#if defined(Q_OS_UNIX) && !defined(Q_OS_DARWIN) && !defined(Q_OS_ANDROID)
struct QTzTransitionTime
@@ -282,9 +270,9 @@ struct QTzTransitionTime
Q_DECLARE_TYPEINFO(QTzTransitionTime, Q_PRIMITIVE_TYPE);
struct QTzTransitionRule
{
- int stdOffset;
- int dstOffset;
- quint8 abbreviationIndex;
+ int stdOffset = 0;
+ int dstOffset = 0;
+ quint8 abbreviationIndex = 0;
};
Q_DECLARE_TYPEINFO(QTzTransitionRule, Q_PRIMITIVE_TYPE);
constexpr inline bool operator==(const QTzTransitionRule &lhs, const QTzTransitionRule &rhs) noexcept
@@ -301,7 +289,7 @@ struct QTzTimeZoneCacheEntry
QList<QByteArray> m_abbreviations;
QByteArray m_posixRule;
QTzTransitionRule m_preZoneRule;
- bool m_hasDst;
+ bool m_hasDst = false;
};
class Q_AUTOTEST_EXPORT QTzTimeZonePrivate final : public QTimeZonePrivate
@@ -319,9 +307,7 @@ public:
QLocale::Territory territory() const override;
QString comment() const override;
- QString displayName(qint64 atMSecsSinceEpoch,
- QTimeZone::NameType nameType,
- const QLocale &locale) const override;
+ using QTimeZonePrivate::displayName;
QString displayName(QTimeZone::TimeType timeType,
QTimeZone::NameType nameType,
const QLocale &locale) const override;
@@ -347,20 +333,25 @@ public:
QList<QByteArray> availableTimeZoneIds(QLocale::Territory territory) const override;
private:
- void init(const QByteArray &ianaId);
+ static QByteArray staticSystemTimeZoneId();
QList<QTimeZonePrivate::Data> getPosixTransitions(qint64 msNear) const;
Data dataForTzTransition(QTzTransitionTime tran) const;
Data dataFromRule(QTzTransitionRule rule, qint64 msecsSinceEpoch) const;
#if QT_CONFIG(icu)
- mutable QSharedDataPointer<QTimeZonePrivate> m_icu;
+# ifdef __cpp_lib_is_final
+ static_assert(std::is_final<QIcuTimeZonePrivate>::value,
+ "if QIcuTimeZonePrivate isn't final, we may need to specialize "
+ "QExplicitlySharedDataPointer::clone() to call QTimeZonePrivate::clone()");
+# endif
+ mutable QExplicitlySharedDataPointer<const QIcuTimeZonePrivate> m_icu;
#endif
QTzTimeZoneCacheEntry cached_data;
- QList<QTzTransitionTime> tranCache() const { return cached_data.m_tranTimes; }
+ const QList<QTzTransitionTime> &tranCache() const { return cached_data.m_tranTimes; }
};
#endif // Q_OS_UNIX
-#ifdef Q_OS_MAC
+#ifdef Q_OS_DARWIN
class Q_AUTOTEST_EXPORT QMacTimeZonePrivate final : public QTimeZonePrivate
{
public:
@@ -375,6 +366,7 @@ public:
QString comment() const override;
+ using QTimeZonePrivate::displayName;
QString displayName(QTimeZone::TimeType timeType, QTimeZone::NameType nameType,
const QLocale &locale) const override;
QString abbreviation(qint64 atMSecsSinceEpoch) const override;
@@ -393,7 +385,7 @@ public:
Data previousTransition(qint64 beforeMSecsSinceEpoch) const override;
QByteArray systemTimeZoneId() const override;
-
+ bool isTimeZoneIdAvailable(const QByteArray &ianaId) const override;
QList<QByteArray> availableTimeZoneIds() const override;
NSTimeZone *nsTimeZone() const;
@@ -403,9 +395,9 @@ private:
NSTimeZone *m_nstz;
};
-#endif // Q_OS_MAC
+#endif // Q_OS_DARWIN
-#ifdef Q_OS_WIN
+#if defined(Q_OS_WIN) && !QT_CONFIG(icu)
class Q_AUTOTEST_EXPORT QWinTimeZonePrivate final : public QTimeZonePrivate
{
public:
@@ -428,6 +420,7 @@ public:
QString comment() const override;
+ using QTimeZonePrivate::displayName;
QString displayName(QTimeZone::TimeType timeType, QTimeZone::NameType nameType,
const QLocale &locale) const override;
QString abbreviation(qint64 atMSecsSinceEpoch) const override;
@@ -449,10 +442,11 @@ public:
QList<QByteArray> availableTimeZoneIds() const override;
-private:
- void init(const QByteArray &ianaId);
+ // For use within implementation's TransitionTimePair:
QTimeZonePrivate::Data ruleToData(const QWinTransitionRule &rule, qint64 atMSecsSinceEpoch,
QTimeZone::TimeType type, bool fakeDst = false) const;
+private:
+ void init(const QByteArray &ianaId);
QByteArray m_windowsId;
QString m_displayName;
@@ -460,7 +454,7 @@ private:
QString m_daylightName;
QList<QWinTransitionRule> m_tranRules;
};
-#endif // Q_OS_WIN
+#endif // Q_OS_WIN && !icu
#ifdef Q_OS_ANDROID
class QAndroidTimeZonePrivate final : public QTimeZonePrivate
@@ -475,6 +469,7 @@ public:
QAndroidTimeZonePrivate *clone() const override;
+ using QTimeZonePrivate::displayName;
QString displayName(QTimeZone::TimeType timeType, QTimeZone::NameType nameType,
const QLocale &locale) const override;
QString abbreviation(qint64 atMSecsSinceEpoch) const override;
@@ -489,7 +484,7 @@ public:
Data data(qint64 forMSecsSinceEpoch) const override;
QByteArray systemTimeZoneId() const override;
-
+ bool isTimeZoneIdAvailable(const QByteArray &ianaId) const override;
QList<QByteArray> availableTimeZoneIds() const override;
private:
diff --git a/src/corelib/time/qtimezoneprivate_tz.cpp b/src/corelib/time/qtimezoneprivate_tz.cpp
index a9d6d06125..f6156fe93e 100644
--- a/src/corelib/time/qtimezoneprivate_tz.cpp
+++ b/src/corelib/time/qtimezoneprivate_tz.cpp
@@ -1,58 +1,27 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Copyright (C) 2019 Crimson AS <info@crimson.no>
-** Copyright (C) 2013 John Layt <jlayt@kde.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2022 The Qt Company Ltd.
+// Copyright (C) 2019 Crimson AS <info@crimson.no>
+// Copyright (C) 2013 John Layt <jlayt@kde.org>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qtimezone.h"
#include "qtimezoneprivate_p.h"
#include "private/qlocale_tools_p.h"
+#include "private/qlocking_p.h"
#include <QtCore/QDataStream>
#include <QtCore/QDateTime>
+#include <QtCore/QDirListing>
#include <QtCore/QFile>
#include <QtCore/QCache>
+#include <QtCore/QMap>
#include <QtCore/QMutex>
#include <qdebug.h>
#include <qplatformdefs.h>
#include <algorithm>
+#include <memory>
+
#include <errno.h>
#include <limits.h>
#ifndef Q_OS_INTEGRITY
@@ -62,6 +31,12 @@
QT_BEGIN_NAMESPACE
+using namespace Qt::StringLiterals;
+
+#if QT_CONFIG(icu)
+Q_CONSTINIT static QBasicMutex s_icu_mutex;
+#endif
+
/*
Private
@@ -69,22 +44,50 @@ QT_BEGIN_NAMESPACE
*/
struct QTzTimeZone {
- QLocale::Territory territory;
+ QLocale::Territory territory = QLocale::AnyTerritory;
QByteArray comment;
};
// Define as a type as Q_GLOBAL_STATIC doesn't like it
typedef QHash<QByteArray, QTzTimeZone> QTzTimeZoneHash;
-// Parse zone.tab table, assume lists all installed zones, if not will need to read directories
-static QTzTimeZoneHash loadTzTimeZones()
+static bool isTzFile(const QString &name);
+
+// Open a named file under the zone info directory:
+static bool openZoneInfo(const QString &name, QFile *file)
{
- QString path = QStringLiteral("/usr/share/zoneinfo/zone.tab");
- if (!QFile::exists(path))
- path = QStringLiteral("/usr/lib/zoneinfo/zone.tab");
+ // At least on Linux / glibc (see man 3 tzset), $TZDIR overrides the system
+ // default location for zone info:
+ const QString tzdir = qEnvironmentVariable("TZDIR");
+ if (!tzdir.isEmpty()) {
+ file->setFileName(QDir(tzdir).filePath(name));
+ if (file->open(QIODevice::ReadOnly))
+ return true;
+ }
+ // Try modern system path first:
+ constexpr auto zoneShare = "/usr/share/zoneinfo/"_L1;
+ if (tzdir != zoneShare && tzdir != zoneShare.chopped(1)) {
+ file->setFileName(zoneShare + name);
+ if (file->open(QIODevice::ReadOnly))
+ return true;
+ }
+ // Fall back to legacy system path:
+ constexpr auto zoneLib = "/usr/lib/zoneinfo/"_L1;
+ if (tzdir != zoneLib && tzdir != zoneLib.chopped(1)) {
+ file->setFileName(zoneShare + name);
+ if (file->open(QIODevice::ReadOnly))
+ return true;
+ }
+ return false;
+}
- QFile tzif(path);
- if (!tzif.open(QIODevice::ReadOnly))
+// Parse zone.tab table for territory information, read directories to ensure we
+// find all installed zones (many are omitted from zone.tab; even more from
+// zone1970.tab).
+static QTzTimeZoneHash loadTzTimeZones()
+{
+ QFile tzif;
+ if (!openZoneInfo("zone.tab"_L1, &tzif))
return QTzTimeZoneHash();
QTzTimeZoneHash zonesHash;
@@ -113,11 +116,32 @@ static QTzTimeZoneHash loadTzTimeZones()
}
}
}
+
+ const QString path = tzif.fileName();
+ const qsizetype cut = path.lastIndexOf(u'/');
+ Q_ASSERT(cut > 0);
+ const QDir zoneDir = QDir(path.first(cut));
+ for (const auto &info : QDirListing(zoneDir, QDirListing::IteratorFlag::Recursive)) {
+ if (!(info.isFile() || info.isSymLink()))
+ continue;
+ const QString name = zoneDir.relativeFilePath(info.filePath());
+ // Two sub-directories containing (more or less) copies of the zoneinfo tree.
+ if (info.isDir() ? name == "posix"_L1 || name == "right"_L1
+ : name.startsWith("posix/"_L1) || name.startsWith("right/"_L1)) {
+ continue;
+ }
+ // We could filter out *.* and leapseconds instead of doing the
+ // isTzFile() check; in practice current (2023) zoneinfo/ contains only
+ // actual zone files and matches to that filter.
+ const QByteArray id = QFile::encodeName(name);
+ if (!zonesHash.contains(id) && isTzFile(zoneDir.absoluteFilePath(name)))
+ zonesHash.insert(id, QTzTimeZone());
+ }
return zonesHash;
}
// Hash of available system tz files as loaded by loadTzTimeZones()
-Q_GLOBAL_STATIC_WITH_ARGS(const QTzTimeZoneHash, tzZones, (loadTzTimeZones()));
+Q_GLOBAL_STATIC(const QTzTimeZoneHash, tzZones, loadTzTimeZones());
/*
The following is copied and modified from tzfile.h which is in the public domain.
@@ -156,6 +180,11 @@ struct QTzType {
};
Q_DECLARE_TYPEINFO(QTzType, Q_PRIMITIVE_TYPE);
+static bool isTzFile(const QString &name)
+{
+ QFile file(name);
+ return file.open(QFile::ReadOnly) && file.read(strlen(TZ_MAGIC)) == TZ_MAGIC;
+}
// TZ File parsing
@@ -380,13 +409,15 @@ static QDate calculateDowDate(int year, int month, int dayOfWeek, int week)
static QDate calculatePosixDate(const QByteArray &dateRule, int year)
{
+ Q_ASSERT(!dateRule.isEmpty());
bool ok;
// Can start with M, J, or a digit
if (dateRule.at(0) == 'M') {
// nth week in month format "Mmonth.week.dow"
QList<QByteArray> dateParts = dateRule.split('.');
- if (dateParts.count() > 2) {
- int month = dateParts.at(0).mid(1).toInt(&ok);
+ if (dateParts.size() > 2) {
+ Q_ASSERT(!dateParts.at(0).isEmpty()); // the 'M' is its [0].
+ int month = QByteArrayView{ dateParts.at(0) }.sliced(1).toInt(&ok);
int week = ok ? dateParts.at(1).toInt(&ok) : 0;
int dow = ok ? dateParts.at(2).toInt(&ok) : 0;
if (ok)
@@ -395,7 +426,7 @@ static QDate calculatePosixDate(const QByteArray &dateRule, int year)
} else if (dateRule.at(0) == 'J') {
// Day of Year 1...365, ignores Feb 29.
// So March always starts on day 60.
- int doy = dateRule.mid(1).toInt(&ok);
+ int doy = QByteArrayView{ dateRule }.sliced(1).toInt(&ok);
if (ok && doy > 0 && doy < 366) {
// Subtract 1 because we're adding days *after* the first of
// January, unless it's after February in a leap year, when the leap
@@ -420,27 +451,28 @@ static int parsePosixTime(const char *begin, const char *end)
int hour, min = 0, sec = 0;
const int maxHour = 137; // POSIX's extended range.
- bool ok = false;
- const char *cut = begin;
- hour = qstrntoll(begin, end - begin, &cut, 10, &ok);
- if (!ok || hour < -maxHour || hour > maxHour || cut > begin + 2)
+ auto r = qstrntoll(begin, end - begin, 10);
+ hour = r.result;
+ if (!r.ok() || hour < -maxHour || hour > maxHour || r.used > 2)
return INT_MIN;
- begin = cut;
+ begin += r.used;
if (begin < end && *begin == ':') {
// minutes
++begin;
- min = qstrntoll(begin, end - begin, &cut, 10, &ok);
- if (!ok || min < 0 || min > 59 || cut > begin + 2)
+ r = qstrntoll(begin, end - begin, 10);
+ min = r.result;
+ if (!r.ok() || min < 0 || min > 59 || r.used > 2)
return INT_MIN;
- begin = cut;
+ begin += r.used;
if (begin < end && *begin == ':') {
// seconds
++begin;
- sec = qstrntoll(begin, end - begin, &cut, 10, &ok);
- if (!ok || sec < 0 || sec > 59 || cut > begin + 2)
+ r = qstrntoll(begin, end - begin, 10);
+ sec = r.result;
+ if (!r.ok() || sec < 0 || sec > 59 || r.used > 2)
return INT_MIN;
- begin = cut;
+ begin += r.used;
}
}
@@ -489,12 +521,20 @@ struct PosixZone
};
QString name;
- int offset;
+ int offset = InvalidOffset;
+ bool hasValidOffset() const noexcept { return offset != InvalidOffset; }
+ QTimeZonePrivate::Data dataAt(qint64 when)
+ {
+ Q_ASSERT(hasValidOffset());
+ return QTimeZonePrivate::Data(name, when, offset, offset);
+ }
+ QTimeZonePrivate::Data dataAtOffset(qint64 when, int standard)
+ {
+ Q_ASSERT(hasValidOffset());
+ return QTimeZonePrivate::Data(name, when, offset, standard);
+ }
- static PosixZone invalid() { return {QString(), InvalidOffset}; }
static PosixZone parse(const char *&pos, const char *end);
-
- bool hasValidOffset() const noexcept { return offset != InvalidOffset; }
};
} // unnamed namespace
@@ -511,7 +551,7 @@ PosixZone PosixZone::parse(const char *&pos, const char *end)
Q_ASSERT(pos < end);
if (*pos == '<') {
- nameBegin = pos + 1; // skip the '<'
+ ++nameBegin; // skip the '<'
nameEnd = nameBegin;
while (nameEnd < end && *nameEnd != '>') {
// POSIX says only alphanumeric, but we allow anything
@@ -519,14 +559,13 @@ PosixZone PosixZone::parse(const char *&pos, const char *end)
}
pos = nameEnd + 1; // skip the '>'
} else {
- nameBegin = pos;
nameEnd = nameBegin;
while (nameEnd < end && asciiIsLetter(*nameEnd))
++nameEnd;
pos = nameEnd;
}
if (nameEnd - nameBegin < 3)
- return invalid(); // name must be at least 3 characters long
+ return {}; // name must be at least 3 characters long
// zone offset, form [+-]hh:mm:ss
const char *zoneBegin = pos;
@@ -544,32 +583,41 @@ PosixZone PosixZone::parse(const char *&pos, const char *end)
pos = zoneEnd;
// UTC+hh:mm:ss or GMT+hh:mm:ss should be read as offsets from UTC, not as a
// POSIX rule naming a zone as UTC or GMT and specifying a non-zero offset.
- if (offset != 0 && (name == QLatin1String("UTC") || name == QLatin1String("GMT")))
- return invalid();
+ if (offset != 0 && (name =="UTC"_L1 || name == "GMT"_L1))
+ return {};
return {std::move(name), offset};
}
-static auto validatePosixRule(const QByteArray &posixRule)
+/* Parse and check a POSIX rule.
+
+ By default a simple zone abbreviation with no offset information is accepted.
+ Set \a requireOffset to \c true to require that there be offset data present.
+*/
+static auto validatePosixRule(const QByteArray &posixRule, bool requireOffset = false)
{
// Format is described here:
// http://www.gnu.org/software/libc/manual/html_node/TZ-Variable.html
// See also calculatePosixTransition()'s reference.
const auto parts = posixRule.split(',');
- const struct { bool isValid, hasDst; } fail{false, false}, good{true, parts.count() > 1};
+ const struct { bool isValid, hasDst; } fail{false, false}, good{true, parts.size() > 1};
const QByteArray &zoneinfo = parts.at(0);
if (zoneinfo.isEmpty())
return fail;
const char *begin = zoneinfo.begin();
-
- // Updates begin to point after the name and offset it parses:
- if (PosixZone::parse(begin, zoneinfo.end()).name.isEmpty())
- return fail;
+ {
+ // Updates begin to point after the name and offset it parses:
+ const auto posix = PosixZone::parse(begin, zoneinfo.end());
+ if (posix.name.isEmpty())
+ return fail;
+ if (requireOffset && !posix.hasValidOffset())
+ return fail;
+ }
if (good.hasDst) {
if (begin >= zoneinfo.end())
return fail;
- // Expect a second name and offset after the first:
+ // Expect a second name (and optional offset) after the first:
if (PosixZone::parse(begin, zoneinfo.end()).name.isEmpty())
return fail;
}
@@ -577,13 +625,13 @@ static auto validatePosixRule(const QByteArray &posixRule)
return fail;
if (good.hasDst) {
- if (parts.count() != 3 || parts.at(1).isEmpty() || parts.at(2).isEmpty())
+ if (parts.size() != 3 || parts.at(1).isEmpty() || parts.at(2).isEmpty())
return fail;
for (int i = 1; i < 3; ++i) {
const auto tran = parts.at(i).split('/');
if (!calculatePosixDate(tran.at(0), 1972).isValid())
return fail;
- if (tran.count() > 1) {
+ if (tran.size() > 1) {
const auto time = tran.at(1);
if (parsePosixTime(time.begin(), time.end()) == INT_MIN)
return fail;
@@ -606,7 +654,7 @@ static QList<QTimeZonePrivate::Data> calculatePosixTransitions(const QByteArray
// and the link in validatePosixRule(), above.
QList<QByteArray> parts = posixRule.split(',');
- PosixZone stdZone, dstZone = PosixZone::invalid();
+ PosixZone stdZone, dstZone;
{
const QByteArray &zoneinfo = parts.at(0);
const char *begin = zoneinfo.constBegin();
@@ -624,29 +672,25 @@ static QList<QTimeZonePrivate::Data> calculatePosixTransitions(const QByteArray
}
// If only the name part, or no DST specified, then no transitions
- if (parts.count() == 1 || !dstZone.hasValidOffset()) {
- QTimeZonePrivate::Data data;
- data.atMSecsSinceEpoch = lastTranMSecs;
- data.offsetFromUtc = stdZone.offset;
- data.standardTimeOffset = stdZone.offset;
- data.daylightTimeOffset = 0;
- data.abbreviation = stdZone.name.isEmpty() ? QString::fromUtf8(parts.at(0)) : stdZone.name;
- result << data;
+ if (parts.size() == 1 || !dstZone.hasValidOffset()) {
+ result.emplaceBack(
+ stdZone.name.isEmpty() ? QString::fromUtf8(parts.at(0)) : stdZone.name,
+ lastTranMSecs, stdZone.offset, stdZone.offset);
return result;
}
- if (parts.count() < 3 || parts.at(1).isEmpty() || parts.at(2).isEmpty())
+ if (parts.size() < 3 || parts.at(1).isEmpty() || parts.at(2).isEmpty())
return result; // Malformed.
// Get the std to dst transition details
const int twoOClock = 7200; // Default transition time, when none specified
const auto dstParts = parts.at(1).split('/');
const QByteArray dstDateRule = dstParts.at(0);
- const int dstTime = dstParts.count() < 2 ? twoOClock : parsePosixTransitionTime(dstParts.at(1));
+ const int dstTime = dstParts.size() < 2 ? twoOClock : parsePosixTransitionTime(dstParts.at(1));
// Get the dst to std transition details
const auto stdParts = parts.at(2).split('/');
const QByteArray stdDateRule = stdParts.at(0);
- const int stdTime = stdParts.count() < 2 ? twoOClock : parsePosixTransitionTime(stdParts.at(1));
+ const int stdTime = stdParts.size() < 2 ? twoOClock : parsePosixTransitionTime(stdParts.at(1));
if (dstDateRule.isEmpty() || stdDateRule.isEmpty() || dstTime == INT_MIN || stdTime == INT_MIN)
return result; // Malformed.
@@ -659,43 +703,38 @@ static QList<QTimeZonePrivate::Data> calculatePosixTransitions(const QByteArray
Q_ASSERT(startYear <= endYear);
for (int year = startYear; year <= endYear; ++year) {
- // Note: std and dst, despite being QDateTime(,, Qt::UTC), have the
+ // Note: std and dst, despite being QDateTime(,, UTC), have the
// date() and time() of the *zone*'s description of the transition
// moments; the atMSecsSinceEpoch values computed from them are
// correctly offse to be UTC-based.
- QTimeZonePrivate::Data dstData; // Transition to DST
- QDateTime dst(calculatePosixDate(dstDateRule, year).startOfDay(Qt::UTC).addSecs(dstTime));
- dstData.atMSecsSinceEpoch = dst.toMSecsSinceEpoch() - stdZone.offset * 1000;
- dstData.offsetFromUtc = dstZone.offset;
- dstData.standardTimeOffset = stdZone.offset;
- dstData.daylightTimeOffset = dstZone.offset - stdZone.offset;
- dstData.abbreviation = dstZone.name;
- QTimeZonePrivate::Data stdData; // Transition to standard time
- QDateTime std(calculatePosixDate(stdDateRule, year).startOfDay(Qt::UTC).addSecs(stdTime));
- stdData.atMSecsSinceEpoch = std.toMSecsSinceEpoch() - dstZone.offset * 1000;
- stdData.offsetFromUtc = stdZone.offset;
- stdData.standardTimeOffset = stdZone.offset;
- stdData.daylightTimeOffset = 0;
- stdData.abbreviation = stdZone.name;
+ // Transition to daylight-saving time:
+ QDateTime dst(calculatePosixDate(dstDateRule, year)
+ .startOfDay(QTimeZone::UTC).addSecs(dstTime));
+ auto saving = dstZone.dataAtOffset(dst.toMSecsSinceEpoch() - stdZone.offset * 1000,
+ stdZone.offset);
+ // Transition to standard time:
+ QDateTime std(calculatePosixDate(stdDateRule, year)
+ .startOfDay(QTimeZone::UTC).addSecs(stdTime));
+ auto standard = stdZone.dataAt(std.toMSecsSinceEpoch() - dstZone.offset * 1000);
if (year == startYear) {
// Handle the special case of fixed state, which may be represented
// by fake transitions at start and end of each year:
- if (dstData.atMSecsSinceEpoch < stdData.atMSecsSinceEpoch) {
- if (dst <= QDate(year, 1, 1).startOfDay(Qt::UTC)
- && std >= QDate(year, 12, 31).endOfDay(Qt::UTC)) {
+ if (saving.atMSecsSinceEpoch < standard.atMSecsSinceEpoch) {
+ if (dst <= QDate(year, 1, 1).startOfDay(QTimeZone::UTC)
+ && std >= QDate(year, 12, 31).endOfDay(QTimeZone::UTC)) {
// Permanent DST:
- dstData.atMSecsSinceEpoch = lastTranMSecs;
- result << dstData;
+ saving.atMSecsSinceEpoch = lastTranMSecs;
+ result.emplaceBack(std::move(saving));
return result;
}
} else {
- if (std <= QDate(year, 1, 1).startOfDay(Qt::UTC)
- && dst >= QDate(year, 12, 31).endOfDay(Qt::UTC)) {
+ if (std <= QDate(year, 1, 1).startOfDay(QTimeZone::UTC)
+ && dst >= QDate(year, 12, 31).endOfDay(QTimeZone::UTC)) {
// Permanent Standard time, perversely described:
- stdData.atMSecsSinceEpoch = lastTranMSecs;
- result << stdData;
+ standard.atMSecsSinceEpoch = lastTranMSecs;
+ result.emplaceBack(std::move(standard));
return result;
}
}
@@ -704,14 +743,17 @@ static QList<QTimeZonePrivate::Data> calculatePosixTransitions(const QByteArray
const bool useStd = std.isValid() && std.date().year() == year && !stdZone.name.isEmpty();
const bool useDst = dst.isValid() && dst.date().year() == year && !dstZone.name.isEmpty();
if (useStd && useDst) {
- if (dst < std)
- result << dstData << stdData;
- else
- result << stdData << dstData;
+ if (dst < std) {
+ result.emplaceBack(std::move(saving));
+ result.emplaceBack(std::move(standard));
+ } else {
+ result.emplaceBack(std::move(standard));
+ result.emplaceBack(std::move(saving));
+ }
} else if (useStd) {
- result << stdData;
+ result.emplaceBack(std::move(standard));
} else if (useDst) {
- result << dstData;
+ result.emplaceBack(std::move(saving));
}
}
return result;
@@ -719,14 +761,8 @@ static QList<QTimeZonePrivate::Data> calculatePosixTransitions(const QByteArray
// Create the system default time zone
QTzTimeZonePrivate::QTzTimeZonePrivate()
+ : QTzTimeZonePrivate(staticSystemTimeZoneId())
{
- init(systemTimeZoneId());
-}
-
-// Create a named time zone
-QTzTimeZonePrivate::QTzTimeZonePrivate(const QByteArray &ianaId)
-{
- init(ianaId);
}
QTzTimeZonePrivate::~QTzTimeZonePrivate()
@@ -735,6 +771,9 @@ QTzTimeZonePrivate::~QTzTimeZonePrivate()
QTzTimeZonePrivate *QTzTimeZonePrivate::clone() const
{
+#if QT_CONFIG(icu)
+ const auto lock = qt_scoped_lock(s_icu_mutex);
+#endif
return new QTzTimeZonePrivate(*this);
}
@@ -744,7 +783,7 @@ public:
QTzTimeZoneCacheEntry fetchEntry(const QByteArray &ianaId);
private:
- QTzTimeZoneCacheEntry findEntry(const QByteArray &ianaId);
+ static QTzTimeZoneCacheEntry findEntry(const QByteArray &ianaId);
QCache<QByteArray, QTzTimeZoneCacheEntry> m_cache;
QMutex m_mutex;
};
@@ -758,21 +797,14 @@ QTzTimeZoneCacheEntry QTzTimeZoneCache::findEntry(const QByteArray &ianaId)
tzif.setFileName(QStringLiteral("/etc/localtime"));
if (!tzif.open(QIODevice::ReadOnly))
return ret;
- } else {
- // Open named tz, try modern path first, if fails try legacy path
- tzif.setFileName(QLatin1String("/usr/share/zoneinfo/") + QString::fromLocal8Bit(ianaId));
- if (!tzif.open(QIODevice::ReadOnly)) {
- tzif.setFileName(QLatin1String("/usr/lib/zoneinfo/") + QString::fromLocal8Bit(ianaId));
- if (!tzif.open(QIODevice::ReadOnly)) {
- // ianaId may be a POSIX rule, taken from $TZ or /etc/TZ
- auto check = validatePosixRule(ianaId);
- if (check.isValid) {
- ret.m_hasDst = check.hasDst;
- ret.m_posixRule = ianaId;
- }
- return ret;
- }
+ } else if (!openZoneInfo(QString::fromLocal8Bit(ianaId), &tzif)) {
+ // ianaId may be a POSIX rule, taken from $TZ or /etc/TZ
+ auto check = validatePosixRule(ianaId);
+ if (check.isValid) {
+ ret.m_hasDst = check.hasDst;
+ ret.m_posixRule = ianaId;
}
+ return ret;
}
QDataStream ds(&tzif);
@@ -852,13 +884,11 @@ QTzTimeZoneCacheEntry QTzTimeZoneCache::findEntry(const QByteArray &ianaId)
// TODO: is typeList[0] always the "before zones" data ? It seems to be ...
if (typeList.size())
ret.m_preZoneRule = { typeList.at(0).tz_gmtoff, 0, typeList.at(0).tz_abbrind };
- else
- ret.m_preZoneRule = { 0, 0, 0 };
// Offsets are stored as total offset, want to know separate UTC and DST offsets
// so find the first non-dst transition to use as base UTC Offset
int utcOffset = ret.m_preZoneRule.stdOffset;
- for (const QTzTransition &tran : qAsConst(tranList)) {
+ for (const QTzTransition &tran : std::as_const(tranList)) {
if (!typeList.at(tran.tz_typeind).tz_isdst) {
utcOffset = typeList.at(tran.tz_typeind).tz_gmtoff;
break;
@@ -866,7 +896,7 @@ QTzTimeZoneCacheEntry QTzTimeZoneCache::findEntry(const QByteArray &ianaId)
}
// Now for each transition time calculate and store our rule:
- const int tranCount = tranList.count();;
+ const int tranCount = tranList.size();
ret.m_tranTimes.reserve(tranCount);
// The DST offset when in effect: usually stable, usually an hour:
int lastDstOff = 3600;
@@ -925,8 +955,8 @@ QTzTimeZoneCacheEntry QTzTimeZoneCache::findEntry(const QByteArray &ianaId)
if (ruleIndex == -1) {
if (rule.dstOffset != 0)
ret.m_hasDst = true;
+ tran.ruleIndex = ret.m_tranRules.size();
ret.m_tranRules.append(rule);
- tran.ruleIndex = ret.m_tranRules.size() - 1;
} else {
tran.ruleIndex = ruleIndex;
}
@@ -948,13 +978,24 @@ QTzTimeZoneCacheEntry QTzTimeZoneCache::fetchEntry(const QByteArray &ianaId)
return *obj;
// ... or build a new entry from scratch
+
+ locker.unlock(); // don't parse files under mutex lock
+
QTzTimeZoneCacheEntry ret = findEntry(ianaId);
- m_cache.insert(ianaId, new QTzTimeZoneCacheEntry(ret));
+ auto ptr = std::make_unique<QTzTimeZoneCacheEntry>(ret);
+
+ locker.relock();
+ m_cache.insert(ianaId, ptr.release()); // may overwrite if another thread was faster
+ locker.unlock();
+
return ret;
}
-void QTzTimeZonePrivate::init(const QByteArray &ianaId)
+// Create a named time zone
+QTzTimeZonePrivate::QTzTimeZonePrivate(const QByteArray &ianaId)
{
+ if (!isTimeZoneIdAvailable(ianaId)) // Avoid pointlessly creating cache entries
+ return;
static QTzTimeZoneCache tzCache;
auto entry = tzCache.fetchEntry(ianaId);
if (entry.m_tranTimes.isEmpty() && entry.m_posixRule.isEmpty())
@@ -989,42 +1030,27 @@ QString QTzTimeZonePrivate::comment() const
return QString::fromUtf8(tzZones->value(m_id).comment);
}
-QString QTzTimeZonePrivate::displayName(qint64 atMSecsSinceEpoch,
- QTimeZone::NameType nameType,
- const QLocale &locale) const
-{
-#if QT_CONFIG(icu)
- if (!m_icu)
- m_icu = new QIcuTimeZonePrivate(m_id);
- // TODO small risk may not match if tran times differ due to outdated files
- // TODO Some valid TZ names are not valid ICU names, use translation table?
- if (m_icu->isValid())
- return m_icu->displayName(atMSecsSinceEpoch, nameType, locale);
-#else
- Q_UNUSED(nameType);
- Q_UNUSED(locale);
-#endif
- // Fall back to base-class:
- return QTimeZonePrivate::displayName(atMSecsSinceEpoch, nameType, locale);
-}
-
QString QTzTimeZonePrivate::displayName(QTimeZone::TimeType timeType,
QTimeZone::NameType nameType,
const QLocale &locale) const
{
+ // TZ DB lacks localized names (it only has IANA IDs), so delegate to ICU
+ // for those, when available.
#if QT_CONFIG(icu)
- if (!m_icu)
- m_icu = new QIcuTimeZonePrivate(m_id);
- // TODO small risk may not match if tran times differ due to outdated files
- // TODO Some valid TZ names are not valid ICU names, use translation table?
- if (m_icu->isValid())
- return m_icu->displayName(timeType, nameType, locale);
+ {
+ auto lock = qt_scoped_lock(s_icu_mutex);
+ // TODO Some valid TZ names are not valid ICU names, use translation table?
+ if (!m_icu)
+ m_icu = new QIcuTimeZonePrivate(m_id);
+ if (m_icu->isValid())
+ return m_icu->displayName(timeType, nameType, locale);
+ }
#else
Q_UNUSED(timeType);
Q_UNUSED(nameType);
Q_UNUSED(locale);
#endif
- // If no ICU available then have to use abbreviations instead
+ // If ICU is unavailable, fall back to abbreviations.
// Abbreviations don't have GenericTime
if (timeType == QTimeZone::GenericTime)
timeType = QTimeZone::StandardTime;
@@ -1113,13 +1139,13 @@ QTimeZonePrivate::Data QTzTimeZonePrivate::dataForTzTransition(QTzTransitionTime
QTimeZonePrivate::Data QTzTimeZonePrivate::dataFromRule(QTzTransitionRule rule,
qint64 msecsSinceEpoch) const
{
- return { QString::fromUtf8(cached_data.m_abbreviations.at(rule.abbreviationIndex)),
- msecsSinceEpoch, rule.stdOffset + rule.dstOffset, rule.stdOffset, rule.dstOffset };
+ return Data(QString::fromUtf8(cached_data.m_abbreviations.at(rule.abbreviationIndex)),
+ msecsSinceEpoch, rule.stdOffset + rule.dstOffset, rule.stdOffset);
}
QList<QTimeZonePrivate::Data> QTzTimeZonePrivate::getPosixTransitions(qint64 msNear) const
{
- const int year = QDateTime::fromMSecsSinceEpoch(msNear, Qt::UTC).date().year();
+ const int year = QDateTime::fromMSecsSinceEpoch(msNear, QTimeZone::UTC).date().year();
// The Data::atMSecsSinceEpoch of the single entry if zone is constant:
qint64 atTime = tranCache().isEmpty() ? msNear : tranCache().last().atMSecsSinceEpoch;
return calculatePosixTransitions(cached_data.m_posixRule, year - 1, year + 1, atTime);
@@ -1144,7 +1170,7 @@ QTimeZonePrivate::Data QTzTimeZonePrivate::data(qint64 forMSecsSinceEpoch) const
}
}
if (tranCache().isEmpty()) // Only possible if !isValid()
- return invalidData();
+ return {};
// Otherwise, use the rule for the most recent or first transition:
auto last = std::partition_point(tranCache().cbegin(), tranCache().cend(),
@@ -1175,7 +1201,7 @@ QTimeZonePrivate::Data QTzTimeZonePrivate::nextTransition(qint64 afterMSecsSince
return at.atMSecsSinceEpoch <= afterMSecsSinceEpoch;
});
- return it == posixTrans.cend() ? invalidData() : *it;
+ return it == posixTrans.cend() ? Data{} : *it;
}
// Otherwise, if we can find a valid tran, use its rule:
@@ -1183,7 +1209,7 @@ QTimeZonePrivate::Data QTzTimeZonePrivate::nextTransition(qint64 afterMSecsSince
[afterMSecsSinceEpoch] (const QTzTransitionTime &at) {
return at.atMSecsSinceEpoch <= afterMSecsSinceEpoch;
});
- return last != tranCache().cend() ? dataForTzTransition(*last) : invalidData();
+ return last != tranCache().cend() ? dataForTzTransition(*last) : Data{};
}
QTimeZonePrivate::Data QTzTimeZonePrivate::previousTransition(qint64 beforeMSecsSinceEpoch) const
@@ -1200,7 +1226,7 @@ QTimeZonePrivate::Data QTzTimeZonePrivate::previousTransition(qint64 beforeMSecs
if (it > posixTrans.cbegin())
return *--it;
// It fell between the last transition (if any) and the first of the POSIX rule:
- return tranCache().isEmpty() ? invalidData() : dataForTzTransition(tranCache().last());
+ return tranCache().isEmpty() ? Data{} : dataForTzTransition(tranCache().last());
}
// Otherwise if we can find a valid tran then use its rule
@@ -1208,12 +1234,16 @@ QTimeZonePrivate::Data QTzTimeZonePrivate::previousTransition(qint64 beforeMSecs
[beforeMSecsSinceEpoch] (const QTzTransitionTime &at) {
return at.atMSecsSinceEpoch < beforeMSecsSinceEpoch;
});
- return last > tranCache().cbegin() ? dataForTzTransition(*--last) : invalidData();
+ return last > tranCache().cbegin() ? dataForTzTransition(*--last) : Data{};
}
bool QTzTimeZonePrivate::isTimeZoneIdAvailable(const QByteArray &ianaId) const
{
- return tzZones->contains(ianaId);
+ // Allow a POSIX rule as long as it has offset data. (This needs to reject a
+ // plain abbreviation, without offset, since claiming to support such zones
+ // would prevent the custom QTimeZone constructor from accepting such a
+ // name, as it doesn't want a custom zone to over-ride a "real" one.)
+ return tzZones->contains(ianaId) || validatePosixRule(ianaId, true).isValid;
}
QList<QByteArray> QTzTimeZonePrivate::availableTimeZoneIds() const
@@ -1238,7 +1268,7 @@ QList<QByteArray> QTzTimeZonePrivate::availableTimeZoneIds(QLocale::Territory te
// Getting the system zone's ID:
namespace {
-class ZoneNameReader : public QObject
+class ZoneNameReader
{
public:
QByteArray name()
@@ -1291,7 +1321,7 @@ private:
{
static constexpr unsigned long bad = ~0ul;
unsigned long m_dev, m_ino;
- StatIdent() : m_dev(bad), m_ino(bad) {}
+ constexpr StatIdent() : m_dev(bad), m_ino(bad) {}
StatIdent(const QT_STATBUF &data) : m_dev(data.st_dev), m_ino(data.st_ino) {}
bool isValid() { return m_dev != bad || m_ino != bad; }
bool operator==(const StatIdent &other)
@@ -1309,7 +1339,8 @@ private:
{
// On most distros /etc/localtime is a symlink to a real file so extract
// name from the path
- const QLatin1String zoneinfo("/zoneinfo/");
+ const QString tzdir = qEnvironmentVariable("TZDIR");
+ constexpr auto zoneinfo = "/zoneinfo/"_L1;
QString path = QStringLiteral("/etc/localtime");
long iteration = getSymloopMax();
// Symlink may point to another symlink etc. before being under zoneinfo/
@@ -1317,9 +1348,15 @@ private:
// symlink, like America/Montreal pointing to America/Toronto
do {
path = QFile::symLinkTarget(path);
- int index = path.indexOf(zoneinfo);
- if (index >= 0) // Found zoneinfo file; extract zone name from path:
- return QStringView{ path }.mid(index + zoneinfo.size()).toUtf8();
+ // If it's a zoneinfo file, extract the zone name from its path:
+ int index = tzdir.isEmpty() ? -1 : path.indexOf(tzdir);
+ if (index >= 0) {
+ const auto tail = QStringView{ path }.sliced(index + tzdir.size()).toUtf8();
+ return tail.startsWith(u'/') ? tail.sliced(1) : tail;
+ }
+ index = path.indexOf(zoneinfo);
+ if (index >= 0)
+ return QStringView{ path }.sliced(index + zoneinfo.size()).toUtf8();
} while (!path.isEmpty() && --iteration > 0);
return QByteArray();
@@ -1361,6 +1398,11 @@ private:
QByteArray QTzTimeZonePrivate::systemTimeZoneId() const
{
+ return staticSystemTimeZoneId();
+}
+
+QByteArray QTzTimeZonePrivate::staticSystemTimeZoneId()
+{
// Check TZ env var first, if not populated try find it
QByteArray ianaId = qgetenv("TZ");
@@ -1371,10 +1413,10 @@ QByteArray QTzTimeZonePrivate::systemTimeZoneId() const
if (ianaId == ":/etc/localtime")
ianaId.clear();
else if (ianaId.startsWith(':'))
- ianaId = ianaId.mid(1);
+ ianaId = ianaId.sliced(1);
if (ianaId.isEmpty()) {
- thread_local static ZoneNameReader reader;
+ Q_CONSTINIT thread_local static ZoneNameReader reader;
ianaId = reader.name();
}
diff --git a/src/corelib/time/qtimezoneprivate_win.cpp b/src/corelib/time/qtimezoneprivate_win.cpp
index ff8cd5548e..7874c22174 100644
--- a/src/corelib/time/qtimezoneprivate_win.cpp
+++ b/src/corelib/time/qtimezoneprivate_win.cpp
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Copyright (C) 2013 John Layt <jlayt@kde.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2022 The Qt Company Ltd.
+// Copyright (C) 2013 John Layt <jlayt@kde.org>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qtimezone.h"
#include "qtimezoneprivate_p.h"
@@ -51,6 +15,8 @@
QT_BEGIN_NAMESPACE
+using namespace Qt::StringLiterals;
+
/*
Private
@@ -73,6 +39,33 @@ static const wchar_t currTzRegPath[] = LR"(SYSTEM\CurrentControlSet\Control\Time
constexpr qint64 MSECS_PER_DAY = 86400000LL;
constexpr qint64 JULIAN_DAY_FOR_EPOCH = 2440588LL; // result of julianDayFromDate(1970, 1, 1)
+/* Ignore any claims of DST before 1900.
+
+ Daylight-Saving time adjustments were first proposed in 1895 (George Vernon
+ Hudson in New Zealand) and 1905 (William Willett in the UK) and first adopted
+ in 1908 (one town in Ontario, Canada) and 1916 (Germany). Since MS's data
+ tends to pretend the rules in force in 1970ish (or later) had always been in
+ effect, which presents difficulties for the code that selects correct data
+ (for a time close to the earliest we can represent), always ignore any claim
+ a first rule may make of DST starting any time before 1900.
+
+ For southern-hemisphere zones, this implies that a rule claiming 1900 started
+ in DST is overruled to merely start DST later in 1900, having spent the whole
+ part of 1900 prior to that in standard time. This erases 1900's earlier
+ transition out of daylight-saving time so as to prevent a fake change of
+ offset at the start of the year, since 1899 shall be treated as observing
+ standard time throughout.
+
+ In the unlikely event of MS supplying a change in standard time before 1900,
+ however, that should be faithfully represented. If that ever happens, trust
+ that MS gets the start year of any subsequend DST right.
+
+ See:
+ * https://www.timeanddate.com/time/dst/history.html
+ * https://en.wikipedia.org/wiki/Daylight_saving_time#History
+*/
+constexpr int FIRST_DST_YEAR = 1900;
+
// Copied from MSDN, see above for link
typedef struct _REG_TZI_FORMAT
{
@@ -97,8 +90,8 @@ QDate msecsToDate(qint64 msecs)
}
if (msecs < 0) {
- qint64 ds = MSECS_PER_DAY - msecs - 1;
- jd -= ds / MSECS_PER_DAY;
+ Q_ASSERT(msecs > -MSECS_PER_DAY);
+ --jd;
}
return QDate::fromJulianDay(jd);
@@ -152,7 +145,7 @@ TIME_ZONE_INFORMATION getRegistryTzi(const QByteArray &windowsId, bool *ok)
TIME_ZONE_INFORMATION tzi;
REG_TZI_FORMAT regTzi;
DWORD regTziSize = sizeof(regTzi);
- const QString tziKeyPath = QString::fromWCharArray(tzRegPath) + QLatin1Char('\\')
+ const QString tziKeyPath = QString::fromWCharArray(tzRegPath) + u'\\'
+ QString::fromUtf8(windowsId);
QWinRegistryKey key(HKEY_LOCAL_MACHINE, tziKeyPath);
@@ -193,22 +186,24 @@ bool isSameRule(const QWinTimeZonePrivate::QWinTransitionRule &last,
QList<QByteArray> availableWindowsIds()
{
- // TODO Consider caching results in a global static, very unlikely to change.
- QList<QByteArray> list;
- QWinRegistryKey key(HKEY_LOCAL_MACHINE, tzRegPath);
- if (key.isValid()) {
- DWORD idCount = 0;
- if (RegQueryInfoKey(key, 0, 0, 0, &idCount, 0, 0, 0, 0, 0, 0, 0) == ERROR_SUCCESS
- && idCount > 0) {
- for (DWORD i = 0; i < idCount; ++i) {
- DWORD maxLen = MAX_KEY_LENGTH;
- TCHAR buffer[MAX_KEY_LENGTH];
- if (RegEnumKeyEx(key, i, buffer, &maxLen, 0, 0, 0, 0) == ERROR_SUCCESS)
- list.append(QString::fromWCharArray(buffer).toUtf8());
+ static const QList<QByteArray> cache = [] {
+ QList<QByteArray> list;
+ QWinRegistryKey key(HKEY_LOCAL_MACHINE, tzRegPath);
+ if (key.isValid()) {
+ DWORD idCount = 0;
+ if (RegQueryInfoKey(key, 0, 0, 0, &idCount, 0, 0, 0, 0, 0, 0, 0) == ERROR_SUCCESS
+ && idCount > 0) {
+ for (DWORD i = 0; i < idCount; ++i) {
+ DWORD maxLen = MAX_KEY_LENGTH;
+ TCHAR buffer[MAX_KEY_LENGTH];
+ if (RegEnumKeyEx(key, i, buffer, &maxLen, 0, 0, 0, 0) == ERROR_SUCCESS)
+ list.append(QString::fromWCharArray(buffer).toUtf8());
+ }
}
}
- }
- return list;
+ return list;
+ }();
+ return cache;
}
QByteArray windowsSystemZoneId()
@@ -282,8 +277,8 @@ inline bool timeToMSecs(QDate date, QTime time, qint64 *msecs)
++daySinceEpoch;
msInDay -= MSECS_PER_DAY;
}
- return mul_overflow(daySinceEpoch, std::integral_constant<qint64, MSECS_PER_DAY>(), &dayms)
- || add_overflow(dayms, msInDay, msecs);
+ return qMulOverflow(daySinceEpoch, std::integral_constant<qint64, MSECS_PER_DAY>(), &dayms)
+ || qAddOverflow(dayms, msInDay, msecs);
}
qint64 calculateTransitionForYear(const SYSTEMTIME &rule, int year, int bias)
@@ -294,23 +289,41 @@ qint64 calculateTransitionForYear(const SYSTEMTIME &rule, int year, int bias)
const QDate date = calculateTransitionLocalDate(rule, year);
const QTime time = QTime(rule.wHour, rule.wMinute, rule.wSecond);
qint64 msecs = 0;
- using Bound = std::numeric_limits<qint64>;
if (date.isValid() && time.isValid() && !timeToMSecs(date, time, &msecs)) {
- // If bias pushes us outside representable range, clip to range - and
- // exclude min() from range as it's invalidMSecs():
- return bias && add_overflow(msecs, qint64(bias) * 60000, &msecs)
- ? (bias < 0 ? Bound::min() + 1 : Bound::max())
- : (msecs == Bound::min() ? msecs + 1 : msecs);
+ // If bias pushes us outside the representable range, clip to range
+ // (overflow went past the end bias pushed us towards; and
+ // invalidMSecs() is a representable value less than minMSecs()):
+ return bias && qAddOverflow(msecs, qint64(bias) * 60000, &msecs)
+ ? (bias < 0 ? QTimeZonePrivate::minMSecs() : QTimeZonePrivate::maxMSecs())
+ : qMax(QTimeZonePrivate::minMSecs(), msecs);
}
return QTimeZonePrivate::invalidMSecs();
}
+// True precisely if transition represents the start of the year.
+bool isAtStartOfYear(const SYSTEMTIME &transition, int year)
+{
+ /*
+ Note that, here, wDay identifies an instance of a given day-of-week in the
+ month, with 5 meaning last. (December 31st is, incidentally, always the
+ fifth instance of its day of the week in its month. But we aren't testing
+ that - see below.)
+
+ QDate represents Sunday by 7, SYSTEMTIME by 0; so compare day of the week
+ by taking difference mod 7.
+ */
+ return transition.wMonth == 1 && transition.wDay == 1
+ && (QDate(year, 1, 1).dayOfWeek() - transition.wDayOfWeek) % 7 == 0
+ && transition.wHour == 0 && transition.wMinute == 0 && transition.wSecond == 0;
+}
+
struct TransitionTimePair
{
// Transition times, in ms:
qint64 std, dst;
// If either is invalidMSecs(), which shall then be < the other, there is no
// DST and the other describes a change in actual standard offset.
+ bool fakesDst = false;
TransitionTimePair(const QWinTimeZonePrivate::QWinTransitionRule &rule,
int year, int oldYearOffset)
@@ -326,16 +339,36 @@ struct TransitionTimePair
year, or expresses a transition of each kind, even if standard time
did change in a year with no DST. We've seen year-start fake-DST
(whose offset matches prior standard offset, in which the previous
- year ended); and conjecture that similar might be used at a year-end.
- (This might be used for a southern-hemisphere zone, where the start of
- the year usually is in DST, when applicable.) Note that, here, wDay
- identifies an instance of a given day-of-week in the month, with 5
- meaning last.
+ year ended).
+
+ It is possible there might also be year-end fake-DST but Bangladesh
+ toyed with DST from 2009-06-19 (a Friday) at 23:00 until, according to
+ the Olson database, 2009-12-32 24:00; however, MS represents that by
+ the last millisecond of the year, technically a millisecond early. (MS
+ falsely claims Bhutan did the same.) So we do not attempt to detect an
+ end-of-year fake transition; nor is there any reason to suppose MS
+ would need to do that, as anything it could implement thereby could
+ equally be implemented by a start-of-year fake.
+
+ A fake transition at the start of the year tells us what the offset at
+ the start of the year is; if this doesn't match the offset in effect
+ at the end of the previous year, then it's a real transition. If it
+ does match, then we have a fake transition. (A fake transition of one
+ kind at the end of the year would be paired with a real transition,
+ allegedly of the other kind, part way through the year; that would be
+ a transition away from the offset that would nominally be restored by
+ the fake so, again, the year would have started with the post-fake
+ offset in effect.)
Either the alleged standardTimeRule or the alleged daylightTimeRule
may be faked; either way, the transition is actually a change to the
current standard offset; but the unfaked half of the rule contains the
- useful bias data, so we have to go along with its lies.
+ useful bias data, so we have to go along with its lies. Clients of
+ this class should still use DaylightTime and StandardTime as if the
+ fake were not a lie, selecting which side of the real transition to
+ use the data for, and ruleToData() will take care of extracting the
+ right offset based on that, while tagging the resulting Data as
+ standard time.
Example: Russia/Moscow
Format: -bias +( -stdBias, stdDate | -dstBias, dstDate ) notes
@@ -345,32 +378,47 @@ struct TransitionTimePair
Zone change in 2014: 180 +( 0, 0-10-5 2:0 | 60, 0-1-1 0:0 ) fake DST at year-start
The last of these is missing on Win7 VMs (too old to know about it).
*/
- if (rule.daylightTimeRule.wMonth == 1 && rule.daylightTimeRule.wDay == 1) {
- // Fake "DST transition" at start of year producing the same offset as
- // previous year ended in.
- if (rule.standardTimeBias + rule.daylightTimeBias == oldYearOffset)
- dst = QTimeZonePrivate::invalidMSecs();
- } else if (rule.daylightTimeRule.wMonth == 12 && rule.daylightTimeRule.wDay > 3) {
- // Similar, conjectured, for end of year, not changing offset.
- if (rule.daylightTimeBias == 0)
- dst = QTimeZonePrivate::invalidMSecs();
+ if (rule.standardTimeBias + rule.daylightTimeBias == oldYearOffset
+ && isAtStartOfYear(rule.daylightTimeRule, year)) {
+ dst = QTimeZonePrivate::invalidMSecs();
+ fakesDst = true;
}
- if (rule.standardTimeRule.wMonth == 1 && rule.standardTimeRule.wDay == 1) {
- // Fake "transition out of DST" at start of year producing the same
- // offset as previous year ended in.
- if (rule.standardTimeBias == oldYearOffset)
- std = QTimeZonePrivate::invalidMSecs();
- } else if (rule.standardTimeRule.wMonth == 12 && rule.standardTimeRule.wDay > 3) {
- // Similar, conjectured, for end of year, not changing offset.
- if (rule.daylightTimeBias == 0)
- std = QTimeZonePrivate::invalidMSecs();
+ if (rule.standardTimeBias == oldYearOffset
+ && isAtStartOfYear(rule.standardTimeRule, year)) {
+ Q_ASSERT_X(!fakesDst, "TransitionTimePair",
+ "Year with (DST bias zero and) both transitions fake !");
+ std = QTimeZonePrivate::invalidMSecs();
+ fakesDst = true;
}
}
- bool fakesDst() const
+ bool startsInDst() const
{
- return std == QTimeZonePrivate::invalidMSecs()
- || dst == QTimeZonePrivate::invalidMSecs();
+ // Year starts in daylightTimeRule iff it has a valid transition out of
+ // DST with no earlier valid transition into it.
+ return std != QTimeZonePrivate::invalidMSecs()
+ && (std < dst || dst == QTimeZonePrivate::invalidMSecs());
+ }
+
+ // Returns true if (assuming this pair was derived from the first rule, and
+ // that has non-zero wMonth values, so is a DST-recurrence or faking it) the
+ // given millis, presumed to be in the given year, is before the first
+ // transition into DST.
+ bool beforeInitialDst(int year, qint64 millis) const
+ {
+ return !fakesDst && (year == FIRST_DST_YEAR ? millis < dst : year < FIRST_DST_YEAR);
+ }
+
+ QTimeZonePrivate::Data ruleToData(const QWinTimeZonePrivate::QWinTransitionRule &rule,
+ const QWinTimeZonePrivate *tzp, bool isDst) const
+ {
+ const auto type = isDst ? QTimeZone::DaylightTime : QTimeZone::StandardTime;
+ auto time = isDst ? dst : std;
+ // The isDst we're asked for may be set to the valid one of dst and
+ // std, when fake, but not always - so make sure:
+ if (fakesDst && time == QTimeZonePrivate::invalidMSecs())
+ time = isDst ? std : dst;
+ return tzp->ruleToData(rule, time, type, fakesDst);
}
};
@@ -396,7 +444,7 @@ QLocale::Territory userTerritory()
: QLocale::AnyTerritory;
}
-// Index of last rule in rules with .startYear <= year:
+// Index of last rule in rules with .startYear <= year, or 0 if none satisfies that:
int ruleIndexForYear(const QList<QWinTimeZonePrivate::QWinTransitionRule> &rules, int year)
{
if (rules.last().startYear <= year)
@@ -465,11 +513,19 @@ void QWinTimeZonePrivate::init(const QByteArray &ianaId)
m_windowsId = ianaIdToWindowsId(ianaId);
m_id = ianaId;
}
+ const auto initialYear = [](const QWinTransitionRule &rule) {
+ // Only applicable to the first rule, and only if not faking DST.
+ // The rule starts in FIRST_DST_YEAR if it is a DST recurrence (with
+ // non-zero wMonth fields), otherwise read as a constant
+ // offset rule dating back to the start of time.
+ return (rule.standardTimeRule.wMonth > 0 || rule.daylightTimeRule.wMonth > 0
+ ? FIRST_DST_YEAR : int(QDateTime::YearRange::First));
+ };
bool badMonth = false; // Only warn once per zone, if at all.
if (!m_windowsId.isEmpty()) {
// Open the base TZI for the time zone
- const QString baseKeyPath = QString::fromWCharArray(tzRegPath) + QLatin1Char('\\')
+ const QString baseKeyPath = QString::fromWCharArray(tzRegPath) + u'\\'
+ QString::fromUtf8(m_windowsId);
QWinRegistryKey baseKey(HKEY_LOCAL_MACHINE, baseKeyPath);
if (baseKey.isValid()) {
@@ -478,7 +534,7 @@ void QWinTimeZonePrivate::init(const QByteArray &ianaId)
m_standardName = baseKey.stringValue(L"Std");
m_daylightName = baseKey.stringValue(L"Dlt");
// On Vista and later the optional dynamic key holds historic data
- const QString dynamicKeyPath = baseKeyPath + QLatin1String("\\Dynamic DST");
+ const QString dynamicKeyPath = baseKeyPath + "\\Dynamic DST"_L1;
QWinRegistryKey dynamicKey(HKEY_LOCAL_MACHINE, dynamicKeyPath);
if (dynamicKey.isValid()) {
// Find out the start and end years stored, then iterate over them
@@ -502,8 +558,10 @@ void QWinTimeZonePrivate::init(const QByteArray &ianaId)
"this may cause mistakes for %s from %d",
ianaId.constData(), year);
}
- rule.startYear =
- m_tranRules.isEmpty() ? int(QDateTime::YearRange::First) : year;
+ const TransitionTimePair pair(rule, year, rule.standardTimeBias);
+ // First rule may be a standard offset change, for which fakesDst is true.
+ rule.startYear
+ = m_tranRules.size() || pair.fakesDst ? year : initialYear(rule);
m_tranRules.append(rule);
}
}
@@ -511,9 +569,10 @@ void QWinTimeZonePrivate::init(const QByteArray &ianaId)
// No dynamic data so use the base data
bool ruleOk;
QWinTransitionRule rule = readRegistryRule(baseKey, L"TZI", &ruleOk);
- rule.startYear = int(QDateTime::YearRange::First);
- if (ruleOk)
+ if (ruleOk) {
+ rule.startYear = initialYear(rule);
m_tranRules.append(rule);
+ }
}
}
}
@@ -596,42 +655,44 @@ QTimeZonePrivate::Data QWinTimeZonePrivate::data(qint64 forMSecsSinceEpoch) cons
for (int ruleIndex = ruleIndexForYear(m_tranRules, year);
ruleIndex >= 0; --ruleIndex) {
const QWinTransitionRule &rule = m_tranRules.at(ruleIndex);
- // Does this rule's period include any transition at all ?
- if (rule.standardTimeRule.wMonth > 0 || rule.daylightTimeRule.wMonth > 0) {
- int prior = year == 1 ? -1 : year - 1; // No year 0.
- const int endYear = qMax(rule.startYear, prior);
- while (year >= endYear) {
- const int newYearOffset = (year <= rule.startYear && ruleIndex > 0)
- ? yearEndOffset(m_tranRules.at(ruleIndex - 1), prior)
- : yearEndOffset(rule, prior);
- const TransitionTimePair pair(rule, year, newYearOffset);
- bool isDst = false;
- if (pair.std != invalidMSecs() && pair.std <= forMSecsSinceEpoch) {
- isDst = pair.std < pair.dst && pair.dst <= forMSecsSinceEpoch;
- } else if (pair.dst != invalidMSecs() && pair.dst <= forMSecsSinceEpoch) {
- isDst = true;
- } else {
- year = prior; // Try an earlier year for this rule (once).
- prior = year == 1 ? -1 : year - 1; // No year 0.
- continue;
- }
- return ruleToData(rule, forMSecsSinceEpoch,
- isDst ? QTimeZone::DaylightTime : QTimeZone::StandardTime,
- pair.fakesDst());
- }
- // Fell off start of rule, try previous rule.
- } else {
- // No transition, no DST, use the year's standard time.
+ Q_ASSERT(ruleIndex == 0 || year >= rule.startYear);
+ if (year < rule.startYear
+ || !(rule.standardTimeRule.wMonth > 0 || rule.daylightTimeRule.wMonth > 0)) {
+ // No transition (or before first rule), no DST, use the rule's standard time.
return ruleToData(rule, forMSecsSinceEpoch, QTimeZone::StandardTime);
}
- if (year >= rule.startYear) {
- year = rule.startYear - 1; // Seek last transition in new rule.
- if (!year)
- --year;
+
+ int prior = year == 1 ? -1 : year - 1; // No year 0.
+ const int endYear = qMax(rule.startYear, prior);
+ while (year >= endYear) {
+ const int newYearOffset = (prior < rule.startYear && ruleIndex > 0)
+ ? yearEndOffset(m_tranRules.at(ruleIndex - 1), prior)
+ : yearEndOffset(rule, prior);
+ const TransitionTimePair pair(rule, year, newYearOffset);
+ bool isDst = false;
+ if (ruleIndex == 0 && pair.beforeInitialDst(year, forMSecsSinceEpoch)) {
+ // We're before DST first started and have no earlier rule that
+ // might give better data on this year, so just extrapolate
+ // standard time backwards.
+ } else if (pair.std != invalidMSecs() && pair.std <= forMSecsSinceEpoch) {
+ isDst = pair.std < pair.dst && pair.dst <= forMSecsSinceEpoch;
+ } else if (pair.dst != invalidMSecs() && pair.dst <= forMSecsSinceEpoch) {
+ isDst = true;
+ } else {
+ year = prior; // Try an earlier year for this rule (once).
+ prior = year == 1 ? -1 : year - 1; // No year 0.
+ continue;
+ }
+ return ruleToData(rule, forMSecsSinceEpoch,
+ isDst ? QTimeZone::DaylightTime : QTimeZone::StandardTime,
+ pair.fakesDst);
}
+ // We can only fall off the end of that loop if endYear is rule.startYear:
+ Q_ASSERT(year < rule.startYear);
+ // Fell off start of rule, try previous rule.
}
// We don't have relevant data :-(
- return invalidData();
+ return {};
}
bool QWinTimeZonePrivate::hasTransitions() const
@@ -646,24 +707,46 @@ bool QWinTimeZonePrivate::hasTransitions() const
QTimeZonePrivate::Data QWinTimeZonePrivate::nextTransition(qint64 afterMSecsSinceEpoch) const
{
int year = msecsToDate(afterMSecsSinceEpoch).year();
+ int newYearOffset = invalidSeconds();
for (int ruleIndex = ruleIndexForYear(m_tranRules, year);
ruleIndex < m_tranRules.count(); ++ruleIndex) {
const QWinTransitionRule &rule = m_tranRules.at(ruleIndex);
// Does this rule's period include any transition at all ?
if (rule.standardTimeRule.wMonth > 0 || rule.daylightTimeRule.wMonth > 0) {
- if (year < rule.startYear)
- year = rule.startYear; // Seek first transition in this rule.
+ int prior = year == 1 ? -1 : year - 1; // No year 0.
+ if (newYearOffset == invalidSeconds()) {
+ // First rule tried. (Will revise newYearOffset before any
+ // fall-back to a later rule.)
+ newYearOffset = (prior < rule.startYear && ruleIndex > 0)
+ ? yearEndOffset(m_tranRules.at(ruleIndex - 1), prior)
+ : yearEndOffset(rule, prior);
+ }
+ if (year < rule.startYear) {
+ // Either before first rule's start, or we fell off the end of
+ // the rule for year because afterMSecsSinceEpoch is after any
+ // transitions in it. Find first transition in this rule.
+ TransitionTimePair pair(rule, rule.startYear, newYearOffset);
+ // First transition is to DST precisely if the year started in
+ // standard time. If the year is FIRST_DST_YEAR or earlier, it
+ // definitely started in standard time.
+ return pair.ruleToData(rule, this, !(year > FIRST_DST_YEAR && pair.startsInDst()));
+ }
const int endYear = ruleIndex + 1 < m_tranRules.count()
? qMin(m_tranRules.at(ruleIndex + 1).startYear, year + 2) : (year + 2);
- int prior = year == 1 ? -1 : year - 1; // No year 0.
- int newYearOffset = (year <= rule.startYear && ruleIndex > 0)
- ? yearEndOffset(m_tranRules.at(ruleIndex - 1), prior)
- : yearEndOffset(rule, prior);
while (year < endYear) {
const TransitionTimePair pair(rule, year, newYearOffset);
bool isDst = false;
Q_ASSERT(invalidMSecs() <= afterMSecsSinceEpoch); // invalid is min qint64
- if (pair.std > afterMSecsSinceEpoch) {
+ if (ruleIndex == 0 && pair.beforeInitialDst(year, afterMSecsSinceEpoch)) {
+ // This is an initial recurrence rule, whose startYear
+ // (which we know is <= year) is FIRST_DST_YEAR:
+ Q_ASSERT(year == FIRST_DST_YEAR);
+ // This year's DST transition is the first ever DST
+ // transition, and we're before it. The transition back to
+ // standard time is a lie unless the DST one comes before
+ // it; either way, the DST one is next.
+ isDst = true;
+ } else if (pair.std > afterMSecsSinceEpoch) {
isDst = pair.std > pair.dst && pair.dst > afterMSecsSinceEpoch;
} else if (pair.dst > afterMSecsSinceEpoch) {
isDst = true;
@@ -677,36 +760,50 @@ QTimeZonePrivate::Data QWinTimeZonePrivate::nextTransition(qint64 afterMSecsSinc
continue;
}
- if (isDst)
- return ruleToData(rule, pair.dst, QTimeZone::DaylightTime, pair.fakesDst());
- return ruleToData(rule, pair.std, QTimeZone::StandardTime, pair.fakesDst());
+ return pair.ruleToData(rule, this, isDst);
}
// Fell off end of rule, try next rule.
- } // else: no transition during rule's period
+ } else {
+ // No transition during rule's period. If this is our first rule,
+ // record its standard time as newYearOffset for the next rule;
+ // otherwise, it should be consistent with what we have.
+ if (newYearOffset == invalidSeconds())
+ newYearOffset = rule.standardTimeBias;
+ else
+ Q_ASSERT(newYearOffset == rule.standardTimeBias);
+ }
}
// Apparently no transition after the given time:
- return invalidData();
+ return {};
}
QTimeZonePrivate::Data QWinTimeZonePrivate::previousTransition(qint64 beforeMSecsSinceEpoch) const
{
- const qint64 startOfTime = invalidMSecs() + 1;
- if (beforeMSecsSinceEpoch <= startOfTime)
- return invalidData();
+ if (beforeMSecsSinceEpoch <= minMSecs())
+ return {};
int year = msecsToDate(beforeMSecsSinceEpoch).year();
for (int ruleIndex = ruleIndexForYear(m_tranRules, year);
ruleIndex >= 0; --ruleIndex) {
const QWinTransitionRule &rule = m_tranRules.at(ruleIndex);
+ Q_ASSERT(ruleIndex == 0 || year >= rule.startYear);
// Does this rule's period include any transition at all ?
- if (rule.standardTimeRule.wMonth > 0 || rule.daylightTimeRule.wMonth > 0) {
+ if (year >= rule.startYear
+ && (rule.standardTimeRule.wMonth > 0 || rule.daylightTimeRule.wMonth > 0)) {
int prior = year == 1 ? -1 : year - 1; // No year 0.
const int endYear = qMax(rule.startYear, prior);
while (year >= endYear) {
- const int newYearOffset = (year <= rule.startYear && ruleIndex > 0)
+ const int newYearOffset = (prior < rule.startYear && ruleIndex > 0)
? yearEndOffset(m_tranRules.at(ruleIndex - 1), prior)
: yearEndOffset(rule, prior);
const TransitionTimePair pair(rule, year, newYearOffset);
+ // A recurrent DST rule, before DST first started, is a lie:
+ // fake a first transition at the start of time, as for the
+ // other (ruleIndex == 0) case below. Same applies to first
+ // instant of DST; there is no prior (real) transition.
+ if (ruleIndex == 0 && pair.beforeInitialDst(year, beforeMSecsSinceEpoch - 1))
+ return ruleToData(rule, minMSecs(), QTimeZone::StandardTime, false);
+
bool isDst = false;
if (pair.std != invalidMSecs() && pair.std < beforeMSecsSinceEpoch) {
isDst = pair.std < pair.dst && pair.dst < beforeMSecsSinceEpoch;
@@ -717,16 +814,14 @@ QTimeZonePrivate::Data QWinTimeZonePrivate::previousTransition(qint64 beforeMSec
prior = year == 1 ? -1 : year - 1; // No year 0.
continue;
}
- if (isDst)
- return ruleToData(rule, pair.dst, QTimeZone::DaylightTime, pair.fakesDst());
- return ruleToData(rule, pair.std, QTimeZone::StandardTime, pair.fakesDst());
+ return pair.ruleToData(rule, this, isDst);
}
// Fell off start of rule, try previous rule.
} else if (ruleIndex == 0) {
- // Treat a no-transition first rule as a transition at the start of
- // time, so that a scan through all rules *does* see it as the first
- // rule:
- return ruleToData(rule, startOfTime, QTimeZone::StandardTime, false);
+ // Describe time before the first transition in terms of a fictional
+ // transition at the start of time, so that a scan through all rules
+ // *does* see a first rule that supplies the offset for such times:
+ return ruleToData(rule, minMSecs(), QTimeZone::StandardTime, false);
} // else: no transition during rule's period
if (year >= rule.startYear) {
year = rule.startYear - 1; // Seek last transition in new rule
@@ -735,7 +830,7 @@ QTimeZonePrivate::Data QWinTimeZonePrivate::previousTransition(qint64 beforeMSec
}
}
// Apparently no transition before the given time:
- return invalidData();
+ return {};
}
QByteArray QWinTimeZonePrivate::systemTimeZoneId() const
@@ -754,13 +849,16 @@ QByteArray QWinTimeZonePrivate::systemTimeZoneId() const
QList<QByteArray> QWinTimeZonePrivate::availableTimeZoneIds() const
{
- QList<QByteArray> result;
- const auto winIds = availableWindowsIds();
- for (const QByteArray &winId : winIds)
- result += windowsIdToIanaIds(winId);
- std::sort(result.begin(), result.end());
- result.erase(std::unique(result.begin(), result.end()), result.end());
- return result;
+ static const QList<QByteArray> cache = [] {
+ QList<QByteArray> result;
+ const auto winIds = availableWindowsIds();
+ for (const QByteArray &winId : winIds)
+ result += windowsIdToIanaIds(winId);
+ std::sort(result.begin(), result.end());
+ result.erase(std::unique(result.begin(), result.end()), result.end());
+ return result;
+ }();
+ return cache;
}
QTimeZonePrivate::Data QWinTimeZonePrivate::ruleToData(const QWinTransitionRule &rule,
@@ -768,7 +866,7 @@ QTimeZonePrivate::Data QWinTimeZonePrivate::ruleToData(const QWinTransitionRule
QTimeZone::TimeType type,
bool fakeDst) const
{
- Data tran = invalidData();
+ Data tran;
tran.atMSecsSinceEpoch = atMSecsSinceEpoch;
tran.standardTimeOffset = rule.standardTimeBias * -60;
if (fakeDst) {
diff --git a/src/corelib/tools/qalgorithms.h b/src/corelib/tools/qalgorithms.h
index 11e4d9da39..8889effece 100644
--- a/src/corelib/tools/qalgorithms.h
+++ b/src/corelib/tools/qalgorithms.h
@@ -1,45 +1,13 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QALGORITHMS_H
#define QALGORITHMS_H
+#if 0
+#pragma qt_class(QtAlgorithms)
+#endif
+
#include <QtCore/qglobal.h>
#if __has_include(<bit>) && __cplusplus > 201703L
@@ -73,19 +41,11 @@ inline void qDeleteAll(const Container &c)
*/
namespace QAlgorithmsPrivate {
-#ifdef Q_CC_CLANG
-// Clang had a bug where __builtin_ctz/clz/popcount were not marked as constexpr.
-# if (defined __apple_build_version__ && __clang_major__ >= 7) || (Q_CC_CLANG >= 307)
-# define QT_HAS_CONSTEXPR_BUILTINS
-# endif
-#elif defined(Q_CC_MSVC) && !defined(Q_CC_INTEL) && !defined(Q_PROCESSOR_ARM)
-# define QT_HAS_CONSTEXPR_BUILTINS
+#if defined(__cpp_lib_bitops) && __cpp_lib_bitops >= 201907L
+// We use C++20 <bit> operations instead which ensures constexpr bit ops
+# define QT_HAS_CONSTEXPR_BITOPS
#elif defined(Q_CC_GNU)
-# define QT_HAS_CONSTEXPR_BUILTINS
-#endif
-
-#if defined QT_HAS_CONSTEXPR_BUILTINS
-#if defined(Q_CC_GNU) || defined(Q_CC_CLANG)
+# define QT_HAS_CONSTEXPR_BITOPS
# define QT_HAS_BUILTIN_CTZS
constexpr Q_ALWAYS_INLINE uint qt_builtin_ctzs(quint16 v) noexcept
{
@@ -201,9 +161,7 @@ Q_ALWAYS_INLINE uint qt_builtin_clzs(quint16 v) noexcept
// architecture), but unlike the other compilers, MSVC has no option
// to generate code for those processors.
// So it's an acceptable compromise.
-#if defined(__cpp_lib_bitops) && __cpp_lib_bitops >= 201907L
-// We use C++20 <bit> operations instead which ensures constexpr popcount
-#elif defined(__AVX__) || defined(__SSE4_2__) || defined(__POPCNT__)
+#if defined(__AVX__) || defined(__SSE4_2__) || defined(__POPCNT__)
#define QT_POPCOUNT_CONSTEXPR
#define QT_POPCOUNT_RELAXED_CONSTEXPR
#define QALGORITHMS_USE_BUILTIN_POPCOUNT
@@ -232,7 +190,6 @@ Q_ALWAYS_INLINE uint qt_builtin_popcountll(quint64 v) noexcept
#endif // __AVX__ || __SSE4_2__ || __POPCNT__
#endif // MSVC
-#endif // QT_HAS_CONSTEXPR_BUILTINS
#ifndef QT_POPCOUNT_CONSTEXPR
#define QT_POPCOUNT_CONSTEXPR constexpr
@@ -333,7 +290,7 @@ constexpr inline uint qConstexprCountTrailingZeroBits(quint64 v) noexcept
constexpr inline uint qConstexprCountTrailingZeroBits(quint8 v) noexcept
{
unsigned int c = 8; // c will be the number of zero bits on the right
- v &= -signed(v);
+ v &= quint8(-signed(v));
if (v) c--;
if (v & 0x0000000F) c -= 4;
if (v & 0x00000033) c -= 2;
@@ -344,7 +301,7 @@ constexpr inline uint qConstexprCountTrailingZeroBits(quint8 v) noexcept
constexpr inline uint qConstexprCountTrailingZeroBits(quint16 v) noexcept
{
unsigned int c = 16; // c will be the number of zero bits on the right
- v &= -signed(v);
+ v &= quint16(-signed(v));
if (v) c--;
if (v & 0x000000FF) c -= 8;
if (v & 0x00000F0F) c -= 4;
diff --git a/src/corelib/tools/qalgorithms.qdoc b/src/corelib/tools/qalgorithms.qdoc
index 4249cad72e..5fe0b3e8c3 100644
--- a/src/corelib/tools/qalgorithms.qdoc
+++ b/src/corelib/tools/qalgorithms.qdoc
@@ -1,32 +1,9 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
\headerfile <QtAlgorithms>
+ \inmodule QtCore
\title Generic Algorithms
\ingroup funclists
\keyword generic algorithms
@@ -132,18 +109,6 @@
\sa {container classes}, <QtGlobal>
*/
-/*! \fn template <typename T> void qSwap(T &var1, T &var2)
- \relates <QtAlgorithms>
- \deprecated
-
- Use \c std::swap instead.
-
- Exchanges the values of variables \a var1 and \a var2.
-
- Example:
- \snippet code/doc_src_qalgorithms.cpp 0
-*/
-
/*!
\fn template <typename ForwardIterator> void qDeleteAll(ForwardIterator begin, ForwardIterator end)
\relates <QtAlgorithms>
diff --git a/src/corelib/tools/qarraydata.cpp b/src/corelib/tools/qarraydata.cpp
index 9a52898716..6aebd4306a 100644
--- a/src/corelib/tools/qarraydata.cpp
+++ b/src/corelib/tools/qarraydata.cpp
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// Copyright (C) 2016 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include <QtCore/qarraydata.h>
#include <QtCore/private/qnumeric_p.h>
@@ -90,8 +54,8 @@ qsizetype qCalculateBlockSize(qsizetype elementCount, qsizetype elementSize, qsi
Q_ASSERT(elementSize);
size_t bytes;
- if (Q_UNLIKELY(mul_overflow(size_t(elementSize), size_t(elementCount), &bytes)) ||
- Q_UNLIKELY(add_overflow(bytes, size_t(headerSize), &bytes)))
+ if (Q_UNLIKELY(qMulOverflow(size_t(elementSize), size_t(elementCount), &bytes)) ||
+ Q_UNLIKELY(qAddOverflow(bytes, size_t(headerSize), &bytes)))
return -1;
if (Q_UNLIKELY(qsizetype(bytes) < 0))
return -1;
@@ -143,33 +107,30 @@ qCalculateGrowingBlockSize(qsizetype elementCount, qsizetype elementSize, qsizet
return result;
}
-/*!
- \internal
+/*
+ Calculate the byte size for a block of \a capacity objects of size \a
+ objectSize, with a header of size \a headerSize. If the \a option is
+ QArrayData::Grow, the capacity itself adjusted up, preallocating room for
+ more elements to be added later; otherwise, it is an exact calculation.
- Returns \a allocSize plus extra reserved bytes necessary to store '\0'.
- */
-static inline qsizetype reserveExtraBytes(qsizetype allocSize)
+ Returns a structure containing the size in bytes and elements available.
+*/
+static inline CalculateGrowingBlockSizeResult
+calculateBlockSize(qsizetype capacity, qsizetype objectSize, qsizetype headerSize, QArrayData::AllocationOption option)
{
- // We deal with QByteArray and QString only
- constexpr qsizetype extra = qMax(sizeof(QByteArray::value_type), sizeof(QString::value_type));
- if (Q_UNLIKELY(allocSize < 0))
- return -1;
- if (Q_UNLIKELY(add_overflow(allocSize, extra, &allocSize)))
- return -1;
- return allocSize;
-}
+ // Adjust the header size up to account for the trailing null for QString
+ // and QByteArray. This is not checked for overflow because headers sizes
+ // should not be anywhere near the overflow limit.
+ constexpr qsizetype FooterSize = qMax(sizeof(QString::value_type), sizeof(QByteArray::value_type));
+ if (objectSize <= FooterSize)
+ headerSize += FooterSize;
-static inline qsizetype calculateBlockSize(qsizetype &capacity, qsizetype objectSize, qsizetype headerSize, QArrayData::AllocationOption option)
-{
- // Calculate the byte size
// allocSize = objectSize * capacity + headerSize, but checked for overflow
// plus padded to grow in size
if (option == QArrayData::Grow) {
- auto r = qCalculateGrowingBlockSize(capacity, objectSize, headerSize);
- capacity = r.elementCount;
- return r.size;
+ return qCalculateGrowingBlockSize(capacity, objectSize, headerSize);
} else {
- return qCalculateBlockSize(capacity, objectSize, headerSize);
+ return { qCalculateBlockSize(capacity, objectSize, headerSize), capacity };
}
}
@@ -184,27 +145,20 @@ static QArrayData *allocateData(qsizetype allocSize)
return header;
}
-
namespace {
-// QArrayData with strictest alignment requirements supported by malloc()
-struct alignas(std::max_align_t) AlignedQArrayData : QArrayData
-{
+struct AllocationResult {
+ void *data;
+ QArrayData *header;
};
}
+using QtPrivate::AlignedQArrayData;
-
-void *QArrayData::allocate(QArrayData **dptr, qsizetype objectSize, qsizetype alignment,
- qsizetype capacity, QArrayData::AllocationOption option) noexcept
+static inline AllocationResult
+allocateHelper(qsizetype objectSize, qsizetype alignment, qsizetype capacity,
+ QArrayData::AllocationOption option) noexcept
{
- Q_ASSERT(dptr);
- // Alignment is a power of two
- Q_ASSERT(alignment >= qsizetype(alignof(QArrayData))
- && !(alignment & (alignment - 1)));
-
- if (capacity == 0) {
- *dptr = nullptr;
- return nullptr;
- }
+ if (capacity == 0)
+ return {};
qsizetype headerSize = sizeof(AlignedQArrayData);
const qsizetype headerAlignment = alignof(AlignedQArrayData);
@@ -213,16 +167,16 @@ void *QArrayData::allocate(QArrayData **dptr, qsizetype objectSize, qsizetype al
// Allocate extra (alignment - Q_ALIGNOF(AlignedQArrayData)) padding
// bytes so we can properly align the data array. This assumes malloc is
// able to provide appropriate alignment for the header -- as it should!
+ // Effectively, we allocate one QTypedArrayData<T>::AlignmentDummy.
headerSize += alignment - headerAlignment;
}
Q_ASSERT(headerSize > 0);
- qsizetype allocSize = calculateBlockSize(capacity, objectSize, headerSize, option);
- allocSize = reserveExtraBytes(allocSize);
- if (Q_UNLIKELY(allocSize < 0)) { // handle overflow. cannot allocate reliably
- *dptr = nullptr;
- return nullptr;
- }
+ auto blockSize = calculateBlockSize(capacity, objectSize, headerSize, option);
+ capacity = blockSize.elementCount;
+ qsizetype allocSize = blockSize.size;
+ if (Q_UNLIKELY(allocSize < 0)) // handle overflow. cannot allocate reliably
+ return {};
QArrayData *header = allocateData(allocSize);
void *data = nullptr;
@@ -232,20 +186,54 @@ void *QArrayData::allocate(QArrayData **dptr, qsizetype objectSize, qsizetype al
header->alloc = qsizetype(capacity);
}
- *dptr = header;
- return data;
+ return { data, header };
}
-QPair<QArrayData *, void *>
+// Generic size and alignment allocation function
+void *QArrayData::allocate(QArrayData **dptr, qsizetype objectSize, qsizetype alignment,
+ qsizetype capacity, AllocationOption option) noexcept
+{
+ Q_ASSERT(dptr);
+ // Alignment is a power of two
+ Q_ASSERT(alignment >= qsizetype(alignof(QArrayData))
+ && !(alignment & (alignment - 1)));
+
+ auto r = allocateHelper(objectSize, alignment, capacity, option);
+ *dptr = r.header;
+ return r.data;
+}
+
+// Fixed size and alignment allocation functions
+void *QArrayData::allocate1(QArrayData **dptr, qsizetype capacity, AllocationOption option) noexcept
+{
+ Q_ASSERT(dptr);
+
+ auto r = allocateHelper(1, alignof(AlignedQArrayData), capacity, option);
+ *dptr = r.header;
+ return r.data;
+}
+
+void *QArrayData::allocate2(QArrayData **dptr, qsizetype capacity, AllocationOption option) noexcept
+{
+ Q_ASSERT(dptr);
+
+ auto r = allocateHelper(2, alignof(AlignedQArrayData), capacity, option);
+ *dptr = r.header;
+ return r.data;
+}
+
+std::pair<QArrayData *, void *>
QArrayData::reallocateUnaligned(QArrayData *data, void *dataPointer,
qsizetype objectSize, qsizetype capacity, AllocationOption option) noexcept
{
Q_ASSERT(!data || !data->isShared());
const qsizetype headerSize = sizeof(AlignedQArrayData);
- qsizetype allocSize = calculateBlockSize(capacity, objectSize, headerSize, option);
+ auto r = calculateBlockSize(capacity, objectSize, headerSize, option);
+ qsizetype allocSize = r.size;
+ capacity = r.elementCount;
if (Q_UNLIKELY(allocSize < 0))
- return qMakePair<QArrayData *, void *>(nullptr, nullptr);
+ return {};
const qptrdiff offset = dataPointer
? reinterpret_cast<char *>(dataPointer) - reinterpret_cast<char *>(data)
@@ -253,10 +241,6 @@ QArrayData::reallocateUnaligned(QArrayData *data, void *dataPointer,
Q_ASSERT(offset > 0);
Q_ASSERT(offset <= allocSize); // equals when all free space is at the beginning
- allocSize = reserveExtraBytes(allocSize);
- if (Q_UNLIKELY(allocSize < 0)) // handle overflow. cannot reallocate reliably
- return qMakePair(data, dataPointer);
-
QArrayData *header = static_cast<QArrayData *>(::realloc(data, size_t(allocSize)));
if (header) {
header->alloc = capacity;
@@ -264,7 +248,7 @@ QArrayData::reallocateUnaligned(QArrayData *data, void *dataPointer,
} else {
dataPointer = nullptr;
}
- return qMakePair(static_cast<QArrayData *>(header), dataPointer);
+ return {header, dataPointer};
}
void QArrayData::deallocate(QArrayData *data, qsizetype objectSize,
diff --git a/src/corelib/tools/qarraydata.h b/src/corelib/tools/qarraydata.h
index e4250cce47..da83fc1a21 100644
--- a/src/corelib/tools/qarraydata.h
+++ b/src/corelib/tools/qarraydata.h
@@ -1,52 +1,24 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Copyright (C) 2019 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// Copyright (C) 2019 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QARRAYDATA_H
#define QARRAYDATA_H
#include <QtCore/qpair.h>
#include <QtCore/qatomic.h>
+#include <QtCore/qflags.h>
+#include <QtCore/qcontainerfwd.h>
#include <string.h>
QT_BEGIN_NAMESPACE
+#if __has_cpp_attribute(gnu::malloc)
+# define Q_DECL_MALLOCLIKE [[nodiscard, gnu::malloc]]
+#else
+# define Q_DECL_MALLOCLIKE [[nodiscard]]
+#endif
+
template <class T> struct QTypedArrayData;
struct QArrayData
@@ -102,7 +74,7 @@ struct QArrayData
// Returns true if a detach is necessary before modifying the data
// This method is intentionally not const: if you want to know whether
// detaching is necessary, you should be in a non-const function already
- bool needsDetach() const noexcept
+ bool needsDetach() noexcept
{
return ref_.loadRelaxed() > 1;
}
@@ -114,13 +86,17 @@ struct QArrayData
return newSize;
}
- [[nodiscard]]
-#if defined(Q_CC_GNU)
- __attribute__((__malloc__))
-#endif
+ Q_DECL_MALLOCLIKE
static Q_CORE_EXPORT void *allocate(QArrayData **pdata, qsizetype objectSize, qsizetype alignment,
qsizetype capacity, AllocationOption option = QArrayData::KeepSize) noexcept;
- [[nodiscard]] static Q_CORE_EXPORT QPair<QArrayData *, void *> reallocateUnaligned(QArrayData *data, void *dataPointer,
+ Q_DECL_MALLOCLIKE
+ static Q_CORE_EXPORT void *allocate1(QArrayData **pdata, qsizetype capacity,
+ AllocationOption option = QArrayData::KeepSize) noexcept;
+ Q_DECL_MALLOCLIKE
+ static Q_CORE_EXPORT void *allocate2(QArrayData **pdata, qsizetype capacity,
+ AllocationOption option = QArrayData::KeepSize) noexcept;
+
+ [[nodiscard]] static Q_CORE_EXPORT std::pair<QArrayData *, void *> reallocateUnaligned(QArrayData *data, void *dataPointer,
qsizetype objectSize, qsizetype newCapacity, AllocationOption option) noexcept;
static Q_CORE_EXPORT void deallocate(QArrayData *data, qsizetype objectSize,
qsizetype alignment) noexcept;
@@ -128,30 +104,56 @@ struct QArrayData
Q_DECLARE_OPERATORS_FOR_FLAGS(QArrayData::ArrayOptions)
+namespace QtPrivate {
+// QArrayData with strictest alignment requirements supported by malloc()
+#if defined(Q_PROCESSOR_X86_32) && defined(Q_CC_GNU)
+// GCC's definition is incorrect since GCC 8 (commit r240248 in SVN; commit
+// 63012d9a57edc950c5f30242d1e19318b5708060 in Git). This is applied to all
+// GCC-like compilers in case they decide to follow GCC's lead in being wrong.
+constexpr size_t MaxPrimitiveAlignment = 2 * sizeof(void *);
+#else
+constexpr size_t MaxPrimitiveAlignment = alignof(std::max_align_t);
+#endif
+
+struct alignas(MaxPrimitiveAlignment) AlignedQArrayData : QArrayData
+{
+};
+}
+
template <class T>
struct QTypedArrayData
: QArrayData
{
- struct AlignmentDummy { QArrayData header; T data; };
+ struct AlignmentDummy { QtPrivate::AlignedQArrayData header; T data; };
- [[nodiscard]] static QPair<QTypedArrayData *, T *> allocate(qsizetype capacity, AllocationOption option = QArrayData::KeepSize)
+ [[nodiscard]] static std::pair<QTypedArrayData *, T *> allocate(qsizetype capacity, AllocationOption option = QArrayData::KeepSize)
{
static_assert(sizeof(QTypedArrayData) == sizeof(QArrayData));
QArrayData *d;
- void *result = QArrayData::allocate(&d, sizeof(T), alignof(AlignmentDummy), capacity, option);
+ void *result;
+ if constexpr (sizeof(T) == 1) {
+ // necessarily, alignof(T) == 1
+ result = allocate1(&d, capacity, option);
+ } else if constexpr (sizeof(T) == 2) {
+ // alignof(T) may be 1, but that makes no difference
+ result = allocate2(&d, capacity, option);
+ } else {
+ result = QArrayData::allocate(&d, sizeof(T), alignof(AlignmentDummy), capacity, option);
+ }
#if __has_builtin(__builtin_assume_aligned)
+ // and yet we do offer results that have stricter alignment
result = __builtin_assume_aligned(result, Q_ALIGNOF(AlignmentDummy));
#endif
- return qMakePair(static_cast<QTypedArrayData *>(d), static_cast<T *>(result));
+ return {static_cast<QTypedArrayData *>(d), static_cast<T *>(result)};
}
- static QPair<QTypedArrayData *, T *>
+ static std::pair<QTypedArrayData *, T *>
reallocateUnaligned(QTypedArrayData *data, T *dataPointer, qsizetype capacity, AllocationOption option)
{
static_assert(sizeof(QTypedArrayData) == sizeof(QArrayData));
- QPair<QArrayData *, void *> pair =
+ std::pair<QArrayData *, void *> pair =
QArrayData::reallocateUnaligned(data, dataPointer, sizeof(T), capacity, option);
- return qMakePair(static_cast<QTypedArrayData *>(pair.first), static_cast<T *>(pair.second));
+ return {static_cast<QTypedArrayData *>(pair.first), static_cast<T *>(pair.second)};
}
static void deallocate(QArrayData *data) noexcept
@@ -168,6 +170,12 @@ struct QTypedArrayData
(quintptr(data) + sizeof(QArrayData) + alignment - 1) & ~(alignment - 1));
return static_cast<T *>(start);
}
+
+ constexpr static qsizetype max_size() noexcept
+ {
+ // -1 to deal with the pointer one-past-the-end
+ return (QtPrivate::MaxAllocSize - sizeof(QtPrivate::AlignedQArrayData) - 1) / sizeof(T);
+ }
};
namespace QtPrivate {
@@ -208,6 +216,8 @@ struct Q_CORE_EXPORT QContainerImplHelper
};
}
+#undef Q_DECL_MALLOCLIKE
+
QT_END_NAMESPACE
#endif // include guard
diff --git a/src/corelib/tools/qarraydataops.h b/src/corelib/tools/qarraydataops.h
index 9570ab28b8..c3e9821e81 100644
--- a/src/corelib/tools/qarraydataops.h
+++ b/src/corelib/tools/qarraydataops.h
@@ -1,50 +1,15 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// Copyright (C) 2016 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QARRAYDATAOPS_H
#define QARRAYDATAOPS_H
#include <QtCore/qarraydata.h>
#include <QtCore/qcontainertools_impl.h>
+#include <QtCore/qnamespace.h>
-#include <algorithm>
+#include <memory>
#include <new>
#include <string.h>
#include <utility>
@@ -71,6 +36,8 @@ protected:
public:
typedef typename QArrayDataPointer<T>::parameter_type parameter_type;
+ using QArrayDataPointer<T>::QArrayDataPointer;
+
void appendInitialize(qsizetype newSize) noexcept
{
Q_ASSERT(this->isMutable());
@@ -249,6 +216,51 @@ public:
--this->size;
}
+ template <typename Predicate>
+ qsizetype eraseIf(Predicate pred)
+ {
+ qsizetype result = 0;
+ if (this->size == 0)
+ return result;
+
+ if (!this->needsDetach()) {
+ auto end = this->end();
+ auto it = std::remove_if(this->begin(), end, pred);
+ if (it != end) {
+ result = std::distance(it, end);
+ erase(it, result);
+ }
+ } else {
+ const auto begin = this->begin();
+ const auto end = this->end();
+ auto it = std::find_if(begin, end, pred);
+ if (it == end)
+ return result;
+
+ QPodArrayOps<T> other(this->size);
+ Q_CHECK_PTR(other.data());
+ auto dest = other.begin();
+ // std::uninitialized_copy will fallback to ::memcpy/memmove()
+ dest = std::uninitialized_copy(begin, it, dest);
+ dest = q_uninitialized_remove_copy_if(std::next(it), end, dest, pred);
+ other.size = std::distance(other.data(), dest);
+ result = this->size - other.size;
+ this->swap(other);
+ }
+ return result;
+ }
+
+ struct Span { T *begin; T *end; };
+
+ void copyRanges(std::initializer_list<Span> ranges)
+ {
+ auto it = this->begin();
+ std::for_each(ranges.begin(), ranges.end(), [&it](const auto &span) {
+ it = std::copy(span.begin, span.end, it);
+ });
+ this->size = std::distance(this->begin(), it);
+ }
+
void assign(T *b, T *e, parameter_type t) noexcept
{
Q_ASSERT(b <= e);
@@ -911,17 +923,13 @@ public:
Q_ASSERT(distance >= 0 && distance <= this->allocatedCapacity() - this->size);
Q_UNUSED(distance);
-#if __cplusplus >= 202002L
- constexpr bool canUseCopyAppend = std::conjunction_v<
- std::is_convertible<
- typename std::iterator_traits<It>::iterator_category,
- std::contiguous_iterator_tag
- >,
- std::is_same<
+#if __cplusplus >= 202002L && defined(__cpp_concepts) && defined(__cpp_lib_concepts)
+ constexpr bool canUseCopyAppend =
+ std::contiguous_iterator<It> &&
+ std::is_same_v<
std::remove_cv_t<typename std::iterator_traits<It>::value_type>,
T
- >
- >;
+ >;
if constexpr (canUseCopyAppend) {
this->copyAppend(std::to_address(b), std::to_address(e));
} else
@@ -945,15 +953,32 @@ public:
DataPointer old;
// points into range:
- if (QtPrivate::q_points_into_range(b, this->begin(), this->end())) {
+ if (QtPrivate::q_points_into_range(b, *this))
this->detachAndGrow(QArrayData::GrowsAtEnd, n, &b, &old);
- } else {
+ else
this->detachAndGrow(QArrayData::GrowsAtEnd, n, nullptr, nullptr);
- }
Q_ASSERT(this->freeSpaceAtEnd() >= n);
// b might be updated so use [b, n)
this->copyAppend(b, b + n);
}
+
+ void appendUninitialized(qsizetype newSize)
+ {
+ Q_ASSERT(this->isMutable());
+ Q_ASSERT(!this->isShared());
+ Q_ASSERT(newSize > this->size);
+ Q_ASSERT(newSize - this->size <= this->freeSpaceAtEnd());
+
+ T *const b = this->begin();
+ do {
+ auto ptr = b + this->size;
+
+ if constexpr (std::is_constructible_v<T, Qt::Initialization>)
+ new (ptr) T(Qt::Uninitialized);
+ else
+ new (ptr) T; // not T() -- default-construct
+ } while (++this->size != newSize);
+ }
};
} // namespace QtPrivate
diff --git a/src/corelib/tools/qarraydatapointer.h b/src/corelib/tools/qarraydatapointer.h
index 4d83b890cc..6657d40cf9 100644
--- a/src/corelib/tools/qarraydatapointer.h
+++ b/src/corelib/tools/qarraydatapointer.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QARRAYDATAPOINTER_H
#define QARRAYDATAPOINTER_H
@@ -43,6 +7,9 @@
#include <QtCore/qarraydataops.h>
#include <QtCore/qcontainertools_impl.h>
+#include <QtCore/q20functional.h>
+#include <QtCore/q20memory.h>
+
QT_BEGIN_NAMESPACE
template <class T>
@@ -60,27 +27,39 @@ public:
typedef typename std::conditional<pass_parameter_by_value, T, const T &>::type parameter_type;
+ Q_NODISCARD_CTOR
constexpr QArrayDataPointer() noexcept
: d(nullptr), ptr(nullptr), size(0)
{
}
+ Q_NODISCARD_CTOR
QArrayDataPointer(const QArrayDataPointer &other) noexcept
: d(other.d), ptr(other.ptr), size(other.size)
{
ref();
}
+ Q_NODISCARD_CTOR
constexpr QArrayDataPointer(Data *header, T *adata, qsizetype n = 0) noexcept
: d(header), ptr(adata), size(n)
{
}
- explicit QArrayDataPointer(QPair<QTypedArrayData<T> *, T *> adata, qsizetype n = 0) noexcept
+ Q_NODISCARD_CTOR
+ explicit QArrayDataPointer(std::pair<QTypedArrayData<T> *, T *> adata, qsizetype n = 0) noexcept
: d(adata.first), ptr(adata.second), size(n)
{
}
+ Q_NODISCARD_CTOR explicit
+ QArrayDataPointer(qsizetype alloc, qsizetype n = 0,
+ QArrayData::AllocationOption option = QArrayData::KeepSize)
+ : QArrayDataPointer(Data::allocate(alloc, option), n)
+ {
+ }
+
+ Q_NODISCARD_CTOR
static QArrayDataPointer fromRawData(const T *rawData, qsizetype length) noexcept
{
Q_ASSERT(rawData || !length);
@@ -94,12 +73,12 @@ public:
return *this;
}
+ Q_NODISCARD_CTOR
QArrayDataPointer(QArrayDataPointer &&other) noexcept
- : d(other.d), ptr(other.ptr), size(other.size)
+ : d(std::exchange(other.d, nullptr)),
+ ptr(std::exchange(other.ptr, nullptr)),
+ size(std::exchange(other.size, 0))
{
- other.d = nullptr;
- other.ptr = nullptr;
- other.size = 0;
}
QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_MOVE_AND_SWAP(QArrayDataPointer)
@@ -128,7 +107,7 @@ public:
{
if (!deref()) {
(*this)->destroyAll();
- Data::deallocate(d);
+ free(d);
}
}
@@ -149,9 +128,9 @@ public:
void swap(QArrayDataPointer &other) noexcept
{
- qSwap(d, other.d);
- qSwap(ptr, other.ptr);
- qSwap(size, other.size);
+ qt_ptr_swap(d, other.d);
+ qt_ptr_swap(ptr, other.ptr);
+ std::swap(size, other.size);
}
void clear() noexcept(std::is_nothrow_destructible<T>::value)
@@ -168,6 +147,28 @@ public:
/*! \internal
+ Reinterprets the data of this QArrayDataPointer to type X. It's the
+ caller's responsibility to ensure that the data contents are valid and
+ properly aligned, particularly if T and X are not trivial types (i.e,
+ don't do that). The current size is kept and the allocated capacity is
+ updated to account for the difference in the element type's size.
+
+ This is used in QString::fromLatin1 to perform in-place conversion of
+ QString to QByteArray.
+ */
+ template <typename X> QArrayDataPointer<X> reinterpreted() &&
+ {
+ if (sizeof(T) != sizeof(X)) {
+ Q_ASSERT(!d->isShared());
+ d->alloc = d->alloc * sizeof(T) / sizeof(X);
+ }
+ auto od = reinterpret_cast<QTypedArrayData<X> *>(std::exchange(d, nullptr));
+ auto optr = reinterpret_cast<X *>(std::exchange(ptr, nullptr));
+ return { od, optr, std::exchange(size, 0) };
+ }
+
+ /*! \internal
+
Detaches this (optionally) and grows to accommodate the free space for
\a n elements at the required side. The side is determined from \a pos.
@@ -314,11 +315,123 @@ public:
T *res = this->ptr + offset;
QtPrivate::q_relocate_overlap_n(this->ptr, this->size, res);
// first update data pointer, then this->ptr
- if (data && QtPrivate::q_points_into_range(*data, this->begin(), this->end()))
+ if (data && QtPrivate::q_points_into_range(*data, *this))
*data += offset;
this->ptr = res;
}
+ template <typename InputIterator, typename Projection = q20::identity>
+ void assign(InputIterator first, InputIterator last, Projection proj = {})
+ {
+ // This function only provides the basic exception guarantee.
+ constexpr bool IsFwdIt = std::is_convertible_v<
+ typename std::iterator_traits<InputIterator>::iterator_category,
+ std::forward_iterator_tag>;
+ constexpr bool IsIdentity = std::is_same_v<Projection, q20::identity>;
+
+ if constexpr (IsFwdIt) {
+ const qsizetype n = std::distance(first, last);
+ if (needsDetach() || n > constAllocatedCapacity()) {
+ QArrayDataPointer allocated(detachCapacity(n));
+ swap(allocated);
+ }
+ } else if (needsDetach()) {
+ QArrayDataPointer allocated(allocatedCapacity());
+ swap(allocated);
+ // We don't want to copy data that we know we'll overwrite
+ }
+
+ auto offset = freeSpaceAtBegin();
+ const auto capacityBegin = begin() - offset;
+ const auto prependBufferEnd = begin();
+
+ if constexpr (!std::is_nothrow_constructible_v<T, decltype(std::invoke(proj, *first))>) {
+ // If construction can throw, and we have freeSpaceAtBegin(),
+ // it's easiest to just clear the container and start fresh.
+ // The alternative would be to keep track of two active, disjoint ranges.
+ if (offset) {
+ (*this)->truncate(0);
+ setBegin(capacityBegin);
+ offset = 0;
+ }
+ }
+
+ auto dst = capacityBegin;
+ const auto dend = end();
+ if (offset) { // avoids dead stores
+ setBegin(capacityBegin); // undo prepend optimization
+
+ // By construction, the following loop is nothrow!
+ // (otherwise, we can't reach here)
+ // Assumes InputIterator operations don't throw.
+ // (but we can't statically assert that, as these operations
+ // have preconditons, so typically aren't noexcept)
+ while (true) {
+ if (dst == prependBufferEnd) { // ran out of prepend buffer space
+ size += offset;
+ // we now have a contiguous buffer, continue with the main loop:
+ break;
+ }
+ if (first == last) { // ran out of elements to assign
+ std::destroy(prependBufferEnd, dend);
+ size = dst - begin();
+ return;
+ }
+ // construct element in prepend buffer
+ q20::construct_at(dst, std::invoke(proj, *first));
+ ++dst;
+ ++first;
+ }
+ }
+
+ while (true) {
+ if (first == last) { // ran out of elements to assign
+ std::destroy(dst, dend);
+ break;
+ }
+ if (dst == dend) { // ran out of existing elements to overwrite
+ if constexpr (IsFwdIt && IsIdentity) {
+ dst = std::uninitialized_copy(first, last, dst);
+ break;
+ } else if constexpr (IsFwdIt && !IsIdentity
+ && std::is_nothrow_constructible_v<T, decltype(std::invoke(proj, *first))>) {
+ for (; first != last; ++dst, ++first) // uninitialized_copy with projection
+ q20::construct_at(dst, std::invoke(proj, *first));
+ break;
+ } else {
+ do {
+ (*this)->emplace(size, std::invoke(proj, *first));
+ } while (++first != last);
+ return; // size() is already correct (and dst invalidated)!
+ }
+ }
+ *dst = std::invoke(proj, *first); // overwrite existing element
+ ++dst;
+ ++first;
+ }
+ size = dst - begin();
+ }
+
+ QArrayDataPointer sliced(qsizetype pos, qsizetype n) const &
+ {
+ QArrayDataPointer result(n);
+ std::uninitialized_copy_n(begin() + pos, n, result.begin());
+ result.size = n;
+ return result;
+ }
+
+ QArrayDataPointer sliced(qsizetype pos, qsizetype n) &&
+ {
+ if (needsDetach())
+ return sliced(pos, n);
+ T *newBeginning = begin() + pos;
+ std::destroy(begin(), newBeginning);
+ std::destroy(newBeginning + n, end());
+ setBegin(newBeginning);
+ size = n;
+ return std::move(*this);
+ }
+
// forwards from QArrayData
qsizetype allocatedCapacity() noexcept { return d ? d->allocatedCapacity() : 0; }
qsizetype constAllocatedCapacity() const noexcept { return d ? d->constAllocatedCapacity() : 0; }
@@ -393,7 +506,7 @@ public:
};
template <class T>
-inline void qSwap(QArrayDataPointer<T> &p1, QArrayDataPointer<T> &p2) noexcept
+inline void swap(QArrayDataPointer<T> &p1, QArrayDataPointer<T> &p2) noexcept
{
p1.swap(p2);
}
diff --git a/src/corelib/tools/qatomicscopedvaluerollback.h b/src/corelib/tools/qatomicscopedvaluerollback.h
new file mode 100644
index 0000000000..8f653acba5
--- /dev/null
+++ b/src/corelib/tools/qatomicscopedvaluerollback.h
@@ -0,0 +1,127 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QATOMICSCOPEDVALUEROLLBACK_H
+#define QATOMICSCOPEDVALUEROLLBACK_H
+
+#include <QtCore/qassert.h>
+#include <QtCore/qatomic.h>
+#include <QtCore/qcompilerdetection.h>
+#include <QtCore/qtclasshelpermacros.h>
+#include <QtCore/qtconfigmacros.h>
+
+#include <atomic>
+
+QT_BEGIN_NAMESPACE
+
+template <typename T>
+class QAtomicScopedValueRollback
+{
+ std::atomic<T> &m_atomic;
+ T m_value;
+ std::memory_order m_mo;
+
+ Q_DISABLE_COPY_MOVE(QAtomicScopedValueRollback)
+
+ static constexpr std::memory_order store_part(std::memory_order mo) noexcept
+ {
+ switch (mo) {
+ case std::memory_order_relaxed:
+ case std::memory_order_consume:
+ case std::memory_order_acquire: return std::memory_order_relaxed;
+ case std::memory_order_release:
+ case std::memory_order_acq_rel: return std::memory_order_release;
+ case std::memory_order_seq_cst: return std::memory_order_seq_cst;
+ }
+ // GCC 8.x does not treat __builtin_unreachable() as constexpr
+#if !defined(Q_CC_GNU_ONLY) || (Q_CC_GNU >= 900)
+ // NOLINTNEXTLINE(qt-use-unreachable-return): Triggers on Clang, breaking GCC 8
+ Q_UNREACHABLE();
+#endif
+ return std::memory_order_seq_cst;
+ }
+
+ static constexpr std::memory_order load_part(std::memory_order mo) noexcept
+ {
+ switch (mo) {
+ case std::memory_order_relaxed:
+ case std::memory_order_release: return std::memory_order_relaxed;
+ case std::memory_order_consume: return std::memory_order_consume;
+ case std::memory_order_acquire:
+ case std::memory_order_acq_rel: return std::memory_order_acquire;
+ case std::memory_order_seq_cst: return std::memory_order_seq_cst;
+ }
+ // GCC 8.x does not treat __builtin_unreachable() as constexpr
+#if !defined(Q_CC_GNU_ONLY) || (Q_CC_GNU >= 900)
+ // NOLINTNEXTLINE(qt-use-unreachable-return): Triggers on Clang, breaking GCC 8
+ Q_UNREACHABLE();
+#endif
+ return std::memory_order_seq_cst;
+ }
+public:
+ //
+ // std::atomic:
+ //
+ Q_NODISCARD_CTOR
+ explicit constexpr
+ QAtomicScopedValueRollback(std::atomic<T> &var,
+ std::memory_order mo = std::memory_order_seq_cst)
+ : m_atomic(var), m_value(var.load(load_part(mo))), m_mo(mo) {}
+
+ Q_NODISCARD_CTOR
+ explicit constexpr
+ QAtomicScopedValueRollback(std::atomic<T> &var, T value,
+ std::memory_order mo = std::memory_order_seq_cst)
+ : m_atomic(var), m_value(var.exchange(value, mo)), m_mo(mo) {}
+
+ //
+ // Q(Basic)AtomicInteger:
+ //
+ Q_NODISCARD_CTOR
+ explicit constexpr
+ QAtomicScopedValueRollback(QBasicAtomicInteger<T> &var,
+ std::memory_order mo = std::memory_order_seq_cst)
+ : QAtomicScopedValueRollback(var._q_value, mo) {}
+
+ Q_NODISCARD_CTOR
+ explicit constexpr
+ QAtomicScopedValueRollback(QBasicAtomicInteger<T> &var, T value,
+ std::memory_order mo = std::memory_order_seq_cst)
+ : QAtomicScopedValueRollback(var._q_value, value, mo) {}
+
+ //
+ // Q(Basic)AtomicPointer:
+ //
+ Q_NODISCARD_CTOR
+ explicit constexpr
+ QAtomicScopedValueRollback(QBasicAtomicPointer<std::remove_pointer_t<T>> &var,
+ std::memory_order mo = std::memory_order_seq_cst)
+ : QAtomicScopedValueRollback(var._q_value, mo) {}
+
+ Q_NODISCARD_CTOR
+ explicit constexpr
+ QAtomicScopedValueRollback(QBasicAtomicPointer<std::remove_pointer_t<T>> &var, T value,
+ std::memory_order mo = std::memory_order_seq_cst)
+ : QAtomicScopedValueRollback(var._q_value, value, mo) {}
+
+ ~QAtomicScopedValueRollback()
+ {
+ m_atomic.store(m_value, store_part(m_mo));
+ }
+
+ void commit()
+ {
+ m_value = m_atomic.load(load_part(m_mo));
+ }
+};
+
+template <typename T>
+QAtomicScopedValueRollback(QBasicAtomicPointer<T> &)
+ -> QAtomicScopedValueRollback<T*>;
+template <typename T>
+QAtomicScopedValueRollback(QBasicAtomicPointer<T> &, std::memory_order)
+ -> QAtomicScopedValueRollback<T*>;
+
+QT_END_NAMESPACE
+
+#endif // QATOMICASCOPEDVALUEROLLBACK_H
diff --git a/src/corelib/tools/qatomicscopedvaluerollback.qdoc b/src/corelib/tools/qatomicscopedvaluerollback.qdoc
new file mode 100644
index 0000000000..8c8161cb35
--- /dev/null
+++ b/src/corelib/tools/qatomicscopedvaluerollback.qdoc
@@ -0,0 +1,123 @@
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
+
+QT_BEGIN_NAMESPACE
+
+/*!
+ \class QAtomicScopedValueRollback
+ \inmodule QtCore
+ \brief Provides a QScopedValueRollback for atomic variables.
+ \ingroup misc
+ \ingroup tools
+ \since 6.7
+
+ The QAtomicScopedValueRollback class resets an atomic variable to its
+ prior value on destruction. It can be used to revert state when an
+ exception is thrown without the need to write try-catch blocks.
+
+ It can also be used to manage variables that are temporarily set, such as
+ reentrancy guards. By using this class, the variable will be reset whether the
+ function is exited normally, exited early by a return statement, or exited by
+ an exception.
+
+ The class works on std::atomic and the Qt atomic classes: QBasicAtomicInteger,
+ \l QAtomicInteger, \l QAtomicInt, QBasicAtomicPointer and \l QAtomicPointer.
+
+ \target Memory Order
+ The memory accesses to the atomic variable \a var are specified using the value
+ of \c mo. The memory order follows this mapping:
+ \br
+ \list
+ \li When writing to the atomic variable:
+ \list
+ \li An acquire ordering performs a relaxed operation instead.
+ \li A hybrid acquire-release ordering performs a release operation instead.
+ \endlist
+ \li When reading from the atomic variable:
+ \list
+ \li A release ordering performs a relaxed operation instead.
+ \li A consume ordering performs a consume operation.
+ \li A hybrid acquire-release ordering performs an acquire operation instead.
+ \endlist
+ \endlist
+ \br
+ Otherwise, the default memory order is sequential consistent ordering.
+
+ \note You should never name the template arguments explicitly, but exclusively
+ use Class Template Argument Deduction (CTAD) and let the compiler pick the
+ template argument.
+
+ \note There is a chance that other threads modify the variable too, which means
+ you may lose updates performed by other threads between the call to the
+ QAtomicScopedValueRollback constructor and commit() or between commit() and the
+ destructor.
+
+ \sa QScopedValueRollback
+*/
+
+/*!
+ \fn template <typename T> QAtomicScopedValueRollback<T>::QAtomicScopedValueRollback(std::atomic<T> &var, std::memory_order mo = std::memory_order_seq_cst)
+ \fn template <typename T> QAtomicScopedValueRollback<T>::QAtomicScopedValueRollback(QBasicAtomicInteger<T> &var, std::memory_order mo = std::memory_order_seq_cst)
+ \fn template <typename T> QAtomicScopedValueRollback<T>::QAtomicScopedValueRollback(QBasicAtomicPointer<std::remove_pointer_t<T>> &var, std::memory_order mo = std::memory_order_seq_cst)
+
+ Records the value of \a var in order to restore it on destruction.
+
+ This is equivalent to:
+ \code
+ T old_value = var.load(mo);
+ // And in the destructor: var.store(old_value, mo);
+ \endcode
+ The \c{mo} adjustment for the load is described in the \l {Memory Order} section.
+*/
+
+/*!
+ \fn template <typename T> QAtomicScopedValueRollback<T>::QAtomicScopedValueRollback(std::atomic<T> &var, T value, std::memory_order mo = std::memory_order_seq_cst)
+ \fn template <typename T> QAtomicScopedValueRollback<T>::QAtomicScopedValueRollback(QBasicAtomicInteger<T> &var, T value, std::memory_order mo = std::memory_order_seq_cst)
+ \fn template <typename T> QAtomicScopedValueRollback<T>::QAtomicScopedValueRollback(QBasicAtomicPointer<std::remove_pointer_t<T>> &var, T value, std::memory_order mo = std::memory_order_seq_cst)
+
+ Assigns \a value to \a var and stores the prior value of \a var internally for
+ reverting on destruction.
+
+ This is equivalent to:
+ \code
+ T old_value = var.exchange(new_value, mo);
+ // And in the destructor: var.store(old_value, mo);
+ \endcode
+*/
+
+/*!
+ \fn template <typename T> QAtomicScopedValueRollback<T>::~QAtomicScopedValueRollback()
+
+ Restores the stored value that was current at construction time, or
+ at the last call to commit(), to the managed variable.
+
+ This is equivalent to:
+ \code
+ // In the constructor: T old_value = var.load(mo);
+ // or: T old_value = exchange(new_value, mo);
+ var.store(old_value, mo);
+ \endcode
+ Where \c{mo} is the same as the one initially passed to the constructor.
+ See \l{Memory Order} for the meaning of \c{mo}.
+*/
+
+/*!
+ \fn template <typename T> void QAtomicScopedValueRollback<T>::commit()
+
+ Updates the stored value to the managed variable's current value, loaded
+ with the same memory order as on construction.
+
+ This updated value will be restored on destruction, instead of the original
+ prior value.
+
+ This is equivalent to:
+ \code
+ // Given constructor: T old_value = var.load(mo);
+ old_value = var.load(mo); // referesh it
+ // And, in the destructor: var.store(old_value, mo);
+ \endcode
+ Where \c{mo} is the same as the one initially passed to the constructor.
+ See \l{Memory Order} for the meaning of \c{mo}.
+*/
+
+QT_END_NAMESPACE
diff --git a/src/corelib/tools/qbitarray.cpp b/src/corelib/tools/qbitarray.cpp
index 18ce7035d9..e4276d383d 100644
--- a/src/corelib/tools/qbitarray.cpp
+++ b/src/corelib/tools/qbitarray.cpp
@@ -1,48 +1,15 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Copyright (C) 2019 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// Copyright (C) 2019 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qbitarray.h"
#include <qalgorithms.h>
#include <qdatastream.h>
#include <qdebug.h>
#include <qendian.h>
+
+#include <limits>
+
#include <string.h>
QT_BEGIN_NAMESPACE
@@ -56,6 +23,8 @@ QT_BEGIN_NAMESPACE
\ingroup shared
\reentrant
+ \compares equality
+
A QBitArray is an array that gives access to individual bits and
provides operators (\l{operator&()}{AND}, \l{operator|()}{OR},
\l{operator^()}{XOR}, and \l{operator~()}{NOT}) that work on
@@ -110,6 +79,7 @@ QT_BEGIN_NAMESPACE
\sa QByteArray, QList
*/
+#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0)
/*!
\fn QBitArray::QBitArray(QBitArray &&other)
@@ -118,6 +88,7 @@ QT_BEGIN_NAMESPACE
\since 5.2
*/
+#endif
/*! \fn QBitArray::QBitArray()
@@ -140,22 +111,39 @@ QT_BEGIN_NAMESPACE
* inline qsizetype size() const { return (d.size() << 3) - *d.constData(); }
*/
+static constexpr qsizetype storage_size(qsizetype size)
+{
+ // avoid overflow when adding 7, by doing the arithmetic in unsigned space:
+ return qsizetype((size_t(size) + 7) / 8);
+}
+
+static constexpr qsizetype allocation_size(qsizetype size)
+{
+ return size <= 0 ? 0 : storage_size(size) + 1;
+}
+
+static void adjust_head_and_tail(char *data, qsizetype storageSize, qsizetype logicalSize)
+{
+ quint8 *c = reinterpret_cast<quint8 *>(data);
+ // store the difference between storage and logical size in d[0]:
+ *c = quint8(size_t(storageSize) * 8 - logicalSize);
+ // reset unallocated bits to 0:
+ if (logicalSize & 7)
+ *(c + 1 + logicalSize / 8) &= (1 << (logicalSize & 7)) - 1;
+}
+
/*!
Constructs a bit array containing \a size bits. The bits are
initialized with \a value, which defaults to false (0).
*/
QBitArray::QBitArray(qsizetype size, bool value)
- : d(size <= 0 ? 0 : 1 + (size + 7) / 8, Qt::Uninitialized)
+ : d(allocation_size(size), value ? 0xFF : 0x00)
{
Q_ASSERT_X(size >= 0, "QBitArray::QBitArray", "Size must be greater than or equal to 0.");
if (size <= 0)
return;
- uchar *c = reinterpret_cast<uchar *>(d.data());
- memset(c + 1, value ? 0xff : 0, d.size() - 1);
- *c = d.size() * 8 - size;
- if (value && size && size & 7)
- *(c + 1 + size / 8) &= (1 << (size & 7)) - 1;
+ adjust_head_and_tail(d.data(), d.size(), size);
}
/*! \fn qsizetype QBitArray::size() const
@@ -219,17 +207,12 @@ qsizetype QBitArray::count(bool on) const
*/
void QBitArray::resize(qsizetype size)
{
- if (!size) {
+ Q_ASSERT_X(size >= 0, "QBitArray::resize", "Size must be greater than or equal to 0.");
+ if (size <= 0) {
d.resize(0);
} else {
- qsizetype s = d.size();
- d.resize(1 + (size + 7) / 8);
- uchar *c = reinterpret_cast<uchar *>(d.data());
- if (size > (s << 3))
- memset(c + s, 0, d.size() - s);
- else if (size & 7)
- *(c + 1 + size / 8) &= (1 << (size & 7)) - 1;
- *c = d.size() * 8 - size;
+ d.resize(allocation_size(size), 0x00);
+ adjust_head_and_tail(d.data(), d.size(), size);
}
}
@@ -325,20 +308,15 @@ void QBitArray::fill(bool value, qsizetype begin, qsizetype end)
*/
QBitArray QBitArray::fromBits(const char *data, qsizetype size)
{
+ Q_ASSERT_X(size >= 0, "QBitArray::fromBits", "Size must be greater than or equal to 0.");
QBitArray result;
- if (size == 0)
+ if (size <= 0)
return result;
- qsizetype nbytes = (size + 7) / 8;
-
- result.d = QByteArray(nbytes + 1, Qt::Uninitialized);
- char *bits = result.d.data();
- memcpy(bits + 1, data, nbytes);
-
- // clear any unused bits from the last byte
- if (size & 7)
- bits[nbytes] &= 0xffU >> (8 - (size & 7));
- *bits = result.d.size() * 8 - size;
+ auto &d = result.d;
+ d.resize(allocation_size(size));
+ memcpy(d.data() + 1, data, d.size() - 1);
+ adjust_head_and_tail(d.data(), d.size(), size);
return result;
}
@@ -489,7 +467,8 @@ quint32 QBitArray::toUInt32(QSysInfo::Endian endianness, bool *ok) const noexcep
\overload
*/
-/*! \fn QBitArray::QBitArray(const QBitArray &other)
+#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0)
+/*! \fn QBitArray::QBitArray(const QBitArray &other) noexcept
Constructs a copy of \a other.
@@ -501,7 +480,7 @@ quint32 QBitArray::toUInt32(QSysInfo::Endian endianness, bool *ok) const noexcep
\sa operator=()
*/
-/*! \fn QBitArray &QBitArray::operator=(const QBitArray &other)
+/*! \fn QBitArray &QBitArray::operator=(const QBitArray &other) noexcept
Assigns \a other to this bit array and returns a reference to
this bit array.
@@ -513,6 +492,7 @@ quint32 QBitArray::toUInt32(QSysInfo::Endian endianness, bool *ok) const noexcep
Moves \a other to this bit array and returns a reference to
this bit array.
*/
+#endif // Qt 6
/*! \fn void QBitArray::swap(QBitArray &other)
\since 4.8
@@ -521,23 +501,145 @@ quint32 QBitArray::toUInt32(QSysInfo::Endian endianness, bool *ok) const noexcep
fast and never fails.
*/
-/*! \fn bool QBitArray::operator==(const QBitArray &other) const
+/*! \fn bool QBitArray::operator==(const QBitArray &lhs, const QBitArray &rhs)
- Returns \c true if \a other is equal to this bit array; otherwise
+ Returns \c true if \a lhs is equal to \a rhs bit array; otherwise
returns \c false.
\sa operator!=()
*/
-/*! \fn bool QBitArray::operator!=(const QBitArray &other) const
+/*! \fn bool QBitArray::operator!=(const QBitArray &lhs, const QBitArray &rhs)
- Returns \c true if \a other is not equal to this bit array;
+ Returns \c true if \a lhs is not equal to \a rhs bit array;
otherwise returns \c false.
\sa operator==()
*/
+// Returns a new QBitArray that has the same size as the bigger of \a a1 and
+// \a a2, but whose contents are uninitialized.
+static QBitArray sizedForOverwrite(const QBitArray &a1, const QBitArray &a2)
+{
+ QBitArray result;
+ const QByteArrayData &d1 = a1.data_ptr();
+ const QByteArrayData &d2 = a2.data_ptr();
+ qsizetype n1 = d1.size;
+ qsizetype n2 = d2.size;
+ qsizetype n = qMax(n1, n2);
+
+ QByteArrayData bytes(n, n);
+
+ // initialize the count of bits in the last byte (see construction note)
+ if (n1 > n2)
+ *bytes.ptr = *d1.ptr;
+ else if (n2 > n1)
+ *bytes.ptr = *d2.ptr;
+ else if (n1) // n1 == n2
+ *bytes.ptr = qMin(*d1.ptr, *d2.ptr);
+
+ result.data_ptr() = std::move(bytes);
+ return result;
+}
+
+template <typename BitwiseOp> static Q_NEVER_INLINE
+QBitArray &performBitwiseOperationHelper(QBitArray &out, const QBitArray &a1,
+ const QBitArray &a2, BitwiseOp op)
+{
+ const QByteArrayData &d1 = a1.data_ptr();
+ const QByteArrayData &d2 = a2.data_ptr();
+
+ // Sizes in bytes (including the initial bit difference counter)
+ qsizetype n1 = d1.size;
+ qsizetype n2 = d2.size;
+ Q_ASSERT(out.data_ptr().size == qMax(n1, n2));
+ Q_ASSERT(out.data_ptr().size == 0 || !out.data_ptr().needsDetach());
+
+ // Bypass QByteArray's emptiness verification; we won't dereference
+ // these pointers if their size is zero.
+ auto dst = reinterpret_cast<uchar *>(out.data_ptr().data());
+ auto p1 = reinterpret_cast<const uchar *>(d1.data());
+ auto p2 = reinterpret_cast<const uchar *>(d2.data());
+
+ // Main: perform the operation in the range where both arrays have data
+ if (n1 < n2) {
+ std::swap(n1, n2);
+ std::swap(p1, p2);
+ }
+ for (qsizetype i = 1; i < n2; ++i)
+ dst[i] = op(p1[i], p2[i]);
+
+ // Tail: operate as if both arrays had the same data by padding zeroes to
+ // the end of the shorter of the two (for std::bit_or and std::bit_xor, this is
+ // a memmove; for std::bit_and, it's memset to 0).
+ for (qsizetype i = qMax(n2, qsizetype(1)); i < n1; ++i)
+ dst[i] = op(p1[i], uchar(0));
+
+ return out;
+}
+
+template <typename BitwiseOp> static Q_NEVER_INLINE
+QBitArray &performBitwiseOperationInCopy(QBitArray &self, const QBitArray &other, BitwiseOp op)
+{
+ QBitArray tmp(std::move(self));
+ self = sizedForOverwrite(tmp, other);
+ return performBitwiseOperationHelper(self, tmp, other, op);
+}
+
+template <typename BitwiseOp> static Q_NEVER_INLINE
+QBitArray &performBitwiseOperationInPlace(QBitArray &self, const QBitArray &other, BitwiseOp op)
+{
+ if (self.size() < other.size())
+ self.resize(other.size());
+ return performBitwiseOperationHelper(self, self, other, op);
+}
+
+template <typename BitwiseOp> static
+QBitArray &performBitwiseOperation(QBitArray &self, const QBitArray &other, BitwiseOp op)
+{
+ if (self.data_ptr().needsDetach())
+ return performBitwiseOperationInCopy(self, other, op);
+ return performBitwiseOperationInPlace(self, other, op);
+}
+
+// SCARY helper
+enum { InCopy, InPlace };
+static auto prepareForBitwiseOperation(QBitArray &self, QBitArray &other)
+{
+ QByteArrayData &d1 = self.data_ptr();
+ QByteArrayData &d2 = other.data_ptr();
+ bool detached1 = !d1.needsDetach();
+ bool detached2 = !d2.needsDetach();
+ if (!detached1 && !detached2)
+ return InCopy;
+
+ // at least one of the two is detached, we'll reuse its buffer
+ bool swap = false;
+ if (detached1 && detached2) {
+ // both are detached, so choose the larger of the two
+ swap = d1.allocatedCapacity() < d2.allocatedCapacity();
+ } else if (detached2) {
+ // we can re-use other's buffer but not self's, so swap the two
+ swap = true;
+ }
+ if (swap)
+ self.swap(other);
+ return InPlace;
+}
+
+template <typename BitwiseOp> static
+QBitArray &performBitwiseOperation(QBitArray &self, QBitArray &other, BitwiseOp op)
+{
+ auto choice = prepareForBitwiseOperation(self, other);
+ if (choice == InCopy)
+ return performBitwiseOperationInCopy(self, other, std::move(op));
+ return performBitwiseOperationInPlace(self, other, std::move(op));
+}
+
/*!
+ \fn QBitArray &QBitArray::operator&=(const QBitArray &other)
+ \fn QBitArray &QBitArray::operator&=(QBitArray &&other)
+
Performs the AND operation between all bits in this bit array and
\a other. Assigns the result to this bit array, and returns a
reference to it.
@@ -552,21 +654,20 @@ quint32 QBitArray::toUInt32(QSysInfo::Endian endianness, bool *ok) const noexcep
\sa operator&(), operator|=(), operator^=(), operator~()
*/
+QBitArray &QBitArray::operator&=(QBitArray &&other)
+{
+ return performBitwiseOperation(*this, other, std::bit_and<uchar>());
+}
+
QBitArray &QBitArray::operator&=(const QBitArray &other)
{
- resize(qMax(size(), other.size()));
- uchar *a1 = reinterpret_cast<uchar *>(d.data()) + 1;
- const uchar *a2 = reinterpret_cast<const uchar *>(other.d.constData()) + 1;
- qsizetype n = other.d.size() - 1;
- qsizetype p = d.size() - 1 - n;
- while (n-- > 0)
- *a1++ &= *a2++;
- while (p-- > 0)
- *a1++ = 0;
- return *this;
+ return performBitwiseOperation(*this, other, std::bit_and<uchar>());
}
/*!
+ \fn QBitArray &QBitArray::operator|=(const QBitArray &other)
+ \fn QBitArray &QBitArray::operator|=(QBitArray &&other)
+
Performs the OR operation between all bits in this bit array and
\a other. Assigns the result to this bit array, and returns a
reference to it.
@@ -581,18 +682,20 @@ QBitArray &QBitArray::operator&=(const QBitArray &other)
\sa operator|(), operator&=(), operator^=(), operator~()
*/
+QBitArray &QBitArray::operator|=(QBitArray &&other)
+{
+ return performBitwiseOperation(*this, other, std::bit_or<uchar>());
+}
+
QBitArray &QBitArray::operator|=(const QBitArray &other)
{
- resize(qMax(size(), other.size()));
- uchar *a1 = reinterpret_cast<uchar *>(d.data()) + 1;
- const uchar *a2 = reinterpret_cast<const uchar *>(other.d.constData()) + 1;
- qsizetype n = other.d.size() - 1;
- while (n-- > 0)
- *a1++ |= *a2++;
- return *this;
+ return performBitwiseOperation(*this, other, std::bit_or<uchar>());
}
/*!
+ \fn QBitArray &QBitArray::operator^=(const QBitArray &other)
+ \fn QBitArray &QBitArray::operator^=(QBitArray &&other)
+
Performs the XOR operation between all bits in this bit array and
\a other. Assigns the result to this bit array, and returns a
reference to it.
@@ -607,20 +710,20 @@ QBitArray &QBitArray::operator|=(const QBitArray &other)
\sa operator^(), operator&=(), operator|=(), operator~()
*/
+QBitArray &QBitArray::operator^=(QBitArray &&other)
+{
+ return performBitwiseOperation(*this, other, std::bit_xor<uchar>());
+}
+
QBitArray &QBitArray::operator^=(const QBitArray &other)
{
- resize(qMax(size(), other.size()));
- uchar *a1 = reinterpret_cast<uchar *>(d.data()) + 1;
- const uchar *a2 = reinterpret_cast<const uchar *>(other.d.constData()) + 1;
- qsizetype n = other.d.size() - 1;
- while (n-- > 0)
- *a1++ ^= *a2++;
- return *this;
+ return performBitwiseOperation(*this, other, std::bit_xor<uchar>());
}
/*!
- Returns a bit array that contains the inverted bits of this bit
- array.
+ \fn QBitArray QBitArray::operator~(QBitArray a)
+ Returns a bit array that contains the inverted bits of the bit
+ array \a a.
Example:
\snippet code/src_corelib_tools_qbitarray.cpp 11
@@ -628,24 +731,42 @@ QBitArray &QBitArray::operator^=(const QBitArray &other)
\sa operator&(), operator|(), operator^()
*/
-QBitArray QBitArray::operator~() const
+Q_NEVER_INLINE QBitArray QBitArray::inverted_inplace() &&
{
- qsizetype sz = size();
- QBitArray a(sz);
- const uchar *a1 = reinterpret_cast<const uchar *>(d.constData()) + 1;
- uchar *a2 = reinterpret_cast<uchar *>(a.d.data()) + 1;
- qsizetype n = d.size() - 1;
-
- while (n-- > 0)
- *a2++ = ~*a1++;
-
- if (sz && sz % 8)
- *(a2 - 1) &= (1 << (sz % 8)) - 1;
- return a;
+ qsizetype n = d.size();
+ uchar *dst = reinterpret_cast<uchar *>(data_ptr().data());
+ const uchar *src = dst;
+ QBitArray result([&] {
+ if (d.isDetached() || n == 0)
+ return std::move(d.data_ptr()); // invert in-place
+
+ QByteArrayData tmp(n, n);
+ dst = reinterpret_cast<uchar *>(tmp.data());
+ return tmp;
+ }());
+
+ uchar bitdiff = 8;
+ if (n)
+ bitdiff = dst[0] = src[0]; // copy the count of bits in the last byte
+
+ for (qsizetype i = 1; i < n; ++i)
+ dst[i] = ~src[i];
+
+ if (int tailCount = 16 - bitdiff; tailCount != 8) {
+ // zero the bits beyond our size in the last byte
+ Q_ASSERT(n > 1);
+ uchar tailMask = (1U << tailCount) - 1;
+ dst[n - 1] &= tailMask;
+ }
+
+ return result;
}
/*!
- \relates QBitArray
+ \fn QBitArray QBitArray::operator&(const QBitArray &a1, const QBitArray &a2)
+ \fn QBitArray QBitArray::operator&(QBitArray &&a1, const QBitArray &a2)
+ \fn QBitArray QBitArray::operator&(const QBitArray &a1, QBitArray &&a2)
+ \fn QBitArray QBitArray::operator&(QBitArray &&a1, QBitArray &&a2)
Returns a bit array that is the AND of the bit arrays \a a1 and \a
a2.
@@ -662,13 +783,16 @@ QBitArray QBitArray::operator~() const
QBitArray operator&(const QBitArray &a1, const QBitArray &a2)
{
- QBitArray tmp = a1;
- tmp &= a2;
+ QBitArray tmp = sizedForOverwrite(a1, a2);
+ performBitwiseOperationHelper(tmp, a1, a2, std::bit_and<uchar>());
return tmp;
}
/*!
- \relates QBitArray
+ \fn QBitArray QBitArray::operator|(const QBitArray &a1, const QBitArray &a2)
+ \fn QBitArray QBitArray::operator|(QBitArray &&a1, const QBitArray &a2)
+ \fn QBitArray QBitArray::operator|(const QBitArray &a1, QBitArray &&a2)
+ \fn QBitArray QBitArray::operator|(QBitArray &&a1, QBitArray &&a2)
Returns a bit array that is the OR of the bit arrays \a a1 and \a
a2.
@@ -685,13 +809,16 @@ QBitArray operator&(const QBitArray &a1, const QBitArray &a2)
QBitArray operator|(const QBitArray &a1, const QBitArray &a2)
{
- QBitArray tmp = a1;
- tmp |= a2;
+ QBitArray tmp = sizedForOverwrite(a1, a2);
+ performBitwiseOperationHelper(tmp, a1, a2, std::bit_or<uchar>());
return tmp;
}
/*!
- \relates QBitArray
+ \fn QBitArray QBitArray::operator^(const QBitArray &a1, const QBitArray &a2)
+ \fn QBitArray QBitArray::operator^(QBitArray &&a1, const QBitArray &a2)
+ \fn QBitArray QBitArray::operator^(const QBitArray &a1, QBitArray &&a2)
+ \fn QBitArray QBitArray::operator^(QBitArray &&a1, QBitArray &&a2)
Returns a bit array that is the XOR of the bit arrays \a a1 and \a
a2.
@@ -708,8 +835,8 @@ QBitArray operator|(const QBitArray &a1, const QBitArray &a2)
QBitArray operator^(const QBitArray &a1, const QBitArray &a2)
{
- QBitArray tmp = a1;
- tmp ^= a2;
+ QBitArray tmp = sizedForOverwrite(a1, a2);
+ performBitwiseOperationHelper(tmp, a1, a2, std::bit_xor<uchar>());
return tmp;
}
@@ -769,19 +896,19 @@ QBitArray operator^(const QBitArray &a1, const QBitArray &a2)
QDataStream &operator<<(QDataStream &out, const QBitArray &ba)
{
+ const qsizetype len = ba.size();
if (out.version() < QDataStream::Qt_6_0) {
- quint32 len = ba.size();
- out << len;
- if (len > 0)
- out.writeRawData(ba.d.constData() + 1, ba.d.size() - 1);
- return out;
+ if (Q_UNLIKELY(len > qsizetype{(std::numeric_limits<qint32>::max)()})) {
+ out.setStatus(QDataStream::Status::SizeLimitExceeded);
+ return out;
+ }
+ out << quint32(len);
} else {
- quint64 len = ba.size();
- out << len;
- if (len > 0)
- out.writeRawData(ba.d.constData() + 1, ba.d.size() - 1);
- return out;
+ out << quint64(len);
}
+ if (len > 0)
+ out.writeRawData(ba.d.data() + 1, ba.d.size() - 1);
+ return out;
}
/*!
@@ -799,10 +926,18 @@ QDataStream &operator>>(QDataStream &in, QBitArray &ba)
if (in.version() < QDataStream::Qt_6_0) {
quint32 tmp;
in >> tmp;
+ if (Q_UNLIKELY(tmp > quint32((std::numeric_limits<qint32>::max)()))) {
+ in.setStatus(QDataStream::ReadCorruptData);
+ return in;
+ }
len = tmp;
} else {
quint64 tmp;
in >> tmp;
+ if (Q_UNLIKELY(tmp > quint64((std::numeric_limits<qsizetype>::max)()))) {
+ in.setStatus(QDataStream::Status::SizeLimitExceeded);
+ return in;
+ }
len = tmp;
}
if (len == 0) {
@@ -811,7 +946,7 @@ QDataStream &operator>>(QDataStream &in, QBitArray &ba)
}
const qsizetype Step = 8 * 1024 * 1024;
- qsizetype totalBytes = (len + 7) / 8;
+ const qsizetype totalBytes = storage_size(len);
qsizetype allocated = 0;
while (allocated < totalBytes) {
@@ -825,14 +960,13 @@ QDataStream &operator>>(QDataStream &in, QBitArray &ba)
allocated += blockSize;
}
- qsizetype paddingMask = ~((0x1 << (len & 0x7)) - 1);
- if (paddingMask != ~0x0 && (ba.d.constData()[ba.d.size() - 1] & paddingMask)) {
+ const auto fromStream = ba.d.back();
+ adjust_head_and_tail(ba.d.data(), ba.d.size(), len);
+ if (ba.d.back() != fromStream) {
ba.clear();
in.setStatus(QDataStream::ReadCorruptData);
return in;
}
-
- *ba.d.data() = ba.d.size() * 8 - len;
return in;
}
#endif // QT_NO_DATASTREAM
diff --git a/src/corelib/tools/qbitarray.h b/src/corelib/tools/qbitarray.h
index 75d680dc84..b9c36b5320 100644
--- a/src/corelib/tools/qbitarray.h
+++ b/src/corelib/tools/qbitarray.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QBITARRAY_H
#define QBITARRAY_H
@@ -47,25 +11,70 @@ QT_BEGIN_NAMESPACE
class QBitRef;
class Q_CORE_EXPORT QBitArray
{
+ Q_CORE_EXPORT friend QBitArray operator&(const QBitArray &a1, const QBitArray &a2);
+ friend QBitArray operator&(QBitArray &&a1, const QBitArray &a2)
+ { return a1 &= a2; }
+ friend QBitArray operator&(const QBitArray &a1, QBitArray &&a2)
+ { return a2 &= a1; }
+ friend QBitArray operator&(QBitArray &&a1, QBitArray &&a2)
+ { return a1 &= a2; }
+
+ Q_CORE_EXPORT friend QBitArray operator|(const QBitArray &a1, const QBitArray &a2);
+ friend QBitArray operator|(QBitArray &&a1, const QBitArray &a2)
+ { return a1 |= a2; }
+ friend QBitArray operator|(const QBitArray &a1, QBitArray &&a2)
+ { return a2 |= a1; }
+ friend QBitArray operator|(QBitArray &&a1, QBitArray &&a2)
+ { return a1 |= a2; }
+
+ Q_CORE_EXPORT friend QBitArray operator^(const QBitArray &a1, const QBitArray &a2);
+ friend QBitArray operator^(QBitArray &&a1, const QBitArray &a2)
+ { return a1 ^= a2; }
+ friend QBitArray operator^(const QBitArray &a1, QBitArray &&a2)
+ { return a2 ^= a1; }
+ friend QBitArray operator^(QBitArray &&a1, QBitArray &&a2)
+ { return a1 ^= a2; }
+
#ifndef QT_NO_DATASTREAM
friend Q_CORE_EXPORT QDataStream &operator<<(QDataStream &, const QBitArray &);
friend Q_CORE_EXPORT QDataStream &operator>>(QDataStream &, QBitArray &);
#endif
friend Q_CORE_EXPORT size_t qHash(const QBitArray &key, size_t seed) noexcept;
+ friend QBitArray operator~(QBitArray a)
+ { return std::move(a).inverted_inplace(); }
QByteArray d;
+ QBitArray(QByteArrayData &&dd) : d(std::move(dd)) {}
+
+ template <typename BitArray> static auto bitLocation(BitArray &ba, qsizetype i)
+ {
+ Q_ASSERT(size_t(i) < size_t(ba.size()));
+ struct R {
+ decltype(ba.d[1]) byte;
+ uchar bitMask;
+ };
+ qsizetype byteIdx = i >> 3;
+ qsizetype bitIdx = i & 7;
+ return R{ ba.d[1 + byteIdx], uchar(1U << bitIdx) };
+ }
+
+ QBitArray inverted_inplace() &&;
+
public:
inline QBitArray() noexcept {}
explicit QBitArray(qsizetype size, bool val = false);
- QBitArray(const QBitArray &other) : d(other.d) {}
- inline QBitArray &operator=(const QBitArray &other) { d = other.d; return *this; }
+ // Rule Of Zero applies
+#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0)
+ QBitArray(const QBitArray &other) noexcept : d(other.d) {}
+ inline QBitArray &operator=(const QBitArray &other) noexcept { d = other.d; return *this; }
inline QBitArray(QBitArray &&other) noexcept : d(std::move(other.d)) {}
QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_PURE_SWAP(QBitArray)
+#endif // Qt 6
- inline void swap(QBitArray &other) noexcept { qSwap(d, other.d); }
+ void swap(QBitArray &other) noexcept { d.swap(other.d); }
- inline qsizetype size() const { return (d.size() << 3) - *d.constData(); }
- inline qsizetype count() const { return (d.size() << 3) - *d.constData(); }
+ qsizetype size() const { return qsizetype((size_t(d.size()) << 3) - *d.constData()); }
+ qsizetype count() const { return size(); }
qsizetype count(bool on) const;
inline bool isEmpty() const { return d.isEmpty(); }
@@ -77,25 +86,43 @@ public:
inline bool isDetached() const { return d.isDetached(); }
inline void clear() { d.clear(); }
- bool testBit(qsizetype i) const;
- void setBit(qsizetype i);
- void setBit(qsizetype i, bool val);
- void clearBit(qsizetype i);
- bool toggleBit(qsizetype i);
-
- bool at(qsizetype i) const;
- QBitRef operator[](qsizetype i);
- bool operator[](qsizetype i) const;
-
+ bool testBit(qsizetype i) const
+ { auto r = bitLocation(*this, i); return r.byte & r.bitMask; }
+ void setBit(qsizetype i)
+ { auto r = bitLocation(*this, i); r.byte |= r.bitMask; }
+ void setBit(qsizetype i, bool val)
+ { if (val) setBit(i); else clearBit(i); }
+ void clearBit(qsizetype i)
+ { auto r = bitLocation(*this, i); r.byte &= ~r.bitMask; }
+ bool toggleBit(qsizetype i)
+ {
+ auto r = bitLocation(*this, i);
+ bool cl = r.byte & r.bitMask;
+ r.byte ^= r.bitMask;
+ return cl;
+ }
+
+ bool at(qsizetype i) const { return testBit(i); }
+ inline QBitRef operator[](qsizetype i);
+ bool operator[](qsizetype i) const { return testBit(i); }
+
+ QBitArray &operator&=(QBitArray &&);
+ QBitArray &operator|=(QBitArray &&);
+ QBitArray &operator^=(QBitArray &&);
QBitArray &operator&=(const QBitArray &);
QBitArray &operator|=(const QBitArray &);
QBitArray &operator^=(const QBitArray &);
+#if QT_CORE_REMOVED_SINCE(6, 7)
QBitArray operator~() const;
+#endif
- inline bool operator==(const QBitArray &other) const { return d == other.d; }
- inline bool operator!=(const QBitArray &other) const { return d != other.d; }
+#if QT_CORE_REMOVED_SINCE(6, 8)
+ inline bool operator==(const QBitArray &other) const { return comparesEqual(d, other.d); }
+ inline bool operator!=(const QBitArray &other) const { return !operator==(other); }
+#endif
- inline bool fill(bool val, qsizetype size = -1);
+ bool fill(bool aval, qsizetype asize = -1)
+ { *this = QBitArray((asize < 0 ? this->size() : asize), aval); return true; }
void fill(bool val, qsizetype first, qsizetype last);
inline void truncate(qsizetype pos) { if (pos < size()) resize(pos); }
@@ -108,39 +135,17 @@ public:
public:
typedef QByteArray::DataPointer DataPtr;
inline DataPtr &data_ptr() { return d.data_ptr(); }
-};
+ inline const DataPtr &data_ptr() const { return d.data_ptr(); }
-inline bool QBitArray::fill(bool aval, qsizetype asize)
-{ *this = QBitArray((asize < 0 ? this->size() : asize), aval); return true; }
-
-Q_CORE_EXPORT QBitArray operator&(const QBitArray &, const QBitArray &);
-Q_CORE_EXPORT QBitArray operator|(const QBitArray &, const QBitArray &);
-Q_CORE_EXPORT QBitArray operator^(const QBitArray &, const QBitArray &);
-
-inline bool QBitArray::testBit(qsizetype i) const
-{ Q_ASSERT(size_t(i) < size_t(size()));
- return (*(reinterpret_cast<const uchar*>(d.constData())+1+(i>>3)) & (1 << (i & 7))) != 0; }
-
-inline void QBitArray::setBit(qsizetype i)
-{ Q_ASSERT(size_t(i) < size_t(size()));
- *(reinterpret_cast<uchar*>(d.data())+1+(i>>3)) |= uchar(1 << (i & 7)); }
-
-inline void QBitArray::clearBit(qsizetype i)
-{ Q_ASSERT(size_t(i) < size_t(size()));
- *(reinterpret_cast<uchar*>(d.data())+1+(i>>3)) &= ~uchar(1 << (i & 7)); }
-
-inline void QBitArray::setBit(qsizetype i, bool val)
-{ if (val) setBit(i); else clearBit(i); }
-
-inline bool QBitArray::toggleBit(qsizetype i)
-{ Q_ASSERT(size_t(i) < size_t(size()));
- uchar b = uchar(1<<(i&7)); uchar* p = reinterpret_cast<uchar*>(d.data())+1+(i>>3);
- uchar c = uchar(*p&b); *p^=b; return c!=0; }
-
-inline bool QBitArray::operator[](qsizetype i) const { return testBit(i); }
-inline bool QBitArray::at(qsizetype i) const { return testBit(i); }
+private:
+ friend bool comparesEqual(const QBitArray &lhs, const QBitArray &rhs) noexcept
+ {
+ return lhs.d == rhs.d;
+ }
+ Q_DECLARE_EQUALITY_COMPARABLE(QBitArray)
+};
-class Q_CORE_EXPORT QBitRef
+class QT6_ONLY(Q_CORE_EXPORT) QBitRef
{
private:
QBitArray &a;
@@ -155,7 +160,7 @@ public:
QBitRef &operator=(bool val) { a.setBit(i, val); return *this; }
};
-inline QBitRef QBitArray::operator[](qsizetype i)
+QBitRef QBitArray::operator[](qsizetype i)
{ Q_ASSERT(i >= 0); return QBitRef(*this, i); }
#ifndef QT_NO_DATASTREAM
diff --git a/src/corelib/tools/qcache.h b/src/corelib/tools/qcache.h
index 8a341c8555..952b88bafb 100644
--- a/src/corelib/tools/qcache.h
+++ b/src/corelib/tools/qcache.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QCACHE_H
#define QCACHE_H
@@ -64,8 +28,8 @@ class QCache
}
Value &operator=(Value &&other) noexcept
{
- qSwap(t, other.t);
- qSwap(cost, other.cost);
+ qt_ptr_swap(t, other.t);
+ std::swap(cost, other.cost);
return *this;
}
~Value() { delete t; }
@@ -109,23 +73,6 @@ class QCache
{
value = Value(o, cost);
}
- static Node create(const Key &k, Value &&t) noexcept(std::is_nothrow_move_assignable_v<Key> && std::is_nothrow_move_assignable_v<T>)
- {
- return Node(k, std::move(t));
- }
- void replace(const Value &t) noexcept(std::is_nothrow_assignable_v<T, T>)
- {
- value = t;
- }
- void replace(Value &&t) noexcept(std::is_nothrow_move_assignable_v<T>)
- {
- value = std::move(t);
- }
- Value takeValue() noexcept(std::is_nothrow_move_constructible_v<T>)
- {
- return std::move(value);
- }
- bool valuesEqual(const Node *other) const { return value == other->value; }
Node(Node &&other)
: Chain(other),
@@ -155,11 +102,13 @@ class QCache
n->prev->next = n->next;
n->next->prev = n->prev;
total -= n->value.cost;
- auto it = d.find(n->key);
+ auto it = d.findBucket(n->key);
d.erase(it);
}
T *relink(const Key &key) const noexcept
{
+ if (isEmpty())
+ return nullptr;
Node *n = d.findNode(key);
if (!n)
return nullptr;
@@ -179,11 +128,9 @@ class QCache
void trim(qsizetype m) noexcept(std::is_nothrow_destructible_v<Node>)
{
- Chain *n = chain.prev;
- while (n != &chain && total > m) {
- Node *u = static_cast<Node *>(n);
- n = n->prev;
- unlink(u);
+ while (chain.prev != &chain && total > m) {
+ Node *n = static_cast<Node *>(chain.prev);
+ unlink(n);
}
}
@@ -269,11 +216,13 @@ public:
}
inline bool contains(const Key &key) const noexcept
{
- return d.findNode(key) != nullptr;
+ return !isEmpty() && d.findNode(key) != nullptr;
}
bool remove(const Key &key) noexcept(std::is_nothrow_destructible_v<Node>)
{
+ if (isEmpty())
+ return false;
Node *n = d.findNode(key);
if (!n) {
return false;
@@ -285,6 +234,8 @@ public:
T *take(const Key &key) noexcept(std::is_nothrow_destructible_v<Key>)
{
+ if (isEmpty())
+ return nullptr;
Node *n = d.findNode(key);
if (!n)
return nullptr;
diff --git a/src/corelib/tools/qcache.qdoc b/src/corelib/tools/qcache.qdoc
index f9b1ffa8f4..9a4b86aa67 100644
--- a/src/corelib/tools/qcache.qdoc
+++ b/src/corelib/tools/qcache.qdoc
@@ -1,29 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
\class QCache
diff --git a/src/corelib/tools/qcommandlineoption.cpp b/src/corelib/tools/qcommandlineoption.cpp
index bfb6f68f08..6b990cecf1 100644
--- a/src/corelib/tools/qcommandlineoption.cpp
+++ b/src/corelib/tools/qcommandlineoption.cpp
@@ -1,43 +1,7 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Copyright (C) 2013 Laszlo Papp <lpapp@kde.org>
-** Copyright (C) 2013 David Faure <faure@kde.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// Copyright (C) 2013 Laszlo Papp <lpapp@kde.org>
+// Copyright (C) 2013 David Faure <faure@kde.org>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qcommandlineoption.h"
@@ -152,8 +116,7 @@ QCommandLineOption::QCommandLineOption(const QStringList &names)
The default value for the option is set to \a defaultValue.
In Qt versions before 5.4, this constructor was \c explicit. In Qt 5.4
- and later, it no longer is and can be used for C++11-style uniform
- initialization:
+ and later, it no longer is and can be used for uniform initialization:
\snippet code/src_corelib_tools_qcommandlineoption.cpp cxx11-init
@@ -188,8 +151,7 @@ QCommandLineOption::QCommandLineOption(const QString &name, const QString &descr
The default value for the option is set to \a defaultValue.
In Qt versions before 5.4, this constructor was \c explicit. In Qt 5.4
- and later, it no longer is and can be used for C++11-style uniform
- initialization:
+ and later, it no longer is and can be used for uniform initialization:
\snippet code/src_corelib_tools_qcommandlineoption.cpp cxx11-init-list
@@ -261,11 +223,11 @@ namespace {
return warn("be empty");
const QChar c = name.at(0);
- if (Q_UNLIKELY(c == QLatin1Char('-')))
+ if (Q_UNLIKELY(c == u'-'))
return warn("start with a '-'");
- if (Q_UNLIKELY(c == QLatin1Char('/')))
+ if (Q_UNLIKELY(c == u'/'))
return warn("start with a '/'");
- if (Q_UNLIKELY(name.contains(QLatin1Char('='))))
+ if (Q_UNLIKELY(name.contains(u'=')))
return warn("contain a '='");
return false;
diff --git a/src/corelib/tools/qcommandlineoption.h b/src/corelib/tools/qcommandlineoption.h
index 2e7d8fd9da..63c90a4005 100644
--- a/src/corelib/tools/qcommandlineoption.h
+++ b/src/corelib/tools/qcommandlineoption.h
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Copyright (C) 2013 Laszlo Papp <lpapp@kde.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// Copyright (C) 2013 Laszlo Papp <lpapp@kde.org>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QCOMMANDLINEOPTION_H
#define QCOMMANDLINEOPTION_H
@@ -75,7 +39,7 @@ public:
QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_PURE_SWAP(QCommandLineOption)
void swap(QCommandLineOption &other) noexcept
- { qSwap(d, other.d); }
+ { d.swap(other.d); }
QStringList names() const;
diff --git a/src/corelib/tools/qcommandlineparser.cpp b/src/corelib/tools/qcommandlineparser.cpp
index f294449b5f..2880eedf77 100644
--- a/src/corelib/tools/qcommandlineparser.cpp
+++ b/src/corelib/tools/qcommandlineparser.cpp
@@ -1,48 +1,13 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 Laszlo Papp <lpapp@kde.org>
-** Copyright (C) 2013 David Faure <faure@kde.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2013 Laszlo Papp <lpapp@kde.org>
+// Copyright (C) 2013 David Faure <faure@kde.org>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qcommandlineparser.h"
#include <qcoreapplication.h>
#include <private/qcoreapplication_p.h>
#include <qhash.h>
+#include <qvarlengtharray.h>
#include <qlist.h>
#include <qdebug.h>
#if defined(Q_OS_WIN) && !defined(QT_BOOTSTRAPPED)
@@ -53,9 +18,11 @@
QT_BEGIN_NAMESPACE
+using namespace Qt::StringLiterals;
+
extern void Q_CORE_EXPORT qt_call_post_routines();
-typedef QHash<QString, int> NameHash_t;
+typedef QHash<QString, qsizetype> NameHash_t;
class QCommandLineParserPrivate
{
@@ -88,7 +55,7 @@ public:
NameHash_t nameHash;
//! Option values found (only for options with a value)
- QHash<int, QStringList> optionValuesHash;
+ QHash<qsizetype, QStringList> optionValuesHash;
//! Names of options found on the command line.
QStringList optionNames;
@@ -158,24 +125,24 @@ QStringList QCommandLineParserPrivate::aliases(const QString &optionName) const
The parser handles short names, long names, more than one name for the same
option, and option values.
- Options on the command line are recognized as starting with a single or
- double \c{-} character(s).
+ Options on the command line are recognized as starting with one or two
+ \c{-} characters, followed by the option name.
The option \c{-} (single dash alone) is a special case, often meaning standard
- input, and not treated as an option. The parser will treat everything after the
+ input, and is not treated as an option. The parser will treat everything after the
option \c{--} (double dash) as positional arguments.
Short options are single letters. The option \c{v} would be specified by
passing \c{-v} on the command line. In the default parsing mode, short options
can be written in a compact form, for instance \c{-abc} is equivalent to \c{-a -b -c}.
- The parsing mode for can be set to ParseAsLongOptions, in which case \c{-abc}
+ The parsing mode can be changed to ParseAsLongOptions, in which case \c{-abc}
will be parsed as the long option \c{abc}.
Long options are more than one letter long and cannot be compacted together.
The long option \c{verbose} would be passed as \c{--verbose} or \c{-verbose}.
- Passing values to options can be done using the assignment operator: \c{-v=value}
- \c{--verbose=value}, or a space: \c{-v value} \c{--verbose value}, i.e. the next
- argument is used as value (even if it starts with a \c{-}).
+ Passing values to options can be done by using the assignment operator (\c{-v=value},
+ \c{--verbose=value}), or with a space (\c{-v value}, \c{--verbose value}). This
+ works even if the the value starts with a \c{-}.
The parser does not support optional values - if an option is set to
require a value, one must be present. If such an option is placed last
@@ -190,13 +157,13 @@ QStringList QCommandLineParserPrivate::aliases(const QString &optionName) const
Example:
\snippet code/src_corelib_tools_qcommandlineparser_main.cpp 0
- If your compiler supports the C++11 standard, the three addOption() calls in
- the above example can be simplified:
+ The three addOption() calls in the above example can be made more compact
+ by using addOptions():
\snippet code/src_corelib_tools_qcommandlineparser_main.cpp cxx11
Known limitation: the parsing of Qt options inside QCoreApplication and subclasses
happens before QCommandLineParser exists, so it can't take it into account. This
- means any option value that looks like a builtin Qt option, will be treated by
+ means any option value that looks like a builtin Qt option will be treated by
QCoreApplication as a builtin Qt option. Example: \c{--profile -reverse} will
lead to QGuiApplication seeing the -reverse option set, and removing it from
QCoreApplication::arguments() before QCommandLineParser defines the \c{profile}
@@ -209,7 +176,7 @@ QStringList QCommandLineParserPrivate::aliases(const QString &optionName) const
It is then advisable to introduce a function to do the command line parsing
which takes a struct or class receiving the option values returning an
- enumeration representing the result. The dnslookup example of the QtNetwork
+ object representing the result. The dnslookup example of the QtNetwork
module illustrates this:
\snippet dnslookup.h 0
@@ -237,20 +204,22 @@ QStringList QCommandLineParserPrivate::aliases(const QString &optionName) const
\code
- switch (parseCommandLine(parser, &query, &errorMessage)) {
- case CommandLineOk:
+ switch (parseResult.statusCode) {
+ case Status::Ok:
break;
- case CommandLineError:
+ case Status::Error: {
+ QString errorMessage = parseResult.errorString.value_or(u"Unknown error occurred"_qs);
QMessageBox::warning(0, QGuiApplication::applicationDisplayName(),
"<html><head/><body><h2>" + errorMessage + "</h2><pre>"
+ parser.helpText() + "</pre></body></html>");
return 1;
- case CommandLineVersionRequested:
+ }
+ case Status::VersionRequested:
QMessageBox::information(0, QGuiApplication::applicationDisplayName(),
QGuiApplication::applicationDisplayName() + ' '
+ QCoreApplication::applicationVersion());
return 0;
- case CommandLineHelpRequested:
+ case Status::HelpRequested:
QMessageBox::warning(0, QGuiApplication::applicationDisplayName(),
"<html><head/><body><pre>"
+ parser.helpText() + "</pre></body></html>");
@@ -284,7 +253,7 @@ QCommandLineParser::~QCommandLineParser()
\enum QCommandLineParser::SingleDashWordOptionMode
This enum describes the way the parser interprets command-line
- options that use a single dash followed by multiple letters, as as \c{-abc}.
+ options that use a single dash followed by multiple letters, as \c{-abc}.
\value ParseAsCompactedShortOptions \c{-abc} is interpreted as \c{-a -b -c},
i.e. as three short options that have been compacted on the command-line,
@@ -372,7 +341,7 @@ bool QCommandLineParser::addOption(const QCommandLineOption &option)
d->commandLineOptionList.append(option);
- const int offset = d->commandLineOptionList.size() - 1;
+ const qsizetype offset = d->commandLineOptionList.size() - 1;
for (const QString &name : optionNames)
d->nameHash.insert(name, offset);
@@ -420,13 +389,17 @@ QCommandLineOption QCommandLineParser::addVersionOption()
}
/*!
- Adds the help option (\c{-h}, \c{--help} and \c{-?} on Windows)
- as well as an option \c{--help-all} to include Qt-specific options in the output.
+ Adds help options to the command-line parser.
+
+ The options specified for this command-line are described by \c{-h} or
+ \c{--help}. On Windows, the alternative \c{-?} is also supported. The option
+ \c{--help-all} extends that to include generic Qt options, not defined by
+ this command, in the output.
These options are handled automatically by QCommandLineParser.
- Remember to use setApplicationDescription to set the application description,
- which will be displayed when this option is used.
+ Remember to use setApplicationDescription() to set the application
+ description, which will be displayed when this option is used.
Example:
\snippet code/src_corelib_tools_qcommandlineparser_main.cpp 0
@@ -442,7 +415,8 @@ QCommandLineOption QCommandLineParser::addHelpOption()
<< QStringLiteral("h")
<< QStringLiteral("help"), tr("Displays help on commandline options."));
addOption(opt);
- QCommandLineOption optHelpAll(QStringLiteral("help-all"), tr("Displays help including Qt specific options."));
+ QCommandLineOption optHelpAll(QStringLiteral("help-all"),
+ tr("Displays help, including generic Qt options."));
addOption(optHelpAll);
d->builtinHelpOption = true;
return opt;
@@ -533,9 +507,9 @@ QString QCommandLineParser::errorText() const
{
if (!d->errorText.isEmpty())
return d->errorText;
- if (d->unknownOptionNames.count() == 1)
- return tr("Unknown option '%1'.").arg(d->unknownOptionNames.first());
- if (d->unknownOptionNames.count() > 1)
+ if (d->unknownOptionNames.size() == 1)
+ return tr("Unknown option '%1'.").arg(d->unknownOptionNames.constFirst());
+ if (d->unknownOptionNames.size() > 1)
return tr("Unknown options: %1.").arg(d->unknownOptionNames.join(QStringLiteral(", ")));
return QString();
}
@@ -547,7 +521,8 @@ enum MessageType { UsageMessage, ErrorMessage };
// or we are run with redirected handles (for example, by QProcess).
static inline bool displayMessageBox()
{
- if (GetConsoleWindow())
+ if (GetConsoleWindow()
+ || qEnvironmentVariableIsSet("QT_COMMAND_LINE_PARSER_NO_GUI_MESSAGE_BOXES"))
return false;
STARTUPINFO startupInfo;
startupInfo.cb = sizeof(STARTUPINFO);
@@ -592,7 +567,7 @@ static void showParserMessage(const QString &message, MessageType type)
void QCommandLineParser::process(const QStringList &arguments)
{
if (!d->parse(arguments)) {
- showParserMessage(QCoreApplication::applicationName() + QLatin1String(": ") + errorText() + QLatin1Char('\n'), ErrorMessage);
+ showParserMessage(QCoreApplication::applicationName() + ": "_L1 + errorText() + u'\n', ErrorMessage);
qt_call_post_routines();
::exit(EXIT_FAILURE);
}
@@ -659,7 +634,7 @@ bool QCommandLineParserPrivate::parseOptionValue(const QString &optionName, cons
const QLatin1Char assignChar('=');
const NameHash_t::const_iterator nameHashIt = nameHash.constFind(optionName);
if (nameHashIt != nameHash.constEnd()) {
- const int assignPos = argument.indexOf(assignChar);
+ const qsizetype assignPos = argument.indexOf(assignChar);
const NameHash_t::mapped_type optionOffset = *nameHashIt;
const bool withValue = !commandLineOptionList.at(optionOffset).valueName().isEmpty();
if (withValue) {
@@ -699,7 +674,6 @@ bool QCommandLineParserPrivate::parse(const QStringList &args)
needsParsing = false;
bool error = false;
- const QString doubleDashString(QStringLiteral("--"));
const QLatin1Char dashChar('-');
const QLatin1Char assignChar('=');
@@ -723,8 +697,8 @@ bool QCommandLineParserPrivate::parse(const QStringList &args)
if (forcePositional) {
positionalArgumentList.append(argument);
- } else if (argument.startsWith(doubleDashString)) {
- if (argument.length() > 2) {
+ } else if (argument.startsWith("--"_L1)) {
+ if (argument.size() > 2) {
QString optionName = argument.mid(2).section(assignChar, 0, 0);
if (registerFoundOption(optionName)) {
if (!parseOptionValue(optionName, argument, &argumentIterator, args.end()))
@@ -812,7 +786,7 @@ bool QCommandLineParserPrivate::parse(const QStringList &args)
Returns \c true if the option \a name was set, false otherwise.
The name provided can be any long or short name of any option that was
- added with \c addOption(). All the options names are treated as being
+ added with addOption(). All the options names are treated as being
equivalent. If the name is not recognized or that option was not present,
false is returned.
@@ -826,7 +800,7 @@ bool QCommandLineParser::isSet(const QString &name) const
if (d->optionNames.contains(name))
return true;
const QStringList aliases = d->aliases(name);
- for (const QString &optionName : qAsConst(d->optionNames)) {
+ for (const QString &optionName : std::as_const(d->optionNames)) {
if (aliases.contains(optionName))
return true;
}
@@ -838,7 +812,7 @@ bool QCommandLineParser::isSet(const QString &name) const
an empty string if not found.
The name provided can be any long or short name of any option that was
- added with \c addOption(). All the option names are treated as being
+ added with addOption(). All the option names are treated as being
equivalent. If the name is not recognized or that option was not present, an
empty string is returned.
@@ -846,7 +820,7 @@ bool QCommandLineParser::isSet(const QString &name) const
that option is returned. If the option wasn't specified on the command line,
the default value is returned.
- An empty string is returned if the option does not take a value.
+ If the option does not take a value, a warning is printed, and an empty string is returned.
\sa values(), QCommandLineOption::setDefaultValue(), QCommandLineOption::setDefaultValues()
*/
@@ -867,7 +841,7 @@ QString QCommandLineParser::value(const QString &optionName) const
optionName, or an empty list if not found.
The name provided can be any long or short name of any option that was
- added with \c addOption(). All the options names are treated as being
+ added with addOption(). All the options names are treated as being
equivalent. If the name is not recognized or that option was not present, an
empty list is returned.
@@ -883,12 +857,18 @@ QString QCommandLineParser::value(const QString &optionName) const
QStringList QCommandLineParser::values(const QString &optionName) const
{
d->checkParsed("values");
- const NameHash_t::const_iterator it = d->nameHash.constFind(optionName);
+ auto it = d->nameHash.constFind(optionName);
if (it != d->nameHash.cend()) {
- const int optionOffset = *it;
+ const qsizetype optionOffset = *it;
QStringList values = d->optionValuesHash.value(optionOffset);
- if (values.isEmpty())
- values = d->commandLineOptionList.at(optionOffset).defaultValues();
+ if (values.isEmpty()) {
+ const auto &option = d->commandLineOptionList.at(optionOffset);
+ if (option.valueName().isEmpty()) {
+ qWarning("QCommandLineParser: option not expecting values: \"%ls\"",
+ qUtf16Printable(optionName));
+ }
+ values = option.defaultValues();
+ }
return values;
}
@@ -975,8 +955,8 @@ QStringList QCommandLineParser::positionalArguments() const
Names may appear more than once in this list if they were encountered
more than once by the parser.
- Any entry in the list can be used with \c value() or with
- \c values() to get any relevant option values.
+ Any entry in the list can be used with value() or with
+ values() to get any relevant option values.
*/
QStringList QCommandLineParser::optionNames() const
@@ -1017,8 +997,8 @@ QStringList QCommandLineParser::unknownOptionNames() const
*/
Q_NORETURN void QCommandLineParser::showVersion()
{
- showParserMessage(QCoreApplication::applicationName() + QLatin1Char(' ')
- + QCoreApplication::applicationVersion() + QLatin1Char('\n'),
+ showParserMessage(QCoreApplication::applicationName() + u' '
+ + QCoreApplication::applicationVersion() + u'\n',
UsageMessage);
qt_call_post_routines();
::exit(EXIT_SUCCESS);
@@ -1059,8 +1039,8 @@ QString QCommandLineParser::helpText() const
static QString wrapText(const QString &names, int optionNameMaxWidth, const QString &description)
{
- const QLatin1Char nl('\n');
- const QLatin1String indentation(" ");
+ const auto nl = u'\n';
+ const auto indentation = " "_L1;
// In case the list of option names is very long, wrap it as well
int nameIndex = 0;
@@ -1071,20 +1051,20 @@ static QString wrapText(const QString &names, int optionNameMaxWidth, const QStr
};
QString text;
- int lineStart = 0;
- int lastBreakable = -1;
+ qsizetype lineStart = 0;
+ qsizetype lastBreakable = -1;
const int max = 79 - (indentation.size() + optionNameMaxWidth + 1);
int x = 0;
- const int len = description.length();
+ const qsizetype len = description.size();
- for (int i = 0; i < len; ++i) {
+ for (qsizetype i = 0; i < len; ++i) {
++x;
const QChar c = description.at(i);
if (c.isSpace())
lastBreakable = i;
- int breakAt = -1;
- int nextLineStart = -1;
+ qsizetype breakAt = -1;
+ qsizetype nextLineStart = -1;
if (x > max && lastBreakable != -1) {
// time to break and we know where
breakAt = lastBreakable;
@@ -1100,9 +1080,9 @@ static QString wrapText(const QString &names, int optionNameMaxWidth, const QStr
}
if (breakAt != -1) {
- const int numChars = breakAt - lineStart;
+ const qsizetype numChars = breakAt - lineStart;
//qDebug() << "breakAt=" << description.at(breakAt) << "breakAtSpace=" << breakAtSpace << lineStart << "to" << breakAt << description.mid(lineStart, numChars);
- text += indentation + nextNameSection().leftJustified(optionNameMaxWidth) + QLatin1Char(' ');
+ text += indentation + nextNameSection().leftJustified(optionNameMaxWidth) + u' ';
text += QStringView{description}.mid(lineStart, numChars) + nl;
x = 0;
lastBreakable = -1;
@@ -1126,14 +1106,15 @@ QString QCommandLineParserPrivate::helpText(bool includeQtOptions) const
QString text;
QString usage;
// executable name
- usage += qApp ? QCoreApplication::arguments().constFirst() : QStringLiteral("<executable_name>");
+ usage += qApp ? QStringView(QCoreApplication::arguments().constFirst())
+ : QStringView(u"<executable_name>");
QList<QCommandLineOption> options = commandLineOptionList;
if (includeQtOptions && qApp)
qApp->d_func()->addQtOptions(&options);
if (!options.isEmpty())
- usage += QLatin1Char(' ') + QCommandLineParser::tr("[options]");
+ usage += u' ' + QCommandLineParser::tr("[options]");
for (const PositionalArgumentDefinition &arg : positionalArgumentDefinitions)
- usage += QLatin1Char(' ') + arg.syntax;
+ usage += u' ' + arg.syntax;
text += QCommandLineParser::tr("Usage: %1").arg(usage) + nl;
if (!description.isEmpty())
text += description + nl;
@@ -1142,28 +1123,28 @@ QString QCommandLineParserPrivate::helpText(bool includeQtOptions) const
text += QCommandLineParser::tr("Options:") + nl;
QStringList optionNameList;
optionNameList.reserve(options.size());
- int longestOptionNameString = 0;
- for (const QCommandLineOption &option : qAsConst(options)) {
+ qsizetype longestOptionNameString = 0;
+ for (const QCommandLineOption &option : std::as_const(options)) {
if (option.flags() & QCommandLineOption::HiddenFromHelp)
continue;
const QStringList optionNames = option.names();
QString optionNamesString;
for (const QString &optionName : optionNames) {
- const int numDashes = optionName.length() == 1 ? 1 : 2;
- optionNamesString += QLatin1String("--", numDashes) + optionName + QLatin1String(", ");
+ const int numDashes = optionName.size() == 1 ? 1 : 2;
+ optionNamesString += QLatin1StringView("--", numDashes) + optionName + ", "_L1;
}
if (!optionNames.isEmpty())
optionNamesString.chop(2); // remove trailing ", "
const auto valueName = option.valueName();
if (!valueName.isEmpty())
- optionNamesString += QLatin1String(" <") + valueName + QLatin1Char('>');
+ optionNamesString += " <"_L1 + valueName + u'>';
optionNameList.append(optionNamesString);
- longestOptionNameString = qMax(longestOptionNameString, optionNamesString.length());
+ longestOptionNameString = qMax(longestOptionNameString, optionNamesString.size());
}
++longestOptionNameString;
- const int optionNameMaxWidth = qMin(50, longestOptionNameString);
+ const int optionNameMaxWidth = qMin(50, int(longestOptionNameString));
auto optionNameIterator = optionNameList.cbegin();
- for (const QCommandLineOption &option : qAsConst(options)) {
+ for (const QCommandLineOption &option : std::as_const(options)) {
if (option.flags() & QCommandLineOption::HiddenFromHelp)
continue;
text += wrapText(*optionNameIterator, optionNameMaxWidth, option.description());
diff --git a/src/corelib/tools/qcommandlineparser.h b/src/corelib/tools/qcommandlineparser.h
index 4584c384cc..332a2f9568 100644
--- a/src/corelib/tools/qcommandlineparser.h
+++ b/src/corelib/tools/qcommandlineparser.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 Laszlo Papp <lpapp@kde.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2013 Laszlo Papp <lpapp@kde.org>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QCOMMANDLINEPARSER_H
#define QCOMMANDLINEPARSER_H
diff --git a/src/corelib/tools/qcontainerfwd.h b/src/corelib/tools/qcontainerfwd.h
index 673e3c3de2..d5590553fa 100644
--- a/src/corelib/tools/qcontainerfwd.h
+++ b/src/corelib/tools/qcontainerfwd.h
@@ -1,49 +1,20 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include <QtCore/qglobal.h>
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QCONTAINERFWD_H
#define QCONTAINERFWD_H
+#include <QtCore/qtconfigmacros.h>
+#include <QtCore/qtypes.h>
+
+#if 0
+#pragma qt_class(QtContainerFwd)
+#endif
+
// std headers can unfortunately not be forward declared
+#include <cstddef> // std::size_t
#include <utility>
+#include <limits>
QT_BEGIN_NAMESPACE
@@ -52,16 +23,22 @@ template <typename Key, typename T> class QHash;
template <typename Key, typename T> class QMap;
template <typename Key, typename T> class QMultiHash;
template <typename Key, typename T> class QMultiMap;
+#ifndef QT_NO_QPAIR
template <typename T1, typename T2>
using QPair = std::pair<T1, T2>;
+#endif
template <typename T> class QQueue;
template <typename T> class QSet;
+template <typename T, std::size_t E = std::size_t(-1) /* = std::dynamic_extent*/> class QSpan;
template <typename T> class QStack;
-template <typename T, qsizetype Prealloc = 256> class QVarLengthArray;
+constexpr qsizetype QVarLengthArrayDefaultPrealloc = 256;
+template <typename T, qsizetype Prealloc = QVarLengthArrayDefaultPrealloc> class QVarLengthArray;
template <typename T> class QList;
-#ifndef Q_CLANG_QDOC
+class QString;
+#ifndef Q_QDOC
template<typename T> using QVector = QList<T>;
using QStringList = QList<QString>;
+class QByteArray;
using QByteArrayList = QList<QByteArray>;
#else
template<typename T> class QVector;
@@ -74,7 +51,13 @@ class QVariant;
using QVariantList = QList<QVariant>;
using QVariantMap = QMap<QString, QVariant>;
using QVariantHash = QHash<QString, QVariant>;
-using QVariantPair = QPair<QVariant, QVariant>;
+using QVariantPair = std::pair<QVariant, QVariant>;
+
+namespace QtPrivate
+{
+[[maybe_unused]]
+constexpr qsizetype MaxAllocSize = (std::numeric_limits<qsizetype>::max)();
+}
QT_END_NAMESPACE
diff --git a/src/corelib/tools/qcontainertools_impl.h b/src/corelib/tools/qcontainertools_impl.h
index 2053de6408..998bc292d4 100644
--- a/src/corelib/tools/qcontainertools_impl.h
+++ b/src/corelib/tools/qcontainertools_impl.h
@@ -1,43 +1,7 @@
-/****************************************************************************
-**
-** Copyright (C) 2018 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>
-** Copyright (C) 2018 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2018 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>
+// Copyright (C) 2018 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#if 0
#pragma qt_sync_skip_header_check
@@ -50,6 +14,8 @@
#include <QtCore/qglobal.h>
#include <QtCore/qtypeinfo.h>
+#include <QtCore/qxptype_traits.h>
+
#include <cstring>
#include <iterator>
#include <memory>
@@ -73,22 +39,110 @@ static constexpr bool q_points_into_range(const T *p, const T *b, const T *e,
return !less(p, b) && less(p, e);
}
+/*!
+ \internal
+
+ Returns whether \a p is within container \a c. In its simplest form equivalent to:
+ c.data() <= p < c.data() + c.size()
+*/
+template <typename C, typename T>
+static constexpr bool q_points_into_range(const T &p, const C &c) noexcept
+{
+ static_assert(std::is_same_v<decltype(std::data(c)), T>);
+
+ // std::distance because QArrayDataPointer has a "qsizetype size"
+ // member but no size() function
+ return q_points_into_range(p, std::data(c),
+ std::data(c) + std::distance(std::begin(c), std::end(c)));
+}
+
+QT_WARNING_PUSH
+QT_WARNING_DISABLE_GCC("-Wmaybe-uninitialized")
+
+template <typename T, typename N>
+void q_uninitialized_move_if_noexcept_n(T* first, N n, T* out)
+{
+ if constexpr (std::is_nothrow_move_constructible_v<T> || !std::is_copy_constructible_v<T>)
+ std::uninitialized_move_n(first, n, out);
+ else
+ std::uninitialized_copy_n(first, n, out);
+}
+
template <typename T, typename N>
void q_uninitialized_relocate_n(T* first, N n, T* out)
{
if constexpr (QTypeInfo<T>::isRelocatable) {
- if (n != N(0)) { // even if N == 0, out == nullptr or first == nullptr are UB for memmove()
- std::memmove(static_cast<void*>(out),
- static_cast<const void*>(first),
- n * sizeof(T));
+ static_assert(std::is_copy_constructible_v<T> || std::is_move_constructible_v<T>,
+ "Refusing to relocate this non-copy/non-move-constructible type.");
+ if (n != N(0)) { // even if N == 0, out == nullptr or first == nullptr are UB for memcpy()
+ std::memcpy(static_cast<void *>(out),
+ static_cast<const void *>(first),
+ n * sizeof(T));
}
} else {
- std::uninitialized_move_n(first, n, out);
+ q_uninitialized_move_if_noexcept_n(first, n, out);
if constexpr (QTypeInfo<T>::isComplex)
std::destroy_n(first, n);
}
}
+QT_WARNING_POP
+
+/*!
+ \internal
+
+ A wrapper around std::rotate(), with an optimization for
+ Q_RELOCATABLE_TYPEs. We omit the return value, as it would be more work to
+ compute in the Q_RELOCATABLE_TYPE case and, unlike std::rotate on
+ ForwardIterators, callers can compute the result in constant time
+ themselves.
+*/
+template <typename T>
+void q_rotate(T *first, T *mid, T *last)
+{
+ if constexpr (QTypeInfo<T>::isRelocatable) {
+ const auto cast = [](T *p) { return reinterpret_cast<uchar*>(p); };
+ std::rotate(cast(first), cast(mid), cast(last));
+ } else {
+ std::rotate(first, mid, last);
+ }
+}
+
+/*!
+ \internal
+ Copies all elements, except the ones for which \a pred returns \c true, from
+ range [first, last), to the uninitialized memory buffer starting at \a out.
+
+ It's undefined behavior if \a out points into [first, last).
+
+ Returns a pointer one past the last copied element.
+
+ If an exception is thrown, all the already copied elements in the destination
+ buffer are destroyed.
+*/
+template <typename T, typename Predicate>
+T *q_uninitialized_remove_copy_if(T *first, T *last, T *out, Predicate &pred)
+{
+ static_assert(std::is_nothrow_destructible_v<T>,
+ "This algorithm requires that T has a non-throwing destructor");
+ Q_ASSERT(!q_points_into_range(out, first, last));
+
+ T *dest_begin = out;
+ QT_TRY {
+ while (first != last) {
+ if (!pred(*first)) {
+ new (std::addressof(*out)) T(*first);
+ ++out;
+ }
+ ++first;
+ }
+ } QT_CATCH (...) {
+ std::destroy(std::reverse_iterator(out), std::reverse_iterator(dest_begin));
+ QT_RETHROW;
+ }
+ return out;
+}
+
template<typename iterator, typename N>
void q_relocate_overlap_n_left_move(iterator first, N n, iterator d_first)
{
@@ -200,6 +254,13 @@ void q_relocate_overlap_n(T *first, N n, T *d_first)
}
}
+template <typename T>
+struct ArrowProxy
+{
+ T t;
+ T *operator->() noexcept { return &t; }
+};
+
template <typename Iterator>
using IfIsInputIterator = typename std::enable_if<
std::is_convertible<typename std::iterator_traits<Iterator>::iterator_category, std::input_iterator_tag>::value,
@@ -230,43 +291,38 @@ void reserveIfForwardIterator(Container *c, ForwardIterator f, ForwardIterator l
c->reserve(static_cast<typename Container::size_type>(std::distance(f, l)));
}
-template <typename Iterator, typename = std::void_t<>>
-struct AssociativeIteratorHasKeyAndValue : std::false_type
-{
-};
-
template <typename Iterator>
-struct AssociativeIteratorHasKeyAndValue<
- Iterator,
- std::void_t<decltype(std::declval<Iterator &>().key()),
- decltype(std::declval<Iterator &>().value())>
- >
- : std::true_type
-{
-};
-
-template <typename Iterator, typename = std::void_t<>, typename = std::void_t<>>
-struct AssociativeIteratorHasFirstAndSecond : std::false_type
-{
-};
+using KeyAndValueTest = decltype(
+ std::declval<Iterator &>().key(),
+ std::declval<Iterator &>().value()
+);
template <typename Iterator>
-struct AssociativeIteratorHasFirstAndSecond<
- Iterator,
- std::void_t<decltype(std::declval<Iterator &>()->first),
- decltype(std::declval<Iterator &>()->second)>
- >
- : std::true_type
-{
-};
+using FirstAndSecondTest = decltype(
+ std::declval<Iterator &>()->first,
+ std::declval<Iterator &>()->second
+);
template <typename Iterator>
using IfAssociativeIteratorHasKeyAndValue =
- typename std::enable_if<AssociativeIteratorHasKeyAndValue<Iterator>::value, bool>::type;
+ std::enable_if_t<qxp::is_detected_v<KeyAndValueTest, Iterator>, bool>;
template <typename Iterator>
using IfAssociativeIteratorHasFirstAndSecond =
- typename std::enable_if<AssociativeIteratorHasFirstAndSecond<Iterator>::value, bool>::type;
+ std::enable_if_t<
+ std::conjunction_v<
+ std::negation<qxp::is_detected<KeyAndValueTest, Iterator>>,
+ qxp::is_detected<FirstAndSecondTest, Iterator>
+ >, bool>;
+
+template <typename Iterator>
+using MoveBackwardsTest = decltype(
+ std::declval<Iterator &>().operator--()
+);
+
+template <typename Iterator>
+using IfIteratorCanMoveBackwards =
+ std::enable_if_t<qxp::is_detected_v<MoveBackwardsTest, Iterator>, bool>;
template <typename T, typename U>
using IfIsNotSame =
@@ -275,30 +331,56 @@ using IfIsNotSame =
template<typename T, typename U>
using IfIsNotConvertible = typename std::enable_if<!std::is_convertible<T, U>::value, bool>::type;
-template <typename Container, typename T>
-auto sequential_erase(Container &c, const T &t)
+template <typename Container, typename Predicate>
+auto sequential_erase_if(Container &c, Predicate &pred)
{
- // avoid a detach in case there is nothing to remove
+ // This is remove_if() modified to perform the find_if step on
+ // const_iterators to avoid shared container detaches if nothing needs to
+ // be removed. We cannot run remove_if after find_if: doing so would apply
+ // the predicate to the first matching element twice!
+
const auto cbegin = c.cbegin();
const auto cend = c.cend();
- const auto t_it = std::find(cbegin, cend, t);
+ const auto t_it = std::find_if(cbegin, cend, pred);
auto result = std::distance(cbegin, t_it);
if (result == c.size())
return result - result; // `0` of the right type
+ // now detach:
const auto e = c.end();
- const auto it = std::remove(std::next(c.begin(), result), e, t);
- result = std::distance(it, e);
- c.erase(it, e);
+
+ auto it = std::next(c.begin(), result);
+ auto dest = it;
+
+ // Loop Invariants:
+ // - it != e
+ // - [next(it), e[ still to be checked
+ // - [c.begin(), dest[ are result
+ while (++it != e) {
+ if (!pred(*it)) {
+ *dest = std::move(*it);
+ ++dest;
+ }
+ }
+
+ result = std::distance(dest, e);
+ c.erase(dest, e);
return result;
}
template <typename Container, typename T>
+auto sequential_erase(Container &c, const T &t)
+{
+ // use the equivalence relation from http://eel.is/c++draft/list.erasure#1
+ auto cmp = [&](auto &e) { return e == t; };
+ return sequential_erase_if(c, cmp); // can't pass rvalues!
+}
+
+template <typename Container, typename T>
auto sequential_erase_with_copy(Container &c, const T &t)
{
using CopyProxy = std::conditional_t<std::is_copy_constructible_v<T>, T, const T &>;
- const T &tCopy = CopyProxy(t);
- return sequential_erase(c, tCopy);
+ return sequential_erase(c, CopyProxy(t));
}
template <typename Container, typename T>
@@ -312,24 +394,6 @@ auto sequential_erase_one(Container &c, const T &t)
return true;
}
-template <typename Container, typename Predicate>
-auto sequential_erase_if(Container &c, Predicate &pred)
-{
- // avoid a detach in case there is nothing to remove
- const auto cbegin = c.cbegin();
- const auto cend = c.cend();
- const auto t_it = std::find_if(cbegin, cend, pred);
- auto result = std::distance(cbegin, t_it);
- if (result == c.size())
- return result - result; // `0` of the right type
-
- const auto e = c.end();
- const auto it = std::remove_if(std::next(c.begin(), result), e, pred);
- result = std::distance(it, e);
- c.erase(it, e);
- return result;
-}
-
template <typename T, typename Predicate>
qsizetype qset_erase_if(QSet<T> &set, Predicate &pred)
{
diff --git a/src/corelib/tools/qcontiguouscache.cpp b/src/corelib/tools/qcontiguouscache.cpp
index 95537961f9..d28d1e7153 100644
--- a/src/corelib/tools/qcontiguouscache.cpp
+++ b/src/corelib/tools/qcontiguouscache.cpp
@@ -1,47 +1,13 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qcontiguouscache.h"
#ifdef QT_QCONTIGUOUSCACHE_DEBUG
#include <QDebug>
#endif
+#include <QtCore/qmalloc.h>
+
QT_BEGIN_NAMESPACE
#ifdef QT_QCONTIGUOUSCACHE_DEBUG
diff --git a/src/corelib/tools/qcontiguouscache.h b/src/corelib/tools/qcontiguouscache.h
index 62ebfa0658..c01dbb9390 100644
--- a/src/corelib/tools/qcontiguouscache.h
+++ b/src/corelib/tools/qcontiguouscache.h
@@ -1,47 +1,17 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QCONTIGUOUSCACHE_H
#define QCONTIGUOUSCACHE_H
#include <QtCore/qatomic.h>
-#include <limits.h>
+#include <QtCore/qassert.h>
+#include <QtCore/qtclasshelpermacros.h>
+#include <QtCore/qtcoreexports.h>
+#include <QtCore/qtypeinfo.h>
+
+#include <climits>
+#include <limits>
#include <new>
QT_BEGIN_NAMESPACE
@@ -97,9 +67,9 @@ public:
QContiguousCache<T> &operator=(const QContiguousCache<T> &other);
QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_PURE_SWAP(QContiguousCache)
- inline void swap(QContiguousCache<T> &other) noexcept { qSwap(d, other.d); }
+ void swap(QContiguousCache &other) noexcept { qt_ptr_swap(d, other.d); }
-#ifndef Q_CLANG_QDOC
+#ifndef Q_QDOC
template <typename U = T>
QTypeTraits::compare_eq_result<U> operator==(const QContiguousCache<T> &other) const
{
@@ -121,7 +91,7 @@ public:
#else
bool operator==(const QContiguousCache &other) const;
bool operator!=(const QContiguousCache &other) const;
-#endif // Q_CLANG_QDOC
+#endif // Q_QDOC
inline qsizetype capacity() const {return d->alloc; }
inline qsizetype count() const { return d->count; }
diff --git a/src/corelib/tools/qcryptographichash.cpp b/src/corelib/tools/qcryptographichash.cpp
index e1f15d2b93..2e82a394ee 100644
--- a/src/corelib/tools/qcryptographichash.cpp
+++ b/src/corelib/tools/qcryptographichash.cpp
@@ -1,45 +1,19 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2013 Richard J. Moore <rich@kde.org>.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2023 The Qt Company Ltd.
+// Copyright (C) 2013 Ruslan Nigmatullin <euroelessar@yandex.ru>
+// Copyright (C) 2013 Richard J. Moore <rich@kde.org>.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include <qcryptographichash.h>
+#include <qmessageauthenticationcode.h>
+
#include <qiodevice.h>
+#include <qmutex.h>
+#include <qvarlengtharray.h>
+#include <private/qlocking_p.h>
+
+#include <array>
+#include <climits>
+#include <numeric>
#include "../../3rdparty/sha1/sha1.cpp"
@@ -47,12 +21,17 @@
# error "Are you sure you need the other hashing algorithms besides SHA-1?"
#endif
+// Header from rfc6234
+#include "../../3rdparty/rfc6234/sha.h"
+
#ifndef QT_CRYPTOGRAPHICHASH_ONLY_SHA1
+#if !QT_CONFIG(openssl_hash)
// qdoc and qmake only need SHA-1
#include "../../3rdparty/md5/md5.h"
#include "../../3rdparty/md5/md5.cpp"
#include "../../3rdparty/md4/md4.h"
#include "../../3rdparty/md4/md4.cpp"
+#endif // !QT_CONFIG(openssl_hash)
typedef unsigned char BitSequence;
typedef unsigned long long DataLength;
@@ -79,23 +58,21 @@ typedef HashReturn (SHA3Final)(hashState *state, BitSequence *hashval);
#include "../../3rdparty/sha3/KeccakF-1600-opt64.c"
-static SHA3Init * const sha3Init = Init;
-static SHA3Update * const sha3Update = Update;
-static SHA3Final * const sha3Final = Final;
+Q_CONSTINIT static SHA3Init * const sha3Init = Init;
+Q_CONSTINIT static SHA3Update * const sha3Update = Update;
+Q_CONSTINIT static SHA3Final * const sha3Final = Final;
#else // 32 bit optimised fallback
#include "../../3rdparty/sha3/KeccakF-1600-opt32.c"
-static SHA3Init * const sha3Init = Init;
-static SHA3Update * const sha3Update = Update;
-static SHA3Final * const sha3Final = Final;
+Q_CONSTINIT static SHA3Init * const sha3Init = Init;
+Q_CONSTINIT static SHA3Update * const sha3Update = Update;
+Q_CONSTINIT static SHA3Final * const sha3Final = Final;
#endif
-// Header from rfc6234
-#include "../../3rdparty/rfc6234/sha.h"
-
+#if !QT_CONFIG(openssl_hash)
/*
These 2 functions replace macros of the same name in sha224-256.c and
sha384-512.c. Originally, these macros relied on a global static 'addTemp'
@@ -127,6 +104,9 @@ static inline int SHA384_512AddLength(SHA512Context *context, unsigned int lengt
uint64_t addTemp;
return SHA384_512AddLengthM(context, length);
}
+#endif // !QT_CONFIG(opensslv30)
+
+#include "qtcore-config_p.h"
#if QT_CONFIG(system_libb2)
#include <blake2.h>
@@ -136,17 +116,88 @@ static inline int SHA384_512AddLength(SHA512Context *context, unsigned int lengt
#endif
#endif // QT_CRYPTOGRAPHICHASH_ONLY_SHA1
+#if !defined(QT_BOOTSTRAPPED) && QT_CONFIG(openssl_hash)
+#define USING_OPENSSL30
+#include <openssl/evp.h>
+#include <openssl/provider.h>
+#endif
+
QT_BEGIN_NAMESPACE
-static constexpr qsizetype MaxHashLength = 64;
+template <size_t N>
+class QSmallByteArray
+{
+ std::array<quint8, N> m_data;
+ static_assert(N <= std::numeric_limits<std::uint8_t>::max());
+ quint8 m_size = 0;
+public:
+ QSmallByteArray() = default;
+ // all compiler-generated SMFs are ok!
+ template <std::size_t M, std::enable_if_t<M < N, bool> = true> // M == N is for copy ctor!
+ constexpr QSmallByteArray(const QSmallByteArray<M> &other) noexcept
+ {
+ assign(other);
+ }
+ template <std::size_t M, std::enable_if_t<M < N, bool> = true> // M == N is for copy-assignment op!
+ constexpr QSmallByteArray &operator=(const QSmallByteArray<M> &other) noexcept
+ {
+ assign(other);
+ return *this;
+ }
+
+ template <typename Container> // ### underconstrained
+ constexpr void assign(const Container &c)
+ {
+ const size_t otherSize = size_t(std::size(c));
+ Q_ASSERT(otherSize < N);
+ memcpy(data(), std::data(c), otherSize);
+ m_size = quint8(otherSize);
+ }
+
+ constexpr quint8 *data() noexcept { return m_data.data(); }
+ constexpr const quint8 *data() const noexcept { return m_data.data(); }
+ constexpr qsizetype size() const noexcept { return qsizetype{m_size}; }
+ constexpr quint8 &operator[](qsizetype n)
+ {
+ Q_ASSERT(n < size());
+ return data()[n];
+ }
+ constexpr const quint8 &operator[](qsizetype n) const
+ {
+ Q_ASSERT(n < size());
+ return data()[n];
+ }
+ constexpr bool isEmpty() const noexcept { return size() == 0; }
+ constexpr void clear() noexcept { m_size = 0; }
+ constexpr void resizeForOverwrite(qsizetype s)
+ {
+ Q_ASSERT(s >= 0);
+ Q_ASSERT(size_t(s) <= N);
+ m_size = std::uint8_t(s);
+ }
+ constexpr void resize(qsizetype s, quint8 v)
+ {
+ const auto oldSize = size();
+ resizeForOverwrite(s);
+ if (s > oldSize)
+ memset(data() + oldSize, v, size() - oldSize);
+ }
+ constexpr QByteArrayView toByteArrayView() const noexcept
+ { return *this; }
+
+ constexpr auto begin() noexcept { return data(); }
+ constexpr auto begin() const noexcept { return data(); }
+ constexpr auto cbegin() const noexcept { return begin(); }
+ constexpr auto end() noexcept { return data() + size(); }
+ constexpr auto end() const noexcept { return data() + size(); }
+ constexpr auto cend() const noexcept { return end(); }
+};
static constexpr int hashLengthInternal(QCryptographicHash::Algorithm method) noexcept
{
switch (method) {
#define CASE(Enum, Size) \
case QCryptographicHash:: Enum : \
- /* if this triggers, then increase MaxHashLength accordingly */ \
- static_assert(MaxHashLength >= qsizetype(Size) ); \
return Size \
/*end*/
CASE(Sha1, 20);
@@ -160,95 +211,184 @@ static constexpr int hashLengthInternal(QCryptographicHash::Algorithm method) no
CASE(Blake2s_128, 128 / 8);
case QCryptographicHash::Blake2b_160:
case QCryptographicHash::Blake2s_160:
- static_assert(160 / 8 <= MaxHashLength);
return 160 / 8;
case QCryptographicHash::RealSha3_224:
case QCryptographicHash::Keccak_224:
case QCryptographicHash::Blake2s_224:
- static_assert(224 / 8 <= MaxHashLength);
return 224 / 8;
case QCryptographicHash::RealSha3_256:
case QCryptographicHash::Keccak_256:
case QCryptographicHash::Blake2b_256:
case QCryptographicHash::Blake2s_256:
- static_assert(256 / 8 <= MaxHashLength);
return 256 / 8;
case QCryptographicHash::RealSha3_384:
case QCryptographicHash::Keccak_384:
case QCryptographicHash::Blake2b_384:
- static_assert(384 / 8 <= MaxHashLength);
return 384 / 8;
case QCryptographicHash::RealSha3_512:
case QCryptographicHash::Keccak_512:
case QCryptographicHash::Blake2b_512:
- static_assert(512 / 8 <= MaxHashLength);
return 512 / 8;
#endif
#undef CASE
+ case QCryptographicHash::NumAlgorithms: ;
+ // fall through
+ // Q_UNREACHABLE() would be BiC here, as hashLength(~~invalid~~) worked in 6.4
}
return 0;
}
+static constexpr int maxHashLength()
+{
+ int result = 0;
+ using A = QCryptographicHash::Algorithm;
+ for (int i = 0; i < A::NumAlgorithms; ++i)
+ result = std::max(result, hashLengthInternal(A(i)));
+ return result;
+}
+
+using HashResult = QSmallByteArray<maxHashLength()>;
+
+#ifdef USING_OPENSSL30
+static constexpr const char * methodToName(QCryptographicHash::Algorithm method) noexcept
+{
+ switch (method) {
+#define CASE(Enum, Name) \
+ case QCryptographicHash:: Enum : \
+ return Name \
+ /*end*/
+ CASE(Sha1, "SHA1");
+ CASE(Md4, "MD4");
+ CASE(Md5, "MD5");
+ CASE(Sha224, "SHA224");
+ CASE(Sha256, "SHA256");
+ CASE(Sha384, "SHA384");
+ CASE(Sha512, "SHA512");
+ CASE(RealSha3_224, "SHA3-224");
+ CASE(RealSha3_256, "SHA3-256");
+ CASE(RealSha3_384, "SHA3-384");
+ CASE(RealSha3_512, "SHA3-512");
+ CASE(Blake2b_512, "BLAKE2B512");
+ CASE(Blake2s_256, "BLAKE2S256");
+#undef CASE
+ default: return nullptr;
+ }
+}
+
+/*
+ Checks whether given method is not provided by OpenSSL and whether we will
+ have a fallback to non-OpenSSL implementation.
+*/
+static constexpr bool useNonOpenSSLFallback(QCryptographicHash::Algorithm method) noexcept
+{
+ if (method == QCryptographicHash::Keccak_224 || method == QCryptographicHash::Keccak_256 ||
+ method == QCryptographicHash::Keccak_384 || method == QCryptographicHash::Keccak_512 ||
+ method == QCryptographicHash::Blake2b_160 || method == QCryptographicHash::Blake2b_256 ||
+ method == QCryptographicHash::Blake2b_384 || method == QCryptographicHash::Blake2s_128 ||
+ method == QCryptographicHash::Blake2s_160 || method == QCryptographicHash::Blake2s_224)
+ return true;
+
+ return false;
+}
+#endif // USING_OPENSSL30
+
class QCryptographicHashPrivate
{
public:
explicit QCryptographicHashPrivate(QCryptographicHash::Algorithm method) noexcept
- : method(method)
+ : state(method), method(method)
+ {
+ }
+ ~QCryptographicHashPrivate()
{
- reset();
+ state.destroy(method);
}
void reset() noexcept;
void addData(QByteArrayView bytes) noexcept;
+ bool addData(QIODevice *dev);
void finalize() noexcept;
+ // when not called from the static hash() function, this function needs to be
+ // called with finalizeMutex held (finalize() will do that):
+ void finalizeUnchecked() noexcept;
+ // END functions that need to be called with finalizeMutex held
QByteArrayView resultView() const noexcept { return result.toByteArrayView(); }
+ static bool supportsAlgorithm(QCryptographicHash::Algorithm method);
+
+#ifdef USING_OPENSSL30
+ struct EVP_MD_CTX_deleter {
+ void operator()(EVP_MD_CTX *ctx) const noexcept {
+ EVP_MD_CTX_free(ctx);
+ }
+ };
+ struct EVP_MD_deleter {
+ void operator()(EVP_MD *md) const noexcept {
+ EVP_MD_free(md);
+ }
+ };
+ struct OSSL_PROVIDER_deleter {
+ void operator()(OSSL_PROVIDER *provider) const noexcept {
+ OSSL_PROVIDER_unload(provider);
+ }
+ };
+
+ using EVP_MD_CTX_ptr = std::unique_ptr<EVP_MD_CTX, EVP_MD_CTX_deleter>;
+ using EVP_MD_ptr = std::unique_ptr<EVP_MD, EVP_MD_deleter>;
+ using OSSL_PROVIDER_ptr = std::unique_ptr<OSSL_PROVIDER, OSSL_PROVIDER_deleter>;
+ struct EVP {
+ EVP_MD_ptr algorithm;
+ EVP_MD_CTX_ptr context;
+ OSSL_PROVIDER_ptr defaultProvider;
+ OSSL_PROVIDER_ptr legacyProvider;
+ bool initializationFailed;
+
+ explicit EVP(QCryptographicHash::Algorithm method);
+ void reset() noexcept;
+ void finalizeUnchecked(HashResult &result) noexcept;
+ };
+#endif
+
+ union State {
+ explicit State(QCryptographicHash::Algorithm method);
+ void destroy(QCryptographicHash::Algorithm method);
+#ifdef USING_OPENSSL30
+ ~State() {}
+#endif
+
+ void reset(QCryptographicHash::Algorithm method) noexcept;
+ void addData(QCryptographicHash::Algorithm method, QByteArrayView data) noexcept;
+ void finalizeUnchecked(QCryptographicHash::Algorithm method, HashResult &result) noexcept;
- const QCryptographicHash::Algorithm method;
- union {
Sha1State sha1Context;
#ifndef QT_CRYPTOGRAPHICHASH_ONLY_SHA1
+#ifdef USING_OPENSSL30
+ EVP evp;
+#else
MD5Context md5Context;
md4_context md4Context;
SHA224Context sha224Context;
SHA256Context sha256Context;
SHA384Context sha384Context;
SHA512Context sha512Context;
+#endif
SHA3Context sha3Context;
+
+ enum class Sha3Variant { Sha3, Keccak };
+ void sha3Finish(HashResult &result, int bitCount, Sha3Variant sha3Variant);
blake2b_state blake2bContext;
blake2s_state blake2sContext;
#endif
- };
-#ifndef QT_CRYPTOGRAPHICHASH_ONLY_SHA1
- enum class Sha3Variant
- {
- Sha3,
- Keccak
- };
- void sha3Finish(int bitCount, Sha3Variant sha3Variant);
-#endif
- class SmallByteArray {
- std::array<char, MaxHashLength> m_data;
- static_assert(MaxHashLength <= std::numeric_limits<std::uint8_t>::max());
- std::uint8_t m_size;
- public:
- char *data() noexcept { return m_data.data(); }
- const char *data() const noexcept { return m_data.data(); }
- qsizetype size() const noexcept { return qsizetype{m_size}; }
- bool isEmpty() const noexcept { return size() == 0; }
- void clear() noexcept { m_size = 0; }
- void resize(qsizetype s) {
- Q_ASSERT(s >= 0);
- Q_ASSERT(s <= MaxHashLength);
- m_size = std::uint8_t(s);
- }
- QByteArrayView toByteArrayView() const noexcept
- { return QByteArrayView{data(), size()}; }
- };
- SmallByteArray result;
+ } state;
+ // protects result in finalize()
+ QBasicMutex finalizeMutex;
+ HashResult result;
+
+ const QCryptographicHash::Algorithm method;
};
#ifndef QT_CRYPTOGRAPHICHASH_ONLY_SHA1
-void QCryptographicHashPrivate::sha3Finish(int bitCount, Sha3Variant sha3Variant)
+void QCryptographicHashPrivate::State::sha3Finish(HashResult &result, int bitCount,
+ Sha3Variant sha3Variant)
{
/*
FIPS 202 §6.1 defines SHA-3 in terms of calculating the Keccak function
@@ -272,7 +412,7 @@ void QCryptographicHashPrivate::sha3Finish(int bitCount, Sha3Variant sha3Variant
*/
static const unsigned char sha3FinalSuffix = 0x80;
- result.resize(bitCount / 8);
+ result.resizeForOverwrite(bitCount / 8);
SHA3Context copy = sha3Context;
@@ -284,7 +424,7 @@ void QCryptographicHashPrivate::sha3Finish(int bitCount, Sha3Variant sha3Variant
break;
}
- sha3Final(&copy, reinterpret_cast<BitSequence *>(result.data()));
+ sha3Final(&copy, result.data());
}
#endif
@@ -341,6 +481,7 @@ void QCryptographicHashPrivate::sha3Finish(int bitCount, Sha3Variant sha3Variant
\omitvalue RealSha3_256
\omitvalue RealSha3_384
\omitvalue RealSha3_512
+ \omitvalue NumAlgorithms
*/
/*!
@@ -352,6 +493,18 @@ QCryptographicHash::QCryptographicHash(Algorithm method)
}
/*!
+ \fn QCryptographicHash::QCryptographicHash(QCryptographicHash &&other)
+
+ Move-constructs a new QCryptographicHash from \a other.
+
+ \note The moved-from object \a other is placed in a
+ partially-formed state, in which the only valid operations are
+ destruction and assignment of a new value.
+
+ \since 6.5
+*/
+
+/*!
Destroys the object.
*/
QCryptographicHash::~QCryptographicHash()
@@ -360,6 +513,27 @@ QCryptographicHash::~QCryptographicHash()
}
/*!
+ \fn QCryptographicHash &QCryptographicHash::operator=(QCryptographicHash &&other)
+
+ Move-assigns \a other to this QCryptographicHash instance.
+
+ \note The moved-from object \a other is placed in a
+ partially-formed state, in which the only valid operations are
+ destruction and assignment of a new value.
+
+ \since 6.5
+*/
+
+/*!
+ \fn void QCryptographicHash::swap(QCryptographicHash &other)
+
+ Swaps cryptographic hash \a other with this cryptographic hash. This
+ operation is very fast and never fails.
+
+ \since 6.5
+*/
+
+/*!
Resets the object.
*/
void QCryptographicHash::reset() noexcept
@@ -367,12 +541,101 @@ void QCryptographicHash::reset() noexcept
d->reset();
}
-void QCryptographicHashPrivate::reset() noexcept
+/*!
+ Returns the algorithm used to generate the cryptographic hash.
+
+ \since 6.5
+*/
+QCryptographicHash::Algorithm QCryptographicHash::algorithm() const noexcept
+{
+ return d->method;
+}
+
+#ifdef USING_OPENSSL30
+
+QCryptographicHashPrivate::State::State(QCryptographicHash::Algorithm method)
+{
+ if (method == QCryptographicHash::Keccak_224 ||
+ method == QCryptographicHash::Keccak_256 ||
+ method == QCryptographicHash::Keccak_384 ||
+ method == QCryptographicHash::Keccak_512) {
+ new (&sha3Context) SHA3Context;
+ reset(method);
+ } else if (method == QCryptographicHash::Blake2b_160 ||
+ method == QCryptographicHash::Blake2b_256 ||
+ method == QCryptographicHash::Blake2b_384) {
+ new (&blake2bContext) blake2b_state;
+ reset(method);
+ } else if (method == QCryptographicHash::Blake2s_128 ||
+ method == QCryptographicHash::Blake2s_160 ||
+ method == QCryptographicHash::Blake2s_224) {
+ new (&blake2sContext) blake2s_state;
+ reset(method);
+ } else {
+ new (&evp) EVP(method);
+ }
+}
+
+void QCryptographicHashPrivate::State::destroy(QCryptographicHash::Algorithm method)
+{
+ if (method != QCryptographicHash::Keccak_224 &&
+ method != QCryptographicHash::Keccak_256 &&
+ method != QCryptographicHash::Keccak_384 &&
+ method != QCryptographicHash::Keccak_512 &&
+ method != QCryptographicHash::Blake2b_160 &&
+ method != QCryptographicHash::Blake2b_256 &&
+ method != QCryptographicHash::Blake2b_384 &&
+ method != QCryptographicHash::Blake2s_128 &&
+ method != QCryptographicHash::Blake2s_160 &&
+ method != QCryptographicHash::Blake2s_224) {
+ evp.~EVP();
+ }
+}
+
+QCryptographicHashPrivate::EVP::EVP(QCryptographicHash::Algorithm method)
+ : initializationFailed{true}
+{
+ if (method == QCryptographicHash::Md4) {
+ /*
+ * We need to load the legacy provider in order to have the MD4
+ * algorithm available.
+ */
+ legacyProvider = OSSL_PROVIDER_ptr(OSSL_PROVIDER_load(nullptr, "legacy"));
+
+ if (!legacyProvider)
+ return;
+ }
+
+ defaultProvider = OSSL_PROVIDER_ptr(OSSL_PROVIDER_load(nullptr, "default"));
+ if (!defaultProvider)
+ return;
+
+ context = EVP_MD_CTX_ptr(EVP_MD_CTX_new());
+
+ if (!context) {
+ return;
+ }
+
+ /*
+ * Using the "-fips" option will disable the global "fips=yes" for
+ * this one lookup and the algorithm can be fetched from any provider
+ * that implements the algorithm (including the FIPS provider).
+ */
+ algorithm = EVP_MD_ptr(EVP_MD_fetch(nullptr, methodToName(method), "-fips"));
+ if (!algorithm) {
+ return;
+ }
+
+ initializationFailed = !EVP_DigestInit_ex(context.get(), algorithm.get(), nullptr);
+}
+
+#else // USING_OPENSSL30
+
+QCryptographicHashPrivate::State::State(QCryptographicHash::Algorithm method)
{
switch (method) {
case QCryptographicHash::Sha1:
new (&sha1Context) Sha1State;
- sha1InitState(&sha1Context);
break;
#ifdef QT_CRYPTOGRAPHICHASH_ONLY_SHA1
default:
@@ -382,27 +645,21 @@ void QCryptographicHashPrivate::reset() noexcept
#else
case QCryptographicHash::Md4:
new (&md4Context) md4_context;
- md4_init(&md4Context);
break;
case QCryptographicHash::Md5:
new (&md5Context) MD5Context;
- MD5Init(&md5Context);
break;
case QCryptographicHash::Sha224:
new (&sha224Context) SHA224Context;
- SHA224Reset(&sha224Context);
break;
case QCryptographicHash::Sha256:
new (&sha256Context) SHA256Context;
- SHA256Reset(&sha256Context);
break;
case QCryptographicHash::Sha384:
new (&sha384Context) SHA384Context;
- SHA384Reset(&sha384Context);
break;
case QCryptographicHash::Sha512:
new (&sha512Context) SHA512Context;
- SHA512Reset(&sha512Context);
break;
case QCryptographicHash::RealSha3_224:
case QCryptographicHash::Keccak_224:
@@ -413,27 +670,134 @@ void QCryptographicHashPrivate::reset() noexcept
case QCryptographicHash::RealSha3_512:
case QCryptographicHash::Keccak_512:
new (&sha3Context) SHA3Context;
- sha3Init(&sha3Context, hashLengthInternal(method) * 8);
break;
case QCryptographicHash::Blake2b_160:
case QCryptographicHash::Blake2b_256:
case QCryptographicHash::Blake2b_384:
case QCryptographicHash::Blake2b_512:
new (&blake2bContext) blake2b_state;
- blake2b_init(&blake2bContext, hashLengthInternal(method));
break;
case QCryptographicHash::Blake2s_128:
case QCryptographicHash::Blake2s_160:
case QCryptographicHash::Blake2s_224:
case QCryptographicHash::Blake2s_256:
new (&blake2sContext) blake2s_state;
- blake2s_init(&blake2sContext, hashLengthInternal(method));
break;
#endif
+ case QCryptographicHash::NumAlgorithms:
+ Q_UNREACHABLE();
}
+ reset(method);
+}
+
+void QCryptographicHashPrivate::State::destroy(QCryptographicHash::Algorithm)
+{
+ static_assert(std::is_trivially_destructible_v<State>); // so nothing to do here
+}
+#endif // !USING_OPENSSL30
+
+void QCryptographicHashPrivate::reset() noexcept
+{
result.clear();
+ state.reset(method);
+}
+
+#ifdef USING_OPENSSL30
+
+void QCryptographicHashPrivate::State::reset(QCryptographicHash::Algorithm method) noexcept
+{
+ if (method == QCryptographicHash::Keccak_224 ||
+ method == QCryptographicHash::Keccak_256 ||
+ method == QCryptographicHash::Keccak_384 ||
+ method == QCryptographicHash::Keccak_512) {
+ sha3Init(&sha3Context, hashLengthInternal(method) * 8);
+ } else if (method == QCryptographicHash::Blake2b_160 ||
+ method == QCryptographicHash::Blake2b_256 ||
+ method == QCryptographicHash::Blake2b_384) {
+ blake2b_init(&blake2bContext, hashLengthInternal(method));
+ } else if (method == QCryptographicHash::Blake2s_128 ||
+ method == QCryptographicHash::Blake2s_160 ||
+ method == QCryptographicHash::Blake2s_224) {
+ blake2s_init(&blake2sContext, hashLengthInternal(method));
+ } else {
+ evp.reset();
+ }
}
+void QCryptographicHashPrivate::EVP::reset() noexcept
+{
+ if (!initializationFailed) {
+ Q_ASSERT(context);
+ Q_ASSERT(algorithm);
+ // everything already set up - just reset the context
+ EVP_MD_CTX_reset(context.get());
+ initializationFailed = !EVP_DigestInit_ex(context.get(), algorithm.get(), nullptr);
+ }
+ // if initializationFailed first time around, it will not succeed this time, either
+}
+
+#else // USING_OPENSSL30
+
+void QCryptographicHashPrivate::State::reset(QCryptographicHash::Algorithm method) noexcept
+{
+ switch (method) {
+ case QCryptographicHash::Sha1:
+ sha1InitState(&sha1Context);
+ break;
+#ifdef QT_CRYPTOGRAPHICHASH_ONLY_SHA1
+ default:
+ Q_ASSERT_X(false, "QCryptographicHash", "Method not compiled in");
+ Q_UNREACHABLE();
+ break;
+#else
+ case QCryptographicHash::Md4:
+ md4_init(&md4Context);
+ break;
+ case QCryptographicHash::Md5:
+ MD5Init(&md5Context);
+ break;
+ case QCryptographicHash::Sha224:
+ SHA224Reset(&sha224Context);
+ break;
+ case QCryptographicHash::Sha256:
+ SHA256Reset(&sha256Context);
+ break;
+ case QCryptographicHash::Sha384:
+ SHA384Reset(&sha384Context);
+ break;
+ case QCryptographicHash::Sha512:
+ SHA512Reset(&sha512Context);
+ break;
+ case QCryptographicHash::RealSha3_224:
+ case QCryptographicHash::Keccak_224:
+ case QCryptographicHash::RealSha3_256:
+ case QCryptographicHash::Keccak_256:
+ case QCryptographicHash::RealSha3_384:
+ case QCryptographicHash::Keccak_384:
+ case QCryptographicHash::RealSha3_512:
+ case QCryptographicHash::Keccak_512:
+ sha3Init(&sha3Context, hashLengthInternal(method) * 8);
+ break;
+ case QCryptographicHash::Blake2b_160:
+ case QCryptographicHash::Blake2b_256:
+ case QCryptographicHash::Blake2b_384:
+ case QCryptographicHash::Blake2b_512:
+ blake2b_init(&blake2bContext, hashLengthInternal(method));
+ break;
+ case QCryptographicHash::Blake2s_128:
+ case QCryptographicHash::Blake2s_160:
+ case QCryptographicHash::Blake2s_224:
+ case QCryptographicHash::Blake2s_256:
+ blake2s_init(&blake2sContext, hashLengthInternal(method));
+ break;
+#endif
+ case QCryptographicHash::NumAlgorithms:
+ Q_UNREACHABLE();
+ }
+}
+
+#endif // USING_OPENSSL30
+
#if QT_DEPRECATED_SINCE(6, 4)
/*!
Adds the first \a length chars of \a data to the cryptographic
@@ -462,6 +826,43 @@ void QCryptographicHash::addData(QByteArrayView bytes) noexcept
void QCryptographicHashPrivate::addData(QByteArrayView bytes) noexcept
{
+ state.addData(method, bytes);
+ result.clear();
+}
+
+#ifdef USING_OPENSSL30
+
+void QCryptographicHashPrivate::State::addData(QCryptographicHash::Algorithm method,
+ QByteArrayView bytes) noexcept
+{
+ const char *data = bytes.data();
+ auto length = bytes.size();
+ // all functions take size_t length, so we don't need to loop around them:
+ {
+ if (method == QCryptographicHash::Keccak_224 ||
+ method == QCryptographicHash::Keccak_256 ||
+ method == QCryptographicHash::Keccak_384 ||
+ method == QCryptographicHash::Keccak_512) {
+ sha3Update(&sha3Context, reinterpret_cast<const BitSequence *>(data), uint64_t(length) * 8);
+ } else if (method == QCryptographicHash::Blake2b_160 ||
+ method == QCryptographicHash::Blake2b_256 ||
+ method == QCryptographicHash::Blake2b_384) {
+ blake2b_update(&blake2bContext, reinterpret_cast<const uint8_t *>(data), length);
+ } else if (method == QCryptographicHash::Blake2s_128 ||
+ method == QCryptographicHash::Blake2s_160 ||
+ method == QCryptographicHash::Blake2s_224) {
+ blake2s_update(&blake2sContext, reinterpret_cast<const uint8_t *>(data), length);
+ } else if (!evp.initializationFailed) {
+ EVP_DigestUpdate(evp.context.get(), (const unsigned char *)data, length);
+ }
+ }
+}
+
+#else // USING_OPENSSL30
+
+void QCryptographicHashPrivate::State::addData(QCryptographicHash::Algorithm method,
+ QByteArrayView bytes) noexcept
+{
const char *data = bytes.data();
auto length = bytes.size();
@@ -525,10 +926,12 @@ void QCryptographicHashPrivate::addData(QByteArrayView bytes) noexcept
blake2s_update(&blake2sContext, reinterpret_cast<const uint8_t *>(data), length);
break;
#endif
+ case QCryptographicHash::NumAlgorithms:
+ Q_UNREACHABLE();
}
}
- result.clear();
}
+#endif // !USING_OPENSSL30
/*!
Reads the data from the open QIODevice \a device until it ends
@@ -537,6 +940,11 @@ void QCryptographicHashPrivate::addData(QByteArrayView bytes) noexcept
*/
bool QCryptographicHash::addData(QIODevice *device)
{
+ return d->addData(device);
+}
+
+bool QCryptographicHashPrivate::addData(QIODevice *device)
+{
if (!device->isReadable())
return false;
@@ -544,10 +952,10 @@ bool QCryptographicHash::addData(QIODevice *device)
return false;
char buffer[1024];
- int length;
+ qint64 length;
while ((length = device->read(buffer, sizeof(buffer))) > 0)
- d->addData({buffer, length});
+ addData({buffer, qsizetype(length)}); // length always <= 1024
return device->atEnd();
}
@@ -575,21 +983,86 @@ QByteArray QCryptographicHash::result() const
*/
QByteArrayView QCryptographicHash::resultView() const noexcept
{
+ // resultView() is a const function, so concurrent calls are allowed; protect:
d->finalize();
+ // resultView() remains(!) valid even after we dropped the mutex in finalize()
return d->resultView();
}
+/*!
+ \internal
+
+ Calls finalizeUnchecked(), if needed, under finalizeMutex protection.
+*/
void QCryptographicHashPrivate::finalize() noexcept
{
+ const auto lock = qt_scoped_lock(finalizeMutex);
+ // check that no other thread already finalizeUnchecked()'ed before us:
if (!result.isEmpty())
return;
+ finalizeUnchecked();
+}
+
+/*!
+ \internal
+ Must be called with finalizeMutex held (except from static hash() function,
+ where no sharing can take place).
+*/
+void QCryptographicHashPrivate::finalizeUnchecked() noexcept
+{
+ state.finalizeUnchecked(method, result);
+}
+
+#ifdef USING_OPENSSL30
+void QCryptographicHashPrivate::State::finalizeUnchecked(QCryptographicHash::Algorithm method,
+ HashResult &result) noexcept
+{
+ if (method == QCryptographicHash::Keccak_224 ||
+ method == QCryptographicHash::Keccak_256 ||
+ method == QCryptographicHash::Keccak_384 ||
+ method == QCryptographicHash::Keccak_512) {
+ sha3Finish(result, 8 * hashLengthInternal(method), Sha3Variant::Keccak);
+ } else if (method == QCryptographicHash::Blake2b_160 ||
+ method == QCryptographicHash::Blake2b_256 ||
+ method == QCryptographicHash::Blake2b_384) {
+ const auto length = hashLengthInternal(method);
+ blake2b_state copy = blake2bContext;
+ result.resizeForOverwrite(length);
+ blake2b_final(&copy, result.data(), length);
+ } else if (method == QCryptographicHash::Blake2s_128 ||
+ method == QCryptographicHash::Blake2s_160 ||
+ method == QCryptographicHash::Blake2s_224) {
+ const auto length = hashLengthInternal(method);
+ blake2s_state copy = blake2sContext;
+ result.resizeForOverwrite(length);
+ blake2s_final(&copy, result.data(), length);
+ } else {
+ evp.finalizeUnchecked(result);
+ }
+}
+
+void QCryptographicHashPrivate::EVP::finalizeUnchecked(HashResult &result) noexcept
+{
+ if (!initializationFailed) {
+ EVP_MD_CTX_ptr copy = EVP_MD_CTX_ptr(EVP_MD_CTX_new());
+ EVP_MD_CTX_copy_ex(copy.get(), context.get());
+ result.resizeForOverwrite(EVP_MD_get_size(algorithm.get()));
+ EVP_DigestFinal_ex(copy.get(), result.data(), nullptr);
+ }
+}
+
+#else // USING_OPENSSL30
+
+void QCryptographicHashPrivate::State::finalizeUnchecked(QCryptographicHash::Algorithm method,
+ HashResult &result) noexcept
+{
switch (method) {
case QCryptographicHash::Sha1: {
Sha1State copy = sha1Context;
- result.resize(20);
+ result.resizeForOverwrite(20);
sha1FinalizeState(&copy);
- sha1ToHash(&copy, (unsigned char *)result.data());
+ sha1ToHash(&copy, result.data());
break;
}
#ifdef QT_CRYPTOGRAPHICHASH_ONLY_SHA1
@@ -600,52 +1073,52 @@ void QCryptographicHashPrivate::finalize() noexcept
#else
case QCryptographicHash::Md4: {
md4_context copy = md4Context;
- result.resize(MD4_RESULTLEN);
- md4_final(&copy, (unsigned char *)result.data());
+ result.resizeForOverwrite(MD4_RESULTLEN);
+ md4_final(&copy, result.data());
break;
}
case QCryptographicHash::Md5: {
MD5Context copy = md5Context;
- result.resize(16);
- MD5Final(&copy, (unsigned char *)result.data());
+ result.resizeForOverwrite(16);
+ MD5Final(&copy, result.data());
break;
}
case QCryptographicHash::Sha224: {
SHA224Context copy = sha224Context;
- result.resize(SHA224HashSize);
- SHA224Result(&copy, reinterpret_cast<unsigned char *>(result.data()));
+ result.resizeForOverwrite(SHA224HashSize);
+ SHA224Result(&copy, result.data());
break;
}
case QCryptographicHash::Sha256: {
SHA256Context copy = sha256Context;
- result.resize(SHA256HashSize);
- SHA256Result(&copy, reinterpret_cast<unsigned char *>(result.data()));
+ result.resizeForOverwrite(SHA256HashSize);
+ SHA256Result(&copy, result.data());
break;
}
case QCryptographicHash::Sha384: {
SHA384Context copy = sha384Context;
- result.resize(SHA384HashSize);
- SHA384Result(&copy, reinterpret_cast<unsigned char *>(result.data()));
+ result.resizeForOverwrite(SHA384HashSize);
+ SHA384Result(&copy, result.data());
break;
}
case QCryptographicHash::Sha512: {
SHA512Context copy = sha512Context;
- result.resize(SHA512HashSize);
- SHA512Result(&copy, reinterpret_cast<unsigned char *>(result.data()));
+ result.resizeForOverwrite(SHA512HashSize);
+ SHA512Result(&copy, result.data());
break;
}
case QCryptographicHash::RealSha3_224:
case QCryptographicHash::RealSha3_256:
case QCryptographicHash::RealSha3_384:
case QCryptographicHash::RealSha3_512: {
- sha3Finish(8 * hashLengthInternal(method), Sha3Variant::Sha3);
+ sha3Finish(result, 8 * hashLengthInternal(method), Sha3Variant::Sha3);
break;
}
case QCryptographicHash::Keccak_224:
case QCryptographicHash::Keccak_256:
case QCryptographicHash::Keccak_384:
case QCryptographicHash::Keccak_512: {
- sha3Finish(8 * hashLengthInternal(method), Sha3Variant::Keccak);
+ sha3Finish(result, 8 * hashLengthInternal(method), Sha3Variant::Keccak);
break;
}
case QCryptographicHash::Blake2b_160:
@@ -654,8 +1127,8 @@ void QCryptographicHashPrivate::finalize() noexcept
case QCryptographicHash::Blake2b_512: {
const auto length = hashLengthInternal(method);
blake2b_state copy = blake2bContext;
- result.resize(length);
- blake2b_final(&copy, reinterpret_cast<uint8_t *>(result.data()), length);
+ result.resizeForOverwrite(length);
+ blake2b_final(&copy, result.data(), length);
break;
}
case QCryptographicHash::Blake2s_128:
@@ -664,13 +1137,16 @@ void QCryptographicHashPrivate::finalize() noexcept
case QCryptographicHash::Blake2s_256: {
const auto length = hashLengthInternal(method);
blake2s_state copy = blake2sContext;
- result.resize(length);
- blake2s_final(&copy, reinterpret_cast<uint8_t *>(result.data()), length);
+ result.resizeForOverwrite(length);
+ blake2s_final(&copy, result.data(), length);
break;
}
#endif
+ case QCryptographicHash::NumAlgorithms:
+ Q_UNREACHABLE();
}
}
+#endif // !USING_OPENSSL30
/*!
Returns the hash of \a data using \a method.
@@ -682,7 +1158,7 @@ QByteArray QCryptographicHash::hash(QByteArrayView data, Algorithm method)
{
QCryptographicHashPrivate hash(method);
hash.addData(data);
- hash.finalize();
+ hash.finalizeUnchecked(); // no mutex needed: no-one but us has access to 'hash'
return hash.resultView().toByteArray();
}
@@ -696,6 +1172,480 @@ int QCryptographicHash::hashLength(QCryptographicHash::Algorithm method)
return hashLengthInternal(method);
}
+/*!
+ Returns whether the selected algorithm \a method is supported and if
+ result() will return a value when the \a method is used.
+
+ \note OpenSSL will be responsible for providing this information when
+ used as a provider, otherwise \c true will be returned as the non-OpenSSL
+ implementation doesn't have any restrictions.
+ We return \c false if we fail to query OpenSSL.
+
+ \since 6.5
+*/
+
+
+bool QCryptographicHash::supportsAlgorithm(QCryptographicHash::Algorithm method)
+{
+ return QCryptographicHashPrivate::supportsAlgorithm(method);
+}
+
+bool QCryptographicHashPrivate::supportsAlgorithm(QCryptographicHash::Algorithm method)
+{
+#ifdef USING_OPENSSL30
+ // OpenSSL doesn't support Blake2b{60,236,384} and Blake2s{128,160,224}
+ // and these would automatically return FALSE in that case, while they are
+ // actually supported by our non-OpenSSL implementation.
+ if (useNonOpenSSLFallback(method))
+ return true;
+
+ auto legacyProvider = OSSL_PROVIDER_ptr(OSSL_PROVIDER_load(nullptr, "legacy"));
+ auto defaultProvider = OSSL_PROVIDER_ptr(OSSL_PROVIDER_load(nullptr, "default"));
+
+ const char *restriction = "-fips";
+ EVP_MD_ptr algorithm = EVP_MD_ptr(EVP_MD_fetch(nullptr, methodToName(method), restriction));
+
+ return algorithm != nullptr;
+#else
+ switch (method) {
+ case QCryptographicHash::Sha1:
+#ifndef QT_CRYPTOGRAPHICHASH_ONLY_SHA1
+ case QCryptographicHash::Md4:
+ case QCryptographicHash::Md5:
+ case QCryptographicHash::Sha224:
+ case QCryptographicHash::Sha256:
+ case QCryptographicHash::Sha384:
+ case QCryptographicHash::Sha512:
+ case QCryptographicHash::RealSha3_224:
+ case QCryptographicHash::Keccak_224:
+ case QCryptographicHash::RealSha3_256:
+ case QCryptographicHash::Keccak_256:
+ case QCryptographicHash::RealSha3_384:
+ case QCryptographicHash::Keccak_384:
+ case QCryptographicHash::RealSha3_512:
+ case QCryptographicHash::Keccak_512:
+ case QCryptographicHash::Blake2b_160:
+ case QCryptographicHash::Blake2b_256:
+ case QCryptographicHash::Blake2b_384:
+ case QCryptographicHash::Blake2b_512:
+ case QCryptographicHash::Blake2s_128:
+ case QCryptographicHash::Blake2s_160:
+ case QCryptographicHash::Blake2s_224:
+ case QCryptographicHash::Blake2s_256:
+#endif
+ return true;
+ case QCryptographicHash::NumAlgorithms: ;
+ };
+ return false;
+#endif // !USING_OPENSSL3
+}
+
+static constexpr int qt_hash_block_size(QCryptographicHash::Algorithm method)
+{
+ switch (method) {
+ case QCryptographicHash::Sha1:
+ return SHA1_Message_Block_Size;
+#ifndef QT_CRYPTOGRAPHICHASH_ONLY_SHA1
+ case QCryptographicHash::Md4:
+ return 64;
+ case QCryptographicHash::Md5:
+ return 64;
+ case QCryptographicHash::Sha224:
+ return SHA224_Message_Block_Size;
+ case QCryptographicHash::Sha256:
+ return SHA256_Message_Block_Size;
+ case QCryptographicHash::Sha384:
+ return SHA384_Message_Block_Size;
+ case QCryptographicHash::Sha512:
+ return SHA512_Message_Block_Size;
+ case QCryptographicHash::RealSha3_224:
+ case QCryptographicHash::Keccak_224:
+ return 144;
+ case QCryptographicHash::RealSha3_256:
+ case QCryptographicHash::Keccak_256:
+ return 136;
+ case QCryptographicHash::RealSha3_384:
+ case QCryptographicHash::Keccak_384:
+ return 104;
+ case QCryptographicHash::RealSha3_512:
+ case QCryptographicHash::Keccak_512:
+ return 72;
+ case QCryptographicHash::Blake2b_160:
+ case QCryptographicHash::Blake2b_256:
+ case QCryptographicHash::Blake2b_384:
+ case QCryptographicHash::Blake2b_512:
+ return BLAKE2B_BLOCKBYTES;
+ case QCryptographicHash::Blake2s_128:
+ case QCryptographicHash::Blake2s_160:
+ case QCryptographicHash::Blake2s_224:
+ case QCryptographicHash::Blake2s_256:
+ return BLAKE2S_BLOCKBYTES;
+#endif // QT_CRYPTOGRAPHICHASH_ONLY_SHA1
+ case QCryptographicHash::NumAlgorithms:
+#if !defined(Q_CC_GNU_ONLY) || Q_CC_GNU >= 900
+ // GCC 8 has trouble with Q_UNREACHABLE() in constexpr functions
+ Q_UNREACHABLE();
+#endif
+ break;
+ }
+ return 0;
+}
+
+constexpr int maxHashBlockSize()
+{
+ int result = 0;
+ using A = QCryptographicHash::Algorithm;
+ for (int i = 0; i < A::NumAlgorithms ; ++i)
+ result = std::max(result, qt_hash_block_size(A(i)));
+ return result;
+}
+
+[[maybe_unused]]
+constexpr int minHashBlockSize()
+{
+ int result = INT_MAX;
+ using A = QCryptographicHash::Algorithm;
+ for (int i = 0; i < A::NumAlgorithms ; ++i)
+ result = std::min(result, qt_hash_block_size(A(i)));
+ return result;
+}
+
+[[maybe_unused]]
+constexpr int gcdHashBlockSize()
+{
+ int result = 0;
+ using A = QCryptographicHash::Algorithm;
+ for (int i = 0; i < A::NumAlgorithms ; ++i)
+ result = std::gcd(result, qt_hash_block_size(A(i)));
+ return result;
+}
+
+using HashBlock = QSmallByteArray<maxHashBlockSize()>;
+
+static HashBlock xored(const HashBlock &block, quint8 val) noexcept
+{
+ // some hints for the optimizer:
+ Q_ASSERT(block.size() >= minHashBlockSize());
+ Q_ASSERT(block.size() <= maxHashBlockSize());
+ Q_ASSERT(block.size() % gcdHashBlockSize() == 0);
+ HashBlock result;
+ result.resizeForOverwrite(block.size());
+ for (qsizetype i = 0; i < block.size(); ++i)
+ result[i] = block[i] ^ val;
+ return result;
+}
+
+class QMessageAuthenticationCodePrivate
+{
+public:
+ QMessageAuthenticationCodePrivate(QCryptographicHash::Algorithm m)
+ : messageHash(m)
+ {
+ }
+
+ HashBlock key;
+ QCryptographicHashPrivate messageHash;
+
+ void setKey(QByteArrayView k) noexcept;
+ void initMessageHash() noexcept;
+ void finalize();
+
+ // when not called from the static hash() function, this function needs to be
+ // called with messageHash.finalizeMutex held:
+ void finalizeUnchecked() noexcept;
+ // END functions that need to be called with finalizeMutex held
+};
+
+/*!
+ \internal
+
+ Transforms key \a newKey into a block-sized format and stores it in member
+ \c key.
+
+ This function assumes it can use messageHash (i.e. it's in its initial
+ state (reset() has been called)).
+*/
+void QMessageAuthenticationCodePrivate::setKey(QByteArrayView newKey) noexcept
+{
+ const int blockSize = qt_hash_block_size(messageHash.method);
+
+ if (newKey.size() > blockSize) {
+ messageHash.addData(newKey);
+ messageHash.finalizeUnchecked();
+ static_assert([] {
+ using A = QCryptographicHash::Algorithm;
+ for (int i = 0; i < A::NumAlgorithms; ++i) {
+ if (hashLengthInternal(A(i)) > qt_hash_block_size(A(i)))
+ return false;
+ }
+ return true;
+ }(), "this code assumes that a hash's result always fits into that hash's block size");
+ key = messageHash.result;
+ messageHash.reset();
+ } else {
+ key.assign(newKey);
+ }
+
+ if (key.size() < blockSize)
+ key.resize(blockSize, '\0');
+
+ initMessageHash();
+}
+
+/*!
+ \internal
+
+ Seeds messageHash from \c key.
+
+ This function assumes that messageHash is in its initial state (reset() has
+ been called).
+*/
+void QMessageAuthenticationCodePrivate::initMessageHash() noexcept
+{
+ messageHash.addData(xored(key, 0x36));
+}
+
+/*!
+ \class QMessageAuthenticationCode
+ \inmodule QtCore
+
+ \brief The QMessageAuthenticationCode class provides a way to generate
+ hash-based message authentication codes.
+
+ \since 5.1
+
+ \ingroup tools
+ \reentrant
+
+ Use the QMessageAuthenticationCode class to generate hash-based message
+ authentication codes (HMACs). The class supports all cryptographic
+ hash algorithms from \l QCryptographicHash (see also
+ \l{QCryptographicHash::Algorithm}).
+
+ To generate a message authentication code, pass a suitable hash
+ algorithm and secret key to the constructor. Then process the message
+ data by calling \l addData() one or more times. After the full
+ message has been processed, get the final authentication code
+ via the \l result() function:
+
+ \snippet qmessageauthenticationcode/main.cpp 0
+ \dots
+ \snippet qmessageauthenticationcode/main.cpp 1
+
+ For simple cases like above, you can also use the static
+ \l hash() function:
+
+ \snippet qmessageauthenticationcode/main.cpp 2
+
+
+ \note The cryptographic strength of the HMAC depends upon the
+ size of the secret key, and the security of the
+ underlying hash function.
+
+ \sa QCryptographicHash, QCryptographicHash::Algorithm
+*/
+
+/*!
+ Constructs an object that can be used to create a cryptographic hash from data
+ using method \a method and key \a key.
+
+//! [qba-to-qbav-6.6]
+ \note In Qt versions prior to 6.6, this function took its arguments as
+ QByteArray, not QByteArrayView. If you experience compile errors, it's
+ because your code is passing objects that are implicitly convertible to
+ QByteArray, but not QByteArrayView. Wrap the corresponding argument in
+ \c{QByteArray{~~~}} to make the cast explicit. This is backwards-compatible
+ with old Qt versions.
+//! [qba-to-qbav-6.6]
+*/
+QMessageAuthenticationCode::QMessageAuthenticationCode(QCryptographicHash::Algorithm method,
+ QByteArrayView key)
+ : d(new QMessageAuthenticationCodePrivate(method))
+{
+ d->setKey(key);
+}
+
+/*!
+ Destroys the object.
+*/
+QMessageAuthenticationCode::~QMessageAuthenticationCode()
+{
+ delete d;
+}
+
+/*!
+ \fn QMessageAuthenticationCode::QMessageAuthenticationCode(QMessageAuthenticationCode &&other)
+
+ Move-constructs a new QMessageAuthenticationCode from \a other.
+
+ \note The moved-from object \a other is placed in a
+ partially-formed state, in which the only valid operations are
+ destruction and assignment of a new object.
+
+ \since 6.6
+*/
+
+/*!
+ \fn QMessageAuthenticationCode &QMessageAuthenticationCode::operator=(QMessageAuthenticationCode &&other)
+
+ Move-assigns \a other to this QMessageAuthenticationCode instance.
+
+ \note The moved-from object \a other is placed in a
+ partially-formed state, in which the only valid operations are
+ destruction and assignment of a new object.
+
+ \since 6.6
+*/
+
+/*!
+ \fn void QMessageAuthenticationCode::swap(QMessageAuthenticationCode &other)
+
+ Swaps message authentication code \a other with this message authentication
+ code. This operation is very fast and never fails.
+
+ \since 6.6
+*/
+
+/*!
+ Resets message data. Calling this function doesn't affect the key.
+*/
+void QMessageAuthenticationCode::reset() noexcept
+{
+ d->messageHash.reset();
+ d->initMessageHash();
+}
+
+/*!
+ Sets secret \a key. Calling this function automatically resets the object state.
+
+ For optimal performance, call this function only to \e change the active key,
+ not to set an \e initial key, as in
+
+ \code
+ QMessageAuthenticationCode mac(method);
+ mac.setKey(key); // does extra work
+ use(mac);
+ \endcode
+
+ Prefer to pass initial keys as the constructor argument:
+
+ \code
+ QMessageAuthenticationCode mac(method, key); // OK, optimal
+ use(mac);
+ \endcode
+
+ You can use std::optional to delay construction of a
+ QMessageAuthenticationCode until you know the key:
+
+ \code
+ std::optional<QMessageAuthenticationCode> mac;
+ ~~~
+ key = ~~~;
+ mac.emplace(method, key);
+ use(*mac);
+ \endcode
+
+ \include qcryptographichash.cpp {qba-to-qbav-6.6}
+*/
+void QMessageAuthenticationCode::setKey(QByteArrayView key) noexcept
+{
+ d->messageHash.reset();
+ d->setKey(key);
+}
+
+/*!
+ \overload
+ Adds the first \a length chars of \a data to the message.
+*/
+void QMessageAuthenticationCode::addData(const char *data, qsizetype length)
+{
+ d->messageHash.addData({data, length});
+}
+
+/*!
+ Adds \a data to the message.
+
+ \include qcryptographichash.cpp {qba-to-qbav-6.6}
+
+ \sa resultView(), result()
+*/
+void QMessageAuthenticationCode::addData(QByteArrayView data) noexcept
+{
+ d->messageHash.addData(data);
+}
+
+/*!
+ Reads the data from the open QIODevice \a device until it ends
+ and adds it to message. Returns \c true if reading was successful.
+
+ \note \a device must be already opened.
+ */
+bool QMessageAuthenticationCode::addData(QIODevice *device)
+{
+ return d->messageHash.addData(device);
+}
+
+/*!
+ \since 6.6
+
+ Returns the final hash value.
+
+ Note that the returned view remains valid only as long as the
+ QMessageAuthenticationCode object is not modified by other means.
+
+ \sa result()
+*/
+QByteArrayView QMessageAuthenticationCode::resultView() const noexcept
+{
+ d->finalize();
+ return d->messageHash.resultView();
+}
+
+/*!
+ Returns the final authentication code.
+
+ \sa resultView(), QByteArray::toHex()
+*/
+QByteArray QMessageAuthenticationCode::result() const
+{
+ return resultView().toByteArray();
+}
+
+void QMessageAuthenticationCodePrivate::finalize()
+{
+ const auto lock = qt_scoped_lock(messageHash.finalizeMutex);
+ if (!messageHash.result.isEmpty())
+ return;
+ finalizeUnchecked();
+}
+
+void QMessageAuthenticationCodePrivate::finalizeUnchecked() noexcept
+{
+ messageHash.finalizeUnchecked();
+ const HashResult hashedMessage = messageHash.result;
+
+ messageHash.reset();
+ messageHash.addData(xored(key, 0x5c));
+ messageHash.addData(hashedMessage);
+ messageHash.finalizeUnchecked();
+}
+
+/*!
+ Returns the authentication code for the message \a message using
+ the key \a key and the method \a method.
+
+ \include qcryptographichash.cpp {qba-to-qbav-6.6}
+*/
+QByteArray QMessageAuthenticationCode::hash(QByteArrayView message, QByteArrayView key,
+ QCryptographicHash::Algorithm method)
+{
+ QMessageAuthenticationCodePrivate mac(method);
+ mac.setKey(key);
+ mac.messageHash.addData(message);
+ mac.finalizeUnchecked();
+ return mac.messageHash.resultView().toByteArray();
+}
+
QT_END_NAMESPACE
#ifndef QT_NO_QOBJECT
diff --git a/src/corelib/tools/qcryptographichash.h b/src/corelib/tools/qcryptographichash.h
index 83aed7c64c..294453adce 100644
--- a/src/corelib/tools/qcryptographichash.h
+++ b/src/corelib/tools/qcryptographichash.h
@@ -1,43 +1,7 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2013 Richard J. Moore <rich@kde.org>.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2013 Richard J. Moore <rich@kde.org>.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QCRYPTOGRAPHICHASH_H
#define QCRYPTOGRAPHICHASH_H
@@ -96,19 +60,25 @@ public:
Blake2s_224,
Blake2s_256,
#endif
+ NumAlgorithms
};
Q_ENUM(Algorithm)
explicit QCryptographicHash(Algorithm method);
+ QCryptographicHash(QCryptographicHash &&other) noexcept : d(std::exchange(other.d, nullptr)) {}
~QCryptographicHash();
+ QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_MOVE_AND_SWAP(QCryptographicHash)
+ void swap(QCryptographicHash &other) noexcept { qt_ptr_swap(d, other.d); }
+
void reset() noexcept;
+ [[nodiscard]] Algorithm algorithm() const noexcept;
#if QT_DEPRECATED_SINCE(6, 4)
QT_DEPRECATED_VERSION_X_6_4("Use the QByteArrayView overload instead")
void addData(const char *data, qsizetype length);
#endif
-#if QT_REMOVED_SINCE(6, 3)
+#if QT_CORE_REMOVED_SINCE(6, 3)
void addData(const QByteArray &data);
#endif
void addData(QByteArrayView data) noexcept;
@@ -117,11 +87,12 @@ public:
QByteArray result() const;
QByteArrayView resultView() const noexcept;
-#if QT_REMOVED_SINCE(6, 3)
+#if QT_CORE_REMOVED_SINCE(6, 3)
static QByteArray hash(const QByteArray &data, Algorithm method);
#endif
static QByteArray hash(QByteArrayView data, Algorithm method);
static int hashLength(Algorithm method);
+ static bool supportsAlgorithm(Algorithm method);
private:
Q_DISABLE_COPY(QCryptographicHash)
QCryptographicHashPrivate *d;
diff --git a/src/corelib/tools/qduplicatetracker_p.h b/src/corelib/tools/qduplicatetracker_p.h
index eab63bab9b..23465ecffe 100644
--- a/src/corelib/tools/qduplicatetracker_p.h
+++ b/src/corelib/tools/qduplicatetracker_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QDUPLICATETRACKER_P_H
#define QDUPLICATETRACKER_P_H
@@ -50,9 +14,9 @@
// We mean it.
//
-#include <qglobal.h>
+#include <private/qglobal_p.h>
-#if __has_include(<memory_resource>)
+#ifdef __cpp_lib_memory_resource
# include <unordered_set>
# include <memory_resource>
# include <qhash.h> // for the hashing helpers
@@ -92,13 +56,13 @@ class QDuplicateTracker {
auto insert(const T &e) {
auto it = QSet<T>::insert(e);
const auto n = this->size();
- return std::pair{it, qExchange(setSize, n) != n};
+ return std::pair{it, std::exchange(setSize, n) != n};
}
auto insert(T &&e) {
auto it = QSet<T>::insert(std::move(e));
const auto n = this->size();
- return std::pair{it, qExchange(setSize, n) != n};
+ return std::pair{it, std::exchange(setSize, n) != n};
}
};
Set set{Prealloc};
diff --git a/src/corelib/tools/qeasingcurve.cpp b/src/corelib/tools/qeasingcurve.cpp
index 4839fc839e..d8b3367de3 100644
--- a/src/corelib/tools/qeasingcurve.cpp
+++ b/src/corelib/tools/qeasingcurve.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
/*
@@ -483,7 +447,7 @@ struct BezierEase : public QEasingCurveFunction
{
if (_bezierCurves.constLast() == QPointF(1.0, 1.0)) {
_init = true;
- _curveCount = _bezierCurves.count() / 3;
+ _curveCount = _bezierCurves.size() / 3;
for (int i=0; i < _curveCount; i++) {
_intervals[i] = _bezierCurves.at(i * 3 + 2).x();
@@ -502,17 +466,17 @@ struct BezierEase : public QEasingCurveFunction
_curves[0].p3y = _bezierCurves.at(2).y();
} else if (i == (_curveCount - 1)) {
- _curves[i].p0x = _bezierCurves.at(_bezierCurves.count() - 4).x();
- _curves[i].p0y = _bezierCurves.at(_bezierCurves.count() - 4).y();
+ _curves[i].p0x = _bezierCurves.at(_bezierCurves.size() - 4).x();
+ _curves[i].p0y = _bezierCurves.at(_bezierCurves.size() - 4).y();
- _curves[i].p1x = _bezierCurves.at(_bezierCurves.count() - 3).x();
- _curves[i].p1y = _bezierCurves.at(_bezierCurves.count() - 3).y();
+ _curves[i].p1x = _bezierCurves.at(_bezierCurves.size() - 3).x();
+ _curves[i].p1y = _bezierCurves.at(_bezierCurves.size() - 3).y();
- _curves[i].p2x = _bezierCurves.at(_bezierCurves.count() - 2).x();
- _curves[i].p2y = _bezierCurves.at(_bezierCurves.count() - 2).y();
+ _curves[i].p2x = _bezierCurves.at(_bezierCurves.size() - 2).x();
+ _curves[i].p2y = _bezierCurves.at(_bezierCurves.size() - 2).y();
- _curves[i].p3x = _bezierCurves.at(_bezierCurves.count() - 1).x();
- _curves[i].p3y = _bezierCurves.at(_bezierCurves.count() - 1).y();
+ _curves[i].p3x = _bezierCurves.at(_bezierCurves.size() - 1).x();
+ _curves[i].p3y = _bezierCurves.at(_bezierCurves.size() - 1).y();
} else {
_curves[i].p0x = _bezierCurves.at(i * 3 - 1).x();
_curves[i].p0y = _bezierCurves.at(i * 3 - 1).y();
@@ -571,7 +535,7 @@ struct BezierEase : public QEasingCurveFunction
qreal value(qreal x) override
{
- Q_ASSERT(_bezierCurves.count() % 3 == 0);
+ Q_ASSERT(_bezierCurves.size() % 3 == 0);
if (_bezierCurves.isEmpty()) {
return x;
@@ -905,7 +869,7 @@ struct TCBEase : public BezierEase
qreal value(qreal x) override
{
- Q_ASSERT(_bezierCurves.count() % 3 == 0);
+ Q_ASSERT(_bezierCurves.size() % 3 == 0);
if (_bezierCurves.isEmpty()) {
qWarning("QEasingCurve: Invalid tcb curve");
@@ -1310,7 +1274,7 @@ void QEasingCurve::addCubicBezierSegment(const QPointF & c1, const QPointF & c2,
QList<QPointF> static inline tcbToBezier(const TCBPoints &tcbPoints)
{
- const int count = tcbPoints.count();
+ const int count = tcbPoints.size();
QList<QPointF> bezierPoints;
bezierPoints.reserve(3 * (count - 1));
diff --git a/src/corelib/tools/qeasingcurve.h b/src/corelib/tools/qeasingcurve.h
index 7e50743bf1..5b112d7d7d 100644
--- a/src/corelib/tools/qeasingcurve.h
+++ b/src/corelib/tools/qeasingcurve.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QEASINGCURVE_H
#define QEASINGCURVE_H
@@ -81,7 +45,7 @@ public:
QEasingCurve(QEasingCurve &&other) noexcept : d_ptr(other.d_ptr) { other.d_ptr = nullptr; }
QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_PURE_SWAP(QEasingCurve)
- void swap(QEasingCurve &other) noexcept { qSwap(d_ptr, other.d_ptr); }
+ void swap(QEasingCurve &other) noexcept { qt_ptr_swap(d_ptr, other.d_ptr); }
bool operator==(const QEasingCurve &other) const;
inline bool operator!=(const QEasingCurve &other) const
diff --git a/src/corelib/tools/qflatmap_p.h b/src/corelib/tools/qflatmap_p.h
index 1b3eaea01c..d2c0d45b79 100644
--- a/src/corelib/tools/qflatmap_p.h
+++ b/src/corelib/tools/qflatmap_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QFLATMAP_P_H
#define QFLATMAP_P_H
@@ -52,6 +16,7 @@
//
#include "qlist.h"
+#include "private/qglobal_p.h"
#include <algorithm>
#include <functional>
@@ -77,6 +42,19 @@ QT_BEGIN_NAMESPACE
QFlatMap<float, int, std::less<float>, std::vector<float>, std::vector<int>>
*/
+// Qt 6.4:
+// - removed QFlatMap API which was incompatible with STL semantics
+// - will be released with said API disabled, to catch any out-of-tree users
+// - also allows opting in to the new API using QFLATMAP_ENABLE_STL_COMPATIBLE_INSERT
+// Qt 6.5
+// - will make QFLATMAP_ENABLE_STL_COMPATIBLE_INSERT the default:
+
+#ifndef QFLATMAP_ENABLE_STL_COMPATIBLE_INSERT
+# if QT_VERSION >= QT_VERSION_CHECK(6, 5, 0)
+# define QFLATMAP_ENABLE_STL_COMPATIBLE_INSERT
+# endif
+#endif
+
namespace Qt {
struct OrderedUniqueRange_t {};
@@ -96,7 +74,7 @@ public:
using value_type = std::pair<const Key, T>;
static constexpr bool is_comparator_noexcept = noexcept(
- std::declval<Compare>()(std::declval<Key>(), std::declval<Key>()));
+ std::declval<Compare>()(std::declval<const Key &>(), std::declval<const Key &>()));
bool operator()(const value_type &lhs, const value_type &rhs) const
noexcept(is_comparator_noexcept)
@@ -105,29 +83,34 @@ public:
}
};
+namespace qflatmap {
+namespace detail {
+template <class T>
+class QFlatMapMockPointer
+{
+ T ref;
+public:
+ QFlatMapMockPointer(T r)
+ : ref(r)
+ {
+ }
+
+ T *operator->()
+ {
+ return &ref;
+ }
+};
+} // namespace detail
+} // namespace qflatmap
+
template<class Key, class T, class Compare = std::less<Key>, class KeyContainer = QList<Key>,
class MappedContainer = QList<T>>
class QFlatMap : private QFlatMapValueCompare<Key, T, Compare>
{
static_assert(std::is_nothrow_destructible_v<T>, "Types with throwing destructors are not supported in Qt containers.");
- using full_map_t = QFlatMap<Key, T, Compare, KeyContainer, MappedContainer>;
-
- template <class U>
- class mock_pointer
- {
- U ref;
- public:
- mock_pointer(U r)
- : ref(r)
- {
- }
-
- U *operator->()
- {
- return &ref;
- }
- };
+ template<class U>
+ using mock_pointer = qflatmap::detail::QFlatMapMockPointer<U>;
public:
using key_type = Key;
@@ -161,12 +144,12 @@ public:
{
}
- reference operator*()
+ reference operator*() const
{
return { c->keys[i], c->values[i] };
}
- pointer operator->()
+ pointer operator->() const
{
return { operator*() };
}
@@ -191,7 +174,7 @@ public:
{
iterator r = *this;
- i++;
+ ++*this;
return r;
}
@@ -204,7 +187,7 @@ public:
iterator operator--(int)
{
iterator r = *this;
- i--;
+ --*this;
return r;
}
@@ -242,7 +225,7 @@ public:
return b.i - a.i;
}
- reference operator[](size_type n)
+ reference operator[](size_type n) const
{
size_type k = i + n;
return { c->keys[k], c->values[k] };
@@ -269,12 +252,12 @@ public:
}
const Key &key() const { return c->keys[i]; }
- T &value() { return c->values[i]; }
+ T &value() const { return c->values[i]; }
private:
containers *c = nullptr;
size_type i = 0;
- friend full_map_t;
+ friend QFlatMap;
};
class const_iterator
@@ -298,12 +281,12 @@ public:
{
}
- reference operator*()
+ reference operator*() const
{
return { c->keys[i], c->values[i] };
}
- pointer operator->()
+ pointer operator->() const
{
return { operator*() };
}
@@ -328,7 +311,7 @@ public:
{
const_iterator r = *this;
- i++;
+ ++*this;
return r;
}
@@ -341,7 +324,7 @@ public:
const_iterator operator--(int)
{
const_iterator r = *this;
- i--;
+ --*this;
return r;
}
@@ -379,7 +362,7 @@ public:
return b.i - a.i;
}
- reference operator[](size_type n)
+ reference operator[](size_type n) const
{
size_type k = i + n;
return { c->keys[k], c->values[k] };
@@ -406,12 +389,12 @@ public:
}
const Key &key() const { return c->keys[i]; }
- const T &value() { return c->values[i]; }
+ const T &value() const { return c->values[i]; }
private:
const containers *c = nullptr;
size_type i = 0;
- friend full_map_t;
+ friend QFlatMap;
};
private:
@@ -419,7 +402,7 @@ private:
struct is_marked_transparent_type : std::false_type { };
template <class X>
- struct is_marked_transparent_type<X, typename X::is_transparent> : std::true_type { };
+ struct is_marked_transparent_type<X, std::void_t<typename X::is_transparent>> : std::true_type { };
template <class X>
using is_marked_transparent = typename std::enable_if<
@@ -432,6 +415,7 @@ private:
public:
QFlatMap() = default;
+#ifdef QFLATMAP_ENABLE_STL_COMPATIBLE_INSERT
explicit QFlatMap(const key_container_type &keys, const mapped_container_type &values)
: c{keys, values}
{
@@ -439,23 +423,20 @@ public:
}
explicit QFlatMap(key_container_type &&keys, const mapped_container_type &values)
+ : c{std::move(keys), values}
{
- c.keys = std::move(keys);
- c.values = values;
ensureOrderedUnique();
}
explicit QFlatMap(const key_container_type &keys, mapped_container_type &&values)
+ : c{keys, std::move(values)}
{
- c.keys = keys;
- c.values = std::move(values);
ensureOrderedUnique();
}
explicit QFlatMap(key_container_type &&keys, mapped_container_type &&values)
+ : c{std::move(keys), std::move(values)}
{
- c.keys = std::move(keys);
- c.values = std::move(values);
ensureOrderedUnique();
}
@@ -470,37 +451,34 @@ public:
initWithRange(first, last);
ensureOrderedUnique();
}
+#endif
explicit QFlatMap(Qt::OrderedUniqueRange_t, const key_container_type &keys,
const mapped_container_type &values)
+ : c{keys, values}
{
- c.keys = keys;
- c.values = values;
}
explicit QFlatMap(Qt::OrderedUniqueRange_t, key_container_type &&keys,
const mapped_container_type &values)
+ : c{std::move(keys), values}
{
- c.keys = std::move(keys);
- c.values = values;
}
explicit QFlatMap(Qt::OrderedUniqueRange_t, const key_container_type &keys,
mapped_container_type &&values)
+ : c{keys, std::move(values)}
{
- c.keys = keys;
- c.values = std::move(values);
}
explicit QFlatMap(Qt::OrderedUniqueRange_t, key_container_type &&keys,
mapped_container_type &&values)
+ : c{std::move(keys), std::move(values)}
{
- c.keys = std::move(keys);
- c.values = std::move(values);
}
explicit QFlatMap(Qt::OrderedUniqueRange_t, std::initializer_list<value_type> lst)
- : QFlatMap(lst.begin(), lst.end())
+ : QFlatMap(Qt::OrderedUniqueRange, lst.begin(), lst.end())
{
}
@@ -515,6 +493,7 @@ public:
{
}
+#ifdef QFLATMAP_ENABLE_STL_COMPATIBLE_INSERT
explicit QFlatMap(const key_container_type &keys, const mapped_container_type &values,
const Compare &compare)
: value_compare(compare), c{keys, values}
@@ -555,6 +534,7 @@ public:
initWithRange(first, last);
ensureOrderedUnique();
}
+#endif
explicit QFlatMap(Qt::OrderedUniqueRange_t, const key_container_type &keys,
const mapped_container_type &values, const Compare &compare)
@@ -616,13 +596,13 @@ public:
bool remove(const Key &key)
{
- auto it = binary_find(key);
- if (it != end()) {
- c.keys.erase(toKeysIterator(it));
- c.values.erase(toValuesIterator(it));
- return true;
- }
- return false;
+ return do_remove(find(key));
+ }
+
+ template <class X, class Y = Compare, is_marked_transparent<Y> = nullptr>
+ bool remove(const X &key)
+ {
+ return do_remove(find(key));
}
iterator erase(iterator it)
@@ -633,50 +613,60 @@ public:
T take(const Key &key)
{
- auto it = binary_find(key);
- if (it != end()) {
- T result = std::move(it.value());
- erase(it);
- return result;
- }
- return {};
+ return do_take(find(key));
+ }
+
+ template <class X, class Y = Compare, is_marked_transparent<Y> = nullptr>
+ T take(const X &key)
+ {
+ return do_take(find(key));
}
bool contains(const Key &key) const
{
- return binary_find(key) != end();
+ return find(key) != end();
+ }
+
+ template <class X, class Y = Compare, is_marked_transparent<Y> = nullptr>
+ bool contains(const X &key) const
+ {
+ return find(key) != end();
}
T value(const Key &key, const T &defaultValue) const
{
- auto it = binary_find(key);
+ auto it = find(key);
+ return it == end() ? defaultValue : it.value();
+ }
+
+ template <class X, class Y = Compare, is_marked_transparent<Y> = nullptr>
+ T value(const X &key, const T &defaultValue) const
+ {
+ auto it = find(key);
return it == end() ? defaultValue : it.value();
}
T value(const Key &key) const
{
- auto it = binary_find(key);
+ auto it = find(key);
+ return it == end() ? T() : it.value();
+ }
+
+ template <class X, class Y = Compare, is_marked_transparent<Y> = nullptr>
+ T value(const X &key) const
+ {
+ auto it = find(key);
return it == end() ? T() : it.value();
}
T &operator[](const Key &key)
{
- auto it = lower_bound(key);
- if (it == end() || key_compare::operator()(key, it.key())) {
- c.keys.insert(toKeysIterator(it), key);
- return *c.values.insert(toValuesIterator(it), T());
- }
- return it.value();
+ return try_emplace(key).first.value();
}
T &operator[](Key &&key)
{
- auto it = lower_bound(key);
- if (it == end() || key_compare::operator()(key, it.key())) {
- c.keys.insert(toKeysIterator(it), key);
- return *c.values.insert(toValuesIterator(it), T());
- }
- return it.value();
+ return try_emplace(std::move(key)).first.value();
}
T operator[](const Key &key) const
@@ -684,55 +674,71 @@ public:
return value(key);
}
+#ifdef QFLATMAP_ENABLE_STL_COMPATIBLE_INSERT
std::pair<iterator, bool> insert(const Key &key, const T &value)
{
- auto it = lower_bound(key);
- if (it == end() || key_compare::operator()(key, it.key())) {
- c.values.insert(toValuesIterator(it), value);
- auto k = c.keys.insert(toKeysIterator(it), key);
- return { fromKeysIterator(k), true };
- } else {
- it.value() = value;
- return {it, false};
- }
+ return try_emplace(key, value);
}
std::pair<iterator, bool> insert(Key &&key, const T &value)
{
- auto it = lower_bound(key);
- if (it == end() || key_compare::operator()(key, it.key())) {
- c.values.insert(toValuesIterator(it), value);
- return { c.keys.insert(it, std::move(key)), true };
- } else {
- *toValuesIterator(it) = value;
- return {it, false};
- }
+ return try_emplace(std::move(key), value);
}
std::pair<iterator, bool> insert(const Key &key, T &&value)
{
+ return try_emplace(key, std::move(value));
+ }
+
+ std::pair<iterator, bool> insert(Key &&key, T &&value)
+ {
+ return try_emplace(std::move(key), std::move(value));
+ }
+#endif
+
+ template <typename...Args>
+ std::pair<iterator, bool> try_emplace(const Key &key, Args&&...args)
+ {
auto it = lower_bound(key);
if (it == end() || key_compare::operator()(key, it.key())) {
- c.values.insert(toValuesIterator(it), std::move(value));
- return { c.keys.insert(it, key), true };
+ c.values.emplace(toValuesIterator(it), std::forward<Args>(args)...);
+ return { fromKeysIterator(c.keys.insert(toKeysIterator(it), key)), true };
} else {
- *toValuesIterator(it) = std::move(value);
return {it, false};
}
}
- std::pair<iterator, bool> insert(Key &&key, T &&value)
+ template <typename...Args>
+ std::pair<iterator, bool> try_emplace(Key &&key, Args&&...args)
{
auto it = lower_bound(key);
if (it == end() || key_compare::operator()(key, it.key())) {
- c.values.insert(toValuesIterator(it), std::move(value));
+ c.values.emplace(toValuesIterator(it), std::forward<Args>(args)...);
return { fromKeysIterator(c.keys.insert(toKeysIterator(it), std::move(key))), true };
} else {
- *toValuesIterator(it) = std::move(value);
return {it, false};
}
}
+ template <typename M>
+ std::pair<iterator, bool> insert_or_assign(const Key &key, M &&obj)
+ {
+ auto r = try_emplace(key, std::forward<M>(obj));
+ if (!r.second)
+ *toValuesIterator(r.first) = std::forward<M>(obj);
+ return r;
+ }
+
+ template <typename M>
+ std::pair<iterator, bool> insert_or_assign(Key &&key, M &&obj)
+ {
+ auto r = try_emplace(std::move(key), std::forward<M>(obj));
+ if (!r.second)
+ *toValuesIterator(r.first) = std::forward<M>(obj);
+ return r;
+ }
+
+#ifdef QFLATMAP_ENABLE_STL_COMPATIBLE_INSERT
template <class InputIt, is_compatible_iterator<InputIt> = nullptr>
void insert(InputIt first, InputIt last)
{
@@ -758,6 +764,7 @@ public:
{
insertOrderedUniqueRange(first, last);
}
+#endif
iterator begin() { return { &c, 0 }; }
const_iterator begin() const { return { &c, 0 }; }
@@ -784,14 +791,14 @@ public:
iterator lower_bound(const Key &key)
{
- auto cit = const_cast<const full_map_t *>(this)->lower_bound(key);
+ auto cit = std::as_const(*this).lower_bound(key);
return { &c, cit.i };
}
template <class X, class Y = Compare, is_marked_transparent<Y> = nullptr>
iterator lower_bound(const X &key)
{
- auto cit = const_cast<const full_map_t *>(this)->lower_bound(key);
+ auto cit = std::as_const(*this).lower_bound(key);
return { &c, cit.i };
}
@@ -806,14 +813,112 @@ public:
return fromKeysIterator(std::lower_bound(c.keys.begin(), c.keys.end(), key, key_comp()));
}
- iterator find(const key_type &k)
+ iterator find(const Key &key)
+ {
+ return { &c, std::as_const(*this).find(key).i };
+ }
+
+ template <class X, class Y = Compare, is_marked_transparent<Y> = nullptr>
+ iterator find(const X &key)
+ {
+ return { &c, std::as_const(*this).find(key).i };
+ }
+
+ const_iterator find(const Key &key) const
{
- return binary_find(k);
+ auto it = lower_bound(key);
+ if (it != end()) {
+ if (!key_compare::operator()(key, it.key()))
+ return it;
+ it = end();
+ }
+ return it;
}
- const_iterator find(const key_type &k) const
+ template <class X, class Y = Compare, is_marked_transparent<Y> = nullptr>
+ const_iterator find(const X &key) const
{
- return binary_find(k);
+ auto it = lower_bound(key);
+ if (it != end()) {
+ if (!key_compare::operator()(key, it.key()))
+ return it;
+ it = end();
+ }
+ return it;
+ }
+
+ template <typename Predicate>
+ size_type remove_if(Predicate pred)
+ {
+ const auto indirect_call_to_pred = [pred = std::move(pred)](iterator it) {
+ using Pair = decltype(*it);
+ using K = decltype(it.key());
+ using V = decltype(it.value());
+ using P = Predicate;
+ if constexpr (std::is_invocable_v<P, K, V>) {
+ return pred(it.key(), it.value());
+ } else if constexpr (std::is_invocable_v<P, Pair> && !std::is_invocable_v<P, K>) {
+ return pred(*it);
+ } else if constexpr (std::is_invocable_v<P, K> && !std::is_invocable_v<P, Pair>) {
+ return pred(it.key());
+ } else {
+ static_assert(QtPrivate::type_dependent_false<Predicate>(),
+ "Don't know how to call the predicate.\n"
+ "Options:\n"
+ "- pred(*it)\n"
+ "- pred(it.key(), it.value())\n"
+ "- pred(it.key())");
+ }
+ };
+
+ auto first = begin();
+ const auto last = end();
+
+ // find_if prefix loop
+ while (first != last && !indirect_call_to_pred(first))
+ ++first;
+
+ if (first == last)
+ return 0; // nothing to do
+
+ // we know that we need to remove *first
+
+ auto kdest = toKeysIterator(first);
+ auto vdest = toValuesIterator(first);
+
+ ++first;
+
+ auto k = std::next(kdest);
+ auto v = std::next(vdest);
+
+ // Main Loop
+ // - first is used only for indirect_call_to_pred
+ // - operations are done on k, v
+ // Loop invariants:
+ // - first, k, v are pointing to the same element
+ // - [begin(), first[, [c.keys.begin(), k[, [c.values.begin(), v[: already processed
+ // - [first, end()[, [k, c.keys.end()[, [v, c.values.end()[: still to be processed
+ // - [c.keys.begin(), kdest[ and [c.values.begin(), vdest[ are keepers
+ // - [kdest, k[, [vdest, v[ are considered removed
+ // - kdest is not c.keys.end()
+ // - vdest is not v.values.end()
+ while (first != last) {
+ if (!indirect_call_to_pred(first)) {
+ // keep *first, aka {*k, *v}
+ *kdest = std::move(*k);
+ *vdest = std::move(*v);
+ ++kdest;
+ ++vdest;
+ }
+ ++k;
+ ++v;
+ ++first;
+ }
+
+ const size_type r = std::distance(kdest, c.keys.end());
+ c.keys.erase(kdest, c.keys.end());
+ c.values.erase(vdest, c.values.end());
+ return r;
}
key_compare key_comp() const noexcept
@@ -827,6 +932,25 @@ public:
}
private:
+ bool do_remove(iterator it)
+ {
+ if (it != end()) {
+ erase(it);
+ return true;
+ }
+ return false;
+ }
+
+ T do_take(iterator it)
+ {
+ if (it != end()) {
+ T result = std::move(it.value());
+ erase(it);
+ return result;
+ }
+ return {};
+ }
+
template <class InputIt, is_compatible_iterator<InputIt> = nullptr>
void initWithRange(InputIt first, InputIt last)
{
@@ -874,7 +998,7 @@ private:
class IndexedKeyComparator
{
public:
- IndexedKeyComparator(const full_map_t *am)
+ IndexedKeyComparator(const QFlatMap *am)
: m(am)
{
}
@@ -885,7 +1009,7 @@ private:
}
private:
- const full_map_t *m;
+ const QFlatMap *m;
};
template <class InputIt>
@@ -906,22 +1030,6 @@ private:
makeUnique();
}
- iterator binary_find(const Key &key)
- {
- return { &c, const_cast<const full_map_t *>(this)->binary_find(key).i };
- }
-
- const_iterator binary_find(const Key &key) const
- {
- auto it = lower_bound(key);
- if (it != end()) {
- if (!key_compare::operator()(key, it.key()))
- return it;
- it = end();
- }
- return it;
- }
-
void ensureOrderedUnique()
{
std::vector<size_type> p(size_t(c.keys.size()));
@@ -953,31 +1061,49 @@ private:
void makeUnique()
{
- if (c.keys.size() < 2)
+ // std::unique, but over two ranges
+ auto equivalent = [this](const auto &lhs, const auto &rhs) {
+ return !key_compare::operator()(lhs, rhs) && !key_compare::operator()(rhs, lhs);
+ };
+ const auto kb = c.keys.begin();
+ const auto ke = c.keys.end();
+ auto k = std::adjacent_find(kb, ke, equivalent);
+ if (k == ke)
return;
- auto k = std::end(c.keys) - 1;
- auto i = k - 1;
- for (;;) {
- if (key_compare::operator()(*i, *k) || key_compare::operator()(*k, *i)) {
- if (i == std::begin(c.keys))
- break;
- --i;
- --k;
- } else {
- c.values.erase(std::begin(c.values) + std::distance(std::begin(c.keys), i));
- i = c.keys.erase(i);
- if (i == std::begin(c.keys))
- break;
- k = i + 1;
+
+ // equivalent keys found, we need to do actual work:
+ auto v = std::next(c.values.begin(), std::distance(kb, k));
+
+ auto kdest = k;
+ auto vdest = v;
+
+ ++k;
+ ++v;
+
+ // Loop Invariants:
+ //
+ // - [keys.begin(), kdest] and [values.begin(), vdest] are unique
+ // - k is not keys.end(), v is not values.end()
+ // - [next(k), keys.end()[ and [next(v), values.end()[ still need to be checked
+ while ((++v, ++k) != ke) {
+ if (!equivalent(*kdest, *k)) {
+ *++kdest = std::move(*k);
+ *++vdest = std::move(*v);
}
}
- c.keys.shrink_to_fit();
- c.values.shrink_to_fit();
+
+ c.keys.erase(std::next(kdest), ke);
+ c.values.erase(std::next(vdest), c.values.end());
}
containers c;
};
+template <class Key, class T,
+ qsizetype N = QVarLengthArrayDefaultPrealloc,
+ class Compare = std::less<Key>>
+using QVarLengthFlatMap = QFlatMap<Key, T, Compare, QVarLengthArray<Key, N>, QVarLengthArray<T, N>>;
+
QT_END_NAMESPACE
#endif // QFLATMAP_P_H
diff --git a/src/corelib/tools/qfreelist.cpp b/src/corelib/tools/qfreelist.cpp
index 38ad13a1ee..db15fac5d6 100644
--- a/src/corelib/tools/qfreelist.cpp
+++ b/src/corelib/tools/qfreelist.cpp
@@ -1,47 +1,12 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qfreelist_p.h"
QT_BEGIN_NAMESPACE
// default sizes and offsets (no need to define these when customizing)
+namespace QFreeListDefaultConstantsPrivate {
enum {
Offset0 = 0x00000000,
Offset1 = 0x00008000,
@@ -53,12 +18,13 @@ enum {
Size2 = Offset3 - Offset2,
Size3 = QFreeListDefaultConstants::MaxIndex - Offset3
};
+}
-const int QFreeListDefaultConstants::Sizes[QFreeListDefaultConstants::BlockCount] = {
- Size0,
- Size1,
- Size2,
- Size3
+Q_CONSTINIT const int QFreeListDefaultConstants::Sizes[QFreeListDefaultConstants::BlockCount] = {
+ QFreeListDefaultConstantsPrivate::Size0,
+ QFreeListDefaultConstantsPrivate::Size1,
+ QFreeListDefaultConstantsPrivate::Size2,
+ QFreeListDefaultConstantsPrivate::Size3
};
QT_END_NAMESPACE
diff --git a/src/corelib/tools/qfreelist_p.h b/src/corelib/tools/qfreelist_p.h
index f54e5aad65..6bbde5b4b6 100644
--- a/src/corelib/tools/qfreelist_p.h
+++ b/src/corelib/tools/qfreelist_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QFREELIST_P_H
#define QFREELIST_P_H
@@ -160,8 +124,7 @@ class QFreeList
return i;
x -= size;
}
- Q_ASSERT(false);
- return -1;
+ Q_UNREACHABLE_RETURN(-1);
}
// allocate a block of the given \a size, initialized starting with the given \a offset
diff --git a/src/corelib/tools/qfunctionaltools_impl.cpp b/src/corelib/tools/qfunctionaltools_impl.cpp
new file mode 100644
index 0000000000..28148c39a2
--- /dev/null
+++ b/src/corelib/tools/qfunctionaltools_impl.cpp
@@ -0,0 +1,47 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#include <QtCore/qfunctionaltools_impl.h>
+
+// Remove this file once we have tests that implicitly test all aspects of
+// CompactStorage
+
+QT_BEGIN_NAMESPACE
+
+namespace QtPrivate {
+
+#define FOR_EACH_CVREF(op) \
+ op(&) \
+ op(const &) \
+ op(&&) \
+ op(const &&) \
+ /* end */
+
+namespace _testing {
+ struct empty {};
+ struct final final {};
+ static_assert(std::is_same_v<CompactStorage<empty>,
+ detail::StorageEmptyBaseClassOptimization<empty>>);
+ static_assert(std::is_same_v<CompactStorage<final>,
+ detail::StorageByValue<final>>);
+ static_assert(std::is_same_v<CompactStorage<int>,
+ detail::StorageByValue<int>>);
+#define CHECK1(Obj, cvref) \
+ static_assert(std::is_same_v<decltype(std::declval<CompactStorage< Obj > cvref>().object()), \
+ Obj cvref>);
+#define CHECK(cvref) \
+ CHECK1(empty, cvref) \
+ CHECK1(final, cvref) \
+ CHECK1(int, cvref) \
+ /* end */
+
+ FOR_EACH_CVREF(CHECK)
+#undef CHECK
+#undef CHECK1
+} // namespace _testing
+
+} // namespace QtPrivate
+
+#undef FOR_EACH_CVREF
+
+QT_END_NAMESPACE
diff --git a/src/corelib/tools/qfunctionaltools_impl.h b/src/corelib/tools/qfunctionaltools_impl.h
new file mode 100644
index 0000000000..0942d5fe7d
--- /dev/null
+++ b/src/corelib/tools/qfunctionaltools_impl.h
@@ -0,0 +1,77 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#if 0
+#pragma qt_sync_skip_header_check
+#pragma qt_sync_stop_processing
+#endif
+
+#ifndef QFUNCTIONALTOOLS_IMPL_H
+#define QFUNCTIONALTOOLS_IMPL_H
+
+#include <QtCore/qtconfigmacros.h>
+
+#include <type_traits>
+#include <utility>
+
+QT_BEGIN_NAMESPACE
+
+namespace QtPrivate {
+
+namespace detail {
+
+#define FOR_EACH_CVREF(op) \
+ op(&) \
+ op(const &) \
+ op(&&) \
+ op(const &&) \
+ /* end */
+
+
+template <typename Object, typename = void>
+struct StorageByValue
+{
+ Object o;
+#define MAKE_GETTER(cvref) \
+ constexpr Object cvref object() cvref noexcept \
+ { return static_cast<Object cvref>(o); }
+ FOR_EACH_CVREF(MAKE_GETTER)
+#undef MAKE_GETTER
+};
+
+template <typename Object, typename Tag = void>
+struct StorageEmptyBaseClassOptimization : Object
+{
+ StorageEmptyBaseClassOptimization() = default;
+ StorageEmptyBaseClassOptimization(Object &&o)
+ : Object(std::move(o))
+ {}
+ StorageEmptyBaseClassOptimization(const Object &o)
+ : Object(o)
+ {}
+
+#define MAKE_GETTER(cvref) \
+ constexpr Object cvref object() cvref noexcept \
+ { return static_cast<Object cvref>(*this); }
+ FOR_EACH_CVREF(MAKE_GETTER)
+#undef MAKE_GETTER
+};
+} // namespace detail
+
+template <typename Object, typename Tag = void>
+using CompactStorage = typename std::conditional_t<
+ std::conjunction_v<
+ std::is_empty<Object>,
+ std::negation<std::is_final<Object>>
+ >,
+ detail::StorageEmptyBaseClassOptimization<Object, Tag>,
+ detail::StorageByValue<Object, Tag>
+ >;
+
+} // namespace QtPrivate
+
+#undef FOR_EACH_CVREF
+
+QT_END_NAMESPACE
+
+#endif // QFUNCTIONALTOOLS_IMPL_H
diff --git a/src/corelib/tools/qhash.cpp b/src/corelib/tools/qhash.cpp
index bc8c9490d9..12e90daecf 100644
--- a/src/corelib/tools/qhash.cpp
+++ b/src/corelib/tools/qhash.cpp
@@ -1,43 +1,7 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Copyright (C) 2021 Intel Corporation.
-** Copyright (C) 2012 Giuseppe D'Angelo <dangelog@gmail.com>.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// Copyright (C) 2021 Intel Corporation.
+// Copyright (C) 2012 Giuseppe D'Angelo <dangelog@gmail.com>.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
// for rand_s, _CRT_RAND_S must be #defined before #including stdlib.h.
// put it at the beginning so some indirect inclusion doesn't break it
@@ -66,11 +30,17 @@
#ifndef QT_BOOTSTRAPPED
#include <qcoreapplication.h>
#include <qrandom.h>
+#include <private/qlocale_tools_p.h>
#endif // QT_BOOTSTRAPPED
#include <array>
#include <limits.h>
+#if defined(QT_NO_DEBUG) && !defined(NDEBUG)
+# define NDEBUG
+#endif
+#include <assert.h>
+
#ifdef Q_CC_GNU
# define Q_DECL_HOT_FUNCTION __attribute__((hot))
#else
@@ -79,6 +49,8 @@
QT_BEGIN_NAMESPACE
+void qt_from_latin1(char16_t *dst, const char *str, size_t size) noexcept; // qstring.cpp
+
// We assume that pointers and size_t have the same size. If that assumption should fail
// on a platform the code selecting the different methods below needs to be fixed.
static_assert(sizeof(size_t) == QT_POINTER_SIZE, "size_t and pointers have different size.");
@@ -89,7 +61,11 @@ struct HashSeedStorage
static constexpr int SeedCount = 2;
QBasicAtomicInteger<quintptr> seeds[SeedCount] = { Q_BASIC_ATOMIC_INITIALIZER(0), Q_BASIC_ATOMIC_INITIALIZER(0) };
+#if !QT_SUPPORTS_INIT_PRIORITY || defined(QT_BOOTSTRAPPED)
constexpr HashSeedStorage() = default;
+#else
+ HashSeedStorage() { initialize(0); }
+#endif
enum State {
OverriddenByEnvironment = -1,
@@ -109,6 +85,7 @@ struct HashSeedStorage
void resetSeed()
{
+#ifndef QT_BOOTSTRAPPED
if (state().state < AlreadyInitialized)
return;
@@ -116,6 +93,7 @@ struct HashSeedStorage
QRandomGenerator *generator = QRandomGenerator::system();
seeds[0].storeRelaxed(sizeof(size_t) > sizeof(quint32)
? generator->generate64() : generator->generate());
+#endif
}
void clearSeed()
@@ -126,28 +104,29 @@ struct HashSeedStorage
private:
Q_DECL_COLD_FUNCTION Q_NEVER_INLINE StateResult initialize(int which) noexcept;
- [[maybe_unused]] static void ensureConstexprConstructibility()
- {
- static_assert(std::is_trivially_destructible_v<HashSeedStorage>);
- static constexpr HashSeedStorage dummy {};
- Q_UNUSED(dummy);
- }
};
[[maybe_unused]] HashSeedStorage::StateResult HashSeedStorage::initialize(int which) noexcept
{
StateResult result = { 0, OverriddenByEnvironment };
- bool ok;
- int seed = qEnvironmentVariableIntValue("QT_HASH_SEED", &ok);
- if (ok) {
- if (seed) {
- // can't use qWarning here (reentrancy)
- fprintf(stderr, "QT_HASH_SEED: forced seed value is not 0; ignored.\n");
+#ifdef QT_BOOTSTRAPPED
+ Q_UNUSED(which);
+ Q_UNREACHABLE_RETURN(result);
+#else
+ // can't use qEnvironmentVariableIntValue (reentrancy)
+ const char *seedstr = getenv("QT_HASH_SEED");
+ if (seedstr) {
+ auto r = qstrntoll(seedstr, strlen(seedstr), 10);
+ if (r.used > 0 && size_t(r.used) == strlen(seedstr)) {
+ if (r.result) {
+ // can't use qWarning here (reentrancy)
+ fprintf(stderr, "QT_HASH_SEED: forced seed value is not 0; ignored.\n");
+ }
+
+ // we don't have to store to the seed, since it's pre-initialized by
+ // the compiler to zero
+ return result;
}
-
- // we don't have to store to the seed, since it's pre-initialized by
- // the compiler to zero
- return result;
}
// update the full seed
@@ -159,6 +138,7 @@ private:
}
result.state = JustInitialized;
return result;
+#endif
}
inline HashSeedStorage::StateResult HashSeedStorage::state(int which)
@@ -166,14 +146,15 @@ inline HashSeedStorage::StateResult HashSeedStorage::state(int which)
constexpr quintptr BadSeed = quintptr(Q_UINT64_C(0x5555'5555'5555'5555));
StateResult result = { BadSeed, AlreadyInitialized };
-#ifndef QT_BOOTSTRAPPED
+#if defined(QT_BOOTSTRAPPED)
+ result = { 0, OverriddenByEnvironment };
+#elif !QT_SUPPORTS_INIT_PRIORITY
+ // dynamic initialization
static auto once = [&]() {
result = initialize(which);
return true;
}();
Q_UNUSED(once);
-#else
- result = { 0, OverriddenByEnvironment };
#endif
if (result.state == AlreadyInitialized && which >= 0)
@@ -185,6 +166,11 @@ inline HashSeedStorage::StateResult HashSeedStorage::state(int which)
/*
The QHash seed itself.
*/
+#ifdef Q_DECL_INIT_PRIORITY
+Q_DECL_INIT_PRIORITY(05)
+#else
+Q_CONSTINIT
+#endif
static HashSeedStorage qt_qhash_seed;
/*
@@ -192,7 +178,7 @@ static HashSeedStorage qt_qhash_seed;
* Austin Appleby. See http://murmurhash.googlepages.com/
*/
#if QT_POINTER_SIZE == 4
-
+Q_NEVER_INLINE Q_DECL_HOT_FUNCTION
static inline uint murmurhash(const void *key, uint len, uint seed) noexcept
{
// 'm' and 'r' are mixing constants generated offline.
@@ -250,7 +236,7 @@ static inline uint murmurhash(const void *key, uint len, uint seed) noexcept
}
#else
-
+Q_NEVER_INLINE Q_DECL_HOT_FUNCTION
static inline uint64_t murmurhash(const void *key, uint64_t len, uint64_t seed) noexcept
{
const uint64_t m = 0xc6a4a7935bd1e995ULL;
@@ -299,17 +285,11 @@ static inline uint64_t murmurhash(const void *key, uint64_t len, uint64_t seed)
#endif
-#if QT_POINTER_SIZE == 8
+namespace {
// This is an inlined version of the SipHash implementation that is
// trying to avoid some memcpy's from uint64 to uint8[] and back.
-//
-// Use SipHash-1-2, which has similar performance characteristics as
-// stablehash() above, instead of the SipHash-2-4 default
-#define cROUNDS 1
-#define dROUNDS 2
-
-#define ROTL(x, b) (uint64_t)(((x) << (b)) | ((x) >> (64 - (b))))
+#define ROTL(x, b) (((x) << (b)) | ((x) >> (sizeof(x) * 8 - (b))))
#define SIPROUND \
do { \
@@ -329,8 +309,7 @@ static inline uint64_t murmurhash(const void *key, uint64_t len, uint64_t seed)
v2 = ROTL(v2, 32); \
} while (0)
-
-static uint64_t siphash(const uint8_t *in, uint64_t inlen, uint64_t seed, uint64_t seed2)
+template <int cROUNDS = 2, int dROUNDS = 4> struct SipHash64
{
/* "somepseudorandomlygeneratedbytes" */
uint64_t v0 = 0x736f6d6570736575ULL;
@@ -338,17 +317,32 @@ static uint64_t siphash(const uint8_t *in, uint64_t inlen, uint64_t seed, uint64
uint64_t v2 = 0x6c7967656e657261ULL;
uint64_t v3 = 0x7465646279746573ULL;
uint64_t b;
- uint64_t k0 = seed;
- uint64_t k1 = seed2;
- int i;
- const uint8_t *end = in + (inlen & ~7ULL);
- const int left = inlen & 7;
+ uint64_t k0;
+ uint64_t k1;
+
+ inline SipHash64(uint64_t fulllen, uint64_t seed, uint64_t seed2);
+ inline void addBlock(const uint8_t *in, size_t inlen);
+ inline uint64_t finalize(const uint8_t *in, size_t left);
+};
+
+template <int cROUNDS, int dROUNDS>
+SipHash64<cROUNDS, dROUNDS>::SipHash64(uint64_t inlen, uint64_t seed, uint64_t seed2)
+{
b = inlen << 56;
+ k0 = seed;
+ k1 = seed2;
v3 ^= k1;
v2 ^= k0;
v1 ^= k1;
v0 ^= k0;
+}
+template <int cROUNDS, int dROUNDS> Q_DECL_HOT_FUNCTION void
+SipHash64<cROUNDS, dROUNDS>::addBlock(const uint8_t *in, size_t inlen)
+{
+ Q_ASSERT((inlen & 7ULL) == 0);
+ int i;
+ const uint8_t *end = in + inlen;
for (; in != end; in += 8) {
uint64_t m = qFromUnaligned<uint64_t>(in);
v3 ^= m;
@@ -358,24 +352,31 @@ static uint64_t siphash(const uint8_t *in, uint64_t inlen, uint64_t seed, uint64
v0 ^= m;
}
+}
-
-#if defined(Q_CC_GNU) && Q_CC_GNU >= 700
- QT_WARNING_DISABLE_GCC("-Wimplicit-fallthrough")
-#endif
+template <int cROUNDS, int dROUNDS> Q_DECL_HOT_FUNCTION uint64_t
+SipHash64<cROUNDS, dROUNDS>::finalize(const uint8_t *in, size_t left)
+{
+ int i;
switch (left) {
case 7:
b |= ((uint64_t)in[6]) << 48;
+ Q_FALLTHROUGH();
case 6:
b |= ((uint64_t)in[5]) << 40;
+ Q_FALLTHROUGH();
case 5:
b |= ((uint64_t)in[4]) << 32;
+ Q_FALLTHROUGH();
case 4:
b |= ((uint64_t)in[3]) << 24;
+ Q_FALLTHROUGH();
case 3:
b |= ((uint64_t)in[2]) << 16;
+ Q_FALLTHROUGH();
case 2:
b |= ((uint64_t)in[1]) << 8;
+ Q_FALLTHROUGH();
case 1:
b |= ((uint64_t)in[0]);
break;
@@ -398,7 +399,8 @@ static uint64_t siphash(const uint8_t *in, uint64_t inlen, uint64_t seed, uint64
b = v0 ^ v1 ^ v2 ^ v3;
return b;
}
-#else
+#undef SIPROUND
+
// This is a "SipHash" implementation adopted for 32bit platforms. It performs
// basically the same operations as the 64bit version using 4 byte at a time
// instead of 8.
@@ -409,12 +411,6 @@ static uint64_t siphash(const uint8_t *in, uint64_t inlen, uint64_t seed, uint64
//
// For the v0-v4 constants, simply use the first four bytes of the 64 bit versions.
//
-// Use SipHash-1-2, which has similar performance characteristics as
-// stablehash() above, instead of the SipHash-2-4 default
-#define cROUNDS 1
-#define dROUNDS 2
-
-#define ROTL(x, b) (uint32_t)(((x) << (b)) | ((x) >> (32 - (b))))
#define SIPROUND \
do { \
@@ -434,8 +430,7 @@ static uint64_t siphash(const uint8_t *in, uint64_t inlen, uint64_t seed, uint64
v2 = ROTL(v2, 16); \
} while (0)
-
-static uint siphash(const uint8_t *in, uint inlen, uint seed, uint seed2)
+template <int cROUNDS = 2, int dROUNDS = 4> struct SipHash32
{
/* "somepseudorandomlygeneratedbytes" */
uint v0 = 0x736f6d65U;
@@ -443,17 +438,32 @@ static uint siphash(const uint8_t *in, uint inlen, uint seed, uint seed2)
uint v2 = 0x6c796765U;
uint v3 = 0x74656462U;
uint b;
+ uint k0;
+ uint k1;
+
+ inline SipHash32(size_t fulllen, uint seed, uint seed2);
+ inline void addBlock(const uint8_t *in, size_t inlen);
+ inline uint finalize(const uint8_t *in, size_t left);
+};
+
+template <int cROUNDS, int dROUNDS> inline
+SipHash32<cROUNDS, dROUNDS>::SipHash32(size_t inlen, uint seed, uint seed2)
+{
uint k0 = seed;
uint k1 = seed2;
- int i;
- const uint8_t *end = in + (inlen & ~3ULL);
- const int left = inlen & 3;
b = inlen << 24;
v3 ^= k1;
v2 ^= k0;
v1 ^= k1;
v0 ^= k0;
+}
+template <int cROUNDS, int dROUNDS> inline Q_DECL_HOT_FUNCTION void
+SipHash32<cROUNDS, dROUNDS>::addBlock(const uint8_t *in, size_t inlen)
+{
+ Q_ASSERT((inlen & 3ULL) == 0);
+ int i;
+ const uint8_t *end = in + inlen;
for (; in != end; in += 4) {
uint m = qFromUnaligned<uint>(in);
v3 ^= m;
@@ -463,15 +473,19 @@ static uint siphash(const uint8_t *in, uint inlen, uint seed, uint seed2)
v0 ^= m;
}
+}
-#if defined(Q_CC_GNU) && Q_CC_GNU >= 700
- QT_WARNING_DISABLE_GCC("-Wimplicit-fallthrough")
-#endif
+template <int cROUNDS, int dROUNDS> inline Q_DECL_HOT_FUNCTION uint
+SipHash32<cROUNDS, dROUNDS>::finalize(const uint8_t *in, size_t left)
+{
+ int i;
switch (left) {
case 3:
b |= ((uint)in[2]) << 16;
+ Q_FALLTHROUGH();
case 2:
b |= ((uint)in[1]) << 8;
+ Q_FALLTHROUGH();
case 1:
b |= ((uint)in[0]);
break;
@@ -494,7 +508,70 @@ static uint siphash(const uint8_t *in, uint inlen, uint seed, uint seed2)
b = v0 ^ v1 ^ v2 ^ v3;
return b;
}
-#endif
+#undef SIPROUND
+#undef ROTL
+
+// Use SipHash-1-2, which has similar performance characteristics as
+// stablehash() above, instead of the SipHash-2-4 default
+template <int cROUNDS = 1, int dROUNDS = 2>
+using SipHash = std::conditional_t<sizeof(void *) == 8,
+ SipHash64<cROUNDS, dROUNDS>, SipHash32<cROUNDS, dROUNDS>>;
+} // unnamed namespace
+
+Q_NEVER_INLINE Q_DECL_HOT_FUNCTION
+static size_t siphash(const uint8_t *in, size_t inlen, size_t seed, size_t seed2)
+{
+ constexpr size_t TailSizeMask = sizeof(void *) - 1;
+ SipHash<> hasher(inlen, seed, seed2);
+ hasher.addBlock(in, inlen & ~TailSizeMask);
+ return hasher.finalize(in + (inlen & ~TailSizeMask), inlen & TailSizeMask);
+}
+
+enum ZeroExtension {
+ None = 0,
+ ByteToWord = 1,
+};
+
+template <ZeroExtension = None> static size_t
+qHashBits_fallback(const uchar *p, size_t size, size_t seed, size_t seed2) noexcept;
+template <> size_t qHashBits_fallback<None>(const uchar *p, size_t size, size_t seed, size_t seed2) noexcept
+{
+ if (size <= QT_POINTER_SIZE)
+ return murmurhash(p, size, seed);
+
+ return siphash(reinterpret_cast<const uchar *>(p), size, seed, seed2);
+}
+
+template <> size_t qHashBits_fallback<ByteToWord>(const uchar *data, size_t size, size_t seed, size_t seed2) noexcept
+{
+ auto quick_from_latin1 = [](char16_t *dest, const uchar *data, size_t size) {
+ // Quick, "inlined" version for very short blocks
+ std::copy_n(data, size, dest);
+ };
+ if (size <= QT_POINTER_SIZE / 2) {
+ std::array<char16_t, QT_POINTER_SIZE / 2> buf;
+ quick_from_latin1(buf.data(), data, size);
+ return murmurhash(buf.data(), size * 2, seed);
+ }
+
+ constexpr size_t TailSizeMask = sizeof(void *) / 2 - 1;
+ std::array<char16_t, 256> buf;
+ SipHash<> siphash(size * 2, seed, seed2);
+ ptrdiff_t offset = 0;
+ for ( ; offset + buf.size() < size; offset += buf.size()) {
+ qt_from_latin1(buf.data(), reinterpret_cast<const char *>(data) + offset, buf.size());
+ siphash.addBlock(reinterpret_cast<uint8_t *>(buf.data()), sizeof(buf));
+ }
+ if (size_t n = size - offset; n > TailSizeMask) {
+ n &= ~TailSizeMask;
+ qt_from_latin1(buf.data(), reinterpret_cast<const char *>(data) + offset, n);
+ siphash.addBlock(reinterpret_cast<uint8_t *>(buf.data()), n * 2);
+ offset += n;
+ }
+
+ quick_from_latin1(buf.data(), data + offset, size - offset);
+ return siphash.finalize(reinterpret_cast<uint8_t *>(buf.data()), (size - offset) * 2);
+}
#if defined(__SANITIZE_ADDRESS__) || defined(__SANITIZE_THREAD__) // GCC
# define QHASH_AES_SANITIZER_BUILD
@@ -510,27 +587,30 @@ static uint siphash(const uint8_t *in, uint inlen, uint seed, uint seed2)
#if QT_COMPILER_SUPPORTS_HERE(AES) && QT_COMPILER_SUPPORTS_HERE(SSE4_2) && \
!defined(QHASH_AES_SANITIZER_BUILD)
# define AESHASH
+# define QT_FUNCTION_TARGET_STRING_AES_AVX2 "avx2,aes"
+# define QT_FUNCTION_TARGET_STRING_AES_AVX512 \
+ QT_FUNCTION_TARGET_STRING_ARCH_SKYLAKE_AVX512 "," \
+ QT_FUNCTION_TARGET_STRING_AES
+# define QT_FUNCTION_TARGET_STRING_VAES_AVX512 \
+ QT_FUNCTION_TARGET_STRING_ARCH_SKYLAKE_AVX512 "," \
+ QT_FUNCTION_TARGET_STRING_VAES
+# undef QHASH_AES_SANITIZER_BUILD
+# if QT_POINTER_SIZE == 8
+# define mm_set1_epz _mm_set1_epi64x
+# define mm_cvtsz_si128 _mm_cvtsi64_si128
+# define mm_cvtsi128_sz _mm_cvtsi128_si64
+# define mm256_set1_epz _mm256_set1_epi64x
+# else
+# define mm_set1_epz _mm_set1_epi32
+# define mm_cvtsz_si128 _mm_cvtsi32_si128
+# define mm_cvtsi128_sz _mm_cvtsi128_si32
+# define mm256_set1_epz _mm256_set1_epi32
+# endif
-#undef QHASH_AES_SANITIZER_BUILD
-
-QT_FUNCTION_TARGET(AES)
-static size_t aeshash(const uchar *p, size_t len, size_t seed, size_t seed2) noexcept
-{
- __m128i key;
- if (sizeof(size_t) == 8) {
-#ifdef Q_PROCESSOR_X86_64
- __m128i mseed = _mm_cvtsi64_si128(seed);
- key = _mm_insert_epi64(mseed, seed2, 1);
-#endif
- } else {
- __m128i mseed = _mm_cvtsi32_si128(int(seed));
- key = _mm_insert_epi32(mseed, int(seed2), 1);
- key = _mm_unpacklo_epi64(key, key);
- }
-
+namespace {
// This is inspired by the algorithm in the Go language. See:
- // https://github.com/golang/go/blob/894abb5f680c040777f17f9f8ee5a5ab3a03cb94/src/runtime/asm_386.s#L902
- // https://github.com/golang/go/blob/894abb5f680c040777f17f9f8ee5a5ab3a03cb94/src/runtime/asm_amd64.s#L903
+ // https://github.com/golang/go/blob/01b6cf09fc9f272d9db3d30b4c93982f4911d120/src/runtime/asm_amd64.s#L1105
+ // https://github.com/golang/go/blob/01b6cf09fc9f272d9db3d30b4c93982f4911d120/src/runtime/asm_386.s#L908
//
// Even though we're using the AESENC instruction from the CPU, this code
// is not encryption and this routine makes no claim to be
@@ -538,101 +618,341 @@ static size_t aeshash(const uchar *p, size_t len, size_t seed, size_t seed2) noe
// the scrambling round (step 3 in [1]) because it's just very good at
// spreading the bits around.
//
+ // Note on Latin-1 hashing (ZX == ByteToWord): for simplicity of the
+ // algorithm, we pass sizes equivalent to the UTF-16 content (ZX == None).
+ // That means we must multiply by 2 on entry, divide by 2 on pointer
+ // advancing, and load half as much data from memory (though we produce
+ // exactly as much data in registers). The compilers appear to optimize
+ // this out.
+ //
// [1] https://en.wikipedia.org/wiki/Advanced_Encryption_Standard#High-level_description_of_the_algorithm
+ template <ZeroExtension ZX, typename T> static const T *advance(const T *ptr, ptrdiff_t n)
+ {
+ if constexpr (ZX == None)
+ return ptr + n;
+
+ // see note above on ZX == ByteToWord hashing
+ auto p = reinterpret_cast<const uchar *>(ptr);
+ n *= sizeof(T);
+ return reinterpret_cast<const T *>(p + n/2);
+ }
+
+ template <ZeroExtension> static __m128i loadu128(const void *ptr);
+ template <> Q_ALWAYS_INLINE QT_FUNCTION_TARGET(AES) __m128i loadu128<None>(const void *ptr)
+ {
+ return _mm_loadu_si128(reinterpret_cast<const __m128i *>(ptr));
+ }
+ template <> Q_ALWAYS_INLINE QT_FUNCTION_TARGET(AES) __m128i loadu128<ByteToWord>(const void *ptr)
+ {
+ // use a MOVQ followed by PMOVZXBW
+ // the compiler usually combines them as a single, loading PMOVZXBW
+ __m128i data = _mm_loadl_epi64(static_cast<const __m128i *>(ptr));
+ return _mm_cvtepu8_epi16(data);
+ }
+
// hash 16 bytes, running 3 scramble rounds of AES on itself (like label "final1")
- const auto hash16bytes = [](__m128i &state0, __m128i data) QT_FUNCTION_TARGET(AES) {
+ static void Q_ALWAYS_INLINE QT_FUNCTION_TARGET(AES) QT_VECTORCALL
+ hash16bytes(__m128i &state0, __m128i data)
+ {
state0 = _mm_xor_si128(state0, data);
state0 = _mm_aesenc_si128(state0, state0);
state0 = _mm_aesenc_si128(state0, state0);
state0 = _mm_aesenc_si128(state0, state0);
+ }
+
+ // hash twice 16 bytes, running 2 scramble rounds of AES on itself
+ template <ZeroExtension ZX>
+ static void QT_FUNCTION_TARGET(AES) QT_VECTORCALL
+ hash2x16bytes(__m128i &state0, __m128i &state1, const __m128i *src0, const __m128i *src1)
+ {
+ __m128i data0 = loadu128<ZX>(src0);
+ __m128i data1 = loadu128<ZX>(src1);
+ state0 = _mm_xor_si128(data0, state0);
+ state1 = _mm_xor_si128(data1, state1);
+ state0 = _mm_aesenc_si128(state0, state0);
+ state1 = _mm_aesenc_si128(state1, state1);
+ state0 = _mm_aesenc_si128(state0, state0);
+ state1 = _mm_aesenc_si128(state1, state1);
+ }
+
+ struct AESHashSeed
+ {
+ __m128i state0;
+ __m128i mseed2;
+ AESHashSeed(size_t seed, size_t seed2) QT_FUNCTION_TARGET(AES);
+ __m128i state1() const QT_FUNCTION_TARGET(AES);
+ __m256i state0_256() const QT_FUNCTION_TARGET(AES_AVX2)
+ { return _mm256_set_m128i(state1(), state0); }
};
+} // unnamed namespace
- __m128i state0 = key;
- auto src = reinterpret_cast<const __m128i *>(p);
+Q_ALWAYS_INLINE AESHashSeed::AESHashSeed(size_t seed, size_t seed2)
+{
+ __m128i mseed = mm_cvtsz_si128(seed);
+ mseed2 = mm_set1_epz(seed2);
- if (len < 16)
- goto lt16;
- if (len < 32)
- goto lt32;
+ // mseed (epi16) = [ seed, seed >> 16, seed >> 32, seed >> 48, len, 0, 0, 0 ]
+ mseed = _mm_insert_epi16(mseed, short(seed), 4);
+ // mseed (epi16) = [ seed, seed >> 16, seed >> 32, seed >> 48, len, len, len, len ]
+ mseed = _mm_shufflehi_epi16(mseed, 0);
- // rounds of 32 bytes
+ // merge with the process-global seed
+ __m128i key = _mm_xor_si128(mseed, mseed2);
+
+ // scramble the key
+ __m128i state0 = _mm_aesenc_si128(key, key);
+ this->state0 = state0;
+}
+
+Q_ALWAYS_INLINE __m128i AESHashSeed::state1() const
+{
{
- // Make state1 = ~state0:
- __m128i one = _mm_cmpeq_epi64(key, key);
- __m128i state1 = _mm_xor_si128(state0, one);
+ // unlike the Go code, we don't have more per-process seed
+ __m128i state1 = _mm_aesenc_si128(state0, mseed2);
+ return state1;
+ }
+}
- // do simplified rounds of 32 bytes: unlike the Go code, we only
- // scramble twice and we keep 256 bits of state
- const auto srcend = src + (len / 32);
- while (src < srcend) {
- __m128i data0 = _mm_loadu_si128(src);
- __m128i data1 = _mm_loadu_si128(src + 1);
- state0 = _mm_xor_si128(data0, state0);
- state1 = _mm_xor_si128(data1, state1);
- state0 = _mm_aesenc_si128(state0, state0);
- state1 = _mm_aesenc_si128(state1, state1);
- state0 = _mm_aesenc_si128(state0, state0);
- state1 = _mm_aesenc_si128(state1, state1);
- src += 2;
+template <ZeroExtension ZX>
+static size_t QT_FUNCTION_TARGET(AES) QT_VECTORCALL
+aeshash128_16to32(__m128i state0, __m128i state1, const __m128i *src, const __m128i *srcend)
+{
+ {
+ const __m128i *src2 = advance<ZX>(srcend, -1);
+ if (advance<ZX>(src, 1) < srcend) {
+ // epilogue: between 16 and 31 bytes
+ hash2x16bytes<ZX>(state0, state1, src, src2);
+ } else if (src != srcend) {
+ // epilogue: between 1 and 16 bytes, overlap with the end
+ __m128i data = loadu128<ZX>(src2);
+ hash16bytes(state0, data);
}
+
+ // combine results:
state0 = _mm_xor_si128(state0, state1);
}
- len &= 0x1f;
- // do we still have 16 or more bytes?
- if (len & 0x10) {
-lt32:
- __m128i data = _mm_loadu_si128(src);
- hash16bytes(state0, data);
- ++src;
- }
- len &= 0xf;
+ return mm_cvtsi128_sz(state0);
+}
-lt16:
+// load all 16 bytes and mask off the bytes past the end of the source
+static const qint8 maskarray[] = {
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+// load 16 bytes ending at the data end, then shuffle them to the beginning
+static const qint8 shufflecontrol[] = {
+ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+};
+
+template <ZeroExtension ZX>
+static size_t QT_FUNCTION_TARGET(AES) QT_VECTORCALL
+aeshash128_lt16(__m128i state0, const __m128i *src, const __m128i *srcend, size_t len)
+{
if (len) {
- // load the last chunk of data
// We're going to load 16 bytes and mask zero the part we don't care
// (the hash of a short string is different from the hash of a longer
// including NULLs at the end because the length is in the key)
// WARNING: this may produce valgrind warnings, but it's safe
+ constexpr quintptr CachelineSize = 64;
__m128i data;
- if (Q_LIKELY(quintptr(src + 1) & 0xff0)) {
- // same page, we definitely can't fault:
- // load all 16 bytes and mask off the bytes past the end of the source
- static const qint8 maskarray[] = {
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- };
+ if ((quintptr(src) & (CachelineSize / 2)) == 0) {
+ // lower half of the cacheline:
__m128i mask = _mm_loadu_si128(reinterpret_cast<const __m128i *>(maskarray + 15 - len));
- data = _mm_loadu_si128(src);
+ data = loadu128<ZX>(src);
data = _mm_and_si128(data, mask);
} else {
- // too close to the end of the page, it could fault:
- // load 16 bytes ending at the data end, then shuffle them to the beginning
- static const qint8 shufflecontrol[] = {
- 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
- };
+ // upper half of the cacheline:
__m128i control = _mm_loadu_si128(reinterpret_cast<const __m128i *>(shufflecontrol + 15 - len));
- p = reinterpret_cast<const uchar *>(src - 1);
- data = _mm_loadu_si128(reinterpret_cast<const __m128i *>(p + len));
+ data = loadu128<ZX>(advance<ZX>(srcend, -1));
data = _mm_shuffle_epi8(data, control);
}
hash16bytes(state0, data);
}
+ return mm_cvtsi128_sz(state0);
+}
- // extract state0
-# if QT_POINTER_SIZE == 8
- return _mm_cvtsi128_si64(state0);
-# else
- return _mm_cvtsi128_si32(state0);
+template <ZeroExtension ZX>
+static size_t QT_FUNCTION_TARGET(AES) QT_VECTORCALL
+aeshash128_ge32(__m128i state0, __m128i state1, const __m128i *src, const __m128i *srcend)
+{
+ // main loop: scramble two 16-byte blocks
+ for ( ; advance<ZX>(src, 2) < srcend; src = advance<ZX>(src, 2))
+ hash2x16bytes<ZX>(state0, state1, src, advance<ZX>(src, 1));
+
+ return aeshash128_16to32<ZX>(state0, state1, src, srcend);
+}
+
+# if QT_COMPILER_SUPPORTS_HERE(VAES)
+template <ZeroExtension> static __m256i loadu256(const void *ptr);
+template <> Q_ALWAYS_INLINE QT_FUNCTION_TARGET(VAES) __m256i loadu256<None>(const void *ptr)
+{
+ return _mm256_loadu_si256(reinterpret_cast<const __m256i *>(ptr));
+}
+template <> Q_ALWAYS_INLINE QT_FUNCTION_TARGET(VAES) __m256i loadu256<ByteToWord>(const void *ptr)
+{
+ // VPMOVZXBW xmm, ymm
+ __m128i data = _mm_loadu_si128(reinterpret_cast<const __m128i *>(ptr));
+ return _mm256_cvtepu8_epi16(data);
+}
+
+template <ZeroExtension ZX>
+static size_t QT_FUNCTION_TARGET(VAES_AVX512) QT_VECTORCALL
+aeshash256_lt32_avx256(__m256i state0, const uchar *p, size_t len)
+{
+ __m128i state0_128 = _mm256_castsi256_si128(state0);
+ if (len) {
+ __m256i data;
+ if constexpr (ZX == None) {
+ __mmask32 mask = _bzhi_u32(-1, unsigned(len));
+ data = _mm256_maskz_loadu_epi8(mask, p);
+ } else {
+ __mmask16 mask = _bzhi_u32(-1, unsigned(len) / 2);
+ __m128i data0 = _mm_maskz_loadu_epi8(mask, p);
+ data = _mm256_cvtepu8_epi16(data0);
+ }
+ __m128i data0 = _mm256_castsi256_si128(data);
+ if (len >= sizeof(__m128i)) {
+ state0 = _mm256_xor_si256(state0, data);
+ state0 = _mm256_aesenc_epi128(state0, state0);
+ state0 = _mm256_aesenc_epi128(state0, state0);
+ // we're XOR'ing the two halves so we skip the third AESENC
+ // state0 = _mm256_aesenc_epi128(state0, state0);
+
+ // XOR the two halves and extract
+ __m128i low = _mm256_extracti128_si256(state0, 0);
+ __m128i high = _mm256_extracti128_si256(state0, 1);
+ state0_128 = _mm_xor_si128(low, high);
+ } else {
+ hash16bytes(state0_128, data0);
+ }
+ }
+ return mm_cvtsi128_sz(state0_128);
+}
+
+template <ZeroExtension ZX>
+static size_t QT_FUNCTION_TARGET(VAES) QT_VECTORCALL
+aeshash256_ge32(__m256i state0, const __m128i *s, const __m128i *end, size_t len)
+{
+ static const auto hash32bytes = [](__m256i &state0, __m256i data) QT_FUNCTION_TARGET(VAES) {
+ state0 = _mm256_xor_si256(state0, data);
+ state0 = _mm256_aesenc_epi128(state0, state0);
+ state0 = _mm256_aesenc_epi128(state0, state0);
+ state0 = _mm256_aesenc_epi128(state0, state0);
+ };
+
+ // hash twice 32 bytes, running 2 scramble rounds of AES on itself
+ const auto hash2x32bytes = [](__m256i &state0, __m256i &state1, const void *src0,
+ const void *src1) QT_FUNCTION_TARGET(VAES) {
+ __m256i data0 = loadu256<ZX>(src0);
+ __m256i data1 = loadu256<ZX>(src1);
+ state0 = _mm256_xor_si256(data0, state0);
+ state1 = _mm256_xor_si256(data1, state1);
+ state0 = _mm256_aesenc_epi128(state0, state0);
+ state1 = _mm256_aesenc_epi128(state1, state1);
+ state0 = _mm256_aesenc_epi128(state0, state0);
+ state1 = _mm256_aesenc_epi128(state1, state1);
+ };
+
+ const __m256i *src = reinterpret_cast<const __m256i *>(s);
+ const __m256i *srcend = reinterpret_cast<const __m256i *>(end);
+
+ __m256i state1 = _mm256_aesenc_epi128(state0, mm256_set1_epz(len));
+
+ // main loop: scramble two 32-byte blocks
+ for ( ; advance<ZX>(src, 2) < srcend; src = advance<ZX>(src, 2))
+ hash2x32bytes(state0, state1, src, advance<ZX>(src, 1));
+
+ const __m256i *src2 = advance<ZX>(srcend, -1);
+ if (advance<ZX>(src, 1) < srcend) {
+ // epilogue: between 32 and 31 bytes
+ hash2x32bytes(state0, state1, src, src2);
+ } else if (src != srcend) {
+ // epilogue: between 1 and 32 bytes, overlap with the end
+ __m256i data = loadu256<ZX>(src2);
+ hash32bytes(state0, data);
+ }
+
+ // combine results:
+ state0 = _mm256_xor_si256(state0, state1);
+
+ // XOR the two halves and extract
+ __m128i low = _mm256_extracti128_si256(state0, 0);
+ __m128i high = _mm256_extracti128_si256(state0, 1);
+ return mm_cvtsi128_sz(_mm_xor_si128(low, high));
+}
+
+template <ZeroExtension ZX>
+static size_t QT_FUNCTION_TARGET(VAES)
+aeshash256(const uchar *p, size_t len, size_t seed, size_t seed2) noexcept
+{
+ AESHashSeed state(seed, seed2);
+ auto src = reinterpret_cast<const __m128i *>(p);
+ const auto srcend = reinterpret_cast<const __m128i *>(advance<ZX>(p, len));
+
+ if (len < sizeof(__m128i))
+ return aeshash128_lt16<ZX>(state.state0, src, srcend, len);
+
+ if (len <= sizeof(__m256i))
+ return aeshash128_16to32<ZX>(state.state0, state.state1(), src, srcend);
+
+ return aeshash256_ge32<ZX>(state.state0_256(), src, srcend, len);
+}
+
+template <ZeroExtension ZX>
+static size_t QT_FUNCTION_TARGET(VAES_AVX512)
+aeshash256_avx256(const uchar *p, size_t len, size_t seed, size_t seed2) noexcept
+{
+ AESHashSeed state(seed, seed2);
+ auto src = reinterpret_cast<const __m128i *>(p);
+ const auto srcend = reinterpret_cast<const __m128i *>(advance<ZX>(p, len));
+
+ if (len <= sizeof(__m256i))
+ return aeshash256_lt32_avx256<ZX>(state.state0_256(), p, len);
+
+ return aeshash256_ge32<ZX>(state.state0_256(), src, srcend, len);
+}
+# endif // VAES
+
+template <ZeroExtension ZX>
+static size_t QT_FUNCTION_TARGET(AES)
+aeshash128(const uchar *p, size_t len, size_t seed, size_t seed2) noexcept
+{
+ AESHashSeed state(seed, seed2);
+ auto src = reinterpret_cast<const __m128i *>(p);
+ const auto srcend = reinterpret_cast<const __m128i *>(advance<ZX>(p, len));
+
+ if (len < sizeof(__m128i))
+ return aeshash128_lt16<ZX>(state.state0, src, srcend, len);
+
+ if (len <= sizeof(__m256i))
+ return aeshash128_16to32<ZX>(state.state0, state.state1(), src, srcend);
+
+ return aeshash128_ge32<ZX>(state.state0, state.state1(), src, srcend);
+}
+
+template <ZeroExtension ZX = None>
+static size_t aeshash(const uchar *p, size_t len, size_t seed, size_t seed2) noexcept
+{
+ if constexpr (ZX == ByteToWord)
+ len *= 2; // see note above on ZX == ByteToWord hashing
+
+# if QT_COMPILER_SUPPORTS_HERE(VAES)
+ if (qCpuHasFeature(VAES)) {
+ if (qCpuHasFeature(AVX512VL))
+ return aeshash256_avx256<ZX>(p, len, seed, seed2);
+ return aeshash256<ZX>(p, len, seed, seed2);
+ }
# endif
+ return aeshash128<ZX>(p, len, seed, seed2);
}
-#endif
+#endif // x86 AESNI
#if defined(Q_PROCESSOR_ARM) && QT_COMPILER_SUPPORTS_HERE(AES) && !defined(QHASH_AES_SANITIZER_BUILD) && !defined(QT_BOOTSTRAPPED)
QT_FUNCTION_TARGET(AES)
@@ -778,31 +1098,20 @@ size_t qHashBits(const void *p, size_t size, size_t seed) noexcept
size_t seed2 = size;
if (seed)
seed2 = qt_qhash_seed.currentSeed(1);
+
+ auto data = reinterpret_cast<const uchar *>(p);
#ifdef AESHASH
if (seed && qCpuHasFeature(AES) && qCpuHasFeature(SSE4_2))
- return aeshash(reinterpret_cast<const uchar *>(p), size, seed, seed2);
+ return aeshash(data, size, seed, seed2);
#elif defined(Q_PROCESSOR_ARM) && QT_COMPILER_SUPPORTS_HERE(AES) && !defined(QHASH_AES_SANITIZER_BUILD) && !defined(QT_BOOTSTRAPPED)
-# if defined(Q_OS_LINUX)
- // Do specific runtime-only check as Yocto hard enables Crypto extension for
- // all armv8 configs
- if (seed && (qCpuFeatures() & CpuFeatureAES))
-# else
if (seed && qCpuHasFeature(AES))
-# endif
- return aeshash(reinterpret_cast<const uchar *>(p), size, seed, seed2);
+ return aeshash(data, size, seed, seed2);
#endif
- if (size <= QT_POINTER_SIZE)
- return murmurhash(p, size, seed);
- return siphash(reinterpret_cast<const uchar *>(p), size, seed, seed2);
+ return qHashBits_fallback<>(data, size, seed, seed2);
}
-size_t qHash(const QByteArray &key, size_t seed) noexcept
-{
- return qHashBits(key.constData(), size_t(key.size()), seed);
-}
-
-size_t qHash(const QByteArrayView &key, size_t seed) noexcept
+size_t qHash(QByteArrayView key, size_t seed) noexcept
{
return qHashBits(key.constData(), size_t(key.size()), seed);
}
@@ -812,6 +1121,7 @@ size_t qHash(QStringView key, size_t seed) noexcept
return qHashBits(key.data(), key.size()*sizeof(QChar), seed);
}
+#ifndef QT_BOOTSTRAPPED
size_t qHash(const QBitArray &bitArray, size_t seed) noexcept
{
qsizetype m = bitArray.d.size() - 1;
@@ -824,14 +1134,35 @@ size_t qHash(const QBitArray &bitArray, size_t seed) noexcept
result = ((result << 4) + bitArray.d.at(m)) & ((1 << n) - 1);
return result;
}
+#endif
-size_t qHash(QLatin1String key, size_t seed) noexcept
+size_t qHash(QLatin1StringView key, size_t seed) noexcept
{
- return qHashBits(reinterpret_cast<const uchar *>(key.data()), size_t(key.size()), seed);
+#ifdef QT_BOOTSTRAPPED
+ // the seed is always 0 in bootstrapped mode (no seed generation code),
+ // so help the compiler do dead code elimination
+ seed = 0;
+#endif
+
+ auto data = reinterpret_cast<const uchar *>(key.data());
+ size_t size = key.size();
+
+ // Mix in the length as a secondary seed.
+ // Multiplied by 2 to match the byte size of the equiavlent UTF-16 string.
+ size_t seed2 = size * 2;
+ if (seed)
+ seed2 = qt_qhash_seed.currentSeed(1);
+
+#if defined(AESHASH)
+ if (seed && qCpuHasFeature(AES) && qCpuHasFeature(SSE4_2))
+ return aeshash<ByteToWord>(data, size, seed, seed2);
+#endif
+ return qHashBits_fallback<ByteToWord>(data, size, seed, seed2);
}
/*!
\class QHashSeed
+ \inmodule QtCore
\since 6.2
The QHashSeed class is used to convey the QHash seed. This is used
@@ -1231,6 +1562,26 @@ uint qt_hash(QStringView key, uint chained) noexcept
Returns the hash value for the \a key, using \a seed to seed the calculation.
*/
+/*! \fn size_t qHash(quint128 key, size_t seed = 0)
+ \relates QHash
+ \since 6.8
+
+ Returns the hash value for the \a key, using \a seed to seed the calculation.
+
+ \note This function is only available on platforms that support a native
+ 128-bit integer type.
+*/
+
+/*! \fn size_t qHash(qint128 key, size_t seed = 0)
+ \relates QHash
+ \since 6.8
+
+ Returns the hash value for the \a key, using \a seed to seed the calculation.
+
+ \note This function is only available on platforms that support a native
+ 128-bit integer type.
+ */
+
/*! \fn size_t qHash(char8_t key, size_t seed = 0)
\relates QHash
\since 6.0
@@ -1259,7 +1610,7 @@ uint qt_hash(QStringView key, uint chained) noexcept
Returns the hash value for the \a key, using \a seed to seed the calculation.
*/
-/*! \fn size_t qHash(float key, size_t seed) noexcept
+/*! \fn size_t qHash(float key, size_t seed = 0) noexcept
\relates QHash
\since 5.3
@@ -1284,7 +1635,6 @@ size_t qHash(double key, size_t seed) noexcept
}
}
-#if !defined(Q_OS_DARWIN) || defined(Q_CLANG_QDOC)
/*! \relates QHash
\since 5.3
@@ -1302,7 +1652,6 @@ size_t qHash(long double key, size_t seed) noexcept
return murmurhash(&key, sizeof(key), seed);
}
}
-#endif
/*! \fn size_t qHash(const QChar key, size_t seed = 0)
\relates QHash
@@ -1346,7 +1695,7 @@ size_t qHash(long double key, size_t seed) noexcept
Returns the hash value for the \a key, using \a seed to seed the calculation.
*/
-/*! \fn size_t qHash(QLatin1String key, size_t seed = 0)
+/*! \fn size_t qHash(QLatin1StringView key, size_t seed = 0)
\relates QHash
\since 5.0
@@ -1360,7 +1709,7 @@ size_t qHash(long double key, size_t seed) noexcept
Returns the hash value for the \a key, using \a seed to seed the calculation.
*/
-/*! \fn template <class T> size_t qHash(std::nullptr_t key, size_t seed = 0)
+/*! \fn size_t qHash(std::nullptr_t key, size_t seed = 0)
\relates QHash
\since 6.0
@@ -1488,7 +1837,7 @@ size_t qHash(long double key, size_t seed) noexcept
hash table, use \l{QMultiHash}.
If you only need to extract the values from a hash (not the keys),
- you can also use \l{foreach}:
+ you can also use range-based for:
\snippet code/src_corelib_tools_qhash.cpp 12
@@ -1527,10 +1876,15 @@ size_t qHash(long double key, size_t seed) noexcept
The two-arguments overloads take an unsigned integer that should be used to
seed the calculation of the hash function. This seed is provided by QHash
- in order to prevent a family of \l{algorithmic complexity attacks}. If both
- a one-argument and a two-arguments overload are defined for a key type,
- the latter is used by QHash (note that you can simply define a
- two-arguments version, and use a default value for the seed parameter).
+ in order to prevent a family of \l{algorithmic complexity attacks}.
+
+ \note In Qt 6 it is possible to define a \c{qHash()} overload
+ taking only one argument; support for this is deprecated. Starting
+ with Qt 7, it will be mandatory to use a two-arguments overload. If
+ both a one-argument and a two-arguments overload are defined for a
+ key type, the latter is used by QHash (note that you can simply
+ define a two-arguments version, and use a default value for the
+ seed parameter).
The second way to provide a hashing function is by specializing
the \c{std::hash} class for the key type \c{K}, and providing a
@@ -1626,8 +1980,8 @@ size_t qHash(long double key, size_t seed) noexcept
Constructs a hash with a copy of each of the elements in the iterator range
[\a begin, \a end). Either the elements iterated by the range must be
- objects with \c{first} and \c{second} data members (like \c{QPair},
- \c{std::pair}, etc.) convertible to \c Key and to \c T respectively; or the
+ objects with \c{first} and \c{second} data members (like \c{std::pair}),
+ convertible to \c Key and to \c T respectively; or the
iterators must have \c{key()} and \c{value()} member functions, returning a
key convertible to \c Key and a value convertible to \c T respectively.
*/
@@ -1862,7 +2216,7 @@ size_t qHash(long double key, size_t seed) noexcept
Returns \c true if the hash contains an item with the \a key;
otherwise returns \c false.
- \sa count(), QMultiHash::contains()
+ \sa count()
*/
/*! \fn template <class Key, class T> T QHash<Key, T>::value(const Key &key) const
@@ -1885,6 +2239,12 @@ size_t qHash(long double key, size_t seed) noexcept
a \l{default-constructed value} into the hash with the \a key, and
returns a reference to it.
+//! [qhash-iterator-invalidation-func-desc]
+ \warning Returned iterators/references should be considered invalidated
+ the next time you call a non-const function on the hash, or when the
+ hash is destroyed.
+//! [qhash-iterator-invalidation-func-desc]
+
\sa insert(), value()
*/
@@ -1968,12 +2328,16 @@ size_t qHash(long double key, size_t seed) noexcept
Returns an \l{STL-style iterators}{STL-style iterator} pointing to the first item in
the hash.
+ \include qhash.cpp qhash-iterator-invalidation-func-desc
+
\sa constBegin(), end()
*/
/*! \fn template <class Key, class T> QHash<Key, T>::const_iterator QHash<Key, T>::begin() const
\overload
+
+ \include qhash.cpp qhash-iterator-invalidation-func-desc
*/
/*! \fn template <class Key, class T> QHash<Key, T>::const_iterator QHash<Key, T>::cbegin() const
@@ -1982,6 +2346,8 @@ size_t qHash(long double key, size_t seed) noexcept
Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the first item
in the hash.
+ \include qhash.cpp qhash-iterator-invalidation-func-desc
+
\sa begin(), cend()
*/
@@ -1990,6 +2356,8 @@ size_t qHash(long double key, size_t seed) noexcept
Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the first item
in the hash.
+ \include qhash.cpp qhash-iterator-invalidation-func-desc
+
\sa begin(), constEnd()
*/
@@ -1999,6 +2367,8 @@ size_t qHash(long double key, size_t seed) noexcept
Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the first key
in the hash.
+ \include qhash.cpp qhash-iterator-invalidation-func-desc
+
\sa keyEnd()
*/
@@ -2007,12 +2377,16 @@ size_t qHash(long double key, size_t seed) noexcept
Returns an \l{STL-style iterators}{STL-style iterator} pointing to the imaginary item
after the last item in the hash.
+ \include qhash.cpp qhash-iterator-invalidation-func-desc
+
\sa begin(), constEnd()
*/
/*! \fn template <class Key, class T> QHash<Key, T>::const_iterator QHash<Key, T>::end() const
\overload
+
+ \include qhash.cpp qhash-iterator-invalidation-func-desc
*/
/*! \fn template <class Key, class T> QHash<Key, T>::const_iterator QHash<Key, T>::constEnd() const
@@ -2020,6 +2394,8 @@ size_t qHash(long double key, size_t seed) noexcept
Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the imaginary
item after the last item in the hash.
+ \include qhash.cpp qhash-iterator-invalidation-func-desc
+
\sa constBegin(), end()
*/
@@ -2029,6 +2405,8 @@ size_t qHash(long double key, size_t seed) noexcept
Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the imaginary
item after the last item in the hash.
+ \include qhash.cpp qhash-iterator-invalidation-func-desc
+
\sa cbegin(), end()
*/
@@ -2038,6 +2416,8 @@ size_t qHash(long double key, size_t seed) noexcept
Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the imaginary
item after the last key in the hash.
+ \include qhash.cpp qhash-iterator-invalidation-func-desc
+
\sa keyBegin()
*/
@@ -2047,6 +2427,8 @@ size_t qHash(long double key, size_t seed) noexcept
Returns an \l{STL-style iterators}{STL-style iterator} pointing to the first entry
in the hash.
+ \include qhash.cpp qhash-iterator-invalidation-func-desc
+
\sa keyValueEnd()
*/
@@ -2056,6 +2438,8 @@ size_t qHash(long double key, size_t seed) noexcept
Returns an \l{STL-style iterators}{STL-style iterator} pointing to the imaginary
entry after the last entry in the hash.
+ \include qhash.cpp qhash-iterator-invalidation-func-desc
+
\sa keyValueBegin()
*/
@@ -2065,6 +2449,8 @@ size_t qHash(long double key, size_t seed) noexcept
Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the first entry
in the hash.
+ \include qhash.cpp qhash-iterator-invalidation-func-desc
+
\sa keyValueEnd()
*/
@@ -2074,6 +2460,8 @@ size_t qHash(long double key, size_t seed) noexcept
Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the first entry
in the hash.
+ \include qhash.cpp qhash-iterator-invalidation-func-desc
+
\sa keyValueBegin()
*/
@@ -2083,6 +2471,8 @@ size_t qHash(long double key, size_t seed) noexcept
Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the imaginary
entry after the last entry in the hash.
+ \include qhash.cpp qhash-iterator-invalidation-func-desc
+
\sa keyValueBegin()
*/
@@ -2092,9 +2482,32 @@ size_t qHash(long double key, size_t seed) noexcept
Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the imaginary
entry after the last entry in the hash.
+ \include qhash.cpp qhash-iterator-invalidation-func-desc
+
\sa constKeyValueBegin()
*/
+/*! \fn template <class Key, class T> auto QHash<Key, T>::asKeyValueRange() &
+ \fn template <class Key, class T> auto QHash<Key, T>::asKeyValueRange() const &
+ \fn template <class Key, class T> auto QHash<Key, T>::asKeyValueRange() &&
+ \fn template <class Key, class T> auto QHash<Key, T>::asKeyValueRange() const &&
+ \since 6.4
+
+ Returns a range object that allows iteration over this hash as
+ key/value pairs. For instance, this range object can be used in a
+ range-based for loop, in combination with a structured binding declaration:
+
+ \snippet code/src_corelib_tools_qhash.cpp 34
+
+ Note that both the key and the value obtained this way are
+ references to the ones in the hash. Specifically, mutating the value
+ will modify the hash itself.
+
+ \include qhash.cpp qhash-iterator-invalidation-func-desc
+
+ \sa QKeyValueIterator
+*/
+
/*! \fn template <class Key, class T> QHash<Key, T>::iterator QHash<Key, T>::erase(const_iterator pos)
\since 5.7
@@ -2109,6 +2522,8 @@ size_t qHash(long double key, size_t seed) noexcept
\snippet code/src_corelib_tools_qhash.cpp 15
+ \include qhash.cpp qhash-iterator-invalidation-func-desc
+
\sa remove(), take(), find()
*/
@@ -2128,12 +2543,16 @@ size_t qHash(long double key, size_t seed) noexcept
\snippet code/src_corelib_tools_qhash.cpp 16
+ \include qhash.cpp qhash-iterator-invalidation-func-desc
+
\sa value(), values()
*/
/*! \fn template <class Key, class T> QHash<Key, T>::const_iterator QHash<Key, T>::find(const Key &key) const
\overload
+
+ \include qhash.cpp qhash-iterator-invalidation-func-desc
*/
/*! \fn template <class Key, class T> QHash<Key, T>::const_iterator QHash<Key, T>::constFind(const Key &key) const
@@ -2145,6 +2564,8 @@ size_t qHash(long double key, size_t seed) noexcept
If the hash contains no item with the \a key, the function
returns constEnd().
+ \include qhash.cpp qhash-iterator-invalidation-func-desc
+
\sa find()
*/
@@ -2154,6 +2575,10 @@ size_t qHash(long double key, size_t seed) noexcept
If there is already an item with the \a key, that item's value
is replaced with \a value.
+
+ Returns an iterator pointing to the new/updated element.
+
+ \include qhash.cpp qhash-iterator-invalidation-func-desc
*/
/*!
@@ -2165,6 +2590,8 @@ size_t qHash(long double key, size_t seed) noexcept
construction.
Returns an iterator pointing to the new element.
+
+ \include qhash.cpp qhash-iterator-invalidation-func-desc
*/
@@ -2175,9 +2602,6 @@ size_t qHash(long double key, size_t seed) noexcept
If a key is common to both hashes, its value will be replaced with the
value stored in \a other.
-
- \note If \a other contains multiple entries with the same key then the
- final value of the key is undefined.
*/
/*! \fn template <class Key, class T> bool QHash<Key, T>::empty() const
@@ -2187,17 +2611,21 @@ size_t qHash(long double key, size_t seed) noexcept
returns \c false.
*/
-/*! \fn template <class Key, class T> QPair<iterator, iterator> QMultiHash<Key, T>::equal_range(const Key &key)
+/*! \fn template <class Key, class T> std::pair<iterator, iterator> QMultiHash<Key, T>::equal_range(const Key &key)
\since 5.7
Returns a pair of iterators delimiting the range of values \c{[first, second)}, that
are stored under \a key. If the range is empty then both iterators will be equal to end().
+
+ \include qhash.cpp qhash-iterator-invalidation-func-desc
*/
/*!
- \fn template <class Key, class T> QPair<const_iterator, const_iterator> QMultiHash<Key, T>::equal_range(const Key &key) const
+ \fn template <class Key, class T> std::pair<const_iterator, const_iterator> QMultiHash<Key, T>::equal_range(const Key &key) const
\overload
\since 5.7
+
+ \include qhash.cpp qhash-iterator-invalidation-func-desc
*/
/*! \typedef QHash::ConstIterator
@@ -2294,12 +2722,6 @@ size_t qHash(long double key, size_t seed) noexcept
\inmodule QtCore
\brief The QHash::iterator class provides an STL-style non-const iterator for QHash.
- QHash features both \l{STL-style iterators} and \l{Java-style
- iterators}. The STL-style iterators are more low-level and more
- cumbersome to use; on the other hand, they are slightly faster
- and, for developers who already know STL, have the advantage of
- familiarity.
-
QHash\<Key, T\>::iterator allows you to iterate over a QHash
and to modify the value (but not the key) associated
with a particular key. If you want to iterate over a const QHash,
@@ -2320,31 +2742,15 @@ size_t qHash(long double key, size_t seed) noexcept
Unlike QMap, which orders its items by key, QHash stores its
items in an arbitrary order.
- Let's see a few examples of things we can do with a
- QHash::iterator that we cannot do with a QHash::const_iterator.
Here's an example that increments every value stored in the QHash
by 2:
\snippet code/src_corelib_tools_qhash.cpp 18
- Here's an example that removes all the items whose key is a
- string that starts with an underscore character:
-
- \snippet code/src_corelib_tools_qhash.cpp 19
-
- The call to QHash::erase() removes the item pointed to by the
- iterator from the hash, and returns an iterator to the next item.
- Here's another way of removing an item while iterating:
-
- \snippet code/src_corelib_tools_qhash.cpp 20
-
- It might be tempting to write code like this:
+ To remove elements from a QHash you can use erase_if(QHash\<Key, T\> &map, Predicate pred):
\snippet code/src_corelib_tools_qhash.cpp 21
- However, this will potentially crash in \c{++i}, because \c i is
- a dangling iterator after the call to erase().
-
Multiple iterators can be used on the same hash. However, be aware
that any modification performed directly on the QHash (inserting and
removing items) can cause the iterators to become invalid.
@@ -2355,10 +2761,6 @@ size_t qHash(long double key, size_t seed) noexcept
to grow/shrink its internal hash table.
Using any iterator after a rehashing operation has occurred will lead to undefined behavior.
- You can however safely use iterators to remove entries from the hash
- using the QHash::erase() method. This function can safely be called while
- iterating, and won't affect the order of items in the hash.
-
If you need to keep iterators over a long period of time, we recommend
that you use QMap rather than QHash.
@@ -2367,7 +2769,7 @@ size_t qHash(long double key, size_t seed) noexcept
while iterators are active on that container. For more information,
read \l{Implicit sharing iterator problem}.
- \sa QHash::const_iterator, QHash::key_iterator, QMutableHashIterator
+ \sa QHash::const_iterator, QHash::key_iterator, QHash::key_value_iterator
*/
/*! \fn template <class Key, class T> QHash<Key, T>::iterator::iterator()
@@ -2463,12 +2865,6 @@ size_t qHash(long double key, size_t seed) noexcept
\inmodule QtCore
\brief The QHash::const_iterator class provides an STL-style const iterator for QHash.
- QHash features both \l{STL-style iterators} and \l{Java-style
- iterators}. The STL-style iterators are more low-level and more
- cumbersome to use; on the other hand, they are slightly faster
- and, for developers who already know STL, have the advantage of
- familiarity.
-
QHash\<Key, T\>::const_iterator allows you to iterate over a
QHash. If you want to modify the QHash as you
iterate over it, you must use QHash::iterator instead. It is
@@ -2479,8 +2875,8 @@ size_t qHash(long double key, size_t seed) noexcept
The default QHash::const_iterator constructor creates an
uninitialized iterator. You must initialize it using a QHash
- function like QHash::constBegin(), QHash::constEnd(), or
- QHash::find() before you can start iterating. Here's a typical
+ function like QHash::cbegin(), QHash::cend(), or
+ QHash::constFind() before you can start iterating. Here's a typical
loop that prints all the (key, value) pairs stored in a hash:
\snippet code/src_corelib_tools_qhash.cpp 23
@@ -2501,12 +2897,16 @@ size_t qHash(long double key, size_t seed) noexcept
to grow/shrink its internal hash table.
Using any iterator after a rehashing operation has occurred will lead to undefined behavior.
+ You can however safely use iterators to remove entries from the hash
+ using the QHash::erase() method. This function can safely be called while
+ iterating, and won't affect the order of items in the hash.
+
\warning Iterators on implicitly shared containers do not work
exactly like STL-iterators. You should avoid copying a container
while iterators are active on that container. For more information,
read \l{Implicit sharing iterator problem}.
- \sa QHash::iterator, QHashIterator
+ \sa QHash::iterator, QHash::key_iterator, QHash::const_key_value_iterator
*/
/*! \fn template <class Key, class T> QHash<Key, T>::const_iterator::const_iterator()
@@ -2792,9 +3192,6 @@ size_t qHash(long double key, size_t seed) noexcept
Constructs a multi-hash with a copy of each of the elements in the
initializer list \a list.
-
- This function is only available if the program is being
- compiled in C++11 mode.
*/
/*! \fn template <class Key, class T> QMultiHash<Key, T>::QMultiHash(const QHash<Key, T> &other)
@@ -2808,8 +3205,8 @@ size_t qHash(long double key, size_t seed) noexcept
Constructs a multi-hash with a copy of each of the elements in the iterator range
[\a begin, \a end). Either the elements iterated by the range must be
- objects with \c{first} and \c{second} data members (like \c{QPair},
- \c{std::pair}, etc.) convertible to \c Key and to \c T respectively; or the
+ objects with \c{first} and \c{second} data members (like \c{std::pair}),
+ convertible to \c Key and to \c T respectively; or the
iterators must have \c{key()} and \c{value()} member functions, returning a
key convertible to \c Key and a value convertible to \c T respectively.
*/
@@ -2824,6 +3221,10 @@ size_t qHash(long double key, size_t seed) noexcept
If there are multiple items with the \a key, the most
recently inserted item's value is replaced with \a value.
+ Returns an iterator pointing to the new/updated element.
+
+ \include qhash.cpp qhash-iterator-invalidation-func-desc
+
\sa insert()
*/
@@ -2836,6 +3237,10 @@ size_t qHash(long double key, size_t seed) noexcept
different from replace(), which overwrites the value of an
existing item.)
+ Returns an iterator pointing to the new element.
+
+ \include qhash.cpp qhash-iterator-invalidation-func-desc
+
\sa replace()
*/
@@ -2854,6 +3259,8 @@ size_t qHash(long double key, size_t seed) noexcept
Returns an iterator pointing to the new element.
+ \include qhash.cpp qhash-iterator-invalidation-func-desc
+
\sa insert
*/
@@ -2870,6 +3277,8 @@ size_t qHash(long double key, size_t seed) noexcept
Returns an iterator pointing to the new element.
+ \include qhash.cpp qhash-iterator-invalidation-func-desc
+
\sa replace, emplace
*/
@@ -2936,6 +3345,8 @@ size_t qHash(long double key, size_t seed) noexcept
If the hash contains multiple items with the \a key, this function returns
a reference to the most recently inserted value.
+ \include qhash.cpp qhash-iterator-invalidation-func-desc
+
\sa insert(), value()
*/
@@ -3088,12 +3499,16 @@ size_t qHash(long double key, size_t seed) noexcept
If the hash contains multiple items with the \a key and \a value, the
iterator returned points to the most recently inserted item.
+
+ \include qhash.cpp qhash-iterator-invalidation-func-desc
*/
/*!
\fn template <class Key, class T> typename QMultiHash<Key, T>::const_iterator QMultiHash<Key, T>::find(const Key &key, const T &value) const
\since 4.3
\overload
+
+ \include qhash.cpp qhash-iterator-invalidation-func-desc
*/
/*!
@@ -3105,6 +3520,8 @@ size_t qHash(long double key, size_t seed) noexcept
If the hash contains no such item, the function returns
constEnd().
+
+ \include qhash.cpp qhash-iterator-invalidation-func-desc
*/
/*! \fn template <class Key, class T> QMultiHash<Key, T>::iterator QMultiHash<Key, T>::begin()
@@ -3112,12 +3529,16 @@ size_t qHash(long double key, size_t seed) noexcept
Returns an \l{STL-style iterators}{STL-style iterator} pointing to the first item in
the hash.
+ \include qhash.cpp qhash-iterator-invalidation-func-desc
+
\sa constBegin(), end()
*/
/*! \fn template <class Key, class T> QMultiHash<Key, T>::const_iterator QMultiHash<Key, T>::begin() const
\overload
+
+ \include qhash.cpp qhash-iterator-invalidation-func-desc
*/
/*! \fn template <class Key, class T> QMultiHash<Key, T>::const_iterator QMultiHash<Key, T>::cbegin() const
@@ -3126,6 +3547,8 @@ size_t qHash(long double key, size_t seed) noexcept
Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the first item
in the hash.
+ \include qhash.cpp qhash-iterator-invalidation-func-desc
+
\sa begin(), cend()
*/
@@ -3134,6 +3557,8 @@ size_t qHash(long double key, size_t seed) noexcept
Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the first item
in the hash.
+ \include qhash.cpp qhash-iterator-invalidation-func-desc
+
\sa begin(), constEnd()
*/
@@ -3143,6 +3568,8 @@ size_t qHash(long double key, size_t seed) noexcept
Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the first key
in the hash.
+ \include qhash.cpp qhash-iterator-invalidation-func-desc
+
\sa keyEnd()
*/
@@ -3151,6 +3578,8 @@ size_t qHash(long double key, size_t seed) noexcept
Returns an \l{STL-style iterators}{STL-style iterator} pointing to the imaginary item
after the last item in the hash.
+ \include qhash.cpp qhash-iterator-invalidation-func-desc
+
\sa begin(), constEnd()
*/
@@ -3164,6 +3593,8 @@ size_t qHash(long double key, size_t seed) noexcept
Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the imaginary
item after the last item in the hash.
+ \include qhash.cpp qhash-iterator-invalidation-func-desc
+
\sa constBegin(), end()
*/
@@ -3173,6 +3604,8 @@ size_t qHash(long double key, size_t seed) noexcept
Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the imaginary
item after the last item in the hash.
+ \include qhash.cpp qhash-iterator-invalidation-func-desc
+
\sa cbegin(), end()
*/
@@ -3182,6 +3615,8 @@ size_t qHash(long double key, size_t seed) noexcept
Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the imaginary
item after the last key in the hash.
+ \include qhash.cpp qhash-iterator-invalidation-func-desc
+
\sa keyBegin()
*/
@@ -3191,6 +3626,8 @@ size_t qHash(long double key, size_t seed) noexcept
Returns an \l{STL-style iterators}{STL-style iterator} pointing to the first entry
in the hash.
+ \include qhash.cpp qhash-iterator-invalidation-func-desc
+
\sa keyValueEnd()
*/
@@ -3200,6 +3637,8 @@ size_t qHash(long double key, size_t seed) noexcept
Returns an \l{STL-style iterators}{STL-style iterator} pointing to the imaginary
entry after the last entry in the hash.
+ \include qhash.cpp qhash-iterator-invalidation-func-desc
+
\sa keyValueBegin()
*/
@@ -3209,6 +3648,8 @@ size_t qHash(long double key, size_t seed) noexcept
Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the first entry
in the hash.
+ \include qhash.cpp qhash-iterator-invalidation-func-desc
+
\sa keyValueEnd()
*/
@@ -3218,6 +3659,8 @@ size_t qHash(long double key, size_t seed) noexcept
Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the first entry
in the hash.
+ \include qhash.cpp qhash-iterator-invalidation-func-desc
+
\sa keyValueBegin()
*/
@@ -3227,6 +3670,8 @@ size_t qHash(long double key, size_t seed) noexcept
Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the imaginary
entry after the last entry in the hash.
+ \include qhash.cpp qhash-iterator-invalidation-func-desc
+
\sa keyValueBegin()
*/
@@ -3236,20 +3681,36 @@ size_t qHash(long double key, size_t seed) noexcept
Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the imaginary
entry after the last entry in the hash.
+ \include qhash.cpp qhash-iterator-invalidation-func-desc
+
\sa constKeyValueBegin()
*/
+/*! \fn template <class Key, class T> auto QMultiHash<Key, T>::asKeyValueRange() &
+ \fn template <class Key, class T> auto QMultiHash<Key, T>::asKeyValueRange() const &
+ \fn template <class Key, class T> auto QMultiHash<Key, T>::asKeyValueRange() &&
+ \fn template <class Key, class T> auto QMultiHash<Key, T>::asKeyValueRange() const &&
+ \since 6.4
+
+ Returns a range object that allows iteration over this hash as
+ key/value pairs. For instance, this range object can be used in a
+ range-based for loop, in combination with a structured binding declaration:
+
+ \snippet code/src_corelib_tools_qhash.cpp 35
+
+ Note that both the key and the value obtained this way are
+ references to the ones in the hash. Specifically, mutating the value
+ will modify the hash itself.
+
+ \include qhash.cpp qhash-iterator-invalidation-func-desc
+
+ \sa QKeyValueIterator
+*/
/*! \class QMultiHash::iterator
\inmodule QtCore
\brief The QMultiHash::iterator class provides an STL-style non-const iterator for QMultiHash.
- QMultiHash features both \l{STL-style iterators} and \l{Java-style
- iterators}. The STL-style iterators are more low-level and more
- cumbersome to use; on the other hand, they are slightly faster
- and, for developers who already know STL, have the advantage of
- familiarity.
-
QMultiHash\<Key, T\>::iterator allows you to iterate over a QMultiHash
and to modify the value (but not the key) associated
with a particular key. If you want to iterate over a const QMultiHash,
@@ -3270,31 +3731,15 @@ size_t qHash(long double key, size_t seed) noexcept
Unlike QMap, which orders its items by key, QMultiHash stores its
items in an arbitrary order.
- Let's see a few examples of things we can do with a
- QMultiHash::iterator that we cannot do with a QMultiHash::const_iterator.
Here's an example that increments every value stored in the QMultiHash
by 2:
\snippet code/src_corelib_tools_qhash.cpp 18
- Here's an example that removes all the items whose key is a
- string that starts with an underscore character:
-
- \snippet code/src_corelib_tools_qhash.cpp 19
-
- The call to QMultiHash::erase() removes the item pointed to by the
- iterator from the hash, and returns an iterator to the next item.
- Here's another way of removing an item while iterating:
-
- \snippet code/src_corelib_tools_qhash.cpp 20
-
- It might be tempting to write code like this:
+ To remove elements from a QMultiHash you can use erase_if(QMultiHash\<Key, T\> &map, Predicate pred):
\snippet code/src_corelib_tools_qhash.cpp 21
- However, this will potentially crash in \c{++i}, because \c i is
- a dangling iterator after the call to erase().
-
Multiple iterators can be used on the same hash. However, be aware
that any modification performed directly on the QHash (inserting and
removing items) can cause the iterators to become invalid.
@@ -3305,10 +3750,6 @@ size_t qHash(long double key, size_t seed) noexcept
to grow/shrink its internal hash table.
Using any iterator after a rehashing operation has occurred will lead to undefined behavior.
- You can however safely use iterators to remove entries from the hash
- using the QHash::erase() method. This function can safely be called while
- iterating, and won't affect the order of items in the hash.
-
If you need to keep iterators over a long period of time, we recommend
that you use QMultiMap rather than QHash.
@@ -3317,7 +3758,7 @@ size_t qHash(long double key, size_t seed) noexcept
while iterators are active on that container. For more information,
read \l{Implicit sharing iterator problem}.
- \sa QMultiHash::const_iterator, QMultiHash::key_iterator, QMutableHashIterator
+ \sa QMultiHash::const_iterator, QMultiHash::key_iterator, QMultiHash::key_value_iterator
*/
/*! \fn template <class Key, class T> QMultiHash<Key, T>::iterator::iterator()
@@ -3413,12 +3854,6 @@ size_t qHash(long double key, size_t seed) noexcept
\inmodule QtCore
\brief The QMultiHash::const_iterator class provides an STL-style const iterator for QMultiHash.
- QMultiHash features both \l{STL-style iterators} and \l{Java-style
- iterators}. The STL-style iterators are more low-level and more
- cumbersome to use; on the other hand, they are slightly faster
- and, for developers who already know STL, have the advantage of
- familiarity.
-
QMultiHash\<Key, T\>::const_iterator allows you to iterate over a
QMultiHash. If you want to modify the QMultiHash as you
iterate over it, you must use QMultiHash::iterator instead. It is
@@ -3429,8 +3864,8 @@ size_t qHash(long double key, size_t seed) noexcept
The default QMultiHash::const_iterator constructor creates an
uninitialized iterator. You must initialize it using a QMultiHash
- function like QMultiHash::constBegin(), QMultiHash::constEnd(), or
- QMultiHash::find() before you can start iterating. Here's a typical
+ function like QMultiHash::cbegin(), QMultiHash::cend(), or
+ QMultiHash::constFind() before you can start iterating. Here's a typical
loop that prints all the (key, value) pairs stored in a hash:
\snippet code/src_corelib_tools_qhash.cpp 23
@@ -3442,28 +3877,24 @@ size_t qHash(long double key, size_t seed) noexcept
recently to the least recently inserted value.
Multiple iterators can be used on the same hash. However, be aware
- that any modification performed directly on the QHash (inserting and
+ that any modification performed directly on the QMultiHash (inserting and
removing items) can cause the iterators to become invalid.
- Inserting items into the hash or calling methods such as QHash::reserve()
- or QHash::squeeze() can invalidate all iterators pointing into the hash.
- Iterators are guaranteed to stay valid only as long as the QHash doesn't have
+ Inserting items into the hash or calling methods such as QMultiHash::reserve()
+ or QMultiHash::squeeze() can invalidate all iterators pointing into the hash.
+ Iterators are guaranteed to stay valid only as long as the QMultiHash doesn't have
to grow/shrink it's internal hash table.
Using any iterator after a rehashing operation ahs occurred will lead to undefined behavior.
- You can however safely use iterators to remove entries from the hash
- using the QHash::erase() method. This function can safely be called while
- iterating, and won't affect the order of items in the hash.
-
If you need to keep iterators over a long period of time, we recommend
- that you use QMap rather than QHash.
+ that you use QMultiMap rather than QMultiHash.
\warning Iterators on implicitly shared containers do not work
exactly like STL-iterators. You should avoid copying a container
while iterators are active on that container. For more information,
read \l{Implicit sharing iterator problem}.
- \sa QMultiHash::iterator
+ \sa QMultiHash::iterator, QMultiHash::key_iterator, QMultiHash::const_key_value_iterator
*/
/*! \fn template <class Key, class T> QMultiHash<Key, T>::const_iterator::const_iterator()
@@ -3727,4 +4158,36 @@ size_t qHash(long double key, size_t seed) noexcept
Returns the number of elements removed, if any.
*/
+#ifdef QT_HAS_CONSTEXPR_BITOPS
+namespace QHashPrivate {
+static_assert(qPopulationCount(SpanConstants::NEntries) == 1,
+ "NEntries must be a power of 2 for bucketForHash() to work.");
+
+// ensure the size of a Span does not depend on the template parameters
+using Node1 = Node<int, int>;
+static_assert(sizeof(Span<Node1>) == sizeof(Span<Node<char, void *>>));
+static_assert(sizeof(Span<Node1>) == sizeof(Span<Node<qsizetype, QHashDummyValue>>));
+static_assert(sizeof(Span<Node1>) == sizeof(Span<Node<QString, QVariant>>));
+static_assert(sizeof(Span<Node1>) > SpanConstants::NEntries);
+static_assert(qNextPowerOfTwo(sizeof(Span<Node1>)) == SpanConstants::NEntries * 2);
+
+// ensure allocations are always a power of two, at a minimum NEntries,
+// obeying the fomula
+// qNextPowerOfTwo(2 * N);
+// without overflowing
+static constexpr size_t NEntries = SpanConstants::NEntries;
+static_assert(GrowthPolicy::bucketsForCapacity(1) == NEntries);
+static_assert(GrowthPolicy::bucketsForCapacity(NEntries / 2 + 0) == NEntries);
+static_assert(GrowthPolicy::bucketsForCapacity(NEntries / 2 + 1) == 2 * NEntries);
+static_assert(GrowthPolicy::bucketsForCapacity(NEntries * 1 - 1) == 2 * NEntries);
+static_assert(GrowthPolicy::bucketsForCapacity(NEntries * 1 + 0) == 4 * NEntries);
+static_assert(GrowthPolicy::bucketsForCapacity(NEntries * 1 + 1) == 4 * NEntries);
+static_assert(GrowthPolicy::bucketsForCapacity(NEntries * 2 - 1) == 4 * NEntries);
+static_assert(GrowthPolicy::bucketsForCapacity(NEntries * 2 + 0) == 8 * NEntries);
+static_assert(GrowthPolicy::bucketsForCapacity(SIZE_MAX / 4) == SIZE_MAX / 2 + 1);
+static_assert(GrowthPolicy::bucketsForCapacity(SIZE_MAX / 2) == SIZE_MAX);
+static_assert(GrowthPolicy::bucketsForCapacity(SIZE_MAX) == SIZE_MAX);
+}
+#endif
+
QT_END_NAMESPACE
diff --git a/src/corelib/tools/qhash.h b/src/corelib/tools/qhash.h
index d9dfda71c1..e7cd4123fb 100644
--- a/src/corelib/tools/qhash.h
+++ b/src/corelib/tools/qhash.h
@@ -1,51 +1,15 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Copyright (C) 2020 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// Copyright (C) 2020 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QHASH_H
#define QHASH_H
+#include <QtCore/qalgorithms.h>
#include <QtCore/qcontainertools_impl.h>
#include <QtCore/qhashfunctions.h>
#include <QtCore/qiterator.h>
#include <QtCore/qlist.h>
-#include <QtCore/qmath.h>
#include <QtCore/qrefcount.h>
#include <initializer_list>
@@ -208,7 +172,7 @@ struct MultiNode
MultiNode(MultiNode &&other)
: key(other.key),
- value(qExchange(other.value, nullptr))
+ value(std::exchange(other.value, nullptr))
{
}
@@ -239,7 +203,7 @@ struct MultiNode
void insertMulti(Args &&... args)
{
Chain *e = new Chain{ T(std::forward<Args>(args)...), nullptr };
- e->next = qExchange(value, e);
+ e->next = std::exchange(value, e);
}
template<typename ...Args>
void emplaceValue(Args &&... args)
@@ -254,6 +218,15 @@ constexpr bool isRelocatable()
return QTypeInfo<typename Node::KeyType>::isRelocatable && QTypeInfo<typename Node::ValueType>::isRelocatable;
}
+struct SpanConstants {
+ static constexpr size_t SpanShift = 7;
+ static constexpr size_t NEntries = (1 << SpanShift);
+ static constexpr size_t LocalBucketMask = (NEntries - 1);
+ static constexpr size_t UnusedEntry = 0xff;
+
+ static_assert ((NEntries & LocalBucketMask) == 0, "NEntries must be a power of two.");
+};
+
// Regular hash tables consist of a list of buckets that can store Nodes. But simply allocating one large array of buckets
// would waste a lot of memory. To avoid this, we split the vector of buckets up into a vector of Spans. Each Span represents
// NEntries buckets. To quickly find the correct Span that holds a bucket, NEntries must be a power of two.
@@ -264,13 +237,6 @@ constexpr bool isRelocatable()
// table have a very small memory overhead compared to many other implementations.
template<typename Node>
struct Span {
- enum {
- NEntries = 128,
- LocalBucketMask = (NEntries - 1),
- UnusedEntry = 0xff
- };
- static_assert ((NEntries & LocalBucketMask) == 0, "EntriesPerSpan must be a power of two.");
-
// Entry is a slot available for storing a Node. The Span holds a pointer to
// an array of Entries. Upon construction of the array, those entries are
// unused, and nextFree() is being used to set up a singly linked list
@@ -278,19 +244,19 @@ struct Span {
// When a node gets inserted, the first free entry is being picked, removed
// from the singly linked list and the Node gets constructed in place.
struct Entry {
- typename std::aligned_storage<sizeof(Node), alignof(Node)>::type storage;
+ struct { alignas(Node) unsigned char data[sizeof(Node)]; } storage;
unsigned char &nextFree() { return *reinterpret_cast<unsigned char *>(&storage); }
Node &node() { return *reinterpret_cast<Node *>(&storage); }
};
- unsigned char offsets[NEntries];
+ unsigned char offsets[SpanConstants::NEntries];
Entry *entries = nullptr;
unsigned char allocated = 0;
unsigned char nextFree = 0;
Span() noexcept
{
- memset(offsets, UnusedEntry, sizeof(offsets));
+ memset(offsets, SpanConstants::UnusedEntry, sizeof(offsets));
}
~Span()
{
@@ -301,7 +267,7 @@ struct Span {
if (entries) {
if constexpr (!std::is_trivially_destructible<Node>::value) {
for (auto o : offsets) {
- if (o != UnusedEntry)
+ if (o != SpanConstants::UnusedEntry)
entries[o].node().~Node();
}
}
@@ -311,8 +277,8 @@ struct Span {
}
Node *insert(size_t i)
{
- Q_ASSERT(i <= NEntries);
- Q_ASSERT(offsets[i] == UnusedEntry);
+ Q_ASSERT(i < SpanConstants::NEntries);
+ Q_ASSERT(offsets[i] == SpanConstants::UnusedEntry);
if (nextFree == allocated)
addStorage();
unsigned char entry = nextFree;
@@ -323,11 +289,11 @@ struct Span {
}
void erase(size_t bucket) noexcept(std::is_nothrow_destructible<Node>::value)
{
- Q_ASSERT(bucket <= NEntries);
- Q_ASSERT(offsets[bucket] != UnusedEntry);
+ Q_ASSERT(bucket < SpanConstants::NEntries);
+ Q_ASSERT(offsets[bucket] != SpanConstants::UnusedEntry);
unsigned char entry = offsets[bucket];
- offsets[bucket] = UnusedEntry;
+ offsets[bucket] = SpanConstants::UnusedEntry;
entries[entry].node().~Node();
entries[entry].nextFree() = nextFree;
@@ -339,19 +305,19 @@ struct Span {
}
bool hasNode(size_t i) const noexcept
{
- return (offsets[i] != UnusedEntry);
+ return (offsets[i] != SpanConstants::UnusedEntry);
}
Node &at(size_t i) noexcept
{
- Q_ASSERT(i <= NEntries);
- Q_ASSERT(offsets[i] != UnusedEntry);
+ Q_ASSERT(i < SpanConstants::NEntries);
+ Q_ASSERT(offsets[i] != SpanConstants::UnusedEntry);
return entries[offsets[i]].node();
}
const Node &at(size_t i) const noexcept
{
- Q_ASSERT(i <= NEntries);
- Q_ASSERT(offsets[i] != UnusedEntry);
+ Q_ASSERT(i < SpanConstants::NEntries);
+ Q_ASSERT(offsets[i] != SpanConstants::UnusedEntry);
return entries[offsets[i]].node();
}
@@ -369,17 +335,17 @@ struct Span {
}
void moveLocal(size_t from, size_t to) noexcept
{
- Q_ASSERT(offsets[from] != UnusedEntry);
- Q_ASSERT(offsets[to] == UnusedEntry);
+ Q_ASSERT(offsets[from] != SpanConstants::UnusedEntry);
+ Q_ASSERT(offsets[to] == SpanConstants::UnusedEntry);
offsets[to] = offsets[from];
- offsets[from] = UnusedEntry;
+ offsets[from] = SpanConstants::UnusedEntry;
}
void moveFromSpan(Span &fromSpan, size_t fromIndex, size_t to) noexcept(std::is_nothrow_move_constructible_v<Node>)
{
- Q_ASSERT(to <= NEntries);
- Q_ASSERT(offsets[to] == UnusedEntry);
- Q_ASSERT(fromIndex <= NEntries);
- Q_ASSERT(fromSpan.offsets[fromIndex] != UnusedEntry);
+ Q_ASSERT(to < SpanConstants::NEntries);
+ Q_ASSERT(offsets[to] == SpanConstants::UnusedEntry);
+ Q_ASSERT(fromIndex < SpanConstants::NEntries);
+ Q_ASSERT(fromSpan.offsets[fromIndex] != SpanConstants::UnusedEntry);
if (nextFree == allocated)
addStorage();
Q_ASSERT(nextFree < allocated);
@@ -388,7 +354,7 @@ struct Span {
nextFree = toEntry.nextFree();
size_t fromOffset = fromSpan.offsets[fromIndex];
- fromSpan.offsets[fromIndex] = UnusedEntry;
+ fromSpan.offsets[fromIndex] = SpanConstants::UnusedEntry;
Entry &fromEntry = fromSpan.entries[fromOffset];
if constexpr (isRelocatable<Node>()) {
@@ -403,15 +369,28 @@ struct Span {
void addStorage()
{
- Q_ASSERT(allocated < NEntries);
+ Q_ASSERT(allocated < SpanConstants::NEntries);
Q_ASSERT(nextFree == allocated);
// the hash table should always be between 25 and 50% full
// this implies that we on average have between 32 and 64 entries
- // in here. The likelihood of having below 16 entries is very small,
- // so start with that and increment by 16 each time we need to add
- // some more space
- const size_t increment = NEntries / 8;
- size_t alloc = allocated + increment;
+ // in here. More exactly, we have a binominal distribution of the amount of
+ // occupied entries.
+ // For a 25% filled table, the average is 32 entries, with a 95% chance that we have between
+ // 23 and 41 entries.
+ // For a 50% filled table, the average is 64 entries, with a 95% chance that we have between
+ // 53 and 75 entries.
+ // Since we only resize the table once it's 50% filled and we want to avoid copies of
+ // data where possible, we initially allocate 48 entries, then resize to 80 entries, after that
+ // resize by increments of 16. That way, we usually only get one resize of the table
+ // while filling it.
+ size_t alloc;
+ static_assert(SpanConstants::NEntries % 8 == 0);
+ if (!allocated)
+ alloc = SpanConstants::NEntries / 8 * 3;
+ else if (allocated == SpanConstants::NEntries / 8 * 3)
+ alloc = SpanConstants::NEntries / 8 * 5;
+ else
+ alloc = allocated + SpanConstants::NEntries/8;
Entry *newEntries = new Entry[alloc];
// we only add storage if the previous storage was fully filled, so
// simply copy the old data over
@@ -424,7 +403,7 @@ struct Span {
entries[i].node().~Node();
}
}
- for (size_t i = allocated; i < allocated + increment; ++i) {
+ for (size_t i = allocated; i < alloc; ++i) {
newEntries[i].nextFree() = uchar(i + 1);
}
delete[] entries;
@@ -435,28 +414,25 @@ struct Span {
// QHash uses a power of two growth policy.
namespace GrowthPolicy {
-inline constexpr size_t maxNumBuckets() noexcept
-{
- // ensure the size of a Span does not depend on the template parameters
- using Node1 = Node<int, int>;
- using Node2 = Node<char, void *>;
- using Node3 = Node<qsizetype, QHashDummyValue>;
- static_assert(sizeof(Span<Node1>) == sizeof(Span<Node2>));
- static_assert(sizeof(Span<Node1>) == sizeof(Span<Node3>));
- static_assert(int(Span<Node1>::NEntries) == int(Span<Node2>::NEntries));
- static_assert(int(Span<Node1>::NEntries) == int(Span<Node3>::NEntries));
-
- // Maximum is 2^31-1 or 2^63-1 bytes (limited by qsizetype and ptrdiff_t)
- size_t max = (std::numeric_limits<ptrdiff_t>::max)();
- return max / sizeof(Span<Node1>) * Span<Node1>::NEntries;
-}
inline constexpr size_t bucketsForCapacity(size_t requestedCapacity) noexcept
{
- if (requestedCapacity <= 8)
- return 16;
- if (requestedCapacity >= maxNumBuckets())
- return maxNumBuckets();
- return qNextPowerOfTwo(QIntegerForSize<sizeof(size_t)>::Unsigned(2 * requestedCapacity - 1));
+ constexpr int SizeDigits = std::numeric_limits<size_t>::digits;
+
+ // We want to use at minimum a full span (128 entries), so we hardcode it for any requested
+ // capacity <= 64. Any capacity above that gets rounded to a later power of two.
+ if (requestedCapacity <= 64)
+ return SpanConstants::NEntries;
+
+ // Same as
+ // qNextPowerOfTwo(2 * requestedCapacity);
+ //
+ // but ensuring neither our multiplication nor the function overflow.
+ // Additionally, the maximum memory allocation is 2^31-1 or 2^63-1 bytes
+ // (limited by qsizetype and ptrdiff_t).
+ int count = qCountLeadingZeroBits(requestedCapacity);
+ if (count < 2)
+ return (std::numeric_limits<size_t>::max)(); // will cause std::bad_alloc
+ return size_t(1) << (SizeDigits - count + 1);
}
inline constexpr size_t bucketForHash(size_t nBuckets, size_t hash) noexcept
{
@@ -479,44 +455,148 @@ struct Data
size_t size = 0;
size_t numBuckets = 0;
size_t seed = 0;
+ Span *spans = nullptr;
+ static constexpr size_t maxNumBuckets() noexcept
+ {
+ return (std::numeric_limits<ptrdiff_t>::max)() / sizeof(Span);
+ }
- Span *spans = nullptr;
+ struct Bucket {
+ Span *span;
+ size_t index;
+
+ Bucket(Span *s, size_t i) noexcept
+ : span(s), index(i)
+ {}
+ Bucket(const Data *d, size_t bucket) noexcept
+ : span(d->spans + (bucket >> SpanConstants::SpanShift)),
+ index(bucket & SpanConstants::LocalBucketMask)
+ {}
+ Bucket(iterator it) noexcept
+ : Bucket(it.d, it.bucket)
+ {}
+
+ size_t toBucketIndex(const Data *d) const noexcept
+ {
+ return ((span - d->spans) << SpanConstants::SpanShift) | index;
+ }
+ iterator toIterator(const Data *d) const noexcept { return iterator{d, toBucketIndex(d)}; }
+ void advanceWrapped(const Data *d) noexcept
+ {
+ advance_impl(d, d->spans);
+ }
+ void advance(const Data *d) noexcept
+ {
+ advance_impl(d, nullptr);
+ }
+ bool isUnused() const noexcept
+ {
+ return !span->hasNode(index);
+ }
+ size_t offset() const noexcept
+ {
+ return span->offset(index);
+ }
+ Node &nodeAtOffset(size_t offset)
+ {
+ return span->atOffset(offset);
+ }
+ Node *node()
+ {
+ return &span->at(index);
+ }
+ Node *insert() const
+ {
+ return span->insert(index);
+ }
+
+ private:
+ friend bool operator==(Bucket lhs, Bucket rhs) noexcept
+ {
+ return lhs.span == rhs.span && lhs.index == rhs.index;
+ }
+ friend bool operator!=(Bucket lhs, Bucket rhs) noexcept { return !(lhs == rhs); }
+
+ void advance_impl(const Data *d, Span *whenAtEnd) noexcept
+ {
+ Q_ASSERT(span);
+ ++index;
+ if (Q_UNLIKELY(index == SpanConstants::NEntries)) {
+ index = 0;
+ ++span;
+ if (span - d->spans == ptrdiff_t(d->numBuckets >> SpanConstants::SpanShift))
+ span = whenAtEnd;
+ }
+ }
+ };
+
+ static auto allocateSpans(size_t numBuckets)
+ {
+ struct R {
+ Span *spans;
+ size_t nSpans;
+ };
+
+ constexpr qptrdiff MaxSpanCount = (std::numeric_limits<qptrdiff>::max)() / sizeof(Span);
+ constexpr size_t MaxBucketCount = MaxSpanCount << SpanConstants::SpanShift;
+
+ if (numBuckets > MaxBucketCount) {
+ Q_CHECK_PTR(false);
+ Q_UNREACHABLE(); // no exceptions and no assertions -> no error reporting
+ }
+
+ size_t nSpans = numBuckets >> SpanConstants::SpanShift;
+ return R{ new Span[nSpans], nSpans };
+ }
Data(size_t reserve = 0)
{
numBuckets = GrowthPolicy::bucketsForCapacity(reserve);
- size_t nSpans = (numBuckets + Span::LocalBucketMask) / Span::NEntries;
- spans = new Span[nSpans];
+ spans = allocateSpans(numBuckets).spans;
seed = QHashSeed::globalSeed();
}
- Data(const Data &other, size_t reserved = 0)
- : size(other.size),
- numBuckets(other.numBuckets),
- seed(other.seed)
- {
- if (reserved)
- numBuckets = GrowthPolicy::bucketsForCapacity(qMax(size, reserved));
- bool resized = numBuckets != other.numBuckets;
- size_t nSpans = (numBuckets + Span::LocalBucketMask) / Span::NEntries;
- spans = new Span[nSpans];
- size_t otherNSpans = (other.numBuckets + Span::LocalBucketMask) / Span::NEntries;
- for (size_t s = 0; s < otherNSpans; ++s) {
+ void reallocationHelper(const Data &other, size_t nSpans, bool resized)
+ {
+ for (size_t s = 0; s < nSpans; ++s) {
const Span &span = other.spans[s];
- for (size_t index = 0; index < Span::NEntries; ++index) {
+ for (size_t index = 0; index < SpanConstants::NEntries; ++index) {
if (!span.hasNode(index))
continue;
const Node &n = span.at(index);
- iterator it = resized ? find(n.key) : iterator{ this, s*Span::NEntries + index };
+ auto it = resized ? findBucket(n.key) : Bucket { spans + s, index };
Q_ASSERT(it.isUnused());
- Node *newNode = spans[it.span()].insert(it.index());
+ Node *newNode = it.insert();
new (newNode) Node(n);
}
}
}
- static Data *detached(Data *d, size_t size = 0)
+ Data(const Data &other) : size(other.size), numBuckets(other.numBuckets), seed(other.seed)
+ {
+ auto r = allocateSpans(numBuckets);
+ spans = r.spans;
+ reallocationHelper(other, r.nSpans, false);
+ }
+ Data(const Data &other, size_t reserved) : size(other.size), seed(other.seed)
+ {
+ numBuckets = GrowthPolicy::bucketsForCapacity(qMax(size, reserved));
+ spans = allocateSpans(numBuckets).spans;
+ size_t otherNSpans = other.numBuckets >> SpanConstants::SpanShift;
+ reallocationHelper(other, otherNSpans, numBuckets != other.numBuckets);
+ }
+
+ static Data *detached(Data *d)
+ {
+ if (!d)
+ return new Data;
+ Data *dd = new Data(*d);
+ if (!d->ref.deref())
+ delete d;
+ return dd;
+ }
+ static Data *detached(Data *d, size_t size)
{
if (!d)
return new Data(size);
@@ -560,20 +640,19 @@ struct Data
Span *oldSpans = spans;
size_t oldBucketCount = numBuckets;
- size_t nSpans = (newBucketCount + Span::LocalBucketMask) / Span::NEntries;
- spans = new Span[nSpans];
+ spans = allocateSpans(newBucketCount).spans;
numBuckets = newBucketCount;
- size_t oldNSpans = (oldBucketCount + Span::LocalBucketMask) / Span::NEntries;
+ size_t oldNSpans = oldBucketCount >> SpanConstants::SpanShift;
for (size_t s = 0; s < oldNSpans; ++s) {
Span &span = oldSpans[s];
- for (size_t index = 0; index < Span::NEntries; ++index) {
+ for (size_t index = 0; index < SpanConstants::NEntries; ++index) {
if (!span.hasNode(index))
continue;
Node &n = span.at(index);
- iterator it = find(n.key);
+ auto it = findBucket(n.key);
Q_ASSERT(it.isUnused());
- Node *newNode = spans[it.span()].insert(it.index());
+ Node *newNode = it.insert();
new (newNode) Node(std::move(n));
}
span.freeData();
@@ -598,39 +677,34 @@ struct Data
return size >= (numBuckets >> 1);
}
- iterator find(const Key &key) const noexcept
+ template <typename K> Bucket findBucket(const K &key) const noexcept
{
+ static_assert(std::is_same_v<std::remove_cv_t<Key>, K> ||
+ QHashHeterogeneousSearch<std::remove_cv_t<Key>, K>::value);
Q_ASSERT(numBuckets > 0);
size_t hash = QHashPrivate::calculateHash(key, seed);
- size_t bucket = GrowthPolicy::bucketForHash(numBuckets, hash);
+ Bucket bucket(this, GrowthPolicy::bucketForHash(numBuckets, hash));
// loop over the buckets until we find the entry we search for
// or an empty slot, in which case we know the entry doesn't exist
while (true) {
- // Split the bucket into the indexex of span array, and the local
- // offset inside the span
- size_t span = bucket / Span::NEntries;
- size_t index = bucket & Span::LocalBucketMask;
- Span &s = spans[span];
- size_t offset = s.offset(index);
- if (offset == Span::UnusedEntry) {
- return iterator{ this, bucket };
+ size_t offset = bucket.offset();
+ if (offset == SpanConstants::UnusedEntry) {
+ return bucket;
} else {
- Node &n = s.atOffset(offset);
+ Node &n = bucket.nodeAtOffset(offset);
if (qHashEquals(n.key, key))
- return iterator{ this, bucket };
+ return bucket;
}
- bucket = nextBucket(bucket);
+ bucket.advanceWrapped(this);
}
}
- Node *findNode(const Key &key) const noexcept
+ template <typename K> Node *findNode(const K &key) const noexcept
{
- if (!size)
+ auto bucket = findBucket(key);
+ if (bucket.isUnused())
return nullptr;
- iterator it = find(key);
- if (it.isUnused())
- return nullptr;
- return it.node();
+ return bucket.node();
}
struct InsertionResult
@@ -639,64 +713,58 @@ struct Data
bool initialized;
};
- InsertionResult findOrInsert(const Key &key) noexcept
+ template <typename K> InsertionResult findOrInsert(const K &key) noexcept
{
- if (shouldGrow())
+ Bucket it(static_cast<Span *>(nullptr), 0);
+ if (numBuckets > 0) {
+ it = findBucket(key);
+ if (!it.isUnused())
+ return { it.toIterator(this), true };
+ }
+ if (shouldGrow()) {
rehash(size + 1);
- iterator it = find(key);
- if (it.isUnused()) {
- spans[it.span()].insert(it.index());
- ++size;
- return { it, false };
+ it = findBucket(key); // need to get a new iterator after rehashing
}
- return { it, true };
+ Q_ASSERT(it.span != nullptr);
+ Q_ASSERT(it.isUnused());
+ it.insert();
+ ++size;
+ return { it.toIterator(this), false };
}
- iterator erase(iterator it) noexcept(std::is_nothrow_destructible<Node>::value)
+ void erase(Bucket bucket) noexcept(std::is_nothrow_destructible<Node>::value)
{
- size_t bucket = it.bucket;
- size_t span = bucket / Span::NEntries;
- size_t index = bucket & Span::LocalBucketMask;
- Q_ASSERT(spans[span].hasNode(index));
- spans[span].erase(index);
+ Q_ASSERT(bucket.span->hasNode(bucket.index));
+ bucket.span->erase(bucket.index);
--size;
// re-insert the following entries to avoid holes
- size_t hole = bucket;
- size_t next = bucket;
+ Bucket next = bucket;
while (true) {
- next = nextBucket(next);
- size_t nextSpan = next / Span::NEntries;
- size_t nextIndex = next & Span::LocalBucketMask;
- if (!spans[nextSpan].hasNode(nextIndex))
- break;
- size_t hash = QHashPrivate::calculateHash(spans[nextSpan].at(nextIndex).key, seed);
- size_t newBucket = GrowthPolicy::bucketForHash(numBuckets, hash);
+ next.advanceWrapped(this);
+ size_t offset = next.offset();
+ if (offset == SpanConstants::UnusedEntry)
+ return;
+ size_t hash = QHashPrivate::calculateHash(next.nodeAtOffset(offset).key, seed);
+ Bucket newBucket(this, GrowthPolicy::bucketForHash(numBuckets, hash));
while (true) {
if (newBucket == next) {
// nothing to do, item is at the right plae
break;
- } else if (newBucket == hole) {
- // move into hole
- size_t holeSpan = hole / Span::NEntries;
- size_t holeIndex = hole & Span::LocalBucketMask;
- if (nextSpan == holeSpan) {
- spans[holeSpan].moveLocal(nextIndex, holeIndex);
+ } else if (newBucket == bucket) {
+ // move into the hole we created earlier
+ if (next.span == bucket.span) {
+ bucket.span->moveLocal(next.index, bucket.index);
} else {
// move between spans, more expensive
- spans[holeSpan].moveFromSpan(spans[nextSpan], nextIndex, holeIndex);
+ bucket.span->moveFromSpan(*next.span, next.index, bucket.index);
}
- hole = next;
+ bucket = next;
break;
}
- newBucket = nextBucket(newBucket);
+ newBucket.advanceWrapped(this);
}
}
-
- // return correct position of the next element
- if (bucket == numBuckets - 1 || !spans[span].hasNode(index))
- ++it;
- return it;
}
~Data()
@@ -712,8 +780,8 @@ struct iterator {
const Data<Node> *d = nullptr;
size_t bucket = 0;
- size_t span() const noexcept { return bucket / Span::NEntries; }
- size_t index() const noexcept { return bucket & Span::LocalBucketMask; }
+ size_t span() const noexcept { return bucket >> SpanConstants::SpanShift; }
+ size_t index() const noexcept { return bucket & SpanConstants::LocalBucketMask; }
inline bool isUnused() const noexcept { return !d->spans[span()].hasNode(index()); }
inline Node *node() const noexcept
@@ -829,9 +897,9 @@ public:
insert(f->first, f->second);
}
#endif
- void swap(QHash &other) noexcept { qSwap(d, other.d); }
+ void swap(QHash &other) noexcept { qt_ptr_swap(d, other.d); }
-#ifndef Q_CLANG_QDOC
+#ifndef Q_QDOC
template <typename AKey = Key, typename AT = T>
QTypeTraits::compare_eq_result_container<QHash, AKey, AT> operator==(const QHash &other) const noexcept
{
@@ -854,7 +922,7 @@ public:
#else
bool operator==(const QHash &other) const;
bool operator!=(const QHash &other) const;
-#endif // Q_CLANG_QDOC
+#endif // Q_QDOC
inline qsizetype size() const noexcept { return d ? qsizetype(d->size) : 0; }
inline bool isEmpty() const noexcept { return !d || d->size == 0; }
@@ -862,6 +930,9 @@ public:
inline qsizetype capacity() const noexcept { return d ? qsizetype(d->numBuckets >> 1) : 0; }
void reserve(qsizetype size)
{
+ // reserve(0) is used in squeeze()
+ if (size && (this->capacity() >= size))
+ return;
if (isDetached())
d->rehash(size);
else
@@ -886,29 +957,44 @@ public:
bool remove(const Key &key)
{
+ return removeImpl(key);
+ }
+private:
+ template <typename K> bool removeImpl(const K &key)
+ {
if (isEmpty()) // prevents detaching shared null
return false;
- auto it = d->find(key);
+ auto it = d->findBucket(key);
+ size_t bucket = it.toBucketIndex(d);
detach();
- it = d->detachedIterator(it);
+ it = typename Data::Bucket(d, bucket); // reattach in case of detach
if (it.isUnused())
return false;
d->erase(it);
return true;
}
+
+public:
template <typename Predicate>
qsizetype removeIf(Predicate pred)
{
return QtPrivate::associative_erase_if(*this, pred);
}
+
T take(const Key &key)
{
+ return takeImpl(key);
+ }
+private:
+ template <typename K> T takeImpl(const K &key)
+ {
if (isEmpty()) // prevents detaching shared null
return T();
- auto it = d->find(key);
+ auto it = d->findBucket(key);
+ size_t bucket = it.toBucketIndex(d);
detach();
- it = d->detachedIterator(it);
+ it = typename Data::Bucket(d, bucket); // reattach in case of detach
if (it.isUnused())
return T();
@@ -917,6 +1003,7 @@ public:
return value;
}
+public:
bool contains(const Key &key) const noexcept
{
if (!d)
@@ -929,74 +1016,68 @@ public:
}
private:
- const Key *keyImpl(const T &value) const noexcept
+ template <typename Fn> Key keyImpl(const T &value, Fn &&defaultFn) const noexcept
{
if (d) {
const_iterator i = begin();
while (i != end()) {
if (i.value() == value)
- return &i.key();
+ return i.key();
++i;
}
}
- return nullptr;
+ return defaultFn();
}
public:
Key key(const T &value) const noexcept
{
- if (auto *k = keyImpl(value))
- return *k;
- else
- return Key();
+ return keyImpl(value, [] { return Key(); });
}
Key key(const T &value, const Key &defaultKey) const noexcept
{
- if (auto *k = keyImpl(value))
- return *k;
- else
- return defaultKey;
+ return keyImpl(value, [&] { return defaultKey; });
}
private:
- T *valueImpl(const Key &key) const noexcept
+ template <typename K, typename Fn> T valueImpl(const K &key, Fn &&defaultValue) const noexcept
{
if (d) {
Node *n = d->findNode(key);
if (n)
- return &n->value;
+ return n->value;
}
- return nullptr;
+ return defaultValue();
}
public:
T value(const Key &key) const noexcept
{
- if (T *v = valueImpl(key))
- return *v;
- else
- return T();
+ return valueImpl(key, [] { return T(); });
}
T value(const Key &key, const T &defaultValue) const noexcept
{
- if (T *v = valueImpl(key))
- return *v;
- else
- return defaultValue;
+ return valueImpl(key, [&] { return defaultValue; });
}
T &operator[](const Key &key)
{
+ return operatorIndexImpl(key);
+ }
+private:
+ template <typename K> T &operatorIndexImpl(const K &key)
+ {
const auto copy = isDetached() ? QHash() : *this; // keep 'key' alive across the detach
detach();
auto result = d->findOrInsert(key);
Q_ASSERT(!result.it.atEnd());
if (!result.initialized)
- Node::createInPlace(result.it.node(), key, T());
+ Node::createInPlace(result.it.node(), Key(key), T());
return result.it.node()->value;
}
+public:
const T operator[](const Key &key) const noexcept
{
return value(key);
@@ -1144,6 +1225,10 @@ public:
inline const_key_value_iterator constKeyValueBegin() const noexcept { return const_key_value_iterator(begin()); }
inline const_key_value_iterator keyValueEnd() const noexcept { return const_key_value_iterator(end()); }
inline const_key_value_iterator constKeyValueEnd() const noexcept { return const_key_value_iterator(end()); }
+ auto asKeyValueRange() & { return QtPrivate::QKeyValueRange(*this); }
+ auto asKeyValueRange() const & { return QtPrivate::QKeyValueRange(*this); }
+ auto asKeyValueRange() && { return QtPrivate::QKeyValueRange(std::move(*this)); }
+ auto asKeyValueRange() const && { return QtPrivate::QKeyValueRange(std::move(*this)); }
iterator erase(const_iterator it)
{
@@ -1151,51 +1236,65 @@ public:
detach();
// ensure a valid iterator across the detach:
iterator i = iterator{d->detachedIterator(it.i)};
+ typename Data::Bucket bucket(i.i);
- i.i = d->erase(i.i);
+ d->erase(bucket);
+ if (bucket.toBucketIndex(d) == d->numBuckets - 1 || bucket.isUnused())
+ ++i;
return i;
}
- QPair<iterator, iterator> equal_range(const Key &key)
+ std::pair<iterator, iterator> equal_range(const Key &key)
{
- auto first = find(key);
- auto second = first;
- if (second != iterator())
- ++second;
- return qMakePair(first, second);
+ return equal_range_impl(*this, key);
}
-
- QPair<const_iterator, const_iterator> equal_range(const Key &key) const noexcept
+ std::pair<const_iterator, const_iterator> equal_range(const Key &key) const noexcept
{
- auto first = find(key);
+ return equal_range_impl(*this, key);
+ }
+private:
+ template <typename Hash, typename K> static auto equal_range_impl(Hash &self, const K &key)
+ {
+ auto first = self.find(key);
auto second = first;
- if (second != iterator())
+ if (second != decltype(first){})
++second;
- return qMakePair(first, second);
+ return std::make_pair(first, second);
}
- typedef iterator Iterator;
- typedef const_iterator ConstIterator;
- inline qsizetype count() const noexcept { return d ? qsizetype(d->size) : 0; }
- iterator find(const Key &key)
+ template <typename K> iterator findImpl(const K &key)
{
if (isEmpty()) // prevents detaching shared null
return end();
- auto it = d->find(key);
+ auto it = d->findBucket(key);
+ size_t bucket = it.toBucketIndex(d);
detach();
- it = d->detachedIterator(it);
+ it = typename Data::Bucket(d, bucket); // reattach in case of detach
if (it.isUnused())
- it = d->end();
- return iterator(it);
+ return end();
+ return iterator(it.toIterator(d));
}
- const_iterator find(const Key &key) const noexcept
+ template <typename K> const_iterator constFindImpl(const K &key) const noexcept
{
if (isEmpty())
return end();
- auto it = d->find(key);
+ auto it = d->findBucket(key);
if (it.isUnused())
- it = d->end();
- return const_iterator(it);
+ return end();
+ return const_iterator({d, it.toBucketIndex(d)});
+ }
+
+public:
+ typedef iterator Iterator;
+ typedef const_iterator ConstIterator;
+ inline qsizetype count() const noexcept { return d ? qsizetype(d->size) : 0; }
+ iterator find(const Key &key)
+ {
+ return findImpl(key);
+ }
+ const_iterator find(const Key &key) const noexcept
+ {
+ return constFindImpl(key);
}
const_iterator constFind(const Key &key) const noexcept
{
@@ -1245,7 +1344,7 @@ public:
float load_factor() const noexcept { return d ? d->loadFactor() : 0; }
static float max_load_factor() noexcept { return 0.5; }
size_t bucket_count() const noexcept { return d ? d->numBuckets : 0; }
- static size_t max_bucket_count() noexcept { return QHashPrivate::GrowthPolicy::maxNumBuckets(); }
+ static size_t max_bucket_count() noexcept { return Data::maxNumBuckets(); }
inline bool empty() const noexcept { return isEmpty(); }
@@ -1260,8 +1359,65 @@ private:
result.it.node()->emplaceValue(std::forward<Args>(args)...);
return iterator(result.it);
}
-};
+public:
+#ifdef __cpp_concepts
+ bool remove(const QHashPrivate::HeterogeneouslySearchableWith<Key> auto &key)
+ {
+ return removeImpl(key);
+ }
+ T take(const QHashPrivate::HeterogeneouslySearchableWith<Key> auto &key)
+ {
+ return takeImpl(key);
+ }
+ bool contains(const QHashPrivate::HeterogeneouslySearchableWith<Key> auto &key)
+ {
+ return d ? d->findNode(key) != nullptr : false;
+ }
+ qsizetype count(const QHashPrivate::HeterogeneouslySearchableWith<Key> auto &key)
+ {
+ return contains(key) ? 1 : 0;
+ }
+ T value(const QHashPrivate::HeterogeneouslySearchableWith<Key> auto &key) const noexcept
+ {
+ return valueImpl(key, [] { return T(); });
+ }
+ T value(const QHashPrivate::HeterogeneouslySearchableWith<Key> auto &key, const T &defaultValue) const noexcept
+ {
+ return valueImpl(key, [&] { return defaultValue; });
+ }
+ T &operator[](const QHashPrivate::HeterogeneouslySearchableWith<Key> auto &key)
+ {
+ return operatorIndexImpl(key);
+ }
+ const T operator[](const QHashPrivate::HeterogeneouslySearchableWith<Key> auto &key) const noexcept
+ {
+ return value(key);
+ }
+ std::pair<iterator, iterator>
+ equal_range(const QHashPrivate::HeterogeneouslySearchableWith<Key> auto &key)
+ {
+ return equal_range_impl(*this, key);
+ }
+ std::pair<const_iterator, const_iterator>
+ equal_range(const QHashPrivate::HeterogeneouslySearchableWith<Key> auto &key) const noexcept
+ {
+ return equal_range_impl(*this, key);
+ }
+ iterator find(const QHashPrivate::HeterogeneouslySearchableWith<Key> auto &key)
+ {
+ return findImpl(key);
+ }
+ const_iterator find(const QHashPrivate::HeterogeneouslySearchableWith<Key> auto &key) const noexcept
+ {
+ return constFindImpl(key);
+ }
+ const_iterator constFind(const QHashPrivate::HeterogeneouslySearchableWith<Key> auto &key) const noexcept
+ {
+ return find(key);
+ }
+#endif // __cpp_concepts
+};
template <typename Key, typename T>
@@ -1339,8 +1495,8 @@ public:
return *this;
}
QMultiHash(QMultiHash &&other) noexcept
- : d(qExchange(other.d, nullptr)),
- m_size(qExchange(other.m_size, 0))
+ : d(std::exchange(other.d, nullptr)),
+ m_size(std::exchange(other.m_size, 0))
{
}
QMultiHash &operator=(QMultiHash &&other) noexcept(std::is_nothrow_destructible<Node>::value)
@@ -1358,9 +1514,14 @@ public:
{
unite(std::move(other));
}
- void swap(QMultiHash &other) noexcept { qSwap(d, other.d); qSwap(m_size, other.m_size); }
-#ifndef Q_CLANG_QDOC
+ void swap(QMultiHash &other) noexcept
+ {
+ qt_ptr_swap(d, other.d);
+ std::swap(m_size, other.m_size);
+ }
+
+#ifndef Q_QDOC
template <typename AKey = Key, typename AT = T>
QTypeTraits::compare_eq_result_container<QMultiHash, AKey, AT> operator==(const QMultiHash &other) const noexcept
{
@@ -1401,7 +1562,7 @@ public:
#else
bool operator==(const QMultiHash &other) const;
bool operator!=(const QMultiHash &other) const;
-#endif // Q_CLANG_QDOC
+#endif // Q_QDOC
inline qsizetype size() const noexcept { return m_size; }
@@ -1410,6 +1571,9 @@ public:
inline qsizetype capacity() const noexcept { return d ? qsizetype(d->numBuckets >> 1) : 0; }
void reserve(qsizetype size)
{
+ // reserve(0) is used in squeeze()
+ if (size && (this->capacity() >= size))
+ return;
if (isDetached())
d->rehash(size);
else
@@ -1431,11 +1595,17 @@ public:
qsizetype remove(const Key &key)
{
+ return removeImpl(key);
+ }
+private:
+ template <typename K> qsizetype removeImpl(const K &key)
+ {
if (isEmpty()) // prevents detaching shared null
return 0;
- auto it = d->find(key);
+ auto it = d->findBucket(key);
+ size_t bucket = it.toBucketIndex(d);
detach();
- it = d->detachedIterator(it);
+ it = typename Data::Bucket(d, bucket); // reattach in case of detach
if (it.isUnused())
return 0;
@@ -1445,18 +1615,27 @@ public:
d->erase(it);
return n;
}
+
+public:
template <typename Predicate>
qsizetype removeIf(Predicate pred)
{
return QtPrivate::associative_erase_if(*this, pred);
}
+
T take(const Key &key)
{
+ return takeImpl(key);
+ }
+private:
+ template <typename K> T takeImpl(const K &key)
+ {
if (isEmpty()) // prevents detaching shared null
return T();
- auto it = d->find(key);
+ auto it = d->findBucket(key);
+ size_t bucket = it.toBucketIndex(d);
detach();
- it = d->detachedIterator(it);
+ it = typename Data::Bucket(d, bucket); // reattach in case of detach
if (it.isUnused())
return T();
@@ -1475,6 +1654,7 @@ public:
return t;
}
+public:
bool contains(const Key &key) const noexcept
{
if (!d)
@@ -1483,75 +1663,71 @@ public:
}
private:
- const Key *keyImpl(const T &value) const noexcept
+ template <typename Fn> Key keyImpl(const T &value, Fn &&defaultValue) const noexcept
{
if (d) {
auto i = d->begin();
while (i != d->end()) {
Chain *e = i.node()->value;
if (e->contains(value))
- return &i.node()->key;
+ return i.node()->key;
++i;
}
}
- return nullptr;
+ return defaultValue();
}
public:
Key key(const T &value) const noexcept
{
- if (auto *k = keyImpl(value))
- return *k;
- else
- return Key();
+ return keyImpl(value, [] { return Key(); });
}
Key key(const T &value, const Key &defaultKey) const noexcept
{
- if (auto *k = keyImpl(value))
- return *k;
- else
- return defaultKey;
+ return keyImpl(value, [&] { return defaultKey; });
}
private:
- T *valueImpl(const Key &key) const noexcept
+ template <typename K, typename Fn> T valueImpl(const K &key, Fn &&defaultValue) const noexcept
{
if (d) {
Node *n = d->findNode(key);
if (n) {
Q_ASSERT(n->value);
- return &n->value->value;
+ return n->value->value;
}
}
- return nullptr;
+ return defaultValue();
}
public:
T value(const Key &key) const noexcept
{
- if (auto *v = valueImpl(key))
- return *v;
- else
- return T();
+ return valueImpl(key, [] { return T(); });
}
T value(const Key &key, const T &defaultValue) const noexcept
{
- if (auto *v = valueImpl(key))
- return *v;
- else
- return defaultValue;
+ return valueImpl(key, [&] { return defaultValue; });
}
T &operator[](const Key &key)
{
+ return operatorIndexImpl(key);
+ }
+private:
+ template <typename K> T &operatorIndexImpl(const K &key)
+ {
const auto copy = isDetached() ? QMultiHash() : *this; // keep 'key' alive across the detach
detach();
auto result = d->findOrInsert(key);
Q_ASSERT(!result.it.atEnd());
- if (!result.initialized)
- Node::createInPlace(result.it.node(), key, T());
+ if (!result.initialized) {
+ Node::createInPlace(result.it.node(), Key(key), T());
+ ++m_size;
+ }
return result.it.node()->value->value;
}
+public:
const T operator[](const Key &key) const noexcept
{
return value(key);
@@ -1582,9 +1758,15 @@ public:
}
return res;
}
+
QList<T> values() const { return QList<T>(begin(), end()); }
QList<T> values(const Key &key) const
{
+ return valuesImpl(key);
+ }
+private:
+ template <typename K> QList<T> valuesImpl(const K &key) const
+ {
QList<T> values;
if (d) {
Node *n = d->findNode(key);
@@ -1599,6 +1781,7 @@ public:
return values;
}
+public:
class const_iterator;
class iterator
@@ -1748,6 +1931,10 @@ public:
inline const_key_value_iterator constKeyValueBegin() const noexcept { return const_key_value_iterator(begin()); }
inline const_key_value_iterator keyValueEnd() const noexcept { return const_key_value_iterator(end()); }
inline const_key_value_iterator constKeyValueEnd() const noexcept { return const_key_value_iterator(end()); }
+ auto asKeyValueRange() & { return QtPrivate::QKeyValueRange(*this); }
+ auto asKeyValueRange() const & { return QtPrivate::QKeyValueRange(*this); }
+ auto asKeyValueRange() && { return QtPrivate::QKeyValueRange(std::move(*this)); }
+ auto asKeyValueRange() const && { return QtPrivate::QKeyValueRange(std::move(*this)); }
iterator detach(const_iterator it)
{
@@ -1787,7 +1974,12 @@ public:
if (!next) {
if (i.e == &i.i.node()->value) {
// last remaining entry, erase
- i = iterator(d->erase(i.i));
+ typename Data::Bucket bucket(i.i);
+ d->erase(bucket);
+ if (bucket.toBucketIndex(d) == d->numBuckets - 1 || bucket.isUnused())
+ i = iterator(++iter.i);
+ else // 'i' currently has a nullptr chain. So, we must recreate it
+ i = iterator(bucket.toIterator(d));
} else {
i = iterator(++iter.i);
}
@@ -1801,31 +1993,44 @@ public:
typedef iterator Iterator;
typedef const_iterator ConstIterator;
inline qsizetype count() const noexcept { return size(); }
- iterator find(const Key &key)
+
+private:
+ template <typename K> iterator findImpl(const K &key)
{
if (isEmpty())
return end();
- auto it = d->find(key);
+ auto it = d->findBucket(key);
+ size_t bucket = it.toBucketIndex(d);
detach();
- it = d->detachedIterator(it);
+ it = typename Data::Bucket(d, bucket); // reattach in case of detach
if (it.isUnused())
- it = d->end();
- return iterator(it);
- }
- const_iterator find(const Key &key) const noexcept
- {
- return constFind(key);
+ return end();
+ return iterator(it.toIterator(d));
}
- const_iterator constFind(const Key &key) const noexcept
+ template <typename K> const_iterator constFindImpl(const K &key) const noexcept
{
if (isEmpty())
return end();
- auto it = d->find(key);
+ auto it = d->findBucket(key);
if (it.isUnused())
- it = d->end();
- return const_iterator(it);
+ return constEnd();
+ return const_iterator(it.toIterator(d));
+ }
+public:
+ iterator find(const Key &key)
+ {
+ return findImpl(key);
}
+ const_iterator constFind(const Key &key) const noexcept
+ {
+ return constFindImpl(key);
+ }
+ const_iterator find(const Key &key) const noexcept
+ {
+ return constFindImpl(key);
+ }
+
iterator insert(const Key &key, const T &value)
{
return emplace(key, value);
@@ -1855,7 +2060,7 @@ public:
float load_factor() const noexcept { return d ? d->loadFactor() : 0; }
static float max_load_factor() noexcept { return 0.5; }
size_t bucket_count() const noexcept { return d ? d->numBuckets : 0; }
- static size_t max_bucket_count() noexcept { return QHashPrivate::GrowthPolicy::maxNumBuckets(); }
+ static size_t max_bucket_count() noexcept { return Data::maxNumBuckets(); }
inline bool empty() const noexcept { return isEmpty(); }
@@ -1891,6 +2096,11 @@ public:
bool contains(const Key &key, const T &value) const noexcept
{
+ return containsImpl(key, value);
+ }
+private:
+ template <typename K> bool containsImpl(const K &key, const T &value) const noexcept
+ {
if (isEmpty())
return false;
auto n = d->findNode(key);
@@ -1899,13 +2109,20 @@ public:
return n->value->contains(value);
}
+public:
qsizetype remove(const Key &key, const T &value)
{
+ return removeImpl(key, value);
+ }
+private:
+ template <typename K> qsizetype removeImpl(const K &key, const T &value)
+ {
if (isEmpty()) // prevents detaching shared null
return 0;
- auto it = d->find(key);
+ auto it = d->findBucket(key);
+ size_t bucket = it.toBucketIndex(d);
detach();
- it = d->detachedIterator(it);
+ it = typename Data::Bucket(d, bucket); // reattach in case of detach
if (it.isUnused())
return 0;
@@ -1928,11 +2145,17 @@ public:
return n;
}
+public:
qsizetype count(const Key &key) const noexcept
{
+ return countImpl(key);
+ }
+private:
+ template <typename K> qsizetype countImpl(const K &key) const noexcept
+ {
if (!d)
return 0;
- auto it = d->find(key);
+ auto it = d->findBucket(key);
if (it.isUnused())
return 0;
qsizetype n = 0;
@@ -1945,11 +2168,17 @@ public:
return n;
}
+public:
qsizetype count(const Key &key, const T &value) const noexcept
{
+ return countImpl(key, value);
+ }
+private:
+ template <typename K> qsizetype countImpl(const K &key, const T &value) const noexcept
+ {
if (!d)
return 0;
- auto it = d->find(key);
+ auto it = d->findBucket(key);
if (it.isUnused())
return 0;
qsizetype n = 0;
@@ -1963,7 +2192,7 @@ public:
return n;
}
- iterator find(const Key &key, const T &value)
+ template <typename K> iterator findImpl(const K &key, const T &value)
{
if (isEmpty())
return end();
@@ -1972,11 +2201,7 @@ public:
auto it = constFind(key, value);
return iterator(it.i, it.e);
}
- const_iterator find(const Key &key, const T &value) const noexcept
- {
- return constFind(key, value);
- }
- const_iterator constFind(const Key &key, const T &value) const noexcept
+ template <typename K> const_iterator constFindImpl(const K &key, const T &value) const noexcept
{
const_iterator i(constFind(key));
const_iterator end(constEnd());
@@ -1988,6 +2213,21 @@ public:
return end;
}
+public:
+ iterator find(const Key &key, const T &value)
+ {
+ return findImpl(key, value);
+ }
+
+ const_iterator constFind(const Key &key, const T &value) const noexcept
+ {
+ return constFindImpl(key, value);
+ }
+ const_iterator find(const Key &key, const T &value) const noexcept
+ {
+ return constFind(key, value);
+ }
+
QMultiHash &unite(const QMultiHash &other)
{
if (isEmpty()) {
@@ -2023,28 +2263,39 @@ public:
return *this;
}
- QPair<iterator, iterator> equal_range(const Key &key)
+ std::pair<iterator, iterator> equal_range(const Key &key)
+ {
+ return equal_range_impl(key);
+ }
+private:
+ template <typename K> std::pair<iterator, iterator> equal_range_impl(const K &key)
{
const auto copy = isDetached() ? QMultiHash() : *this; // keep 'key' alive across the detach
detach();
- auto pair = qAsConst(*this).equal_range(key);
- return qMakePair(iterator(pair.first.i), iterator(pair.second.i));
+ auto pair = std::as_const(*this).equal_range(key);
+ return {iterator(pair.first.i), iterator(pair.second.i)};
}
- QPair<const_iterator, const_iterator> equal_range(const Key &key) const noexcept
+public:
+ std::pair<const_iterator, const_iterator> equal_range(const Key &key) const noexcept
+ {
+ return equal_range_impl(key);
+ }
+private:
+ template <typename K> std::pair<const_iterator, const_iterator> equal_range_impl(const K &key) const noexcept
{
if (!d)
- return qMakePair(end(), end());
+ return {end(), end()};
- auto it = d->find(key);
- if (it.isUnused())
- return qMakePair(end(), end());
+ auto bucket = d->findBucket(key);
+ if (bucket.isUnused())
+ return {end(), end()};
+ auto it = bucket.toIterator(d);
auto end = it;
++end;
- return qMakePair(const_iterator(it), const_iterator(end));
+ return {const_iterator(it), const_iterator(end)};
}
-private:
void detach_helper()
{
if (!d) {
@@ -2081,6 +2332,94 @@ private:
}
return iterator(result.it);
}
+
+public:
+#ifdef __cpp_concepts
+ qsizetype remove(const QHashPrivate::HeterogeneouslySearchableWith<Key> auto &key)
+ {
+ return removeImpl(key);
+ }
+ T take(const QHashPrivate::HeterogeneouslySearchableWith<Key> auto &key)
+ {
+ return takeImpl(key);
+ }
+ bool contains(const QHashPrivate::HeterogeneouslySearchableWith<Key> auto &key) const noexcept
+ {
+ if (!d)
+ return false;
+ return d->findNode(key) != nullptr;
+ }
+ T value(const QHashPrivate::HeterogeneouslySearchableWith<Key> auto &key) const noexcept
+ {
+ return valueImpl(key, [] { return T(); });
+ }
+ T value(const QHashPrivate::HeterogeneouslySearchableWith<Key> auto &key, const T &defaultValue) const noexcept
+ {
+ return valueImpl(key, [&] { return defaultValue; });
+ }
+ T &operator[](const QHashPrivate::HeterogeneouslySearchableWith<Key> auto &key)
+ {
+ return operatorIndexImpl(key);
+ }
+ const T operator[](const QHashPrivate::HeterogeneouslySearchableWith<Key> auto &key) const noexcept
+ {
+ return value(key);
+ }
+ QList<T> values(const QHashPrivate::HeterogeneouslySearchableWith<Key> auto &key)
+ {
+ return valuesImpl(key);
+ }
+ iterator find(const QHashPrivate::HeterogeneouslySearchableWith<Key> auto &key)
+ {
+ return findImpl(key);
+ }
+ const_iterator constFind(const QHashPrivate::HeterogeneouslySearchableWith<Key> auto &key) const noexcept
+ {
+ return constFindImpl(key);
+ }
+ const_iterator find(const QHashPrivate::HeterogeneouslySearchableWith<Key> auto &key) const noexcept
+ {
+ return constFindImpl(key);
+ }
+ bool contains(const QHashPrivate::HeterogeneouslySearchableWith<Key> auto &key, const T &value) const noexcept
+ {
+ return containsImpl(key, value);
+ }
+ qsizetype remove(const QHashPrivate::HeterogeneouslySearchableWith<Key> auto &key, const T &value)
+ {
+ return removeImpl(key, value);
+ }
+ qsizetype count(const QHashPrivate::HeterogeneouslySearchableWith<Key> auto &key) const noexcept
+ {
+ return countImpl(key);
+ }
+ qsizetype count(const QHashPrivate::HeterogeneouslySearchableWith<Key> auto &key, const T &value) const noexcept
+ {
+ return countImpl(key, value);
+ }
+ iterator find(const QHashPrivate::HeterogeneouslySearchableWith<Key> auto &key, const T &value)
+ {
+ return findImpl(key, value);
+ }
+ const_iterator constFind(const QHashPrivate::HeterogeneouslySearchableWith<Key> auto &key, const T &value) const noexcept
+ {
+ return constFindImpl(key, value);
+ }
+ const_iterator find(const QHashPrivate::HeterogeneouslySearchableWith<Key> auto &key, const T &value) const noexcept
+ {
+ return constFind(key, value);
+ }
+ std::pair<iterator, iterator>
+ equal_range(const QHashPrivate::HeterogeneouslySearchableWith<Key> auto &key)
+ {
+ return equal_range_impl(key);
+ }
+ std::pair<const_iterator, const_iterator>
+ equal_range(const QHashPrivate::HeterogeneouslySearchableWith<Key> auto &key) const noexcept
+ {
+ return equal_range_impl(key);
+ }
+#endif // __cpp_concepts
};
Q_DECLARE_ASSOCIATIVE_FORWARD_ITERATOR(Hash)
diff --git a/src/corelib/tools/qhashfunctions.h b/src/corelib/tools/qhashfunctions.h
index 4d0b2d9519..90a269deaa 100644
--- a/src/corelib/tools/qhashfunctions.h
+++ b/src/corelib/tools/qhashfunctions.h
@@ -1,51 +1,21 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2015 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2015 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>
+// Copyright (C) 2024 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QHASHFUNCTIONS_H
#define QHASHFUNCTIONS_H
#include <QtCore/qstring.h>
-#include <QtCore/qpair.h>
+#include <QtCore/qstringfwd.h>
#include <numeric> // for std::accumulate
#include <functional> // for std::hash
+#include <utility> // For std::pair
+
+#ifdef __cpp_concepts
+# include <concepts>
+#endif
#if 0
#pragma qt_class(QHashFunctions)
@@ -60,9 +30,6 @@
QT_BEGIN_NAMESPACE
class QBitArray;
-class QByteArray;
-class QString;
-class QLatin1String;
#if QT_DEPRECATED_SINCE(6,6)
QT_DEPRECATED_VERSION_X_6_6("Use QHashSeed instead")
@@ -76,13 +43,28 @@ struct QHashSeed
constexpr QHashSeed(size_t d = 0) : data(d) {}
constexpr operator size_t() const noexcept { return data; }
- static Q_CORE_EXPORT QHashSeed globalSeed() noexcept Q_DECL_PURE_FUNCTION;
+ static Q_CORE_EXPORT QHashSeed globalSeed() noexcept;
static Q_CORE_EXPORT void setDeterministicGlobalSeed();
static Q_CORE_EXPORT void resetRandomGlobalSeed();
private:
size_t data;
};
+// Whether, ∀ t of type T && ∀ seed, qHash(Key(t), seed) == qHash(t, seed)
+template <typename Key, typename T> struct QHashHeterogeneousSearch : std::false_type {};
+
+// Specializations
+template <> struct QHashHeterogeneousSearch<QString, QStringView> : std::true_type {};
+template <> struct QHashHeterogeneousSearch<QStringView, QString> : std::true_type {};
+template <> struct QHashHeterogeneousSearch<QByteArray, QByteArrayView> : std::true_type {};
+template <> struct QHashHeterogeneousSearch<QByteArrayView, QByteArray> : std::true_type {};
+#ifndef Q_PROCESSOR_ARM
+template <> struct QHashHeterogeneousSearch<QString, QLatin1StringView> : std::true_type {};
+template <> struct QHashHeterogeneousSearch<QStringView, QLatin1StringView> : std::true_type {};
+template <> struct QHashHeterogeneousSearch<QLatin1StringView, QString> : std::true_type {};
+template <> struct QHashHeterogeneousSearch<QLatin1StringView, QStringView> : std::true_type {};
+#endif
+
namespace QHashPrivate {
Q_DECL_CONST_FUNCTION constexpr size_t hash(size_t key, size_t seed) noexcept
@@ -106,14 +88,6 @@ Q_DECL_CONST_FUNCTION constexpr size_t hash(size_t key, size_t seed) noexcept
}
}
-template <typename T, typename = void>
-constexpr inline bool HasQHashSingleArgOverload = false;
-
-template <typename T>
-constexpr inline bool HasQHashSingleArgOverload<T, std::enable_if_t<
- std::is_convertible_v<decltype(qHash(std::declval<const T &>())), size_t>
->> = true;
-
template <typename T1, typename T2> static constexpr bool noexceptPairHash();
}
@@ -148,7 +122,39 @@ Q_DECL_CONST_FUNCTION constexpr inline size_t qHash(quint64 key, size_t seed = 0
key ^= (key >> 32);
return QHashPrivate::hash(size_t(key), seed);
}
-Q_DECL_CONST_FUNCTION constexpr inline size_t qHash(qint64 key, size_t seed = 0) noexcept { return qHash(quint64(key), seed); }
+Q_DECL_CONST_FUNCTION constexpr inline size_t qHash(qint64 key, size_t seed = 0) noexcept
+{
+ if constexpr (sizeof(qint64) > sizeof(size_t)) {
+ // Avoid QTBUG-116080: we XOR the top half with its own sign bit:
+ // - if the qint64 is in range of qint32, then signmask ^ high == 0
+ // (for Qt 7 only)
+ // - if the qint64 is in range of quint32, then signmask == 0 and we
+ // do the same as the quint64 overload above
+ quint32 high = quint32(quint64(key) >> 32);
+ quint32 low = quint32(quint64(key));
+ quint32 signmask = qint32(high) >> 31; // all zeroes or all ones
+ signmask = QT_VERSION_MAJOR > 6 ? signmask : 0;
+ low ^= signmask ^ high;
+ return qHash(low, seed);
+ }
+ return qHash(quint64(key), seed);
+}
+#if QT_SUPPORTS_INT128
+constexpr size_t qHash(quint128 key, size_t seed = 0) noexcept
+{
+ return qHash(quint64(key + (key >> 64)), seed);
+}
+constexpr size_t qHash(qint128 key, size_t seed = 0) noexcept
+{
+ // Avoid QTBUG-116080: same as above, but with double the sizes and without
+ // the need for compatibility
+ quint64 high = quint64(quint128(key) >> 64);
+ quint64 low = quint64(quint128(key));
+ quint64 signmask = qint64(high) >> 63; // all zeroes or all ones
+ low += signmask ^ high;
+ return qHash(low, seed);
+}
+#endif // QT_SUPPORTS_INT128
Q_DECL_CONST_FUNCTION inline size_t qHash(float key, size_t seed = 0) noexcept
{
// ensure -0 gets mapped to 0
@@ -158,9 +164,7 @@ Q_DECL_CONST_FUNCTION inline size_t qHash(float key, size_t seed = 0) noexcept
return QHashPrivate::hash(k, seed);
}
Q_CORE_EXPORT Q_DECL_CONST_FUNCTION size_t qHash(double key, size_t seed = 0) noexcept;
-#if !defined(Q_OS_DARWIN) || defined(Q_CLANG_QDOC)
Q_CORE_EXPORT Q_DECL_CONST_FUNCTION size_t qHash(long double key, size_t seed = 0) noexcept;
-#endif
Q_DECL_CONST_FUNCTION constexpr inline size_t qHash(wchar_t key, size_t seed = 0) noexcept
{ return QHashPrivate::hash(size_t(key), seed); }
Q_DECL_CONST_FUNCTION constexpr inline size_t qHash(char16_t key, size_t seed = 0) noexcept
@@ -179,18 +183,30 @@ Q_DECL_CONST_FUNCTION constexpr inline size_t qHash(std::nullptr_t, size_t seed
{
return seed;
}
+template <class Enum, std::enable_if_t<std::is_enum_v<Enum>, bool> = true>
+Q_DECL_CONST_FUNCTION constexpr inline size_t qHash(Enum e, size_t seed = 0) noexcept
+{ return QHashPrivate::hash(qToUnderlying(e), seed); }
// (some) Qt types
Q_DECL_CONST_FUNCTION constexpr inline size_t qHash(const QChar key, size_t seed = 0) noexcept { return qHash(key.unicode(), seed); }
+
+#if QT_CORE_REMOVED_SINCE(6, 4)
Q_CORE_EXPORT Q_DECL_PURE_FUNCTION size_t qHash(const QByteArray &key, size_t seed = 0) noexcept;
Q_CORE_EXPORT Q_DECL_PURE_FUNCTION size_t qHash(const QByteArrayView &key, size_t seed = 0) noexcept;
+#else
+Q_CORE_EXPORT Q_DECL_PURE_FUNCTION size_t qHash(QByteArrayView key, size_t seed = 0) noexcept;
+inline Q_DECL_PURE_FUNCTION size_t qHash(const QByteArray &key, size_t seed = 0
+ QT6_DECL_NEW_OVERLOAD_TAIL) noexcept
+{ return qHash(qToByteArrayViewIgnoringNull(key), seed); }
+#endif
+
Q_CORE_EXPORT Q_DECL_PURE_FUNCTION size_t qHash(QStringView key, size_t seed = 0) noexcept;
-#if QT_STRINGVIEW_LEVEL < 2
inline Q_DECL_PURE_FUNCTION size_t qHash(const QString &key, size_t seed = 0) noexcept
{ return qHash(QStringView{key}, seed); }
-#endif
+#ifndef QT_BOOTSTRAPPED
Q_CORE_EXPORT Q_DECL_PURE_FUNCTION size_t qHash(const QBitArray &key, size_t seed = 0) noexcept;
-Q_CORE_EXPORT Q_DECL_PURE_FUNCTION size_t qHash(QLatin1String key, size_t seed = 0) noexcept;
+#endif
+Q_CORE_EXPORT Q_DECL_PURE_FUNCTION size_t qHash(QLatin1StringView key, size_t seed = 0) noexcept;
Q_DECL_CONST_FUNCTION constexpr inline size_t qHash(QKeyCombination key, size_t seed = 0) noexcept
{ return qHash(key.toCombined(), seed); }
Q_CORE_EXPORT Q_DECL_PURE_FUNCTION uint qt_hash(QStringView key, uint chained = 0) noexcept;
@@ -199,9 +215,42 @@ template <typename Enum>
Q_DECL_CONST_FUNCTION constexpr inline size_t qHash(QFlags<Enum> flags, size_t seed = 0) noexcept
{ return qHash(flags.toInt(), seed); }
-template <typename T, std::enable_if_t<QHashPrivate::HasQHashSingleArgOverload<T>, bool> = true>
+// ### Qt 7: remove this "catch-all" overload logic, and require users
+// to provide the two-argument version of qHash.
+#if (QT_VERSION < QT_VERSION_CHECK(7, 0, 0))
+// Beware of moving this code from here. It needs to see all the
+// declarations of qHash overloads for C++ fundamental types *before*
+// its own declaration.
+namespace QHashPrivate {
+template <typename T, typename = void>
+constexpr inline bool HasQHashSingleArgOverload = false;
+
+template <typename T>
+constexpr inline bool HasQHashSingleArgOverload<T, std::enable_if_t<
+ std::is_convertible_v<decltype(qHash(std::declval<const T &>())), size_t>
+>> = true;
+}
+
+template <typename T, std::enable_if_t<QHashPrivate::HasQHashSingleArgOverload<T> && !std::is_enum_v<T>, bool> = true>
size_t qHash(const T &t, size_t seed) noexcept(noexcept(qHash(t)))
{ return qHash(t) ^ seed; }
+#endif // < Qt 7
+
+namespace QHashPrivate {
+#ifdef __cpp_concepts
+template <typename Key, typename T> concept HeterogeneouslySearchableWithHelper =
+ // if Key and T are not the same (member already exists)
+ !std::is_same_v<Key, T>
+ // but are comparable amongst each other
+ && std::equality_comparable_with<Key, T>
+ // and supports heteregenous hashing
+ && QHashHeterogeneousSearch<Key, T>::value;
+template <typename Key, typename T> concept HeterogeneouslySearchableWith =
+ HeterogeneouslySearchableWithHelper<q20::remove_cvref_t<Key>, q20::remove_cvref_t<T>>;
+#else
+template <typename Key, typename T> constexpr bool HeterogeneouslySearchableWith = false;
+#endif
+}
template<typename T>
bool qHashEquals(const T &a, const T &b)
@@ -209,6 +258,13 @@ bool qHashEquals(const T &a, const T &b)
return a == b;
}
+template <typename T1, typename T2>
+std::enable_if_t<QHashPrivate::HeterogeneouslySearchableWith<T1, T2>, bool>
+qHashEquals(const T1 &a, const T2 &b)
+{
+ return a == b;
+}
+
namespace QtPrivate {
struct QHashCombine
@@ -342,9 +398,12 @@ template <typename T1, typename T2> inline size_t qHash(const std::pair<T1, T2>
QT_SPECIALIZE_STD_HASH_TO_CALL_QHASH_BY_CREF(QString)
QT_SPECIALIZE_STD_HASH_TO_CALL_QHASH_BY_VALUE(QStringView)
-QT_SPECIALIZE_STD_HASH_TO_CALL_QHASH_BY_VALUE(QLatin1String)
+QT_SPECIALIZE_STD_HASH_TO_CALL_QHASH_BY_VALUE(QLatin1StringView)
+QT_SPECIALIZE_STD_HASH_TO_CALL_QHASH_BY_VALUE(QByteArrayView)
QT_SPECIALIZE_STD_HASH_TO_CALL_QHASH_BY_CREF(QByteArray)
+#ifndef QT_BOOTSTRAPPED
QT_SPECIALIZE_STD_HASH_TO_CALL_QHASH_BY_CREF(QBitArray)
+#endif
QT_END_NAMESPACE
diff --git a/src/corelib/tools/qiterator.h b/src/corelib/tools/qiterator.h
index 8922f34758..8a2b493ef4 100644
--- a/src/corelib/tools/qiterator.h
+++ b/src/corelib/tools/qiterator.h
@@ -1,51 +1,23 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QITERATOR_H
#define QITERATOR_H
#include <QtCore/qglobal.h>
+#include <QtCore/qcontainertools_impl.h>
QT_BEGIN_NAMESPACE
#if !defined(QT_NO_JAVA_STYLE_ITERATORS)
+#ifdef Q_QDOC
+#define Q_DISABLE_BACKWARD_ITERATOR
+#else
+#define Q_DISABLE_BACKWARD_ITERATOR \
+ template<typename It = decltype(i), QtPrivate::IfIteratorCanMoveBackwards<It> = true>
+#endif
+
#define Q_DECLARE_SEQUENTIAL_ITERATOR(C) \
\
template <class T> \
@@ -64,11 +36,15 @@ public: \
inline bool hasNext() const { return i != c.constEnd(); } \
inline const T &next() { return *i++; } \
inline const T &peekNext() const { return *i; } \
+ Q_DISABLE_BACKWARD_ITERATOR \
inline bool hasPrevious() const { return i != c.constBegin(); } \
+ Q_DISABLE_BACKWARD_ITERATOR \
inline const T &previous() { return *--i; } \
+ Q_DISABLE_BACKWARD_ITERATOR \
inline const T &peekPrevious() const { const_iterator p = i; return *--p; } \
inline bool findNext(const T &t) \
{ while (i != c.constEnd()) if (*i++ == t) return true; return false; } \
+ Q_DISABLE_BACKWARD_ITERATOR \
inline bool findPrevious(const T &t) \
{ while (i != c.constBegin()) if (*(--i) == t) return true; \
return false; } \
@@ -95,8 +71,11 @@ public: \
inline bool hasNext() const { return c->constEnd() != const_iterator(i); } \
inline T &next() { n = i++; return *n; } \
inline T &peekNext() const { return *i; } \
+ Q_DISABLE_BACKWARD_ITERATOR \
inline bool hasPrevious() const { return c->constBegin() != const_iterator(i); } \
+ Q_DISABLE_BACKWARD_ITERATOR \
inline T &previous() { n = --i; return *n; } \
+ Q_DISABLE_BACKWARD_ITERATOR \
inline T &peekPrevious() const { iterator p = i; return *--p; } \
inline void remove() \
{ if (c->constEnd() != const_iterator(n)) { i = c->erase(n); n = c->end(); } } \
@@ -106,6 +85,7 @@ public: \
inline void insert(const T &t) { n = i = c->insert(i, t); ++i; } \
inline bool findNext(const T &t) \
{ while (c->constEnd() != const_iterator(n = i)) if (*i++ == t) return true; return false; } \
+ Q_DISABLE_BACKWARD_ITERATOR \
inline bool findPrevious(const T &t) \
{ while (c->constBegin() != const_iterator(i)) if (*(n = --i) == t) return true; \
n = c->end(); return false; } \
@@ -131,13 +111,17 @@ public: \
inline bool hasNext() const { return i != c.constEnd(); } \
inline Item next() { n = i++; return n; } \
inline Item peekNext() const { return i; } \
+ Q_DISABLE_BACKWARD_ITERATOR \
inline bool hasPrevious() const { return i != c.constBegin(); } \
+ Q_DISABLE_BACKWARD_ITERATOR \
inline Item previous() { n = --i; return n; } \
+ Q_DISABLE_BACKWARD_ITERATOR \
inline Item peekPrevious() const { const_iterator p = i; return --p; } \
inline const T &value() const { Q_ASSERT(item_exists()); return *n; } \
inline const Key &key() const { Q_ASSERT(item_exists()); return n.key(); } \
inline bool findNext(const T &t) \
{ while ((n = i) != c.constEnd()) if (*i++ == t) return true; return false; } \
+ Q_DISABLE_BACKWARD_ITERATOR \
inline bool findPrevious(const T &t) \
{ while (i != c.constBegin()) if (*(n = --i) == t) return true; \
n = c.constEnd(); return false; } \
@@ -165,8 +149,11 @@ public: \
inline bool hasNext() const { return const_iterator(i) != c->constEnd(); } \
inline Item next() { n = i++; return n; } \
inline Item peekNext() const { return i; } \
+ Q_DISABLE_BACKWARD_ITERATOR \
inline bool hasPrevious() const { return const_iterator(i) != c->constBegin(); } \
+ Q_DISABLE_BACKWARD_ITERATOR \
inline Item previous() { n = --i; return n; } \
+ Q_DISABLE_BACKWARD_ITERATOR \
inline Item peekPrevious() const { iterator p = i; return --p; } \
inline void remove() \
{ if (const_iterator(n) != c->constEnd()) { i = c->erase(n); n = c->end(); } } \
@@ -176,6 +163,7 @@ public: \
inline const Key &key() const { Q_ASSERT(item_exists()); return n.key(); } \
inline bool findNext(const T &t) \
{ while (const_iterator(n = i) != c->constEnd()) if (*i++ == t) return true; return false; } \
+ Q_DISABLE_BACKWARD_ITERATOR \
inline bool findPrevious(const T &t) \
{ while (const_iterator(i) != c->constBegin()) if (*(n = --i) == t) return true; \
n = c->end(); return false; } \
@@ -266,26 +254,10 @@ public:
return std::pair<Key, T>(i.key(), i.value());
}
- struct pointer
- {
- pointer(value_type &&r_) : r(std::move(r_)) { }
-
- pointer() = default;
- pointer(const pointer &other) = default;
- pointer(pointer &&other) = default;
- pointer &operator=(const pointer &other) = default;
- pointer &operator=(pointer &&other) = default;
-
- value_type &operator*() const { return r; }
-
- value_type r;
- const value_type *operator->() const {
- return &r;
- }
- };
+ using pointer = QtPrivate::ArrowProxy<value_type>;
pointer operator->() const {
- return pointer(std::pair<Key, T>(i.key(), i.value()));
+ return pointer{std::pair<Key, T>(i.key(), i.value())};
}
friend bool operator==(QKeyValueIterator lhs, QKeyValueIterator rhs) noexcept { return lhs.i == rhs.i; }
@@ -301,6 +273,47 @@ private:
Iterator i;
};
+namespace QtPrivate {
+
+template <typename Map>
+class QKeyValueRangeStorage
+{
+protected:
+ Map m_map;
+public:
+ explicit QKeyValueRangeStorage(const Map &map) : m_map(map) {}
+ explicit QKeyValueRangeStorage(Map &&map) : m_map(std::move(map)) {}
+};
+
+template <typename Map>
+class QKeyValueRangeStorage<Map &>
+{
+protected:
+ Map &m_map;
+public:
+ explicit QKeyValueRangeStorage(Map &map) : m_map(map) {}
+};
+
+template <typename Map>
+class QKeyValueRange : public QKeyValueRangeStorage<Map>
+{
+public:
+ using QKeyValueRangeStorage<Map>::QKeyValueRangeStorage;
+ auto begin() { return this->m_map.keyValueBegin(); }
+ auto begin() const { return this->m_map.keyValueBegin(); }
+ auto end() { return this->m_map.keyValueEnd(); }
+ auto end() const { return this->m_map.keyValueEnd(); }
+};
+
+template <typename Map>
+QKeyValueRange(Map &) -> QKeyValueRange<Map &>;
+
+template <typename Map, std::enable_if_t<!std::is_reference_v<Map>, bool> = false>
+QKeyValueRange(Map &&) -> QKeyValueRange<std::remove_const_t<Map>>;
+
+} // namespace QtPrivate
+
+
QT_END_NAMESPACE
#endif // QITERATOR_H
diff --git a/src/corelib/tools/qiterator.qdoc b/src/corelib/tools/qiterator.qdoc
index 1ba5b66318..041fb0701d 100644
--- a/src/corelib/tools/qiterator.qdoc
+++ b/src/corelib/tools/qiterator.qdoc
@@ -1,29 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*! \class QKeyValueIterator
\inmodule QtCore
@@ -108,7 +84,7 @@
/*!
\fn template<typename Key, typename T, class Iterator> QKeyValueIterator &QKeyValueIterator<Key, T, Iterator>::operator++()
- The prefix ++ operator (\c{++i}) advances the iterator to the
+ The prefix \c{++} operator (\c{++i}) advances the iterator to the
next item in the container and returns the iterator.
\note Advancing the iterator past its container's end() constitutes
@@ -121,7 +97,7 @@
\overload
- The postfix ++ operator (\c{i++}) advances the iterator to the
+ The postfix \c{++} operator (\c{i++}) advances the iterator to the
next item in the container and returns the iterator's prior value.
\note Advancing the iterator past its container's end() constitutes
@@ -130,7 +106,7 @@
/*! \fn template<typename Key, typename T, class Iterator> QKeyValueIterator &QKeyValueIterator<Key, T, Iterator>::operator--()
- The prefix -- operator (\c{--i}) backs the iterator up to the previous item
+ The prefix c{--} operator (\c{--i}) backs the iterator up to the previous item
in the container and returns the iterator.
\note Backing up an iterator to before its container's begin() constitutes
@@ -143,7 +119,7 @@
\overload
- The postfix -- operator (\c{i--}) backs the iterator up to the previous item
+ The postfix c{--} operator (\c{i--}) backs the iterator up to the previous item
in the container and returns the iterator's prior value.
\note Backing up an iterator to before its container's begin() constitutes
@@ -237,12 +213,8 @@
\image javaiterators1.png
- Here's how to iterate over the elements in reverse order:
-
- \snippet code/doc_src_qiterator.cpp 7
-
If you want to find all occurrences of a particular value, use
- findNext() or findPrevious() in a loop.
+ findNext() in a loop.
Multiple iterators can be used on the same set. If the set
is modified while a QSetIterator is active, the QSetIterator
@@ -413,15 +385,21 @@
*/
/*! \fn template <class T> void QListIterator<T>::toBack()
- \fn template <class T> void QSetIterator<T>::toBack()
\fn template <class T> void QMutableListIterator<T>::toBack()
+//! [toBack]
Moves the iterator to the back of the container (after the last
item).
+//! [toBack]
\sa toFront(), previous()
*/
+/*! \fn template <class T> void QSetIterator<T>::toBack()
+ \include qiterator.qdoc toBack
+ \sa toFront()
+*/
+
/*! \fn template <class T> void QMutableSetIterator<T>::toBack()
Moves the iterator to the back of the container (after the last
@@ -431,16 +409,22 @@
*/
/*! \fn template <class T> bool QListIterator<T>::hasNext() const
- \fn template <class T> bool QSetIterator<T>::hasNext() const
\fn template <class T> bool QMutableListIterator<T>::hasNext() const
+//! [hasNext]
Returns \c true if there is at least one item ahead of the iterator,
i.e. the iterator is \e not at the back of the container;
otherwise returns \c false.
+//! [hasNext]
\sa hasPrevious(), next()
*/
+/*! \fn template <class T> bool QSetIterator<T>::hasNext() const
+ \include qiterator.qdoc hasNext
+ \sa next()
+*/
+
/*! \fn template <class T> bool QMutableSetIterator<T>::hasNext() const
Returns \c true if there is at least one item ahead of the iterator,
@@ -451,16 +435,23 @@
*/
/*! \fn template <class T> const T &QListIterator<T>::next()
- \fn template <class T> const T &QSetIterator<T>::next()
+//! [next]
Returns the next item and advances the iterator by one position.
Calling this function on an iterator located at the back of the
container leads to undefined results.
+//! [next]
\sa hasNext(), peekNext(), previous()
*/
+/*!
+ \fn template <class T> const T &QSetIterator<T>::next()
+ \include qiterator.qdoc next
+ \sa hasNext(), peekNext()
+*/
+
/* \fn template <class T> const T &QMutableSetIterator<T>::next()
Returns the next item and advances the iterator by one position.
@@ -492,17 +483,24 @@
*/
/*! \fn template <class T> const T &QListIterator<T>::peekNext() const
- \fn template <class T> const T &QSetIterator<T>::peekNext() const
+//! [peekNext]
Returns the next item without moving the iterator.
Calling this function on an iterator located at the back of the
container leads to undefined results.
+//! [peekNext]
\sa hasNext(), next(), peekPrevious()
*/
/*!
+ \fn template <class T> const T &QSetIterator<T>::peekNext() const
+ \include qiterator.qdoc peekNext
+ \sa hasNext(), next()
+*/
+
+/*!
\fn template <class T> const T &QMutableSetIterator<T>::peekNext() const
Returns the next item without moving the iterator.
@@ -524,7 +522,6 @@
*/
/*! \fn template <class T> bool QListIterator<T>::hasPrevious() const
- \fn template <class T> bool QSetIterator<T>::hasPrevious() const
\fn template <class T> bool QMutableListIterator<T>::hasPrevious() const
Returns \c true if there is at least one item behind the iterator,
@@ -535,7 +532,6 @@
*/
/*! \fn template <class T> const T &QListIterator<T>::previous()
- \fn template <class T> const T &QSetIterator<T>::previous()
Returns the previous item and moves the iterator back by one
position.
@@ -558,7 +554,6 @@
*/
/*! \fn template <class T> const T &QListIterator<T>::peekPrevious() const
- \fn template <class T> const T &QSetIterator<T>::peekPrevious() const
Returns the previous item without moving the iterator.
@@ -590,21 +585,25 @@
*/
/*! \fn template <class T> bool QListIterator<T>::findNext(const T &value)
- \fn template <class T> bool QSetIterator<T>::findNext(const T &value)
\fn template <class T> bool QMutableListIterator<T>::findNext(const T &value)
+//! [findNext]
Searches for \a value starting from the current iterator position
forward. Returns \c true if \a value is found; otherwise returns \c false.
After the call, if \a value was found, the iterator is positioned
just after the matching item; otherwise, the iterator is
positioned at the back of the container.
+//! [findNext]
\sa findPrevious()
*/
+/*! \fn template <class T> bool QSetIterator<T>::findNext(const T &value)
+ \include qiterator.qdoc findNext
+*/
+
/*! \fn template <class T> bool QListIterator<T>::findPrevious(const T &value)
- \fn template <class T> bool QSetIterator<T>::findPrevious(const T &value)
\fn template <class T> bool QMutableListIterator<T>::findPrevious(const T &value)
Searches for \a value starting from the current iterator position
@@ -974,9 +973,8 @@
be preferred.
QMutableHashIterator\<Key, T\> allows you to iterate over a QHash
- (or a QMultiHash) and modify the hash. If you don't want to modify
- the hash (or have a const QHash), use the slightly faster
- QHashIterator instead.
+ and modify the hash. If you don't want to modify the hash (or have
+ a const QHash), use the slightly faster QHashIterator instead.
The QMutableHashIterator constructor takes a QHash as argument.
After construction, the iterator is located at the very beginning
diff --git a/src/corelib/tools/qline.cpp b/src/corelib/tools/qline.cpp
index bbedfa948e..9216b8875b 100644
--- a/src/corelib/tools/qline.cpp
+++ b/src/corelib/tools/qline.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qline.h"
@@ -263,6 +227,15 @@ QT_BEGIN_NAMESPACE
\sa setP1(), setP2(), p1(), p2()
*/
+/*!
+ \fn QLine::toLineF() const
+ \since 6.4
+
+ Returns this line as a line with floating point accuracy.
+
+ \sa QLineF::toLine()
+*/
+
#ifndef QT_NO_DEBUG_STREAM
@@ -423,7 +396,7 @@ QDataStream &operator>>(QDataStream &stream, QLine &line)
Construct a QLineF object from the given integer-based \a line.
- \sa toLine()
+ \sa toLine(), QLine::toLineF()
*/
/*!
@@ -463,7 +436,7 @@ QDataStream &operator>>(QDataStream &stream, QLine &line)
Note that the returned line's start and end points are rounded to
the nearest integer.
- \sa QLineF()
+ \sa QLineF(), QLine::toLineF()
*/
/*!
\fn qreal QLineF::x1() const
diff --git a/src/corelib/tools/qline.h b/src/corelib/tools/qline.h
index 426d69cd6d..e23ffbe9d5 100644
--- a/src/corelib/tools/qline.h
+++ b/src/corelib/tools/qline.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QLINE_H
#define QLINE_H
@@ -44,6 +8,7 @@
QT_BEGIN_NAMESPACE
+class QLineF;
/*******************************************************************************
* class QLine
@@ -86,10 +51,12 @@ public:
constexpr inline bool operator==(const QLine &d) const noexcept;
constexpr inline bool operator!=(const QLine &d) const noexcept { return !(*this == d); }
+ [[nodiscard]] constexpr inline QLineF toLineF() const noexcept;
+
private:
QPoint pt1, pt2;
};
-Q_DECLARE_TYPEINFO(QLine, Q_RELOCATABLE_TYPE);
+Q_DECLARE_TYPEINFO(QLine, Q_PRIMITIVE_TYPE);
/*******************************************************************************
* class QLine inline members
@@ -274,7 +241,7 @@ public:
private:
QPointF pt1, pt2;
};
-Q_DECLARE_TYPEINFO(QLineF, Q_RELOCATABLE_TYPE);
+Q_DECLARE_TYPEINFO(QLineF, Q_PRIMITIVE_TYPE);
/*******************************************************************************
* class QLineF inline members
@@ -386,6 +353,8 @@ constexpr inline QPointF QLineF::pointAt(qreal t) const
return QPointF(pt1.x() + (pt2.x() - pt1.x()) * t, pt1.y() + (pt2.y() - pt1.y()) * t);
}
+constexpr inline QLineF QLine::toLineF() const noexcept { return *this; }
+
constexpr inline QLine QLineF::toLine() const
{
return QLine(pt1.toPoint(), pt2.toPoint());
diff --git a/src/corelib/tools/qlist.h b/src/corelib/tools/qlist.h
index 5f6b77e8ce..89e0e3f380 100644
--- a/src/corelib/tools/qlist.h
+++ b/src/corelib/tools/qlist.h
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Copyright (C) 2019 Intel Corporation
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// Copyright (C) 2019 Intel Corporation
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QLIST_H
#define QLIST_H
@@ -46,12 +10,15 @@
#include <QtCore/qhashfunctions.h>
#include <QtCore/qiterator.h>
#include <QtCore/qcontainertools_impl.h>
+#include <QtCore/qnamespace.h>
#include <functional>
#include <limits>
#include <initializer_list>
#include <type_traits>
+class tst_QList;
+
QT_BEGIN_NAMESPACE
namespace QtPrivate {
@@ -111,10 +78,15 @@ class QList
using DataPointer = QArrayDataPointer<T>;
class DisableRValueRefs {};
+ friend class ::tst_QList;
+
DataPointer d;
template <typename V, typename U> friend qsizetype QtPrivate::indexOf(const QList<V> &list, const U &u, qsizetype from) noexcept;
template <typename V, typename U> friend qsizetype QtPrivate::lastIndexOf(const QList<V> &list, const U &u, qsizetype from) noexcept;
+ // This alias prevents the QtPrivate namespace from being exposed into the docs.
+ template <typename InputIterator>
+ using if_input_iterator = QtPrivate::IfIsInputIterator<InputIterator>;
public:
using Type = T;
@@ -145,14 +117,11 @@ public:
public:
using difference_type = qsizetype;
using value_type = T;
- // libstdc++ shipped with gcc < 11 does not have a fix for defect LWG 3346
-#if __cplusplus >= 202002L && (!defined(_GLIBCXX_RELEASE) || _GLIBCXX_RELEASE >= 11)
- using iterator_category = std::contiguous_iterator_tag;
+#ifdef QT_COMPILER_HAS_LWG3346
+ using iterator_concept = std::contiguous_iterator_tag;
using element_type = value_type;
-#else
- using iterator_category = std::random_access_iterator_tag;
#endif
-
+ using iterator_category = std::random_access_iterator_tag;
using pointer = T *;
using reference = T &;
@@ -218,13 +187,11 @@ public:
public:
using difference_type = qsizetype;
using value_type = T;
- // libstdc++ shipped with gcc < 11 does not have a fix for defect LWG 3346
-#if __cplusplus >= 202002L && (!defined(_GLIBCXX_RELEASE) || _GLIBCXX_RELEASE >= 11)
- using iterator_category = std::contiguous_iterator_tag;
+#ifdef QT_COMPILER_HAS_LWG3346
+ using iterator_concept = std::contiguous_iterator_tag;
using element_type = const value_type;
-#else
- using iterator_category = std::random_access_iterator_tag;
#endif
+ using iterator_category = std::random_access_iterator_tag;
using pointer = const T *;
using reference = const T &;
@@ -291,6 +258,14 @@ private:
const std::less<const T*> less = {};
return !less(d->end(), i.i) && !less(i.i, d->begin());
}
+
+ void verify([[maybe_unused]] qsizetype pos = 0, [[maybe_unused]] qsizetype n = 1) const
+ {
+ Q_ASSERT(pos >= 0);
+ Q_ASSERT(pos <= size());
+ Q_ASSERT(n >= 0);
+ Q_ASSERT(n <= size() - pos);
+ }
public:
QList(DataPointer dd) noexcept
: d(dd)
@@ -300,20 +275,20 @@ public:
public:
QList() = default;
explicit QList(qsizetype size)
- : d(Data::allocate(size))
+ : d(size)
{
if (size)
d->appendInitialize(size);
}
QList(qsizetype size, parameter_type t)
- : d(Data::allocate(size))
+ : d(size)
{
if (size)
d->copyAppend(size, t);
}
inline QList(std::initializer_list<T> args)
- : d(Data::allocate(args.size()))
+ : d(qsizetype(args.size()))
{
if (args.size())
d->copyAppend(args.begin(), args.end());
@@ -321,20 +296,18 @@ public:
QList<T> &operator=(std::initializer_list<T> args)
{
- d = DataPointer(Data::allocate(args.size()));
- if (args.size())
- d->copyAppend(args.begin(), args.end());
- return *this;
+ return assign(args);
}
- template <typename InputIterator, QtPrivate::IfIsInputIterator<InputIterator> = true>
+
+ template <typename InputIterator, if_input_iterator<InputIterator> = true>
QList(InputIterator i1, InputIterator i2)
{
- if constexpr (!std::is_convertible_v<typename std::iterator_traits<Iterator>::iterator_category, std::forward_iterator_tag>) {
+ if constexpr (!std::is_convertible_v<typename std::iterator_traits<InputIterator>::iterator_category, std::forward_iterator_tag>) {
std::copy(i1, i2, std::back_inserter(*this));
} else {
const auto distance = std::distance(i1, i2);
if (distance) {
- d = DataPointer(Data::allocate(distance));
+ d = DataPointer(qsizetype(distance));
// appendIteratorRange can deal with contiguous iterators on its own,
// this is an optimization for C++17 code.
if constexpr (std::is_same_v<std::decay_t<InputIterator>, iterator> ||
@@ -352,11 +325,18 @@ public:
inline explicit QList(const String &str)
{ append(str); }
+ QList(qsizetype size, Qt::Initialization)
+ : d(size)
+ {
+ if (size)
+ d->appendUninitialized(size);
+ }
+
// compiler-generated special member functions are fine!
- void swap(QList<T> &other) noexcept { qSwap(d, other.d); }
+ void swap(QList &other) noexcept { d.swap(other.d); }
-#ifndef Q_CLANG_QDOC
+#ifndef Q_QDOC
template <typename U = T>
QTypeTraits::compare_eq_result_container<QList, U> operator==(const QList &other) const
{
@@ -412,7 +392,7 @@ public:
bool operator>(const QList &other) const;
bool operator<=(const QList &other) const;
bool operator>=(const QList &other) const;
-#endif // Q_CLANG_QDOC
+#endif // Q_QDOC
qsizetype size() const noexcept { return d->size; }
qsizetype count() const noexcept { return size(); }
@@ -432,6 +412,12 @@ public:
if (size > this->size())
d->copyAppend(size - this->size(), c);
}
+ void resizeForOverwrite(qsizetype size)
+ {
+ resize_internal(size);
+ if (size > this->size())
+ d->appendUninitialized(size);
+ }
inline qsizetype capacity() const { return qsizetype(d->constAllocatedCapacity()); }
void reserve(qsizetype size);
@@ -450,7 +436,7 @@ public:
return;
if (d->needsDetach()) {
// must allocate memory
- DataPointer detached(Data::allocate(d.allocatedCapacity()));
+ DataPointer detached(d.allocatedCapacity());
d.swap(detached);
} else {
d->truncate(0);
@@ -465,7 +451,7 @@ public:
reference operator[](qsizetype i)
{
Q_ASSERT_X(size_t(i) < size_t(d->size), "QList::operator[]", "index out of range");
- detach();
+ // don't detach() here, we detach in data below:
return data()[i];
}
const_reference operator[](qsizetype i) const noexcept { return at(i); }
@@ -527,6 +513,19 @@ public:
}
}
+ QList &assign(qsizetype n, parameter_type t)
+ {
+ Q_ASSERT(n >= 0);
+ return fill(t, n);
+ }
+
+ template <typename InputIterator, if_input_iterator<InputIterator> = true>
+ QList &assign(InputIterator first, InputIterator last)
+ { d.assign(first, last); return *this; }
+
+ QList &assign(std::initializer_list<T> l)
+ { return assign(l.begin(), l.end()); }
+
template <typename ...Args>
iterator emplace(const_iterator before, Args&&... args)
{
@@ -654,27 +653,13 @@ public:
QList<T> mid(qsizetype pos, qsizetype len = -1) const;
QList<T> first(qsizetype n) const
- {
- Q_ASSERT(size_t(n) <= size_t(size()));
- return QList<T>(begin(), begin() + n);
- }
+ { verify(0, n); return QList<T>(begin(), begin() + n); }
QList<T> last(qsizetype n) const
- {
- Q_ASSERT(size_t(n) <= size_t(size()));
- return QList<T>(end() - n, end());
- }
+ { verify(0, n); return QList<T>(end() - n, end()); }
QList<T> sliced(qsizetype pos) const
- {
- Q_ASSERT(size_t(pos) <= size_t(size()));
- return QList<T>(begin() + pos, end());
- }
+ { verify(pos, 0); return QList<T>(begin() + pos, end()); }
QList<T> sliced(qsizetype pos, qsizetype n) const
- {
- Q_ASSERT(size_t(pos) <= size_t(size()));
- Q_ASSERT(n >= 0);
- Q_ASSERT(pos + n <= size());
- return QList<T>(begin() + pos, begin() + pos + n);
- }
+ { verify(pos, n); return QList<T>(begin() + pos, begin() + pos + n); }
T value(qsizetype i) const { return value(i, T()); }
T value(qsizetype i, parameter_type defaultValue) const;
@@ -704,14 +689,22 @@ public:
inline reference back() { return last(); }
inline const_reference back() const noexcept { return last(); }
void shrink_to_fit() { squeeze(); }
+ static qsizetype max_size() noexcept
+ {
+ return Data::max_size();
+ }
// comfort
QList<T> &operator+=(const QList<T> &l) { append(l); return *this; }
QList<T> &operator+=(QList<T> &&l) { append(std::move(l)); return *this; }
- inline QList<T> operator+(const QList<T> &l) const
+ inline QList<T> operator+(const QList<T> &l) const &
{ QList n = *this; n += l; return n; }
- inline QList<T> operator+(QList<T> &&l) const
+ QList<T> operator+(const QList<T> &l) &&
+ { return std::move(*this += l); }
+ inline QList<T> operator+(QList<T> &&l) const &
{ QList n = *this; n += std::move(l); return n; }
+ QList<T> operator+(QList<T> &&l) &&
+ { return std::move(*this += std::move(l)); }
inline QList<T> &operator+=(parameter_type t)
{ append(t); return *this; }
inline QList<T> &operator<< (parameter_type t)
@@ -770,7 +763,7 @@ void QList<T>::reserve(qsizetype asize)
}
}
- DataPointer detached(Data::allocate(qMax(asize, size())));
+ DataPointer detached(qMax(asize, size()));
detached->copyAppend(d->begin(), d->end());
if (detached.d_ptr())
detached->setFlag(Data::CapacityReserved);
@@ -784,7 +777,7 @@ inline void QList<T>::squeeze()
return;
if (d->needsDetach() || size() < capacity()) {
// must allocate memory
- DataPointer detached(Data::allocate(size()));
+ DataPointer detached(size());
if (size()) {
if (d.needsDetach())
detached->copyAppend(d.data(), d.data() + d.size);
@@ -913,7 +906,7 @@ inline QList<T> &QList<T>::fill(parameter_type t, qsizetype newSize)
newSize = size();
if (d->needsDetach() || newSize > capacity()) {
// must allocate memory
- DataPointer detached(Data::allocate(d->detachCapacity(newSize)));
+ DataPointer detached(d->detachCapacity(newSize));
detached->copyAppend(newSize, t);
d.swap(detached);
} else {
@@ -995,7 +988,7 @@ inline QList<T> QList<T>::mid(qsizetype pos, qsizetype len) const
}
// Allocate memory
- DataPointer copied(Data::allocate(l));
+ DataPointer copied(l);
copied->copyAppend(data() + p, data() + p + l);
return copied;
}
diff --git a/src/corelib/tools/qlist.qdoc b/src/corelib/tools/qlist.qdoc
index 4e92e2c047..e07b74cd53 100644
--- a/src/corelib/tools/qlist.qdoc
+++ b/src/corelib/tools/qlist.qdoc
@@ -1,29 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
\class QVector
@@ -153,21 +129,7 @@
support \c operator==(). These requirements are documented on a
per-function basis.
- Like the other container classes, QList provides \l{Java-style iterators}
- (QListIterator and QMutableListIterator) and \l{STL-style iterators}
- (QList::const_iterator and QList::iterator). In practice, iterators are
- handy when working with generic algorithms provided by \l{generic
- algorithms}{Qt} and the C++ standard library. \l{Java-style iterators} are
- provided for backwards compatibility, prefer \l{STL-style iterators} when
- writing C++ code.
-
- \note Iterators over a QList, and references to individual elements
- within one, cannot be relied on to remain valid when any non-const method
- of the QList is called. Accessing such an iterator or reference after
- the call to a non-const method leads to undefined behavior. When stability
- for iterator-like functionality is required, you should use indexes instead
- of iterators as they are not tied to QList's internal state and thus do
- not get invalidated.
+ For iterating over the items, see \l {Iterating over Containers}.
In addition to QList, Qt also provides QVarLengthArray, a very
low-level class with little functionality that is optimized for
@@ -285,6 +247,31 @@
\sa resize()
*/
+/*! \fn template <typename T> QList<T>::QList(qsizetype size, Qt::Initialization)
+ \since 6.8
+
+ Constructs a list with an initial size of \a size elements.
+
+ QList will make an attempt at \b{not initializing} the elements.
+
+//! [qlist-uninitialized-strategy]
+ Specifically:
+
+ \list
+
+ \li if \c{T} has a constructor that accepts \c{Qt::Uninitialized},
+ that constructor will be used to initialize the elements;
+
+ \li otherwise, each element is default constructed. For
+ trivially constructible types (such as \c{int}, \c{float}, etc.)
+ this is equivalent to not initializing them.
+
+ \endlist
+//! [qlist-uninitialized-strategy]
+
+ \sa resizeForOverwrite()
+*/
+
/*! \fn template <typename T> QList<T>::QList(qsizetype size, parameter_type value)
Constructs a list with an initial size of \a size elements.
@@ -312,11 +299,15 @@
Constructs a list from the std::initializer_list given by \a args.
*/
-/*! \fn template <typename T> template<typename InputIterator> QList<T>::QList(InputIterator first, InputIterator last)
+/*! \fn template<typename T> template <typename InputIterator, QList<T>::if_input_iterator<InputIterator> = true> QList<T>::QList(InputIterator first, InputIterator last)
\since 5.14
Constructs a list with the contents in the iterator range [\a first, \a last).
+ \note This constructor only participates in overload resolution if
+ \c InputIterator meets the requirements of a
+ \l {https://en.cppreference.com/w/cpp/named_req/InputIterator} {LegacyInputIterator}.
+
The value type of \c InputIterator must be convertible to \c T.
*/
@@ -460,18 +451,35 @@
*/
/*! \fn template <typename T> void QList<T>::resize(qsizetype size)
+ \fn template <typename T> void QList<T>::resize(qsizetype size, parameter_type c)
+ \since 6.0
Sets the size of the list to \a size. If \a size is greater than the
current size, elements are added to the end; the new elements are
- initialized with a \l{default-constructed value}. If \a size is less
- than the current size, elements are removed from the end.
+ initialized with either a \l{default-constructed value} or \a c. If \a size
+ is less than the current size, elements are removed from the end.
- Since Qt 5.6, resize() doesn't shrink the capacity anymore.
- To shed excess capacity, use squeeze().
+ If this list is not shared, the capacity() is preserved. Use squeeze()
+ to shed excess capacity.
+
+ \note In Qt versions prior to 5.7 (for QVector; QList lacked a resize()
+ until 6.0), this function released the memory used by the list instead of
+ preserving the capacity.
\sa size()
*/
+/*! \fn template <typename T> void QList<T>::resizeForOverwrite(qsizetype size)
+ \since 6.8
+
+ Sets the size of the list to \a size. If \a size is less than the
+ current size, elements are removed from the end. If \a size is
+ greater than the current size, elements are added to the end; QList
+ will make an attempt at \b{not initializing} these new elements.
+
+ \include qlist.qdoc qlist-uninitialized-strategy
+*/
+
/*! \fn template <typename T> qsizetype QList<T>::capacity() const
Returns the maximum number of items that can be stored in the
@@ -587,17 +595,14 @@
Removes all the elements from the list.
- \note Until Qt 5.6, this also released the memory used by
- the list. From Qt 5.7, the capacity is preserved. To shed
- all capacity, swap with a default-constructed list:
- \code
- QList<T> l ...;
- QList<T>().swap(l);
- Q_ASSERT(l.capacity() == 0);
- \endcode
- or call squeeze().
+ If this list is not shared, the capacity() is preserved. Use squeeze() to
+ shed excess capacity.
+
+ \note In Qt versions prior to 5.7 (for QVector) and 6.0 (for QList), this
+ function released the memory used by the list instead of preserving the
+ capacity.
- \sa squeeze()
+ \sa resize(), squeeze()
*/
/*! \fn template <typename T> const T &QList<T>::at(qsizetype i) const
@@ -1324,6 +1329,15 @@
returns \c false.
*/
+/*! \fn template <typename T> qsizetype QList<T>::max_size()
+ \since 6.8
+
+ This function is provided for STL compatibility.
+ It returns the maximum number of elements that the list can
+ theoretically hold. In practice, the number can be much smaller,
+ limited by the amount of memory available to the system.
+*/
+
/*! \fn template <typename T> QList<T> &QList<T>::operator+=(const QList<T> &other)
Appends the items of the \a other list to this list and
@@ -1357,7 +1371,11 @@
\sa append(), operator<<()
*/
-/*! \fn template <typename T> QList<T> QList<T>::operator+(const QList<T> &other) const
+/*!
+ \fn template <typename T> QList<T> QList<T>::operator+(const QList<T> &other) const &
+ \fn template <typename T> QList<T> QList<T>::operator+(const QList<T> &other) &&
+ \fn template <typename T> QList<T> QList<T>::operator+(QList<T> &&other) const &
+ \fn template <typename T> QList<T> QList<T>::operator+(QList<T> &&other) &&
Returns a list that contains all the items in this list
followed by all the items in the \a other list.
@@ -1365,14 +1383,6 @@
\sa operator+=()
*/
-/*! \fn template <typename T> QList<T> QList<T>::operator+(QList<T> &&other) const
- \since 6.0
-
- \overload
-
- \sa operator+=()
-*/
-
/*! \fn template <typename T> QList<T> &QList<T>::operator<<(parameter_type value)
Appends \a value to the list and returns a reference to this list.
@@ -1573,3 +1583,47 @@
\sa erase
*/
+
+/*! \fn template <typename T> QList<T>& QList<T>::assign(qsizetype n, parameter_type t)
+ \since 6.6
+
+ Replaces the contents of this list with \a n copies of \a t.
+
+ The size of this list will be equal to \a n.
+
+ This function will only allocate memory if \a n exceeds the capacity of the
+ list or this list is shared.
+*/
+
+/*! \fn template <typename T> template <typename InputIterator, QList<T>::if_input_iterator<InputIterator>> QList<T>& QList<T>::assign(InputIterator first, InputIterator last)
+ \since 6.6
+
+ Replaces the contents of this list with a copy of the elements in the
+ iterator range [\a first, \a last).
+
+ The size of this list will be equal to the number of elements in the
+ range [\a first, \a last).
+
+ This function will only allocate memory if the number of elements in the
+ range exceeds the capacity of this list or this list is shared.
+
+ \note This function overload only participates in overload resolution if
+ \c InputIterator meets the requirements of a
+ \l {https://en.cppreference.com/w/cpp/named_req/InputIterator} {LegacyInputIterator}.
+
+ \note The behavior is undefined if either argument is an iterator into
+ *this.
+*/
+
+/*! \fn template <typename T> QList<T>& QList<T>::assign(std::initializer_list<T> l)
+ \since 6.6
+
+ Replaces the contents of this list with a copy of the elements of
+ \a l.
+
+ The size of this list will be equal to the number of elements in
+ \a l.
+
+ This function only allocates memory if the number of elements in \a l
+ exceeds the capacity of this list or this list is shared.
+*/
diff --git a/src/corelib/tools/qmakearray_p.h b/src/corelib/tools/qmakearray_p.h
index 4ed8c16234..17014c23b9 100644
--- a/src/corelib/tools/qmakearray_p.h
+++ b/src/corelib/tools/qmakearray_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2018 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QMAKEARRAY_P_H
#define QMAKEARRAY_P_H
@@ -51,7 +15,7 @@
// We mean it.
//
-#include "QtCore/qglobal.h"
+#include "QtCore/private/qglobal_p.h"
#include <array>
#include <type_traits>
diff --git a/src/corelib/tools/qmap.h b/src/corelib/tools/qmap.h
index f2f1bc96f4..7ee0be1e51 100644
--- a/src/corelib/tools/qmap.h
+++ b/src/corelib/tools/qmap.h
@@ -1,46 +1,11 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
-** Copyright (C) 2021 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QMAP_H
#define QMAP_H
+#include <QtCore/qhashfunctions.h>
#include <QtCore/qiterator.h>
#include <QtCore/qlist.h>
#include <QtCore/qrefcount.h>
@@ -238,7 +203,7 @@ public:
void swap(QMap<Key, T> &other) noexcept
{
- qSwap(d, other.d);
+ d.swap(other.d);
}
QMap(std::initializer_list<std::pair<Key, T>> list)
@@ -276,7 +241,7 @@ public:
return {};
}
-#ifndef Q_CLANG_QDOC
+#ifndef Q_QDOC
template <typename AKey = Key, typename AT = T> friend
QTypeTraits::compare_eq_result_container<QMap, AKey, AT> operator==(const QMap &lhs, const QMap &rhs)
{
@@ -297,7 +262,7 @@ public:
#else
friend bool operator==(const QMap &lhs, const QMap &rhs);
friend bool operator!=(const QMap &lhs, const QMap &rhs);
-#endif // Q_CLANG_QDOC
+#endif // Q_QDOC
size_type size() const { return d ? size_type(d->m.size()) : size_type(0); }
@@ -646,6 +611,10 @@ public:
const_key_value_iterator constKeyValueBegin() const { return const_key_value_iterator(begin()); }
const_key_value_iterator keyValueEnd() const { return const_key_value_iterator(end()); }
const_key_value_iterator constKeyValueEnd() const { return const_key_value_iterator(end()); }
+ auto asKeyValueRange() & { return QtPrivate::QKeyValueRange(*this); }
+ auto asKeyValueRange() const & { return QtPrivate::QKeyValueRange(*this); }
+ auto asKeyValueRange() && { return QtPrivate::QKeyValueRange(std::move(*this)); }
+ auto asKeyValueRange() const && { return QtPrivate::QKeyValueRange(std::move(*this)); }
iterator erase(const_iterator it)
{
@@ -794,7 +763,7 @@ public:
return isEmpty();
}
- QPair<iterator, iterator> equal_range(const Key &akey)
+ std::pair<iterator, iterator> equal_range(const Key &akey)
{
const auto copy = d.isShared() ? *this : QMap(); // keep `key` alive across the detach
detach();
@@ -802,13 +771,38 @@ public:
return {iterator(result.first), iterator(result.second)};
}
- QPair<const_iterator, const_iterator> equal_range(const Key &akey) const
+ std::pair<const_iterator, const_iterator> equal_range(const Key &akey) const
{
if (!d)
return {};
auto result = d->m.equal_range(akey);
return {const_iterator(result.first), const_iterator(result.second)};
}
+
+private:
+#ifdef Q_QDOC
+ friend size_t qHash(const QMap &key, size_t seed = 0);
+#else
+# if defined(Q_CC_GHS) || defined (Q_CC_MSVC)
+ // GHS and MSVC tries to intantiate qHash() for the noexcept running into a
+ // non-SFINAE'ed hard error... Create an artificial SFINAE context as a
+ // work-around:
+ template <typename M, std::enable_if_t<std::is_same_v<M, QMap>, bool> = true>
+ friend QtPrivate::QHashMultiReturnType<typename M::key_type, typename M::mapped_type>
+# else
+ using M = QMap;
+ friend size_t
+# endif
+ qHash(const M &key, size_t seed = 0)
+ noexcept(QHashPrivate::noexceptPairHash<typename M::key_type, typename M::mapped_type>())
+ {
+ if (!key.d)
+ return seed;
+ // don't use qHashRange to avoid its compile-time overhead:
+ return std::accumulate(key.d->m.begin(), key.d->m.end(), seed,
+ QtPrivate::QHashCombine{});
+ }
+#endif // !Q_QDOC
};
Q_DECLARE_ASSOCIATIVE_ITERATOR(Map)
@@ -820,6 +814,7 @@ qsizetype erase_if(QMap<Key, T> &map, Predicate pred)
return QtPrivate::associative_erase_if(map, pred);
}
+
//
// QMultiMap
//
@@ -849,7 +844,7 @@ public:
void swap(QMultiMap<Key, T> &other) noexcept
{
- qSwap(d, other.d);
+ d.swap(other.d);
}
explicit QMultiMap(const QMap<Key, T> &other)
@@ -917,7 +912,7 @@ public:
return {};
}
-#ifndef Q_CLANG_QDOC
+#ifndef Q_QDOC
template <typename AKey = Key, typename AT = T> friend
QTypeTraits::compare_eq_result_container<QMultiMap, AKey, AT> operator==(const QMultiMap &lhs, const QMultiMap &rhs)
{
@@ -938,7 +933,7 @@ public:
#else
friend bool operator==(const QMultiMap &lhs, const QMultiMap &rhs);
friend bool operator!=(const QMultiMap &lhs, const QMultiMap &rhs);
-#endif // Q_CLANG_QDOC
+#endif // Q_QDOC
size_type size() const { return d ? size_type(d->m.size()) : size_type(0); }
@@ -1341,6 +1336,10 @@ public:
const_key_value_iterator constKeyValueBegin() const { return const_key_value_iterator(begin()); }
const_key_value_iterator keyValueEnd() const { return const_key_value_iterator(end()); }
const_key_value_iterator constKeyValueEnd() const { return const_key_value_iterator(end()); }
+ auto asKeyValueRange() & { return QtPrivate::QKeyValueRange(*this); }
+ auto asKeyValueRange() const & { return QtPrivate::QKeyValueRange(*this); }
+ auto asKeyValueRange() && { return QtPrivate::QKeyValueRange(std::move(*this)); }
+ auto asKeyValueRange() const && { return QtPrivate::QKeyValueRange(std::move(*this)); }
iterator erase(const_iterator it)
{
@@ -1520,7 +1519,7 @@ public:
// STL compatibility
inline bool empty() const { return isEmpty(); }
- QPair<iterator, iterator> equal_range(const Key &akey)
+ std::pair<iterator, iterator> equal_range(const Key &akey)
{
const auto copy = d.isShared() ? *this : QMultiMap(); // keep `key` alive across the detach
detach();
@@ -1528,7 +1527,7 @@ public:
return {iterator(result.first), iterator(result.second)};
}
- QPair<const_iterator, const_iterator> equal_range(const Key &akey) const
+ std::pair<const_iterator, const_iterator> equal_range(const Key &akey) const
{
if (!d)
return {};
diff --git a/src/corelib/tools/qmap.qdoc b/src/corelib/tools/qmap.qdoc
index 55c2bcb5d9..0cabf3df38 100644
--- a/src/corelib/tools/qmap.qdoc
+++ b/src/corelib/tools/qmap.qdoc
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
\class QMap
@@ -123,27 +87,17 @@
The items are traversed in ascending key order.
- Normally, a QMap allows only one value per key. If you call
+ A QMap allows only one value per key. If you call
insert() with a key that already exists in the QMap, the
previous value will be erased. For example:
\snippet code/src_corelib_tools_qmap.cpp 9
However, you can store multiple values per key by using
- QMultiMap. If you want
- to retrieve all the values for a single key, you can use
- values(const Key &key), which returns a QList<T>:
-
- \snippet code/src_corelib_tools_qmap.cpp 10
-
- Another approach is to call
- find() to get the STL-style iterator for the first item with a
- key and iterate from there:
-
- \snippet code/src_corelib_tools_qmap.cpp 11
+ QMultiMap.
If you only need to extract the values from a map (not the keys),
- you can also use \l{foreach}:
+ you can also use range-based for:
\snippet code/src_corelib_tools_qmap.cpp 12
@@ -243,11 +197,20 @@
\sa toStdMap()
*/
-/*! \fn template <class Key, class T> std::map<Key, T> QMap<Key, T>::toStdMap() const
+/*! \fn template <class Key, class T> std::map<Key, T> QMap<Key, T>::toStdMap() const &
Returns an STL map equivalent to this QMap.
*/
+/*! \fn template <class Key, class T> std::map<Key, T> QMap<Key, T>::toStdMap() &&
+
+ \overload
+ \since 6.0
+
+ \note Calling this function will leave this QMap in the partially-formed state, in which
+ the only valid operations are destruction or assignment of a new value.
+*/
+
/*! \fn template <class Key, class T> bool QMap<Key, T>::operator==(const QMap<Key, T> &lhs, const QMap<Key, T> &rhs)
Returns \c true if \a lhs is equal to \a rhs; otherwise returns
@@ -354,9 +317,7 @@
the value associated with it.
If the item does not exist in the map, the function simply
- returns a \l{default-constructed value}. If there are multiple
- items for \a key in the map, only the most recently inserted one
- is removed and returned.
+ returns a \l{default-constructed value}.
If you don't use the return value, remove() is more efficient.
@@ -406,9 +367,7 @@
If the map contains no item with key \a key, the function inserts
a \l{default-constructed value} into the map with key \a key, and
- returns a reference to it. If the map contains multiple items
- with key \a key, this function returns a reference to the most
- recently inserted value.
+ returns a reference to it.
\sa insert(), value()
*/
@@ -431,7 +390,7 @@
use that entails can be avoided by iterating from \l keyBegin() to
\l keyEnd().
- \sa QMultiMap::uniqueKeys(), values(), key()
+ \sa values(), key()
*/
/*! \fn template <class Key, class T> QList<Key> QMap<Key, T>::keys(const T &value) const
@@ -449,9 +408,7 @@
/*! \fn template <class Key, class T> QList<T> QMap<Key, T>::values() const
Returns a list containing all the values in the map, in ascending
- order of their keys. If a key is associated with multiple values,
- all of its values will be in the list, and not just the most
- recently inserted one.
+ order of their keys.
This function creates a new list, in \l {linear time}. The time and memory
use that entails can be avoided by iterating from \l keyValueBegin() to
@@ -663,6 +620,25 @@
\sa constKeyValueBegin()
*/
+/*! \fn template <class Key, class T> auto QMap<Key, T>::asKeyValueRange() &
+ \fn template <class Key, class T> auto QMap<Key, T>::asKeyValueRange() const &
+ \fn template <class Key, class T> auto QMap<Key, T>::asKeyValueRange() &&
+ \fn template <class Key, class T> auto QMap<Key, T>::asKeyValueRange() const &&
+ \since 6.4
+
+ Returns a range object that allows iteration over this map as
+ key/value pairs. For instance, this range object can be used in a
+ range-based for loop, in combination with a structured binding declaration:
+
+ \snippet code/src_corelib_tools_qmap.cpp 28
+
+ Note that both the key and the value obtained this way are
+ references to the ones in the map. Specifically, mutating the value
+ will modify the map itself.
+
+ \sa QKeyValueIterator
+*/
+
/*! \fn template <class Key, class T> QMap<Key, T>::iterator QMap<Key, T>::erase(const_iterator pos)
Removes the (key, value) pair pointed to by the iterator \a pos
@@ -754,7 +730,7 @@
If there is already an item with the key \a key, that item's value
is replaced with \a value.
- \sa QMultiMap::insert()
+ Returns an iterator pointing to the new/updated element.
*/
/*! \fn template <class Key, class T> QMap<Key, T>::iterator QMap<Key, T>::insert(const_iterator pos, const Key &key, const T &value)
@@ -780,7 +756,7 @@
\b {Note:} Be careful with the hint. Providing an iterator from an older shared instance might
crash but there is also a risk that it will silently corrupt both the map and the \a pos map.
- \sa QMultiMap::insert()
+ Returns an iterator pointing to the new/updated element.
*/
/*! \fn template <class Key, class T> void QMap<Key, T>::insert(const QMap<Key, T> &map)
@@ -790,11 +766,6 @@
If a key is common to both maps, its value will be replaced with
the value stored in \a map.
-
- \note If \a map contains multiple entries with the same key then the
- final value of the key is undefined.
-
- \sa QMultiMap::insert()
*/
/*! \fn template <class Key, class T> void QMap<Key, T>::insert(QMap<Key, T> &&map)
@@ -810,12 +781,12 @@
/*! \typedef QMap::Iterator
- Qt-style synonym for QMap<Key, T>::iterator.
+ Qt-style synonym for QMap::iterator.
*/
/*! \typedef QMap::ConstIterator
- Qt-style synonym for QMap<Key, T>::const_iterator.
+ Qt-style synonym for QMap::const_iterator.
*/
/*! \typedef QMap::difference_type
@@ -847,14 +818,14 @@
*/
/*!
- \fn template <class Key, class T> QPair<typename QMap<Key, T>::iterator, typename QMap<Key, T>::iterator> QMap<Key, T>::equal_range(const Key &key)
+ \fn template <class Key, class T> std::pair<typename QMap<Key, T>::iterator, typename QMap<Key, T>::iterator> QMap<Key, T>::equal_range(const Key &key)
Returns a pair of iterators delimiting the range of values \c{[first, second)}, that
are stored under \a key.
*/
/*!
- \fn template <class Key, class T> QPair<typename QMap<Key, T>::const_iterator, typename QMap<Key, T>::const_iterator> QMap<Key, T>::equal_range(const Key &key) const
+ \fn template <class Key, class T> std::pair<typename QMap<Key, T>::const_iterator, typename QMap<Key, T>::const_iterator> QMap<Key, T>::equal_range(const Key &key) const
\overload
\since 5.6
*/
@@ -864,12 +835,6 @@
\inmodule QtCore
\brief The QMap::iterator class provides an STL-style non-const iterator for QMap.
- QMap features both \l{STL-style iterators} and \l{Java-style
- iterators}. The STL-style iterators are more low-level and more
- cumbersome to use; on the other hand, they are slightly faster
- and, for developers who already know STL, have the advantage of
- familiarity.
-
QMap\<Key, T\>::iterator allows you to iterate over a QMap
and to modify the value (but not the key) stored under
a particular key. If you want to iterate over a const QMap, you
@@ -889,31 +854,15 @@
Unlike QHash, which stores its items in an arbitrary order, QMap
stores its items ordered by key.
- Let's see a few examples of things we can do with a
- QMap::iterator that we cannot do with a QMap::const_iterator.
Here's an example that increments every value stored in the QMap
by 2:
\snippet code/src_corelib_tools_qmap.cpp 19
- Here's an example that removes all the items whose key is a
- string that starts with an underscore character:
-
- \snippet code/src_corelib_tools_qmap.cpp 20
-
- The call to QMap::erase() removes the item pointed to by the
- iterator from the map, and returns an iterator to the next item.
- Here's another way of removing an item while iterating:
+ To remove elements from a QMap you can use erase_if(QMap\<Key, T\> &map, Predicate pred):
\snippet code/src_corelib_tools_qmap.cpp 21
- It might be tempting to write code like this:
-
- \snippet code/src_corelib_tools_qmap.cpp 22
-
- However, this will potentially crash in \c{++i}, because \c i is
- a dangling iterator after the call to erase().
-
Multiple iterators can be used on the same map. If you add items
to the map, existing iterators will remain valid. If you remove
items from the map, iterators that point to the removed items
@@ -924,7 +873,7 @@
while iterators are active on that container. For more information,
read \l{Implicit sharing iterator problem}.
- \sa QMap::const_iterator, QMap::key_iterator, QMutableMapIterator
+ \sa QMap::const_iterator, QMap::key_iterator, QMap::key_value_iterator
*/
/*! \typedef QMap::iterator::difference_type
@@ -1025,7 +974,7 @@
/*! \fn template <class Key, class T> QMap<Key, T>::iterator &QMap<Key, T>::iterator::operator++()
- The prefix ++ operator (\c{++i}) advances the iterator to the
+ The prefix \c{++} operator (\c{++i}) advances the iterator to the
next item in the map and returns an iterator to the new current
item.
@@ -1038,14 +987,14 @@
\overload
- The postfix ++ operator (\c{i++}) advances the iterator to the
+ The postfix \c{++} operator (\c{i++}) advances the iterator to the
next item in the map and returns an iterator to the previously
current item.
*/
/*! \fn template <class Key, class T> QMap<Key, T>::iterator &QMap<Key, T>::iterator::operator--()
- The prefix -- operator (\c{--i}) makes the preceding item
+ The prefix \c{--} operator (\c{--i}) makes the preceding item
current and returns an iterator pointing to the new current item.
Calling this function on QMap::begin() leads to undefined
@@ -1058,7 +1007,7 @@
\overload
- The postfix -- operator (\c{i--}) makes the preceding item
+ The postfix \c{--} operator (\c{i--}) makes the preceding item
current and returns an iterator pointing to the previously
current item.
*/
@@ -1084,12 +1033,6 @@
\inmodule QtCore
\brief The QMap::const_iterator class provides an STL-style const iterator for QMap.
- QMap features both \l{STL-style iterators} and \l{Java-style
- iterators}. The STL-style iterators are more low-level and more
- cumbersome to use; on the other hand, they are slightly faster
- and, for developers who already know STL, have the advantage of
- familiarity.
-
QMap\<Key, T\>::const_iterator allows you to iterate over a QMap.
If you want to modify the QMap as you iterate
over it, you must use QMap::iterator instead. It is generally
@@ -1100,12 +1043,20 @@
The default QMap::const_iterator constructor creates an
uninitialized iterator. You must initialize it using a QMap
- function like QMap::constBegin(), QMap::constEnd(), or
- QMap::find() before you can start iterating. Here's a typical
+ function like QMap::cbegin(), QMap::cend(), or
+ QMap::constFind() before you can start iterating. Here's a typical
loop that prints all the (key, value) pairs stored in a map:
\snippet code/src_corelib_tools_qmap.cpp 24
+ Here's an example that removes all the items whose value is greater than 10:
+
+ \snippet code/src_corelib_tools_qmap.cpp 20
+
+ And here the same behavior with erase_if()
+
+ \snippet code/src_corelib_tools_qmap.cpp 21
+
Unlike QHash, which stores its items in an arbitrary order, QMap
stores its items ordered by key.
@@ -1119,7 +1070,7 @@
while iterators are active on that container. For more information,
read \l{Implicit sharing iterator problem}.
- \sa QMap::iterator, QMap::key_iterator, QMapIterator
+ \sa QMap::iterator, QMap::key_iterator, QMap::const_key_value_iterator
*/
/*! \typedef QMap::const_iterator::difference_type
@@ -1196,7 +1147,7 @@
/*! \fn template <class Key, class T> QMap<Key, T>::const_iterator &QMap<Key, T>::const_iterator::operator++()
- The prefix ++ operator (\c{++i}) advances the iterator to the
+ The prefix \c{++} operator (\c{++i}) advances the iterator to the
next item in the map and returns an iterator to the new current
item.
@@ -1209,14 +1160,14 @@
\overload
- The postfix ++ operator (\c{i++}) advances the iterator to the
+ The postfix \c{++} operator (\c{i++}) advances the iterator to the
next item in the map and returns an iterator to the previously
current item.
*/
/*! \fn template <class Key, class T> QMap<Key, T>::const_iterator &QMap<Key, T>::const_iterator::operator--()
- The prefix -- operator (\c{--i}) makes the preceding item
+ The prefix \c{--} operator (\c{--i}) makes the preceding item
current and returns an iterator pointing to the new current item.
Calling this function on QMap::begin() leads to undefined
@@ -1229,7 +1180,7 @@
\overload
- The postfix -- operator (\c{i--}) makes the preceding item
+ The postfix \c{--} operator (\c{i--}) makes the preceding item
current and returns an iterator pointing to the previously
current item.
*/
@@ -1337,7 +1288,7 @@
/*!
\fn template <class Key, class T> QMap<Key, T>::key_iterator &QMap<Key, T>::key_iterator::operator++()
- The prefix ++ operator (\c{++i}) advances the iterator to the
+ The prefix \c{++} operator (\c{++i}) advances the iterator to the
next item in the hash and returns an iterator to the new current
item.
@@ -1350,14 +1301,14 @@
\overload
- The postfix ++ operator (\c{i++}) advances the iterator to the
+ The postfix \c{++} operator (\c{i++}) advances the iterator to the
next item in the hash and returns an iterator to the previous
item.
*/
/*! \fn template <class Key, class T> QMap<Key, T>::key_iterator &QMap<Key, T>::key_iterator::operator--()
- The prefix -- operator (\c{--i}) makes the preceding item
+ The prefix \c{--} operator (\c{--i}) makes the preceding item
current and returns an iterator pointing to the new current item.
Calling this function on QMap::keyBegin() leads to undefined
@@ -1370,7 +1321,7 @@
\overload
- The postfix -- operator (\c{i--}) makes the preceding item
+ The postfix \c{--} operator (\c{i--}) makes the preceding item
current and returns an iterator pointing to the previous
item.
*/
@@ -1438,3 +1389,12 @@
Returns the number of elements removed, if any.
*/
+
+/*!
+ \fn template <class Key, class T> size_t QMap<Key, T>::qHash(const QMap &key, size_t seed) noexcept
+ \since 6.8
+
+ Returns the hash value for \a key, using \a seed to seed the calculation.
+
+ Types \c Key and \c T must be supported by qHash().
+*/
diff --git a/src/corelib/tools/qmargins.cpp b/src/corelib/tools/qmargins.cpp
index 8f18528ce2..1d2cb7d6e5 100644
--- a/src/corelib/tools/qmargins.cpp
+++ b/src/corelib/tools/qmargins.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qmargins.h"
#include "qdatastream.h"
@@ -406,6 +370,15 @@ QT_BEGIN_NAMESPACE
\since 5.1
*/
+/*!
+ \fn QMargins::toMarginsF() const
+ \since 6.4
+
+ Returns these margins as margins with floating point accuracy.
+
+ \sa QMarginsF::toMargins()
+*/
+
/*****************************************************************************
QMargins stream functions
*****************************************************************************/
@@ -500,7 +473,9 @@ QDebug operator<<(QDebug dbg, const QMargins &m)
/*!
\fn QMarginsF::QMarginsF(const QMargins &margins)
- Constructs margins copied from the given \a margins
+ Constructs margins copied from the given \a margins.
+
+ \sa QMargins::toMarginsF()
*/
/*!
@@ -509,7 +484,7 @@ QDebug operator<<(QDebug dbg, const QMargins &m)
Returns \c true if all margins are very close to 0; otherwise returns
false.
- \sa {<QtGlobal>::}{qFuzzyIsNull}
+ \sa {<QtNumeric>::}{qFuzzyIsNull()}
*/
@@ -768,7 +743,7 @@ QDebug operator<<(QDebug dbg, const QMargins &m)
Note that the components in the returned margins will be rounded to
the nearest integer.
- \sa QMarginsF()
+ \sa QMarginsF(), QMargins::toMarginsF()
*/
/*****************************************************************************
diff --git a/src/corelib/tools/qmargins.h b/src/corelib/tools/qmargins.h
index cf40b89ee0..f8d7150dfd 100644
--- a/src/corelib/tools/qmargins.h
+++ b/src/corelib/tools/qmargins.h
@@ -1,49 +1,20 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QMARGINS_H
#define QMARGINS_H
#include <QtCore/qnamespace.h>
+#include <QtCore/q20type_traits.h>
+#include <QtCore/q23utility.h>
+
QT_BEGIN_NAMESPACE
+QT_ENABLE_P0846_SEMANTICS_FOR(get)
+
+class QMarginsF;
+
/*****************************************************************************
QMargins class
*****************************************************************************/
@@ -75,6 +46,8 @@ public:
constexpr QMargins &operator*=(qreal) noexcept;
constexpr QMargins &operator/=(qreal);
+ [[nodiscard]] constexpr inline QMarginsF toMarginsF() const noexcept;
+
private:
int m_left;
int m_top;
@@ -98,17 +71,17 @@ private:
template <std::size_t I,
typename M,
std::enable_if_t<(I < 4), bool> = true,
- std::enable_if_t<std::is_same_v<std::decay_t<M>, QMargins>, bool> = true>
+ std::enable_if_t<std::is_same_v<q20::remove_cvref_t<M>, QMargins>, bool> = true>
friend constexpr decltype(auto) get(M &&m) noexcept
{
if constexpr (I == 0)
- return (std::forward<M>(m).m_left);
+ return q23::forward_like<M>(m.m_left);
else if constexpr (I == 1)
- return (std::forward<M>(m).m_top);
+ return q23::forward_like<M>(m.m_top);
else if constexpr (I == 2)
- return (std::forward<M>(m).m_right);
+ return q23::forward_like<M>(m.m_right);
else if constexpr (I == 3)
- return (std::forward<M>(m).m_bottom);
+ return q23::forward_like<M>(m.m_bottom);
}
};
@@ -347,17 +320,17 @@ private:
template <std::size_t I,
typename M,
std::enable_if_t<(I < 4), bool> = true,
- std::enable_if_t<std::is_same_v<std::decay_t<M>, QMarginsF>, bool> = true>
+ std::enable_if_t<std::is_same_v<q20::remove_cvref_t<M>, QMarginsF>, bool> = true>
friend constexpr decltype(auto) get(M &&m) noexcept
{
if constexpr (I == 0)
- return (std::forward<M>(m).m_left);
+ return q23::forward_like<M>(m.m_left);
else if constexpr (I == 1)
- return (std::forward<M>(m).m_top);
+ return q23::forward_like<M>(m.m_top);
else if constexpr (I == 2)
- return (std::forward<M>(m).m_right);
+ return q23::forward_like<M>(m.m_right);
else if constexpr (I == 3)
- return (std::forward<M>(m).m_bottom);
+ return q23::forward_like<M>(m.m_bottom);
}
};
@@ -516,6 +489,8 @@ constexpr inline QMarginsF operator-(const QMarginsF &margins) noexcept
return QMarginsF(-margins.left(), -margins.top(), -margins.right(), -margins.bottom());
}
+constexpr QMarginsF QMargins::toMarginsF() const noexcept { return *this; }
+
constexpr inline QMargins QMarginsF::toMargins() const noexcept
{
return QMargins(qRound(m_left), qRound(m_top), qRound(m_right), qRound(m_bottom));
diff --git a/src/corelib/tools/qmessageauthenticationcode.cpp b/src/corelib/tools/qmessageauthenticationcode.cpp
deleted file mode 100644
index 767a7a14d4..0000000000
--- a/src/corelib/tools/qmessageauthenticationcode.cpp
+++ /dev/null
@@ -1,283 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 Ruslan Nigmatullin <euroelessar@yandex.ru>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qmessageauthenticationcode.h"
-#include "qvarlengtharray.h"
-
-#include "qtcore-config_p.h"
-
-// Header from rfc6234
-#include "../../3rdparty/rfc6234/sha.h"
-
-#if QT_CONFIG(system_libb2)
-#include <blake2.h>
-#else
-#include "../../3rdparty/blake2/src/blake2.h"
-#endif
-
-QT_BEGIN_NAMESPACE
-
-static int qt_hash_block_size(QCryptographicHash::Algorithm method)
-{
- switch (method) {
- case QCryptographicHash::Md4:
- return 64;
- case QCryptographicHash::Md5:
- return 64;
- case QCryptographicHash::Sha1:
- return SHA1_Message_Block_Size;
- case QCryptographicHash::Sha224:
- return SHA224_Message_Block_Size;
- case QCryptographicHash::Sha256:
- return SHA256_Message_Block_Size;
- case QCryptographicHash::Sha384:
- return SHA384_Message_Block_Size;
- case QCryptographicHash::Sha512:
- return SHA512_Message_Block_Size;
- case QCryptographicHash::RealSha3_224:
- case QCryptographicHash::Keccak_224:
- return 144;
- case QCryptographicHash::RealSha3_256:
- case QCryptographicHash::Keccak_256:
- return 136;
- case QCryptographicHash::RealSha3_384:
- case QCryptographicHash::Keccak_384:
- return 104;
- case QCryptographicHash::RealSha3_512:
- case QCryptographicHash::Keccak_512:
- return 72;
- case QCryptographicHash::Blake2b_160:
- case QCryptographicHash::Blake2b_256:
- case QCryptographicHash::Blake2b_384:
- case QCryptographicHash::Blake2b_512:
- return BLAKE2B_BLOCKBYTES;
- case QCryptographicHash::Blake2s_128:
- case QCryptographicHash::Blake2s_160:
- case QCryptographicHash::Blake2s_224:
- case QCryptographicHash::Blake2s_256:
- return BLAKE2S_BLOCKBYTES;
- }
- return 0;
-}
-
-class QMessageAuthenticationCodePrivate
-{
-public:
- QMessageAuthenticationCodePrivate(QCryptographicHash::Algorithm m)
- : messageHash(m), method(m), messageHashInited(false)
- {
- }
-
- QByteArray key;
- QByteArray result;
- QCryptographicHash messageHash;
- QCryptographicHash::Algorithm method;
- bool messageHashInited;
-
- void initMessageHash();
-};
-
-void QMessageAuthenticationCodePrivate::initMessageHash()
-{
- if (messageHashInited)
- return;
- messageHashInited = true;
-
- const int blockSize = qt_hash_block_size(method);
-
- if (key.size() > blockSize) {
- key = QCryptographicHash::hash(key, method);
- }
-
- if (key.size() < blockSize) {
- const int size = key.size();
- key.resize(blockSize);
- memset(key.data() + size, 0, blockSize - size);
- }
-
- QVarLengthArray<char> iKeyPad(blockSize);
- const char * const keyData = key.constData();
-
- for (int i = 0; i < blockSize; ++i)
- iKeyPad[i] = keyData[i] ^ 0x36;
-
- messageHash.addData(iKeyPad);
-}
-
-/*!
- \class QMessageAuthenticationCode
- \inmodule QtCore
-
- \brief The QMessageAuthenticationCode class provides a way to generate
- hash-based message authentication codes.
-
- \since 5.1
-
- \ingroup tools
- \reentrant
-
- QMessageAuthenticationCode supports all cryptographic hashes which are supported by
- QCryptographicHash.
-
- To generate message authentication code, pass hash algorithm QCryptographicHash::Algorithm
- to constructor, then set key and message by setKey() and addData() functions. Result
- can be acquired by result() function.
- \snippet qmessageauthenticationcode/main.cpp 0
- \dots
- \snippet qmessageauthenticationcode/main.cpp 1
-
- Alternatively, this effect can be achieved by providing message,
- key and method to hash() method.
- \snippet qmessageauthenticationcode/main.cpp 2
-
- \sa QCryptographicHash
-*/
-
-/*!
- Constructs an object that can be used to create a cryptographic hash from data
- using method \a method and key \a key.
-*/
-QMessageAuthenticationCode::QMessageAuthenticationCode(QCryptographicHash::Algorithm method,
- const QByteArray &key)
- : d(new QMessageAuthenticationCodePrivate(method))
-{
- d->key = key;
-}
-
-/*!
- Destroys the object.
-*/
-QMessageAuthenticationCode::~QMessageAuthenticationCode()
-{
- delete d;
-}
-
-/*!
- Resets message data. Calling this method doesn't affect the key.
-*/
-void QMessageAuthenticationCode::reset()
-{
- d->result.clear();
- d->messageHash.reset();
- d->messageHashInited = false;
-}
-
-/*!
- Sets secret \a key. Calling this method automatically resets the object state.
-*/
-void QMessageAuthenticationCode::setKey(const QByteArray &key)
-{
- reset();
- d->key = key;
-}
-
-/*!
- Adds the first \a length chars of \a data to the message.
-*/
-void QMessageAuthenticationCode::addData(const char *data, qsizetype length)
-{
- d->initMessageHash();
- d->messageHash.addData({data, length});
-}
-
-/*!
- \overload addData()
-*/
-void QMessageAuthenticationCode::addData(const QByteArray &data)
-{
- d->initMessageHash();
- d->messageHash.addData(data);
-}
-
-/*!
- Reads the data from the open QIODevice \a device until it ends
- and adds it to message. Returns \c true if reading was successful.
-
- \note \a device must be already opened.
- */
-bool QMessageAuthenticationCode::addData(QIODevice *device)
-{
- d->initMessageHash();
- return d->messageHash.addData(device);
-}
-
-/*!
- Returns the final authentication code.
-
- \sa QByteArray::toHex()
-*/
-QByteArray QMessageAuthenticationCode::result() const
-{
- if (!d->result.isEmpty())
- return d->result;
-
- d->initMessageHash();
-
- const int blockSize = qt_hash_block_size(d->method);
-
- QByteArrayView hashedMessage = d->messageHash.resultView();
-
- QVarLengthArray<char> oKeyPad(blockSize);
- const char * const keyData = d->key.constData();
-
- for (int i = 0; i < blockSize; ++i)
- oKeyPad[i] = keyData[i] ^ 0x5c;
-
- QCryptographicHash hash(d->method);
- hash.addData(oKeyPad);
- hash.addData(hashedMessage);
-
- d->result = hash.result();
- return d->result;
-}
-
-/*!
- Returns the authentication code for the message \a message using
- the key \a key and the method \a method.
-*/
-QByteArray QMessageAuthenticationCode::hash(const QByteArray &message, const QByteArray &key,
- QCryptographicHash::Algorithm method)
-{
- QMessageAuthenticationCode mac(method);
- mac.setKey(key);
- mac.addData(message);
- return mac.result();
-}
-
-QT_END_NAMESPACE
diff --git a/src/corelib/tools/qmessageauthenticationcode.h b/src/corelib/tools/qmessageauthenticationcode.h
index 343bf9d617..4e88138763 100644
--- a/src/corelib/tools/qmessageauthenticationcode.h
+++ b/src/corelib/tools/qmessageauthenticationcode.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 Ruslan Nigmatullin <euroelessar@yandex.ru>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2013 Ruslan Nigmatullin <euroelessar@yandex.ru>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QMESSAGEAUTHENTICATIONCODE_H
#define QMESSAGEAUTHENTICATIONCODE_H
@@ -48,25 +12,48 @@ QT_BEGIN_NAMESPACE
class QMessageAuthenticationCodePrivate;
class QIODevice;
+// implemented in qcryptographichash.cpp
class Q_CORE_EXPORT QMessageAuthenticationCode
{
public:
+#if QT_CORE_REMOVED_SINCE(6, 6)
explicit QMessageAuthenticationCode(QCryptographicHash::Algorithm method,
- const QByteArray &key = QByteArray());
+ const QByteArray &key);
+#endif
+ explicit QMessageAuthenticationCode(QCryptographicHash::Algorithm method,
+ QByteArrayView key = {});
+
+ QMessageAuthenticationCode(QMessageAuthenticationCode &&other) noexcept
+ : d{std::exchange(other.d, nullptr)} {}
~QMessageAuthenticationCode();
- void reset();
+ QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_MOVE_AND_SWAP(QMessageAuthenticationCode)
+ void swap(QMessageAuthenticationCode &other) noexcept
+ { qt_ptr_swap(d, other.d); }
+
+ void reset() noexcept;
+#if QT_CORE_REMOVED_SINCE(6, 6)
void setKey(const QByteArray &key);
+#endif
+ void setKey(QByteArrayView key) noexcept;
void addData(const char *data, qsizetype length);
+#if QT_CORE_REMOVED_SINCE(6, 6)
void addData(const QByteArray &data);
+#endif
+ void addData(QByteArrayView data) noexcept;
bool addData(QIODevice *device);
+ QByteArrayView resultView() const noexcept;
QByteArray result() const;
+#if QT_CORE_REMOVED_SINCE(6, 6)
static QByteArray hash(const QByteArray &message, const QByteArray &key,
QCryptographicHash::Algorithm method);
+#endif
+ static QByteArray hash(QByteArrayView message, QByteArrayView key,
+ QCryptographicHash::Algorithm method);
private:
Q_DISABLE_COPY(QMessageAuthenticationCode)
diff --git a/src/corelib/tools/qminimalflatset_p.h b/src/corelib/tools/qminimalflatset_p.h
new file mode 100644
index 0000000000..6074688f6e
--- /dev/null
+++ b/src/corelib/tools/qminimalflatset_p.h
@@ -0,0 +1,156 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QTCORE_QMINIMALFLATSET_P_H
+#define QTCORE_QMINIMALFLATSET_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QtCore/qcontainerfwd.h>
+#include <QtCore/qfunctionaltools_impl.h> // CompactStorage
+#include <QtCore/private/qglobal_p.h>
+
+//#define QMINIMAL_FLAT_SET_DEBUG
+#ifdef QMINIMAL_FLAT_SET_DEBUG
+# include <QtCore/qscopeguard.h>
+# include <QtCore/qdebug.h>
+# define QMINIMAL_FLAT_SET_PRINT_AT_END \
+ const auto sg = qScopeGuard([&] { qDebug() << this << *this; });
+#else
+# define QMINIMAL_FLAT_SET_PRINT_AT_END
+#endif
+
+#include <algorithm> // for std::lower_bound
+#include <functional> // for std::less, std::ref
+
+QT_BEGIN_NAMESPACE
+
+/*
+ This is a minimal version of a QFlatSet, the std::set version of QFlatMap.
+ Like QFlatMap, it has linear insertion and removal, not logarithmic, like
+ real QMap and std::set, so it's only a good container if you either have
+ very few entries or lots, but with separate setup and lookup stages.
+ Because a full QFlatSet would be 10x the work on writing this minimal one,
+ we keep it here for now. When more users pop up and the class has matured a
+ bit, we can consider moving it as QFlatSet alongside QFlatMap.
+*/
+
+template <typename T, typename Container = QList<T>, typename Compare = std::less<T>>
+class QMinimalFlatSet : QtPrivate::CompactStorage<Compare>
+{
+ Container c;
+ using CompareStorage = QtPrivate::CompactStorage<Compare>;
+public:
+ QMinimalFlatSet() = default;
+ explicit QMinimalFlatSet(const Compare &cmp) : CompareStorage{cmp} {}
+ // Rule Of Zero applies
+
+ using const_iterator = typename Container::const_iterator;
+ using iterator = const_iterator;
+ using const_reverse_iterator = typename Container::const_reverse_iterator;
+ using reverse_iterator = const_reverse_iterator;
+ using value_type = T;
+ using key_compare = Compare;
+ using value_compare = Compare;
+
+ key_compare key_comp() const { return this->object(); }
+ value_compare value_comp() const { return key_comp(); }
+
+ iterator begin() const { return c.cbegin(); }
+ iterator end() const { return c.cend(); }
+ iterator cbegin() const { return begin(); }
+ iterator cend() const { return cend(); }
+
+ reverse_iterator rbegin() const { return c.crbegin(); }
+ reverse_iterator rend() const { return c.crend(); }
+ reverse_iterator crbegin() const { return rbegin(); }
+ reverse_iterator crend() const { return rend(); }
+
+ void clear() {
+ QMINIMAL_FLAT_SET_PRINT_AT_END
+ c.clear();
+ }
+ auto size() const { return c.size(); }
+ auto count() const { return size(); }
+ bool isEmpty() const { return size() == 0; }
+
+ std::pair<iterator, bool> insert(value_type &&v)
+ {
+ QMINIMAL_FLAT_SET_PRINT_AT_END
+ const auto r = lookup(v);
+ if (r.exists)
+ return {r.it, false};
+ else
+ return {c.insert(r.it, std::move(v)), true};
+ }
+
+ std::pair<iterator, bool> insert(const value_type &v)
+ {
+ QMINIMAL_FLAT_SET_PRINT_AT_END
+ const auto r = lookup(v);
+ if (r.exists)
+ return {r.it, false};
+ else
+ return {c.insert(r.it, v), true};
+ }
+
+ void erase(const value_type &v)
+ {
+ QMINIMAL_FLAT_SET_PRINT_AT_END
+ const auto r = lookup(v);
+ if (r.exists)
+ c.erase(r.it);
+ }
+ void remove(const value_type &v) { erase(v); }
+
+ bool contains(const value_type &v) const
+ {
+ return lookup(v).exists;
+ }
+
+ const Container &values() const & { return c; }
+ Container values() && { return std::move(c); }
+
+private:
+ auto lookup(const value_type &v) const
+ {
+ struct R {
+ iterator it;
+ bool exists;
+ };
+
+ auto cmp = std::ref(this->object()); // don't let std::lower_bound copy it
+
+ const auto it = std::lower_bound(c.cbegin(), c.cend(), v, cmp);
+ return R{it, it != c.cend() && !cmp(v, *it)};
+ }
+
+#ifdef QMINIMAL_FLAT_SET_DEBUG
+ friend QDebug operator<<(QDebug dbg, const QMinimalFlatSet &set)
+ {
+ const QDebugStateSaver saver(dbg);
+ dbg.nospace() << "QMinimalFlatSet{";
+ for (auto &e : set)
+ dbg << e << ", ";
+ return dbg << "}";
+ }
+#endif
+};
+
+#undef QMINIMAL_FLAT_SET_PRINT_AT_END
+
+template <typename T, qsizetype N = QVarLengthArrayDefaultPrealloc>
+using QMinimalVarLengthFlatSet = QMinimalFlatSet<T, QVarLengthArray<T, N>>;
+
+QT_END_NAMESPACE
+
+#endif // QTCORE_QMINIMALFLATSET_P_H
diff --git a/src/corelib/tools/qmultimap.qdoc b/src/corelib/tools/qmultimap.qdoc
index 6bfc1515e6..0b05192817 100644
--- a/src/corelib/tools/qmultimap.qdoc
+++ b/src/corelib/tools/qmultimap.qdoc
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
\class QMultiMap
@@ -128,7 +92,7 @@
\snippet code/src_corelib_tools_qmultimap.cpp 11
If you only need to extract the values from a map (not the keys),
- you can also use \l{foreach}:
+ you can also use range-based for:
\snippet code/src_corelib_tools_qmultimap.cpp 12
@@ -246,7 +210,7 @@
Returns an STL multi map equivalent to this QMultiMap.
*/
-/*! \fn template <class Key, class T> std::multimap<Key, T> QMultiMap<Key, T>::toStdMultiMap() const
+/*! \fn template <class Key, class T> std::multimap<Key, T> QMultiMap<Key, T>::toStdMultiMap() const &
Returns an STL multi map equivalent to this QMultiMap.
*/
@@ -693,6 +657,25 @@
\sa constKeyValueBegin()
*/
+/*! \fn template <class Key, class T> auto QMultiMap<Key, T>::asKeyValueRange() &
+ \fn template <class Key, class T> auto QMultiMap<Key, T>::asKeyValueRange() const &
+ \fn template <class Key, class T> auto QMultiMap<Key, T>::asKeyValueRange() &&
+ \fn template <class Key, class T> auto QMultiMap<Key, T>::asKeyValueRange() const &&
+ \since 6.4
+
+ Returns a range object that allows iteration over this multi map as
+ key/value pairs. For instance, this range object can be used in a
+ range-based for loop, in combination with a structured binding declaration:
+
+ \snippet code/src_corelib_tools_qmultimap.cpp 26
+
+ Note that both the key and the value obtained this way are
+ references to the ones in the multi map. Specifically, mutating the value
+ will modify the map itself.
+
+ \sa QKeyValueIterator
+*/
+
/*! \fn template <class Key, class T> QMultiMap<Key, T>::iterator QMultiMap<Key, T>::erase(const_iterator pos)
Removes the (key, value) pair pointed to by the iterator \a pos
@@ -834,6 +817,8 @@
different from replace(), which overwrites the value of an
existing item.)
+ Returns an iterator pointing to the new element.
+
\sa replace()
*/
@@ -856,6 +841,8 @@
is faster than inserting in sorted order with constEnd(), since constEnd() - 1 (which is needed
to check if the hint is valid) needs \l{logarithmic time}.
+ Returns an iterator pointing to the new element.
+
\b {Note:} Be careful with the hint. Providing an iterator from an older shared instance might
crash but there is also a risk that it will silently corrupt both the multi map and the \a pos multi map.
*/
@@ -903,17 +890,19 @@
If there are multiple items with the key \a key, the most
recently inserted item's value is replaced with \a value.
+ Returns an iterator pointing to the new/updated element.
+
\sa insert()
*/
/*! \typedef QMultiMap::Iterator
- Qt-style synonym for QMultiMap<Key, T>::iterator.
+ Qt-style synonym for QMultiMap::iterator.
*/
/*! \typedef QMultiMap::ConstIterator
- Qt-style synonym for QMultiMap<Key, T>::const_iterator.
+ Qt-style synonym for QMultiMap::const_iterator.
*/
/*! \typedef QMultiMap::difference_type
@@ -945,14 +934,14 @@
*/
/*!
- \fn template <class Key, class T> QPair<typename QMultiMap<Key, T>::iterator, typename QMultiMap<Key, T>::iterator> QMultiMap<Key, T>::equal_range(const Key &key)
+ \fn template <class Key, class T> std::pair<typename QMultiMap<Key, T>::iterator, typename QMultiMap<Key, T>::iterator> QMultiMap<Key, T>::equal_range(const Key &key)
Returns a pair of iterators delimiting the range of values \c{[first, second)}, that
are stored under \a key.
*/
/*!
- \fn template <class Key, class T> QPair<typename QMultiMap<Key, T>::const_iterator, typename QMultiMap<Key, T>::const_iterator> QMultiMap<Key, T>::equal_range(const Key &key) const
+ \fn template <class Key, class T> std::pair<typename QMultiMap<Key, T>::const_iterator, typename QMultiMap<Key, T>::const_iterator> QMultiMap<Key, T>::equal_range(const Key &key) const
\overload
\since 5.6
*/
@@ -976,6 +965,7 @@
*/
/*! \fn template <class Key, class T> QMultiMap<Key, T> operator+=(QMultiMap<Key, T> &lhs, const QMultiMap<Key, T> &rhs)
+ \relates QMultiMap
Inserts all the items in the \a rhs map into the \a lhs map and
returns the resulting map.
@@ -984,6 +974,7 @@
*/
/*! \fn template <class Key, class T> QMultiMap<Key, T> operator+(const QMultiMap<Key, T> &lhs, const QMultiMap<Key, T> &rhs)
+ \relates QMultiMap
Returns a map that contains all the items in the \a lhs map in
addition to all the items in \a rhs. If a key is common to both
@@ -996,12 +987,6 @@
\inmodule QtCore
\brief The QMultiMap::iterator class provides an STL-style non-const iterator for QMultiMap.
- QMultiMap features both \l{STL-style iterators} and \l{Java-style
- iterators}. The STL-style iterators are more low-level and more
- cumbersome to use; on the other hand, they are slightly faster
- and, for developers who already know STL, have the advantage of
- familiarity.
-
QMultiMap\<Key, T\>::iterator allows you to iterate over a QMultiMap
and to modify the value (but not the key) stored under
a particular key. If you want to iterate over a const QMultiMap, you
@@ -1016,38 +1001,20 @@
start iterating. Here's a typical loop that prints all the (key,
value) pairs stored in a map:
- \snippet code/src_corelib_tools_qmultimap.cpp 18
-
Unlike QMultiHash, which stores its items in an arbitrary order, QMultiMap
stores its items ordered by key. Items that share the same key
will appear consecutively,
from the most recently to the least recently inserted value.
- Let's see a few examples of things we can do with a
- QMultiMap::iterator that we cannot do with a QMultiMap::const_iterator.
Here's an example that increments every value stored in the QMultiMap
by 2:
\snippet code/src_corelib_tools_qmultimap.cpp 19
- Here's an example that removes all the items whose key is a
- string that starts with an underscore character:
-
- \snippet code/src_corelib_tools_qmultimap.cpp 20
-
- The call to QMultiMap::erase() removes the item pointed to by the
- iterator from the map, and returns an iterator to the next item.
- Here's another way of removing an item while iterating:
+ To remove elements from a QMultiMap you can use erase_if(QMultiMap\<Key, T\> &map, Predicate pred):
\snippet code/src_corelib_tools_qmultimap.cpp 21
- It might be tempting to write code like this:
-
- \snippet code/src_corelib_tools_qmultimap.cpp 22
-
- However, this will potentially crash in \c{++i}, because \c i is
- a dangling iterator after the call to erase().
-
Multiple iterators can be used on the same map. If you add items
to the map, existing iterators will remain valid. If you remove
items from the map, iterators that point to the removed items
@@ -1058,7 +1025,7 @@
while iterators are active on that container. For more information,
read \l{Implicit sharing iterator problem}.
- \sa QMultiMap::const_iterator, QMultiMap::key_iterator, QMutableMultiMapIterator
+ \sa QMultiMap::const_iterator, QMultiMap::key_iterator, QMultiMap::key_value_iterator
*/
/*! \typedef QMultiMap::iterator::difference_type
@@ -1159,7 +1126,7 @@
/*! \fn template <class Key, class T> QMultiMap<Key, T>::iterator &QMultiMap<Key, T>::iterator::operator++()
- The prefix ++ operator (\c{++i}) advances the iterator to the
+ The prefix \c{++} operator (\c{++i}) advances the iterator to the
next item in the multi map and returns an iterator to the new current
item.
@@ -1172,14 +1139,14 @@
\overload
- The postfix ++ operator (\c{i++}) advances the iterator to the
+ The postfix \c{++} operator (\c{i++}) advances the iterator to the
next item in the multi map and returns an iterator to the previously
current item.
*/
/*! \fn template <class Key, class T> QMultiMap<Key, T>::iterator &QMultiMap<Key, T>::iterator::operator--()
- The prefix -- operator (\c{--i}) makes the preceding item
+ The prefix \c{--} operator (\c{--i}) makes the preceding item
current and returns an iterator pointing to the new current item.
Calling this function on QMultiMap::begin() leads to undefined
@@ -1192,7 +1159,7 @@
\overload
- The postfix -- operator (\c{i--}) makes the preceding item
+ The postfix \c{--} operator (\c{i--}) makes the preceding item
current and returns an iterator pointing to the previously
current item.
*/
@@ -1219,12 +1186,6 @@
\inmodule QtCore
\brief The QMultiMap::const_iterator class provides an STL-style const iterator for QMultiMap.
- QMultiMap features both \l{STL-style iterators} and \l{Java-style
- iterators}. The STL-style iterators are more low-level and more
- cumbersome to use; on the other hand, they are slightly faster
- and, for developers who already know STL, have the advantage of
- familiarity.
-
QMultiMap\<Key, T\>::const_iterator allows you to iterate over a QMultiMap.
If you want to modify the QMultiMap as you iterate
over it, you must use QMultiMap::iterator instead. It is generally
@@ -1235,12 +1196,16 @@
The default QMultiMap::const_iterator constructor creates an
uninitialized iterator. You must initialize it using a QMultiMap
- function like QMultiMap::constBegin(), QMultiMap::constEnd(), or
- QMultiMap::find() before you can start iterating. Here's a typical
+ function like QMultiMap::cbegin(), QMultiMap::cend(), or
+ QMultiMap::constFind() before you can start iterating. Here's a typical
loop that prints all the (key, value) pairs stored in a map:
\snippet code/src_corelib_tools_qmultimap.cpp 24
+ Here's an example that removes all the items whose value is greater than 10:
+
+ \snippet code/src_corelib_tools_qmultimap.cpp 20
+
Unlike QMultiHash, which stores its items in an arbitrary order, QMultiMap
stores its items ordered by key. Items that share the same key
will appear consecutively,
@@ -1256,7 +1221,7 @@
while iterators are active on that container. For more information,
read \l{Implicit sharing iterator problem}.
- \sa QMultiMap::iterator, QMultiMap::key_iterator, QMultiMapIterator
+ \sa QMultiMap::iterator, QMultiMap::key_iterator, QMultiMap::const_key_value_iterator
*/
/*! \typedef QMultiMap::const_iterator::difference_type
@@ -1333,7 +1298,7 @@
/*! \fn template <class Key, class T> QMultiMap<Key, T>::const_iterator &QMultiMap<Key, T>::const_iterator::operator++()
- The prefix ++ operator (\c{++i}) advances the iterator to the
+ The prefix \c{++} operator (\c{++i}) advances the iterator to the
next item in the map and returns an iterator to the new current
item.
@@ -1346,14 +1311,14 @@
\overload
- The postfix ++ operator (\c{i++}) advances the iterator to the
+ The postfix \c{++} operator (\c{i++}) advances the iterator to the
next item in the map and returns an iterator to the previously
current item.
*/
/*! \fn template <class Key, class T> QMultiMap<Key, T>::const_iterator &QMultiMap<Key, T>::const_iterator::operator--()
- The prefix -- operator (\c{--i}) makes the preceding item
+ The prefix \c{--} operator (\c{--i}) makes the preceding item
current and returns an iterator pointing to the new current item.
Calling this function on QMultiMap::begin() leads to undefined
@@ -1366,7 +1331,7 @@
\overload
- The postfix -- operator (\c{i--}) makes the preceding item
+ The postfix \c{--} operator (\c{i--}) makes the preceding item
current and returns an iterator pointing to the previously
current item.
*/
@@ -1475,7 +1440,7 @@
/*!
\fn template <class Key, class T> QMultiMap<Key, T>::key_iterator &QMultiMap<Key, T>::key_iterator::operator++()
- The prefix ++ operator (\c{++i}) advances the iterator to the
+ The prefix \c{++} operator (\c{++i}) advances the iterator to the
next item in the hash and returns an iterator to the new current
item.
@@ -1488,14 +1453,14 @@
\overload
- The postfix ++ operator (\c{i++}) advances the iterator to the
+ The postfix \c{++} operator (\c{i++}) advances the iterator to the
next item in the hash and returns an iterator to the previous
item.
*/
/*! \fn template <class Key, class T> QMultiMap<Key, T>::key_iterator &QMultiMap<Key, T>::key_iterator::operator--()
- The prefix -- operator (\c{--i}) makes the preceding item
+ The prefix \c{--} operator (\c{--i}) makes the preceding item
current and returns an iterator pointing to the new current item.
Calling this function on QMultiMap::keyBegin() leads to undefined
@@ -1508,7 +1473,7 @@
\overload
- The postfix -- operator (\c{i--}) makes the preceding item
+ The postfix \c{--} operator (\c{i--}) makes the preceding item
current and returns an iterator pointing to the previous
item.
*/
diff --git a/src/corelib/tools/qoffsetstringarray_p.h b/src/corelib/tools/qoffsetstringarray_p.h
index 8bd7d79afb..9103606a13 100644
--- a/src/corelib/tools/qoffsetstringarray_p.h
+++ b/src/corelib/tools/qoffsetstringarray_p.h
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Copyright (C) 2021 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// Copyright (C) 2021 Intel Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QOFFSETSTRINGARRAY_P_H
#define QOFFSETSTRINGARRAY_P_H
@@ -56,6 +20,7 @@
#include <QByteArrayView>
+#include <QtCore/q20algorithm.h>
#include <array>
#include <limits>
#include <string_view>
@@ -66,7 +31,7 @@ class tst_QOffsetStringArray;
QT_BEGIN_NAMESPACE
QT_WARNING_PUSH
-#if defined(Q_CC_GNU) && Q_CC_GNU >= 1100
+#if defined(Q_CC_GNU_ONLY) && Q_CC_GNU >= 1100
// we usually don't overread, but GCC has a false positive
QT_WARNING_DISABLE_GCC("-Wstringop-overread")
#endif
@@ -98,6 +63,15 @@ public:
constexpr int count() const { return int(m_offsets.size()) - 1; }
+ bool contains(QByteArrayView needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
+ {
+ for (qsizetype i = 0; i < count(); ++i) {
+ if (viewAt(i).compare(needle, cs) == 0)
+ return true;
+ }
+ return false;
+ }
+
private:
StaticString m_string;
OffsetList m_offsets;
@@ -105,21 +79,13 @@ private:
};
namespace QtPrivate {
-// std::copy is not constexpr in C++17
-template <typename II, typename OO>
-static constexpr OO copyData(II input, qsizetype n, OO output)
-{
- using E = decltype(+*output);
- for (qsizetype i = 0; i < n; ++i)
- output[i] = E(input[i]);
- return output + n;
-}
-
template <size_t Highest> constexpr auto minifyValue()
{
- if constexpr (Highest <= std::numeric_limits<quint8>::max()) {
+ constexpr size_t max8 = (std::numeric_limits<quint8>::max)();
+ constexpr size_t max16 = (std::numeric_limits<quint16>::max)();
+ if constexpr (Highest <= max8) {
return quint8(Highest);
- } else if constexpr (Highest <= std::numeric_limits<quint16>::max()) {
+ } else if constexpr (Highest <= max16) {
return quint16(Highest);
} else {
// int is probably enough for everyone
@@ -136,7 +102,7 @@ constexpr auto makeStaticString(Extractor extract, const T &... entries)
const char *strings[] = { extract(entries).operator const char *()... };
size_t lengths[] = { sizeof(extract(T{}))... };
for (size_t i = 0; i < std::size(strings); ++i) {
- copyData(strings[i], lengths[i], result.begin() + offset);
+ q20::copy_n(strings[i], lengths[i], result.begin() + offset);
offset += lengths[i];
}
return result;
@@ -146,7 +112,7 @@ template <size_t N> struct StaticString
{
char value[N] = {};
constexpr StaticString() = default;
- constexpr StaticString(const char (&s)[N]) { copyData(s, N, value); }
+ constexpr StaticString(const char (&s)[N]) { q20::copy_n(s, N, value); }
constexpr operator const char *() const { return value; }
};
@@ -161,10 +127,10 @@ template <size_t KL, size_t VL> struct StaticMapEntry
};
template <typename StringExtractor, typename... T>
-constexpr auto qOffsetStringArray(StringExtractor extractString, const T &... entries)
+constexpr auto makeOffsetStringArray(StringExtractor extractString, const T &... entries)
{
constexpr size_t Count = sizeof...(T);
- constexpr qsizetype StringLength = (sizeof(extractString(T{})) + ...);
+ constexpr size_t StringLength = (sizeof(extractString(T{})) + ...);
using MinifiedOffsetType = decltype(QtPrivate::minifyValue<StringLength>());
size_t offset = 0;
@@ -172,18 +138,20 @@ constexpr auto qOffsetStringArray(StringExtractor extractString, const T &... en
// prepend zero
std::array<MinifiedOffsetType, Count + 1> minifiedOffsetList = {};
- QtPrivate::copyData(fullOffsetList.begin(), Count, minifiedOffsetList.begin() + 1);
+ q20::transform(fullOffsetList.begin(), fullOffsetList.end(),
+ minifiedOffsetList.begin() + 1,
+ [] (auto e) { return MinifiedOffsetType(e); });
std::array staticString = QtPrivate::makeStaticString<StringLength>(extractString, entries...);
return QOffsetStringArray(staticString, minifiedOffsetList);
}
-}
+} // namespace QtPrivate
template<int ... Nx>
constexpr auto qOffsetStringArray(const char (&...strings)[Nx]) noexcept
{
auto extractString = [](const auto &s) -> decltype(auto) { return s; };
- return QtPrivate::qOffsetStringArray(extractString, QtPrivate::StaticString(strings)...);
+ return QtPrivate::makeOffsetStringArray(extractString, QtPrivate::StaticString(strings)...);
}
QT_WARNING_POP
diff --git a/src/corelib/tools/qpair.h b/src/corelib/tools/qpair.h
index 6cb7fc5079..84f99075e1 100644
--- a/src/corelib/tools/qpair.h
+++ b/src/corelib/tools/qpair.h
@@ -1,45 +1,10 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QPAIR_H
#define QPAIR_H
+#include <QtCore/qcontainerfwd.h>
#include <QtCore/qglobal.h>
QT_BEGIN_NAMESPACE
@@ -48,8 +13,7 @@ QT_BEGIN_NAMESPACE
#pragma qt_class(QPair)
#endif
-template <typename T1, typename T2>
-using QPair = std::pair<T1, T2>;
+#ifndef QT_NO_QPAIR
template <typename T1, typename T2>
constexpr decltype(auto) qMakePair(T1 &&value1, T2 &&value2)
@@ -58,8 +22,7 @@ constexpr decltype(auto) qMakePair(T1 &&value1, T2 &&value2)
return std::make_pair(std::forward<T1>(value1), std::forward<T2>(value2));
}
-template<class T1, class T2>
-class QTypeInfo<std::pair<T1, T2>> : public QTypeInfoMerger<std::pair<T1, T2>, T1, T2> {};
+#endif // QT_NO_QPAIR
QT_END_NAMESPACE
diff --git a/src/corelib/tools/qpair.qdoc b/src/corelib/tools/qpair.qdoc
index 3cd1beec18..3aaee157d4 100644
--- a/src/corelib/tools/qpair.qdoc
+++ b/src/corelib/tools/qpair.qdoc
@@ -1,29 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
\typealias QPair
diff --git a/src/corelib/tools/qpoint.cpp b/src/corelib/tools/qpoint.cpp
index 80599a4caa..d1f3b12a68 100644
--- a/src/corelib/tools/qpoint.cpp
+++ b/src/corelib/tools/qpoint.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qpoint.h"
#include "qdatastream.h"
@@ -381,6 +345,15 @@ QT_BEGIN_NAMESPACE
\sa QPoint::operator/=()
*/
+/*!
+ \fn QPoint::toPointF() const
+ \since 6.4
+
+ Returns this point as a point with floating point accuracy.
+
+ \sa QPointF::toPoint()
+*/
+
/*****************************************************************************
QPoint stream functions
*****************************************************************************/
@@ -532,7 +505,7 @@ size_t qHash(QPoint key, size_t seed) noexcept
Constructs a copy of the given \a point.
- \sa toPoint()
+ \sa toPoint(), QPoint::toPointF()
*/
/*!
@@ -744,7 +717,7 @@ size_t qHash(QPoint key, size_t seed) noexcept
Rounds the coordinates of this point to the nearest integer, and
returns a QPoint object with the rounded coordinates.
- \sa QPointF()
+ \sa QPointF(), QPoint::toPointF()
*/
/*!
diff --git a/src/corelib/tools/qpoint.h b/src/corelib/tools/qpoint.h
index f2c562393a..7df4d49005 100644
--- a/src/corelib/tools/qpoint.h
+++ b/src/corelib/tools/qpoint.h
@@ -1,53 +1,24 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QPOINT_H
#define QPOINT_H
#include <QtCore/qnamespace.h>
+#include <QtCore/q20type_traits.h>
+#include <QtCore/q23utility.h>
+
#if defined(Q_OS_DARWIN) || defined(Q_QDOC)
struct CGPoint;
#endif
QT_BEGIN_NAMESPACE
+QT_ENABLE_P0846_SEMANTICS_FOR(get)
+
+class QPointF;
+
class QPoint
{
public:
@@ -110,6 +81,7 @@ public:
#if defined(Q_OS_DARWIN) || defined(Q_QDOC)
[[nodiscard]] Q_CORE_EXPORT CGPoint toCGPoint() const noexcept;
#endif
+ [[nodiscard]] constexpr inline QPointF toPointF() const noexcept;
private:
friend class QTransform;
@@ -119,13 +91,13 @@ private:
template <std::size_t I,
typename P,
std::enable_if_t<(I < 2), bool> = true,
- std::enable_if_t<std::is_same_v<std::decay_t<P>, QPoint>, bool> = true>
+ std::enable_if_t<std::is_same_v<q20::remove_cvref_t<P>, QPoint>, bool> = true>
friend constexpr decltype(auto) get(P &&p) noexcept
{
if constexpr (I == 0)
- return (std::forward<P>(p).xp);
+ return q23::forward_like<P>(p.xp);
else if constexpr (I == 1)
- return (std::forward<P>(p).yp);
+ return q23::forward_like<P>(p.yp);
}
};
@@ -316,13 +288,13 @@ private:
template <std::size_t I,
typename P,
std::enable_if_t<(I < 2), bool> = true,
- std::enable_if_t<std::is_same_v<std::decay_t<P>, QPointF>, bool> = true>
+ std::enable_if_t<std::is_same_v<q20::remove_cvref_t<P>, QPointF>, bool> = true>
friend constexpr decltype(auto) get(P &&p) noexcept
{
if constexpr (I == 0)
- return (std::forward<P>(p).xp);
+ return q23::forward_like<P>(p.xp);
else if constexpr (I == 1)
- return (std::forward<P>(p).yp);
+ return q23::forward_like<P>(p.yp);
}
};
@@ -417,6 +389,8 @@ constexpr inline QPointF &QPointF::operator/=(qreal divisor)
return *this;
}
+constexpr QPointF QPoint::toPointF() const noexcept { return *this; }
+
constexpr inline QPoint QPointF::toPoint() const
{
return QPoint(qRound(xp), qRound(yp));
diff --git a/src/corelib/tools/qqueue.cpp b/src/corelib/tools/qqueue.cpp
index ffc48d6714..82095faa3d 100644
--- a/src/corelib/tools/qqueue.cpp
+++ b/src/corelib/tools/qqueue.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
/*!
\class QQueue
diff --git a/src/corelib/tools/qqueue.h b/src/corelib/tools/qqueue.h
index 862aa2ae2c..4863499f2a 100644
--- a/src/corelib/tools/qqueue.h
+++ b/src/corelib/tools/qqueue.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QQUEUE_H
#define QQUEUE_H
diff --git a/src/corelib/tools/qrect.cpp b/src/corelib/tools/qrect.cpp
index 64ccdb20ff..6d345ce543 100644
--- a/src/corelib/tools/qrect.cpp
+++ b/src/corelib/tools/qrect.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qrect.h"
#include "qdatastream.h"
@@ -1232,6 +1196,18 @@ bool QRect::intersects(const QRect &r) const noexcept
\since 6.0
*/
+/*!
+ \fn QRect::toRectF() const
+ \since 6.4
+
+ Returns this rectangle as a rectangle with floating point accuracy.
+
+ \note This function, like the QRectF(QRect) constructor, preserves the
+ size() of the rectangle, not its bottomRight() corner.
+
+ \sa QRectF::toRect()
+*/
+
/*****************************************************************************
QRect stream functions
*****************************************************************************/
@@ -1480,7 +1456,10 @@ QDebug operator<<(QDebug dbg, const QRect &r)
Constructs a QRectF rectangle from the given QRect \a rectangle.
- \sa toRect()
+ \note This function, like QRect::toRectF(), preserves the size() of
+ \a rectangle, not its bottomRight() corner.
+
+ \sa toRect(), QRect::toRectF()
*/
/*!
@@ -2334,7 +2313,7 @@ bool QRectF::intersects(const QRectF &r) const noexcept
Returns a QRect based on the values of this rectangle. Note that the
coordinates in the returned rectangle are rounded to the nearest integer.
- \sa QRectF(), toAlignedRect()
+ \sa QRectF(), toAlignedRect(), QRect::toRectF()
*/
/*!
diff --git a/src/corelib/tools/qrect.h b/src/corelib/tools/qrect.h
index 9e64f4d6e8..e69a217f48 100644
--- a/src/corelib/tools/qrect.h
+++ b/src/corelib/tools/qrect.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QRECT_H
#define QRECT_H
@@ -52,9 +16,16 @@
#if defined(Q_OS_DARWIN) || defined(Q_QDOC)
struct CGRect;
#endif
+#if defined(Q_OS_WASM) || defined(Q_QDOC)
+namespace emscripten {
+class val;
+}
+#endif
QT_BEGIN_NAMESPACE
+class QRectF;
+
class Q_CORE_EXPORT QRect
{
public:
@@ -157,6 +128,7 @@ public:
#if defined(Q_OS_DARWIN) || defined(Q_QDOC)
[[nodiscard]] CGRect toCGRect() const noexcept;
#endif
+ [[nodiscard]] constexpr inline QRectF toRectF() const noexcept;
private:
int x1;
@@ -619,6 +591,11 @@ public:
[[nodiscard]] CGRect toCGRect() const noexcept;
#endif
+#if defined(Q_OS_WASM) || defined(Q_QDOC)
+ [[nodiscard]] static QRectF fromDOMRect(emscripten::val domRect);
+ [[nodiscard]] emscripten::val toDOMRect() const;
+#endif
+
private:
qreal xp;
qreal yp;
@@ -863,6 +840,8 @@ inline QRectF QRectF::united(const QRectF &r) const noexcept
return *this | r;
}
+constexpr QRectF QRect::toRectF() const noexcept { return *this; }
+
constexpr inline QRect QRectF::toRect() const noexcept
{
// This rounding is designed to minimize the maximum possible difference
diff --git a/src/corelib/tools/qrefcount.cpp b/src/corelib/tools/qrefcount.cpp
index 1986cce9ca..c33b34594b 100644
--- a/src/corelib/tools/qrefcount.cpp
+++ b/src/corelib/tools/qrefcount.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
/*!
\class QtPrivate::RefCount
diff --git a/src/corelib/tools/qrefcount.h b/src/corelib/tools/qrefcount.h
index 982a9c2bbf..9472716a72 100644
--- a/src/corelib/tools/qrefcount.h
+++ b/src/corelib/tools/qrefcount.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QREFCOUNT_H
#define QREFCOUNT_H
diff --git a/src/corelib/tools/qringbuffer.cpp b/src/corelib/tools/qringbuffer.cpp
index 09b0336145..0645759118 100644
--- a/src/corelib/tools/qringbuffer.cpp
+++ b/src/corelib/tools/qringbuffer.cpp
@@ -1,49 +1,19 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2015 Alex Trotsenko <alex1973tr@gmail.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// Copyright (C) 2015 Alex Trotsenko <alex1973tr@gmail.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "private/qringbuffer_p.h"
-#include "private/qbytearray_p.h"
+
+#include <type_traits>
+
#include <string.h>
QT_BEGIN_NAMESPACE
+static_assert(std::is_nothrow_default_constructible_v<QRingChunk>);
+static_assert(std::is_nothrow_move_constructible_v<QRingChunk>);
+static_assert(std::is_nothrow_move_assignable_v<QRingChunk>);
+
void QRingChunk::allocate(qsizetype alloc)
{
Q_ASSERT(alloc > 0 && size() == 0);
@@ -57,31 +27,23 @@ void QRingChunk::detach()
Q_ASSERT(isShared());
const qsizetype chunkSize = size();
- QByteArray x(chunkSize, Qt::Uninitialized);
- ::memcpy(x.data(), chunk.constData() + headOffset, chunkSize);
- chunk = std::move(x);
+ chunk = QByteArray(std::as_const(*this).data(), chunkSize);
headOffset = 0;
tailOffset = chunkSize;
}
-QByteArray QRingChunk::toByteArray()
+QByteArray QRingChunk::toByteArray() &&
{
+ // ### Replace with std::move(chunk).sliced(head(), size()) once sliced()&& is available
if (headOffset != 0 || tailOffset != chunk.size()) {
if (isShared())
- return chunk.mid(headOffset, size());
-
- if (headOffset != 0) {
- char *ptr = chunk.data();
- ::memmove(ptr, ptr + headOffset, size());
- tailOffset -= headOffset;
- headOffset = 0;
- }
+ return chunk.sliced(head(), size());
- chunk.reserve(0); // avoid that resizing needlessly reallocates
chunk.resize(tailOffset);
+ chunk.remove(0, headOffset);
}
- return chunk;
+ return std::move(chunk);
}
/*!
@@ -128,7 +90,7 @@ void QRingBuffer::free(qint64 bytes)
clear(); // try to minify/squeeze us
}
} else {
- Q_ASSERT(bytes < MaxByteArraySize);
+ Q_ASSERT(bytes < QByteArray::max_size());
chunk.advance(bytes);
bufferSize -= bytes;
}
@@ -143,7 +105,7 @@ void QRingBuffer::free(qint64 bytes)
char *QRingBuffer::reserve(qint64 bytes)
{
- Q_ASSERT(bytes > 0 && bytes < MaxByteArraySize);
+ Q_ASSERT(bytes > 0 && bytes < QByteArray::max_size());
const qsizetype chunkSize = qMax(qint64(basicBlockSize), bytes);
qsizetype tail = 0;
@@ -173,7 +135,7 @@ char *QRingBuffer::reserve(qint64 bytes)
*/
char *QRingBuffer::reserveFront(qint64 bytes)
{
- Q_ASSERT(bytes > 0 && bytes < MaxByteArraySize);
+ Q_ASSERT(bytes > 0 && bytes < QByteArray::max_size());
const qsizetype chunkSize = qMax(qint64(basicBlockSize), bytes);
if (bufferSize == 0) {
@@ -219,7 +181,7 @@ void QRingBuffer::chop(qint64 bytes)
clear(); // try to minify/squeeze us
}
} else {
- Q_ASSERT(bytes < MaxByteArraySize);
+ Q_ASSERT(bytes < QByteArray::max_size());
chunk.grow(-bytes);
bufferSize -= bytes;
}
@@ -363,6 +325,21 @@ void QRingBuffer::append(const QByteArray &qba)
bufferSize += qba.size();
}
+/*!
+ \internal
+
+ Append a new buffer to the end
+*/
+void QRingBuffer::append(QByteArray &&qba)
+{
+ const auto qbaSize = qba.size();
+ if (bufferSize != 0 || buffers.isEmpty())
+ buffers.emplace_back(std::move(qba));
+ else
+ buffers.last().assign(std::move(qba));
+ bufferSize += qbaSize;
+}
+
qint64 QRingBuffer::readLine(char *data, qint64 maxLength)
{
Q_ASSERT(data != nullptr && maxLength > 1);
diff --git a/src/corelib/tools/qringbuffer_p.h b/src/corelib/tools/qringbuffer_p.h
index bbab8df3e2..25113213c9 100644
--- a/src/corelib/tools/qringbuffer_p.h
+++ b/src/corelib/tools/qringbuffer_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QRINGBUFFER_P_H
#define QRINGBUFFER_P_H
@@ -65,36 +29,19 @@ class QRingChunk
{
public:
// initialization and cleanup
- inline QRingChunk() noexcept :
- headOffset(0), tailOffset(0)
- {
- }
- inline QRingChunk(const QRingChunk &other) noexcept :
- chunk(other.chunk), headOffset(other.headOffset), tailOffset(other.tailOffset)
- {
- }
+ QRingChunk() noexcept = default;
explicit inline QRingChunk(qsizetype alloc) :
- chunk(alloc, Qt::Uninitialized), headOffset(0), tailOffset(0)
+ chunk(alloc, Qt::Uninitialized), tailOffset(0)
{
}
explicit inline QRingChunk(const QByteArray &qba) noexcept :
- chunk(qba), headOffset(0), tailOffset(qba.size())
+ chunk(qba), tailOffset(qba.size())
{
}
-
- inline QRingChunk &operator=(const QRingChunk &other) noexcept
+ explicit QRingChunk(QByteArray &&qba) noexcept :
+ chunk(std::move(qba)), tailOffset(chunk.size())
{
- chunk = other.chunk;
- headOffset = other.headOffset;
- tailOffset = other.tailOffset;
- return *this;
}
- inline QRingChunk(QRingChunk &&other) noexcept :
- chunk(other.chunk), headOffset(other.headOffset), tailOffset(other.tailOffset)
- {
- other.headOffset = other.tailOffset = 0;
- }
- QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_PURE_SWAP(QRingChunk)
inline void swap(QRingChunk &other) noexcept
{
@@ -110,7 +57,7 @@ public:
return !chunk.isDetached();
}
Q_CORE_EXPORT void detach();
- QByteArray toByteArray();
+ QByteArray toByteArray() &&;
// getters
inline qsizetype head() const
@@ -161,28 +108,38 @@ public:
headOffset = 0;
tailOffset = qba.size();
}
+ void assign(QByteArray &&qba)
+ {
+ chunk = std::move(qba);
+ headOffset = 0;
+ tailOffset = chunk.size();
+ }
inline void reset()
{
headOffset = tailOffset = 0;
}
inline void clear()
{
- assign(QByteArray());
+ *this = {};
}
private:
QByteArray chunk;
- qsizetype headOffset;
- qsizetype tailOffset;
+ qsizetype headOffset = 0;
+ qsizetype tailOffset = 0;
};
Q_DECLARE_SHARED(QRingChunk)
class QRingBuffer
{
+ Q_DISABLE_COPY(QRingBuffer)
public:
explicit inline QRingBuffer(int growth = QRINGBUFFER_CHUNKSIZE) :
bufferSize(0), basicBlockSize(growth) { }
+ QRingBuffer(QRingBuffer &&) noexcept = default;
+ QRingBuffer &operator=(QRingBuffer &&) noexcept = default;
+
inline void setChunkSize(int size) {
basicBlockSize = size;
}
@@ -248,6 +205,7 @@ public:
Q_CORE_EXPORT qint64 peek(char *data, qint64 maxLength, qint64 pos = 0) const;
Q_CORE_EXPORT void append(const char *data, qint64 size);
Q_CORE_EXPORT void append(const QByteArray &qba);
+ Q_CORE_EXPORT void append(QByteArray &&qba);
inline qint64 skip(qint64 length) {
qint64 bytesToSkip = qMin(length, bufferSize);
diff --git a/src/corelib/tools/qscopedpointer.cpp b/src/corelib/tools/qscopedpointer.cpp
index 1844013d46..515eb9dc75 100644
--- a/src/corelib/tools/qscopedpointer.cpp
+++ b/src/corelib/tools/qscopedpointer.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qscopedpointer.h"
@@ -305,31 +269,37 @@ QT_BEGIN_NAMESPACE
*/
/*!
- \fn template <typename T, typename Cleanup> template <typename D> QScopedArrayPointer<T, Cleanup>::QScopedArrayPointer(D * p)
+ \fn template <typename T, typename Cleanup> template <typename D, QScopedArrayPointer<T, Cleanup>::if_same_type<D> = true> QScopedArrayPointer<T, Cleanup>::QScopedArrayPointer(D * p)
Constructs a QScopedArrayPointer and stores the array of objects
pointed to by \a p.
*/
/*!
- \fn template <typename T, typename Cleanup> T *QScopedArrayPointer<T, Cleanup>::operator[](int i)
+ \fn template <typename T, typename Cleanup> T *QScopedArrayPointer<T, Cleanup>::operator[](qsizetype i)
Provides access to entry \a i of the scoped pointer's array of
objects.
If the contained pointer is \nullptr, behavior is undefined.
+ \note In Qt versions prior to 6.5, \a i was of type \c{int}, not
+ \c{qsizetype}, possibly causing truncation on 64-bit platforms.
+
\sa isNull()
*/
/*!
- \fn template <typename T, typename Cleanup> T *QScopedArrayPointer<T, Cleanup>::operator[](int i) const
+ \fn template <typename T, typename Cleanup> T *QScopedArrayPointer<T, Cleanup>::operator[](qsizetype i) const
Provides access to entry \a i of the scoped pointer's array of
objects.
If the contained pointer is \nullptr behavior is undefined.
+ \note In Qt versions prior to 6.5, \a i was of type \c{int}, not
+ \c{qsizetype}, possibly causing truncation on 64-bit platforms.
+
\sa isNull()
*/
diff --git a/src/corelib/tools/qscopedpointer.h b/src/corelib/tools/qscopedpointer.h
index c9afb248a1..59bae9b967 100644
--- a/src/corelib/tools/qscopedpointer.h
+++ b/src/corelib/tools/qscopedpointer.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QSCOPEDPOINTER_H
#define QSCOPEDPOINTER_H
@@ -103,9 +67,10 @@ typedef QScopedPointerObjectDeleteLater<QObject> QScopedPointerDeleteLater;
#endif
template <typename T, typename Cleanup = QScopedPointerDeleter<T> >
-class [[nodiscard]] QScopedPointer
+class QScopedPointer
{
public:
+ Q_NODISCARD_CTOR
explicit QScopedPointer(T *p = nullptr) noexcept : d(p)
{
}
@@ -156,7 +121,7 @@ public:
{
if (d == other)
return;
- T *oldD = qExchange(d, other);
+ T *oldD = std::exchange(d, other);
Cleanup::cleanup(oldD);
}
@@ -164,7 +129,7 @@ public:
QT_DEPRECATED_VERSION_X_6_1("Use std::unique_ptr instead, and call release().")
T *take() noexcept
{
- T *oldD = qExchange(d, nullptr);
+ T *oldD = std::exchange(d, nullptr);
return oldD;
}
#endif
@@ -173,7 +138,7 @@ public:
QT_DEPRECATED_VERSION_X_6_2("Use std::unique_ptr instead of QScopedPointer.")
void swap(QScopedPointer<T, Cleanup> &other) noexcept
{
- qSwap(d, other.d);
+ qt_ptr_swap(d, other.d);
}
#endif
@@ -223,26 +188,28 @@ private:
};
template <typename T, typename Cleanup = QScopedPointerArrayDeleter<T> >
-class [[nodiscard]] QScopedArrayPointer : public QScopedPointer<T, Cleanup>
+class QScopedArrayPointer : public QScopedPointer<T, Cleanup>
{
template <typename Ptr>
using if_same_type = typename std::enable_if<std::is_same<typename std::remove_cv<T>::type, Ptr>::value, bool>::type;
public:
+ Q_NODISCARD_CTOR
inline QScopedArrayPointer() : QScopedPointer<T, Cleanup>(nullptr) {}
inline ~QScopedArrayPointer() = default;
template <typename D, if_same_type<D> = true>
+ Q_NODISCARD_CTOR
explicit QScopedArrayPointer(D *p)
: QScopedPointer<T, Cleanup>(p)
{
}
- inline T &operator[](int i)
+ T &operator[](qsizetype i)
{
return this->d[i];
}
- inline const T &operator[](int i) const
+ const T &operator[](qsizetype i) const
{
return this->d[i];
}
diff --git a/src/corelib/tools/qscopedvaluerollback.cpp b/src/corelib/tools/qscopedvaluerollback.cpp
index 0c1c43ac49..ce3c845cc3 100644
--- a/src/corelib/tools/qscopedvaluerollback.cpp
+++ b/src/corelib/tools/qscopedvaluerollback.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qscopedvaluerollback.h"
diff --git a/src/corelib/tools/qscopedvaluerollback.h b/src/corelib/tools/qscopedvaluerollback.h
index 9b14308ec2..0ae3efd0c0 100644
--- a/src/corelib/tools/qscopedvaluerollback.h
+++ b/src/corelib/tools/qscopedvaluerollback.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QSCOPEDVALUEROLLBACK_H
#define QSCOPEDVALUEROLLBACK_H
@@ -45,17 +9,20 @@
QT_BEGIN_NAMESPACE
template <typename T>
-class [[nodiscard]] QScopedValueRollback
+class QScopedValueRollback
{
public:
+ Q_NODISCARD_CTOR
explicit constexpr QScopedValueRollback(T &var)
: varRef(var), oldValue(var)
{
}
+ Q_NODISCARD_CTOR
explicit constexpr QScopedValueRollback(T &var, T value)
- : varRef(var), oldValue(qExchange(var, std::move(value)))
+ : varRef(var), oldValue(std::move(var)) // ### C++20: std::exchange(var, std::move(value))
{
+ var = std::move(value);
}
#if __cpp_constexpr >= 201907L
@@ -75,7 +42,7 @@ private:
T &varRef;
T oldValue;
- Q_DISABLE_COPY(QScopedValueRollback)
+ Q_DISABLE_COPY_MOVE(QScopedValueRollback)
};
QT_END_NAMESPACE
diff --git a/src/corelib/tools/qscopeguard.h b/src/corelib/tools/qscopeguard.h
index cc9e8db209..9be6634cc8 100644
--- a/src/corelib/tools/qscopeguard.h
+++ b/src/corelib/tools/qscopeguard.h
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2018 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Sérgio Martins <sergio.martins@kdab.com>
-** Copyright (C) 2019 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2018 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Sérgio Martins <sergio.martins@kdab.com>
+// Copyright (C) 2019 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QSCOPEGUARD_H
#define QSCOPEGUARD_H
@@ -49,22 +13,25 @@
QT_BEGIN_NAMESPACE
template <typename F>
-class [[nodiscard]] QScopeGuard
+class QScopeGuard
{
public:
+ Q_NODISCARD_CTOR
explicit QScopeGuard(F &&f) noexcept
: m_func(std::move(f))
{
}
+ Q_NODISCARD_CTOR
explicit QScopeGuard(const F &f) noexcept
: m_func(f)
{
}
+ Q_NODISCARD_CTOR
QScopeGuard(QScopeGuard &&other) noexcept
: m_func(std::move(other.m_func))
- , m_invoke(qExchange(other.m_invoke, false))
+ , m_invoke(std::exchange(other.m_invoke, false))
{
}
diff --git a/src/corelib/tools/qscopeguard.qdoc b/src/corelib/tools/qscopeguard.qdoc
index b36299d296..6d9874842a 100644
--- a/src/corelib/tools/qscopeguard.qdoc
+++ b/src/corelib/tools/qscopeguard.qdoc
@@ -1,30 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2018 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Sérgio Martins <sergio.martins@kdab.com>
-** Copyright (C) 2019 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2018 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Sérgio Martins <sergio.martins@kdab.com>
+// Copyright (C) 2019 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
#include "qscopeguard.h"
diff --git a/src/corelib/tools/qset.h b/src/corelib/tools/qset.h
index 299851bf8d..7330b5e91c 100644
--- a/src/corelib/tools/qset.h
+++ b/src/corelib/tools/qset.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QSET_H
#define QSET_H
@@ -71,7 +35,7 @@ public:
inline void swap(QSet<T> &other) noexcept { q_hash.swap(other.q_hash); }
-#ifndef Q_CLANG_QDOC
+#ifndef Q_QDOC
template <typename U = T>
QTypeTraits::compare_eq_result_container<QSet, U> operator==(const QSet<T> &other) const
{ return q_hash == other.q_hash; }
@@ -187,7 +151,7 @@ public:
// more Qt
typedef iterator Iterator;
typedef const_iterator ConstIterator;
- inline qsizetype count() const { return q_hash.count(); }
+ inline qsizetype count() const { return q_hash.size(); }
inline iterator insert(const T &value)
{ return q_hash.insert(value, QHashDummyValue()); }
inline iterator insert(T &&value)
@@ -225,14 +189,18 @@ public:
inline QSet<T> &operator+=(const T &value) { insert(value); return *this; }
inline QSet<T> &operator-=(const QSet<T> &other) { subtract(other); return *this; }
inline QSet<T> &operator-=(const T &value) { remove(value); return *this; }
- inline QSet<T> operator|(const QSet<T> &other) const
- { QSet<T> result = *this; result |= other; return result; }
- inline QSet<T> operator&(const QSet<T> &other) const
- { QSet<T> result = *this; result &= other; return result; }
- inline QSet<T> operator+(const QSet<T> &other) const
- { QSet<T> result = *this; result += other; return result; }
- inline QSet<T> operator-(const QSet<T> &other) const
- { QSet<T> result = *this; result -= other; return result; }
+
+ friend QSet operator|(const QSet &lhs, const QSet &rhs) { return QSet(lhs) |= rhs; }
+ friend QSet operator|(QSet &&lhs, const QSet &rhs) { lhs |= rhs; return std::move(lhs); }
+
+ friend QSet operator&(const QSet &lhs, const QSet &rhs) { return QSet(lhs) &= rhs; }
+ friend QSet operator&(QSet &&lhs, const QSet &rhs) { lhs &= rhs; return std::move(lhs); }
+
+ friend QSet operator+(const QSet &lhs, const QSet &rhs) { return QSet(lhs) += rhs; }
+ friend QSet operator+(QSet &&lhs, const QSet &rhs) { lhs += rhs; return std::move(lhs); }
+
+ friend QSet operator-(const QSet &lhs, const QSet &rhs) { return QSet(lhs) -= rhs; }
+ friend QSet operator-(QSet &&lhs, const QSet &rhs) { lhs -= rhs; return std::move(lhs); }
QList<T> values() const;
@@ -260,10 +228,13 @@ Q_INLINE_TEMPLATE void QSet<T>::reserve(qsizetype asize) { q_hash.reserve(asize)
template <class T>
Q_INLINE_TEMPLATE QSet<T> &QSet<T>::unite(const QSet<T> &other)
{
- if (!q_hash.isSharedWith(other.q_hash)) {
- for (const T &e : other)
- insert(e);
- }
+ if (q_hash.isSharedWith(other.q_hash))
+ return *this;
+ QSet<T> tmp = other;
+ if (size() < other.size())
+ swap(tmp);
+ for (const auto &e : std::as_const(tmp))
+ insert(e);
return *this;
}
@@ -280,7 +251,7 @@ Q_INLINE_TEMPLATE QSet<T> &QSet<T>::intersect(const QSet<T> &other)
copy2 = *this;
*this = copy1;
}
- for (const auto &e : qAsConst(copy1)) {
+ for (const auto &e : std::as_const(copy1)) {
if (!copy2.contains(e))
remove(e);
}
diff --git a/src/corelib/tools/qset.qdoc b/src/corelib/tools/qset.qdoc
index 137aa61502..4ef7a80a52 100644
--- a/src/corelib/tools/qset.qdoc
+++ b/src/corelib/tools/qset.qdoc
@@ -1,29 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
\class QSet
@@ -70,7 +46,7 @@
QSet is unordered, so an iterator's sequence cannot be assumed to
be predictable. If ordering by key is required, use a QMap.
- To navigate through a QSet, you can also use \l{foreach}:
+ To navigate through a QSet, you can also use range-based for:
\snippet code/doc_src_qset.cpp 6
@@ -110,7 +86,7 @@
initializer list \a list.
*/
-/*! \fn template <class T> template<typename InputIterator> QSet<T>::QSet(InputIterator first, InputIterator last)
+/*! \fn template <class T> template <typename InputIterator, QtPrivate::IfIsInputIterator<InputIterator> = true> QSet<T>::QSet(InputIterator first, InputIterator last)
\since 5.14
Constructs a set with the contents in the iterator range [\a first, \a last).
@@ -459,7 +435,7 @@
*/
/*!
- \fn template <class T> QSet<T>::insert(const T &value)
+ \fn template <class T> QSet<T>::iterator QSet<T>::insert(const T &value)
Inserts item \a value into the set, if \a value isn't already
in the set, and returns an iterator pointing at the inserted
@@ -591,29 +567,30 @@
*/
/*!
- \fn template <class T> QSet<T> QSet<T>::operator|(const QSet<T> &other) const
- \fn template <class T> QSet<T> QSet<T>::operator+(const QSet<T> &other) const
+ \fn template <class T> QSet<T> QSet<T>::operator|(const QSet &lhs, const QSet &rhs)
+ \fn template <class T> QSet<T> QSet<T>::operator|(QSet &&lhs, const QSet &rhs)
+ \fn template <class T> QSet<T> QSet<T>::operator+(const QSet &lhs, const QSet &rhs)
+ \fn template <class T> QSet<T> QSet<T>::operator+(QSet &&lhs, const QSet &rhs)
- Returns a new QSet that is the union of this set and the
- \a other set.
+ Returns a new QSet that is the union of sets \a lhs and \a rhs.
\sa unite(), operator|=(), operator&(), operator-()
*/
/*!
- \fn template <class T> QSet<T> QSet<T>::operator&(const QSet<T> &other) const
+ \fn template <class T> QSet<T> QSet<T>::operator&(const QSet &lhs, const QSet &rhs)
+ \fn template <class T> QSet<T> QSet<T>::operator&(QSet &&lhs, const QSet &rhs)
- Returns a new QSet that is the intersection of this set and the
- \a other set.
+ Returns a new QSet that is the intersection of sets \a lhs and \a rhs.
\sa intersect(), operator&=(), operator|(), operator-()
*/
/*!
- \fn template <class T> QSet<T> QSet<T>::operator-(const QSet<T> &other) const
+ \fn template <class T> QSet<T> QSet<T>::operator-(const QSet &lhs, const QSet &rhs)
+ \fn template <class T> QSet<T> QSet<T>::operator-(QSet &&lhs, const QSet &rhs)
- Returns a new QSet that is the set difference of this set and
- the \a other set, i.e., this set - \a other set.
+ Returns a new QSet that is the set difference of sets \a lhs and \a rhs.
\sa subtract(), operator-=(), operator|(), operator&()
*/
@@ -910,3 +887,10 @@
from the set \a set. Returns the number of elements removed, if
any.
*/
+
+/*! \fn template <class T> template <class Pred> qsizetype QSet<T>::removeIf(Pred pred)
+ \since 6.1
+
+ Removes, from this set, all elements for which the predicate \a pred
+ returns \c true. Returns the number of elements removed, if any.
+*/
diff --git a/src/corelib/tools/qshareddata.cpp b/src/corelib/tools/qshareddata.cpp
index 16c10a58ac..8ef174ebfc 100644
--- a/src/corelib/tools/qshareddata.cpp
+++ b/src/corelib/tools/qshareddata.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include <qshareddata.h>
diff --git a/src/corelib/tools/qshareddata.h b/src/corelib/tools/qshareddata.h
index de11257db3..4c4153a506 100644
--- a/src/corelib/tools/qshareddata.h
+++ b/src/corelib/tools/qshareddata.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QSHAREDDATA_H
#define QSHAREDDATA_H
@@ -85,15 +49,19 @@ public:
const T *data() const noexcept { return d; }
const T *get() const noexcept { return d; }
const T *constData() const noexcept { return d; }
- T *take() noexcept { return qExchange(d, nullptr); }
+ T *take() noexcept { return std::exchange(d, nullptr); }
+ Q_NODISCARD_CTOR
QSharedDataPointer() noexcept : d(nullptr) { }
~QSharedDataPointer() { if (d && !d->ref.deref()) delete d; }
+ Q_NODISCARD_CTOR
explicit QSharedDataPointer(T *data) noexcept : d(data)
{ if (d) d->ref.ref(); }
+ Q_NODISCARD_CTOR
QSharedDataPointer(T *data, QAdoptSharedDataTag) noexcept : d(data)
{}
+ Q_NODISCARD_CTOR
QSharedDataPointer(const QSharedDataPointer &o) noexcept : d(o.d)
{ if (d) d->ref.ref(); }
@@ -102,7 +70,7 @@ public:
if (ptr != d) {
if (ptr)
ptr->ref.ref();
- T *old = qExchange(d, ptr);
+ T *old = std::exchange(d, ptr);
if (old && !old->ref.deref())
delete old;
}
@@ -118,14 +86,15 @@ public:
reset(o);
return *this;
}
- QSharedDataPointer(QSharedDataPointer &&o) noexcept : d(qExchange(o.d, nullptr)) {}
+ Q_NODISCARD_CTOR
+ QSharedDataPointer(QSharedDataPointer &&o) noexcept : d(std::exchange(o.d, nullptr)) {}
QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_MOVE_AND_SWAP(QSharedDataPointer)
operator bool () const noexcept { return d != nullptr; }
bool operator!() const noexcept { return d == nullptr; }
void swap(QSharedDataPointer &other) noexcept
- { qSwap(d, other.d); }
+ { qt_ptr_swap(d, other.d); }
#define DECLARE_COMPARE_SET(T1, A1, T2, A2) \
friend bool operator<(T1, T2) noexcept \
@@ -171,21 +140,26 @@ public:
T *data() const noexcept { return d; }
T *get() const noexcept { return d; }
const T *constData() const noexcept { return d; }
- T *take() noexcept { return qExchange(d, nullptr); }
+ T *take() noexcept { return std::exchange(d, nullptr); }
void detach() { if (d && d->ref.loadRelaxed() != 1) detach_helper(); }
+ Q_NODISCARD_CTOR
QExplicitlySharedDataPointer() noexcept : d(nullptr) { }
~QExplicitlySharedDataPointer() { if (d && !d->ref.deref()) delete d; }
+ Q_NODISCARD_CTOR
explicit QExplicitlySharedDataPointer(T *data) noexcept : d(data)
{ if (d) d->ref.ref(); }
+ Q_NODISCARD_CTOR
QExplicitlySharedDataPointer(T *data, QAdoptSharedDataTag) noexcept : d(data)
{}
+ Q_NODISCARD_CTOR
QExplicitlySharedDataPointer(const QExplicitlySharedDataPointer &o) noexcept : d(o.d)
{ if (d) d->ref.ref(); }
template<typename X>
+ Q_NODISCARD_CTOR
QExplicitlySharedDataPointer(const QExplicitlySharedDataPointer<X> &o) noexcept
#ifdef QT_ENABLE_QEXPLICITLYSHAREDDATAPOINTER_STATICCAST
: d(static_cast<T *>(o.data()))
@@ -199,7 +173,7 @@ public:
if (ptr != d) {
if (ptr)
ptr->ref.ref();
- T *old = qExchange(d, ptr);
+ T *old = std::exchange(d, ptr);
if (old && !old->ref.deref())
delete old;
}
@@ -215,14 +189,15 @@ public:
reset(o);
return *this;
}
- QExplicitlySharedDataPointer(QExplicitlySharedDataPointer &&o) noexcept : d(qExchange(o.d, nullptr)) {}
+ Q_NODISCARD_CTOR
+ QExplicitlySharedDataPointer(QExplicitlySharedDataPointer &&o) noexcept : d(std::exchange(o.d, nullptr)) {}
QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_MOVE_AND_SWAP(QExplicitlySharedDataPointer)
operator bool () const noexcept { return d != nullptr; }
bool operator!() const noexcept { return d == nullptr; }
void swap(QExplicitlySharedDataPointer &other) noexcept
- { qSwap(d, other.d); }
+ { qt_ptr_swap(d, other.d); }
DECLARE_COMPARE_SET(const QExplicitlySharedDataPointer &p1, p1.d, const QExplicitlySharedDataPointer &p2, p2.d)
DECLARE_COMPARE_SET(const QExplicitlySharedDataPointer &p1, p1.d, const T *ptr, ptr)
diff --git a/src/corelib/tools/qshareddata_impl.h b/src/corelib/tools/qshareddata_impl.h
index cf1c534cdf..e0b4695e36 100644
--- a/src/corelib/tools/qshareddata_impl.h
+++ b/src/corelib/tools/qshareddata_impl.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#if 0
#pragma qt_sync_skip_header_check
@@ -87,7 +51,7 @@ public:
}
QExplicitlySharedDataPointerV2(QExplicitlySharedDataPointerV2 &&other) noexcept
- : d(qExchange(other.d, nullptr))
+ : d(std::exchange(other.d, nullptr))
{
}
@@ -128,7 +92,7 @@ public:
constexpr T *take() noexcept
{
- return qExchange(d, nullptr);
+ return std::exchange(d, nullptr);
}
bool isShared() const noexcept
@@ -138,7 +102,7 @@ public:
constexpr void swap(QExplicitlySharedDataPointerV2 &other) noexcept
{
- qSwap(d, other.d);
+ qt_ptr_swap(d, other.d);
}
// important change from QExplicitlySharedDataPointer: deep const
diff --git a/src/corelib/tools/qsharedpointer.cpp b/src/corelib/tools/qsharedpointer.cpp
index bd4d6c906b..217a3a4ff4 100644
--- a/src/corelib/tools/qsharedpointer.cpp
+++ b/src/corelib/tools/qsharedpointer.cpp
@@ -1,43 +1,7 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Copyright (C) 2020 Intel Corporation.
-** Copyright (C) 2019 Klarälvdalens Datakonsult AB.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// Copyright (C) 2020 Intel Corporation.
+// Copyright (C) 2019 Klarälvdalens Datakonsult AB.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qsharedpointer.h"
@@ -175,8 +139,7 @@
can also exceptionally be -1, indicating that there are no QSharedPointers
attached to an object, which is tracked too. The only case where this is
possible is that of QWeakPointers and QPointers tracking a QObject. Note
- that QWeakPointers tracking a QObject is a deprecated feature as of Qt 5.0,
- kept only for compatibility with Qt 4.x.
+ that QWeakPointers tracking a QObject is deprecated.
The weak reference count controls the lifetime of the d-pointer itself.
It can be thought of as an internal/intrusive reference count for
@@ -211,7 +174,7 @@
last QSharedPointer instance had.
This class is never instantiated directly: the constructors and
- destructor are private and, in C++11, deleted. Only the create() function
+ destructor are deleted. Only the create() function
may be called to return an object of this type. See below for construction
details.
@@ -250,8 +213,7 @@
Like ExternalRefCountWithCustomDeleter, this class is never instantiated
directly. This class also provides a create() member that returns the
- pointer, and hides its constructors and destructor. With C++11, they're
- deleted.
+ pointer, and deletes its constructors and destructor.
The size of this class depends on the size of \tt T.
@@ -479,6 +441,46 @@
*/
/*!
+ \fn template <class T> QSharedPointer<T>::QSharedPointer(QSharedPointer &&other)
+
+ Move-constructs a QSharedPointer instance, making it point at the same
+ object that \a other was pointing to.
+
+ \since 5.4
+*/
+
+/*!
+ \fn template <class T> QSharedPointer<T>::operator=(QSharedPointer &&other)
+
+ Move-assigns \a other to this QSharedPointer instance.
+
+ \since 5.0
+*/
+
+/*!
+ \fn template <class T> template <class X> QSharedPointer<T>::QSharedPointer(QSharedPointer<X> &&other)
+
+ Move-constructs a QSharedPointer instance, making it point at the same
+ object that \a other was pointing to.
+
+ This constructor participates in overload resolution only if \c{X*}
+ implicitly converts to \c{T*}.
+
+ \since 5.6
+*/
+
+/*!
+ \fn template <class T> template <class X> QSharedPointer<T>::operator=(QSharedPointer<X> &&other)
+
+ Move-assigns \a other to this QSharedPointer instance.
+
+ This assignment operator participates in overload resolution only if \c{X*}
+ implicitly converts to \c{T*}.
+
+ \since 5.6
+*/
+
+/*!
\fn template <class T> QSharedPointer<T>::QSharedPointer(const QWeakPointer<T> &other)
Creates a QSharedPointer by promoting the weak reference \a other
@@ -707,6 +709,49 @@
*/
/*!
+ \fn template <class T> template <class X> bool QSharedPointer<T>::owner_before(const QSharedPointer<X> &other) const noexcept
+ \fn template <class T> template <class X> bool QSharedPointer<T>::owner_before(const QWeakPointer<X> &other) const noexcept
+ \fn template <class T> template <class X> bool QWeakPointer<T>::owner_before(const QSharedPointer<X> &other) const noexcept
+ \fn template <class T> template <class X> bool QWeakPointer<T>::owner_before(const QWeakPointer<X> &other) const noexcept
+ \since 6.7
+
+ Returns \c true if and only if this smart pointer precedes \a other
+ in an implementation-defined owner-based ordering. The ordering is such
+ that two smart pointers are considered equivalent if they are both
+ empty or if they both own the same object (even if their apparent type
+ and pointer are different).
+
+ \sa owner_equal
+*/
+
+/*!
+ \fn template <class T> template <class X> bool QSharedPointer<T>::owner_equal(const QSharedPointer<X> &other) const noexcept
+ \fn template <class T> template <class X> bool QSharedPointer<T>::owner_equal(const QWeakPointer<X> &other) const noexcept
+ \fn template <class T> template <class X> bool QWeakPointer<T>::owner_equal(const QSharedPointer<X> &other) const noexcept
+ \fn template <class T> template <class X> bool QWeakPointer<T>::owner_equal(const QWeakPointer<X> &other) const noexcept
+
+ \since 6.7
+
+ Returns \c true if and only if this smart pointer and \a other
+ share ownership.
+
+ \sa owner_before, owner_hash
+*/
+
+/*!
+ \fn template <class T> size_t QSharedPointer<T>::owner_hash() const noexcept
+ \fn template <class T> size_t QWeakPointer<T>::owner_hash() const noexcept
+
+ \since 6.7
+
+ Returns a owner-based hash value for this smart pointer object.
+ Smart pointers that compare equal (as per \c{owner_equal}) will
+ have an identical owner-based hash.
+
+ \sa owner_equal
+*/
+
+/*!
\fn template <class T> QWeakPointer<T>::QWeakPointer()
Creates a QWeakPointer that points to nothing.
@@ -932,7 +977,16 @@
*/
/*!
- \fn template <class T> template <class X> bool operator==(const QSharedPointer<T> &ptr1, const QSharedPointer<X> &ptr2)
+ \fn template <class T> qHash(const QSharedPointer<T> &key, size_t seed)
+ \relates QSharedPointer
+
+ Returns the hash value for \a key, using \a seed to seed the calculation.
+
+ \since 5.0
+*/
+
+/*!
+ \fn template<class T, class X> bool operator==(const QSharedPointer<T> &ptr1, const QSharedPointer<X> &ptr2)
\relates QSharedPointer
Returns \c true if \a ptr1 and \a ptr2 refer to the same pointer.
@@ -945,7 +999,7 @@
*/
/*!
- \fn template <class T> template <class X> bool operator!=(const QSharedPointer<T> &ptr1, const QSharedPointer<X> &ptr2)
+ \fn template<class T, class X> bool operator!=(const QSharedPointer<T> &ptr1, const QSharedPointer<X> &ptr2)
\relates QSharedPointer
Returns \c true if \a ptr1 and \a ptr2 refer to distinct pointers.
@@ -958,7 +1012,7 @@
*/
/*!
- \fn template <class T> template <class X> bool operator==(const QSharedPointer<T> &ptr1, const X *ptr2)
+ \fn template<class T, class X> bool operator==(const QSharedPointer<T> &ptr1, const X *ptr2)
\relates QSharedPointer
Returns \c true if \a ptr1 and \a ptr2 refer to the same pointer.
@@ -971,7 +1025,7 @@
*/
/*!
- \fn template <class T> template <class X> bool operator!=(const QSharedPointer<T> &ptr1, const X *ptr2)
+ \fn template<class T, class X> bool operator!=(const QSharedPointer<T> &ptr1, const X *ptr2)
\relates QSharedPointer
Returns \c true if \a ptr1 and \a ptr2 refer to distinct pointers.
@@ -984,7 +1038,7 @@
*/
/*!
- \fn template <class T> template <class X> bool operator==(const T *ptr1, const QSharedPointer<X> &ptr2)
+ \fn template<class T, class X> bool operator==(const T *ptr1, const QSharedPointer<X> &ptr2)
\relates QSharedPointer
Returns \c true if the pointer \a ptr1 is the
@@ -998,7 +1052,7 @@
*/
/*!
- \fn template <class T> template <class X> bool operator!=(const T *ptr1, const QSharedPointer<X> &ptr2)
+ \fn template<class T, class X> bool operator!=(const T *ptr1, const QSharedPointer<X> &ptr2)
\relates QSharedPointer
Returns \c true if the pointer \a ptr1 is not the
@@ -1012,7 +1066,7 @@
*/
/*!
- \fn template <class T> template <class X> bool operator==(const QSharedPointer<T> &ptr1, const QWeakPointer<X> &ptr2)
+ \fn template<class T, class X> bool operator==(const QSharedPointer<T> &ptr1, const QWeakPointer<X> &ptr2)
\relates QWeakPointer
Returns \c true if \a ptr1 and \a ptr2 refer to the same pointer.
@@ -1025,7 +1079,7 @@
*/
/*!
- \fn template <class T> template <class X> bool operator!=(const QSharedPointer<T> &ptr1, const QWeakPointer<X> &ptr2)
+ \fn template<class T, class X> bool operator!=(const QSharedPointer<T> &ptr1, const QWeakPointer<X> &ptr2)
\relates QWeakPointer
Returns \c true if \a ptr1 and \a ptr2 refer to distinct pointers.
@@ -1038,7 +1092,7 @@
*/
/*!
- \fn template <class T> template <class X> bool operator==(const QWeakPointer<T> &ptr1, const QSharedPointer<X> &ptr2)
+ \fn template<class T, class X> bool operator==(const QWeakPointer<T> &ptr1, const QSharedPointer<X> &ptr2)
\relates QWeakPointer
Returns \c true if \a ptr1 and \a ptr2 refer to the same pointer.
@@ -1131,7 +1185,7 @@
*/
/*!
- \fn template <class T> template <class X> bool operator!=(const QWeakPointer<T> &ptr1, const QSharedPointer<X> &ptr2)
+ \fn template<class T, class X> bool operator!=(const QWeakPointer<T> &ptr1, const QSharedPointer<X> &ptr2)
\relates QWeakPointer
Returns \c true if \a ptr1 and \a ptr2 refer to distinct pointers.
@@ -1144,7 +1198,7 @@
*/
/*!
- \fn template <class X> template <class T> QSharedPointer<X> qSharedPointerCast(const QSharedPointer<T> &other)
+ \fn template <class X, class T> QSharedPointer<X> qSharedPointerCast(const QSharedPointer<T> &other)
\relates QSharedPointer
Returns a shared pointer to the pointer held by \a other, cast to
@@ -1159,7 +1213,7 @@
*/
/*!
- \fn template <class X> template <class T> QSharedPointer<X> qSharedPointerCast(const QWeakPointer<T> &other)
+ \fn template <class X, class T> QSharedPointer<X> qSharedPointerCast(const QWeakPointer<T> &other)
\relates QSharedPointer
\relates QWeakPointer
@@ -1180,7 +1234,7 @@
*/
/*!
- \fn template <class X> template <class T> QSharedPointer<X> qSharedPointerDynamicCast(const QSharedPointer<T> &src)
+ \fn template <class X, class T> QSharedPointer<X> qSharedPointerDynamicCast(const QSharedPointer<T> &src)
\relates QSharedPointer
Returns a shared pointer to the pointer held by \a src, using a
@@ -1196,7 +1250,7 @@
*/
/*!
- \fn template <class X> template <class T> QSharedPointer<X> qSharedPointerDynamicCast(const QWeakPointer<T> &src)
+ \fn template <class X, class T> QSharedPointer<X> qSharedPointerDynamicCast(const QWeakPointer<T> &src)
\relates QSharedPointer
\relates QWeakPointer
@@ -1218,7 +1272,7 @@
*/
/*!
- \fn template <class X> template <class T> QSharedPointer<X> qSharedPointerConstCast(const QSharedPointer<T> &src)
+ \fn template <class X, class T> QSharedPointer<X> qSharedPointerConstCast(const QSharedPointer<T> &src)
\relates QSharedPointer
Returns a shared pointer to the pointer held by \a src, cast to
@@ -1230,7 +1284,7 @@
*/
/*!
- \fn template <class X> template <class T> QSharedPointer<X> qSharedPointerConstCast(const QWeakPointer<T> &src)
+ \fn template <class X, class T> QSharedPointer<X> qSharedPointerConstCast(const QWeakPointer<T> &src)
\relates QSharedPointer
\relates QWeakPointer
@@ -1248,7 +1302,7 @@
*/
/*!
- \fn template <class X> template <class T> QSharedPointer<X> qSharedPointerObjectCast(const QSharedPointer<T> &src)
+ \fn template <class X, class T> QSharedPointer<X> qSharedPointerObjectCast(const QSharedPointer<T> &src)
\relates QSharedPointer
\since 4.6
@@ -1320,7 +1374,7 @@
*/
/*!
- \fn template <class X> template <class T> QSharedPointer<X> qSharedPointerObjectCast(const QWeakPointer<T> &src)
+ \fn template <class X, class T> QSharedPointer<X> qSharedPointerObjectCast(const QWeakPointer<T> &src)
\relates QSharedPointer
\relates QWeakPointer
\since 4.6
@@ -1346,7 +1400,7 @@
/*!
- \fn template <class X> template <class T> QWeakPointer<X> qWeakPointerCast(const QWeakPointer<T> &src)
+ \fn template <class X, class T> QWeakPointer<X> qWeakPointerCast(const QWeakPointer<T> &src)
\relates QWeakPointer
Returns a weak pointer to the pointer held by \a src, cast to
@@ -1366,6 +1420,7 @@
QT_BEGIN_NAMESPACE
+QT6_ONLY(
/*!
\internal
This function is called for a just-created QObject \a obj, to enable
@@ -1373,7 +1428,9 @@ QT_BEGIN_NAMESPACE
*/
void QtSharedPointer::ExternalRefCountData::setQObjectShared(const QObject *, bool)
{}
+)
+QT6_ONLY(
/*!
\internal
This function is called when a QSharedPointer is created from a QWeakPointer
@@ -1386,6 +1443,7 @@ void QtSharedPointer::ExternalRefCountData::checkQObjectShared(const QObject *)
if (strongref.loadRelaxed() < 0)
qWarning("QSharedPointer: cannot create a QSharedPointer from a QObject-tracking QWeakPointer");
}
+)
QtSharedPointer::ExternalRefCountData *QtSharedPointer::ExternalRefCountData::getAndRef(const QObject *obj)
{
@@ -1450,7 +1508,7 @@ QT_END_NAMESPACE
# ifdef QT_SHARED_POINTER_BACKTRACE_SUPPORT
# if defined(__GLIBC__) && (__GLIBC__ >= 2) && !defined(__UCLIBC__) && !defined(QT_LINUXBASE)
# define BACKTRACE_SUPPORTED
-# elif defined(Q_OS_MAC)
+# elif defined(Q_OS_DARWIN)
# define BACKTRACE_SUPPORTED
# endif
# endif
diff --git a/src/corelib/tools/qsharedpointer.h b/src/corelib/tools/qsharedpointer.h
index a7365aecf1..116c9afa00 100644
--- a/src/corelib/tools/qsharedpointer.h
+++ b/src/corelib/tools/qsharedpointer.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QSHAREDPOINTER_H
#define QSHAREDPOINTER_H
@@ -84,6 +48,11 @@ public:
QSharedPointer<T> &operator=(QSharedPointer<T> &&other) noexcept;
QSharedPointer<T> &operator=(const QWeakPointer<T> &other);
+ template <class X>
+ QSharedPointer(QSharedPointer<X> && other) noexcept;
+ template <class X>
+ QSharedPointer &operator=(QSharedPointer<X> && other) noexcept;
+
void swap(QSharedPointer<T> &other) noexcept;
QWeakPointer<T> toWeakRef() const;
@@ -103,9 +72,25 @@ public:
template <typename... Args>
static inline QSharedPointer<T> create(Args &&... args);
+
+ // owner-based comparisons
+ template <typename X>
+ bool owner_before(const QSharedPointer<X> &other) const noexcept;
+ template <typename X>
+ bool owner_before(const QWeakPointer<X> &other) const noexcept;
+
+ template <typename X>
+ bool owner_equal(const QSharedPointer<X> &other) const noexcept;
+ template <typename X>
+ bool owner_equal(const QWeakPointer<X> &other) const noexcept;
+
+ size_t owner_hash() const noexcept;
};
template <class T>
+size_t qHash(const QSharedPointer<T> &key, size_t seed = 0) noexcept;
+
+template <class T>
class QWeakPointer
{
public:
@@ -136,6 +121,19 @@ public:
QSharedPointer<T> toStrongRef() const;
QSharedPointer<T> lock() const;
+
+ // owner-based comparisons
+ template <typename X>
+ bool owner_before(const QWeakPointer<X> &other) const noexcept;
+ template <typename X>
+ bool owner_before(const QSharedPointer<X> &other) const noexcept;
+
+ template <typename X>
+ bool owner_equal(const QWeakPointer<X> &other) const noexcept;
+ template <typename X>
+ bool owner_equal(const QSharedPointer<X> &other) const noexcept;
+
+ size_t owner_hash() const noexcept;
};
template <class T>
diff --git a/src/corelib/tools/qsharedpointer_impl.h b/src/corelib/tools/qsharedpointer_impl.h
index 61aeee4952..456be91d03 100644
--- a/src/corelib/tools/qsharedpointer_impl.h
+++ b/src/corelib/tools/qsharedpointer_impl.h
@@ -1,43 +1,7 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Copyright (C) 2020 Intel Corporation.
-** Copyright (C) 2019 Klarälvdalens Datakonsult AB.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// Copyright (C) 2022 Intel Corporation.
+// Copyright (C) 2019 Klarälvdalens Datakonsult AB.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef Q_QDOC
@@ -62,13 +26,18 @@ QT_END_NAMESPACE
#include <new>
#include <QtCore/qatomic.h>
-#include <QtCore/qobject.h> // for qobject_cast
#include <QtCore/qhashfunctions.h>
+#include <QtCore/qmetatype.h> // for IsPointerToTypeDerivedFromQObject
+#include <QtCore/qxptype_traits.h>
#include <memory>
QT_BEGIN_NAMESPACE
+class QObject;
+template <class T>
+T qobject_cast(const QObject *object);
+
//
// forward declarations
//
@@ -147,8 +116,10 @@ namespace QtSharedPointer {
#ifndef QT_NO_QOBJECT
Q_CORE_EXPORT static ExternalRefCountData *getAndRef(const QObject *);
+ QT6_ONLY(
Q_CORE_EXPORT void setQObjectShared(const QObject *, bool enable);
- Q_CORE_EXPORT void checkQObjectShared(const QObject *);
+ )
+ QT6_ONLY(Q_CORE_EXPORT void checkQObjectShared(const QObject *);)
#endif
inline void checkQObjectShared(...) { }
inline void setQObjectShared(...) { }
@@ -308,23 +279,29 @@ public:
T &operator*() const { return *data(); }
T *operator->() const noexcept { return data(); }
+ Q_NODISCARD_CTOR
constexpr QSharedPointer() noexcept : value(nullptr), d(nullptr) { }
~QSharedPointer() { deref(); }
+ Q_NODISCARD_CTOR
constexpr QSharedPointer(std::nullptr_t) noexcept : value(nullptr), d(nullptr) { }
template <class X, IfCompatible<X> = true>
+ Q_NODISCARD_CTOR
inline explicit QSharedPointer(X *ptr) : value(ptr) // noexcept
{ internalConstruct(ptr, QtSharedPointer::NormalDeleter()); }
template <class X, typename Deleter, IfCompatible<X> = true>
+ Q_NODISCARD_CTOR
inline QSharedPointer(X *ptr, Deleter deleter) : value(ptr) // throws
{ internalConstruct(ptr, deleter); }
template <typename Deleter>
+ Q_NODISCARD_CTOR
QSharedPointer(std::nullptr_t, Deleter deleter) : value(nullptr)
{ internalConstruct(static_cast<T *>(nullptr), deleter); }
+ Q_NODISCARD_CTOR
QSharedPointer(const QSharedPointer &other) noexcept : value(other.value), d(other.d)
{ if (d) ref(); }
QSharedPointer &operator=(const QSharedPointer &other) noexcept
@@ -333,6 +310,7 @@ public:
swap(copy);
return *this;
}
+ Q_NODISCARD_CTOR
QSharedPointer(QSharedPointer &&other) noexcept
: value(other.value), d(other.d)
{
@@ -342,6 +320,7 @@ public:
QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_MOVE_AND_SWAP(QSharedPointer)
template <class X, IfCompatible<X> = true>
+ Q_NODISCARD_CTOR
QSharedPointer(QSharedPointer<X> &&other) noexcept
: value(other.value), d(other.d)
{
@@ -358,6 +337,7 @@ public:
}
template <class X, IfCompatible<X> = true>
+ Q_NODISCARD_CTOR
QSharedPointer(const QSharedPointer<X> &other) noexcept : value(other.value), d(other.d)
{ if (d) ref(); }
@@ -370,6 +350,7 @@ public:
}
template <class X, IfCompatible<X> = true>
+ Q_NODISCARD_CTOR
inline QSharedPointer(const QWeakPointer<X> &other) : value(nullptr), d(nullptr)
{ *this = other; }
@@ -415,10 +396,10 @@ public:
inline void clear() { QSharedPointer copy; swap(copy); }
- QWeakPointer<T> toWeakRef() const;
+ [[nodiscard]] QWeakPointer<T> toWeakRef() const;
template <typename... Args>
- static QSharedPointer create(Args && ...arguments)
+ [[nodiscard]] static QSharedPointer create(Args && ...arguments)
{
typedef QtSharedPointer::ExternalRefCountWithContiguousData<T> Private;
# ifdef QT_SHAREDPOINTER_TRACK_POINTERS
@@ -465,7 +446,25 @@ public:
#undef DECLARE_TEMPLATE_COMPARE_SET
#undef DECLARE_COMPARE_SET
+ template <typename X>
+ bool owner_before(const QSharedPointer<X> &other) const noexcept
+ { return std::less<>()(d, other.d); }
+ template <typename X>
+ bool owner_before(const QWeakPointer<X> &other) const noexcept
+ { return std::less<>()(d, other.d); }
+
+ template <typename X>
+ bool owner_equal(const QSharedPointer<X> &other) const noexcept
+ { return d == other.d; }
+ template <typename X>
+ bool owner_equal(const QWeakPointer<X> &other) const noexcept
+ { return d == other.d; }
+
+ size_t owner_hash() const noexcept
+ { return std::hash<Data *>()(d); }
+
private:
+ Q_NODISCARD_CTOR
explicit QSharedPointer(Qt::Initialization) {}
void deref() noexcept
@@ -502,14 +501,13 @@ private:
#ifdef QT_SHAREDPOINTER_TRACK_POINTERS
internalSafetyCheckAdd(d, ptr);
#endif
- d->setQObjectShared(ptr, true);
enableSharedFromThis(ptr);
}
void internalSwap(QSharedPointer &other) noexcept
{
- qSwap(d, other.d);
- qSwap(this->value, other.value);
+ qt_ptr_swap(d, other.d);
+ qt_ptr_swap(this->value, other.value);
}
template <class X> friend class QSharedPointer;
@@ -530,16 +528,14 @@ private:
tmp = o->strongref.loadRelaxed(); // failed, try again
}
- if (tmp > 0) {
+ if (tmp > 0)
o->weakref.ref();
- } else {
- o->checkQObjectShared(actual);
+ else
o = nullptr;
- }
}
- qSwap(d, o);
- qSwap(this->value, actual);
+ qt_ptr_swap(d, o);
+ qt_ptr_swap(this->value, actual);
if (!d || d->strongref.loadRelaxed() == 0)
this->value = nullptr;
@@ -558,6 +554,12 @@ class QWeakPointer
template <typename X>
using IfCompatible = typename std::enable_if<std::is_convertible<X*, T*>::value, bool>::type;
+ template <typename X>
+ using IfVirtualBase = typename std::enable_if<qxp::is_virtual_base_of_v<T, X>, bool>::type;
+
+ template <typename X>
+ using IfNotVirtualBase = typename std::enable_if<!qxp::is_virtual_base_of_v<T, X>, bool>::type;
+
public:
typedef T element_type;
typedef T value_type;
@@ -571,11 +573,14 @@ public:
explicit operator bool() const noexcept { return !isNull(); }
bool operator !() const noexcept { return isNull(); }
- inline QWeakPointer() noexcept : d(nullptr), value(nullptr) { }
+ Q_NODISCARD_CTOR
+ constexpr QWeakPointer() noexcept : d(nullptr), value(nullptr) { }
inline ~QWeakPointer() { if (d && !d->weakref.deref()) delete d; }
+ Q_NODISCARD_CTOR
QWeakPointer(const QWeakPointer &other) noexcept : d(other.d), value(other.value)
{ if (d) d->weakref.ref(); }
+ Q_NODISCARD_CTOR
QWeakPointer(QWeakPointer &&other) noexcept
: d(other.d), value(other.value)
{
@@ -584,9 +589,18 @@ public:
}
QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_MOVE_AND_SWAP(QWeakPointer)
- template <class X, IfCompatible<X> = true>
+ template <class X, IfCompatible<X> = true, IfNotVirtualBase<X> = true>
+ Q_NODISCARD_CTOR
QWeakPointer(QWeakPointer<X> &&other) noexcept
- : d(other.d), value(other.value)
+ : d(std::exchange(other.d, nullptr)),
+ value(std::exchange(other.value, nullptr))
+ {
+ }
+
+ template <class X, IfCompatible<X> = true, IfVirtualBase<X> = true>
+ Q_NODISCARD_CTOR
+ QWeakPointer(QWeakPointer<X> &&other) noexcept
+ : d(other.d), value(other.toStrongRef().get()) // must go through QSharedPointer, see below
{
other.d = nullptr;
other.value = nullptr;
@@ -609,10 +623,11 @@ public:
void swap(QWeakPointer &other) noexcept
{
- qSwap(this->d, other.d);
- qSwap(this->value, other.value);
+ qt_ptr_swap(this->d, other.d);
+ qt_ptr_swap(this->value, other.value);
}
+ Q_NODISCARD_CTOR
inline QWeakPointer(const QSharedPointer<T> &o) : d(o.d), value(o.data())
{ if (d) d->weakref.ref();}
inline QWeakPointer &operator=(const QSharedPointer<T> &o)
@@ -622,6 +637,7 @@ public:
}
template <class X, IfCompatible<X> = true>
+ Q_NODISCARD_CTOR
inline QWeakPointer(const QWeakPointer<X> &o) : d(nullptr), value(nullptr)
{ *this = o; }
@@ -635,6 +651,7 @@ public:
}
template <class X, IfCompatible<X> = true>
+ Q_NODISCARD_CTOR
inline QWeakPointer(const QSharedPointer<X> &o) : d(nullptr), value(nullptr)
{ *this = o; }
@@ -647,9 +664,9 @@ public:
inline void clear() { *this = QWeakPointer(); }
- inline QSharedPointer<T> toStrongRef() const { return QSharedPointer<T>(*this); }
+ [[nodiscard]] QSharedPointer<T> toStrongRef() const { return QSharedPointer<T>(*this); }
// std::weak_ptr compatibility:
- inline QSharedPointer<T> lock() const { return toStrongRef(); }
+ [[nodiscard]] QSharedPointer<T> lock() const { return toStrongRef(); }
template <class X>
bool operator==(const QWeakPointer<X> &o) const noexcept
@@ -683,17 +700,36 @@ public:
friend bool operator!=(std::nullptr_t, const QWeakPointer &p)
{ return !p.isNull(); }
+ template <typename X>
+ bool owner_before(const QWeakPointer<X> &other) const noexcept
+ { return std::less<>()(d, other.d); }
+ template <typename X>
+ bool owner_before(const QSharedPointer<X> &other) const noexcept
+ { return std::less<>()(d, other.d); }
+
+ template <typename X>
+ bool owner_equal(const QWeakPointer<X> &other) const noexcept
+ { return d == other.d; }
+ template <typename X>
+ bool owner_equal(const QSharedPointer<X> &other) const noexcept
+ { return d == other.d; }
+
+ size_t owner_hash() const noexcept
+ { return std::hash<Data *>()(d); }
+
private:
friend struct QtPrivate::EnableInternalData;
template <class X> friend class QSharedPointer;
+ template <class X> friend class QWeakPointer;
template <class X> friend class QPointer;
template <class X>
inline QWeakPointer &assign(X *ptr)
- { return *this = QWeakPointer<X>(ptr, true); }
+ { return *this = QWeakPointer<T>(ptr, true); }
#ifndef QT_NO_QOBJECT
template <class X, IfCompatible<X> = true>
+ Q_NODISCARD_CTOR
inline QWeakPointer(X *ptr, bool) : d(ptr ? Data::getAndRef(ptr) : nullptr), value(ptr)
{ }
#endif
diff --git a/src/corelib/tools/qsize.cpp b/src/corelib/tools/qsize.cpp
index 2779948aae..d5e8e4c71b 100644
--- a/src/corelib/tools/qsize.cpp
+++ b/src/corelib/tools/qsize.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qsize.h"
#include "qdatastream.h"
@@ -403,6 +367,15 @@ QSize QSize::scaled(const QSize &s, Qt::AspectRatioMode mode) const noexcept
\sa grownBy()
*/
+/*!
+ \fn QSize::toSizeF() const
+ \since 6.4
+
+ Returns this size as a size with floating point accuracy.
+
+ \sa QSizeF::toSize()
+*/
+
/*****************************************************************************
QSize stream functions
*****************************************************************************/
@@ -520,7 +493,7 @@ QDebug operator<<(QDebug dbg, const QSize &s)
Constructs a size with floating point accuracy from the given \a
size.
- \sa toSize()
+ \sa toSize(), QSize::toSizeF()
*/
/*!
@@ -596,7 +569,7 @@ QDebug operator<<(QDebug dbg, const QSize &s)
Note that the coordinates in the returned size will be rounded to
the nearest integer.
- \sa QSizeF()
+ \sa QSizeF(), QSize::toSizeF()
*/
/*!
diff --git a/src/corelib/tools/qsize.h b/src/corelib/tools/qsize.h
index bab193031c..a5eaf34afe 100644
--- a/src/corelib/tools/qsize.h
+++ b/src/corelib/tools/qsize.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QSIZE_H
#define QSIZE_H
@@ -44,12 +8,18 @@
#include <QtCore/qhashfunctions.h>
#include <QtCore/qmargins.h>
+#include <QtCore/q20type_traits.h>
+#include <QtCore/q23utility.h>
+
#if defined(Q_OS_DARWIN) || defined(Q_QDOC)
struct CGSize;
#endif
QT_BEGIN_NAMESPACE
+// QT_ENABLE_P0846_SEMANTICS_FOR(get) // from qmargins.h
+
+class QSizeF;
class Q_CORE_EXPORT QSize
{
@@ -109,6 +79,8 @@ public:
[[nodiscard]] CGSize toCGSize() const noexcept;
#endif
+ [[nodiscard]] inline constexpr QSizeF toSizeF() const noexcept;
+
private:
int wd;
int ht;
@@ -116,13 +88,13 @@ private:
template <std::size_t I,
typename S,
std::enable_if_t<(I < 2), bool> = true,
- std::enable_if_t<std::is_same_v<std::decay_t<S>, QSize>, bool> = true>
+ std::enable_if_t<std::is_same_v<q20::remove_cvref_t<S>, QSize>, bool> = true>
friend constexpr decltype(auto) get(S &&s) noexcept
{
if constexpr (I == 0)
- return (std::forward<S>(s).wd);
+ return q23::forward_like<S>(s.wd);
else if constexpr (I == 1)
- return (std::forward<S>(s).ht);
+ return q23::forward_like<S>(s.ht);
}
};
Q_DECLARE_TYPEINFO(QSize, Q_RELOCATABLE_TYPE);
@@ -305,13 +277,13 @@ private:
template <std::size_t I,
typename S,
std::enable_if_t<(I < 2), bool> = true,
- std::enable_if_t<std::is_same_v<std::decay_t<S>, QSizeF>, bool> = true>
+ std::enable_if_t<std::is_same_v<q20::remove_cvref_t<S>, QSizeF>, bool> = true>
friend constexpr decltype(auto) get(S &&s) noexcept
{
if constexpr (I == 0)
- return (std::forward<S>(s).wd);
+ return q23::forward_like<S>(s.wd);
else if constexpr (I == 1)
- return (std::forward<S>(s).ht);
+ return q23::forward_like<S>(s.ht);
}
};
Q_DECLARE_TYPEINFO(QSizeF, Q_RELOCATABLE_TYPE);
@@ -420,6 +392,8 @@ constexpr inline QSize QSizeF::toSize() const noexcept
return QSize(qRound(wd), qRound(ht));
}
+constexpr QSizeF QSize::toSizeF() const noexcept { return *this; }
+
#ifndef QT_NO_DEBUG_STREAM
Q_CORE_EXPORT QDebug operator<<(QDebug, const QSizeF &);
#endif
diff --git a/src/corelib/tools/qspan.h b/src/corelib/tools/qspan.h
new file mode 100644
index 0000000000..d6ae2570ae
--- /dev/null
+++ b/src/corelib/tools/qspan.h
@@ -0,0 +1,452 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QSPAN_H
+#define QSPAN_H
+
+#include <QtCore/qcompilerdetection.h>
+#include <QtCore/qtypes.h>
+#include <QtCore/qcontainerfwd.h>
+
+#include <array>
+#include <cstddef>
+#include <cassert>
+#include <initializer_list>
+#include <QtCore/q20iterator.h>
+#include <QtCore/q20memory.h>
+#ifdef __cpp_lib_span
+#include <span>
+#endif
+#include <QtCore/q20type_traits.h>
+
+QT_BEGIN_NAMESPACE
+
+// like std::dynamic_extent
+namespace q20 {
+ inline constexpr auto dynamic_extent = std::size_t(-1);
+} // namespace q20
+
+QT_BEGIN_INCLUDE_NAMESPACE
+#ifdef __cpp_lib_span
+#ifdef __cpp_lib_concepts
+namespace std::ranges {
+// Officially, these are defined in <ranges>, but that is a heavy-hitter header.
+// OTOH, <span> must specialize these variable templates, too, so we assume that
+// <span> includes some meaningful subset of <ranges> and just go ahead and use them:
+template <typename T, std::size_t E>
+constexpr inline bool enable_borrowed_range<QT_PREPEND_NAMESPACE(QSpan)<T, E>> = true;
+template <typename T, std::size_t E>
+constexpr inline bool enable_view<QT_PREPEND_NAMESPACE(QSpan)<T, E>> = true;
+} // namespace std::ranges
+#endif // __cpp_lib_concepts
+#endif // __cpp_lib_span
+QT_END_INCLUDE_NAMESPACE
+
+namespace QSpanPrivate {
+
+template <typename T, std::size_t E> class QSpanBase;
+
+template <typename T>
+struct is_qspan_helper : std::false_type {};
+template <typename T, std::size_t E>
+struct is_qspan_helper<QSpan<T, E>> : std::true_type {};
+template <typename T, std::size_t E>
+struct is_qspan_helper<QSpanBase<T, E>> : std::true_type {};
+template <typename T>
+using is_qspan = is_qspan_helper<q20::remove_cvref_t<T>>;
+
+template <typename T>
+struct is_std_span_helper : std::false_type {};
+#ifdef __cpp_lib_span
+template <typename T, std::size_t E>
+struct is_std_span_helper<std::span<T, E>> : std::true_type {};
+#endif // __cpp_lib_span
+template <typename T>
+using is_std_span = is_std_span_helper<q20::remove_cvref_t<T>>;
+
+template <typename T>
+struct is_std_array_helper : std::false_type {};
+template <typename T, std::size_t N>
+struct is_std_array_helper<std::array<T, N>> : std::true_type {};
+template <typename T>
+using is_std_array = is_std_array_helper<q20::remove_cvref_t<T>>;
+
+template <typename From, typename To>
+using is_qualification_conversion =
+ std::is_convertible<From(*)[], To(*)[]>; // https://eel.is/c++draft/span.cons#note-1
+template <typename From, typename To>
+constexpr inline bool is_qualification_conversion_v = is_qualification_conversion<From, To>::value;
+
+namespace AdlTester {
+#define MAKE_ADL_TEST(what) \
+ using std:: what; /* bring into scope */ \
+ template <typename T> using what ## _result = decltype( what (std::declval<T&&>())); \
+ /* end */
+MAKE_ADL_TEST(begin)
+MAKE_ADL_TEST(data)
+MAKE_ADL_TEST(size)
+#undef MAKE_ADL_TEST
+}
+
+// Replacements for std::ranges::XXX(), but only bringing in ADL XXX()s,
+// not doing the extra work C++20 requires
+template <typename Range>
+AdlTester::begin_result<Range> adl_begin(Range &&r) { using std::begin; return begin(r); }
+template <typename Range>
+AdlTester::data_result<Range> adl_data(Range &&r) { using std::data; return data(r); }
+template <typename Range>
+AdlTester::size_result<Range> adl_size(Range &&r) { using std::size; return size(r); }
+
+// Replacement for std::ranges::iterator_t (which depends on C++20 std::ranges::begin)
+// This one uses adl_begin() instead.
+template <typename Range>
+using iterator_t = decltype(QSpanPrivate::adl_begin(std::declval<Range&>()));
+template <typename Range>
+using range_reference_t = q20::iter_reference_t<QSpanPrivate::iterator_t<Range>>;
+
+template <typename T>
+class QSpanCommon {
+protected:
+ template <typename Iterator>
+ using is_compatible_iterator = std::conjunction<
+ // ### C++20: extend to contiguous_iteratorss
+ std::is_base_of<
+ std::random_access_iterator_tag,
+ typename std::iterator_traits<Iterator>::iterator_category
+ >,
+ is_qualification_conversion<
+ std::remove_reference_t<q20::iter_reference_t<Iterator>>,
+ T
+ >
+ >;
+ template <typename Iterator, typename End>
+ using is_compatible_iterator_and_sentinel = std::conjunction<
+ // ### C++20: extend to contiguous_iterators and real sentinels
+ is_compatible_iterator<Iterator>,
+ std::negation<std::is_convertible<End, std::size_t>>
+ >;
+ template <typename Range, typename = void> // wrap use of SFINAE-unfriendly iterator_t:
+ struct is_compatible_range_helper : std::false_type {};
+ template <typename Range>
+ struct is_compatible_range_helper<Range, std::void_t<QSpanPrivate::iterator_t<Range>>>
+ : is_compatible_iterator<QSpanPrivate::iterator_t<Range>> {};
+ template <typename Range>
+ using is_compatible_range = std::conjunction<
+ // ### C++20: extend to contiguous_iterators
+ std::negation<is_qspan<Range>>,
+ std::negation<is_std_span<Range>>,
+ std::negation<is_std_array<Range>>,
+ std::negation<std::is_array<q20::remove_cvref_t<Range>>>,
+ is_compatible_range_helper<Range>
+ >;
+
+ // constraints
+ template <typename Iterator>
+ using if_compatible_iterator = std::enable_if_t<
+ is_compatible_iterator<Iterator>::value
+ , bool>;
+ template <typename Iterator, typename End>
+ using if_compatible_iterator_and_sentinel = std::enable_if_t<
+ is_compatible_iterator_and_sentinel<Iterator, End>::value
+ , bool>;
+ template <typename Range>
+ using if_compatible_range = std::enable_if_t<is_compatible_range<Range>::value, bool>;
+}; // class QSpanCommon
+
+template <typename T, std::size_t E>
+class QSpanBase : protected QSpanCommon<T>
+{
+ static_assert(E < size_t{(std::numeric_limits<qsizetype>::max)()},
+ "QSpan only supports extents that fit into the signed size type (qsizetype).");
+
+ struct Enabled_t { explicit Enabled_t() = default; };
+ static inline constexpr Enabled_t Enable{};
+
+ template <typename S, std::size_t N>
+ using if_compatible_array = std::enable_if_t<
+ N == E && is_qualification_conversion_v<S, T>
+ , bool>;
+
+ template <typename S>
+ using if_qualification_conversion = std::enable_if_t<
+ is_qualification_conversion_v<S, T>
+ , bool>;
+protected:
+ using Base = QSpanCommon<T>;
+
+ // data members:
+ T *m_data;
+ static constexpr qsizetype m_size = qsizetype(E);
+
+ // types and constants:
+ // (in QSpan only)
+
+ // constructors (need to be public d/t the way ctor inheriting works):
+public:
+ template <std::size_t E2 = E, std::enable_if_t<E2 == 0, bool> = true>
+ Q_IMPLICIT constexpr QSpanBase() noexcept : m_data{nullptr} {}
+
+ template <typename It, typename Base::template if_compatible_iterator<It> = true>
+ explicit constexpr QSpanBase(It first, qsizetype count)
+ : m_data{q20::to_address(first)}
+ {
+ Q_ASSERT(count == m_size);
+ }
+
+ template <typename It, typename End, typename Base::template if_compatible_iterator_and_sentinel<It, End> = true>
+ explicit constexpr QSpanBase(It first, End last)
+ : QSpanBase(first, last - first) {}
+
+ template <size_t N, std::enable_if_t<N == E, bool> = true>
+ Q_IMPLICIT constexpr QSpanBase(q20::type_identity_t<T> (&arr)[N]) noexcept
+ : QSpanBase(arr, N) {}
+
+ template <typename S, size_t N, if_compatible_array<S, N> = true>
+ Q_IMPLICIT constexpr QSpanBase(std::array<S, N> &arr) noexcept
+ : QSpanBase(arr.data(), N) {}
+
+ template <typename S, size_t N, if_compatible_array<S, N> = true>
+ Q_IMPLICIT constexpr QSpanBase(const std::array<S, N> &arr) noexcept
+ : QSpanBase(arr.data(), N) {}
+
+ template <typename Range, typename Base::template if_compatible_range<Range> = true>
+ Q_IMPLICIT constexpr QSpanBase(Range &&r)
+ : QSpanBase(QSpanPrivate::adl_data(r), // no forward<>() here (std doesn't have it, either)
+ qsizetype(QSpanPrivate::adl_size(r))) // ditto, no forward<>()
+ {}
+
+ template <typename S, if_qualification_conversion<S> = true>
+ Q_IMPLICIT constexpr QSpanBase(QSpan<S, E> other) noexcept
+ : QSpanBase(other.data(), other.size())
+ {}
+
+ template <typename S, if_qualification_conversion<S> = true>
+ Q_IMPLICIT constexpr QSpanBase(QSpan<S> other)
+ : QSpanBase(other.data(), other.size())
+ {}
+
+ template <typename U = T, std::enable_if_t<std::is_const_v<U>, bool> = true>
+ Q_IMPLICIT constexpr QSpanBase(std::initializer_list<std::remove_cv_t<T>> il)
+ : QSpanBase(il.begin(), il.size())
+ {}
+
+#ifdef __cpp_lib_span
+ template <typename S, if_qualification_conversion<S> = true>
+ Q_IMPLICIT constexpr QSpanBase(std::span<S, E> other) noexcept
+ : QSpanBase(other.data(), other.size())
+ {}
+
+ template <typename S, if_qualification_conversion<S> = true>
+ Q_IMPLICIT constexpr QSpanBase(std::span<S> other)
+ : QSpanBase(other.data(), other.size())
+ {}
+#endif // __cpp_lib_span
+}; // class QSpanBase (fixed extent)
+
+template <typename T>
+class QSpanBase<T, q20::dynamic_extent> : protected QSpanCommon<T>
+{
+ template <typename S>
+ using if_qualification_conversion = std::enable_if_t<
+ is_qualification_conversion_v<S, T>
+ , bool>;
+protected:
+ using Base = QSpanCommon<T>;
+
+ // data members:
+ T *m_data;
+ qsizetype m_size;
+
+ // constructors (need to be public d/t the way ctor inheriting works):
+public:
+ Q_IMPLICIT constexpr QSpanBase() noexcept : m_data{nullptr}, m_size{0} {}
+
+ template <typename It, typename Base::template if_compatible_iterator<It> = true>
+ Q_IMPLICIT constexpr QSpanBase(It first, qsizetype count)
+ : m_data{q20::to_address(first)}, m_size{count} {}
+
+ template <typename It, typename End, typename Base::template if_compatible_iterator_and_sentinel<It, End> = true>
+ Q_IMPLICIT constexpr QSpanBase(It first, End last)
+ : QSpanBase(first, last - first) {}
+
+ template <size_t N>
+ Q_IMPLICIT constexpr QSpanBase(q20::type_identity_t<T> (&arr)[N]) noexcept
+ : QSpanBase(arr, N) {}
+
+ template <typename S, size_t N, if_qualification_conversion<S> = true>
+ Q_IMPLICIT constexpr QSpanBase(std::array<S, N> &arr) noexcept
+ : QSpanBase(arr.data(), N) {}
+
+ template <typename S, size_t N, if_qualification_conversion<S> = true>
+ Q_IMPLICIT constexpr QSpanBase(const std::array<S, N> &arr) noexcept
+ : QSpanBase(arr.data(), N) {}
+
+ template <typename Range, typename Base::template if_compatible_range<Range> = true>
+ Q_IMPLICIT constexpr QSpanBase(Range &&r)
+ : QSpanBase(QSpanPrivate::adl_data(r), // no forward<>() here (std doesn't have it, either)
+ qsizetype(QSpanPrivate::adl_size(r))) // ditto, no forward<>()
+ {}
+
+ template <typename S, size_t N, if_qualification_conversion<S> = true>
+ Q_IMPLICIT constexpr QSpanBase(QSpan<S, N> other) noexcept
+ : QSpanBase(other.data(), other.size())
+ {}
+
+ template <typename U = T, std::enable_if_t<std::is_const_v<U>, bool> = true>
+ Q_IMPLICIT constexpr QSpanBase(std::initializer_list<std::remove_cv_t<T>> il) noexcept
+ : QSpanBase(il.begin(), il.size())
+ {}
+
+#ifdef __cpp_lib_span
+ template <typename S, size_t N, if_qualification_conversion<S> = true>
+ Q_IMPLICIT constexpr QSpanBase(std::span<S, N> other) noexcept
+ : QSpanBase(other.data(), other.size())
+ {}
+#endif // __cpp_lib_span
+}; // class QSpanBase (dynamic extent)
+
+} // namespace QSpanPrivate
+
+template <typename T, std::size_t E>
+class QSpan
+#ifndef Q_QDOC
+ : private QSpanPrivate::QSpanBase<T, E>
+#endif
+{
+ using Base = QSpanPrivate::QSpanBase<T, E>;
+ Q_ALWAYS_INLINE constexpr void verify([[maybe_unused]] qsizetype pos = 0,
+ [[maybe_unused]] qsizetype n = 1) const
+ {
+ Q_ASSERT(pos >= 0);
+ Q_ASSERT(pos <= size());
+ Q_ASSERT(n >= 0);
+ Q_ASSERT(n <= size() - pos);
+ }
+
+ template <std::size_t N>
+ static constexpr bool subspan_always_succeeds_v = N <= E && E != q20::dynamic_extent;
+public:
+ // constants and types
+ using value_type = std::remove_cv_t<T>;
+#ifdef QT_COMPILER_HAS_LWG3346
+ using iterator_concept = std::contiguous_iterator_tag;
+ using element_type = T;
+#endif
+ using size_type = qsizetype; // difference to std::span
+ using difference_type = qptrdiff; // difference to std::span
+ using pointer = T*;
+ using const_pointer = const T*;
+ using reference = T&;
+ using const_reference = const T&;
+ using iterator = pointer; // implementation-defined choice
+ using const_iterator = const_pointer; // implementation-defined choice
+ using reverse_iterator = std::reverse_iterator<iterator>;
+ using const_reverse_iterator = std::reverse_iterator<const_iterator>;
+ static constexpr std::size_t extent = E;
+
+ // [span.cons], constructors, copy, and assignment
+ using Base::Base;
+#ifdef Q_QDOC
+ template <typename It> using if_compatible_iterator = bool;
+ template <typename S> using if_qualification_conversion = bool;
+ template <typename Range> using if_compatible_range = bool;
+ template <typename It, if_compatible_iterator<It> = true> constexpr QSpan(It first, qsizetype count);
+ template <typename It, if_compatible_iterator<It> = true> constexpr QSpan(It first, It last);
+ template <size_t N> constexpr QSpan(q20::type_identity_t<T> (&arr)[N]) noexcept;
+ template <typename S, size_t N, if_qualification_conversion<S> = true> constexpr QSpan(std::array<S, N> &arr) noexcept;
+ template <typename S, size_t N, if_qualification_conversion<S> = true> constexpr QSpan(const std::array<S, N> &arr) noexcept;
+ template <typename Range, if_compatible_range<Range> = true> constexpr QSpan(Range &&r);
+ template <typename S, size_t N, if_qualification_conversion<S> = true> constexpr QSpan(QSpan<S, N> other) noexcept;
+ template <typename S, size_t N, if_qualification_conversion<S> = true> constexpr QSpan(std::span<S, N> other) noexcept;
+ constexpr QSpan(std::initializer_list<value_type> il);
+#endif // Q_QDOC
+
+ // [span.obs]
+ [[nodiscard]] constexpr size_type size() const noexcept { return this->m_size; }
+ [[nodiscard]] constexpr size_type size_bytes() const noexcept { return size() * sizeof(T); }
+ [[nodiscard]] constexpr bool empty() const noexcept { return size() == 0; }
+
+ // [span.elem]
+ [[nodiscard]] constexpr reference operator[](size_type idx) const
+ { verify(idx); return data()[idx]; }
+ [[nodiscard]] constexpr reference front() const { verify(); return *data(); }
+ [[nodiscard]] constexpr reference back() const { verify(); return data()[size() - 1]; }
+ [[nodiscard]] constexpr pointer data() const noexcept { return this->m_data; }
+
+ // [span.iterators]
+ [[nodiscard]] constexpr iterator begin() const noexcept { return data(); }
+ [[nodiscard]] constexpr iterator end() const noexcept { return data() + size(); }
+ [[nodiscard]] constexpr const_iterator cbegin() const noexcept { return begin(); }
+ [[nodiscard]] constexpr const_iterator cend() const noexcept { return end(); }
+ [[nodiscard]] constexpr reverse_iterator rbegin() const noexcept { return reverse_iterator{end()}; }
+ [[nodiscard]] constexpr reverse_iterator rend() const noexcept { return reverse_iterator{begin()}; }
+ [[nodiscard]] constexpr const_reverse_iterator crbegin() const noexcept { return rbegin(); }
+ [[nodiscard]] constexpr const_reverse_iterator crend() const noexcept { return rend(); }
+
+ // [span.sub]
+ template <std::size_t Count>
+ [[nodiscard]] constexpr QSpan<T, Count> first() const
+ noexcept(subspan_always_succeeds_v<Count>)
+ {
+ static_assert(Count <= E,
+ "Count cannot be larger than the span's extent.");
+ verify(0, Count);
+ return QSpan<T, Count>{data(), Count};
+ }
+
+ template <std::size_t Count>
+ [[nodiscard]] constexpr QSpan<T, Count> last() const
+ noexcept(subspan_always_succeeds_v<Count>)
+ {
+ static_assert(Count <= E,
+ "Count cannot be larger than the span's extent.");
+ verify(0, Count);
+ return QSpan<T, Count>{data() + (size() - Count), Count};
+ }
+
+ template <std::size_t Offset>
+ [[nodiscard]] constexpr auto subspan() const
+ noexcept(subspan_always_succeeds_v<Offset>)
+ {
+ static_assert(Offset <= E,
+ "Offset cannot be larger than the span's extent.");
+ verify(Offset, 0);
+ if constexpr (E == q20::dynamic_extent)
+ return QSpan<T>{data() + Offset, qsizetype(size() - Offset)};
+ else
+ return QSpan<T, E - Offset>{data() + Offset, qsizetype(E - Offset)};
+ }
+
+ template <std::size_t Offset, std::size_t Count>
+ [[nodiscard]] constexpr auto subspan() const
+ noexcept(subspan_always_succeeds_v<Offset + Count>)
+ { return subspan<Offset>().template first<Count>(); }
+
+ [[nodiscard]] constexpr QSpan<T> first(size_type n) const { verify(0, n); return {data(), n}; }
+ [[nodiscard]] constexpr QSpan<T> last(size_type n) const { verify(0, n); return {data() + (size() - n), n}; }
+ [[nodiscard]] constexpr QSpan<T> subspan(size_type pos) const { verify(pos, 0); return {data() + pos, size() - pos}; }
+ [[nodiscard]] constexpr QSpan<T> subspan(size_type pos, size_type n) const { return subspan(pos).first(n); }
+
+ // Qt-compatibility API:
+ [[nodiscard]] bool isEmpty() const noexcept { return empty(); }
+ // nullary first()/last() clash with first<>() and last<>(), so they're not provided for QSpan
+ [[nodiscard]] constexpr QSpan<T> sliced(size_type pos) const { return subspan(pos); }
+ [[nodiscard]] constexpr QSpan<T> sliced(size_type pos, size_type n) const { return subspan(pos, n); }
+
+}; // class QSpan
+
+// [span.deduct]
+template <class It, class EndOrSize>
+QSpan(It, EndOrSize) -> QSpan<std::remove_reference_t<q20::iter_reference_t<It>>>;
+template <class T, std::size_t N>
+QSpan(T (&)[N]) -> QSpan<T, N>;
+template <class T, std::size_t N>
+QSpan(std::array<T, N> &) -> QSpan<T, N>;
+template <class T, std::size_t N>
+QSpan(const std::array<T, N> &) -> QSpan<const T, N>;
+template <class R>
+QSpan(R&&) -> QSpan<std::remove_reference_t<QSpanPrivate::range_reference_t<R>>>;
+
+QT_END_NAMESPACE
+
+#endif // QSPAN_H
diff --git a/src/corelib/tools/qspan.qdoc b/src/corelib/tools/qspan.qdoc
new file mode 100644
index 0000000000..472f122877
--- /dev/null
+++ b/src/corelib/tools/qspan.qdoc
@@ -0,0 +1,651 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
+
+/*!
+ \class QSpan
+ \inmodule QtCore
+ \since 6.7
+ \brief A non-owning container over contiguous data.
+ \ingroup tools
+ \reentrant
+
+ A QSpan references a contiguous portion of another contiguous container.
+ It acts as an interface type for all kinds of contiguous containers,
+ without the need to construct an owning container such as QList or
+ std::vector first.
+
+ The data referenced by a QSpan may be represented as an array (or
+ array-compatible data-structure such as QList, std::vector,
+ QVarLengthArray, etc.). QSpan itself merely stores a pointer to the data,
+ so users must ensure that QSpan objects do not outlive the data they
+ reference.
+
+ Unlike views such as QStringView, QLatin1StringView and QUtf8StringView,
+ referenced data can be modified through a QSpan object. To prevent this,
+ construct a QSpan over a \c{const T}:
+
+ \code
+ int numbers[] = {0, 1, 2};
+ QSpan<int> span = numbers;
+ span[0] = 42;
+ // numbers == {42, 1, 2};
+ QSpan<const int> cspan = numbers;
+ cspan[0] = 0; // ERROR: cspan[0] is read-only
+ \endcode
+
+ A QSpan can be \e{fixed-size} or \e{variable-sized}.
+
+ A variable-sized span is formed by omitting the second template argument
+ (or setting it to \c{std::dynamic_extent}, which is, however, only
+ available in C++20 builds), as seen in the example above.
+
+ A fixed-size span is formed by passing a number as the second template
+ argument:
+
+ \code
+ int numbers[] = {0, 1, 2};
+ QSpan<int, 3> span = numbers;
+ QSpan<const int, 3> = numbers; // also OK
+ \endcode
+
+ As the name suggests, a fixed-size span's size() is fixed at compile-time
+ whereas the size() of a variable-sized span is determined only at run-time.
+
+ A fixed-size span is not default-constructible (unless its \l extent is zero
+ (0)). A variable-sized span \e{is} default-constructible and will have
+ \c{data() == nullptr} and \c{size() == 0}.
+
+ A fixed-size span can be implicitly converted into a variable-sized one.
+ The opposite direction (variable-length into fixed-length) has the
+ precondition that both span's sizes must match.
+
+ Unlike with owning containers, \c{const} is \e{shallow} in QSpan: you can
+ still modify the data through a const QSpan (but not through a
+ \c{QSpan<const T>}), and begin() and end() are not overloaded on
+ \c{const}/non-\c{const}. There are cbegin() and cend(), though, that return
+ const_iterators which prevent modification of the data even though \c{T} is
+ not const:
+ \code
+ int numbers[] = {0, 1, 2};
+ const QSpan<int> span = numbers;
+ span.front() = 42; // OK, numbers[0] == 42 now
+ *span.begin() = 31; // OK, numbers[0] == 31 now
+ *span.cbegin() = -1; // ERROR: cannot assign through a const_iterator
+ \endcode
+
+ QSpan should be passed by value, not by reference-to-const:
+
+ \code
+ void consume(QSpan<const int> data); // OK
+ void consume(const QSpan<const int> &data); // works, but is non-idiomatic and less efficient
+ \endcode
+
+ \c{QSpan<T,N>} is a \e{Literal Type}, regardless of whether \c{T} is a
+ Literal Type or not.
+
+ \section2 QSpan vs. std::span
+ \target span-STL
+
+ QSpan is closely modelled after
+ \l{https://en.cppreference.com/w/cpp/container/span}{std::span}, but has a
+ few differences which we'll discuss here. Since they both implicitly
+ convert into each other, you're free to choose whichever one you like best
+ in your own code.
+
+ \list
+ \li QSpan is using the signed qsizetype as \c{size_type}
+ whereas \c{std::span} uses \c{size_t}.
+ \li All QSpan constructors are implicit;
+ many \c{std::span} ones are \c{explicit}.
+ \li QSpan can be constructed from rvalue owning containers, \c{std::span} can not.
+ \endlist
+
+ The last two are required for source-compatibility when functions that took
+ owning containers are converted to take QSpan instead, which is a
+ vitally-important use-case in Qt. The use of qsizetype is for consistency
+ with the rest of Qt containers. QSpan template arguments still use size_t
+ to avoid introducing unnecessary error conditions (negative sizes).
+
+ \section2 Compatible Iterators
+ \target span-compatible-iterators
+
+ QSpan can be constructed from an iterator and size or from an
+ iterator pair, provided the iterators are \e{compatible} ones.
+ Eventually, this should mean C++20 \c{std::contiguous_iterator} and
+ \c{std::sentinel_for}, but while Qt still supports C++17, only raw pointers
+ are considered contiguous iterators.
+
+ \section2 Compatible Ranges
+ \target span-compatible-ranges
+
+ QSpan can also be constructed from a \e{compatible} range. A range is
+ compatible if it has \l{span-compatible-iterators}{compatible iterators}.
+
+ \sa QList, QStringView, QLatin1StringView, QUtf8StringView
+*/
+
+//
+// Nested types and constants
+//
+
+/*!
+ \typedef QSpan::element_type
+
+ An alias for \c{T}. Includes the \c{const}, if any.
+
+ This alias is provided for compatbility with the STL.
+
+ \sa value_type, pointer
+*/
+
+/*!
+ \typedef QSpan::value_type
+
+ An alias for \c{T}. Excludes the \c{const}, if any.
+
+ This alias is provided for compatbility with the STL.
+
+ \sa element_type
+*/
+
+/*!
+ \typedef QSpan::size_type
+
+ An alias for qsizetype. This \l{span-STL}{differs from \c{std::span}}.
+
+ This alias is provided for compatbility with the STL.
+*/
+
+/*!
+ \typedef QSpan::difference_type
+
+ An alias for qptrdiff. This \l{span-STL}{differs from \c{std::span}}.
+
+ This alias is provided for compatbility with the STL.
+*/
+
+/*!
+ \typedef QSpan::pointer
+
+ An alias for \c{T*} and \c{element_type*}, respectively. Includes the \c{const}, if any.
+
+ This alias is provided for compatbility with the STL.
+
+ \sa element_type, const_pointer, reference, iterator
+*/
+
+/*!
+ \typedef QSpan::const_pointer
+
+ An alias for \c{const T*} and \c{const element_type*}, respectively.
+
+ This alias is provided for compatbility with the STL.
+
+ \sa element_type, pointer, const_reference, const_iterator
+*/
+
+/*!
+ \typedef QSpan::reference
+
+ An alias for \c{T&} and \c{element_type&}, respectively. Includes the \c{const}, if any.
+
+ This alias is provided for compatbility with the STL.
+
+ \sa element_type, const_reference, pointer
+*/
+
+/*!
+ \typedef QSpan::const_reference
+
+ An alias for \c{const T&} and \c{const element_type&}, respectively.
+
+ This alias is provided for compatbility with the STL.
+
+ \sa element_type, reference, const_pointer
+*/
+
+/*!
+ \typedef QSpan::iterator
+
+ An alias for \c{T*} and \c{pointer}, respectively. Includes the \c{const}, if any.
+
+ \sa pointer, const_iterator, reverse_iterator
+*/
+
+/*!
+ \typedef QSpan::const_iterator
+
+ An alias for \c{const T*} and \c{const_pointer}, respectively.
+
+ \sa const_pointer, iterator, const_reverse_iterator
+*/
+
+/*!
+ \typedef QSpan::reverse_iterator
+
+ An alias for \c{std::reverse_iterator<iterator>}. Includes the \c{const}, if any.
+
+ \sa iterator, const_reverse_iterator
+*/
+
+/*!
+ \typedef QSpan::const_reverse_iterator
+
+ An alias for \c{std::reverse_iterator<const_iterator>}.
+
+ \sa const_iterator, reverse_iterator
+*/
+
+/*!
+ \variable QSpan::extent
+
+ The second template argument of \c{QSpan<T, E>}, that is, \c{E}. This is
+ \c{std::dynamic_extent} for variable-sized spans.
+
+ \note While all other sizes and indexes in QSpan use qsizetype, this
+ variable, like \c{E}, is actually of type \c{size_t}, for compatibility with
+ \c{std::span} and \c{std::dynamic_extent}.
+
+ \sa size()
+*/
+
+//
+// Constructors and SMFs
+//
+
+/*!
+ \fn template <typename T, size_t E> QSpan<T,E>::QSpan()
+
+ Default constructor.
+
+ This constructor is only present if \c{E} is either zero (0) or
+ \c{std::dynamic_extent}. In other words: only fixed-zero-sized or variable-sized spans
+ are default-constructible.
+
+ \sa extent
+*/
+
+/*!
+ \fn template <typename T, size_t E> QSpan<T,E>::QSpan(const QSpan &other)
+ \fn template <typename T, size_t E> QSpan<T,E>::QSpan(QSpan &&other)
+ \fn template <typename T, size_t E> QSpan<T,E> &QSpan<T,E>::operator=(const QSpan &other)
+ \fn template <typename T, size_t E> QSpan<T,E> &QSpan<T,E>::operator=(QSpan &&other)
+ \fn template <typename T, size_t E> QSpan<T,E>::~QSpan()
+
+ These Special Member Functions are implicitly-defined.
+
+ \note Moves are equivalent to copies. Only data() and size() are copied
+ from span to span, not the referenced data.
+*/
+
+/*!
+ \fn template <typename T, size_t E> template <typename It, QSpan<T, E>::if_compatible_iterator<It>> QSpan<T,E>::QSpan(It first, qsizetype count)
+
+ Constructs a QSpan referencing the data starting at \a first and having length
+ \a count.
+
+ \c{[first, count)} must be a valid range.
+
+ \note This constructor participates in overload resolution only if \c{It}
+ is \l{span-compatible-iterators}{a compatible iterator}.
+*/
+
+/*!
+ \fn template <typename T, size_t E> template <typename It, QSpan<T, E>::if_compatible_iterator<It>> QSpan<T,E>::QSpan(It first, It last)
+
+ Constructs a QSpan referencing the data starting at \a first and having length
+ (\a last - \a first).
+
+ \c{[first, last)} must be a valid range.
+
+ \note This constructor participates in overload resolution only if \c{It}
+ is \l{span-compatible-iterators}{a compatible iterator}.
+*/
+
+/*!
+ \fn template <typename T, size_t E> template <size_t N> QSpan<T,E>::QSpan(q20::type_identity_t<T> (&arr)[N]);
+ \fn template <typename T, size_t E> template <typename S, size_t N, QSpan<T, E>::if_qualification_conversion<S> = true> QSpan<T,E>::QSpan(std::array<S, N> &arr);
+ \fn template <typename T, size_t E> template <typename S, size_t N, QSpan<T, E>::if_qualification_conversion<S> = true> QSpan<T,E>::QSpan(const std::array<S, N> &arr);
+
+ Constructs a QSpan referencing the data in the supplied array \a arr.
+
+ \note This constructor participates in overload resolution only if
+ \list
+ \li either \c{N} or \l{extent} are \c{std::dynamic_extent} or otherwise \l{extent} \c{==} \c{N}
+ \li and either \c{S} or \c{const S} are the same as \c{T}.
+ \endlist
+
+ \note \c{q20::type_identity_t} is a C++17 backport of C++20's
+ \l{https://en.cppreference.com/w/cpp/types/type_identity}{\c{std::type_identity_t}}.
+*/
+
+/*!
+ \fn template <typename T, size_t E> template <typename Range, QSpan<T, E>::if_compatible_range<Range> = true> QSpan<T,E>::QSpan(Range &&r)
+
+ Constructs a QSpan referencing the data in the supplied range \a r.
+
+ \note This constructor participates in overload resolution only if \c{Range}
+ is \l{span-compatible-ranges}{a compatible range}.
+*/
+
+/*!
+ \fn template <typename T, size_t E> template <typename S, size_t N, QSpan<T, E>::if_qualification_conversion<S> = true> QSpan<T,E>::QSpan(QSpan<S, N> other);
+ \fn template <typename T, size_t E> template <typename S, size_t N, QSpan<T, E>::if_qualification_conversion<S> = true> QSpan<T,E>::QSpan(std::span<S, N> other);
+
+ Constructs a QSpan referencing the data in the supplied span \a other.
+
+ \note This constructor participates in overload resolution only if
+ \list
+ \li either \c{N} or \l{extent} are \c{std::dynamic_extent} or \l{extent} \c{==} \c{N}
+ \li and either \c{S} or \c{const S} are the same as \c{T}.
+ \endlist
+*/
+
+/*!
+ \fn template <typename T, size_t E> QSpan<T, E>::QSpan(std::initializer_list<value_type> il);
+
+ Constructs a QSpan referencing the data in the supplied initializer list \a il.
+
+ \note This constructor participates in overload resolution only if \c{T} is \c{const}-qualified.
+
+ \note This constructor is \c{noexcept} only if \c{E} is \c{std::dynamic_extent}.
+
+ \note If \c{E} is not \c{std::dynamic_extent} and the size of \a il is not \c{E}, the behavior is undefined.
+*/
+
+//
+// Member functions: sizes
+//
+
+/*!
+ \fn template <typename T, size_t E> auto QSpan<T, E>::size() const
+
+ Returns the size of the span, that is, the number of elements it references.
+
+ \sa size_bytes(), empty(), isEmpty()
+*/
+
+/*!
+ \fn template <typename T, size_t E> auto QSpan<T, E>::size_bytes() const
+
+ Returns the size of the span in bytes, that is, the number of elements
+ multiplied by \c{sizeof(T)}.
+
+ \sa size(), empty(), isEmpty()
+*/
+
+/*!
+ \fn template <typename T, size_t E> auto QSpan<T, E>::empty() const
+ \fn template <typename T, size_t E> auto QSpan<T, E>::isEmpty() const
+
+ Returns whether the span is empty, that is, whether \c{size() == 0}.
+
+ These functions do the same thing: empty() is provided for STL
+ compatibility and isEmpty() is provided for Qt compatibility.
+
+ \sa size(), size_bytes()
+*/
+
+//
+// element access
+//
+
+/*!
+ \fn template <typename T, size_t E> QSpan<T, E>::operator[](size_type idx) const
+
+ Returns a reference to the element at index \a idx in the span.
+
+ The index must be in range, that is, \a idx >= 0 and \a idx < size(),
+ otherwise the behavior is undefined.
+
+ \sa front(), back(), size(), empty()
+*/
+
+/*!
+ \fn template <typename T, size_t E> auto QSpan<T, E>::front() const
+
+ Returns a reference to the first element in the span.
+
+ The span must not be empty, otherwise the behavior is undefined.
+
+ \sa operator[](), back(), size(), empty()
+*/
+
+/*!
+ \fn template <typename T, size_t E> auto QSpan<T, E>::back() const
+
+ Returns a reference to the last element in the span.
+
+ The span must not be empty, otherwise the behavior is undefined.
+
+ \sa operator[](), front(), size(), empty()
+*/
+
+/*!
+ \fn template <typename T, size_t E> auto QSpan<T, E>::data() const
+
+ Returns a pointer to the beginning of the span.
+
+ The same as calling begin().
+
+ \sa begin(), front()
+*/
+
+//
+// iterators
+//
+
+/*!
+ \fn template <typename T, size_t E> auto QSpan<T, E>::begin() const
+
+ Returns an interator pointing at the beginning of the span.
+
+ Because QSpan iterators are just pointers, this is the same as calling
+ data().
+
+ \sa end(), cbegin(), rbegin(), crbegin(), data()
+*/
+
+/*!
+ \fn template <typename T, size_t E> auto QSpan<T, E>::end() const
+
+ Returns an iterator pointing to one past the end of the span.
+
+ Because QSpan iterators are just pointers, this it the same as calling
+ \c{data() + size()}.
+
+ \sa begin(), cend(), rend(), crend(), data(), size()
+*/
+
+/*!
+ \fn template <typename T, size_t E> auto QSpan<T, E>::cbegin() const
+
+ Returns a const_iterator pointing to the beginning of the span.
+
+ This will return a read-only iterator even if \c{T} is not \c{const}:
+ \code
+ QSpan<int> span = ~~~;
+ *span.begin() = 42; // OK
+ *span.cbegin() = 42; // ERROR: cannot assign through a const_iterator
+ \endcode
+
+ \sa cend(), begin(), crbegin(), rbegin(), data()
+*/
+
+/*!
+ \fn template <typename T, size_t E> auto QSpan<T, E>::cend() const
+
+ Returns a const_iterator pointing to one past the end of the span.
+
+ \sa cbegin(), end(), crend(), rend(), data(), size()
+*/
+
+/*!
+ \fn template <typename T, size_t E> auto QSpan<T, E>::rbegin() const
+
+ Returns a reverse_iterator pointing to the beginning of the reversed span.
+
+ \sa rend(), crbegin(), begin(), cbegin()
+*/
+
+/*!
+ \fn template <typename T, size_t E> auto QSpan<T, E>::rend() const
+
+ Returns a reverse_iterator pointing to one past the end of the reversed span.
+
+ \sa rbegin(), crend(), end(), cend()
+*/
+
+/*!
+ \fn template <typename T, size_t E> auto QSpan<T, E>::crbegin() const
+
+ Returns a const_reverse_iterator pointing to the beginning of the reversed span.
+
+ \sa crend(), rbegin(), cbegin(), begin()
+*/
+
+/*!
+ \fn template <typename T, size_t E> auto QSpan<T, E>::crend() const
+
+ Returns a const_reverse_iterator pointing to one past the end of the reversed span.
+
+ \sa crbegin(), rend(), cend(), end()
+*/
+
+//
+// compile-time subspans:
+//
+
+/*!
+ \fn template <typename T, size_t E> template <std::size_t Count> auto QSpan<T, E>::first() const
+ \keyword first-t
+
+ Returns a fixed-sized span of size \c{Count} referencing the first \c{Count} elements of \c{*this}.
+
+ The span must hold at least \c{Count} elements (\c{E} >= \c{Count} \e{and}
+ size() >= \c{Count}), otherwise the behavior is undefined.
+
+ \sa first(QSpan<T,E>::size_type), last(), subspan()
+*/
+
+/*!
+ \fn template <typename T, size_t E> template <std::size_t Count> auto QSpan<T, E>::last() const
+ \keyword last-t
+
+ Returns a fixed-sized span of size \c{Count} referencing the last \c{Count} elements of \c{*this}.
+
+ The span must hold at least \c{Count} elements (\c{E} >= \c{Count} \e{and}
+ size() >= \c{Count}), otherwise the behavior is undefined.
+
+ \sa last(QSpan<T,E>::size_type), first(), subspan()
+*/
+
+/*!
+ \fn template <typename T, size_t E> template <std::size_t Offset> auto QSpan<T, E>::subspan() const
+ \keyword subspan-t1
+
+ Returns a span of size \c{E - Offset} referencing the remainder of this span
+ after dropping the first \c{Offset} elements.
+
+ If \c{*this} is a variable-sized span, the return type is a variable-sized
+ span, otherwise it is a fixed-sized span.
+
+ This span must hold at least \c{Offset} elements (\c{E} >= \c{Offset} \e{and}
+ size() >= \c{Offset}), otherwise the behavior is undefined.
+
+ \sa subspan(QSpan<T,E>::size_type), subspan(), first(), last()
+*/
+
+#if 0 // needs fix for QTBUG-118080 integrated into qt5.git
+/*!
+ \fn template <typename T, size_t E> template <std::size_t Offset, std::size_t Count> auto QSpan<T, E>::subspan() const
+ \keyword subspan-t2
+
+ Returns a span of size \c{Count} referencing the \c{Count} elements of this
+ span starting at \c{Offset}.
+
+ If \c{*this} is a variable-sized span, the return type is a variable-sized
+ span, otherwise it is a fixed-sized span.
+
+ This span must hold at least \c{Offset + Count} elements (\c{E} >=
+ \c{Offset + Count} \e{and} size() >= \c{Offset + Count}), otherwise the
+ behavior is undefined.
+
+ \sa subspan(QSpan<T,E>::size_type, QSpan<T,E>::size_type), subspan(), first(), last()
+*/
+#endif
+
+//
+// runtime subspans:
+//
+
+/*!
+ \fn template <typename T, size_t E> auto QSpan<T, E>::first(qsizetype n) const
+ \keyword first-n
+
+ Returns a variable-sized span of size \a n referencing the first \a n elements of \c{*this}.
+
+ \a n must be non-negative.
+
+ The span must hold at least \a n elements (\c{E} >= \a n \e{and} size() >=
+ \a n), otherwise the behavior is undefined.
+
+ \sa {first-t}{first<N>()}, last(QSpan<T,E>::size_type), subspan(QSpan<T,E>::size_type),
+ subspan(QSpan<T,E>::size_type, QSpan<T,E>::size_type)
+ \sa sliced()
+*/
+
+/*!
+ \fn template <typename T, size_t E> auto QSpan<T, E>::last(qsizetype n) const
+ \keyword last-n
+
+ Returns a variable-sized span of size \a n referencing the last \a n elements of \c{*this}.
+
+ \a n must be non-negative.
+
+ The span must hold at least \a n elements (\c{E} >= \a n \e{and}
+ size() >= \a n), otherwise the behavior is undefined.
+
+ \sa last(), first(QSpan<T,E>::size_type), subspan(QSpan<T,E>::size_type),
+ subspan(QSpan<T,E>::size_type, QSpan<T,E>::size_type), sliced()
+*/
+
+/*!
+ \fn template <typename T, size_t E> auto QSpan<T, E>::subspan(qsizetype pos) const
+ \fn template <typename T, size_t E> auto QSpan<T, E>::sliced(qsizetype pos) const
+ \keyword subspan-n1
+
+ Returns a variable-sized span of size \c{size() - pos} referencing the
+ remainder of this span after dropping the first \a pos elements.
+
+ \a pos must be non-negative.
+
+ This span must hold at least \a pos elements (\c{E} >= \a pos \e{and}
+ size() >= \a pos), otherwise the behavior is undefined.
+
+ These functions do the same thing: subspan() is provided for STL
+ compatibility and sliced() is provided for Qt compatibility.
+
+ \sa subspan(), first(QSpan<T,E>::size_type), last(QSpan<T,E>::size_type)
+*/
+
+/*!
+ \fn template <typename T, size_t E> auto QSpan<T, E>::subspan(qsizetype pos, qsizetype n) const
+ \fn template <typename T, size_t E> auto QSpan<T, E>::sliced(qsizetype pos, qsizetype n) const
+ \keyword subspan-n2
+
+ Returns a variable-sized span of size \a n referencing the \a n elements of
+ this span starting at \a pos.
+
+ Both \a pos and \a n must be non-negative.
+
+ This span must hold at least \c{pos + n} elements (\c{E} >=
+ \c{pos + n} \e{and} size() >= \c{pos + n}), otherwise the
+ behavior is undefined.
+
+ These functions do the same thing: subspan() is provided for STL
+ compatibility and sliced() is provided for Qt compatibility.
+
+ \sa subspan(), first(QSpan<T,E>::size_type), last(QSpan<T,E>::size_type)
+*/
+
diff --git a/src/corelib/tools/qspan_p.h b/src/corelib/tools/qspan_p.h
new file mode 100644
index 0000000000..0072e3ef64
--- /dev/null
+++ b/src/corelib/tools/qspan_p.h
@@ -0,0 +1,24 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QSPAN_P_H
+#define QSPAN_P_H
+
+#include <QtCore/qspan.h>
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+QT_BEGIN_NAMESPACE
+
+QT_END_NAMESPACE
+
+#endif // QSPAN_P_H
diff --git a/src/corelib/tools/qstack.cpp b/src/corelib/tools/qstack.cpp
index 849a474d2c..5255e0e100 100644
--- a/src/corelib/tools/qstack.cpp
+++ b/src/corelib/tools/qstack.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
/*!
\class QStack
diff --git a/src/corelib/tools/qstack.h b/src/corelib/tools/qstack.h
index c43c63cdd2..11ffb13328 100644
--- a/src/corelib/tools/qstack.h
+++ b/src/corelib/tools/qstack.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QSTACK_H
#define QSTACK_H
diff --git a/src/corelib/tools/qtaggedpointer.h b/src/corelib/tools/qtaggedpointer.h
index f6ce85eebc..6c467d59f8 100644
--- a/src/corelib/tools/qtaggedpointer.h
+++ b/src/corelib/tools/qtaggedpointer.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QTAGGEDPOINTER_H
#define QTAGGEDPOINTER_H
@@ -48,7 +12,7 @@
QT_BEGIN_NAMESPACE
namespace QtPrivate {
- constexpr quint8 nextByteSize(quint8 bits) { return (bits + 7) / 8; }
+ constexpr quint8 nextByteSize(quint8 bits) { return quint8((bits + 7) / 8); }
template <typename T>
struct TagInfo
@@ -57,7 +21,7 @@ namespace QtPrivate {
static_assert((alignment & (alignment - 1)) == 0,
"Alignment of template parameter must be power of two");
- static constexpr quint8 tagBits = QtPrivate::qConstexprCountTrailingZeroBits(alignment);
+ static constexpr quint8 tagBits = quint8{QtPrivate::qConstexprCountTrailingZeroBits(alignment)};
static_assert(tagBits > 0,
"Alignment of template parameter does not allow any tags");
@@ -79,10 +43,10 @@ public:
static constexpr quintptr tagMask() { return QtPrivate::TagInfo<T>::alignment - 1; }
static constexpr quintptr pointerMask() { return ~tagMask(); }
- constexpr QTaggedPointer() noexcept : d(0) {}
- constexpr QTaggedPointer(std::nullptr_t) noexcept : QTaggedPointer() {}
+ Q_NODISCARD_CTOR constexpr QTaggedPointer() noexcept : d(0) {}
+ Q_NODISCARD_CTOR constexpr QTaggedPointer(std::nullptr_t) noexcept : QTaggedPointer() {}
- explicit QTaggedPointer(T *pointer, Tag tag = Tag()) noexcept
+ Q_NODISCARD_CTOR explicit QTaggedPointer(T *pointer, Tag tag = Tag()) noexcept
: d(quintptr(pointer) | quintptr(tag))
{
static_assert(sizeof(Type*) == sizeof(QTaggedPointer));
@@ -108,12 +72,31 @@ public:
return !isNull();
}
- QTaggedPointer &operator=(T *other) noexcept
+#ifdef Q_QDOC
+ QTaggedPointer &operator=(T *other) noexcept;
+#else
+ // Disables the usage of `ptr = {}`, which would go through this operator
+ // (rather than using the implicitly-generated assignment operator).
+ // The operators have different semantics: the ones here leave the tag intact,
+ // the implicitly-generated one overwrites it.
+ template <typename U,
+ std::enable_if_t<std::is_convertible_v<U *, T *>, bool> = false>
+ QTaggedPointer &operator=(U *other) noexcept
{
- d = reinterpret_cast<quintptr>(other) | (d & tagMask());
+ T *otherT = other;
+ d = reinterpret_cast<quintptr>(otherT) | (d & tagMask());
return *this;
}
+ template <typename U,
+ std::enable_if_t<std::is_null_pointer_v<U>, bool> = false>
+ QTaggedPointer &operator=(U) noexcept
+ {
+ d = reinterpret_cast<quintptr>(static_cast<T *>(nullptr)) | (d & tagMask());
+ return *this;
+ }
+#endif
+
static constexpr Tag maximumTag() noexcept
{
return TagType(typename QtPrivate::TagInfo<T>::TagType(tagMask()));
@@ -121,8 +104,10 @@ public:
void setTag(Tag tag)
{
- Q_ASSERT_X((static_cast<typename QtPrivate::TagInfo<T>::TagType>(tag) & pointerMask()) == 0,
- "QTaggedPointer<T, Tag>::setTag", "Tag is larger than allowed by number of available tag bits");
+ Q_ASSERT_X(
+ (static_cast<quintptr>(tag) & pointerMask()) == 0,
+ "QTaggedPointer<T, Tag>::setTag",
+ "Tag is larger than allowed by number of available tag bits");
d = (d & pointerMask()) | static_cast<quintptr>(tag);
}
@@ -144,7 +129,7 @@ public:
void swap(QTaggedPointer &other) noexcept
{
- qSwap(d, other.d);
+ std::swap(d, other.d);
}
friend inline bool operator==(QTaggedPointer lhs, QTaggedPointer rhs) noexcept
diff --git a/src/corelib/tools/qtaggedpointer.qdoc b/src/corelib/tools/qtaggedpointer.qdoc
index 36e20ecff0..f910e35b69 100644
--- a/src/corelib/tools/qtaggedpointer.qdoc
+++ b/src/corelib/tools/qtaggedpointer.qdoc
@@ -1,29 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
\class QTaggedPointer
@@ -211,7 +187,7 @@
*/
/*!
- \fn template <typename T, typename Tag> qHash(QTaggedPointer<T, Tag> key, std::size_t seed)
+ \fn template <typename T, typename Tag> qHash(QTaggedPointer<T, Tag> key, std::size_t seed = 0)
\relates QTaggedPointer
Returns the hash value for the \a key, using \a seed to seed the calculation.
diff --git a/src/corelib/tools/qtimeline.cpp b/src/corelib/tools/qtimeline.cpp
index 8a01dbe685..5512da867f 100644
--- a/src/corelib/tools/qtimeline.cpp
+++ b/src/corelib/tools/qtimeline.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qtimeline.h"
@@ -91,16 +55,16 @@ void QTimeLinePrivate::setCurrentTime(int msecs)
{
Q_Q(QTimeLine);
currentTime.removeBindingUnlessInWrapper();
- auto previousCurrentTime = currentTime.value();
+ const auto previousCurrentTime = currentTime.valueBypassingBindings();
- qreal lastValue = q->currentValue();
- int lastFrame = q->currentFrame();
+ const qreal lastValue = q->valueForTime(previousCurrentTime);
+ const int lastFrame = q->frameForTime(previousCurrentTime);
// Determine if we are looping.
- int elapsed = (direction == QTimeLine::Backward) ? (-msecs + duration) : msecs;
- int loopCountNow = elapsed / duration;
+ const int elapsed = (direction == QTimeLine::Backward) ? (-msecs + duration) : msecs;
+ const int loopCountNow = elapsed / duration;
- bool looping = (loopCountNow != currentLoopCount);
+ const bool looping = (loopCountNow != currentLoopCount);
#ifdef QTIMELINE_DEBUG
qDebug() << "QTimeLinePrivate::setCurrentTime:" << msecs << duration << "with loopCountNow"
<< loopCountNow << "currentLoopCount" << currentLoopCount << "looping" << looping;
@@ -111,7 +75,7 @@ void QTimeLinePrivate::setCurrentTime(int msecs)
// Normalize msecs to be between 0 and duration, inclusive.
currentTime.setValueBypassingBindings(elapsed % duration);
if (direction.value() == QTimeLine::Backward)
- currentTime.setValueBypassingBindings(duration - currentTime);
+ currentTime.setValueBypassingBindings(duration - currentTime.valueBypassingBindings());
// Check if we have reached the end of loopcount.
bool finished = false;
@@ -121,12 +85,14 @@ void QTimeLinePrivate::setCurrentTime(int msecs)
currentLoopCount = loopCount - 1;
}
- int currentFrame = q->frameForTime(currentTime);
+ const int currentFrame = q->frameForTime(currentTime.valueBypassingBindings());
#ifdef QTIMELINE_DEBUG
- qDebug() << "QTimeLinePrivate::setCurrentTime: frameForTime" << currentTime << currentFrame;
+ qDebug() << "QTimeLinePrivate::setCurrentTime: frameForTime"
+ << currentTime.valueBypassingBindings() << currentFrame;
#endif
- if (!qFuzzyCompare(lastValue, q->currentValue()))
- emit q->valueChanged(q->currentValue(), QTimeLine::QPrivateSignal());
+ const qreal currentValue = q->valueForTime(currentTime.valueBypassingBindings());
+ if (!qFuzzyCompare(lastValue, currentValue))
+ emit q->valueChanged(currentValue, QTimeLine::QPrivateSignal());
if (lastFrame != currentFrame) {
const int transitionframe = (direction == QTimeLine::Forward ? endFrame : startFrame);
if (looping && !finished && transitionframe != currentFrame) {
@@ -159,7 +125,7 @@ void QTimeLinePrivate::setCurrentTime(int msecs)
q->stop();
emit q->finished(QTimeLine::QPrivateSignal());
}
- if (currentTime.value() != previousCurrentTime)
+ if (currentTime.valueBypassingBindings() != previousCurrentTime)
currentTime.notify();
}
QBindable<int> QTimeLine::bindableCurrentTime()
@@ -326,7 +292,7 @@ QTimeLine::State QTimeLine::state() const
\property QTimeLine::loopCount
\brief the number of times the timeline should loop before it's finished.
- A loop count of of 0 means that the timeline will loop forever.
+ A loop count of 0 means that the timeline will loop forever.
By default, this property contains a value of 1.
*/
@@ -370,11 +336,12 @@ QTimeLine::Direction QTimeLine::direction() const
void QTimeLine::setDirection(Direction direction)
{
Q_D(QTimeLine);
- auto previousDirection = d->direction.value();
- d->direction.setValue(direction);
+ d->direction.removeBindingUnlessInWrapper();
+ const auto previousDirection = d->direction.valueBypassingBindings();
+ d->direction.setValueBypassingBindings(direction);
d->startTime = d->currentTime;
d->timer.start();
- if (previousDirection != d->direction.value())
+ if (previousDirection != d->direction.valueBypassingBindings())
d->direction.notify();
}
@@ -408,12 +375,11 @@ void QTimeLine::setDuration(int duration)
qWarning("QTimeLine::setDuration: cannot set duration <= 0");
return;
}
- if (duration == d->duration) {
- d->duration.removeBindingUnlessInWrapper();
- return;
+ d->duration.removeBindingUnlessInWrapper();
+ if (duration != d->duration.valueBypassingBindings()) {
+ d->duration.setValueBypassingBindings(duration);
+ d->duration.notify();
}
- d->duration.setValue(duration);
- d->duration.notify();
}
QBindable<int> QTimeLine::bindableDuration()
diff --git a/src/corelib/tools/qtimeline.h b/src/corelib/tools/qtimeline.h
index 464c4a8836..4bdcceaebd 100644
--- a/src/corelib/tools/qtimeline.h
+++ b/src/corelib/tools/qtimeline.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QTIMELINE_H
#define QTIMELINE_H
diff --git a/src/corelib/tools/qtools_p.h b/src/corelib/tools/qtools_p.h
index 8854ae8c48..105aa40c02 100644
--- a/src/corelib/tools/qtools_p.h
+++ b/src/corelib/tools/qtools_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2019 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2019 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QTOOLS_P_H
#define QTOOLS_P_H
@@ -52,22 +16,32 @@
//
#include "QtCore/private/qglobal_p.h"
+
+#include <chrono>
#include <limits.h>
+#include <time.h>
QT_BEGIN_NAMESPACE
namespace QtMiscUtils {
-constexpr inline char toHexUpper(uint value) noexcept
+constexpr inline char toHexUpper(char32_t value) noexcept
{
return "0123456789ABCDEF"[value & 0xF];
}
-constexpr inline char toHexLower(uint value) noexcept
+constexpr inline char toHexLower(char32_t value) noexcept
{
return "0123456789abcdef"[value & 0xF];
}
-constexpr inline int fromHex(uint c) noexcept
+[[nodiscard]] constexpr inline bool isHexDigit(char32_t c) noexcept
+{
+ return (c >= '0' && c <= '9')
+ || (c >= 'A' && c <= 'F')
+ || (c >= 'a' && c <= 'f');
+}
+
+constexpr inline int fromHex(char32_t c) noexcept
{
return ((c >= '0') && (c <= '9')) ? int(c - '0') :
((c >= 'A') && (c <= 'F')) ? int(c - 'A' + 10) :
@@ -75,19 +49,71 @@ constexpr inline int fromHex(uint c) noexcept
/* otherwise */ -1;
}
-constexpr inline char toOct(uint value) noexcept
+constexpr inline char toOct(char32_t value) noexcept
{
return char('0' + (value & 0x7));
}
-constexpr inline int fromOct(uint c) noexcept
+[[nodiscard]] constexpr inline bool isOctalDigit(char32_t c) noexcept
{
- return ((c >= '0') && (c <= '7')) ? int(c - '0') : -1;
+ return c >= '0' && c <= '7';
}
+
+constexpr inline int fromOct(char32_t c) noexcept
+{
+ return isOctalDigit(c) ? int(c - '0') : -1;
+}
+
+[[nodiscard]] constexpr inline bool isAsciiDigit(char32_t c) noexcept
+{
+ return c >= '0' && c <= '9';
+}
+
+constexpr inline bool isAsciiUpper(char32_t c) noexcept
+{
+ return c >= 'A' && c <= 'Z';
+}
+
+constexpr inline bool isAsciiLower(char32_t c) noexcept
+{
+ return c >= 'a' && c <= 'z';
+}
+
+constexpr inline bool isAsciiLetterOrNumber(char32_t c) noexcept
+{
+ return isAsciiDigit(c) || isAsciiLower(c) || isAsciiUpper(c);
+}
+
+constexpr inline char toAsciiLower(char ch) noexcept
+{
+ return isAsciiUpper(ch) ? ch - 'A' + 'a' : ch;
+}
+
+constexpr inline char toAsciiUpper(char ch) noexcept
+{
+ return isAsciiLower(ch) ? ch - 'a' + 'A' : ch;
+}
+
+constexpr inline int caseCompareAscii(char lhs, char rhs) noexcept
+{
+ const char lhsLower = QtMiscUtils::toAsciiLower(lhs);
+ const char rhsLower = QtMiscUtils::toAsciiLower(rhs);
+ return int(uchar(lhsLower)) - int(uchar(rhsLower));
+}
+
+constexpr inline int isAsciiPrintable(char32_t ch) noexcept
+{
+ return ch >= ' ' && ch < 0x7f;
+}
+
+constexpr inline int qt_lencmp(qsizetype lhs, qsizetype rhs) noexcept
+{
+ return lhs == rhs ? 0 :
+ lhs > rhs ? 1 :
+ /* else */ -1 ;
}
-// We typically need an extra bit for qNextPowerOfTwo when determining the next allocation size.
-constexpr qsizetype MaxAllocSize = (std::numeric_limits<qsizetype>::max)();
+} // namespace QtMiscUtils
struct CalculateGrowingBlockSizeResult
{
diff --git a/src/corelib/tools/qtyperevision.cpp b/src/corelib/tools/qtyperevision.cpp
new file mode 100644
index 0000000000..6426236288
--- /dev/null
+++ b/src/corelib/tools/qtyperevision.cpp
@@ -0,0 +1,217 @@
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#include <QtCore/qtyperevision.h>
+#include <QtCore/qhashfunctions.h>
+
+#ifndef QT_NO_DATASTREAM
+# include <QtCore/qdatastream.h>
+#endif
+
+#ifndef QT_NO_DEBUG_STREAM
+# include <QtCore/qdebug.h>
+#endif
+
+#include <algorithm>
+#include <limits>
+
+QT_BEGIN_NAMESPACE
+
+QT_IMPL_METATYPE_EXTERN(QTypeRevision)
+
+/*!
+ \class QTypeRevision
+ \inmodule QtCore
+ \since 6.0
+ \brief The QTypeRevision class contains a lightweight representation of
+ a version number with two 8-bit segments, major and minor, either
+ of which can be unknown.
+ \compares strong
+
+ Use this class to describe revisions of a type. Compatible revisions can be
+ expressed as increments of the minor version. Breaking changes can be
+ expressed as increments of the major version. The return values of
+ \l QMetaMethod::revision() and \l QMetaProperty::revision() can be passed to
+ \l QTypeRevision::fromEncodedVersion(). The resulting major and minor versions
+ specify in which Qt versions the properties and methods were added.
+
+ \sa QMetaMethod::revision(), QMetaProperty::revision()
+*/
+
+/*!
+ \fn template<typename Integer, QTypeRevision::if_valid_segment_type<Integer> = true> static bool QTypeRevision::isValidSegment(Integer segment)
+
+ Returns true if the given number can be used as either major or minor
+ version in a QTypeRevision. The valid range for \a segment is \c {>= 0} and \c {< 255}.
+*/
+
+/*!
+ \fn QTypeRevision::QTypeRevision()
+
+ Produces an invalid revision.
+
+ \sa isValid()
+*/
+
+/*!
+ \fn template<typename Major, typename Minor, QTypeRevision::if_valid_segment_type<Major> = true, QTypeRevision::if_valid_segment_type<Minor> = true> static QTypeRevision QTypeRevision::fromVersion(Major majorVersion, Minor minorVersion)
+
+ Produces a QTypeRevision from the given \a majorVersion and \a minorVersion,
+ both of which need to be a valid segments.
+
+ \sa isValidSegment()
+*/
+
+/*!
+ \fn template<typename Major, QTypeRevision::if_valid_segment_type<Major> = true> static QTypeRevision QTypeRevision::fromMajorVersion(Major majorVersion)
+
+ Produces a QTypeRevision from the given \a majorVersion with an invalid minor
+ version. \a majorVersion needs to be a valid segment.
+
+ \sa isValidSegment()
+*/
+
+/*!
+ \fn template<typename Minor, QTypeRevision::if_valid_segment_type<Minor> = true> static QTypeRevision QTypeRevision::fromMinorVersion(Minor minorVersion)
+
+ Produces a QTypeRevision from the given \a minorVersion with an invalid major
+ version. \a minorVersion needs to be a valid segment.
+
+ \sa isValidSegment()
+*/
+
+/*!
+ \fn template<typename Integer, QTypeRevision::if_valid_value_type<Integer> = true> static QTypeRevision QTypeRevision::fromEncodedVersion(Integer value)
+
+ Produces a QTypeRevision from the given \a value. \a value encodes both the
+ minor and major versions in the least significant and second least
+ significant byte, respectively.
+
+ \a value must not have any bits outside the least significant two bytes set.
+ \c Integer needs to be at least 16 bits wide, and must not have a sign bit
+ in the least significant 16 bits.
+
+ \sa toEncodedVersion()
+*/
+
+/*!
+ \fn static QTypeRevision QTypeRevision::zero()
+
+ Produces a QTypeRevision with major and minor version \c{0}.
+*/
+
+/*!
+ \fn bool QTypeRevision::hasMajorVersion() const
+
+ Returns true if the major version is known, otherwise false.
+
+ \sa majorVersion(), hasMinorVersion()
+*/
+
+/*!
+ \fn quint8 QTypeRevision::majorVersion() const
+
+ Returns the major version encoded in the revision.
+
+ \sa hasMajorVersion(), minorVersion()
+*/
+
+/*!
+ \fn bool QTypeRevision::hasMinorVersion() const
+
+ Returns true if the minor version is known, otherwise false.
+
+ \sa minorVersion(), hasMajorVersion()
+*/
+
+/*!
+ \fn quint8 QTypeRevision::minorVersion() const
+
+ Returns the minor version encoded in the revision.
+
+ \sa hasMinorVersion(), majorVersion()
+*/
+
+/*!
+ \fn bool QTypeRevision::isValid() const
+
+ Returns true if the major version or the minor version is known,
+ otherwise false.
+
+ \sa hasMajorVersion(), hasMinorVersion()
+*/
+
+/*!
+ \fn template<typename Integer, QTypeRevision::if_valid_value_type<Integer> = true> Integer QTypeRevision::toEncodedVersion() const
+
+ Transforms the revision into an integer value, encoding the minor
+ version into the least significant byte, and the major version into
+ the second least significant byte.
+
+ \c Integer needs to be at least 16 bits wide, and must not have a sign bit
+ in the least significant 16 bits.
+
+ \sa fromEncodedVersion()
+*/
+
+#ifndef QT_NO_DATASTREAM
+/*!
+ \fn QDataStream& operator<<(QDataStream &out, const QTypeRevision &revision)
+ \relates QTypeRevision
+ \since 6.0
+
+ Writes the revision \a revision to stream \a out.
+ */
+QDataStream &operator<<(QDataStream &out, const QTypeRevision &revision)
+{
+ return out << revision.toEncodedVersion<quint16>();
+}
+
+/*!
+ \fn QDataStream& operator>>(QDataStream &in, QTypeRevision &revision)
+ \relates QTypeRevision
+ \since 6.0
+
+ Reads a revision from stream \a in and stores it in \a revision.
+ */
+QDataStream &operator>>(QDataStream &in, QTypeRevision &revision)
+{
+ quint16 value;
+ in >> value;
+ revision = QTypeRevision::fromEncodedVersion(value);
+ return in;
+}
+#endif
+
+#ifndef QT_NO_DEBUG_STREAM
+QDebug operator<<(QDebug debug, const QTypeRevision &revision)
+{
+ QDebugStateSaver saver(debug);
+ if (revision.hasMajorVersion()) {
+ if (revision.hasMinorVersion())
+ debug.nospace() << revision.majorVersion() << '.' << revision.minorVersion();
+ else
+ debug.nospace().noquote() << revision.majorVersion() << ".x";
+ } else {
+ if (revision.hasMinorVersion())
+ debug << revision.minorVersion();
+ else
+ debug.noquote() << "invalid";
+ }
+ return debug;
+}
+#endif
+
+/*!
+ \relates QHash
+ \since 6.0
+
+ Returns the hash value for the \a key, using \a seed to seed the
+ calculation.
+*/
+size_t qHash(const QTypeRevision &key, size_t seed)
+{
+ return qHash(key.toEncodedVersion<quint16>(), seed);
+}
+
+QT_END_NAMESPACE
diff --git a/src/corelib/tools/qtyperevision.h b/src/corelib/tools/qtyperevision.h
new file mode 100644
index 0000000000..8f255a77e8
--- /dev/null
+++ b/src/corelib/tools/qtyperevision.h
@@ -0,0 +1,167 @@
+// Copyright (C) 2020 The Qt Company Ltd.
+// Copyright (C) 2022 Intel Corporation.
+// Copyright (C) 2015 Keith Gardner <kreios4004@gmail.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QTYPEREVISION_H
+#define QTYPEREVISION_H
+
+#include <QtCore/qassert.h>
+#include <QtCore/qcompare.h>
+#include <QtCore/qcontainertools_impl.h>
+#include <QtCore/qmetatype.h>
+#include <QtCore/qtypeinfo.h>
+
+#include <limits>
+
+QT_BEGIN_NAMESPACE
+
+class QDataStream;
+class QDebug;
+
+class QTypeRevision;
+Q_CORE_EXPORT size_t qHash(const QTypeRevision &key, size_t seed = 0);
+
+#ifndef QT_NO_DATASTREAM
+Q_CORE_EXPORT QDataStream& operator<<(QDataStream &out, const QTypeRevision &revision);
+Q_CORE_EXPORT QDataStream& operator>>(QDataStream &in, QTypeRevision &revision);
+#endif
+
+class QTypeRevision
+{
+public:
+ template<typename Integer>
+ using if_valid_segment_type = typename std::enable_if<
+ std::is_integral<Integer>::value, bool>::type;
+
+ template<typename Integer>
+ using if_valid_value_type = typename std::enable_if<
+ std::is_integral<Integer>::value
+ && (sizeof(Integer) > sizeof(quint16)
+ || (sizeof(Integer) == sizeof(quint16)
+ && !std::is_signed<Integer>::value)), bool>::type;
+
+ template<typename Integer, if_valid_segment_type<Integer> = true>
+ static constexpr bool isValidSegment(Integer segment)
+ {
+ // using extra parentheses around max to avoid expanding it if it is a macro
+ return segment >= Integer(0)
+ && ((std::numeric_limits<Integer>::max)() < Integer(SegmentUnknown)
+ || segment < Integer(SegmentUnknown));
+ }
+
+ template<typename Major, typename Minor,
+ if_valid_segment_type<Major> = true,
+ if_valid_segment_type<Minor> = true>
+ static constexpr QTypeRevision fromVersion(Major majorVersion, Minor minorVersion)
+ {
+ return Q_ASSERT(isValidSegment(majorVersion)),
+ Q_ASSERT(isValidSegment(minorVersion)),
+ QTypeRevision(quint8(majorVersion), quint8(minorVersion));
+ }
+
+ template<typename Major, if_valid_segment_type<Major> = true>
+ static constexpr QTypeRevision fromMajorVersion(Major majorVersion)
+ {
+ return Q_ASSERT(isValidSegment(majorVersion)),
+ QTypeRevision(quint8(majorVersion), SegmentUnknown);
+ }
+
+ template<typename Minor, if_valid_segment_type<Minor> = true>
+ static constexpr QTypeRevision fromMinorVersion(Minor minorVersion)
+ {
+ return Q_ASSERT(isValidSegment(minorVersion)),
+ QTypeRevision(SegmentUnknown, quint8(minorVersion));
+ }
+
+ template<typename Integer, if_valid_value_type<Integer> = true>
+ static constexpr QTypeRevision fromEncodedVersion(Integer value)
+ {
+ return Q_ASSERT((value & ~Integer(0xffff)) == Integer(0)),
+ QTypeRevision((value & Integer(0xff00)) >> 8, value & Integer(0xff));
+ }
+
+ static constexpr QTypeRevision zero() { return QTypeRevision(0, 0); }
+
+ constexpr QTypeRevision() = default;
+
+ constexpr bool hasMajorVersion() const { return m_majorVersion != SegmentUnknown; }
+ constexpr quint8 majorVersion() const { return m_majorVersion; }
+
+ constexpr bool hasMinorVersion() const { return m_minorVersion != SegmentUnknown; }
+ constexpr quint8 minorVersion() const { return m_minorVersion; }
+
+ constexpr bool isValid() const { return hasMajorVersion() || hasMinorVersion(); }
+
+ template<typename Integer, if_valid_value_type<Integer> = true>
+ constexpr Integer toEncodedVersion() const
+ {
+ return Integer(m_majorVersion << 8) | Integer(m_minorVersion);
+ }
+
+private:
+ friend constexpr bool
+ comparesEqual(const QTypeRevision &lhs, const QTypeRevision &rhs) noexcept
+ { return lhs.toEncodedVersion<quint16>() == rhs.toEncodedVersion<quint16>(); }
+ friend constexpr Qt::strong_ordering
+ compareThreeWay(const QTypeRevision &lhs, const QTypeRevision &rhs) noexcept
+ {
+ // For both major and minor the following rule applies:
+ // non-0 ver > unspecified ver > 0 ver
+ auto cmpUnspecified = [](quint8 leftVer, quint8 rightVer) {
+ Q_ASSERT(leftVer != rightVer
+ && (leftVer == QTypeRevision::SegmentUnknown
+ || rightVer == QTypeRevision::SegmentUnknown));
+ if (leftVer != QTypeRevision::SegmentUnknown)
+ return leftVer > 0 ? Qt::strong_ordering::greater : Qt::strong_ordering::less;
+ return rightVer > 0 ? Qt::strong_ordering::less : Qt::strong_ordering::greater;
+ };
+
+ if (lhs.hasMajorVersion() != rhs.hasMajorVersion()) {
+ return cmpUnspecified(lhs.majorVersion(), rhs.majorVersion());
+ } else {
+ const auto majorRes = Qt::compareThreeWay(lhs.majorVersion(), rhs.majorVersion());
+ if (is_eq(majorRes)) {
+ if (lhs.hasMinorVersion() != rhs.hasMinorVersion())
+ return cmpUnspecified(lhs.minorVersion(), rhs.minorVersion());
+ return Qt::compareThreeWay(lhs.minorVersion(), rhs.minorVersion());
+ }
+ return majorRes;
+ }
+ }
+ Q_DECLARE_STRONGLY_ORDERED_LITERAL_TYPE(QTypeRevision)
+
+ enum { SegmentUnknown = 0xff };
+
+#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN
+ constexpr QTypeRevision(quint8 major, quint8 minor)
+ : m_minorVersion(minor), m_majorVersion(major) {}
+
+ quint8 m_minorVersion = SegmentUnknown;
+ quint8 m_majorVersion = SegmentUnknown;
+#else
+ constexpr QTypeRevision(quint8 major, quint8 minor)
+ : m_majorVersion(major), m_minorVersion(minor) {}
+
+ quint8 m_majorVersion = SegmentUnknown;
+ quint8 m_minorVersion = SegmentUnknown;
+#endif
+};
+
+static_assert(sizeof(QTypeRevision) == 2);
+Q_DECLARE_TYPEINFO(QTypeRevision, Q_RELOCATABLE_TYPE);
+
+#ifndef QT_NO_DEBUG_STREAM
+Q_CORE_EXPORT QDebug operator<<(QDebug, const QTypeRevision &revision);
+#endif
+
+QT_END_NAMESPACE
+
+QT_DECL_METATYPE_EXTERN(QTypeRevision, Q_CORE_EXPORT)
+
+#endif // QTYPEREVISION_H
+
+#if !defined(QT_LEAN_HEADERS) || QT_LEAN_HEADERS < 2
+// make QVersionNumber available from <QTypeRevision>
+#include <QtCore/qversionnumber.h>
+#endif
diff --git a/src/corelib/tools/quniquehandle_p.h b/src/corelib/tools/quniquehandle_p.h
new file mode 100644
index 0000000000..7af1536c2e
--- /dev/null
+++ b/src/corelib/tools/quniquehandle_p.h
@@ -0,0 +1,225 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QUNIQUEHANDLE_P_H
+#define QUNIQUEHANDLE_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QtCore/qtconfigmacros.h>
+#include <QtCore/qassert.h>
+
+#include <memory>
+
+QT_BEGIN_NAMESPACE
+
+/*! \internal QUniqueHandle is a general purpose RAII wrapper intended
+ for interfacing with resource-allocating C-style APIs, for example
+ operating system APIs, database engine APIs, or any other scenario
+ where resources are allocated and released, and where pointer
+ semantics does not seem a perfect fit.
+
+ QUniqueHandle does not support copying, because it is intended to
+ maintain ownership of resources that can not be copied. This makes
+ it safer to use than naked handle types, since ownership is
+ maintained by design.
+
+ The underlying handle object is described using a client supplied
+ HandleTraits object that is implemented per resource type. The
+ traits struct must describe two properties of a handle:
+
+ 1) What value is considered invalid
+ 2) How to close a resource.
+
+ Example 1:
+
+ struct InvalidHandleTraits {
+ using Type = HANDLE;
+
+ static Type invalidValue() {
+ return INVALID_HANDLE_VALUE;
+ }
+
+ static bool close(Type handle) {
+ return CloseHandle(handle) != 0;
+ }
+ }
+
+ using FileHandle = QUniqueHandle<InvalidHandleTraits>;
+
+ Usage:
+
+ // Takes ownership of returned handle.
+ FileHandle handle{ CreateFile(...) };
+
+ if (!handle.isValid()) {
+ qDebug() << GetLastError()
+ return;
+ }
+
+ ...
+
+ Example 2:
+
+ struct SqLiteTraits {
+ using Type = sqlite3*;
+
+ static Type invalidValue() {
+ return nullptr;
+ }
+
+ static bool close(Type handle) {
+ sqlite3_close(handle);
+ return true;
+ }
+ }
+
+ using DbHandle = QUniqueHandle<SqLiteTraits>;
+
+ Usage:
+
+ DbHandle h;
+
+ // Take ownership of returned handle.
+ int result = sqlite3_open(":memory:", &h);
+
+ ...
+
+ NOTE: The QUniqueHandle assumes that closing a resource is
+ guaranteed to succeed, and provides no support for handling failure
+ to close a resource. It is therefore only recommended for use cases
+ where failure to close a resource is either not an error, or an
+ unrecoverable error.
+*/
+
+// clang-format off
+
+template <typename HandleTraits>
+class QUniqueHandle
+{
+public:
+ using Type = typename HandleTraits::Type;
+
+ QUniqueHandle() = default;
+
+ explicit QUniqueHandle(const Type &handle) noexcept
+ : m_handle{ handle }
+ {}
+
+ QUniqueHandle(QUniqueHandle &&other) noexcept
+ : m_handle{ other.release() }
+ {}
+
+ ~QUniqueHandle() noexcept
+ {
+ close();
+ }
+
+ QUniqueHandle& operator=(QUniqueHandle &&rhs) noexcept
+ {
+ if (this != std::addressof(rhs))
+ reset(rhs.release());
+
+ return *this;
+ }
+
+ QUniqueHandle(const QUniqueHandle &) = delete;
+ QUniqueHandle &operator=(const QUniqueHandle &) = delete;
+
+
+ [[nodiscard]] bool isValid() const noexcept
+ {
+ return m_handle != HandleTraits::invalidValue();
+ }
+
+ [[nodiscard]] explicit operator bool() const noexcept
+ {
+ return isValid();
+ }
+
+ [[nodiscard]] Type get() const noexcept
+ {
+ return m_handle;
+ }
+
+ void reset(const Type& handle) noexcept
+ {
+ if (handle == m_handle)
+ return;
+
+ close();
+ m_handle = handle;
+ }
+
+ [[nodiscard]] Type release() noexcept
+ {
+ Type handle = m_handle;
+ m_handle = HandleTraits::invalidValue();
+ return handle;
+ }
+
+ [[nodiscard]] Type *operator&() noexcept // NOLINT(google-runtime-operator)
+ {
+ Q_ASSERT(!isValid());
+ return &m_handle;
+ }
+
+ void close() noexcept
+ {
+ if (!isValid())
+ return;
+
+ const bool success = HandleTraits::close(m_handle);
+ Q_ASSERT(success);
+
+ m_handle = HandleTraits::invalidValue();
+ }
+
+ [[nodiscard]] friend bool operator==(const QUniqueHandle &lhs, const QUniqueHandle &rhs) noexcept
+ {
+ return lhs.get() == rhs.get();
+ }
+
+ [[nodiscard]] friend bool operator!=(const QUniqueHandle &lhs, const QUniqueHandle &rhs) noexcept
+ {
+ return lhs.get() != rhs.get();
+ }
+
+ [[nodiscard]] friend bool operator<(const QUniqueHandle &lhs, const QUniqueHandle &rhs) noexcept
+ {
+ return lhs.get() < rhs.get();
+ }
+
+ [[nodiscard]] friend bool operator<=(const QUniqueHandle &lhs, const QUniqueHandle &rhs) noexcept
+ {
+ return lhs.get() <= rhs.get();
+ }
+
+ [[nodiscard]] friend bool operator>(const QUniqueHandle &lhs, const QUniqueHandle &rhs) noexcept
+ {
+ return lhs.get() > rhs.get();
+ }
+
+ [[nodiscard]] friend bool operator>=(const QUniqueHandle &lhs, const QUniqueHandle &rhs) noexcept
+ {
+ return lhs.get() >= rhs.get();
+ }
+
+private:
+ Type m_handle{ HandleTraits::invalidValue() };
+};
+
+// clang-format on
+
+QT_END_NAMESPACE
+
+#endif
diff --git a/src/corelib/tools/qvarlengtharray.h b/src/corelib/tools/qvarlengtharray.h
index 2a86a1dd7f..afc345d3be 100644
--- a/src/corelib/tools/qvarlengtharray.h
+++ b/src/corelib/tools/qvarlengtharray.h
@@ -1,45 +1,14 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QVARLENGTHARRAY_H
#define QVARLENGTHARRAY_H
+#if 0
+#pragma qt_class(QVarLengthArray)
+#pragma qt_sync_stop_processing
+#endif
+
#include <QtCore/qcontainerfwd.h>
#include <QtCore/qglobal.h>
#include <QtCore/qalgorithms.h>
@@ -49,36 +18,305 @@
#include <algorithm>
#include <initializer_list>
#include <iterator>
+#include <QtCore/q20memory.h>
#include <new>
+
#include <string.h>
#include <stdlib.h>
QT_BEGIN_NAMESPACE
+template <size_t Size, size_t Align, qsizetype Prealloc>
+class QVLAStorage
+{
+ template <size_t> class print;
+protected:
+ ~QVLAStorage() = default;
+
+ alignas(Align) char array[Prealloc * (Align > Size ? Align : Size)];
+ QT_WARNING_PUSH
+ QT_WARNING_DISABLE_DEPRECATED
+ // ensure we maintain BC: std::aligned_storage_t was only specified by a
+ // minimum size, but for BC we need the substitution to be exact in size:
+ static_assert(std::is_same_v<print<sizeof(std::aligned_storage_t<Size, Align>[Prealloc])>,
+ print<sizeof(array)>>);
+ QT_WARNING_POP
+};
-// Prealloc = 256 by default, specified in qcontainerfwd.h
-template<class T, qsizetype Prealloc>
-class QVarLengthArray
+class QVLABaseBase
{
- static_assert(std::is_nothrow_destructible_v<T>, "Types with throwing destructors are not supported in Qt containers.");
+protected:
+ ~QVLABaseBase() = default;
+
+ qsizetype a; // capacity
+ qsizetype s; // size
+ void *ptr; // data
- Q_ALWAYS_INLINE void verify(qsizetype pos = 0, qsizetype n = 1) const
+ Q_ALWAYS_INLINE constexpr void verify([[maybe_unused]] qsizetype pos = 0,
+ [[maybe_unused]] qsizetype n = 1) const
{
- // verify that [data() + pos, data() + pos + n[ is a valid range
Q_ASSERT(pos >= 0);
Q_ASSERT(pos <= size());
Q_ASSERT(n >= 0);
Q_ASSERT(n <= size() - pos);
}
+ struct free_deleter {
+ void operator()(void *p) const noexcept { free(p); }
+ };
+ using malloced_ptr = std::unique_ptr<void, free_deleter>;
+
+public:
+ using size_type = qsizetype;
+
+ constexpr size_type capacity() const noexcept { return a; }
+ constexpr size_type size() const noexcept { return s; }
+ constexpr bool empty() const noexcept { return size() == 0; }
+};
+
+template<class T>
+class QVLABase : public QVLABaseBase
+{
+protected:
+ ~QVLABase() = default;
+
+public:
+ T *data() noexcept { return static_cast<T *>(ptr); }
+ const T *data() const noexcept { return static_cast<T *>(ptr); }
+
+ using iterator = T*;
+ using const_iterator = const T*;
+
+ iterator begin() noexcept { return data(); }
+ const_iterator begin() const noexcept { return data(); }
+ const_iterator cbegin() const noexcept { return begin(); }
+ iterator end() noexcept { return data() + size(); }
+ const_iterator end() const noexcept { return data() + size(); }
+ const_iterator cend() const noexcept { return end(); }
+
+ using reverse_iterator = std::reverse_iterator<iterator>;
+ using const_reverse_iterator = std::reverse_iterator<const_iterator>;
+
+ reverse_iterator rbegin() noexcept { return reverse_iterator{end()}; }
+ const_reverse_iterator rbegin() const noexcept { return const_reverse_iterator{end()}; }
+ const_reverse_iterator crbegin() const noexcept { return rbegin(); }
+ reverse_iterator rend() noexcept { return reverse_iterator{begin()}; }
+ const_reverse_iterator rend() const noexcept { return const_reverse_iterator{begin()}; }
+ const_reverse_iterator crend() const noexcept { return rend(); }
+
+ using value_type = T;
+ using reference = value_type&;
+ using const_reference = const value_type&;
+ using pointer = value_type*;
+ using const_pointer = const value_type*;
+ using difference_type = qptrdiff;
+
+ reference front()
+ {
+ verify();
+ return *begin();
+ }
+
+ const_reference front() const
+ {
+ verify();
+ return *begin();
+ }
+
+ reference back()
+ {
+ verify();
+ return *rbegin();
+ }
+
+ const_reference back() const
+ {
+ verify();
+ return *rbegin();
+ }
+
+ void pop_back()
+ {
+ verify();
+ if constexpr (QTypeInfo<T>::isComplex)
+ data()[size() - 1].~T();
+ --s;
+ }
+
+ template <typename AT = T>
+ qsizetype indexOf(const AT &t, qsizetype from = 0) const;
+ template <typename AT = T>
+ qsizetype lastIndexOf(const AT &t, qsizetype from = -1) const;
+ template <typename AT = T>
+ bool contains(const AT &t) const;
+
+ reference operator[](qsizetype idx)
+ {
+ verify(idx);
+ return data()[idx];
+ }
+ const_reference operator[](qsizetype idx) const
+ {
+ verify(idx);
+ return data()[idx];
+ }
+
+ value_type value(qsizetype i) const;
+ value_type value(qsizetype i, const T& defaultValue) const;
+
+ void replace(qsizetype i, const T &t);
+ void remove(qsizetype i, qsizetype n = 1);
+ template <typename AT = T>
+ qsizetype removeAll(const AT &t);
+ template <typename AT = T>
+ bool removeOne(const AT &t);
+ template <typename Predicate>
+ qsizetype removeIf(Predicate pred);
+
+ void clear()
+ {
+ if constexpr (QTypeInfo<T>::isComplex)
+ std::destroy_n(data(), size());
+ s = 0;
+ }
+
+ iterator erase(const_iterator begin, const_iterator end);
+ iterator erase(const_iterator pos) { return erase(pos, pos + 1); }
+
+ static constexpr qsizetype max_size() noexcept
+ {
+ // -1 to deal with the pointer one-past-the-end
+ return (QtPrivate::MaxAllocSize / sizeof(T)) - 1;
+ }
+
+ size_t hash(size_t seed) const noexcept(QtPrivate::QNothrowHashable_v<T>)
+ {
+ return qHashRange(begin(), end(), seed);
+ }
+protected:
+ void growBy(qsizetype prealloc, void *array, qsizetype increment)
+ { reallocate_impl(prealloc, array, size(), (std::max)(size() * 2, size() + increment)); }
+ template <typename...Args>
+ reference emplace_back_impl(qsizetype prealloc, void *array, Args&&...args)
+ {
+ if (size() == capacity()) // ie. size() != 0
+ growBy(prealloc, array, 1);
+ reference r = *q20::construct_at(end(), std::forward<Args>(args)...);
+ ++s;
+ return r;
+ }
+ template <typename...Args>
+ iterator emplace_impl(qsizetype prealloc, void *array, const_iterator pos, Args&&...arg);
+
+ iterator insert_impl(qsizetype prealloc, void *array, const_iterator pos, qsizetype n, const T &t);
+
+ template <typename S>
+ bool equal(const QVLABase<S> &other) const
+ {
+ return std::equal(begin(), end(), other.begin(), other.end());
+ }
+ template <typename S>
+ bool less_than(const QVLABase<S> &other) const
+ {
+ return std::lexicographical_compare(begin(), end(), other.begin(), other.end());
+ }
+
+ void append_impl(qsizetype prealloc, void *array, const T *buf, qsizetype n);
+ void reallocate_impl(qsizetype prealloc, void *array, qsizetype size, qsizetype alloc);
+ void resize_impl(qsizetype prealloc, void *array, qsizetype sz, const T &v)
+ {
+ if (QtPrivate::q_points_into_range(&v, begin(), end())) {
+ resize_impl(prealloc, array, sz, T(v));
+ return;
+ }
+ reallocate_impl(prealloc, array, sz, qMax(sz, capacity()));
+ while (size() < sz) {
+ q20::construct_at(data() + size(), v);
+ ++s;
+ }
+ }
+ void resize_impl(qsizetype prealloc, void *array, qsizetype sz)
+ {
+ reallocate_impl(prealloc, array, sz, qMax(sz, capacity()));
+ if constexpr (QTypeInfo<T>::isComplex) {
+ // call default constructor for new objects (which can throw)
+ while (size() < sz) {
+ q20::construct_at(data() + size());
+ ++s;
+ }
+ } else {
+ s = sz;
+ }
+ }
+
+ void assign_impl(qsizetype prealloc, void *array, qsizetype n, const T &t);
+ template <typename Iterator>
+ void assign_impl(qsizetype prealloc, void *array, Iterator first, Iterator last);
+
+ bool isValidIterator(const const_iterator &i) const
+ {
+ const std::less<const T *> less = {};
+ return !less(cend(), i) && !less(i, cbegin());
+ }
+};
+
+// Prealloc = 256 by default, specified in qcontainerfwd.h
+template<class T, qsizetype Prealloc>
+class QVarLengthArray
+#if QT_VERSION >= QT_VERSION_CHECK(7,0,0) || defined(QT_BOOTSTRAPPED)
+ : public QVLAStorage<sizeof(T), alignof(T), Prealloc>,
+ public QVLABase<T>
+#else
+ : public QVLABase<T>,
+ public QVLAStorage<sizeof(T), alignof(T), Prealloc>
+#endif
+{
+ template <class S, qsizetype Prealloc2>
+ friend class QVarLengthArray;
+ using Base = QVLABase<T>;
+ using Storage = QVLAStorage<sizeof(T), alignof(T), Prealloc>;
+ static_assert(Prealloc > 0, "QVarLengthArray Prealloc must be greater than 0.");
+ static_assert(std::is_nothrow_destructible_v<T>, "Types with throwing destructors are not supported in Qt containers.");
+ using Base::verify;
+
+ template <typename U>
+ using if_copyable = std::enable_if_t<std::is_copy_constructible_v<U>, bool>;
+ template <typename InputIterator>
+ using if_input_iterator = QtPrivate::IfIsInputIterator<InputIterator>;
public:
+ static constexpr qsizetype PreallocatedSize = Prealloc;
+
+ using size_type = typename Base::size_type;
+ using value_type = typename Base::value_type;
+ using pointer = typename Base::pointer;
+ using const_pointer = typename Base::const_pointer;
+ using reference = typename Base::reference;
+ using const_reference = typename Base::const_reference;
+ using difference_type = typename Base::difference_type;
+
+ using iterator = typename Base::iterator;
+ using const_iterator = typename Base::const_iterator;
+ using reverse_iterator = typename Base::reverse_iterator;
+ using const_reverse_iterator = typename Base::const_reverse_iterator;
+
QVarLengthArray() noexcept
- : a{Prealloc}, s{0}, ptr{reinterpret_cast<T *>(array)}
{
+ this->a = Prealloc;
+ this->s = 0;
+ this->ptr = this->array;
}
inline explicit QVarLengthArray(qsizetype size);
+#ifndef Q_QDOC
+ template <typename U = T, if_copyable<U> = true>
+#endif
+ explicit QVarLengthArray(qsizetype sz, const T &v)
+ : QVarLengthArray{}
+ {
+ resize(sz, v);
+ }
+
QVarLengthArray(const QVarLengthArray &other)
: QVarLengthArray{}
{
@@ -87,14 +325,12 @@ public:
QVarLengthArray(QVarLengthArray &&other)
noexcept(std::is_nothrow_move_constructible_v<T>)
- : a{other.a},
- s{other.s},
- ptr{other.ptr}
+ : Base(other)
{
const auto otherInlineStorage = reinterpret_cast<T*>(other.array);
if (data() == otherInlineStorage) {
// inline buffer - move into our inline buffer:
- ptr = reinterpret_cast<T*>(array);
+ this->ptr = this->array;
QtPrivate::q_uninitialized_relocate_n(otherInlineStorage, size(), data());
} else {
// heap buffer - we just stole the memory
@@ -110,7 +346,7 @@ public:
{
}
- template <typename InputIterator, QtPrivate::IfIsInputIterator<InputIterator> = true>
+ template <typename InputIterator, if_input_iterator<InputIterator> = true>
inline QVarLengthArray(InputIterator first, InputIterator last)
: QVarLengthArray()
{
@@ -122,7 +358,7 @@ public:
{
if constexpr (QTypeInfo<T>::isComplex)
std::destroy_n(data(), size());
- if (data() != reinterpret_cast<T *>(array))
+ if (data() != reinterpret_cast<T *>(this->array))
free(data());
}
inline QVarLengthArray<T, Prealloc> &operator=(const QVarLengthArray<T, Prealloc> &other)
@@ -142,72 +378,84 @@ public:
// the moved-from state is the empty state, so we're good with the clear() here:
clear();
Q_ASSERT(capacity() >= Prealloc);
- const auto otherInlineStorage = reinterpret_cast<T *>(other.array);
+ const auto otherInlineStorage = other.array;
if (other.ptr != otherInlineStorage) {
// heap storage: steal the external buffer, reset other to otherInlineStorage
- a = std::exchange(other.a, Prealloc);
- ptr = std::exchange(other.ptr, otherInlineStorage);
+ this->a = std::exchange(other.a, Prealloc);
+ this->ptr = std::exchange(other.ptr, otherInlineStorage);
} else {
// inline storage: move into our storage (doesn't matter whether inline or external)
QtPrivate::q_uninitialized_relocate_n(other.data(), other.size(), data());
}
- s = std::exchange(other.s, 0);
+ this->s = std::exchange(other.s, 0);
return *this;
}
QVarLengthArray<T, Prealloc> &operator=(std::initializer_list<T> list)
{
- resize(qsizetype(list.size()));
- std::copy(list.begin(), list.end(),
- QT_MAKE_CHECKED_ARRAY_ITERATOR(this->begin(), this->size()));
+ assign(list);
return *this;
}
inline void removeLast()
{
- verify();
- if constexpr (QTypeInfo<T>::isComplex)
- data()[size() - 1].~T();
- --s;
+ Base::pop_back();
}
- inline qsizetype size() const { return s; }
+#ifdef Q_QDOC
+ inline qsizetype size() const { return this->s; }
+ static constexpr qsizetype max_size() noexcept { return QVLABase<T>::max_size(); }
+#endif
+ using Base::size;
inline qsizetype count() const { return size(); }
inline qsizetype length() const { return size(); }
inline T &first()
{
- verify();
- return *begin();
+ return front();
}
inline const T &first() const
{
- verify();
- return *begin();
+ return front();
}
T &last()
{
- verify();
- return *(end() - 1);
+ return back();
}
const T &last() const
{
- verify();
- return *(end() - 1);
+ return back();
}
- inline bool isEmpty() const { return size() == 0; }
- inline void resize(qsizetype size);
+ bool isEmpty() const { return empty(); }
+ void resize(qsizetype sz) { Base::resize_impl(Prealloc, this->array, sz); }
+#ifndef Q_QDOC
+ template <typename U = T, if_copyable<U> = true>
+#endif
+ void resize(qsizetype sz, const T &v)
+ { Base::resize_impl(Prealloc, this->array, sz, v); }
+ using Base::clear;
+#ifdef Q_QDOC
inline void clear() { resize(0); }
- inline void squeeze();
+#endif
+ void squeeze() { reallocate(size(), size()); }
- inline qsizetype capacity() const { return a; }
- inline void reserve(qsizetype size);
+ using Base::capacity;
+#ifdef Q_QDOC
+ qsizetype capacity() const { return this->a; }
+#endif
+ void reserve(qsizetype sz) { if (sz > capacity()) reallocate(size(), sz); }
+#ifdef Q_QDOC
template <typename AT = T>
inline qsizetype indexOf(const AT &t, qsizetype from = 0) const;
template <typename AT = T>
inline qsizetype lastIndexOf(const AT &t, qsizetype from = -1) const;
template <typename AT = T>
inline bool contains(const AT &t) const;
+#endif
+ using Base::indexOf;
+ using Base::lastIndexOf;
+ using Base::contains;
+#ifdef Q_QDOC
inline T &operator[](qsizetype idx)
{
verify(idx);
@@ -218,33 +466,31 @@ public:
verify(idx);
return data()[idx];
}
+#endif
+ using Base::operator[];
inline const T &at(qsizetype idx) const { return operator[](idx); }
+#ifdef Q_QDOC
T value(qsizetype i) const;
T value(qsizetype i, const T &defaultValue) const;
+#endif
+ using Base::value;
inline void append(const T &t)
{
- if (size() == capacity()) { // i.e. size() != 0
- T copy(t);
- reallocate(size(), size() << 1);
- const qsizetype idx = s++;
- new (data() + idx) T(std::move(copy));
- } else {
- const qsizetype idx = s++;
- new (data() + idx) T(t);
- }
+ if (size() == capacity())
+ emplace_back(T(t));
+ else
+ emplace_back(t);
}
void append(T &&t)
{
- if (size() == capacity())
- reallocate(size(), size() << 1);
- const qsizetype idx = s++;
- new (data() + idx) T(std::move(t));
+ emplace_back(std::move(t));
}
- void append(const T *buf, qsizetype size);
+ void append(const T *buf, qsizetype sz)
+ { Base::append_impl(Prealloc, this->array, buf, sz); }
inline QVarLengthArray<T, Prealloc> &operator<<(const T &t)
{ append(t); return *this; }
inline QVarLengthArray<T, Prealloc> &operator<<(T &&t)
@@ -254,11 +500,25 @@ public:
inline QVarLengthArray<T, Prealloc> &operator+=(T &&t)
{ append(std::move(t)); return *this; }
+#if QT_DEPRECATED_SINCE(6, 3)
+ QT_DEPRECATED_VERSION_X_6_3("This is slow. If you must, use insert(cbegin(), ~~~) instead.")
void prepend(T &&t);
+ QT_DEPRECATED_VERSION_X_6_3("This is slow. If you must, use insert(cbegin(), ~~~) instead.")
void prepend(const T &t);
+#endif
void insert(qsizetype i, T &&t);
void insert(qsizetype i, const T &t);
void insert(qsizetype i, qsizetype n, const T &t);
+
+ QVarLengthArray &assign(qsizetype n, const T &t)
+ { Base::assign_impl(Prealloc, this->array, n, t); return *this; }
+ template <typename InputIterator, if_input_iterator<InputIterator> = true>
+ QVarLengthArray &assign(InputIterator first, InputIterator last)
+ { Base::assign_impl(Prealloc, this->array, first, last); return *this; }
+ QVarLengthArray &assign(std::initializer_list<T> list)
+ { assign(list.begin(), list.end()); return *this; }
+
+#ifdef Q_QDOC
void replace(qsizetype i, const T &t);
void remove(qsizetype i, qsizetype n = 1);
template <typename AT = T>
@@ -267,23 +527,20 @@ public:
bool removeOne(const AT &t);
template <typename Predicate>
qsizetype removeIf(Predicate pred);
+#endif
+ using Base::replace;
+ using Base::remove;
+ using Base::removeAll;
+ using Base::removeOne;
+ using Base::removeIf;
- inline T *data() { return ptr; }
- inline const T *data() const { return ptr; }
+#ifdef Q_QDOC
+ inline T *data() { return this->ptr; }
+ inline const T *data() const { return this->ptr; }
+#endif
+ using Base::data;
inline const T *constData() const { return data(); }
- typedef qsizetype size_type;
- typedef T value_type;
- typedef value_type *pointer;
- typedef const value_type *const_pointer;
- typedef value_type &reference;
- typedef const value_type &const_reference;
- typedef qptrdiff difference_type;
-
- typedef T *iterator;
- typedef const T *const_iterator;
- typedef std::reverse_iterator<iterator> reverse_iterator;
- typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
-
+#ifdef Q_QDOC
inline iterator begin() { return data(); }
inline const_iterator begin() const { return data(); }
inline const_iterator cbegin() const { return begin(); }
@@ -291,33 +548,61 @@ public:
inline iterator end() { return data() + size(); }
inline const_iterator end() const { return data() + size(); }
inline const_iterator cend() const { return end(); }
+#endif
+
+ using Base::begin;
+ using Base::cbegin;
+ auto constBegin() const -> const_iterator { return begin(); }
+ using Base::end;
+ using Base::cend;
inline const_iterator constEnd() const { return end(); }
+#ifdef Q_QDOC
reverse_iterator rbegin() { return reverse_iterator(end()); }
reverse_iterator rend() { return reverse_iterator(begin()); }
const_reverse_iterator rbegin() const { return const_reverse_iterator(end()); }
const_reverse_iterator rend() const { return const_reverse_iterator(begin()); }
const_reverse_iterator crbegin() const { return const_reverse_iterator(end()); }
const_reverse_iterator crend() const { return const_reverse_iterator(begin()); }
- iterator insert(const_iterator before, qsizetype n, const T &x);
+#endif
+ using Base::rbegin;
+ using Base::crbegin;
+ using Base::rend;
+ using Base::crend;
+
+ iterator insert(const_iterator before, qsizetype n, const T &x)
+ { return Base::insert_impl(Prealloc, this->array, before, n, x); }
iterator insert(const_iterator before, T &&x) { return emplace(before, std::move(x)); }
inline iterator insert(const_iterator before, const T &x) { return insert(before, 1, x); }
+#ifdef Q_QDOC
iterator erase(const_iterator begin, const_iterator end);
inline iterator erase(const_iterator pos) { return erase(pos, pos + 1); }
+#endif
+ using Base::erase;
// STL compatibility:
+#ifdef Q_QDOC
inline bool empty() const { return isEmpty(); }
+#endif
+ using Base::empty;
inline void push_back(const T &t) { append(t); }
void push_back(T &&t) { append(std::move(t)); }
+#ifdef Q_QDOC
inline void pop_back() { removeLast(); }
inline T &front() { return first(); }
inline const T &front() const { return first(); }
inline T &back() { return last(); }
inline const T &back() const { return last(); }
+#endif
+ using Base::pop_back;
+ using Base::front;
+ using Base::back;
void shrink_to_fit() { squeeze(); }
template <typename...Args>
- iterator emplace(const_iterator pos, Args &&...args);
+ iterator emplace(const_iterator pos, Args &&...args)
+ { return Base::emplace_impl(Prealloc, this->array, pos, std::forward<Args>(args)...); }
template <typename...Args>
- T &emplace_back(Args &&...args) { return *emplace(cend(), std::forward<Args>(args)...); }
+ T &emplace_back(Args &&...args)
+ { return Base::emplace_back_impl(Prealloc, this->array, std::forward<Args>(args)...); }
#ifdef Q_QDOC
@@ -337,12 +622,7 @@ public:
template <typename U = T, qsizetype Prealloc2 = Prealloc> friend
QTypeTraits::compare_eq_result<U> operator==(const QVarLengthArray<T, Prealloc> &l, const QVarLengthArray<T, Prealloc2> &r)
{
- if (l.size() != r.size())
- return false;
- const T *rb = r.begin();
- const T *b = l.begin();
- const T *e = l.end();
- return std::equal(b, e, QT_MAKE_CHECKED_ARRAY_ITERATOR(rb, r.size()));
+ return l.equal(r);
}
template <typename U = T, qsizetype Prealloc2 = Prealloc> friend
@@ -356,8 +636,7 @@ public:
noexcept(noexcept(std::lexicographical_compare(lhs.begin(), lhs.end(),
rhs.begin(), rhs.end())))
{
- return std::lexicographical_compare(lhs.begin(), lhs.end(),
- rhs.begin(), rhs.end());
+ return lhs.less_than(rhs);
}
template <typename U = T, qsizetype Prealloc2 = Prealloc> friend
@@ -383,18 +662,17 @@ public:
#endif
private:
- void reallocate(qsizetype size, qsizetype alloc);
+ template <typename U, qsizetype Prealloc2>
+ bool equal(const QVarLengthArray<U, Prealloc2> &other) const
+ { return Base::equal(other); }
+ template <typename U, qsizetype Prealloc2>
+ bool less_than(const QVarLengthArray<U, Prealloc2> &other) const
+ { return Base::less_than(other); }
- qsizetype a; // capacity
- qsizetype s; // size
- T *ptr; // data
- std::aligned_storage_t<sizeof(T), alignof(T)> array[Prealloc];
+ void reallocate(qsizetype sz, qsizetype alloc)
+ { Base::reallocate_impl(Prealloc, this->array, sz, alloc); }
- bool isValidIterator(const const_iterator &i) const
- {
- const std::less<const T *> less = {};
- return !less(cend(), i) && !less(i, cbegin());
- }
+ using Base::isValidIterator;
};
template <typename InputIterator,
@@ -404,35 +682,27 @@ QVarLengthArray(InputIterator, InputIterator) -> QVarLengthArray<ValueType>;
template <class T, qsizetype Prealloc>
Q_INLINE_TEMPLATE QVarLengthArray<T, Prealloc>::QVarLengthArray(qsizetype asize)
- : s(asize) {
- static_assert(Prealloc > 0, "QVarLengthArray Prealloc must be greater than 0.");
- Q_ASSERT_X(size() >= 0, "QVarLengthArray::QVarLengthArray()", "Size must be greater than or equal to 0.");
- if (size() > Prealloc) {
- ptr = reinterpret_cast<T *>(malloc(s * sizeof(T)));
- Q_CHECK_PTR(data());
- a = size();
- } else {
- ptr = reinterpret_cast<T *>(array);
- a = Prealloc;
- }
- if constexpr (QTypeInfo<T>::isComplex) {
- T *i = end();
- while (i != begin())
- new (--i) T;
- }
-}
+ : QVarLengthArray()
+{
+ Q_ASSERT_X(asize >= 0, "QVarLengthArray::QVarLengthArray(qsizetype)",
+ "Size must be greater than or equal to 0.");
-template <class T, qsizetype Prealloc>
-Q_INLINE_TEMPLATE void QVarLengthArray<T, Prealloc>::resize(qsizetype asize)
-{ reallocate(asize, qMax(asize, capacity())); }
+ // historically, this ctor worked for non-copyable/non-movable T, so keep it working, why not?
+ // resize(asize) // this requires a movable or copyable T, can't use, need to do it by hand
-template <class T, qsizetype Prealloc>
-Q_INLINE_TEMPLATE void QVarLengthArray<T, Prealloc>::reserve(qsizetype asize)
-{ if (asize > capacity()) reallocate(size(), asize); }
+ if (asize > Prealloc) {
+ this->ptr = malloc(asize * sizeof(T));
+ Q_CHECK_PTR(this->ptr);
+ this->a = asize;
+ }
+ if constexpr (QTypeInfo<T>::isComplex)
+ std::uninitialized_default_construct_n(data(), asize);
+ this->s = asize;
+}
-template <class T, qsizetype Prealloc>
+template <class T>
template <typename AT>
-Q_INLINE_TEMPLATE qsizetype QVarLengthArray<T, Prealloc>::indexOf(const AT &t, qsizetype from) const
+Q_INLINE_TEMPLATE qsizetype QVLABase<T>::indexOf(const AT &t, qsizetype from) const
{
if (from < 0)
from = qMax(from + size(), qsizetype(0));
@@ -446,9 +716,9 @@ Q_INLINE_TEMPLATE qsizetype QVarLengthArray<T, Prealloc>::indexOf(const AT &t, q
return -1;
}
-template <class T, qsizetype Prealloc>
+template <class T>
template <typename AT>
-Q_INLINE_TEMPLATE qsizetype QVarLengthArray<T, Prealloc>::lastIndexOf(const AT &t, qsizetype from) const
+Q_INLINE_TEMPLATE qsizetype QVLABase<T>::lastIndexOf(const AT &t, qsizetype from) const
{
if (from < 0)
from += size();
@@ -465,9 +735,9 @@ Q_INLINE_TEMPLATE qsizetype QVarLengthArray<T, Prealloc>::lastIndexOf(const AT &
return -1;
}
-template <class T, qsizetype Prealloc>
+template <class T>
template <typename AT>
-Q_INLINE_TEMPLATE bool QVarLengthArray<T, Prealloc>::contains(const AT &t) const
+Q_INLINE_TEMPLATE bool QVLABase<T>::contains(const AT &t) const
{
const T *b = begin();
const T *i = end();
@@ -478,32 +748,83 @@ Q_INLINE_TEMPLATE bool QVarLengthArray<T, Prealloc>::contains(const AT &t) const
return false;
}
-template <class T, qsizetype Prealloc>
-Q_OUTOFLINE_TEMPLATE void QVarLengthArray<T, Prealloc>::append(const T *abuf, qsizetype increment)
+template <class T>
+Q_OUTOFLINE_TEMPLATE void QVLABase<T>::append_impl(qsizetype prealloc, void *array, const T *abuf, qsizetype increment)
{
- Q_ASSERT(abuf);
+ Q_ASSERT(abuf || increment == 0);
if (increment <= 0)
return;
const qsizetype asize = size() + increment;
if (asize >= capacity())
- reallocate(size(), qMax(size() * 2, asize));
+ growBy(prealloc, array, increment);
if constexpr (QTypeInfo<T>::isComplex)
std::uninitialized_copy_n(abuf, increment, end());
else
memcpy(static_cast<void *>(end()), static_cast<const void *>(abuf), increment * sizeof(T));
- s = asize;
+ this->s = asize;
}
-template <class T, qsizetype Prealloc>
-Q_INLINE_TEMPLATE void QVarLengthArray<T, Prealloc>::squeeze()
-{ reallocate(size(), size()); }
+template <class T>
+Q_OUTOFLINE_TEMPLATE void QVLABase<T>::assign_impl(qsizetype prealloc, void *array, qsizetype n, const T &t)
+{
+ Q_ASSERT(n >= 0);
+ if (n > capacity()) {
+ reallocate_impl(prealloc, array, 0, capacity()); // clear
+ resize_impl(prealloc, array, n, t);
+ } else {
+ auto mid = (std::min)(n, size());
+ std::fill(data(), data() + mid, t);
+ std::uninitialized_fill(data() + mid, data() + n, t);
+ s = n;
+ erase(data() + n, data() + size());
+ }
+}
-template <class T, qsizetype Prealloc>
-Q_OUTOFLINE_TEMPLATE void QVarLengthArray<T, Prealloc>::reallocate(qsizetype asize, qsizetype aalloc)
+template <class T>
+template <typename Iterator>
+Q_OUTOFLINE_TEMPLATE void QVLABase<T>::assign_impl(qsizetype prealloc, void *array, Iterator first, Iterator last)
+{
+ // This function only provides the basic exception guarantee.
+ constexpr bool IsFwdIt =
+ std::is_convertible_v<typename std::iterator_traits<Iterator>::iterator_category,
+ std::forward_iterator_tag>;
+ if constexpr (IsFwdIt) {
+ const qsizetype n = std::distance(first, last);
+ if (n > capacity())
+ reallocate_impl(prealloc, array, 0, n); // clear & reserve n
+ }
+
+ auto dst = begin();
+ const auto dend = end();
+ while (true) {
+ if (first == last) { // ran out of elements to assign
+ std::destroy(dst, dend);
+ break;
+ }
+ if (dst == dend) { // ran out of existing elements to overwrite
+ if constexpr (IsFwdIt) {
+ dst = std::uninitialized_copy(first, last, dst);
+ break;
+ } else {
+ do {
+ emplace_back_impl(prealloc, array, *first);
+ } while (++first != last);
+ return; // size() is already correct (and dst invalidated)!
+ }
+ }
+ *dst = *first; // overwrite existing element
+ ++dst;
+ ++first;
+ }
+ this->s = dst - begin();
+}
+
+template <class T>
+Q_OUTOFLINE_TEMPLATE void QVLABase<T>::reallocate_impl(qsizetype prealloc, void *array, qsizetype asize, qsizetype aalloc)
{
Q_ASSERT(aalloc >= asize);
Q_ASSERT(data());
@@ -511,39 +832,28 @@ Q_OUTOFLINE_TEMPLATE void QVarLengthArray<T, Prealloc>::reallocate(qsizetype asi
qsizetype osize = size();
const qsizetype copySize = qMin(asize, osize);
- Q_ASSUME(copySize >= 0);
+ Q_ASSERT(copySize >= 0);
+
if (aalloc != capacity()) {
- if (aalloc > Prealloc) {
- T *newPtr = reinterpret_cast<T *>(malloc(aalloc * sizeof(T)));
+ QVLABaseBase::malloced_ptr guard;
+ void *newPtr;
+ qsizetype newA;
+ if (aalloc > prealloc) {
+ newPtr = malloc(aalloc * sizeof(T));
+ guard.reset(newPtr);
Q_CHECK_PTR(newPtr); // could throw
// by design: in case of QT_NO_EXCEPTIONS malloc must not fail or it crashes here
- ptr = newPtr;
- a = aalloc;
+ newA = aalloc;
} else {
- ptr = reinterpret_cast<T *>(array);
- a = Prealloc;
- }
- s = 0;
- if constexpr (!QTypeInfo<T>::isRelocatable) {
- QT_TRY {
- // move all the old elements
- while (size() < copySize) {
- new (end()) T(std::move(*(oldPtr+size())));
- (oldPtr+size())->~T();
- s++;
- }
- } QT_CATCH(...) {
- // clean up all the old objects and then free the old ptr
- qsizetype sClean = size();
- while (sClean < osize)
- (oldPtr+(sClean++))->~T();
- if (oldPtr != reinterpret_cast<T *>(array) && oldPtr != data())
- free(oldPtr);
- QT_RETHROW;
- }
- } else {
- memcpy(static_cast<void *>(data()), static_cast<const void *>(oldPtr), copySize * sizeof(T));
+ newPtr = array;
+ newA = prealloc;
}
+ QtPrivate::q_uninitialized_relocate_n(oldPtr, copySize,
+ reinterpret_cast<T *>(newPtr));
+ // commit:
+ ptr = newPtr;
+ guard.release();
+ a = newA;
}
s = copySize;
@@ -555,27 +865,17 @@ Q_OUTOFLINE_TEMPLATE void QVarLengthArray<T, Prealloc>::reallocate(qsizetype asi
if (oldPtr != reinterpret_cast<T *>(array) && oldPtr != data())
free(oldPtr);
-
- if constexpr (QTypeInfo<T>::isComplex) {
- // call default constructor for new objects (which can throw)
- while (size() < asize) {
- new (data() + size()) T;
- ++s;
- }
- } else {
- s = asize;
- }
}
-template <class T, qsizetype Prealloc>
-Q_OUTOFLINE_TEMPLATE T QVarLengthArray<T, Prealloc>::value(qsizetype i) const
+template <class T>
+Q_OUTOFLINE_TEMPLATE T QVLABase<T>::value(qsizetype i) const
{
if (size_t(i) >= size_t(size()))
return T();
return operator[](i);
}
-template <class T, qsizetype Prealloc>
-Q_OUTOFLINE_TEMPLATE T QVarLengthArray<T, Prealloc>::value(qsizetype i, const T &defaultValue) const
+template <class T>
+Q_OUTOFLINE_TEMPLATE T QVLABase<T>::value(qsizetype i, const T &defaultValue) const
{
return (size_t(i) >= size_t(size())) ? defaultValue : operator[](i);
}
@@ -592,100 +892,69 @@ template <class T, qsizetype Prealloc>
inline void QVarLengthArray<T, Prealloc>::insert(qsizetype i, qsizetype n, const T &t)
{ verify(i, 0);
insert(begin() + i, n, t); }
-template <class T, qsizetype Prealloc>
-inline void QVarLengthArray<T, Prealloc>::remove(qsizetype i, qsizetype n)
+template <class T>
+inline void QVLABase<T>::remove(qsizetype i, qsizetype n)
{ verify(i, n);
erase(begin() + i, begin() + i + n); }
-template <class T, qsizetype Prealloc>
+template <class T>
template <typename AT>
-inline qsizetype QVarLengthArray<T, Prealloc>::removeAll(const AT &t)
+inline qsizetype QVLABase<T>::removeAll(const AT &t)
{ return QtPrivate::sequential_erase_with_copy(*this, t); }
-template <class T, qsizetype Prealloc>
+template <class T>
template <typename AT>
-inline bool QVarLengthArray<T, Prealloc>::removeOne(const AT &t)
+inline bool QVLABase<T>::removeOne(const AT &t)
{ return QtPrivate::sequential_erase_one(*this, t); }
-template <class T, qsizetype Prealloc>
+template <class T>
template <typename Predicate>
-inline qsizetype QVarLengthArray<T, Prealloc>::removeIf(Predicate pred)
+inline qsizetype QVLABase<T>::removeIf(Predicate pred)
{ return QtPrivate::sequential_erase_if(*this, pred); }
+#if QT_DEPRECATED_SINCE(6, 3)
template <class T, qsizetype Prealloc>
inline void QVarLengthArray<T, Prealloc>::prepend(T &&t)
{ insert(cbegin(), std::move(t)); }
template <class T, qsizetype Prealloc>
inline void QVarLengthArray<T, Prealloc>::prepend(const T &t)
{ insert(begin(), 1, t); }
+#endif
-template <class T, qsizetype Prealloc>
-inline void QVarLengthArray<T, Prealloc>::replace(qsizetype i, const T &t)
+template <class T>
+inline void QVLABase<T>::replace(qsizetype i, const T &t)
{
verify(i);
data()[i] = t;
}
-template <class T, qsizetype Prealloc>
+template <class T>
template <typename...Args>
-Q_OUTOFLINE_TEMPLATE auto QVarLengthArray<T, Prealloc>::emplace(const_iterator before, Args &&...args) -> iterator
+Q_OUTOFLINE_TEMPLATE auto QVLABase<T>::emplace_impl(qsizetype prealloc, void *array, const_iterator before, Args &&...args) -> iterator
{
Q_ASSERT_X(isValidIterator(before), "QVarLengthArray::insert", "The specified const_iterator argument 'before' is invalid");
Q_ASSERT(size() <= capacity());
Q_ASSERT(capacity() > 0);
- qsizetype offset = qsizetype(before - cbegin());
- if (size() == capacity())
- reserve(size() * 2);
- if constexpr (!QTypeInfo<T>::isRelocatable) {
- T *b = begin() + offset;
- T *i = end();
- T *j = i + 1;
- // The new end-element needs to be constructed, the rest must be move assigned
- if (i != b) {
- new (--j) T(std::move(*--i));
- while (i != b)
- *--j = std::move(*--i);
- *b = T(std::forward<Args>(args)...);
- } else {
- new (b) T(std::forward<Args>(args)...);
- }
- } else {
- T *b = begin() + offset;
- memmove(static_cast<void *>(b + 1), static_cast<const void *>(b), (size() - offset) * sizeof(T));
- new (b) T(std::forward<Args>(args)...);
- }
- s += 1;
- return data() + offset;
+ const qsizetype offset = qsizetype(before - cbegin());
+ emplace_back_impl(prealloc, array, std::forward<Args>(args)...);
+ const auto b = begin() + offset;
+ const auto e = end();
+ QtPrivate::q_rotate(b, e - 1, e);
+ return b;
}
-template <class T, qsizetype Prealloc>
-Q_OUTOFLINE_TEMPLATE typename QVarLengthArray<T, Prealloc>::iterator QVarLengthArray<T, Prealloc>::insert(const_iterator before, qsizetype n, const T &t)
+template <class T>
+Q_OUTOFLINE_TEMPLATE auto QVLABase<T>::insert_impl(qsizetype prealloc, void *array, const_iterator before, qsizetype n, const T &t) -> iterator
{
Q_ASSERT_X(isValidIterator(before), "QVarLengthArray::insert", "The specified const_iterator argument 'before' is invalid");
- qsizetype offset = qsizetype(before - cbegin());
- if (n != 0) {
- const T copy(t); // `t` could alias an element in [begin(), end()[
- resize(size() + n);
- if constexpr (!QTypeInfo<T>::isRelocatable) {
- T *b = begin() + offset;
- T *j = end();
- T *i = j - n;
- while (i != b)
- *--j = *--i;
- i = b + n;
- while (i != b)
- *--i = copy;
- } else {
- T *b = begin() + offset;
- T *i = b + n;
- memmove(static_cast<void *>(i), static_cast<const void *>(b), (size() - offset - n) * sizeof(T));
- while (i != b)
- new (--i) T(copy);
- }
- }
- return data() + offset;
+ const qsizetype offset = qsizetype(before - cbegin());
+ resize_impl(prealloc, array, size() + n, t);
+ const auto b = begin() + offset;
+ const auto e = end();
+ QtPrivate::q_rotate(b, e - n, e);
+ return b;
}
-template <class T, qsizetype Prealloc>
-Q_OUTOFLINE_TEMPLATE typename QVarLengthArray<T, Prealloc>::iterator QVarLengthArray<T, Prealloc>::erase(const_iterator abegin, const_iterator aend)
+template <class T>
+Q_OUTOFLINE_TEMPLATE auto QVLABase<T>::erase(const_iterator abegin, const_iterator aend) -> iterator
{
Q_ASSERT_X(isValidIterator(abegin), "QVarLengthArray::insert", "The specified const_iterator argument 'abegin' is invalid");
Q_ASSERT_X(isValidIterator(aend), "QVarLengthArray::insert", "The specified const_iterator argument 'aend' is invalid");
@@ -694,13 +963,18 @@ Q_OUTOFLINE_TEMPLATE typename QVarLengthArray<T, Prealloc>::iterator QVarLengthA
qsizetype l = qsizetype(aend - cbegin());
qsizetype n = l - f;
+ if (n == 0) // avoid UB in std::move() below
+ return data() + f;
+
+ Q_ASSERT(n > 0); // aend must be reachable from abegin
+
if constexpr (QTypeInfo<T>::isComplex) {
std::move(begin() + l, end(), QT_MAKE_CHECKED_ARRAY_ITERATOR(begin() + f, size() - f));
std::destroy(end() - n, end());
} else {
memmove(static_cast<void *>(data() + f), static_cast<const void *>(data() + l), (size() - l) * sizeof(T));
}
- s -= n;
+ this->s -= n;
return data() + f;
}
@@ -728,21 +1002,21 @@ bool operator>=(const QVarLengthArray<T, Prealloc1> &l, const QVarLengthArray<T,
template <typename T, qsizetype Prealloc>
size_t qHash(const QVarLengthArray<T, Prealloc> &key, size_t seed = 0)
- noexcept(noexcept(qHashRange(key.cbegin(), key.cend(), seed)))
+ noexcept(QtPrivate::QNothrowHashable_v<T>)
{
- return qHashRange(key.cbegin(), key.cend(), seed);
+ return key.hash(seed);
}
template <typename T, qsizetype Prealloc, typename AT>
qsizetype erase(QVarLengthArray<T, Prealloc> &array, const AT &t)
{
- return QtPrivate::sequential_erase(array, t);
+ return array.removeAll(t);
}
template <typename T, qsizetype Prealloc, typename Predicate>
qsizetype erase_if(QVarLengthArray<T, Prealloc> &array, Predicate pred)
{
- return QtPrivate::sequential_erase_if(array, pred);
+ return array.removeIf(pred);
}
QT_END_NAMESPACE
diff --git a/src/corelib/tools/qvarlengtharray.qdoc b/src/corelib/tools/qvarlengtharray.qdoc
index b7e6cd6d6e..4467e0c65a 100644
--- a/src/corelib/tools/qvarlengtharray.qdoc
+++ b/src/corelib/tools/qvarlengtharray.qdoc
@@ -1,29 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
\class QVarLengthArray
@@ -105,21 +81,34 @@
\l{default-constructed value}.
*/
+/*!
+ \fn template<class T, qsizetype Prealloc> QVarLengthArray<T, Prealloc>::QVarLengthArray(qsizetype size, const T &v)
+ \since 6.4
+
+ Constructs an array with an initial size of \a size elements filled with
+ copies of \a v.
+
+ \note This constructor is only available when \c T is copy-constructible.
+
+ \sa size(), squeeze()
+*/
+
/*! \fn template<class T, qsizetype Prealloc> QVarLengthArray<T, Prealloc>::QVarLengthArray(std::initializer_list<T> args)
\since 5.5
Constructs an array from the std::initializer_list given by \a args.
-
- This constructor is only enabled if the compiler supports C++11 initializer
- lists.
*/
-/*! \fn template<class T, qsizetype Prealloc> template<typename InputIterator> QVarLengthArray<T, Prealloc>::QVarLengthArray(InputIterator first, InputIterator last)
+/*! \fn template<class T, qsizetype Prealloc> template<typename InputIterator, QVarLengthArray<T, Prealloc>::if_input_iterator<InputIterator>> QVarLengthArray<T, Prealloc>::QVarLengthArray(InputIterator first, InputIterator last)
\since 5.14
Constructs an array with the contents in the iterator range [\a first, \a last).
+ This constructor only participates in overload resolution if
+ \c InputIterator meets the requirements of an
+ \l {https://en.cppreference.com/w/cpp/named_req/InputIterator} {LegacyInputIterator}.
+
The value type of \c InputIterator must be convertible to \c T.
*/
@@ -151,6 +140,15 @@
\sa isEmpty(), resize()
*/
+/*! \fn template<class T, qsizetype Prealloc> qsizetype QVarLengthArray<T, Prealloc>::max_size()
+ \since 6.8
+
+ This function is provided for STL compatibility.
+ It returns the maximum number of elements that the array can
+ theoretically hold. In practice, the number can be much smaller,
+ limited by the amount of memory available to the system.
+*/
+
/*! \fn template<class T, qsizetype Prealloc> T& QVarLengthArray<T, Prealloc>::first()
Returns a reference to the first item in the array. The array must
@@ -245,6 +243,19 @@
\sa size(), squeeze()
*/
+/*!
+ \fn template<class T, qsizetype Prealloc> void QVarLengthArray<T, Prealloc>::resize(qsizetype size, const T &v)
+ \since 6.4
+
+ Sets the size of the array to \a size. If \a size is greater than
+ the current size, copies of \a v are added to the end. If \a size is
+ less than the current size, elements are removed from the end.
+
+ \note This function is only available when \c T is copy-constructible.
+
+ \sa size(), squeeze()
+*/
+
/*! \fn template<class T, qsizetype Prealloc> qsizetype QVarLengthArray<T, Prealloc>::capacity() const
Returns the maximum number of elements that can be stored in the
@@ -419,9 +430,6 @@
\since 5.5
Assigns the values of \a list to this array, and returns a reference to this array.
-
- This constructor is only enabled if the compiler supports C++11 initializer
- lists.
*/
/*! \fn template<class T, qsizetype Prealloc> QVarLengthArray<T, Prealloc>::QVarLengthArray(const QVarLengthArray<T, Prealloc> &other)
@@ -463,6 +471,15 @@
\a defaultValue.
*/
+/*
+ \var QVarLengthArray::PreallocatedSize
+ \since 6.8
+
+ The same value as the \c{Prealloc} template argument. Provided for easier
+ access compared to manually extracting the value from the template
+ argument.
+*/
+
/*!
\typedef QVarLengthArray::size_type
\since 4.7
@@ -545,6 +562,8 @@
\fn template<class T, qsizetype Prealloc> void QVarLengthArray<T, Prealloc>::prepend(T &&value)
\since 4.8
+ \deprecated [6.3] This is slow. If you must, use \c{insert(cbegin(), ~~~)} instead.
+
Inserts \a value at the beginning of the array.
@@ -989,3 +1008,40 @@
\sa erase()
*/
+
+/*! \fn template <class T, qsizetype Prealloc> QVarLengthArray<T, Prealloc>& QVarLengthArray<T, Prealloc>::assign(qsizetype n, const T &t)
+ \since 6.6
+
+ Replaces the contents of this container with \a n copies of \a t.
+
+ The size of this container will be equal to \a n. This function will only
+ allocate memory if \a n exceeds the capacity of the container.
+*/
+
+/*! \fn template <class T, qsizetype Prealloc> template <typename InputIterator, QVarLengthArray<T, Prealloc>::if_input_iterator<InputIterator>> QVarLengthArray<T, Prealloc>& QVarLengthArray<T, Prealloc>::assign(InputIterator first, InputIterator last)
+ \since 6.6
+
+ Replaces the contents of this container with a copy of the elements in the
+ iterator range [\a first, \a last).
+
+ The size of this container will be equal to the number of elements in the
+ range [\a first, \a last). This function will only allocate memory if the
+ number of elements in the range exceeds the capacity of the container.
+
+ This function overload only participates in overload resolution if
+ \c InputIterator meets the requirements of an
+ \l {https://en.cppreference.com/w/cpp/named_req/InputIterator} {LegacyInputIterator}.
+
+ The behavior is undefined if either argument is an iterator into *this.
+*/
+
+/*! \fn template <class T, qsizetype Prealloc> QVarLengthArray<T, Prealloc>& QVarLengthArray<T, Prealloc>::assign(std::initializer_list<T> list)
+ \since 6.6
+
+ Replaces the contents of this container with a copy of the elements of \a list.
+
+ The size of this container will be equal to the number of elements in \a list.
+
+ This function only allocates memory if the number of elements in \a list
+ exceeds the capacity of the container.
+*/
diff --git a/src/corelib/tools/qvector.h b/src/corelib/tools/qvector.h
index 8d880407dd..4fad2bce8f 100644
--- a/src/corelib/tools/qvector.h
+++ b/src/corelib/tools/qvector.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QVECTOR_H
#define QVECTOR_H
@@ -43,6 +7,12 @@
#include <QtCore/qlist.h>
#include <QtCore/qcontainerfwd.h>
+#if 0
+#pragma qt_class(QVector)
+#pragma qt_class(QMutableVectorIterator)
+#pragma qt_class(QVectorIterator)
+#endif
+
QT_BEGIN_NAMESPACE
#if !defined(QT_NO_JAVA_STYLE_ITERATORS)
diff --git a/src/corelib/tools/qversionnumber.cpp b/src/corelib/tools/qversionnumber.cpp
index da093a417d..4b8ace71cc 100644
--- a/src/corelib/tools/qversionnumber.cpp
+++ b/src/corelib/tools/qversionnumber.cpp
@@ -1,43 +1,7 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Copyright (C) 2016 Intel Corporation.
-** Copyright (C) 2014 Keith Gardner <kreios4004@gmail.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// Copyright (C) 2016 Intel Corporation.
+// Copyright (C) 2014 Keith Gardner <kreios4004@gmail.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include <QtCore/qversionnumber.h>
#include <QtCore/qhash.h>
@@ -57,6 +21,8 @@
QT_BEGIN_NAMESPACE
+QT_IMPL_METATYPE_EXTERN(QVersionNumber)
+
/*!
\class QVersionNumber
\inmodule QtCore
@@ -105,18 +71,23 @@ QT_BEGIN_NAMESPACE
\fn QVersionNumber::QVersionNumber(QList<int> &&seg)
Move-constructs a version number from the list of numbers contained in \a seg.
-
- This constructor is only enabled if the compiler supports C++11 move semantics.
*/
/*!
\fn QVersionNumber::QVersionNumber(std::initializer_list<int> args)
- Construct a version number from the std::initializer_list specified by
+ Constructs a version number from the std::initializer_list specified by
\a args.
+*/
+
+/*!
+ \fn QVersionNumber::QVersionNumber(QSpan<const int> args)
+ \since 6.8
+
+ Constructs a version number from the span specified by \a args.
- This constructor is only enabled if the compiler supports C++11 initializer
- lists.
+ \note In Qt versions prior to 6.8, QVersionNumber could only be constructed
+ from QList, QVarLenthArray or std::initializer_list.
*/
/*!
@@ -168,7 +139,7 @@ QT_BEGIN_NAMESPACE
*/
/*!
- \fn const QList<int>& QVersionNumber::segments() const
+ \fn QList<int> QVersionNumber::segments() const
Returns all of the numerical segments.
@@ -181,13 +152,13 @@ QList<int> QVersionNumber::segments() const
QList<int> result;
result.resize(segmentCount());
- for (int i = 0; i < segmentCount(); ++i)
+ for (qsizetype i = 0; i < segmentCount(); ++i)
result[i] = segmentAt(i);
return result;
}
/*!
- \fn int QVersionNumber::segmentAt(int index) const
+ \fn int QVersionNumber::segmentAt(qsizetype index) const
Returns the segment value at \a index. If the index does not exist,
returns 0.
@@ -196,7 +167,7 @@ QList<int> QVersionNumber::segments() const
*/
/*!
- \fn int QVersionNumber::segmentCount() const
+ \fn qsizetype QVersionNumber::segmentCount() const
Returns the number of integers stored in segments().
@@ -204,6 +175,55 @@ QList<int> QVersionNumber::segments() const
*/
/*!
+ \typedef QVersionNumber::const_iterator
+ \typedef QVersionNumber::const_reverse_iterator
+ \since 6.8
+
+ Typedefs for an opaque class that implements a (reverse) random-access
+ iterator over QVersionNumber segments.
+
+ \note QVersionNumber does not support modifying segments in-place, so
+ there is no mutable iterator.
+*/
+
+/*!
+ \typedef QVersionNumber::value_type
+ \typedef QVersionNumber::difference_type
+ \typedef QVersionNumber::size_type
+ \typedef QVersionNumber::reference
+ \typedef QVersionNumber::const_reference
+ \typedef QVersionNumber::pointer
+ \typedef QVersionNumber::const_pointer
+ \since 6.8
+
+ Provided for STL-compatibility.
+
+ \note QVersionNumber does not support modifying segments in-place, so
+ reference and const_reference, as well as pointer and const_pointer are
+ pairwise the same types.
+*/
+
+/*!
+ \fn QVersionNumber::begin() const
+ \fn QVersionNumber::end() const;
+ \fn QVersionNumber::rbegin() const
+ \fn QVersionNumber::rend() const;
+ \fn QVersionNumber::cbegin() const
+ \fn QVersionNumber::cend() const;
+ \fn QVersionNumber::crbegin() const
+ \fn QVersionNumber::crend() const;
+ \fn QVersionNumber::constBegin() const;
+ \fn QVersionNumber::constEnd() const;
+ \since 6.8
+
+ Returns a const_iterator or const_reverse_iterator, respectively, pointing
+ to the first or one past the last segment of this version number.
+
+ \note QVersionNumber does not support modifying segments in-place, so
+ there is no mutable iterator.
+*/
+
+/*!
\fn QVersionNumber QVersionNumber::normalized() const
Returns an equivalent version number but with all trailing zeros removed.
@@ -215,7 +235,7 @@ QList<int> QVersionNumber::segments() const
*/
QVersionNumber QVersionNumber::normalized() const
{
- int i;
+ qsizetype i;
for (i = m_segments.size(); i; --i)
if (m_segments.at(i - 1) != 0)
break;
@@ -239,7 +259,7 @@ bool QVersionNumber::isPrefixOf(const QVersionNumber &other) const noexcept
{
if (segmentCount() > other.segmentCount())
return false;
- for (int i = 0; i < segmentCount(); ++i) {
+ for (qsizetype i = 0; i < segmentCount(); ++i) {
if (segmentAt(i) != other.segmentAt(i))
return false;
}
@@ -261,7 +281,7 @@ bool QVersionNumber::isPrefixOf(const QVersionNumber &other) const noexcept
*/
int QVersionNumber::compare(const QVersionNumber &v1, const QVersionNumber &v2) noexcept
{
- int commonlen;
+ qsizetype commonlen;
if (Q_LIKELY(!v1.m_segments.isUsingPointer() && !v2.m_segments.isUsingPointer())) {
// we can't use memcmp because it interprets the data as unsigned bytes
@@ -269,12 +289,12 @@ int QVersionNumber::compare(const QVersionNumber &v1, const QVersionNumber &v2)
const qint8 *ptr2 = v2.m_segments.inline_segments + InlineSegmentStartIdx;
commonlen = qMin(v1.m_segments.size(),
v2.m_segments.size());
- for (int i = 0; i < commonlen; ++i)
+ for (qsizetype i = 0; i < commonlen; ++i)
if (int x = ptr1[i] - ptr2[i])
return x;
} else {
commonlen = qMin(v1.segmentCount(), v2.segmentCount());
- for (int i = 0; i < commonlen; ++i) {
+ for (qsizetype i = 0; i < commonlen; ++i) {
if (v1.segmentAt(i) != v2.segmentAt(i))
return v1.segmentAt(i) - v2.segmentAt(i);
}
@@ -311,8 +331,8 @@ int QVersionNumber::compare(const QVersionNumber &v1, const QVersionNumber &v2)
QVersionNumber QVersionNumber::commonPrefix(const QVersionNumber &v1,
const QVersionNumber &v2)
{
- int commonlen = qMin(v1.segmentCount(), v2.segmentCount());
- int i;
+ qsizetype commonlen = qMin(v1.segmentCount(), v2.segmentCount());
+ qsizetype i;
for (i = 0; i < commonlen; ++i) {
if (v1.segmentAt(i) != v2.segmentAt(i))
break;
@@ -391,17 +411,19 @@ QString QVersionNumber::toString() const
QString version;
version.reserve(qMax(segmentCount() * 2 - 1, 0));
bool first = true;
- for (int i = 0; i < segmentCount(); ++i) {
+ for (qsizetype i = 0; i < segmentCount(); ++i) {
if (!first)
- version += QLatin1Char('.');
+ version += u'.';
version += QString::number(segmentAt(i));
first = false;
}
return version;
}
-#if QT_STRINGVIEW_LEVEL < 2
/*!
+ \fn QVersionNumber QVersionNumber::fromString(QAnyStringView string, qsizetype *suffixIndex)
+ \since 6.4
+
Constructs a QVersionNumber from a specially formatted \a string of
non-negative decimal numbers delimited by a period (\c{.}).
@@ -409,74 +431,86 @@ QString QVersionNumber::toString() const
is considered to be the suffix string. The start index of that string will be
stored in \a suffixIndex if it is not null.
- \snippet qversionnumber/main.cpp 3
+ \snippet qversionnumber/main.cpp 3-latin1-1
+
+ \note In versions prior to Qt 6.4, this function was overloaded for QString,
+ QLatin1StringView and QStringView instead, and \a suffixIndex was an \c{int*}.
\sa isNull()
*/
-QVersionNumber QVersionNumber::fromString(const QString &string, int *suffixIndex)
+
+static QVersionNumber from_string(QLatin1StringView string, qsizetype *suffixIndex)
{
- return fromString(QLatin1String(string.toLatin1()), suffixIndex);
-}
-#endif
+ // 32 should be more than enough, and, crucially, it means we're allocating
+ // not more (and often less) often when compared with direct QList usage
+ // for all possible segment counts (under the constraint that we don't want
+ // to keep more capacity around for the lifetime of the resulting
+ // QVersionNumber than required), esp. in the common case where the inline
+ // storage can be used.
+ QVarLengthArray<int, 32> seg;
-/*!
- \since 5.10
- \overload
+ const char *start = string.begin();
+ const char *lastGoodEnd = start;
+ const char *endOfString = string.end();
- Constructs a QVersionNumber from a specially formatted \a string of
- non-negative decimal numbers delimited by '.'.
+ do {
+ // parsing as unsigned so a minus sign is rejected
+ auto [value, used] = qstrntoull(start, endOfString - start, 10);
+ if (used <= 0 || value > qulonglong(std::numeric_limits<int>::max()))
+ break;
+ seg.append(int(value));
+ start += used + 1;
+ lastGoodEnd = start - 1;
+ } while (start < endOfString && *lastGoodEnd == '.');
- Once the numerical segments have been parsed, the remainder of the string
- is considered to be the suffix string. The start index of that string will be
- stored in \a suffixIndex if it is not null.
+ if (suffixIndex)
+ *suffixIndex = lastGoodEnd - string.begin();
- \snippet qversionnumber/main.cpp 3
+ return QVersionNumber(seg);
+}
- \sa isNull()
-*/
-QVersionNumber QVersionNumber::fromString(QStringView string, int *suffixIndex)
+static QVersionNumber from_string(q_no_char8_t::QUtf8StringView string, qsizetype *suffixIndex)
{
- return fromString(QLatin1String(string.toLatin1()), suffixIndex);
+ return from_string(QLatin1StringView(string.data(), string.size()), suffixIndex);
}
-/*!
- \since 5.10
- \overload
-
- Constructs a QVersionNumber from a specially formatted \a string of
- non-negative decimal numbers delimited by '.'.
-
- Once the numerical segments have been parsed, the remainder of the string
- is considered to be the suffix string. The start index of that string will be
- stored in \a suffixIndex if it is not null.
+// in qstring.cpp
+extern void qt_to_latin1(uchar *dst, const char16_t *uc, qsizetype len);
- \snippet qversionnumber/main.cpp 3-latin1-1
+static QVersionNumber from_string(QStringView string, qsizetype *suffixIndex)
+{
+ QVarLengthArray<char> copy;
+ copy.resize(string.size());
+ qt_to_latin1(reinterpret_cast<uchar*>(copy.data()), string.utf16(), string.size());
+ return from_string(QLatin1StringView(copy.data(), copy.size()), suffixIndex);
+}
- \sa isNull()
-*/
-QVersionNumber QVersionNumber::fromString(QLatin1String string, int *suffixIndex)
+QVersionNumber QVersionNumber::fromString(QAnyStringView string, qsizetype *suffixIndex)
{
- QList<int> seg;
+ return string.visit([=] (auto string) { return from_string(string, suffixIndex); });
+}
- const char *start = string.begin();
- const char *end = start;
- const char *lastGoodEnd = start;
- const char *endOfString = string.end();
+void QVersionNumber::SegmentStorage::setListData(const QList<int> &seg)
+{
+ pointer_segments = new QList<int>(seg);
+}
- do {
- bool ok = false;
- const qulonglong value = qstrntoull(start, endOfString - start, &end, 10, &ok);
- if (!ok || value > qulonglong(std::numeric_limits<int>::max()))
- break;
- seg.append(int(value));
- start = end + 1;
- lastGoodEnd = end;
- } while (start < endOfString && (end < endOfString && *end == '.'));
+void QVersionNumber::SegmentStorage::setListData(QList<int> &&seg)
+{
+ pointer_segments = new QList<int>(std::move(seg));
+}
- if (suffixIndex)
- *suffixIndex = int(lastGoodEnd - string.begin());
+void QVersionNumber::SegmentStorage::setListData(const int *first, const int *last)
+{
+ pointer_segments = new QList<int>(first, last);
+}
- return QVersionNumber(std::move(seg));
+void QVersionNumber::SegmentStorage::resize(qsizetype len)
+{
+ if (isUsingPointer())
+ pointer_segments->resize(len);
+ else
+ setInlineSize(len);
}
void QVersionNumber::SegmentStorage::setVector(int len, int maj, int min, int mic)
@@ -529,13 +563,13 @@ QDataStream& operator>>(QDataStream &in, QVersionNumber &version)
QDebug operator<<(QDebug debug, const QVersionNumber &version)
{
QDebugStateSaver saver(debug);
- debug.noquote() << version.toString();
+ debug.nospace().noquote();
+ debug << "QVersionNumber(" << version.toString() << ")";
return debug;
}
#endif
/*!
- \fn size_t qHash(const QVersionNumber &key, size_t seed)
\relates QHash
\since 5.6
@@ -550,199 +584,4 @@ size_t qHash(const QVersionNumber &key, size_t seed)
return seed;
}
-/*!
- \class QTypeRevision
- \inmodule QtCore
- \since 6.0
- \brief The QTypeRevision class contains a lightweight representation of
- a version number with two 8-bit segments, major and minor, either
- of which can be unknown.
-
- Use this class to describe revisions of a type. Compatible revisions can be
- expressed as increments of the minor version. Breaking changes can be
- expressed as increments of the major version. The return values of
- \l QMetaMethod::revision() and \l QMetaProperty::revision() can be passed to
- \l QTypeRevision::fromEncodedVersion(). The resulting major and minor versions
- specify in which Qt versions the properties and methods were added.
-
- \sa QMetaMethod::revision(), QMetaProperty::revision()
-*/
-
-/*!
- \fn template<typename Integer> static bool QTypeRevision::isValidSegment(Integer segment)
-
- Returns true if the given number can be used as either major or minor
- version in a QTypeRevision. The valid range for \a segment is \c {>= 0} and \c {< 255}.
-*/
-
-/*!
- \fn QTypeRevision::QTypeRevision()
-
- Produces an invalid revision.
-
- \sa isValid()
-*/
-
-/*!
- \fn template <typename Major, typename Minor> static QTypeRevision QTypeRevision::fromVersion(Major majorVersion, Minor minorVersion)
-
- Produces a QTypeRevision from the given \a majorVersion and \a minorVersion,
- both of which need to be a valid segments.
-
- \sa isValidSegment()
-*/
-
-/*!
- \fn template <typename Major> static QTypeRevision QTypeRevision::fromMajorVersion(Major majorVersion)
-
- Produces a QTypeRevision from the given \a majorVersion with an invalid minor
- version. \a majorVersion needs to be a valid segment.
-
- \sa isValidSegment()
-*/
-
-/*!
- \fn template <typename Minor> static QTypeRevision QTypeRevision::fromMinorVersion(Minor minorVersion)
-
- Produces a QTypeRevision from the given \a minorVersion with an invalid major
- version. \a minorVersion needs to be a valid segment.
-
- \sa isValidSegment()
-*/
-
-/*!
- \fn template <typename Integer> static QTypeRevision QTypeRevision::fromEncodedVersion(Integer value)
-
- Produces a QTypeRevision from the given \a value. \a value encodes both the
- minor and major versions in the least significant and second least
- significant byte, respectively.
-
- \a value must not have any bits outside the least significant two bytes set.
- \c Integer needs to be at least 16 bits wide, and must not have a sign bit
- in the least significant 16 bits.
-
- \sa toEncodedVersion()
-*/
-
-/*!
- \fn static QTypeRevision QTypeRevision::zero()
-
- Produces a QTypeRevision with major and minor version \c{0}.
-*/
-
-/*!
- \fn bool QTypeRevision::hasMajorVersion() const
-
- Returns true if the major version is known, otherwise false.
-
- \sa majorVersion(), hasMinorVersion()
-*/
-
-/*!
- \fn quint8 QTypeRevision::majorVersion() const
-
- Returns the major version encoded in the revision.
-
- \sa hasMajorVersion(), minorVersion()
-*/
-
-/*!
- \fn bool QTypeRevision::hasMinorVersion() const
-
- Returns true if the minor version is known, otherwise false.
-
- \sa minorVersion(), hasMajorVersion()
-*/
-
-/*!
- \fn quint8 QTypeRevision::minorVersion() const
-
- Returns the minor version encoded in the revision.
-
- \sa hasMinorVersion(), majorVersion()
-*/
-
-/*!
- \fn bool QTypeRevision::isValid() const
-
- Returns true if the major version or the minor version is known,
- otherwise false.
-
- \sa hasMajorVersion(), hasMinorVersion()
-*/
-
-/*!
- \fn template<typename Integer> Integer QTypeRevision::toEncodedVersion() const
-
- Transforms the revision into an integer value, encoding the minor
- version into the least significant byte, and the major version into
- the second least significant byte.
-
- \c Integer needs to be at least 16 bits wide, and must not have a sign bit
- in the least significant 16 bits.
-
- \sa fromEncodedVersion()
-*/
-
-#ifndef QT_NO_DATASTREAM
-/*!
- \fn QDataStream& operator<<(QDataStream &out, const QTypeRevision &revision)
- \relates QTypeRevision
- \since 6.0
-
- Writes the revision \a revision to stream \a out.
- */
-QDataStream &operator<<(QDataStream &out, const QTypeRevision &revision)
-{
- return out << revision.toEncodedVersion<quint16>();
-}
-
-/*!
- \fn QDataStream& operator>>(QDataStream &in, QTypeRevision &revision)
- \relates QTypeRevision
- \since 6.0
-
- Reads a revision from stream \a in and stores it in \a revision.
- */
-QDataStream &operator>>(QDataStream &in, QTypeRevision &revision)
-{
- quint16 value;
- in >> value;
- revision = QTypeRevision::fromEncodedVersion(value);
- return in;
-}
-#endif
-
-#ifndef QT_NO_DEBUG_STREAM
-QDebug operator<<(QDebug debug, const QTypeRevision &revision)
-{
- QDebugStateSaver saver(debug);
- if (revision.hasMajorVersion()) {
- if (revision.hasMinorVersion())
- debug.nospace() << revision.majorVersion() << '.' << revision.minorVersion();
- else
- debug.nospace().noquote() << revision.majorVersion() << ".x";
- } else {
- if (revision.hasMinorVersion())
- debug << revision.minorVersion();
- else
- debug.noquote() << "invalid";
- }
- return debug;
-}
-#endif
-
-/*!
- \fn size_t qHash(const QTypeRevision &key, size_t seed)
- \relates QHash
- \since 6.0
-
- Returns the hash value for the \a key, using \a seed to seed the
- calculation.
-*/
-size_t qHash(const QTypeRevision &key, size_t seed)
-{
- return qHash(key.toEncodedVersion<quint16>(), seed);
-}
-
QT_END_NAMESPACE
diff --git a/src/corelib/tools/qversionnumber.h b/src/corelib/tools/qversionnumber.h
index 65f0952cd9..95217a6eff 100644
--- a/src/corelib/tools/qversionnumber.h
+++ b/src/corelib/tools/qversionnumber.h
@@ -1,53 +1,21 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2016 Intel Corporation.
-** Copyright (C) 2014 Keith Gardner <kreios4004@gmail.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 The Qt Company Ltd.
+// Copyright (C) 2022 Intel Corporation.
+// Copyright (C) 2015 Keith Gardner <kreios4004@gmail.com>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QVERSIONNUMBER_H
#define QVERSIONNUMBER_H
+#include <QtCore/qcontainertools_impl.h>
#include <QtCore/qlist.h>
#include <QtCore/qmetatype.h>
#include <QtCore/qnamespace.h>
+#include <QtCore/qspan.h>
#include <QtCore/qstring.h>
#include <QtCore/qtypeinfo.h>
-#include <limits>
+#if !defined(QT_LEAN_HEADERS) || QT_LEAN_HEADERS < 2
+#include <QtCore/qtyperevision.h>
+#endif // lean headers level 2
QT_BEGIN_NAMESPACE
@@ -96,13 +64,15 @@ class QVersionNumber
if (dataFitsInline(seg.data(), seg.size()))
setInlineData(seg.data(), seg.size());
else
- pointer_segments = new QList<int>(seg);
+ setListData(seg);
}
+ Q_CORE_EXPORT void setListData(const QList<int> &seg);
+
SegmentStorage(const SegmentStorage &other)
{
if (other.isUsingPointer())
- pointer_segments = new QList<int>(*other.pointer_segments);
+ setListData(*other.pointer_segments);
else
dummy = other.dummy;
}
@@ -112,7 +82,7 @@ class QVersionNumber
if (isUsingPointer() && other.isUsingPointer()) {
*pointer_segments = *other.pointer_segments;
} else if (other.isUsingPointer()) {
- pointer_segments = new QList<int>(*other.pointer_segments);
+ setListData(*other.pointer_segments);
} else {
if (isUsingPointer())
delete pointer_segments;
@@ -131,45 +101,50 @@ class QVersionNumber
void swap(SegmentStorage &other) noexcept
{
- qSwap(dummy, other.dummy);
+ std::swap(dummy, other.dummy);
}
explicit SegmentStorage(QList<int> &&seg)
{
- if (dataFitsInline(seg.data(), seg.size()))
- setInlineData(seg.data(), seg.size());
+ if (dataFitsInline(std::as_const(seg).data(), seg.size()))
+ setInlineData(std::as_const(seg).data(), seg.size());
else
- pointer_segments = new QList<int>(std::move(seg));
+ setListData(std::move(seg));
}
- SegmentStorage(std::initializer_list<int> args)
+
+ Q_CORE_EXPORT void setListData(QList<int> &&seg);
+
+ explicit SegmentStorage(QSpan<const int> args)
+ : SegmentStorage(args.begin(), args.end()) {}
+
+ explicit SegmentStorage(const int *first, const int *last)
{
- if (dataFitsInline(std::data(args), int(args.size()))) {
- setInlineData(std::data(args), int(args.size()));
+ if (dataFitsInline(first, last - first)) {
+ setInlineData(first, last - first);
} else {
- pointer_segments = new QList<int>(args);
+ setListData(first, last);
}
}
+ Q_CORE_EXPORT void setListData(const int *first, const int *last);
+
~SegmentStorage() { if (isUsingPointer()) delete pointer_segments; }
bool isUsingPointer() const noexcept
{ return (inline_segments[InlineSegmentMarker] & 1) == 0; }
- int size() const noexcept
+ qsizetype size() const noexcept
{ return isUsingPointer() ? pointer_segments->size() : (inline_segments[InlineSegmentMarker] >> 1); }
- void setInlineSize(int len)
- { inline_segments[InlineSegmentMarker] = qint8(1 + 2 * len); }
-
- void resize(int len)
+ void setInlineSize(qsizetype len)
{
- if (isUsingPointer())
- pointer_segments->resize(len);
- else
- setInlineSize(len);
+ Q_ASSERT(len <= InlineSegmentCount);
+ inline_segments[InlineSegmentMarker] = qint8(1 + 2 * len);
}
- int at(int index) const
+ Q_CORE_EXPORT void resize(qsizetype len);
+
+ int at(qsizetype index) const
{
return isUsingPointer() ?
pointer_segments->at(index) :
@@ -187,28 +162,29 @@ class QVersionNumber
}
private:
- static bool dataFitsInline(const int *data, int len)
+ static bool dataFitsInline(const int *data, qsizetype len)
{
if (len > InlineSegmentCount)
return false;
- for (int i = 0; i < len; ++i)
+ for (qsizetype i = 0; i < len; ++i)
if (data[i] != qint8(data[i]))
return false;
return true;
}
- void setInlineData(const int *data, int len)
+ void setInlineData(const int *data, qsizetype len)
{
+ Q_ASSERT(len <= InlineSegmentCount);
dummy = 1 + len * 2;
#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN
- for (int i = 0; i < len; ++i)
+ for (qsizetype i = 0; i < len; ++i)
dummy |= quintptr(data[i] & 0xFF) << (8 * (i + 1));
#elif Q_BYTE_ORDER == Q_BIG_ENDIAN
- for (int i = 0; i < len; ++i)
+ for (qsizetype i = 0; i < len; ++i)
dummy |= quintptr(data[i] & 0xFF) << (8 * (sizeof(void *) - i - 1));
#else
// the code above is equivalent to:
setInlineSize(len);
- for (int i = 0; i < len; ++i)
+ for (qsizetype i = 0; i < len; ++i)
inline_segments[InlineSegmentStartIdx + i] = data[i] & 0xFF;
#endif
}
@@ -216,17 +192,84 @@ class QVersionNumber
Q_CORE_EXPORT void setVector(int len, int maj, int min, int mic);
} m_segments;
+ class It
+ {
+ const QVersionNumber *v;
+ qsizetype i;
+
+ friend class QVersionNumber;
+ explicit constexpr It(const QVersionNumber *vn, qsizetype idx) noexcept : v(vn), i(idx) {}
+
+ friend constexpr bool comparesEqual(const It &lhs, const It &rhs)
+ { Q_ASSERT(lhs.v == rhs.v); return lhs.i == rhs.i; }
+ friend constexpr Qt::strong_ordering compareThreeWay(const It &lhs, const It &rhs)
+ { Q_ASSERT(lhs.v == rhs.v); return Qt::compareThreeWay(lhs.i, rhs.i); }
+ Q_DECLARE_STRONGLY_ORDERED_LITERAL_TYPE(It)
+
+ public:
+ // Rule Of Zero applies
+ It() = default;
+
+ using iterator_category = std::random_access_iterator_tag;
+ using value_type = int;
+#ifdef QT_COMPILER_HAS_LWG3346
+ using element_type = const int;
+#endif
+ using difference_type = qptrdiff; // difference to container requirements
+ using size_type = qsizetype; // difference to container requirements
+ using reference = value_type; // difference to container requirements
+ using pointer = QtPrivate::ArrowProxy<reference>;
+
+ reference operator*() const { return v->segmentAt(i); }
+ pointer operator->() const { return {**this}; }
+
+ It &operator++() { ++i; return *this; }
+ It operator++(int) { auto copy = *this; ++*this; return copy; }
+
+ It &operator--() { --i; return *this; }
+ It operator--(int) { auto copy = *this; --*this; return copy; }
+
+ It &operator+=(difference_type n) { i += n; return *this; }
+ friend It operator+(It it, difference_type n) { it += n; return it; }
+ friend It operator+(difference_type n, It it) { return it + n; }
+
+ It &operator-=(difference_type n) { i -= n; return *this; }
+ friend It operator-(It it, difference_type n) { it -= n; return it; }
+
+ friend difference_type operator-(It lhs, It rhs)
+ { Q_ASSERT(lhs.v == rhs.v); return lhs.i - rhs.i; }
+
+ reference operator[](difference_type n) const { return *(*this + n); }
+ };
+
public:
+ using const_iterator = It;
+ using const_reverse_iterator = std::reverse_iterator<const_iterator>;
+
+ using value_type = It::value_type;
+ using difference_type = It::difference_type;
+ using size_type = It::size_type;
+ using reference = It::reference;
+ using const_reference = reference;
+ using pointer = It::pointer;
+ using const_pointer = pointer;
+
inline QVersionNumber() noexcept
: m_segments()
{}
+ Q_WEAK_OVERLOAD
inline explicit QVersionNumber(const QList<int> &seg) : m_segments(seg) { }
// compiler-generated copy/move ctor/assignment operators and the destructor are ok
+ Q_WEAK_OVERLOAD
explicit QVersionNumber(QList<int> &&seg) : m_segments(std::move(seg)) { }
inline QVersionNumber(std::initializer_list<int> args)
+ : m_segments(QSpan{args})
+ {}
+
+ explicit QVersionNumber(QSpan<const int> args)
: m_segments(args)
{}
@@ -258,24 +301,59 @@ public:
[[nodiscard]] Q_CORE_EXPORT QList<int> segments() const;
- [[nodiscard]] inline int segmentAt(int index) const noexcept
+ [[nodiscard]] inline int segmentAt(qsizetype index) const noexcept
{ return (m_segments.size() > index) ? m_segments.at(index) : 0; }
- [[nodiscard]] inline int segmentCount() const noexcept
+ [[nodiscard]] inline qsizetype segmentCount() const noexcept
{ return m_segments.size(); }
+ [[nodiscard]] const_iterator begin() const noexcept { return const_iterator{this, 0}; }
+ [[nodiscard]] const_iterator end() const noexcept { return begin() + segmentCount(); }
+ [[nodiscard]] const_iterator cbegin() const noexcept { return begin(); }
+ [[nodiscard]] const_iterator cend() const noexcept { return end(); }
+
+ [[nodiscard]] const_reverse_iterator rbegin() const noexcept { return const_reverse_iterator{end()}; }
+ [[nodiscard]] const_reverse_iterator rend() const noexcept { return const_reverse_iterator{begin()}; }
+ [[nodiscard]] const_reverse_iterator crbegin() const noexcept { return rbegin(); }
+ [[nodiscard]] const_reverse_iterator crend() const noexcept { return rend(); }
+
+ [[nodiscard]] const_iterator constBegin() const noexcept { return begin(); }
+ [[nodiscard]] const_iterator constEnd() const noexcept { return end(); }
+
[[nodiscard]] Q_CORE_EXPORT bool isPrefixOf(const QVersionNumber &other) const noexcept;
[[nodiscard]] Q_CORE_EXPORT static int compare(const QVersionNumber &v1, const QVersionNumber &v2) noexcept;
- [[nodiscard]] Q_CORE_EXPORT static Q_DECL_PURE_FUNCTION QVersionNumber commonPrefix(const QVersionNumber &v1, const QVersionNumber &v2);
+ [[nodiscard]] Q_CORE_EXPORT static QVersionNumber commonPrefix(const QVersionNumber &v1, const QVersionNumber &v2);
[[nodiscard]] Q_CORE_EXPORT QString toString() const;
-#if QT_STRINGVIEW_LEVEL < 2
- [[nodiscard]] Q_CORE_EXPORT static Q_DECL_PURE_FUNCTION QVersionNumber fromString(const QString &string, int *suffixIndex = nullptr);
+ [[nodiscard]] Q_CORE_EXPORT static QVersionNumber fromString(QAnyStringView string, qsizetype *suffixIndex = nullptr);
+
+#if QT_DEPRECATED_SINCE(6, 4) && QT_POINTER_SIZE != 4
+ Q_WEAK_OVERLOAD
+ QT_DEPRECATED_VERSION_X_6_4("Use the 'qsizetype *suffixIndex' overload.")
+ [[nodiscard]] static QVersionNumber fromString(QAnyStringView string, int *suffixIndex)
+ {
+ QT_WARNING_PUSH
+ // fromString() writes to *n unconditionally, but GCC can't know that
+ QT_WARNING_DISABLE_GCC("-Wmaybe-uninitialized")
+ qsizetype n;
+ auto r = fromString(string, &n);
+ if (suffixIndex) {
+ Q_ASSERT(int(n) == n);
+ *suffixIndex = int(n);
+ }
+ return r;
+ QT_WARNING_POP
+ }
+#endif
+
+
+#if QT_CORE_REMOVED_SINCE(6, 4)
+ [[nodiscard]] Q_CORE_EXPORT static QVersionNumber fromString(const QString &string, int *suffixIndex);
+ [[nodiscard]] Q_CORE_EXPORT static QVersionNumber fromString(QLatin1StringView string, int *suffixIndex);
+ [[nodiscard]] Q_CORE_EXPORT static QVersionNumber fromString(QStringView string, int *suffixIndex);
#endif
- [[nodiscard]] Q_CORE_EXPORT static Q_DECL_PURE_FUNCTION QVersionNumber fromString(QLatin1String string, int *suffixIndex = nullptr);
- [[nodiscard]] Q_CORE_EXPORT static Q_DECL_PURE_FUNCTION QVersionNumber fromString(QStringView string, int *suffixIndex = nullptr);
[[nodiscard]] friend bool operator> (const QVersionNumber &lhs, const QVersionNumber &rhs) noexcept
{ return compare(lhs, rhs) > 0; }
@@ -295,7 +373,6 @@ public:
[[nodiscard]] friend bool operator!=(const QVersionNumber &lhs, const QVersionNumber &rhs) noexcept
{ return compare(lhs, rhs) != 0; }
-
private:
#ifndef QT_NO_DATASTREAM
friend Q_CORE_EXPORT QDataStream& operator>>(QDataStream &in, QVersionNumber &version);
@@ -309,160 +386,8 @@ Q_DECLARE_TYPEINFO(QVersionNumber, Q_RELOCATABLE_TYPE);
Q_CORE_EXPORT QDebug operator<<(QDebug, const QVersionNumber &version);
#endif
-class QTypeRevision;
-Q_CORE_EXPORT size_t qHash(const QTypeRevision &key, size_t seed = 0);
-
-#ifndef QT_NO_DATASTREAM
-Q_CORE_EXPORT QDataStream& operator<<(QDataStream &out, const QTypeRevision &revision);
-Q_CORE_EXPORT QDataStream& operator>>(QDataStream &in, QTypeRevision &revision);
-#endif
-
-class QTypeRevision
-{
-public:
- template<typename Integer>
- using if_valid_segment_type = typename std::enable_if<
- std::is_integral<Integer>::value, bool>::type;
-
- template<typename Integer>
- using if_valid_value_type = typename std::enable_if<
- std::is_integral<Integer>::value
- && (sizeof(Integer) > sizeof(quint16)
- || (sizeof(Integer) == sizeof(quint16)
- && !std::is_signed<Integer>::value)), bool>::type;
-
- template<typename Integer, if_valid_segment_type<Integer> = true>
- static constexpr bool isValidSegment(Integer segment)
- {
- // using extra parentheses around max to avoid expanding it if it is a macro
- return segment >= Integer(0)
- && ((std::numeric_limits<Integer>::max)() < Integer(SegmentUnknown)
- || segment < Integer(SegmentUnknown));
- }
-
- template<typename Major, typename Minor,
- if_valid_segment_type<Major> = true,
- if_valid_segment_type<Minor> = true>
- static constexpr QTypeRevision fromVersion(Major majorVersion, Minor minorVersion)
- {
- return Q_ASSERT(isValidSegment(majorVersion)),
- Q_ASSERT(isValidSegment(minorVersion)),
- QTypeRevision(quint8(majorVersion), quint8(minorVersion));
- }
-
- template<typename Major, if_valid_segment_type<Major> = true>
- static constexpr QTypeRevision fromMajorVersion(Major majorVersion)
- {
- return Q_ASSERT(isValidSegment(majorVersion)),
- QTypeRevision(quint8(majorVersion), SegmentUnknown);
- }
-
- template<typename Minor, if_valid_segment_type<Minor> = true>
- static constexpr QTypeRevision fromMinorVersion(Minor minorVersion)
- {
- return Q_ASSERT(isValidSegment(minorVersion)),
- QTypeRevision(SegmentUnknown, quint8(minorVersion));
- }
-
- template<typename Integer, if_valid_value_type<Integer> = true>
- static constexpr QTypeRevision fromEncodedVersion(Integer value)
- {
- return Q_ASSERT((value & ~Integer(0xffff)) == Integer(0)),
- QTypeRevision((value & Integer(0xff00)) >> 8, value & Integer(0xff));
- }
-
- static constexpr QTypeRevision zero() { return QTypeRevision(0, 0); }
-
- constexpr QTypeRevision() = default;
-
- constexpr bool hasMajorVersion() const { return m_majorVersion != SegmentUnknown; }
- constexpr quint8 majorVersion() const { return m_majorVersion; }
-
- constexpr bool hasMinorVersion() const { return m_minorVersion != SegmentUnknown; }
- constexpr quint8 minorVersion() const { return m_minorVersion; }
-
- constexpr bool isValid() const { return hasMajorVersion() || hasMinorVersion(); }
-
- template<typename Integer, if_valid_value_type<Integer> = true>
- constexpr Integer toEncodedVersion() const
- {
- return Integer(m_majorVersion << 8) | Integer(m_minorVersion);
- }
-
- [[nodiscard]] friend constexpr bool operator==(QTypeRevision lhs, QTypeRevision rhs)
- {
- return lhs.toEncodedVersion<quint16>() == rhs.toEncodedVersion<quint16>();
- }
-
- [[nodiscard]] friend constexpr bool operator!=(QTypeRevision lhs, QTypeRevision rhs)
- {
- return lhs.toEncodedVersion<quint16>() != rhs.toEncodedVersion<quint16>();
- }
-
- [[nodiscard]] friend constexpr bool operator<(QTypeRevision lhs, QTypeRevision rhs)
- {
- return (!lhs.hasMajorVersion() && rhs.hasMajorVersion())
- // non-0 major > unspecified major > major 0
- ? rhs.majorVersion() != 0
- : ((lhs.hasMajorVersion() && !rhs.hasMajorVersion())
- // major 0 < unspecified major < non-0 major
- ? lhs.majorVersion() == 0
- : (lhs.majorVersion() != rhs.majorVersion()
- // both majors specified and non-0
- ? lhs.majorVersion() < rhs.majorVersion()
- : ((!lhs.hasMinorVersion() && rhs.hasMinorVersion())
- // non-0 minor > unspecified minor > minor 0
- ? rhs.minorVersion() != 0
- : ((lhs.hasMinorVersion() && !rhs.hasMinorVersion())
- // minor 0 < unspecified minor < non-0 minor
- ? lhs.minorVersion() == 0
- // both minors specified and non-0
- : lhs.minorVersion() < rhs.minorVersion()))));
- }
-
- [[nodiscard]] friend constexpr bool operator>(QTypeRevision lhs, QTypeRevision rhs)
- {
- return lhs != rhs && !(lhs < rhs);
- }
-
- [[nodiscard]] friend constexpr bool operator<=(QTypeRevision lhs, QTypeRevision rhs)
- {
- return lhs == rhs || lhs < rhs;
- }
-
- [[nodiscard]] friend constexpr bool operator>=(QTypeRevision lhs, QTypeRevision rhs)
- {
- return lhs == rhs || !(lhs < rhs);
- }
-
-private:
- enum { SegmentUnknown = 0xff };
-
-#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN
- constexpr QTypeRevision(quint8 major, quint8 minor)
- : m_minorVersion(minor), m_majorVersion(major) {}
-
- quint8 m_minorVersion = SegmentUnknown;
- quint8 m_majorVersion = SegmentUnknown;
-#else
- constexpr QTypeRevision(quint8 major, quint8 minor)
- : m_majorVersion(major), m_minorVersion(minor) {}
-
- quint8 m_majorVersion = SegmentUnknown;
- quint8 m_minorVersion = SegmentUnknown;
-#endif
-};
-
-static_assert(sizeof(QTypeRevision) == 2);
-Q_DECLARE_TYPEINFO(QTypeRevision, Q_RELOCATABLE_TYPE);
-
-#ifndef QT_NO_DEBUG_STREAM
-Q_CORE_EXPORT QDebug operator<<(QDebug, const QTypeRevision &revision);
-#endif
-
QT_END_NAMESPACE
-Q_DECLARE_METATYPE(QVersionNumber)
-Q_DECLARE_METATYPE(QTypeRevision)
+QT_DECL_METATYPE_EXTERN(QVersionNumber, Q_CORE_EXPORT)
#endif // QVERSIONNUMBER_H
diff --git a/src/corelib/tracing/qctf.cpp b/src/corelib/tracing/qctf.cpp
new file mode 100644
index 0000000000..ff81d0a678
--- /dev/null
+++ b/src/corelib/tracing/qctf.cpp
@@ -0,0 +1,144 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#define BUILD_LIBRARY
+
+#include <qthread.h>
+#include <qpluginloader.h>
+#include <qfileinfo.h>
+#include <qdir.h>
+#include <qjsonarray.h>
+
+#include "qctf_p.h"
+
+QT_BEGIN_NAMESPACE
+
+static bool s_initialized = false;
+static bool s_triedLoading = false;
+static bool s_prevent_recursion = false;
+static bool s_shutdown = false;
+static QCtfLib* s_plugin = nullptr;
+
+#if QT_CONFIG(library) && defined(QT_SHARED)
+
+#if defined(Q_OS_ANDROID)
+static QString findPlugin(const QString &plugin)
+{
+ QString pluginPath = QString::fromUtf8(qgetenv("QT_PLUGIN_PATH"));
+ QDir dir(pluginPath);
+ const QStringList files = dir.entryList(QDir::Files);
+ for (const QString &file : files) {
+ if (file.contains(plugin))
+ return QFileInfo(pluginPath + QLatin1Char('/') + file).absoluteFilePath();
+ }
+ return {};
+}
+#endif
+
+static bool loadPlugin(bool &retry)
+{
+ retry = false;
+#ifdef Q_OS_WIN
+#ifdef QT_DEBUG
+ QPluginLoader loader(QStringLiteral("tracing/QCtfTracePlugind.dll"));
+#else
+ QPluginLoader loader(QStringLiteral("tracing/QCtfTracePlugin.dll"));
+#endif
+#elif defined(Q_OS_ANDROID)
+
+ QString plugin = findPlugin(QStringLiteral("QCtfTracePlugin"));
+ if (plugin.isEmpty()) {
+ retry = true;
+ return false;
+ }
+ QPluginLoader loader(plugin);
+#else
+ QPluginLoader loader(QStringLiteral("tracing/libQCtfTracePlugin.so"));
+#endif
+
+ if (!loader.isLoaded()) {
+ if (!loader.load())
+ return false;
+ }
+ s_plugin = qobject_cast<QCtfLib *>(loader.instance());
+ if (!s_plugin)
+ return false;
+ s_plugin->shutdown(&s_shutdown);
+ return true;
+}
+
+#else
+
+#define QCtfPluginIID QStringLiteral("org.qt-project.Qt.QCtfLib")
+
+static bool loadPlugin(bool &retry)
+{
+ retry = false;
+ const auto &plugins = QPluginLoader::staticPlugins();
+ for (const auto &plugin : plugins) {
+ const auto json = plugin.metaData();
+ const auto IID = json[QStringLiteral("IID")];
+ if (IID.toString() == QCtfPluginIID) {
+ s_plugin = qobject_cast<QCtfLib *>(plugin.instance());
+ if (!s_plugin)
+ return false;
+ s_plugin->shutdown(&s_shutdown);
+ return true;
+ }
+ }
+ return false;
+}
+
+#endif
+
+static bool initialize()
+{
+ if (s_shutdown || s_prevent_recursion)
+ return false;
+ if (s_initialized || s_triedLoading)
+ return s_initialized;
+ s_prevent_recursion = true;
+ bool retry = false;
+ if (!loadPlugin(retry)) {
+ if (!retry) {
+ s_triedLoading = true;
+ s_initialized = false;
+ }
+ } else {
+ bool enabled = s_plugin->sessionEnabled();
+ if (!enabled) {
+ s_triedLoading = true;
+ s_initialized = false;
+ } else {
+ s_initialized = true;
+ }
+ }
+ s_prevent_recursion = false;
+ return s_initialized;
+}
+
+bool _tracepoint_enabled(const QCtfTracePointEvent &point)
+{
+ if (!initialize())
+ return false;
+ return s_plugin ? s_plugin->tracepointEnabled(point) : false;
+}
+
+void _do_tracepoint(const QCtfTracePointEvent &point, const QByteArray &arr)
+{
+ if (!initialize())
+ return;
+ if (s_plugin)
+ s_plugin->doTracepoint(point, arr);
+}
+
+QCtfTracePointPrivate *_initialize_tracepoint(const QCtfTracePointEvent &point)
+{
+ if (!initialize())
+ return nullptr;
+ return s_plugin ? s_plugin->initializeTracepoint(point) : nullptr;
+}
+
+QT_END_NAMESPACE
+
+#include "moc_qctf_p.cpp"
diff --git a/src/corelib/tracing/qctf_p.h b/src/corelib/tracing/qctf_p.h
new file mode 100644
index 0000000000..70d00d018c
--- /dev/null
+++ b/src/corelib/tracing/qctf_p.h
@@ -0,0 +1,238 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef Q_CTF_H
+#define Q_CTF_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+//
+
+#include <qtcoreexports.h>
+#include <qobject.h>
+
+QT_BEGIN_NAMESPACE
+
+struct QCtfTraceMetadata;
+struct Q_CORE_EXPORT QCtfTracePointProvider
+{
+ const QString provider;
+ QCtfTraceMetadata *metadata;
+ QCtfTracePointProvider(const QString &provider)
+ : provider(provider), metadata(nullptr)
+ {
+
+ }
+};
+
+struct Q_CORE_EXPORT QCtfTraceMetadata
+{
+ const QString name;
+ const QString metadata;
+ QCtfTraceMetadata(QCtfTracePointProvider &provider, const QString &name, const QString &metadata)
+ : name(name), metadata(metadata)
+ {
+ next = provider.metadata;
+ provider.metadata = this;
+ }
+ QCtfTraceMetadata *next = nullptr;
+};
+
+struct QCtfTracePointPrivate;
+struct Q_CORE_EXPORT QCtfTracePointEvent
+{
+ const QCtfTracePointProvider &provider;
+ const QString eventName;
+ const QString metadata;
+ const int size;
+ const bool variableSize;
+
+ QCtfTracePointEvent(const QCtfTracePointProvider &provider, const QString &name, const QString &metadata, int size, bool variableSize)
+ : provider(provider), eventName(name), metadata(metadata), size(size), variableSize(variableSize)
+ {
+ }
+ QCtfTracePointPrivate *d = nullptr;
+};
+
+
+
+Q_CORE_EXPORT bool _tracepoint_enabled(const QCtfTracePointEvent &point);
+Q_CORE_EXPORT void _do_tracepoint(const QCtfTracePointEvent &point, const QByteArray &arr);
+Q_CORE_EXPORT QCtfTracePointPrivate *_initialize_tracepoint(const QCtfTracePointEvent &point);
+
+#ifndef BUILD_LIBRARY
+#include <QtCore/qbytearray.h>
+#include <QtCore/qstring.h>
+#include <QtCore/qurl.h>
+namespace trace {
+inline void toByteArray(QByteArray &)
+{
+}
+
+inline void toByteArray(QByteArray &arr, const QString &value)
+{
+ arr.append(value.toUtf8());
+ arr.append((char)0);
+}
+
+inline void toByteArray(QByteArray &arr, const QUrl &value)
+{
+ arr.append(value.toString().toUtf8());
+ arr.append((char)0);
+}
+
+inline void toByteArray(QByteArray &arr, const QByteArray &data)
+{
+ arr.append(data);
+}
+
+template <typename T>
+inline void toByteArray(QByteArray &arr, T value)
+{
+ arr.append((char *)&value, sizeof(value));
+}
+
+template <typename T, typename... Ts>
+inline void toByteArray(QByteArray &arr, T value, Ts... args)
+{
+ toByteArray(arr, value);
+ toByteArray(arr, args...);
+}
+
+inline QByteArray toByteArray()
+{
+ return {};
+}
+
+template <typename... Ts>
+inline QByteArray toByteArray(Ts... args)
+{
+ QByteArray data;
+ toByteArray(data, args...);
+ return data;
+}
+
+template <typename T>
+inline QByteArray toByteArrayFromArray(const T *values, int arraySize)
+{
+ QByteArray data;
+ data.append((char *)values, arraySize * sizeof(T));
+ return data;
+}
+
+template <typename IntegerType, typename T>
+inline QByteArray toByteArrayFromEnum(T value)
+{
+ IntegerType e = static_cast<IntegerType>(value);
+ QByteArray data;
+ data.append((char *)&e, sizeof(e));
+ return data;
+}
+
+inline QByteArray toByteArrayFromCString(const char *str)
+{
+ QByteArray data;
+ if (str && *str != 0)
+ data.append(str);
+ data.append((char)0);
+ return data;
+}
+
+static inline void appendFlags(QByteArray &data, quint8 &count, quint32 value)
+{
+ count = 0;
+ quint8 d = 1;
+ while (value) {
+ if (value&1) {
+ data.append(d);
+ count++;
+ }
+ d++;
+ value >>= 1;
+ }
+}
+
+template <typename T>
+inline QByteArray toByteArrayFromFlags(QFlags<T> value)
+{
+ quint32 intValue = static_cast<quint32>(value.toInt());
+ quint8 count;
+ QByteArray data;
+ data.append((char)0);
+ if (intValue == 0) {
+ data.append((char)0);
+ data.data()[0] = 1;
+ } else {
+ appendFlags(data, count, intValue);
+ data.data()[0] = count;
+ }
+ return data;
+}
+
+} // trace
+
+#define _DEFINE_EVENT(provider, event, metadata, size, varSize) \
+ static QCtfTracePointEvent _ctf_ ## event = QCtfTracePointEvent(_ctf_provider_ ## provider, QStringLiteral(QT_STRINGIFY(event)), metadata, size, varSize);
+#define _DEFINE_METADATA(provider, name, metadata) \
+ static QCtfTraceMetadata _ctf_metadata_ ## name = QCtfTraceMetadata(_ctf_provider_ ## provider, QStringLiteral(QT_STRINGIFY(name)), metadata);
+#define _DEFINE_TRACEPOINT_PROVIDER(provider) \
+ static QCtfTracePointProvider _ctf_provider_ ## provider = QCtfTracePointProvider(QStringLiteral(QT_STRINGIFY(provider)));
+
+#define TRACEPOINT_EVENT(provider, event, metadata, size, varSize) \
+ _DEFINE_EVENT(provider, event, metadata, size, varSize)
+
+#define TRACEPOINT_PROVIDER(provider) \
+ _DEFINE_TRACEPOINT_PROVIDER(provider)
+
+#define TRACEPOINT_METADATA(provider, name, metadata) \
+ _DEFINE_METADATA(provider, name, metadata)
+
+#define tracepoint_enabled(provider, event) \
+ _tracepoint_enabled(_ctf_ ## event)
+
+#define do_tracepoint(provider, event, ...) \
+{ \
+ auto &tp = _ctf_ ## event; \
+ if (!tp.d) \
+ tp.d = _initialize_tracepoint(tp); \
+ if (tp.d) { \
+ QByteArray data(tp.size, 0); \
+ if (!tp.metadata.isEmpty()) \
+ data = trace::toByteArray(__VA_ARGS__); \
+ _do_tracepoint(tp, data); \
+ } \
+}
+
+#define tracepoint(provider, name, ...) \
+ do { \
+ if (tracepoint_enabled(provider, name)) \
+ do_tracepoint(provider, name, __VA_ARGS__); \
+ } while (0)
+
+#endif
+
+class Q_CORE_EXPORT QCtfLib : public QObject
+{
+ Q_OBJECT
+ Q_DISABLE_COPY(QCtfLib)
+public:
+ explicit QCtfLib(QObject *parent = nullptr) : QObject(parent) {}
+ virtual ~QCtfLib() = default;
+ virtual bool tracepointEnabled(const QCtfTracePointEvent &point) = 0;
+ virtual void doTracepoint(const QCtfTracePointEvent &point, const QByteArray &arr) = 0;
+ virtual bool sessionEnabled() = 0;
+ virtual QCtfTracePointPrivate *initializeTracepoint(const QCtfTracePointEvent &point) = 0;
+ virtual void shutdown(bool *shutdown) = 0;
+};
+
+QT_END_NAMESPACE
+
+#endif